From a6163888f3c56123b1db313743c6147ba498732c Mon Sep 17 00:00:00 2001 From: Yuval Adam Date: Fri, 8 Aug 2014 14:42:07 +0300 Subject: Add third_party libs --- .../Demo/CORTEX_LM3S102_GCC/Demo1/FreeRTOSConfig.h | 111 + .../FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo1/main.c | 634 + .../Demo/CORTEX_LM3S102_GCC/Demo1/readme.txt | 3 + .../Demo/CORTEX_LM3S102_GCC/Demo2/FreeRTOSConfig.h | 111 + .../FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo2/main.c | 633 + .../Demo/CORTEX_LM3S102_GCC/Demo2/readme.txt | 3 + .../Demo/CORTEX_LM3S102_GCC/FreeRTOSConfig.h | 115 + .../FreeRTOS/Demo/CORTEX_LM3S102_GCC/Makefile | 86 + .../Demo/CORTEX_LM3S102_GCC/ParTest/ParTest.c | 145 + .../Demo/CORTEX_LM3S102_GCC/hw_include/DriverLib.h | 18 + .../Demo/CORTEX_LM3S102_GCC/hw_include/debug.h | 56 + .../Demo/CORTEX_LM3S102_GCC/hw_include/gpio.h | 135 + .../Demo/CORTEX_LM3S102_GCC/hw_include/hw_ints.h | 82 + .../Demo/CORTEX_LM3S102_GCC/hw_include/hw_memmap.h | 57 + .../Demo/CORTEX_LM3S102_GCC/hw_include/hw_nvic.h | 830 + .../Demo/CORTEX_LM3S102_GCC/hw_include/hw_ssi.h | 113 + .../Demo/CORTEX_LM3S102_GCC/hw_include/hw_sysctl.h | 325 + .../Demo/CORTEX_LM3S102_GCC/hw_include/hw_types.h | 63 + .../Demo/CORTEX_LM3S102_GCC/hw_include/hw_uart.h | 234 + .../Demo/CORTEX_LM3S102_GCC/hw_include/interrupt.h | 57 + .../Demo/CORTEX_LM3S102_GCC/hw_include/pdc.c | 132 + .../Demo/CORTEX_LM3S102_GCC/hw_include/pdc.h | 124 + .../Demo/CORTEX_LM3S102_GCC/hw_include/ssi.h | 88 + .../Demo/CORTEX_LM3S102_GCC/hw_include/sysctl.h | 221 + .../Demo/CORTEX_LM3S102_GCC/hw_include/uart.h | 102 + .../Demo/CORTEX_LM3S102_GCC/init/startup.c | 175 + .../FreeRTOS/Demo/CORTEX_LM3S102_GCC/main.c | 634 + .../FreeRTOS/Demo/CORTEX_LM3S102_GCC/makedefs | 193 + .../FreeRTOS/Demo/CORTEX_LM3S102_GCC/standalone.ld | 58 + .../CORTEX_LM3S102_KEIL/Demo1/FreeRTOSConfig.h | 112 + .../FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/main.c | 630 + .../Demo/CORTEX_LM3S102_KEIL/Demo1/readme.txt | 3 + .../CORTEX_LM3S102_KEIL/Demo2/FreeRTOSConfig.h | 112 + .../FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/main.c | 638 + .../Demo/CORTEX_LM3S102_KEIL/Demo2/readme.txt | 3 + .../FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Opt | 51 + .../FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Uv2 | 112 + .../Demo/CORTEX_LM3S102_KEIL/FreeRTOSConfig.h | 113 + .../Demo/CORTEX_LM3S102_KEIL/ParTest/ParTest.c | 146 + .../Demo/CORTEX_LM3S102_KEIL/include/pdc.c | 118 + .../Demo/CORTEX_LM3S102_KEIL/include/pdc.h | 122 + .../Demo/CORTEX_LM3S102_KEIL/init/Startup.s | 164 + .../FreeRTOS/Demo/CORTEX_LM3S102_KEIL/main.c | 630 + .../CORTEX_LM3S102_Rowley/Demo1/FreeRTOSConfig.h | 115 + .../Demo/CORTEX_LM3S102_Rowley/Demo1/ParTest.c | 145 + .../Demo/CORTEX_LM3S102_Rowley/Demo1/main.c | 647 + .../Demo/CORTEX_LM3S102_Rowley/Demo1/vectors.s | 120 + .../CORTEX_LM3S102_Rowley/Demo2/FreeRTOSConfig.h | 115 + .../Demo/CORTEX_LM3S102_Rowley/Demo2/ParTest.c | 145 + .../Demo/CORTEX_LM3S102_Rowley/Demo2/main.c | 655 + .../Demo/CORTEX_LM3S102_Rowley/Demo2/vectors.s | 120 + .../CORTEX_LM3S102_Rowley/Demo3/FreeRTOSConfig.h | 115 + .../Demo/CORTEX_LM3S102_Rowley/Demo3/ParTest.c | 145 + .../Demo/CORTEX_LM3S102_Rowley/Demo3/main.c | 323 + .../Demo/CORTEX_LM3S102_Rowley/Demo3/vectors.s | 121 + .../Demo/CORTEX_LM3S102_Rowley/RTOSDemo.hzp | 110 + .../Demo/CORTEX_LM3S102_Rowley/RTOSDemo.hzs | 105 + .../CORTEX_LM3S102_Rowley/hw_include/DriverLib.h | 20 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/EULA.txt | 126 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/comp.h | 112 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/cpu.h | 40 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/debug.h | 56 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/flash.h | 75 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/gpio.h | 135 + .../CORTEX_LM3S102_Rowley/hw_include/hw_comp.h | 113 + .../CORTEX_LM3S102_Rowley/hw_include/hw_flash.h | 141 + .../CORTEX_LM3S102_Rowley/hw_include/hw_gpio.h | 95 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/hw_i2c.h | 157 + .../CORTEX_LM3S102_Rowley/hw_include/hw_ints.h | 82 + .../CORTEX_LM3S102_Rowley/hw_include/hw_memmap.h | 57 + .../CORTEX_LM3S102_Rowley/hw_include/hw_nvic.h | 830 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/hw_ssi.h | 113 + .../CORTEX_LM3S102_Rowley/hw_include/hw_sysctl.h | 325 + .../CORTEX_LM3S102_Rowley/hw_include/hw_timer.h | 233 + .../CORTEX_LM3S102_Rowley/hw_include/hw_types.h | 63 + .../CORTEX_LM3S102_Rowley/hw_include/hw_uart.h | 234 + .../CORTEX_LM3S102_Rowley/hw_include/hw_watchdog.h | 99 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/i2c.h | 137 + .../CORTEX_LM3S102_Rowley/hw_include/interrupt.h | 57 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/pdc.c | 132 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/pdc.h | 124 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/ssi.h | 88 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/sysctl.h | 221 + .../CORTEX_LM3S102_Rowley/hw_include/systick.h | 53 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/timer.h | 137 + .../Demo/CORTEX_LM3S102_Rowley/hw_include/uart.h | 102 + .../CORTEX_LM3S102_Rowley/hw_include/watchdog.h | 63 + .../Demo/CORTEX_LM3S316_IAR/FreeRTOSConfig.h | 115 + .../FreeRTOS/Demo/CORTEX_LM3S316_IAR/LM3S316.icf | 58 + .../Demo/CORTEX_LM3S316_IAR/ParTest/ParTest.c | 145 + .../FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.ewd | 879 + .../FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.ewp | 961 + .../FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.eww | 10 + .../FreeRTOS/Demo/CORTEX_LM3S316_IAR/commstest.c | 325 + .../FreeRTOS/Demo/CORTEX_LM3S316_IAR/commstest.h | 87 + .../Demo/CORTEX_LM3S316_IAR/hw_include/DriverLib.h | 22 + .../Demo/CORTEX_LM3S316_IAR/hw_include/EULA.txt | 126 + .../Demo/CORTEX_LM3S316_IAR/hw_include/adc.h | 120 + .../Demo/CORTEX_LM3S316_IAR/hw_include/asmdefs.h | 130 + .../Demo/CORTEX_LM3S316_IAR/hw_include/comp.h | 120 + .../Demo/CORTEX_LM3S316_IAR/hw_include/cpu.h | 40 + .../Demo/CORTEX_LM3S316_IAR/hw_include/cspy.c | 119 + .../Demo/CORTEX_LM3S316_IAR/hw_include/debug.h | 56 + .../Demo/CORTEX_LM3S316_IAR/hw_include/diag.h | 67 + .../CORTEX_LM3S316_IAR/hw_include/driverlib.r79 | Bin 0 -> 127268 bytes .../Demo/CORTEX_LM3S316_IAR/hw_include/flash.h | 75 + .../Demo/CORTEX_LM3S316_IAR/hw_include/gpio.h | 136 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_adc.h | 329 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_comp.h | 118 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_flash.h | 139 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_gpio.h | 103 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_i2c.h | 189 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_ints.h | 96 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_memmap.h | 63 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_nvic.h | 830 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_pwm.h | 260 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_ssi.h | 120 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_sysctl.h | 380 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_timer.h | 235 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_types.h | 67 + .../Demo/CORTEX_LM3S316_IAR/hw_include/hw_uart.h | 239 + .../CORTEX_LM3S316_IAR/hw_include/hw_watchdog.h | 116 + .../Demo/CORTEX_LM3S316_IAR/hw_include/i2c.h | 137 + .../Demo/CORTEX_LM3S316_IAR/hw_include/interrupt.h | 57 + .../Demo/CORTEX_LM3S316_IAR/hw_include/pdc.c | 724 + .../Demo/CORTEX_LM3S316_IAR/hw_include/pdc.h | 124 + .../Demo/CORTEX_LM3S316_IAR/hw_include/pwm.h | 161 + .../Demo/CORTEX_LM3S316_IAR/hw_include/ssi.h | 92 + .../Demo/CORTEX_LM3S316_IAR/hw_include/startup.c | 195 + .../Demo/CORTEX_LM3S316_IAR/hw_include/sysctl.h | 266 + .../Demo/CORTEX_LM3S316_IAR/hw_include/systick.h | 55 + .../Demo/CORTEX_LM3S316_IAR/hw_include/timer.h | 137 + .../Demo/CORTEX_LM3S316_IAR/hw_include/uart.h | 104 + .../Demo/CORTEX_LM3S316_IAR/hw_include/watchdog.h | 63 + .../FreeRTOS/Demo/CORTEX_LM3S316_IAR/main.c | 477 + .../Demo/CORTEX_LM3S316_IAR/registertest.s | 60 + .../CORTEX_LM3S316_IAR/settings/RTOSDemo.dbgdt | 65 + .../Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.dni | 48 + .../Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.wsdt | 58 + .../CORTEX_LM3S316_IAR/settings/driverlib.wsdt | 51 + .../Demo/CORTEX_LM3S811_GCC/FreeRTOSConfig.h | 115 + .../FreeRTOS/Demo/CORTEX_LM3S811_GCC/Makefile | 85 + .../Demo/CORTEX_LM3S811_GCC/hw_include/DriverLib.h | 39 + .../Demo/CORTEX_LM3S811_GCC/hw_include/EULA.txt | 126 + .../Demo/CORTEX_LM3S811_GCC/hw_include/adc.c | 946 + .../Demo/CORTEX_LM3S811_GCC/hw_include/adc.h | 126 + .../Demo/CORTEX_LM3S811_GCC/hw_include/comp.c | 448 + .../Demo/CORTEX_LM3S811_GCC/hw_include/comp.h | 120 + .../Demo/CORTEX_LM3S811_GCC/hw_include/cpu.h | 40 + .../Demo/CORTEX_LM3S811_GCC/hw_include/debug.h | 56 + .../CORTEX_LM3S811_GCC/hw_include/driverlib.r79 | Bin 0 -> 135874 bytes .../Demo/CORTEX_LM3S811_GCC/hw_include/flash.c | 668 + .../Demo/CORTEX_LM3S811_GCC/hw_include/flash.h | 75 + .../Demo/CORTEX_LM3S811_GCC/hw_include/gpio.c | 1103 + .../Demo/CORTEX_LM3S811_GCC/hw_include/gpio.h | 137 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_adc.h | 343 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_comp.h | 118 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_flash.h | 139 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_gpio.h | 103 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_i2c.h | 197 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_ints.h | 97 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_memmap.h | 64 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_nvic.h | 830 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_pwm.h | 260 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_qei.h | 176 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_ssi.h | 120 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_sysctl.h | 409 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_timer.h | 235 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_types.h | 67 + .../Demo/CORTEX_LM3S811_GCC/hw_include/hw_uart.h | 239 + .../CORTEX_LM3S811_GCC/hw_include/hw_watchdog.h | 116 + .../Demo/CORTEX_LM3S811_GCC/hw_include/i2c.c | 972 + .../Demo/CORTEX_LM3S811_GCC/hw_include/i2c.h | 137 + .../Demo/CORTEX_LM3S811_GCC/hw_include/interrupt.c | 552 + .../Demo/CORTEX_LM3S811_GCC/hw_include/interrupt.h | 57 + .../CORTEX_LM3S811_GCC/hw_include/osram96x16.c | 975 + .../CORTEX_LM3S811_GCC/hw_include/osram96x16.h | 47 + .../Demo/CORTEX_LM3S811_GCC/hw_include/pwm.c | 1291 + .../Demo/CORTEX_LM3S811_GCC/hw_include/pwm.h | 161 + .../Demo/CORTEX_LM3S811_GCC/hw_include/qei.c | 630 + .../Demo/CORTEX_LM3S811_GCC/hw_include/qei.h | 104 + .../Demo/CORTEX_LM3S811_GCC/hw_include/ssi.c | 609 + .../Demo/CORTEX_LM3S811_GCC/hw_include/ssi.h | 89 + .../Demo/CORTEX_LM3S811_GCC/hw_include/sysctl.c | 1889 + .../Demo/CORTEX_LM3S811_GCC/hw_include/sysctl.h | 285 + .../Demo/CORTEX_LM3S811_GCC/hw_include/systick.c | 262 + .../Demo/CORTEX_LM3S811_GCC/hw_include/systick.h | 55 + .../Demo/CORTEX_LM3S811_GCC/hw_include/timer.c | 1125 + .../Demo/CORTEX_LM3S811_GCC/hw_include/timer.h | 137 + .../Demo/CORTEX_LM3S811_GCC/hw_include/uart.c | 821 + .../Demo/CORTEX_LM3S811_GCC/hw_include/uart.h | 102 + .../Demo/CORTEX_LM3S811_GCC/hw_include/watchdog.c | 592 + .../Demo/CORTEX_LM3S811_GCC/hw_include/watchdog.h | 63 + .../Demo/CORTEX_LM3S811_GCC/init/startup.c | 222 + .../FreeRTOS/Demo/CORTEX_LM3S811_GCC/main.c | 398 + .../FreeRTOS/Demo/CORTEX_LM3S811_GCC/makedefs | 208 + .../FreeRTOS/Demo/CORTEX_LM3S811_GCC/standalone.ld | 60 + .../Demo/CORTEX_LM3S811_IAR/FreeRTOSConfig.h | 115 + .../FreeRTOS/Demo/CORTEX_LM3S811_IAR/LM3S811.icf | 58 + .../CORTEX_LM3S811_IAR/LuminaryCode/DriverLib.h | 39 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/EULA.txt | 126 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/adc.c | 946 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/adc.h | 126 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/comp.c | 448 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/comp.h | 120 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/cpu.h | 40 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/debug.h | 56 + .../CORTEX_LM3S811_IAR/LuminaryCode/driverlib.r79 | Bin 0 -> 135874 bytes .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/flash.c | 668 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/flash.h | 75 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/gpio.c | 1103 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/gpio.h | 137 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_adc.h | 343 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_comp.h | 118 + .../CORTEX_LM3S811_IAR/LuminaryCode/hw_flash.h | 139 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_gpio.h | 103 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_i2c.h | 197 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_ints.h | 97 + .../CORTEX_LM3S811_IAR/LuminaryCode/hw_memmap.h | 64 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_nvic.h | 830 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_pwm.h | 260 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_qei.h | 176 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_ssi.h | 120 + .../CORTEX_LM3S811_IAR/LuminaryCode/hw_sysctl.h | 409 + .../CORTEX_LM3S811_IAR/LuminaryCode/hw_timer.h | 235 + .../CORTEX_LM3S811_IAR/LuminaryCode/hw_types.h | 67 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_uart.h | 239 + .../CORTEX_LM3S811_IAR/LuminaryCode/hw_watchdog.h | 116 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/i2c.c | 972 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/i2c.h | 139 + .../CORTEX_LM3S811_IAR/LuminaryCode/interrupt.c | 552 + .../CORTEX_LM3S811_IAR/LuminaryCode/interrupt.h | 57 + .../CORTEX_LM3S811_IAR/LuminaryCode/osram96x16.c | 968 + .../CORTEX_LM3S811_IAR/LuminaryCode/osram96x16.h | 47 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/pwm.c | 1291 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/pwm.h | 161 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/qei.c | 630 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/qei.h | 104 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/ssi.c | 609 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/ssi.h | 89 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/sysctl.c | 1889 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/sysctl.h | 285 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/systick.c | 262 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/systick.h | 55 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/timer.c | 1125 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/timer.h | 137 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/uart.c | 821 + .../Demo/CORTEX_LM3S811_IAR/LuminaryCode/uart.h | 104 + .../CORTEX_LM3S811_IAR/LuminaryCode/watchdog.c | 592 + .../CORTEX_LM3S811_IAR/LuminaryCode/watchdog.h | 63 + .../FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.ewd | 879 + .../FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.ewp | 951 + .../FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.eww | 54 + .../FreeRTOS/Demo/CORTEX_LM3S811_IAR/main.c | 397 + .../FreeRTOS/Demo/CORTEX_LM3S811_IAR/startup.c | 197 + .../Demo/CORTEX_LM3S811_KEIL/FreeRTOSConfig.h | 115 + .../CORTEX_LM3S811_KEIL/LuminaryCode/DriverLib.h | 39 + .../Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_adc.h | 329 + .../CORTEX_LM3S811_KEIL/LuminaryCode/hw_comp.h | 118 + .../CORTEX_LM3S811_KEIL/LuminaryCode/hw_flash.h | 139 + .../CORTEX_LM3S811_KEIL/LuminaryCode/hw_gpio.h | 103 + .../Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_i2c.h | 197 + .../CORTEX_LM3S811_KEIL/LuminaryCode/hw_ints.h | 97 + .../CORTEX_LM3S811_KEIL/LuminaryCode/hw_memmap.h | 64 + .../CORTEX_LM3S811_KEIL/LuminaryCode/hw_nvic.h | 830 + .../Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_pwm.h | 260 + .../Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_qei.h | 176 + .../Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_ssi.h | 120 + .../CORTEX_LM3S811_KEIL/LuminaryCode/hw_sysctl.h | 409 + .../CORTEX_LM3S811_KEIL/LuminaryCode/hw_timer.h | 235 + .../CORTEX_LM3S811_KEIL/LuminaryCode/hw_types.h | 67 + .../CORTEX_LM3S811_KEIL/LuminaryCode/hw_uart.h | 239 + .../CORTEX_LM3S811_KEIL/LuminaryCode/hw_watchdog.h | 116 + .../CORTEX_LM3S811_KEIL/LuminaryCode/osram96x16.c | 953 + .../CORTEX_LM3S811_KEIL/LuminaryCode/osram96x16.h | 47 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/adc.h | 124 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/comp.h | 120 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/cpu.h | 40 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/debug.h | 56 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/flash.h | 75 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/gpio.h | 137 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/i2c.h | 137 + .../LuminaryCode/src/interrupt.h | 57 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/pwm.h | 161 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/qei.h | 104 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/ssi.h | 88 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/sysctl.h | 285 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/systick.h | 55 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/timer.h | 137 + .../CORTEX_LM3S811_KEIL/LuminaryCode/src/uart.h | 102 + .../LuminaryCode/src/watchdog.h | 63 + .../FreeRTOS/Demo/CORTEX_LM3S811_KEIL/RTOSDemo.Opt | 54 + .../FreeRTOS/Demo/CORTEX_LM3S811_KEIL/RTOSDemo.Uv2 | 116 + .../Demo/CORTEX_LM3S811_KEIL/heap/heap_1.c | 137 + .../FreeRTOS/Demo/CORTEX_LM3S811_KEIL/main.c | 399 + .../FreeRTOS/Demo/CORTEX_LM3S811_KEIL/readme.txt | 36 + .../Demo/CORTEX_LM3S811_KEIL/startup_rvmdk.S | 240 + .../RTOSDemo/FreeRTOSConfig.h | 131 + .../RTOSDemo/IntQueueTimer.c | 133 + .../RTOSDemo/IntQueueTimer.h | 74 + .../Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/Makefile | 141 + .../RTOSDemo/ParTest/ParTest.c | 113 + .../Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/bitmap.h | 336 + .../RTOSDemo/formike128x128x16.c | 902 + .../RTOSDemo/formike128x128x16.h | 51 + .../CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/lcd_message.h | 9 + .../Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/main.c | 459 + .../RTOSDemo/osram128x64x4.c | 933 + .../RTOSDemo/osram128x64x4.h | 63 + .../RTOSDemo/pack_struct_end.h | 2 + .../RTOSDemo/pack_struct_start.h | 2 + .../CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/rit128x96x4.c | 981 + .../CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/standalone.ld | 60 + .../CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/startup.c | 251 + .../CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/timertest.c | 176 + .../RTOSDemo/webserver/Makefile.webserver | 1 + .../RTOSDemo/webserver/clock-arch.h | 42 + .../RTOSDemo/webserver/emac.c | 313 + .../RTOSDemo/webserver/emac.h | 322 + .../RTOSDemo/webserver/http-strings | 35 + .../RTOSDemo/webserver/http-strings.c | 102 + .../RTOSDemo/webserver/http-strings.h | 34 + .../RTOSDemo/webserver/httpd-cgi.c | 293 + .../RTOSDemo/webserver/httpd-cgi.h | 84 + .../RTOSDemo/webserver/httpd-fs.c | 132 + .../RTOSDemo/webserver/httpd-fs.h | 57 + .../RTOSDemo/webserver/httpd-fs/404.html | 8 + .../RTOSDemo/webserver/httpd-fs/index.html | 13 + .../RTOSDemo/webserver/httpd-fs/index.shtml | 20 + .../RTOSDemo/webserver/httpd-fs/io.shtml | 28 + .../RTOSDemo/webserver/httpd-fs/runtime.shtml | 20 + .../RTOSDemo/webserver/httpd-fs/stats.shtml | 41 + .../RTOSDemo/webserver/httpd-fs/tcp.shtml | 21 + .../RTOSDemo/webserver/httpd-fsdata.c | 557 + .../RTOSDemo/webserver/httpd-fsdata.h | 64 + .../RTOSDemo/webserver/httpd.c | 346 + .../RTOSDemo/webserver/httpd.h | 62 + .../RTOSDemo/webserver/makefsdata | 78 + .../RTOSDemo/webserver/makestrings | 40 + .../RTOSDemo/webserver/uIP_Task.c | 338 + .../RTOSDemo/webserver/uip-conf.h | 159 + .../RTOSDemo/webserver/webserver.h | 49 + .../Demo/CORTEX_LM3Sxxxx_Eclipse/fury_ft2232.cfg | 28 + .../CORTEX_LM3Sxxxx_Eclipse/fury_ft2232_flash.cfg | 34 + .../Demo/CORTEX_LM3Sxxxx_Eclipse/program.script | 17 + .../Backup of RTOSDemo.ewd | 586 + .../Backup of RTOSDemo.ewp | 947 + .../Debug/Exe/RTOSDemo.out | Bin 0 -> 460773 bytes .../Debug/Exe/RTOSDemo.sim | Bin 0 -> 35876 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/BlockQ.pbi | 38 + .../Debug/Obj/GenQTest.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/ParTest.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/PollQ.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/QPeek.pbi | 38 + .../Debug/Obj/RTOSDemo.pbd | 32 + .../Debug/Obj/blocktim.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/death.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/emac.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/flash.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/heap_2.pbi | 38 + .../Debug/Obj/http-strings.pbi | 38 + .../Debug/Obj/httpd-cgi.pbi | 38 + .../Debug/Obj/httpd-fs.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/httpd.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/integer.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/list.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/main.pbi | 38 + .../Debug/Obj/osram128x64x4.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/port.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/psock.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/queue.pbi | 38 + .../Debug/Obj/rit128x96x4.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/semtest.pbi | 38 + .../Debug/Obj/startup_ewarm.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/tasks.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/timer.pbi | 38 + .../Debug/Obj/timertest.pbi | 38 + .../Debug/Obj/uIP_Task.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uip.pbi | 38 + .../CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uip_arp.pbi | 38 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/FreeRTOSConfig.h | 148 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/IntQueueTimer.c | 133 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/IntQueueTimer.h | 74 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/LM3Sxxxx.icf | 58 + .../CORTEX_LM3Sxxxx_IAR_Keil/ParTest/ParTest.c | 113 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.Uv2.bak | 138 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.dep | 990 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.ewd | 982 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.ewp | 1065 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.eww | 10 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.opt.bak | 79 + .../RTOSDemo.uvgui.a0190789 | 2646 ++ .../RTOSDemo.uvgui_a0190789.bak | 2646 ++ .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvopt | 800 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvproj | 600 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.xcl | 56 + .../RTOSDemo_FreeRTOS_Demo.dep | 471 + .../CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo_uvopt.bak | 823 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/bitmap.h | 336 + .../CORTEX_LM3Sxxxx_IAR_Keil/formike128x128x16.c | 902 + .../CORTEX_LM3Sxxxx_IAR_Keil/formike128x128x16.h | 51 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/lcd_message.h | 9 + .../FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/main.c | 496 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/osram128x64x4.c | 933 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/osram128x64x4.h | 63 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rit128x96x4.c | 981 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/ExtDll.iex | 2 + .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.axf | Bin 0 -> 300528 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.bin | Bin 0 -> 32060 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.lnp | 3 + .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.map | 133 + .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.plg | 9 + .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.sct | 15 + .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.tra | 52 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/blockq.crf | Bin 0 -> 26201 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/blocktim.crf | Bin 0 -> 22711 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/death.crf | Bin 0 -> 21321 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/emac.__i | 1 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/emac.crf | Bin 0 -> 75605 bytes .../rvmdk/formike128x128x16.__i | 1 + .../rvmdk/formike128x128x16.crf | Bin 0 -> 44172 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/genqtest.crf | Bin 0 -> 27736 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/heap_2.__i | 1 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/heap_2.crf | Bin 0 -> 21744 bytes .../rvmdk/http-strings.__i | 1 + .../rvmdk/http-strings.crf | Bin 0 -> 1184 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-cgi.__i | 1 + .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-cgi.crf | Bin 0 -> 26930 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-fs.__i | 1 + .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-fs.crf | Bin 0 -> 18795 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd.__i | 1 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd.crf | Bin 0 -> 25683 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/integer.crf | Bin 0 -> 20925 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/intqueue.crf | Bin 0 -> 29122 bytes .../rvmdk/intqueuetimer.crf | Bin 0 -> 30881 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/list.__i | 1 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/list.crf | Bin 0 -> 16099 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/main.__i | 1 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/main.crf | Bin 0 -> 102732 bytes .../rvmdk/osram128x64x4.__i | 1 + .../rvmdk/osram128x64x4.crf | Bin 0 -> 62421 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/partest.crf | Bin 0 -> 23041 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/pollq.crf | Bin 0 -> 25123 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/port.__i | 1 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/port.crf | Bin 0 -> 17009 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/psock.__i | 1 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/psock.crf | Bin 0 -> 26386 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/qpeek.crf | Bin 0 -> 26903 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/queue.__i | 1 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/queue.crf | Bin 0 -> 31688 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/recmutex.crf | Bin 0 -> 22509 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/rit128x96x4.crf | Bin 0 -> 62905 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/semtest.crf | Bin 0 -> 26550 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/tasks.__i | 1 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/tasks.crf | Bin 0 -> 41376 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timer.__i | 1 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timer.crf | Bin 0 -> 10663 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timertest.crf | Bin 0 -> 36552 bytes .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip.__i | 1 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip.crf | Bin 0 -> 32518 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_arp.__i | 1 + .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_arp.crf | Bin 0 -> 23411 bytes .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_task.__i | 1 + .../CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_task.crf | Bin 0 -> 80847 bytes .../settings/RTOSDemo.cspy.bat | 24 + .../settings/RTOSDemo.dbgdt | 80 + .../CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.dni | 61 + .../settings/RTOSDemo.wsdt | 49 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/startup_ewarm.c | 219 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/startup_rvmdk.S | 251 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/timertest.c | 170 + .../webserver/Makefile.webserver | 1 + .../webserver/clock-arch.h | 42 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/emac.c | 318 + .../Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/emac.h | 322 + .../webserver/http-strings | 35 + .../webserver/http-strings.c | 102 + .../webserver/http-strings.h | 34 + .../CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-cgi.c | 269 + .../CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-cgi.h | 84 + .../CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs.c | 132 + .../CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs.h | 57 + .../webserver/httpd-fs/404.html | 8 + .../webserver/httpd-fs/index.html | 13 + .../webserver/httpd-fs/index.shtml | 20 + .../webserver/httpd-fs/io.shtml | 28 + .../webserver/httpd-fs/stats.shtml | 41 + .../webserver/httpd-fs/tcp.shtml | 21 + .../webserver/httpd-fsdata.c | 470 + .../webserver/httpd-fsdata.h | 64 + .../CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd.c | 346 + .../CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd.h | 62 + .../CORTEX_LM3Sxxxx_IAR_Keil/webserver/makefsdata | 78 + .../CORTEX_LM3Sxxxx_IAR_Keil/webserver/makestrings | 40 + .../CORTEX_LM3Sxxxx_IAR_Keil/webserver/uIP_Task.c | 349 + .../CORTEX_LM3Sxxxx_IAR_Keil/webserver/uip-conf.h | 159 + .../CORTEX_LM3Sxxxx_IAR_Keil/webserver/webserver.h | 49 + .../Demo/CORTEX_LM3Sxxxx_Rowley/FreeRTOSConfig.h | 150 + .../Demo/CORTEX_LM3Sxxxx_Rowley/IntQueueTimer.c | 133 + .../Demo/CORTEX_LM3Sxxxx_Rowley/IntQueueTimer.h | 74 + .../Demo/CORTEX_LM3Sxxxx_Rowley/LM3S_Startup.s | 199 + .../Demo/CORTEX_LM3Sxxxx_Rowley/LM3S_Target.js | 28 + .../Demo/CORTEX_LM3Sxxxx_Rowley/ParTest/ParTest.c | 113 + .../Demo/CORTEX_LM3Sxxxx_Rowley/RTOSDemo.hzp | 121 + .../Demo/CORTEX_LM3Sxxxx_Rowley/RTOSDemo.hzs | 58 + .../FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/bitmap.h | 336 + .../CORTEX_LM3Sxxxx_Rowley/formike128x128x16.c | 902 + .../CORTEX_LM3Sxxxx_Rowley/formike128x128x16.h | 51 + .../Demo/CORTEX_LM3Sxxxx_Rowley/lcd_message.h | 9 + .../FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/main.c | 483 + .../Demo/CORTEX_LM3Sxxxx_Rowley/osram128x64x4.c | 933 + .../Demo/CORTEX_LM3Sxxxx_Rowley/osram128x64x4.h | 63 + .../Demo/CORTEX_LM3Sxxxx_Rowley/pack_struct_end.h | 2 + .../CORTEX_LM3Sxxxx_Rowley/pack_struct_start.h | 2 + .../Demo/CORTEX_LM3Sxxxx_Rowley/rit128x96x4.c | 981 + .../Demo/CORTEX_LM3Sxxxx_Rowley/thumb_crt0.s | 227 + .../Demo/CORTEX_LM3Sxxxx_Rowley/timertest.c | 176 + .../webserver/Makefile.webserver | 1 + .../CORTEX_LM3Sxxxx_Rowley/webserver/clock-arch.h | 42 + .../Demo/CORTEX_LM3Sxxxx_Rowley/webserver/emac.c | 312 + .../Demo/CORTEX_LM3Sxxxx_Rowley/webserver/emac.h | 322 + .../CORTEX_LM3Sxxxx_Rowley/webserver/http-strings | 35 + .../webserver/http-strings.c | 102 + .../webserver/http-strings.h | 34 + .../CORTEX_LM3Sxxxx_Rowley/webserver/httpd-cgi.c | 293 + .../CORTEX_LM3Sxxxx_Rowley/webserver/httpd-cgi.h | 84 + .../CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs.c | 132 + .../CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs.h | 57 + .../webserver/httpd-fs/404.html | 8 + .../webserver/httpd-fs/index.html | 13 + .../webserver/httpd-fs/index.shtml | 20 + .../webserver/httpd-fs/io.shtml | 28 + .../webserver/httpd-fs/runtime.shtml | 20 + .../webserver/httpd-fs/stats.shtml | 41 + .../webserver/httpd-fs/tcp.shtml | 21 + .../webserver/httpd-fsdata.c | 557 + .../webserver/httpd-fsdata.h | 64 + .../Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd.c | 346 + .../Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd.h | 62 + .../CORTEX_LM3Sxxxx_Rowley/webserver/makefsdata | 78 + .../CORTEX_LM3Sxxxx_Rowley/webserver/makestrings | 40 + .../CORTEX_LM3Sxxxx_Rowley/webserver/uIP_Task.c | 349 + .../CORTEX_LM3Sxxxx_Rowley/webserver/uip-conf.h | 159 + .../CORTEX_LM3Sxxxx_Rowley/webserver/webserver.h | 49 + .../CORTEX_MPU_LM3Sxxxx_Rowley/FreeRTOSConfig.h | 127 + .../Demo/CORTEX_MPU_LM3Sxxxx_Rowley/LM3S_Startup.s | 196 + .../Demo/CORTEX_MPU_LM3Sxxxx_Rowley/LM3S_Target.js | 28 + .../Demo/CORTEX_MPU_LM3Sxxxx_Rowley/RTOSDemo.hzp | 52 + .../Demo/CORTEX_MPU_LM3Sxxxx_Rowley/RTOSDemo.hzs | 64 + .../CORTEX_MPU_LM3Sxxxx_Rowley/flash_placement.xml | 24 + .../Demo/CORTEX_MPU_LM3Sxxxx_Rowley/main.c | 1006 + .../Demo/CORTEX_MPU_LM3Sxxxx_Rowley/thumb_crt0.s | 233 + .../FileSystem/FatFs-0.7e/doc/00index_e.html | 101 + .../FileSystem/FatFs-0.7e/doc/00index_j.html | 102 + .../Common/FileSystem/FatFs-0.7e/doc/css_e.css | 56 + .../Common/FileSystem/FatFs-0.7e/doc/css_j.css | 59 + .../FileSystem/FatFs-0.7e/doc/en/appnote.html | 189 + .../Common/FileSystem/FatFs-0.7e/doc/en/chdir.html | 87 + .../FileSystem/FatFs-0.7e/doc/en/chdrive.html | 61 + .../Common/FileSystem/FatFs-0.7e/doc/en/chmod.html | 97 + .../Common/FileSystem/FatFs-0.7e/doc/en/close.html | 68 + .../Common/FileSystem/FatFs-0.7e/doc/en/dinit.html | 45 + .../FileSystem/FatFs-0.7e/doc/en/dioctl.html | 68 + .../Common/FileSystem/FatFs-0.7e/doc/en/dread.html | 58 + .../Common/FileSystem/FatFs-0.7e/doc/en/dstat.html | 47 + .../FileSystem/FatFs-0.7e/doc/en/dwrite.html | 66 + .../FileSystem/FatFs-0.7e/doc/en/fattime.html | 50 + .../FileSystem/FatFs-0.7e/doc/en/filename.html | 68 + .../FileSystem/FatFs-0.7e/doc/en/forward.html | 142 + .../FileSystem/FatFs-0.7e/doc/en/getfree.html | 101 + .../Common/FileSystem/FatFs-0.7e/doc/en/gets.html | 63 + .../Common/FileSystem/FatFs-0.7e/doc/en/lseek.html | 111 + .../Common/FileSystem/FatFs-0.7e/doc/en/mkdir.html | 89 + .../Common/FileSystem/FatFs-0.7e/doc/en/mkfs.html | 78 + .../Common/FileSystem/FatFs-0.7e/doc/en/mount.html | 65 + .../Common/FileSystem/FatFs-0.7e/doc/en/open.html | 148 + .../FileSystem/FatFs-0.7e/doc/en/opendir.html | 79 + .../FileSystem/FatFs-0.7e/doc/en/printf.html | 82 + .../Common/FileSystem/FatFs-0.7e/doc/en/putc.html | 60 + .../Common/FileSystem/FatFs-0.7e/doc/en/puts.html | 60 + .../Common/FileSystem/FatFs-0.7e/doc/en/read.html | 79 + .../FileSystem/FatFs-0.7e/doc/en/readdir.html | 119 + .../FileSystem/FatFs-0.7e/doc/en/rename.html | 93 + .../Common/FileSystem/FatFs-0.7e/doc/en/sdir.html | 36 + .../FileSystem/FatFs-0.7e/doc/en/sfatfs.html | 53 + .../Common/FileSystem/FatFs-0.7e/doc/en/sfile.html | 42 + .../FileSystem/FatFs-0.7e/doc/en/sfileinfo.html | 69 + .../Common/FileSystem/FatFs-0.7e/doc/en/stat.html | 75 + .../Common/FileSystem/FatFs-0.7e/doc/en/sync.html | 68 + .../FileSystem/FatFs-0.7e/doc/en/truncate.html | 71 + .../FileSystem/FatFs-0.7e/doc/en/unlink.html | 78 + .../Common/FileSystem/FatFs-0.7e/doc/en/utime.html | 83 + .../Common/FileSystem/FatFs-0.7e/doc/en/write.html | 79 + .../Common/FileSystem/FatFs-0.7e/doc/img/f1.png | Bin 0 -> 1145 bytes .../Common/FileSystem/FatFs-0.7e/doc/img/f2.png | Bin 0 -> 1458 bytes .../Common/FileSystem/FatFs-0.7e/doc/img/f3.png | Bin 0 -> 1039 bytes .../Common/FileSystem/FatFs-0.7e/doc/img/f4.png | Bin 0 -> 2335 bytes .../Common/FileSystem/FatFs-0.7e/doc/img/f5.png | Bin 0 -> 2479 bytes .../FileSystem/FatFs-0.7e/doc/img/layers.png | Bin 0 -> 2401 bytes .../FileSystem/FatFs-0.7e/doc/img/rwtest.png | Bin 0 -> 19068 bytes .../FileSystem/FatFs-0.7e/doc/img/rwtest2.png | Bin 0 -> 7525 bytes .../FileSystem/FatFs-0.7e/doc/ja/appnote.html | 194 + .../Common/FileSystem/FatFs-0.7e/doc/ja/chdir.html | 91 + .../FileSystem/FatFs-0.7e/doc/ja/chdrive.html | 62 + .../Common/FileSystem/FatFs-0.7e/doc/ja/chmod.html | 97 + .../Common/FileSystem/FatFs-0.7e/doc/ja/close.html | 68 + .../Common/FileSystem/FatFs-0.7e/doc/ja/dinit.html | 45 + .../FileSystem/FatFs-0.7e/doc/ja/dioctl.html | 67 + .../Common/FileSystem/FatFs-0.7e/doc/ja/dread.html | 58 + .../Common/FileSystem/FatFs-0.7e/doc/ja/dstat.html | 47 + .../FileSystem/FatFs-0.7e/doc/ja/dwrite.html | 66 + .../FileSystem/FatFs-0.7e/doc/ja/fattime.html | 50 + .../FileSystem/FatFs-0.7e/doc/ja/filename.html | 67 + .../FileSystem/FatFs-0.7e/doc/ja/forward.html | 141 + .../FileSystem/FatFs-0.7e/doc/ja/getfree.html | 101 + .../Common/FileSystem/FatFs-0.7e/doc/ja/gets.html | 63 + .../Common/FileSystem/FatFs-0.7e/doc/ja/lseek.html | 110 + .../Common/FileSystem/FatFs-0.7e/doc/ja/mkdir.html | 89 + .../Common/FileSystem/FatFs-0.7e/doc/ja/mkfs.html | 78 + .../Common/FileSystem/FatFs-0.7e/doc/ja/mount.html | 65 + .../Common/FileSystem/FatFs-0.7e/doc/ja/open.html | 144 + .../FileSystem/FatFs-0.7e/doc/ja/opendir.html | 79 + .../FileSystem/FatFs-0.7e/doc/ja/printf.html | 82 + .../Common/FileSystem/FatFs-0.7e/doc/ja/putc.html | 60 + .../Common/FileSystem/FatFs-0.7e/doc/ja/puts.html | 60 + .../Common/FileSystem/FatFs-0.7e/doc/ja/read.html | 79 + .../FileSystem/FatFs-0.7e/doc/ja/readdir.html | 124 + .../FileSystem/FatFs-0.7e/doc/ja/rename.html | 93 + .../Common/FileSystem/FatFs-0.7e/doc/ja/sdir.html | 36 + .../FileSystem/FatFs-0.7e/doc/ja/sfatfs.html | 51 + .../Common/FileSystem/FatFs-0.7e/doc/ja/sfile.html | 41 + .../FileSystem/FatFs-0.7e/doc/ja/sfileinfo.html | 69 + .../Common/FileSystem/FatFs-0.7e/doc/ja/stat.html | 80 + .../Common/FileSystem/FatFs-0.7e/doc/ja/sync.html | 68 + .../FileSystem/FatFs-0.7e/doc/ja/truncate.html | 71 + .../FileSystem/FatFs-0.7e/doc/ja/unlink.html | 76 + .../Common/FileSystem/FatFs-0.7e/doc/ja/utime.html | 83 + .../Common/FileSystem/FatFs-0.7e/doc/ja/write.html | 79 + .../Common/FileSystem/FatFs-0.7e/doc/updates.txt | 89 + .../Common/FileSystem/FatFs-0.7e/src/00readme.txt | 110 + .../Common/FileSystem/FatFs-0.7e/src/Copy of ff.c | 3153 ++ .../Common/FileSystem/FatFs-0.7e/src/fat_integer.h | 37 + .../Demo/Common/FileSystem/FatFs-0.7e/src/ff.c | 4460 +++ .../Demo/Common/FileSystem/FatFs-0.7e/src/ff.h | 596 + .../FileSystem/FatFs-0.7e/src/option/cc932.c | 3798 ++ .../FileSystem/FatFs-0.7e/src/option/cc936.c | 10973 ++++++ .../FileSystem/FatFs-0.7e/src/option/cc949.c | 8603 ++++ .../FileSystem/FatFs-0.7e/src/option/cc950.c | 6829 ++++ .../FileSystem/FatFs-0.7e/src/option/ccsbcs.c | 540 + .../FileSystem/FatFs-0.7e/src/option/syncobj.c | 111 + third_party/FreeRTOS/Demo/Common/Full/BlockQ.c | 346 + third_party/FreeRTOS/Demo/Common/Full/PollQ.c | 258 + third_party/FreeRTOS/Demo/Common/Full/comtest.c | 384 + third_party/FreeRTOS/Demo/Common/Full/death.c | 241 + third_party/FreeRTOS/Demo/Common/Full/dynamic.c | 616 + third_party/FreeRTOS/Demo/Common/Full/events.c | 406 + third_party/FreeRTOS/Demo/Common/Full/flash.c | 166 + third_party/FreeRTOS/Demo/Common/Full/flop.c | 369 + third_party/FreeRTOS/Demo/Common/Full/integer.c | 365 + third_party/FreeRTOS/Demo/Common/Full/print.c | 144 + third_party/FreeRTOS/Demo/Common/Full/semtest.c | 323 + .../FreeRTOS/Demo/Common/Minimal/AltBlckQ.c | 332 + .../FreeRTOS/Demo/Common/Minimal/AltBlock.c | 549 + .../FreeRTOS/Demo/Common/Minimal/AltPollQ.c | 275 + .../FreeRTOS/Demo/Common/Minimal/AltQTest.c | 587 + third_party/FreeRTOS/Demo/Common/Minimal/BlockQ.c | 324 + .../FreeRTOS/Demo/Common/Minimal/GenQTest.c | 600 + .../FreeRTOS/Demo/Common/Minimal/IntQueue.c | 756 + third_party/FreeRTOS/Demo/Common/Minimal/PollQ.c | 258 + third_party/FreeRTOS/Demo/Common/Minimal/QPeek.c | 474 + .../FreeRTOS/Demo/Common/Minimal/TimerDemo.c | 1060 + .../FreeRTOS/Demo/Common/Minimal/blocktim.c | 505 + third_party/FreeRTOS/Demo/Common/Minimal/comtest.c | 303 + .../FreeRTOS/Demo/Common/Minimal/comtest_strings.c | 349 + .../FreeRTOS/Demo/Common/Minimal/countsem.c | 322 + third_party/FreeRTOS/Demo/Common/Minimal/crflash.c | 246 + third_party/FreeRTOS/Demo/Common/Minimal/crhook.c | 270 + third_party/FreeRTOS/Demo/Common/Minimal/death.c | 267 + third_party/FreeRTOS/Demo/Common/Minimal/dynamic.c | 511 + third_party/FreeRTOS/Demo/Common/Minimal/flash.c | 157 + .../FreeRTOS/Demo/Common/Minimal/flash_timer.c | 136 + third_party/FreeRTOS/Demo/Common/Minimal/flop.c | 383 + third_party/FreeRTOS/Demo/Common/Minimal/integer.c | 201 + .../FreeRTOS/Demo/Common/Minimal/recmutex.c | 440 + third_party/FreeRTOS/Demo/Common/Minimal/semtest.c | 298 + third_party/FreeRTOS/Demo/Common/Minimal/sp_flop.c | 365 + .../Common/ethernet/FreeRTOS-uIP/Makefile.include | 47 + .../Demo/Common/ethernet/FreeRTOS-uIP/clock-arch.h | 42 + .../Demo/Common/ethernet/FreeRTOS-uIP/clock.h | 88 + .../Common/ethernet/FreeRTOS-uIP/lc-addrlabels.h | 83 + .../Demo/Common/ethernet/FreeRTOS-uIP/lc-switch.h | 76 + .../Demo/Common/ethernet/FreeRTOS-uIP/lc.h | 131 + .../Demo/Common/ethernet/FreeRTOS-uIP/psock.c | 374 + .../Demo/Common/ethernet/FreeRTOS-uIP/psock.h | 380 + .../Demo/Common/ethernet/FreeRTOS-uIP/pt.h | 323 + .../Demo/Common/ethernet/FreeRTOS-uIP/timer.c | 130 + .../Demo/Common/ethernet/FreeRTOS-uIP/timer.h | 86 + .../Demo/Common/ethernet/FreeRTOS-uIP/uip-fw.h | 176 + .../Common/ethernet/FreeRTOS-uIP/uip-neighbor.h | 61 + .../Demo/Common/ethernet/FreeRTOS-uIP/uip-split.c | 144 + .../Demo/Common/ethernet/FreeRTOS-uIP/uip-split.h | 96 + .../Demo/Common/ethernet/FreeRTOS-uIP/uip.c | 2233 ++ .../Demo/Common/ethernet/FreeRTOS-uIP/uip.h | 1642 + .../Demo/Common/ethernet/FreeRTOS-uIP/uip_arch.h | 138 + .../Demo/Common/ethernet/FreeRTOS-uIP/uip_arp.c | 466 + .../Demo/Common/ethernet/FreeRTOS-uIP/uip_arp.h | 152 + .../Demo/Common/ethernet/FreeRTOS-uIP/uip_timer.h | 86 + .../Demo/Common/ethernet/FreeRTOS-uIP/uiplib.c | 81 + .../Demo/Common/ethernet/FreeRTOS-uIP/uiplib.h | 71 + .../Demo/Common/ethernet/FreeRTOS-uIP/uipopt.h | 535 + .../ethernet/FreeTCPIP/apps/httpd/http-strings.c | 486 + .../ethernet/FreeTCPIP/apps/httpd/http-strings.h | 34 + .../ethernet/FreeTCPIP/apps/httpd/httpd-cgi.c | 169 + .../ethernet/FreeTCPIP/apps/httpd/httpd-cgi.h | 85 + .../ethernet/FreeTCPIP/apps/httpd/httpd-fs.c | 133 + .../ethernet/FreeTCPIP/apps/httpd/httpd-fs.h | 57 + .../ethernet/FreeTCPIP/apps/httpd/httpd-fsdata.h | 62 + .../Common/ethernet/FreeTCPIP/apps/httpd/httpd.c | 400 + .../Common/ethernet/FreeTCPIP/apps/httpd/httpd.h | 61 + .../ethernet/FreeTCPIP/apps/httpd/makefsdata | 78 + .../Common/ethernet/FreeTCPIP/net/clock-arch.h | 42 + .../Demo/Common/ethernet/FreeTCPIP/net/lc-switch.h | 76 + .../Demo/Common/ethernet/FreeTCPIP/net/lc.h | 131 + .../ethernet/FreeTCPIP/net/pack_struct_end.h | 33 + .../ethernet/FreeTCPIP/net/pack_struct_start.h | 34 + .../Demo/Common/ethernet/FreeTCPIP/net/psock.h | 380 + .../Demo/Common/ethernet/FreeTCPIP/net/pt.h | 323 + .../Demo/Common/ethernet/FreeTCPIP/net/uip.h | 2184 ++ .../Demo/Common/ethernet/FreeTCPIP/net/uip_arch.h | 138 + .../Demo/Common/ethernet/FreeTCPIP/net/uip_arp.h | 149 + .../Demo/Common/ethernet/FreeTCPIP/net/uipopt.h | 695 + .../Demo/Common/ethernet/FreeTCPIP/psock.c | 338 + .../Demo/Common/ethernet/FreeTCPIP/sys/clock.h | 115 + .../Demo/Common/ethernet/FreeTCPIP/sys/pt.h | 335 + .../Demo/Common/ethernet/FreeTCPIP/sys/timer.h | 101 + .../Demo/Common/ethernet/FreeTCPIP/timer.c | 151 + .../FreeRTOS/Demo/Common/ethernet/FreeTCPIP/uip.c | 2143 + .../Demo/Common/ethernet/FreeTCPIP/uip_arp.c | 475 + .../FreeRTOS/Demo/Common/include/AltBlckQ.h | 74 + .../FreeRTOS/Demo/Common/include/AltBlock.h | 74 + .../FreeRTOS/Demo/Common/include/AltPollQ.h | 74 + .../FreeRTOS/Demo/Common/include/AltQTest.h | 75 + third_party/FreeRTOS/Demo/Common/include/BlockQ.h | 74 + .../FreeRTOS/Demo/Common/include/GenQTest.h | 75 + .../FreeRTOS/Demo/Common/include/IntQueue.h | 80 + third_party/FreeRTOS/Demo/Common/include/PollQ.h | 74 + third_party/FreeRTOS/Demo/Common/include/QPeek.h | 75 + .../FreeRTOS/Demo/Common/include/TimerDemo.h | 76 + .../FreeRTOS/Demo/Common/include/blocktim.h | 74 + third_party/FreeRTOS/Demo/Common/include/comtest.h | 75 + .../FreeRTOS/Demo/Common/include/comtest2.h | 73 + .../FreeRTOS/Demo/Common/include/comtest_strings.h | 73 + .../FreeRTOS/Demo/Common/include/countsem.h | 73 + third_party/FreeRTOS/Demo/Common/include/crflash.h | 85 + third_party/FreeRTOS/Demo/Common/include/crhook.h | 81 + third_party/FreeRTOS/Demo/Common/include/death.h | 74 + third_party/FreeRTOS/Demo/Common/include/dynamic.h | 74 + third_party/FreeRTOS/Demo/Common/include/fileIO.h | 74 + third_party/FreeRTOS/Demo/Common/include/flash.h | 72 + .../FreeRTOS/Demo/Common/include/flash_timer.h | 79 + third_party/FreeRTOS/Demo/Common/include/flop.h | 74 + third_party/FreeRTOS/Demo/Common/include/integer.h | 74 + third_party/FreeRTOS/Demo/Common/include/mevents.h | 74 + third_party/FreeRTOS/Demo/Common/include/partest.h | 76 + third_party/FreeRTOS/Demo/Common/include/print.h | 75 + .../FreeRTOS/Demo/Common/include/recmutex.h | 73 + third_party/FreeRTOS/Demo/Common/include/semtest.h | 73 + third_party/FreeRTOS/Demo/Common/include/serial.h | 136 + third_party/FreeRTOS/Demo/readme.txt | 16 + third_party/FreeRTOS/License/license.txt | 394 + third_party/FreeRTOS/Source/croutine.c | 386 + third_party/FreeRTOS/Source/include/FreeRTOS.h | 621 + third_party/FreeRTOS/Source/include/StackMacros.h | 180 + third_party/FreeRTOS/Source/include/croutine.h | 758 + third_party/FreeRTOS/Source/include/list.h | 379 + third_party/FreeRTOS/Source/include/mpu_wrappers.h | 153 + third_party/FreeRTOS/Source/include/portable.h | 402 + third_party/FreeRTOS/Source/include/projdefs.h | 89 + third_party/FreeRTOS/Source/include/queue.h | 1685 + third_party/FreeRTOS/Source/include/semphr.h | 840 + third_party/FreeRTOS/Source/include/task.h | 1520 + third_party/FreeRTOS/Source/include/timers.h | 960 + third_party/FreeRTOS/Source/list.c | 204 + .../FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c | 258 + .../Source/portable/CCS/ARM_CM4F/portasm.asm | 193 + .../Source/portable/CCS/ARM_CM4F/portmacro.h | 151 + .../FreeRTOS/Source/portable/GCC/ARM_CM3/port.c | 718 + .../Source/portable/GCC/ARM_CM3/portmacro.h | 187 + .../Source/portable/GCC/ARM_CM3_MPU/port.c | 1246 + .../Source/portable/GCC/ARM_CM3_MPU/portmacro.h | 214 + .../FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c | 757 + .../Source/portable/GCC/ARM_CM4F/portmacro.h | 188 + .../FreeRTOS/Source/portable/IAR/ARM_CM3/port.c | 605 + .../FreeRTOS/Source/portable/IAR/ARM_CM3/portasm.s | 150 + .../Source/portable/IAR/ARM_CM3/portmacro.h | 184 + .../FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c | 631 + .../Source/portable/IAR/ARM_CM4F/portasm.s | 191 + .../Source/portable/IAR/ARM_CM4F/portmacro.h | 185 + .../portable/Keil/See-also-the-RVDS-directory.txt | 1 + .../FreeRTOS/Source/portable/MemMang/heap_1.c | 170 + .../FreeRTOS/Source/portable/MemMang/heap_2.c | 299 + .../FreeRTOS/Source/portable/MemMang/heap_3.c | 131 + .../FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c | 696 + .../Source/portable/RVDS/ARM_CM3/portmacro.h | 177 + .../FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c | 767 + .../Source/portable/RVDS/ARM_CM4F/portmacro.h | 178 + third_party/FreeRTOS/Source/portable/readme.txt | 19 + third_party/FreeRTOS/Source/queue.c | 2105 + third_party/FreeRTOS/Source/readme.txt | 17 + third_party/FreeRTOS/Source/tasks.c | 2978 ++ third_party/FreeRTOS/Source/timers.c | 707 + third_party/FreeRTOS/TraceCon/readme.txt | 6 + .../TraceCon/tracecon_big_endian_untested.exe | Bin 0 -> 35142 bytes .../FreeRTOS/TraceCon/tracecon_little_endian.exe | Bin 0 -> 34982 bytes third_party/FreeRTOS/readme.txt | 21 + third_party/bget/bget.c | 1618 + third_party/bget/bget.h | 36 + third_party/exosite/LICENSE | 26 + third_party/exosite/exosite.c | 839 + third_party/exosite/exosite.h | 82 + third_party/exosite/exosite_meta.c | 189 + third_party/exosite/exosite_meta.h | 76 + third_party/fatfs/doc/00index_e.html | 87 + third_party/fatfs/doc/00index_j.html | 87 + third_party/fatfs/doc/css_e.css | 55 + third_party/fatfs/doc/css_j.css | 58 + third_party/fatfs/doc/en/appnote.html | 124 + third_party/fatfs/doc/en/chmod.html | 89 + third_party/fatfs/doc/en/close.html | 60 + third_party/fatfs/doc/en/dinit.html | 44 + third_party/fatfs/doc/en/dioctl.html | 65 + third_party/fatfs/doc/en/dread.html | 58 + third_party/fatfs/doc/en/dstat.html | 47 + third_party/fatfs/doc/en/dwrite.html | 66 + third_party/fatfs/doc/en/fattime.html | 50 + third_party/fatfs/doc/en/filename.html | 58 + third_party/fatfs/doc/en/getfree.html | 91 + third_party/fatfs/doc/en/lseek.html | 86 + third_party/fatfs/doc/en/mkdir.html | 83 + third_party/fatfs/doc/en/mkfs.html | 73 + third_party/fatfs/doc/en/mount.html | 59 + third_party/fatfs/doc/en/mountdrv.html | 57 + third_party/fatfs/doc/en/open.html | 136 + third_party/fatfs/doc/en/opendir.html | 73 + third_party/fatfs/doc/en/read.html | 71 + third_party/fatfs/doc/en/readdir.html | 89 + third_party/fatfs/doc/en/rename.html | 84 + third_party/fatfs/doc/en/sdir.html | 42 + third_party/fatfs/doc/en/sfatfs.html | 63 + third_party/fatfs/doc/en/sfile.html | 55 + third_party/fatfs/doc/en/sfileinfo.html | 43 + third_party/fatfs/doc/en/stat.html | 73 + third_party/fatfs/doc/en/sync.html | 60 + third_party/fatfs/doc/en/unlink.html | 69 + third_party/fatfs/doc/en/write.html | 71 + third_party/fatfs/doc/img/f1.png | Bin 0 -> 1145 bytes third_party/fatfs/doc/img/f2.png | Bin 0 -> 1458 bytes third_party/fatfs/doc/img/f3.png | Bin 0 -> 1039 bytes third_party/fatfs/doc/img/f4.png | Bin 0 -> 2474 bytes third_party/fatfs/doc/img/f5.png | Bin 0 -> 2433 bytes third_party/fatfs/doc/img/layers.png | Bin 0 -> 1865 bytes third_party/fatfs/doc/img/rw_ata.jpeg | Bin 0 -> 66954 bytes third_party/fatfs/doc/img/rw_cfc.jpeg | Bin 0 -> 32242 bytes third_party/fatfs/doc/img/rw_mmc.jpeg | Bin 0 -> 29612 bytes third_party/fatfs/doc/img/rwtest.png | Bin 0 -> 19261 bytes third_party/fatfs/doc/ja/appnote.html | 125 + third_party/fatfs/doc/ja/chmod.html | 89 + third_party/fatfs/doc/ja/close.html | 60 + third_party/fatfs/doc/ja/dinit.html | 44 + third_party/fatfs/doc/ja/dioctl.html | 65 + third_party/fatfs/doc/ja/dread.html | 58 + third_party/fatfs/doc/ja/dstat.html | 47 + third_party/fatfs/doc/ja/dwrite.html | 66 + third_party/fatfs/doc/ja/fattime.html | 50 + third_party/fatfs/doc/ja/filename.html | 56 + third_party/fatfs/doc/ja/getfree.html | 91 + third_party/fatfs/doc/ja/lseek.html | 87 + third_party/fatfs/doc/ja/mkdir.html | 83 + third_party/fatfs/doc/ja/mkfs.html | 73 + third_party/fatfs/doc/ja/mount.html | 59 + third_party/fatfs/doc/ja/mountdrv.html | 58 + third_party/fatfs/doc/ja/open.html | 135 + third_party/fatfs/doc/ja/opendir.html | 73 + third_party/fatfs/doc/ja/read.html | 71 + third_party/fatfs/doc/ja/readdir.html | 89 + third_party/fatfs/doc/ja/rename.html | 86 + third_party/fatfs/doc/ja/sdir.html | 42 + third_party/fatfs/doc/ja/sfatfs.html | 63 + third_party/fatfs/doc/ja/sfile.html | 54 + third_party/fatfs/doc/ja/sfileinfo.html | 43 + third_party/fatfs/doc/ja/stat.html | 73 + third_party/fatfs/doc/ja/sync.html | 61 + third_party/fatfs/doc/ja/unlink.html | 68 + third_party/fatfs/doc/ja/write.html | 71 + third_party/fatfs/doc/updates.txt | 42 + third_party/fatfs/port/dual-disk-driver.c | 264 + third_party/fatfs/port/fat_usbmsc.c | 151 + third_party/fatfs/port/mmc-dk-tm4c123g.c | 725 + third_party/fatfs/port/mmc-dk-tm4c129x.c | 740 + third_party/fatfs/port/mmc-ek-lm4f232.c | 725 + third_party/fatfs/port/mmc-ek-tm4c1294xl.c | 740 + third_party/fatfs/port/sample-mmc.c | 559 + third_party/fatfs/src/00readme.txt | 138 + third_party/fatfs/src/diskio.h | 88 + third_party/fatfs/src/ff.c | 4325 ++ third_party/fatfs/src/ff.h | 340 + third_party/fatfs/src/ffconf.h | 195 + third_party/fatfs/src/integer.h | 40 + third_party/fatfs/src/option/cc932.c | 3798 ++ third_party/fatfs/src/option/cc936.c | 10973 ++++++ third_party/fatfs/src/option/cc949.c | 8603 ++++ third_party/fatfs/src/option/cc950.c | 6829 ++++ third_party/fatfs/src/option/ccsbcs.c | 540 + third_party/fatfs/src/option/syscall.c | 155 + third_party/fatfs/src/option/unicode.c | 17 + third_party/fonts/apl/AUTHORS | 14 + third_party/fonts/apl/COPYRIGHT | 172 + third_party/fonts/apl/Changelog | 80 + third_party/fonts/apl/Changelog.big5 | 71 + third_party/fonts/apl/apl_fonts.h | 27 + .../fonts/apl/binfonts/fontfireflysung6x12.bin | Bin 0 -> 631144 bytes .../fonts/apl/binfonts/fontfireflysung6x14.bin | Bin 0 -> 704416 bytes .../fonts/apl/binfonts/fontfireflysung7x14.bin | Bin 0 -> 762504 bytes .../fonts/apl/binfonts/fontfireflysung7x15.bin | Bin 0 -> 827268 bytes third_party/fonts/apl/fonts/fontfireflysung6x12.c | 964 + third_party/fonts/apl/fonts/fontfireflysung6x14.c | 1005 + third_party/fonts/apl/fonts/fontfireflysung7x14.c | 1047 + third_party/fonts/apl/fonts/fontfireflysung7x15.c | 1093 + third_party/fonts/apl/license/big5/ARPHICPL.TXT | 58 + third_party/fonts/apl/license/english/ARPHICPL.TXT | 58 + third_party/fonts/apl/license/gb/ARPHICPL.TXT | 58 + third_party/fonts/apl/readme.txt | 5 + third_party/fonts/apl/ttf/fireflysung.ttf | Bin 0 -> 15845256 bytes third_party/fonts/lang_demo/Makefile | 91 + third_party/fonts/lang_demo/fontcustom14pt.c | 4975 +++ third_party/fonts/lang_demo/fontcustom20pt.c | 5265 +++ third_party/fonts/lang_demo/fontcustomr14pt.c | 1134 + third_party/fonts/lang_demo/fontcustomr20pt.c | 1455 + third_party/fonts/lang_demo/langremap.c | 548 + third_party/fonts/lang_demo/langremap.h | 389 + third_party/fonts/lang_demo/language.c | 612 + third_party/fonts/lang_demo/language.csv | 23 + third_party/fonts/lang_demo/language.h | 59 + third_party/fonts/lang_demo/readme.txt | 43 + third_party/fonts/ofl/OFL.txt | 94 + .../fonts/ofl/binfonts/fonthandwriting14pt.bin | Bin 0 -> 4136 bytes .../fonts/ofl/binfonts/fonthandwriting16pt.bin | Bin 0 -> 4688 bytes .../fonts/ofl/binfonts/fonthandwriting18pt.bin | Bin 0 -> 5156 bytes .../fonts/ofl/binfonts/fonthandwriting20pt.bin | Bin 0 -> 5264 bytes .../fonts/ofl/binfonts/fonthandwriting22pt.bin | Bin 0 -> 5748 bytes .../fonts/ofl/binfonts/fonthandwriting24pt.bin | Bin 0 -> 6208 bytes .../fonts/ofl/binfonts/fonthandwriting26pt.bin | Bin 0 -> 6792 bytes .../fonts/ofl/binfonts/fonthandwriting28pt.bin | Bin 0 -> 7388 bytes .../fonts/ofl/binfonts/fonthandwriting30pt.bin | Bin 0 -> 8160 bytes .../fonts/ofl/binfonts/fonthangulgothic16pt.bin | Bin 0 -> 438420 bytes .../fonts/ofl/binfonts/fonthangulgothic16ptb.bin | Bin 0 -> 426292 bytes .../fonts/ofl/binfonts/fonthangulgothic18pt.bin | Bin 0 -> 504636 bytes .../fonts/ofl/binfonts/fonthangulgothic18ptb.bin | Bin 0 -> 484004 bytes .../fonts/ofl/binfonts/fonthangulgothic20pt.bin | Bin 0 -> 566436 bytes .../fonts/ofl/binfonts/fonthangulgothic20ptb.bin | Bin 0 -> 559568 bytes .../fonts/ofl/binfonts/fonthangulgothic22pt.bin | Bin 0 -> 613804 bytes .../fonts/ofl/binfonts/fonthangulgothic22ptb.bin | Bin 0 -> 613416 bytes .../fonts/ofl/binfonts/fonthangulgothic24pt.bin | Bin 0 -> 671272 bytes .../fonts/ofl/binfonts/fonthangulgothic24ptb.bin | Bin 0 -> 669032 bytes .../fonts/ofl/binfonts/fonthangulmyeongjo16pt.bin | Bin 0 -> 459236 bytes .../fonts/ofl/binfonts/fonthangulmyeongjo16ptb.bin | Bin 0 -> 445284 bytes .../fonts/ofl/binfonts/fonthangulmyeongjo18pt.bin | Bin 0 -> 508684 bytes .../fonts/ofl/binfonts/fonthangulmyeongjo18ptb.bin | Bin 0 -> 502300 bytes .../fonts/ofl/binfonts/fonthangulmyeongjo20pt.bin | Bin 0 -> 578648 bytes .../fonts/ofl/binfonts/fonthangulmyeongjo20ptb.bin | Bin 0 -> 571196 bytes .../fonts/ofl/binfonts/fonthangulmyeongjo22pt.bin | Bin 0 -> 641992 bytes .../fonts/ofl/binfonts/fonthangulmyeongjo22ptb.bin | Bin 0 -> 637976 bytes .../fonts/ofl/binfonts/fonthangulmyeongjo24pt.bin | Bin 0 -> 710912 bytes .../fonts/ofl/binfonts/fonthangulmyeongjo24ptb.bin | Bin 0 -> 702012 bytes .../fonts/ofl/binfonts/fontoldstandard14pt.bin | Bin 0 -> 4920 bytes .../fonts/ofl/binfonts/fontoldstandard14ptb.bin | Bin 0 -> 4696 bytes .../fonts/ofl/binfonts/fontoldstandard14pti.bin | Bin 0 -> 5124 bytes .../fonts/ofl/binfonts/fontoldstandard16pt.bin | Bin 0 -> 5428 bytes .../fonts/ofl/binfonts/fontoldstandard16ptb.bin | Bin 0 -> 5360 bytes .../fonts/ofl/binfonts/fontoldstandard16pti.bin | Bin 0 -> 5236 bytes .../fonts/ofl/binfonts/fontoldstandard18pt.bin | Bin 0 -> 5932 bytes .../fonts/ofl/binfonts/fontoldstandard18ptb.bin | Bin 0 -> 5824 bytes .../fonts/ofl/binfonts/fontoldstandard18pti.bin | Bin 0 -> 5804 bytes .../fonts/ofl/binfonts/fontoldstandard20pt.bin | Bin 0 -> 6020 bytes .../fonts/ofl/binfonts/fontoldstandard20ptb.bin | Bin 0 -> 6456 bytes .../fonts/ofl/binfonts/fontoldstandard20pti.bin | Bin 0 -> 6368 bytes .../fonts/ofl/binfonts/fontoldstandard22pt.bin | Bin 0 -> 6548 bytes .../fonts/ofl/binfonts/fontoldstandard22ptb.bin | Bin 0 -> 6876 bytes .../fonts/ofl/binfonts/fontoldstandard22pti.bin | Bin 0 -> 6972 bytes .../fonts/ofl/binfonts/fontoldstandard24pt.bin | Bin 0 -> 7128 bytes .../fonts/ofl/binfonts/fontoldstandard24ptb.bin | Bin 0 -> 7524 bytes .../fonts/ofl/binfonts/fontoldstandard24pti.bin | Bin 0 -> 7516 bytes .../fonts/ofl/binfonts/fontoldstandard26pt.bin | Bin 0 -> 7648 bytes .../fonts/ofl/binfonts/fontoldstandard26ptb.bin | Bin 0 -> 7968 bytes .../fonts/ofl/binfonts/fontoldstandard26pti.bin | Bin 0 -> 8144 bytes .../fonts/ofl/binfonts/fontoldstandard28pt.bin | Bin 0 -> 8232 bytes .../fonts/ofl/binfonts/fontoldstandard28ptb.bin | Bin 0 -> 8620 bytes .../fonts/ofl/binfonts/fontoldstandard28pti.bin | Bin 0 -> 8784 bytes .../fonts/ofl/binfonts/fontoldstandard30pt.bin | Bin 0 -> 8868 bytes .../fonts/ofl/binfonts/fontoldstandard30ptb.bin | Bin 0 -> 9188 bytes .../fonts/ofl/binfonts/fontoldstandard30pti.bin | Bin 0 -> 9580 bytes third_party/fonts/ofl/binfonts/fontsansand14pt.bin | Bin 0 -> 4556 bytes third_party/fonts/ofl/binfonts/fontsansand16pt.bin | Bin 0 -> 5072 bytes third_party/fonts/ofl/binfonts/fontsansand18pt.bin | Bin 0 -> 5572 bytes third_party/fonts/ofl/binfonts/fontsansand20pt.bin | Bin 0 -> 5952 bytes third_party/fonts/ofl/binfonts/fontsansand22pt.bin | Bin 0 -> 6364 bytes third_party/fonts/ofl/binfonts/fontsansand24pt.bin | Bin 0 -> 6724 bytes third_party/fonts/ofl/binfonts/fontsansand26pt.bin | Bin 0 -> 7104 bytes third_party/fonts/ofl/binfonts/fontsansand28pt.bin | Bin 0 -> 7672 bytes third_party/fonts/ofl/binfonts/fontsansand30pt.bin | Bin 0 -> 8168 bytes .../fonts/ofl/binfonts/fonttheanodidot14pt.bin | Bin 0 -> 4516 bytes .../fonts/ofl/binfonts/fonttheanodidot16pt.bin | Bin 0 -> 5068 bytes .../fonts/ofl/binfonts/fonttheanodidot18pt.bin | Bin 0 -> 5580 bytes .../fonts/ofl/binfonts/fonttheanodidot20pt.bin | Bin 0 -> 6084 bytes .../fonts/ofl/binfonts/fonttheanodidot22pt.bin | Bin 0 -> 6728 bytes .../fonts/ofl/binfonts/fonttheanodidot24pt.bin | Bin 0 -> 7324 bytes .../fonts/ofl/binfonts/fonttheanodidot26pt.bin | Bin 0 -> 7776 bytes .../fonts/ofl/binfonts/fonttheanodidot28pt.bin | Bin 0 -> 7860 bytes .../fonts/ofl/binfonts/fonttheanodidot30pt.bin | Bin 0 -> 8636 bytes .../fonts/ofl/binfonts/fonttheanomodern14pt.bin | Bin 0 -> 4600 bytes .../fonts/ofl/binfonts/fonttheanomodern16pt.bin | Bin 0 -> 5084 bytes .../fonts/ofl/binfonts/fonttheanomodern18pt.bin | Bin 0 -> 5668 bytes .../fonts/ofl/binfonts/fonttheanomodern20pt.bin | Bin 0 -> 6140 bytes .../fonts/ofl/binfonts/fonttheanomodern22pt.bin | Bin 0 -> 6792 bytes .../fonts/ofl/binfonts/fonttheanomodern24pt.bin | Bin 0 -> 7448 bytes .../fonts/ofl/binfonts/fonttheanomodern26pt.bin | Bin 0 -> 7884 bytes .../fonts/ofl/binfonts/fonttheanomodern28pt.bin | Bin 0 -> 8524 bytes .../fonts/ofl/binfonts/fonttheanomodern30pt.bin | Bin 0 -> 9248 bytes .../fonts/ofl/binfonts/fonttheanooldstyle14pt.bin | Bin 0 -> 4472 bytes .../fonts/ofl/binfonts/fonttheanooldstyle16pt.bin | Bin 0 -> 4964 bytes .../fonts/ofl/binfonts/fonttheanooldstyle18pt.bin | Bin 0 -> 5528 bytes .../fonts/ofl/binfonts/fonttheanooldstyle20pt.bin | Bin 0 -> 5972 bytes .../fonts/ofl/binfonts/fonttheanooldstyle22pt.bin | Bin 0 -> 6600 bytes .../fonts/ofl/binfonts/fonttheanooldstyle24pt.bin | Bin 0 -> 7208 bytes .../fonts/ofl/binfonts/fonttheanooldstyle26pt.bin | Bin 0 -> 7660 bytes .../fonts/ofl/binfonts/fonttheanooldstyle28pt.bin | Bin 0 -> 8272 bytes .../fonts/ofl/binfonts/fonttheanooldstyle30pt.bin | Bin 0 -> 8932 bytes third_party/fonts/ofl/fonts/fontcjktest20pt.c | 2027 + third_party/fonts/ofl/fonts/fonthandwriting14.c | 500 + third_party/fonts/ofl/fonts/fonthandwriting16.c | 544 + third_party/fonts/ofl/fonts/fonthandwriting18.c | 585 + third_party/fonts/ofl/fonts/fonthandwriting20.c | 594 + third_party/fonts/ofl/fonts/fonthandwriting22.c | 634 + third_party/fonts/ofl/fonts/fonthandwriting24.c | 672 + third_party/fonts/ofl/fonts/fonthandwriting26.c | 721 + third_party/fonts/ofl/fonts/fonthandwriting28.c | 771 + third_party/fonts/ofl/fonts/fonthandwriting30.c | 835 + third_party/fonts/ofl/fonts/fonthangulgothic16pt.c | 732 + .../fonts/ofl/fonts/fonthangulgothic16ptb.c | 710 + third_party/fonts/ofl/fonts/fonthangulgothic18pt.c | 764 + .../fonts/ofl/fonts/fonthangulgothic18ptb.c | 749 + third_party/fonts/ofl/fonts/fonthangulgothic20pt.c | 813 + .../fonts/ofl/fonts/fonthangulgothic20ptb.c | 793 + third_party/fonts/ofl/fonts/fonthangulgothic22pt.c | 854 + .../fonts/ofl/fonts/fonthangulgothic22ptb.c | 824 + third_party/fonts/ofl/fonts/fonthangulgothic24pt.c | 888 + .../fonts/ofl/fonts/fonthangulgothic24ptb.c | 877 + .../fonts/ofl/fonts/fonthangulmyeongjo16pt.c | 756 + .../fonts/ofl/fonts/fonthangulmyeongjo16ptb.c | 752 + .../fonts/ofl/fonts/fonthangulmyeongjo18pt.c | 798 + .../fonts/ofl/fonts/fonthangulmyeongjo18ptb.c | 791 + .../fonts/ofl/fonts/fonthangulmyeongjo20pt.c | 843 + .../fonts/ofl/fonts/fonthangulmyeongjo20ptb.c | 838 + .../fonts/ofl/fonts/fonthangulmyeongjo22pt.c | 892 + .../fonts/ofl/fonts/fonthangulmyeongjo22ptb.c | 889 + .../fonts/ofl/fonts/fonthangulmyeongjo24pt.c | 935 + .../fonts/ofl/fonts/fonthangulmyeongjo24ptb.c | 932 + third_party/fonts/ofl/fonts/fontoldstandard14.c | 553 + third_party/fonts/ofl/fonts/fontoldstandard14b.c | 534 + third_party/fonts/ofl/fonts/fontoldstandard14i.c | 570 + third_party/fonts/ofl/fonts/fontoldstandard16.c | 595 + third_party/fonts/ofl/fonts/fontoldstandard16b.c | 590 + third_party/fonts/ofl/fonts/fontoldstandard16i.c | 579 + third_party/fonts/ofl/fonts/fontoldstandard18.c | 637 + third_party/fonts/ofl/fonts/fontoldstandard18b.c | 628 + third_party/fonts/ofl/fonts/fontoldstandard18i.c | 627 + third_party/fonts/ofl/fonts/fontoldstandard20.c | 645 + third_party/fonts/ofl/fonts/fontoldstandard20b.c | 681 + third_party/fonts/ofl/fonts/fontoldstandard20i.c | 674 + third_party/fonts/ofl/fonts/fontoldstandard22.c | 689 + third_party/fonts/ofl/fonts/fontoldstandard22b.c | 716 + third_party/fonts/ofl/fonts/fontoldstandard22i.c | 724 + third_party/fonts/ofl/fonts/fontoldstandard24.c | 737 + third_party/fonts/ofl/fonts/fontoldstandard24b.c | 770 + third_party/fonts/ofl/fonts/fontoldstandard24i.c | 768 + third_party/fonts/ofl/fonts/fontoldstandard26.c | 780 + third_party/fonts/ofl/fonts/fontoldstandard26b.c | 807 + third_party/fonts/ofl/fonts/fontoldstandard26i.c | 822 + third_party/fonts/ofl/fonts/fontoldstandard28.c | 829 + third_party/fonts/ofl/fonts/fontoldstandard28b.c | 860 + third_party/fonts/ofl/fonts/fontoldstandard28i.c | 875 + third_party/fonts/ofl/fonts/fontoldstandard30.c | 882 + third_party/fonts/ofl/fonts/fontoldstandard30b.c | 909 + third_party/fonts/ofl/fonts/fontoldstandard30i.c | 940 + third_party/fonts/ofl/fonts/fontsansand14.c | 528 + third_party/fonts/ofl/fonts/fontsansand16.c | 571 + third_party/fonts/ofl/fonts/fontsansand18.c | 612 + third_party/fonts/ofl/fonts/fontsansand20.c | 644 + third_party/fonts/ofl/fonts/fontsansand22.c | 678 + third_party/fonts/ofl/fonts/fontsansand24.c | 708 + third_party/fonts/ofl/fonts/fontsansand26.c | 740 + third_party/fonts/ofl/fonts/fontsansand28.c | 787 + third_party/fonts/ofl/fonts/fontsansand30.c | 829 + third_party/fonts/ofl/fonts/fonttheanodidot14.c | 519 + third_party/fonts/ofl/fonts/fonttheanodidot16.c | 565 + third_party/fonts/ofl/fonts/fonttheanodidot18.c | 608 + third_party/fonts/ofl/fonts/fonttheanodidot20.c | 650 + third_party/fonts/ofl/fonts/fonttheanodidot22.c | 704 + third_party/fonts/ofl/fonts/fonttheanodidot24.c | 753 + third_party/fonts/ofl/fonts/fonttheanodidot26.c | 791 + third_party/fonts/ofl/fonts/fonttheanodidot28.c | 798 + third_party/fonts/ofl/fonts/fonttheanodidot30.c | 863 + third_party/fonts/ofl/fonts/fonttheanomodern14.c | 526 + third_party/fonts/ofl/fonts/fonttheanomodern16.c | 567 + third_party/fonts/ofl/fonts/fonttheanomodern18.c | 615 + third_party/fonts/ofl/fonts/fonttheanomodern20.c | 655 + third_party/fonts/ofl/fonts/fonttheanomodern22.c | 709 + third_party/fonts/ofl/fonts/fonttheanomodern24.c | 764 + third_party/fonts/ofl/fonts/fonttheanomodern26.c | 800 + third_party/fonts/ofl/fonts/fonttheanomodern28.c | 853 + third_party/fonts/ofl/fonts/fonttheanomodern30.c | 914 + third_party/fonts/ofl/fonts/fonttheanooldstyle14.c | 516 + third_party/fonts/ofl/fonts/fonttheanooldstyle16.c | 557 + third_party/fonts/ofl/fonts/fonttheanooldstyle18.c | 604 + third_party/fonts/ofl/fonts/fonttheanooldstyle20.c | 641 + third_party/fonts/ofl/fonts/fonttheanooldstyle22.c | 693 + third_party/fonts/ofl/fonts/fonttheanooldstyle24.c | 744 + third_party/fonts/ofl/fonts/fonttheanooldstyle26.c | 781 + third_party/fonts/ofl/fonts/fonttheanooldstyle28.c | 832 + third_party/fonts/ofl/fonts/fonttheanooldstyle30.c | 887 + third_party/fonts/ofl/ofl_fonts.h | 220 + third_party/fonts/ofl/readme.txt | 17 + third_party/fonts/ofl/ttf/AndBasR.ttf | Bin 0 -> 252523 bytes third_party/fonts/ofl/ttf/NanumMyeongjo.ttf | Bin 0 -> 3829294 bytes third_party/fonts/other/README | 183 + .../other/binfonts/fontsazanamigothic10x19.bin | Bin 0 -> 875360 bytes .../other/binfonts/fontsazanamigothic6x10.bin | Bin 0 -> 415880 bytes .../other/binfonts/fontsazanamigothic7x13.bin | Bin 0 -> 571408 bytes .../other/binfonts/fontsazanamigothic8x15.bin | Bin 0 -> 672216 bytes .../other/binfonts/fontsazanamigothic9x17.bin | Bin 0 -> 785020 bytes .../other/binfonts/fontsazanamimincho10x19.bin | Bin 0 -> 928264 bytes .../other/binfonts/fontsazanamimincho6x10.bin | Bin 0 -> 419492 bytes .../other/binfonts/fontsazanamimincho7x13.bin | Bin 0 -> 585208 bytes .../other/binfonts/fontsazanamimincho8x15.bin | Bin 0 -> 689552 bytes .../other/binfonts/fontsazanamimincho9x17.bin | Bin 0 -> 812344 bytes third_party/fonts/other/doc/ayu/README.txt | 19 + third_party/fonts/other/doc/kappa/README | 573 + third_party/fonts/other/doc/misaki/misakib8.txt | 99 + third_party/fonts/other/doc/mplus/LICENSE_J | 12 + third_party/fonts/other/doc/oradano/README.txt | 44 + third_party/fonts/other/doc/shinonome/LICENSE | 14 + .../fonts/other/fonts/fontsazanamigothic10x19.c | 1080 + .../fonts/other/fonts/fontsazanamigothic6x10.c | 719 + .../fonts/other/fonts/fontsazanamigothic7x13.c | 837 + .../fonts/other/fonts/fontsazanamigothic8x15.c | 905 + .../fonts/other/fonts/fontsazanamigothic9x17.c | 985 + .../fonts/other/fonts/fontsazanamimincho10x19.c | 1164 + .../fonts/other/fonts/fontsazanamimincho6x10.c | 720 + .../fonts/other/fonts/fontsazanamimincho7x13.c | 846 + .../fonts/other/fonts/fontsazanamimincho8x15.c | 935 + .../fonts/other/fonts/fontsazanamimincho9x17.c | 1014 + third_party/fonts/other/other_fonts.h | 48 + third_party/fonts/other/readme.txt | 5 + third_party/fonts/other/ttf/sazanami-gothic.ttf | Bin 0 -> 7772155 bytes third_party/fonts/readme.txt | 43 + third_party/lwip-1.4.1/CHANGELOG | 3349 ++ third_party/lwip-1.4.1/COPYING | 33 + third_party/lwip-1.4.1/FILES | 4 + third_party/lwip-1.4.1/README | 89 + third_party/lwip-1.4.1/UPGRADING | 144 + third_party/lwip-1.4.1/apps/httpserver_raw/fs.c | 177 + third_party/lwip-1.4.1/apps/httpserver_raw/fs.h | 100 + .../lwip-1.4.1/apps/httpserver_raw/fsdata.c | 287 + .../lwip-1.4.1/apps/httpserver_raw/fsdata.h | 50 + third_party/lwip-1.4.1/apps/httpserver_raw/httpd.c | 2184 ++ third_party/lwip-1.4.1/apps/httpserver_raw/httpd.h | 236 + .../lwip-1.4.1/apps/httpserver_raw/httpd_structs.h | 115 + third_party/lwip-1.4.1/doc/FILES | 6 + third_party/lwip-1.4.1/doc/contrib.txt | 63 + third_party/lwip-1.4.1/doc/rawapi.txt | 511 + third_party/lwip-1.4.1/doc/savannah.txt | 135 + third_party/lwip-1.4.1/doc/snmp_agent.txt | 181 + third_party/lwip-1.4.1/doc/sys_arch.txt | 267 + .../ports/tiva-tm4c129/include/arch/FILES | 6 + .../ports/tiva-tm4c129/include/arch/bpstruct.h | 36 + .../ports/tiva-tm4c129/include/arch/cc.h | 118 + .../ports/tiva-tm4c129/include/arch/epstruct.h | 36 + .../ports/tiva-tm4c129/include/arch/perf.h | 38 + .../ports/tiva-tm4c129/include/arch/sys_arch.h | 74 + .../ports/tiva-tm4c129/include/netif/FILES | 2 + .../ports/tiva-tm4c129/include/netif/tivaif.h | 58 + .../lwip-1.4.1/ports/tiva-tm4c129/netif/FILES | 1 + .../ports/tiva-tm4c129/netif/tiva-tm4c129.c | 1126 + third_party/lwip-1.4.1/ports/tiva-tm4c129/perf.c | 38 + .../lwip-1.4.1/ports/tiva-tm4c129/sys_arch.c | 631 + third_party/lwip-1.4.1/src/FILES | 13 + third_party/lwip-1.4.1/src/api/api_lib.c | 780 + third_party/lwip-1.4.1/src/api/api_msg.c | 1565 + third_party/lwip-1.4.1/src/api/err.c | 75 + third_party/lwip-1.4.1/src/api/netbuf.c | 245 + third_party/lwip-1.4.1/src/api/netdb.c | 353 + third_party/lwip-1.4.1/src/api/netifapi.c | 160 + third_party/lwip-1.4.1/src/api/sockets.c | 2374 ++ third_party/lwip-1.4.1/src/api/tcpip.c | 511 + third_party/lwip-1.4.1/src/core/def.c | 108 + third_party/lwip-1.4.1/src/core/dhcp.c | 1770 + third_party/lwip-1.4.1/src/core/dns.c | 970 + third_party/lwip-1.4.1/src/core/init.c | 332 + third_party/lwip-1.4.1/src/core/ipv4/autoip.c | 528 + third_party/lwip-1.4.1/src/core/ipv4/icmp.c | 339 + third_party/lwip-1.4.1/src/core/ipv4/igmp.c | 805 + third_party/lwip-1.4.1/src/core/ipv4/inet.c | 42 + third_party/lwip-1.4.1/src/core/ipv4/inet_chksum.c | 450 + third_party/lwip-1.4.1/src/core/ipv4/ip.c | 924 + third_party/lwip-1.4.1/src/core/ipv4/ip_addr.c | 312 + third_party/lwip-1.4.1/src/core/ipv4/ip_frag.c | 863 + third_party/lwip-1.4.1/src/core/ipv6/README | 1 + third_party/lwip-1.4.1/src/core/ipv6/icmp6.c | 179 + third_party/lwip-1.4.1/src/core/ipv6/inet6.c | 163 + third_party/lwip-1.4.1/src/core/ipv6/ip6.c | 397 + third_party/lwip-1.4.1/src/core/ipv6/ip6_addr.c | 72 + third_party/lwip-1.4.1/src/core/mem.c | 659 + third_party/lwip-1.4.1/src/core/memp.c | 470 + third_party/lwip-1.4.1/src/core/netif.c | 774 + third_party/lwip-1.4.1/src/core/pbuf.c | 1179 + third_party/lwip-1.4.1/src/core/raw.c | 350 + third_party/lwip-1.4.1/src/core/snmp/asn1_dec.c | 657 + third_party/lwip-1.4.1/src/core/snmp/asn1_enc.c | 611 + third_party/lwip-1.4.1/src/core/snmp/mib2.c | 4146 ++ third_party/lwip-1.4.1/src/core/snmp/mib_structs.c | 1174 + third_party/lwip-1.4.1/src/core/snmp/msg_in.c | 1453 + third_party/lwip-1.4.1/src/core/snmp/msg_out.c | 674 + third_party/lwip-1.4.1/src/core/stats.c | 176 + third_party/lwip-1.4.1/src/core/sys.c | 68 + third_party/lwip-1.4.1/src/core/tcp.c | 1742 + third_party/lwip-1.4.1/src/core/tcp_in.c | 1619 + third_party/lwip-1.4.1/src/core/tcp_out.c | 1485 + third_party/lwip-1.4.1/src/core/timers.c | 487 + third_party/lwip-1.4.1/src/core/udp.c | 1013 + .../lwip-1.4.1/src/include/ipv4/lwip/autoip.h | 118 + .../lwip-1.4.1/src/include/ipv4/lwip/icmp.h | 111 + .../lwip-1.4.1/src/include/ipv4/lwip/igmp.h | 106 + .../lwip-1.4.1/src/include/ipv4/lwip/inet.h | 107 + .../lwip-1.4.1/src/include/ipv4/lwip/inet_chksum.h | 90 + third_party/lwip-1.4.1/src/include/ipv4/lwip/ip.h | 223 + .../lwip-1.4.1/src/include/ipv4/lwip/ip_addr.h | 244 + .../lwip-1.4.1/src/include/ipv4/lwip/ip_frag.h | 88 + .../lwip-1.4.1/src/include/ipv6/lwip/icmp.h | 100 + .../lwip-1.4.1/src/include/ipv6/lwip/inet.h | 68 + third_party/lwip-1.4.1/src/include/ipv6/lwip/ip.h | 130 + .../lwip-1.4.1/src/include/ipv6/lwip/ip_addr.h | 97 + third_party/lwip-1.4.1/src/include/lwip/api.h | 297 + third_party/lwip-1.4.1/src/include/lwip/api_msg.h | 177 + third_party/lwip-1.4.1/src/include/lwip/arch.h | 217 + third_party/lwip-1.4.1/src/include/lwip/debug.h | 99 + third_party/lwip-1.4.1/src/include/lwip/def.h | 123 + third_party/lwip-1.4.1/src/include/lwip/dhcp.h | 242 + third_party/lwip-1.4.1/src/include/lwip/dns.h | 124 + third_party/lwip-1.4.1/src/include/lwip/err.h | 85 + third_party/lwip-1.4.1/src/include/lwip/init.h | 72 + third_party/lwip-1.4.1/src/include/lwip/mem.h | 123 + third_party/lwip-1.4.1/src/include/lwip/memp.h | 116 + third_party/lwip-1.4.1/src/include/lwip/memp_std.h | 122 + third_party/lwip-1.4.1/src/include/lwip/netbuf.h | 101 + third_party/lwip-1.4.1/src/include/lwip/netdb.h | 124 + third_party/lwip-1.4.1/src/include/lwip/netif.h | 328 + third_party/lwip-1.4.1/src/include/lwip/netifapi.h | 108 + third_party/lwip-1.4.1/src/include/lwip/opt.h | 2133 + third_party/lwip-1.4.1/src/include/lwip/pbuf.h | 186 + third_party/lwip-1.4.1/src/include/lwip/raw.h | 98 + third_party/lwip-1.4.1/src/include/lwip/sio.h | 141 + third_party/lwip-1.4.1/src/include/lwip/snmp.h | 367 + .../lwip-1.4.1/src/include/lwip/snmp_asn1.h | 101 + third_party/lwip-1.4.1/src/include/lwip/snmp_msg.h | 315 + .../lwip-1.4.1/src/include/lwip/snmp_structs.h | 268 + third_party/lwip-1.4.1/src/include/lwip/sockets.h | 379 + third_party/lwip-1.4.1/src/include/lwip/stats.h | 292 + third_party/lwip-1.4.1/src/include/lwip/sys.h | 337 + third_party/lwip-1.4.1/src/include/lwip/tcp.h | 379 + third_party/lwip-1.4.1/src/include/lwip/tcp_impl.h | 486 + third_party/lwip-1.4.1/src/include/lwip/tcpip.h | 167 + third_party/lwip-1.4.1/src/include/lwip/timers.h | 100 + third_party/lwip-1.4.1/src/include/lwip/udp.h | 171 + third_party/lwip-1.4.1/src/include/netif/etharp.h | 222 + third_party/lwip-1.4.1/src/include/netif/ppp_oe.h | 190 + third_party/lwip-1.4.1/src/include/netif/slipif.h | 81 + third_party/lwip-1.4.1/src/include/posix/netdb.h | 33 + .../lwip-1.4.1/src/include/posix/sys/socket.h | 33 + third_party/lwip-1.4.1/src/netif/FILES | 29 + third_party/lwip-1.4.1/src/netif/etharp.c | 1399 + third_party/lwip-1.4.1/src/netif/ethernetif.c | 317 + third_party/lwip-1.4.1/src/netif/ppp/auth.c | 1334 + third_party/lwip-1.4.1/src/netif/ppp/auth.h | 111 + third_party/lwip-1.4.1/src/netif/ppp/chap.c | 908 + third_party/lwip-1.4.1/src/netif/ppp/chap.h | 150 + third_party/lwip-1.4.1/src/netif/ppp/chpms.c | 396 + third_party/lwip-1.4.1/src/netif/ppp/chpms.h | 64 + third_party/lwip-1.4.1/src/netif/ppp/fsm.c | 890 + third_party/lwip-1.4.1/src/netif/ppp/fsm.h | 157 + third_party/lwip-1.4.1/src/netif/ppp/ipcp.c | 1411 + third_party/lwip-1.4.1/src/netif/ppp/ipcp.h | 106 + third_party/lwip-1.4.1/src/netif/ppp/lcp.c | 2066 + third_party/lwip-1.4.1/src/netif/ppp/lcp.h | 151 + third_party/lwip-1.4.1/src/netif/ppp/magic.c | 80 + third_party/lwip-1.4.1/src/netif/ppp/magic.h | 63 + third_party/lwip-1.4.1/src/netif/ppp/md5.c | 320 + third_party/lwip-1.4.1/src/netif/ppp/md5.h | 55 + third_party/lwip-1.4.1/src/netif/ppp/pap.c | 628 + third_party/lwip-1.4.1/src/netif/ppp/pap.h | 118 + third_party/lwip-1.4.1/src/netif/ppp/ppp.c | 2045 + third_party/lwip-1.4.1/src/netif/ppp/ppp.h | 201 + third_party/lwip-1.4.1/src/netif/ppp/ppp_impl.h | 363 + third_party/lwip-1.4.1/src/netif/ppp/ppp_oe.c | 1132 + third_party/lwip-1.4.1/src/netif/ppp/pppdebug.h | 73 + third_party/lwip-1.4.1/src/netif/ppp/randm.c | 249 + third_party/lwip-1.4.1/src/netif/ppp/randm.h | 81 + third_party/lwip-1.4.1/src/netif/ppp/vj.c | 652 + third_party/lwip-1.4.1/src/netif/ppp/vj.h | 156 + third_party/lwip-1.4.1/src/netif/slipif.c | 510 + third_party/lwip-1.4.1/test/unit/core/test_mem.c | 73 + third_party/lwip-1.4.1/test/unit/core/test_mem.h | 8 + .../lwip-1.4.1/test/unit/etharp/test_etharp.c | 262 + .../lwip-1.4.1/test/unit/etharp/test_etharp.h | 8 + third_party/lwip-1.4.1/test/unit/lwip_check.h | 37 + third_party/lwip-1.4.1/test/unit/lwip_unittests.c | 45 + third_party/lwip-1.4.1/test/unit/lwipopts.h | 50 + third_party/lwip-1.4.1/test/unit/tcp/tcp_helper.c | 294 + third_party/lwip-1.4.1/test/unit/tcp/tcp_helper.h | 52 + third_party/lwip-1.4.1/test/unit/tcp/test_tcp.c | 667 + third_party/lwip-1.4.1/test/unit/tcp/test_tcp.h | 8 + .../lwip-1.4.1/test/unit/tcp/test_tcp_oos.c | 944 + .../lwip-1.4.1/test/unit/tcp/test_tcp_oos.h | 8 + third_party/lwip-1.4.1/test/unit/udp/test_udp.c | 68 + third_party/lwip-1.4.1/test/unit/udp/test_udp.h | 8 + third_party/no_license.txt | 10 + third_party/ptpd-1.1.0/COPYRIGHT | 18 + third_party/ptpd-1.1.0/ChangeLog | 17 + third_party/ptpd-1.1.0/Makefile | 17 + third_party/ptpd-1.1.0/README | 37 + third_party/ptpd-1.1.0/RELEASE_NOTES | 148 + third_party/ptpd-1.1.0/doc/clock_servo.svg | 350 + third_party/ptpd-1.1.0/doc/data_paths.svg | 424 + third_party/ptpd-1.1.0/doc/doc.html | 210 + third_party/ptpd-1.1.0/doc/filter.svg | 483 + third_party/ptpd-1.1.0/doc/index.html | 125 + third_party/ptpd-1.1.0/doc/organization.svg | 189 + .../doc/ptpd_2005_1588_conference_paper.pdf | Bin 0 -> 323600 bytes third_party/ptpd-1.1.0/doc/stylesheet.css | 74 + third_party/ptpd-1.1.0/src/Doxyfile | 1511 + third_party/ptpd-1.1.0/src/Makefile | 35 + third_party/ptpd-1.1.0/src/arith.c | 113 + third_party/ptpd-1.1.0/src/bmc.c | 330 + third_party/ptpd-1.1.0/src/constants.h | 120 + third_party/ptpd-1.1.0/src/datatypes.h | 362 + .../ptpd-1.1.0/src/dep-tiva/constants_dep.h | 87 + .../ptpd-1.1.0/src/dep-tiva/datatypes_dep.h | 42 + third_party/ptpd-1.1.0/src/dep-tiva/ptpd_dep.h | 138 + third_party/ptpd-1.1.0/src/dep-tiva/ptpd_msg.c | 655 + third_party/ptpd-1.1.0/src/dep-tiva/ptpd_net.c | 401 + third_party/ptpd-1.1.0/src/dep-tiva/ptpd_servo.c | 179 + third_party/ptpd-1.1.0/src/dep-tiva/ptpd_timer.c | 75 + third_party/ptpd-1.1.0/src/dep/constants_dep.h | 99 + third_party/ptpd-1.1.0/src/dep/datatypes_dep.h | 37 + third_party/ptpd-1.1.0/src/dep/msg.c | 671 + third_party/ptpd-1.1.0/src/dep/net.c | 570 + third_party/ptpd-1.1.0/src/dep/ptpd_dep.h | 154 + third_party/ptpd-1.1.0/src/dep/servo.c | 215 + third_party/ptpd-1.1.0/src/dep/startup.c | 364 + third_party/ptpd-1.1.0/src/dep/sys.c | 282 + third_party/ptpd-1.1.0/src/dep/timer.c | 96 + third_party/ptpd-1.1.0/src/probe.c | 284 + third_party/ptpd-1.1.0/src/protocol.c | 865 + third_party/ptpd-1.1.0/src/ptpd.8 | 143 + third_party/ptpd-1.1.0/src/ptpd.c | 59 + third_party/ptpd-1.1.0/src/ptpd.h | 49 + third_party/ptpd-1.1.0/tools/filter_response.m | 29 + third_party/ptpd-1.1.0/tools/offset_stats.m | 102 + third_party/ptpd-1.1.0/tools/ptp_plot.py | 170 + third_party/ptpd-1.1.0/tools/quality_correlate.py | 190 + third_party/uip-1.0/README | 13 + third_party/uip-1.0/apps/README | 2 + third_party/uip-1.0/apps/dhcpc/Makefile.dhcpc | 1 + third_party/uip-1.0/apps/dhcpc/dhcpc.c | 358 + third_party/uip-1.0/apps/dhcpc/dhcpc.h | 68 + .../uip-1.0/apps/hello-world/Makefile.hello-world | 1 + third_party/uip-1.0/apps/hello-world/hello-world.c | 100 + third_party/uip-1.0/apps/hello-world/hello-world.h | 52 + third_party/uip-1.0/apps/httpd/httpd.c | 325 + third_party/uip-1.0/apps/httpd/httpd.h | 59 + third_party/uip-1.0/apps/resolv/Makefile.resolv | 1 + third_party/uip-1.0/apps/resolv/resolv.c | 464 + third_party/uip-1.0/apps/resolv/resolv.h | 75 + third_party/uip-1.0/apps/smtp/Makefile.smtp | 1 + third_party/uip-1.0/apps/smtp/makestrings | 40 + third_party/uip-1.0/apps/smtp/smtp-strings | 11 + third_party/uip-1.0/apps/smtp/smtp-strings.c | 70 + third_party/uip-1.0/apps/smtp/smtp-strings.h | 46 + third_party/uip-1.0/apps/smtp/smtp.c | 262 + third_party/uip-1.0/apps/smtp/smtp.h | 103 + third_party/uip-1.0/apps/telnetd/Makefile.telnetd | 1 + third_party/uip-1.0/apps/telnetd/shell.c | 123 + third_party/uip-1.0/apps/telnetd/shell.h | 104 + third_party/uip-1.0/apps/telnetd/telnetd.c | 350 + third_party/uip-1.0/apps/telnetd/telnetd.h | 63 + .../uip-1.0/apps/webclient/Makefile.webclient | 1 + third_party/uip-1.0/apps/webclient/makestrings | 40 + .../uip-1.0/apps/webclient/webclient-strings | 31 + .../uip-1.0/apps/webclient/webclient-strings.c | 93 + .../uip-1.0/apps/webclient/webclient-strings.h | 31 + third_party/uip-1.0/apps/webclient/webclient.c | 439 + third_party/uip-1.0/apps/webclient/webclient.h | 228 + .../uip-1.0/apps/webserver/Makefile.webserver | 1 + third_party/uip-1.0/apps/webserver/http-strings | 35 + third_party/uip-1.0/apps/webserver/http-strings.c | 102 + third_party/uip-1.0/apps/webserver/http-strings.h | 34 + third_party/uip-1.0/apps/webserver/httpd-cgi.c | 203 + third_party/uip-1.0/apps/webserver/httpd-cgi.h | 84 + third_party/uip-1.0/apps/webserver/httpd-fs.c | 132 + third_party/uip-1.0/apps/webserver/httpd-fs.h | 57 + .../uip-1.0/apps/webserver/httpd-fs/404.html | 8 + .../uip-1.0/apps/webserver/httpd-fs/fade.png | Bin 0 -> 196 bytes .../uip-1.0/apps/webserver/httpd-fs/files.shtml | 35 + .../uip-1.0/apps/webserver/httpd-fs/footer.html | 2 + .../uip-1.0/apps/webserver/httpd-fs/header.html | 18 + .../uip-1.0/apps/webserver/httpd-fs/index.html | 29 + .../apps/webserver/httpd-fs/processes.shtml | 5 + .../uip-1.0/apps/webserver/httpd-fs/stats.shtml | 31 + .../uip-1.0/apps/webserver/httpd-fs/style.css | 92 + .../uip-1.0/apps/webserver/httpd-fs/tcp.shtml | 5 + third_party/uip-1.0/apps/webserver/httpd-fsdata.c | 607 + third_party/uip-1.0/apps/webserver/httpd-fsdata.h | 64 + third_party/uip-1.0/apps/webserver/httpd.c | 338 + third_party/uip-1.0/apps/webserver/httpd.h | 62 + third_party/uip-1.0/apps/webserver/makefsdata | 78 + third_party/uip-1.0/apps/webserver/makestrings | 40 + third_party/uip-1.0/apps/webserver/webserver.h | 49 + third_party/uip-1.0/doc/Doxyfile | 279 + third_party/uip-1.0/doc/Makefile | 7 + third_party/uip-1.0/doc/README | 12 + third_party/uip-1.0/doc/doxygen.sty | 62 + .../uip-1.0/doc/example-mainloop-with-arp.c | 86 + .../uip-1.0/doc/example-mainloop-without-arp.c | 62 + third_party/uip-1.0/doc/examples.txt | 34 + third_party/uip-1.0/doc/header.tex | 53 + third_party/uip-1.0/doc/html/a00036.html | 120 + third_party/uip-1.0/doc/html/a00037.html | 72 + third_party/uip-1.0/doc/html/a00038.html | 282 + third_party/uip-1.0/doc/html/a00039.html | 123 + third_party/uip-1.0/doc/html/a00040.html | 459 + third_party/uip-1.0/doc/html/a00041.html | 248 + third_party/uip-1.0/doc/html/a00042.html | 106 + third_party/uip-1.0/doc/html/a00043.html | 82 + third_party/uip-1.0/doc/html/a00044.html | 370 + third_party/uip-1.0/doc/html/a00045.html | 83 + third_party/uip-1.0/doc/html/a00046.html | 484 + third_party/uip-1.0/doc/html/a00047.html | 95 + third_party/uip-1.0/doc/html/a00048.html | 376 + third_party/uip-1.0/doc/html/a00049.html | 88 + third_party/uip-1.0/doc/html/a00050.html | 177 + third_party/uip-1.0/doc/html/a00051.html | 138 + third_party/uip-1.0/doc/html/a00077.html | 78 + third_party/uip-1.0/doc/html/a00078.html | 51 + third_party/uip-1.0/doc/html/a00079.html | 45 + third_party/uip-1.0/doc/html/a00080.html | 69 + third_party/uip-1.0/doc/html/a00081.html | 51 + third_party/uip-1.0/doc/html/a00082.html | 73 + third_party/uip-1.0/doc/html/a00083.html | 45 + third_party/uip-1.0/doc/html/a00084.html | 45 + third_party/uip-1.0/doc/html/a00085.html | 69 + third_party/uip-1.0/doc/html/a00086.html | 54 + third_party/uip-1.0/doc/html/a00087.html | 52 + third_party/uip-1.0/doc/html/a00088.html | 103 + third_party/uip-1.0/doc/html/a00089.html | 44 + third_party/uip-1.0/doc/html/a00090.html | 50 + third_party/uip-1.0/doc/html/a00091.html | 84 + third_party/uip-1.0/doc/html/a00092.html | 39 + third_party/uip-1.0/doc/html/a00093.html | 143 + third_party/uip-1.0/doc/html/a00094.html | 99 + third_party/uip-1.0/doc/html/a00095.html | 64 + third_party/uip-1.0/doc/html/a00096.html | 81 + third_party/uip-1.0/doc/html/a00097.html | 75 + third_party/uip-1.0/doc/html/a00100.html | 48 + third_party/uip-1.0/doc/html/a00101.html | 54 + third_party/uip-1.0/doc/html/a00102.html | 119 + third_party/uip-1.0/doc/html/a00103.html | 84 + third_party/uip-1.0/doc/html/a00104.html | 78 + third_party/uip-1.0/doc/html/a00105.html | 82 + third_party/uip-1.0/doc/html/a00107.html | 268 + third_party/uip-1.0/doc/html/a00110.html | 107 + third_party/uip-1.0/doc/html/a00111.html | 96 + third_party/uip-1.0/doc/html/a00112.html | 49 + third_party/uip-1.0/doc/html/a00113.html | 51 + third_party/uip-1.0/doc/html/a00114.html | 79 + third_party/uip-1.0/doc/html/a00120.html | 50 + third_party/uip-1.0/doc/html/a00121.html | 61 + third_party/uip-1.0/doc/html/a00123.html | 57 + third_party/uip-1.0/doc/html/a00124.html | 59 + third_party/uip-1.0/doc/html/a00125.html | 39 + third_party/uip-1.0/doc/html/a00127.html | 99 + third_party/uip-1.0/doc/html/a00128.html | 101 + third_party/uip-1.0/doc/html/a00129.html | 53 + third_party/uip-1.0/doc/html/a00130.html | 56 + third_party/uip-1.0/doc/html/a00131.html | 63 + third_party/uip-1.0/doc/html/a00132.html | 58 + third_party/uip-1.0/doc/html/a00134.html | 42 + third_party/uip-1.0/doc/html/a00135.html | 215 + third_party/uip-1.0/doc/html/a00136.html | 400 + third_party/uip-1.0/doc/html/a00137.html | 52 + third_party/uip-1.0/doc/html/a00138.html | 70 + third_party/uip-1.0/doc/html/a00139.html | 77 + third_party/uip-1.0/doc/html/a00140.html | 143 + third_party/uip-1.0/doc/html/a00141.html | 83 + third_party/uip-1.0/doc/html/a00142.html | 690 + third_party/uip-1.0/doc/html/a00143.html | 54 + third_party/uip-1.0/doc/html/a00144.html | 328 + third_party/uip-1.0/doc/html/a00145.html | 106 + third_party/uip-1.0/doc/html/a00146.html | 383 + third_party/uip-1.0/doc/html/a00147.html | 1046 + third_party/uip-1.0/doc/html/a00148.html | 634 + third_party/uip-1.0/doc/html/a00149.html | 68 + third_party/uip-1.0/doc/html/a00150.html | 1248 + third_party/uip-1.0/doc/html/a00151.html | 221 + third_party/uip-1.0/doc/html/a00152.html | 205 + third_party/uip-1.0/doc/html/a00153.html | 1059 + third_party/uip-1.0/doc/html/a00154.html | 79 + third_party/uip-1.0/doc/html/a00155.html | 82 + third_party/uip-1.0/doc/html/a00156.html | 237 + third_party/uip-1.0/doc/html/a00157.html | 108 + third_party/uip-1.0/doc/html/a00158.html | 693 + third_party/uip-1.0/doc/html/a00159.html | 251 + third_party/uip-1.0/doc/html/a00160.html | 284 + third_party/uip-1.0/doc/html/a00161.html | 257 + third_party/uip-1.0/doc/html/a00162.html | 56 + third_party/uip-1.0/doc/html/a00163.html | 533 + third_party/uip-1.0/doc/html/a00164.html | 172 + third_party/uip-1.0/doc/html/a00168.html | 381 + third_party/uip-1.0/doc/html/a00169.html | 93 + third_party/uip-1.0/doc/html/a00170.html | 125 + third_party/uip-1.0/doc/html/a00171.html | 77 + third_party/uip-1.0/doc/html/a00172.html | 489 + third_party/uip-1.0/doc/html/a00173.html | 100 + third_party/uip-1.0/doc/html/a00174.html | 287 + third_party/uip-1.0/doc/html/a00175.html | 128 + third_party/uip-1.0/doc/html/a00176.html | 148 + third_party/uip-1.0/doc/html/a00177.html | 129 + third_party/uip-1.0/doc/html/a00178.html | 375 + third_party/uip-1.0/doc/html/a00179.html | 88 + third_party/uip-1.0/doc/html/a00180.html | 464 + third_party/uip-1.0/doc/html/a00181.html | 253 + third_party/uip-1.0/doc/html/a00182.html | 228 + third_party/uip-1.0/doc/html/a00183.html | 109 + third_party/uip-1.0/doc/html/a00184.html | 363 + third_party/uip-1.0/doc/html/a00185.html | 87 + third_party/uip-1.0/doc/html/a00186.html | 129 + third_party/uip-1.0/doc/html/a00187.html | 167 + third_party/uip-1.0/doc/html/a00188.html | 113 + third_party/uip-1.0/doc/html/a00189.html | 108 + third_party/uip-1.0/doc/html/a00190.html | 101 + third_party/uip-1.0/doc/html/a00191.html | 156 + third_party/uip-1.0/doc/html/a00192.html | 363 + third_party/uip-1.0/doc/html/a00193.html | 405 + third_party/uip-1.0/doc/html/a00194.html | 348 + third_party/uip-1.0/doc/html/a00195.html | 152 + third_party/uip-1.0/doc/html/a00196.html | 111 + third_party/uip-1.0/doc/html/a00197.html | 183 + third_party/uip-1.0/doc/html/a00198.html | 86 + third_party/uip-1.0/doc/html/a00199.html | 161 + third_party/uip-1.0/doc/html/a00200.html | 121 + third_party/uip-1.0/doc/html/a00201.html | 1922 + third_party/uip-1.0/doc/html/a00202.html | 1626 + third_party/uip-1.0/doc/html/a00203.html | 163 + third_party/uip-1.0/doc/html/a00204.html | 448 + third_party/uip-1.0/doc/html/a00205.html | 169 + third_party/uip-1.0/doc/html/a00206.html | 564 + third_party/uip-1.0/doc/html/a00207.html | 182 + third_party/uip-1.0/doc/html/annotated.html | 50 + third_party/uip-1.0/doc/html/classes.html | 38 + third_party/uip-1.0/doc/html/doxygen.css | 310 + third_party/uip-1.0/doc/html/doxygen.png | Bin 0 -> 1281 bytes third_party/uip-1.0/doc/html/examples.html | 38 + third_party/uip-1.0/doc/html/files.html | 67 + third_party/uip-1.0/doc/html/ftv2blank.png | Bin 0 -> 174 bytes third_party/uip-1.0/doc/html/ftv2doc.png | Bin 0 -> 255 bytes third_party/uip-1.0/doc/html/ftv2folderclosed.png | Bin 0 -> 259 bytes third_party/uip-1.0/doc/html/ftv2folderopen.png | Bin 0 -> 261 bytes third_party/uip-1.0/doc/html/ftv2lastnode.png | Bin 0 -> 233 bytes third_party/uip-1.0/doc/html/ftv2link.png | Bin 0 -> 358 bytes third_party/uip-1.0/doc/html/ftv2mlastnode.png | Bin 0 -> 160 bytes third_party/uip-1.0/doc/html/ftv2mnode.png | Bin 0 -> 194 bytes third_party/uip-1.0/doc/html/ftv2node.png | Bin 0 -> 235 bytes third_party/uip-1.0/doc/html/ftv2plastnode.png | Bin 0 -> 165 bytes third_party/uip-1.0/doc/html/ftv2pnode.png | Bin 0 -> 200 bytes third_party/uip-1.0/doc/html/ftv2vertline.png | Bin 0 -> 229 bytes third_party/uip-1.0/doc/html/functions.html | 217 + third_party/uip-1.0/doc/html/functions_vars.html | 217 + third_party/uip-1.0/doc/html/globals.html | 62 + third_party/uip-1.0/doc/html/globals_0x61.html | 64 + third_party/uip-1.0/doc/html/globals_0x62.html | 62 + third_party/uip-1.0/doc/html/globals_0x64.html | 73 + third_party/uip-1.0/doc/html/globals_0x65.html | 62 + third_party/uip-1.0/doc/html/globals_0x66.html | 62 + third_party/uip-1.0/doc/html/globals_0x68.html | 73 + third_party/uip-1.0/doc/html/globals_0x69.html | 84 + third_party/uip-1.0/doc/html/globals_0x6c.html | 66 + third_party/uip-1.0/doc/html/globals_0x6d.html | 69 + third_party/uip-1.0/doc/html/globals_0x6e.html | 63 + third_party/uip-1.0/doc/html/globals_0x70.html | 95 + third_party/uip-1.0/doc/html/globals_0x72.html | 69 + third_party/uip-1.0/doc/html/globals_0x73.html | 81 + third_party/uip-1.0/doc/html/globals_0x74.html | 76 + third_party/uip-1.0/doc/html/globals_0x75.html | 237 + third_party/uip-1.0/doc/html/globals_0x77.html | 80 + third_party/uip-1.0/doc/html/globals_defs.html | 62 + .../uip-1.0/doc/html/globals_defs_0x61.html | 64 + .../uip-1.0/doc/html/globals_defs_0x62.html | 62 + .../uip-1.0/doc/html/globals_defs_0x64.html | 73 + .../uip-1.0/doc/html/globals_defs_0x65.html | 62 + .../uip-1.0/doc/html/globals_defs_0x66.html | 62 + .../uip-1.0/doc/html/globals_defs_0x68.html | 67 + .../uip-1.0/doc/html/globals_defs_0x69.html | 84 + .../uip-1.0/doc/html/globals_defs_0x6c.html | 65 + .../uip-1.0/doc/html/globals_defs_0x6d.html | 66 + .../uip-1.0/doc/html/globals_defs_0x6e.html | 63 + .../uip-1.0/doc/html/globals_defs_0x70.html | 93 + .../uip-1.0/doc/html/globals_defs_0x72.html | 62 + .../uip-1.0/doc/html/globals_defs_0x73.html | 70 + .../uip-1.0/doc/html/globals_defs_0x74.html | 72 + .../uip-1.0/doc/html/globals_defs_0x75.html | 188 + .../uip-1.0/doc/html/globals_defs_0x77.html | 67 + third_party/uip-1.0/doc/html/globals_func.html | 136 + third_party/uip-1.0/doc/html/globals_type.html | 47 + third_party/uip-1.0/doc/html/globals_vars.html | 55 + third_party/uip-1.0/doc/html/hierarchy.html | 50 + third_party/uip-1.0/doc/html/index.hhc | 192 + third_party/uip-1.0/doc/html/index.hhk | 450 + third_party/uip-1.0/doc/html/index.hhp | 197 + third_party/uip-1.0/doc/html/index.html | 8 + third_party/uip-1.0/doc/html/main.html | 421 + third_party/uip-1.0/doc/html/modules.html | 51 + third_party/uip-1.0/doc/html/tab_b.gif | Bin 0 -> 35 bytes third_party/uip-1.0/doc/html/tab_l.gif | Bin 0 -> 706 bytes third_party/uip-1.0/doc/html/tab_r.gif | Bin 0 -> 2585 bytes third_party/uip-1.0/doc/html/tabs.css | 102 + third_party/uip-1.0/doc/html/tree.html | 223 + third_party/uip-1.0/doc/mobisys2003.pdf | Bin 0 -> 87513 bytes third_party/uip-1.0/doc/pt-doc.txt | 173 + third_party/uip-1.0/doc/sicslogo.pdf | Bin 0 -> 4547 bytes third_party/uip-1.0/doc/uip-code-style.c | 118 + third_party/uip-1.0/doc/uip-code-style.txt | 3 + third_party/uip-1.0/doc/uip-doc.txt | 1180 + third_party/uip-1.0/doc/uip-refman.pdf | 39280 +++++++++++++++++++ third_party/uip-1.0/lib/memb.c | 104 + third_party/uip-1.0/lib/memb.h | 142 + third_party/uip-1.0/uip-1.0-changelog.txt | 98 + third_party/uip-1.0/uip/Makefile.include | 47 + third_party/uip-1.0/uip/clock.h | 88 + third_party/uip-1.0/uip/lc-addrlabels.h | 83 + third_party/uip-1.0/uip/lc-switch.h | 76 + third_party/uip-1.0/uip/lc.h | 131 + third_party/uip-1.0/uip/psock.c | 338 + third_party/uip-1.0/uip/psock.h | 380 + third_party/uip-1.0/uip/pt.h | 323 + third_party/uip-1.0/uip/uip-fw.c | 534 + third_party/uip-1.0/uip/uip-fw.h | 176 + third_party/uip-1.0/uip/uip-neighbor.c | 158 + third_party/uip-1.0/uip/uip-neighbor.h | 61 + third_party/uip-1.0/uip/uip-split.c | 136 + third_party/uip-1.0/uip/uip-split.h | 96 + third_party/uip-1.0/uip/uip.c | 1942 + third_party/uip-1.0/uip/uip.h | 1611 + third_party/uip-1.0/uip/uip_arch.h | 138 + third_party/uip-1.0/uip/uip_arp.c | 423 + third_party/uip-1.0/uip/uip_arp.h | 144 + third_party/uip-1.0/uip/uip_timer.c | 127 + third_party/uip-1.0/uip/uip_timer.h | 86 + third_party/uip-1.0/uip/uiplib.c | 74 + third_party/uip-1.0/uip/uiplib.h | 71 + third_party/uip-1.0/uip/uipopt.h | 550 + third_party/uip-1.0/unix/Makefile | 44 + third_party/uip-1.0/unix/clock-arch.c | 55 + third_party/uip-1.0/unix/clock-arch.h | 40 + third_party/uip-1.0/unix/main.c | 218 + third_party/uip-1.0/unix/tapdev.c | 152 + third_party/uip-1.0/unix/tapdev.h | 45 + third_party/uip-1.0/unix/uip-conf.h | 157 + third_party/windows/fltk-1.1.10/ANNOUNCEMENT | 83 + third_party/windows/fltk-1.1.10/CHANGES | 3454 ++ .../CMake/CheckFunctionWithHeaderExists.cmake | 54 + .../windows/fltk-1.1.10/CMake/FLTKConfig.cmake.in | 37 + .../windows/fltk-1.1.10/CMake/FLTKUse.cmake | 68 + .../windows/fltk-1.1.10/CMake/PlatformTests.cxx | 81 + third_party/windows/fltk-1.1.10/CMakeLists.txt | 410 + third_party/windows/fltk-1.1.10/COPYING | 528 + third_party/windows/fltk-1.1.10/CREDITS | 54 + third_party/windows/fltk-1.1.10/DartConfig.cmake | 38 + third_party/windows/fltk-1.1.10/FL/Enumerations.H | 456 + third_party/windows/fltk-1.1.10/FL/Fl.H | 293 + third_party/windows/fltk-1.1.10/FL/Fl_Adjuster.H | 55 + third_party/windows/fltk-1.1.10/FL/Fl_BMP_Image.H | 43 + third_party/windows/fltk-1.1.10/FL/Fl_Bitmap.H | 64 + third_party/windows/fltk-1.1.10/FL/Fl_Box.H | 51 + third_party/windows/fltk-1.1.10/FL/Fl_Browser.H | 132 + third_party/windows/fltk-1.1.10/FL/Fl_Browser_.H | 154 + third_party/windows/fltk-1.1.10/FL/Fl_Button.H | 78 + third_party/windows/fltk-1.1.10/FL/Fl_Chart.H | 93 + .../windows/fltk-1.1.10/FL/Fl_Check_Browser.H | 103 + .../windows/fltk-1.1.10/FL/Fl_Check_Button.H | 42 + third_party/windows/fltk-1.1.10/FL/Fl_Choice.H | 48 + third_party/windows/fltk-1.1.10/FL/Fl_Clock.H | 75 + .../windows/fltk-1.1.10/FL/Fl_Color_Chooser.H | 104 + third_party/windows/fltk-1.1.10/FL/Fl_Counter.H | 76 + third_party/windows/fltk-1.1.10/FL/Fl_Dial.H | 67 + .../windows/fltk-1.1.10/FL/Fl_Double_Window.H | 54 + third_party/windows/fltk-1.1.10/FL/Fl_Export.H | 49 + .../windows/fltk-1.1.10/FL/Fl_File_Browser.H | 81 + .../windows/fltk-1.1.10/FL/Fl_File_Chooser.H | 187 + third_party/windows/fltk-1.1.10/FL/Fl_File_Icon.H | 115 + third_party/windows/fltk-1.1.10/FL/Fl_File_Input.H | 68 + third_party/windows/fltk-1.1.10/FL/Fl_Fill_Dial.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Fill_Slider.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Float_Input.H | 43 + .../windows/fltk-1.1.10/FL/Fl_FormsBitmap.H | 48 + .../windows/fltk-1.1.10/FL/Fl_FormsPixmap.H | 48 + third_party/windows/fltk-1.1.10/FL/Fl_Free.H | 66 + third_party/windows/fltk-1.1.10/FL/Fl_GIF_Image.H | 43 + third_party/windows/fltk-1.1.10/FL/Fl_Gl_Window.H | 99 + third_party/windows/fltk-1.1.10/FL/Fl_Group.H | 111 + .../windows/fltk-1.1.10/FL/Fl_Help_Dialog.H | 92 + third_party/windows/fltk-1.1.10/FL/Fl_Help_View.H | 221 + .../windows/fltk-1.1.10/FL/Fl_Hold_Browser.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Hor_Fill_Slider.H | 42 + .../windows/fltk-1.1.10/FL/Fl_Hor_Nice_Slider.H | 43 + third_party/windows/fltk-1.1.10/FL/Fl_Hor_Slider.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Hor_Value_Slider.H | 43 + third_party/windows/fltk-1.1.10/FL/Fl_Image.H | 112 + third_party/windows/fltk-1.1.10/FL/Fl_Input.H | 47 + third_party/windows/fltk-1.1.10/FL/Fl_Input_.H | 145 + .../windows/fltk-1.1.10/FL/Fl_Input_Choice.H | 199 + third_party/windows/fltk-1.1.10/FL/Fl_Int_Input.H | 43 + third_party/windows/fltk-1.1.10/FL/Fl_JPEG_Image.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Light_Button.H | 45 + third_party/windows/fltk-1.1.10/FL/Fl_Line_Dial.H | 43 + third_party/windows/fltk-1.1.10/FL/Fl_Menu.H | 33 + third_party/windows/fltk-1.1.10/FL/Fl_Menu_.H | 102 + third_party/windows/fltk-1.1.10/FL/Fl_Menu_Bar.H | 46 + .../windows/fltk-1.1.10/FL/Fl_Menu_Button.H | 48 + third_party/windows/fltk-1.1.10/FL/Fl_Menu_Item.H | 167 + .../windows/fltk-1.1.10/FL/Fl_Menu_Window.H | 54 + .../windows/fltk-1.1.10/FL/Fl_Multi_Browser.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Multi_Label.H | 47 + .../windows/fltk-1.1.10/FL/Fl_Multiline_Input.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Multiline_Output.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Nice_Slider.H | 42 + third_party/windows/fltk-1.1.10/FL/Fl_Object.H | 36 + third_party/windows/fltk-1.1.10/FL/Fl_Output.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Overlay_Window.H | 56 + third_party/windows/fltk-1.1.10/FL/Fl_PNG_Image.H | 43 + third_party/windows/fltk-1.1.10/FL/Fl_PNM_Image.H | 43 + third_party/windows/fltk-1.1.10/FL/Fl_Pack.H | 51 + third_party/windows/fltk-1.1.10/FL/Fl_Pixmap.H | 80 + third_party/windows/fltk-1.1.10/FL/Fl_Positioner.H | 77 + .../windows/fltk-1.1.10/FL/Fl_Preferences.H | 171 + third_party/windows/fltk-1.1.10/FL/Fl_Progress.H | 70 + third_party/windows/fltk-1.1.10/FL/Fl_RGB_Image.H | 35 + .../windows/fltk-1.1.10/FL/Fl_Radio_Button.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Radio_Light_Button.H | 42 + .../windows/fltk-1.1.10/FL/Fl_Radio_Round_Button.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Repeat_Button.H | 49 + .../windows/fltk-1.1.10/FL/Fl_Return_Button.H | 45 + third_party/windows/fltk-1.1.10/FL/Fl_Roller.H | 47 + .../windows/fltk-1.1.10/FL/Fl_Round_Button.H | 42 + .../windows/fltk-1.1.10/FL/Fl_Round_Clock.H | 43 + third_party/windows/fltk-1.1.10/FL/Fl_Scroll.H | 79 + third_party/windows/fltk-1.1.10/FL/Fl_Scrollbar.H | 61 + .../windows/fltk-1.1.10/FL/Fl_Secret_Input.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Select_Browser.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Shared_Image.H | 99 + .../windows/fltk-1.1.10/FL/Fl_Simple_Counter.H | 43 + .../windows/fltk-1.1.10/FL/Fl_Single_Window.H | 49 + third_party/windows/fltk-1.1.10/FL/Fl_Slider.H | 75 + third_party/windows/fltk-1.1.10/FL/Fl_Spinner.H | 224 + .../windows/fltk-1.1.10/FL/Fl_Sys_Menu_Bar.H | 56 + third_party/windows/fltk-1.1.10/FL/Fl_Tabs.H | 57 + .../windows/fltk-1.1.10/FL/Fl_Text_Buffer.H | 263 + .../windows/fltk-1.1.10/FL/Fl_Text_Display.H | 298 + .../windows/fltk-1.1.10/FL/Fl_Text_Editor.H | 110 + third_party/windows/fltk-1.1.10/FL/Fl_Tile.H | 45 + .../windows/fltk-1.1.10/FL/Fl_Tiled_Image.H | 59 + third_party/windows/fltk-1.1.10/FL/Fl_Timer.H | 65 + .../windows/fltk-1.1.10/FL/Fl_Toggle_Button.H | 43 + .../fltk-1.1.10/FL/Fl_Toggle_Light_Button.H | 37 + .../fltk-1.1.10/FL/Fl_Toggle_Round_Button.H | 37 + third_party/windows/fltk-1.1.10/FL/Fl_Tooltip.H | 77 + third_party/windows/fltk-1.1.10/FL/Fl_Valuator.H | 86 + .../windows/fltk-1.1.10/FL/Fl_Value_Input.H | 65 + .../windows/fltk-1.1.10/FL/Fl_Value_Output.H | 58 + .../windows/fltk-1.1.10/FL/Fl_Value_Slider.H | 52 + third_party/windows/fltk-1.1.10/FL/Fl_Widget.H | 221 + third_party/windows/fltk-1.1.10/FL/Fl_Window.H | 135 + third_party/windows/fltk-1.1.10/FL/Fl_Wizard.H | 62 + third_party/windows/fltk-1.1.10/FL/Fl_XBM_Image.H | 43 + third_party/windows/fltk-1.1.10/FL/Fl_XPM_Image.H | 43 + third_party/windows/fltk-1.1.10/FL/Makefile.in | 63 + third_party/windows/fltk-1.1.10/FL/dirent.h | 33 + third_party/windows/fltk-1.1.10/FL/filename.H | 156 + third_party/windows/fltk-1.1.10/FL/fl_ask.H | 81 + third_party/windows/fltk-1.1.10/FL/fl_draw.H | 207 + third_party/windows/fltk-1.1.10/FL/fl_message.H | 32 + .../windows/fltk-1.1.10/FL/fl_show_colormap.H | 37 + third_party/windows/fltk-1.1.10/FL/fl_show_input.H | 32 + third_party/windows/fltk-1.1.10/FL/forms.H | 844 + third_party/windows/fltk-1.1.10/FL/gl.h | 87 + third_party/windows/fltk-1.1.10/FL/gl2opengl.h | 35 + third_party/windows/fltk-1.1.10/FL/gl_draw.H | 35 + third_party/windows/fltk-1.1.10/FL/glu.h | 60 + third_party/windows/fltk-1.1.10/FL/glut.H | 487 + third_party/windows/fltk-1.1.10/FL/mac.H | 136 + third_party/windows/fltk-1.1.10/FL/mac.r | 13 + third_party/windows/fltk-1.1.10/FL/math.h | 72 + third_party/windows/fltk-1.1.10/FL/names.h | 85 + third_party/windows/fltk-1.1.10/FL/win32.H | 152 + third_party/windows/fltk-1.1.10/FL/x.H | 148 + third_party/windows/fltk-1.1.10/Makefile | 127 + third_party/windows/fltk-1.1.10/README | 197 + third_party/windows/fltk-1.1.10/README.mac | 87 + third_party/windows/fltk-1.1.10/README.win32 | 191 + .../windows/fltk-1.1.10/autom4te.cache/output.0 | 9045 +++++ .../windows/fltk-1.1.10/autom4te.cache/requests | 67 + .../windows/fltk-1.1.10/autom4te.cache/traces.0 | 722 + third_party/windows/fltk-1.1.10/borlandc/README | 43 + third_party/windows/fltk-1.1.10/borlandc/arc.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/arc.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/arc.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/ask.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/ask.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/ask.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/bitmap.bpf | 3 + .../windows/fltk-1.1.10/borlandc/bitmap.bpr | 139 + .../windows/fltk-1.1.10/borlandc/bitmap.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/boxtype.bpf | 3 + .../windows/fltk-1.1.10/borlandc/boxtype.bpr | 139 + .../windows/fltk-1.1.10/borlandc/boxtype.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/browser.bpf | 3 + .../windows/fltk-1.1.10/borlandc/browser.bpr | 140 + .../windows/fltk-1.1.10/borlandc/browser.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/button.bpf | 3 + .../windows/fltk-1.1.10/borlandc/button.bpr | 139 + .../windows/fltk-1.1.10/borlandc/button.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/buttons.bpf | 3 + .../windows/fltk-1.1.10/borlandc/buttons.bpr | 139 + .../windows/fltk-1.1.10/borlandc/buttons.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/checkers.bpf | 3 + .../windows/fltk-1.1.10/borlandc/checkers.bpr | 139 + .../windows/fltk-1.1.10/borlandc/checkers.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/clock.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/clock.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/clock.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/colbrowser.bpf | 3 + .../windows/fltk-1.1.10/borlandc/colbrowser.bpr | 139 + .../windows/fltk-1.1.10/borlandc/colbrowser.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/color_chooser.bpf | 3 + .../windows/fltk-1.1.10/borlandc/color_chooser.bpr | 139 + .../windows/fltk-1.1.10/borlandc/color_chooser.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/config.h | 229 + third_party/windows/fltk-1.1.10/borlandc/cube.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/cube.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/cube.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/cursor.bpf | 3 + .../windows/fltk-1.1.10/borlandc/cursor.bpr | 139 + .../windows/fltk-1.1.10/borlandc/cursor.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/curve.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/curve.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/curve.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/demo.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/demo.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/demo.menu | 87 + third_party/windows/fltk-1.1.10/borlandc/demo.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/doublebuffer.bpf | 3 + .../windows/fltk-1.1.10/borlandc/doublebuffer.bpr | 139 + .../windows/fltk-1.1.10/borlandc/doublebuffer.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/editor.bpf | 3 + .../windows/fltk-1.1.10/borlandc/editor.bpr | 139 + .../windows/fltk-1.1.10/borlandc/editor.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/file_chooser.bpf | 3 + .../windows/fltk-1.1.10/borlandc/file_chooser.bpr | 139 + .../windows/fltk-1.1.10/borlandc/file_chooser.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/fltk.bpf | 9 + third_party/windows/fltk-1.1.10/borlandc/fltk.bpg | 216 + third_party/windows/fltk-1.1.10/borlandc/fltk.bpr | 303 + third_party/windows/fltk-1.1.10/borlandc/fltk.dsk | 441 + .../fltk-1.1.10/borlandc/fltk_app_template.bpf | 3 + .../fltk-1.1.10/borlandc/fltk_app_template.bpr | 139 + .../fltk-1.1.10/borlandc/fltk_app_template.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/fltklib.bpf | 9 + .../windows/fltk-1.1.10/borlandc/fltklib.bpr | 344 + third_party/windows/fltk-1.1.10/borlandc/fluid.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/fluid.bpr | 159 + third_party/windows/fltk-1.1.10/borlandc/fluid.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/fonts.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/fonts.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/fonts.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/forms.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/forms.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/forms.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/fractals.bpf | 3 + .../windows/fltk-1.1.10/borlandc/fractals.bpr | 140 + .../windows/fltk-1.1.10/borlandc/fractals.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/fullscreen.bpf | 3 + .../windows/fltk-1.1.10/borlandc/fullscreen.bpr | 139 + .../windows/fltk-1.1.10/borlandc/fullscreen.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/hello.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/hello.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/hello.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/help.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/help.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/help.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/iconize.bpf | 3 + .../windows/fltk-1.1.10/borlandc/iconize.bpr | 139 + .../windows/fltk-1.1.10/borlandc/iconize.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/image.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/image.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/image.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/input.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/input.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/input.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/keyboard.bpf | 3 + .../windows/fltk-1.1.10/borlandc/keyboard.bpr | 139 + .../windows/fltk-1.1.10/borlandc/keyboard.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/label.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/label.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/label.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/line_style.bpf | 3 + .../windows/fltk-1.1.10/borlandc/line_style.bpr | 139 + .../windows/fltk-1.1.10/borlandc/line_style.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/menubar.bpf | 3 + .../windows/fltk-1.1.10/borlandc/menubar.bpr | 139 + .../windows/fltk-1.1.10/borlandc/menubar.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/message.bpf | 3 + .../windows/fltk-1.1.10/borlandc/message.bpr | 139 + .../windows/fltk-1.1.10/borlandc/message.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/minimum.bpf | 3 + .../windows/fltk-1.1.10/borlandc/minimum.bpr | 139 + .../windows/fltk-1.1.10/borlandc/minimum.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/navigation.bpf | 3 + .../windows/fltk-1.1.10/borlandc/navigation.bpr | 139 + .../windows/fltk-1.1.10/borlandc/navigation.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/output.bpf | 3 + .../windows/fltk-1.1.10/borlandc/output.bpr | 139 + .../windows/fltk-1.1.10/borlandc/output.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/overlay.bpf | 3 + .../windows/fltk-1.1.10/borlandc/overlay.bpr | 139 + .../windows/fltk-1.1.10/borlandc/overlay.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/pack.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/pack.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/pack.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/pixmap.bpf | 3 + .../windows/fltk-1.1.10/borlandc/pixmap.bpr | 139 + .../windows/fltk-1.1.10/borlandc/pixmap.res | Bin 0 -> 876 bytes .../fltk-1.1.10/borlandc/pixmap_browser.bpf | 3 + .../fltk-1.1.10/borlandc/pixmap_browser.bpr | 139 + .../fltk-1.1.10/borlandc/pixmap_browser.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/resizebox.bpf | 3 + .../windows/fltk-1.1.10/borlandc/resizebox.bpr | 139 + .../windows/fltk-1.1.10/borlandc/resizebox.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/scroll.bpf | 3 + .../windows/fltk-1.1.10/borlandc/scroll.bpr | 139 + .../windows/fltk-1.1.10/borlandc/scroll.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/shape.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/shape.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/shape.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/subwindow.bpf | 3 + .../windows/fltk-1.1.10/borlandc/subwindow.bpr | 139 + .../windows/fltk-1.1.10/borlandc/subwindow.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/symbols.bpf | 3 + .../windows/fltk-1.1.10/borlandc/symbols.bpr | 139 + .../windows/fltk-1.1.10/borlandc/symbols.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/borlandc/tile.bpf | 3 + third_party/windows/fltk-1.1.10/borlandc/tile.bpr | 139 + third_party/windows/fltk-1.1.10/borlandc/tile.res | Bin 0 -> 876 bytes .../windows/fltk-1.1.10/borlandc/tiled_image.bpf | 3 + .../windows/fltk-1.1.10/borlandc/tiled_image.bpr | 139 + .../windows/fltk-1.1.10/borlandc/tiled_image.res | Bin 0 -> 876 bytes third_party/windows/fltk-1.1.10/configh.cmake.in | 265 + third_party/windows/fltk-1.1.10/configh.in | 301 + third_party/windows/fltk-1.1.10/configure | 9045 +++++ third_party/windows/fltk-1.1.10/configure.in | 1259 + .../windows/fltk-1.1.10/documentation/FL.gif | Bin 0 -> 6455 bytes .../windows/fltk-1.1.10/documentation/Fl.html | 1391 + .../fltk-1.1.10/documentation/Fl_Adjuster.html | 53 + .../fltk-1.1.10/documentation/Fl_BMP_Image.html | 57 + .../fltk-1.1.10/documentation/Fl_Bitmap.html | 54 + .../windows/fltk-1.1.10/documentation/Fl_Box.html | 44 + .../fltk-1.1.10/documentation/Fl_Browser.html | 220 + .../fltk-1.1.10/documentation/Fl_Browser_.html | 419 + .../fltk-1.1.10/documentation/Fl_Button.html | 134 + .../fltk-1.1.10/documentation/Fl_Chart.html | 123 + .../documentation/Fl_Check_Browser.html | 104 + .../fltk-1.1.10/documentation/Fl_Check_Button.gif | Bin 0 -> 362 bytes .../fltk-1.1.10/documentation/Fl_Check_Button.html | 45 + .../fltk-1.1.10/documentation/Fl_Choice.html | 88 + .../fltk-1.1.10/documentation/Fl_Clock.html | 52 + .../fltk-1.1.10/documentation/Fl_Clock_Output.html | 62 + .../documentation/Fl_Color_Chooser.html | 91 + .../fltk-1.1.10/documentation/Fl_Counter.html | 51 + .../windows/fltk-1.1.10/documentation/Fl_Dial.html | 65 + .../documentation/Fl_Double_Window.html | 54 + .../windows/fltk-1.1.10/documentation/Fl_End.html | 45 + .../fltk-1.1.10/documentation/Fl_File_Browser.html | 84 + .../fltk-1.1.10/documentation/Fl_File_Chooser.html | 295 + .../fltk-1.1.10/documentation/Fl_File_Chooser.jpg | Bin 0 -> 30831 bytes .../fltk-1.1.10/documentation/Fl_File_Icon.html | 156 + .../fltk-1.1.10/documentation/Fl_File_Input.gif | Bin 0 -> 4040 bytes .../fltk-1.1.10/documentation/Fl_File_Input.html | 60 + .../fltk-1.1.10/documentation/Fl_Float_Input.html | 39 + .../windows/fltk-1.1.10/documentation/Fl_Free.html | 78 + .../fltk-1.1.10/documentation/Fl_GIF_Image.html | 58 + .../fltk-1.1.10/documentation/Fl_Gl_Window.html | 246 + .../fltk-1.1.10/documentation/Fl_Group.html | 190 + .../fltk-1.1.10/documentation/Fl_Help_Dialog.gif | Bin 0 -> 8571 bytes .../fltk-1.1.10/documentation/Fl_Help_Dialog.html | 120 + .../fltk-1.1.10/documentation/Fl_Help_View.html | 141 + .../fltk-1.1.10/documentation/Fl_Hold_Browser.html | 59 + .../fltk-1.1.10/documentation/Fl_Image.html | 212 + .../fltk-1.1.10/documentation/Fl_Input.html | 383 + .../fltk-1.1.10/documentation/Fl_Input_.html | 265 + .../fltk-1.1.10/documentation/Fl_Input_Choice.html | 100 + .../fltk-1.1.10/documentation/Fl_Int_Input.html | 38 + .../fltk-1.1.10/documentation/Fl_JPEG_Image.html | 59 + .../fltk-1.1.10/documentation/Fl_Light_Button.gif | Bin 0 -> 421 bytes .../fltk-1.1.10/documentation/Fl_Light_Button.html | 45 + .../fltk-1.1.10/documentation/Fl_Menu_.html | 316 + .../fltk-1.1.10/documentation/Fl_Menu_Bar.html | 67 + .../fltk-1.1.10/documentation/Fl_Menu_Button.html | 83 + .../fltk-1.1.10/documentation/Fl_Menu_Item.html | 300 + .../fltk-1.1.10/documentation/Fl_Menu_Window.html | 49 + .../documentation/Fl_Multi_Browser.html | 79 + .../documentation/Fl_Multiline_Input.html | 47 + .../documentation/Fl_Multiline_Output.html | 42 + .../fltk-1.1.10/documentation/Fl_Output.html | 83 + .../documentation/Fl_Overlay_Window.html | 59 + .../fltk-1.1.10/documentation/Fl_PNG_Image.html | 59 + .../fltk-1.1.10/documentation/Fl_PNM_Image.html | 59 + .../windows/fltk-1.1.10/documentation/Fl_Pack.html | 73 + .../fltk-1.1.10/documentation/Fl_Pixmap.html | 57 + .../fltk-1.1.10/documentation/Fl_Positioner.html | 73 + .../fltk-1.1.10/documentation/Fl_Preferences.html | 216 + .../fltk-1.1.10/documentation/Fl_Progress.html | 73 + .../fltk-1.1.10/documentation/Fl_RGB_Image.html | 64 + .../documentation/Fl_Repeat_Button.html | 38 + .../fltk-1.1.10/documentation/Fl_Return_Button.gif | Bin 0 -> 491 bytes .../documentation/Fl_Return_Button.html | 38 + .../fltk-1.1.10/documentation/Fl_Roller.gif | Bin 0 -> 1592 bytes .../fltk-1.1.10/documentation/Fl_Roller.html | 37 + .../fltk-1.1.10/documentation/Fl_Round_Button.gif | Bin 0 -> 404 bytes .../fltk-1.1.10/documentation/Fl_Round_Button.html | 45 + .../fltk-1.1.10/documentation/Fl_Scroll.gif | Bin 0 -> 13051 bytes .../fltk-1.1.10/documentation/Fl_Scroll.html | 117 + .../fltk-1.1.10/documentation/Fl_Scrollbar.html | 64 + .../fltk-1.1.10/documentation/Fl_Secret_Input.html | 40 + .../documentation/Fl_Select_Browser.html | 57 + .../fltk-1.1.10/documentation/Fl_Shared_Image.html | 96 + .../documentation/Fl_Single_Window.html | 42 + .../fltk-1.1.10/documentation/Fl_Slider.html | 82 + .../fltk-1.1.10/documentation/Fl_Spinner.html | 123 + .../windows/fltk-1.1.10/documentation/Fl_Tabs.html | 91 + .../fltk-1.1.10/documentation/Fl_Text_Buffer.html | 465 + .../fltk-1.1.10/documentation/Fl_Text_Display.html | 246 + .../fltk-1.1.10/documentation/Fl_Text_Editor.html | 221 + .../windows/fltk-1.1.10/documentation/Fl_Tile.gif | Bin 0 -> 3837 bytes .../windows/fltk-1.1.10/documentation/Fl_Tile.html | 91 + .../fltk-1.1.10/documentation/Fl_Tiled_Image.html | 64 + .../fltk-1.1.10/documentation/Fl_Timer.html | 62 + .../documentation/Fl_Toggle_Button.html | 43 + .../fltk-1.1.10/documentation/Fl_Tooltip.html | 116 + .../fltk-1.1.10/documentation/Fl_Valuator.html | 199 + .../fltk-1.1.10/documentation/Fl_Value_Input.gif | Bin 0 -> 651 bytes .../fltk-1.1.10/documentation/Fl_Value_Input.html | 115 + .../fltk-1.1.10/documentation/Fl_Value_Output.gif | Bin 0 -> 640 bytes .../fltk-1.1.10/documentation/Fl_Value_Output.html | 69 + .../fltk-1.1.10/documentation/Fl_Value_Slider.html | 57 + .../fltk-1.1.10/documentation/Fl_Widget.html | 568 + .../fltk-1.1.10/documentation/Fl_Window.html | 290 + .../fltk-1.1.10/documentation/Fl_Wizard.html | 73 + .../fltk-1.1.10/documentation/Fl_XBM_Image.html | 57 + .../fltk-1.1.10/documentation/Fl_XPM_Image.html | 57 + .../windows/fltk-1.1.10/documentation/Makefile | 299 + .../windows/fltk-1.1.10/documentation/README | 21 + .../fltk-1.1.10/documentation/adjuster1.gif | Bin 0 -> 1249 bytes .../fltk-1.1.10/documentation/advanced.html | 95 + .../windows/fltk-1.1.10/documentation/basics.html | 368 + .../windows/fltk-1.1.10/documentation/blocks.man | 26 + .../windows/fltk-1.1.10/documentation/boxtypes.gif | Bin 0 -> 12196 bytes .../windows/fltk-1.1.10/documentation/buttons.gif | Bin 0 -> 2052 bytes .../windows/fltk-1.1.10/documentation/charts.gif | Bin 0 -> 12312 bytes .../windows/fltk-1.1.10/documentation/checkers.man | 24 + .../windows/fltk-1.1.10/documentation/choice.gif | Bin 0 -> 2240 bytes .../windows/fltk-1.1.10/documentation/clock.gif | Bin 0 -> 1779 bytes .../windows/fltk-1.1.10/documentation/common.html | 672 + .../windows/fltk-1.1.10/documentation/counter.gif | Bin 0 -> 1879 bytes .../windows/fltk-1.1.10/documentation/cubeview.gif | Bin 0 -> 10937 bytes .../windows/fltk-1.1.10/documentation/dial.gif | Bin 0 -> 1564 bytes .../windows/fltk-1.1.10/documentation/drawing.html | 972 + .../fltk-1.1.10/documentation/editor-replace.gif | Bin 0 -> 1521 bytes .../windows/fltk-1.1.10/documentation/editor.gif | Bin 0 -> 10187 bytes .../windows/fltk-1.1.10/documentation/editor.html | 911 + .../fltk-1.1.10/documentation/enumerations.html | 306 + .../windows/fltk-1.1.10/documentation/events.html | 394 + .../fltk-1.1.10/documentation/examples.html | 453 + .../windows/fltk-1.1.10/documentation/fl_alert.gif | Bin 0 -> 1674 bytes .../windows/fltk-1.1.10/documentation/fl_ask.gif | Bin 0 -> 1333 bytes .../fltk-1.1.10/documentation/fl_choice.gif | Bin 0 -> 1519 bytes .../fltk-1.1.10/documentation/fl_color_chooser.jpg | Bin 0 -> 7694 bytes .../windows/fltk-1.1.10/documentation/fl_input.gif | Bin 0 -> 1935 bytes .../fltk-1.1.10/documentation/fl_message.gif | Bin 0 -> 1509 bytes .../fltk-1.1.10/documentation/fl_password.gif | Bin 0 -> 1607 bytes .../fltk-1.1.10/documentation/fl_show_colormap.gif | Bin 0 -> 17916 bytes .../fltk-1.1.10/documentation/fltk-config.man | 90 + .../windows/fltk-1.1.10/documentation/fltk.book | 108 + .../windows/fltk-1.1.10/documentation/fltk.man | 55 + .../fltk-1.1.10/documentation/fluid-catgets.gif | Bin 0 -> 7626 bytes .../fltk-1.1.10/documentation/fluid-gettext.gif | Bin 0 -> 7630 bytes .../fltk-1.1.10/documentation/fluid-org.gif | Bin 0 -> 11334 bytes .../windows/fltk-1.1.10/documentation/fluid.html | 1363 + .../windows/fltk-1.1.10/documentation/fluid.man | 32 + .../windows/fltk-1.1.10/documentation/fluid1.gif | Bin 0 -> 6257 bytes .../windows/fltk-1.1.10/documentation/fluid2.gif | Bin 0 -> 28555 bytes .../fltk-1.1.10/documentation/fluid3-cxx.gif | Bin 0 -> 8841 bytes .../fltk-1.1.10/documentation/fluid3-gui.gif | Bin 0 -> 10636 bytes .../fltk-1.1.10/documentation/fluid3-style.gif | Bin 0 -> 8046 bytes .../windows/fltk-1.1.10/documentation/fluid4.gif | Bin 0 -> 5123 bytes .../fltk-1.1.10/documentation/fluid_prefs.gif | Bin 0 -> 6875 bytes .../fltk-1.1.10/documentation/fluid_widget_cxx.gif | Bin 0 -> 8154 bytes .../fltk-1.1.10/documentation/fluid_widget_gui.gif | Bin 0 -> 10463 bytes .../documentation/fluid_widget_style.gif | Bin 0 -> 7653 bytes .../windows/fltk-1.1.10/documentation/forms.html | 203 + .../fltk-1.1.10/documentation/functions.html | 1483 + .../windows/fltk-1.1.10/documentation/glut.html | 196 + .../windows/fltk-1.1.10/documentation/hello.C.gif | Bin 0 -> 1686 bytes .../windows/fltk-1.1.10/documentation/index.html | 101 + .../fltk-1.1.10/documentation/input_choice.jpg | Bin 0 -> 5320 bytes .../windows/fltk-1.1.10/documentation/intro.html | 373 + .../windows/fltk-1.1.10/documentation/license.html | 442 + .../windows/fltk-1.1.10/documentation/menu.gif | Bin 0 -> 3079 bytes .../fltk-1.1.10/documentation/menu_button.gif | Bin 0 -> 1632 bytes .../windows/fltk-1.1.10/documentation/menubar.gif | Bin 0 -> 1273 bytes .../fltk-1.1.10/documentation/migration.html | 163 + .../windows/fltk-1.1.10/documentation/opengl.html | 467 + .../fltk-1.1.10/documentation/osissues.html | 745 + .../fltk-1.1.10/documentation/positioner.gif | Bin 0 -> 1467 bytes .../windows/fltk-1.1.10/documentation/preface.html | 117 + .../fltk-1.1.10/documentation/resizebox1.gif | Bin 0 -> 2795 bytes .../fltk-1.1.10/documentation/resizebox2.gif | Bin 0 -> 4291 bytes .../fltk-1.1.10/documentation/round_clock.gif | Bin 0 -> 1623 bytes .../fltk-1.1.10/documentation/scrollbar.gif | Bin 0 -> 1201 bytes .../windows/fltk-1.1.10/documentation/slider.gif | Bin 0 -> 3412 bytes .../fltk-1.1.10/documentation/subclassing.html | 434 + .../windows/fltk-1.1.10/documentation/sudoku.man | 33 + .../windows/fltk-1.1.10/documentation/symbols.gif | Bin 0 -> 5175 bytes .../windows/fltk-1.1.10/documentation/tabs.gif | Bin 0 -> 2271 bytes .../windows/fltk-1.1.10/documentation/text.gif | Bin 0 -> 1988 bytes .../fltk-1.1.10/documentation/valuators.gif | Bin 0 -> 19207 bytes .../fltk-1.1.10/documentation/value_slider.gif | Bin 0 -> 3733 bytes .../windows/fltk-1.1.10/documentation/widgets.html | 907 + third_party/windows/fltk-1.1.10/fltk-config.in | 344 + third_party/windows/fltk-1.1.10/fltk.list.in | 421 + third_party/windows/fltk-1.1.10/fltk.spec.in | 145 + third_party/windows/fltk-1.1.10/fltk.xpm | 225 + .../windows/fltk-1.1.10/fluid/CMakeLists.txt | 30 + .../windows/fltk-1.1.10/fluid/CodeEditor.cxx | 419 + third_party/windows/fltk-1.1.10/fluid/CodeEditor.h | 88 + .../windows/fltk-1.1.10/fluid/Fl_Function_Type.cxx | 1184 + .../windows/fltk-1.1.10/fluid/Fl_Group_Type.cxx | 330 + .../windows/fltk-1.1.10/fluid/Fl_Menu_Type.cxx | 611 + third_party/windows/fltk-1.1.10/fluid/Fl_Type.cxx | 908 + third_party/windows/fltk-1.1.10/fluid/Fl_Type.h | 772 + .../windows/fltk-1.1.10/fluid/Fl_Widget_Type.cxx | 2745 ++ .../windows/fltk-1.1.10/fluid/Fl_Widget_Type.h | 42 + .../windows/fltk-1.1.10/fluid/Fl_Window_Type.cxx | 1533 + .../windows/fltk-1.1.10/fluid/Fluid_Image.cxx | 229 + .../windows/fltk-1.1.10/fluid/Fluid_Image.h | 66 + third_party/windows/fltk-1.1.10/fluid/Makefile | 137 + .../windows/fltk-1.1.10/fluid/Shortcut_Button.h | 41 + .../windows/fltk-1.1.10/fluid/about_panel.cxx | 306 + .../windows/fltk-1.1.10/fluid/about_panel.fl | 74 + .../windows/fltk-1.1.10/fluid/about_panel.h | 44 + .../windows/fltk-1.1.10/fluid/align_widget.cxx | 541 + .../windows/fltk-1.1.10/fluid/alignment_panel.cxx | 506 + .../windows/fltk-1.1.10/fluid/alignment_panel.fl | 420 + .../windows/fltk-1.1.10/fluid/alignment_panel.h | 106 + third_party/windows/fltk-1.1.10/fluid/code.cxx | 592 + third_party/windows/fltk-1.1.10/fluid/comments.h | 82 + third_party/windows/fltk-1.1.10/fluid/factory.cxx | 1210 + third_party/windows/fltk-1.1.10/fluid/file.cxx | 650 + .../fluid/fluid.app/Contents/Info.plist | 68 + .../fltk-1.1.10/fluid/fluid.app/Contents/PkgInfo | 1 + .../fluid/fluid.app/Contents/Resources/fluid.icns | Bin 0 -> 34648 bytes third_party/windows/fltk-1.1.10/fluid/fluid.cxx | 2253 ++ .../windows/fltk-1.1.10/fluid/fluid.desktop | 10 + .../windows/fltk-1.1.10/fluid/function_panel.cxx | 979 + .../windows/fltk-1.1.10/fluid/function_panel.fl | 819 + .../windows/fltk-1.1.10/fluid/function_panel.h | 119 + .../windows/fltk-1.1.10/fluid/icons/fluid-128.png | Bin 0 -> 10179 bytes .../windows/fltk-1.1.10/fluid/icons/fluid-16.png | Bin 0 -> 706 bytes .../windows/fltk-1.1.10/fluid/icons/fluid-16i.png | Bin 0 -> 278 bytes .../windows/fltk-1.1.10/fluid/icons/fluid-256.png | Bin 0 -> 23785 bytes .../windows/fltk-1.1.10/fluid/icons/fluid-32.png | Bin 0 -> 1587 bytes .../windows/fltk-1.1.10/fluid/icons/fluid-32.xpm | 67 + .../windows/fltk-1.1.10/fluid/icons/fluid-32i.png | Bin 0 -> 450 bytes .../windows/fltk-1.1.10/fluid/icons/fluid-48.png | Bin 0 -> 2763 bytes .../windows/fltk-1.1.10/fluid/icons/fluid-64.png | Bin 0 -> 3942 bytes .../windows/fltk-1.1.10/fluid/icons/fluid-96.xpm | 131 + .../windows/fltk-1.1.10/fluid/icons/fluid.ico | Bin 0 -> 1078 bytes .../windows/fltk-1.1.10/fluid/icons/fluid.xcf.gz | Bin 0 -> 22590 bytes third_party/windows/fltk-1.1.10/fluid/makedepend | 294 + third_party/windows/fltk-1.1.10/fluid/makefile.wat | 79 + .../fltk-1.1.10/fluid/pixmaps/flAdjuster.xpm | 29 + .../windows/fltk-1.1.10/fluid/pixmaps/flBox.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flBrowser.xpm | 29 + .../windows/fltk-1.1.10/fluid/pixmaps/flButton.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flCheckBrowser.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flCheckButton.xpm | 30 + .../windows/fltk-1.1.10/fluid/pixmaps/flChoice.xpm | 29 + .../windows/fltk-1.1.10/fluid/pixmaps/flClass.xpm | 27 + .../windows/fltk-1.1.10/fluid/pixmaps/flClock.xpm | 28 + .../windows/fltk-1.1.10/fluid/pixmaps/flCode.xpm | 27 + .../fltk-1.1.10/fluid/pixmaps/flCodeBlock.xpm | 27 + .../fltk-1.1.10/fluid/pixmaps/flComment.xpm | 27 + .../fltk-1.1.10/fluid/pixmaps/flCounter.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flDeclaration.xpm | 27 + .../fluid/pixmaps/flDeclarationBlock.xpm | 27 + .../windows/fltk-1.1.10/fluid/pixmaps/flDial.xpm | 28 + .../fltk-1.1.10/fluid/pixmaps/flFileBrowser.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flFileInput.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flFunction.xpm | 27 + .../windows/fltk-1.1.10/fluid/pixmaps/flGroup.xpm | 29 + .../windows/fltk-1.1.10/fluid/pixmaps/flHelp.xpm | 29 + .../windows/fltk-1.1.10/fluid/pixmaps/flInput.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flLightButton.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flMenuButton.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flMenubar.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flMenuitem.xpm | 29 + .../windows/fltk-1.1.10/fluid/pixmaps/flOutput.xpm | 29 + .../windows/fltk-1.1.10/fluid/pixmaps/flPack.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flProgress.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flRepeatButton.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flReturnButton.xpm | 29 + .../windows/fltk-1.1.10/fluid/pixmaps/flRoller.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flRoundButton.xpm | 30 + .../windows/fltk-1.1.10/fluid/pixmaps/flScroll.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flScrollBar.xpm | 29 + .../windows/fltk-1.1.10/fluid/pixmaps/flSlider.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flSpinner.xpm | 25 + .../fltk-1.1.10/fluid/pixmaps/flSubmenu.xpm | 29 + .../windows/fltk-1.1.10/fluid/pixmaps/flTabs.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flTextDisplay.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flTextEdit.xpm | 29 + .../windows/fltk-1.1.10/fluid/pixmaps/flTile.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flValueInput.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flValueOutput.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flValueSlider.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/flWidgetClass.xpm | 31 + .../windows/fltk-1.1.10/fluid/pixmaps/flWindow.xpm | 29 + .../windows/fltk-1.1.10/fluid/pixmaps/flWizard.xpm | 29 + .../windows/fltk-1.1.10/fluid/pixmaps/lock.xpm | 29 + .../fltk-1.1.10/fluid/pixmaps/print_color.xpm | 44 + .../fltk-1.1.10/fluid/pixmaps/print_gray.xpm | 44 + .../fltk-1.1.10/fluid/pixmaps/protected.xpm | 29 + .../windows/fltk-1.1.10/fluid/print_panel.cxx | 588 + .../windows/fltk-1.1.10/fluid/print_panel.fl | 370 + .../windows/fltk-1.1.10/fluid/print_panel.h | 71 + .../windows/fltk-1.1.10/fluid/template_panel.cxx | 258 + .../windows/fltk-1.1.10/fluid/template_panel.fl | 244 + .../windows/fltk-1.1.10/fluid/template_panel.h | 55 + third_party/windows/fltk-1.1.10/fluid/undo.cxx | 192 + third_party/windows/fltk-1.1.10/fluid/undo.h | 46 + .../windows/fltk-1.1.10/fluid/widget_panel.cxx | 795 + .../windows/fltk-1.1.10/fluid/widget_panel.fl | 579 + .../windows/fltk-1.1.10/fluid/widget_panel.h | 122 + .../windows/fltk-1.1.10/fluid/x-fluid.desktop | 8 + third_party/windows/fltk-1.1.10/forms.h | 3 + third_party/windows/fltk-1.1.10/install-sh | 238 + .../windows/fltk-1.1.10/jpeg/CMakeLists.txt | 36 + third_party/windows/fltk-1.1.10/jpeg/Makefile | 118 + third_party/windows/fltk-1.1.10/jpeg/README | 385 + third_party/windows/fltk-1.1.10/jpeg/change.log | 217 + third_party/windows/fltk-1.1.10/jpeg/coderules.doc | 118 + third_party/windows/fltk-1.1.10/jpeg/filelist.doc | 210 + third_party/windows/fltk-1.1.10/jpeg/jcapimin.c | 280 + third_party/windows/fltk-1.1.10/jpeg/jcapistd.c | 161 + third_party/windows/fltk-1.1.10/jpeg/jccoefct.c | 449 + third_party/windows/fltk-1.1.10/jpeg/jccolor.c | 459 + third_party/windows/fltk-1.1.10/jpeg/jcdctmgr.c | 387 + third_party/windows/fltk-1.1.10/jpeg/jchuff.c | 909 + third_party/windows/fltk-1.1.10/jpeg/jchuff.h | 47 + third_party/windows/fltk-1.1.10/jpeg/jcinit.c | 72 + third_party/windows/fltk-1.1.10/jpeg/jcmainct.c | 293 + third_party/windows/fltk-1.1.10/jpeg/jcmarker.c | 664 + third_party/windows/fltk-1.1.10/jpeg/jcmaster.c | 590 + third_party/windows/fltk-1.1.10/jpeg/jcomapi.c | 106 + third_party/windows/fltk-1.1.10/jpeg/jconfig.doc | 155 + third_party/windows/fltk-1.1.10/jpeg/jconfig.h | 50 + third_party/windows/fltk-1.1.10/jpeg/jcparam.c | 610 + third_party/windows/fltk-1.1.10/jpeg/jcphuff.c | 833 + third_party/windows/fltk-1.1.10/jpeg/jcprepct.c | 354 + third_party/windows/fltk-1.1.10/jpeg/jcsample.c | 519 + third_party/windows/fltk-1.1.10/jpeg/jctrans.c | 388 + third_party/windows/fltk-1.1.10/jpeg/jdapimin.c | 395 + third_party/windows/fltk-1.1.10/jpeg/jdapistd.c | 275 + third_party/windows/fltk-1.1.10/jpeg/jdatadst.c | 151 + third_party/windows/fltk-1.1.10/jpeg/jdatasrc.c | 212 + third_party/windows/fltk-1.1.10/jpeg/jdcoefct.c | 736 + third_party/windows/fltk-1.1.10/jpeg/jdcolor.c | 396 + third_party/windows/fltk-1.1.10/jpeg/jdct.h | 176 + third_party/windows/fltk-1.1.10/jpeg/jddctmgr.c | 269 + third_party/windows/fltk-1.1.10/jpeg/jdhuff.c | 651 + third_party/windows/fltk-1.1.10/jpeg/jdhuff.h | 201 + third_party/windows/fltk-1.1.10/jpeg/jdinput.c | 381 + third_party/windows/fltk-1.1.10/jpeg/jdmainct.c | 512 + third_party/windows/fltk-1.1.10/jpeg/jdmarker.c | 1360 + third_party/windows/fltk-1.1.10/jpeg/jdmaster.c | 557 + third_party/windows/fltk-1.1.10/jpeg/jdmerge.c | 400 + third_party/windows/fltk-1.1.10/jpeg/jdphuff.c | 668 + third_party/windows/fltk-1.1.10/jpeg/jdpostct.c | 290 + third_party/windows/fltk-1.1.10/jpeg/jdsample.c | 478 + third_party/windows/fltk-1.1.10/jpeg/jdtrans.c | 143 + third_party/windows/fltk-1.1.10/jpeg/jerror.c | 253 + third_party/windows/fltk-1.1.10/jpeg/jerror.h | 291 + third_party/windows/fltk-1.1.10/jpeg/jfdctflt.c | 168 + third_party/windows/fltk-1.1.10/jpeg/jfdctfst.c | 224 + third_party/windows/fltk-1.1.10/jpeg/jfdctint.c | 283 + third_party/windows/fltk-1.1.10/jpeg/jidctflt.c | 242 + third_party/windows/fltk-1.1.10/jpeg/jidctfst.c | 368 + third_party/windows/fltk-1.1.10/jpeg/jidctint.c | 389 + third_party/windows/fltk-1.1.10/jpeg/jidctred.c | 398 + third_party/windows/fltk-1.1.10/jpeg/jinclude.h | 91 + third_party/windows/fltk-1.1.10/jpeg/jmemmgr.c | 1118 + third_party/windows/fltk-1.1.10/jpeg/jmemnobs.c | 109 + third_party/windows/fltk-1.1.10/jpeg/jmemsys.h | 198 + third_party/windows/fltk-1.1.10/jpeg/jmorecfg.h | 316 + third_party/windows/fltk-1.1.10/jpeg/jpegint.h | 392 + third_party/windows/fltk-1.1.10/jpeg/jpeglib.h | 1096 + third_party/windows/fltk-1.1.10/jpeg/jquant1.c | 856 + third_party/windows/fltk-1.1.10/jpeg/jquant2.c | 1310 + third_party/windows/fltk-1.1.10/jpeg/jutils.c | 179 + third_party/windows/fltk-1.1.10/jpeg/jversion.h | 14 + third_party/windows/fltk-1.1.10/jpeg/libjpeg.doc | 3006 ++ third_party/windows/fltk-1.1.10/jpeg/makedepend | 94 + third_party/windows/fltk-1.1.10/jpeg/makefile.wat | 67 + third_party/windows/fltk-1.1.10/jpeg/structure.doc | 948 + third_party/windows/fltk-1.1.10/jpeg/usage.doc | 562 + third_party/windows/fltk-1.1.10/jpeg/wizard.doc | 211 + third_party/windows/fltk-1.1.10/lib/README.lib | 16 + .../windows/fltk-1.1.10/makefiles/Makefile.mingw | 118 + .../windows/fltk-1.1.10/makefiles/Makefile.os2x | 78 + .../windows/fltk-1.1.10/makefiles/config.mingw | 302 + .../windows/fltk-1.1.10/makefiles/config.os2x | 231 + .../fltk-1.1.10/makefiles/makeinclude.mingw | 160 + .../fltk-1.1.10/makefiles/makeinclude.mingw31 | 127 + .../windows/fltk-1.1.10/makefiles/makeinclude.os2x | 129 + third_party/windows/fltk-1.1.10/makeinclude.in | 167 + third_party/windows/fltk-1.1.10/png/ANNOUNCE | 57 + third_party/windows/fltk-1.1.10/png/CHANGES | 2479 ++ third_party/windows/fltk-1.1.10/png/CMakeLists.txt | 30 + third_party/windows/fltk-1.1.10/png/INSTALL | 199 + third_party/windows/fltk-1.1.10/png/KNOWNBUG | 22 + third_party/windows/fltk-1.1.10/png/LICENSE | 111 + third_party/windows/fltk-1.1.10/png/Makefile | 107 + third_party/windows/fltk-1.1.10/png/README | 267 + third_party/windows/fltk-1.1.10/png/TODO | 25 + third_party/windows/fltk-1.1.10/png/Y2KINFO | 55 + third_party/windows/fltk-1.1.10/png/libpng.3 | 4349 ++ third_party/windows/fltk-1.1.10/png/libpng.txt | 3112 ++ third_party/windows/fltk-1.1.10/png/libpngpf.3 | 790 + third_party/windows/fltk-1.1.10/png/makedepend | 17 + third_party/windows/fltk-1.1.10/png/makefile.wat | 64 + third_party/windows/fltk-1.1.10/png/png.5 | 74 + third_party/windows/fltk-1.1.10/png/png.c | 926 + third_party/windows/fltk-1.1.10/png/png.h | 3726 ++ third_party/windows/fltk-1.1.10/png/pngconf.h | 1508 + third_party/windows/fltk-1.1.10/png/pngerror.c | 364 + third_party/windows/fltk-1.1.10/png/pngget.c | 943 + third_party/windows/fltk-1.1.10/png/pngmem.c | 620 + third_party/windows/fltk-1.1.10/png/pngpread.c | 1727 + third_party/windows/fltk-1.1.10/png/pngread.c | 1473 + third_party/windows/fltk-1.1.10/png/pngrio.c | 177 + third_party/windows/fltk-1.1.10/png/pngrtran.c | 4381 +++ third_party/windows/fltk-1.1.10/png/pngrutil.c | 3252 ++ third_party/windows/fltk-1.1.10/png/pngset.c | 1285 + third_party/windows/fltk-1.1.10/png/pngtrans.c | 677 + third_party/windows/fltk-1.1.10/png/pngwio.c | 259 + third_party/windows/fltk-1.1.10/png/pngwrite.c | 1561 + third_party/windows/fltk-1.1.10/png/pngwtran.c | 575 + third_party/windows/fltk-1.1.10/png/pngwutil.c | 2825 ++ third_party/windows/fltk-1.1.10/src/CMakeLists.txt | 208 + third_party/windows/fltk-1.1.10/src/Fl.cxx | 1311 + .../windows/fltk-1.1.10/src/Fl_Adjuster.cxx | 171 + .../windows/fltk-1.1.10/src/Fl_BMP_Image.cxx | 493 + third_party/windows/fltk-1.1.10/src/Fl_Bitmap.cxx | 518 + third_party/windows/fltk-1.1.10/src/Fl_Box.cxx | 44 + third_party/windows/fltk-1.1.10/src/Fl_Browser.cxx | 551 + .../windows/fltk-1.1.10/src/Fl_Browser_.cxx | 842 + .../windows/fltk-1.1.10/src/Fl_Browser_load.cxx | 57 + third_party/windows/fltk-1.1.10/src/Fl_Button.cxx | 175 + third_party/windows/fltk-1.1.10/src/Fl_Chart.cxx | 390 + .../windows/fltk-1.1.10/src/Fl_Check_Browser.cxx | 309 + .../windows/fltk-1.1.10/src/Fl_Check_Button.cxx | 40 + third_party/windows/fltk-1.1.10/src/Fl_Choice.cxx | 191 + third_party/windows/fltk-1.1.10/src/Fl_Clock.cxx | 177 + .../windows/fltk-1.1.10/src/Fl_Color_Chooser.cxx | 529 + third_party/windows/fltk-1.1.10/src/Fl_Counter.cxx | 197 + third_party/windows/fltk-1.1.10/src/Fl_Dial.cxx | 147 + .../windows/fltk-1.1.10/src/Fl_Double_Window.cxx | 452 + .../windows/fltk-1.1.10/src/Fl_File_Browser.cxx | 639 + .../windows/fltk-1.1.10/src/Fl_File_Chooser.cxx | 444 + .../windows/fltk-1.1.10/src/Fl_File_Chooser.fl | 426 + .../windows/fltk-1.1.10/src/Fl_File_Chooser2.cxx | 1308 + .../windows/fltk-1.1.10/src/Fl_File_Icon.cxx | 485 + .../windows/fltk-1.1.10/src/Fl_File_Icon2.cxx | 1015 + .../windows/fltk-1.1.10/src/Fl_File_Input.cxx | 288 + third_party/windows/fltk-1.1.10/src/Fl_Font.H | 111 + .../windows/fltk-1.1.10/src/Fl_GIF_Image.cxx | 384 + third_party/windows/fltk-1.1.10/src/Fl_Gl_Choice.H | 132 + .../windows/fltk-1.1.10/src/Fl_Gl_Choice.cxx | 453 + .../windows/fltk-1.1.10/src/Fl_Gl_Overlay.cxx | 248 + .../windows/fltk-1.1.10/src/Fl_Gl_Window.cxx | 440 + third_party/windows/fltk-1.1.10/src/Fl_Group.cxx | 623 + .../windows/fltk-1.1.10/src/Fl_Help_Dialog.cxx | 301 + .../windows/fltk-1.1.10/src/Fl_Help_Dialog.fl | 265 + .../windows/fltk-1.1.10/src/Fl_Help_View.cxx | 3507 ++ third_party/windows/fltk-1.1.10/src/Fl_Image.cxx | 525 + third_party/windows/fltk-1.1.10/src/Fl_Input.cxx | 477 + third_party/windows/fltk-1.1.10/src/Fl_Input_.cxx | 907 + .../windows/fltk-1.1.10/src/Fl_JPEG_Image.cxx | 193 + .../windows/fltk-1.1.10/src/Fl_Light_Button.cxx | 169 + third_party/windows/fltk-1.1.10/src/Fl_Menu.cxx | 949 + third_party/windows/fltk-1.1.10/src/Fl_Menu_.cxx | 232 + .../windows/fltk-1.1.10/src/Fl_Menu_Bar.cxx | 78 + .../windows/fltk-1.1.10/src/Fl_Menu_Button.cxx | 111 + .../windows/fltk-1.1.10/src/Fl_Menu_Window.cxx | 103 + .../windows/fltk-1.1.10/src/Fl_Menu_add.cxx | 268 + .../windows/fltk-1.1.10/src/Fl_Menu_global.cxx | 50 + .../windows/fltk-1.1.10/src/Fl_Multi_Label.cxx | 80 + .../windows/fltk-1.1.10/src/Fl_Overlay_Window.cxx | 155 + .../windows/fltk-1.1.10/src/Fl_PNG_Image.cxx | 155 + .../windows/fltk-1.1.10/src/Fl_PNM_Image.cxx | 190 + third_party/windows/fltk-1.1.10/src/Fl_Pack.cxx | 147 + third_party/windows/fltk-1.1.10/src/Fl_Pixmap.cxx | 495 + .../windows/fltk-1.1.10/src/Fl_Positioner.cxx | 151 + .../windows/fltk-1.1.10/src/Fl_Preferences.cxx | 1182 + .../windows/fltk-1.1.10/src/Fl_Progress.cxx | 117 + .../windows/fltk-1.1.10/src/Fl_Repeat_Button.cxx | 70 + .../windows/fltk-1.1.10/src/Fl_Return_Button.cxx | 72 + third_party/windows/fltk-1.1.10/src/Fl_Roller.cxx | 180 + .../windows/fltk-1.1.10/src/Fl_Round_Button.cxx | 44 + third_party/windows/fltk-1.1.10/src/Fl_Scroll.cxx | 298 + .../windows/fltk-1.1.10/src/Fl_Scrollbar.cxx | 277 + .../windows/fltk-1.1.10/src/Fl_Shared_Image.cxx | 467 + .../windows/fltk-1.1.10/src/Fl_Single_Window.cxx | 41 + third_party/windows/fltk-1.1.10/src/Fl_Slider.cxx | 339 + .../windows/fltk-1.1.10/src/Fl_Sys_Menu_Bar.cxx | 334 + third_party/windows/fltk-1.1.10/src/Fl_Tabs.cxx | 403 + .../windows/fltk-1.1.10/src/Fl_Text_Buffer.cxx | 2534 ++ .../windows/fltk-1.1.10/src/Fl_Text_Display.cxx | 3272 ++ .../windows/fltk-1.1.10/src/Fl_Text_Editor.cxx | 492 + third_party/windows/fltk-1.1.10/src/Fl_Tile.cxx | 207 + .../windows/fltk-1.1.10/src/Fl_Tiled_Image.cxx | 139 + third_party/windows/fltk-1.1.10/src/Fl_Tooltip.cxx | 263 + .../windows/fltk-1.1.10/src/Fl_Valuator.cxx | 149 + .../windows/fltk-1.1.10/src/Fl_Value_Input.cxx | 133 + .../windows/fltk-1.1.10/src/Fl_Value_Output.cxx | 103 + .../windows/fltk-1.1.10/src/Fl_Value_Slider.cxx | 82 + third_party/windows/fltk-1.1.10/src/Fl_Widget.cxx | 318 + third_party/windows/fltk-1.1.10/src/Fl_Window.cxx | 179 + .../fltk-1.1.10/src/Fl_Window_fullscreen.cxx | 97 + .../windows/fltk-1.1.10/src/Fl_Window_hotspot.cxx | 100 + .../windows/fltk-1.1.10/src/Fl_Window_iconize.cxx | 49 + third_party/windows/fltk-1.1.10/src/Fl_Wizard.cxx | 210 + .../windows/fltk-1.1.10/src/Fl_XBM_Image.cxx | 106 + third_party/windows/fltk-1.1.10/src/Fl_XColor.H | 46 + .../windows/fltk-1.1.10/src/Fl_XPM_Image.cxx | 131 + third_party/windows/fltk-1.1.10/src/Fl_abort.cxx | 102 + .../windows/fltk-1.1.10/src/Fl_add_idle.cxx | 100 + third_party/windows/fltk-1.1.10/src/Fl_arg.cxx | 424 + third_party/windows/fltk-1.1.10/src/Fl_compose.cxx | 223 + third_party/windows/fltk-1.1.10/src/Fl_display.cxx | 54 + third_party/windows/fltk-1.1.10/src/Fl_get_key.cxx | 69 + .../windows/fltk-1.1.10/src/Fl_get_key_mac.cxx | 110 + .../windows/fltk-1.1.10/src/Fl_get_key_win32.cxx | 138 + .../fltk-1.1.10/src/Fl_get_system_colors.cxx | 386 + third_party/windows/fltk-1.1.10/src/Fl_grab.cxx | 106 + third_party/windows/fltk-1.1.10/src/Fl_lock.cxx | 358 + third_party/windows/fltk-1.1.10/src/Fl_mac.cxx | 2475 ++ .../windows/fltk-1.1.10/src/Fl_own_colormap.cxx | 83 + third_party/windows/fltk-1.1.10/src/Fl_visual.cxx | 121 + third_party/windows/fltk-1.1.10/src/Fl_win32.cxx | 1728 + third_party/windows/fltk-1.1.10/src/Fl_x.cxx | 1413 + third_party/windows/fltk-1.1.10/src/Makefile | 726 + third_party/windows/fltk-1.1.10/src/allfiles.xbm | 6 + third_party/windows/fltk-1.1.10/src/cgdebug.h | 215 + third_party/windows/fltk-1.1.10/src/cmap.cxx | 179 + third_party/windows/fltk-1.1.10/src/d1.xbm | 6 + third_party/windows/fltk-1.1.10/src/d1_mask.xbm | 6 + third_party/windows/fltk-1.1.10/src/dump_compose.c | 26 + third_party/windows/fltk-1.1.10/src/ew.xbm | 8 + third_party/windows/fltk-1.1.10/src/ew_mask.xbm | 8 + third_party/windows/fltk-1.1.10/src/fastarrow.h | 6 + .../windows/fltk-1.1.10/src/filename_absolute.cxx | 212 + .../windows/fltk-1.1.10/src/filename_expand.cxx | 110 + .../windows/fltk-1.1.10/src/filename_ext.cxx | 47 + .../windows/fltk-1.1.10/src/filename_isdir.cxx | 91 + .../windows/fltk-1.1.10/src/filename_list.cxx | 107 + .../windows/fltk-1.1.10/src/filename_match.cxx | 106 + .../windows/fltk-1.1.10/src/filename_setext.cxx | 46 + third_party/windows/fltk-1.1.10/src/fl_arc.cxx | 87 + third_party/windows/fltk-1.1.10/src/fl_arci.cxx | 126 + third_party/windows/fltk-1.1.10/src/fl_ask.cxx | 396 + third_party/windows/fltk-1.1.10/src/fl_boxtype.cxx | 322 + third_party/windows/fltk-1.1.10/src/fl_call_main.c | 107 + third_party/windows/fltk-1.1.10/src/fl_cmap.h | 256 + third_party/windows/fltk-1.1.10/src/fl_color.cxx | 389 + .../windows/fltk-1.1.10/src/fl_color_mac.cxx | 114 + .../windows/fltk-1.1.10/src/fl_color_win32.cxx | 254 + third_party/windows/fltk-1.1.10/src/fl_cursor.cxx | 335 + third_party/windows/fltk-1.1.10/src/fl_curve.cxx | 106 + .../windows/fltk-1.1.10/src/fl_diamond_box.cxx | 80 + third_party/windows/fltk-1.1.10/src/fl_dnd.cxx | 38 + third_party/windows/fltk-1.1.10/src/fl_dnd_mac.cxx | 90 + .../windows/fltk-1.1.10/src/fl_dnd_win32.cxx | 404 + third_party/windows/fltk-1.1.10/src/fl_dnd_x.cxx | 201 + third_party/windows/fltk-1.1.10/src/fl_draw.cxx | 336 + .../windows/fltk-1.1.10/src/fl_draw_image.cxx | 576 + .../windows/fltk-1.1.10/src/fl_draw_image_mac.cxx | 274 + .../fltk-1.1.10/src/fl_draw_image_win32.cxx | 325 + .../windows/fltk-1.1.10/src/fl_draw_pixmap.cxx | 340 + .../windows/fltk-1.1.10/src/fl_encoding_latin1.cxx | 137 + .../fltk-1.1.10/src/fl_encoding_mac_roman.cxx | 134 + .../windows/fltk-1.1.10/src/fl_engraved_label.cxx | 93 + .../windows/fltk-1.1.10/src/fl_file_dir.cxx | 178 + third_party/windows/fltk-1.1.10/src/fl_font.cxx | 60 + .../windows/fltk-1.1.10/src/fl_font_mac.cxx | 379 + .../windows/fltk-1.1.10/src/fl_font_win32.cxx | 173 + third_party/windows/fltk-1.1.10/src/fl_font_x.cxx | 269 + .../windows/fltk-1.1.10/src/fl_font_xft.cxx | 445 + third_party/windows/fltk-1.1.10/src/fl_gtk.cxx | 304 + .../windows/fltk-1.1.10/src/fl_images_core.cxx | 103 + .../windows/fltk-1.1.10/src/fl_labeltype.cxx | 133 + .../windows/fltk-1.1.10/src/fl_line_style.cxx | 165 + .../windows/fltk-1.1.10/src/fl_open_uri.cxx | 370 + .../windows/fltk-1.1.10/src/fl_oval_box.cxx | 66 + third_party/windows/fltk-1.1.10/src/fl_overlay.cxx | 125 + .../windows/fltk-1.1.10/src/fl_overlay_visual.cxx | 105 + third_party/windows/fltk-1.1.10/src/fl_plastic.cxx | 381 + .../windows/fltk-1.1.10/src/fl_read_image.cxx | 503 + .../windows/fltk-1.1.10/src/fl_read_image_mac.cxx | 137 + .../fltk-1.1.10/src/fl_read_image_win32.cxx | 72 + third_party/windows/fltk-1.1.10/src/fl_rect.cxx | 685 + .../windows/fltk-1.1.10/src/fl_round_box.cxx | 122 + .../windows/fltk-1.1.10/src/fl_rounded_box.cxx | 99 + .../windows/fltk-1.1.10/src/fl_scroll_area.cxx | 166 + .../windows/fltk-1.1.10/src/fl_set_font.cxx | 90 + .../windows/fltk-1.1.10/src/fl_set_fonts.cxx | 46 + .../windows/fltk-1.1.10/src/fl_set_fonts_mac.cxx | 213 + .../windows/fltk-1.1.10/src/fl_set_fonts_win32.cxx | 149 + .../windows/fltk-1.1.10/src/fl_set_fonts_x.cxx | 350 + .../windows/fltk-1.1.10/src/fl_set_fonts_xft.cxx | 366 + .../windows/fltk-1.1.10/src/fl_shadow_box.cxx | 56 + .../windows/fltk-1.1.10/src/fl_shortcut.cxx | 243 + .../windows/fltk-1.1.10/src/fl_show_colormap.cxx | 162 + third_party/windows/fltk-1.1.10/src/fl_symbols.cxx | 700 + third_party/windows/fltk-1.1.10/src/fl_vertex.cxx | 325 + third_party/windows/fltk-1.1.10/src/flstring.c | 105 + third_party/windows/fltk-1.1.10/src/flstring.h | 115 + .../windows/fltk-1.1.10/src/forms_bitmap.cxx | 52 + .../fltk-1.1.10/src/forms_compatability.cxx | 211 + third_party/windows/fltk-1.1.10/src/forms_free.cxx | 81 + .../windows/fltk-1.1.10/src/forms_fselect.cxx | 67 + .../windows/fltk-1.1.10/src/forms_pixmap.cxx | 52 + .../windows/fltk-1.1.10/src/forms_timer.cxx | 170 + .../windows/fltk-1.1.10/src/freeglut_geometry.cxx | 1110 + .../fltk-1.1.10/src/freeglut_stroke_mono_roman.cxx | 2848 ++ .../fltk-1.1.10/src/freeglut_stroke_roman.cxx | 2848 ++ .../windows/fltk-1.1.10/src/freeglut_teapot.cxx | 164 + .../windows/fltk-1.1.10/src/freeglut_teapot_data.h | 145 + third_party/windows/fltk-1.1.10/src/gl_draw.cxx | 223 + third_party/windows/fltk-1.1.10/src/gl_start.cxx | 134 + .../windows/fltk-1.1.10/src/glut_compatability.cxx | 504 + third_party/windows/fltk-1.1.10/src/glut_font.cxx | 199 + third_party/windows/fltk-1.1.10/src/makedepend | 601 + third_party/windows/fltk-1.1.10/src/makefile.wat | 235 + third_party/windows/fltk-1.1.10/src/mediumarrow.h | 6 + third_party/windows/fltk-1.1.10/src/new.xbm | 6 + third_party/windows/fltk-1.1.10/src/ns.xbm | 8 + third_party/windows/fltk-1.1.10/src/ns_mask.xbm | 8 + third_party/windows/fltk-1.1.10/src/numericsort.c | 111 + third_party/windows/fltk-1.1.10/src/scandir.c | 124 + .../windows/fltk-1.1.10/src/scandir_win32.c | 115 + .../windows/fltk-1.1.10/src/screen_xywh.cxx | 256 + third_party/windows/fltk-1.1.10/src/slowarrow.h | 6 + third_party/windows/fltk-1.1.10/src/tile.xpm | 91 + third_party/windows/fltk-1.1.10/src/up.xbm | 6 + third_party/windows/fltk-1.1.10/src/vsnprintf.c | 281 + .../windows/fltk-1.1.10/test/CMakeLists.txt | 96 + third_party/windows/fltk-1.1.10/test/CubeMain.cxx | 49 + third_party/windows/fltk-1.1.10/test/CubeView.cxx | 173 + third_party/windows/fltk-1.1.10/test/CubeView.h | 124 + third_party/windows/fltk-1.1.10/test/CubeViewUI.fl | 75 + third_party/windows/fltk-1.1.10/test/Makefile | 485 + third_party/windows/fltk-1.1.10/test/README | 30 + third_party/windows/fltk-1.1.10/test/adjuster.cxx | 66 + third_party/windows/fltk-1.1.10/test/arc.cxx | 99 + third_party/windows/fltk-1.1.10/test/ask.cxx | 80 + third_party/windows/fltk-1.1.10/test/bitmap.cxx | 147 + .../test/blocks.app/Contents/Info.plist | 44 + .../fltk-1.1.10/test/blocks.app/Contents/PkgInfo | 1 + .../test/blocks.app/Contents/Resources/blocks.icns | Bin 0 -> 51273 bytes third_party/windows/fltk-1.1.10/test/blocks.cxx | 1019 + third_party/windows/fltk-1.1.10/test/boxtype.cxx | 128 + third_party/windows/fltk-1.1.10/test/browser.cxx | 182 + third_party/windows/fltk-1.1.10/test/button.cxx | 68 + third_party/windows/fltk-1.1.10/test/buttons.cxx | 55 + .../test/checkers.app/Contents/Info.plist | 44 + .../fltk-1.1.10/test/checkers.app/Contents/PkgInfo | 1 + .../checkers.app/Contents/Resources/checkers.icns | Bin 0 -> 61470 bytes third_party/windows/fltk-1.1.10/test/checkers.cxx | 1361 + third_party/windows/fltk-1.1.10/test/clock.cxx | 53 + .../windows/fltk-1.1.10/test/colbrowser.cxx | 330 + .../windows/fltk-1.1.10/test/color_chooser.cxx | 152 + third_party/windows/fltk-1.1.10/test/connect.cxx | 77 + third_party/windows/fltk-1.1.10/test/cube.cxx | 199 + third_party/windows/fltk-1.1.10/test/cursor.cxx | 165 + third_party/windows/fltk-1.1.10/test/curve.cxx | 115 + third_party/windows/fltk-1.1.10/test/demo.cxx | 378 + third_party/windows/fltk-1.1.10/test/demo.menu | 89 + .../fltk-1.1.10/test/desktop/blocks-128.png | Bin 0 -> 16233 bytes .../windows/fltk-1.1.10/test/desktop/blocks-32.png | Bin 0 -> 1856 bytes .../fltk-1.1.10/test/desktop/blocks.desktop | 9 + .../fltk-1.1.10/test/desktop/checkers-128.png | Bin 0 -> 23655 bytes .../fltk-1.1.10/test/desktop/checkers-32.png | Bin 0 -> 1871 bytes .../fltk-1.1.10/test/desktop/checkers.desktop | 9 + .../fltk-1.1.10/test/desktop/sudoku-128.png | Bin 0 -> 6514 bytes .../windows/fltk-1.1.10/test/desktop/sudoku-32.png | Bin 0 -> 295 bytes .../fltk-1.1.10/test/desktop/sudoku.desktop | 9 + .../windows/fltk-1.1.10/test/doublebuffer.cxx | 128 + third_party/windows/fltk-1.1.10/test/editor.cxx | 795 + third_party/windows/fltk-1.1.10/test/fast_slow.fl | 40 + .../windows/fltk-1.1.10/test/file_chooser.cxx | 345 + .../windows/fltk-1.1.10/test/fl_jpeg_image.cxx | 203 + third_party/windows/fltk-1.1.10/test/fonts.cxx | 183 + third_party/windows/fltk-1.1.10/test/forms.cxx | 237 + third_party/windows/fltk-1.1.10/test/fractals.cxx | 842 + .../windows/fltk-1.1.10/test/fracviewer.cxx | 506 + third_party/windows/fltk-1.1.10/test/fracviewer.h | 105 + third_party/windows/fltk-1.1.10/test/fromdos.c | 65 + .../windows/fltk-1.1.10/test/fullscreen.cxx | 251 + .../windows/fltk-1.1.10/test/gl_overlay.cxx | 157 + third_party/windows/fltk-1.1.10/test/glpuzzle.cxx | 1486 + third_party/windows/fltk-1.1.10/test/hello.cxx | 47 + third_party/windows/fltk-1.1.10/test/help.cxx | 69 + third_party/windows/fltk-1.1.10/test/iconize.cxx | 83 + third_party/windows/fltk-1.1.10/test/image.cxx | 161 + third_party/windows/fltk-1.1.10/test/inactive.fl | 120 + third_party/windows/fltk-1.1.10/test/input.cxx | 142 + .../windows/fltk-1.1.10/test/input_choice.cxx | 68 + third_party/windows/fltk-1.1.10/test/keyboard.cxx | 158 + third_party/windows/fltk-1.1.10/test/keyboard.h | 46 + .../windows/fltk-1.1.10/test/keyboard_ui.fl | 722 + third_party/windows/fltk-1.1.10/test/label.cxx | 162 + .../windows/fltk-1.1.10/test/line_style.cxx | 154 + .../windows/fltk-1.1.10/test/list_visuals.cxx | 241 + third_party/windows/fltk-1.1.10/test/makedepend | 388 + third_party/windows/fltk-1.1.10/test/makefile.wat | 289 + .../windows/fltk-1.1.10/test/mandelbrot.cxx | 203 + third_party/windows/fltk-1.1.10/test/mandelbrot.h | 74 + .../windows/fltk-1.1.10/test/mandelbrot_ui.fl | 71 + third_party/windows/fltk-1.1.10/test/menubar.cxx | 247 + third_party/windows/fltk-1.1.10/test/message.cxx | 70 + third_party/windows/fltk-1.1.10/test/minimum.cxx | 80 + .../windows/fltk-1.1.10/test/navigation.cxx | 72 + third_party/windows/fltk-1.1.10/test/output.cxx | 105 + third_party/windows/fltk-1.1.10/test/overlay.cxx | 86 + third_party/windows/fltk-1.1.10/test/pack.cxx | 120 + third_party/windows/fltk-1.1.10/test/pixmap.cxx | 102 + .../windows/fltk-1.1.10/test/pixmap_browser.cxx | 123 + .../windows/fltk-1.1.10/test/pixmaps/black_1.xbm | 60 + .../windows/fltk-1.1.10/test/pixmaps/black_2.xbm | 60 + .../windows/fltk-1.1.10/test/pixmaps/black_3.xbm | 60 + .../windows/fltk-1.1.10/test/pixmaps/black_4.xbm | 60 + .../fltk-1.1.10/test/pixmaps/blackking_1.xbm | 60 + .../fltk-1.1.10/test/pixmaps/blackking_2.xbm | 60 + .../fltk-1.1.10/test/pixmaps/blackking_3.xbm | 60 + .../fltk-1.1.10/test/pixmaps/blackking_4.xbm | 60 + .../windows/fltk-1.1.10/test/pixmaps/blast.xpm | 67 + .../windows/fltk-1.1.10/test/pixmaps/block.xcf.gz | Bin 0 -> 2919 bytes .../windows/fltk-1.1.10/test/pixmaps/blue.xpm | 67 + .../windows/fltk-1.1.10/test/pixmaps/blue_bomb.xpm | 67 + .../windows/fltk-1.1.10/test/pixmaps/cyan.xpm | 67 + .../windows/fltk-1.1.10/test/pixmaps/cyan_bomb.xpm | 67 + .../windows/fltk-1.1.10/test/pixmaps/gray.xpm | 67 + .../windows/fltk-1.1.10/test/pixmaps/gray_bomb.xpm | 67 + .../windows/fltk-1.1.10/test/pixmaps/green.xpm | 67 + .../fltk-1.1.10/test/pixmaps/green_bomb.xpm | 67 + .../windows/fltk-1.1.10/test/pixmaps/magenta.xpm | 67 + .../fltk-1.1.10/test/pixmaps/magenta_bomb.xpm | 67 + .../windows/fltk-1.1.10/test/pixmaps/porsche.xpm | 71 + .../windows/fltk-1.1.10/test/pixmaps/porsche1.xpm | 76 + .../windows/fltk-1.1.10/test/pixmaps/red.xpm | 67 + .../windows/fltk-1.1.10/test/pixmaps/red_bomb.xpm | 67 + .../windows/fltk-1.1.10/test/pixmaps/srs.xbm | 67 + .../windows/fltk-1.1.10/test/pixmaps/sudoku.xbm | 14 + .../windows/fltk-1.1.10/test/pixmaps/tile.xpm | 120 + .../windows/fltk-1.1.10/test/pixmaps/white_1.xbm | 60 + .../windows/fltk-1.1.10/test/pixmaps/white_2.xbm | 60 + .../windows/fltk-1.1.10/test/pixmaps/white_3.xbm | 60 + .../windows/fltk-1.1.10/test/pixmaps/white_4.xbm | 60 + .../fltk-1.1.10/test/pixmaps/whiteking_1.xbm | 60 + .../fltk-1.1.10/test/pixmaps/whiteking_2.xbm | 60 + .../fltk-1.1.10/test/pixmaps/whiteking_3.xbm | 60 + .../fltk-1.1.10/test/pixmaps/whiteking_4.xbm | 60 + .../windows/fltk-1.1.10/test/pixmaps/yellow.xpm | 67 + .../fltk-1.1.10/test/pixmaps/yellow_bomb.xpm | 67 + .../windows/fltk-1.1.10/test/preferences.fl | 324 + third_party/windows/fltk-1.1.10/test/radio.fl | 74 + third_party/windows/fltk-1.1.10/test/resize.fl | 54 + third_party/windows/fltk-1.1.10/test/resizebox.cxx | 102 + third_party/windows/fltk-1.1.10/test/rgb.txt | 753 + third_party/windows/fltk-1.1.10/test/scroll.cxx | 144 + third_party/windows/fltk-1.1.10/test/shape.cxx | 117 + third_party/windows/fltk-1.1.10/test/subwindow.cxx | 191 + .../test/sudoku.app/Contents/Info.plist | 44 + .../fltk-1.1.10/test/sudoku.app/Contents/PkgInfo | 1 + .../test/sudoku.app/Contents/Resources/sudoku.icns | Bin 0 -> 34933 bytes third_party/windows/fltk-1.1.10/test/sudoku.cxx | 1335 + third_party/windows/fltk-1.1.10/test/sudoku.ico | Bin 0 -> 766 bytes third_party/windows/fltk-1.1.10/test/sudoku.rc | 72 + third_party/windows/fltk-1.1.10/test/sudokurc.h | 16 + third_party/windows/fltk-1.1.10/test/symbols.cxx | 159 + third_party/windows/fltk-1.1.10/test/tabs.fl | 289 + third_party/windows/fltk-1.1.10/test/threads.cxx | 173 + third_party/windows/fltk-1.1.10/test/threads.h | 81 + third_party/windows/fltk-1.1.10/test/tile.cxx | 92 + .../windows/fltk-1.1.10/test/tiled_image.cxx | 105 + third_party/windows/fltk-1.1.10/test/trackball.c | 324 + third_party/windows/fltk-1.1.10/test/trackball.h | 78 + third_party/windows/fltk-1.1.10/test/unittests.cxx | 299 + third_party/windows/fltk-1.1.10/test/valuators.fl | 198 + .../windows/fltk-1.1.10/vc2005/CubeView.vcproj | 304 + .../windows/fltk-1.1.10/vc2005/adjuster.vcproj | 234 + third_party/windows/fltk-1.1.10/vc2005/arc.vcproj | 234 + third_party/windows/fltk-1.1.10/vc2005/ask.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/bitmap.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/boxtype.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/browser.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/button.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/buttons.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/checkers.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/clock.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/colbrowser.vcproj | 234 + .../fltk-1.1.10/vc2005/color_chooser.vcproj | 232 + third_party/windows/fltk-1.1.10/vc2005/config.h | 195 + third_party/windows/fltk-1.1.10/vc2005/cube.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/cursor.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/curve.vcproj | 234 + third_party/windows/fltk-1.1.10/vc2005/demo.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/doublebuffer.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/editor.vcproj | 236 + .../windows/fltk-1.1.10/vc2005/fast_slow.vcproj | 258 + .../windows/fltk-1.1.10/vc2005/file_chooser.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/fltk.lib.vcproj | 3353 ++ third_party/windows/fltk-1.1.10/vc2005/fltk.sln | 727 + .../windows/fltk-1.1.10/vc2005/fltkdll.vcproj | 3622 ++ .../windows/fltk-1.1.10/vc2005/fltkforms.vcproj | 315 + .../windows/fltk-1.1.10/vc2005/fltkgl.vcproj | 356 + .../windows/fltk-1.1.10/vc2005/fltkimages.vcproj | 365 + .../windows/fltk-1.1.10/vc2005/fluid.vcproj | 647 + .../windows/fltk-1.1.10/vc2005/fonts.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/forms.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/fractals.vcproj | 257 + .../windows/fltk-1.1.10/vc2005/fullscreen.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/gl_overlay.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/glpuzzle.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/hello.vcproj | 234 + third_party/windows/fltk-1.1.10/vc2005/help.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/iconize.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/image.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/inactive.vcproj | 258 + .../windows/fltk-1.1.10/vc2005/input.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/input_choice.vcproj | 234 + third_party/windows/fltk-1.1.10/vc2005/jpeg.vcproj | 1271 + .../windows/fltk-1.1.10/vc2005/keyboard.vcproj | 281 + .../windows/fltk-1.1.10/vc2005/label.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/libpng.vcproj | 525 + .../windows/fltk-1.1.10/vc2005/line_style.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/mandelbrot.vcproj | 281 + .../windows/fltk-1.1.10/vc2005/menubar.vcproj | 232 + .../windows/fltk-1.1.10/vc2005/message.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/minimum.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/navigation.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/output.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/overlay.vcproj | 234 + third_party/windows/fltk-1.1.10/vc2005/pack.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/pixmap.vcproj | 234 + .../fltk-1.1.10/vc2005/pixmap_browser.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/preferences.vcproj | 258 + .../windows/fltk-1.1.10/vc2005/radio.vcproj | 258 + .../windows/fltk-1.1.10/vc2005/resize.vcproj | 258 + .../windows/fltk-1.1.10/vc2005/resizebox.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/scroll.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/shape.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/subwindow.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/sudoku.vcproj | 242 + .../windows/fltk-1.1.10/vc2005/symbols.vcproj | 234 + third_party/windows/fltk-1.1.10/vc2005/tabs.vcproj | 258 + .../windows/fltk-1.1.10/vc2005/threads.vcproj | 234 + third_party/windows/fltk-1.1.10/vc2005/tile.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/tiled_image.vcproj | 234 + .../windows/fltk-1.1.10/vc2005/valuators.vcproj | 258 + third_party/windows/fltk-1.1.10/vc2005/zlib.vcproj | 428 + .../windows/fltk-1.1.10/vcnet/CubeView.vcproj | 227 + .../windows/fltk-1.1.10/vcnet/adjuster.vcproj | 166 + third_party/windows/fltk-1.1.10/vcnet/arc.vcproj | 166 + third_party/windows/fltk-1.1.10/vcnet/ask.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/bitmap.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/blocks.vcproj | 167 + .../windows/fltk-1.1.10/vcnet/boxtype.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/browser.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/button.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/buttons.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/checkers.vcproj | 166 + third_party/windows/fltk-1.1.10/vcnet/clock.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/colbrowser.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/color_chooser.vcproj | 164 + third_party/windows/fltk-1.1.10/vcnet/config.h | 195 + third_party/windows/fltk-1.1.10/vcnet/cube.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/cursor.vcproj | 166 + third_party/windows/fltk-1.1.10/vcnet/curve.vcproj | 166 + third_party/windows/fltk-1.1.10/vcnet/demo.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/doublebuffer.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/editor.vcproj | 168 + .../windows/fltk-1.1.10/vcnet/fast_slow.vcproj | 191 + .../windows/fltk-1.1.10/vcnet/file_chooser.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/fltk.lib.vcproj | 2704 ++ third_party/windows/fltk-1.1.10/vcnet/fltk.sln | 756 + .../windows/fltk-1.1.10/vcnet/fltkdll.vcproj | 2909 ++ .../windows/fltk-1.1.10/vcnet/fltkforms.vcproj | 238 + .../windows/fltk-1.1.10/vcnet/fltkgl.vcproj | 329 + .../windows/fltk-1.1.10/vcnet/fltkimages.vcproj | 278 + third_party/windows/fltk-1.1.10/vcnet/fluid.vcproj | 495 + third_party/windows/fltk-1.1.10/vcnet/fonts.vcproj | 166 + third_party/windows/fltk-1.1.10/vcnet/forms.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/fractals.vcproj | 184 + .../windows/fltk-1.1.10/vcnet/fullscreen.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/gl_overlay.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/glpuzzle.vcproj | 166 + third_party/windows/fltk-1.1.10/vcnet/hello.vcproj | 166 + third_party/windows/fltk-1.1.10/vcnet/help.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/iconize.vcproj | 166 + third_party/windows/fltk-1.1.10/vcnet/image.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/inactive.vcproj | 191 + third_party/windows/fltk-1.1.10/vcnet/input.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/input_choice.vcproj | 167 + third_party/windows/fltk-1.1.10/vcnet/jpeg.vcproj | 994 + .../windows/fltk-1.1.10/vcnet/keyboard.vcproj | 209 + third_party/windows/fltk-1.1.10/vcnet/label.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/libpng.vcproj | 403 + .../windows/fltk-1.1.10/vcnet/line_style.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/mandelbrot.vcproj | 209 + .../windows/fltk-1.1.10/vcnet/menubar.vcproj | 164 + .../windows/fltk-1.1.10/vcnet/message.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/minimum.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/navigation.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/output.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/overlay.vcproj | 166 + third_party/windows/fltk-1.1.10/vcnet/pack.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/pixmap.vcproj | 166 + .../fltk-1.1.10/vcnet/pixmap_browser.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/preferences.vcproj | 191 + third_party/windows/fltk-1.1.10/vcnet/radio.vcproj | 191 + .../windows/fltk-1.1.10/vcnet/resize.vcproj | 191 + .../windows/fltk-1.1.10/vcnet/resizebox.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/scroll.vcproj | 166 + third_party/windows/fltk-1.1.10/vcnet/shape.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/subwindow.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/sudoku.vcproj | 170 + .../windows/fltk-1.1.10/vcnet/symbols.vcproj | 166 + third_party/windows/fltk-1.1.10/vcnet/tabs.vcproj | 191 + .../windows/fltk-1.1.10/vcnet/threads.vcproj | 166 + third_party/windows/fltk-1.1.10/vcnet/tile.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/tiled_image.vcproj | 166 + .../windows/fltk-1.1.10/vcnet/valuators.vcproj | 192 + third_party/windows/fltk-1.1.10/vcnet/zlib.vcproj | 326 + .../windows/fltk-1.1.10/visualc/CubeView.dsp | 136 + .../windows/fltk-1.1.10/visualc/adjuster.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/arc.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/ask.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/bitmap.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/blocks.dsp | 97 + .../windows/fltk-1.1.10/visualc/boxtype.dsp | 97 + .../windows/fltk-1.1.10/visualc/browser.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/button.dsp | 97 + .../windows/fltk-1.1.10/visualc/buttons.dsp | 97 + .../windows/fltk-1.1.10/visualc/checkers.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/clock.dsp | 97 + .../windows/fltk-1.1.10/visualc/colbrowser.dsp | 97 + .../windows/fltk-1.1.10/visualc/color_chooser.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/config.h | 195 + third_party/windows/fltk-1.1.10/visualc/cube.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/cursor.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/curve.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/demo.dsp | 97 + .../windows/fltk-1.1.10/visualc/doublebuffer.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/editor.dsp | 97 + .../windows/fltk-1.1.10/visualc/fast_slow.dsp | 128 + .../windows/fltk-1.1.10/visualc/file_chooser.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/fltk.dsw | 1394 + .../windows/fltk-1.1.10/visualc/fltk.lib.dsp | 613 + .../windows/fltk-1.1.10/visualc/fltkdll.dsp | 2786 ++ .../windows/fltk-1.1.10/visualc/fltkforms.dsp | 109 + third_party/windows/fltk-1.1.10/visualc/fltkgl.dsp | 133 + .../windows/fltk-1.1.10/visualc/fltkimages.dsp | 117 + third_party/windows/fltk-1.1.10/visualc/fluid.dsp | 170 + third_party/windows/fltk-1.1.10/visualc/fonts.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/forms.dsp | 97 + .../windows/fltk-1.1.10/visualc/fractals.dsp | 101 + .../windows/fltk-1.1.10/visualc/fullscreen.dsp | 97 + .../windows/fltk-1.1.10/visualc/gl_overlay.dsp | 97 + .../windows/fltk-1.1.10/visualc/glpuzzle.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/hello.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/help.dsp | 97 + .../windows/fltk-1.1.10/visualc/iconize.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/image.dsp | 97 + .../windows/fltk-1.1.10/visualc/inactive.dsp | 128 + third_party/windows/fltk-1.1.10/visualc/input.dsp | 97 + .../windows/fltk-1.1.10/visualc/input_choice.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/jpeg.dsp | 280 + .../windows/fltk-1.1.10/visualc/keyboard.dsp | 132 + third_party/windows/fltk-1.1.10/visualc/label.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/libpng.dsp | 145 + .../windows/fltk-1.1.10/visualc/line_style.dsp | 97 + .../windows/fltk-1.1.10/visualc/mandelbrot.dsp | 132 + .../windows/fltk-1.1.10/visualc/menubar.dsp | 97 + .../windows/fltk-1.1.10/visualc/message.dsp | 97 + .../windows/fltk-1.1.10/visualc/minimum.dsp | 97 + .../windows/fltk-1.1.10/visualc/navigation.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/output.dsp | 97 + .../windows/fltk-1.1.10/visualc/overlay.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/pack.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/pixmap.dsp | 97 + .../windows/fltk-1.1.10/visualc/pixmap_browser.dsp | 97 + .../windows/fltk-1.1.10/visualc/preferences.dsp | 128 + third_party/windows/fltk-1.1.10/visualc/radio.dsp | 128 + third_party/windows/fltk-1.1.10/visualc/resize.dsp | 128 + .../windows/fltk-1.1.10/visualc/resizebox.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/scroll.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/shape.dsp | 97 + .../windows/fltk-1.1.10/visualc/subwindow.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/sudoku.dsp | 105 + .../windows/fltk-1.1.10/visualc/symbols.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/tabs.dsp | 128 + .../windows/fltk-1.1.10/visualc/threads.dsp | 97 + third_party/windows/fltk-1.1.10/visualc/tile.dsp | 97 + .../windows/fltk-1.1.10/visualc/tiled_image.dsp | 97 + .../windows/fltk-1.1.10/visualc/valuators.dsp | 128 + third_party/windows/fltk-1.1.10/visualc/zlib.dsp | 129 + third_party/windows/fltk-1.1.10/watcom.mif | 279 + third_party/windows/fltk-1.1.10/watcom/config.h | 229 + third_party/windows/fltk-1.1.10/watcom/makefile | 114 + third_party/windows/fltk-1.1.10/watcom/readme.wat | 46 + .../windows/fltk-1.1.10/zlib/CMakeLists.txt | 15 + third_party/windows/fltk-1.1.10/zlib/ChangeLog | 855 + third_party/windows/fltk-1.1.10/zlib/FAQ | 339 + third_party/windows/fltk-1.1.10/zlib/INDEX | 51 + third_party/windows/fltk-1.1.10/zlib/Makefile | 108 + third_party/windows/fltk-1.1.10/zlib/README | 125 + third_party/windows/fltk-1.1.10/zlib/adler32.c | 149 + third_party/windows/fltk-1.1.10/zlib/algorithm.txt | 209 + third_party/windows/fltk-1.1.10/zlib/compress.c | 79 + third_party/windows/fltk-1.1.10/zlib/crc32.c | 423 + third_party/windows/fltk-1.1.10/zlib/crc32.h | 441 + third_party/windows/fltk-1.1.10/zlib/deflate.c | 1736 + third_party/windows/fltk-1.1.10/zlib/deflate.h | 331 + third_party/windows/fltk-1.1.10/zlib/gzio.c | 1026 + third_party/windows/fltk-1.1.10/zlib/inffast.c | 318 + third_party/windows/fltk-1.1.10/zlib/inffast.h | 11 + third_party/windows/fltk-1.1.10/zlib/inffixed.h | 94 + third_party/windows/fltk-1.1.10/zlib/inflate.c | 1368 + third_party/windows/fltk-1.1.10/zlib/inflate.h | 115 + third_party/windows/fltk-1.1.10/zlib/inftrees.c | 329 + third_party/windows/fltk-1.1.10/zlib/inftrees.h | 55 + third_party/windows/fltk-1.1.10/zlib/makedepend | 13 + third_party/windows/fltk-1.1.10/zlib/makefile.wat | 60 + third_party/windows/fltk-1.1.10/zlib/trees.c | 1219 + third_party/windows/fltk-1.1.10/zlib/trees.h | 128 + third_party/windows/fltk-1.1.10/zlib/uncompr.c | 61 + third_party/windows/fltk-1.1.10/zlib/zconf.h | 332 + third_party/windows/fltk-1.1.10/zlib/zlib.3 | 159 + third_party/windows/fltk-1.1.10/zlib/zlib.h | 1357 + third_party/windows/fltk-1.1.10/zlib/zutil.c | 318 + third_party/windows/fltk-1.1.10/zlib/zutil.h | 269 + 2998 files changed, 860666 insertions(+) create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo1/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo1/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo1/readme.txt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo2/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo2/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo2/readme.txt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Makefile create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/ParTest/ParTest.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/DriverLib.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/debug.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/gpio.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_ints.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_memmap.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_nvic.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_ssi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_sysctl.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_types.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_uart.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/interrupt.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/pdc.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/pdc.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/ssi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/sysctl.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/uart.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/init/startup.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/makedefs create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/standalone.ld create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/readme.txt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/readme.txt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Opt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Uv2 create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/ParTest/ParTest.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/init/Startup.s create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/ParTest.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/vectors.s create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/ParTest.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/vectors.s create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/ParTest.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/vectors.s create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/RTOSDemo.hzp create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/RTOSDemo.hzs create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/DriverLib.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/EULA.txt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/comp.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/cpu.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/debug.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/flash.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/gpio.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_comp.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_flash.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_gpio.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_i2c.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_ints.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_memmap.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_nvic.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_ssi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_sysctl.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_timer.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_types.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_uart.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_watchdog.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/i2c.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/interrupt.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/pdc.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/pdc.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/ssi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/sysctl.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/systick.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/timer.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/uart.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/watchdog.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/LM3S316.icf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/ParTest/ParTest.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.ewd create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.ewp create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.eww create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/commstest.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/commstest.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/DriverLib.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/EULA.txt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/adc.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/asmdefs.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/comp.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/cpu.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/cspy.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/debug.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/diag.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/driverlib.r79 create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/flash.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/gpio.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_adc.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_comp.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_flash.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_gpio.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_i2c.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_ints.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_memmap.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_nvic.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_pwm.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_ssi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_sysctl.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_timer.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_types.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_uart.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_watchdog.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/i2c.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/interrupt.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/pdc.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/pdc.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/pwm.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/ssi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/startup.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/sysctl.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/systick.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/timer.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/uart.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/watchdog.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/registertest.s create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.dbgdt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.dni create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.wsdt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/driverlib.wsdt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/Makefile create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/DriverLib.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/EULA.txt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/adc.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/adc.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/comp.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/comp.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/cpu.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/debug.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/driverlib.r79 create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/flash.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/flash.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/gpio.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/gpio.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_adc.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_comp.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_flash.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_gpio.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_i2c.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_ints.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_memmap.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_nvic.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_pwm.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_qei.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_ssi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_sysctl.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_timer.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_types.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_uart.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_watchdog.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/i2c.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/i2c.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/interrupt.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/interrupt.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/osram96x16.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/osram96x16.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/pwm.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/pwm.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/qei.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/qei.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/ssi.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/ssi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/sysctl.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/sysctl.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/systick.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/systick.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/timer.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/timer.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/uart.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/uart.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/watchdog.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/watchdog.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/init/startup.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/makedefs create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/standalone.ld create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LM3S811.icf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/DriverLib.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/EULA.txt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/adc.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/adc.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/comp.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/comp.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/cpu.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/debug.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/driverlib.r79 create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/flash.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/flash.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/gpio.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/gpio.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_adc.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_comp.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_flash.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_gpio.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_i2c.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_ints.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_memmap.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_nvic.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_pwm.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_qei.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_ssi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_sysctl.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_timer.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_types.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_uart.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_watchdog.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/i2c.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/i2c.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/interrupt.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/interrupt.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/osram96x16.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/osram96x16.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/pwm.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/pwm.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/qei.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/qei.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/ssi.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/ssi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/sysctl.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/sysctl.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/systick.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/systick.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/timer.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/timer.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/uart.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/uart.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/watchdog.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/watchdog.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.ewd create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.ewp create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.eww create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/startup.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/DriverLib.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_adc.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_comp.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_flash.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_gpio.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_i2c.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_ints.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_memmap.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_nvic.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_pwm.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_qei.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_ssi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_sysctl.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_timer.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_types.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_uart.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_watchdog.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/osram96x16.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/osram96x16.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/adc.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/comp.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/cpu.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/debug.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/flash.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/gpio.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/i2c.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/interrupt.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/pwm.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/qei.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/ssi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/sysctl.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/systick.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/timer.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/uart.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/watchdog.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/RTOSDemo.Opt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/RTOSDemo.Uv2 create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/heap/heap_1.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/readme.txt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/startup_rvmdk.S create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/IntQueueTimer.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/IntQueueTimer.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/Makefile create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/ParTest/ParTest.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/bitmap.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/formike128x128x16.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/formike128x128x16.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/lcd_message.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/osram128x64x4.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/osram128x64x4.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/pack_struct_end.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/pack_struct_start.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/rit128x96x4.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/standalone.ld create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/startup.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/timertest.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/Makefile.webserver create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/clock-arch.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/emac.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/emac.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/http-strings create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/http-strings.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/http-strings.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-cgi.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-cgi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/404.html create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/index.html create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/index.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/io.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/runtime.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/stats.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/tcp.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fsdata.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fsdata.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/makefsdata create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/makestrings create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/uIP_Task.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/uip-conf.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/webserver.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/fury_ft2232.cfg create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/fury_ft2232_flash.cfg create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/program.script create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Backup of RTOSDemo.ewd create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Backup of RTOSDemo.ewp create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Exe/RTOSDemo.out create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Exe/RTOSDemo.sim create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/BlockQ.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/GenQTest.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/ParTest.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/PollQ.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/QPeek.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/RTOSDemo.pbd create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/blocktim.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/death.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/emac.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/flash.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/heap_2.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/http-strings.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/httpd-cgi.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/httpd-fs.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/httpd.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/integer.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/list.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/main.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/osram128x64x4.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/port.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/psock.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/queue.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/rit128x96x4.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/semtest.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/startup_ewarm.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/tasks.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/timer.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/timertest.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uIP_Task.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uip.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uip_arp.pbi create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/IntQueueTimer.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/IntQueueTimer.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/LM3Sxxxx.icf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/ParTest/ParTest.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.Uv2.bak create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.dep create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.ewd create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.ewp create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.eww create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.opt.bak create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvgui.a0190789 create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvgui_a0190789.bak create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvopt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvproj create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.xcl create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo_FreeRTOS_Demo.dep create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo_uvopt.bak create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/bitmap.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/formike128x128x16.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/formike128x128x16.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/lcd_message.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/osram128x64x4.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/osram128x64x4.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rit128x96x4.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/ExtDll.iex create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.axf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.bin create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.lnp create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.map create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.plg create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.sct create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.tra create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/blockq.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/blocktim.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/death.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/emac.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/emac.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/formike128x128x16.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/formike128x128x16.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/genqtest.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/heap_2.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/heap_2.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/http-strings.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/http-strings.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-cgi.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-cgi.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-fs.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-fs.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/integer.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/intqueue.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/intqueuetimer.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/list.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/list.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/main.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/main.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/osram128x64x4.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/osram128x64x4.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/partest.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/pollq.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/port.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/port.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/psock.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/psock.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/qpeek.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/queue.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/queue.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/recmutex.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/rit128x96x4.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/semtest.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/tasks.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/tasks.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timer.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timer.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timertest.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_arp.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_arp.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_task.__i create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_task.crf create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.cspy.bat create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.dbgdt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.dni create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.wsdt create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/startup_ewarm.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/startup_rvmdk.S create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/timertest.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/Makefile.webserver create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/clock-arch.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/emac.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/emac.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/http-strings create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/http-strings.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/http-strings.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-cgi.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-cgi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/404.html create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/index.html create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/index.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/io.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/stats.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/tcp.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fsdata.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fsdata.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/makefsdata create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/makestrings create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/uIP_Task.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/uip-conf.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/webserver.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/IntQueueTimer.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/IntQueueTimer.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/LM3S_Startup.s create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/LM3S_Target.js create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/ParTest/ParTest.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/RTOSDemo.hzp create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/RTOSDemo.hzs create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/bitmap.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/formike128x128x16.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/formike128x128x16.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/lcd_message.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/osram128x64x4.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/osram128x64x4.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/pack_struct_end.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/pack_struct_start.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/rit128x96x4.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/thumb_crt0.s create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/timertest.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/Makefile.webserver create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/clock-arch.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/emac.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/emac.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/http-strings create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/http-strings.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/http-strings.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-cgi.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-cgi.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/404.html create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/index.html create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/index.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/io.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/runtime.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/stats.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/tcp.shtml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fsdata.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fsdata.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/makefsdata create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/makestrings create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/uIP_Task.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/uip-conf.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/webserver.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/FreeRTOSConfig.h create mode 100644 third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/LM3S_Startup.s create mode 100644 third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/LM3S_Target.js create mode 100644 third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/RTOSDemo.hzp create mode 100644 third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/RTOSDemo.hzs create mode 100644 third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/flash_placement.xml create mode 100644 third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/main.c create mode 100644 third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/thumb_crt0.s create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/00index_e.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/00index_j.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/css_e.css create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/css_j.css create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/appnote.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/chdir.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/chdrive.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/chmod.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/close.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dinit.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dioctl.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dread.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dstat.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dwrite.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/fattime.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/filename.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/forward.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/getfree.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/gets.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/lseek.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/mkdir.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/mkfs.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/mount.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/open.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/opendir.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/printf.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/putc.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/puts.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/read.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/readdir.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/rename.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sdir.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sfatfs.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sfile.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sfileinfo.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/stat.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sync.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/truncate.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/unlink.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/utime.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/write.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f1.png create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f2.png create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f3.png create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f4.png create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f5.png create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/layers.png create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/rwtest.png create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/rwtest2.png create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/appnote.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/chdir.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/chdrive.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/chmod.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/close.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dinit.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dioctl.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dread.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dstat.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dwrite.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/fattime.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/filename.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/forward.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/getfree.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/gets.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/lseek.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/mkdir.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/mkfs.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/mount.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/open.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/opendir.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/printf.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/putc.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/puts.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/read.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/readdir.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/rename.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sdir.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sfatfs.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sfile.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sfileinfo.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/stat.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sync.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/truncate.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/unlink.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/utime.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/write.html create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/updates.txt create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/00readme.txt create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/Copy of ff.c create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/fat_integer.h create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/ff.c create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/ff.h create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc932.c create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc936.c create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc949.c create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc950.c create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/ccsbcs.c create mode 100644 third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/syncobj.c create mode 100644 third_party/FreeRTOS/Demo/Common/Full/BlockQ.c create mode 100644 third_party/FreeRTOS/Demo/Common/Full/PollQ.c create mode 100644 third_party/FreeRTOS/Demo/Common/Full/comtest.c create mode 100644 third_party/FreeRTOS/Demo/Common/Full/death.c create mode 100644 third_party/FreeRTOS/Demo/Common/Full/dynamic.c create mode 100644 third_party/FreeRTOS/Demo/Common/Full/events.c create mode 100644 third_party/FreeRTOS/Demo/Common/Full/flash.c create mode 100644 third_party/FreeRTOS/Demo/Common/Full/flop.c create mode 100644 third_party/FreeRTOS/Demo/Common/Full/integer.c create mode 100644 third_party/FreeRTOS/Demo/Common/Full/print.c create mode 100644 third_party/FreeRTOS/Demo/Common/Full/semtest.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/AltBlckQ.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/AltBlock.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/AltPollQ.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/AltQTest.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/BlockQ.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/GenQTest.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/IntQueue.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/PollQ.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/QPeek.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/TimerDemo.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/blocktim.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/comtest.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/comtest_strings.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/countsem.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/crflash.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/crhook.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/death.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/dynamic.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/flash.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/flash_timer.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/flop.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/integer.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/recmutex.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/semtest.c create mode 100644 third_party/FreeRTOS/Demo/Common/Minimal/sp_flop.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/Makefile.include create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/clock-arch.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/clock.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/lc-addrlabels.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/lc-switch.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/lc.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/psock.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/psock.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/pt.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/timer.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/timer.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-fw.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-neighbor.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-split.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-split.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_arch.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_arp.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_arp.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_timer.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uiplib.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uiplib.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uipopt.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/http-strings.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/http-strings.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-cgi.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-cgi.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-fs.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-fs.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-fsdata.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/makefsdata create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/clock-arch.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/lc-switch.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/lc.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/pack_struct_end.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/pack_struct_start.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/psock.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/pt.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uip.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uip_arch.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uip_arp.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uipopt.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/psock.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/sys/clock.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/sys/pt.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/sys/timer.h create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/timer.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/uip.c create mode 100644 third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/uip_arp.c create mode 100644 third_party/FreeRTOS/Demo/Common/include/AltBlckQ.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/AltBlock.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/AltPollQ.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/AltQTest.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/BlockQ.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/GenQTest.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/IntQueue.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/PollQ.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/QPeek.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/TimerDemo.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/blocktim.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/comtest.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/comtest2.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/comtest_strings.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/countsem.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/crflash.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/crhook.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/death.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/dynamic.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/fileIO.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/flash.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/flash_timer.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/flop.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/integer.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/mevents.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/partest.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/print.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/recmutex.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/semtest.h create mode 100644 third_party/FreeRTOS/Demo/Common/include/serial.h create mode 100644 third_party/FreeRTOS/Demo/readme.txt create mode 100644 third_party/FreeRTOS/License/license.txt create mode 100644 third_party/FreeRTOS/Source/croutine.c create mode 100644 third_party/FreeRTOS/Source/include/FreeRTOS.h create mode 100644 third_party/FreeRTOS/Source/include/StackMacros.h create mode 100644 third_party/FreeRTOS/Source/include/croutine.h create mode 100644 third_party/FreeRTOS/Source/include/list.h create mode 100644 third_party/FreeRTOS/Source/include/mpu_wrappers.h create mode 100644 third_party/FreeRTOS/Source/include/portable.h create mode 100644 third_party/FreeRTOS/Source/include/projdefs.h create mode 100644 third_party/FreeRTOS/Source/include/queue.h create mode 100644 third_party/FreeRTOS/Source/include/semphr.h create mode 100644 third_party/FreeRTOS/Source/include/task.h create mode 100644 third_party/FreeRTOS/Source/include/timers.h create mode 100644 third_party/FreeRTOS/Source/list.c create mode 100644 third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c create mode 100644 third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm create mode 100644 third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/portmacro.h create mode 100644 third_party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c create mode 100644 third_party/FreeRTOS/Source/portable/GCC/ARM_CM3/portmacro.h create mode 100644 third_party/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c create mode 100644 third_party/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/portmacro.h create mode 100644 third_party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c create mode 100644 third_party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h create mode 100644 third_party/FreeRTOS/Source/portable/IAR/ARM_CM3/port.c create mode 100644 third_party/FreeRTOS/Source/portable/IAR/ARM_CM3/portasm.s create mode 100644 third_party/FreeRTOS/Source/portable/IAR/ARM_CM3/portmacro.h create mode 100644 third_party/FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c create mode 100644 third_party/FreeRTOS/Source/portable/IAR/ARM_CM4F/portasm.s create mode 100644 third_party/FreeRTOS/Source/portable/IAR/ARM_CM4F/portmacro.h create mode 100644 third_party/FreeRTOS/Source/portable/Keil/See-also-the-RVDS-directory.txt create mode 100644 third_party/FreeRTOS/Source/portable/MemMang/heap_1.c create mode 100644 third_party/FreeRTOS/Source/portable/MemMang/heap_2.c create mode 100644 third_party/FreeRTOS/Source/portable/MemMang/heap_3.c create mode 100644 third_party/FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c create mode 100644 third_party/FreeRTOS/Source/portable/RVDS/ARM_CM3/portmacro.h create mode 100644 third_party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c create mode 100644 third_party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/portmacro.h create mode 100644 third_party/FreeRTOS/Source/portable/readme.txt create mode 100644 third_party/FreeRTOS/Source/queue.c create mode 100644 third_party/FreeRTOS/Source/readme.txt create mode 100644 third_party/FreeRTOS/Source/tasks.c create mode 100644 third_party/FreeRTOS/Source/timers.c create mode 100644 third_party/FreeRTOS/TraceCon/readme.txt create mode 100755 third_party/FreeRTOS/TraceCon/tracecon_big_endian_untested.exe create mode 100755 third_party/FreeRTOS/TraceCon/tracecon_little_endian.exe create mode 100644 third_party/FreeRTOS/readme.txt create mode 100644 third_party/bget/bget.c create mode 100644 third_party/bget/bget.h create mode 100644 third_party/exosite/LICENSE create mode 100644 third_party/exosite/exosite.c create mode 100644 third_party/exosite/exosite.h create mode 100644 third_party/exosite/exosite_meta.c create mode 100644 third_party/exosite/exosite_meta.h create mode 100644 third_party/fatfs/doc/00index_e.html create mode 100644 third_party/fatfs/doc/00index_j.html create mode 100644 third_party/fatfs/doc/css_e.css create mode 100644 third_party/fatfs/doc/css_j.css create mode 100644 third_party/fatfs/doc/en/appnote.html create mode 100644 third_party/fatfs/doc/en/chmod.html create mode 100644 third_party/fatfs/doc/en/close.html create mode 100644 third_party/fatfs/doc/en/dinit.html create mode 100644 third_party/fatfs/doc/en/dioctl.html create mode 100644 third_party/fatfs/doc/en/dread.html create mode 100644 third_party/fatfs/doc/en/dstat.html create mode 100644 third_party/fatfs/doc/en/dwrite.html create mode 100644 third_party/fatfs/doc/en/fattime.html create mode 100644 third_party/fatfs/doc/en/filename.html create mode 100644 third_party/fatfs/doc/en/getfree.html create mode 100644 third_party/fatfs/doc/en/lseek.html create mode 100644 third_party/fatfs/doc/en/mkdir.html create mode 100644 third_party/fatfs/doc/en/mkfs.html create mode 100644 third_party/fatfs/doc/en/mount.html create mode 100644 third_party/fatfs/doc/en/mountdrv.html create mode 100644 third_party/fatfs/doc/en/open.html create mode 100644 third_party/fatfs/doc/en/opendir.html create mode 100644 third_party/fatfs/doc/en/read.html create mode 100644 third_party/fatfs/doc/en/readdir.html create mode 100644 third_party/fatfs/doc/en/rename.html create mode 100644 third_party/fatfs/doc/en/sdir.html create mode 100644 third_party/fatfs/doc/en/sfatfs.html create mode 100644 third_party/fatfs/doc/en/sfile.html create mode 100644 third_party/fatfs/doc/en/sfileinfo.html create mode 100644 third_party/fatfs/doc/en/stat.html create mode 100644 third_party/fatfs/doc/en/sync.html create mode 100644 third_party/fatfs/doc/en/unlink.html create mode 100644 third_party/fatfs/doc/en/write.html create mode 100644 third_party/fatfs/doc/img/f1.png create mode 100644 third_party/fatfs/doc/img/f2.png create mode 100644 third_party/fatfs/doc/img/f3.png create mode 100644 third_party/fatfs/doc/img/f4.png create mode 100644 third_party/fatfs/doc/img/f5.png create mode 100644 third_party/fatfs/doc/img/layers.png create mode 100644 third_party/fatfs/doc/img/rw_ata.jpeg create mode 100644 third_party/fatfs/doc/img/rw_cfc.jpeg create mode 100644 third_party/fatfs/doc/img/rw_mmc.jpeg create mode 100644 third_party/fatfs/doc/img/rwtest.png create mode 100644 third_party/fatfs/doc/ja/appnote.html create mode 100644 third_party/fatfs/doc/ja/chmod.html create mode 100644 third_party/fatfs/doc/ja/close.html create mode 100644 third_party/fatfs/doc/ja/dinit.html create mode 100644 third_party/fatfs/doc/ja/dioctl.html create mode 100644 third_party/fatfs/doc/ja/dread.html create mode 100644 third_party/fatfs/doc/ja/dstat.html create mode 100644 third_party/fatfs/doc/ja/dwrite.html create mode 100644 third_party/fatfs/doc/ja/fattime.html create mode 100644 third_party/fatfs/doc/ja/filename.html create mode 100644 third_party/fatfs/doc/ja/getfree.html create mode 100644 third_party/fatfs/doc/ja/lseek.html create mode 100644 third_party/fatfs/doc/ja/mkdir.html create mode 100644 third_party/fatfs/doc/ja/mkfs.html create mode 100644 third_party/fatfs/doc/ja/mount.html create mode 100644 third_party/fatfs/doc/ja/mountdrv.html create mode 100644 third_party/fatfs/doc/ja/open.html create mode 100644 third_party/fatfs/doc/ja/opendir.html create mode 100644 third_party/fatfs/doc/ja/read.html create mode 100644 third_party/fatfs/doc/ja/readdir.html create mode 100644 third_party/fatfs/doc/ja/rename.html create mode 100644 third_party/fatfs/doc/ja/sdir.html create mode 100644 third_party/fatfs/doc/ja/sfatfs.html create mode 100644 third_party/fatfs/doc/ja/sfile.html create mode 100644 third_party/fatfs/doc/ja/sfileinfo.html create mode 100644 third_party/fatfs/doc/ja/stat.html create mode 100644 third_party/fatfs/doc/ja/sync.html create mode 100644 third_party/fatfs/doc/ja/unlink.html create mode 100644 third_party/fatfs/doc/ja/write.html create mode 100644 third_party/fatfs/doc/updates.txt create mode 100644 third_party/fatfs/port/dual-disk-driver.c create mode 100644 third_party/fatfs/port/fat_usbmsc.c create mode 100644 third_party/fatfs/port/mmc-dk-tm4c123g.c create mode 100644 third_party/fatfs/port/mmc-dk-tm4c129x.c create mode 100644 third_party/fatfs/port/mmc-ek-lm4f232.c create mode 100644 third_party/fatfs/port/mmc-ek-tm4c1294xl.c create mode 100644 third_party/fatfs/port/sample-mmc.c create mode 100644 third_party/fatfs/src/00readme.txt create mode 100644 third_party/fatfs/src/diskio.h create mode 100644 third_party/fatfs/src/ff.c create mode 100644 third_party/fatfs/src/ff.h create mode 100644 third_party/fatfs/src/ffconf.h create mode 100644 third_party/fatfs/src/integer.h create mode 100644 third_party/fatfs/src/option/cc932.c create mode 100644 third_party/fatfs/src/option/cc936.c create mode 100644 third_party/fatfs/src/option/cc949.c create mode 100644 third_party/fatfs/src/option/cc950.c create mode 100644 third_party/fatfs/src/option/ccsbcs.c create mode 100644 third_party/fatfs/src/option/syscall.c create mode 100644 third_party/fatfs/src/option/unicode.c create mode 100644 third_party/fonts/apl/AUTHORS create mode 100644 third_party/fonts/apl/COPYRIGHT create mode 100644 third_party/fonts/apl/Changelog create mode 100644 third_party/fonts/apl/Changelog.big5 create mode 100644 third_party/fonts/apl/apl_fonts.h create mode 100644 third_party/fonts/apl/binfonts/fontfireflysung6x12.bin create mode 100644 third_party/fonts/apl/binfonts/fontfireflysung6x14.bin create mode 100644 third_party/fonts/apl/binfonts/fontfireflysung7x14.bin create mode 100644 third_party/fonts/apl/binfonts/fontfireflysung7x15.bin create mode 100644 third_party/fonts/apl/fonts/fontfireflysung6x12.c create mode 100644 third_party/fonts/apl/fonts/fontfireflysung6x14.c create mode 100644 third_party/fonts/apl/fonts/fontfireflysung7x14.c create mode 100644 third_party/fonts/apl/fonts/fontfireflysung7x15.c create mode 100644 third_party/fonts/apl/license/big5/ARPHICPL.TXT create mode 100644 third_party/fonts/apl/license/english/ARPHICPL.TXT create mode 100644 third_party/fonts/apl/license/gb/ARPHICPL.TXT create mode 100644 third_party/fonts/apl/readme.txt create mode 100644 third_party/fonts/apl/ttf/fireflysung.ttf create mode 100644 third_party/fonts/lang_demo/Makefile create mode 100644 third_party/fonts/lang_demo/fontcustom14pt.c create mode 100644 third_party/fonts/lang_demo/fontcustom20pt.c create mode 100644 third_party/fonts/lang_demo/fontcustomr14pt.c create mode 100644 third_party/fonts/lang_demo/fontcustomr20pt.c create mode 100644 third_party/fonts/lang_demo/langremap.c create mode 100644 third_party/fonts/lang_demo/langremap.h create mode 100644 third_party/fonts/lang_demo/language.c create mode 100644 third_party/fonts/lang_demo/language.csv create mode 100644 third_party/fonts/lang_demo/language.h create mode 100644 third_party/fonts/lang_demo/readme.txt create mode 100644 third_party/fonts/ofl/OFL.txt create mode 100644 third_party/fonts/ofl/binfonts/fonthandwriting14pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthandwriting16pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthandwriting18pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthandwriting20pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthandwriting22pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthandwriting24pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthandwriting26pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthandwriting28pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthandwriting30pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulgothic16pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulgothic16ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulgothic18pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulgothic18ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulgothic20pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulgothic20ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulgothic22pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulgothic22ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulgothic24pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulgothic24ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulmyeongjo16pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulmyeongjo16ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulmyeongjo18pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulmyeongjo18ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulmyeongjo20pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulmyeongjo20ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulmyeongjo22pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulmyeongjo22ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulmyeongjo24pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonthangulmyeongjo24ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard14pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard14ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard14pti.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard16pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard16ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard16pti.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard18pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard18ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard18pti.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard20pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard20ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard20pti.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard22pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard22ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard22pti.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard24pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard24ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard24pti.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard26pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard26ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard26pti.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard28pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard28ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard28pti.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard30pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard30ptb.bin create mode 100644 third_party/fonts/ofl/binfonts/fontoldstandard30pti.bin create mode 100644 third_party/fonts/ofl/binfonts/fontsansand14pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontsansand16pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontsansand18pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontsansand20pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontsansand22pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontsansand24pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontsansand26pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontsansand28pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fontsansand30pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanodidot14pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanodidot16pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanodidot18pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanodidot20pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanodidot22pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanodidot24pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanodidot26pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanodidot28pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanodidot30pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanomodern14pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanomodern16pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanomodern18pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanomodern20pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanomodern22pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanomodern24pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanomodern26pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanomodern28pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanomodern30pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanooldstyle14pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanooldstyle16pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanooldstyle18pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanooldstyle20pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanooldstyle22pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanooldstyle24pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanooldstyle26pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanooldstyle28pt.bin create mode 100644 third_party/fonts/ofl/binfonts/fonttheanooldstyle30pt.bin create mode 100644 third_party/fonts/ofl/fonts/fontcjktest20pt.c create mode 100644 third_party/fonts/ofl/fonts/fonthandwriting14.c create mode 100644 third_party/fonts/ofl/fonts/fonthandwriting16.c create mode 100644 third_party/fonts/ofl/fonts/fonthandwriting18.c create mode 100644 third_party/fonts/ofl/fonts/fonthandwriting20.c create mode 100644 third_party/fonts/ofl/fonts/fonthandwriting22.c create mode 100644 third_party/fonts/ofl/fonts/fonthandwriting24.c create mode 100644 third_party/fonts/ofl/fonts/fonthandwriting26.c create mode 100644 third_party/fonts/ofl/fonts/fonthandwriting28.c create mode 100644 third_party/fonts/ofl/fonts/fonthandwriting30.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulgothic16pt.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulgothic16ptb.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulgothic18pt.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulgothic18ptb.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulgothic20pt.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulgothic20ptb.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulgothic22pt.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulgothic22ptb.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulgothic24pt.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulgothic24ptb.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulmyeongjo16pt.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulmyeongjo16ptb.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulmyeongjo18pt.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulmyeongjo18ptb.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulmyeongjo20pt.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulmyeongjo20ptb.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulmyeongjo22pt.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulmyeongjo22ptb.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulmyeongjo24pt.c create mode 100644 third_party/fonts/ofl/fonts/fonthangulmyeongjo24ptb.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard14.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard14b.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard14i.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard16.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard16b.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard16i.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard18.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard18b.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard18i.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard20.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard20b.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard20i.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard22.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard22b.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard22i.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard24.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard24b.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard24i.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard26.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard26b.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard26i.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard28.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard28b.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard28i.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard30.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard30b.c create mode 100644 third_party/fonts/ofl/fonts/fontoldstandard30i.c create mode 100644 third_party/fonts/ofl/fonts/fontsansand14.c create mode 100644 third_party/fonts/ofl/fonts/fontsansand16.c create mode 100644 third_party/fonts/ofl/fonts/fontsansand18.c create mode 100644 third_party/fonts/ofl/fonts/fontsansand20.c create mode 100644 third_party/fonts/ofl/fonts/fontsansand22.c create mode 100644 third_party/fonts/ofl/fonts/fontsansand24.c create mode 100644 third_party/fonts/ofl/fonts/fontsansand26.c create mode 100644 third_party/fonts/ofl/fonts/fontsansand28.c create mode 100644 third_party/fonts/ofl/fonts/fontsansand30.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanodidot14.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanodidot16.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanodidot18.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanodidot20.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanodidot22.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanodidot24.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanodidot26.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanodidot28.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanodidot30.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanomodern14.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanomodern16.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanomodern18.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanomodern20.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanomodern22.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanomodern24.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanomodern26.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanomodern28.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanomodern30.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanooldstyle14.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanooldstyle16.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanooldstyle18.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanooldstyle20.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanooldstyle22.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanooldstyle24.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanooldstyle26.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanooldstyle28.c create mode 100644 third_party/fonts/ofl/fonts/fonttheanooldstyle30.c create mode 100644 third_party/fonts/ofl/ofl_fonts.h create mode 100644 third_party/fonts/ofl/readme.txt create mode 100644 third_party/fonts/ofl/ttf/AndBasR.ttf create mode 100644 third_party/fonts/ofl/ttf/NanumMyeongjo.ttf create mode 100644 third_party/fonts/other/README create mode 100644 third_party/fonts/other/binfonts/fontsazanamigothic10x19.bin create mode 100644 third_party/fonts/other/binfonts/fontsazanamigothic6x10.bin create mode 100644 third_party/fonts/other/binfonts/fontsazanamigothic7x13.bin create mode 100644 third_party/fonts/other/binfonts/fontsazanamigothic8x15.bin create mode 100644 third_party/fonts/other/binfonts/fontsazanamigothic9x17.bin create mode 100644 third_party/fonts/other/binfonts/fontsazanamimincho10x19.bin create mode 100644 third_party/fonts/other/binfonts/fontsazanamimincho6x10.bin create mode 100644 third_party/fonts/other/binfonts/fontsazanamimincho7x13.bin create mode 100644 third_party/fonts/other/binfonts/fontsazanamimincho8x15.bin create mode 100644 third_party/fonts/other/binfonts/fontsazanamimincho9x17.bin create mode 100644 third_party/fonts/other/doc/ayu/README.txt create mode 100644 third_party/fonts/other/doc/kappa/README create mode 100644 third_party/fonts/other/doc/misaki/misakib8.txt create mode 100644 third_party/fonts/other/doc/mplus/LICENSE_J create mode 100644 third_party/fonts/other/doc/oradano/README.txt create mode 100644 third_party/fonts/other/doc/shinonome/LICENSE create mode 100644 third_party/fonts/other/fonts/fontsazanamigothic10x19.c create mode 100644 third_party/fonts/other/fonts/fontsazanamigothic6x10.c create mode 100644 third_party/fonts/other/fonts/fontsazanamigothic7x13.c create mode 100644 third_party/fonts/other/fonts/fontsazanamigothic8x15.c create mode 100644 third_party/fonts/other/fonts/fontsazanamigothic9x17.c create mode 100644 third_party/fonts/other/fonts/fontsazanamimincho10x19.c create mode 100644 third_party/fonts/other/fonts/fontsazanamimincho6x10.c create mode 100644 third_party/fonts/other/fonts/fontsazanamimincho7x13.c create mode 100644 third_party/fonts/other/fonts/fontsazanamimincho8x15.c create mode 100644 third_party/fonts/other/fonts/fontsazanamimincho9x17.c create mode 100644 third_party/fonts/other/other_fonts.h create mode 100644 third_party/fonts/other/readme.txt create mode 100644 third_party/fonts/other/ttf/sazanami-gothic.ttf create mode 100644 third_party/fonts/readme.txt create mode 100644 third_party/lwip-1.4.1/CHANGELOG create mode 100644 third_party/lwip-1.4.1/COPYING create mode 100644 third_party/lwip-1.4.1/FILES create mode 100644 third_party/lwip-1.4.1/README create mode 100644 third_party/lwip-1.4.1/UPGRADING create mode 100644 third_party/lwip-1.4.1/apps/httpserver_raw/fs.c create mode 100644 third_party/lwip-1.4.1/apps/httpserver_raw/fs.h create mode 100644 third_party/lwip-1.4.1/apps/httpserver_raw/fsdata.c create mode 100644 third_party/lwip-1.4.1/apps/httpserver_raw/fsdata.h create mode 100644 third_party/lwip-1.4.1/apps/httpserver_raw/httpd.c create mode 100644 third_party/lwip-1.4.1/apps/httpserver_raw/httpd.h create mode 100644 third_party/lwip-1.4.1/apps/httpserver_raw/httpd_structs.h create mode 100644 third_party/lwip-1.4.1/doc/FILES create mode 100644 third_party/lwip-1.4.1/doc/contrib.txt create mode 100644 third_party/lwip-1.4.1/doc/rawapi.txt create mode 100644 third_party/lwip-1.4.1/doc/savannah.txt create mode 100644 third_party/lwip-1.4.1/doc/snmp_agent.txt create mode 100644 third_party/lwip-1.4.1/doc/sys_arch.txt create mode 100644 third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/FILES create mode 100644 third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/bpstruct.h create mode 100644 third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/cc.h create mode 100644 third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/epstruct.h create mode 100644 third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/perf.h create mode 100644 third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/sys_arch.h create mode 100644 third_party/lwip-1.4.1/ports/tiva-tm4c129/include/netif/FILES create mode 100644 third_party/lwip-1.4.1/ports/tiva-tm4c129/include/netif/tivaif.h create mode 100644 third_party/lwip-1.4.1/ports/tiva-tm4c129/netif/FILES create mode 100644 third_party/lwip-1.4.1/ports/tiva-tm4c129/netif/tiva-tm4c129.c create mode 100644 third_party/lwip-1.4.1/ports/tiva-tm4c129/perf.c create mode 100644 third_party/lwip-1.4.1/ports/tiva-tm4c129/sys_arch.c create mode 100644 third_party/lwip-1.4.1/src/FILES create mode 100644 third_party/lwip-1.4.1/src/api/api_lib.c create mode 100644 third_party/lwip-1.4.1/src/api/api_msg.c create mode 100644 third_party/lwip-1.4.1/src/api/err.c create mode 100644 third_party/lwip-1.4.1/src/api/netbuf.c create mode 100644 third_party/lwip-1.4.1/src/api/netdb.c create mode 100644 third_party/lwip-1.4.1/src/api/netifapi.c create mode 100644 third_party/lwip-1.4.1/src/api/sockets.c create mode 100644 third_party/lwip-1.4.1/src/api/tcpip.c create mode 100644 third_party/lwip-1.4.1/src/core/def.c create mode 100644 third_party/lwip-1.4.1/src/core/dhcp.c create mode 100644 third_party/lwip-1.4.1/src/core/dns.c create mode 100644 third_party/lwip-1.4.1/src/core/init.c create mode 100644 third_party/lwip-1.4.1/src/core/ipv4/autoip.c create mode 100644 third_party/lwip-1.4.1/src/core/ipv4/icmp.c create mode 100644 third_party/lwip-1.4.1/src/core/ipv4/igmp.c create mode 100644 third_party/lwip-1.4.1/src/core/ipv4/inet.c create mode 100644 third_party/lwip-1.4.1/src/core/ipv4/inet_chksum.c create mode 100644 third_party/lwip-1.4.1/src/core/ipv4/ip.c create mode 100644 third_party/lwip-1.4.1/src/core/ipv4/ip_addr.c create mode 100644 third_party/lwip-1.4.1/src/core/ipv4/ip_frag.c create mode 100644 third_party/lwip-1.4.1/src/core/ipv6/README create mode 100644 third_party/lwip-1.4.1/src/core/ipv6/icmp6.c create mode 100644 third_party/lwip-1.4.1/src/core/ipv6/inet6.c create mode 100644 third_party/lwip-1.4.1/src/core/ipv6/ip6.c create mode 100644 third_party/lwip-1.4.1/src/core/ipv6/ip6_addr.c create mode 100644 third_party/lwip-1.4.1/src/core/mem.c create mode 100644 third_party/lwip-1.4.1/src/core/memp.c create mode 100644 third_party/lwip-1.4.1/src/core/netif.c create mode 100644 third_party/lwip-1.4.1/src/core/pbuf.c create mode 100644 third_party/lwip-1.4.1/src/core/raw.c create mode 100644 third_party/lwip-1.4.1/src/core/snmp/asn1_dec.c create mode 100644 third_party/lwip-1.4.1/src/core/snmp/asn1_enc.c create mode 100644 third_party/lwip-1.4.1/src/core/snmp/mib2.c create mode 100644 third_party/lwip-1.4.1/src/core/snmp/mib_structs.c create mode 100644 third_party/lwip-1.4.1/src/core/snmp/msg_in.c create mode 100644 third_party/lwip-1.4.1/src/core/snmp/msg_out.c create mode 100644 third_party/lwip-1.4.1/src/core/stats.c create mode 100644 third_party/lwip-1.4.1/src/core/sys.c create mode 100644 third_party/lwip-1.4.1/src/core/tcp.c create mode 100644 third_party/lwip-1.4.1/src/core/tcp_in.c create mode 100644 third_party/lwip-1.4.1/src/core/tcp_out.c create mode 100644 third_party/lwip-1.4.1/src/core/timers.c create mode 100644 third_party/lwip-1.4.1/src/core/udp.c create mode 100644 third_party/lwip-1.4.1/src/include/ipv4/lwip/autoip.h create mode 100644 third_party/lwip-1.4.1/src/include/ipv4/lwip/icmp.h create mode 100644 third_party/lwip-1.4.1/src/include/ipv4/lwip/igmp.h create mode 100644 third_party/lwip-1.4.1/src/include/ipv4/lwip/inet.h create mode 100644 third_party/lwip-1.4.1/src/include/ipv4/lwip/inet_chksum.h create mode 100644 third_party/lwip-1.4.1/src/include/ipv4/lwip/ip.h create mode 100644 third_party/lwip-1.4.1/src/include/ipv4/lwip/ip_addr.h create mode 100644 third_party/lwip-1.4.1/src/include/ipv4/lwip/ip_frag.h create mode 100644 third_party/lwip-1.4.1/src/include/ipv6/lwip/icmp.h create mode 100644 third_party/lwip-1.4.1/src/include/ipv6/lwip/inet.h create mode 100644 third_party/lwip-1.4.1/src/include/ipv6/lwip/ip.h create mode 100644 third_party/lwip-1.4.1/src/include/ipv6/lwip/ip_addr.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/api.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/api_msg.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/arch.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/debug.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/def.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/dhcp.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/dns.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/err.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/init.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/mem.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/memp.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/memp_std.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/netbuf.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/netdb.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/netif.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/netifapi.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/opt.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/pbuf.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/raw.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/sio.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/snmp.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/snmp_asn1.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/snmp_msg.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/snmp_structs.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/sockets.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/stats.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/sys.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/tcp.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/tcp_impl.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/tcpip.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/timers.h create mode 100644 third_party/lwip-1.4.1/src/include/lwip/udp.h create mode 100644 third_party/lwip-1.4.1/src/include/netif/etharp.h create mode 100644 third_party/lwip-1.4.1/src/include/netif/ppp_oe.h create mode 100644 third_party/lwip-1.4.1/src/include/netif/slipif.h create mode 100644 third_party/lwip-1.4.1/src/include/posix/netdb.h create mode 100644 third_party/lwip-1.4.1/src/include/posix/sys/socket.h create mode 100644 third_party/lwip-1.4.1/src/netif/FILES create mode 100644 third_party/lwip-1.4.1/src/netif/etharp.c create mode 100644 third_party/lwip-1.4.1/src/netif/ethernetif.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/auth.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/auth.h create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/chap.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/chap.h create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/chpms.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/chpms.h create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/fsm.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/fsm.h create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/ipcp.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/ipcp.h create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/lcp.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/lcp.h create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/magic.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/magic.h create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/md5.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/md5.h create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/pap.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/pap.h create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/ppp.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/ppp.h create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/ppp_impl.h create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/ppp_oe.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/pppdebug.h create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/randm.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/randm.h create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/vj.c create mode 100644 third_party/lwip-1.4.1/src/netif/ppp/vj.h create mode 100644 third_party/lwip-1.4.1/src/netif/slipif.c create mode 100644 third_party/lwip-1.4.1/test/unit/core/test_mem.c create mode 100644 third_party/lwip-1.4.1/test/unit/core/test_mem.h create mode 100644 third_party/lwip-1.4.1/test/unit/etharp/test_etharp.c create mode 100644 third_party/lwip-1.4.1/test/unit/etharp/test_etharp.h create mode 100644 third_party/lwip-1.4.1/test/unit/lwip_check.h create mode 100644 third_party/lwip-1.4.1/test/unit/lwip_unittests.c create mode 100644 third_party/lwip-1.4.1/test/unit/lwipopts.h create mode 100644 third_party/lwip-1.4.1/test/unit/tcp/tcp_helper.c create mode 100644 third_party/lwip-1.4.1/test/unit/tcp/tcp_helper.h create mode 100644 third_party/lwip-1.4.1/test/unit/tcp/test_tcp.c create mode 100644 third_party/lwip-1.4.1/test/unit/tcp/test_tcp.h create mode 100644 third_party/lwip-1.4.1/test/unit/tcp/test_tcp_oos.c create mode 100644 third_party/lwip-1.4.1/test/unit/tcp/test_tcp_oos.h create mode 100644 third_party/lwip-1.4.1/test/unit/udp/test_udp.c create mode 100644 third_party/lwip-1.4.1/test/unit/udp/test_udp.h create mode 100644 third_party/no_license.txt create mode 100644 third_party/ptpd-1.1.0/COPYRIGHT create mode 100644 third_party/ptpd-1.1.0/ChangeLog create mode 100644 third_party/ptpd-1.1.0/Makefile create mode 100644 third_party/ptpd-1.1.0/README create mode 100644 third_party/ptpd-1.1.0/RELEASE_NOTES create mode 100644 third_party/ptpd-1.1.0/doc/clock_servo.svg create mode 100644 third_party/ptpd-1.1.0/doc/data_paths.svg create mode 100644 third_party/ptpd-1.1.0/doc/doc.html create mode 100644 third_party/ptpd-1.1.0/doc/filter.svg create mode 100644 third_party/ptpd-1.1.0/doc/index.html create mode 100644 third_party/ptpd-1.1.0/doc/organization.svg create mode 100644 third_party/ptpd-1.1.0/doc/ptpd_2005_1588_conference_paper.pdf create mode 100644 third_party/ptpd-1.1.0/doc/stylesheet.css create mode 100644 third_party/ptpd-1.1.0/src/Doxyfile create mode 100644 third_party/ptpd-1.1.0/src/Makefile create mode 100644 third_party/ptpd-1.1.0/src/arith.c create mode 100644 third_party/ptpd-1.1.0/src/bmc.c create mode 100644 third_party/ptpd-1.1.0/src/constants.h create mode 100644 third_party/ptpd-1.1.0/src/datatypes.h create mode 100644 third_party/ptpd-1.1.0/src/dep-tiva/constants_dep.h create mode 100644 third_party/ptpd-1.1.0/src/dep-tiva/datatypes_dep.h create mode 100644 third_party/ptpd-1.1.0/src/dep-tiva/ptpd_dep.h create mode 100644 third_party/ptpd-1.1.0/src/dep-tiva/ptpd_msg.c create mode 100644 third_party/ptpd-1.1.0/src/dep-tiva/ptpd_net.c create mode 100644 third_party/ptpd-1.1.0/src/dep-tiva/ptpd_servo.c create mode 100644 third_party/ptpd-1.1.0/src/dep-tiva/ptpd_timer.c create mode 100644 third_party/ptpd-1.1.0/src/dep/constants_dep.h create mode 100644 third_party/ptpd-1.1.0/src/dep/datatypes_dep.h create mode 100644 third_party/ptpd-1.1.0/src/dep/msg.c create mode 100644 third_party/ptpd-1.1.0/src/dep/net.c create mode 100644 third_party/ptpd-1.1.0/src/dep/ptpd_dep.h create mode 100644 third_party/ptpd-1.1.0/src/dep/servo.c create mode 100644 third_party/ptpd-1.1.0/src/dep/startup.c create mode 100644 third_party/ptpd-1.1.0/src/dep/sys.c create mode 100644 third_party/ptpd-1.1.0/src/dep/timer.c create mode 100644 third_party/ptpd-1.1.0/src/probe.c create mode 100644 third_party/ptpd-1.1.0/src/protocol.c create mode 100644 third_party/ptpd-1.1.0/src/ptpd.8 create mode 100644 third_party/ptpd-1.1.0/src/ptpd.c create mode 100644 third_party/ptpd-1.1.0/src/ptpd.h create mode 100644 third_party/ptpd-1.1.0/tools/filter_response.m create mode 100644 third_party/ptpd-1.1.0/tools/offset_stats.m create mode 100644 third_party/ptpd-1.1.0/tools/ptp_plot.py create mode 100644 third_party/ptpd-1.1.0/tools/quality_correlate.py create mode 100644 third_party/uip-1.0/README create mode 100644 third_party/uip-1.0/apps/README create mode 100644 third_party/uip-1.0/apps/dhcpc/Makefile.dhcpc create mode 100644 third_party/uip-1.0/apps/dhcpc/dhcpc.c create mode 100644 third_party/uip-1.0/apps/dhcpc/dhcpc.h create mode 100644 third_party/uip-1.0/apps/hello-world/Makefile.hello-world create mode 100644 third_party/uip-1.0/apps/hello-world/hello-world.c create mode 100644 third_party/uip-1.0/apps/hello-world/hello-world.h create mode 100644 third_party/uip-1.0/apps/httpd/httpd.c create mode 100644 third_party/uip-1.0/apps/httpd/httpd.h create mode 100644 third_party/uip-1.0/apps/resolv/Makefile.resolv create mode 100644 third_party/uip-1.0/apps/resolv/resolv.c create mode 100644 third_party/uip-1.0/apps/resolv/resolv.h create mode 100644 third_party/uip-1.0/apps/smtp/Makefile.smtp create mode 100644 third_party/uip-1.0/apps/smtp/makestrings create mode 100644 third_party/uip-1.0/apps/smtp/smtp-strings create mode 100644 third_party/uip-1.0/apps/smtp/smtp-strings.c create mode 100644 third_party/uip-1.0/apps/smtp/smtp-strings.h create mode 100644 third_party/uip-1.0/apps/smtp/smtp.c create mode 100644 third_party/uip-1.0/apps/smtp/smtp.h create mode 100644 third_party/uip-1.0/apps/telnetd/Makefile.telnetd create mode 100644 third_party/uip-1.0/apps/telnetd/shell.c create mode 100644 third_party/uip-1.0/apps/telnetd/shell.h create mode 100644 third_party/uip-1.0/apps/telnetd/telnetd.c create mode 100644 third_party/uip-1.0/apps/telnetd/telnetd.h create mode 100644 third_party/uip-1.0/apps/webclient/Makefile.webclient create mode 100644 third_party/uip-1.0/apps/webclient/makestrings create mode 100644 third_party/uip-1.0/apps/webclient/webclient-strings create mode 100644 third_party/uip-1.0/apps/webclient/webclient-strings.c create mode 100644 third_party/uip-1.0/apps/webclient/webclient-strings.h create mode 100644 third_party/uip-1.0/apps/webclient/webclient.c create mode 100644 third_party/uip-1.0/apps/webclient/webclient.h create mode 100644 third_party/uip-1.0/apps/webserver/Makefile.webserver create mode 100644 third_party/uip-1.0/apps/webserver/http-strings create mode 100644 third_party/uip-1.0/apps/webserver/http-strings.c create mode 100644 third_party/uip-1.0/apps/webserver/http-strings.h create mode 100644 third_party/uip-1.0/apps/webserver/httpd-cgi.c create mode 100644 third_party/uip-1.0/apps/webserver/httpd-cgi.h create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fs.c create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fs.h create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fs/404.html create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fs/fade.png create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fs/files.shtml create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fs/footer.html create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fs/header.html create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fs/index.html create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fs/processes.shtml create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fs/stats.shtml create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fs/style.css create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fs/tcp.shtml create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fsdata.c create mode 100644 third_party/uip-1.0/apps/webserver/httpd-fsdata.h create mode 100644 third_party/uip-1.0/apps/webserver/httpd.c create mode 100644 third_party/uip-1.0/apps/webserver/httpd.h create mode 100644 third_party/uip-1.0/apps/webserver/makefsdata create mode 100644 third_party/uip-1.0/apps/webserver/makestrings create mode 100644 third_party/uip-1.0/apps/webserver/webserver.h create mode 100644 third_party/uip-1.0/doc/Doxyfile create mode 100644 third_party/uip-1.0/doc/Makefile create mode 100644 third_party/uip-1.0/doc/README create mode 100644 third_party/uip-1.0/doc/doxygen.sty create mode 100644 third_party/uip-1.0/doc/example-mainloop-with-arp.c create mode 100644 third_party/uip-1.0/doc/example-mainloop-without-arp.c create mode 100644 third_party/uip-1.0/doc/examples.txt create mode 100644 third_party/uip-1.0/doc/header.tex create mode 100644 third_party/uip-1.0/doc/html/a00036.html create mode 100644 third_party/uip-1.0/doc/html/a00037.html create mode 100644 third_party/uip-1.0/doc/html/a00038.html create mode 100644 third_party/uip-1.0/doc/html/a00039.html create mode 100644 third_party/uip-1.0/doc/html/a00040.html create mode 100644 third_party/uip-1.0/doc/html/a00041.html create mode 100644 third_party/uip-1.0/doc/html/a00042.html create mode 100644 third_party/uip-1.0/doc/html/a00043.html create mode 100644 third_party/uip-1.0/doc/html/a00044.html create mode 100644 third_party/uip-1.0/doc/html/a00045.html create mode 100644 third_party/uip-1.0/doc/html/a00046.html create mode 100644 third_party/uip-1.0/doc/html/a00047.html create mode 100644 third_party/uip-1.0/doc/html/a00048.html create mode 100644 third_party/uip-1.0/doc/html/a00049.html create mode 100644 third_party/uip-1.0/doc/html/a00050.html create mode 100644 third_party/uip-1.0/doc/html/a00051.html create mode 100644 third_party/uip-1.0/doc/html/a00077.html create mode 100644 third_party/uip-1.0/doc/html/a00078.html create mode 100644 third_party/uip-1.0/doc/html/a00079.html create mode 100644 third_party/uip-1.0/doc/html/a00080.html create mode 100644 third_party/uip-1.0/doc/html/a00081.html create mode 100644 third_party/uip-1.0/doc/html/a00082.html create mode 100644 third_party/uip-1.0/doc/html/a00083.html create mode 100644 third_party/uip-1.0/doc/html/a00084.html create mode 100644 third_party/uip-1.0/doc/html/a00085.html create mode 100644 third_party/uip-1.0/doc/html/a00086.html create mode 100644 third_party/uip-1.0/doc/html/a00087.html create mode 100644 third_party/uip-1.0/doc/html/a00088.html create mode 100644 third_party/uip-1.0/doc/html/a00089.html create mode 100644 third_party/uip-1.0/doc/html/a00090.html create mode 100644 third_party/uip-1.0/doc/html/a00091.html create mode 100644 third_party/uip-1.0/doc/html/a00092.html create mode 100644 third_party/uip-1.0/doc/html/a00093.html create mode 100644 third_party/uip-1.0/doc/html/a00094.html create mode 100644 third_party/uip-1.0/doc/html/a00095.html create mode 100644 third_party/uip-1.0/doc/html/a00096.html create mode 100644 third_party/uip-1.0/doc/html/a00097.html create mode 100644 third_party/uip-1.0/doc/html/a00100.html create mode 100644 third_party/uip-1.0/doc/html/a00101.html create mode 100644 third_party/uip-1.0/doc/html/a00102.html create mode 100644 third_party/uip-1.0/doc/html/a00103.html create mode 100644 third_party/uip-1.0/doc/html/a00104.html create mode 100644 third_party/uip-1.0/doc/html/a00105.html create mode 100644 third_party/uip-1.0/doc/html/a00107.html create mode 100644 third_party/uip-1.0/doc/html/a00110.html create mode 100644 third_party/uip-1.0/doc/html/a00111.html create mode 100644 third_party/uip-1.0/doc/html/a00112.html create mode 100644 third_party/uip-1.0/doc/html/a00113.html create mode 100644 third_party/uip-1.0/doc/html/a00114.html create mode 100644 third_party/uip-1.0/doc/html/a00120.html create mode 100644 third_party/uip-1.0/doc/html/a00121.html create mode 100644 third_party/uip-1.0/doc/html/a00123.html create mode 100644 third_party/uip-1.0/doc/html/a00124.html create mode 100644 third_party/uip-1.0/doc/html/a00125.html create mode 100644 third_party/uip-1.0/doc/html/a00127.html create mode 100644 third_party/uip-1.0/doc/html/a00128.html create mode 100644 third_party/uip-1.0/doc/html/a00129.html create mode 100644 third_party/uip-1.0/doc/html/a00130.html create mode 100644 third_party/uip-1.0/doc/html/a00131.html create mode 100644 third_party/uip-1.0/doc/html/a00132.html create mode 100644 third_party/uip-1.0/doc/html/a00134.html create mode 100644 third_party/uip-1.0/doc/html/a00135.html create mode 100644 third_party/uip-1.0/doc/html/a00136.html create mode 100644 third_party/uip-1.0/doc/html/a00137.html create mode 100644 third_party/uip-1.0/doc/html/a00138.html create mode 100644 third_party/uip-1.0/doc/html/a00139.html create mode 100644 third_party/uip-1.0/doc/html/a00140.html create mode 100644 third_party/uip-1.0/doc/html/a00141.html create mode 100644 third_party/uip-1.0/doc/html/a00142.html create mode 100644 third_party/uip-1.0/doc/html/a00143.html create mode 100644 third_party/uip-1.0/doc/html/a00144.html create mode 100644 third_party/uip-1.0/doc/html/a00145.html create mode 100644 third_party/uip-1.0/doc/html/a00146.html create mode 100644 third_party/uip-1.0/doc/html/a00147.html create mode 100644 third_party/uip-1.0/doc/html/a00148.html create mode 100644 third_party/uip-1.0/doc/html/a00149.html create mode 100644 third_party/uip-1.0/doc/html/a00150.html create mode 100644 third_party/uip-1.0/doc/html/a00151.html create mode 100644 third_party/uip-1.0/doc/html/a00152.html create mode 100644 third_party/uip-1.0/doc/html/a00153.html create mode 100644 third_party/uip-1.0/doc/html/a00154.html create mode 100644 third_party/uip-1.0/doc/html/a00155.html create mode 100644 third_party/uip-1.0/doc/html/a00156.html create mode 100644 third_party/uip-1.0/doc/html/a00157.html create mode 100644 third_party/uip-1.0/doc/html/a00158.html create mode 100644 third_party/uip-1.0/doc/html/a00159.html create mode 100644 third_party/uip-1.0/doc/html/a00160.html create mode 100644 third_party/uip-1.0/doc/html/a00161.html create mode 100644 third_party/uip-1.0/doc/html/a00162.html create mode 100644 third_party/uip-1.0/doc/html/a00163.html create mode 100644 third_party/uip-1.0/doc/html/a00164.html create mode 100644 third_party/uip-1.0/doc/html/a00168.html create mode 100644 third_party/uip-1.0/doc/html/a00169.html create mode 100644 third_party/uip-1.0/doc/html/a00170.html create mode 100644 third_party/uip-1.0/doc/html/a00171.html create mode 100644 third_party/uip-1.0/doc/html/a00172.html create mode 100644 third_party/uip-1.0/doc/html/a00173.html create mode 100644 third_party/uip-1.0/doc/html/a00174.html create mode 100644 third_party/uip-1.0/doc/html/a00175.html create mode 100644 third_party/uip-1.0/doc/html/a00176.html create mode 100644 third_party/uip-1.0/doc/html/a00177.html create mode 100644 third_party/uip-1.0/doc/html/a00178.html create mode 100644 third_party/uip-1.0/doc/html/a00179.html create mode 100644 third_party/uip-1.0/doc/html/a00180.html create mode 100644 third_party/uip-1.0/doc/html/a00181.html create mode 100644 third_party/uip-1.0/doc/html/a00182.html create mode 100644 third_party/uip-1.0/doc/html/a00183.html create mode 100644 third_party/uip-1.0/doc/html/a00184.html create mode 100644 third_party/uip-1.0/doc/html/a00185.html create mode 100644 third_party/uip-1.0/doc/html/a00186.html create mode 100644 third_party/uip-1.0/doc/html/a00187.html create mode 100644 third_party/uip-1.0/doc/html/a00188.html create mode 100644 third_party/uip-1.0/doc/html/a00189.html create mode 100644 third_party/uip-1.0/doc/html/a00190.html create mode 100644 third_party/uip-1.0/doc/html/a00191.html create mode 100644 third_party/uip-1.0/doc/html/a00192.html create mode 100644 third_party/uip-1.0/doc/html/a00193.html create mode 100644 third_party/uip-1.0/doc/html/a00194.html create mode 100644 third_party/uip-1.0/doc/html/a00195.html create mode 100644 third_party/uip-1.0/doc/html/a00196.html create mode 100644 third_party/uip-1.0/doc/html/a00197.html create mode 100644 third_party/uip-1.0/doc/html/a00198.html create mode 100644 third_party/uip-1.0/doc/html/a00199.html create mode 100644 third_party/uip-1.0/doc/html/a00200.html create mode 100644 third_party/uip-1.0/doc/html/a00201.html create mode 100644 third_party/uip-1.0/doc/html/a00202.html create mode 100644 third_party/uip-1.0/doc/html/a00203.html create mode 100644 third_party/uip-1.0/doc/html/a00204.html create mode 100644 third_party/uip-1.0/doc/html/a00205.html create mode 100644 third_party/uip-1.0/doc/html/a00206.html create mode 100644 third_party/uip-1.0/doc/html/a00207.html create mode 100644 third_party/uip-1.0/doc/html/annotated.html create mode 100644 third_party/uip-1.0/doc/html/classes.html create mode 100644 third_party/uip-1.0/doc/html/doxygen.css create mode 100644 third_party/uip-1.0/doc/html/doxygen.png create mode 100644 third_party/uip-1.0/doc/html/examples.html create mode 100644 third_party/uip-1.0/doc/html/files.html create mode 100644 third_party/uip-1.0/doc/html/ftv2blank.png create mode 100644 third_party/uip-1.0/doc/html/ftv2doc.png create mode 100644 third_party/uip-1.0/doc/html/ftv2folderclosed.png create mode 100644 third_party/uip-1.0/doc/html/ftv2folderopen.png create mode 100644 third_party/uip-1.0/doc/html/ftv2lastnode.png create mode 100644 third_party/uip-1.0/doc/html/ftv2link.png create mode 100644 third_party/uip-1.0/doc/html/ftv2mlastnode.png create mode 100644 third_party/uip-1.0/doc/html/ftv2mnode.png create mode 100644 third_party/uip-1.0/doc/html/ftv2node.png create mode 100644 third_party/uip-1.0/doc/html/ftv2plastnode.png create mode 100644 third_party/uip-1.0/doc/html/ftv2pnode.png create mode 100644 third_party/uip-1.0/doc/html/ftv2vertline.png create mode 100644 third_party/uip-1.0/doc/html/functions.html create mode 100644 third_party/uip-1.0/doc/html/functions_vars.html create mode 100644 third_party/uip-1.0/doc/html/globals.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x61.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x62.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x64.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x65.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x66.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x68.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x69.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x6c.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x6d.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x6e.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x70.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x72.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x73.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x74.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x75.html create mode 100644 third_party/uip-1.0/doc/html/globals_0x77.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x61.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x62.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x64.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x65.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x66.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x68.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x69.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x6c.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x6d.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x6e.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x70.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x72.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x73.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x74.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x75.html create mode 100644 third_party/uip-1.0/doc/html/globals_defs_0x77.html create mode 100644 third_party/uip-1.0/doc/html/globals_func.html create mode 100644 third_party/uip-1.0/doc/html/globals_type.html create mode 100644 third_party/uip-1.0/doc/html/globals_vars.html create mode 100644 third_party/uip-1.0/doc/html/hierarchy.html create mode 100644 third_party/uip-1.0/doc/html/index.hhc create mode 100644 third_party/uip-1.0/doc/html/index.hhk create mode 100644 third_party/uip-1.0/doc/html/index.hhp create mode 100644 third_party/uip-1.0/doc/html/index.html create mode 100644 third_party/uip-1.0/doc/html/main.html create mode 100644 third_party/uip-1.0/doc/html/modules.html create mode 100644 third_party/uip-1.0/doc/html/tab_b.gif create mode 100644 third_party/uip-1.0/doc/html/tab_l.gif create mode 100644 third_party/uip-1.0/doc/html/tab_r.gif create mode 100644 third_party/uip-1.0/doc/html/tabs.css create mode 100644 third_party/uip-1.0/doc/html/tree.html create mode 100644 third_party/uip-1.0/doc/mobisys2003.pdf create mode 100644 third_party/uip-1.0/doc/pt-doc.txt create mode 100644 third_party/uip-1.0/doc/sicslogo.pdf create mode 100644 third_party/uip-1.0/doc/uip-code-style.c create mode 100644 third_party/uip-1.0/doc/uip-code-style.txt create mode 100644 third_party/uip-1.0/doc/uip-doc.txt create mode 100644 third_party/uip-1.0/doc/uip-refman.pdf create mode 100644 third_party/uip-1.0/lib/memb.c create mode 100644 third_party/uip-1.0/lib/memb.h create mode 100644 third_party/uip-1.0/uip-1.0-changelog.txt create mode 100644 third_party/uip-1.0/uip/Makefile.include create mode 100644 third_party/uip-1.0/uip/clock.h create mode 100644 third_party/uip-1.0/uip/lc-addrlabels.h create mode 100644 third_party/uip-1.0/uip/lc-switch.h create mode 100644 third_party/uip-1.0/uip/lc.h create mode 100644 third_party/uip-1.0/uip/psock.c create mode 100644 third_party/uip-1.0/uip/psock.h create mode 100644 third_party/uip-1.0/uip/pt.h create mode 100644 third_party/uip-1.0/uip/uip-fw.c create mode 100644 third_party/uip-1.0/uip/uip-fw.h create mode 100644 third_party/uip-1.0/uip/uip-neighbor.c create mode 100644 third_party/uip-1.0/uip/uip-neighbor.h create mode 100644 third_party/uip-1.0/uip/uip-split.c create mode 100644 third_party/uip-1.0/uip/uip-split.h create mode 100644 third_party/uip-1.0/uip/uip.c create mode 100644 third_party/uip-1.0/uip/uip.h create mode 100644 third_party/uip-1.0/uip/uip_arch.h create mode 100644 third_party/uip-1.0/uip/uip_arp.c create mode 100644 third_party/uip-1.0/uip/uip_arp.h create mode 100644 third_party/uip-1.0/uip/uip_timer.c create mode 100644 third_party/uip-1.0/uip/uip_timer.h create mode 100644 third_party/uip-1.0/uip/uiplib.c create mode 100644 third_party/uip-1.0/uip/uiplib.h create mode 100644 third_party/uip-1.0/uip/uipopt.h create mode 100644 third_party/uip-1.0/unix/Makefile create mode 100644 third_party/uip-1.0/unix/clock-arch.c create mode 100644 third_party/uip-1.0/unix/clock-arch.h create mode 100644 third_party/uip-1.0/unix/main.c create mode 100644 third_party/uip-1.0/unix/tapdev.c create mode 100644 third_party/uip-1.0/unix/tapdev.h create mode 100644 third_party/uip-1.0/unix/uip-conf.h create mode 100644 third_party/windows/fltk-1.1.10/ANNOUNCEMENT create mode 100644 third_party/windows/fltk-1.1.10/CHANGES create mode 100644 third_party/windows/fltk-1.1.10/CMake/CheckFunctionWithHeaderExists.cmake create mode 100644 third_party/windows/fltk-1.1.10/CMake/FLTKConfig.cmake.in create mode 100644 third_party/windows/fltk-1.1.10/CMake/FLTKUse.cmake create mode 100644 third_party/windows/fltk-1.1.10/CMake/PlatformTests.cxx create mode 100644 third_party/windows/fltk-1.1.10/CMakeLists.txt create mode 100644 third_party/windows/fltk-1.1.10/COPYING create mode 100644 third_party/windows/fltk-1.1.10/CREDITS create mode 100644 third_party/windows/fltk-1.1.10/DartConfig.cmake create mode 100644 third_party/windows/fltk-1.1.10/FL/Enumerations.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Adjuster.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_BMP_Image.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Bitmap.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Box.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Browser.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Browser_.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Button.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Chart.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Check_Browser.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Check_Button.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Choice.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Clock.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Color_Chooser.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Counter.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Dial.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Double_Window.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Export.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_File_Browser.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_File_Chooser.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_File_Icon.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_File_Input.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Fill_Dial.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Fill_Slider.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Float_Input.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_FormsBitmap.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_FormsPixmap.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Free.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_GIF_Image.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Gl_Window.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Group.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Help_Dialog.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Help_View.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Hold_Browser.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Hor_Fill_Slider.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Hor_Nice_Slider.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Hor_Slider.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Hor_Value_Slider.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Image.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Input.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Input_.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Input_Choice.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Int_Input.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_JPEG_Image.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Light_Button.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Line_Dial.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Menu.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Menu_.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Menu_Bar.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Menu_Button.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Menu_Item.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Menu_Window.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Multi_Browser.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Multi_Label.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Multiline_Input.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Multiline_Output.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Nice_Slider.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Object.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Output.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Overlay_Window.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_PNG_Image.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_PNM_Image.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Pack.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Pixmap.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Positioner.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Preferences.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Progress.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_RGB_Image.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Radio_Button.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Radio_Light_Button.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Radio_Round_Button.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Repeat_Button.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Return_Button.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Roller.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Round_Button.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Round_Clock.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Scroll.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Scrollbar.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Secret_Input.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Select_Browser.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Shared_Image.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Simple_Counter.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Single_Window.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Slider.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Spinner.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Sys_Menu_Bar.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Tabs.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Text_Buffer.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Text_Display.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Text_Editor.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Tile.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Tiled_Image.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Timer.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Toggle_Button.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Toggle_Light_Button.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Toggle_Round_Button.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Tooltip.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Valuator.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Value_Input.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Value_Output.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Value_Slider.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Widget.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Window.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_Wizard.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_XBM_Image.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Fl_XPM_Image.H create mode 100644 third_party/windows/fltk-1.1.10/FL/Makefile.in create mode 100644 third_party/windows/fltk-1.1.10/FL/dirent.h create mode 100644 third_party/windows/fltk-1.1.10/FL/filename.H create mode 100644 third_party/windows/fltk-1.1.10/FL/fl_ask.H create mode 100644 third_party/windows/fltk-1.1.10/FL/fl_draw.H create mode 100644 third_party/windows/fltk-1.1.10/FL/fl_message.H create mode 100644 third_party/windows/fltk-1.1.10/FL/fl_show_colormap.H create mode 100644 third_party/windows/fltk-1.1.10/FL/fl_show_input.H create mode 100644 third_party/windows/fltk-1.1.10/FL/forms.H create mode 100644 third_party/windows/fltk-1.1.10/FL/gl.h create mode 100644 third_party/windows/fltk-1.1.10/FL/gl2opengl.h create mode 100644 third_party/windows/fltk-1.1.10/FL/gl_draw.H create mode 100644 third_party/windows/fltk-1.1.10/FL/glu.h create mode 100644 third_party/windows/fltk-1.1.10/FL/glut.H create mode 100644 third_party/windows/fltk-1.1.10/FL/mac.H create mode 100644 third_party/windows/fltk-1.1.10/FL/mac.r create mode 100644 third_party/windows/fltk-1.1.10/FL/math.h create mode 100644 third_party/windows/fltk-1.1.10/FL/names.h create mode 100644 third_party/windows/fltk-1.1.10/FL/win32.H create mode 100644 third_party/windows/fltk-1.1.10/FL/x.H create mode 100644 third_party/windows/fltk-1.1.10/Makefile create mode 100644 third_party/windows/fltk-1.1.10/README create mode 100644 third_party/windows/fltk-1.1.10/README.mac create mode 100644 third_party/windows/fltk-1.1.10/README.win32 create mode 100644 third_party/windows/fltk-1.1.10/autom4te.cache/output.0 create mode 100644 third_party/windows/fltk-1.1.10/autom4te.cache/requests create mode 100644 third_party/windows/fltk-1.1.10/autom4te.cache/traces.0 create mode 100644 third_party/windows/fltk-1.1.10/borlandc/README create mode 100644 third_party/windows/fltk-1.1.10/borlandc/arc.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/arc.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/arc.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/ask.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/ask.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/ask.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/bitmap.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/bitmap.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/bitmap.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/boxtype.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/boxtype.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/boxtype.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/browser.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/browser.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/browser.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/button.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/button.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/button.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/buttons.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/buttons.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/buttons.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/checkers.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/checkers.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/checkers.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/clock.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/clock.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/clock.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/colbrowser.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/colbrowser.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/colbrowser.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/color_chooser.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/color_chooser.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/color_chooser.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/config.h create mode 100644 third_party/windows/fltk-1.1.10/borlandc/cube.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/cube.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/cube.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/cursor.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/cursor.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/cursor.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/curve.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/curve.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/curve.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/demo.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/demo.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/demo.menu create mode 100644 third_party/windows/fltk-1.1.10/borlandc/demo.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/doublebuffer.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/doublebuffer.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/doublebuffer.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/editor.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/editor.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/editor.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/file_chooser.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/file_chooser.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/file_chooser.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fltk.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fltk.bpg create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fltk.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fltk.dsk create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fltk_app_template.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fltk_app_template.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fltk_app_template.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fltklib.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fltklib.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fluid.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fluid.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fluid.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fonts.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fonts.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fonts.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/forms.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/forms.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/forms.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fractals.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fractals.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fractals.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fullscreen.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fullscreen.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/fullscreen.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/hello.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/hello.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/hello.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/help.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/help.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/help.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/iconize.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/iconize.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/iconize.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/image.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/image.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/image.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/input.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/input.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/input.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/keyboard.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/keyboard.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/keyboard.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/label.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/label.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/label.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/line_style.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/line_style.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/line_style.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/menubar.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/menubar.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/menubar.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/message.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/message.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/message.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/minimum.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/minimum.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/minimum.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/navigation.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/navigation.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/navigation.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/output.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/output.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/output.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/overlay.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/overlay.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/overlay.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/pack.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/pack.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/pack.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/pixmap.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/pixmap.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/pixmap.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/pixmap_browser.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/pixmap_browser.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/pixmap_browser.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/resizebox.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/resizebox.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/resizebox.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/scroll.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/scroll.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/scroll.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/shape.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/shape.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/shape.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/subwindow.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/subwindow.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/subwindow.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/symbols.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/symbols.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/symbols.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/tile.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/tile.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/tile.res create mode 100644 third_party/windows/fltk-1.1.10/borlandc/tiled_image.bpf create mode 100644 third_party/windows/fltk-1.1.10/borlandc/tiled_image.bpr create mode 100644 third_party/windows/fltk-1.1.10/borlandc/tiled_image.res create mode 100644 third_party/windows/fltk-1.1.10/configh.cmake.in create mode 100644 third_party/windows/fltk-1.1.10/configh.in create mode 100644 third_party/windows/fltk-1.1.10/configure create mode 100644 third_party/windows/fltk-1.1.10/configure.in create mode 100644 third_party/windows/fltk-1.1.10/documentation/FL.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Adjuster.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_BMP_Image.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Bitmap.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Box.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Browser.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Browser_.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Button.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Chart.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Check_Browser.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Check_Button.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Check_Button.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Choice.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Clock.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Clock_Output.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Color_Chooser.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Counter.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Dial.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Double_Window.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_End.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_File_Browser.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_File_Chooser.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_File_Chooser.jpg create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_File_Icon.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_File_Input.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_File_Input.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Float_Input.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Free.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_GIF_Image.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Gl_Window.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Group.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Help_Dialog.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Help_Dialog.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Help_View.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Hold_Browser.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Image.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Input.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Input_.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Input_Choice.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Int_Input.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_JPEG_Image.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Light_Button.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Light_Button.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Menu_.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Bar.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Button.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Item.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Window.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Multi_Browser.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Multiline_Input.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Multiline_Output.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Output.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Overlay_Window.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_PNG_Image.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_PNM_Image.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Pack.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Pixmap.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Positioner.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Preferences.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Progress.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_RGB_Image.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Repeat_Button.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Return_Button.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Return_Button.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Roller.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Roller.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Round_Button.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Round_Button.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Scroll.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Scroll.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Scrollbar.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Secret_Input.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Select_Browser.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Shared_Image.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Single_Window.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Slider.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Spinner.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Tabs.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Text_Buffer.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Text_Display.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Text_Editor.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Tile.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Tile.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Tiled_Image.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Timer.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Toggle_Button.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Tooltip.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Valuator.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Value_Input.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Value_Input.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Value_Output.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Value_Output.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Value_Slider.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Widget.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Window.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_Wizard.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_XBM_Image.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Fl_XPM_Image.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/Makefile create mode 100644 third_party/windows/fltk-1.1.10/documentation/README create mode 100644 third_party/windows/fltk-1.1.10/documentation/adjuster1.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/advanced.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/basics.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/blocks.man create mode 100644 third_party/windows/fltk-1.1.10/documentation/boxtypes.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/buttons.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/charts.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/checkers.man create mode 100644 third_party/windows/fltk-1.1.10/documentation/choice.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/clock.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/common.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/counter.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/cubeview.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/dial.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/drawing.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/editor-replace.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/editor.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/editor.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/enumerations.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/events.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/examples.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/fl_alert.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fl_ask.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fl_choice.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fl_color_chooser.jpg create mode 100644 third_party/windows/fltk-1.1.10/documentation/fl_input.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fl_message.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fl_password.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fl_show_colormap.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fltk-config.man create mode 100644 third_party/windows/fltk-1.1.10/documentation/fltk.book create mode 100644 third_party/windows/fltk-1.1.10/documentation/fltk.man create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid-catgets.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid-gettext.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid-org.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid.man create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid1.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid2.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid3-cxx.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid3-gui.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid3-style.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid4.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid_prefs.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid_widget_cxx.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid_widget_gui.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/fluid_widget_style.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/forms.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/functions.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/glut.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/hello.C.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/index.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/input_choice.jpg create mode 100644 third_party/windows/fltk-1.1.10/documentation/intro.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/license.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/menu.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/menu_button.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/menubar.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/migration.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/opengl.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/osissues.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/positioner.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/preface.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/resizebox1.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/resizebox2.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/round_clock.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/scrollbar.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/slider.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/subclassing.html create mode 100644 third_party/windows/fltk-1.1.10/documentation/sudoku.man create mode 100644 third_party/windows/fltk-1.1.10/documentation/symbols.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/tabs.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/text.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/valuators.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/value_slider.gif create mode 100644 third_party/windows/fltk-1.1.10/documentation/widgets.html create mode 100644 third_party/windows/fltk-1.1.10/fltk-config.in create mode 100644 third_party/windows/fltk-1.1.10/fltk.list.in create mode 100644 third_party/windows/fltk-1.1.10/fltk.spec.in create mode 100644 third_party/windows/fltk-1.1.10/fltk.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/CMakeLists.txt create mode 100644 third_party/windows/fltk-1.1.10/fluid/CodeEditor.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/CodeEditor.h create mode 100644 third_party/windows/fltk-1.1.10/fluid/Fl_Function_Type.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/Fl_Group_Type.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/Fl_Menu_Type.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/Fl_Type.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/Fl_Type.h create mode 100644 third_party/windows/fltk-1.1.10/fluid/Fl_Widget_Type.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/Fl_Widget_Type.h create mode 100644 third_party/windows/fltk-1.1.10/fluid/Fl_Window_Type.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/Fluid_Image.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/Fluid_Image.h create mode 100644 third_party/windows/fltk-1.1.10/fluid/Makefile create mode 100644 third_party/windows/fltk-1.1.10/fluid/Shortcut_Button.h create mode 100644 third_party/windows/fltk-1.1.10/fluid/about_panel.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/about_panel.fl create mode 100644 third_party/windows/fltk-1.1.10/fluid/about_panel.h create mode 100644 third_party/windows/fltk-1.1.10/fluid/align_widget.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/alignment_panel.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/alignment_panel.fl create mode 100644 third_party/windows/fltk-1.1.10/fluid/alignment_panel.h create mode 100644 third_party/windows/fltk-1.1.10/fluid/code.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/comments.h create mode 100644 third_party/windows/fltk-1.1.10/fluid/factory.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/file.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/fluid.app/Contents/Info.plist create mode 100644 third_party/windows/fltk-1.1.10/fluid/fluid.app/Contents/PkgInfo create mode 100644 third_party/windows/fltk-1.1.10/fluid/fluid.app/Contents/Resources/fluid.icns create mode 100644 third_party/windows/fltk-1.1.10/fluid/fluid.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/fluid.desktop create mode 100644 third_party/windows/fltk-1.1.10/fluid/function_panel.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/function_panel.fl create mode 100644 third_party/windows/fltk-1.1.10/fluid/function_panel.h create mode 100644 third_party/windows/fltk-1.1.10/fluid/icons/fluid-128.png create mode 100644 third_party/windows/fltk-1.1.10/fluid/icons/fluid-16.png create mode 100644 third_party/windows/fltk-1.1.10/fluid/icons/fluid-16i.png create mode 100644 third_party/windows/fltk-1.1.10/fluid/icons/fluid-256.png create mode 100644 third_party/windows/fltk-1.1.10/fluid/icons/fluid-32.png create mode 100644 third_party/windows/fltk-1.1.10/fluid/icons/fluid-32.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/icons/fluid-32i.png create mode 100644 third_party/windows/fltk-1.1.10/fluid/icons/fluid-48.png create mode 100644 third_party/windows/fltk-1.1.10/fluid/icons/fluid-64.png create mode 100644 third_party/windows/fltk-1.1.10/fluid/icons/fluid-96.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/icons/fluid.ico create mode 100644 third_party/windows/fltk-1.1.10/fluid/icons/fluid.xcf.gz create mode 100644 third_party/windows/fltk-1.1.10/fluid/makedepend create mode 100644 third_party/windows/fltk-1.1.10/fluid/makefile.wat create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flAdjuster.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flBox.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flBrowser.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flButton.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flCheckBrowser.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flCheckButton.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flChoice.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flClass.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flClock.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flCode.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flCodeBlock.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flComment.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flCounter.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flDeclaration.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flDeclarationBlock.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flDial.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flFileBrowser.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flFileInput.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flFunction.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flGroup.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flHelp.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flInput.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flLightButton.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flMenuButton.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flMenubar.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flMenuitem.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flOutput.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flPack.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flProgress.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flRepeatButton.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flReturnButton.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flRoller.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flRoundButton.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flScroll.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flScrollBar.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flSlider.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flSpinner.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flSubmenu.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flTabs.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flTextDisplay.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flTextEdit.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flTile.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flValueInput.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flValueOutput.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flValueSlider.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flWidgetClass.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flWindow.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/flWizard.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/lock.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/print_color.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/print_gray.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/pixmaps/protected.xpm create mode 100644 third_party/windows/fltk-1.1.10/fluid/print_panel.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/print_panel.fl create mode 100644 third_party/windows/fltk-1.1.10/fluid/print_panel.h create mode 100644 third_party/windows/fltk-1.1.10/fluid/template_panel.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/template_panel.fl create mode 100644 third_party/windows/fltk-1.1.10/fluid/template_panel.h create mode 100644 third_party/windows/fltk-1.1.10/fluid/undo.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/undo.h create mode 100644 third_party/windows/fltk-1.1.10/fluid/widget_panel.cxx create mode 100644 third_party/windows/fltk-1.1.10/fluid/widget_panel.fl create mode 100644 third_party/windows/fltk-1.1.10/fluid/widget_panel.h create mode 100644 third_party/windows/fltk-1.1.10/fluid/x-fluid.desktop create mode 100644 third_party/windows/fltk-1.1.10/forms.h create mode 100644 third_party/windows/fltk-1.1.10/install-sh create mode 100644 third_party/windows/fltk-1.1.10/jpeg/CMakeLists.txt create mode 100644 third_party/windows/fltk-1.1.10/jpeg/Makefile create mode 100644 third_party/windows/fltk-1.1.10/jpeg/README create mode 100644 third_party/windows/fltk-1.1.10/jpeg/change.log create mode 100644 third_party/windows/fltk-1.1.10/jpeg/coderules.doc create mode 100644 third_party/windows/fltk-1.1.10/jpeg/filelist.doc create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jcapimin.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jcapistd.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jccoefct.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jccolor.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jcdctmgr.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jchuff.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jchuff.h create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jcinit.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jcmainct.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jcmarker.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jcmaster.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jcomapi.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jconfig.doc create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jconfig.h create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jcparam.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jcphuff.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jcprepct.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jcsample.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jctrans.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdapimin.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdapistd.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdatadst.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdatasrc.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdcoefct.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdcolor.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdct.h create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jddctmgr.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdhuff.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdhuff.h create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdinput.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdmainct.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdmarker.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdmaster.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdmerge.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdphuff.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdpostct.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdsample.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jdtrans.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jerror.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jerror.h create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jfdctflt.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jfdctfst.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jfdctint.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jidctflt.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jidctfst.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jidctint.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jidctred.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jinclude.h create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jmemmgr.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jmemnobs.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jmemsys.h create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jmorecfg.h create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jpegint.h create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jpeglib.h create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jquant1.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jquant2.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jutils.c create mode 100644 third_party/windows/fltk-1.1.10/jpeg/jversion.h create mode 100644 third_party/windows/fltk-1.1.10/jpeg/libjpeg.doc create mode 100644 third_party/windows/fltk-1.1.10/jpeg/makedepend create mode 100644 third_party/windows/fltk-1.1.10/jpeg/makefile.wat create mode 100644 third_party/windows/fltk-1.1.10/jpeg/structure.doc create mode 100644 third_party/windows/fltk-1.1.10/jpeg/usage.doc create mode 100644 third_party/windows/fltk-1.1.10/jpeg/wizard.doc create mode 100644 third_party/windows/fltk-1.1.10/lib/README.lib create mode 100644 third_party/windows/fltk-1.1.10/makefiles/Makefile.mingw create mode 100644 third_party/windows/fltk-1.1.10/makefiles/Makefile.os2x create mode 100644 third_party/windows/fltk-1.1.10/makefiles/config.mingw create mode 100644 third_party/windows/fltk-1.1.10/makefiles/config.os2x create mode 100644 third_party/windows/fltk-1.1.10/makefiles/makeinclude.mingw create mode 100644 third_party/windows/fltk-1.1.10/makefiles/makeinclude.mingw31 create mode 100644 third_party/windows/fltk-1.1.10/makefiles/makeinclude.os2x create mode 100644 third_party/windows/fltk-1.1.10/makeinclude.in create mode 100644 third_party/windows/fltk-1.1.10/png/ANNOUNCE create mode 100644 third_party/windows/fltk-1.1.10/png/CHANGES create mode 100644 third_party/windows/fltk-1.1.10/png/CMakeLists.txt create mode 100644 third_party/windows/fltk-1.1.10/png/INSTALL create mode 100644 third_party/windows/fltk-1.1.10/png/KNOWNBUG create mode 100644 third_party/windows/fltk-1.1.10/png/LICENSE create mode 100644 third_party/windows/fltk-1.1.10/png/Makefile create mode 100644 third_party/windows/fltk-1.1.10/png/README create mode 100644 third_party/windows/fltk-1.1.10/png/TODO create mode 100644 third_party/windows/fltk-1.1.10/png/Y2KINFO create mode 100644 third_party/windows/fltk-1.1.10/png/libpng.3 create mode 100644 third_party/windows/fltk-1.1.10/png/libpng.txt create mode 100644 third_party/windows/fltk-1.1.10/png/libpngpf.3 create mode 100644 third_party/windows/fltk-1.1.10/png/makedepend create mode 100644 third_party/windows/fltk-1.1.10/png/makefile.wat create mode 100644 third_party/windows/fltk-1.1.10/png/png.5 create mode 100644 third_party/windows/fltk-1.1.10/png/png.c create mode 100644 third_party/windows/fltk-1.1.10/png/png.h create mode 100644 third_party/windows/fltk-1.1.10/png/pngconf.h create mode 100644 third_party/windows/fltk-1.1.10/png/pngerror.c create mode 100644 third_party/windows/fltk-1.1.10/png/pngget.c create mode 100644 third_party/windows/fltk-1.1.10/png/pngmem.c create mode 100644 third_party/windows/fltk-1.1.10/png/pngpread.c create mode 100644 third_party/windows/fltk-1.1.10/png/pngread.c create mode 100644 third_party/windows/fltk-1.1.10/png/pngrio.c create mode 100644 third_party/windows/fltk-1.1.10/png/pngrtran.c create mode 100644 third_party/windows/fltk-1.1.10/png/pngrutil.c create mode 100644 third_party/windows/fltk-1.1.10/png/pngset.c create mode 100644 third_party/windows/fltk-1.1.10/png/pngtrans.c create mode 100644 third_party/windows/fltk-1.1.10/png/pngwio.c create mode 100644 third_party/windows/fltk-1.1.10/png/pngwrite.c create mode 100644 third_party/windows/fltk-1.1.10/png/pngwtran.c create mode 100644 third_party/windows/fltk-1.1.10/png/pngwutil.c create mode 100644 third_party/windows/fltk-1.1.10/src/CMakeLists.txt create mode 100644 third_party/windows/fltk-1.1.10/src/Fl.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Adjuster.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_BMP_Image.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Bitmap.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Box.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Browser.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Browser_.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Browser_load.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Button.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Chart.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Check_Browser.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Check_Button.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Choice.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Clock.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Color_Chooser.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Counter.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Dial.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Double_Window.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_File_Browser.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_File_Chooser.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_File_Chooser.fl create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_File_Chooser2.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_File_Icon.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_File_Icon2.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_File_Input.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Font.H create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_GIF_Image.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Gl_Choice.H create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Gl_Choice.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Gl_Overlay.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Gl_Window.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Group.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Help_Dialog.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Help_Dialog.fl create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Help_View.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Image.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Input.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Input_.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_JPEG_Image.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Light_Button.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Menu.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Menu_.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Menu_Bar.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Menu_Button.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Menu_Window.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Menu_add.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Menu_global.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Multi_Label.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Overlay_Window.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_PNG_Image.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_PNM_Image.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Pack.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Pixmap.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Positioner.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Preferences.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Progress.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Repeat_Button.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Return_Button.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Roller.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Round_Button.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Scroll.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Scrollbar.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Shared_Image.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Single_Window.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Slider.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Sys_Menu_Bar.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Tabs.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Text_Buffer.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Text_Display.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Text_Editor.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Tile.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Tiled_Image.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Tooltip.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Valuator.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Value_Input.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Value_Output.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Value_Slider.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Widget.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Window.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Window_fullscreen.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Window_hotspot.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Window_iconize.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_Wizard.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_XBM_Image.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_XColor.H create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_XPM_Image.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_abort.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_add_idle.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_arg.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_compose.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_display.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_get_key.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_get_key_mac.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_get_key_win32.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_get_system_colors.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_grab.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_lock.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_mac.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_own_colormap.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_visual.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_win32.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_x.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/Makefile create mode 100644 third_party/windows/fltk-1.1.10/src/allfiles.xbm create mode 100644 third_party/windows/fltk-1.1.10/src/cgdebug.h create mode 100644 third_party/windows/fltk-1.1.10/src/cmap.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/d1.xbm create mode 100644 third_party/windows/fltk-1.1.10/src/d1_mask.xbm create mode 100644 third_party/windows/fltk-1.1.10/src/dump_compose.c create mode 100644 third_party/windows/fltk-1.1.10/src/ew.xbm create mode 100644 third_party/windows/fltk-1.1.10/src/ew_mask.xbm create mode 100644 third_party/windows/fltk-1.1.10/src/fastarrow.h create mode 100644 third_party/windows/fltk-1.1.10/src/filename_absolute.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/filename_expand.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/filename_ext.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/filename_isdir.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/filename_list.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/filename_match.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/filename_setext.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_arc.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_arci.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_ask.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_boxtype.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_call_main.c create mode 100644 third_party/windows/fltk-1.1.10/src/fl_cmap.h create mode 100644 third_party/windows/fltk-1.1.10/src/fl_color.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_color_mac.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_color_win32.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_cursor.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_curve.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_diamond_box.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_dnd.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_dnd_mac.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_dnd_win32.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_dnd_x.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_draw.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_draw_image.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_draw_image_mac.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_draw_image_win32.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_draw_pixmap.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_encoding_latin1.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_encoding_mac_roman.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_engraved_label.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_file_dir.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_font.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_font_mac.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_font_win32.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_font_x.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_font_xft.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_gtk.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_images_core.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_labeltype.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_line_style.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_open_uri.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_oval_box.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_overlay.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_overlay_visual.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_plastic.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_read_image.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_read_image_mac.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_read_image_win32.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_rect.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_round_box.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_rounded_box.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_scroll_area.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_set_font.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_set_fonts.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_set_fonts_mac.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_set_fonts_win32.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_set_fonts_x.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_set_fonts_xft.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_shadow_box.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_shortcut.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_show_colormap.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_symbols.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/fl_vertex.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/flstring.c create mode 100644 third_party/windows/fltk-1.1.10/src/flstring.h create mode 100644 third_party/windows/fltk-1.1.10/src/forms_bitmap.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/forms_compatability.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/forms_free.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/forms_fselect.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/forms_pixmap.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/forms_timer.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/freeglut_geometry.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/freeglut_stroke_mono_roman.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/freeglut_stroke_roman.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/freeglut_teapot.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/freeglut_teapot_data.h create mode 100644 third_party/windows/fltk-1.1.10/src/gl_draw.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/gl_start.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/glut_compatability.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/glut_font.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/makedepend create mode 100644 third_party/windows/fltk-1.1.10/src/makefile.wat create mode 100644 third_party/windows/fltk-1.1.10/src/mediumarrow.h create mode 100644 third_party/windows/fltk-1.1.10/src/new.xbm create mode 100644 third_party/windows/fltk-1.1.10/src/ns.xbm create mode 100644 third_party/windows/fltk-1.1.10/src/ns_mask.xbm create mode 100644 third_party/windows/fltk-1.1.10/src/numericsort.c create mode 100644 third_party/windows/fltk-1.1.10/src/scandir.c create mode 100644 third_party/windows/fltk-1.1.10/src/scandir_win32.c create mode 100644 third_party/windows/fltk-1.1.10/src/screen_xywh.cxx create mode 100644 third_party/windows/fltk-1.1.10/src/slowarrow.h create mode 100644 third_party/windows/fltk-1.1.10/src/tile.xpm create mode 100644 third_party/windows/fltk-1.1.10/src/up.xbm create mode 100644 third_party/windows/fltk-1.1.10/src/vsnprintf.c create mode 100644 third_party/windows/fltk-1.1.10/test/CMakeLists.txt create mode 100644 third_party/windows/fltk-1.1.10/test/CubeMain.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/CubeView.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/CubeView.h create mode 100644 third_party/windows/fltk-1.1.10/test/CubeViewUI.fl create mode 100644 third_party/windows/fltk-1.1.10/test/Makefile create mode 100644 third_party/windows/fltk-1.1.10/test/README create mode 100644 third_party/windows/fltk-1.1.10/test/adjuster.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/arc.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/ask.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/bitmap.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/blocks.app/Contents/Info.plist create mode 100644 third_party/windows/fltk-1.1.10/test/blocks.app/Contents/PkgInfo create mode 100644 third_party/windows/fltk-1.1.10/test/blocks.app/Contents/Resources/blocks.icns create mode 100644 third_party/windows/fltk-1.1.10/test/blocks.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/boxtype.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/browser.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/button.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/buttons.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/checkers.app/Contents/Info.plist create mode 100644 third_party/windows/fltk-1.1.10/test/checkers.app/Contents/PkgInfo create mode 100644 third_party/windows/fltk-1.1.10/test/checkers.app/Contents/Resources/checkers.icns create mode 100644 third_party/windows/fltk-1.1.10/test/checkers.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/clock.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/colbrowser.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/color_chooser.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/connect.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/cube.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/cursor.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/curve.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/demo.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/demo.menu create mode 100644 third_party/windows/fltk-1.1.10/test/desktop/blocks-128.png create mode 100644 third_party/windows/fltk-1.1.10/test/desktop/blocks-32.png create mode 100644 third_party/windows/fltk-1.1.10/test/desktop/blocks.desktop create mode 100644 third_party/windows/fltk-1.1.10/test/desktop/checkers-128.png create mode 100644 third_party/windows/fltk-1.1.10/test/desktop/checkers-32.png create mode 100644 third_party/windows/fltk-1.1.10/test/desktop/checkers.desktop create mode 100644 third_party/windows/fltk-1.1.10/test/desktop/sudoku-128.png create mode 100644 third_party/windows/fltk-1.1.10/test/desktop/sudoku-32.png create mode 100644 third_party/windows/fltk-1.1.10/test/desktop/sudoku.desktop create mode 100644 third_party/windows/fltk-1.1.10/test/doublebuffer.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/editor.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/fast_slow.fl create mode 100644 third_party/windows/fltk-1.1.10/test/file_chooser.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/fl_jpeg_image.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/fonts.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/forms.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/fractals.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/fracviewer.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/fracviewer.h create mode 100644 third_party/windows/fltk-1.1.10/test/fromdos.c create mode 100644 third_party/windows/fltk-1.1.10/test/fullscreen.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/gl_overlay.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/glpuzzle.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/hello.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/help.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/iconize.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/image.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/inactive.fl create mode 100644 third_party/windows/fltk-1.1.10/test/input.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/input_choice.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/keyboard.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/keyboard.h create mode 100644 third_party/windows/fltk-1.1.10/test/keyboard_ui.fl create mode 100644 third_party/windows/fltk-1.1.10/test/label.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/line_style.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/list_visuals.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/makedepend create mode 100644 third_party/windows/fltk-1.1.10/test/makefile.wat create mode 100644 third_party/windows/fltk-1.1.10/test/mandelbrot.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/mandelbrot.h create mode 100644 third_party/windows/fltk-1.1.10/test/mandelbrot_ui.fl create mode 100644 third_party/windows/fltk-1.1.10/test/menubar.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/message.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/minimum.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/navigation.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/output.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/overlay.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/pack.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/pixmap.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/pixmap_browser.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/black_1.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/black_2.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/black_3.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/black_4.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/blackking_1.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/blackking_2.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/blackking_3.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/blackking_4.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/blast.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/block.xcf.gz create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/blue.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/blue_bomb.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/cyan.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/cyan_bomb.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/gray.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/gray_bomb.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/green.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/green_bomb.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/magenta.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/magenta_bomb.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/porsche.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/porsche1.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/red.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/red_bomb.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/srs.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/sudoku.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/tile.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/white_1.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/white_2.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/white_3.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/white_4.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_1.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_2.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_3.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_4.xbm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/yellow.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/pixmaps/yellow_bomb.xpm create mode 100644 third_party/windows/fltk-1.1.10/test/preferences.fl create mode 100644 third_party/windows/fltk-1.1.10/test/radio.fl create mode 100644 third_party/windows/fltk-1.1.10/test/resize.fl create mode 100644 third_party/windows/fltk-1.1.10/test/resizebox.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/rgb.txt create mode 100644 third_party/windows/fltk-1.1.10/test/scroll.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/shape.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/subwindow.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/sudoku.app/Contents/Info.plist create mode 100644 third_party/windows/fltk-1.1.10/test/sudoku.app/Contents/PkgInfo create mode 100644 third_party/windows/fltk-1.1.10/test/sudoku.app/Contents/Resources/sudoku.icns create mode 100644 third_party/windows/fltk-1.1.10/test/sudoku.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/sudoku.ico create mode 100644 third_party/windows/fltk-1.1.10/test/sudoku.rc create mode 100644 third_party/windows/fltk-1.1.10/test/sudokurc.h create mode 100644 third_party/windows/fltk-1.1.10/test/symbols.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/tabs.fl create mode 100644 third_party/windows/fltk-1.1.10/test/threads.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/threads.h create mode 100644 third_party/windows/fltk-1.1.10/test/tile.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/tiled_image.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/trackball.c create mode 100644 third_party/windows/fltk-1.1.10/test/trackball.h create mode 100644 third_party/windows/fltk-1.1.10/test/unittests.cxx create mode 100644 third_party/windows/fltk-1.1.10/test/valuators.fl create mode 100644 third_party/windows/fltk-1.1.10/vc2005/CubeView.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/adjuster.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/arc.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/ask.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/bitmap.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/boxtype.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/browser.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/button.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/buttons.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/checkers.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/clock.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/colbrowser.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/color_chooser.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/config.h create mode 100644 third_party/windows/fltk-1.1.10/vc2005/cube.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/cursor.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/curve.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/demo.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/doublebuffer.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/editor.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/fast_slow.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/file_chooser.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/fltk.lib.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/fltk.sln create mode 100644 third_party/windows/fltk-1.1.10/vc2005/fltkdll.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/fltkforms.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/fltkgl.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/fltkimages.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/fluid.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/fonts.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/forms.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/fractals.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/fullscreen.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/gl_overlay.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/glpuzzle.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/hello.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/help.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/iconize.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/image.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/inactive.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/input.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/input_choice.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/jpeg.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/keyboard.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/label.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/libpng.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/line_style.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/mandelbrot.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/menubar.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/message.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/minimum.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/navigation.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/output.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/overlay.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/pack.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/pixmap.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/pixmap_browser.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/preferences.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/radio.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/resize.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/resizebox.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/scroll.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/shape.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/subwindow.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/sudoku.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/symbols.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/tabs.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/threads.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/tile.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/tiled_image.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/valuators.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vc2005/zlib.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/CubeView.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/adjuster.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/arc.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/ask.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/bitmap.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/blocks.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/boxtype.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/browser.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/button.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/buttons.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/checkers.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/clock.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/colbrowser.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/color_chooser.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/config.h create mode 100644 third_party/windows/fltk-1.1.10/vcnet/cube.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/cursor.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/curve.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/demo.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/doublebuffer.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/editor.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/fast_slow.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/file_chooser.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/fltk.lib.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/fltk.sln create mode 100644 third_party/windows/fltk-1.1.10/vcnet/fltkdll.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/fltkforms.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/fltkgl.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/fltkimages.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/fluid.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/fonts.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/forms.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/fractals.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/fullscreen.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/gl_overlay.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/glpuzzle.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/hello.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/help.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/iconize.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/image.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/inactive.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/input.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/input_choice.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/jpeg.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/keyboard.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/label.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/libpng.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/line_style.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/mandelbrot.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/menubar.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/message.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/minimum.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/navigation.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/output.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/overlay.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/pack.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/pixmap.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/pixmap_browser.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/preferences.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/radio.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/resize.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/resizebox.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/scroll.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/shape.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/subwindow.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/sudoku.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/symbols.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/tabs.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/threads.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/tile.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/tiled_image.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/valuators.vcproj create mode 100644 third_party/windows/fltk-1.1.10/vcnet/zlib.vcproj create mode 100644 third_party/windows/fltk-1.1.10/visualc/CubeView.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/adjuster.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/arc.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/ask.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/bitmap.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/blocks.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/boxtype.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/browser.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/button.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/buttons.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/checkers.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/clock.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/colbrowser.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/color_chooser.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/config.h create mode 100644 third_party/windows/fltk-1.1.10/visualc/cube.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/cursor.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/curve.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/demo.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/doublebuffer.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/editor.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/fast_slow.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/file_chooser.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/fltk.dsw create mode 100644 third_party/windows/fltk-1.1.10/visualc/fltk.lib.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/fltkdll.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/fltkforms.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/fltkgl.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/fltkimages.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/fluid.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/fonts.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/forms.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/fractals.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/fullscreen.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/gl_overlay.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/glpuzzle.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/hello.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/help.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/iconize.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/image.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/inactive.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/input.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/input_choice.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/jpeg.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/keyboard.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/label.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/libpng.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/line_style.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/mandelbrot.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/menubar.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/message.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/minimum.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/navigation.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/output.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/overlay.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/pack.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/pixmap.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/pixmap_browser.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/preferences.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/radio.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/resize.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/resizebox.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/scroll.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/shape.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/subwindow.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/sudoku.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/symbols.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/tabs.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/threads.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/tile.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/tiled_image.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/valuators.dsp create mode 100644 third_party/windows/fltk-1.1.10/visualc/zlib.dsp create mode 100644 third_party/windows/fltk-1.1.10/watcom.mif create mode 100644 third_party/windows/fltk-1.1.10/watcom/config.h create mode 100644 third_party/windows/fltk-1.1.10/watcom/makefile create mode 100644 third_party/windows/fltk-1.1.10/watcom/readme.wat create mode 100644 third_party/windows/fltk-1.1.10/zlib/CMakeLists.txt create mode 100644 third_party/windows/fltk-1.1.10/zlib/ChangeLog create mode 100644 third_party/windows/fltk-1.1.10/zlib/FAQ create mode 100644 third_party/windows/fltk-1.1.10/zlib/INDEX create mode 100644 third_party/windows/fltk-1.1.10/zlib/Makefile create mode 100644 third_party/windows/fltk-1.1.10/zlib/README create mode 100644 third_party/windows/fltk-1.1.10/zlib/adler32.c create mode 100644 third_party/windows/fltk-1.1.10/zlib/algorithm.txt create mode 100644 third_party/windows/fltk-1.1.10/zlib/compress.c create mode 100644 third_party/windows/fltk-1.1.10/zlib/crc32.c create mode 100644 third_party/windows/fltk-1.1.10/zlib/crc32.h create mode 100644 third_party/windows/fltk-1.1.10/zlib/deflate.c create mode 100644 third_party/windows/fltk-1.1.10/zlib/deflate.h create mode 100644 third_party/windows/fltk-1.1.10/zlib/gzio.c create mode 100644 third_party/windows/fltk-1.1.10/zlib/inffast.c create mode 100644 third_party/windows/fltk-1.1.10/zlib/inffast.h create mode 100644 third_party/windows/fltk-1.1.10/zlib/inffixed.h create mode 100644 third_party/windows/fltk-1.1.10/zlib/inflate.c create mode 100644 third_party/windows/fltk-1.1.10/zlib/inflate.h create mode 100644 third_party/windows/fltk-1.1.10/zlib/inftrees.c create mode 100644 third_party/windows/fltk-1.1.10/zlib/inftrees.h create mode 100644 third_party/windows/fltk-1.1.10/zlib/makedepend create mode 100644 third_party/windows/fltk-1.1.10/zlib/makefile.wat create mode 100644 third_party/windows/fltk-1.1.10/zlib/trees.c create mode 100644 third_party/windows/fltk-1.1.10/zlib/trees.h create mode 100644 third_party/windows/fltk-1.1.10/zlib/uncompr.c create mode 100644 third_party/windows/fltk-1.1.10/zlib/zconf.h create mode 100644 third_party/windows/fltk-1.1.10/zlib/zlib.3 create mode 100644 third_party/windows/fltk-1.1.10/zlib/zlib.h create mode 100644 third_party/windows/fltk-1.1.10/zlib/zutil.c create mode 100644 third_party/windows/fltk-1.1.10/zlib/zutil.h (limited to 'third_party') diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo1/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo1/FreeRTOSConfig.h new file mode 100644 index 0000000..fc22d76 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo1/FreeRTOSConfig.h @@ -0,0 +1,111 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 59 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1468 ) ) +#define configMAX_TASK_NAME_LEN ( 3 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 0 +#define INCLUDE_uxTaskPriorityGet 0 +#define INCLUDE_vTaskDelete 0 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelay 1 + + + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo1/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo1/main.c new file mode 100644 index 0000000..36a2ea6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo1/main.c @@ -0,0 +1,634 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This demo application creates six co-routines and two tasks (three including + * the idle task). The co-routines execute as part of the idle task hook. + * + * Five of the created co-routines are the standard 'co-routine flash' + * co-routines contained within the Demo/Common/Minimal/crflash.c file and + * documented on the FreeRTOS.org WEB site. + * + * The 'LCD Task' rotates a string on the LCD, delaying between each character + * as necessitated by the slow interface, and delaying between each string just + * long enough to enable the text to be read. + * + * The sixth co-routine and final task control the transmission and reception + * of a string to UART 0. The co-routine periodically sends the first + * character of the string to the UART, with the UART's TxEnd interrupt being + * used to transmit the remaining characters. The UART's RxEnd interrupt + * receives the characters and places them on a queue to be processed by the + * 'COMs Rx' task. An error is latched should an unexpected character be + * received, or any character be received out of sequence. + * + * A loopback connector is required to ensure that each character transmitted + * on the UART is also received on the same UART. For test purposes the UART + * FIFO's are not utalised in order to maximise the interrupt overhead. Also + * a pseudo random interval is used between the start of each transmission in + * order that the resultant interrupts are more randomly distributed and + * therefore more likely to highlight any problems. + * + * The flash co-routines control LED's zero to four. LED five is toggled each + * time the string is transmitted on the UART. LED six is toggled each time + * the string is CORRECTLY received on the UART. LED seven is latched on should + * an error be detected in any task or co-routine. + * + * In addition the idle task makes repetative calls to + * prvSetAndCheckRegisters(). This simply loads the general purpose registers + * with a known value, then checks each register to ensure the held value is + * still correct. As a low priority task this checking routine is likely to + * get repeatedly swapped in and out. A register being found to contain an + * incorrect value is therefore indicative of an error in the task switching + * mechansim. + * + */ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "croutine.h" + +/* Demo application include files. */ +#include "partest.h" +#include "crflash.h" + +/* Library include files. */ +#include "DriverLib.h" + +/* The time to delay between writing each character to the LCD. */ +#define mainCHAR_WRITE_DELAY ( 2 / portTICK_RATE_MS ) + +/* The time to delay between writing each string to the LCD. */ +#define mainSTRING_WRITE_DELAY ( 400 / portTICK_RATE_MS ) + +/* The number of flash co-routines to create. */ +#define mainNUM_FLASH_CO_ROUTINES ( 5 ) + +/* The length of the queue used to pass received characters to the Comms Rx +task. */ +#define mainRX_QUEUE_LEN ( 5 ) + +/* The priority of the co-routine used to initiate the transmission of the +string on UART 0. */ +#define mainTX_CO_ROUTINE_PRIORITY ( 1 ) + +/* Only one co-routine is created so its index is not important. */ +#define mainTX_CO_ROUTINE_INDEX ( 0 ) + +/* The time between transmissions of the string on UART 0. This is pseudo +random in order to generate a bit or randomness to when the interrupts occur.*/ +#define mainMIN_TX_DELAY ( 40 / portTICK_RATE_MS ) +#define mainMAX_TX_DELAY ( ( portTickType ) 0x7f ) +#define mainOFFSET_TIME ( ( portTickType ) 3 ) + +/* The time the Comms Rx task should wait to receive a character. This should +be slightly longer than the time between transmissions. If we do not receive +a character after this time then there must be an error in the transmission or +the timing of the transmission. */ +#define mainCOMMS_RX_DELAY ( mainMAX_TX_DELAY + 20 ) + +/* The task priorites. */ +#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainCOMMS_RX_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) + +/* The LED's toggled by the various tasks. */ +#define mainCOMMS_FAIL_LED ( 7 ) +#define mainCOMMS_RX_LED ( 6 ) +#define mainCOMMS_TX_LED ( 5 ) + +/* The baud rate used by the UART comms tasks/co-routine. */ +#define mainBAUD_RATE ( 57600 ) + +/* FIFO setting for the UART. The FIFO is not used to create a better test. */ +#define mainFIFO_SET ( 0x10 ) + +/* The string that is transmitted on the UART contains sequentially the +characters from mainFIRST_TX_CHAR to mainLAST_TX_CHAR. */ +#define mainFIRST_TX_CHAR '0' +#define mainLAST_TX_CHAR 'z' + +/* Just used to walk through the program memory in order that some random data +can be generated. */ +#define mainTOTAL_PROGRAM_MEMORY ( ( unsigned long * ) ( 8 * 1024 ) ) +#define mainFIRST_PROGRAM_BYTES ( ( unsigned long * ) 4 ) + +/* The error routine that is called if the driver library encounters an error. */ +#ifdef DEBUG +void +__error__(char *pcFilename, unsigned long ulLine) +{ +} +#endif + +/*-----------------------------------------------------------*/ + +/* + * The task that rotates text on the LCD. + */ +static void vLCDTask( void * pvParameters ); + +/* + * The task that receives the characters from UART 0. + */ +static void vCommsRxTask( void * pvParameters ); + +/* + * The co-routine that periodically initiates the transmission of the string on + * the UART. + */ +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* + * Writes a string the the LCD. + */ +static void prvWriteString( const char *pcString ); + +/* + * Initialisation routine for the UART. + */ +static void vSerialInit( void ); + +/* + * Thread safe write to the PDC. + */ +static void prvPDCWrite( char cAddress, char cData ); + +/* + * Function to simply set a known value into the general purpose registers + * then read them back to ensure they remain set correctly. An incorrect value + * being indicative of an error in the task switching mechanism. + */ +void prvSetAndCheckRegisters( void ); + +/* + * Latch the LED that indicates that an error has occurred. + */ +void vSetErrorLED( void ); + +/* + * Sets up the PLL and ports used by the demo. + */ +static void prvSetupHardware( void ); + +/*-----------------------------------------------------------*/ + +/* Error flag set to pdFAIL if an error is encountered in the tasks/co-routines +defined within this file. */ +unsigned portBASE_TYPE uxErrorStatus = pdPASS; + +/* The next character to transmit. */ +static char cNextChar; + +/* The queue used to transmit characters from the interrupt to the Comms Rx +task. */ +static xQueueHandle xCommsQueue; + +/*-----------------------------------------------------------*/ + +void Main( void ) +{ + /* Create the queue used to communicate between the UART ISR and the Comms + Rx task. */ + xCommsQueue = xQueueCreate( mainRX_QUEUE_LEN, sizeof( char ) ); + + /* Setup the ports used by the demo and the clock. */ + prvSetupHardware(); + + /* Create the co-routines that flash the LED's. */ + vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES ); + + /* Create the co-routine that initiates the transmission of characters + on the UART. */ + xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX ); + + /* Create the LCD and Comms Rx tasks. */ + xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL ); + xTaskCreate( vCommsRxTask, "CMS", configMINIMAL_STACK_SIZE, NULL, mainCOMMS_RX_TASK_PRIORITY, NULL ); + + /* Start the scheduler running the tasks and co-routines just created. */ + vTaskStartScheduler(); + + /* Should not get here unless we did not have enough memory to start the + scheduler. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* Setup the PLL. */ + SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); + + /* Initialise the hardware used to talk to the LCD, LED's and UART. */ + PDCInit(); + vParTestInitialise(); + vSerialInit(); +} +/*-----------------------------------------------------------*/ + +void vApplicationIdleHook( void ) +{ + /* The co-routines are executed in the idle task using the idle task + hook. */ + for( ;; ) + { + /* Schedule the co-routines. */ + vCoRoutineSchedule(); + + /* Run the register check function between each co-routine. */ + prvSetAndCheckRegisters(); + } +} +/*-----------------------------------------------------------*/ + +static void prvWriteString( const char *pcString ) +{ + /* Write pcString to the LED, pausing between each character. */ + prvPDCWrite(PDC_LCD_CSR, LCD_CLEAR); + while( *pcString ) + { + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_RAM, *pcString ); + pcString++; + } +} +/*-----------------------------------------------------------*/ + +void vLCDTask( void * pvParameters ) +{ +unsigned portBASE_TYPE uxIndex; +const unsigned char ucCFGData[] = { + 0x30, /* Set data bus to 8-bits. */ + 0x30, + 0x30, + 0x3C, /* Number of lines/font. */ + 0x08, /* Display off. */ + 0x01, /* Display clear. */ + 0x06, /* Entry mode [cursor dir][shift]. */ + 0x0C /* Display on [display on][curson on][blinking on]. */ + }; + +/* The strings that are written to the LCD. */ +const char *pcStringsToDisplay[] = { + "Stellaris", + "Demo", + "One", + "www.FreeRTOS.org", + "" + }; + + /* Configure the LCD. */ + uxIndex = 0; + while( uxIndex < sizeof( ucCFGData ) ) + { + prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] ); + uxIndex++; + vTaskDelay( mainCHAR_WRITE_DELAY ); + } + + /* Turn the LCD Backlight on. */ + prvPDCWrite( PDC_CSR, 0x01 ); + + /* Clear display. */ + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR ); + + uxIndex = 0; + for( ;; ) + { + /* Display the string on the LCD. */ + prvWriteString( pcStringsToDisplay[ uxIndex ] ); + + /* Move on to the next string - wrapping if necessary. */ + uxIndex++; + if( *( pcStringsToDisplay[ uxIndex ] ) == 0x00 ) + { + uxIndex = 0; + /* Longer pause on the last string to be sent. */ + vTaskDelay( mainSTRING_WRITE_DELAY * 2 ); + } + + /* Wait until it is time to move onto the next string. */ + vTaskDelay( mainSTRING_WRITE_DELAY ); + } +} +/*-----------------------------------------------------------*/ + +static void vCommsRxTask( void * pvParameters ) +{ +static char cRxedChar, cExpectedChar; + + /* Set the char we expect to receive to the start of the string. */ + cExpectedChar = mainFIRST_TX_CHAR; + + for( ;; ) + { + /* Wait for a character to be received. */ + xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY ); + + /* Was the character recived (if any) the expected character. */ + if( cRxedChar != cExpectedChar ) + { + /* Got an unexpected character. This can sometimes occur when + reseting the system using the debugger leaving characters already + in the UART regsters. */ + uxErrorStatus = pdFAIL; + + /* Resync by waiting for the end of the current string. */ + while( cRxedChar != mainLAST_TX_CHAR ) + { + while( !xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, portMAX_DELAY ) ); + } + + /* The next expected character is the start of the string again. */ + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + if( cExpectedChar == mainLAST_TX_CHAR ) + { + /* We have reached the end of the string - we now expect to + receive the first character in the string again. The LED is + toggled to indicate that the entire string was received without + error. */ + vParTestToggleLED( mainCOMMS_RX_LED ); + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + /* We got the expected character, we now expect to receive the + next character in the string. */ + cExpectedChar++; + } + } + } +} +/*-----------------------------------------------------------*/ + +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +portTickType xDelayPeriod; +static unsigned long *pulRandomBytes = mainFIRST_PROGRAM_BYTES; + + /* Co-routine MUST start with a call to crSTART. */ + crSTART( xHandle ); + + for(;;) + { + /* Was the previously transmitted string received correctly? */ + if( uxErrorStatus != pdPASS ) + { + /* An error was encountered so set the error LED. */ + vSetErrorLED(); + } + + /* The next character to Tx is the first in the string. */ + cNextChar = mainFIRST_TX_CHAR; + + UARTIntDisable( UART0_BASE, UART_INT_TX ); + { + /* Send the first character. */ + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + + /* Move the variable to the char to Tx on so the ISR transmits + the next character in the string once this one has completed. */ + cNextChar++; + } + UARTIntEnable(UART0_BASE, UART_INT_TX); + + /* Toggle the LED to show a new string is being transmitted. */ + vParTestToggleLED( mainCOMMS_TX_LED ); + + /* Delay before we start the string off again. A pseudo-random delay + is used as this will provide a better test. */ + xDelayPeriod = xTaskGetTickCount() + ( *pulRandomBytes ); + + pulRandomBytes++; + if( pulRandomBytes > mainTOTAL_PROGRAM_MEMORY ) + { + pulRandomBytes = mainFIRST_PROGRAM_BYTES; + } + + /* Make sure we don't wait too long... */ + xDelayPeriod &= mainMAX_TX_DELAY; + + /* ...but we do want to wait. */ + if( xDelayPeriod < mainMIN_TX_DELAY ) + { + xDelayPeriod = mainMIN_TX_DELAY; + } + + /* Block for the random(ish) time. */ + crDELAY( xHandle, xDelayPeriod ); + } + + /* Co-routine MUST end with a call to crEND. */ + crEND(); +} +/*-----------------------------------------------------------*/ + +static void vSerialInit( void ) +{ + /* Enable the UART. GPIOA has already been initialised. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + /* Set GPIO A0 and A1 as peripheral function. They are used to output the + UART signals. */ + GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW ); + + /* Configure the UART for 8-N-1 operation. */ + UARTConfigSet( UART0_BASE, mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE ); + + /* We dont want to use the fifo. This is for test purposes to generate + as many interrupts as possible. */ + HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET; + + /* Enable both Rx and Tx interrupts. */ + HWREG( UART0_BASE + UART_O_IM ) |= ( UART_INT_TX | UART_INT_RX ); + IntEnable( INT_UART0 ); +} +/*-----------------------------------------------------------*/ + +void vUART_ISR(void) +{ +unsigned long ulStatus; +char cRxedChar; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* What caused the interrupt. */ + ulStatus = UARTIntStatus( UART0_BASE, pdTRUE ); + + /* Clear the interrupt. */ + UARTIntClear( UART0_BASE, ulStatus ); + + /* Was an Rx interrpt pending? */ + if( ulStatus & UART_INT_RX ) + { + if( ( HWREG(UART0_BASE + UART_O_FR ) & UART_FR_RXFF ) ) + { + /* Get the char from the buffer and post it onto the queue of + Rxed chars. Posting the character should wake the task that is + blocked on the queue waiting for characters. */ + cRxedChar = ( char ) HWREG( UART0_BASE + UART_O_DR ); + xQueueSendFromISR( xCommsQueue, &cRxedChar, &xHigherPriorityTaskWoken ); + } + } + + /* Was a Tx interrupt pending? */ + if( ulStatus & UART_INT_TX ) + { + /* Send the next character in the string. We are not using the FIFO. */ + if( cNextChar <= mainLAST_TX_CHAR ) + { + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + cNextChar++; + } + } + + /* If a task was woken by the character being received then we force + a context switch to occur in case the task is of higher priority than + the currently executing task (i.e. the task that this interrupt + interrupted.) */ + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + +static void prvPDCWrite( char cAddress, char cData ) +{ + vTaskSuspendAll(); + { + PDCWrite( cAddress, cData ); + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vSetErrorLED( void ) +{ + vParTestSetLED( mainCOMMS_FAIL_LED, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +void prvSetAndCheckRegisters( void ) +{ + /* Fill the general purpose registers with known values. */ + __asm volatile( " mov r11, #10\n" + " add r0, r11, #1\n" + " add r1, r11, #2\n" + " add r2, r11, #3\n" + " add r3, r11, #4\n" + " add r4, r11, #5\n" + " add r5, r11, #6\n" + " add r6, r11, #7\n" + " add r7, r11, #8\n" + " add r8, r11, #9\n" + " add r9, r11, #10\n" + " add r10, r11, #11\n" + " add r12, r11, #12" ); + + /* Check the values are as expected. */ + __asm volatile( " cmp r11, #10\n" + " bne set_error_led\n" + " cmp r0, #11\n" + " bne set_error_led\n" + " cmp r1, #12\n" + " bne set_error_led\n" + " cmp r2, #13\n" + " bne set_error_led\n" + " cmp r3, #14\n" + " bne set_error_led\n" + " cmp r4, #15\n" + " bne set_error_led\n" + " cmp r5, #16\n" + " bne set_error_led\n" + " cmp r6, #17\n" + " bne set_error_led\n" + " cmp r7, #18\n" + " bne set_error_led\n" + " cmp r8, #19\n" + " bne set_error_led\n" + " cmp r9, #20\n" + " bne set_error_led\n" + " cmp r10, #21\n" + " bne set_error_led\n" + " cmp r12, #22\n" + " bne set_error_led\n" + " bx lr" ); + + __asm volatile( "set_error_led:\n" + " push {r14}\n" + " ldr r1, =vSetErrorLED\n" + " blx r1\n" + " pop {r14}\n" + " bx lr" ); +} +/*-----------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo1/readme.txt b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo1/readme.txt new file mode 100644 index 0000000..208a588 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo1/readme.txt @@ -0,0 +1,3 @@ +Move these two fines into the Demo/CORTEX_LM3S102_GCC directory to run Demo 1. + +See the port documentation on the www.FreeRTOS.org site for more information. diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo2/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo2/FreeRTOSConfig.h new file mode 100644 index 0000000..c8dc105 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo2/FreeRTOSConfig.h @@ -0,0 +1,111 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 59 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1240 ) ) +#define configMAX_TASK_NAME_LEN ( 3 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 3 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 0 +#define INCLUDE_uxTaskPriorityGet 0 +#define INCLUDE_vTaskDelete 0 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelay 1 + + + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo2/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo2/main.c new file mode 100644 index 0000000..e94462f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo2/main.c @@ -0,0 +1,633 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This demo application creates seven co-routines and one task (two including + * the idle task). The co-routines execute as part of the idle task hook. + * + * Five of the created co-routines are the standard 'co-routine flash' + * co-routines contained within the Demo/Common/Minimal/crflash.c file and + * documented on the FreeRTOS.org WEB site. + * + * The 'LCD Task' rotates a string on the LCD, delaying between each character + * as necessitated by the slow interface, and delaying between each string just + * long enough to enable the text to be read. + * + * The sixth co-routine controls the transmission of a string to UART 0. The + * co-routine periodically sends the first character of the string to the UART, + * with the UART's TxEnd interrupt being used to transmit the remaining + * characters. The UART's RxEnd interrupt receives the characters and places + * them on a queue to be processed by the seventh and final co-routine. An + * error is latched should an unexpected character be received, or any + * character be received out of sequence. + * + * A loopback connector is required to ensure that each character transmitted + * on the UART is also received on the same UART. For test purposes the UART + * FIFO's are not utalised in order to maximise the interrupt overhead. Also + * a pseudo random interval is used between the start of each transmission in + * order that the resultant interrupts are more randomly distributed and + * therefore more likely to highlight any problems. + * + * The flash co-routines control LED's zero to four. LED five is toggled each + * time the string is transmitted on the UART. LED six is toggled each time + * the string is CORRECTLY received on the UART. LED seven is latched on should + * an error be detected in any task or co-routine. + * + * In addition the idle task makes repetative calls to + * prvSetAndCheckRegisters(). This simply loads the general purpose registers + * with a known value, then checks each register to ensure the held value is + * still correct. As a low priority task this checking routine is likely to + * get repeatedly swapped in and out. A register being found to contain an + * incorrect value is therefore indicative of an error in the task switching + * mechansim. + * + */ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "croutine.h" + +/* Demo application include files. */ +#include "partest.h" +#include "crflash.h" + +/* Library include files. */ +#include "DriverLib.h" + +/* The time to delay between writing each character to the LCD. */ +#define mainCHAR_WRITE_DELAY ( 2 / portTICK_RATE_MS ) + +/* The time to delay between writing each string to the LCD. */ +#define mainSTRING_WRITE_DELAY ( 400 / portTICK_RATE_MS ) + +/* The number of flash co-routines to create. */ +#define mainNUM_FLASH_CO_ROUTINES ( 5 ) + +/* The length of the queue used to pass received characters to the Comms Rx +task. */ +#define mainRX_QUEUE_LEN ( 5 ) + +/* The priority of the co-routine used to initiate the transmission of the +string on UART 0. */ +#define mainTX_CO_ROUTINE_PRIORITY ( 1 ) + +/* The priority of the co-routine used to receive characters from the UART. */ +#define mainRX_CO_ROUTINE_PRIORITY ( 2 ) + +/* Only one co-routine is created so its index is not important. */ +#define mainTX_CO_ROUTINE_INDEX ( 0 ) +#define mainRX_CO_ROUTINE_INDEX ( 0 ) + +/* The time between transmissions of the string on UART 0. This is pseudo +random in order to generate a bit or randomness to when the interrupts occur.*/ +#define mainMIN_TX_DELAY ( 40 / portTICK_RATE_MS ) +#define mainMAX_TX_DELAY ( ( portTickType ) 0x7f ) +#define mainOFFSET_TIME ( ( portTickType ) 3 ) + +/* The time the Comms Rx task should wait to receive a character. This should +be slightly longer than the time between transmissions. If we do not receive +a character after this time then there must be an error in the transmission or +the timing of the transmission. */ +#define mainCOMMS_RX_DELAY ( mainMAX_TX_DELAY + 20 ) + +/* The task priorites. */ +#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainCOMMS_RX_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) + +/* The LED's toggled by the various tasks. */ +#define mainCOMMS_FAIL_LED ( 7 ) +#define mainCOMMS_RX_LED ( 6 ) +#define mainCOMMS_TX_LED ( 5 ) + +/* The baud rate used by the UART comms tasks/co-routine. */ +#define mainBAUD_RATE ( 57600 ) + +/* FIFO setting for the UART. The FIFO is not used to create a better test. */ +#define mainFIFO_SET ( 0x10 ) + +/* The string that is transmitted on the UART contains sequentially the +characters from mainFIRST_TX_CHAR to mainLAST_TX_CHAR. */ +#define mainFIRST_TX_CHAR '0' +#define mainLAST_TX_CHAR 'z' + +/* Just used to walk through the program memory in order that some random data +can be generated. */ +#define mainTOTAL_PROGRAM_MEMORY ( ( unsigned long * ) ( 8 * 1024 ) ) +#define mainFIRST_PROGRAM_BYTES ( ( unsigned long * ) 4 ) + +/* The error routine that is called if the driver library encounters an error. */ +#ifdef DEBUG +void +__error__(char *pcFilename, unsigned long ulLine) +{ +} +#endif + +/*-----------------------------------------------------------*/ + +/* + * The task that rotates text on the LCD. + */ +static void vLCDTask( void * pvParameters ); + +/* + * The task that receives the characters from UART 0. + */ +static void vCommsRxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* + * The co-routine that periodically initiates the transmission of the string on + * the UART. + */ +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* + * Writes a string the the LCD. + */ +static void prvWriteString( const char *pcString ); + +/* + * Initialisation routine for the UART. + */ +static void vSerialInit( void ); + +/* + * Thread safe write to the PDC. + */ +static void prvPDCWrite( char cAddress, char cData ); + +/* + * Function to simply set a known value into the general purpose registers + * then read them back to ensure they remain set correctly. An incorrect value + * being indicative of an error in the task switching mechanism. + */ +void prvSetAndCheckRegisters( void ); + +/* + * Latch the LED that indicates that an error has occurred. + */ +void vSetErrorLED( void ); + +/* + * Sets up the PLL and ports used by the demo. + */ +static void prvSetupHardware( void ); + +/*-----------------------------------------------------------*/ + +/* Error flag set to pdFAIL if an error is encountered in the tasks/co-routines +defined within this file. */ +unsigned portBASE_TYPE uxErrorStatus = pdPASS; + +/* The next character to transmit. */ +static char cNextChar; + +/* The queue used to transmit characters from the interrupt to the Comms Rx +task. */ +static xQueueHandle xCommsQueue; + +/*-----------------------------------------------------------*/ + +void Main( void ) +{ + /* Create the queue used to communicate between the UART ISR and the Comms + Rx task. */ + xCommsQueue = xQueueCreate( mainRX_QUEUE_LEN, sizeof( char ) ); + + /* Setup the ports used by the demo and the clock. */ + prvSetupHardware(); + + /* Create the co-routines that flash the LED's. */ + vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES ); + + /* Create the co-routine that initiates the transmission of characters + on the UART. */ + xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX ); + + /* Create the co-routine that receives characters from the UART. */ + xCoRoutineCreate( vCommsRxCoRoutine, mainRX_CO_ROUTINE_PRIORITY, mainRX_CO_ROUTINE_INDEX ); + + /* Create the LCD task. */ + xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL ); + + /* Start the scheduler running the tasks and co-routines just created. */ + vTaskStartScheduler(); + + /* Should not get here unless we did not have enough memory to start the + scheduler. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* Setup the PLL. */ + SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); + + /* Initialise the hardware used to talk to the LCD, LED's and UART. */ + PDCInit(); + vParTestInitialise(); + vSerialInit(); +} +/*-----------------------------------------------------------*/ + +void vApplicationIdleHook( void ) +{ + /* The co-routines are executed in the idle task using the idle task + hook. */ + for( ;; ) + { + /* Schedule the co-routines. */ + vCoRoutineSchedule(); + + /* Run the register check function between each co-routine. */ + prvSetAndCheckRegisters(); + } +} +/*-----------------------------------------------------------*/ + +static void prvWriteString( const char *pcString ) +{ + /* Write pcString to the LED, pausing between each character. */ + prvPDCWrite(PDC_LCD_CSR, LCD_CLEAR); + while( *pcString ) + { + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_RAM, *pcString ); + pcString++; + } +} +/*-----------------------------------------------------------*/ + +void vLCDTask( void * pvParameters ) +{ +unsigned portBASE_TYPE uxIndex; +const unsigned char ucCFGData[] = { + 0x30, /* Set data bus to 8-bits. */ + 0x30, + 0x30, + 0x3C, /* Number of lines/font. */ + 0x08, /* Display off. */ + 0x01, /* Display clear. */ + 0x06, /* Entry mode [cursor dir][shift]. */ + 0x0C /* Display on [display on][curson on][blinking on]. */ + }; + +/* The strings that are written to the LCD. */ +const char *pcStringsToDisplay[] = { + "Stellaris", + "Demo", + "Two", + "www.FreeRTOS.org", + "" + }; + + /* Configure the LCD. */ + uxIndex = 0; + while( uxIndex < sizeof( ucCFGData ) ) + { + prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] ); + uxIndex++; + vTaskDelay( mainCHAR_WRITE_DELAY ); + } + + /* Turn the LCD Backlight on. */ + prvPDCWrite( PDC_CSR, 0x01 ); + + /* Clear display. */ + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR ); + + uxIndex = 0; + for( ;; ) + { + /* Display the string on the LCD. */ + prvWriteString( pcStringsToDisplay[ uxIndex ] ); + + /* Move on to the next string - wrapping if necessary. */ + uxIndex++; + if( *( pcStringsToDisplay[ uxIndex ] ) == 0x00 ) + { + uxIndex = 0; + /* Longer pause on the last string to be sent. */ + vTaskDelay( mainSTRING_WRITE_DELAY * 2 ); + } + + /* Wait until it is time to move onto the next string. */ + vTaskDelay( mainSTRING_WRITE_DELAY ); + } +} +/*-----------------------------------------------------------*/ + +static void vCommsRxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +static char cRxedChar, cExpectedChar = mainFIRST_TX_CHAR; +portBASE_TYPE xResult; + + crSTART( xHandle ); + + for( ;; ) + { + /* Wait for a character to be received. */ + crQUEUE_RECEIVE( xHandle, xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY, &xResult ); + + /* Was the character recived (if any) the expected character. */ + if( ( cRxedChar != cExpectedChar ) || ( xResult != pdPASS ) ) + { + /* Got an unexpected character. This can sometimes occur when + reseting the system using the debugger leaving characters already + in the UART regsters. */ + uxErrorStatus = pdFAIL; + + /* Resync by waiting for the end of the current string. */ + while( cRxedChar != mainLAST_TX_CHAR ) + { + crQUEUE_RECEIVE( xHandle, xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY, &xResult ); + } + + /* The next expected character is the start of the string again. */ + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + if( cExpectedChar == mainLAST_TX_CHAR ) + { + /* We have reached the end of the string - we now expect to + receive the first character in the string again. The LED is + toggled to indicate that the entire string was received without + error. */ + vParTestToggleLED( mainCOMMS_RX_LED ); + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + /* We got the expected character, we now expect to receive the + next character in the string. */ + cExpectedChar++; + } + } + } + + crEND(); +} +/*-----------------------------------------------------------*/ + +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +portTickType xDelayPeriod; +static unsigned long *pulRandomBytes = mainFIRST_PROGRAM_BYTES; + + /* Co-routine MUST start with a call to crSTART. */ + crSTART( xHandle ); + + for(;;) + { + /* Was the previously transmitted string received correctly? */ + if( uxErrorStatus != pdPASS ) + { + /* An error was encountered so set the error LED. */ + vSetErrorLED(); + } + + /* The next character to Tx is the first in the string. */ + cNextChar = mainFIRST_TX_CHAR; + + UARTIntDisable( UART0_BASE, UART_INT_TX ); + { + /* Send the first character. */ + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + + /* Move the variable to the char to Tx on so the ISR transmits + the next character in the string once this one has completed. */ + cNextChar++; + } + UARTIntEnable(UART0_BASE, UART_INT_TX); + + /* Toggle the LED to show a new string is being transmitted. */ + vParTestToggleLED( mainCOMMS_TX_LED ); + + /* Delay before we start the string off again. A pseudo-random delay + is used as this will provide a better test. */ + xDelayPeriod = xTaskGetTickCount() + ( *pulRandomBytes ); + + pulRandomBytes++; + if( pulRandomBytes > mainTOTAL_PROGRAM_MEMORY ) + { + pulRandomBytes = mainFIRST_PROGRAM_BYTES; + } + + /* Make sure we don't wait too long... */ + xDelayPeriod &= mainMAX_TX_DELAY; + + /* ...but we do want to wait. */ + if( xDelayPeriod < mainMIN_TX_DELAY ) + { + xDelayPeriod = mainMIN_TX_DELAY; + } + + /* Block for the random(ish) time. */ + crDELAY( xHandle, xDelayPeriod ); + } + + /* Co-routine MUST end with a call to crEND. */ + crEND(); +} +/*-----------------------------------------------------------*/ + +static void vSerialInit( void ) +{ + /* Enable the UART. GPIOA has already been initialised. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + /* Set GPIO A0 and A1 as peripheral function. They are used to output the + UART signals. */ + GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW ); + + /* Configure the UART for 8-N-1 operation. */ + UARTConfigSet( UART0_BASE, mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE ); + + /* We dont want to use the fifo. This is for test purposes to generate + as many interrupts as possible. */ + HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET; + + /* Enable both Rx and Tx interrupts. */ + HWREG( UART0_BASE + UART_O_IM ) |= ( UART_INT_TX | UART_INT_RX ); + IntEnable( INT_UART0 ); +} +/*-----------------------------------------------------------*/ + +void vUART_ISR(void) +{ +unsigned long ulStatus; +char cRxedChar; +portBASE_TYPE xTaskWokenByPost = pdFALSE; + + /* What caused the interrupt. */ + ulStatus = UARTIntStatus( UART0_BASE, pdTRUE ); + + /* Clear the interrupt. */ + UARTIntClear( UART0_BASE, ulStatus ); + + /* Was an Rx interrpt pending? */ + if( ulStatus & UART_INT_RX ) + { + if( ( HWREG(UART0_BASE + UART_O_FR ) & UART_FR_RXFF ) ) + { + /* Get the char from the buffer and post it onto the queue of + Rxed chars. Posting the character should wake the task that is + blocked on the queue waiting for characters. */ + cRxedChar = ( char ) HWREG( UART0_BASE + UART_O_DR ); + xTaskWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsQueue, &cRxedChar, xTaskWokenByPost ); + } + } + + /* Was a Tx interrupt pending? */ + if( ulStatus & UART_INT_TX ) + { + /* Send the next character in the string. We are not using the FIFO. */ + if( cNextChar <= mainLAST_TX_CHAR ) + { + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + cNextChar++; + } + } + + if( xTaskWokenByPost ) + { + /* We are posting to a co-routine rather than a task so don't bother + causing a task switch. */ + } +} +/*-----------------------------------------------------------*/ + +static void prvPDCWrite( char cAddress, char cData ) +{ + vTaskSuspendAll(); + { + PDCWrite( cAddress, cData ); + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vSetErrorLED( void ) +{ + vParTestSetLED( mainCOMMS_FAIL_LED, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +void prvSetAndCheckRegisters( void ) +{ + /* Fill the general purpose registers with known values. */ + __asm volatile( " mov r11, #10\n" + " add r0, r11, #1\n" + " add r1, r11, #2\n" + " add r2, r11, #3\n" + " add r3, r11, #4\n" + " add r4, r11, #5\n" + " add r5, r11, #6\n" + " add r6, r11, #7\n" + " add r7, r11, #8\n" + " add r12, r11, #12" ); + + /* Check the values are as expected. */ + __asm volatile( " cmp r11, #10\n" + " bne set_error_led\n" + " cmp r0, #11\n" + " bne set_error_led\n" + " cmp r1, #12\n" + " bne set_error_led\n" + " cmp r2, #13\n" + " bne set_error_led\n" + " cmp r3, #14\n" + " bne set_error_led\n" + " cmp r4, #15\n" + " bne set_error_led\n" + " cmp r5, #16\n" + " bne set_error_led\n" + " cmp r6, #17\n" + " bne set_error_led\n" + " cmp r7, #18\n" + " bne set_error_led\n" + " cmp r12, #22\n" + " bne set_error_led\n" + " bx lr" ); + + __asm volatile( "set_error_led:\n" + " push {r14}\n" + " ldr r1, =vSetErrorLED\n" + " blx r1\n" + " pop {r14}\n" + " bx lr" ); +} +/*-----------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo2/readme.txt b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo2/readme.txt new file mode 100644 index 0000000..e22c810 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Demo2/readme.txt @@ -0,0 +1,3 @@ +Move these two fines into the Demo/CORTEX_LM3S102_GCC directory to run Demo 2. + +See the port documentation on the www.FreeRTOS.org site for more information. diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/FreeRTOSConfig.h new file mode 100644 index 0000000..6f63637 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/FreeRTOSConfig.h @@ -0,0 +1,115 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 59 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1468 ) ) +#define configMAX_TASK_NAME_LEN ( 3 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 0 +#define INCLUDE_uxTaskPriorityGet 0 +#define INCLUDE_vTaskDelete 0 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelay 1 + +#define configKERNEL_INTERRUPT_PRIORITY 255 +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xa0, or priority 5. */ + + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Makefile b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Makefile new file mode 100644 index 0000000..f71d1ae --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/Makefile @@ -0,0 +1,86 @@ +#****************************************************************************** +# +# Makefile - Rules for building the driver library and examples. +# +# Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +# +# Software License Agreement +# +# Luminary Micro, Inc. (LMI) is supplying this software for use solely and +# exclusively on LMI's Stellaris Family of microcontroller products. +# +# The software is owned by LMI and/or its suppliers, and is protected under +# applicable copyright laws. All rights are reserved. Any use in violation +# of the foregoing restrictions may subject the user to criminal sanctions +# under applicable laws, as well as to civil liability for the breach of the +# terms and conditions of this license. +# +# THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +# OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +# LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +# CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +# +#****************************************************************************** + +include makedefs + +RTOS_SOURCE_DIR=../../Source +DEMO_SOURCE_DIR=../Common/Minimal + +CFLAGS+=-I hw_include -I . -I ${RTOS_SOURCE_DIR}/include -I ${RTOS_SOURCE_DIR}/portable/GCC/ARM_CM3 -I ../Common/include -D GCC_ARMCM3_LM3S102 -D inline= + +VPATH=${RTOS_SOURCE_DIR}:${RTOS_SOURCE_DIR}/portable/MemMang:${RTOS_SOURCE_DIR}/portable/GCC/ARM_CM3:${DEMO_SOURCE_DIR}:init:ParTest:hw_include + + +OBJS= ${COMPILER}/main.o \ + ${COMPILER}/pdc.o \ + ${COMPILER}/list.o \ + ${COMPILER}/queue.o \ + ${COMPILER}/tasks.o \ + ${COMPILER}/port.o \ + ${COMPILER}/heap_1.o \ + ${COMPILER}/ParTest.o \ + ${COMPILER}/crflash.o \ + ${COMPILER}/croutine.o +# ${COMPILER}/pendsv_handler.o + +INIT_OBJS= ${COMPILER}/startup.o + +LIBS= hw_include/libdriver.a + + +# +# The default rule, which causes init to be built. +# +all: ${COMPILER} \ + ${COMPILER}/RTOSDemo.axf \ + +# +# The rule to clean out all the build products +# + +clean: + @rm -rf ${COMPILER} ${wildcard *.bin} RTOSDemo.axf + +# +# The rule to create the target directory +# +${COMPILER}: + @mkdir ${COMPILER} + +${COMPILER}/RTOSDemo.axf: ${INIT_OBJS} ${OBJS} ${LIBS} +SCATTER_RTOSDemo=standalone.ld +ENTRY_RTOSDemo=ResetISR + +# +# +# Include the automatically generated dependency files. +# +-include ${wildcard ${COMPILER}/*.d} __dummy__ + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/ParTest/ParTest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/ParTest/ParTest.c new file mode 100644 index 0000000..6c5d592 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/ParTest/ParTest.c @@ -0,0 +1,145 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + + +#include "FreeRTOS.h" +#include "task.h" +#include "partest.h" + +#include "pdc.h" + +#define partstPINS (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 Z | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7) + +#define partstALL_OUTPUTS_OFF ( ( unsigned char ) 0x00 ) +#define partstMAX_OUTPUT_LED ( ( unsigned char ) 8 ) + +static volatile unsigned char ucOutputValue = partstALL_OUTPUTS_OFF; + +void vParTestInitialise( void ) +{ + PDCInit(); + PDCWrite( PDC_LED, ucOutputValue ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ +unsigned char ucBit = ( unsigned char ) 1; + + vTaskSuspendAll(); + { + if( uxLED < partstMAX_OUTPUT_LED ) + { + ucBit = ( ( unsigned char ) 1 ) << uxLED; + + if( xValue == pdFALSE ) + { + ucBit ^= ( unsigned char ) 0xff; + ucOutputValue &= ucBit; + } + else + { + ucOutputValue |= ucBit; + } + + PDCWrite( PDC_LED, ucOutputValue ); + } + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) +{ +unsigned char ucBit; + + vTaskSuspendAll(); + { + if( uxLED < partstMAX_OUTPUT_LED ) + { + ucBit = ( ( unsigned char ) 1 ) << uxLED; + + if( ucOutputValue & ucBit ) + { + ucOutputValue &= ~ucBit; + } + else + { + ucOutputValue |= ucBit; + } + + PDCWrite( PDC_LED, ucOutputValue ); + } + } + xTaskResumeAll(); +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/DriverLib.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/DriverLib.h new file mode 100644 index 0000000..f8383de --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/DriverLib.h @@ -0,0 +1,18 @@ +#ifndef INCLUDE_DRIVER_LIB_H +#define INCLUDE_DRIVER_LIB_H + +#include "hw_ints.h" +#include "hw_uart.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "hw_nvic.h" +#include "hw_ssi.h" + +#include "gpio.h" +#include "interrupt.h" +#include "sysctl.h" +#include "uart.h" +#include "ssi.h" +#include "pdc.h" + +#endif diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/debug.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/debug.h new file mode 100644 index 0000000..2f259bd --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/debug.h @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// debug.h - Macros for assisting debug of the driver library. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +//***************************************************************************** +// +// Prototype for the function that is called when an invalid argument is passed +// to an API. This is only used when doing a DEBUG build. +// +//***************************************************************************** +extern void __error__(char *pcFilename, unsigned long ulLine); + +//***************************************************************************** +// +// The ASSERT macro, which does the actual assertion checking. Typically, this +// will be for procedure arguments. +// +//***************************************************************************** +#ifdef DEBUG +#define ASSERT(expr) { \ + if(!(expr)) \ + { \ + __error__(__FILE__, __LINE__); \ + } \ + } +#else +#define ASSERT(expr) +#endif + +#endif // __DEBUG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/gpio.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/gpio.h new file mode 100644 index 0000000..cdc9a5b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/gpio.h @@ -0,0 +1,135 @@ +//***************************************************************************** +// +// gpio.h - Defines and Macros for GPIO API. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following values define the bit field for the ucPins argument to several +// of the APIs. +// +//***************************************************************************** +#define GPIO_PIN_0 0x00000001 // GPIO pin 0 +#define GPIO_PIN_1 0x00000002 // GPIO pin 1 +#define GPIO_PIN_2 0x00000004 // GPIO pin 2 +#define GPIO_PIN_3 0x00000008 // GPIO pin 3 +#define GPIO_PIN_4 0x00000010 // GPIO pin 4 +#define GPIO_PIN_5 0x00000020 // GPIO pin 5 +#define GPIO_PIN_6 0x00000040 // GPIO pin 6 +#define GPIO_PIN_7 0x00000080 // GPIO pin 7 + +//***************************************************************************** +// +// Values that can be passed to GPIODirModeSet as the ulPinIO parameter, and +// returned from GPIODirModeGet. +// +//***************************************************************************** +#define GPIO_DIR_MODE_IN 0x00000000 // Pin is a GPIO input +#define GPIO_DIR_MODE_OUT 0x00000001 // Pin is a GPIO output +#define GPIO_DIR_MODE_HW 0x00000002 // Pin is a peripheral function + +//***************************************************************************** +// +// Values that can be passed to GPIOIntTypeSet as the ulIntType parameter, and +// returned from GPIOIntTypeGet. +// +//***************************************************************************** +#define GPIO_FALLING_EDGE 0x00000000 // Interrupt on falling edge +#define GPIO_RISING_EDGE 0x00000004 // Interrupt on rising edge +#define GPIO_BOTH_EDGES 0x00000001 // Interrupt on both edges +#define GPIO_LOW_LEVEL 0x00000002 // Interrupt on low level +#define GPIO_HIGH_LEVEL 0x00000007 // Interrupt on high level + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulStrength parameter, +// and returned by GPIOPadConfigGet in the *pulStrength parameter. +// +//***************************************************************************** +#define GPIO_STRENGTH_2MA 0x00000001 // 2mA drive strength +#define GPIO_STRENGTH_4MA 0x00000002 // 4mA drive strength +#define GPIO_STRENGTH_8MA 0x00000004 // 8mA drive strength +#define GPIO_STRENGTH_8MA_SC 0x0000000C // 8mA drive with slew rate control + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulPadType parameter, +// and returned by GPIOPadConfigGet in the *pulPadType parameter. +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x00000008 // Push-pull +#define GPIO_PIN_TYPE_STD_WPU 0x0000000A // Push-pull with weak pull-up +#define GPIO_PIN_TYPE_STD_WPD 0x0000000C // Push-pull with weak pull-down +#define GPIO_PIN_TYPE_OD 0x00000009 // Open-drain +#define GPIO_PIN_TYPE_OD_WPU 0x0000000B // Open-drain with weak pull-up +#define GPIO_PIN_TYPE_OD_WPD 0x0000000D // Open-drain with weak pull-down +#define GPIO_PIN_TYPE_ANALOG 0x00000000 // Analog comparator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO); +extern unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType); +extern unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, + unsigned long ulPadType); +extern void GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, + unsigned long *pulPadType); +extern void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins); +extern long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked); +extern void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPortIntRegister(unsigned long ulPort, + void (*pfIntHandler)(void)); +extern void GPIOPortIntUnregister(unsigned long ulPort); +extern long GPIOPinRead(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, + unsigned char ucVal); +extern void GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins); + +#ifdef __cplusplus +} +#endif + +#endif // __GPIO_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_ints.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_ints.h new file mode 100644 index 0000000..d32cec4 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_ints.h @@ -0,0 +1,82 @@ +//***************************************************************************** +// +// hw_ints.h - Macros that define the interrupt assignment on Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_INTS_H__ +#define __HW_INTS_H__ + +//***************************************************************************** +// +// The following define the fault assignments. +// +//***************************************************************************** +#define FAULT_NMI 2 // NMI fault +#define FAULT_HARD 3 // Hard fault +#define FAULT_MPU 4 // MPU fault +#define FAULT_BUS 5 // Bus fault +#define FAULT_USAGE 6 // Usage fault +#define FAULT_SVCALL 11 // SVCall +#define FAULT_DEBUG 12 // Debug monitor +#define FAULT_PENDSV 14 // PendSV +#define FAULT_SYSTICK 15 // System Tick + +//***************************************************************************** +// +// The following define the interrupt assignments. +// +//***************************************************************************** +#define INT_GPIOA 16 // GPIO Port A +#define INT_GPIOB 17 // GPIO Port B +#define INT_GPIOC 18 // GPIO Port C +#define INT_UART0 21 // UART0 Rx and Tx +#define INT_SSI 23 // SSI Rx and Tx +#define INT_I2C 24 // I2C Master and Slave +#define INT_WATCHDOG 34 // Watchdog timer +#define INT_TIMER0A 35 // Timer 0 subtimer A +#define INT_TIMER0B 36 // Timer 0 subtimer B +#define INT_TIMER1A 37 // Timer 1 subtimer A +#define INT_TIMER1B 38 // Timer 1 subtimer B +#define INT_COMP0 41 // Analog Comparator 0 +#define INT_COMP1 42 // Analog Comparator 1 +#define INT_SYSCTL 44 // System Control (PLL, OSC, BO) +#define INT_FLASH 45 // FLASH Control + +//***************************************************************************** +// +// The total number of interrupts. +// +//***************************************************************************** +#define NUM_INTERRUPTS 46 + +//***************************************************************************** +// +// The total number of priority levels. +// +//***************************************************************************** +#define NUM_PRIORITY 8 +#define NUM_PRIORITY_BITS 3 + +#endif // __HW_INTS_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_memmap.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_memmap.h new file mode 100644 index 0000000..bef5dc6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_memmap.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// hw_memmap.h - Macros defining the memory map of Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_MEMMAP_H__ +#define __HW_MEMMAP_H__ + +//***************************************************************************** +// +// The following define the base address of the memories and peripherals. +// +//***************************************************************************** +#define FLASH_BASE 0x00000000 // FLASH memory +#define SRAM_BASE 0x20000000 // SRAM memory +#define WATCHDOG_BASE 0x40000000 // Watchdog +#define GPIO_PORTA_BASE 0x40004000 // GPIO Port A +#define GPIO_PORTB_BASE 0x40005000 // GPIO Port B +#define GPIO_PORTC_BASE 0x40006000 // GPIO Port C +#define SSI_BASE 0x40008000 // SSI +#define UART0_BASE 0x4000C000 // UART0 +#define I2C_MASTER_BASE 0x40020000 // I2C Master +#define I2C_SLAVE_BASE 0x40020800 // I2C Slave +#define TIMER0_BASE 0x40030000 // Timer0 +#define TIMER1_BASE 0x40031000 // Timer1 +#define COMP_BASE 0x4003C000 // Analog comparators +#define FLASH_CTRL_BASE 0x400FD000 // FLASH Controller +#define SYSCTL_BASE 0x400FE000 // System Control +#define ITM_BASE 0xE0000000 // Instrumentation Trace Macrocell +#define DWT_BASE 0xE0001000 // Data Watchpoint and Trace +#define FPB_BASE 0xE0002000 // FLASH Patch and Breakpoint +#define NVIC_BASE 0xE000E000 // Nested Vectored Interrupt Ctrl +#define TPIU_BASE 0xE0040000 // Trace Port Interface Unit + +#endif // __HW_MEMMAP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_nvic.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_nvic.h new file mode 100644 index 0000000..77dfe71 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_nvic.h @@ -0,0 +1,830 @@ +//***************************************************************************** +// +// hw_nvic.h - Macros used when accessing the NVIC hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_NVIC_H__ +#define __HW_NVIC_H__ + +//***************************************************************************** +// +// The following define the addresses of the NVIC registers. +// +//***************************************************************************** +#define NVIC_INT_TYPE 0xE000E004 // Interrupt Controller Type Reg. +#define NVIC_ST_CTRL 0xE000E010 // SysTick Control and Status Reg. +#define NVIC_ST_RELOAD 0xE000E014 // SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 // SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C // SysTick Calibration Value Reg. +#define NVIC_EN0 0xE000E100 // IRQ 0 to 31 Set Enable Register +#define NVIC_DIS0 0xE000E180 // IRQ 0 to 31 Clear Enable Reg. +#define NVIC_PEND0 0xE000E200 // IRQ 0 to 31 Set Pending Register +#define NVIC_UNPEND0 0xE000E280 // IRQ 0 to 31 Clear Pending Reg. +#define NVIC_ACTIVE0 0xE000E300 // IRQ 0 to 31 Active Register +#define NVIC_PRI0 0xE000E400 // IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 // IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 // IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C // IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 // IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 // IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 // IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C // IRQ 28 to 31 Priority Register +#define NVIC_CPUID 0xE000ED00 // CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 // Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 // Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C // App. Int & Reset Control Reg. +#define NVIC_SYS_CTRL 0xE000ED10 // System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 // Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C // Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 // Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 // System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. +#define NVIC_HFAULT_STAT 0xE000ED2C // Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 // Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 // Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 // Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 // MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 // MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 // MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C // MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 // MPU Region Attribute & Size Reg. +#define NVIC_DBG_CTRL 0xE000EDF0 // Debug Control and Status Reg. +#define NVIC_DBG_XFER 0xE000EDF4 // Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 // Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC // Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 // Software Trigger Interrupt Reg. + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_TYPE register. +// +//***************************************************************************** +#define NVIC_INT_TYPE_LINES_M 0x0000001F // Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CTRL register. +// +//***************************************************************************** +#define NVIC_ST_CTRL_COUNT 0x00010000 // Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 // Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 // Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 // Counter mode + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_RELOAD register. +// +//***************************************************************************** +#define NVIC_ST_RELOAD_M 0x00FFFFFF // Counter load value +#define NVIC_ST_RELOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CURRENT register. +// +//***************************************************************************** +#define NVIC_ST_CURRENT_M 0x00FFFFFF // Counter current value +#define NVIC_ST_CURRENT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CAL register. +// +//***************************************************************************** +#define NVIC_ST_CAL_NOREF 0x80000000 // No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 // Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF // 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN0 register. +// +//***************************************************************************** +#define NVIC_EN0_INT31 0x80000000 // Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 // Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 // Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 // Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 // Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 // Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 // Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 // Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 // Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 // Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 // Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 // Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 // Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 // Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 // Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 // Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 // Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 // Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 // Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 // Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 // Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 // Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 // Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 // Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 // Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 // Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 // Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 // Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 // Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 // Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 // Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 // Interrupt 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS0 register. +// +//***************************************************************************** +#define NVIC_DIS0_INT31 0x80000000 // Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 // Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 // Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 // Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 // Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 // Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 // Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 // Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 // Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 // Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 // Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 // Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 // Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 // Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 // Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 // Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 // Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 // Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 // Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 // Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 // Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 // Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 // Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 // Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 // Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 // Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 // Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 // Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 // Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 // Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 // Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 // Interrupt 0 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND0 register. +// +//***************************************************************************** +#define NVIC_PEND0_INT31 0x80000000 // Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 // Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 // Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 // Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 // Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 // Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 // Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 // Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 // Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 // Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 // Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 // Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 // Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 // Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 // Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 // Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 // Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 // Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 // Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 // Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 // Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 // Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 // Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 // Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 // Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 // Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 // Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 // Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 // Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 // Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 // Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 // Interrupt 0 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND0 register. +// +//***************************************************************************** +#define NVIC_UNPEND0_INT31 0x80000000 // Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 // Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 // Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 // Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 // Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 // Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 // Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 // Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 // Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 // Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 // Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 // Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 // Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 // Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 // Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 // Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 // Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 // Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 // Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 // Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 // Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 // Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 // Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 // Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 // Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 // Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 // Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 // Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 // Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 // Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 // Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 // Interrupt 0 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE0 register. +// +//***************************************************************************** +#define NVIC_ACTIVE0_INT31 0x80000000 // Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 // Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 // Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 // Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 // Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 // Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 // Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 // Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 // Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 // Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 // Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 // Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 // Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 // Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 // Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 // Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 // Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 // Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 // Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 // Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 // Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 // Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 // Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 // Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 // Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 // Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 // Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 // Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 // Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 // Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 // Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 // Interrupt 0 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI0 register. +// +//***************************************************************************** +#define NVIC_PRI0_INT3_M 0xFF000000 // Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 // Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 // Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF // Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI1 register. +// +//***************************************************************************** +#define NVIC_PRI1_INT7_M 0xFF000000 // Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 // Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 // Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF // Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI2 register. +// +//***************************************************************************** +#define NVIC_PRI2_INT11_M 0xFF000000 // Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 // Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 // Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF // Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI3 register. +// +//***************************************************************************** +#define NVIC_PRI3_INT15_M 0xFF000000 // Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 // Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 // Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF // Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI4 register. +// +//***************************************************************************** +#define NVIC_PRI4_INT19_M 0xFF000000 // Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 // Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 // Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF // Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI5 register. +// +//***************************************************************************** +#define NVIC_PRI5_INT23_M 0xFF000000 // Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 // Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 // Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF // Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI6 register. +// +//***************************************************************************** +#define NVIC_PRI6_INT27_M 0xFF000000 // Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 // Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 // Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF // Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI7 register. +// +//***************************************************************************** +#define NVIC_PRI7_INT31_M 0xFF000000 // Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 // Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 // Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF // Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CPUID register. +// +//***************************************************************************** +#define NVIC_CPUID_IMP_M 0xFF000000 // Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 // Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 // Processor part number +#define NVIC_CPUID_REV_M 0x0000000F // Revision + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_CTRL register. +// +//***************************************************************************** +#define NVIC_INT_CTRL_NMI_SET 0x80000000 // Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 // Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 // Unpend a PendSV +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 // Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 // Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 // Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 // Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF // Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_VTABLE register. +// +//***************************************************************************** +#define NVIC_VTABLE_BASE 0x20000000 // Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 // Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_APINT register. +// +//***************************************************************************** +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 // Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 // Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 // Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 // Priority group +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 // Priority group 7.1 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 // Priority group 6.2 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 // Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 // Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 // Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 // Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 // Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 // Priority group 0.8 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 // System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 // Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 // System reset + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 // Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 // Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 // Sleep on ISR exit + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CFG_CTRL register. +// +//***************************************************************************** +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 // Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 // Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 // Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 // Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 // Thread state control + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI1 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI1_RES_M 0xFF000000 // Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 // Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 // Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF // Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI2 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 // Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF // Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI3 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 // Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 // Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 // Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF // Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_HND_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 // Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 // Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 // Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 // SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 // Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 // Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 // PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 // Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 // SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 // Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 // Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 // Mem manage is active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_STAT register. +// +//***************************************************************************** +#define NVIC_FAULT_STAT_DIV0 0x02000000 // Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 // Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 // No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 // Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 // Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 // Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 // Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 // Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 // Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 // Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 // Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 // MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 // Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 // Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 // Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 // Instruction access violation + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_HFAULT_STAT register. +// +//***************************************************************************** +#define NVIC_HFAULT_STAT_DBG 0x80000000 // Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 // Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 // Vector table read fault + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DEBUG_STAT register. +// +//***************************************************************************** +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 // EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 // Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 // DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 // Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 // Halt request + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MM_ADDR register. +// +//***************************************************************************** +#define NVIC_MM_ADDR_M 0xFFFFFFFF // Data fault address +#define NVIC_MM_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_ADDR register. +// +//***************************************************************************** +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF // Data bus fault address +#define NVIC_FAULT_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_STACK register. +// +//***************************************************************************** +#define NVIC_EXC_STACK_DEEP 0x00000001 // Exception stack + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_NUM register. +// +//***************************************************************************** +#define NVIC_EXC_NUM_M 0x000003FF // Exception number +#define NVIC_EXC_NUM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_COPRO register. +// +//***************************************************************************** +#define NVIC_COPRO_15_M 0xC0000000 // Coprocessor 15 access mask +#define NVIC_COPRO_15_DENIED 0x00000000 // Coprocessor 15 access denied +#define NVIC_COPRO_15_PRIV 0x40000000 // Coprocessor 15 privileged addess +#define NVIC_COPRO_15_FULL 0xC0000000 // Coprocessor 15 full access +#define NVIC_COPRO_14_M 0x30000000 // Coprocessor 14 access mask +#define NVIC_COPRO_14_DENIED 0x00000000 // Coprocessor 14 access denied +#define NVIC_COPRO_14_PRIV 0x10000000 // Coprocessor 14 privileged addess +#define NVIC_COPRO_14_FULL 0x30000000 // Coprocessor 14 full access +#define NVIC_COPRO_13_M 0x0C000000 // Coprocessor 13 access mask +#define NVIC_COPRO_13_DENIED 0x00000000 // Coprocessor 13 access denied +#define NVIC_COPRO_13_PRIV 0x04000000 // Coprocessor 13 privileged addess +#define NVIC_COPRO_13_FULL 0x0C000000 // Coprocessor 13 full access +#define NVIC_COPRO_12_M 0x03000000 // Coprocessor 12 access mask +#define NVIC_COPRO_12_DENIED 0x00000000 // Coprocessor 12 access denied +#define NVIC_COPRO_12_PRIV 0x01000000 // Coprocessor 12 privileged addess +#define NVIC_COPRO_12_FULL 0x03000000 // Coprocessor 12 full access +#define NVIC_COPRO_11_M 0x00C00000 // Coprocessor 11 access mask +#define NVIC_COPRO_11_DENIED 0x00000000 // Coprocessor 11 access denied +#define NVIC_COPRO_11_PRIV 0x00400000 // Coprocessor 11 privileged addess +#define NVIC_COPRO_11_FULL 0x00C00000 // Coprocessor 11 full access +#define NVIC_COPRO_10_M 0x00300000 // Coprocessor 10 access mask +#define NVIC_COPRO_10_DENIED 0x00000000 // Coprocessor 10 access denied +#define NVIC_COPRO_10_PRIV 0x00100000 // Coprocessor 10 privileged addess +#define NVIC_COPRO_10_FULL 0x00300000 // Coprocessor 10 full access +#define NVIC_COPRO_9_M 0x000C0000 // Coprocessor 9 access mask +#define NVIC_COPRO_9_DENIED 0x00000000 // Coprocessor 9 access denied +#define NVIC_COPRO_9_PRIV 0x00040000 // Coprocessor 9 privileged addess +#define NVIC_COPRO_9_FULL 0x000C0000 // Coprocessor 9 full access +#define NVIC_COPRO_8_M 0x00030000 // Coprocessor 8 access mask +#define NVIC_COPRO_8_DENIED 0x00000000 // Coprocessor 8 access denied +#define NVIC_COPRO_8_PRIV 0x00010000 // Coprocessor 8 privileged addess +#define NVIC_COPRO_8_FULL 0x00030000 // Coprocessor 8 full access +#define NVIC_COPRO_7_M 0x0000C000 // Coprocessor 7 access mask +#define NVIC_COPRO_7_DENIED 0x00000000 // Coprocessor 7 access denied +#define NVIC_COPRO_7_PRIV 0x00004000 // Coprocessor 7 privileged addess +#define NVIC_COPRO_7_FULL 0x0000C000 // Coprocessor 7 full access +#define NVIC_COPRO_6_M 0x00003000 // Coprocessor 6 access mask +#define NVIC_COPRO_6_DENIED 0x00000000 // Coprocessor 6 access denied +#define NVIC_COPRO_6_PRIV 0x00001000 // Coprocessor 6 privileged addess +#define NVIC_COPRO_6_FULL 0x00003000 // Coprocessor 6 full access +#define NVIC_COPRO_5_M 0x00000C00 // Coprocessor 5 access mask +#define NVIC_COPRO_5_DENIED 0x00000000 // Coprocessor 5 access denied +#define NVIC_COPRO_5_PRIV 0x00000400 // Coprocessor 5 privileged addess +#define NVIC_COPRO_5_FULL 0x00000C00 // Coprocessor 5 full access +#define NVIC_COPRO_4_M 0x00000300 // Coprocessor 4 access mask +#define NVIC_COPRO_4_DENIED 0x00000000 // Coprocessor 4 access denied +#define NVIC_COPRO_4_PRIV 0x00000100 // Coprocessor 4 privileged addess +#define NVIC_COPRO_4_FULL 0x00000300 // Coprocessor 4 full access +#define NVIC_COPRO_3_M 0x000000C0 // Coprocessor 3 access mask +#define NVIC_COPRO_3_DENIED 0x00000000 // Coprocessor 3 access denied +#define NVIC_COPRO_3_PRIV 0x00000040 // Coprocessor 3 privileged addess +#define NVIC_COPRO_3_FULL 0x000000C0 // Coprocessor 3 full access +#define NVIC_COPRO_2_M 0x00000030 // Coprocessor 2 access mask +#define NVIC_COPRO_2_DENIED 0x00000000 // Coprocessor 2 access denied +#define NVIC_COPRO_2_PRIV 0x00000010 // Coprocessor 2 privileged addess +#define NVIC_COPRO_2_FULL 0x00000030 // Coprocessor 2 full access +#define NVIC_COPRO_1_M 0x0000000C // Coprocessor 1 access mask +#define NVIC_COPRO_1_DENIED 0x00000000 // Coprocessor 1 access denied +#define NVIC_COPRO_1_PRIV 0x00000004 // Coprocessor 1 privileged addess +#define NVIC_COPRO_1_FULL 0x0000000C // Coprocessor 1 full access +#define NVIC_COPRO_0_M 0x00000003 // Coprocessor 0 access mask +#define NVIC_COPRO_0_DENIED 0x00000000 // Coprocessor 0 access denied +#define NVIC_COPRO_0_PRIV 0x00000001 // Coprocessor 0 privileged addess +#define NVIC_COPRO_0_FULL 0x00000003 // Coprocessor 0 full access + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_TYPE register. +// +//***************************************************************************** +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 // Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 // Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 // Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_CTRL register. +// +//***************************************************************************** +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 // MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 // MPU enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_NUMBER register. +// +//***************************************************************************** +#define NVIC_MPU_NUMBER_M 0x000000FF // MPU region to access +#define NVIC_MPU_NUMBER_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_BASE register. +// +//***************************************************************************** +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFF00 // Base address +#define NVIC_MPU_BASE_VALID 0x00000010 // Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F // Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_ATTR register. +// +//***************************************************************************** +#define NVIC_MPU_ATTR_ATTRS 0xFFFF0000 // Attributes +#define NVIC_MPU_ATTR_SRD 0x0000FF00 // Sub-region disable +#define NVIC_MPU_ATTR_SZENABLE 0x000000FF // Region size + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_CTRL register. +// +//***************************************************************************** +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 // Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 // Debug key +#define NVIC_DBG_CTRL_MON_PEND 0x00008000 // Pend the monitor +#define NVIC_DBG_CTRL_MON_REQ 0x00004000 // Monitor request +#define NVIC_DBG_CTRL_MON_EN 0x00002000 // Debug monitor enable +#define NVIC_DBG_CTRL_MONSTEP 0x00001000 // Monitor step the core +#define NVIC_DBG_CTRL_S_SLEEP 0x00000400 // Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00000200 // Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00000100 // Register read/write available +#define NVIC_DBG_CTRL_S_LOCKUP 0x00000080 // Core is locked up +#define NVIC_DBG_CTRL_C_RESET 0x00000010 // Reset the core +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 // Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 // Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 // Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 // Enable debug + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_XFER register. +// +//***************************************************************************** +#define NVIC_DBG_XFER_REG_WNR 0x00010000 // Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F // Register +#define NVIC_DBG_XFER_REG_R0 0x00000000 // Register R0 +#define NVIC_DBG_XFER_REG_R1 0x00000001 // Register R1 +#define NVIC_DBG_XFER_REG_R2 0x00000002 // Register R2 +#define NVIC_DBG_XFER_REG_R3 0x00000003 // Register R3 +#define NVIC_DBG_XFER_REG_R4 0x00000004 // Register R4 +#define NVIC_DBG_XFER_REG_R5 0x00000005 // Register R5 +#define NVIC_DBG_XFER_REG_R6 0x00000006 // Register R6 +#define NVIC_DBG_XFER_REG_R7 0x00000007 // Register R7 +#define NVIC_DBG_XFER_REG_R8 0x00000008 // Register R8 +#define NVIC_DBG_XFER_REG_R9 0x00000009 // Register R9 +#define NVIC_DBG_XFER_REG_R10 0x0000000A // Register R10 +#define NVIC_DBG_XFER_REG_R11 0x0000000B // Register R11 +#define NVIC_DBG_XFER_REG_R12 0x0000000C // Register R12 +#define NVIC_DBG_XFER_REG_R13 0x0000000D // Register R13 +#define NVIC_DBG_XFER_REG_R14 0x0000000E // Register R14 +#define NVIC_DBG_XFER_REG_R15 0x0000000F // Register R15 +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 // xPSR/Flags register +#define NVIC_DBG_XFER_REG_MSP 0x00000011 // Main SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 // Process SP +#define NVIC_DBG_XFER_REG_DSP 0x00000013 // Deep SP +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 // Control/Fault/BasePri/PriMask + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_DATA register. +// +//***************************************************************************** +#define NVIC_DBG_DATA_M 0xFFFFFFFF // Data temporary cache +#define NVIC_DBG_DATA_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_INT register. +// +//***************************************************************************** +#define NVIC_DBG_INT_HARDERR 0x00000400 // Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 // Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 // Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 // Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 // Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 // Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 // Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 // Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 // Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 // Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 // Reset vector catch + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SW_TRIG register. +// +//***************************************************************************** +#define NVIC_SW_TRIG_INTID_M 0x000003FF // Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 + +#endif // __HW_NVIC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_ssi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_ssi.h new file mode 100644 index 0000000..3747232 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_ssi.h @@ -0,0 +1,113 @@ +//***************************************************************************** +// +// hw_ssi.h - Macros used when accessing the SSI hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SSI_H__ +#define __HW_SSI_H__ + +//***************************************************************************** +// +// The following define the offsets of the SSI registers. +// +//***************************************************************************** +#define SSI_O_CR0 0x00000000 // Control register 0 +#define SSI_O_CR1 0x00000004 // Control register 1 +#define SSI_O_DR 0x00000008 // Data register +#define SSI_O_SR 0x0000000C // Status register +#define SSI_O_CPSR 0x00000010 // Clock prescale register +#define SSI_O_IM 0x00000014 // Int mask set and clear register +#define SSI_O_RIS 0x00000018 // Raw interrupt register +#define SSI_O_MIS 0x0000001C // Masked interrupt register +#define SSI_O_ICR 0x00000020 // Interrupt clear register + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 0. +// +//***************************************************************************** +#define SSI_CR0_SCR 0x0000FF00 // Serial clock rate +#define SSI_CR0_SPH 0x00000080 // SSPCLKOUT phase +#define SSI_CR0_SPO 0x00000040 // SSPCLKOUT polarity +#define SSI_CR0_FRF_MASK 0x00000030 // Frame format mask +#define SSI_CR0_FRF_MOTO 0x00000000 // Motorola SPI frame format +#define SSI_CR0_FRF_TI 0x00000010 // TI sync serial frame format +#define SSI_CR0_FRF_NMW 0x00000020 // National Microwire frame format +#define SSI_CR0_DSS 0x0000000F // Data size select +#define SSI_CR0_DSS_4 0x00000003 // 4 bit data +#define SSI_CR0_DSS_5 0x00000004 // 5 bit data +#define SSI_CR0_DSS_6 0x00000005 // 6 bit data +#define SSI_CR0_DSS_7 0x00000006 // 7 bit data +#define SSI_CR0_DSS_8 0x00000007 // 8 bit data +#define SSI_CR0_DSS_9 0x00000008 // 9 bit data +#define SSI_CR0_DSS_10 0x00000009 // 10 bit data +#define SSI_CR0_DSS_11 0x0000000A // 11 bit data +#define SSI_CR0_DSS_12 0x0000000B // 12 bit data +#define SSI_CR0_DSS_13 0x0000000C // 13 bit data +#define SSI_CR0_DSS_14 0x0000000D // 14 bit data +#define SSI_CR0_DSS_15 0x0000000E // 15 bit data +#define SSI_CR0_DSS_16 0x0000000F // 16 bit data + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 1. +// +//***************************************************************************** +#define SSI_CR1_SOD 0x00000008 // Slave mode output disable +#define SSI_CR1_MS 0x00000004 // Master or slave mode select +#define SSI_CR1_SSE 0x00000002 // Sync serial port enable +#define SSI_CR1_LBM 0x00000001 // Loopback mode + +//***************************************************************************** +// +// The following define the bit fields in the SSI Status register +// +//***************************************************************************** +#define SSI_SR_BSY 0x00000010 // SSI busy +#define SSI_SR_RFF 0x00000008 // RX FIFO full +#define SSI_SR_RNE 0x00000004 // RX FIFO not empty +#define SSI_SR_TNF 0x00000002 // TX FIFO not full +#define SSI_SR_TFE 0x00000001 // TX FIFO empty + +//***************************************************************************** +// +// The following define information concerning the SSI Data register. +// +//***************************************************************************** +#define TX_FIFO_SIZE (8) // Number of entries in the TX FIFO +#define RX_FIFO_SIZE (8) // Number of entries in the RX FIFO + +//***************************************************************************** +// +// The following define the bit fields in the interrupt mask set and clear, +// raw interrupt, masked interrupt, and interrupt clear registers. +// +//***************************************************************************** +#define SSI_INT_TXFF 0x00000008 // TX FIFO interrupt +#define SSI_INT_RXFF 0x00000004 // RX FIFO interrupt +#define SSI_INT_RXTO 0x00000002 // RX timeout interrupt +#define SSI_INT_RXOR 0x00000001 // RX overrun interrupt + +#endif // __HW_SSI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_sysctl.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_sysctl.h new file mode 100644 index 0000000..e3ef94f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_sysctl.h @@ -0,0 +1,325 @@ +//***************************************************************************** +// +// hw_sysctl.h - Macros used when accessing the system control hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SYSCTL_H__ +#define __HW_SYSCTL_H__ + +//***************************************************************************** +// +// The following define the offsets of the system control registers. +// +//***************************************************************************** +#define SYSCTL_DID0 0x400fe000 // Device identification register 0 +#define SYSCTL_DID1 0x400fe004 // Device identification register 1 +#define SYSCTL_DC0 0x400fe008 // Device capabilities register 0 +#define SYSCTL_DC1 0x400fe010 // Device capabilities register 1 +#define SYSCTL_DC2 0x400fe014 // Device capabilities register 2 +#define SYSCTL_DC3 0x400fe018 // Device capabilities register 3 +#define SYSCTL_DC4 0x400fe01C // Device capabilities register 4 +#define SYSCTL_PBORCTL 0x400fe030 // POR/BOR reset control register +#define SYSCTL_LDOPCTL 0x400fe034 // LDO power control register +#define SYSCTL_SRCR0 0x400fe040 // Software reset control reg 0 +#define SYSCTL_SRCR1 0x400fe044 // Software reset control reg 1 +#define SYSCTL_SRCR2 0x400fe048 // Software reset control reg 2 +#define SYSCTL_RIS 0x400fe050 // Raw interrupt status register +#define SYSCTL_IMC 0x400fe054 // Interrupt mask/control register +#define SYSCTL_MISC 0x400fe058 // Interrupt status register +#define SYSCTL_RESC 0x400fe05c // Reset cause register +#define SYSCTL_RCC 0x400fe060 // Run-mode clock config register +#define SYSCTL_PLLCFG 0x400fe064 // PLL configuration register +#define SYSCTL_RCGC0 0x400fe100 // Run-mode clock gating register 0 +#define SYSCTL_RCGC1 0x400fe104 // Run-mode clock gating register 1 +#define SYSCTL_RCGC2 0x400fe108 // Run-mode clock gating register 2 +#define SYSCTL_SCGC0 0x400fe110 // Sleep-mode clock gating reg 0 +#define SYSCTL_SCGC1 0x400fe114 // Sleep-mode clock gating reg 1 +#define SYSCTL_SCGC2 0x400fe118 // Sleep-mode clock gating reg 2 +#define SYSCTL_DCGC0 0x400fe120 // Deep Sleep-mode clock gate reg 0 +#define SYSCTL_DCGC1 0x400fe124 // Deep Sleep-mode clock gate reg 1 +#define SYSCTL_DCGC2 0x400fe128 // Deep Sleep-mode clock gate reg 2 +#define SYSCTL_CLKVCLR 0x400fe150 // Clock verifcation clear register +#define SYSCTL_LDOARST 0x400fe160 // LDO reset control register + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID0 register. +// +//***************************************************************************** +#define SYSCTL_DID0_MAJ_MASK 0x0000FF00 // Major revision mask +#define SYSCTL_DID0_MAJ_A 0x00000000 // Major revision A +#define SYSCTL_DID0_MAJ_B 0x00000100 // Major revision B +#define SYSCTL_DID0_MIN_MASK 0x000000FF // Minor revision mask +#define SYSCTL_DID0_MIN_0 0x00000000 // Minor revision 0 +#define SYSCTL_DID0_MIN_1 0x00000001 // Minor revision 1 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID1 register. +// +//***************************************************************************** +#define SYSCTL_DID1_VER_MASK 0xF0000000 // Register version mask +#define SYSCTL_DID1_FAM_MASK 0x0F000000 // Family mask +#define SYSCTL_DID1_FAM_S 0x00000000 // Stellaris family +#define SYSCTL_DID1_PRTNO_MASK 0x00FF0000 // Part number mask +#define SYSCTL_DID1_PRTNO_101 0x00010000 // LM3S101 +#define SYSCTL_DID1_PRTNO_102 0x00020000 // LM3S102 +#define SYSCTL_DID1_TEMP_MASK 0x000000E0 // Temperature range mask +#define SYSCTL_DID1_TEMP_C 0x00000000 // Commercial temp range (0..70C) +#define SYSCTL_DID1_TEMP_I 0x00000020 // Industrial temp range (-40..85C) +#define SYSCTL_DID1_PKG_MASK 0x00000018 // Package mask +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 // 28-pin SOIC +#define SYSCTL_DID1_ROHS 0x00000004 // Part is RoHS compliant +#define SYSCTL_DID1_QUAL_MASK 0x00000003 // Qualification status mask +#define SYSCTL_DID1_QUAL_ES 0x00000000 // Engineering sample (unqualified) +#define SYSCTL_DID1_QUAL_PP 0x00000001 // Pilot production (unqualified) +#define SYSCTL_DID1_QUAL_FQ 0x00000002 // Fully qualified +#define SYSCTL_DID1_PRTNO_SHIFT 16 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC0 register. +// +//***************************************************************************** +#define SYSCTL_DC0_SRAMSZ_MASK 0xFFFF0000 // SRAM size mask +#define SYSCTL_DC0_SRAMSZ_2KB 0x00070000 // 2kB of SRAM +#define SYSCTL_DC0_FLASHSZ_MASK 0x0000FFFF // Flash size mask +#define SYSCTL_DC0_FLASHSZ_8KB 0x00000003 // 8kB of flash + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC1 register. +// +//***************************************************************************** +#define SYSCTL_DC1_SYSDIV_MASK 0x0000F000 // Minimum system divider mask +#define SYSCTL_DC1_MPU 0x00000080 // Cortex-M3 MPU present +#define SYSCTL_DC1_PLL 0x00000010 // PLL present +#define SYSCTL_DC1_WDOG 0x00000008 // Watchdog present +#define SYSCTL_DC1_SWO 0x00000004 // Serial wire output present +#define SYSCTL_DC1_SWD 0x00000002 // Serial wire debug present +#define SYSCTL_DC1_JTAG 0x00000001 // JTAG debug present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC2 register. +// +//***************************************************************************** +#define SYSCTL_DC2_COMP1 0x02000000 // Analog comparator 1 present +#define SYSCTL_DC2_COMP0 0x01000000 // Analog comparator 0 present +#define SYSCTL_DC2_TIMER1 0x00020000 // Timer 1 present +#define SYSCTL_DC2_TIMER0 0x00010000 // Timer 0 present +#define SYSCTL_DC2_I2C 0x00001000 // I2C present +#define SYSCTL_DC2_SSI 0x00000010 // SSI present +#define SYSCTL_DC2_UART0 0x00000001 // UART 0 present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC3 register. +// +//***************************************************************************** +#define SYSCTL_DC3_32KHZ 0x80000000 // 32kHz pin present +#define SYSCTL_DC3_CCP1 0x02000000 // CCP1 pin present +#define SYSCTL_DC3_CCP0 0x01000000 // CCP0 pin present +#define SYSCTL_DC3_C1MINUS 0x00000200 // C1- pin present +#define SYSCTL_DC3_C0O 0x00000100 // C0o pin present +#define SYSCTL_DC3_C0PLUS 0x00000080 // C0+ pin present +#define SYSCTL_DC3_C0MINUS 0x00000040 // C0- pin present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC4 register. +// +//***************************************************************************** +#define SYSCTL_DC4_GPIOC 0x00000004 // GPIO port C present +#define SYSCTL_DC4_GPIOB 0x00000002 // GPIO port B present +#define SYSCTL_DC4_GPIOA 0x00000001 // GPIO port A present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PBORCTL register. +// +//***************************************************************************** +#define SYSCTL_PBORCTL_BOR_MASK 0x0000FFFC // BOR wait timer +#define SYSCTL_PBORCTL_BORIOR 0x00000002 // BOR interrupt or reset +#define SYSCTL_PBORCTL_BORWT 0x00000001 // BOR wait and check for noise +#define SYSCTL_PBORCTL_BOR_SH 2 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOPCTL register. +// +//***************************************************************************** +#define SYSCTL_LDOPCTL_MASK 0x0000003F // Voltage adjust mask +#define SYSCTL_LDOPCTL_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDOPCTL_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDOPCTL_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDOPCTL_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDOPCTL_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDOPCTL_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDOPCTL_2_55V 0x0000001F // LDO output of 2.55V +#define SYSCTL_LDOPCTL_2_60V 0x0000001E // LDO output of 2.60V +#define SYSCTL_LDOPCTL_2_65V 0x0000001D // LDO output of 2.65V +#define SYSCTL_LDOPCTL_2_70V 0x0000001C // LDO output of 2.70V +#define SYSCTL_LDOPCTL_2_75V 0x0000001B // LDO output of 2.75V + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR0, SYSCTL_RCGC0, +// SYSCTL_SCGC0, and SYSCTL_DCGC0 registers. +// +//***************************************************************************** +#define SYSCTL_SET0_WDOG 0x00000008 // Watchdog module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR1, SYSCTL_RCGC1, +// SYSCTL_SCGC1, and SYSCTL_DCGC1 registers. +// +//***************************************************************************** +#define SYSCTL_SET1_COMP1 0x02000000 // Analog comparator module 1 +#define SYSCTL_SET1_COMP0 0x01000000 // Analog comparator module 0 +#define SYSCTL_SET1_TIMER1 0x00020000 // Timer module 1 +#define SYSCTL_SET1_TIMER0 0x00010000 // Timer module 0 +#define SYSCTL_SET1_I2C 0x00001000 // I2C module +#define SYSCTL_SET1_SSI 0x00000010 // SSI module +#define SYSCTL_SET1_UART0 0x00000001 // UART module 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR2, SYSCTL_RCGC2, +// SYSCTL_SCGC2, and SYSCTL_DCGC2 registers. +// +//***************************************************************************** +#define SYSCTL_SET2_GPIOC 0x00000004 // GPIO C module +#define SYSCTL_SET2_GPIOB 0x00000002 // GPIO B module +#define SYSCTL_SET2_GPIOA 0x00000001 // GIPO A module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RIS, SYSCTL_IMC, and +// SYSCTL_IMS registers. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_BOSC_FAIL 0x00000010 // Boot oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RESC register. +// +//***************************************************************************** +#define SYSCTL_RESC_LDO 0x00000020 // LDO power OK lost reset +#define SYSCTL_RESC_SW 0x00000010 // Software reset +#define SYSCTL_RESC_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_RESC_BOR 0x00000004 // Brown-out reset +#define SYSCTL_RESC_POR 0x00000002 // Power on reset +#define SYSCTL_RESC_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC register. +// +//***************************************************************************** +#define SYSCTL_RCC_ACG 0x08000000 // Automatic clock gating +#define SYSCTL_RCC_SYSDIV_MASK 0x07800000 // System clock divider +#define SYSCTL_RCC_SYSDIV_2 0x00800000 // System clock /2 +#define SYSCTL_RCC_SYSDIV_3 0x01000000 // System clock /3 +#define SYSCTL_RCC_SYSDIV_4 0x01800000 // System clock /4 +#define SYSCTL_RCC_SYSDIV_5 0x02000000 // System clock /5 +#define SYSCTL_RCC_SYSDIV_6 0x02800000 // System clock /6 +#define SYSCTL_RCC_SYSDIV_7 0x03000000 // System clock /7 +#define SYSCTL_RCC_SYSDIV_8 0x03800000 // System clock /8 +#define SYSCTL_RCC_SYSDIV_9 0x04000000 // System clock /9 +#define SYSCTL_RCC_SYSDIV_10 0x04800000 // System clock /10 +#define SYSCTL_RCC_SYSDIV_11 0x05000000 // System clock /11 +#define SYSCTL_RCC_SYSDIV_12 0x05800000 // System clock /12 +#define SYSCTL_RCC_SYSDIV_13 0x06000000 // System clock /13 +#define SYSCTL_RCC_SYSDIV_14 0x06800000 // System clock /14 +#define SYSCTL_RCC_SYSDIV_15 0x07000000 // System clock /15 +#define SYSCTL_RCC_SYSDIV_16 0x07800000 // System clock /16 +#define SYSCTL_RCC_USE_SYSDIV 0x00400000 // Use sytem clock divider +#define SYSCTL_RCC_PWRDN 0x00002000 // PLL power down +#define SYSCTL_RCC_OE 0x00001000 // PLL output enable +#define SYSCTL_RCC_BYPASS 0x00000800 // PLL bypass +#define SYSCTL_RCC_PLLVER 0x00000400 // PLL verification timer enable +#define SYSCTL_RCC_XTAL_MASK 0x000003C0 // Crystal attached to main osc +#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100 // Using a 3.579545MHz crystal +#define SYSCTL_RCC_XTAL_3_68MHz 0x00000140 // Using a 3.6864MHz crystal +#define SYSCTL_RCC_XTAL_4MHz 0x00000180 // Using a 4MHz crystal +#define SYSCTL_RCC_XTAL_4_09MHZ 0x000001C0 // Using a 4.096MHz crystal +#define SYSCTL_RCC_XTAL_4_91MHZ 0x00000200 // Using a 4.9152MHz crystal +#define SYSCTL_RCC_XTAL_5MHZ 0x00000240 // Using a 5MHz crystal +#define SYSCTL_RCC_XTAL_5_12MHZ 0x00000280 // Using a 5.12MHz crystal +#define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 // Using a 6MHz crystal +#define SYSCTL_RCC_XTAL_6_14MHZ 0x00000300 // Using a 6.144MHz crystal +#define SYSCTL_RCC_XTAL_7_37MHZ 0x00000340 // Using a 7.3728MHz crystal +#define SYSCTL_RCC_XTAL_8MHZ 0x00000380 // Using a 8MHz crystal +#define SYSCTL_RCC_XTAL_8_19MHZ 0x000003C0 // Using a 8.192MHz crystal +#define SYSCTL_RCC_OSCSRC_MASK 0x00000030 // Oscillator input select +#define SYSCTL_RCC_OSCSRC_MAIN 0x00000000 // Use the main oscillator +#define SYSCTL_RCC_OSCSRC_BOOT 0x00000010 // Use the boot oscillator +#define SYSCTL_RCC_OSCSRC_BOOT4 0x00000020 // Use the boot oscillator / 4 +#define SYSCTL_RCC_BOSCVER 0x00000008 // Boot osc. verification timer en +#define SYSCTL_RCC_MOSCVER 0x00000004 // Main osc. verification timer en +#define SYSCTL_RCC_BOSCDIS 0x00000002 // Boot oscillator disable +#define SYSCTL_RCC_MOSCDIS 0x00000001 // Main oscillator disable +#define SYSCTL_RCC_SYSDIV_SHIFT 23 // Shift to the SYSDIV field +#define SYSCTL_RCC_XTAL_SHIFT 6 // Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_SHIFT 4 // Shift to the OSCSRC field + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PLLCFG register. +// +//***************************************************************************** +#define SYSCTL_PLLCFG_OD_MASK 0x0000C000 // Output divider +#define SYSCTL_PLLCFG_OD_1 0x00000000 // Output divider is 1 +#define SYSCTL_PLLCFG_OD_2 0x00004000 // Output divider is 2 +#define SYSCTL_PLLCFG_OD_4 0x00008000 // Output divider is 4 +#define SYSCTL_PLLCFG_F_MASK 0x00003FE0 // PLL multiplier +#define SYSCTL_PLLCFG_R_MASK 0x0000001F // Input predivider +#define SYSCTL_PLLCFG_F_SHIFT 5 +#define SYSCTL_PLLCFG_R_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_CLKVCLR register. +// +//***************************************************************************** +#define SYSCTL_CLKVCLR_CLR 0x00000001 // Clear clock verification fault + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOARST register. +// +//***************************************************************************** +#define SYSCTL_LDOARST_ARST 0x00000001 // Allow LDO to reset device + +#endif // __HW_SYSCTL_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_types.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_types.h new file mode 100644 index 0000000..a944f66 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_types.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// hw_types.h - Common types and macros. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TYPES_H__ +#define __HW_TYPES_H__ + +//***************************************************************************** +// +// Define a boolean type, and values for true and false. +// +//***************************************************************************** +typedef unsigned char tBoolean; + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +//***************************************************************************** +// +// Macros for hardware access, both direct and via the bit-band region. +// +//***************************************************************************** +#define HWREG(x) \ + (*((volatile unsigned long *)(x))) +#define HWREGBITW(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITH(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITB(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) + +#endif // __HW_TYPES_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_uart.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_uart.h new file mode 100644 index 0000000..40b6ab2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/hw_uart.h @@ -0,0 +1,234 @@ +//***************************************************************************** +// +// hw_uart.h - Macros and defines used when accessing the UART hardware +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_UART_H__ +#define __HW_UART_H__ + +//***************************************************************************** +// +// UART Register Offsets. +// +//***************************************************************************** +#define UART_O_DR 0x00000000 // Data Register +#define UART_O_RSR 0x00000004 // Receive Status Register (read) +#define UART_O_ECR 0x00000004 // Error Clear Register (write) +#define UART_O_FR 0x00000018 // Flag Register (read only) +#define UART_O_IBRD 0x00000024 // Integer Baud Rate Divisor Reg +#define UART_O_FBRD 0x00000028 // Fractional Baud Rate Divisor Reg +#define UART_O_LCR_H 0x0000002C // Line Control Register, HIGH byte +#define UART_O_CTL 0x00000030 // Control Register +#define UART_O_IFLS 0x00000034 // Interrupt FIFO Level Select Reg +#define UART_O_IM 0x00000038 // Interrupt Mask Set/Clear Reg +#define UART_O_RIS 0x0000003C // Raw Interrupt Status Register +#define UART_O_MIS 0x00000040 // Masked Interrupt Status Register +#define UART_O_ICR 0x00000044 // Interrupt Clear Register + +//***************************************************************************** +// +// Data Register bits +// +//***************************************************************************** +#define UART_DR_OE 0x00000800 // Overrun Error +#define UART_DR_BE 0x00000400 // Break Error +#define UART_DR_PE 0x00000200 // Parity Error +#define UART_DR_FE 0x00000100 // Framing Error + +//***************************************************************************** +// +// Receive Status Register bits +// +//***************************************************************************** +#define UART_RSR_OE 0x00000008 // Overrun Error +#define UART_RSR_BE 0x00000004 // Break Error +#define UART_RSR_PE 0x00000002 // Parity Error +#define UART_RSR_FE 0x00000001 // Framing Error + +//***************************************************************************** +// +// Flag Register bits +// +//***************************************************************************** +#define UART_FR_RI 0x100 // Ring Indicator +#define UART_FR_TXFE 0x080 // TX FIFO Empty +#define UART_FR_RXFF 0x040 // RX FIFO Full +#define UART_FR_TXFF 0x020 // TX FIFO Full +#define UART_FR_RXFE 0x010 // RX FIFO Empty +#define UART_FR_BUSY 0x008 // UART Busy + +//***************************************************************************** +// +// Line Control Register High bits +// +//***************************************************************************** +#define UART_LCR_H_SPS 0x80 // Stick Parity Select +#define UART_LCR_H_WLEN 0x60 // Word length +#define UART_LCR_H_WLEN_8 0x60 // 8 bit data +#define UART_LCR_H_WLEN_7 0x40 // 7 bit data +#define UART_LCR_H_WLEN_6 0x20 // 6 bit data +#define UART_LCR_H_WLEN_5 0x00 // 5 bit data +#define UART_LCR_H_FEN 0x10 // Enable FIFO +#define UART_LCR_H_STP2 0x08 // Two Stop Bits Select +#define UART_LCR_H_EPS 0x04 // Even Parity Select +#define UART_LCR_H_PEN 0x02 // Parity Enable +#define UART_LCR_H_BRK 0x01 // Send Break + +//***************************************************************************** +// +// Control Register bits +// +//***************************************************************************** +#define UART_CTL_CTSEN 0x8000 // CTS Hardware Flow Control +#define UART_CTL_RTSEN 0x4000 // RTS Hardware Flow Control +#define UART_CTL_OUT2 0x2000 // OUT2 +#define UART_CTL_OUT1 0x1000 // OUT1 +#define UART_CTL_RTS 0x0800 // Request To Send +#define UART_CTL_DTR 0x0400 // Data Terminal Ready +#define UART_CTL_RXE 0x0200 // Receive Enable +#define UART_CTL_TXE 0x0100 // Transmit Enable +#define UART_CTL_LBE 0x0080 // Loopback Enable +#define UART_CTL_IIRLP 0x0004 // IrDA SIR low power mode +#define UART_CTL_SIREN 0x0002 // SIR Enable +#define UART_CTL_UARTEN 0x0001 // UART Enable + +//***************************************************************************** +// +// Interrupt FIFO Level Select Register bits +// +//***************************************************************************** +#define UART_IFLS_RX1_8 0x00 // 1/8 Full +#define UART_IFLS_RX2_8 0x10 // 1/4 Full +#define UART_IFLS_RX4_8 0x20 // 1/2 Full +#define UART_IFLS_RX6_8 0x30 // 3/4 Full +#define UART_IFLS_RX7_8 0x40 // 7/8 Full +#define UART_IFLS_TX1_8 0x00 // 1/8 Full +#define UART_IFLS_TX2_8 0x01 // 1/4 Full +#define UART_IFLS_TX4_8 0x02 // 1/2 Full +#define UART_IFLS_TX6_8 0x03 // 3/4 Full +#define UART_IFLS_TX7_8 0x04 // 7/8 Full + +//***************************************************************************** +// +// Interrupt Mask Set/Clear Register bits +// +//***************************************************************************** +#define UART_IM_OEIM 0x400 // Overrun Error Interrupt Mask +#define UART_IM_BEIM 0x200 // Break Error Interrupt Mask +#define UART_IM_PEIM 0x100 // Parity Error Interrupt Mask +#define UART_IM_FEIM 0x080 // Framing Error Interrupt Mask +#define UART_IM_RTIM 0x040 // Receive Timeout Interrupt Mask +#define UART_IM_TXIM 0x020 // Transmit Interrupt Mask +#define UART_IM_RXIM 0x010 // Receive Interrupt Mask +#define UART_IM_DSRMIM 0x008 // DSR Interrupt Mask +#define UART_IM_DCDMIM 0x004 // DCD Interrupt Mask +#define UART_IM_CTSMIM 0x002 // CTS Interrupt Mask +#define UART_IM_RIMIM 0x001 // RI Interrupt Mask + +//***************************************************************************** +// +// Raw Interrupt Status Register +// +//***************************************************************************** +#define UART_RIS_OERIS 0x400 // Overrun Error Interrupt Status +#define UART_RIS_BERIS 0x200 // Break Error Interrupt Status +#define UART_RIS_PERIS 0x100 // Parity Error Interrupt Status +#define UART_RIS_FERIS 0x080 // Framing Error Interrupt Status +#define UART_RIS_RTRIS 0x040 // Receive Timeout Interrupt Status +#define UART_RIS_TXRIS 0x020 // Transmit Interrupt Status +#define UART_RIS_RXRIS 0x010 // Receive Interrupt Status +#define UART_RIS_DSRRMIS 0x008 // DSR Interrupt Status +#define UART_RIS_DCDRMIS 0x004 // DCD Interrupt Status +#define UART_RIS_CTSRMIS 0x002 // CTS Interrupt Status +#define UART_RIS_RIRMIS 0x001 // RI Interrupt Status + +//***************************************************************************** +// +// Masked Interrupt Status Register +// +//***************************************************************************** +#define UART_MIS_OEMIS 0x400 // Overrun Error Interrupt Status +#define UART_MIS_BEMIS 0x200 // Break Error Interrupt Status +#define UART_MIS_PEMIS 0x100 // Parity Error Interrupt Status +#define UART_MIS_FEMIS 0x080 // Framing Error Interrupt Status +#define UART_MIS_RTMIS 0x040 // Receive Timeout Interrupt Status +#define UART_MIS_TXMIS 0x020 // Transmit Interrupt Status +#define UART_MIS_RXMIS 0x010 // Receive Interrupt Status +#define UART_MIS_DSRMMIS 0x008 // DSR Interrupt Status +#define UART_MIS_DCDMMIS 0x004 // DCD Interrupt Status +#define UART_MIS_CTSMMIS 0x002 // CTS Interrupt Status +#define UART_MIS_RIMMIS 0x001 // RI Interrupt Status + +//***************************************************************************** +// +// Interrupt Clear Register bits +// +//***************************************************************************** +#define UART_ICR_OEIC 0x200 // Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x200 // Break Error Interrupt Clear +#define UART_ICR_PEIC 0x200 // Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x200 // Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x200 // Receive Timeout Interrupt Clear +#define UART_ICR_TXIC 0x200 // Transmit Interrupt Clear +#define UART_ICR_RXIC 0x200 // Receive Interrupt Clear +#define UART_ICR_DSRMIC 0x200 // DSR Interrupt Clear +#define UART_ICR_DCDMIC 0x200 // DCD Interrupt Clear +#define UART_ICR_CTSMIC 0x200 // CTS Interrupt Clear +#define UART_ICR_RIMIC 0x200 // RI Interrupt Clear + +//***************************************************************************** +// +// DMA Control Register bits +// +//***************************************************************************** +#define UART_DMACRDMAONERR 0x04 // Disable DMA On Error +#define UART_DMACRTXDMAE 0x02 // Enable Transmit DMA +#define UART_DMACRRXDMAE 0x01 // Enable Receive DMA + +#define UART_RSR_ANY (UART_RSR_OE | \ + UART_RSR_BE | \ + UART_RSR_PE | \ + UART_RSR_FE) + +//***************************************************************************** +// +// Reset Values for UART Registers. +// +//***************************************************************************** +#define UART_RV_DR 0 +#define UART_RV_RSR 0x0 +#define UART_RV_ECR 0 +#define UART_RV_FR 0x90 +#define UART_RV_IBRD 0x0000 +#define UART_RV_FBRD 0x00 +#define UART_RV_LCR_H 0x00 +#define UART_RV_CTL 0x0300 +#define UART_RV_IFLS 0x12 +#define UART_RV_IM 0x000 +#define UART_RV_RIS 0x000 +#define UART_RV_MIS 0x000 +#define UART_RV_ICR 0x000 + +#endif // __HW_UART_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/interrupt.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/interrupt.h new file mode 100644 index 0000000..23424af --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/interrupt.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// interrupt.h - Prototypes for the NVIC Interrupt Controller Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void IntMasterEnable(void); +extern void IntMasterDisable(void); +extern void IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)); +extern void IntUnregister(unsigned long ulInterrupt); +extern void IntPriorityGroupingSet(unsigned long ulBits); +extern unsigned long IntPriorityGroupingGet(void); +extern void IntPrioritySet(unsigned long ulInterrupt, + unsigned char ucPriority); +extern long IntPriorityGet(unsigned long ulInterrupt); +extern void IntEnable(unsigned long ulInterrupt); +extern void IntDisable(unsigned long ulInterrupt); + +#ifdef __cplusplus +} +#endif + +#endif // __INTERRUPT_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/pdc.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/pdc.c new file mode 100644 index 0000000..1e82ed8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/pdc.c @@ -0,0 +1,132 @@ +//***************************************************************************** +// +// pdc.c - Driver for the Peripheral Device Controller (PDC) on the Stellaris +// development board. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup utilities_api +//! @{ +// +//***************************************************************************** + +#include "hw_memmap.h" +#include "hw_types.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "pdc.h" + +//***************************************************************************** +// +//! Initializes the connection to the PDC. +//! +//! This function will enable clocking to the SSI and GPIO A modules, configure +//! the GPIO pins to be used for an SSI interface, and it will configure the +//! SSI as a 1Mb master device, operating in MOTO mode. It will also enable +//! the SSI module, and will enable the chip select for the PDC on the +//! Stellaris development board. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCInit(void) +{ + // + // Enable the peripherals used to drive the PDC. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Configure the appropriate pins to be SSI instead of GPIO. + // + GPIODirModeSet(GPIO_PORTA_BASE, SSI_CLK | SSI_TX | SSI_RX, + GPIO_DIR_MODE_HW); + GPIODirModeSet(GPIO_PORTA_BASE, SSI_CS, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTA_BASE, SSI_CLK, GPIO_STRENGTH_4MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the SSI port. + // + SSIConfig(SSI_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 8); + SSIEnable(SSI_BASE); + + // + // Reset the PDC SSI state machine. The chip select needs to be held low + // for 100ns; the procedure call overhead more than accounts for this time. + // + GPIOPinWrite(GPIO_PORTA_BASE, PDC_CS, 0); + GPIOPinWrite(GPIO_PORTA_BASE, PDC_CS, PDC_CS); +} + +//***************************************************************************** +// +//! Write a PDC register. +//! +//! \param ucAddr specifies the PDC register to write. +//! \param ucData specifies the data to write. +//! +//! This function will perform the SSI transfers required to write a register +//! in the PDC on the Stellaris development board. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCWrite(unsigned char ucAddr, unsigned char ucData) +{ + unsigned long ulTemp; + + // + // Send address and write command. + // + SSIDataPut(SSI_BASE, (ucAddr & 0x0F) | PDC_WR); + + // + // Write the data. + // + SSIDataPut(SSI_BASE, ucData); + + // + // Flush data read during address write. + // + SSIDataGet(SSI_BASE, &ulTemp); + + // + // Flush data read during data write. + // + SSIDataGet(SSI_BASE, &ulTemp); +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/pdc.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/pdc.h new file mode 100644 index 0000000..aba74cd --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/pdc.h @@ -0,0 +1,124 @@ +//***************************************************************************** +// +// pdc.h - Stellaris development board Peripheral Device Controller definitions +// and prototypes. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __PDC_H__ +#define __PDC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The registers within the peripheral device controller. +// +//***************************************************************************** +#define PDC_VER 0x0 // Version register +#define PDC_CSR 0x1 // Command/Status register +#define PDC_DSW 0x4 // DIP Switch register +#define PDC_LED 0x5 // LED register +#define PDC_LCD_CSR 0x6 // LCD Command/Status register +#define PDC_LCD_RAM 0x7 // LCD RAM register +#define PDC_GPXDAT 0x8 // GPIO X Data register +#define PDC_GPXDIR 0x9 // GPIO X Direction register +#define PDC_GPYDAT 0xA // GPIO Y Data register +#define PDC_GPYDIR 0xB // GPIO Y Direction register +#define PDC_GPZDAT 0xC // GPIO Z Data register +#define PDC_GPZDIR 0xD // GPIO Z Direction register + +//***************************************************************************** +// +// Flags indicating a read or write to the peripheral device controller. +// +//***************************************************************************** +#define PDC_RD 0x80 // PDC read command +#define PDC_WR 0x00 // PDC write command + +//***************************************************************************** +// +// LCD panel (Crystalfontz CFAH1602B) commands, RS = 0 +// +//***************************************************************************** +#define LCD_CLEAR 0x01 // Clear display (0 fill DDRAM). +#define LCD_HOME 0x02 // Cursor home. +#define LCD_MODE 0x04 // Set entry mode (cursor dir) +#define LCD_ON 0x08 // Set display, cursor, blinking + // on/off +#define LCD_CUR 0x10 // Cursor, display shift +#define LCD_IF 0x20 // Set interface data length, + // lines, font +#define LCD_CGADDR 0x40 // Set CGRAM AC address +#define LCD_DDADDR 0x80 // Set DDRAM AC address + +//***************************************************************************** +// +// LCD Status bit +// +//***************************************************************************** +#define LCD_B_BUSY 0x80 // Busy flag. + +//***************************************************************************** +// +// The GPIO port A pin numbers for the various SSI signals. +// +//***************************************************************************** +#define SSI_CS GPIO_PIN_3 +#define PDC_CS GPIO_PIN_3 +#define SSI_CLK GPIO_PIN_2 +#define SSI_TX GPIO_PIN_5 +#define SSI_RX GPIO_PIN_4 + +//***************************************************************************** +// +// Function Prototypes +// +//***************************************************************************** +extern void PDCInit(void); +extern unsigned char PDCRead(unsigned char ucAddr); +extern void PDCWrite(unsigned char ucAddr, unsigned char ucData); +extern unsigned char PDCDIPRead(void); +extern void PDCLEDWrite(unsigned char ucLED); +extern unsigned char PDCLEDRead(void); +extern void PDCLCDInit(void); +extern void PDCLCDBacklightOn(void); +extern void PDCLCDBacklightOff(void); +extern void PDCLCDClear(void); +extern void PDCLCDCreateChar(unsigned char ucChar, unsigned char *pucData); +extern void PDCLCDSetPos(unsigned char ucX, unsigned char ucY); +extern void PDCLCDWrite(const char *pcStr, unsigned long ulCount); +extern unsigned char PDCGPIODirRead(unsigned char ucIdx); +extern void PDCGPIODirWrite(unsigned char ucIdx, unsigned char ucValue); +extern unsigned char PDCGPIORead(unsigned char ucIdx); +extern void PDCGPIOWrite(unsigned char ucIdx, unsigned char ucValue); + +#ifdef __cplusplus +} +#endif + +#endif // __PDC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/ssi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/ssi.h new file mode 100644 index 0000000..ef53b34 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/ssi.h @@ -0,0 +1,88 @@ +//***************************************************************************** +// +// ssi.h - Prototypes for the Synchronous Serial Interface Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SSI_H__ +#define __SSI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to SSIIntEnable, SSIIntDisable, and SSIIntClear +// as the ulIntFlags parameter, and returned by SSIIntStatus. +// +//***************************************************************************** +#define SSI_TXFF 0x00000008 // TX FIFO half empty or less +#define SSI_RXFF 0x00000004 // RX FIFO half full or less +#define SSI_RXTO 0x00000002 // RX timeout +#define SSI_RXOR 0x00000001 // RX overrun + +//***************************************************************************** +// +// Values that can be passed to SSIConfig. +// +//***************************************************************************** +#define SSI_FRF_MOTO_MODE_0 0x00000000 // Moto fmt, polarity 0, phase 0 +#define SSI_FRF_MOTO_MODE_1 0x00000002 // Moto fmt, polarity 0, phase 1 +#define SSI_FRF_MOTO_MODE_2 0x00000001 // Moto fmt, polarity 1, phase 0 +#define SSI_FRF_MOTO_MODE_3 0x00000003 // Moto fmt, polarity 1, phase 1 +#define SSI_FRF_TI 0x00000010 // TI frame format +#define SSI_FRF_NMW 0x00000020 // National MicroWire frame format + +#define SSI_MODE_MASTER 0x00000000 // SSI master +#define SSI_MODE_SLAVE 0x00000001 // SSI slave +#define SSI_MODE_SLAVE_OD 0x00000002 // SSI slave with output disabled + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SSIConfig(unsigned long ulBase, unsigned long ulProtocol, + unsigned long ulMode, unsigned long ulBitRate, + unsigned long ulDataWidth); +extern void SSIDataGet(unsigned long ulBase, unsigned long *ulData); +extern long SSIDataNonBlockingGet(unsigned long ulBase, unsigned long *ulData); +extern void SSIDataPut(unsigned long ulBase, unsigned long ulData); +extern long SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData); +extern void SSIDisable(unsigned long ulBase); +extern void SSIEnable(unsigned long ulBase); +extern void SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern unsigned long SSIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void SSIIntUnregister(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __SSI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/sysctl.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/sysctl.h new file mode 100644 index 0000000..2e1d1e4 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/sysctl.h @@ -0,0 +1,221 @@ +//***************************************************************************** +// +// sysctl.h - Prototypes for the system control driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SYSCTL_H__ +#define __SYSCTL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following are values that can be passed to the +// SysCtlPeripheralPresent(), SysCtlPeripheralEnable(), +// SysCtlPeripheralDisable(), and SysCtlPeripheralReset() APIs as the +// ulPeripheral parameter. The peripherals in the fourth group (upper nibble +// is 3) can only be used with the SysCtlPeripheralPresent() API. +// +//***************************************************************************** +#define SYSCTL_PERIPH_WDOG 0x00000008 // Watchdog +#define SYSCTL_PERIPH_UART0 0x10000001 // UART 0 +#define SYSCTL_PERIPH_SSI 0x10000010 // SSI +#define SYSCTL_PERIPH_I2C 0x10001000 // I2C +#define SYSCTL_PERIPH_TIMER0 0x10010000 // Timer 0 +#define SYSCTL_PERIPH_TIMER1 0x10020000 // Timer 1 +#define SYSCTL_PERIPH_COMP0 0x11000000 // Analog comparator 0 +#define SYSCTL_PERIPH_COMP1 0x12000000 // Analog comparator 1 +#define SYSCTL_PERIPH_GPIOA 0x20000001 // GPIO A +#define SYSCTL_PERIPH_GPIOB 0x20000002 // GPIO B +#define SYSCTL_PERIPH_GPIOC 0x20000004 // GPIO C +#define SYSCTL_PERIPH_PLL 0x30000010 // PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPinPresent() API +// as the ulPin parameter. +// +//***************************************************************************** +#define SYSCTL_PIN_C0MINUS 0x00000040 // C0- pin +#define SYSCTL_PIN_C0PLUS 0x00000080 // C0+ pin +#define SYSCTL_PIN_C0O 0x00000100 // C0o pin +#define SYSCTL_PIN_C1MINUS 0x00000200 // C1- pin +#define SYSCTL_PIN_CCP0 0x01000000 // CCP0 pin +#define SYSCTL_PIN_CCP1 0x02000000 // CCP1 pin +#define SYSCTL_PIN_32KHZ 0x80000000 // 32kHz pin + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOSet() API as +// the ulVoltage value, or returned by the SysCtlLDOGet() API. +// +//***************************************************************************** +#define SYSCTL_LDO_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDO_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDO_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDO_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDO_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDO_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDO_2_55V 0x0000001f // LDO output of 2.55V +#define SYSCTL_LDO_2_60V 0x0000001e // LDO output of 2.60V +#define SYSCTL_LDO_2_65V 0x0000001d // LDO output of 2.65V +#define SYSCTL_LDO_2_70V 0x0000001c // LDO output of 2.70V +#define SYSCTL_LDO_2_75V 0x0000001b // LDO output of 2.75V + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOConfigSet() API. +// +//***************************************************************************** +#define SYSCTL_LDOCFG_ARST 0x00000001 // Allow LDO failure to reset +#define SYSCTL_LDOCFG_NORST 0x00000000 // Do not reset on LDO failure + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlIntEnable(), +// SysCtlIntDisable(), and SysCtlIntClear() APIs, or returned in the bit mask +// by the SysCtlIntStatus() API. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_BOSC_FAIL 0x00000010 // Boot oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlResetCauseClear() +// API or returned by the SysCtlResetCauseGet() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_LDO 0x00000020 // LDO power not OK reset +#define SYSCTL_CAUSE_SW 0x00000010 // Software reset +#define SYSCTL_CAUSE_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_CAUSE_BOR 0x00000004 // Brown-out reset +#define SYSCTL_CAUSE_POR 0x00000002 // Power on reset +#define SYSCTL_CAUSE_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlBrownOutConfigSet() +// API as the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_BOR_RESET 0x00000002 // Reset instead of interrupting +#define SYSCTL_BOR_RESAMPLE 0x00000001 // Resample BOR before asserting + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlClockSet() API as +// the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_SYSDIV_1 0x07800000 // Processor clock is osc/pll /1 +#define SYSCTL_SYSDIV_2 0x00C00000 // Processor clock is osc/pll /2 +#define SYSCTL_SYSDIV_3 0x01400000 // Processor clock is osc/pll /3 +#define SYSCTL_SYSDIV_4 0x01C00000 // Processor clock is osc/pll /4 +#define SYSCTL_SYSDIV_5 0x02400000 // Processor clock is osc/pll /5 +#define SYSCTL_SYSDIV_6 0x02C00000 // Processor clock is osc/pll /6 +#define SYSCTL_SYSDIV_7 0x03400000 // Processor clock is osc/pll /7 +#define SYSCTL_SYSDIV_8 0x03C00000 // Processor clock is osc/pll /8 +#define SYSCTL_SYSDIV_9 0x04400000 // Processor clock is osc/pll /9 +#define SYSCTL_SYSDIV_10 0x04C00000 // Processor clock is osc/pll /10 +#define SYSCTL_SYSDIV_11 0x05400000 // Processor clock is osc/pll /11 +#define SYSCTL_SYSDIV_12 0x05C00000 // Processor clock is osc/pll /12 +#define SYSCTL_SYSDIV_13 0x06400000 // Processor clock is osc/pll /13 +#define SYSCTL_SYSDIV_14 0x06C00000 // Processor clock is osc/pll /14 +#define SYSCTL_SYSDIV_15 0x07400000 // Processor clock is osc/pll /15 +#define SYSCTL_SYSDIV_16 0x07C00000 // Processor clock is osc/pll /16 +#define SYSCTL_USE_PLL 0x00000000 // System clock is the PLL clock +#define SYSCTL_USE_OSC 0x00003800 // System clock is the osc clock +#define SYSCTL_XTAL_3_57MHZ 0x00000100 // External crystal is 3.579545MHz +#define SYSCTL_XTAL_3_68MHZ 0x00000140 // External crystal is 3.6864MHz +#define SYSCTL_XTAL_4MHZ 0x00000180 // External crystal is 4MHz +#define SYSCTL_XTAL_4_09MHZ 0x000001C0 // External crystal is 4.096MHz +#define SYSCTL_XTAL_4_91MHZ 0x00000200 // External crystal is 4.9152MHz +#define SYSCTL_XTAL_5MHZ 0x00000240 // External crystal is 5MHz +#define SYSCTL_XTAL_5_12MHZ 0x00000280 // External crystal is 5.12MHz +#define SYSCTL_XTAL_6MHZ 0x000002C0 // External crystal is 6MHz +#define SYSCTL_XTAL_6_14MHZ 0x00000300 // External crystal is 6.144MHz +#define SYSCTL_XTAL_7_37MHZ 0x00000340 // External crystal is 7.3728MHz +#define SYSCTL_XTAL_8MHZ 0x00000380 // External crystal is 8MHz +#define SYSCTL_XTAL_8_19MHZ 0x000003C0 // External crystal is 8.192MHz +#define SYSCTL_OSC_MAIN 0x00000000 // Oscillator source is main osc +#define SYSCTL_OSC_BOOT 0x00000010 // Oscillator source is boot osc +#define SYSCTL_OSC_BOOT4 0x00000020 // Oscillator source is boot osc /4 +#define SYSCTL_BOOT_OSC_DIS 0x00000002 // Disable boot oscillator +#define SYSCTL_MAIN_OSC_DIS 0x00000001 // Disable main oscillator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long SysCtlSRAMSizeGet(void); +extern unsigned long SysCtlFlashSizeGet(void); +extern tBoolean SysCtlPinPresent(unsigned long ulPin); +extern tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral); +extern void SysCtlPeripheralReset(unsigned long ulPeripheral); +extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralClockGating(tBoolean bEnable); +extern void SysCtlIntRegister(void (*pfnHandler)(void)); +extern void SysCtlIntUnregister(void); +extern void SysCtlIntEnable(unsigned long ulInts); +extern void SysCtlIntDisable(unsigned long ulInts); +extern void SysCtlIntClear(unsigned long ulInts); +extern unsigned long SysCtlIntStatus(tBoolean bMasked); +extern void SysCtlLDOSet(unsigned long ulVoltage); +extern unsigned long SysCtlLDOGet(void); +extern void SysCtlLDOConfigSet(unsigned long ulConfig); +extern void SysCtlReset(void); +extern void SysCtlSleep(void); +extern void SysCtlDeepSleep(void); +extern unsigned long SysCtlResetCauseGet(void); +extern void SysCtlResetCauseClear(unsigned long ulCauses); +extern void SysCtlBrownOutConfigSet(unsigned long ulConfig, + unsigned long ulDelay); +extern void SysCtlClockSet(unsigned long ulConfig); +extern unsigned long SysCtlClockGet(void); +extern void SysCtlBOSCVerificationSet(tBoolean bEnable); +extern void SysCtlMOSCVerificationSet(tBoolean bEnable); +extern void SysCtlPLLVerificationSet(tBoolean bEnable); +extern void SysCtlClkVerificationClear(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSCTL_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/uart.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/uart.h new file mode 100644 index 0000000..ea39859 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/hw_include/uart.h @@ -0,0 +1,102 @@ +//***************************************************************************** +// +// uart.h - Defines and Macros for the UART. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __UART_H__ +#define __UART_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to UARTIntEnable, UARTIntDisable, and UARTIntClear +// as the ulIntFlags parameter, and returned from UARTIntStatus. +// +//***************************************************************************** +#define UART_INT_OE 0x400 // Overrun Error Interrupt Mask +#define UART_INT_BE 0x200 // Break Error Interrupt Mask +#define UART_INT_PE 0x100 // Parity Error Interrupt Mask +#define UART_INT_FE 0x080 // Framing Error Interrupt Mask +#define UART_INT_RT 0x040 // Receive Timeout Interrupt Mask +#define UART_INT_TX 0x020 // Transmit Interrupt Mask +#define UART_INT_RX 0x010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Values that can be passed to UARTConfigSet as the ulConfig parameter and +// returned by UARTConfigGet in the pulConfig parameter. Additionally, the +// UART_CONFIG_PAR_* subset can be passed to UARTParityModeSet as the ulParity +// parameter, and are returned by UARTParityModeGet. +// +//***************************************************************************** +#define UART_CONFIG_WLEN_8 0x00000060 // 8 bit data +#define UART_CONFIG_WLEN_7 0x00000040 // 7 bit data +#define UART_CONFIG_WLEN_6 0x00000020 // 6 bit data +#define UART_CONFIG_WLEN_5 0x00000000 // 5 bit data +#define UART_CONFIG_STOP_ONE 0x00000000 // One stop bit +#define UART_CONFIG_STOP_TWO 0x00000008 // Two stop bits +#define UART_CONFIG_PAR_NONE 0x00000000 // No parity +#define UART_CONFIG_PAR_EVEN 0x00000006 // Even parity +#define UART_CONFIG_PAR_ODD 0x00000002 // Odd parity +#define UART_CONFIG_PAR_ONE 0x00000086 // Parity bit is one +#define UART_CONFIG_PAR_ZERO 0x00000082 // Parity bit is zero + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity); +extern unsigned long UARTParityModeGet(unsigned long ulBase); +extern void UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig); +extern void UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig); +extern void UARTEnable(unsigned long ulBase); +extern void UARTDisable(unsigned long ulBase); +extern tBoolean UARTCharsAvail(unsigned long ulBase); +extern tBoolean UARTSpaceAvail(unsigned long ulBase); +extern long UARTCharNonBlockingGet(unsigned long ulBase); +extern long UARTCharGet(unsigned long ulBase); +extern tBoolean UARTCharNonBlockingPut(unsigned long ulBase, + unsigned char ucData); +extern void UARTCharPut(unsigned long ulBase, unsigned char ucData); +extern void UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState); +extern void UARTIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void UARTIntUnregister(unsigned long ulBase); +extern void UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __UART_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/init/startup.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/init/startup.c new file mode 100644 index 0000000..592ddc6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/init/startup.c @@ -0,0 +1,175 @@ +//***************************************************************************** +// +// startup.c - Boot code for Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +//***************************************************************************** + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +void FaultISR(void); +extern void xPortPendSVHandler(void); +extern void xPortSysTickHandler(void); +extern void vUART_ISR( void ); +extern void vPortSVCHandler( void ); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern void entry(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +#ifndef STACK_SIZE +#define STACK_SIZE 51 +#endif +static unsigned long pulMainStack[STACK_SIZE]; + +//***************************************************************************** +// +// The minimal vector table for a Cortex-M3. Note that the proper constructs +// must be placed on this to ensure that it ends up at physical address +// 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section("vectors"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((unsigned long)pulMainStack + sizeof(pulMainStack)), + ResetISR, + NmiSR, + FaultISR, //FAULT + 0, // The MPU fault handler + 0, // The bus fault handler + 0, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + 0, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + 0, // GPIO Port A + 0, // GPIO Port B + 0, // GPIO Port C + 0, // GPIO Port D + 0, // GPIO Port E + vUART_ISR // UART0 Rx and Tx +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern unsigned long _etext; +extern unsigned long _data; +extern unsigned long _edata; +extern unsigned long _bss; +extern unsigned long _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied entry() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + unsigned long *pulSrc, *pulDest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pulSrc = &_etext; + for(pulDest = &_data; pulDest < &_edata; ) + { + *pulDest++ = *pulSrc++; + } + + // + // Zero fill the bss segment. + // + for(pulDest = &_bss; pulDest < &_ebss; ) + { + *pulDest++ = 0; + } + + // + // Call the application's entry point. + // + Main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/main.c new file mode 100644 index 0000000..36a2ea6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/main.c @@ -0,0 +1,634 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This demo application creates six co-routines and two tasks (three including + * the idle task). The co-routines execute as part of the idle task hook. + * + * Five of the created co-routines are the standard 'co-routine flash' + * co-routines contained within the Demo/Common/Minimal/crflash.c file and + * documented on the FreeRTOS.org WEB site. + * + * The 'LCD Task' rotates a string on the LCD, delaying between each character + * as necessitated by the slow interface, and delaying between each string just + * long enough to enable the text to be read. + * + * The sixth co-routine and final task control the transmission and reception + * of a string to UART 0. The co-routine periodically sends the first + * character of the string to the UART, with the UART's TxEnd interrupt being + * used to transmit the remaining characters. The UART's RxEnd interrupt + * receives the characters and places them on a queue to be processed by the + * 'COMs Rx' task. An error is latched should an unexpected character be + * received, or any character be received out of sequence. + * + * A loopback connector is required to ensure that each character transmitted + * on the UART is also received on the same UART. For test purposes the UART + * FIFO's are not utalised in order to maximise the interrupt overhead. Also + * a pseudo random interval is used between the start of each transmission in + * order that the resultant interrupts are more randomly distributed and + * therefore more likely to highlight any problems. + * + * The flash co-routines control LED's zero to four. LED five is toggled each + * time the string is transmitted on the UART. LED six is toggled each time + * the string is CORRECTLY received on the UART. LED seven is latched on should + * an error be detected in any task or co-routine. + * + * In addition the idle task makes repetative calls to + * prvSetAndCheckRegisters(). This simply loads the general purpose registers + * with a known value, then checks each register to ensure the held value is + * still correct. As a low priority task this checking routine is likely to + * get repeatedly swapped in and out. A register being found to contain an + * incorrect value is therefore indicative of an error in the task switching + * mechansim. + * + */ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "croutine.h" + +/* Demo application include files. */ +#include "partest.h" +#include "crflash.h" + +/* Library include files. */ +#include "DriverLib.h" + +/* The time to delay between writing each character to the LCD. */ +#define mainCHAR_WRITE_DELAY ( 2 / portTICK_RATE_MS ) + +/* The time to delay between writing each string to the LCD. */ +#define mainSTRING_WRITE_DELAY ( 400 / portTICK_RATE_MS ) + +/* The number of flash co-routines to create. */ +#define mainNUM_FLASH_CO_ROUTINES ( 5 ) + +/* The length of the queue used to pass received characters to the Comms Rx +task. */ +#define mainRX_QUEUE_LEN ( 5 ) + +/* The priority of the co-routine used to initiate the transmission of the +string on UART 0. */ +#define mainTX_CO_ROUTINE_PRIORITY ( 1 ) + +/* Only one co-routine is created so its index is not important. */ +#define mainTX_CO_ROUTINE_INDEX ( 0 ) + +/* The time between transmissions of the string on UART 0. This is pseudo +random in order to generate a bit or randomness to when the interrupts occur.*/ +#define mainMIN_TX_DELAY ( 40 / portTICK_RATE_MS ) +#define mainMAX_TX_DELAY ( ( portTickType ) 0x7f ) +#define mainOFFSET_TIME ( ( portTickType ) 3 ) + +/* The time the Comms Rx task should wait to receive a character. This should +be slightly longer than the time between transmissions. If we do not receive +a character after this time then there must be an error in the transmission or +the timing of the transmission. */ +#define mainCOMMS_RX_DELAY ( mainMAX_TX_DELAY + 20 ) + +/* The task priorites. */ +#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainCOMMS_RX_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) + +/* The LED's toggled by the various tasks. */ +#define mainCOMMS_FAIL_LED ( 7 ) +#define mainCOMMS_RX_LED ( 6 ) +#define mainCOMMS_TX_LED ( 5 ) + +/* The baud rate used by the UART comms tasks/co-routine. */ +#define mainBAUD_RATE ( 57600 ) + +/* FIFO setting for the UART. The FIFO is not used to create a better test. */ +#define mainFIFO_SET ( 0x10 ) + +/* The string that is transmitted on the UART contains sequentially the +characters from mainFIRST_TX_CHAR to mainLAST_TX_CHAR. */ +#define mainFIRST_TX_CHAR '0' +#define mainLAST_TX_CHAR 'z' + +/* Just used to walk through the program memory in order that some random data +can be generated. */ +#define mainTOTAL_PROGRAM_MEMORY ( ( unsigned long * ) ( 8 * 1024 ) ) +#define mainFIRST_PROGRAM_BYTES ( ( unsigned long * ) 4 ) + +/* The error routine that is called if the driver library encounters an error. */ +#ifdef DEBUG +void +__error__(char *pcFilename, unsigned long ulLine) +{ +} +#endif + +/*-----------------------------------------------------------*/ + +/* + * The task that rotates text on the LCD. + */ +static void vLCDTask( void * pvParameters ); + +/* + * The task that receives the characters from UART 0. + */ +static void vCommsRxTask( void * pvParameters ); + +/* + * The co-routine that periodically initiates the transmission of the string on + * the UART. + */ +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* + * Writes a string the the LCD. + */ +static void prvWriteString( const char *pcString ); + +/* + * Initialisation routine for the UART. + */ +static void vSerialInit( void ); + +/* + * Thread safe write to the PDC. + */ +static void prvPDCWrite( char cAddress, char cData ); + +/* + * Function to simply set a known value into the general purpose registers + * then read them back to ensure they remain set correctly. An incorrect value + * being indicative of an error in the task switching mechanism. + */ +void prvSetAndCheckRegisters( void ); + +/* + * Latch the LED that indicates that an error has occurred. + */ +void vSetErrorLED( void ); + +/* + * Sets up the PLL and ports used by the demo. + */ +static void prvSetupHardware( void ); + +/*-----------------------------------------------------------*/ + +/* Error flag set to pdFAIL if an error is encountered in the tasks/co-routines +defined within this file. */ +unsigned portBASE_TYPE uxErrorStatus = pdPASS; + +/* The next character to transmit. */ +static char cNextChar; + +/* The queue used to transmit characters from the interrupt to the Comms Rx +task. */ +static xQueueHandle xCommsQueue; + +/*-----------------------------------------------------------*/ + +void Main( void ) +{ + /* Create the queue used to communicate between the UART ISR and the Comms + Rx task. */ + xCommsQueue = xQueueCreate( mainRX_QUEUE_LEN, sizeof( char ) ); + + /* Setup the ports used by the demo and the clock. */ + prvSetupHardware(); + + /* Create the co-routines that flash the LED's. */ + vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES ); + + /* Create the co-routine that initiates the transmission of characters + on the UART. */ + xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX ); + + /* Create the LCD and Comms Rx tasks. */ + xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL ); + xTaskCreate( vCommsRxTask, "CMS", configMINIMAL_STACK_SIZE, NULL, mainCOMMS_RX_TASK_PRIORITY, NULL ); + + /* Start the scheduler running the tasks and co-routines just created. */ + vTaskStartScheduler(); + + /* Should not get here unless we did not have enough memory to start the + scheduler. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* Setup the PLL. */ + SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); + + /* Initialise the hardware used to talk to the LCD, LED's and UART. */ + PDCInit(); + vParTestInitialise(); + vSerialInit(); +} +/*-----------------------------------------------------------*/ + +void vApplicationIdleHook( void ) +{ + /* The co-routines are executed in the idle task using the idle task + hook. */ + for( ;; ) + { + /* Schedule the co-routines. */ + vCoRoutineSchedule(); + + /* Run the register check function between each co-routine. */ + prvSetAndCheckRegisters(); + } +} +/*-----------------------------------------------------------*/ + +static void prvWriteString( const char *pcString ) +{ + /* Write pcString to the LED, pausing between each character. */ + prvPDCWrite(PDC_LCD_CSR, LCD_CLEAR); + while( *pcString ) + { + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_RAM, *pcString ); + pcString++; + } +} +/*-----------------------------------------------------------*/ + +void vLCDTask( void * pvParameters ) +{ +unsigned portBASE_TYPE uxIndex; +const unsigned char ucCFGData[] = { + 0x30, /* Set data bus to 8-bits. */ + 0x30, + 0x30, + 0x3C, /* Number of lines/font. */ + 0x08, /* Display off. */ + 0x01, /* Display clear. */ + 0x06, /* Entry mode [cursor dir][shift]. */ + 0x0C /* Display on [display on][curson on][blinking on]. */ + }; + +/* The strings that are written to the LCD. */ +const char *pcStringsToDisplay[] = { + "Stellaris", + "Demo", + "One", + "www.FreeRTOS.org", + "" + }; + + /* Configure the LCD. */ + uxIndex = 0; + while( uxIndex < sizeof( ucCFGData ) ) + { + prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] ); + uxIndex++; + vTaskDelay( mainCHAR_WRITE_DELAY ); + } + + /* Turn the LCD Backlight on. */ + prvPDCWrite( PDC_CSR, 0x01 ); + + /* Clear display. */ + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR ); + + uxIndex = 0; + for( ;; ) + { + /* Display the string on the LCD. */ + prvWriteString( pcStringsToDisplay[ uxIndex ] ); + + /* Move on to the next string - wrapping if necessary. */ + uxIndex++; + if( *( pcStringsToDisplay[ uxIndex ] ) == 0x00 ) + { + uxIndex = 0; + /* Longer pause on the last string to be sent. */ + vTaskDelay( mainSTRING_WRITE_DELAY * 2 ); + } + + /* Wait until it is time to move onto the next string. */ + vTaskDelay( mainSTRING_WRITE_DELAY ); + } +} +/*-----------------------------------------------------------*/ + +static void vCommsRxTask( void * pvParameters ) +{ +static char cRxedChar, cExpectedChar; + + /* Set the char we expect to receive to the start of the string. */ + cExpectedChar = mainFIRST_TX_CHAR; + + for( ;; ) + { + /* Wait for a character to be received. */ + xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY ); + + /* Was the character recived (if any) the expected character. */ + if( cRxedChar != cExpectedChar ) + { + /* Got an unexpected character. This can sometimes occur when + reseting the system using the debugger leaving characters already + in the UART regsters. */ + uxErrorStatus = pdFAIL; + + /* Resync by waiting for the end of the current string. */ + while( cRxedChar != mainLAST_TX_CHAR ) + { + while( !xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, portMAX_DELAY ) ); + } + + /* The next expected character is the start of the string again. */ + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + if( cExpectedChar == mainLAST_TX_CHAR ) + { + /* We have reached the end of the string - we now expect to + receive the first character in the string again. The LED is + toggled to indicate that the entire string was received without + error. */ + vParTestToggleLED( mainCOMMS_RX_LED ); + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + /* We got the expected character, we now expect to receive the + next character in the string. */ + cExpectedChar++; + } + } + } +} +/*-----------------------------------------------------------*/ + +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +portTickType xDelayPeriod; +static unsigned long *pulRandomBytes = mainFIRST_PROGRAM_BYTES; + + /* Co-routine MUST start with a call to crSTART. */ + crSTART( xHandle ); + + for(;;) + { + /* Was the previously transmitted string received correctly? */ + if( uxErrorStatus != pdPASS ) + { + /* An error was encountered so set the error LED. */ + vSetErrorLED(); + } + + /* The next character to Tx is the first in the string. */ + cNextChar = mainFIRST_TX_CHAR; + + UARTIntDisable( UART0_BASE, UART_INT_TX ); + { + /* Send the first character. */ + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + + /* Move the variable to the char to Tx on so the ISR transmits + the next character in the string once this one has completed. */ + cNextChar++; + } + UARTIntEnable(UART0_BASE, UART_INT_TX); + + /* Toggle the LED to show a new string is being transmitted. */ + vParTestToggleLED( mainCOMMS_TX_LED ); + + /* Delay before we start the string off again. A pseudo-random delay + is used as this will provide a better test. */ + xDelayPeriod = xTaskGetTickCount() + ( *pulRandomBytes ); + + pulRandomBytes++; + if( pulRandomBytes > mainTOTAL_PROGRAM_MEMORY ) + { + pulRandomBytes = mainFIRST_PROGRAM_BYTES; + } + + /* Make sure we don't wait too long... */ + xDelayPeriod &= mainMAX_TX_DELAY; + + /* ...but we do want to wait. */ + if( xDelayPeriod < mainMIN_TX_DELAY ) + { + xDelayPeriod = mainMIN_TX_DELAY; + } + + /* Block for the random(ish) time. */ + crDELAY( xHandle, xDelayPeriod ); + } + + /* Co-routine MUST end with a call to crEND. */ + crEND(); +} +/*-----------------------------------------------------------*/ + +static void vSerialInit( void ) +{ + /* Enable the UART. GPIOA has already been initialised. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + /* Set GPIO A0 and A1 as peripheral function. They are used to output the + UART signals. */ + GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW ); + + /* Configure the UART for 8-N-1 operation. */ + UARTConfigSet( UART0_BASE, mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE ); + + /* We dont want to use the fifo. This is for test purposes to generate + as many interrupts as possible. */ + HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET; + + /* Enable both Rx and Tx interrupts. */ + HWREG( UART0_BASE + UART_O_IM ) |= ( UART_INT_TX | UART_INT_RX ); + IntEnable( INT_UART0 ); +} +/*-----------------------------------------------------------*/ + +void vUART_ISR(void) +{ +unsigned long ulStatus; +char cRxedChar; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* What caused the interrupt. */ + ulStatus = UARTIntStatus( UART0_BASE, pdTRUE ); + + /* Clear the interrupt. */ + UARTIntClear( UART0_BASE, ulStatus ); + + /* Was an Rx interrpt pending? */ + if( ulStatus & UART_INT_RX ) + { + if( ( HWREG(UART0_BASE + UART_O_FR ) & UART_FR_RXFF ) ) + { + /* Get the char from the buffer and post it onto the queue of + Rxed chars. Posting the character should wake the task that is + blocked on the queue waiting for characters. */ + cRxedChar = ( char ) HWREG( UART0_BASE + UART_O_DR ); + xQueueSendFromISR( xCommsQueue, &cRxedChar, &xHigherPriorityTaskWoken ); + } + } + + /* Was a Tx interrupt pending? */ + if( ulStatus & UART_INT_TX ) + { + /* Send the next character in the string. We are not using the FIFO. */ + if( cNextChar <= mainLAST_TX_CHAR ) + { + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + cNextChar++; + } + } + + /* If a task was woken by the character being received then we force + a context switch to occur in case the task is of higher priority than + the currently executing task (i.e. the task that this interrupt + interrupted.) */ + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + +static void prvPDCWrite( char cAddress, char cData ) +{ + vTaskSuspendAll(); + { + PDCWrite( cAddress, cData ); + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vSetErrorLED( void ) +{ + vParTestSetLED( mainCOMMS_FAIL_LED, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +void prvSetAndCheckRegisters( void ) +{ + /* Fill the general purpose registers with known values. */ + __asm volatile( " mov r11, #10\n" + " add r0, r11, #1\n" + " add r1, r11, #2\n" + " add r2, r11, #3\n" + " add r3, r11, #4\n" + " add r4, r11, #5\n" + " add r5, r11, #6\n" + " add r6, r11, #7\n" + " add r7, r11, #8\n" + " add r8, r11, #9\n" + " add r9, r11, #10\n" + " add r10, r11, #11\n" + " add r12, r11, #12" ); + + /* Check the values are as expected. */ + __asm volatile( " cmp r11, #10\n" + " bne set_error_led\n" + " cmp r0, #11\n" + " bne set_error_led\n" + " cmp r1, #12\n" + " bne set_error_led\n" + " cmp r2, #13\n" + " bne set_error_led\n" + " cmp r3, #14\n" + " bne set_error_led\n" + " cmp r4, #15\n" + " bne set_error_led\n" + " cmp r5, #16\n" + " bne set_error_led\n" + " cmp r6, #17\n" + " bne set_error_led\n" + " cmp r7, #18\n" + " bne set_error_led\n" + " cmp r8, #19\n" + " bne set_error_led\n" + " cmp r9, #20\n" + " bne set_error_led\n" + " cmp r10, #21\n" + " bne set_error_led\n" + " cmp r12, #22\n" + " bne set_error_led\n" + " bx lr" ); + + __asm volatile( "set_error_led:\n" + " push {r14}\n" + " ldr r1, =vSetErrorLED\n" + " blx r1\n" + " pop {r14}\n" + " bx lr" ); +} +/*-----------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/makedefs b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/makedefs new file mode 100644 index 0000000..2728ef8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/makedefs @@ -0,0 +1,193 @@ +#****************************************************************************** +# +# makedefs - Definitions common to all makefiles. +# +# Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +# +# Software License Agreement +# +# Luminary Micro, Inc. (LMI) is supplying this software for use solely and +# exclusively on LMI's Stellaris Family of microcontroller products. +# +# The software is owned by LMI and/or its suppliers, and is protected under +# applicable copyright laws. All rights are reserved. Any use in violation +# of the foregoing restrictions may subject the user to criminal sanctions +# under applicable laws, as well as to civil liability for the breach of the +# terms and conditions of this license. +# +# THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +# OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +# LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +# CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +# +#****************************************************************************** + +#****************************************************************************** +# +# The compiler to be used. +# +#****************************************************************************** +ifndef COMPILER +COMPILER=gcc +endif + +#****************************************************************************** +# +# The debugger to be used. +# +#****************************************************************************** +ifndef DEBUGGER +DEBUGGER=gdb +endif + +#****************************************************************************** +# +# Definitions for using GCC. +# +#****************************************************************************** +ifeq (${COMPILER}, gcc) + +# +# The command for calling the compiler. +# +CC=arm-none-eabi-gcc + +# +# The flags passed to the assembler. +# +AFLAGS=-mthumb \ + -mcpu=cortex-m3 \ + -MD + +# +# The flags passed to the compiler. +# +CFLAGS=-mthumb \ + -mcpu=cortex-m3 \ + -O2 \ + -MD + +# +# The command for calling the library archiver. +# +AR=arm-none-eabi-ar + +# +# The command for calling the linker. +# +LD=arm-none-eabi-ld + +# +# The flags passed to the linker. +# +LDFLAGS= -Map gcc/out.map + +# +# Get the location of libgcc.a from the GCC front-end. +# +LIBGCC=${shell ${CC} -mthumb -march=armv6t2 -print-libgcc-file-name} + +# +# Get the location of libc.a from the GCC front-end. +# +LIBC=${shell ${CC} -mthumb -march=armv6t2 -print-file-name=libc.a} + +# +# The command for extracting images from the linked executables. +# +OBJCOPY=arm-none-eabi-objcopy + +endif + +#****************************************************************************** +# +# Tell the compiler to include debugging information if the DEBUG environment +# variable is set. +# +#****************************************************************************** +ifdef DEBUG +CFLAGS += -g +endif + +#****************************************************************************** +# +# The rule for building the object file from each C source file. +# +#****************************************************************************** +${COMPILER}/%.o: %.c + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " CC ${<}"; \ + else \ + echo ${CC} ${CFLAGS} -D${COMPILER} -o ${@} -c ${<}; \ + fi + @${CC} ${CFLAGS} -D${COMPILER} -o ${@} -c ${<} +ifeq (${COMPILER}, rvds) + @mv -f ${notdir ${@:.o=.d}} ${COMPILER} +endif + +#****************************************************************************** +# +# The rule for building the object file from each assembly source file. +# +#****************************************************************************** +${COMPILER}/%.o: %.S + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " CC ${<}"; \ + else \ + echo ${CC} ${AFLAGS} -D${COMPILER} -o ${@} -c ${<}; \ + fi +ifeq (${COMPILER}, rvds) + @${CC} ${AFLAGS} -D${COMPILER} -E ${<} > ${@:.o=_.S} + @${CC} ${AFLAGS} -o ${@} -c ${@:.o=_.S} + @rm ${@:.o=_.S} + @${CC} ${AFLAGS} -D${COMPILER} --md -E ${<} + @sed 's,,${@},g' ${notdir ${<:.S=.d}} > ${@:.o=.d} + @rm ${notdir ${<:.S=.d}} +endif +ifeq (${COMPILER}, gcc) + @${CC} ${AFLAGS} -D${COMPILER} -o ${@} -c ${<} +endif + +#****************************************************************************** +# +# The rule for creating an object library. +# +#****************************************************************************** +${COMPILER}/%.a: + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " AR ${@}"; \ + else \ + echo ${AR} -cr ${@} ${^}; \ + fi + @${AR} -cr ${@} ${^} + +#****************************************************************************** +# +# The rule for linking the application. +# +#****************************************************************************** +${COMPILER}/%.axf: + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " LD ${@}"; \ + fi +ifeq (${COMPILER}, gcc) + @if [ 'x${VERBOSE}' != x ]; \ + then \ + echo ${LD} -T ${SCATTER_${notdir ${@:.axf=}}} \ + --entry ${ENTRY_${notdir ${@:.axf=}}} \ + ${LDFLAGSgcc_${notdir ${@:.axf=}}} \ + ${LDFLAGS} -o ${@} ${^} \ + '${LIBC}' '${LIBGCC}'; \ + fi + @${LD} -T ${SCATTER_${notdir ${@:.axf=}}} \ + --entry ${ENTRY_${notdir ${@:.axf=}}} \ + ${LDFLAGSgcc_${notdir ${@:.axf=}}} \ + ${LDFLAGS} -o ${@} ${^} \ + '${LIBC}' '${LIBGCC}' + @${OBJCOPY} -O binary ${@} ${@:.axf=.bin} +endif diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/standalone.ld b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/standalone.ld new file mode 100644 index 0000000..11d3243 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_GCC/standalone.ld @@ -0,0 +1,58 @@ +/****************************************************************************** + * + * standalone.ld - Linker script for applications using startup.c and + * DriverLib. + * + * Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. + * + * Software License Agreement + * + * Luminary Micro, Inc. (LMI) is supplying this software for use solely and + * exclusively on LMI's Stellaris Family of microcontroller products. + * + * The software is owned by LMI and/or its suppliers, and is protected under + * applicable copyright laws. All rights are reserved. Any use in violation + * of the foregoing restrictions may subject the user to criminal sanctions + * under applicable laws, as well as to civil liability for the breach of the + * terms and conditions of this license. + * + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 8K + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 2K +} + +SECTIONS +{ + .text : + { + *(vectors) + *(.text) + *(.rodata*) + *(.constdata*) + _etext = .; + } > FLASH + + .data : AT (ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss) + _ebss = .; + } > SRAM +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/FreeRTOSConfig.h new file mode 100644 index 0000000..31afdcf --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/FreeRTOSConfig.h @@ -0,0 +1,112 @@ +/* + FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong? * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, training, latest information, + license and contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool. + + Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell + the code with commercial support, indemnification, and middleware, under + the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also + provide a safety engineered and independently SIL3 certified version under + the SafeRTOS brand: http://www.SafeRTOS.com. +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 59 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1468 ) ) +#define configMAX_TASK_NAME_LEN ( 3 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 0 +#define INCLUDE_uxTaskPriorityGet 0 +#define INCLUDE_vTaskDelete 0 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelay 1 + + + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/main.c new file mode 100644 index 0000000..560d41d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/main.c @@ -0,0 +1,630 @@ +/* + FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong? * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, training, latest information, + license and contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool. + + Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell + the code with commercial support, indemnification, and middleware, under + the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also + provide a safety engineered and independently SIL3 certified version under + the SafeRTOS brand: http://www.SafeRTOS.com. +*/ + +/* + * This demo application creates six co-routines and two tasks (three including + * the idle task). The co-routines execute as part of the idle task hook. + * + * Five of the created co-routines are the standard 'co-routine flash' + * co-routines contained within the Demo/Common/Minimal/crflash.c file and + * documented on the FreeRTOS.org WEB site. + * + * The 'LCD Task' rotates a string on the LCD, delaying between each character + * as necessitated by the slow interface, and delaying between each string just + * long enough to enable the text to be read. + * + * The sixth co-routine and final task control the transmission and reception + * of a string to UART 0. The co-routine periodically sends the first + * character of the string to the UART, with the UART's TxEnd interrupt being + * used to transmit the remaining characters. The UART's RxEnd interrupt + * receives the characters and places them on a queue to be processed by the + * 'COMs Rx' task. An error is latched should an unexpected character be + * received, or any character be received out of sequence. + * + * A loopback connector is required to ensure that each character transmitted + * on the UART is also received on the same UART. For test purposes the UART + * FIFO's are not utalised in order to maximise the interrupt overhead. Also + * a pseudo random interval is used between the start of each transmission in + * order that the resultant interrupts are more randomly distributed and + * therefore more likely to highlight any problems. + * + * The flash co-routines control LED's zero to four. LED five is toggled each + * time the string is transmitted on the UART. LED six is toggled each time + * the string is CORRECTLY received on the UART. LED seven is latched on should + * an error be detected in any task or co-routine. + * + * In addition the idle task makes repetative calls to + * prvSetAndCheckRegisters(). This simply loads the general purpose registers + * with a known value, then checks each register to ensure the held value is + * still correct. As a low priority task this checking routine is likely to + * get repeatedly swapped in and out. A register being found to contain an + * incorrect value is therefore indicative of an error in the task switching + * mechansim. + * + */ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "croutine.h" + +/* Demo application include files. */ +#include "partest.h" +#include "crflash.h" + +/* Library include files. */ +#include "LM3Sxxx.h" +#include "pdc.h" + +/* The time to delay between writing each character to the LCD. */ +#define mainCHAR_WRITE_DELAY ( 2 / portTICK_RATE_MS ) + +/* The time to delay between writing each string to the LCD. */ +#define mainSTRING_WRITE_DELAY ( 400 / portTICK_RATE_MS ) + +/* The number of flash co-routines to create. */ +#define mainNUM_FLASH_CO_ROUTINES ( 5 ) + +/* The length of the queue used to pass received characters to the Comms Rx +task. */ +#define mainRX_QUEUE_LEN ( 5 ) + +/* The priority of the co-routine used to initiate the transmission of the +string on UART 0. */ +#define mainTX_CO_ROUTINE_PRIORITY ( 1 ) + +/* Only one co-routine is created so its index is not important. */ +#define mainTX_CO_ROUTINE_INDEX ( 0 ) + +/* The time between transmissions of the string on UART 0. This is pseudo +random in order to generate a bit or randomness to when the interrupts occur.*/ +#define mainMIN_TX_DELAY ( 40 / portTICK_RATE_MS ) +#define mainMAX_TX_DELAY ( ( portTickType ) 0x7f ) +#define mainOFFSET_TIME ( ( portTickType ) 3 ) + +/* The time the Comms Rx task should wait to receive a character. This should +be slightly longer than the time between transmissions. If we do not receive +a character after this time then there must be an error in the transmission or +the timing of the transmission. */ +#define mainCOMMS_RX_DELAY ( mainMAX_TX_DELAY + 20 ) + +/* The task priorites. */ +#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainCOMMS_RX_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) + +/* The LED's toggled by the various tasks. */ +#define mainCOMMS_FAIL_LED ( 7 ) +#define mainCOMMS_RX_LED ( 6 ) +#define mainCOMMS_TX_LED ( 5 ) + +/* The baud rate used by the UART comms tasks/co-routine. */ +#define mainBAUD_RATE ( 57600 ) + +/* FIFO setting for the UART. The FIFO is not used to create a better test. */ +#define mainFIFO_SET ( 0x10 ) + +/* The string that is transmitted on the UART contains sequentially the +characters from mainFIRST_TX_CHAR to mainLAST_TX_CHAR. */ +#define mainFIRST_TX_CHAR '0' +#define mainLAST_TX_CHAR 'z' + +/* Just used to walk through the program memory in order that some random data +can be generated. */ +#define mainTOTAL_PROGRAM_MEMORY ( ( unsigned long * ) ( 8 * 1024 ) ) +#define mainFIRST_PROGRAM_BYTES ( ( unsigned long * ) 4 ) + +/*-----------------------------------------------------------*/ + +/* + * The task that rotates text on the LCD. + */ +static void vLCDTask( void * pvParameters ); + +/* + * The task that receives the characters from UART 0. + */ +static void vCommsRxTask( void * pvParameters ); + +/* + * The co-routine that periodically initiates the transmission of the string on + * the UART. + */ +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* + * Writes a string the the LCD. + */ +static void prvWriteString( const char *pcString ); + +/* + * Initialisation routine for the UART. + */ +static void vSerialInit( void ); + +/* + * Thread safe write to the PDC. + */ +static void prvPDCWrite( char cAddress, char cData ); + +/* + * Function to simply set a known value into the general purpose registers + * then read them back to ensure they remain set correctly. An incorrect value + * being indicative of an error in the task switching mechanism. + */ +void prvSetAndCheckRegisters( void ); + +/* + * Latch the LED that indicates that an error has occurred. + */ +void vSetErrorLED( void ); + +/* + * Sets up the PLL and ports used by the demo. + */ +static void prvSetupHardware( void ); + +/*-----------------------------------------------------------*/ + +/* Error flag set to pdFAIL if an error is encountered in the tasks/co-routines +defined within this file. */ +unsigned portBASE_TYPE uxErrorStatus = pdPASS; + +/* The next character to transmit. */ +static char cNextChar; + +/* The queue used to transmit characters from the interrupt to the Comms Rx +task. */ +static xQueueHandle xCommsQueue; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + /* Create the queue used to communicate between the UART ISR and the Comms + Rx task. */ + xCommsQueue = xQueueCreate( mainRX_QUEUE_LEN, sizeof( char ) ); + + /* Setup the ports used by the demo and the clock. */ + prvSetupHardware(); + + /* Create the co-routines that flash the LED's. */ + vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES ); + + /* Create the co-routine that initiates the transmission of characters + on the UART. */ + xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX ); + + /* Create the LCD and Comms Rx tasks. */ + xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL ); + xTaskCreate( vCommsRxTask, "CMS", configMINIMAL_STACK_SIZE, NULL, mainCOMMS_RX_TASK_PRIORITY, NULL ); + + /* Start the scheduler running the tasks and co-routines just created. */ + vTaskStartScheduler(); + + /* Should not get here unless we did not have enough memory to start the + scheduler. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* Setup the PLL. */ + SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); + + /* Initialise the hardware used to talk to the LCD, LED's and UART. */ + PDCInit(); + vParTestInitialise(); + vSerialInit(); +} +/*-----------------------------------------------------------*/ + +void vApplicationIdleHook( void ) +{ + /* The co-routines are executed in the idle task using the idle task + hook. */ + for( ;; ) + { + /* Schedule the co-routines. */ + vCoRoutineSchedule(); + + /* Run the register check function between each co-routine. */ + prvSetAndCheckRegisters(); + } +} +/*-----------------------------------------------------------*/ + +static void prvWriteString( const char *pcString ) +{ + /* Write pcString to the LED, pausing between each character. */ + prvPDCWrite(PDC_LCD_CSR, LCD_CLEAR); + while( *pcString ) + { + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_RAM, *pcString ); + pcString++; + } +} +/*-----------------------------------------------------------*/ + +void vLCDTask( void * pvParameters ) +{ +unsigned portBASE_TYPE uxIndex; +const unsigned char ucCFGData[] = { + 0x30, /* Set data bus to 8-bits. */ + 0x30, + 0x30, + 0x3C, /* Number of lines/font. */ + 0x08, /* Display off. */ + 0x01, /* Display clear. */ + 0x06, /* Entry mode [cursor dir][shift]. */ + 0x0C /* Display on [display on][curson on][blinking on]. */ + }; + +/* The strings that are written to the LCD. */ +const char *pcStringsToDisplay[] = { + "Stellaris", + "Demo", + "One", + "www.FreeRTOS.org", + "" + }; + + /* Configure the LCD. */ + uxIndex = 0; + while( uxIndex < sizeof( ucCFGData ) ) + { + prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] ); + uxIndex++; + vTaskDelay( mainCHAR_WRITE_DELAY ); + } + + /* Turn the LCD Backlight on. */ + prvPDCWrite( PDC_CSR, 0x01 ); + + /* Clear display. */ + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR ); + + uxIndex = 0; + for( ;; ) + { + /* Display the string on the LCD. */ + prvWriteString( pcStringsToDisplay[ uxIndex ] ); + + /* Move on to the next string - wrapping if necessary. */ + uxIndex++; + if( *( pcStringsToDisplay[ uxIndex ] ) == 0x00 ) + { + uxIndex = 0; + /* Longer pause on the last string to be sent. */ + vTaskDelay( mainSTRING_WRITE_DELAY * 2 ); + } + + /* Wait until it is time to move onto the next string. */ + vTaskDelay( mainSTRING_WRITE_DELAY ); + } +} +/*-----------------------------------------------------------*/ + +static void vCommsRxTask( void * pvParameters ) +{ +static char cRxedChar, cExpectedChar; + + /* Set the char we expect to receive to the start of the string. */ + cExpectedChar = mainFIRST_TX_CHAR; + + for( ;; ) + { + /* Wait for a character to be received. */ + xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY ); + + /* Was the character recived (if any) the expected character. */ + if( cRxedChar != cExpectedChar ) + { + /* Got an unexpected character. This can sometimes occur when + reseting the system using the debugger leaving characters already + in the UART regsters. */ + uxErrorStatus = pdFAIL; + + /* Resync by waiting for the end of the current string. */ + while( cRxedChar != mainLAST_TX_CHAR ) + { + while( !xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, portMAX_DELAY ) ); + } + + /* The next expected character is the start of the string again. */ + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + if( cExpectedChar == mainLAST_TX_CHAR ) + { + /* We have reached the end of the string - we now expect to + receive the first character in the string again. The LED is + toggled to indicate that the entire string was received without + error. */ + vParTestToggleLED( mainCOMMS_RX_LED ); + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + /* We got the expected character, we now expect to receive the + next character in the string. */ + cExpectedChar++; + } + } + } +} +/*-----------------------------------------------------------*/ + +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +portTickType xDelayPeriod; +static unsigned long *pulRandomBytes = mainFIRST_PROGRAM_BYTES; + + /* Co-routine MUST start with a call to crSTART. */ + crSTART( xHandle ); + + for(;;) + { + /* Was the previously transmitted string received correctly? */ + if( uxErrorStatus != pdPASS ) + { + /* An error was encountered so set the error LED. */ + vSetErrorLED(); + } + + /* The next character to Tx is the first in the string. */ + cNextChar = mainFIRST_TX_CHAR; + + UARTIntDisable( UART0_BASE, UART_INT_TX ); + { + /* Send the first character. */ + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + + /* Move the variable to the char to Tx on so the ISR transmits + the next character in the string once this one has completed. */ + cNextChar++; + } + UARTIntEnable(UART0_BASE, UART_INT_TX); + + /* Toggle the LED to show a new string is being transmitted. */ + vParTestToggleLED( mainCOMMS_TX_LED ); + + /* Delay before we start the string off again. A pseudo-random delay + is used as this will provide a better test. */ + xDelayPeriod = xTaskGetTickCount() + ( *pulRandomBytes ); + + pulRandomBytes++; + if( pulRandomBytes > mainTOTAL_PROGRAM_MEMORY ) + { + pulRandomBytes = mainFIRST_PROGRAM_BYTES; + } + + /* Make sure we don't wait too long... */ + xDelayPeriod &= mainMAX_TX_DELAY; + + /* ...but we do want to wait. */ + if( xDelayPeriod < mainMIN_TX_DELAY ) + { + xDelayPeriod = mainMIN_TX_DELAY; + } + + /* Block for the random(ish) time. */ + crDELAY( xHandle, xDelayPeriod ); + } + + /* Co-routine MUST end with a call to crEND. */ + crEND(); +} +/*-----------------------------------------------------------*/ + +static void vSerialInit( void ) +{ + /* Enable the UART. GPIOA has already been initialised. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + /* Set GPIO A0 and A1 as peripheral function. They are used to output the + UART signals. */ + GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW ); + + /* Configure the UART for 8-N-1 operation. */ + UARTConfigSet( UART0_BASE, mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE ); + + /* We dont want to use the fifo. This is for test purposes to generate + as many interrupts as possible. */ + HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET; + + /* Enable both Rx and Tx interrupts. */ + HWREG( UART0_BASE + UART_O_IM ) |= ( UART_INT_TX | UART_INT_RX ); + IntEnable( INT_UART0 ); +} +/*-----------------------------------------------------------*/ + +void vUART_ISR(void) +{ +unsigned long ulStatus; +char cRxedChar; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* What caused the interrupt. */ + ulStatus = UARTIntStatus( UART0_BASE, pdTRUE ); + + /* Clear the interrupt. */ + UARTIntClear( UART0_BASE, ulStatus ); + + /* Was an Rx interrpt pending? */ + if( ulStatus & UART_INT_RX ) + { + if( ( HWREG(UART0_BASE + UART_O_FR ) & UART_FR_RXFF ) ) + { + /* Get the char from the buffer and post it onto the queue of + Rxed chars. Posting the character should wake the task that is + blocked on the queue waiting for characters. */ + cRxedChar = ( char ) HWREG( UART0_BASE + UART_O_DR ); + xQueueSendFromISR( xCommsQueue, &cRxedChar, &xHigherPriorityTaskWoken ); + } + } + + /* Was a Tx interrupt pending? */ + if( ulStatus & UART_INT_TX ) + { + /* Send the next character in the string. We are not using the FIFO. */ + if( cNextChar <= mainLAST_TX_CHAR ) + { + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + cNextChar++; + } + } + + /* If a task was woken by the character being received then we force + a context switch to occur in case the task is of higher priority than + the currently executing task (i.e. the task that this interrupt + interrupted.) */ + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + +static void prvPDCWrite( char cAddress, char cData ) +{ + vTaskSuspendAll(); + { + PDCWrite( cAddress, cData ); + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vSetErrorLED( void ) +{ + vParTestSetLED( mainCOMMS_FAIL_LED, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +__asm void prvSetAndCheckRegisters( void ) +{ + extern vSetErrorLED + + /* Fill the general purpose registers with known values. */ + mov r11, #10 + add r0, r11, #1 + add r1, r11, #2 + add r2, r11, #3 + add r3, r11, #4 + add r4, r11, #5 + add r5, r11, #6 + add r6, r11, #7 + add r7, r11, #8 + add r8, r11, #9 + add r9, r11, #10 + add r10, r11, #11 + add r12, r11, #12 + + /* Check the values are as expected. */ + cmp r11, #10 + bne set_error_led + cmp r0, #11 + bne set_error_led + cmp r1, #12 + bne set_error_led + cmp r2, #13 + bne set_error_led + cmp r3, #14 + bne set_error_led + cmp r4, #15 + bne set_error_led + cmp r5, #16 + bne set_error_led + cmp r6, #17 + bne set_error_led + cmp r7, #18 + bne set_error_led + cmp r8, #19 + bne set_error_led + cmp r9, #20 + bne set_error_led + cmp r10, #21 + bne set_error_led + cmp r12, #22 + bne set_error_led + bx lr + +set_error_led; + push {r14} + ldr r1, =vSetErrorLED + blx r1 + pop {r14} + bx lr; +} +/*-----------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/readme.txt b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/readme.txt new file mode 100644 index 0000000..10334b9 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/readme.txt @@ -0,0 +1,3 @@ +Move these two fines into the Demo/CORTEX_LM3S102_KEIL directory to run Demo 1. + +See the port documentation on the www.FreeRTOS.org site for more information. diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/FreeRTOSConfig.h new file mode 100644 index 0000000..29902dd --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/FreeRTOSConfig.h @@ -0,0 +1,112 @@ +/* + FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong? * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, training, latest information, + license and contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool. + + Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell + the code with commercial support, indemnification, and middleware, under + the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also + provide a safety engineered and independently SIL3 certified version under + the SafeRTOS brand: http://www.SafeRTOS.com. +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 59 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1240 ) ) +#define configMAX_TASK_NAME_LEN ( 3 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 3 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 0 +#define INCLUDE_uxTaskPriorityGet 0 +#define INCLUDE_vTaskDelete 0 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelay 1 + + + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/main.c new file mode 100644 index 0000000..41d822a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/main.c @@ -0,0 +1,638 @@ +/* + FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong? * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, training, latest information, + license and contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool. + + Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell + the code with commercial support, indemnification, and middleware, under + the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also + provide a safety engineered and independently SIL3 certified version under + the SafeRTOS brand: http://www.SafeRTOS.com. +*/ + +/* + * This demo application creates seven co-routines and one task (two including + * the idle task). The co-routines execute as part of the idle task hook. + * + * Five of the created co-routines are the standard 'co-routine flash' + * co-routines contained within the Demo/Common/Minimal/crflash.c file and + * documented on the FreeRTOS.org WEB site. + * + * The 'LCD Task' rotates a string on the LCD, delaying between each character + * as necessitated by the slow interface, and delaying between each string just + * long enough to enable the text to be read. + * + * The sixth co-routine controls the transmission of a string to UART 0. The + * co-routine periodically sends the first character of the string to the UART, + * with the UART's TxEnd interrupt being used to transmit the remaining + * characters. The UART's RxEnd interrupt receives the characters and places + * them on a queue to be processed by the seventh and final co-routine. An + * error is latched should an unexpected character be received, or any + * character be received out of sequence. + * + * A loopback connector is required to ensure that each character transmitted + * on the UART is also received on the same UART. For test purposes the UART + * FIFO's are not utalised in order to maximise the interrupt overhead. Also + * a pseudo random interval is used between the start of each transmission in + * order that the resultant interrupts are more randomly distributed and + * therefore more likely to highlight any problems. + * + * The flash co-routines control LED's zero to four. LED five is toggled each + * time the string is transmitted on the UART. LED six is toggled each time + * the string is CORRECTLY received on the UART. LED seven is latched on should + * an error be detected in any task or co-routine. + * + * In addition the idle task makes repetative calls to + * prvSetAndCheckRegisters(). This simply loads the general purpose registers + * with a known value, then checks each register to ensure the held value is + * still correct. As a low priority task this checking routine is likely to + * get repeatedly swapped in and out. A register being found to contain an + * incorrect value is therefore indicative of an error in the task switching + * mechansim. + * + */ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "croutine.h" + +/* Demo application include files. */ +#include "partest.h" +#include "crflash.h" + +/* Library include files. */ +#include "LM3Sxxx.h" +#include "pdc.h" + +/* The time to delay between writing each character to the LCD. */ +#define mainCHAR_WRITE_DELAY ( 2 / portTICK_RATE_MS ) + +/* The time to delay between writing each string to the LCD. */ +#define mainSTRING_WRITE_DELAY ( 400 / portTICK_RATE_MS ) + +/* The number of flash co-routines to create. */ +#define mainNUM_FLASH_CO_ROUTINES ( 5 ) + +/* The length of the queue used to pass received characters to the Comms Rx +task. */ +#define mainRX_QUEUE_LEN ( 5 ) + +/* The priority of the co-routine used to initiate the transmission of the +string on UART 0. */ +#define mainTX_CO_ROUTINE_PRIORITY ( 1 ) + +/* The priority of the co-routine used to receive characters from the UART. */ +#define mainRX_CO_ROUTINE_PRIORITY ( 2 ) + +/* Only one co-routine is created so its index is not important. */ +#define mainTX_CO_ROUTINE_INDEX ( 0 ) +#define mainRX_CO_ROUTINE_INDEX ( 0 ) + +/* The time between transmissions of the string on UART 0. This is pseudo +random in order to generate a bit or randomness to when the interrupts occur.*/ +#define mainMIN_TX_DELAY ( 40 / portTICK_RATE_MS ) +#define mainMAX_TX_DELAY ( ( portTickType ) 0x7f ) +#define mainOFFSET_TIME ( ( portTickType ) 3 ) + +/* The time the Comms Rx task should wait to receive a character. This should +be slightly longer than the time between transmissions. If we do not receive +a character after this time then there must be an error in the transmission or +the timing of the transmission. */ +#define mainCOMMS_RX_DELAY ( mainMAX_TX_DELAY + 20 ) + +/* The task priorites. */ +#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainCOMMS_RX_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) + +/* The LED's toggled by the various tasks. */ +#define mainCOMMS_FAIL_LED ( 7 ) +#define mainCOMMS_RX_LED ( 6 ) +#define mainCOMMS_TX_LED ( 5 ) + +/* The baud rate used by the UART comms tasks/co-routine. */ +#define mainBAUD_RATE ( 57600 ) + +/* FIFO setting for the UART. The FIFO is not used to create a better test. */ +#define mainFIFO_SET ( 0x10 ) + +/* The string that is transmitted on the UART contains sequentially the +characters from mainFIRST_TX_CHAR to mainLAST_TX_CHAR. */ +#define mainFIRST_TX_CHAR '0' +#define mainLAST_TX_CHAR 'z' + +/* Just used to walk through the program memory in order that some random data +can be generated. */ +#define mainTOTAL_PROGRAM_MEMORY ( ( unsigned long * ) ( 8 * 1024 ) ) +#define mainFIRST_PROGRAM_BYTES ( ( unsigned long * ) 4 ) + +/*-----------------------------------------------------------*/ + +/* + * The task that rotates text on the LCD. + */ +static void vLCDTask( void * pvParameters ); + +/* + * The task that receives the characters from UART 0. + */ +static void vCommsRxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* + * The co-routine that periodically initiates the transmission of the string on + * the UART. + */ +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* + * Writes a string the the LCD. + */ +static void prvWriteString( const char *pcString ); + +/* + * Initialisation routine for the UART. + */ +static void vSerialInit( void ); + +/* + * Thread safe write to the PDC. + */ +static void prvPDCWrite( char cAddress, char cData ); + +/* + * Function to simply set a known value into the general purpose registers + * then read them back to ensure they remain set correctly. An incorrect value + * being indicative of an error in the task switching mechanism. + */ +void prvSetAndCheckRegisters( void ); + +/* + * Latch the LED that indicates that an error has occurred. + */ +void vSetErrorLED( void ); + +/* + * Sets up the PLL and ports used by the demo. + */ +static void prvSetupHardware( void ); + +/*-----------------------------------------------------------*/ + +/* Error flag set to pdFAIL if an error is encountered in the tasks/co-routines +defined within this file. */ +unsigned portBASE_TYPE uxErrorStatus = pdPASS; + +/* The next character to transmit. */ +static char cNextChar; + +/* The queue used to transmit characters from the interrupt to the Comms Rx +task. */ +static xQueueHandle xCommsQueue; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + /* Create the queue used to communicate between the UART ISR and the Comms + Rx task. */ + xCommsQueue = xQueueCreate( mainRX_QUEUE_LEN, sizeof( char ) ); + + /* Setup the ports used by the demo and the clock. */ + prvSetupHardware(); + + /* Create the co-routines that flash the LED's. */ + vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES ); + + /* Create the co-routine that initiates the transmission of characters + on the UART. */ + xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX ); + + /* Create the co-routine that receives characters from the UART. */ + xCoRoutineCreate( vCommsRxCoRoutine, mainRX_CO_ROUTINE_PRIORITY, mainRX_CO_ROUTINE_INDEX ); + + /* Create the LCD task. */ + xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL ); + + /* Start the scheduler running the tasks and co-routines just created. */ + vTaskStartScheduler(); + + /* Should not get here unless we did not have enough memory to start the + scheduler. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* Setup the PLL. */ + SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); + + /* Initialise the hardware used to talk to the LCD, LED's and UART. */ + PDCInit(); + vParTestInitialise(); + vSerialInit(); +} +/*-----------------------------------------------------------*/ + +void vApplicationIdleHook( void ) +{ + /* The co-routines are executed in the idle task using the idle task + hook. */ + for( ;; ) + { + /* Schedule the co-routines. */ + vCoRoutineSchedule(); + + /* Run the register check function between each co-routine. */ + prvSetAndCheckRegisters(); + } +} +/*-----------------------------------------------------------*/ + +static void prvWriteString( const char *pcString ) +{ + /* Write pcString to the LED, pausing between each character. */ + prvPDCWrite(PDC_LCD_CSR, LCD_CLEAR); + while( *pcString ) + { + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_RAM, *pcString ); + pcString++; + } +} +/*-----------------------------------------------------------*/ + +void vLCDTask( void * pvParameters ) +{ +unsigned portBASE_TYPE uxIndex; +const unsigned char ucCFGData[] = { + 0x30, /* Set data bus to 8-bits. */ + 0x30, + 0x30, + 0x3C, /* Number of lines/font. */ + 0x08, /* Display off. */ + 0x01, /* Display clear. */ + 0x06, /* Entry mode [cursor dir][shift]. */ + 0x0C /* Display on [display on][curson on][blinking on]. */ + }; + +/* The strings that are written to the LCD. */ +const char *pcStringsToDisplay[] = { + "Stellaris", + "Demo", + "Two", + "www.FreeRTOS.org", + "" + }; + + /* Configure the LCD. */ + uxIndex = 0; + while( uxIndex < sizeof( ucCFGData ) ) + { + prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] ); + uxIndex++; + vTaskDelay( mainCHAR_WRITE_DELAY ); + } + + /* Turn the LCD Backlight on. */ + prvPDCWrite( PDC_CSR, 0x01 ); + + /* Clear display. */ + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR ); + + uxIndex = 0; + for( ;; ) + { + /* Display the string on the LCD. */ + prvWriteString( pcStringsToDisplay[ uxIndex ] ); + + /* Move on to the next string - wrapping if necessary. */ + uxIndex++; + if( *( pcStringsToDisplay[ uxIndex ] ) == 0x00 ) + { + uxIndex = 0; + /* Longer pause on the last string to be sent. */ + vTaskDelay( mainSTRING_WRITE_DELAY * 2 ); + } + + /* Wait until it is time to move onto the next string. */ + vTaskDelay( mainSTRING_WRITE_DELAY ); + } +} +/*-----------------------------------------------------------*/ + +static void vCommsRxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +static char cRxedChar, cExpectedChar = mainFIRST_TX_CHAR; +portBASE_TYPE xResult; + + crSTART( xHandle ); + + for( ;; ) + { + /* Wait for a character to be received. */ + crQUEUE_RECEIVE( xHandle, xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY, &xResult ); + + /* Was the character recived (if any) the expected character. */ + if( ( cRxedChar != cExpectedChar ) || ( xResult != pdPASS ) ) + { + /* Got an unexpected character. This can sometimes occur when + reseting the system using the debugger leaving characters already + in the UART regsters. */ + uxErrorStatus = pdFAIL; + + /* Resync by waiting for the end of the current string. */ + while( cRxedChar != mainLAST_TX_CHAR ) + { + crQUEUE_RECEIVE( xHandle, xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY, &xResult ); + } + + /* The next expected character is the start of the string again. */ + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + if( cExpectedChar == mainLAST_TX_CHAR ) + { + /* We have reached the end of the string - we now expect to + receive the first character in the string again. The LED is + toggled to indicate that the entire string was received without + error. */ + vParTestToggleLED( mainCOMMS_RX_LED ); + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + /* We got the expected character, we now expect to receive the + next character in the string. */ + cExpectedChar++; + } + } + } + + crEND(); +} +/*-----------------------------------------------------------*/ + +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +portTickType xDelayPeriod; +static unsigned long *pulRandomBytes = mainFIRST_PROGRAM_BYTES; + + /* Co-routine MUST start with a call to crSTART. */ + crSTART( xHandle ); + + for(;;) + { + /* Was the previously transmitted string received correctly? */ + if( uxErrorStatus != pdPASS ) + { + /* An error was encountered so set the error LED. */ + vSetErrorLED(); + } + + /* The next character to Tx is the first in the string. */ + cNextChar = mainFIRST_TX_CHAR; + + UARTIntDisable( UART0_BASE, UART_INT_TX ); + { + /* Send the first character. */ + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + + /* Move the variable to the char to Tx on so the ISR transmits + the next character in the string once this one has completed. */ + cNextChar++; + } + UARTIntEnable(UART0_BASE, UART_INT_TX); + + /* Toggle the LED to show a new string is being transmitted. */ + vParTestToggleLED( mainCOMMS_TX_LED ); + + /* Delay before we start the string off again. A pseudo-random delay + is used as this will provide a better test. */ + xDelayPeriod = xTaskGetTickCount() + ( *pulRandomBytes ); + + pulRandomBytes++; + if( pulRandomBytes > mainTOTAL_PROGRAM_MEMORY ) + { + pulRandomBytes = mainFIRST_PROGRAM_BYTES; + } + + /* Make sure we don't wait too long... */ + xDelayPeriod &= mainMAX_TX_DELAY; + + /* ...but we do want to wait. */ + if( xDelayPeriod < mainMIN_TX_DELAY ) + { + xDelayPeriod = mainMIN_TX_DELAY; + } + + /* Block for the random(ish) time. */ + crDELAY( xHandle, xDelayPeriod ); + } + + /* Co-routine MUST end with a call to crEND. */ + crEND(); +} +/*-----------------------------------------------------------*/ + +static void vSerialInit( void ) +{ + /* Enable the UART. GPIOA has already been initialised. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + /* Set GPIO A0 and A1 as peripheral function. They are used to output the + UART signals. */ + GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW ); + + /* Configure the UART for 8-N-1 operation. */ + UARTConfigSet( UART0_BASE, mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE ); + + /* We dont want to use the fifo. This is for test purposes to generate + as many interrupts as possible. */ + HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET; + + /* Enable both Rx and Tx interrupts. */ + HWREG( UART0_BASE + UART_O_IM ) |= ( UART_INT_TX | UART_INT_RX ); + IntEnable( INT_UART0 ); +} +/*-----------------------------------------------------------*/ + +void vUART_ISR(void) +{ +unsigned long ulStatus; +char cRxedChar; +portBASE_TYPE xTaskWokenByPost = pdFALSE; + + /* What caused the interrupt. */ + ulStatus = UARTIntStatus( UART0_BASE, pdTRUE ); + + /* Clear the interrupt. */ + UARTIntClear( UART0_BASE, ulStatus ); + + /* Was an Rx interrpt pending? */ + if( ulStatus & UART_INT_RX ) + { + if( ( HWREG(UART0_BASE + UART_O_FR ) & UART_FR_RXFF ) ) + { + /* Get the char from the buffer and post it onto the queue of + Rxed chars. Posting the character should wake the task that is + blocked on the queue waiting for characters. */ + cRxedChar = ( char ) HWREG( UART0_BASE + UART_O_DR ); + xTaskWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsQueue, &cRxedChar, xTaskWokenByPost ); + } + } + + /* Was a Tx interrupt pending? */ + if( ulStatus & UART_INT_TX ) + { + /* Send the next character in the string. We are not using the FIFO. */ + if( cNextChar <= mainLAST_TX_CHAR ) + { + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + cNextChar++; + } + } + + if( xTaskWokenByPost ) + { + /* We are posting to a co-routine rather than a task so don't bother + causing a task switch. */ + } +} +/*-----------------------------------------------------------*/ + +static void prvPDCWrite( char cAddress, char cData ) +{ + vTaskSuspendAll(); + { + PDCWrite( cAddress, cData ); + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vSetErrorLED( void ) +{ + vParTestSetLED( mainCOMMS_FAIL_LED, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +__asm void prvSetAndCheckRegisters( void ) +{ + extern vSetErrorLED + + /* Fill the general purpose registers with known values. */ + mov r11, #10 + add r0, r11, #1 + add r1, r11, #2 + add r2, r11, #3 + add r3, r11, #4 + add r4, r11, #5 + add r5, r11, #6 + add r6, r11, #7 + add r7, r11, #8 + add r8, r11, #9 + add r9, r11, #10 + add r10, r11, #11 + add r12, r11, #12 + + /* Check the values are as expected. */ + cmp r11, #10 + bne set_error_led + cmp r0, #11 + bne set_error_led + cmp r1, #12 + bne set_error_led + cmp r2, #13 + bne set_error_led + cmp r3, #14 + bne set_error_led + cmp r4, #15 + bne set_error_led + cmp r5, #16 + bne set_error_led + cmp r6, #17 + bne set_error_led + cmp r7, #18 + bne set_error_led + cmp r8, #19 + bne set_error_led + cmp r9, #20 + bne set_error_led + cmp r10, #21 + bne set_error_led + cmp r12, #22 + bne set_error_led + bx lr + +set_error_led; + push {r14} + ldr r1, =vSetErrorLED + blx r1 + pop {r14} + bx lr; +} +/*-----------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/readme.txt b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/readme.txt new file mode 100644 index 0000000..2ddb358 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/readme.txt @@ -0,0 +1,3 @@ +Move these two fines into the Demo/CORTEX_LM3S102_KEIL directory to run Demo 2. + +See the port documentation on the www.FreeRTOS.org site for more information. diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Opt b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Opt new file mode 100644 index 0000000..cdd7176 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Opt @@ -0,0 +1,51 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + + cExt (*.c) + aExt (*.s*; *.src; *.a*) + oExt (*.obj) + lExt (*.lib) + tExt (*.txt; *.h; *.inc) + pExt (*.plm) + CppX (*.cpp) + DaveTm { 0,0,0,0,0,0,0,0 } + +Target (LM3S1xx), 0x0004 // Tools: 'ARM-ADS' +GRPOPT 1,(Source),0,0,0 +GRPOPT 2,(Demo),0,0,0 + +OPTFFF 1,1,1,0,0,0,0,0,<..\..\Source\croutine.c> +OPTFFF 1,2,1,0,0,0,0,0,<..\..\Source\list.c> +OPTFFF 1,3,1,0,0,0,0,0,<..\..\Source\queue.c> +OPTFFF 1,4,1,0,0,0,0,0,<..\..\Source\tasks.c> +OPTFFF 1,5,1,0,0,0,0,0,<..\..\Source\portable\MemMang\heap_1.c> +OPTFFF 1,6,1,0,0,0,0,0,<..\..\Source\portable\RVDS\ARM_CM3\port.c> +OPTFFF 2,7,1,0,0,0,0,0,<.\main.c> +OPTFFF 2,8,2,0,0,0,0,0,<.\init\Startup.s> +OPTFFF 2,9,1,0,0,0,0,0,<..\Common\Minimal\crflash.c> +OPTFFF 2,10,1,0,0,0,0,0,<.\ParTest\ParTest.c> +OPTFFF 2,11,1,0,0,0,0,0,<.\include\pdc.c> +OPTFFF 2,12,4,0,0,0,0,0,<..\Common\drivers\LuminaryMicro\Keil\driverlib.lib> + + +TARGOPT 1, (LM3S1xx) + ADSCLK=20000000 + OPTTT 1,1,1,0 + OPTHX 1,65535,0,0,0 + OPTLX 79,66,8,<.\uvision\> + OPTOX 16 + OPTLT 1,1,1,0,1,1,0,1,0,0,0,0 + OPTXL 1,1,1,1,1,1,1,0,0 + OPTFL 1,0,1 + OPTAX 0 + OPTDL (SARMCM3.DLL)()(DLM.DLL)(-pLM3S101)(SARMCM3.DLL)()(TLM.DLL)(-pLM3S101) + OPTDBG 49150,1,()()()()()()()()()() (BIN\UL2CM3.DLL)()()() + OPTKEY 0,(DLGTARM)((1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1014=-1,-1,-1,-1,0)(1016=-1,-1,-1,-1,0)) + OPTKEY 0,(ARMDBGFLAGS)() + OPTKEY 0,(DLGUARM)((105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0)) + OPTKEY 0,(UL2CM3)(-UU0226F8E -O14 -S0 -C0 -N00("ARM CoreSight JTAG-DP") -D00(1BA00477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP7 -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_8 -FS00 -FL02000) + OPTDF 0x80 + OPTLE <> + OPTLC <> +EndOpt + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Uv2 b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Uv2 new file mode 100644 index 0000000..e72477a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Uv2 @@ -0,0 +1,112 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + +Target (LM3S1xx), 0x0004 // Tools: 'ARM-ADS' + +Group (Source) +Group (Demo) + +File 1,1,<..\..\Source\croutine.c> +File 1,1,<..\..\Source\list.c> +File 1,1,<..\..\Source\queue.c> +File 1,1,<..\..\Source\tasks.c> +File 1,1,<..\..\Source\portable\MemMang\heap_1.c> +File 1,1,<..\..\Source\portable\RVDS\ARM_CM3\port.c> +File 2,1,<.\main.c> +File 2,2,<.\init\Startup.s> +File 2,1,<..\Common\Minimal\crflash.c> +File 2,1,<.\ParTest\ParTest.c> +File 2,1,<.\include\pdc.c> +File 2,4,<..\Common\drivers\LuminaryMicro\Keil\driverlib.lib> + + +Options 1,0,0 // Target 'LM3S1xx' + Device (LM3S101) + Vendor (Luminary Micro) + Cpu (IRAM(0x20000000-0x200007FF) IROM(0-0x1FFF) CLOCK(20000000) CPUTYPE("Cortex-M3")) + FlashUt () + StupF ("STARTUP\Luminary\Startup.s" ("Luminary Startup Code")) + FlashDR (UL2CM3(-U40296420 -O7 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_8 -FS00 -FL02000)) + DevID (4079) + Rgf (LM3Sxxx.H) + Mem () + C () + A () + RL () + OH () + DBC_IFX () + DBC_CMS () + DBC_AMS () + DBC_LMS () + UseEnv=0 + EnvBin () + EnvInc () + EnvLib () + EnvReg (ÿLuminary\) + OrgReg (ÿLuminary\) + TgStat=16 + OutDir (.\uvision\) + OutName (RTOSDemo) + GenApp=1 + GenLib=0 + GenHex=0 + Debug=1 + Browse=1 + LstDir (.\uvision\) + HexSel=1 + MG32K=0 + TGMORE=0 + RunUsr 0 0 <> + RunUsr 1 0 <> + BrunUsr 0 0 <> + BrunUsr 1 0 <> + CrunUsr 0 0 <> + CrunUsr 1 0 <> + SVCSID <> + GLFLAGS=1790 + ADSFLGA { 243,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ACPUTYP ("Cortex-M3") + RVDEV () + ADSTFLGA { 0,12,0,2,99,0,0,66,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSOCM { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSIRAM { 0,0,0,0,32,0,8,0,0 } + OCMADSIROM { 1,0,0,0,0,0,32,0,0 } + OCMADSXRAM { 0,0,0,0,0,0,0,0,0 } + OCR_RVCT { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,32,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,8,0,0,0,0,0,0,0,0,0,0,0 } + RV_STAVEC () + ADSCCFLG { 8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSCMISC () + ADSCDEFN (RVDS_ARMCM3_LM3S102) + ADSCUDEF () + ADSCINCD (C:\Keil\ARM\RV30\LIB\Luminary;..\CORTEX_LM3S102_KEIL;..\..\Source\portable\RVDS\ARM_CM3;..\..\Source\include;..\Common\include;.\include) + ADSASFLG { 65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSAMISC (--diag_suppress 1581) + ADSADEFN () + ADSAUDEF () + ADSAINCD () + PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + IncBld=1 + AlwaysBuild=0 + GenAsm=0 + AsmAsm=0 + PublicsOnly=0 + StopCode=3 + CustArgs () + LibMods () + ADSLDFG { 16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSLDTA (0x00000000) + ADSLDDA (0x20000000) + ADSLDSC () + ADSLDIB () + ADSLDIC () + ADSLDMC (--entry Reset_Handler) + ADSLDIF () + ADSLDDW (6306) + OPTDL (SARMCM3.DLL)()(DLM.DLL)(-pLM3S101)(SARMCM3.DLL)()(TLM.DLL)(-pLM3S101) + OPTDBG 49150,1,()()()()()()()()()() (BIN\UL2CM3.DLL)()()() + FLASH1 { 1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 } + FLASH2 (BIN\UL2CM3.DLL) + FLASH3 ("" ()) + FLASH4 () +EndOpt + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOSConfig.h new file mode 100644 index 0000000..aaea9d7 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOSConfig.h @@ -0,0 +1,113 @@ +/* + FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong? * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, training, latest information, + license and contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool. + + Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell + the code with commercial support, indemnification, and middleware, under + the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also + provide a safety engineered and independently SIL3 certified version under + the SafeRTOS brand: http://www.SafeRTOS.com. +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 59 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1468 ) ) +#define configMAX_TASK_NAME_LEN ( 3 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 0 +#define INCLUDE_uxTaskPriorityGet 0 +#define INCLUDE_vTaskDelete 0 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelay 1 + +#define configKERNEL_INTERRUPT_PRIORITY 255 +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xa0, or priority 5. */ + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/ParTest/ParTest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/ParTest/ParTest.c new file mode 100644 index 0000000..8b3eebb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/ParTest/ParTest.c @@ -0,0 +1,146 @@ +/* + FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong? * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, training, latest information, + license and contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool. + + Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell + the code with commercial support, indemnification, and middleware, under + the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also + provide a safety engineered and independently SIL3 certified version under + the SafeRTOS brand: http://www.SafeRTOS.com. +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + + +#include "FreeRTOS.h" +#include "task.h" +#include "partest.h" + +#include "pdc.h" + +#define partstPINS (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 Z | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7) + +#define partstALL_OUTPUTS_OFF ( ( unsigned char ) 0x00 ) +#define partstMAX_OUTPUT_LED ( ( unsigned char ) 8 ) + +static volatile unsigned char ucOutputValue = partstALL_OUTPUTS_OFF; + +void vParTestInitialise( void ) +{ + PDCInit(); + PDCWrite( PDC_LED, ucOutputValue ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ +unsigned char ucBit = ( unsigned char ) 1; + + vTaskSuspendAll(); + { + if( uxLED < partstMAX_OUTPUT_LED ) + { + ucBit = ( ( unsigned char ) 1 ) << uxLED; + + if( xValue == pdFALSE ) + { + ucBit ^= ( unsigned char ) 0xff; + ucOutputValue &= ucBit; + } + else + { + ucOutputValue |= ucBit; + } + + PDCWrite( PDC_LED, ucOutputValue ); + } + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) +{ +unsigned char ucBit; + + vTaskSuspendAll(); + { + if( uxLED < partstMAX_OUTPUT_LED ) + { + ucBit = ( ( unsigned char ) 1 ) << uxLED; + + if( ucOutputValue & ucBit ) + { + ucOutputValue &= ~ucBit; + } + else + { + ucOutputValue |= ucBit; + } + + PDCWrite( PDC_LED, ucOutputValue ); + } + } + xTaskResumeAll(); +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.c new file mode 100644 index 0000000..d1c5444 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.c @@ -0,0 +1,118 @@ +//***************************************************************************** +// +// pdc.c - Driver for the Peripheral Device Controller (PDC) on the Stellaris +// development board. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +//***************************************************************************** + +#include "LM3Sxxx.h" +#include "pdc.h" + +//***************************************************************************** +// +//! Initializes the connection to the PDC. +//! +//! This function will enable clocking to the SSI and GPIO A modules, configure +//! the GPIO pins to be used for an SSI interface, and it will configure the +//! SSI as a 1Mb master device, operating in MOTO mode. It will also enable +//! the SSI module, and will enable the chip select for the PDC on the +//! Stellaris development board. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCInit(void) +{ + // + // Enable the peripherals used to drive the PDC. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Configure the appropriate pins to be SSI instead of GPIO. + // + GPIODirModeSet(GPIO_PORTA_BASE, SSI_CLK | SSI_TX | SSI_RX, + GPIO_DIR_MODE_HW); + GPIODirModeSet(GPIO_PORTA_BASE, SSI_CS, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTA_BASE, SSI_CLK, GPIO_STRENGTH_4MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the SSI port. + // + SSIConfig(SSI_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 8); + SSIEnable(SSI_BASE); + + // + // Reset the PDC SSI state machine. The chip select needs to be held low + // for 100ns; the procedure call overhead more than accounts for this time. + // + GPIOPinWrite(GPIO_PORTA_BASE, PDC_CS, 0); + GPIOPinWrite(GPIO_PORTA_BASE, PDC_CS, PDC_CS); +} + +//***************************************************************************** +// +//! Write a PDC register. +//! +//! \param ucAddr specifies the PDC register to write. +//! \param ucData specifies the data to write. +//! +//! This function will perform the SSI transfers required to write a register +//! in the PDC on the Stellaris development board. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCWrite(unsigned char ucAddr, unsigned char ucData) +{ + unsigned long ulTemp; + + // + // Send address and write command. + // + SSIDataPut(SSI_BASE, (ucAddr & 0x0F) | PDC_WR); + + // + // Write the data. + // + SSIDataPut(SSI_BASE, ucData); + + // + // Flush data read during address write. + // + SSIDataGet(SSI_BASE, &ulTemp); + + // + // Flush data read during data write. + // + SSIDataGet(SSI_BASE, &ulTemp); +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.h new file mode 100644 index 0000000..6380806 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.h @@ -0,0 +1,122 @@ +//***************************************************************************** +// +// pdc.h - Stellaris development board Peripheral Device Controller definitions +// and prototypes. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +//***************************************************************************** + +#ifndef __PDC_H__ +#define __PDC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The registers within the peripheral device controller. +// +//***************************************************************************** +#define PDC_VER 0x0 // Version register +#define PDC_CSR 0x1 // Command/Status register +#define PDC_DSW 0x4 // DIP Switch register +#define PDC_LED 0x5 // LED register +#define PDC_LCD_CSR 0x6 // LCD Command/Status register +#define PDC_LCD_RAM 0x7 // LCD RAM register +#define PDC_GPXDAT 0x8 // GPIO X Data register +#define PDC_GPXDIR 0x9 // GPIO X Direction register +#define PDC_GPYDAT 0xA // GPIO Y Data register +#define PDC_GPYDIR 0xB // GPIO Y Direction register +#define PDC_GPZDAT 0xC // GPIO Z Data register +#define PDC_GPZDIR 0xD // GPIO Z Direction register + +//***************************************************************************** +// +// Flags indicating a read or write to the peripheral device controller. +// +//***************************************************************************** +#define PDC_RD 0x80 // PDC read command +#define PDC_WR 0x00 // PDC write command + +//***************************************************************************** +// +// LCD panel (Crystalfontz CFAH1602B) commands, RS = 0 +// +//***************************************************************************** +#define LCD_CLEAR 0x01 // Clear display (0 fill DDRAM). +#define LCD_HOME 0x02 // Cursor home. +#define LCD_MODE 0x04 // Set entry mode (cursor dir) +#define LCD_ON 0x08 // Set display, cursor, blinking + // on/off +#define LCD_CUR 0x10 // Cursor, display shift +#define LCD_IF 0x20 // Set interface data length, + // lines, font +#define LCD_CGADDR 0x40 // Set CGRAM AC address +#define LCD_DDADDR 0x80 // Set DDRAM AC address + +//***************************************************************************** +// +// LCD Status bit +// +//***************************************************************************** +#define LCD_B_BUSY 0x80 // Busy flag. + +//***************************************************************************** +// +// The GPIO port A pin numbers for the various SSI signals. +// +//***************************************************************************** +#define SSI_CS GPIO_PIN_3 +#define PDC_CS GPIO_PIN_3 +#define SSI_CLK GPIO_PIN_2 +#define SSI_TX GPIO_PIN_5 +#define SSI_RX GPIO_PIN_4 + +//***************************************************************************** +// +// Function Prototypes +// +//***************************************************************************** +extern void PDCInit(void); +extern unsigned char PDCRead(unsigned char ucAddr); +extern void PDCWrite(unsigned char ucAddr, unsigned char ucData); +extern unsigned char PDCDIPRead(void); +extern void PDCLEDWrite(unsigned char ucLED); +extern unsigned char PDCLEDRead(void); +extern void PDCLCDInit(void); +extern void PDCLCDBacklightOn(void); +extern void PDCLCDBacklightOff(void); +extern void PDCLCDClear(void); +extern void PDCLCDCreateChar(unsigned char ucChar, unsigned char *pucData); +extern void PDCLCDSetPos(unsigned char ucX, unsigned char ucY); +extern void PDCLCDWrite(const char *pcStr, unsigned long ulCount); +extern unsigned char PDCGPIODirRead(unsigned char ucIdx); +extern void PDCGPIODirWrite(unsigned char ucIdx, unsigned char ucValue); +extern unsigned char PDCGPIORead(unsigned char ucIdx); +extern void PDCGPIOWrite(unsigned char ucIdx, unsigned char ucValue); + +#ifdef __cplusplus +} +#endif + +#endif // __PDC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/init/Startup.s b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/init/Startup.s new file mode 100644 index 0000000..d5dea8b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/init/Startup.s @@ -0,0 +1,164 @@ +;/*****************************************************************************/ +;/* STARTUP.S: Startup file for Luminary Micro LM3Sxxx */ +;/*****************************************************************************/ +;/* <<< Use Configuration Wizard in Context Menu >>> */ +;/*****************************************************************************/ +;/* This file is part of the uVision/ARM development tools. */ +;/* Copyright (c) 2005-2006 Keil Software. All rights reserved. */ +;/* This software may only be used under the terms of a valid, current, */ +;/* end user licence from KEIL for a compatible version of KEIL software */ +;/* development tools. Nothing else gives you the right to use this software. */ +;/*****************************************************************************/ + + +;/* +; * The STARTUP.S code is executed after CPU Reset. +; */ + + +;// Stack Configuration +;// Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +;// + +Stack_Size EQU 51 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size + + +;// Heap Configuration +;// Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +;// + +Heap_Size EQU 0x00000000 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +Heap_Mem SPACE Heap_Size + + +; System Control Register Addresses +SYSCTL_BASE EQU 0x400FE000 ; System Control Base Address +PBORCTL_OFS EQU 0x0030 ; Power-On & Brown-Out Reset Control +LDOPC_OFS EQU 0x0034 ; LDO Power +SRCR0_OFS EQU 0x0040 ; Software Reset Control 0 +SRCR1_OFS EQU 0x0044 ; Software Reset Control 1 +SRCR2_OFS EQU 0x0048 ; Software Reset Control 2 +RCC_OFS EQU 0x0060 ; Run-Mode Clock Control +RCGC0_OFS EQU 0x0100 ; Run-Mode Clock Gating Control 0 +RCGC1_OFS EQU 0x0104 ; Run-Mode Clock Gating Control 1 +RCGC2_OFS EQU 0x0108 ; Run-Mode Clock Gating Control 2 +SCGC0_OFS EQU 0x0110 ; Sleep-Mode Clock Gating Control 0 +SCGC1_OFS EQU 0x0114 ; Sleep-Mode Clock Gating Control 1 +SCGC2_OFS EQU 0x0118 ; Sleep-Mode Clock Gating Control 2 +DCGC0_OFS EQU 0x0120 ; Deep-Sleep-Mode Clock Gating Control 0 +DCGC1_OFS EQU 0x0124 ; Deep-Sleep-Mode Clock Gating Control 1 +DCGC2_OFS EQU 0x0128 ; Deep-Sleep-Mode Clock Gating Control 2 + + + PRESERVE8 + + +; Area Definition and Entry Point +; Startup Code must be linked first at Address 0. + + AREA RESET, CODE, READONLY + THUMB + + IMPORT xPortPendSVHandler + IMPORT xPortSysTickHandler + IMPORT vUART_ISR + IMPORT vPortSVCHandler + +; Vector Table + EXPORT __Vectors +__Vectors DCD Stack_Mem + Stack_Size ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD DefaultISR ; Hard Fault Handler + DCD DefaultISR ; MPU Fault Handler + DCD DefaultISR ; Bus Fault Handler + DCD DefaultISR ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD vPortSVCHandler ; SVCall Handler + DCD DefaultISR ; Debug Monitor Handler + DCD 0 ; Reserved + DCD xPortPendSVHandler ; PendSV Handler + DCD xPortSysTickHandler ; SysTick Handler + DCD DefaultISR ; GPIO Port A Handler + DCD DefaultISR ; GPIO Port B Handler + DCD DefaultISR ; GPIO Port C Handler + DCD DefaultISR ; GPIO Port D Handler + DCD DefaultISR ; GPIO Port E Handler + DCD vUART_ISR ; UART0 Rx/Tx Handler + DCD DefaultISR ; UART1 Rx/Tx Handler + DCD DefaultISR ; SSI Rx/Tx Handler + DCD DefaultISR ; I2C Master/Slave Handler + DCD DefaultISR ; PWM Fault Handler + DCD DefaultISR ; PWM Generator 0 Handler + DCD DefaultISR ; PWM Generator 1 Handler + DCD DefaultISR ; PWM Generator 2 Handler + DCD DefaultISR ; Quadrature Encoder Handler + DCD DefaultISR ; ADC Sequence 0 Handler + DCD DefaultISR ; ADC Sequence 1 Handler + DCD DefaultISR ; ADC Sequence 2 Handler + DCD DefaultISR ; ADC Sequence 3 Handler + DCD DefaultISR ; Watchdog Timer Handler + DCD DefaultISR ; Timer 0 Subtimer A Handler + DCD DefaultISR ; Timer 0 Subtimer B Handler + DCD DefaultISR ; Timer 1 Subtimer A Handler + DCD DefaultISR ; Timer 1 Subtimer B Handler + DCD DefaultISR ; Timer 2 Subtimer A Handler + DCD DefaultISR ; Timer 2 Subtimer B Handler + DCD DefaultISR ; Analog Comparator 0 Handler + DCD DefaultISR ; Analog Comparator 1 Handler + DCD DefaultISR ; Analog Comparator 2 Handler + DCD DefaultISR ; System Control Handler + DCD DefaultISR ; Flash Control Handler + +; Dummy Handlers are implemented as infinite loops which can be modified. + +NmiSR B NmiSR +FaultISR B FaultISR + EXPORT FaultISR +DefaultISR B DefaultISR + + +; Reset Handler + + EXPORT Reset_Handler +Reset_Handler + +; Enable Clock Gating for Peripherals +; LDR R0, =SYSCTL_BASE ; System Control Base Address +; MVN R1, #0 ; Value 0xFFFFFFFF +; STR R1, [R0,#RCGC0_OFS] ; Run-Mode Clock Gating Ctrl 0 +; STR R1, [R0,#RCGC1_OFS] ; Run-Mode Clock Gating Ctrl 1 +; STR R1, [R0,#RCGC2_OFS] ; Run-Mode Clock Gating Ctrl 2 + +; Enter the C code + + IMPORT __main + LDR R0, =__main + BX R0 + + +; User Initial Stack & Heap + AREA |.text|, CODE, READONLY + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + + END diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/main.c new file mode 100644 index 0000000..560d41d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/main.c @@ -0,0 +1,630 @@ +/* + FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong? * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, training, latest information, + license and contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool. + + Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell + the code with commercial support, indemnification, and middleware, under + the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also + provide a safety engineered and independently SIL3 certified version under + the SafeRTOS brand: http://www.SafeRTOS.com. +*/ + +/* + * This demo application creates six co-routines and two tasks (three including + * the idle task). The co-routines execute as part of the idle task hook. + * + * Five of the created co-routines are the standard 'co-routine flash' + * co-routines contained within the Demo/Common/Minimal/crflash.c file and + * documented on the FreeRTOS.org WEB site. + * + * The 'LCD Task' rotates a string on the LCD, delaying between each character + * as necessitated by the slow interface, and delaying between each string just + * long enough to enable the text to be read. + * + * The sixth co-routine and final task control the transmission and reception + * of a string to UART 0. The co-routine periodically sends the first + * character of the string to the UART, with the UART's TxEnd interrupt being + * used to transmit the remaining characters. The UART's RxEnd interrupt + * receives the characters and places them on a queue to be processed by the + * 'COMs Rx' task. An error is latched should an unexpected character be + * received, or any character be received out of sequence. + * + * A loopback connector is required to ensure that each character transmitted + * on the UART is also received on the same UART. For test purposes the UART + * FIFO's are not utalised in order to maximise the interrupt overhead. Also + * a pseudo random interval is used between the start of each transmission in + * order that the resultant interrupts are more randomly distributed and + * therefore more likely to highlight any problems. + * + * The flash co-routines control LED's zero to four. LED five is toggled each + * time the string is transmitted on the UART. LED six is toggled each time + * the string is CORRECTLY received on the UART. LED seven is latched on should + * an error be detected in any task or co-routine. + * + * In addition the idle task makes repetative calls to + * prvSetAndCheckRegisters(). This simply loads the general purpose registers + * with a known value, then checks each register to ensure the held value is + * still correct. As a low priority task this checking routine is likely to + * get repeatedly swapped in and out. A register being found to contain an + * incorrect value is therefore indicative of an error in the task switching + * mechansim. + * + */ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "croutine.h" + +/* Demo application include files. */ +#include "partest.h" +#include "crflash.h" + +/* Library include files. */ +#include "LM3Sxxx.h" +#include "pdc.h" + +/* The time to delay between writing each character to the LCD. */ +#define mainCHAR_WRITE_DELAY ( 2 / portTICK_RATE_MS ) + +/* The time to delay between writing each string to the LCD. */ +#define mainSTRING_WRITE_DELAY ( 400 / portTICK_RATE_MS ) + +/* The number of flash co-routines to create. */ +#define mainNUM_FLASH_CO_ROUTINES ( 5 ) + +/* The length of the queue used to pass received characters to the Comms Rx +task. */ +#define mainRX_QUEUE_LEN ( 5 ) + +/* The priority of the co-routine used to initiate the transmission of the +string on UART 0. */ +#define mainTX_CO_ROUTINE_PRIORITY ( 1 ) + +/* Only one co-routine is created so its index is not important. */ +#define mainTX_CO_ROUTINE_INDEX ( 0 ) + +/* The time between transmissions of the string on UART 0. This is pseudo +random in order to generate a bit or randomness to when the interrupts occur.*/ +#define mainMIN_TX_DELAY ( 40 / portTICK_RATE_MS ) +#define mainMAX_TX_DELAY ( ( portTickType ) 0x7f ) +#define mainOFFSET_TIME ( ( portTickType ) 3 ) + +/* The time the Comms Rx task should wait to receive a character. This should +be slightly longer than the time between transmissions. If we do not receive +a character after this time then there must be an error in the transmission or +the timing of the transmission. */ +#define mainCOMMS_RX_DELAY ( mainMAX_TX_DELAY + 20 ) + +/* The task priorites. */ +#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainCOMMS_RX_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) + +/* The LED's toggled by the various tasks. */ +#define mainCOMMS_FAIL_LED ( 7 ) +#define mainCOMMS_RX_LED ( 6 ) +#define mainCOMMS_TX_LED ( 5 ) + +/* The baud rate used by the UART comms tasks/co-routine. */ +#define mainBAUD_RATE ( 57600 ) + +/* FIFO setting for the UART. The FIFO is not used to create a better test. */ +#define mainFIFO_SET ( 0x10 ) + +/* The string that is transmitted on the UART contains sequentially the +characters from mainFIRST_TX_CHAR to mainLAST_TX_CHAR. */ +#define mainFIRST_TX_CHAR '0' +#define mainLAST_TX_CHAR 'z' + +/* Just used to walk through the program memory in order that some random data +can be generated. */ +#define mainTOTAL_PROGRAM_MEMORY ( ( unsigned long * ) ( 8 * 1024 ) ) +#define mainFIRST_PROGRAM_BYTES ( ( unsigned long * ) 4 ) + +/*-----------------------------------------------------------*/ + +/* + * The task that rotates text on the LCD. + */ +static void vLCDTask( void * pvParameters ); + +/* + * The task that receives the characters from UART 0. + */ +static void vCommsRxTask( void * pvParameters ); + +/* + * The co-routine that periodically initiates the transmission of the string on + * the UART. + */ +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* + * Writes a string the the LCD. + */ +static void prvWriteString( const char *pcString ); + +/* + * Initialisation routine for the UART. + */ +static void vSerialInit( void ); + +/* + * Thread safe write to the PDC. + */ +static void prvPDCWrite( char cAddress, char cData ); + +/* + * Function to simply set a known value into the general purpose registers + * then read them back to ensure they remain set correctly. An incorrect value + * being indicative of an error in the task switching mechanism. + */ +void prvSetAndCheckRegisters( void ); + +/* + * Latch the LED that indicates that an error has occurred. + */ +void vSetErrorLED( void ); + +/* + * Sets up the PLL and ports used by the demo. + */ +static void prvSetupHardware( void ); + +/*-----------------------------------------------------------*/ + +/* Error flag set to pdFAIL if an error is encountered in the tasks/co-routines +defined within this file. */ +unsigned portBASE_TYPE uxErrorStatus = pdPASS; + +/* The next character to transmit. */ +static char cNextChar; + +/* The queue used to transmit characters from the interrupt to the Comms Rx +task. */ +static xQueueHandle xCommsQueue; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + /* Create the queue used to communicate between the UART ISR and the Comms + Rx task. */ + xCommsQueue = xQueueCreate( mainRX_QUEUE_LEN, sizeof( char ) ); + + /* Setup the ports used by the demo and the clock. */ + prvSetupHardware(); + + /* Create the co-routines that flash the LED's. */ + vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES ); + + /* Create the co-routine that initiates the transmission of characters + on the UART. */ + xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX ); + + /* Create the LCD and Comms Rx tasks. */ + xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL ); + xTaskCreate( vCommsRxTask, "CMS", configMINIMAL_STACK_SIZE, NULL, mainCOMMS_RX_TASK_PRIORITY, NULL ); + + /* Start the scheduler running the tasks and co-routines just created. */ + vTaskStartScheduler(); + + /* Should not get here unless we did not have enough memory to start the + scheduler. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* Setup the PLL. */ + SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); + + /* Initialise the hardware used to talk to the LCD, LED's and UART. */ + PDCInit(); + vParTestInitialise(); + vSerialInit(); +} +/*-----------------------------------------------------------*/ + +void vApplicationIdleHook( void ) +{ + /* The co-routines are executed in the idle task using the idle task + hook. */ + for( ;; ) + { + /* Schedule the co-routines. */ + vCoRoutineSchedule(); + + /* Run the register check function between each co-routine. */ + prvSetAndCheckRegisters(); + } +} +/*-----------------------------------------------------------*/ + +static void prvWriteString( const char *pcString ) +{ + /* Write pcString to the LED, pausing between each character. */ + prvPDCWrite(PDC_LCD_CSR, LCD_CLEAR); + while( *pcString ) + { + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_RAM, *pcString ); + pcString++; + } +} +/*-----------------------------------------------------------*/ + +void vLCDTask( void * pvParameters ) +{ +unsigned portBASE_TYPE uxIndex; +const unsigned char ucCFGData[] = { + 0x30, /* Set data bus to 8-bits. */ + 0x30, + 0x30, + 0x3C, /* Number of lines/font. */ + 0x08, /* Display off. */ + 0x01, /* Display clear. */ + 0x06, /* Entry mode [cursor dir][shift]. */ + 0x0C /* Display on [display on][curson on][blinking on]. */ + }; + +/* The strings that are written to the LCD. */ +const char *pcStringsToDisplay[] = { + "Stellaris", + "Demo", + "One", + "www.FreeRTOS.org", + "" + }; + + /* Configure the LCD. */ + uxIndex = 0; + while( uxIndex < sizeof( ucCFGData ) ) + { + prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] ); + uxIndex++; + vTaskDelay( mainCHAR_WRITE_DELAY ); + } + + /* Turn the LCD Backlight on. */ + prvPDCWrite( PDC_CSR, 0x01 ); + + /* Clear display. */ + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR ); + + uxIndex = 0; + for( ;; ) + { + /* Display the string on the LCD. */ + prvWriteString( pcStringsToDisplay[ uxIndex ] ); + + /* Move on to the next string - wrapping if necessary. */ + uxIndex++; + if( *( pcStringsToDisplay[ uxIndex ] ) == 0x00 ) + { + uxIndex = 0; + /* Longer pause on the last string to be sent. */ + vTaskDelay( mainSTRING_WRITE_DELAY * 2 ); + } + + /* Wait until it is time to move onto the next string. */ + vTaskDelay( mainSTRING_WRITE_DELAY ); + } +} +/*-----------------------------------------------------------*/ + +static void vCommsRxTask( void * pvParameters ) +{ +static char cRxedChar, cExpectedChar; + + /* Set the char we expect to receive to the start of the string. */ + cExpectedChar = mainFIRST_TX_CHAR; + + for( ;; ) + { + /* Wait for a character to be received. */ + xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY ); + + /* Was the character recived (if any) the expected character. */ + if( cRxedChar != cExpectedChar ) + { + /* Got an unexpected character. This can sometimes occur when + reseting the system using the debugger leaving characters already + in the UART regsters. */ + uxErrorStatus = pdFAIL; + + /* Resync by waiting for the end of the current string. */ + while( cRxedChar != mainLAST_TX_CHAR ) + { + while( !xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, portMAX_DELAY ) ); + } + + /* The next expected character is the start of the string again. */ + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + if( cExpectedChar == mainLAST_TX_CHAR ) + { + /* We have reached the end of the string - we now expect to + receive the first character in the string again. The LED is + toggled to indicate that the entire string was received without + error. */ + vParTestToggleLED( mainCOMMS_RX_LED ); + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + /* We got the expected character, we now expect to receive the + next character in the string. */ + cExpectedChar++; + } + } + } +} +/*-----------------------------------------------------------*/ + +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +portTickType xDelayPeriod; +static unsigned long *pulRandomBytes = mainFIRST_PROGRAM_BYTES; + + /* Co-routine MUST start with a call to crSTART. */ + crSTART( xHandle ); + + for(;;) + { + /* Was the previously transmitted string received correctly? */ + if( uxErrorStatus != pdPASS ) + { + /* An error was encountered so set the error LED. */ + vSetErrorLED(); + } + + /* The next character to Tx is the first in the string. */ + cNextChar = mainFIRST_TX_CHAR; + + UARTIntDisable( UART0_BASE, UART_INT_TX ); + { + /* Send the first character. */ + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + + /* Move the variable to the char to Tx on so the ISR transmits + the next character in the string once this one has completed. */ + cNextChar++; + } + UARTIntEnable(UART0_BASE, UART_INT_TX); + + /* Toggle the LED to show a new string is being transmitted. */ + vParTestToggleLED( mainCOMMS_TX_LED ); + + /* Delay before we start the string off again. A pseudo-random delay + is used as this will provide a better test. */ + xDelayPeriod = xTaskGetTickCount() + ( *pulRandomBytes ); + + pulRandomBytes++; + if( pulRandomBytes > mainTOTAL_PROGRAM_MEMORY ) + { + pulRandomBytes = mainFIRST_PROGRAM_BYTES; + } + + /* Make sure we don't wait too long... */ + xDelayPeriod &= mainMAX_TX_DELAY; + + /* ...but we do want to wait. */ + if( xDelayPeriod < mainMIN_TX_DELAY ) + { + xDelayPeriod = mainMIN_TX_DELAY; + } + + /* Block for the random(ish) time. */ + crDELAY( xHandle, xDelayPeriod ); + } + + /* Co-routine MUST end with a call to crEND. */ + crEND(); +} +/*-----------------------------------------------------------*/ + +static void vSerialInit( void ) +{ + /* Enable the UART. GPIOA has already been initialised. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + /* Set GPIO A0 and A1 as peripheral function. They are used to output the + UART signals. */ + GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW ); + + /* Configure the UART for 8-N-1 operation. */ + UARTConfigSet( UART0_BASE, mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE ); + + /* We dont want to use the fifo. This is for test purposes to generate + as many interrupts as possible. */ + HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET; + + /* Enable both Rx and Tx interrupts. */ + HWREG( UART0_BASE + UART_O_IM ) |= ( UART_INT_TX | UART_INT_RX ); + IntEnable( INT_UART0 ); +} +/*-----------------------------------------------------------*/ + +void vUART_ISR(void) +{ +unsigned long ulStatus; +char cRxedChar; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* What caused the interrupt. */ + ulStatus = UARTIntStatus( UART0_BASE, pdTRUE ); + + /* Clear the interrupt. */ + UARTIntClear( UART0_BASE, ulStatus ); + + /* Was an Rx interrpt pending? */ + if( ulStatus & UART_INT_RX ) + { + if( ( HWREG(UART0_BASE + UART_O_FR ) & UART_FR_RXFF ) ) + { + /* Get the char from the buffer and post it onto the queue of + Rxed chars. Posting the character should wake the task that is + blocked on the queue waiting for characters. */ + cRxedChar = ( char ) HWREG( UART0_BASE + UART_O_DR ); + xQueueSendFromISR( xCommsQueue, &cRxedChar, &xHigherPriorityTaskWoken ); + } + } + + /* Was a Tx interrupt pending? */ + if( ulStatus & UART_INT_TX ) + { + /* Send the next character in the string. We are not using the FIFO. */ + if( cNextChar <= mainLAST_TX_CHAR ) + { + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + cNextChar++; + } + } + + /* If a task was woken by the character being received then we force + a context switch to occur in case the task is of higher priority than + the currently executing task (i.e. the task that this interrupt + interrupted.) */ + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + +static void prvPDCWrite( char cAddress, char cData ) +{ + vTaskSuspendAll(); + { + PDCWrite( cAddress, cData ); + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vSetErrorLED( void ) +{ + vParTestSetLED( mainCOMMS_FAIL_LED, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +__asm void prvSetAndCheckRegisters( void ) +{ + extern vSetErrorLED + + /* Fill the general purpose registers with known values. */ + mov r11, #10 + add r0, r11, #1 + add r1, r11, #2 + add r2, r11, #3 + add r3, r11, #4 + add r4, r11, #5 + add r5, r11, #6 + add r6, r11, #7 + add r7, r11, #8 + add r8, r11, #9 + add r9, r11, #10 + add r10, r11, #11 + add r12, r11, #12 + + /* Check the values are as expected. */ + cmp r11, #10 + bne set_error_led + cmp r0, #11 + bne set_error_led + cmp r1, #12 + bne set_error_led + cmp r2, #13 + bne set_error_led + cmp r3, #14 + bne set_error_led + cmp r4, #15 + bne set_error_led + cmp r5, #16 + bne set_error_led + cmp r6, #17 + bne set_error_led + cmp r7, #18 + bne set_error_led + cmp r8, #19 + bne set_error_led + cmp r9, #20 + bne set_error_led + cmp r10, #21 + bne set_error_led + cmp r12, #22 + bne set_error_led + bx lr + +set_error_led; + push {r14} + ldr r1, =vSetErrorLED + blx r1 + pop {r14} + bx lr; +} +/*-----------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/FreeRTOSConfig.h new file mode 100644 index 0000000..6f63637 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/FreeRTOSConfig.h @@ -0,0 +1,115 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 59 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1468 ) ) +#define configMAX_TASK_NAME_LEN ( 3 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 0 +#define INCLUDE_uxTaskPriorityGet 0 +#define INCLUDE_vTaskDelete 0 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelay 1 + +#define configKERNEL_INTERRUPT_PRIORITY 255 +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xa0, or priority 5. */ + + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/ParTest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/ParTest.c new file mode 100644 index 0000000..6c5d592 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/ParTest.c @@ -0,0 +1,145 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + + +#include "FreeRTOS.h" +#include "task.h" +#include "partest.h" + +#include "pdc.h" + +#define partstPINS (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 Z | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7) + +#define partstALL_OUTPUTS_OFF ( ( unsigned char ) 0x00 ) +#define partstMAX_OUTPUT_LED ( ( unsigned char ) 8 ) + +static volatile unsigned char ucOutputValue = partstALL_OUTPUTS_OFF; + +void vParTestInitialise( void ) +{ + PDCInit(); + PDCWrite( PDC_LED, ucOutputValue ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ +unsigned char ucBit = ( unsigned char ) 1; + + vTaskSuspendAll(); + { + if( uxLED < partstMAX_OUTPUT_LED ) + { + ucBit = ( ( unsigned char ) 1 ) << uxLED; + + if( xValue == pdFALSE ) + { + ucBit ^= ( unsigned char ) 0xff; + ucOutputValue &= ucBit; + } + else + { + ucOutputValue |= ucBit; + } + + PDCWrite( PDC_LED, ucOutputValue ); + } + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) +{ +unsigned char ucBit; + + vTaskSuspendAll(); + { + if( uxLED < partstMAX_OUTPUT_LED ) + { + ucBit = ( ( unsigned char ) 1 ) << uxLED; + + if( ucOutputValue & ucBit ) + { + ucOutputValue &= ~ucBit; + } + else + { + ucOutputValue |= ucBit; + } + + PDCWrite( PDC_LED, ucOutputValue ); + } + } + xTaskResumeAll(); +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/main.c new file mode 100644 index 0000000..7548d2d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/main.c @@ -0,0 +1,647 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This demo application creates six co-routines and two tasks (three including + * the idle task). The co-routines execute as part of the idle task hook. + * + * Five of the created co-routines are the standard 'co-routine flash' + * co-routines contained within the Demo/Common/Minimal/crflash.c file and + * documented on the FreeRTOS.org WEB site. + * + * The 'LCD Task' rotates a string on the LCD, delaying between each character + * as necessitated by the slow interface, and delaying between each string just + * long enough to enable the text to be read. + * + * The sixth co-routine and final task control the transmission and reception + * of a string to UART 0. The co-routine periodically sends the first + * character of the string to the UART, with the UART's TxEnd interrupt being + * used to transmit the remaining characters. The UART's RxEnd interrupt + * receives the characters and places them on a queue to be processed by the + * 'COMs Rx' task. An error is latched should an unexpected character be + * received, or any character be received out of sequence. + * + * A loopback connector is required to ensure that each character transmitted + * on the UART is also received on the same UART. For test purposes the UART + * FIFO's are not utalised in order to maximise the interrupt overhead. Also + * a pseudo random interval is used between the start of each transmission in + * order that the resultant interrupts are more randomly distributed and + * therefore more likely to highlight any problems. + * + * The flash co-routines control LED's zero to four. LED five is toggled each + * time the string is transmitted on the UART. LED six is toggled each time + * the string is CORRECTLY received on the UART. LED seven is latched on should + * an error be detected in any task or co-routine. + * + * In addition the idle task makes repetative calls to + * prvSetAndCheckRegisters(). This simply loads the general purpose registers + * with a known value, then checks each register to ensure the held value is + * still correct. As a low priority task this checking routine is likely to + * get repeatedly swapped in and out. A register being found to contain an + * incorrect value is therefore indicative of an error in the task switching + * mechansim. + * + */ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "croutine.h" + +/* Demo application include files. */ +#include "partest.h" +#include "crflash.h" + +/* Library include files. */ +#include "DriverLib.h" + +/* The time to delay between writing each character to the LCD. */ +#define mainCHAR_WRITE_DELAY ( 2 / portTICK_RATE_MS ) + +/* The time to delay between writing each string to the LCD. */ +#define mainSTRING_WRITE_DELAY ( 400 / portTICK_RATE_MS ) + +/* The number of flash co-routines to create. */ +#define mainNUM_FLASH_CO_ROUTINES ( 5 ) + +/* The length of the queue used to pass received characters to the Comms Rx +task. */ +#define mainRX_QUEUE_LEN ( 5 ) + +/* The priority of the co-routine used to initiate the transmission of the +string on UART 0. */ +#define mainTX_CO_ROUTINE_PRIORITY ( 1 ) + +/* Only one co-routine is created so its index is not important. */ +#define mainTX_CO_ROUTINE_INDEX ( 0 ) + +/* The time between transmissions of the string on UART 0. This is pseudo +random in order to generate a bit or randomness to when the interrupts occur.*/ +#define mainMIN_TX_DELAY ( 40 / portTICK_RATE_MS ) +#define mainMAX_TX_DELAY ( ( portTickType ) 0x7f ) +#define mainOFFSET_TIME ( ( portTickType ) 3 ) + +/* The time the Comms Rx task should wait to receive a character. This should +be slightly longer than the time between transmissions. If we do not receive +a character after this time then there must be an error in the transmission or +the timing of the transmission. */ +#define mainCOMMS_RX_DELAY ( mainMAX_TX_DELAY + 20 ) + +/* The task priorites. */ +#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainCOMMS_RX_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) + +/* The LED's toggled by the various tasks. */ +#define mainCOMMS_FAIL_LED ( 7 ) +#define mainCOMMS_RX_LED ( 6 ) +#define mainCOMMS_TX_LED ( 5 ) + +/* The baud rate used by the UART comms tasks/co-routine. */ +#define mainBAUD_RATE ( 57600 ) + +/* FIFO setting for the UART. The FIFO is not used to create a better test. */ +#define mainFIFO_SET ( 0x10 ) + +/* The string that is transmitted on the UART contains sequentially the +characters from mainFIRST_TX_CHAR to mainLAST_TX_CHAR. */ +#define mainFIRST_TX_CHAR '0' +#define mainLAST_TX_CHAR 'z' + +/* Just used to walk through the program memory in order that some random data +can be generated. */ +#define mainTOTAL_PROGRAM_MEMORY ( ( unsigned long * ) ( 8 * 1024 ) ) +#define mainFIRST_PROGRAM_BYTES ( ( unsigned long * ) 4 ) + +/* The error routine that is called if the driver library encounters an error. */ +#ifdef DEBUG +void +__error__(char *pcFilename, unsigned long ulLine) +{ +} +#endif + +/*-----------------------------------------------------------*/ + +/* + * The task that rotates text on the LCD. + */ +static void vLCDTask( void * pvParameters ); + +/* + * The task that receives the characters from UART 0. + */ +static void vCommsRxTask( void * pvParameters ); + +/* + * The co-routine that periodically initiates the transmission of the string on + * the UART. + */ +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* + * Writes a string the the LCD. + */ +static void prvWriteString( const char *pcString ); + +/* + * Initialisation routine for the UART. + */ +static void vSerialInit( void ); + +/* + * Thread safe write to the PDC. + */ +static void prvPDCWrite( char cAddress, char cData ); + +/* + * Function to simply set a known value into the general purpose registers + * then read them back to ensure they remain set correctly. An incorrect value + * being indicative of an error in the task switching mechanism. + */ +void prvSetAndCheckRegisters( void ); + +/* + * Latch the LED that indicates that an error has occurred. + */ +void vSetErrorLED( void ); + +/* + * Sets up the PLL and ports used by the demo. + */ +static void prvSetupHardware( void ); + +/*-----------------------------------------------------------*/ + +/* Error flag set to pdFAIL if an error is encountered in the tasks/co-routines +defined within this file. */ +unsigned portBASE_TYPE uxErrorStatus = pdPASS; + +/* The next character to transmit. */ +static char cNextChar; + +/* The queue used to transmit characters from the interrupt to the Comms Rx +task. */ +static xQueueHandle xCommsQueue; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + /* Create the queue used to communicate between the UART ISR and the Comms + Rx task. */ + xCommsQueue = xQueueCreate( mainRX_QUEUE_LEN, sizeof( char ) ); + + /* Setup the ports used by the demo and the clock. */ + prvSetupHardware(); + + /* Create the co-routines that flash the LED's. */ + vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES ); + + /* Create the co-routine that initiates the transmission of characters + on the UART. */ + xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX ); + + /* Create the LCD and Comms Rx tasks. */ + xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL ); + xTaskCreate( vCommsRxTask, "CMS", configMINIMAL_STACK_SIZE, NULL, mainCOMMS_RX_TASK_PRIORITY, NULL ); + + /* Start the scheduler running the tasks and co-routines just created. */ + vTaskStartScheduler(); + + /* Should not get here unless we did not have enough memory to start the + scheduler. */ + for( ;; ); + return 0; +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* Setup the PLL. */ + SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); + + /* Initialise the hardware used to talk to the LCD, LED's and UART. */ + PDCInit(); + vParTestInitialise(); + vSerialInit(); +} +/*-----------------------------------------------------------*/ + +void vApplicationIdleHook( void ) +{ + /* The co-routines are executed in the idle task using the idle task + hook. */ + for( ;; ) + { + /* Schedule the co-routines. */ + vCoRoutineSchedule(); + + /* Run the register check function between each co-routine. */ + prvSetAndCheckRegisters(); + } +} +/*-----------------------------------------------------------*/ + +static void prvWriteString( const char *pcString ) +{ + /* Write pcString to the LED, pausing between each character. */ + prvPDCWrite(PDC_LCD_CSR, LCD_CLEAR); + while( *pcString ) + { + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_RAM, *pcString ); + pcString++; + } +} +/*-----------------------------------------------------------*/ + +void vLCDTask( void * pvParameters ) +{ +unsigned portBASE_TYPE uxIndex; +const unsigned char ucCFGData[] = { + 0x30, /* Set data bus to 8-bits. */ + 0x30, + 0x30, + 0x3C, /* Number of lines/font. */ + 0x08, /* Display off. */ + 0x01, /* Display clear. */ + 0x06, /* Entry mode [cursor dir][shift]. */ + 0x0C /* Display on [display on][curson on][blinking on]. */ + }; + +/* The strings that are written to the LCD. */ +const char *pcStringsToDisplay[] = { + "Stellaris", + "Demo", + "One", + "www.FreeRTOS.org", + "" + }; + + /* Configure the LCD. */ + uxIndex = 0; + while( uxIndex < sizeof( ucCFGData ) ) + { + prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] ); + uxIndex++; + vTaskDelay( mainCHAR_WRITE_DELAY ); + } + + /* Turn the LCD Backlight on. */ + prvPDCWrite( PDC_CSR, 0x01 ); + + /* Clear display. */ + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR ); + + uxIndex = 0; + for( ;; ) + { + /* Display the string on the LCD. */ + prvWriteString( pcStringsToDisplay[ uxIndex ] ); + + /* Move on to the next string - wrapping if necessary. */ + uxIndex++; + if( *( pcStringsToDisplay[ uxIndex ] ) == 0x00 ) + { + uxIndex = 0; + /* Longer pause on the last string to be sent. */ + vTaskDelay( mainSTRING_WRITE_DELAY * 2 ); + } + + /* Wait until it is time to move onto the next string. */ + vTaskDelay( mainSTRING_WRITE_DELAY ); + } +} +/*-----------------------------------------------------------*/ + +static void vCommsRxTask( void * pvParameters ) +{ +static char cRxedChar, cExpectedChar; + + /* Set the char we expect to receive to the start of the string. */ + cExpectedChar = mainFIRST_TX_CHAR; + + for( ;; ) + { + /* Wait for a character to be received. */ + xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY ); + + /* Was the character recived (if any) the expected character. */ + if( cRxedChar != cExpectedChar ) + { + /* Got an unexpected character. This can sometimes occur when + reseting the system using the debugger leaving characters already + in the UART regsters. */ + uxErrorStatus = pdFAIL; + + /* Resync by waiting for the end of the current string. */ + while( cRxedChar != mainLAST_TX_CHAR ) + { + while( !xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, portMAX_DELAY ) ); + } + + /* The next expected character is the start of the string again. */ + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + if( cExpectedChar == mainLAST_TX_CHAR ) + { + /* We have reached the end of the string - we now expect to + receive the first character in the string again. The LED is + toggled to indicate that the entire string was received without + error. */ + vParTestToggleLED( mainCOMMS_RX_LED ); + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + /* We got the expected character, we now expect to receive the + next character in the string. */ + cExpectedChar++; + } + } + } +} +/*-----------------------------------------------------------*/ + +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +portTickType xDelayPeriod; +static unsigned long *pulRandomBytes = mainFIRST_PROGRAM_BYTES; + + /* Co-routine MUST start with a call to crSTART. */ + crSTART( xHandle ); + + for(;;) + { + /* Was the previously transmitted string received correctly? */ + if( uxErrorStatus != pdPASS ) + { + /* An error was encountered so set the error LED. */ + vSetErrorLED(); + } + + /* The next character to Tx is the first in the string. */ + cNextChar = mainFIRST_TX_CHAR; + + UARTIntDisable( UART0_BASE, UART_INT_TX ); + { + /* Send the first character. */ + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + + /* Move the variable to the char to Tx on so the ISR transmits + the next character in the string once this one has completed. */ + cNextChar++; + } + UARTIntEnable(UART0_BASE, UART_INT_TX); + + /* Toggle the LED to show a new string is being transmitted. */ + vParTestToggleLED( mainCOMMS_TX_LED ); + + /* Delay before we start the string off again. A pseudo-random delay + is used as this will provide a better test. */ + xDelayPeriod = xTaskGetTickCount() + ( *pulRandomBytes ); + + pulRandomBytes++; + if( pulRandomBytes > mainTOTAL_PROGRAM_MEMORY ) + { + pulRandomBytes = mainFIRST_PROGRAM_BYTES; + } + + /* Make sure we don't wait too long... */ + xDelayPeriod &= mainMAX_TX_DELAY; + + /* ...but we do want to wait. */ + if( xDelayPeriod < mainMIN_TX_DELAY ) + { + xDelayPeriod = mainMIN_TX_DELAY; + } + + /* Block for the random(ish) time. */ + crDELAY( xHandle, xDelayPeriod ); + } + + /* Co-routine MUST end with a call to crEND. */ + crEND(); +} +/*-----------------------------------------------------------*/ + +static void vSerialInit( void ) +{ + /* Enable the UART. GPIOA has already been initialised. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + /* Set GPIO A0 and A1 as peripheral function. They are used to output the + UART signals. */ + GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW ); + + /* Configure the UART for 8-N-1 operation. */ + UARTConfigSet( UART0_BASE, mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE ); + + /* We dont want to use the fifo. This is for test purposes to generate + as many interrupts as possible. */ + HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET; + + /* Enable both Rx and Tx interrupts. */ + HWREG( UART0_BASE + UART_O_IM ) |= ( UART_INT_TX | UART_INT_RX ); + IntEnable( INT_UART0 ); +} +/*-----------------------------------------------------------*/ + +void vUART_ISR(void) +{ +unsigned long ulStatus; +char cRxedChar; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* What caused the interrupt. */ + ulStatus = UARTIntStatus( UART0_BASE, pdTRUE ); + + /* Clear the interrupt. */ + UARTIntClear( UART0_BASE, ulStatus ); + + /* Was an Rx interrpt pending? */ + if( ulStatus & UART_INT_RX ) + { + if( ( HWREG(UART0_BASE + UART_O_FR ) & UART_FR_RXFF ) ) + { + /* Get the char from the buffer and post it onto the queue of + Rxed chars. Posting the character should wake the task that is + blocked on the queue waiting for characters. */ + cRxedChar = ( char ) HWREG( UART0_BASE + UART_O_DR ); + xQueueSendFromISR( xCommsQueue, &cRxedChar, &xHigherPriorityTaskWoken ); + } + } + + /* Was a Tx interrupt pending? */ + if( ulStatus & UART_INT_TX ) + { + /* Send the next character in the string. We are not using the FIFO. */ + if( cNextChar <= mainLAST_TX_CHAR ) + { + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + cNextChar++; + } + } + + /* If a task was woken by the character being received then we force + a context switch to occur in case the task is of higher priority than + the currently executing task (i.e. the task that this interrupt + interrupted.) */ + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + +static void prvPDCWrite( char cAddress, char cData ) +{ + vTaskSuspendAll(); + { + PDCWrite( cAddress, cData ); + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vSetErrorLED( void ) +{ + vParTestSetLED( mainCOMMS_FAIL_LED, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +void prvSetAndCheckRegisters( void ) +{ + /* Fill the general purpose registers with known values. */ + __asm volatile + ( + " mov r11, #10 \n" + " add r0, r11, #1 \n" + " add r1, r11, #2 \n" + " add r2, r11, #3 \n" + " add r3, r11, #4 \n" + " add r4, r11, #5 \n" + " add r5, r11, #6 \n" + " add r6, r11, #7 \n" + " add r7, r11, #8 \n" + " add r8, r11, #9 \n" + " add r9, r11, #10 \n" + " add r10, r11, #11 \n" + " add r12, r11, #12" + ); + + /* Check the values are as expected. */ + __asm volatile + ( + " cmp r11, #10 \n" + " bne set_error_led \n" + " cmp r0, #11 \n" + " bne set_error_led \n" + " cmp r1, #12 \n" + " bne set_error_led \n" + " cmp r2, #13 \n" + " bne set_error_led \n" + " cmp r3, #14 \n" + " bne set_error_led \n" + " cmp r4, #15 \n" + " bne set_error_led \n" + " cmp r5, #16 \n" + " bne set_error_led \n" + " cmp r6, #17 \n" + " bne set_error_led \n" + " cmp r7, #18 \n" + " bne set_error_led \n" + " cmp r8, #19 \n" + " bne set_error_led \n" + " cmp r9, #20 \n" + " bne set_error_led \n" + " cmp r10, #21 \n" + " bne set_error_led \n" + " cmp r12, #22 \n" + " bne set_error_led \n" + " bx lr" + ); + + __asm volatile + ( + "set_error_led: \n" + " push {r14} \n" + " ldr r1, vSetErrorLEDConst\n" + " blx r1 \n" + " pop {r14} \n" + " bx lr \n" + " \n" + " .align 2 \n" + "vSetErrorLEDConst: .word vSetErrorLED" + ); +} +/*-----------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/vectors.s b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/vectors.s new file mode 100644 index 0000000..900b2bb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo1/vectors.s @@ -0,0 +1,120 @@ +/***************************************************************************** + * Copyright (c) 2006 Rowley Associates Limited. * + * * + * This file may be distributed under the terms of the License Agreement * + * provided with this software. * + * * + * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE * + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * + *****************************************************************************/ + .section .vectors, "ax" + .code 16 + .align 0 + .global _vectors + + .extern xPortPendSVHandler + .extern xPortSysTickHandler + .extern vUART_ISR + .extern vPortSVCHandler + +.macro DEFAULT_ISR_HANDLER name= + .thumb_func + .weak \name +\name: +1: b 1b /* endless loop */ +.endm + +_vectors: + .word __stack_end__ +#ifdef STARTUP_FROM_RESET + .word _start +#else + .word reset_wait +#endif /* STARTUP_FROM_RESET */ + .word NmiISR + .word FaultISR + .word 0 // Populate if using MemManage (MPU) + .word 0 // Populate if using Bus fault + .word 0 // Populate if using Usage fault + .word 0 // Reserved + .word 0 // Reserved + .word 0 // Reserved + .word 0 // Reserved + .word vPortSVCHandler + .word 0 // Populate if using a debug monitor + .word 0 // Reserved + .word xPortPendSVHandler // Populate if using pendable service request + .word xPortSysTickHandler + // External interrupts start her + .word GPIO_Port_A_ISR + .word GPIO_Port_B_ISR + .word GPIO_Port_C_ISR + .word GPIO_Port_D_ISR + .word GPIO_Port_E_ISR + .word vUART_ISR + .word UART1_ISR + .word SSI_ISR + .word I2C_ISR + .word PWM_Fault_ISR + .word PWM_Generator_0_ISR + .word PWM_Generator_1_ISR + .word PWM_Generator_2_ISR + .word QEI_ISR + .word ADC_Sequence_0_ISR + .word ADC_Sequence_1_ISR + .word ADC_Sequence_2_ISR + .word ADC_Sequence_3_ISR + .word Watchdog_timer_ISR + .word Timer0a_ISR + .word Timer0b_ISR + .word Timer1a_ISR + .word Timer1b_ISR + .word Timer2a_ISR + .word Timer2b_ISR + .word Analog_Comparator_0_ISR + .word Analog_Comparator_1_ISR + .word Analog_Comparator_2_ISR + .word System_Control_ISR + .word FLASH_Control_ISR + + .section .init, "ax" + .thumb_func + +DEFAULT_ISR_HANDLER NmiISR +DEFAULT_ISR_HANDLER FaultISR +DEFAULT_ISR_HANDLER SVCallISR +DEFAULT_ISR_HANDLER SysTickISR +DEFAULT_ISR_HANDLER GPIO_Port_A_ISR +DEFAULT_ISR_HANDLER GPIO_Port_B_ISR +DEFAULT_ISR_HANDLER GPIO_Port_C_ISR +DEFAULT_ISR_HANDLER GPIO_Port_D_ISR +DEFAULT_ISR_HANDLER GPIO_Port_E_ISR +DEFAULT_ISR_HANDLER UART0_ISR +DEFAULT_ISR_HANDLER UART1_ISR +DEFAULT_ISR_HANDLER SSI_ISR +DEFAULT_ISR_HANDLER I2C_ISR +DEFAULT_ISR_HANDLER PWM_Fault_ISR +DEFAULT_ISR_HANDLER PWM_Generator_0_ISR +DEFAULT_ISR_HANDLER PWM_Generator_1_ISR +DEFAULT_ISR_HANDLER PWM_Generator_2_ISR +DEFAULT_ISR_HANDLER QEI_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_0_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_1_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_2_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_3_ISR +DEFAULT_ISR_HANDLER Watchdog_timer_ISR +DEFAULT_ISR_HANDLER Timer0a_ISR +DEFAULT_ISR_HANDLER Timer0b_ISR +DEFAULT_ISR_HANDLER Timer1a_ISR +DEFAULT_ISR_HANDLER Timer1b_ISR +DEFAULT_ISR_HANDLER Timer2a_ISR +DEFAULT_ISR_HANDLER Timer2b_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_0_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_1_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_2_ISR +DEFAULT_ISR_HANDLER System_Control_ISR +DEFAULT_ISR_HANDLER FLASH_Control_ISR + +#ifndef STARTUP_FROM_RESET +DEFAULT_ISR_HANDLER reset_wait +#endif /* STARTUP_FROM_RESET */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/FreeRTOSConfig.h new file mode 100644 index 0000000..0a79c09 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/FreeRTOSConfig.h @@ -0,0 +1,115 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 59 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1240 ) ) +#define configMAX_TASK_NAME_LEN ( 3 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 3 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 0 +#define INCLUDE_uxTaskPriorityGet 0 +#define INCLUDE_vTaskDelete 0 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelay 1 + + +#define configKERNEL_INTERRUPT_PRIORITY 255 +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xa0, or priority 5. */ + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/ParTest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/ParTest.c new file mode 100644 index 0000000..6c5d592 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/ParTest.c @@ -0,0 +1,145 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + + +#include "FreeRTOS.h" +#include "task.h" +#include "partest.h" + +#include "pdc.h" + +#define partstPINS (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 Z | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7) + +#define partstALL_OUTPUTS_OFF ( ( unsigned char ) 0x00 ) +#define partstMAX_OUTPUT_LED ( ( unsigned char ) 8 ) + +static volatile unsigned char ucOutputValue = partstALL_OUTPUTS_OFF; + +void vParTestInitialise( void ) +{ + PDCInit(); + PDCWrite( PDC_LED, ucOutputValue ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ +unsigned char ucBit = ( unsigned char ) 1; + + vTaskSuspendAll(); + { + if( uxLED < partstMAX_OUTPUT_LED ) + { + ucBit = ( ( unsigned char ) 1 ) << uxLED; + + if( xValue == pdFALSE ) + { + ucBit ^= ( unsigned char ) 0xff; + ucOutputValue &= ucBit; + } + else + { + ucOutputValue |= ucBit; + } + + PDCWrite( PDC_LED, ucOutputValue ); + } + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) +{ +unsigned char ucBit; + + vTaskSuspendAll(); + { + if( uxLED < partstMAX_OUTPUT_LED ) + { + ucBit = ( ( unsigned char ) 1 ) << uxLED; + + if( ucOutputValue & ucBit ) + { + ucOutputValue &= ~ucBit; + } + else + { + ucOutputValue |= ucBit; + } + + PDCWrite( PDC_LED, ucOutputValue ); + } + } + xTaskResumeAll(); +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/main.c new file mode 100644 index 0000000..ccc7876 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/main.c @@ -0,0 +1,655 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This demo application creates seven co-routines and one task (two including + * the idle task). The co-routines execute as part of the idle task hook. + * + * Five of the created co-routines are the standard 'co-routine flash' + * co-routines contained within the Demo/Common/Minimal/crflash.c file and + * documented on the FreeRTOS.org WEB site. + * + * The 'LCD Task' rotates a string on the LCD, delaying between each character + * as necessitated by the slow interface, and delaying between each string just + * long enough to enable the text to be read. + * + * The sixth co-routine controls the transmission of a string to UART 0. The + * co-routine periodically sends the first character of the string to the UART, + * with the UART's TxEnd interrupt being used to transmit the remaining + * characters. The UART's RxEnd interrupt receives the characters and places + * them on a queue to be processed by the seventh and final co-routine. An + * error is latched should an unexpected character be received, or any + * character be received out of sequence. + * + * A loopback connector is required to ensure that each character transmitted + * on the UART is also received on the same UART. For test purposes the UART + * FIFO's are not utalised in order to maximise the interrupt overhead. Also + * a pseudo random interval is used between the start of each transmission in + * order that the resultant interrupts are more randomly distributed and + * therefore more likely to highlight any problems. + * + * The flash co-routines control LED's zero to four. LED five is toggled each + * time the string is transmitted on the UART. LED six is toggled each time + * the string is CORRECTLY received on the UART. LED seven is latched on should + * an error be detected in any task or co-routine. + * + * In addition the idle task makes repetative calls to + * prvSetAndCheckRegisters(). This simply loads the general purpose registers + * with a known value, then checks each register to ensure the held value is + * still correct. As a low priority task this checking routine is likely to + * get repeatedly swapped in and out. A register being found to contain an + * incorrect value is therefore indicative of an error in the task switching + * mechansim. + * + */ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "croutine.h" + +/* Demo application include files. */ +#include "partest.h" +#include "crflash.h" + +/* Library include files. */ +#include "DriverLib.h" + +/* The time to delay between writing each character to the LCD. */ +#define mainCHAR_WRITE_DELAY ( 2 / portTICK_RATE_MS ) + +/* The time to delay between writing each string to the LCD. */ +#define mainSTRING_WRITE_DELAY ( 400 / portTICK_RATE_MS ) + +/* The number of flash co-routines to create. */ +#define mainNUM_FLASH_CO_ROUTINES ( 5 ) + +/* The length of the queue used to pass received characters to the Comms Rx +task. */ +#define mainRX_QUEUE_LEN ( 5 ) + +/* The priority of the co-routine used to initiate the transmission of the +string on UART 0. */ +#define mainTX_CO_ROUTINE_PRIORITY ( 1 ) + +/* The priority of the co-routine used to receive characters from the UART. */ +#define mainRX_CO_ROUTINE_PRIORITY ( 2 ) + +/* Only one co-routine is created so its index is not important. */ +#define mainTX_CO_ROUTINE_INDEX ( 0 ) +#define mainRX_CO_ROUTINE_INDEX ( 0 ) + +/* The time between transmissions of the string on UART 0. This is pseudo +random in order to generate a bit or randomness to when the interrupts occur.*/ +#define mainMIN_TX_DELAY ( 40 / portTICK_RATE_MS ) +#define mainMAX_TX_DELAY ( ( portTickType ) 0x7f ) +#define mainOFFSET_TIME ( ( portTickType ) 3 ) + +/* The time the Comms Rx task should wait to receive a character. This should +be slightly longer than the time between transmissions. If we do not receive +a character after this time then there must be an error in the transmission or +the timing of the transmission. */ +#define mainCOMMS_RX_DELAY ( mainMAX_TX_DELAY + 20 ) + +/* The task priorites. */ +#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainCOMMS_RX_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) + +/* The LED's toggled by the various tasks. */ +#define mainCOMMS_FAIL_LED ( 7 ) +#define mainCOMMS_RX_LED ( 6 ) +#define mainCOMMS_TX_LED ( 5 ) + +/* The baud rate used by the UART comms tasks/co-routine. */ +#define mainBAUD_RATE ( 57600 ) + +/* FIFO setting for the UART. The FIFO is not used to create a better test. */ +#define mainFIFO_SET ( 0x10 ) + +/* The string that is transmitted on the UART contains sequentially the +characters from mainFIRST_TX_CHAR to mainLAST_TX_CHAR. */ +#define mainFIRST_TX_CHAR '0' +#define mainLAST_TX_CHAR 'z' + +/* Just used to walk through the program memory in order that some random data +can be generated. */ +#define mainTOTAL_PROGRAM_MEMORY ( ( unsigned long * ) ( 8 * 1024 ) ) +#define mainFIRST_PROGRAM_BYTES ( ( unsigned long * ) 4 ) + +/* The error routine that is called if the driver library encounters an error. */ +#ifdef DEBUG +void +__error__(char *pcFilename, unsigned long ulLine) +{ +} +#endif + +/*-----------------------------------------------------------*/ + +/* + * The task that rotates text on the LCD. + */ +static void vLCDTask( void * pvParameters ); + +/* + * The task that receives the characters from UART 0. + */ +static void vCommsRxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* + * The co-routine that periodically initiates the transmission of the string on + * the UART. + */ +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* + * Writes a string the the LCD. + */ +static void prvWriteString( const char *pcString ); + +/* + * Initialisation routine for the UART. + */ +static void vSerialInit( void ); + +/* + * Thread safe write to the PDC. + */ +static void prvPDCWrite( char cAddress, char cData ); + +/* + * Function to simply set a known value into the general purpose registers + * then read them back to ensure they remain set correctly. An incorrect value + * being indicative of an error in the task switching mechanism. + */ +void prvSetAndCheckRegisters( void ); + +/* + * Latch the LED that indicates that an error has occurred. + */ +void vSetErrorLED( void ); + +/* + * Sets up the PLL and ports used by the demo. + */ +static void prvSetupHardware( void ); + +/*-----------------------------------------------------------*/ + +/* Error flag set to pdFAIL if an error is encountered in the tasks/co-routines +defined within this file. */ +unsigned portBASE_TYPE uxErrorStatus = pdPASS; + +/* The next character to transmit. */ +static char cNextChar; + +/* The queue used to transmit characters from the interrupt to the Comms Rx +task. */ +static xQueueHandle xCommsQueue; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + /* Create the queue used to communicate between the UART ISR and the Comms + Rx task. */ + xCommsQueue = xQueueCreate( mainRX_QUEUE_LEN, sizeof( char ) ); + + /* Setup the ports used by the demo and the clock. */ + prvSetupHardware(); + + /* Create the co-routines that flash the LED's. */ + vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES ); + + /* Create the co-routine that initiates the transmission of characters + on the UART. */ + xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX ); + + /* Create the co-routine that receives characters from the UART. */ + xCoRoutineCreate( vCommsRxCoRoutine, mainRX_CO_ROUTINE_PRIORITY, mainRX_CO_ROUTINE_INDEX ); + + /* Create the LCD task. */ + xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL ); + + /* Start the scheduler running the tasks and co-routines just created. */ + vTaskStartScheduler(); + + /* Should not get here unless we did not have enough memory to start the + scheduler. */ + for( ;; ); + return 0; +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* Setup the PLL. */ + SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); + + /* Initialise the hardware used to talk to the LCD, LED's and UART. */ + PDCInit(); + vParTestInitialise(); + vSerialInit(); +} +/*-----------------------------------------------------------*/ + +void vApplicationIdleHook( void ) +{ + /* The co-routines are executed in the idle task using the idle task + hook. */ + for( ;; ) + { + /* Schedule the co-routines. */ + vCoRoutineSchedule(); + + /* Run the register check function between each co-routine. */ + prvSetAndCheckRegisters(); + } +} +/*-----------------------------------------------------------*/ + +static void prvWriteString( const char *pcString ) +{ + /* Write pcString to the LED, pausing between each character. */ + prvPDCWrite(PDC_LCD_CSR, LCD_CLEAR); + while( *pcString ) + { + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_RAM, *pcString ); + pcString++; + } +} +/*-----------------------------------------------------------*/ + +void vLCDTask( void * pvParameters ) +{ +unsigned portBASE_TYPE uxIndex; +const unsigned char ucCFGData[] = { + 0x30, /* Set data bus to 8-bits. */ + 0x30, + 0x30, + 0x3C, /* Number of lines/font. */ + 0x08, /* Display off. */ + 0x01, /* Display clear. */ + 0x06, /* Entry mode [cursor dir][shift]. */ + 0x0C /* Display on [display on][curson on][blinking on]. */ + }; + +/* The strings that are written to the LCD. */ +const char *pcStringsToDisplay[] = { + "Stellaris", + "Demo", + "Two", + "www.FreeRTOS.org", + "" + }; + + /* Configure the LCD. */ + uxIndex = 0; + while( uxIndex < sizeof( ucCFGData ) ) + { + prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] ); + uxIndex++; + vTaskDelay( mainCHAR_WRITE_DELAY ); + } + + /* Turn the LCD Backlight on. */ + prvPDCWrite( PDC_CSR, 0x01 ); + + /* Clear display. */ + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR ); + + uxIndex = 0; + for( ;; ) + { + /* Display the string on the LCD. */ + prvWriteString( pcStringsToDisplay[ uxIndex ] ); + + /* Move on to the next string - wrapping if necessary. */ + uxIndex++; + if( *( pcStringsToDisplay[ uxIndex ] ) == 0x00 ) + { + uxIndex = 0; + /* Longer pause on the last string to be sent. */ + vTaskDelay( mainSTRING_WRITE_DELAY * 2 ); + } + + /* Wait until it is time to move onto the next string. */ + vTaskDelay( mainSTRING_WRITE_DELAY ); + } +} +/*-----------------------------------------------------------*/ + +static void vCommsRxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +static char cRxedChar, cExpectedChar = mainFIRST_TX_CHAR; +portBASE_TYPE xResult; + + crSTART( xHandle ); + + for( ;; ) + { + /* Wait for a character to be received. */ + crQUEUE_RECEIVE( xHandle, xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY, &xResult ); + + /* Was the character recived (if any) the expected character. */ + if( ( cRxedChar != cExpectedChar ) || ( xResult != pdPASS ) ) + { + /* Got an unexpected character. This can sometimes occur when + reseting the system using the debugger leaving characters already + in the UART regsters. */ + uxErrorStatus = pdFAIL; + + /* Resync by waiting for the end of the current string. */ + while( cRxedChar != mainLAST_TX_CHAR ) + { + crQUEUE_RECEIVE( xHandle, xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY, &xResult ); + } + + /* The next expected character is the start of the string again. */ + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + if( cExpectedChar == mainLAST_TX_CHAR ) + { + /* We have reached the end of the string - we now expect to + receive the first character in the string again. The LED is + toggled to indicate that the entire string was received without + error. */ + vParTestToggleLED( mainCOMMS_RX_LED ); + cExpectedChar = mainFIRST_TX_CHAR; + } + else + { + /* We got the expected character, we now expect to receive the + next character in the string. */ + cExpectedChar++; + } + } + } + + crEND(); +} +/*-----------------------------------------------------------*/ + +static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +portTickType xDelayPeriod; +static unsigned long *pulRandomBytes = mainFIRST_PROGRAM_BYTES; + + /* Co-routine MUST start with a call to crSTART. */ + crSTART( xHandle ); + + for(;;) + { + /* Was the previously transmitted string received correctly? */ + if( uxErrorStatus != pdPASS ) + { + /* An error was encountered so set the error LED. */ + vSetErrorLED(); + } + + /* The next character to Tx is the first in the string. */ + cNextChar = mainFIRST_TX_CHAR; + + UARTIntDisable( UART0_BASE, UART_INT_TX ); + { + /* Send the first character. */ + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + + /* Move the variable to the char to Tx on so the ISR transmits + the next character in the string once this one has completed. */ + cNextChar++; + } + UARTIntEnable(UART0_BASE, UART_INT_TX); + + /* Toggle the LED to show a new string is being transmitted. */ + vParTestToggleLED( mainCOMMS_TX_LED ); + + /* Delay before we start the string off again. A pseudo-random delay + is used as this will provide a better test. */ + xDelayPeriod = xTaskGetTickCount() + ( *pulRandomBytes ); + + pulRandomBytes++; + if( pulRandomBytes > mainTOTAL_PROGRAM_MEMORY ) + { + pulRandomBytes = mainFIRST_PROGRAM_BYTES; + } + + /* Make sure we don't wait too long... */ + xDelayPeriod &= mainMAX_TX_DELAY; + + /* ...but we do want to wait. */ + if( xDelayPeriod < mainMIN_TX_DELAY ) + { + xDelayPeriod = mainMIN_TX_DELAY; + } + + /* Block for the random(ish) time. */ + crDELAY( xHandle, xDelayPeriod ); + } + + /* Co-routine MUST end with a call to crEND. */ + crEND(); +} +/*-----------------------------------------------------------*/ + +static void vSerialInit( void ) +{ + /* Enable the UART. GPIOA has already been initialised. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + /* Set GPIO A0 and A1 as peripheral function. They are used to output the + UART signals. */ + GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW ); + + /* Configure the UART for 8-N-1 operation. */ + UARTConfigSet( UART0_BASE, mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE ); + + /* We dont want to use the fifo. This is for test purposes to generate + as many interrupts as possible. */ + HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET; + + /* Enable both Rx and Tx interrupts. */ + HWREG( UART0_BASE + UART_O_IM ) |= ( UART_INT_TX | UART_INT_RX ); + IntEnable( INT_UART0 ); +} +/*-----------------------------------------------------------*/ + +void vUART_ISR(void) +{ +unsigned long ulStatus; +char cRxedChar; +portBASE_TYPE xTaskWokenByPost = pdFALSE; + + /* What caused the interrupt. */ + ulStatus = UARTIntStatus( UART0_BASE, pdTRUE ); + + /* Clear the interrupt. */ + UARTIntClear( UART0_BASE, ulStatus ); + + /* Was an Rx interrpt pending? */ + if( ulStatus & UART_INT_RX ) + { + if( ( HWREG(UART0_BASE + UART_O_FR ) & UART_FR_RXFF ) ) + { + /* Get the char from the buffer and post it onto the queue of + Rxed chars. Posting the character should wake the task that is + blocked on the queue waiting for characters. */ + cRxedChar = ( char ) HWREG( UART0_BASE + UART_O_DR ); + xTaskWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsQueue, &cRxedChar, xTaskWokenByPost ); + } + } + + /* Was a Tx interrupt pending? */ + if( ulStatus & UART_INT_TX ) + { + /* Send the next character in the string. We are not using the FIFO. */ + if( cNextChar <= mainLAST_TX_CHAR ) + { + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + cNextChar++; + } + } + + if( xTaskWokenByPost ) + { + /* We are posting to a co-routine rather than a task so don't bother + causing a task switch. */ + } +} +/*-----------------------------------------------------------*/ + +static void prvPDCWrite( char cAddress, char cData ) +{ + vTaskSuspendAll(); + { + PDCWrite( cAddress, cData ); + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vSetErrorLED( void ) +{ + vParTestSetLED( mainCOMMS_FAIL_LED, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +void prvSetAndCheckRegisters( void ) +{ + /* Fill the general purpose registers with known values. */ + __asm volatile + ( + " mov r11, #10 \n" + " add r0, r11, #1 \n" + " add r1, r11, #2 \n" + " add r2, r11, #3 \n" + " add r3, r11, #4 \n" + " add r4, r11, #5 \n" + " add r5, r11, #6 \n" + " add r6, r11, #7 \n" + " add r7, r11, #8 \n" + " add r8, r11, #9 \n" + " add r9, r11, #10 \n" + " add r10, r11, #11 \n" + " add r12, r11, #12" + ); + + /* Check the values are as expected. */ + __asm volatile + ( + " cmp r11, #10 \n" + " bne set_error_led \n" + " cmp r0, #11 \n" + " bne set_error_led \n" + " cmp r1, #12 \n" + " bne set_error_led \n" + " cmp r2, #13 \n" + " bne set_error_led \n" + " cmp r3, #14 \n" + " bne set_error_led \n" + " cmp r4, #15 \n" + " bne set_error_led \n" + " cmp r5, #16 \n" + " bne set_error_led \n" + " cmp r6, #17 \n" + " bne set_error_led \n" + " cmp r7, #18 \n" + " bne set_error_led \n" + " cmp r8, #19 \n" + " bne set_error_led \n" + " cmp r9, #20 \n" + " bne set_error_led \n" + " cmp r10, #21 \n" + " bne set_error_led \n" + " cmp r12, #22 \n" + " bne set_error_led \n" + " bx lr" + ); + + __asm volatile + ( + "set_error_led: \n" + " push {r14} \n" + " ldr r1, vSetErrorLEDConst\n" + " blx r1 \n" + " pop {r14} \n" + " bx lr \n" + " \n" + " .align 2 \n" + "vSetErrorLEDConst: .word vSetErrorLED" + ); +} +/*-----------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/vectors.s b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/vectors.s new file mode 100644 index 0000000..900b2bb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo2/vectors.s @@ -0,0 +1,120 @@ +/***************************************************************************** + * Copyright (c) 2006 Rowley Associates Limited. * + * * + * This file may be distributed under the terms of the License Agreement * + * provided with this software. * + * * + * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE * + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * + *****************************************************************************/ + .section .vectors, "ax" + .code 16 + .align 0 + .global _vectors + + .extern xPortPendSVHandler + .extern xPortSysTickHandler + .extern vUART_ISR + .extern vPortSVCHandler + +.macro DEFAULT_ISR_HANDLER name= + .thumb_func + .weak \name +\name: +1: b 1b /* endless loop */ +.endm + +_vectors: + .word __stack_end__ +#ifdef STARTUP_FROM_RESET + .word _start +#else + .word reset_wait +#endif /* STARTUP_FROM_RESET */ + .word NmiISR + .word FaultISR + .word 0 // Populate if using MemManage (MPU) + .word 0 // Populate if using Bus fault + .word 0 // Populate if using Usage fault + .word 0 // Reserved + .word 0 // Reserved + .word 0 // Reserved + .word 0 // Reserved + .word vPortSVCHandler + .word 0 // Populate if using a debug monitor + .word 0 // Reserved + .word xPortPendSVHandler // Populate if using pendable service request + .word xPortSysTickHandler + // External interrupts start her + .word GPIO_Port_A_ISR + .word GPIO_Port_B_ISR + .word GPIO_Port_C_ISR + .word GPIO_Port_D_ISR + .word GPIO_Port_E_ISR + .word vUART_ISR + .word UART1_ISR + .word SSI_ISR + .word I2C_ISR + .word PWM_Fault_ISR + .word PWM_Generator_0_ISR + .word PWM_Generator_1_ISR + .word PWM_Generator_2_ISR + .word QEI_ISR + .word ADC_Sequence_0_ISR + .word ADC_Sequence_1_ISR + .word ADC_Sequence_2_ISR + .word ADC_Sequence_3_ISR + .word Watchdog_timer_ISR + .word Timer0a_ISR + .word Timer0b_ISR + .word Timer1a_ISR + .word Timer1b_ISR + .word Timer2a_ISR + .word Timer2b_ISR + .word Analog_Comparator_0_ISR + .word Analog_Comparator_1_ISR + .word Analog_Comparator_2_ISR + .word System_Control_ISR + .word FLASH_Control_ISR + + .section .init, "ax" + .thumb_func + +DEFAULT_ISR_HANDLER NmiISR +DEFAULT_ISR_HANDLER FaultISR +DEFAULT_ISR_HANDLER SVCallISR +DEFAULT_ISR_HANDLER SysTickISR +DEFAULT_ISR_HANDLER GPIO_Port_A_ISR +DEFAULT_ISR_HANDLER GPIO_Port_B_ISR +DEFAULT_ISR_HANDLER GPIO_Port_C_ISR +DEFAULT_ISR_HANDLER GPIO_Port_D_ISR +DEFAULT_ISR_HANDLER GPIO_Port_E_ISR +DEFAULT_ISR_HANDLER UART0_ISR +DEFAULT_ISR_HANDLER UART1_ISR +DEFAULT_ISR_HANDLER SSI_ISR +DEFAULT_ISR_HANDLER I2C_ISR +DEFAULT_ISR_HANDLER PWM_Fault_ISR +DEFAULT_ISR_HANDLER PWM_Generator_0_ISR +DEFAULT_ISR_HANDLER PWM_Generator_1_ISR +DEFAULT_ISR_HANDLER PWM_Generator_2_ISR +DEFAULT_ISR_HANDLER QEI_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_0_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_1_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_2_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_3_ISR +DEFAULT_ISR_HANDLER Watchdog_timer_ISR +DEFAULT_ISR_HANDLER Timer0a_ISR +DEFAULT_ISR_HANDLER Timer0b_ISR +DEFAULT_ISR_HANDLER Timer1a_ISR +DEFAULT_ISR_HANDLER Timer1b_ISR +DEFAULT_ISR_HANDLER Timer2a_ISR +DEFAULT_ISR_HANDLER Timer2b_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_0_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_1_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_2_ISR +DEFAULT_ISR_HANDLER System_Control_ISR +DEFAULT_ISR_HANDLER FLASH_Control_ISR + +#ifndef STARTUP_FROM_RESET +DEFAULT_ISR_HANDLER reset_wait +#endif /* STARTUP_FROM_RESET */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/FreeRTOSConfig.h new file mode 100644 index 0000000..fbe50d5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/FreeRTOSConfig.h @@ -0,0 +1,115 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 0 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 59 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1240 ) ) +#define configMAX_TASK_NAME_LEN ( 3 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 0 +#define INCLUDE_uxTaskPriorityGet 0 +#define INCLUDE_vTaskDelete 0 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelay 0 + +#define configKERNEL_INTERRUPT_PRIORITY 255 +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xa0, or priority 5. */ + + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/ParTest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/ParTest.c new file mode 100644 index 0000000..cbd4a22 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/ParTest.c @@ -0,0 +1,145 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + +/* Kernel include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "partest.h" + +/* Hardware specific include files. */ +#include "DriverLib.h" + +static const unsigned long ulLEDs[] = +{ + GPIO_PIN_6, GPIO_PIN_1, GPIO_PIN_0 +}; + +#define partstLED_PINS ( GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_6 ) + +#define partstMAX_OUTPUT_LED ( ( unsigned char ) 3 ) + +/*-----------------------------------------------------------*/ +void vParTestInitialise( void ) +{ +portBASE_TYPE xLED; + + /* The LED's are on port B. */ + GPIODirModeSet( GPIO_PORTB_BASE, partstLED_PINS, GPIO_DIR_MODE_OUT ); + + for( xLED = 0; xLED < partstMAX_OUTPUT_LED; xLED++ ) + { + vParTestSetLED( xLED, pdFALSE ); + } +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + vTaskSuspendAll(); + { + if( uxLED < partstMAX_OUTPUT_LED ) + { + if( xValue == pdFALSE ) + { + GPIOPinWrite( GPIO_PORTB_BASE, ulLEDs[ uxLED ], ulLEDs[ uxLED ] ); + } + else + { + GPIOPinWrite( GPIO_PORTB_BASE, ulLEDs[ uxLED ], ~ulLEDs[ uxLED ] ); + } + } + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) +{ +portBASE_TYPE xCurrentValue; + + vTaskSuspendAll(); + { + if( uxLED < partstMAX_OUTPUT_LED ) + { + xCurrentValue = GPIOPinRead( GPIO_PORTB_BASE, ulLEDs[ uxLED ] ); + if( xCurrentValue ) + { + GPIOPinWrite( GPIO_PORTB_BASE, ulLEDs[ uxLED ], ~ulLEDs[ uxLED ] ); + } + else + { + GPIOPinWrite( GPIO_PORTB_BASE, ulLEDs[ uxLED ], ulLEDs[ uxLED ] ); + } + } + } + xTaskResumeAll(); +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/main.c new file mode 100644 index 0000000..db9bc08 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/main.c @@ -0,0 +1,323 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * This is a mini co-routine demo for the Rowley CrossFire LM3S102 development + * board. It makes use of the boards tri-colour LED and analogue input. + * + * Four co-routines are created - an 'I2C' co-routine and three 'flash' + * co-routines. + * + * The I2C co-routine triggers an ADC conversion then blocks on a queue to + * wait for the conversion result - which it receives on the queue directly + * from the I2C interrupt service routine. The conversion result is then + * scalled to a delay period. The I2C interrupt then wakes each of the + * flash co-routines before itself delaying for the calculated period and + * then repeating the whole process. + * + * When woken by the I2C co-routine the flash co-routines each block for + * a given period, illuminate an LED for a fixed period, then go back to + * sleep to wait for the next cycle. The uxIndex parameter of the flash + * co-routines is used to ensure that each flashes a different LED, and that + * the delay periods are such that the LED's get flashed in sequence. + */ + + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "croutine.h" + +/* Demo application include files. */ +#include "partest.h" + +/* Library include files. */ +#include "DriverLib.h" + +/* States of the I2C master interface. */ +#define mainI2C_IDLE 0 +#define mainI2C_READ_1 1 +#define mainI2C_READ_2 2 +#define mainI2C_READ_DONE 3 + +#define mainZERO_LENGTH 0 + +/* Address of the A2D IC on the CrossFire board. */ +#define mainI2CAddress 0x4D + +/* The queue used to send data from the I2C ISR to the co-routine should never +contain more than one item as the same co-routine is used to trigger the I2C +activity. */ +#define mainQUEUE_LENGTH 1 + +/* The CrossFire board contains a tri-colour LED. */ +#define mainNUM_LEDs 3 + +/* The I2C co-routine has a higher priority than the flash co-routines. This +is not really necessary as when the I2C co-routine is active the other +co-routines are delaying. */ +#define mainI2c_CO_ROUTINE_PRIORITY 1 + + +/* The current state of the I2C master. */ +static volatile unsigned portBASE_TYPE uxState = mainI2C_IDLE; + +/* The delay period derived from the A2D value. */ +static volatile portBASE_TYPE uxDelay = 250; + +/* The queue used to communicate between the I2C interrupt and the I2C +co-routine. */ +static xQueueHandle xADCQueue; + +/* The queue used to synchronise the flash co-routines. */ +static xQueueHandle xDelayQueue; + +/* + * Sets up the PLL, I2C and GPIO used by the demo. + */ +static void prvSetupHardware( void ); + +/* The co-routines as described at the top of the file. */ +static void vI2CCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); +static void vFlashCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/*-----------------------------------------------------------*/ + +int main( void ) +{ +unsigned portBASE_TYPE uxCoRoutine; + + /* Setup all the hardware used by this demo. */ + prvSetupHardware(); + + /* Create the queue used to communicate between the ISR and I2C co-routine. + This can only ever contain one value. */ + xADCQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( portTickType ) ); + + /* Create the queue used to synchronise the flash co-routines. The queue + is used to trigger three tasks, but is for synchronisation only and does + not pass any data. It therefore has three position each of zero length. */ + xDelayQueue = xQueueCreate( mainNUM_LEDs, mainZERO_LENGTH ); + + /* Create the co-routine that initiates the i2c. */ + xCoRoutineCreate( vI2CCoRoutine, mainI2c_CO_ROUTINE_PRIORITY, 0 ); + + /* Create the flash co-routines. */ + for( uxCoRoutine = 0; uxCoRoutine < mainNUM_LEDs; uxCoRoutine++ ) + { + xCoRoutineCreate( vFlashCoRoutine, tskIDLE_PRIORITY, uxCoRoutine ); + } + + /* Start the scheduler. From this point on the co-routines should + execute. */ + vTaskStartScheduler(); + + /* Should not get here unless we did not have enough memory to start the + scheduler. */ + for( ;; ); + return 0; +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* Setup the PLL. */ + SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); + + /* Enable the I2C used to read the pot. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_I2C ); + SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOB ); + GPIOPinTypeI2C( GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3 ); + + /* Initialize the I2C master. */ + I2CMasterInit( I2C_MASTER_BASE, pdFALSE ); + + /* Enable the I2C master interrupt. */ + I2CMasterIntEnable( I2C_MASTER_BASE ); + IntEnable( INT_I2C ); + + /* Initialise the hardware used to talk to the LED's. */ + vParTestInitialise(); +} +/*-----------------------------------------------------------*/ + +static void vI2CCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +portTickType xADCResult; +static portBASE_TYPE xResult = 0, xMilliSecs, xLED; + + crSTART( xHandle ); + + for( ;; ) + { + /* Start the I2C off to read the ADC. */ + uxState = mainI2C_READ_1; + I2CMasterSlaveAddrSet( I2C_MASTER_BASE, mainI2CAddress, pdTRUE ); + I2CMasterControl( I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_RECEIVE_START ); + + /* Wait to receive the conversion result. */ + crQUEUE_RECEIVE( xHandle, xADCQueue, &xADCResult, portMAX_DELAY, &xResult ); + + /* Scale the result to give a useful range of values for a visual + demo. */ + xADCResult >>= 2; + xMilliSecs = xADCResult / portTICK_RATE_MS; + + /* The delay is split between the four co-routines so they remain in + synch. */ + uxDelay = xMilliSecs / ( mainNUM_LEDs + 1 ); + + /* Trigger each of the flash co-routines. */ + for( xLED = 0; xLED < mainNUM_LEDs; xLED++ ) + { + crQUEUE_SEND( xHandle, xDelayQueue, &xLED, 0, &xResult ); + } + + /* Wait for the full delay time then start again. This delay is long + enough to ensure the flash co-routines have done their thing and gone + back to sleep. */ + crDELAY( xHandle, xMilliSecs ); + } + + crEND(); +} +/*-----------------------------------------------------------*/ + +static void vFlashCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +portBASE_TYPE xResult, xNothing; + + crSTART( xHandle ); + + for( ;; ) + { + /* Wait for start of next round. */ + crQUEUE_RECEIVE( xHandle, xDelayQueue, &xNothing, portMAX_DELAY, &xResult ); + + /* Wait until it is this co-routines turn to flash. */ + crDELAY( xHandle, uxDelay * uxIndex ); + + /* Turn on the LED for a fixed period. */ + vParTestSetLED( uxIndex, pdTRUE ); + crDELAY( xHandle, uxDelay ); + vParTestSetLED( uxIndex, pdFALSE ); + + /* Go back and wait for the next round. */ + } + + crEND(); +} +/*-----------------------------------------------------------*/ + +void vI2C_ISR(void) +{ +static portTickType xReading; + + /* Clear the interrupt. */ + I2CMasterIntClear( I2C_MASTER_BASE ); + + /* Determine what to do based on the current uxState. */ + switch (uxState) + { + case mainI2C_IDLE: break; + + case mainI2C_READ_1: /* Read ADC result high byte. */ + xReading = I2CMasterDataGet( I2C_MASTER_BASE ); + xReading <<= 8; + + /* Continue the burst read. */ + I2CMasterControl( I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_RECEIVE_CONT ); + uxState = mainI2C_READ_2; + break; + + case mainI2C_READ_2: /* Read ADC result low byte. */ + xReading |= I2CMasterDataGet( I2C_MASTER_BASE ); + + /* Finish the burst read. */ + I2CMasterControl( I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_RECEIVE_FINISH ); + uxState = mainI2C_READ_DONE; + break; + + case mainI2C_READ_DONE: /* Complete. */ + I2CMasterDataGet( I2C_MASTER_BASE ); + uxState = mainI2C_IDLE; + + /* Send the result to the co-routine. */ + crQUEUE_SEND_FROM_ISR( xADCQueue, &xReading, pdFALSE ); + break; + } +} +/*-----------------------------------------------------------*/ + +void vApplicationIdleHook( void ) +{ + for( ;; ) + { + vCoRoutineSchedule(); + } +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/vectors.s b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/vectors.s new file mode 100644 index 0000000..2cc2608 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/Demo3/vectors.s @@ -0,0 +1,121 @@ +/***************************************************************************** + * Copyright (c) 2006 Rowley Associates Limited. * + * * + * This file may be distributed under the terms of the License Agreement * + * provided with this software. * + * * + * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE * + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * + *****************************************************************************/ + .section .vectors, "ax" + .code 16 + .align 0 + .global _vectors + + .extern xPortPendSVHandler + .extern xPortSysTickHandler + .extern vI2C_ISR + .extern faultisr + .extern vPortSVCHandler + +.macro DEFAULT_ISR_HANDLER name= + .thumb_func + .weak \name +\name: +1: b 1b /* endless loop */ +.endm + +_vectors: + .word __stack_end__ +#ifdef STARTUP_FROM_RESET + .word _start +#else + .word reset_wait +#endif /* STARTUP_FROM_RESET */ + .word NmiISR + .word FaultISR + .word 0 // Populate if using MemManage (MPU) + .word 0 // Populate if using Bus fault + .word 0 // Populate if using Usage fault + .word 0 // Reserved + .word 0 // Reserved + .word 0 // Reserved + .word 0 // Reserved + .word vPortSVCHandler + .word 0 // Populate if using a debug monitor + .word 0 // Reserved + .word xPortPendSVHandler // Populate if using pendable service request + .word xPortSysTickHandler + // External interrupts start her + .word GPIO_Port_A_ISR + .word GPIO_Port_B_ISR + .word GPIO_Port_C_ISR + .word GPIO_Port_D_ISR + .word GPIO_Port_E_ISR + .word UART0_ISR + .word UART1_ISR + .word SSI_ISR + .word vI2C_ISR + .word PWM_Fault_ISR + .word PWM_Generator_0_ISR + .word PWM_Generator_1_ISR + .word PWM_Generator_2_ISR + .word QEI_ISR + .word ADC_Sequence_0_ISR + .word ADC_Sequence_1_ISR + .word ADC_Sequence_2_ISR + .word ADC_Sequence_3_ISR + .word Watchdog_timer_ISR + .word Timer0a_ISR + .word Timer0b_ISR + .word Timer1a_ISR + .word Timer1b_ISR + .word Timer2a_ISR + .word Timer2b_ISR + .word Analog_Comparator_0_ISR + .word Analog_Comparator_1_ISR + .word Analog_Comparator_2_ISR + .word System_Control_ISR + .word FLASH_Control_ISR + + .section .init, "ax" + .thumb_func + +DEFAULT_ISR_HANDLER NmiISR +DEFAULT_ISR_HANDLER FaultISR +DEFAULT_ISR_HANDLER SVCallISR +DEFAULT_ISR_HANDLER SysTickISR +DEFAULT_ISR_HANDLER GPIO_Port_A_ISR +DEFAULT_ISR_HANDLER GPIO_Port_B_ISR +DEFAULT_ISR_HANDLER GPIO_Port_C_ISR +DEFAULT_ISR_HANDLER GPIO_Port_D_ISR +DEFAULT_ISR_HANDLER GPIO_Port_E_ISR +DEFAULT_ISR_HANDLER UART0_ISR +DEFAULT_ISR_HANDLER UART1_ISR +DEFAULT_ISR_HANDLER SSI_ISR +DEFAULT_ISR_HANDLER I2C_ISR +DEFAULT_ISR_HANDLER PWM_Fault_ISR +DEFAULT_ISR_HANDLER PWM_Generator_0_ISR +DEFAULT_ISR_HANDLER PWM_Generator_1_ISR +DEFAULT_ISR_HANDLER PWM_Generator_2_ISR +DEFAULT_ISR_HANDLER QEI_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_0_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_1_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_2_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_3_ISR +DEFAULT_ISR_HANDLER Watchdog_timer_ISR +DEFAULT_ISR_HANDLER Timer0a_ISR +DEFAULT_ISR_HANDLER Timer0b_ISR +DEFAULT_ISR_HANDLER Timer1a_ISR +DEFAULT_ISR_HANDLER Timer1b_ISR +DEFAULT_ISR_HANDLER Timer2a_ISR +DEFAULT_ISR_HANDLER Timer2b_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_0_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_1_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_2_ISR +DEFAULT_ISR_HANDLER System_Control_ISR +DEFAULT_ISR_HANDLER FLASH_Control_ISR + +#ifndef STARTUP_FROM_RESET +DEFAULT_ISR_HANDLER reset_wait +#endif /* STARTUP_FROM_RESET */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/RTOSDemo.hzp b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/RTOSDemo.hzp new file mode 100644 index 0000000..73075f6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/RTOSDemo.hzp @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/RTOSDemo.hzs b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/RTOSDemo.hzs new file mode 100644 index 0000000..26ef6e4 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/RTOSDemo.hzs @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/DriverLib.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/DriverLib.h new file mode 100644 index 0000000..3eb2ebc --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/DriverLib.h @@ -0,0 +1,20 @@ +#ifndef INCLUDE_DRIVER_LIB_H +#define INCLUDE_DRIVER_LIB_H + +#include "hw_ints.h" +#include "hw_uart.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "hw_nvic.h" +#include "hw_ssi.h" +#include "hw_i2c.h" + +#include "gpio.h" +#include "interrupt.h" +#include "sysctl.h" +#include "uart.h" +#include "ssi.h" +#include "pdc.h" +#include "i2c.h" + +#endif diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/EULA.txt b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/EULA.txt new file mode 100644 index 0000000..cba31f7 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/EULA.txt @@ -0,0 +1,126 @@ +IMPORTANT. Read the following LMI Software License Agreement ("Agreement") +completely. + +LUMINARY MICRO SOFTWARE LICENSE AGREEMENT + + This is a legal agreement between you (either as an individual or as an +authorized representative of your employer) and Luminary Micro, Inc. ("LMI"). +It concerns your rights to use this file and any accompanying written materials +(the "Software"). In consideration for LMI allowing you to access the +Software, you are agreeing to be bound by the terms of this Agreement. If you +do not agree to all of the terms of this Agreement, do not download or use the +Software. If you change your mind later, stop using the Software and delete +all copies of the Software in your possession or control. Any copies of the +Software that you have already distributed, where permitted, and do not destroy +will continue to be governed by this Agreement. Your prior use will also +continue to be governed by this Agreement. + +1. LICENSE GRANT. LMI grants to you, free of charge, the non-exclusive, +non-transferable right (1) to use the Software, (2) to reproduce the Software, +(3) to prepare derivative works of the Software, (4) to distribute the Software +and derivative works thereof in source (human-readable) form and object +(machine-readable) form, and (5) to sublicense to others the right to use the +distributed Software. If you violate any of the terms or restrictions of this +Agreement, LMI may immediately terminate this Agreement, and require that you +stop using and delete all copies of the Software in your possession or control. + +2. COPYRIGHT. The Software is licensed to you, not sold. LMI owns the +Software, and United States copyright laws and international treaty provisions +protect the Software. Therefore, you must treat the Software like any other +copyrighted material (e.g. a book or musical recording). You may not use or +copy the Software for any other purpose than what is described in this +Agreement. Except as expressly provided herein, LMI does not grant to you any +express or implied rights under any LMI or third-party patents, copyrights, +trademarks, or trade secrets. Additionally, you must reproduce and apply any +copyright or other proprietary rights notices included on or embedded in the +Software to any copies or derivative works made thereof, in whole or in part, +if any. + +3. SUPPORT. LMI is NOT obligated to provide any support, upgrades or new +releases of the Software. If you wish, you may contact LMI and report problems +and provide suggestions regarding the Software. LMI has no obligation +whatsoever to respond in any way to such a problem report or suggestion. LMI +may make changes to the Software at any time, without any obligation to notify +or provide updated versions of the Software to you. + +4. INDEMNITY. You agree to fully defend and indemnify LMI from any and +all claims, liabilities, and costs (including reasonable attorney’s fees) +related to (1) your use (including your sub-licensee’s use, if permitted) of +the Software or (2) your violation of the terms and conditions of this +Agreement. + +5. HIGH RISK ACTIVITIES. You acknowledge that the Software is not fault +tolerant and is not designed, manufactured or intended by LMI for incorporation +into products intended for use or resale in on-line control equipment in +hazardous, dangerous to life or potentially life-threatening environments +requiring fail-safe performance, such as in the operation of nuclear +facilities, aircraft navigation or communication systems, air traffic control, +direct life support machines or weapons systems, in which the failure of +products could lead directly to death, personal injury or severe physical or +environmental damage ("High Risk Activities"). You specifically represent and +warrant that you will not use the Software or any derivative work of the +Software for High Risk Activities. + +6. PRODUCT LABELING. You are not authorized to use any LMI trademarks, +brand names, or logos. + +7. COMPLIANCE WITH LAWS; EXPORT RESTRICTIONS. You must use the Software +in accordance with all applicable U.S. laws, regulations and statutes. You +agree that neither you nor your licensees (if any) intend to or will, directly +or indirectly, export or transmit the Software to any country in violation of +U.S. export restrictions. + +8. GOVERNMENT USE. Use of the Software and any corresponding +documentation, if any, is provided with RESTRICTED RIGHTS. Use, duplication or +disclosure by the Government is subject to restrictions as set forth in +subparagraph (c)(1)(ii) of The Rights in Technical Data and Computer Software +clause at DFARS 252.227-7013 or subparagraphs (c)(l) and (2) of the Commercial +Computer Software--Restricted Rights at 48 CFR 52.227-19, as applicable. +Manufacturer is Luminary Micro, Inc., 2499 S. Capital of Texas Hwy Ste A-100, +Austin, Texas 78746. + +9. DISCLAIMER OF WARRANTY. TO THE MAXIMUM EXTENT PERMITTED BY LAW, LMI +EXPRESSLY DISCLAIMS ANY WARRANTY FOR THE SOFTWARE. THE SOFTWARE IS PROVIDED +"AS IS", WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, +WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, OR NON-INFRINGEMENT. YOU ASSUME THE ENTIRE RISK ARISING +OUT OF THE USE OR PERFORMANCE OF THE SOFTWARE, OR ANY SYSTEMS YOU DESIGN USING +THE SOFTWARE (IF ANY). NOTHING IN THIS AGREEMENT MAY BE CONSTRUED AS A +WARRANTY OR REPRESENTATION BY LMI THAT THE SOFTWARE OR ANY DERIVATIVE WORK +DEVELOPED WITH OR INCORPORATING THE SOFTWARE WILL BE FREE FROM INFRINGEMENT OF +THE INTELLECTUAL PROPERTY RIGHTS OF THIRD PARTIES. + +10. LIMITATION OF LIABILITY. IN NO EVENT WILL LMI BE LIABLE, WHETHER IN +CONTRACT, TORT, OR OTHERWISE, FOR ANY INCIDENTAL, SPECIAL, INDIRECT, +CONSEQUENTIAL OR PUNITIVE DAMAGES, INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR +ANY LOSS OF USE, LOSS OF TIME, INCONVENIENCE, COMMERCIAL LOSS, OR LOST PROFITS, +SAVINGS, OR REVENUES TO THE FULL EXTENT SUCH MAY BE DISCLAIMED BY LAW. + +11. CHOICE OF LAW; VENUE; LIMITATIONS. You agree that the statutes and +laws of the United States and the State of Texas, USA, without regard to +conflicts of laws principles, will apply to all matters relating to this +Agreement or the Software, and you agree that any litigation will be subject to +the exclusive jurisdiction of the state or federal courts in Austin, Travis +County, Texas, USA. You agree that regardless of any statute or law to the +contrary, any claim or cause of action arising out of or related to this +Agreement or the Software must be filed within one (1) year after such claim or +cause of action arose or be forever barred. + +12. ENTIRE AGREEMENT. This Agreement constitutes the entire agreement +between you and LMI regarding the subject matter of this Agreement, and +supersedes all prior communications, negotiations, understandings, agreements +or representations, either written or oral, if any. This Agreement may only be +amended in written form, executed by you and LMI. + +13. SEVERABILITY. If any provision of this Agreement is held for any +reason to be invalid or unenforceable, then the remaining provisions of this +Agreement will be unimpaired and, unless a modification or replacement of the +invalid or unenforceable provision is further held to deprive you or LMI of a +material benefit, in which case the Agreement will immediately terminate, the +invalid or unenforceable provision will be replaced with a provision that is +valid and enforceable and that comes closest to the intention underlying the +invalid or unenforceable provision. + +14. NO WAIVER. The waiver by LMI of any breach of any provision of this +Agreement will not operate or be construed as a waiver of any other or a +subsequent breach of the same or a different provision. diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/comp.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/comp.h new file mode 100644 index 0000000..a4c307b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/comp.h @@ -0,0 +1,112 @@ +//***************************************************************************** +// +// comp.h - Prototypes for the analog comparator driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __COMP_H__ +#define __COMP_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ComparatorConfigure() as the ulConfig +// parameter. For each group (i.e. COMP_INT_xxx, COMP_ASRCP_xxx, etc.), one of +// the values may be selected and ORed together will values from the other +// groups. +// +//***************************************************************************** +#define COMP_INT_HIGH 0x00000010 // Interrupt when high +#define COMP_INT_LOW 0x00000000 // Interrupt when low +#define COMP_INT_FALL 0x00000004 // Interrupt on falling edge +#define COMP_INT_RISE 0x00000008 // Interrupt on rising edge +#define COMP_INT_BOTH 0x0000000C // Interrupt on both edges +#define COMP_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_OUTPUT_NONE 0x00000000 // No comparator output +#define COMP_OUTPUT_NORMAL 0x00000100 // Comparator output normal +#define COMP_OUTPUT_INVERT 0x00000102 // Comparator output inverted + +//***************************************************************************** +// +// Values that can be passed to ComparatorSetRef() as the ulRef parameter. +// +//***************************************************************************** +#define COMP_REF_OFF 0x00000000 // Turn off the internal reference +#define COMP_REF_0V 0x00000300 // Internal reference of 0V +#define COMP_REF_0_1375V 0x00000301 // Internal reference of 0.1375V +#define COMP_REF_0_275V 0x00000302 // Internal reference of 0.275V +#define COMP_REF_0_4125V 0x00000303 // Internal reference of 0.4125V +#define COMP_REF_0_55V 0x00000304 // Internal reference of 0.55V +#define COMP_REF_0_6875V 0x00000305 // Internal reference of 0.6875V +#define COMP_REF_0_825V 0x00000306 // Internal reference of 0.825V +#define COMP_REF_0_928125V 0x00000201 // Internal reference of 0.928125V +#define COMP_REF_0_9625V 0x00000307 // Internal reference of 0.9625V +#define COMP_REF_1_03125V 0x00000202 // Internal reference of 1.03125V +#define COMP_REF_1_134375V 0x00000203 // Internal reference of 1.134375V +#define COMP_REF_1_1V 0x00000308 // Internal reference of 1.1V +#define COMP_REF_1_2375V 0x00000309 // Internal reference of 1.2375V +#define COMP_REF_1_340625V 0x00000205 // Internal reference of 1.340625V +#define COMP_REF_1_375V 0x0000030A // Internal reference of 1.375V +#define COMP_REF_1_44375V 0x00000206 // Internal reference of 1.44375V +#define COMP_REF_1_5125V 0x0000030B // Internal reference of 1.5125V +#define COMP_REF_1_546875V 0x00000207 // Internal reference of 1.546875V +#define COMP_REF_1_65V 0x0000030C // Internal reference of 1.65V +#define COMP_REF_1_753125V 0x00000209 // Internal reference of 1.753125V +#define COMP_REF_1_7875V 0x0000030D // Internal reference of 1.7875V +#define COMP_REF_1_85625V 0x0000020A // Internal reference of 1.85625V +#define COMP_REF_1_925V 0x0000030E // Internal reference of 1.925V +#define COMP_REF_1_959375V 0x0000020B // Internal reference of 1.959375V +#define COMP_REF_2_0625V 0x0000030F // Internal reference of 2.0625V +#define COMP_REF_2_165625V 0x0000020D // Internal reference of 2.165625V +#define COMP_REF_2_26875V 0x0000020E // Internal reference of 2.26875V +#define COMP_REF_2_371875V 0x0000020F // Internal reference of 2.371875V + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ComparatorConfigure(unsigned long ulBase, unsigned long ulComp, + unsigned long ulConfig); +extern void ComparatorRefSet(unsigned long ulBase, unsigned long ulRef); +extern tBoolean ComparatorValueGet(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntRegister(unsigned long ulBase, unsigned long ulComp, + void (*pfnHandler)(void)); +extern void ComparatorIntUnregister(unsigned long ulBase, + unsigned long ulComp); +extern tBoolean ComparatorIntStatus(unsigned long ulBase, unsigned long ulComp, + tBoolean bMasked); +extern void ComparatorIntClear(unsigned long ulBase, unsigned long ulComp); + +#ifdef __cplusplus +} +#endif + +#endif // __COMP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/cpu.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/cpu.h new file mode 100644 index 0000000..a93771b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/cpu.h @@ -0,0 +1,40 @@ +//***************************************************************************** +// +// cpu.h - Prototypes for the CPU instruction wrapper functions. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __CPU_H__ +#define __CPU_H__ + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern void CPUcpsid(void); +extern void CPUcpsie(void); +extern void CPUwfi(void); + +#endif // __CPU_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/debug.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/debug.h new file mode 100644 index 0000000..2f259bd --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/debug.h @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// debug.h - Macros for assisting debug of the driver library. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +//***************************************************************************** +// +// Prototype for the function that is called when an invalid argument is passed +// to an API. This is only used when doing a DEBUG build. +// +//***************************************************************************** +extern void __error__(char *pcFilename, unsigned long ulLine); + +//***************************************************************************** +// +// The ASSERT macro, which does the actual assertion checking. Typically, this +// will be for procedure arguments. +// +//***************************************************************************** +#ifdef DEBUG +#define ASSERT(expr) { \ + if(!(expr)) \ + { \ + __error__(__FILE__, __LINE__); \ + } \ + } +#else +#define ASSERT(expr) +#endif + +#endif // __DEBUG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/flash.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/flash.h new file mode 100644 index 0000000..6332548 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/flash.h @@ -0,0 +1,75 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/gpio.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/gpio.h new file mode 100644 index 0000000..cdc9a5b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/gpio.h @@ -0,0 +1,135 @@ +//***************************************************************************** +// +// gpio.h - Defines and Macros for GPIO API. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following values define the bit field for the ucPins argument to several +// of the APIs. +// +//***************************************************************************** +#define GPIO_PIN_0 0x00000001 // GPIO pin 0 +#define GPIO_PIN_1 0x00000002 // GPIO pin 1 +#define GPIO_PIN_2 0x00000004 // GPIO pin 2 +#define GPIO_PIN_3 0x00000008 // GPIO pin 3 +#define GPIO_PIN_4 0x00000010 // GPIO pin 4 +#define GPIO_PIN_5 0x00000020 // GPIO pin 5 +#define GPIO_PIN_6 0x00000040 // GPIO pin 6 +#define GPIO_PIN_7 0x00000080 // GPIO pin 7 + +//***************************************************************************** +// +// Values that can be passed to GPIODirModeSet as the ulPinIO parameter, and +// returned from GPIODirModeGet. +// +//***************************************************************************** +#define GPIO_DIR_MODE_IN 0x00000000 // Pin is a GPIO input +#define GPIO_DIR_MODE_OUT 0x00000001 // Pin is a GPIO output +#define GPIO_DIR_MODE_HW 0x00000002 // Pin is a peripheral function + +//***************************************************************************** +// +// Values that can be passed to GPIOIntTypeSet as the ulIntType parameter, and +// returned from GPIOIntTypeGet. +// +//***************************************************************************** +#define GPIO_FALLING_EDGE 0x00000000 // Interrupt on falling edge +#define GPIO_RISING_EDGE 0x00000004 // Interrupt on rising edge +#define GPIO_BOTH_EDGES 0x00000001 // Interrupt on both edges +#define GPIO_LOW_LEVEL 0x00000002 // Interrupt on low level +#define GPIO_HIGH_LEVEL 0x00000007 // Interrupt on high level + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulStrength parameter, +// and returned by GPIOPadConfigGet in the *pulStrength parameter. +// +//***************************************************************************** +#define GPIO_STRENGTH_2MA 0x00000001 // 2mA drive strength +#define GPIO_STRENGTH_4MA 0x00000002 // 4mA drive strength +#define GPIO_STRENGTH_8MA 0x00000004 // 8mA drive strength +#define GPIO_STRENGTH_8MA_SC 0x0000000C // 8mA drive with slew rate control + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulPadType parameter, +// and returned by GPIOPadConfigGet in the *pulPadType parameter. +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x00000008 // Push-pull +#define GPIO_PIN_TYPE_STD_WPU 0x0000000A // Push-pull with weak pull-up +#define GPIO_PIN_TYPE_STD_WPD 0x0000000C // Push-pull with weak pull-down +#define GPIO_PIN_TYPE_OD 0x00000009 // Open-drain +#define GPIO_PIN_TYPE_OD_WPU 0x0000000B // Open-drain with weak pull-up +#define GPIO_PIN_TYPE_OD_WPD 0x0000000D // Open-drain with weak pull-down +#define GPIO_PIN_TYPE_ANALOG 0x00000000 // Analog comparator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO); +extern unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType); +extern unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, + unsigned long ulPadType); +extern void GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, + unsigned long *pulPadType); +extern void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins); +extern long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked); +extern void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPortIntRegister(unsigned long ulPort, + void (*pfIntHandler)(void)); +extern void GPIOPortIntUnregister(unsigned long ulPort); +extern long GPIOPinRead(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, + unsigned char ucVal); +extern void GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins); + +#ifdef __cplusplus +} +#endif + +#endif // __GPIO_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_comp.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_comp.h new file mode 100644 index 0000000..81fb0b0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_comp.h @@ -0,0 +1,113 @@ +//***************************************************************************** +// +// hw_comp.h - Macros used when accessing the comparator hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_COMP_H__ +#define __HW_COMP_H__ + +//***************************************************************************** +// +// The following define the offsets of the comparator registers. +// +//***************************************************************************** +#define COMP_O_MIS 0x00000000 // Interrupt status register +#define COMP_O_RIS 0x00000004 // Raw interrupt status register +#define COMP_O_INTEN 0x00000008 // Interrupt enable register +#define COMP_O_REFCTL 0x00000010 // Reference voltage control reg. +#define COMP_O_ACSTAT0 0x00000020 // Comp0 status register +#define COMP_O_ACCTL0 0x00000024 // Comp0 control register +#define COMP_O_ACSTAT1 0x00000040 // Comp1 status register +#define COMP_O_ACCTL1 0x00000044 // Comp1 control register + +//***************************************************************************** +// +// The following define the bit fields in the COMP_MIS, COMP_RIS, and +// COMP_INTEN registers. +// +//***************************************************************************** +#define COMP_INT_1 0x00000002 // Comp1 interrupt +#define COMP_INT_0 0x00000001 // Comp0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the COMP_REFCTL register. +// +//***************************************************************************** +#define COMP_REFCTL_EN 0x00000200 // Reference voltage enable +#define COMP_REFCTL_RNG 0x00000100 // Reference voltage range +#define COMP_REFCTL_VREF_MASK 0x0000000F // Reference voltage select mask +#define COMP_REFCTL_VREF_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACSTAT0 and COMP_ACSTAT1 +// registers. +// +//***************************************************************************** +#define COMP_ACSTAT_OVAL 0x00000002 // Comparator output value + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACCTL0 and COMP_ACCTL1 +// registers. +// +//***************************************************************************** +#define COMP_ACCTL_TMASK 0x00000800 // Trigger enable +#define COMP_ACCTL_ASRCP_MASK 0x00000600 // Vin+ source select mask +#define COMP_ACCTL_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ACCTL_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ACCTL_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_ACCTL_ASRCP_RES 0x00000600 // Reserved +#define COMP_ACCTL_OEN 0x00000100 // Comparator output enable +#define COMP_ACCTL_TSVAL 0x00000080 // Trigger polarity select +#define COMP_ACCTL_TSEN_MASK 0x00000060 // Trigger sense mask +#define COMP_ACCTL_TSEN_LEVEL 0x00000000 // Trigger is level sense +#define COMP_ACCTL_TSEN_FALL 0x00000020 // Trigger is falling edge +#define COMP_ACCTL_TSEN_RISE 0x00000040 // Trigger is rising edge +#define COMP_ACCTL_TSEN_BOTH 0x00000060 // Trigger is both edges +#define COMP_ACCTL_ISLVAL 0x00000010 // Interrupt polarity select +#define COMP_ACCTL_ISEN_MASK 0x0000000C // Interrupt sense mask +#define COMP_ACCTL_ISEN_LEVEL 0x00000000 // Interrupt is level sense +#define COMP_ACCTL_ISEN_FALL 0x00000004 // Interrupt is falling edge +#define COMP_ACCTL_ISEN_RISE 0x00000008 // Interrupt is rising edge +#define COMP_ACCTL_ISEN_BOTH 0x0000000C // Interrupt is both edges +#define COMP_ACCTL_CINV 0x00000002 // Comparator output invert + +//***************************************************************************** +// +// The following define the reset values for the comparator registers. +// +//***************************************************************************** +#define COMP_RV_MIS 0x00000000 // Interrupt status register +#define COMP_RV_RIS 0x00000000 // Raw interrupt status register +#define COMP_RV_INTEN 0x00000000 // Interrupt enable register +#define COMP_RV_REFCTL 0x00000000 // Reference voltage control reg. +#define COMP_RV_ACSTAT0 0x00000000 // Comp0 status register +#define COMP_RV_ACCTL0 0x00000000 // Comp0 control register +#define COMP_RV_ACSTAT1 0x00000000 // Comp1 status register +#define COMP_RV_ACCTL1 0x00000000 // Comp1 control register + +#endif // __HW_COMP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_flash.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_flash.h new file mode 100644 index 0000000..8dd755c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_flash.h @@ -0,0 +1,141 @@ +//***************************************************************************** +// +// hw_flash.h - Macros used when accessing the flash controller. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_FLASH_H__ +#define __HW_FLASH_H__ + +//***************************************************************************** +// +// The following define the offsets of the FLASH registers. +// +//***************************************************************************** +#define FLASH_FMA 0x400FD000 // Memory address register +#define FLASH_FMD 0x400FD004 // Memory data register +#define FLASH_FMC 0x400FD008 // Memory control register +#define FLASH_FCRIS 0x400FD00c // Raw interrupt status register +#define FLASH_FCIM 0x400FD010 // Interrupt mask register +#define FLASH_FCMISC 0x400FD014 // Interrupt status register +#define FLASH_FMPRE 0x400FE130 // FLASH read protect register +#define FLASH_FMPPE 0x400FE134 // FLASH program protect register +#define FLASH_USECRL 0x400FE140 // uSec reload register + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMC register. +// +//***************************************************************************** +#define FLASH_FMC_WRKEY_MASK 0xFFFF0000 // FLASH write key mask +#define FLASH_FMC_WRKEY 0xA4420000 // FLASH write key +#define FLASH_FMC_REG_MASK 0x00000F00 // Register select mask +#define FLASH_FMC_REG_UDFP 0x00000000 // Select FLASH protection register +#define FLASH_FMC_COMT 0x00000008 // Commit user register +#define FLASH_FMC_MERASE 0x00000004 // Mass erase FLASH +#define FLASH_FMC_ERASE 0x00000002 // Erase FLASH page +#define FLASH_FMC_WRITE 0x00000001 // Write FLASH word + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCRIS register. +// +//***************************************************************************** +#define FLASH_FCRIS_PROGRAM 0x00000002 // Programming status +#define FLASH_FCRIS_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCIM register. +// +//***************************************************************************** +#define FLASH_FCIM_PROGRAM 0x00000002 // Programming mask +#define FLASH_FCIM_ACCESS 0x00000001 // Invalid access mask + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMIS register. +// +//***************************************************************************** +#define FLASH_FCMISC_PROGRAM 0x00000002 // Programming status +#define FLASH_FCMISC_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMPRE and FLASH_FMPPE +// registers. +// +//***************************************************************************** +#define FLASH_FMP_BLOCK_31 0x80000000 // Enable for block 31 +#define FLASH_FMP_BLOCK_30 0x40000000 // Enable for block 30 +#define FLASH_FMP_BLOCK_29 0x20000000 // Enable for block 29 +#define FLASH_FMP_BLOCK_28 0x10000000 // Enable for block 28 +#define FLASH_FMP_BLOCK_27 0x08000000 // Enable for block 27 +#define FLASH_FMP_BLOCK_26 0x04000000 // Enable for block 26 +#define FLASH_FMP_BLOCK_25 0x02000000 // Enable for block 25 +#define FLASH_FMP_BLOCK_24 0x01000000 // Enable for block 24 +#define FLASH_FMP_BLOCK_23 0x00800000 // Enable for block 23 +#define FLASH_FMP_BLOCK_22 0x00400000 // Enable for block 22 +#define FLASH_FMP_BLOCK_21 0x00200000 // Enable for block 21 +#define FLASH_FMP_BLOCK_20 0x00100000 // Enable for block 20 +#define FLASH_FMP_BLOCK_19 0x00080000 // Enable for block 19 +#define FLASH_FMP_BLOCK_18 0x00040000 // Enable for block 18 +#define FLASH_FMP_BLOCK_17 0x00020000 // Enable for block 17 +#define FLASH_FMP_BLOCK_16 0x00010000 // Enable for block 16 +#define FLASH_FMP_BLOCK_15 0x00008000 // Enable for block 15 +#define FLASH_FMP_BLOCK_14 0x00004000 // Enable for block 14 +#define FLASH_FMP_BLOCK_13 0x00002000 // Enable for block 13 +#define FLASH_FMP_BLOCK_12 0x00001000 // Enable for block 12 +#define FLASH_FMP_BLOCK_11 0x00000800 // Enable for block 11 +#define FLASH_FMP_BLOCK_10 0x00000400 // Enable for block 10 +#define FLASH_FMP_BLOCK_9 0x00000200 // Enable for block 9 +#define FLASH_FMP_BLOCK_8 0x00000100 // Enable for block 8 +#define FLASH_FMP_BLOCK_7 0x00000080 // Enable for block 7 +#define FLASH_FMP_BLOCK_6 0x00000040 // Enable for block 6 +#define FLASH_FMP_BLOCK_5 0x00000020 // Enable for block 5 +#define FLASH_FMP_BLOCK_4 0x00000010 // Enable for block 4 +#define FLASH_FMP_BLOCK_3 0x00000008 // Enable for block 3 +#define FLASH_FMP_BLOCK_2 0x00000004 // Enable for block 2 +#define FLASH_FMP_BLOCK_1 0x00000002 // Enable for block 1 +#define FLASH_FMP_BLOCK_0 0x00000001 // Enable for block 0 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_USECRL register. +// +//***************************************************************************** +#define FLASH_USECRL_MASK 0x000000FF // Clock per uSec +#define FLASH_USECRL_SHIFT 0 + +//***************************************************************************** +// +// The erase size is the size of the FLASH block that is erased by an erase +// operation, and the protect size is the size of the FLASH block that is +// protected by each protection register. +// +//***************************************************************************** +#define FLASH_ERASE_SIZE 0x00000400 +#define FLASH_PROTECT_SIZE 0x00000800 + +#endif // __HW_FLASH_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_gpio.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_gpio.h new file mode 100644 index 0000000..ddba2fd --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_gpio.h @@ -0,0 +1,95 @@ +//***************************************************************************** +// +// hw_gpio.h - Defines and Macros for GPIO hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_GPIO_H__ +#define __HW_GPIO_H__ + +//***************************************************************************** +// +// GPIO Register Offsets. +// +//***************************************************************************** +#define GPIO_O_DATA 0x00000000 // Data register. +#define GPIO_O_DIR 0x00000400 // Data direction register. +#define GPIO_O_IS 0x00000404 // Interrupt sense register. +#define GPIO_O_IBE 0x00000408 // Interrupt both edges register. +#define GPIO_O_IEV 0x0000040C // Intterupt event register. +#define GPIO_O_IM 0x00000410 // Interrupt mask register. +#define GPIO_O_RIS 0x00000414 // Raw interrupt status register. +#define GPIO_O_MIS 0x00000418 // Masked interrupt status reg. +#define GPIO_O_ICR 0x0000041C // Interrupt clear register. +#define GPIO_O_AFSEL 0x00000420 // Mode control select register. +#define GPIO_O_DR2R 0x00000500 // 2ma drive select register. +#define GPIO_O_DR4R 0x00000504 // 4ma drive select register. +#define GPIO_O_DR8R 0x00000508 // 8ma drive select register. +#define GPIO_O_ODR 0x0000050C // Open drain select register. +#define GPIO_O_PUR 0x00000510 // Pull up select register. +#define GPIO_O_PDR 0x00000514 // Pull down select register. +#define GPIO_O_SLR 0x00000518 // Slew rate control enable reg. +#define GPIO_O_DEN 0x0000051C // Digital input enable register. +#define GPIO_O_PeriphID0 0x00000FE0 // +#define GPIO_O_PeriphID1 0x00000FE4 // +#define GPIO_O_PeriphID2 0x00000FE8 // +#define GPIO_O_PeriphID3 0x00000FEC // +#define GPIO_O_PCellID0 0x00000FF0 // +#define GPIO_O_PCellID1 0x00000FF4 // +#define GPIO_O_PCellID2 0x00000FF8 // +#define GPIO_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// GPIO Register reset values. +// +//***************************************************************************** +#define GPIO_RV_DATA 0x00000000 // Data register reset value. +#define GPIO_RV_DIR 0x00000000 // Data direction reg RV. +#define GPIO_RV_IS 0x00000000 // Interrupt sense reg RV. +#define GPIO_RV_IBE 0x00000000 // Interrupt both edges reg RV. +#define GPIO_RV_IEV 0x00000000 // Intterupt event reg RV. +#define GPIO_RV_IM 0x00000000 // Interrupt mask reg RV. +#define GPIO_RV_RIS 0x00000000 // Raw interrupt status reg RV. +#define GPIO_RV_MIS 0x00000000 // Masked interrupt status reg RV. +#define GPIO_RV_IC 0x00000000 // Interrupt clear reg RV. +#define GPIO_RV_AFSEL 0x00000000 // Mode control select reg RV. +#define GPIO_RV_DR2R 0x000000FF // 2ma drive select reg RV. +#define GPIO_RV_DR4R 0x00000000 // 4ma drive select reg RV. +#define GPIO_RV_DR8R 0x00000000 // 8ma drive select reg RV. +#define GPIO_RV_ODR 0x00000000 // Open drain select reg RV. +#define GPIO_RV_PUR 0x000000FF // Pull up select reg RV. +#define GPIO_RV_PDR 0x00000000 // Pull down select reg RV. +#define GPIO_RV_SLR 0x00000000 // Slew rate control enable reg RV. +#define GPIO_RV_DEN 0x000000FF // Digital input enable reg RV. +#define GPIO_RV_PeriphID0 0x00000061 // +#define GPIO_RV_PeriphID1 0x00000010 // +#define GPIO_RV_PeriphID2 0x00000004 // +#define GPIO_RV_PeriphID3 0x00000000 // +#define GPIO_RV_PCellID0 0x0000000D // +#define GPIO_RV_PCellID1 0x000000F0 // +#define GPIO_RV_PCellID2 0x00000005 // +#define GPIO_RV_PCellID3 0x000000B1 // + +#endif // __HW_GPIO_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_i2c.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_i2c.h new file mode 100644 index 0000000..3e2e9ee --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_i2c.h @@ -0,0 +1,157 @@ +//***************************************************************************** +// +// hw_i2c.h - Macros used when accessing the I2C master and slave hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_I2C_H__ +#define __HW_I2C_H__ + +//***************************************************************************** +// +// The following define the offsets of the I2C master registers. +// +//***************************************************************************** +#define I2C_MASTER_O_SA 0x00000000 // Slave address register +#define I2C_MASTER_O_CS 0x00000004 // Control and Status register +#define I2C_MASTER_O_DR 0x00000008 // Data register +#define I2C_MASTER_O_TPR 0x0000000C // Timer period register +#define I2C_MASTER_O_IMR 0x00000010 // Interrupt mask register +#define I2C_MASTER_O_RIS 0x00000014 // Raw interrupt status register +#define I2C_MASTER_O_MIS 0x00000018 // Masked interrupt status reg +#define I2C_MASTER_O_ICR 0x0000001c // Interrupt clear register +#define I2C_MASTER_O_CR 0x00000020 // Configuration register + +//***************************************************************************** +// +// The following define the offsets of the I2C slave registers. +// +//***************************************************************************** +#define I2C_SLAVE_O_OAR 0x00000000 // Own address register +#define I2C_SLAVE_O_CSR 0x00000004 // Control/Status register +#define I2C_SLAVE_O_DR 0x00000008 // Data register +#define I2C_SLAVE_O_IM 0x0000000C // Interrupt mask register +#define I2C_SLAVE_O_RIS 0x00000010 // Raw interrupt status register +#define I2C_SLAVE_O_MIS 0x00000014 // Masked interrupt status reg +#define I2C_SLAVE_O_ICR 0x00000018 // Interrupt clear register + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Control and Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_CS_ACK 0x00000008 // Acknowlegde +#define I2C_MASTER_CS_STOP 0x00000004 // Stop +#define I2C_MASTER_CS_START 0x00000002 // Start +#define I2C_MASTER_CS_RUN 0x00000001 // Run +#define I2C_MASTER_CS_BUS_BUSY 0x00000040 // Bus busy +#define I2C_MASTER_CS_IDLE 0x00000020 // Idle +#define I2C_MASTER_CS_ARB_LOST 0x00000010 // Lost arbitration +#define I2C_MASTER_CS_DATA_ACK 0x00000008 // Data byte not acknowledged +#define I2C_MASTER_CS_ADDR_ACK 0x00000004 // Address byte not acknowledged +#define I2C_MASTER_CS_ERROR 0x00000002 // Error occurred +#define I2C_MASTER_CS_BUSY 0x00000001 // Controller is TX/RX data +#define I2C_MASTER_CS_ERR_MASK 0x0000001C + +//***************************************************************************** +// +// The following define values used in determining the contents of the I2C +// Master Timer Period register. +// +//***************************************************************************** +#define I2C_MASTER_TPR_SCL_HP 0x00000004 // SCL high period +#define I2C_MASTER_TPR_SCL_LP 0x00000006 // SCL low period +#define I2C_SCL_STANDARD 100000 // SCL standard frequency +#define I2C_SCL_FAST 400000 // SCL fast frequency + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_MASTER_IMR_IM 0x00000001 // Master interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_RIS_RIS 0x00000001 // Master raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_MASTER_MIS_MIS 0x00000001 // Master masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Configuration +// register. +// +//***************************************************************************** +#define I2C_MASTER_CR_SFE 0x00000020 // Slave function enable +#define I2C_MASTER_CR_MFE 0x00000010 // Master function enable +#define I2C_MASTER_CR_LPBK 0x00000001 // Loopback enable + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Control/Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_CSR_DA 0x00000001 // Enable the device +#define I2C_SLAVE_CSR_TREQ 0x00000002 // Transmit request received +#define I2C_SLAVE_CSR_RREQ 0x00000001 // Receive data from I2C master + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_SLAVE_IMR_IM 0x00000001 // Slave interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_RIS_RIS 0x00000001 // Slave raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_SLAVE_MIS_MIS 0x00000001 // Master masked interrupt status + +#endif // __HW_I2C_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_ints.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_ints.h new file mode 100644 index 0000000..d32cec4 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_ints.h @@ -0,0 +1,82 @@ +//***************************************************************************** +// +// hw_ints.h - Macros that define the interrupt assignment on Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_INTS_H__ +#define __HW_INTS_H__ + +//***************************************************************************** +// +// The following define the fault assignments. +// +//***************************************************************************** +#define FAULT_NMI 2 // NMI fault +#define FAULT_HARD 3 // Hard fault +#define FAULT_MPU 4 // MPU fault +#define FAULT_BUS 5 // Bus fault +#define FAULT_USAGE 6 // Usage fault +#define FAULT_SVCALL 11 // SVCall +#define FAULT_DEBUG 12 // Debug monitor +#define FAULT_PENDSV 14 // PendSV +#define FAULT_SYSTICK 15 // System Tick + +//***************************************************************************** +// +// The following define the interrupt assignments. +// +//***************************************************************************** +#define INT_GPIOA 16 // GPIO Port A +#define INT_GPIOB 17 // GPIO Port B +#define INT_GPIOC 18 // GPIO Port C +#define INT_UART0 21 // UART0 Rx and Tx +#define INT_SSI 23 // SSI Rx and Tx +#define INT_I2C 24 // I2C Master and Slave +#define INT_WATCHDOG 34 // Watchdog timer +#define INT_TIMER0A 35 // Timer 0 subtimer A +#define INT_TIMER0B 36 // Timer 0 subtimer B +#define INT_TIMER1A 37 // Timer 1 subtimer A +#define INT_TIMER1B 38 // Timer 1 subtimer B +#define INT_COMP0 41 // Analog Comparator 0 +#define INT_COMP1 42 // Analog Comparator 1 +#define INT_SYSCTL 44 // System Control (PLL, OSC, BO) +#define INT_FLASH 45 // FLASH Control + +//***************************************************************************** +// +// The total number of interrupts. +// +//***************************************************************************** +#define NUM_INTERRUPTS 46 + +//***************************************************************************** +// +// The total number of priority levels. +// +//***************************************************************************** +#define NUM_PRIORITY 8 +#define NUM_PRIORITY_BITS 3 + +#endif // __HW_INTS_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_memmap.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_memmap.h new file mode 100644 index 0000000..bef5dc6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_memmap.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// hw_memmap.h - Macros defining the memory map of Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_MEMMAP_H__ +#define __HW_MEMMAP_H__ + +//***************************************************************************** +// +// The following define the base address of the memories and peripherals. +// +//***************************************************************************** +#define FLASH_BASE 0x00000000 // FLASH memory +#define SRAM_BASE 0x20000000 // SRAM memory +#define WATCHDOG_BASE 0x40000000 // Watchdog +#define GPIO_PORTA_BASE 0x40004000 // GPIO Port A +#define GPIO_PORTB_BASE 0x40005000 // GPIO Port B +#define GPIO_PORTC_BASE 0x40006000 // GPIO Port C +#define SSI_BASE 0x40008000 // SSI +#define UART0_BASE 0x4000C000 // UART0 +#define I2C_MASTER_BASE 0x40020000 // I2C Master +#define I2C_SLAVE_BASE 0x40020800 // I2C Slave +#define TIMER0_BASE 0x40030000 // Timer0 +#define TIMER1_BASE 0x40031000 // Timer1 +#define COMP_BASE 0x4003C000 // Analog comparators +#define FLASH_CTRL_BASE 0x400FD000 // FLASH Controller +#define SYSCTL_BASE 0x400FE000 // System Control +#define ITM_BASE 0xE0000000 // Instrumentation Trace Macrocell +#define DWT_BASE 0xE0001000 // Data Watchpoint and Trace +#define FPB_BASE 0xE0002000 // FLASH Patch and Breakpoint +#define NVIC_BASE 0xE000E000 // Nested Vectored Interrupt Ctrl +#define TPIU_BASE 0xE0040000 // Trace Port Interface Unit + +#endif // __HW_MEMMAP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_nvic.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_nvic.h new file mode 100644 index 0000000..77dfe71 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_nvic.h @@ -0,0 +1,830 @@ +//***************************************************************************** +// +// hw_nvic.h - Macros used when accessing the NVIC hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_NVIC_H__ +#define __HW_NVIC_H__ + +//***************************************************************************** +// +// The following define the addresses of the NVIC registers. +// +//***************************************************************************** +#define NVIC_INT_TYPE 0xE000E004 // Interrupt Controller Type Reg. +#define NVIC_ST_CTRL 0xE000E010 // SysTick Control and Status Reg. +#define NVIC_ST_RELOAD 0xE000E014 // SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 // SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C // SysTick Calibration Value Reg. +#define NVIC_EN0 0xE000E100 // IRQ 0 to 31 Set Enable Register +#define NVIC_DIS0 0xE000E180 // IRQ 0 to 31 Clear Enable Reg. +#define NVIC_PEND0 0xE000E200 // IRQ 0 to 31 Set Pending Register +#define NVIC_UNPEND0 0xE000E280 // IRQ 0 to 31 Clear Pending Reg. +#define NVIC_ACTIVE0 0xE000E300 // IRQ 0 to 31 Active Register +#define NVIC_PRI0 0xE000E400 // IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 // IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 // IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C // IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 // IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 // IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 // IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C // IRQ 28 to 31 Priority Register +#define NVIC_CPUID 0xE000ED00 // CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 // Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 // Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C // App. Int & Reset Control Reg. +#define NVIC_SYS_CTRL 0xE000ED10 // System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 // Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C // Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 // Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 // System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. +#define NVIC_HFAULT_STAT 0xE000ED2C // Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 // Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 // Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 // Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 // MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 // MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 // MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C // MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 // MPU Region Attribute & Size Reg. +#define NVIC_DBG_CTRL 0xE000EDF0 // Debug Control and Status Reg. +#define NVIC_DBG_XFER 0xE000EDF4 // Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 // Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC // Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 // Software Trigger Interrupt Reg. + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_TYPE register. +// +//***************************************************************************** +#define NVIC_INT_TYPE_LINES_M 0x0000001F // Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CTRL register. +// +//***************************************************************************** +#define NVIC_ST_CTRL_COUNT 0x00010000 // Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 // Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 // Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 // Counter mode + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_RELOAD register. +// +//***************************************************************************** +#define NVIC_ST_RELOAD_M 0x00FFFFFF // Counter load value +#define NVIC_ST_RELOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CURRENT register. +// +//***************************************************************************** +#define NVIC_ST_CURRENT_M 0x00FFFFFF // Counter current value +#define NVIC_ST_CURRENT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CAL register. +// +//***************************************************************************** +#define NVIC_ST_CAL_NOREF 0x80000000 // No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 // Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF // 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN0 register. +// +//***************************************************************************** +#define NVIC_EN0_INT31 0x80000000 // Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 // Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 // Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 // Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 // Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 // Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 // Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 // Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 // Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 // Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 // Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 // Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 // Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 // Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 // Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 // Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 // Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 // Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 // Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 // Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 // Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 // Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 // Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 // Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 // Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 // Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 // Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 // Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 // Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 // Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 // Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 // Interrupt 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS0 register. +// +//***************************************************************************** +#define NVIC_DIS0_INT31 0x80000000 // Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 // Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 // Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 // Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 // Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 // Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 // Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 // Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 // Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 // Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 // Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 // Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 // Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 // Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 // Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 // Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 // Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 // Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 // Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 // Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 // Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 // Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 // Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 // Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 // Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 // Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 // Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 // Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 // Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 // Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 // Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 // Interrupt 0 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND0 register. +// +//***************************************************************************** +#define NVIC_PEND0_INT31 0x80000000 // Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 // Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 // Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 // Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 // Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 // Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 // Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 // Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 // Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 // Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 // Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 // Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 // Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 // Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 // Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 // Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 // Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 // Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 // Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 // Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 // Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 // Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 // Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 // Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 // Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 // Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 // Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 // Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 // Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 // Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 // Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 // Interrupt 0 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND0 register. +// +//***************************************************************************** +#define NVIC_UNPEND0_INT31 0x80000000 // Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 // Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 // Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 // Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 // Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 // Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 // Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 // Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 // Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 // Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 // Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 // Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 // Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 // Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 // Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 // Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 // Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 // Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 // Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 // Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 // Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 // Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 // Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 // Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 // Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 // Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 // Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 // Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 // Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 // Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 // Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 // Interrupt 0 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE0 register. +// +//***************************************************************************** +#define NVIC_ACTIVE0_INT31 0x80000000 // Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 // Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 // Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 // Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 // Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 // Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 // Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 // Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 // Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 // Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 // Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 // Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 // Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 // Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 // Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 // Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 // Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 // Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 // Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 // Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 // Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 // Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 // Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 // Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 // Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 // Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 // Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 // Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 // Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 // Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 // Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 // Interrupt 0 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI0 register. +// +//***************************************************************************** +#define NVIC_PRI0_INT3_M 0xFF000000 // Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 // Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 // Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF // Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI1 register. +// +//***************************************************************************** +#define NVIC_PRI1_INT7_M 0xFF000000 // Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 // Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 // Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF // Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI2 register. +// +//***************************************************************************** +#define NVIC_PRI2_INT11_M 0xFF000000 // Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 // Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 // Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF // Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI3 register. +// +//***************************************************************************** +#define NVIC_PRI3_INT15_M 0xFF000000 // Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 // Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 // Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF // Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI4 register. +// +//***************************************************************************** +#define NVIC_PRI4_INT19_M 0xFF000000 // Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 // Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 // Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF // Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI5 register. +// +//***************************************************************************** +#define NVIC_PRI5_INT23_M 0xFF000000 // Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 // Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 // Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF // Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI6 register. +// +//***************************************************************************** +#define NVIC_PRI6_INT27_M 0xFF000000 // Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 // Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 // Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF // Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI7 register. +// +//***************************************************************************** +#define NVIC_PRI7_INT31_M 0xFF000000 // Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 // Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 // Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF // Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CPUID register. +// +//***************************************************************************** +#define NVIC_CPUID_IMP_M 0xFF000000 // Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 // Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 // Processor part number +#define NVIC_CPUID_REV_M 0x0000000F // Revision + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_CTRL register. +// +//***************************************************************************** +#define NVIC_INT_CTRL_NMI_SET 0x80000000 // Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 // Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 // Unpend a PendSV +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 // Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 // Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 // Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 // Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF // Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_VTABLE register. +// +//***************************************************************************** +#define NVIC_VTABLE_BASE 0x20000000 // Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 // Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_APINT register. +// +//***************************************************************************** +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 // Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 // Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 // Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 // Priority group +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 // Priority group 7.1 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 // Priority group 6.2 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 // Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 // Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 // Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 // Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 // Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 // Priority group 0.8 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 // System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 // Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 // System reset + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 // Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 // Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 // Sleep on ISR exit + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CFG_CTRL register. +// +//***************************************************************************** +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 // Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 // Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 // Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 // Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 // Thread state control + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI1 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI1_RES_M 0xFF000000 // Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 // Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 // Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF // Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI2 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 // Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF // Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI3 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 // Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 // Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 // Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF // Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_HND_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 // Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 // Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 // Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 // SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 // Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 // Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 // PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 // Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 // SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 // Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 // Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 // Mem manage is active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_STAT register. +// +//***************************************************************************** +#define NVIC_FAULT_STAT_DIV0 0x02000000 // Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 // Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 // No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 // Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 // Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 // Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 // Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 // Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 // Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 // Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 // Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 // MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 // Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 // Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 // Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 // Instruction access violation + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_HFAULT_STAT register. +// +//***************************************************************************** +#define NVIC_HFAULT_STAT_DBG 0x80000000 // Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 // Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 // Vector table read fault + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DEBUG_STAT register. +// +//***************************************************************************** +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 // EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 // Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 // DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 // Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 // Halt request + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MM_ADDR register. +// +//***************************************************************************** +#define NVIC_MM_ADDR_M 0xFFFFFFFF // Data fault address +#define NVIC_MM_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_ADDR register. +// +//***************************************************************************** +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF // Data bus fault address +#define NVIC_FAULT_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_STACK register. +// +//***************************************************************************** +#define NVIC_EXC_STACK_DEEP 0x00000001 // Exception stack + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_NUM register. +// +//***************************************************************************** +#define NVIC_EXC_NUM_M 0x000003FF // Exception number +#define NVIC_EXC_NUM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_COPRO register. +// +//***************************************************************************** +#define NVIC_COPRO_15_M 0xC0000000 // Coprocessor 15 access mask +#define NVIC_COPRO_15_DENIED 0x00000000 // Coprocessor 15 access denied +#define NVIC_COPRO_15_PRIV 0x40000000 // Coprocessor 15 privileged addess +#define NVIC_COPRO_15_FULL 0xC0000000 // Coprocessor 15 full access +#define NVIC_COPRO_14_M 0x30000000 // Coprocessor 14 access mask +#define NVIC_COPRO_14_DENIED 0x00000000 // Coprocessor 14 access denied +#define NVIC_COPRO_14_PRIV 0x10000000 // Coprocessor 14 privileged addess +#define NVIC_COPRO_14_FULL 0x30000000 // Coprocessor 14 full access +#define NVIC_COPRO_13_M 0x0C000000 // Coprocessor 13 access mask +#define NVIC_COPRO_13_DENIED 0x00000000 // Coprocessor 13 access denied +#define NVIC_COPRO_13_PRIV 0x04000000 // Coprocessor 13 privileged addess +#define NVIC_COPRO_13_FULL 0x0C000000 // Coprocessor 13 full access +#define NVIC_COPRO_12_M 0x03000000 // Coprocessor 12 access mask +#define NVIC_COPRO_12_DENIED 0x00000000 // Coprocessor 12 access denied +#define NVIC_COPRO_12_PRIV 0x01000000 // Coprocessor 12 privileged addess +#define NVIC_COPRO_12_FULL 0x03000000 // Coprocessor 12 full access +#define NVIC_COPRO_11_M 0x00C00000 // Coprocessor 11 access mask +#define NVIC_COPRO_11_DENIED 0x00000000 // Coprocessor 11 access denied +#define NVIC_COPRO_11_PRIV 0x00400000 // Coprocessor 11 privileged addess +#define NVIC_COPRO_11_FULL 0x00C00000 // Coprocessor 11 full access +#define NVIC_COPRO_10_M 0x00300000 // Coprocessor 10 access mask +#define NVIC_COPRO_10_DENIED 0x00000000 // Coprocessor 10 access denied +#define NVIC_COPRO_10_PRIV 0x00100000 // Coprocessor 10 privileged addess +#define NVIC_COPRO_10_FULL 0x00300000 // Coprocessor 10 full access +#define NVIC_COPRO_9_M 0x000C0000 // Coprocessor 9 access mask +#define NVIC_COPRO_9_DENIED 0x00000000 // Coprocessor 9 access denied +#define NVIC_COPRO_9_PRIV 0x00040000 // Coprocessor 9 privileged addess +#define NVIC_COPRO_9_FULL 0x000C0000 // Coprocessor 9 full access +#define NVIC_COPRO_8_M 0x00030000 // Coprocessor 8 access mask +#define NVIC_COPRO_8_DENIED 0x00000000 // Coprocessor 8 access denied +#define NVIC_COPRO_8_PRIV 0x00010000 // Coprocessor 8 privileged addess +#define NVIC_COPRO_8_FULL 0x00030000 // Coprocessor 8 full access +#define NVIC_COPRO_7_M 0x0000C000 // Coprocessor 7 access mask +#define NVIC_COPRO_7_DENIED 0x00000000 // Coprocessor 7 access denied +#define NVIC_COPRO_7_PRIV 0x00004000 // Coprocessor 7 privileged addess +#define NVIC_COPRO_7_FULL 0x0000C000 // Coprocessor 7 full access +#define NVIC_COPRO_6_M 0x00003000 // Coprocessor 6 access mask +#define NVIC_COPRO_6_DENIED 0x00000000 // Coprocessor 6 access denied +#define NVIC_COPRO_6_PRIV 0x00001000 // Coprocessor 6 privileged addess +#define NVIC_COPRO_6_FULL 0x00003000 // Coprocessor 6 full access +#define NVIC_COPRO_5_M 0x00000C00 // Coprocessor 5 access mask +#define NVIC_COPRO_5_DENIED 0x00000000 // Coprocessor 5 access denied +#define NVIC_COPRO_5_PRIV 0x00000400 // Coprocessor 5 privileged addess +#define NVIC_COPRO_5_FULL 0x00000C00 // Coprocessor 5 full access +#define NVIC_COPRO_4_M 0x00000300 // Coprocessor 4 access mask +#define NVIC_COPRO_4_DENIED 0x00000000 // Coprocessor 4 access denied +#define NVIC_COPRO_4_PRIV 0x00000100 // Coprocessor 4 privileged addess +#define NVIC_COPRO_4_FULL 0x00000300 // Coprocessor 4 full access +#define NVIC_COPRO_3_M 0x000000C0 // Coprocessor 3 access mask +#define NVIC_COPRO_3_DENIED 0x00000000 // Coprocessor 3 access denied +#define NVIC_COPRO_3_PRIV 0x00000040 // Coprocessor 3 privileged addess +#define NVIC_COPRO_3_FULL 0x000000C0 // Coprocessor 3 full access +#define NVIC_COPRO_2_M 0x00000030 // Coprocessor 2 access mask +#define NVIC_COPRO_2_DENIED 0x00000000 // Coprocessor 2 access denied +#define NVIC_COPRO_2_PRIV 0x00000010 // Coprocessor 2 privileged addess +#define NVIC_COPRO_2_FULL 0x00000030 // Coprocessor 2 full access +#define NVIC_COPRO_1_M 0x0000000C // Coprocessor 1 access mask +#define NVIC_COPRO_1_DENIED 0x00000000 // Coprocessor 1 access denied +#define NVIC_COPRO_1_PRIV 0x00000004 // Coprocessor 1 privileged addess +#define NVIC_COPRO_1_FULL 0x0000000C // Coprocessor 1 full access +#define NVIC_COPRO_0_M 0x00000003 // Coprocessor 0 access mask +#define NVIC_COPRO_0_DENIED 0x00000000 // Coprocessor 0 access denied +#define NVIC_COPRO_0_PRIV 0x00000001 // Coprocessor 0 privileged addess +#define NVIC_COPRO_0_FULL 0x00000003 // Coprocessor 0 full access + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_TYPE register. +// +//***************************************************************************** +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 // Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 // Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 // Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_CTRL register. +// +//***************************************************************************** +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 // MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 // MPU enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_NUMBER register. +// +//***************************************************************************** +#define NVIC_MPU_NUMBER_M 0x000000FF // MPU region to access +#define NVIC_MPU_NUMBER_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_BASE register. +// +//***************************************************************************** +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFF00 // Base address +#define NVIC_MPU_BASE_VALID 0x00000010 // Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F // Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_ATTR register. +// +//***************************************************************************** +#define NVIC_MPU_ATTR_ATTRS 0xFFFF0000 // Attributes +#define NVIC_MPU_ATTR_SRD 0x0000FF00 // Sub-region disable +#define NVIC_MPU_ATTR_SZENABLE 0x000000FF // Region size + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_CTRL register. +// +//***************************************************************************** +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 // Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 // Debug key +#define NVIC_DBG_CTRL_MON_PEND 0x00008000 // Pend the monitor +#define NVIC_DBG_CTRL_MON_REQ 0x00004000 // Monitor request +#define NVIC_DBG_CTRL_MON_EN 0x00002000 // Debug monitor enable +#define NVIC_DBG_CTRL_MONSTEP 0x00001000 // Monitor step the core +#define NVIC_DBG_CTRL_S_SLEEP 0x00000400 // Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00000200 // Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00000100 // Register read/write available +#define NVIC_DBG_CTRL_S_LOCKUP 0x00000080 // Core is locked up +#define NVIC_DBG_CTRL_C_RESET 0x00000010 // Reset the core +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 // Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 // Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 // Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 // Enable debug + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_XFER register. +// +//***************************************************************************** +#define NVIC_DBG_XFER_REG_WNR 0x00010000 // Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F // Register +#define NVIC_DBG_XFER_REG_R0 0x00000000 // Register R0 +#define NVIC_DBG_XFER_REG_R1 0x00000001 // Register R1 +#define NVIC_DBG_XFER_REG_R2 0x00000002 // Register R2 +#define NVIC_DBG_XFER_REG_R3 0x00000003 // Register R3 +#define NVIC_DBG_XFER_REG_R4 0x00000004 // Register R4 +#define NVIC_DBG_XFER_REG_R5 0x00000005 // Register R5 +#define NVIC_DBG_XFER_REG_R6 0x00000006 // Register R6 +#define NVIC_DBG_XFER_REG_R7 0x00000007 // Register R7 +#define NVIC_DBG_XFER_REG_R8 0x00000008 // Register R8 +#define NVIC_DBG_XFER_REG_R9 0x00000009 // Register R9 +#define NVIC_DBG_XFER_REG_R10 0x0000000A // Register R10 +#define NVIC_DBG_XFER_REG_R11 0x0000000B // Register R11 +#define NVIC_DBG_XFER_REG_R12 0x0000000C // Register R12 +#define NVIC_DBG_XFER_REG_R13 0x0000000D // Register R13 +#define NVIC_DBG_XFER_REG_R14 0x0000000E // Register R14 +#define NVIC_DBG_XFER_REG_R15 0x0000000F // Register R15 +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 // xPSR/Flags register +#define NVIC_DBG_XFER_REG_MSP 0x00000011 // Main SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 // Process SP +#define NVIC_DBG_XFER_REG_DSP 0x00000013 // Deep SP +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 // Control/Fault/BasePri/PriMask + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_DATA register. +// +//***************************************************************************** +#define NVIC_DBG_DATA_M 0xFFFFFFFF // Data temporary cache +#define NVIC_DBG_DATA_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_INT register. +// +//***************************************************************************** +#define NVIC_DBG_INT_HARDERR 0x00000400 // Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 // Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 // Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 // Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 // Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 // Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 // Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 // Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 // Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 // Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 // Reset vector catch + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SW_TRIG register. +// +//***************************************************************************** +#define NVIC_SW_TRIG_INTID_M 0x000003FF // Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 + +#endif // __HW_NVIC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_ssi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_ssi.h new file mode 100644 index 0000000..3747232 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_ssi.h @@ -0,0 +1,113 @@ +//***************************************************************************** +// +// hw_ssi.h - Macros used when accessing the SSI hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SSI_H__ +#define __HW_SSI_H__ + +//***************************************************************************** +// +// The following define the offsets of the SSI registers. +// +//***************************************************************************** +#define SSI_O_CR0 0x00000000 // Control register 0 +#define SSI_O_CR1 0x00000004 // Control register 1 +#define SSI_O_DR 0x00000008 // Data register +#define SSI_O_SR 0x0000000C // Status register +#define SSI_O_CPSR 0x00000010 // Clock prescale register +#define SSI_O_IM 0x00000014 // Int mask set and clear register +#define SSI_O_RIS 0x00000018 // Raw interrupt register +#define SSI_O_MIS 0x0000001C // Masked interrupt register +#define SSI_O_ICR 0x00000020 // Interrupt clear register + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 0. +// +//***************************************************************************** +#define SSI_CR0_SCR 0x0000FF00 // Serial clock rate +#define SSI_CR0_SPH 0x00000080 // SSPCLKOUT phase +#define SSI_CR0_SPO 0x00000040 // SSPCLKOUT polarity +#define SSI_CR0_FRF_MASK 0x00000030 // Frame format mask +#define SSI_CR0_FRF_MOTO 0x00000000 // Motorola SPI frame format +#define SSI_CR0_FRF_TI 0x00000010 // TI sync serial frame format +#define SSI_CR0_FRF_NMW 0x00000020 // National Microwire frame format +#define SSI_CR0_DSS 0x0000000F // Data size select +#define SSI_CR0_DSS_4 0x00000003 // 4 bit data +#define SSI_CR0_DSS_5 0x00000004 // 5 bit data +#define SSI_CR0_DSS_6 0x00000005 // 6 bit data +#define SSI_CR0_DSS_7 0x00000006 // 7 bit data +#define SSI_CR0_DSS_8 0x00000007 // 8 bit data +#define SSI_CR0_DSS_9 0x00000008 // 9 bit data +#define SSI_CR0_DSS_10 0x00000009 // 10 bit data +#define SSI_CR0_DSS_11 0x0000000A // 11 bit data +#define SSI_CR0_DSS_12 0x0000000B // 12 bit data +#define SSI_CR0_DSS_13 0x0000000C // 13 bit data +#define SSI_CR0_DSS_14 0x0000000D // 14 bit data +#define SSI_CR0_DSS_15 0x0000000E // 15 bit data +#define SSI_CR0_DSS_16 0x0000000F // 16 bit data + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 1. +// +//***************************************************************************** +#define SSI_CR1_SOD 0x00000008 // Slave mode output disable +#define SSI_CR1_MS 0x00000004 // Master or slave mode select +#define SSI_CR1_SSE 0x00000002 // Sync serial port enable +#define SSI_CR1_LBM 0x00000001 // Loopback mode + +//***************************************************************************** +// +// The following define the bit fields in the SSI Status register +// +//***************************************************************************** +#define SSI_SR_BSY 0x00000010 // SSI busy +#define SSI_SR_RFF 0x00000008 // RX FIFO full +#define SSI_SR_RNE 0x00000004 // RX FIFO not empty +#define SSI_SR_TNF 0x00000002 // TX FIFO not full +#define SSI_SR_TFE 0x00000001 // TX FIFO empty + +//***************************************************************************** +// +// The following define information concerning the SSI Data register. +// +//***************************************************************************** +#define TX_FIFO_SIZE (8) // Number of entries in the TX FIFO +#define RX_FIFO_SIZE (8) // Number of entries in the RX FIFO + +//***************************************************************************** +// +// The following define the bit fields in the interrupt mask set and clear, +// raw interrupt, masked interrupt, and interrupt clear registers. +// +//***************************************************************************** +#define SSI_INT_TXFF 0x00000008 // TX FIFO interrupt +#define SSI_INT_RXFF 0x00000004 // RX FIFO interrupt +#define SSI_INT_RXTO 0x00000002 // RX timeout interrupt +#define SSI_INT_RXOR 0x00000001 // RX overrun interrupt + +#endif // __HW_SSI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_sysctl.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_sysctl.h new file mode 100644 index 0000000..e3ef94f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_sysctl.h @@ -0,0 +1,325 @@ +//***************************************************************************** +// +// hw_sysctl.h - Macros used when accessing the system control hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SYSCTL_H__ +#define __HW_SYSCTL_H__ + +//***************************************************************************** +// +// The following define the offsets of the system control registers. +// +//***************************************************************************** +#define SYSCTL_DID0 0x400fe000 // Device identification register 0 +#define SYSCTL_DID1 0x400fe004 // Device identification register 1 +#define SYSCTL_DC0 0x400fe008 // Device capabilities register 0 +#define SYSCTL_DC1 0x400fe010 // Device capabilities register 1 +#define SYSCTL_DC2 0x400fe014 // Device capabilities register 2 +#define SYSCTL_DC3 0x400fe018 // Device capabilities register 3 +#define SYSCTL_DC4 0x400fe01C // Device capabilities register 4 +#define SYSCTL_PBORCTL 0x400fe030 // POR/BOR reset control register +#define SYSCTL_LDOPCTL 0x400fe034 // LDO power control register +#define SYSCTL_SRCR0 0x400fe040 // Software reset control reg 0 +#define SYSCTL_SRCR1 0x400fe044 // Software reset control reg 1 +#define SYSCTL_SRCR2 0x400fe048 // Software reset control reg 2 +#define SYSCTL_RIS 0x400fe050 // Raw interrupt status register +#define SYSCTL_IMC 0x400fe054 // Interrupt mask/control register +#define SYSCTL_MISC 0x400fe058 // Interrupt status register +#define SYSCTL_RESC 0x400fe05c // Reset cause register +#define SYSCTL_RCC 0x400fe060 // Run-mode clock config register +#define SYSCTL_PLLCFG 0x400fe064 // PLL configuration register +#define SYSCTL_RCGC0 0x400fe100 // Run-mode clock gating register 0 +#define SYSCTL_RCGC1 0x400fe104 // Run-mode clock gating register 1 +#define SYSCTL_RCGC2 0x400fe108 // Run-mode clock gating register 2 +#define SYSCTL_SCGC0 0x400fe110 // Sleep-mode clock gating reg 0 +#define SYSCTL_SCGC1 0x400fe114 // Sleep-mode clock gating reg 1 +#define SYSCTL_SCGC2 0x400fe118 // Sleep-mode clock gating reg 2 +#define SYSCTL_DCGC0 0x400fe120 // Deep Sleep-mode clock gate reg 0 +#define SYSCTL_DCGC1 0x400fe124 // Deep Sleep-mode clock gate reg 1 +#define SYSCTL_DCGC2 0x400fe128 // Deep Sleep-mode clock gate reg 2 +#define SYSCTL_CLKVCLR 0x400fe150 // Clock verifcation clear register +#define SYSCTL_LDOARST 0x400fe160 // LDO reset control register + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID0 register. +// +//***************************************************************************** +#define SYSCTL_DID0_MAJ_MASK 0x0000FF00 // Major revision mask +#define SYSCTL_DID0_MAJ_A 0x00000000 // Major revision A +#define SYSCTL_DID0_MAJ_B 0x00000100 // Major revision B +#define SYSCTL_DID0_MIN_MASK 0x000000FF // Minor revision mask +#define SYSCTL_DID0_MIN_0 0x00000000 // Minor revision 0 +#define SYSCTL_DID0_MIN_1 0x00000001 // Minor revision 1 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID1 register. +// +//***************************************************************************** +#define SYSCTL_DID1_VER_MASK 0xF0000000 // Register version mask +#define SYSCTL_DID1_FAM_MASK 0x0F000000 // Family mask +#define SYSCTL_DID1_FAM_S 0x00000000 // Stellaris family +#define SYSCTL_DID1_PRTNO_MASK 0x00FF0000 // Part number mask +#define SYSCTL_DID1_PRTNO_101 0x00010000 // LM3S101 +#define SYSCTL_DID1_PRTNO_102 0x00020000 // LM3S102 +#define SYSCTL_DID1_TEMP_MASK 0x000000E0 // Temperature range mask +#define SYSCTL_DID1_TEMP_C 0x00000000 // Commercial temp range (0..70C) +#define SYSCTL_DID1_TEMP_I 0x00000020 // Industrial temp range (-40..85C) +#define SYSCTL_DID1_PKG_MASK 0x00000018 // Package mask +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 // 28-pin SOIC +#define SYSCTL_DID1_ROHS 0x00000004 // Part is RoHS compliant +#define SYSCTL_DID1_QUAL_MASK 0x00000003 // Qualification status mask +#define SYSCTL_DID1_QUAL_ES 0x00000000 // Engineering sample (unqualified) +#define SYSCTL_DID1_QUAL_PP 0x00000001 // Pilot production (unqualified) +#define SYSCTL_DID1_QUAL_FQ 0x00000002 // Fully qualified +#define SYSCTL_DID1_PRTNO_SHIFT 16 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC0 register. +// +//***************************************************************************** +#define SYSCTL_DC0_SRAMSZ_MASK 0xFFFF0000 // SRAM size mask +#define SYSCTL_DC0_SRAMSZ_2KB 0x00070000 // 2kB of SRAM +#define SYSCTL_DC0_FLASHSZ_MASK 0x0000FFFF // Flash size mask +#define SYSCTL_DC0_FLASHSZ_8KB 0x00000003 // 8kB of flash + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC1 register. +// +//***************************************************************************** +#define SYSCTL_DC1_SYSDIV_MASK 0x0000F000 // Minimum system divider mask +#define SYSCTL_DC1_MPU 0x00000080 // Cortex-M3 MPU present +#define SYSCTL_DC1_PLL 0x00000010 // PLL present +#define SYSCTL_DC1_WDOG 0x00000008 // Watchdog present +#define SYSCTL_DC1_SWO 0x00000004 // Serial wire output present +#define SYSCTL_DC1_SWD 0x00000002 // Serial wire debug present +#define SYSCTL_DC1_JTAG 0x00000001 // JTAG debug present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC2 register. +// +//***************************************************************************** +#define SYSCTL_DC2_COMP1 0x02000000 // Analog comparator 1 present +#define SYSCTL_DC2_COMP0 0x01000000 // Analog comparator 0 present +#define SYSCTL_DC2_TIMER1 0x00020000 // Timer 1 present +#define SYSCTL_DC2_TIMER0 0x00010000 // Timer 0 present +#define SYSCTL_DC2_I2C 0x00001000 // I2C present +#define SYSCTL_DC2_SSI 0x00000010 // SSI present +#define SYSCTL_DC2_UART0 0x00000001 // UART 0 present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC3 register. +// +//***************************************************************************** +#define SYSCTL_DC3_32KHZ 0x80000000 // 32kHz pin present +#define SYSCTL_DC3_CCP1 0x02000000 // CCP1 pin present +#define SYSCTL_DC3_CCP0 0x01000000 // CCP0 pin present +#define SYSCTL_DC3_C1MINUS 0x00000200 // C1- pin present +#define SYSCTL_DC3_C0O 0x00000100 // C0o pin present +#define SYSCTL_DC3_C0PLUS 0x00000080 // C0+ pin present +#define SYSCTL_DC3_C0MINUS 0x00000040 // C0- pin present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC4 register. +// +//***************************************************************************** +#define SYSCTL_DC4_GPIOC 0x00000004 // GPIO port C present +#define SYSCTL_DC4_GPIOB 0x00000002 // GPIO port B present +#define SYSCTL_DC4_GPIOA 0x00000001 // GPIO port A present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PBORCTL register. +// +//***************************************************************************** +#define SYSCTL_PBORCTL_BOR_MASK 0x0000FFFC // BOR wait timer +#define SYSCTL_PBORCTL_BORIOR 0x00000002 // BOR interrupt or reset +#define SYSCTL_PBORCTL_BORWT 0x00000001 // BOR wait and check for noise +#define SYSCTL_PBORCTL_BOR_SH 2 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOPCTL register. +// +//***************************************************************************** +#define SYSCTL_LDOPCTL_MASK 0x0000003F // Voltage adjust mask +#define SYSCTL_LDOPCTL_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDOPCTL_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDOPCTL_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDOPCTL_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDOPCTL_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDOPCTL_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDOPCTL_2_55V 0x0000001F // LDO output of 2.55V +#define SYSCTL_LDOPCTL_2_60V 0x0000001E // LDO output of 2.60V +#define SYSCTL_LDOPCTL_2_65V 0x0000001D // LDO output of 2.65V +#define SYSCTL_LDOPCTL_2_70V 0x0000001C // LDO output of 2.70V +#define SYSCTL_LDOPCTL_2_75V 0x0000001B // LDO output of 2.75V + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR0, SYSCTL_RCGC0, +// SYSCTL_SCGC0, and SYSCTL_DCGC0 registers. +// +//***************************************************************************** +#define SYSCTL_SET0_WDOG 0x00000008 // Watchdog module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR1, SYSCTL_RCGC1, +// SYSCTL_SCGC1, and SYSCTL_DCGC1 registers. +// +//***************************************************************************** +#define SYSCTL_SET1_COMP1 0x02000000 // Analog comparator module 1 +#define SYSCTL_SET1_COMP0 0x01000000 // Analog comparator module 0 +#define SYSCTL_SET1_TIMER1 0x00020000 // Timer module 1 +#define SYSCTL_SET1_TIMER0 0x00010000 // Timer module 0 +#define SYSCTL_SET1_I2C 0x00001000 // I2C module +#define SYSCTL_SET1_SSI 0x00000010 // SSI module +#define SYSCTL_SET1_UART0 0x00000001 // UART module 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR2, SYSCTL_RCGC2, +// SYSCTL_SCGC2, and SYSCTL_DCGC2 registers. +// +//***************************************************************************** +#define SYSCTL_SET2_GPIOC 0x00000004 // GPIO C module +#define SYSCTL_SET2_GPIOB 0x00000002 // GPIO B module +#define SYSCTL_SET2_GPIOA 0x00000001 // GIPO A module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RIS, SYSCTL_IMC, and +// SYSCTL_IMS registers. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_BOSC_FAIL 0x00000010 // Boot oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RESC register. +// +//***************************************************************************** +#define SYSCTL_RESC_LDO 0x00000020 // LDO power OK lost reset +#define SYSCTL_RESC_SW 0x00000010 // Software reset +#define SYSCTL_RESC_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_RESC_BOR 0x00000004 // Brown-out reset +#define SYSCTL_RESC_POR 0x00000002 // Power on reset +#define SYSCTL_RESC_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC register. +// +//***************************************************************************** +#define SYSCTL_RCC_ACG 0x08000000 // Automatic clock gating +#define SYSCTL_RCC_SYSDIV_MASK 0x07800000 // System clock divider +#define SYSCTL_RCC_SYSDIV_2 0x00800000 // System clock /2 +#define SYSCTL_RCC_SYSDIV_3 0x01000000 // System clock /3 +#define SYSCTL_RCC_SYSDIV_4 0x01800000 // System clock /4 +#define SYSCTL_RCC_SYSDIV_5 0x02000000 // System clock /5 +#define SYSCTL_RCC_SYSDIV_6 0x02800000 // System clock /6 +#define SYSCTL_RCC_SYSDIV_7 0x03000000 // System clock /7 +#define SYSCTL_RCC_SYSDIV_8 0x03800000 // System clock /8 +#define SYSCTL_RCC_SYSDIV_9 0x04000000 // System clock /9 +#define SYSCTL_RCC_SYSDIV_10 0x04800000 // System clock /10 +#define SYSCTL_RCC_SYSDIV_11 0x05000000 // System clock /11 +#define SYSCTL_RCC_SYSDIV_12 0x05800000 // System clock /12 +#define SYSCTL_RCC_SYSDIV_13 0x06000000 // System clock /13 +#define SYSCTL_RCC_SYSDIV_14 0x06800000 // System clock /14 +#define SYSCTL_RCC_SYSDIV_15 0x07000000 // System clock /15 +#define SYSCTL_RCC_SYSDIV_16 0x07800000 // System clock /16 +#define SYSCTL_RCC_USE_SYSDIV 0x00400000 // Use sytem clock divider +#define SYSCTL_RCC_PWRDN 0x00002000 // PLL power down +#define SYSCTL_RCC_OE 0x00001000 // PLL output enable +#define SYSCTL_RCC_BYPASS 0x00000800 // PLL bypass +#define SYSCTL_RCC_PLLVER 0x00000400 // PLL verification timer enable +#define SYSCTL_RCC_XTAL_MASK 0x000003C0 // Crystal attached to main osc +#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100 // Using a 3.579545MHz crystal +#define SYSCTL_RCC_XTAL_3_68MHz 0x00000140 // Using a 3.6864MHz crystal +#define SYSCTL_RCC_XTAL_4MHz 0x00000180 // Using a 4MHz crystal +#define SYSCTL_RCC_XTAL_4_09MHZ 0x000001C0 // Using a 4.096MHz crystal +#define SYSCTL_RCC_XTAL_4_91MHZ 0x00000200 // Using a 4.9152MHz crystal +#define SYSCTL_RCC_XTAL_5MHZ 0x00000240 // Using a 5MHz crystal +#define SYSCTL_RCC_XTAL_5_12MHZ 0x00000280 // Using a 5.12MHz crystal +#define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 // Using a 6MHz crystal +#define SYSCTL_RCC_XTAL_6_14MHZ 0x00000300 // Using a 6.144MHz crystal +#define SYSCTL_RCC_XTAL_7_37MHZ 0x00000340 // Using a 7.3728MHz crystal +#define SYSCTL_RCC_XTAL_8MHZ 0x00000380 // Using a 8MHz crystal +#define SYSCTL_RCC_XTAL_8_19MHZ 0x000003C0 // Using a 8.192MHz crystal +#define SYSCTL_RCC_OSCSRC_MASK 0x00000030 // Oscillator input select +#define SYSCTL_RCC_OSCSRC_MAIN 0x00000000 // Use the main oscillator +#define SYSCTL_RCC_OSCSRC_BOOT 0x00000010 // Use the boot oscillator +#define SYSCTL_RCC_OSCSRC_BOOT4 0x00000020 // Use the boot oscillator / 4 +#define SYSCTL_RCC_BOSCVER 0x00000008 // Boot osc. verification timer en +#define SYSCTL_RCC_MOSCVER 0x00000004 // Main osc. verification timer en +#define SYSCTL_RCC_BOSCDIS 0x00000002 // Boot oscillator disable +#define SYSCTL_RCC_MOSCDIS 0x00000001 // Main oscillator disable +#define SYSCTL_RCC_SYSDIV_SHIFT 23 // Shift to the SYSDIV field +#define SYSCTL_RCC_XTAL_SHIFT 6 // Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_SHIFT 4 // Shift to the OSCSRC field + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PLLCFG register. +// +//***************************************************************************** +#define SYSCTL_PLLCFG_OD_MASK 0x0000C000 // Output divider +#define SYSCTL_PLLCFG_OD_1 0x00000000 // Output divider is 1 +#define SYSCTL_PLLCFG_OD_2 0x00004000 // Output divider is 2 +#define SYSCTL_PLLCFG_OD_4 0x00008000 // Output divider is 4 +#define SYSCTL_PLLCFG_F_MASK 0x00003FE0 // PLL multiplier +#define SYSCTL_PLLCFG_R_MASK 0x0000001F // Input predivider +#define SYSCTL_PLLCFG_F_SHIFT 5 +#define SYSCTL_PLLCFG_R_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_CLKVCLR register. +// +//***************************************************************************** +#define SYSCTL_CLKVCLR_CLR 0x00000001 // Clear clock verification fault + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOARST register. +// +//***************************************************************************** +#define SYSCTL_LDOARST_ARST 0x00000001 // Allow LDO to reset device + +#endif // __HW_SYSCTL_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_timer.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_timer.h new file mode 100644 index 0000000..9bad906 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_timer.h @@ -0,0 +1,233 @@ +//***************************************************************************** +// +// hw_timer.h - Defines and macros used when accessing the timer. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TIMER_H__ +#define __HW_TIMER_H__ + +//***************************************************************************** +// +// The following define the offsets of the timer registers. +// +//***************************************************************************** +#define TIMER_O_CFG 0x00000000 // Configuration register +#define TIMER_O_TAMR 0x00000004 // TimerA mode register +#define TIMER_O_TBMR 0x00000008 // TimerB mode register +#define TIMER_O_CTL 0x0000000C // Control register +#define TIMER_O_IMR 0x00000018 // Interrupt mask register +#define TIMER_O_RIS 0x0000001C // Interrupt status register +#define TIMER_O_MIS 0x00000020 // Masked interrupt status reg. +#define TIMER_O_ICR 0x00000024 // Interrupt clear register +#define TIMER_O_TAILR 0x00000028 // TimerA interval load register +#define TIMER_O_TBILR 0x0000002C // TimerB interval load register +#define TIMER_O_TAMATCHR 0x00000030 // TimerA match register +#define TIMER_O_TBMATCHR 0x00000034 // TimerB match register +#define TIMER_O_TAPR 0x00000038 // TimerA prescale register +#define TIMER_O_TBPR 0x0000003C // TimerB prescale register +#define TIMER_O_TAPMR 0x00000040 // TimerA prescale match register +#define TIMER_O_TBPMR 0x00000044 // TimerB prescale match register +#define TIMER_O_TAR 0x00000048 // TimerA register +#define TIMER_O_TBR 0x0000004C // TimerB register + +//***************************************************************************** +// +// The following define the reset values of the timer registers. +// +//***************************************************************************** +#define TIMER_RV_CFG 0x00000000 // Configuration register RV +#define TIMER_RV_TAMR 0x00000000 // TimerA mode register RV +#define TIMER_RV_TBMR 0x00000000 // TimerB mode register RV +#define TIMER_RV_CTL 0x00000000 // Control register RV +#define TIMER_RV_IMR 0x00000000 // Interrupt mask register RV +#define TIMER_RV_RIS 0x00000000 // Interrupt status register RV +#define TIMER_RV_MIS 0x00000000 // Masked interrupt status reg RV +#define TIMER_RV_ICR 0x00000000 // Interrupt clear register RV +#define TIMER_RV_TAILR 0xFFFFFFFF // TimerA interval load reg RV +#define TIMER_RV_TBILR 0x0000FFFF // TimerB interval load reg RV +#define TIMER_RV_TAMATCHR 0xFFFFFFFF // TimerA match register RV +#define TIMER_RV_TBMATCHR 0x0000FFFF // TimerB match register RV +#define TIMER_RV_TAPR 0x00000000 // TimerA prescale register RV +#define TIMER_RV_TBPR 0x00000000 // TimerB prescale register RV +#define TIMER_RV_TAPMR 0x00000000 // TimerA prescale match reg RV +#define TIMER_RV_TBPMR 0x00000000 // TimerB prescale match regi RV +#define TIMER_RV_TAR 0xFFFFFFFF // TimerA register RV +#define TIMER_RV_TBR 0x0000FFFF // TimerB register RV + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CFG register. +// +//***************************************************************************** +#define TIMER_CFG_CFG_MSK 0x00000007 // Configuration options mask +#define TIMER_CFG_16_BIT 0x00000004 // Two 16 bit timers +#define TIMER_CFG_32_BIT_RTC 0x00000001 // 32 bit RTC +#define TIMER_CFG_32_BIT_TIMER 0x00000000 // 32 bit timer + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TnMR register. +// +//***************************************************************************** +#define TIMER_TNMR_TNAMS 0x00000008 // Alternate mode select +#define TIMER_TNMR_TNCMR 0x00000004 // Capture mode - count or time +#define TIMER_TNMR_TNTMR_MSK 0x00000003 // Timer mode mask +#define TIMER_TNMR_TNTMR_CAP 0x00000003 // Mode - capture +#define TIMER_TNMR_TNTMR_PERIOD 0x00000002 // Mode - periodic +#define TIMER_TNMR_TNTMR_1_SHOT 0x00000001 // Mode - one shot + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CTL register. +// +//***************************************************************************** +#define TIMER_CTL_TBPWML 0x00004000 // TimerB PWM output level invert +#define TIMER_CTL_TBEVENT_MSK 0x00000C00 // TimerB event mode mask +#define TIMER_CTL_TBEVENT_BOTH 0x00000C00 // TimerB event mode - both edges +#define TIMER_CTL_TBEVENT_NEG 0x00000400 // TimerB event mode - neg edge +#define TIMER_CTL_TBEVENT_POS 0x00000000 // TimerB event mode - pos edge +#define TIMER_CTL_TBSTALL 0x00000200 // TimerB stall enable +#define TIMER_CTL_TBEN 0x00000100 // TimerB enable +#define TIMER_CTL_TAPWML 0x00000040 // TimerA PWM output level invert +#define TIMER_CTL_RTCEN 0x00000010 // RTC counter enable +#define TIMER_CTL_TAEVENT_MSK 0x0000000C // TimerA event mode mask +#define TIMER_CTL_TAEVENT_BOTH 0x0000000C // TimerA event mode - both edges +#define TIMER_CTL_TAEVENT_NEG 0x00000004 // TimerA event mode - neg edge +#define TIMER_CTL_TAEVENT_POS 0x00000000 // TimerA event mode - pos edge +#define TIMER_CTL_TASTALL 0x00000002 // TimerA stall enable +#define TIMER_CTL_TAEN 0x00000001 // TimerA enable + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_IMR register. +// +//***************************************************************************** +#define TIMER_IMR_CBEIM 0x00000400 // CaptureB event interrupt mask +#define TIMER_IMR_CBMIM 0x00000200 // CaptureB match interrupt mask +#define TIMER_IMR_TBTOIM 0x00000100 // TimerB time out interrupt mask +#define TIMER_IMR_RTCIM 0x00000008 // RTC interrupt mask +#define TIMER_IMR_CAEIM 0x00000004 // CaptureA event interrupt mask +#define TIMER_IMR_CAMIM 0x00000002 // CaptureA match interrupt mask +#define TIMER_IMR_TATOIM 0x00000001 // TimerA time out interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_RIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBERIS 0x00000400 // CaptureB event raw int status +#define TIMER_RIS_CBMRIS 0x00000200 // CaptureB match raw int status +#define TIMER_RIS_TBTORIS 0x00000100 // TimerB time out raw int status +#define TIMER_RIS_RTCRIS 0x00000008 // RTC raw int status +#define TIMER_RIS_CAERIS 0x00000004 // CaptureA event raw int status +#define TIMER_RIS_CAMRIS 0x00000002 // CaptureA match raw int status +#define TIMER_RIS_TATORIS 0x00000001 // TimerA time out raw int status + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_MIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBEMIS 0x00000400 // CaptureB event masked int status +#define TIMER_RIS_CBMMIS 0x00000200 // CaptureB match masked int status +#define TIMER_RIS_TBTOMIS 0x00000100 // TimerB time out masked int stat +#define TIMER_RIS_RTCMIS 0x00000008 // RTC masked int status +#define TIMER_RIS_CAEMIS 0x00000004 // CaptureA event masked int status +#define TIMER_RIS_CAMMIS 0x00000002 // CaptureA match masked int status +#define TIMER_RIS_TATOMIS 0x00000001 // TimerA time out masked int stat + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_ICR register. +// +//***************************************************************************** +#define TIMER_ICR_CBECINT 0x00000400 // CaptureB event interrupt clear +#define TIMER_ICR_CBMCINT 0x00000200 // CaptureB match interrupt clear +#define TIMER_ICR_TBTOCINT 0x00000100 // TimerB time out interrupt clear +#define TIMER_ICR_RTCCINT 0x00000008 // RTC interrupt clear +#define TIMER_ICR_CAECINT 0x00000004 // CaptureA event interrupt clear +#define TIMER_ICR_CAMCINT 0x00000002 // CaptureA match interrupt clear +#define TIMER_ICR_TATOCINT 0x00000001 // TimerA time out interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAILR register. +// +//***************************************************************************** +#define TIMER_TAILR_TAILRH 0xFFFF0000 // TimerB load val in 32 bit mode +#define TIMER_TAILR_TAILRL 0x0000FFFF // TimerA interval load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBILR register. +// +//***************************************************************************** +#define TIMER_TBILR_TBILRL 0x0000FFFF // TimerB interval load value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAMATCHR register. +// +//***************************************************************************** +#define TIMER_TAMATCHR_TAMRH 0xFFFF0000 // TimerB match val in 32 bit mode +#define TIMER_TAMATCHR_TAMRL 0x0000FFFF // TimerA match value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBMATCHR register. +// +//***************************************************************************** +#define TIMER_TBMATCHR_TBMRL 0x0000FFFF // TimerB match load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPR register. +// +//***************************************************************************** +#define TIMER_TNPR_TNPSR 0x0000000F // TimerN prescale value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPMR register. +// +//***************************************************************************** +#define TIMER_TNPMR_TNPSMR 0x0000000F // TimerN prescale match value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAR register. +// +//***************************************************************************** +#define TIMER_TAR_TARH 0xFFFF0000 // TimerB val in 32 bit mode +#define TIMER_TAR_TARL 0x0000FFFF // TimerA value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBR register. +// +//***************************************************************************** +#define TIMER_TBR_TBRL 0x0000FFFF // TimerB value + +#endif // __HW_TIMER_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_types.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_types.h new file mode 100644 index 0000000..a944f66 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_types.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// hw_types.h - Common types and macros. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TYPES_H__ +#define __HW_TYPES_H__ + +//***************************************************************************** +// +// Define a boolean type, and values for true and false. +// +//***************************************************************************** +typedef unsigned char tBoolean; + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +//***************************************************************************** +// +// Macros for hardware access, both direct and via the bit-band region. +// +//***************************************************************************** +#define HWREG(x) \ + (*((volatile unsigned long *)(x))) +#define HWREGBITW(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITH(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITB(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) + +#endif // __HW_TYPES_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_uart.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_uart.h new file mode 100644 index 0000000..40b6ab2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_uart.h @@ -0,0 +1,234 @@ +//***************************************************************************** +// +// hw_uart.h - Macros and defines used when accessing the UART hardware +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_UART_H__ +#define __HW_UART_H__ + +//***************************************************************************** +// +// UART Register Offsets. +// +//***************************************************************************** +#define UART_O_DR 0x00000000 // Data Register +#define UART_O_RSR 0x00000004 // Receive Status Register (read) +#define UART_O_ECR 0x00000004 // Error Clear Register (write) +#define UART_O_FR 0x00000018 // Flag Register (read only) +#define UART_O_IBRD 0x00000024 // Integer Baud Rate Divisor Reg +#define UART_O_FBRD 0x00000028 // Fractional Baud Rate Divisor Reg +#define UART_O_LCR_H 0x0000002C // Line Control Register, HIGH byte +#define UART_O_CTL 0x00000030 // Control Register +#define UART_O_IFLS 0x00000034 // Interrupt FIFO Level Select Reg +#define UART_O_IM 0x00000038 // Interrupt Mask Set/Clear Reg +#define UART_O_RIS 0x0000003C // Raw Interrupt Status Register +#define UART_O_MIS 0x00000040 // Masked Interrupt Status Register +#define UART_O_ICR 0x00000044 // Interrupt Clear Register + +//***************************************************************************** +// +// Data Register bits +// +//***************************************************************************** +#define UART_DR_OE 0x00000800 // Overrun Error +#define UART_DR_BE 0x00000400 // Break Error +#define UART_DR_PE 0x00000200 // Parity Error +#define UART_DR_FE 0x00000100 // Framing Error + +//***************************************************************************** +// +// Receive Status Register bits +// +//***************************************************************************** +#define UART_RSR_OE 0x00000008 // Overrun Error +#define UART_RSR_BE 0x00000004 // Break Error +#define UART_RSR_PE 0x00000002 // Parity Error +#define UART_RSR_FE 0x00000001 // Framing Error + +//***************************************************************************** +// +// Flag Register bits +// +//***************************************************************************** +#define UART_FR_RI 0x100 // Ring Indicator +#define UART_FR_TXFE 0x080 // TX FIFO Empty +#define UART_FR_RXFF 0x040 // RX FIFO Full +#define UART_FR_TXFF 0x020 // TX FIFO Full +#define UART_FR_RXFE 0x010 // RX FIFO Empty +#define UART_FR_BUSY 0x008 // UART Busy + +//***************************************************************************** +// +// Line Control Register High bits +// +//***************************************************************************** +#define UART_LCR_H_SPS 0x80 // Stick Parity Select +#define UART_LCR_H_WLEN 0x60 // Word length +#define UART_LCR_H_WLEN_8 0x60 // 8 bit data +#define UART_LCR_H_WLEN_7 0x40 // 7 bit data +#define UART_LCR_H_WLEN_6 0x20 // 6 bit data +#define UART_LCR_H_WLEN_5 0x00 // 5 bit data +#define UART_LCR_H_FEN 0x10 // Enable FIFO +#define UART_LCR_H_STP2 0x08 // Two Stop Bits Select +#define UART_LCR_H_EPS 0x04 // Even Parity Select +#define UART_LCR_H_PEN 0x02 // Parity Enable +#define UART_LCR_H_BRK 0x01 // Send Break + +//***************************************************************************** +// +// Control Register bits +// +//***************************************************************************** +#define UART_CTL_CTSEN 0x8000 // CTS Hardware Flow Control +#define UART_CTL_RTSEN 0x4000 // RTS Hardware Flow Control +#define UART_CTL_OUT2 0x2000 // OUT2 +#define UART_CTL_OUT1 0x1000 // OUT1 +#define UART_CTL_RTS 0x0800 // Request To Send +#define UART_CTL_DTR 0x0400 // Data Terminal Ready +#define UART_CTL_RXE 0x0200 // Receive Enable +#define UART_CTL_TXE 0x0100 // Transmit Enable +#define UART_CTL_LBE 0x0080 // Loopback Enable +#define UART_CTL_IIRLP 0x0004 // IrDA SIR low power mode +#define UART_CTL_SIREN 0x0002 // SIR Enable +#define UART_CTL_UARTEN 0x0001 // UART Enable + +//***************************************************************************** +// +// Interrupt FIFO Level Select Register bits +// +//***************************************************************************** +#define UART_IFLS_RX1_8 0x00 // 1/8 Full +#define UART_IFLS_RX2_8 0x10 // 1/4 Full +#define UART_IFLS_RX4_8 0x20 // 1/2 Full +#define UART_IFLS_RX6_8 0x30 // 3/4 Full +#define UART_IFLS_RX7_8 0x40 // 7/8 Full +#define UART_IFLS_TX1_8 0x00 // 1/8 Full +#define UART_IFLS_TX2_8 0x01 // 1/4 Full +#define UART_IFLS_TX4_8 0x02 // 1/2 Full +#define UART_IFLS_TX6_8 0x03 // 3/4 Full +#define UART_IFLS_TX7_8 0x04 // 7/8 Full + +//***************************************************************************** +// +// Interrupt Mask Set/Clear Register bits +// +//***************************************************************************** +#define UART_IM_OEIM 0x400 // Overrun Error Interrupt Mask +#define UART_IM_BEIM 0x200 // Break Error Interrupt Mask +#define UART_IM_PEIM 0x100 // Parity Error Interrupt Mask +#define UART_IM_FEIM 0x080 // Framing Error Interrupt Mask +#define UART_IM_RTIM 0x040 // Receive Timeout Interrupt Mask +#define UART_IM_TXIM 0x020 // Transmit Interrupt Mask +#define UART_IM_RXIM 0x010 // Receive Interrupt Mask +#define UART_IM_DSRMIM 0x008 // DSR Interrupt Mask +#define UART_IM_DCDMIM 0x004 // DCD Interrupt Mask +#define UART_IM_CTSMIM 0x002 // CTS Interrupt Mask +#define UART_IM_RIMIM 0x001 // RI Interrupt Mask + +//***************************************************************************** +// +// Raw Interrupt Status Register +// +//***************************************************************************** +#define UART_RIS_OERIS 0x400 // Overrun Error Interrupt Status +#define UART_RIS_BERIS 0x200 // Break Error Interrupt Status +#define UART_RIS_PERIS 0x100 // Parity Error Interrupt Status +#define UART_RIS_FERIS 0x080 // Framing Error Interrupt Status +#define UART_RIS_RTRIS 0x040 // Receive Timeout Interrupt Status +#define UART_RIS_TXRIS 0x020 // Transmit Interrupt Status +#define UART_RIS_RXRIS 0x010 // Receive Interrupt Status +#define UART_RIS_DSRRMIS 0x008 // DSR Interrupt Status +#define UART_RIS_DCDRMIS 0x004 // DCD Interrupt Status +#define UART_RIS_CTSRMIS 0x002 // CTS Interrupt Status +#define UART_RIS_RIRMIS 0x001 // RI Interrupt Status + +//***************************************************************************** +// +// Masked Interrupt Status Register +// +//***************************************************************************** +#define UART_MIS_OEMIS 0x400 // Overrun Error Interrupt Status +#define UART_MIS_BEMIS 0x200 // Break Error Interrupt Status +#define UART_MIS_PEMIS 0x100 // Parity Error Interrupt Status +#define UART_MIS_FEMIS 0x080 // Framing Error Interrupt Status +#define UART_MIS_RTMIS 0x040 // Receive Timeout Interrupt Status +#define UART_MIS_TXMIS 0x020 // Transmit Interrupt Status +#define UART_MIS_RXMIS 0x010 // Receive Interrupt Status +#define UART_MIS_DSRMMIS 0x008 // DSR Interrupt Status +#define UART_MIS_DCDMMIS 0x004 // DCD Interrupt Status +#define UART_MIS_CTSMMIS 0x002 // CTS Interrupt Status +#define UART_MIS_RIMMIS 0x001 // RI Interrupt Status + +//***************************************************************************** +// +// Interrupt Clear Register bits +// +//***************************************************************************** +#define UART_ICR_OEIC 0x200 // Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x200 // Break Error Interrupt Clear +#define UART_ICR_PEIC 0x200 // Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x200 // Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x200 // Receive Timeout Interrupt Clear +#define UART_ICR_TXIC 0x200 // Transmit Interrupt Clear +#define UART_ICR_RXIC 0x200 // Receive Interrupt Clear +#define UART_ICR_DSRMIC 0x200 // DSR Interrupt Clear +#define UART_ICR_DCDMIC 0x200 // DCD Interrupt Clear +#define UART_ICR_CTSMIC 0x200 // CTS Interrupt Clear +#define UART_ICR_RIMIC 0x200 // RI Interrupt Clear + +//***************************************************************************** +// +// DMA Control Register bits +// +//***************************************************************************** +#define UART_DMACRDMAONERR 0x04 // Disable DMA On Error +#define UART_DMACRTXDMAE 0x02 // Enable Transmit DMA +#define UART_DMACRRXDMAE 0x01 // Enable Receive DMA + +#define UART_RSR_ANY (UART_RSR_OE | \ + UART_RSR_BE | \ + UART_RSR_PE | \ + UART_RSR_FE) + +//***************************************************************************** +// +// Reset Values for UART Registers. +// +//***************************************************************************** +#define UART_RV_DR 0 +#define UART_RV_RSR 0x0 +#define UART_RV_ECR 0 +#define UART_RV_FR 0x90 +#define UART_RV_IBRD 0x0000 +#define UART_RV_FBRD 0x00 +#define UART_RV_LCR_H 0x00 +#define UART_RV_CTL 0x0300 +#define UART_RV_IFLS 0x12 +#define UART_RV_IM 0x000 +#define UART_RV_RIS 0x000 +#define UART_RV_MIS 0x000 +#define UART_RV_ICR 0x000 + +#endif // __HW_UART_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_watchdog.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_watchdog.h new file mode 100644 index 0000000..6ae5dff --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/hw_watchdog.h @@ -0,0 +1,99 @@ +//***************************************************************************** +// +// hw_watchdog.h - Macros used when accessing the Watchdog Timer hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_WATCHDOG_H__ +#define __HW_WATCHDOG_H__ + +//***************************************************************************** +// +// The following define the offsets of the Watchdog Timer registers. +// +//***************************************************************************** +#define WDT_O_LOAD 0x00000000 // Load register +#define WDT_O_VALUE 0x00000004 // Current value register +#define WDT_O_CTL 0x00000008 // Control register +#define WDT_O_ICR 0x0000000C // Interrupt clear register +#define WDT_O_RIS 0x00000010 // Raw interrupt status register +#define WDT_O_MIS 0x00000014 // Masked interrupt status register +#define WDT_O_TEST 0x00000418 // Test register +#define WDT_O_CAUSE 0x0000041C // Cause register +#define WDT_O_LOCK 0x00000C00 // Lock register + +//***************************************************************************** +// +// The following define the bit fields in the WDT_CTL register. +// +//***************************************************************************** +#define WDT_CTL_RESEN 0x00000002 // Enable reset output +#define WDT_CTL_INTEN 0x00000001 // Enable the WDT counter and int + +//***************************************************************************** +// +// The following define the bit fields in the WDT_ISR, WDT_RIS, and WDT_MIS +// registers. +// +//***************************************************************************** +#define WDT_INT_TIMEOUT 0x00000001 // Watchdog timer expired + +//***************************************************************************** +// +// The following define the bit fields in the WDT_TEST register. +// +//***************************************************************************** +#define WDT_TEST_STALL_EN 0x00000100 // Watchdog stall enable +#define WDT_TEST_TEST_EN 0x00000001 // Watchdog timer reset int test + +//***************************************************************************** +// +// The following define the bit fields in the WDT_CAUSE register. +// +//***************************************************************************** +#define WDT_CAUSE_WDR 0x00000002 // Watchdog timer reset occurred +#define WDT_CAUSE_WDI 0x00000001 // Watchdog timer int occurred + +//***************************************************************************** +// +// The following define the bit fields in the WDT_LOCK register. +// +//***************************************************************************** +#define WDT_LOCK_LOCKED 0x00000001 // Watchdog timer is locked +#define WDT_LOCK_UNLOCKED 0x00000000 // Watchdog timer is unlocked +#define WDT_LOCK_UNLOCK 0x1ACCE551 // Unlocks the watchdog timer + +//***************************************************************************** +// +// The following define the reset values for the WDT registers. +// +//***************************************************************************** +#define WDT_RV_LOAD 0xFFFFFFFF // Load register +#define WDT_RV_VALUE 0xFFFFFFFF // Current value register +#define WDT_RV_CTL 0x00000000 // Control register +#define WDT_RV_RIS 0x00000000 // Raw interrupt status register +#define WDT_RV_MIS 0x00000000 // Masked interrupt status register +#define WDT_RV_LOCK 0x00000000 // Lock register + +#endif // __HW_WATCHDOG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/i2c.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/i2c.h new file mode 100644 index 0000000..e48c98d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/i2c.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// i2c.h - Prototypes for the I2C Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Interrupt defines. +// +//***************************************************************************** +#define I2C_INT_MASTER 0x00000001 +#define I2C_INT_SLAVE 0x00000002 + +//***************************************************************************** +// +// I2C Master commands. +// +//***************************************************************************** +#define I2C_MASTER_CMD_SINGLE_SEND \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_SINGLE_RECEIVE \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_START \ + (I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_CONT \ + (I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_ERROR_STOP \ + (I2C_MASTER_CS_STOP) +#define I2C_MASTER_CMD_BURST_RECEIVE_START \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_CONT \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) + +//***************************************************************************** +// +// I2C Master error status. +// +//***************************************************************************** +#define I2C_MASTER_ERR_NONE 0 +#define I2C_MASTER_ERR_ADDR_ACK 0x00000004 +#define I2C_MASTER_ERR_DATA_ACK 0x00000008 +#define I2C_MASTER_ERR_ARB_LOST 0x00000010 + +//***************************************************************************** +// +// I2C Slave action requests +// +//***************************************************************************** +#define I2C_SLAVE_ACT_NONE 0 +#define I2C_SLAVE_ACT_RREQ 0x00000001 // Master has sent data +#define I2C_SLAVE_ACT_TREQ 0x00000002 // Master has requested data + +//***************************************************************************** +// Miscellaneous I2C driver definitions. +//***************************************************************************** +#define I2C_MASTER_MAX_RETRIES 1000 // Number of retries + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void I2CIntRegister(unsigned long ulBase, void(fnHandler)(void)); +extern void I2CIntUnregister(unsigned long ulBase); +extern tBoolean I2CMasterBusBusy(unsigned long ulBase); +extern tBoolean I2CMasterBusy(unsigned long ulBase); +extern void I2CMasterControl(unsigned long ulBase, unsigned long ulCmd); +extern unsigned long I2CMasterDataGet(unsigned long ulBase); +extern void I2CMasterDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CMasterDisable(unsigned long ulBase); +extern void I2CMasterEnable(unsigned long ulBase); +extern unsigned long I2CMasterErr(unsigned long ulBase); +extern void I2CMasterInit(unsigned long ulBase, tBoolean bFast); +extern void I2CMasterIntClear(unsigned long ulBase); +extern void I2CMasterIntDisable(unsigned long ulBase); +extern void I2CMasterIntEnable(unsigned long ulBase); +extern tBoolean I2CMasterIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void I2CMasterSlaveAddrSet(unsigned long ulBase, + unsigned char ucSlaveAddr, + tBoolean bReceive); +extern unsigned long I2CSlaveDataGet(unsigned long ulBase); +extern void I2CSlaveDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CSlaveDisable(unsigned long ulBase); +extern void I2CSlaveEnable(unsigned long ulBase); +extern void I2CSlaveInit(unsigned long ulBase, unsigned char ucSlaveAddr); +extern void I2CSlaveIntClear(unsigned long ulBase); +extern void I2CSlaveIntDisable(unsigned long ulBase); +extern void I2CSlaveIntEnable(unsigned long ulBase); +extern tBoolean I2CSlaveIntStatus(unsigned long ulBase, tBoolean bMasked); +extern unsigned long I2CSlaveStatus(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __I2C_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/interrupt.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/interrupt.h new file mode 100644 index 0000000..23424af --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/interrupt.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// interrupt.h - Prototypes for the NVIC Interrupt Controller Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void IntMasterEnable(void); +extern void IntMasterDisable(void); +extern void IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)); +extern void IntUnregister(unsigned long ulInterrupt); +extern void IntPriorityGroupingSet(unsigned long ulBits); +extern unsigned long IntPriorityGroupingGet(void); +extern void IntPrioritySet(unsigned long ulInterrupt, + unsigned char ucPriority); +extern long IntPriorityGet(unsigned long ulInterrupt); +extern void IntEnable(unsigned long ulInterrupt); +extern void IntDisable(unsigned long ulInterrupt); + +#ifdef __cplusplus +} +#endif + +#endif // __INTERRUPT_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/pdc.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/pdc.c new file mode 100644 index 0000000..1e82ed8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/pdc.c @@ -0,0 +1,132 @@ +//***************************************************************************** +// +// pdc.c - Driver for the Peripheral Device Controller (PDC) on the Stellaris +// development board. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup utilities_api +//! @{ +// +//***************************************************************************** + +#include "hw_memmap.h" +#include "hw_types.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "pdc.h" + +//***************************************************************************** +// +//! Initializes the connection to the PDC. +//! +//! This function will enable clocking to the SSI and GPIO A modules, configure +//! the GPIO pins to be used for an SSI interface, and it will configure the +//! SSI as a 1Mb master device, operating in MOTO mode. It will also enable +//! the SSI module, and will enable the chip select for the PDC on the +//! Stellaris development board. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCInit(void) +{ + // + // Enable the peripherals used to drive the PDC. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Configure the appropriate pins to be SSI instead of GPIO. + // + GPIODirModeSet(GPIO_PORTA_BASE, SSI_CLK | SSI_TX | SSI_RX, + GPIO_DIR_MODE_HW); + GPIODirModeSet(GPIO_PORTA_BASE, SSI_CS, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTA_BASE, SSI_CLK, GPIO_STRENGTH_4MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the SSI port. + // + SSIConfig(SSI_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 8); + SSIEnable(SSI_BASE); + + // + // Reset the PDC SSI state machine. The chip select needs to be held low + // for 100ns; the procedure call overhead more than accounts for this time. + // + GPIOPinWrite(GPIO_PORTA_BASE, PDC_CS, 0); + GPIOPinWrite(GPIO_PORTA_BASE, PDC_CS, PDC_CS); +} + +//***************************************************************************** +// +//! Write a PDC register. +//! +//! \param ucAddr specifies the PDC register to write. +//! \param ucData specifies the data to write. +//! +//! This function will perform the SSI transfers required to write a register +//! in the PDC on the Stellaris development board. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCWrite(unsigned char ucAddr, unsigned char ucData) +{ + unsigned long ulTemp; + + // + // Send address and write command. + // + SSIDataPut(SSI_BASE, (ucAddr & 0x0F) | PDC_WR); + + // + // Write the data. + // + SSIDataPut(SSI_BASE, ucData); + + // + // Flush data read during address write. + // + SSIDataGet(SSI_BASE, &ulTemp); + + // + // Flush data read during data write. + // + SSIDataGet(SSI_BASE, &ulTemp); +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/pdc.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/pdc.h new file mode 100644 index 0000000..aba74cd --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/pdc.h @@ -0,0 +1,124 @@ +//***************************************************************************** +// +// pdc.h - Stellaris development board Peripheral Device Controller definitions +// and prototypes. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __PDC_H__ +#define __PDC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The registers within the peripheral device controller. +// +//***************************************************************************** +#define PDC_VER 0x0 // Version register +#define PDC_CSR 0x1 // Command/Status register +#define PDC_DSW 0x4 // DIP Switch register +#define PDC_LED 0x5 // LED register +#define PDC_LCD_CSR 0x6 // LCD Command/Status register +#define PDC_LCD_RAM 0x7 // LCD RAM register +#define PDC_GPXDAT 0x8 // GPIO X Data register +#define PDC_GPXDIR 0x9 // GPIO X Direction register +#define PDC_GPYDAT 0xA // GPIO Y Data register +#define PDC_GPYDIR 0xB // GPIO Y Direction register +#define PDC_GPZDAT 0xC // GPIO Z Data register +#define PDC_GPZDIR 0xD // GPIO Z Direction register + +//***************************************************************************** +// +// Flags indicating a read or write to the peripheral device controller. +// +//***************************************************************************** +#define PDC_RD 0x80 // PDC read command +#define PDC_WR 0x00 // PDC write command + +//***************************************************************************** +// +// LCD panel (Crystalfontz CFAH1602B) commands, RS = 0 +// +//***************************************************************************** +#define LCD_CLEAR 0x01 // Clear display (0 fill DDRAM). +#define LCD_HOME 0x02 // Cursor home. +#define LCD_MODE 0x04 // Set entry mode (cursor dir) +#define LCD_ON 0x08 // Set display, cursor, blinking + // on/off +#define LCD_CUR 0x10 // Cursor, display shift +#define LCD_IF 0x20 // Set interface data length, + // lines, font +#define LCD_CGADDR 0x40 // Set CGRAM AC address +#define LCD_DDADDR 0x80 // Set DDRAM AC address + +//***************************************************************************** +// +// LCD Status bit +// +//***************************************************************************** +#define LCD_B_BUSY 0x80 // Busy flag. + +//***************************************************************************** +// +// The GPIO port A pin numbers for the various SSI signals. +// +//***************************************************************************** +#define SSI_CS GPIO_PIN_3 +#define PDC_CS GPIO_PIN_3 +#define SSI_CLK GPIO_PIN_2 +#define SSI_TX GPIO_PIN_5 +#define SSI_RX GPIO_PIN_4 + +//***************************************************************************** +// +// Function Prototypes +// +//***************************************************************************** +extern void PDCInit(void); +extern unsigned char PDCRead(unsigned char ucAddr); +extern void PDCWrite(unsigned char ucAddr, unsigned char ucData); +extern unsigned char PDCDIPRead(void); +extern void PDCLEDWrite(unsigned char ucLED); +extern unsigned char PDCLEDRead(void); +extern void PDCLCDInit(void); +extern void PDCLCDBacklightOn(void); +extern void PDCLCDBacklightOff(void); +extern void PDCLCDClear(void); +extern void PDCLCDCreateChar(unsigned char ucChar, unsigned char *pucData); +extern void PDCLCDSetPos(unsigned char ucX, unsigned char ucY); +extern void PDCLCDWrite(const char *pcStr, unsigned long ulCount); +extern unsigned char PDCGPIODirRead(unsigned char ucIdx); +extern void PDCGPIODirWrite(unsigned char ucIdx, unsigned char ucValue); +extern unsigned char PDCGPIORead(unsigned char ucIdx); +extern void PDCGPIOWrite(unsigned char ucIdx, unsigned char ucValue); + +#ifdef __cplusplus +} +#endif + +#endif // __PDC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/ssi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/ssi.h new file mode 100644 index 0000000..ef53b34 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/ssi.h @@ -0,0 +1,88 @@ +//***************************************************************************** +// +// ssi.h - Prototypes for the Synchronous Serial Interface Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SSI_H__ +#define __SSI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to SSIIntEnable, SSIIntDisable, and SSIIntClear +// as the ulIntFlags parameter, and returned by SSIIntStatus. +// +//***************************************************************************** +#define SSI_TXFF 0x00000008 // TX FIFO half empty or less +#define SSI_RXFF 0x00000004 // RX FIFO half full or less +#define SSI_RXTO 0x00000002 // RX timeout +#define SSI_RXOR 0x00000001 // RX overrun + +//***************************************************************************** +// +// Values that can be passed to SSIConfig. +// +//***************************************************************************** +#define SSI_FRF_MOTO_MODE_0 0x00000000 // Moto fmt, polarity 0, phase 0 +#define SSI_FRF_MOTO_MODE_1 0x00000002 // Moto fmt, polarity 0, phase 1 +#define SSI_FRF_MOTO_MODE_2 0x00000001 // Moto fmt, polarity 1, phase 0 +#define SSI_FRF_MOTO_MODE_3 0x00000003 // Moto fmt, polarity 1, phase 1 +#define SSI_FRF_TI 0x00000010 // TI frame format +#define SSI_FRF_NMW 0x00000020 // National MicroWire frame format + +#define SSI_MODE_MASTER 0x00000000 // SSI master +#define SSI_MODE_SLAVE 0x00000001 // SSI slave +#define SSI_MODE_SLAVE_OD 0x00000002 // SSI slave with output disabled + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SSIConfig(unsigned long ulBase, unsigned long ulProtocol, + unsigned long ulMode, unsigned long ulBitRate, + unsigned long ulDataWidth); +extern void SSIDataGet(unsigned long ulBase, unsigned long *ulData); +extern long SSIDataNonBlockingGet(unsigned long ulBase, unsigned long *ulData); +extern void SSIDataPut(unsigned long ulBase, unsigned long ulData); +extern long SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData); +extern void SSIDisable(unsigned long ulBase); +extern void SSIEnable(unsigned long ulBase); +extern void SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern unsigned long SSIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void SSIIntUnregister(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __SSI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/sysctl.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/sysctl.h new file mode 100644 index 0000000..2e1d1e4 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/sysctl.h @@ -0,0 +1,221 @@ +//***************************************************************************** +// +// sysctl.h - Prototypes for the system control driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SYSCTL_H__ +#define __SYSCTL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following are values that can be passed to the +// SysCtlPeripheralPresent(), SysCtlPeripheralEnable(), +// SysCtlPeripheralDisable(), and SysCtlPeripheralReset() APIs as the +// ulPeripheral parameter. The peripherals in the fourth group (upper nibble +// is 3) can only be used with the SysCtlPeripheralPresent() API. +// +//***************************************************************************** +#define SYSCTL_PERIPH_WDOG 0x00000008 // Watchdog +#define SYSCTL_PERIPH_UART0 0x10000001 // UART 0 +#define SYSCTL_PERIPH_SSI 0x10000010 // SSI +#define SYSCTL_PERIPH_I2C 0x10001000 // I2C +#define SYSCTL_PERIPH_TIMER0 0x10010000 // Timer 0 +#define SYSCTL_PERIPH_TIMER1 0x10020000 // Timer 1 +#define SYSCTL_PERIPH_COMP0 0x11000000 // Analog comparator 0 +#define SYSCTL_PERIPH_COMP1 0x12000000 // Analog comparator 1 +#define SYSCTL_PERIPH_GPIOA 0x20000001 // GPIO A +#define SYSCTL_PERIPH_GPIOB 0x20000002 // GPIO B +#define SYSCTL_PERIPH_GPIOC 0x20000004 // GPIO C +#define SYSCTL_PERIPH_PLL 0x30000010 // PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPinPresent() API +// as the ulPin parameter. +// +//***************************************************************************** +#define SYSCTL_PIN_C0MINUS 0x00000040 // C0- pin +#define SYSCTL_PIN_C0PLUS 0x00000080 // C0+ pin +#define SYSCTL_PIN_C0O 0x00000100 // C0o pin +#define SYSCTL_PIN_C1MINUS 0x00000200 // C1- pin +#define SYSCTL_PIN_CCP0 0x01000000 // CCP0 pin +#define SYSCTL_PIN_CCP1 0x02000000 // CCP1 pin +#define SYSCTL_PIN_32KHZ 0x80000000 // 32kHz pin + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOSet() API as +// the ulVoltage value, or returned by the SysCtlLDOGet() API. +// +//***************************************************************************** +#define SYSCTL_LDO_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDO_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDO_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDO_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDO_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDO_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDO_2_55V 0x0000001f // LDO output of 2.55V +#define SYSCTL_LDO_2_60V 0x0000001e // LDO output of 2.60V +#define SYSCTL_LDO_2_65V 0x0000001d // LDO output of 2.65V +#define SYSCTL_LDO_2_70V 0x0000001c // LDO output of 2.70V +#define SYSCTL_LDO_2_75V 0x0000001b // LDO output of 2.75V + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOConfigSet() API. +// +//***************************************************************************** +#define SYSCTL_LDOCFG_ARST 0x00000001 // Allow LDO failure to reset +#define SYSCTL_LDOCFG_NORST 0x00000000 // Do not reset on LDO failure + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlIntEnable(), +// SysCtlIntDisable(), and SysCtlIntClear() APIs, or returned in the bit mask +// by the SysCtlIntStatus() API. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_BOSC_FAIL 0x00000010 // Boot oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlResetCauseClear() +// API or returned by the SysCtlResetCauseGet() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_LDO 0x00000020 // LDO power not OK reset +#define SYSCTL_CAUSE_SW 0x00000010 // Software reset +#define SYSCTL_CAUSE_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_CAUSE_BOR 0x00000004 // Brown-out reset +#define SYSCTL_CAUSE_POR 0x00000002 // Power on reset +#define SYSCTL_CAUSE_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlBrownOutConfigSet() +// API as the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_BOR_RESET 0x00000002 // Reset instead of interrupting +#define SYSCTL_BOR_RESAMPLE 0x00000001 // Resample BOR before asserting + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlClockSet() API as +// the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_SYSDIV_1 0x07800000 // Processor clock is osc/pll /1 +#define SYSCTL_SYSDIV_2 0x00C00000 // Processor clock is osc/pll /2 +#define SYSCTL_SYSDIV_3 0x01400000 // Processor clock is osc/pll /3 +#define SYSCTL_SYSDIV_4 0x01C00000 // Processor clock is osc/pll /4 +#define SYSCTL_SYSDIV_5 0x02400000 // Processor clock is osc/pll /5 +#define SYSCTL_SYSDIV_6 0x02C00000 // Processor clock is osc/pll /6 +#define SYSCTL_SYSDIV_7 0x03400000 // Processor clock is osc/pll /7 +#define SYSCTL_SYSDIV_8 0x03C00000 // Processor clock is osc/pll /8 +#define SYSCTL_SYSDIV_9 0x04400000 // Processor clock is osc/pll /9 +#define SYSCTL_SYSDIV_10 0x04C00000 // Processor clock is osc/pll /10 +#define SYSCTL_SYSDIV_11 0x05400000 // Processor clock is osc/pll /11 +#define SYSCTL_SYSDIV_12 0x05C00000 // Processor clock is osc/pll /12 +#define SYSCTL_SYSDIV_13 0x06400000 // Processor clock is osc/pll /13 +#define SYSCTL_SYSDIV_14 0x06C00000 // Processor clock is osc/pll /14 +#define SYSCTL_SYSDIV_15 0x07400000 // Processor clock is osc/pll /15 +#define SYSCTL_SYSDIV_16 0x07C00000 // Processor clock is osc/pll /16 +#define SYSCTL_USE_PLL 0x00000000 // System clock is the PLL clock +#define SYSCTL_USE_OSC 0x00003800 // System clock is the osc clock +#define SYSCTL_XTAL_3_57MHZ 0x00000100 // External crystal is 3.579545MHz +#define SYSCTL_XTAL_3_68MHZ 0x00000140 // External crystal is 3.6864MHz +#define SYSCTL_XTAL_4MHZ 0x00000180 // External crystal is 4MHz +#define SYSCTL_XTAL_4_09MHZ 0x000001C0 // External crystal is 4.096MHz +#define SYSCTL_XTAL_4_91MHZ 0x00000200 // External crystal is 4.9152MHz +#define SYSCTL_XTAL_5MHZ 0x00000240 // External crystal is 5MHz +#define SYSCTL_XTAL_5_12MHZ 0x00000280 // External crystal is 5.12MHz +#define SYSCTL_XTAL_6MHZ 0x000002C0 // External crystal is 6MHz +#define SYSCTL_XTAL_6_14MHZ 0x00000300 // External crystal is 6.144MHz +#define SYSCTL_XTAL_7_37MHZ 0x00000340 // External crystal is 7.3728MHz +#define SYSCTL_XTAL_8MHZ 0x00000380 // External crystal is 8MHz +#define SYSCTL_XTAL_8_19MHZ 0x000003C0 // External crystal is 8.192MHz +#define SYSCTL_OSC_MAIN 0x00000000 // Oscillator source is main osc +#define SYSCTL_OSC_BOOT 0x00000010 // Oscillator source is boot osc +#define SYSCTL_OSC_BOOT4 0x00000020 // Oscillator source is boot osc /4 +#define SYSCTL_BOOT_OSC_DIS 0x00000002 // Disable boot oscillator +#define SYSCTL_MAIN_OSC_DIS 0x00000001 // Disable main oscillator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long SysCtlSRAMSizeGet(void); +extern unsigned long SysCtlFlashSizeGet(void); +extern tBoolean SysCtlPinPresent(unsigned long ulPin); +extern tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral); +extern void SysCtlPeripheralReset(unsigned long ulPeripheral); +extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralClockGating(tBoolean bEnable); +extern void SysCtlIntRegister(void (*pfnHandler)(void)); +extern void SysCtlIntUnregister(void); +extern void SysCtlIntEnable(unsigned long ulInts); +extern void SysCtlIntDisable(unsigned long ulInts); +extern void SysCtlIntClear(unsigned long ulInts); +extern unsigned long SysCtlIntStatus(tBoolean bMasked); +extern void SysCtlLDOSet(unsigned long ulVoltage); +extern unsigned long SysCtlLDOGet(void); +extern void SysCtlLDOConfigSet(unsigned long ulConfig); +extern void SysCtlReset(void); +extern void SysCtlSleep(void); +extern void SysCtlDeepSleep(void); +extern unsigned long SysCtlResetCauseGet(void); +extern void SysCtlResetCauseClear(unsigned long ulCauses); +extern void SysCtlBrownOutConfigSet(unsigned long ulConfig, + unsigned long ulDelay); +extern void SysCtlClockSet(unsigned long ulConfig); +extern unsigned long SysCtlClockGet(void); +extern void SysCtlBOSCVerificationSet(tBoolean bEnable); +extern void SysCtlMOSCVerificationSet(tBoolean bEnable); +extern void SysCtlPLLVerificationSet(tBoolean bEnable); +extern void SysCtlClkVerificationClear(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSCTL_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/systick.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/systick.h new file mode 100644 index 0000000..4f70259 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/systick.h @@ -0,0 +1,53 @@ +//***************************************************************************** +// +// systick.h - Prototypes for the SysTick driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SYSTICK_H__ +#define __SYSTICK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SysTickEnable(void); +extern void SysTickDisable(void); +extern void SysTickIntRegister(void (*pfnHandler)(void)); +extern void SysTickIntUnregister(void); +extern void SysTickPeriodSet(unsigned long ulPeriod); +extern unsigned long SysTickPeriodGet(void); +extern unsigned long SysTickValueGet(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSTICK_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/timer.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/timer.h new file mode 100644 index 0000000..306b141 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000F // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000F00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerB time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/uart.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/uart.h new file mode 100644 index 0000000..ea39859 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/uart.h @@ -0,0 +1,102 @@ +//***************************************************************************** +// +// uart.h - Defines and Macros for the UART. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __UART_H__ +#define __UART_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to UARTIntEnable, UARTIntDisable, and UARTIntClear +// as the ulIntFlags parameter, and returned from UARTIntStatus. +// +//***************************************************************************** +#define UART_INT_OE 0x400 // Overrun Error Interrupt Mask +#define UART_INT_BE 0x200 // Break Error Interrupt Mask +#define UART_INT_PE 0x100 // Parity Error Interrupt Mask +#define UART_INT_FE 0x080 // Framing Error Interrupt Mask +#define UART_INT_RT 0x040 // Receive Timeout Interrupt Mask +#define UART_INT_TX 0x020 // Transmit Interrupt Mask +#define UART_INT_RX 0x010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Values that can be passed to UARTConfigSet as the ulConfig parameter and +// returned by UARTConfigGet in the pulConfig parameter. Additionally, the +// UART_CONFIG_PAR_* subset can be passed to UARTParityModeSet as the ulParity +// parameter, and are returned by UARTParityModeGet. +// +//***************************************************************************** +#define UART_CONFIG_WLEN_8 0x00000060 // 8 bit data +#define UART_CONFIG_WLEN_7 0x00000040 // 7 bit data +#define UART_CONFIG_WLEN_6 0x00000020 // 6 bit data +#define UART_CONFIG_WLEN_5 0x00000000 // 5 bit data +#define UART_CONFIG_STOP_ONE 0x00000000 // One stop bit +#define UART_CONFIG_STOP_TWO 0x00000008 // Two stop bits +#define UART_CONFIG_PAR_NONE 0x00000000 // No parity +#define UART_CONFIG_PAR_EVEN 0x00000006 // Even parity +#define UART_CONFIG_PAR_ODD 0x00000002 // Odd parity +#define UART_CONFIG_PAR_ONE 0x00000086 // Parity bit is one +#define UART_CONFIG_PAR_ZERO 0x00000082 // Parity bit is zero + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity); +extern unsigned long UARTParityModeGet(unsigned long ulBase); +extern void UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig); +extern void UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig); +extern void UARTEnable(unsigned long ulBase); +extern void UARTDisable(unsigned long ulBase); +extern tBoolean UARTCharsAvail(unsigned long ulBase); +extern tBoolean UARTSpaceAvail(unsigned long ulBase); +extern long UARTCharNonBlockingGet(unsigned long ulBase); +extern long UARTCharGet(unsigned long ulBase); +extern tBoolean UARTCharNonBlockingPut(unsigned long ulBase, + unsigned char ucData); +extern void UARTCharPut(unsigned long ulBase, unsigned char ucData); +extern void UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState); +extern void UARTIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void UARTIntUnregister(unsigned long ulBase); +extern void UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __UART_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/watchdog.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/watchdog.h new file mode 100644 index 0000000..2a82b72 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_Rowley/hw_include/watchdog.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// watchdog.h - Prototypes for the Watchdog Timer API +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 523 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __WATCHDOG_H__ +#define __WATCHDOG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern tBoolean WatchdogRunning(unsigned long ulBase); +extern void WatchdogEnable(unsigned long ulBase); +extern void WatchdogResetEnable(unsigned long ulBase); +extern void WatchdogResetDisable(unsigned long ulBase); +extern void WatchdogLock(unsigned long ulBase); +extern void WatchdogUnlock(unsigned long ulBase); +extern tBoolean WatchdogLockState(unsigned long ulBase); +extern void WatchdogReloadSet(unsigned long ulBase, unsigned long ulLoadVal); +extern unsigned long WatchdogReloadGet(unsigned long ulBase); +extern unsigned long WatchdogValueGet(unsigned long ulBase); +extern void WatchdogIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void WatchdogIntUnregister(unsigned long ulBase); +extern void WatchdogIntEnable(unsigned long ulBase); +extern unsigned long WatchdogIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void WatchdogIntClear(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __WATCHDOG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/FreeRTOSConfig.h new file mode 100644 index 0000000..5e1e8a5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/FreeRTOSConfig.h @@ -0,0 +1,115 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 80 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 3000 ) ) +#define configMAX_TASK_NAME_LEN ( 3 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 0 +#define INCLUDE_uxTaskPriorityGet 0 +#define INCLUDE_vTaskDelete 0 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelay 1 + +#define configKERNEL_INTERRUPT_PRIORITY 255 +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xa0, or priority 5. */ + + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/LM3S316.icf b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/LM3S316.icf new file mode 100644 index 0000000..2c39cba --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/LM3S316.icf @@ -0,0 +1,58 @@ +//***************************************************************************** +// +// boot_demo1.icf - Linker configuration file for boot_demo1. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// Luminary Micro Confidential - For Use Under NDA Only +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x00003fff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20000fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Initicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/ParTest/ParTest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/ParTest/ParTest.c new file mode 100644 index 0000000..6c5d592 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/ParTest/ParTest.c @@ -0,0 +1,145 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + + +#include "FreeRTOS.h" +#include "task.h" +#include "partest.h" + +#include "pdc.h" + +#define partstPINS (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 Z | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7) + +#define partstALL_OUTPUTS_OFF ( ( unsigned char ) 0x00 ) +#define partstMAX_OUTPUT_LED ( ( unsigned char ) 8 ) + +static volatile unsigned char ucOutputValue = partstALL_OUTPUTS_OFF; + +void vParTestInitialise( void ) +{ + PDCInit(); + PDCWrite( PDC_LED, ucOutputValue ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ +unsigned char ucBit = ( unsigned char ) 1; + + vTaskSuspendAll(); + { + if( uxLED < partstMAX_OUTPUT_LED ) + { + ucBit = ( ( unsigned char ) 1 ) << uxLED; + + if( xValue == pdFALSE ) + { + ucBit ^= ( unsigned char ) 0xff; + ucOutputValue &= ucBit; + } + else + { + ucOutputValue |= ucBit; + } + + PDCWrite( PDC_LED, ucOutputValue ); + } + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vParTestToggleLED( unsigned portBASE_TYPE uxLED ) +{ +unsigned char ucBit; + + vTaskSuspendAll(); + { + if( uxLED < partstMAX_OUTPUT_LED ) + { + ucBit = ( ( unsigned char ) 1 ) << uxLED; + + if( ucOutputValue & ucBit ) + { + ucOutputValue &= ~ucBit; + } + else + { + ucOutputValue |= ucBit; + } + + PDCWrite( PDC_LED, ucOutputValue ); + } + } + xTaskResumeAll(); +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.ewd b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.ewd new file mode 100644 index 0000000..731a5bb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.ewd @@ -0,0 +1,879 @@ + + + + 2 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 1 + 1 + 1 + + + + + + + + + JLINK_ID + 2 + + 13 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + MACRAIGOR_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + PEMICRO_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + STLINK_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\MQX\MQXRtosPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Quadros\Quadros_EWB6_Plugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\FreeRTOS\FreeRTOSPlugin.ewplugin + 0 + + + $EW_DIR$\common\plugins\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.ewp b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.ewp new file mode 100644 index 0000000..530a98f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.ewp @@ -0,0 +1,961 @@ + + + + 2 + + Debug + + ARM + + 1 + + General + 3 + + 21 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 13 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Demo Source + + $PROJ_DIR$\commstest.c + + + $PROJ_DIR$\..\Common\Minimal\crflash.c + + + $PROJ_DIR$\main.c + + + $PROJ_DIR$\ParTest\ParTest.c + + + $PROJ_DIR$\registertest.s + + + + FreeRTOS Source + + $PROJ_DIR$\..\..\Source\croutine.c + + + $PROJ_DIR$\..\..\Source\portable\MemMang\heap_1.c + + + $PROJ_DIR$\..\..\Source\list.c + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\port.c + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portasm.s + + + $PROJ_DIR$\..\..\Source\queue.c + + + $PROJ_DIR$\..\..\Source\tasks.c + + + + Luminary Code + + $PROJ_DIR$\hw_include\cspy.c + + + $PROJ_DIR$\hw_include\pdc.c + + + $PROJ_DIR$\hw_include\startup.c + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.eww b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.eww new file mode 100644 index 0000000..239a938 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/RTOSDemo.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\RTOSDemo.ewp + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/commstest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/commstest.c new file mode 100644 index 0000000..59ac650 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/commstest.c @@ -0,0 +1,325 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * The comms test Rx and Tx task and co-routine. See the comments at the top + * of main.c for full information. + */ + + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "croutine.h" + +/* Demo application include files. */ +#include "partest.h" + +/* Library include files. */ +#include "DriverLib.h" + +/* The LED's toggled by the various tasks. */ +#define commsFAIL_LED ( 7 ) +#define commsRX_LED ( 6 ) +#define commsTX_LED ( 5 ) + +/* The length of the queue used to pass received characters to the Comms Rx +task. */ +#define commsRX_QUEUE_LEN ( 5 ) + +/* The baud rate used by the UART comms tasks/co-routine. */ +#define commsBAUD_RATE ( 57600 ) + +/* FIFO setting for the UART. The FIFO is not used to create a better test. */ +#define commsFIFO_SET ( 0x10 ) + +/* The string that is transmitted on the UART contains sequentially the +characters from commsFIRST_TX_CHAR to commsLAST_TX_CHAR. */ +#define commsFIRST_TX_CHAR '0' +#define commsLAST_TX_CHAR 'z' + +/* Just used to walk through the program memory in order that some random data +can be generated. */ +#define commsTOTAL_PROGRAM_MEMORY ( ( unsigned long * ) ( 8 * 1024 ) ) +#define commsFIRST_PROGRAM_BYTES ( ( unsigned long * ) 4 ) + +/* The time between transmissions of the string on UART 0. This is pseudo +random in order to generate a bit or randomness to when the interrupts occur.*/ +#define commsMIN_TX_DELAY ( 40 / portTICK_RATE_MS ) +#define commsMAX_TX_DELAY ( ( portTickType ) 0x7f ) +#define commsOFFSET_TIME ( ( portTickType ) 3 ) + +/* The time the Comms Rx task should wait to receive a character. This should +be slightly longer than the time between transmissions. If we do not receive +a character after this time then there must be an error in the transmission or +the timing of the transmission. */ +#define commsRX_DELAY ( commsMAX_TX_DELAY + 20 ) + + +static unsigned portBASE_TYPE uxCommsErrorStatus = pdPASS; + +/* The queue used to pass characters out of the ISR. */ +static xQueueHandle xCommsQueue; + +/* The next character to transmit. */ +static char cNextChar; + +/*-----------------------------------------------------------*/ + +void vSerialInit( void ) +{ + /* Create the queue used to communicate between the UART ISR and the Comms + Rx task. */ + xCommsQueue = xQueueCreate( commsRX_QUEUE_LEN, sizeof( char ) ); + + /* Enable the UART. GPIOA has already been initialised. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + + /* Set GPIO A0 and A1 as peripheral function. They are used to output the + UART signals. */ + GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW ); + + /* Configure the UART for 8-N-1 operation. */ + UARTConfigSetExpClk( UART0_BASE, SysCtlClockGet(), commsBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE ); + + /* We dont want to use the fifo. This is for test purposes to generate + as many interrupts as possible. */ + HWREG( UART0_BASE + UART_O_LCR_H ) &= ~commsFIFO_SET; + + /* Enable both Rx and Tx interrupts. */ + HWREG( UART0_BASE + UART_O_IM ) |= ( UART_INT_TX | UART_INT_RX ); + IntPrioritySet( INT_UART0, configKERNEL_INTERRUPT_PRIORITY ); + IntEnable( INT_UART0 ); +} +/*-----------------------------------------------------------*/ + +void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +portTickType xDelayPeriod; +static unsigned long *pulRandomBytes = commsFIRST_PROGRAM_BYTES; + + /* Co-routine MUST start with a call to crSTART. */ + crSTART( xHandle ); + + for(;;) + { + /* Was the previously transmitted string received correctly? */ + if( uxCommsErrorStatus != pdPASS ) + { + /* An error was encountered so set the error LED. */ + vParTestSetLED( commsFAIL_LED, pdTRUE ); + } + + /* The next character to Tx is the first in the string. */ + cNextChar = commsFIRST_TX_CHAR; + + UARTIntDisable( UART0_BASE, UART_INT_TX ); + { + /* Send the first character. */ + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + + /* Move the variable to the char to Tx on so the ISR transmits + the next character in the string once this one has completed. */ + cNextChar++; + } + UARTIntEnable(UART0_BASE, UART_INT_TX); + + /* Toggle the LED to show a new string is being transmitted. */ + vParTestToggleLED( commsTX_LED ); + + /* Delay before we start the string off again. A pseudo-random delay + is used as this will provide a better test. */ + xDelayPeriod = xTaskGetTickCount() + ( *pulRandomBytes ); + + pulRandomBytes++; + if( pulRandomBytes > commsTOTAL_PROGRAM_MEMORY ) + { + pulRandomBytes = commsFIRST_PROGRAM_BYTES; + } + + /* Make sure we don't wait too long... */ + xDelayPeriod &= commsMAX_TX_DELAY; + + /* ...but we do want to wait. */ + if( xDelayPeriod < commsMIN_TX_DELAY ) + { + xDelayPeriod = commsMIN_TX_DELAY; + } + + /* Block for the random(ish) time. */ + crDELAY( xHandle, xDelayPeriod ); + } + + /* Co-routine MUST end with a call to crEND. */ + crEND(); +} +/*-----------------------------------------------------------*/ + +void vUART_ISR( void ) +{ +unsigned long ulStatus; +char cRxedChar; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* What caused the interrupt. */ + ulStatus = UARTIntStatus( UART0_BASE, pdTRUE ); + + /* Clear the interrupt. */ + UARTIntClear( UART0_BASE, ulStatus ); + + /* Was an Rx interrpt pending? */ + if( ulStatus & UART_INT_RX ) + { + if( ( HWREG(UART0_BASE + UART_O_FR ) & UART_FR_RXFF ) ) + { + /* Get the char from the buffer and post it onto the queue of + Rxed chars. Posting the character should wake the task that is + blocked on the queue waiting for characters. */ + cRxedChar = ( char ) HWREG( UART0_BASE + UART_O_DR ); + xQueueSendFromISR( xCommsQueue, &cRxedChar, &xHigherPriorityTaskWoken ); + } + } + + /* Was a Tx interrupt pending? */ + if( ulStatus & UART_INT_TX ) + { + /* Send the next character in the string. We are not using the FIFO. */ + if( cNextChar <= commsLAST_TX_CHAR ) + { + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = cNextChar; + } + cNextChar++; + } + } + + /* If a task was woken by the character being received then we force + a context switch to occur in case the task is of higher priority than + the currently executing task (i.e. the task that this interrupt + interrupted.) */ + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + +void vCommsRxTask( void * pvParameters ) +{ +static char cRxedChar, cExpectedChar; + + /* Set the char we expect to receive to the start of the string. */ + cExpectedChar = commsFIRST_TX_CHAR; + + for( ;; ) + { + /* Wait for a character to be received. */ + xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, commsRX_DELAY ); + + /* Was the character recived (if any) the expected character. */ + if( cRxedChar != cExpectedChar ) + { + /* Got an unexpected character. This can sometimes occur when + reseting the system using the debugger leaving characters already + in the UART regsters. */ + uxCommsErrorStatus = pdFAIL; + + /* Resync by waiting for the end of the current string. */ + while( cRxedChar != commsLAST_TX_CHAR ) + { + while( !xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, portMAX_DELAY ) ); + } + + /* The next expected character is the start of the string again. */ + cExpectedChar = commsFIRST_TX_CHAR; + } + else + { + if( cExpectedChar == commsLAST_TX_CHAR ) + { + /* We have reached the end of the string - we now expect to + receive the first character in the string again. The LED is + toggled to indicate that the entire string was received without + error. */ + vParTestToggleLED( commsRX_LED ); + cExpectedChar = commsFIRST_TX_CHAR; + } + else + { + /* We got the expected character, we now expect to receive the + next character in the string. */ + cExpectedChar++; + } + } + } +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxGetCommsStatus( void ) +{ + return uxCommsErrorStatus; +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/commstest.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/commstest.h new file mode 100644 index 0000000..6fbc6f4 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/commstest.h @@ -0,0 +1,87 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef COMMS_TEST_H +#define COMMS_TEST_H + +/* + * Initialisation routine for the UART. + */ +void vSerialInit( void ); + +/* + * The task that receives the characters from UART 0. + */ +void vCommsRxTask( void * pvParameters ); + +/* + * The co-routine that periodically initiates the transmission of the string on + * the UART. + */ +void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +unsigned portBASE_TYPE uxGetCommsStatus( void ); + +#endif diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/DriverLib.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/DriverLib.h new file mode 100644 index 0000000..6374ddc --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/DriverLib.h @@ -0,0 +1,22 @@ +#ifndef INCLUDE_DRIVER_LIB_H +#define INCLUDE_DRIVER_LIB_H + +#include "hw_ints.h" +#include "hw_uart.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "hw_nvic.h" +#include "hw_ssi.h" +#include "hw_i2c.h" +#include "hw_adc.h" + +#include "gpio.h" +#include "interrupt.h" +#include "sysctl.h" +#include "uart.h" +#include "ssi.h" +#include "pdc.h" +#include "i2c.h" +#include "adc.h" + +#endif diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/EULA.txt b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/EULA.txt new file mode 100644 index 0000000..cba31f7 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/EULA.txt @@ -0,0 +1,126 @@ +IMPORTANT. Read the following LMI Software License Agreement ("Agreement") +completely. + +LUMINARY MICRO SOFTWARE LICENSE AGREEMENT + + This is a legal agreement between you (either as an individual or as an +authorized representative of your employer) and Luminary Micro, Inc. ("LMI"). +It concerns your rights to use this file and any accompanying written materials +(the "Software"). In consideration for LMI allowing you to access the +Software, you are agreeing to be bound by the terms of this Agreement. If you +do not agree to all of the terms of this Agreement, do not download or use the +Software. If you change your mind later, stop using the Software and delete +all copies of the Software in your possession or control. Any copies of the +Software that you have already distributed, where permitted, and do not destroy +will continue to be governed by this Agreement. Your prior use will also +continue to be governed by this Agreement. + +1. LICENSE GRANT. LMI grants to you, free of charge, the non-exclusive, +non-transferable right (1) to use the Software, (2) to reproduce the Software, +(3) to prepare derivative works of the Software, (4) to distribute the Software +and derivative works thereof in source (human-readable) form and object +(machine-readable) form, and (5) to sublicense to others the right to use the +distributed Software. If you violate any of the terms or restrictions of this +Agreement, LMI may immediately terminate this Agreement, and require that you +stop using and delete all copies of the Software in your possession or control. + +2. COPYRIGHT. The Software is licensed to you, not sold. LMI owns the +Software, and United States copyright laws and international treaty provisions +protect the Software. Therefore, you must treat the Software like any other +copyrighted material (e.g. a book or musical recording). You may not use or +copy the Software for any other purpose than what is described in this +Agreement. Except as expressly provided herein, LMI does not grant to you any +express or implied rights under any LMI or third-party patents, copyrights, +trademarks, or trade secrets. Additionally, you must reproduce and apply any +copyright or other proprietary rights notices included on or embedded in the +Software to any copies or derivative works made thereof, in whole or in part, +if any. + +3. SUPPORT. LMI is NOT obligated to provide any support, upgrades or new +releases of the Software. If you wish, you may contact LMI and report problems +and provide suggestions regarding the Software. LMI has no obligation +whatsoever to respond in any way to such a problem report or suggestion. LMI +may make changes to the Software at any time, without any obligation to notify +or provide updated versions of the Software to you. + +4. INDEMNITY. You agree to fully defend and indemnify LMI from any and +all claims, liabilities, and costs (including reasonable attorney’s fees) +related to (1) your use (including your sub-licensee’s use, if permitted) of +the Software or (2) your violation of the terms and conditions of this +Agreement. + +5. HIGH RISK ACTIVITIES. You acknowledge that the Software is not fault +tolerant and is not designed, manufactured or intended by LMI for incorporation +into products intended for use or resale in on-line control equipment in +hazardous, dangerous to life or potentially life-threatening environments +requiring fail-safe performance, such as in the operation of nuclear +facilities, aircraft navigation or communication systems, air traffic control, +direct life support machines or weapons systems, in which the failure of +products could lead directly to death, personal injury or severe physical or +environmental damage ("High Risk Activities"). You specifically represent and +warrant that you will not use the Software or any derivative work of the +Software for High Risk Activities. + +6. PRODUCT LABELING. You are not authorized to use any LMI trademarks, +brand names, or logos. + +7. COMPLIANCE WITH LAWS; EXPORT RESTRICTIONS. You must use the Software +in accordance with all applicable U.S. laws, regulations and statutes. You +agree that neither you nor your licensees (if any) intend to or will, directly +or indirectly, export or transmit the Software to any country in violation of +U.S. export restrictions. + +8. GOVERNMENT USE. Use of the Software and any corresponding +documentation, if any, is provided with RESTRICTED RIGHTS. Use, duplication or +disclosure by the Government is subject to restrictions as set forth in +subparagraph (c)(1)(ii) of The Rights in Technical Data and Computer Software +clause at DFARS 252.227-7013 or subparagraphs (c)(l) and (2) of the Commercial +Computer Software--Restricted Rights at 48 CFR 52.227-19, as applicable. +Manufacturer is Luminary Micro, Inc., 2499 S. Capital of Texas Hwy Ste A-100, +Austin, Texas 78746. + +9. DISCLAIMER OF WARRANTY. TO THE MAXIMUM EXTENT PERMITTED BY LAW, LMI +EXPRESSLY DISCLAIMS ANY WARRANTY FOR THE SOFTWARE. THE SOFTWARE IS PROVIDED +"AS IS", WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, +WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, OR NON-INFRINGEMENT. YOU ASSUME THE ENTIRE RISK ARISING +OUT OF THE USE OR PERFORMANCE OF THE SOFTWARE, OR ANY SYSTEMS YOU DESIGN USING +THE SOFTWARE (IF ANY). NOTHING IN THIS AGREEMENT MAY BE CONSTRUED AS A +WARRANTY OR REPRESENTATION BY LMI THAT THE SOFTWARE OR ANY DERIVATIVE WORK +DEVELOPED WITH OR INCORPORATING THE SOFTWARE WILL BE FREE FROM INFRINGEMENT OF +THE INTELLECTUAL PROPERTY RIGHTS OF THIRD PARTIES. + +10. LIMITATION OF LIABILITY. IN NO EVENT WILL LMI BE LIABLE, WHETHER IN +CONTRACT, TORT, OR OTHERWISE, FOR ANY INCIDENTAL, SPECIAL, INDIRECT, +CONSEQUENTIAL OR PUNITIVE DAMAGES, INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR +ANY LOSS OF USE, LOSS OF TIME, INCONVENIENCE, COMMERCIAL LOSS, OR LOST PROFITS, +SAVINGS, OR REVENUES TO THE FULL EXTENT SUCH MAY BE DISCLAIMED BY LAW. + +11. CHOICE OF LAW; VENUE; LIMITATIONS. You agree that the statutes and +laws of the United States and the State of Texas, USA, without regard to +conflicts of laws principles, will apply to all matters relating to this +Agreement or the Software, and you agree that any litigation will be subject to +the exclusive jurisdiction of the state or federal courts in Austin, Travis +County, Texas, USA. You agree that regardless of any statute or law to the +contrary, any claim or cause of action arising out of or related to this +Agreement or the Software must be filed within one (1) year after such claim or +cause of action arose or be forever barred. + +12. ENTIRE AGREEMENT. This Agreement constitutes the entire agreement +between you and LMI regarding the subject matter of this Agreement, and +supersedes all prior communications, negotiations, understandings, agreements +or representations, either written or oral, if any. This Agreement may only be +amended in written form, executed by you and LMI. + +13. SEVERABILITY. If any provision of this Agreement is held for any +reason to be invalid or unenforceable, then the remaining provisions of this +Agreement will be unimpaired and, unless a modification or replacement of the +invalid or unenforceable provision is further held to deprive you or LMI of a +material benefit, in which case the Agreement will immediately terminate, the +invalid or unenforceable provision will be replaced with a provision that is +valid and enforceable and that comes closest to the intention underlying the +invalid or unenforceable provision. + +14. NO WAIVER. The waiver by LMI of any breach of any provision of this +Agreement will not operate or be construed as a waiver of any other or a +subsequent breach of the same or a different provision. diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/adc.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/adc.h new file mode 100644 index 0000000..1825664 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/adc.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// adc.h - ADC headers for using the ADC driver functions. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __ADC_H__ +#define __ADC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceConfigure as the ulTrigger +// parameter. +// +//***************************************************************************** +#define ADC_TRIGGER_PROCESSOR 0x00000000 // Processor event +#define ADC_TRIGGER_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_TRIGGER_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_TRIGGER_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_TRIGGER_EXTERNAL 0x00000004 // External event +#define ADC_TRIGGER_TIMER 0x00000005 // Timer event +#define ADC_TRIGGER_PWM0 0x00000006 // PWM0 event +#define ADC_TRIGGER_PWM1 0x00000007 // PWM1 event +#define ADC_TRIGGER_PWM2 0x00000008 // PWM2 event +#define ADC_TRIGGER_ALWAYS 0x0000000F // Always event + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceStepConfigure as the ulConfig +// parameter. +// +//***************************************************************************** +#define ADC_CTL_TS 0x00000080 // Temperature sensor select +#define ADC_CTL_IE 0x00000040 // Interrupt enable +#define ADC_CTL_END 0x00000020 // Sequence end select +#define ADC_CTL_D 0x00000010 // Differential select +#define ADC_CTL_CH0 0x00000000 // Input channel 0 +#define ADC_CTL_CH1 0x00000001 // Input channel 1 +#define ADC_CTL_CH2 0x00000002 // Input channel 2 +#define ADC_CTL_CH3 0x00000003 // Input channel 3 + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ADCIntRegister(unsigned long ulBase, unsigned long ulSequenceNum, + void (*pfnHandler)(void)); +extern void ADCIntUnregister(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCIntDisable(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCIntEnable(unsigned long ulBase, unsigned long ulSequenceNum); +extern unsigned long ADCIntStatus(unsigned long ulBase, + unsigned long ulSequenceNum, + tBoolean bMasked); +extern void ADCIntClear(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCSequenceEnable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceDisable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulTrigger, + unsigned long ulPriority); +extern void ADCSequenceStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern long ADCSequenceOverflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceUnderflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer); +extern void ADCProcessorTrigger(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSoftwareOversampleConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulFactor); +extern void ADCSoftwareOversampleStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern void ADCSoftwareOversampleDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer, + unsigned long ulCount); + +#ifdef __cplusplus +} +#endif + +#endif // __ADC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/asmdefs.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/asmdefs.h new file mode 100644 index 0000000..4a1018a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/asmdefs.h @@ -0,0 +1,130 @@ +//***************************************************************************** +// +// asmdefs.h - Macros to allow assembly code be portable among toolchains. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __ASMDEFS_H__ +#define __ASMDEFS_H__ + +//***************************************************************************** +// +// The defines required for EW-ARM. +// +//***************************************************************************** +#ifdef ewarm + +// +// Section headers. +// +#define __TEXT__ rseg CODE:CODE(2) +#define __DATA__ rseg DATA:DATA(2) +#define __BSS__ rseg DATA:DATA(2) + +// +// Assembler nmenonics. +// +#define __ALIGN__ alignrom 4 +#define __END__ end +#define __EXPORT__ export +#define __IMPORT__ import +#define __LABEL__ +#define __STR__ dcb +#define __THUMB_LABEL__ +#define __WORD__ dcd + +#endif // ewarm + +//***************************************************************************** +// +// The defines required for GCC. +// +//***************************************************************************** +#ifdef gcc + +// +// The assembly code preamble required to put the assembler into the correct +// configuration. +// + .syntax unified + .thumb + +// +// Section headers. +// +#define __TEXT__ .text +#define __DATA__ .data +#define __BSS__ .bss + +// +// Assembler nmenonics. +// +#define __ALIGN__ .balign 4 +#define __END__ .end +#define __EXPORT__ .globl +#define __IMPORT__ .extern +#define __LABEL__ : +#define __STR__ .ascii +#define __THUMB_LABEL__ .thumb_func +#define __WORD__ .word + +#endif // gcc + +//***************************************************************************** +// +// The defines required for RV-MDK. +// +//***************************************************************************** +#ifdef rvmdk + +// +// The assembly code preamble required to put the assembler into the correct +// configuration. +// + thumb + require8 + preserve8 + +// +// Section headers. +// +#define __TEXT__ area ||.text||, code, readonly, align=2 +#define __DATA__ area ||.data||, data, align=2 +#define __BSS__ area ||.bss||, noinit, align=2 + +// +// Assembler nmenonics. +// +#define __ALIGN__ align 4 +#define __END__ end +#define __EXPORT__ export +#define __IMPORT__ import +#define __LABEL__ +#define __STR__ dcb +#define __THUMB_LABEL__ +#define __WORD__ dcd + +#endif // rvmdk + +#endif // __ASMDEF_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/comp.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/comp.h new file mode 100644 index 0000000..19eda38 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/comp.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// comp.h - Prototypes for the analog comparator driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __COMP_H__ +#define __COMP_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ComparatorConfigure() as the ulConfig +// parameter. For each group (i.e. COMP_TRIG_xxx, COMP_INT_xxx, etc.), one of +// the values may be selected and ORed together will values from the other +// groups. +// +//***************************************************************************** +#define COMP_TRIG_NONE 0x00000000 // No ADC trigger +#define COMP_TRIG_HIGH 0x00000880 // Trigger when high +#define COMP_TRIG_LOW 0x00000800 // Trigger when low +#define COMP_TRIG_FALL 0x00000820 // Trigger on falling edge +#define COMP_TRIG_RISE 0x00000840 // Trigger on rising edge +#define COMP_TRIG_BOTH 0x00000860 // Trigger on both edges +#define COMP_INT_HIGH 0x00000010 // Interrupt when high +#define COMP_INT_LOW 0x00000000 // Interrupt when low +#define COMP_INT_FALL 0x00000004 // Interrupt on falling edge +#define COMP_INT_RISE 0x00000008 // Interrupt on rising edge +#define COMP_INT_BOTH 0x0000000C // Interrupt on both edges +#define COMP_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_OUTPUT_NONE 0x00000000 // No comparator output +#define COMP_OUTPUT_NORMAL 0x00000100 // Comparator output normal +#define COMP_OUTPUT_INVERT 0x00000102 // Comparator output inverted + +//***************************************************************************** +// +// Values that can be passed to ComparatorSetRef() as the ulRef parameter. +// +//***************************************************************************** +#define COMP_REF_OFF 0x00000000 // Turn off the internal reference +#define COMP_REF_0V 0x00000300 // Internal reference of 0V +#define COMP_REF_0_1375V 0x00000301 // Internal reference of 0.1375V +#define COMP_REF_0_275V 0x00000302 // Internal reference of 0.275V +#define COMP_REF_0_4125V 0x00000303 // Internal reference of 0.4125V +#define COMP_REF_0_55V 0x00000304 // Internal reference of 0.55V +#define COMP_REF_0_6875V 0x00000305 // Internal reference of 0.6875V +#define COMP_REF_0_825V 0x00000306 // Internal reference of 0.825V +#define COMP_REF_0_928125V 0x00000201 // Internal reference of 0.928125V +#define COMP_REF_0_9625V 0x00000307 // Internal reference of 0.9625V +#define COMP_REF_1_03125V 0x00000202 // Internal reference of 1.03125V +#define COMP_REF_1_134375V 0x00000203 // Internal reference of 1.134375V +#define COMP_REF_1_1V 0x00000308 // Internal reference of 1.1V +#define COMP_REF_1_2375V 0x00000309 // Internal reference of 1.2375V +#define COMP_REF_1_340625V 0x00000205 // Internal reference of 1.340625V +#define COMP_REF_1_375V 0x0000030A // Internal reference of 1.375V +#define COMP_REF_1_44375V 0x00000206 // Internal reference of 1.44375V +#define COMP_REF_1_5125V 0x0000030B // Internal reference of 1.5125V +#define COMP_REF_1_546875V 0x00000207 // Internal reference of 1.546875V +#define COMP_REF_1_65V 0x0000030C // Internal reference of 1.65V +#define COMP_REF_1_753125V 0x00000209 // Internal reference of 1.753125V +#define COMP_REF_1_7875V 0x0000030D // Internal reference of 1.7875V +#define COMP_REF_1_85625V 0x0000020A // Internal reference of 1.85625V +#define COMP_REF_1_925V 0x0000030E // Internal reference of 1.925V +#define COMP_REF_1_959375V 0x0000020B // Internal reference of 1.959375V +#define COMP_REF_2_0625V 0x0000030F // Internal reference of 2.0625V +#define COMP_REF_2_165625V 0x0000020D // Internal reference of 2.165625V +#define COMP_REF_2_26875V 0x0000020E // Internal reference of 2.26875V +#define COMP_REF_2_371875V 0x0000020F // Internal reference of 2.371875V + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ComparatorConfigure(unsigned long ulBase, unsigned long ulComp, + unsigned long ulConfig); +extern void ComparatorRefSet(unsigned long ulBase, unsigned long ulRef); +extern tBoolean ComparatorValueGet(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntRegister(unsigned long ulBase, unsigned long ulComp, + void (*pfnHandler)(void)); +extern void ComparatorIntUnregister(unsigned long ulBase, + unsigned long ulComp); +extern void ComparatorIntEnable(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntDisable(unsigned long ulBase, unsigned long ulComp); +extern tBoolean ComparatorIntStatus(unsigned long ulBase, unsigned long ulComp, + tBoolean bMasked); +extern void ComparatorIntClear(unsigned long ulBase, unsigned long ulComp); + +#ifdef __cplusplus +} +#endif + +#endif // __COMP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/cpu.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/cpu.h new file mode 100644 index 0000000..0a2e282 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/cpu.h @@ -0,0 +1,40 @@ +//***************************************************************************** +// +// cpu.h - Prototypes for the CPU instruction wrapper functions. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __CPU_H__ +#define __CPU_H__ + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern void CPUcpsid(void); +extern void CPUcpsie(void); +extern void CPUwfi(void); + +#endif // __CPU_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/cspy.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/cspy.c new file mode 100644 index 0000000..398ae59 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/cspy.c @@ -0,0 +1,119 @@ +//***************************************************************************** +// +// cspy.c - Routines for simply ignoring the debugger communciation APIs in +// C-Spy for now. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#include "diag.h" + +//***************************************************************************** +// +// Open a handle for stdio functions (both stdin and stdout). +// +//***************************************************************************** +int +DiagOpenStdio(void) +{ + return(-1); +} + +//***************************************************************************** +// +// Open a host file system file. +// +//***************************************************************************** +int +DiagOpen(const char *pcName, int iMode) +{ + return(-1); +} + +//***************************************************************************** +// +// Close a host file system file. +// +//***************************************************************************** +int +DiagClose(int iHandle) +{ + return(-1); +} + +//***************************************************************************** +// +// Write data to a host file system file. +// +//***************************************************************************** +int +DiagWrite(int iHandle, const char *pcBuf, unsigned long ulLen, int iMode) +{ + return(-1); +} + +//***************************************************************************** +// +// Read data from a host file system file. +// +//***************************************************************************** +int +DiagRead(int iHandle, char *pcBuf, unsigned long ulLen, int iMode) +{ + return(-1); +} + +//***************************************************************************** +// +// Get the length of a host file system file. +// +//***************************************************************************** +long +DiagFlen(int iHandle) +{ + return(-1); +} + +//***************************************************************************** +// +// Terminate the application. +// +//***************************************************************************** +void +DiagExit(int iRet) +{ + while(1) + { + } +} + +//***************************************************************************** +// +// Get the command line arguments from the debugger. +// +//***************************************************************************** +char * +DiagCommandString(char *pcBuf, unsigned long ulLen) +{ + return(0); +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/debug.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/debug.h new file mode 100644 index 0000000..83dbbf3 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/debug.h @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// debug.h - Macros for assisting debug of the driver library. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +//***************************************************************************** +// +// Prototype for the function that is called when an invalid argument is passed +// to an API. This is only used when doing a DEBUG build. +// +//***************************************************************************** +extern void __error__(char *pcFilename, unsigned long ulLine); + +//***************************************************************************** +// +// The ASSERT macro, which does the actual assertion checking. Typically, this +// will be for procedure arguments. +// +//***************************************************************************** +#ifdef DEBUG +#define ASSERT(expr) { \ + if(!(expr)) \ + { \ + __error__(__FILE__, __LINE__); \ + } \ + } +#else +#define ASSERT(expr) +#endif + +#endif // __DEBUG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/diag.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/diag.h new file mode 100644 index 0000000..5eda186 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/diag.h @@ -0,0 +1,67 @@ +//***************************************************************************** +// +// diag.h - Prototypes for the diagnostic functions. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __DIAG_H__ +#define __DIAG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed as the iMode parater to DiagOpen, DiagRead, and +// DiagWrite. +// +//***************************************************************************** +#define OPEN_R 0 // read access +#define OPEN_W 4 // write access +#define OPEN_A 8 // append to file +#define OPEN_B 1 // binary access +#define OPEN_PLUS 2 // read and write access + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern int DiagOpenStdio(void); +extern int DiagOpen(const char *pcName, int iMode); +extern int DiagClose(int iHandle); +extern int DiagWrite(int iHandle, const char *pcBuf, unsigned long ulLen, + int iMode); +extern int DiagRead(int iHandle, char *pcBuf, unsigned long ulLen, int iMode); +extern long DiagFlen(int iHandle); +extern void DiagExit(int iRet); +extern char *DiagCommandString(char *pcBuf, unsigned long ulLen); + +#ifdef __cplusplus +} +#endif + +#endif // __DIAG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/driverlib.r79 b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/driverlib.r79 new file mode 100644 index 0000000..3ea9f15 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/driverlib.r79 differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/flash.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/flash.h new file mode 100644 index 0000000..7220276 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/flash.h @@ -0,0 +1,75 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/gpio.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/gpio.h new file mode 100644 index 0000000..598fec8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/gpio.h @@ -0,0 +1,136 @@ +//***************************************************************************** +// +// gpio.h - Defines and Macros for GPIO API. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following values define the bit field for the ucPins argument to several +// of the APIs. +// +//***************************************************************************** +#define GPIO_PIN_0 0x00000001 // GPIO pin 0 +#define GPIO_PIN_1 0x00000002 // GPIO pin 1 +#define GPIO_PIN_2 0x00000004 // GPIO pin 2 +#define GPIO_PIN_3 0x00000008 // GPIO pin 3 +#define GPIO_PIN_4 0x00000010 // GPIO pin 4 +#define GPIO_PIN_5 0x00000020 // GPIO pin 5 +#define GPIO_PIN_6 0x00000040 // GPIO pin 6 +#define GPIO_PIN_7 0x00000080 // GPIO pin 7 + +//***************************************************************************** +// +// Values that can be passed to GPIODirModeSet as the ulPinIO parameter, and +// returned from GPIODirModeGet. +// +//***************************************************************************** +#define GPIO_DIR_MODE_IN 0x00000000 // Pin is a GPIO input +#define GPIO_DIR_MODE_OUT 0x00000001 // Pin is a GPIO output +#define GPIO_DIR_MODE_HW 0x00000002 // Pin is a peripheral function + +//***************************************************************************** +// +// Values that can be passed to GPIOIntTypeSet as the ulIntType parameter, and +// returned from GPIOIntTypeGet. +// +//***************************************************************************** +#define GPIO_FALLING_EDGE 0x00000000 // Interrupt on falling edge +#define GPIO_RISING_EDGE 0x00000004 // Interrupt on rising edge +#define GPIO_BOTH_EDGES 0x00000001 // Interrupt on both edges +#define GPIO_LOW_LEVEL 0x00000002 // Interrupt on low level +#define GPIO_HIGH_LEVEL 0x00000007 // Interrupt on high level + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulStrength parameter, +// and returned by GPIOPadConfigGet in the *pulStrength parameter. +// +//***************************************************************************** +#define GPIO_STRENGTH_2MA 0x00000001 // 2mA drive strength +#define GPIO_STRENGTH_4MA 0x00000002 // 4mA drive strength +#define GPIO_STRENGTH_8MA 0x00000004 // 8mA drive strength +#define GPIO_STRENGTH_8MA_SC 0x0000000C // 8mA drive with slew rate control + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulPadType parameter, +// and returned by GPIOPadConfigGet in the *pulPadType parameter. +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x00000008 // Push-pull +#define GPIO_PIN_TYPE_STD_WPU 0x0000000A // Push-pull with weak pull-up +#define GPIO_PIN_TYPE_STD_WPD 0x0000000C // Push-pull with weak pull-down +#define GPIO_PIN_TYPE_OD 0x00000009 // Open-drain +#define GPIO_PIN_TYPE_OD_WPU 0x0000000B // Open-drain with weak pull-up +#define GPIO_PIN_TYPE_OD_WPD 0x0000000D // Open-drain with weak pull-down +#define GPIO_PIN_TYPE_ANALOG 0x00000000 // Analog comparator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO); +extern unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType); +extern unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, + unsigned long ulPadType); +extern void GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, + unsigned long *pulPadType); +extern void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins); +extern long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked); +extern void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPortIntRegister(unsigned long ulPort, + void (*pfIntHandler)(void)); +extern void GPIOPortIntUnregister(unsigned long ulPort); +extern long GPIOPinRead(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, + unsigned char ucVal); +extern void GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypePWM(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins); + +#ifdef __cplusplus +} +#endif + +#endif // __GPIO_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_adc.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_adc.h new file mode 100644 index 0000000..36b8204 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_adc.h @@ -0,0 +1,329 @@ +//***************************************************************************** +// +// hw_adc.h - Macros used when accessing the ADC hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ADC_H__ +#define __HW_ADC_H__ + +//***************************************************************************** +// +// The following define the offsets of the ADC registers. +// +//***************************************************************************** +#define ADC_O_ACTSS 0x00000000 // Active sample register +#define ADC_O_RIS 0x00000004 // Raw interrupt status register +#define ADC_O_IM 0x00000008 // Interrupt mask register +#define ADC_O_ISC 0x0000000C // Interrupt status/clear register +#define ADC_O_OSTAT 0x00000010 // Overflow status register +#define ADC_O_EMUX 0x00000014 // Event multiplexer select reg. +#define ADC_O_USTAT 0x00000018 // Underflow status register +#define ADC_O_SSPRI 0x00000020 // Channel priority register +#define ADC_O_PSSI 0x00000028 // Processor sample initiate reg. +#define ADC_O_SSMUX0 0x00000040 // Multiplexer select 0 register +#define ADC_O_SSCTL0 0x00000044 // Sample sequence control 0 reg. +#define ADC_O_SSFIFO0 0x00000048 // Result FIFO 0 register +#define ADC_O_SSFSTAT0 0x0000004C // FIFO 0 status register +#define ADC_O_SSMUX1 0x00000060 // Multiplexer select 1 register +#define ADC_O_SSCTL1 0x00000064 // Sample sequence control 1 reg. +#define ADC_O_SSFIFO1 0x00000068 // Result FIFO 1 register +#define ADC_O_SSFSTAT1 0x0000006C // FIFO 1 status register +#define ADC_O_SSMUX2 0x00000080 // Multiplexer select 2 register +#define ADC_O_SSCTL2 0x00000084 // Sample sequence control 2 reg. +#define ADC_O_SSFIFO2 0x00000088 // Result FIFO 2 register +#define ADC_O_SSFSTAT2 0x0000008C // FIFO 2 status register +#define ADC_O_SSMUX3 0x000000A0 // Multiplexer select 3 register +#define ADC_O_SSCTL3 0x000000A4 // Sample sequence control 3 reg. +#define ADC_O_SSFIFO3 0x000000A8 // Result FIFO 3 register +#define ADC_O_SSFSTAT3 0x000000AC // FIFO 3 status register +#define ADC_O_TMLB 0x00000100 // Test mode loopback register + +//***************************************************************************** +// +// The following define the offsets of the ADC sequence registers. +// +//***************************************************************************** +#define ADC_O_SEQ 0x00000040 // Offset to the first sequence +#define ADC_O_SEQ_STEP 0x00000020 // Increment to the next sequence +#define ADC_O_X_SSMUX 0x00000000 // Multiplexer select register +#define ADC_O_X_SSCTL 0x00000004 // Sample sequence control register +#define ADC_O_X_SSFIFO 0x00000008 // Result FIFO register +#define ADC_O_X_SSFSTAT 0x0000000C // FIFO status register + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ACTSS register. +// +//***************************************************************************** +#define ADC_ACTSS_ASEN3 0x00000008 // Sample sequence 3 enable +#define ADC_ACTSS_ASEN2 0x00000004 // Sample sequence 2 enable +#define ADC_ACTSS_ASEN1 0x00000002 // Sample sequence 1 enable +#define ADC_ACTSS_ASEN0 0x00000001 // Sample sequence 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the ADC_RIS register. +// +//***************************************************************************** +#define ADC_RIS_INR3 0x00000008 // Sample sequence 3 interrupt +#define ADC_RIS_INR2 0x00000004 // Sample sequence 2 interrupt +#define ADC_RIS_INR1 0x00000002 // Sample sequence 1 interrupt +#define ADC_RIS_INR0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_IM register. +// +//***************************************************************************** +#define ADC_IM_MASK3 0x00000008 // Sample sequence 3 mask +#define ADC_IM_MASK2 0x00000004 // Sample sequence 2 mask +#define ADC_IM_MASK1 0x00000002 // Sample sequence 1 mask +#define ADC_IM_MASK0 0x00000001 // Sample sequence 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ISC register. +// +//***************************************************************************** +#define ADC_ISC_IN3 0x00000008 // Sample sequence 3 interrupt +#define ADC_ISC_IN2 0x00000004 // Sample sequence 2 interrupt +#define ADC_ISC_IN1 0x00000002 // Sample sequence 1 interrupt +#define ADC_ISC_IN0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_OSTAT register. +// +//***************************************************************************** +#define ADC_OSTAT_OV3 0x00000008 // Sample sequence 3 overflow +#define ADC_OSTAT_OV2 0x00000004 // Sample sequence 2 overflow +#define ADC_OSTAT_OV1 0x00000002 // Sample sequence 1 overflow +#define ADC_OSTAT_OV0 0x00000001 // Sample sequence 0 overflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_EMUX register. +// +//***************************************************************************** +#define ADC_EMUX_EM3_MASK 0x0000F000 // Event mux 3 mask +#define ADC_EMUX_EM3_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM3_COMP0 0x00001000 // Analog comparator 0 event +#define ADC_EMUX_EM3_COMP1 0x00002000 // Analog comparator 1 event +#define ADC_EMUX_EM3_COMP2 0x00003000 // Analog comparator 2 event +#define ADC_EMUX_EM3_EXTERNAL 0x00004000 // External event +#define ADC_EMUX_EM3_TIMER 0x00005000 // Timer event +#define ADC_EMUX_EM3_PWM0 0x00006000 // PWM0 event +#define ADC_EMUX_EM3_PWM1 0x00007000 // PWM1 event +#define ADC_EMUX_EM3_PWM2 0x00008000 // PWM2 event +#define ADC_EMUX_EM3_ALWAYS 0x0000F000 // Always event +#define ADC_EMUX_EM2_MASK 0x00000F00 // Event mux 2 mask +#define ADC_EMUX_EM2_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM2_COMP0 0x00000100 // Analog comparator 0 event +#define ADC_EMUX_EM2_COMP1 0x00000200 // Analog comparator 1 event +#define ADC_EMUX_EM2_COMP2 0x00000300 // Analog comparator 2 event +#define ADC_EMUX_EM2_EXTERNAL 0x00000400 // External event +#define ADC_EMUX_EM2_TIMER 0x00000500 // Timer event +#define ADC_EMUX_EM2_PWM0 0x00000600 // PWM0 event +#define ADC_EMUX_EM2_PWM1 0x00000700 // PWM1 event +#define ADC_EMUX_EM2_PWM2 0x00000800 // PWM2 event +#define ADC_EMUX_EM2_ALWAYS 0x00000F00 // Always event +#define ADC_EMUX_EM1_MASK 0x000000F0 // Event mux 1 mask +#define ADC_EMUX_EM1_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM1_COMP0 0x00000010 // Analog comparator 0 event +#define ADC_EMUX_EM1_COMP1 0x00000020 // Analog comparator 1 event +#define ADC_EMUX_EM1_COMP2 0x00000030 // Analog comparator 2 event +#define ADC_EMUX_EM1_EXTERNAL 0x00000040 // External event +#define ADC_EMUX_EM1_TIMER 0x00000050 // Timer event +#define ADC_EMUX_EM1_PWM0 0x00000060 // PWM0 event +#define ADC_EMUX_EM1_PWM1 0x00000070 // PWM1 event +#define ADC_EMUX_EM1_PWM2 0x00000080 // PWM2 event +#define ADC_EMUX_EM1_ALWAYS 0x000000F0 // Always event +#define ADC_EMUX_EM0_MASK 0x0000000F // Event mux 0 mask +#define ADC_EMUX_EM0_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM0_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_EMUX_EM0_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_EMUX_EM0_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_EMUX_EM0_EXTERNAL 0x00000004 // External event +#define ADC_EMUX_EM0_TIMER 0x00000005 // Timer event +#define ADC_EMUX_EM0_PWM0 0x00000006 // PWM0 event +#define ADC_EMUX_EM0_PWM1 0x00000007 // PWM1 event +#define ADC_EMUX_EM0_PWM2 0x00000008 // PWM2 event +#define ADC_EMUX_EM0_ALWAYS 0x0000000F // Always event +#define ADC_EMUX_EM0_SHIFT 0 // The shift for the first event +#define ADC_EMUX_EM1_SHIFT 4 // The shift for the second event +#define ADC_EMUX_EM2_SHIFT 8 // The shift for the third event +#define ADC_EMUX_EM3_SHIFT 12 // The shift for the fourth event + +//***************************************************************************** +// +// The following define the bit fields in the ADC_USTAT register. +// +//***************************************************************************** +#define ADC_USTAT_UV3 0x00000008 // Sample sequence 3 underflow +#define ADC_USTAT_UV2 0x00000004 // Sample sequence 2 underflow +#define ADC_USTAT_UV1 0x00000002 // Sample sequence 1 underflow +#define ADC_USTAT_UV0 0x00000001 // Sample sequence 0 underflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSPRI register. +// +//***************************************************************************** +#define ADC_SSPRI_SS3_MASK 0x00003000 // Sequencer 3 priority mask +#define ADC_SSPRI_SS3_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS3_2ND 0x00001000 // Second priority +#define ADC_SSPRI_SS3_3RD 0x00002000 // Third priority +#define ADC_SSPRI_SS3_4TH 0x00003000 // Fourth priority +#define ADC_SSPRI_SS2_MASK 0x00000300 // Sequencer 2 priority mask +#define ADC_SSPRI_SS2_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS2_2ND 0x00000100 // Second priority +#define ADC_SSPRI_SS2_3RD 0x00000200 // Third priority +#define ADC_SSPRI_SS2_4TH 0x00000300 // Fourth priority +#define ADC_SSPRI_SS1_MASK 0x00000030 // Sequencer 1 priority mask +#define ADC_SSPRI_SS1_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS1_2ND 0x00000010 // Second priority +#define ADC_SSPRI_SS1_3RD 0x00000020 // Third priority +#define ADC_SSPRI_SS1_4TH 0x00000030 // Fourth priority +#define ADC_SSPRI_SS0_MASK 0x00000003 // Sequencer 0 priority mask +#define ADC_SSPRI_SS0_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS0_2ND 0x00000001 // Second priority +#define ADC_SSPRI_SS0_3RD 0x00000002 // Third priority +#define ADC_SSPRI_SS0_4TH 0x00000003 // Fourth priority + +//***************************************************************************** +// +// The following define the bit fields in the ADC_PSSI register. +// +//***************************************************************************** +#define ADC_PSSI_SS3 0x00000008 // Trigger sample sequencer 3 +#define ADC_PSSI_SS2 0x00000004 // Trigger sample sequencer 2 +#define ADC_PSSI_SS1 0x00000002 // Trigger sample sequencer 1 +#define ADC_PSSI_SS0 0x00000001 // Trigger sample sequencer 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSMUX0, ADC_SSMUX1, +// ADC_SSMUX2, and ADC_SSMUX3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSMUX_MUX7_MASK 0x30000000 // 8th mux select mask +#define ADC_SSMUX_MUX6_MASK 0x03000000 // 7th mux select mask +#define ADC_SSMUX_MUX5_MASK 0x00300000 // 6th mux select mask +#define ADC_SSMUX_MUX4_MASK 0x00030000 // 5th mux select mask +#define ADC_SSMUX_MUX3_MASK 0x00003000 // 4th mux select mask +#define ADC_SSMUX_MUX2_MASK 0x00000300 // 3rd mux select mask +#define ADC_SSMUX_MUX1_MASK 0x00000030 // 2nd mux select mask +#define ADC_SSMUX_MUX0_MASK 0x00000003 // 1st mux select mask +#define ADC_SSMUX_MUX7_SHIFT 28 +#define ADC_SSMUX_MUX6_SHIFT 24 +#define ADC_SSMUX_MUX5_SHIFT 20 +#define ADC_SSMUX_MUX4_SHIFT 16 +#define ADC_SSMUX_MUX3_SHIFT 12 +#define ADC_SSMUX_MUX2_SHIFT 8 +#define ADC_SSMUX_MUX1_SHIFT 4 +#define ADC_SSMUX_MUX0_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSCTL0, ADC_SSCTL1, +// ADC_SSCTL2, and ADC_SSCTL3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSCTL_TS7 0x80000000 // 8th temperature sensor select +#define ADC_SSCTL_IE7 0x40000000 // 8th interrupt enable +#define ADC_SSCTL_END7 0x20000000 // 8th sequence end select +#define ADC_SSCTL_D7 0x10000000 // 8th differential select +#define ADC_SSCTL_TS6 0x08000000 // 7th temperature sensor select +#define ADC_SSCTL_IE6 0x04000000 // 7th interrupt enable +#define ADC_SSCTL_END6 0x02000000 // 7th sequence end select +#define ADC_SSCTL_D6 0x01000000 // 7th differential select +#define ADC_SSCTL_TS5 0x00800000 // 6th temperature sensor select +#define ADC_SSCTL_IE5 0x00400000 // 6th interrupt enable +#define ADC_SSCTL_END5 0x00200000 // 6th sequence end select +#define ADC_SSCTL_D5 0x00100000 // 6th differential select +#define ADC_SSCTL_TS4 0x00080000 // 5th temperature sensor select +#define ADC_SSCTL_IE4 0x00040000 // 5th interrupt enable +#define ADC_SSCTL_END4 0x00020000 // 5th sequence end select +#define ADC_SSCTL_D4 0x00010000 // 5th differential select +#define ADC_SSCTL_TS3 0x00008000 // 4th temperature sensor select +#define ADC_SSCTL_IE3 0x00004000 // 4th interrupt enable +#define ADC_SSCTL_END3 0x00002000 // 4th sequence end select +#define ADC_SSCTL_D3 0x00001000 // 4th differential select +#define ADC_SSCTL_TS2 0x00000800 // 3rd temperature sensor select +#define ADC_SSCTL_IE2 0x00000400 // 3rd interrupt enable +#define ADC_SSCTL_END2 0x00000200 // 3rd sequence end select +#define ADC_SSCTL_D2 0x00000100 // 3rd differential select +#define ADC_SSCTL_TS1 0x00000080 // 2nd temperature sensor select +#define ADC_SSCTL_IE1 0x00000040 // 2nd interrupt enable +#define ADC_SSCTL_END1 0x00000020 // 2nd sequence end select +#define ADC_SSCTL_D1 0x00000010 // 2nd differential select +#define ADC_SSCTL_TS0 0x00000008 // 1st temperature sensor select +#define ADC_SSCTL_IE0 0x00000004 // 1st interrupt enable +#define ADC_SSCTL_END0 0x00000002 // 1st sequence end select +#define ADC_SSCTL_D0 0x00000001 // 1st differential select + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFIFO0, ADC_SSFIFO1, +// ADC_SSFIFO2, and ADC_SSFIFO3 registers. +// +//***************************************************************************** +#define ADC_SSFIFO_DATA_MASK 0x000003FF // Sample data +#define ADC_SSFIFO_DATA_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFSTAT0, ADC_SSFSTAT1, +// ADC_SSFSTAT2, and ADC_SSFSTAT3 registers. +// +//***************************************************************************** +#define ADC_SSFSTAT_FULL 0x00001000 // FIFO is full +#define ADC_SSFSTAT_EMPTY 0x00000100 // FIFO is empty +#define ADC_SSFSTAT_HPTR 0x000000F0 // FIFO head pointer +#define ADC_SSFSTAT_TPTR 0x0000000F // FIFO tail pointer + +//***************************************************************************** +// +// The following define the bit fields in the ADC_TMLB register. +// +//***************************************************************************** +#define ADC_TMLB_LB 0x00000001 // Loopback control signals + +//***************************************************************************** +// +// The following define the bit fields in the loopback ADC data. +// +//***************************************************************************** +#define ADC_LB_CNT_MASK 0x000003C0 // Sample counter mask +#define ADC_LB_CONT 0x00000020 // Continuation sample +#define ADC_LB_DIFF 0x00000010 // Differential sample +#define ADC_LB_TS 0x00000008 // Temperature sensor sample +#define ADC_LB_MUX_MASK 0x00000007 // Input channel number mask +#define ADC_LB_CNT_SHIFT 6 // Sample counter shift +#define ADC_LB_MUX_SHIFT 0 // Input channel number shift + +#endif // __HW_ADC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_comp.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_comp.h new file mode 100644 index 0000000..02487e6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_comp.h @@ -0,0 +1,118 @@ +//***************************************************************************** +// +// hw_comp.h - Macros used when accessing the comparator hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_COMP_H__ +#define __HW_COMP_H__ + +//***************************************************************************** +// +// The following define the offsets of the comparator registers. +// +//***************************************************************************** +#define COMP_O_MIS 0x00000000 // Interrupt status register +#define COMP_O_RIS 0x00000004 // Raw interrupt status register +#define COMP_O_INTEN 0x00000008 // Interrupt enable register +#define COMP_O_REFCTL 0x00000010 // Reference voltage control reg. +#define COMP_O_ACSTAT0 0x00000020 // Comp0 status register +#define COMP_O_ACCTL0 0x00000024 // Comp0 control register +#define COMP_O_ACSTAT1 0x00000040 // Comp1 status register +#define COMP_O_ACCTL1 0x00000044 // Comp1 control register +#define COMP_O_ACSTAT2 0x00000060 // Comp2 status register +#define COMP_O_ACCTL2 0x00000064 // Comp2 control register + +//***************************************************************************** +// +// The following define the bit fields in the COMP_MIS, COMP_RIS, and +// COMP_INTEN registers. +// +//***************************************************************************** +#define COMP_INT_2 0x00000004 // Comp2 interrupt +#define COMP_INT_1 0x00000002 // Comp1 interrupt +#define COMP_INT_0 0x00000001 // Comp0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the COMP_REFCTL register. +// +//***************************************************************************** +#define COMP_REFCTL_EN 0x00000200 // Reference voltage enable +#define COMP_REFCTL_RNG 0x00000100 // Reference voltage range +#define COMP_REFCTL_VREF_MASK 0x0000000F // Reference voltage select mask +#define COMP_REFCTL_VREF_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACSTAT0, COMP_ACSTAT1, and +// COMP_ACSTAT2 registers. +// +//***************************************************************************** +#define COMP_ACSTAT_OVAL 0x00000002 // Comparator output value + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACCTL0, COMP_ACCTL1, and +// COMP_ACCTL2 registers. +// +//***************************************************************************** +#define COMP_ACCTL_TMASK 0x00000800 // Trigger enable +#define COMP_ACCTL_ASRCP_MASK 0x00000600 // Vin+ source select mask +#define COMP_ACCTL_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ACCTL_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ACCTL_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_ACCTL_ASRCP_RES 0x00000600 // Reserved +#define COMP_ACCTL_OEN 0x00000100 // Comparator output enable +#define COMP_ACCTL_TSVAL 0x00000080 // Trigger polarity select +#define COMP_ACCTL_TSEN_MASK 0x00000060 // Trigger sense mask +#define COMP_ACCTL_TSEN_LEVEL 0x00000000 // Trigger is level sense +#define COMP_ACCTL_TSEN_FALL 0x00000020 // Trigger is falling edge +#define COMP_ACCTL_TSEN_RISE 0x00000040 // Trigger is rising edge +#define COMP_ACCTL_TSEN_BOTH 0x00000060 // Trigger is both edges +#define COMP_ACCTL_ISLVAL 0x00000010 // Interrupt polarity select +#define COMP_ACCTL_ISEN_MASK 0x0000000C // Interrupt sense mask +#define COMP_ACCTL_ISEN_LEVEL 0x00000000 // Interrupt is level sense +#define COMP_ACCTL_ISEN_FALL 0x00000004 // Interrupt is falling edge +#define COMP_ACCTL_ISEN_RISE 0x00000008 // Interrupt is rising edge +#define COMP_ACCTL_ISEN_BOTH 0x0000000C // Interrupt is both edges +#define COMP_ACCTL_CINV 0x00000002 // Comparator output invert + +//***************************************************************************** +// +// The following define the reset values for the comparator registers. +// +//***************************************************************************** +#define COMP_RV_MIS 0x00000000 // Interrupt status register +#define COMP_RV_RIS 0x00000000 // Raw interrupt status register +#define COMP_RV_INTEN 0x00000000 // Interrupt enable register +#define COMP_RV_REFCTL 0x00000000 // Reference voltage control reg. +#define COMP_RV_ACSTAT0 0x00000000 // Comp0 status register +#define COMP_RV_ACCTL0 0x00000000 // Comp0 control register +#define COMP_RV_ACSTAT1 0x00000000 // Comp1 status register +#define COMP_RV_ACCTL1 0x00000000 // Comp1 control register +#define COMP_RV_ACSTAT2 0x00000000 // Comp2 status register +#define COMP_RV_ACCTL2 0x00000000 // Comp2 control register + +#endif // __HW_COMP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_flash.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_flash.h new file mode 100644 index 0000000..2143551 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_flash.h @@ -0,0 +1,139 @@ +//***************************************************************************** +// +// hw_flash.h - Macros used when accessing the flash controller. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_FLASH_H__ +#define __HW_FLASH_H__ + +//***************************************************************************** +// +// The following define the offsets of the FLASH registers. +// +//***************************************************************************** +#define FLASH_FMA 0x400FD000 // Memory address register +#define FLASH_FMD 0x400FD004 // Memory data register +#define FLASH_FMC 0x400FD008 // Memory control register +#define FLASH_FCRIS 0x400FD00c // Raw interrupt status register +#define FLASH_FCIM 0x400FD010 // Interrupt mask register +#define FLASH_FCMISC 0x400FD014 // Interrupt status register +#define FLASH_FMPRE 0x400FE130 // FLASH read protect register +#define FLASH_FMPPE 0x400FE134 // FLASH program protect register +#define FLASH_USECRL 0x400FE140 // uSec reload register + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMC register. +// +//***************************************************************************** +#define FLASH_FMC_WRKEY_MASK 0xFFFF0000 // FLASH write key mask +#define FLASH_FMC_WRKEY 0xA4420000 // FLASH write key +#define FLASH_FMC_COMT 0x00000008 // Commit user register +#define FLASH_FMC_MERASE 0x00000004 // Mass erase FLASH +#define FLASH_FMC_ERASE 0x00000002 // Erase FLASH page +#define FLASH_FMC_WRITE 0x00000001 // Write FLASH word + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCRIS register. +// +//***************************************************************************** +#define FLASH_FCRIS_PROGRAM 0x00000002 // Programming status +#define FLASH_FCRIS_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCIM register. +// +//***************************************************************************** +#define FLASH_FCIM_PROGRAM 0x00000002 // Programming mask +#define FLASH_FCIM_ACCESS 0x00000001 // Invalid access mask + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMIS register. +// +//***************************************************************************** +#define FLASH_FCMISC_PROGRAM 0x00000002 // Programming status +#define FLASH_FCMISC_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMPRE and FLASH_FMPPE +// registers. +// +//***************************************************************************** +#define FLASH_FMP_BLOCK_31 0x80000000 // Enable for block 31 +#define FLASH_FMP_BLOCK_30 0x40000000 // Enable for block 30 +#define FLASH_FMP_BLOCK_29 0x20000000 // Enable for block 29 +#define FLASH_FMP_BLOCK_28 0x10000000 // Enable for block 28 +#define FLASH_FMP_BLOCK_27 0x08000000 // Enable for block 27 +#define FLASH_FMP_BLOCK_26 0x04000000 // Enable for block 26 +#define FLASH_FMP_BLOCK_25 0x02000000 // Enable for block 25 +#define FLASH_FMP_BLOCK_24 0x01000000 // Enable for block 24 +#define FLASH_FMP_BLOCK_23 0x00800000 // Enable for block 23 +#define FLASH_FMP_BLOCK_22 0x00400000 // Enable for block 22 +#define FLASH_FMP_BLOCK_21 0x00200000 // Enable for block 21 +#define FLASH_FMP_BLOCK_20 0x00100000 // Enable for block 20 +#define FLASH_FMP_BLOCK_19 0x00080000 // Enable for block 19 +#define FLASH_FMP_BLOCK_18 0x00040000 // Enable for block 18 +#define FLASH_FMP_BLOCK_17 0x00020000 // Enable for block 17 +#define FLASH_FMP_BLOCK_16 0x00010000 // Enable for block 16 +#define FLASH_FMP_BLOCK_15 0x00008000 // Enable for block 15 +#define FLASH_FMP_BLOCK_14 0x00004000 // Enable for block 14 +#define FLASH_FMP_BLOCK_13 0x00002000 // Enable for block 13 +#define FLASH_FMP_BLOCK_12 0x00001000 // Enable for block 12 +#define FLASH_FMP_BLOCK_11 0x00000800 // Enable for block 11 +#define FLASH_FMP_BLOCK_10 0x00000400 // Enable for block 10 +#define FLASH_FMP_BLOCK_9 0x00000200 // Enable for block 9 +#define FLASH_FMP_BLOCK_8 0x00000100 // Enable for block 8 +#define FLASH_FMP_BLOCK_7 0x00000080 // Enable for block 7 +#define FLASH_FMP_BLOCK_6 0x00000040 // Enable for block 6 +#define FLASH_FMP_BLOCK_5 0x00000020 // Enable for block 5 +#define FLASH_FMP_BLOCK_4 0x00000010 // Enable for block 4 +#define FLASH_FMP_BLOCK_3 0x00000008 // Enable for block 3 +#define FLASH_FMP_BLOCK_2 0x00000004 // Enable for block 2 +#define FLASH_FMP_BLOCK_1 0x00000002 // Enable for block 1 +#define FLASH_FMP_BLOCK_0 0x00000001 // Enable for block 0 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_USECRL register. +// +//***************************************************************************** +#define FLASH_USECRL_MASK 0x000000FF // Clock per uSec +#define FLASH_USECRL_SHIFT 0 + +//***************************************************************************** +// +// The erase size is the size of the FLASH block that is erased by an erase +// operation, and the protect size is the size of the FLASH block that is +// protected by each protection register. +// +//***************************************************************************** +#define FLASH_ERASE_SIZE 0x00000400 +#define FLASH_PROTECT_SIZE 0x00000800 + +#endif // __HW_FLASH_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_gpio.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_gpio.h new file mode 100644 index 0000000..2f85bbc --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_gpio.h @@ -0,0 +1,103 @@ +//***************************************************************************** +// +// hw_gpio.h - Defines and Macros for GPIO hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_GPIO_H__ +#define __HW_GPIO_H__ + +//***************************************************************************** +// +// GPIO Register Offsets. +// +//***************************************************************************** +#define GPIO_O_DATA 0x00000000 // Data register. +#define GPIO_O_DIR 0x00000400 // Data direction register. +#define GPIO_O_IS 0x00000404 // Interrupt sense register. +#define GPIO_O_IBE 0x00000408 // Interrupt both edges register. +#define GPIO_O_IEV 0x0000040C // Intterupt event register. +#define GPIO_O_IM 0x00000410 // Interrupt mask register. +#define GPIO_O_RIS 0x00000414 // Raw interrupt status register. +#define GPIO_O_MIS 0x00000418 // Masked interrupt status reg. +#define GPIO_O_ICR 0x0000041C // Interrupt clear register. +#define GPIO_O_AFSEL 0x00000420 // Mode control select register. +#define GPIO_O_DR2R 0x00000500 // 2ma drive select register. +#define GPIO_O_DR4R 0x00000504 // 4ma drive select register. +#define GPIO_O_DR8R 0x00000508 // 8ma drive select register. +#define GPIO_O_ODR 0x0000050C // Open drain select register. +#define GPIO_O_PUR 0x00000510 // Pull up select register. +#define GPIO_O_PDR 0x00000514 // Pull down select register. +#define GPIO_O_SLR 0x00000518 // Slew rate control enable reg. +#define GPIO_O_DEN 0x0000051C // Digital input enable register. +#define GPIO_O_PeriphID4 0x00000FD0 // +#define GPIO_O_PeriphID5 0x00000FD4 // +#define GPIO_O_PeriphID6 0x00000FD8 // +#define GPIO_O_PeriphID7 0x00000FDC // +#define GPIO_O_PeriphID0 0x00000FE0 // +#define GPIO_O_PeriphID1 0x00000FE4 // +#define GPIO_O_PeriphID2 0x00000FE8 // +#define GPIO_O_PeriphID3 0x00000FEC // +#define GPIO_O_PCellID0 0x00000FF0 // +#define GPIO_O_PCellID1 0x00000FF4 // +#define GPIO_O_PCellID2 0x00000FF8 // +#define GPIO_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// GPIO Register reset values. +// +//***************************************************************************** +#define GPIO_RV_DATA 0x00000000 // Data register reset value. +#define GPIO_RV_DIR 0x00000000 // Data direction reg RV. +#define GPIO_RV_IS 0x00000000 // Interrupt sense reg RV. +#define GPIO_RV_IBE 0x00000000 // Interrupt both edges reg RV. +#define GPIO_RV_IEV 0x00000000 // Intterupt event reg RV. +#define GPIO_RV_IM 0x00000000 // Interrupt mask reg RV. +#define GPIO_RV_RIS 0x00000000 // Raw interrupt status reg RV. +#define GPIO_RV_MIS 0x00000000 // Masked interrupt status reg RV. +#define GPIO_RV_IC 0x00000000 // Interrupt clear reg RV. +#define GPIO_RV_AFSEL 0x00000000 // Mode control select reg RV. +#define GPIO_RV_DR2R 0x000000FF // 2ma drive select reg RV. +#define GPIO_RV_DR4R 0x00000000 // 4ma drive select reg RV. +#define GPIO_RV_DR8R 0x00000000 // 8ma drive select reg RV. +#define GPIO_RV_ODR 0x00000000 // Open drain select reg RV. +#define GPIO_RV_PUR 0x000000FF // Pull up select reg RV. +#define GPIO_RV_PDR 0x00000000 // Pull down select reg RV. +#define GPIO_RV_SLR 0x00000000 // Slew rate control enable reg RV. +#define GPIO_RV_DEN 0x000000FF // Digital input enable reg RV. +#define GPIO_RV_PeriphID4 0x00000000 // +#define GPIO_RV_PeriphID5 0x00000000 // +#define GPIO_RV_PeriphID6 0x00000000 // +#define GPIO_RV_PeriphID7 0x00000000 // +#define GPIO_RV_PeriphID0 0x00000061 // +#define GPIO_RV_PeriphID1 0x00000010 // +#define GPIO_RV_PeriphID2 0x00000004 // +#define GPIO_RV_PeriphID3 0x00000000 // +#define GPIO_RV_PCellID0 0x0000000D // +#define GPIO_RV_PCellID1 0x000000F0 // +#define GPIO_RV_PCellID2 0x00000005 // +#define GPIO_RV_PCellID3 0x000000B1 // + +#endif // __HW_GPIO_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_i2c.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_i2c.h new file mode 100644 index 0000000..2a5f4fd --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_i2c.h @@ -0,0 +1,189 @@ +//***************************************************************************** +// +// hw_i2c.h - Macros used when accessing the I2C master and slave hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_I2C_H__ +#define __HW_I2C_H__ + +//***************************************************************************** +// +// The following define the offsets of the I2C master registers. +// +//***************************************************************************** +#define I2C_MASTER_O_SA 0x00000000 // Slave address register +#define I2C_MASTER_O_CS 0x00000004 // Control and Status register +#define I2C_MASTER_O_DR 0x00000008 // Data register +#define I2C_MASTER_O_TPR 0x0000000C // Timer period register +#define I2C_MASTER_O_IMR 0x00000010 // Interrupt mask register +#define I2C_MASTER_O_RIS 0x00000014 // Raw interrupt status register +#define I2C_MASTER_O_MIS 0x00000018 // Masked interrupt status reg +#define I2C_MASTER_O_MICR 0x0000001c // Interrupt clear register +#define I2C_MASTER_O_CR 0x00000020 // Configuration register + +//***************************************************************************** +// +// The following define the offsets of the I2C slave registers. +// +//***************************************************************************** +#define I2C_SLAVE_O_OAR 0x00000000 // Own address register +#define I2C_SLAVE_O_CSR 0x00000004 // Control/Status register +#define I2C_SLAVE_O_DR 0x00000008 // Data register +#define I2C_SLAVE_O_IM 0x0000000C // Interrupt mask register +#define I2C_SLAVE_O_RIS 0x00000010 // Raw interrupt status register +#define I2C_SLAVE_O_MIS 0x00000014 // Masked interrupt status reg +#define I2C_SLAVE_O_SICR 0x00000018 // Interrupt clear register + +//***************************************************************************** +// +// The followng define the bit fields in the I2C master slave address register. +// +//***************************************************************************** +#define I2C_MASTER_SA_SA_MASK 0x000000FE // Slave address +#define I2C_MASTER_SA_RS 0x00000001 // Receive/send +#define I2C_MASTER_SA_SA_SHIFT 1 + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Control and Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_CS_ACK 0x00000008 // Acknowlegde +#define I2C_MASTER_CS_STOP 0x00000004 // Stop +#define I2C_MASTER_CS_START 0x00000002 // Start +#define I2C_MASTER_CS_RUN 0x00000001 // Run +#define I2C_MASTER_CS_BUS_BUSY 0x00000040 // Bus busy +#define I2C_MASTER_CS_IDLE 0x00000020 // Idle +#define I2C_MASTER_CS_ARB_LOST 0x00000010 // Lost arbitration +#define I2C_MASTER_CS_DATA_ACK 0x00000008 // Data byte not acknowledged +#define I2C_MASTER_CS_ADDR_ACK 0x00000004 // Address byte not acknowledged +#define I2C_MASTER_CS_ERROR 0x00000002 // Error occurred +#define I2C_MASTER_CS_BUSY 0x00000001 // Controller is TX/RX data +#define I2C_MASTER_CS_ERR_MASK 0x0000001C + +//***************************************************************************** +// +// The following define values used in determining the contents of the I2C +// Master Timer Period register. +// +//***************************************************************************** +#define I2C_MASTER_TPR_SCL_HP 0x00000004 // SCL high period +#define I2C_MASTER_TPR_SCL_LP 0x00000006 // SCL low period +#define I2C_SCL_STANDARD 100000 // SCL standard frequency +#define I2C_SCL_FAST 400000 // SCL fast frequency + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_MASTER_IMR_IM 0x00000001 // Master interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_RIS_RIS 0x00000001 // Master raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_MASTER_MIS_MIS 0x00000001 // Master masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_MASTER_MICR_IC 0x00000001 // Master interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Configuration +// register. +// +//***************************************************************************** +#define I2C_MASTER_CR_SFE 0x00000020 // Slave function enable +#define I2C_MASTER_CR_MFE 0x00000010 // Master function enable +#define I2C_MASTER_CR_LPBK 0x00000001 // Loopback enable + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Own Address register. +// +//***************************************************************************** +#define I2C_SLAVE_SOAR_OAR_MASK 0x0000007F // Slave address + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Control/Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_CSR_DA 0x00000001 // Enable the device +#define I2C_SLAVE_CSR_TREQ 0x00000002 // Transmit request received +#define I2C_SLAVE_CSR_RREQ 0x00000001 // Receive data from I2C master + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_SLAVE_IMR_IM 0x00000001 // Slave interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_RIS_RIS 0x00000001 // Slave raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_SLAVE_MIS_MIS 0x00000001 // Slave masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_SLAVE_SICR_IC 0x00000001 // Slave interrupt clear + +#endif // __HW_I2C_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_ints.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_ints.h new file mode 100644 index 0000000..65ce141 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_ints.h @@ -0,0 +1,96 @@ +//***************************************************************************** +// +// hw_ints.h - Macros that define the interrupt assignment on Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_INTS_H__ +#define __HW_INTS_H__ + +//***************************************************************************** +// +// The following define the fault assignments. +// +//***************************************************************************** +#define FAULT_NMI 2 // NMI fault +#define FAULT_HARD 3 // Hard fault +#define FAULT_MPU 4 // MPU fault +#define FAULT_BUS 5 // Bus fault +#define FAULT_USAGE 6 // Usage fault +#define FAULT_SVCALL 11 // SVCall +#define FAULT_DEBUG 12 // Debug monitor +#define FAULT_PENDSV 14 // PendSV +#define FAULT_SYSTICK 15 // System Tick + +//***************************************************************************** +// +// The following define the interrupt assignments. +// +//***************************************************************************** +#define INT_GPIOA 16 // GPIO Port A +#define INT_GPIOB 17 // GPIO Port B +#define INT_GPIOC 18 // GPIO Port C +#define INT_GPIOD 19 // GPIO Port D +#define INT_GPIOE 20 // GPIO Port E +#define INT_UART0 21 // UART0 Rx and Tx +#define INT_UART1 22 // UART1 Rx and Tx +#define INT_SSI 23 // SSI Rx and Tx +#define INT_I2C 24 // I2C Master and Slave +#define INT_PWM_FAULT 25 // PWM Fault +#define INT_PWM0 26 // PWM Generator 0 +#define INT_PWM1 27 // PWM Generator 1 +#define INT_PWM2 28 // PWM Generator 2 +#define INT_ADC0 30 // ADC Sequence 0 +#define INT_ADC1 31 // ADC Sequence 1 +#define INT_ADC2 32 // ADC Sequence 2 +#define INT_ADC3 33 // ADC Sequence 3 +#define INT_WATCHDOG 34 // Watchdog timer +#define INT_TIMER0A 35 // Timer 0 subtimer A +#define INT_TIMER0B 36 // Timer 0 subtimer B +#define INT_TIMER1A 37 // Timer 1 subtimer A +#define INT_TIMER1B 38 // Timer 1 subtimer B +#define INT_TIMER2A 39 // Timer 2 subtimer A +#define INT_TIMER2B 40 // Timer 2 subtimer B +#define INT_COMP0 41 // Analog Comparator 0 +#define INT_COMP1 42 // Analog Comparator 1 +#define INT_COMP2 43 // Analog Comparator 2 +#define INT_SYSCTL 44 // System Control (PLL, OSC, BO) +#define INT_FLASH 45 // FLASH Control + +//***************************************************************************** +// +// The total number of interrupts. +// +//***************************************************************************** +#define NUM_INTERRUPTS 46 + +//***************************************************************************** +// +// The total number of priority levels. +// +//***************************************************************************** +#define NUM_PRIORITY 8 +#define NUM_PRIORITY_BITS 3 + +#endif // __HW_INTS_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_memmap.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_memmap.h new file mode 100644 index 0000000..9f701fc --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_memmap.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// hw_memmap.h - Macros defining the memory map of Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_MEMMAP_H__ +#define __HW_MEMMAP_H__ + +//***************************************************************************** +// +// The following define the base address of the memories and peripherals. +// +//***************************************************************************** +#define FLASH_BASE 0x00000000 // FLASH memory +#define SRAM_BASE 0x20000000 // SRAM memory +#define WATCHDOG_BASE 0x40000000 // Watchdog +#define GPIO_PORTA_BASE 0x40004000 // GPIO Port A +#define GPIO_PORTB_BASE 0x40005000 // GPIO Port B +#define GPIO_PORTC_BASE 0x40006000 // GPIO Port C +#define GPIO_PORTD_BASE 0x40007000 // GPIO Port D +#define SSI_BASE 0x40008000 // SSI +#define UART0_BASE 0x4000C000 // UART0 +#define UART1_BASE 0x4000D000 // UART1 +#define I2C_MASTER_BASE 0x40020000 // I2C Master +#define I2C_SLAVE_BASE 0x40020800 // I2C Slave +#define GPIO_PORTE_BASE 0x40024000 // GPIO Port E +#define PWM_BASE 0x40028000 // PWM +#define TIMER0_BASE 0x40030000 // Timer0 +#define TIMER1_BASE 0x40031000 // Timer1 +#define TIMER2_BASE 0x40032000 // Timer2 +#define ADC_BASE 0x40038000 // ADC +#define COMP_BASE 0x4003C000 // Analog comparators +#define FLASH_CTRL_BASE 0x400FD000 // FLASH Controller +#define SYSCTL_BASE 0x400FE000 // System Control +#define ITM_BASE 0xE0000000 // Instrumentation Trace Macrocell +#define DWT_BASE 0xE0001000 // Data Watchpoint and Trace +#define FPB_BASE 0xE0002000 // FLASH Patch and Breakpoint +#define NVIC_BASE 0xE000E000 // Nested Vectored Interrupt Ctrl +#define TPIU_BASE 0xE0040000 // Trace Port Interface Unit + +#endif // __HW_MEMMAP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_nvic.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_nvic.h new file mode 100644 index 0000000..9e3154c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_nvic.h @@ -0,0 +1,830 @@ +//***************************************************************************** +// +// hw_nvic.h - Macros used when accessing the NVIC hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_NVIC_H__ +#define __HW_NVIC_H__ + +//***************************************************************************** +// +// The following define the addresses of the NVIC registers. +// +//***************************************************************************** +#define NVIC_INT_TYPE 0xE000E004 // Interrupt Controller Type Reg. +#define NVIC_ST_CTRL 0xE000E010 // SysTick Control and Status Reg. +#define NVIC_ST_RELOAD 0xE000E014 // SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 // SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C // SysTick Calibration Value Reg. +#define NVIC_EN0 0xE000E100 // IRQ 0 to 31 Set Enable Register +#define NVIC_DIS0 0xE000E180 // IRQ 0 to 31 Clear Enable Reg. +#define NVIC_PEND0 0xE000E200 // IRQ 0 to 31 Set Pending Register +#define NVIC_UNPEND0 0xE000E280 // IRQ 0 to 31 Clear Pending Reg. +#define NVIC_ACTIVE0 0xE000E300 // IRQ 0 to 31 Active Register +#define NVIC_PRI0 0xE000E400 // IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 // IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 // IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C // IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 // IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 // IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 // IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C // IRQ 28 to 31 Priority Register +#define NVIC_CPUID 0xE000ED00 // CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 // Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 // Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C // App. Int & Reset Control Reg. +#define NVIC_SYS_CTRL 0xE000ED10 // System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 // Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C // Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 // Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 // System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. +#define NVIC_HFAULT_STAT 0xE000ED2C // Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 // Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 // Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 // Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 // MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 // MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 // MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C // MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 // MPU Region Attribute & Size Reg. +#define NVIC_DBG_CTRL 0xE000EDF0 // Debug Control and Status Reg. +#define NVIC_DBG_XFER 0xE000EDF4 // Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 // Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC // Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 // Software Trigger Interrupt Reg. + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_TYPE register. +// +//***************************************************************************** +#define NVIC_INT_TYPE_LINES_M 0x0000001F // Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CTRL register. +// +//***************************************************************************** +#define NVIC_ST_CTRL_COUNT 0x00010000 // Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 // Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 // Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 // Counter mode + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_RELOAD register. +// +//***************************************************************************** +#define NVIC_ST_RELOAD_M 0x00FFFFFF // Counter load value +#define NVIC_ST_RELOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CURRENT register. +// +//***************************************************************************** +#define NVIC_ST_CURRENT_M 0x00FFFFFF // Counter current value +#define NVIC_ST_CURRENT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CAL register. +// +//***************************************************************************** +#define NVIC_ST_CAL_NOREF 0x80000000 // No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 // Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF // 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN0 register. +// +//***************************************************************************** +#define NVIC_EN0_INT31 0x80000000 // Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 // Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 // Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 // Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 // Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 // Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 // Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 // Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 // Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 // Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 // Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 // Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 // Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 // Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 // Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 // Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 // Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 // Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 // Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 // Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 // Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 // Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 // Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 // Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 // Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 // Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 // Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 // Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 // Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 // Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 // Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 // Interrupt 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS0 register. +// +//***************************************************************************** +#define NVIC_DIS0_INT31 0x80000000 // Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 // Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 // Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 // Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 // Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 // Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 // Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 // Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 // Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 // Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 // Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 // Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 // Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 // Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 // Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 // Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 // Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 // Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 // Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 // Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 // Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 // Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 // Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 // Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 // Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 // Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 // Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 // Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 // Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 // Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 // Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 // Interrupt 0 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND0 register. +// +//***************************************************************************** +#define NVIC_PEND0_INT31 0x80000000 // Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 // Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 // Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 // Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 // Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 // Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 // Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 // Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 // Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 // Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 // Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 // Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 // Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 // Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 // Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 // Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 // Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 // Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 // Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 // Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 // Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 // Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 // Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 // Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 // Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 // Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 // Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 // Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 // Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 // Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 // Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 // Interrupt 0 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND0 register. +// +//***************************************************************************** +#define NVIC_UNPEND0_INT31 0x80000000 // Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 // Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 // Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 // Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 // Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 // Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 // Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 // Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 // Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 // Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 // Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 // Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 // Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 // Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 // Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 // Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 // Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 // Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 // Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 // Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 // Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 // Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 // Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 // Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 // Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 // Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 // Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 // Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 // Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 // Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 // Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 // Interrupt 0 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE0 register. +// +//***************************************************************************** +#define NVIC_ACTIVE0_INT31 0x80000000 // Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 // Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 // Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 // Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 // Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 // Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 // Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 // Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 // Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 // Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 // Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 // Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 // Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 // Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 // Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 // Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 // Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 // Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 // Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 // Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 // Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 // Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 // Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 // Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 // Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 // Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 // Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 // Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 // Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 // Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 // Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 // Interrupt 0 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI0 register. +// +//***************************************************************************** +#define NVIC_PRI0_INT3_M 0xFF000000 // Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 // Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 // Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF // Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI1 register. +// +//***************************************************************************** +#define NVIC_PRI1_INT7_M 0xFF000000 // Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 // Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 // Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF // Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI2 register. +// +//***************************************************************************** +#define NVIC_PRI2_INT11_M 0xFF000000 // Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 // Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 // Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF // Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI3 register. +// +//***************************************************************************** +#define NVIC_PRI3_INT15_M 0xFF000000 // Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 // Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 // Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF // Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI4 register. +// +//***************************************************************************** +#define NVIC_PRI4_INT19_M 0xFF000000 // Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 // Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 // Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF // Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI5 register. +// +//***************************************************************************** +#define NVIC_PRI5_INT23_M 0xFF000000 // Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 // Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 // Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF // Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI6 register. +// +//***************************************************************************** +#define NVIC_PRI6_INT27_M 0xFF000000 // Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 // Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 // Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF // Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI7 register. +// +//***************************************************************************** +#define NVIC_PRI7_INT31_M 0xFF000000 // Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 // Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 // Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF // Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CPUID register. +// +//***************************************************************************** +#define NVIC_CPUID_IMP_M 0xFF000000 // Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 // Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 // Processor part number +#define NVIC_CPUID_REV_M 0x0000000F // Revision + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_CTRL register. +// +//***************************************************************************** +#define NVIC_INT_CTRL_NMI_SET 0x80000000 // Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 // Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 // Unpend a PendSV +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 // Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 // Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 // Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 // Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF // Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_VTABLE register. +// +//***************************************************************************** +#define NVIC_VTABLE_BASE 0x20000000 // Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 // Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_APINT register. +// +//***************************************************************************** +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 // Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 // Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 // Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 // Priority group +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 // Priority group 7.1 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 // Priority group 6.2 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 // Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 // Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 // Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 // Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 // Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 // Priority group 0.8 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 // System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 // Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 // System reset + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 // Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 // Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 // Sleep on ISR exit + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CFG_CTRL register. +// +//***************************************************************************** +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 // Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 // Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 // Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 // Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 // Thread state control + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI1 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI1_RES_M 0xFF000000 // Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 // Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 // Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF // Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI2 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 // Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF // Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI3 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 // Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 // Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 // Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF // Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_HND_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 // Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 // Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 // Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 // SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 // Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 // Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 // PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 // Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 // SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 // Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 // Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 // Mem manage is active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_STAT register. +// +//***************************************************************************** +#define NVIC_FAULT_STAT_DIV0 0x02000000 // Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 // Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 // No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 // Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 // Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 // Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 // Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 // Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 // Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 // Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 // Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 // MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 // Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 // Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 // Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 // Instruction access violation + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_HFAULT_STAT register. +// +//***************************************************************************** +#define NVIC_HFAULT_STAT_DBG 0x80000000 // Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 // Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 // Vector table read fault + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DEBUG_STAT register. +// +//***************************************************************************** +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 // EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 // Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 // DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 // Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 // Halt request + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MM_ADDR register. +// +//***************************************************************************** +#define NVIC_MM_ADDR_M 0xFFFFFFFF // Data fault address +#define NVIC_MM_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_ADDR register. +// +//***************************************************************************** +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF // Data bus fault address +#define NVIC_FAULT_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_STACK register. +// +//***************************************************************************** +#define NVIC_EXC_STACK_DEEP 0x00000001 // Exception stack + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_NUM register. +// +//***************************************************************************** +#define NVIC_EXC_NUM_M 0x000003FF // Exception number +#define NVIC_EXC_NUM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_COPRO register. +// +//***************************************************************************** +#define NVIC_COPRO_15_M 0xC0000000 // Coprocessor 15 access mask +#define NVIC_COPRO_15_DENIED 0x00000000 // Coprocessor 15 access denied +#define NVIC_COPRO_15_PRIV 0x40000000 // Coprocessor 15 privileged addess +#define NVIC_COPRO_15_FULL 0xC0000000 // Coprocessor 15 full access +#define NVIC_COPRO_14_M 0x30000000 // Coprocessor 14 access mask +#define NVIC_COPRO_14_DENIED 0x00000000 // Coprocessor 14 access denied +#define NVIC_COPRO_14_PRIV 0x10000000 // Coprocessor 14 privileged addess +#define NVIC_COPRO_14_FULL 0x30000000 // Coprocessor 14 full access +#define NVIC_COPRO_13_M 0x0C000000 // Coprocessor 13 access mask +#define NVIC_COPRO_13_DENIED 0x00000000 // Coprocessor 13 access denied +#define NVIC_COPRO_13_PRIV 0x04000000 // Coprocessor 13 privileged addess +#define NVIC_COPRO_13_FULL 0x0C000000 // Coprocessor 13 full access +#define NVIC_COPRO_12_M 0x03000000 // Coprocessor 12 access mask +#define NVIC_COPRO_12_DENIED 0x00000000 // Coprocessor 12 access denied +#define NVIC_COPRO_12_PRIV 0x01000000 // Coprocessor 12 privileged addess +#define NVIC_COPRO_12_FULL 0x03000000 // Coprocessor 12 full access +#define NVIC_COPRO_11_M 0x00C00000 // Coprocessor 11 access mask +#define NVIC_COPRO_11_DENIED 0x00000000 // Coprocessor 11 access denied +#define NVIC_COPRO_11_PRIV 0x00400000 // Coprocessor 11 privileged addess +#define NVIC_COPRO_11_FULL 0x00C00000 // Coprocessor 11 full access +#define NVIC_COPRO_10_M 0x00300000 // Coprocessor 10 access mask +#define NVIC_COPRO_10_DENIED 0x00000000 // Coprocessor 10 access denied +#define NVIC_COPRO_10_PRIV 0x00100000 // Coprocessor 10 privileged addess +#define NVIC_COPRO_10_FULL 0x00300000 // Coprocessor 10 full access +#define NVIC_COPRO_9_M 0x000C0000 // Coprocessor 9 access mask +#define NVIC_COPRO_9_DENIED 0x00000000 // Coprocessor 9 access denied +#define NVIC_COPRO_9_PRIV 0x00040000 // Coprocessor 9 privileged addess +#define NVIC_COPRO_9_FULL 0x000C0000 // Coprocessor 9 full access +#define NVIC_COPRO_8_M 0x00030000 // Coprocessor 8 access mask +#define NVIC_COPRO_8_DENIED 0x00000000 // Coprocessor 8 access denied +#define NVIC_COPRO_8_PRIV 0x00010000 // Coprocessor 8 privileged addess +#define NVIC_COPRO_8_FULL 0x00030000 // Coprocessor 8 full access +#define NVIC_COPRO_7_M 0x0000C000 // Coprocessor 7 access mask +#define NVIC_COPRO_7_DENIED 0x00000000 // Coprocessor 7 access denied +#define NVIC_COPRO_7_PRIV 0x00004000 // Coprocessor 7 privileged addess +#define NVIC_COPRO_7_FULL 0x0000C000 // Coprocessor 7 full access +#define NVIC_COPRO_6_M 0x00003000 // Coprocessor 6 access mask +#define NVIC_COPRO_6_DENIED 0x00000000 // Coprocessor 6 access denied +#define NVIC_COPRO_6_PRIV 0x00001000 // Coprocessor 6 privileged addess +#define NVIC_COPRO_6_FULL 0x00003000 // Coprocessor 6 full access +#define NVIC_COPRO_5_M 0x00000C00 // Coprocessor 5 access mask +#define NVIC_COPRO_5_DENIED 0x00000000 // Coprocessor 5 access denied +#define NVIC_COPRO_5_PRIV 0x00000400 // Coprocessor 5 privileged addess +#define NVIC_COPRO_5_FULL 0x00000C00 // Coprocessor 5 full access +#define NVIC_COPRO_4_M 0x00000300 // Coprocessor 4 access mask +#define NVIC_COPRO_4_DENIED 0x00000000 // Coprocessor 4 access denied +#define NVIC_COPRO_4_PRIV 0x00000100 // Coprocessor 4 privileged addess +#define NVIC_COPRO_4_FULL 0x00000300 // Coprocessor 4 full access +#define NVIC_COPRO_3_M 0x000000C0 // Coprocessor 3 access mask +#define NVIC_COPRO_3_DENIED 0x00000000 // Coprocessor 3 access denied +#define NVIC_COPRO_3_PRIV 0x00000040 // Coprocessor 3 privileged addess +#define NVIC_COPRO_3_FULL 0x000000C0 // Coprocessor 3 full access +#define NVIC_COPRO_2_M 0x00000030 // Coprocessor 2 access mask +#define NVIC_COPRO_2_DENIED 0x00000000 // Coprocessor 2 access denied +#define NVIC_COPRO_2_PRIV 0x00000010 // Coprocessor 2 privileged addess +#define NVIC_COPRO_2_FULL 0x00000030 // Coprocessor 2 full access +#define NVIC_COPRO_1_M 0x0000000C // Coprocessor 1 access mask +#define NVIC_COPRO_1_DENIED 0x00000000 // Coprocessor 1 access denied +#define NVIC_COPRO_1_PRIV 0x00000004 // Coprocessor 1 privileged addess +#define NVIC_COPRO_1_FULL 0x0000000C // Coprocessor 1 full access +#define NVIC_COPRO_0_M 0x00000003 // Coprocessor 0 access mask +#define NVIC_COPRO_0_DENIED 0x00000000 // Coprocessor 0 access denied +#define NVIC_COPRO_0_PRIV 0x00000001 // Coprocessor 0 privileged addess +#define NVIC_COPRO_0_FULL 0x00000003 // Coprocessor 0 full access + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_TYPE register. +// +//***************************************************************************** +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 // Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 // Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 // Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_CTRL register. +// +//***************************************************************************** +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 // MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 // MPU enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_NUMBER register. +// +//***************************************************************************** +#define NVIC_MPU_NUMBER_M 0x000000FF // MPU region to access +#define NVIC_MPU_NUMBER_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_BASE register. +// +//***************************************************************************** +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFF00 // Base address +#define NVIC_MPU_BASE_VALID 0x00000010 // Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F // Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_ATTR register. +// +//***************************************************************************** +#define NVIC_MPU_ATTR_ATTRS 0xFFFF0000 // Attributes +#define NVIC_MPU_ATTR_SRD 0x0000FF00 // Sub-region disable +#define NVIC_MPU_ATTR_SZENABLE 0x000000FF // Region size + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_CTRL register. +// +//***************************************************************************** +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 // Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 // Debug key +#define NVIC_DBG_CTRL_MON_PEND 0x00008000 // Pend the monitor +#define NVIC_DBG_CTRL_MON_REQ 0x00004000 // Monitor request +#define NVIC_DBG_CTRL_MON_EN 0x00002000 // Debug monitor enable +#define NVIC_DBG_CTRL_MONSTEP 0x00001000 // Monitor step the core +#define NVIC_DBG_CTRL_S_SLEEP 0x00000400 // Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00000200 // Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00000100 // Register read/write available +#define NVIC_DBG_CTRL_S_LOCKUP 0x00000080 // Core is locked up +#define NVIC_DBG_CTRL_C_RESET 0x00000010 // Reset the core +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 // Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 // Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 // Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 // Enable debug + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_XFER register. +// +//***************************************************************************** +#define NVIC_DBG_XFER_REG_WNR 0x00010000 // Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F // Register +#define NVIC_DBG_XFER_REG_R0 0x00000000 // Register R0 +#define NVIC_DBG_XFER_REG_R1 0x00000001 // Register R1 +#define NVIC_DBG_XFER_REG_R2 0x00000002 // Register R2 +#define NVIC_DBG_XFER_REG_R3 0x00000003 // Register R3 +#define NVIC_DBG_XFER_REG_R4 0x00000004 // Register R4 +#define NVIC_DBG_XFER_REG_R5 0x00000005 // Register R5 +#define NVIC_DBG_XFER_REG_R6 0x00000006 // Register R6 +#define NVIC_DBG_XFER_REG_R7 0x00000007 // Register R7 +#define NVIC_DBG_XFER_REG_R8 0x00000008 // Register R8 +#define NVIC_DBG_XFER_REG_R9 0x00000009 // Register R9 +#define NVIC_DBG_XFER_REG_R10 0x0000000A // Register R10 +#define NVIC_DBG_XFER_REG_R11 0x0000000B // Register R11 +#define NVIC_DBG_XFER_REG_R12 0x0000000C // Register R12 +#define NVIC_DBG_XFER_REG_R13 0x0000000D // Register R13 +#define NVIC_DBG_XFER_REG_R14 0x0000000E // Register R14 +#define NVIC_DBG_XFER_REG_R15 0x0000000F // Register R15 +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 // xPSR/Flags register +#define NVIC_DBG_XFER_REG_MSP 0x00000011 // Main SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 // Process SP +#define NVIC_DBG_XFER_REG_DSP 0x00000013 // Deep SP +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 // Control/Fault/BasePri/PriMask + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_DATA register. +// +//***************************************************************************** +#define NVIC_DBG_DATA_M 0xFFFFFFFF // Data temporary cache +#define NVIC_DBG_DATA_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_INT register. +// +//***************************************************************************** +#define NVIC_DBG_INT_HARDERR 0x00000400 // Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 // Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 // Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 // Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 // Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 // Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 // Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 // Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 // Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 // Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 // Reset vector catch + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SW_TRIG register. +// +//***************************************************************************** +#define NVIC_SW_TRIG_INTID_M 0x000003FF // Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 + +#endif // __HW_NVIC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_pwm.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_pwm.h new file mode 100644 index 0000000..b14172a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_pwm.h @@ -0,0 +1,260 @@ +//***************************************************************************** +// +// hw_pwm.h - Defines and Macros for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_PWM_H__ +#define __HW_PWM_H__ + +//***************************************************************************** +// +// PWM Module Register Offsets. +// +//***************************************************************************** +#define PWM_O_CTL 0x00000000 // PWM Master Control register +#define PWM_O_SYNC 0x00000004 // PWM Time Base Sync register +#define PWM_O_ENABLE 0x00000008 // PWM Output Enable register +#define PWM_O_INVERT 0x0000000C // PWM Output Inversion register +#define PWM_O_FAULT 0x00000010 // PWM Output Fault register +#define PWM_O_INTEN 0x00000014 // PWM Interrupt Enable register +#define PWM_O_RIS 0x00000018 // PWM Interrupt Raw Status reg. +#define PWM_O_ISC 0x0000001C // PWM Interrupt Status register +#define PWM_O_STATUS 0x00000020 // PWM Status register + +//***************************************************************************** +// +// The following define the bit fields in the PWM Master Control register. +// +//***************************************************************************** +#define PWM_CTL_GLOBAL_SYNC2 0x00000004 // Global sync generator 2 +#define PWM_CTL_GLOBAL_SYNC1 0x00000002 // Global sync generator 1 +#define PWM_CTL_GLOBAL_SYNC0 0x00000001 // Global sync generator 0 + +//***************************************************************************** +// +// The following define the bit fields in the PWM Time Base Sync register. +// +//***************************************************************************** +#define PWM_SYNC_SYNC2 0x00000004 // Reset generator 2 counter +#define PWM_SYNC_SYNC1 0x00000002 // Reset generator 1 counter +#define PWM_SYNC_SYNC0 0x00000001 // Reset generator 0 counter + +//***************************************************************************** +// +// The following define the bit fields in the PWM Output Enable register. +// +//***************************************************************************** +#define PWM_ENABLE_PWM5EN 0x00000020 // PWM5 pin enable +#define PWM_ENABLE_PWM4EN 0x00000010 // PWM4 pin enable +#define PWM_ENABLE_PWM3EN 0x00000008 // PWM3 pin enable +#define PWM_ENABLE_PWM2EN 0x00000004 // PWM2 pin enable +#define PWM_ENABLE_PWM1EN 0x00000002 // PWM1 pin enable +#define PWM_ENABLE_PWM0EN 0x00000001 // PWM0 pin enable + +//***************************************************************************** +// +// The following define the bit fields in the PWM Inversion register. +// +//***************************************************************************** +#define PWM_INVERT_PWM5INV 0x00000020 // PWM5 pin invert +#define PWM_INVERT_PWM4INV 0x00000010 // PWM4 pin invert +#define PWM_INVERT_PWM3INV 0x00000008 // PWM3 pin invert +#define PWM_INVERT_PWM2INV 0x00000004 // PWM2 pin invert +#define PWM_INVERT_PWM1INV 0x00000002 // PWM1 pin invert +#define PWM_INVERT_PWM0INV 0x00000001 // PWM0 pin invert + +//***************************************************************************** +// +// The following define the bit fields in the PWM Fault register. +// +//***************************************************************************** +#define PWM_FAULT_FAULT5 0x00000020 // PWM5 pin fault +#define PWM_FAULT_FAULT4 0x00000010 // PWM5 pin fault +#define PWM_FAULT_FAULT3 0x00000008 // PWM5 pin fault +#define PWM_FAULT_FAULT2 0x00000004 // PWM5 pin fault +#define PWM_FAULT_FAULT1 0x00000002 // PWM5 pin fault +#define PWM_FAULT_FAULT0 0x00000001 // PWM5 pin fault + +//***************************************************************************** +// +// PWM Interrupt Register bit definitions. +// +//***************************************************************************** +#define PWM_INT_INTFAULT 0x00010000 // Fault interrupt pending + +//***************************************************************************** +// +// The following define the bit fields in the PWM Status register. +// +//***************************************************************************** +#define PWM_STATUS_FAULT 0x00000001 // Fault status + +//***************************************************************************** +// +// PWM Generator standard offsets. +// +//***************************************************************************** +#define PWM_GEN_0_OFFSET 0x00000040 // PWM0 base +#define PWM_GEN_1_OFFSET 0x00000080 // PWM1 base +#define PWM_GEN_2_OFFSET 0x000000C0 // PWM2 base + +#define PWM_O_X_CTL 0x00000000 // Gen Control Reg +#define PWM_O_X_INTEN 0x00000004 // Gen Int/Trig Enable Reg +#define PWM_O_X_RIS 0x00000008 // Gen Raw Int Status Reg +#define PWM_O_X_ISC 0x0000000C // Gen Int Status Reg +#define PWM_O_X_LOAD 0x00000010 // Gen Load Reg +#define PWM_O_X_COUNT 0x00000014 // Gen Counter Reg +#define PWM_O_X_CMPA 0x00000018 // Gen Compare A Reg +#define PWM_O_X_CMPB 0x0000001C // Gen Compare B Reg +#define PWM_O_X_GENA 0x00000020 // Gen Generator A Ctrl Reg +#define PWM_O_X_GENB 0x00000024 // Gen Generator B Ctrl Reg +#define PWM_O_X_DBCTL 0x00000028 // Gen Dead Band Ctrl Reg +#define PWM_O_X_DBRISE 0x0000002C // Gen DB Rising Edge Delay Reg +#define PWM_O_X_DBFALL 0x00000030 // Gen DB Falling Edge Delay Reg + +//***************************************************************************** +// +// PWM_X Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_CTL_ENABLE 0x00000001 // Master enable for gen block +#define PWM_X_CTL_MODE 0x00000002 // Counter mode, down or up/down +#define PWM_X_CTL_DEBUG 0x00000004 // Debug mode +#define PWM_X_CTL_LOADUPD 0x00000008 // Update mode for the load reg +#define PWM_X_CTL_CMPAUPD 0x00000010 // Update mode for comp A reg +#define PWM_X_CTL_CMPBUPD 0x00000020 // Update mode for comp B reg + +//***************************************************************************** +// +// PWM_X Interrupt/Trigger Enable Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INTEN_INTCNTZERO 0x00000001 // Int if COUNT = 0 +#define PWM_X_INTEN_INTCNTLOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_X_INTEN_INTCMPAU 0x00000004 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPAD 0x00000008 // Int if COUNT = CMPA D +#define PWM_X_INTEN_INTCMPBU 0x00000010 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPBD 0x00000020 // Int if COUNT = CMPA D +#define PWM_X_INTEN_TRCNTZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_X_INTEN_TRCNTLOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_X_INTEN_TRCMPAU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPAD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_X_INTEN_TRCMPBU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPBD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// PWM_X Raw Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_RIS_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 int +#define PWM_X_RIS_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD int +#define PWM_X_RIS_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U int +#define PWM_X_RIS_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D int +#define PWM_X_RIS_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U int +#define PWM_X_RIS_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D int + +//***************************************************************************** +// +// PWM_X Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INT_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 received +#define PWM_X_INT_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD rcvd +#define PWM_X_INT_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U rcvd +#define PWM_X_INT_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D rcvd +#define PWM_X_INT_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U rcvd +#define PWM_X_INT_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D rcvd + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_GEN_Y_ACTZERO 0x00000003 // Act PWM_X_COUNT = 0 +#define PWM_X_GEN_Y_ACTLOAD 0x0000000C // Act PWM_X_COUNT = PWM_X_LOAD +#define PWM_X_GEN_Y_ACTCMPAU 0x00000030 // Act PWM_X_COUNT = PWM_X_CMPA U +#define PWM_X_GEN_Y_ACTCMPAD 0x000000C0 // Act PWM_X_COUNT = PWM_X_CMPA D +#define PWM_X_GEN_Y_ACTCMPBU 0x00000300 // Act PWM_X_COUNT = PWM_X_CMPB U +#define PWM_X_GEN_Y_ACTCMPBD 0x00000C00 // Act PWM_X_COUNT = PWM_X_CMPB D + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register action definitions. +// +//***************************************************************************** +#define PWM_GEN_ACT_NONE 0x0 // Do nothing +#define PWM_GEN_ACT_INV 0x1 // Invert the output signal +#define PWM_GEN_ACT_ZERO 0x2 // Set the output signal to zero +#define PWM_GEN_ACT_ONE 0x3 // Set the output signal to one +#define PWM_GEN_ACT_ZERO_SHIFT 0 // Shift amount for the zero action +#define PWM_GEN_ACT_LOAD_SHIFT 2 // Shift amount for the load action +#define PWM_GEN_ACT_A_UP_SHIFT 4 // Shift amount for the A up action +#define PWM_GEN_ACT_A_DN_SHIFT 6 // Shift amount for the A dn action +#define PWM_GEN_ACT_B_UP_SHIFT 8 // Shift amount for the B up action +#define PWM_GEN_ACT_B_DN_SHIFT 10 // Shift amount for the B dn action + +//***************************************************************************** +// +// PWM_X Dead Band Control Register bit definitions. +// +//***************************************************************************** +#define PWM_DBCTL_ENABLE 0x00000001 // Enable dead band insertion + +//***************************************************************************** +// +// PWM Register reset values. +// +//***************************************************************************** +#define PWM_RV_CTL 0x00000000 // Master control of the PWM module +#define PWM_RV_SYNC 0x00000000 // Counter synch for PWM generators +#define PWM_RV_ENABLE 0x00000000 // Master enable for the PWM + // output pins +#define PWM_RV_INVERT 0x00000000 // Inversion control for + // PWM output pins +#define PWM_RV_FAULT 0x00000000 // Fault handling for the PWM + // output pins +#define PWM_RV_INTEN 0x00000000 // Interrupt enable +#define PWM_RV_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_STATUS 0x00000000 // Status +#define PWM_RV_X_CTL 0x00000000 // Master control of the PWM + // generator block +#define PWM_RV_X_INTEN 0x00000000 // Interrupt and trigger enable +#define PWM_RV_X_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_X_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_X_LOAD 0x00000000 // The load value for the counter +#define PWM_RV_X_COUNT 0x00000000 // The current counter value +#define PWM_RV_X_CMPA 0x00000000 // The comparator A value +#define PWM_RV_X_CMPB 0x00000000 // The comparator B value +#define PWM_RV_X_GENA 0x00000000 // Controls PWM generator A +#define PWM_RV_X_GENB 0x00000000 // Controls PWM generator B +#define PWM_RV_X_DBCTL 0x00000000 // Control the dead band generator +#define PWM_RV_X_DBRISE 0x00000000 // The dead band rising edge delay + // count +#define PWM_RV_X_DBFALL 0x00000000 // The dead band falling edge delay + // count + +#endif // __HW_PWM_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_ssi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_ssi.h new file mode 100644 index 0000000..c8a18fc --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_ssi.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// hw_ssi.h - Macros used when accessing the SSI hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SSI_H__ +#define __HW_SSI_H__ + +//***************************************************************************** +// +// The following define the offsets of the SSI registers. +// +//***************************************************************************** +#define SSI_O_CR0 0x00000000 // Control register 0 +#define SSI_O_CR1 0x00000004 // Control register 1 +#define SSI_O_DR 0x00000008 // Data register +#define SSI_O_SR 0x0000000C // Status register +#define SSI_O_CPSR 0x00000010 // Clock prescale register +#define SSI_O_IM 0x00000014 // Int mask set and clear register +#define SSI_O_RIS 0x00000018 // Raw interrupt register +#define SSI_O_MIS 0x0000001C // Masked interrupt register +#define SSI_O_ICR 0x00000020 // Interrupt clear register + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 0. +// +//***************************************************************************** +#define SSI_CR0_SCR 0x0000FF00 // Serial clock rate +#define SSI_CR0_SPH 0x00000080 // SSPCLKOUT phase +#define SSI_CR0_SPO 0x00000040 // SSPCLKOUT polarity +#define SSI_CR0_FRF_MASK 0x00000030 // Frame format mask +#define SSI_CR0_FRF_MOTO 0x00000000 // Motorola SPI frame format +#define SSI_CR0_FRF_TI 0x00000010 // TI sync serial frame format +#define SSI_CR0_FRF_NMW 0x00000020 // National Microwire frame format +#define SSI_CR0_DSS 0x0000000F // Data size select +#define SSI_CR0_DSS_4 0x00000003 // 4 bit data +#define SSI_CR0_DSS_5 0x00000004 // 5 bit data +#define SSI_CR0_DSS_6 0x00000005 // 6 bit data +#define SSI_CR0_DSS_7 0x00000006 // 7 bit data +#define SSI_CR0_DSS_8 0x00000007 // 8 bit data +#define SSI_CR0_DSS_9 0x00000008 // 9 bit data +#define SSI_CR0_DSS_10 0x00000009 // 10 bit data +#define SSI_CR0_DSS_11 0x0000000A // 11 bit data +#define SSI_CR0_DSS_12 0x0000000B // 12 bit data +#define SSI_CR0_DSS_13 0x0000000C // 13 bit data +#define SSI_CR0_DSS_14 0x0000000D // 14 bit data +#define SSI_CR0_DSS_15 0x0000000E // 15 bit data +#define SSI_CR0_DSS_16 0x0000000F // 16 bit data + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 1. +// +//***************************************************************************** +#define SSI_CR1_SOD 0x00000008 // Slave mode output disable +#define SSI_CR1_MS 0x00000004 // Master or slave mode select +#define SSI_CR1_SSE 0x00000002 // Sync serial port enable +#define SSI_CR1_LBM 0x00000001 // Loopback mode + +//***************************************************************************** +// +// The following define the bit fields in the SSI Status register. +// +//***************************************************************************** +#define SSI_SR_BSY 0x00000010 // SSI busy +#define SSI_SR_RFF 0x00000008 // RX FIFO full +#define SSI_SR_RNE 0x00000004 // RX FIFO not empty +#define SSI_SR_TNF 0x00000002 // TX FIFO not full +#define SSI_SR_TFE 0x00000001 // TX FIFO empty + +//***************************************************************************** +// +// The following define the bit fields in the SSI clock prescale register. +// +//***************************************************************************** +#define SSI_CPSR_CPSDVSR_MASK 0x000000FF // Clock prescale + +//***************************************************************************** +// +// The following define information concerning the SSI Data register. +// +//***************************************************************************** +#define TX_FIFO_SIZE (8) // Number of entries in the TX FIFO +#define RX_FIFO_SIZE (8) // Number of entries in the RX FIFO + +//***************************************************************************** +// +// The following define the bit fields in the interrupt mask set and clear, +// raw interrupt, masked interrupt, and interrupt clear registers. +// +//***************************************************************************** +#define SSI_INT_TXFF 0x00000008 // TX FIFO interrupt +#define SSI_INT_RXFF 0x00000004 // RX FIFO interrupt +#define SSI_INT_RXTO 0x00000002 // RX timeout interrupt +#define SSI_INT_RXOR 0x00000001 // RX overrun interrupt + +#endif // __HW_SSI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_sysctl.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_sysctl.h new file mode 100644 index 0000000..884cdec --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_sysctl.h @@ -0,0 +1,380 @@ +//***************************************************************************** +// +// hw_sysctl.h - Macros used when accessing the system control hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SYSCTL_H__ +#define __HW_SYSCTL_H__ + +//***************************************************************************** +// +// The following define the offsets of the system control registers. +// +//***************************************************************************** +#define SYSCTL_DID0 0x400fe000 // Device identification register 0 +#define SYSCTL_DID1 0x400fe004 // Device identification register 1 +#define SYSCTL_DC0 0x400fe008 // Device capabilities register 0 +#define SYSCTL_DC1 0x400fe010 // Device capabilities register 1 +#define SYSCTL_DC2 0x400fe014 // Device capabilities register 2 +#define SYSCTL_DC3 0x400fe018 // Device capabilities register 3 +#define SYSCTL_DC4 0x400fe01C // Device capabilities register 4 +#define SYSCTL_PBORCTL 0x400fe030 // POR/BOR reset control register +#define SYSCTL_LDOPCTL 0x400fe034 // LDO power control register +#define SYSCTL_SRCR0 0x400fe040 // Software reset control reg 0 +#define SYSCTL_SRCR1 0x400fe044 // Software reset control reg 1 +#define SYSCTL_SRCR2 0x400fe048 // Software reset control reg 2 +#define SYSCTL_RIS 0x400fe050 // Raw interrupt status register +#define SYSCTL_IMC 0x400fe054 // Interrupt mask/control register +#define SYSCTL_MISC 0x400fe058 // Interrupt status register +#define SYSCTL_RESC 0x400fe05c // Reset cause register +#define SYSCTL_RCC 0x400fe060 // Run-mode clock config register +#define SYSCTL_PLLCFG 0x400fe064 // PLL configuration register +#define SYSCTL_RCGC0 0x400fe100 // Run-mode clock gating register 0 +#define SYSCTL_RCGC1 0x400fe104 // Run-mode clock gating register 1 +#define SYSCTL_RCGC2 0x400fe108 // Run-mode clock gating register 2 +#define SYSCTL_SCGC0 0x400fe110 // Sleep-mode clock gating reg 0 +#define SYSCTL_SCGC1 0x400fe114 // Sleep-mode clock gating reg 1 +#define SYSCTL_SCGC2 0x400fe118 // Sleep-mode clock gating reg 2 +#define SYSCTL_DCGC0 0x400fe120 // Deep Sleep-mode clock gate reg 0 +#define SYSCTL_DCGC1 0x400fe124 // Deep Sleep-mode clock gate reg 1 +#define SYSCTL_DCGC2 0x400fe128 // Deep Sleep-mode clock gate reg 2 +#define SYSCTL_CLKVCLR 0x400fe150 // Clock verifcation clear register +#define SYSCTL_LDOARST 0x400fe160 // LDO reset control register + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID0 register. +// +//***************************************************************************** +#define SYSCTL_DID0_VER_MASK 0x70000000 // DID0 version mask +#define SYSCTL_DID0_VER_0 0x00000000 // DID0 version 0 +#define SYSCTL_DID0_MAJ_MASK 0x0000FF00 // Major revision mask +#define SYSCTL_DID0_MAJ_A 0x00000000 // Major revision A +#define SYSCTL_DID0_MAJ_B 0x00000100 // Major revision B +#define SYSCTL_DID0_MIN_MASK 0x000000FF // Minor revision mask +#define SYSCTL_DID0_MIN_0 0x00000000 // Minor revision 0 +#define SYSCTL_DID0_MIN_1 0x00000001 // Minor revision 1 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID1 register. +// +//***************************************************************************** +#define SYSCTL_DID1_VER_MASK 0xF0000000 // Register version mask +#define SYSCTL_DID1_FAM_MASK 0x0F000000 // Family mask +#define SYSCTL_DID1_FAM_S 0x00000000 // Stellaris family +#define SYSCTL_DID1_PRTNO_MASK 0x00FF0000 // Part number mask +#define SYSCTL_DID1_PRTNO_101 0x00010000 // LM3S101 +#define SYSCTL_DID1_PRTNO_102 0x00020000 // LM3S102 +#define SYSCTL_DID1_PRTNO_301 0x00110000 // LM3S301 +#define SYSCTL_DID1_PRTNO_310 0x00120000 // LM3S310 +#define SYSCTL_DID1_PRTNO_315 0x00130000 // LM3S315 +#define SYSCTL_DID1_PRTNO_316 0x00140000 // LM3S316 +#define SYSCTL_DID1_TEMP_MASK 0x000000E0 // Temperature range mask +#define SYSCTL_DID1_TEMP_C 0x00000000 // Commercial temp range (0..70C) +#define SYSCTL_DID1_TEMP_I 0x00000020 // Industrial temp range (-40..85C) +#define SYSCTL_DID1_PKG_MASK 0x00000018 // Package mask +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 // 28-pin SOIC +#define SYSCTL_DID1_PKG_48QFP 0x00000008 // 48-pin QFP +#define SYSCTL_DID1_ROHS 0x00000004 // Part is RoHS compliant +#define SYSCTL_DID1_QUAL_MASK 0x00000003 // Qualification status mask +#define SYSCTL_DID1_QUAL_ES 0x00000000 // Engineering sample (unqualified) +#define SYSCTL_DID1_QUAL_PP 0x00000001 // Pilot production (unqualified) +#define SYSCTL_DID1_QUAL_FQ 0x00000002 // Fully qualified +#define SYSCTL_DID1_PRTNO_SHIFT 16 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC0 register. +// +//***************************************************************************** +#define SYSCTL_DC0_SRAMSZ_MASK 0xFFFF0000 // SRAM size mask +#define SYSCTL_DC0_SRAMSZ_2KB 0x00070000 // 2kB of SRAM +#define SYSCTL_DC0_SRAMSZ_4KB 0x000F0000 // 4kB of SRAM +#define SYSCTL_DC0_FLASHSZ_MASK 0x0000FFFF // Flash size mask +#define SYSCTL_DC0_FLASHSZ_8KB 0x00000003 // 8kB of flash +#define SYSCTL_DC0_FLASHSZ_16KB 0x00000007 // 16kB of flash + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC1 register. +// +//***************************************************************************** +#define SYSCTL_DC1_PWM 0x00100000 // PWM module present +#define SYSCTL_DC1_ADC 0x00010000 // ADC module present +#define SYSCTL_DC1_SYSDIV_MASK 0x0000F000 // Minimum system divider mask +#define SYSCTL_DC1_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_DC1_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_DC1_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_DC1_MPU 0x00000080 // Cortex-M3 MPU present +#define SYSCTL_DC1_TEMP 0x00000020 // Temperature sensor present +#define SYSCTL_DC1_PLL 0x00000010 // PLL present +#define SYSCTL_DC1_WDOG 0x00000008 // Watchdog present +#define SYSCTL_DC1_SWO 0x00000004 // Serial wire output present +#define SYSCTL_DC1_SWD 0x00000002 // Serial wire debug present +#define SYSCTL_DC1_JTAG 0x00000001 // JTAG debug present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC2 register. +// +//***************************************************************************** +#define SYSCTL_DC2_COMP2 0x04000000 // Analog comparator 2 present +#define SYSCTL_DC2_COMP1 0x02000000 // Analog comparator 1 present +#define SYSCTL_DC2_COMP0 0x01000000 // Analog comparator 0 present +#define SYSCTL_DC2_TIMER2 0x00040000 // Timer 2 present +#define SYSCTL_DC2_TIMER1 0x00020000 // Timer 1 present +#define SYSCTL_DC2_TIMER0 0x00010000 // Timer 0 present +#define SYSCTL_DC2_I2C 0x00001000 // I2C present +#define SYSCTL_DC2_SSI 0x00000010 // SSI present +#define SYSCTL_DC2_UART1 0x00000002 // UART 1 present +#define SYSCTL_DC2_UART0 0x00000001 // UART 0 present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC3 register. +// +//***************************************************************************** +#define SYSCTL_DC3_32KHZ 0x80000000 // 32kHz pin present +#define SYSCTL_DC3_CCP5 0x20000000 // CCP5 pin present +#define SYSCTL_DC3_CCP4 0x10000000 // CCP4 pin present +#define SYSCTL_DC3_CCP3 0x08000000 // CCP3 pin present +#define SYSCTL_DC3_CCP2 0x04000000 // CCP2 pin present +#define SYSCTL_DC3_CCP1 0x02000000 // CCP1 pin present +#define SYSCTL_DC3_CCP0 0x01000000 // CCP0 pin present +#define SYSCTL_DC3_ADC3 0x00080000 // ADC3 pin present +#define SYSCTL_DC3_ADC2 0x00040000 // ADC2 pin present +#define SYSCTL_DC3_ADC1 0x00020000 // ADC1 pin present +#define SYSCTL_DC3_ADC0 0x00010000 // ADC0 pin present +#define SYSCTL_DC3_C2O 0x00004000 // C2o pin present +#define SYSCTL_DC3_C2PLUS 0x00002000 // C2+ pin present +#define SYSCTL_DC3_C2MINUS 0x00001000 // C2- pin present +#define SYSCTL_DC3_C1O 0x00000800 // C1o pin present +#define SYSCTL_DC3_C1PLUS 0x00000400 // C1+ pin present +#define SYSCTL_DC3_C1MINUS 0x00000200 // C1- pin present +#define SYSCTL_DC3_C0O 0x00000100 // C0o pin present +#define SYSCTL_DC3_C0PLUS 0x00000080 // C0+ pin present +#define SYSCTL_DC3_C0MINUS 0x00000040 // C0- pin present +#define SYSCTL_DC3_PWM5 0x00000020 // PWM5 pin present +#define SYSCTL_DC3_PWM4 0x00000010 // PWM4 pin present +#define SYSCTL_DC3_PWM3 0x00000008 // PWM3 pin present +#define SYSCTL_DC3_PWM2 0x00000004 // PWM2 pin present +#define SYSCTL_DC3_PWM1 0x00000002 // PWM1 pin present +#define SYSCTL_DC3_PWM0 0x00000001 // PWM0 pin present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC4 register. +// +//***************************************************************************** +#define SYSCTL_DC4_GPIOE 0x00000010 // GPIO port E present +#define SYSCTL_DC4_GPIOD 0x00000008 // GPIO port D present +#define SYSCTL_DC4_GPIOC 0x00000004 // GPIO port C present +#define SYSCTL_DC4_GPIOB 0x00000002 // GPIO port B present +#define SYSCTL_DC4_GPIOA 0x00000001 // GPIO port A present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PBORCTL register. +// +//***************************************************************************** +#define SYSCTL_PBORCTL_BOR_MASK 0x0000FFFC // BOR wait timer +#define SYSCTL_PBORCTL_BORIOR 0x00000002 // BOR interrupt or reset +#define SYSCTL_PBORCTL_BORWT 0x00000001 // BOR wait and check for noise +#define SYSCTL_PBORCTL_BOR_SH 2 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOPCTL register. +// +//***************************************************************************** +#define SYSCTL_LDOPCTL_MASK 0x0000003F // Voltage adjust mask +#define SYSCTL_LDOPCTL_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDOPCTL_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDOPCTL_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDOPCTL_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDOPCTL_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDOPCTL_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDOPCTL_2_55V 0x0000001F // LDO output of 2.55V +#define SYSCTL_LDOPCTL_2_60V 0x0000001E // LDO output of 2.60V +#define SYSCTL_LDOPCTL_2_65V 0x0000001D // LDO output of 2.65V +#define SYSCTL_LDOPCTL_2_70V 0x0000001C // LDO output of 2.70V +#define SYSCTL_LDOPCTL_2_75V 0x0000001B // LDO output of 2.75V + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR0, SYSCTL_RCGC0, +// SYSCTL_SCGC0, and SYSCTL_DCGC0 registers. +// +//***************************************************************************** +#define SYSCTL_SET0_PWM 0x00100000 // PWM module +#define SYSCTL_SET0_ADC 0x00010000 // ADC module +#define SYSCTL_SET0_WDOG 0x00000008 // Watchdog module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR1, SYSCTL_RCGC1, +// SYSCTL_SCGC1, and SYSCTL_DCGC1 registers. +// +//***************************************************************************** +#define SYSCTL_SET1_COMP2 0x04000000 // Analog comparator module 2 +#define SYSCTL_SET1_COMP1 0x02000000 // Analog comparator module 1 +#define SYSCTL_SET1_COMP0 0x01000000 // Analog comparator module 0 +#define SYSCTL_SET1_TIMER2 0x00040000 // Timer module 2 +#define SYSCTL_SET1_TIMER1 0x00020000 // Timer module 1 +#define SYSCTL_SET1_TIMER0 0x00010000 // Timer module 0 +#define SYSCTL_SET1_I2C 0x00001000 // I2C module +#define SYSCTL_SET1_SSI 0x00000010 // SSI module +#define SYSCTL_SET1_UART1 0x00000002 // UART module 1 +#define SYSCTL_SET1_UART0 0x00000001 // UART module 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR2, SYSCTL_RCGC2, +// SYSCTL_SCGC2, and SYSCTL_DCGC2 registers. +// +//***************************************************************************** +#define SYSCTL_SET2_GPIOE 0x00000010 // GPIO E module +#define SYSCTL_SET2_GPIOD 0x00000008 // GPIO D module +#define SYSCTL_SET2_GPIOC 0x00000004 // GPIO C module +#define SYSCTL_SET2_GPIOB 0x00000002 // GPIO B module +#define SYSCTL_SET2_GPIOA 0x00000001 // GIPO A module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RIS, SYSCTL_IMC, and +// SYSCTL_IMS registers. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RESC register. +// +//***************************************************************************** +#define SYSCTL_RESC_LDO 0x00000020 // LDO power OK lost reset +#define SYSCTL_RESC_SW 0x00000010 // Software reset +#define SYSCTL_RESC_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_RESC_BOR 0x00000004 // Brown-out reset +#define SYSCTL_RESC_POR 0x00000002 // Power on reset +#define SYSCTL_RESC_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC register. +// +//***************************************************************************** +#define SYSCTL_RCC_ACG 0x08000000 // Automatic clock gating +#define SYSCTL_RCC_SYSDIV_MASK 0x07800000 // System clock divider +#define SYSCTL_RCC_SYSDIV_2 0x00800000 // System clock /2 +#define SYSCTL_RCC_SYSDIV_3 0x01000000 // System clock /3 +#define SYSCTL_RCC_SYSDIV_4 0x01800000 // System clock /4 +#define SYSCTL_RCC_SYSDIV_5 0x02000000 // System clock /5 +#define SYSCTL_RCC_SYSDIV_6 0x02800000 // System clock /6 +#define SYSCTL_RCC_SYSDIV_7 0x03000000 // System clock /7 +#define SYSCTL_RCC_SYSDIV_8 0x03800000 // System clock /8 +#define SYSCTL_RCC_SYSDIV_9 0x04000000 // System clock /9 +#define SYSCTL_RCC_SYSDIV_10 0x04800000 // System clock /10 +#define SYSCTL_RCC_SYSDIV_11 0x05000000 // System clock /11 +#define SYSCTL_RCC_SYSDIV_12 0x05800000 // System clock /12 +#define SYSCTL_RCC_SYSDIV_13 0x06000000 // System clock /13 +#define SYSCTL_RCC_SYSDIV_14 0x06800000 // System clock /14 +#define SYSCTL_RCC_SYSDIV_15 0x07000000 // System clock /15 +#define SYSCTL_RCC_SYSDIV_16 0x07800000 // System clock /16 +#define SYSCTL_RCC_USE_SYSDIV 0x00400000 // Use sytem clock divider +#define SYSCTL_RCC_USE_PWMDIV 0x00100000 // Use PWM clock divider +#define SYSCTL_RCC_PWMDIV_MASK 0x000E0000 // PWM clock divider +#define SYSCTL_RCC_PWMDIV_2 0x00000000 // PWM clock /2 +#define SYSCTL_RCC_PWMDIV_4 0x00020000 // PWM clock /4 +#define SYSCTL_RCC_PWMDIV_8 0x00040000 // PWM clock /8 +#define SYSCTL_RCC_PWMDIV_16 0x00060000 // PWM clock /16 +#define SYSCTL_RCC_PWMDIV_32 0x00080000 // PWM clock /32 +#define SYSCTL_RCC_PWMDIV_64 0x000A0000 // PWM clock /64 +#define SYSCTL_RCC_PWRDN 0x00002000 // PLL power down +#define SYSCTL_RCC_OE 0x00001000 // PLL output enable +#define SYSCTL_RCC_BYPASS 0x00000800 // PLL bypass +#define SYSCTL_RCC_PLLVER 0x00000400 // PLL verification timer enable +#define SYSCTL_RCC_XTAL_MASK 0x000003C0 // Crystal attached to main osc +#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100 // Using a 3.579545MHz crystal +#define SYSCTL_RCC_XTAL_3_68MHz 0x00000140 // Using a 3.6864MHz crystal +#define SYSCTL_RCC_XTAL_4MHz 0x00000180 // Using a 4MHz crystal +#define SYSCTL_RCC_XTAL_4_09MHZ 0x000001C0 // Using a 4.096MHz crystal +#define SYSCTL_RCC_XTAL_4_91MHZ 0x00000200 // Using a 4.9152MHz crystal +#define SYSCTL_RCC_XTAL_5MHZ 0x00000240 // Using a 5MHz crystal +#define SYSCTL_RCC_XTAL_5_12MHZ 0x00000280 // Using a 5.12MHz crystal +#define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 // Using a 6MHz crystal +#define SYSCTL_RCC_XTAL_6_14MHZ 0x00000300 // Using a 6.144MHz crystal +#define SYSCTL_RCC_XTAL_7_37MHZ 0x00000340 // Using a 7.3728MHz crystal +#define SYSCTL_RCC_XTAL_8MHZ 0x00000380 // Using a 8MHz crystal +#define SYSCTL_RCC_XTAL_8_19MHZ 0x000003C0 // Using a 8.192MHz crystal +#define SYSCTL_RCC_OSCSRC_MASK 0x00000030 // Oscillator input select +#define SYSCTL_RCC_OSCSRC_MAIN 0x00000000 // Use the main oscillator +#define SYSCTL_RCC_OSCSRC_INT 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC_OSCSRC_INT4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC_IOSCVER 0x00000008 // Int. osc. verification timer en +#define SYSCTL_RCC_MOSCVER 0x00000004 // Main osc. verification timer en +#define SYSCTL_RCC_IOSCDIS 0x00000002 // Internal oscillator disable +#define SYSCTL_RCC_MOSCDIS 0x00000001 // Main oscillator disable +#define SYSCTL_RCC_SYSDIV_SHIFT 23 // Shift to the SYSDIV field +#define SYSCTL_RCC_PWMDIV_SHIFT 17 // Shift to the PWMDIV field +#define SYSCTL_RCC_XTAL_SHIFT 6 // Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_SHIFT 4 // Shift to the OSCSRC field + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PLLCFG register. +// +//***************************************************************************** +#define SYSCTL_PLLCFG_OD_MASK 0x0000C000 // Output divider +#define SYSCTL_PLLCFG_OD_1 0x00000000 // Output divider is 1 +#define SYSCTL_PLLCFG_OD_2 0x00004000 // Output divider is 2 +#define SYSCTL_PLLCFG_OD_4 0x00008000 // Output divider is 4 +#define SYSCTL_PLLCFG_F_MASK 0x00003FE0 // PLL multiplier +#define SYSCTL_PLLCFG_R_MASK 0x0000001F // Input predivider +#define SYSCTL_PLLCFG_F_SHIFT 5 +#define SYSCTL_PLLCFG_R_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_CLKVCLR register. +// +//***************************************************************************** +#define SYSCTL_CLKVCLR_CLR 0x00000001 // Clear clock verification fault + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOARST register. +// +//***************************************************************************** +#define SYSCTL_LDOARST_ARST 0x00000001 // Allow LDO to reset device + +#endif // __HW_SYSCTL_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_timer.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_timer.h new file mode 100644 index 0000000..9954a9f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_timer.h @@ -0,0 +1,235 @@ +//***************************************************************************** +// +// hw_timer.h - Defines and macros used when accessing the timer. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TIMER_H__ +#define __HW_TIMER_H__ + +//***************************************************************************** +// +// The following define the offsets of the timer registers. +// +//***************************************************************************** +#define TIMER_O_CFG 0x00000000 // Configuration register +#define TIMER_O_TAMR 0x00000004 // TimerA mode register +#define TIMER_O_TBMR 0x00000008 // TimerB mode register +#define TIMER_O_CTL 0x0000000C // Control register +#define TIMER_O_IMR 0x00000018 // Interrupt mask register +#define TIMER_O_RIS 0x0000001C // Interrupt status register +#define TIMER_O_MIS 0x00000020 // Masked interrupt status reg. +#define TIMER_O_ICR 0x00000024 // Interrupt clear register +#define TIMER_O_TAILR 0x00000028 // TimerA interval load register +#define TIMER_O_TBILR 0x0000002C // TimerB interval load register +#define TIMER_O_TAMATCHR 0x00000030 // TimerA match register +#define TIMER_O_TBMATCHR 0x00000034 // TimerB match register +#define TIMER_O_TAPR 0x00000038 // TimerA prescale register +#define TIMER_O_TBPR 0x0000003C // TimerB prescale register +#define TIMER_O_TAPMR 0x00000040 // TimerA prescale match register +#define TIMER_O_TBPMR 0x00000044 // TimerB prescale match register +#define TIMER_O_TAR 0x00000048 // TimerA register +#define TIMER_O_TBR 0x0000004C // TimerB register + +//***************************************************************************** +// +// The following define the reset values of the timer registers. +// +//***************************************************************************** +#define TIMER_RV_CFG 0x00000000 // Configuration register RV +#define TIMER_RV_TAMR 0x00000000 // TimerA mode register RV +#define TIMER_RV_TBMR 0x00000000 // TimerB mode register RV +#define TIMER_RV_CTL 0x00000000 // Control register RV +#define TIMER_RV_IMR 0x00000000 // Interrupt mask register RV +#define TIMER_RV_RIS 0x00000000 // Interrupt status register RV +#define TIMER_RV_MIS 0x00000000 // Masked interrupt status reg RV +#define TIMER_RV_ICR 0x00000000 // Interrupt clear register RV +#define TIMER_RV_TAILR 0xFFFFFFFF // TimerA interval load reg RV +#define TIMER_RV_TBILR 0x0000FFFF // TimerB interval load reg RV +#define TIMER_RV_TAMATCHR 0xFFFFFFFF // TimerA match register RV +#define TIMER_RV_TBMATCHR 0x0000FFFF // TimerB match register RV +#define TIMER_RV_TAPR 0x00000000 // TimerA prescale register RV +#define TIMER_RV_TBPR 0x00000000 // TimerB prescale register RV +#define TIMER_RV_TAPMR 0x00000000 // TimerA prescale match reg RV +#define TIMER_RV_TBPMR 0x00000000 // TimerB prescale match regi RV +#define TIMER_RV_TAR 0xFFFFFFFF // TimerA register RV +#define TIMER_RV_TBR 0x0000FFFF // TimerB register RV + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CFG register. +// +//***************************************************************************** +#define TIMER_CFG_CFG_MSK 0x00000007 // Configuration options mask +#define TIMER_CFG_16_BIT 0x00000004 // Two 16 bit timers +#define TIMER_CFG_32_BIT_RTC 0x00000001 // 32 bit RTC +#define TIMER_CFG_32_BIT_TIMER 0x00000000 // 32 bit timer + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TnMR register. +// +//***************************************************************************** +#define TIMER_TNMR_TNAMS 0x00000008 // Alternate mode select +#define TIMER_TNMR_TNCMR 0x00000004 // Capture mode - count or time +#define TIMER_TNMR_TNTMR_MSK 0x00000003 // Timer mode mask +#define TIMER_TNMR_TNTMR_CAP 0x00000003 // Mode - capture +#define TIMER_TNMR_TNTMR_PERIOD 0x00000002 // Mode - periodic +#define TIMER_TNMR_TNTMR_1_SHOT 0x00000001 // Mode - one shot + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CTL register. +// +//***************************************************************************** +#define TIMER_CTL_TBPWML 0x00004000 // TimerB PWM output level invert +#define TIMER_CTL_TBOTE 0x00002000 // TimerB output trigger enable +#define TIMER_CTL_TBEVENT_MSK 0x00000C00 // TimerB event mode mask +#define TIMER_CTL_TBEVENT_BOTH 0x00000C00 // TimerB event mode - both edges +#define TIMER_CTL_TBEVENT_NEG 0x00000400 // TimerB event mode - neg edge +#define TIMER_CTL_TBEVENT_POS 0x00000000 // TimerB event mode - pos edge +#define TIMER_CTL_TBSTALL 0x00000200 // TimerB stall enable +#define TIMER_CTL_TBEN 0x00000100 // TimerB enable +#define TIMER_CTL_TAPWML 0x00000040 // TimerA PWM output level invert +#define TIMER_CTL_TAOTE 0x00000020 // TimerA output trigger enable +#define TIMER_CTL_RTCEN 0x00000010 // RTC counter enable +#define TIMER_CTL_TAEVENT_MSK 0x0000000C // TimerA event mode mask +#define TIMER_CTL_TAEVENT_BOTH 0x0000000C // TimerA event mode - both edges +#define TIMER_CTL_TAEVENT_NEG 0x00000004 // TimerA event mode - neg edge +#define TIMER_CTL_TAEVENT_POS 0x00000000 // TimerA event mode - pos edge +#define TIMER_CTL_TASTALL 0x00000002 // TimerA stall enable +#define TIMER_CTL_TAEN 0x00000001 // TimerA enable + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_IMR register. +// +//***************************************************************************** +#define TIMER_IMR_CBEIM 0x00000400 // CaptureB event interrupt mask +#define TIMER_IMR_CBMIM 0x00000200 // CaptureB match interrupt mask +#define TIMER_IMR_TBTOIM 0x00000100 // TimerB time out interrupt mask +#define TIMER_IMR_RTCIM 0x00000008 // RTC interrupt mask +#define TIMER_IMR_CAEIM 0x00000004 // CaptureA event interrupt mask +#define TIMER_IMR_CAMIM 0x00000002 // CaptureA match interrupt mask +#define TIMER_IMR_TATOIM 0x00000001 // TimerA time out interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_RIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBERIS 0x00000400 // CaptureB event raw int status +#define TIMER_RIS_CBMRIS 0x00000200 // CaptureB match raw int status +#define TIMER_RIS_TBTORIS 0x00000100 // TimerB time out raw int status +#define TIMER_RIS_RTCRIS 0x00000008 // RTC raw int status +#define TIMER_RIS_CAERIS 0x00000004 // CaptureA event raw int status +#define TIMER_RIS_CAMRIS 0x00000002 // CaptureA match raw int status +#define TIMER_RIS_TATORIS 0x00000001 // TimerA time out raw int status + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_MIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBEMIS 0x00000400 // CaptureB event masked int status +#define TIMER_RIS_CBMMIS 0x00000200 // CaptureB match masked int status +#define TIMER_RIS_TBTOMIS 0x00000100 // TimerB time out masked int stat +#define TIMER_RIS_RTCMIS 0x00000008 // RTC masked int status +#define TIMER_RIS_CAEMIS 0x00000004 // CaptureA event masked int status +#define TIMER_RIS_CAMMIS 0x00000002 // CaptureA match masked int status +#define TIMER_RIS_TATOMIS 0x00000001 // TimerA time out masked int stat + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_ICR register. +// +//***************************************************************************** +#define TIMER_ICR_CBECINT 0x00000400 // CaptureB event interrupt clear +#define TIMER_ICR_CBMCINT 0x00000200 // CaptureB match interrupt clear +#define TIMER_ICR_TBTOCINT 0x00000100 // TimerB time out interrupt clear +#define TIMER_ICR_RTCCINT 0x00000008 // RTC interrupt clear +#define TIMER_ICR_CAECINT 0x00000004 // CaptureA event interrupt clear +#define TIMER_ICR_CAMCINT 0x00000002 // CaptureA match interrupt clear +#define TIMER_ICR_TATOCINT 0x00000001 // TimerA time out interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAILR register. +// +//***************************************************************************** +#define TIMER_TAILR_TAILRH 0xFFFF0000 // TimerB load val in 32 bit mode +#define TIMER_TAILR_TAILRL 0x0000FFFF // TimerA interval load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBILR register. +// +//***************************************************************************** +#define TIMER_TBILR_TBILRL 0x0000FFFF // TimerB interval load value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAMATCHR register. +// +//***************************************************************************** +#define TIMER_TAMATCHR_TAMRH 0xFFFF0000 // TimerB match val in 32 bit mode +#define TIMER_TAMATCHR_TAMRL 0x0000FFFF // TimerA match value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBMATCHR register. +// +//***************************************************************************** +#define TIMER_TBMATCHR_TBMRL 0x0000FFFF // TimerB match load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPR register. +// +//***************************************************************************** +#define TIMER_TNPR_TNPSR 0x000000FF // TimerN prescale value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPMR register. +// +//***************************************************************************** +#define TIMER_TNPMR_TNPSMR 0x000000FF // TimerN prescale match value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAR register. +// +//***************************************************************************** +#define TIMER_TAR_TARH 0xFFFF0000 // TimerB val in 32 bit mode +#define TIMER_TAR_TARL 0x0000FFFF // TimerA value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBR register. +// +//***************************************************************************** +#define TIMER_TBR_TBRL 0x0000FFFF // TimerB value + +#endif // __HW_TIMER_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_types.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_types.h new file mode 100644 index 0000000..a3b9dcb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_types.h @@ -0,0 +1,67 @@ +//***************************************************************************** +// +// hw_types.h - Common types and macros. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TYPES_H__ +#define __HW_TYPES_H__ + +//***************************************************************************** +// +// Define a boolean type, and values for true and false. +// +//***************************************************************************** +typedef unsigned char tBoolean; + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +//***************************************************************************** +// +// Macros for hardware access, both direct and via the bit-band region. +// +//***************************************************************************** +#define HWREG(x) \ + (*((volatile unsigned long *)(x))) +#define HWREGH(x) \ + (*((volatile unsigned short *)(x))) +#define HWREGB(x) \ + (*((volatile unsigned char *)(x))) +#define HWREGBITW(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITH(x, b) \ + HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITB(x, b) \ + HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) + +#endif // __HW_TYPES_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_uart.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_uart.h new file mode 100644 index 0000000..99bdc3c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_uart.h @@ -0,0 +1,239 @@ +//***************************************************************************** +// +// hw_uart.h - Macros and defines used when accessing the UART hardware +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_UART_H__ +#define __HW_UART_H__ + +//***************************************************************************** +// +// UART Register Offsets. +// +//***************************************************************************** +#define UART_O_DR 0x00000000 // Data Register +#define UART_O_RSR 0x00000004 // Receive Status Register (read) +#define UART_O_ECR 0x00000004 // Error Clear Register (write) +#define UART_O_FR 0x00000018 // Flag Register (read only) +#define UART_O_IBRD 0x00000024 // Integer Baud Rate Divisor Reg +#define UART_O_FBRD 0x00000028 // Fractional Baud Rate Divisor Reg +#define UART_O_LCR_H 0x0000002C // Line Control Register, HIGH byte +#define UART_O_CTL 0x00000030 // Control Register +#define UART_O_IFLS 0x00000034 // Interrupt FIFO Level Select Reg +#define UART_O_IM 0x00000038 // Interrupt Mask Set/Clear Reg +#define UART_O_RIS 0x0000003C // Raw Interrupt Status Register +#define UART_O_MIS 0x00000040 // Masked Interrupt Status Register +#define UART_O_ICR 0x00000044 // Interrupt Clear Register +#define UART_O_PeriphID4 0x00000FD0 // +#define UART_O_PeriphID5 0x00000FD4 // +#define UART_O_PeriphID6 0x00000FD8 // +#define UART_O_PeriphID7 0x00000FDC // +#define UART_O_PeriphID0 0x00000FE0 // +#define UART_O_PeriphID1 0x00000FE4 // +#define UART_O_PeriphID2 0x00000FE8 // +#define UART_O_PeriphID3 0x00000FEC // +#define UART_O_PCellID0 0x00000FF0 // +#define UART_O_PCellID1 0x00000FF4 // +#define UART_O_PCellID2 0x00000FF8 // +#define UART_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// Data Register bits +// +//***************************************************************************** +#define UART_DR_OE 0x00000800 // Overrun Error +#define UART_DR_BE 0x00000400 // Break Error +#define UART_DR_PE 0x00000200 // Parity Error +#define UART_DR_FE 0x00000100 // Framing Error +#define UART_DR_DATA_MASK 0x000000FF // UART data + +//***************************************************************************** +// +// Receive Status Register bits +// +//***************************************************************************** +#define UART_RSR_OE 0x00000008 // Overrun Error +#define UART_RSR_BE 0x00000004 // Break Error +#define UART_RSR_PE 0x00000002 // Parity Error +#define UART_RSR_FE 0x00000001 // Framing Error + +//***************************************************************************** +// +// Flag Register bits +// +//***************************************************************************** +#define UART_FR_TXFE 0x00000080 // TX FIFO Empty +#define UART_FR_RXFF 0x00000040 // RX FIFO Full +#define UART_FR_TXFF 0x00000020 // TX FIFO Full +#define UART_FR_RXFE 0x00000010 // RX FIFO Empty +#define UART_FR_BUSY 0x00000008 // UART Busy + +//***************************************************************************** +// +// Integer baud-rate divisor +// +//***************************************************************************** +#define UART_IBRD_DIVINT_MASK 0x0000FFFF // Integer baud-rate divisor + +//***************************************************************************** +// +// Fractional baud-rate divisor +// +//***************************************************************************** +#define UART_FBRD_DIVFRAC_MASK 0x0000003F // Fractional baud-rate divisor + +//***************************************************************************** +// +// Line Control Register High bits +// +//***************************************************************************** +#define UART_LCR_H_SPS 0x00000080 // Stick Parity Select +#define UART_LCR_H_WLEN 0x00000060 // Word length +#define UART_LCR_H_WLEN_8 0x00000060 // 8 bit data +#define UART_LCR_H_WLEN_7 0x00000040 // 7 bit data +#define UART_LCR_H_WLEN_6 0x00000020 // 6 bit data +#define UART_LCR_H_WLEN_5 0x00000000 // 5 bit data +#define UART_LCR_H_FEN 0x00000010 // Enable FIFO +#define UART_LCR_H_STP2 0x00000008 // Two Stop Bits Select +#define UART_LCR_H_EPS 0x00000004 // Even Parity Select +#define UART_LCR_H_PEN 0x00000002 // Parity Enable +#define UART_LCR_H_BRK 0x00000001 // Send Break + +//***************************************************************************** +// +// Control Register bits +// +//***************************************************************************** +#define UART_CTL_RXE 0x00000200 // Receive Enable +#define UART_CTL_TXE 0x00000100 // Transmit Enable +#define UART_CTL_LBE 0x00000080 // Loopback Enable +#define UART_CTL_UARTEN 0x00000001 // UART Enable + +//***************************************************************************** +// +// Interrupt FIFO Level Select Register bits +// +//***************************************************************************** +#define UART_IFLS_RX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_RX2_8 0x00000010 // 1/4 Full +#define UART_IFLS_RX4_8 0x00000020 // 1/2 Full +#define UART_IFLS_RX6_8 0x00000030 // 3/4 Full +#define UART_IFLS_RX7_8 0x00000040 // 7/8 Full +#define UART_IFLS_TX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_TX2_8 0x00000001 // 1/4 Full +#define UART_IFLS_TX4_8 0x00000002 // 1/2 Full +#define UART_IFLS_TX6_8 0x00000003 // 3/4 Full +#define UART_IFLS_TX7_8 0x00000004 // 7/8 Full + +//***************************************************************************** +// +// Interrupt Mask Set/Clear Register bits +// +//***************************************************************************** +#define UART_IM_OEIM 0x00000400 // Overrun Error Interrupt Mask +#define UART_IM_BEIM 0x00000200 // Break Error Interrupt Mask +#define UART_IM_PEIM 0x00000100 // Parity Error Interrupt Mask +#define UART_IM_FEIM 0x00000080 // Framing Error Interrupt Mask +#define UART_IM_RTIM 0x00000040 // Receive Timeout Interrupt Mask +#define UART_IM_TXIM 0x00000020 // Transmit Interrupt Mask +#define UART_IM_RXIM 0x00000010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Raw Interrupt Status Register +// +//***************************************************************************** +#define UART_RIS_OERIS 0x00000400 // Overrun Error Interrupt Status +#define UART_RIS_BERIS 0x00000200 // Break Error Interrupt Status +#define UART_RIS_PERIS 0x00000100 // Parity Error Interrupt Status +#define UART_RIS_FERIS 0x00000080 // Framing Error Interrupt Status +#define UART_RIS_RTRIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_RIS_TXRIS 0x00000020 // Transmit Interrupt Status +#define UART_RIS_RXRIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Masked Interrupt Status Register +// +//***************************************************************************** +#define UART_MIS_OEMIS 0x00000400 // Overrun Error Interrupt Status +#define UART_MIS_BEMIS 0x00000200 // Break Error Interrupt Status +#define UART_MIS_PEMIS 0x00000100 // Parity Error Interrupt Status +#define UART_MIS_FEMIS 0x00000080 // Framing Error Interrupt Status +#define UART_MIS_RTMIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_MIS_TXMIS 0x00000020 // Transmit Interrupt Status +#define UART_MIS_RXMIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Interrupt Clear Register bits +// +//***************************************************************************** +#define UART_ICR_OEIC 0x00000400 // Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x00000200 // Break Error Interrupt Clear +#define UART_ICR_PEIC 0x00000100 // Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x00000080 // Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x00000040 // Receive Timeout Interrupt Clear +#define UART_ICR_TXIC 0x00000020 // Transmit Interrupt Clear +#define UART_ICR_RXIC 0x00000010 // Receive Interrupt Clear + +#define UART_RSR_ANY (UART_RSR_OE | \ + UART_RSR_BE | \ + UART_RSR_PE | \ + UART_RSR_FE) + +//***************************************************************************** +// +// Reset Values for UART Registers. +// +//***************************************************************************** +#define UART_RV_DR 0x00000000 +#define UART_RV_RSR 0x00000000 +#define UART_RV_ECR 0x00000000 +#define UART_RV_FR 0x00000090 +#define UART_RV_IBRD 0x00000000 +#define UART_RV_FBRD 0x00000000 +#define UART_RV_LCR_H 0x00000000 +#define UART_RV_CTL 0x00000300 +#define UART_RV_IFLS 0x00000012 +#define UART_RV_IM 0x00000000 +#define UART_RV_RIS 0x00000000 +#define UART_RV_MIS 0x00000000 +#define UART_RV_ICR 0x00000000 +#define UART_RV_PeriphID4 0x00000000 +#define UART_RV_PeriphID5 0x00000000 +#define UART_RV_PeriphID6 0x00000000 +#define UART_RV_PeriphID7 0x00000000 +#define UART_RV_PeriphID0 0x00000011 +#define UART_RV_PeriphID1 0x00000000 +#define UART_RV_PeriphID2 0x00000018 +#define UART_RV_PeriphID3 0x00000001 +#define UART_RV_PCellID0 0x0000000D +#define UART_RV_PCellID1 0x000000F0 +#define UART_RV_PCellID2 0x00000005 +#define UART_RV_PCellID3 0x000000B1 + +#endif // __HW_UART_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_watchdog.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_watchdog.h new file mode 100644 index 0000000..e9d3f0b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/hw_watchdog.h @@ -0,0 +1,116 @@ +//***************************************************************************** +// +// hw_watchdog.h - Macros used when accessing the Watchdog Timer hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_WATCHDOG_H__ +#define __HW_WATCHDOG_H__ + +//***************************************************************************** +// +// The following define the offsets of the Watchdog Timer registers. +// +//***************************************************************************** +#define WDT_O_LOAD 0x00000000 // Load register +#define WDT_O_VALUE 0x00000004 // Current value register +#define WDT_O_CTL 0x00000008 // Control register +#define WDT_O_ICR 0x0000000C // Interrupt clear register +#define WDT_O_RIS 0x00000010 // Raw interrupt status register +#define WDT_O_MIS 0x00000014 // Masked interrupt status register +#define WDT_O_TEST 0x00000418 // Test register +#define WDT_O_LOCK 0x00000C00 // Lock register +#define WDT_O_PeriphID4 0x00000FD0 // +#define WDT_O_PeriphID5 0x00000FD4 // +#define WDT_O_PeriphID6 0x00000FD8 // +#define WDT_O_PeriphID7 0x00000FDC // +#define WDT_O_PeriphID0 0x00000FE0 // +#define WDT_O_PeriphID1 0x00000FE4 // +#define WDT_O_PeriphID2 0x00000FE8 // +#define WDT_O_PeriphID3 0x00000FEC // +#define WDT_O_PCellID0 0x00000FF0 // +#define WDT_O_PCellID1 0x00000FF4 // +#define WDT_O_PCellID2 0x00000FF8 // +#define WDT_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the WDT_CTL register. +// +//***************************************************************************** +#define WDT_CTL_RESEN 0x00000002 // Enable reset output +#define WDT_CTL_INTEN 0x00000001 // Enable the WDT counter and int + +//***************************************************************************** +// +// The following define the bit fields in the WDT_ISR, WDT_RIS, and WDT_MIS +// registers. +// +//***************************************************************************** +#define WDT_INT_TIMEOUT 0x00000001 // Watchdog timer expired + +//***************************************************************************** +// +// The following define the bit fields in the WDT_TEST register. +// +//***************************************************************************** +#define WDT_TEST_STALL 0x00000100 // Watchdog stall enable +#ifndef DEPRECATED +#define WDT_TEST_STALL_EN 0x00000100 // Watchdog stall enable +#endif + +//***************************************************************************** +// +// The following define the bit fields in the WDT_LOCK register. +// +//***************************************************************************** +#define WDT_LOCK_LOCKED 0x00000001 // Watchdog timer is locked +#define WDT_LOCK_UNLOCKED 0x00000000 // Watchdog timer is unlocked +#define WDT_LOCK_UNLOCK 0x1ACCE551 // Unlocks the watchdog timer + +//***************************************************************************** +// +// The following define the reset values for the WDT registers. +// +//***************************************************************************** +#define WDT_RV_LOAD 0xFFFFFFFF // Load register +#define WDT_RV_VALUE 0xFFFFFFFF // Current value register +#define WDT_RV_CTL 0x00000000 // Control register +#define WDT_RV_RIS 0x00000000 // Raw interrupt status register +#define WDT_RV_MIS 0x00000000 // Masked interrupt status register +#define WDT_RV_LOCK 0x00000000 // Lock register +#define WDT_RV_PeriphID4 0x00000000 // +#define WDT_RV_PeriphID5 0x00000000 // +#define WDT_RV_PeriphID6 0x00000000 // +#define WDT_RV_PeriphID7 0x00000000 // +#define WDT_RV_PeriphID0 0x00000005 // +#define WDT_RV_PeriphID1 0x00000018 // +#define WDT_RV_PeriphID2 0x00000018 // +#define WDT_RV_PeriphID3 0x00000001 // +#define WDT_RV_PCellID0 0x0000000D // +#define WDT_RV_PCellID1 0x000000F0 // +#define WDT_RV_PCellID2 0x00000005 // +#define WDT_RV_PCellID3 0x000000B1 // + +#endif // __HW_WATCHDOG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/i2c.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/i2c.h new file mode 100644 index 0000000..26bb1dd --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/i2c.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// i2c.h - Prototypes for the I2C Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Interrupt defines. +// +//***************************************************************************** +#define I2C_INT_MASTER 0x00000001 +#define I2C_INT_SLAVE 0x00000002 + +//***************************************************************************** +// +// I2C Master commands. +// +//***************************************************************************** +#define I2C_MASTER_CMD_SINGLE_SEND \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_SINGLE_RECEIVE \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_START \ + (I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_CONT \ + (I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_ERROR_STOP \ + (I2C_MASTER_CS_STOP) +#define I2C_MASTER_CMD_BURST_RECEIVE_START \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_CONT \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) + +//***************************************************************************** +// +// I2C Master error status. +// +//***************************************************************************** +#define I2C_MASTER_ERR_NONE 0 +#define I2C_MASTER_ERR_ADDR_ACK 0x00000004 +#define I2C_MASTER_ERR_DATA_ACK 0x00000008 +#define I2C_MASTER_ERR_ARB_LOST 0x00000010 + +//***************************************************************************** +// +// I2C Slave action requests +// +//***************************************************************************** +#define I2C_SLAVE_ACT_NONE 0 +#define I2C_SLAVE_ACT_RREQ 0x00000001 // Master has sent data +#define I2C_SLAVE_ACT_TREQ 0x00000002 // Master has requested data + +//***************************************************************************** +// Miscellaneous I2C driver definitions. +//***************************************************************************** +#define I2C_MASTER_MAX_RETRIES 1000 // Number of retries + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void I2CIntRegister(unsigned long ulBase, void(fnHandler)(void)); +extern void I2CIntUnregister(unsigned long ulBase); +extern tBoolean I2CMasterBusBusy(unsigned long ulBase); +extern tBoolean I2CMasterBusy(unsigned long ulBase); +extern void I2CMasterControl(unsigned long ulBase, unsigned long ulCmd); +extern unsigned long I2CMasterDataGet(unsigned long ulBase); +extern void I2CMasterDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CMasterDisable(unsigned long ulBase); +extern void I2CMasterEnable(unsigned long ulBase); +extern unsigned long I2CMasterErr(unsigned long ulBase); +extern void I2CMasterInit(unsigned long ulBase, tBoolean bFast); +extern void I2CMasterIntClear(unsigned long ulBase); +extern void I2CMasterIntDisable(unsigned long ulBase); +extern void I2CMasterIntEnable(unsigned long ulBase); +extern tBoolean I2CMasterIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void I2CMasterSlaveAddrSet(unsigned long ulBase, + unsigned char ucSlaveAddr, + tBoolean bReceive); +extern unsigned long I2CSlaveDataGet(unsigned long ulBase); +extern void I2CSlaveDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CSlaveDisable(unsigned long ulBase); +extern void I2CSlaveEnable(unsigned long ulBase); +extern void I2CSlaveInit(unsigned long ulBase, unsigned char ucSlaveAddr); +extern void I2CSlaveIntClear(unsigned long ulBase); +extern void I2CSlaveIntDisable(unsigned long ulBase); +extern void I2CSlaveIntEnable(unsigned long ulBase); +extern tBoolean I2CSlaveIntStatus(unsigned long ulBase, tBoolean bMasked); +extern unsigned long I2CSlaveStatus(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __I2C_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/interrupt.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/interrupt.h new file mode 100644 index 0000000..98f0f86 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/interrupt.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// interrupt.h - Prototypes for the NVIC Interrupt Controller Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void IntMasterEnable(void); +extern void IntMasterDisable(void); +extern void IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)); +extern void IntUnregister(unsigned long ulInterrupt); +extern void IntPriorityGroupingSet(unsigned long ulBits); +extern unsigned long IntPriorityGroupingGet(void); +extern void IntPrioritySet(unsigned long ulInterrupt, + unsigned char ucPriority); +extern long IntPriorityGet(unsigned long ulInterrupt); +extern void IntEnable(unsigned long ulInterrupt); +extern void IntDisable(unsigned long ulInterrupt); + +#ifdef __cplusplus +} +#endif + +#endif // __INTERRUPT_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/pdc.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/pdc.c new file mode 100644 index 0000000..dfcf418 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/pdc.c @@ -0,0 +1,724 @@ +//***************************************************************************** +// +// pdc.c - Driver for the Peripheral Device Controller (PDC) on the Stellaris +// development board. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup utilities_api +//! @{ +// +//***************************************************************************** + +#include "hw_memmap.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "pdc.h" + +//***************************************************************************** +// +//! Initializes the connection to the PDC. +//! +//! This function will enable clocking to the SSI and GPIO A modules, configure +//! the GPIO pins to be used for an SSI interface, and it will configure the +//! SSI as a 1 Mbps master device, operating in MOTO mode. It will also enable +//! the SSI module, and will enable the chip select for the PDC on the +//! Stellaris development board. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCInit(void) +{ + // + // Enable the peripherals used to drive the PDC. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + // + // Configure the appropriate pins to be SSI instead of GPIO. + // + GPIODirModeSet(GPIO_PORTA_BASE, SSI_CLK | SSI_TX | SSI_RX, + GPIO_DIR_MODE_HW); + GPIODirModeSet(GPIO_PORTA_BASE, SSI_CS, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTA_BASE, SSI_CLK, GPIO_STRENGTH_4MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the SSI port. + // + SSIConfigSetExpClk(SSI_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0, + SSI_MODE_MASTER, 1000000, 8); + SSIEnable(SSI_BASE); + + // + // Reset the PDC SSI state machine. The chip select needs to be held low + // for 100ns; the procedure call overhead more than accounts for this time. + // + GPIOPinWrite(GPIO_PORTA_BASE, PDC_CS, 0); + GPIOPinWrite(GPIO_PORTA_BASE, PDC_CS, PDC_CS); +} + +//***************************************************************************** +// +//! Read a PDC register. +//! +//! \param ucAddr specifies the PDC register to read. +//! +//! This function will perform the SSI transfers required to read a register in +//! the PDC on the Stellaris development board. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return Returns the value read from the PDC. +// +//***************************************************************************** +unsigned char +PDCRead(unsigned char ucAddr) +{ + unsigned long ulTemp; + + // + // Send address and read command. + // + SSIDataPut(SSI_BASE, (ucAddr & 0x0F) | PDC_RD); + + // + // Dummy write to force read. + // + SSIDataPut(SSI_BASE, 0x00); + + // + // Flush data read during address write. + // + SSIDataGet(SSI_BASE, &ulTemp); + + // + // If the LCD control register or RAM is being read, then an additional + // byte needs to be transferred. + // + if((ucAddr == PDC_LCD_CSR) || (ucAddr == PDC_LCD_RAM)) + { + // + // Dummy write to force read. + // + SSIDataPut(SSI_BASE, 0x00); + + // + // Flush read data. + // + SSIDataGet(SSI_BASE, &ulTemp); + } + + // + // Read valid data. + // + SSIDataGet(SSI_BASE, &ulTemp); + + // + // Return the data read. + // + return(ulTemp & 0xFF); +} + +//***************************************************************************** +// +//! Write a PDC register. +//! +//! \param ucAddr specifies the PDC register to write. +//! \param ucData specifies the data to write. +//! +//! This function will perform the SSI transfers required to write a register +//! in the PDC on the Stellaris development board. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCWrite(unsigned char ucAddr, unsigned char ucData) +{ + unsigned long ulTemp; + + // + // Send address and write command. + // + SSIDataPut(SSI_BASE, (ucAddr & 0x0F) | PDC_WR); + + // + // Write the data. + // + SSIDataPut(SSI_BASE, ucData); + + // + // Flush data read during address write. + // + SSIDataGet(SSI_BASE, &ulTemp); + + // + // Flush data read during data write. + // + SSIDataGet(SSI_BASE, &ulTemp); +} + +//***************************************************************************** +// +//! Read the current value of the PDC DIP switches. +//! +//! This function will read the current value of the DIP switches attached to +//! the PDC on the Stellaris development board. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return The current state of the DIP switches. +// +//***************************************************************************** +unsigned char +PDCDIPRead(void) +{ + return(PDCRead(PDC_DSW)); +} + +//***************************************************************************** +// +//! Write to the PDC LEDs. +//! +//! \param ucLED value to write to the LEDs. +//! +//! This function set the state of the LEDs connected to the PDC on the +//! Stellaris development board. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCLEDWrite(unsigned char ucLED) +{ + PDCWrite(PDC_LED, ucLED); +} + +//***************************************************************************** +// +//! Read the current status of the PDC LEDs. +//! +//! This function will read the state of the LEDs connected to the PDC on the +//! Stellaris development board. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return The value currently displayed by the LEDs. +// +//***************************************************************************** +unsigned char +PDCLEDRead(void) +{ + return(PDCRead(PDC_LED)); +} + +//***************************************************************************** +// +//! Initializes the LCD display. +//! +//! This function will set up the LCD display for writing. It will set the +//! data bus to 8 bits, set the number of lines to 2, and the font size to +//! 5x10. It will also turn the display off, clear the display, turn the +//! display back on, and enable the backlight. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \note The PDC must be initialized via the PDCInit() function before this +//! function can be called. Also, it may be necessary to adjust the contrast +//! potentiometer in order to discern any output on the LCD display. +//! +//! \return None. +// +//***************************************************************************** +void +PDCLCDInit(void) +{ + unsigned char pucCfg[] = + { + 0x3C, // Number of lines = 2 / font = 5x10 + 0x08, // Display off + 0x01, // Display clear + 0x06, // Entry mode [cursor dir][shift] + 0x0C, // Display on [display on][curson on][blinking on] + }; + unsigned long ulIdx; + + // + // Set the data bus width to eight bits. + // + PDCWrite(PDC_LCD_CSR, 0x30); + + // + // Wait for 4.1ms by reading the PDC version register enough times to + // guarantee that amount of time has passed. + // + for(ulIdx = 0; ulIdx < 257; ulIdx++) + { + PDCRead(PDC_VER); + } + + // + // Set the data bus width to eight bits. + // + PDCWrite(PDC_LCD_CSR, 0x30); + + // + // Wait for 100us by reading the PDC version register enough times to + // guarantee that amount of time has passed. This works out to 112us plus + // overhead. + // + for(ulIdx = 0; ulIdx < 7; ulIdx++) + { + PDCRead(PDC_VER); + } + + // + // Set the data bus width to eight bits. + // + PDCWrite(PDC_LCD_CSR, 0x30); + + // + // Configure the LCD. + // + for(ulIdx = 0; ulIdx < (sizeof(pucCfg) / sizeof(pucCfg[0])); ulIdx++) + { + // + // Wait until the LCD has finished executing any previous command. + // + while((PDCRead(PDC_LCD_CSR) & LCD_B_BUSY)) + { + } + + // + // Write the next configuration byte. + // + PDCWrite(PDC_LCD_CSR, pucCfg[ulIdx]); + } +} + +//***************************************************************************** +// +//! Turns on the backlight. +//! +//! This function turns on the backlight on the LCD. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCLCDBacklightOn(void) +{ + PDCWrite(PDC_CSR, 0x01); +} + +//***************************************************************************** +// +//! Turn off the backlight. +//! +//! This function turns off the backlight on the LCD. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCLCDBacklightOff(void) +{ + PDCWrite(PDC_CSR, 0x00); +} + +//***************************************************************************** +// +//! Clear the screen. +//! +//! This function clears the contents of the LCD screen. The cursor will be +//! returned to the upper left corner. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCLCDClear(void) +{ + // + // Wait until the LCD has finished executing any previous command. + // + while((PDCRead(PDC_LCD_CSR) & LCD_B_BUSY)) + { + } + + // + // Write the clear display command. + // + PDCWrite(PDC_LCD_CSR, LCD_CLEAR); +} + +//***************************************************************************** +// +//! Write a character pattern to the LCD. +//! +//! \param ucChar is the character index to create. Valid values are zero +//! through seven. +//! \param pucData is the data for the character pattern. It contains eight +//! bytes, with the first byte being the top row of the pattern. In each byte, +//! the LSB is the right pixel of the pattern. +//! +//! This function will write a character pattern into the LCD for use as a +//! character to be displayed. After writing the pattern, it can be used on +//! the LCD by writing the corresponding character index to the display. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCLCDCreateChar(unsigned char ucChar, unsigned char *pucData) +{ + // + // Check the arguments. + // + ASSERT(ucChar < 8); + + // + // Wait until the LCD has finished executing any previous command. + // + while((PDCRead(PDC_LCD_CSR) & LCD_B_BUSY)) + { + } + + // + // Write the character pattern memory address. + // + PDCWrite(PDC_LCD_CSR, LCD_CGADDR + (ucChar * 8)); + + // + // Write the pattern to chacter pattern memory. + // + for(ucChar = 0; ucChar < 8; ucChar++) + { + // + // Wait until the LCD has finished executing any previous command. + // + while((PDCRead(PDC_LCD_CSR) & LCD_B_BUSY)) + { + } + + // + // Write this row of the pattern. + // + PDCWrite(PDC_LCD_RAM, *pucData++); + } +} + +//***************************************************************************** +// +//! Set the position of the cursor. +//! +//! \param ucX is the horizontal position. Valid values are zero through +//! fifteen. +//! \param ucY is the vertical position.. Valid values are zero and one. +//! +//! This function will move the cursor to the specified position. All +//! characters written to the LCD are placed at the current cursor position, +//! which is automatically advanced. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCLCDSetPos(unsigned char ucX, unsigned char ucY) +{ + // + // Check the arguments. + // + ASSERT(ucX < 16); + ASSERT(ucY < 2); + + // + // Wait until the LCD has finished executing any previous command. + // + while((PDCRead(PDC_LCD_CSR) & LCD_B_BUSY)) + { + } + + // + // Set the cursor position. + // + PDCWrite(PDC_LCD_CSR, LCD_DDADDR | (0x40 * ucY) + ucX); +} + +//***************************************************************************** +// +//! Writes a string to the LCD display. +//! +//! \param pcStr pointer to the string to be displayed. +//! \param ulCount is the number of characters to be displayed. +//! +//! This function will display a string on the LCD at the current cursor +//! position. It is the caller's responsibility to position the cursor to the +//! place where the string should be displayed (either explicitly via +//! PDCLCDSetPos() or implicitly from where the cursor was left after a +//! previous call to PDCLCDWrite()), and to properly account for the LCD +//! boundary (line wrapping is not automatically performed). Null characters +//! are not treated special and are written to the LCD, which interprets it as +//! a special programmable character glyph (see PDCLCDCreateChar()). +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCLCDWrite(const char *pcStr, unsigned long ulCount) +{ + // + // Write the string to the LCD. + // + while(ulCount--) + { + // + // Wait until the LCD has finished executing any previous command. + // + while((PDCRead(PDC_LCD_CSR) & LCD_B_BUSY)) + { + } + + // + // Write this character to the LCD. + // + PDCWrite(PDC_LCD_RAM, *pcStr++); + } +} + +//***************************************************************************** +// +//! Reads a GPIO direction register. +//! +//! \param ucIdx is the index of the GPIO direction register to read; valid +//! values are 0, 1, and 2. +//! +//! This function reads one of the GPIO direction registers in the PDC. The +//! direction bit is set for pins that are outputs and clear for pins that are +//! inputs. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return The contents of the direction register. +// +//***************************************************************************** +unsigned char +PDCGPIODirRead(unsigned char ucIdx) +{ + // + // Check the argument. + // + ASSERT((ucIdx == 0) || (ucIdx == 1) || (ucIdx == 2)); + + // + // Read the requested direction register. + // + if(ucIdx == 0) + { + return(PDCRead(PDC_GPXDIR)); + } + else if(ucIdx == 1) + { + return(PDCRead(PDC_GPYDIR)); + } + else + { + return(PDCRead(PDC_GPZDIR)); + } +} + +//***************************************************************************** +// +//! Write a GPIO direction register. +//! +//! \param ucIdx is the index of the GPIO direction register to write; valid +//! values are 0, 1, and 2. +//! \param ucValue is the value to write to the GPIO direction register. +//! +//! This function writes ones of the GPIO direction registers in the PDC. The +//! direction bit should be set for pins that are to be outputs and clear for +//! pins that are to be inputs. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCGPIODirWrite(unsigned char ucIdx, unsigned char ucValue) +{ + // + // Check the arguments. + // + ASSERT((ucIdx == 0) || (ucIdx == 1) || (ucIdx == 2)); + + // + // Write the requested direction register. + // + if(ucIdx == 0) + { + PDCWrite(PDC_GPXDIR, ucValue); + } + else if(ucIdx == 1) + { + PDCWrite(PDC_GPYDIR, ucValue); + } + else + { + PDCWrite(PDC_GPZDIR, ucValue); + } +} + +//***************************************************************************** +// +//! Reads a GPIO data register. +//! +//! \param ucIdx is the index of the GPIO direction register to read; valid +//! values are 0, 1, and 2. +//! +//! This function reads one of the GPIO data registers in the PDC. The value +//! returned for a pin is the value being driven out for outputs or the value +//! being read for inputs. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return The contents of the data register. +// +//***************************************************************************** +unsigned char +PDCGPIORead(unsigned char ucIdx) +{ + // + // Check the argument. + // + ASSERT((ucIdx == 0) || (ucIdx == 1) || (ucIdx == 2)); + + // + // Read the requested data register. + // + if(ucIdx == 0) + { + return(PDCRead(PDC_GPXDAT)); + } + else if(ucIdx == 1) + { + return(PDCRead(PDC_GPYDAT)); + } + else + { + return(PDCRead(PDC_GPZDAT)); + } +} + +//***************************************************************************** +// +//! Write a GPIO data register. +//! +//! \param ucIdx is the index of the GPIO data register to write; valid values +//! are 0, 1, and 2. +//! \param ucValue is the value to write to the GPIO data register. +//! +//! This function writes one of the GPIO direction registers in the PDC. The +//! written to a pin is driven out for output pins and ignored for input pins. +//! +//! This function is contained in utils/pdc.c, with +//! utils/pdc.h containing the API definition for use by applications. +//! +//! \return None. +// +//***************************************************************************** +void +PDCGPIOWrite(unsigned char ucIdx, unsigned char ucValue) +{ + // + // Check the arguments. + // + ASSERT((ucIdx == 0) || (ucIdx == 1) || (ucIdx == 2)); + + // + // Write the requested data register. + // + if(ucIdx == 0) + { + PDCWrite(PDC_GPXDAT, ucValue); + } + else if(ucIdx == 1) + { + PDCWrite(PDC_GPYDAT, ucValue); + } + else + { + PDCWrite(PDC_GPZDAT, ucValue); + } +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/pdc.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/pdc.h new file mode 100644 index 0000000..9529424 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/pdc.h @@ -0,0 +1,124 @@ +//***************************************************************************** +// +// pdc.h - Stellaris development board Peripheral Device Controller definitions +// and prototypes. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __PDC_H__ +#define __PDC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The registers within the peripheral device controller. +// +//***************************************************************************** +#define PDC_VER 0x0 // Version register +#define PDC_CSR 0x1 // Command/Status register +#define PDC_DSW 0x4 // DIP Switch register +#define PDC_LED 0x5 // LED register +#define PDC_LCD_CSR 0x6 // LCD Command/Status register +#define PDC_LCD_RAM 0x7 // LCD RAM register +#define PDC_GPXDAT 0x8 // GPIO X Data register +#define PDC_GPXDIR 0x9 // GPIO X Direction register +#define PDC_GPYDAT 0xA // GPIO Y Data register +#define PDC_GPYDIR 0xB // GPIO Y Direction register +#define PDC_GPZDAT 0xC // GPIO Z Data register +#define PDC_GPZDIR 0xD // GPIO Z Direction register + +//***************************************************************************** +// +// Flags indicating a read or write to the peripheral device controller. +// +//***************************************************************************** +#define PDC_RD 0x80 // PDC read command +#define PDC_WR 0x00 // PDC write command + +//***************************************************************************** +// +// LCD panel (Crystalfontz CFAH1602B) commands, RS = 0 +// +//***************************************************************************** +#define LCD_CLEAR 0x01 // Clear display (0 fill DDRAM). +#define LCD_HOME 0x02 // Cursor home. +#define LCD_MODE 0x04 // Set entry mode (cursor dir) +#define LCD_ON 0x08 // Set display, cursor, blinking + // on/off +#define LCD_CUR 0x10 // Cursor, display shift +#define LCD_IF 0x20 // Set interface data length, + // lines, font +#define LCD_CGADDR 0x40 // Set CGRAM AC address +#define LCD_DDADDR 0x80 // Set DDRAM AC address + +//***************************************************************************** +// +// LCD Status bit +// +//***************************************************************************** +#define LCD_B_BUSY 0x80 // Busy flag. + +//***************************************************************************** +// +// The GPIO port A pin numbers for the various SSI signals. +// +//***************************************************************************** +#define SSI_CS GPIO_PIN_3 +#define PDC_CS GPIO_PIN_3 +#define SSI_CLK GPIO_PIN_2 +#define SSI_TX GPIO_PIN_5 +#define SSI_RX GPIO_PIN_4 + +//***************************************************************************** +// +// Function Prototypes +// +//***************************************************************************** +extern void PDCInit(void); +extern unsigned char PDCRead(unsigned char ucAddr); +extern void PDCWrite(unsigned char ucAddr, unsigned char ucData); +extern unsigned char PDCDIPRead(void); +extern void PDCLEDWrite(unsigned char ucLED); +extern unsigned char PDCLEDRead(void); +extern void PDCLCDInit(void); +extern void PDCLCDBacklightOn(void); +extern void PDCLCDBacklightOff(void); +extern void PDCLCDClear(void); +extern void PDCLCDCreateChar(unsigned char ucChar, unsigned char *pucData); +extern void PDCLCDSetPos(unsigned char ucX, unsigned char ucY); +extern void PDCLCDWrite(const char *pcStr, unsigned long ulCount); +extern unsigned char PDCGPIODirRead(unsigned char ucIdx); +extern void PDCGPIODirWrite(unsigned char ucIdx, unsigned char ucValue); +extern unsigned char PDCGPIORead(unsigned char ucIdx); +extern void PDCGPIOWrite(unsigned char ucIdx, unsigned char ucValue); + +#ifdef __cplusplus +} +#endif + +#endif // __PDC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/pwm.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/pwm.h new file mode 100644 index 0000000..13cd4e1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/pwm.h @@ -0,0 +1,161 @@ +//***************************************************************************** +// +// pwm.h - API function protoypes for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __PWM_H__ +#define __PWM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following defines are passed to PWMGenConfigure() as the ulConfig +// parameter and specify the configuration of the PWM generator. +// +//***************************************************************************** +#define PWM_GEN_MODE_DOWN 0x00000000 // Down count mode +#define PWM_GEN_MODE_UP_DOWN 0x00000002 // Up/Down count mode +#define PWM_GEN_MODE_SYNC 0x00000038 // Synchronous updates +#define PWM_GEN_MODE_NO_SYNC 0x00000000 // Immediate updates +#define PWM_GEN_MODE_DBG_RUN 0x00000004 // Continue running in debug mode +#define PWM_GEN_MODE_DBG_STOP 0x00000000 // Stop running in debug mode + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM generator interrupts and +// triggers. +// +//***************************************************************************** +#define PWM_INT_CNT_ZERO 0x00000001 // Int if COUNT = 0 +#define PWM_INT_CNT_LOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_INT_CNT_AU 0x00000004 // Int if COUNT = CMPA U +#define PWM_INT_CNT_AD 0x00000008 // Int if COUNT = CMPA D +#define PWM_INT_CNT_BU 0x00000010 // Int if COUNT = CMPA U +#define PWM_INT_CNT_BD 0x00000020 // Int if COUNT = CMPA D +#define PWM_TR_CNT_ZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_TR_CNT_LOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_TR_CNT_AU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_AD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_TR_CNT_BU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_BD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM interrupts. +// +//***************************************************************************** +#define PWM_INT_GEN_0 0x00000001 // Generator 0 interrupt +#define PWM_INT_GEN_1 0x00000002 // Generator 1 interrupt +#define PWM_INT_GEN_2 0x00000004 // Generator 2 interrupt +#define PWM_INT_FAULT 0x00010000 // Fault interrupt + +//***************************************************************************** +// +// Defines to identify the generators within a module. +// +//***************************************************************************** +#define PWM_GEN_0 0x00000040 // Offset address of Gen0 +#define PWM_GEN_1 0x00000080 // Offset address of Gen1 +#define PWM_GEN_2 0x000000C0 // Offset address of Gen2 + +#define PWM_GEN_0_BIT 0x00000001 // Bit-wise ID for Gen0 +#define PWM_GEN_1_BIT 0x00000002 // Bit-wise ID for Gen1 +#define PWM_GEN_2_BIT 0x00000004 // Bit-wise ID for Gen2 + +//***************************************************************************** +// +// Defines to identify the outputs within a module. +// +//***************************************************************************** +#define PWM_OUT_0 0x00000040 // Encoded offset address of PWM0 +#define PWM_OUT_1 0x00000041 // Encoded offset address of PWM1 +#define PWM_OUT_2 0x00000082 // Encoded offset address of PWM2 +#define PWM_OUT_3 0x00000083 // Encoded offset address of PWM3 +#define PWM_OUT_4 0x000000C4 // Encoded offset address of PWM4 +#define PWM_OUT_5 0x000000C5 // Encoded offset address of PWM5 + +#define PWM_OUT_0_BIT 0x00000001 // Bit-wise ID for PWM0 +#define PWM_OUT_1_BIT 0x00000002 // Bit-wise ID for PWM1 +#define PWM_OUT_2_BIT 0x00000004 // Bit-wise ID for PWM2 +#define PWM_OUT_3_BIT 0x00000008 // Bit-wise ID for PWM3 +#define PWM_OUT_4_BIT 0x00000010 // Bit-wise ID for PWM4 +#define PWM_OUT_5_BIT 0x00000020 // Bit-wise ID for PWM5 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void PWMGenConfigure(unsigned long ulBase, unsigned long ulGen, + unsigned long ulConfig); +extern void PWMGenPeriodSet(unsigned long ulBase, unsigned long ulGen, + unsigned long ulPeriod); +extern unsigned long PWMGenPeriodGet(unsigned long ulBase, + unsigned long ulGen); +extern void PWMGenEnable(unsigned long ulBase, unsigned long ulGen); +extern void PWMGenDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, + unsigned long ulWidth); +extern unsigned long PWMPulseWidthGet(unsigned long ulBase, + unsigned long ulPWMOut); +extern void PWMDeadBandEnable(unsigned long ulBase, unsigned long ulGen, + unsigned short usRise, unsigned short usFall); +extern void PWMDeadBandDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMSyncUpdate(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMSyncTimeBase(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMOutputState(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bEnable); +extern void PWMOutputInvert(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bInvert); +extern void PWMOutputFault(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bFaultKill); +extern void PWMGenIntRegister(unsigned long ulBase, unsigned long ulGen, + void (*pfIntHandler)(void)); +extern void PWMGenIntUnregister(unsigned long ulBase, unsigned long ulGen); +extern void PWMFaultIntRegister(unsigned long ulBase, + void (*pfIntHandler)(void)); +extern void PWMFaultIntUnregister(unsigned long ulBase); +extern void PWMGenIntTrigEnable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern void PWMGenIntTrigDisable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern unsigned long PWMGenIntStatus(unsigned long ulBase, unsigned long ulGen, + tBoolean bMasked); +extern void PWMGenIntClear(unsigned long ulBase, unsigned long ulGen, + unsigned long ulInts); +extern void PWMIntEnable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMIntDisable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMFaultIntClear(unsigned long ulBase); +extern unsigned long PWMIntStatus(unsigned long ulBase, tBoolean bMasked); + +#ifdef __cplusplus +} +#endif + +#endif // __PWM_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/ssi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/ssi.h new file mode 100644 index 0000000..eb13740 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/ssi.h @@ -0,0 +1,92 @@ +//***************************************************************************** +// +// ssi.h - Prototypes for the Synchronous Serial Interface Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SSI_H__ +#define __SSI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to SSIIntEnable, SSIIntDisable, and SSIIntClear +// as the ulIntFlags parameter, and returned by SSIIntStatus. +// +//***************************************************************************** +#define SSI_TXFF 0x00000008 // TX FIFO half empty or less +#define SSI_RXFF 0x00000004 // RX FIFO half full or less +#define SSI_RXTO 0x00000002 // RX timeout +#define SSI_RXOR 0x00000001 // RX overrun + +//***************************************************************************** +// +// Values that can be passed to SSIConfig. +// +//***************************************************************************** +#define SSI_FRF_MOTO_MODE_0 0x00000000 // Moto fmt, polarity 0, phase 0 +#define SSI_FRF_MOTO_MODE_1 0x00000002 // Moto fmt, polarity 0, phase 1 +#define SSI_FRF_MOTO_MODE_2 0x00000001 // Moto fmt, polarity 1, phase 0 +#define SSI_FRF_MOTO_MODE_3 0x00000003 // Moto fmt, polarity 1, phase 1 +#define SSI_FRF_TI 0x00000010 // TI frame format +#define SSI_FRF_NMW 0x00000020 // National MicroWire frame format + +#define SSI_MODE_MASTER 0x00000000 // SSI master +#define SSI_MODE_SLAVE 0x00000001 // SSI slave +#define SSI_MODE_SLAVE_OD 0x00000002 // SSI slave with output disabled + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SSIConfig(unsigned long ulBase, unsigned long ulProtocol, + unsigned long ulMode, unsigned long ulBitRate, + unsigned long ulDataWidth); +extern void SSIDataGet(unsigned long ulBase, unsigned long *ulData); +extern long SSIDataNonBlockingGet(unsigned long ulBase, unsigned long *ulData); +extern void SSIDataPut(unsigned long ulBase, unsigned long ulData); +extern long SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData); +extern void SSIDisable(unsigned long ulBase); +extern void SSIEnable(unsigned long ulBase); +extern void SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern unsigned long SSIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void SSIIntUnregister(unsigned long ulBase); +extern void SSIConfigSetExpClk(unsigned long ulBase, unsigned long ulSSIClk, + unsigned long ulProtocol, unsigned long ulMode, + unsigned long ulBitRate, + unsigned long ulDataWidth); + +#ifdef __cplusplus +} +#endif + +#endif // __SSI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/startup.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/startup.c new file mode 100644 index 0000000..a76a783 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/startup.c @@ -0,0 +1,195 @@ +//***************************************************************************** +// +// startup.c - Boot code for Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void xPortPendSVHandler(void); +extern void xPortSysTickHandler(void); +extern void vUART_ISR( void ); +extern void vPortSVCHandler( void ); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +#ifndef STACK_SIZE +#define STACK_SIZE 50 +#endif +static unsigned long pulStack[STACK_SIZE] @ ".noinit"; +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + unsigned long ulPtr; +} +uVectorEntry; + +//***************************************************************************** +// +// The minimal vector table for a Cortex-M3. Note that the proper constructs +// must be placed on this to ensure that it ends up at physical address +// 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ulPtr = (unsigned long)pulStack + sizeof(pulStack) }, + // The initial stack pointer + __iar_program_start, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + vUART_ISR, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI Rx and Tx + IntDefaultHandler, // I2C Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + 0, // Reserved + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler // FLASH Control +}; + + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/sysctl.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/sysctl.h new file mode 100644 index 0000000..f9ce18d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/sysctl.h @@ -0,0 +1,266 @@ +//***************************************************************************** +// +// sysctl.h - Prototypes for the system control driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SYSCTL_H__ +#define __SYSCTL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following are values that can be passed to the +// SysCtlPeripheralPresent(), SysCtlPeripheralEnable(), +// SysCtlPeripheralDisable(), and SysCtlPeripheralReset() APIs as the +// ulPeripheral parameter. The peripherals in the fourth group (upper nibble +// is 3) can only be used with the SysCtlPeripheralPresent() API. +// +//***************************************************************************** +#define SYSCTL_PERIPH_PWM 0x00100000 // PWM +#define SYSCTL_PERIPH_ADC 0x00010000 // ADC +#define SYSCTL_PERIPH_WDOG 0x00000008 // Watchdog +#define SYSCTL_PERIPH_UART0 0x10000001 // UART 0 +#define SYSCTL_PERIPH_UART1 0x10000002 // UART 1 +#define SYSCTL_PERIPH_SSI 0x10000010 // SSI +#define SYSCTL_PERIPH_I2C 0x10001000 // I2C +#define SYSCTL_PERIPH_TIMER0 0x10010000 // Timer 0 +#define SYSCTL_PERIPH_TIMER1 0x10020000 // Timer 1 +#define SYSCTL_PERIPH_TIMER2 0x10040000 // Timer 2 +#define SYSCTL_PERIPH_COMP0 0x11000000 // Analog comparator 0 +#define SYSCTL_PERIPH_COMP1 0x12000000 // Analog comparator 1 +#define SYSCTL_PERIPH_COMP2 0x14000000 // Analog comparator 2 +#define SYSCTL_PERIPH_GPIOA 0x20000001 // GPIO A +#define SYSCTL_PERIPH_GPIOB 0x20000002 // GPIO B +#define SYSCTL_PERIPH_GPIOC 0x20000004 // GPIO C +#define SYSCTL_PERIPH_GPIOD 0x20000008 // GPIO D +#define SYSCTL_PERIPH_GPIOE 0x20000010 // GPIO E +#define SYSCTL_PERIPH_MPU 0x30000080 // Cortex-M3 MPU +#define SYSCTL_PERIPH_TEMP 0x30000020 // Temperature sensor +#define SYSCTL_PERIPH_PLL 0x30000010 // PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPinPresent() API +// as the ulPin parameter. +// +//***************************************************************************** +#define SYSCTL_PIN_PWM0 0x00000001 // PWM0 pin +#define SYSCTL_PIN_PWM1 0x00000002 // PWM1 pin +#define SYSCTL_PIN_PWM2 0x00000004 // PWM2 pin +#define SYSCTL_PIN_PWM3 0x00000008 // PWM3 pin +#define SYSCTL_PIN_PWM4 0x00000010 // PWM4 pin +#define SYSCTL_PIN_PWM5 0x00000020 // PWM5 pin +#define SYSCTL_PIN_C0MINUS 0x00000040 // C0- pin +#define SYSCTL_PIN_C0PLUS 0x00000080 // C0+ pin +#define SYSCTL_PIN_C0O 0x00000100 // C0o pin +#define SYSCTL_PIN_C1MINUS 0x00000200 // C1- pin +#define SYSCTL_PIN_C1PLUS 0x00000400 // C1+ pin +#define SYSCTL_PIN_C1O 0x00000800 // C1o pin +#define SYSCTL_PIN_C2MINUS 0x00001000 // C2- pin +#define SYSCTL_PIN_C2PLUS 0x00002000 // C2+ pin +#define SYSCTL_PIN_C2O 0x00004000 // C2o pin +#define SYSCTL_PIN_ADC0 0x00010000 // ADC0 pin +#define SYSCTL_PIN_ADC1 0x00020000 // ADC1 pin +#define SYSCTL_PIN_ADC2 0x00040000 // ADC2 pin +#define SYSCTL_PIN_ADC3 0x00080000 // ADC3 pin +#define SYSCTL_PIN_CCP0 0x01000000 // CCP0 pin +#define SYSCTL_PIN_CCP1 0x02000000 // CCP1 pin +#define SYSCTL_PIN_CCP2 0x04000000 // CCP2 pin +#define SYSCTL_PIN_CCP3 0x08000000 // CCP3 pin +#define SYSCTL_PIN_CCP4 0x10000000 // CCP4 pin +#define SYSCTL_PIN_CCP5 0x20000000 // CCP5 pin +#define SYSCTL_PIN_32KHZ 0x80000000 // 32kHz pin + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOSet() API as +// the ulVoltage value, or returned by the SysCtlLDOGet() API. +// +//***************************************************************************** +#define SYSCTL_LDO_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDO_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDO_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDO_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDO_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDO_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDO_2_55V 0x0000001f // LDO output of 2.55V +#define SYSCTL_LDO_2_60V 0x0000001e // LDO output of 2.60V +#define SYSCTL_LDO_2_65V 0x0000001d // LDO output of 2.65V +#define SYSCTL_LDO_2_70V 0x0000001c // LDO output of 2.70V +#define SYSCTL_LDO_2_75V 0x0000001b // LDO output of 2.75V + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOConfigSet() API. +// +//***************************************************************************** +#define SYSCTL_LDOCFG_ARST 0x00000001 // Allow LDO failure to reset +#define SYSCTL_LDOCFG_NORST 0x00000000 // Do not reset on LDO failure + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlIntEnable(), +// SysCtlIntDisable(), and SysCtlIntClear() APIs, or returned in the bit mask +// by the SysCtlIntStatus() API. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlResetCauseClear() +// API or returned by the SysCtlResetCauseGet() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_LDO 0x00000020 // LDO power not OK reset +#define SYSCTL_CAUSE_SW 0x00000010 // Software reset +#define SYSCTL_CAUSE_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_CAUSE_BOR 0x00000004 // Brown-out reset +#define SYSCTL_CAUSE_POR 0x00000002 // Power on reset +#define SYSCTL_CAUSE_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlBrownOutConfigSet() +// API as the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_BOR_RESET 0x00000002 // Reset instead of interrupting +#define SYSCTL_BOR_RESAMPLE 0x00000001 // Resample BOR before asserting + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPWMClockSet() API +// as the ulConfig parameter, and can be returned by the SysCtlPWMClockGet() +// API. +// +//***************************************************************************** +#define SYSCTL_PWMDIV_1 0x00000000 // PWM clock is processor clock /1 +#define SYSCTL_PWMDIV_2 0x00100000 // PWM clock is processor clock /2 +#define SYSCTL_PWMDIV_4 0x00120000 // PWM clock is processor clock /4 +#define SYSCTL_PWMDIV_8 0x00140000 // PWM clock is processor clock /8 +#define SYSCTL_PWMDIV_16 0x00160000 // PWM clock is processor clock /16 +#define SYSCTL_PWMDIV_32 0x00180000 // PWM clock is processor clock /32 +#define SYSCTL_PWMDIV_64 0x001A0000 // PWM clock is processor clock /64 + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlClockSet() API as +// the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_SYSDIV_1 0x07800000 // Processor clock is osc/pll /1 +#define SYSCTL_SYSDIV_2 0x00C00000 // Processor clock is osc/pll /2 +#define SYSCTL_SYSDIV_3 0x01400000 // Processor clock is osc/pll /3 +#define SYSCTL_SYSDIV_4 0x01C00000 // Processor clock is osc/pll /4 +#define SYSCTL_SYSDIV_5 0x02400000 // Processor clock is osc/pll /5 +#define SYSCTL_SYSDIV_6 0x02C00000 // Processor clock is osc/pll /6 +#define SYSCTL_SYSDIV_7 0x03400000 // Processor clock is osc/pll /7 +#define SYSCTL_SYSDIV_8 0x03C00000 // Processor clock is osc/pll /8 +#define SYSCTL_SYSDIV_9 0x04400000 // Processor clock is osc/pll /9 +#define SYSCTL_SYSDIV_10 0x04C00000 // Processor clock is osc/pll /10 +#define SYSCTL_SYSDIV_11 0x05400000 // Processor clock is osc/pll /11 +#define SYSCTL_SYSDIV_12 0x05C00000 // Processor clock is osc/pll /12 +#define SYSCTL_SYSDIV_13 0x06400000 // Processor clock is osc/pll /13 +#define SYSCTL_SYSDIV_14 0x06C00000 // Processor clock is osc/pll /14 +#define SYSCTL_SYSDIV_15 0x07400000 // Processor clock is osc/pll /15 +#define SYSCTL_SYSDIV_16 0x07C00000 // Processor clock is osc/pll /16 +#define SYSCTL_USE_PLL 0x00000000 // System clock is the PLL clock +#define SYSCTL_USE_OSC 0x00003800 // System clock is the osc clock +#define SYSCTL_XTAL_3_57MHZ 0x00000100 // External crystal is 3.579545MHz +#define SYSCTL_XTAL_3_68MHZ 0x00000140 // External crystal is 3.6864MHz +#define SYSCTL_XTAL_4MHZ 0x00000180 // External crystal is 4MHz +#define SYSCTL_XTAL_4_09MHZ 0x000001C0 // External crystal is 4.096MHz +#define SYSCTL_XTAL_4_91MHZ 0x00000200 // External crystal is 4.9152MHz +#define SYSCTL_XTAL_5MHZ 0x00000240 // External crystal is 5MHz +#define SYSCTL_XTAL_5_12MHZ 0x00000280 // External crystal is 5.12MHz +#define SYSCTL_XTAL_6MHZ 0x000002C0 // External crystal is 6MHz +#define SYSCTL_XTAL_6_14MHZ 0x00000300 // External crystal is 6.144MHz +#define SYSCTL_XTAL_7_37MHZ 0x00000340 // External crystal is 7.3728MHz +#define SYSCTL_XTAL_8MHZ 0x00000380 // External crystal is 8MHz +#define SYSCTL_XTAL_8_19MHZ 0x000003C0 // External crystal is 8.192MHz +#define SYSCTL_OSC_MAIN 0x00000000 // Oscillator source is main osc +#define SYSCTL_OSC_INT 0x00000010 // Oscillator source is int. osc +#define SYSCTL_OSC_INT4 0x00000020 // Oscillator source is int. osc /4 +#define SYSCTL_INT_OSC_DIS 0x00000002 // Disable internal oscillator +#define SYSCTL_MAIN_OSC_DIS 0x00000001 // Disable main oscillator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long SysCtlSRAMSizeGet(void); +extern unsigned long SysCtlFlashSizeGet(void); +extern tBoolean SysCtlPinPresent(unsigned long ulPin); +extern tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral); +extern void SysCtlPeripheralReset(unsigned long ulPeripheral); +extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralClockGating(tBoolean bEnable); +extern void SysCtlIntRegister(void (*pfnHandler)(void)); +extern void SysCtlIntUnregister(void); +extern void SysCtlIntEnable(unsigned long ulInts); +extern void SysCtlIntDisable(unsigned long ulInts); +extern void SysCtlIntClear(unsigned long ulInts); +extern unsigned long SysCtlIntStatus(tBoolean bMasked); +extern void SysCtlLDOSet(unsigned long ulVoltage); +extern unsigned long SysCtlLDOGet(void); +extern void SysCtlLDOConfigSet(unsigned long ulConfig); +extern void SysCtlReset(void); +extern void SysCtlSleep(void); +extern void SysCtlDeepSleep(void); +extern unsigned long SysCtlResetCauseGet(void); +extern void SysCtlResetCauseClear(unsigned long ulCauses); +extern void SysCtlBrownOutConfigSet(unsigned long ulConfig, + unsigned long ulDelay); +extern void SysCtlClockSet(unsigned long ulConfig); +extern unsigned long SysCtlClockGet(void); +extern void SysCtlPWMClockSet(unsigned long ulConfig); +extern unsigned long SysCtlPWMClockGet(void); +extern void SysCtlIOSCVerificationSet(tBoolean bEnable); +extern void SysCtlMOSCVerificationSet(tBoolean bEnable); +extern void SysCtlPLLVerificationSet(tBoolean bEnable); +extern void SysCtlClkVerificationClear(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSCTL_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/systick.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/systick.h new file mode 100644 index 0000000..9056076 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/systick.h @@ -0,0 +1,55 @@ +//***************************************************************************** +// +// systick.h - Prototypes for the SysTick driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SYSTICK_H__ +#define __SYSTICK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SysTickEnable(void); +extern void SysTickDisable(void); +extern void SysTickIntRegister(void (*pfnHandler)(void)); +extern void SysTickIntUnregister(void); +extern void SysTickIntEnable(void); +extern void SysTickIntDisable(void); +extern void SysTickPeriodSet(unsigned long ulPeriod); +extern unsigned long SysTickPeriodGet(void); +extern unsigned long SysTickValueGet(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSTICK_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/timer.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/timer.h new file mode 100644 index 0000000..e604186 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/uart.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/uart.h new file mode 100644 index 0000000..6047d3a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/uart.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// uart.h - Defines and Macros for the UART. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __UART_H__ +#define __UART_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to UARTIntEnable, UARTIntDisable, and UARTIntClear +// as the ulIntFlags parameter, and returned from UARTIntStatus. +// +//***************************************************************************** +#define UART_INT_OE 0x400 // Overrun Error Interrupt Mask +#define UART_INT_BE 0x200 // Break Error Interrupt Mask +#define UART_INT_PE 0x100 // Parity Error Interrupt Mask +#define UART_INT_FE 0x080 // Framing Error Interrupt Mask +#define UART_INT_RT 0x040 // Receive Timeout Interrupt Mask +#define UART_INT_TX 0x020 // Transmit Interrupt Mask +#define UART_INT_RX 0x010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Values that can be passed to UARTConfigSet as the ulConfig parameter and +// returned by UARTConfigGet in the pulConfig parameter. Additionally, the +// UART_CONFIG_PAR_* subset can be passed to UARTParityModeSet as the ulParity +// parameter, and are returned by UARTParityModeGet. +// +//***************************************************************************** +#define UART_CONFIG_WLEN_8 0x00000060 // 8 bit data +#define UART_CONFIG_WLEN_7 0x00000040 // 7 bit data +#define UART_CONFIG_WLEN_6 0x00000020 // 6 bit data +#define UART_CONFIG_WLEN_5 0x00000000 // 5 bit data +#define UART_CONFIG_STOP_ONE 0x00000000 // One stop bit +#define UART_CONFIG_STOP_TWO 0x00000008 // Two stop bits +#define UART_CONFIG_PAR_NONE 0x00000000 // No parity +#define UART_CONFIG_PAR_EVEN 0x00000006 // Even parity +#define UART_CONFIG_PAR_ODD 0x00000002 // Odd parity +#define UART_CONFIG_PAR_ONE 0x00000086 // Parity bit is one +#define UART_CONFIG_PAR_ZERO 0x00000082 // Parity bit is zero + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity); +extern unsigned long UARTParityModeGet(unsigned long ulBase); +extern void UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig); +extern void UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig); +extern void UARTEnable(unsigned long ulBase); +extern void UARTDisable(unsigned long ulBase); +extern tBoolean UARTCharsAvail(unsigned long ulBase); +extern tBoolean UARTSpaceAvail(unsigned long ulBase); +extern long UARTCharNonBlockingGet(unsigned long ulBase); +extern long UARTCharGet(unsigned long ulBase); +extern tBoolean UARTCharNonBlockingPut(unsigned long ulBase, + unsigned char ucData); +extern void UARTCharPut(unsigned long ulBase, unsigned char ucData); +extern void UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState); +extern void UARTIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void UARTIntUnregister(unsigned long ulBase); +extern void UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTConfigSetExpClk(unsigned long ulBase, unsigned long ulUARTClk, + unsigned long ulBaud, unsigned long ulConfig); + +#ifdef __cplusplus +} +#endif + +#endif // __UART_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/watchdog.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/watchdog.h new file mode 100644 index 0000000..4d6dcd2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/hw_include/watchdog.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// watchdog.h - Prototypes for the Watchdog Timer API +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 635 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __WATCHDOG_H__ +#define __WATCHDOG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern tBoolean WatchdogRunning(unsigned long ulBase); +extern void WatchdogEnable(unsigned long ulBase); +extern void WatchdogResetEnable(unsigned long ulBase); +extern void WatchdogResetDisable(unsigned long ulBase); +extern void WatchdogLock(unsigned long ulBase); +extern void WatchdogUnlock(unsigned long ulBase); +extern tBoolean WatchdogLockState(unsigned long ulBase); +extern void WatchdogReloadSet(unsigned long ulBase, unsigned long ulLoadVal); +extern unsigned long WatchdogReloadGet(unsigned long ulBase); +extern unsigned long WatchdogValueGet(unsigned long ulBase); +extern void WatchdogIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void WatchdogIntUnregister(unsigned long ulBase); +extern void WatchdogIntEnable(unsigned long ulBase); +extern unsigned long WatchdogIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void WatchdogIntClear(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __WATCHDOG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/main.c new file mode 100644 index 0000000..8d6fc81 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/main.c @@ -0,0 +1,477 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This demo application creates eight co-routines and four tasks (five + * including the idle task). The co-routines execute as part of the idle task + * hook. The application is limited in size to allow its compilation using + * the KickStart version of the IAR compiler. + * + * Six of the created co-routines are the standard 'co-routine flash' + * co-routines contained within the Demo/Common/Minimal/crflash.c file and + * documented on the FreeRTOS.org WEB site. + * + * The 'LCD Task' waits on a message queue for messages informing it what and + * where to display text. This is the only task that accesses the LCD + * so mutual exclusion is guaranteed. + * + * The 'LCD Message Task' periodically sends strings to the LCD Task using + * the message queue. The strings are rotated to form a short message and + * are written to the top row of the LCD. + * + * The 'ADC Co-routine' periodically reads the ADC input that is connected to + * the light sensor, forms a short message from the value, and then sends this + * message to the LCD Task using the same message queue. The ADC readings are + * displayed on the bottom row of the LCD. + * + * The eighth co-routine and final task control the transmission and reception + * of a string to UART 0. The co-routine periodically sends the first + * character of the string to the UART, with the UART's TxEnd interrupt being + * used to transmit the remaining characters. The UART's RxEnd interrupt + * receives the characters and places them on a queue to be processed by the + * 'COMs Rx' task. An error is latched should an unexpected character be + * received, or any character be received out of sequence. + * + * A loopback connector is required to ensure that each character transmitted + * on the UART is also received on the same UART. For test purposes the UART + * FIFO's are not utalised in order to maximise the interrupt overhead. Also + * a pseudo random interval is used between the start of each transmission in + * order that the resultant interrupts are more randomly distributed and + * therefore more likely to highlight any problems. + * + * The flash co-routines control LED's zero to four. LED five is toggled each + * time the string is transmitted on the UART. LED six is toggled each time + * the string is CORRECTLY received on the UART. LED seven is latched on + * should an error be detected in any task or co-routine. + * + * In addition the idle task makes repetitive calls to + * vSetAndCheckRegisters(). This simply loads the general purpose registers + * with a known value, then checks each register to ensure the held value is + * still correct. As a low priority task this checking routine is likely to + * get repeatedly swapped in and out. A register being found to contain an + * incorrect value is therefore indicative of an error in the task switching + * mechanism. + * + */ + +/* standard include files. */ +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "croutine.h" + +/* Demo application include files. */ +#include "partest.h" +#include "crflash.h" +#include "commstest.h" + +/* Library include files. */ +#include "DriverLib.h" + +/* The time to delay between writing each character to the LCD. */ +#define mainCHAR_WRITE_DELAY ( 2 / portTICK_RATE_MS ) + +/* The time to delay between writing each string to the LCD. */ +#define mainSTRING_WRITE_DELAY ( 400 / portTICK_RATE_MS ) + +#define mainADC_DELAY ( 200 / portTICK_RATE_MS ) + +/* The number of flash co-routines to create. */ +#define mainNUM_FLASH_CO_ROUTINES ( 5 ) + +/* The length of the queue used to send messages to the LCD task. */ +#define mainLCD_QUEUE_LEN ( 3 ) + +/* The priority of the co-routine used to initiate the transmission of the +string on UART 0. */ +#define mainTX_CO_ROUTINE_PRIORITY ( 1 ) +#define mainADC_CO_ROUTINE_PRIORITY ( 2 ) + +/* Only one of each co-routine is created so its index is not important. */ +#define mainTX_CO_ROUTINE_INDEX ( 0 ) +#define mainADC_CO_ROUTINE_INDEX ( 0 ) + +/* The task priorities. */ +#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainMSG_TASK_PRIORITY ( mainLCD_TASK_PRIORITY - 1 ) +#define mainCOMMS_RX_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) + +/* The LCD had two rows. */ +#define mainTOP_ROW 0 +#define mainBOTTOM_ROW 1 + +/* Dimension for the buffer into which the ADC value string is written. */ +#define mainMAX_ADC_STRING_LEN 20 + +/* The LED that is lit should an error be detected in any of the tasks or +co-routines. */ +#define mainFAIL_LED ( 7 ) + +/*-----------------------------------------------------------*/ + +/* + * The task that displays text on the LCD. + */ +static void prvLCDTask( void * pvParameters ); + +/* + * The task that sends messages to be displayed on the top row of the LCD. + */ +static void prvLCDMessageTask( void * pvParameters ); + +/* + * The co-routine that reads the ADC and sends messages for display on the + * bottom row of the LCD. + */ +static void prvADCCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* + * Function to simply set a known value into the general purpose registers + * then read them back to ensure they remain set correctly. An incorrect value + * being indicative of an error in the task switching mechanism. + */ +extern void vSetAndCheckRegisters( void ); + +/* + * Latch the LED that indicates that an error has occurred. + */ +void vSetErrorLED( void ); + +/* + * Thread safe write to the PDC. + */ +static void prvPDCWrite( char cAddress, char cData ); + +/* + * Sets up the hardware used by the demo. + */ +static void prvSetupHardware( void ); + + +/*-----------------------------------------------------------*/ + +/* The structure that is passed on the LCD message queue. */ +typedef struct +{ + char **ppcMessageToDisplay; /*<< Points to a char* pointing to the message to display. */ + portBASE_TYPE xRow; /*<< The row on which the message should be displayed. */ +} xLCDMessage; + +/* Error flag set to pdFAIL if an error is encountered in the tasks/co-routines +defined within this file. */ +unsigned portBASE_TYPE uxErrorStatus = pdPASS; + +/* The queue used to transmit messages to the LCD task. */ +static xQueueHandle xLCDQueue; + +/*-----------------------------------------------------------*/ + +/* + * Setup the hardware, create the tasks/co-routines, then start the scheduler. + */ +void main( void ) +{ + /* Create the queue used by tasks wanting to write to the LCD. */ + xLCDQueue = xQueueCreate( mainLCD_QUEUE_LEN, sizeof( xLCDMessage ) ); + + /* Setup the ports used by the demo and the clock. */ + prvSetupHardware(); + + /* Create the co-routines that flash the LED's. */ + vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES ); + + /* Create the co-routine that initiates the transmission of characters + on the UART and the task that receives them, as described at the top of + this file. */ + xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX ); + xTaskCreate( vCommsRxTask, "CMS", configMINIMAL_STACK_SIZE, NULL, mainCOMMS_RX_TASK_PRIORITY, NULL ); + + /* Create the task that waits for messages to display on the LCD, plus the + task and co-routine that send messages for display (as described at the top + of this file. */ + xTaskCreate( prvLCDTask, "LCD", configMINIMAL_STACK_SIZE, ( void * ) &xLCDQueue, mainLCD_TASK_PRIORITY, NULL ); + xTaskCreate( prvLCDMessageTask, "MSG", configMINIMAL_STACK_SIZE, ( void * ) &xLCDQueue, mainMSG_TASK_PRIORITY, NULL ); + xCoRoutineCreate( prvADCCoRoutine, mainADC_CO_ROUTINE_PRIORITY, mainADC_CO_ROUTINE_INDEX ); + + /* Start the scheduler running the tasks and co-routines just created. */ + vTaskStartScheduler(); + + /* Should not get here unless we did not have enough memory to start the + scheduler. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +static void prvLCDMessageTask( void * pvParameters ) +{ +/* The strings that are written to the LCD. */ +char *pcStringsToDisplay[] = { + "IAR ", + "Stellaris ", + "Demo ", + "www.FreeRTOS.org", + "" + }; + +xQueueHandle *pxLCDQueue; +xLCDMessage xMessageToSend; +portBASE_TYPE xIndex = 0; + + /* To test the parameter passing mechanism, the queue on which messages are + posted is passed in as a parameter even though it is available as a file + scope variable anyway. */ + pxLCDQueue = ( xQueueHandle * ) pvParameters; + + for( ;; ) + { + /* Wait until it is time to move onto the next string. */ + vTaskDelay( mainSTRING_WRITE_DELAY ); + + /* Create the message object to send to the LCD task. */ + xMessageToSend.ppcMessageToDisplay = &pcStringsToDisplay[ xIndex ]; + xMessageToSend.xRow = mainTOP_ROW; + + /* Post the message to be displayed. */ + if( !xQueueSend( *pxLCDQueue, ( void * ) &xMessageToSend, 0 ) ) + { + uxErrorStatus = pdFAIL; + } + + /* Move onto the next message, wrapping when necessary. */ + xIndex++; + if( *( pcStringsToDisplay[ xIndex ] ) == 0x00 ) + { + xIndex = 0; + + /* Delay longer before going back to the start of the messages. */ + vTaskDelay( mainSTRING_WRITE_DELAY * 2 ); + } + } +} +/*-----------------------------------------------------------*/ + +void prvLCDTask( void * pvParameters ) +{ +unsigned portBASE_TYPE uxIndex; +xQueueHandle *pxLCDQueue; +xLCDMessage xReceivedMessage; +char *pcString; +const unsigned char ucCFGData[] = { + 0x30, /* Set data bus to 8-bits. */ + 0x30, + 0x30, + 0x3C, /* Number of lines/font. */ + 0x08, /* Display off. */ + 0x01, /* Display clear. */ + 0x06, /* Entry mode [cursor dir][shift]. */ + 0x0C /* Display on [display on][curson on][blinking on]. */ + }; + + /* To test the parameter passing mechanism, the queue on which messages are + received is passed in as a parameter even though it is available as a file + scope variable anyway. */ + pxLCDQueue = ( xQueueHandle * ) pvParameters; + + /* Configure the LCD. */ + uxIndex = 0; + while( uxIndex < sizeof( ucCFGData ) ) + { + prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] ); + uxIndex++; + vTaskDelay( mainCHAR_WRITE_DELAY ); + } + + /* Turn the LCD Backlight on. */ + prvPDCWrite( PDC_CSR, 0x01 ); + + /* Clear display. */ + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR ); + + uxIndex = 0; + for( ;; ) + { + /* Wait for a message to arrive. */ + if( xQueueReceive( *pxLCDQueue, &xReceivedMessage, portMAX_DELAY ) ) + { + /* Which row does the received message say to write to? */ + PDCLCDSetPos( 0, xReceivedMessage.xRow ); + + /* Where is the string we are going to display? */ + pcString = *xReceivedMessage.ppcMessageToDisplay; + + while( *pcString ) + { + /* Don't write out the string too quickly as LCD's are usually + pretty slow devices. */ + vTaskDelay( mainCHAR_WRITE_DELAY ); + prvPDCWrite( PDC_LCD_RAM, *pcString ); + pcString++; + } + } + } +} +/*-----------------------------------------------------------*/ + +static void prvADCCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +static unsigned long ulADCValue; +static char cMessageBuffer[ mainMAX_ADC_STRING_LEN ]; +static char *pcMessage; +static xLCDMessage xMessageToSend; + + /* Co-routines MUST start with a call to crSTART(). */ + crSTART( xHandle ); + + for( ;; ) + { + /* Start an ADC conversion. */ + ADCProcessorTrigger( ADC_BASE, 0 ); + + /* Simply delay - when we unblock the result should be available */ + crDELAY( xHandle, mainADC_DELAY ); + + /* Get the ADC result. */ + ADCSequenceDataGet( ADC_BASE, 0, &ulADCValue ); + + /* Create a string with the result. */ + sprintf( cMessageBuffer, "ADC = %d ", ulADCValue ); + pcMessage = cMessageBuffer; + + /* Configure the message we are going to send for display. */ + xMessageToSend.ppcMessageToDisplay = ( char** ) &pcMessage; + xMessageToSend.xRow = mainBOTTOM_ROW; + + /* Send the string to the LCD task for display. We are sending + on a task queue so do not have the option to block. */ + if( !xQueueSend( xLCDQueue, ( void * ) &xMessageToSend, 0 ) ) + { + uxErrorStatus = pdFAIL; + } + } + + /* Co-routines MUST end with a call to crEND(). */ + crEND(); +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* Setup the PLL. */ + SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); + + /* Initialise the hardware used to talk to the LCD, LED's and UART. */ + PDCInit(); + vParTestInitialise(); + vSerialInit(); + + /* The ADC is used to read the light sensor. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_ADC ); + ADCSequenceConfigure( ADC_BASE, 3, ADC_TRIGGER_PROCESSOR, 0); + ADCSequenceStepConfigure( ADC_BASE, 0, 0, ADC_CTL_CH0 | ADC_CTL_END ); + ADCSequenceEnable( ADC_BASE, 0 ); + +} +/*-----------------------------------------------------------*/ + +static void prvPDCWrite( char cAddress, char cData ) +{ + vTaskSuspendAll(); + { + PDCWrite( cAddress, cData ); + } + xTaskResumeAll(); +} +/*-----------------------------------------------------------*/ + +void vSetErrorLED( void ) +{ + vParTestSetLED( mainFAIL_LED, pdTRUE ); +} +/*-----------------------------------------------------------*/ + +void vApplicationIdleHook( void ) +{ + /* The co-routines are executed in the idle task using the idle task + hook. */ + for( ;; ) + { + /* Schedule the co-routines. */ + vCoRoutineSchedule(); + + /* Run the register check function between each co-routine. */ + vSetAndCheckRegisters(); + + /* See if the comms task and co-routine has found any errors. */ + if( uxGetCommsStatus() != pdPASS ) + { + vParTestSetLED( mainFAIL_LED, pdTRUE ); + } + } +} +/*-----------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/registertest.s b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/registertest.s new file mode 100644 index 0000000..7f27b5f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/registertest.s @@ -0,0 +1,60 @@ + RSEG ICODE:CODE + + EXTERN vSetErrorLED + + PUBLIC vSetAndCheckRegisters + +vSetAndCheckRegisters: + /* Fill the general purpose registers with known values. */ + mov r11, #10 + add r0, r11, #1 + add r1, r11, #2 + add r2, r11, #3 + add r3, r11, #4 + add r4, r11, #5 + add r5, r11, #6 + add r6, r11, #7 + add r7, r11, #8 + add r8, r11, #9 + add r9, r11, #10 + add r10, r11, #11 + add r12, r11, #12 + + /* Check the values are as expected. */ + cmp r11, #10 + bne set_error_led + cmp r0, #11 + bne set_error_led + cmp r1, #12 + bne set_error_led + cmp r2, #13 + bne set_error_led + cmp r3, #14 + bne set_error_led + cmp r4, #15 + bne set_error_led + cmp r5, #16 + bne set_error_led + cmp r6, #17 + bne set_error_led + cmp r7, #18 + bne set_error_led + cmp r8, #19 + bne set_error_led + cmp r9, #20 + bne set_error_led + cmp r10, #21 + bne set_error_led + cmp r12, #22 + bne set_error_led + bx lr + +set_error_led: + push {r14} + ldr r1, =vSetErrorLED + blx r1 + pop {r14} + bx lr + + END + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.dbgdt b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.dbgdt new file mode 100644 index 0000000..8f02612 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.dbgdt @@ -0,0 +1,65 @@ + + + + + + 300 + + + + + + + 274272727 + + + + + + + + 200 + + + + 010 + + 20 + 1004 + 267 + 66 + 300Debug-LogBreakpoints + 20011210310010020020014010010010030010300Debug-LogBuild1001001 + + + + + + + TabID-30594-29847 + Workspace + Workspace + + + RTOSDemoRTOSDemo/Demo Source + + + + 0TabID-30273-20034Debug LogDebug-Log0 + + + + + + TextEditorC:\E\Dev\FreeRTOS\WorkingCopy2\Demo\CORTEX_LM3S316_IAR\main.c01958048804800100000010000001 + + + + + + + iaridepm.enu1debuggergui.enu1-2-2738348-2-2200202142857205703250000753564-2-22001402-2-214042021002857205703142857205703 + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.dni b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.dni new file mode 100644 index 0000000..b96f7c2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.dni @@ -0,0 +1,48 @@ +[JLinkDriver] +WatchCond=_ 0 +Watch0=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 +Watch1=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0 +[DisAssemblyWindow] +NumStates=_ 1 +State 1=_ 1 +[StackPlugin] +Enabled=1 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnHow=0 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[CodeCoverage] +Enabled=_ 0 +[Log file] +LoggingEnabled=_ 0 +LogFile=_ "" +Category=_ 0 +[TermIOLog] +LoggingEnabled=_ 0 +LogFile=_ "" +[Breakpoints] +Count=0 +[TraceHelper] +Enabled=0 +ShowSource=1 +[Stack] +FillEnabled=0 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnLogOnly=1 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[Disassemble mode] +mode=1 +[Breakpoints2] +Count=0 +[Aliases] +Count=0 +SuppressDialog=0 diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.wsdt b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.wsdt new file mode 100644 index 0000000..25e72a1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/RTOSDemo.wsdt @@ -0,0 +1,58 @@ + + + + + + RTOSDemo/Debug + + + + + + + + + 238272727 + + + + + + + 30020100426766 + + + 48268826 + + + + + + + TabID-2928-28933 + Workspace + Workspace + + + RTOSDemoRTOSDemo/Demo SourceRTOSDemo/Libraries + + + + 0TabID-24894-24921BuildBuildTabID-10790-31422Debug LogDebug-LogTabID-27705-5723Find in FilesFind-in-Files0 + + + + + + TextEditor$WS_DIR$\main.c000000100000010000001 + + + + + + + iaridepm.enu1-2-2738312-2-2240202142857205703186905753564-2-22001682-2-216842021002381205703142857205703 + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/driverlib.wsdt b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/driverlib.wsdt new file mode 100644 index 0000000..6deb801 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S316_IAR/settings/driverlib.wsdt @@ -0,0 +1,51 @@ + + + + + + + + qs_dk-lm3s316/Debug + + + + + + + + + 253272727 + + 20100426766 + + + + + + TabID-9985-21059 + Workspace + Workspace + + + + + + + 0TabID-31963-22489BuildBuildTabID-12860-23630Debug LogDebug-Log0 + + + + + + TextEditorC:\Devtools\IAR Systems\Embedded Workbench 4.0\ARM\examples\Luminary\DK-LM3Sxxx\utils\cspy.c04200TextEditorC:\Devtools\IAR Systems\Embedded Workbench 4.0\ARM\examples\Luminary\DK-LM3Sxxx\examples\qs_dk-lm3s102\startup.c03900TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\examples\qs_dk-lm3s101\qs_dk-lm3s101.c02841017910179TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\utils\pdc.c0615401540TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\src\watchdog.c0014731480TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\src\uart.c0015141514TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\src\timer.c0015241524TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\src\systick.c0015131513TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\src\sysctl.c0015531553TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\src\ssi.c0015301530TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\src\pwm.c0015131513TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\src\interrupt.c0015211521TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\src\i2c.c0015261526TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\src\gpio.c0015111511TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\src\flash.c0015601560TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\src\comp.c0015261526TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\src\adc.c0015091509TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\examples\qs_dk-lm3s316\qs_dk-lm3s316.c05721292312923TextEditorC:\E\Dev\FreeRTOS\Demo\CORTEX_LM3S316_IAR\utils\cspy.c03900180100000010000001 + + + + + + + iaridepm1-2-2728327-2-2200200142857205761235000751029-2-21981402-2-214042001002857205761142857205761 + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/FreeRTOSConfig.h new file mode 100644 index 0000000..2d7022f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/FreeRTOSConfig.h @@ -0,0 +1,115 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 70 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 7000 ) ) +#define configMAX_TASK_NAME_LEN ( 10 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 0 +#define INCLUDE_uxTaskPriorityGet 0 +#define INCLUDE_vTaskDelete 0 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + +#define configKERNEL_INTERRUPT_PRIORITY 255 +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xa0, or priority 5. */ + + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/Makefile b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/Makefile new file mode 100644 index 0000000..e8613bd --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/Makefile @@ -0,0 +1,85 @@ +#****************************************************************************** +# +# Makefile - Rules for building the driver library and examples. +# +# Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +# +# Software License Agreement +# +# Luminary Micro, Inc. (LMI) is supplying this software for use solely and +# exclusively on LMI's Stellaris Family of microcontroller products. +# +# The software is owned by LMI and/or its suppliers, and is protected under +# applicable copyright laws. All rights are reserved. Any use in violation +# of the foregoing restrictions may subject the user to criminal sanctions +# under applicable laws, as well as to civil liability for the breach of the +# terms and conditions of this license. +# +# THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +# OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +# LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +# CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +# +#****************************************************************************** + +include makedefs + +RTOS_SOURCE_DIR=../../Source +DEMO_SOURCE_DIR=../Common/Minimal + +CFLAGS+=-I hw_include -I . -I ${RTOS_SOURCE_DIR}/include -I ${RTOS_SOURCE_DIR}/portable/GCC/ARM_CM3 -I ../Common/include -D GCC_ARMCM3_LM3S102 -D inline= + +VPATH=${RTOS_SOURCE_DIR}:${RTOS_SOURCE_DIR}/portable/MemMang:${RTOS_SOURCE_DIR}/portable/GCC/ARM_CM3:${DEMO_SOURCE_DIR}:init:hw_include + +OBJS=${COMPILER}/main.o \ + ${COMPILER}/list.o \ + ${COMPILER}/queue.o \ + ${COMPILER}/tasks.o \ + ${COMPILER}/port.o \ + ${COMPILER}/heap_1.o \ + ${COMPILER}/BlockQ.o \ + ${COMPILER}/PollQ.o \ + ${COMPILER}/integer.o \ + ${COMPILER}/semtest.o \ + ${COMPILER}/osram96x16.o + +INIT_OBJS= ${COMPILER}/startup.o + +LIBS= hw_include/libdriver.a + + +# +# The default rule, which causes init to be built. +# +all: ${COMPILER} \ + ${COMPILER}/RTOSDemo.axf \ + +# +# The rule to clean out all the build products +# + +clean: + @rm -rf ${COMPILER} ${wildcard *.bin} RTOSDemo.axf + +# +# The rule to create the target directory +# +${COMPILER}: + @mkdir ${COMPILER} + +${COMPILER}/RTOSDemo.axf: ${INIT_OBJS} ${OBJS} ${LIBS} +SCATTER_RTOSDemo=standalone.ld +ENTRY_RTOSDemo=ResetISR + +# +# +# Include the automatically generated dependency files. +# +-include ${wildcard ${COMPILER}/*.d} __dummy__ + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/DriverLib.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/DriverLib.h new file mode 100644 index 0000000..47531fb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/DriverLib.h @@ -0,0 +1,39 @@ +#ifndef DRIVER_LIB_H +#define DRIVER_LIB_H + +#include "DriverLib.h" +#include "hw_adc.h" +#include "hw_comp.h" +#include "hw_flash.h" +#include "hw_gpio.h" +#include "hw_i2c.h" +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_nvic.h" +#include "hw_pwm.h" +#include "hw_qei.h" +#include "hw_ssi.h" +#include "hw_sysctl.h" +#include "hw_timer.h" +#include "hw_types.h" +#include "hw_uart.h" +#include "hw_watchdog.h" +#include "osram96x16.h" +#include "adc.h" +#include "comp.h" +#include "cpu.h" +#include "debug.h" +#include "flash.h" +#include "gpio.h" +#include "i2c.h" +#include "interrupt.h" +#include "pwm.h" +#include "qei.h" +#include "ssi.h" +#include "sysctl.h" +#include "systick.h" +#include "timer.h" +#include "uart.h" +#include "watchdog.h" + +#endif diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/EULA.txt b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/EULA.txt new file mode 100644 index 0000000..02c57b2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/EULA.txt @@ -0,0 +1,126 @@ +IMPORTANT. Read the following LMI Software License Agreement ("Agreement") +completely. + +LUMINARY MICRO SOFTWARE LICENSE AGREEMENT + + This is a legal agreement between you (either as an individual or as an +authorized representative of your employer) and Luminary Micro, Inc. ("LMI"). +It concerns your rights to use this file and any accompanying written materials +(the "Software"). In consideration for LMI allowing you to access the +Software, you are agreeing to be bound by the terms of this Agreement. If you +do not agree to all of the terms of this Agreement, do not download or use the +Software. If you change your mind later, stop using the Software and delete +all copies of the Software in your possession or control. Any copies of the +Software that you have already distributed, where permitted, and do not destroy +will continue to be governed by this Agreement. Your prior use will also +continue to be governed by this Agreement. + +1. LICENSE GRANT. LMI grants to you, free of charge, the non-exclusive, +non-transferable right (1) to use the Software, (2) to reproduce the Software, +(3) to prepare derivative works of the Software, (4) to distribute the Software +and derivative works thereof in source (human-readable) form and object +(machine-readable) form, and (5) to sublicense to others the right to use the +distributed Software. If you violate any of the terms or restrictions of this +Agreement, LMI may immediately terminate this Agreement, and require that you +stop using and delete all copies of the Software in your possession or control. + +2. COPYRIGHT. The Software is licensed to you, not sold. LMI owns the +Software, and United States copyright laws and international treaty provisions +protect the Software. Therefore, you must treat the Software like any other +copyrighted material (e.g. a book or musical recording). You may not use or +copy the Software for any other purpose than what is described in this +Agreement. Except as expressly provided herein, LMI does not grant to you any +express or implied rights under any LMI or third-party patents, copyrights, +trademarks, or trade secrets. Additionally, you must reproduce and apply any +copyright or other proprietary rights notices included on or embedded in the +Software to any copies or derivative works made thereof, in whole or in part, +if any. + +3. SUPPORT. LMI is NOT obligated to provide any support, upgrades or new +releases of the Software. If you wish, you may contact LMI and report problems +and provide suggestions regarding the Software. LMI has no obligation +whatsoever to respond in any way to such a problem report or suggestion. LMI +may make changes to the Software at any time, without any obligation to notify +or provide updated versions of the Software to you. + +4. INDEMNITY. You agree to fully defend and indemnify LMI from any and +all claims, liabilities, and costs (including reasonable attorney's fees) +related to (1) your use (including your sub-licensee's use, if permitted) of +the Software or (2) your violation of the terms and conditions of this +Agreement. + +5. HIGH RISK ACTIVITIES. You acknowledge that the Software is not fault +tolerant and is not designed, manufactured or intended by LMI for incorporation +into products intended for use or resale in on-line control equipment in +hazardous, dangerous to life or potentially life-threatening environments +requiring fail-safe performance, such as in the operation of nuclear +facilities, aircraft navigation or communication systems, air traffic control, +direct life support machines or weapons systems, in which the failure of +products could lead directly to death, personal injury or severe physical or +environmental damage ("High Risk Activities"). You specifically represent and +warrant that you will not use the Software or any derivative work of the +Software for High Risk Activities. + +6. PRODUCT LABELING. You are not authorized to use any LMI trademarks, +brand names, or logos. + +7. COMPLIANCE WITH LAWS; EXPORT RESTRICTIONS. You must use the Software +in accordance with all applicable U.S. laws, regulations and statutes. You +agree that neither you nor your licensees (if any) intend to or will, directly +or indirectly, export or transmit the Software to any country in violation of +U.S. export restrictions. + +8. GOVERNMENT USE. Use of the Software and any corresponding +documentation, if any, is provided with RESTRICTED RIGHTS. Use, duplication or +disclosure by the Government is subject to restrictions as set forth in +subparagraph (c)(1)(ii) of The Rights in Technical Data and Computer Software +clause at DFARS 252.227-7013 or subparagraphs (c)(l) and (2) of the Commercial +Computer Software--Restricted Rights at 48 CFR 52.227-19, as applicable. +Manufacturer is Luminary Micro, Inc., 2499 S. Capital of Texas Hwy Ste A-100, +Austin, Texas 78746. + +9. DISCLAIMER OF WARRANTY. TO THE MAXIMUM EXTENT PERMITTED BY LAW, LMI +EXPRESSLY DISCLAIMS ANY WARRANTY FOR THE SOFTWARE. THE SOFTWARE IS PROVIDED +"AS IS", WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, +WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, OR NON-INFRINGEMENT. YOU ASSUME THE ENTIRE RISK ARISING +OUT OF THE USE OR PERFORMANCE OF THE SOFTWARE, OR ANY SYSTEMS YOU DESIGN USING +THE SOFTWARE (IF ANY). NOTHING IN THIS AGREEMENT MAY BE CONSTRUED AS A +WARRANTY OR REPRESENTATION BY LMI THAT THE SOFTWARE OR ANY DERIVATIVE WORK +DEVELOPED WITH OR INCORPORATING THE SOFTWARE WILL BE FREE FROM INFRINGEMENT OF +THE INTELLECTUAL PROPERTY RIGHTS OF THIRD PARTIES. + +10. LIMITATION OF LIABILITY. IN NO EVENT WILL LMI BE LIABLE, WHETHER IN +CONTRACT, TORT, OR OTHERWISE, FOR ANY INCIDENTAL, SPECIAL, INDIRECT, +CONSEQUENTIAL OR PUNITIVE DAMAGES, INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR +ANY LOSS OF USE, LOSS OF TIME, INCONVENIENCE, COMMERCIAL LOSS, OR LOST PROFITS, +SAVINGS, OR REVENUES TO THE FULL EXTENT SUCH MAY BE DISCLAIMED BY LAW. + +11. CHOICE OF LAW; VENUE; LIMITATIONS. You agree that the statutes and +laws of the United States and the State of Texas, USA, without regard to +conflicts of laws principles, will apply to all matters relating to this +Agreement or the Software, and you agree that any litigation will be subject to +the exclusive jurisdiction of the state or federal courts in Austin, Travis +County, Texas, USA. You agree that regardless of any statute or law to the +contrary, any claim or cause of action arising out of or related to this +Agreement or the Software must be filed within one (1) year after such claim or +cause of action arose or be forever barred. + +12. ENTIRE AGREEMENT. This Agreement constitutes the entire agreement +between you and LMI regarding the subject matter of this Agreement, and +supersedes all prior communications, negotiations, understandings, agreements +or representations, either written or oral, if any. This Agreement may only be +amended in written form, executed by you and LMI. + +13. SEVERABILITY. If any provision of this Agreement is held for any +reason to be invalid or unenforceable, then the remaining provisions of this +Agreement will be unimpaired and, unless a modification or replacement of the +invalid or unenforceable provision is further held to deprive you or LMI of a +material benefit, in which case the Agreement will immediately terminate, the +invalid or unenforceable provision will be replaced with a provision that is +valid and enforceable and that comes closest to the intention underlying the +invalid or unenforceable provision. + +14. NO WAIVER. The waiver by LMI of any breach of any provision of this +Agreement will not operate or be construed as a waiver of any other or a +subsequent breach of the same or a different provision. diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/adc.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/adc.c new file mode 100644 index 0000000..53f3adf --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/adc.c @@ -0,0 +1,946 @@ +//***************************************************************************** +// +// adc.c - Driver for the ADC. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup adc_api +//! @{ +// +//***************************************************************************** + +#include "../hw_adc.h" +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_types.h" +#include "adc.h" +#include "debug.h" +#include "interrupt.h" + +//***************************************************************************** +// +// The currently configured software oversampling factor for each of the ADC +// sequencers. +// +//***************************************************************************** +#if defined(GROUP_pucoverssamplefactor) || defined(BUILD_ALL) +unsigned char g_pucOversampleFactor[3]; +#else +extern unsigned char g_pucOversampleFactor[3]; +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for an ADC interrupt. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param pfnHandler is a pointer to the function to be called when the +//! ADC sample sequence interrupt occurs. +//! +//! This function sets the handler to be called when a sample sequence +//! interrupt occurs. This will enable the global interrupt in the interrupt +//! controller; the sequence interrupt must be enabled with ADCIntEnable(). It +//! is the interrupt handler's responsibility to clear the interrupt source via +//! ADCIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCIntRegister(unsigned long ulBase, unsigned long ulSequenceNum, + void (*pfnHandler)(void)) +{ + unsigned long ulInt; + + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Determine the interrupt to register based on the sequence number. + // + ulInt = INT_ADC0 + ulSequenceNum; + + // + // Register the interrupt handler. + // + IntRegister(ulInt, pfnHandler); + + // + // Enable the timer interrupt. + // + IntEnable(ulInt); +} +#endif + +//***************************************************************************** +// +//! Unregisters the interrupt handler for an ADC interrupt. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! This function unregisters the interrupt handler. This will disable the +//! global interrupt in the interrupt controller; the sequence interrupt must +//! be disabled via ADCIntDisable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCIntUnregister(unsigned long ulBase, unsigned long ulSequenceNum) +{ + unsigned long ulInt; + + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Determine the interrupt to unregister based on the sequence number. + // + ulInt = INT_ADC0 + ulSequenceNum; + + // + // Disable the interrupt. + // + IntDisable(ulInt); + + // + // Unregister the interrupt handler. + // + IntUnregister(ulInt); +} +#endif + +//***************************************************************************** +// +//! Disables a sample sequence interrupt. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! This function disables the requested sample sequence interrupt. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCIntDisable(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Disable this sample sequence interrupt. + // + HWREG(ulBase + ADC_O_IM) &= ~(1 << ulSequenceNum); +} +#endif + +//***************************************************************************** +// +//! Enables a sample sequence interrupt. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! This function enables the requested sample sequence interrupt. Any +//! outstanding interrupts are cleared before enabling the sample sequence +//! interrupt. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCIntEnable(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Clear any outstanding interrupts on this sample sequence. + // + HWREG(ulBase + ADC_O_ISC) = 1 << ulSequenceNum; + + // + // Enable this sample sequence interrupt. + // + HWREG(ulBase + ADC_O_IM) |= 1 << ulSequenceNum; +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param bMasked is false if the raw interrupt status is required and true if +//! the masked interrupt status is required. +//! +//! This returns the interrupt status for the specified sample sequence. +//! Either the raw interrupt status or the status of interrupts that are +//! allowed to reflect to the processor can be returned. +//! +//! \return The current raw or masked interrupt status. +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +ADCIntStatus(unsigned long ulBase, unsigned long ulSequenceNum, + tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(ulBase + ADC_O_ISC) & (1 << ulSequenceNum)); + } + else + { + return(HWREG(ulBase + ADC_O_RIS) & (1 << ulSequenceNum)); + } +} +#endif + +//***************************************************************************** +// +//! Clears sample sequence interrupt source. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! The specified sample sequence interrupt is cleared, so that it no longer +//! asserts. This must be done in the interrupt handler to keep it from being +//! called again immediately upon exit. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCIntClear(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arugments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Clear the interrupt. + // + HWREG(ulBase + ADC_O_ISC) = 1 << ulSequenceNum; +} +#endif + +//***************************************************************************** +// +//! Enables a sample sequence. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! Allows the specified sample sequence to be captured when its trigger is +//! detected. A sample sequence must be configured before it is enabled. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_sequenceenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCSequenceEnable(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arugments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Enable the specified sequence. + // + HWREG(ulBase + ADC_O_ACTSS) |= 1 << ulSequenceNum; +} +#endif + +//***************************************************************************** +// +//! Disables a sample sequence. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! Prevents the specified sample sequence from being captured when its trigger +//! is detected. A sample sequence should be disabled before it is configured. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_sequencedisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCSequenceDisable(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arugments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Disable the specified sequences. + // + HWREG(ulBase + ADC_O_ACTSS) &= ~(1 << ulSequenceNum); +} +#endif + +//***************************************************************************** +// +//! Configures the trigger source and priority of a sample sequence. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param ulTrigger is the trigger source that initiates the sample sequence; +//! must be one of the \b ADC_TRIGGER_* values. +//! \param ulPriority is the relative priority of the sample sequence with +//! respect to the other sample sequences. +//! +//! This function configures the initiation criteria for a sample sequence. +//! Valid sample sequences range from zero to three; sequence zero will capture +//! up to eight samples, sequences one and two will capture up to four samples, +//! and sequence three will capture a single sample. The trigger condition and +//! priority (with respect to other sample sequence execution) is set. +//! +//! The parameter \b ulTrigger can take on the following values: +//! +//! - \b ADC_TRIGGER_PROCESSOR - A trigger generated by the processor, via the +//! ADCProcessorTrigger() function. +//! - \b ADC_TRIGGER_COMP0 - A trigger generated by the first analog +//! comparator; configured with ComparatorConfigure(). +//! - \b ADC_TRIGGER_COMP1 - A trigger generated by the second analog +//! comparator; configured with ComparatorConfigure(). +//! - \b ADC_TRIGGER_COMP2 - A trigger generated by the third analog +//! comparator; configured with ComparatorConfigure(). +//! - \b ADC_TRIGGER_EXTERNAL - A trigger generated by an input from the Port +//! B4 pin. +//! - \b ADC_TRIGGER_TIMER - A trigger generated by a timer; configured with +//! TimerControlTrigger(). +//! - \b ADC_TRIGGER_PWM0 - A trigger generated by the first PWM generator; +//! configured with PWMGenIntTrigEnable(). +//! - \b ADC_TRIGGER_PWM1 - A trigger generated by the second PWM generator; +//! configured with PWMGenIntTrigEnable(). +//! - \b ADC_TRIGGER_PWM2 - A trigger generated by the third PWM generator; +//! configured with PWMGenIntTrigEnable(). +//! - \b ADC_TRIGGER_ALWAYS - A trigger that is always asserted, causing the +//! sample sequence to capture repeatedly (so long as +//! there is not a higher priority source active). +//! +//! Note that not all trigger sources are available on all Stellaris family +//! members; consult the data sheet for the device in question to determine the +//! availability of triggers. +//! +//! The parameter \b ulPriority is a value between 0 and 3, where 0 represents +//! the highest priority and 3 the lowest. Note that when programming the +//! priority among a set of sample sequences, each must have unique priority; +//! it is up to the caller to guarantee the uniqueness of the priorities. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_sequenceconfigure) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCSequenceConfigure(unsigned long ulBase, unsigned long ulSequenceNum, + unsigned long ulTrigger, unsigned long ulPriority) +{ + // + // Check the arugments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + ASSERT((ulTrigger == ADC_TRIGGER_PROCESSOR) || + (ulTrigger == ADC_TRIGGER_COMP0) || + (ulTrigger == ADC_TRIGGER_COMP1) || + (ulTrigger == ADC_TRIGGER_COMP2) || + (ulTrigger == ADC_TRIGGER_EXTERNAL) || + (ulTrigger == ADC_TRIGGER_TIMER) || + (ulTrigger == ADC_TRIGGER_PWM0) || + (ulTrigger == ADC_TRIGGER_PWM1) || + (ulTrigger == ADC_TRIGGER_PWM2) || + (ulTrigger == ADC_TRIGGER_ALWAYS)); + ASSERT(ulPriority < 4); + + // + // Compute the shift for the bits that control this sample sequence. + // + ulSequenceNum *= 4; + + // + // Set the trigger event for this sample sequence. + // + HWREG(ulBase + ADC_O_EMUX) = ((HWREG(ulBase + ADC_O_EMUX) & + ~(0xf << ulSequenceNum)) | + ((ulTrigger & 0xf) << ulSequenceNum)); + + // + // Set the priority for this sample sequence. + // + HWREG(ulBase + ADC_O_SSPRI) = ((HWREG(ulBase + ADC_O_SSPRI) & + ~(0xf << ulSequenceNum)) | + ((ulPriority & 0x3) << ulSequenceNum)); +} +#endif + +//***************************************************************************** +// +//! Configure a step of the sample sequencer. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param ulStep is the step to be configured. +//! \param ulConfig is the configuration of this step; must be a logical OR of +//! \b ADC_CTL_TS, \b ADC_CTL_IE, \b ADC_CTL_END, \b ADC_CTL_D, and one of the +//! input channel selects (\b ADC_CTL_CH0 through \b ADC_CTL_CH7). +//! +//! This function will set the configuration of the ADC for one step of a +//! sample sequence. The ADC can be configured for single-ended or +//! differential operation (the \b ADC_CTL_D bit selects differential +//! operation when set), the channel to be sampled can be chosen (the +//! \b ADC_CTL_CH0 through \b ADC_CTL_CH7 values), and the internal temperature +//! sensor can be selected (the \b ADC_CTL_TS bit). Additionally, this step +//! can be defined as the last in the sequence (the \b ADC_CTL_END bit) and it +//! can be configured to cause an interrupt when the step is complete (the +//! \b ADC_CTL_IE bit). The configuration is used by the ADC at the +//! appropriate time when the trigger for this sequence occurs. +//! +//! The \b ulStep parameter determines the order in which the samples are +//! captured by the ADC when the trigger occurs. It can range from zero to +//! seven for the first sample sequence, from zero to three for the second and +//! third sample sequence, and can only be zero for the fourth sample sequence. +//! +//! Differential mode only works with adjacent channel pairs (e.g. 0 and 1). +//! The channel select must be the number of the channel pair to sample (e.g. +//! \b ADC_CTL_CH0 for 0 and 1, or \b ADC_CTL_CH1 for 2 and 3) or undefined +//! results will be returned by the ADC. Additionally, if differential mode is +//! selected when the temperature sensor is being sampled, undefined results +//! will be returned by the ADC. +//! +//! It is the responsibility of the caller to ensure that a valid configuration +//! is specified; this function does not check the validity of the specified +//! configuration. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_sequencestepconfigure) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +ADCSequenceStepConfigure(unsigned long ulBase, unsigned long ulSequenceNum, + unsigned long ulStep, unsigned long ulConfig) +{ + // + // Check the arugments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + ASSERT(((ulSequenceNum == 0) && (ulStep < 8)) || + ((ulSequenceNum == 1) && (ulStep < 4)) || + ((ulSequenceNum == 2) && (ulStep < 4)) || + ((ulSequenceNum == 3) && (ulStep < 1))); + + // + // Get the offset of the sequence to be configured. + // + ulBase += ADC_O_SEQ + (ADC_O_SEQ_STEP * ulSequenceNum); + + // + // Compute the shift for the bits that control this step. + // + ulStep *= 4; + + // + // Set the analog mux value for this step. + // + HWREG(ulBase + ADC_O_X_SSMUX) = ((HWREG(ulBase + ADC_O_X_SSMUX) & + ~(0x0000000f << ulStep)) | + ((ulConfig & 0x0f) << ulStep)); + + // + // Set the control value for this step. + // + HWREG(ulBase + ADC_O_X_SSCTL) = ((HWREG(ulBase + ADC_O_X_SSCTL) & + ~(0x0000000f << ulStep)) | + (((ulConfig & 0xf0) >> 4) << ulStep)); +} +#endif + +//***************************************************************************** +// +//! Determines if a sample sequence overflow occurred. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! This determines if a sample sequence overflow has occurred. This will +//! happen if the captured samples are not read from the FIFO before the next +//! trigger occurs. +//! +//! \return Returns zero if there was not an overflow, and non-zero if there +//! was. +// +//***************************************************************************** +#if defined(GROUP_sequenceoverflow) || defined(BUILD_ALL) || defined(DOXYGEN) +long +ADCSequenceOverflow(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Determine if there was an overflow on this sequence. + // + return(HWREG(ulBase + ADC_O_OSTAT) & (1 << ulSequenceNum)); +} +#endif + +//***************************************************************************** +// +//! Determines if a sample sequence underflow occurred. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! This determines if a sample sequence underflow has occurred. This will +//! happen if too many samples are read from the FIFO. +//! +//! \return Returns zero if there was not an underflow, and non-zero if there +//! was. +// +//***************************************************************************** +#if defined(GROUP_sequenceunderflow) || defined(BUILD_ALL) || defined(DOXYGEN) +long +ADCSequenceUnderflow(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Determine if there was an underflow on this sequence. + // + return(HWREG(ulBase + ADC_O_USTAT) & (1 << ulSequenceNum)); +} +#endif + +//***************************************************************************** +// +//! Gets the captured data for a sample sequence. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param pulBuffer is the address where the data is stored. +//! +//! This function copies data from the specified sample sequence output FIFO to +//! a memory resident buffer. The number of samples available in the hardware +//! FIFO are copied into the buffer, which is assumed to be large enough to +//! hold that many samples. This will only return the samples that are +//! presently available, which may not be the entire sample sequence if it is +//! in the process of being executed. +//! +//! \return Returns the number of samples copied to the buffer. +// +//***************************************************************************** +#if defined(GROUP_sequencedataget) || defined(BUILD_ALL) || defined(DOXYGEN) +long +ADCSequenceDataGet(unsigned long ulBase, unsigned long ulSequenceNum, + unsigned long *pulBuffer) +{ + unsigned long ulCount; + + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Get the offset of the sequence to be read. + // + ulBase += ADC_O_SEQ + (ADC_O_SEQ_STEP * ulSequenceNum); + + // + // Read samples from the FIFO until it is empty. + // + ulCount = 0; + while(!(HWREG(ulBase + ADC_O_X_SSFSTAT) & ADC_SSFSTAT_EMPTY) && + (ulCount < 8)) + { + // + // Read the FIFO and copy it to the destination. + // + *pulBuffer++ = HWREG(ulBase + ADC_O_X_SSFIFO); + + // + // Increment the count of samples read. + // + ulCount++; + } + + // + // Return the number of samples read. + // + return(ulCount); +} +#endif + +//***************************************************************************** +// +//! Causes a processor trigger for a sample sequence. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! This function triggers a processor-initiated sample sequence if the sample +//! sequence trigger is configured to ADC_TRIGGER_PROCESSOR. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_processortrigger) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCProcessorTrigger(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Generate a processor trigger for this sample sequence. + // + HWREG(ulBase + ADC_O_PSSI) = 1 << ulSequenceNum; +} +#endif + +//***************************************************************************** +// +//! Configures the software oversampling factor of the ADC. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param ulFactor is the number of samples to be averaged. +//! +//! This function configures the software oversampling for the ADC, which can +//! be used to provide better resolution on the sampled data. Oversampling is +//! accomplished by averaging multiple samples from the same analog input. +//! Three different oversampling rates are supported; 2x, 4x, and 8x. +//! +//! Oversampling is only supported on the sample sequencers that are more than +//! one sample in depth (i.e. the fourth sample sequencer is not supported). +//! Oversampling by 2x (for example) divides the depth of the sample sequencer +//! by two; so 2x oversampling on the first sample sequencer can only provide +//! four samples per trigger. This also means that 8x oversampling is only +//! available on the first sample sequencer. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_softwareoversampleconfigure) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +ADCSoftwareOversampleConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulFactor) +{ + unsigned long ulValue; + + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 3); + ASSERT(((ulFactor == 2) || (ulFactor == 4) || (ulFactor == 8)) && + ((ulSequenceNum == 0) || (ulFactor != 8))); + + // + // Convert the oversampling factor to a shift factor. + // + for(ulValue = 0, ulFactor >>= 1; ulFactor; ulValue++, ulFactor >>= 1) + { + } + + // + // Save the sfiht factor. + // + g_pucOversampleFactor[ulSequenceNum] = ulValue; +} +#endif + +//***************************************************************************** +// +//! Configures a step of the software oversampled sequencer. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param ulStep is the step to be configured. +//! \param ulConfig is the configuration of this step. +//! +//! This function configures a step of the sample sequencer when using the +//! software oversampling feature. The number of steps available depends on +//! the oversampling factor set by ADCSoftwareOversampleConfigure(). The value +//! of \e ulConfig is the same as defined for ADCSequenceStepConfigure(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_softwareoversamplestepconfigure) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +ADCSoftwareOversampleStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 3); + ASSERT(((ulSequenceNum == 0) && + (ulStep < (8 >> g_pucOversampleFactor[ulSequenceNum]))) || + (ulStep < (4 >> g_pucOversampleFactor[ulSequenceNum]))); + + // + // Get the offset of the sequence to be configured. + // + ulBase += ADC_O_SEQ + (ADC_O_SEQ_STEP * ulSequenceNum); + + // + // Compute the shift for the bits that control this step. + // + ulStep *= 4 << g_pucOversampleFactor[ulSequenceNum]; + + // + // Loop through the hardware steps that make up this step of the software + // oversampled sequence. + // + for(ulSequenceNum = 1 << g_pucOversampleFactor[ulSequenceNum]; + ulSequenceNum; ulSequenceNum--) + { + // + // Set the analog mux value for this step. + // + HWREG(ulBase + ADC_O_X_SSMUX) = ((HWREG(ulBase + ADC_O_X_SSMUX) & + ~(0x0000000f << ulStep)) | + ((ulConfig & 0x0f) << ulStep)); + + // + // Set the control value for this step. + // + HWREG(ulBase + ADC_O_X_SSCTL) = ((HWREG(ulBase + ADC_O_X_SSCTL) & + ~(0x0000000f << ulStep)) | + (((ulConfig & 0xf0) >> 4) << ulStep)); + if(ulSequenceNum != 1) + { + HWREG(ulBase + ADC_O_X_SSCTL) &= ~((ADC_SSCTL_IE0 | + ADC_SSCTL_END0) << ulStep); + } + + // + // Go to the next hardware step. + // + ulStep += 4; + } +} +#endif + +//***************************************************************************** +// +//! Gets the captured data for a sample sequence using software oversampling. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param pulBuffer is the address where the data is stored. +//! \param ulCount is the number of samples to be read. +//! +//! This function copies data from the specified sample sequence output FIFO to +//! a memory resident buffer with software oversampling applied. The requested +//! number of samples are copied into the data buffer; if there are not enough +//! samples in the hardware FIFO to satisfy this many oversampled data items +//! then incorrect results will be returned. It is the caller's responsibility +//! to read only the samples that are available and wait until enough data is +//! available, for example as a result of receiving an interrupt. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_softwareoversampledataget) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +ADCSoftwareOversampleDataGet(unsigned long ulBase, unsigned long ulSequenceNum, + unsigned long *pulBuffer, unsigned long ulCount) +{ + unsigned long ulIdx, ulAccum; + + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 3); + ASSERT(((ulSequenceNum == 0) && + (ulCount < (8 >> g_pucOversampleFactor[ulSequenceNum]))) || + (ulCount < (4 >> g_pucOversampleFactor[ulSequenceNum]))); + + // + // Get the offset of the sequence to be read. + // + ulBase += ADC_O_SEQ + (ADC_O_SEQ_STEP * ulSequenceNum); + + // + // Read the samples from the FIFO until it is empty. + // + while(ulCount--) + { + // + // Compute the sum of the samples. + // + ulAccum = 0; + for(ulIdx = 1 << g_pucOversampleFactor[ulSequenceNum]; ulIdx; ulIdx--) + { + // + // Read the FIFO and add it to the accumulator. + // + ulAccum += HWREG(ulBase + ADC_O_X_SSFIFO); + } + + // + // Write the averaged sample to the output buffer. + // + *pulBuffer++ = ulAccum >> g_pucOversampleFactor[ulSequenceNum]; + } +} +#endif + +//***************************************************************************** +// +//! Configures the hardware oversampling factor of the ADC. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulFactor is the number of samples to be averaged. +//! +//! This function configures the hardware oversampling for the ADC, which can +//! be used to provide better resolution on the sampled data. Oversampling is +//! accomplished by averaging multiple samples from the same analog input. Six +//! different oversampling rates are supported; 2x, 4x, 8x, 16x, 32x, and 64x. +//! Specifying an oversampling factor of zero will disable the hardware +//! oversampler. +//! +//! Hardware oversampling applies uniformly to all sample sequencers. It does +//! not reduce the depth of the sample sequencers like the software +//! oversampling APIs; each sample written into the sample sequence FIFO is a +//! fully oversampled analog input reading. +//! +//! Enabling hardware averaging increases the precision of the ADC at the cost +//! of throughput. For example, enabling 4x oversampling reduces the +//! throughput of a 250 KSps ADC to 62.5 KSps. +//! +//! \note Hardware oversampling is available beginning with Rev C0 of the +//! Stellaris microcontroller. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_hardwareoversampleconfigure) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +ADCHardwareOversampleConfigure(unsigned long ulBase, + unsigned long ulFactor) +{ + unsigned long ulValue; + + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(((ulFactor == 0) || (ulFactor == 2) || (ulFactor == 4) || + (ulFactor == 8) || (ulFactor == 16) || (ulFactor == 32) || + (ulFactor == 64))); + + // + // Convert the oversampling factor to a shift factor. + // + for(ulValue = 0, ulFactor >>= 1; ulFactor; ulValue++, ulFactor >>= 1) + { + } + + // + // Write the shift factor to the ADC to configure the hardware oversampler. + // + HWREG(ulBase + ADC_O_SAC) = ulValue; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/adc.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/adc.h new file mode 100644 index 0000000..c1fa37d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/adc.h @@ -0,0 +1,126 @@ +//***************************************************************************** +// +// adc.h - ADC headers for using the ADC driver functions. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __ADC_H__ +#define __ADC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceConfigure as the ulTrigger +// parameter. +// +//***************************************************************************** +#define ADC_TRIGGER_PROCESSOR 0x00000000 // Processor event +#define ADC_TRIGGER_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_TRIGGER_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_TRIGGER_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_TRIGGER_EXTERNAL 0x00000004 // External event +#define ADC_TRIGGER_TIMER 0x00000005 // Timer event +#define ADC_TRIGGER_PWM0 0x00000006 // PWM0 event +#define ADC_TRIGGER_PWM1 0x00000007 // PWM1 event +#define ADC_TRIGGER_PWM2 0x00000008 // PWM2 event +#define ADC_TRIGGER_ALWAYS 0x0000000F // Always event + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceStepConfigure as the ulConfig +// parameter. +// +//***************************************************************************** +#define ADC_CTL_TS 0x00000080 // Temperature sensor select +#define ADC_CTL_IE 0x00000040 // Interrupt enable +#define ADC_CTL_END 0x00000020 // Sequence end select +#define ADC_CTL_D 0x00000010 // Differential select +#define ADC_CTL_CH0 0x00000000 // Input channel 0 +#define ADC_CTL_CH1 0x00000001 // Input channel 1 +#define ADC_CTL_CH2 0x00000002 // Input channel 2 +#define ADC_CTL_CH3 0x00000003 // Input channel 3 +#define ADC_CTL_CH4 0x00000004 // Input channel 4 +#define ADC_CTL_CH5 0x00000005 // Input channel 5 +#define ADC_CTL_CH6 0x00000006 // Input channel 6 +#define ADC_CTL_CH7 0x00000007 // Input channel 7 + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ADCIntRegister(unsigned long ulBase, unsigned long ulSequenceNum, + void (*pfnHandler)(void)); +extern void ADCIntUnregister(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCIntDisable(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCIntEnable(unsigned long ulBase, unsigned long ulSequenceNum); +extern unsigned long ADCIntStatus(unsigned long ulBase, + unsigned long ulSequenceNum, + tBoolean bMasked); +extern void ADCIntClear(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCSequenceEnable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceDisable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulTrigger, + unsigned long ulPriority); +extern void ADCSequenceStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern long ADCSequenceOverflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceUnderflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer); +extern void ADCProcessorTrigger(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSoftwareOversampleConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulFactor); +extern void ADCSoftwareOversampleStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern void ADCSoftwareOversampleDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer, + unsigned long ulCount); +extern void ADCHardwareOversampleConfigure(unsigned long ulBase, + unsigned long ulFactor); + +#ifdef __cplusplus +} +#endif + +#endif // __ADC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/comp.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/comp.c new file mode 100644 index 0000000..aed156e --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/comp.c @@ -0,0 +1,448 @@ +//***************************************************************************** +// +// comp.c - Driver for the analog comparator. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup comp_api +//! @{ +// +//***************************************************************************** + +#include "../hw_comp.h" +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_types.h" +#include "comp.h" +#include "debug.h" +#include "interrupt.h" + +//***************************************************************************** +// +//! Configures a comparator. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator to configure. +//! \param ulConfig is the configuration of the comparator. +//! +//! This function will configure a comparator. The \e ulConfig parameter is +//! the result of a logical OR operation between the \b COMP_TRIG_xxx, +//! \b COMP_INT_xxx, \b COMP_ASRCP_xxx, and \b COMP_OUTPUT_xxx values. +//! +//! The \b COMP_TRIG_xxx term can take on the following values: +//! +//! - \b COMP_TRIG_NONE to have no trigger to the ADC. +//! - \b COMP_TRIG_HIGH to trigger the ADC when the comparator output is high. +//! - \b COMP_TRIG_LOW to trigger the ADC when the comparator output is low. +//! - \b COMP_TRIG_FALL to trigger the ADC when the comparator output goes low. +//! - \b COMP_TRIG_RISE to trigger the ADC when the comparator output goes +//! high. +//! - \b COMP_TRIG_BOTH to trigger the ADC when the comparator output goes low +//! or high. +//! +//! The \b COMP_INT_xxx term can take on the following values: +//! +//! - \b COMP_INT_HIGH to generate an interrupt when the comparator output is +//! high. +//! - \b COMP_INT_LOW to generate an interrupt when the comparator output is +//! low. +//! - \b COMP_INT_FALL to generate an interrupt when the comparator output goes +//! low. +//! - \b COMP_INT_RISE to generate an interrupt when the comparator output goes +//! high. +//! - \b COMP_INT_BOTH to generate an interrupt when the comparator output goes +//! low or high. +//! +//! The \b COMP_ASRCP_xxx term can take on the following values: +//! +//! - \b COMP_ASRCP_PIN to use the dedicated Comp+ pin as the reference +//! voltage. +//! - \b COMP_ASRCP_PIN0 to use the Comp0+ pin as the reference voltage (this +//! the same as \b COMP_ASRCP_PIN for the comparator 0). +//! - \b COMP_ASRCP_REF to use the internally generated voltage as the +//! reference voltage. +//! +//! The \b COMP_OUTPUT_xxx term can take on the following values: +//! +//! - \b COMP_OUTPUT_NONE to disable the output from the comparator to a device +//! pin. +//! - \b COMP_OUTPUT_NORMAL to enable a non-inverted output from the comparator +//! to a device pin. +//! - \b COMP_OUTPUT_INVERT to enable an inverted output from the comparator to +//! a device pin. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_configure) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorConfigure(unsigned long ulBase, unsigned long ulComp, + unsigned long ulConfig) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Configure this comparator. + // + HWREG(ulBase + (ulComp * 0x20) + COMP_O_ACCTL0) = ulConfig; +} +#endif + +//***************************************************************************** +// +//! Sets the internal reference voltage. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulRef is the desired reference voltage. +//! +//! This function will set the internal reference voltage value. The voltage +//! is specified as one of the following values: +//! +//! - \b COMP_REF_OFF to turn off the reference voltage +//! - \b COMP_REF_0V to set the reference voltage to 0 V +//! - \b COMP_REF_0_1375V to set the reference voltage to 0.1375 V +//! - \b COMP_REF_0_275V to set the reference voltage to 0.275 V +//! - \b COMP_REF_0_4125V to set the reference voltage to 0.4125 V +//! - \b COMP_REF_0_55V to set the reference voltage to 0.55 V +//! - \b COMP_REF_0_6875V to set the reference voltage to 0.6875 V +//! - \b COMP_REF_0_825V to set the reference voltage to 0.825 V +//! - \b COMP_REF_0_928125V to set the reference voltage to 0.928125 V +//! - \b COMP_REF_0_9625V to set the reference voltage to 0.9625 V +//! - \b COMP_REF_1_03125V to set the reference voltage to 1.03125 V +//! - \b COMP_REF_1_134375V to set the reference voltage to 1.134375 V +//! - \b COMP_REF_1_1V to set the reference voltage to 1.1 V +//! - \b COMP_REF_1_2375V to set the reference voltage to 1.2375 V +//! - \b COMP_REF_1_340625V to set the reference voltage to 1.340625 V +//! - \b COMP_REF_1_375V to set the reference voltage to 1.375 V +//! - \b COMP_REF_1_44375V to set the reference voltage to 1.44375 V +//! - \b COMP_REF_1_5125V to set the reference voltage to 1.5125 V +//! - \b COMP_REF_1_546875V to set the reference voltage to 1.546875 V +//! - \b COMP_REF_1_65V to set the reference voltage to 1.65 V +//! - \b COMP_REF_1_753125V to set the reference voltage to 1.753125 V +//! - \b COMP_REF_1_7875V to set the reference voltage to 1.7875 V +//! - \b COMP_REF_1_85625V to set the reference voltage to 1.85625 V +//! - \b COMP_REF_1_925V to set the reference voltage to 1.925 V +//! - \b COMP_REF_1_959375V to set the reference voltage to 1.959375 V +//! - \b COMP_REF_2_0625V to set the reference voltage to 2.0625 V +//! - \b COMP_REF_2_165625V to set the reference voltage to 2.165625 V +//! - \b COMP_REF_2_26875V to set the reference voltage to 2.26875 V +//! - \b COMP_REF_2_371875V to set the reference voltage to 2.371875 V +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_refset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorRefSet(unsigned long ulBase, unsigned long ulRef) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + + // + // Set the voltage reference voltage as requested. + // + HWREG(ulBase + COMP_O_REFCTL) = ulRef; +} +#endif + +//***************************************************************************** +// +//! Gets the current comparator output value. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! +//! This function retrieves the current value of the comparator output. +//! +//! \return Returns \b true if the comparator output is high and \b false if +//! the comparator output is low. +// +//***************************************************************************** +#if defined(GROUP_valueget) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +ComparatorValueGet(unsigned long ulBase, unsigned long ulComp) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Return the appropriate value based on the comparator's present output + // value. + // + if(HWREG(ulBase + (ulComp * 0x20) + COMP_O_ACSTAT0) & COMP_ACSTAT_OVAL) + { + return(true); + } + else + { + return(false); + } +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the comparator interrupt. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! \param pfnHandler is a pointer to the function to be called when the +//! comparator interrupt occurs. +//! +//! This sets the handler to be called when the comparator interrupt occurs. +//! This will enable the interrupt in the interrupt controller; it is the +//! interrupt-handler's responsibility to clear the interrupt source via +//! ComparatorIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorIntRegister(unsigned long ulBase, unsigned long ulComp, + void (*pfnHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(INT_COMP0 + ulComp, pfnHandler); + + // + // Enable the interrupt in the interrupt controller. + // + IntEnable(INT_COMP0 + ulComp); + + // + // Enable the comparator interrupt. + // + HWREG(ulBase + COMP_O_INTEN) |= 1 << ulComp; +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for a comparator interrupt. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! +//! This function will clear the handler to be called when a comparator +//! interrupt occurs. This will also mask off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorIntUnregister(unsigned long ulBase, unsigned long ulComp) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Disable the comparator interrupt. + // + HWREG(ulBase + COMP_O_INTEN) &= ~(1 << ulComp); + + // + // Disable the interrupt in the interrupt controller. + // + IntDisable(INT_COMP0 + ulComp); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_COMP0 + ulComp); +} +#endif + +//***************************************************************************** +// +//! Enables the comparator interrupt. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! +//! This function enables generation of an interrupt from the specified +//! comparator. Only comparators whose interrupts are enabled can be reflected +//! to the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorIntEnable(unsigned long ulBase, unsigned long ulComp) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Enable the comparator interrupt. + // + HWREG(ulBase + COMP_O_INTEN) |= 1 << ulComp; +} +#endif + +//***************************************************************************** +// +//! Disables the comparator interrupt. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! +//! This function disables generation of an interrupt from the specified +//! comparator. Only comparators whose interrupts are enabled can be reflected +//! to the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorIntDisable(unsigned long ulBase, unsigned long ulComp) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Disable the comparator interrupt. + // + HWREG(ulBase + COMP_O_INTEN) &= ~(1 << ulComp); +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! \param bMasked is \b false if the raw interrupt status is required and +//! \b true if the masked interrupt status is required. +//! +//! This returns the interrupt status for the comparator. Either the raw or +//! the masked interrupt status can be returned. +//! +//! \return \b true if the interrupt is asserted and \b false if it is not +//! asserted. +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +ComparatorIntStatus(unsigned long ulBase, unsigned long ulComp, + tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(((HWREG(ulBase + COMP_O_MIS) >> ulComp) & 1) ? true : false); + } + else + { + return(((HWREG(ulBase + COMP_O_RIS) >> ulComp) & 1) ? true : false); + } +} +#endif + +//***************************************************************************** +// +//! Clears a comparator interrupt. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! +//! The comparator interrupt is cleared, so that it no longer asserts. This +//! must be done in the interrupt handler to keep it from being called again +//! immediately upon exit. Note that for a level triggered interrupt, the +//! interrupt cannot be cleared until it stops asserting. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorIntClear(unsigned long ulBase, unsigned long ulComp) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Clear the interrupt. + // + HWREG(ulBase + COMP_O_MIS) = 1 << ulComp; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/comp.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/comp.h new file mode 100644 index 0000000..9349982 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/comp.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// comp.h - Prototypes for the analog comparator driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __COMP_H__ +#define __COMP_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ComparatorConfigure() as the ulConfig +// parameter. For each group (i.e. COMP_TRIG_xxx, COMP_INT_xxx, etc.), one of +// the values may be selected and ORed together will values from the other +// groups. +// +//***************************************************************************** +#define COMP_TRIG_NONE 0x00000000 // No ADC trigger +#define COMP_TRIG_HIGH 0x00000880 // Trigger when high +#define COMP_TRIG_LOW 0x00000800 // Trigger when low +#define COMP_TRIG_FALL 0x00000820 // Trigger on falling edge +#define COMP_TRIG_RISE 0x00000840 // Trigger on rising edge +#define COMP_TRIG_BOTH 0x00000860 // Trigger on both edges +#define COMP_INT_HIGH 0x00000010 // Interrupt when high +#define COMP_INT_LOW 0x00000000 // Interrupt when low +#define COMP_INT_FALL 0x00000004 // Interrupt on falling edge +#define COMP_INT_RISE 0x00000008 // Interrupt on rising edge +#define COMP_INT_BOTH 0x0000000C // Interrupt on both edges +#define COMP_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_OUTPUT_NONE 0x00000000 // No comparator output +#define COMP_OUTPUT_NORMAL 0x00000100 // Comparator output normal +#define COMP_OUTPUT_INVERT 0x00000102 // Comparator output inverted + +//***************************************************************************** +// +// Values that can be passed to ComparatorSetRef() as the ulRef parameter. +// +//***************************************************************************** +#define COMP_REF_OFF 0x00000000 // Turn off the internal reference +#define COMP_REF_0V 0x00000300 // Internal reference of 0V +#define COMP_REF_0_1375V 0x00000301 // Internal reference of 0.1375V +#define COMP_REF_0_275V 0x00000302 // Internal reference of 0.275V +#define COMP_REF_0_4125V 0x00000303 // Internal reference of 0.4125V +#define COMP_REF_0_55V 0x00000304 // Internal reference of 0.55V +#define COMP_REF_0_6875V 0x00000305 // Internal reference of 0.6875V +#define COMP_REF_0_825V 0x00000306 // Internal reference of 0.825V +#define COMP_REF_0_928125V 0x00000201 // Internal reference of 0.928125V +#define COMP_REF_0_9625V 0x00000307 // Internal reference of 0.9625V +#define COMP_REF_1_03125V 0x00000202 // Internal reference of 1.03125V +#define COMP_REF_1_134375V 0x00000203 // Internal reference of 1.134375V +#define COMP_REF_1_1V 0x00000308 // Internal reference of 1.1V +#define COMP_REF_1_2375V 0x00000309 // Internal reference of 1.2375V +#define COMP_REF_1_340625V 0x00000205 // Internal reference of 1.340625V +#define COMP_REF_1_375V 0x0000030A // Internal reference of 1.375V +#define COMP_REF_1_44375V 0x00000206 // Internal reference of 1.44375V +#define COMP_REF_1_5125V 0x0000030B // Internal reference of 1.5125V +#define COMP_REF_1_546875V 0x00000207 // Internal reference of 1.546875V +#define COMP_REF_1_65V 0x0000030C // Internal reference of 1.65V +#define COMP_REF_1_753125V 0x00000209 // Internal reference of 1.753125V +#define COMP_REF_1_7875V 0x0000030D // Internal reference of 1.7875V +#define COMP_REF_1_85625V 0x0000020A // Internal reference of 1.85625V +#define COMP_REF_1_925V 0x0000030E // Internal reference of 1.925V +#define COMP_REF_1_959375V 0x0000020B // Internal reference of 1.959375V +#define COMP_REF_2_0625V 0x0000030F // Internal reference of 2.0625V +#define COMP_REF_2_165625V 0x0000020D // Internal reference of 2.165625V +#define COMP_REF_2_26875V 0x0000020E // Internal reference of 2.26875V +#define COMP_REF_2_371875V 0x0000020F // Internal reference of 2.371875V + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ComparatorConfigure(unsigned long ulBase, unsigned long ulComp, + unsigned long ulConfig); +extern void ComparatorRefSet(unsigned long ulBase, unsigned long ulRef); +extern tBoolean ComparatorValueGet(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntRegister(unsigned long ulBase, unsigned long ulComp, + void (*pfnHandler)(void)); +extern void ComparatorIntUnregister(unsigned long ulBase, + unsigned long ulComp); +extern void ComparatorIntEnable(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntDisable(unsigned long ulBase, unsigned long ulComp); +extern tBoolean ComparatorIntStatus(unsigned long ulBase, unsigned long ulComp, + tBoolean bMasked); +extern void ComparatorIntClear(unsigned long ulBase, unsigned long ulComp); + +#ifdef __cplusplus +} +#endif + +#endif // __COMP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/cpu.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/cpu.h new file mode 100644 index 0000000..688c522 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/cpu.h @@ -0,0 +1,40 @@ +//***************************************************************************** +// +// cpu.h - Prototypes for the CPU instruction wrapper functions. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __CPU_H__ +#define __CPU_H__ + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern void CPUcpsid(void); +extern void CPUcpsie(void); +extern void CPUwfi(void); + +#endif // __CPU_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/debug.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/debug.h new file mode 100644 index 0000000..e46e2a7 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/debug.h @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// debug.h - Macros for assisting debug of the driver library. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +//***************************************************************************** +// +// Prototype for the function that is called when an invalid argument is passed +// to an API. This is only used when doing a DEBUG build. +// +//***************************************************************************** +extern void __error__(char *pcFilename, unsigned long ulLine); + +//***************************************************************************** +// +// The ASSERT macro, which does the actual assertion checking. Typically, this +// will be for procedure arguments. +// +//***************************************************************************** +#ifdef DEBUG +#define ASSERT(expr) { \ + if(!(expr)) \ + { \ + __error__(__FILE__, __LINE__); \ + } \ + } +#else +#define ASSERT(expr) +#endif + +#endif // __DEBUG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/driverlib.r79 b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/driverlib.r79 new file mode 100644 index 0000000..0d2184f Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/driverlib.r79 differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/flash.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/flash.c new file mode 100644 index 0000000..ab7335f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/flash.c @@ -0,0 +1,668 @@ +//***************************************************************************** +// +// flash.c - Driver for programming the on-chip flash. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup flash_api +//! @{ +// +//***************************************************************************** + +#include "../hw_flash.h" +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_sysctl.h" +#include "../hw_types.h" +#include "debug.h" +#include "flash.h" +#include "interrupt.h" + +//***************************************************************************** +// +//! Gets the number of processor clocks per micro-second. +//! +//! This function returns the number of clocks per micro-second, as presently +//! known by the flash controller. +//! +//! \return Returns the number of processor clocks per micro-second. +// +//***************************************************************************** +#if defined(GROUP_usecget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +FlashUsecGet(void) +{ + // + // Return the number of clocks per micro-second. + // + return(HWREG(FLASH_USECRL) + 1); +} +#endif + +//***************************************************************************** +// +//! Sets the number of processor clocks per micro-second. +//! +//! \param ulClocks is the number of processor clocks per micro-second. +//! +//! This function is used to tell the flash controller the number of processor +//! clocks per micro-second. This value must be programmed correctly or the +//! flash most likely will not program correctly; it has no affect on reading +//! flash. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_usecset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +FlashUsecSet(unsigned long ulClocks) +{ + // + // Set the number of clocks per micro-second. + // + HWREG(FLASH_USECRL) = ulClocks - 1; +} +#endif + +//***************************************************************************** +// +//! Erases a block of flash. +//! +//! \param ulAddress is the start address of the flash block to be erased. +//! +//! This function will erase a 1 kB block of the on-chip flash. After erasing, +//! the block will be filled with 0xFF bytes. Read-only and execute-only +//! blocks cannot be erased. +//! +//! This function will not return until the block has been erased. +//! +//! \return Returns 0 on success, or -1 if an invalid block address was +//! specified or the block is write-protected. +// +//***************************************************************************** +#if defined(GROUP_erase) || defined(BUILD_ALL) || defined(DOXYGEN) +long +FlashErase(unsigned long ulAddress) +{ + // + // Check the arguments. + // + ASSERT(!(ulAddress & (FLASH_ERASE_SIZE - 1))); + + // + // Clear the flash access interrupt. + // + HWREG(FLASH_FCMISC) = FLASH_FCMISC_ACCESS; + + // + // Erase the block. + // + HWREG(FLASH_FMA) = ulAddress; + HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_ERASE; + + // + // Wait until the word has been programmed. + // + while(HWREG(FLASH_FMC) & FLASH_FMC_ERASE) + { + } + + // + // Return an error if an access violation occurred. + // + if(HWREG(FLASH_FCRIS) & FLASH_FCRIS_ACCESS) + { + return(-1); + } + + // + // Success. + // + return(0); +} +#endif + +//***************************************************************************** +// +//! Programs flash. +//! +//! \param pulData is a pointer to the data to be programmed. +//! \param ulAddress is the starting address in flash to be programmed. Must +//! be a multiple of four. +//! \param ulCount is the number of bytes to be programmed. Must be a multiple +//! of four. +//! +//! This function will program a sequence of words into the on-chip flash. +//! Programming each location consists of the result of an AND operation +//! of the new data and the existing data; in other words bits that contain +//! 1 can remain 1 or be changed to 0, but bits that are 0 cannot be changed +//! to 1. Therefore, a word can be programmed multiple times as long as these +//! rules are followed; if a program operation attempts to change a 0 bit to +//! a 1 bit, that bit will not have its value changed. +//! +//! Since the flash is programmed one word at a time, the starting address and +//! byte count must both be multiples of four. It is up to the caller to +//! verify the programmed contents, if such verification is required. +//! +//! This function will not return until the data has been programmed. +//! +//! \return Returns 0 on success, or -1 if a programming error is encountered. +// +//***************************************************************************** +#if defined(GROUP_program) || defined(BUILD_ALL) || defined(DOXYGEN) +long +FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount) +{ + // + // Check the arguments. + // + ASSERT(!(ulAddress & 3)); + ASSERT(!(ulCount & 3)); + + // + // Clear the flash access interrupt. + // + HWREG(FLASH_FCMISC) = FLASH_FCMISC_ACCESS; + + // + // Loop over the words to be programmed. + // + while(ulCount) + { + // + // Program the next word. + // + HWREG(FLASH_FMA) = ulAddress; + HWREG(FLASH_FMD) = *pulData; + HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_WRITE; + + // + // Wait until the word has been programmed. + // + while(HWREG(FLASH_FMC) & FLASH_FMC_WRITE) + { + } + + // + // Increment to the next word. + // + pulData++; + ulAddress += 4; + ulCount -= 4; + } + + // + // Return an error if an access violation occurred. + // + if(HWREG(FLASH_FCRIS) & FLASH_FCRIS_ACCESS) + { + return(-1); + } + + // + // Success. + // + return(0); +} +#endif + +//***************************************************************************** +// +//! Gets the protection setting for a block of flash. +//! +//! \param ulAddress is the start address of the flash block to be queried. +//! +//! This function will get the current protection for the specified 2 kB block +//! of flash. Each block can be read/write, read-only, or execute-only. +//! Read/write blocks can be read, executed, erased, and programmed. Read-only +//! blocks can be read and executed. Execute-only blocks can only be executed; +//! processor and debugger data reads are not allowed. +//! +//! \return Returns the protection setting for this block. See +//! FlashProtectSet() for possible values. +// +//***************************************************************************** +#if defined(GROUP_protectget) || defined(BUILD_ALL) || defined(DOXYGEN) +tFlashProtection +FlashProtectGet(unsigned long ulAddress) +{ + unsigned long ulFMPRE, ulFMPPE; + + // + // Check the argument. + // + ASSERT(!(ulAddress & (FLASH_PROTECT_SIZE - 1))); + + // + // Read the flash protection register and get the bits that apply to the + // specified block. + // + ulFMPRE = HWREG(FLASH_FMPRE); + ulFMPPE = HWREG(FLASH_FMPPE); + switch((((ulFMPRE >> (ulAddress / FLASH_PROTECT_SIZE)) & + FLASH_FMP_BLOCK_0) << 1) | + ((ulFMPPE >> (ulAddress / FLASH_PROTECT_SIZE)) & FLASH_FMP_BLOCK_0)) + { + // + // This block is marked as execute only (i.e. it can not be erased or + // programmed, and the only reads allowed are via the instruction fecth + // interface). + // + case 0: + case 1: + { + return(FlashExecuteOnly); + } + + // + // This block is marked as read only (i.e. it can not be erased or + // programmed). + // + case 2: + { + return(FlashReadOnly); + } + + // + // This block is read/write; it can be read, erased, and programmed. + // + case 3: + default: + { + return(FlashReadWrite); + } + } +} +#endif + +//***************************************************************************** +// +//! Sets the protection setting for a block of flash. +//! +//! \param ulAddress is the start address of the flash block to be protected. +//! \param eProtect is the protection to be applied to the block. Can be one +//! of \b FlashReadWrite, \b FlashReadOnly, or \b FlashExecuteOnly. +//! +//! This function will set the protection for the specified 2 kB block of +//! flash. Blocks which are read/write can be made read-only or execute-only. +//! Blocks which are read-only can be made execute-only. Blocks which are +//! execute-only cannot have their protection modified. Attempts to make the +//! block protection less stringent (i.e. read-only to read/write) will result +//! in a failure (and be prevented by the hardware). +//! +//! Changes to the flash protection are maintained only until the next reset. +//! This allows the application to be executed in the desired flash protection +//! environment to check for inappropriate flash access (via the flash +//! interrupt). To make the flash protection permanent, use the +//! FlashProtectSave() function. +//! +//! \return Returns 0 on success, or -1 if an invalid address or an invalid +//! protection was specified. +// +//***************************************************************************** +#if defined(GROUP_protectset) || defined(BUILD_ALL) || defined(DOXYGEN) +long +FlashProtectSet(unsigned long ulAddress, tFlashProtection eProtect) +{ + unsigned long ulProtectRE, ulProtectPE; + + // + // Check the argument. + // + ASSERT(!(ulAddress & (FLASH_PROTECT_SIZE - 1))); + ASSERT((eProtect == FlashReadWrite) || (eProtect == FlashReadOnly) || + (eProtect == FlashExecuteOnly)); + + // + // Convert the address into a block number. + // + ulAddress /= FLASH_PROTECT_SIZE; + + // + // Get the current protection. + // + ulProtectRE = HWREG(FLASH_FMPRE); + ulProtectPE = HWREG(FLASH_FMPPE); + + // + // Set the protection based on the requested proection. + // + switch(eProtect) + { + // + // Make this block execute only. + // + case FlashExecuteOnly: + { + // + // Turn off the read and program bits for this block. + // + ulProtectRE &= ~(FLASH_FMP_BLOCK_0 << ulAddress); + ulProtectPE &= ~(FLASH_FMP_BLOCK_0 << ulAddress); + + // + // We're done handling this protection. + // + break; + } + + // + // Make this block read only. + // + case FlashReadOnly: + { + // + // The block can not be made read only if it is execute only. + // + if(((ulProtectRE >> ulAddress) & FLASH_FMP_BLOCK_0) != + FLASH_FMP_BLOCK_0) + { + return(-1); + } + + // + // Make this block read only. + // + ulProtectPE &= ~(FLASH_FMP_BLOCK_0 << ulAddress); + + // + // We're done handling this protection. + // + break; + } + + // + // Make this block read/write. + // + case FlashReadWrite: + default: + { + // + // The block can not be made read/write if it is not already + // read/write. + // + if((((ulProtectRE >> ulAddress) & FLASH_FMP_BLOCK_0) != + FLASH_FMP_BLOCK_0) || + (((ulProtectPE >> ulAddress) & FLASH_FMP_BLOCK_0) != + FLASH_FMP_BLOCK_0)) + { + return(-1); + } + + // + // The block is already read/write, so there is nothing to do. + // + return(0); + } + } + + // + // Set the new protection. + // + HWREG(FLASH_FMPRE) = ulProtectRE; + HWREG(FLASH_FMPPE) = ulProtectPE; + + // + // Success. + // + return(0); +} +#endif + +//***************************************************************************** +// +//! Saves the flash protection settings. +//! +//! This function will make the currently programmed flash protection settings +//! permanent. This is a non-reversible operation; a chip reset or power cycle +//! will not change the flash protection. +//! +//! This function will not return until the protection has been saved. +//! +//! \return Returns 0 on success, or -1 if a hardware error is encountered. +// +//***************************************************************************** +#if defined(GROUP_protectsave) || defined(BUILD_ALL) || defined(DOXYGEN) +long +FlashProtectSave(void) +{ + // + // Tell the flash controller to write the flash read protection register. + // + HWREG(FLASH_FMA) = 0; + HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT; + + // + // Wait until the write has completed. + // + while(HWREG(FLASH_FMC) & FLASH_FMC_COMT) + { + } + + // + // Tell the flash controller to write the flash program protection + // register. + // + HWREG(FLASH_FMA) = 1; + HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT; + + // + // Wait until the write has completed. + // + while(HWREG(FLASH_FMC) & FLASH_FMC_COMT) + { + } + + // + // Success. + // + return(0); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the flash interrupt. +//! +//! \param pfnHandler is a pointer to the function to be called when the flash +//! interrupt occurs. +//! +//! This sets the handler to be called when the flash interrupt occurs. The +//! flash controller can generate an interrupt when an invalid flash access +//! occurs, such as trying to program or erase a read-only block, or trying to +//! read from an execute-only block. It can also generate an interrupt when a +//! program or erase operation has completed. The interrupt will be +//! automatically enabled when the handler is registered. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +FlashIntRegister(void (*pfnHandler)(void)) +{ + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(INT_FLASH, pfnHandler); + + // + // Enable the flash interrupt. + // + IntEnable(INT_FLASH); +} +#endif + +//***************************************************************************** +// +//! Unregisters the interrupt handler for the flash interrupt. +//! +//! This function will clear the handler to be called when the flash interrupt +//! occurs. This will also mask off the interrupt in the interrupt controller +//! so that the interrupt handler is no longer called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +FlashIntUnregister(void) +{ + // + // Disable the interrupt. + // + IntDisable(INT_FLASH); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_FLASH); +} +#endif + +//***************************************************************************** +// +//! Enables individual flash controller interrupt sources. +//! +//! \param ulIntFlags is a bit mask of the interrupt sources to be enabled. +//! Can be any of the \b FLASH_FCIM_PROGRAM or \b FLASH_FCIM_ACCESS values. +//! +//! Enables the indicated flash controller interrupt sources. Only the sources +//! that are enabled can be reflected to the processor interrupt; disabled +//! sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +FlashIntEnable(unsigned long ulIntFlags) +{ + // + // Enable the specified interrupts. + // + HWREG(FLASH_FCIM) |= ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Disables individual flash controller interrupt sources. +//! +//! \param ulIntFlags is a bit mask of the interrupt sources to be disabled. +//! Can be any of the \b FLASH_FCIM_PROGRAM or \b FLASH_FCIM_ACCESS values. +//! +//! Disables the indicated flash controller interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt; +//! disabled sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +FlashIntDisable(unsigned long ulIntFlags) +{ + // + // Disable the specified interrupts. + // + HWREG(FLASH_FCIM) &= ~(ulIntFlags); +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param bMasked is false if the raw interrupt status is required and true if +//! the masked interrupt status is required. +//! +//! This returns the interrupt status for the flash controller. Either the raw +//! interrupt status or the status of interrupts that are allowed to reflect to +//! the processor can be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! \b FLASH_FCMISC_PROGRAM and \b FLASH_FCMISC_ACCESS. +// +//***************************************************************************** +#if defined(GROUP_intgetstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +FlashIntGetStatus(tBoolean bMasked) +{ + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(FLASH_FCMISC)); + } + else + { + return(HWREG(FLASH_FCRIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears flash controller interrupt sources. +//! +//! \param ulIntFlags is the bit mask of the interrupt sources to be cleared. +//! Can be any of the \b FLASH_FCMISC_PROGRAM or \b FLASH_FCMISC_ACCESS +//! values. +//! +//! The specified flash controller interrupt sources are cleared, so that they +//! no longer assert. This must be done in the interrupt handler to keep it +//! from being called again immediately upon exit. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +FlashIntClear(unsigned long ulIntFlags) +{ + // + // Clear the flash interrupt. + // + HWREG(FLASH_FCMISC) = ulIntFlags; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/flash.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/flash.h new file mode 100644 index 0000000..9c41dda --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/flash.h @@ -0,0 +1,75 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/gpio.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/gpio.c new file mode 100644 index 0000000..a49602e --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/gpio.c @@ -0,0 +1,1103 @@ +//***************************************************************************** +// +// gpio.c - API for GPIO ports +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup gpio_api +//! @{ +// +//***************************************************************************** + +#include "../hw_gpio.h" +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "interrupt.h" + +//***************************************************************************** +// +//! \internal +//! Get GPIO interrupt number. +//! +//! \param ulPort base address of the selected GPIO port +//! +//! Given a GPIO base address, returns the corresponding interrupt number. +//! +//! \return Returns a GPIO interrupt number, or -1 if \e ulPort is invalid. +// +//***************************************************************************** +#if defined(GROUP_getintnumber) || defined(BUILD_ALL) +long +GPIOGetIntNumber(unsigned long ulPort) +{ + unsigned int ulInt; + + // + // Determine the GPIO interrupt number for the given module. + // + switch(ulPort) + { + case GPIO_PORTA_BASE: + { + ulInt = INT_GPIOA; + break; + } + + case GPIO_PORTB_BASE: + { + ulInt = INT_GPIOB; + break; + } + + case GPIO_PORTC_BASE: + { + ulInt = INT_GPIOC; + break; + } + + case GPIO_PORTD_BASE: + { + ulInt = INT_GPIOD; + break; + } + + case GPIO_PORTE_BASE: + { + ulInt = INT_GPIOE; + break; + } + + default: + { + return(-1); + } + } + + // + // Return GPIO interrupt number. + // + return(ulInt); +} +#else +extern long GPIOGetIntNumber(unsigned long ulPort); +#endif + +//***************************************************************************** +// +//! Sets the direction and mode of the specified pins of the selected +//! GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! \param ulPinIO pin direction and/or mode +//! +//! This function will set the specified pins on the selected GPIO port +//! as either an input or output under software control, or it will set the +//! pin to be under hardware control. +//! +//! The parameter \e ulPinIO is an enumerated data type that can be one of +//! the following values: +//! +//! - \b GPIO_DIR_MODE_IN +//! - \b GPIO_DIR_MODE_OUT +//! - \b GPIO_DIR_MODE_HW +//! +//! where \b GPIO_DIR_MODE_IN specifies that the pin will be programmed as +//! a software controlled input, \b GPIO_DIR_MODE_OUT specifies that the pin +//! will be programmed as a software controlled output, and +//! \b GPIO_DIR_MODE_HW specifies that the pin will be placed under +//! hardware control. +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_dirmodeset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + ASSERT((ulPinIO == GPIO_DIR_MODE_IN) || (ulPinIO == GPIO_DIR_MODE_OUT) || + (ulPinIO == GPIO_DIR_MODE_HW)); + + // + // Set the pin direction and mode. + // + HWREG(ulPort + GPIO_O_DIR) = ((ulPinIO & 1) ? + (HWREG(ulPort + GPIO_O_DIR) | ucPins) : + (HWREG(ulPort + GPIO_O_DIR) & ~(ucPins))); + HWREG(ulPort + GPIO_O_AFSEL) = ((ulPinIO & 2) ? + (HWREG(ulPort + GPIO_O_AFSEL) | ucPins) : + (HWREG(ulPort + GPIO_O_AFSEL) & + ~(ucPins))); +} +#endif + +//***************************************************************************** +// +//! Gets the direction and mode of a specified pin of the selected +//! GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPin pin number of the specified pin, relative to the selected +//! GPIO port. +//! +//! This function gets the direction and control mode for a specified pin on +//! the selected GPIO port. The pin can be configured as either an input or +//! output under software control, or it can be under hardware control. The +//! type of control and direction are returned as an enumerated data type. +//! +//! \return Returns one of the enumerated data types described for +//! GPIODirModeSet(). +// +//***************************************************************************** +#if defined(GROUP_dirmodeget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +GPIODirModeGet(unsigned long ulPort, unsigned char ucPin) +{ + unsigned long ulDir, ulAFSEL; + + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + ASSERT(ucPin < 8); + + // + // Convert from a pin number to a bit position. + // + ucPin = 1 << ucPin; + + // + // Return the pin direction and mode. + // + ulDir = HWREG(ulPort + GPIO_O_DIR); + ulAFSEL = HWREG(ulPort + GPIO_O_AFSEL); + return(((ulDir & ucPin) ? 1 : 0) | ((ulAFSEL & ucPin) ? 2 : 0)); +} +#endif + +//***************************************************************************** +// +//! Sets the interrupt type for the specified pins of the selected GPIO +//! port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! \param ulIntType specifies the type of interrupt trigger mechanism +//! +//! This function sets up the various interrupt trigger mechanisms for the +//! specified pins on the selected GPIO port. +//! +//! The parameter \e ulIntType is an enumerated data type that can be one of +//! the following values: +//! +//! - \b GPIO_FALLING_EDGE +//! - \b GPIO_RISING_EDGE +//! - \b GPIO_BOTH_EDGES +//! - \b GPIO_LOW_LEVEL +//! - \b GPIO_HIGH_LEVEL +//! +//! where the different values describe the interrupt detection mechanism +//! (edge or level) and the particular triggering event (falling, rising, +//! or both edges for edge detect, low or high for level detect). +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \note In order to avoid any spurious interrupts, the user must +//! ensure that the GPIO inputs remain stable for the duration of +//! this function. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_inttypeset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + ASSERT((ulIntType == GPIO_FALLING_EDGE) || + (ulIntType == GPIO_RISING_EDGE) || + (ulIntType == GPIO_BOTH_EDGES) || + (ulIntType == GPIO_LOW_LEVEL) || + (ulIntType == GPIO_HIGH_LEVEL)); + + // + // Set the pin interrupt type. + // + HWREG(ulPort + GPIO_O_IBE) = ((ulIntType & 1) ? + (HWREG(ulPort + GPIO_O_IBE) | ucPins) : + (HWREG(ulPort + GPIO_O_IBE) & ~(ucPins))); + HWREG(ulPort + GPIO_O_IS) = ((ulIntType & 2) ? + (HWREG(ulPort + GPIO_O_IS) | ucPins) : + (HWREG(ulPort + GPIO_O_IS) & ~(ucPins))); + HWREG(ulPort + GPIO_O_IEV) = ((ulIntType & 4) ? + (HWREG(ulPort + GPIO_O_IEV) | ucPins) : + (HWREG(ulPort + GPIO_O_IEV) & ~(ucPins))); +} +#endif + +//***************************************************************************** +// +//! Gets the interrupt type for the specified pin of the selected GPIO +//! port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPin pin number of the specified pin, relative to the selected +//! GPIO port. +//! +//! This function gets the interrupt type for a specified pin on the selected +//! GPIO port. The pin can be configured as a falling edge, rising edge, or +//! both edge detected interrupt, or it can be configured as a low level or +//! high level detected interrupt. The type of interrupt detection mechanism +//! is returned as an enumerated data type. +//! +//! \return Returns one of the enumerated data types described for +//! GPIOIntTypeSet(). +// +//***************************************************************************** +#if defined(GROUP_inttypeget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin) +{ + unsigned long ulIBE, ulIS, ulIEV; + + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + ASSERT(ucPin < 8); + + // + // Convert from a pin number to a bit position. + // + ucPin = 1 << ucPin; + + // + // Return the pin interrupt type. + // + ulIBE = HWREG(ulPort + GPIO_O_IBE); + ulIS = HWREG(ulPort + GPIO_O_IS); + ulIEV = HWREG(ulPort + GPIO_O_IEV); + return(((ulIBE & ucPin) ? 1 : 0) | ((ulIS & ucPin) ? 2 : 0) | + ((ulIEV & ucPin) ? 4 : 0)); +} +#endif + +//***************************************************************************** +// +//! Sets the pad configuration for the specified pins of the selected GPIO +//! port. +//! +//! \param ulPort is the base address of the GPIO port. +//! \param ucPins bit-packed representation of the specified pins. +//! \param ulStrength specifies the output drive strength. +//! \param ulPinType specifies the pin type. +//! +//! This function sets the drive strength and type for the specified pins +//! on the selected GPIO port. For pins configured as input ports, the +//! pad is configured as requested, but the only real effect on the input +//! is the configuration of the pull-up or pull-down termination. +//! +//! The parameter \e ulStrength can be one of the following values: +//! +//! - \b GPIO_STRENGTH_2MA +//! - \b GPIO_STRENGTH_4MA +//! - \b GPIO_STRENGTH_8MA +//! - \b GPIO_STRENGTH_8MA_SC +//! +//! where \b GPIO_STRENGTH_xMA specifies either 2, 4, or 8 mA output drive +//! strength, and \b GPIO_OUT_STRENGTH_8MA_SC specifies 8 mA output drive with +//! slew control. +//! +//! The parameter \e ulPinType can be one of the following values: +//! +//! - \b GPIO_PIN_TYPE_STD +//! - \b GPIO_PIN_TYPE_STD_WPU +//! - \b GPIO_PIN_TYPE_STD_WPD +//! - \b GPIO_PIN_TYPE_OD +//! - \b GPIO_PIN_TYPE_OD_WPU +//! - \b GPIO_PIN_TYPE_OD_WPD +//! - \b GPIO_PIN_TYPE_ANALOG +//! +//! where \b GPIO_PIN_TYPE_STD* specifies a push-pull pin, \b GPIO_PIN_TYPE_OD* +//! specifies an open-drain pin, \b *_WPU specifies a weak pull-up, \b *_WPD +//! specifies a weak pull-down, and \b GPIO_PIN_TYPE_ANALOG specifies an +//! analog input (for the comparators). +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_padconfigset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, unsigned long ulPinType) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + ASSERT((ulStrength == GPIO_STRENGTH_2MA) || + (ulStrength == GPIO_STRENGTH_4MA) || + (ulStrength == GPIO_STRENGTH_8MA) || + (ulStrength == GPIO_STRENGTH_8MA_SC)); + ASSERT((ulPinType == GPIO_PIN_TYPE_STD) || + (ulPinType == GPIO_PIN_TYPE_STD_WPU) || + (ulPinType == GPIO_PIN_TYPE_STD_WPD) || + (ulPinType == GPIO_PIN_TYPE_OD) || + (ulPinType == GPIO_PIN_TYPE_OD_WPU) || + (ulPinType == GPIO_PIN_TYPE_OD_WPD) || + (ulPinType == GPIO_PIN_TYPE_ANALOG)) + + // + // Set the output drive strength. + // + HWREG(ulPort + GPIO_O_DR2R) = ((ulStrength & 1) ? + (HWREG(ulPort + GPIO_O_DR2R) | ucPins) : + (HWREG(ulPort + GPIO_O_DR2R) & ~(ucPins))); + HWREG(ulPort + GPIO_O_DR4R) = ((ulStrength & 2) ? + (HWREG(ulPort + GPIO_O_DR4R) | ucPins) : + (HWREG(ulPort + GPIO_O_DR4R) & ~(ucPins))); + HWREG(ulPort + GPIO_O_DR8R) = ((ulStrength & 4) ? + (HWREG(ulPort + GPIO_O_DR8R) | ucPins) : + (HWREG(ulPort + GPIO_O_DR8R) & ~(ucPins))); + HWREG(ulPort + GPIO_O_SLR) = ((ulStrength & 8) ? + (HWREG(ulPort + GPIO_O_SLR) | ucPins) : + (HWREG(ulPort + GPIO_O_SLR) & ~(ucPins))); + + // + // Set the pin type. + // + HWREG(ulPort + GPIO_O_ODR) = ((ulPinType & 1) ? + (HWREG(ulPort + GPIO_O_ODR) | ucPins) : + (HWREG(ulPort + GPIO_O_ODR) & ~(ucPins))); + HWREG(ulPort + GPIO_O_PUR) = ((ulPinType & 2) ? + (HWREG(ulPort + GPIO_O_PUR) | ucPins) : + (HWREG(ulPort + GPIO_O_PUR) & ~(ucPins))); + HWREG(ulPort + GPIO_O_PDR) = ((ulPinType & 4) ? + (HWREG(ulPort + GPIO_O_PDR) | ucPins) : + (HWREG(ulPort + GPIO_O_PDR) & ~(ucPins))); + HWREG(ulPort + GPIO_O_DEN) = ((ulPinType & 8) ? + (HWREG(ulPort + GPIO_O_DEN) | ucPins) : + (HWREG(ulPort + GPIO_O_DEN) & ~(ucPins))); +} +#endif + +//***************************************************************************** +// +//! Gets the pad configuration for the specified pin of the selected GPIO +//! port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPin pin number of the specified pin, relative to the selected +//! GPIO port. +//! \param pulStrength pointer to storage for the output drive strength +//! \param pulPinType pointer to storage for the output drive type +//! +//! This function gets the pad configuration for a specified pin on the +//! selected GPIO port. The values returned in \e eStrength and \e eOutType +//! correspond to the values used in GPIOPadConfigSet(). This function also +//! works for pins configured as input pins; however, the only meaningful +//! data returned is whether the pin is terminated with a pull-up or +//! down resistor. +//! +//! \return None +// +//***************************************************************************** +#if defined(GROUP_padconfigget) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, unsigned long *pulPinType) +{ + unsigned long ulTemp1, ulTemp2, ulTemp3, ulTemp4; + + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + ASSERT(ucPin < 8); + + // + // Convert from a pin number to a bit position. + // + ucPin = (1 << ucPin); + + // + // Get the drive strength for this pin. + // + ulTemp1 = HWREG(ulPort + GPIO_O_DR2R); + ulTemp2 = HWREG(ulPort + GPIO_O_DR4R); + ulTemp3 = HWREG(ulPort + GPIO_O_DR8R); + ulTemp4 = HWREG(ulPort + GPIO_O_SLR); + *pulStrength = (((ulTemp1 & ucPin) ? 1 : 0) | ((ulTemp2 & ucPin) ? 2 : 0) | + ((ulTemp3 & ucPin) ? 4 : 0) | ((ulTemp4 & ucPin) ? 8 : 0)); + + // + // Get the pin type. + // + ulTemp1 = HWREG(ulPort + GPIO_O_ODR); + ulTemp2 = HWREG(ulPort + GPIO_O_PUR); + ulTemp3 = HWREG(ulPort + GPIO_O_PDR); + ulTemp4 = HWREG(ulPort + GPIO_O_DEN); + *pulPinType = (((ulTemp1 & ucPin) ? 1 : 0) | ((ulTemp2 & ucPin) ? 2 : 0) | + ((ulTemp3 & ucPin) ? 4 : 0) | ((ulTemp4 & ucPin) ? 8 : 0)); +} +#endif + +//***************************************************************************** +// +//! Enables interrupts for the specified pins of the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! Unmasks the interrupt for the specified pins. +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pinintenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Enable the interrupts. + // + HWREG(ulPort + GPIO_O_IM) |= ucPins; +} +#endif + +//***************************************************************************** +// +//! Disables interrupts for the specified pins of the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! Masks the interrupt for the specified pins. +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pinintdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Disable the interrupts. + // + HWREG(ulPort + GPIO_O_IM) &= ~(ucPins); +} +#endif + +//***************************************************************************** +// +//! Gets interrupt status for all the pins of the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param bMasked specifies whether masked or raw interrupt +//! status is returned +//! +//! If \e bMasked is set as \b true, then the masked interrupt status is +//! returned; otherwise, the raw interrupt status will be returned. +//! +//! \return Returns a bit-packed byte, where each bit that is set identifies +//! an active masked or raw interrupt, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. Bits +//! 31:8 should be ignored. +// +//***************************************************************************** +#if defined(GROUP_pinintstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +long +GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Return the interrupt status. + // + if(bMasked) + { + return(HWREG(ulPort + GPIO_O_MIS)); + } + else + { + return(HWREG(ulPort + GPIO_O_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears the interrupt for the specified pins of the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! Clears the interrupt for the specified pins. +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pinintclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Clear the interrupts. + // + HWREG(ulPort + GPIO_O_ICR) = ucPins; +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param pfIntHandler pointer to the GPIO port interrupt handling function +//! +//! This function will ensure that the interrupt handler specified by \e +//! pfIntHandler is called when an interrupt is detected from the selected +//! GPIO port. This function will also enable the corresponding GPIO +//! interrupt in the interrupt controller; individual pin interrupts and +//! interrupt sources must be enabled with GPIOPinIntEnable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_portintregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPortIntRegister(unsigned long ulPort, void (*pfIntHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Get the interrupt number associated with the specified GPIO. + // + ulPort = GPIOGetIntNumber(ulPort); + + // + // Register the interrupt handler. + // + IntRegister(ulPort, pfIntHandler); + + // + // Enable the GPIO interrupt. + // + IntEnable(ulPort); +} +#endif + +//***************************************************************************** +// +//! Removes an interrupt handler for the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! +//! This function will unregister the interrupt handler for the specified +//! GPIO port. This function will also disable the corresponding +//! GPIO port interrupt in the interrupt controller; individual GPIO interrupts +//! and interrupt sources must be disabled with GPIOPinIntDisable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_portintunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPortIntUnregister(unsigned long ulPort) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Get the interrupt number associated with the specified GPIO. + // + ulPort = GPIOGetIntNumber(ulPort); + + // + // Disable the GPIO interrupt. + // + IntDisable(ulPort); + + // + // Unregister the interrupt handler. + // + IntUnregister(ulPort); +} +#endif + +//***************************************************************************** +// +//! Reads the values present at the specified pins of the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The values at the specified pins are read, as specified by \e ucPins. +//! Values are returned for both input and output pins, and the value +//! for pins that are not specified by \e ucPins are set to 0. +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return Returns a bit-packed byte providing the state of the specified +//! pin, where bit 0 of the byte represents GPIO port pin 0, bit 1 represents +//! GPIO port pin 1, etc. Any bit that is not specified by \e ucPins +//! is returned as a 0. Bits 31:8 should be ignored. +// +//***************************************************************************** +#if defined(GROUP_pinread) || defined(BUILD_ALL) || defined(DOXYGEN) +long +GPIOPinRead(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Return the pin value(s). + // + return(HWREG(ulPort + (GPIO_O_DATA + (ucPins << 2)))); +} +#endif + +//***************************************************************************** +// +//! Writes a value at the specified pins of the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! \param ucVal value to write to the specified pins +//! +//! Writes the corresponding bit values to the output pins specified +//! by \e ucPins. Writing to a pin configured as an input pin has no +//! effect. +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pinwrite) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, unsigned char ucVal) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Write the pins. + // + HWREG(ulPort + (GPIO_O_DATA + (ucPins << 2))) = ucVal; +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use as an analog comparator input. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The analog comparator input pins must be properly configured for the analog +//! comparator to function correctly. This function provides the proper +//! configuration for those pins. +//! +//! \note This cannot be used to turn any pin into an analog comparator input; +//! it only configures an analog comparator pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypecomparator) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be inputs. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_IN); + + // + // Set the pad(s) for analog operation. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_ANALOG); +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use by the I2C peripheral. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The I2C pins must be properly configured for the I2C peripheral to function +//! correctly. This function provides the proper configuration for those pins. +//! +//! \note This cannot be used to turn any pin into an I2C pin; it only +//! configures an I2C pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypei2c) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be peripheral controlled. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_HW); + + // + // Set the pad(s) for open-drain operation with a weak pull-up. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_OD_WPU); +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use by the PWM peripheral. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The PWM pins must be properly configured for the PWM peripheral to function +//! correctly. This function provides a typical configuration for those pins; +//! other configurations may work as well depending upon the board setup (for +//! example, using the on-chip pull-ups). +//! +//! \note This cannot be used to turn any pin into a PWM pin; it only +//! configures a PWM pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypepwm) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypePWM(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be peripheral controlled. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_HW); + + // + // Set the pad(s) for standard push-pull operation. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use by the QEI peripheral. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The QEI pins must be properly configured for the QEI peripheral to function +//! correctly. This function provides a typical configuration for those pins; +//! other configurations may work as well depending upon the board setup (for +//! example, not using the on-chip pull-ups). +//! +//! \note This cannot be used to turn any pin into a QEI pin; it only +//! configures a QEI pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypeqei) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypeQEI(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be peripheral controlled. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_HW); + + // + // Set the pad(s) for standard push-pull operation with a weak pull-up. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use by the SSI peripheral. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The SSI pins must be properly configured for the SSI peripheral to function +//! correctly. This function provides a typical configuration for those pins; +//! other configurations may work as well depending upon the board setup (for +//! example, using the on-chip pull-ups). +//! +//! \note This cannot be used to turn any pin into a SSI pin; it only +//! configures a SSI pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypessi) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be peripheral controlled. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_HW); + + // + // Set the pad(s) for standard push-pull operation. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use by the Timer peripheral. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The CCP pins must be properly configured for the timer peripheral to +//! function correctly. This function provides a typical configuration for +//! those pins; other configurations may work as well depending upon the board +//! setup (for example, using the on-chip pull-ups). +//! +//! \note This cannot be used to turn any pin into a timer pin; it only +//! configures a timer pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypetimer) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be peripheral controlled. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_HW); + + // + // Set the pad(s) for standard push-pull operation. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use by the UART peripheral. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The UART pins must be properly configured for the UART peripheral to +//! function correctly. This function provides a typical configuration for +//! those pins; other configurations may work as well depending upon the board +//! setup (for example, using the on-chip pull-ups). +//! +//! \note This cannot be used to turn any pin into a UART pin; it only +//! configures a UART pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypeuart) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be peripheral controlled. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_HW); + + // + // Set the pad(s) for standard push-pull operation. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/gpio.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/gpio.h new file mode 100644 index 0000000..88d6572 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/gpio.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// gpio.h - Defines and Macros for GPIO API. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following values define the bit field for the ucPins argument to several +// of the APIs. +// +//***************************************************************************** +#define GPIO_PIN_0 0x00000001 // GPIO pin 0 +#define GPIO_PIN_1 0x00000002 // GPIO pin 1 +#define GPIO_PIN_2 0x00000004 // GPIO pin 2 +#define GPIO_PIN_3 0x00000008 // GPIO pin 3 +#define GPIO_PIN_4 0x00000010 // GPIO pin 4 +#define GPIO_PIN_5 0x00000020 // GPIO pin 5 +#define GPIO_PIN_6 0x00000040 // GPIO pin 6 +#define GPIO_PIN_7 0x00000080 // GPIO pin 7 + +//***************************************************************************** +// +// Values that can be passed to GPIODirModeSet as the ulPinIO parameter, and +// returned from GPIODirModeGet. +// +//***************************************************************************** +#define GPIO_DIR_MODE_IN 0x00000000 // Pin is a GPIO input +#define GPIO_DIR_MODE_OUT 0x00000001 // Pin is a GPIO output +#define GPIO_DIR_MODE_HW 0x00000002 // Pin is a peripheral function + +//***************************************************************************** +// +// Values that can be passed to GPIOIntTypeSet as the ulIntType parameter, and +// returned from GPIOIntTypeGet. +// +//***************************************************************************** +#define GPIO_FALLING_EDGE 0x00000000 // Interrupt on falling edge +#define GPIO_RISING_EDGE 0x00000004 // Interrupt on rising edge +#define GPIO_BOTH_EDGES 0x00000001 // Interrupt on both edges +#define GPIO_LOW_LEVEL 0x00000002 // Interrupt on low level +#define GPIO_HIGH_LEVEL 0x00000007 // Interrupt on high level + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulStrength parameter, +// and returned by GPIOPadConfigGet in the *pulStrength parameter. +// +//***************************************************************************** +#define GPIO_STRENGTH_2MA 0x00000001 // 2mA drive strength +#define GPIO_STRENGTH_4MA 0x00000002 // 4mA drive strength +#define GPIO_STRENGTH_8MA 0x00000004 // 8mA drive strength +#define GPIO_STRENGTH_8MA_SC 0x0000000C // 8mA drive with slew rate control + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulPadType parameter, +// and returned by GPIOPadConfigGet in the *pulPadType parameter. +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x00000008 // Push-pull +#define GPIO_PIN_TYPE_STD_WPU 0x0000000A // Push-pull with weak pull-up +#define GPIO_PIN_TYPE_STD_WPD 0x0000000C // Push-pull with weak pull-down +#define GPIO_PIN_TYPE_OD 0x00000009 // Open-drain +#define GPIO_PIN_TYPE_OD_WPU 0x0000000B // Open-drain with weak pull-up +#define GPIO_PIN_TYPE_OD_WPD 0x0000000D // Open-drain with weak pull-down +#define GPIO_PIN_TYPE_ANALOG 0x00000000 // Analog comparator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO); +extern unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType); +extern unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, + unsigned long ulPadType); +extern void GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, + unsigned long *pulPadType); +extern void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins); +extern long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked); +extern void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPortIntRegister(unsigned long ulPort, + void (*pfIntHandler)(void)); +extern void GPIOPortIntUnregister(unsigned long ulPort); +extern long GPIOPinRead(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, + unsigned char ucVal); +extern void GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypePWM(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeQEI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins); + +#ifdef __cplusplus +} +#endif + +#endif // __GPIO_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_adc.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_adc.h new file mode 100644 index 0000000..022b9e9 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_adc.h @@ -0,0 +1,343 @@ +//***************************************************************************** +// +// hw_adc.h - Macros used when accessing the ADC hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ADC_H__ +#define __HW_ADC_H__ + +//***************************************************************************** +// +// The following define the offsets of the ADC registers. +// +//***************************************************************************** +#define ADC_O_ACTSS 0x00000000 // Active sample register +#define ADC_O_RIS 0x00000004 // Raw interrupt status register +#define ADC_O_IM 0x00000008 // Interrupt mask register +#define ADC_O_ISC 0x0000000C // Interrupt status/clear register +#define ADC_O_OSTAT 0x00000010 // Overflow status register +#define ADC_O_EMUX 0x00000014 // Event multiplexer select reg. +#define ADC_O_USTAT 0x00000018 // Underflow status register +#define ADC_O_SSPRI 0x00000020 // Channel priority register +#define ADC_O_PSSI 0x00000028 // Processor sample initiate reg. +#define ADC_O_SAC 0x00000030 // Sample Averaging Control reg. +#define ADC_O_SSMUX0 0x00000040 // Multiplexer select 0 register +#define ADC_O_SSCTL0 0x00000044 // Sample sequence control 0 reg. +#define ADC_O_SSFIFO0 0x00000048 // Result FIFO 0 register +#define ADC_O_SSFSTAT0 0x0000004C // FIFO 0 status register +#define ADC_O_SSMUX1 0x00000060 // Multiplexer select 1 register +#define ADC_O_SSCTL1 0x00000064 // Sample sequence control 1 reg. +#define ADC_O_SSFIFO1 0x00000068 // Result FIFO 1 register +#define ADC_O_SSFSTAT1 0x0000006C // FIFO 1 status register +#define ADC_O_SSMUX2 0x00000080 // Multiplexer select 2 register +#define ADC_O_SSCTL2 0x00000084 // Sample sequence control 2 reg. +#define ADC_O_SSFIFO2 0x00000088 // Result FIFO 2 register +#define ADC_O_SSFSTAT2 0x0000008C // FIFO 2 status register +#define ADC_O_SSMUX3 0x000000A0 // Multiplexer select 3 register +#define ADC_O_SSCTL3 0x000000A4 // Sample sequence control 3 reg. +#define ADC_O_SSFIFO3 0x000000A8 // Result FIFO 3 register +#define ADC_O_SSFSTAT3 0x000000AC // FIFO 3 status register +#define ADC_O_TMLB 0x00000100 // Test mode loopback register + +//***************************************************************************** +// +// The following define the offsets of the ADC sequence registers. +// +//***************************************************************************** +#define ADC_O_SEQ 0x00000040 // Offset to the first sequence +#define ADC_O_SEQ_STEP 0x00000020 // Increment to the next sequence +#define ADC_O_X_SSMUX 0x00000000 // Multiplexer select register +#define ADC_O_X_SSCTL 0x00000004 // Sample sequence control register +#define ADC_O_X_SSFIFO 0x00000008 // Result FIFO register +#define ADC_O_X_SSFSTAT 0x0000000C // FIFO status register + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ACTSS register. +// +//***************************************************************************** +#define ADC_ACTSS_ASEN3 0x00000008 // Sample sequence 3 enable +#define ADC_ACTSS_ASEN2 0x00000004 // Sample sequence 2 enable +#define ADC_ACTSS_ASEN1 0x00000002 // Sample sequence 1 enable +#define ADC_ACTSS_ASEN0 0x00000001 // Sample sequence 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the ADC_RIS register. +// +//***************************************************************************** +#define ADC_RIS_INR3 0x00000008 // Sample sequence 3 interrupt +#define ADC_RIS_INR2 0x00000004 // Sample sequence 2 interrupt +#define ADC_RIS_INR1 0x00000002 // Sample sequence 1 interrupt +#define ADC_RIS_INR0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_IM register. +// +//***************************************************************************** +#define ADC_IM_MASK3 0x00000008 // Sample sequence 3 mask +#define ADC_IM_MASK2 0x00000004 // Sample sequence 2 mask +#define ADC_IM_MASK1 0x00000002 // Sample sequence 1 mask +#define ADC_IM_MASK0 0x00000001 // Sample sequence 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ISC register. +// +//***************************************************************************** +#define ADC_ISC_IN3 0x00000008 // Sample sequence 3 interrupt +#define ADC_ISC_IN2 0x00000004 // Sample sequence 2 interrupt +#define ADC_ISC_IN1 0x00000002 // Sample sequence 1 interrupt +#define ADC_ISC_IN0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_OSTAT register. +// +//***************************************************************************** +#define ADC_OSTAT_OV3 0x00000008 // Sample sequence 3 overflow +#define ADC_OSTAT_OV2 0x00000004 // Sample sequence 2 overflow +#define ADC_OSTAT_OV1 0x00000002 // Sample sequence 1 overflow +#define ADC_OSTAT_OV0 0x00000001 // Sample sequence 0 overflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_EMUX register. +// +//***************************************************************************** +#define ADC_EMUX_EM3_MASK 0x0000F000 // Event mux 3 mask +#define ADC_EMUX_EM3_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM3_COMP0 0x00001000 // Analog comparator 0 event +#define ADC_EMUX_EM3_COMP1 0x00002000 // Analog comparator 1 event +#define ADC_EMUX_EM3_COMP2 0x00003000 // Analog comparator 2 event +#define ADC_EMUX_EM3_EXTERNAL 0x00004000 // External event +#define ADC_EMUX_EM3_TIMER 0x00005000 // Timer event +#define ADC_EMUX_EM3_PWM0 0x00006000 // PWM0 event +#define ADC_EMUX_EM3_PWM1 0x00007000 // PWM1 event +#define ADC_EMUX_EM3_PWM2 0x00008000 // PWM2 event +#define ADC_EMUX_EM3_ALWAYS 0x0000F000 // Always event +#define ADC_EMUX_EM2_MASK 0x00000F00 // Event mux 2 mask +#define ADC_EMUX_EM2_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM2_COMP0 0x00000100 // Analog comparator 0 event +#define ADC_EMUX_EM2_COMP1 0x00000200 // Analog comparator 1 event +#define ADC_EMUX_EM2_COMP2 0x00000300 // Analog comparator 2 event +#define ADC_EMUX_EM2_EXTERNAL 0x00000400 // External event +#define ADC_EMUX_EM2_TIMER 0x00000500 // Timer event +#define ADC_EMUX_EM2_PWM0 0x00000600 // PWM0 event +#define ADC_EMUX_EM2_PWM1 0x00000700 // PWM1 event +#define ADC_EMUX_EM2_PWM2 0x00000800 // PWM2 event +#define ADC_EMUX_EM2_ALWAYS 0x00000F00 // Always event +#define ADC_EMUX_EM1_MASK 0x000000F0 // Event mux 1 mask +#define ADC_EMUX_EM1_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM1_COMP0 0x00000010 // Analog comparator 0 event +#define ADC_EMUX_EM1_COMP1 0x00000020 // Analog comparator 1 event +#define ADC_EMUX_EM1_COMP2 0x00000030 // Analog comparator 2 event +#define ADC_EMUX_EM1_EXTERNAL 0x00000040 // External event +#define ADC_EMUX_EM1_TIMER 0x00000050 // Timer event +#define ADC_EMUX_EM1_PWM0 0x00000060 // PWM0 event +#define ADC_EMUX_EM1_PWM1 0x00000070 // PWM1 event +#define ADC_EMUX_EM1_PWM2 0x00000080 // PWM2 event +#define ADC_EMUX_EM1_ALWAYS 0x000000F0 // Always event +#define ADC_EMUX_EM0_MASK 0x0000000F // Event mux 0 mask +#define ADC_EMUX_EM0_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM0_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_EMUX_EM0_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_EMUX_EM0_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_EMUX_EM0_EXTERNAL 0x00000004 // External event +#define ADC_EMUX_EM0_TIMER 0x00000005 // Timer event +#define ADC_EMUX_EM0_PWM0 0x00000006 // PWM0 event +#define ADC_EMUX_EM0_PWM1 0x00000007 // PWM1 event +#define ADC_EMUX_EM0_PWM2 0x00000008 // PWM2 event +#define ADC_EMUX_EM0_ALWAYS 0x0000000F // Always event +#define ADC_EMUX_EM0_SHIFT 0 // The shift for the first event +#define ADC_EMUX_EM1_SHIFT 4 // The shift for the second event +#define ADC_EMUX_EM2_SHIFT 8 // The shift for the third event +#define ADC_EMUX_EM3_SHIFT 12 // The shift for the fourth event + +//***************************************************************************** +// +// The following define the bit fields in the ADC_USTAT register. +// +//***************************************************************************** +#define ADC_USTAT_UV3 0x00000008 // Sample sequence 3 underflow +#define ADC_USTAT_UV2 0x00000004 // Sample sequence 2 underflow +#define ADC_USTAT_UV1 0x00000002 // Sample sequence 1 underflow +#define ADC_USTAT_UV0 0x00000001 // Sample sequence 0 underflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSPRI register. +// +//***************************************************************************** +#define ADC_SSPRI_SS3_MASK 0x00003000 // Sequencer 3 priority mask +#define ADC_SSPRI_SS3_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS3_2ND 0x00001000 // Second priority +#define ADC_SSPRI_SS3_3RD 0x00002000 // Third priority +#define ADC_SSPRI_SS3_4TH 0x00003000 // Fourth priority +#define ADC_SSPRI_SS2_MASK 0x00000300 // Sequencer 2 priority mask +#define ADC_SSPRI_SS2_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS2_2ND 0x00000100 // Second priority +#define ADC_SSPRI_SS2_3RD 0x00000200 // Third priority +#define ADC_SSPRI_SS2_4TH 0x00000300 // Fourth priority +#define ADC_SSPRI_SS1_MASK 0x00000030 // Sequencer 1 priority mask +#define ADC_SSPRI_SS1_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS1_2ND 0x00000010 // Second priority +#define ADC_SSPRI_SS1_3RD 0x00000020 // Third priority +#define ADC_SSPRI_SS1_4TH 0x00000030 // Fourth priority +#define ADC_SSPRI_SS0_MASK 0x00000003 // Sequencer 0 priority mask +#define ADC_SSPRI_SS0_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS0_2ND 0x00000001 // Second priority +#define ADC_SSPRI_SS0_3RD 0x00000002 // Third priority +#define ADC_SSPRI_SS0_4TH 0x00000003 // Fourth priority + +//***************************************************************************** +// +// The following define the bit fields in the ADC_PSSI register. +// +//***************************************************************************** +#define ADC_PSSI_SS3 0x00000008 // Trigger sample sequencer 3 +#define ADC_PSSI_SS2 0x00000004 // Trigger sample sequencer 2 +#define ADC_PSSI_SS1 0x00000002 // Trigger sample sequencer 1 +#define ADC_PSSI_SS0 0x00000001 // Trigger sample sequencer 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SAC register. +// +//***************************************************************************** +#define ADC_SAC_AVG_OFF 0x00000000 // No hardware oversampling +#define ADC_SAC_AVG_2X 0x00000001 // 2x hardware oversampling +#define ADC_SAC_AVG_4X 0x00000002 // 4x hardware oversampling +#define ADC_SAC_AVG_8X 0x00000003 // 8x hardware oversampling +#define ADC_SAC_AVG_16X 0x00000004 // 16x hardware oversampling +#define ADC_SAC_AVG_32X 0x00000005 // 32x hardware oversampling +#define ADC_SAC_AVG_64X 0x00000006 // 64x hardware oversampling + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSMUX0, ADC_SSMUX1, +// ADC_SSMUX2, and ADC_SSMUX3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSMUX_MUX7_MASK 0x70000000 // 8th mux select mask +#define ADC_SSMUX_MUX6_MASK 0x07000000 // 7th mux select mask +#define ADC_SSMUX_MUX5_MASK 0x00700000 // 6th mux select mask +#define ADC_SSMUX_MUX4_MASK 0x00070000 // 5th mux select mask +#define ADC_SSMUX_MUX3_MASK 0x00007000 // 4th mux select mask +#define ADC_SSMUX_MUX2_MASK 0x00000700 // 3rd mux select mask +#define ADC_SSMUX_MUX1_MASK 0x00000070 // 2nd mux select mask +#define ADC_SSMUX_MUX0_MASK 0x00000007 // 1st mux select mask +#define ADC_SSMUX_MUX7_SHIFT 28 +#define ADC_SSMUX_MUX6_SHIFT 24 +#define ADC_SSMUX_MUX5_SHIFT 20 +#define ADC_SSMUX_MUX4_SHIFT 16 +#define ADC_SSMUX_MUX3_SHIFT 12 +#define ADC_SSMUX_MUX2_SHIFT 8 +#define ADC_SSMUX_MUX1_SHIFT 4 +#define ADC_SSMUX_MUX0_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSCTL0, ADC_SSCTL1, +// ADC_SSCTL2, and ADC_SSCTL3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSCTL_TS7 0x80000000 // 8th temperature sensor select +#define ADC_SSCTL_IE7 0x40000000 // 8th interrupt enable +#define ADC_SSCTL_END7 0x20000000 // 8th sequence end select +#define ADC_SSCTL_D7 0x10000000 // 8th differential select +#define ADC_SSCTL_TS6 0x08000000 // 7th temperature sensor select +#define ADC_SSCTL_IE6 0x04000000 // 7th interrupt enable +#define ADC_SSCTL_END6 0x02000000 // 7th sequence end select +#define ADC_SSCTL_D6 0x01000000 // 7th differential select +#define ADC_SSCTL_TS5 0x00800000 // 6th temperature sensor select +#define ADC_SSCTL_IE5 0x00400000 // 6th interrupt enable +#define ADC_SSCTL_END5 0x00200000 // 6th sequence end select +#define ADC_SSCTL_D5 0x00100000 // 6th differential select +#define ADC_SSCTL_TS4 0x00080000 // 5th temperature sensor select +#define ADC_SSCTL_IE4 0x00040000 // 5th interrupt enable +#define ADC_SSCTL_END4 0x00020000 // 5th sequence end select +#define ADC_SSCTL_D4 0x00010000 // 5th differential select +#define ADC_SSCTL_TS3 0x00008000 // 4th temperature sensor select +#define ADC_SSCTL_IE3 0x00004000 // 4th interrupt enable +#define ADC_SSCTL_END3 0x00002000 // 4th sequence end select +#define ADC_SSCTL_D3 0x00001000 // 4th differential select +#define ADC_SSCTL_TS2 0x00000800 // 3rd temperature sensor select +#define ADC_SSCTL_IE2 0x00000400 // 3rd interrupt enable +#define ADC_SSCTL_END2 0x00000200 // 3rd sequence end select +#define ADC_SSCTL_D2 0x00000100 // 3rd differential select +#define ADC_SSCTL_TS1 0x00000080 // 2nd temperature sensor select +#define ADC_SSCTL_IE1 0x00000040 // 2nd interrupt enable +#define ADC_SSCTL_END1 0x00000020 // 2nd sequence end select +#define ADC_SSCTL_D1 0x00000010 // 2nd differential select +#define ADC_SSCTL_TS0 0x00000008 // 1st temperature sensor select +#define ADC_SSCTL_IE0 0x00000004 // 1st interrupt enable +#define ADC_SSCTL_END0 0x00000002 // 1st sequence end select +#define ADC_SSCTL_D0 0x00000001 // 1st differential select + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFIFO0, ADC_SSFIFO1, +// ADC_SSFIFO2, and ADC_SSFIFO3 registers. +// +//***************************************************************************** +#define ADC_SSFIFO_DATA_MASK 0x000003FF // Sample data +#define ADC_SSFIFO_DATA_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFSTAT0, ADC_SSFSTAT1, +// ADC_SSFSTAT2, and ADC_SSFSTAT3 registers. +// +//***************************************************************************** +#define ADC_SSFSTAT_FULL 0x00001000 // FIFO is full +#define ADC_SSFSTAT_EMPTY 0x00000100 // FIFO is empty +#define ADC_SSFSTAT_HPTR 0x000000F0 // FIFO head pointer +#define ADC_SSFSTAT_TPTR 0x0000000F // FIFO tail pointer + +//***************************************************************************** +// +// The following define the bit fields in the ADC_TMLB register. +// +//***************************************************************************** +#define ADC_TMLB_LB 0x00000001 // Loopback control signals + +//***************************************************************************** +// +// The following define the bit fields in the loopback ADC data. +// +//***************************************************************************** +#define ADC_LB_CNT_MASK 0x000003C0 // Sample counter mask +#define ADC_LB_CONT 0x00000020 // Continuation sample +#define ADC_LB_DIFF 0x00000010 // Differential sample +#define ADC_LB_TS 0x00000008 // Temperature sensor sample +#define ADC_LB_MUX_MASK 0x00000007 // Input channel number mask +#define ADC_LB_CNT_SHIFT 6 // Sample counter shift +#define ADC_LB_MUX_SHIFT 0 // Input channel number shift + +#endif // __HW_ADC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_comp.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_comp.h new file mode 100644 index 0000000..991b7a0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_comp.h @@ -0,0 +1,118 @@ +//***************************************************************************** +// +// hw_comp.h - Macros used when accessing the comparator hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_COMP_H__ +#define __HW_COMP_H__ + +//***************************************************************************** +// +// The following define the offsets of the comparator registers. +// +//***************************************************************************** +#define COMP_O_MIS 0x00000000 // Interrupt status register +#define COMP_O_RIS 0x00000004 // Raw interrupt status register +#define COMP_O_INTEN 0x00000008 // Interrupt enable register +#define COMP_O_REFCTL 0x00000010 // Reference voltage control reg. +#define COMP_O_ACSTAT0 0x00000020 // Comp0 status register +#define COMP_O_ACCTL0 0x00000024 // Comp0 control register +#define COMP_O_ACSTAT1 0x00000040 // Comp1 status register +#define COMP_O_ACCTL1 0x00000044 // Comp1 control register +#define COMP_O_ACSTAT2 0x00000060 // Comp2 status register +#define COMP_O_ACCTL2 0x00000064 // Comp2 control register + +//***************************************************************************** +// +// The following define the bit fields in the COMP_MIS, COMP_RIS, and +// COMP_INTEN registers. +// +//***************************************************************************** +#define COMP_INT_2 0x00000004 // Comp2 interrupt +#define COMP_INT_1 0x00000002 // Comp1 interrupt +#define COMP_INT_0 0x00000001 // Comp0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the COMP_REFCTL register. +// +//***************************************************************************** +#define COMP_REFCTL_EN 0x00000200 // Reference voltage enable +#define COMP_REFCTL_RNG 0x00000100 // Reference voltage range +#define COMP_REFCTL_VREF_MASK 0x0000000F // Reference voltage select mask +#define COMP_REFCTL_VREF_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACSTAT0, COMP_ACSTAT1, and +// COMP_ACSTAT2 registers. +// +//***************************************************************************** +#define COMP_ACSTAT_OVAL 0x00000002 // Comparator output value + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACCTL0, COMP_ACCTL1, and +// COMP_ACCTL2 registers. +// +//***************************************************************************** +#define COMP_ACCTL_TMASK 0x00000800 // Trigger enable +#define COMP_ACCTL_ASRCP_MASK 0x00000600 // Vin+ source select mask +#define COMP_ACCTL_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ACCTL_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ACCTL_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_ACCTL_ASRCP_RES 0x00000600 // Reserved +#define COMP_ACCTL_OEN 0x00000100 // Comparator output enable +#define COMP_ACCTL_TSVAL 0x00000080 // Trigger polarity select +#define COMP_ACCTL_TSEN_MASK 0x00000060 // Trigger sense mask +#define COMP_ACCTL_TSEN_LEVEL 0x00000000 // Trigger is level sense +#define COMP_ACCTL_TSEN_FALL 0x00000020 // Trigger is falling edge +#define COMP_ACCTL_TSEN_RISE 0x00000040 // Trigger is rising edge +#define COMP_ACCTL_TSEN_BOTH 0x00000060 // Trigger is both edges +#define COMP_ACCTL_ISLVAL 0x00000010 // Interrupt polarity select +#define COMP_ACCTL_ISEN_MASK 0x0000000C // Interrupt sense mask +#define COMP_ACCTL_ISEN_LEVEL 0x00000000 // Interrupt is level sense +#define COMP_ACCTL_ISEN_FALL 0x00000004 // Interrupt is falling edge +#define COMP_ACCTL_ISEN_RISE 0x00000008 // Interrupt is rising edge +#define COMP_ACCTL_ISEN_BOTH 0x0000000C // Interrupt is both edges +#define COMP_ACCTL_CINV 0x00000002 // Comparator output invert + +//***************************************************************************** +// +// The following define the reset values for the comparator registers. +// +//***************************************************************************** +#define COMP_RV_MIS 0x00000000 // Interrupt status register +#define COMP_RV_RIS 0x00000000 // Raw interrupt status register +#define COMP_RV_INTEN 0x00000000 // Interrupt enable register +#define COMP_RV_REFCTL 0x00000000 // Reference voltage control reg. +#define COMP_RV_ACSTAT0 0x00000000 // Comp0 status register +#define COMP_RV_ACCTL0 0x00000000 // Comp0 control register +#define COMP_RV_ACSTAT1 0x00000000 // Comp1 status register +#define COMP_RV_ACCTL1 0x00000000 // Comp1 control register +#define COMP_RV_ACSTAT2 0x00000000 // Comp2 status register +#define COMP_RV_ACCTL2 0x00000000 // Comp2 control register + +#endif // __HW_COMP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_flash.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_flash.h new file mode 100644 index 0000000..53128b4 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_flash.h @@ -0,0 +1,139 @@ +//***************************************************************************** +// +// hw_flash.h - Macros used when accessing the flash controller. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_FLASH_H__ +#define __HW_FLASH_H__ + +//***************************************************************************** +// +// The following define the offsets of the FLASH registers. +// +//***************************************************************************** +#define FLASH_FMA 0x400FD000 // Memory address register +#define FLASH_FMD 0x400FD004 // Memory data register +#define FLASH_FMC 0x400FD008 // Memory control register +#define FLASH_FCRIS 0x400FD00c // Raw interrupt status register +#define FLASH_FCIM 0x400FD010 // Interrupt mask register +#define FLASH_FCMISC 0x400FD014 // Interrupt status register +#define FLASH_FMPRE 0x400FE130 // FLASH read protect register +#define FLASH_FMPPE 0x400FE134 // FLASH program protect register +#define FLASH_USECRL 0x400FE140 // uSec reload register + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMC register. +// +//***************************************************************************** +#define FLASH_FMC_WRKEY_MASK 0xFFFF0000 // FLASH write key mask +#define FLASH_FMC_WRKEY 0xA4420000 // FLASH write key +#define FLASH_FMC_COMT 0x00000008 // Commit user register +#define FLASH_FMC_MERASE 0x00000004 // Mass erase FLASH +#define FLASH_FMC_ERASE 0x00000002 // Erase FLASH page +#define FLASH_FMC_WRITE 0x00000001 // Write FLASH word + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCRIS register. +// +//***************************************************************************** +#define FLASH_FCRIS_PROGRAM 0x00000002 // Programming status +#define FLASH_FCRIS_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCIM register. +// +//***************************************************************************** +#define FLASH_FCIM_PROGRAM 0x00000002 // Programming mask +#define FLASH_FCIM_ACCESS 0x00000001 // Invalid access mask + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMIS register. +// +//***************************************************************************** +#define FLASH_FCMISC_PROGRAM 0x00000002 // Programming status +#define FLASH_FCMISC_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMPRE and FLASH_FMPPE +// registers. +// +//***************************************************************************** +#define FLASH_FMP_BLOCK_31 0x80000000 // Enable for block 31 +#define FLASH_FMP_BLOCK_30 0x40000000 // Enable for block 30 +#define FLASH_FMP_BLOCK_29 0x20000000 // Enable for block 29 +#define FLASH_FMP_BLOCK_28 0x10000000 // Enable for block 28 +#define FLASH_FMP_BLOCK_27 0x08000000 // Enable for block 27 +#define FLASH_FMP_BLOCK_26 0x04000000 // Enable for block 26 +#define FLASH_FMP_BLOCK_25 0x02000000 // Enable for block 25 +#define FLASH_FMP_BLOCK_24 0x01000000 // Enable for block 24 +#define FLASH_FMP_BLOCK_23 0x00800000 // Enable for block 23 +#define FLASH_FMP_BLOCK_22 0x00400000 // Enable for block 22 +#define FLASH_FMP_BLOCK_21 0x00200000 // Enable for block 21 +#define FLASH_FMP_BLOCK_20 0x00100000 // Enable for block 20 +#define FLASH_FMP_BLOCK_19 0x00080000 // Enable for block 19 +#define FLASH_FMP_BLOCK_18 0x00040000 // Enable for block 18 +#define FLASH_FMP_BLOCK_17 0x00020000 // Enable for block 17 +#define FLASH_FMP_BLOCK_16 0x00010000 // Enable for block 16 +#define FLASH_FMP_BLOCK_15 0x00008000 // Enable for block 15 +#define FLASH_FMP_BLOCK_14 0x00004000 // Enable for block 14 +#define FLASH_FMP_BLOCK_13 0x00002000 // Enable for block 13 +#define FLASH_FMP_BLOCK_12 0x00001000 // Enable for block 12 +#define FLASH_FMP_BLOCK_11 0x00000800 // Enable for block 11 +#define FLASH_FMP_BLOCK_10 0x00000400 // Enable for block 10 +#define FLASH_FMP_BLOCK_9 0x00000200 // Enable for block 9 +#define FLASH_FMP_BLOCK_8 0x00000100 // Enable for block 8 +#define FLASH_FMP_BLOCK_7 0x00000080 // Enable for block 7 +#define FLASH_FMP_BLOCK_6 0x00000040 // Enable for block 6 +#define FLASH_FMP_BLOCK_5 0x00000020 // Enable for block 5 +#define FLASH_FMP_BLOCK_4 0x00000010 // Enable for block 4 +#define FLASH_FMP_BLOCK_3 0x00000008 // Enable for block 3 +#define FLASH_FMP_BLOCK_2 0x00000004 // Enable for block 2 +#define FLASH_FMP_BLOCK_1 0x00000002 // Enable for block 1 +#define FLASH_FMP_BLOCK_0 0x00000001 // Enable for block 0 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_USECRL register. +// +//***************************************************************************** +#define FLASH_USECRL_MASK 0x000000FF // Clock per uSec +#define FLASH_USECRL_SHIFT 0 + +//***************************************************************************** +// +// The erase size is the size of the FLASH block that is erased by an erase +// operation, and the protect size is the size of the FLASH block that is +// protected by each protection register. +// +//***************************************************************************** +#define FLASH_ERASE_SIZE 0x00000400 +#define FLASH_PROTECT_SIZE 0x00000800 + +#endif // __HW_FLASH_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_gpio.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_gpio.h new file mode 100644 index 0000000..bf25d3f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_gpio.h @@ -0,0 +1,103 @@ +//***************************************************************************** +// +// hw_gpio.h - Defines and Macros for GPIO hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_GPIO_H__ +#define __HW_GPIO_H__ + +//***************************************************************************** +// +// GPIO Register Offsets. +// +//***************************************************************************** +#define GPIO_O_DATA 0x00000000 // Data register. +#define GPIO_O_DIR 0x00000400 // Data direction register. +#define GPIO_O_IS 0x00000404 // Interrupt sense register. +#define GPIO_O_IBE 0x00000408 // Interrupt both edges register. +#define GPIO_O_IEV 0x0000040C // Intterupt event register. +#define GPIO_O_IM 0x00000410 // Interrupt mask register. +#define GPIO_O_RIS 0x00000414 // Raw interrupt status register. +#define GPIO_O_MIS 0x00000418 // Masked interrupt status reg. +#define GPIO_O_ICR 0x0000041C // Interrupt clear register. +#define GPIO_O_AFSEL 0x00000420 // Mode control select register. +#define GPIO_O_DR2R 0x00000500 // 2ma drive select register. +#define GPIO_O_DR4R 0x00000504 // 4ma drive select register. +#define GPIO_O_DR8R 0x00000508 // 8ma drive select register. +#define GPIO_O_ODR 0x0000050C // Open drain select register. +#define GPIO_O_PUR 0x00000510 // Pull up select register. +#define GPIO_O_PDR 0x00000514 // Pull down select register. +#define GPIO_O_SLR 0x00000518 // Slew rate control enable reg. +#define GPIO_O_DEN 0x0000051C // Digital input enable register. +#define GPIO_O_PeriphID4 0x00000FD0 // +#define GPIO_O_PeriphID5 0x00000FD4 // +#define GPIO_O_PeriphID6 0x00000FD8 // +#define GPIO_O_PeriphID7 0x00000FDC // +#define GPIO_O_PeriphID0 0x00000FE0 // +#define GPIO_O_PeriphID1 0x00000FE4 // +#define GPIO_O_PeriphID2 0x00000FE8 // +#define GPIO_O_PeriphID3 0x00000FEC // +#define GPIO_O_PCellID0 0x00000FF0 // +#define GPIO_O_PCellID1 0x00000FF4 // +#define GPIO_O_PCellID2 0x00000FF8 // +#define GPIO_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// GPIO Register reset values. +// +//***************************************************************************** +#define GPIO_RV_DATA 0x00000000 // Data register reset value. +#define GPIO_RV_DIR 0x00000000 // Data direction reg RV. +#define GPIO_RV_IS 0x00000000 // Interrupt sense reg RV. +#define GPIO_RV_IBE 0x00000000 // Interrupt both edges reg RV. +#define GPIO_RV_IEV 0x00000000 // Intterupt event reg RV. +#define GPIO_RV_IM 0x00000000 // Interrupt mask reg RV. +#define GPIO_RV_RIS 0x00000000 // Raw interrupt status reg RV. +#define GPIO_RV_MIS 0x00000000 // Masked interrupt status reg RV. +#define GPIO_RV_IC 0x00000000 // Interrupt clear reg RV. +#define GPIO_RV_AFSEL 0x00000000 // Mode control select reg RV. +#define GPIO_RV_DR2R 0x000000FF // 2ma drive select reg RV. +#define GPIO_RV_DR4R 0x00000000 // 4ma drive select reg RV. +#define GPIO_RV_DR8R 0x00000000 // 8ma drive select reg RV. +#define GPIO_RV_ODR 0x00000000 // Open drain select reg RV. +#define GPIO_RV_PUR 0x000000FF // Pull up select reg RV. +#define GPIO_RV_PDR 0x00000000 // Pull down select reg RV. +#define GPIO_RV_SLR 0x00000000 // Slew rate control enable reg RV. +#define GPIO_RV_DEN 0x000000FF // Digital input enable reg RV. +#define GPIO_RV_PeriphID4 0x00000000 // +#define GPIO_RV_PeriphID5 0x00000000 // +#define GPIO_RV_PeriphID6 0x00000000 // +#define GPIO_RV_PeriphID7 0x00000000 // +#define GPIO_RV_PeriphID0 0x00000061 // +#define GPIO_RV_PeriphID1 0x00000010 // +#define GPIO_RV_PeriphID2 0x00000004 // +#define GPIO_RV_PeriphID3 0x00000000 // +#define GPIO_RV_PCellID0 0x0000000D // +#define GPIO_RV_PCellID1 0x000000F0 // +#define GPIO_RV_PCellID2 0x00000005 // +#define GPIO_RV_PCellID3 0x000000B1 // + +#endif // __HW_GPIO_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_i2c.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_i2c.h new file mode 100644 index 0000000..2c9f46d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_i2c.h @@ -0,0 +1,197 @@ +//***************************************************************************** +// +// hw_i2c.h - Macros used when accessing the I2C master and slave hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_I2C_H__ +#define __HW_I2C_H__ + +//***************************************************************************** +// +// The following defines the offset between the I2C master and slave registers. +// +//***************************************************************************** +#define I2C_O_SLAVE 0x00000800 // Offset from master to slave + +//***************************************************************************** +// +// The following define the offsets of the I2C master registers. +// +//***************************************************************************** +#define I2C_MASTER_O_SA 0x00000000 // Slave address register +#define I2C_MASTER_O_CS 0x00000004 // Control and Status register +#define I2C_MASTER_O_DR 0x00000008 // Data register +#define I2C_MASTER_O_TPR 0x0000000C // Timer period register +#define I2C_MASTER_O_IMR 0x00000010 // Interrupt mask register +#define I2C_MASTER_O_RIS 0x00000014 // Raw interrupt status register +#define I2C_MASTER_O_MIS 0x00000018 // Masked interrupt status reg +#define I2C_MASTER_O_MICR 0x0000001c // Interrupt clear register +#define I2C_MASTER_O_CR 0x00000020 // Configuration register + +//***************************************************************************** +// +// The following define the offsets of the I2C slave registers. +// +//***************************************************************************** +#define I2C_SLAVE_O_OAR 0x00000000 // Own address register +#define I2C_SLAVE_O_CSR 0x00000004 // Control/Status register +#define I2C_SLAVE_O_DR 0x00000008 // Data register +#define I2C_SLAVE_O_IM 0x0000000C // Interrupt mask register +#define I2C_SLAVE_O_RIS 0x00000010 // Raw interrupt status register +#define I2C_SLAVE_O_MIS 0x00000014 // Masked interrupt status reg +#define I2C_SLAVE_O_SICR 0x00000018 // Interrupt clear register + +//***************************************************************************** +// +// The followng define the bit fields in the I2C master slave address register. +// +//***************************************************************************** +#define I2C_MASTER_SA_SA_MASK 0x000000FE // Slave address +#define I2C_MASTER_SA_RS 0x00000001 // Receive/send +#define I2C_MASTER_SA_SA_SHIFT 1 + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Control and Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_CS_ACK 0x00000008 // Acknowlegde +#define I2C_MASTER_CS_STOP 0x00000004 // Stop +#define I2C_MASTER_CS_START 0x00000002 // Start +#define I2C_MASTER_CS_RUN 0x00000001 // Run +#define I2C_MASTER_CS_BUS_BUSY 0x00000040 // Bus busy +#define I2C_MASTER_CS_IDLE 0x00000020 // Idle +#define I2C_MASTER_CS_ARB_LOST 0x00000010 // Lost arbitration +#define I2C_MASTER_CS_DATA_ACK 0x00000008 // Data byte not acknowledged +#define I2C_MASTER_CS_ADDR_ACK 0x00000004 // Address byte not acknowledged +#define I2C_MASTER_CS_ERROR 0x00000002 // Error occurred +#define I2C_MASTER_CS_BUSY 0x00000001 // Controller is TX/RX data +#define I2C_MASTER_CS_ERR_MASK 0x0000001C + +//***************************************************************************** +// +// The following define values used in determining the contents of the I2C +// Master Timer Period register. +// +//***************************************************************************** +#define I2C_MASTER_TPR_SCL_HP 0x00000004 // SCL high period +#define I2C_MASTER_TPR_SCL_LP 0x00000006 // SCL low period +#define I2C_MASTER_TPR_SCL (I2C_MASTER_TPR_SCL_HP + I2C_MASTER_TPR_SCL_LP) +#define I2C_SCL_STANDARD 100000 // SCL standard frequency +#define I2C_SCL_FAST 400000 // SCL fast frequency + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_MASTER_IMR_IM 0x00000001 // Master interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_RIS_RIS 0x00000001 // Master raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_MASTER_MIS_MIS 0x00000001 // Master masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_MASTER_MICR_IC 0x00000001 // Master interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Configuration +// register. +// +//***************************************************************************** +#define I2C_MASTER_CR_SFE 0x00000020 // Slave function enable +#define I2C_MASTER_CR_MFE 0x00000010 // Master function enable +#define I2C_MASTER_CR_LPBK 0x00000001 // Loopback enable + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Own Address register. +// +//***************************************************************************** +#define I2C_SLAVE_SOAR_OAR_MASK 0x0000007F // Slave address + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Control/Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_CSR_DA 0x00000001 // Enable the device +#define I2C_SLAVE_CSR_TREQ 0x00000002 // Transmit request received +#define I2C_SLAVE_CSR_RREQ 0x00000001 // Receive data from I2C master + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_SLAVE_IMR_IM 0x00000001 // Slave interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_RIS_RIS 0x00000001 // Slave raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_SLAVE_MIS_MIS 0x00000001 // Slave masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_SLAVE_SICR_IC 0x00000001 // Slave interrupt clear + +#endif // __HW_I2C_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_ints.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_ints.h new file mode 100644 index 0000000..2204a2c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_ints.h @@ -0,0 +1,97 @@ +//***************************************************************************** +// +// hw_ints.h - Macros that define the interrupt assignment on Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_INTS_H__ +#define __HW_INTS_H__ + +//***************************************************************************** +// +// The following define the fault assignments. +// +//***************************************************************************** +#define FAULT_NMI 2 // NMI fault +#define FAULT_HARD 3 // Hard fault +#define FAULT_MPU 4 // MPU fault +#define FAULT_BUS 5 // Bus fault +#define FAULT_USAGE 6 // Usage fault +#define FAULT_SVCALL 11 // SVCall +#define FAULT_DEBUG 12 // Debug monitor +#define FAULT_PENDSV 14 // PendSV +#define FAULT_SYSTICK 15 // System Tick + +//***************************************************************************** +// +// The following define the interrupt assignments. +// +//***************************************************************************** +#define INT_GPIOA 16 // GPIO Port A +#define INT_GPIOB 17 // GPIO Port B +#define INT_GPIOC 18 // GPIO Port C +#define INT_GPIOD 19 // GPIO Port D +#define INT_GPIOE 20 // GPIO Port E +#define INT_UART0 21 // UART0 Rx and Tx +#define INT_UART1 22 // UART1 Rx and Tx +#define INT_SSI 23 // SSI Rx and Tx +#define INT_I2C 24 // I2C Master and Slave +#define INT_PWM_FAULT 25 // PWM Fault +#define INT_PWM0 26 // PWM Generator 0 +#define INT_PWM1 27 // PWM Generator 1 +#define INT_PWM2 28 // PWM Generator 2 +#define INT_QEI 29 // Quadrature Encoder +#define INT_ADC0 30 // ADC Sequence 0 +#define INT_ADC1 31 // ADC Sequence 1 +#define INT_ADC2 32 // ADC Sequence 2 +#define INT_ADC3 33 // ADC Sequence 3 +#define INT_WATCHDOG 34 // Watchdog timer +#define INT_TIMER0A 35 // Timer 0 subtimer A +#define INT_TIMER0B 36 // Timer 0 subtimer B +#define INT_TIMER1A 37 // Timer 1 subtimer A +#define INT_TIMER1B 38 // Timer 1 subtimer B +#define INT_TIMER2A 39 // Timer 2 subtimer A +#define INT_TIMER2B 40 // Timer 2 subtimer B +#define INT_COMP0 41 // Analog Comparator 0 +#define INT_COMP1 42 // Analog Comparator 1 +#define INT_COMP2 43 // Analog Comparator 2 +#define INT_SYSCTL 44 // System Control (PLL, OSC, BO) +#define INT_FLASH 45 // FLASH Control + +//***************************************************************************** +// +// The total number of interrupts. +// +//***************************************************************************** +#define NUM_INTERRUPTS 46 + +//***************************************************************************** +// +// The total number of priority levels. +// +//***************************************************************************** +#define NUM_PRIORITY 8 +#define NUM_PRIORITY_BITS 3 + +#endif // __HW_INTS_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_memmap.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_memmap.h new file mode 100644 index 0000000..2b11f35 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_memmap.h @@ -0,0 +1,64 @@ +//***************************************************************************** +// +// hw_memmap.h - Macros defining the memory map of Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_MEMMAP_H__ +#define __HW_MEMMAP_H__ + +//***************************************************************************** +// +// The following define the base address of the memories and peripherals. +// +//***************************************************************************** +#define FLASH_BASE 0x00000000 // FLASH memory +#define SRAM_BASE 0x20000000 // SRAM memory +#define WATCHDOG_BASE 0x40000000 // Watchdog +#define GPIO_PORTA_BASE 0x40004000 // GPIO Port A +#define GPIO_PORTB_BASE 0x40005000 // GPIO Port B +#define GPIO_PORTC_BASE 0x40006000 // GPIO Port C +#define GPIO_PORTD_BASE 0x40007000 // GPIO Port D +#define SSI_BASE 0x40008000 // SSI +#define UART0_BASE 0x4000C000 // UART0 +#define UART1_BASE 0x4000D000 // UART1 +#define I2C_MASTER_BASE 0x40020000 // I2C Master +#define I2C_SLAVE_BASE 0x40020800 // I2C Slave +#define GPIO_PORTE_BASE 0x40024000 // GPIO Port E +#define PWM_BASE 0x40028000 // PWM +#define QEI_BASE 0x4002C000 // QEI +#define TIMER0_BASE 0x40030000 // Timer0 +#define TIMER1_BASE 0x40031000 // Timer1 +#define TIMER2_BASE 0x40032000 // Timer2 +#define ADC_BASE 0x40038000 // ADC +#define COMP_BASE 0x4003C000 // Analog comparators +#define FLASH_CTRL_BASE 0x400FD000 // FLASH Controller +#define SYSCTL_BASE 0x400FE000 // System Control +#define ITM_BASE 0xE0000000 // Instrumentation Trace Macrocell +#define DWT_BASE 0xE0001000 // Data Watchpoint and Trace +#define FPB_BASE 0xE0002000 // FLASH Patch and Breakpoint +#define NVIC_BASE 0xE000E000 // Nested Vectored Interrupt Ctrl +#define TPIU_BASE 0xE0040000 // Trace Port Interface Unit + +#endif // __HW_MEMMAP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_nvic.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_nvic.h new file mode 100644 index 0000000..6598ef8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_nvic.h @@ -0,0 +1,830 @@ +//***************************************************************************** +// +// hw_nvic.h - Macros used when accessing the NVIC hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_NVIC_H__ +#define __HW_NVIC_H__ + +//***************************************************************************** +// +// The following define the addresses of the NVIC registers. +// +//***************************************************************************** +#define NVIC_INT_TYPE 0xE000E004 // Interrupt Controller Type Reg. +#define NVIC_ST_CTRL 0xE000E010 // SysTick Control and Status Reg. +#define NVIC_ST_RELOAD 0xE000E014 // SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 // SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C // SysTick Calibration Value Reg. +#define NVIC_EN0 0xE000E100 // IRQ 0 to 31 Set Enable Register +#define NVIC_DIS0 0xE000E180 // IRQ 0 to 31 Clear Enable Reg. +#define NVIC_PEND0 0xE000E200 // IRQ 0 to 31 Set Pending Register +#define NVIC_UNPEND0 0xE000E280 // IRQ 0 to 31 Clear Pending Reg. +#define NVIC_ACTIVE0 0xE000E300 // IRQ 0 to 31 Active Register +#define NVIC_PRI0 0xE000E400 // IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 // IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 // IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C // IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 // IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 // IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 // IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C // IRQ 28 to 31 Priority Register +#define NVIC_CPUID 0xE000ED00 // CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 // Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 // Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C // App. Int & Reset Control Reg. +#define NVIC_SYS_CTRL 0xE000ED10 // System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 // Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C // Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 // Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 // System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. +#define NVIC_HFAULT_STAT 0xE000ED2C // Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 // Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 // Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 // Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 // MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 // MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 // MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C // MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 // MPU Region Attribute & Size Reg. +#define NVIC_DBG_CTRL 0xE000EDF0 // Debug Control and Status Reg. +#define NVIC_DBG_XFER 0xE000EDF4 // Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 // Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC // Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 // Software Trigger Interrupt Reg. + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_TYPE register. +// +//***************************************************************************** +#define NVIC_INT_TYPE_LINES_M 0x0000001F // Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CTRL register. +// +//***************************************************************************** +#define NVIC_ST_CTRL_COUNT 0x00010000 // Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 // Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 // Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 // Counter mode + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_RELOAD register. +// +//***************************************************************************** +#define NVIC_ST_RELOAD_M 0x00FFFFFF // Counter load value +#define NVIC_ST_RELOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CURRENT register. +// +//***************************************************************************** +#define NVIC_ST_CURRENT_M 0x00FFFFFF // Counter current value +#define NVIC_ST_CURRENT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CAL register. +// +//***************************************************************************** +#define NVIC_ST_CAL_NOREF 0x80000000 // No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 // Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF // 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN0 register. +// +//***************************************************************************** +#define NVIC_EN0_INT31 0x80000000 // Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 // Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 // Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 // Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 // Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 // Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 // Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 // Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 // Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 // Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 // Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 // Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 // Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 // Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 // Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 // Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 // Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 // Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 // Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 // Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 // Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 // Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 // Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 // Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 // Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 // Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 // Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 // Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 // Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 // Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 // Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 // Interrupt 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS0 register. +// +//***************************************************************************** +#define NVIC_DIS0_INT31 0x80000000 // Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 // Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 // Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 // Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 // Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 // Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 // Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 // Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 // Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 // Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 // Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 // Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 // Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 // Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 // Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 // Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 // Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 // Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 // Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 // Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 // Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 // Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 // Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 // Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 // Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 // Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 // Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 // Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 // Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 // Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 // Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 // Interrupt 0 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND0 register. +// +//***************************************************************************** +#define NVIC_PEND0_INT31 0x80000000 // Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 // Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 // Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 // Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 // Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 // Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 // Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 // Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 // Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 // Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 // Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 // Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 // Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 // Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 // Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 // Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 // Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 // Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 // Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 // Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 // Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 // Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 // Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 // Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 // Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 // Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 // Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 // Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 // Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 // Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 // Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 // Interrupt 0 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND0 register. +// +//***************************************************************************** +#define NVIC_UNPEND0_INT31 0x80000000 // Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 // Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 // Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 // Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 // Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 // Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 // Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 // Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 // Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 // Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 // Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 // Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 // Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 // Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 // Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 // Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 // Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 // Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 // Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 // Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 // Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 // Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 // Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 // Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 // Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 // Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 // Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 // Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 // Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 // Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 // Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 // Interrupt 0 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE0 register. +// +//***************************************************************************** +#define NVIC_ACTIVE0_INT31 0x80000000 // Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 // Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 // Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 // Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 // Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 // Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 // Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 // Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 // Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 // Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 // Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 // Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 // Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 // Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 // Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 // Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 // Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 // Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 // Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 // Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 // Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 // Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 // Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 // Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 // Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 // Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 // Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 // Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 // Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 // Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 // Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 // Interrupt 0 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI0 register. +// +//***************************************************************************** +#define NVIC_PRI0_INT3_M 0xFF000000 // Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 // Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 // Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF // Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI1 register. +// +//***************************************************************************** +#define NVIC_PRI1_INT7_M 0xFF000000 // Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 // Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 // Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF // Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI2 register. +// +//***************************************************************************** +#define NVIC_PRI2_INT11_M 0xFF000000 // Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 // Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 // Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF // Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI3 register. +// +//***************************************************************************** +#define NVIC_PRI3_INT15_M 0xFF000000 // Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 // Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 // Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF // Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI4 register. +// +//***************************************************************************** +#define NVIC_PRI4_INT19_M 0xFF000000 // Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 // Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 // Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF // Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI5 register. +// +//***************************************************************************** +#define NVIC_PRI5_INT23_M 0xFF000000 // Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 // Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 // Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF // Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI6 register. +// +//***************************************************************************** +#define NVIC_PRI6_INT27_M 0xFF000000 // Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 // Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 // Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF // Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI7 register. +// +//***************************************************************************** +#define NVIC_PRI7_INT31_M 0xFF000000 // Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 // Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 // Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF // Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CPUID register. +// +//***************************************************************************** +#define NVIC_CPUID_IMP_M 0xFF000000 // Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 // Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 // Processor part number +#define NVIC_CPUID_REV_M 0x0000000F // Revision + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_CTRL register. +// +//***************************************************************************** +#define NVIC_INT_CTRL_NMI_SET 0x80000000 // Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 // Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 // Unpend a PendSV +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 // Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 // Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 // Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 // Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF // Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_VTABLE register. +// +//***************************************************************************** +#define NVIC_VTABLE_BASE 0x20000000 // Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 // Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_APINT register. +// +//***************************************************************************** +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 // Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 // Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 // Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 // Priority group +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 // Priority group 7.1 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 // Priority group 6.2 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 // Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 // Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 // Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 // Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 // Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 // Priority group 0.8 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 // System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 // Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 // System reset + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 // Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 // Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 // Sleep on ISR exit + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CFG_CTRL register. +// +//***************************************************************************** +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 // Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 // Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 // Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 // Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 // Thread state control + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI1 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI1_RES_M 0xFF000000 // Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 // Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 // Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF // Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI2 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 // Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF // Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI3 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 // Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 // Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 // Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF // Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_HND_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 // Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 // Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 // Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 // SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 // Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 // Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 // PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 // Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 // SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 // Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 // Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 // Mem manage is active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_STAT register. +// +//***************************************************************************** +#define NVIC_FAULT_STAT_DIV0 0x02000000 // Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 // Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 // No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 // Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 // Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 // Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 // Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 // Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 // Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 // Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 // Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 // MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 // Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 // Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 // Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 // Instruction access violation + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_HFAULT_STAT register. +// +//***************************************************************************** +#define NVIC_HFAULT_STAT_DBG 0x80000000 // Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 // Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 // Vector table read fault + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DEBUG_STAT register. +// +//***************************************************************************** +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 // EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 // Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 // DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 // Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 // Halt request + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MM_ADDR register. +// +//***************************************************************************** +#define NVIC_MM_ADDR_M 0xFFFFFFFF // Data fault address +#define NVIC_MM_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_ADDR register. +// +//***************************************************************************** +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF // Data bus fault address +#define NVIC_FAULT_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_STACK register. +// +//***************************************************************************** +#define NVIC_EXC_STACK_DEEP 0x00000001 // Exception stack + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_NUM register. +// +//***************************************************************************** +#define NVIC_EXC_NUM_M 0x000003FF // Exception number +#define NVIC_EXC_NUM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_COPRO register. +// +//***************************************************************************** +#define NVIC_COPRO_15_M 0xC0000000 // Coprocessor 15 access mask +#define NVIC_COPRO_15_DENIED 0x00000000 // Coprocessor 15 access denied +#define NVIC_COPRO_15_PRIV 0x40000000 // Coprocessor 15 privileged addess +#define NVIC_COPRO_15_FULL 0xC0000000 // Coprocessor 15 full access +#define NVIC_COPRO_14_M 0x30000000 // Coprocessor 14 access mask +#define NVIC_COPRO_14_DENIED 0x00000000 // Coprocessor 14 access denied +#define NVIC_COPRO_14_PRIV 0x10000000 // Coprocessor 14 privileged addess +#define NVIC_COPRO_14_FULL 0x30000000 // Coprocessor 14 full access +#define NVIC_COPRO_13_M 0x0C000000 // Coprocessor 13 access mask +#define NVIC_COPRO_13_DENIED 0x00000000 // Coprocessor 13 access denied +#define NVIC_COPRO_13_PRIV 0x04000000 // Coprocessor 13 privileged addess +#define NVIC_COPRO_13_FULL 0x0C000000 // Coprocessor 13 full access +#define NVIC_COPRO_12_M 0x03000000 // Coprocessor 12 access mask +#define NVIC_COPRO_12_DENIED 0x00000000 // Coprocessor 12 access denied +#define NVIC_COPRO_12_PRIV 0x01000000 // Coprocessor 12 privileged addess +#define NVIC_COPRO_12_FULL 0x03000000 // Coprocessor 12 full access +#define NVIC_COPRO_11_M 0x00C00000 // Coprocessor 11 access mask +#define NVIC_COPRO_11_DENIED 0x00000000 // Coprocessor 11 access denied +#define NVIC_COPRO_11_PRIV 0x00400000 // Coprocessor 11 privileged addess +#define NVIC_COPRO_11_FULL 0x00C00000 // Coprocessor 11 full access +#define NVIC_COPRO_10_M 0x00300000 // Coprocessor 10 access mask +#define NVIC_COPRO_10_DENIED 0x00000000 // Coprocessor 10 access denied +#define NVIC_COPRO_10_PRIV 0x00100000 // Coprocessor 10 privileged addess +#define NVIC_COPRO_10_FULL 0x00300000 // Coprocessor 10 full access +#define NVIC_COPRO_9_M 0x000C0000 // Coprocessor 9 access mask +#define NVIC_COPRO_9_DENIED 0x00000000 // Coprocessor 9 access denied +#define NVIC_COPRO_9_PRIV 0x00040000 // Coprocessor 9 privileged addess +#define NVIC_COPRO_9_FULL 0x000C0000 // Coprocessor 9 full access +#define NVIC_COPRO_8_M 0x00030000 // Coprocessor 8 access mask +#define NVIC_COPRO_8_DENIED 0x00000000 // Coprocessor 8 access denied +#define NVIC_COPRO_8_PRIV 0x00010000 // Coprocessor 8 privileged addess +#define NVIC_COPRO_8_FULL 0x00030000 // Coprocessor 8 full access +#define NVIC_COPRO_7_M 0x0000C000 // Coprocessor 7 access mask +#define NVIC_COPRO_7_DENIED 0x00000000 // Coprocessor 7 access denied +#define NVIC_COPRO_7_PRIV 0x00004000 // Coprocessor 7 privileged addess +#define NVIC_COPRO_7_FULL 0x0000C000 // Coprocessor 7 full access +#define NVIC_COPRO_6_M 0x00003000 // Coprocessor 6 access mask +#define NVIC_COPRO_6_DENIED 0x00000000 // Coprocessor 6 access denied +#define NVIC_COPRO_6_PRIV 0x00001000 // Coprocessor 6 privileged addess +#define NVIC_COPRO_6_FULL 0x00003000 // Coprocessor 6 full access +#define NVIC_COPRO_5_M 0x00000C00 // Coprocessor 5 access mask +#define NVIC_COPRO_5_DENIED 0x00000000 // Coprocessor 5 access denied +#define NVIC_COPRO_5_PRIV 0x00000400 // Coprocessor 5 privileged addess +#define NVIC_COPRO_5_FULL 0x00000C00 // Coprocessor 5 full access +#define NVIC_COPRO_4_M 0x00000300 // Coprocessor 4 access mask +#define NVIC_COPRO_4_DENIED 0x00000000 // Coprocessor 4 access denied +#define NVIC_COPRO_4_PRIV 0x00000100 // Coprocessor 4 privileged addess +#define NVIC_COPRO_4_FULL 0x00000300 // Coprocessor 4 full access +#define NVIC_COPRO_3_M 0x000000C0 // Coprocessor 3 access mask +#define NVIC_COPRO_3_DENIED 0x00000000 // Coprocessor 3 access denied +#define NVIC_COPRO_3_PRIV 0x00000040 // Coprocessor 3 privileged addess +#define NVIC_COPRO_3_FULL 0x000000C0 // Coprocessor 3 full access +#define NVIC_COPRO_2_M 0x00000030 // Coprocessor 2 access mask +#define NVIC_COPRO_2_DENIED 0x00000000 // Coprocessor 2 access denied +#define NVIC_COPRO_2_PRIV 0x00000010 // Coprocessor 2 privileged addess +#define NVIC_COPRO_2_FULL 0x00000030 // Coprocessor 2 full access +#define NVIC_COPRO_1_M 0x0000000C // Coprocessor 1 access mask +#define NVIC_COPRO_1_DENIED 0x00000000 // Coprocessor 1 access denied +#define NVIC_COPRO_1_PRIV 0x00000004 // Coprocessor 1 privileged addess +#define NVIC_COPRO_1_FULL 0x0000000C // Coprocessor 1 full access +#define NVIC_COPRO_0_M 0x00000003 // Coprocessor 0 access mask +#define NVIC_COPRO_0_DENIED 0x00000000 // Coprocessor 0 access denied +#define NVIC_COPRO_0_PRIV 0x00000001 // Coprocessor 0 privileged addess +#define NVIC_COPRO_0_FULL 0x00000003 // Coprocessor 0 full access + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_TYPE register. +// +//***************************************************************************** +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 // Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 // Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 // Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_CTRL register. +// +//***************************************************************************** +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 // MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 // MPU enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_NUMBER register. +// +//***************************************************************************** +#define NVIC_MPU_NUMBER_M 0x000000FF // MPU region to access +#define NVIC_MPU_NUMBER_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_BASE register. +// +//***************************************************************************** +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFF00 // Base address +#define NVIC_MPU_BASE_VALID 0x00000010 // Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F // Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_ATTR register. +// +//***************************************************************************** +#define NVIC_MPU_ATTR_ATTRS 0xFFFF0000 // Attributes +#define NVIC_MPU_ATTR_SRD 0x0000FF00 // Sub-region disable +#define NVIC_MPU_ATTR_SZENABLE 0x000000FF // Region size + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_CTRL register. +// +//***************************************************************************** +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 // Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 // Debug key +#define NVIC_DBG_CTRL_MON_PEND 0x00008000 // Pend the monitor +#define NVIC_DBG_CTRL_MON_REQ 0x00004000 // Monitor request +#define NVIC_DBG_CTRL_MON_EN 0x00002000 // Debug monitor enable +#define NVIC_DBG_CTRL_MONSTEP 0x00001000 // Monitor step the core +#define NVIC_DBG_CTRL_S_SLEEP 0x00000400 // Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00000200 // Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00000100 // Register read/write available +#define NVIC_DBG_CTRL_S_LOCKUP 0x00000080 // Core is locked up +#define NVIC_DBG_CTRL_C_RESET 0x00000010 // Reset the core +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 // Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 // Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 // Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 // Enable debug + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_XFER register. +// +//***************************************************************************** +#define NVIC_DBG_XFER_REG_WNR 0x00010000 // Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F // Register +#define NVIC_DBG_XFER_REG_R0 0x00000000 // Register R0 +#define NVIC_DBG_XFER_REG_R1 0x00000001 // Register R1 +#define NVIC_DBG_XFER_REG_R2 0x00000002 // Register R2 +#define NVIC_DBG_XFER_REG_R3 0x00000003 // Register R3 +#define NVIC_DBG_XFER_REG_R4 0x00000004 // Register R4 +#define NVIC_DBG_XFER_REG_R5 0x00000005 // Register R5 +#define NVIC_DBG_XFER_REG_R6 0x00000006 // Register R6 +#define NVIC_DBG_XFER_REG_R7 0x00000007 // Register R7 +#define NVIC_DBG_XFER_REG_R8 0x00000008 // Register R8 +#define NVIC_DBG_XFER_REG_R9 0x00000009 // Register R9 +#define NVIC_DBG_XFER_REG_R10 0x0000000A // Register R10 +#define NVIC_DBG_XFER_REG_R11 0x0000000B // Register R11 +#define NVIC_DBG_XFER_REG_R12 0x0000000C // Register R12 +#define NVIC_DBG_XFER_REG_R13 0x0000000D // Register R13 +#define NVIC_DBG_XFER_REG_R14 0x0000000E // Register R14 +#define NVIC_DBG_XFER_REG_R15 0x0000000F // Register R15 +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 // xPSR/Flags register +#define NVIC_DBG_XFER_REG_MSP 0x00000011 // Main SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 // Process SP +#define NVIC_DBG_XFER_REG_DSP 0x00000013 // Deep SP +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 // Control/Fault/BasePri/PriMask + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_DATA register. +// +//***************************************************************************** +#define NVIC_DBG_DATA_M 0xFFFFFFFF // Data temporary cache +#define NVIC_DBG_DATA_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_INT register. +// +//***************************************************************************** +#define NVIC_DBG_INT_HARDERR 0x00000400 // Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 // Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 // Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 // Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 // Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 // Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 // Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 // Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 // Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 // Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 // Reset vector catch + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SW_TRIG register. +// +//***************************************************************************** +#define NVIC_SW_TRIG_INTID_M 0x000003FF // Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 + +#endif // __HW_NVIC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_pwm.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_pwm.h new file mode 100644 index 0000000..cc42015 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_pwm.h @@ -0,0 +1,260 @@ +//***************************************************************************** +// +// hw_pwm.h - Defines and Macros for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_PWM_H__ +#define __HW_PWM_H__ + +//***************************************************************************** +// +// PWM Module Register Offsets. +// +//***************************************************************************** +#define PWM_O_CTL 0x00000000 // PWM Master Control register +#define PWM_O_SYNC 0x00000004 // PWM Time Base Sync register +#define PWM_O_ENABLE 0x00000008 // PWM Output Enable register +#define PWM_O_INVERT 0x0000000C // PWM Output Inversion register +#define PWM_O_FAULT 0x00000010 // PWM Output Fault register +#define PWM_O_INTEN 0x00000014 // PWM Interrupt Enable register +#define PWM_O_RIS 0x00000018 // PWM Interrupt Raw Status reg. +#define PWM_O_ISC 0x0000001C // PWM Interrupt Status register +#define PWM_O_STATUS 0x00000020 // PWM Status register + +//***************************************************************************** +// +// The following define the bit fields in the PWM Master Control register. +// +//***************************************************************************** +#define PWM_CTL_GLOBAL_SYNC2 0x00000004 // Global sync generator 2 +#define PWM_CTL_GLOBAL_SYNC1 0x00000002 // Global sync generator 1 +#define PWM_CTL_GLOBAL_SYNC0 0x00000001 // Global sync generator 0 + +//***************************************************************************** +// +// The following define the bit fields in the PWM Time Base Sync register. +// +//***************************************************************************** +#define PWM_SYNC_SYNC2 0x00000004 // Reset generator 2 counter +#define PWM_SYNC_SYNC1 0x00000002 // Reset generator 1 counter +#define PWM_SYNC_SYNC0 0x00000001 // Reset generator 0 counter + +//***************************************************************************** +// +// The following define the bit fields in the PWM Output Enable register. +// +//***************************************************************************** +#define PWM_ENABLE_PWM5EN 0x00000020 // PWM5 pin enable +#define PWM_ENABLE_PWM4EN 0x00000010 // PWM4 pin enable +#define PWM_ENABLE_PWM3EN 0x00000008 // PWM3 pin enable +#define PWM_ENABLE_PWM2EN 0x00000004 // PWM2 pin enable +#define PWM_ENABLE_PWM1EN 0x00000002 // PWM1 pin enable +#define PWM_ENABLE_PWM0EN 0x00000001 // PWM0 pin enable + +//***************************************************************************** +// +// The following define the bit fields in the PWM Inversion register. +// +//***************************************************************************** +#define PWM_INVERT_PWM5INV 0x00000020 // PWM5 pin invert +#define PWM_INVERT_PWM4INV 0x00000010 // PWM4 pin invert +#define PWM_INVERT_PWM3INV 0x00000008 // PWM3 pin invert +#define PWM_INVERT_PWM2INV 0x00000004 // PWM2 pin invert +#define PWM_INVERT_PWM1INV 0x00000002 // PWM1 pin invert +#define PWM_INVERT_PWM0INV 0x00000001 // PWM0 pin invert + +//***************************************************************************** +// +// The following define the bit fields in the PWM Fault register. +// +//***************************************************************************** +#define PWM_FAULT_FAULT5 0x00000020 // PWM5 pin fault +#define PWM_FAULT_FAULT4 0x00000010 // PWM5 pin fault +#define PWM_FAULT_FAULT3 0x00000008 // PWM5 pin fault +#define PWM_FAULT_FAULT2 0x00000004 // PWM5 pin fault +#define PWM_FAULT_FAULT1 0x00000002 // PWM5 pin fault +#define PWM_FAULT_FAULT0 0x00000001 // PWM5 pin fault + +//***************************************************************************** +// +// PWM Interrupt Register bit definitions. +// +//***************************************************************************** +#define PWM_INT_INTFAULT 0x00010000 // Fault interrupt pending + +//***************************************************************************** +// +// The following define the bit fields in the PWM Status register. +// +//***************************************************************************** +#define PWM_STATUS_FAULT 0x00000001 // Fault status + +//***************************************************************************** +// +// PWM Generator standard offsets. +// +//***************************************************************************** +#define PWM_GEN_0_OFFSET 0x00000040 // PWM0 base +#define PWM_GEN_1_OFFSET 0x00000080 // PWM1 base +#define PWM_GEN_2_OFFSET 0x000000C0 // PWM2 base + +#define PWM_O_X_CTL 0x00000000 // Gen Control Reg +#define PWM_O_X_INTEN 0x00000004 // Gen Int/Trig Enable Reg +#define PWM_O_X_RIS 0x00000008 // Gen Raw Int Status Reg +#define PWM_O_X_ISC 0x0000000C // Gen Int Status Reg +#define PWM_O_X_LOAD 0x00000010 // Gen Load Reg +#define PWM_O_X_COUNT 0x00000014 // Gen Counter Reg +#define PWM_O_X_CMPA 0x00000018 // Gen Compare A Reg +#define PWM_O_X_CMPB 0x0000001C // Gen Compare B Reg +#define PWM_O_X_GENA 0x00000020 // Gen Generator A Ctrl Reg +#define PWM_O_X_GENB 0x00000024 // Gen Generator B Ctrl Reg +#define PWM_O_X_DBCTL 0x00000028 // Gen Dead Band Ctrl Reg +#define PWM_O_X_DBRISE 0x0000002C // Gen DB Rising Edge Delay Reg +#define PWM_O_X_DBFALL 0x00000030 // Gen DB Falling Edge Delay Reg + +//***************************************************************************** +// +// PWM_X Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_CTL_ENABLE 0x00000001 // Master enable for gen block +#define PWM_X_CTL_MODE 0x00000002 // Counter mode, down or up/down +#define PWM_X_CTL_DEBUG 0x00000004 // Debug mode +#define PWM_X_CTL_LOADUPD 0x00000008 // Update mode for the load reg +#define PWM_X_CTL_CMPAUPD 0x00000010 // Update mode for comp A reg +#define PWM_X_CTL_CMPBUPD 0x00000020 // Update mode for comp B reg + +//***************************************************************************** +// +// PWM_X Interrupt/Trigger Enable Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INTEN_INTCNTZERO 0x00000001 // Int if COUNT = 0 +#define PWM_X_INTEN_INTCNTLOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_X_INTEN_INTCMPAU 0x00000004 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPAD 0x00000008 // Int if COUNT = CMPA D +#define PWM_X_INTEN_INTCMPBU 0x00000010 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPBD 0x00000020 // Int if COUNT = CMPA D +#define PWM_X_INTEN_TRCNTZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_X_INTEN_TRCNTLOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_X_INTEN_TRCMPAU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPAD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_X_INTEN_TRCMPBU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPBD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// PWM_X Raw Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_RIS_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 int +#define PWM_X_RIS_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD int +#define PWM_X_RIS_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U int +#define PWM_X_RIS_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D int +#define PWM_X_RIS_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U int +#define PWM_X_RIS_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D int + +//***************************************************************************** +// +// PWM_X Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INT_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 received +#define PWM_X_INT_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD rcvd +#define PWM_X_INT_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U rcvd +#define PWM_X_INT_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D rcvd +#define PWM_X_INT_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U rcvd +#define PWM_X_INT_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D rcvd + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_GEN_Y_ACTZERO 0x00000003 // Act PWM_X_COUNT = 0 +#define PWM_X_GEN_Y_ACTLOAD 0x0000000C // Act PWM_X_COUNT = PWM_X_LOAD +#define PWM_X_GEN_Y_ACTCMPAU 0x00000030 // Act PWM_X_COUNT = PWM_X_CMPA U +#define PWM_X_GEN_Y_ACTCMPAD 0x000000C0 // Act PWM_X_COUNT = PWM_X_CMPA D +#define PWM_X_GEN_Y_ACTCMPBU 0x00000300 // Act PWM_X_COUNT = PWM_X_CMPB U +#define PWM_X_GEN_Y_ACTCMPBD 0x00000C00 // Act PWM_X_COUNT = PWM_X_CMPB D + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register action definitions. +// +//***************************************************************************** +#define PWM_GEN_ACT_NONE 0x0 // Do nothing +#define PWM_GEN_ACT_INV 0x1 // Invert the output signal +#define PWM_GEN_ACT_ZERO 0x2 // Set the output signal to zero +#define PWM_GEN_ACT_ONE 0x3 // Set the output signal to one +#define PWM_GEN_ACT_ZERO_SHIFT 0 // Shift amount for the zero action +#define PWM_GEN_ACT_LOAD_SHIFT 2 // Shift amount for the load action +#define PWM_GEN_ACT_A_UP_SHIFT 4 // Shift amount for the A up action +#define PWM_GEN_ACT_A_DN_SHIFT 6 // Shift amount for the A dn action +#define PWM_GEN_ACT_B_UP_SHIFT 8 // Shift amount for the B up action +#define PWM_GEN_ACT_B_DN_SHIFT 10 // Shift amount for the B dn action + +//***************************************************************************** +// +// PWM_X Dead Band Control Register bit definitions. +// +//***************************************************************************** +#define PWM_DBCTL_ENABLE 0x00000001 // Enable dead band insertion + +//***************************************************************************** +// +// PWM Register reset values. +// +//***************************************************************************** +#define PWM_RV_CTL 0x00000000 // Master control of the PWM module +#define PWM_RV_SYNC 0x00000000 // Counter synch for PWM generators +#define PWM_RV_ENABLE 0x00000000 // Master enable for the PWM + // output pins +#define PWM_RV_INVERT 0x00000000 // Inversion control for + // PWM output pins +#define PWM_RV_FAULT 0x00000000 // Fault handling for the PWM + // output pins +#define PWM_RV_INTEN 0x00000000 // Interrupt enable +#define PWM_RV_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_STATUS 0x00000000 // Status +#define PWM_RV_X_CTL 0x00000000 // Master control of the PWM + // generator block +#define PWM_RV_X_INTEN 0x00000000 // Interrupt and trigger enable +#define PWM_RV_X_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_X_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_X_LOAD 0x00000000 // The load value for the counter +#define PWM_RV_X_COUNT 0x00000000 // The current counter value +#define PWM_RV_X_CMPA 0x00000000 // The comparator A value +#define PWM_RV_X_CMPB 0x00000000 // The comparator B value +#define PWM_RV_X_GENA 0x00000000 // Controls PWM generator A +#define PWM_RV_X_GENB 0x00000000 // Controls PWM generator B +#define PWM_RV_X_DBCTL 0x00000000 // Control the dead band generator +#define PWM_RV_X_DBRISE 0x00000000 // The dead band rising edge delay + // count +#define PWM_RV_X_DBFALL 0x00000000 // The dead band falling edge delay + // count + +#endif // __HW_PWM_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_qei.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_qei.h new file mode 100644 index 0000000..864459f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_qei.h @@ -0,0 +1,176 @@ +//***************************************************************************** +// +// hw_qei.h - Macros used when accessing the QEI hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_QEI_H__ +#define __HW_QEI_H__ + +//***************************************************************************** +// +// The following define the offsets of the QEI registers. +// +//***************************************************************************** +#define QEI_O_CTL 0x00000000 // Configuration and control reg. +#define QEI_O_STAT 0x00000004 // Status register +#define QEI_O_POS 0x00000008 // Current position register +#define QEI_O_MAXPOS 0x0000000C // Maximum position register +#define QEI_O_LOAD 0x00000010 // Velocity timer load register +#define QEI_O_TIME 0x00000014 // Velocity timer register +#define QEI_O_COUNT 0x00000018 // Velocity pulse count register +#define QEI_O_SPEED 0x0000001C // Velocity speed register +#define QEI_O_INTEN 0x00000020 // Interrupt enable register +#define QEI_O_RIS 0x00000024 // Raw interrupt status register +#define QEI_O_ISC 0x00000028 // Interrupt status register + +//***************************************************************************** +// +// The following define the bit fields in the QEI_CTL register. +// +//***************************************************************************** +#define QEI_CTL_STALLEN 0x00001000 // Stall enable +#define QEI_CTL_INVI 0x00000800 // Invert Index input +#define QEI_CTL_INVB 0x00000400 // Invert PhB input +#define QEI_CTL_INVA 0x00000200 // Invert PhA input +#define QEI_CTL_VELDIV_M 0x000001C0 // Velocity predivider mask +#define QEI_CTL_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_CTL_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_CTL_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_CTL_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_CTL_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_CTL_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_CTL_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_CTL_VELDIV_128 0x000001C0 // Predivide by 128 +#define QEI_CTL_VELEN 0x00000020 // Velocity enable +#define QEI_CTL_RESMODE 0x00000010 // Position counter reset mode +#define QEI_CTL_CAPMODE 0x00000008 // Edge capture mode +#define QEI_CTL_SIGMODE 0x00000004 // Encoder signaling mode +#define QEI_CTL_SWAP 0x00000002 // Swap input signals +#define QEI_CTL_ENABLE 0x00000001 // QEI enable + +//***************************************************************************** +// +// The following define the bit fields in the QEI_STAT register. +// +//***************************************************************************** +#define QEI_STAT_DIRECTION 0x00000002 // Direction of rotation +#define QEI_STAT_ERROR 0x00000001 // Signalling error detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_POS register. +// +//***************************************************************************** +#define QEI_POS_M 0xFFFFFFFF // Current encoder position +#define QEI_POS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_MAXPOS register. +// +//***************************************************************************** +#define QEI_MAXPOS_M 0xFFFFFFFF // Maximum encoder position +#define QEI_MAXPOS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_LOAD register. +// +//***************************************************************************** +#define QEI_LOAD_M 0xFFFFFFFF // Velocity timer load value +#define QEI_LOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_TIME register. +// +//***************************************************************************** +#define QEI_TIME_M 0xFFFFFFFF // Velocity timer current value +#define QEI_TIME_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_COUNT register. +// +//***************************************************************************** +#define QEI_COUNT_M 0xFFFFFFFF // Encoder running pulse count +#define QEI_COUNT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_SPEED register. +// +//***************************************************************************** +#define QEI_SPEED_M 0xFFFFFFFF // Encoder pulse count +#define QEI_SPEED_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_INTEN register. +// +//***************************************************************************** +#define QEI_INTEN_ERROR 0x00000008 // Phase error detected +#define QEI_INTEN_DIR 0x00000004 // Direction change +#define QEI_INTEN_TIMER 0x00000002 // Velocity timer expired +#define QEI_INTEN_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_RIS register. +// +//***************************************************************************** +#define QEI_RIS_ERROR 0x00000008 // Phase error detected +#define QEI_RIS_DIR 0x00000004 // Direction change +#define QEI_RIS_TIMER 0x00000002 // Velocity timer expired +#define QEI_RIS_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_ISC register. +// +//***************************************************************************** +#define QEI_INT_ERROR 0x00000008 // Phase error detected +#define QEI_INT_DIR 0x00000004 // Direction change +#define QEI_INT_TIMER 0x00000002 // Velocity timer expired +#define QEI_INT_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the reset values for the QEI registers. +// +//***************************************************************************** +#define QEI_RV_CTL 0x00000000 // Configuration and control reg. +#define QEI_RV_STAT 0x00000000 // Status register +#define QEI_RV_POS 0x00000000 // Current position register +#define QEI_RV_MAXPOS 0x00000000 // Maximum position register +#define QEI_RV_LOAD 0x00000000 // Velocity timer load register +#define QEI_RV_TIME 0x00000000 // Velocity timer register +#define QEI_RV_COUNT 0x00000000 // Velocity pulse count register +#define QEI_RV_SPEED 0x00000000 // Velocity speed register +#define QEI_RV_INTEN 0x00000000 // Interrupt enable register +#define QEI_RV_RIS 0x00000000 // Raw interrupt status register +#define QEI_RV_ISC 0x00000000 // Interrupt status register + +#endif // __HW_QEI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_ssi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_ssi.h new file mode 100644 index 0000000..e4650af --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_ssi.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// hw_ssi.h - Macros used when accessing the SSI hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SSI_H__ +#define __HW_SSI_H__ + +//***************************************************************************** +// +// The following define the offsets of the SSI registers. +// +//***************************************************************************** +#define SSI_O_CR0 0x00000000 // Control register 0 +#define SSI_O_CR1 0x00000004 // Control register 1 +#define SSI_O_DR 0x00000008 // Data register +#define SSI_O_SR 0x0000000C // Status register +#define SSI_O_CPSR 0x00000010 // Clock prescale register +#define SSI_O_IM 0x00000014 // Int mask set and clear register +#define SSI_O_RIS 0x00000018 // Raw interrupt register +#define SSI_O_MIS 0x0000001C // Masked interrupt register +#define SSI_O_ICR 0x00000020 // Interrupt clear register + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 0. +// +//***************************************************************************** +#define SSI_CR0_SCR 0x0000FF00 // Serial clock rate +#define SSI_CR0_SPH 0x00000080 // SSPCLKOUT phase +#define SSI_CR0_SPO 0x00000040 // SSPCLKOUT polarity +#define SSI_CR0_FRF_MASK 0x00000030 // Frame format mask +#define SSI_CR0_FRF_MOTO 0x00000000 // Motorola SPI frame format +#define SSI_CR0_FRF_TI 0x00000010 // TI sync serial frame format +#define SSI_CR0_FRF_NMW 0x00000020 // National Microwire frame format +#define SSI_CR0_DSS 0x0000000F // Data size select +#define SSI_CR0_DSS_4 0x00000003 // 4 bit data +#define SSI_CR0_DSS_5 0x00000004 // 5 bit data +#define SSI_CR0_DSS_6 0x00000005 // 6 bit data +#define SSI_CR0_DSS_7 0x00000006 // 7 bit data +#define SSI_CR0_DSS_8 0x00000007 // 8 bit data +#define SSI_CR0_DSS_9 0x00000008 // 9 bit data +#define SSI_CR0_DSS_10 0x00000009 // 10 bit data +#define SSI_CR0_DSS_11 0x0000000A // 11 bit data +#define SSI_CR0_DSS_12 0x0000000B // 12 bit data +#define SSI_CR0_DSS_13 0x0000000C // 13 bit data +#define SSI_CR0_DSS_14 0x0000000D // 14 bit data +#define SSI_CR0_DSS_15 0x0000000E // 15 bit data +#define SSI_CR0_DSS_16 0x0000000F // 16 bit data + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 1. +// +//***************************************************************************** +#define SSI_CR1_SOD 0x00000008 // Slave mode output disable +#define SSI_CR1_MS 0x00000004 // Master or slave mode select +#define SSI_CR1_SSE 0x00000002 // Sync serial port enable +#define SSI_CR1_LBM 0x00000001 // Loopback mode + +//***************************************************************************** +// +// The following define the bit fields in the SSI Status register. +// +//***************************************************************************** +#define SSI_SR_BSY 0x00000010 // SSI busy +#define SSI_SR_RFF 0x00000008 // RX FIFO full +#define SSI_SR_RNE 0x00000004 // RX FIFO not empty +#define SSI_SR_TNF 0x00000002 // TX FIFO not full +#define SSI_SR_TFE 0x00000001 // TX FIFO empty + +//***************************************************************************** +// +// The following define the bit fields in the SSI clock prescale register. +// +//***************************************************************************** +#define SSI_CPSR_CPSDVSR_MASK 0x000000FF // Clock prescale + +//***************************************************************************** +// +// The following define information concerning the SSI Data register. +// +//***************************************************************************** +#define TX_FIFO_SIZE (8) // Number of entries in the TX FIFO +#define RX_FIFO_SIZE (8) // Number of entries in the RX FIFO + +//***************************************************************************** +// +// The following define the bit fields in the interrupt mask set and clear, +// raw interrupt, masked interrupt, and interrupt clear registers. +// +//***************************************************************************** +#define SSI_INT_TXFF 0x00000008 // TX FIFO interrupt +#define SSI_INT_RXFF 0x00000004 // RX FIFO interrupt +#define SSI_INT_RXTO 0x00000002 // RX timeout interrupt +#define SSI_INT_RXOR 0x00000001 // RX overrun interrupt + +#endif // __HW_SSI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_sysctl.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_sysctl.h new file mode 100644 index 0000000..4f6b55e --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_sysctl.h @@ -0,0 +1,409 @@ +//***************************************************************************** +// +// hw_sysctl.h - Macros used when accessing the system control hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SYSCTL_H__ +#define __HW_SYSCTL_H__ + +//***************************************************************************** +// +// The following define the offsets of the system control registers. +// +//***************************************************************************** +#define SYSCTL_DID0 0x400fe000 // Device identification register 0 +#define SYSCTL_DID1 0x400fe004 // Device identification register 1 +#define SYSCTL_DC0 0x400fe008 // Device capabilities register 0 +#define SYSCTL_DC1 0x400fe010 // Device capabilities register 1 +#define SYSCTL_DC2 0x400fe014 // Device capabilities register 2 +#define SYSCTL_DC3 0x400fe018 // Device capabilities register 3 +#define SYSCTL_DC4 0x400fe01C // Device capabilities register 4 +#define SYSCTL_PBORCTL 0x400fe030 // POR/BOR reset control register +#define SYSCTL_LDOPCTL 0x400fe034 // LDO power control register +#define SYSCTL_SRCR0 0x400fe040 // Software reset control reg 0 +#define SYSCTL_SRCR1 0x400fe044 // Software reset control reg 1 +#define SYSCTL_SRCR2 0x400fe048 // Software reset control reg 2 +#define SYSCTL_RIS 0x400fe050 // Raw interrupt status register +#define SYSCTL_IMC 0x400fe054 // Interrupt mask/control register +#define SYSCTL_MISC 0x400fe058 // Interrupt status register +#define SYSCTL_RESC 0x400fe05c // Reset cause register +#define SYSCTL_RCC 0x400fe060 // Run-mode clock config register +#define SYSCTL_PLLCFG 0x400fe064 // PLL configuration register +#define SYSCTL_RCGC0 0x400fe100 // Run-mode clock gating register 0 +#define SYSCTL_RCGC1 0x400fe104 // Run-mode clock gating register 1 +#define SYSCTL_RCGC2 0x400fe108 // Run-mode clock gating register 2 +#define SYSCTL_SCGC0 0x400fe110 // Sleep-mode clock gating reg 0 +#define SYSCTL_SCGC1 0x400fe114 // Sleep-mode clock gating reg 1 +#define SYSCTL_SCGC2 0x400fe118 // Sleep-mode clock gating reg 2 +#define SYSCTL_DCGC0 0x400fe120 // Deep Sleep-mode clock gate reg 0 +#define SYSCTL_DCGC1 0x400fe124 // Deep Sleep-mode clock gate reg 1 +#define SYSCTL_DCGC2 0x400fe128 // Deep Sleep-mode clock gate reg 2 +#define SYSCTL_CLKVCLR 0x400fe150 // Clock verifcation clear register +#define SYSCTL_LDOARST 0x400fe160 // LDO reset control register + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID0 register. +// +//***************************************************************************** +#define SYSCTL_DID0_VER_MASK 0x70000000 // DID0 version mask +#define SYSCTL_DID0_VER_0 0x00000000 // DID0 version 0 +#define SYSCTL_DID0_MAJ_MASK 0x0000FF00 // Major revision mask +#define SYSCTL_DID0_MAJ_A 0x00000000 // Major revision A +#define SYSCTL_DID0_MAJ_B 0x00000100 // Major revision B +#define SYSCTL_DID0_MIN_MASK 0x000000FF // Minor revision mask +#define SYSCTL_DID0_MIN_0 0x00000000 // Minor revision 0 +#define SYSCTL_DID0_MIN_1 0x00000001 // Minor revision 1 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID1 register. +// +//***************************************************************************** +#define SYSCTL_DID1_VER_MASK 0xF0000000 // Register version mask +#define SYSCTL_DID1_FAM_MASK 0x0F000000 // Family mask +#define SYSCTL_DID1_FAM_S 0x00000000 // Stellaris family +#define SYSCTL_DID1_PRTNO_MASK 0x00FF0000 // Part number mask +#define SYSCTL_DID1_PRTNO_101 0x00010000 // LM3S101 +#define SYSCTL_DID1_PRTNO_102 0x00020000 // LM3S102 +#define SYSCTL_DID1_PRTNO_301 0x00110000 // LM3S301 +#define SYSCTL_DID1_PRTNO_310 0x00120000 // LM3S310 +#define SYSCTL_DID1_PRTNO_315 0x00130000 // LM3S315 +#define SYSCTL_DID1_PRTNO_316 0x00140000 // LM3S316 +#define SYSCTL_DID1_PRTNO_328 0x00150000 // LM3S328 +#define SYSCTL_DID1_PRTNO_601 0x00210000 // LM3S601 +#define SYSCTL_DID1_PRTNO_610 0x00220000 // LM3S610 +#define SYSCTL_DID1_PRTNO_611 0x00230000 // LM3S611 +#define SYSCTL_DID1_PRTNO_612 0x00240000 // LM3S612 +#define SYSCTL_DID1_PRTNO_613 0x00250000 // LM3S613 +#define SYSCTL_DID1_PRTNO_615 0x00260000 // LM3S615 +#define SYSCTL_DID1_PRTNO_628 0x00270000 // LM3S628 +#define SYSCTL_DID1_PRTNO_801 0x00310000 // LM3S801 +#define SYSCTL_DID1_PRTNO_811 0x00320000 // LM3S811 +#define SYSCTL_DID1_PRTNO_812 0x00330000 // LM3S812 +#define SYSCTL_DID1_PRTNO_815 0x00340000 // LM3S815 +#define SYSCTL_DID1_PRTNO_828 0x00350000 // LM3S828 +#define SYSCTL_DID1_TEMP_MASK 0x000000E0 // Temperature range mask +#define SYSCTL_DID1_TEMP_C 0x00000000 // Commercial temp range (0..70C) +#define SYSCTL_DID1_TEMP_I 0x00000020 // Industrial temp range (-40..85C) +#define SYSCTL_DID1_PKG_MASK 0x00000018 // Package mask +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 // 28-pin SOIC +#define SYSCTL_DID1_PKG_48QFP 0x00000008 // 48-pin QFP +#define SYSCTL_DID1_ROHS 0x00000004 // Part is RoHS compliant +#define SYSCTL_DID1_QUAL_MASK 0x00000003 // Qualification status mask +#define SYSCTL_DID1_QUAL_ES 0x00000000 // Engineering sample (unqualified) +#define SYSCTL_DID1_QUAL_PP 0x00000001 // Pilot production (unqualified) +#define SYSCTL_DID1_QUAL_FQ 0x00000002 // Fully qualified +#define SYSCTL_DID1_PRTNO_SHIFT 16 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC0 register. +// +//***************************************************************************** +#define SYSCTL_DC0_SRAMSZ_MASK 0xFFFF0000 // SRAM size mask +#define SYSCTL_DC0_SRAMSZ_2KB 0x00070000 // 2kB of SRAM +#define SYSCTL_DC0_SRAMSZ_4KB 0x000F0000 // 4kB of SRAM +#define SYSCTL_DC0_SRAMSZ_8KB 0x001F0000 // 8kB of SRAM +#define SYSCTL_DC0_FLASHSZ_MASK 0x0000FFFF // Flash size mask +#define SYSCTL_DC0_FLASHSZ_8KB 0x00000003 // 8kB of flash +#define SYSCTL_DC0_FLASHSZ_16KB 0x00000007 // 16kB of flash +#define SYSCTL_DC0_FLASHSZ_32KB 0x0000000F // 32kB of flash +#define SYSCTL_DC0_FLASHSZ_64KB 0x0000001F // 64kB of flash + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC1 register. +// +//***************************************************************************** +#define SYSCTL_DC1_PWM 0x00100000 // PWM module present +#define SYSCTL_DC1_ADC 0x00010000 // ADC module present +#define SYSCTL_DC1_SYSDIV_MASK 0x0000F000 // Minimum system divider mask +#define SYSCTL_DC1_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_DC1_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_DC1_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_DC1_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_DC1_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_DC1_MPU 0x00000080 // Cortex-M3 MPU present +#define SYSCTL_DC1_TEMP 0x00000020 // Temperature sensor present +#define SYSCTL_DC1_PLL 0x00000010 // PLL present +#define SYSCTL_DC1_WDOG 0x00000008 // Watchdog present +#define SYSCTL_DC1_SWO 0x00000004 // Serial wire output present +#define SYSCTL_DC1_SWD 0x00000002 // Serial wire debug present +#define SYSCTL_DC1_JTAG 0x00000001 // JTAG debug present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC2 register. +// +//***************************************************************************** +#define SYSCTL_DC2_COMP2 0x04000000 // Analog comparator 2 present +#define SYSCTL_DC2_COMP1 0x02000000 // Analog comparator 1 present +#define SYSCTL_DC2_COMP0 0x01000000 // Analog comparator 0 present +#define SYSCTL_DC2_TIMER2 0x00040000 // Timer 2 present +#define SYSCTL_DC2_TIMER1 0x00020000 // Timer 1 present +#define SYSCTL_DC2_TIMER0 0x00010000 // Timer 0 present +#define SYSCTL_DC2_I2C 0x00001000 // I2C present +#define SYSCTL_DC2_QEI 0x00000100 // QEI present +#define SYSCTL_DC2_SSI 0x00000010 // SSI present +#define SYSCTL_DC2_UART1 0x00000002 // UART 1 present +#define SYSCTL_DC2_UART0 0x00000001 // UART 0 present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC3 register. +// +//***************************************************************************** +#define SYSCTL_DC3_32KHZ 0x80000000 // 32kHz pin present +#define SYSCTL_DC3_CCP5 0x20000000 // CCP5 pin present +#define SYSCTL_DC3_CCP4 0x10000000 // CCP4 pin present +#define SYSCTL_DC3_CCP3 0x08000000 // CCP3 pin present +#define SYSCTL_DC3_CCP2 0x04000000 // CCP2 pin present +#define SYSCTL_DC3_CCP1 0x02000000 // CCP1 pin present +#define SYSCTL_DC3_CCP0 0x01000000 // CCP0 pin present +#define SYSCTL_DC3_ADC7 0x00800000 // ADC7 pin present +#define SYSCTL_DC3_ADC6 0x00400000 // ADC6 pin present +#define SYSCTL_DC3_ADC5 0x00200000 // ADC5 pin present +#define SYSCTL_DC3_ADC4 0x00100000 // ADC4 pin present +#define SYSCTL_DC3_ADC3 0x00080000 // ADC3 pin present +#define SYSCTL_DC3_ADC2 0x00040000 // ADC2 pin present +#define SYSCTL_DC3_ADC1 0x00020000 // ADC1 pin present +#define SYSCTL_DC3_ADC0 0x00010000 // ADC0 pin present +#define SYSCTL_DC3_C2O 0x00004000 // C2o pin present +#define SYSCTL_DC3_C2PLUS 0x00002000 // C2+ pin present +#define SYSCTL_DC3_C2MINUS 0x00001000 // C2- pin present +#define SYSCTL_DC3_C1O 0x00000800 // C1o pin present +#define SYSCTL_DC3_C1PLUS 0x00000400 // C1+ pin present +#define SYSCTL_DC3_C1MINUS 0x00000200 // C1- pin present +#define SYSCTL_DC3_C0O 0x00000100 // C0o pin present +#define SYSCTL_DC3_C0PLUS 0x00000080 // C0+ pin present +#define SYSCTL_DC3_C0MINUS 0x00000040 // C0- pin present +#define SYSCTL_DC3_PWM5 0x00000020 // PWM5 pin present +#define SYSCTL_DC3_PWM4 0x00000010 // PWM4 pin present +#define SYSCTL_DC3_PWM3 0x00000008 // PWM3 pin present +#define SYSCTL_DC3_PWM2 0x00000004 // PWM2 pin present +#define SYSCTL_DC3_PWM1 0x00000002 // PWM1 pin present +#define SYSCTL_DC3_PWM0 0x00000001 // PWM0 pin present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC4 register. +// +//***************************************************************************** +#define SYSCTL_DC4_GPIOE 0x00000010 // GPIO port E present +#define SYSCTL_DC4_GPIOD 0x00000008 // GPIO port D present +#define SYSCTL_DC4_GPIOC 0x00000004 // GPIO port C present +#define SYSCTL_DC4_GPIOB 0x00000002 // GPIO port B present +#define SYSCTL_DC4_GPIOA 0x00000001 // GPIO port A present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PBORCTL register. +// +//***************************************************************************** +#define SYSCTL_PBORCTL_BOR_MASK 0x0000FFFC // BOR wait timer +#define SYSCTL_PBORCTL_BORIOR 0x00000002 // BOR interrupt or reset +#define SYSCTL_PBORCTL_BORWT 0x00000001 // BOR wait and check for noise +#define SYSCTL_PBORCTL_BOR_SH 2 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOPCTL register. +// +//***************************************************************************** +#define SYSCTL_LDOPCTL_MASK 0x0000003F // Voltage adjust mask +#define SYSCTL_LDOPCTL_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDOPCTL_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDOPCTL_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDOPCTL_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDOPCTL_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDOPCTL_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDOPCTL_2_55V 0x0000001F // LDO output of 2.55V +#define SYSCTL_LDOPCTL_2_60V 0x0000001E // LDO output of 2.60V +#define SYSCTL_LDOPCTL_2_65V 0x0000001D // LDO output of 2.65V +#define SYSCTL_LDOPCTL_2_70V 0x0000001C // LDO output of 2.70V +#define SYSCTL_LDOPCTL_2_75V 0x0000001B // LDO output of 2.75V + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR0, SYSCTL_RCGC0, +// SYSCTL_SCGC0, and SYSCTL_DCGC0 registers. +// +//***************************************************************************** +#define SYSCTL_SET0_PWM 0x00100000 // PWM module +#define SYSCTL_SET0_ADC 0x00010000 // ADC module +#define SYSCTL_SET0_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_SET0_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_SET0_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_SET0_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_SET0_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_SET0_WDOG 0x00000008 // Watchdog module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR1, SYSCTL_RCGC1, +// SYSCTL_SCGC1, and SYSCTL_DCGC1 registers. +// +//***************************************************************************** +#define SYSCTL_SET1_COMP2 0x04000000 // Analog comparator module 2 +#define SYSCTL_SET1_COMP1 0x02000000 // Analog comparator module 1 +#define SYSCTL_SET1_COMP0 0x01000000 // Analog comparator module 0 +#define SYSCTL_SET1_TIMER2 0x00040000 // Timer module 2 +#define SYSCTL_SET1_TIMER1 0x00020000 // Timer module 1 +#define SYSCTL_SET1_TIMER0 0x00010000 // Timer module 0 +#define SYSCTL_SET1_I2C 0x00001000 // I2C module +#define SYSCTL_SET1_QEI 0x00000100 // QEI module +#define SYSCTL_SET1_SSI 0x00000010 // SSI module +#define SYSCTL_SET1_UART1 0x00000002 // UART module 1 +#define SYSCTL_SET1_UART0 0x00000001 // UART module 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR2, SYSCTL_RCGC2, +// SYSCTL_SCGC2, and SYSCTL_DCGC2 registers. +// +//***************************************************************************** +#define SYSCTL_SET2_GPIOE 0x00000010 // GPIO E module +#define SYSCTL_SET2_GPIOD 0x00000008 // GPIO D module +#define SYSCTL_SET2_GPIOC 0x00000004 // GPIO C module +#define SYSCTL_SET2_GPIOB 0x00000002 // GPIO B module +#define SYSCTL_SET2_GPIOA 0x00000001 // GIPO A module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RIS, SYSCTL_IMC, and +// SYSCTL_IMS registers. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RESC register. +// +//***************************************************************************** +#define SYSCTL_RESC_LDO 0x00000020 // LDO power OK lost reset +#define SYSCTL_RESC_SW 0x00000010 // Software reset +#define SYSCTL_RESC_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_RESC_BOR 0x00000004 // Brown-out reset +#define SYSCTL_RESC_POR 0x00000002 // Power on reset +#define SYSCTL_RESC_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC register. +// +//***************************************************************************** +#define SYSCTL_RCC_ACG 0x08000000 // Automatic clock gating +#define SYSCTL_RCC_SYSDIV_MASK 0x07800000 // System clock divider +#define SYSCTL_RCC_SYSDIV_2 0x00800000 // System clock /2 +#define SYSCTL_RCC_SYSDIV_3 0x01000000 // System clock /3 +#define SYSCTL_RCC_SYSDIV_4 0x01800000 // System clock /4 +#define SYSCTL_RCC_SYSDIV_5 0x02000000 // System clock /5 +#define SYSCTL_RCC_SYSDIV_6 0x02800000 // System clock /6 +#define SYSCTL_RCC_SYSDIV_7 0x03000000 // System clock /7 +#define SYSCTL_RCC_SYSDIV_8 0x03800000 // System clock /8 +#define SYSCTL_RCC_SYSDIV_9 0x04000000 // System clock /9 +#define SYSCTL_RCC_SYSDIV_10 0x04800000 // System clock /10 +#define SYSCTL_RCC_SYSDIV_11 0x05000000 // System clock /11 +#define SYSCTL_RCC_SYSDIV_12 0x05800000 // System clock /12 +#define SYSCTL_RCC_SYSDIV_13 0x06000000 // System clock /13 +#define SYSCTL_RCC_SYSDIV_14 0x06800000 // System clock /14 +#define SYSCTL_RCC_SYSDIV_15 0x07000000 // System clock /15 +#define SYSCTL_RCC_SYSDIV_16 0x07800000 // System clock /16 +#define SYSCTL_RCC_USE_SYSDIV 0x00400000 // Use sytem clock divider +#define SYSCTL_RCC_USE_PWMDIV 0x00100000 // Use PWM clock divider +#define SYSCTL_RCC_PWMDIV_MASK 0x000E0000 // PWM clock divider +#define SYSCTL_RCC_PWMDIV_2 0x00000000 // PWM clock /2 +#define SYSCTL_RCC_PWMDIV_4 0x00020000 // PWM clock /4 +#define SYSCTL_RCC_PWMDIV_8 0x00040000 // PWM clock /8 +#define SYSCTL_RCC_PWMDIV_16 0x00060000 // PWM clock /16 +#define SYSCTL_RCC_PWMDIV_32 0x00080000 // PWM clock /32 +#define SYSCTL_RCC_PWMDIV_64 0x000A0000 // PWM clock /64 +#define SYSCTL_RCC_PWRDN 0x00002000 // PLL power down +#define SYSCTL_RCC_OE 0x00001000 // PLL output enable +#define SYSCTL_RCC_BYPASS 0x00000800 // PLL bypass +#define SYSCTL_RCC_PLLVER 0x00000400 // PLL verification timer enable +#define SYSCTL_RCC_XTAL_MASK 0x000003C0 // Crystal attached to main osc +#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100 // Using a 3.579545MHz crystal +#define SYSCTL_RCC_XTAL_3_68MHz 0x00000140 // Using a 3.6864MHz crystal +#define SYSCTL_RCC_XTAL_4MHz 0x00000180 // Using a 4MHz crystal +#define SYSCTL_RCC_XTAL_4_09MHZ 0x000001C0 // Using a 4.096MHz crystal +#define SYSCTL_RCC_XTAL_4_91MHZ 0x00000200 // Using a 4.9152MHz crystal +#define SYSCTL_RCC_XTAL_5MHZ 0x00000240 // Using a 5MHz crystal +#define SYSCTL_RCC_XTAL_5_12MHZ 0x00000280 // Using a 5.12MHz crystal +#define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 // Using a 6MHz crystal +#define SYSCTL_RCC_XTAL_6_14MHZ 0x00000300 // Using a 6.144MHz crystal +#define SYSCTL_RCC_XTAL_7_37MHZ 0x00000340 // Using a 7.3728MHz crystal +#define SYSCTL_RCC_XTAL_8MHZ 0x00000380 // Using a 8MHz crystal +#define SYSCTL_RCC_XTAL_8_19MHZ 0x000003C0 // Using a 8.192MHz crystal +#define SYSCTL_RCC_OSCSRC_MASK 0x00000030 // Oscillator input select +#define SYSCTL_RCC_OSCSRC_MAIN 0x00000000 // Use the main oscillator +#define SYSCTL_RCC_OSCSRC_INT 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC_OSCSRC_INT4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC_IOSCVER 0x00000008 // Int. osc. verification timer en +#define SYSCTL_RCC_MOSCVER 0x00000004 // Main osc. verification timer en +#define SYSCTL_RCC_IOSCDIS 0x00000002 // Internal oscillator disable +#define SYSCTL_RCC_MOSCDIS 0x00000001 // Main oscillator disable +#define SYSCTL_RCC_SYSDIV_SHIFT 23 // Shift to the SYSDIV field +#define SYSCTL_RCC_PWMDIV_SHIFT 17 // Shift to the PWMDIV field +#define SYSCTL_RCC_XTAL_SHIFT 6 // Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_SHIFT 4 // Shift to the OSCSRC field + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PLLCFG register. +// +//***************************************************************************** +#define SYSCTL_PLLCFG_OD_MASK 0x0000C000 // Output divider +#define SYSCTL_PLLCFG_OD_1 0x00000000 // Output divider is 1 +#define SYSCTL_PLLCFG_OD_2 0x00004000 // Output divider is 2 +#define SYSCTL_PLLCFG_OD_4 0x00008000 // Output divider is 4 +#define SYSCTL_PLLCFG_F_MASK 0x00003FE0 // PLL multiplier +#define SYSCTL_PLLCFG_R_MASK 0x0000001F // Input predivider +#define SYSCTL_PLLCFG_F_SHIFT 5 +#define SYSCTL_PLLCFG_R_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_CLKVCLR register. +// +//***************************************************************************** +#define SYSCTL_CLKVCLR_CLR 0x00000001 // Clear clock verification fault + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOARST register. +// +//***************************************************************************** +#define SYSCTL_LDOARST_ARST 0x00000001 // Allow LDO to reset device + +#endif // __HW_SYSCTL_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_timer.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_timer.h new file mode 100644 index 0000000..210c340 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_timer.h @@ -0,0 +1,235 @@ +//***************************************************************************** +// +// hw_timer.h - Defines and macros used when accessing the timer. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TIMER_H__ +#define __HW_TIMER_H__ + +//***************************************************************************** +// +// The following define the offsets of the timer registers. +// +//***************************************************************************** +#define TIMER_O_CFG 0x00000000 // Configuration register +#define TIMER_O_TAMR 0x00000004 // TimerA mode register +#define TIMER_O_TBMR 0x00000008 // TimerB mode register +#define TIMER_O_CTL 0x0000000C // Control register +#define TIMER_O_IMR 0x00000018 // Interrupt mask register +#define TIMER_O_RIS 0x0000001C // Interrupt status register +#define TIMER_O_MIS 0x00000020 // Masked interrupt status reg. +#define TIMER_O_ICR 0x00000024 // Interrupt clear register +#define TIMER_O_TAILR 0x00000028 // TimerA interval load register +#define TIMER_O_TBILR 0x0000002C // TimerB interval load register +#define TIMER_O_TAMATCHR 0x00000030 // TimerA match register +#define TIMER_O_TBMATCHR 0x00000034 // TimerB match register +#define TIMER_O_TAPR 0x00000038 // TimerA prescale register +#define TIMER_O_TBPR 0x0000003C // TimerB prescale register +#define TIMER_O_TAPMR 0x00000040 // TimerA prescale match register +#define TIMER_O_TBPMR 0x00000044 // TimerB prescale match register +#define TIMER_O_TAR 0x00000048 // TimerA register +#define TIMER_O_TBR 0x0000004C // TimerB register + +//***************************************************************************** +// +// The following define the reset values of the timer registers. +// +//***************************************************************************** +#define TIMER_RV_CFG 0x00000000 // Configuration register RV +#define TIMER_RV_TAMR 0x00000000 // TimerA mode register RV +#define TIMER_RV_TBMR 0x00000000 // TimerB mode register RV +#define TIMER_RV_CTL 0x00000000 // Control register RV +#define TIMER_RV_IMR 0x00000000 // Interrupt mask register RV +#define TIMER_RV_RIS 0x00000000 // Interrupt status register RV +#define TIMER_RV_MIS 0x00000000 // Masked interrupt status reg RV +#define TIMER_RV_ICR 0x00000000 // Interrupt clear register RV +#define TIMER_RV_TAILR 0xFFFFFFFF // TimerA interval load reg RV +#define TIMER_RV_TBILR 0x0000FFFF // TimerB interval load reg RV +#define TIMER_RV_TAMATCHR 0xFFFFFFFF // TimerA match register RV +#define TIMER_RV_TBMATCHR 0x0000FFFF // TimerB match register RV +#define TIMER_RV_TAPR 0x00000000 // TimerA prescale register RV +#define TIMER_RV_TBPR 0x00000000 // TimerB prescale register RV +#define TIMER_RV_TAPMR 0x00000000 // TimerA prescale match reg RV +#define TIMER_RV_TBPMR 0x00000000 // TimerB prescale match regi RV +#define TIMER_RV_TAR 0xFFFFFFFF // TimerA register RV +#define TIMER_RV_TBR 0x0000FFFF // TimerB register RV + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CFG register. +// +//***************************************************************************** +#define TIMER_CFG_CFG_MSK 0x00000007 // Configuration options mask +#define TIMER_CFG_16_BIT 0x00000004 // Two 16 bit timers +#define TIMER_CFG_32_BIT_RTC 0x00000001 // 32 bit RTC +#define TIMER_CFG_32_BIT_TIMER 0x00000000 // 32 bit timer + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TnMR register. +// +//***************************************************************************** +#define TIMER_TNMR_TNAMS 0x00000008 // Alternate mode select +#define TIMER_TNMR_TNCMR 0x00000004 // Capture mode - count or time +#define TIMER_TNMR_TNTMR_MSK 0x00000003 // Timer mode mask +#define TIMER_TNMR_TNTMR_CAP 0x00000003 // Mode - capture +#define TIMER_TNMR_TNTMR_PERIOD 0x00000002 // Mode - periodic +#define TIMER_TNMR_TNTMR_1_SHOT 0x00000001 // Mode - one shot + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CTL register. +// +//***************************************************************************** +#define TIMER_CTL_TBPWML 0x00004000 // TimerB PWM output level invert +#define TIMER_CTL_TBOTE 0x00002000 // TimerB output trigger enable +#define TIMER_CTL_TBEVENT_MSK 0x00000C00 // TimerB event mode mask +#define TIMER_CTL_TBEVENT_BOTH 0x00000C00 // TimerB event mode - both edges +#define TIMER_CTL_TBEVENT_NEG 0x00000400 // TimerB event mode - neg edge +#define TIMER_CTL_TBEVENT_POS 0x00000000 // TimerB event mode - pos edge +#define TIMER_CTL_TBSTALL 0x00000200 // TimerB stall enable +#define TIMER_CTL_TBEN 0x00000100 // TimerB enable +#define TIMER_CTL_TAPWML 0x00000040 // TimerA PWM output level invert +#define TIMER_CTL_TAOTE 0x00000020 // TimerA output trigger enable +#define TIMER_CTL_RTCEN 0x00000010 // RTC counter enable +#define TIMER_CTL_TAEVENT_MSK 0x0000000C // TimerA event mode mask +#define TIMER_CTL_TAEVENT_BOTH 0x0000000C // TimerA event mode - both edges +#define TIMER_CTL_TAEVENT_NEG 0x00000004 // TimerA event mode - neg edge +#define TIMER_CTL_TAEVENT_POS 0x00000000 // TimerA event mode - pos edge +#define TIMER_CTL_TASTALL 0x00000002 // TimerA stall enable +#define TIMER_CTL_TAEN 0x00000001 // TimerA enable + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_IMR register. +// +//***************************************************************************** +#define TIMER_IMR_CBEIM 0x00000400 // CaptureB event interrupt mask +#define TIMER_IMR_CBMIM 0x00000200 // CaptureB match interrupt mask +#define TIMER_IMR_TBTOIM 0x00000100 // TimerB time out interrupt mask +#define TIMER_IMR_RTCIM 0x00000008 // RTC interrupt mask +#define TIMER_IMR_CAEIM 0x00000004 // CaptureA event interrupt mask +#define TIMER_IMR_CAMIM 0x00000002 // CaptureA match interrupt mask +#define TIMER_IMR_TATOIM 0x00000001 // TimerA time out interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_RIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBERIS 0x00000400 // CaptureB event raw int status +#define TIMER_RIS_CBMRIS 0x00000200 // CaptureB match raw int status +#define TIMER_RIS_TBTORIS 0x00000100 // TimerB time out raw int status +#define TIMER_RIS_RTCRIS 0x00000008 // RTC raw int status +#define TIMER_RIS_CAERIS 0x00000004 // CaptureA event raw int status +#define TIMER_RIS_CAMRIS 0x00000002 // CaptureA match raw int status +#define TIMER_RIS_TATORIS 0x00000001 // TimerA time out raw int status + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_MIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBEMIS 0x00000400 // CaptureB event masked int status +#define TIMER_RIS_CBMMIS 0x00000200 // CaptureB match masked int status +#define TIMER_RIS_TBTOMIS 0x00000100 // TimerB time out masked int stat +#define TIMER_RIS_RTCMIS 0x00000008 // RTC masked int status +#define TIMER_RIS_CAEMIS 0x00000004 // CaptureA event masked int status +#define TIMER_RIS_CAMMIS 0x00000002 // CaptureA match masked int status +#define TIMER_RIS_TATOMIS 0x00000001 // TimerA time out masked int stat + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_ICR register. +// +//***************************************************************************** +#define TIMER_ICR_CBECINT 0x00000400 // CaptureB event interrupt clear +#define TIMER_ICR_CBMCINT 0x00000200 // CaptureB match interrupt clear +#define TIMER_ICR_TBTOCINT 0x00000100 // TimerB time out interrupt clear +#define TIMER_ICR_RTCCINT 0x00000008 // RTC interrupt clear +#define TIMER_ICR_CAECINT 0x00000004 // CaptureA event interrupt clear +#define TIMER_ICR_CAMCINT 0x00000002 // CaptureA match interrupt clear +#define TIMER_ICR_TATOCINT 0x00000001 // TimerA time out interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAILR register. +// +//***************************************************************************** +#define TIMER_TAILR_TAILRH 0xFFFF0000 // TimerB load val in 32 bit mode +#define TIMER_TAILR_TAILRL 0x0000FFFF // TimerA interval load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBILR register. +// +//***************************************************************************** +#define TIMER_TBILR_TBILRL 0x0000FFFF // TimerB interval load value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAMATCHR register. +// +//***************************************************************************** +#define TIMER_TAMATCHR_TAMRH 0xFFFF0000 // TimerB match val in 32 bit mode +#define TIMER_TAMATCHR_TAMRL 0x0000FFFF // TimerA match value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBMATCHR register. +// +//***************************************************************************** +#define TIMER_TBMATCHR_TBMRL 0x0000FFFF // TimerB match load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPR register. +// +//***************************************************************************** +#define TIMER_TNPR_TNPSR 0x000000FF // TimerN prescale value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPMR register. +// +//***************************************************************************** +#define TIMER_TNPMR_TNPSMR 0x000000FF // TimerN prescale match value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAR register. +// +//***************************************************************************** +#define TIMER_TAR_TARH 0xFFFF0000 // TimerB val in 32 bit mode +#define TIMER_TAR_TARL 0x0000FFFF // TimerA value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBR register. +// +//***************************************************************************** +#define TIMER_TBR_TBRL 0x0000FFFF // TimerB value + +#endif // __HW_TIMER_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_types.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_types.h new file mode 100644 index 0000000..ec05e54 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_types.h @@ -0,0 +1,67 @@ +//***************************************************************************** +// +// hw_types.h - Common types and macros. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TYPES_H__ +#define __HW_TYPES_H__ + +//***************************************************************************** +// +// Define a boolean type, and values for true and false. +// +//***************************************************************************** +typedef unsigned char tBoolean; + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +//***************************************************************************** +// +// Macros for hardware access, both direct and via the bit-band region. +// +//***************************************************************************** +#define HWREG(x) \ + (*((volatile unsigned long *)(x))) +#define HWREGH(x) \ + (*((volatile unsigned short *)(x))) +#define HWREGB(x) \ + (*((volatile unsigned char *)(x))) +#define HWREGBITW(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITH(x, b) \ + HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITB(x, b) \ + HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) + +#endif // __HW_TYPES_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_uart.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_uart.h new file mode 100644 index 0000000..6f421b6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_uart.h @@ -0,0 +1,239 @@ +//***************************************************************************** +// +// hw_uart.h - Macros and defines used when accessing the UART hardware +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_UART_H__ +#define __HW_UART_H__ + +//***************************************************************************** +// +// UART Register Offsets. +// +//***************************************************************************** +#define UART_O_DR 0x00000000 // Data Register +#define UART_O_RSR 0x00000004 // Receive Status Register (read) +#define UART_O_ECR 0x00000004 // Error Clear Register (write) +#define UART_O_FR 0x00000018 // Flag Register (read only) +#define UART_O_IBRD 0x00000024 // Integer Baud Rate Divisor Reg +#define UART_O_FBRD 0x00000028 // Fractional Baud Rate Divisor Reg +#define UART_O_LCR_H 0x0000002C // Line Control Register, HIGH byte +#define UART_O_CTL 0x00000030 // Control Register +#define UART_O_IFLS 0x00000034 // Interrupt FIFO Level Select Reg +#define UART_O_IM 0x00000038 // Interrupt Mask Set/Clear Reg +#define UART_O_RIS 0x0000003C // Raw Interrupt Status Register +#define UART_O_MIS 0x00000040 // Masked Interrupt Status Register +#define UART_O_ICR 0x00000044 // Interrupt Clear Register +#define UART_O_PeriphID4 0x00000FD0 // +#define UART_O_PeriphID5 0x00000FD4 // +#define UART_O_PeriphID6 0x00000FD8 // +#define UART_O_PeriphID7 0x00000FDC // +#define UART_O_PeriphID0 0x00000FE0 // +#define UART_O_PeriphID1 0x00000FE4 // +#define UART_O_PeriphID2 0x00000FE8 // +#define UART_O_PeriphID3 0x00000FEC // +#define UART_O_PCellID0 0x00000FF0 // +#define UART_O_PCellID1 0x00000FF4 // +#define UART_O_PCellID2 0x00000FF8 // +#define UART_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// Data Register bits +// +//***************************************************************************** +#define UART_DR_OE 0x00000800 // Overrun Error +#define UART_DR_BE 0x00000400 // Break Error +#define UART_DR_PE 0x00000200 // Parity Error +#define UART_DR_FE 0x00000100 // Framing Error +#define UART_DR_DATA_MASK 0x000000FF // UART data + +//***************************************************************************** +// +// Receive Status Register bits +// +//***************************************************************************** +#define UART_RSR_OE 0x00000008 // Overrun Error +#define UART_RSR_BE 0x00000004 // Break Error +#define UART_RSR_PE 0x00000002 // Parity Error +#define UART_RSR_FE 0x00000001 // Framing Error + +//***************************************************************************** +// +// Flag Register bits +// +//***************************************************************************** +#define UART_FR_TXFE 0x00000080 // TX FIFO Empty +#define UART_FR_RXFF 0x00000040 // RX FIFO Full +#define UART_FR_TXFF 0x00000020 // TX FIFO Full +#define UART_FR_RXFE 0x00000010 // RX FIFO Empty +#define UART_FR_BUSY 0x00000008 // UART Busy + +//***************************************************************************** +// +// Integer baud-rate divisor +// +//***************************************************************************** +#define UART_IBRD_DIVINT_MASK 0x0000FFFF // Integer baud-rate divisor + +//***************************************************************************** +// +// Fractional baud-rate divisor +// +//***************************************************************************** +#define UART_FBRD_DIVFRAC_MASK 0x0000003F // Fractional baud-rate divisor + +//***************************************************************************** +// +// Line Control Register High bits +// +//***************************************************************************** +#define UART_LCR_H_SPS 0x00000080 // Stick Parity Select +#define UART_LCR_H_WLEN 0x00000060 // Word length +#define UART_LCR_H_WLEN_8 0x00000060 // 8 bit data +#define UART_LCR_H_WLEN_7 0x00000040 // 7 bit data +#define UART_LCR_H_WLEN_6 0x00000020 // 6 bit data +#define UART_LCR_H_WLEN_5 0x00000000 // 5 bit data +#define UART_LCR_H_FEN 0x00000010 // Enable FIFO +#define UART_LCR_H_STP2 0x00000008 // Two Stop Bits Select +#define UART_LCR_H_EPS 0x00000004 // Even Parity Select +#define UART_LCR_H_PEN 0x00000002 // Parity Enable +#define UART_LCR_H_BRK 0x00000001 // Send Break + +//***************************************************************************** +// +// Control Register bits +// +//***************************************************************************** +#define UART_CTL_RXE 0x00000200 // Receive Enable +#define UART_CTL_TXE 0x00000100 // Transmit Enable +#define UART_CTL_LBE 0x00000080 // Loopback Enable +#define UART_CTL_UARTEN 0x00000001 // UART Enable + +//***************************************************************************** +// +// Interrupt FIFO Level Select Register bits +// +//***************************************************************************** +#define UART_IFLS_RX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_RX2_8 0x00000010 // 1/4 Full +#define UART_IFLS_RX4_8 0x00000020 // 1/2 Full +#define UART_IFLS_RX6_8 0x00000030 // 3/4 Full +#define UART_IFLS_RX7_8 0x00000040 // 7/8 Full +#define UART_IFLS_TX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_TX2_8 0x00000001 // 1/4 Full +#define UART_IFLS_TX4_8 0x00000002 // 1/2 Full +#define UART_IFLS_TX6_8 0x00000003 // 3/4 Full +#define UART_IFLS_TX7_8 0x00000004 // 7/8 Full + +//***************************************************************************** +// +// Interrupt Mask Set/Clear Register bits +// +//***************************************************************************** +#define UART_IM_OEIM 0x00000400 // Overrun Error Interrupt Mask +#define UART_IM_BEIM 0x00000200 // Break Error Interrupt Mask +#define UART_IM_PEIM 0x00000100 // Parity Error Interrupt Mask +#define UART_IM_FEIM 0x00000080 // Framing Error Interrupt Mask +#define UART_IM_RTIM 0x00000040 // Receive Timeout Interrupt Mask +#define UART_IM_TXIM 0x00000020 // Transmit Interrupt Mask +#define UART_IM_RXIM 0x00000010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Raw Interrupt Status Register +// +//***************************************************************************** +#define UART_RIS_OERIS 0x00000400 // Overrun Error Interrupt Status +#define UART_RIS_BERIS 0x00000200 // Break Error Interrupt Status +#define UART_RIS_PERIS 0x00000100 // Parity Error Interrupt Status +#define UART_RIS_FERIS 0x00000080 // Framing Error Interrupt Status +#define UART_RIS_RTRIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_RIS_TXRIS 0x00000020 // Transmit Interrupt Status +#define UART_RIS_RXRIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Masked Interrupt Status Register +// +//***************************************************************************** +#define UART_MIS_OEMIS 0x00000400 // Overrun Error Interrupt Status +#define UART_MIS_BEMIS 0x00000200 // Break Error Interrupt Status +#define UART_MIS_PEMIS 0x00000100 // Parity Error Interrupt Status +#define UART_MIS_FEMIS 0x00000080 // Framing Error Interrupt Status +#define UART_MIS_RTMIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_MIS_TXMIS 0x00000020 // Transmit Interrupt Status +#define UART_MIS_RXMIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Interrupt Clear Register bits +// +//***************************************************************************** +#define UART_ICR_OEIC 0x00000400 // Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x00000200 // Break Error Interrupt Clear +#define UART_ICR_PEIC 0x00000100 // Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x00000080 // Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x00000040 // Receive Timeout Interrupt Clear +#define UART_ICR_TXIC 0x00000020 // Transmit Interrupt Clear +#define UART_ICR_RXIC 0x00000010 // Receive Interrupt Clear + +#define UART_RSR_ANY (UART_RSR_OE | \ + UART_RSR_BE | \ + UART_RSR_PE | \ + UART_RSR_FE) + +//***************************************************************************** +// +// Reset Values for UART Registers. +// +//***************************************************************************** +#define UART_RV_DR 0x00000000 +#define UART_RV_RSR 0x00000000 +#define UART_RV_ECR 0x00000000 +#define UART_RV_FR 0x00000090 +#define UART_RV_IBRD 0x00000000 +#define UART_RV_FBRD 0x00000000 +#define UART_RV_LCR_H 0x00000000 +#define UART_RV_CTL 0x00000300 +#define UART_RV_IFLS 0x00000012 +#define UART_RV_IM 0x00000000 +#define UART_RV_RIS 0x00000000 +#define UART_RV_MIS 0x00000000 +#define UART_RV_ICR 0x00000000 +#define UART_RV_PeriphID4 0x00000000 +#define UART_RV_PeriphID5 0x00000000 +#define UART_RV_PeriphID6 0x00000000 +#define UART_RV_PeriphID7 0x00000000 +#define UART_RV_PeriphID0 0x00000011 +#define UART_RV_PeriphID1 0x00000000 +#define UART_RV_PeriphID2 0x00000018 +#define UART_RV_PeriphID3 0x00000001 +#define UART_RV_PCellID0 0x0000000D +#define UART_RV_PCellID1 0x000000F0 +#define UART_RV_PCellID2 0x00000005 +#define UART_RV_PCellID3 0x000000B1 + +#endif // __HW_UART_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_watchdog.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_watchdog.h new file mode 100644 index 0000000..2b013ad --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/hw_watchdog.h @@ -0,0 +1,116 @@ +//***************************************************************************** +// +// hw_watchdog.h - Macros used when accessing the Watchdog Timer hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_WATCHDOG_H__ +#define __HW_WATCHDOG_H__ + +//***************************************************************************** +// +// The following define the offsets of the Watchdog Timer registers. +// +//***************************************************************************** +#define WDT_O_LOAD 0x00000000 // Load register +#define WDT_O_VALUE 0x00000004 // Current value register +#define WDT_O_CTL 0x00000008 // Control register +#define WDT_O_ICR 0x0000000C // Interrupt clear register +#define WDT_O_RIS 0x00000010 // Raw interrupt status register +#define WDT_O_MIS 0x00000014 // Masked interrupt status register +#define WDT_O_TEST 0x00000418 // Test register +#define WDT_O_LOCK 0x00000C00 // Lock register +#define WDT_O_PeriphID4 0x00000FD0 // +#define WDT_O_PeriphID5 0x00000FD4 // +#define WDT_O_PeriphID6 0x00000FD8 // +#define WDT_O_PeriphID7 0x00000FDC // +#define WDT_O_PeriphID0 0x00000FE0 // +#define WDT_O_PeriphID1 0x00000FE4 // +#define WDT_O_PeriphID2 0x00000FE8 // +#define WDT_O_PeriphID3 0x00000FEC // +#define WDT_O_PCellID0 0x00000FF0 // +#define WDT_O_PCellID1 0x00000FF4 // +#define WDT_O_PCellID2 0x00000FF8 // +#define WDT_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the WDT_CTL register. +// +//***************************************************************************** +#define WDT_CTL_RESEN 0x00000002 // Enable reset output +#define WDT_CTL_INTEN 0x00000001 // Enable the WDT counter and int + +//***************************************************************************** +// +// The following define the bit fields in the WDT_ISR, WDT_RIS, and WDT_MIS +// registers. +// +//***************************************************************************** +#define WDT_INT_TIMEOUT 0x00000001 // Watchdog timer expired + +//***************************************************************************** +// +// The following define the bit fields in the WDT_TEST register. +// +//***************************************************************************** +#define WDT_TEST_STALL 0x00000100 // Watchdog stall enable +#ifndef DEPRECATED +#define WDT_TEST_STALL_EN 0x00000100 // Watchdog stall enable +#endif + +//***************************************************************************** +// +// The following define the bit fields in the WDT_LOCK register. +// +//***************************************************************************** +#define WDT_LOCK_LOCKED 0x00000001 // Watchdog timer is locked +#define WDT_LOCK_UNLOCKED 0x00000000 // Watchdog timer is unlocked +#define WDT_LOCK_UNLOCK 0x1ACCE551 // Unlocks the watchdog timer + +//***************************************************************************** +// +// The following define the reset values for the WDT registers. +// +//***************************************************************************** +#define WDT_RV_LOAD 0xFFFFFFFF // Load register +#define WDT_RV_VALUE 0xFFFFFFFF // Current value register +#define WDT_RV_CTL 0x00000000 // Control register +#define WDT_RV_RIS 0x00000000 // Raw interrupt status register +#define WDT_RV_MIS 0x00000000 // Masked interrupt status register +#define WDT_RV_LOCK 0x00000000 // Lock register +#define WDT_RV_PeriphID4 0x00000000 // +#define WDT_RV_PeriphID5 0x00000000 // +#define WDT_RV_PeriphID6 0x00000000 // +#define WDT_RV_PeriphID7 0x00000000 // +#define WDT_RV_PeriphID0 0x00000005 // +#define WDT_RV_PeriphID1 0x00000018 // +#define WDT_RV_PeriphID2 0x00000018 // +#define WDT_RV_PeriphID3 0x00000001 // +#define WDT_RV_PCellID0 0x0000000D // +#define WDT_RV_PCellID1 0x000000F0 // +#define WDT_RV_PCellID2 0x00000005 // +#define WDT_RV_PCellID3 0x000000B1 // + +#endif // __HW_WATCHDOG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/i2c.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/i2c.c new file mode 100644 index 0000000..b460ad6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/i2c.c @@ -0,0 +1,972 @@ +//***************************************************************************** +// +// i2c.c - Driver for Inter-IC (I2C) bus block. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup i2c_api +//! @{ +// +//***************************************************************************** + +#include "../hw_i2c.h" +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_types.h" +#include "debug.h" +#include "i2c.h" +#include "interrupt.h" +#include "sysctl.h" + +//***************************************************************************** +// +//! Initializes the I2C Master block. +//! +//! \param ulBase base address of the I2C Master module +//! \param bFast set up for fast data transfers +//! +//! This function initializes operation of the I2C Master block. Upon +//! successful initialization of the I2C block, this function will have +//! set the bus speed for the master, and will have enabled the I2C Master +//! block. +//! +//! If the parameter \e bFast is \b true, then the master block will be +//! set up to transfer data at 400 kbps; otherwise, it will be set up to +//! transfer data at 100 kbps. +//! +//! The I2C clocking is dependent upon the system clock rate returned by +//! SysCtlClockGet(); if it does not return the correct system clock rate then +//! the I2C clock rate will be incorrect. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterinit) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterInit(unsigned long ulBase, tBoolean bFast) +{ + unsigned long ulSysClk; + unsigned long ulSCLFreq; + unsigned long ulTPR; + + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Must enable the device before doing anything else. + // + I2CMasterEnable(ulBase); + + // + // Get the system clock speed. + // + ulSysClk = SysCtlClockGet(); + + // + // Get the desired SCL speed. + // + if(bFast == true) + { + ulSCLFreq = I2C_SCL_FAST; + } + else + { + ulSCLFreq = I2C_SCL_STANDARD; + } + + // + // Compute the clock divider that achieves the fastest speed less than or + // equal to the desired speed. The numerator is biases to favor a larger + // clock divider so that the resulting clock is always less than or equal + // to the desired clock, never greater. + // + ulTPR = (((ulSysClk + (2 * I2C_MASTER_TPR_SCL * ulSCLFreq) - 1) / + (2 * I2C_MASTER_TPR_SCL * ulSCLFreq)) - 1); + HWREG(ulBase + I2C_MASTER_O_TPR) = ulTPR; +} +#endif + +//***************************************************************************** +// +//! Initializes the I2C Slave block. +//! +//! \param ulBase base address of the I2C Slave module +//! \param ucSlaveAddr 7-bit slave address +//! +//! This function initializes operation of the I2C Slave block. Upon +//! successful initialization of the I2C blocks, this function will have +//! set the slave address and have enabled the I2C Slave block. +//! +//! The parameter \e ucSlaveAddr is the value that will be compared +//! against the slave address sent by an I2C master. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slaveinit) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveInit(unsigned long ulBase, unsigned char ucSlaveAddr) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + ASSERT(!(ucSlaveAddr & 0x80)); + + // + // Must enable the device before doing anything else. + // + I2CSlaveEnable(ulBase); + + // + // Set up the slave address. + // + HWREG(ulBase + I2C_SLAVE_O_OAR) = ucSlaveAddr; +} +#endif + +//***************************************************************************** +// +//! Enables the I2C Master block. +//! +//! \param ulBase base address of the I2C Master module +//! +//! This will enable operation of the I2C Master block. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Enable the master block. + // + HWREG(ulBase + I2C_MASTER_O_CR) |= I2C_MASTER_CR_MFE; +} +#endif + +//***************************************************************************** +// +//! Enables the I2C Slave block. +//! +//! \param ulBase base address of the I2C Slave module +//! +//! This will enable operation of the I2C Slave block. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slaveenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Enable the clock to the slave block. + // + HWREG(ulBase - I2C_O_SLAVE + I2C_MASTER_O_CR) |= I2C_MASTER_CR_SFE; + + // + // Enable the slave. + // + HWREG(ulBase + I2C_SLAVE_O_CSR) = I2C_SLAVE_CSR_DA; +} +#endif + +//***************************************************************************** +// +//! Disables the I2C master block. +//! +//! \param ulBase base address of the I2C Master module +//! +//! This will disable operation of the I2C master block. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Disable the master block. + // + HWREG(ulBase + I2C_MASTER_O_CR) &= ~(I2C_MASTER_CR_MFE); +} +#endif + +//***************************************************************************** +// +//! Disables the I2C slave block. +//! +//! \param ulBase base address of the I2C Slave module +//! +//! This will disable operation of the I2C slave block. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slavedisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Disable the slave. + // + HWREG(ulBase + I2C_SLAVE_O_CSR) = 0; + + // + // Disable the clock to the slave block. + // + HWREG(ulBase - I2C_O_SLAVE + I2C_MASTER_O_CR) &= ~(I2C_MASTER_CR_SFE); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the I2C module +//! +//! \param ulBase base address of the I2C module +//! \param pfnHandler is a pointer to the function to be called when the +//! synchronous serial interface interrupt occurs. +//! +//! This sets the handler to be called when an I2C interrupt occurs. This +//! will enable the global interrupt in the interrupt controller; specific I2C +//! interrupts must be enabled via I2CMasterIntEnable() and +//! I2CSlaveIntEnable(). If necessary, it is the interrupt handler's +//! responsibility to clear the interrupt source via I2CMasterIntClear() and +//! I2CSlaveIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CIntRegister(unsigned long ulBase, void (*pfnHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(INT_I2C, pfnHandler); + + // + // Enable the I2C interrupt. + // + IntEnable(INT_I2C); +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for the I2C module. +//! +//! \param ulBase base address of the I2C module +//! +//! This function will clear the handler to be called when an I2C +//! interrupt occurs. This will also mask off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CIntUnregister(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Disable the interrupt. + // + IntDisable(INT_I2C); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_I2C); +} +#endif + +//***************************************************************************** +// +//! Enables the I2C Master interrupt. +//! +//! \param ulBase base address of the I2C Master module +//! +//! Enables the I2C Master interrupt source. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterintenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterIntEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Enable the master interrupt. + // + HWREG(ulBase + I2C_MASTER_O_IMR) = 1; +} +#endif + +//***************************************************************************** +// +//! Enables the I2C Slave interrupt. +//! +//! \param ulBase base address of the I2C Slave module +//! +//! Enables the I2C Slave interrupt source. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slaveintenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveIntEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Enable the slave interrupt. + // + HWREG(ulBase + I2C_SLAVE_O_IM) = 1; +} +#endif + +//***************************************************************************** +// +//! Disables the I2C Master interrupt. +//! +//! \param ulBase base address of the I2C Master module +//! +//! Disables the I2C Master interrupt source. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterintdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterIntDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Disable the master interrupt. + // + HWREG(ulBase + I2C_MASTER_O_IMR) = 0; +} +#endif + +//***************************************************************************** +// +//! Disables the I2C Slave interrupt. +//! +//! \param ulBase base address of the I2C Slave module +//! +//! Disables the I2C Slave interrupt source. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slaveintdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveIntDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Disable the slave interrupt. + // + HWREG(ulBase + I2C_SLAVE_O_IM) = 0; +} +#endif + +//***************************************************************************** +// +//! Gets the current I2C Master interrupt status. +//! +//! \param ulBase base address of the I2C Master module +//! \param bMasked is false if the raw interrupt status is requested and +//! true if the masked interrupt status is requested. +//! +//! This returns the interrupt status for the I2C Master module. +//! Either the raw interrupt status or the status of interrupts that are +//! allowed to reflect to the processor can be returned. +//! +//! \return The current interrupt status, returned as \b true if active +//! or \b false if not active. +// +//***************************************************************************** +#if defined(GROUP_masterintstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +I2CMasterIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return((HWREG(ulBase + I2C_MASTER_O_MIS)) ? true : false); + } + else + { + return((HWREG(ulBase + I2C_MASTER_O_RIS)) ? true : false); + } +} +#endif + +//***************************************************************************** +// +//! Gets the current I2C Slave interrupt status. +//! +//! \param ulBase base address of the I2C Slave module +//! \param bMasked is false if the raw interrupt status is requested and +//! true if the masked interrupt status is requested. +//! +//! This returns the interrupt status for the I2C Slave module. +//! Either the raw interrupt status or the status of interrupts that are +//! allowed to reflect to the processor can be returned. +//! +//! \return The current interrupt status, returned as \b true if active +//! or \b false if not active. +// +//***************************************************************************** +#if defined(GROUP_slaveintstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +I2CSlaveIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return((HWREG(ulBase + I2C_SLAVE_O_MIS)) ? true : false); + } + else + { + return((HWREG(ulBase + I2C_SLAVE_O_RIS)) ? true : false); + } +} +#endif + +//***************************************************************************** +// +//! Clears I2C Master interrupt sources. +//! +//! \param ulBase base address of the I2C Master module +//! +//! The I2C Master interrupt source is cleared, so that it no longer asserts. +//! This must be done in the interrupt handler to keep it from being called +//! again immediately upon exit. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterintclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterIntClear(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Clear the I2C master interrupt source. + // + HWREG(ulBase + I2C_MASTER_O_MICR) = I2C_MASTER_MICR_IC; + + // + // Workaround for I2C master interrupt clear errata for rev B Stellaris + // devices. For later devices, this write is ignored and therefore + // harmless (other than the slight performance hit). + // + HWREG(ulBase + I2C_MASTER_O_MIS) = I2C_MASTER_MICR_IC; +} +#endif + +//***************************************************************************** +// +//! Clears I2C Slave interrupt sources. +//! +//! \param ulBase base address of the I2C Slave module +//! +//! The I2C Slave interrupt source is cleared, so that it no longer asserts. +//! This must be done in the interrupt handler to keep it from being called +//! again immediately upon exit. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slaveintclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveIntClear(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Clear the I2C slave interrupt source. + // + HWREG(ulBase + I2C_SLAVE_O_SICR) = I2C_SLAVE_SICR_IC; +} +#endif + +//***************************************************************************** +// +//! Sets the address that the I2C Master will place on the bus. +//! +//! \param ulBase base address of the I2C Master module +//! \param ucSlaveAddr 7-bit slave address +//! \param bReceive flag indicating the type of communication with the slave +//! +//! This function will set the address that the I2C Master will place on the +//! bus when initiating a transaction. When the parameter \e bReceive is set +//! to \b true, the address will indicate that the I2C Master is initiating +//! a read from the slave; otherwise the address will indicate that the I2C +//! Master is initiating a write to the slave. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterslaveaddrset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterSlaveAddrSet(unsigned long ulBase, unsigned char ucSlaveAddr, + tBoolean bReceive) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + ASSERT(!(ucSlaveAddr & 0x80)); + + // + // Set the address of the slave with which the master will communicate. + // + HWREG(ulBase + I2C_MASTER_O_SA) = (ucSlaveAddr << 1) | bReceive; +} +#endif + +//***************************************************************************** +// +//! Indicates whether or not the I2C Master is busy. +//! +//! \param ulBase base address of the I2C Master module +//! +//! This function returns an indication of whether or not the I2C Master is +//! busy transmitting or receiving data. +//! +//! \return Returns \b true if the I2C Master is busy; otherwise, returns +//! \b false. +// +//***************************************************************************** +#if defined(GROUP_masterbusy) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +I2CMasterBusy(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Return the busy status. + // + if(HWREG(ulBase + I2C_MASTER_O_CS) & I2C_MASTER_CS_BUSY) + { + return(true); + } + else + { + return(false); + } +} +#endif + +//***************************************************************************** +// +//! Indicates whether or not the I2C bus is busy. +//! +//! \param ulBase base address of the I2C Master module +//! +//! This function returns an indication of whether or not the I2C bus is +//! busy. This function can be used in a multi-master environment to +//! determine if another master is currently using the bus. +//! +//! \return Returns \b true if the I2C bus is busy; otherwise, returns +//! \b false. +// +//***************************************************************************** +#if defined(GROUP_masterbusbusy) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +I2CMasterBusBusy(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Return the bus busy status. + // + if(HWREG(ulBase + I2C_MASTER_O_CS) & I2C_MASTER_CS_BUS_BUSY) + { + return(true); + } + else + { + return(false); + } +} +#endif + +//***************************************************************************** +// +//! Controls the state of the I2C Master module. +//! +//! \param ulBase base address of the I2C Master module +//! \param ulCmd command to be issued to the I2C Master module +//! +//! This function is used to control the state of the Master module send and +//! receive operations. The parameter \e ucCmd can be one of the following +//! values: +//! +//! - I2C_MASTER_CMD_SINGLE_SEND +//! - I2C_MASTER_CMD_SINGLE_RECEIVE +//! - I2C_MASTER_CMD_BURST_SEND_START +//! - I2C_MASTER_CMD_BURST_SEND_CONT +//! - I2C_MASTER_CMD_BURST_SEND_FINISH +//! - I2C_MASTER_CMD_BURST_SEND_ERROR_STOP +//! - I2C_MASTER_CMD_BURST_RECEIVE_START +//! - I2C_MASTER_CMD_BURST_RECEIVE_CONT +//! - I2C_MASTER_CMD_BURST_RECEIVE_FINISH +//! - I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_mastercontrol) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterControl(unsigned long ulBase, unsigned long ulCmd) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + ASSERT((ulCmd == I2C_MASTER_CMD_SINGLE_SEND) || + (ulCmd == I2C_MASTER_CMD_SINGLE_RECEIVE) || + (ulCmd == I2C_MASTER_CMD_BURST_SEND_START) || + (ulCmd == I2C_MASTER_CMD_BURST_SEND_CONT) || + (ulCmd == I2C_MASTER_CMD_BURST_SEND_FINISH) || + (ulCmd == I2C_MASTER_CMD_BURST_SEND_ERROR_STOP) || + (ulCmd == I2C_MASTER_CMD_BURST_RECEIVE_START) || + (ulCmd == I2C_MASTER_CMD_BURST_RECEIVE_CONT) || + (ulCmd == I2C_MASTER_CMD_BURST_RECEIVE_FINISH) || + (ulCmd == I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP)); + + // + // Send the command. + // + HWREG(ulBase + I2C_MASTER_O_CS) = ulCmd; +} +#endif + +//***************************************************************************** +// +//! Gets the error status of the I2C Master module. +//! +//! \param ulBase base address of the I2C Master module +//! +//! This function is used to obtain the error status of the Master module +//! send and receive operations. It returns one of the following values: +//! +//! - I2C_MASTER_ERR_NONE +//! - I2C_MASTER_ERR_ADDR_ACK +//! - I2C_MASTER_ERR_DATA_ACK +//! - I2C_MASTER_ERR_ARB_LOST +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_mastererr) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +I2CMasterErr(unsigned long ulBase) +{ + unsigned long ulErr; + + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Get the raw error state + // + ulErr = HWREG(ulBase + I2C_MASTER_O_CS); + + // + // If the I2C master is busy, then all the other bit are invalid, and + // don't have an error to report. + // + if(ulErr & I2C_MASTER_CS_BUSY) + { + return(I2C_MASTER_ERR_NONE); + } + + // + // Check for errors. + // + if(ulErr & I2C_MASTER_CS_ERROR) + { + return(ulErr & (I2C_MASTER_CS_ERR_MASK)); + } + else + { + return(I2C_MASTER_ERR_NONE); + } +} +#endif + +//***************************************************************************** +// +//! Transmits a byte from the I2C Master. +//! +//! \param ulBase base address of the I2C Master module +//! \param ucData data to be transmitted from the I2C Master +//! +//! This function will place the supplied data into I2C Master Data Register. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterdataput) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterDataPut(unsigned long ulBase, unsigned char ucData) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Write the byte. + // + HWREG(ulBase + I2C_MASTER_O_DR) = ucData; +} +#endif + +//***************************************************************************** +// +//! Receives a byte that has been sent to the I2C Master. +//! +//! \param ulBase base address of the I2C Master module +//! +//! This function reads a byte of data from the I2C Master Data Register. +//! +//! \return Returns the byte received from by the I2C Master, cast as an +//! unsigned long. +// +//***************************************************************************** +#if defined(GROUP_masterdataget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +I2CMasterDataGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Read a byte. + // + return(HWREG(ulBase + I2C_MASTER_O_DR)); +} +#endif + +//***************************************************************************** +// +//! Gets the I2C Slave module status +//! +//! \param ulBase base address of the I2C Slave module +//! +//! This function will return the action requested from a master, if any. The +//! possible values returned are: +//! +//! - I2C_SLAVE_ACT_NONE +//! - I2C_SLAVE_ACT_RREQ +//! - I2C_SLAVE_ACT_TREQ +//! +//! where I2C_SLAVE_ACT_NONE means that no action has been requested of the +//! I2C Slave module, I2C_SLAVE_ACT_RREQ means that an I2C master has sent +//! data to the I2C Slave module, and I2C_SLAVE_ACT_TREQ means that an I2C +//! master has requested that the I2C Slave module send data. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slavestatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +I2CSlaveStatus(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Return the slave status. + // + return(HWREG(ulBase + I2C_SLAVE_O_CSR)); +} +#endif + +//***************************************************************************** +// +//! Transmits a byte from the I2C Slave. +//! +//! \param ulBase base address of the I2C Slave module +//! \param ucData data to be transmitted from the I2C Slave +//! +//! This function will place the supplied data into I2C Slave Data Register. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slavedataput) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveDataPut(unsigned long ulBase, unsigned char ucData) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Write the byte. + // + HWREG(ulBase + I2C_SLAVE_O_DR) = ucData; +} +#endif + +//***************************************************************************** +// +//! Receives a byte that has been sent to the I2C Slave. +//! +//! \param ulBase base address of the I2C Slave module +//! +//! This function reads a byte of data from the I2C Slave Data Register. +//! +//! \return Returns the byte received from by the I2C Slave, cast as an +//! unsigned long. +// +//***************************************************************************** +#if defined(GROUP_slavedataget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +I2CSlaveDataGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Read a byte. + // + return(HWREG(ulBase + I2C_SLAVE_O_DR)); +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/i2c.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/i2c.h new file mode 100644 index 0000000..bfe8c85 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/i2c.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// i2c.h - Prototypes for the I2C Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Interrupt defines. +// +//***************************************************************************** +#define I2C_INT_MASTER 0x00000001 +#define I2C_INT_SLAVE 0x00000002 + +//***************************************************************************** +// +// I2C Master commands. +// +//***************************************************************************** +#define I2C_MASTER_CMD_SINGLE_SEND \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_SINGLE_RECEIVE \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_START \ + (I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_CONT \ + (I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_ERROR_STOP \ + (I2C_MASTER_CS_STOP) +#define I2C_MASTER_CMD_BURST_RECEIVE_START \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_CONT \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) + +//***************************************************************************** +// +// I2C Master error status. +// +//***************************************************************************** +#define I2C_MASTER_ERR_NONE 0 +#define I2C_MASTER_ERR_ADDR_ACK 0x00000004 +#define I2C_MASTER_ERR_DATA_ACK 0x00000008 +#define I2C_MASTER_ERR_ARB_LOST 0x00000010 + +//***************************************************************************** +// +// I2C Slave action requests +// +//***************************************************************************** +#define I2C_SLAVE_ACT_NONE 0 +#define I2C_SLAVE_ACT_RREQ 0x00000001 // Master has sent data +#define I2C_SLAVE_ACT_TREQ 0x00000002 // Master has requested data + +//***************************************************************************** +// Miscellaneous I2C driver definitions. +//***************************************************************************** +#define I2C_MASTER_MAX_RETRIES 1000 // Number of retries + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void I2CIntRegister(unsigned long ulBase, void(fnHandler)(void)); +extern void I2CIntUnregister(unsigned long ulBase); +extern tBoolean I2CMasterBusBusy(unsigned long ulBase); +extern tBoolean I2CMasterBusy(unsigned long ulBase); +extern void I2CMasterControl(unsigned long ulBase, unsigned long ulCmd); +extern unsigned long I2CMasterDataGet(unsigned long ulBase); +extern void I2CMasterDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CMasterDisable(unsigned long ulBase); +extern void I2CMasterEnable(unsigned long ulBase); +extern unsigned long I2CMasterErr(unsigned long ulBase); +extern void I2CMasterInit(unsigned long ulBase, tBoolean bFast); +extern void I2CMasterIntClear(unsigned long ulBase); +extern void I2CMasterIntDisable(unsigned long ulBase); +extern void I2CMasterIntEnable(unsigned long ulBase); +extern tBoolean I2CMasterIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void I2CMasterSlaveAddrSet(unsigned long ulBase, + unsigned char ucSlaveAddr, + tBoolean bReceive); +extern unsigned long I2CSlaveDataGet(unsigned long ulBase); +extern void I2CSlaveDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CSlaveDisable(unsigned long ulBase); +extern void I2CSlaveEnable(unsigned long ulBase); +extern void I2CSlaveInit(unsigned long ulBase, unsigned char ucSlaveAddr); +extern void I2CSlaveIntClear(unsigned long ulBase); +extern void I2CSlaveIntDisable(unsigned long ulBase); +extern void I2CSlaveIntEnable(unsigned long ulBase); +extern tBoolean I2CSlaveIntStatus(unsigned long ulBase, tBoolean bMasked); +extern unsigned long I2CSlaveStatus(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __I2C_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/interrupt.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/interrupt.c new file mode 100644 index 0000000..7224a05 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/interrupt.c @@ -0,0 +1,552 @@ +//***************************************************************************** +// +// interrupt.c - Driver for the NVIC Interrupt Controller. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup interrupt_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_nvic.h" +#include "../hw_types.h" +#include "cpu.h" +#include "debug.h" +#include "interrupt.h" + +//***************************************************************************** +// +// This is a mapping between priority grouping encodings and the number of +// preemption priority bits. +// +//***************************************************************************** +#if defined(GROUP_pulpriority) || defined(BUILD_ALL) +const unsigned long g_pulPriority[] = +{ + NVIC_APINT_PRIGROUP_0_8, NVIC_APINT_PRIGROUP_1_7, NVIC_APINT_PRIGROUP_2_6, + NVIC_APINT_PRIGROUP_3_5, NVIC_APINT_PRIGROUP_4_4, NVIC_APINT_PRIGROUP_5_3, + NVIC_APINT_PRIGROUP_6_2, NVIC_APINT_PRIGROUP_7_1 +}; +#else +extern const unsigned long g_pulPriority[]; +#endif + +//***************************************************************************** +// +// This is a mapping between interrupt number and the register that contains +// the priority encoding for that interrupt. +// +//***************************************************************************** +#if defined(GROUP_pulregs) || defined(BUILD_ALL) +const unsigned long g_pulRegs[12] = +{ + 0, NVIC_SYS_PRI1, NVIC_SYS_PRI2, NVIC_SYS_PRI3, NVIC_PRI0, NVIC_PRI1, + NVIC_PRI2, NVIC_PRI3, NVIC_PRI4, NVIC_PRI5, NVIC_PRI6, NVIC_PRI7 +}; +#else +extern const unsigned long g_pulRegs[12]; +#endif + +//***************************************************************************** +// +//! \internal +//! The default interrupt handler. +//! +//! This is the default interrupt handler for all interrupts. It simply loops +//! forever so that the system state is preserved for observation by a +//! debugger. Since interrupts should be disabled before unregistering the +//! corresponding handler, this should never be called. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_defaulthandler) || defined(BUILD_ALL) +void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} +#else +extern void IntDefaultHandler(void); +#endif + +//***************************************************************************** +// +// The processor vector table. +// +// This contains a list of the handlers for the various interrupt sources in +// the system. The layout of this list is defined by the hardware; assertion +// of an interrupt causes the processor to start executing directly at the +// address given in the corresponding location in this list. +// +//***************************************************************************** +#if defined(GROUP_vtable) || defined(BUILD_ALL) +#ifdef ewarm +__no_init void (*g_pfnRAMVectors[NUM_INTERRUPTS])(void) @ "VTABLE"; +#else +__attribute__((section("vtable"))) +void (*g_pfnRAMVectors[NUM_INTERRUPTS])(void); +#endif +#else +extern void (*g_pfnRAMVectors[NUM_INTERRUPTS])(void); +#endif + +//***************************************************************************** +// +//! Enables the processor interrupt. +//! +//! Allows the processor to respond to interrupts. This does not affect the +//! set of interrupts enabled in the interrupt controller; it just gates the +//! single interrupt from the controller to the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntMasterEnable(void) +{ + // + // Enable processor interrupts. + // + CPUcpsie(); +} +#endif + +//***************************************************************************** +// +//! Disables the processor interrupt. +//! +//! Prevents the processor from receiving interrupts. This does not affect the +//! set of interrupts enabled in the interrupt controller; it just gates the +//! single interrupt from the controller to the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntMasterDisable(void) +{ + // + // Disable processor interrupts. + // + CPUcpsid(); +} +#endif + +//***************************************************************************** +// +//! Registers a function to be called when an interrupt occurs. +//! +//! \param ulInterrupt specifies the interrupt in question. +//! \param pfnHandler is a pointer to the function to be called. +//! +//! This function is used to specify the handler function to be called when the +//! given interrupt is asserted to the processor. When the interrupt occurs, +//! if it is enabled (via IntEnable()), the handler function will be called in +//! interrupt context. Since the handler function can preempt other code, care +//! must be taken to protect memory or peripherals that are accessed by the +//! handler and other non-handler code. +//! +//! \note The use of this function (directly or indirectly via a peripheral +//! driver interrupt register function) moves the interrupt vector table from +//! flash to SRAM. Therefore, care must be taken when linking the application +//! to ensure that the SRAM vector table is located at the beginning of SRAM; +//! otherwise NVIC will not look in the correct portion of memory for the +//! vector table (it requires the vector table be on a 1 kB memory alignment). +//! Normally, the SRAM vector table is so placed via the use of linker scripts; +//! some tool chains, such as the evaluation version of RV-MDK, do not support +//! linker scripts and therefore will not produce a valid executable. See the +//! discussion of compile-time versus run-time interrupt handler registration +//! in the introduction to this chapter. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_register) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)) +{ + unsigned long ulIdx; + + // + // Check the arguments. + // + ASSERT(ulInterrupt < NUM_INTERRUPTS); + + // + // Make sure that the RAM vector table is correctly aligned. + // + ASSERT(((unsigned long)g_pfnRAMVectors & 0x000003ff) == 0); + + // + // See if the RAM vector table has been initialized. + // + if(HWREG(NVIC_VTABLE) != (unsigned long)g_pfnRAMVectors) + { + // + // Copy the vector table from the beginning of FLASH to the RAM vector + // table. + // + for(ulIdx = 0; ulIdx < NUM_INTERRUPTS; ulIdx++) + { + g_pfnRAMVectors[ulIdx] = (void (*)(void))HWREG(ulIdx * 4); + } + + // + // Point NVIC at the RAM vector table. + // + HWREG(NVIC_VTABLE) = (unsigned long)g_pfnRAMVectors; + } + + // + // Save the interrupt handler. + // + g_pfnRAMVectors[ulInterrupt] = pfnHandler; +} +#endif + +//***************************************************************************** +// +//! Unregisters the function to be called when an interrupt occurs. +//! +//! \param ulInterrupt specifies the interrupt in question. +//! +//! This function is used to indicate that no handler should be called when the +//! given interrupt is asserted to the processor. The interrupt source will be +//! automatically disabled (via IntDisable()) if necessary. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_unregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntUnregister(unsigned long ulInterrupt) +{ + // + // Check the arguments. + // + ASSERT(ulInterrupt < NUM_INTERRUPTS); + + // + // Reset the interrupt handler. + // + g_pfnRAMVectors[ulInterrupt] = IntDefaultHandler; +} +#endif + +//***************************************************************************** +// +//! Sets the priority grouping of the interrupt controller. +//! +//! \param ulBits specifies the number of bits of preemptable priority. +//! +//! This function specifies the split between preemptable priority levels and +//! subpriority levels in the interrupt priority specification. The range of +//! the grouping values are dependent upon the hardware implementation; on +//! the Stellaris family it can range from 0 to 3. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_prioritygroupingset) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +IntPriorityGroupingSet(unsigned long ulBits) +{ + // + // Check the arguments. + // + ASSERT(ulBits < NUM_PRIORITY_BITS); + + // + // Set the priority grouping. + // + HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | g_pulPriority[ulBits]; +} +#endif + +//***************************************************************************** +// +//! Gets the priority grouping of the interrupt controller. +//! +//! This function returns the split between preemptable priority levels and +//! subpriority levels in the interrupt priority specification. +//! +//! \return The number of bits of preemptable priority. +// +//***************************************************************************** +#if defined(GROUP_prioritygroupingget) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +unsigned long +IntPriorityGroupingGet(void) +{ + unsigned long ulLoop, ulValue; + + // + // Read the priority grouping. + // + ulValue = HWREG(NVIC_APINT) & NVIC_APINT_PRIGROUP_M; + + // + // Loop through the priority grouping values. + // + for(ulLoop = 0; ulLoop < 8; ulLoop++) + { + // + // Stop looping if this value matches. + // + if(ulValue == g_pulPriority[ulLoop]) + { + break; + } + } + + // + // Return the number of priority bits. + // + return(ulLoop); +} +#endif + +//***************************************************************************** +// +//! Sets the priority of an interrupt. +//! +//! \param ulInterrupt specifies the interrupt in question. +//! \param ucPriority specifies the priority of the interrupt. +//! +//! This function is used to set the priority of an interrupt. When multiple +//! interrupts are asserted simultaneously, the ones with the highest priority +//! are processed before the lower priority interrupts. Smaller numbers +//! correspond to higher interrupt priorities; priority 0 is the highest +//! interrupt priority. +//! +//! The hardware priority mechanism will only look at the upper N bits of the +//! priority level (where N is 3 for the Stellaris family), so any +//! prioritization must be performed in those bits. The remaining bits can be +//! used to sub-prioritize the interrupt sources, and may be used by the +//! hardware priority mechanism on a future part. This arrangement allows +//! priorities to migrate to different NVIC implementations without changing +//! the gross prioritization of the interrupts. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_priorityset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntPrioritySet(unsigned long ulInterrupt, unsigned char ucPriority) +{ + unsigned long ulTemp; + + // + // Check the arguments. + // + ASSERT((ulInterrupt >= 4) && (ulInterrupt < NUM_INTERRUPTS)); + + // + // Set the interrupt priority. + // + ulTemp = HWREG(g_pulRegs[ulInterrupt >> 2]); + ulTemp &= ~(0xFF << (8 * (ulInterrupt & 3))); + ulTemp |= ucPriority << (8 * (ulInterrupt & 3)); + HWREG(g_pulRegs[ulInterrupt >> 2]) = ulTemp; +} +#endif + +//***************************************************************************** +// +//! Gets the priority of an interrupt. +//! +//! \param ulInterrupt specifies the interrupt in question. +//! +//! This function gets the priority of an interrupt. See IntPrioritySet() for +//! a definition of the priority value. +//! +//! \return Returns the interrupt priority, or -1 if an invalid interrupt was +//! specified. +// +//***************************************************************************** +#if defined(GROUP_priorityget) || defined(BUILD_ALL) || defined(DOXYGEN) +long +IntPriorityGet(unsigned long ulInterrupt) +{ + // + // Check the arguments. + // + ASSERT((ulInterrupt >= 4) && (ulInterrupt < NUM_INTERRUPTS)); + + // + // Return the interrupt priority. + // + return((HWREG(g_pulRegs[ulInterrupt >> 2]) >> (8 * (ulInterrupt & 3))) & + 0xFF); +} +#endif + +//***************************************************************************** +// +//! Enables an interrupt. +//! +//! \param ulInterrupt specifies the interrupt to be enabled. +//! +//! The specified interrupt is enabled in the interrupt controller. Other +//! enables for the interrupt (such as at the peripheral level) are unaffected +//! by this function. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntEnable(unsigned long ulInterrupt) +{ + // + // Check the arguments. + // + ASSERT(ulInterrupt < NUM_INTERRUPTS); + + // + // Determine the interrupt to enable. + // + if(ulInterrupt == FAULT_MPU) + { + // + // Enable the MemManage interrupt. + // + HWREG(NVIC_SYS_HND_CTRL) |= NVIC_SYS_HND_CTRL_MEM; + } + else if(ulInterrupt == FAULT_BUS) + { + // + // Enable the bus fault interrupt. + // + HWREG(NVIC_SYS_HND_CTRL) |= NVIC_SYS_HND_CTRL_BUS; + } + else if(ulInterrupt == FAULT_USAGE) + { + // + // Enable the usage fault interrupt. + // + HWREG(NVIC_SYS_HND_CTRL) |= NVIC_SYS_HND_CTRL_USAGE; + } + else if(ulInterrupt == FAULT_SYSTICK) + { + // + // Enable the System Tick interrupt. + // + HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_INTEN; + } + else if(ulInterrupt >= INT_GPIOA) + { + // + // Enable the general interrupt. + // + HWREG(NVIC_EN0) = 1 << (ulInterrupt - INT_GPIOA); + } +} +#endif + +//***************************************************************************** +// +//! Disables an interrupt. +//! +//! \param ulInterrupt specifies the interrupt to be disabled. +//! +//! The specified interrupt is disabled in the interrupt controller. Other +//! enables for the interrupt (such as at the peripheral level) are unaffected +//! by this function. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_disable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntDisable(unsigned long ulInterrupt) +{ + // + // Check the arguments. + // + ASSERT(ulInterrupt < NUM_INTERRUPTS); + + // + // Determine the interrupt to disable. + // + if(ulInterrupt == FAULT_MPU) + { + // + // Disable the MemManage interrupt. + // + HWREG(NVIC_SYS_HND_CTRL) &= ~(NVIC_SYS_HND_CTRL_MEM); + } + else if(ulInterrupt == FAULT_BUS) + { + // + // Disable the bus fault interrupt. + // + HWREG(NVIC_SYS_HND_CTRL) &= ~(NVIC_SYS_HND_CTRL_BUS); + } + else if(ulInterrupt == FAULT_USAGE) + { + // + // Disable the usage fault interrupt. + // + HWREG(NVIC_SYS_HND_CTRL) &= ~(NVIC_SYS_HND_CTRL_USAGE); + } + else if(ulInterrupt == FAULT_SYSTICK) + { + // + // Disable the System Tick interrupt. + // + HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_INTEN); + } + else if(ulInterrupt >= INT_GPIOA) + { + // + // Disable the general interrupt. + // + HWREG(NVIC_DIS0) = 1 << (ulInterrupt - INT_GPIOA); + } +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/interrupt.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/interrupt.h new file mode 100644 index 0000000..37d414d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/interrupt.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// interrupt.h - Prototypes for the NVIC Interrupt Controller Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void IntMasterEnable(void); +extern void IntMasterDisable(void); +extern void IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)); +extern void IntUnregister(unsigned long ulInterrupt); +extern void IntPriorityGroupingSet(unsigned long ulBits); +extern unsigned long IntPriorityGroupingGet(void); +extern void IntPrioritySet(unsigned long ulInterrupt, + unsigned char ucPriority); +extern long IntPriorityGet(unsigned long ulInterrupt); +extern void IntEnable(unsigned long ulInterrupt); +extern void IntDisable(unsigned long ulInterrupt); + +#ifdef __cplusplus +} +#endif + +#endif // __INTERRUPT_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/osram96x16.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/osram96x16.c new file mode 100644 index 0000000..6479049 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/osram96x16.c @@ -0,0 +1,975 @@ +//***************************************************************************** +// +// osram96x16.c - Driver for the OSRAM 96x16 graphical OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1049 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ev_lm3s811_api +//! @{ +// +//***************************************************************************** + +#include "hw_i2c.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "i2c.h" +#include "sysctl.h" +#include "osram96x16.h" + +//***************************************************************************** +// +// The I2C slave address of the SSD0303 controller on the OLED display. +// +//***************************************************************************** +#define SSD0303_ADDR 0x3d + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +//***************************************************************************** +static const unsigned char g_pucFont[95][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD0303 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the I2C transfer, followed by that many bytes of command data. +// +//***************************************************************************** +static const unsigned char g_pucOSRAMInit[] = +{ + // + // Turn off the panel + // + 0x04, 0x80, 0xae, 0x80, 0xe3, + + // + // Set lower column address + // + 0x04, 0x80, 0x04, 0x80, 0xe3, + + // + // Set higher column address + // + 0x04, 0x80, 0x12, 0x80, 0xe3, + + // + // Set contrast control register + // + 0x06, 0x80, 0x81, 0x80, 0x2b, 0x80, 0xe3, + + // + // Set segment re-map + // + 0x04, 0x80, 0xa1, 0x80, 0xe3, + + // + // Set display start line + // + 0x04, 0x80, 0x40, 0x80, 0xe3, + + // + // Set display offset + // + 0x06, 0x80, 0xd3, 0x80, 0x00, 0x80, 0xe3, + + // + // Set multiplex ratio + // + 0x06, 0x80, 0xa8, 0x80, 0x0f, 0x80, 0xe3, + + // + // Set the display to normal mode + // + 0x04, 0x80, 0xa4, 0x80, 0xe3, + + // + // Non-inverted display + // + 0x04, 0x80, 0xa6, 0x80, 0xe3, + + // + // Set the page address + // + 0x04, 0x80, 0xb0, 0x80, 0xe3, + + // + // Set COM output scan direction + // + 0x04, 0x80, 0xc8, 0x80, 0xe3, + + // + // Set display clock divide ratio/oscillator frequency + // + 0x06, 0x80, 0xd5, 0x80, 0x72, 0x80, 0xe3, + + // + // Enable mono mode + // + 0x06, 0x80, 0xd8, 0x80, 0x00, 0x80, 0xe3, + + // + // Set pre-charge period + // + 0x06, 0x80, 0xd9, 0x80, 0x22, 0x80, 0xe3, + + // + // Set COM pins hardware configuration + // + 0x06, 0x80, 0xda, 0x80, 0x12, 0x80, 0xe3, + + // + // Set VCOM deslect level + // + 0x06, 0x80, 0xdb, 0x80, 0x0f, 0x80, 0xe3, + + // + // Set DC-DC on + // + 0x06, 0x80, 0xad, 0x80, 0x8b, 0x80, 0xe3, + + // + // Turn on the panel + // + 0x04, 0x80, 0xaf, 0x80, 0xe3, +}; + +//***************************************************************************** +// +// The inter-byte delay required by the SSD0303 OLED controller. +// +//***************************************************************************** +static unsigned long g_ulDelay; + +//***************************************************************************** +// +//! \internal +//! +//! Provide a small delay. +//! +//! \param ulCount is the number of delay loop iterations to perform. +//! +//! Since the SSD0303 controller needs a delay between bytes written to it over +//! the I2C bus, this function provides a means of generating that delay. It +//! is written in assembly to keep the delay consistent across tool chains, +//! avoiding the need to tune the delay based on the tool chain in use. +//! +//! \return None. +// +//***************************************************************************** +#if defined(ewarm) +static void +OSRAMDelay(unsigned long ulCount) +{ + __asm(" subs r0, #1\n" + " bne OSRAMDelay\n" + " bx lr"); +} +#endif +#if defined(gcc) +static void __attribute__((naked)) +OSRAMDelay(unsigned long ulCount) +{ + __asm(" subs r0, #1\n" + " bne OSRAMDelay\n" + " bx lr"); +} +#endif +#if defined(rvmdk) || defined(__ARMCC_VERSION) +__asm void +OSRAMDelay(unsigned long ulCount) +{ + subs r0, #1; + bne OSRAMDelay; + bx lr; +} +#endif + +//***************************************************************************** +// +//! \internal +//! +//! Start a transfer to the SSD0303 controller. +//! +//! \param ucChar is the first byte to be written to the controller. +//! +//! This function will start a transfer to the SSD0303 controller via the I2C +//! bus. +//! +//! The data is written in a polled fashion; this function will not return +//! until the byte has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteFirst(unsigned char ucChar) +{ + // + // Set the slave address. + // + I2CMasterSlaveAddrSet(I2C_MASTER_BASE, SSD0303_ADDR, false); + + // + // Write the first byte to the controller. + // + I2CMasterDataPut(I2C_MASTER_BASE, ucChar); + + // + // Start the transfer. + // + I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START); +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a byte to the SSD0303 controller. +//! +//! \param ucChar is the byte to be transmitted to the controller. +//! +//! This function continues a transfer to the SSD0303 controller by writing +//! another byte over the I2C bus. This must only be called after calling +//! OSRAMWriteFirst(), but before calling OSRAMWriteFinal(). +//! +//! The data is written in a polled faashion; this function will not return +//! until the byte has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteByte(unsigned char ucChar) +{ + // + // Wait until the current byte has been transferred. + // + while(I2CMasterIntStatus(I2C_MASTER_BASE, false) == 0) + { + } + + // + // Provide the required inter-byte delay. + // + OSRAMDelay(g_ulDelay); + + // + // Write the next byte to the controller. + // + I2CMasterDataPut(I2C_MASTER_BASE, ucChar); + + // + // Continue the transfer. + // + I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_CONT); +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of bytes to the SSD0303 controller. +//! +//! This function continues a transfer to the SSD0303 controller by writing a +//! sequence of bytes over the I2C bus. This must only be called after calling +//! OSRAMWriteFirst(), but before calling OSRAMWriteFinal(). +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteArray(const unsigned char *pucBuffer, unsigned long ulCount) +{ + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Wait until the current byte has been transferred. + // + while(I2CMasterIntStatus(I2C_MASTER_BASE, false) == 0) + { + } + + // + // Provide the required inter-byte delay. + // + OSRAMDelay(g_ulDelay); + + // + // Write the next byte to the controller. + // + I2CMasterDataPut(I2C_MASTER_BASE, *pucBuffer++); + ulCount--; + + // + // Continue the transfer. + // + I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_CONT); + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Finish a transfer to the SSD0303 controller. +//! +//! \param ucChar is the final byte to be written to the controller. +//! +//! This function will finish a transfer to the SSD0303 controller via the I2C +//! bus. This must only be called after calling OSRAMWriteFirst(). +//! +//! The data is written in a polled fashion; this function will not return +//! until the byte has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteFinal(unsigned char ucChar) +{ + // + // Wait until the current byte has been transferred. + // + while(I2CMasterIntStatus(I2C_MASTER_BASE, false) == 0) + { + } + + // + // Provide the required inter-byte delay. + // + OSRAMDelay(g_ulDelay); + + // + // Write the final byte to the controller. + // + I2CMasterDataPut(I2C_MASTER_BASE, ucChar); + + // + // Finish the transfer. + // + I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH); + + // + // Wait until the final byte has been transferred. + // + while(I2CMasterIntStatus(I2C_MASTER_BASE, false) == 0) + { + } + + // + // Provide the required inter-byte delay. + // + OSRAMDelay(g_ulDelay); +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display. All pixels in the display will be +//! turned off. +//! +//! This function is contained in osram96x16.c, with +//! osram96x16.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMClear(void) +{ + static const unsigned char pucRow1[] = + { + 0xb0, 0x80, 0x04, 0x80, 0x12, 0x40 + }; + static const unsigned char pucRow2[] = + { + 0xb1, 0x80, 0x04, 0x80, 0x12, 0x40 + }; + unsigned long ulIdx; + + // + // Move the display cursor to the first column of the first row. + // + OSRAMWriteFirst(0x80); + OSRAMWriteArray(pucRow1, sizeof(pucRow1)); + + // + // Fill this row with zeros. + // + for(ulIdx = 0; ulIdx < 95; ulIdx++) + { + OSRAMWriteByte(0x00); + } + OSRAMWriteFinal(0x00); + + // + // Move the display cursor to the first column of the second row. + // + OSRAMWriteFirst(0x80); + OSRAMWriteArray(pucRow2, sizeof(pucRow2)); + + // + // Fill this row with zeros. + // + for(ulIdx = 0; ulIdx < 95; ulIdx++) + { + OSRAMWriteByte(0x00); + } + OSRAMWriteFinal(0x00); +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! eight scan line blocks from the top of the display (i.e. only 0 and 1 are +//! valid). +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in osram96x16.c, with +//! osram96x16.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMStringDraw(const char *pcStr, unsigned long ulX, unsigned long ulY) +{ + // + // Check the arguments. + // + ASSERT(ulX < 96); + ASSERT(ulY < 2); + + // + // Move the display cursor to the requested position on the display. + // + OSRAMWriteFirst(0x80); + OSRAMWriteByte((ulY == 0) ? 0xb0 : 0xb1); + OSRAMWriteByte(0x80); + OSRAMWriteByte((ulX + 36) & 0x0f); + OSRAMWriteByte(0x80); + OSRAMWriteByte(0x10 | (((ulX + 36) >> 4) & 0x0f)); + OSRAMWriteByte(0x40); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // See if there is enough space on the display for this entire + // character. + // + if(ulX <= 90) + { + // + // Write the contents of this character to the display. + // + OSRAMWriteArray(g_pucFont[*pcStr - ' '], 5); + + // + // See if this is the last character to display (either because the + // right edge has been reached or because there are no more + // characters). + // + if((ulX == 90) || (pcStr[1] == 0)) + { + // + // Write the final column of the display. + // + OSRAMWriteFinal(0x00); + + // + // The string has been displayed. + // + return; + } + + // + // Write the inter-character padding column. + // + OSRAMWriteByte(0x00); + } + else + { + // + // Write the portion of the character that will fit onto the + // display. + // + OSRAMWriteArray(g_pucFont[*pcStr - ' '], 95 - ulX); + OSRAMWriteFinal(g_pucFont[*pcStr - ' '][95 - ulX]); + + // + // The string has been displayed. + // + return; + } + + // + // Advance to the next character. + // + pcStr++; + + // + // Increment the X coordinate by the six columns that were just + // written. + // + ulX += 6; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! eight scan line blocks from the top of the display (i.e. only 0 and 1 are +//! valid). +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in eight row blocks +//! (i.e. only 1 and 2 are valid). +//! +//! This function will display a bitmap graphic on the display. The image to +//! be displayed must be a multiple of eight scan lines high (i.e. one row) and +//! will be drawn at a vertical position that is a multiple of eight scan lines +//! (i.e. scan line zero or scan line eight, corresponding to row zero or row +//! one). +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for the eight scan lines of the column, with the top scan +//! line being in the least significant bit of the byte and the bottom scan +//! line being in the most significant bit of the byte. +//! +//! For example, an image four columns wide and sixteen scan lines tall would +//! be arranged as follows (showing how the eight bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------+ +-------+ +-------+ +-------+ +//! | | 0 | | | 0 | | | 0 | | | 0 | +//! | B | 1 | | B | 1 | | B | 1 | | B | 1 | +//! | y | 2 | | y | 2 | | y | 2 | | y | 2 | +//! | t | 3 | | t | 3 | | t | 3 | | t | 3 | +//! | e | 4 | | e | 4 | | e | 4 | | e | 4 | +//! | | 5 | | | 5 | | | 5 | | | 5 | +//! | 0 | 6 | | 1 | 6 | | 2 | 6 | | 3 | 6 | +//! | | 7 | | | 7 | | | 7 | | | 7 | +//! +-------+ +-------+ +-------+ +-------+ +//! +//! +-------+ +-------+ +-------+ +-------+ +//! | | 0 | | | 0 | | | 0 | | | 0 | +//! | B | 1 | | B | 1 | | B | 1 | | B | 1 | +//! | y | 2 | | y | 2 | | y | 2 | | y | 2 | +//! | t | 3 | | t | 3 | | t | 3 | | t | 3 | +//! | e | 4 | | e | 4 | | e | 4 | | e | 4 | +//! | | 5 | | | 5 | | | 5 | | | 5 | +//! | 4 | 6 | | 5 | 6 | | 6 | 6 | | 7 | 6 | +//! | | 7 | | | 7 | | | 7 | | | 7 | +//! +-------+ +-------+ +-------+ +-------+ +//! \endverbatim +//! +//! This function is contained in osram96x16.c, with +//! osram96x16.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + // + // Check the arguments. + // + ASSERT(ulX < 96); + ASSERT(ulY < 2); + ASSERT((ulX + ulWidth) <= 96); + ASSERT((ulY + ulHeight) <= 2); + + // + // The first 36 columns of the LCD buffer are not displayed, so increment + // the X coorddinate by 36 to account for the non-displayed frame buffer + // memory. + // + ulX += 36; + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write the starting address within this row. + // + OSRAMWriteFirst(0x80); + OSRAMWriteByte((ulY == 0) ? 0xb0 : 0xb1); + OSRAMWriteByte(0x80); + OSRAMWriteByte(ulX & 0x0f); + OSRAMWriteByte(0x80); + OSRAMWriteByte(0x10 | ((ulX >> 4) & 0x0f)); + OSRAMWriteByte(0x40); + + // + // Write this row of image data. + // + OSRAMWriteArray(pucImage, ulWidth - 1); + OSRAMWriteFinal(pucImage[ulWidth - 1]); + + // + // Advance to the next row of the image. + // + pucImage += ulWidth; + ulY++; + } +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param bFast is a boolean that is \e true if the I2C interface should be +//! run at 400 kbps and \e false if it should be run at 100 kbps. +//! +//! This function initializes the I2C interface to the OLED display and +//! configures the SSD0303 controller on the panel. +//! +//! This function is contained in osram96x16.c, with +//! osram96x16.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMInit(tBoolean bFast) +{ + unsigned long ulIdx; + + // + // Enable the I2C and GPIO port B blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + + // + // Configure the I2C SCL and SDA pins for I2C operation. + // + GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3); + + // + // Initialize the I2C master. + // + I2CMasterInit(I2C_MASTER_BASE, bFast); + + // + // Compute the inter-byte delay for the SSD0303 controller. This delay is + // dependent upon the I2C bus clock rate; the slower the clock the longer + // the delay required. + // + // The derivation of this formula is based on a measured delay of + // OSRAMDelay(1700) for a 100 kHz I2C bus with the CPU running at 50 MHz + // (referred to as C). To scale this to the delay for a different CPU + // speed (since this is just a CPU-based delay loop) is: + // + // f(CPU) + // C * ---------- + // 50,000,000 + // + // To then scale this to the actual I2C rate (since it won't always be + // precisely 100 kHz): + // + // f(CPU) 100,000 + // C * ---------- * ------- + // 50,000,000 f(I2C) + // + // This equation will give the inter-byte delay required for any + // configuration of the I2C master. But, as arranged it is impossible to + // directly compute in 32-bit arithmetic (without loosing a lot of + // accuracy). So, the equation is simplified. + // + // Since f(I2C) is generated by dividing down from f(CPU), replace it with + // the equivalent (where TPR is the value programmed into the Master Timer + // Period Register of the I2C master, with the 1 added back): + // + // 100,000 + // f(CPU) ------- + // C * ---------- * f(CPU) + // 50,000,000 ------------ + // 2 * 10 * TPR + // + // Inverting the dividend in the last term: + // + // f(CPU) 100,000 * 2 * 10 * TPR + // C * ---------- * ---------------------- + // 50,000,000 f(CPU) + // + // The f(CPU) now cancels out. + // + // 100,000 * 2 * 10 * TPR + // C * ---------------------- + // 50,000,000 + // + // Since there are no clock frequencies left in the equation, this equation + // also works for 400 kHz bus operation as well, since the 100,000 in the + // numerator becomes 400,000 but C is 1/4, which cancel out each other. + // Reducing the constants gives: + // + // TPR TPR TPR + // C * --- = 1700 * --- = 340 * --- = 68 * TPR + // 25 25 5 + // + // Note that the constant C is actually a bit larger than it needs to be in + // order to provide some safety margin. + // + g_ulDelay = 68 * (HWREG(I2C_MASTER_BASE + I2C_MASTER_O_TPR) + 1); + + // + // Initialize the SSD0303 controller. Loop through the initialization + // sequence doing a single I2C transfer for each command. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAMInit); + ulIdx += g_pucOSRAMInit[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteFirst(g_pucOSRAMInit[ulIdx + 1]); + OSRAMWriteArray(g_pucOSRAMInit + ulIdx + 2, g_pucOSRAMInit[ulIdx] - 2); + OSRAMWriteFinal(g_pucOSRAMInit[ulIdx + g_pucOSRAMInit[ulIdx]]); + } + + // + // Clear the frame buffer. + // + OSRAMClear(); +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in osram96x16.c, with +//! osram96x16.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMDisplayOn(void) +{ + unsigned long ulIdx; + + // + // Re-initialize the SSD0303 controller. Loop through the initialization + // sequence doing a single I2C transfer for each command. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAMInit); + ulIdx += g_pucOSRAMInit[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteFirst(g_pucOSRAMInit[ulIdx + 1]); + OSRAMWriteArray(g_pucOSRAMInit + ulIdx + 2, g_pucOSRAMInit[ulIdx] - 2); + OSRAMWriteFinal(g_pucOSRAMInit[ulIdx + g_pucOSRAMInit[ulIdx]]); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in osram96x16.c, with +//! osram96x16.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMDisplayOff(void) +{ + // + // Turn off the DC-DC converter and the display. + // + OSRAMWriteFirst(0x80); + OSRAMWriteByte(0xae); + OSRAMWriteByte(0x80); + OSRAMWriteByte(0xad); + OSRAMWriteByte(0x80); + OSRAMWriteFinal(0x8a); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/osram96x16.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/osram96x16.h new file mode 100644 index 0000000..0c9cd36 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/osram96x16.h @@ -0,0 +1,47 @@ +//***************************************************************************** +// +// osram96x16.h - Prototypes for the driver for the OSRAM 96x16 graphical OLED +// display. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __OSRAM96X16_H__ +#define __OSRAM96X16_H__ + +//***************************************************************************** +// +// Prototypes for the driver APIs. +// +//***************************************************************************** +extern void OSRAMClear(void); +extern void OSRAMStringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY); +extern void OSRAMImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight); +extern void OSRAMInit(tBoolean bFast); +extern void OSRAMDisplayOn(void); +extern void OSRAMDisplayOff(void); + +#endif // __OSRAM96X16_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/pwm.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/pwm.c new file mode 100644 index 0000000..6697566 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/pwm.c @@ -0,0 +1,1291 @@ +//***************************************************************************** +// +// pwm.c - API for the PWM modules +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup pwm_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_pwm.h" +#include "../hw_types.h" +#include "debug.h" +#include "interrupt.h" +#include "pwm.h" + +//***************************************************************************** +// +// Misc macros for manipulating the encoded generator and output defines used +// by the API. +// +//***************************************************************************** +#define PWM_GEN_BADDR(_mod_, _gen_) \ + ((_mod_) + (_gen_)) +#define PWM_OUT_BADDR(_mod_, _out_) \ + ((_mod_) + ((_out_) & 0xFFFFFFC0)) +#define PWM_IS_OUTPUT_ODD(_out_) \ + ((_out_) & 0x00000001) + +//***************************************************************************** +// +//! Configures a PWM generator. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to configure. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param ulConfig is the configuration for the PWM generator. +//! +//! This function is used to set the mode of operation for a PWM generator. +//! The counting mode, synchronization mode, and debug behavior are all +//! configured. After configuration, the generator is left in the disabled +//! state. +//! +//! A PWM generator can count in two different modes: count down mode or count +//! up/down mode. In count down mode, it will count from a value down to zero, +//! and then reset to the preset value. This will produce left-aligned PWM +//! signals (i.e. the rising edge of the two PWM signals produced by the +//! generator will occur at the same time). In count up/down mode, it will +//! count up from zero to the preset value, count back down to zero, and then +//! repeat the process. This will produce center-aligned PWM signals (i.e. the +//! middle of the high/low period of the PWM signals produced by the generator +//! will occur at the same time). +//! +//! When the PWM generator parameters (period and pulse width) are modified, +//! their affect on the output PWM signals can be delayed. In synchronous +//! mode, the parameter updates are not applied until a synchronization event +//! occurs. This allows multiple parameters to be modified and take affect +//! simultaneously, instead of one at a time. Additionally, parameters to +//! multiple PWM generators in synchronous mode can be updated simultaneously, +//! allowing them to be treated as if they were a unified generator. In +//! non-synchronous mode, the parameter updates are not delayed until a +//! synchronization event. In either mode, the parameter updates only occur +//! when the counter is at zero to help prevent oddly formed PWM signals during +//! the update (i.e. a PWM pulse that is too short or too long). +//! +//! The PWM generator can either pause or continue running when the processor +//! is stopped via the debugger. If configured to pause, it will continue to +//! count until it reaches zero, at which point it will pause until the +//! processor is restarted. If configured to continue running, it will keep +//! counting as if nothing had happened. +//! +//! The \b ulConfig parameter contains the desired configuration. It is the +//! logical OR of the following: \b PWM_GEN_MODE_DOWN or +//! \b PWM_GEN_MODE_UP_DOWN to specify the counting mode, \b PWM_GEN_MODE_SYNC +//! or \b PWM_GEN_MODE_NO_SYNC to specify the synchronization mode, and +//! \b PWM_GEN_MODE_DBG_RUN or \b PWM_GEN_MODE_DBG_STOP to specify the debug +//! behavior. +//! +//! \note Changes to the counter mode will affect the period of the PWM signals +//! produced. PWMGenPeriodSet() and PWMPulseWidthSet() should be called after +//! any changes to the counter mode of a generator. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_genconfigure) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenConfigure(unsigned long ulBase, unsigned long ulGen, + unsigned long ulConfig) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Compute the generator's base address. + // + ulGen = PWM_GEN_BADDR(ulBase, ulGen); + + // + // Change the global configuration of the generator. + // + HWREG(ulGen + PWM_O_X_CTL) = ((HWREG(ulGen + PWM_O_X_CTL) & + ~(PWM_X_CTL_MODE | PWM_X_CTL_DEBUG | + PWM_X_CTL_LOADUPD | PWM_X_CTL_CMPAUPD | + PWM_X_CTL_CMPBUPD)) | ulConfig); + + // + // Set the individual PWM generator controls. + // + if(ulConfig & PWM_X_CTL_MODE) + { + // + // In up/down count mode, set the signal high on up count comparison + // and low on down count comparison (i.e. center align the signals). + // + HWREG(ulGen + PWM_O_X_GENA) = ((PWM_GEN_ACT_ONE << + PWM_GEN_ACT_A_UP_SHIFT) | + (PWM_GEN_ACT_ZERO << + PWM_GEN_ACT_A_DN_SHIFT)); + HWREG(ulGen + PWM_O_X_GENB) = ((PWM_GEN_ACT_ONE << + PWM_GEN_ACT_B_UP_SHIFT) | + (PWM_GEN_ACT_ZERO << + PWM_GEN_ACT_B_DN_SHIFT)); + } + else + { + // + // In down count mode, set the signal high on load and low on count + // comparison (i.e. left align the signals). + // + HWREG(ulGen + PWM_O_X_GENA) = ((PWM_GEN_ACT_ONE << + PWM_GEN_ACT_LOAD_SHIFT) | + (PWM_GEN_ACT_ZERO << + PWM_GEN_ACT_A_DN_SHIFT)); + HWREG(ulGen + PWM_O_X_GENB) = ((PWM_GEN_ACT_ONE << + PWM_GEN_ACT_LOAD_SHIFT) | + (PWM_GEN_ACT_ZERO << + PWM_GEN_ACT_B_DN_SHIFT)); + } +} +#endif + +//***************************************************************************** +// +//! Set the period of a PWM generator. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to be modified. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param ulPeriod specifies the period of PWM generator output, measured +//! in clock ticks. +//! +//! This function sets the period of the specified PWM generator block, where +//! the period of the generator block is defined as the number of \b PWM +//! clock ticks between pulses on the generator block \b zero signal. +//! +//! \note Any subsequent calls made to this function before an update occurs +//! will cause the previous values to be overwritten. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_genperiodset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenPeriodSet(unsigned long ulBase, unsigned long ulGen, + unsigned long ulPeriod) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Compute the generator's base address. + // + ulGen = PWM_GEN_BADDR(ulBase, ulGen); + + // + // Set the reload register based on the mode. + // + if(HWREG(ulGen + PWM_O_X_CTL) & PWM_X_CTL_MODE) + { + // + // In up/down count mode, set the reload register to half the requested + // period. + // + ASSERT((ulPeriod / 2) < 65536); + HWREG(ulGen + PWM_O_X_LOAD) = ulPeriod / 2; + } + else + { + // + // In down count mode, set the reload register to the requested period + // minus one. + // + ASSERT((ulPeriod <= 65536) && (ulPeriod != 0)); + HWREG(ulGen + PWM_O_X_LOAD) = ulPeriod - 1; + } +} +#endif + +//***************************************************************************** +// +//! Gets the period of a PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to query. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! +//! This function gets the period of the specified PWM generator block. The +//! period of the generator block is defined as the number of \b PWM clock +//! ticks between pulses on the generator block \b zero signal. +//! +//! If the update of the counter for the specified PWM generator has yet +//! to be completed, the value returned may not be the active period. The +//! value returned is the programmed period, measured in \b PWM clock ticks. +//! +//! \return Returns the programmed period of the specified generator block +//! in \b PWM clock ticks. +// +//***************************************************************************** +#if defined(GROUP_genperiodget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +PWMGenPeriodGet(unsigned long ulBase, unsigned long ulGen) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Compute the generator's base address. + // + ulGen = PWM_GEN_BADDR(ulBase, ulGen); + + // + // Figure out the counter mode. + // + if(HWREG(ulGen + PWM_O_X_CTL) & PWM_X_CTL_MODE) + { + // + // The period is twice the reload register value. + // + return(HWREG(ulGen + PWM_O_X_LOAD) * 2); + } + else + { + // + // The period is the reload register value plus one. + // + return(HWREG(ulGen + PWM_O_X_LOAD) + 1); + } +} +#endif + +//***************************************************************************** +// +//! Enables the timer/counter for a PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to be enabled. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! +//! This function allows the \b PWM clock to drive the timer/counter for the +//! specified generator block. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_genenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenEnable(unsigned long ulBase, unsigned long ulGen) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Enable the PWM generator. + // + HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_CTL) |= PWM_X_CTL_ENABLE; +} +#endif + +//***************************************************************************** +// +//! Disables the timer/counter for a PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to be disabled. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! +//! This function blocks the \b PWM clock from driving the timer/counter for +//! the specified generator block. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_gendisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenDisable(unsigned long ulBase, unsigned long ulGen) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Disable the PWM generator. + // + HWREG(PWM_GEN_BADDR(ulBase, + ulGen) + PWM_O_X_CTL) &= ~(PWM_X_CTL_ENABLE); +} +#endif + +//***************************************************************************** +// +//! Sets the pulse width for the specified PWM output. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulPWMOut is the PWM output to modify. Must be one of \b PWM_OUT_0, +//! \b PWM_OUT_1, \b PWM_OUT_2, \b PWM_OUT_3, \b PWM_OUT_4, or \b PWM_OUT_5. +//! \param ulWidth specifies the width of the positive portion of the pulse. +//! +//! This function sets the pulse width for the specified PWM output, where the +//! pulse width is defined as the number of \b PWM clock ticks. +//! +//! \note Any subsequent calls made to this function before an update occurs +//! will cause the previous values to be overwritten. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pulsewidthset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, + unsigned long ulWidth) +{ + unsigned long ulGenBase, ulReg; + + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulPWMOut == PWM_OUT_0) || (ulPWMOut == PWM_OUT_1) || + (ulPWMOut == PWM_OUT_2) || (ulPWMOut == PWM_OUT_3) || + (ulPWMOut == PWM_OUT_4) || (ulPWMOut == PWM_OUT_5)); + + // + // Compute the generator's base address. + // + ulGenBase = PWM_OUT_BADDR(ulBase, ulPWMOut); + + // + // If the counter is in up/down count mode, divide the width by two. + // + if(HWREG(ulGenBase + PWM_O_X_CTL) & PWM_X_CTL_MODE) + { + ulWidth /= 2; + } + + // + // Get the period. + // + ulReg = HWREG(ulGenBase + PWM_O_X_LOAD); + + // + // Make sure the width is not too large. + // + ASSERT(ulWidth < ulReg); + + // + // Compute the compare value. + // + ulReg = ulReg - ulWidth; + + // + // Write to the appropriate registers. + // + if(PWM_IS_OUTPUT_ODD(ulPWMOut)) + { + HWREG(ulGenBase + PWM_O_X_CMPB) = ulReg; + } + else + { + HWREG(ulGenBase + PWM_O_X_CMPA) = ulReg; + } +} +#endif + +//***************************************************************************** +// +//! Gets the pulse width of a PWM output. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulPWMOut is the PWM output to query. Must be one of \b PWM_OUT_0, +//! \b PWM_OUT_1, \b PWM_OUT_2, \b PWM_OUT_3, \b PWM_OUT_4, or \b PWM_OUT_5. +//! +//! This function gets the currently programmed pulse width for the +//! specified PWM output. If the update of the comparator for the specified +//! output has yet to be completed, the value returned may not be the active +//! pulse width. The value returned is the programmed pulse width, measured +//! in \b PWM clock ticks. +//! +//! \return Returns the width of the pulse in \b PWM clock ticks. +// +//***************************************************************************** +#if defined(GROUP_pulsewidthget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +PWMPulseWidthGet(unsigned long ulBase, unsigned long ulPWMOut) +{ + unsigned long ulGenBase, ulReg, ulLoad; + + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulPWMOut == PWM_OUT_0) || (ulPWMOut == PWM_OUT_1) || + (ulPWMOut == PWM_OUT_2) || (ulPWMOut == PWM_OUT_3) || + (ulPWMOut == PWM_OUT_4) || (ulPWMOut == PWM_OUT_5)); + + // + // Compute the generator's base address. + // + ulGenBase = PWM_OUT_BADDR(ulBase, ulPWMOut); + + // + // Then compute the pulse width. If mode is UpDown, set + // width = (load-compare)*2. Otherwise, set width = load - compare + // + ulLoad = HWREG(ulGenBase + PWM_O_X_LOAD); + if(PWM_IS_OUTPUT_ODD(ulPWMOut)) + { + ulReg = HWREG(ulGenBase + PWM_O_X_CMPB); + } + else + { + ulReg = HWREG(ulGenBase + PWM_O_X_CMPA); + } + ulReg = ulLoad - ulReg; + + // + // If in up/down count mode, double the pulse width. + // + if(HWREG(ulGenBase + PWM_O_X_CTL) & PWM_X_CTL_MODE) + { + ulReg = ulReg * 2; + } + + // + // Return the pulse width. + // + return(ulReg); +} +#endif + +//***************************************************************************** +// +//! Enables the PWM dead band output, and sets the dead band delays. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to modify. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param usRise specifies the width of delay from the rising edge. +//! \param usFall specifies the width of delay from the falling edge. +//! +//! This function sets the dead bands for the specified PWM generator, +//! where the dead bands are defined as the number of \b PWM clock ticks +//! from the rising or falling edge of the generator's \b OutA signal. +//! Note that this function causes the coupling of \b OutB to \b OutA. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_deadbandenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMDeadBandEnable(unsigned long ulBase, unsigned long ulGen, + unsigned short usRise, unsigned short usFall) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + ASSERT(usRise < 4096); + ASSERT(usFall < 4096); + + // + // Compute the generator's base address. + // + ulGen = PWM_GEN_BADDR(ulBase, ulGen); + + // + // Write the dead band delay values. + // + HWREG(ulGen + PWM_O_X_DBRISE) = usRise; + HWREG(ulGen + PWM_O_X_DBFALL) = usFall; + + // + // Enable the deadband functionality. + // + HWREG(ulGen + PWM_O_X_DBCTL) |= PWM_DBCTL_ENABLE; +} +#endif + +//***************************************************************************** +// +//! Disables the PWM dead band output. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to modify. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! +//! This function disables the dead band mode for the specified PWM generator. +//! Doing so decouples the \b OutA and \b OutB signals. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_deadbanddisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMDeadBandDisable(unsigned long ulBase, unsigned long ulGen) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Disable the deadband functionality. + // + HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_DBCTL) &= ~(PWM_DBCTL_ENABLE); +} +#endif + +//***************************************************************************** +// +//! Synchronizes all pending updates. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGenBits are the PWM generator blocks to be updated. Must be the +//! logical OR of any of \b PWM_GEN_0_BIT, \b PWM_GEN_1_BIT, or +//! \b PWM_GEN_2_BIT. +//! +//! For the selected PWM generators, this function causes all queued updates to +//! the period or pulse width to be applied the next time the corresponding +//! counter becomes zero. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_syncupdate) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMSyncUpdate(unsigned long ulBase, unsigned long ulGenBits) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT(!(ulGenBits & ~(PWM_GEN_0_BIT | PWM_GEN_1_BIT | PWM_GEN_2_BIT))); + + // + // Update the PWM timing registers. + // + HWREG(ulBase + PWM_O_CTL) = ulGenBits; +} +#endif + +//***************************************************************************** +// +//! Synchronizes the counters in one or multiple PWM generator blocks. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGenBits are the PWM generator blocks to be synchronized. Must be +//! the logical OR of any of \b PWM_GEN_0_BIT, \b PWM_GEN_1_BIT, or +//! \b PWM_GEN_2_BIT. +//! +//! For the selected PWM module, this function synchronizes the time base +//! of the generator blocks by causing the specified generator counters to be +//! reset to zero. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_synctimebase) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMSyncTimeBase(unsigned long ulBase, unsigned long ulGenBits) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT(!(ulGenBits & ~(PWM_GEN_0_BIT | PWM_GEN_1_BIT | PWM_GEN_2_BIT))); + + // + // Synchronize the counters in the specified generators by writing to + // the module's synchronization register. + // + HWREG(ulBase + PWM_O_SYNC) = ulGenBits; +} +#endif + +//***************************************************************************** +// +//! Enables or disables PWM outputs. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulPWMOutBits are the PWM outputs to be modified. Must be the +//! logical OR of any of \b PWM_OUT_0_BIT, \b PWM_OUT_1_BIT, \b PWM_OUT_2_BIT, +//! \b PWM_OUT_3_BIT, \b PWM_OUT_4_BIT, or \b PWM_OUT_5_BIT. +//! \param bEnable determines if the signal is enabled or disabled. +//! +//! This function is used to enable or disable the selected PWM outputs. The +//! outputs are selected using the parameter \e ulPWMOutBits. The parameter +//! \e bEnable determines the state of the selected outputs. If \e bEnable is +//! \b true, then the selected PWM outputs are enabled, or placed in the active +//! state. If \e bEnable is \b false, then the selected outputs are disabled, +//! or placed in the inactive state. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_outputstate) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMOutputState(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bEnable) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT(!(ulPWMOutBits & ~(PWM_OUT_0_BIT | PWM_OUT_1_BIT | PWM_OUT_2_BIT | + PWM_OUT_3_BIT | PWM_OUT_4_BIT | PWM_OUT_5_BIT))); + + // + // Read the module's ENABLE output control register, and set or clear + // the requested bits. + // + if(bEnable == true) + { + HWREG(ulBase + PWM_O_ENABLE) |= ulPWMOutBits; + } + else + { + HWREG(ulBase + PWM_O_ENABLE) &= ~(ulPWMOutBits); + } +} +#endif + +//***************************************************************************** +// +//! Selects the inversion mode for PWM outputs. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulPWMOutBits are the PWM outputs to be modified. Must be the +//! logical OR of any of \b PWM_OUT_0_BIT, \b PWM_OUT_1_BIT, \b PWM_OUT_2_BIT, +//! \b PWM_OUT_3_BIT, \b PWM_OUT_4_BIT, or \b PWM_OUT_5_BIT. +//! \param bInvert determines if the signal is inverted or passed through. +//! +//! This function is used to select the inversion mode for the selected PWM +//! outputs. The outputs are selected using the parameter \e ulPWMOutBits. +//! The parameter \e bInvert determines the inversion mode for the selected +//! outputs. If \e bInvert is \b true, this function will cause the specified +//! PWM output signals to be inverted, or made active low. If \e bInvert is +//! \b false, the specified output will be passed through as is, or be made +//! active high. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_outputinvert) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMOutputInvert(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bInvert) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT(!(ulPWMOutBits & ~(PWM_OUT_0_BIT | PWM_OUT_1_BIT | PWM_OUT_2_BIT | + PWM_OUT_3_BIT | PWM_OUT_4_BIT | PWM_OUT_5_BIT))); + + // + // Read the module's INVERT output control register, and set or clear + // the requested bits. + // + if(bInvert == true) + { + HWREG(ulBase + PWM_O_INVERT) |= ulPWMOutBits; + } + else + { + HWREG(ulBase + PWM_O_INVERT) &= ~(ulPWMOutBits); + } +} +#endif + +//***************************************************************************** +// +//! Specifies the state of PWM outputs in response to a fault condition. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulPWMOutBits are the PWM outputs to be modified. Must be the +//! logical OR of any of \b PWM_OUT_0_BIT, \b PWM_OUT_1_BIT, \b PWM_OUT_2_BIT, +//! \b PWM_OUT_3_BIT, \b PWM_OUT_4_BIT, or \b PWM_OUT_5_BIT. +//! \param bFaultKill determines if the signal is killed or passed through +//! during an active fault condition. +//! +//! This function sets the fault handling characteristics of the selected PWM +//! outputs. The outputs are selected using the parameter \e ulPWMOutBits. +//! The parameter \e bFaultKill determines the fault handling characteristics +//! for the selected outputs. If \e bFaultKill is \b true, then the selected +//! outputs will be made inactive. If \e bFaultKill is \b false, then the +//! selected outputs are unaffected by the detected fault. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_outputfault) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMOutputFault(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bFaultKill) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT(!(ulPWMOutBits & ~(PWM_OUT_0_BIT | PWM_OUT_1_BIT | PWM_OUT_2_BIT | + PWM_OUT_3_BIT | PWM_OUT_4_BIT | PWM_OUT_5_BIT))); + + // + // Read the module's FAULT output control register, and set or clear + // the requested bits. + // + if(bFaultKill == true) + { + HWREG(ulBase + PWM_O_FAULT) |= ulPWMOutBits; + } + else + { + HWREG(ulBase + PWM_O_FAULT) &= ~(ulPWMOutBits); + } +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the specified PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator in question. +//! \param pfnIntHandler is a pointer to the function to be called when the PWM +//! generator interrupt occurs. +//! +//! This function will ensure that the interrupt handler specified by +//! \e pfnIntHandler is called when an interrupt is detected for the specified +//! PWM generator block. This function will also enable the corresponding +//! PWM generator interrupt in the interrupt controller; individual generator +//! interrupts and interrupt sources must be enabled with PWMIntEnable() and +//! PWMGenIntTrigEnable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_genintregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenIntRegister(unsigned long ulBase, unsigned long ulGen, + void (*pfnIntHandler)(void)) +{ + unsigned long ulInt; + + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Get the interrupt number associated with the specified generator. + // + ulInt = INT_PWM0 + (ulGen >> 6) - 1; + + // + // Register the interrupt handler. + // + IntRegister(ulInt, pfnIntHandler); + + // + // Enable the PWMx interrupt. + // + IntEnable(ulInt); +} +#endif + +//***************************************************************************** +// +//! Removes an interrupt handler for the specified PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator in question. +//! +//! This function will unregister the interrupt handler for the specified +//! PWM generator block. This function will also disable the corresponding +//! PWM generator interrupt in the interrupt controller; individual generator +//! interrupts and interrupt sources must be disabled with PWMIntDisable() and +//! PWMGenIntTrigDisable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_genintunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenIntUnregister(unsigned long ulBase, unsigned long ulGen) +{ + unsigned long ulInt; + + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Get the interrupt number associated with the specified generator. + // + ulInt = INT_PWM0 + (ulGen >> 6) - 1; + + // + // Disable the PWMx interrupt. + // + IntDisable(ulInt); + + // + // Unregister the interrupt handler. + // + IntUnregister(ulInt); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for a fault condition detected in a PWM +//! module. +//! +//! \param ulBase is the base address of the PWM module. +//! \param pfnIntHandler is a pointer to the function to be called when the PWM +//! fault interrupt occurs. +//! +//! This function will ensure that the interrupt handler specified by +//! \e pfnIntHandler is called when a fault interrupt is detected for the +//! selected PWM module. This function will also enable the PWM fault +//! interrupt in the NVIC; the PWM fault interrupt must also be enabled at the +//! module level using PWMIntEnable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_faultintregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMFaultIntRegister(unsigned long ulBase, void (*pfnIntHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + + // + // Register the interrupt handler, returning an error if one occurs. + // + IntRegister(INT_PWM_FAULT, pfnIntHandler); + + // + // Enable the PWM fault interrupt. + // + IntEnable(INT_PWM_FAULT); +} +#endif + +//***************************************************************************** +// +//! Removes the PWM fault condition interrupt handler. +//! +//! \param ulBase is the base address of the PWM module. +//! +//! This function will remove the interrupt handler for a PWM fault interrupt +//! from the selected PWM module. This function will also disable the PWM +//! fault interrupt in the NVIC; the PWM fault interrupt must also be disabled +//! at the module level using PWMIntDisable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_faultintunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMFaultIntUnregister(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + + // + // Disable the PWM fault interrupt. + // + IntDisable(INT_PWM_FAULT); + + // + // Unregister the interrupt handler, returning an error if one occurs. + // + IntUnregister(INT_PWM_FAULT); +} +#endif + +//***************************************************************************** +// +//! Enables interrupts and triggers for the specified PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to have interrupts and triggers enabled. +//! Must be one of \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param ulIntTrig specifies the interrupts and triggers to be enabled. +//! +//! Unmasks the specified interrupt(s) and trigger(s) by setting the +//! specified bits of the interrupt/trigger enable register for the specified +//! PWM generator. The defined values for the bits are as follows: +//! +//! - PWM_INT_CNT_ZERO +//! - PWM_INT_CNT_LOAD +//! - PWM_INT_CMP_AU +//! - PWM_INT_CMP_AD +//! - PWM_INT_CMP_BU +//! - PWM_INT_CMP_BD +//! - PWM_TR_CNT_ZERO +//! - PWM_TR_CNT_LOAD +//! - PWM_TR_CMP_AU +//! - PWM_TR_CMP_AD +//! - PWM_TR_CMP_BU +//! - PWM_TR_CMP_BD +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_geninttrigenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenIntTrigEnable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Enable the specified interrupts/triggers. + // + HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_INTEN) |= ulIntTrig; +} +#endif + +//***************************************************************************** +// +//! Disables interrupts for the specified PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to have interrupts and triggers disabled. +//! Must be one of \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param ulIntTrig specifies the interrupts and triggers to be disabled. +//! +//! Masks the specified interrupt(s) and trigger(s) by clearing the +//! specified bits of the interrupt/trigger enable register for the specified +//! PWM generator. The defined values for the bits are as follows: +//! +//! - PWM_INT_CNT_ZERO +//! - PWM_INT_CNT_LOAD +//! - PWM_INT_CMP_AU +//! - PWM_INT_CMP_AD +//! - PWM_INT_CMP_BU +//! - PWM_INT_CMP_BD +//! - PWM_TR_CNT_ZERO +//! - PWM_TR_CNT_LOAD +//! - PWM_TR_CMP_AU +//! - PWM_TR_CMP_AD +//! - PWM_TR_CMP_BU +//! - PWM_TR_CMP_BD +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_geninttrigdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenIntTrigDisable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Disable the specified interrupts/triggers. + // + HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_INTEN) &= ~(ulIntTrig); +} +#endif + +//***************************************************************************** +// +//! Gets interrupt status for the specified PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to query. Must be one of \b PWM_GEN_0, +//! \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param bMasked specifies whether masked or raw interrupt status is +//! returned. +//! +//! If \e bMasked is set as \b true, then the masked interrupt status is +//! returned; otherwise, the raw interrupt status will be returned. +//! +//! \return Returns the contents of the interrupt status register, or the +//! contents of the raw interrupt status register, for the specified +//! PWM generator. +// +//***************************************************************************** +#if defined(GROUP_genintstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +PWMGenIntStatus(unsigned long ulBase, unsigned long ulGen, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Compute the generator's base address. + // + ulGen = PWM_GEN_BADDR(ulBase, ulGen); + + // + // Read and return the specified generator's raw or enabled interrupt + // status. + // + if(bMasked == true) + { + return(HWREG(ulGen + PWM_O_X_ISC)); + } + else + { + return(HWREG(ulGen + PWM_O_X_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears the specified interrupt(s) for the specified PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to query. Must be one of \b PWM_GEN_0, +//! \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param ulInts specifies the interrupts to be cleared. +//! +//! Clears the specified interrupt(s) by writing a 1 to the specified bits +//! of the interrupt status register for the specified PWM generator. The +//! defined values for the bits are as follows: +//! +//! - PWM_INT_CNT_ZERO +//! - PWM_INT_CNT_LOAD +//! - PWM_INT_CMP_AU +//! - PWM_INT_CMP_AD +//! - PWM_INT_CMP_BU +//! - PWM_INT_CMP_BD +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_genintclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenIntClear(unsigned long ulBase, unsigned long ulGen, unsigned long ulInts) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Clear the requested interrupts by writing ones to the specified bit + // of the module's interrupt enable register. + // + HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_ISC) = ulInts; +} +#endif + +//***************************************************************************** +// +//! Enables generator and fault interrupts for a PWM module. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGenFault contains the interrupts to be enabled. Must be a logical +//! OR of any of \b PWM_INT_GEN_0, \b PWM_INT_GEN_1, \b PWM_INT_GEN_2, or +//! \b PWM_INT_FAULT. +//! +//! Unmasks the specified interrupt(s) by setting the specified bits of +//! the interrupt enable register for the selected PWM module. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMIntEnable(unsigned long ulBase, unsigned long ulGenFault) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + + // + // Read the module's interrupt enable register, and enable interrupts + // for the specified PWM generators. + // + HWREG(ulBase + PWM_O_INTEN) |= ulGenFault; +} +#endif + +//***************************************************************************** +// +//! Disables generator and fault interrupts for a PWM module. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGenFault contains the interrupts to be disabled. Must be a +//! logical OR of any of \b PWM_INT_GEN_0, \b PWM_INT_GEN_1, \b PWM_INT_GEN_2, +//! or \b PWM_INT_FAULT. +//! +//! Masks the specified interrupt(s) by clearing the specified bits of +//! the interrupt enable register for the selected PWM module. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMIntDisable(unsigned long ulBase, unsigned long ulGenFault) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + + // + // Read the module's interrupt enable register, and disable interrupts + // for the specified PWM generators. + // + HWREG(ulBase + PWM_O_INTEN) &= ~(ulGenFault); +} +#endif + +//***************************************************************************** +// +//! Clears the fault interrupt for a PWM module. +//! +//! \param ulBase is the base address of the PWM module. +//! +//! Clears the fault interrupt by writing to the appropriate bit of the +//! interrupt status register for the selected PWM module. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_faultintclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMFaultIntClear(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + + // + // Write the only writeable bit in the module's interrupt register. + // + HWREG(ulBase + PWM_O_ISC) = PWM_INT_INTFAULT; +} +#endif + +//***************************************************************************** +// +//! Gets the interrupt status for a PWM module. +//! +//! \param ulBase is the base address of the PWM module. +//! \param bMasked specifies whether masked or raw interrupt status is +//! returned. +//! +//! If \e bMasked is set as \b true, then the masked interrupt status is +//! returned; otherwise, the raw interrupt status will be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! \b PWM_INT_GEN_0, \b PWM_INT_GEN_1, \b PWM_INT_GEN_2, and \b PWM_INT_FAULT. +//! +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +PWMIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + + // + // Read and return either the module's raw or enabled interrupt status. + // + if(bMasked == true) + { + return(HWREG(ulBase + PWM_O_ISC)); + } + else + { + return(HWREG(ulBase + PWM_O_RIS)); + } +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/pwm.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/pwm.h new file mode 100644 index 0000000..db835ba --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/pwm.h @@ -0,0 +1,161 @@ +//***************************************************************************** +// +// pwm.h - API function protoypes for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __PWM_H__ +#define __PWM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following defines are passed to PWMGenConfigure() as the ulConfig +// parameter and specify the configuration of the PWM generator. +// +//***************************************************************************** +#define PWM_GEN_MODE_DOWN 0x00000000 // Down count mode +#define PWM_GEN_MODE_UP_DOWN 0x00000002 // Up/Down count mode +#define PWM_GEN_MODE_SYNC 0x00000038 // Synchronous updates +#define PWM_GEN_MODE_NO_SYNC 0x00000000 // Immediate updates +#define PWM_GEN_MODE_DBG_RUN 0x00000004 // Continue running in debug mode +#define PWM_GEN_MODE_DBG_STOP 0x00000000 // Stop running in debug mode + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM generator interrupts and +// triggers. +// +//***************************************************************************** +#define PWM_INT_CNT_ZERO 0x00000001 // Int if COUNT = 0 +#define PWM_INT_CNT_LOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_INT_CNT_AU 0x00000004 // Int if COUNT = CMPA U +#define PWM_INT_CNT_AD 0x00000008 // Int if COUNT = CMPA D +#define PWM_INT_CNT_BU 0x00000010 // Int if COUNT = CMPA U +#define PWM_INT_CNT_BD 0x00000020 // Int if COUNT = CMPA D +#define PWM_TR_CNT_ZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_TR_CNT_LOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_TR_CNT_AU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_AD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_TR_CNT_BU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_BD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM interrupts. +// +//***************************************************************************** +#define PWM_INT_GEN_0 0x00000001 // Generator 0 interrupt +#define PWM_INT_GEN_1 0x00000002 // Generator 1 interrupt +#define PWM_INT_GEN_2 0x00000004 // Generator 2 interrupt +#define PWM_INT_FAULT 0x00010000 // Fault interrupt + +//***************************************************************************** +// +// Defines to identify the generators within a module. +// +//***************************************************************************** +#define PWM_GEN_0 0x00000040 // Offset address of Gen0 +#define PWM_GEN_1 0x00000080 // Offset address of Gen1 +#define PWM_GEN_2 0x000000C0 // Offset address of Gen2 + +#define PWM_GEN_0_BIT 0x00000001 // Bit-wise ID for Gen0 +#define PWM_GEN_1_BIT 0x00000002 // Bit-wise ID for Gen1 +#define PWM_GEN_2_BIT 0x00000004 // Bit-wise ID for Gen2 + +//***************************************************************************** +// +// Defines to identify the outputs within a module. +// +//***************************************************************************** +#define PWM_OUT_0 0x00000040 // Encoded offset address of PWM0 +#define PWM_OUT_1 0x00000041 // Encoded offset address of PWM1 +#define PWM_OUT_2 0x00000082 // Encoded offset address of PWM2 +#define PWM_OUT_3 0x00000083 // Encoded offset address of PWM3 +#define PWM_OUT_4 0x000000C4 // Encoded offset address of PWM4 +#define PWM_OUT_5 0x000000C5 // Encoded offset address of PWM5 + +#define PWM_OUT_0_BIT 0x00000001 // Bit-wise ID for PWM0 +#define PWM_OUT_1_BIT 0x00000002 // Bit-wise ID for PWM1 +#define PWM_OUT_2_BIT 0x00000004 // Bit-wise ID for PWM2 +#define PWM_OUT_3_BIT 0x00000008 // Bit-wise ID for PWM3 +#define PWM_OUT_4_BIT 0x00000010 // Bit-wise ID for PWM4 +#define PWM_OUT_5_BIT 0x00000020 // Bit-wise ID for PWM5 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void PWMGenConfigure(unsigned long ulBase, unsigned long ulGen, + unsigned long ulConfig); +extern void PWMGenPeriodSet(unsigned long ulBase, unsigned long ulGen, + unsigned long ulPeriod); +extern unsigned long PWMGenPeriodGet(unsigned long ulBase, + unsigned long ulGen); +extern void PWMGenEnable(unsigned long ulBase, unsigned long ulGen); +extern void PWMGenDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, + unsigned long ulWidth); +extern unsigned long PWMPulseWidthGet(unsigned long ulBase, + unsigned long ulPWMOut); +extern void PWMDeadBandEnable(unsigned long ulBase, unsigned long ulGen, + unsigned short usRise, unsigned short usFall); +extern void PWMDeadBandDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMSyncUpdate(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMSyncTimeBase(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMOutputState(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bEnable); +extern void PWMOutputInvert(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bInvert); +extern void PWMOutputFault(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bFaultKill); +extern void PWMGenIntRegister(unsigned long ulBase, unsigned long ulGen, + void (*pfnIntHandler)(void)); +extern void PWMGenIntUnregister(unsigned long ulBase, unsigned long ulGen); +extern void PWMFaultIntRegister(unsigned long ulBase, + void (*pfnIntHandler)(void)); +extern void PWMFaultIntUnregister(unsigned long ulBase); +extern void PWMGenIntTrigEnable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern void PWMGenIntTrigDisable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern unsigned long PWMGenIntStatus(unsigned long ulBase, unsigned long ulGen, + tBoolean bMasked); +extern void PWMGenIntClear(unsigned long ulBase, unsigned long ulGen, + unsigned long ulInts); +extern void PWMIntEnable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMIntDisable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMFaultIntClear(unsigned long ulBase); +extern unsigned long PWMIntStatus(unsigned long ulBase, tBoolean bMasked); + +#ifdef __cplusplus +} +#endif + +#endif // __PWM_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/qei.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/qei.c new file mode 100644 index 0000000..eb982de --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/qei.c @@ -0,0 +1,630 @@ +//***************************************************************************** +// +// qei.c - Driver for the Quadrature Encoder with Index. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup qei_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_qei.h" +#include "../hw_types.h" +#include "debug.h" +#include "interrupt.h" +#include "qei.h" + +//***************************************************************************** +// +//! Enables the quadrature encoder. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This will enable operation of the quadrature encoder module. It must be +//! configured before it is enabled. +//! +//! \sa QEIConfigure() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Enable the QEI module. + // + HWREG(ulBase + QEI_O_CTL) |= QEI_CTL_ENABLE; +} +#endif + +//***************************************************************************** +// +//! Disables the quadrature encoder. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This will disable operation of the quadrature encoder module. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_disable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Disable the QEI module. + // + HWREG(ulBase + QEI_O_CTL) &= ~(QEI_CTL_ENABLE); +} +#endif + +//***************************************************************************** +// +//! Configures the quadrature encoder. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param ulConfig is the configuration for the quadrature encoder. See below +//! for a description of this parameter. +//! \param ulMaxPosition specifies the maximum position value. +//! +//! This will configure the operation of the quadrature encoder. The +//! \e ulConfig parameter provides the configuration of the encoder and is the +//! logical OR of several values: +//! +//! - \b QEI_CONFIG_CAPTURE_A or \b QEI_CONFIG_CAPTURE_A_B to specify if edges +//! on channel A or on both channels A and B should be counted by the +//! position integrator and velocity accumulator. +//! - \b QEI_CONFIG_NO_RESET or \b QEI_CONFIG_RESET_IDX to specify if the +//! position integrator should be reset when the index pulse is detected. +//! - \b QEI_CONFIG_QUADRATURE or \b QEI_CONFIG_CLOCK_DIR to specify if +//! quadrature signals are being provided on ChA and ChB, or if a direction +//! signal and a clock are being provided instead. +//! - \b QEI_CONFIG_NO_SWAP or \b QEI_CONFIG_SWAP to specify if the signals +//! provided on ChA and ChB should be swapped before being processed. +//! +//! \e ulMaxPosition is the maximum value of the position integrator, and is +//! the value used to reset the position capture when in index reset mode and +//! moving in the reverse (negative) direction. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_configure) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIConfigure(unsigned long ulBase, unsigned long ulConfig, + unsigned long ulMaxPosition) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Write the new configuration to the hardware. + // + HWREG(ulBase + QEI_O_CTL) = ((HWREG(ulBase + QEI_O_CTL) & + ~(QEI_CTL_CAPMODE | QEI_CTL_RESMODE | + QEI_CTL_SIGMODE | QEI_CTL_SWAP)) | + ulConfig); + + // + // Set the maximum position. + // + HWREG(ulBase + QEI_O_MAXPOS) = ulMaxPosition; +} +#endif + +//***************************************************************************** +// +//! Gets the current encoder position. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This returns the current position of the encoder. Depending upon the +//! configuration of the encoder, and the incident of an index pulse, this +//! value may or may not contain the expected data (i.e. if in reset on index +//! mode, if an index pulse has not been encountered, the position counter will +//! not be aligned with the index pulse yet). +//! +//! \return The current position of the encoder. +// +//***************************************************************************** +#if defined(GROUP_positionget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +QEIPositionGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Return the current position counter. + // + return(HWREG(ulBase + QEI_O_POS)); +} +#endif + +//***************************************************************************** +// +//! Sets the current encoder position. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param ulPosition is the new position for the encoder. +//! +//! This sets the current position of the encoder; the encoder position will +//! then be measured relative to this value. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_positionset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIPositionSet(unsigned long ulBase, unsigned long ulPosition) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Set the position counter. + // + HWREG(ulBase + QEI_O_POS) = ulPosition; +} +#endif + +//***************************************************************************** +// +//! Gets the current direction of rotation. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This returns the current direction of rotation. In this case, current +//! means the most recently detected direction of the encoder; it may not be +//! presently moving but this is the direction it last moved before it stopped. +//! +//! \return 1 if moving in the forward direction or -1 if moving in the reverse +//! direction. +// +//***************************************************************************** +#if defined(GROUP_directionget) || defined(BUILD_ALL) || defined(DOXYGEN) +long +QEIDirectionGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Return the direction of rotation. + // + return((HWREG(ulBase + QEI_O_STAT) & QEI_STAT_DIRECTION) ? -1 : 1); +} +#endif + +//***************************************************************************** +// +//! Gets the encoder error indicator. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This returns the error indicator for the quadrature encoder. It is an +//! error for both of the signals of the quadrature input to change at the same +//! time. +//! +//! \return true if an error has occurred and false otherwise. +// +//***************************************************************************** +#if defined(GROUP_errorget) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +QEIErrorGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Return the error indicator. + // + return((HWREG(ulBase + QEI_O_STAT) & QEI_STAT_ERROR) ? true : false); +} +#endif + +//***************************************************************************** +// +//! Enables the velocity capture. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This will enable operation of the velocity capture in the quadrature +//! encoder module. It must be configured before it is enabled. Velocity +//! capture will not occur if the quadrature encoder is not enabled. +//! +//! \sa QEIVelocityConfigure() and QEIEnable() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_velocityenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIVelocityEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Enable the velocity capture. + // + HWREG(ulBase + QEI_O_CTL) |= QEI_CTL_VELEN; +} +#endif + +//***************************************************************************** +// +//! Disables the velocity capture. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This will disable operation of the velocity capture in the quadrature +//! encoder module. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_velocitydisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIVelocityDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Disable the velocity capture. + // + HWREG(ulBase + QEI_O_CTL) &= ~(QEI_CTL_VELEN); +} +#endif + +//***************************************************************************** +// +//! Configures the velocity capture. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param ulPreDiv specifies the predivider applied to the input quadrature +//! signal before it is counted; can be one of QEI_VELDIV_1, QEI_VELDIV_2, +//! QEI_VELDIV_4, QEI_VELDIV_8, QEI_VELDIV_16, QEI_VELDIV_32, QEI_VELDIV_64, or +//! QEI_VELDIV_128. +//! \param ulPeriod specifies the number of clock ticks over which to measure +//! the velocity; must be non-zero. +//! +//! This will configure the operation of the velocity capture portion of the +//! quadrature encoder. The position increment signal is predivided as +//! specified by \e ulPreDiv before being accumulated by the velocity capture. +//! The divided signal is accumulated over \e ulPeriod system clock before +//! being saved and resetting the accumulator. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_velocityconfigure) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIVelocityConfigure(unsigned long ulBase, unsigned long ulPreDiv, + unsigned long ulPeriod) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + ASSERT(!(ulPreDiv & ~(QEI_CTL_VELDIV_M))); + ASSERT(ulPeriod != 0); + + // + // Set the velocity predivider. + // + HWREG(ulBase + QEI_O_CTL) = ((HWREG(ulBase + QEI_O_CTL) & + ~(QEI_CTL_VELDIV_M)) | ulPreDiv); + + // + // Set the timer period. + // + HWREG(ulBase + QEI_O_LOAD) = ulPeriod - 1; +} +#endif + +//***************************************************************************** +// +//! Gets the current encoder speed. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This returns the current speed of the encoder. The value returned is the +//! number of pulses detected in the specified time period; this number can be +//! multiplied by the number of time periods per second and divided by the +//! number of pulses per revolution to obtain the number of revolutions per +//! second. +//! +//! \return The number of pulses captured in the given time period. +// +//***************************************************************************** +#if defined(GROUP_velocityget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +QEIVelocityGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Return the speed capture value. + // + return(HWREG(ulBase + QEI_O_SPEED)); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the quadrature encoder interrupt. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param pfnHandler is a pointer to the function to be called when the +//! quadrature encoder interrupt occurs. +//! +//! This sets the handler to be called when a quadrature encoder interrupt +//! occurs. This will enable the global interrupt in the interrupt controller; +//! specific quadrature encoder interrupts must be enabled via QEIIntEnable(). +//! It is the interrupt handler's responsibility to clear the interrupt source +//! via QEIIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIIntRegister(unsigned long ulBase, void (*pfnHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(INT_QEI, pfnHandler); + + // + // Enable the quadrature encoder interrupt. + // + IntEnable(INT_QEI); +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for the quadrature encoder interrupt. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This function will clear the handler to be called when a quadrature encoder +//! interrupt occurs. This will also mask off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIIntUnregister(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Disable the interrupt. + // + IntDisable(INT_QEI); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_QEI); +} +#endif + +//***************************************************************************** +// +//! Enables individual quadrature encoder interrupt sources. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param ulIntFlags is a bit mask of the interrupt sources to be enabled. +//! Can be any of the QEI_INTERROR, QEI_INTDIR, QEI_INTTIMER, or QEI_INTINDEX +//! values. +//! +//! Enables the indicated quadrature encoder interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt; +//! disabled sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIIntEnable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Enable the specified interrupts. + // + HWREG(ulBase + QEI_O_INTEN) |= ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Disables individual quadrature encoder interrupt sources. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param ulIntFlags is a bit mask of the interrupt sources to be disabled. +//! Can be any of the QEI_INTERROR, QEI_INTDIR, QEI_INTTIMER, or QEI_INTINDEX +//! values. +//! +//! Disables the indicated quadrature encoder interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt; +//! disabled sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIIntDisable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Disable the specified interrupts. + // + HWREG(ulBase + QEI_O_INTEN) &= ~(ulIntFlags); +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param bMasked is false if the raw interrupt status is required and true if +//! the masked interrupt status is required. +//! +//! This returns the interrupt status for the quadrature encoder module. +//! Either the raw interrupt status or the status of interrupts that are +//! allowed to reflect to the processor can be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! QEI_INTERROR, QEI_INTDIR, QEI_INTTIMER, and QEI_INTINDEX. +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +QEIIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(ulBase + QEI_O_ISC)); + } + else + { + return(HWREG(ulBase + QEI_O_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears quadrature encoder interrupt sources. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param ulIntFlags is a bit mask of the interrupt sources to be cleared. +//! Can be any of the QEI_INTERROR, QEI_INTDIR, QEI_INTTIMER, or QEI_INTINDEX +//! values. +//! +//! The specified quadrature encoder interrupt sources are cleared, so that +//! they no longer assert. This must be done in the interrupt handler to keep +//! it from being called again immediately upon exit. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIIntClear(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Clear the requested interrupt sources. + // + HWREG(ulBase + QEI_O_ISC) = ulIntFlags; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/qei.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/qei.h new file mode 100644 index 0000000..3eaafae --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/qei.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// qei.h - Prototypes for the Quadrature Encoder Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __QEI_H__ +#define __QEI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to QEIConfigure as the ulConfig paramater. +// +//***************************************************************************** +#define QEI_CONFIG_CAPTURE_A 0x00000000 // Count on ChA edges only +#define QEI_CONFIG_CAPTURE_A_B 0x00000008 // Count on ChA and ChB edges +#define QEI_CONFIG_NO_RESET 0x00000000 // Do not reset on index pulse +#define QEI_CONFIG_RESET_IDX 0x00000010 // Reset position on index pulse +#define QEI_CONFIG_QUADRATURE 0x00000000 // ChA and ChB are quadrature +#define QEI_CONFIG_CLOCK_DIR 0x00000004 // ChA and ChB are clock and dir +#define QEI_CONFIG_NO_SWAP 0x00000000 // Do not swap ChA and ChB +#define QEI_CONFIG_SWAP 0x00000002 // Swap ChA and ChB + +//***************************************************************************** +// +// Values that can be passed to QEIVelocityConfigure as the ulPreDiv parameter. +// +//***************************************************************************** +#define QEI_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_VELDIV_128 0x000001C0 // Predivide by 128 + +//***************************************************************************** +// +// Values that can be passed to QEIEnableInts, QEIDisableInts, and QEIClearInts +// as the ulIntFlags parameter, and returned by QEIGetIntStatus. +// +//***************************************************************************** +#define QEI_INTERROR 0x00000008 // Phase error detected +#define QEI_INTDIR 0x00000004 // Direction change +#define QEI_INTTIMER 0x00000002 // Velocity timer expired +#define QEI_INTINDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void QEIEnable(unsigned long ulBase); +extern void QEIDisable(unsigned long ulBase); +extern void QEIConfigure(unsigned long ulBase, unsigned long ulConfig, + unsigned long ulMaxPosition); +extern unsigned long QEIPositionGet(unsigned long ulBase); +extern void QEIPositionSet(unsigned long ulBase, unsigned long ulPosition); +extern long QEIDirectionGet(unsigned long ulBase); +extern tBoolean QEIErrorGet(unsigned long ulBase); +extern void QEIVelocityEnable(unsigned long ulBase); +extern void QEIVelocityDisable(unsigned long ulBase); +extern void QEIVelocityConfigure(unsigned long ulBase, unsigned long ulPreDiv, + unsigned long ulPeriod); +extern unsigned long QEIVelocityGet(unsigned long ulBase); +extern void QEIIntRegister(unsigned long ulBase, void (*pfnHandler)(void)); +extern void QEIIntUnregister(unsigned long ulBase); +extern void QEIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void QEIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long QEIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void QEIIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __QEI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/ssi.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/ssi.c new file mode 100644 index 0000000..095aaab --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/ssi.c @@ -0,0 +1,609 @@ +//***************************************************************************** +// +// ssi.c - Driver for Synchronous Serial Interface. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ssi_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_ssi.h" +#include "../hw_types.h" +#include "debug.h" +#include "interrupt.h" +#include "ssi.h" +#include "sysctl.h" + +//***************************************************************************** +// +//! Configures the synchronous serial interface. +//! +//! \param ulBase specifies the SSI module base address. +//! \param ulProtocol specifies the data transfer protocol. +//! \param ulMode specifies the mode of operation. +//! \param ulBitRate specifies the clock rate. +//! \param ulDataWidth specifies number of bits transfered per frame. +//! +//! This function configures the synchronous serial interface. It sets +//! the SSI protocol, mode of operation, bit rate, and data width. +//! +//! The parameter \e ulProtocol defines the data frame format. The parameter +//! \e ulProtocol can be one of the following values: SSI_FRF_MOTO_MODE_0, +//! SSI_FRF_MOTO_MODE_1, SSI_FRF_MOTO_MODE_2, SSI_FRF_MOTO_MODE_3, +//! SSI_FRF_TI, or SSI_FRF_NMW. The Motorola frame formats imply the +//! following polarity and phase configurations: +//!
+//! Polarity Phase       Mode
+//!   0       0   SSI_FRF_MOTO_MODE_0
+//!   0       1   SSI_FRF_MOTO_MODE_1
+//!   1       0   SSI_FRF_MOTO_MODE_2
+//!   1       1   SSI_FRF_MOTO_MODE_3
+//! 
+//! +//! The parameter \e ulMode defines the operating mode of the SSI module. The +//! SSI module can operate as a master or slave; if a slave, the SSI can be +//! configured to disable output on its serial output line. The parameter +//! \e ulMode can be one of the following values: SSI_MODE_MASTER, +//! SSI_MODE_SLAVE, or SSI_MODE_SLAVE_OD. +//! +//! The parameter \e ulBitRate defines the bit rate for the SSI. This bit rate +//! must satisfy the following clock ratio criteria: +//! - FSSI >= 2 * bit rate (master mode) +//! - FSSI >= 12 * bit rate (slave modes) +//! +//! where FSSI is the frequency of the clock supplied to the SSI module. +//! +//! The parameter \e ulDataWidth defines the width of the data transfers. +//! The parameter \e ulDataWidth can be a value between 4 and 16, inclusive. +//! +//! The SSI clocking is dependent upon the system clock rate returned by +//! SysCtlClockGet(); if it does not return the correct system clock rate then +//! the SSI clock rate will be incorrect. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_config) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIConfig(unsigned long ulBase, unsigned long ulProtocol, unsigned long ulMode, + unsigned long ulBitRate, unsigned long ulDataWidth) +{ + unsigned long ulMaxBitRate; + unsigned long ulRegVal; + unsigned long ulPreDiv; + unsigned long ulSCR; + unsigned long ulSPH_SPO; + unsigned long ulClock; + + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + ASSERT((ulProtocol == SSI_FRF_MOTO_MODE_0) || + (ulProtocol == SSI_FRF_MOTO_MODE_1) || + (ulProtocol == SSI_FRF_MOTO_MODE_2) || + (ulProtocol == SSI_FRF_MOTO_MODE_3) || + (ulProtocol == SSI_FRF_TI) || + (ulProtocol == SSI_FRF_NMW)); + ASSERT((ulMode == SSI_MODE_MASTER) || + (ulMode == SSI_MODE_SLAVE) || + (ulMode == SSI_MODE_SLAVE_OD)); + ASSERT((ulDataWidth >= 4) && (ulDataWidth <= 16)); + + // + // Get the processor clock rate. + // + ulClock = SysCtlClockGet(); + + // + // Validate the clock speed. + // + ASSERT(((ulMode == SSI_MODE_MASTER) && (ulBitRate <= (ulClock / 2))) || + ((ulMode != SSI_MODE_MASTER) && (ulBitRate <= (ulClock / 12)))); + ASSERT((ulClock / ulBitRate) <= (254 * 256)); + + // + // Set the mode. + // + ulRegVal = (ulMode == SSI_MODE_SLAVE_OD) ? SSI_CR1_SOD : 0; + ulRegVal |= (ulMode == SSI_MODE_MASTER) ? 0 : SSI_CR1_MS; + HWREG(ulBase + SSI_O_CR1) = ulRegVal; + + // + // Set the clock predivider. + // + ulMaxBitRate = ulClock / ulBitRate; + ulPreDiv = 0; + do + { + ulPreDiv += 2; + ulSCR = (ulMaxBitRate / ulPreDiv) - 1; + } + while(ulSCR > 255); + HWREG(ulBase + SSI_O_CPSR) = ulPreDiv; + + // + // Set protocol and clock rate. + // + ulSPH_SPO = ulProtocol << 6; + ulProtocol &= SSI_CR0_FRF_MASK; + ulRegVal = (ulSCR << 8) | ulSPH_SPO | ulProtocol | (ulDataWidth - 1); + HWREG(ulBase + SSI_O_CR0) = ulRegVal; +} +#endif + +//***************************************************************************** +// +//! Enables the synchronous serial interface. +//! +//! \param ulBase specifies the SSI module base address. +//! +//! This will enable operation of the synchronous serial interface. It must be +//! configured before it is enabled. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Read-modify-write the enable bit. + // + HWREG(ulBase + SSI_O_CR1) |= SSI_CR1_SSE; +} +#endif + +//***************************************************************************** +// +//! Disables the synchronous serial interface. +//! +//! \param ulBase specifies the SSI module base address. +//! +//! This will disable operation of the synchronous serial interface. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_disable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Read-modify-write the enable bit. + // + HWREG(ulBase + SSI_O_CR1) &= ~(SSI_CR1_SSE); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the synchronous serial interface. +//! +//! \param ulBase specifies the SSI module base address. +//! \param pfnHandler is a pointer to the function to be called when the +//! synchronous serial interface interrupt occurs. +//! +//! This sets the handler to be called when an SSI interrupt +//! occurs. This will enable the global interrupt in the interrupt controller; +//! specific SSI interrupts must be enabled via SSIIntEnable(). If necessary, +//! it is the interrupt handler's responsibility to clear the interrupt source +//! via SSIIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIIntRegister(unsigned long ulBase, void (*pfnHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(INT_SSI, pfnHandler); + + // + // Enable the synchronous serial interface interrupt. + // + IntEnable(INT_SSI); +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for the synchronous serial interface. +//! +//! \param ulBase specifies the SSI module base address. +//! +//! This function will clear the handler to be called when a SSI +//! interrupt occurs. This will also mask off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIIntUnregister(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Disable the interrupt. + // + IntDisable(INT_SSI); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_SSI); +} +#endif + +//***************************************************************************** +// +//! Enables individual SSI interrupt sources. +//! +//! \param ulBase specifies the SSI module base address. +//! \param ulIntFlags is a bit mask of the interrupt sources to be enabled. +//! +//! Enables the indicated SSI interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources +//! have no effect on the processor. The parameter \e ulIntFlags Can be +//! any of the SSI_TXFF, SSI_RXFF, SSI_RXTO, or SSI_RXOR values. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Enable the specified interrupts. + // + HWREG(ulBase + SSI_O_IM) |= ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Disables individual SSI interrupt sources. +//! +//! \param ulBase specifies the SSI module base address. +//! \param ulIntFlags is a bit mask of the interrupt sources to be disabled. +//! +//! Disables the indicated SSI interrupt sources. The parameter +//! \e ulIntFlags Can be any of the SSI_TXFF, SSI_RXFF, SSI_RXTO, +//! or SSI_RXOR values. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Disable the specified interrupts. + // + HWREG(ulBase + SSI_O_IM) &= ~(ulIntFlags); +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param ulBase specifies the SSI module base address. +//! \param bMasked is false if the raw interrupt status is required and +//! true if the masked interrupt status is required. +//! +//! This returns the interrupt status for the SSI module. +//! Either the raw interrupt status or the status of interrupts that are +//! allowed to reflect to the processor can be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! SSI_TXFF, SSI_RXFF, SSI_RXTO, and SSI_RXOR. +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SSIIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(ulBase + SSI_O_MIS)); + } + else + { + return(HWREG(ulBase + SSI_O_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears SSI interrupt sources. +//! +//! \param ulBase specifies the SSI module base address. +//! \param ulIntFlags is a bit mask of the interrupt sources to be cleared. +//! +//! The specified SSI interrupt sources are cleared, so that +//! they no longer assert. This must be done in the interrupt handler to +//! keep it from being called again immediately upon exit. +//! The parameter \e ulIntFlags can consist of either or both the SSI_RXTO +//! and SSI_RXOR values. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Clear the requested interrupt sources. + // + HWREG(ulBase + SSI_O_ICR) = ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Puts a data element into the SSI transmit FIFO. +//! +//! \param ulBase specifies the SSI module base address. +//! \param ulData data to be transmitted over the SSI interface. +//! +//! This function will place the supplied data into the transmit FIFO of +//! the specified SSI module. +//! +//! \note The upper 32 - N bits of the \e ulData will be discarded by the +//! hardware, where N is the data width as configured by SSIConfig(). For +//! example, if the interface is configured for 8 bit data width, the upper 24 +//! bits of \e ulData will be discarded. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_dataput) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIDataPut(unsigned long ulBase, unsigned long ulData) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + ASSERT((ulData & (0xfffffffe << (HWREG(ulBase + SSI_O_CR0) & + SSI_CR0_DSS))) == 0); + + // + // Wait until there is space. + // + while(!(HWREG(ulBase + SSI_O_SR) & SSI_SR_TNF)) + { + } + + // + // Write the data to the SSI. + // + HWREG(ulBase + SSI_O_DR) = ulData; +} +#endif + +//***************************************************************************** +// +//! Puts a data element into the SSI transmit FIFO. +//! +//! \param ulBase specifies the SSI module base address. +//! \param ulData data to be transmitted over the SSI interface. +//! +//! This function will place the supplied data into the transmit FIFO of +//! the specified SSI module. If there is no space in the FIFO, then this +//! function will return a zero. +//! +//! \note The upper 32 - N bits of the \e ulData will be discarded by the +//! hardware, where N is the data width as configured by SSIConfig(). For +//! example, if the interface is configured for 8 bit data width, the upper 24 +//! bits of \e ulData will be discarded. +//! +//! \return Returns the number of elements written to the SSI transmit FIFO. +// +//***************************************************************************** +#if defined(GROUP_datanonblockingput) || defined(BUILD_ALL) || defined(DOXYGEN) +long +SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + ASSERT((ulData & (0xfffffffe << (HWREG(ulBase + SSI_O_CR0) & + SSI_CR0_DSS))) == 0); + + // + // Check for space to write. + // + if(HWREG(ulBase + SSI_O_SR) & SSI_SR_TNF) + { + HWREG(ulBase + SSI_O_DR) = ulData; + return(1); + } + else + { + return(0); + } +} +#endif + +//***************************************************************************** +// +//! Gets a data element from the SSI receive FIFO. +//! +//! \param ulBase specifies the SSI module base address. +//! \param pulData pointer to a storage location for data that was received +//! over the SSI interface. +//! +//! This function will get received data from the receive FIFO of the specified +//! SSI module, and place that data into the location specified by the +//! \e pulData parameter. +//! +//! \note Only the lower N bits of the value written to \e pulData will contain +//! valid data, where N is the data width as configured by SSIConfig(). For +//! example, if the interface is configured for 8 bit data width, only the +//! lower 8 bits of the value written to \e pulData will contain valid data. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_dataget) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIDataGet(unsigned long ulBase, unsigned long *pulData) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Wait until there is data to be read. + // + while(!(HWREG(ulBase + SSI_O_SR) & SSI_SR_RNE)) + { + } + + // + // Read data from SSI. + // + *pulData = HWREG(ulBase + SSI_O_DR); +} +#endif + +//***************************************************************************** +// +//! Gets a data element from the SSI receive FIFO. +//! +//! \param ulBase specifies the SSI module base address. +//! \param pulData pointer to a storage location for data that was received +//! over the SSI interface. +//! +//! This function will get received data from the receive FIFO of +//! the specified SSI module, and place that data into the location specified +//! by the \e ulData parameter. If there is no data in the FIFO, then this +//! function will return a zero. +//! +//! \note Only the lower N bits of the value written to \e pulData will contain +//! valid data, where N is the data width as configured by SSIConfig(). For +//! example, if the interface is configured for 8 bit data width, only the +//! lower 8 bits of the value written to \e pulData will contain valid data. +//! +//! \return Returns the number of elements read from the SSI receive FIFO. +// +//***************************************************************************** +#if defined(GROUP_datanonblockingget) || defined(BUILD_ALL) || defined(DOXYGEN) +long +SSIDataNonBlockingGet(unsigned long ulBase, unsigned long *pulData) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Check for data to read. + // + if(HWREG(ulBase + SSI_O_SR) & SSI_SR_RNE) + { + *pulData = HWREG(ulBase + SSI_O_DR); + return(1); + } + else + { + return(0); + } +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/ssi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/ssi.h new file mode 100644 index 0000000..045d8cb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/ssi.h @@ -0,0 +1,89 @@ +//***************************************************************************** +// +// ssi.h - Prototypes for the Synchronous Serial Interface Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SSI_H__ +#define __SSI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to SSIIntEnable, SSIIntDisable, and SSIIntClear +// as the ulIntFlags parameter, and returned by SSIIntStatus. +// +//***************************************************************************** +#define SSI_TXFF 0x00000008 // TX FIFO half empty or less +#define SSI_RXFF 0x00000004 // RX FIFO half full or less +#define SSI_RXTO 0x00000002 // RX timeout +#define SSI_RXOR 0x00000001 // RX overrun + +//***************************************************************************** +// +// Values that can be passed to SSIConfig. +// +//***************************************************************************** +#define SSI_FRF_MOTO_MODE_0 0x00000000 // Moto fmt, polarity 0, phase 0 +#define SSI_FRF_MOTO_MODE_1 0x00000002 // Moto fmt, polarity 0, phase 1 +#define SSI_FRF_MOTO_MODE_2 0x00000001 // Moto fmt, polarity 1, phase 0 +#define SSI_FRF_MOTO_MODE_3 0x00000003 // Moto fmt, polarity 1, phase 1 +#define SSI_FRF_TI 0x00000010 // TI frame format +#define SSI_FRF_NMW 0x00000020 // National MicroWire frame format + +#define SSI_MODE_MASTER 0x00000000 // SSI master +#define SSI_MODE_SLAVE 0x00000001 // SSI slave +#define SSI_MODE_SLAVE_OD 0x00000002 // SSI slave with output disabled + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SSIConfig(unsigned long ulBase, unsigned long ulProtocol, + unsigned long ulMode, unsigned long ulBitRate, + unsigned long ulDataWidth); +extern void SSIDataGet(unsigned long ulBase, unsigned long *pulData); +extern long SSIDataNonBlockingGet(unsigned long ulBase, + unsigned long *pulData); +extern void SSIDataPut(unsigned long ulBase, unsigned long ulData); +extern long SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData); +extern void SSIDisable(unsigned long ulBase); +extern void SSIEnable(unsigned long ulBase); +extern void SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern unsigned long SSIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void SSIIntUnregister(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __SSI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/sysctl.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/sysctl.c new file mode 100644 index 0000000..539d0f7 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/sysctl.c @@ -0,0 +1,1889 @@ +//***************************************************************************** +// +// sysctl.c - Driver for the system controller. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. ALl rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup sysctl_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_nvic.h" +#include "../hw_sysctl.h" +#include "../hw_types.h" +#include "cpu.h" +#include "debug.h" +#include "interrupt.h" +#include "sysctl.h" + +//***************************************************************************** +// +// An array that maps the "peripheral set" number (which is stored in the upper +// nibble of the SYSCTL_PERIPH_* defines) to the SYSCTL DC? register that +// contains the peripheral present bit for that peripheral. +// +//***************************************************************************** +#if defined(GROUP_puldcregs) || defined(BUILD_ALL) +const unsigned long g_pulDCRegs[] = +{ + SYSCTL_DC1, + SYSCTL_DC2, + SYSCTL_DC4, + SYSCTL_DC1 +}; +#else +extern const unsigned long g_pulDCRegs[]; +#endif + +//***************************************************************************** +// +// An array that maps the "peripheral set" number (which is stored in the upper +// nibble of the SYSCTL_PERIPH_* defines) to the SYSCTL_SRCR? register that +// controls the software reset for that peripheral. +// +//***************************************************************************** +#if defined(GROUP_pulsrcrregs) || defined(BUILD_ALL) +const unsigned long g_pulSRCRRegs[] = +{ + SYSCTL_SRCR0, + SYSCTL_SRCR1, + SYSCTL_SRCR2 +}; +#else +extern const unsigned long g_pulSRCRRegs[]; +#endif + +//***************************************************************************** +// +// An array that maps the "peripheral set" number (which is stored in the upper +// nibble of the SYSCTL_PERIPH_* defines) to the SYSCTL_RCGC? register that +// controls the run-mode enable for that peripheral. +// +//***************************************************************************** +#if defined(GROUP_pulrcgcregs) || defined(BUILD_ALL) +const unsigned long g_pulRCGCRegs[] = +{ + SYSCTL_RCGC0, + SYSCTL_RCGC1, + SYSCTL_RCGC2 +}; +#else +extern const unsigned long g_pulRCGCRegs[]; +#endif + +//***************************************************************************** +// +// An array that maps the "peripheral set" number (which is stored in the upper +// nibble of the SYSCTL_PERIPH_* defines) to the SYSCTL_SCGC? register that +// controls the sleep-mode enable for that peripheral. +// +//***************************************************************************** +#if defined(GROUP_pulscgcregs) || defined(BUILD_ALL) +const unsigned long g_pulSCGCRegs[] = +{ + SYSCTL_SCGC0, + SYSCTL_SCGC1, + SYSCTL_SCGC2 +}; +#else +extern const unsigned long g_pulSCGCRegs[]; +#endif + +//***************************************************************************** +// +// An array that maps the "peripheral set" number (which is stored in the upper +// nibble of the SYSCTL_PERIPH_* defines) to the SYSCTL_DCGC? register that +// controls the deep-sleep-mode enable for that peripheral. +// +//***************************************************************************** +#if defined(GROUP_pulDCGCregs) || defined(BUILD_ALL) +const unsigned long g_pulDCGCRegs[] = +{ + SYSCTL_DCGC0, + SYSCTL_DCGC1, + SYSCTL_DCGC2 +}; +#else +extern const unsigned long g_pulDCGCRegs[]; +#endif + +//***************************************************************************** +// +// An array that maps the crystal number in RCC to a frequency. +// +//***************************************************************************** +#if defined(GROUP_pulxtals) || defined(BUILD_ALL) +const unsigned long g_pulXtals[] = +{ + 3579545, + 3686400, + 4000000, + 4096000, + 4915200, + 5000000, + 5120000, + 6000000, + 6144000, + 7372800, + 8000000, + 8192000 +}; +#else +extern const unsigned long g_pulXtals[]; +#endif + +//***************************************************************************** +// +//! Gets the size of the SRAM. +//! +//! This function determines the size of the SRAM on the Stellaris device. +//! +//! \return The total number of bytes of SRAM. +// +//***************************************************************************** +#if defined(GROUP_sramsizeget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlSRAMSizeGet(void) +{ + // + // Compute the size of the SRAM. + // + return(((HWREG(SYSCTL_DC0) & SYSCTL_DC0_SRAMSZ_MASK) >> 8) + 0x100); +} +#endif + +//***************************************************************************** +// +//! Gets the size of the flash. +//! +//! This function determines the size of the flash on the Stellaris device. +//! +//! \return The total number of bytes of flash. +// +//***************************************************************************** +#if defined(GROUP_flashsizeget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlFlashSizeGet(void) +{ + // + // Compute the size of the flash. + // + return(((HWREG(SYSCTL_DC0) & SYSCTL_DC0_FLASHSZ_MASK) << 11) + 0x800); +} +#endif + +//***************************************************************************** +// +//! Determines if a pin is present. +//! +//! \param ulPin is the pin in question. +//! +//! Determines if a particular pin is present in the device. The PWM, analog +//! comparators, ADC, and timers have a varying number of pins across members +//! of the Stellaris family; this will determine which are present on this +//! device. +//! +//! The \b ulPin argument must be only one of the following values: +//! \b SYSCTL_PIN_PWM0, \b SYSCTL_PIN_PWM1, \b SYSCTL_PIN_PWM2, +//! \b SYSCTL_PIN_PWM3, \b SYSCTL_PIN_PWM4, \b SYSCTL_PIN_PWM5, +//! \b SYSCTL_PIN_C0MINUS, \b SYSCTL_PIN_C0PLUS, \b SYSCTL_PIN_C0O, +//! \b SYSCTL_PIN_C1MINUS, \b SYSCTL_PIN_C1PLUS, \b SYSCTL_PIN_C1O, +//! \b SYSCTL_PIN_C2MINUS, \b SYSCTL_PIN_C2PLUS, \b SYSCTL_PIN_C2O, +//! \b SYSCTL_PIN_ADC0, \b SYSCTL_PIN_ADC1, \b SYSCTL_PIN_ADC2, +//! \b SYSCTL_PIN_ADC3, \b SYSCTL_PIN_ADC4, \b SYSCTL_PIN_ADC5, +//! \b SYSCTL_PIN_ADC6, \b SYSCTL_PIN_ADC7, \b SYSCTL_PIN_CCP0, +//! \b SYSCTL_PIN_CCP1, \b SYSCTL_PIN_CCP2, \b SYSCTL_PIN_CCP3, +//! \b SYSCTL_PIN_CCP4, \b SYSCTL_PIN_CCP5, or \b SYSCTL_PIN_32KHZ. +//! +//! \return Returns \b true if the specified pin is present and \b false if it +//! is not. +// +//***************************************************************************** +#if defined(GROUP_pinpresent) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +SysCtlPinPresent(unsigned long ulPin) +{ + // + // Check the arguments. + // + ASSERT((ulPin == SYSCTL_PIN_PWM0) || + (ulPin == SYSCTL_PIN_PWM1) || + (ulPin == SYSCTL_PIN_PWM2) || + (ulPin == SYSCTL_PIN_PWM3) || + (ulPin == SYSCTL_PIN_PWM4) || + (ulPin == SYSCTL_PIN_PWM5) || + (ulPin == SYSCTL_PIN_C0MINUS) || + (ulPin == SYSCTL_PIN_C0PLUS) || + (ulPin == SYSCTL_PIN_C0O) || + (ulPin == SYSCTL_PIN_C1MINUS) || + (ulPin == SYSCTL_PIN_C1PLUS) || + (ulPin == SYSCTL_PIN_C1O) || + (ulPin == SYSCTL_PIN_C2MINUS) || + (ulPin == SYSCTL_PIN_C2PLUS) || + (ulPin == SYSCTL_PIN_C2O) || + (ulPin == SYSCTL_PIN_ADC0) || + (ulPin == SYSCTL_PIN_ADC1) || + (ulPin == SYSCTL_PIN_ADC2) || + (ulPin == SYSCTL_PIN_ADC3) || + (ulPin == SYSCTL_PIN_ADC4) || + (ulPin == SYSCTL_PIN_ADC5) || + (ulPin == SYSCTL_PIN_ADC6) || + (ulPin == SYSCTL_PIN_ADC7) || + (ulPin == SYSCTL_PIN_CCP0) || + (ulPin == SYSCTL_PIN_CCP1) || + (ulPin == SYSCTL_PIN_CCP2) || + (ulPin == SYSCTL_PIN_CCP3) || + (ulPin == SYSCTL_PIN_CCP4) || + (ulPin == SYSCTL_PIN_CCP5) || + (ulPin == SYSCTL_PIN_32KHZ)) + + // + // Determine if this pin is present. + // + if(HWREG(SYSCTL_DC3) & ulPin) + { + return(true); + } + else + { + return(false); + } +} +#endif + +//***************************************************************************** +// +//! Determines if a peripheral is present. +//! +//! \param ulPeripheral is the peripheral in question. +//! +//! Determines if a particular peripheral is present in the device. Each +//! member of the Stellaris family has a different peripheral set; this will +//! determine which are present on this device. +//! +//! The \b ulPeripheral argument must be only one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, +//! \b SYSCTL_PERIPH_GPIOE, \b SYSCTL_PERIPH_MPU, \b SYSCTL_PERIPH_TEMP, or +//! \b SYSCTL_PERIPH_PLL. +//! +//! \return Returns \b true if the specified peripheral is present and \b false +//! if it is not. +// +//***************************************************************************** +#if defined(GROUP_peripheralpresent) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +SysCtlPeripheralPresent(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE) || + (ulPeripheral == SYSCTL_PERIPH_MPU) || + (ulPeripheral == SYSCTL_PERIPH_TEMP) || + (ulPeripheral == SYSCTL_PERIPH_PLL)); + + // + // Read the correct DC register and determine if this peripheral exists. + // + if(HWREG(g_pulDCRegs[ulPeripheral >> 28]) & ulPeripheral & 0x0fffffff) + { + return(true); + } + else + { + return(false); + } +} +#endif + +//***************************************************************************** +// +//! Performs a software reset of a peripheral. +//! +//! \param ulPeripheral is the peripheral to reset. +//! +//! This function performs a software reset of the specified peripheral. An +//! individual peripheral reset signal is asserted for a brief period and then +//! deasserted, leaving the peripheral in a operating state but in its reset +//! condition. +//! +//! The \b ulPeripheral argument must be only one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheralreset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlPeripheralReset(unsigned long ulPeripheral) +{ + volatile unsigned long ulDelay; + + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Put the peripheral into the reset state. + // + HWREG(g_pulSRCRRegs[ulPeripheral >> 28]) |= ulPeripheral & 0x0fffffff; + + // + // Delay for a little bit. + // + for(ulDelay = 0; ulDelay < 16; ulDelay++) + { + } + + // + // Take the peripheral out of the reset state. + // + HWREG(g_pulSRCRRegs[ulPeripheral >> 28]) &= ~(ulPeripheral); +} +#endif + +//***************************************************************************** +// +//! Enables a peripheral. +//! +//! \param ulPeripheral is the peripheral to enable. +//! +//! Peripherals are enabled with this function. At power-up, all peripherals +//! are disabled; they must be enabled in order to operate or respond to +//! register reads/writes. +//! +//! The \b ulPeripheral argument must be only one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheralenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlPeripheralEnable(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Enable this peripheral. + // + HWREG(g_pulRCGCRegs[ulPeripheral >> 28]) |= ulPeripheral & 0x0fffffff; +} +#endif + +//***************************************************************************** +// +//! Disables a peripheral. +//! +//! \param ulPeripheral is the peripheral to disable. +//! +//! Peripherals are disabled with this function. Once disabled, they will not +//! operate or respond to register reads/writes. +//! +//! The \b ulPeripheral argument must be only one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheraldisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlPeripheralDisable(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Disable this peripheral. + // + HWREG(g_pulRCGCRegs[ulPeripheral >> 28]) &= ~(ulPeripheral & 0x0fffffff); +} +#endif + +//***************************************************************************** +// +//! Enables a peripheral in sleep mode. +//! +//! \param ulPeripheral is the peripheral to enable in sleep mode. +//! +//! This function allows a peripheral to continue operating when the processor +//! goes into sleep mode. Since the clocking configuration of the device does +//! not change, any peripheral can safely continue operating while the +//! processor is in sleep mode, and can therefore wake the processor from sleep +//! mode. +//! +//! Sleep mode clocking of peripherals must be enabled via +//! SysCtlPeripheralClockGating(); if disabled, the peripheral sleep mode +//! configuration is maintained but has no effect when sleep mode is entered. +//! +//! The \b ulPeripheral argument must be only one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheralsleepenable) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlPeripheralSleepEnable(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Enable this peripheral in sleep mode. + // + HWREG(g_pulSCGCRegs[ulPeripheral >> 28]) |= ulPeripheral & 0x0fffffff; +} +#endif + +//***************************************************************************** +// +//! Disables a peripheral in sleep mode. +//! +//! \param ulPeripheral is the peripheral to disable in sleep mode. +//! +//! This function causes a peripheral to stop operating when the processor goes +//! into sleep mode. Disabling peripherals while in sleep mode helps to lower +//! the current draw of the device. If enabled (via SysCtlPeripheralEnable()), +//! the peripheral will automatically resume operation when the processor +//! leaves sleep mode, maintaining its entire state from before sleep mode was +//! entered. +//! +//! Sleep mode clocking of peripherals must be enabled via +//! SysCtlPeripheralClockGating(); if disabled, the peripheral sleep mode +//! configuration is maintained but has no effect when sleep mode is entered. +//! +//! The \b ulPeripheral argument must be only one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheralsleepdisable) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlPeripheralSleepDisable(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Disable this peripheral in sleep mode. + // + HWREG(g_pulSCGCRegs[ulPeripheral >> 28]) &= ~(ulPeripheral & 0x0fffffff); +} +#endif + +//***************************************************************************** +// +//! Enables a peripheral in deep-sleep mode. +//! +//! \param ulPeripheral is the peripheral to enable in deep-sleep mode. +//! +//! This function allows a peripheral to continue operating when the processor +//! goes into deep-sleep mode. Since the clocking configuration of the device +//! may change, not all peripherals can safely continue operating while the +//! processor is in sleep mode. Those that must run at a particular frequency +//! (such as a UART) will not work as expected if the clock changes. It is the +//! responsibility of the caller to make sensible choices. +//! +//! Deep-sleep mode clocking of peripherals must be enabled via +//! SysCtlPeripheralClockGating(); if disabled, the peripheral deep-sleep mode +//! configuration is maintained but has no effect when deep-sleep mode is +//! entered. +//! +//! The \b ulPeripheral argument must be one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheraldeepsleepenable) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Enable this peripheral in deep-sleep mode. + // + HWREG(g_pulDCGCRegs[ulPeripheral >> 28]) |= ulPeripheral & 0x0fffffff; +} +#endif + +//***************************************************************************** +// +//! Disables a peripheral in deep-sleep mode. +//! +//! \param ulPeripheral is the peripheral to disable in deep-sleep mode. +//! +//! This function causes a peripheral to stop operating when the processor goes +//! into deep-sleep mode. Disabling peripherals while in deep-sleep mode helps +//! to lower the current draw of the device, and can keep peripherals that +//! require a particular clock frequency from operating when the clock changes +//! as a result of entering deep-sleep mode. If enabled (via +//! SysCtlPeripheralEnable()), the peripheral will automatically resume +//! operation when the processor leaves deep-sleep mode, maintaining its entire +//! state from before deep-sleep mode was entered. +//! +//! Deep-sleep mode clocking of peripherals must be enabled via +//! SysCtlPeripheralClockGating(); if disabled, the peripheral deep-sleep mode +//! configuration is maintained but has no effect when deep-sleep mode is +//! entered. +//! +//! The \b ulPeripheral argument must be one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheraldeepsleepdisable) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Disable this peripheral in deep-sleep mode. + // + HWREG(g_pulDCGCRegs[ulPeripheral >> 28]) &= ~(ulPeripheral & 0x0fffffff); +} +#endif + +//***************************************************************************** +// +//! Controls peripheral clock gating in sleep and deep-sleep mode. +//! +//! \param bEnable is a boolean that is \b true if the sleep and deep-sleep +//! peripheral configuration should be used and \b false if not. +//! +//! This function controls how peripherals are clocked when the processor goes +//! into sleep or deep-sleep mode. By default, the peripherals are clocked the +//! same as in run mode; if peripheral clock gating is enabled they are clocked +//! according to the configuration set by SysCtlPeripheralSleepEnable(), +//! SysCtlPeripheralSleepDisable(), SysCtlPeripheralDeepSleepEnable(), and +//! SysCtlPeripheralDeepSleepDisable(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheralclockgating) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlPeripheralClockGating(tBoolean bEnable) +{ + // + // Enable peripheral clock gating as requested. + // + if(bEnable) + { + HWREG(SYSCTL_RCC) |= SYSCTL_RCC_ACG; + } + else + { + HWREG(SYSCTL_RCC) &= ~(SYSCTL_RCC_ACG); + } +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the system control interrupt. +//! +//! \param pfnHandler is a pointer to the function to be called when the system +//! control interrupt occurs. +//! +//! This sets the handler to be called when a system control interrupt occurs. +//! This will enable the global interrupt in the interrupt controller; specific +//! system control interrupts must be enabled via SysCtlIntEnable(). It is the +//! interrupt handler's responsibility to clear the interrupt source via +//! SysCtlIntClear(). +//! +//! System control can generate interrupts when the PLL achieves lock, if the +//! internal LDO current limit is exceeded, if the internal oscillator fails, +//! if the main oscillator fails, if the internal LDO output voltage droops too +//! much, if the external voltage droops too much, or if the PLL fails. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlIntRegister(void (*pfnHandler)(void)) +{ + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(INT_SYSCTL, pfnHandler); + + // + // Enable the system control interrupt. + // + IntEnable(INT_SYSCTL); +} +#endif + +//***************************************************************************** +// +//! Unregisters the interrupt handler for the system control interrupt. +//! +//! This function will clear the handler to be called when a system control +//! interrupt occurs. This will also mask off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlIntUnregister(void) +{ + // + // Disable the interrupt. + // + IntDisable(INT_SYSCTL); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_SYSCTL); +} +#endif + +//***************************************************************************** +// +//! Enables individual system control interrupt sources. +//! +//! \param ulInts is a bit mask of the interrupt sources to be enabled. Must +//! be a logical OR of \b SYSCTL_INT_PLL_LOCK, \b SYSCTL_INT_CUR_LIMIT, +//! \b SYSCTL_INT_IOSC_FAIL, \b SYSCTL_INT_MOSC_FAIL, \b SYSCTL_INT_POR, +//! \b SYSCTL_INT_BOR, and/or \b SYSCTL_INT_PLL_FAIL. +//! +//! Enables the indicated system control interrupt sources. Only the sources +//! that are enabled can be reflected to the processor interrupt; disabled +//! sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlIntEnable(unsigned long ulInts) +{ + // + // Enable the specified interrupts. + // + HWREG(SYSCTL_IMC) |= ulInts; +} +#endif + +//***************************************************************************** +// +//! Disables individual system control interrupt sources. +//! +//! \param ulInts is a bit mask of the interrupt sources to be disabled. Must +//! be a logical OR of \b SYSCTL_INT_PLL_LOCK, \b SYSCTL_INT_CUR_LIMIT, +//! \b SYSCTL_INT_IOSC_FAIL, \b SYSCTL_INT_MOSC_FAIL, \b SYSCTL_INT_POR, +//! \b SYSCTL_INT_BOR, and/or \b SYSCTL_INT_PLL_FAIL. +//! +//! Disables the indicated system control interrupt sources. Only the sources +//! that are enabled can be reflected to the processor interrupt; disabled +//! sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlIntDisable(unsigned long ulInts) +{ + // + // Disable the specified interrupts. + // + HWREG(SYSCTL_IMC) &= ~(ulInts); +} +#endif + +//***************************************************************************** +// +//! Clears system control interrupt sources. +//! +//! \param ulInts is a bit mask of the interrupt sources to be cleared. Must +//! be a logical OR of \b SYSCTL_INT_PLL_LOCK, \b SYSCTL_INT_CUR_LIMIT, +//! \b SYSCTL_INT_IOSC_FAIL, \b SYSCTL_INT_MOSC_FAIL, \b SYSCTL_INT_POR, +//! \b SYSCTL_INT_BOR, and/or \b SYSCTL_INT_PLL_FAIL. +//! +//! The specified system control interrupt sources are cleared, so that they no +//! longer assert. This must be done in the interrupt handler to keep it from +//! being called again immediately upon exit. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlIntClear(unsigned long ulInts) +{ + // + // Clear the requested interrupt sources. + // + HWREG(SYSCTL_MISC) = ulInts; +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param bMasked is false if the raw interrupt status is required and true if +//! the masked interrupt status is required. +//! +//! This returns the interrupt status for the system controller. Either the +//! raw interrupt status or the status of interrupts that are allowed to +//! reflect to the processor can be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! \b SYSCTL_INT_PLL_LOCK, \b SYSCTL_INT_CUR_LIMIT, \b SYSCTL_INT_IOSC_FAIL, +//! \b SYSCTL_INT_MOSC_FAIL, \b SYSCTL_INT_POR, \b SYSCTL_INT_BOR, and +//! \b SYSCTL_INT_PLL_FAIL. +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlIntStatus(tBoolean bMasked) +{ + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(SYSCTL_MISC)); + } + else + { + return(HWREG(SYSCTL_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Sets the output voltage of the LDO. +//! +//! \param ulVoltage is the required output voltage from the LDO. Must be one +//! of \b SYSCTL_LDO_2_25V, \b SYSCTL_LDO_2_30V, \b SYSCTL_LDO_2_35V, +//! \b SYSCTL_LDO_2_40V, \b SYSCTL_LDO_2_45V, \b SYSCTL_LDO_2_50V, +//! \b SYSCTL_LDO_2_55V, \b SYSCTL_LDO_2_60V, \b SYSCTL_LDO_2_65V, +//! \b SYSCTL_LDO_2_70V, or \b SYSCTL_LDO_2_75V. +//! +//! This function sets the output voltage of the LDO. The default voltage is +//! 2.5 V; it can be adjusted +/- 10%. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_ldoset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlLDOSet(unsigned long ulVoltage) +{ + // + // Check the arguments. + // + ASSERT((ulVoltage == SYSCTL_LDO_2_25V) || + (ulVoltage == SYSCTL_LDO_2_30V) || + (ulVoltage == SYSCTL_LDO_2_35V) || + (ulVoltage == SYSCTL_LDO_2_40V) || + (ulVoltage == SYSCTL_LDO_2_45V) || + (ulVoltage == SYSCTL_LDO_2_50V) || + (ulVoltage == SYSCTL_LDO_2_55V) || + (ulVoltage == SYSCTL_LDO_2_60V) || + (ulVoltage == SYSCTL_LDO_2_65V) || + (ulVoltage == SYSCTL_LDO_2_70V) || + (ulVoltage == SYSCTL_LDO_2_75V)); + + // + // Set the LDO voltage to the requested value. + // + HWREG(SYSCTL_LDOPCTL) = ulVoltage; +} +#endif + +//***************************************************************************** +// +//! Gets the output voltage of the LDO. +//! +//! This function determines the output voltage of the LDO, as specified by the +//! control register. +//! +//! \return Returns the current voltage of the LDO; will be one of +//! \b SYSCTL_LDO_2_25V, \b SYSCTL_LDO_2_30V, \b SYSCTL_LDO_2_35V, +//! \b SYSCTL_LDO_2_40V, \b SYSCTL_LDO_2_45V, \b SYSCTL_LDO_2_50V, +//! \b SYSCTL_LDO_2_55V, \b SYSCTL_LDO_2_60V, \b SYSCTL_LDO_2_65V, +//! \b SYSCTL_LDO_2_70V, or \b SYSCTL_LDO_2_75V. +// +//***************************************************************************** +#if defined(GROUP_ldoget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlLDOGet(void) +{ + // + // Return the LDO voltage setting. + // + return(HWREG(SYSCTL_LDOPCTL)); +} +#endif + +//***************************************************************************** +// +//! Configures the LDO failure control. +//! +//! \param ulConfig is the required LDO failure control setting; can be either +//! \b SYSCTL_LDOCFG_ARST or \b SYSCTL_LDOCFG_NORST. +//! +//! This function allows the LDO to be configured to cause a processor reset +//! when the output voltage becomes unregulated. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_ldoconfigset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlLDOConfigSet(unsigned long ulConfig) +{ + // + // Check hte arguments. + // + ASSERT((ulConfig == SYSCTL_LDOCFG_ARST) || + (ulConfig == SYSCTL_LDOCFG_NORST)); + + // + // Set the reset control as requested. + // + HWREG(SYSCTL_LDOARST) = ulConfig; +} +#endif + +//***************************************************************************** +// +//! Resets the device. +//! +//! This function will perform a software reset of the entire device. The +//! processor and all peripherals will be reset and all device registers will +//! return to their default values (with the exception of the reset cause +//! register, which will maintain its current value but have the software reset +//! bit set as well). +//! +//! \return This function does not return. +// +//***************************************************************************** +#if defined(GROUP_reset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlReset(void) +{ + // + // Perform a software reset request. This will cause the device to reset, + // no further code will be executed. + // + HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ; + + // + // The device should have reset, so this should never be reached. Just in + // case, loop forever. + // + while(1) + { + } +} +#endif + +//***************************************************************************** +// +//! Puts the processor into sleep mode. +//! +//! This function places the processor into sleep mode; it will not return +//! until the processor returns to run mode. The peripherals that are enabled +//! via SysCtlPeripheralSleepEnable() continue to operate and can wake up the +//! processor (if automatic clock gating is enabled with +//! SysCtlPeripheralClockGating(), otherwise all peripherals continue to +//! operate). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_sleep) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlSleep(void) +{ + // + // Wait for an interrupt. + // + CPUwfi(); +} +#endif + +//***************************************************************************** +// +//! Puts the processor into deep-sleep mode. +//! +//! This function places the processor into deep-sleep mode; it will not return +//! until the processor returns to run mode. The peripherals that are enabled +//! via SysCtlPeripheralDeepSleepEnable() continue to operate and can wake up +//! the processor (if automatic clock gating is enabled with +//! SysCtlPeripheralClockGating(), otherwise all peripherals continue to +//! operate). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_deepsleep) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlDeepSleep(void) +{ + // + // Enable deep-sleep. + // + HWREG(NVIC_SYS_CTRL) |= NVIC_SYS_CTRL_SLEEPDEEP; + + // + // Wait for an interrupt. + // + CPUwfi(); + + // + // Disable deep-sleep so that a future sleep will work correctly. + // + HWREG(NVIC_SYS_CTRL) &= ~(NVIC_SYS_CTRL_SLEEPDEEP); +} +#endif + +//***************************************************************************** +// +//! Gets the reason for a reset. +//! +//! This function will return the reason(s) for a reset. Since the reset +//! reasons are sticky until either cleared by software or an external reset, +//! multiple reset reasons may be returned if multiple resets have occurred. +//! The reset reason will be a logical OR of \b SYSCTL_CAUSE_LDO, +//! \b SYSCTL_CAUSE_SW, \b SYSCTL_CAUSE_WDOG, \b SYSCTL_CAUSE_BOR, +//! \b SYSCTL_CAUSE_POR, and/or \b SYSCTL_CAUSE_EXT. +//! +//! \return The reason(s) for a reset. +// +//***************************************************************************** +#if defined(GROUP_resetcauseget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlResetCauseGet(void) +{ + // + // Return the reset reasons. + // + return(HWREG(SYSCTL_RESC)); +} +#endif + +//***************************************************************************** +// +//! Clears reset reasons. +//! +//! \param ulCauses are the reset causes to be cleared; must be a logical OR of +//! \b SYSCTL_CAUSE_LDO, \b SYSCTL_CAUSE_SW, \b SYSCTL_CAUSE_WDOG, +//! \b SYSCTL_CAUSE_BOR, \b SYSCTL_CAUSE_POR, and/or \b SYSCTL_CAUSE_EXT. +//! +//! This function clears the specified sticky reset reasons. Once cleared, +//! another reset for the same reason can be detected, and a reset for a +//! different reason can be distinguished (instead of having two reset causes +//! set). If the reset reason is used by an application, all reset causes +//! should be cleared after they are retrieved with SysCtlResetCauseGet(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_resetcauseclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlResetCauseClear(unsigned long ulCauses) +{ + // + // Clear the given reset reasons. + // + HWREG(SYSCTL_RESC) &= ~(ulCauses); +} +#endif + +//***************************************************************************** +// +//! Configures the brown-out control. +//! +//! \param ulConfig is the desired configuration of the brown-out control. +//! Must be the logical OR of \b SYSCTL_BOR_RESET and/or +//! \b SYSCTL_BOR_RESAMPLE. +//! \param ulDelay is the number of internal oscillator cycles to wait before +//! resampling an asserted brown-out signal. This value only has meaning when +//! \b SYSCTL_BOR_RESAMPLE is set and must be less than 8192. +//! +//! This function configures how the brown-out control operates. It can detect +//! a brown-out by looking at only the brown-out output, or it can wait for it +//! to be active for two consecutive samples separated by a configurable time. +//! When it detects a brown-out condition, it can either reset the device or +//! generate a processor interrupt. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_brownoutconfigset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlBrownOutConfigSet(unsigned long ulConfig, unsigned long ulDelay) +{ + // + // Check the arguments. + // + ASSERT(!(ulConfig & ~(SYSCTL_BOR_RESET | SYSCTL_BOR_RESAMPLE))); + ASSERT(ulDelay < 8192); + + // + // Configure the brown-out reset control. + // + HWREG(SYSCTL_PBORCTL) = (ulDelay << SYSCTL_PBORCTL_BOR_SH) | ulConfig; +} +#endif + +//***************************************************************************** +// +//! Sets the clocking of the device. +//! +//! \param ulConfig is the required configuration of the device clocking. +//! +//! This function configures the clocking of the device. The input crystal +//! frequency, oscillator to be used, use of the PLL, and the system clock +//! divider are all configured with this function. +//! +//! The \b ulConfig parameter is the logical OR of several different values, +//! many of which are grouped into sets where only one can be chosen. +//! +//! The system clock divider is chosen with one of the following values: +//! \b SYSCTL_SYSDIV_1, \b SYSCTL_SYSDIV_2, \b SYSCTL_SYSDIV_3, +//! \b SYSCTL_SYSDIV_4, \b SYSCTL_SYSDIV_5, \b SYSCTL_SYSDIV_6, +//! \b SYSCTL_SYSDIV_7, \b SYSCTL_SYSDIV_8, \b SYSCTL_SYSDIV_9, +//! \b SYSCTL_SYSDIV_10, \b SYSCTL_SYSDIV_11, \b SYSCTL_SYSDIV_12, +//! \b SYSCTL_SYSDIV_13, \b SYSCTL_SYSDIV_14, \b SYSCTL_SYSDIV_15, or +//! \b SYSCTL_SYSDIV_16. +//! +//! The use of the PLL is chosen with either \b SYSCTL_USE_PLL or +//! \b SYSCTL_USE_OSC. +//! +//! The external crystal frequency is chosen with one of the following values: +//! \b SYSCTL_XTAL_3_57MHZ, \b SYSCTL_XTAL_3_68MHZ, \b SYSCTL_XTAL_4MHZ, +//! \b SYSCTL_XTAL_4_09MHZ, \b SYSCTL_XTAL_4_91MHZ, \b SYSCTL_XTAL_5MHZ, +//! \b SYSCTL_XTAL_5_12MHZ, \b SYSCTL_XTAL_6MHZ, \b SYSCTL_XTAL_6_14MHZ, +//! \b SYSCTL_XTAL_7_37MHZ, \b SYSCTL_XTAL_8MHZ, or \b SYSCTL_XTAL_8_19MHZ. +//! +//! The oscillator source is chosen with one of the following values: +//! \b SYSCTL_OSC_MAIN, \b SYSCTL_OSC_INT, or \b SYSCTL_OSC_INT4. +//! +//! The internal and main oscillators are disabled with the +//! \b SYSCTL_INT_OSC_DIS and \b SYSCTL_MAIN_OSC_DIS flags, respectively. +//! The external oscillator must be enabled in order to use an external clock +//! source. Note that attempts to disable the oscillator used to clock the +//! device will be prevented by the hardware. +//! +//! To clock the system from an external source (such as an external crystal +//! oscillator), use \b SYSCTL_USE_OSC \b | \b SYSCTL_OSC_MAIN. To clock the +//! system from the main oscillator, use \b SYSCTL_USE_OSC \b | +//! \b SYSCTL_OSC_MAIN. To clock the system from the PLL, use +//! \b SYSCTL_USE_PLL \b | \b SYSCTL_OSC_MAIN, and select the appropriate +//! crystal with one of the \b SYSCTL_XTAL_xxx values. +//! +//! \note If selecting the PLL as the system clock source (i.e. via +//! \b SYSCTL_USE_PLL), this function will poll the PLL lock interrupt to +//! determine when the PLL has locked. If an interrupt handler for the +//! system control interrupt is in place, and it responds to and clears the +//! PLL lock interrupt, this function will delay until its timeout has occurred +//! instead of completing as soon as PLL lock is achieved. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_clockset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlClockSet(unsigned long ulConfig) +{ + volatile unsigned long ulDelay; + unsigned long ulRCC; + + // + // Get the current value of the RCC register. + // + ulRCC = HWREG(SYSCTL_RCC); + + // + // Bypass the PLL and system clock dividers for now. + // + ulRCC |= SYSCTL_RCC_BYPASS; + ulRCC &= ~(SYSCTL_RCC_USE_SYSDIV); + + // + // Write the new RCC value. + // + HWREG(SYSCTL_RCC) = ulRCC; + + // + // Make sure that the PLL and system clock dividers are bypassed for now. + // + ulRCC |= SYSCTL_RCC_BYPASS; + ulRCC &= ~(SYSCTL_RCC_USE_SYSDIV); + + // + // Make sure that the required oscillators are enabled. For now, the + // previously enabled oscillators must be enabled along with the newly + // requested oscillators. + // + ulRCC &= (~(SYSCTL_RCC_IOSCDIS | SYSCTL_RCC_MOSCDIS) | + (ulConfig & (SYSCTL_RCC_IOSCDIS | SYSCTL_RCC_MOSCDIS))); + + // + // Set the new crystal value, oscillator source, and PLL configuration. + // + ulRCC &= ~(SYSCTL_RCC_XTAL_MASK | SYSCTL_RCC_OSCSRC_MASK | + SYSCTL_RCC_PWRDN | SYSCTL_RCC_OE); + ulRCC |= ulConfig & (SYSCTL_RCC_XTAL_MASK | SYSCTL_RCC_OSCSRC_MASK | + SYSCTL_RCC_PWRDN | SYSCTL_RCC_OE); + + // + // Clear the PLL lock interrupt. + // + HWREG(SYSCTL_MISC) = SYSCTL_INT_PLL_LOCK; + + // + // Write the new RCC value. + // + HWREG(SYSCTL_RCC) = ulRCC; + + // + // Wait for a bit so that new crystal value and oscillator source can take + // effect. One of the oscillators may need to be started as well. + // + for(ulDelay = 0; ulDelay < 16; ulDelay++) + { + } + + // + // Disable the appropriate oscillators. + // + ulRCC &= ~(SYSCTL_RCC_IOSCDIS | SYSCTL_RCC_MOSCDIS); + ulRCC |= ulConfig & (SYSCTL_RCC_IOSCDIS | SYSCTL_RCC_MOSCDIS); + + // + // Write the new RCC value. + // + HWREG(SYSCTL_RCC) = ulRCC; + + // + // Set the requested system divider. This will not get written + // immediately. + // + ulRCC &= ~(SYSCTL_RCC_SYSDIV_MASK | SYSCTL_RCC_USE_SYSDIV); + ulRCC |= ulConfig & (SYSCTL_RCC_SYSDIV_MASK | SYSCTL_RCC_USE_SYSDIV); + + // + // See if the PLL output is being used to clock the system. + // + if(!(ulConfig & SYSCTL_RCC_BYPASS)) + { + // + // Wait until the PLL has locked. + // + for(ulDelay = 32768; ulDelay > 0; ulDelay--) + { + if(HWREG(SYSCTL_RIS) & SYSCTL_INT_PLL_LOCK) + { + break; + } + } + + // + // Enable use of the PLL. + // + ulRCC &= ~(SYSCTL_RCC_BYPASS); + } + + // + // Write the final RCC value. + // + HWREG(SYSCTL_RCC) = ulRCC; + + // + // Delay for a little bit so that the system divider takes effect. + // + for(ulDelay = 0; ulDelay < 16; ulDelay++) + { + } +} +#endif + +//***************************************************************************** +// +//! Gets the processor clock rate. +//! +//! This function determines the clock rate of the processor clock. This is +//! also the clock rate of all the peripheral modules (with the exception of +//! PWM, which has its own clock divider). +//! +//! \note This will not return accurate results if SysCtlClockSet() has not +//! been called to configure the clocking of the device, or if the device is +//! directly clocked from a crystal (or a clock source) that is not one of the +//! supported crystal frequencies. In the later case, this function should be +//! modified to directly return the correct system clock rate. +//! +//! \return The processor clock rate. +// +//***************************************************************************** +#if defined(GROUP_clockget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlClockGet(void) +{ + unsigned long ulRCC, ulPLL, ulClk; + + // + // Read RCC. + // + ulRCC = HWREG(SYSCTL_RCC); + + // + // Get the base clock rate. + // + switch(ulRCC & SYSCTL_RCC_OSCSRC_MASK) + { + // + // The main oscillator is the clock source. Determine its rate from + // the crystal setting field. + // + case SYSCTL_RCC_OSCSRC_MAIN: + { + ulClk = g_pulXtals[((ulRCC & SYSCTL_RCC_XTAL_MASK) >> + SYSCTL_RCC_XTAL_SHIFT) - + (SYSCTL_RCC_XTAL_3_57MHZ >> + SYSCTL_RCC_XTAL_SHIFT)]; + break; + } + + // + // The internal oscillator is the source clock. This is not an + // accurate clock (it is +/- 50%); what is used is the nominal. + // + case SYSCTL_RCC_OSCSRC_INT: + { + ulClk = 15000000; + break; + } + + // + // The internal oscillator divided by four is the source clock. This + // is not an accurate clock (it is +/- 50%); what is used is the + // nominal. + // + case SYSCTL_RCC_OSCSRC_INT4: + { + ulClk = 15000000 / 4; + break; + } + + // + // An unknown setting, so return a zero clock (i.e. an unknown clock + // rate). + // + default: + { + return(0); + } + } + + // + // See if the PLL is being used. + // + if(!(ulRCC & SYSCTL_RCC_BYPASS)) + { + // + // Get the PLL configuration. + // + ulPLL = HWREG(SYSCTL_PLLCFG); + + // + // Compute the PLL output frequency based on its input frequency. + // + ulClk = ((ulClk * (((ulPLL & SYSCTL_PLLCFG_F_MASK) >> + SYSCTL_PLLCFG_F_SHIFT) + 2)) / + (((ulPLL & SYSCTL_PLLCFG_R_MASK) >> + SYSCTL_PLLCFG_R_SHIFT) + 2)); + + // + // See if the optional output divide by 2 is being used. + // + if(ulPLL & SYSCTL_PLLCFG_OD_2) + { + ulClk /= 2; + } + + // + // See if the optional output divide by 4 is being used. + // + if(ulPLL & SYSCTL_PLLCFG_OD_4) + { + ulClk /= 4; + } + } + + // + // See if the system divider is being used. + // + if(ulRCC & SYSCTL_RCC_USE_SYSDIV) + { + // + // Adjust the clock rate by the system clock divider. + // + ulClk /= ((ulRCC & SYSCTL_RCC_SYSDIV_MASK) >> + SYSCTL_RCC_SYSDIV_SHIFT) + 1; + } + + // + // Return the computed clock rate. + // + return(ulClk); +} +#endif + +//***************************************************************************** +// +//! Sets the PWM clock configuration. +//! +//! \param ulConfig is the configuration for the PWM clock; it must be one of +//! \b SYSCTL_PWMDIV_1, \b SYSCTL_PWMDIV_2, \b SYSCTL_PWMDIV_4, +//! \b SYSCTL_PWMDIV_8, \b SYSCTL_PWMDIV_16, \b SYSCTL_PWMDIV_32, or +//! \b SYSCTL_PWMDIV_64. +//! +//! This function sets the rate of the clock provided to the PWM module as a +//! ratio of the processor clock. This clock is used by the PWM module to +//! generate PWM signals; its rate forms the basis for all PWM signals. +//! +//! \note The clocking of the PWM is dependent upon the system clock rate as +//! configured by SysCtlClockSet(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pwmclockset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlPWMClockSet(unsigned long ulConfig) +{ + // + // Check the arguments. + // + ASSERT((ulConfig == SYSCTL_PWMDIV_1) || + (ulConfig == SYSCTL_PWMDIV_2) || + (ulConfig == SYSCTL_PWMDIV_4) || + (ulConfig == SYSCTL_PWMDIV_8) || + (ulConfig == SYSCTL_PWMDIV_16) || + (ulConfig == SYSCTL_PWMDIV_32) || + (ulConfig == SYSCTL_PWMDIV_64)); + + // + // Check that there is a PWM block on this part. + // + ASSERT(HWREG(SYSCTL_DC1) & SYSCTL_DC1_PWM); + + // + // Set the PWM clock configuration into the run-mode clock configuration + // register. + // + HWREG(SYSCTL_RCC) = ((HWREG(SYSCTL_RCC) & + ~(SYSCTL_RCC_USE_PWMDIV | SYSCTL_RCC_PWMDIV_MASK)) | + ulConfig); +} +#endif + +//***************************************************************************** +// +//! Gets the current PWM clock configuration. +//! +//! This function returns the current PWM clock configuration. +//! +//! \return The current PWM clock configuration; will be one of +//! \b SYSCTL_PWMDIV_1, \b SYSCTL_PWMDIV_2, \b SYSCTL_PWMDIV_4, +//! \b SYSCTL_PWMDIV_8, \b SYSCTL_PWMDIV_16, \b SYSCTL_PWMDIV_32, or +//! \b SYSCTL_PWMDIV_64. +// +//***************************************************************************** +#if defined(GROUP_pwmclockget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlPWMClockGet(void) +{ + // + // Check that there is a PWM block on this part. + // + ASSERT(HWREG(SYSCTL_DC1) & SYSCTL_DC1_PWM); + + // + // Return the current PWM clock configuration. + // + return(HWREG(SYSCTL_RCC) & + (SYSCTL_RCC_USE_PWMDIV | SYSCTL_RCC_PWMDIV_MASK)); +} +#endif + +//***************************************************************************** +// +//! Sets the sample rate of the ADC. +//! +//! \param ulSpeed is the desired sample rate of the ADC; must be one of +//! \b SYSCTL_ADCSPEED_1MSPS, \b SYSCTL_ADCSPEED_500KSPS, +//! \b SYSCTL_ADCSPEED_250KSPS, or \b SYSCTL_ADCSPEED_125KSPS. +//! +//! This function sets the rate at which the ADC samples are captured by the +//! ADC block. The sampling speed may be limited by the hardware, so the +//! sample rate may end up being slower than requested. SysCtlADCSpeedGet() +//! will return the actual speed in use. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_adcspeedset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlADCSpeedSet(unsigned long ulSpeed) +{ + // + // Check the arguments. + // + ASSERT((ulSpeed == SYSCTL_ADCSPEED_1MSPS) || + (ulSpeed == SYSCTL_ADCSPEED_500KSPS) || + (ulSpeed == SYSCTL_ADCSPEED_250KSPS) || + (ulSpeed == SYSCTL_ADCSPEED_125KSPS)); + + // + // Check that there is an ADC block on this part. + // + ASSERT(HWREG(SYSCTL_DC1) & SYSCTL_DC1_ADC); + + // + // Set the ADC speed in run, sleep, and deep-sleep mode. + // + HWREG(SYSCTL_RCGC0) = ((HWREG(SYSCTL_RCGC0) & ~(SYSCTL_SET0_ADCSPD_MASK)) | + ulSpeed); + HWREG(SYSCTL_SCGC0) = ((HWREG(SYSCTL_SCGC0) & ~(SYSCTL_SET0_ADCSPD_MASK)) | + ulSpeed); + HWREG(SYSCTL_DCGC0) = ((HWREG(SYSCTL_DCGC0) & ~(SYSCTL_SET0_ADCSPD_MASK)) | + ulSpeed); +} +#endif + +//***************************************************************************** +// +//! Gets the sample rate of the ADC. +//! +//! This function gets the current sample rate of the ADC. +//! +//! \return Returns the current ADC sample rate; will be one of +//! \b SYSCTL_ADCSPEED_1MSPS, \b SYSCTL_ADCSPEED_500KSPS, +//! \b SYSCTL_ADCSPEED_250KSPS, or \b SYSCTL_ADCSPEED_125KSPS. +// +//***************************************************************************** +#if defined(GROUP_adcspeedget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlADCSpeedGet(void) +{ + // + // Check that there is an ADC block on this part. + // + ASSERT(HWREG(SYSCTL_DC1) & SYSCTL_DC1_ADC); + + // + // Return the current ADC speed. + // + return(HWREG(SYSCTL_RCGC0) & SYSCTL_SET0_ADCSPD_MASK); +} +#endif + +//***************************************************************************** +// +//! Configures the internal oscillator verification timer. +//! +//! \param bEnable is a boolean that is \b true if the internal oscillator +//! verification timer should be enabled. +//! +//! This function allows the internal oscillator verification timer to be +//! enabled or disabled. When enabled, an interrupt will be generated if the +//! internal oscillator ceases to operate. +//! +//! \note Both oscillators (main and internal) must be enabled for this +//! verification timer to operate as the main oscillator will verify the +//! internal oscillator. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_boscverificationset) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlIOSCVerificationSet(tBoolean bEnable) +{ + // + // Enable or disable the internal oscillator verification timer as + // requested. + // + if(bEnable) + { + HWREG(SYSCTL_RCC) |= SYSCTL_RCC_IOSCVER; + } + else + { + HWREG(SYSCTL_RCC) &= ~(SYSCTL_RCC_IOSCVER); + } +} +#endif + +//***************************************************************************** +// +//! Configures the main oscillator verification timer. +//! +//! \param bEnable is a boolean that is \b true if the main oscillator +//! verification timer should be enabled. +//! +//! This function allows the main oscillator verification timer to be enabled +//! or disabled. When enabled, an interrupt will be generated if the main +//! oscillator ceases to operate. +//! +//! \note Both oscillators (main and internal) must be enabled for this +//! verification timer to operate as the internal oscillator will verify the +//! main oscillator. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_moscverificationset) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlMOSCVerificationSet(tBoolean bEnable) +{ + // + // Enable or disable the main oscillator verification timer as requested. + // + if(bEnable) + { + HWREG(SYSCTL_RCC) |= SYSCTL_RCC_MOSCVER; + } + else + { + HWREG(SYSCTL_RCC) &= ~(SYSCTL_RCC_MOSCVER); + } +} +#endif + +//***************************************************************************** +// +//! Configures the PLL verification timer. +//! +//! \param bEnable is a boolean that is \b true if the PLL verification timer +//! should be enabled. +//! +//! This function allows the PLL verification timer to be enabled or disabled. +//! When enabled, an interrupt will be generated if the PLL ceases to operate. +//! +//! \note The main oscillator must be enabled for this verification timer to +//! operate as it is used to check the PLL. Also, the verification timer +//! should be disabled while the PLL is being reconfigured via +//! SysCtlClockSet(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pllverificationset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlPLLVerificationSet(tBoolean bEnable) +{ + // + // Enable or disable the PLL verification timer as requested. + // + if(bEnable) + { + HWREG(SYSCTL_RCC) |= SYSCTL_RCC_PLLVER; + } + else + { + HWREG(SYSCTL_RCC) &= ~(SYSCTL_RCC_PLLVER); + } +} +#endif + +//***************************************************************************** +// +//! Clears the clock verification status. +//! +//! This function clears the status of the clock verification timers, allowing +//! them to assert another failure if detected. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_clkverificationclear) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlClkVerificationClear(void) +{ + // + // Clear the clock verification. + // + HWREG(SYSCTL_CLKVCLR) = SYSCTL_CLKVCLR_CLR; + + // + // The bit does not self-reset, so clear it. + // + HWREG(SYSCTL_CLKVCLR) = 0; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/sysctl.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/sysctl.h new file mode 100644 index 0000000..ebe01cb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/sysctl.h @@ -0,0 +1,285 @@ +//***************************************************************************** +// +// sysctl.h - Prototypes for the system control driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SYSCTL_H__ +#define __SYSCTL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following are values that can be passed to the +// SysCtlPeripheralPresent(), SysCtlPeripheralEnable(), +// SysCtlPeripheralDisable(), and SysCtlPeripheralReset() APIs as the +// ulPeripheral parameter. The peripherals in the fourth group (upper nibble +// is 3) can only be used with the SysCtlPeripheralPresent() API. +// +//***************************************************************************** +#define SYSCTL_PERIPH_PWM 0x00100000 // PWM +#define SYSCTL_PERIPH_ADC 0x00010000 // ADC +#define SYSCTL_PERIPH_WDOG 0x00000008 // Watchdog +#define SYSCTL_PERIPH_UART0 0x10000001 // UART 0 +#define SYSCTL_PERIPH_UART1 0x10000002 // UART 1 +#define SYSCTL_PERIPH_SSI 0x10000010 // SSI +#define SYSCTL_PERIPH_QEI 0x10000100 // QEI +#define SYSCTL_PERIPH_I2C 0x10001000 // I2C +#define SYSCTL_PERIPH_TIMER0 0x10010000 // Timer 0 +#define SYSCTL_PERIPH_TIMER1 0x10020000 // Timer 1 +#define SYSCTL_PERIPH_TIMER2 0x10040000 // Timer 2 +#define SYSCTL_PERIPH_COMP0 0x11000000 // Analog comparator 0 +#define SYSCTL_PERIPH_COMP1 0x12000000 // Analog comparator 1 +#define SYSCTL_PERIPH_COMP2 0x14000000 // Analog comparator 2 +#define SYSCTL_PERIPH_GPIOA 0x20000001 // GPIO A +#define SYSCTL_PERIPH_GPIOB 0x20000002 // GPIO B +#define SYSCTL_PERIPH_GPIOC 0x20000004 // GPIO C +#define SYSCTL_PERIPH_GPIOD 0x20000008 // GPIO D +#define SYSCTL_PERIPH_GPIOE 0x20000010 // GPIO E +#define SYSCTL_PERIPH_MPU 0x30000080 // Cortex-M3 MPU +#define SYSCTL_PERIPH_TEMP 0x30000020 // Temperature sensor +#define SYSCTL_PERIPH_PLL 0x30000010 // PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPinPresent() API +// as the ulPin parameter. +// +//***************************************************************************** +#define SYSCTL_PIN_PWM0 0x00000001 // PWM0 pin +#define SYSCTL_PIN_PWM1 0x00000002 // PWM1 pin +#define SYSCTL_PIN_PWM2 0x00000004 // PWM2 pin +#define SYSCTL_PIN_PWM3 0x00000008 // PWM3 pin +#define SYSCTL_PIN_PWM4 0x00000010 // PWM4 pin +#define SYSCTL_PIN_PWM5 0x00000020 // PWM5 pin +#define SYSCTL_PIN_C0MINUS 0x00000040 // C0- pin +#define SYSCTL_PIN_C0PLUS 0x00000080 // C0+ pin +#define SYSCTL_PIN_C0O 0x00000100 // C0o pin +#define SYSCTL_PIN_C1MINUS 0x00000200 // C1- pin +#define SYSCTL_PIN_C1PLUS 0x00000400 // C1+ pin +#define SYSCTL_PIN_C1O 0x00000800 // C1o pin +#define SYSCTL_PIN_C2MINUS 0x00001000 // C2- pin +#define SYSCTL_PIN_C2PLUS 0x00002000 // C2+ pin +#define SYSCTL_PIN_C2O 0x00004000 // C2o pin +#define SYSCTL_PIN_ADC0 0x00010000 // ADC0 pin +#define SYSCTL_PIN_ADC1 0x00020000 // ADC1 pin +#define SYSCTL_PIN_ADC2 0x00040000 // ADC2 pin +#define SYSCTL_PIN_ADC3 0x00080000 // ADC3 pin +#define SYSCTL_PIN_ADC4 0x00100000 // ADC4 pin +#define SYSCTL_PIN_ADC5 0x00200000 // ADC5 pin +#define SYSCTL_PIN_ADC6 0x00400000 // ADC6 pin +#define SYSCTL_PIN_ADC7 0x00800000 // ADC7 pin +#define SYSCTL_PIN_CCP0 0x01000000 // CCP0 pin +#define SYSCTL_PIN_CCP1 0x02000000 // CCP1 pin +#define SYSCTL_PIN_CCP2 0x04000000 // CCP2 pin +#define SYSCTL_PIN_CCP3 0x08000000 // CCP3 pin +#define SYSCTL_PIN_CCP4 0x10000000 // CCP4 pin +#define SYSCTL_PIN_CCP5 0x20000000 // CCP5 pin +#define SYSCTL_PIN_32KHZ 0x80000000 // 32kHz pin + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOSet() API as +// the ulVoltage value, or returned by the SysCtlLDOGet() API. +// +//***************************************************************************** +#define SYSCTL_LDO_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDO_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDO_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDO_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDO_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDO_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDO_2_55V 0x0000001f // LDO output of 2.55V +#define SYSCTL_LDO_2_60V 0x0000001e // LDO output of 2.60V +#define SYSCTL_LDO_2_65V 0x0000001d // LDO output of 2.65V +#define SYSCTL_LDO_2_70V 0x0000001c // LDO output of 2.70V +#define SYSCTL_LDO_2_75V 0x0000001b // LDO output of 2.75V + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOConfigSet() API. +// +//***************************************************************************** +#define SYSCTL_LDOCFG_ARST 0x00000001 // Allow LDO failure to reset +#define SYSCTL_LDOCFG_NORST 0x00000000 // Do not reset on LDO failure + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlIntEnable(), +// SysCtlIntDisable(), and SysCtlIntClear() APIs, or returned in the bit mask +// by the SysCtlIntStatus() API. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlResetCauseClear() +// API or returned by the SysCtlResetCauseGet() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_LDO 0x00000020 // LDO power not OK reset +#define SYSCTL_CAUSE_SW 0x00000010 // Software reset +#define SYSCTL_CAUSE_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_CAUSE_BOR 0x00000004 // Brown-out reset +#define SYSCTL_CAUSE_POR 0x00000002 // Power on reset +#define SYSCTL_CAUSE_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlBrownOutConfigSet() +// API as the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_BOR_RESET 0x00000002 // Reset instead of interrupting +#define SYSCTL_BOR_RESAMPLE 0x00000001 // Resample BOR before asserting + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPWMClockSet() API +// as the ulConfig parameter, and can be returned by the SysCtlPWMClockGet() +// API. +// +//***************************************************************************** +#define SYSCTL_PWMDIV_1 0x00000000 // PWM clock is processor clock /1 +#define SYSCTL_PWMDIV_2 0x00100000 // PWM clock is processor clock /2 +#define SYSCTL_PWMDIV_4 0x00120000 // PWM clock is processor clock /4 +#define SYSCTL_PWMDIV_8 0x00140000 // PWM clock is processor clock /8 +#define SYSCTL_PWMDIV_16 0x00160000 // PWM clock is processor clock /16 +#define SYSCTL_PWMDIV_32 0x00180000 // PWM clock is processor clock /32 +#define SYSCTL_PWMDIV_64 0x001A0000 // PWM clock is processor clock /64 + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlADCSpeedSet() API +// as the ulSpeed parameter, and can be returned by the SyCtlADCSpeedGet() +// API. +// +//***************************************************************************** +#define SYSCTL_ADCSPEED_1MSPS 0x00000300 // 1,000,000 samples per second +#define SYSCTL_ADCSPEED_500KSPS 0x00000200 // 500,000 samples per second +#define SYSCTL_ADCSPEED_250KSPS 0x00000100 // 250,000 samples per second +#define SYSCTL_ADCSPEED_125KSPS 0x00000000 // 125,000 samples per second + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlClockSet() API as +// the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_SYSDIV_1 0x07800000 // Processor clock is osc/pll /1 +#define SYSCTL_SYSDIV_2 0x00C00000 // Processor clock is osc/pll /2 +#define SYSCTL_SYSDIV_3 0x01400000 // Processor clock is osc/pll /3 +#define SYSCTL_SYSDIV_4 0x01C00000 // Processor clock is osc/pll /4 +#define SYSCTL_SYSDIV_5 0x02400000 // Processor clock is osc/pll /5 +#define SYSCTL_SYSDIV_6 0x02C00000 // Processor clock is osc/pll /6 +#define SYSCTL_SYSDIV_7 0x03400000 // Processor clock is osc/pll /7 +#define SYSCTL_SYSDIV_8 0x03C00000 // Processor clock is osc/pll /8 +#define SYSCTL_SYSDIV_9 0x04400000 // Processor clock is osc/pll /9 +#define SYSCTL_SYSDIV_10 0x04C00000 // Processor clock is osc/pll /10 +#define SYSCTL_SYSDIV_11 0x05400000 // Processor clock is osc/pll /11 +#define SYSCTL_SYSDIV_12 0x05C00000 // Processor clock is osc/pll /12 +#define SYSCTL_SYSDIV_13 0x06400000 // Processor clock is osc/pll /13 +#define SYSCTL_SYSDIV_14 0x06C00000 // Processor clock is osc/pll /14 +#define SYSCTL_SYSDIV_15 0x07400000 // Processor clock is osc/pll /15 +#define SYSCTL_SYSDIV_16 0x07C00000 // Processor clock is osc/pll /16 +#define SYSCTL_USE_PLL 0x00000000 // System clock is the PLL clock +#define SYSCTL_USE_OSC 0x00003800 // System clock is the osc clock +#define SYSCTL_XTAL_3_57MHZ 0x00000100 // External crystal is 3.579545MHz +#define SYSCTL_XTAL_3_68MHZ 0x00000140 // External crystal is 3.6864MHz +#define SYSCTL_XTAL_4MHZ 0x00000180 // External crystal is 4MHz +#define SYSCTL_XTAL_4_09MHZ 0x000001C0 // External crystal is 4.096MHz +#define SYSCTL_XTAL_4_91MHZ 0x00000200 // External crystal is 4.9152MHz +#define SYSCTL_XTAL_5MHZ 0x00000240 // External crystal is 5MHz +#define SYSCTL_XTAL_5_12MHZ 0x00000280 // External crystal is 5.12MHz +#define SYSCTL_XTAL_6MHZ 0x000002C0 // External crystal is 6MHz +#define SYSCTL_XTAL_6_14MHZ 0x00000300 // External crystal is 6.144MHz +#define SYSCTL_XTAL_7_37MHZ 0x00000340 // External crystal is 7.3728MHz +#define SYSCTL_XTAL_8MHZ 0x00000380 // External crystal is 8MHz +#define SYSCTL_XTAL_8_19MHZ 0x000003C0 // External crystal is 8.192MHz +#define SYSCTL_OSC_MAIN 0x00000000 // Oscillator source is main osc +#define SYSCTL_OSC_INT 0x00000010 // Oscillator source is int. osc +#define SYSCTL_OSC_INT4 0x00000020 // Oscillator source is int. osc /4 +#define SYSCTL_INT_OSC_DIS 0x00000002 // Disable internal oscillator +#define SYSCTL_MAIN_OSC_DIS 0x00000001 // Disable main oscillator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long SysCtlSRAMSizeGet(void); +extern unsigned long SysCtlFlashSizeGet(void); +extern tBoolean SysCtlPinPresent(unsigned long ulPin); +extern tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral); +extern void SysCtlPeripheralReset(unsigned long ulPeripheral); +extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralClockGating(tBoolean bEnable); +extern void SysCtlIntRegister(void (*pfnHandler)(void)); +extern void SysCtlIntUnregister(void); +extern void SysCtlIntEnable(unsigned long ulInts); +extern void SysCtlIntDisable(unsigned long ulInts); +extern void SysCtlIntClear(unsigned long ulInts); +extern unsigned long SysCtlIntStatus(tBoolean bMasked); +extern void SysCtlLDOSet(unsigned long ulVoltage); +extern unsigned long SysCtlLDOGet(void); +extern void SysCtlLDOConfigSet(unsigned long ulConfig); +extern void SysCtlReset(void); +extern void SysCtlSleep(void); +extern void SysCtlDeepSleep(void); +extern unsigned long SysCtlResetCauseGet(void); +extern void SysCtlResetCauseClear(unsigned long ulCauses); +extern void SysCtlBrownOutConfigSet(unsigned long ulConfig, + unsigned long ulDelay); +extern void SysCtlClockSet(unsigned long ulConfig); +extern unsigned long SysCtlClockGet(void); +extern void SysCtlPWMClockSet(unsigned long ulConfig); +extern unsigned long SysCtlPWMClockGet(void); +extern void SysCtlADCSpeedSet(unsigned long ulSpeed); +extern unsigned long SysCtlADCSpeedGet(void); +extern void SysCtlIOSCVerificationSet(tBoolean bEnable); +extern void SysCtlMOSCVerificationSet(tBoolean bEnable); +extern void SysCtlPLLVerificationSet(tBoolean bEnable); +extern void SysCtlClkVerificationClear(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSCTL_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/systick.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/systick.c new file mode 100644 index 0000000..3825335 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/systick.c @@ -0,0 +1,262 @@ +//***************************************************************************** +// +// systick.c - Driver for the SysTick timer in NVIC. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup systick_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_nvic.h" +#include "../hw_types.h" +#include "debug.h" +#include "interrupt.h" +#include "systick.h" + +//***************************************************************************** +// +//! Enables the SysTick counter. +//! +//! This will start the SysTick counter. If an interrupt handler has been +//! registered, it will be called when the SysTick counter rolls over. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickEnable(void) +{ + // + // Enable SysTick. + // + HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_CLK_SRC | NVIC_ST_CTRL_ENABLE; +} +#endif + +//***************************************************************************** +// +//! Disables the SysTick counter. +//! +//! This will stop the SysTick counter. If an interrupt handler has been +//! registered, it will no longer be called until SysTick is restarted. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_disable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickDisable(void) +{ + // + // Disable SysTick. + // + HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_ENABLE); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the SysTick interrupt. +//! +//! \param pfnHandler is a pointer to the function to be called when the +//! SysTick interrupt occurs. +//! +//! This sets the handler to be called when a SysTick interrupt occurs. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickIntRegister(void (*pfnHandler)(void)) +{ + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(FAULT_SYSTICK, pfnHandler); + + // + // Enable the SysTick interrupt. + // + HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_INTEN; +} +#endif + +//***************************************************************************** +// +//! Unregisters the interrupt handler for the SysTick interrupt. +//! +//! This function will clear the handler to be called when a SysTick interrupt +//! occurs. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickIntUnregister(void) +{ + // + // Disable the SysTick interrupt. + // + HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_INTEN); + + // + // Unregister the interrupt handler. + // + IntUnregister(FAULT_SYSTICK); +} +#endif + +//***************************************************************************** +// +//! Enables the SysTick interrupt. +//! +//! This function will enable the SysTick interrupt, allowing it to be +//! reflected to the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickIntEnable(void) +{ + // + // Enable the SysTick interrupt. + // + HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_INTEN; +} +#endif + +//***************************************************************************** +// +//! Disables the SysTick interrupt. +//! +//! This function will disable the SysTick interrupt, preventing it from being +//! reflected to the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickIntDisable(void) +{ + // + // Disable the SysTick interrupt. + // + HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_INTEN); +} +#endif + +//***************************************************************************** +// +//! Sets the period of the SysTick counter. +//! +//! \param ulPeriod is the number of clock ticks in each period of the SysTick +//! counter; must be between 1 and 16,777,216, inclusive. +//! +//! This function sets the rate at which the SysTick counter wraps; this +//! equates to the number of processor clocks between interrupts. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_periodset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickPeriodSet(unsigned long ulPeriod) +{ + // + // Check the arguments. + // + ASSERT((ulPeriod > 0) && (ulPeriod <= 16777216)); + + // + // Set the period of the SysTick counter. + // + HWREG(NVIC_ST_RELOAD) = ulPeriod - 1; +} +#endif + +//***************************************************************************** +// +//! Gets the period of the SysTick counter. +//! +//! This function returns the rate at which the SysTick counter wraps; this +//! equates to the number of processor clocks between interrupts. +//! +//! \return Returns the period of the SysTick counter. +// +//***************************************************************************** +#if defined(GROUP_periodget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysTickPeriodGet(void) +{ + // + // Return the period of the SysTick counter. + // + return(HWREG(NVIC_ST_RELOAD) + 1); +} +#endif + +//***************************************************************************** +// +//! Gets the current value of the SysTick counter. +//! +//! This function returns the current value of the SysTick counter; this will +//! be a value between the period - 1 and zero, inclusive. +//! +//! \return Returns the current value of the SysTick counter. +// +//***************************************************************************** +#if defined(GROUP_valueget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysTickValueGet(void) +{ + // + // Return the current value of the SysTick counter. + // + return(HWREG(NVIC_ST_CURRENT)); +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/systick.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/systick.h new file mode 100644 index 0000000..bfddfb1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/systick.h @@ -0,0 +1,55 @@ +//***************************************************************************** +// +// systick.h - Prototypes for the SysTick driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SYSTICK_H__ +#define __SYSTICK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SysTickEnable(void); +extern void SysTickDisable(void); +extern void SysTickIntRegister(void (*pfnHandler)(void)); +extern void SysTickIntUnregister(void); +extern void SysTickIntEnable(void); +extern void SysTickIntDisable(void); +extern void SysTickPeriodSet(unsigned long ulPeriod); +extern unsigned long SysTickPeriodGet(void); +extern unsigned long SysTickValueGet(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSTICK_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/timer.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/timer.c new file mode 100644 index 0000000..46ce19a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/timer.c @@ -0,0 +1,1125 @@ +//***************************************************************************** +// +// timer.c - Driver for the timer module. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup timer_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_timer.h" +#include "../hw_types.h" +#include "debug.h" +#include "interrupt.h" +#include "timer.h" + +//***************************************************************************** +// +//! Enables the timer(s). +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to enable; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! +//! This will enable operation of the timer module. The timer must be +//! configured before it is enabled. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerEnable(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Enable the timer(s) module. + // + HWREG(ulBase + TIMER_O_CTL) |= ulTimer & (TIMER_CTL_TAEN | TIMER_CTL_TBEN); +} +#endif + +//***************************************************************************** +// +//! Disables the timer(s). +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to disable; must be one of +//! \b TIMER_A, \b TIMER_B, or \b TIMER_BOTH. +//! +//! This will disable operation of the timer module. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_disable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerDisable(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Disable the timer module. + // + HWREG(ulBase + TIMER_O_CTL) &= ~(ulTimer & + (TIMER_CTL_TAEN | TIMER_CTL_TBEN)); +} +#endif + +//***************************************************************************** +// +//! Configures the timer(s). +//! +//! \param ulBase is the base address of the timer module. +//! \param ulConfig is the configuration for the timer. +//! +//! This function configures the operating mode of the timer(s). The timer +//! module is disabled before being configured, and is left in the disabled +//! state. The configuration is specified in \e ulConfig as one of the +//! following values: +//! +//! - \b TIMER_CFG_32_BIT_OS - 32-bit one shot timer +//! - \b TIMER_CFG_32_BIT_PER - 32-bit periodic timer +//! - \b TIMER_CFG_32_RTC - 32-bit real time clock timer +//! - \b TIMER_CFG_16_BIT_PAIR - Two 16-bit timers +//! +//! When configured for a pair of 16-bit timers, each timer is separately +//! configured. The first timer is configured by setting \e ulConfig to +//! the result of a logical OR operation between one of the following values +//! and \e ulConfig: +//! +//! - \b TIMER_CFG_A_ONE_SHOT - 16-bit one shot timer +//! - \b TIMER_CFG_A_PERIODIC - 16-bit periodic timer +//! - \b TIMER_CFG_A_CAP_COUNT - 16-bit edge count capture +//! - \b TIMER_CFG_A_CAP_TIME - 16-bit edge time capture +//! - \b TIMER_CFG_A_PWM - 16-bit PWM output +//! +//! Similarly, the second timer is configured by setting \e ulConfig to +//! the result of a logical OR operation between one of the corresponding +//! \b TIMER_CFG_B_* values and \e ulConfig. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_configure) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerConfigure(unsigned long ulBase, unsigned long ulConfig) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulConfig == TIMER_CFG_32_BIT_OS) || + (ulConfig == TIMER_CFG_32_BIT_PER) || + (ulConfig == TIMER_CFG_32_RTC) || + ((ulConfig & 0xff000000) == TIMER_CFG_16_BIT_PAIR)); + ASSERT(((ulConfig & 0xff000000) != TIMER_CFG_16_BIT_PAIR) || + ((((ulConfig & 0x000000ff) == TIMER_CFG_A_ONE_SHOT) || + ((ulConfig & 0x000000ff) == TIMER_CFG_A_PERIODIC) || + ((ulConfig & 0x000000ff) == TIMER_CFG_A_CAP_COUNT) || + ((ulConfig & 0x000000ff) == TIMER_CFG_A_CAP_TIME) || + ((ulConfig & 0x000000ff) == TIMER_CFG_A_PWM)) && + (((ulConfig & 0x0000ff00) == TIMER_CFG_B_ONE_SHOT) || + ((ulConfig & 0x0000ff00) == TIMER_CFG_B_PERIODIC) || + ((ulConfig & 0x0000ff00) == TIMER_CFG_B_CAP_COUNT) || + ((ulConfig & 0x0000ff00) == TIMER_CFG_B_CAP_TIME) || + ((ulConfig & 0x0000ff00) == TIMER_CFG_B_PWM)))); + + // + // Disable the timers. + // + HWREG(ulBase + TIMER_O_CTL) &= ~(TIMER_CTL_TAEN | TIMER_CTL_TBEN); + + // + // Set the global timer configuration. + // + HWREG(ulBase + TIMER_O_CFG) = ulConfig >> 24; + + // + // Set the configuration of the A and B timers. Note that the B timer + // configuration is ignored by the hardware in 32-bit modes. + // + HWREG(ulBase + TIMER_O_TAMR) = ulConfig & 255; + HWREG(ulBase + TIMER_O_TBMR) = (ulConfig >> 8) & 255; +} +#endif + +//***************************************************************************** +// +//! Controls the output level. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to adjust; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! \param bInvert specifies the output level. +//! +//! This function sets the PWM output level for the specified timer. If the +//! parameter \e bInvert is \b true, then the timer's output will be made +//! active low; otherwise, it will be made active high. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_controllevel) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Set the output levels as requested. + // + ulTimer &= TIMER_CTL_TAPWML | TIMER_CTL_TBPWML; + HWREG(ulBase + TIMER_O_CTL) = (bInvert ? + (HWREG(ulBase + TIMER_O_CTL) | ulTimer) : + (HWREG(ulBase + TIMER_O_CTL) & ~(ulTimer))); +} +#endif + +//***************************************************************************** +// +//! Enables or disables the trigger output. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer to adjust; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! \param bEnable specifies the desired trigger state. +//! +//! This function controls the trigger output for the specified timer. If the +//! parameter \e bEnable is \b true, then the timer's output trigger is +//! enabled; otherwise it is disabled. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_controltrigger) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Set the trigger output as requested. + // + ulTimer &= TIMER_CTL_TAOTE | TIMER_CTL_TBOTE; + HWREG(ulBase + TIMER_O_CTL) = (bEnable ? + (HWREG(ulBase + TIMER_O_CTL) | ulTimer) : + (HWREG(ulBase + TIMER_O_CTL) & ~(ulTimer))); +} +#endif + +//***************************************************************************** +// +//! Controls the event type. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to be adjusted; must be one of +//! \b TIMER_A, \b TIMER_B, or \b TIMER_BOTH. +//! \param ulEvent specifies the type of event; must be one of +//! \b TIMER_EVENT_POS_EDGE, \b TIMER_EVENT_NEG_EDGE, or +//! \b TIMER_EVENT_BOTH_EDGES. +//! +//! This function sets the signal edge(s) that will trigger the timer when in +//! capture mode. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_controlevent) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Set the event type. + // + ulEvent &= ulTimer & (TIMER_CTL_TAEVENT_MSK | TIMER_CTL_TBEVENT_MSK); + HWREG(ulBase + TIMER_O_CTL) = ((HWREG(ulBase + TIMER_O_CTL) & + ~(TIMER_CTL_TAEVENT_MSK | + TIMER_CTL_TBEVENT_MSK)) | ulEvent); +} +#endif + +//***************************************************************************** +// +//! Controls the stall handling. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to be adjusted; must be one of +//! \b TIMER_A, \b TIMER_B, or \b TIMER_BOTH. +//! \param bStall specifies the response to a stall signal. +//! +//! This function controls the stall response for the specified timer. If the +//! parameter \e bStall is \b true, then the timer will stop counting if the +//! processor enters debug mode; otherwise the timer will keep running while in +//! debug mode. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_controlstall) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Set the stall mode. + // + ulTimer &= TIMER_CTL_TASTALL | TIMER_CTL_TBSTALL; + HWREG(ulBase + TIMER_O_CTL) = (bStall ? + (HWREG(ulBase + TIMER_O_CTL) | ulTimer) : + (HWREG(ulBase + TIMER_O_CTL) & ~(ulTimer))); +} +#endif + +//***************************************************************************** +// +//! Enable RTC counting. +//! +//! \param ulBase is the base address of the timer module. +//! +//! This function causes the timer to start counting when in RTC mode. If not +//! configured for RTC mode, this will do nothing. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_rtcenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerRTCEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Enable RTC counting. + // + HWREG(ulBase + TIMER_O_CTL) |= TIMER_CTL_RTCEN; +} +#endif + +//***************************************************************************** +// +//! Disable RTC counting. +//! +//! \param ulBase is the base address of the timer module. +//! +//! This function causes the timer to stop counting when in RTC mode. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_rtcdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerRTCDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Disable RTC counting. + // + HWREG(ulBase + TIMER_O_CTL) &= ~(TIMER_CTL_RTCEN); +} +#endif + +//***************************************************************************** +// +//! Set the timer prescale value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to adjust; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! \param ulValue is the timer prescale value; must be between 0 and 255, +//! inclusive. +//! +//! This function sets the value of the input clock prescaler. The prescaler +//! is only operational when in 16-bit mode and is used to extend the range of +//! the 16-bit timer modes. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_prescaleset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + ASSERT(ulValue < 256); + + // + // Set the timer A prescaler if requested. + // + if(ulTimer & TIMER_A) + { + HWREG(ulBase + TIMER_O_TAPR) = ulValue; + } + + // + // Set the timer B prescaler if requested. + // + if(ulTimer & TIMER_B) + { + HWREG(ulBase + TIMER_O_TBPR) = ulValue; + } +} +#endif + +//***************************************************************************** +// +//! Get the timer prescale value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer; must be one of \b TIMER_A or +//! \b TIMER_B. +//! +//! This function gets the value of the input clock prescaler. The prescaler +//! is only operational when in 16-bit mode and is used to extend the range of +//! the 16-bit timer modes. +//! +//! \return The value of the timer prescaler. +// +//***************************************************************************** +#if defined(GROUP_prescaleget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +TimerPrescaleGet(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Return the appropriate prescale value. + // + return((ulTimer == TIMER_A) ? HWREG(ulBase + TIMER_O_TAPR) : + HWREG(ulBase + TIMER_O_TBPR)); +} +#endif + +//***************************************************************************** +// +//! Set the timer prescale match value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to adjust; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! \param ulValue is the timer prescale match value; must be between 0 and +//! 255, inclusive. +//! +//! This function sets the value of the input clock prescaler match value. +//! When in a 16-bit mode that uses the counter match (edge count or PWM), the +//! prescale match effectively extends the range of the counter to 24-bits. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_prescalematchset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + ASSERT(ulValue < 256); + + // + // Set the timer A prescale match if requested. + // + if(ulTimer & TIMER_A) + { + HWREG(ulBase + TIMER_O_TAPMR) = ulValue; + } + + // + // Set the timer B prescale match if requested. + // + if(ulTimer & TIMER_B) + { + HWREG(ulBase + TIMER_O_TBPMR) = ulValue; + } +} +#endif + +//***************************************************************************** +// +//! Get the timer prescale match value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer; must be one of \b TIMER_A or +//! \b TIMER_B. +//! +//! This function gets the value of the input clock prescaler match value. +//! When in a 16-bit mode that uses the counter match (edge count or PWM), the +//! prescale match effectively extends the range of the counter to 24-bits. +//! +//! \return The value of the timer prescale match. +// +//***************************************************************************** +#if defined(GROUP_prescalematchget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +TimerPrescaleMatchGet(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Return the appropriate prescale match value. + // + return((ulTimer == TIMER_A) ? HWREG(ulBase + TIMER_O_TAPMR) : + HWREG(ulBase + TIMER_O_TBPMR)); +} +#endif + +//***************************************************************************** +// +//! Sets the timer load value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to adjust; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. Only \b TIMER_A should be used when the +//! timer is configured for 32-bit operation. +//! \param ulValue is the load value. +//! +//! This function sets the timer load value; if the timer is running then the +//! value will be immediately loaded into the timer. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_loadset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Set the timer A load value if requested. + // + if(ulTimer & TIMER_A) + { + HWREG(ulBase + TIMER_O_TAILR) = ulValue; + } + + // + // Set the timer B load value if requested. + // + if(ulTimer & TIMER_B) + { + HWREG(ulBase + TIMER_O_TBILR) = ulValue; + } +} +#endif + +//***************************************************************************** +// +//! Gets the timer load value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer; must be one of \b TIMER_A or +//! \b TIMER_B. Only \b TIMER_A should be used when the timer is configured +//! for 32-bit operation. +//! +//! This function gets the currently programmed interval load value for the +//! specified timer. +//! +//! \return Returns the load value for the timer. +// +//***************************************************************************** +#if defined(GROUP_loadget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +TimerLoadGet(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B)); + + // + // Return the appropriate load value. + // + return((ulTimer == TIMER_A) ? HWREG(ulBase + TIMER_O_TAILR) : + HWREG(ulBase + TIMER_O_TBILR)); +} +#endif + +//***************************************************************************** +// +//! Gets the current timer value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer; must be one of \b TIMER_A or +//! \b TIMER_B. Only \b TIMER_A should be used when the timer is configured +//! for 32-bit operation. +//! +//! This function reads the current value of the specified timer. +//! +//! \return Returns the current value of the timer. +// +//***************************************************************************** +#if defined(GROUP_valueget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +TimerValueGet(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B)); + + // + // Return the appropriate timer value. + // + return((ulTimer == TIMER_A) ? HWREG(ulBase + TIMER_O_TAR) : + HWREG(ulBase + TIMER_O_TBR)); +} +#endif + +//***************************************************************************** +// +//! Sets the timer match value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to adjust; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. Only \b TIMER_A should be used when the +//! timer is configured for 32-bit operation. +//! \param ulValue is the match value. +//! +//! This function sets the match value for a timer. This is used in capture +//! count mode to determine when to interrupt the processor and in PWM mode to +//! determine the duty cycle of the output signal. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_matchset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Set the timer A match value if requested. + // + if(ulTimer & TIMER_A) + { + HWREG(ulBase + TIMER_O_TAMATCHR) = ulValue; + } + + // + // Set the timer B match value if requested. + // + if(ulTimer & TIMER_B) + { + HWREG(ulBase + TIMER_O_TBMATCHR) = ulValue; + } +} +#endif + +//***************************************************************************** +// +//! Gets the timer match value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer; must be one of \b TIMER_A or +//! \b TIMER_B. Only \b TIMER_A should be used when the timer is configured +//! for 32-bit operation. +//! +//! This function gets the match value for the specified timer. +//! +//! \return Returns the match value for the timer. +// +//***************************************************************************** +#if defined(GROUP_matchget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +TimerMatchGet(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B)); + + // + // Return the appropriate match value. + // + return((ulTimer == TIMER_A) ? HWREG(ulBase + TIMER_O_TAMATCHR) : + HWREG(ulBase + TIMER_O_TBMATCHR)); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the timer interrupt. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s); must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! \param pfnHandler is a pointer to the function to be called when the timer +//! interrupt occurs. +//! +//! This sets the handler to be called when a timer interrupt occurs. This +//! will enable the global interrupt in the interrupt controller; specific +//! timer interrupts must be enabled via TimerIntEnable(). It is the interrupt +//! handler's responsibility to clear the interrupt source via TimerIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Get the interrupt number for this timer module. + // + ulBase = ((ulBase == TIMER0_BASE) ? INT_TIMER0A : + ((ulBase == TIMER1_BASE) ? INT_TIMER1A : INT_TIMER2A)); + + // + // Register an interrupt handler for timer A if requested. + // + if(ulTimer & TIMER_A) + { + // + // Register the interrupt handler. + // + IntRegister(ulBase, pfnHandler); + + // + // Enable the interrupt. + // + IntEnable(ulBase); + } + + // + // Register an interrupt handler for timer B if requested. + // + if(ulTimer & TIMER_B) + { + // + // Register the interrupt handler. + // + IntRegister(ulBase + 1, pfnHandler); + + // + // Enable the interrupt. + // + IntEnable(ulBase + 1); + } +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for the timer interrupt. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s); must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! +//! This function will clear the handler to be called when a timer interrupt +//! occurs. This will also mask off the interrupt in the interrupt controller +//! so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Get the interrupt number for this timer module. + // + ulBase = ((ulBase == TIMER0_BASE) ? INT_TIMER0A : + ((ulBase == TIMER1_BASE) ? INT_TIMER1A : INT_TIMER2A)); + + // + // Unregister the interrupt handler for timer A if requested. + // + if(ulTimer & TIMER_A) + { + // + // Disable the interrupt. + // + IntDisable(ulBase); + + // + // Unregister the interrupt handler. + // + IntUnregister(ulBase); + } + + // + // Unregister the interrupt handler for timer B if requested. + // + if(ulTimer & TIMER_B) + { + // + // Disable the interrupt. + // + IntDisable(ulBase + 1); + + // + // Unregister the interrupt handler. + // + IntUnregister(ulBase + 1); + } +} +#endif + +//***************************************************************************** +// +//! Enables individual timer interrupt sources. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulIntFlags is the bit mask of the interrupt sources to be enabled. +//! +//! Enables the indicated timer interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources have +//! no effect on the processor. +//! +//! The parameter \e ulIntFlags must be the logical OR of any combination of +//! the following: +//! +//! - TIMER_CAPB_EVENT - Capture B event interrupt +//! - TIMER_CAPB_MATCH - Capture B match interrupt +//! - TIMER_TIMB_TIMEOUT - Timer B timeout interrupt +//! - TIMER_RTC_MATCH - RTC interrupt mask +//! - TIMER_CAPA_EVENT - Capture A event interrupt +//! - TIMER_CAPA_MATCH - Capture A match interrupt +//! - TIMER_TIMA_TIMEOUT - Timer A timeout interrupt +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Enable the specified interrupts. + // + HWREG(ulBase + TIMER_O_IMR) |= ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Disables individual timer interrupt sources. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulIntFlags is the bit mask of the interrupt sources to be disabled. +//! +//! Disables the indicated timer interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources have +//! no effect on the processor. +//! +//! The parameter \e ulIntFlags has the same definition as the \e ulIntFlags +//! parameter to TimerIntEnable(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Disable the specified interrupts. + // + HWREG(ulBase + TIMER_O_IMR) &= ~(ulIntFlags); +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param ulBase is the base address of the timer module. +//! \param bMasked is false if the raw interrupt status is required and true if +//! the masked interrupt status is required. +//! +//! This returns the interrupt status for the timer module. Either the raw +//! interrupt status or the status of interrupts that are allowed to reflect to +//! the processor can be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! values described in TimerIntEnable(). +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +TimerIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + return(bMasked ? HWREG(ulBase + TIMER_O_MIS) : + HWREG(ulBase + TIMER_O_RIS)); +} +#endif + +//***************************************************************************** +// +//! Clears timer interrupt sources. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulIntFlags is a bit mask of the interrupt sources to be cleared. +//! +//! The specified timer interrupt sources are cleared, so that they no longer +//! assert. This must be done in the interrupt handler to keep it from being +//! called again immediately upon exit. +//! +//! The parameter \e ulIntFlags has the same definition as the \e ulIntFlags +//! parameter to TimerIntEnable(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Clear the requested interrupt sources. + // + HWREG(ulBase + TIMER_O_ICR) = ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Puts the timer into its reset state. +//! +//! \param ulBase is the base address of the timer module. +//! +//! The specified timer is disabled, and all its interrupts are disabled, +//! cleared, and unregistered. Then the timer registers are set to their reset +//! value. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_quiesce) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerQuiesce(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Disable the timer. + // + HWREG(ulBase + TIMER_O_CTL) = TIMER_RV_CTL; + + // + // Disable all the timer interrupts. + // + HWREG(ulBase + TIMER_O_IMR) = TIMER_RV_IMR; + + // + // Clear all the timer interrupts. + // + HWREG(ulBase + TIMER_O_ICR) = 0xFFFFFFFF; + + // + // Unregister the interrupt handler. This also disables interrupts to the + // core. + // + TimerIntUnregister(ulBase, TIMER_BOTH); + + // + // Set all the registers to their reset value. + // + HWREG(ulBase + TIMER_O_CFG) = TIMER_RV_CFG; + HWREG(ulBase + TIMER_O_TAMR) = TIMER_RV_TAMR; + HWREG(ulBase + TIMER_O_TBMR) = TIMER_RV_TBMR; + HWREG(ulBase + TIMER_O_RIS) = TIMER_RV_RIS; + HWREG(ulBase + TIMER_O_MIS) = TIMER_RV_MIS; + HWREG(ulBase + TIMER_O_TAILR) = TIMER_RV_TAILR; + HWREG(ulBase + TIMER_O_TBILR) = TIMER_RV_TBILR; + HWREG(ulBase + TIMER_O_TAMATCHR) = TIMER_RV_TAMATCHR; + HWREG(ulBase + TIMER_O_TBMATCHR) = TIMER_RV_TBMATCHR; + HWREG(ulBase + TIMER_O_TAPR) = TIMER_RV_TAPR; + HWREG(ulBase + TIMER_O_TBPR) = TIMER_RV_TBPR; + HWREG(ulBase + TIMER_O_TAPMR) = TIMER_RV_TAPMR; + HWREG(ulBase + TIMER_O_TBPMR) = TIMER_RV_TBPMR; + HWREG(ulBase + TIMER_O_TAR) = TIMER_RV_TAR; + HWREG(ulBase + TIMER_O_TBR) = TIMER_RV_TBR; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/timer.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/timer.h new file mode 100644 index 0000000..660c325 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/uart.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/uart.c new file mode 100644 index 0000000..cbae1b0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/uart.c @@ -0,0 +1,821 @@ +//***************************************************************************** +// +// uart.c - Driver for the UART. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup uart_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_types.h" +#include "../hw_uart.h" +#include "debug.h" +#include "interrupt.h" +#include "sysctl.h" +#include "uart.h" + +//***************************************************************************** +// +//! Sets the type of parity. +//! +//! \param ulBase is the base address of the UART port. +//! \param ulParity specifies the type of parity to use. +//! +//! Sets the type of parity to use for transmitting and expect when receiving. +//! The \e ulParity parameter must be one of \b UART_CONFIG_PAR_NONE, +//! \b UART_CONFIG_PAR_EVEN, \b UART_CONFIG_PAR_ODD, \b UART_CONFIG_PAR_ONE, +//! or \b UART_CONFIG_PAR_ZERO. The last two allow direct control of the +//! parity bit; it will always be either be one or zero based on the mode. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_paritymodeset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTParityModeSet(unsigned long ulBase, unsigned long ulParity) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + ASSERT((ulParity == UART_CONFIG_PAR_NONE) || + (ulParity == UART_CONFIG_PAR_EVEN) || + (ulParity == UART_CONFIG_PAR_ODD) || + (ulParity == UART_CONFIG_PAR_ONE) || + (ulParity == UART_CONFIG_PAR_ZERO)); + + // + // Set the parity mode. + // + HWREG(ulBase + UART_O_LCR_H) = ((HWREG(ulBase + UART_O_LCR_H) & + ~(UART_LCR_H_SPS | UART_LCR_H_EPS | + UART_LCR_H_PEN)) | ulParity); +} +#endif + +//***************************************************************************** +// +//! Gets the type of parity currently being used. +//! +//! \param ulBase is the base address of the UART port. +//! +//! \return The current parity settings, specified as one of +//! \b UART_CONFIG_PAR_NONE, \b UART_CONFIG_PAR_EVEN, \b UART_CONFIG_PAR_ODD, +//! \b UART_CONFIG_PAR_ONE, or \b UART_CONFIG_PAR_ZERO. +// +//***************************************************************************** +#if defined(GROUP_paritymodeget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +UARTParityModeGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Return the current parity setting. + // + return(HWREG(ulBase + UART_O_LCR_H) & + (UART_LCR_H_SPS | UART_LCR_H_EPS | UART_LCR_H_PEN)); +} +#endif + +//***************************************************************************** +// +//! Sets the configuration of a UART. +//! +//! \param ulBase is the base address of the UART port. +//! \param ulBaud is the desired baud rate. +//! \param ulConfig is the data format for the port (number of data bits, +//! number of stop bits, and parity). +//! +//! This function will configure the UART for operation in the specified data +//! format. The baud rate is provided in the \e ulBaud parameter and the +//! data format in the \e ulConfig parameter. +//! +//! The \e ulConfig parameter is the logical OR of three values: the number of +//! data bits, the number of stop bits, and the parity. \b UART_CONFIG_WLEN_8, +//! \b UART_CONFIG_WLEN_7, \b UART_CONFIG_WLEN_6, and \b UART_CONFIG_WLEN_5 +//! select from eight to five data bits per byte (respectively). +//! \b UART_CONFIG_STOP_ONE and \b UART_CONFIG_STOP_TWO select one or two stop +//! bits (respectively). \b UART_CONFIG_PAR_NONE, \b UART_CONFIG_PAR_EVEN, +//! \b UART_CONFIG_PAR_ODD, \b UART_CONFIG_PAR_ONE, and \b UART_CONFIG_PAR_ZERO +//! select the parity mode (no parity bit, even parity bit, odd parity bit, +//! parity bit always one, and parity bit always zero, respectively). +//! +//! The baud rate is dependent upon the system clock rate returned by +//! SysCtlClockGet(); if it does not return the correct system clock rate then +//! the baud rate will be incorrect. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_configset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig) +{ + unsigned long ulUARTClk, ulInt, ulFrac; + + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Stop the UART. + // + UARTDisable(ulBase); + + // + // Determine the UART clock rate. + // + ulUARTClk = SysCtlClockGet(); + + // + // Compute the fractional baud rate divider. + // + ulInt = ulUARTClk / (16 * ulBaud); + ulFrac = ulUARTClk % (16 * ulBaud); + ulFrac = ((((2 * ulFrac * 4) / ulBaud) + 1) / 2); + + // + // Set the baud rate. + // + HWREG(ulBase + UART_O_IBRD) = ulInt; + HWREG(ulBase + UART_O_FBRD) = ulFrac; + + // + // Set parity, data length, and number of stop bits. + // + HWREG(ulBase + UART_O_LCR_H) = ulConfig; + + // + // Clear the flags register. + // + HWREG(ulBase + UART_O_FR) = 0; + + // + // Start the UART. + // + UARTEnable(ulBase); +} +#endif + +//***************************************************************************** +// +//! Gets the current configuration of a UART. +//! +//! \param ulBase is the base address of the UART port. +//! \param pulBaud is a pointer to storage for the baud rate. +//! \param pulConfig is a pointer to storage for the data format. +//! +//! The baud rate and data format for the UART is determined. The returned +//! baud rate is the actual baud rate; it may not be the exact baud rate +//! requested or an ``official'' baud rate. The data format returned in +//! \e pulConfig is enumerated the same as the \e ulConfig parameter of +//! UARTConfigSet(). +//! +//! The baud rate is dependent upon the system clock rate returned by +//! SysCtlClockGet(); if it does not return the correct system clock rate then +//! the baud rate will be computed incorrectly. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_configget) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig) + +{ + unsigned long ulInt, ulFrac; + + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Compute the baud rate. + // + ulInt = HWREG(ulBase + UART_O_IBRD); + ulFrac = HWREG(ulBase + UART_O_FBRD); + *pulBaud = (SysCtlClockGet() * 4) / ((64 * ulInt) + ulFrac); + + // + // Get the parity, data length, and number of stop bits. + // + *pulConfig = (HWREG(ulBase + UART_O_LCR_H) & + (UART_LCR_H_SPS | UART_LCR_H_WLEN | UART_LCR_H_STP2 | + UART_LCR_H_EPS | UART_LCR_H_PEN)); +} +#endif + +//***************************************************************************** +// +//! Enables transmitting and receiving. +//! +//! \param ulBase is the base address of the UART port. +//! +//! Sets the UARTEN, TXE, and RXE bits, and enables the transmit and receive +//! FIFOs. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Enable the FIFO. + // + HWREG(ulBase + UART_O_LCR_H) |= UART_LCR_H_FEN; + + // + // Enable RX, TX, and the UART. + // + HWREG(ulBase + UART_O_CTL) |= (UART_CTL_UARTEN | UART_CTL_TXE | + UART_CTL_RXE); +} +#endif + +//***************************************************************************** +// +//! Disables transmitting and receiving. +//! +//! \param ulBase is the base address of the UART port. +//! +//! Clears the UARTEN, TXE, and RXE bits, then waits for the end of +//! transmission of the current character, and flushes the transmit FIFO. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_disable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Wait for end of TX. + // + while(HWREG(ulBase + UART_O_FR) & UART_FR_BUSY) + { + } + + // + // Disable the FIFO. + // + HWREG(ulBase + UART_O_LCR_H) &= ~(UART_LCR_H_FEN); + + // + // Disable the UART. + // + HWREG(ulBase + UART_O_CTL) &= ~(UART_CTL_UARTEN | UART_CTL_TXE | + UART_CTL_RXE); +} +#endif + +//***************************************************************************** +// +//! Determines if there are any characters in the receive FIFO. +//! +//! \param ulBase is the base address of the UART port. +//! +//! This function returns a flag indicating whether or not there is data +//! available in the receive FIFO. +//! +//! \return Returns \b true if there is data in the receive FIFO, and \b false +//! if there is no data in the receive FIFO. +// +//***************************************************************************** +#if defined(GROUP_charsavail) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +UARTCharsAvail(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Return the availability of characters. + // + return((HWREG(ulBase + UART_O_FR) & UART_FR_RXFE) ? false : true); +} +#endif + +//***************************************************************************** +// +//! Determines if there is any space in the transmit FIFO. +//! +//! \param ulBase is the base address of the UART port. +//! +//! This function returns a flag indicating whether or not there is space +//! available in the transmit FIFO. +//! +//! \return Returns \b true if there is space available in the transmit FIFO, +//! and \b false if there is no space available in the transmit FIFO. +// +//***************************************************************************** +#if defined(GROUP_spaceavail) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +UARTSpaceAvail(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Return the availability of space. + // + return((HWREG(ulBase + UART_O_FR) & UART_FR_TXFF) ? false : true); +} +#endif + +//***************************************************************************** +// +//! Receives a character from the specified port. +//! +//! \param ulBase is the base address of the UART port. +//! +//! Gets a character from the receive FIFO for the specified port. +//! +//! \return Returns the character read from the specified port, cast as a +//! \e long. A \b -1 will be returned if there are no characters present in +//! the receive FIFO. The UARTCharsAvail() function should be called before +//! attempting to call this function. +// +//***************************************************************************** +#if defined(GROUP_charnonblockingget) || defined(BUILD_ALL) || defined(DOXYGEN) +long +UARTCharNonBlockingGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // See if there are any characters in the receive FIFO. + // + if(!(HWREG(ulBase + UART_O_FR) & UART_FR_RXFE)) + { + // + // Read and return the next character. + // + return(HWREG(ulBase + UART_O_DR)); + } + else + { + // + // There are no characters, so return a failure. + // + return(-1); + } +} +#endif + +//***************************************************************************** +// +//! Waits for a character from the specified port. +//! +//! \param ulBase is the base address of the UART port. +//! +//! Gets a character from the receive FIFO for the specified port. If there +//! are no characters available, this function will wait until a character is +//! received before returning. +//! +//! \return Returns the character read from the specified port, cast as an +//! \e int. +// +//***************************************************************************** +#if defined(GROUP_charget) || defined(BUILD_ALL) || defined(DOXYGEN) +long +UARTCharGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Wait until a char is available. + // + while(HWREG(ulBase + UART_O_FR) & UART_FR_RXFE) + { + } + + // + // Now get the char. + // + return(HWREG(ulBase + UART_O_DR)); +} +#endif + +//***************************************************************************** +// +//! Sends a character to the specified port. +//! +//! \param ulBase is the base address of the UART port. +//! \param ucData is the character to be transmitted. +//! +//! Writes the character \e ucData to the transmit FIFO for the specified port. +//! This function does not block, so if there is no space available, then a +//! \b false is returned, and the application will have to retry the function +//! later. +//! +//! \return Returns \b true if the character was successfully placed in the +//! transmit FIFO, and \b false if there was no space available in the transmit +//! FIFO. +// +//***************************************************************************** +#if defined(GROUP_charnonblockingput) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +UARTCharNonBlockingPut(unsigned long ulBase, unsigned char ucData) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // See if there is space in the transmit FIFO. + // + if(!(HWREG(ulBase + UART_O_FR) & UART_FR_TXFF)) + { + // + // Write this character to the transmit FIFO. + // + HWREG(ulBase + UART_O_DR) = ucData; + + // + // Success. + // + return(true); + } + else + { + // + // There is no space in the transmit FIFO, so return a failure. + // + return(false); + } +} +#endif + +//***************************************************************************** +// +//! Waits to send a character from the specified port. +//! +//! \param ulBase is the base address of the UART port. +//! \param ucData is the character to be transmitted. +//! +//! Sends the character \e ucData to the transmit FIFO for the specified port. +//! If there is no space available in the transmit FIFO, this function will +//! wait until there is space available before returning. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_charput) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTCharPut(unsigned long ulBase, unsigned char ucData) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Wait until space is available. + // + while(HWREG(ulBase + UART_O_FR) & UART_FR_TXFF) + { + } + + // + // Send the char. + // + HWREG(ulBase + UART_O_DR) = ucData; +} +#endif + +//***************************************************************************** +// +//! Causes a BREAK to be sent. +//! +//! \param ulBase is the base address of the UART port. +//! \param bBreakState controls the output level. +//! +//! Calling this function with \e bBreakState set to \b true will assert a +//! break condition on the UART. Calling this function with \e bBreakState set +//! to \b false will remove the break condition. For proper transmission of a +//! break command, the break must be asserted for at least two complete frames. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_breakctl) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Set the break condition as requested. + // + HWREG(ulBase + UART_O_LCR_H) = + (bBreakState ? + (HWREG(ulBase + UART_O_LCR_H) | UART_LCR_H_BRK) : + (HWREG(ulBase + UART_O_LCR_H) & ~(UART_LCR_H_BRK))); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for a UART interrupt. +//! +//! \param ulBase is the base address of the UART port. +//! \param pfnHandler is a pointer to the function to be called when the +//! UART interrupt occurs. +//! +//! This function does the actual registering of the interrupt handler. This +//! will enable the global interrupt in the interrupt controller; specific UART +//! interrupts must be enabled via UARTIntEnable(). It is the interrupt +//! handler's responsibility to clear the interrupt source. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTIntRegister(unsigned long ulBase, void (*pfnHandler)(void)) +{ + unsigned long ulInt; + + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Determine the interrupt number based on the UART port. + // + ulInt = (ulBase == UART0_BASE) ? INT_UART0 : INT_UART1; + + // + // Register the interrupt handler. + // + IntRegister(ulInt, pfnHandler); + + // + // Enable the UART interrupt. + // + IntEnable(ulInt); +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for a UART interrupt. +//! +//! \param ulBase is the base address of the UART port. +//! +//! This function does the actual unregistering of the interrupt handler. It +//! will clear the handler to be called when a UART interrupt occurs. This +//! will also mask off the interrupt in the interrupt controller so that the +//! interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTIntUnregister(unsigned long ulBase) +{ + unsigned long ulInt; + + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Determine the interrupt number based on the UART port. + // + ulInt = (ulBase == UART0_BASE) ? INT_UART0 : INT_UART1; + + // + // Disable the interrupt. + // + IntDisable(ulInt); + + // + // Unregister the interrupt handler. + // + IntUnregister(ulInt); +} +#endif + +//***************************************************************************** +// +//! Enables individual UART interrupt sources. +//! +//! \param ulBase is the base address of the UART port. +//! \param ulIntFlags is the bit mask of the interrupt sources to be enabled. +//! +//! Enables the indicated UART interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources have +//! no effect on the processor. +//! +//! The parameter \e ulIntFlags is the logical OR of any of the following: +//! +//! - UART_INT_OE - Overrun Error interrupt +//! - UART_INT_BE - Break Error interrupt +//! - UART_INT_PE - Parity Error interrupt +//! - UART_INT_FE - Framing Error interrupt +//! - UART_INT_RT - Receive Timeout interrupt +//! - UART_INT_TX - Transmit interrupt +//! - UART_INT_RX - Receive interrupt +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Enable the specified interrupts. + // + HWREG(ulBase + UART_O_IM) |= ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Disables individual UART interrupt sources. +//! +//! \param ulBase is the base address of the UART port. +//! \param ulIntFlags is the bit mask of the interrupt sources to be disabled. +//! +//! Disables the indicated UART interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources have +//! no effect on the processor. +//! +//! The parameter \e ulIntFlags has the same definition as the same parameter +//! to UARTIntEnable(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Disable the specified interrupts. + // + HWREG(ulBase + UART_O_IM) &= ~(ulIntFlags); +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param ulBase is the base address of the UART port. +//! \param bMasked is false if the raw interrupt status is required and true +//! if the masked interrupt status is required. +//! +//! This returns the interrupt status for the specified UART. Either the raw +//! interrupt status or the status of interrupts that are allowed to reflect to +//! the processor can be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! values described in UARTIntEnable(). +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +UARTIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(ulBase + UART_O_MIS)); + } + else + { + return(HWREG(ulBase + UART_O_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears UART interrupt sources. +//! +//! \param ulBase is the base address of the UART port. +//! \param ulIntFlags is a bit mask of the interrupt sources to be cleared. +//! +//! The specified UART interrupt sources are cleared, so that they no longer +//! assert. This must be done in the interrupt handler to keep it from being +//! called again immediately upon exit. +//! +//! The parameter \e ulIntFlags has the same definition as the same parameter +//! to UARTIntEnable(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Clear the requested interrupt sources. + // + HWREG(ulBase + UART_O_ICR) = ulIntFlags; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/uart.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/uart.h new file mode 100644 index 0000000..b82f2ee --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/uart.h @@ -0,0 +1,102 @@ +//***************************************************************************** +// +// uart.h - Defines and Macros for the UART. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __UART_H__ +#define __UART_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to UARTIntEnable, UARTIntDisable, and UARTIntClear +// as the ulIntFlags parameter, and returned from UARTIntStatus. +// +//***************************************************************************** +#define UART_INT_OE 0x400 // Overrun Error Interrupt Mask +#define UART_INT_BE 0x200 // Break Error Interrupt Mask +#define UART_INT_PE 0x100 // Parity Error Interrupt Mask +#define UART_INT_FE 0x080 // Framing Error Interrupt Mask +#define UART_INT_RT 0x040 // Receive Timeout Interrupt Mask +#define UART_INT_TX 0x020 // Transmit Interrupt Mask +#define UART_INT_RX 0x010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Values that can be passed to UARTConfigSet as the ulConfig parameter and +// returned by UARTConfigGet in the pulConfig parameter. Additionally, the +// UART_CONFIG_PAR_* subset can be passed to UARTParityModeSet as the ulParity +// parameter, and are returned by UARTParityModeGet. +// +//***************************************************************************** +#define UART_CONFIG_WLEN_8 0x00000060 // 8 bit data +#define UART_CONFIG_WLEN_7 0x00000040 // 7 bit data +#define UART_CONFIG_WLEN_6 0x00000020 // 6 bit data +#define UART_CONFIG_WLEN_5 0x00000000 // 5 bit data +#define UART_CONFIG_STOP_ONE 0x00000000 // One stop bit +#define UART_CONFIG_STOP_TWO 0x00000008 // Two stop bits +#define UART_CONFIG_PAR_NONE 0x00000000 // No parity +#define UART_CONFIG_PAR_EVEN 0x00000006 // Even parity +#define UART_CONFIG_PAR_ODD 0x00000002 // Odd parity +#define UART_CONFIG_PAR_ONE 0x00000086 // Parity bit is one +#define UART_CONFIG_PAR_ZERO 0x00000082 // Parity bit is zero + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity); +extern unsigned long UARTParityModeGet(unsigned long ulBase); +extern void UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig); +extern void UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig); +extern void UARTEnable(unsigned long ulBase); +extern void UARTDisable(unsigned long ulBase); +extern tBoolean UARTCharsAvail(unsigned long ulBase); +extern tBoolean UARTSpaceAvail(unsigned long ulBase); +extern long UARTCharNonBlockingGet(unsigned long ulBase); +extern long UARTCharGet(unsigned long ulBase); +extern tBoolean UARTCharNonBlockingPut(unsigned long ulBase, + unsigned char ucData); +extern void UARTCharPut(unsigned long ulBase, unsigned char ucData); +extern void UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState); +extern void UARTIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void UARTIntUnregister(unsigned long ulBase); +extern void UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __UART_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/watchdog.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/watchdog.c new file mode 100644 index 0000000..53332d0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/watchdog.c @@ -0,0 +1,592 @@ +//***************************************************************************** +// +// watchdog.c - Driver for the Watchdog Timer Module. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup watchdog_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_types.h" +#include "../hw_watchdog.h" +#include "debug.h" +#include "interrupt.h" +#include "watchdog.h" + +//***************************************************************************** +// +//! Determines if the watchdog timer is enabled. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This will check to see if the watchdog timer is enabled. +//! +//! \return Returns \b true if the watchdog timer is enabled, and \b false +//! if it is not. +// +//***************************************************************************** +#if defined(GROUP_running) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +WatchdogRunning(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // See if the watchdog timer module is enabled, and return. + // + return(HWREG(ulBase + WDT_O_CTL) & WDT_CTL_INTEN); +} +#endif + +//***************************************************************************** +// +//! Enables the watchdog timer. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This will enable the watchdog timer counter and interrupt. +//! +//! \note This function will have no effect if the watchdog timer has +//! been locked. +//! +//! \sa WatchdogLock(), WatchdogUnlock() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Enable the watchdog timer module. + // + HWREG(ulBase + WDT_O_CTL) |= WDT_CTL_INTEN; +} +#endif + +//***************************************************************************** +// +//! Enables the watchdog timer reset. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! Enables the capability of the watchdog timer to issue a reset to the +//! processor upon a second timeout condition. +//! +//! \note This function will have no effect if the watchdog timer has +//! been locked. +//! +//! \sa WatchdogLock(), WatchdogUnlock() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_resetenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogResetEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Enable the watchdog reset. + // + HWREG(ulBase + WDT_O_CTL) |= WDT_CTL_RESEN; +} +#endif + +//***************************************************************************** +// +//! Disables the watchdog timer reset. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! Disables the capability of the watchdog timer to issue a reset to the +//! processor upon a second timeout condition. +//! +//! \note This function will have no effect if the watchdog timer has +//! been locked. +//! +//! \sa WatchdogLock(), WatchdogUnlock() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_resetdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogResetDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Disable the watchdog reset. + // + HWREG(ulBase + WDT_O_CTL) &= ~(WDT_CTL_RESEN); +} +#endif + +//***************************************************************************** +// +//! Enables the watchdog timer lock mechanism. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! Locks out write access to the watchdog timer configuration registers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_lock) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogLock(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Lock out watchdog register writes. Writing anything to the WDT_O_LOCK + // register causes the lock to go into effect. + // + HWREG(ulBase + WDT_O_LOCK) = WDT_LOCK_LOCKED; +} +#endif + +//***************************************************************************** +// +//! Disables the watchdog timer lock mechanism. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! Enables write access to the watchdog timer configuration registers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_unlock) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogUnlock(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Unlock watchdog register writes. + // + HWREG(ulBase + WDT_O_LOCK) = WDT_LOCK_UNLOCK; +} +#endif + +//***************************************************************************** +// +//! Gets the state of the watchdog timer lock mechanism. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! Returns the lock state of the watchdog timer registers. +//! +//! \return Returns \b true if the watchdog timer registers are locked, and +//! \b false if they are not locked. +// +//***************************************************************************** +#if defined(GROUP_lockstate) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +WatchdogLockState(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Get the lock state. + // + return((HWREG(ulBase + WDT_O_LOCK) == WDT_LOCK_LOCKED) ? true : false); +} +#endif + +//***************************************************************************** +// +//! Sets the watchdog timer reload value. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! \param ulLoadVal is the load value for the watchdog timer. +//! +//! This function sets the value to load into the watchdog timer when the count +//! reaches zero for the first time; if the watchdog timer is running when this +//! function is called, then the value will be immediately loaded into the +//! watchdog timer counter. If the parameter \e ulLoadVal is 0, then an +//! interrupt is immediately generated. +//! +//! \note This function will have no effect if the watchdog timer has +//! been locked. +//! +//! \sa WatchdogLock(), WatchdogUnlock(), WatchdogReloadGet() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_reloadset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogReloadSet(unsigned long ulBase, unsigned long ulLoadVal) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Set the load register. + // + HWREG(ulBase + WDT_O_LOAD) = ulLoadVal; +} +#endif + +//***************************************************************************** +// +//! Gets the watchdog timer reload value. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This function gets the value that is loaded into the watchdog timer when +//! the count reaches zero for the first time. +//! +//! \sa WatchdogReloadSet() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_reloadget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +WatchdogReloadGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Get the load register. + // + return(HWREG(ulBase + WDT_O_LOAD)); +} +#endif + +//***************************************************************************** +// +//! Gets the current watchdog timer value. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This function reads the current value of the watchdog timer. +//! +//! \return Returns the current value of the watchdog timer. +// +//***************************************************************************** +#if defined(GROUP_valueget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +WatchdogValueGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Get the current watchdog timer register value. + // + return(HWREG(ulBase + WDT_O_VALUE)); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for watchdog timer interrupt. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! \param pfnHandler is a pointer to the function to be called when the +//! watchdog timer interrupt occurs. +//! +//! This function does the actual registering of the interrupt handler. This +//! will enable the global interrupt in the interrupt controller; the watchdog +//! timer interrupt must be enabled via WatchdogEnable(). It is the interrupt +//! handler's responsibility to clear the interrupt source via +//! WatchdogIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogIntRegister(unsigned long ulBase, void (*pfnHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Register the interrupt handler. + // + IntRegister(INT_WATCHDOG, pfnHandler); + + // + // Enable the watchdog timer interrupt. + // + IntEnable(INT_WATCHDOG); +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for the watchdog timer interrupt. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This function does the actual unregistering of the interrupt handler. This +//! function will clear the handler to be called when a watchdog timer +//! interrupt occurs. This will also mask off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogIntUnregister(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Disable the interrupt. + // + IntDisable(INT_WATCHDOG); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_WATCHDOG); +} +#endif + +//***************************************************************************** +// +//! Enables the watchdog timer interrupt. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! Enables the watchdog timer interrupt. +//! +//! \note This function will have no effect if the watchdog timer has +//! been locked. +//! +//! \sa WatchdogLock(), WatchdogUnlock(), WatchdogEnable() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogIntEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Enable the watchdog interrupt. + // + HWREG(ulBase + WDT_O_CTL) |= WDT_CTL_INTEN; +} +#endif + +//***************************************************************************** +// +//! Gets the current watchdog timer interrupt status. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! \param bMasked is \b false if the raw interrupt status is required and +//! \b true if the masked interrupt status is required. +//! +//! This returns the interrupt status for the watchdog timer module. Either +//! the raw interrupt status or the status of interrupt that is allowed to +//! reflect to the processor can be returned. +//! +//! \return The current interrupt status, where a 1 indicates that the watchdog +//! interrupt is active, and a 0 indicates that it is not active. +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +WatchdogIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(ulBase + WDT_O_MIS)); + } + else + { + return(HWREG(ulBase + WDT_O_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears the watchdog timer interrupt. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! The watchdog timer interrupt source is cleared, so that it no longer +//! asserts. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogIntClear(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Clear the interrupt source. + // + HWREG(ulBase + WDT_O_ICR) = WDT_INT_TIMEOUT; +} +#endif + +//***************************************************************************** +// +//! Enables stalling of the watchdog timer during debug events. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This function allows the watchdog timer to stop counting when the processor +//! is stopped by the debugger. By doing so, the watchdog is prevented from +//! expiring (typically almost immediately from a human time perspective) and +//! resetting the system (if reset is enabled). The watchdog will instead +//! expired after the appropriate number of processor cycles have been executed +//! while debugging (or at the appropriate time after the processor has been +//! restarted). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_stallenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogStallEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Enable timer stalling. + // + HWREG(ulBase + WDT_O_TEST) |= WDT_TEST_STALL; +} +#endif + +//***************************************************************************** +// +//! Disables stalling of the watchdog timer during debug events. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This function disables the debug mode stall of the watchdog timer. By +//! doing so, the watchdog timer continues to count regardless of the processor +//! debug state. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_stalldisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogStallDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Disable timer stalling. + // + HWREG(ulBase + WDT_O_TEST) &= ~(WDT_TEST_STALL); +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/watchdog.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/watchdog.h new file mode 100644 index 0000000..9378504 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/hw_include/watchdog.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// watchdog.h - Prototypes for the Watchdog Timer API +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __WATCHDOG_H__ +#define __WATCHDOG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern tBoolean WatchdogRunning(unsigned long ulBase); +extern void WatchdogEnable(unsigned long ulBase); +extern void WatchdogResetEnable(unsigned long ulBase); +extern void WatchdogResetDisable(unsigned long ulBase); +extern void WatchdogLock(unsigned long ulBase); +extern void WatchdogUnlock(unsigned long ulBase); +extern tBoolean WatchdogLockState(unsigned long ulBase); +extern void WatchdogReloadSet(unsigned long ulBase, unsigned long ulLoadVal); +extern unsigned long WatchdogReloadGet(unsigned long ulBase); +extern unsigned long WatchdogValueGet(unsigned long ulBase); +extern void WatchdogIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void WatchdogIntUnregister(unsigned long ulBase); +extern void WatchdogIntEnable(unsigned long ulBase); +extern unsigned long WatchdogIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void WatchdogIntClear(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __WATCHDOG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/init/startup.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/init/startup.c new file mode 100644 index 0000000..93da079 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/init/startup.c @@ -0,0 +1,222 @@ +//***************************************************************************** +// +// startup.c - Boot code for Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1049 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); +extern void xPortPendSVHandler(void); +extern void xPortSysTickHandler(void); +extern void vUART_ISR( void ); +extern void vGPIO_ISR( void ); +extern void vPortSVCHandler( void ); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +#ifndef STACK_SIZE +#define STACK_SIZE 64 +#endif +static unsigned long pulStack[STACK_SIZE]; + +//***************************************************************************** +// +// The minimal vector table for a Cortex-M3. Note that the proper constructs +// must be placed on this to ensure that it ends up at physical address +// 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((unsigned long)pulStack + sizeof(pulStack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + vGPIO_ISR, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + vUART_ISR, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI Rx and Tx + IntDefaultHandler, // I2C Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler // FLASH Control +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern unsigned long _etext; +extern unsigned long _data; +extern unsigned long _edata; +extern unsigned long _bss; +extern unsigned long _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied main() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + unsigned long *pulSrc, *pulDest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pulSrc = &_etext; + for(pulDest = &_data; pulDest < &_edata; ) + { + *pulDest++ = *pulSrc++; + } + + // + // Zero fill the bss segment. + // + for(pulDest = &_bss; pulDest < &_ebss; ) + { + *pulDest++ = 0; + } + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/main.c new file mode 100644 index 0000000..08ef3da --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/main.c @@ -0,0 +1,398 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * This project contains an application demonstrating the use of the + * FreeRTOS.org mini real time scheduler on the Luminary Micro LM3S811 Eval + * board. See http://www.FreeRTOS.org for more information. + * + * main() simply sets up the hardware, creates all the demo application tasks, + * then starts the scheduler. http://www.freertos.org/a00102.html provides + * more information on the standard demo tasks. + * + * In addition to a subset of the standard demo application tasks, main.c also + * defines the following tasks: + * + * + A 'Print' task. The print task is the only task permitted to access the + * LCD - thus ensuring mutual exclusion and consistent access to the resource. + * Other tasks do not access the LCD directly, but instead send the text they + * wish to display to the print task. The print task spends most of its time + * blocked - only waking when a message is queued for display. + * + * + A 'Button handler' task. The eval board contains a user push button that + * is configured to generate interrupts. The interrupt handler uses a + * semaphore to wake the button handler task - demonstrating how the priority + * mechanism can be used to defer interrupt processing to the task level. The + * button handler task sends a message both to the LCD (via the print task) and + * the UART where it can be viewed using a dumb terminal (via the UART to USB + * converter on the eval board). NOTES: The dumb terminal must be closed in + * order to reflash the microcontroller. A very basic interrupt driven UART + * driver is used that does not use the FIFO. 19200 baud is used. + * + * + A 'check' task. The check task only executes every five seconds but has a + * high priority so is guaranteed to get processor time. Its function is to + * check that all the other tasks are still operational and that no errors have + * been detected at any time. If no errors have every been detected 'PASS' is + * written to the display (via the print task) - if an error has ever been + * detected the message is changed to 'FAIL'. The position of the message is + * changed for each write. + */ + + + +/* Environment includes. */ +#include "DriverLib.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +/* Demo app includes. */ +#include "integer.h" +#include "PollQ.h" +#include "semtest.h" +#include "BlockQ.h" + +/* Delay between cycles of the 'check' task. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) + +/* UART configuration - note this does not use the FIFO so is not very +efficient. */ +#define mainBAUD_RATE ( 19200 ) +#define mainFIFO_SET ( 0x10 ) + +/* Demo task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) + +/* Demo board specifics. */ +#define mainPUSH_BUTTON GPIO_PIN_4 + +/* Misc. */ +#define mainQUEUE_SIZE ( 3 ) +#define mainDEBOUNCE_DELAY ( ( portTickType ) 150 / portTICK_RATE_MS ) +#define mainNO_DELAY ( ( portTickType ) 0 ) +/* + * Configure the processor and peripherals for this demo. + */ +static void prvSetupHardware( void ); + +/* + * The 'check' task, as described at the top of this file. + */ +static void vCheckTask( void *pvParameters ); + +/* + * The task that is woken by the ISR that processes GPIO interrupts originating + * from the push button. + */ +static void vButtonHandlerTask( void *pvParameters ); + +/* + * The task that controls access to the LCD. + */ +static void vPrintTask( void *pvParameter ); + +/* String that is transmitted on the UART. */ +static portCHAR *cMessage = "Task woken by button interrupt! --- "; +static volatile portCHAR *pcNextChar; + +/* The semaphore used to wake the button handler task from within the GPIO +interrupt handler. */ +xSemaphoreHandle xButtonSemaphore; + +/* The queue used to send strings to the print task for display on the LCD. */ +xQueueHandle xPrintQueue; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + /* Configure the clocks, UART and GPIO. */ + prvSetupHardware(); + + /* Create the semaphore used to wake the button handler task from the GPIO + ISR. */ + vSemaphoreCreateBinary( xButtonSemaphore ); + xSemaphoreTake( xButtonSemaphore, 0 ); + + /* Create the queue used to pass message to vPrintTask. */ + xPrintQueue = xQueueCreate( mainQUEUE_SIZE, sizeof( portCHAR * ) ); + + /* Start the standard demo tasks. */ + vStartIntegerMathTasks( tskIDLE_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + + /* Start the tasks defined within the file. */ + xTaskCreate( vCheckTask, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); + xTaskCreate( vButtonHandlerTask, "Status", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY + 1, NULL ); + xTaskCreate( vPrintTask, "Print", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL ); + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient heap to start the + scheduler. */ + + return 0; +} +/*-----------------------------------------------------------*/ + +static void vCheckTask( void *pvParameters ) +{ +portBASE_TYPE xErrorOccurred = pdFALSE; +portTickType xLastExecutionTime; +const portCHAR *pcPassMessage = "PASS"; +const portCHAR *pcFailMessage = "FAIL"; + + /* Initialise xLastExecutionTime so the first call to vTaskDelayUntil() + works correctly. */ + xLastExecutionTime = xTaskGetTickCount(); + + for( ;; ) + { + /* Perform this check every mainCHECK_DELAY milliseconds. */ + vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY ); + + /* Has an error been found in any task? */ + + if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + xErrorOccurred = pdTRUE; + } + + if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xErrorOccurred = pdTRUE; + } + + if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + xErrorOccurred = pdTRUE; + } + + if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + xErrorOccurred = pdTRUE; + } + + /* Send either a pass or fail message. If an error is found it is + never cleared again. We do not write directly to the LCD, but instead + queue a message for display by the print task. */ + if( xErrorOccurred == pdTRUE ) + { + xQueueSend( xPrintQueue, &pcFailMessage, portMAX_DELAY ); + } + else + { + xQueueSend( xPrintQueue, &pcPassMessage, portMAX_DELAY ); + } + } +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* Setup the PLL. */ + SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); + + /* Setup the push button. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + GPIODirModeSet(GPIO_PORTC_BASE, mainPUSH_BUTTON, GPIO_DIR_MODE_IN); + GPIOIntTypeSet( GPIO_PORTC_BASE, mainPUSH_BUTTON,GPIO_FALLING_EDGE ); + IntPrioritySet( INT_GPIOC, configKERNEL_INTERRUPT_PRIORITY ); + GPIOPinIntEnable( GPIO_PORTC_BASE, mainPUSH_BUTTON ); + IntEnable( INT_GPIOC ); + + + + /* Enable the UART. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + /* Set GPIO A0 and A1 as peripheral function. They are used to output the + UART signals. */ + GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW ); + + /* Configure the UART for 8-N-1 operation. */ + UARTConfigSet( UART0_BASE, mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE ); + + /* We don't want to use the fifo. This is for test purposes to generate + as many interrupts as possible. */ + HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET; + + /* Enable Tx interrupts. */ + HWREG( UART0_BASE + UART_O_IM ) |= UART_INT_TX; + IntPrioritySet( INT_UART0, configKERNEL_INTERRUPT_PRIORITY ); + IntEnable( INT_UART0 ); + + + /* Initialise the LCD> */ + OSRAMInit( false ); + OSRAMStringDraw("www.FreeRTOS.org", 0, 0); + OSRAMStringDraw("LM3S811 demo", 16, 1); +} +/*-----------------------------------------------------------*/ + +static void vButtonHandlerTask( void *pvParameters ) +{ +const portCHAR *pcInterruptMessage = "Int"; + + for( ;; ) + { + /* Wait for a GPIO interrupt to wake this task. */ + while( xSemaphoreTake( xButtonSemaphore, portMAX_DELAY ) != pdPASS ); + + /* Start the Tx of the message on the UART. */ + UARTIntDisable( UART0_BASE, UART_INT_TX ); + { + pcNextChar = cMessage; + + /* Send the first character. */ + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = *pcNextChar; + } + + pcNextChar++; + } + UARTIntEnable(UART0_BASE, UART_INT_TX); + + /* Queue a message for the print task to display on the LCD. */ + xQueueSend( xPrintQueue, &pcInterruptMessage, portMAX_DELAY ); + + /* Make sure we don't process bounces. */ + vTaskDelay( mainDEBOUNCE_DELAY ); + xSemaphoreTake( xButtonSemaphore, mainNO_DELAY ); + } +} + +/*-----------------------------------------------------------*/ + +void vUART_ISR(void) +{ +unsigned portLONG ulStatus; + + /* What caused the interrupt. */ + ulStatus = UARTIntStatus( UART0_BASE, pdTRUE ); + + /* Clear the interrupt. */ + UARTIntClear( UART0_BASE, ulStatus ); + + /* Was a Tx interrupt pending? */ + if( ulStatus & UART_INT_TX ) + { + /* Send the next character in the string. We are not using the FIFO. */ + if( *pcNextChar != 0 ) + { + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = *pcNextChar; + } + pcNextChar++; + } + } +} +/*-----------------------------------------------------------*/ + +void vGPIO_ISR( void ) +{ +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* Clear the interrupt. */ + GPIOPinIntClear(GPIO_PORTC_BASE, mainPUSH_BUTTON); + + /* Wake the button handler task. */ + xSemaphoreGiveFromISR( xButtonSemaphore, &xHigherPriorityTaskWoken ); + + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + +static void vPrintTask( void *pvParameters ) +{ +portCHAR *pcMessage; +unsigned portBASE_TYPE uxLine = 0, uxRow = 0; + + for( ;; ) + { + /* Wait for a message to arrive. */ + xQueueReceive( xPrintQueue, &pcMessage, portMAX_DELAY ); + + /* Write the message to the LCD. */ + uxRow++; + uxLine++; + OSRAMClear(); + OSRAMStringDraw( pcMessage, uxLine & 0x3f, uxRow & 0x01); + } +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/makedefs b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/makedefs new file mode 100644 index 0000000..17d00db --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/makedefs @@ -0,0 +1,208 @@ +#****************************************************************************** +# +# makedefs - Definitions common to all makefiles. +# +# Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +# +# Software License Agreement +# +# Luminary Micro, Inc. (LMI) is supplying this software for use solely and +# exclusively on LMI's Stellaris Family of microcontroller products. +# +# The software is owned by LMI and/or its suppliers, and is protected under +# applicable copyright laws. All rights are reserved. Any use in violation +# of the foregoing restrictions may subject the user to criminal sanctions +# under applicable laws, as well as to civil liability for the breach of the +# terms and conditions of this license. +# +# THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +# OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +# LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +# CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +# +#****************************************************************************** + +#****************************************************************************** +# +# Get the operating system name. If this is Cygwin, the .d files will be +# munged to convert c: into /cygdrive/c so that "make" will be happy with the +# auto-generated dependencies. +# +#****************************************************************************** +os:=${shell uname -s} + +#****************************************************************************** +# +# The compiler to be used. +# +#****************************************************************************** +ifndef COMPILER +COMPILER=gcc +endif + +#****************************************************************************** +# +# The debugger to be used. +# +#****************************************************************************** +ifndef DEBUGGER +DEBUGGER=gdb +endif + +#****************************************************************************** +# +# Definitions for using GCC. +# +#****************************************************************************** +ifeq (${COMPILER}, gcc) + +# +# The command for calling the compiler. +# +CC=arm-none-eabi-gcc + +# +# The flags passed to the assembler. +# +AFLAGS=-mthumb \ + -mcpu=cortex-m3 \ + -MD + +# +# The flags passed to the compiler. +# +CFLAGS=-mthumb \ + -mcpu=cortex-m3 \ + -O2 \ + -MD + +# +# The command for calling the library archiver. +# +AR=arm-none-eabi-ar + +# +# The command for calling the linker. +# +LD=arm-none-eabi-ld + +# +# The flags passed to the linker. +# +LDFLAGS= -Map gcc/out.map + +# +# Get the location of libgcc.a from the GCC front-end. +# +LIBGCC=${shell ${CC} -mthumb -march=armv6t2 -print-libgcc-file-name} + +# +# Get the location of libc.a from the GCC front-end. +# +LIBC=${shell ${CC} -mthumb -march=armv6t2 -print-file-name=libc.a} + +# +# The command for extracting images from the linked executables. +# +OBJCOPY=arm-none-eabi-objcopy + +endif + +#****************************************************************************** +# +# Tell the compiler to include debugging information if the DEBUG environment +# variable is set. +# +#****************************************************************************** +ifdef DEBUG +CFLAGS += -g +endif + +#****************************************************************************** +# +# The rule for building the object file from each C source file. +# +#****************************************************************************** +${COMPILER}/%.o: %.c + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " CC ${<}"; \ + else \ + echo ${CC} ${CFLAGS} -D${COMPILER} -o ${@} -c ${<}; \ + fi + @${CC} ${CFLAGS} -D${COMPILER} -o ${@} -c ${<} +ifeq (${COMPILER}, rvds) + @mv -f ${notdir ${@:.o=.d}} ${COMPILER} +endif +ifneq ($(findstring CYGWIN, ${os}), ) + @perl -i.bak -p -e 's/[Cc]:/\/cygdrive\/c/g' ${@:.o=.d} +endif + +#****************************************************************************** +# +# The rule for building the object file from each assembly source file. +# +#****************************************************************************** +${COMPILER}/%.o: %.S + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " CC ${<}"; \ + else \ + echo ${CC} ${AFLAGS} -D${COMPILER} -o ${@} -c ${<}; \ + fi +ifeq (${COMPILER}, rvds) + @${CC} ${AFLAGS} -D${COMPILER} -E ${<} > ${@:.o=_.S} + @${CC} ${AFLAGS} -o ${@} -c ${@:.o=_.S} + @rm ${@:.o=_.S} + @${CC} ${AFLAGS} -D${COMPILER} --md -E ${<} + @sed 's,,${@},g' ${notdir ${<:.S=.d}} > ${@:.o=.d} + @rm ${notdir ${<:.S=.d}} +endif +ifeq (${COMPILER}, gcc) + @${CC} ${AFLAGS} -D${COMPILER} -o ${@} -c ${<} +endif +ifneq ($(findstring CYGWIN, ${os}), ) + @perl -i.bak -p -e 's/[Cc]:/\/cygdrive\/c/g' ${@:.o=.d} +endif + +#****************************************************************************** +# +# The rule for creating an object library. +# +#****************************************************************************** +${COMPILER}/%.a: + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " AR ${@}"; \ + else \ + echo ${AR} -cr ${@} ${^}; \ + fi + @${AR} -cr ${@} ${^} + +#****************************************************************************** +# +# The rule for linking the application. +# +#****************************************************************************** +${COMPILER}/%.axf: + @if [ 'x${VERBOSE}' = x ]; \ + then \ + echo " LD ${@}"; \ + fi +ifeq (${COMPILER}, gcc) + @if [ 'x${VERBOSE}' != x ]; \ + then \ + echo ${LD} -T ${SCATTER_${notdir ${@:.axf=}}} \ + --entry ${ENTRY_${notdir ${@:.axf=}}} \ + ${LDFLAGSgcc_${notdir ${@:.axf=}}} \ + ${LDFLAGS} -o ${@} ${^} \ + '${LIBC}' '${LIBGCC}'; \ + fi + @${LD} -T ${SCATTER_${notdir ${@:.axf=}}} \ + --entry ${ENTRY_${notdir ${@:.axf=}}} \ + ${LDFLAGSgcc_${notdir ${@:.axf=}}} \ + ${LDFLAGS} -o ${@} ${^} \ + '${LIBC}' '${LIBGCC}' + @${OBJCOPY} -O binary ${@} ${@:.axf=.bin} +endif diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/standalone.ld b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/standalone.ld new file mode 100644 index 0000000..8ee3fe2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_GCC/standalone.ld @@ -0,0 +1,60 @@ +/****************************************************************************** + * + * standalone.ld - Linker script for applications using startup.c and + * DriverLib. + * + * Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. + * + * Software License Agreement + * + * Luminary Micro, Inc. (LMI) is supplying this software for use solely and + * exclusively on LMI's microcontroller products. + * + * The software is owned by LMI and/or its suppliers, and is protected under + * applicable copyright laws. All rights are reserved. Any use in violation + * of the foregoing restrictions may subject the user to criminal sanctions + * under applicable laws, as well as to civil liability for the breach of the + * terms and conditions of this license. + * + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 1049 of the Stellaris Driver Library. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 64K + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 8K +} + +SECTIONS +{ + .text : + { + KEEP(*(.isr_vector)) + *(.text) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT (ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/FreeRTOSConfig.h new file mode 100644 index 0000000..79edf3b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/FreeRTOSConfig.h @@ -0,0 +1,115 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 70 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 7000 ) ) +#define configMAX_TASK_NAME_LEN ( 10 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 0 +#define INCLUDE_uxTaskPriorityGet 0 +#define INCLUDE_vTaskDelete 0 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + + +#define configKERNEL_INTERRUPT_PRIORITY 255 +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xa0, or priority 5. */ + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LM3S811.icf b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LM3S811.icf new file mode 100644 index 0000000..5131af0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LM3S811.icf @@ -0,0 +1,58 @@ +//***************************************************************************** +// +// boot_demo1.icf - Linker configuration file for boot_demo1. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// Luminary Micro Confidential - For Use Under NDA Only +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0000ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x20001fff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Initicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/DriverLib.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/DriverLib.h new file mode 100644 index 0000000..47531fb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/DriverLib.h @@ -0,0 +1,39 @@ +#ifndef DRIVER_LIB_H +#define DRIVER_LIB_H + +#include "DriverLib.h" +#include "hw_adc.h" +#include "hw_comp.h" +#include "hw_flash.h" +#include "hw_gpio.h" +#include "hw_i2c.h" +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_nvic.h" +#include "hw_pwm.h" +#include "hw_qei.h" +#include "hw_ssi.h" +#include "hw_sysctl.h" +#include "hw_timer.h" +#include "hw_types.h" +#include "hw_uart.h" +#include "hw_watchdog.h" +#include "osram96x16.h" +#include "adc.h" +#include "comp.h" +#include "cpu.h" +#include "debug.h" +#include "flash.h" +#include "gpio.h" +#include "i2c.h" +#include "interrupt.h" +#include "pwm.h" +#include "qei.h" +#include "ssi.h" +#include "sysctl.h" +#include "systick.h" +#include "timer.h" +#include "uart.h" +#include "watchdog.h" + +#endif diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/EULA.txt b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/EULA.txt new file mode 100644 index 0000000..02c57b2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/EULA.txt @@ -0,0 +1,126 @@ +IMPORTANT. Read the following LMI Software License Agreement ("Agreement") +completely. + +LUMINARY MICRO SOFTWARE LICENSE AGREEMENT + + This is a legal agreement between you (either as an individual or as an +authorized representative of your employer) and Luminary Micro, Inc. ("LMI"). +It concerns your rights to use this file and any accompanying written materials +(the "Software"). In consideration for LMI allowing you to access the +Software, you are agreeing to be bound by the terms of this Agreement. If you +do not agree to all of the terms of this Agreement, do not download or use the +Software. If you change your mind later, stop using the Software and delete +all copies of the Software in your possession or control. Any copies of the +Software that you have already distributed, where permitted, and do not destroy +will continue to be governed by this Agreement. Your prior use will also +continue to be governed by this Agreement. + +1. LICENSE GRANT. LMI grants to you, free of charge, the non-exclusive, +non-transferable right (1) to use the Software, (2) to reproduce the Software, +(3) to prepare derivative works of the Software, (4) to distribute the Software +and derivative works thereof in source (human-readable) form and object +(machine-readable) form, and (5) to sublicense to others the right to use the +distributed Software. If you violate any of the terms or restrictions of this +Agreement, LMI may immediately terminate this Agreement, and require that you +stop using and delete all copies of the Software in your possession or control. + +2. COPYRIGHT. The Software is licensed to you, not sold. LMI owns the +Software, and United States copyright laws and international treaty provisions +protect the Software. Therefore, you must treat the Software like any other +copyrighted material (e.g. a book or musical recording). You may not use or +copy the Software for any other purpose than what is described in this +Agreement. Except as expressly provided herein, LMI does not grant to you any +express or implied rights under any LMI or third-party patents, copyrights, +trademarks, or trade secrets. Additionally, you must reproduce and apply any +copyright or other proprietary rights notices included on or embedded in the +Software to any copies or derivative works made thereof, in whole or in part, +if any. + +3. SUPPORT. LMI is NOT obligated to provide any support, upgrades or new +releases of the Software. If you wish, you may contact LMI and report problems +and provide suggestions regarding the Software. LMI has no obligation +whatsoever to respond in any way to such a problem report or suggestion. LMI +may make changes to the Software at any time, without any obligation to notify +or provide updated versions of the Software to you. + +4. INDEMNITY. You agree to fully defend and indemnify LMI from any and +all claims, liabilities, and costs (including reasonable attorney's fees) +related to (1) your use (including your sub-licensee's use, if permitted) of +the Software or (2) your violation of the terms and conditions of this +Agreement. + +5. HIGH RISK ACTIVITIES. You acknowledge that the Software is not fault +tolerant and is not designed, manufactured or intended by LMI for incorporation +into products intended for use or resale in on-line control equipment in +hazardous, dangerous to life or potentially life-threatening environments +requiring fail-safe performance, such as in the operation of nuclear +facilities, aircraft navigation or communication systems, air traffic control, +direct life support machines or weapons systems, in which the failure of +products could lead directly to death, personal injury or severe physical or +environmental damage ("High Risk Activities"). You specifically represent and +warrant that you will not use the Software or any derivative work of the +Software for High Risk Activities. + +6. PRODUCT LABELING. You are not authorized to use any LMI trademarks, +brand names, or logos. + +7. COMPLIANCE WITH LAWS; EXPORT RESTRICTIONS. You must use the Software +in accordance with all applicable U.S. laws, regulations and statutes. You +agree that neither you nor your licensees (if any) intend to or will, directly +or indirectly, export or transmit the Software to any country in violation of +U.S. export restrictions. + +8. GOVERNMENT USE. Use of the Software and any corresponding +documentation, if any, is provided with RESTRICTED RIGHTS. Use, duplication or +disclosure by the Government is subject to restrictions as set forth in +subparagraph (c)(1)(ii) of The Rights in Technical Data and Computer Software +clause at DFARS 252.227-7013 or subparagraphs (c)(l) and (2) of the Commercial +Computer Software--Restricted Rights at 48 CFR 52.227-19, as applicable. +Manufacturer is Luminary Micro, Inc., 2499 S. Capital of Texas Hwy Ste A-100, +Austin, Texas 78746. + +9. DISCLAIMER OF WARRANTY. TO THE MAXIMUM EXTENT PERMITTED BY LAW, LMI +EXPRESSLY DISCLAIMS ANY WARRANTY FOR THE SOFTWARE. THE SOFTWARE IS PROVIDED +"AS IS", WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, +WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE, OR NON-INFRINGEMENT. YOU ASSUME THE ENTIRE RISK ARISING +OUT OF THE USE OR PERFORMANCE OF THE SOFTWARE, OR ANY SYSTEMS YOU DESIGN USING +THE SOFTWARE (IF ANY). NOTHING IN THIS AGREEMENT MAY BE CONSTRUED AS A +WARRANTY OR REPRESENTATION BY LMI THAT THE SOFTWARE OR ANY DERIVATIVE WORK +DEVELOPED WITH OR INCORPORATING THE SOFTWARE WILL BE FREE FROM INFRINGEMENT OF +THE INTELLECTUAL PROPERTY RIGHTS OF THIRD PARTIES. + +10. LIMITATION OF LIABILITY. IN NO EVENT WILL LMI BE LIABLE, WHETHER IN +CONTRACT, TORT, OR OTHERWISE, FOR ANY INCIDENTAL, SPECIAL, INDIRECT, +CONSEQUENTIAL OR PUNITIVE DAMAGES, INCLUDING, BUT NOT LIMITED TO, DAMAGES FOR +ANY LOSS OF USE, LOSS OF TIME, INCONVENIENCE, COMMERCIAL LOSS, OR LOST PROFITS, +SAVINGS, OR REVENUES TO THE FULL EXTENT SUCH MAY BE DISCLAIMED BY LAW. + +11. CHOICE OF LAW; VENUE; LIMITATIONS. You agree that the statutes and +laws of the United States and the State of Texas, USA, without regard to +conflicts of laws principles, will apply to all matters relating to this +Agreement or the Software, and you agree that any litigation will be subject to +the exclusive jurisdiction of the state or federal courts in Austin, Travis +County, Texas, USA. You agree that regardless of any statute or law to the +contrary, any claim or cause of action arising out of or related to this +Agreement or the Software must be filed within one (1) year after such claim or +cause of action arose or be forever barred. + +12. ENTIRE AGREEMENT. This Agreement constitutes the entire agreement +between you and LMI regarding the subject matter of this Agreement, and +supersedes all prior communications, negotiations, understandings, agreements +or representations, either written or oral, if any. This Agreement may only be +amended in written form, executed by you and LMI. + +13. SEVERABILITY. If any provision of this Agreement is held for any +reason to be invalid or unenforceable, then the remaining provisions of this +Agreement will be unimpaired and, unless a modification or replacement of the +invalid or unenforceable provision is further held to deprive you or LMI of a +material benefit, in which case the Agreement will immediately terminate, the +invalid or unenforceable provision will be replaced with a provision that is +valid and enforceable and that comes closest to the intention underlying the +invalid or unenforceable provision. + +14. NO WAIVER. The waiver by LMI of any breach of any provision of this +Agreement will not operate or be construed as a waiver of any other or a +subsequent breach of the same or a different provision. diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/adc.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/adc.c new file mode 100644 index 0000000..53f3adf --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/adc.c @@ -0,0 +1,946 @@ +//***************************************************************************** +// +// adc.c - Driver for the ADC. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup adc_api +//! @{ +// +//***************************************************************************** + +#include "../hw_adc.h" +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_types.h" +#include "adc.h" +#include "debug.h" +#include "interrupt.h" + +//***************************************************************************** +// +// The currently configured software oversampling factor for each of the ADC +// sequencers. +// +//***************************************************************************** +#if defined(GROUP_pucoverssamplefactor) || defined(BUILD_ALL) +unsigned char g_pucOversampleFactor[3]; +#else +extern unsigned char g_pucOversampleFactor[3]; +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for an ADC interrupt. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param pfnHandler is a pointer to the function to be called when the +//! ADC sample sequence interrupt occurs. +//! +//! This function sets the handler to be called when a sample sequence +//! interrupt occurs. This will enable the global interrupt in the interrupt +//! controller; the sequence interrupt must be enabled with ADCIntEnable(). It +//! is the interrupt handler's responsibility to clear the interrupt source via +//! ADCIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCIntRegister(unsigned long ulBase, unsigned long ulSequenceNum, + void (*pfnHandler)(void)) +{ + unsigned long ulInt; + + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Determine the interrupt to register based on the sequence number. + // + ulInt = INT_ADC0 + ulSequenceNum; + + // + // Register the interrupt handler. + // + IntRegister(ulInt, pfnHandler); + + // + // Enable the timer interrupt. + // + IntEnable(ulInt); +} +#endif + +//***************************************************************************** +// +//! Unregisters the interrupt handler for an ADC interrupt. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! This function unregisters the interrupt handler. This will disable the +//! global interrupt in the interrupt controller; the sequence interrupt must +//! be disabled via ADCIntDisable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCIntUnregister(unsigned long ulBase, unsigned long ulSequenceNum) +{ + unsigned long ulInt; + + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Determine the interrupt to unregister based on the sequence number. + // + ulInt = INT_ADC0 + ulSequenceNum; + + // + // Disable the interrupt. + // + IntDisable(ulInt); + + // + // Unregister the interrupt handler. + // + IntUnregister(ulInt); +} +#endif + +//***************************************************************************** +// +//! Disables a sample sequence interrupt. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! This function disables the requested sample sequence interrupt. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCIntDisable(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Disable this sample sequence interrupt. + // + HWREG(ulBase + ADC_O_IM) &= ~(1 << ulSequenceNum); +} +#endif + +//***************************************************************************** +// +//! Enables a sample sequence interrupt. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! This function enables the requested sample sequence interrupt. Any +//! outstanding interrupts are cleared before enabling the sample sequence +//! interrupt. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCIntEnable(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Clear any outstanding interrupts on this sample sequence. + // + HWREG(ulBase + ADC_O_ISC) = 1 << ulSequenceNum; + + // + // Enable this sample sequence interrupt. + // + HWREG(ulBase + ADC_O_IM) |= 1 << ulSequenceNum; +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param bMasked is false if the raw interrupt status is required and true if +//! the masked interrupt status is required. +//! +//! This returns the interrupt status for the specified sample sequence. +//! Either the raw interrupt status or the status of interrupts that are +//! allowed to reflect to the processor can be returned. +//! +//! \return The current raw or masked interrupt status. +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +ADCIntStatus(unsigned long ulBase, unsigned long ulSequenceNum, + tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(ulBase + ADC_O_ISC) & (1 << ulSequenceNum)); + } + else + { + return(HWREG(ulBase + ADC_O_RIS) & (1 << ulSequenceNum)); + } +} +#endif + +//***************************************************************************** +// +//! Clears sample sequence interrupt source. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! The specified sample sequence interrupt is cleared, so that it no longer +//! asserts. This must be done in the interrupt handler to keep it from being +//! called again immediately upon exit. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCIntClear(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arugments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Clear the interrupt. + // + HWREG(ulBase + ADC_O_ISC) = 1 << ulSequenceNum; +} +#endif + +//***************************************************************************** +// +//! Enables a sample sequence. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! Allows the specified sample sequence to be captured when its trigger is +//! detected. A sample sequence must be configured before it is enabled. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_sequenceenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCSequenceEnable(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arugments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Enable the specified sequence. + // + HWREG(ulBase + ADC_O_ACTSS) |= 1 << ulSequenceNum; +} +#endif + +//***************************************************************************** +// +//! Disables a sample sequence. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! Prevents the specified sample sequence from being captured when its trigger +//! is detected. A sample sequence should be disabled before it is configured. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_sequencedisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCSequenceDisable(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arugments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Disable the specified sequences. + // + HWREG(ulBase + ADC_O_ACTSS) &= ~(1 << ulSequenceNum); +} +#endif + +//***************************************************************************** +// +//! Configures the trigger source and priority of a sample sequence. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param ulTrigger is the trigger source that initiates the sample sequence; +//! must be one of the \b ADC_TRIGGER_* values. +//! \param ulPriority is the relative priority of the sample sequence with +//! respect to the other sample sequences. +//! +//! This function configures the initiation criteria for a sample sequence. +//! Valid sample sequences range from zero to three; sequence zero will capture +//! up to eight samples, sequences one and two will capture up to four samples, +//! and sequence three will capture a single sample. The trigger condition and +//! priority (with respect to other sample sequence execution) is set. +//! +//! The parameter \b ulTrigger can take on the following values: +//! +//! - \b ADC_TRIGGER_PROCESSOR - A trigger generated by the processor, via the +//! ADCProcessorTrigger() function. +//! - \b ADC_TRIGGER_COMP0 - A trigger generated by the first analog +//! comparator; configured with ComparatorConfigure(). +//! - \b ADC_TRIGGER_COMP1 - A trigger generated by the second analog +//! comparator; configured with ComparatorConfigure(). +//! - \b ADC_TRIGGER_COMP2 - A trigger generated by the third analog +//! comparator; configured with ComparatorConfigure(). +//! - \b ADC_TRIGGER_EXTERNAL - A trigger generated by an input from the Port +//! B4 pin. +//! - \b ADC_TRIGGER_TIMER - A trigger generated by a timer; configured with +//! TimerControlTrigger(). +//! - \b ADC_TRIGGER_PWM0 - A trigger generated by the first PWM generator; +//! configured with PWMGenIntTrigEnable(). +//! - \b ADC_TRIGGER_PWM1 - A trigger generated by the second PWM generator; +//! configured with PWMGenIntTrigEnable(). +//! - \b ADC_TRIGGER_PWM2 - A trigger generated by the third PWM generator; +//! configured with PWMGenIntTrigEnable(). +//! - \b ADC_TRIGGER_ALWAYS - A trigger that is always asserted, causing the +//! sample sequence to capture repeatedly (so long as +//! there is not a higher priority source active). +//! +//! Note that not all trigger sources are available on all Stellaris family +//! members; consult the data sheet for the device in question to determine the +//! availability of triggers. +//! +//! The parameter \b ulPriority is a value between 0 and 3, where 0 represents +//! the highest priority and 3 the lowest. Note that when programming the +//! priority among a set of sample sequences, each must have unique priority; +//! it is up to the caller to guarantee the uniqueness of the priorities. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_sequenceconfigure) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCSequenceConfigure(unsigned long ulBase, unsigned long ulSequenceNum, + unsigned long ulTrigger, unsigned long ulPriority) +{ + // + // Check the arugments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + ASSERT((ulTrigger == ADC_TRIGGER_PROCESSOR) || + (ulTrigger == ADC_TRIGGER_COMP0) || + (ulTrigger == ADC_TRIGGER_COMP1) || + (ulTrigger == ADC_TRIGGER_COMP2) || + (ulTrigger == ADC_TRIGGER_EXTERNAL) || + (ulTrigger == ADC_TRIGGER_TIMER) || + (ulTrigger == ADC_TRIGGER_PWM0) || + (ulTrigger == ADC_TRIGGER_PWM1) || + (ulTrigger == ADC_TRIGGER_PWM2) || + (ulTrigger == ADC_TRIGGER_ALWAYS)); + ASSERT(ulPriority < 4); + + // + // Compute the shift for the bits that control this sample sequence. + // + ulSequenceNum *= 4; + + // + // Set the trigger event for this sample sequence. + // + HWREG(ulBase + ADC_O_EMUX) = ((HWREG(ulBase + ADC_O_EMUX) & + ~(0xf << ulSequenceNum)) | + ((ulTrigger & 0xf) << ulSequenceNum)); + + // + // Set the priority for this sample sequence. + // + HWREG(ulBase + ADC_O_SSPRI) = ((HWREG(ulBase + ADC_O_SSPRI) & + ~(0xf << ulSequenceNum)) | + ((ulPriority & 0x3) << ulSequenceNum)); +} +#endif + +//***************************************************************************** +// +//! Configure a step of the sample sequencer. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param ulStep is the step to be configured. +//! \param ulConfig is the configuration of this step; must be a logical OR of +//! \b ADC_CTL_TS, \b ADC_CTL_IE, \b ADC_CTL_END, \b ADC_CTL_D, and one of the +//! input channel selects (\b ADC_CTL_CH0 through \b ADC_CTL_CH7). +//! +//! This function will set the configuration of the ADC for one step of a +//! sample sequence. The ADC can be configured for single-ended or +//! differential operation (the \b ADC_CTL_D bit selects differential +//! operation when set), the channel to be sampled can be chosen (the +//! \b ADC_CTL_CH0 through \b ADC_CTL_CH7 values), and the internal temperature +//! sensor can be selected (the \b ADC_CTL_TS bit). Additionally, this step +//! can be defined as the last in the sequence (the \b ADC_CTL_END bit) and it +//! can be configured to cause an interrupt when the step is complete (the +//! \b ADC_CTL_IE bit). The configuration is used by the ADC at the +//! appropriate time when the trigger for this sequence occurs. +//! +//! The \b ulStep parameter determines the order in which the samples are +//! captured by the ADC when the trigger occurs. It can range from zero to +//! seven for the first sample sequence, from zero to three for the second and +//! third sample sequence, and can only be zero for the fourth sample sequence. +//! +//! Differential mode only works with adjacent channel pairs (e.g. 0 and 1). +//! The channel select must be the number of the channel pair to sample (e.g. +//! \b ADC_CTL_CH0 for 0 and 1, or \b ADC_CTL_CH1 for 2 and 3) or undefined +//! results will be returned by the ADC. Additionally, if differential mode is +//! selected when the temperature sensor is being sampled, undefined results +//! will be returned by the ADC. +//! +//! It is the responsibility of the caller to ensure that a valid configuration +//! is specified; this function does not check the validity of the specified +//! configuration. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_sequencestepconfigure) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +ADCSequenceStepConfigure(unsigned long ulBase, unsigned long ulSequenceNum, + unsigned long ulStep, unsigned long ulConfig) +{ + // + // Check the arugments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + ASSERT(((ulSequenceNum == 0) && (ulStep < 8)) || + ((ulSequenceNum == 1) && (ulStep < 4)) || + ((ulSequenceNum == 2) && (ulStep < 4)) || + ((ulSequenceNum == 3) && (ulStep < 1))); + + // + // Get the offset of the sequence to be configured. + // + ulBase += ADC_O_SEQ + (ADC_O_SEQ_STEP * ulSequenceNum); + + // + // Compute the shift for the bits that control this step. + // + ulStep *= 4; + + // + // Set the analog mux value for this step. + // + HWREG(ulBase + ADC_O_X_SSMUX) = ((HWREG(ulBase + ADC_O_X_SSMUX) & + ~(0x0000000f << ulStep)) | + ((ulConfig & 0x0f) << ulStep)); + + // + // Set the control value for this step. + // + HWREG(ulBase + ADC_O_X_SSCTL) = ((HWREG(ulBase + ADC_O_X_SSCTL) & + ~(0x0000000f << ulStep)) | + (((ulConfig & 0xf0) >> 4) << ulStep)); +} +#endif + +//***************************************************************************** +// +//! Determines if a sample sequence overflow occurred. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! This determines if a sample sequence overflow has occurred. This will +//! happen if the captured samples are not read from the FIFO before the next +//! trigger occurs. +//! +//! \return Returns zero if there was not an overflow, and non-zero if there +//! was. +// +//***************************************************************************** +#if defined(GROUP_sequenceoverflow) || defined(BUILD_ALL) || defined(DOXYGEN) +long +ADCSequenceOverflow(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Determine if there was an overflow on this sequence. + // + return(HWREG(ulBase + ADC_O_OSTAT) & (1 << ulSequenceNum)); +} +#endif + +//***************************************************************************** +// +//! Determines if a sample sequence underflow occurred. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! This determines if a sample sequence underflow has occurred. This will +//! happen if too many samples are read from the FIFO. +//! +//! \return Returns zero if there was not an underflow, and non-zero if there +//! was. +// +//***************************************************************************** +#if defined(GROUP_sequenceunderflow) || defined(BUILD_ALL) || defined(DOXYGEN) +long +ADCSequenceUnderflow(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Determine if there was an underflow on this sequence. + // + return(HWREG(ulBase + ADC_O_USTAT) & (1 << ulSequenceNum)); +} +#endif + +//***************************************************************************** +// +//! Gets the captured data for a sample sequence. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param pulBuffer is the address where the data is stored. +//! +//! This function copies data from the specified sample sequence output FIFO to +//! a memory resident buffer. The number of samples available in the hardware +//! FIFO are copied into the buffer, which is assumed to be large enough to +//! hold that many samples. This will only return the samples that are +//! presently available, which may not be the entire sample sequence if it is +//! in the process of being executed. +//! +//! \return Returns the number of samples copied to the buffer. +// +//***************************************************************************** +#if defined(GROUP_sequencedataget) || defined(BUILD_ALL) || defined(DOXYGEN) +long +ADCSequenceDataGet(unsigned long ulBase, unsigned long ulSequenceNum, + unsigned long *pulBuffer) +{ + unsigned long ulCount; + + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Get the offset of the sequence to be read. + // + ulBase += ADC_O_SEQ + (ADC_O_SEQ_STEP * ulSequenceNum); + + // + // Read samples from the FIFO until it is empty. + // + ulCount = 0; + while(!(HWREG(ulBase + ADC_O_X_SSFSTAT) & ADC_SSFSTAT_EMPTY) && + (ulCount < 8)) + { + // + // Read the FIFO and copy it to the destination. + // + *pulBuffer++ = HWREG(ulBase + ADC_O_X_SSFIFO); + + // + // Increment the count of samples read. + // + ulCount++; + } + + // + // Return the number of samples read. + // + return(ulCount); +} +#endif + +//***************************************************************************** +// +//! Causes a processor trigger for a sample sequence. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! +//! This function triggers a processor-initiated sample sequence if the sample +//! sequence trigger is configured to ADC_TRIGGER_PROCESSOR. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_processortrigger) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ADCProcessorTrigger(unsigned long ulBase, unsigned long ulSequenceNum) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 4); + + // + // Generate a processor trigger for this sample sequence. + // + HWREG(ulBase + ADC_O_PSSI) = 1 << ulSequenceNum; +} +#endif + +//***************************************************************************** +// +//! Configures the software oversampling factor of the ADC. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param ulFactor is the number of samples to be averaged. +//! +//! This function configures the software oversampling for the ADC, which can +//! be used to provide better resolution on the sampled data. Oversampling is +//! accomplished by averaging multiple samples from the same analog input. +//! Three different oversampling rates are supported; 2x, 4x, and 8x. +//! +//! Oversampling is only supported on the sample sequencers that are more than +//! one sample in depth (i.e. the fourth sample sequencer is not supported). +//! Oversampling by 2x (for example) divides the depth of the sample sequencer +//! by two; so 2x oversampling on the first sample sequencer can only provide +//! four samples per trigger. This also means that 8x oversampling is only +//! available on the first sample sequencer. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_softwareoversampleconfigure) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +ADCSoftwareOversampleConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulFactor) +{ + unsigned long ulValue; + + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 3); + ASSERT(((ulFactor == 2) || (ulFactor == 4) || (ulFactor == 8)) && + ((ulSequenceNum == 0) || (ulFactor != 8))); + + // + // Convert the oversampling factor to a shift factor. + // + for(ulValue = 0, ulFactor >>= 1; ulFactor; ulValue++, ulFactor >>= 1) + { + } + + // + // Save the sfiht factor. + // + g_pucOversampleFactor[ulSequenceNum] = ulValue; +} +#endif + +//***************************************************************************** +// +//! Configures a step of the software oversampled sequencer. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param ulStep is the step to be configured. +//! \param ulConfig is the configuration of this step. +//! +//! This function configures a step of the sample sequencer when using the +//! software oversampling feature. The number of steps available depends on +//! the oversampling factor set by ADCSoftwareOversampleConfigure(). The value +//! of \e ulConfig is the same as defined for ADCSequenceStepConfigure(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_softwareoversamplestepconfigure) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +ADCSoftwareOversampleStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig) +{ + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 3); + ASSERT(((ulSequenceNum == 0) && + (ulStep < (8 >> g_pucOversampleFactor[ulSequenceNum]))) || + (ulStep < (4 >> g_pucOversampleFactor[ulSequenceNum]))); + + // + // Get the offset of the sequence to be configured. + // + ulBase += ADC_O_SEQ + (ADC_O_SEQ_STEP * ulSequenceNum); + + // + // Compute the shift for the bits that control this step. + // + ulStep *= 4 << g_pucOversampleFactor[ulSequenceNum]; + + // + // Loop through the hardware steps that make up this step of the software + // oversampled sequence. + // + for(ulSequenceNum = 1 << g_pucOversampleFactor[ulSequenceNum]; + ulSequenceNum; ulSequenceNum--) + { + // + // Set the analog mux value for this step. + // + HWREG(ulBase + ADC_O_X_SSMUX) = ((HWREG(ulBase + ADC_O_X_SSMUX) & + ~(0x0000000f << ulStep)) | + ((ulConfig & 0x0f) << ulStep)); + + // + // Set the control value for this step. + // + HWREG(ulBase + ADC_O_X_SSCTL) = ((HWREG(ulBase + ADC_O_X_SSCTL) & + ~(0x0000000f << ulStep)) | + (((ulConfig & 0xf0) >> 4) << ulStep)); + if(ulSequenceNum != 1) + { + HWREG(ulBase + ADC_O_X_SSCTL) &= ~((ADC_SSCTL_IE0 | + ADC_SSCTL_END0) << ulStep); + } + + // + // Go to the next hardware step. + // + ulStep += 4; + } +} +#endif + +//***************************************************************************** +// +//! Gets the captured data for a sample sequence using software oversampling. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulSequenceNum is the sample sequence number. +//! \param pulBuffer is the address where the data is stored. +//! \param ulCount is the number of samples to be read. +//! +//! This function copies data from the specified sample sequence output FIFO to +//! a memory resident buffer with software oversampling applied. The requested +//! number of samples are copied into the data buffer; if there are not enough +//! samples in the hardware FIFO to satisfy this many oversampled data items +//! then incorrect results will be returned. It is the caller's responsibility +//! to read only the samples that are available and wait until enough data is +//! available, for example as a result of receiving an interrupt. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_softwareoversampledataget) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +ADCSoftwareOversampleDataGet(unsigned long ulBase, unsigned long ulSequenceNum, + unsigned long *pulBuffer, unsigned long ulCount) +{ + unsigned long ulIdx, ulAccum; + + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(ulSequenceNum < 3); + ASSERT(((ulSequenceNum == 0) && + (ulCount < (8 >> g_pucOversampleFactor[ulSequenceNum]))) || + (ulCount < (4 >> g_pucOversampleFactor[ulSequenceNum]))); + + // + // Get the offset of the sequence to be read. + // + ulBase += ADC_O_SEQ + (ADC_O_SEQ_STEP * ulSequenceNum); + + // + // Read the samples from the FIFO until it is empty. + // + while(ulCount--) + { + // + // Compute the sum of the samples. + // + ulAccum = 0; + for(ulIdx = 1 << g_pucOversampleFactor[ulSequenceNum]; ulIdx; ulIdx--) + { + // + // Read the FIFO and add it to the accumulator. + // + ulAccum += HWREG(ulBase + ADC_O_X_SSFIFO); + } + + // + // Write the averaged sample to the output buffer. + // + *pulBuffer++ = ulAccum >> g_pucOversampleFactor[ulSequenceNum]; + } +} +#endif + +//***************************************************************************** +// +//! Configures the hardware oversampling factor of the ADC. +//! +//! \param ulBase is the base address of the ADC module. +//! \param ulFactor is the number of samples to be averaged. +//! +//! This function configures the hardware oversampling for the ADC, which can +//! be used to provide better resolution on the sampled data. Oversampling is +//! accomplished by averaging multiple samples from the same analog input. Six +//! different oversampling rates are supported; 2x, 4x, 8x, 16x, 32x, and 64x. +//! Specifying an oversampling factor of zero will disable the hardware +//! oversampler. +//! +//! Hardware oversampling applies uniformly to all sample sequencers. It does +//! not reduce the depth of the sample sequencers like the software +//! oversampling APIs; each sample written into the sample sequence FIFO is a +//! fully oversampled analog input reading. +//! +//! Enabling hardware averaging increases the precision of the ADC at the cost +//! of throughput. For example, enabling 4x oversampling reduces the +//! throughput of a 250 KSps ADC to 62.5 KSps. +//! +//! \note Hardware oversampling is available beginning with Rev C0 of the +//! Stellaris microcontroller. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_hardwareoversampleconfigure) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +ADCHardwareOversampleConfigure(unsigned long ulBase, + unsigned long ulFactor) +{ + unsigned long ulValue; + + // + // Check the arguments. + // + ASSERT(ulBase == ADC_BASE); + ASSERT(((ulFactor == 0) || (ulFactor == 2) || (ulFactor == 4) || + (ulFactor == 8) || (ulFactor == 16) || (ulFactor == 32) || + (ulFactor == 64))); + + // + // Convert the oversampling factor to a shift factor. + // + for(ulValue = 0, ulFactor >>= 1; ulFactor; ulValue++, ulFactor >>= 1) + { + } + + // + // Write the shift factor to the ADC to configure the hardware oversampler. + // + HWREG(ulBase + ADC_O_SAC) = ulValue; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/adc.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/adc.h new file mode 100644 index 0000000..c1fa37d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/adc.h @@ -0,0 +1,126 @@ +//***************************************************************************** +// +// adc.h - ADC headers for using the ADC driver functions. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __ADC_H__ +#define __ADC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceConfigure as the ulTrigger +// parameter. +// +//***************************************************************************** +#define ADC_TRIGGER_PROCESSOR 0x00000000 // Processor event +#define ADC_TRIGGER_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_TRIGGER_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_TRIGGER_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_TRIGGER_EXTERNAL 0x00000004 // External event +#define ADC_TRIGGER_TIMER 0x00000005 // Timer event +#define ADC_TRIGGER_PWM0 0x00000006 // PWM0 event +#define ADC_TRIGGER_PWM1 0x00000007 // PWM1 event +#define ADC_TRIGGER_PWM2 0x00000008 // PWM2 event +#define ADC_TRIGGER_ALWAYS 0x0000000F // Always event + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceStepConfigure as the ulConfig +// parameter. +// +//***************************************************************************** +#define ADC_CTL_TS 0x00000080 // Temperature sensor select +#define ADC_CTL_IE 0x00000040 // Interrupt enable +#define ADC_CTL_END 0x00000020 // Sequence end select +#define ADC_CTL_D 0x00000010 // Differential select +#define ADC_CTL_CH0 0x00000000 // Input channel 0 +#define ADC_CTL_CH1 0x00000001 // Input channel 1 +#define ADC_CTL_CH2 0x00000002 // Input channel 2 +#define ADC_CTL_CH3 0x00000003 // Input channel 3 +#define ADC_CTL_CH4 0x00000004 // Input channel 4 +#define ADC_CTL_CH5 0x00000005 // Input channel 5 +#define ADC_CTL_CH6 0x00000006 // Input channel 6 +#define ADC_CTL_CH7 0x00000007 // Input channel 7 + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ADCIntRegister(unsigned long ulBase, unsigned long ulSequenceNum, + void (*pfnHandler)(void)); +extern void ADCIntUnregister(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCIntDisable(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCIntEnable(unsigned long ulBase, unsigned long ulSequenceNum); +extern unsigned long ADCIntStatus(unsigned long ulBase, + unsigned long ulSequenceNum, + tBoolean bMasked); +extern void ADCIntClear(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCSequenceEnable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceDisable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulTrigger, + unsigned long ulPriority); +extern void ADCSequenceStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern long ADCSequenceOverflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceUnderflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer); +extern void ADCProcessorTrigger(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSoftwareOversampleConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulFactor); +extern void ADCSoftwareOversampleStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern void ADCSoftwareOversampleDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer, + unsigned long ulCount); +extern void ADCHardwareOversampleConfigure(unsigned long ulBase, + unsigned long ulFactor); + +#ifdef __cplusplus +} +#endif + +#endif // __ADC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/comp.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/comp.c new file mode 100644 index 0000000..aed156e --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/comp.c @@ -0,0 +1,448 @@ +//***************************************************************************** +// +// comp.c - Driver for the analog comparator. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup comp_api +//! @{ +// +//***************************************************************************** + +#include "../hw_comp.h" +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_types.h" +#include "comp.h" +#include "debug.h" +#include "interrupt.h" + +//***************************************************************************** +// +//! Configures a comparator. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator to configure. +//! \param ulConfig is the configuration of the comparator. +//! +//! This function will configure a comparator. The \e ulConfig parameter is +//! the result of a logical OR operation between the \b COMP_TRIG_xxx, +//! \b COMP_INT_xxx, \b COMP_ASRCP_xxx, and \b COMP_OUTPUT_xxx values. +//! +//! The \b COMP_TRIG_xxx term can take on the following values: +//! +//! - \b COMP_TRIG_NONE to have no trigger to the ADC. +//! - \b COMP_TRIG_HIGH to trigger the ADC when the comparator output is high. +//! - \b COMP_TRIG_LOW to trigger the ADC when the comparator output is low. +//! - \b COMP_TRIG_FALL to trigger the ADC when the comparator output goes low. +//! - \b COMP_TRIG_RISE to trigger the ADC when the comparator output goes +//! high. +//! - \b COMP_TRIG_BOTH to trigger the ADC when the comparator output goes low +//! or high. +//! +//! The \b COMP_INT_xxx term can take on the following values: +//! +//! - \b COMP_INT_HIGH to generate an interrupt when the comparator output is +//! high. +//! - \b COMP_INT_LOW to generate an interrupt when the comparator output is +//! low. +//! - \b COMP_INT_FALL to generate an interrupt when the comparator output goes +//! low. +//! - \b COMP_INT_RISE to generate an interrupt when the comparator output goes +//! high. +//! - \b COMP_INT_BOTH to generate an interrupt when the comparator output goes +//! low or high. +//! +//! The \b COMP_ASRCP_xxx term can take on the following values: +//! +//! - \b COMP_ASRCP_PIN to use the dedicated Comp+ pin as the reference +//! voltage. +//! - \b COMP_ASRCP_PIN0 to use the Comp0+ pin as the reference voltage (this +//! the same as \b COMP_ASRCP_PIN for the comparator 0). +//! - \b COMP_ASRCP_REF to use the internally generated voltage as the +//! reference voltage. +//! +//! The \b COMP_OUTPUT_xxx term can take on the following values: +//! +//! - \b COMP_OUTPUT_NONE to disable the output from the comparator to a device +//! pin. +//! - \b COMP_OUTPUT_NORMAL to enable a non-inverted output from the comparator +//! to a device pin. +//! - \b COMP_OUTPUT_INVERT to enable an inverted output from the comparator to +//! a device pin. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_configure) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorConfigure(unsigned long ulBase, unsigned long ulComp, + unsigned long ulConfig) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Configure this comparator. + // + HWREG(ulBase + (ulComp * 0x20) + COMP_O_ACCTL0) = ulConfig; +} +#endif + +//***************************************************************************** +// +//! Sets the internal reference voltage. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulRef is the desired reference voltage. +//! +//! This function will set the internal reference voltage value. The voltage +//! is specified as one of the following values: +//! +//! - \b COMP_REF_OFF to turn off the reference voltage +//! - \b COMP_REF_0V to set the reference voltage to 0 V +//! - \b COMP_REF_0_1375V to set the reference voltage to 0.1375 V +//! - \b COMP_REF_0_275V to set the reference voltage to 0.275 V +//! - \b COMP_REF_0_4125V to set the reference voltage to 0.4125 V +//! - \b COMP_REF_0_55V to set the reference voltage to 0.55 V +//! - \b COMP_REF_0_6875V to set the reference voltage to 0.6875 V +//! - \b COMP_REF_0_825V to set the reference voltage to 0.825 V +//! - \b COMP_REF_0_928125V to set the reference voltage to 0.928125 V +//! - \b COMP_REF_0_9625V to set the reference voltage to 0.9625 V +//! - \b COMP_REF_1_03125V to set the reference voltage to 1.03125 V +//! - \b COMP_REF_1_134375V to set the reference voltage to 1.134375 V +//! - \b COMP_REF_1_1V to set the reference voltage to 1.1 V +//! - \b COMP_REF_1_2375V to set the reference voltage to 1.2375 V +//! - \b COMP_REF_1_340625V to set the reference voltage to 1.340625 V +//! - \b COMP_REF_1_375V to set the reference voltage to 1.375 V +//! - \b COMP_REF_1_44375V to set the reference voltage to 1.44375 V +//! - \b COMP_REF_1_5125V to set the reference voltage to 1.5125 V +//! - \b COMP_REF_1_546875V to set the reference voltage to 1.546875 V +//! - \b COMP_REF_1_65V to set the reference voltage to 1.65 V +//! - \b COMP_REF_1_753125V to set the reference voltage to 1.753125 V +//! - \b COMP_REF_1_7875V to set the reference voltage to 1.7875 V +//! - \b COMP_REF_1_85625V to set the reference voltage to 1.85625 V +//! - \b COMP_REF_1_925V to set the reference voltage to 1.925 V +//! - \b COMP_REF_1_959375V to set the reference voltage to 1.959375 V +//! - \b COMP_REF_2_0625V to set the reference voltage to 2.0625 V +//! - \b COMP_REF_2_165625V to set the reference voltage to 2.165625 V +//! - \b COMP_REF_2_26875V to set the reference voltage to 2.26875 V +//! - \b COMP_REF_2_371875V to set the reference voltage to 2.371875 V +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_refset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorRefSet(unsigned long ulBase, unsigned long ulRef) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + + // + // Set the voltage reference voltage as requested. + // + HWREG(ulBase + COMP_O_REFCTL) = ulRef; +} +#endif + +//***************************************************************************** +// +//! Gets the current comparator output value. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! +//! This function retrieves the current value of the comparator output. +//! +//! \return Returns \b true if the comparator output is high and \b false if +//! the comparator output is low. +// +//***************************************************************************** +#if defined(GROUP_valueget) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +ComparatorValueGet(unsigned long ulBase, unsigned long ulComp) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Return the appropriate value based on the comparator's present output + // value. + // + if(HWREG(ulBase + (ulComp * 0x20) + COMP_O_ACSTAT0) & COMP_ACSTAT_OVAL) + { + return(true); + } + else + { + return(false); + } +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the comparator interrupt. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! \param pfnHandler is a pointer to the function to be called when the +//! comparator interrupt occurs. +//! +//! This sets the handler to be called when the comparator interrupt occurs. +//! This will enable the interrupt in the interrupt controller; it is the +//! interrupt-handler's responsibility to clear the interrupt source via +//! ComparatorIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorIntRegister(unsigned long ulBase, unsigned long ulComp, + void (*pfnHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(INT_COMP0 + ulComp, pfnHandler); + + // + // Enable the interrupt in the interrupt controller. + // + IntEnable(INT_COMP0 + ulComp); + + // + // Enable the comparator interrupt. + // + HWREG(ulBase + COMP_O_INTEN) |= 1 << ulComp; +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for a comparator interrupt. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! +//! This function will clear the handler to be called when a comparator +//! interrupt occurs. This will also mask off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorIntUnregister(unsigned long ulBase, unsigned long ulComp) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Disable the comparator interrupt. + // + HWREG(ulBase + COMP_O_INTEN) &= ~(1 << ulComp); + + // + // Disable the interrupt in the interrupt controller. + // + IntDisable(INT_COMP0 + ulComp); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_COMP0 + ulComp); +} +#endif + +//***************************************************************************** +// +//! Enables the comparator interrupt. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! +//! This function enables generation of an interrupt from the specified +//! comparator. Only comparators whose interrupts are enabled can be reflected +//! to the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorIntEnable(unsigned long ulBase, unsigned long ulComp) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Enable the comparator interrupt. + // + HWREG(ulBase + COMP_O_INTEN) |= 1 << ulComp; +} +#endif + +//***************************************************************************** +// +//! Disables the comparator interrupt. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! +//! This function disables generation of an interrupt from the specified +//! comparator. Only comparators whose interrupts are enabled can be reflected +//! to the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorIntDisable(unsigned long ulBase, unsigned long ulComp) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Disable the comparator interrupt. + // + HWREG(ulBase + COMP_O_INTEN) &= ~(1 << ulComp); +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! \param bMasked is \b false if the raw interrupt status is required and +//! \b true if the masked interrupt status is required. +//! +//! This returns the interrupt status for the comparator. Either the raw or +//! the masked interrupt status can be returned. +//! +//! \return \b true if the interrupt is asserted and \b false if it is not +//! asserted. +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +ComparatorIntStatus(unsigned long ulBase, unsigned long ulComp, + tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(((HWREG(ulBase + COMP_O_MIS) >> ulComp) & 1) ? true : false); + } + else + { + return(((HWREG(ulBase + COMP_O_RIS) >> ulComp) & 1) ? true : false); + } +} +#endif + +//***************************************************************************** +// +//! Clears a comparator interrupt. +//! +//! \param ulBase is the base address of the comparator module. +//! \param ulComp is the index of the comparator. +//! +//! The comparator interrupt is cleared, so that it no longer asserts. This +//! must be done in the interrupt handler to keep it from being called again +//! immediately upon exit. Note that for a level triggered interrupt, the +//! interrupt cannot be cleared until it stops asserting. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +ComparatorIntClear(unsigned long ulBase, unsigned long ulComp) +{ + // + // Check the arguments. + // + ASSERT(ulBase == COMP_BASE); + ASSERT(ulComp < 3); + + // + // Clear the interrupt. + // + HWREG(ulBase + COMP_O_MIS) = 1 << ulComp; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/comp.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/comp.h new file mode 100644 index 0000000..9349982 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/comp.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// comp.h - Prototypes for the analog comparator driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __COMP_H__ +#define __COMP_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ComparatorConfigure() as the ulConfig +// parameter. For each group (i.e. COMP_TRIG_xxx, COMP_INT_xxx, etc.), one of +// the values may be selected and ORed together will values from the other +// groups. +// +//***************************************************************************** +#define COMP_TRIG_NONE 0x00000000 // No ADC trigger +#define COMP_TRIG_HIGH 0x00000880 // Trigger when high +#define COMP_TRIG_LOW 0x00000800 // Trigger when low +#define COMP_TRIG_FALL 0x00000820 // Trigger on falling edge +#define COMP_TRIG_RISE 0x00000840 // Trigger on rising edge +#define COMP_TRIG_BOTH 0x00000860 // Trigger on both edges +#define COMP_INT_HIGH 0x00000010 // Interrupt when high +#define COMP_INT_LOW 0x00000000 // Interrupt when low +#define COMP_INT_FALL 0x00000004 // Interrupt on falling edge +#define COMP_INT_RISE 0x00000008 // Interrupt on rising edge +#define COMP_INT_BOTH 0x0000000C // Interrupt on both edges +#define COMP_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_OUTPUT_NONE 0x00000000 // No comparator output +#define COMP_OUTPUT_NORMAL 0x00000100 // Comparator output normal +#define COMP_OUTPUT_INVERT 0x00000102 // Comparator output inverted + +//***************************************************************************** +// +// Values that can be passed to ComparatorSetRef() as the ulRef parameter. +// +//***************************************************************************** +#define COMP_REF_OFF 0x00000000 // Turn off the internal reference +#define COMP_REF_0V 0x00000300 // Internal reference of 0V +#define COMP_REF_0_1375V 0x00000301 // Internal reference of 0.1375V +#define COMP_REF_0_275V 0x00000302 // Internal reference of 0.275V +#define COMP_REF_0_4125V 0x00000303 // Internal reference of 0.4125V +#define COMP_REF_0_55V 0x00000304 // Internal reference of 0.55V +#define COMP_REF_0_6875V 0x00000305 // Internal reference of 0.6875V +#define COMP_REF_0_825V 0x00000306 // Internal reference of 0.825V +#define COMP_REF_0_928125V 0x00000201 // Internal reference of 0.928125V +#define COMP_REF_0_9625V 0x00000307 // Internal reference of 0.9625V +#define COMP_REF_1_03125V 0x00000202 // Internal reference of 1.03125V +#define COMP_REF_1_134375V 0x00000203 // Internal reference of 1.134375V +#define COMP_REF_1_1V 0x00000308 // Internal reference of 1.1V +#define COMP_REF_1_2375V 0x00000309 // Internal reference of 1.2375V +#define COMP_REF_1_340625V 0x00000205 // Internal reference of 1.340625V +#define COMP_REF_1_375V 0x0000030A // Internal reference of 1.375V +#define COMP_REF_1_44375V 0x00000206 // Internal reference of 1.44375V +#define COMP_REF_1_5125V 0x0000030B // Internal reference of 1.5125V +#define COMP_REF_1_546875V 0x00000207 // Internal reference of 1.546875V +#define COMP_REF_1_65V 0x0000030C // Internal reference of 1.65V +#define COMP_REF_1_753125V 0x00000209 // Internal reference of 1.753125V +#define COMP_REF_1_7875V 0x0000030D // Internal reference of 1.7875V +#define COMP_REF_1_85625V 0x0000020A // Internal reference of 1.85625V +#define COMP_REF_1_925V 0x0000030E // Internal reference of 1.925V +#define COMP_REF_1_959375V 0x0000020B // Internal reference of 1.959375V +#define COMP_REF_2_0625V 0x0000030F // Internal reference of 2.0625V +#define COMP_REF_2_165625V 0x0000020D // Internal reference of 2.165625V +#define COMP_REF_2_26875V 0x0000020E // Internal reference of 2.26875V +#define COMP_REF_2_371875V 0x0000020F // Internal reference of 2.371875V + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ComparatorConfigure(unsigned long ulBase, unsigned long ulComp, + unsigned long ulConfig); +extern void ComparatorRefSet(unsigned long ulBase, unsigned long ulRef); +extern tBoolean ComparatorValueGet(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntRegister(unsigned long ulBase, unsigned long ulComp, + void (*pfnHandler)(void)); +extern void ComparatorIntUnregister(unsigned long ulBase, + unsigned long ulComp); +extern void ComparatorIntEnable(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntDisable(unsigned long ulBase, unsigned long ulComp); +extern tBoolean ComparatorIntStatus(unsigned long ulBase, unsigned long ulComp, + tBoolean bMasked); +extern void ComparatorIntClear(unsigned long ulBase, unsigned long ulComp); + +#ifdef __cplusplus +} +#endif + +#endif // __COMP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/cpu.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/cpu.h new file mode 100644 index 0000000..688c522 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/cpu.h @@ -0,0 +1,40 @@ +//***************************************************************************** +// +// cpu.h - Prototypes for the CPU instruction wrapper functions. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __CPU_H__ +#define __CPU_H__ + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern void CPUcpsid(void); +extern void CPUcpsie(void); +extern void CPUwfi(void); + +#endif // __CPU_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/debug.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/debug.h new file mode 100644 index 0000000..e46e2a7 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/debug.h @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// debug.h - Macros for assisting debug of the driver library. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +//***************************************************************************** +// +// Prototype for the function that is called when an invalid argument is passed +// to an API. This is only used when doing a DEBUG build. +// +//***************************************************************************** +extern void __error__(char *pcFilename, unsigned long ulLine); + +//***************************************************************************** +// +// The ASSERT macro, which does the actual assertion checking. Typically, this +// will be for procedure arguments. +// +//***************************************************************************** +#ifdef DEBUG +#define ASSERT(expr) { \ + if(!(expr)) \ + { \ + __error__(__FILE__, __LINE__); \ + } \ + } +#else +#define ASSERT(expr) +#endif + +#endif // __DEBUG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/driverlib.r79 b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/driverlib.r79 new file mode 100644 index 0000000..0d2184f Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/driverlib.r79 differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/flash.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/flash.c new file mode 100644 index 0000000..ab7335f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/flash.c @@ -0,0 +1,668 @@ +//***************************************************************************** +// +// flash.c - Driver for programming the on-chip flash. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup flash_api +//! @{ +// +//***************************************************************************** + +#include "../hw_flash.h" +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_sysctl.h" +#include "../hw_types.h" +#include "debug.h" +#include "flash.h" +#include "interrupt.h" + +//***************************************************************************** +// +//! Gets the number of processor clocks per micro-second. +//! +//! This function returns the number of clocks per micro-second, as presently +//! known by the flash controller. +//! +//! \return Returns the number of processor clocks per micro-second. +// +//***************************************************************************** +#if defined(GROUP_usecget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +FlashUsecGet(void) +{ + // + // Return the number of clocks per micro-second. + // + return(HWREG(FLASH_USECRL) + 1); +} +#endif + +//***************************************************************************** +// +//! Sets the number of processor clocks per micro-second. +//! +//! \param ulClocks is the number of processor clocks per micro-second. +//! +//! This function is used to tell the flash controller the number of processor +//! clocks per micro-second. This value must be programmed correctly or the +//! flash most likely will not program correctly; it has no affect on reading +//! flash. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_usecset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +FlashUsecSet(unsigned long ulClocks) +{ + // + // Set the number of clocks per micro-second. + // + HWREG(FLASH_USECRL) = ulClocks - 1; +} +#endif + +//***************************************************************************** +// +//! Erases a block of flash. +//! +//! \param ulAddress is the start address of the flash block to be erased. +//! +//! This function will erase a 1 kB block of the on-chip flash. After erasing, +//! the block will be filled with 0xFF bytes. Read-only and execute-only +//! blocks cannot be erased. +//! +//! This function will not return until the block has been erased. +//! +//! \return Returns 0 on success, or -1 if an invalid block address was +//! specified or the block is write-protected. +// +//***************************************************************************** +#if defined(GROUP_erase) || defined(BUILD_ALL) || defined(DOXYGEN) +long +FlashErase(unsigned long ulAddress) +{ + // + // Check the arguments. + // + ASSERT(!(ulAddress & (FLASH_ERASE_SIZE - 1))); + + // + // Clear the flash access interrupt. + // + HWREG(FLASH_FCMISC) = FLASH_FCMISC_ACCESS; + + // + // Erase the block. + // + HWREG(FLASH_FMA) = ulAddress; + HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_ERASE; + + // + // Wait until the word has been programmed. + // + while(HWREG(FLASH_FMC) & FLASH_FMC_ERASE) + { + } + + // + // Return an error if an access violation occurred. + // + if(HWREG(FLASH_FCRIS) & FLASH_FCRIS_ACCESS) + { + return(-1); + } + + // + // Success. + // + return(0); +} +#endif + +//***************************************************************************** +// +//! Programs flash. +//! +//! \param pulData is a pointer to the data to be programmed. +//! \param ulAddress is the starting address in flash to be programmed. Must +//! be a multiple of four. +//! \param ulCount is the number of bytes to be programmed. Must be a multiple +//! of four. +//! +//! This function will program a sequence of words into the on-chip flash. +//! Programming each location consists of the result of an AND operation +//! of the new data and the existing data; in other words bits that contain +//! 1 can remain 1 or be changed to 0, but bits that are 0 cannot be changed +//! to 1. Therefore, a word can be programmed multiple times as long as these +//! rules are followed; if a program operation attempts to change a 0 bit to +//! a 1 bit, that bit will not have its value changed. +//! +//! Since the flash is programmed one word at a time, the starting address and +//! byte count must both be multiples of four. It is up to the caller to +//! verify the programmed contents, if such verification is required. +//! +//! This function will not return until the data has been programmed. +//! +//! \return Returns 0 on success, or -1 if a programming error is encountered. +// +//***************************************************************************** +#if defined(GROUP_program) || defined(BUILD_ALL) || defined(DOXYGEN) +long +FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount) +{ + // + // Check the arguments. + // + ASSERT(!(ulAddress & 3)); + ASSERT(!(ulCount & 3)); + + // + // Clear the flash access interrupt. + // + HWREG(FLASH_FCMISC) = FLASH_FCMISC_ACCESS; + + // + // Loop over the words to be programmed. + // + while(ulCount) + { + // + // Program the next word. + // + HWREG(FLASH_FMA) = ulAddress; + HWREG(FLASH_FMD) = *pulData; + HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_WRITE; + + // + // Wait until the word has been programmed. + // + while(HWREG(FLASH_FMC) & FLASH_FMC_WRITE) + { + } + + // + // Increment to the next word. + // + pulData++; + ulAddress += 4; + ulCount -= 4; + } + + // + // Return an error if an access violation occurred. + // + if(HWREG(FLASH_FCRIS) & FLASH_FCRIS_ACCESS) + { + return(-1); + } + + // + // Success. + // + return(0); +} +#endif + +//***************************************************************************** +// +//! Gets the protection setting for a block of flash. +//! +//! \param ulAddress is the start address of the flash block to be queried. +//! +//! This function will get the current protection for the specified 2 kB block +//! of flash. Each block can be read/write, read-only, or execute-only. +//! Read/write blocks can be read, executed, erased, and programmed. Read-only +//! blocks can be read and executed. Execute-only blocks can only be executed; +//! processor and debugger data reads are not allowed. +//! +//! \return Returns the protection setting for this block. See +//! FlashProtectSet() for possible values. +// +//***************************************************************************** +#if defined(GROUP_protectget) || defined(BUILD_ALL) || defined(DOXYGEN) +tFlashProtection +FlashProtectGet(unsigned long ulAddress) +{ + unsigned long ulFMPRE, ulFMPPE; + + // + // Check the argument. + // + ASSERT(!(ulAddress & (FLASH_PROTECT_SIZE - 1))); + + // + // Read the flash protection register and get the bits that apply to the + // specified block. + // + ulFMPRE = HWREG(FLASH_FMPRE); + ulFMPPE = HWREG(FLASH_FMPPE); + switch((((ulFMPRE >> (ulAddress / FLASH_PROTECT_SIZE)) & + FLASH_FMP_BLOCK_0) << 1) | + ((ulFMPPE >> (ulAddress / FLASH_PROTECT_SIZE)) & FLASH_FMP_BLOCK_0)) + { + // + // This block is marked as execute only (i.e. it can not be erased or + // programmed, and the only reads allowed are via the instruction fecth + // interface). + // + case 0: + case 1: + { + return(FlashExecuteOnly); + } + + // + // This block is marked as read only (i.e. it can not be erased or + // programmed). + // + case 2: + { + return(FlashReadOnly); + } + + // + // This block is read/write; it can be read, erased, and programmed. + // + case 3: + default: + { + return(FlashReadWrite); + } + } +} +#endif + +//***************************************************************************** +// +//! Sets the protection setting for a block of flash. +//! +//! \param ulAddress is the start address of the flash block to be protected. +//! \param eProtect is the protection to be applied to the block. Can be one +//! of \b FlashReadWrite, \b FlashReadOnly, or \b FlashExecuteOnly. +//! +//! This function will set the protection for the specified 2 kB block of +//! flash. Blocks which are read/write can be made read-only or execute-only. +//! Blocks which are read-only can be made execute-only. Blocks which are +//! execute-only cannot have their protection modified. Attempts to make the +//! block protection less stringent (i.e. read-only to read/write) will result +//! in a failure (and be prevented by the hardware). +//! +//! Changes to the flash protection are maintained only until the next reset. +//! This allows the application to be executed in the desired flash protection +//! environment to check for inappropriate flash access (via the flash +//! interrupt). To make the flash protection permanent, use the +//! FlashProtectSave() function. +//! +//! \return Returns 0 on success, or -1 if an invalid address or an invalid +//! protection was specified. +// +//***************************************************************************** +#if defined(GROUP_protectset) || defined(BUILD_ALL) || defined(DOXYGEN) +long +FlashProtectSet(unsigned long ulAddress, tFlashProtection eProtect) +{ + unsigned long ulProtectRE, ulProtectPE; + + // + // Check the argument. + // + ASSERT(!(ulAddress & (FLASH_PROTECT_SIZE - 1))); + ASSERT((eProtect == FlashReadWrite) || (eProtect == FlashReadOnly) || + (eProtect == FlashExecuteOnly)); + + // + // Convert the address into a block number. + // + ulAddress /= FLASH_PROTECT_SIZE; + + // + // Get the current protection. + // + ulProtectRE = HWREG(FLASH_FMPRE); + ulProtectPE = HWREG(FLASH_FMPPE); + + // + // Set the protection based on the requested proection. + // + switch(eProtect) + { + // + // Make this block execute only. + // + case FlashExecuteOnly: + { + // + // Turn off the read and program bits for this block. + // + ulProtectRE &= ~(FLASH_FMP_BLOCK_0 << ulAddress); + ulProtectPE &= ~(FLASH_FMP_BLOCK_0 << ulAddress); + + // + // We're done handling this protection. + // + break; + } + + // + // Make this block read only. + // + case FlashReadOnly: + { + // + // The block can not be made read only if it is execute only. + // + if(((ulProtectRE >> ulAddress) & FLASH_FMP_BLOCK_0) != + FLASH_FMP_BLOCK_0) + { + return(-1); + } + + // + // Make this block read only. + // + ulProtectPE &= ~(FLASH_FMP_BLOCK_0 << ulAddress); + + // + // We're done handling this protection. + // + break; + } + + // + // Make this block read/write. + // + case FlashReadWrite: + default: + { + // + // The block can not be made read/write if it is not already + // read/write. + // + if((((ulProtectRE >> ulAddress) & FLASH_FMP_BLOCK_0) != + FLASH_FMP_BLOCK_0) || + (((ulProtectPE >> ulAddress) & FLASH_FMP_BLOCK_0) != + FLASH_FMP_BLOCK_0)) + { + return(-1); + } + + // + // The block is already read/write, so there is nothing to do. + // + return(0); + } + } + + // + // Set the new protection. + // + HWREG(FLASH_FMPRE) = ulProtectRE; + HWREG(FLASH_FMPPE) = ulProtectPE; + + // + // Success. + // + return(0); +} +#endif + +//***************************************************************************** +// +//! Saves the flash protection settings. +//! +//! This function will make the currently programmed flash protection settings +//! permanent. This is a non-reversible operation; a chip reset or power cycle +//! will not change the flash protection. +//! +//! This function will not return until the protection has been saved. +//! +//! \return Returns 0 on success, or -1 if a hardware error is encountered. +// +//***************************************************************************** +#if defined(GROUP_protectsave) || defined(BUILD_ALL) || defined(DOXYGEN) +long +FlashProtectSave(void) +{ + // + // Tell the flash controller to write the flash read protection register. + // + HWREG(FLASH_FMA) = 0; + HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT; + + // + // Wait until the write has completed. + // + while(HWREG(FLASH_FMC) & FLASH_FMC_COMT) + { + } + + // + // Tell the flash controller to write the flash program protection + // register. + // + HWREG(FLASH_FMA) = 1; + HWREG(FLASH_FMC) = FLASH_FMC_WRKEY | FLASH_FMC_COMT; + + // + // Wait until the write has completed. + // + while(HWREG(FLASH_FMC) & FLASH_FMC_COMT) + { + } + + // + // Success. + // + return(0); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the flash interrupt. +//! +//! \param pfnHandler is a pointer to the function to be called when the flash +//! interrupt occurs. +//! +//! This sets the handler to be called when the flash interrupt occurs. The +//! flash controller can generate an interrupt when an invalid flash access +//! occurs, such as trying to program or erase a read-only block, or trying to +//! read from an execute-only block. It can also generate an interrupt when a +//! program or erase operation has completed. The interrupt will be +//! automatically enabled when the handler is registered. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +FlashIntRegister(void (*pfnHandler)(void)) +{ + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(INT_FLASH, pfnHandler); + + // + // Enable the flash interrupt. + // + IntEnable(INT_FLASH); +} +#endif + +//***************************************************************************** +// +//! Unregisters the interrupt handler for the flash interrupt. +//! +//! This function will clear the handler to be called when the flash interrupt +//! occurs. This will also mask off the interrupt in the interrupt controller +//! so that the interrupt handler is no longer called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +FlashIntUnregister(void) +{ + // + // Disable the interrupt. + // + IntDisable(INT_FLASH); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_FLASH); +} +#endif + +//***************************************************************************** +// +//! Enables individual flash controller interrupt sources. +//! +//! \param ulIntFlags is a bit mask of the interrupt sources to be enabled. +//! Can be any of the \b FLASH_FCIM_PROGRAM or \b FLASH_FCIM_ACCESS values. +//! +//! Enables the indicated flash controller interrupt sources. Only the sources +//! that are enabled can be reflected to the processor interrupt; disabled +//! sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +FlashIntEnable(unsigned long ulIntFlags) +{ + // + // Enable the specified interrupts. + // + HWREG(FLASH_FCIM) |= ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Disables individual flash controller interrupt sources. +//! +//! \param ulIntFlags is a bit mask of the interrupt sources to be disabled. +//! Can be any of the \b FLASH_FCIM_PROGRAM or \b FLASH_FCIM_ACCESS values. +//! +//! Disables the indicated flash controller interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt; +//! disabled sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +FlashIntDisable(unsigned long ulIntFlags) +{ + // + // Disable the specified interrupts. + // + HWREG(FLASH_FCIM) &= ~(ulIntFlags); +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param bMasked is false if the raw interrupt status is required and true if +//! the masked interrupt status is required. +//! +//! This returns the interrupt status for the flash controller. Either the raw +//! interrupt status or the status of interrupts that are allowed to reflect to +//! the processor can be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! \b FLASH_FCMISC_PROGRAM and \b FLASH_FCMISC_ACCESS. +// +//***************************************************************************** +#if defined(GROUP_intgetstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +FlashIntGetStatus(tBoolean bMasked) +{ + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(FLASH_FCMISC)); + } + else + { + return(HWREG(FLASH_FCRIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears flash controller interrupt sources. +//! +//! \param ulIntFlags is the bit mask of the interrupt sources to be cleared. +//! Can be any of the \b FLASH_FCMISC_PROGRAM or \b FLASH_FCMISC_ACCESS +//! values. +//! +//! The specified flash controller interrupt sources are cleared, so that they +//! no longer assert. This must be done in the interrupt handler to keep it +//! from being called again immediately upon exit. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +FlashIntClear(unsigned long ulIntFlags) +{ + // + // Clear the flash interrupt. + // + HWREG(FLASH_FCMISC) = ulIntFlags; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/flash.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/flash.h new file mode 100644 index 0000000..9c41dda --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/flash.h @@ -0,0 +1,75 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/gpio.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/gpio.c new file mode 100644 index 0000000..a49602e --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/gpio.c @@ -0,0 +1,1103 @@ +//***************************************************************************** +// +// gpio.c - API for GPIO ports +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup gpio_api +//! @{ +// +//***************************************************************************** + +#include "../hw_gpio.h" +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "interrupt.h" + +//***************************************************************************** +// +//! \internal +//! Get GPIO interrupt number. +//! +//! \param ulPort base address of the selected GPIO port +//! +//! Given a GPIO base address, returns the corresponding interrupt number. +//! +//! \return Returns a GPIO interrupt number, or -1 if \e ulPort is invalid. +// +//***************************************************************************** +#if defined(GROUP_getintnumber) || defined(BUILD_ALL) +long +GPIOGetIntNumber(unsigned long ulPort) +{ + unsigned int ulInt; + + // + // Determine the GPIO interrupt number for the given module. + // + switch(ulPort) + { + case GPIO_PORTA_BASE: + { + ulInt = INT_GPIOA; + break; + } + + case GPIO_PORTB_BASE: + { + ulInt = INT_GPIOB; + break; + } + + case GPIO_PORTC_BASE: + { + ulInt = INT_GPIOC; + break; + } + + case GPIO_PORTD_BASE: + { + ulInt = INT_GPIOD; + break; + } + + case GPIO_PORTE_BASE: + { + ulInt = INT_GPIOE; + break; + } + + default: + { + return(-1); + } + } + + // + // Return GPIO interrupt number. + // + return(ulInt); +} +#else +extern long GPIOGetIntNumber(unsigned long ulPort); +#endif + +//***************************************************************************** +// +//! Sets the direction and mode of the specified pins of the selected +//! GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! \param ulPinIO pin direction and/or mode +//! +//! This function will set the specified pins on the selected GPIO port +//! as either an input or output under software control, or it will set the +//! pin to be under hardware control. +//! +//! The parameter \e ulPinIO is an enumerated data type that can be one of +//! the following values: +//! +//! - \b GPIO_DIR_MODE_IN +//! - \b GPIO_DIR_MODE_OUT +//! - \b GPIO_DIR_MODE_HW +//! +//! where \b GPIO_DIR_MODE_IN specifies that the pin will be programmed as +//! a software controlled input, \b GPIO_DIR_MODE_OUT specifies that the pin +//! will be programmed as a software controlled output, and +//! \b GPIO_DIR_MODE_HW specifies that the pin will be placed under +//! hardware control. +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_dirmodeset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + ASSERT((ulPinIO == GPIO_DIR_MODE_IN) || (ulPinIO == GPIO_DIR_MODE_OUT) || + (ulPinIO == GPIO_DIR_MODE_HW)); + + // + // Set the pin direction and mode. + // + HWREG(ulPort + GPIO_O_DIR) = ((ulPinIO & 1) ? + (HWREG(ulPort + GPIO_O_DIR) | ucPins) : + (HWREG(ulPort + GPIO_O_DIR) & ~(ucPins))); + HWREG(ulPort + GPIO_O_AFSEL) = ((ulPinIO & 2) ? + (HWREG(ulPort + GPIO_O_AFSEL) | ucPins) : + (HWREG(ulPort + GPIO_O_AFSEL) & + ~(ucPins))); +} +#endif + +//***************************************************************************** +// +//! Gets the direction and mode of a specified pin of the selected +//! GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPin pin number of the specified pin, relative to the selected +//! GPIO port. +//! +//! This function gets the direction and control mode for a specified pin on +//! the selected GPIO port. The pin can be configured as either an input or +//! output under software control, or it can be under hardware control. The +//! type of control and direction are returned as an enumerated data type. +//! +//! \return Returns one of the enumerated data types described for +//! GPIODirModeSet(). +// +//***************************************************************************** +#if defined(GROUP_dirmodeget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +GPIODirModeGet(unsigned long ulPort, unsigned char ucPin) +{ + unsigned long ulDir, ulAFSEL; + + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + ASSERT(ucPin < 8); + + // + // Convert from a pin number to a bit position. + // + ucPin = 1 << ucPin; + + // + // Return the pin direction and mode. + // + ulDir = HWREG(ulPort + GPIO_O_DIR); + ulAFSEL = HWREG(ulPort + GPIO_O_AFSEL); + return(((ulDir & ucPin) ? 1 : 0) | ((ulAFSEL & ucPin) ? 2 : 0)); +} +#endif + +//***************************************************************************** +// +//! Sets the interrupt type for the specified pins of the selected GPIO +//! port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! \param ulIntType specifies the type of interrupt trigger mechanism +//! +//! This function sets up the various interrupt trigger mechanisms for the +//! specified pins on the selected GPIO port. +//! +//! The parameter \e ulIntType is an enumerated data type that can be one of +//! the following values: +//! +//! - \b GPIO_FALLING_EDGE +//! - \b GPIO_RISING_EDGE +//! - \b GPIO_BOTH_EDGES +//! - \b GPIO_LOW_LEVEL +//! - \b GPIO_HIGH_LEVEL +//! +//! where the different values describe the interrupt detection mechanism +//! (edge or level) and the particular triggering event (falling, rising, +//! or both edges for edge detect, low or high for level detect). +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \note In order to avoid any spurious interrupts, the user must +//! ensure that the GPIO inputs remain stable for the duration of +//! this function. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_inttypeset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + ASSERT((ulIntType == GPIO_FALLING_EDGE) || + (ulIntType == GPIO_RISING_EDGE) || + (ulIntType == GPIO_BOTH_EDGES) || + (ulIntType == GPIO_LOW_LEVEL) || + (ulIntType == GPIO_HIGH_LEVEL)); + + // + // Set the pin interrupt type. + // + HWREG(ulPort + GPIO_O_IBE) = ((ulIntType & 1) ? + (HWREG(ulPort + GPIO_O_IBE) | ucPins) : + (HWREG(ulPort + GPIO_O_IBE) & ~(ucPins))); + HWREG(ulPort + GPIO_O_IS) = ((ulIntType & 2) ? + (HWREG(ulPort + GPIO_O_IS) | ucPins) : + (HWREG(ulPort + GPIO_O_IS) & ~(ucPins))); + HWREG(ulPort + GPIO_O_IEV) = ((ulIntType & 4) ? + (HWREG(ulPort + GPIO_O_IEV) | ucPins) : + (HWREG(ulPort + GPIO_O_IEV) & ~(ucPins))); +} +#endif + +//***************************************************************************** +// +//! Gets the interrupt type for the specified pin of the selected GPIO +//! port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPin pin number of the specified pin, relative to the selected +//! GPIO port. +//! +//! This function gets the interrupt type for a specified pin on the selected +//! GPIO port. The pin can be configured as a falling edge, rising edge, or +//! both edge detected interrupt, or it can be configured as a low level or +//! high level detected interrupt. The type of interrupt detection mechanism +//! is returned as an enumerated data type. +//! +//! \return Returns one of the enumerated data types described for +//! GPIOIntTypeSet(). +// +//***************************************************************************** +#if defined(GROUP_inttypeget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin) +{ + unsigned long ulIBE, ulIS, ulIEV; + + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + ASSERT(ucPin < 8); + + // + // Convert from a pin number to a bit position. + // + ucPin = 1 << ucPin; + + // + // Return the pin interrupt type. + // + ulIBE = HWREG(ulPort + GPIO_O_IBE); + ulIS = HWREG(ulPort + GPIO_O_IS); + ulIEV = HWREG(ulPort + GPIO_O_IEV); + return(((ulIBE & ucPin) ? 1 : 0) | ((ulIS & ucPin) ? 2 : 0) | + ((ulIEV & ucPin) ? 4 : 0)); +} +#endif + +//***************************************************************************** +// +//! Sets the pad configuration for the specified pins of the selected GPIO +//! port. +//! +//! \param ulPort is the base address of the GPIO port. +//! \param ucPins bit-packed representation of the specified pins. +//! \param ulStrength specifies the output drive strength. +//! \param ulPinType specifies the pin type. +//! +//! This function sets the drive strength and type for the specified pins +//! on the selected GPIO port. For pins configured as input ports, the +//! pad is configured as requested, but the only real effect on the input +//! is the configuration of the pull-up or pull-down termination. +//! +//! The parameter \e ulStrength can be one of the following values: +//! +//! - \b GPIO_STRENGTH_2MA +//! - \b GPIO_STRENGTH_4MA +//! - \b GPIO_STRENGTH_8MA +//! - \b GPIO_STRENGTH_8MA_SC +//! +//! where \b GPIO_STRENGTH_xMA specifies either 2, 4, or 8 mA output drive +//! strength, and \b GPIO_OUT_STRENGTH_8MA_SC specifies 8 mA output drive with +//! slew control. +//! +//! The parameter \e ulPinType can be one of the following values: +//! +//! - \b GPIO_PIN_TYPE_STD +//! - \b GPIO_PIN_TYPE_STD_WPU +//! - \b GPIO_PIN_TYPE_STD_WPD +//! - \b GPIO_PIN_TYPE_OD +//! - \b GPIO_PIN_TYPE_OD_WPU +//! - \b GPIO_PIN_TYPE_OD_WPD +//! - \b GPIO_PIN_TYPE_ANALOG +//! +//! where \b GPIO_PIN_TYPE_STD* specifies a push-pull pin, \b GPIO_PIN_TYPE_OD* +//! specifies an open-drain pin, \b *_WPU specifies a weak pull-up, \b *_WPD +//! specifies a weak pull-down, and \b GPIO_PIN_TYPE_ANALOG specifies an +//! analog input (for the comparators). +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_padconfigset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, unsigned long ulPinType) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + ASSERT((ulStrength == GPIO_STRENGTH_2MA) || + (ulStrength == GPIO_STRENGTH_4MA) || + (ulStrength == GPIO_STRENGTH_8MA) || + (ulStrength == GPIO_STRENGTH_8MA_SC)); + ASSERT((ulPinType == GPIO_PIN_TYPE_STD) || + (ulPinType == GPIO_PIN_TYPE_STD_WPU) || + (ulPinType == GPIO_PIN_TYPE_STD_WPD) || + (ulPinType == GPIO_PIN_TYPE_OD) || + (ulPinType == GPIO_PIN_TYPE_OD_WPU) || + (ulPinType == GPIO_PIN_TYPE_OD_WPD) || + (ulPinType == GPIO_PIN_TYPE_ANALOG)) + + // + // Set the output drive strength. + // + HWREG(ulPort + GPIO_O_DR2R) = ((ulStrength & 1) ? + (HWREG(ulPort + GPIO_O_DR2R) | ucPins) : + (HWREG(ulPort + GPIO_O_DR2R) & ~(ucPins))); + HWREG(ulPort + GPIO_O_DR4R) = ((ulStrength & 2) ? + (HWREG(ulPort + GPIO_O_DR4R) | ucPins) : + (HWREG(ulPort + GPIO_O_DR4R) & ~(ucPins))); + HWREG(ulPort + GPIO_O_DR8R) = ((ulStrength & 4) ? + (HWREG(ulPort + GPIO_O_DR8R) | ucPins) : + (HWREG(ulPort + GPIO_O_DR8R) & ~(ucPins))); + HWREG(ulPort + GPIO_O_SLR) = ((ulStrength & 8) ? + (HWREG(ulPort + GPIO_O_SLR) | ucPins) : + (HWREG(ulPort + GPIO_O_SLR) & ~(ucPins))); + + // + // Set the pin type. + // + HWREG(ulPort + GPIO_O_ODR) = ((ulPinType & 1) ? + (HWREG(ulPort + GPIO_O_ODR) | ucPins) : + (HWREG(ulPort + GPIO_O_ODR) & ~(ucPins))); + HWREG(ulPort + GPIO_O_PUR) = ((ulPinType & 2) ? + (HWREG(ulPort + GPIO_O_PUR) | ucPins) : + (HWREG(ulPort + GPIO_O_PUR) & ~(ucPins))); + HWREG(ulPort + GPIO_O_PDR) = ((ulPinType & 4) ? + (HWREG(ulPort + GPIO_O_PDR) | ucPins) : + (HWREG(ulPort + GPIO_O_PDR) & ~(ucPins))); + HWREG(ulPort + GPIO_O_DEN) = ((ulPinType & 8) ? + (HWREG(ulPort + GPIO_O_DEN) | ucPins) : + (HWREG(ulPort + GPIO_O_DEN) & ~(ucPins))); +} +#endif + +//***************************************************************************** +// +//! Gets the pad configuration for the specified pin of the selected GPIO +//! port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPin pin number of the specified pin, relative to the selected +//! GPIO port. +//! \param pulStrength pointer to storage for the output drive strength +//! \param pulPinType pointer to storage for the output drive type +//! +//! This function gets the pad configuration for a specified pin on the +//! selected GPIO port. The values returned in \e eStrength and \e eOutType +//! correspond to the values used in GPIOPadConfigSet(). This function also +//! works for pins configured as input pins; however, the only meaningful +//! data returned is whether the pin is terminated with a pull-up or +//! down resistor. +//! +//! \return None +// +//***************************************************************************** +#if defined(GROUP_padconfigget) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, unsigned long *pulPinType) +{ + unsigned long ulTemp1, ulTemp2, ulTemp3, ulTemp4; + + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + ASSERT(ucPin < 8); + + // + // Convert from a pin number to a bit position. + // + ucPin = (1 << ucPin); + + // + // Get the drive strength for this pin. + // + ulTemp1 = HWREG(ulPort + GPIO_O_DR2R); + ulTemp2 = HWREG(ulPort + GPIO_O_DR4R); + ulTemp3 = HWREG(ulPort + GPIO_O_DR8R); + ulTemp4 = HWREG(ulPort + GPIO_O_SLR); + *pulStrength = (((ulTemp1 & ucPin) ? 1 : 0) | ((ulTemp2 & ucPin) ? 2 : 0) | + ((ulTemp3 & ucPin) ? 4 : 0) | ((ulTemp4 & ucPin) ? 8 : 0)); + + // + // Get the pin type. + // + ulTemp1 = HWREG(ulPort + GPIO_O_ODR); + ulTemp2 = HWREG(ulPort + GPIO_O_PUR); + ulTemp3 = HWREG(ulPort + GPIO_O_PDR); + ulTemp4 = HWREG(ulPort + GPIO_O_DEN); + *pulPinType = (((ulTemp1 & ucPin) ? 1 : 0) | ((ulTemp2 & ucPin) ? 2 : 0) | + ((ulTemp3 & ucPin) ? 4 : 0) | ((ulTemp4 & ucPin) ? 8 : 0)); +} +#endif + +//***************************************************************************** +// +//! Enables interrupts for the specified pins of the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! Unmasks the interrupt for the specified pins. +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pinintenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Enable the interrupts. + // + HWREG(ulPort + GPIO_O_IM) |= ucPins; +} +#endif + +//***************************************************************************** +// +//! Disables interrupts for the specified pins of the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! Masks the interrupt for the specified pins. +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pinintdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Disable the interrupts. + // + HWREG(ulPort + GPIO_O_IM) &= ~(ucPins); +} +#endif + +//***************************************************************************** +// +//! Gets interrupt status for all the pins of the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param bMasked specifies whether masked or raw interrupt +//! status is returned +//! +//! If \e bMasked is set as \b true, then the masked interrupt status is +//! returned; otherwise, the raw interrupt status will be returned. +//! +//! \return Returns a bit-packed byte, where each bit that is set identifies +//! an active masked or raw interrupt, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. Bits +//! 31:8 should be ignored. +// +//***************************************************************************** +#if defined(GROUP_pinintstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +long +GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Return the interrupt status. + // + if(bMasked) + { + return(HWREG(ulPort + GPIO_O_MIS)); + } + else + { + return(HWREG(ulPort + GPIO_O_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears the interrupt for the specified pins of the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! Clears the interrupt for the specified pins. +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pinintclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Clear the interrupts. + // + HWREG(ulPort + GPIO_O_ICR) = ucPins; +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param pfIntHandler pointer to the GPIO port interrupt handling function +//! +//! This function will ensure that the interrupt handler specified by \e +//! pfIntHandler is called when an interrupt is detected from the selected +//! GPIO port. This function will also enable the corresponding GPIO +//! interrupt in the interrupt controller; individual pin interrupts and +//! interrupt sources must be enabled with GPIOPinIntEnable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_portintregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPortIntRegister(unsigned long ulPort, void (*pfIntHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Get the interrupt number associated with the specified GPIO. + // + ulPort = GPIOGetIntNumber(ulPort); + + // + // Register the interrupt handler. + // + IntRegister(ulPort, pfIntHandler); + + // + // Enable the GPIO interrupt. + // + IntEnable(ulPort); +} +#endif + +//***************************************************************************** +// +//! Removes an interrupt handler for the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! +//! This function will unregister the interrupt handler for the specified +//! GPIO port. This function will also disable the corresponding +//! GPIO port interrupt in the interrupt controller; individual GPIO interrupts +//! and interrupt sources must be disabled with GPIOPinIntDisable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_portintunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPortIntUnregister(unsigned long ulPort) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Get the interrupt number associated with the specified GPIO. + // + ulPort = GPIOGetIntNumber(ulPort); + + // + // Disable the GPIO interrupt. + // + IntDisable(ulPort); + + // + // Unregister the interrupt handler. + // + IntUnregister(ulPort); +} +#endif + +//***************************************************************************** +// +//! Reads the values present at the specified pins of the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The values at the specified pins are read, as specified by \e ucPins. +//! Values are returned for both input and output pins, and the value +//! for pins that are not specified by \e ucPins are set to 0. +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return Returns a bit-packed byte providing the state of the specified +//! pin, where bit 0 of the byte represents GPIO port pin 0, bit 1 represents +//! GPIO port pin 1, etc. Any bit that is not specified by \e ucPins +//! is returned as a 0. Bits 31:8 should be ignored. +// +//***************************************************************************** +#if defined(GROUP_pinread) || defined(BUILD_ALL) || defined(DOXYGEN) +long +GPIOPinRead(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Return the pin value(s). + // + return(HWREG(ulPort + (GPIO_O_DATA + (ucPins << 2)))); +} +#endif + +//***************************************************************************** +// +//! Writes a value at the specified pins of the selected GPIO port. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! \param ucVal value to write to the specified pins +//! +//! Writes the corresponding bit values to the output pins specified +//! by \e ucPins. Writing to a pin configured as an input pin has no +//! effect. +//! +//! The pins are specified using a bit-packed byte, where each bit that is +//! set identifies the pin to be accessed, and where bit 0 of the byte +//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pinwrite) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, unsigned char ucVal) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Write the pins. + // + HWREG(ulPort + (GPIO_O_DATA + (ucPins << 2))) = ucVal; +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use as an analog comparator input. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The analog comparator input pins must be properly configured for the analog +//! comparator to function correctly. This function provides the proper +//! configuration for those pins. +//! +//! \note This cannot be used to turn any pin into an analog comparator input; +//! it only configures an analog comparator pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypecomparator) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be inputs. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_IN); + + // + // Set the pad(s) for analog operation. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_ANALOG); +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use by the I2C peripheral. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The I2C pins must be properly configured for the I2C peripheral to function +//! correctly. This function provides the proper configuration for those pins. +//! +//! \note This cannot be used to turn any pin into an I2C pin; it only +//! configures an I2C pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypei2c) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be peripheral controlled. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_HW); + + // + // Set the pad(s) for open-drain operation with a weak pull-up. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_OD_WPU); +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use by the PWM peripheral. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The PWM pins must be properly configured for the PWM peripheral to function +//! correctly. This function provides a typical configuration for those pins; +//! other configurations may work as well depending upon the board setup (for +//! example, using the on-chip pull-ups). +//! +//! \note This cannot be used to turn any pin into a PWM pin; it only +//! configures a PWM pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypepwm) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypePWM(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be peripheral controlled. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_HW); + + // + // Set the pad(s) for standard push-pull operation. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use by the QEI peripheral. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The QEI pins must be properly configured for the QEI peripheral to function +//! correctly. This function provides a typical configuration for those pins; +//! other configurations may work as well depending upon the board setup (for +//! example, not using the on-chip pull-ups). +//! +//! \note This cannot be used to turn any pin into a QEI pin; it only +//! configures a QEI pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypeqei) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypeQEI(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be peripheral controlled. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_HW); + + // + // Set the pad(s) for standard push-pull operation with a weak pull-up. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use by the SSI peripheral. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The SSI pins must be properly configured for the SSI peripheral to function +//! correctly. This function provides a typical configuration for those pins; +//! other configurations may work as well depending upon the board setup (for +//! example, using the on-chip pull-ups). +//! +//! \note This cannot be used to turn any pin into a SSI pin; it only +//! configures a SSI pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypessi) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be peripheral controlled. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_HW); + + // + // Set the pad(s) for standard push-pull operation. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use by the Timer peripheral. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The CCP pins must be properly configured for the timer peripheral to +//! function correctly. This function provides a typical configuration for +//! those pins; other configurations may work as well depending upon the board +//! setup (for example, using the on-chip pull-ups). +//! +//! \note This cannot be used to turn any pin into a timer pin; it only +//! configures a timer pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypetimer) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be peripheral controlled. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_HW); + + // + // Set the pad(s) for standard push-pull operation. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); +} +#endif + +//***************************************************************************** +// +//! Configures pin(s) for use by the UART peripheral. +//! +//! \param ulPort base address of the selected GPIO port +//! \param ucPins bit-packed representation of the specified pins +//! +//! The UART pins must be properly configured for the UART peripheral to +//! function correctly. This function provides a typical configuration for +//! those pins; other configurations may work as well depending upon the board +//! setup (for example, using the on-chip pull-ups). +//! +//! \note This cannot be used to turn any pin into a UART pin; it only +//! configures a UART pin for proper operation. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pintypeuart) || defined(BUILD_ALL) || defined(DOXYGEN) +void +GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins) +{ + // + // Check the arguments. + // + ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) || + (ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) || + (ulPort == GPIO_PORTE_BASE)); + + // + // Make the pin(s) be peripheral controlled. + // + GPIODirModeSet(ulPort, ucPins, GPIO_DIR_MODE_HW); + + // + // Set the pad(s) for standard push-pull operation. + // + GPIOPadConfigSet(ulPort, ucPins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/gpio.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/gpio.h new file mode 100644 index 0000000..88d6572 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/gpio.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// gpio.h - Defines and Macros for GPIO API. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following values define the bit field for the ucPins argument to several +// of the APIs. +// +//***************************************************************************** +#define GPIO_PIN_0 0x00000001 // GPIO pin 0 +#define GPIO_PIN_1 0x00000002 // GPIO pin 1 +#define GPIO_PIN_2 0x00000004 // GPIO pin 2 +#define GPIO_PIN_3 0x00000008 // GPIO pin 3 +#define GPIO_PIN_4 0x00000010 // GPIO pin 4 +#define GPIO_PIN_5 0x00000020 // GPIO pin 5 +#define GPIO_PIN_6 0x00000040 // GPIO pin 6 +#define GPIO_PIN_7 0x00000080 // GPIO pin 7 + +//***************************************************************************** +// +// Values that can be passed to GPIODirModeSet as the ulPinIO parameter, and +// returned from GPIODirModeGet. +// +//***************************************************************************** +#define GPIO_DIR_MODE_IN 0x00000000 // Pin is a GPIO input +#define GPIO_DIR_MODE_OUT 0x00000001 // Pin is a GPIO output +#define GPIO_DIR_MODE_HW 0x00000002 // Pin is a peripheral function + +//***************************************************************************** +// +// Values that can be passed to GPIOIntTypeSet as the ulIntType parameter, and +// returned from GPIOIntTypeGet. +// +//***************************************************************************** +#define GPIO_FALLING_EDGE 0x00000000 // Interrupt on falling edge +#define GPIO_RISING_EDGE 0x00000004 // Interrupt on rising edge +#define GPIO_BOTH_EDGES 0x00000001 // Interrupt on both edges +#define GPIO_LOW_LEVEL 0x00000002 // Interrupt on low level +#define GPIO_HIGH_LEVEL 0x00000007 // Interrupt on high level + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulStrength parameter, +// and returned by GPIOPadConfigGet in the *pulStrength parameter. +// +//***************************************************************************** +#define GPIO_STRENGTH_2MA 0x00000001 // 2mA drive strength +#define GPIO_STRENGTH_4MA 0x00000002 // 4mA drive strength +#define GPIO_STRENGTH_8MA 0x00000004 // 8mA drive strength +#define GPIO_STRENGTH_8MA_SC 0x0000000C // 8mA drive with slew rate control + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulPadType parameter, +// and returned by GPIOPadConfigGet in the *pulPadType parameter. +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x00000008 // Push-pull +#define GPIO_PIN_TYPE_STD_WPU 0x0000000A // Push-pull with weak pull-up +#define GPIO_PIN_TYPE_STD_WPD 0x0000000C // Push-pull with weak pull-down +#define GPIO_PIN_TYPE_OD 0x00000009 // Open-drain +#define GPIO_PIN_TYPE_OD_WPU 0x0000000B // Open-drain with weak pull-up +#define GPIO_PIN_TYPE_OD_WPD 0x0000000D // Open-drain with weak pull-down +#define GPIO_PIN_TYPE_ANALOG 0x00000000 // Analog comparator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO); +extern unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType); +extern unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, + unsigned long ulPadType); +extern void GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, + unsigned long *pulPadType); +extern void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins); +extern long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked); +extern void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPortIntRegister(unsigned long ulPort, + void (*pfIntHandler)(void)); +extern void GPIOPortIntUnregister(unsigned long ulPort); +extern long GPIOPinRead(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, + unsigned char ucVal); +extern void GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypePWM(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeQEI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins); + +#ifdef __cplusplus +} +#endif + +#endif // __GPIO_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_adc.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_adc.h new file mode 100644 index 0000000..022b9e9 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_adc.h @@ -0,0 +1,343 @@ +//***************************************************************************** +// +// hw_adc.h - Macros used when accessing the ADC hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ADC_H__ +#define __HW_ADC_H__ + +//***************************************************************************** +// +// The following define the offsets of the ADC registers. +// +//***************************************************************************** +#define ADC_O_ACTSS 0x00000000 // Active sample register +#define ADC_O_RIS 0x00000004 // Raw interrupt status register +#define ADC_O_IM 0x00000008 // Interrupt mask register +#define ADC_O_ISC 0x0000000C // Interrupt status/clear register +#define ADC_O_OSTAT 0x00000010 // Overflow status register +#define ADC_O_EMUX 0x00000014 // Event multiplexer select reg. +#define ADC_O_USTAT 0x00000018 // Underflow status register +#define ADC_O_SSPRI 0x00000020 // Channel priority register +#define ADC_O_PSSI 0x00000028 // Processor sample initiate reg. +#define ADC_O_SAC 0x00000030 // Sample Averaging Control reg. +#define ADC_O_SSMUX0 0x00000040 // Multiplexer select 0 register +#define ADC_O_SSCTL0 0x00000044 // Sample sequence control 0 reg. +#define ADC_O_SSFIFO0 0x00000048 // Result FIFO 0 register +#define ADC_O_SSFSTAT0 0x0000004C // FIFO 0 status register +#define ADC_O_SSMUX1 0x00000060 // Multiplexer select 1 register +#define ADC_O_SSCTL1 0x00000064 // Sample sequence control 1 reg. +#define ADC_O_SSFIFO1 0x00000068 // Result FIFO 1 register +#define ADC_O_SSFSTAT1 0x0000006C // FIFO 1 status register +#define ADC_O_SSMUX2 0x00000080 // Multiplexer select 2 register +#define ADC_O_SSCTL2 0x00000084 // Sample sequence control 2 reg. +#define ADC_O_SSFIFO2 0x00000088 // Result FIFO 2 register +#define ADC_O_SSFSTAT2 0x0000008C // FIFO 2 status register +#define ADC_O_SSMUX3 0x000000A0 // Multiplexer select 3 register +#define ADC_O_SSCTL3 0x000000A4 // Sample sequence control 3 reg. +#define ADC_O_SSFIFO3 0x000000A8 // Result FIFO 3 register +#define ADC_O_SSFSTAT3 0x000000AC // FIFO 3 status register +#define ADC_O_TMLB 0x00000100 // Test mode loopback register + +//***************************************************************************** +// +// The following define the offsets of the ADC sequence registers. +// +//***************************************************************************** +#define ADC_O_SEQ 0x00000040 // Offset to the first sequence +#define ADC_O_SEQ_STEP 0x00000020 // Increment to the next sequence +#define ADC_O_X_SSMUX 0x00000000 // Multiplexer select register +#define ADC_O_X_SSCTL 0x00000004 // Sample sequence control register +#define ADC_O_X_SSFIFO 0x00000008 // Result FIFO register +#define ADC_O_X_SSFSTAT 0x0000000C // FIFO status register + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ACTSS register. +// +//***************************************************************************** +#define ADC_ACTSS_ASEN3 0x00000008 // Sample sequence 3 enable +#define ADC_ACTSS_ASEN2 0x00000004 // Sample sequence 2 enable +#define ADC_ACTSS_ASEN1 0x00000002 // Sample sequence 1 enable +#define ADC_ACTSS_ASEN0 0x00000001 // Sample sequence 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the ADC_RIS register. +// +//***************************************************************************** +#define ADC_RIS_INR3 0x00000008 // Sample sequence 3 interrupt +#define ADC_RIS_INR2 0x00000004 // Sample sequence 2 interrupt +#define ADC_RIS_INR1 0x00000002 // Sample sequence 1 interrupt +#define ADC_RIS_INR0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_IM register. +// +//***************************************************************************** +#define ADC_IM_MASK3 0x00000008 // Sample sequence 3 mask +#define ADC_IM_MASK2 0x00000004 // Sample sequence 2 mask +#define ADC_IM_MASK1 0x00000002 // Sample sequence 1 mask +#define ADC_IM_MASK0 0x00000001 // Sample sequence 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ISC register. +// +//***************************************************************************** +#define ADC_ISC_IN3 0x00000008 // Sample sequence 3 interrupt +#define ADC_ISC_IN2 0x00000004 // Sample sequence 2 interrupt +#define ADC_ISC_IN1 0x00000002 // Sample sequence 1 interrupt +#define ADC_ISC_IN0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_OSTAT register. +// +//***************************************************************************** +#define ADC_OSTAT_OV3 0x00000008 // Sample sequence 3 overflow +#define ADC_OSTAT_OV2 0x00000004 // Sample sequence 2 overflow +#define ADC_OSTAT_OV1 0x00000002 // Sample sequence 1 overflow +#define ADC_OSTAT_OV0 0x00000001 // Sample sequence 0 overflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_EMUX register. +// +//***************************************************************************** +#define ADC_EMUX_EM3_MASK 0x0000F000 // Event mux 3 mask +#define ADC_EMUX_EM3_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM3_COMP0 0x00001000 // Analog comparator 0 event +#define ADC_EMUX_EM3_COMP1 0x00002000 // Analog comparator 1 event +#define ADC_EMUX_EM3_COMP2 0x00003000 // Analog comparator 2 event +#define ADC_EMUX_EM3_EXTERNAL 0x00004000 // External event +#define ADC_EMUX_EM3_TIMER 0x00005000 // Timer event +#define ADC_EMUX_EM3_PWM0 0x00006000 // PWM0 event +#define ADC_EMUX_EM3_PWM1 0x00007000 // PWM1 event +#define ADC_EMUX_EM3_PWM2 0x00008000 // PWM2 event +#define ADC_EMUX_EM3_ALWAYS 0x0000F000 // Always event +#define ADC_EMUX_EM2_MASK 0x00000F00 // Event mux 2 mask +#define ADC_EMUX_EM2_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM2_COMP0 0x00000100 // Analog comparator 0 event +#define ADC_EMUX_EM2_COMP1 0x00000200 // Analog comparator 1 event +#define ADC_EMUX_EM2_COMP2 0x00000300 // Analog comparator 2 event +#define ADC_EMUX_EM2_EXTERNAL 0x00000400 // External event +#define ADC_EMUX_EM2_TIMER 0x00000500 // Timer event +#define ADC_EMUX_EM2_PWM0 0x00000600 // PWM0 event +#define ADC_EMUX_EM2_PWM1 0x00000700 // PWM1 event +#define ADC_EMUX_EM2_PWM2 0x00000800 // PWM2 event +#define ADC_EMUX_EM2_ALWAYS 0x00000F00 // Always event +#define ADC_EMUX_EM1_MASK 0x000000F0 // Event mux 1 mask +#define ADC_EMUX_EM1_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM1_COMP0 0x00000010 // Analog comparator 0 event +#define ADC_EMUX_EM1_COMP1 0x00000020 // Analog comparator 1 event +#define ADC_EMUX_EM1_COMP2 0x00000030 // Analog comparator 2 event +#define ADC_EMUX_EM1_EXTERNAL 0x00000040 // External event +#define ADC_EMUX_EM1_TIMER 0x00000050 // Timer event +#define ADC_EMUX_EM1_PWM0 0x00000060 // PWM0 event +#define ADC_EMUX_EM1_PWM1 0x00000070 // PWM1 event +#define ADC_EMUX_EM1_PWM2 0x00000080 // PWM2 event +#define ADC_EMUX_EM1_ALWAYS 0x000000F0 // Always event +#define ADC_EMUX_EM0_MASK 0x0000000F // Event mux 0 mask +#define ADC_EMUX_EM0_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM0_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_EMUX_EM0_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_EMUX_EM0_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_EMUX_EM0_EXTERNAL 0x00000004 // External event +#define ADC_EMUX_EM0_TIMER 0x00000005 // Timer event +#define ADC_EMUX_EM0_PWM0 0x00000006 // PWM0 event +#define ADC_EMUX_EM0_PWM1 0x00000007 // PWM1 event +#define ADC_EMUX_EM0_PWM2 0x00000008 // PWM2 event +#define ADC_EMUX_EM0_ALWAYS 0x0000000F // Always event +#define ADC_EMUX_EM0_SHIFT 0 // The shift for the first event +#define ADC_EMUX_EM1_SHIFT 4 // The shift for the second event +#define ADC_EMUX_EM2_SHIFT 8 // The shift for the third event +#define ADC_EMUX_EM3_SHIFT 12 // The shift for the fourth event + +//***************************************************************************** +// +// The following define the bit fields in the ADC_USTAT register. +// +//***************************************************************************** +#define ADC_USTAT_UV3 0x00000008 // Sample sequence 3 underflow +#define ADC_USTAT_UV2 0x00000004 // Sample sequence 2 underflow +#define ADC_USTAT_UV1 0x00000002 // Sample sequence 1 underflow +#define ADC_USTAT_UV0 0x00000001 // Sample sequence 0 underflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSPRI register. +// +//***************************************************************************** +#define ADC_SSPRI_SS3_MASK 0x00003000 // Sequencer 3 priority mask +#define ADC_SSPRI_SS3_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS3_2ND 0x00001000 // Second priority +#define ADC_SSPRI_SS3_3RD 0x00002000 // Third priority +#define ADC_SSPRI_SS3_4TH 0x00003000 // Fourth priority +#define ADC_SSPRI_SS2_MASK 0x00000300 // Sequencer 2 priority mask +#define ADC_SSPRI_SS2_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS2_2ND 0x00000100 // Second priority +#define ADC_SSPRI_SS2_3RD 0x00000200 // Third priority +#define ADC_SSPRI_SS2_4TH 0x00000300 // Fourth priority +#define ADC_SSPRI_SS1_MASK 0x00000030 // Sequencer 1 priority mask +#define ADC_SSPRI_SS1_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS1_2ND 0x00000010 // Second priority +#define ADC_SSPRI_SS1_3RD 0x00000020 // Third priority +#define ADC_SSPRI_SS1_4TH 0x00000030 // Fourth priority +#define ADC_SSPRI_SS0_MASK 0x00000003 // Sequencer 0 priority mask +#define ADC_SSPRI_SS0_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS0_2ND 0x00000001 // Second priority +#define ADC_SSPRI_SS0_3RD 0x00000002 // Third priority +#define ADC_SSPRI_SS0_4TH 0x00000003 // Fourth priority + +//***************************************************************************** +// +// The following define the bit fields in the ADC_PSSI register. +// +//***************************************************************************** +#define ADC_PSSI_SS3 0x00000008 // Trigger sample sequencer 3 +#define ADC_PSSI_SS2 0x00000004 // Trigger sample sequencer 2 +#define ADC_PSSI_SS1 0x00000002 // Trigger sample sequencer 1 +#define ADC_PSSI_SS0 0x00000001 // Trigger sample sequencer 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SAC register. +// +//***************************************************************************** +#define ADC_SAC_AVG_OFF 0x00000000 // No hardware oversampling +#define ADC_SAC_AVG_2X 0x00000001 // 2x hardware oversampling +#define ADC_SAC_AVG_4X 0x00000002 // 4x hardware oversampling +#define ADC_SAC_AVG_8X 0x00000003 // 8x hardware oversampling +#define ADC_SAC_AVG_16X 0x00000004 // 16x hardware oversampling +#define ADC_SAC_AVG_32X 0x00000005 // 32x hardware oversampling +#define ADC_SAC_AVG_64X 0x00000006 // 64x hardware oversampling + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSMUX0, ADC_SSMUX1, +// ADC_SSMUX2, and ADC_SSMUX3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSMUX_MUX7_MASK 0x70000000 // 8th mux select mask +#define ADC_SSMUX_MUX6_MASK 0x07000000 // 7th mux select mask +#define ADC_SSMUX_MUX5_MASK 0x00700000 // 6th mux select mask +#define ADC_SSMUX_MUX4_MASK 0x00070000 // 5th mux select mask +#define ADC_SSMUX_MUX3_MASK 0x00007000 // 4th mux select mask +#define ADC_SSMUX_MUX2_MASK 0x00000700 // 3rd mux select mask +#define ADC_SSMUX_MUX1_MASK 0x00000070 // 2nd mux select mask +#define ADC_SSMUX_MUX0_MASK 0x00000007 // 1st mux select mask +#define ADC_SSMUX_MUX7_SHIFT 28 +#define ADC_SSMUX_MUX6_SHIFT 24 +#define ADC_SSMUX_MUX5_SHIFT 20 +#define ADC_SSMUX_MUX4_SHIFT 16 +#define ADC_SSMUX_MUX3_SHIFT 12 +#define ADC_SSMUX_MUX2_SHIFT 8 +#define ADC_SSMUX_MUX1_SHIFT 4 +#define ADC_SSMUX_MUX0_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSCTL0, ADC_SSCTL1, +// ADC_SSCTL2, and ADC_SSCTL3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSCTL_TS7 0x80000000 // 8th temperature sensor select +#define ADC_SSCTL_IE7 0x40000000 // 8th interrupt enable +#define ADC_SSCTL_END7 0x20000000 // 8th sequence end select +#define ADC_SSCTL_D7 0x10000000 // 8th differential select +#define ADC_SSCTL_TS6 0x08000000 // 7th temperature sensor select +#define ADC_SSCTL_IE6 0x04000000 // 7th interrupt enable +#define ADC_SSCTL_END6 0x02000000 // 7th sequence end select +#define ADC_SSCTL_D6 0x01000000 // 7th differential select +#define ADC_SSCTL_TS5 0x00800000 // 6th temperature sensor select +#define ADC_SSCTL_IE5 0x00400000 // 6th interrupt enable +#define ADC_SSCTL_END5 0x00200000 // 6th sequence end select +#define ADC_SSCTL_D5 0x00100000 // 6th differential select +#define ADC_SSCTL_TS4 0x00080000 // 5th temperature sensor select +#define ADC_SSCTL_IE4 0x00040000 // 5th interrupt enable +#define ADC_SSCTL_END4 0x00020000 // 5th sequence end select +#define ADC_SSCTL_D4 0x00010000 // 5th differential select +#define ADC_SSCTL_TS3 0x00008000 // 4th temperature sensor select +#define ADC_SSCTL_IE3 0x00004000 // 4th interrupt enable +#define ADC_SSCTL_END3 0x00002000 // 4th sequence end select +#define ADC_SSCTL_D3 0x00001000 // 4th differential select +#define ADC_SSCTL_TS2 0x00000800 // 3rd temperature sensor select +#define ADC_SSCTL_IE2 0x00000400 // 3rd interrupt enable +#define ADC_SSCTL_END2 0x00000200 // 3rd sequence end select +#define ADC_SSCTL_D2 0x00000100 // 3rd differential select +#define ADC_SSCTL_TS1 0x00000080 // 2nd temperature sensor select +#define ADC_SSCTL_IE1 0x00000040 // 2nd interrupt enable +#define ADC_SSCTL_END1 0x00000020 // 2nd sequence end select +#define ADC_SSCTL_D1 0x00000010 // 2nd differential select +#define ADC_SSCTL_TS0 0x00000008 // 1st temperature sensor select +#define ADC_SSCTL_IE0 0x00000004 // 1st interrupt enable +#define ADC_SSCTL_END0 0x00000002 // 1st sequence end select +#define ADC_SSCTL_D0 0x00000001 // 1st differential select + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFIFO0, ADC_SSFIFO1, +// ADC_SSFIFO2, and ADC_SSFIFO3 registers. +// +//***************************************************************************** +#define ADC_SSFIFO_DATA_MASK 0x000003FF // Sample data +#define ADC_SSFIFO_DATA_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFSTAT0, ADC_SSFSTAT1, +// ADC_SSFSTAT2, and ADC_SSFSTAT3 registers. +// +//***************************************************************************** +#define ADC_SSFSTAT_FULL 0x00001000 // FIFO is full +#define ADC_SSFSTAT_EMPTY 0x00000100 // FIFO is empty +#define ADC_SSFSTAT_HPTR 0x000000F0 // FIFO head pointer +#define ADC_SSFSTAT_TPTR 0x0000000F // FIFO tail pointer + +//***************************************************************************** +// +// The following define the bit fields in the ADC_TMLB register. +// +//***************************************************************************** +#define ADC_TMLB_LB 0x00000001 // Loopback control signals + +//***************************************************************************** +// +// The following define the bit fields in the loopback ADC data. +// +//***************************************************************************** +#define ADC_LB_CNT_MASK 0x000003C0 // Sample counter mask +#define ADC_LB_CONT 0x00000020 // Continuation sample +#define ADC_LB_DIFF 0x00000010 // Differential sample +#define ADC_LB_TS 0x00000008 // Temperature sensor sample +#define ADC_LB_MUX_MASK 0x00000007 // Input channel number mask +#define ADC_LB_CNT_SHIFT 6 // Sample counter shift +#define ADC_LB_MUX_SHIFT 0 // Input channel number shift + +#endif // __HW_ADC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_comp.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_comp.h new file mode 100644 index 0000000..991b7a0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_comp.h @@ -0,0 +1,118 @@ +//***************************************************************************** +// +// hw_comp.h - Macros used when accessing the comparator hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_COMP_H__ +#define __HW_COMP_H__ + +//***************************************************************************** +// +// The following define the offsets of the comparator registers. +// +//***************************************************************************** +#define COMP_O_MIS 0x00000000 // Interrupt status register +#define COMP_O_RIS 0x00000004 // Raw interrupt status register +#define COMP_O_INTEN 0x00000008 // Interrupt enable register +#define COMP_O_REFCTL 0x00000010 // Reference voltage control reg. +#define COMP_O_ACSTAT0 0x00000020 // Comp0 status register +#define COMP_O_ACCTL0 0x00000024 // Comp0 control register +#define COMP_O_ACSTAT1 0x00000040 // Comp1 status register +#define COMP_O_ACCTL1 0x00000044 // Comp1 control register +#define COMP_O_ACSTAT2 0x00000060 // Comp2 status register +#define COMP_O_ACCTL2 0x00000064 // Comp2 control register + +//***************************************************************************** +// +// The following define the bit fields in the COMP_MIS, COMP_RIS, and +// COMP_INTEN registers. +// +//***************************************************************************** +#define COMP_INT_2 0x00000004 // Comp2 interrupt +#define COMP_INT_1 0x00000002 // Comp1 interrupt +#define COMP_INT_0 0x00000001 // Comp0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the COMP_REFCTL register. +// +//***************************************************************************** +#define COMP_REFCTL_EN 0x00000200 // Reference voltage enable +#define COMP_REFCTL_RNG 0x00000100 // Reference voltage range +#define COMP_REFCTL_VREF_MASK 0x0000000F // Reference voltage select mask +#define COMP_REFCTL_VREF_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACSTAT0, COMP_ACSTAT1, and +// COMP_ACSTAT2 registers. +// +//***************************************************************************** +#define COMP_ACSTAT_OVAL 0x00000002 // Comparator output value + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACCTL0, COMP_ACCTL1, and +// COMP_ACCTL2 registers. +// +//***************************************************************************** +#define COMP_ACCTL_TMASK 0x00000800 // Trigger enable +#define COMP_ACCTL_ASRCP_MASK 0x00000600 // Vin+ source select mask +#define COMP_ACCTL_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ACCTL_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ACCTL_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_ACCTL_ASRCP_RES 0x00000600 // Reserved +#define COMP_ACCTL_OEN 0x00000100 // Comparator output enable +#define COMP_ACCTL_TSVAL 0x00000080 // Trigger polarity select +#define COMP_ACCTL_TSEN_MASK 0x00000060 // Trigger sense mask +#define COMP_ACCTL_TSEN_LEVEL 0x00000000 // Trigger is level sense +#define COMP_ACCTL_TSEN_FALL 0x00000020 // Trigger is falling edge +#define COMP_ACCTL_TSEN_RISE 0x00000040 // Trigger is rising edge +#define COMP_ACCTL_TSEN_BOTH 0x00000060 // Trigger is both edges +#define COMP_ACCTL_ISLVAL 0x00000010 // Interrupt polarity select +#define COMP_ACCTL_ISEN_MASK 0x0000000C // Interrupt sense mask +#define COMP_ACCTL_ISEN_LEVEL 0x00000000 // Interrupt is level sense +#define COMP_ACCTL_ISEN_FALL 0x00000004 // Interrupt is falling edge +#define COMP_ACCTL_ISEN_RISE 0x00000008 // Interrupt is rising edge +#define COMP_ACCTL_ISEN_BOTH 0x0000000C // Interrupt is both edges +#define COMP_ACCTL_CINV 0x00000002 // Comparator output invert + +//***************************************************************************** +// +// The following define the reset values for the comparator registers. +// +//***************************************************************************** +#define COMP_RV_MIS 0x00000000 // Interrupt status register +#define COMP_RV_RIS 0x00000000 // Raw interrupt status register +#define COMP_RV_INTEN 0x00000000 // Interrupt enable register +#define COMP_RV_REFCTL 0x00000000 // Reference voltage control reg. +#define COMP_RV_ACSTAT0 0x00000000 // Comp0 status register +#define COMP_RV_ACCTL0 0x00000000 // Comp0 control register +#define COMP_RV_ACSTAT1 0x00000000 // Comp1 status register +#define COMP_RV_ACCTL1 0x00000000 // Comp1 control register +#define COMP_RV_ACSTAT2 0x00000000 // Comp2 status register +#define COMP_RV_ACCTL2 0x00000000 // Comp2 control register + +#endif // __HW_COMP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_flash.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_flash.h new file mode 100644 index 0000000..53128b4 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_flash.h @@ -0,0 +1,139 @@ +//***************************************************************************** +// +// hw_flash.h - Macros used when accessing the flash controller. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_FLASH_H__ +#define __HW_FLASH_H__ + +//***************************************************************************** +// +// The following define the offsets of the FLASH registers. +// +//***************************************************************************** +#define FLASH_FMA 0x400FD000 // Memory address register +#define FLASH_FMD 0x400FD004 // Memory data register +#define FLASH_FMC 0x400FD008 // Memory control register +#define FLASH_FCRIS 0x400FD00c // Raw interrupt status register +#define FLASH_FCIM 0x400FD010 // Interrupt mask register +#define FLASH_FCMISC 0x400FD014 // Interrupt status register +#define FLASH_FMPRE 0x400FE130 // FLASH read protect register +#define FLASH_FMPPE 0x400FE134 // FLASH program protect register +#define FLASH_USECRL 0x400FE140 // uSec reload register + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMC register. +// +//***************************************************************************** +#define FLASH_FMC_WRKEY_MASK 0xFFFF0000 // FLASH write key mask +#define FLASH_FMC_WRKEY 0xA4420000 // FLASH write key +#define FLASH_FMC_COMT 0x00000008 // Commit user register +#define FLASH_FMC_MERASE 0x00000004 // Mass erase FLASH +#define FLASH_FMC_ERASE 0x00000002 // Erase FLASH page +#define FLASH_FMC_WRITE 0x00000001 // Write FLASH word + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCRIS register. +// +//***************************************************************************** +#define FLASH_FCRIS_PROGRAM 0x00000002 // Programming status +#define FLASH_FCRIS_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCIM register. +// +//***************************************************************************** +#define FLASH_FCIM_PROGRAM 0x00000002 // Programming mask +#define FLASH_FCIM_ACCESS 0x00000001 // Invalid access mask + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMIS register. +// +//***************************************************************************** +#define FLASH_FCMISC_PROGRAM 0x00000002 // Programming status +#define FLASH_FCMISC_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMPRE and FLASH_FMPPE +// registers. +// +//***************************************************************************** +#define FLASH_FMP_BLOCK_31 0x80000000 // Enable for block 31 +#define FLASH_FMP_BLOCK_30 0x40000000 // Enable for block 30 +#define FLASH_FMP_BLOCK_29 0x20000000 // Enable for block 29 +#define FLASH_FMP_BLOCK_28 0x10000000 // Enable for block 28 +#define FLASH_FMP_BLOCK_27 0x08000000 // Enable for block 27 +#define FLASH_FMP_BLOCK_26 0x04000000 // Enable for block 26 +#define FLASH_FMP_BLOCK_25 0x02000000 // Enable for block 25 +#define FLASH_FMP_BLOCK_24 0x01000000 // Enable for block 24 +#define FLASH_FMP_BLOCK_23 0x00800000 // Enable for block 23 +#define FLASH_FMP_BLOCK_22 0x00400000 // Enable for block 22 +#define FLASH_FMP_BLOCK_21 0x00200000 // Enable for block 21 +#define FLASH_FMP_BLOCK_20 0x00100000 // Enable for block 20 +#define FLASH_FMP_BLOCK_19 0x00080000 // Enable for block 19 +#define FLASH_FMP_BLOCK_18 0x00040000 // Enable for block 18 +#define FLASH_FMP_BLOCK_17 0x00020000 // Enable for block 17 +#define FLASH_FMP_BLOCK_16 0x00010000 // Enable for block 16 +#define FLASH_FMP_BLOCK_15 0x00008000 // Enable for block 15 +#define FLASH_FMP_BLOCK_14 0x00004000 // Enable for block 14 +#define FLASH_FMP_BLOCK_13 0x00002000 // Enable for block 13 +#define FLASH_FMP_BLOCK_12 0x00001000 // Enable for block 12 +#define FLASH_FMP_BLOCK_11 0x00000800 // Enable for block 11 +#define FLASH_FMP_BLOCK_10 0x00000400 // Enable for block 10 +#define FLASH_FMP_BLOCK_9 0x00000200 // Enable for block 9 +#define FLASH_FMP_BLOCK_8 0x00000100 // Enable for block 8 +#define FLASH_FMP_BLOCK_7 0x00000080 // Enable for block 7 +#define FLASH_FMP_BLOCK_6 0x00000040 // Enable for block 6 +#define FLASH_FMP_BLOCK_5 0x00000020 // Enable for block 5 +#define FLASH_FMP_BLOCK_4 0x00000010 // Enable for block 4 +#define FLASH_FMP_BLOCK_3 0x00000008 // Enable for block 3 +#define FLASH_FMP_BLOCK_2 0x00000004 // Enable for block 2 +#define FLASH_FMP_BLOCK_1 0x00000002 // Enable for block 1 +#define FLASH_FMP_BLOCK_0 0x00000001 // Enable for block 0 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_USECRL register. +// +//***************************************************************************** +#define FLASH_USECRL_MASK 0x000000FF // Clock per uSec +#define FLASH_USECRL_SHIFT 0 + +//***************************************************************************** +// +// The erase size is the size of the FLASH block that is erased by an erase +// operation, and the protect size is the size of the FLASH block that is +// protected by each protection register. +// +//***************************************************************************** +#define FLASH_ERASE_SIZE 0x00000400 +#define FLASH_PROTECT_SIZE 0x00000800 + +#endif // __HW_FLASH_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_gpio.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_gpio.h new file mode 100644 index 0000000..bf25d3f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_gpio.h @@ -0,0 +1,103 @@ +//***************************************************************************** +// +// hw_gpio.h - Defines and Macros for GPIO hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_GPIO_H__ +#define __HW_GPIO_H__ + +//***************************************************************************** +// +// GPIO Register Offsets. +// +//***************************************************************************** +#define GPIO_O_DATA 0x00000000 // Data register. +#define GPIO_O_DIR 0x00000400 // Data direction register. +#define GPIO_O_IS 0x00000404 // Interrupt sense register. +#define GPIO_O_IBE 0x00000408 // Interrupt both edges register. +#define GPIO_O_IEV 0x0000040C // Intterupt event register. +#define GPIO_O_IM 0x00000410 // Interrupt mask register. +#define GPIO_O_RIS 0x00000414 // Raw interrupt status register. +#define GPIO_O_MIS 0x00000418 // Masked interrupt status reg. +#define GPIO_O_ICR 0x0000041C // Interrupt clear register. +#define GPIO_O_AFSEL 0x00000420 // Mode control select register. +#define GPIO_O_DR2R 0x00000500 // 2ma drive select register. +#define GPIO_O_DR4R 0x00000504 // 4ma drive select register. +#define GPIO_O_DR8R 0x00000508 // 8ma drive select register. +#define GPIO_O_ODR 0x0000050C // Open drain select register. +#define GPIO_O_PUR 0x00000510 // Pull up select register. +#define GPIO_O_PDR 0x00000514 // Pull down select register. +#define GPIO_O_SLR 0x00000518 // Slew rate control enable reg. +#define GPIO_O_DEN 0x0000051C // Digital input enable register. +#define GPIO_O_PeriphID4 0x00000FD0 // +#define GPIO_O_PeriphID5 0x00000FD4 // +#define GPIO_O_PeriphID6 0x00000FD8 // +#define GPIO_O_PeriphID7 0x00000FDC // +#define GPIO_O_PeriphID0 0x00000FE0 // +#define GPIO_O_PeriphID1 0x00000FE4 // +#define GPIO_O_PeriphID2 0x00000FE8 // +#define GPIO_O_PeriphID3 0x00000FEC // +#define GPIO_O_PCellID0 0x00000FF0 // +#define GPIO_O_PCellID1 0x00000FF4 // +#define GPIO_O_PCellID2 0x00000FF8 // +#define GPIO_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// GPIO Register reset values. +// +//***************************************************************************** +#define GPIO_RV_DATA 0x00000000 // Data register reset value. +#define GPIO_RV_DIR 0x00000000 // Data direction reg RV. +#define GPIO_RV_IS 0x00000000 // Interrupt sense reg RV. +#define GPIO_RV_IBE 0x00000000 // Interrupt both edges reg RV. +#define GPIO_RV_IEV 0x00000000 // Intterupt event reg RV. +#define GPIO_RV_IM 0x00000000 // Interrupt mask reg RV. +#define GPIO_RV_RIS 0x00000000 // Raw interrupt status reg RV. +#define GPIO_RV_MIS 0x00000000 // Masked interrupt status reg RV. +#define GPIO_RV_IC 0x00000000 // Interrupt clear reg RV. +#define GPIO_RV_AFSEL 0x00000000 // Mode control select reg RV. +#define GPIO_RV_DR2R 0x000000FF // 2ma drive select reg RV. +#define GPIO_RV_DR4R 0x00000000 // 4ma drive select reg RV. +#define GPIO_RV_DR8R 0x00000000 // 8ma drive select reg RV. +#define GPIO_RV_ODR 0x00000000 // Open drain select reg RV. +#define GPIO_RV_PUR 0x000000FF // Pull up select reg RV. +#define GPIO_RV_PDR 0x00000000 // Pull down select reg RV. +#define GPIO_RV_SLR 0x00000000 // Slew rate control enable reg RV. +#define GPIO_RV_DEN 0x000000FF // Digital input enable reg RV. +#define GPIO_RV_PeriphID4 0x00000000 // +#define GPIO_RV_PeriphID5 0x00000000 // +#define GPIO_RV_PeriphID6 0x00000000 // +#define GPIO_RV_PeriphID7 0x00000000 // +#define GPIO_RV_PeriphID0 0x00000061 // +#define GPIO_RV_PeriphID1 0x00000010 // +#define GPIO_RV_PeriphID2 0x00000004 // +#define GPIO_RV_PeriphID3 0x00000000 // +#define GPIO_RV_PCellID0 0x0000000D // +#define GPIO_RV_PCellID1 0x000000F0 // +#define GPIO_RV_PCellID2 0x00000005 // +#define GPIO_RV_PCellID3 0x000000B1 // + +#endif // __HW_GPIO_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_i2c.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_i2c.h new file mode 100644 index 0000000..2c9f46d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_i2c.h @@ -0,0 +1,197 @@ +//***************************************************************************** +// +// hw_i2c.h - Macros used when accessing the I2C master and slave hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_I2C_H__ +#define __HW_I2C_H__ + +//***************************************************************************** +// +// The following defines the offset between the I2C master and slave registers. +// +//***************************************************************************** +#define I2C_O_SLAVE 0x00000800 // Offset from master to slave + +//***************************************************************************** +// +// The following define the offsets of the I2C master registers. +// +//***************************************************************************** +#define I2C_MASTER_O_SA 0x00000000 // Slave address register +#define I2C_MASTER_O_CS 0x00000004 // Control and Status register +#define I2C_MASTER_O_DR 0x00000008 // Data register +#define I2C_MASTER_O_TPR 0x0000000C // Timer period register +#define I2C_MASTER_O_IMR 0x00000010 // Interrupt mask register +#define I2C_MASTER_O_RIS 0x00000014 // Raw interrupt status register +#define I2C_MASTER_O_MIS 0x00000018 // Masked interrupt status reg +#define I2C_MASTER_O_MICR 0x0000001c // Interrupt clear register +#define I2C_MASTER_O_CR 0x00000020 // Configuration register + +//***************************************************************************** +// +// The following define the offsets of the I2C slave registers. +// +//***************************************************************************** +#define I2C_SLAVE_O_OAR 0x00000000 // Own address register +#define I2C_SLAVE_O_CSR 0x00000004 // Control/Status register +#define I2C_SLAVE_O_DR 0x00000008 // Data register +#define I2C_SLAVE_O_IM 0x0000000C // Interrupt mask register +#define I2C_SLAVE_O_RIS 0x00000010 // Raw interrupt status register +#define I2C_SLAVE_O_MIS 0x00000014 // Masked interrupt status reg +#define I2C_SLAVE_O_SICR 0x00000018 // Interrupt clear register + +//***************************************************************************** +// +// The followng define the bit fields in the I2C master slave address register. +// +//***************************************************************************** +#define I2C_MASTER_SA_SA_MASK 0x000000FE // Slave address +#define I2C_MASTER_SA_RS 0x00000001 // Receive/send +#define I2C_MASTER_SA_SA_SHIFT 1 + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Control and Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_CS_ACK 0x00000008 // Acknowlegde +#define I2C_MASTER_CS_STOP 0x00000004 // Stop +#define I2C_MASTER_CS_START 0x00000002 // Start +#define I2C_MASTER_CS_RUN 0x00000001 // Run +#define I2C_MASTER_CS_BUS_BUSY 0x00000040 // Bus busy +#define I2C_MASTER_CS_IDLE 0x00000020 // Idle +#define I2C_MASTER_CS_ARB_LOST 0x00000010 // Lost arbitration +#define I2C_MASTER_CS_DATA_ACK 0x00000008 // Data byte not acknowledged +#define I2C_MASTER_CS_ADDR_ACK 0x00000004 // Address byte not acknowledged +#define I2C_MASTER_CS_ERROR 0x00000002 // Error occurred +#define I2C_MASTER_CS_BUSY 0x00000001 // Controller is TX/RX data +#define I2C_MASTER_CS_ERR_MASK 0x0000001C + +//***************************************************************************** +// +// The following define values used in determining the contents of the I2C +// Master Timer Period register. +// +//***************************************************************************** +#define I2C_MASTER_TPR_SCL_HP 0x00000004 // SCL high period +#define I2C_MASTER_TPR_SCL_LP 0x00000006 // SCL low period +#define I2C_MASTER_TPR_SCL (I2C_MASTER_TPR_SCL_HP + I2C_MASTER_TPR_SCL_LP) +#define I2C_SCL_STANDARD 100000 // SCL standard frequency +#define I2C_SCL_FAST 400000 // SCL fast frequency + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_MASTER_IMR_IM 0x00000001 // Master interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_RIS_RIS 0x00000001 // Master raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_MASTER_MIS_MIS 0x00000001 // Master masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_MASTER_MICR_IC 0x00000001 // Master interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Configuration +// register. +// +//***************************************************************************** +#define I2C_MASTER_CR_SFE 0x00000020 // Slave function enable +#define I2C_MASTER_CR_MFE 0x00000010 // Master function enable +#define I2C_MASTER_CR_LPBK 0x00000001 // Loopback enable + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Own Address register. +// +//***************************************************************************** +#define I2C_SLAVE_SOAR_OAR_MASK 0x0000007F // Slave address + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Control/Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_CSR_DA 0x00000001 // Enable the device +#define I2C_SLAVE_CSR_TREQ 0x00000002 // Transmit request received +#define I2C_SLAVE_CSR_RREQ 0x00000001 // Receive data from I2C master + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_SLAVE_IMR_IM 0x00000001 // Slave interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_RIS_RIS 0x00000001 // Slave raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_SLAVE_MIS_MIS 0x00000001 // Slave masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_SLAVE_SICR_IC 0x00000001 // Slave interrupt clear + +#endif // __HW_I2C_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_ints.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_ints.h new file mode 100644 index 0000000..2204a2c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_ints.h @@ -0,0 +1,97 @@ +//***************************************************************************** +// +// hw_ints.h - Macros that define the interrupt assignment on Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_INTS_H__ +#define __HW_INTS_H__ + +//***************************************************************************** +// +// The following define the fault assignments. +// +//***************************************************************************** +#define FAULT_NMI 2 // NMI fault +#define FAULT_HARD 3 // Hard fault +#define FAULT_MPU 4 // MPU fault +#define FAULT_BUS 5 // Bus fault +#define FAULT_USAGE 6 // Usage fault +#define FAULT_SVCALL 11 // SVCall +#define FAULT_DEBUG 12 // Debug monitor +#define FAULT_PENDSV 14 // PendSV +#define FAULT_SYSTICK 15 // System Tick + +//***************************************************************************** +// +// The following define the interrupt assignments. +// +//***************************************************************************** +#define INT_GPIOA 16 // GPIO Port A +#define INT_GPIOB 17 // GPIO Port B +#define INT_GPIOC 18 // GPIO Port C +#define INT_GPIOD 19 // GPIO Port D +#define INT_GPIOE 20 // GPIO Port E +#define INT_UART0 21 // UART0 Rx and Tx +#define INT_UART1 22 // UART1 Rx and Tx +#define INT_SSI 23 // SSI Rx and Tx +#define INT_I2C 24 // I2C Master and Slave +#define INT_PWM_FAULT 25 // PWM Fault +#define INT_PWM0 26 // PWM Generator 0 +#define INT_PWM1 27 // PWM Generator 1 +#define INT_PWM2 28 // PWM Generator 2 +#define INT_QEI 29 // Quadrature Encoder +#define INT_ADC0 30 // ADC Sequence 0 +#define INT_ADC1 31 // ADC Sequence 1 +#define INT_ADC2 32 // ADC Sequence 2 +#define INT_ADC3 33 // ADC Sequence 3 +#define INT_WATCHDOG 34 // Watchdog timer +#define INT_TIMER0A 35 // Timer 0 subtimer A +#define INT_TIMER0B 36 // Timer 0 subtimer B +#define INT_TIMER1A 37 // Timer 1 subtimer A +#define INT_TIMER1B 38 // Timer 1 subtimer B +#define INT_TIMER2A 39 // Timer 2 subtimer A +#define INT_TIMER2B 40 // Timer 2 subtimer B +#define INT_COMP0 41 // Analog Comparator 0 +#define INT_COMP1 42 // Analog Comparator 1 +#define INT_COMP2 43 // Analog Comparator 2 +#define INT_SYSCTL 44 // System Control (PLL, OSC, BO) +#define INT_FLASH 45 // FLASH Control + +//***************************************************************************** +// +// The total number of interrupts. +// +//***************************************************************************** +#define NUM_INTERRUPTS 46 + +//***************************************************************************** +// +// The total number of priority levels. +// +//***************************************************************************** +#define NUM_PRIORITY 8 +#define NUM_PRIORITY_BITS 3 + +#endif // __HW_INTS_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_memmap.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_memmap.h new file mode 100644 index 0000000..2b11f35 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_memmap.h @@ -0,0 +1,64 @@ +//***************************************************************************** +// +// hw_memmap.h - Macros defining the memory map of Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_MEMMAP_H__ +#define __HW_MEMMAP_H__ + +//***************************************************************************** +// +// The following define the base address of the memories and peripherals. +// +//***************************************************************************** +#define FLASH_BASE 0x00000000 // FLASH memory +#define SRAM_BASE 0x20000000 // SRAM memory +#define WATCHDOG_BASE 0x40000000 // Watchdog +#define GPIO_PORTA_BASE 0x40004000 // GPIO Port A +#define GPIO_PORTB_BASE 0x40005000 // GPIO Port B +#define GPIO_PORTC_BASE 0x40006000 // GPIO Port C +#define GPIO_PORTD_BASE 0x40007000 // GPIO Port D +#define SSI_BASE 0x40008000 // SSI +#define UART0_BASE 0x4000C000 // UART0 +#define UART1_BASE 0x4000D000 // UART1 +#define I2C_MASTER_BASE 0x40020000 // I2C Master +#define I2C_SLAVE_BASE 0x40020800 // I2C Slave +#define GPIO_PORTE_BASE 0x40024000 // GPIO Port E +#define PWM_BASE 0x40028000 // PWM +#define QEI_BASE 0x4002C000 // QEI +#define TIMER0_BASE 0x40030000 // Timer0 +#define TIMER1_BASE 0x40031000 // Timer1 +#define TIMER2_BASE 0x40032000 // Timer2 +#define ADC_BASE 0x40038000 // ADC +#define COMP_BASE 0x4003C000 // Analog comparators +#define FLASH_CTRL_BASE 0x400FD000 // FLASH Controller +#define SYSCTL_BASE 0x400FE000 // System Control +#define ITM_BASE 0xE0000000 // Instrumentation Trace Macrocell +#define DWT_BASE 0xE0001000 // Data Watchpoint and Trace +#define FPB_BASE 0xE0002000 // FLASH Patch and Breakpoint +#define NVIC_BASE 0xE000E000 // Nested Vectored Interrupt Ctrl +#define TPIU_BASE 0xE0040000 // Trace Port Interface Unit + +#endif // __HW_MEMMAP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_nvic.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_nvic.h new file mode 100644 index 0000000..6598ef8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_nvic.h @@ -0,0 +1,830 @@ +//***************************************************************************** +// +// hw_nvic.h - Macros used when accessing the NVIC hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_NVIC_H__ +#define __HW_NVIC_H__ + +//***************************************************************************** +// +// The following define the addresses of the NVIC registers. +// +//***************************************************************************** +#define NVIC_INT_TYPE 0xE000E004 // Interrupt Controller Type Reg. +#define NVIC_ST_CTRL 0xE000E010 // SysTick Control and Status Reg. +#define NVIC_ST_RELOAD 0xE000E014 // SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 // SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C // SysTick Calibration Value Reg. +#define NVIC_EN0 0xE000E100 // IRQ 0 to 31 Set Enable Register +#define NVIC_DIS0 0xE000E180 // IRQ 0 to 31 Clear Enable Reg. +#define NVIC_PEND0 0xE000E200 // IRQ 0 to 31 Set Pending Register +#define NVIC_UNPEND0 0xE000E280 // IRQ 0 to 31 Clear Pending Reg. +#define NVIC_ACTIVE0 0xE000E300 // IRQ 0 to 31 Active Register +#define NVIC_PRI0 0xE000E400 // IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 // IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 // IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C // IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 // IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 // IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 // IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C // IRQ 28 to 31 Priority Register +#define NVIC_CPUID 0xE000ED00 // CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 // Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 // Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C // App. Int & Reset Control Reg. +#define NVIC_SYS_CTRL 0xE000ED10 // System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 // Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C // Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 // Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 // System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. +#define NVIC_HFAULT_STAT 0xE000ED2C // Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 // Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 // Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 // Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 // MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 // MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 // MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C // MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 // MPU Region Attribute & Size Reg. +#define NVIC_DBG_CTRL 0xE000EDF0 // Debug Control and Status Reg. +#define NVIC_DBG_XFER 0xE000EDF4 // Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 // Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC // Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 // Software Trigger Interrupt Reg. + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_TYPE register. +// +//***************************************************************************** +#define NVIC_INT_TYPE_LINES_M 0x0000001F // Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CTRL register. +// +//***************************************************************************** +#define NVIC_ST_CTRL_COUNT 0x00010000 // Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 // Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 // Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 // Counter mode + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_RELOAD register. +// +//***************************************************************************** +#define NVIC_ST_RELOAD_M 0x00FFFFFF // Counter load value +#define NVIC_ST_RELOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CURRENT register. +// +//***************************************************************************** +#define NVIC_ST_CURRENT_M 0x00FFFFFF // Counter current value +#define NVIC_ST_CURRENT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CAL register. +// +//***************************************************************************** +#define NVIC_ST_CAL_NOREF 0x80000000 // No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 // Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF // 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN0 register. +// +//***************************************************************************** +#define NVIC_EN0_INT31 0x80000000 // Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 // Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 // Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 // Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 // Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 // Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 // Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 // Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 // Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 // Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 // Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 // Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 // Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 // Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 // Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 // Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 // Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 // Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 // Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 // Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 // Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 // Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 // Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 // Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 // Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 // Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 // Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 // Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 // Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 // Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 // Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 // Interrupt 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS0 register. +// +//***************************************************************************** +#define NVIC_DIS0_INT31 0x80000000 // Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 // Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 // Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 // Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 // Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 // Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 // Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 // Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 // Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 // Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 // Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 // Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 // Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 // Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 // Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 // Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 // Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 // Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 // Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 // Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 // Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 // Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 // Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 // Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 // Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 // Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 // Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 // Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 // Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 // Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 // Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 // Interrupt 0 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND0 register. +// +//***************************************************************************** +#define NVIC_PEND0_INT31 0x80000000 // Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 // Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 // Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 // Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 // Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 // Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 // Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 // Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 // Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 // Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 // Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 // Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 // Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 // Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 // Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 // Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 // Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 // Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 // Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 // Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 // Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 // Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 // Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 // Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 // Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 // Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 // Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 // Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 // Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 // Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 // Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 // Interrupt 0 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND0 register. +// +//***************************************************************************** +#define NVIC_UNPEND0_INT31 0x80000000 // Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 // Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 // Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 // Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 // Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 // Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 // Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 // Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 // Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 // Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 // Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 // Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 // Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 // Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 // Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 // Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 // Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 // Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 // Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 // Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 // Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 // Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 // Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 // Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 // Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 // Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 // Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 // Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 // Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 // Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 // Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 // Interrupt 0 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE0 register. +// +//***************************************************************************** +#define NVIC_ACTIVE0_INT31 0x80000000 // Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 // Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 // Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 // Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 // Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 // Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 // Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 // Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 // Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 // Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 // Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 // Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 // Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 // Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 // Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 // Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 // Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 // Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 // Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 // Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 // Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 // Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 // Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 // Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 // Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 // Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 // Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 // Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 // Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 // Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 // Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 // Interrupt 0 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI0 register. +// +//***************************************************************************** +#define NVIC_PRI0_INT3_M 0xFF000000 // Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 // Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 // Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF // Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI1 register. +// +//***************************************************************************** +#define NVIC_PRI1_INT7_M 0xFF000000 // Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 // Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 // Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF // Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI2 register. +// +//***************************************************************************** +#define NVIC_PRI2_INT11_M 0xFF000000 // Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 // Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 // Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF // Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI3 register. +// +//***************************************************************************** +#define NVIC_PRI3_INT15_M 0xFF000000 // Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 // Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 // Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF // Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI4 register. +// +//***************************************************************************** +#define NVIC_PRI4_INT19_M 0xFF000000 // Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 // Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 // Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF // Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI5 register. +// +//***************************************************************************** +#define NVIC_PRI5_INT23_M 0xFF000000 // Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 // Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 // Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF // Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI6 register. +// +//***************************************************************************** +#define NVIC_PRI6_INT27_M 0xFF000000 // Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 // Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 // Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF // Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI7 register. +// +//***************************************************************************** +#define NVIC_PRI7_INT31_M 0xFF000000 // Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 // Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 // Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF // Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CPUID register. +// +//***************************************************************************** +#define NVIC_CPUID_IMP_M 0xFF000000 // Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 // Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 // Processor part number +#define NVIC_CPUID_REV_M 0x0000000F // Revision + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_CTRL register. +// +//***************************************************************************** +#define NVIC_INT_CTRL_NMI_SET 0x80000000 // Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 // Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 // Unpend a PendSV +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 // Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 // Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 // Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 // Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF // Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_VTABLE register. +// +//***************************************************************************** +#define NVIC_VTABLE_BASE 0x20000000 // Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 // Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_APINT register. +// +//***************************************************************************** +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 // Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 // Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 // Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 // Priority group +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 // Priority group 7.1 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 // Priority group 6.2 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 // Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 // Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 // Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 // Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 // Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 // Priority group 0.8 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 // System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 // Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 // System reset + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 // Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 // Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 // Sleep on ISR exit + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CFG_CTRL register. +// +//***************************************************************************** +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 // Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 // Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 // Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 // Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 // Thread state control + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI1 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI1_RES_M 0xFF000000 // Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 // Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 // Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF // Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI2 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 // Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF // Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI3 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 // Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 // Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 // Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF // Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_HND_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 // Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 // Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 // Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 // SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 // Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 // Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 // PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 // Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 // SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 // Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 // Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 // Mem manage is active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_STAT register. +// +//***************************************************************************** +#define NVIC_FAULT_STAT_DIV0 0x02000000 // Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 // Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 // No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 // Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 // Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 // Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 // Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 // Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 // Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 // Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 // Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 // MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 // Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 // Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 // Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 // Instruction access violation + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_HFAULT_STAT register. +// +//***************************************************************************** +#define NVIC_HFAULT_STAT_DBG 0x80000000 // Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 // Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 // Vector table read fault + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DEBUG_STAT register. +// +//***************************************************************************** +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 // EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 // Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 // DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 // Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 // Halt request + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MM_ADDR register. +// +//***************************************************************************** +#define NVIC_MM_ADDR_M 0xFFFFFFFF // Data fault address +#define NVIC_MM_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_ADDR register. +// +//***************************************************************************** +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF // Data bus fault address +#define NVIC_FAULT_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_STACK register. +// +//***************************************************************************** +#define NVIC_EXC_STACK_DEEP 0x00000001 // Exception stack + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_NUM register. +// +//***************************************************************************** +#define NVIC_EXC_NUM_M 0x000003FF // Exception number +#define NVIC_EXC_NUM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_COPRO register. +// +//***************************************************************************** +#define NVIC_COPRO_15_M 0xC0000000 // Coprocessor 15 access mask +#define NVIC_COPRO_15_DENIED 0x00000000 // Coprocessor 15 access denied +#define NVIC_COPRO_15_PRIV 0x40000000 // Coprocessor 15 privileged addess +#define NVIC_COPRO_15_FULL 0xC0000000 // Coprocessor 15 full access +#define NVIC_COPRO_14_M 0x30000000 // Coprocessor 14 access mask +#define NVIC_COPRO_14_DENIED 0x00000000 // Coprocessor 14 access denied +#define NVIC_COPRO_14_PRIV 0x10000000 // Coprocessor 14 privileged addess +#define NVIC_COPRO_14_FULL 0x30000000 // Coprocessor 14 full access +#define NVIC_COPRO_13_M 0x0C000000 // Coprocessor 13 access mask +#define NVIC_COPRO_13_DENIED 0x00000000 // Coprocessor 13 access denied +#define NVIC_COPRO_13_PRIV 0x04000000 // Coprocessor 13 privileged addess +#define NVIC_COPRO_13_FULL 0x0C000000 // Coprocessor 13 full access +#define NVIC_COPRO_12_M 0x03000000 // Coprocessor 12 access mask +#define NVIC_COPRO_12_DENIED 0x00000000 // Coprocessor 12 access denied +#define NVIC_COPRO_12_PRIV 0x01000000 // Coprocessor 12 privileged addess +#define NVIC_COPRO_12_FULL 0x03000000 // Coprocessor 12 full access +#define NVIC_COPRO_11_M 0x00C00000 // Coprocessor 11 access mask +#define NVIC_COPRO_11_DENIED 0x00000000 // Coprocessor 11 access denied +#define NVIC_COPRO_11_PRIV 0x00400000 // Coprocessor 11 privileged addess +#define NVIC_COPRO_11_FULL 0x00C00000 // Coprocessor 11 full access +#define NVIC_COPRO_10_M 0x00300000 // Coprocessor 10 access mask +#define NVIC_COPRO_10_DENIED 0x00000000 // Coprocessor 10 access denied +#define NVIC_COPRO_10_PRIV 0x00100000 // Coprocessor 10 privileged addess +#define NVIC_COPRO_10_FULL 0x00300000 // Coprocessor 10 full access +#define NVIC_COPRO_9_M 0x000C0000 // Coprocessor 9 access mask +#define NVIC_COPRO_9_DENIED 0x00000000 // Coprocessor 9 access denied +#define NVIC_COPRO_9_PRIV 0x00040000 // Coprocessor 9 privileged addess +#define NVIC_COPRO_9_FULL 0x000C0000 // Coprocessor 9 full access +#define NVIC_COPRO_8_M 0x00030000 // Coprocessor 8 access mask +#define NVIC_COPRO_8_DENIED 0x00000000 // Coprocessor 8 access denied +#define NVIC_COPRO_8_PRIV 0x00010000 // Coprocessor 8 privileged addess +#define NVIC_COPRO_8_FULL 0x00030000 // Coprocessor 8 full access +#define NVIC_COPRO_7_M 0x0000C000 // Coprocessor 7 access mask +#define NVIC_COPRO_7_DENIED 0x00000000 // Coprocessor 7 access denied +#define NVIC_COPRO_7_PRIV 0x00004000 // Coprocessor 7 privileged addess +#define NVIC_COPRO_7_FULL 0x0000C000 // Coprocessor 7 full access +#define NVIC_COPRO_6_M 0x00003000 // Coprocessor 6 access mask +#define NVIC_COPRO_6_DENIED 0x00000000 // Coprocessor 6 access denied +#define NVIC_COPRO_6_PRIV 0x00001000 // Coprocessor 6 privileged addess +#define NVIC_COPRO_6_FULL 0x00003000 // Coprocessor 6 full access +#define NVIC_COPRO_5_M 0x00000C00 // Coprocessor 5 access mask +#define NVIC_COPRO_5_DENIED 0x00000000 // Coprocessor 5 access denied +#define NVIC_COPRO_5_PRIV 0x00000400 // Coprocessor 5 privileged addess +#define NVIC_COPRO_5_FULL 0x00000C00 // Coprocessor 5 full access +#define NVIC_COPRO_4_M 0x00000300 // Coprocessor 4 access mask +#define NVIC_COPRO_4_DENIED 0x00000000 // Coprocessor 4 access denied +#define NVIC_COPRO_4_PRIV 0x00000100 // Coprocessor 4 privileged addess +#define NVIC_COPRO_4_FULL 0x00000300 // Coprocessor 4 full access +#define NVIC_COPRO_3_M 0x000000C0 // Coprocessor 3 access mask +#define NVIC_COPRO_3_DENIED 0x00000000 // Coprocessor 3 access denied +#define NVIC_COPRO_3_PRIV 0x00000040 // Coprocessor 3 privileged addess +#define NVIC_COPRO_3_FULL 0x000000C0 // Coprocessor 3 full access +#define NVIC_COPRO_2_M 0x00000030 // Coprocessor 2 access mask +#define NVIC_COPRO_2_DENIED 0x00000000 // Coprocessor 2 access denied +#define NVIC_COPRO_2_PRIV 0x00000010 // Coprocessor 2 privileged addess +#define NVIC_COPRO_2_FULL 0x00000030 // Coprocessor 2 full access +#define NVIC_COPRO_1_M 0x0000000C // Coprocessor 1 access mask +#define NVIC_COPRO_1_DENIED 0x00000000 // Coprocessor 1 access denied +#define NVIC_COPRO_1_PRIV 0x00000004 // Coprocessor 1 privileged addess +#define NVIC_COPRO_1_FULL 0x0000000C // Coprocessor 1 full access +#define NVIC_COPRO_0_M 0x00000003 // Coprocessor 0 access mask +#define NVIC_COPRO_0_DENIED 0x00000000 // Coprocessor 0 access denied +#define NVIC_COPRO_0_PRIV 0x00000001 // Coprocessor 0 privileged addess +#define NVIC_COPRO_0_FULL 0x00000003 // Coprocessor 0 full access + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_TYPE register. +// +//***************************************************************************** +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 // Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 // Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 // Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_CTRL register. +// +//***************************************************************************** +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 // MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 // MPU enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_NUMBER register. +// +//***************************************************************************** +#define NVIC_MPU_NUMBER_M 0x000000FF // MPU region to access +#define NVIC_MPU_NUMBER_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_BASE register. +// +//***************************************************************************** +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFF00 // Base address +#define NVIC_MPU_BASE_VALID 0x00000010 // Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F // Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_ATTR register. +// +//***************************************************************************** +#define NVIC_MPU_ATTR_ATTRS 0xFFFF0000 // Attributes +#define NVIC_MPU_ATTR_SRD 0x0000FF00 // Sub-region disable +#define NVIC_MPU_ATTR_SZENABLE 0x000000FF // Region size + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_CTRL register. +// +//***************************************************************************** +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 // Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 // Debug key +#define NVIC_DBG_CTRL_MON_PEND 0x00008000 // Pend the monitor +#define NVIC_DBG_CTRL_MON_REQ 0x00004000 // Monitor request +#define NVIC_DBG_CTRL_MON_EN 0x00002000 // Debug monitor enable +#define NVIC_DBG_CTRL_MONSTEP 0x00001000 // Monitor step the core +#define NVIC_DBG_CTRL_S_SLEEP 0x00000400 // Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00000200 // Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00000100 // Register read/write available +#define NVIC_DBG_CTRL_S_LOCKUP 0x00000080 // Core is locked up +#define NVIC_DBG_CTRL_C_RESET 0x00000010 // Reset the core +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 // Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 // Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 // Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 // Enable debug + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_XFER register. +// +//***************************************************************************** +#define NVIC_DBG_XFER_REG_WNR 0x00010000 // Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F // Register +#define NVIC_DBG_XFER_REG_R0 0x00000000 // Register R0 +#define NVIC_DBG_XFER_REG_R1 0x00000001 // Register R1 +#define NVIC_DBG_XFER_REG_R2 0x00000002 // Register R2 +#define NVIC_DBG_XFER_REG_R3 0x00000003 // Register R3 +#define NVIC_DBG_XFER_REG_R4 0x00000004 // Register R4 +#define NVIC_DBG_XFER_REG_R5 0x00000005 // Register R5 +#define NVIC_DBG_XFER_REG_R6 0x00000006 // Register R6 +#define NVIC_DBG_XFER_REG_R7 0x00000007 // Register R7 +#define NVIC_DBG_XFER_REG_R8 0x00000008 // Register R8 +#define NVIC_DBG_XFER_REG_R9 0x00000009 // Register R9 +#define NVIC_DBG_XFER_REG_R10 0x0000000A // Register R10 +#define NVIC_DBG_XFER_REG_R11 0x0000000B // Register R11 +#define NVIC_DBG_XFER_REG_R12 0x0000000C // Register R12 +#define NVIC_DBG_XFER_REG_R13 0x0000000D // Register R13 +#define NVIC_DBG_XFER_REG_R14 0x0000000E // Register R14 +#define NVIC_DBG_XFER_REG_R15 0x0000000F // Register R15 +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 // xPSR/Flags register +#define NVIC_DBG_XFER_REG_MSP 0x00000011 // Main SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 // Process SP +#define NVIC_DBG_XFER_REG_DSP 0x00000013 // Deep SP +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 // Control/Fault/BasePri/PriMask + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_DATA register. +// +//***************************************************************************** +#define NVIC_DBG_DATA_M 0xFFFFFFFF // Data temporary cache +#define NVIC_DBG_DATA_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_INT register. +// +//***************************************************************************** +#define NVIC_DBG_INT_HARDERR 0x00000400 // Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 // Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 // Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 // Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 // Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 // Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 // Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 // Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 // Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 // Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 // Reset vector catch + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SW_TRIG register. +// +//***************************************************************************** +#define NVIC_SW_TRIG_INTID_M 0x000003FF // Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 + +#endif // __HW_NVIC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_pwm.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_pwm.h new file mode 100644 index 0000000..cc42015 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_pwm.h @@ -0,0 +1,260 @@ +//***************************************************************************** +// +// hw_pwm.h - Defines and Macros for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_PWM_H__ +#define __HW_PWM_H__ + +//***************************************************************************** +// +// PWM Module Register Offsets. +// +//***************************************************************************** +#define PWM_O_CTL 0x00000000 // PWM Master Control register +#define PWM_O_SYNC 0x00000004 // PWM Time Base Sync register +#define PWM_O_ENABLE 0x00000008 // PWM Output Enable register +#define PWM_O_INVERT 0x0000000C // PWM Output Inversion register +#define PWM_O_FAULT 0x00000010 // PWM Output Fault register +#define PWM_O_INTEN 0x00000014 // PWM Interrupt Enable register +#define PWM_O_RIS 0x00000018 // PWM Interrupt Raw Status reg. +#define PWM_O_ISC 0x0000001C // PWM Interrupt Status register +#define PWM_O_STATUS 0x00000020 // PWM Status register + +//***************************************************************************** +// +// The following define the bit fields in the PWM Master Control register. +// +//***************************************************************************** +#define PWM_CTL_GLOBAL_SYNC2 0x00000004 // Global sync generator 2 +#define PWM_CTL_GLOBAL_SYNC1 0x00000002 // Global sync generator 1 +#define PWM_CTL_GLOBAL_SYNC0 0x00000001 // Global sync generator 0 + +//***************************************************************************** +// +// The following define the bit fields in the PWM Time Base Sync register. +// +//***************************************************************************** +#define PWM_SYNC_SYNC2 0x00000004 // Reset generator 2 counter +#define PWM_SYNC_SYNC1 0x00000002 // Reset generator 1 counter +#define PWM_SYNC_SYNC0 0x00000001 // Reset generator 0 counter + +//***************************************************************************** +// +// The following define the bit fields in the PWM Output Enable register. +// +//***************************************************************************** +#define PWM_ENABLE_PWM5EN 0x00000020 // PWM5 pin enable +#define PWM_ENABLE_PWM4EN 0x00000010 // PWM4 pin enable +#define PWM_ENABLE_PWM3EN 0x00000008 // PWM3 pin enable +#define PWM_ENABLE_PWM2EN 0x00000004 // PWM2 pin enable +#define PWM_ENABLE_PWM1EN 0x00000002 // PWM1 pin enable +#define PWM_ENABLE_PWM0EN 0x00000001 // PWM0 pin enable + +//***************************************************************************** +// +// The following define the bit fields in the PWM Inversion register. +// +//***************************************************************************** +#define PWM_INVERT_PWM5INV 0x00000020 // PWM5 pin invert +#define PWM_INVERT_PWM4INV 0x00000010 // PWM4 pin invert +#define PWM_INVERT_PWM3INV 0x00000008 // PWM3 pin invert +#define PWM_INVERT_PWM2INV 0x00000004 // PWM2 pin invert +#define PWM_INVERT_PWM1INV 0x00000002 // PWM1 pin invert +#define PWM_INVERT_PWM0INV 0x00000001 // PWM0 pin invert + +//***************************************************************************** +// +// The following define the bit fields in the PWM Fault register. +// +//***************************************************************************** +#define PWM_FAULT_FAULT5 0x00000020 // PWM5 pin fault +#define PWM_FAULT_FAULT4 0x00000010 // PWM5 pin fault +#define PWM_FAULT_FAULT3 0x00000008 // PWM5 pin fault +#define PWM_FAULT_FAULT2 0x00000004 // PWM5 pin fault +#define PWM_FAULT_FAULT1 0x00000002 // PWM5 pin fault +#define PWM_FAULT_FAULT0 0x00000001 // PWM5 pin fault + +//***************************************************************************** +// +// PWM Interrupt Register bit definitions. +// +//***************************************************************************** +#define PWM_INT_INTFAULT 0x00010000 // Fault interrupt pending + +//***************************************************************************** +// +// The following define the bit fields in the PWM Status register. +// +//***************************************************************************** +#define PWM_STATUS_FAULT 0x00000001 // Fault status + +//***************************************************************************** +// +// PWM Generator standard offsets. +// +//***************************************************************************** +#define PWM_GEN_0_OFFSET 0x00000040 // PWM0 base +#define PWM_GEN_1_OFFSET 0x00000080 // PWM1 base +#define PWM_GEN_2_OFFSET 0x000000C0 // PWM2 base + +#define PWM_O_X_CTL 0x00000000 // Gen Control Reg +#define PWM_O_X_INTEN 0x00000004 // Gen Int/Trig Enable Reg +#define PWM_O_X_RIS 0x00000008 // Gen Raw Int Status Reg +#define PWM_O_X_ISC 0x0000000C // Gen Int Status Reg +#define PWM_O_X_LOAD 0x00000010 // Gen Load Reg +#define PWM_O_X_COUNT 0x00000014 // Gen Counter Reg +#define PWM_O_X_CMPA 0x00000018 // Gen Compare A Reg +#define PWM_O_X_CMPB 0x0000001C // Gen Compare B Reg +#define PWM_O_X_GENA 0x00000020 // Gen Generator A Ctrl Reg +#define PWM_O_X_GENB 0x00000024 // Gen Generator B Ctrl Reg +#define PWM_O_X_DBCTL 0x00000028 // Gen Dead Band Ctrl Reg +#define PWM_O_X_DBRISE 0x0000002C // Gen DB Rising Edge Delay Reg +#define PWM_O_X_DBFALL 0x00000030 // Gen DB Falling Edge Delay Reg + +//***************************************************************************** +// +// PWM_X Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_CTL_ENABLE 0x00000001 // Master enable for gen block +#define PWM_X_CTL_MODE 0x00000002 // Counter mode, down or up/down +#define PWM_X_CTL_DEBUG 0x00000004 // Debug mode +#define PWM_X_CTL_LOADUPD 0x00000008 // Update mode for the load reg +#define PWM_X_CTL_CMPAUPD 0x00000010 // Update mode for comp A reg +#define PWM_X_CTL_CMPBUPD 0x00000020 // Update mode for comp B reg + +//***************************************************************************** +// +// PWM_X Interrupt/Trigger Enable Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INTEN_INTCNTZERO 0x00000001 // Int if COUNT = 0 +#define PWM_X_INTEN_INTCNTLOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_X_INTEN_INTCMPAU 0x00000004 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPAD 0x00000008 // Int if COUNT = CMPA D +#define PWM_X_INTEN_INTCMPBU 0x00000010 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPBD 0x00000020 // Int if COUNT = CMPA D +#define PWM_X_INTEN_TRCNTZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_X_INTEN_TRCNTLOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_X_INTEN_TRCMPAU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPAD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_X_INTEN_TRCMPBU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPBD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// PWM_X Raw Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_RIS_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 int +#define PWM_X_RIS_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD int +#define PWM_X_RIS_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U int +#define PWM_X_RIS_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D int +#define PWM_X_RIS_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U int +#define PWM_X_RIS_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D int + +//***************************************************************************** +// +// PWM_X Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INT_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 received +#define PWM_X_INT_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD rcvd +#define PWM_X_INT_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U rcvd +#define PWM_X_INT_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D rcvd +#define PWM_X_INT_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U rcvd +#define PWM_X_INT_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D rcvd + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_GEN_Y_ACTZERO 0x00000003 // Act PWM_X_COUNT = 0 +#define PWM_X_GEN_Y_ACTLOAD 0x0000000C // Act PWM_X_COUNT = PWM_X_LOAD +#define PWM_X_GEN_Y_ACTCMPAU 0x00000030 // Act PWM_X_COUNT = PWM_X_CMPA U +#define PWM_X_GEN_Y_ACTCMPAD 0x000000C0 // Act PWM_X_COUNT = PWM_X_CMPA D +#define PWM_X_GEN_Y_ACTCMPBU 0x00000300 // Act PWM_X_COUNT = PWM_X_CMPB U +#define PWM_X_GEN_Y_ACTCMPBD 0x00000C00 // Act PWM_X_COUNT = PWM_X_CMPB D + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register action definitions. +// +//***************************************************************************** +#define PWM_GEN_ACT_NONE 0x0 // Do nothing +#define PWM_GEN_ACT_INV 0x1 // Invert the output signal +#define PWM_GEN_ACT_ZERO 0x2 // Set the output signal to zero +#define PWM_GEN_ACT_ONE 0x3 // Set the output signal to one +#define PWM_GEN_ACT_ZERO_SHIFT 0 // Shift amount for the zero action +#define PWM_GEN_ACT_LOAD_SHIFT 2 // Shift amount for the load action +#define PWM_GEN_ACT_A_UP_SHIFT 4 // Shift amount for the A up action +#define PWM_GEN_ACT_A_DN_SHIFT 6 // Shift amount for the A dn action +#define PWM_GEN_ACT_B_UP_SHIFT 8 // Shift amount for the B up action +#define PWM_GEN_ACT_B_DN_SHIFT 10 // Shift amount for the B dn action + +//***************************************************************************** +// +// PWM_X Dead Band Control Register bit definitions. +// +//***************************************************************************** +#define PWM_DBCTL_ENABLE 0x00000001 // Enable dead band insertion + +//***************************************************************************** +// +// PWM Register reset values. +// +//***************************************************************************** +#define PWM_RV_CTL 0x00000000 // Master control of the PWM module +#define PWM_RV_SYNC 0x00000000 // Counter synch for PWM generators +#define PWM_RV_ENABLE 0x00000000 // Master enable for the PWM + // output pins +#define PWM_RV_INVERT 0x00000000 // Inversion control for + // PWM output pins +#define PWM_RV_FAULT 0x00000000 // Fault handling for the PWM + // output pins +#define PWM_RV_INTEN 0x00000000 // Interrupt enable +#define PWM_RV_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_STATUS 0x00000000 // Status +#define PWM_RV_X_CTL 0x00000000 // Master control of the PWM + // generator block +#define PWM_RV_X_INTEN 0x00000000 // Interrupt and trigger enable +#define PWM_RV_X_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_X_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_X_LOAD 0x00000000 // The load value for the counter +#define PWM_RV_X_COUNT 0x00000000 // The current counter value +#define PWM_RV_X_CMPA 0x00000000 // The comparator A value +#define PWM_RV_X_CMPB 0x00000000 // The comparator B value +#define PWM_RV_X_GENA 0x00000000 // Controls PWM generator A +#define PWM_RV_X_GENB 0x00000000 // Controls PWM generator B +#define PWM_RV_X_DBCTL 0x00000000 // Control the dead band generator +#define PWM_RV_X_DBRISE 0x00000000 // The dead band rising edge delay + // count +#define PWM_RV_X_DBFALL 0x00000000 // The dead band falling edge delay + // count + +#endif // __HW_PWM_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_qei.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_qei.h new file mode 100644 index 0000000..864459f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_qei.h @@ -0,0 +1,176 @@ +//***************************************************************************** +// +// hw_qei.h - Macros used when accessing the QEI hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_QEI_H__ +#define __HW_QEI_H__ + +//***************************************************************************** +// +// The following define the offsets of the QEI registers. +// +//***************************************************************************** +#define QEI_O_CTL 0x00000000 // Configuration and control reg. +#define QEI_O_STAT 0x00000004 // Status register +#define QEI_O_POS 0x00000008 // Current position register +#define QEI_O_MAXPOS 0x0000000C // Maximum position register +#define QEI_O_LOAD 0x00000010 // Velocity timer load register +#define QEI_O_TIME 0x00000014 // Velocity timer register +#define QEI_O_COUNT 0x00000018 // Velocity pulse count register +#define QEI_O_SPEED 0x0000001C // Velocity speed register +#define QEI_O_INTEN 0x00000020 // Interrupt enable register +#define QEI_O_RIS 0x00000024 // Raw interrupt status register +#define QEI_O_ISC 0x00000028 // Interrupt status register + +//***************************************************************************** +// +// The following define the bit fields in the QEI_CTL register. +// +//***************************************************************************** +#define QEI_CTL_STALLEN 0x00001000 // Stall enable +#define QEI_CTL_INVI 0x00000800 // Invert Index input +#define QEI_CTL_INVB 0x00000400 // Invert PhB input +#define QEI_CTL_INVA 0x00000200 // Invert PhA input +#define QEI_CTL_VELDIV_M 0x000001C0 // Velocity predivider mask +#define QEI_CTL_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_CTL_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_CTL_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_CTL_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_CTL_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_CTL_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_CTL_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_CTL_VELDIV_128 0x000001C0 // Predivide by 128 +#define QEI_CTL_VELEN 0x00000020 // Velocity enable +#define QEI_CTL_RESMODE 0x00000010 // Position counter reset mode +#define QEI_CTL_CAPMODE 0x00000008 // Edge capture mode +#define QEI_CTL_SIGMODE 0x00000004 // Encoder signaling mode +#define QEI_CTL_SWAP 0x00000002 // Swap input signals +#define QEI_CTL_ENABLE 0x00000001 // QEI enable + +//***************************************************************************** +// +// The following define the bit fields in the QEI_STAT register. +// +//***************************************************************************** +#define QEI_STAT_DIRECTION 0x00000002 // Direction of rotation +#define QEI_STAT_ERROR 0x00000001 // Signalling error detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_POS register. +// +//***************************************************************************** +#define QEI_POS_M 0xFFFFFFFF // Current encoder position +#define QEI_POS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_MAXPOS register. +// +//***************************************************************************** +#define QEI_MAXPOS_M 0xFFFFFFFF // Maximum encoder position +#define QEI_MAXPOS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_LOAD register. +// +//***************************************************************************** +#define QEI_LOAD_M 0xFFFFFFFF // Velocity timer load value +#define QEI_LOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_TIME register. +// +//***************************************************************************** +#define QEI_TIME_M 0xFFFFFFFF // Velocity timer current value +#define QEI_TIME_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_COUNT register. +// +//***************************************************************************** +#define QEI_COUNT_M 0xFFFFFFFF // Encoder running pulse count +#define QEI_COUNT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_SPEED register. +// +//***************************************************************************** +#define QEI_SPEED_M 0xFFFFFFFF // Encoder pulse count +#define QEI_SPEED_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_INTEN register. +// +//***************************************************************************** +#define QEI_INTEN_ERROR 0x00000008 // Phase error detected +#define QEI_INTEN_DIR 0x00000004 // Direction change +#define QEI_INTEN_TIMER 0x00000002 // Velocity timer expired +#define QEI_INTEN_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_RIS register. +// +//***************************************************************************** +#define QEI_RIS_ERROR 0x00000008 // Phase error detected +#define QEI_RIS_DIR 0x00000004 // Direction change +#define QEI_RIS_TIMER 0x00000002 // Velocity timer expired +#define QEI_RIS_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_ISC register. +// +//***************************************************************************** +#define QEI_INT_ERROR 0x00000008 // Phase error detected +#define QEI_INT_DIR 0x00000004 // Direction change +#define QEI_INT_TIMER 0x00000002 // Velocity timer expired +#define QEI_INT_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the reset values for the QEI registers. +// +//***************************************************************************** +#define QEI_RV_CTL 0x00000000 // Configuration and control reg. +#define QEI_RV_STAT 0x00000000 // Status register +#define QEI_RV_POS 0x00000000 // Current position register +#define QEI_RV_MAXPOS 0x00000000 // Maximum position register +#define QEI_RV_LOAD 0x00000000 // Velocity timer load register +#define QEI_RV_TIME 0x00000000 // Velocity timer register +#define QEI_RV_COUNT 0x00000000 // Velocity pulse count register +#define QEI_RV_SPEED 0x00000000 // Velocity speed register +#define QEI_RV_INTEN 0x00000000 // Interrupt enable register +#define QEI_RV_RIS 0x00000000 // Raw interrupt status register +#define QEI_RV_ISC 0x00000000 // Interrupt status register + +#endif // __HW_QEI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_ssi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_ssi.h new file mode 100644 index 0000000..e4650af --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_ssi.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// hw_ssi.h - Macros used when accessing the SSI hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SSI_H__ +#define __HW_SSI_H__ + +//***************************************************************************** +// +// The following define the offsets of the SSI registers. +// +//***************************************************************************** +#define SSI_O_CR0 0x00000000 // Control register 0 +#define SSI_O_CR1 0x00000004 // Control register 1 +#define SSI_O_DR 0x00000008 // Data register +#define SSI_O_SR 0x0000000C // Status register +#define SSI_O_CPSR 0x00000010 // Clock prescale register +#define SSI_O_IM 0x00000014 // Int mask set and clear register +#define SSI_O_RIS 0x00000018 // Raw interrupt register +#define SSI_O_MIS 0x0000001C // Masked interrupt register +#define SSI_O_ICR 0x00000020 // Interrupt clear register + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 0. +// +//***************************************************************************** +#define SSI_CR0_SCR 0x0000FF00 // Serial clock rate +#define SSI_CR0_SPH 0x00000080 // SSPCLKOUT phase +#define SSI_CR0_SPO 0x00000040 // SSPCLKOUT polarity +#define SSI_CR0_FRF_MASK 0x00000030 // Frame format mask +#define SSI_CR0_FRF_MOTO 0x00000000 // Motorola SPI frame format +#define SSI_CR0_FRF_TI 0x00000010 // TI sync serial frame format +#define SSI_CR0_FRF_NMW 0x00000020 // National Microwire frame format +#define SSI_CR0_DSS 0x0000000F // Data size select +#define SSI_CR0_DSS_4 0x00000003 // 4 bit data +#define SSI_CR0_DSS_5 0x00000004 // 5 bit data +#define SSI_CR0_DSS_6 0x00000005 // 6 bit data +#define SSI_CR0_DSS_7 0x00000006 // 7 bit data +#define SSI_CR0_DSS_8 0x00000007 // 8 bit data +#define SSI_CR0_DSS_9 0x00000008 // 9 bit data +#define SSI_CR0_DSS_10 0x00000009 // 10 bit data +#define SSI_CR0_DSS_11 0x0000000A // 11 bit data +#define SSI_CR0_DSS_12 0x0000000B // 12 bit data +#define SSI_CR0_DSS_13 0x0000000C // 13 bit data +#define SSI_CR0_DSS_14 0x0000000D // 14 bit data +#define SSI_CR0_DSS_15 0x0000000E // 15 bit data +#define SSI_CR0_DSS_16 0x0000000F // 16 bit data + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 1. +// +//***************************************************************************** +#define SSI_CR1_SOD 0x00000008 // Slave mode output disable +#define SSI_CR1_MS 0x00000004 // Master or slave mode select +#define SSI_CR1_SSE 0x00000002 // Sync serial port enable +#define SSI_CR1_LBM 0x00000001 // Loopback mode + +//***************************************************************************** +// +// The following define the bit fields in the SSI Status register. +// +//***************************************************************************** +#define SSI_SR_BSY 0x00000010 // SSI busy +#define SSI_SR_RFF 0x00000008 // RX FIFO full +#define SSI_SR_RNE 0x00000004 // RX FIFO not empty +#define SSI_SR_TNF 0x00000002 // TX FIFO not full +#define SSI_SR_TFE 0x00000001 // TX FIFO empty + +//***************************************************************************** +// +// The following define the bit fields in the SSI clock prescale register. +// +//***************************************************************************** +#define SSI_CPSR_CPSDVSR_MASK 0x000000FF // Clock prescale + +//***************************************************************************** +// +// The following define information concerning the SSI Data register. +// +//***************************************************************************** +#define TX_FIFO_SIZE (8) // Number of entries in the TX FIFO +#define RX_FIFO_SIZE (8) // Number of entries in the RX FIFO + +//***************************************************************************** +// +// The following define the bit fields in the interrupt mask set and clear, +// raw interrupt, masked interrupt, and interrupt clear registers. +// +//***************************************************************************** +#define SSI_INT_TXFF 0x00000008 // TX FIFO interrupt +#define SSI_INT_RXFF 0x00000004 // RX FIFO interrupt +#define SSI_INT_RXTO 0x00000002 // RX timeout interrupt +#define SSI_INT_RXOR 0x00000001 // RX overrun interrupt + +#endif // __HW_SSI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_sysctl.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_sysctl.h new file mode 100644 index 0000000..4f6b55e --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_sysctl.h @@ -0,0 +1,409 @@ +//***************************************************************************** +// +// hw_sysctl.h - Macros used when accessing the system control hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SYSCTL_H__ +#define __HW_SYSCTL_H__ + +//***************************************************************************** +// +// The following define the offsets of the system control registers. +// +//***************************************************************************** +#define SYSCTL_DID0 0x400fe000 // Device identification register 0 +#define SYSCTL_DID1 0x400fe004 // Device identification register 1 +#define SYSCTL_DC0 0x400fe008 // Device capabilities register 0 +#define SYSCTL_DC1 0x400fe010 // Device capabilities register 1 +#define SYSCTL_DC2 0x400fe014 // Device capabilities register 2 +#define SYSCTL_DC3 0x400fe018 // Device capabilities register 3 +#define SYSCTL_DC4 0x400fe01C // Device capabilities register 4 +#define SYSCTL_PBORCTL 0x400fe030 // POR/BOR reset control register +#define SYSCTL_LDOPCTL 0x400fe034 // LDO power control register +#define SYSCTL_SRCR0 0x400fe040 // Software reset control reg 0 +#define SYSCTL_SRCR1 0x400fe044 // Software reset control reg 1 +#define SYSCTL_SRCR2 0x400fe048 // Software reset control reg 2 +#define SYSCTL_RIS 0x400fe050 // Raw interrupt status register +#define SYSCTL_IMC 0x400fe054 // Interrupt mask/control register +#define SYSCTL_MISC 0x400fe058 // Interrupt status register +#define SYSCTL_RESC 0x400fe05c // Reset cause register +#define SYSCTL_RCC 0x400fe060 // Run-mode clock config register +#define SYSCTL_PLLCFG 0x400fe064 // PLL configuration register +#define SYSCTL_RCGC0 0x400fe100 // Run-mode clock gating register 0 +#define SYSCTL_RCGC1 0x400fe104 // Run-mode clock gating register 1 +#define SYSCTL_RCGC2 0x400fe108 // Run-mode clock gating register 2 +#define SYSCTL_SCGC0 0x400fe110 // Sleep-mode clock gating reg 0 +#define SYSCTL_SCGC1 0x400fe114 // Sleep-mode clock gating reg 1 +#define SYSCTL_SCGC2 0x400fe118 // Sleep-mode clock gating reg 2 +#define SYSCTL_DCGC0 0x400fe120 // Deep Sleep-mode clock gate reg 0 +#define SYSCTL_DCGC1 0x400fe124 // Deep Sleep-mode clock gate reg 1 +#define SYSCTL_DCGC2 0x400fe128 // Deep Sleep-mode clock gate reg 2 +#define SYSCTL_CLKVCLR 0x400fe150 // Clock verifcation clear register +#define SYSCTL_LDOARST 0x400fe160 // LDO reset control register + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID0 register. +// +//***************************************************************************** +#define SYSCTL_DID0_VER_MASK 0x70000000 // DID0 version mask +#define SYSCTL_DID0_VER_0 0x00000000 // DID0 version 0 +#define SYSCTL_DID0_MAJ_MASK 0x0000FF00 // Major revision mask +#define SYSCTL_DID0_MAJ_A 0x00000000 // Major revision A +#define SYSCTL_DID0_MAJ_B 0x00000100 // Major revision B +#define SYSCTL_DID0_MIN_MASK 0x000000FF // Minor revision mask +#define SYSCTL_DID0_MIN_0 0x00000000 // Minor revision 0 +#define SYSCTL_DID0_MIN_1 0x00000001 // Minor revision 1 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID1 register. +// +//***************************************************************************** +#define SYSCTL_DID1_VER_MASK 0xF0000000 // Register version mask +#define SYSCTL_DID1_FAM_MASK 0x0F000000 // Family mask +#define SYSCTL_DID1_FAM_S 0x00000000 // Stellaris family +#define SYSCTL_DID1_PRTNO_MASK 0x00FF0000 // Part number mask +#define SYSCTL_DID1_PRTNO_101 0x00010000 // LM3S101 +#define SYSCTL_DID1_PRTNO_102 0x00020000 // LM3S102 +#define SYSCTL_DID1_PRTNO_301 0x00110000 // LM3S301 +#define SYSCTL_DID1_PRTNO_310 0x00120000 // LM3S310 +#define SYSCTL_DID1_PRTNO_315 0x00130000 // LM3S315 +#define SYSCTL_DID1_PRTNO_316 0x00140000 // LM3S316 +#define SYSCTL_DID1_PRTNO_328 0x00150000 // LM3S328 +#define SYSCTL_DID1_PRTNO_601 0x00210000 // LM3S601 +#define SYSCTL_DID1_PRTNO_610 0x00220000 // LM3S610 +#define SYSCTL_DID1_PRTNO_611 0x00230000 // LM3S611 +#define SYSCTL_DID1_PRTNO_612 0x00240000 // LM3S612 +#define SYSCTL_DID1_PRTNO_613 0x00250000 // LM3S613 +#define SYSCTL_DID1_PRTNO_615 0x00260000 // LM3S615 +#define SYSCTL_DID1_PRTNO_628 0x00270000 // LM3S628 +#define SYSCTL_DID1_PRTNO_801 0x00310000 // LM3S801 +#define SYSCTL_DID1_PRTNO_811 0x00320000 // LM3S811 +#define SYSCTL_DID1_PRTNO_812 0x00330000 // LM3S812 +#define SYSCTL_DID1_PRTNO_815 0x00340000 // LM3S815 +#define SYSCTL_DID1_PRTNO_828 0x00350000 // LM3S828 +#define SYSCTL_DID1_TEMP_MASK 0x000000E0 // Temperature range mask +#define SYSCTL_DID1_TEMP_C 0x00000000 // Commercial temp range (0..70C) +#define SYSCTL_DID1_TEMP_I 0x00000020 // Industrial temp range (-40..85C) +#define SYSCTL_DID1_PKG_MASK 0x00000018 // Package mask +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 // 28-pin SOIC +#define SYSCTL_DID1_PKG_48QFP 0x00000008 // 48-pin QFP +#define SYSCTL_DID1_ROHS 0x00000004 // Part is RoHS compliant +#define SYSCTL_DID1_QUAL_MASK 0x00000003 // Qualification status mask +#define SYSCTL_DID1_QUAL_ES 0x00000000 // Engineering sample (unqualified) +#define SYSCTL_DID1_QUAL_PP 0x00000001 // Pilot production (unqualified) +#define SYSCTL_DID1_QUAL_FQ 0x00000002 // Fully qualified +#define SYSCTL_DID1_PRTNO_SHIFT 16 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC0 register. +// +//***************************************************************************** +#define SYSCTL_DC0_SRAMSZ_MASK 0xFFFF0000 // SRAM size mask +#define SYSCTL_DC0_SRAMSZ_2KB 0x00070000 // 2kB of SRAM +#define SYSCTL_DC0_SRAMSZ_4KB 0x000F0000 // 4kB of SRAM +#define SYSCTL_DC0_SRAMSZ_8KB 0x001F0000 // 8kB of SRAM +#define SYSCTL_DC0_FLASHSZ_MASK 0x0000FFFF // Flash size mask +#define SYSCTL_DC0_FLASHSZ_8KB 0x00000003 // 8kB of flash +#define SYSCTL_DC0_FLASHSZ_16KB 0x00000007 // 16kB of flash +#define SYSCTL_DC0_FLASHSZ_32KB 0x0000000F // 32kB of flash +#define SYSCTL_DC0_FLASHSZ_64KB 0x0000001F // 64kB of flash + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC1 register. +// +//***************************************************************************** +#define SYSCTL_DC1_PWM 0x00100000 // PWM module present +#define SYSCTL_DC1_ADC 0x00010000 // ADC module present +#define SYSCTL_DC1_SYSDIV_MASK 0x0000F000 // Minimum system divider mask +#define SYSCTL_DC1_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_DC1_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_DC1_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_DC1_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_DC1_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_DC1_MPU 0x00000080 // Cortex-M3 MPU present +#define SYSCTL_DC1_TEMP 0x00000020 // Temperature sensor present +#define SYSCTL_DC1_PLL 0x00000010 // PLL present +#define SYSCTL_DC1_WDOG 0x00000008 // Watchdog present +#define SYSCTL_DC1_SWO 0x00000004 // Serial wire output present +#define SYSCTL_DC1_SWD 0x00000002 // Serial wire debug present +#define SYSCTL_DC1_JTAG 0x00000001 // JTAG debug present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC2 register. +// +//***************************************************************************** +#define SYSCTL_DC2_COMP2 0x04000000 // Analog comparator 2 present +#define SYSCTL_DC2_COMP1 0x02000000 // Analog comparator 1 present +#define SYSCTL_DC2_COMP0 0x01000000 // Analog comparator 0 present +#define SYSCTL_DC2_TIMER2 0x00040000 // Timer 2 present +#define SYSCTL_DC2_TIMER1 0x00020000 // Timer 1 present +#define SYSCTL_DC2_TIMER0 0x00010000 // Timer 0 present +#define SYSCTL_DC2_I2C 0x00001000 // I2C present +#define SYSCTL_DC2_QEI 0x00000100 // QEI present +#define SYSCTL_DC2_SSI 0x00000010 // SSI present +#define SYSCTL_DC2_UART1 0x00000002 // UART 1 present +#define SYSCTL_DC2_UART0 0x00000001 // UART 0 present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC3 register. +// +//***************************************************************************** +#define SYSCTL_DC3_32KHZ 0x80000000 // 32kHz pin present +#define SYSCTL_DC3_CCP5 0x20000000 // CCP5 pin present +#define SYSCTL_DC3_CCP4 0x10000000 // CCP4 pin present +#define SYSCTL_DC3_CCP3 0x08000000 // CCP3 pin present +#define SYSCTL_DC3_CCP2 0x04000000 // CCP2 pin present +#define SYSCTL_DC3_CCP1 0x02000000 // CCP1 pin present +#define SYSCTL_DC3_CCP0 0x01000000 // CCP0 pin present +#define SYSCTL_DC3_ADC7 0x00800000 // ADC7 pin present +#define SYSCTL_DC3_ADC6 0x00400000 // ADC6 pin present +#define SYSCTL_DC3_ADC5 0x00200000 // ADC5 pin present +#define SYSCTL_DC3_ADC4 0x00100000 // ADC4 pin present +#define SYSCTL_DC3_ADC3 0x00080000 // ADC3 pin present +#define SYSCTL_DC3_ADC2 0x00040000 // ADC2 pin present +#define SYSCTL_DC3_ADC1 0x00020000 // ADC1 pin present +#define SYSCTL_DC3_ADC0 0x00010000 // ADC0 pin present +#define SYSCTL_DC3_C2O 0x00004000 // C2o pin present +#define SYSCTL_DC3_C2PLUS 0x00002000 // C2+ pin present +#define SYSCTL_DC3_C2MINUS 0x00001000 // C2- pin present +#define SYSCTL_DC3_C1O 0x00000800 // C1o pin present +#define SYSCTL_DC3_C1PLUS 0x00000400 // C1+ pin present +#define SYSCTL_DC3_C1MINUS 0x00000200 // C1- pin present +#define SYSCTL_DC3_C0O 0x00000100 // C0o pin present +#define SYSCTL_DC3_C0PLUS 0x00000080 // C0+ pin present +#define SYSCTL_DC3_C0MINUS 0x00000040 // C0- pin present +#define SYSCTL_DC3_PWM5 0x00000020 // PWM5 pin present +#define SYSCTL_DC3_PWM4 0x00000010 // PWM4 pin present +#define SYSCTL_DC3_PWM3 0x00000008 // PWM3 pin present +#define SYSCTL_DC3_PWM2 0x00000004 // PWM2 pin present +#define SYSCTL_DC3_PWM1 0x00000002 // PWM1 pin present +#define SYSCTL_DC3_PWM0 0x00000001 // PWM0 pin present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC4 register. +// +//***************************************************************************** +#define SYSCTL_DC4_GPIOE 0x00000010 // GPIO port E present +#define SYSCTL_DC4_GPIOD 0x00000008 // GPIO port D present +#define SYSCTL_DC4_GPIOC 0x00000004 // GPIO port C present +#define SYSCTL_DC4_GPIOB 0x00000002 // GPIO port B present +#define SYSCTL_DC4_GPIOA 0x00000001 // GPIO port A present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PBORCTL register. +// +//***************************************************************************** +#define SYSCTL_PBORCTL_BOR_MASK 0x0000FFFC // BOR wait timer +#define SYSCTL_PBORCTL_BORIOR 0x00000002 // BOR interrupt or reset +#define SYSCTL_PBORCTL_BORWT 0x00000001 // BOR wait and check for noise +#define SYSCTL_PBORCTL_BOR_SH 2 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOPCTL register. +// +//***************************************************************************** +#define SYSCTL_LDOPCTL_MASK 0x0000003F // Voltage adjust mask +#define SYSCTL_LDOPCTL_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDOPCTL_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDOPCTL_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDOPCTL_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDOPCTL_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDOPCTL_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDOPCTL_2_55V 0x0000001F // LDO output of 2.55V +#define SYSCTL_LDOPCTL_2_60V 0x0000001E // LDO output of 2.60V +#define SYSCTL_LDOPCTL_2_65V 0x0000001D // LDO output of 2.65V +#define SYSCTL_LDOPCTL_2_70V 0x0000001C // LDO output of 2.70V +#define SYSCTL_LDOPCTL_2_75V 0x0000001B // LDO output of 2.75V + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR0, SYSCTL_RCGC0, +// SYSCTL_SCGC0, and SYSCTL_DCGC0 registers. +// +//***************************************************************************** +#define SYSCTL_SET0_PWM 0x00100000 // PWM module +#define SYSCTL_SET0_ADC 0x00010000 // ADC module +#define SYSCTL_SET0_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_SET0_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_SET0_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_SET0_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_SET0_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_SET0_WDOG 0x00000008 // Watchdog module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR1, SYSCTL_RCGC1, +// SYSCTL_SCGC1, and SYSCTL_DCGC1 registers. +// +//***************************************************************************** +#define SYSCTL_SET1_COMP2 0x04000000 // Analog comparator module 2 +#define SYSCTL_SET1_COMP1 0x02000000 // Analog comparator module 1 +#define SYSCTL_SET1_COMP0 0x01000000 // Analog comparator module 0 +#define SYSCTL_SET1_TIMER2 0x00040000 // Timer module 2 +#define SYSCTL_SET1_TIMER1 0x00020000 // Timer module 1 +#define SYSCTL_SET1_TIMER0 0x00010000 // Timer module 0 +#define SYSCTL_SET1_I2C 0x00001000 // I2C module +#define SYSCTL_SET1_QEI 0x00000100 // QEI module +#define SYSCTL_SET1_SSI 0x00000010 // SSI module +#define SYSCTL_SET1_UART1 0x00000002 // UART module 1 +#define SYSCTL_SET1_UART0 0x00000001 // UART module 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR2, SYSCTL_RCGC2, +// SYSCTL_SCGC2, and SYSCTL_DCGC2 registers. +// +//***************************************************************************** +#define SYSCTL_SET2_GPIOE 0x00000010 // GPIO E module +#define SYSCTL_SET2_GPIOD 0x00000008 // GPIO D module +#define SYSCTL_SET2_GPIOC 0x00000004 // GPIO C module +#define SYSCTL_SET2_GPIOB 0x00000002 // GPIO B module +#define SYSCTL_SET2_GPIOA 0x00000001 // GIPO A module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RIS, SYSCTL_IMC, and +// SYSCTL_IMS registers. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RESC register. +// +//***************************************************************************** +#define SYSCTL_RESC_LDO 0x00000020 // LDO power OK lost reset +#define SYSCTL_RESC_SW 0x00000010 // Software reset +#define SYSCTL_RESC_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_RESC_BOR 0x00000004 // Brown-out reset +#define SYSCTL_RESC_POR 0x00000002 // Power on reset +#define SYSCTL_RESC_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC register. +// +//***************************************************************************** +#define SYSCTL_RCC_ACG 0x08000000 // Automatic clock gating +#define SYSCTL_RCC_SYSDIV_MASK 0x07800000 // System clock divider +#define SYSCTL_RCC_SYSDIV_2 0x00800000 // System clock /2 +#define SYSCTL_RCC_SYSDIV_3 0x01000000 // System clock /3 +#define SYSCTL_RCC_SYSDIV_4 0x01800000 // System clock /4 +#define SYSCTL_RCC_SYSDIV_5 0x02000000 // System clock /5 +#define SYSCTL_RCC_SYSDIV_6 0x02800000 // System clock /6 +#define SYSCTL_RCC_SYSDIV_7 0x03000000 // System clock /7 +#define SYSCTL_RCC_SYSDIV_8 0x03800000 // System clock /8 +#define SYSCTL_RCC_SYSDIV_9 0x04000000 // System clock /9 +#define SYSCTL_RCC_SYSDIV_10 0x04800000 // System clock /10 +#define SYSCTL_RCC_SYSDIV_11 0x05000000 // System clock /11 +#define SYSCTL_RCC_SYSDIV_12 0x05800000 // System clock /12 +#define SYSCTL_RCC_SYSDIV_13 0x06000000 // System clock /13 +#define SYSCTL_RCC_SYSDIV_14 0x06800000 // System clock /14 +#define SYSCTL_RCC_SYSDIV_15 0x07000000 // System clock /15 +#define SYSCTL_RCC_SYSDIV_16 0x07800000 // System clock /16 +#define SYSCTL_RCC_USE_SYSDIV 0x00400000 // Use sytem clock divider +#define SYSCTL_RCC_USE_PWMDIV 0x00100000 // Use PWM clock divider +#define SYSCTL_RCC_PWMDIV_MASK 0x000E0000 // PWM clock divider +#define SYSCTL_RCC_PWMDIV_2 0x00000000 // PWM clock /2 +#define SYSCTL_RCC_PWMDIV_4 0x00020000 // PWM clock /4 +#define SYSCTL_RCC_PWMDIV_8 0x00040000 // PWM clock /8 +#define SYSCTL_RCC_PWMDIV_16 0x00060000 // PWM clock /16 +#define SYSCTL_RCC_PWMDIV_32 0x00080000 // PWM clock /32 +#define SYSCTL_RCC_PWMDIV_64 0x000A0000 // PWM clock /64 +#define SYSCTL_RCC_PWRDN 0x00002000 // PLL power down +#define SYSCTL_RCC_OE 0x00001000 // PLL output enable +#define SYSCTL_RCC_BYPASS 0x00000800 // PLL bypass +#define SYSCTL_RCC_PLLVER 0x00000400 // PLL verification timer enable +#define SYSCTL_RCC_XTAL_MASK 0x000003C0 // Crystal attached to main osc +#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100 // Using a 3.579545MHz crystal +#define SYSCTL_RCC_XTAL_3_68MHz 0x00000140 // Using a 3.6864MHz crystal +#define SYSCTL_RCC_XTAL_4MHz 0x00000180 // Using a 4MHz crystal +#define SYSCTL_RCC_XTAL_4_09MHZ 0x000001C0 // Using a 4.096MHz crystal +#define SYSCTL_RCC_XTAL_4_91MHZ 0x00000200 // Using a 4.9152MHz crystal +#define SYSCTL_RCC_XTAL_5MHZ 0x00000240 // Using a 5MHz crystal +#define SYSCTL_RCC_XTAL_5_12MHZ 0x00000280 // Using a 5.12MHz crystal +#define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 // Using a 6MHz crystal +#define SYSCTL_RCC_XTAL_6_14MHZ 0x00000300 // Using a 6.144MHz crystal +#define SYSCTL_RCC_XTAL_7_37MHZ 0x00000340 // Using a 7.3728MHz crystal +#define SYSCTL_RCC_XTAL_8MHZ 0x00000380 // Using a 8MHz crystal +#define SYSCTL_RCC_XTAL_8_19MHZ 0x000003C0 // Using a 8.192MHz crystal +#define SYSCTL_RCC_OSCSRC_MASK 0x00000030 // Oscillator input select +#define SYSCTL_RCC_OSCSRC_MAIN 0x00000000 // Use the main oscillator +#define SYSCTL_RCC_OSCSRC_INT 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC_OSCSRC_INT4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC_IOSCVER 0x00000008 // Int. osc. verification timer en +#define SYSCTL_RCC_MOSCVER 0x00000004 // Main osc. verification timer en +#define SYSCTL_RCC_IOSCDIS 0x00000002 // Internal oscillator disable +#define SYSCTL_RCC_MOSCDIS 0x00000001 // Main oscillator disable +#define SYSCTL_RCC_SYSDIV_SHIFT 23 // Shift to the SYSDIV field +#define SYSCTL_RCC_PWMDIV_SHIFT 17 // Shift to the PWMDIV field +#define SYSCTL_RCC_XTAL_SHIFT 6 // Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_SHIFT 4 // Shift to the OSCSRC field + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PLLCFG register. +// +//***************************************************************************** +#define SYSCTL_PLLCFG_OD_MASK 0x0000C000 // Output divider +#define SYSCTL_PLLCFG_OD_1 0x00000000 // Output divider is 1 +#define SYSCTL_PLLCFG_OD_2 0x00004000 // Output divider is 2 +#define SYSCTL_PLLCFG_OD_4 0x00008000 // Output divider is 4 +#define SYSCTL_PLLCFG_F_MASK 0x00003FE0 // PLL multiplier +#define SYSCTL_PLLCFG_R_MASK 0x0000001F // Input predivider +#define SYSCTL_PLLCFG_F_SHIFT 5 +#define SYSCTL_PLLCFG_R_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_CLKVCLR register. +// +//***************************************************************************** +#define SYSCTL_CLKVCLR_CLR 0x00000001 // Clear clock verification fault + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOARST register. +// +//***************************************************************************** +#define SYSCTL_LDOARST_ARST 0x00000001 // Allow LDO to reset device + +#endif // __HW_SYSCTL_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_timer.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_timer.h new file mode 100644 index 0000000..210c340 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_timer.h @@ -0,0 +1,235 @@ +//***************************************************************************** +// +// hw_timer.h - Defines and macros used when accessing the timer. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TIMER_H__ +#define __HW_TIMER_H__ + +//***************************************************************************** +// +// The following define the offsets of the timer registers. +// +//***************************************************************************** +#define TIMER_O_CFG 0x00000000 // Configuration register +#define TIMER_O_TAMR 0x00000004 // TimerA mode register +#define TIMER_O_TBMR 0x00000008 // TimerB mode register +#define TIMER_O_CTL 0x0000000C // Control register +#define TIMER_O_IMR 0x00000018 // Interrupt mask register +#define TIMER_O_RIS 0x0000001C // Interrupt status register +#define TIMER_O_MIS 0x00000020 // Masked interrupt status reg. +#define TIMER_O_ICR 0x00000024 // Interrupt clear register +#define TIMER_O_TAILR 0x00000028 // TimerA interval load register +#define TIMER_O_TBILR 0x0000002C // TimerB interval load register +#define TIMER_O_TAMATCHR 0x00000030 // TimerA match register +#define TIMER_O_TBMATCHR 0x00000034 // TimerB match register +#define TIMER_O_TAPR 0x00000038 // TimerA prescale register +#define TIMER_O_TBPR 0x0000003C // TimerB prescale register +#define TIMER_O_TAPMR 0x00000040 // TimerA prescale match register +#define TIMER_O_TBPMR 0x00000044 // TimerB prescale match register +#define TIMER_O_TAR 0x00000048 // TimerA register +#define TIMER_O_TBR 0x0000004C // TimerB register + +//***************************************************************************** +// +// The following define the reset values of the timer registers. +// +//***************************************************************************** +#define TIMER_RV_CFG 0x00000000 // Configuration register RV +#define TIMER_RV_TAMR 0x00000000 // TimerA mode register RV +#define TIMER_RV_TBMR 0x00000000 // TimerB mode register RV +#define TIMER_RV_CTL 0x00000000 // Control register RV +#define TIMER_RV_IMR 0x00000000 // Interrupt mask register RV +#define TIMER_RV_RIS 0x00000000 // Interrupt status register RV +#define TIMER_RV_MIS 0x00000000 // Masked interrupt status reg RV +#define TIMER_RV_ICR 0x00000000 // Interrupt clear register RV +#define TIMER_RV_TAILR 0xFFFFFFFF // TimerA interval load reg RV +#define TIMER_RV_TBILR 0x0000FFFF // TimerB interval load reg RV +#define TIMER_RV_TAMATCHR 0xFFFFFFFF // TimerA match register RV +#define TIMER_RV_TBMATCHR 0x0000FFFF // TimerB match register RV +#define TIMER_RV_TAPR 0x00000000 // TimerA prescale register RV +#define TIMER_RV_TBPR 0x00000000 // TimerB prescale register RV +#define TIMER_RV_TAPMR 0x00000000 // TimerA prescale match reg RV +#define TIMER_RV_TBPMR 0x00000000 // TimerB prescale match regi RV +#define TIMER_RV_TAR 0xFFFFFFFF // TimerA register RV +#define TIMER_RV_TBR 0x0000FFFF // TimerB register RV + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CFG register. +// +//***************************************************************************** +#define TIMER_CFG_CFG_MSK 0x00000007 // Configuration options mask +#define TIMER_CFG_16_BIT 0x00000004 // Two 16 bit timers +#define TIMER_CFG_32_BIT_RTC 0x00000001 // 32 bit RTC +#define TIMER_CFG_32_BIT_TIMER 0x00000000 // 32 bit timer + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TnMR register. +// +//***************************************************************************** +#define TIMER_TNMR_TNAMS 0x00000008 // Alternate mode select +#define TIMER_TNMR_TNCMR 0x00000004 // Capture mode - count or time +#define TIMER_TNMR_TNTMR_MSK 0x00000003 // Timer mode mask +#define TIMER_TNMR_TNTMR_CAP 0x00000003 // Mode - capture +#define TIMER_TNMR_TNTMR_PERIOD 0x00000002 // Mode - periodic +#define TIMER_TNMR_TNTMR_1_SHOT 0x00000001 // Mode - one shot + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CTL register. +// +//***************************************************************************** +#define TIMER_CTL_TBPWML 0x00004000 // TimerB PWM output level invert +#define TIMER_CTL_TBOTE 0x00002000 // TimerB output trigger enable +#define TIMER_CTL_TBEVENT_MSK 0x00000C00 // TimerB event mode mask +#define TIMER_CTL_TBEVENT_BOTH 0x00000C00 // TimerB event mode - both edges +#define TIMER_CTL_TBEVENT_NEG 0x00000400 // TimerB event mode - neg edge +#define TIMER_CTL_TBEVENT_POS 0x00000000 // TimerB event mode - pos edge +#define TIMER_CTL_TBSTALL 0x00000200 // TimerB stall enable +#define TIMER_CTL_TBEN 0x00000100 // TimerB enable +#define TIMER_CTL_TAPWML 0x00000040 // TimerA PWM output level invert +#define TIMER_CTL_TAOTE 0x00000020 // TimerA output trigger enable +#define TIMER_CTL_RTCEN 0x00000010 // RTC counter enable +#define TIMER_CTL_TAEVENT_MSK 0x0000000C // TimerA event mode mask +#define TIMER_CTL_TAEVENT_BOTH 0x0000000C // TimerA event mode - both edges +#define TIMER_CTL_TAEVENT_NEG 0x00000004 // TimerA event mode - neg edge +#define TIMER_CTL_TAEVENT_POS 0x00000000 // TimerA event mode - pos edge +#define TIMER_CTL_TASTALL 0x00000002 // TimerA stall enable +#define TIMER_CTL_TAEN 0x00000001 // TimerA enable + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_IMR register. +// +//***************************************************************************** +#define TIMER_IMR_CBEIM 0x00000400 // CaptureB event interrupt mask +#define TIMER_IMR_CBMIM 0x00000200 // CaptureB match interrupt mask +#define TIMER_IMR_TBTOIM 0x00000100 // TimerB time out interrupt mask +#define TIMER_IMR_RTCIM 0x00000008 // RTC interrupt mask +#define TIMER_IMR_CAEIM 0x00000004 // CaptureA event interrupt mask +#define TIMER_IMR_CAMIM 0x00000002 // CaptureA match interrupt mask +#define TIMER_IMR_TATOIM 0x00000001 // TimerA time out interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_RIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBERIS 0x00000400 // CaptureB event raw int status +#define TIMER_RIS_CBMRIS 0x00000200 // CaptureB match raw int status +#define TIMER_RIS_TBTORIS 0x00000100 // TimerB time out raw int status +#define TIMER_RIS_RTCRIS 0x00000008 // RTC raw int status +#define TIMER_RIS_CAERIS 0x00000004 // CaptureA event raw int status +#define TIMER_RIS_CAMRIS 0x00000002 // CaptureA match raw int status +#define TIMER_RIS_TATORIS 0x00000001 // TimerA time out raw int status + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_MIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBEMIS 0x00000400 // CaptureB event masked int status +#define TIMER_RIS_CBMMIS 0x00000200 // CaptureB match masked int status +#define TIMER_RIS_TBTOMIS 0x00000100 // TimerB time out masked int stat +#define TIMER_RIS_RTCMIS 0x00000008 // RTC masked int status +#define TIMER_RIS_CAEMIS 0x00000004 // CaptureA event masked int status +#define TIMER_RIS_CAMMIS 0x00000002 // CaptureA match masked int status +#define TIMER_RIS_TATOMIS 0x00000001 // TimerA time out masked int stat + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_ICR register. +// +//***************************************************************************** +#define TIMER_ICR_CBECINT 0x00000400 // CaptureB event interrupt clear +#define TIMER_ICR_CBMCINT 0x00000200 // CaptureB match interrupt clear +#define TIMER_ICR_TBTOCINT 0x00000100 // TimerB time out interrupt clear +#define TIMER_ICR_RTCCINT 0x00000008 // RTC interrupt clear +#define TIMER_ICR_CAECINT 0x00000004 // CaptureA event interrupt clear +#define TIMER_ICR_CAMCINT 0x00000002 // CaptureA match interrupt clear +#define TIMER_ICR_TATOCINT 0x00000001 // TimerA time out interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAILR register. +// +//***************************************************************************** +#define TIMER_TAILR_TAILRH 0xFFFF0000 // TimerB load val in 32 bit mode +#define TIMER_TAILR_TAILRL 0x0000FFFF // TimerA interval load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBILR register. +// +//***************************************************************************** +#define TIMER_TBILR_TBILRL 0x0000FFFF // TimerB interval load value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAMATCHR register. +// +//***************************************************************************** +#define TIMER_TAMATCHR_TAMRH 0xFFFF0000 // TimerB match val in 32 bit mode +#define TIMER_TAMATCHR_TAMRL 0x0000FFFF // TimerA match value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBMATCHR register. +// +//***************************************************************************** +#define TIMER_TBMATCHR_TBMRL 0x0000FFFF // TimerB match load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPR register. +// +//***************************************************************************** +#define TIMER_TNPR_TNPSR 0x000000FF // TimerN prescale value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPMR register. +// +//***************************************************************************** +#define TIMER_TNPMR_TNPSMR 0x000000FF // TimerN prescale match value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAR register. +// +//***************************************************************************** +#define TIMER_TAR_TARH 0xFFFF0000 // TimerB val in 32 bit mode +#define TIMER_TAR_TARL 0x0000FFFF // TimerA value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBR register. +// +//***************************************************************************** +#define TIMER_TBR_TBRL 0x0000FFFF // TimerB value + +#endif // __HW_TIMER_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_types.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_types.h new file mode 100644 index 0000000..ec05e54 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_types.h @@ -0,0 +1,67 @@ +//***************************************************************************** +// +// hw_types.h - Common types and macros. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TYPES_H__ +#define __HW_TYPES_H__ + +//***************************************************************************** +// +// Define a boolean type, and values for true and false. +// +//***************************************************************************** +typedef unsigned char tBoolean; + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +//***************************************************************************** +// +// Macros for hardware access, both direct and via the bit-band region. +// +//***************************************************************************** +#define HWREG(x) \ + (*((volatile unsigned long *)(x))) +#define HWREGH(x) \ + (*((volatile unsigned short *)(x))) +#define HWREGB(x) \ + (*((volatile unsigned char *)(x))) +#define HWREGBITW(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITH(x, b) \ + HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITB(x, b) \ + HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) + +#endif // __HW_TYPES_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_uart.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_uart.h new file mode 100644 index 0000000..6f421b6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_uart.h @@ -0,0 +1,239 @@ +//***************************************************************************** +// +// hw_uart.h - Macros and defines used when accessing the UART hardware +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_UART_H__ +#define __HW_UART_H__ + +//***************************************************************************** +// +// UART Register Offsets. +// +//***************************************************************************** +#define UART_O_DR 0x00000000 // Data Register +#define UART_O_RSR 0x00000004 // Receive Status Register (read) +#define UART_O_ECR 0x00000004 // Error Clear Register (write) +#define UART_O_FR 0x00000018 // Flag Register (read only) +#define UART_O_IBRD 0x00000024 // Integer Baud Rate Divisor Reg +#define UART_O_FBRD 0x00000028 // Fractional Baud Rate Divisor Reg +#define UART_O_LCR_H 0x0000002C // Line Control Register, HIGH byte +#define UART_O_CTL 0x00000030 // Control Register +#define UART_O_IFLS 0x00000034 // Interrupt FIFO Level Select Reg +#define UART_O_IM 0x00000038 // Interrupt Mask Set/Clear Reg +#define UART_O_RIS 0x0000003C // Raw Interrupt Status Register +#define UART_O_MIS 0x00000040 // Masked Interrupt Status Register +#define UART_O_ICR 0x00000044 // Interrupt Clear Register +#define UART_O_PeriphID4 0x00000FD0 // +#define UART_O_PeriphID5 0x00000FD4 // +#define UART_O_PeriphID6 0x00000FD8 // +#define UART_O_PeriphID7 0x00000FDC // +#define UART_O_PeriphID0 0x00000FE0 // +#define UART_O_PeriphID1 0x00000FE4 // +#define UART_O_PeriphID2 0x00000FE8 // +#define UART_O_PeriphID3 0x00000FEC // +#define UART_O_PCellID0 0x00000FF0 // +#define UART_O_PCellID1 0x00000FF4 // +#define UART_O_PCellID2 0x00000FF8 // +#define UART_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// Data Register bits +// +//***************************************************************************** +#define UART_DR_OE 0x00000800 // Overrun Error +#define UART_DR_BE 0x00000400 // Break Error +#define UART_DR_PE 0x00000200 // Parity Error +#define UART_DR_FE 0x00000100 // Framing Error +#define UART_DR_DATA_MASK 0x000000FF // UART data + +//***************************************************************************** +// +// Receive Status Register bits +// +//***************************************************************************** +#define UART_RSR_OE 0x00000008 // Overrun Error +#define UART_RSR_BE 0x00000004 // Break Error +#define UART_RSR_PE 0x00000002 // Parity Error +#define UART_RSR_FE 0x00000001 // Framing Error + +//***************************************************************************** +// +// Flag Register bits +// +//***************************************************************************** +#define UART_FR_TXFE 0x00000080 // TX FIFO Empty +#define UART_FR_RXFF 0x00000040 // RX FIFO Full +#define UART_FR_TXFF 0x00000020 // TX FIFO Full +#define UART_FR_RXFE 0x00000010 // RX FIFO Empty +#define UART_FR_BUSY 0x00000008 // UART Busy + +//***************************************************************************** +// +// Integer baud-rate divisor +// +//***************************************************************************** +#define UART_IBRD_DIVINT_MASK 0x0000FFFF // Integer baud-rate divisor + +//***************************************************************************** +// +// Fractional baud-rate divisor +// +//***************************************************************************** +#define UART_FBRD_DIVFRAC_MASK 0x0000003F // Fractional baud-rate divisor + +//***************************************************************************** +// +// Line Control Register High bits +// +//***************************************************************************** +#define UART_LCR_H_SPS 0x00000080 // Stick Parity Select +#define UART_LCR_H_WLEN 0x00000060 // Word length +#define UART_LCR_H_WLEN_8 0x00000060 // 8 bit data +#define UART_LCR_H_WLEN_7 0x00000040 // 7 bit data +#define UART_LCR_H_WLEN_6 0x00000020 // 6 bit data +#define UART_LCR_H_WLEN_5 0x00000000 // 5 bit data +#define UART_LCR_H_FEN 0x00000010 // Enable FIFO +#define UART_LCR_H_STP2 0x00000008 // Two Stop Bits Select +#define UART_LCR_H_EPS 0x00000004 // Even Parity Select +#define UART_LCR_H_PEN 0x00000002 // Parity Enable +#define UART_LCR_H_BRK 0x00000001 // Send Break + +//***************************************************************************** +// +// Control Register bits +// +//***************************************************************************** +#define UART_CTL_RXE 0x00000200 // Receive Enable +#define UART_CTL_TXE 0x00000100 // Transmit Enable +#define UART_CTL_LBE 0x00000080 // Loopback Enable +#define UART_CTL_UARTEN 0x00000001 // UART Enable + +//***************************************************************************** +// +// Interrupt FIFO Level Select Register bits +// +//***************************************************************************** +#define UART_IFLS_RX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_RX2_8 0x00000010 // 1/4 Full +#define UART_IFLS_RX4_8 0x00000020 // 1/2 Full +#define UART_IFLS_RX6_8 0x00000030 // 3/4 Full +#define UART_IFLS_RX7_8 0x00000040 // 7/8 Full +#define UART_IFLS_TX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_TX2_8 0x00000001 // 1/4 Full +#define UART_IFLS_TX4_8 0x00000002 // 1/2 Full +#define UART_IFLS_TX6_8 0x00000003 // 3/4 Full +#define UART_IFLS_TX7_8 0x00000004 // 7/8 Full + +//***************************************************************************** +// +// Interrupt Mask Set/Clear Register bits +// +//***************************************************************************** +#define UART_IM_OEIM 0x00000400 // Overrun Error Interrupt Mask +#define UART_IM_BEIM 0x00000200 // Break Error Interrupt Mask +#define UART_IM_PEIM 0x00000100 // Parity Error Interrupt Mask +#define UART_IM_FEIM 0x00000080 // Framing Error Interrupt Mask +#define UART_IM_RTIM 0x00000040 // Receive Timeout Interrupt Mask +#define UART_IM_TXIM 0x00000020 // Transmit Interrupt Mask +#define UART_IM_RXIM 0x00000010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Raw Interrupt Status Register +// +//***************************************************************************** +#define UART_RIS_OERIS 0x00000400 // Overrun Error Interrupt Status +#define UART_RIS_BERIS 0x00000200 // Break Error Interrupt Status +#define UART_RIS_PERIS 0x00000100 // Parity Error Interrupt Status +#define UART_RIS_FERIS 0x00000080 // Framing Error Interrupt Status +#define UART_RIS_RTRIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_RIS_TXRIS 0x00000020 // Transmit Interrupt Status +#define UART_RIS_RXRIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Masked Interrupt Status Register +// +//***************************************************************************** +#define UART_MIS_OEMIS 0x00000400 // Overrun Error Interrupt Status +#define UART_MIS_BEMIS 0x00000200 // Break Error Interrupt Status +#define UART_MIS_PEMIS 0x00000100 // Parity Error Interrupt Status +#define UART_MIS_FEMIS 0x00000080 // Framing Error Interrupt Status +#define UART_MIS_RTMIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_MIS_TXMIS 0x00000020 // Transmit Interrupt Status +#define UART_MIS_RXMIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Interrupt Clear Register bits +// +//***************************************************************************** +#define UART_ICR_OEIC 0x00000400 // Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x00000200 // Break Error Interrupt Clear +#define UART_ICR_PEIC 0x00000100 // Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x00000080 // Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x00000040 // Receive Timeout Interrupt Clear +#define UART_ICR_TXIC 0x00000020 // Transmit Interrupt Clear +#define UART_ICR_RXIC 0x00000010 // Receive Interrupt Clear + +#define UART_RSR_ANY (UART_RSR_OE | \ + UART_RSR_BE | \ + UART_RSR_PE | \ + UART_RSR_FE) + +//***************************************************************************** +// +// Reset Values for UART Registers. +// +//***************************************************************************** +#define UART_RV_DR 0x00000000 +#define UART_RV_RSR 0x00000000 +#define UART_RV_ECR 0x00000000 +#define UART_RV_FR 0x00000090 +#define UART_RV_IBRD 0x00000000 +#define UART_RV_FBRD 0x00000000 +#define UART_RV_LCR_H 0x00000000 +#define UART_RV_CTL 0x00000300 +#define UART_RV_IFLS 0x00000012 +#define UART_RV_IM 0x00000000 +#define UART_RV_RIS 0x00000000 +#define UART_RV_MIS 0x00000000 +#define UART_RV_ICR 0x00000000 +#define UART_RV_PeriphID4 0x00000000 +#define UART_RV_PeriphID5 0x00000000 +#define UART_RV_PeriphID6 0x00000000 +#define UART_RV_PeriphID7 0x00000000 +#define UART_RV_PeriphID0 0x00000011 +#define UART_RV_PeriphID1 0x00000000 +#define UART_RV_PeriphID2 0x00000018 +#define UART_RV_PeriphID3 0x00000001 +#define UART_RV_PCellID0 0x0000000D +#define UART_RV_PCellID1 0x000000F0 +#define UART_RV_PCellID2 0x00000005 +#define UART_RV_PCellID3 0x000000B1 + +#endif // __HW_UART_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_watchdog.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_watchdog.h new file mode 100644 index 0000000..2b013ad --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/hw_watchdog.h @@ -0,0 +1,116 @@ +//***************************************************************************** +// +// hw_watchdog.h - Macros used when accessing the Watchdog Timer hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_WATCHDOG_H__ +#define __HW_WATCHDOG_H__ + +//***************************************************************************** +// +// The following define the offsets of the Watchdog Timer registers. +// +//***************************************************************************** +#define WDT_O_LOAD 0x00000000 // Load register +#define WDT_O_VALUE 0x00000004 // Current value register +#define WDT_O_CTL 0x00000008 // Control register +#define WDT_O_ICR 0x0000000C // Interrupt clear register +#define WDT_O_RIS 0x00000010 // Raw interrupt status register +#define WDT_O_MIS 0x00000014 // Masked interrupt status register +#define WDT_O_TEST 0x00000418 // Test register +#define WDT_O_LOCK 0x00000C00 // Lock register +#define WDT_O_PeriphID4 0x00000FD0 // +#define WDT_O_PeriphID5 0x00000FD4 // +#define WDT_O_PeriphID6 0x00000FD8 // +#define WDT_O_PeriphID7 0x00000FDC // +#define WDT_O_PeriphID0 0x00000FE0 // +#define WDT_O_PeriphID1 0x00000FE4 // +#define WDT_O_PeriphID2 0x00000FE8 // +#define WDT_O_PeriphID3 0x00000FEC // +#define WDT_O_PCellID0 0x00000FF0 // +#define WDT_O_PCellID1 0x00000FF4 // +#define WDT_O_PCellID2 0x00000FF8 // +#define WDT_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the WDT_CTL register. +// +//***************************************************************************** +#define WDT_CTL_RESEN 0x00000002 // Enable reset output +#define WDT_CTL_INTEN 0x00000001 // Enable the WDT counter and int + +//***************************************************************************** +// +// The following define the bit fields in the WDT_ISR, WDT_RIS, and WDT_MIS +// registers. +// +//***************************************************************************** +#define WDT_INT_TIMEOUT 0x00000001 // Watchdog timer expired + +//***************************************************************************** +// +// The following define the bit fields in the WDT_TEST register. +// +//***************************************************************************** +#define WDT_TEST_STALL 0x00000100 // Watchdog stall enable +#ifndef DEPRECATED +#define WDT_TEST_STALL_EN 0x00000100 // Watchdog stall enable +#endif + +//***************************************************************************** +// +// The following define the bit fields in the WDT_LOCK register. +// +//***************************************************************************** +#define WDT_LOCK_LOCKED 0x00000001 // Watchdog timer is locked +#define WDT_LOCK_UNLOCKED 0x00000000 // Watchdog timer is unlocked +#define WDT_LOCK_UNLOCK 0x1ACCE551 // Unlocks the watchdog timer + +//***************************************************************************** +// +// The following define the reset values for the WDT registers. +// +//***************************************************************************** +#define WDT_RV_LOAD 0xFFFFFFFF // Load register +#define WDT_RV_VALUE 0xFFFFFFFF // Current value register +#define WDT_RV_CTL 0x00000000 // Control register +#define WDT_RV_RIS 0x00000000 // Raw interrupt status register +#define WDT_RV_MIS 0x00000000 // Masked interrupt status register +#define WDT_RV_LOCK 0x00000000 // Lock register +#define WDT_RV_PeriphID4 0x00000000 // +#define WDT_RV_PeriphID5 0x00000000 // +#define WDT_RV_PeriphID6 0x00000000 // +#define WDT_RV_PeriphID7 0x00000000 // +#define WDT_RV_PeriphID0 0x00000005 // +#define WDT_RV_PeriphID1 0x00000018 // +#define WDT_RV_PeriphID2 0x00000018 // +#define WDT_RV_PeriphID3 0x00000001 // +#define WDT_RV_PCellID0 0x0000000D // +#define WDT_RV_PCellID1 0x000000F0 // +#define WDT_RV_PCellID2 0x00000005 // +#define WDT_RV_PCellID3 0x000000B1 // + +#endif // __HW_WATCHDOG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/i2c.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/i2c.c new file mode 100644 index 0000000..b460ad6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/i2c.c @@ -0,0 +1,972 @@ +//***************************************************************************** +// +// i2c.c - Driver for Inter-IC (I2C) bus block. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup i2c_api +//! @{ +// +//***************************************************************************** + +#include "../hw_i2c.h" +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_types.h" +#include "debug.h" +#include "i2c.h" +#include "interrupt.h" +#include "sysctl.h" + +//***************************************************************************** +// +//! Initializes the I2C Master block. +//! +//! \param ulBase base address of the I2C Master module +//! \param bFast set up for fast data transfers +//! +//! This function initializes operation of the I2C Master block. Upon +//! successful initialization of the I2C block, this function will have +//! set the bus speed for the master, and will have enabled the I2C Master +//! block. +//! +//! If the parameter \e bFast is \b true, then the master block will be +//! set up to transfer data at 400 kbps; otherwise, it will be set up to +//! transfer data at 100 kbps. +//! +//! The I2C clocking is dependent upon the system clock rate returned by +//! SysCtlClockGet(); if it does not return the correct system clock rate then +//! the I2C clock rate will be incorrect. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterinit) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterInit(unsigned long ulBase, tBoolean bFast) +{ + unsigned long ulSysClk; + unsigned long ulSCLFreq; + unsigned long ulTPR; + + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Must enable the device before doing anything else. + // + I2CMasterEnable(ulBase); + + // + // Get the system clock speed. + // + ulSysClk = SysCtlClockGet(); + + // + // Get the desired SCL speed. + // + if(bFast == true) + { + ulSCLFreq = I2C_SCL_FAST; + } + else + { + ulSCLFreq = I2C_SCL_STANDARD; + } + + // + // Compute the clock divider that achieves the fastest speed less than or + // equal to the desired speed. The numerator is biases to favor a larger + // clock divider so that the resulting clock is always less than or equal + // to the desired clock, never greater. + // + ulTPR = (((ulSysClk + (2 * I2C_MASTER_TPR_SCL * ulSCLFreq) - 1) / + (2 * I2C_MASTER_TPR_SCL * ulSCLFreq)) - 1); + HWREG(ulBase + I2C_MASTER_O_TPR) = ulTPR; +} +#endif + +//***************************************************************************** +// +//! Initializes the I2C Slave block. +//! +//! \param ulBase base address of the I2C Slave module +//! \param ucSlaveAddr 7-bit slave address +//! +//! This function initializes operation of the I2C Slave block. Upon +//! successful initialization of the I2C blocks, this function will have +//! set the slave address and have enabled the I2C Slave block. +//! +//! The parameter \e ucSlaveAddr is the value that will be compared +//! against the slave address sent by an I2C master. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slaveinit) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveInit(unsigned long ulBase, unsigned char ucSlaveAddr) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + ASSERT(!(ucSlaveAddr & 0x80)); + + // + // Must enable the device before doing anything else. + // + I2CSlaveEnable(ulBase); + + // + // Set up the slave address. + // + HWREG(ulBase + I2C_SLAVE_O_OAR) = ucSlaveAddr; +} +#endif + +//***************************************************************************** +// +//! Enables the I2C Master block. +//! +//! \param ulBase base address of the I2C Master module +//! +//! This will enable operation of the I2C Master block. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Enable the master block. + // + HWREG(ulBase + I2C_MASTER_O_CR) |= I2C_MASTER_CR_MFE; +} +#endif + +//***************************************************************************** +// +//! Enables the I2C Slave block. +//! +//! \param ulBase base address of the I2C Slave module +//! +//! This will enable operation of the I2C Slave block. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slaveenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Enable the clock to the slave block. + // + HWREG(ulBase - I2C_O_SLAVE + I2C_MASTER_O_CR) |= I2C_MASTER_CR_SFE; + + // + // Enable the slave. + // + HWREG(ulBase + I2C_SLAVE_O_CSR) = I2C_SLAVE_CSR_DA; +} +#endif + +//***************************************************************************** +// +//! Disables the I2C master block. +//! +//! \param ulBase base address of the I2C Master module +//! +//! This will disable operation of the I2C master block. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Disable the master block. + // + HWREG(ulBase + I2C_MASTER_O_CR) &= ~(I2C_MASTER_CR_MFE); +} +#endif + +//***************************************************************************** +// +//! Disables the I2C slave block. +//! +//! \param ulBase base address of the I2C Slave module +//! +//! This will disable operation of the I2C slave block. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slavedisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Disable the slave. + // + HWREG(ulBase + I2C_SLAVE_O_CSR) = 0; + + // + // Disable the clock to the slave block. + // + HWREG(ulBase - I2C_O_SLAVE + I2C_MASTER_O_CR) &= ~(I2C_MASTER_CR_SFE); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the I2C module +//! +//! \param ulBase base address of the I2C module +//! \param pfnHandler is a pointer to the function to be called when the +//! synchronous serial interface interrupt occurs. +//! +//! This sets the handler to be called when an I2C interrupt occurs. This +//! will enable the global interrupt in the interrupt controller; specific I2C +//! interrupts must be enabled via I2CMasterIntEnable() and +//! I2CSlaveIntEnable(). If necessary, it is the interrupt handler's +//! responsibility to clear the interrupt source via I2CMasterIntClear() and +//! I2CSlaveIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CIntRegister(unsigned long ulBase, void (*pfnHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(INT_I2C, pfnHandler); + + // + // Enable the I2C interrupt. + // + IntEnable(INT_I2C); +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for the I2C module. +//! +//! \param ulBase base address of the I2C module +//! +//! This function will clear the handler to be called when an I2C +//! interrupt occurs. This will also mask off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CIntUnregister(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Disable the interrupt. + // + IntDisable(INT_I2C); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_I2C); +} +#endif + +//***************************************************************************** +// +//! Enables the I2C Master interrupt. +//! +//! \param ulBase base address of the I2C Master module +//! +//! Enables the I2C Master interrupt source. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterintenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterIntEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Enable the master interrupt. + // + HWREG(ulBase + I2C_MASTER_O_IMR) = 1; +} +#endif + +//***************************************************************************** +// +//! Enables the I2C Slave interrupt. +//! +//! \param ulBase base address of the I2C Slave module +//! +//! Enables the I2C Slave interrupt source. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slaveintenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveIntEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Enable the slave interrupt. + // + HWREG(ulBase + I2C_SLAVE_O_IM) = 1; +} +#endif + +//***************************************************************************** +// +//! Disables the I2C Master interrupt. +//! +//! \param ulBase base address of the I2C Master module +//! +//! Disables the I2C Master interrupt source. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterintdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterIntDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Disable the master interrupt. + // + HWREG(ulBase + I2C_MASTER_O_IMR) = 0; +} +#endif + +//***************************************************************************** +// +//! Disables the I2C Slave interrupt. +//! +//! \param ulBase base address of the I2C Slave module +//! +//! Disables the I2C Slave interrupt source. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slaveintdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveIntDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Disable the slave interrupt. + // + HWREG(ulBase + I2C_SLAVE_O_IM) = 0; +} +#endif + +//***************************************************************************** +// +//! Gets the current I2C Master interrupt status. +//! +//! \param ulBase base address of the I2C Master module +//! \param bMasked is false if the raw interrupt status is requested and +//! true if the masked interrupt status is requested. +//! +//! This returns the interrupt status for the I2C Master module. +//! Either the raw interrupt status or the status of interrupts that are +//! allowed to reflect to the processor can be returned. +//! +//! \return The current interrupt status, returned as \b true if active +//! or \b false if not active. +// +//***************************************************************************** +#if defined(GROUP_masterintstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +I2CMasterIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return((HWREG(ulBase + I2C_MASTER_O_MIS)) ? true : false); + } + else + { + return((HWREG(ulBase + I2C_MASTER_O_RIS)) ? true : false); + } +} +#endif + +//***************************************************************************** +// +//! Gets the current I2C Slave interrupt status. +//! +//! \param ulBase base address of the I2C Slave module +//! \param bMasked is false if the raw interrupt status is requested and +//! true if the masked interrupt status is requested. +//! +//! This returns the interrupt status for the I2C Slave module. +//! Either the raw interrupt status or the status of interrupts that are +//! allowed to reflect to the processor can be returned. +//! +//! \return The current interrupt status, returned as \b true if active +//! or \b false if not active. +// +//***************************************************************************** +#if defined(GROUP_slaveintstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +I2CSlaveIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return((HWREG(ulBase + I2C_SLAVE_O_MIS)) ? true : false); + } + else + { + return((HWREG(ulBase + I2C_SLAVE_O_RIS)) ? true : false); + } +} +#endif + +//***************************************************************************** +// +//! Clears I2C Master interrupt sources. +//! +//! \param ulBase base address of the I2C Master module +//! +//! The I2C Master interrupt source is cleared, so that it no longer asserts. +//! This must be done in the interrupt handler to keep it from being called +//! again immediately upon exit. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterintclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterIntClear(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Clear the I2C master interrupt source. + // + HWREG(ulBase + I2C_MASTER_O_MICR) = I2C_MASTER_MICR_IC; + + // + // Workaround for I2C master interrupt clear errata for rev B Stellaris + // devices. For later devices, this write is ignored and therefore + // harmless (other than the slight performance hit). + // + HWREG(ulBase + I2C_MASTER_O_MIS) = I2C_MASTER_MICR_IC; +} +#endif + +//***************************************************************************** +// +//! Clears I2C Slave interrupt sources. +//! +//! \param ulBase base address of the I2C Slave module +//! +//! The I2C Slave interrupt source is cleared, so that it no longer asserts. +//! This must be done in the interrupt handler to keep it from being called +//! again immediately upon exit. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slaveintclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveIntClear(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Clear the I2C slave interrupt source. + // + HWREG(ulBase + I2C_SLAVE_O_SICR) = I2C_SLAVE_SICR_IC; +} +#endif + +//***************************************************************************** +// +//! Sets the address that the I2C Master will place on the bus. +//! +//! \param ulBase base address of the I2C Master module +//! \param ucSlaveAddr 7-bit slave address +//! \param bReceive flag indicating the type of communication with the slave +//! +//! This function will set the address that the I2C Master will place on the +//! bus when initiating a transaction. When the parameter \e bReceive is set +//! to \b true, the address will indicate that the I2C Master is initiating +//! a read from the slave; otherwise the address will indicate that the I2C +//! Master is initiating a write to the slave. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterslaveaddrset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterSlaveAddrSet(unsigned long ulBase, unsigned char ucSlaveAddr, + tBoolean bReceive) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + ASSERT(!(ucSlaveAddr & 0x80)); + + // + // Set the address of the slave with which the master will communicate. + // + HWREG(ulBase + I2C_MASTER_O_SA) = (ucSlaveAddr << 1) | bReceive; +} +#endif + +//***************************************************************************** +// +//! Indicates whether or not the I2C Master is busy. +//! +//! \param ulBase base address of the I2C Master module +//! +//! This function returns an indication of whether or not the I2C Master is +//! busy transmitting or receiving data. +//! +//! \return Returns \b true if the I2C Master is busy; otherwise, returns +//! \b false. +// +//***************************************************************************** +#if defined(GROUP_masterbusy) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +I2CMasterBusy(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Return the busy status. + // + if(HWREG(ulBase + I2C_MASTER_O_CS) & I2C_MASTER_CS_BUSY) + { + return(true); + } + else + { + return(false); + } +} +#endif + +//***************************************************************************** +// +//! Indicates whether or not the I2C bus is busy. +//! +//! \param ulBase base address of the I2C Master module +//! +//! This function returns an indication of whether or not the I2C bus is +//! busy. This function can be used in a multi-master environment to +//! determine if another master is currently using the bus. +//! +//! \return Returns \b true if the I2C bus is busy; otherwise, returns +//! \b false. +// +//***************************************************************************** +#if defined(GROUP_masterbusbusy) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +I2CMasterBusBusy(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Return the bus busy status. + // + if(HWREG(ulBase + I2C_MASTER_O_CS) & I2C_MASTER_CS_BUS_BUSY) + { + return(true); + } + else + { + return(false); + } +} +#endif + +//***************************************************************************** +// +//! Controls the state of the I2C Master module. +//! +//! \param ulBase base address of the I2C Master module +//! \param ulCmd command to be issued to the I2C Master module +//! +//! This function is used to control the state of the Master module send and +//! receive operations. The parameter \e ucCmd can be one of the following +//! values: +//! +//! - I2C_MASTER_CMD_SINGLE_SEND +//! - I2C_MASTER_CMD_SINGLE_RECEIVE +//! - I2C_MASTER_CMD_BURST_SEND_START +//! - I2C_MASTER_CMD_BURST_SEND_CONT +//! - I2C_MASTER_CMD_BURST_SEND_FINISH +//! - I2C_MASTER_CMD_BURST_SEND_ERROR_STOP +//! - I2C_MASTER_CMD_BURST_RECEIVE_START +//! - I2C_MASTER_CMD_BURST_RECEIVE_CONT +//! - I2C_MASTER_CMD_BURST_RECEIVE_FINISH +//! - I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_mastercontrol) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterControl(unsigned long ulBase, unsigned long ulCmd) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + ASSERT((ulCmd == I2C_MASTER_CMD_SINGLE_SEND) || + (ulCmd == I2C_MASTER_CMD_SINGLE_RECEIVE) || + (ulCmd == I2C_MASTER_CMD_BURST_SEND_START) || + (ulCmd == I2C_MASTER_CMD_BURST_SEND_CONT) || + (ulCmd == I2C_MASTER_CMD_BURST_SEND_FINISH) || + (ulCmd == I2C_MASTER_CMD_BURST_SEND_ERROR_STOP) || + (ulCmd == I2C_MASTER_CMD_BURST_RECEIVE_START) || + (ulCmd == I2C_MASTER_CMD_BURST_RECEIVE_CONT) || + (ulCmd == I2C_MASTER_CMD_BURST_RECEIVE_FINISH) || + (ulCmd == I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP)); + + // + // Send the command. + // + HWREG(ulBase + I2C_MASTER_O_CS) = ulCmd; +} +#endif + +//***************************************************************************** +// +//! Gets the error status of the I2C Master module. +//! +//! \param ulBase base address of the I2C Master module +//! +//! This function is used to obtain the error status of the Master module +//! send and receive operations. It returns one of the following values: +//! +//! - I2C_MASTER_ERR_NONE +//! - I2C_MASTER_ERR_ADDR_ACK +//! - I2C_MASTER_ERR_DATA_ACK +//! - I2C_MASTER_ERR_ARB_LOST +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_mastererr) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +I2CMasterErr(unsigned long ulBase) +{ + unsigned long ulErr; + + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Get the raw error state + // + ulErr = HWREG(ulBase + I2C_MASTER_O_CS); + + // + // If the I2C master is busy, then all the other bit are invalid, and + // don't have an error to report. + // + if(ulErr & I2C_MASTER_CS_BUSY) + { + return(I2C_MASTER_ERR_NONE); + } + + // + // Check for errors. + // + if(ulErr & I2C_MASTER_CS_ERROR) + { + return(ulErr & (I2C_MASTER_CS_ERR_MASK)); + } + else + { + return(I2C_MASTER_ERR_NONE); + } +} +#endif + +//***************************************************************************** +// +//! Transmits a byte from the I2C Master. +//! +//! \param ulBase base address of the I2C Master module +//! \param ucData data to be transmitted from the I2C Master +//! +//! This function will place the supplied data into I2C Master Data Register. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterdataput) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CMasterDataPut(unsigned long ulBase, unsigned char ucData) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Write the byte. + // + HWREG(ulBase + I2C_MASTER_O_DR) = ucData; +} +#endif + +//***************************************************************************** +// +//! Receives a byte that has been sent to the I2C Master. +//! +//! \param ulBase base address of the I2C Master module +//! +//! This function reads a byte of data from the I2C Master Data Register. +//! +//! \return Returns the byte received from by the I2C Master, cast as an +//! unsigned long. +// +//***************************************************************************** +#if defined(GROUP_masterdataget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +I2CMasterDataGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_MASTER_BASE); + + // + // Read a byte. + // + return(HWREG(ulBase + I2C_MASTER_O_DR)); +} +#endif + +//***************************************************************************** +// +//! Gets the I2C Slave module status +//! +//! \param ulBase base address of the I2C Slave module +//! +//! This function will return the action requested from a master, if any. The +//! possible values returned are: +//! +//! - I2C_SLAVE_ACT_NONE +//! - I2C_SLAVE_ACT_RREQ +//! - I2C_SLAVE_ACT_TREQ +//! +//! where I2C_SLAVE_ACT_NONE means that no action has been requested of the +//! I2C Slave module, I2C_SLAVE_ACT_RREQ means that an I2C master has sent +//! data to the I2C Slave module, and I2C_SLAVE_ACT_TREQ means that an I2C +//! master has requested that the I2C Slave module send data. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slavestatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +I2CSlaveStatus(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Return the slave status. + // + return(HWREG(ulBase + I2C_SLAVE_O_CSR)); +} +#endif + +//***************************************************************************** +// +//! Transmits a byte from the I2C Slave. +//! +//! \param ulBase base address of the I2C Slave module +//! \param ucData data to be transmitted from the I2C Slave +//! +//! This function will place the supplied data into I2C Slave Data Register. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_slavedataput) || defined(BUILD_ALL) || defined(DOXYGEN) +void +I2CSlaveDataPut(unsigned long ulBase, unsigned char ucData) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Write the byte. + // + HWREG(ulBase + I2C_SLAVE_O_DR) = ucData; +} +#endif + +//***************************************************************************** +// +//! Receives a byte that has been sent to the I2C Slave. +//! +//! \param ulBase base address of the I2C Slave module +//! +//! This function reads a byte of data from the I2C Slave Data Register. +//! +//! \return Returns the byte received from by the I2C Slave, cast as an +//! unsigned long. +// +//***************************************************************************** +#if defined(GROUP_slavedataget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +I2CSlaveDataGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == I2C_SLAVE_BASE); + + // + // Read a byte. + // + return(HWREG(ulBase + I2C_SLAVE_O_DR)); +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/i2c.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/i2c.h new file mode 100644 index 0000000..a9b4ad9 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/i2c.h @@ -0,0 +1,139 @@ +//***************************************************************************** +// +// i2c.h - Prototypes for the I2C Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Interrupt defines. +// +//***************************************************************************** +#define I2C_INT_MASTER 0x00000001 +#define I2C_INT_SLAVE 0x00000002 + +//***************************************************************************** +// +// I2C Master commands. +// +//***************************************************************************** +#define I2C_MASTER_CMD_SINGLE_SEND \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_SINGLE_RECEIVE \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_START \ + (I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_CONT \ + (I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_ERROR_STOP \ + (I2C_MASTER_CS_STOP) +#define I2C_MASTER_CMD_BURST_RECEIVE_START \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_CONT \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) + +//***************************************************************************** +// +// I2C Master error status. +// +//***************************************************************************** +#define I2C_MASTER_ERR_NONE 0 +#define I2C_MASTER_ERR_ADDR_ACK 0x00000004 +#define I2C_MASTER_ERR_DATA_ACK 0x00000008 +#define I2C_MASTER_ERR_ARB_LOST 0x00000010 + +//***************************************************************************** +// +// I2C Slave action requests +// +//***************************************************************************** +#define I2C_SLAVE_ACT_NONE 0 +#define I2C_SLAVE_ACT_RREQ 0x00000001 // Master has sent data +#define I2C_SLAVE_ACT_TREQ 0x00000002 // Master has requested data + +//***************************************************************************** +// Miscellaneous I2C driver definitions. +//***************************************************************************** +#define I2C_MASTER_MAX_RETRIES 1000 // Number of retries + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void I2CIntRegister(unsigned long ulBase, void(fnHandler)(void)); +extern void I2CIntUnregister(unsigned long ulBase); +extern tBoolean I2CMasterBusBusy(unsigned long ulBase); +extern tBoolean I2CMasterBusy(unsigned long ulBase); +extern void I2CMasterControl(unsigned long ulBase, unsigned long ulCmd); +extern unsigned long I2CMasterDataGet(unsigned long ulBase); +extern void I2CMasterDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CMasterDisable(unsigned long ulBase); +extern void I2CMasterEnable(unsigned long ulBase); +extern unsigned long I2CMasterErr(unsigned long ulBase); +extern void I2CMasterInit(unsigned long ulBase, tBoolean bFast); +extern void I2CMasterIntClear(unsigned long ulBase); +extern void I2CMasterIntDisable(unsigned long ulBase); +extern void I2CMasterIntEnable(unsigned long ulBase); +extern tBoolean I2CMasterIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void I2CMasterSlaveAddrSet(unsigned long ulBase, + unsigned char ucSlaveAddr, + tBoolean bReceive); +extern unsigned long I2CSlaveDataGet(unsigned long ulBase); +extern void I2CSlaveDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CSlaveDisable(unsigned long ulBase); +extern void I2CSlaveEnable(unsigned long ulBase); +extern void I2CSlaveInit(unsigned long ulBase, unsigned char ucSlaveAddr); +extern void I2CSlaveIntClear(unsigned long ulBase); +extern void I2CSlaveIntDisable(unsigned long ulBase); +extern void I2CSlaveIntEnable(unsigned long ulBase); +extern tBoolean I2CSlaveIntStatus(unsigned long ulBase, tBoolean bMasked); +extern unsigned long I2CSlaveStatus(unsigned long ulBase); +extern void I2CMasterInitExpClk(unsigned long ulBase, unsigned long ulI2CClk, + tBoolean bFast); + +#ifdef __cplusplus +} +#endif + +#endif // __I2C_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/interrupt.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/interrupt.c new file mode 100644 index 0000000..7224a05 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/interrupt.c @@ -0,0 +1,552 @@ +//***************************************************************************** +// +// interrupt.c - Driver for the NVIC Interrupt Controller. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup interrupt_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_nvic.h" +#include "../hw_types.h" +#include "cpu.h" +#include "debug.h" +#include "interrupt.h" + +//***************************************************************************** +// +// This is a mapping between priority grouping encodings and the number of +// preemption priority bits. +// +//***************************************************************************** +#if defined(GROUP_pulpriority) || defined(BUILD_ALL) +const unsigned long g_pulPriority[] = +{ + NVIC_APINT_PRIGROUP_0_8, NVIC_APINT_PRIGROUP_1_7, NVIC_APINT_PRIGROUP_2_6, + NVIC_APINT_PRIGROUP_3_5, NVIC_APINT_PRIGROUP_4_4, NVIC_APINT_PRIGROUP_5_3, + NVIC_APINT_PRIGROUP_6_2, NVIC_APINT_PRIGROUP_7_1 +}; +#else +extern const unsigned long g_pulPriority[]; +#endif + +//***************************************************************************** +// +// This is a mapping between interrupt number and the register that contains +// the priority encoding for that interrupt. +// +//***************************************************************************** +#if defined(GROUP_pulregs) || defined(BUILD_ALL) +const unsigned long g_pulRegs[12] = +{ + 0, NVIC_SYS_PRI1, NVIC_SYS_PRI2, NVIC_SYS_PRI3, NVIC_PRI0, NVIC_PRI1, + NVIC_PRI2, NVIC_PRI3, NVIC_PRI4, NVIC_PRI5, NVIC_PRI6, NVIC_PRI7 +}; +#else +extern const unsigned long g_pulRegs[12]; +#endif + +//***************************************************************************** +// +//! \internal +//! The default interrupt handler. +//! +//! This is the default interrupt handler for all interrupts. It simply loops +//! forever so that the system state is preserved for observation by a +//! debugger. Since interrupts should be disabled before unregistering the +//! corresponding handler, this should never be called. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_defaulthandler) || defined(BUILD_ALL) +void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} +#else +extern void IntDefaultHandler(void); +#endif + +//***************************************************************************** +// +// The processor vector table. +// +// This contains a list of the handlers for the various interrupt sources in +// the system. The layout of this list is defined by the hardware; assertion +// of an interrupt causes the processor to start executing directly at the +// address given in the corresponding location in this list. +// +//***************************************************************************** +#if defined(GROUP_vtable) || defined(BUILD_ALL) +#ifdef ewarm +__no_init void (*g_pfnRAMVectors[NUM_INTERRUPTS])(void) @ "VTABLE"; +#else +__attribute__((section("vtable"))) +void (*g_pfnRAMVectors[NUM_INTERRUPTS])(void); +#endif +#else +extern void (*g_pfnRAMVectors[NUM_INTERRUPTS])(void); +#endif + +//***************************************************************************** +// +//! Enables the processor interrupt. +//! +//! Allows the processor to respond to interrupts. This does not affect the +//! set of interrupts enabled in the interrupt controller; it just gates the +//! single interrupt from the controller to the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntMasterEnable(void) +{ + // + // Enable processor interrupts. + // + CPUcpsie(); +} +#endif + +//***************************************************************************** +// +//! Disables the processor interrupt. +//! +//! Prevents the processor from receiving interrupts. This does not affect the +//! set of interrupts enabled in the interrupt controller; it just gates the +//! single interrupt from the controller to the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_masterdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntMasterDisable(void) +{ + // + // Disable processor interrupts. + // + CPUcpsid(); +} +#endif + +//***************************************************************************** +// +//! Registers a function to be called when an interrupt occurs. +//! +//! \param ulInterrupt specifies the interrupt in question. +//! \param pfnHandler is a pointer to the function to be called. +//! +//! This function is used to specify the handler function to be called when the +//! given interrupt is asserted to the processor. When the interrupt occurs, +//! if it is enabled (via IntEnable()), the handler function will be called in +//! interrupt context. Since the handler function can preempt other code, care +//! must be taken to protect memory or peripherals that are accessed by the +//! handler and other non-handler code. +//! +//! \note The use of this function (directly or indirectly via a peripheral +//! driver interrupt register function) moves the interrupt vector table from +//! flash to SRAM. Therefore, care must be taken when linking the application +//! to ensure that the SRAM vector table is located at the beginning of SRAM; +//! otherwise NVIC will not look in the correct portion of memory for the +//! vector table (it requires the vector table be on a 1 kB memory alignment). +//! Normally, the SRAM vector table is so placed via the use of linker scripts; +//! some tool chains, such as the evaluation version of RV-MDK, do not support +//! linker scripts and therefore will not produce a valid executable. See the +//! discussion of compile-time versus run-time interrupt handler registration +//! in the introduction to this chapter. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_register) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)) +{ + unsigned long ulIdx; + + // + // Check the arguments. + // + ASSERT(ulInterrupt < NUM_INTERRUPTS); + + // + // Make sure that the RAM vector table is correctly aligned. + // + ASSERT(((unsigned long)g_pfnRAMVectors & 0x000003ff) == 0); + + // + // See if the RAM vector table has been initialized. + // + if(HWREG(NVIC_VTABLE) != (unsigned long)g_pfnRAMVectors) + { + // + // Copy the vector table from the beginning of FLASH to the RAM vector + // table. + // + for(ulIdx = 0; ulIdx < NUM_INTERRUPTS; ulIdx++) + { + g_pfnRAMVectors[ulIdx] = (void (*)(void))HWREG(ulIdx * 4); + } + + // + // Point NVIC at the RAM vector table. + // + HWREG(NVIC_VTABLE) = (unsigned long)g_pfnRAMVectors; + } + + // + // Save the interrupt handler. + // + g_pfnRAMVectors[ulInterrupt] = pfnHandler; +} +#endif + +//***************************************************************************** +// +//! Unregisters the function to be called when an interrupt occurs. +//! +//! \param ulInterrupt specifies the interrupt in question. +//! +//! This function is used to indicate that no handler should be called when the +//! given interrupt is asserted to the processor. The interrupt source will be +//! automatically disabled (via IntDisable()) if necessary. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_unregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntUnregister(unsigned long ulInterrupt) +{ + // + // Check the arguments. + // + ASSERT(ulInterrupt < NUM_INTERRUPTS); + + // + // Reset the interrupt handler. + // + g_pfnRAMVectors[ulInterrupt] = IntDefaultHandler; +} +#endif + +//***************************************************************************** +// +//! Sets the priority grouping of the interrupt controller. +//! +//! \param ulBits specifies the number of bits of preemptable priority. +//! +//! This function specifies the split between preemptable priority levels and +//! subpriority levels in the interrupt priority specification. The range of +//! the grouping values are dependent upon the hardware implementation; on +//! the Stellaris family it can range from 0 to 3. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_prioritygroupingset) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +IntPriorityGroupingSet(unsigned long ulBits) +{ + // + // Check the arguments. + // + ASSERT(ulBits < NUM_PRIORITY_BITS); + + // + // Set the priority grouping. + // + HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | g_pulPriority[ulBits]; +} +#endif + +//***************************************************************************** +// +//! Gets the priority grouping of the interrupt controller. +//! +//! This function returns the split between preemptable priority levels and +//! subpriority levels in the interrupt priority specification. +//! +//! \return The number of bits of preemptable priority. +// +//***************************************************************************** +#if defined(GROUP_prioritygroupingget) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +unsigned long +IntPriorityGroupingGet(void) +{ + unsigned long ulLoop, ulValue; + + // + // Read the priority grouping. + // + ulValue = HWREG(NVIC_APINT) & NVIC_APINT_PRIGROUP_M; + + // + // Loop through the priority grouping values. + // + for(ulLoop = 0; ulLoop < 8; ulLoop++) + { + // + // Stop looping if this value matches. + // + if(ulValue == g_pulPriority[ulLoop]) + { + break; + } + } + + // + // Return the number of priority bits. + // + return(ulLoop); +} +#endif + +//***************************************************************************** +// +//! Sets the priority of an interrupt. +//! +//! \param ulInterrupt specifies the interrupt in question. +//! \param ucPriority specifies the priority of the interrupt. +//! +//! This function is used to set the priority of an interrupt. When multiple +//! interrupts are asserted simultaneously, the ones with the highest priority +//! are processed before the lower priority interrupts. Smaller numbers +//! correspond to higher interrupt priorities; priority 0 is the highest +//! interrupt priority. +//! +//! The hardware priority mechanism will only look at the upper N bits of the +//! priority level (where N is 3 for the Stellaris family), so any +//! prioritization must be performed in those bits. The remaining bits can be +//! used to sub-prioritize the interrupt sources, and may be used by the +//! hardware priority mechanism on a future part. This arrangement allows +//! priorities to migrate to different NVIC implementations without changing +//! the gross prioritization of the interrupts. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_priorityset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntPrioritySet(unsigned long ulInterrupt, unsigned char ucPriority) +{ + unsigned long ulTemp; + + // + // Check the arguments. + // + ASSERT((ulInterrupt >= 4) && (ulInterrupt < NUM_INTERRUPTS)); + + // + // Set the interrupt priority. + // + ulTemp = HWREG(g_pulRegs[ulInterrupt >> 2]); + ulTemp &= ~(0xFF << (8 * (ulInterrupt & 3))); + ulTemp |= ucPriority << (8 * (ulInterrupt & 3)); + HWREG(g_pulRegs[ulInterrupt >> 2]) = ulTemp; +} +#endif + +//***************************************************************************** +// +//! Gets the priority of an interrupt. +//! +//! \param ulInterrupt specifies the interrupt in question. +//! +//! This function gets the priority of an interrupt. See IntPrioritySet() for +//! a definition of the priority value. +//! +//! \return Returns the interrupt priority, or -1 if an invalid interrupt was +//! specified. +// +//***************************************************************************** +#if defined(GROUP_priorityget) || defined(BUILD_ALL) || defined(DOXYGEN) +long +IntPriorityGet(unsigned long ulInterrupt) +{ + // + // Check the arguments. + // + ASSERT((ulInterrupt >= 4) && (ulInterrupt < NUM_INTERRUPTS)); + + // + // Return the interrupt priority. + // + return((HWREG(g_pulRegs[ulInterrupt >> 2]) >> (8 * (ulInterrupt & 3))) & + 0xFF); +} +#endif + +//***************************************************************************** +// +//! Enables an interrupt. +//! +//! \param ulInterrupt specifies the interrupt to be enabled. +//! +//! The specified interrupt is enabled in the interrupt controller. Other +//! enables for the interrupt (such as at the peripheral level) are unaffected +//! by this function. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntEnable(unsigned long ulInterrupt) +{ + // + // Check the arguments. + // + ASSERT(ulInterrupt < NUM_INTERRUPTS); + + // + // Determine the interrupt to enable. + // + if(ulInterrupt == FAULT_MPU) + { + // + // Enable the MemManage interrupt. + // + HWREG(NVIC_SYS_HND_CTRL) |= NVIC_SYS_HND_CTRL_MEM; + } + else if(ulInterrupt == FAULT_BUS) + { + // + // Enable the bus fault interrupt. + // + HWREG(NVIC_SYS_HND_CTRL) |= NVIC_SYS_HND_CTRL_BUS; + } + else if(ulInterrupt == FAULT_USAGE) + { + // + // Enable the usage fault interrupt. + // + HWREG(NVIC_SYS_HND_CTRL) |= NVIC_SYS_HND_CTRL_USAGE; + } + else if(ulInterrupt == FAULT_SYSTICK) + { + // + // Enable the System Tick interrupt. + // + HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_INTEN; + } + else if(ulInterrupt >= INT_GPIOA) + { + // + // Enable the general interrupt. + // + HWREG(NVIC_EN0) = 1 << (ulInterrupt - INT_GPIOA); + } +} +#endif + +//***************************************************************************** +// +//! Disables an interrupt. +//! +//! \param ulInterrupt specifies the interrupt to be disabled. +//! +//! The specified interrupt is disabled in the interrupt controller. Other +//! enables for the interrupt (such as at the peripheral level) are unaffected +//! by this function. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_disable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +IntDisable(unsigned long ulInterrupt) +{ + // + // Check the arguments. + // + ASSERT(ulInterrupt < NUM_INTERRUPTS); + + // + // Determine the interrupt to disable. + // + if(ulInterrupt == FAULT_MPU) + { + // + // Disable the MemManage interrupt. + // + HWREG(NVIC_SYS_HND_CTRL) &= ~(NVIC_SYS_HND_CTRL_MEM); + } + else if(ulInterrupt == FAULT_BUS) + { + // + // Disable the bus fault interrupt. + // + HWREG(NVIC_SYS_HND_CTRL) &= ~(NVIC_SYS_HND_CTRL_BUS); + } + else if(ulInterrupt == FAULT_USAGE) + { + // + // Disable the usage fault interrupt. + // + HWREG(NVIC_SYS_HND_CTRL) &= ~(NVIC_SYS_HND_CTRL_USAGE); + } + else if(ulInterrupt == FAULT_SYSTICK) + { + // + // Disable the System Tick interrupt. + // + HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_INTEN); + } + else if(ulInterrupt >= INT_GPIOA) + { + // + // Disable the general interrupt. + // + HWREG(NVIC_DIS0) = 1 << (ulInterrupt - INT_GPIOA); + } +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/interrupt.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/interrupt.h new file mode 100644 index 0000000..37d414d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/interrupt.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// interrupt.h - Prototypes for the NVIC Interrupt Controller Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void IntMasterEnable(void); +extern void IntMasterDisable(void); +extern void IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)); +extern void IntUnregister(unsigned long ulInterrupt); +extern void IntPriorityGroupingSet(unsigned long ulBits); +extern unsigned long IntPriorityGroupingGet(void); +extern void IntPrioritySet(unsigned long ulInterrupt, + unsigned char ucPriority); +extern long IntPriorityGet(unsigned long ulInterrupt); +extern void IntEnable(unsigned long ulInterrupt); +extern void IntDisable(unsigned long ulInterrupt); + +#ifdef __cplusplus +} +#endif + +#endif // __INTERRUPT_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/osram96x16.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/osram96x16.c new file mode 100644 index 0000000..1af1b6c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/osram96x16.c @@ -0,0 +1,968 @@ +//***************************************************************************** +// +// osram96x16.c - Driver for the OSRAM 96x16 graphical OLED display. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ev_lm3s811_api +//! @{ +// +//***************************************************************************** + +#include "DriverLib.h" +#include "osram96x16.h" +#define ewarm +//***************************************************************************** +// +// The I2C slave address of the SSD0303 controller on the OLED display. +// +//***************************************************************************** +#define SSD0303_ADDR 0x3d + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +//***************************************************************************** +static const unsigned char g_pucFont[95][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD0303 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the I2C transfer, followed by that many bytes of command data. +// +//***************************************************************************** +static const unsigned char g_pucOSRAMInit[] = +{ + // + // Turn off the panel + // + 0x04, 0x80, 0xae, 0x80, 0xe3, + + // + // Set lower column address + // + 0x04, 0x80, 0x04, 0x80, 0xe3, + + // + // Set higher column address + // + 0x04, 0x80, 0x12, 0x80, 0xe3, + + // + // Set contrast control register + // + 0x06, 0x80, 0x81, 0x80, 0x2b, 0x80, 0xe3, + + // + // Set segment re-map + // + 0x04, 0x80, 0xa1, 0x80, 0xe3, + + // + // Set display start line + // + 0x04, 0x80, 0x40, 0x80, 0xe3, + + // + // Set display offset + // + 0x06, 0x80, 0xd3, 0x80, 0x00, 0x80, 0xe3, + + // + // Set multiplex ratio + // + 0x06, 0x80, 0xa8, 0x80, 0x0f, 0x80, 0xe3, + + // + // Set the display to normal mode + // + 0x04, 0x80, 0xa4, 0x80, 0xe3, + + // + // Non-inverted display + // + 0x04, 0x80, 0xa6, 0x80, 0xe3, + + // + // Set the page address + // + 0x04, 0x80, 0xb0, 0x80, 0xe3, + + // + // Set COM output scan direction + // + 0x04, 0x80, 0xc8, 0x80, 0xe3, + + // + // Set display clock divide ratio/oscillator frequency + // + 0x06, 0x80, 0xd5, 0x80, 0x72, 0x80, 0xe3, + + // + // Enable mono mode + // + 0x06, 0x80, 0xd8, 0x80, 0x00, 0x80, 0xe3, + + // + // Set pre-charge period + // + 0x06, 0x80, 0xd9, 0x80, 0x22, 0x80, 0xe3, + + // + // Set COM pins hardware configuration + // + 0x06, 0x80, 0xda, 0x80, 0x12, 0x80, 0xe3, + + // + // Set VCOM deslect level + // + 0x06, 0x80, 0xdb, 0x80, 0x0f, 0x80, 0xe3, + + // + // Set DC-DC on + // + 0x06, 0x80, 0xad, 0x80, 0x8b, 0x80, 0xe3, + + // + // Turn on the panel + // + 0x04, 0x80, 0xaf, 0x80, 0xe3, +}; + +//***************************************************************************** +// +// The inter-byte delay required by the SSD0303 OLED controller. +// +//***************************************************************************** +static unsigned long g_ulDelay; + +//***************************************************************************** +// +//! \internal +//! +//! Provide a small delay. +//! +//! \param ulCount is the number of delay loop iterations to perform. +//! +//! Since the SSD0303 controller needs a delay between bytes written to it over +//! the I2C bus, this function provides a means of generating that delay. It +//! is written in assembly to keep the delay consistent across tool chains, +//! avoiding the need to tune the delay based on the tool chain in use. +//! +//! \return None. +// +//***************************************************************************** +#if defined(ewarm) +static void +OSRAMDelay(unsigned long ulCount) +{ + __asm(" subs r0, #1\n" + " bne.n OSRAMDelay\n" + " bx lr"); +} +#endif +#if defined(gcc) +static void __attribute__((naked)) +OSRAMDelay(unsigned long ulCount) +{ + __asm(" subs r0, #1\n" + " bne OSRAMDelay\n" + " bx lr"); +} +#endif +#if defined(rvmdk) || defined(__ARMCC_VERSION) +__asm void +OSRAMDelay(unsigned long ulCount) +{ + subs r0, #1; + bne OSRAMDelay; + bx lr; +} +#endif + +//***************************************************************************** +// +//! \internal +//! +//! Start a transfer to the SSD0303 controller. +//! +//! \param ucChar is the first byte to be written to the controller. +//! +//! This function will start a transfer to the SSD0303 controller via the I2C +//! bus. +//! +//! The data is written in a polled fashion; this function will not return +//! until the byte has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteFirst(unsigned char ucChar) +{ + // + // Set the slave address. + // + I2CMasterSlaveAddrSet(I2C_MASTER_BASE, SSD0303_ADDR, false); + + // + // Write the first byte to the controller. + // + I2CMasterDataPut(I2C_MASTER_BASE, ucChar); + + // + // Start the transfer. + // + I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START); +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a byte to the SSD0303 controller. +//! +//! \param ucChar is the byte to be transmitted to the controller. +//! +//! This function continues a transfer to the SSD0303 controller by writing +//! another byte over the I2C bus. This must only be called after calling +//! OSRAMWriteFirst(), but before calling OSRAMWriteFinal(). +//! +//! The data is written in a polled faashion; this function will not return +//! until the byte has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteByte(unsigned char ucChar) +{ + // + // Wait until the current byte has been transferred. + // + while(I2CMasterIntStatus(I2C_MASTER_BASE, false) == 0) + { + } + + // + // Provide the required inter-byte delay. + // + OSRAMDelay(g_ulDelay); + + // + // Write the next byte to the controller. + // + I2CMasterDataPut(I2C_MASTER_BASE, ucChar); + + // + // Continue the transfer. + // + I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_CONT); +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of bytes to the SSD0303 controller. +//! +//! This function continues a transfer to the SSD0303 controller by writing a +//! sequence of bytes over the I2C bus. This must only be called after calling +//! OSRAMWriteFirst(), but before calling OSRAMWriteFinal(). +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteArray(const unsigned char *pucBuffer, unsigned long ulCount) +{ + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Wait until the current byte has been transferred. + // + while(I2CMasterIntStatus(I2C_MASTER_BASE, false) == 0) + { + } + + // + // Provide the required inter-byte delay. + // + OSRAMDelay(g_ulDelay); + + // + // Write the next byte to the controller. + // + I2CMasterDataPut(I2C_MASTER_BASE, *pucBuffer++); + ulCount--; + + // + // Continue the transfer. + // + I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_CONT); + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Finish a transfer to the SSD0303 controller. +//! +//! \param ucChar is the final byte to be written to the controller. +//! +//! This function will finish a transfer to the SSD0303 controller via the I2C +//! bus. This must only be called after calling OSRAMWriteFirst(). +//! +//! The data is written in a polled fashion; this function will not return +//! until the byte has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteFinal(unsigned char ucChar) +{ + // + // Wait until the current byte has been transferred. + // + while(I2CMasterIntStatus(I2C_MASTER_BASE, false) == 0) + { + } + + // + // Provide the required inter-byte delay. + // + OSRAMDelay(g_ulDelay); + + // + // Write the final byte to the controller. + // + I2CMasterDataPut(I2C_MASTER_BASE, ucChar); + + // + // Finish the transfer. + // + I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH); + + // + // Wait until the final byte has been transferred. + // + while(I2CMasterIntStatus(I2C_MASTER_BASE, false) == 0) + { + } + + // + // Provide the required inter-byte delay. + // + OSRAMDelay(g_ulDelay); +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display. All pixels in the display will be +//! turned off. +//! +//! This function is contained in osram96x16.c, with +//! osram96x16.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMClear(void) +{ + static const unsigned char pucRow1[] = + { + 0xb0, 0x80, 0x04, 0x80, 0x12, 0x40 + }; + static const unsigned char pucRow2[] = + { + 0xb1, 0x80, 0x04, 0x80, 0x12, 0x40 + }; + unsigned long ulIdx; + + // + // Move the display cursor to the first column of the first row. + // + OSRAMWriteFirst(0x80); + OSRAMWriteArray(pucRow1, sizeof(pucRow1)); + + // + // Fill this row with zeros. + // + for(ulIdx = 0; ulIdx < 95; ulIdx++) + { + OSRAMWriteByte(0x00); + } + OSRAMWriteFinal(0x00); + + // + // Move the display cursor to the first column of the second row. + // + OSRAMWriteFirst(0x80); + OSRAMWriteArray(pucRow2, sizeof(pucRow2)); + + // + // Fill this row with zeros. + // + for(ulIdx = 0; ulIdx < 95; ulIdx++) + { + OSRAMWriteByte(0x00); + } + OSRAMWriteFinal(0x00); +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! eight scan line blocks from the top of the display (i.e. only 0 and 1 are +//! valid). +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in osram96x16.c, with +//! osram96x16.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMStringDraw(const char *pcStr, unsigned long ulX, unsigned long ulY) +{ + // + // Check the arguments. + // + ASSERT(ulX < 96); + ASSERT(ulY < 2); + + // + // Move the display cursor to the requested position on the display. + // + OSRAMWriteFirst(0x80); + OSRAMWriteByte((ulY == 0) ? 0xb0 : 0xb1); + OSRAMWriteByte(0x80); + OSRAMWriteByte((ulX + 36) & 0x0f); + OSRAMWriteByte(0x80); + OSRAMWriteByte(0x10 | (((ulX + 36) >> 4) & 0x0f)); + OSRAMWriteByte(0x40); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // See if there is enough space on the display for this entire + // character. + // + if(ulX <= 90) + { + // + // Write the contents of this character to the display. + // + OSRAMWriteArray(g_pucFont[*pcStr - ' '], 5); + + // + // See if this is the last character to display (either because the + // right edge has been reached or because there are no more + // characters). + // + if((ulX == 90) || (pcStr[1] == 0)) + { + // + // Write the final column of the display. + // + OSRAMWriteFinal(0x00); + + // + // The string has been displayed. + // + return; + } + + // + // Write the inter-character padding column. + // + OSRAMWriteByte(0x00); + } + else + { + // + // Write the portion of the character that will fit onto the + // display. + // + OSRAMWriteArray(g_pucFont[*pcStr - ' '], 95 - ulX); + OSRAMWriteFinal(g_pucFont[*pcStr - ' '][95 - ulX]); + + // + // The string has been displayed. + // + return; + } + + // + // Advance to the next character. + // + pcStr++; + + // + // Increment the X coordinate by the six columns that were just + // written. + // + ulX += 6; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! eight scan line blocks from the top of the display (i.e. only 0 and 1 are +//! valid). +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in eight row blocks +//! (i.e. only 1 and 2 are valid). +//! +//! This function will display a bitmap graphic on the display. The image to +//! be displayed must be a multiple of eight scan lines high (i.e. one row) and +//! will be drawn at a vertical position that is a multiple of eight scan lines +//! (i.e. scan line zero or scan line eight, corresponding to row zero or row +//! one). +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for the eight scan lines of the column, with the top scan +//! line being in the least significant bit of the byte and the bottom scan +//! line being in the most significant bit of the byte. +//! +//! For example, an image four columns wide and sixteen scan lines tall would +//! be arranged as follows (showing how the eight bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------+ +-------+ +-------+ +-------+ +//! | | 0 | | | 0 | | | 0 | | | 0 | +//! | B | 1 | | B | 1 | | B | 1 | | B | 1 | +//! | y | 2 | | y | 2 | | y | 2 | | y | 2 | +//! | t | 3 | | t | 3 | | t | 3 | | t | 3 | +//! | e | 4 | | e | 4 | | e | 4 | | e | 4 | +//! | | 5 | | | 5 | | | 5 | | | 5 | +//! | 0 | 6 | | 1 | 6 | | 2 | 6 | | 3 | 6 | +//! | | 7 | | | 7 | | | 7 | | | 7 | +//! +-------+ +-------+ +-------+ +-------+ +//! +//! +-------+ +-------+ +-------+ +-------+ +//! | | 0 | | | 0 | | | 0 | | | 0 | +//! | B | 1 | | B | 1 | | B | 1 | | B | 1 | +//! | y | 2 | | y | 2 | | y | 2 | | y | 2 | +//! | t | 3 | | t | 3 | | t | 3 | | t | 3 | +//! | e | 4 | | e | 4 | | e | 4 | | e | 4 | +//! | | 5 | | | 5 | | | 5 | | | 5 | +//! | 4 | 6 | | 5 | 6 | | 6 | 6 | | 7 | 6 | +//! | | 7 | | | 7 | | | 7 | | | 7 | +//! +-------+ +-------+ +-------+ +-------+ +//! \endverbatim +//! +//! This function is contained in osram96x16.c, with +//! osram96x16.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + // + // Check the arguments. + // + ASSERT(ulX < 96); + ASSERT(ulY < 2); + ASSERT((ulX + ulWidth) <= 96); + ASSERT((ulY + ulHeight) <= 2); + + // + // The first 36 columns of the LCD buffer are not displayed, so increment + // the X coorddinate by 36 to account for the non-displayed frame buffer + // memory. + // + ulX += 36; + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write the starting address within this row. + // + OSRAMWriteFirst(0x80); + OSRAMWriteByte((ulY == 0) ? 0xb0 : 0xb1); + OSRAMWriteByte(0x80); + OSRAMWriteByte(ulX & 0x0f); + OSRAMWriteByte(0x80); + OSRAMWriteByte(0x10 | ((ulX >> 4) & 0x0f)); + OSRAMWriteByte(0x40); + + // + // Write this row of image data. + // + OSRAMWriteArray(pucImage, ulWidth - 1); + OSRAMWriteFinal(pucImage[ulWidth - 1]); + + // + // Advance to the next row of the image. + // + pucImage += ulWidth; + ulY++; + } +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param bFast is a boolean that is \e true if the I2C interface should be +//! run at 400 kbps and \e false if it should be run at 100 kbps. +//! +//! This function initializes the I2C interface to the OLED display and +//! configures the SSD0303 controller on the panel. +//! +//! This function is contained in osram96x16.c, with +//! osram96x16.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMInit(tBoolean bFast) +{ + unsigned long ulIdx; + + // + // Enable the I2C and GPIO port B blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + + // + // Configure the I2C SCL and SDA pins for I2C operation. + // + GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3); + + // + // Initialize the I2C master. + // + I2CMasterInitExpClk(I2C_MASTER_BASE, SysCtlClockGet(), bFast); + + // + // Compute the inter-byte delay for the SSD0303 controller. This delay is + // dependent upon the I2C bus clock rate; the slower the clock the longer + // the delay required. + // + // The derivation of this formula is based on a measured delay of + // OSRAMDelay(1700) for a 100 kHz I2C bus with the CPU running at 50 MHz + // (referred to as C). To scale this to the delay for a different CPU + // speed (since this is just a CPU-based delay loop) is: + // + // f(CPU) + // C * ---------- + // 50,000,000 + // + // To then scale this to the actual I2C rate (since it won't always be + // precisely 100 kHz): + // + // f(CPU) 100,000 + // C * ---------- * ------- + // 50,000,000 f(I2C) + // + // This equation will give the inter-byte delay required for any + // configuration of the I2C master. But, as arranged it is impossible to + // directly compute in 32-bit arithmetic (without loosing a lot of + // accuracy). So, the equation is simplified. + // + // Since f(I2C) is generated by dividing down from f(CPU), replace it with + // the equivalent (where TPR is the value programmed into the Master Timer + // Period Register of the I2C master, with the 1 added back): + // + // 100,000 + // f(CPU) ------- + // C * ---------- * f(CPU) + // 50,000,000 ------------ + // 2 * 10 * TPR + // + // Inverting the dividend in the last term: + // + // f(CPU) 100,000 * 2 * 10 * TPR + // C * ---------- * ---------------------- + // 50,000,000 f(CPU) + // + // The f(CPU) now cancels out. + // + // 100,000 * 2 * 10 * TPR + // C * ---------------------- + // 50,000,000 + // + // Since there are no clock frequencies left in the equation, this equation + // also works for 400 kHz bus operation as well, since the 100,000 in the + // numerator becomes 400,000 but C is 1/4, which cancel out each other. + // Reducing the constants gives: + // + // TPR TPR TPR + // C * --- = 1700 * --- = 340 * --- = 68 * TPR + // 25 25 5 + // + // Note that the constant C is actually a bit larger than it needs to be in + // order to provide some safety margin. + // + g_ulDelay = 68 * (HWREG(I2C_MASTER_BASE + I2C_MASTER_O_TPR) + 1); + + // + // Initialize the SSD0303 controller. Loop through the initialization + // sequence doing a single I2C transfer for each command. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAMInit); + ulIdx += g_pucOSRAMInit[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteFirst(g_pucOSRAMInit[ulIdx + 1]); + OSRAMWriteArray(g_pucOSRAMInit + ulIdx + 2, g_pucOSRAMInit[ulIdx] - 2); + OSRAMWriteFinal(g_pucOSRAMInit[ulIdx + g_pucOSRAMInit[ulIdx]]); + } + + // + // Clear the frame buffer. + // + OSRAMClear(); +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in osram96x16.c, with +//! osram96x16.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMDisplayOn(void) +{ + unsigned long ulIdx; + + // + // Re-initialize the SSD0303 controller. Loop through the initialization + // sequence doing a single I2C transfer for each command. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAMInit); + ulIdx += g_pucOSRAMInit[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteFirst(g_pucOSRAMInit[ulIdx + 1]); + OSRAMWriteArray(g_pucOSRAMInit + ulIdx + 2, g_pucOSRAMInit[ulIdx] - 2); + OSRAMWriteFinal(g_pucOSRAMInit[ulIdx + g_pucOSRAMInit[ulIdx]]); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in osram96x16.c, with +//! osram96x16.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMDisplayOff(void) +{ + // + // Turn off the DC-DC converter and the display. + // + OSRAMWriteFirst(0x80); + OSRAMWriteByte(0xae); + OSRAMWriteByte(0x80); + OSRAMWriteByte(0xad); + OSRAMWriteByte(0x80); + OSRAMWriteFinal(0x8a); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/osram96x16.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/osram96x16.h new file mode 100644 index 0000000..0c9cd36 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/osram96x16.h @@ -0,0 +1,47 @@ +//***************************************************************************** +// +// osram96x16.h - Prototypes for the driver for the OSRAM 96x16 graphical OLED +// display. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __OSRAM96X16_H__ +#define __OSRAM96X16_H__ + +//***************************************************************************** +// +// Prototypes for the driver APIs. +// +//***************************************************************************** +extern void OSRAMClear(void); +extern void OSRAMStringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY); +extern void OSRAMImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight); +extern void OSRAMInit(tBoolean bFast); +extern void OSRAMDisplayOn(void); +extern void OSRAMDisplayOff(void); + +#endif // __OSRAM96X16_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/pwm.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/pwm.c new file mode 100644 index 0000000..6697566 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/pwm.c @@ -0,0 +1,1291 @@ +//***************************************************************************** +// +// pwm.c - API for the PWM modules +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup pwm_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_pwm.h" +#include "../hw_types.h" +#include "debug.h" +#include "interrupt.h" +#include "pwm.h" + +//***************************************************************************** +// +// Misc macros for manipulating the encoded generator and output defines used +// by the API. +// +//***************************************************************************** +#define PWM_GEN_BADDR(_mod_, _gen_) \ + ((_mod_) + (_gen_)) +#define PWM_OUT_BADDR(_mod_, _out_) \ + ((_mod_) + ((_out_) & 0xFFFFFFC0)) +#define PWM_IS_OUTPUT_ODD(_out_) \ + ((_out_) & 0x00000001) + +//***************************************************************************** +// +//! Configures a PWM generator. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to configure. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param ulConfig is the configuration for the PWM generator. +//! +//! This function is used to set the mode of operation for a PWM generator. +//! The counting mode, synchronization mode, and debug behavior are all +//! configured. After configuration, the generator is left in the disabled +//! state. +//! +//! A PWM generator can count in two different modes: count down mode or count +//! up/down mode. In count down mode, it will count from a value down to zero, +//! and then reset to the preset value. This will produce left-aligned PWM +//! signals (i.e. the rising edge of the two PWM signals produced by the +//! generator will occur at the same time). In count up/down mode, it will +//! count up from zero to the preset value, count back down to zero, and then +//! repeat the process. This will produce center-aligned PWM signals (i.e. the +//! middle of the high/low period of the PWM signals produced by the generator +//! will occur at the same time). +//! +//! When the PWM generator parameters (period and pulse width) are modified, +//! their affect on the output PWM signals can be delayed. In synchronous +//! mode, the parameter updates are not applied until a synchronization event +//! occurs. This allows multiple parameters to be modified and take affect +//! simultaneously, instead of one at a time. Additionally, parameters to +//! multiple PWM generators in synchronous mode can be updated simultaneously, +//! allowing them to be treated as if they were a unified generator. In +//! non-synchronous mode, the parameter updates are not delayed until a +//! synchronization event. In either mode, the parameter updates only occur +//! when the counter is at zero to help prevent oddly formed PWM signals during +//! the update (i.e. a PWM pulse that is too short or too long). +//! +//! The PWM generator can either pause or continue running when the processor +//! is stopped via the debugger. If configured to pause, it will continue to +//! count until it reaches zero, at which point it will pause until the +//! processor is restarted. If configured to continue running, it will keep +//! counting as if nothing had happened. +//! +//! The \b ulConfig parameter contains the desired configuration. It is the +//! logical OR of the following: \b PWM_GEN_MODE_DOWN or +//! \b PWM_GEN_MODE_UP_DOWN to specify the counting mode, \b PWM_GEN_MODE_SYNC +//! or \b PWM_GEN_MODE_NO_SYNC to specify the synchronization mode, and +//! \b PWM_GEN_MODE_DBG_RUN or \b PWM_GEN_MODE_DBG_STOP to specify the debug +//! behavior. +//! +//! \note Changes to the counter mode will affect the period of the PWM signals +//! produced. PWMGenPeriodSet() and PWMPulseWidthSet() should be called after +//! any changes to the counter mode of a generator. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_genconfigure) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenConfigure(unsigned long ulBase, unsigned long ulGen, + unsigned long ulConfig) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Compute the generator's base address. + // + ulGen = PWM_GEN_BADDR(ulBase, ulGen); + + // + // Change the global configuration of the generator. + // + HWREG(ulGen + PWM_O_X_CTL) = ((HWREG(ulGen + PWM_O_X_CTL) & + ~(PWM_X_CTL_MODE | PWM_X_CTL_DEBUG | + PWM_X_CTL_LOADUPD | PWM_X_CTL_CMPAUPD | + PWM_X_CTL_CMPBUPD)) | ulConfig); + + // + // Set the individual PWM generator controls. + // + if(ulConfig & PWM_X_CTL_MODE) + { + // + // In up/down count mode, set the signal high on up count comparison + // and low on down count comparison (i.e. center align the signals). + // + HWREG(ulGen + PWM_O_X_GENA) = ((PWM_GEN_ACT_ONE << + PWM_GEN_ACT_A_UP_SHIFT) | + (PWM_GEN_ACT_ZERO << + PWM_GEN_ACT_A_DN_SHIFT)); + HWREG(ulGen + PWM_O_X_GENB) = ((PWM_GEN_ACT_ONE << + PWM_GEN_ACT_B_UP_SHIFT) | + (PWM_GEN_ACT_ZERO << + PWM_GEN_ACT_B_DN_SHIFT)); + } + else + { + // + // In down count mode, set the signal high on load and low on count + // comparison (i.e. left align the signals). + // + HWREG(ulGen + PWM_O_X_GENA) = ((PWM_GEN_ACT_ONE << + PWM_GEN_ACT_LOAD_SHIFT) | + (PWM_GEN_ACT_ZERO << + PWM_GEN_ACT_A_DN_SHIFT)); + HWREG(ulGen + PWM_O_X_GENB) = ((PWM_GEN_ACT_ONE << + PWM_GEN_ACT_LOAD_SHIFT) | + (PWM_GEN_ACT_ZERO << + PWM_GEN_ACT_B_DN_SHIFT)); + } +} +#endif + +//***************************************************************************** +// +//! Set the period of a PWM generator. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to be modified. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param ulPeriod specifies the period of PWM generator output, measured +//! in clock ticks. +//! +//! This function sets the period of the specified PWM generator block, where +//! the period of the generator block is defined as the number of \b PWM +//! clock ticks between pulses on the generator block \b zero signal. +//! +//! \note Any subsequent calls made to this function before an update occurs +//! will cause the previous values to be overwritten. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_genperiodset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenPeriodSet(unsigned long ulBase, unsigned long ulGen, + unsigned long ulPeriod) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Compute the generator's base address. + // + ulGen = PWM_GEN_BADDR(ulBase, ulGen); + + // + // Set the reload register based on the mode. + // + if(HWREG(ulGen + PWM_O_X_CTL) & PWM_X_CTL_MODE) + { + // + // In up/down count mode, set the reload register to half the requested + // period. + // + ASSERT((ulPeriod / 2) < 65536); + HWREG(ulGen + PWM_O_X_LOAD) = ulPeriod / 2; + } + else + { + // + // In down count mode, set the reload register to the requested period + // minus one. + // + ASSERT((ulPeriod <= 65536) && (ulPeriod != 0)); + HWREG(ulGen + PWM_O_X_LOAD) = ulPeriod - 1; + } +} +#endif + +//***************************************************************************** +// +//! Gets the period of a PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to query. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! +//! This function gets the period of the specified PWM generator block. The +//! period of the generator block is defined as the number of \b PWM clock +//! ticks between pulses on the generator block \b zero signal. +//! +//! If the update of the counter for the specified PWM generator has yet +//! to be completed, the value returned may not be the active period. The +//! value returned is the programmed period, measured in \b PWM clock ticks. +//! +//! \return Returns the programmed period of the specified generator block +//! in \b PWM clock ticks. +// +//***************************************************************************** +#if defined(GROUP_genperiodget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +PWMGenPeriodGet(unsigned long ulBase, unsigned long ulGen) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Compute the generator's base address. + // + ulGen = PWM_GEN_BADDR(ulBase, ulGen); + + // + // Figure out the counter mode. + // + if(HWREG(ulGen + PWM_O_X_CTL) & PWM_X_CTL_MODE) + { + // + // The period is twice the reload register value. + // + return(HWREG(ulGen + PWM_O_X_LOAD) * 2); + } + else + { + // + // The period is the reload register value plus one. + // + return(HWREG(ulGen + PWM_O_X_LOAD) + 1); + } +} +#endif + +//***************************************************************************** +// +//! Enables the timer/counter for a PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to be enabled. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! +//! This function allows the \b PWM clock to drive the timer/counter for the +//! specified generator block. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_genenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenEnable(unsigned long ulBase, unsigned long ulGen) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Enable the PWM generator. + // + HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_CTL) |= PWM_X_CTL_ENABLE; +} +#endif + +//***************************************************************************** +// +//! Disables the timer/counter for a PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to be disabled. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! +//! This function blocks the \b PWM clock from driving the timer/counter for +//! the specified generator block. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_gendisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenDisable(unsigned long ulBase, unsigned long ulGen) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Disable the PWM generator. + // + HWREG(PWM_GEN_BADDR(ulBase, + ulGen) + PWM_O_X_CTL) &= ~(PWM_X_CTL_ENABLE); +} +#endif + +//***************************************************************************** +// +//! Sets the pulse width for the specified PWM output. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulPWMOut is the PWM output to modify. Must be one of \b PWM_OUT_0, +//! \b PWM_OUT_1, \b PWM_OUT_2, \b PWM_OUT_3, \b PWM_OUT_4, or \b PWM_OUT_5. +//! \param ulWidth specifies the width of the positive portion of the pulse. +//! +//! This function sets the pulse width for the specified PWM output, where the +//! pulse width is defined as the number of \b PWM clock ticks. +//! +//! \note Any subsequent calls made to this function before an update occurs +//! will cause the previous values to be overwritten. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pulsewidthset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, + unsigned long ulWidth) +{ + unsigned long ulGenBase, ulReg; + + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulPWMOut == PWM_OUT_0) || (ulPWMOut == PWM_OUT_1) || + (ulPWMOut == PWM_OUT_2) || (ulPWMOut == PWM_OUT_3) || + (ulPWMOut == PWM_OUT_4) || (ulPWMOut == PWM_OUT_5)); + + // + // Compute the generator's base address. + // + ulGenBase = PWM_OUT_BADDR(ulBase, ulPWMOut); + + // + // If the counter is in up/down count mode, divide the width by two. + // + if(HWREG(ulGenBase + PWM_O_X_CTL) & PWM_X_CTL_MODE) + { + ulWidth /= 2; + } + + // + // Get the period. + // + ulReg = HWREG(ulGenBase + PWM_O_X_LOAD); + + // + // Make sure the width is not too large. + // + ASSERT(ulWidth < ulReg); + + // + // Compute the compare value. + // + ulReg = ulReg - ulWidth; + + // + // Write to the appropriate registers. + // + if(PWM_IS_OUTPUT_ODD(ulPWMOut)) + { + HWREG(ulGenBase + PWM_O_X_CMPB) = ulReg; + } + else + { + HWREG(ulGenBase + PWM_O_X_CMPA) = ulReg; + } +} +#endif + +//***************************************************************************** +// +//! Gets the pulse width of a PWM output. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulPWMOut is the PWM output to query. Must be one of \b PWM_OUT_0, +//! \b PWM_OUT_1, \b PWM_OUT_2, \b PWM_OUT_3, \b PWM_OUT_4, or \b PWM_OUT_5. +//! +//! This function gets the currently programmed pulse width for the +//! specified PWM output. If the update of the comparator for the specified +//! output has yet to be completed, the value returned may not be the active +//! pulse width. The value returned is the programmed pulse width, measured +//! in \b PWM clock ticks. +//! +//! \return Returns the width of the pulse in \b PWM clock ticks. +// +//***************************************************************************** +#if defined(GROUP_pulsewidthget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +PWMPulseWidthGet(unsigned long ulBase, unsigned long ulPWMOut) +{ + unsigned long ulGenBase, ulReg, ulLoad; + + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulPWMOut == PWM_OUT_0) || (ulPWMOut == PWM_OUT_1) || + (ulPWMOut == PWM_OUT_2) || (ulPWMOut == PWM_OUT_3) || + (ulPWMOut == PWM_OUT_4) || (ulPWMOut == PWM_OUT_5)); + + // + // Compute the generator's base address. + // + ulGenBase = PWM_OUT_BADDR(ulBase, ulPWMOut); + + // + // Then compute the pulse width. If mode is UpDown, set + // width = (load-compare)*2. Otherwise, set width = load - compare + // + ulLoad = HWREG(ulGenBase + PWM_O_X_LOAD); + if(PWM_IS_OUTPUT_ODD(ulPWMOut)) + { + ulReg = HWREG(ulGenBase + PWM_O_X_CMPB); + } + else + { + ulReg = HWREG(ulGenBase + PWM_O_X_CMPA); + } + ulReg = ulLoad - ulReg; + + // + // If in up/down count mode, double the pulse width. + // + if(HWREG(ulGenBase + PWM_O_X_CTL) & PWM_X_CTL_MODE) + { + ulReg = ulReg * 2; + } + + // + // Return the pulse width. + // + return(ulReg); +} +#endif + +//***************************************************************************** +// +//! Enables the PWM dead band output, and sets the dead band delays. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to modify. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param usRise specifies the width of delay from the rising edge. +//! \param usFall specifies the width of delay from the falling edge. +//! +//! This function sets the dead bands for the specified PWM generator, +//! where the dead bands are defined as the number of \b PWM clock ticks +//! from the rising or falling edge of the generator's \b OutA signal. +//! Note that this function causes the coupling of \b OutB to \b OutA. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_deadbandenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMDeadBandEnable(unsigned long ulBase, unsigned long ulGen, + unsigned short usRise, unsigned short usFall) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + ASSERT(usRise < 4096); + ASSERT(usFall < 4096); + + // + // Compute the generator's base address. + // + ulGen = PWM_GEN_BADDR(ulBase, ulGen); + + // + // Write the dead band delay values. + // + HWREG(ulGen + PWM_O_X_DBRISE) = usRise; + HWREG(ulGen + PWM_O_X_DBFALL) = usFall; + + // + // Enable the deadband functionality. + // + HWREG(ulGen + PWM_O_X_DBCTL) |= PWM_DBCTL_ENABLE; +} +#endif + +//***************************************************************************** +// +//! Disables the PWM dead band output. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to modify. Must be one of +//! \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! +//! This function disables the dead band mode for the specified PWM generator. +//! Doing so decouples the \b OutA and \b OutB signals. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_deadbanddisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMDeadBandDisable(unsigned long ulBase, unsigned long ulGen) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Disable the deadband functionality. + // + HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_DBCTL) &= ~(PWM_DBCTL_ENABLE); +} +#endif + +//***************************************************************************** +// +//! Synchronizes all pending updates. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGenBits are the PWM generator blocks to be updated. Must be the +//! logical OR of any of \b PWM_GEN_0_BIT, \b PWM_GEN_1_BIT, or +//! \b PWM_GEN_2_BIT. +//! +//! For the selected PWM generators, this function causes all queued updates to +//! the period or pulse width to be applied the next time the corresponding +//! counter becomes zero. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_syncupdate) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMSyncUpdate(unsigned long ulBase, unsigned long ulGenBits) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT(!(ulGenBits & ~(PWM_GEN_0_BIT | PWM_GEN_1_BIT | PWM_GEN_2_BIT))); + + // + // Update the PWM timing registers. + // + HWREG(ulBase + PWM_O_CTL) = ulGenBits; +} +#endif + +//***************************************************************************** +// +//! Synchronizes the counters in one or multiple PWM generator blocks. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGenBits are the PWM generator blocks to be synchronized. Must be +//! the logical OR of any of \b PWM_GEN_0_BIT, \b PWM_GEN_1_BIT, or +//! \b PWM_GEN_2_BIT. +//! +//! For the selected PWM module, this function synchronizes the time base +//! of the generator blocks by causing the specified generator counters to be +//! reset to zero. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_synctimebase) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMSyncTimeBase(unsigned long ulBase, unsigned long ulGenBits) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT(!(ulGenBits & ~(PWM_GEN_0_BIT | PWM_GEN_1_BIT | PWM_GEN_2_BIT))); + + // + // Synchronize the counters in the specified generators by writing to + // the module's synchronization register. + // + HWREG(ulBase + PWM_O_SYNC) = ulGenBits; +} +#endif + +//***************************************************************************** +// +//! Enables or disables PWM outputs. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulPWMOutBits are the PWM outputs to be modified. Must be the +//! logical OR of any of \b PWM_OUT_0_BIT, \b PWM_OUT_1_BIT, \b PWM_OUT_2_BIT, +//! \b PWM_OUT_3_BIT, \b PWM_OUT_4_BIT, or \b PWM_OUT_5_BIT. +//! \param bEnable determines if the signal is enabled or disabled. +//! +//! This function is used to enable or disable the selected PWM outputs. The +//! outputs are selected using the parameter \e ulPWMOutBits. The parameter +//! \e bEnable determines the state of the selected outputs. If \e bEnable is +//! \b true, then the selected PWM outputs are enabled, or placed in the active +//! state. If \e bEnable is \b false, then the selected outputs are disabled, +//! or placed in the inactive state. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_outputstate) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMOutputState(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bEnable) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT(!(ulPWMOutBits & ~(PWM_OUT_0_BIT | PWM_OUT_1_BIT | PWM_OUT_2_BIT | + PWM_OUT_3_BIT | PWM_OUT_4_BIT | PWM_OUT_5_BIT))); + + // + // Read the module's ENABLE output control register, and set or clear + // the requested bits. + // + if(bEnable == true) + { + HWREG(ulBase + PWM_O_ENABLE) |= ulPWMOutBits; + } + else + { + HWREG(ulBase + PWM_O_ENABLE) &= ~(ulPWMOutBits); + } +} +#endif + +//***************************************************************************** +// +//! Selects the inversion mode for PWM outputs. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulPWMOutBits are the PWM outputs to be modified. Must be the +//! logical OR of any of \b PWM_OUT_0_BIT, \b PWM_OUT_1_BIT, \b PWM_OUT_2_BIT, +//! \b PWM_OUT_3_BIT, \b PWM_OUT_4_BIT, or \b PWM_OUT_5_BIT. +//! \param bInvert determines if the signal is inverted or passed through. +//! +//! This function is used to select the inversion mode for the selected PWM +//! outputs. The outputs are selected using the parameter \e ulPWMOutBits. +//! The parameter \e bInvert determines the inversion mode for the selected +//! outputs. If \e bInvert is \b true, this function will cause the specified +//! PWM output signals to be inverted, or made active low. If \e bInvert is +//! \b false, the specified output will be passed through as is, or be made +//! active high. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_outputinvert) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMOutputInvert(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bInvert) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT(!(ulPWMOutBits & ~(PWM_OUT_0_BIT | PWM_OUT_1_BIT | PWM_OUT_2_BIT | + PWM_OUT_3_BIT | PWM_OUT_4_BIT | PWM_OUT_5_BIT))); + + // + // Read the module's INVERT output control register, and set or clear + // the requested bits. + // + if(bInvert == true) + { + HWREG(ulBase + PWM_O_INVERT) |= ulPWMOutBits; + } + else + { + HWREG(ulBase + PWM_O_INVERT) &= ~(ulPWMOutBits); + } +} +#endif + +//***************************************************************************** +// +//! Specifies the state of PWM outputs in response to a fault condition. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulPWMOutBits are the PWM outputs to be modified. Must be the +//! logical OR of any of \b PWM_OUT_0_BIT, \b PWM_OUT_1_BIT, \b PWM_OUT_2_BIT, +//! \b PWM_OUT_3_BIT, \b PWM_OUT_4_BIT, or \b PWM_OUT_5_BIT. +//! \param bFaultKill determines if the signal is killed or passed through +//! during an active fault condition. +//! +//! This function sets the fault handling characteristics of the selected PWM +//! outputs. The outputs are selected using the parameter \e ulPWMOutBits. +//! The parameter \e bFaultKill determines the fault handling characteristics +//! for the selected outputs. If \e bFaultKill is \b true, then the selected +//! outputs will be made inactive. If \e bFaultKill is \b false, then the +//! selected outputs are unaffected by the detected fault. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_outputfault) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMOutputFault(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bFaultKill) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT(!(ulPWMOutBits & ~(PWM_OUT_0_BIT | PWM_OUT_1_BIT | PWM_OUT_2_BIT | + PWM_OUT_3_BIT | PWM_OUT_4_BIT | PWM_OUT_5_BIT))); + + // + // Read the module's FAULT output control register, and set or clear + // the requested bits. + // + if(bFaultKill == true) + { + HWREG(ulBase + PWM_O_FAULT) |= ulPWMOutBits; + } + else + { + HWREG(ulBase + PWM_O_FAULT) &= ~(ulPWMOutBits); + } +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the specified PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator in question. +//! \param pfnIntHandler is a pointer to the function to be called when the PWM +//! generator interrupt occurs. +//! +//! This function will ensure that the interrupt handler specified by +//! \e pfnIntHandler is called when an interrupt is detected for the specified +//! PWM generator block. This function will also enable the corresponding +//! PWM generator interrupt in the interrupt controller; individual generator +//! interrupts and interrupt sources must be enabled with PWMIntEnable() and +//! PWMGenIntTrigEnable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_genintregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenIntRegister(unsigned long ulBase, unsigned long ulGen, + void (*pfnIntHandler)(void)) +{ + unsigned long ulInt; + + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Get the interrupt number associated with the specified generator. + // + ulInt = INT_PWM0 + (ulGen >> 6) - 1; + + // + // Register the interrupt handler. + // + IntRegister(ulInt, pfnIntHandler); + + // + // Enable the PWMx interrupt. + // + IntEnable(ulInt); +} +#endif + +//***************************************************************************** +// +//! Removes an interrupt handler for the specified PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator in question. +//! +//! This function will unregister the interrupt handler for the specified +//! PWM generator block. This function will also disable the corresponding +//! PWM generator interrupt in the interrupt controller; individual generator +//! interrupts and interrupt sources must be disabled with PWMIntDisable() and +//! PWMGenIntTrigDisable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_genintunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenIntUnregister(unsigned long ulBase, unsigned long ulGen) +{ + unsigned long ulInt; + + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Get the interrupt number associated with the specified generator. + // + ulInt = INT_PWM0 + (ulGen >> 6) - 1; + + // + // Disable the PWMx interrupt. + // + IntDisable(ulInt); + + // + // Unregister the interrupt handler. + // + IntUnregister(ulInt); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for a fault condition detected in a PWM +//! module. +//! +//! \param ulBase is the base address of the PWM module. +//! \param pfnIntHandler is a pointer to the function to be called when the PWM +//! fault interrupt occurs. +//! +//! This function will ensure that the interrupt handler specified by +//! \e pfnIntHandler is called when a fault interrupt is detected for the +//! selected PWM module. This function will also enable the PWM fault +//! interrupt in the NVIC; the PWM fault interrupt must also be enabled at the +//! module level using PWMIntEnable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_faultintregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMFaultIntRegister(unsigned long ulBase, void (*pfnIntHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + + // + // Register the interrupt handler, returning an error if one occurs. + // + IntRegister(INT_PWM_FAULT, pfnIntHandler); + + // + // Enable the PWM fault interrupt. + // + IntEnable(INT_PWM_FAULT); +} +#endif + +//***************************************************************************** +// +//! Removes the PWM fault condition interrupt handler. +//! +//! \param ulBase is the base address of the PWM module. +//! +//! This function will remove the interrupt handler for a PWM fault interrupt +//! from the selected PWM module. This function will also disable the PWM +//! fault interrupt in the NVIC; the PWM fault interrupt must also be disabled +//! at the module level using PWMIntDisable(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_faultintunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMFaultIntUnregister(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + + // + // Disable the PWM fault interrupt. + // + IntDisable(INT_PWM_FAULT); + + // + // Unregister the interrupt handler, returning an error if one occurs. + // + IntUnregister(INT_PWM_FAULT); +} +#endif + +//***************************************************************************** +// +//! Enables interrupts and triggers for the specified PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to have interrupts and triggers enabled. +//! Must be one of \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param ulIntTrig specifies the interrupts and triggers to be enabled. +//! +//! Unmasks the specified interrupt(s) and trigger(s) by setting the +//! specified bits of the interrupt/trigger enable register for the specified +//! PWM generator. The defined values for the bits are as follows: +//! +//! - PWM_INT_CNT_ZERO +//! - PWM_INT_CNT_LOAD +//! - PWM_INT_CMP_AU +//! - PWM_INT_CMP_AD +//! - PWM_INT_CMP_BU +//! - PWM_INT_CMP_BD +//! - PWM_TR_CNT_ZERO +//! - PWM_TR_CNT_LOAD +//! - PWM_TR_CMP_AU +//! - PWM_TR_CMP_AD +//! - PWM_TR_CMP_BU +//! - PWM_TR_CMP_BD +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_geninttrigenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenIntTrigEnable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Enable the specified interrupts/triggers. + // + HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_INTEN) |= ulIntTrig; +} +#endif + +//***************************************************************************** +// +//! Disables interrupts for the specified PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to have interrupts and triggers disabled. +//! Must be one of \b PWM_GEN_0, \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param ulIntTrig specifies the interrupts and triggers to be disabled. +//! +//! Masks the specified interrupt(s) and trigger(s) by clearing the +//! specified bits of the interrupt/trigger enable register for the specified +//! PWM generator. The defined values for the bits are as follows: +//! +//! - PWM_INT_CNT_ZERO +//! - PWM_INT_CNT_LOAD +//! - PWM_INT_CMP_AU +//! - PWM_INT_CMP_AD +//! - PWM_INT_CMP_BU +//! - PWM_INT_CMP_BD +//! - PWM_TR_CNT_ZERO +//! - PWM_TR_CNT_LOAD +//! - PWM_TR_CMP_AU +//! - PWM_TR_CMP_AD +//! - PWM_TR_CMP_BU +//! - PWM_TR_CMP_BD +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_geninttrigdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenIntTrigDisable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Disable the specified interrupts/triggers. + // + HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_INTEN) &= ~(ulIntTrig); +} +#endif + +//***************************************************************************** +// +//! Gets interrupt status for the specified PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to query. Must be one of \b PWM_GEN_0, +//! \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param bMasked specifies whether masked or raw interrupt status is +//! returned. +//! +//! If \e bMasked is set as \b true, then the masked interrupt status is +//! returned; otherwise, the raw interrupt status will be returned. +//! +//! \return Returns the contents of the interrupt status register, or the +//! contents of the raw interrupt status register, for the specified +//! PWM generator. +// +//***************************************************************************** +#if defined(GROUP_genintstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +PWMGenIntStatus(unsigned long ulBase, unsigned long ulGen, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Compute the generator's base address. + // + ulGen = PWM_GEN_BADDR(ulBase, ulGen); + + // + // Read and return the specified generator's raw or enabled interrupt + // status. + // + if(bMasked == true) + { + return(HWREG(ulGen + PWM_O_X_ISC)); + } + else + { + return(HWREG(ulGen + PWM_O_X_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears the specified interrupt(s) for the specified PWM generator block. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGen is the PWM generator to query. Must be one of \b PWM_GEN_0, +//! \b PWM_GEN_1, or \b PWM_GEN_2. +//! \param ulInts specifies the interrupts to be cleared. +//! +//! Clears the specified interrupt(s) by writing a 1 to the specified bits +//! of the interrupt status register for the specified PWM generator. The +//! defined values for the bits are as follows: +//! +//! - PWM_INT_CNT_ZERO +//! - PWM_INT_CNT_LOAD +//! - PWM_INT_CMP_AU +//! - PWM_INT_CMP_AD +//! - PWM_INT_CMP_BU +//! - PWM_INT_CMP_BD +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_genintclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMGenIntClear(unsigned long ulBase, unsigned long ulGen, unsigned long ulInts) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + ASSERT((ulGen == PWM_GEN_0) || (ulGen == PWM_GEN_1) || + (ulGen == PWM_GEN_2)); + + // + // Clear the requested interrupts by writing ones to the specified bit + // of the module's interrupt enable register. + // + HWREG(PWM_GEN_BADDR(ulBase, ulGen) + PWM_O_X_ISC) = ulInts; +} +#endif + +//***************************************************************************** +// +//! Enables generator and fault interrupts for a PWM module. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGenFault contains the interrupts to be enabled. Must be a logical +//! OR of any of \b PWM_INT_GEN_0, \b PWM_INT_GEN_1, \b PWM_INT_GEN_2, or +//! \b PWM_INT_FAULT. +//! +//! Unmasks the specified interrupt(s) by setting the specified bits of +//! the interrupt enable register for the selected PWM module. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMIntEnable(unsigned long ulBase, unsigned long ulGenFault) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + + // + // Read the module's interrupt enable register, and enable interrupts + // for the specified PWM generators. + // + HWREG(ulBase + PWM_O_INTEN) |= ulGenFault; +} +#endif + +//***************************************************************************** +// +//! Disables generator and fault interrupts for a PWM module. +//! +//! \param ulBase is the base address of the PWM module. +//! \param ulGenFault contains the interrupts to be disabled. Must be a +//! logical OR of any of \b PWM_INT_GEN_0, \b PWM_INT_GEN_1, \b PWM_INT_GEN_2, +//! or \b PWM_INT_FAULT. +//! +//! Masks the specified interrupt(s) by clearing the specified bits of +//! the interrupt enable register for the selected PWM module. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMIntDisable(unsigned long ulBase, unsigned long ulGenFault) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + + // + // Read the module's interrupt enable register, and disable interrupts + // for the specified PWM generators. + // + HWREG(ulBase + PWM_O_INTEN) &= ~(ulGenFault); +} +#endif + +//***************************************************************************** +// +//! Clears the fault interrupt for a PWM module. +//! +//! \param ulBase is the base address of the PWM module. +//! +//! Clears the fault interrupt by writing to the appropriate bit of the +//! interrupt status register for the selected PWM module. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_faultintclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +PWMFaultIntClear(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + + // + // Write the only writeable bit in the module's interrupt register. + // + HWREG(ulBase + PWM_O_ISC) = PWM_INT_INTFAULT; +} +#endif + +//***************************************************************************** +// +//! Gets the interrupt status for a PWM module. +//! +//! \param ulBase is the base address of the PWM module. +//! \param bMasked specifies whether masked or raw interrupt status is +//! returned. +//! +//! If \e bMasked is set as \b true, then the masked interrupt status is +//! returned; otherwise, the raw interrupt status will be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! \b PWM_INT_GEN_0, \b PWM_INT_GEN_1, \b PWM_INT_GEN_2, and \b PWM_INT_FAULT. +//! +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +PWMIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == PWM_BASE); + + // + // Read and return either the module's raw or enabled interrupt status. + // + if(bMasked == true) + { + return(HWREG(ulBase + PWM_O_ISC)); + } + else + { + return(HWREG(ulBase + PWM_O_RIS)); + } +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/pwm.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/pwm.h new file mode 100644 index 0000000..db835ba --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/pwm.h @@ -0,0 +1,161 @@ +//***************************************************************************** +// +// pwm.h - API function protoypes for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __PWM_H__ +#define __PWM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following defines are passed to PWMGenConfigure() as the ulConfig +// parameter and specify the configuration of the PWM generator. +// +//***************************************************************************** +#define PWM_GEN_MODE_DOWN 0x00000000 // Down count mode +#define PWM_GEN_MODE_UP_DOWN 0x00000002 // Up/Down count mode +#define PWM_GEN_MODE_SYNC 0x00000038 // Synchronous updates +#define PWM_GEN_MODE_NO_SYNC 0x00000000 // Immediate updates +#define PWM_GEN_MODE_DBG_RUN 0x00000004 // Continue running in debug mode +#define PWM_GEN_MODE_DBG_STOP 0x00000000 // Stop running in debug mode + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM generator interrupts and +// triggers. +// +//***************************************************************************** +#define PWM_INT_CNT_ZERO 0x00000001 // Int if COUNT = 0 +#define PWM_INT_CNT_LOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_INT_CNT_AU 0x00000004 // Int if COUNT = CMPA U +#define PWM_INT_CNT_AD 0x00000008 // Int if COUNT = CMPA D +#define PWM_INT_CNT_BU 0x00000010 // Int if COUNT = CMPA U +#define PWM_INT_CNT_BD 0x00000020 // Int if COUNT = CMPA D +#define PWM_TR_CNT_ZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_TR_CNT_LOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_TR_CNT_AU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_AD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_TR_CNT_BU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_BD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM interrupts. +// +//***************************************************************************** +#define PWM_INT_GEN_0 0x00000001 // Generator 0 interrupt +#define PWM_INT_GEN_1 0x00000002 // Generator 1 interrupt +#define PWM_INT_GEN_2 0x00000004 // Generator 2 interrupt +#define PWM_INT_FAULT 0x00010000 // Fault interrupt + +//***************************************************************************** +// +// Defines to identify the generators within a module. +// +//***************************************************************************** +#define PWM_GEN_0 0x00000040 // Offset address of Gen0 +#define PWM_GEN_1 0x00000080 // Offset address of Gen1 +#define PWM_GEN_2 0x000000C0 // Offset address of Gen2 + +#define PWM_GEN_0_BIT 0x00000001 // Bit-wise ID for Gen0 +#define PWM_GEN_1_BIT 0x00000002 // Bit-wise ID for Gen1 +#define PWM_GEN_2_BIT 0x00000004 // Bit-wise ID for Gen2 + +//***************************************************************************** +// +// Defines to identify the outputs within a module. +// +//***************************************************************************** +#define PWM_OUT_0 0x00000040 // Encoded offset address of PWM0 +#define PWM_OUT_1 0x00000041 // Encoded offset address of PWM1 +#define PWM_OUT_2 0x00000082 // Encoded offset address of PWM2 +#define PWM_OUT_3 0x00000083 // Encoded offset address of PWM3 +#define PWM_OUT_4 0x000000C4 // Encoded offset address of PWM4 +#define PWM_OUT_5 0x000000C5 // Encoded offset address of PWM5 + +#define PWM_OUT_0_BIT 0x00000001 // Bit-wise ID for PWM0 +#define PWM_OUT_1_BIT 0x00000002 // Bit-wise ID for PWM1 +#define PWM_OUT_2_BIT 0x00000004 // Bit-wise ID for PWM2 +#define PWM_OUT_3_BIT 0x00000008 // Bit-wise ID for PWM3 +#define PWM_OUT_4_BIT 0x00000010 // Bit-wise ID for PWM4 +#define PWM_OUT_5_BIT 0x00000020 // Bit-wise ID for PWM5 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void PWMGenConfigure(unsigned long ulBase, unsigned long ulGen, + unsigned long ulConfig); +extern void PWMGenPeriodSet(unsigned long ulBase, unsigned long ulGen, + unsigned long ulPeriod); +extern unsigned long PWMGenPeriodGet(unsigned long ulBase, + unsigned long ulGen); +extern void PWMGenEnable(unsigned long ulBase, unsigned long ulGen); +extern void PWMGenDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, + unsigned long ulWidth); +extern unsigned long PWMPulseWidthGet(unsigned long ulBase, + unsigned long ulPWMOut); +extern void PWMDeadBandEnable(unsigned long ulBase, unsigned long ulGen, + unsigned short usRise, unsigned short usFall); +extern void PWMDeadBandDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMSyncUpdate(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMSyncTimeBase(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMOutputState(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bEnable); +extern void PWMOutputInvert(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bInvert); +extern void PWMOutputFault(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bFaultKill); +extern void PWMGenIntRegister(unsigned long ulBase, unsigned long ulGen, + void (*pfnIntHandler)(void)); +extern void PWMGenIntUnregister(unsigned long ulBase, unsigned long ulGen); +extern void PWMFaultIntRegister(unsigned long ulBase, + void (*pfnIntHandler)(void)); +extern void PWMFaultIntUnregister(unsigned long ulBase); +extern void PWMGenIntTrigEnable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern void PWMGenIntTrigDisable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern unsigned long PWMGenIntStatus(unsigned long ulBase, unsigned long ulGen, + tBoolean bMasked); +extern void PWMGenIntClear(unsigned long ulBase, unsigned long ulGen, + unsigned long ulInts); +extern void PWMIntEnable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMIntDisable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMFaultIntClear(unsigned long ulBase); +extern unsigned long PWMIntStatus(unsigned long ulBase, tBoolean bMasked); + +#ifdef __cplusplus +} +#endif + +#endif // __PWM_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/qei.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/qei.c new file mode 100644 index 0000000..eb982de --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/qei.c @@ -0,0 +1,630 @@ +//***************************************************************************** +// +// qei.c - Driver for the Quadrature Encoder with Index. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup qei_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_qei.h" +#include "../hw_types.h" +#include "debug.h" +#include "interrupt.h" +#include "qei.h" + +//***************************************************************************** +// +//! Enables the quadrature encoder. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This will enable operation of the quadrature encoder module. It must be +//! configured before it is enabled. +//! +//! \sa QEIConfigure() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Enable the QEI module. + // + HWREG(ulBase + QEI_O_CTL) |= QEI_CTL_ENABLE; +} +#endif + +//***************************************************************************** +// +//! Disables the quadrature encoder. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This will disable operation of the quadrature encoder module. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_disable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Disable the QEI module. + // + HWREG(ulBase + QEI_O_CTL) &= ~(QEI_CTL_ENABLE); +} +#endif + +//***************************************************************************** +// +//! Configures the quadrature encoder. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param ulConfig is the configuration for the quadrature encoder. See below +//! for a description of this parameter. +//! \param ulMaxPosition specifies the maximum position value. +//! +//! This will configure the operation of the quadrature encoder. The +//! \e ulConfig parameter provides the configuration of the encoder and is the +//! logical OR of several values: +//! +//! - \b QEI_CONFIG_CAPTURE_A or \b QEI_CONFIG_CAPTURE_A_B to specify if edges +//! on channel A or on both channels A and B should be counted by the +//! position integrator and velocity accumulator. +//! - \b QEI_CONFIG_NO_RESET or \b QEI_CONFIG_RESET_IDX to specify if the +//! position integrator should be reset when the index pulse is detected. +//! - \b QEI_CONFIG_QUADRATURE or \b QEI_CONFIG_CLOCK_DIR to specify if +//! quadrature signals are being provided on ChA and ChB, or if a direction +//! signal and a clock are being provided instead. +//! - \b QEI_CONFIG_NO_SWAP or \b QEI_CONFIG_SWAP to specify if the signals +//! provided on ChA and ChB should be swapped before being processed. +//! +//! \e ulMaxPosition is the maximum value of the position integrator, and is +//! the value used to reset the position capture when in index reset mode and +//! moving in the reverse (negative) direction. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_configure) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIConfigure(unsigned long ulBase, unsigned long ulConfig, + unsigned long ulMaxPosition) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Write the new configuration to the hardware. + // + HWREG(ulBase + QEI_O_CTL) = ((HWREG(ulBase + QEI_O_CTL) & + ~(QEI_CTL_CAPMODE | QEI_CTL_RESMODE | + QEI_CTL_SIGMODE | QEI_CTL_SWAP)) | + ulConfig); + + // + // Set the maximum position. + // + HWREG(ulBase + QEI_O_MAXPOS) = ulMaxPosition; +} +#endif + +//***************************************************************************** +// +//! Gets the current encoder position. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This returns the current position of the encoder. Depending upon the +//! configuration of the encoder, and the incident of an index pulse, this +//! value may or may not contain the expected data (i.e. if in reset on index +//! mode, if an index pulse has not been encountered, the position counter will +//! not be aligned with the index pulse yet). +//! +//! \return The current position of the encoder. +// +//***************************************************************************** +#if defined(GROUP_positionget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +QEIPositionGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Return the current position counter. + // + return(HWREG(ulBase + QEI_O_POS)); +} +#endif + +//***************************************************************************** +// +//! Sets the current encoder position. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param ulPosition is the new position for the encoder. +//! +//! This sets the current position of the encoder; the encoder position will +//! then be measured relative to this value. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_positionset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIPositionSet(unsigned long ulBase, unsigned long ulPosition) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Set the position counter. + // + HWREG(ulBase + QEI_O_POS) = ulPosition; +} +#endif + +//***************************************************************************** +// +//! Gets the current direction of rotation. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This returns the current direction of rotation. In this case, current +//! means the most recently detected direction of the encoder; it may not be +//! presently moving but this is the direction it last moved before it stopped. +//! +//! \return 1 if moving in the forward direction or -1 if moving in the reverse +//! direction. +// +//***************************************************************************** +#if defined(GROUP_directionget) || defined(BUILD_ALL) || defined(DOXYGEN) +long +QEIDirectionGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Return the direction of rotation. + // + return((HWREG(ulBase + QEI_O_STAT) & QEI_STAT_DIRECTION) ? -1 : 1); +} +#endif + +//***************************************************************************** +// +//! Gets the encoder error indicator. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This returns the error indicator for the quadrature encoder. It is an +//! error for both of the signals of the quadrature input to change at the same +//! time. +//! +//! \return true if an error has occurred and false otherwise. +// +//***************************************************************************** +#if defined(GROUP_errorget) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +QEIErrorGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Return the error indicator. + // + return((HWREG(ulBase + QEI_O_STAT) & QEI_STAT_ERROR) ? true : false); +} +#endif + +//***************************************************************************** +// +//! Enables the velocity capture. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This will enable operation of the velocity capture in the quadrature +//! encoder module. It must be configured before it is enabled. Velocity +//! capture will not occur if the quadrature encoder is not enabled. +//! +//! \sa QEIVelocityConfigure() and QEIEnable() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_velocityenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIVelocityEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Enable the velocity capture. + // + HWREG(ulBase + QEI_O_CTL) |= QEI_CTL_VELEN; +} +#endif + +//***************************************************************************** +// +//! Disables the velocity capture. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This will disable operation of the velocity capture in the quadrature +//! encoder module. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_velocitydisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIVelocityDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Disable the velocity capture. + // + HWREG(ulBase + QEI_O_CTL) &= ~(QEI_CTL_VELEN); +} +#endif + +//***************************************************************************** +// +//! Configures the velocity capture. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param ulPreDiv specifies the predivider applied to the input quadrature +//! signal before it is counted; can be one of QEI_VELDIV_1, QEI_VELDIV_2, +//! QEI_VELDIV_4, QEI_VELDIV_8, QEI_VELDIV_16, QEI_VELDIV_32, QEI_VELDIV_64, or +//! QEI_VELDIV_128. +//! \param ulPeriod specifies the number of clock ticks over which to measure +//! the velocity; must be non-zero. +//! +//! This will configure the operation of the velocity capture portion of the +//! quadrature encoder. The position increment signal is predivided as +//! specified by \e ulPreDiv before being accumulated by the velocity capture. +//! The divided signal is accumulated over \e ulPeriod system clock before +//! being saved and resetting the accumulator. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_velocityconfigure) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIVelocityConfigure(unsigned long ulBase, unsigned long ulPreDiv, + unsigned long ulPeriod) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + ASSERT(!(ulPreDiv & ~(QEI_CTL_VELDIV_M))); + ASSERT(ulPeriod != 0); + + // + // Set the velocity predivider. + // + HWREG(ulBase + QEI_O_CTL) = ((HWREG(ulBase + QEI_O_CTL) & + ~(QEI_CTL_VELDIV_M)) | ulPreDiv); + + // + // Set the timer period. + // + HWREG(ulBase + QEI_O_LOAD) = ulPeriod - 1; +} +#endif + +//***************************************************************************** +// +//! Gets the current encoder speed. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This returns the current speed of the encoder. The value returned is the +//! number of pulses detected in the specified time period; this number can be +//! multiplied by the number of time periods per second and divided by the +//! number of pulses per revolution to obtain the number of revolutions per +//! second. +//! +//! \return The number of pulses captured in the given time period. +// +//***************************************************************************** +#if defined(GROUP_velocityget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +QEIVelocityGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Return the speed capture value. + // + return(HWREG(ulBase + QEI_O_SPEED)); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the quadrature encoder interrupt. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param pfnHandler is a pointer to the function to be called when the +//! quadrature encoder interrupt occurs. +//! +//! This sets the handler to be called when a quadrature encoder interrupt +//! occurs. This will enable the global interrupt in the interrupt controller; +//! specific quadrature encoder interrupts must be enabled via QEIIntEnable(). +//! It is the interrupt handler's responsibility to clear the interrupt source +//! via QEIIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIIntRegister(unsigned long ulBase, void (*pfnHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(INT_QEI, pfnHandler); + + // + // Enable the quadrature encoder interrupt. + // + IntEnable(INT_QEI); +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for the quadrature encoder interrupt. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! +//! This function will clear the handler to be called when a quadrature encoder +//! interrupt occurs. This will also mask off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIIntUnregister(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Disable the interrupt. + // + IntDisable(INT_QEI); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_QEI); +} +#endif + +//***************************************************************************** +// +//! Enables individual quadrature encoder interrupt sources. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param ulIntFlags is a bit mask of the interrupt sources to be enabled. +//! Can be any of the QEI_INTERROR, QEI_INTDIR, QEI_INTTIMER, or QEI_INTINDEX +//! values. +//! +//! Enables the indicated quadrature encoder interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt; +//! disabled sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIIntEnable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Enable the specified interrupts. + // + HWREG(ulBase + QEI_O_INTEN) |= ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Disables individual quadrature encoder interrupt sources. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param ulIntFlags is a bit mask of the interrupt sources to be disabled. +//! Can be any of the QEI_INTERROR, QEI_INTDIR, QEI_INTTIMER, or QEI_INTINDEX +//! values. +//! +//! Disables the indicated quadrature encoder interrupt sources. Only the +//! sources that are enabled can be reflected to the processor interrupt; +//! disabled sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIIntDisable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Disable the specified interrupts. + // + HWREG(ulBase + QEI_O_INTEN) &= ~(ulIntFlags); +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param bMasked is false if the raw interrupt status is required and true if +//! the masked interrupt status is required. +//! +//! This returns the interrupt status for the quadrature encoder module. +//! Either the raw interrupt status or the status of interrupts that are +//! allowed to reflect to the processor can be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! QEI_INTERROR, QEI_INTDIR, QEI_INTTIMER, and QEI_INTINDEX. +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +QEIIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(ulBase + QEI_O_ISC)); + } + else + { + return(HWREG(ulBase + QEI_O_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears quadrature encoder interrupt sources. +//! +//! \param ulBase is the base address of the quadrature encoder module. +//! \param ulIntFlags is a bit mask of the interrupt sources to be cleared. +//! Can be any of the QEI_INTERROR, QEI_INTDIR, QEI_INTTIMER, or QEI_INTINDEX +//! values. +//! +//! The specified quadrature encoder interrupt sources are cleared, so that +//! they no longer assert. This must be done in the interrupt handler to keep +//! it from being called again immediately upon exit. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +QEIIntClear(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT(ulBase == QEI_BASE); + + // + // Clear the requested interrupt sources. + // + HWREG(ulBase + QEI_O_ISC) = ulIntFlags; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/qei.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/qei.h new file mode 100644 index 0000000..3eaafae --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/qei.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// qei.h - Prototypes for the Quadrature Encoder Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __QEI_H__ +#define __QEI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to QEIConfigure as the ulConfig paramater. +// +//***************************************************************************** +#define QEI_CONFIG_CAPTURE_A 0x00000000 // Count on ChA edges only +#define QEI_CONFIG_CAPTURE_A_B 0x00000008 // Count on ChA and ChB edges +#define QEI_CONFIG_NO_RESET 0x00000000 // Do not reset on index pulse +#define QEI_CONFIG_RESET_IDX 0x00000010 // Reset position on index pulse +#define QEI_CONFIG_QUADRATURE 0x00000000 // ChA and ChB are quadrature +#define QEI_CONFIG_CLOCK_DIR 0x00000004 // ChA and ChB are clock and dir +#define QEI_CONFIG_NO_SWAP 0x00000000 // Do not swap ChA and ChB +#define QEI_CONFIG_SWAP 0x00000002 // Swap ChA and ChB + +//***************************************************************************** +// +// Values that can be passed to QEIVelocityConfigure as the ulPreDiv parameter. +// +//***************************************************************************** +#define QEI_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_VELDIV_128 0x000001C0 // Predivide by 128 + +//***************************************************************************** +// +// Values that can be passed to QEIEnableInts, QEIDisableInts, and QEIClearInts +// as the ulIntFlags parameter, and returned by QEIGetIntStatus. +// +//***************************************************************************** +#define QEI_INTERROR 0x00000008 // Phase error detected +#define QEI_INTDIR 0x00000004 // Direction change +#define QEI_INTTIMER 0x00000002 // Velocity timer expired +#define QEI_INTINDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void QEIEnable(unsigned long ulBase); +extern void QEIDisable(unsigned long ulBase); +extern void QEIConfigure(unsigned long ulBase, unsigned long ulConfig, + unsigned long ulMaxPosition); +extern unsigned long QEIPositionGet(unsigned long ulBase); +extern void QEIPositionSet(unsigned long ulBase, unsigned long ulPosition); +extern long QEIDirectionGet(unsigned long ulBase); +extern tBoolean QEIErrorGet(unsigned long ulBase); +extern void QEIVelocityEnable(unsigned long ulBase); +extern void QEIVelocityDisable(unsigned long ulBase); +extern void QEIVelocityConfigure(unsigned long ulBase, unsigned long ulPreDiv, + unsigned long ulPeriod); +extern unsigned long QEIVelocityGet(unsigned long ulBase); +extern void QEIIntRegister(unsigned long ulBase, void (*pfnHandler)(void)); +extern void QEIIntUnregister(unsigned long ulBase); +extern void QEIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void QEIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long QEIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void QEIIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __QEI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/ssi.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/ssi.c new file mode 100644 index 0000000..095aaab --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/ssi.c @@ -0,0 +1,609 @@ +//***************************************************************************** +// +// ssi.c - Driver for Synchronous Serial Interface. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ssi_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_ssi.h" +#include "../hw_types.h" +#include "debug.h" +#include "interrupt.h" +#include "ssi.h" +#include "sysctl.h" + +//***************************************************************************** +// +//! Configures the synchronous serial interface. +//! +//! \param ulBase specifies the SSI module base address. +//! \param ulProtocol specifies the data transfer protocol. +//! \param ulMode specifies the mode of operation. +//! \param ulBitRate specifies the clock rate. +//! \param ulDataWidth specifies number of bits transfered per frame. +//! +//! This function configures the synchronous serial interface. It sets +//! the SSI protocol, mode of operation, bit rate, and data width. +//! +//! The parameter \e ulProtocol defines the data frame format. The parameter +//! \e ulProtocol can be one of the following values: SSI_FRF_MOTO_MODE_0, +//! SSI_FRF_MOTO_MODE_1, SSI_FRF_MOTO_MODE_2, SSI_FRF_MOTO_MODE_3, +//! SSI_FRF_TI, or SSI_FRF_NMW. The Motorola frame formats imply the +//! following polarity and phase configurations: +//!
+//! Polarity Phase       Mode
+//!   0       0   SSI_FRF_MOTO_MODE_0
+//!   0       1   SSI_FRF_MOTO_MODE_1
+//!   1       0   SSI_FRF_MOTO_MODE_2
+//!   1       1   SSI_FRF_MOTO_MODE_3
+//! 
+//! +//! The parameter \e ulMode defines the operating mode of the SSI module. The +//! SSI module can operate as a master or slave; if a slave, the SSI can be +//! configured to disable output on its serial output line. The parameter +//! \e ulMode can be one of the following values: SSI_MODE_MASTER, +//! SSI_MODE_SLAVE, or SSI_MODE_SLAVE_OD. +//! +//! The parameter \e ulBitRate defines the bit rate for the SSI. This bit rate +//! must satisfy the following clock ratio criteria: +//! - FSSI >= 2 * bit rate (master mode) +//! - FSSI >= 12 * bit rate (slave modes) +//! +//! where FSSI is the frequency of the clock supplied to the SSI module. +//! +//! The parameter \e ulDataWidth defines the width of the data transfers. +//! The parameter \e ulDataWidth can be a value between 4 and 16, inclusive. +//! +//! The SSI clocking is dependent upon the system clock rate returned by +//! SysCtlClockGet(); if it does not return the correct system clock rate then +//! the SSI clock rate will be incorrect. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_config) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIConfig(unsigned long ulBase, unsigned long ulProtocol, unsigned long ulMode, + unsigned long ulBitRate, unsigned long ulDataWidth) +{ + unsigned long ulMaxBitRate; + unsigned long ulRegVal; + unsigned long ulPreDiv; + unsigned long ulSCR; + unsigned long ulSPH_SPO; + unsigned long ulClock; + + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + ASSERT((ulProtocol == SSI_FRF_MOTO_MODE_0) || + (ulProtocol == SSI_FRF_MOTO_MODE_1) || + (ulProtocol == SSI_FRF_MOTO_MODE_2) || + (ulProtocol == SSI_FRF_MOTO_MODE_3) || + (ulProtocol == SSI_FRF_TI) || + (ulProtocol == SSI_FRF_NMW)); + ASSERT((ulMode == SSI_MODE_MASTER) || + (ulMode == SSI_MODE_SLAVE) || + (ulMode == SSI_MODE_SLAVE_OD)); + ASSERT((ulDataWidth >= 4) && (ulDataWidth <= 16)); + + // + // Get the processor clock rate. + // + ulClock = SysCtlClockGet(); + + // + // Validate the clock speed. + // + ASSERT(((ulMode == SSI_MODE_MASTER) && (ulBitRate <= (ulClock / 2))) || + ((ulMode != SSI_MODE_MASTER) && (ulBitRate <= (ulClock / 12)))); + ASSERT((ulClock / ulBitRate) <= (254 * 256)); + + // + // Set the mode. + // + ulRegVal = (ulMode == SSI_MODE_SLAVE_OD) ? SSI_CR1_SOD : 0; + ulRegVal |= (ulMode == SSI_MODE_MASTER) ? 0 : SSI_CR1_MS; + HWREG(ulBase + SSI_O_CR1) = ulRegVal; + + // + // Set the clock predivider. + // + ulMaxBitRate = ulClock / ulBitRate; + ulPreDiv = 0; + do + { + ulPreDiv += 2; + ulSCR = (ulMaxBitRate / ulPreDiv) - 1; + } + while(ulSCR > 255); + HWREG(ulBase + SSI_O_CPSR) = ulPreDiv; + + // + // Set protocol and clock rate. + // + ulSPH_SPO = ulProtocol << 6; + ulProtocol &= SSI_CR0_FRF_MASK; + ulRegVal = (ulSCR << 8) | ulSPH_SPO | ulProtocol | (ulDataWidth - 1); + HWREG(ulBase + SSI_O_CR0) = ulRegVal; +} +#endif + +//***************************************************************************** +// +//! Enables the synchronous serial interface. +//! +//! \param ulBase specifies the SSI module base address. +//! +//! This will enable operation of the synchronous serial interface. It must be +//! configured before it is enabled. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Read-modify-write the enable bit. + // + HWREG(ulBase + SSI_O_CR1) |= SSI_CR1_SSE; +} +#endif + +//***************************************************************************** +// +//! Disables the synchronous serial interface. +//! +//! \param ulBase specifies the SSI module base address. +//! +//! This will disable operation of the synchronous serial interface. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_disable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Read-modify-write the enable bit. + // + HWREG(ulBase + SSI_O_CR1) &= ~(SSI_CR1_SSE); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the synchronous serial interface. +//! +//! \param ulBase specifies the SSI module base address. +//! \param pfnHandler is a pointer to the function to be called when the +//! synchronous serial interface interrupt occurs. +//! +//! This sets the handler to be called when an SSI interrupt +//! occurs. This will enable the global interrupt in the interrupt controller; +//! specific SSI interrupts must be enabled via SSIIntEnable(). If necessary, +//! it is the interrupt handler's responsibility to clear the interrupt source +//! via SSIIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIIntRegister(unsigned long ulBase, void (*pfnHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(INT_SSI, pfnHandler); + + // + // Enable the synchronous serial interface interrupt. + // + IntEnable(INT_SSI); +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for the synchronous serial interface. +//! +//! \param ulBase specifies the SSI module base address. +//! +//! This function will clear the handler to be called when a SSI +//! interrupt occurs. This will also mask off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIIntUnregister(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Disable the interrupt. + // + IntDisable(INT_SSI); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_SSI); +} +#endif + +//***************************************************************************** +// +//! Enables individual SSI interrupt sources. +//! +//! \param ulBase specifies the SSI module base address. +//! \param ulIntFlags is a bit mask of the interrupt sources to be enabled. +//! +//! Enables the indicated SSI interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources +//! have no effect on the processor. The parameter \e ulIntFlags Can be +//! any of the SSI_TXFF, SSI_RXFF, SSI_RXTO, or SSI_RXOR values. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Enable the specified interrupts. + // + HWREG(ulBase + SSI_O_IM) |= ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Disables individual SSI interrupt sources. +//! +//! \param ulBase specifies the SSI module base address. +//! \param ulIntFlags is a bit mask of the interrupt sources to be disabled. +//! +//! Disables the indicated SSI interrupt sources. The parameter +//! \e ulIntFlags Can be any of the SSI_TXFF, SSI_RXFF, SSI_RXTO, +//! or SSI_RXOR values. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Disable the specified interrupts. + // + HWREG(ulBase + SSI_O_IM) &= ~(ulIntFlags); +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param ulBase specifies the SSI module base address. +//! \param bMasked is false if the raw interrupt status is required and +//! true if the masked interrupt status is required. +//! +//! This returns the interrupt status for the SSI module. +//! Either the raw interrupt status or the status of interrupts that are +//! allowed to reflect to the processor can be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! SSI_TXFF, SSI_RXFF, SSI_RXTO, and SSI_RXOR. +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SSIIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(ulBase + SSI_O_MIS)); + } + else + { + return(HWREG(ulBase + SSI_O_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears SSI interrupt sources. +//! +//! \param ulBase specifies the SSI module base address. +//! \param ulIntFlags is a bit mask of the interrupt sources to be cleared. +//! +//! The specified SSI interrupt sources are cleared, so that +//! they no longer assert. This must be done in the interrupt handler to +//! keep it from being called again immediately upon exit. +//! The parameter \e ulIntFlags can consist of either or both the SSI_RXTO +//! and SSI_RXOR values. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Clear the requested interrupt sources. + // + HWREG(ulBase + SSI_O_ICR) = ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Puts a data element into the SSI transmit FIFO. +//! +//! \param ulBase specifies the SSI module base address. +//! \param ulData data to be transmitted over the SSI interface. +//! +//! This function will place the supplied data into the transmit FIFO of +//! the specified SSI module. +//! +//! \note The upper 32 - N bits of the \e ulData will be discarded by the +//! hardware, where N is the data width as configured by SSIConfig(). For +//! example, if the interface is configured for 8 bit data width, the upper 24 +//! bits of \e ulData will be discarded. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_dataput) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIDataPut(unsigned long ulBase, unsigned long ulData) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + ASSERT((ulData & (0xfffffffe << (HWREG(ulBase + SSI_O_CR0) & + SSI_CR0_DSS))) == 0); + + // + // Wait until there is space. + // + while(!(HWREG(ulBase + SSI_O_SR) & SSI_SR_TNF)) + { + } + + // + // Write the data to the SSI. + // + HWREG(ulBase + SSI_O_DR) = ulData; +} +#endif + +//***************************************************************************** +// +//! Puts a data element into the SSI transmit FIFO. +//! +//! \param ulBase specifies the SSI module base address. +//! \param ulData data to be transmitted over the SSI interface. +//! +//! This function will place the supplied data into the transmit FIFO of +//! the specified SSI module. If there is no space in the FIFO, then this +//! function will return a zero. +//! +//! \note The upper 32 - N bits of the \e ulData will be discarded by the +//! hardware, where N is the data width as configured by SSIConfig(). For +//! example, if the interface is configured for 8 bit data width, the upper 24 +//! bits of \e ulData will be discarded. +//! +//! \return Returns the number of elements written to the SSI transmit FIFO. +// +//***************************************************************************** +#if defined(GROUP_datanonblockingput) || defined(BUILD_ALL) || defined(DOXYGEN) +long +SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + ASSERT((ulData & (0xfffffffe << (HWREG(ulBase + SSI_O_CR0) & + SSI_CR0_DSS))) == 0); + + // + // Check for space to write. + // + if(HWREG(ulBase + SSI_O_SR) & SSI_SR_TNF) + { + HWREG(ulBase + SSI_O_DR) = ulData; + return(1); + } + else + { + return(0); + } +} +#endif + +//***************************************************************************** +// +//! Gets a data element from the SSI receive FIFO. +//! +//! \param ulBase specifies the SSI module base address. +//! \param pulData pointer to a storage location for data that was received +//! over the SSI interface. +//! +//! This function will get received data from the receive FIFO of the specified +//! SSI module, and place that data into the location specified by the +//! \e pulData parameter. +//! +//! \note Only the lower N bits of the value written to \e pulData will contain +//! valid data, where N is the data width as configured by SSIConfig(). For +//! example, if the interface is configured for 8 bit data width, only the +//! lower 8 bits of the value written to \e pulData will contain valid data. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_dataget) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SSIDataGet(unsigned long ulBase, unsigned long *pulData) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Wait until there is data to be read. + // + while(!(HWREG(ulBase + SSI_O_SR) & SSI_SR_RNE)) + { + } + + // + // Read data from SSI. + // + *pulData = HWREG(ulBase + SSI_O_DR); +} +#endif + +//***************************************************************************** +// +//! Gets a data element from the SSI receive FIFO. +//! +//! \param ulBase specifies the SSI module base address. +//! \param pulData pointer to a storage location for data that was received +//! over the SSI interface. +//! +//! This function will get received data from the receive FIFO of +//! the specified SSI module, and place that data into the location specified +//! by the \e ulData parameter. If there is no data in the FIFO, then this +//! function will return a zero. +//! +//! \note Only the lower N bits of the value written to \e pulData will contain +//! valid data, where N is the data width as configured by SSIConfig(). For +//! example, if the interface is configured for 8 bit data width, only the +//! lower 8 bits of the value written to \e pulData will contain valid data. +//! +//! \return Returns the number of elements read from the SSI receive FIFO. +// +//***************************************************************************** +#if defined(GROUP_datanonblockingget) || defined(BUILD_ALL) || defined(DOXYGEN) +long +SSIDataNonBlockingGet(unsigned long ulBase, unsigned long *pulData) +{ + // + // Check the arguments. + // + ASSERT(ulBase == SSI_BASE); + + // + // Check for data to read. + // + if(HWREG(ulBase + SSI_O_SR) & SSI_SR_RNE) + { + *pulData = HWREG(ulBase + SSI_O_DR); + return(1); + } + else + { + return(0); + } +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/ssi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/ssi.h new file mode 100644 index 0000000..045d8cb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/ssi.h @@ -0,0 +1,89 @@ +//***************************************************************************** +// +// ssi.h - Prototypes for the Synchronous Serial Interface Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SSI_H__ +#define __SSI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to SSIIntEnable, SSIIntDisable, and SSIIntClear +// as the ulIntFlags parameter, and returned by SSIIntStatus. +// +//***************************************************************************** +#define SSI_TXFF 0x00000008 // TX FIFO half empty or less +#define SSI_RXFF 0x00000004 // RX FIFO half full or less +#define SSI_RXTO 0x00000002 // RX timeout +#define SSI_RXOR 0x00000001 // RX overrun + +//***************************************************************************** +// +// Values that can be passed to SSIConfig. +// +//***************************************************************************** +#define SSI_FRF_MOTO_MODE_0 0x00000000 // Moto fmt, polarity 0, phase 0 +#define SSI_FRF_MOTO_MODE_1 0x00000002 // Moto fmt, polarity 0, phase 1 +#define SSI_FRF_MOTO_MODE_2 0x00000001 // Moto fmt, polarity 1, phase 0 +#define SSI_FRF_MOTO_MODE_3 0x00000003 // Moto fmt, polarity 1, phase 1 +#define SSI_FRF_TI 0x00000010 // TI frame format +#define SSI_FRF_NMW 0x00000020 // National MicroWire frame format + +#define SSI_MODE_MASTER 0x00000000 // SSI master +#define SSI_MODE_SLAVE 0x00000001 // SSI slave +#define SSI_MODE_SLAVE_OD 0x00000002 // SSI slave with output disabled + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SSIConfig(unsigned long ulBase, unsigned long ulProtocol, + unsigned long ulMode, unsigned long ulBitRate, + unsigned long ulDataWidth); +extern void SSIDataGet(unsigned long ulBase, unsigned long *pulData); +extern long SSIDataNonBlockingGet(unsigned long ulBase, + unsigned long *pulData); +extern void SSIDataPut(unsigned long ulBase, unsigned long ulData); +extern long SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData); +extern void SSIDisable(unsigned long ulBase); +extern void SSIEnable(unsigned long ulBase); +extern void SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern unsigned long SSIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void SSIIntUnregister(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __SSI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/sysctl.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/sysctl.c new file mode 100644 index 0000000..539d0f7 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/sysctl.c @@ -0,0 +1,1889 @@ +//***************************************************************************** +// +// sysctl.c - Driver for the system controller. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. ALl rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup sysctl_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_nvic.h" +#include "../hw_sysctl.h" +#include "../hw_types.h" +#include "cpu.h" +#include "debug.h" +#include "interrupt.h" +#include "sysctl.h" + +//***************************************************************************** +// +// An array that maps the "peripheral set" number (which is stored in the upper +// nibble of the SYSCTL_PERIPH_* defines) to the SYSCTL DC? register that +// contains the peripheral present bit for that peripheral. +// +//***************************************************************************** +#if defined(GROUP_puldcregs) || defined(BUILD_ALL) +const unsigned long g_pulDCRegs[] = +{ + SYSCTL_DC1, + SYSCTL_DC2, + SYSCTL_DC4, + SYSCTL_DC1 +}; +#else +extern const unsigned long g_pulDCRegs[]; +#endif + +//***************************************************************************** +// +// An array that maps the "peripheral set" number (which is stored in the upper +// nibble of the SYSCTL_PERIPH_* defines) to the SYSCTL_SRCR? register that +// controls the software reset for that peripheral. +// +//***************************************************************************** +#if defined(GROUP_pulsrcrregs) || defined(BUILD_ALL) +const unsigned long g_pulSRCRRegs[] = +{ + SYSCTL_SRCR0, + SYSCTL_SRCR1, + SYSCTL_SRCR2 +}; +#else +extern const unsigned long g_pulSRCRRegs[]; +#endif + +//***************************************************************************** +// +// An array that maps the "peripheral set" number (which is stored in the upper +// nibble of the SYSCTL_PERIPH_* defines) to the SYSCTL_RCGC? register that +// controls the run-mode enable for that peripheral. +// +//***************************************************************************** +#if defined(GROUP_pulrcgcregs) || defined(BUILD_ALL) +const unsigned long g_pulRCGCRegs[] = +{ + SYSCTL_RCGC0, + SYSCTL_RCGC1, + SYSCTL_RCGC2 +}; +#else +extern const unsigned long g_pulRCGCRegs[]; +#endif + +//***************************************************************************** +// +// An array that maps the "peripheral set" number (which is stored in the upper +// nibble of the SYSCTL_PERIPH_* defines) to the SYSCTL_SCGC? register that +// controls the sleep-mode enable for that peripheral. +// +//***************************************************************************** +#if defined(GROUP_pulscgcregs) || defined(BUILD_ALL) +const unsigned long g_pulSCGCRegs[] = +{ + SYSCTL_SCGC0, + SYSCTL_SCGC1, + SYSCTL_SCGC2 +}; +#else +extern const unsigned long g_pulSCGCRegs[]; +#endif + +//***************************************************************************** +// +// An array that maps the "peripheral set" number (which is stored in the upper +// nibble of the SYSCTL_PERIPH_* defines) to the SYSCTL_DCGC? register that +// controls the deep-sleep-mode enable for that peripheral. +// +//***************************************************************************** +#if defined(GROUP_pulDCGCregs) || defined(BUILD_ALL) +const unsigned long g_pulDCGCRegs[] = +{ + SYSCTL_DCGC0, + SYSCTL_DCGC1, + SYSCTL_DCGC2 +}; +#else +extern const unsigned long g_pulDCGCRegs[]; +#endif + +//***************************************************************************** +// +// An array that maps the crystal number in RCC to a frequency. +// +//***************************************************************************** +#if defined(GROUP_pulxtals) || defined(BUILD_ALL) +const unsigned long g_pulXtals[] = +{ + 3579545, + 3686400, + 4000000, + 4096000, + 4915200, + 5000000, + 5120000, + 6000000, + 6144000, + 7372800, + 8000000, + 8192000 +}; +#else +extern const unsigned long g_pulXtals[]; +#endif + +//***************************************************************************** +// +//! Gets the size of the SRAM. +//! +//! This function determines the size of the SRAM on the Stellaris device. +//! +//! \return The total number of bytes of SRAM. +// +//***************************************************************************** +#if defined(GROUP_sramsizeget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlSRAMSizeGet(void) +{ + // + // Compute the size of the SRAM. + // + return(((HWREG(SYSCTL_DC0) & SYSCTL_DC0_SRAMSZ_MASK) >> 8) + 0x100); +} +#endif + +//***************************************************************************** +// +//! Gets the size of the flash. +//! +//! This function determines the size of the flash on the Stellaris device. +//! +//! \return The total number of bytes of flash. +// +//***************************************************************************** +#if defined(GROUP_flashsizeget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlFlashSizeGet(void) +{ + // + // Compute the size of the flash. + // + return(((HWREG(SYSCTL_DC0) & SYSCTL_DC0_FLASHSZ_MASK) << 11) + 0x800); +} +#endif + +//***************************************************************************** +// +//! Determines if a pin is present. +//! +//! \param ulPin is the pin in question. +//! +//! Determines if a particular pin is present in the device. The PWM, analog +//! comparators, ADC, and timers have a varying number of pins across members +//! of the Stellaris family; this will determine which are present on this +//! device. +//! +//! The \b ulPin argument must be only one of the following values: +//! \b SYSCTL_PIN_PWM0, \b SYSCTL_PIN_PWM1, \b SYSCTL_PIN_PWM2, +//! \b SYSCTL_PIN_PWM3, \b SYSCTL_PIN_PWM4, \b SYSCTL_PIN_PWM5, +//! \b SYSCTL_PIN_C0MINUS, \b SYSCTL_PIN_C0PLUS, \b SYSCTL_PIN_C0O, +//! \b SYSCTL_PIN_C1MINUS, \b SYSCTL_PIN_C1PLUS, \b SYSCTL_PIN_C1O, +//! \b SYSCTL_PIN_C2MINUS, \b SYSCTL_PIN_C2PLUS, \b SYSCTL_PIN_C2O, +//! \b SYSCTL_PIN_ADC0, \b SYSCTL_PIN_ADC1, \b SYSCTL_PIN_ADC2, +//! \b SYSCTL_PIN_ADC3, \b SYSCTL_PIN_ADC4, \b SYSCTL_PIN_ADC5, +//! \b SYSCTL_PIN_ADC6, \b SYSCTL_PIN_ADC7, \b SYSCTL_PIN_CCP0, +//! \b SYSCTL_PIN_CCP1, \b SYSCTL_PIN_CCP2, \b SYSCTL_PIN_CCP3, +//! \b SYSCTL_PIN_CCP4, \b SYSCTL_PIN_CCP5, or \b SYSCTL_PIN_32KHZ. +//! +//! \return Returns \b true if the specified pin is present and \b false if it +//! is not. +// +//***************************************************************************** +#if defined(GROUP_pinpresent) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +SysCtlPinPresent(unsigned long ulPin) +{ + // + // Check the arguments. + // + ASSERT((ulPin == SYSCTL_PIN_PWM0) || + (ulPin == SYSCTL_PIN_PWM1) || + (ulPin == SYSCTL_PIN_PWM2) || + (ulPin == SYSCTL_PIN_PWM3) || + (ulPin == SYSCTL_PIN_PWM4) || + (ulPin == SYSCTL_PIN_PWM5) || + (ulPin == SYSCTL_PIN_C0MINUS) || + (ulPin == SYSCTL_PIN_C0PLUS) || + (ulPin == SYSCTL_PIN_C0O) || + (ulPin == SYSCTL_PIN_C1MINUS) || + (ulPin == SYSCTL_PIN_C1PLUS) || + (ulPin == SYSCTL_PIN_C1O) || + (ulPin == SYSCTL_PIN_C2MINUS) || + (ulPin == SYSCTL_PIN_C2PLUS) || + (ulPin == SYSCTL_PIN_C2O) || + (ulPin == SYSCTL_PIN_ADC0) || + (ulPin == SYSCTL_PIN_ADC1) || + (ulPin == SYSCTL_PIN_ADC2) || + (ulPin == SYSCTL_PIN_ADC3) || + (ulPin == SYSCTL_PIN_ADC4) || + (ulPin == SYSCTL_PIN_ADC5) || + (ulPin == SYSCTL_PIN_ADC6) || + (ulPin == SYSCTL_PIN_ADC7) || + (ulPin == SYSCTL_PIN_CCP0) || + (ulPin == SYSCTL_PIN_CCP1) || + (ulPin == SYSCTL_PIN_CCP2) || + (ulPin == SYSCTL_PIN_CCP3) || + (ulPin == SYSCTL_PIN_CCP4) || + (ulPin == SYSCTL_PIN_CCP5) || + (ulPin == SYSCTL_PIN_32KHZ)) + + // + // Determine if this pin is present. + // + if(HWREG(SYSCTL_DC3) & ulPin) + { + return(true); + } + else + { + return(false); + } +} +#endif + +//***************************************************************************** +// +//! Determines if a peripheral is present. +//! +//! \param ulPeripheral is the peripheral in question. +//! +//! Determines if a particular peripheral is present in the device. Each +//! member of the Stellaris family has a different peripheral set; this will +//! determine which are present on this device. +//! +//! The \b ulPeripheral argument must be only one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, +//! \b SYSCTL_PERIPH_GPIOE, \b SYSCTL_PERIPH_MPU, \b SYSCTL_PERIPH_TEMP, or +//! \b SYSCTL_PERIPH_PLL. +//! +//! \return Returns \b true if the specified peripheral is present and \b false +//! if it is not. +// +//***************************************************************************** +#if defined(GROUP_peripheralpresent) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +SysCtlPeripheralPresent(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE) || + (ulPeripheral == SYSCTL_PERIPH_MPU) || + (ulPeripheral == SYSCTL_PERIPH_TEMP) || + (ulPeripheral == SYSCTL_PERIPH_PLL)); + + // + // Read the correct DC register and determine if this peripheral exists. + // + if(HWREG(g_pulDCRegs[ulPeripheral >> 28]) & ulPeripheral & 0x0fffffff) + { + return(true); + } + else + { + return(false); + } +} +#endif + +//***************************************************************************** +// +//! Performs a software reset of a peripheral. +//! +//! \param ulPeripheral is the peripheral to reset. +//! +//! This function performs a software reset of the specified peripheral. An +//! individual peripheral reset signal is asserted for a brief period and then +//! deasserted, leaving the peripheral in a operating state but in its reset +//! condition. +//! +//! The \b ulPeripheral argument must be only one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheralreset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlPeripheralReset(unsigned long ulPeripheral) +{ + volatile unsigned long ulDelay; + + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Put the peripheral into the reset state. + // + HWREG(g_pulSRCRRegs[ulPeripheral >> 28]) |= ulPeripheral & 0x0fffffff; + + // + // Delay for a little bit. + // + for(ulDelay = 0; ulDelay < 16; ulDelay++) + { + } + + // + // Take the peripheral out of the reset state. + // + HWREG(g_pulSRCRRegs[ulPeripheral >> 28]) &= ~(ulPeripheral); +} +#endif + +//***************************************************************************** +// +//! Enables a peripheral. +//! +//! \param ulPeripheral is the peripheral to enable. +//! +//! Peripherals are enabled with this function. At power-up, all peripherals +//! are disabled; they must be enabled in order to operate or respond to +//! register reads/writes. +//! +//! The \b ulPeripheral argument must be only one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheralenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlPeripheralEnable(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Enable this peripheral. + // + HWREG(g_pulRCGCRegs[ulPeripheral >> 28]) |= ulPeripheral & 0x0fffffff; +} +#endif + +//***************************************************************************** +// +//! Disables a peripheral. +//! +//! \param ulPeripheral is the peripheral to disable. +//! +//! Peripherals are disabled with this function. Once disabled, they will not +//! operate or respond to register reads/writes. +//! +//! The \b ulPeripheral argument must be only one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheraldisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlPeripheralDisable(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Disable this peripheral. + // + HWREG(g_pulRCGCRegs[ulPeripheral >> 28]) &= ~(ulPeripheral & 0x0fffffff); +} +#endif + +//***************************************************************************** +// +//! Enables a peripheral in sleep mode. +//! +//! \param ulPeripheral is the peripheral to enable in sleep mode. +//! +//! This function allows a peripheral to continue operating when the processor +//! goes into sleep mode. Since the clocking configuration of the device does +//! not change, any peripheral can safely continue operating while the +//! processor is in sleep mode, and can therefore wake the processor from sleep +//! mode. +//! +//! Sleep mode clocking of peripherals must be enabled via +//! SysCtlPeripheralClockGating(); if disabled, the peripheral sleep mode +//! configuration is maintained but has no effect when sleep mode is entered. +//! +//! The \b ulPeripheral argument must be only one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheralsleepenable) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlPeripheralSleepEnable(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Enable this peripheral in sleep mode. + // + HWREG(g_pulSCGCRegs[ulPeripheral >> 28]) |= ulPeripheral & 0x0fffffff; +} +#endif + +//***************************************************************************** +// +//! Disables a peripheral in sleep mode. +//! +//! \param ulPeripheral is the peripheral to disable in sleep mode. +//! +//! This function causes a peripheral to stop operating when the processor goes +//! into sleep mode. Disabling peripherals while in sleep mode helps to lower +//! the current draw of the device. If enabled (via SysCtlPeripheralEnable()), +//! the peripheral will automatically resume operation when the processor +//! leaves sleep mode, maintaining its entire state from before sleep mode was +//! entered. +//! +//! Sleep mode clocking of peripherals must be enabled via +//! SysCtlPeripheralClockGating(); if disabled, the peripheral sleep mode +//! configuration is maintained but has no effect when sleep mode is entered. +//! +//! The \b ulPeripheral argument must be only one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheralsleepdisable) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlPeripheralSleepDisable(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Disable this peripheral in sleep mode. + // + HWREG(g_pulSCGCRegs[ulPeripheral >> 28]) &= ~(ulPeripheral & 0x0fffffff); +} +#endif + +//***************************************************************************** +// +//! Enables a peripheral in deep-sleep mode. +//! +//! \param ulPeripheral is the peripheral to enable in deep-sleep mode. +//! +//! This function allows a peripheral to continue operating when the processor +//! goes into deep-sleep mode. Since the clocking configuration of the device +//! may change, not all peripherals can safely continue operating while the +//! processor is in sleep mode. Those that must run at a particular frequency +//! (such as a UART) will not work as expected if the clock changes. It is the +//! responsibility of the caller to make sensible choices. +//! +//! Deep-sleep mode clocking of peripherals must be enabled via +//! SysCtlPeripheralClockGating(); if disabled, the peripheral deep-sleep mode +//! configuration is maintained but has no effect when deep-sleep mode is +//! entered. +//! +//! The \b ulPeripheral argument must be one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheraldeepsleepenable) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Enable this peripheral in deep-sleep mode. + // + HWREG(g_pulDCGCRegs[ulPeripheral >> 28]) |= ulPeripheral & 0x0fffffff; +} +#endif + +//***************************************************************************** +// +//! Disables a peripheral in deep-sleep mode. +//! +//! \param ulPeripheral is the peripheral to disable in deep-sleep mode. +//! +//! This function causes a peripheral to stop operating when the processor goes +//! into deep-sleep mode. Disabling peripherals while in deep-sleep mode helps +//! to lower the current draw of the device, and can keep peripherals that +//! require a particular clock frequency from operating when the clock changes +//! as a result of entering deep-sleep mode. If enabled (via +//! SysCtlPeripheralEnable()), the peripheral will automatically resume +//! operation when the processor leaves deep-sleep mode, maintaining its entire +//! state from before deep-sleep mode was entered. +//! +//! Deep-sleep mode clocking of peripherals must be enabled via +//! SysCtlPeripheralClockGating(); if disabled, the peripheral deep-sleep mode +//! configuration is maintained but has no effect when deep-sleep mode is +//! entered. +//! +//! The \b ulPeripheral argument must be one of the following values: +//! \b SYSCTL_PERIPH_PWM, \b SYSCTL_PERIPH_ADC, \b SYSCTL_PERIPH_WDOG, +//! \b SYSCTL_PERIPH_UART0, \b SYSCTL_PERIPH_UART1, \b SYSCTL_PERIPH_SSI, +//! \b SYSCTL_PERIPH_QEI, \b SYSCTL_PERIPH_I2C, \b SYSCTL_PERIPH_TIMER0, +//! \b SYSCTL_PERIPH_TIMER1, \b SYSCTL_PERIPH_TIMER2, \b SYSCTL_PERIPH_COMP0, +//! \b SYSCTL_PERIPH_COMP1, \b SYSCTL_PERIPH_COMP2, \b SYSCTL_PERIPH_GPIOA, +//! \b SYSCTL_PERIPH_GPIOB, \b SYSCTL_PERIPH_GPIOC, \b SYSCTL_PERIPH_GPIOD, or +//! \b SYSCTL_PERIPH_GPIOE. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheraldeepsleepdisable) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral) +{ + // + // Check the arguments. + // + ASSERT((ulPeripheral == SYSCTL_PERIPH_PWM) || + (ulPeripheral == SYSCTL_PERIPH_ADC) || + (ulPeripheral == SYSCTL_PERIPH_WDOG) || + (ulPeripheral == SYSCTL_PERIPH_UART0) || + (ulPeripheral == SYSCTL_PERIPH_UART1) || + (ulPeripheral == SYSCTL_PERIPH_SSI) || + (ulPeripheral == SYSCTL_PERIPH_QEI) || + (ulPeripheral == SYSCTL_PERIPH_I2C) || + (ulPeripheral == SYSCTL_PERIPH_TIMER0) || + (ulPeripheral == SYSCTL_PERIPH_TIMER1) || + (ulPeripheral == SYSCTL_PERIPH_TIMER2) || + (ulPeripheral == SYSCTL_PERIPH_COMP0) || + (ulPeripheral == SYSCTL_PERIPH_COMP1) || + (ulPeripheral == SYSCTL_PERIPH_COMP2) || + (ulPeripheral == SYSCTL_PERIPH_GPIOA) || + (ulPeripheral == SYSCTL_PERIPH_GPIOB) || + (ulPeripheral == SYSCTL_PERIPH_GPIOC) || + (ulPeripheral == SYSCTL_PERIPH_GPIOD) || + (ulPeripheral == SYSCTL_PERIPH_GPIOE)); + + // + // Disable this peripheral in deep-sleep mode. + // + HWREG(g_pulDCGCRegs[ulPeripheral >> 28]) &= ~(ulPeripheral & 0x0fffffff); +} +#endif + +//***************************************************************************** +// +//! Controls peripheral clock gating in sleep and deep-sleep mode. +//! +//! \param bEnable is a boolean that is \b true if the sleep and deep-sleep +//! peripheral configuration should be used and \b false if not. +//! +//! This function controls how peripherals are clocked when the processor goes +//! into sleep or deep-sleep mode. By default, the peripherals are clocked the +//! same as in run mode; if peripheral clock gating is enabled they are clocked +//! according to the configuration set by SysCtlPeripheralSleepEnable(), +//! SysCtlPeripheralSleepDisable(), SysCtlPeripheralDeepSleepEnable(), and +//! SysCtlPeripheralDeepSleepDisable(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_peripheralclockgating) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlPeripheralClockGating(tBoolean bEnable) +{ + // + // Enable peripheral clock gating as requested. + // + if(bEnable) + { + HWREG(SYSCTL_RCC) |= SYSCTL_RCC_ACG; + } + else + { + HWREG(SYSCTL_RCC) &= ~(SYSCTL_RCC_ACG); + } +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the system control interrupt. +//! +//! \param pfnHandler is a pointer to the function to be called when the system +//! control interrupt occurs. +//! +//! This sets the handler to be called when a system control interrupt occurs. +//! This will enable the global interrupt in the interrupt controller; specific +//! system control interrupts must be enabled via SysCtlIntEnable(). It is the +//! interrupt handler's responsibility to clear the interrupt source via +//! SysCtlIntClear(). +//! +//! System control can generate interrupts when the PLL achieves lock, if the +//! internal LDO current limit is exceeded, if the internal oscillator fails, +//! if the main oscillator fails, if the internal LDO output voltage droops too +//! much, if the external voltage droops too much, or if the PLL fails. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlIntRegister(void (*pfnHandler)(void)) +{ + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(INT_SYSCTL, pfnHandler); + + // + // Enable the system control interrupt. + // + IntEnable(INT_SYSCTL); +} +#endif + +//***************************************************************************** +// +//! Unregisters the interrupt handler for the system control interrupt. +//! +//! This function will clear the handler to be called when a system control +//! interrupt occurs. This will also mask off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlIntUnregister(void) +{ + // + // Disable the interrupt. + // + IntDisable(INT_SYSCTL); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_SYSCTL); +} +#endif + +//***************************************************************************** +// +//! Enables individual system control interrupt sources. +//! +//! \param ulInts is a bit mask of the interrupt sources to be enabled. Must +//! be a logical OR of \b SYSCTL_INT_PLL_LOCK, \b SYSCTL_INT_CUR_LIMIT, +//! \b SYSCTL_INT_IOSC_FAIL, \b SYSCTL_INT_MOSC_FAIL, \b SYSCTL_INT_POR, +//! \b SYSCTL_INT_BOR, and/or \b SYSCTL_INT_PLL_FAIL. +//! +//! Enables the indicated system control interrupt sources. Only the sources +//! that are enabled can be reflected to the processor interrupt; disabled +//! sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlIntEnable(unsigned long ulInts) +{ + // + // Enable the specified interrupts. + // + HWREG(SYSCTL_IMC) |= ulInts; +} +#endif + +//***************************************************************************** +// +//! Disables individual system control interrupt sources. +//! +//! \param ulInts is a bit mask of the interrupt sources to be disabled. Must +//! be a logical OR of \b SYSCTL_INT_PLL_LOCK, \b SYSCTL_INT_CUR_LIMIT, +//! \b SYSCTL_INT_IOSC_FAIL, \b SYSCTL_INT_MOSC_FAIL, \b SYSCTL_INT_POR, +//! \b SYSCTL_INT_BOR, and/or \b SYSCTL_INT_PLL_FAIL. +//! +//! Disables the indicated system control interrupt sources. Only the sources +//! that are enabled can be reflected to the processor interrupt; disabled +//! sources have no effect on the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlIntDisable(unsigned long ulInts) +{ + // + // Disable the specified interrupts. + // + HWREG(SYSCTL_IMC) &= ~(ulInts); +} +#endif + +//***************************************************************************** +// +//! Clears system control interrupt sources. +//! +//! \param ulInts is a bit mask of the interrupt sources to be cleared. Must +//! be a logical OR of \b SYSCTL_INT_PLL_LOCK, \b SYSCTL_INT_CUR_LIMIT, +//! \b SYSCTL_INT_IOSC_FAIL, \b SYSCTL_INT_MOSC_FAIL, \b SYSCTL_INT_POR, +//! \b SYSCTL_INT_BOR, and/or \b SYSCTL_INT_PLL_FAIL. +//! +//! The specified system control interrupt sources are cleared, so that they no +//! longer assert. This must be done in the interrupt handler to keep it from +//! being called again immediately upon exit. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlIntClear(unsigned long ulInts) +{ + // + // Clear the requested interrupt sources. + // + HWREG(SYSCTL_MISC) = ulInts; +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param bMasked is false if the raw interrupt status is required and true if +//! the masked interrupt status is required. +//! +//! This returns the interrupt status for the system controller. Either the +//! raw interrupt status or the status of interrupts that are allowed to +//! reflect to the processor can be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! \b SYSCTL_INT_PLL_LOCK, \b SYSCTL_INT_CUR_LIMIT, \b SYSCTL_INT_IOSC_FAIL, +//! \b SYSCTL_INT_MOSC_FAIL, \b SYSCTL_INT_POR, \b SYSCTL_INT_BOR, and +//! \b SYSCTL_INT_PLL_FAIL. +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlIntStatus(tBoolean bMasked) +{ + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(SYSCTL_MISC)); + } + else + { + return(HWREG(SYSCTL_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Sets the output voltage of the LDO. +//! +//! \param ulVoltage is the required output voltage from the LDO. Must be one +//! of \b SYSCTL_LDO_2_25V, \b SYSCTL_LDO_2_30V, \b SYSCTL_LDO_2_35V, +//! \b SYSCTL_LDO_2_40V, \b SYSCTL_LDO_2_45V, \b SYSCTL_LDO_2_50V, +//! \b SYSCTL_LDO_2_55V, \b SYSCTL_LDO_2_60V, \b SYSCTL_LDO_2_65V, +//! \b SYSCTL_LDO_2_70V, or \b SYSCTL_LDO_2_75V. +//! +//! This function sets the output voltage of the LDO. The default voltage is +//! 2.5 V; it can be adjusted +/- 10%. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_ldoset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlLDOSet(unsigned long ulVoltage) +{ + // + // Check the arguments. + // + ASSERT((ulVoltage == SYSCTL_LDO_2_25V) || + (ulVoltage == SYSCTL_LDO_2_30V) || + (ulVoltage == SYSCTL_LDO_2_35V) || + (ulVoltage == SYSCTL_LDO_2_40V) || + (ulVoltage == SYSCTL_LDO_2_45V) || + (ulVoltage == SYSCTL_LDO_2_50V) || + (ulVoltage == SYSCTL_LDO_2_55V) || + (ulVoltage == SYSCTL_LDO_2_60V) || + (ulVoltage == SYSCTL_LDO_2_65V) || + (ulVoltage == SYSCTL_LDO_2_70V) || + (ulVoltage == SYSCTL_LDO_2_75V)); + + // + // Set the LDO voltage to the requested value. + // + HWREG(SYSCTL_LDOPCTL) = ulVoltage; +} +#endif + +//***************************************************************************** +// +//! Gets the output voltage of the LDO. +//! +//! This function determines the output voltage of the LDO, as specified by the +//! control register. +//! +//! \return Returns the current voltage of the LDO; will be one of +//! \b SYSCTL_LDO_2_25V, \b SYSCTL_LDO_2_30V, \b SYSCTL_LDO_2_35V, +//! \b SYSCTL_LDO_2_40V, \b SYSCTL_LDO_2_45V, \b SYSCTL_LDO_2_50V, +//! \b SYSCTL_LDO_2_55V, \b SYSCTL_LDO_2_60V, \b SYSCTL_LDO_2_65V, +//! \b SYSCTL_LDO_2_70V, or \b SYSCTL_LDO_2_75V. +// +//***************************************************************************** +#if defined(GROUP_ldoget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlLDOGet(void) +{ + // + // Return the LDO voltage setting. + // + return(HWREG(SYSCTL_LDOPCTL)); +} +#endif + +//***************************************************************************** +// +//! Configures the LDO failure control. +//! +//! \param ulConfig is the required LDO failure control setting; can be either +//! \b SYSCTL_LDOCFG_ARST or \b SYSCTL_LDOCFG_NORST. +//! +//! This function allows the LDO to be configured to cause a processor reset +//! when the output voltage becomes unregulated. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_ldoconfigset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlLDOConfigSet(unsigned long ulConfig) +{ + // + // Check hte arguments. + // + ASSERT((ulConfig == SYSCTL_LDOCFG_ARST) || + (ulConfig == SYSCTL_LDOCFG_NORST)); + + // + // Set the reset control as requested. + // + HWREG(SYSCTL_LDOARST) = ulConfig; +} +#endif + +//***************************************************************************** +// +//! Resets the device. +//! +//! This function will perform a software reset of the entire device. The +//! processor and all peripherals will be reset and all device registers will +//! return to their default values (with the exception of the reset cause +//! register, which will maintain its current value but have the software reset +//! bit set as well). +//! +//! \return This function does not return. +// +//***************************************************************************** +#if defined(GROUP_reset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlReset(void) +{ + // + // Perform a software reset request. This will cause the device to reset, + // no further code will be executed. + // + HWREG(NVIC_APINT) = NVIC_APINT_VECTKEY | NVIC_APINT_SYSRESETREQ; + + // + // The device should have reset, so this should never be reached. Just in + // case, loop forever. + // + while(1) + { + } +} +#endif + +//***************************************************************************** +// +//! Puts the processor into sleep mode. +//! +//! This function places the processor into sleep mode; it will not return +//! until the processor returns to run mode. The peripherals that are enabled +//! via SysCtlPeripheralSleepEnable() continue to operate and can wake up the +//! processor (if automatic clock gating is enabled with +//! SysCtlPeripheralClockGating(), otherwise all peripherals continue to +//! operate). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_sleep) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlSleep(void) +{ + // + // Wait for an interrupt. + // + CPUwfi(); +} +#endif + +//***************************************************************************** +// +//! Puts the processor into deep-sleep mode. +//! +//! This function places the processor into deep-sleep mode; it will not return +//! until the processor returns to run mode. The peripherals that are enabled +//! via SysCtlPeripheralDeepSleepEnable() continue to operate and can wake up +//! the processor (if automatic clock gating is enabled with +//! SysCtlPeripheralClockGating(), otherwise all peripherals continue to +//! operate). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_deepsleep) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlDeepSleep(void) +{ + // + // Enable deep-sleep. + // + HWREG(NVIC_SYS_CTRL) |= NVIC_SYS_CTRL_SLEEPDEEP; + + // + // Wait for an interrupt. + // + CPUwfi(); + + // + // Disable deep-sleep so that a future sleep will work correctly. + // + HWREG(NVIC_SYS_CTRL) &= ~(NVIC_SYS_CTRL_SLEEPDEEP); +} +#endif + +//***************************************************************************** +// +//! Gets the reason for a reset. +//! +//! This function will return the reason(s) for a reset. Since the reset +//! reasons are sticky until either cleared by software or an external reset, +//! multiple reset reasons may be returned if multiple resets have occurred. +//! The reset reason will be a logical OR of \b SYSCTL_CAUSE_LDO, +//! \b SYSCTL_CAUSE_SW, \b SYSCTL_CAUSE_WDOG, \b SYSCTL_CAUSE_BOR, +//! \b SYSCTL_CAUSE_POR, and/or \b SYSCTL_CAUSE_EXT. +//! +//! \return The reason(s) for a reset. +// +//***************************************************************************** +#if defined(GROUP_resetcauseget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlResetCauseGet(void) +{ + // + // Return the reset reasons. + // + return(HWREG(SYSCTL_RESC)); +} +#endif + +//***************************************************************************** +// +//! Clears reset reasons. +//! +//! \param ulCauses are the reset causes to be cleared; must be a logical OR of +//! \b SYSCTL_CAUSE_LDO, \b SYSCTL_CAUSE_SW, \b SYSCTL_CAUSE_WDOG, +//! \b SYSCTL_CAUSE_BOR, \b SYSCTL_CAUSE_POR, and/or \b SYSCTL_CAUSE_EXT. +//! +//! This function clears the specified sticky reset reasons. Once cleared, +//! another reset for the same reason can be detected, and a reset for a +//! different reason can be distinguished (instead of having two reset causes +//! set). If the reset reason is used by an application, all reset causes +//! should be cleared after they are retrieved with SysCtlResetCauseGet(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_resetcauseclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlResetCauseClear(unsigned long ulCauses) +{ + // + // Clear the given reset reasons. + // + HWREG(SYSCTL_RESC) &= ~(ulCauses); +} +#endif + +//***************************************************************************** +// +//! Configures the brown-out control. +//! +//! \param ulConfig is the desired configuration of the brown-out control. +//! Must be the logical OR of \b SYSCTL_BOR_RESET and/or +//! \b SYSCTL_BOR_RESAMPLE. +//! \param ulDelay is the number of internal oscillator cycles to wait before +//! resampling an asserted brown-out signal. This value only has meaning when +//! \b SYSCTL_BOR_RESAMPLE is set and must be less than 8192. +//! +//! This function configures how the brown-out control operates. It can detect +//! a brown-out by looking at only the brown-out output, or it can wait for it +//! to be active for two consecutive samples separated by a configurable time. +//! When it detects a brown-out condition, it can either reset the device or +//! generate a processor interrupt. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_brownoutconfigset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlBrownOutConfigSet(unsigned long ulConfig, unsigned long ulDelay) +{ + // + // Check the arguments. + // + ASSERT(!(ulConfig & ~(SYSCTL_BOR_RESET | SYSCTL_BOR_RESAMPLE))); + ASSERT(ulDelay < 8192); + + // + // Configure the brown-out reset control. + // + HWREG(SYSCTL_PBORCTL) = (ulDelay << SYSCTL_PBORCTL_BOR_SH) | ulConfig; +} +#endif + +//***************************************************************************** +// +//! Sets the clocking of the device. +//! +//! \param ulConfig is the required configuration of the device clocking. +//! +//! This function configures the clocking of the device. The input crystal +//! frequency, oscillator to be used, use of the PLL, and the system clock +//! divider are all configured with this function. +//! +//! The \b ulConfig parameter is the logical OR of several different values, +//! many of which are grouped into sets where only one can be chosen. +//! +//! The system clock divider is chosen with one of the following values: +//! \b SYSCTL_SYSDIV_1, \b SYSCTL_SYSDIV_2, \b SYSCTL_SYSDIV_3, +//! \b SYSCTL_SYSDIV_4, \b SYSCTL_SYSDIV_5, \b SYSCTL_SYSDIV_6, +//! \b SYSCTL_SYSDIV_7, \b SYSCTL_SYSDIV_8, \b SYSCTL_SYSDIV_9, +//! \b SYSCTL_SYSDIV_10, \b SYSCTL_SYSDIV_11, \b SYSCTL_SYSDIV_12, +//! \b SYSCTL_SYSDIV_13, \b SYSCTL_SYSDIV_14, \b SYSCTL_SYSDIV_15, or +//! \b SYSCTL_SYSDIV_16. +//! +//! The use of the PLL is chosen with either \b SYSCTL_USE_PLL or +//! \b SYSCTL_USE_OSC. +//! +//! The external crystal frequency is chosen with one of the following values: +//! \b SYSCTL_XTAL_3_57MHZ, \b SYSCTL_XTAL_3_68MHZ, \b SYSCTL_XTAL_4MHZ, +//! \b SYSCTL_XTAL_4_09MHZ, \b SYSCTL_XTAL_4_91MHZ, \b SYSCTL_XTAL_5MHZ, +//! \b SYSCTL_XTAL_5_12MHZ, \b SYSCTL_XTAL_6MHZ, \b SYSCTL_XTAL_6_14MHZ, +//! \b SYSCTL_XTAL_7_37MHZ, \b SYSCTL_XTAL_8MHZ, or \b SYSCTL_XTAL_8_19MHZ. +//! +//! The oscillator source is chosen with one of the following values: +//! \b SYSCTL_OSC_MAIN, \b SYSCTL_OSC_INT, or \b SYSCTL_OSC_INT4. +//! +//! The internal and main oscillators are disabled with the +//! \b SYSCTL_INT_OSC_DIS and \b SYSCTL_MAIN_OSC_DIS flags, respectively. +//! The external oscillator must be enabled in order to use an external clock +//! source. Note that attempts to disable the oscillator used to clock the +//! device will be prevented by the hardware. +//! +//! To clock the system from an external source (such as an external crystal +//! oscillator), use \b SYSCTL_USE_OSC \b | \b SYSCTL_OSC_MAIN. To clock the +//! system from the main oscillator, use \b SYSCTL_USE_OSC \b | +//! \b SYSCTL_OSC_MAIN. To clock the system from the PLL, use +//! \b SYSCTL_USE_PLL \b | \b SYSCTL_OSC_MAIN, and select the appropriate +//! crystal with one of the \b SYSCTL_XTAL_xxx values. +//! +//! \note If selecting the PLL as the system clock source (i.e. via +//! \b SYSCTL_USE_PLL), this function will poll the PLL lock interrupt to +//! determine when the PLL has locked. If an interrupt handler for the +//! system control interrupt is in place, and it responds to and clears the +//! PLL lock interrupt, this function will delay until its timeout has occurred +//! instead of completing as soon as PLL lock is achieved. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_clockset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlClockSet(unsigned long ulConfig) +{ + volatile unsigned long ulDelay; + unsigned long ulRCC; + + // + // Get the current value of the RCC register. + // + ulRCC = HWREG(SYSCTL_RCC); + + // + // Bypass the PLL and system clock dividers for now. + // + ulRCC |= SYSCTL_RCC_BYPASS; + ulRCC &= ~(SYSCTL_RCC_USE_SYSDIV); + + // + // Write the new RCC value. + // + HWREG(SYSCTL_RCC) = ulRCC; + + // + // Make sure that the PLL and system clock dividers are bypassed for now. + // + ulRCC |= SYSCTL_RCC_BYPASS; + ulRCC &= ~(SYSCTL_RCC_USE_SYSDIV); + + // + // Make sure that the required oscillators are enabled. For now, the + // previously enabled oscillators must be enabled along with the newly + // requested oscillators. + // + ulRCC &= (~(SYSCTL_RCC_IOSCDIS | SYSCTL_RCC_MOSCDIS) | + (ulConfig & (SYSCTL_RCC_IOSCDIS | SYSCTL_RCC_MOSCDIS))); + + // + // Set the new crystal value, oscillator source, and PLL configuration. + // + ulRCC &= ~(SYSCTL_RCC_XTAL_MASK | SYSCTL_RCC_OSCSRC_MASK | + SYSCTL_RCC_PWRDN | SYSCTL_RCC_OE); + ulRCC |= ulConfig & (SYSCTL_RCC_XTAL_MASK | SYSCTL_RCC_OSCSRC_MASK | + SYSCTL_RCC_PWRDN | SYSCTL_RCC_OE); + + // + // Clear the PLL lock interrupt. + // + HWREG(SYSCTL_MISC) = SYSCTL_INT_PLL_LOCK; + + // + // Write the new RCC value. + // + HWREG(SYSCTL_RCC) = ulRCC; + + // + // Wait for a bit so that new crystal value and oscillator source can take + // effect. One of the oscillators may need to be started as well. + // + for(ulDelay = 0; ulDelay < 16; ulDelay++) + { + } + + // + // Disable the appropriate oscillators. + // + ulRCC &= ~(SYSCTL_RCC_IOSCDIS | SYSCTL_RCC_MOSCDIS); + ulRCC |= ulConfig & (SYSCTL_RCC_IOSCDIS | SYSCTL_RCC_MOSCDIS); + + // + // Write the new RCC value. + // + HWREG(SYSCTL_RCC) = ulRCC; + + // + // Set the requested system divider. This will not get written + // immediately. + // + ulRCC &= ~(SYSCTL_RCC_SYSDIV_MASK | SYSCTL_RCC_USE_SYSDIV); + ulRCC |= ulConfig & (SYSCTL_RCC_SYSDIV_MASK | SYSCTL_RCC_USE_SYSDIV); + + // + // See if the PLL output is being used to clock the system. + // + if(!(ulConfig & SYSCTL_RCC_BYPASS)) + { + // + // Wait until the PLL has locked. + // + for(ulDelay = 32768; ulDelay > 0; ulDelay--) + { + if(HWREG(SYSCTL_RIS) & SYSCTL_INT_PLL_LOCK) + { + break; + } + } + + // + // Enable use of the PLL. + // + ulRCC &= ~(SYSCTL_RCC_BYPASS); + } + + // + // Write the final RCC value. + // + HWREG(SYSCTL_RCC) = ulRCC; + + // + // Delay for a little bit so that the system divider takes effect. + // + for(ulDelay = 0; ulDelay < 16; ulDelay++) + { + } +} +#endif + +//***************************************************************************** +// +//! Gets the processor clock rate. +//! +//! This function determines the clock rate of the processor clock. This is +//! also the clock rate of all the peripheral modules (with the exception of +//! PWM, which has its own clock divider). +//! +//! \note This will not return accurate results if SysCtlClockSet() has not +//! been called to configure the clocking of the device, or if the device is +//! directly clocked from a crystal (or a clock source) that is not one of the +//! supported crystal frequencies. In the later case, this function should be +//! modified to directly return the correct system clock rate. +//! +//! \return The processor clock rate. +// +//***************************************************************************** +#if defined(GROUP_clockget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlClockGet(void) +{ + unsigned long ulRCC, ulPLL, ulClk; + + // + // Read RCC. + // + ulRCC = HWREG(SYSCTL_RCC); + + // + // Get the base clock rate. + // + switch(ulRCC & SYSCTL_RCC_OSCSRC_MASK) + { + // + // The main oscillator is the clock source. Determine its rate from + // the crystal setting field. + // + case SYSCTL_RCC_OSCSRC_MAIN: + { + ulClk = g_pulXtals[((ulRCC & SYSCTL_RCC_XTAL_MASK) >> + SYSCTL_RCC_XTAL_SHIFT) - + (SYSCTL_RCC_XTAL_3_57MHZ >> + SYSCTL_RCC_XTAL_SHIFT)]; + break; + } + + // + // The internal oscillator is the source clock. This is not an + // accurate clock (it is +/- 50%); what is used is the nominal. + // + case SYSCTL_RCC_OSCSRC_INT: + { + ulClk = 15000000; + break; + } + + // + // The internal oscillator divided by four is the source clock. This + // is not an accurate clock (it is +/- 50%); what is used is the + // nominal. + // + case SYSCTL_RCC_OSCSRC_INT4: + { + ulClk = 15000000 / 4; + break; + } + + // + // An unknown setting, so return a zero clock (i.e. an unknown clock + // rate). + // + default: + { + return(0); + } + } + + // + // See if the PLL is being used. + // + if(!(ulRCC & SYSCTL_RCC_BYPASS)) + { + // + // Get the PLL configuration. + // + ulPLL = HWREG(SYSCTL_PLLCFG); + + // + // Compute the PLL output frequency based on its input frequency. + // + ulClk = ((ulClk * (((ulPLL & SYSCTL_PLLCFG_F_MASK) >> + SYSCTL_PLLCFG_F_SHIFT) + 2)) / + (((ulPLL & SYSCTL_PLLCFG_R_MASK) >> + SYSCTL_PLLCFG_R_SHIFT) + 2)); + + // + // See if the optional output divide by 2 is being used. + // + if(ulPLL & SYSCTL_PLLCFG_OD_2) + { + ulClk /= 2; + } + + // + // See if the optional output divide by 4 is being used. + // + if(ulPLL & SYSCTL_PLLCFG_OD_4) + { + ulClk /= 4; + } + } + + // + // See if the system divider is being used. + // + if(ulRCC & SYSCTL_RCC_USE_SYSDIV) + { + // + // Adjust the clock rate by the system clock divider. + // + ulClk /= ((ulRCC & SYSCTL_RCC_SYSDIV_MASK) >> + SYSCTL_RCC_SYSDIV_SHIFT) + 1; + } + + // + // Return the computed clock rate. + // + return(ulClk); +} +#endif + +//***************************************************************************** +// +//! Sets the PWM clock configuration. +//! +//! \param ulConfig is the configuration for the PWM clock; it must be one of +//! \b SYSCTL_PWMDIV_1, \b SYSCTL_PWMDIV_2, \b SYSCTL_PWMDIV_4, +//! \b SYSCTL_PWMDIV_8, \b SYSCTL_PWMDIV_16, \b SYSCTL_PWMDIV_32, or +//! \b SYSCTL_PWMDIV_64. +//! +//! This function sets the rate of the clock provided to the PWM module as a +//! ratio of the processor clock. This clock is used by the PWM module to +//! generate PWM signals; its rate forms the basis for all PWM signals. +//! +//! \note The clocking of the PWM is dependent upon the system clock rate as +//! configured by SysCtlClockSet(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pwmclockset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlPWMClockSet(unsigned long ulConfig) +{ + // + // Check the arguments. + // + ASSERT((ulConfig == SYSCTL_PWMDIV_1) || + (ulConfig == SYSCTL_PWMDIV_2) || + (ulConfig == SYSCTL_PWMDIV_4) || + (ulConfig == SYSCTL_PWMDIV_8) || + (ulConfig == SYSCTL_PWMDIV_16) || + (ulConfig == SYSCTL_PWMDIV_32) || + (ulConfig == SYSCTL_PWMDIV_64)); + + // + // Check that there is a PWM block on this part. + // + ASSERT(HWREG(SYSCTL_DC1) & SYSCTL_DC1_PWM); + + // + // Set the PWM clock configuration into the run-mode clock configuration + // register. + // + HWREG(SYSCTL_RCC) = ((HWREG(SYSCTL_RCC) & + ~(SYSCTL_RCC_USE_PWMDIV | SYSCTL_RCC_PWMDIV_MASK)) | + ulConfig); +} +#endif + +//***************************************************************************** +// +//! Gets the current PWM clock configuration. +//! +//! This function returns the current PWM clock configuration. +//! +//! \return The current PWM clock configuration; will be one of +//! \b SYSCTL_PWMDIV_1, \b SYSCTL_PWMDIV_2, \b SYSCTL_PWMDIV_4, +//! \b SYSCTL_PWMDIV_8, \b SYSCTL_PWMDIV_16, \b SYSCTL_PWMDIV_32, or +//! \b SYSCTL_PWMDIV_64. +// +//***************************************************************************** +#if defined(GROUP_pwmclockget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlPWMClockGet(void) +{ + // + // Check that there is a PWM block on this part. + // + ASSERT(HWREG(SYSCTL_DC1) & SYSCTL_DC1_PWM); + + // + // Return the current PWM clock configuration. + // + return(HWREG(SYSCTL_RCC) & + (SYSCTL_RCC_USE_PWMDIV | SYSCTL_RCC_PWMDIV_MASK)); +} +#endif + +//***************************************************************************** +// +//! Sets the sample rate of the ADC. +//! +//! \param ulSpeed is the desired sample rate of the ADC; must be one of +//! \b SYSCTL_ADCSPEED_1MSPS, \b SYSCTL_ADCSPEED_500KSPS, +//! \b SYSCTL_ADCSPEED_250KSPS, or \b SYSCTL_ADCSPEED_125KSPS. +//! +//! This function sets the rate at which the ADC samples are captured by the +//! ADC block. The sampling speed may be limited by the hardware, so the +//! sample rate may end up being slower than requested. SysCtlADCSpeedGet() +//! will return the actual speed in use. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_adcspeedset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlADCSpeedSet(unsigned long ulSpeed) +{ + // + // Check the arguments. + // + ASSERT((ulSpeed == SYSCTL_ADCSPEED_1MSPS) || + (ulSpeed == SYSCTL_ADCSPEED_500KSPS) || + (ulSpeed == SYSCTL_ADCSPEED_250KSPS) || + (ulSpeed == SYSCTL_ADCSPEED_125KSPS)); + + // + // Check that there is an ADC block on this part. + // + ASSERT(HWREG(SYSCTL_DC1) & SYSCTL_DC1_ADC); + + // + // Set the ADC speed in run, sleep, and deep-sleep mode. + // + HWREG(SYSCTL_RCGC0) = ((HWREG(SYSCTL_RCGC0) & ~(SYSCTL_SET0_ADCSPD_MASK)) | + ulSpeed); + HWREG(SYSCTL_SCGC0) = ((HWREG(SYSCTL_SCGC0) & ~(SYSCTL_SET0_ADCSPD_MASK)) | + ulSpeed); + HWREG(SYSCTL_DCGC0) = ((HWREG(SYSCTL_DCGC0) & ~(SYSCTL_SET0_ADCSPD_MASK)) | + ulSpeed); +} +#endif + +//***************************************************************************** +// +//! Gets the sample rate of the ADC. +//! +//! This function gets the current sample rate of the ADC. +//! +//! \return Returns the current ADC sample rate; will be one of +//! \b SYSCTL_ADCSPEED_1MSPS, \b SYSCTL_ADCSPEED_500KSPS, +//! \b SYSCTL_ADCSPEED_250KSPS, or \b SYSCTL_ADCSPEED_125KSPS. +// +//***************************************************************************** +#if defined(GROUP_adcspeedget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysCtlADCSpeedGet(void) +{ + // + // Check that there is an ADC block on this part. + // + ASSERT(HWREG(SYSCTL_DC1) & SYSCTL_DC1_ADC); + + // + // Return the current ADC speed. + // + return(HWREG(SYSCTL_RCGC0) & SYSCTL_SET0_ADCSPD_MASK); +} +#endif + +//***************************************************************************** +// +//! Configures the internal oscillator verification timer. +//! +//! \param bEnable is a boolean that is \b true if the internal oscillator +//! verification timer should be enabled. +//! +//! This function allows the internal oscillator verification timer to be +//! enabled or disabled. When enabled, an interrupt will be generated if the +//! internal oscillator ceases to operate. +//! +//! \note Both oscillators (main and internal) must be enabled for this +//! verification timer to operate as the main oscillator will verify the +//! internal oscillator. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_boscverificationset) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlIOSCVerificationSet(tBoolean bEnable) +{ + // + // Enable or disable the internal oscillator verification timer as + // requested. + // + if(bEnable) + { + HWREG(SYSCTL_RCC) |= SYSCTL_RCC_IOSCVER; + } + else + { + HWREG(SYSCTL_RCC) &= ~(SYSCTL_RCC_IOSCVER); + } +} +#endif + +//***************************************************************************** +// +//! Configures the main oscillator verification timer. +//! +//! \param bEnable is a boolean that is \b true if the main oscillator +//! verification timer should be enabled. +//! +//! This function allows the main oscillator verification timer to be enabled +//! or disabled. When enabled, an interrupt will be generated if the main +//! oscillator ceases to operate. +//! +//! \note Both oscillators (main and internal) must be enabled for this +//! verification timer to operate as the internal oscillator will verify the +//! main oscillator. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_moscverificationset) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlMOSCVerificationSet(tBoolean bEnable) +{ + // + // Enable or disable the main oscillator verification timer as requested. + // + if(bEnable) + { + HWREG(SYSCTL_RCC) |= SYSCTL_RCC_MOSCVER; + } + else + { + HWREG(SYSCTL_RCC) &= ~(SYSCTL_RCC_MOSCVER); + } +} +#endif + +//***************************************************************************** +// +//! Configures the PLL verification timer. +//! +//! \param bEnable is a boolean that is \b true if the PLL verification timer +//! should be enabled. +//! +//! This function allows the PLL verification timer to be enabled or disabled. +//! When enabled, an interrupt will be generated if the PLL ceases to operate. +//! +//! \note The main oscillator must be enabled for this verification timer to +//! operate as it is used to check the PLL. Also, the verification timer +//! should be disabled while the PLL is being reconfigured via +//! SysCtlClockSet(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_pllverificationset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysCtlPLLVerificationSet(tBoolean bEnable) +{ + // + // Enable or disable the PLL verification timer as requested. + // + if(bEnable) + { + HWREG(SYSCTL_RCC) |= SYSCTL_RCC_PLLVER; + } + else + { + HWREG(SYSCTL_RCC) &= ~(SYSCTL_RCC_PLLVER); + } +} +#endif + +//***************************************************************************** +// +//! Clears the clock verification status. +//! +//! This function clears the status of the clock verification timers, allowing +//! them to assert another failure if detected. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_clkverificationclear) || defined(BUILD_ALL) || \ + defined(DOXYGEN) +void +SysCtlClkVerificationClear(void) +{ + // + // Clear the clock verification. + // + HWREG(SYSCTL_CLKVCLR) = SYSCTL_CLKVCLR_CLR; + + // + // The bit does not self-reset, so clear it. + // + HWREG(SYSCTL_CLKVCLR) = 0; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/sysctl.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/sysctl.h new file mode 100644 index 0000000..ebe01cb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/sysctl.h @@ -0,0 +1,285 @@ +//***************************************************************************** +// +// sysctl.h - Prototypes for the system control driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SYSCTL_H__ +#define __SYSCTL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following are values that can be passed to the +// SysCtlPeripheralPresent(), SysCtlPeripheralEnable(), +// SysCtlPeripheralDisable(), and SysCtlPeripheralReset() APIs as the +// ulPeripheral parameter. The peripherals in the fourth group (upper nibble +// is 3) can only be used with the SysCtlPeripheralPresent() API. +// +//***************************************************************************** +#define SYSCTL_PERIPH_PWM 0x00100000 // PWM +#define SYSCTL_PERIPH_ADC 0x00010000 // ADC +#define SYSCTL_PERIPH_WDOG 0x00000008 // Watchdog +#define SYSCTL_PERIPH_UART0 0x10000001 // UART 0 +#define SYSCTL_PERIPH_UART1 0x10000002 // UART 1 +#define SYSCTL_PERIPH_SSI 0x10000010 // SSI +#define SYSCTL_PERIPH_QEI 0x10000100 // QEI +#define SYSCTL_PERIPH_I2C 0x10001000 // I2C +#define SYSCTL_PERIPH_TIMER0 0x10010000 // Timer 0 +#define SYSCTL_PERIPH_TIMER1 0x10020000 // Timer 1 +#define SYSCTL_PERIPH_TIMER2 0x10040000 // Timer 2 +#define SYSCTL_PERIPH_COMP0 0x11000000 // Analog comparator 0 +#define SYSCTL_PERIPH_COMP1 0x12000000 // Analog comparator 1 +#define SYSCTL_PERIPH_COMP2 0x14000000 // Analog comparator 2 +#define SYSCTL_PERIPH_GPIOA 0x20000001 // GPIO A +#define SYSCTL_PERIPH_GPIOB 0x20000002 // GPIO B +#define SYSCTL_PERIPH_GPIOC 0x20000004 // GPIO C +#define SYSCTL_PERIPH_GPIOD 0x20000008 // GPIO D +#define SYSCTL_PERIPH_GPIOE 0x20000010 // GPIO E +#define SYSCTL_PERIPH_MPU 0x30000080 // Cortex-M3 MPU +#define SYSCTL_PERIPH_TEMP 0x30000020 // Temperature sensor +#define SYSCTL_PERIPH_PLL 0x30000010 // PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPinPresent() API +// as the ulPin parameter. +// +//***************************************************************************** +#define SYSCTL_PIN_PWM0 0x00000001 // PWM0 pin +#define SYSCTL_PIN_PWM1 0x00000002 // PWM1 pin +#define SYSCTL_PIN_PWM2 0x00000004 // PWM2 pin +#define SYSCTL_PIN_PWM3 0x00000008 // PWM3 pin +#define SYSCTL_PIN_PWM4 0x00000010 // PWM4 pin +#define SYSCTL_PIN_PWM5 0x00000020 // PWM5 pin +#define SYSCTL_PIN_C0MINUS 0x00000040 // C0- pin +#define SYSCTL_PIN_C0PLUS 0x00000080 // C0+ pin +#define SYSCTL_PIN_C0O 0x00000100 // C0o pin +#define SYSCTL_PIN_C1MINUS 0x00000200 // C1- pin +#define SYSCTL_PIN_C1PLUS 0x00000400 // C1+ pin +#define SYSCTL_PIN_C1O 0x00000800 // C1o pin +#define SYSCTL_PIN_C2MINUS 0x00001000 // C2- pin +#define SYSCTL_PIN_C2PLUS 0x00002000 // C2+ pin +#define SYSCTL_PIN_C2O 0x00004000 // C2o pin +#define SYSCTL_PIN_ADC0 0x00010000 // ADC0 pin +#define SYSCTL_PIN_ADC1 0x00020000 // ADC1 pin +#define SYSCTL_PIN_ADC2 0x00040000 // ADC2 pin +#define SYSCTL_PIN_ADC3 0x00080000 // ADC3 pin +#define SYSCTL_PIN_ADC4 0x00100000 // ADC4 pin +#define SYSCTL_PIN_ADC5 0x00200000 // ADC5 pin +#define SYSCTL_PIN_ADC6 0x00400000 // ADC6 pin +#define SYSCTL_PIN_ADC7 0x00800000 // ADC7 pin +#define SYSCTL_PIN_CCP0 0x01000000 // CCP0 pin +#define SYSCTL_PIN_CCP1 0x02000000 // CCP1 pin +#define SYSCTL_PIN_CCP2 0x04000000 // CCP2 pin +#define SYSCTL_PIN_CCP3 0x08000000 // CCP3 pin +#define SYSCTL_PIN_CCP4 0x10000000 // CCP4 pin +#define SYSCTL_PIN_CCP5 0x20000000 // CCP5 pin +#define SYSCTL_PIN_32KHZ 0x80000000 // 32kHz pin + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOSet() API as +// the ulVoltage value, or returned by the SysCtlLDOGet() API. +// +//***************************************************************************** +#define SYSCTL_LDO_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDO_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDO_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDO_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDO_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDO_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDO_2_55V 0x0000001f // LDO output of 2.55V +#define SYSCTL_LDO_2_60V 0x0000001e // LDO output of 2.60V +#define SYSCTL_LDO_2_65V 0x0000001d // LDO output of 2.65V +#define SYSCTL_LDO_2_70V 0x0000001c // LDO output of 2.70V +#define SYSCTL_LDO_2_75V 0x0000001b // LDO output of 2.75V + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOConfigSet() API. +// +//***************************************************************************** +#define SYSCTL_LDOCFG_ARST 0x00000001 // Allow LDO failure to reset +#define SYSCTL_LDOCFG_NORST 0x00000000 // Do not reset on LDO failure + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlIntEnable(), +// SysCtlIntDisable(), and SysCtlIntClear() APIs, or returned in the bit mask +// by the SysCtlIntStatus() API. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlResetCauseClear() +// API or returned by the SysCtlResetCauseGet() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_LDO 0x00000020 // LDO power not OK reset +#define SYSCTL_CAUSE_SW 0x00000010 // Software reset +#define SYSCTL_CAUSE_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_CAUSE_BOR 0x00000004 // Brown-out reset +#define SYSCTL_CAUSE_POR 0x00000002 // Power on reset +#define SYSCTL_CAUSE_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlBrownOutConfigSet() +// API as the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_BOR_RESET 0x00000002 // Reset instead of interrupting +#define SYSCTL_BOR_RESAMPLE 0x00000001 // Resample BOR before asserting + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPWMClockSet() API +// as the ulConfig parameter, and can be returned by the SysCtlPWMClockGet() +// API. +// +//***************************************************************************** +#define SYSCTL_PWMDIV_1 0x00000000 // PWM clock is processor clock /1 +#define SYSCTL_PWMDIV_2 0x00100000 // PWM clock is processor clock /2 +#define SYSCTL_PWMDIV_4 0x00120000 // PWM clock is processor clock /4 +#define SYSCTL_PWMDIV_8 0x00140000 // PWM clock is processor clock /8 +#define SYSCTL_PWMDIV_16 0x00160000 // PWM clock is processor clock /16 +#define SYSCTL_PWMDIV_32 0x00180000 // PWM clock is processor clock /32 +#define SYSCTL_PWMDIV_64 0x001A0000 // PWM clock is processor clock /64 + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlADCSpeedSet() API +// as the ulSpeed parameter, and can be returned by the SyCtlADCSpeedGet() +// API. +// +//***************************************************************************** +#define SYSCTL_ADCSPEED_1MSPS 0x00000300 // 1,000,000 samples per second +#define SYSCTL_ADCSPEED_500KSPS 0x00000200 // 500,000 samples per second +#define SYSCTL_ADCSPEED_250KSPS 0x00000100 // 250,000 samples per second +#define SYSCTL_ADCSPEED_125KSPS 0x00000000 // 125,000 samples per second + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlClockSet() API as +// the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_SYSDIV_1 0x07800000 // Processor clock is osc/pll /1 +#define SYSCTL_SYSDIV_2 0x00C00000 // Processor clock is osc/pll /2 +#define SYSCTL_SYSDIV_3 0x01400000 // Processor clock is osc/pll /3 +#define SYSCTL_SYSDIV_4 0x01C00000 // Processor clock is osc/pll /4 +#define SYSCTL_SYSDIV_5 0x02400000 // Processor clock is osc/pll /5 +#define SYSCTL_SYSDIV_6 0x02C00000 // Processor clock is osc/pll /6 +#define SYSCTL_SYSDIV_7 0x03400000 // Processor clock is osc/pll /7 +#define SYSCTL_SYSDIV_8 0x03C00000 // Processor clock is osc/pll /8 +#define SYSCTL_SYSDIV_9 0x04400000 // Processor clock is osc/pll /9 +#define SYSCTL_SYSDIV_10 0x04C00000 // Processor clock is osc/pll /10 +#define SYSCTL_SYSDIV_11 0x05400000 // Processor clock is osc/pll /11 +#define SYSCTL_SYSDIV_12 0x05C00000 // Processor clock is osc/pll /12 +#define SYSCTL_SYSDIV_13 0x06400000 // Processor clock is osc/pll /13 +#define SYSCTL_SYSDIV_14 0x06C00000 // Processor clock is osc/pll /14 +#define SYSCTL_SYSDIV_15 0x07400000 // Processor clock is osc/pll /15 +#define SYSCTL_SYSDIV_16 0x07C00000 // Processor clock is osc/pll /16 +#define SYSCTL_USE_PLL 0x00000000 // System clock is the PLL clock +#define SYSCTL_USE_OSC 0x00003800 // System clock is the osc clock +#define SYSCTL_XTAL_3_57MHZ 0x00000100 // External crystal is 3.579545MHz +#define SYSCTL_XTAL_3_68MHZ 0x00000140 // External crystal is 3.6864MHz +#define SYSCTL_XTAL_4MHZ 0x00000180 // External crystal is 4MHz +#define SYSCTL_XTAL_4_09MHZ 0x000001C0 // External crystal is 4.096MHz +#define SYSCTL_XTAL_4_91MHZ 0x00000200 // External crystal is 4.9152MHz +#define SYSCTL_XTAL_5MHZ 0x00000240 // External crystal is 5MHz +#define SYSCTL_XTAL_5_12MHZ 0x00000280 // External crystal is 5.12MHz +#define SYSCTL_XTAL_6MHZ 0x000002C0 // External crystal is 6MHz +#define SYSCTL_XTAL_6_14MHZ 0x00000300 // External crystal is 6.144MHz +#define SYSCTL_XTAL_7_37MHZ 0x00000340 // External crystal is 7.3728MHz +#define SYSCTL_XTAL_8MHZ 0x00000380 // External crystal is 8MHz +#define SYSCTL_XTAL_8_19MHZ 0x000003C0 // External crystal is 8.192MHz +#define SYSCTL_OSC_MAIN 0x00000000 // Oscillator source is main osc +#define SYSCTL_OSC_INT 0x00000010 // Oscillator source is int. osc +#define SYSCTL_OSC_INT4 0x00000020 // Oscillator source is int. osc /4 +#define SYSCTL_INT_OSC_DIS 0x00000002 // Disable internal oscillator +#define SYSCTL_MAIN_OSC_DIS 0x00000001 // Disable main oscillator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long SysCtlSRAMSizeGet(void); +extern unsigned long SysCtlFlashSizeGet(void); +extern tBoolean SysCtlPinPresent(unsigned long ulPin); +extern tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral); +extern void SysCtlPeripheralReset(unsigned long ulPeripheral); +extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralClockGating(tBoolean bEnable); +extern void SysCtlIntRegister(void (*pfnHandler)(void)); +extern void SysCtlIntUnregister(void); +extern void SysCtlIntEnable(unsigned long ulInts); +extern void SysCtlIntDisable(unsigned long ulInts); +extern void SysCtlIntClear(unsigned long ulInts); +extern unsigned long SysCtlIntStatus(tBoolean bMasked); +extern void SysCtlLDOSet(unsigned long ulVoltage); +extern unsigned long SysCtlLDOGet(void); +extern void SysCtlLDOConfigSet(unsigned long ulConfig); +extern void SysCtlReset(void); +extern void SysCtlSleep(void); +extern void SysCtlDeepSleep(void); +extern unsigned long SysCtlResetCauseGet(void); +extern void SysCtlResetCauseClear(unsigned long ulCauses); +extern void SysCtlBrownOutConfigSet(unsigned long ulConfig, + unsigned long ulDelay); +extern void SysCtlClockSet(unsigned long ulConfig); +extern unsigned long SysCtlClockGet(void); +extern void SysCtlPWMClockSet(unsigned long ulConfig); +extern unsigned long SysCtlPWMClockGet(void); +extern void SysCtlADCSpeedSet(unsigned long ulSpeed); +extern unsigned long SysCtlADCSpeedGet(void); +extern void SysCtlIOSCVerificationSet(tBoolean bEnable); +extern void SysCtlMOSCVerificationSet(tBoolean bEnable); +extern void SysCtlPLLVerificationSet(tBoolean bEnable); +extern void SysCtlClkVerificationClear(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSCTL_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/systick.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/systick.c new file mode 100644 index 0000000..3825335 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/systick.c @@ -0,0 +1,262 @@ +//***************************************************************************** +// +// systick.c - Driver for the SysTick timer in NVIC. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup systick_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_nvic.h" +#include "../hw_types.h" +#include "debug.h" +#include "interrupt.h" +#include "systick.h" + +//***************************************************************************** +// +//! Enables the SysTick counter. +//! +//! This will start the SysTick counter. If an interrupt handler has been +//! registered, it will be called when the SysTick counter rolls over. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickEnable(void) +{ + // + // Enable SysTick. + // + HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_CLK_SRC | NVIC_ST_CTRL_ENABLE; +} +#endif + +//***************************************************************************** +// +//! Disables the SysTick counter. +//! +//! This will stop the SysTick counter. If an interrupt handler has been +//! registered, it will no longer be called until SysTick is restarted. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_disable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickDisable(void) +{ + // + // Disable SysTick. + // + HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_ENABLE); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the SysTick interrupt. +//! +//! \param pfnHandler is a pointer to the function to be called when the +//! SysTick interrupt occurs. +//! +//! This sets the handler to be called when a SysTick interrupt occurs. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickIntRegister(void (*pfnHandler)(void)) +{ + // + // Register the interrupt handler, returning an error if an error occurs. + // + IntRegister(FAULT_SYSTICK, pfnHandler); + + // + // Enable the SysTick interrupt. + // + HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_INTEN; +} +#endif + +//***************************************************************************** +// +//! Unregisters the interrupt handler for the SysTick interrupt. +//! +//! This function will clear the handler to be called when a SysTick interrupt +//! occurs. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickIntUnregister(void) +{ + // + // Disable the SysTick interrupt. + // + HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_INTEN); + + // + // Unregister the interrupt handler. + // + IntUnregister(FAULT_SYSTICK); +} +#endif + +//***************************************************************************** +// +//! Enables the SysTick interrupt. +//! +//! This function will enable the SysTick interrupt, allowing it to be +//! reflected to the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickIntEnable(void) +{ + // + // Enable the SysTick interrupt. + // + HWREG(NVIC_ST_CTRL) |= NVIC_ST_CTRL_INTEN; +} +#endif + +//***************************************************************************** +// +//! Disables the SysTick interrupt. +//! +//! This function will disable the SysTick interrupt, preventing it from being +//! reflected to the processor. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickIntDisable(void) +{ + // + // Disable the SysTick interrupt. + // + HWREG(NVIC_ST_CTRL) &= ~(NVIC_ST_CTRL_INTEN); +} +#endif + +//***************************************************************************** +// +//! Sets the period of the SysTick counter. +//! +//! \param ulPeriod is the number of clock ticks in each period of the SysTick +//! counter; must be between 1 and 16,777,216, inclusive. +//! +//! This function sets the rate at which the SysTick counter wraps; this +//! equates to the number of processor clocks between interrupts. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_periodset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +SysTickPeriodSet(unsigned long ulPeriod) +{ + // + // Check the arguments. + // + ASSERT((ulPeriod > 0) && (ulPeriod <= 16777216)); + + // + // Set the period of the SysTick counter. + // + HWREG(NVIC_ST_RELOAD) = ulPeriod - 1; +} +#endif + +//***************************************************************************** +// +//! Gets the period of the SysTick counter. +//! +//! This function returns the rate at which the SysTick counter wraps; this +//! equates to the number of processor clocks between interrupts. +//! +//! \return Returns the period of the SysTick counter. +// +//***************************************************************************** +#if defined(GROUP_periodget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysTickPeriodGet(void) +{ + // + // Return the period of the SysTick counter. + // + return(HWREG(NVIC_ST_RELOAD) + 1); +} +#endif + +//***************************************************************************** +// +//! Gets the current value of the SysTick counter. +//! +//! This function returns the current value of the SysTick counter; this will +//! be a value between the period - 1 and zero, inclusive. +//! +//! \return Returns the current value of the SysTick counter. +// +//***************************************************************************** +#if defined(GROUP_valueget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +SysTickValueGet(void) +{ + // + // Return the current value of the SysTick counter. + // + return(HWREG(NVIC_ST_CURRENT)); +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/systick.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/systick.h new file mode 100644 index 0000000..bfddfb1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/systick.h @@ -0,0 +1,55 @@ +//***************************************************************************** +// +// systick.h - Prototypes for the SysTick driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SYSTICK_H__ +#define __SYSTICK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SysTickEnable(void); +extern void SysTickDisable(void); +extern void SysTickIntRegister(void (*pfnHandler)(void)); +extern void SysTickIntUnregister(void); +extern void SysTickIntEnable(void); +extern void SysTickIntDisable(void); +extern void SysTickPeriodSet(unsigned long ulPeriod); +extern unsigned long SysTickPeriodGet(void); +extern unsigned long SysTickValueGet(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSTICK_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/timer.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/timer.c new file mode 100644 index 0000000..46ce19a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/timer.c @@ -0,0 +1,1125 @@ +//***************************************************************************** +// +// timer.c - Driver for the timer module. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup timer_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_timer.h" +#include "../hw_types.h" +#include "debug.h" +#include "interrupt.h" +#include "timer.h" + +//***************************************************************************** +// +//! Enables the timer(s). +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to enable; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! +//! This will enable operation of the timer module. The timer must be +//! configured before it is enabled. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerEnable(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Enable the timer(s) module. + // + HWREG(ulBase + TIMER_O_CTL) |= ulTimer & (TIMER_CTL_TAEN | TIMER_CTL_TBEN); +} +#endif + +//***************************************************************************** +// +//! Disables the timer(s). +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to disable; must be one of +//! \b TIMER_A, \b TIMER_B, or \b TIMER_BOTH. +//! +//! This will disable operation of the timer module. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_disable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerDisable(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Disable the timer module. + // + HWREG(ulBase + TIMER_O_CTL) &= ~(ulTimer & + (TIMER_CTL_TAEN | TIMER_CTL_TBEN)); +} +#endif + +//***************************************************************************** +// +//! Configures the timer(s). +//! +//! \param ulBase is the base address of the timer module. +//! \param ulConfig is the configuration for the timer. +//! +//! This function configures the operating mode of the timer(s). The timer +//! module is disabled before being configured, and is left in the disabled +//! state. The configuration is specified in \e ulConfig as one of the +//! following values: +//! +//! - \b TIMER_CFG_32_BIT_OS - 32-bit one shot timer +//! - \b TIMER_CFG_32_BIT_PER - 32-bit periodic timer +//! - \b TIMER_CFG_32_RTC - 32-bit real time clock timer +//! - \b TIMER_CFG_16_BIT_PAIR - Two 16-bit timers +//! +//! When configured for a pair of 16-bit timers, each timer is separately +//! configured. The first timer is configured by setting \e ulConfig to +//! the result of a logical OR operation between one of the following values +//! and \e ulConfig: +//! +//! - \b TIMER_CFG_A_ONE_SHOT - 16-bit one shot timer +//! - \b TIMER_CFG_A_PERIODIC - 16-bit periodic timer +//! - \b TIMER_CFG_A_CAP_COUNT - 16-bit edge count capture +//! - \b TIMER_CFG_A_CAP_TIME - 16-bit edge time capture +//! - \b TIMER_CFG_A_PWM - 16-bit PWM output +//! +//! Similarly, the second timer is configured by setting \e ulConfig to +//! the result of a logical OR operation between one of the corresponding +//! \b TIMER_CFG_B_* values and \e ulConfig. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_configure) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerConfigure(unsigned long ulBase, unsigned long ulConfig) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulConfig == TIMER_CFG_32_BIT_OS) || + (ulConfig == TIMER_CFG_32_BIT_PER) || + (ulConfig == TIMER_CFG_32_RTC) || + ((ulConfig & 0xff000000) == TIMER_CFG_16_BIT_PAIR)); + ASSERT(((ulConfig & 0xff000000) != TIMER_CFG_16_BIT_PAIR) || + ((((ulConfig & 0x000000ff) == TIMER_CFG_A_ONE_SHOT) || + ((ulConfig & 0x000000ff) == TIMER_CFG_A_PERIODIC) || + ((ulConfig & 0x000000ff) == TIMER_CFG_A_CAP_COUNT) || + ((ulConfig & 0x000000ff) == TIMER_CFG_A_CAP_TIME) || + ((ulConfig & 0x000000ff) == TIMER_CFG_A_PWM)) && + (((ulConfig & 0x0000ff00) == TIMER_CFG_B_ONE_SHOT) || + ((ulConfig & 0x0000ff00) == TIMER_CFG_B_PERIODIC) || + ((ulConfig & 0x0000ff00) == TIMER_CFG_B_CAP_COUNT) || + ((ulConfig & 0x0000ff00) == TIMER_CFG_B_CAP_TIME) || + ((ulConfig & 0x0000ff00) == TIMER_CFG_B_PWM)))); + + // + // Disable the timers. + // + HWREG(ulBase + TIMER_O_CTL) &= ~(TIMER_CTL_TAEN | TIMER_CTL_TBEN); + + // + // Set the global timer configuration. + // + HWREG(ulBase + TIMER_O_CFG) = ulConfig >> 24; + + // + // Set the configuration of the A and B timers. Note that the B timer + // configuration is ignored by the hardware in 32-bit modes. + // + HWREG(ulBase + TIMER_O_TAMR) = ulConfig & 255; + HWREG(ulBase + TIMER_O_TBMR) = (ulConfig >> 8) & 255; +} +#endif + +//***************************************************************************** +// +//! Controls the output level. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to adjust; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! \param bInvert specifies the output level. +//! +//! This function sets the PWM output level for the specified timer. If the +//! parameter \e bInvert is \b true, then the timer's output will be made +//! active low; otherwise, it will be made active high. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_controllevel) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Set the output levels as requested. + // + ulTimer &= TIMER_CTL_TAPWML | TIMER_CTL_TBPWML; + HWREG(ulBase + TIMER_O_CTL) = (bInvert ? + (HWREG(ulBase + TIMER_O_CTL) | ulTimer) : + (HWREG(ulBase + TIMER_O_CTL) & ~(ulTimer))); +} +#endif + +//***************************************************************************** +// +//! Enables or disables the trigger output. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer to adjust; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! \param bEnable specifies the desired trigger state. +//! +//! This function controls the trigger output for the specified timer. If the +//! parameter \e bEnable is \b true, then the timer's output trigger is +//! enabled; otherwise it is disabled. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_controltrigger) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Set the trigger output as requested. + // + ulTimer &= TIMER_CTL_TAOTE | TIMER_CTL_TBOTE; + HWREG(ulBase + TIMER_O_CTL) = (bEnable ? + (HWREG(ulBase + TIMER_O_CTL) | ulTimer) : + (HWREG(ulBase + TIMER_O_CTL) & ~(ulTimer))); +} +#endif + +//***************************************************************************** +// +//! Controls the event type. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to be adjusted; must be one of +//! \b TIMER_A, \b TIMER_B, or \b TIMER_BOTH. +//! \param ulEvent specifies the type of event; must be one of +//! \b TIMER_EVENT_POS_EDGE, \b TIMER_EVENT_NEG_EDGE, or +//! \b TIMER_EVENT_BOTH_EDGES. +//! +//! This function sets the signal edge(s) that will trigger the timer when in +//! capture mode. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_controlevent) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Set the event type. + // + ulEvent &= ulTimer & (TIMER_CTL_TAEVENT_MSK | TIMER_CTL_TBEVENT_MSK); + HWREG(ulBase + TIMER_O_CTL) = ((HWREG(ulBase + TIMER_O_CTL) & + ~(TIMER_CTL_TAEVENT_MSK | + TIMER_CTL_TBEVENT_MSK)) | ulEvent); +} +#endif + +//***************************************************************************** +// +//! Controls the stall handling. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to be adjusted; must be one of +//! \b TIMER_A, \b TIMER_B, or \b TIMER_BOTH. +//! \param bStall specifies the response to a stall signal. +//! +//! This function controls the stall response for the specified timer. If the +//! parameter \e bStall is \b true, then the timer will stop counting if the +//! processor enters debug mode; otherwise the timer will keep running while in +//! debug mode. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_controlstall) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Set the stall mode. + // + ulTimer &= TIMER_CTL_TASTALL | TIMER_CTL_TBSTALL; + HWREG(ulBase + TIMER_O_CTL) = (bStall ? + (HWREG(ulBase + TIMER_O_CTL) | ulTimer) : + (HWREG(ulBase + TIMER_O_CTL) & ~(ulTimer))); +} +#endif + +//***************************************************************************** +// +//! Enable RTC counting. +//! +//! \param ulBase is the base address of the timer module. +//! +//! This function causes the timer to start counting when in RTC mode. If not +//! configured for RTC mode, this will do nothing. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_rtcenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerRTCEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Enable RTC counting. + // + HWREG(ulBase + TIMER_O_CTL) |= TIMER_CTL_RTCEN; +} +#endif + +//***************************************************************************** +// +//! Disable RTC counting. +//! +//! \param ulBase is the base address of the timer module. +//! +//! This function causes the timer to stop counting when in RTC mode. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_rtcdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerRTCDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Disable RTC counting. + // + HWREG(ulBase + TIMER_O_CTL) &= ~(TIMER_CTL_RTCEN); +} +#endif + +//***************************************************************************** +// +//! Set the timer prescale value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to adjust; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! \param ulValue is the timer prescale value; must be between 0 and 255, +//! inclusive. +//! +//! This function sets the value of the input clock prescaler. The prescaler +//! is only operational when in 16-bit mode and is used to extend the range of +//! the 16-bit timer modes. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_prescaleset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + ASSERT(ulValue < 256); + + // + // Set the timer A prescaler if requested. + // + if(ulTimer & TIMER_A) + { + HWREG(ulBase + TIMER_O_TAPR) = ulValue; + } + + // + // Set the timer B prescaler if requested. + // + if(ulTimer & TIMER_B) + { + HWREG(ulBase + TIMER_O_TBPR) = ulValue; + } +} +#endif + +//***************************************************************************** +// +//! Get the timer prescale value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer; must be one of \b TIMER_A or +//! \b TIMER_B. +//! +//! This function gets the value of the input clock prescaler. The prescaler +//! is only operational when in 16-bit mode and is used to extend the range of +//! the 16-bit timer modes. +//! +//! \return The value of the timer prescaler. +// +//***************************************************************************** +#if defined(GROUP_prescaleget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +TimerPrescaleGet(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Return the appropriate prescale value. + // + return((ulTimer == TIMER_A) ? HWREG(ulBase + TIMER_O_TAPR) : + HWREG(ulBase + TIMER_O_TBPR)); +} +#endif + +//***************************************************************************** +// +//! Set the timer prescale match value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to adjust; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! \param ulValue is the timer prescale match value; must be between 0 and +//! 255, inclusive. +//! +//! This function sets the value of the input clock prescaler match value. +//! When in a 16-bit mode that uses the counter match (edge count or PWM), the +//! prescale match effectively extends the range of the counter to 24-bits. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_prescalematchset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + ASSERT(ulValue < 256); + + // + // Set the timer A prescale match if requested. + // + if(ulTimer & TIMER_A) + { + HWREG(ulBase + TIMER_O_TAPMR) = ulValue; + } + + // + // Set the timer B prescale match if requested. + // + if(ulTimer & TIMER_B) + { + HWREG(ulBase + TIMER_O_TBPMR) = ulValue; + } +} +#endif + +//***************************************************************************** +// +//! Get the timer prescale match value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer; must be one of \b TIMER_A or +//! \b TIMER_B. +//! +//! This function gets the value of the input clock prescaler match value. +//! When in a 16-bit mode that uses the counter match (edge count or PWM), the +//! prescale match effectively extends the range of the counter to 24-bits. +//! +//! \return The value of the timer prescale match. +// +//***************************************************************************** +#if defined(GROUP_prescalematchget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +TimerPrescaleMatchGet(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Return the appropriate prescale match value. + // + return((ulTimer == TIMER_A) ? HWREG(ulBase + TIMER_O_TAPMR) : + HWREG(ulBase + TIMER_O_TBPMR)); +} +#endif + +//***************************************************************************** +// +//! Sets the timer load value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to adjust; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. Only \b TIMER_A should be used when the +//! timer is configured for 32-bit operation. +//! \param ulValue is the load value. +//! +//! This function sets the timer load value; if the timer is running then the +//! value will be immediately loaded into the timer. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_loadset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Set the timer A load value if requested. + // + if(ulTimer & TIMER_A) + { + HWREG(ulBase + TIMER_O_TAILR) = ulValue; + } + + // + // Set the timer B load value if requested. + // + if(ulTimer & TIMER_B) + { + HWREG(ulBase + TIMER_O_TBILR) = ulValue; + } +} +#endif + +//***************************************************************************** +// +//! Gets the timer load value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer; must be one of \b TIMER_A or +//! \b TIMER_B. Only \b TIMER_A should be used when the timer is configured +//! for 32-bit operation. +//! +//! This function gets the currently programmed interval load value for the +//! specified timer. +//! +//! \return Returns the load value for the timer. +// +//***************************************************************************** +#if defined(GROUP_loadget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +TimerLoadGet(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B)); + + // + // Return the appropriate load value. + // + return((ulTimer == TIMER_A) ? HWREG(ulBase + TIMER_O_TAILR) : + HWREG(ulBase + TIMER_O_TBILR)); +} +#endif + +//***************************************************************************** +// +//! Gets the current timer value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer; must be one of \b TIMER_A or +//! \b TIMER_B. Only \b TIMER_A should be used when the timer is configured +//! for 32-bit operation. +//! +//! This function reads the current value of the specified timer. +//! +//! \return Returns the current value of the timer. +// +//***************************************************************************** +#if defined(GROUP_valueget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +TimerValueGet(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B)); + + // + // Return the appropriate timer value. + // + return((ulTimer == TIMER_A) ? HWREG(ulBase + TIMER_O_TAR) : + HWREG(ulBase + TIMER_O_TBR)); +} +#endif + +//***************************************************************************** +// +//! Sets the timer match value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s) to adjust; must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. Only \b TIMER_A should be used when the +//! timer is configured for 32-bit operation. +//! \param ulValue is the match value. +//! +//! This function sets the match value for a timer. This is used in capture +//! count mode to determine when to interrupt the processor and in PWM mode to +//! determine the duty cycle of the output signal. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_matchset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Set the timer A match value if requested. + // + if(ulTimer & TIMER_A) + { + HWREG(ulBase + TIMER_O_TAMATCHR) = ulValue; + } + + // + // Set the timer B match value if requested. + // + if(ulTimer & TIMER_B) + { + HWREG(ulBase + TIMER_O_TBMATCHR) = ulValue; + } +} +#endif + +//***************************************************************************** +// +//! Gets the timer match value. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer; must be one of \b TIMER_A or +//! \b TIMER_B. Only \b TIMER_A should be used when the timer is configured +//! for 32-bit operation. +//! +//! This function gets the match value for the specified timer. +//! +//! \return Returns the match value for the timer. +// +//***************************************************************************** +#if defined(GROUP_matchget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +TimerMatchGet(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B)); + + // + // Return the appropriate match value. + // + return((ulTimer == TIMER_A) ? HWREG(ulBase + TIMER_O_TAMATCHR) : + HWREG(ulBase + TIMER_O_TBMATCHR)); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for the timer interrupt. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s); must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! \param pfnHandler is a pointer to the function to be called when the timer +//! interrupt occurs. +//! +//! This sets the handler to be called when a timer interrupt occurs. This +//! will enable the global interrupt in the interrupt controller; specific +//! timer interrupts must be enabled via TimerIntEnable(). It is the interrupt +//! handler's responsibility to clear the interrupt source via TimerIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Get the interrupt number for this timer module. + // + ulBase = ((ulBase == TIMER0_BASE) ? INT_TIMER0A : + ((ulBase == TIMER1_BASE) ? INT_TIMER1A : INT_TIMER2A)); + + // + // Register an interrupt handler for timer A if requested. + // + if(ulTimer & TIMER_A) + { + // + // Register the interrupt handler. + // + IntRegister(ulBase, pfnHandler); + + // + // Enable the interrupt. + // + IntEnable(ulBase); + } + + // + // Register an interrupt handler for timer B if requested. + // + if(ulTimer & TIMER_B) + { + // + // Register the interrupt handler. + // + IntRegister(ulBase + 1, pfnHandler); + + // + // Enable the interrupt. + // + IntEnable(ulBase + 1); + } +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for the timer interrupt. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulTimer specifies the timer(s); must be one of \b TIMER_A, +//! \b TIMER_B, or \b TIMER_BOTH. +//! +//! This function will clear the handler to be called when a timer interrupt +//! occurs. This will also mask off the interrupt in the interrupt controller +//! so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + ASSERT((ulTimer == TIMER_A) || (ulTimer == TIMER_B) || + (ulTimer == TIMER_BOTH)); + + // + // Get the interrupt number for this timer module. + // + ulBase = ((ulBase == TIMER0_BASE) ? INT_TIMER0A : + ((ulBase == TIMER1_BASE) ? INT_TIMER1A : INT_TIMER2A)); + + // + // Unregister the interrupt handler for timer A if requested. + // + if(ulTimer & TIMER_A) + { + // + // Disable the interrupt. + // + IntDisable(ulBase); + + // + // Unregister the interrupt handler. + // + IntUnregister(ulBase); + } + + // + // Unregister the interrupt handler for timer B if requested. + // + if(ulTimer & TIMER_B) + { + // + // Disable the interrupt. + // + IntDisable(ulBase + 1); + + // + // Unregister the interrupt handler. + // + IntUnregister(ulBase + 1); + } +} +#endif + +//***************************************************************************** +// +//! Enables individual timer interrupt sources. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulIntFlags is the bit mask of the interrupt sources to be enabled. +//! +//! Enables the indicated timer interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources have +//! no effect on the processor. +//! +//! The parameter \e ulIntFlags must be the logical OR of any combination of +//! the following: +//! +//! - TIMER_CAPB_EVENT - Capture B event interrupt +//! - TIMER_CAPB_MATCH - Capture B match interrupt +//! - TIMER_TIMB_TIMEOUT - Timer B timeout interrupt +//! - TIMER_RTC_MATCH - RTC interrupt mask +//! - TIMER_CAPA_EVENT - Capture A event interrupt +//! - TIMER_CAPA_MATCH - Capture A match interrupt +//! - TIMER_TIMA_TIMEOUT - Timer A timeout interrupt +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Enable the specified interrupts. + // + HWREG(ulBase + TIMER_O_IMR) |= ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Disables individual timer interrupt sources. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulIntFlags is the bit mask of the interrupt sources to be disabled. +//! +//! Disables the indicated timer interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources have +//! no effect on the processor. +//! +//! The parameter \e ulIntFlags has the same definition as the \e ulIntFlags +//! parameter to TimerIntEnable(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Disable the specified interrupts. + // + HWREG(ulBase + TIMER_O_IMR) &= ~(ulIntFlags); +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param ulBase is the base address of the timer module. +//! \param bMasked is false if the raw interrupt status is required and true if +//! the masked interrupt status is required. +//! +//! This returns the interrupt status for the timer module. Either the raw +//! interrupt status or the status of interrupts that are allowed to reflect to +//! the processor can be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! values described in TimerIntEnable(). +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +TimerIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + return(bMasked ? HWREG(ulBase + TIMER_O_MIS) : + HWREG(ulBase + TIMER_O_RIS)); +} +#endif + +//***************************************************************************** +// +//! Clears timer interrupt sources. +//! +//! \param ulBase is the base address of the timer module. +//! \param ulIntFlags is a bit mask of the interrupt sources to be cleared. +//! +//! The specified timer interrupt sources are cleared, so that they no longer +//! assert. This must be done in the interrupt handler to keep it from being +//! called again immediately upon exit. +//! +//! The parameter \e ulIntFlags has the same definition as the \e ulIntFlags +//! parameter to TimerIntEnable(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Clear the requested interrupt sources. + // + HWREG(ulBase + TIMER_O_ICR) = ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Puts the timer into its reset state. +//! +//! \param ulBase is the base address of the timer module. +//! +//! The specified timer is disabled, and all its interrupts are disabled, +//! cleared, and unregistered. Then the timer registers are set to their reset +//! value. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_quiesce) || defined(BUILD_ALL) || defined(DOXYGEN) +void +TimerQuiesce(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == TIMER0_BASE) || (ulBase == TIMER1_BASE) || + (ulBase == TIMER2_BASE)); + + // + // Disable the timer. + // + HWREG(ulBase + TIMER_O_CTL) = TIMER_RV_CTL; + + // + // Disable all the timer interrupts. + // + HWREG(ulBase + TIMER_O_IMR) = TIMER_RV_IMR; + + // + // Clear all the timer interrupts. + // + HWREG(ulBase + TIMER_O_ICR) = 0xFFFFFFFF; + + // + // Unregister the interrupt handler. This also disables interrupts to the + // core. + // + TimerIntUnregister(ulBase, TIMER_BOTH); + + // + // Set all the registers to their reset value. + // + HWREG(ulBase + TIMER_O_CFG) = TIMER_RV_CFG; + HWREG(ulBase + TIMER_O_TAMR) = TIMER_RV_TAMR; + HWREG(ulBase + TIMER_O_TBMR) = TIMER_RV_TBMR; + HWREG(ulBase + TIMER_O_RIS) = TIMER_RV_RIS; + HWREG(ulBase + TIMER_O_MIS) = TIMER_RV_MIS; + HWREG(ulBase + TIMER_O_TAILR) = TIMER_RV_TAILR; + HWREG(ulBase + TIMER_O_TBILR) = TIMER_RV_TBILR; + HWREG(ulBase + TIMER_O_TAMATCHR) = TIMER_RV_TAMATCHR; + HWREG(ulBase + TIMER_O_TBMATCHR) = TIMER_RV_TBMATCHR; + HWREG(ulBase + TIMER_O_TAPR) = TIMER_RV_TAPR; + HWREG(ulBase + TIMER_O_TBPR) = TIMER_RV_TBPR; + HWREG(ulBase + TIMER_O_TAPMR) = TIMER_RV_TAPMR; + HWREG(ulBase + TIMER_O_TBPMR) = TIMER_RV_TBPMR; + HWREG(ulBase + TIMER_O_TAR) = TIMER_RV_TAR; + HWREG(ulBase + TIMER_O_TBR) = TIMER_RV_TBR; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/timer.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/timer.h new file mode 100644 index 0000000..660c325 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/uart.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/uart.c new file mode 100644 index 0000000..cbae1b0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/uart.c @@ -0,0 +1,821 @@ +//***************************************************************************** +// +// uart.c - Driver for the UART. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup uart_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_types.h" +#include "../hw_uart.h" +#include "debug.h" +#include "interrupt.h" +#include "sysctl.h" +#include "uart.h" + +//***************************************************************************** +// +//! Sets the type of parity. +//! +//! \param ulBase is the base address of the UART port. +//! \param ulParity specifies the type of parity to use. +//! +//! Sets the type of parity to use for transmitting and expect when receiving. +//! The \e ulParity parameter must be one of \b UART_CONFIG_PAR_NONE, +//! \b UART_CONFIG_PAR_EVEN, \b UART_CONFIG_PAR_ODD, \b UART_CONFIG_PAR_ONE, +//! or \b UART_CONFIG_PAR_ZERO. The last two allow direct control of the +//! parity bit; it will always be either be one or zero based on the mode. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_paritymodeset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTParityModeSet(unsigned long ulBase, unsigned long ulParity) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + ASSERT((ulParity == UART_CONFIG_PAR_NONE) || + (ulParity == UART_CONFIG_PAR_EVEN) || + (ulParity == UART_CONFIG_PAR_ODD) || + (ulParity == UART_CONFIG_PAR_ONE) || + (ulParity == UART_CONFIG_PAR_ZERO)); + + // + // Set the parity mode. + // + HWREG(ulBase + UART_O_LCR_H) = ((HWREG(ulBase + UART_O_LCR_H) & + ~(UART_LCR_H_SPS | UART_LCR_H_EPS | + UART_LCR_H_PEN)) | ulParity); +} +#endif + +//***************************************************************************** +// +//! Gets the type of parity currently being used. +//! +//! \param ulBase is the base address of the UART port. +//! +//! \return The current parity settings, specified as one of +//! \b UART_CONFIG_PAR_NONE, \b UART_CONFIG_PAR_EVEN, \b UART_CONFIG_PAR_ODD, +//! \b UART_CONFIG_PAR_ONE, or \b UART_CONFIG_PAR_ZERO. +// +//***************************************************************************** +#if defined(GROUP_paritymodeget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +UARTParityModeGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Return the current parity setting. + // + return(HWREG(ulBase + UART_O_LCR_H) & + (UART_LCR_H_SPS | UART_LCR_H_EPS | UART_LCR_H_PEN)); +} +#endif + +//***************************************************************************** +// +//! Sets the configuration of a UART. +//! +//! \param ulBase is the base address of the UART port. +//! \param ulBaud is the desired baud rate. +//! \param ulConfig is the data format for the port (number of data bits, +//! number of stop bits, and parity). +//! +//! This function will configure the UART for operation in the specified data +//! format. The baud rate is provided in the \e ulBaud parameter and the +//! data format in the \e ulConfig parameter. +//! +//! The \e ulConfig parameter is the logical OR of three values: the number of +//! data bits, the number of stop bits, and the parity. \b UART_CONFIG_WLEN_8, +//! \b UART_CONFIG_WLEN_7, \b UART_CONFIG_WLEN_6, and \b UART_CONFIG_WLEN_5 +//! select from eight to five data bits per byte (respectively). +//! \b UART_CONFIG_STOP_ONE and \b UART_CONFIG_STOP_TWO select one or two stop +//! bits (respectively). \b UART_CONFIG_PAR_NONE, \b UART_CONFIG_PAR_EVEN, +//! \b UART_CONFIG_PAR_ODD, \b UART_CONFIG_PAR_ONE, and \b UART_CONFIG_PAR_ZERO +//! select the parity mode (no parity bit, even parity bit, odd parity bit, +//! parity bit always one, and parity bit always zero, respectively). +//! +//! The baud rate is dependent upon the system clock rate returned by +//! SysCtlClockGet(); if it does not return the correct system clock rate then +//! the baud rate will be incorrect. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_configset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig) +{ + unsigned long ulUARTClk, ulInt, ulFrac; + + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Stop the UART. + // + UARTDisable(ulBase); + + // + // Determine the UART clock rate. + // + ulUARTClk = SysCtlClockGet(); + + // + // Compute the fractional baud rate divider. + // + ulInt = ulUARTClk / (16 * ulBaud); + ulFrac = ulUARTClk % (16 * ulBaud); + ulFrac = ((((2 * ulFrac * 4) / ulBaud) + 1) / 2); + + // + // Set the baud rate. + // + HWREG(ulBase + UART_O_IBRD) = ulInt; + HWREG(ulBase + UART_O_FBRD) = ulFrac; + + // + // Set parity, data length, and number of stop bits. + // + HWREG(ulBase + UART_O_LCR_H) = ulConfig; + + // + // Clear the flags register. + // + HWREG(ulBase + UART_O_FR) = 0; + + // + // Start the UART. + // + UARTEnable(ulBase); +} +#endif + +//***************************************************************************** +// +//! Gets the current configuration of a UART. +//! +//! \param ulBase is the base address of the UART port. +//! \param pulBaud is a pointer to storage for the baud rate. +//! \param pulConfig is a pointer to storage for the data format. +//! +//! The baud rate and data format for the UART is determined. The returned +//! baud rate is the actual baud rate; it may not be the exact baud rate +//! requested or an ``official'' baud rate. The data format returned in +//! \e pulConfig is enumerated the same as the \e ulConfig parameter of +//! UARTConfigSet(). +//! +//! The baud rate is dependent upon the system clock rate returned by +//! SysCtlClockGet(); if it does not return the correct system clock rate then +//! the baud rate will be computed incorrectly. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_configget) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig) + +{ + unsigned long ulInt, ulFrac; + + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Compute the baud rate. + // + ulInt = HWREG(ulBase + UART_O_IBRD); + ulFrac = HWREG(ulBase + UART_O_FBRD); + *pulBaud = (SysCtlClockGet() * 4) / ((64 * ulInt) + ulFrac); + + // + // Get the parity, data length, and number of stop bits. + // + *pulConfig = (HWREG(ulBase + UART_O_LCR_H) & + (UART_LCR_H_SPS | UART_LCR_H_WLEN | UART_LCR_H_STP2 | + UART_LCR_H_EPS | UART_LCR_H_PEN)); +} +#endif + +//***************************************************************************** +// +//! Enables transmitting and receiving. +//! +//! \param ulBase is the base address of the UART port. +//! +//! Sets the UARTEN, TXE, and RXE bits, and enables the transmit and receive +//! FIFOs. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Enable the FIFO. + // + HWREG(ulBase + UART_O_LCR_H) |= UART_LCR_H_FEN; + + // + // Enable RX, TX, and the UART. + // + HWREG(ulBase + UART_O_CTL) |= (UART_CTL_UARTEN | UART_CTL_TXE | + UART_CTL_RXE); +} +#endif + +//***************************************************************************** +// +//! Disables transmitting and receiving. +//! +//! \param ulBase is the base address of the UART port. +//! +//! Clears the UARTEN, TXE, and RXE bits, then waits for the end of +//! transmission of the current character, and flushes the transmit FIFO. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_disable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Wait for end of TX. + // + while(HWREG(ulBase + UART_O_FR) & UART_FR_BUSY) + { + } + + // + // Disable the FIFO. + // + HWREG(ulBase + UART_O_LCR_H) &= ~(UART_LCR_H_FEN); + + // + // Disable the UART. + // + HWREG(ulBase + UART_O_CTL) &= ~(UART_CTL_UARTEN | UART_CTL_TXE | + UART_CTL_RXE); +} +#endif + +//***************************************************************************** +// +//! Determines if there are any characters in the receive FIFO. +//! +//! \param ulBase is the base address of the UART port. +//! +//! This function returns a flag indicating whether or not there is data +//! available in the receive FIFO. +//! +//! \return Returns \b true if there is data in the receive FIFO, and \b false +//! if there is no data in the receive FIFO. +// +//***************************************************************************** +#if defined(GROUP_charsavail) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +UARTCharsAvail(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Return the availability of characters. + // + return((HWREG(ulBase + UART_O_FR) & UART_FR_RXFE) ? false : true); +} +#endif + +//***************************************************************************** +// +//! Determines if there is any space in the transmit FIFO. +//! +//! \param ulBase is the base address of the UART port. +//! +//! This function returns a flag indicating whether or not there is space +//! available in the transmit FIFO. +//! +//! \return Returns \b true if there is space available in the transmit FIFO, +//! and \b false if there is no space available in the transmit FIFO. +// +//***************************************************************************** +#if defined(GROUP_spaceavail) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +UARTSpaceAvail(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Return the availability of space. + // + return((HWREG(ulBase + UART_O_FR) & UART_FR_TXFF) ? false : true); +} +#endif + +//***************************************************************************** +// +//! Receives a character from the specified port. +//! +//! \param ulBase is the base address of the UART port. +//! +//! Gets a character from the receive FIFO for the specified port. +//! +//! \return Returns the character read from the specified port, cast as a +//! \e long. A \b -1 will be returned if there are no characters present in +//! the receive FIFO. The UARTCharsAvail() function should be called before +//! attempting to call this function. +// +//***************************************************************************** +#if defined(GROUP_charnonblockingget) || defined(BUILD_ALL) || defined(DOXYGEN) +long +UARTCharNonBlockingGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // See if there are any characters in the receive FIFO. + // + if(!(HWREG(ulBase + UART_O_FR) & UART_FR_RXFE)) + { + // + // Read and return the next character. + // + return(HWREG(ulBase + UART_O_DR)); + } + else + { + // + // There are no characters, so return a failure. + // + return(-1); + } +} +#endif + +//***************************************************************************** +// +//! Waits for a character from the specified port. +//! +//! \param ulBase is the base address of the UART port. +//! +//! Gets a character from the receive FIFO for the specified port. If there +//! are no characters available, this function will wait until a character is +//! received before returning. +//! +//! \return Returns the character read from the specified port, cast as an +//! \e int. +// +//***************************************************************************** +#if defined(GROUP_charget) || defined(BUILD_ALL) || defined(DOXYGEN) +long +UARTCharGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Wait until a char is available. + // + while(HWREG(ulBase + UART_O_FR) & UART_FR_RXFE) + { + } + + // + // Now get the char. + // + return(HWREG(ulBase + UART_O_DR)); +} +#endif + +//***************************************************************************** +// +//! Sends a character to the specified port. +//! +//! \param ulBase is the base address of the UART port. +//! \param ucData is the character to be transmitted. +//! +//! Writes the character \e ucData to the transmit FIFO for the specified port. +//! This function does not block, so if there is no space available, then a +//! \b false is returned, and the application will have to retry the function +//! later. +//! +//! \return Returns \b true if the character was successfully placed in the +//! transmit FIFO, and \b false if there was no space available in the transmit +//! FIFO. +// +//***************************************************************************** +#if defined(GROUP_charnonblockingput) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +UARTCharNonBlockingPut(unsigned long ulBase, unsigned char ucData) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // See if there is space in the transmit FIFO. + // + if(!(HWREG(ulBase + UART_O_FR) & UART_FR_TXFF)) + { + // + // Write this character to the transmit FIFO. + // + HWREG(ulBase + UART_O_DR) = ucData; + + // + // Success. + // + return(true); + } + else + { + // + // There is no space in the transmit FIFO, so return a failure. + // + return(false); + } +} +#endif + +//***************************************************************************** +// +//! Waits to send a character from the specified port. +//! +//! \param ulBase is the base address of the UART port. +//! \param ucData is the character to be transmitted. +//! +//! Sends the character \e ucData to the transmit FIFO for the specified port. +//! If there is no space available in the transmit FIFO, this function will +//! wait until there is space available before returning. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_charput) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTCharPut(unsigned long ulBase, unsigned char ucData) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Wait until space is available. + // + while(HWREG(ulBase + UART_O_FR) & UART_FR_TXFF) + { + } + + // + // Send the char. + // + HWREG(ulBase + UART_O_DR) = ucData; +} +#endif + +//***************************************************************************** +// +//! Causes a BREAK to be sent. +//! +//! \param ulBase is the base address of the UART port. +//! \param bBreakState controls the output level. +//! +//! Calling this function with \e bBreakState set to \b true will assert a +//! break condition on the UART. Calling this function with \e bBreakState set +//! to \b false will remove the break condition. For proper transmission of a +//! break command, the break must be asserted for at least two complete frames. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_breakctl) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Set the break condition as requested. + // + HWREG(ulBase + UART_O_LCR_H) = + (bBreakState ? + (HWREG(ulBase + UART_O_LCR_H) | UART_LCR_H_BRK) : + (HWREG(ulBase + UART_O_LCR_H) & ~(UART_LCR_H_BRK))); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for a UART interrupt. +//! +//! \param ulBase is the base address of the UART port. +//! \param pfnHandler is a pointer to the function to be called when the +//! UART interrupt occurs. +//! +//! This function does the actual registering of the interrupt handler. This +//! will enable the global interrupt in the interrupt controller; specific UART +//! interrupts must be enabled via UARTIntEnable(). It is the interrupt +//! handler's responsibility to clear the interrupt source. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTIntRegister(unsigned long ulBase, void (*pfnHandler)(void)) +{ + unsigned long ulInt; + + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Determine the interrupt number based on the UART port. + // + ulInt = (ulBase == UART0_BASE) ? INT_UART0 : INT_UART1; + + // + // Register the interrupt handler. + // + IntRegister(ulInt, pfnHandler); + + // + // Enable the UART interrupt. + // + IntEnable(ulInt); +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for a UART interrupt. +//! +//! \param ulBase is the base address of the UART port. +//! +//! This function does the actual unregistering of the interrupt handler. It +//! will clear the handler to be called when a UART interrupt occurs. This +//! will also mask off the interrupt in the interrupt controller so that the +//! interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTIntUnregister(unsigned long ulBase) +{ + unsigned long ulInt; + + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Determine the interrupt number based on the UART port. + // + ulInt = (ulBase == UART0_BASE) ? INT_UART0 : INT_UART1; + + // + // Disable the interrupt. + // + IntDisable(ulInt); + + // + // Unregister the interrupt handler. + // + IntUnregister(ulInt); +} +#endif + +//***************************************************************************** +// +//! Enables individual UART interrupt sources. +//! +//! \param ulBase is the base address of the UART port. +//! \param ulIntFlags is the bit mask of the interrupt sources to be enabled. +//! +//! Enables the indicated UART interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources have +//! no effect on the processor. +//! +//! The parameter \e ulIntFlags is the logical OR of any of the following: +//! +//! - UART_INT_OE - Overrun Error interrupt +//! - UART_INT_BE - Break Error interrupt +//! - UART_INT_PE - Parity Error interrupt +//! - UART_INT_FE - Framing Error interrupt +//! - UART_INT_RT - Receive Timeout interrupt +//! - UART_INT_TX - Transmit interrupt +//! - UART_INT_RX - Receive interrupt +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Enable the specified interrupts. + // + HWREG(ulBase + UART_O_IM) |= ulIntFlags; +} +#endif + +//***************************************************************************** +// +//! Disables individual UART interrupt sources. +//! +//! \param ulBase is the base address of the UART port. +//! \param ulIntFlags is the bit mask of the interrupt sources to be disabled. +//! +//! Disables the indicated UART interrupt sources. Only the sources that are +//! enabled can be reflected to the processor interrupt; disabled sources have +//! no effect on the processor. +//! +//! The parameter \e ulIntFlags has the same definition as the same parameter +//! to UARTIntEnable(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Disable the specified interrupts. + // + HWREG(ulBase + UART_O_IM) &= ~(ulIntFlags); +} +#endif + +//***************************************************************************** +// +//! Gets the current interrupt status. +//! +//! \param ulBase is the base address of the UART port. +//! \param bMasked is false if the raw interrupt status is required and true +//! if the masked interrupt status is required. +//! +//! This returns the interrupt status for the specified UART. Either the raw +//! interrupt status or the status of interrupts that are allowed to reflect to +//! the processor can be returned. +//! +//! \return The current interrupt status, enumerated as a bit field of +//! values described in UARTIntEnable(). +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +UARTIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(ulBase + UART_O_MIS)); + } + else + { + return(HWREG(ulBase + UART_O_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears UART interrupt sources. +//! +//! \param ulBase is the base address of the UART port. +//! \param ulIntFlags is a bit mask of the interrupt sources to be cleared. +//! +//! The specified UART interrupt sources are cleared, so that they no longer +//! assert. This must be done in the interrupt handler to keep it from being +//! called again immediately upon exit. +//! +//! The parameter \e ulIntFlags has the same definition as the same parameter +//! to UARTIntEnable(). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags) +{ + // + // Check the arguments. + // + ASSERT((ulBase == UART0_BASE) || (ulBase == UART1_BASE)); + + // + // Clear the requested interrupt sources. + // + HWREG(ulBase + UART_O_ICR) = ulIntFlags; +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/uart.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/uart.h new file mode 100644 index 0000000..ee89308 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/uart.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// uart.h - Defines and Macros for the UART. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __UART_H__ +#define __UART_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to UARTIntEnable, UARTIntDisable, and UARTIntClear +// as the ulIntFlags parameter, and returned from UARTIntStatus. +// +//***************************************************************************** +#define UART_INT_OE 0x400 // Overrun Error Interrupt Mask +#define UART_INT_BE 0x200 // Break Error Interrupt Mask +#define UART_INT_PE 0x100 // Parity Error Interrupt Mask +#define UART_INT_FE 0x080 // Framing Error Interrupt Mask +#define UART_INT_RT 0x040 // Receive Timeout Interrupt Mask +#define UART_INT_TX 0x020 // Transmit Interrupt Mask +#define UART_INT_RX 0x010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Values that can be passed to UARTConfigSet as the ulConfig parameter and +// returned by UARTConfigGet in the pulConfig parameter. Additionally, the +// UART_CONFIG_PAR_* subset can be passed to UARTParityModeSet as the ulParity +// parameter, and are returned by UARTParityModeGet. +// +//***************************************************************************** +#define UART_CONFIG_WLEN_8 0x00000060 // 8 bit data +#define UART_CONFIG_WLEN_7 0x00000040 // 7 bit data +#define UART_CONFIG_WLEN_6 0x00000020 // 6 bit data +#define UART_CONFIG_WLEN_5 0x00000000 // 5 bit data +#define UART_CONFIG_STOP_ONE 0x00000000 // One stop bit +#define UART_CONFIG_STOP_TWO 0x00000008 // Two stop bits +#define UART_CONFIG_PAR_NONE 0x00000000 // No parity +#define UART_CONFIG_PAR_EVEN 0x00000006 // Even parity +#define UART_CONFIG_PAR_ODD 0x00000002 // Odd parity +#define UART_CONFIG_PAR_ONE 0x00000086 // Parity bit is one +#define UART_CONFIG_PAR_ZERO 0x00000082 // Parity bit is zero + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity); +extern unsigned long UARTParityModeGet(unsigned long ulBase); +extern void UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig); +extern void UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig); +extern void UARTEnable(unsigned long ulBase); +extern void UARTDisable(unsigned long ulBase); +extern tBoolean UARTCharsAvail(unsigned long ulBase); +extern tBoolean UARTSpaceAvail(unsigned long ulBase); +extern long UARTCharNonBlockingGet(unsigned long ulBase); +extern long UARTCharGet(unsigned long ulBase); +extern tBoolean UARTCharNonBlockingPut(unsigned long ulBase, + unsigned char ucData); +extern void UARTCharPut(unsigned long ulBase, unsigned char ucData); +extern void UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState); +extern void UARTIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void UARTIntUnregister(unsigned long ulBase); +extern void UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTConfigSetExpClk(unsigned long ulBase, unsigned long ulUARTClk, + unsigned long ulBaud, unsigned long ulConfig); + +#ifdef __cplusplus +} +#endif + +#endif // __UART_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/watchdog.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/watchdog.c new file mode 100644 index 0000000..53332d0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/watchdog.c @@ -0,0 +1,592 @@ +//***************************************************************************** +// +// watchdog.c - Driver for the Watchdog Timer Module. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup watchdog_api +//! @{ +// +//***************************************************************************** + +#include "../hw_ints.h" +#include "../hw_memmap.h" +#include "../hw_types.h" +#include "../hw_watchdog.h" +#include "debug.h" +#include "interrupt.h" +#include "watchdog.h" + +//***************************************************************************** +// +//! Determines if the watchdog timer is enabled. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This will check to see if the watchdog timer is enabled. +//! +//! \return Returns \b true if the watchdog timer is enabled, and \b false +//! if it is not. +// +//***************************************************************************** +#if defined(GROUP_running) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +WatchdogRunning(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // See if the watchdog timer module is enabled, and return. + // + return(HWREG(ulBase + WDT_O_CTL) & WDT_CTL_INTEN); +} +#endif + +//***************************************************************************** +// +//! Enables the watchdog timer. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This will enable the watchdog timer counter and interrupt. +//! +//! \note This function will have no effect if the watchdog timer has +//! been locked. +//! +//! \sa WatchdogLock(), WatchdogUnlock() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_enable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Enable the watchdog timer module. + // + HWREG(ulBase + WDT_O_CTL) |= WDT_CTL_INTEN; +} +#endif + +//***************************************************************************** +// +//! Enables the watchdog timer reset. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! Enables the capability of the watchdog timer to issue a reset to the +//! processor upon a second timeout condition. +//! +//! \note This function will have no effect if the watchdog timer has +//! been locked. +//! +//! \sa WatchdogLock(), WatchdogUnlock() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_resetenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogResetEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Enable the watchdog reset. + // + HWREG(ulBase + WDT_O_CTL) |= WDT_CTL_RESEN; +} +#endif + +//***************************************************************************** +// +//! Disables the watchdog timer reset. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! Disables the capability of the watchdog timer to issue a reset to the +//! processor upon a second timeout condition. +//! +//! \note This function will have no effect if the watchdog timer has +//! been locked. +//! +//! \sa WatchdogLock(), WatchdogUnlock() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_resetdisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogResetDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Disable the watchdog reset. + // + HWREG(ulBase + WDT_O_CTL) &= ~(WDT_CTL_RESEN); +} +#endif + +//***************************************************************************** +// +//! Enables the watchdog timer lock mechanism. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! Locks out write access to the watchdog timer configuration registers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_lock) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogLock(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Lock out watchdog register writes. Writing anything to the WDT_O_LOCK + // register causes the lock to go into effect. + // + HWREG(ulBase + WDT_O_LOCK) = WDT_LOCK_LOCKED; +} +#endif + +//***************************************************************************** +// +//! Disables the watchdog timer lock mechanism. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! Enables write access to the watchdog timer configuration registers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_unlock) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogUnlock(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Unlock watchdog register writes. + // + HWREG(ulBase + WDT_O_LOCK) = WDT_LOCK_UNLOCK; +} +#endif + +//***************************************************************************** +// +//! Gets the state of the watchdog timer lock mechanism. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! Returns the lock state of the watchdog timer registers. +//! +//! \return Returns \b true if the watchdog timer registers are locked, and +//! \b false if they are not locked. +// +//***************************************************************************** +#if defined(GROUP_lockstate) || defined(BUILD_ALL) || defined(DOXYGEN) +tBoolean +WatchdogLockState(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Get the lock state. + // + return((HWREG(ulBase + WDT_O_LOCK) == WDT_LOCK_LOCKED) ? true : false); +} +#endif + +//***************************************************************************** +// +//! Sets the watchdog timer reload value. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! \param ulLoadVal is the load value for the watchdog timer. +//! +//! This function sets the value to load into the watchdog timer when the count +//! reaches zero for the first time; if the watchdog timer is running when this +//! function is called, then the value will be immediately loaded into the +//! watchdog timer counter. If the parameter \e ulLoadVal is 0, then an +//! interrupt is immediately generated. +//! +//! \note This function will have no effect if the watchdog timer has +//! been locked. +//! +//! \sa WatchdogLock(), WatchdogUnlock(), WatchdogReloadGet() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_reloadset) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogReloadSet(unsigned long ulBase, unsigned long ulLoadVal) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Set the load register. + // + HWREG(ulBase + WDT_O_LOAD) = ulLoadVal; +} +#endif + +//***************************************************************************** +// +//! Gets the watchdog timer reload value. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This function gets the value that is loaded into the watchdog timer when +//! the count reaches zero for the first time. +//! +//! \sa WatchdogReloadSet() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_reloadget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +WatchdogReloadGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Get the load register. + // + return(HWREG(ulBase + WDT_O_LOAD)); +} +#endif + +//***************************************************************************** +// +//! Gets the current watchdog timer value. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This function reads the current value of the watchdog timer. +//! +//! \return Returns the current value of the watchdog timer. +// +//***************************************************************************** +#if defined(GROUP_valueget) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +WatchdogValueGet(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Get the current watchdog timer register value. + // + return(HWREG(ulBase + WDT_O_VALUE)); +} +#endif + +//***************************************************************************** +// +//! Registers an interrupt handler for watchdog timer interrupt. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! \param pfnHandler is a pointer to the function to be called when the +//! watchdog timer interrupt occurs. +//! +//! This function does the actual registering of the interrupt handler. This +//! will enable the global interrupt in the interrupt controller; the watchdog +//! timer interrupt must be enabled via WatchdogEnable(). It is the interrupt +//! handler's responsibility to clear the interrupt source via +//! WatchdogIntClear(). +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogIntRegister(unsigned long ulBase, void (*pfnHandler)(void)) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Register the interrupt handler. + // + IntRegister(INT_WATCHDOG, pfnHandler); + + // + // Enable the watchdog timer interrupt. + // + IntEnable(INT_WATCHDOG); +} +#endif + +//***************************************************************************** +// +//! Unregisters an interrupt handler for the watchdog timer interrupt. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This function does the actual unregistering of the interrupt handler. This +//! function will clear the handler to be called when a watchdog timer +//! interrupt occurs. This will also mask off the interrupt in the interrupt +//! controller so that the interrupt handler no longer is called. +//! +//! \sa IntRegister() for important information about registering interrupt +//! handlers. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intunregister) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogIntUnregister(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Disable the interrupt. + // + IntDisable(INT_WATCHDOG); + + // + // Unregister the interrupt handler. + // + IntUnregister(INT_WATCHDOG); +} +#endif + +//***************************************************************************** +// +//! Enables the watchdog timer interrupt. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! Enables the watchdog timer interrupt. +//! +//! \note This function will have no effect if the watchdog timer has +//! been locked. +//! +//! \sa WatchdogLock(), WatchdogUnlock(), WatchdogEnable() +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogIntEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Enable the watchdog interrupt. + // + HWREG(ulBase + WDT_O_CTL) |= WDT_CTL_INTEN; +} +#endif + +//***************************************************************************** +// +//! Gets the current watchdog timer interrupt status. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! \param bMasked is \b false if the raw interrupt status is required and +//! \b true if the masked interrupt status is required. +//! +//! This returns the interrupt status for the watchdog timer module. Either +//! the raw interrupt status or the status of interrupt that is allowed to +//! reflect to the processor can be returned. +//! +//! \return The current interrupt status, where a 1 indicates that the watchdog +//! interrupt is active, and a 0 indicates that it is not active. +// +//***************************************************************************** +#if defined(GROUP_intstatus) || defined(BUILD_ALL) || defined(DOXYGEN) +unsigned long +WatchdogIntStatus(unsigned long ulBase, tBoolean bMasked) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Return either the interrupt status or the raw interrupt status as + // requested. + // + if(bMasked) + { + return(HWREG(ulBase + WDT_O_MIS)); + } + else + { + return(HWREG(ulBase + WDT_O_RIS)); + } +} +#endif + +//***************************************************************************** +// +//! Clears the watchdog timer interrupt. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! The watchdog timer interrupt source is cleared, so that it no longer +//! asserts. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_intclear) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogIntClear(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Clear the interrupt source. + // + HWREG(ulBase + WDT_O_ICR) = WDT_INT_TIMEOUT; +} +#endif + +//***************************************************************************** +// +//! Enables stalling of the watchdog timer during debug events. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This function allows the watchdog timer to stop counting when the processor +//! is stopped by the debugger. By doing so, the watchdog is prevented from +//! expiring (typically almost immediately from a human time perspective) and +//! resetting the system (if reset is enabled). The watchdog will instead +//! expired after the appropriate number of processor cycles have been executed +//! while debugging (or at the appropriate time after the processor has been +//! restarted). +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_stallenable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogStallEnable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Enable timer stalling. + // + HWREG(ulBase + WDT_O_TEST) |= WDT_TEST_STALL; +} +#endif + +//***************************************************************************** +// +//! Disables stalling of the watchdog timer during debug events. +//! +//! \param ulBase is the base address of the watchdog timer module. +//! +//! This function disables the debug mode stall of the watchdog timer. By +//! doing so, the watchdog timer continues to count regardless of the processor +//! debug state. +//! +//! \return None. +// +//***************************************************************************** +#if defined(GROUP_stalldisable) || defined(BUILD_ALL) || defined(DOXYGEN) +void +WatchdogStallDisable(unsigned long ulBase) +{ + // + // Check the arguments. + // + ASSERT(ulBase == WATCHDOG_BASE); + + // + // Disable timer stalling. + // + HWREG(ulBase + WDT_O_TEST) &= ~(WDT_TEST_STALL); +} +#endif + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/watchdog.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/watchdog.h new file mode 100644 index 0000000..9378504 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/LuminaryCode/watchdog.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// watchdog.h - Prototypes for the Watchdog Timer API +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __WATCHDOG_H__ +#define __WATCHDOG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern tBoolean WatchdogRunning(unsigned long ulBase); +extern void WatchdogEnable(unsigned long ulBase); +extern void WatchdogResetEnable(unsigned long ulBase); +extern void WatchdogResetDisable(unsigned long ulBase); +extern void WatchdogLock(unsigned long ulBase); +extern void WatchdogUnlock(unsigned long ulBase); +extern tBoolean WatchdogLockState(unsigned long ulBase); +extern void WatchdogReloadSet(unsigned long ulBase, unsigned long ulLoadVal); +extern unsigned long WatchdogReloadGet(unsigned long ulBase); +extern unsigned long WatchdogValueGet(unsigned long ulBase); +extern void WatchdogIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void WatchdogIntUnregister(unsigned long ulBase); +extern void WatchdogIntEnable(unsigned long ulBase); +extern unsigned long WatchdogIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void WatchdogIntClear(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __WATCHDOG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.ewd b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.ewd new file mode 100644 index 0000000..25834c6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.ewd @@ -0,0 +1,879 @@ + + + + 2 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 1 + 1 + 1 + + + + + + + + + JLINK_ID + 2 + + 13 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + MACRAIGOR_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + PEMICRO_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + STLINK_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\MQX\MQXRtosPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Quadros\Quadros_EWB6_Plugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\FreeRTOS\FreeRTOSPlugin.ewplugin + 0 + + + $EW_DIR$\common\plugins\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.ewp b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.ewp new file mode 100644 index 0000000..ee85a1c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.ewp @@ -0,0 +1,951 @@ + + + + 2 + + Debug + + ARM + + 1 + + General + 3 + + 21 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 13 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Demo Source + + $PROJ_DIR$\..\Common\Minimal\BlockQ.c + + + $PROJ_DIR$\..\Common\Minimal\integer.c + + + $PROJ_DIR$\main.c + + + $PROJ_DIR$\LuminaryCode\osram96x16.c + + + $PROJ_DIR$\..\Common\Minimal\PollQ.c + + + $PROJ_DIR$\..\Common\Minimal\semtest.c + + + $PROJ_DIR$\startup.c + + + + Scheduler Source + + $PROJ_DIR$\..\..\Source\portable\MemMang\heap_1.c + + + $PROJ_DIR$\..\..\Source\list.c + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\port.c + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portasm.s + + + $PROJ_DIR$\..\..\Source\queue.c + + + $PROJ_DIR$\..\..\Source\tasks.c + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.eww b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.eww new file mode 100644 index 0000000..b7687f6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/RTOSDemo.eww @@ -0,0 +1,54 @@ + + + + + $WS_DIR$\RTOSDemo.ewp + + + + All Examples + + driverlib + Debug + + + bitband + Debug + + + gpio_jtag + Debug + + + hello + Debug + + + interrupts + Debug + + + pwmgen + Debug + + + qs_ev-lm3s811 + Debug + + + timers + Debug + + + uart_echo + Debug + + + watchdog + Debug + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/main.c new file mode 100644 index 0000000..721c404 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/main.c @@ -0,0 +1,397 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * This project contains an application demonstrating the use of the + * FreeRTOS.org mini real time scheduler on the Luminary Micro LM3S811 Eval + * board. See http://www.FreeRTOS.org for more information. + * + * main() simply sets up the hardware, creates all the demo application tasks, + * then starts the scheduler. http://www.freertos.org/a00102.html provides + * more information on the standard demo tasks. + * + * In addition to a subset of the standard demo application tasks, main.c also + * defines the following tasks: + * + * + A 'Print' task. The print task is the only task permitted to access the + * LCD - thus ensuring mutual exclusion and consistent access to the resource. + * Other tasks do not access the LCD directly, but instead send the text they + * wish to display to the print task. The print task spends most of its time + * blocked - only waking when a message is queued for display. + * + * + A 'Button handler' task. The eval board contains a user push button that + * is configured to generate interrupts. The interrupt handler uses a + * semaphore to wake the button handler task - demonstrating how the priority + * mechanism can be used to defer interrupt processing to the task level. The + * button handler task sends a message both to the LCD (via the print task) and + * the UART where it can be viewed using a dumb terminal (via the UART to USB + * converter on the eval board). NOTES: The dumb terminal must be closed in + * order to reflash the microcontroller. A very basic interrupt driven UART + * driver is used that does not use the FIFO. 19200 baud is used. + * + * + A 'check' task. The check task only executes every five seconds but has a + * high priority so is guaranteed to get processor time. Its function is to + * check that all the other tasks are still operational and that no errors have + * been detected at any time. If no errors have every been detected 'PASS' is + * written to the display (via the print task) - if an error has ever been + * detected the message is changed to 'FAIL'. The position of the message is + * changed for each write. + */ + + + +/* Environment includes. */ +#include "DriverLib.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +/* Demo app includes. */ +#include "integer.h" +#include "PollQ.h" +#include "semtest.h" +#include "BlockQ.h" + +/* Delay between cycles of the 'check' task. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) + +/* UART configuration - note this does not use the FIFO so is not very +efficient. */ +#define mainBAUD_RATE ( 19200 ) +#define mainFIFO_SET ( 0x10 ) + +/* Demo task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) + +/* Demo board specifics. */ +#define mainPUSH_BUTTON GPIO_PIN_4 + +/* Misc. */ +#define mainQUEUE_SIZE ( 3 ) +#define mainDEBOUNCE_DELAY ( ( portTickType ) 150 / portTICK_RATE_MS ) +#define mainNO_DELAY ( ( portTickType ) 0 ) +/* + * Configure the processor and peripherals for this demo. + */ +static void prvSetupHardware( void ); + +/* + * The 'check' task, as described at the top of this file. + */ +static void vCheckTask( void *pvParameters ); + +/* + * The task that is woken by the ISR that processes GPIO interrupts originating + * from the push button. + */ +static void vButtonHandlerTask( void *pvParameters ); + +/* + * The task that controls access to the LCD. + */ +static void vPrintTask( void *pvParameter ); + +/* String that is transmitted on the UART. */ +static portCHAR *cMessage = "Task woken by button interrupt! --- "; +static volatile portCHAR *pcNextChar; + +/* The semaphore used to wake the button handler task from within the GPIO +interrupt handler. */ +xSemaphoreHandle xButtonSemaphore; + +/* The queue used to send strings to the print task for display on the LCD. */ +xQueueHandle xPrintQueue; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + /* Configure the clocks, UART and GPIO. */ + prvSetupHardware(); + + /* Create the semaphore used to wake the button handler task from the GPIO + ISR. */ + vSemaphoreCreateBinary( xButtonSemaphore ); + xSemaphoreTake( xButtonSemaphore, 0 ); + + /* Create the queue used to pass message to vPrintTask. */ + xPrintQueue = xQueueCreate( mainQUEUE_SIZE, sizeof( portCHAR * ) ); + + /* Start the standard demo tasks. */ + vStartIntegerMathTasks( tskIDLE_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + + /* Start the tasks defined within the file. */ + xTaskCreate( vCheckTask, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); + xTaskCreate( vButtonHandlerTask, "Status", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY + 1, NULL ); + xTaskCreate( vPrintTask, "Print", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL ); + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient heap to start the + scheduler. */ + + return 0; +} +/*-----------------------------------------------------------*/ + +static void vCheckTask( void *pvParameters ) +{ +portBASE_TYPE xErrorOccurred = pdFALSE; +portTickType xLastExecutionTime; +const portCHAR *pcPassMessage = "PASS"; +const portCHAR *pcFailMessage = "FAIL"; + + /* Initialise xLastExecutionTime so the first call to vTaskDelayUntil() + works correctly. */ + xLastExecutionTime = xTaskGetTickCount(); + + for( ;; ) + { + /* Perform this check every mainCHECK_DELAY milliseconds. */ + vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY ); + + /* Has an error been found in any task? */ + + if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + xErrorOccurred = pdTRUE; + } + + if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xErrorOccurred = pdTRUE; + } + + if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + xErrorOccurred = pdTRUE; + } + + if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + xErrorOccurred = pdTRUE; + } + + /* Send either a pass or fail message. If an error is found it is + never cleared again. We do not write directly to the LCD, but instead + queue a message for display by the print task. */ + if( xErrorOccurred == pdTRUE ) + { + xQueueSend( xPrintQueue, &pcFailMessage, portMAX_DELAY ); + } + else + { + xQueueSend( xPrintQueue, &pcPassMessage, portMAX_DELAY ); + } + } +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* Setup the PLL. */ + SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); + + /* Setup the push button. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + GPIODirModeSet(GPIO_PORTC_BASE, mainPUSH_BUTTON, GPIO_DIR_MODE_IN); + GPIOIntTypeSet( GPIO_PORTC_BASE, mainPUSH_BUTTON,GPIO_FALLING_EDGE ); + IntPrioritySet( INT_GPIOC, configKERNEL_INTERRUPT_PRIORITY ); + GPIOPinIntEnable( GPIO_PORTC_BASE, mainPUSH_BUTTON ); + IntEnable( INT_GPIOC ); + + + + /* Enable the UART. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + /* Set GPIO A0 and A1 as peripheral function. They are used to output the + UART signals. */ + GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW ); + + /* Configure the UART for 8-N-1 operation. */ + UARTConfigSetExpClk( UART0_BASE, SysCtlClockGet(), mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE ); + + /* We don't want to use the fifo. This is for test purposes to generate + as many interrupts as possible. */ + HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET; + + /* Enable Tx interrupts. */ + HWREG( UART0_BASE + UART_O_IM ) |= UART_INT_TX; + IntPrioritySet( INT_UART0, configKERNEL_INTERRUPT_PRIORITY ); + IntEnable( INT_UART0 ); + + + /* Initialise the LCD> */ + OSRAMInit( false ); + OSRAMStringDraw("www.FreeRTOS.org", 0, 0); + OSRAMStringDraw("LM3S811 demo", 16, 1); +} +/*-----------------------------------------------------------*/ + +static void vButtonHandlerTask( void *pvParameters ) +{ +const portCHAR *pcInterruptMessage = "Int"; + + for( ;; ) + { + /* Wait for a GPIO interrupt to wake this task. */ + while( xSemaphoreTake( xButtonSemaphore, portMAX_DELAY ) != pdPASS ); + + /* Start the Tx of the message on the UART. */ + UARTIntDisable( UART0_BASE, UART_INT_TX ); + { + pcNextChar = cMessage; + + /* Send the first character. */ + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = *pcNextChar; + } + + pcNextChar++; + } + UARTIntEnable(UART0_BASE, UART_INT_TX); + + /* Queue a message for the print task to display on the LCD. */ + xQueueSend( xPrintQueue, &pcInterruptMessage, portMAX_DELAY ); + + /* Make sure we don't process bounces. */ + vTaskDelay( mainDEBOUNCE_DELAY ); + xSemaphoreTake( xButtonSemaphore, mainNO_DELAY ); + } +} + +/*-----------------------------------------------------------*/ + +void vUART_ISR(void) +{ +unsigned portLONG ulStatus; + + /* What caused the interrupt. */ + ulStatus = UARTIntStatus( UART0_BASE, pdTRUE ); + + /* Clear the interrupt. */ + UARTIntClear( UART0_BASE, ulStatus ); + + /* Was a Tx interrupt pending? */ + if( ulStatus & UART_INT_TX ) + { + /* Send the next character in the string. We are not using the FIFO. */ + if( *pcNextChar != NULL ) + { + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = *pcNextChar; + } + pcNextChar++; + } + } +} +/*-----------------------------------------------------------*/ + +void vGPIO_ISR( void ) +{ +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* Clear the interrupt. */ + GPIOPinIntClear(GPIO_PORTC_BASE, mainPUSH_BUTTON); + + /* Wake the button handler task. */ + xSemaphoreGiveFromISR( xButtonSemaphore, &xHigherPriorityTaskWoken ); + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + +static void vPrintTask( void *pvParameters ) +{ +portCHAR *pcMessage; +unsigned portBASE_TYPE uxLine = 0, uxRow = 0; + + for( ;; ) + { + /* Wait for a message to arrive. */ + xQueueReceive( xPrintQueue, &pcMessage, portMAX_DELAY ); + + /* Write the message to the LCD. */ + uxRow++; + uxLine++; + OSRAMClear(); + OSRAMStringDraw( pcMessage, uxLine & 0x3f, uxRow & 0x01); + } +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/startup.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/startup.c new file mode 100644 index 0000000..84e3fc8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_IAR/startup.c @@ -0,0 +1,197 @@ +//***************************************************************************** +// +// startup_ewarm.c - Boot code for Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 991 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern void __iar_program_start(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** +extern void xPortPendSVHandler(void); +extern void xPortSysTickHandler(void); +extern void vGPIO_ISR(void); +extern void vUART_ISR(void); +extern void vPortSVCHandler( void ); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +#ifndef STACK_SIZE +#define STACK_SIZE 64 +#endif +static unsigned long pulStack[STACK_SIZE] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + unsigned long ulPtr; +} +uVectorEntry; + +//***************************************************************************** +// +// The minimal vector table for a Cortex-M3. Note that the proper constructs +// must be placed on this to ensure that it ends up at physical address +// 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ulPtr = (unsigned long)pulStack + sizeof(pulStack) }, + // The initial stack pointer + __iar_program_start, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + vGPIO_ISR, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + vUART_ISR, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI Rx and Tx + IntDefaultHandler, // I2C Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + IntDefaultHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + IntDefaultHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler // FLASH Control +}; + + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/FreeRTOSConfig.h new file mode 100644 index 0000000..0700763 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/FreeRTOSConfig.h @@ -0,0 +1,115 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 59 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 7000 ) ) +#define configMAX_TASK_NAME_LEN ( 3 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 + +#define configKERNEL_INTERRUPT_PRIORITY 255 +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xa0, or priority 5. */ + + + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/DriverLib.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/DriverLib.h new file mode 100644 index 0000000..956bf12 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/DriverLib.h @@ -0,0 +1,39 @@ +#ifndef DRIVER_LIB_H +#define DRIVER_LIB_H + +#include "DriverLib.h" +#include "hw_adc.h" +#include "hw_comp.h" +#include "hw_flash.h" +#include "hw_gpio.h" +#include "hw_i2c.h" +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_nvic.h" +#include "hw_pwm.h" +#include "hw_qei.h" +#include "hw_ssi.h" +#include "hw_sysctl.h" +#include "hw_timer.h" +#include "hw_types.h" +#include "hw_uart.h" +#include "hw_watchdog.h" +#include "osram96x16.h" +#include "src\adc.h" +#include "src\comp.h" +#include "src\cpu.h" +#include "src\debug.h" +#include "src\flash.h" +#include "src\gpio.h" +#include "src\i2c.h" +#include "src\interrupt.h" +#include "src\pwm.h" +#include "src\qei.h" +#include "src\ssi.h" +#include "src\sysctl.h" +#include "src\systick.h" +#include "src\timer.h" +#include "src\uart.h" +#include "src\watchdog.h" + +#endif diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_adc.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_adc.h new file mode 100644 index 0000000..4d981c6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_adc.h @@ -0,0 +1,329 @@ +//***************************************************************************** +// +// hw_adc.h - Macros used when accessing the ADC hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_ADC_H__ +#define __HW_ADC_H__ + +//***************************************************************************** +// +// The following define the offsets of the ADC registers. +// +//***************************************************************************** +#define ADC_O_ACTSS 0x00000000 // Active sample register +#define ADC_O_RIS 0x00000004 // Raw interrupt status register +#define ADC_O_IM 0x00000008 // Interrupt mask register +#define ADC_O_ISC 0x0000000C // Interrupt status/clear register +#define ADC_O_OSTAT 0x00000010 // Overflow status register +#define ADC_O_EMUX 0x00000014 // Event multiplexer select reg. +#define ADC_O_USTAT 0x00000018 // Underflow status register +#define ADC_O_SSPRI 0x00000020 // Channel priority register +#define ADC_O_PSSI 0x00000028 // Processor sample initiate reg. +#define ADC_O_SSMUX0 0x00000040 // Multiplexer select 0 register +#define ADC_O_SSCTL0 0x00000044 // Sample sequence control 0 reg. +#define ADC_O_SSFIFO0 0x00000048 // Result FIFO 0 register +#define ADC_O_SSFSTAT0 0x0000004C // FIFO 0 status register +#define ADC_O_SSMUX1 0x00000060 // Multiplexer select 1 register +#define ADC_O_SSCTL1 0x00000064 // Sample sequence control 1 reg. +#define ADC_O_SSFIFO1 0x00000068 // Result FIFO 1 register +#define ADC_O_SSFSTAT1 0x0000006C // FIFO 1 status register +#define ADC_O_SSMUX2 0x00000080 // Multiplexer select 2 register +#define ADC_O_SSCTL2 0x00000084 // Sample sequence control 2 reg. +#define ADC_O_SSFIFO2 0x00000088 // Result FIFO 2 register +#define ADC_O_SSFSTAT2 0x0000008C // FIFO 2 status register +#define ADC_O_SSMUX3 0x000000A0 // Multiplexer select 3 register +#define ADC_O_SSCTL3 0x000000A4 // Sample sequence control 3 reg. +#define ADC_O_SSFIFO3 0x000000A8 // Result FIFO 3 register +#define ADC_O_SSFSTAT3 0x000000AC // FIFO 3 status register +#define ADC_O_TMLB 0x00000100 // Test mode loopback register + +//***************************************************************************** +// +// The following define the offsets of the ADC sequence registers. +// +//***************************************************************************** +#define ADC_O_SEQ 0x00000040 // Offset to the first sequence +#define ADC_O_SEQ_STEP 0x00000020 // Increment to the next sequence +#define ADC_O_X_SSMUX 0x00000000 // Multiplexer select register +#define ADC_O_X_SSCTL 0x00000004 // Sample sequence control register +#define ADC_O_X_SSFIFO 0x00000008 // Result FIFO register +#define ADC_O_X_SSFSTAT 0x0000000C // FIFO status register + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ACTSS register. +// +//***************************************************************************** +#define ADC_ACTSS_ASEN3 0x00000008 // Sample sequence 3 enable +#define ADC_ACTSS_ASEN2 0x00000004 // Sample sequence 2 enable +#define ADC_ACTSS_ASEN1 0x00000002 // Sample sequence 1 enable +#define ADC_ACTSS_ASEN0 0x00000001 // Sample sequence 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the ADC_RIS register. +// +//***************************************************************************** +#define ADC_RIS_INR3 0x00000008 // Sample sequence 3 interrupt +#define ADC_RIS_INR2 0x00000004 // Sample sequence 2 interrupt +#define ADC_RIS_INR1 0x00000002 // Sample sequence 1 interrupt +#define ADC_RIS_INR0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_IM register. +// +//***************************************************************************** +#define ADC_IM_MASK3 0x00000008 // Sample sequence 3 mask +#define ADC_IM_MASK2 0x00000004 // Sample sequence 2 mask +#define ADC_IM_MASK1 0x00000002 // Sample sequence 1 mask +#define ADC_IM_MASK0 0x00000001 // Sample sequence 0 mask + +//***************************************************************************** +// +// The following define the bit fields in the ADC_ISC register. +// +//***************************************************************************** +#define ADC_ISC_IN3 0x00000008 // Sample sequence 3 interrupt +#define ADC_ISC_IN2 0x00000004 // Sample sequence 2 interrupt +#define ADC_ISC_IN1 0x00000002 // Sample sequence 1 interrupt +#define ADC_ISC_IN0 0x00000001 // Sample sequence 0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the ADC_OSTAT register. +// +//***************************************************************************** +#define ADC_OSTAT_OV3 0x00000008 // Sample sequence 3 overflow +#define ADC_OSTAT_OV2 0x00000004 // Sample sequence 2 overflow +#define ADC_OSTAT_OV1 0x00000002 // Sample sequence 1 overflow +#define ADC_OSTAT_OV0 0x00000001 // Sample sequence 0 overflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_EMUX register. +// +//***************************************************************************** +#define ADC_EMUX_EM3_MASK 0x0000F000 // Event mux 3 mask +#define ADC_EMUX_EM3_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM3_COMP0 0x00001000 // Analog comparator 0 event +#define ADC_EMUX_EM3_COMP1 0x00002000 // Analog comparator 1 event +#define ADC_EMUX_EM3_COMP2 0x00003000 // Analog comparator 2 event +#define ADC_EMUX_EM3_EXTERNAL 0x00004000 // External event +#define ADC_EMUX_EM3_TIMER 0x00005000 // Timer event +#define ADC_EMUX_EM3_PWM0 0x00006000 // PWM0 event +#define ADC_EMUX_EM3_PWM1 0x00007000 // PWM1 event +#define ADC_EMUX_EM3_PWM2 0x00008000 // PWM2 event +#define ADC_EMUX_EM3_ALWAYS 0x0000F000 // Always event +#define ADC_EMUX_EM2_MASK 0x00000F00 // Event mux 2 mask +#define ADC_EMUX_EM2_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM2_COMP0 0x00000100 // Analog comparator 0 event +#define ADC_EMUX_EM2_COMP1 0x00000200 // Analog comparator 1 event +#define ADC_EMUX_EM2_COMP2 0x00000300 // Analog comparator 2 event +#define ADC_EMUX_EM2_EXTERNAL 0x00000400 // External event +#define ADC_EMUX_EM2_TIMER 0x00000500 // Timer event +#define ADC_EMUX_EM2_PWM0 0x00000600 // PWM0 event +#define ADC_EMUX_EM2_PWM1 0x00000700 // PWM1 event +#define ADC_EMUX_EM2_PWM2 0x00000800 // PWM2 event +#define ADC_EMUX_EM2_ALWAYS 0x00000F00 // Always event +#define ADC_EMUX_EM1_MASK 0x000000F0 // Event mux 1 mask +#define ADC_EMUX_EM1_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM1_COMP0 0x00000010 // Analog comparator 0 event +#define ADC_EMUX_EM1_COMP1 0x00000020 // Analog comparator 1 event +#define ADC_EMUX_EM1_COMP2 0x00000030 // Analog comparator 2 event +#define ADC_EMUX_EM1_EXTERNAL 0x00000040 // External event +#define ADC_EMUX_EM1_TIMER 0x00000050 // Timer event +#define ADC_EMUX_EM1_PWM0 0x00000060 // PWM0 event +#define ADC_EMUX_EM1_PWM1 0x00000070 // PWM1 event +#define ADC_EMUX_EM1_PWM2 0x00000080 // PWM2 event +#define ADC_EMUX_EM1_ALWAYS 0x000000F0 // Always event +#define ADC_EMUX_EM0_MASK 0x0000000F // Event mux 0 mask +#define ADC_EMUX_EM0_PROCESSOR 0x00000000 // Processor event +#define ADC_EMUX_EM0_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_EMUX_EM0_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_EMUX_EM0_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_EMUX_EM0_EXTERNAL 0x00000004 // External event +#define ADC_EMUX_EM0_TIMER 0x00000005 // Timer event +#define ADC_EMUX_EM0_PWM0 0x00000006 // PWM0 event +#define ADC_EMUX_EM0_PWM1 0x00000007 // PWM1 event +#define ADC_EMUX_EM0_PWM2 0x00000008 // PWM2 event +#define ADC_EMUX_EM0_ALWAYS 0x0000000F // Always event +#define ADC_EMUX_EM0_SHIFT 0 // The shift for the first event +#define ADC_EMUX_EM1_SHIFT 4 // The shift for the second event +#define ADC_EMUX_EM2_SHIFT 8 // The shift for the third event +#define ADC_EMUX_EM3_SHIFT 12 // The shift for the fourth event + +//***************************************************************************** +// +// The following define the bit fields in the ADC_USTAT register. +// +//***************************************************************************** +#define ADC_USTAT_UV3 0x00000008 // Sample sequence 3 underflow +#define ADC_USTAT_UV2 0x00000004 // Sample sequence 2 underflow +#define ADC_USTAT_UV1 0x00000002 // Sample sequence 1 underflow +#define ADC_USTAT_UV0 0x00000001 // Sample sequence 0 underflow + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSPRI register. +// +//***************************************************************************** +#define ADC_SSPRI_SS3_MASK 0x00003000 // Sequencer 3 priority mask +#define ADC_SSPRI_SS3_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS3_2ND 0x00001000 // Second priority +#define ADC_SSPRI_SS3_3RD 0x00002000 // Third priority +#define ADC_SSPRI_SS3_4TH 0x00003000 // Fourth priority +#define ADC_SSPRI_SS2_MASK 0x00000300 // Sequencer 2 priority mask +#define ADC_SSPRI_SS2_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS2_2ND 0x00000100 // Second priority +#define ADC_SSPRI_SS2_3RD 0x00000200 // Third priority +#define ADC_SSPRI_SS2_4TH 0x00000300 // Fourth priority +#define ADC_SSPRI_SS1_MASK 0x00000030 // Sequencer 1 priority mask +#define ADC_SSPRI_SS1_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS1_2ND 0x00000010 // Second priority +#define ADC_SSPRI_SS1_3RD 0x00000020 // Third priority +#define ADC_SSPRI_SS1_4TH 0x00000030 // Fourth priority +#define ADC_SSPRI_SS0_MASK 0x00000003 // Sequencer 0 priority mask +#define ADC_SSPRI_SS0_1ST 0x00000000 // First priority +#define ADC_SSPRI_SS0_2ND 0x00000001 // Second priority +#define ADC_SSPRI_SS0_3RD 0x00000002 // Third priority +#define ADC_SSPRI_SS0_4TH 0x00000003 // Fourth priority + +//***************************************************************************** +// +// The following define the bit fields in the ADC_PSSI register. +// +//***************************************************************************** +#define ADC_PSSI_SS3 0x00000008 // Trigger sample sequencer 3 +#define ADC_PSSI_SS2 0x00000004 // Trigger sample sequencer 2 +#define ADC_PSSI_SS1 0x00000002 // Trigger sample sequencer 1 +#define ADC_PSSI_SS0 0x00000001 // Trigger sample sequencer 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSMUX0, ADC_SSMUX1, +// ADC_SSMUX2, and ADC_SSMUX3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSMUX_MUX7_MASK 0x70000000 // 8th mux select mask +#define ADC_SSMUX_MUX6_MASK 0x07000000 // 7th mux select mask +#define ADC_SSMUX_MUX5_MASK 0x00700000 // 6th mux select mask +#define ADC_SSMUX_MUX4_MASK 0x00070000 // 5th mux select mask +#define ADC_SSMUX_MUX3_MASK 0x00007000 // 4th mux select mask +#define ADC_SSMUX_MUX2_MASK 0x00000700 // 3rd mux select mask +#define ADC_SSMUX_MUX1_MASK 0x00000070 // 2nd mux select mask +#define ADC_SSMUX_MUX0_MASK 0x00000007 // 1st mux select mask +#define ADC_SSMUX_MUX7_SHIFT 28 +#define ADC_SSMUX_MUX6_SHIFT 24 +#define ADC_SSMUX_MUX5_SHIFT 20 +#define ADC_SSMUX_MUX4_SHIFT 16 +#define ADC_SSMUX_MUX3_SHIFT 12 +#define ADC_SSMUX_MUX2_SHIFT 8 +#define ADC_SSMUX_MUX1_SHIFT 4 +#define ADC_SSMUX_MUX0_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSCTL0, ADC_SSCTL1, +// ADC_SSCTL2, and ADC_SSCTL3 registers. Not all fields are present in all +// registers. +// +//***************************************************************************** +#define ADC_SSCTL_TS7 0x80000000 // 8th temperature sensor select +#define ADC_SSCTL_IE7 0x40000000 // 8th interrupt enable +#define ADC_SSCTL_END7 0x20000000 // 8th sequence end select +#define ADC_SSCTL_D7 0x10000000 // 8th differential select +#define ADC_SSCTL_TS6 0x08000000 // 7th temperature sensor select +#define ADC_SSCTL_IE6 0x04000000 // 7th interrupt enable +#define ADC_SSCTL_END6 0x02000000 // 7th sequence end select +#define ADC_SSCTL_D6 0x01000000 // 7th differential select +#define ADC_SSCTL_TS5 0x00800000 // 6th temperature sensor select +#define ADC_SSCTL_IE5 0x00400000 // 6th interrupt enable +#define ADC_SSCTL_END5 0x00200000 // 6th sequence end select +#define ADC_SSCTL_D5 0x00100000 // 6th differential select +#define ADC_SSCTL_TS4 0x00080000 // 5th temperature sensor select +#define ADC_SSCTL_IE4 0x00040000 // 5th interrupt enable +#define ADC_SSCTL_END4 0x00020000 // 5th sequence end select +#define ADC_SSCTL_D4 0x00010000 // 5th differential select +#define ADC_SSCTL_TS3 0x00008000 // 4th temperature sensor select +#define ADC_SSCTL_IE3 0x00004000 // 4th interrupt enable +#define ADC_SSCTL_END3 0x00002000 // 4th sequence end select +#define ADC_SSCTL_D3 0x00001000 // 4th differential select +#define ADC_SSCTL_TS2 0x00000800 // 3rd temperature sensor select +#define ADC_SSCTL_IE2 0x00000400 // 3rd interrupt enable +#define ADC_SSCTL_END2 0x00000200 // 3rd sequence end select +#define ADC_SSCTL_D2 0x00000100 // 3rd differential select +#define ADC_SSCTL_TS1 0x00000080 // 2nd temperature sensor select +#define ADC_SSCTL_IE1 0x00000040 // 2nd interrupt enable +#define ADC_SSCTL_END1 0x00000020 // 2nd sequence end select +#define ADC_SSCTL_D1 0x00000010 // 2nd differential select +#define ADC_SSCTL_TS0 0x00000008 // 1st temperature sensor select +#define ADC_SSCTL_IE0 0x00000004 // 1st interrupt enable +#define ADC_SSCTL_END0 0x00000002 // 1st sequence end select +#define ADC_SSCTL_D0 0x00000001 // 1st differential select + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFIFO0, ADC_SSFIFO1, +// ADC_SSFIFO2, and ADC_SSFIFO3 registers. +// +//***************************************************************************** +#define ADC_SSFIFO_DATA_MASK 0x000003FF // Sample data +#define ADC_SSFIFO_DATA_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the ADC_SSFSTAT0, ADC_SSFSTAT1, +// ADC_SSFSTAT2, and ADC_SSFSTAT3 registers. +// +//***************************************************************************** +#define ADC_SSFSTAT_FULL 0x00001000 // FIFO is full +#define ADC_SSFSTAT_EMPTY 0x00000100 // FIFO is empty +#define ADC_SSFSTAT_HPTR 0x000000F0 // FIFO head pointer +#define ADC_SSFSTAT_TPTR 0x0000000F // FIFO tail pointer + +//***************************************************************************** +// +// The following define the bit fields in the ADC_TMLB register. +// +//***************************************************************************** +#define ADC_TMLB_LB 0x00000001 // Loopback control signals + +//***************************************************************************** +// +// The following define the bit fields in the loopback ADC data. +// +//***************************************************************************** +#define ADC_LB_CNT_MASK 0x000003C0 // Sample counter mask +#define ADC_LB_CONT 0x00000020 // Continuation sample +#define ADC_LB_DIFF 0x00000010 // Differential sample +#define ADC_LB_TS 0x00000008 // Temperature sensor sample +#define ADC_LB_MUX_MASK 0x00000007 // Input channel number mask +#define ADC_LB_CNT_SHIFT 6 // Sample counter shift +#define ADC_LB_MUX_SHIFT 0 // Input channel number shift + +#endif // __HW_ADC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_comp.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_comp.h new file mode 100644 index 0000000..9c5212b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_comp.h @@ -0,0 +1,118 @@ +//***************************************************************************** +// +// hw_comp.h - Macros used when accessing the comparator hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_COMP_H__ +#define __HW_COMP_H__ + +//***************************************************************************** +// +// The following define the offsets of the comparator registers. +// +//***************************************************************************** +#define COMP_O_MIS 0x00000000 // Interrupt status register +#define COMP_O_RIS 0x00000004 // Raw interrupt status register +#define COMP_O_INTEN 0x00000008 // Interrupt enable register +#define COMP_O_REFCTL 0x00000010 // Reference voltage control reg. +#define COMP_O_ACSTAT0 0x00000020 // Comp0 status register +#define COMP_O_ACCTL0 0x00000024 // Comp0 control register +#define COMP_O_ACSTAT1 0x00000040 // Comp1 status register +#define COMP_O_ACCTL1 0x00000044 // Comp1 control register +#define COMP_O_ACSTAT2 0x00000060 // Comp2 status register +#define COMP_O_ACCTL2 0x00000064 // Comp2 control register + +//***************************************************************************** +// +// The following define the bit fields in the COMP_MIS, COMP_RIS, and +// COMP_INTEN registers. +// +//***************************************************************************** +#define COMP_INT_2 0x00000004 // Comp2 interrupt +#define COMP_INT_1 0x00000002 // Comp1 interrupt +#define COMP_INT_0 0x00000001 // Comp0 interrupt + +//***************************************************************************** +// +// The following define the bit fields in the COMP_REFCTL register. +// +//***************************************************************************** +#define COMP_REFCTL_EN 0x00000200 // Reference voltage enable +#define COMP_REFCTL_RNG 0x00000100 // Reference voltage range +#define COMP_REFCTL_VREF_MASK 0x0000000F // Reference voltage select mask +#define COMP_REFCTL_VREF_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACSTAT0, COMP_ACSTAT1, and +// COMP_ACSTAT2 registers. +// +//***************************************************************************** +#define COMP_ACSTAT_OVAL 0x00000002 // Comparator output value + +//***************************************************************************** +// +// The following define the bit fields in the COMP_ACCTL0, COMP_ACCTL1, and +// COMP_ACCTL2 registers. +// +//***************************************************************************** +#define COMP_ACCTL_TMASK 0x00000800 // Trigger enable +#define COMP_ACCTL_ASRCP_MASK 0x00000600 // Vin+ source select mask +#define COMP_ACCTL_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ACCTL_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ACCTL_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_ACCTL_ASRCP_RES 0x00000600 // Reserved +#define COMP_ACCTL_OEN 0x00000100 // Comparator output enable +#define COMP_ACCTL_TSVAL 0x00000080 // Trigger polarity select +#define COMP_ACCTL_TSEN_MASK 0x00000060 // Trigger sense mask +#define COMP_ACCTL_TSEN_LEVEL 0x00000000 // Trigger is level sense +#define COMP_ACCTL_TSEN_FALL 0x00000020 // Trigger is falling edge +#define COMP_ACCTL_TSEN_RISE 0x00000040 // Trigger is rising edge +#define COMP_ACCTL_TSEN_BOTH 0x00000060 // Trigger is both edges +#define COMP_ACCTL_ISLVAL 0x00000010 // Interrupt polarity select +#define COMP_ACCTL_ISEN_MASK 0x0000000C // Interrupt sense mask +#define COMP_ACCTL_ISEN_LEVEL 0x00000000 // Interrupt is level sense +#define COMP_ACCTL_ISEN_FALL 0x00000004 // Interrupt is falling edge +#define COMP_ACCTL_ISEN_RISE 0x00000008 // Interrupt is rising edge +#define COMP_ACCTL_ISEN_BOTH 0x0000000C // Interrupt is both edges +#define COMP_ACCTL_CINV 0x00000002 // Comparator output invert + +//***************************************************************************** +// +// The following define the reset values for the comparator registers. +// +//***************************************************************************** +#define COMP_RV_MIS 0x00000000 // Interrupt status register +#define COMP_RV_RIS 0x00000000 // Raw interrupt status register +#define COMP_RV_INTEN 0x00000000 // Interrupt enable register +#define COMP_RV_REFCTL 0x00000000 // Reference voltage control reg. +#define COMP_RV_ACSTAT0 0x00000000 // Comp0 status register +#define COMP_RV_ACCTL0 0x00000000 // Comp0 control register +#define COMP_RV_ACSTAT1 0x00000000 // Comp1 status register +#define COMP_RV_ACCTL1 0x00000000 // Comp1 control register +#define COMP_RV_ACSTAT2 0x00000000 // Comp2 status register +#define COMP_RV_ACCTL2 0x00000000 // Comp2 control register + +#endif // __HW_COMP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_flash.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_flash.h new file mode 100644 index 0000000..d27ebcf --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_flash.h @@ -0,0 +1,139 @@ +//***************************************************************************** +// +// hw_flash.h - Macros used when accessing the flash controller. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_FLASH_H__ +#define __HW_FLASH_H__ + +//***************************************************************************** +// +// The following define the offsets of the FLASH registers. +// +//***************************************************************************** +#define FLASH_FMA 0x400FD000 // Memory address register +#define FLASH_FMD 0x400FD004 // Memory data register +#define FLASH_FMC 0x400FD008 // Memory control register +#define FLASH_FCRIS 0x400FD00c // Raw interrupt status register +#define FLASH_FCIM 0x400FD010 // Interrupt mask register +#define FLASH_FCMISC 0x400FD014 // Interrupt status register +#define FLASH_FMPRE 0x400FE130 // FLASH read protect register +#define FLASH_FMPPE 0x400FE134 // FLASH program protect register +#define FLASH_USECRL 0x400FE140 // uSec reload register + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMC register. +// +//***************************************************************************** +#define FLASH_FMC_WRKEY_MASK 0xFFFF0000 // FLASH write key mask +#define FLASH_FMC_WRKEY 0xA4420000 // FLASH write key +#define FLASH_FMC_COMT 0x00000008 // Commit user register +#define FLASH_FMC_MERASE 0x00000004 // Mass erase FLASH +#define FLASH_FMC_ERASE 0x00000002 // Erase FLASH page +#define FLASH_FMC_WRITE 0x00000001 // Write FLASH word + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCRIS register. +// +//***************************************************************************** +#define FLASH_FCRIS_PROGRAM 0x00000002 // Programming status +#define FLASH_FCRIS_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FCIM register. +// +//***************************************************************************** +#define FLASH_FCIM_PROGRAM 0x00000002 // Programming mask +#define FLASH_FCIM_ACCESS 0x00000001 // Invalid access mask + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMIS register. +// +//***************************************************************************** +#define FLASH_FCMISC_PROGRAM 0x00000002 // Programming status +#define FLASH_FCMISC_ACCESS 0x00000001 // Invalid access status + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_FMPRE and FLASH_FMPPE +// registers. +// +//***************************************************************************** +#define FLASH_FMP_BLOCK_31 0x80000000 // Enable for block 31 +#define FLASH_FMP_BLOCK_30 0x40000000 // Enable for block 30 +#define FLASH_FMP_BLOCK_29 0x20000000 // Enable for block 29 +#define FLASH_FMP_BLOCK_28 0x10000000 // Enable for block 28 +#define FLASH_FMP_BLOCK_27 0x08000000 // Enable for block 27 +#define FLASH_FMP_BLOCK_26 0x04000000 // Enable for block 26 +#define FLASH_FMP_BLOCK_25 0x02000000 // Enable for block 25 +#define FLASH_FMP_BLOCK_24 0x01000000 // Enable for block 24 +#define FLASH_FMP_BLOCK_23 0x00800000 // Enable for block 23 +#define FLASH_FMP_BLOCK_22 0x00400000 // Enable for block 22 +#define FLASH_FMP_BLOCK_21 0x00200000 // Enable for block 21 +#define FLASH_FMP_BLOCK_20 0x00100000 // Enable for block 20 +#define FLASH_FMP_BLOCK_19 0x00080000 // Enable for block 19 +#define FLASH_FMP_BLOCK_18 0x00040000 // Enable for block 18 +#define FLASH_FMP_BLOCK_17 0x00020000 // Enable for block 17 +#define FLASH_FMP_BLOCK_16 0x00010000 // Enable for block 16 +#define FLASH_FMP_BLOCK_15 0x00008000 // Enable for block 15 +#define FLASH_FMP_BLOCK_14 0x00004000 // Enable for block 14 +#define FLASH_FMP_BLOCK_13 0x00002000 // Enable for block 13 +#define FLASH_FMP_BLOCK_12 0x00001000 // Enable for block 12 +#define FLASH_FMP_BLOCK_11 0x00000800 // Enable for block 11 +#define FLASH_FMP_BLOCK_10 0x00000400 // Enable for block 10 +#define FLASH_FMP_BLOCK_9 0x00000200 // Enable for block 9 +#define FLASH_FMP_BLOCK_8 0x00000100 // Enable for block 8 +#define FLASH_FMP_BLOCK_7 0x00000080 // Enable for block 7 +#define FLASH_FMP_BLOCK_6 0x00000040 // Enable for block 6 +#define FLASH_FMP_BLOCK_5 0x00000020 // Enable for block 5 +#define FLASH_FMP_BLOCK_4 0x00000010 // Enable for block 4 +#define FLASH_FMP_BLOCK_3 0x00000008 // Enable for block 3 +#define FLASH_FMP_BLOCK_2 0x00000004 // Enable for block 2 +#define FLASH_FMP_BLOCK_1 0x00000002 // Enable for block 1 +#define FLASH_FMP_BLOCK_0 0x00000001 // Enable for block 0 + +//***************************************************************************** +// +// The following define the bit fields in the FLASH_USECRL register. +// +//***************************************************************************** +#define FLASH_USECRL_MASK 0x000000FF // Clock per uSec +#define FLASH_USECRL_SHIFT 0 + +//***************************************************************************** +// +// The erase size is the size of the FLASH block that is erased by an erase +// operation, and the protect size is the size of the FLASH block that is +// protected by each protection register. +// +//***************************************************************************** +#define FLASH_ERASE_SIZE 0x00000400 +#define FLASH_PROTECT_SIZE 0x00000800 + +#endif // __HW_FLASH_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_gpio.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_gpio.h new file mode 100644 index 0000000..10bf23b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_gpio.h @@ -0,0 +1,103 @@ +//***************************************************************************** +// +// hw_gpio.h - Defines and Macros for GPIO hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_GPIO_H__ +#define __HW_GPIO_H__ + +//***************************************************************************** +// +// GPIO Register Offsets. +// +//***************************************************************************** +#define GPIO_O_DATA 0x00000000 // Data register. +#define GPIO_O_DIR 0x00000400 // Data direction register. +#define GPIO_O_IS 0x00000404 // Interrupt sense register. +#define GPIO_O_IBE 0x00000408 // Interrupt both edges register. +#define GPIO_O_IEV 0x0000040C // Intterupt event register. +#define GPIO_O_IM 0x00000410 // Interrupt mask register. +#define GPIO_O_RIS 0x00000414 // Raw interrupt status register. +#define GPIO_O_MIS 0x00000418 // Masked interrupt status reg. +#define GPIO_O_ICR 0x0000041C // Interrupt clear register. +#define GPIO_O_AFSEL 0x00000420 // Mode control select register. +#define GPIO_O_DR2R 0x00000500 // 2ma drive select register. +#define GPIO_O_DR4R 0x00000504 // 4ma drive select register. +#define GPIO_O_DR8R 0x00000508 // 8ma drive select register. +#define GPIO_O_ODR 0x0000050C // Open drain select register. +#define GPIO_O_PUR 0x00000510 // Pull up select register. +#define GPIO_O_PDR 0x00000514 // Pull down select register. +#define GPIO_O_SLR 0x00000518 // Slew rate control enable reg. +#define GPIO_O_DEN 0x0000051C // Digital input enable register. +#define GPIO_O_PeriphID4 0x00000FD0 // +#define GPIO_O_PeriphID5 0x00000FD4 // +#define GPIO_O_PeriphID6 0x00000FD8 // +#define GPIO_O_PeriphID7 0x00000FDC // +#define GPIO_O_PeriphID0 0x00000FE0 // +#define GPIO_O_PeriphID1 0x00000FE4 // +#define GPIO_O_PeriphID2 0x00000FE8 // +#define GPIO_O_PeriphID3 0x00000FEC // +#define GPIO_O_PCellID0 0x00000FF0 // +#define GPIO_O_PCellID1 0x00000FF4 // +#define GPIO_O_PCellID2 0x00000FF8 // +#define GPIO_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// GPIO Register reset values. +// +//***************************************************************************** +#define GPIO_RV_DATA 0x00000000 // Data register reset value. +#define GPIO_RV_DIR 0x00000000 // Data direction reg RV. +#define GPIO_RV_IS 0x00000000 // Interrupt sense reg RV. +#define GPIO_RV_IBE 0x00000000 // Interrupt both edges reg RV. +#define GPIO_RV_IEV 0x00000000 // Intterupt event reg RV. +#define GPIO_RV_IM 0x00000000 // Interrupt mask reg RV. +#define GPIO_RV_RIS 0x00000000 // Raw interrupt status reg RV. +#define GPIO_RV_MIS 0x00000000 // Masked interrupt status reg RV. +#define GPIO_RV_IC 0x00000000 // Interrupt clear reg RV. +#define GPIO_RV_AFSEL 0x00000000 // Mode control select reg RV. +#define GPIO_RV_DR2R 0x000000FF // 2ma drive select reg RV. +#define GPIO_RV_DR4R 0x00000000 // 4ma drive select reg RV. +#define GPIO_RV_DR8R 0x00000000 // 8ma drive select reg RV. +#define GPIO_RV_ODR 0x00000000 // Open drain select reg RV. +#define GPIO_RV_PUR 0x000000FF // Pull up select reg RV. +#define GPIO_RV_PDR 0x00000000 // Pull down select reg RV. +#define GPIO_RV_SLR 0x00000000 // Slew rate control enable reg RV. +#define GPIO_RV_DEN 0x000000FF // Digital input enable reg RV. +#define GPIO_RV_PeriphID4 0x00000000 // +#define GPIO_RV_PeriphID5 0x00000000 // +#define GPIO_RV_PeriphID6 0x00000000 // +#define GPIO_RV_PeriphID7 0x00000000 // +#define GPIO_RV_PeriphID0 0x00000061 // +#define GPIO_RV_PeriphID1 0x00000010 // +#define GPIO_RV_PeriphID2 0x00000004 // +#define GPIO_RV_PeriphID3 0x00000000 // +#define GPIO_RV_PCellID0 0x0000000D // +#define GPIO_RV_PCellID1 0x000000F0 // +#define GPIO_RV_PCellID2 0x00000005 // +#define GPIO_RV_PCellID3 0x000000B1 // + +#endif // __HW_GPIO_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_i2c.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_i2c.h new file mode 100644 index 0000000..2a3900c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_i2c.h @@ -0,0 +1,197 @@ +//***************************************************************************** +// +// hw_i2c.h - Macros used when accessing the I2C master and slave hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_I2C_H__ +#define __HW_I2C_H__ + +//***************************************************************************** +// +// The following defines the offset between the I2C master and slave registers. +// +//***************************************************************************** +#define I2C_O_SLAVE 0x00000800 // Offset from master to slave + +//***************************************************************************** +// +// The following define the offsets of the I2C master registers. +// +//***************************************************************************** +#define I2C_MASTER_O_SA 0x00000000 // Slave address register +#define I2C_MASTER_O_CS 0x00000004 // Control and Status register +#define I2C_MASTER_O_DR 0x00000008 // Data register +#define I2C_MASTER_O_TPR 0x0000000C // Timer period register +#define I2C_MASTER_O_IMR 0x00000010 // Interrupt mask register +#define I2C_MASTER_O_RIS 0x00000014 // Raw interrupt status register +#define I2C_MASTER_O_MIS 0x00000018 // Masked interrupt status reg +#define I2C_MASTER_O_MICR 0x0000001c // Interrupt clear register +#define I2C_MASTER_O_CR 0x00000020 // Configuration register + +//***************************************************************************** +// +// The following define the offsets of the I2C slave registers. +// +//***************************************************************************** +#define I2C_SLAVE_O_OAR 0x00000000 // Own address register +#define I2C_SLAVE_O_CSR 0x00000004 // Control/Status register +#define I2C_SLAVE_O_DR 0x00000008 // Data register +#define I2C_SLAVE_O_IM 0x0000000C // Interrupt mask register +#define I2C_SLAVE_O_RIS 0x00000010 // Raw interrupt status register +#define I2C_SLAVE_O_MIS 0x00000014 // Masked interrupt status reg +#define I2C_SLAVE_O_SICR 0x00000018 // Interrupt clear register + +//***************************************************************************** +// +// The followng define the bit fields in the I2C master slave address register. +// +//***************************************************************************** +#define I2C_MASTER_SA_SA_MASK 0x000000FE // Slave address +#define I2C_MASTER_SA_RS 0x00000001 // Receive/send +#define I2C_MASTER_SA_SA_SHIFT 1 + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Control and Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_CS_ACK 0x00000008 // Acknowlegde +#define I2C_MASTER_CS_STOP 0x00000004 // Stop +#define I2C_MASTER_CS_START 0x00000002 // Start +#define I2C_MASTER_CS_RUN 0x00000001 // Run +#define I2C_MASTER_CS_BUS_BUSY 0x00000040 // Bus busy +#define I2C_MASTER_CS_IDLE 0x00000020 // Idle +#define I2C_MASTER_CS_ARB_LOST 0x00000010 // Lost arbitration +#define I2C_MASTER_CS_DATA_ACK 0x00000008 // Data byte not acknowledged +#define I2C_MASTER_CS_ADDR_ACK 0x00000004 // Address byte not acknowledged +#define I2C_MASTER_CS_ERROR 0x00000002 // Error occurred +#define I2C_MASTER_CS_BUSY 0x00000001 // Controller is TX/RX data +#define I2C_MASTER_CS_ERR_MASK 0x0000001C + +//***************************************************************************** +// +// The following define values used in determining the contents of the I2C +// Master Timer Period register. +// +//***************************************************************************** +#define I2C_MASTER_TPR_SCL_HP 0x00000004 // SCL high period +#define I2C_MASTER_TPR_SCL_LP 0x00000006 // SCL low period +#define I2C_MASTER_TPR_SCL (I2C_MASTER_TPR_SCL_HP + I2C_MASTER_TPR_SCL_LP) +#define I2C_SCL_STANDARD 100000 // SCL standard frequency +#define I2C_SCL_FAST 400000 // SCL fast frequency + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_MASTER_IMR_IM 0x00000001 // Master interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_MASTER_RIS_RIS 0x00000001 // Master raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_MASTER_MIS_MIS 0x00000001 // Master masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_MASTER_MICR_IC 0x00000001 // Master interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the I2C Master Configuration +// register. +// +//***************************************************************************** +#define I2C_MASTER_CR_SFE 0x00000020 // Slave function enable +#define I2C_MASTER_CR_MFE 0x00000010 // Master function enable +#define I2C_MASTER_CR_LPBK 0x00000001 // Loopback enable + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Own Address register. +// +//***************************************************************************** +#define I2C_SLAVE_SOAR_OAR_MASK 0x0000007F // Slave address + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Control/Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_CSR_DA 0x00000001 // Enable the device +#define I2C_SLAVE_CSR_TREQ 0x00000002 // Transmit request received +#define I2C_SLAVE_CSR_RREQ 0x00000001 // Receive data from I2C master + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Mask +// register. +// +//***************************************************************************** +#define I2C_SLAVE_IMR_IM 0x00000001 // Slave interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Raw Interrupt Status +// register. +// +//***************************************************************************** +#define I2C_SLAVE_RIS_RIS 0x00000001 // Slave raw interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Masked Interrupt +// Status register. +// +//***************************************************************************** +#define I2C_SLAVE_MIS_MIS 0x00000001 // Slave masked interrupt status + +//***************************************************************************** +// +// The following define the bit fields in the I2C Slave Interrupt Clear +// register. +// +//***************************************************************************** +#define I2C_SLAVE_SICR_IC 0x00000001 // Slave interrupt clear + +#endif // __HW_I2C_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_ints.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_ints.h new file mode 100644 index 0000000..820d5cd --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_ints.h @@ -0,0 +1,97 @@ +//***************************************************************************** +// +// hw_ints.h - Macros that define the interrupt assignment on Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_INTS_H__ +#define __HW_INTS_H__ + +//***************************************************************************** +// +// The following define the fault assignments. +// +//***************************************************************************** +#define FAULT_NMI 2 // NMI fault +#define FAULT_HARD 3 // Hard fault +#define FAULT_MPU 4 // MPU fault +#define FAULT_BUS 5 // Bus fault +#define FAULT_USAGE 6 // Usage fault +#define FAULT_SVCALL 11 // SVCall +#define FAULT_DEBUG 12 // Debug monitor +#define FAULT_PENDSV 14 // PendSV +#define FAULT_SYSTICK 15 // System Tick + +//***************************************************************************** +// +// The following define the interrupt assignments. +// +//***************************************************************************** +#define INT_GPIOA 16 // GPIO Port A +#define INT_GPIOB 17 // GPIO Port B +#define INT_GPIOC 18 // GPIO Port C +#define INT_GPIOD 19 // GPIO Port D +#define INT_GPIOE 20 // GPIO Port E +#define INT_UART0 21 // UART0 Rx and Tx +#define INT_UART1 22 // UART1 Rx and Tx +#define INT_SSI 23 // SSI Rx and Tx +#define INT_I2C 24 // I2C Master and Slave +#define INT_PWM_FAULT 25 // PWM Fault +#define INT_PWM0 26 // PWM Generator 0 +#define INT_PWM1 27 // PWM Generator 1 +#define INT_PWM2 28 // PWM Generator 2 +#define INT_QEI 29 // Quadrature Encoder +#define INT_ADC0 30 // ADC Sequence 0 +#define INT_ADC1 31 // ADC Sequence 1 +#define INT_ADC2 32 // ADC Sequence 2 +#define INT_ADC3 33 // ADC Sequence 3 +#define INT_WATCHDOG 34 // Watchdog timer +#define INT_TIMER0A 35 // Timer 0 subtimer A +#define INT_TIMER0B 36 // Timer 0 subtimer B +#define INT_TIMER1A 37 // Timer 1 subtimer A +#define INT_TIMER1B 38 // Timer 1 subtimer B +#define INT_TIMER2A 39 // Timer 2 subtimer A +#define INT_TIMER2B 40 // Timer 2 subtimer B +#define INT_COMP0 41 // Analog Comparator 0 +#define INT_COMP1 42 // Analog Comparator 1 +#define INT_COMP2 43 // Analog Comparator 2 +#define INT_SYSCTL 44 // System Control (PLL, OSC, BO) +#define INT_FLASH 45 // FLASH Control + +//***************************************************************************** +// +// The total number of interrupts. +// +//***************************************************************************** +#define NUM_INTERRUPTS 46 + +//***************************************************************************** +// +// The total number of priority levels. +// +//***************************************************************************** +#define NUM_PRIORITY 8 +#define NUM_PRIORITY_BITS 3 + +#endif // __HW_INTS_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_memmap.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_memmap.h new file mode 100644 index 0000000..4340d63 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_memmap.h @@ -0,0 +1,64 @@ +//***************************************************************************** +// +// hw_memmap.h - Macros defining the memory map of Stellaris. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_MEMMAP_H__ +#define __HW_MEMMAP_H__ + +//***************************************************************************** +// +// The following define the base address of the memories and peripherals. +// +//***************************************************************************** +#define FLASH_BASE 0x00000000 // FLASH memory +#define SRAM_BASE 0x20000000 // SRAM memory +#define WATCHDOG_BASE 0x40000000 // Watchdog +#define GPIO_PORTA_BASE 0x40004000 // GPIO Port A +#define GPIO_PORTB_BASE 0x40005000 // GPIO Port B +#define GPIO_PORTC_BASE 0x40006000 // GPIO Port C +#define GPIO_PORTD_BASE 0x40007000 // GPIO Port D +#define SSI_BASE 0x40008000 // SSI +#define UART0_BASE 0x4000C000 // UART0 +#define UART1_BASE 0x4000D000 // UART1 +#define I2C_MASTER_BASE 0x40020000 // I2C Master +#define I2C_SLAVE_BASE 0x40020800 // I2C Slave +#define GPIO_PORTE_BASE 0x40024000 // GPIO Port E +#define PWM_BASE 0x40028000 // PWM +#define QEI_BASE 0x4002C000 // QEI +#define TIMER0_BASE 0x40030000 // Timer0 +#define TIMER1_BASE 0x40031000 // Timer1 +#define TIMER2_BASE 0x40032000 // Timer2 +#define ADC_BASE 0x40038000 // ADC +#define COMP_BASE 0x4003C000 // Analog comparators +#define FLASH_CTRL_BASE 0x400FD000 // FLASH Controller +#define SYSCTL_BASE 0x400FE000 // System Control +#define ITM_BASE 0xE0000000 // Instrumentation Trace Macrocell +#define DWT_BASE 0xE0001000 // Data Watchpoint and Trace +#define FPB_BASE 0xE0002000 // FLASH Patch and Breakpoint +#define NVIC_BASE 0xE000E000 // Nested Vectored Interrupt Ctrl +#define TPIU_BASE 0xE0040000 // Trace Port Interface Unit + +#endif // __HW_MEMMAP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_nvic.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_nvic.h new file mode 100644 index 0000000..692af25 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_nvic.h @@ -0,0 +1,830 @@ +//***************************************************************************** +// +// hw_nvic.h - Macros used when accessing the NVIC hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_NVIC_H__ +#define __HW_NVIC_H__ + +//***************************************************************************** +// +// The following define the addresses of the NVIC registers. +// +//***************************************************************************** +#define NVIC_INT_TYPE 0xE000E004 // Interrupt Controller Type Reg. +#define NVIC_ST_CTRL 0xE000E010 // SysTick Control and Status Reg. +#define NVIC_ST_RELOAD 0xE000E014 // SysTick Reload Value Register +#define NVIC_ST_CURRENT 0xE000E018 // SysTick Current Value Register +#define NVIC_ST_CAL 0xE000E01C // SysTick Calibration Value Reg. +#define NVIC_EN0 0xE000E100 // IRQ 0 to 31 Set Enable Register +#define NVIC_DIS0 0xE000E180 // IRQ 0 to 31 Clear Enable Reg. +#define NVIC_PEND0 0xE000E200 // IRQ 0 to 31 Set Pending Register +#define NVIC_UNPEND0 0xE000E280 // IRQ 0 to 31 Clear Pending Reg. +#define NVIC_ACTIVE0 0xE000E300 // IRQ 0 to 31 Active Register +#define NVIC_PRI0 0xE000E400 // IRQ 0 to 3 Priority Register +#define NVIC_PRI1 0xE000E404 // IRQ 4 to 7 Priority Register +#define NVIC_PRI2 0xE000E408 // IRQ 8 to 11 Priority Register +#define NVIC_PRI3 0xE000E40C // IRQ 12 to 15 Priority Register +#define NVIC_PRI4 0xE000E410 // IRQ 16 to 19 Priority Register +#define NVIC_PRI5 0xE000E414 // IRQ 20 to 23 Priority Register +#define NVIC_PRI6 0xE000E418 // IRQ 24 to 27 Priority Register +#define NVIC_PRI7 0xE000E41C // IRQ 28 to 31 Priority Register +#define NVIC_CPUID 0xE000ED00 // CPUID Base Register +#define NVIC_INT_CTRL 0xE000ED04 // Interrupt Control State Register +#define NVIC_VTABLE 0xE000ED08 // Vector Table Offset Register +#define NVIC_APINT 0xE000ED0C // App. Int & Reset Control Reg. +#define NVIC_SYS_CTRL 0xE000ED10 // System Control Register +#define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register +#define NVIC_SYS_PRI1 0xE000ED18 // Sys. Handlers 4 to 7 Priority +#define NVIC_SYS_PRI2 0xE000ED1C // Sys. Handlers 8 to 11 Priority +#define NVIC_SYS_PRI3 0xE000ED20 // Sys. Handlers 12 to 15 Priority +#define NVIC_SYS_HND_CTRL 0xE000ED24 // System Handler Control and State +#define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. +#define NVIC_HFAULT_STAT 0xE000ED2C // Hard Fault Status Register +#define NVIC_DEBUG_STAT 0xE000ED30 // Debug Status Register +#define NVIC_MM_ADDR 0xE000ED34 // Mem Manage Address Register +#define NVIC_FAULT_ADDR 0xE000ED38 // Bus Fault Address Register +#define NVIC_MPU_TYPE 0xE000ED90 // MPU Type Register +#define NVIC_MPU_CTRL 0xE000ED94 // MPU Control Register +#define NVIC_MPU_NUMBER 0xE000ED98 // MPU Region Number Register +#define NVIC_MPU_BASE 0xE000ED9C // MPU Region Base Address Register +#define NVIC_MPU_ATTR 0xE000EDA0 // MPU Region Attribute & Size Reg. +#define NVIC_DBG_CTRL 0xE000EDF0 // Debug Control and Status Reg. +#define NVIC_DBG_XFER 0xE000EDF4 // Debug Core Reg. Transfer Select +#define NVIC_DBG_DATA 0xE000EDF8 // Debug Core Register Data +#define NVIC_DBG_INT 0xE000EDFC // Debug Reset Interrupt Control +#define NVIC_SW_TRIG 0xE000EF00 // Software Trigger Interrupt Reg. + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_TYPE register. +// +//***************************************************************************** +#define NVIC_INT_TYPE_LINES_M 0x0000001F // Number of interrupt lines (x32) +#define NVIC_INT_TYPE_LINES_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CTRL register. +// +//***************************************************************************** +#define NVIC_ST_CTRL_COUNT 0x00010000 // Count flag +#define NVIC_ST_CTRL_CLK_SRC 0x00000004 // Clock Source +#define NVIC_ST_CTRL_INTEN 0x00000002 // Interrupt enable +#define NVIC_ST_CTRL_ENABLE 0x00000001 // Counter mode + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_RELOAD register. +// +//***************************************************************************** +#define NVIC_ST_RELOAD_M 0x00FFFFFF // Counter load value +#define NVIC_ST_RELOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CURRENT register. +// +//***************************************************************************** +#define NVIC_ST_CURRENT_M 0x00FFFFFF // Counter current value +#define NVIC_ST_CURRENT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ST_CAL register. +// +//***************************************************************************** +#define NVIC_ST_CAL_NOREF 0x80000000 // No reference clock +#define NVIC_ST_CAL_SKEW 0x40000000 // Clock skew +#define NVIC_ST_CAL_ONEMS_M 0x00FFFFFF // 1ms reference value +#define NVIC_ST_CAL_ONEMS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EN0 register. +// +//***************************************************************************** +#define NVIC_EN0_INT31 0x80000000 // Interrupt 31 enable +#define NVIC_EN0_INT30 0x40000000 // Interrupt 30 enable +#define NVIC_EN0_INT29 0x20000000 // Interrupt 29 enable +#define NVIC_EN0_INT28 0x10000000 // Interrupt 28 enable +#define NVIC_EN0_INT27 0x08000000 // Interrupt 27 enable +#define NVIC_EN0_INT26 0x04000000 // Interrupt 26 enable +#define NVIC_EN0_INT25 0x02000000 // Interrupt 25 enable +#define NVIC_EN0_INT24 0x01000000 // Interrupt 24 enable +#define NVIC_EN0_INT23 0x00800000 // Interrupt 23 enable +#define NVIC_EN0_INT22 0x00400000 // Interrupt 22 enable +#define NVIC_EN0_INT21 0x00200000 // Interrupt 21 enable +#define NVIC_EN0_INT20 0x00100000 // Interrupt 20 enable +#define NVIC_EN0_INT19 0x00080000 // Interrupt 19 enable +#define NVIC_EN0_INT18 0x00040000 // Interrupt 18 enable +#define NVIC_EN0_INT17 0x00020000 // Interrupt 17 enable +#define NVIC_EN0_INT16 0x00010000 // Interrupt 16 enable +#define NVIC_EN0_INT15 0x00008000 // Interrupt 15 enable +#define NVIC_EN0_INT14 0x00004000 // Interrupt 14 enable +#define NVIC_EN0_INT13 0x00002000 // Interrupt 13 enable +#define NVIC_EN0_INT12 0x00001000 // Interrupt 12 enable +#define NVIC_EN0_INT11 0x00000800 // Interrupt 11 enable +#define NVIC_EN0_INT10 0x00000400 // Interrupt 10 enable +#define NVIC_EN0_INT9 0x00000200 // Interrupt 9 enable +#define NVIC_EN0_INT8 0x00000100 // Interrupt 8 enable +#define NVIC_EN0_INT7 0x00000080 // Interrupt 7 enable +#define NVIC_EN0_INT6 0x00000040 // Interrupt 6 enable +#define NVIC_EN0_INT5 0x00000020 // Interrupt 5 enable +#define NVIC_EN0_INT4 0x00000010 // Interrupt 4 enable +#define NVIC_EN0_INT3 0x00000008 // Interrupt 3 enable +#define NVIC_EN0_INT2 0x00000004 // Interrupt 2 enable +#define NVIC_EN0_INT1 0x00000002 // Interrupt 1 enable +#define NVIC_EN0_INT0 0x00000001 // Interrupt 0 enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DIS0 register. +// +//***************************************************************************** +#define NVIC_DIS0_INT31 0x80000000 // Interrupt 31 disable +#define NVIC_DIS0_INT30 0x40000000 // Interrupt 30 disable +#define NVIC_DIS0_INT29 0x20000000 // Interrupt 29 disable +#define NVIC_DIS0_INT28 0x10000000 // Interrupt 28 disable +#define NVIC_DIS0_INT27 0x08000000 // Interrupt 27 disable +#define NVIC_DIS0_INT26 0x04000000 // Interrupt 26 disable +#define NVIC_DIS0_INT25 0x02000000 // Interrupt 25 disable +#define NVIC_DIS0_INT24 0x01000000 // Interrupt 24 disable +#define NVIC_DIS0_INT23 0x00800000 // Interrupt 23 disable +#define NVIC_DIS0_INT22 0x00400000 // Interrupt 22 disable +#define NVIC_DIS0_INT21 0x00200000 // Interrupt 21 disable +#define NVIC_DIS0_INT20 0x00100000 // Interrupt 20 disable +#define NVIC_DIS0_INT19 0x00080000 // Interrupt 19 disable +#define NVIC_DIS0_INT18 0x00040000 // Interrupt 18 disable +#define NVIC_DIS0_INT17 0x00020000 // Interrupt 17 disable +#define NVIC_DIS0_INT16 0x00010000 // Interrupt 16 disable +#define NVIC_DIS0_INT15 0x00008000 // Interrupt 15 disable +#define NVIC_DIS0_INT14 0x00004000 // Interrupt 14 disable +#define NVIC_DIS0_INT13 0x00002000 // Interrupt 13 disable +#define NVIC_DIS0_INT12 0x00001000 // Interrupt 12 disable +#define NVIC_DIS0_INT11 0x00000800 // Interrupt 11 disable +#define NVIC_DIS0_INT10 0x00000400 // Interrupt 10 disable +#define NVIC_DIS0_INT9 0x00000200 // Interrupt 9 disable +#define NVIC_DIS0_INT8 0x00000100 // Interrupt 8 disable +#define NVIC_DIS0_INT7 0x00000080 // Interrupt 7 disable +#define NVIC_DIS0_INT6 0x00000040 // Interrupt 6 disable +#define NVIC_DIS0_INT5 0x00000020 // Interrupt 5 disable +#define NVIC_DIS0_INT4 0x00000010 // Interrupt 4 disable +#define NVIC_DIS0_INT3 0x00000008 // Interrupt 3 disable +#define NVIC_DIS0_INT2 0x00000004 // Interrupt 2 disable +#define NVIC_DIS0_INT1 0x00000002 // Interrupt 1 disable +#define NVIC_DIS0_INT0 0x00000001 // Interrupt 0 disable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PEND0 register. +// +//***************************************************************************** +#define NVIC_PEND0_INT31 0x80000000 // Interrupt 31 pend +#define NVIC_PEND0_INT30 0x40000000 // Interrupt 30 pend +#define NVIC_PEND0_INT29 0x20000000 // Interrupt 29 pend +#define NVIC_PEND0_INT28 0x10000000 // Interrupt 28 pend +#define NVIC_PEND0_INT27 0x08000000 // Interrupt 27 pend +#define NVIC_PEND0_INT26 0x04000000 // Interrupt 26 pend +#define NVIC_PEND0_INT25 0x02000000 // Interrupt 25 pend +#define NVIC_PEND0_INT24 0x01000000 // Interrupt 24 pend +#define NVIC_PEND0_INT23 0x00800000 // Interrupt 23 pend +#define NVIC_PEND0_INT22 0x00400000 // Interrupt 22 pend +#define NVIC_PEND0_INT21 0x00200000 // Interrupt 21 pend +#define NVIC_PEND0_INT20 0x00100000 // Interrupt 20 pend +#define NVIC_PEND0_INT19 0x00080000 // Interrupt 19 pend +#define NVIC_PEND0_INT18 0x00040000 // Interrupt 18 pend +#define NVIC_PEND0_INT17 0x00020000 // Interrupt 17 pend +#define NVIC_PEND0_INT16 0x00010000 // Interrupt 16 pend +#define NVIC_PEND0_INT15 0x00008000 // Interrupt 15 pend +#define NVIC_PEND0_INT14 0x00004000 // Interrupt 14 pend +#define NVIC_PEND0_INT13 0x00002000 // Interrupt 13 pend +#define NVIC_PEND0_INT12 0x00001000 // Interrupt 12 pend +#define NVIC_PEND0_INT11 0x00000800 // Interrupt 11 pend +#define NVIC_PEND0_INT10 0x00000400 // Interrupt 10 pend +#define NVIC_PEND0_INT9 0x00000200 // Interrupt 9 pend +#define NVIC_PEND0_INT8 0x00000100 // Interrupt 8 pend +#define NVIC_PEND0_INT7 0x00000080 // Interrupt 7 pend +#define NVIC_PEND0_INT6 0x00000040 // Interrupt 6 pend +#define NVIC_PEND0_INT5 0x00000020 // Interrupt 5 pend +#define NVIC_PEND0_INT4 0x00000010 // Interrupt 4 pend +#define NVIC_PEND0_INT3 0x00000008 // Interrupt 3 pend +#define NVIC_PEND0_INT2 0x00000004 // Interrupt 2 pend +#define NVIC_PEND0_INT1 0x00000002 // Interrupt 1 pend +#define NVIC_PEND0_INT0 0x00000001 // Interrupt 0 pend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_UNPEND0 register. +// +//***************************************************************************** +#define NVIC_UNPEND0_INT31 0x80000000 // Interrupt 31 unpend +#define NVIC_UNPEND0_INT30 0x40000000 // Interrupt 30 unpend +#define NVIC_UNPEND0_INT29 0x20000000 // Interrupt 29 unpend +#define NVIC_UNPEND0_INT28 0x10000000 // Interrupt 28 unpend +#define NVIC_UNPEND0_INT27 0x08000000 // Interrupt 27 unpend +#define NVIC_UNPEND0_INT26 0x04000000 // Interrupt 26 unpend +#define NVIC_UNPEND0_INT25 0x02000000 // Interrupt 25 unpend +#define NVIC_UNPEND0_INT24 0x01000000 // Interrupt 24 unpend +#define NVIC_UNPEND0_INT23 0x00800000 // Interrupt 23 unpend +#define NVIC_UNPEND0_INT22 0x00400000 // Interrupt 22 unpend +#define NVIC_UNPEND0_INT21 0x00200000 // Interrupt 21 unpend +#define NVIC_UNPEND0_INT20 0x00100000 // Interrupt 20 unpend +#define NVIC_UNPEND0_INT19 0x00080000 // Interrupt 19 unpend +#define NVIC_UNPEND0_INT18 0x00040000 // Interrupt 18 unpend +#define NVIC_UNPEND0_INT17 0x00020000 // Interrupt 17 unpend +#define NVIC_UNPEND0_INT16 0x00010000 // Interrupt 16 unpend +#define NVIC_UNPEND0_INT15 0x00008000 // Interrupt 15 unpend +#define NVIC_UNPEND0_INT14 0x00004000 // Interrupt 14 unpend +#define NVIC_UNPEND0_INT13 0x00002000 // Interrupt 13 unpend +#define NVIC_UNPEND0_INT12 0x00001000 // Interrupt 12 unpend +#define NVIC_UNPEND0_INT11 0x00000800 // Interrupt 11 unpend +#define NVIC_UNPEND0_INT10 0x00000400 // Interrupt 10 unpend +#define NVIC_UNPEND0_INT9 0x00000200 // Interrupt 9 unpend +#define NVIC_UNPEND0_INT8 0x00000100 // Interrupt 8 unpend +#define NVIC_UNPEND0_INT7 0x00000080 // Interrupt 7 unpend +#define NVIC_UNPEND0_INT6 0x00000040 // Interrupt 6 unpend +#define NVIC_UNPEND0_INT5 0x00000020 // Interrupt 5 unpend +#define NVIC_UNPEND0_INT4 0x00000010 // Interrupt 4 unpend +#define NVIC_UNPEND0_INT3 0x00000008 // Interrupt 3 unpend +#define NVIC_UNPEND0_INT2 0x00000004 // Interrupt 2 unpend +#define NVIC_UNPEND0_INT1 0x00000002 // Interrupt 1 unpend +#define NVIC_UNPEND0_INT0 0x00000001 // Interrupt 0 unpend + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_ACTIVE0 register. +// +//***************************************************************************** +#define NVIC_ACTIVE0_INT31 0x80000000 // Interrupt 31 active +#define NVIC_ACTIVE0_INT30 0x40000000 // Interrupt 30 active +#define NVIC_ACTIVE0_INT29 0x20000000 // Interrupt 29 active +#define NVIC_ACTIVE0_INT28 0x10000000 // Interrupt 28 active +#define NVIC_ACTIVE0_INT27 0x08000000 // Interrupt 27 active +#define NVIC_ACTIVE0_INT26 0x04000000 // Interrupt 26 active +#define NVIC_ACTIVE0_INT25 0x02000000 // Interrupt 25 active +#define NVIC_ACTIVE0_INT24 0x01000000 // Interrupt 24 active +#define NVIC_ACTIVE0_INT23 0x00800000 // Interrupt 23 active +#define NVIC_ACTIVE0_INT22 0x00400000 // Interrupt 22 active +#define NVIC_ACTIVE0_INT21 0x00200000 // Interrupt 21 active +#define NVIC_ACTIVE0_INT20 0x00100000 // Interrupt 20 active +#define NVIC_ACTIVE0_INT19 0x00080000 // Interrupt 19 active +#define NVIC_ACTIVE0_INT18 0x00040000 // Interrupt 18 active +#define NVIC_ACTIVE0_INT17 0x00020000 // Interrupt 17 active +#define NVIC_ACTIVE0_INT16 0x00010000 // Interrupt 16 active +#define NVIC_ACTIVE0_INT15 0x00008000 // Interrupt 15 active +#define NVIC_ACTIVE0_INT14 0x00004000 // Interrupt 14 active +#define NVIC_ACTIVE0_INT13 0x00002000 // Interrupt 13 active +#define NVIC_ACTIVE0_INT12 0x00001000 // Interrupt 12 active +#define NVIC_ACTIVE0_INT11 0x00000800 // Interrupt 11 active +#define NVIC_ACTIVE0_INT10 0x00000400 // Interrupt 10 active +#define NVIC_ACTIVE0_INT9 0x00000200 // Interrupt 9 active +#define NVIC_ACTIVE0_INT8 0x00000100 // Interrupt 8 active +#define NVIC_ACTIVE0_INT7 0x00000080 // Interrupt 7 active +#define NVIC_ACTIVE0_INT6 0x00000040 // Interrupt 6 active +#define NVIC_ACTIVE0_INT5 0x00000020 // Interrupt 5 active +#define NVIC_ACTIVE0_INT4 0x00000010 // Interrupt 4 active +#define NVIC_ACTIVE0_INT3 0x00000008 // Interrupt 3 active +#define NVIC_ACTIVE0_INT2 0x00000004 // Interrupt 2 active +#define NVIC_ACTIVE0_INT1 0x00000002 // Interrupt 1 active +#define NVIC_ACTIVE0_INT0 0x00000001 // Interrupt 0 active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI0 register. +// +//***************************************************************************** +#define NVIC_PRI0_INT3_M 0xFF000000 // Interrupt 3 priority mask +#define NVIC_PRI0_INT2_M 0x00FF0000 // Interrupt 2 priority mask +#define NVIC_PRI0_INT1_M 0x0000FF00 // Interrupt 1 priority mask +#define NVIC_PRI0_INT0_M 0x000000FF // Interrupt 0 priority mask +#define NVIC_PRI0_INT3_S 24 +#define NVIC_PRI0_INT2_S 16 +#define NVIC_PRI0_INT1_S 8 +#define NVIC_PRI0_INT0_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI1 register. +// +//***************************************************************************** +#define NVIC_PRI1_INT7_M 0xFF000000 // Interrupt 7 priority mask +#define NVIC_PRI1_INT6_M 0x00FF0000 // Interrupt 6 priority mask +#define NVIC_PRI1_INT5_M 0x0000FF00 // Interrupt 5 priority mask +#define NVIC_PRI1_INT4_M 0x000000FF // Interrupt 4 priority mask +#define NVIC_PRI1_INT7_S 24 +#define NVIC_PRI1_INT6_S 16 +#define NVIC_PRI1_INT5_S 8 +#define NVIC_PRI1_INT4_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI2 register. +// +//***************************************************************************** +#define NVIC_PRI2_INT11_M 0xFF000000 // Interrupt 11 priority mask +#define NVIC_PRI2_INT10_M 0x00FF0000 // Interrupt 10 priority mask +#define NVIC_PRI2_INT9_M 0x0000FF00 // Interrupt 9 priority mask +#define NVIC_PRI2_INT8_M 0x000000FF // Interrupt 8 priority mask +#define NVIC_PRI2_INT11_S 24 +#define NVIC_PRI2_INT10_S 16 +#define NVIC_PRI2_INT9_S 8 +#define NVIC_PRI2_INT8_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI3 register. +// +//***************************************************************************** +#define NVIC_PRI3_INT15_M 0xFF000000 // Interrupt 15 priority mask +#define NVIC_PRI3_INT14_M 0x00FF0000 // Interrupt 14 priority mask +#define NVIC_PRI3_INT13_M 0x0000FF00 // Interrupt 13 priority mask +#define NVIC_PRI3_INT12_M 0x000000FF // Interrupt 12 priority mask +#define NVIC_PRI3_INT15_S 24 +#define NVIC_PRI3_INT14_S 16 +#define NVIC_PRI3_INT13_S 8 +#define NVIC_PRI3_INT12_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI4 register. +// +//***************************************************************************** +#define NVIC_PRI4_INT19_M 0xFF000000 // Interrupt 19 priority mask +#define NVIC_PRI4_INT18_M 0x00FF0000 // Interrupt 18 priority mask +#define NVIC_PRI4_INT17_M 0x0000FF00 // Interrupt 17 priority mask +#define NVIC_PRI4_INT16_M 0x000000FF // Interrupt 16 priority mask +#define NVIC_PRI4_INT19_S 24 +#define NVIC_PRI4_INT18_S 16 +#define NVIC_PRI4_INT17_S 8 +#define NVIC_PRI4_INT16_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI5 register. +// +//***************************************************************************** +#define NVIC_PRI5_INT23_M 0xFF000000 // Interrupt 23 priority mask +#define NVIC_PRI5_INT22_M 0x00FF0000 // Interrupt 22 priority mask +#define NVIC_PRI5_INT21_M 0x0000FF00 // Interrupt 21 priority mask +#define NVIC_PRI5_INT20_M 0x000000FF // Interrupt 20 priority mask +#define NVIC_PRI5_INT23_S 24 +#define NVIC_PRI5_INT22_S 16 +#define NVIC_PRI5_INT21_S 8 +#define NVIC_PRI5_INT20_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI6 register. +// +//***************************************************************************** +#define NVIC_PRI6_INT27_M 0xFF000000 // Interrupt 27 priority mask +#define NVIC_PRI6_INT26_M 0x00FF0000 // Interrupt 26 priority mask +#define NVIC_PRI6_INT25_M 0x0000FF00 // Interrupt 25 priority mask +#define NVIC_PRI6_INT24_M 0x000000FF // Interrupt 24 priority mask +#define NVIC_PRI6_INT27_S 24 +#define NVIC_PRI6_INT26_S 16 +#define NVIC_PRI6_INT25_S 8 +#define NVIC_PRI6_INT24_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_PRI7 register. +// +//***************************************************************************** +#define NVIC_PRI7_INT31_M 0xFF000000 // Interrupt 31 priority mask +#define NVIC_PRI7_INT30_M 0x00FF0000 // Interrupt 30 priority mask +#define NVIC_PRI7_INT29_M 0x0000FF00 // Interrupt 29 priority mask +#define NVIC_PRI7_INT28_M 0x000000FF // Interrupt 28 priority mask +#define NVIC_PRI7_INT31_S 24 +#define NVIC_PRI7_INT30_S 16 +#define NVIC_PRI7_INT29_S 8 +#define NVIC_PRI7_INT28_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CPUID register. +// +//***************************************************************************** +#define NVIC_CPUID_IMP_M 0xFF000000 // Implementer +#define NVIC_CPUID_VAR_M 0x00F00000 // Variant +#define NVIC_CPUID_PARTNO_M 0x0000FFF0 // Processor part number +#define NVIC_CPUID_REV_M 0x0000000F // Revision + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_INT_CTRL register. +// +//***************************************************************************** +#define NVIC_INT_CTRL_NMI_SET 0x80000000 // Pend a NMI +#define NVIC_INT_CTRL_PEND_SV 0x10000000 // Pend a PendSV +#define NVIC_INT_CTRL_UNPEND_SV 0x08000000 // Unpend a PendSV +#define NVIC_INT_CTRL_ISR_PRE 0x00800000 // Debug interrupt handling +#define NVIC_INT_CTRL_ISR_PEND 0x00400000 // Debug interrupt pending +#define NVIC_INT_CTRL_VEC_PEN_M 0x003FF000 // Highest pending exception +#define NVIC_INT_CTRL_RET_BASE 0x00000800 // Return to base +#define NVIC_INT_CTRL_VEC_ACT_M 0x000003FF // Current active exception +#define NVIC_INT_CTRL_VEC_PEN_S 12 +#define NVIC_INT_CTRL_VEC_ACT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_VTABLE register. +// +//***************************************************************************** +#define NVIC_VTABLE_BASE 0x20000000 // Vector table base +#define NVIC_VTABLE_OFFSET_M 0x1FFFFF00 // Vector table offset +#define NVIC_VTABLE_OFFSET_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_APINT register. +// +//***************************************************************************** +#define NVIC_APINT_VECTKEY_M 0xFFFF0000 // Vector key mask +#define NVIC_APINT_VECTKEY 0x05FA0000 // Vector key +#define NVIC_APINT_ENDIANESS 0x00008000 // Data endianess +#define NVIC_APINT_PRIGROUP_M 0x00000700 // Priority group +#define NVIC_APINT_PRIGROUP_7_1 0x00000000 // Priority group 7.1 split +#define NVIC_APINT_PRIGROUP_6_2 0x00000100 // Priority group 6.2 split +#define NVIC_APINT_PRIGROUP_5_3 0x00000200 // Priority group 5.3 split +#define NVIC_APINT_PRIGROUP_4_4 0x00000300 // Priority group 4.4 split +#define NVIC_APINT_PRIGROUP_3_5 0x00000400 // Priority group 3.5 split +#define NVIC_APINT_PRIGROUP_2_6 0x00000500 // Priority group 2.6 split +#define NVIC_APINT_PRIGROUP_1_7 0x00000600 // Priority group 1.7 split +#define NVIC_APINT_PRIGROUP_0_8 0x00000700 // Priority group 0.8 split +#define NVIC_APINT_SYSRESETREQ 0x00000004 // System reset request +#define NVIC_APINT_VECT_CLR_ACT 0x00000002 // Clear active NMI/fault info +#define NVIC_APINT_VECT_RESET 0x00000001 // System reset + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_CTRL_SEVONPEND 0x00000010 // Wakeup on pend +#define NVIC_SYS_CTRL_SLEEPDEEP 0x00000004 // Deep sleep enable +#define NVIC_SYS_CTRL_SLEEPEXIT 0x00000002 // Sleep on ISR exit + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_CFG_CTRL register. +// +//***************************************************************************** +#define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault +#define NVIC_CFG_CTRL_DIV0 0x00000010 // Trap on divide by 0 +#define NVIC_CFG_CTRL_UNALIGNED 0x00000008 // Trap on unaligned access +#define NVIC_CFG_CTRL_DEEP_PEND 0x00000004 // Allow deep interrupt trigger +#define NVIC_CFG_CTRL_MAIN_PEND 0x00000002 // Allow main interrupt trigger +#define NVIC_CFG_CTRL_BASE_THR 0x00000001 // Thread state control + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI1 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI1_RES_M 0xFF000000 // Priority of reserved handler +#define NVIC_SYS_PRI1_USAGE_M 0x00FF0000 // Priority of usage fault handler +#define NVIC_SYS_PRI1_BUS_M 0x0000FF00 // Priority of bus fault handler +#define NVIC_SYS_PRI1_MEM_M 0x000000FF // Priority of mem manage handler +#define NVIC_SYS_PRI1_USAGE_S 16 +#define NVIC_SYS_PRI1_BUS_S 8 +#define NVIC_SYS_PRI1_MEM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI2 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI2_SVC_M 0xFF000000 // Priority of SVCall handler +#define NVIC_SYS_PRI2_RES_M 0x00FFFFFF // Priority of reserved handlers +#define NVIC_SYS_PRI2_SVC_S 24 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_PRI3 register. +// +//***************************************************************************** +#define NVIC_SYS_PRI3_TICK_M 0xFF000000 // Priority of Sys Tick handler +#define NVIC_SYS_PRI3_PENDSV_M 0x00FF0000 // Priority of PendSV handler +#define NVIC_SYS_PRI3_RES_M 0x0000FF00 // Priority of reserved handler +#define NVIC_SYS_PRI3_DEBUG_M 0x000000FF // Priority of debug handler +#define NVIC_SYS_PRI3_TICK_S 24 +#define NVIC_SYS_PRI3_PENDSV_S 16 +#define NVIC_SYS_PRI3_DEBUG_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SYS_HND_CTRL register. +// +//***************************************************************************** +#define NVIC_SYS_HND_CTRL_USAGE 0x00040000 // Usage fault enable +#define NVIC_SYS_HND_CTRL_BUS 0x00020000 // Bus fault enable +#define NVIC_SYS_HND_CTRL_MEM 0x00010000 // Mem manage fault enable +#define NVIC_SYS_HND_CTRL_SVC 0x00008000 // SVCall is pended +#define NVIC_SYS_HND_CTRL_BUSP 0x00004000 // Bus fault is pended +#define NVIC_SYS_HND_CTRL_TICK 0x00000800 // Sys tick is active +#define NVIC_SYS_HND_CTRL_PNDSV 0x00000400 // PendSV is active +#define NVIC_SYS_HND_CTRL_MON 0x00000100 // Monitor is active +#define NVIC_SYS_HND_CTRL_SVCA 0x00000080 // SVCall is active +#define NVIC_SYS_HND_CTRL_USGA 0x00000008 // Usage fault is active +#define NVIC_SYS_HND_CTRL_BUSA 0x00000002 // Bus fault is active +#define NVIC_SYS_HND_CTRL_MEMA 0x00000001 // Mem manage is active + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_STAT register. +// +//***************************************************************************** +#define NVIC_FAULT_STAT_DIV0 0x02000000 // Divide by zero fault +#define NVIC_FAULT_STAT_UNALIGN 0x01000000 // Unaligned access fault +#define NVIC_FAULT_STAT_NOCP 0x00080000 // No coprocessor fault +#define NVIC_FAULT_STAT_INVPC 0x00040000 // Invalid PC fault +#define NVIC_FAULT_STAT_INVSTAT 0x00020000 // Invalid state fault +#define NVIC_FAULT_STAT_UNDEF 0x00010000 // Undefined instruction fault +#define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid +#define NVIC_FAULT_STAT_BSTKE 0x00001000 // Stack bus fault +#define NVIC_FAULT_STAT_BUSTKE 0x00000800 // Unstack bus fault +#define NVIC_FAULT_STAT_IMPRE 0x00000400 // Imprecise data bus error +#define NVIC_FAULT_STAT_PRECISE 0x00000200 // Precise data bus error +#define NVIC_FAULT_STAT_IBUS 0x00000100 // Instruction bus fault +#define NVIC_FAULT_STAT_MMARV 0x00000080 // MMAR is valid +#define NVIC_FAULT_STAT_MSTKE 0x00000010 // Stack access violation +#define NVIC_FAULT_STAT_MUSTKE 0x00000008 // Unstack access violation +#define NVIC_FAULT_STAT_DERR 0x00000002 // Data access violation +#define NVIC_FAULT_STAT_IERR 0x00000001 // Instruction access violation + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_HFAULT_STAT register. +// +//***************************************************************************** +#define NVIC_HFAULT_STAT_DBG 0x80000000 // Debug event +#define NVIC_HFAULT_STAT_FORCED 0x40000000 // Cannot execute fault handler +#define NVIC_HFAULT_STAT_VECT 0x00000002 // Vector table read fault + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DEBUG_STAT register. +// +//***************************************************************************** +#define NVIC_DEBUG_STAT_EXTRNL 0x00000010 // EDBGRQ asserted +#define NVIC_DEBUG_STAT_VCATCH 0x00000008 // Vector catch +#define NVIC_DEBUG_STAT_DWTTRAP 0x00000004 // DWT match +#define NVIC_DEBUG_STAT_BKPT 0x00000002 // Breakpoint instruction +#define NVIC_DEBUG_STAT_HALTED 0x00000001 // Halt request + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MM_ADDR register. +// +//***************************************************************************** +#define NVIC_MM_ADDR_M 0xFFFFFFFF // Data fault address +#define NVIC_MM_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_FAULT_ADDR register. +// +//***************************************************************************** +#define NVIC_FAULT_ADDR_M 0xFFFFFFFF // Data bus fault address +#define NVIC_FAULT_ADDR_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_STACK register. +// +//***************************************************************************** +#define NVIC_EXC_STACK_DEEP 0x00000001 // Exception stack + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_EXC_NUM register. +// +//***************************************************************************** +#define NVIC_EXC_NUM_M 0x000003FF // Exception number +#define NVIC_EXC_NUM_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_COPRO register. +// +//***************************************************************************** +#define NVIC_COPRO_15_M 0xC0000000 // Coprocessor 15 access mask +#define NVIC_COPRO_15_DENIED 0x00000000 // Coprocessor 15 access denied +#define NVIC_COPRO_15_PRIV 0x40000000 // Coprocessor 15 privileged addess +#define NVIC_COPRO_15_FULL 0xC0000000 // Coprocessor 15 full access +#define NVIC_COPRO_14_M 0x30000000 // Coprocessor 14 access mask +#define NVIC_COPRO_14_DENIED 0x00000000 // Coprocessor 14 access denied +#define NVIC_COPRO_14_PRIV 0x10000000 // Coprocessor 14 privileged addess +#define NVIC_COPRO_14_FULL 0x30000000 // Coprocessor 14 full access +#define NVIC_COPRO_13_M 0x0C000000 // Coprocessor 13 access mask +#define NVIC_COPRO_13_DENIED 0x00000000 // Coprocessor 13 access denied +#define NVIC_COPRO_13_PRIV 0x04000000 // Coprocessor 13 privileged addess +#define NVIC_COPRO_13_FULL 0x0C000000 // Coprocessor 13 full access +#define NVIC_COPRO_12_M 0x03000000 // Coprocessor 12 access mask +#define NVIC_COPRO_12_DENIED 0x00000000 // Coprocessor 12 access denied +#define NVIC_COPRO_12_PRIV 0x01000000 // Coprocessor 12 privileged addess +#define NVIC_COPRO_12_FULL 0x03000000 // Coprocessor 12 full access +#define NVIC_COPRO_11_M 0x00C00000 // Coprocessor 11 access mask +#define NVIC_COPRO_11_DENIED 0x00000000 // Coprocessor 11 access denied +#define NVIC_COPRO_11_PRIV 0x00400000 // Coprocessor 11 privileged addess +#define NVIC_COPRO_11_FULL 0x00C00000 // Coprocessor 11 full access +#define NVIC_COPRO_10_M 0x00300000 // Coprocessor 10 access mask +#define NVIC_COPRO_10_DENIED 0x00000000 // Coprocessor 10 access denied +#define NVIC_COPRO_10_PRIV 0x00100000 // Coprocessor 10 privileged addess +#define NVIC_COPRO_10_FULL 0x00300000 // Coprocessor 10 full access +#define NVIC_COPRO_9_M 0x000C0000 // Coprocessor 9 access mask +#define NVIC_COPRO_9_DENIED 0x00000000 // Coprocessor 9 access denied +#define NVIC_COPRO_9_PRIV 0x00040000 // Coprocessor 9 privileged addess +#define NVIC_COPRO_9_FULL 0x000C0000 // Coprocessor 9 full access +#define NVIC_COPRO_8_M 0x00030000 // Coprocessor 8 access mask +#define NVIC_COPRO_8_DENIED 0x00000000 // Coprocessor 8 access denied +#define NVIC_COPRO_8_PRIV 0x00010000 // Coprocessor 8 privileged addess +#define NVIC_COPRO_8_FULL 0x00030000 // Coprocessor 8 full access +#define NVIC_COPRO_7_M 0x0000C000 // Coprocessor 7 access mask +#define NVIC_COPRO_7_DENIED 0x00000000 // Coprocessor 7 access denied +#define NVIC_COPRO_7_PRIV 0x00004000 // Coprocessor 7 privileged addess +#define NVIC_COPRO_7_FULL 0x0000C000 // Coprocessor 7 full access +#define NVIC_COPRO_6_M 0x00003000 // Coprocessor 6 access mask +#define NVIC_COPRO_6_DENIED 0x00000000 // Coprocessor 6 access denied +#define NVIC_COPRO_6_PRIV 0x00001000 // Coprocessor 6 privileged addess +#define NVIC_COPRO_6_FULL 0x00003000 // Coprocessor 6 full access +#define NVIC_COPRO_5_M 0x00000C00 // Coprocessor 5 access mask +#define NVIC_COPRO_5_DENIED 0x00000000 // Coprocessor 5 access denied +#define NVIC_COPRO_5_PRIV 0x00000400 // Coprocessor 5 privileged addess +#define NVIC_COPRO_5_FULL 0x00000C00 // Coprocessor 5 full access +#define NVIC_COPRO_4_M 0x00000300 // Coprocessor 4 access mask +#define NVIC_COPRO_4_DENIED 0x00000000 // Coprocessor 4 access denied +#define NVIC_COPRO_4_PRIV 0x00000100 // Coprocessor 4 privileged addess +#define NVIC_COPRO_4_FULL 0x00000300 // Coprocessor 4 full access +#define NVIC_COPRO_3_M 0x000000C0 // Coprocessor 3 access mask +#define NVIC_COPRO_3_DENIED 0x00000000 // Coprocessor 3 access denied +#define NVIC_COPRO_3_PRIV 0x00000040 // Coprocessor 3 privileged addess +#define NVIC_COPRO_3_FULL 0x000000C0 // Coprocessor 3 full access +#define NVIC_COPRO_2_M 0x00000030 // Coprocessor 2 access mask +#define NVIC_COPRO_2_DENIED 0x00000000 // Coprocessor 2 access denied +#define NVIC_COPRO_2_PRIV 0x00000010 // Coprocessor 2 privileged addess +#define NVIC_COPRO_2_FULL 0x00000030 // Coprocessor 2 full access +#define NVIC_COPRO_1_M 0x0000000C // Coprocessor 1 access mask +#define NVIC_COPRO_1_DENIED 0x00000000 // Coprocessor 1 access denied +#define NVIC_COPRO_1_PRIV 0x00000004 // Coprocessor 1 privileged addess +#define NVIC_COPRO_1_FULL 0x0000000C // Coprocessor 1 full access +#define NVIC_COPRO_0_M 0x00000003 // Coprocessor 0 access mask +#define NVIC_COPRO_0_DENIED 0x00000000 // Coprocessor 0 access denied +#define NVIC_COPRO_0_PRIV 0x00000001 // Coprocessor 0 privileged addess +#define NVIC_COPRO_0_FULL 0x00000003 // Coprocessor 0 full access + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_TYPE register. +// +//***************************************************************************** +#define NVIC_MPU_TYPE_IREGION_M 0x00FF0000 // Number of I regions +#define NVIC_MPU_TYPE_DREGION_M 0x0000FF00 // Number of D regions +#define NVIC_MPU_TYPE_SEPARATE 0x00000001 // Separate or unified MPU +#define NVIC_MPU_TYPE_IREGION_S 16 +#define NVIC_MPU_TYPE_DREGION_S 8 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_CTRL register. +// +//***************************************************************************** +#define NVIC_MPU_CTRL_HFNMIENA 0x00000002 // MPU enabled during faults +#define NVIC_MPU_CTRL_ENABLE 0x00000001 // MPU enable + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_NUMBER register. +// +//***************************************************************************** +#define NVIC_MPU_NUMBER_M 0x000000FF // MPU region to access +#define NVIC_MPU_NUMBER_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_BASE register. +// +//***************************************************************************** +#define NVIC_MPU_BASE_ADDR_M 0xFFFFFF00 // Base address +#define NVIC_MPU_BASE_VALID 0x00000010 // Region number valid +#define NVIC_MPU_BASE_REGION_M 0x0000000F // Region number +#define NVIC_MPU_BASE_ADDR_S 8 +#define NVIC_MPU_BASE_REGION_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_MPU_ATTR register. +// +//***************************************************************************** +#define NVIC_MPU_ATTR_ATTRS 0xFFFF0000 // Attributes +#define NVIC_MPU_ATTR_SRD 0x0000FF00 // Sub-region disable +#define NVIC_MPU_ATTR_SZENABLE 0x000000FF // Region size + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_CTRL register. +// +//***************************************************************************** +#define NVIC_DBG_CTRL_DBGKEY_M 0xFFFF0000 // Debug key mask +#define NVIC_DBG_CTRL_DBGKEY 0xA05F0000 // Debug key +#define NVIC_DBG_CTRL_MON_PEND 0x00008000 // Pend the monitor +#define NVIC_DBG_CTRL_MON_REQ 0x00004000 // Monitor request +#define NVIC_DBG_CTRL_MON_EN 0x00002000 // Debug monitor enable +#define NVIC_DBG_CTRL_MONSTEP 0x00001000 // Monitor step the core +#define NVIC_DBG_CTRL_S_SLEEP 0x00000400 // Core is sleeping +#define NVIC_DBG_CTRL_S_HALT 0x00000200 // Core status on halt +#define NVIC_DBG_CTRL_S_REGRDY 0x00000100 // Register read/write available +#define NVIC_DBG_CTRL_S_LOCKUP 0x00000080 // Core is locked up +#define NVIC_DBG_CTRL_C_RESET 0x00000010 // Reset the core +#define NVIC_DBG_CTRL_C_MASKINT 0x00000008 // Mask interrupts when stepping +#define NVIC_DBG_CTRL_C_STEP 0x00000004 // Step the core +#define NVIC_DBG_CTRL_C_HALT 0x00000002 // Halt the core +#define NVIC_DBG_CTRL_C_DEBUGEN 0x00000001 // Enable debug + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_XFER register. +// +//***************************************************************************** +#define NVIC_DBG_XFER_REG_WNR 0x00010000 // Write or not read +#define NVIC_DBG_XFER_REG_SEL_M 0x0000001F // Register +#define NVIC_DBG_XFER_REG_R0 0x00000000 // Register R0 +#define NVIC_DBG_XFER_REG_R1 0x00000001 // Register R1 +#define NVIC_DBG_XFER_REG_R2 0x00000002 // Register R2 +#define NVIC_DBG_XFER_REG_R3 0x00000003 // Register R3 +#define NVIC_DBG_XFER_REG_R4 0x00000004 // Register R4 +#define NVIC_DBG_XFER_REG_R5 0x00000005 // Register R5 +#define NVIC_DBG_XFER_REG_R6 0x00000006 // Register R6 +#define NVIC_DBG_XFER_REG_R7 0x00000007 // Register R7 +#define NVIC_DBG_XFER_REG_R8 0x00000008 // Register R8 +#define NVIC_DBG_XFER_REG_R9 0x00000009 // Register R9 +#define NVIC_DBG_XFER_REG_R10 0x0000000A // Register R10 +#define NVIC_DBG_XFER_REG_R11 0x0000000B // Register R11 +#define NVIC_DBG_XFER_REG_R12 0x0000000C // Register R12 +#define NVIC_DBG_XFER_REG_R13 0x0000000D // Register R13 +#define NVIC_DBG_XFER_REG_R14 0x0000000E // Register R14 +#define NVIC_DBG_XFER_REG_R15 0x0000000F // Register R15 +#define NVIC_DBG_XFER_REG_FLAGS 0x00000010 // xPSR/Flags register +#define NVIC_DBG_XFER_REG_MSP 0x00000011 // Main SP +#define NVIC_DBG_XFER_REG_PSP 0x00000012 // Process SP +#define NVIC_DBG_XFER_REG_DSP 0x00000013 // Deep SP +#define NVIC_DBG_XFER_REG_CFBP 0x00000014 // Control/Fault/BasePri/PriMask + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_DATA register. +// +//***************************************************************************** +#define NVIC_DBG_DATA_M 0xFFFFFFFF // Data temporary cache +#define NVIC_DBG_DATA_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_DBG_INT register. +// +//***************************************************************************** +#define NVIC_DBG_INT_HARDERR 0x00000400 // Debug trap on hard fault +#define NVIC_DBG_INT_INTERR 0x00000200 // Debug trap on interrupt errors +#define NVIC_DBG_INT_BUSERR 0x00000100 // Debug trap on bus error +#define NVIC_DBG_INT_STATERR 0x00000080 // Debug trap on usage fault state +#define NVIC_DBG_INT_CHKERR 0x00000040 // Debug trap on usage fault check +#define NVIC_DBG_INT_NOCPERR 0x00000020 // Debug trap on coprocessor error +#define NVIC_DBG_INT_MMERR 0x00000010 // Debug trap on mem manage fault +#define NVIC_DBG_INT_RESET 0x00000008 // Core reset status +#define NVIC_DBG_INT_RSTPENDCLR 0x00000004 // Clear pending core reset +#define NVIC_DBG_INT_RSTPENDING 0x00000002 // Core reset is pending +#define NVIC_DBG_INT_RSTVCATCH 0x00000001 // Reset vector catch + +//***************************************************************************** +// +// The following define the bit fields in the NVIC_SW_TRIG register. +// +//***************************************************************************** +#define NVIC_SW_TRIG_INTID_M 0x000003FF // Interrupt to trigger +#define NVIC_SW_TRIG_INTID_S 0 + +#endif // __HW_NVIC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_pwm.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_pwm.h new file mode 100644 index 0000000..a324eaa --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_pwm.h @@ -0,0 +1,260 @@ +//***************************************************************************** +// +// hw_pwm.h - Defines and Macros for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_PWM_H__ +#define __HW_PWM_H__ + +//***************************************************************************** +// +// PWM Module Register Offsets. +// +//***************************************************************************** +#define PWM_O_CTL 0x00000000 // PWM Master Control register +#define PWM_O_SYNC 0x00000004 // PWM Time Base Sync register +#define PWM_O_ENABLE 0x00000008 // PWM Output Enable register +#define PWM_O_INVERT 0x0000000C // PWM Output Inversion register +#define PWM_O_FAULT 0x00000010 // PWM Output Fault register +#define PWM_O_INTEN 0x00000014 // PWM Interrupt Enable register +#define PWM_O_RIS 0x00000018 // PWM Interrupt Raw Status reg. +#define PWM_O_ISC 0x0000001C // PWM Interrupt Status register +#define PWM_O_STATUS 0x00000020 // PWM Status register + +//***************************************************************************** +// +// The following define the bit fields in the PWM Master Control register. +// +//***************************************************************************** +#define PWM_CTL_GLOBAL_SYNC2 0x00000004 // Global sync generator 2 +#define PWM_CTL_GLOBAL_SYNC1 0x00000002 // Global sync generator 1 +#define PWM_CTL_GLOBAL_SYNC0 0x00000001 // Global sync generator 0 + +//***************************************************************************** +// +// The following define the bit fields in the PWM Time Base Sync register. +// +//***************************************************************************** +#define PWM_SYNC_SYNC2 0x00000004 // Reset generator 2 counter +#define PWM_SYNC_SYNC1 0x00000002 // Reset generator 1 counter +#define PWM_SYNC_SYNC0 0x00000001 // Reset generator 0 counter + +//***************************************************************************** +// +// The following define the bit fields in the PWM Output Enable register. +// +//***************************************************************************** +#define PWM_ENABLE_PWM5EN 0x00000020 // PWM5 pin enable +#define PWM_ENABLE_PWM4EN 0x00000010 // PWM4 pin enable +#define PWM_ENABLE_PWM3EN 0x00000008 // PWM3 pin enable +#define PWM_ENABLE_PWM2EN 0x00000004 // PWM2 pin enable +#define PWM_ENABLE_PWM1EN 0x00000002 // PWM1 pin enable +#define PWM_ENABLE_PWM0EN 0x00000001 // PWM0 pin enable + +//***************************************************************************** +// +// The following define the bit fields in the PWM Inversion register. +// +//***************************************************************************** +#define PWM_INVERT_PWM5INV 0x00000020 // PWM5 pin invert +#define PWM_INVERT_PWM4INV 0x00000010 // PWM4 pin invert +#define PWM_INVERT_PWM3INV 0x00000008 // PWM3 pin invert +#define PWM_INVERT_PWM2INV 0x00000004 // PWM2 pin invert +#define PWM_INVERT_PWM1INV 0x00000002 // PWM1 pin invert +#define PWM_INVERT_PWM0INV 0x00000001 // PWM0 pin invert + +//***************************************************************************** +// +// The following define the bit fields in the PWM Fault register. +// +//***************************************************************************** +#define PWM_FAULT_FAULT5 0x00000020 // PWM5 pin fault +#define PWM_FAULT_FAULT4 0x00000010 // PWM5 pin fault +#define PWM_FAULT_FAULT3 0x00000008 // PWM5 pin fault +#define PWM_FAULT_FAULT2 0x00000004 // PWM5 pin fault +#define PWM_FAULT_FAULT1 0x00000002 // PWM5 pin fault +#define PWM_FAULT_FAULT0 0x00000001 // PWM5 pin fault + +//***************************************************************************** +// +// PWM Interrupt Register bit definitions. +// +//***************************************************************************** +#define PWM_INT_INTFAULT 0x00010000 // Fault interrupt pending + +//***************************************************************************** +// +// The following define the bit fields in the PWM Status register. +// +//***************************************************************************** +#define PWM_STATUS_FAULT 0x00000001 // Fault status + +//***************************************************************************** +// +// PWM Generator standard offsets. +// +//***************************************************************************** +#define PWM_GEN_0_OFFSET 0x00000040 // PWM0 base +#define PWM_GEN_1_OFFSET 0x00000080 // PWM1 base +#define PWM_GEN_2_OFFSET 0x000000C0 // PWM2 base + +#define PWM_O_X_CTL 0x00000000 // Gen Control Reg +#define PWM_O_X_INTEN 0x00000004 // Gen Int/Trig Enable Reg +#define PWM_O_X_RIS 0x00000008 // Gen Raw Int Status Reg +#define PWM_O_X_ISC 0x0000000C // Gen Int Status Reg +#define PWM_O_X_LOAD 0x00000010 // Gen Load Reg +#define PWM_O_X_COUNT 0x00000014 // Gen Counter Reg +#define PWM_O_X_CMPA 0x00000018 // Gen Compare A Reg +#define PWM_O_X_CMPB 0x0000001C // Gen Compare B Reg +#define PWM_O_X_GENA 0x00000020 // Gen Generator A Ctrl Reg +#define PWM_O_X_GENB 0x00000024 // Gen Generator B Ctrl Reg +#define PWM_O_X_DBCTL 0x00000028 // Gen Dead Band Ctrl Reg +#define PWM_O_X_DBRISE 0x0000002C // Gen DB Rising Edge Delay Reg +#define PWM_O_X_DBFALL 0x00000030 // Gen DB Falling Edge Delay Reg + +//***************************************************************************** +// +// PWM_X Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_CTL_ENABLE 0x00000001 // Master enable for gen block +#define PWM_X_CTL_MODE 0x00000002 // Counter mode, down or up/down +#define PWM_X_CTL_DEBUG 0x00000004 // Debug mode +#define PWM_X_CTL_LOADUPD 0x00000008 // Update mode for the load reg +#define PWM_X_CTL_CMPAUPD 0x00000010 // Update mode for comp A reg +#define PWM_X_CTL_CMPBUPD 0x00000020 // Update mode for comp B reg + +//***************************************************************************** +// +// PWM_X Interrupt/Trigger Enable Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INTEN_INTCNTZERO 0x00000001 // Int if COUNT = 0 +#define PWM_X_INTEN_INTCNTLOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_X_INTEN_INTCMPAU 0x00000004 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPAD 0x00000008 // Int if COUNT = CMPA D +#define PWM_X_INTEN_INTCMPBU 0x00000010 // Int if COUNT = CMPA U +#define PWM_X_INTEN_INTCMPBD 0x00000020 // Int if COUNT = CMPA D +#define PWM_X_INTEN_TRCNTZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_X_INTEN_TRCNTLOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_X_INTEN_TRCMPAU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPAD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_X_INTEN_TRCMPBU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_X_INTEN_TRCMPBD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// PWM_X Raw Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_RIS_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 int +#define PWM_X_RIS_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD int +#define PWM_X_RIS_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U int +#define PWM_X_RIS_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D int +#define PWM_X_RIS_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U int +#define PWM_X_RIS_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D int + +//***************************************************************************** +// +// PWM_X Interrupt Status Register bit definitions. +// +//***************************************************************************** +#define PWM_X_INT_INTCNTZERO 0x00000001 // PWM_X_COUNT = 0 received +#define PWM_X_INT_INTCNTLOAD 0x00000002 // PWM_X_COUNT = PWM_X_LOAD rcvd +#define PWM_X_INT_INTCMPAU 0x00000004 // PWM_X_COUNT = PWM_X_CMPA U rcvd +#define PWM_X_INT_INTCMPAD 0x00000008 // PWM_X_COUNT = PWM_X_CMPA D rcvd +#define PWM_X_INT_INTCMPBU 0x00000010 // PWM_X_COUNT = PWM_X_CMPB U rcvd +#define PWM_X_INT_INTCMPBD 0x00000020 // PWM_X_COUNT = PWM_X_CMPB D rcvd + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register bit definitions. +// +//***************************************************************************** +#define PWM_X_GEN_Y_ACTZERO 0x00000003 // Act PWM_X_COUNT = 0 +#define PWM_X_GEN_Y_ACTLOAD 0x0000000C // Act PWM_X_COUNT = PWM_X_LOAD +#define PWM_X_GEN_Y_ACTCMPAU 0x00000030 // Act PWM_X_COUNT = PWM_X_CMPA U +#define PWM_X_GEN_Y_ACTCMPAD 0x000000C0 // Act PWM_X_COUNT = PWM_X_CMPA D +#define PWM_X_GEN_Y_ACTCMPBU 0x00000300 // Act PWM_X_COUNT = PWM_X_CMPB U +#define PWM_X_GEN_Y_ACTCMPBD 0x00000C00 // Act PWM_X_COUNT = PWM_X_CMPB D + +//***************************************************************************** +// +// PWM_X Generator A/B Control Register action definitions. +// +//***************************************************************************** +#define PWM_GEN_ACT_NONE 0x0 // Do nothing +#define PWM_GEN_ACT_INV 0x1 // Invert the output signal +#define PWM_GEN_ACT_ZERO 0x2 // Set the output signal to zero +#define PWM_GEN_ACT_ONE 0x3 // Set the output signal to one +#define PWM_GEN_ACT_ZERO_SHIFT 0 // Shift amount for the zero action +#define PWM_GEN_ACT_LOAD_SHIFT 2 // Shift amount for the load action +#define PWM_GEN_ACT_A_UP_SHIFT 4 // Shift amount for the A up action +#define PWM_GEN_ACT_A_DN_SHIFT 6 // Shift amount for the A dn action +#define PWM_GEN_ACT_B_UP_SHIFT 8 // Shift amount for the B up action +#define PWM_GEN_ACT_B_DN_SHIFT 10 // Shift amount for the B dn action + +//***************************************************************************** +// +// PWM_X Dead Band Control Register bit definitions. +// +//***************************************************************************** +#define PWM_DBCTL_ENABLE 0x00000001 // Enable dead band insertion + +//***************************************************************************** +// +// PWM Register reset values. +// +//***************************************************************************** +#define PWM_RV_CTL 0x00000000 // Master control of the PWM module +#define PWM_RV_SYNC 0x00000000 // Counter synch for PWM generators +#define PWM_RV_ENABLE 0x00000000 // Master enable for the PWM + // output pins +#define PWM_RV_INVERT 0x00000000 // Inversion control for + // PWM output pins +#define PWM_RV_FAULT 0x00000000 // Fault handling for the PWM + // output pins +#define PWM_RV_INTEN 0x00000000 // Interrupt enable +#define PWM_RV_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_STATUS 0x00000000 // Status +#define PWM_RV_X_CTL 0x00000000 // Master control of the PWM + // generator block +#define PWM_RV_X_INTEN 0x00000000 // Interrupt and trigger enable +#define PWM_RV_X_RIS 0x00000000 // Raw interrupt status +#define PWM_RV_X_ISC 0x00000000 // Interrupt status and clearing +#define PWM_RV_X_LOAD 0x00000000 // The load value for the counter +#define PWM_RV_X_COUNT 0x00000000 // The current counter value +#define PWM_RV_X_CMPA 0x00000000 // The comparator A value +#define PWM_RV_X_CMPB 0x00000000 // The comparator B value +#define PWM_RV_X_GENA 0x00000000 // Controls PWM generator A +#define PWM_RV_X_GENB 0x00000000 // Controls PWM generator B +#define PWM_RV_X_DBCTL 0x00000000 // Control the dead band generator +#define PWM_RV_X_DBRISE 0x00000000 // The dead band rising edge delay + // count +#define PWM_RV_X_DBFALL 0x00000000 // The dead band falling edge delay + // count + +#endif // __HW_PWM_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_qei.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_qei.h new file mode 100644 index 0000000..64ebcd1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_qei.h @@ -0,0 +1,176 @@ +//***************************************************************************** +// +// hw_qei.h - Macros used when accessing the QEI hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_QEI_H__ +#define __HW_QEI_H__ + +//***************************************************************************** +// +// The following define the offsets of the QEI registers. +// +//***************************************************************************** +#define QEI_O_CTL 0x00000000 // Configuration and control reg. +#define QEI_O_STAT 0x00000004 // Status register +#define QEI_O_POS 0x00000008 // Current position register +#define QEI_O_MAXPOS 0x0000000C // Maximum position register +#define QEI_O_LOAD 0x00000010 // Velocity timer load register +#define QEI_O_TIME 0x00000014 // Velocity timer register +#define QEI_O_COUNT 0x00000018 // Velocity pulse count register +#define QEI_O_SPEED 0x0000001C // Velocity speed register +#define QEI_O_INTEN 0x00000020 // Interrupt enable register +#define QEI_O_RIS 0x00000024 // Raw interrupt status register +#define QEI_O_ISC 0x00000028 // Interrupt status register + +//***************************************************************************** +// +// The following define the bit fields in the QEI_CTL register. +// +//***************************************************************************** +#define QEI_CTL_STALLEN 0x00001000 // Stall enable +#define QEI_CTL_INVI 0x00000800 // Invert Index input +#define QEI_CTL_INVB 0x00000400 // Invert PhB input +#define QEI_CTL_INVA 0x00000200 // Invert PhA input +#define QEI_CTL_VELDIV_M 0x000001C0 // Velocity predivider mask +#define QEI_CTL_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_CTL_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_CTL_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_CTL_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_CTL_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_CTL_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_CTL_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_CTL_VELDIV_128 0x000001C0 // Predivide by 128 +#define QEI_CTL_VELEN 0x00000020 // Velocity enable +#define QEI_CTL_RESMODE 0x00000010 // Position counter reset mode +#define QEI_CTL_CAPMODE 0x00000008 // Edge capture mode +#define QEI_CTL_SIGMODE 0x00000004 // Encoder signaling mode +#define QEI_CTL_SWAP 0x00000002 // Swap input signals +#define QEI_CTL_ENABLE 0x00000001 // QEI enable + +//***************************************************************************** +// +// The following define the bit fields in the QEI_STAT register. +// +//***************************************************************************** +#define QEI_STAT_DIRECTION 0x00000002 // Direction of rotation +#define QEI_STAT_ERROR 0x00000001 // Signalling error detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_POS register. +// +//***************************************************************************** +#define QEI_POS_M 0xFFFFFFFF // Current encoder position +#define QEI_POS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_MAXPOS register. +// +//***************************************************************************** +#define QEI_MAXPOS_M 0xFFFFFFFF // Maximum encoder position +#define QEI_MAXPOS_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_LOAD register. +// +//***************************************************************************** +#define QEI_LOAD_M 0xFFFFFFFF // Velocity timer load value +#define QEI_LOAD_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_TIME register. +// +//***************************************************************************** +#define QEI_TIME_M 0xFFFFFFFF // Velocity timer current value +#define QEI_TIME_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_COUNT register. +// +//***************************************************************************** +#define QEI_COUNT_M 0xFFFFFFFF // Encoder running pulse count +#define QEI_COUNT_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_SPEED register. +// +//***************************************************************************** +#define QEI_SPEED_M 0xFFFFFFFF // Encoder pulse count +#define QEI_SPEED_S 0 + +//***************************************************************************** +// +// The following define the bit fields in the QEI_INTEN register. +// +//***************************************************************************** +#define QEI_INTEN_ERROR 0x00000008 // Phase error detected +#define QEI_INTEN_DIR 0x00000004 // Direction change +#define QEI_INTEN_TIMER 0x00000002 // Velocity timer expired +#define QEI_INTEN_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_RIS register. +// +//***************************************************************************** +#define QEI_RIS_ERROR 0x00000008 // Phase error detected +#define QEI_RIS_DIR 0x00000004 // Direction change +#define QEI_RIS_TIMER 0x00000002 // Velocity timer expired +#define QEI_RIS_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the bit fields in the QEI_ISC register. +// +//***************************************************************************** +#define QEI_INT_ERROR 0x00000008 // Phase error detected +#define QEI_INT_DIR 0x00000004 // Direction change +#define QEI_INT_TIMER 0x00000002 // Velocity timer expired +#define QEI_INT_INDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// The following define the reset values for the QEI registers. +// +//***************************************************************************** +#define QEI_RV_CTL 0x00000000 // Configuration and control reg. +#define QEI_RV_STAT 0x00000000 // Status register +#define QEI_RV_POS 0x00000000 // Current position register +#define QEI_RV_MAXPOS 0x00000000 // Maximum position register +#define QEI_RV_LOAD 0x00000000 // Velocity timer load register +#define QEI_RV_TIME 0x00000000 // Velocity timer register +#define QEI_RV_COUNT 0x00000000 // Velocity pulse count register +#define QEI_RV_SPEED 0x00000000 // Velocity speed register +#define QEI_RV_INTEN 0x00000000 // Interrupt enable register +#define QEI_RV_RIS 0x00000000 // Raw interrupt status register +#define QEI_RV_ISC 0x00000000 // Interrupt status register + +#endif // __HW_QEI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_ssi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_ssi.h new file mode 100644 index 0000000..9ebf627 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_ssi.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// hw_ssi.h - Macros used when accessing the SSI hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SSI_H__ +#define __HW_SSI_H__ + +//***************************************************************************** +// +// The following define the offsets of the SSI registers. +// +//***************************************************************************** +#define SSI_O_CR0 0x00000000 // Control register 0 +#define SSI_O_CR1 0x00000004 // Control register 1 +#define SSI_O_DR 0x00000008 // Data register +#define SSI_O_SR 0x0000000C // Status register +#define SSI_O_CPSR 0x00000010 // Clock prescale register +#define SSI_O_IM 0x00000014 // Int mask set and clear register +#define SSI_O_RIS 0x00000018 // Raw interrupt register +#define SSI_O_MIS 0x0000001C // Masked interrupt register +#define SSI_O_ICR 0x00000020 // Interrupt clear register + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 0. +// +//***************************************************************************** +#define SSI_CR0_SCR 0x0000FF00 // Serial clock rate +#define SSI_CR0_SPH 0x00000080 // SSPCLKOUT phase +#define SSI_CR0_SPO 0x00000040 // SSPCLKOUT polarity +#define SSI_CR0_FRF_MASK 0x00000030 // Frame format mask +#define SSI_CR0_FRF_MOTO 0x00000000 // Motorola SPI frame format +#define SSI_CR0_FRF_TI 0x00000010 // TI sync serial frame format +#define SSI_CR0_FRF_NMW 0x00000020 // National Microwire frame format +#define SSI_CR0_DSS 0x0000000F // Data size select +#define SSI_CR0_DSS_4 0x00000003 // 4 bit data +#define SSI_CR0_DSS_5 0x00000004 // 5 bit data +#define SSI_CR0_DSS_6 0x00000005 // 6 bit data +#define SSI_CR0_DSS_7 0x00000006 // 7 bit data +#define SSI_CR0_DSS_8 0x00000007 // 8 bit data +#define SSI_CR0_DSS_9 0x00000008 // 9 bit data +#define SSI_CR0_DSS_10 0x00000009 // 10 bit data +#define SSI_CR0_DSS_11 0x0000000A // 11 bit data +#define SSI_CR0_DSS_12 0x0000000B // 12 bit data +#define SSI_CR0_DSS_13 0x0000000C // 13 bit data +#define SSI_CR0_DSS_14 0x0000000D // 14 bit data +#define SSI_CR0_DSS_15 0x0000000E // 15 bit data +#define SSI_CR0_DSS_16 0x0000000F // 16 bit data + +//***************************************************************************** +// +// The following define the bit fields in the SSI Control register 1. +// +//***************************************************************************** +#define SSI_CR1_SOD 0x00000008 // Slave mode output disable +#define SSI_CR1_MS 0x00000004 // Master or slave mode select +#define SSI_CR1_SSE 0x00000002 // Sync serial port enable +#define SSI_CR1_LBM 0x00000001 // Loopback mode + +//***************************************************************************** +// +// The following define the bit fields in the SSI Status register. +// +//***************************************************************************** +#define SSI_SR_BSY 0x00000010 // SSI busy +#define SSI_SR_RFF 0x00000008 // RX FIFO full +#define SSI_SR_RNE 0x00000004 // RX FIFO not empty +#define SSI_SR_TNF 0x00000002 // TX FIFO not full +#define SSI_SR_TFE 0x00000001 // TX FIFO empty + +//***************************************************************************** +// +// The following define the bit fields in the SSI clock prescale register. +// +//***************************************************************************** +#define SSI_CPSR_CPSDVSR_MASK 0x000000FF // Clock prescale + +//***************************************************************************** +// +// The following define information concerning the SSI Data register. +// +//***************************************************************************** +#define TX_FIFO_SIZE (8) // Number of entries in the TX FIFO +#define RX_FIFO_SIZE (8) // Number of entries in the RX FIFO + +//***************************************************************************** +// +// The following define the bit fields in the interrupt mask set and clear, +// raw interrupt, masked interrupt, and interrupt clear registers. +// +//***************************************************************************** +#define SSI_INT_TXFF 0x00000008 // TX FIFO interrupt +#define SSI_INT_RXFF 0x00000004 // RX FIFO interrupt +#define SSI_INT_RXTO 0x00000002 // RX timeout interrupt +#define SSI_INT_RXOR 0x00000001 // RX overrun interrupt + +#endif // __HW_SSI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_sysctl.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_sysctl.h new file mode 100644 index 0000000..fbc6982 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_sysctl.h @@ -0,0 +1,409 @@ +//***************************************************************************** +// +// hw_sysctl.h - Macros used when accessing the system control hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_SYSCTL_H__ +#define __HW_SYSCTL_H__ + +//***************************************************************************** +// +// The following define the offsets of the system control registers. +// +//***************************************************************************** +#define SYSCTL_DID0 0x400fe000 // Device identification register 0 +#define SYSCTL_DID1 0x400fe004 // Device identification register 1 +#define SYSCTL_DC0 0x400fe008 // Device capabilities register 0 +#define SYSCTL_DC1 0x400fe010 // Device capabilities register 1 +#define SYSCTL_DC2 0x400fe014 // Device capabilities register 2 +#define SYSCTL_DC3 0x400fe018 // Device capabilities register 3 +#define SYSCTL_DC4 0x400fe01C // Device capabilities register 4 +#define SYSCTL_PBORCTL 0x400fe030 // POR/BOR reset control register +#define SYSCTL_LDOPCTL 0x400fe034 // LDO power control register +#define SYSCTL_SRCR0 0x400fe040 // Software reset control reg 0 +#define SYSCTL_SRCR1 0x400fe044 // Software reset control reg 1 +#define SYSCTL_SRCR2 0x400fe048 // Software reset control reg 2 +#define SYSCTL_RIS 0x400fe050 // Raw interrupt status register +#define SYSCTL_IMC 0x400fe054 // Interrupt mask/control register +#define SYSCTL_MISC 0x400fe058 // Interrupt status register +#define SYSCTL_RESC 0x400fe05c // Reset cause register +#define SYSCTL_RCC 0x400fe060 // Run-mode clock config register +#define SYSCTL_PLLCFG 0x400fe064 // PLL configuration register +#define SYSCTL_RCGC0 0x400fe100 // Run-mode clock gating register 0 +#define SYSCTL_RCGC1 0x400fe104 // Run-mode clock gating register 1 +#define SYSCTL_RCGC2 0x400fe108 // Run-mode clock gating register 2 +#define SYSCTL_SCGC0 0x400fe110 // Sleep-mode clock gating reg 0 +#define SYSCTL_SCGC1 0x400fe114 // Sleep-mode clock gating reg 1 +#define SYSCTL_SCGC2 0x400fe118 // Sleep-mode clock gating reg 2 +#define SYSCTL_DCGC0 0x400fe120 // Deep Sleep-mode clock gate reg 0 +#define SYSCTL_DCGC1 0x400fe124 // Deep Sleep-mode clock gate reg 1 +#define SYSCTL_DCGC2 0x400fe128 // Deep Sleep-mode clock gate reg 2 +#define SYSCTL_CLKVCLR 0x400fe150 // Clock verifcation clear register +#define SYSCTL_LDOARST 0x400fe160 // LDO reset control register + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID0 register. +// +//***************************************************************************** +#define SYSCTL_DID0_VER_MASK 0x70000000 // DID0 version mask +#define SYSCTL_DID0_VER_0 0x00000000 // DID0 version 0 +#define SYSCTL_DID0_MAJ_MASK 0x0000FF00 // Major revision mask +#define SYSCTL_DID0_MAJ_A 0x00000000 // Major revision A +#define SYSCTL_DID0_MAJ_B 0x00000100 // Major revision B +#define SYSCTL_DID0_MIN_MASK 0x000000FF // Minor revision mask +#define SYSCTL_DID0_MIN_0 0x00000000 // Minor revision 0 +#define SYSCTL_DID0_MIN_1 0x00000001 // Minor revision 1 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DID1 register. +// +//***************************************************************************** +#define SYSCTL_DID1_VER_MASK 0xF0000000 // Register version mask +#define SYSCTL_DID1_FAM_MASK 0x0F000000 // Family mask +#define SYSCTL_DID1_FAM_S 0x00000000 // Stellaris family +#define SYSCTL_DID1_PRTNO_MASK 0x00FF0000 // Part number mask +#define SYSCTL_DID1_PRTNO_101 0x00010000 // LM3S101 +#define SYSCTL_DID1_PRTNO_102 0x00020000 // LM3S102 +#define SYSCTL_DID1_PRTNO_301 0x00110000 // LM3S301 +#define SYSCTL_DID1_PRTNO_310 0x00120000 // LM3S310 +#define SYSCTL_DID1_PRTNO_315 0x00130000 // LM3S315 +#define SYSCTL_DID1_PRTNO_316 0x00140000 // LM3S316 +#define SYSCTL_DID1_PRTNO_328 0x00150000 // LM3S328 +#define SYSCTL_DID1_PRTNO_601 0x00210000 // LM3S601 +#define SYSCTL_DID1_PRTNO_610 0x00220000 // LM3S610 +#define SYSCTL_DID1_PRTNO_611 0x00230000 // LM3S611 +#define SYSCTL_DID1_PRTNO_612 0x00240000 // LM3S612 +#define SYSCTL_DID1_PRTNO_613 0x00250000 // LM3S613 +#define SYSCTL_DID1_PRTNO_615 0x00260000 // LM3S615 +#define SYSCTL_DID1_PRTNO_628 0x00270000 // LM3S628 +#define SYSCTL_DID1_PRTNO_801 0x00310000 // LM3S801 +#define SYSCTL_DID1_PRTNO_811 0x00320000 // LM3S811 +#define SYSCTL_DID1_PRTNO_812 0x00330000 // LM3S812 +#define SYSCTL_DID1_PRTNO_815 0x00340000 // LM3S815 +#define SYSCTL_DID1_PRTNO_828 0x00350000 // LM3S828 +#define SYSCTL_DID1_TEMP_MASK 0x000000E0 // Temperature range mask +#define SYSCTL_DID1_TEMP_C 0x00000000 // Commercial temp range (0..70C) +#define SYSCTL_DID1_TEMP_I 0x00000020 // Industrial temp range (-40..85C) +#define SYSCTL_DID1_PKG_MASK 0x00000018 // Package mask +#define SYSCTL_DID1_PKG_28SOIC 0x00000000 // 28-pin SOIC +#define SYSCTL_DID1_PKG_48QFP 0x00000008 // 48-pin QFP +#define SYSCTL_DID1_ROHS 0x00000004 // Part is RoHS compliant +#define SYSCTL_DID1_QUAL_MASK 0x00000003 // Qualification status mask +#define SYSCTL_DID1_QUAL_ES 0x00000000 // Engineering sample (unqualified) +#define SYSCTL_DID1_QUAL_PP 0x00000001 // Pilot production (unqualified) +#define SYSCTL_DID1_QUAL_FQ 0x00000002 // Fully qualified +#define SYSCTL_DID1_PRTNO_SHIFT 16 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC0 register. +// +//***************************************************************************** +#define SYSCTL_DC0_SRAMSZ_MASK 0xFFFF0000 // SRAM size mask +#define SYSCTL_DC0_SRAMSZ_2KB 0x00070000 // 2kB of SRAM +#define SYSCTL_DC0_SRAMSZ_4KB 0x000F0000 // 4kB of SRAM +#define SYSCTL_DC0_SRAMSZ_8KB 0x001F0000 // 8kB of SRAM +#define SYSCTL_DC0_FLASHSZ_MASK 0x0000FFFF // Flash size mask +#define SYSCTL_DC0_FLASHSZ_8KB 0x00000003 // 8kB of flash +#define SYSCTL_DC0_FLASHSZ_16KB 0x00000007 // 16kB of flash +#define SYSCTL_DC0_FLASHSZ_32KB 0x0000000F // 32kB of flash +#define SYSCTL_DC0_FLASHSZ_64KB 0x0000001F // 64kB of flash + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC1 register. +// +//***************************************************************************** +#define SYSCTL_DC1_PWM 0x00100000 // PWM module present +#define SYSCTL_DC1_ADC 0x00010000 // ADC module present +#define SYSCTL_DC1_SYSDIV_MASK 0x0000F000 // Minimum system divider mask +#define SYSCTL_DC1_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_DC1_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_DC1_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_DC1_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_DC1_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_DC1_MPU 0x00000080 // Cortex-M3 MPU present +#define SYSCTL_DC1_TEMP 0x00000020 // Temperature sensor present +#define SYSCTL_DC1_PLL 0x00000010 // PLL present +#define SYSCTL_DC1_WDOG 0x00000008 // Watchdog present +#define SYSCTL_DC1_SWO 0x00000004 // Serial wire output present +#define SYSCTL_DC1_SWD 0x00000002 // Serial wire debug present +#define SYSCTL_DC1_JTAG 0x00000001 // JTAG debug present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC2 register. +// +//***************************************************************************** +#define SYSCTL_DC2_COMP2 0x04000000 // Analog comparator 2 present +#define SYSCTL_DC2_COMP1 0x02000000 // Analog comparator 1 present +#define SYSCTL_DC2_COMP0 0x01000000 // Analog comparator 0 present +#define SYSCTL_DC2_TIMER2 0x00040000 // Timer 2 present +#define SYSCTL_DC2_TIMER1 0x00020000 // Timer 1 present +#define SYSCTL_DC2_TIMER0 0x00010000 // Timer 0 present +#define SYSCTL_DC2_I2C 0x00001000 // I2C present +#define SYSCTL_DC2_QEI 0x00000100 // QEI present +#define SYSCTL_DC2_SSI 0x00000010 // SSI present +#define SYSCTL_DC2_UART1 0x00000002 // UART 1 present +#define SYSCTL_DC2_UART0 0x00000001 // UART 0 present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC3 register. +// +//***************************************************************************** +#define SYSCTL_DC3_32KHZ 0x80000000 // 32kHz pin present +#define SYSCTL_DC3_CCP5 0x20000000 // CCP5 pin present +#define SYSCTL_DC3_CCP4 0x10000000 // CCP4 pin present +#define SYSCTL_DC3_CCP3 0x08000000 // CCP3 pin present +#define SYSCTL_DC3_CCP2 0x04000000 // CCP2 pin present +#define SYSCTL_DC3_CCP1 0x02000000 // CCP1 pin present +#define SYSCTL_DC3_CCP0 0x01000000 // CCP0 pin present +#define SYSCTL_DC3_ADC7 0x00800000 // ADC7 pin present +#define SYSCTL_DC3_ADC6 0x00400000 // ADC6 pin present +#define SYSCTL_DC3_ADC5 0x00200000 // ADC5 pin present +#define SYSCTL_DC3_ADC4 0x00100000 // ADC4 pin present +#define SYSCTL_DC3_ADC3 0x00080000 // ADC3 pin present +#define SYSCTL_DC3_ADC2 0x00040000 // ADC2 pin present +#define SYSCTL_DC3_ADC1 0x00020000 // ADC1 pin present +#define SYSCTL_DC3_ADC0 0x00010000 // ADC0 pin present +#define SYSCTL_DC3_C2O 0x00004000 // C2o pin present +#define SYSCTL_DC3_C2PLUS 0x00002000 // C2+ pin present +#define SYSCTL_DC3_C2MINUS 0x00001000 // C2- pin present +#define SYSCTL_DC3_C1O 0x00000800 // C1o pin present +#define SYSCTL_DC3_C1PLUS 0x00000400 // C1+ pin present +#define SYSCTL_DC3_C1MINUS 0x00000200 // C1- pin present +#define SYSCTL_DC3_C0O 0x00000100 // C0o pin present +#define SYSCTL_DC3_C0PLUS 0x00000080 // C0+ pin present +#define SYSCTL_DC3_C0MINUS 0x00000040 // C0- pin present +#define SYSCTL_DC3_PWM5 0x00000020 // PWM5 pin present +#define SYSCTL_DC3_PWM4 0x00000010 // PWM4 pin present +#define SYSCTL_DC3_PWM3 0x00000008 // PWM3 pin present +#define SYSCTL_DC3_PWM2 0x00000004 // PWM2 pin present +#define SYSCTL_DC3_PWM1 0x00000002 // PWM1 pin present +#define SYSCTL_DC3_PWM0 0x00000001 // PWM0 pin present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_DC4 register. +// +//***************************************************************************** +#define SYSCTL_DC4_GPIOE 0x00000010 // GPIO port E present +#define SYSCTL_DC4_GPIOD 0x00000008 // GPIO port D present +#define SYSCTL_DC4_GPIOC 0x00000004 // GPIO port C present +#define SYSCTL_DC4_GPIOB 0x00000002 // GPIO port B present +#define SYSCTL_DC4_GPIOA 0x00000001 // GPIO port A present + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PBORCTL register. +// +//***************************************************************************** +#define SYSCTL_PBORCTL_BOR_MASK 0x0000FFFC // BOR wait timer +#define SYSCTL_PBORCTL_BORIOR 0x00000002 // BOR interrupt or reset +#define SYSCTL_PBORCTL_BORWT 0x00000001 // BOR wait and check for noise +#define SYSCTL_PBORCTL_BOR_SH 2 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOPCTL register. +// +//***************************************************************************** +#define SYSCTL_LDOPCTL_MASK 0x0000003F // Voltage adjust mask +#define SYSCTL_LDOPCTL_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDOPCTL_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDOPCTL_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDOPCTL_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDOPCTL_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDOPCTL_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDOPCTL_2_55V 0x0000001F // LDO output of 2.55V +#define SYSCTL_LDOPCTL_2_60V 0x0000001E // LDO output of 2.60V +#define SYSCTL_LDOPCTL_2_65V 0x0000001D // LDO output of 2.65V +#define SYSCTL_LDOPCTL_2_70V 0x0000001C // LDO output of 2.70V +#define SYSCTL_LDOPCTL_2_75V 0x0000001B // LDO output of 2.75V + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR0, SYSCTL_RCGC0, +// SYSCTL_SCGC0, and SYSCTL_DCGC0 registers. +// +//***************************************************************************** +#define SYSCTL_SET0_PWM 0x00100000 // PWM module +#define SYSCTL_SET0_ADC 0x00010000 // ADC module +#define SYSCTL_SET0_ADCSPD_MASK 0x00000F00 // ADC speed mask +#define SYSCTL_SET0_ADCSPD_1M 0x00000300 // 1Msps ADC +#define SYSCTL_SET0_ADCSPD_500K 0x00000200 // 500Ksps ADC +#define SYSCTL_SET0_ADCSPD_250K 0x00000100 // 250Ksps ADC +#define SYSCTL_SET0_ADCSPD_125K 0x00000000 // 125Ksps ADC +#define SYSCTL_SET0_WDOG 0x00000008 // Watchdog module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR1, SYSCTL_RCGC1, +// SYSCTL_SCGC1, and SYSCTL_DCGC1 registers. +// +//***************************************************************************** +#define SYSCTL_SET1_COMP2 0x04000000 // Analog comparator module 2 +#define SYSCTL_SET1_COMP1 0x02000000 // Analog comparator module 1 +#define SYSCTL_SET1_COMP0 0x01000000 // Analog comparator module 0 +#define SYSCTL_SET1_TIMER2 0x00040000 // Timer module 2 +#define SYSCTL_SET1_TIMER1 0x00020000 // Timer module 1 +#define SYSCTL_SET1_TIMER0 0x00010000 // Timer module 0 +#define SYSCTL_SET1_I2C 0x00001000 // I2C module +#define SYSCTL_SET1_QEI 0x00000100 // QEI module +#define SYSCTL_SET1_SSI 0x00000010 // SSI module +#define SYSCTL_SET1_UART1 0x00000002 // UART module 1 +#define SYSCTL_SET1_UART0 0x00000001 // UART module 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_SRCR2, SYSCTL_RCGC2, +// SYSCTL_SCGC2, and SYSCTL_DCGC2 registers. +// +//***************************************************************************** +#define SYSCTL_SET2_GPIOE 0x00000010 // GPIO E module +#define SYSCTL_SET2_GPIOD 0x00000008 // GPIO D module +#define SYSCTL_SET2_GPIOC 0x00000004 // GPIO C module +#define SYSCTL_SET2_GPIOB 0x00000002 // GPIO B module +#define SYSCTL_SET2_GPIOA 0x00000001 // GIPO A module + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RIS, SYSCTL_IMC, and +// SYSCTL_IMS registers. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RESC register. +// +//***************************************************************************** +#define SYSCTL_RESC_LDO 0x00000020 // LDO power OK lost reset +#define SYSCTL_RESC_SW 0x00000010 // Software reset +#define SYSCTL_RESC_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_RESC_BOR 0x00000004 // Brown-out reset +#define SYSCTL_RESC_POR 0x00000002 // Power on reset +#define SYSCTL_RESC_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_RCC register. +// +//***************************************************************************** +#define SYSCTL_RCC_ACG 0x08000000 // Automatic clock gating +#define SYSCTL_RCC_SYSDIV_MASK 0x07800000 // System clock divider +#define SYSCTL_RCC_SYSDIV_2 0x00800000 // System clock /2 +#define SYSCTL_RCC_SYSDIV_3 0x01000000 // System clock /3 +#define SYSCTL_RCC_SYSDIV_4 0x01800000 // System clock /4 +#define SYSCTL_RCC_SYSDIV_5 0x02000000 // System clock /5 +#define SYSCTL_RCC_SYSDIV_6 0x02800000 // System clock /6 +#define SYSCTL_RCC_SYSDIV_7 0x03000000 // System clock /7 +#define SYSCTL_RCC_SYSDIV_8 0x03800000 // System clock /8 +#define SYSCTL_RCC_SYSDIV_9 0x04000000 // System clock /9 +#define SYSCTL_RCC_SYSDIV_10 0x04800000 // System clock /10 +#define SYSCTL_RCC_SYSDIV_11 0x05000000 // System clock /11 +#define SYSCTL_RCC_SYSDIV_12 0x05800000 // System clock /12 +#define SYSCTL_RCC_SYSDIV_13 0x06000000 // System clock /13 +#define SYSCTL_RCC_SYSDIV_14 0x06800000 // System clock /14 +#define SYSCTL_RCC_SYSDIV_15 0x07000000 // System clock /15 +#define SYSCTL_RCC_SYSDIV_16 0x07800000 // System clock /16 +#define SYSCTL_RCC_USE_SYSDIV 0x00400000 // Use sytem clock divider +#define SYSCTL_RCC_USE_PWMDIV 0x00100000 // Use PWM clock divider +#define SYSCTL_RCC_PWMDIV_MASK 0x000E0000 // PWM clock divider +#define SYSCTL_RCC_PWMDIV_2 0x00000000 // PWM clock /2 +#define SYSCTL_RCC_PWMDIV_4 0x00020000 // PWM clock /4 +#define SYSCTL_RCC_PWMDIV_8 0x00040000 // PWM clock /8 +#define SYSCTL_RCC_PWMDIV_16 0x00060000 // PWM clock /16 +#define SYSCTL_RCC_PWMDIV_32 0x00080000 // PWM clock /32 +#define SYSCTL_RCC_PWMDIV_64 0x000A0000 // PWM clock /64 +#define SYSCTL_RCC_PWRDN 0x00002000 // PLL power down +#define SYSCTL_RCC_OE 0x00001000 // PLL output enable +#define SYSCTL_RCC_BYPASS 0x00000800 // PLL bypass +#define SYSCTL_RCC_PLLVER 0x00000400 // PLL verification timer enable +#define SYSCTL_RCC_XTAL_MASK 0x000003C0 // Crystal attached to main osc +#define SYSCTL_RCC_XTAL_3_57MHZ 0x00000100 // Using a 3.579545MHz crystal +#define SYSCTL_RCC_XTAL_3_68MHz 0x00000140 // Using a 3.6864MHz crystal +#define SYSCTL_RCC_XTAL_4MHz 0x00000180 // Using a 4MHz crystal +#define SYSCTL_RCC_XTAL_4_09MHZ 0x000001C0 // Using a 4.096MHz crystal +#define SYSCTL_RCC_XTAL_4_91MHZ 0x00000200 // Using a 4.9152MHz crystal +#define SYSCTL_RCC_XTAL_5MHZ 0x00000240 // Using a 5MHz crystal +#define SYSCTL_RCC_XTAL_5_12MHZ 0x00000280 // Using a 5.12MHz crystal +#define SYSCTL_RCC_XTAL_6MHZ 0x000002C0 // Using a 6MHz crystal +#define SYSCTL_RCC_XTAL_6_14MHZ 0x00000300 // Using a 6.144MHz crystal +#define SYSCTL_RCC_XTAL_7_37MHZ 0x00000340 // Using a 7.3728MHz crystal +#define SYSCTL_RCC_XTAL_8MHZ 0x00000380 // Using a 8MHz crystal +#define SYSCTL_RCC_XTAL_8_19MHZ 0x000003C0 // Using a 8.192MHz crystal +#define SYSCTL_RCC_OSCSRC_MASK 0x00000030 // Oscillator input select +#define SYSCTL_RCC_OSCSRC_MAIN 0x00000000 // Use the main oscillator +#define SYSCTL_RCC_OSCSRC_INT 0x00000010 // Use the internal oscillator +#define SYSCTL_RCC_OSCSRC_INT4 0x00000020 // Use the internal oscillator / 4 +#define SYSCTL_RCC_IOSCVER 0x00000008 // Int. osc. verification timer en +#define SYSCTL_RCC_MOSCVER 0x00000004 // Main osc. verification timer en +#define SYSCTL_RCC_IOSCDIS 0x00000002 // Internal oscillator disable +#define SYSCTL_RCC_MOSCDIS 0x00000001 // Main oscillator disable +#define SYSCTL_RCC_SYSDIV_SHIFT 23 // Shift to the SYSDIV field +#define SYSCTL_RCC_PWMDIV_SHIFT 17 // Shift to the PWMDIV field +#define SYSCTL_RCC_XTAL_SHIFT 6 // Shift to the XTAL field +#define SYSCTL_RCC_OSCSRC_SHIFT 4 // Shift to the OSCSRC field + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_PLLCFG register. +// +//***************************************************************************** +#define SYSCTL_PLLCFG_OD_MASK 0x0000C000 // Output divider +#define SYSCTL_PLLCFG_OD_1 0x00000000 // Output divider is 1 +#define SYSCTL_PLLCFG_OD_2 0x00004000 // Output divider is 2 +#define SYSCTL_PLLCFG_OD_4 0x00008000 // Output divider is 4 +#define SYSCTL_PLLCFG_F_MASK 0x00003FE0 // PLL multiplier +#define SYSCTL_PLLCFG_R_MASK 0x0000001F // Input predivider +#define SYSCTL_PLLCFG_F_SHIFT 5 +#define SYSCTL_PLLCFG_R_SHIFT 0 + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_CLKVCLR register. +// +//***************************************************************************** +#define SYSCTL_CLKVCLR_CLR 0x00000001 // Clear clock verification fault + +//***************************************************************************** +// +// The following define the bit fields in the SYSCTL_LDOARST register. +// +//***************************************************************************** +#define SYSCTL_LDOARST_ARST 0x00000001 // Allow LDO to reset device + +#endif // __HW_SYSCTL_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_timer.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_timer.h new file mode 100644 index 0000000..6a09cd8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_timer.h @@ -0,0 +1,235 @@ +//***************************************************************************** +// +// hw_timer.h - Defines and macros used when accessing the timer. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TIMER_H__ +#define __HW_TIMER_H__ + +//***************************************************************************** +// +// The following define the offsets of the timer registers. +// +//***************************************************************************** +#define TIMER_O_CFG 0x00000000 // Configuration register +#define TIMER_O_TAMR 0x00000004 // TimerA mode register +#define TIMER_O_TBMR 0x00000008 // TimerB mode register +#define TIMER_O_CTL 0x0000000C // Control register +#define TIMER_O_IMR 0x00000018 // Interrupt mask register +#define TIMER_O_RIS 0x0000001C // Interrupt status register +#define TIMER_O_MIS 0x00000020 // Masked interrupt status reg. +#define TIMER_O_ICR 0x00000024 // Interrupt clear register +#define TIMER_O_TAILR 0x00000028 // TimerA interval load register +#define TIMER_O_TBILR 0x0000002C // TimerB interval load register +#define TIMER_O_TAMATCHR 0x00000030 // TimerA match register +#define TIMER_O_TBMATCHR 0x00000034 // TimerB match register +#define TIMER_O_TAPR 0x00000038 // TimerA prescale register +#define TIMER_O_TBPR 0x0000003C // TimerB prescale register +#define TIMER_O_TAPMR 0x00000040 // TimerA prescale match register +#define TIMER_O_TBPMR 0x00000044 // TimerB prescale match register +#define TIMER_O_TAR 0x00000048 // TimerA register +#define TIMER_O_TBR 0x0000004C // TimerB register + +//***************************************************************************** +// +// The following define the reset values of the timer registers. +// +//***************************************************************************** +#define TIMER_RV_CFG 0x00000000 // Configuration register RV +#define TIMER_RV_TAMR 0x00000000 // TimerA mode register RV +#define TIMER_RV_TBMR 0x00000000 // TimerB mode register RV +#define TIMER_RV_CTL 0x00000000 // Control register RV +#define TIMER_RV_IMR 0x00000000 // Interrupt mask register RV +#define TIMER_RV_RIS 0x00000000 // Interrupt status register RV +#define TIMER_RV_MIS 0x00000000 // Masked interrupt status reg RV +#define TIMER_RV_ICR 0x00000000 // Interrupt clear register RV +#define TIMER_RV_TAILR 0xFFFFFFFF // TimerA interval load reg RV +#define TIMER_RV_TBILR 0x0000FFFF // TimerB interval load reg RV +#define TIMER_RV_TAMATCHR 0xFFFFFFFF // TimerA match register RV +#define TIMER_RV_TBMATCHR 0x0000FFFF // TimerB match register RV +#define TIMER_RV_TAPR 0x00000000 // TimerA prescale register RV +#define TIMER_RV_TBPR 0x00000000 // TimerB prescale register RV +#define TIMER_RV_TAPMR 0x00000000 // TimerA prescale match reg RV +#define TIMER_RV_TBPMR 0x00000000 // TimerB prescale match regi RV +#define TIMER_RV_TAR 0xFFFFFFFF // TimerA register RV +#define TIMER_RV_TBR 0x0000FFFF // TimerB register RV + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CFG register. +// +//***************************************************************************** +#define TIMER_CFG_CFG_MSK 0x00000007 // Configuration options mask +#define TIMER_CFG_16_BIT 0x00000004 // Two 16 bit timers +#define TIMER_CFG_32_BIT_RTC 0x00000001 // 32 bit RTC +#define TIMER_CFG_32_BIT_TIMER 0x00000000 // 32 bit timer + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TnMR register. +// +//***************************************************************************** +#define TIMER_TNMR_TNAMS 0x00000008 // Alternate mode select +#define TIMER_TNMR_TNCMR 0x00000004 // Capture mode - count or time +#define TIMER_TNMR_TNTMR_MSK 0x00000003 // Timer mode mask +#define TIMER_TNMR_TNTMR_CAP 0x00000003 // Mode - capture +#define TIMER_TNMR_TNTMR_PERIOD 0x00000002 // Mode - periodic +#define TIMER_TNMR_TNTMR_1_SHOT 0x00000001 // Mode - one shot + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_CTL register. +// +//***************************************************************************** +#define TIMER_CTL_TBPWML 0x00004000 // TimerB PWM output level invert +#define TIMER_CTL_TBOTE 0x00002000 // TimerB output trigger enable +#define TIMER_CTL_TBEVENT_MSK 0x00000C00 // TimerB event mode mask +#define TIMER_CTL_TBEVENT_BOTH 0x00000C00 // TimerB event mode - both edges +#define TIMER_CTL_TBEVENT_NEG 0x00000400 // TimerB event mode - neg edge +#define TIMER_CTL_TBEVENT_POS 0x00000000 // TimerB event mode - pos edge +#define TIMER_CTL_TBSTALL 0x00000200 // TimerB stall enable +#define TIMER_CTL_TBEN 0x00000100 // TimerB enable +#define TIMER_CTL_TAPWML 0x00000040 // TimerA PWM output level invert +#define TIMER_CTL_TAOTE 0x00000020 // TimerA output trigger enable +#define TIMER_CTL_RTCEN 0x00000010 // RTC counter enable +#define TIMER_CTL_TAEVENT_MSK 0x0000000C // TimerA event mode mask +#define TIMER_CTL_TAEVENT_BOTH 0x0000000C // TimerA event mode - both edges +#define TIMER_CTL_TAEVENT_NEG 0x00000004 // TimerA event mode - neg edge +#define TIMER_CTL_TAEVENT_POS 0x00000000 // TimerA event mode - pos edge +#define TIMER_CTL_TASTALL 0x00000002 // TimerA stall enable +#define TIMER_CTL_TAEN 0x00000001 // TimerA enable + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_IMR register. +// +//***************************************************************************** +#define TIMER_IMR_CBEIM 0x00000400 // CaptureB event interrupt mask +#define TIMER_IMR_CBMIM 0x00000200 // CaptureB match interrupt mask +#define TIMER_IMR_TBTOIM 0x00000100 // TimerB time out interrupt mask +#define TIMER_IMR_RTCIM 0x00000008 // RTC interrupt mask +#define TIMER_IMR_CAEIM 0x00000004 // CaptureA event interrupt mask +#define TIMER_IMR_CAMIM 0x00000002 // CaptureA match interrupt mask +#define TIMER_IMR_TATOIM 0x00000001 // TimerA time out interrupt mask + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_RIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBERIS 0x00000400 // CaptureB event raw int status +#define TIMER_RIS_CBMRIS 0x00000200 // CaptureB match raw int status +#define TIMER_RIS_TBTORIS 0x00000100 // TimerB time out raw int status +#define TIMER_RIS_RTCRIS 0x00000008 // RTC raw int status +#define TIMER_RIS_CAERIS 0x00000004 // CaptureA event raw int status +#define TIMER_RIS_CAMRIS 0x00000002 // CaptureA match raw int status +#define TIMER_RIS_TATORIS 0x00000001 // TimerA time out raw int status + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_MIS register. +// +//***************************************************************************** +#define TIMER_RIS_CBEMIS 0x00000400 // CaptureB event masked int status +#define TIMER_RIS_CBMMIS 0x00000200 // CaptureB match masked int status +#define TIMER_RIS_TBTOMIS 0x00000100 // TimerB time out masked int stat +#define TIMER_RIS_RTCMIS 0x00000008 // RTC masked int status +#define TIMER_RIS_CAEMIS 0x00000004 // CaptureA event masked int status +#define TIMER_RIS_CAMMIS 0x00000002 // CaptureA match masked int status +#define TIMER_RIS_TATOMIS 0x00000001 // TimerA time out masked int stat + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_ICR register. +// +//***************************************************************************** +#define TIMER_ICR_CBECINT 0x00000400 // CaptureB event interrupt clear +#define TIMER_ICR_CBMCINT 0x00000200 // CaptureB match interrupt clear +#define TIMER_ICR_TBTOCINT 0x00000100 // TimerB time out interrupt clear +#define TIMER_ICR_RTCCINT 0x00000008 // RTC interrupt clear +#define TIMER_ICR_CAECINT 0x00000004 // CaptureA event interrupt clear +#define TIMER_ICR_CAMCINT 0x00000002 // CaptureA match interrupt clear +#define TIMER_ICR_TATOCINT 0x00000001 // TimerA time out interrupt clear + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAILR register. +// +//***************************************************************************** +#define TIMER_TAILR_TAILRH 0xFFFF0000 // TimerB load val in 32 bit mode +#define TIMER_TAILR_TAILRL 0x0000FFFF // TimerA interval load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBILR register. +// +//***************************************************************************** +#define TIMER_TBILR_TBILRL 0x0000FFFF // TimerB interval load value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAMATCHR register. +// +//***************************************************************************** +#define TIMER_TAMATCHR_TAMRH 0xFFFF0000 // TimerB match val in 32 bit mode +#define TIMER_TAMATCHR_TAMRL 0x0000FFFF // TimerA match value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBMATCHR register. +// +//***************************************************************************** +#define TIMER_TBMATCHR_TBMRL 0x0000FFFF // TimerB match load value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPR register. +// +//***************************************************************************** +#define TIMER_TNPR_TNPSR 0x000000FF // TimerN prescale value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TnPMR register. +// +//***************************************************************************** +#define TIMER_TNPMR_TNPSMR 0x000000FF // TimerN prescale match value + +//***************************************************************************** +// +// The following define the bit fields in the TIMER_TAR register. +// +//***************************************************************************** +#define TIMER_TAR_TARH 0xFFFF0000 // TimerB val in 32 bit mode +#define TIMER_TAR_TARL 0x0000FFFF // TimerA value + +//***************************************************************************** +// +// The following defines the bit fields in the TIMER_TBR register. +// +//***************************************************************************** +#define TIMER_TBR_TBRL 0x0000FFFF // TimerB value + +#endif // __HW_TIMER_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_types.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_types.h new file mode 100644 index 0000000..0a6084a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_types.h @@ -0,0 +1,67 @@ +//***************************************************************************** +// +// hw_types.h - Common types and macros. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_TYPES_H__ +#define __HW_TYPES_H__ + +//***************************************************************************** +// +// Define a boolean type, and values for true and false. +// +//***************************************************************************** +typedef unsigned char tBoolean; + +#ifndef true +#define true 1 +#endif + +#ifndef false +#define false 0 +#endif + +//***************************************************************************** +// +// Macros for hardware access, both direct and via the bit-band region. +// +//***************************************************************************** +#define HWREG(x) \ + (*((volatile unsigned long *)(x))) +#define HWREGH(x) \ + (*((volatile unsigned short *)(x))) +#define HWREGB(x) \ + (*((volatile unsigned char *)(x))) +#define HWREGBITW(x, b) \ + HWREG(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITH(x, b) \ + HWREGH(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) +#define HWREGBITB(x, b) \ + HWREGB(((unsigned long)(x) & 0xF0000000) | 0x02000000 | \ + (((unsigned long)(x) & 0x000FFFFF) << 5) | ((b) << 2)) + +#endif // __HW_TYPES_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_uart.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_uart.h new file mode 100644 index 0000000..a688a6a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_uart.h @@ -0,0 +1,239 @@ +//***************************************************************************** +// +// hw_uart.h - Macros and defines used when accessing the UART hardware +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_UART_H__ +#define __HW_UART_H__ + +//***************************************************************************** +// +// UART Register Offsets. +// +//***************************************************************************** +#define UART_O_DR 0x00000000 // Data Register +#define UART_O_RSR 0x00000004 // Receive Status Register (read) +#define UART_O_ECR 0x00000004 // Error Clear Register (write) +#define UART_O_FR 0x00000018 // Flag Register (read only) +#define UART_O_IBRD 0x00000024 // Integer Baud Rate Divisor Reg +#define UART_O_FBRD 0x00000028 // Fractional Baud Rate Divisor Reg +#define UART_O_LCR_H 0x0000002C // Line Control Register, HIGH byte +#define UART_O_CTL 0x00000030 // Control Register +#define UART_O_IFLS 0x00000034 // Interrupt FIFO Level Select Reg +#define UART_O_IM 0x00000038 // Interrupt Mask Set/Clear Reg +#define UART_O_RIS 0x0000003C // Raw Interrupt Status Register +#define UART_O_MIS 0x00000040 // Masked Interrupt Status Register +#define UART_O_ICR 0x00000044 // Interrupt Clear Register +#define UART_O_PeriphID4 0x00000FD0 // +#define UART_O_PeriphID5 0x00000FD4 // +#define UART_O_PeriphID6 0x00000FD8 // +#define UART_O_PeriphID7 0x00000FDC // +#define UART_O_PeriphID0 0x00000FE0 // +#define UART_O_PeriphID1 0x00000FE4 // +#define UART_O_PeriphID2 0x00000FE8 // +#define UART_O_PeriphID3 0x00000FEC // +#define UART_O_PCellID0 0x00000FF0 // +#define UART_O_PCellID1 0x00000FF4 // +#define UART_O_PCellID2 0x00000FF8 // +#define UART_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// Data Register bits +// +//***************************************************************************** +#define UART_DR_OE 0x00000800 // Overrun Error +#define UART_DR_BE 0x00000400 // Break Error +#define UART_DR_PE 0x00000200 // Parity Error +#define UART_DR_FE 0x00000100 // Framing Error +#define UART_DR_DATA_MASK 0x000000FF // UART data + +//***************************************************************************** +// +// Receive Status Register bits +// +//***************************************************************************** +#define UART_RSR_OE 0x00000008 // Overrun Error +#define UART_RSR_BE 0x00000004 // Break Error +#define UART_RSR_PE 0x00000002 // Parity Error +#define UART_RSR_FE 0x00000001 // Framing Error + +//***************************************************************************** +// +// Flag Register bits +// +//***************************************************************************** +#define UART_FR_TXFE 0x00000080 // TX FIFO Empty +#define UART_FR_RXFF 0x00000040 // RX FIFO Full +#define UART_FR_TXFF 0x00000020 // TX FIFO Full +#define UART_FR_RXFE 0x00000010 // RX FIFO Empty +#define UART_FR_BUSY 0x00000008 // UART Busy + +//***************************************************************************** +// +// Integer baud-rate divisor +// +//***************************************************************************** +#define UART_IBRD_DIVINT_MASK 0x0000FFFF // Integer baud-rate divisor + +//***************************************************************************** +// +// Fractional baud-rate divisor +// +//***************************************************************************** +#define UART_FBRD_DIVFRAC_MASK 0x0000003F // Fractional baud-rate divisor + +//***************************************************************************** +// +// Line Control Register High bits +// +//***************************************************************************** +#define UART_LCR_H_SPS 0x00000080 // Stick Parity Select +#define UART_LCR_H_WLEN 0x00000060 // Word length +#define UART_LCR_H_WLEN_8 0x00000060 // 8 bit data +#define UART_LCR_H_WLEN_7 0x00000040 // 7 bit data +#define UART_LCR_H_WLEN_6 0x00000020 // 6 bit data +#define UART_LCR_H_WLEN_5 0x00000000 // 5 bit data +#define UART_LCR_H_FEN 0x00000010 // Enable FIFO +#define UART_LCR_H_STP2 0x00000008 // Two Stop Bits Select +#define UART_LCR_H_EPS 0x00000004 // Even Parity Select +#define UART_LCR_H_PEN 0x00000002 // Parity Enable +#define UART_LCR_H_BRK 0x00000001 // Send Break + +//***************************************************************************** +// +// Control Register bits +// +//***************************************************************************** +#define UART_CTL_RXE 0x00000200 // Receive Enable +#define UART_CTL_TXE 0x00000100 // Transmit Enable +#define UART_CTL_LBE 0x00000080 // Loopback Enable +#define UART_CTL_UARTEN 0x00000001 // UART Enable + +//***************************************************************************** +// +// Interrupt FIFO Level Select Register bits +// +//***************************************************************************** +#define UART_IFLS_RX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_RX2_8 0x00000010 // 1/4 Full +#define UART_IFLS_RX4_8 0x00000020 // 1/2 Full +#define UART_IFLS_RX6_8 0x00000030 // 3/4 Full +#define UART_IFLS_RX7_8 0x00000040 // 7/8 Full +#define UART_IFLS_TX1_8 0x00000000 // 1/8 Full +#define UART_IFLS_TX2_8 0x00000001 // 1/4 Full +#define UART_IFLS_TX4_8 0x00000002 // 1/2 Full +#define UART_IFLS_TX6_8 0x00000003 // 3/4 Full +#define UART_IFLS_TX7_8 0x00000004 // 7/8 Full + +//***************************************************************************** +// +// Interrupt Mask Set/Clear Register bits +// +//***************************************************************************** +#define UART_IM_OEIM 0x00000400 // Overrun Error Interrupt Mask +#define UART_IM_BEIM 0x00000200 // Break Error Interrupt Mask +#define UART_IM_PEIM 0x00000100 // Parity Error Interrupt Mask +#define UART_IM_FEIM 0x00000080 // Framing Error Interrupt Mask +#define UART_IM_RTIM 0x00000040 // Receive Timeout Interrupt Mask +#define UART_IM_TXIM 0x00000020 // Transmit Interrupt Mask +#define UART_IM_RXIM 0x00000010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Raw Interrupt Status Register +// +//***************************************************************************** +#define UART_RIS_OERIS 0x00000400 // Overrun Error Interrupt Status +#define UART_RIS_BERIS 0x00000200 // Break Error Interrupt Status +#define UART_RIS_PERIS 0x00000100 // Parity Error Interrupt Status +#define UART_RIS_FERIS 0x00000080 // Framing Error Interrupt Status +#define UART_RIS_RTRIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_RIS_TXRIS 0x00000020 // Transmit Interrupt Status +#define UART_RIS_RXRIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Masked Interrupt Status Register +// +//***************************************************************************** +#define UART_MIS_OEMIS 0x00000400 // Overrun Error Interrupt Status +#define UART_MIS_BEMIS 0x00000200 // Break Error Interrupt Status +#define UART_MIS_PEMIS 0x00000100 // Parity Error Interrupt Status +#define UART_MIS_FEMIS 0x00000080 // Framing Error Interrupt Status +#define UART_MIS_RTMIS 0x00000040 // Receive Timeout Interrupt Status +#define UART_MIS_TXMIS 0x00000020 // Transmit Interrupt Status +#define UART_MIS_RXMIS 0x00000010 // Receive Interrupt Status + +//***************************************************************************** +// +// Interrupt Clear Register bits +// +//***************************************************************************** +#define UART_ICR_OEIC 0x00000400 // Overrun Error Interrupt Clear +#define UART_ICR_BEIC 0x00000200 // Break Error Interrupt Clear +#define UART_ICR_PEIC 0x00000100 // Parity Error Interrupt Clear +#define UART_ICR_FEIC 0x00000080 // Framing Error Interrupt Clear +#define UART_ICR_RTIC 0x00000040 // Receive Timeout Interrupt Clear +#define UART_ICR_TXIC 0x00000020 // Transmit Interrupt Clear +#define UART_ICR_RXIC 0x00000010 // Receive Interrupt Clear + +#define UART_RSR_ANY (UART_RSR_OE | \ + UART_RSR_BE | \ + UART_RSR_PE | \ + UART_RSR_FE) + +//***************************************************************************** +// +// Reset Values for UART Registers. +// +//***************************************************************************** +#define UART_RV_DR 0x00000000 +#define UART_RV_RSR 0x00000000 +#define UART_RV_ECR 0x00000000 +#define UART_RV_FR 0x00000090 +#define UART_RV_IBRD 0x00000000 +#define UART_RV_FBRD 0x00000000 +#define UART_RV_LCR_H 0x00000000 +#define UART_RV_CTL 0x00000300 +#define UART_RV_IFLS 0x00000012 +#define UART_RV_IM 0x00000000 +#define UART_RV_RIS 0x00000000 +#define UART_RV_MIS 0x00000000 +#define UART_RV_ICR 0x00000000 +#define UART_RV_PeriphID4 0x00000000 +#define UART_RV_PeriphID5 0x00000000 +#define UART_RV_PeriphID6 0x00000000 +#define UART_RV_PeriphID7 0x00000000 +#define UART_RV_PeriphID0 0x00000011 +#define UART_RV_PeriphID1 0x00000000 +#define UART_RV_PeriphID2 0x00000018 +#define UART_RV_PeriphID3 0x00000001 +#define UART_RV_PCellID0 0x0000000D +#define UART_RV_PCellID1 0x000000F0 +#define UART_RV_PCellID2 0x00000005 +#define UART_RV_PCellID3 0x000000B1 + +#endif // __HW_UART_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_watchdog.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_watchdog.h new file mode 100644 index 0000000..e6e3fa5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/hw_watchdog.h @@ -0,0 +1,116 @@ +//***************************************************************************** +// +// hw_watchdog.h - Macros used when accessing the Watchdog Timer hardware. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __HW_WATCHDOG_H__ +#define __HW_WATCHDOG_H__ + +//***************************************************************************** +// +// The following define the offsets of the Watchdog Timer registers. +// +//***************************************************************************** +#define WDT_O_LOAD 0x00000000 // Load register +#define WDT_O_VALUE 0x00000004 // Current value register +#define WDT_O_CTL 0x00000008 // Control register +#define WDT_O_ICR 0x0000000C // Interrupt clear register +#define WDT_O_RIS 0x00000010 // Raw interrupt status register +#define WDT_O_MIS 0x00000014 // Masked interrupt status register +#define WDT_O_TEST 0x00000418 // Test register +#define WDT_O_LOCK 0x00000C00 // Lock register +#define WDT_O_PeriphID4 0x00000FD0 // +#define WDT_O_PeriphID5 0x00000FD4 // +#define WDT_O_PeriphID6 0x00000FD8 // +#define WDT_O_PeriphID7 0x00000FDC // +#define WDT_O_PeriphID0 0x00000FE0 // +#define WDT_O_PeriphID1 0x00000FE4 // +#define WDT_O_PeriphID2 0x00000FE8 // +#define WDT_O_PeriphID3 0x00000FEC // +#define WDT_O_PCellID0 0x00000FF0 // +#define WDT_O_PCellID1 0x00000FF4 // +#define WDT_O_PCellID2 0x00000FF8 // +#define WDT_O_PCellID3 0x00000FFC // + +//***************************************************************************** +// +// The following define the bit fields in the WDT_CTL register. +// +//***************************************************************************** +#define WDT_CTL_RESEN 0x00000002 // Enable reset output +#define WDT_CTL_INTEN 0x00000001 // Enable the WDT counter and int + +//***************************************************************************** +// +// The following define the bit fields in the WDT_ISR, WDT_RIS, and WDT_MIS +// registers. +// +//***************************************************************************** +#define WDT_INT_TIMEOUT 0x00000001 // Watchdog timer expired + +//***************************************************************************** +// +// The following define the bit fields in the WDT_TEST register. +// +//***************************************************************************** +#define WDT_TEST_STALL 0x00000100 // Watchdog stall enable +#ifndef DEPRECATED +#define WDT_TEST_STALL_EN 0x00000100 // Watchdog stall enable +#endif + +//***************************************************************************** +// +// The following define the bit fields in the WDT_LOCK register. +// +//***************************************************************************** +#define WDT_LOCK_LOCKED 0x00000001 // Watchdog timer is locked +#define WDT_LOCK_UNLOCKED 0x00000000 // Watchdog timer is unlocked +#define WDT_LOCK_UNLOCK 0x1ACCE551 // Unlocks the watchdog timer + +//***************************************************************************** +// +// The following define the reset values for the WDT registers. +// +//***************************************************************************** +#define WDT_RV_LOAD 0xFFFFFFFF // Load register +#define WDT_RV_VALUE 0xFFFFFFFF // Current value register +#define WDT_RV_CTL 0x00000000 // Control register +#define WDT_RV_RIS 0x00000000 // Raw interrupt status register +#define WDT_RV_MIS 0x00000000 // Masked interrupt status register +#define WDT_RV_LOCK 0x00000000 // Lock register +#define WDT_RV_PeriphID4 0x00000000 // +#define WDT_RV_PeriphID5 0x00000000 // +#define WDT_RV_PeriphID6 0x00000000 // +#define WDT_RV_PeriphID7 0x00000000 // +#define WDT_RV_PeriphID0 0x00000005 // +#define WDT_RV_PeriphID1 0x00000018 // +#define WDT_RV_PeriphID2 0x00000018 // +#define WDT_RV_PeriphID3 0x00000001 // +#define WDT_RV_PCellID0 0x0000000D // +#define WDT_RV_PCellID1 0x000000F0 // +#define WDT_RV_PCellID2 0x00000005 // +#define WDT_RV_PCellID3 0x000000B1 // + +#endif // __HW_WATCHDOG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/osram96x16.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/osram96x16.c new file mode 100644 index 0000000..370d53e --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/osram96x16.c @@ -0,0 +1,953 @@ +//***************************************************************************** +// +// osram96x16.c - Driver for the OSRAM 96x16 graphical OLED display. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ev_lm3s811_api +//! @{ +// +//***************************************************************************** + +#include "hw_i2c.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "src/debug.h" +#include "src/gpio.h" +#include "src/i2c.h" +#include "src/sysctl.h" +#include "osram96x16.h" + +extern void I2CMasterInitExpClk(unsigned long ulBase, unsigned long ulI2CClk, tBoolean bFast); +//***************************************************************************** +// +// The I2C slave address of the SSD0303 controller on the OLED display. +// +//***************************************************************************** +#define SSD0303_ADDR 0x3d + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +//***************************************************************************** +static const unsigned char g_pucFont[95][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD0303 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the I2C transfer, followed by that many bytes of command data. +// +//***************************************************************************** +static const unsigned char g_pucOSRAMInit[] = +{ + // + // Turn off the panel + // + 0x02, 0x80, 0xae, + + // + // Set lower column address + // + 0x02, 0x80, 0x04, + + // + // Set higher column address + // + 0x02, 0x80, 0x12, + + // + // Set contrast control register + // + 0x04, 0x80, 0x81, 0x80, 0x2b, + + // + // Set segment re-map + // + 0x02, 0x80, 0xa1, + + // + // Set display start line + // + 0x02, 0x80, 0x40, + + // + // Set display offset + // + 0x04, 0x80, 0xd3, 0x80, 0x00, + + // + // Set multiplex ratio + // + 0x04, 0x80, 0xa8, 0x80, 0x0f, + + // + // Set the display to normal mode + // + 0x02, 0x80, 0xa4, + + // + // Non-inverted display + // + 0x02, 0x80, 0xa6, + + // + // Set the page address + // + 0x02, 0x80, 0xb0, + + // + // Set COM output scan direction + // + 0x02, 0x80, 0xc8, + + // + // Set display clock divide ratio/oscillator frequency + // + 0x04, 0x80, 0xd5, 0x80, 0x72, + + // + // Enable mono mode + // + 0x04, 0x80, 0xd8, 0x80, 0x00, + + // + // Set pre-charge period + // + 0x04, 0x80, 0xd9, 0x80, 0x22, + + // + // Set COM pins hardware configuration + // + 0x04, 0x80, 0xda, 0x80, 0x12, + + // + // Set VCOM deslect level + // + 0x04, 0x80, 0xdb, 0x80, 0x0f, + + // + // Set DC-DC on + // + 0x04, 0x80, 0xad, 0x80, 0x8b, + + // + // Turn on the panel + // + 0x02, 0x80, 0xaf, +}; + +//***************************************************************************** +// +// The inter-byte delay required by the SSD0303 OLED controller. +// +//***************************************************************************** +static unsigned long g_ulDelay; + +//***************************************************************************** +// +//! \internal +//! +//! Provide a small delay. +//! +//! \param ulCount is the number of delay loop iterations to perform. +//! +//! Since the SSD0303 controller needs a delay between bytes written to it over +//! the I2C bus, this function provides a means of generating that delay. It +//! is written in assembly to keep the delay consistent across tool chains, +//! avoiding the need to tune the delay based on the tool chain in use. +//! +//! \return None. +// +//***************************************************************************** +#if defined(ewarm) +static void +OSRAMDelay(unsigned long ulCount) +{ + __asm(" subs r0, #1\n" + " bne OSRAMDelay\n" + " bx lr"); +} +#endif +#if defined(gcc) +static void __attribute__((naked)) +OSRAMDelay(unsigned long ulCount) +{ + __asm(" subs r0, #1\n" + " bne OSRAMDelay\n" + " bx lr"); +} +#endif +#if defined(rvmdk) || defined(__ARMCC_VERSION) +__asm void +OSRAMDelay(unsigned long ulCount) +{ + subs r0, #1; + bne OSRAMDelay; + bx lr; +} +#endif + +//***************************************************************************** +// +//! \internal +//! +//! Start a transfer to the SSD0303 controller. +//! +//! \param ucChar is the first byte to be written to the controller. +//! +//! This function will start a transfer to the SSD0303 controller via the I2C +//! bus. +//! +//! The data is written in a polled fashion; this function will not return +//! until the byte has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteFirst(unsigned char ucChar) +{ + // + // Set the slave address. + // + I2CMasterSlaveAddrSet(I2C_MASTER_BASE, SSD0303_ADDR, false); + + // + // Write the first byte to the controller. + // + I2CMasterDataPut(I2C_MASTER_BASE, ucChar); + + // + // Start the transfer. + // + I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_START); +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a byte to the SSD0303 controller. +//! +//! \param ucChar is the byte to be transmitted to the controller. +//! +//! This function continues a transfer to the SSD0303 controller by writing +//! another byte over the I2C bus. This must only be called after calling +//! OSRAMWriteFirst(), but before calling OSRAMWriteFinal(). +//! +//! The data is written in a polled faashion; this function will not return +//! until the byte has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteByte(unsigned char ucChar) +{ + // + // Wait until the current byte has been transferred. + // + while(I2CMasterIntStatus(I2C_MASTER_BASE, false) == 0) + { + } + + // + // Provide the required inter-byte delay. + // + OSRAMDelay(g_ulDelay); + + // + // Write the next byte to the controller. + // + I2CMasterDataPut(I2C_MASTER_BASE, ucChar); + + // + // Continue the transfer. + // + I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_CONT); +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of bytes to the SSD0303 controller. +//! +//! This function continues a transfer to the SSD0303 controller by writing a +//! sequence of bytes over the I2C bus. This must only be called after calling +//! OSRAMWriteFirst(), but before calling OSRAMWriteFinal(). +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteArray(const unsigned char *pucBuffer, unsigned long ulCount) +{ + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Wait until the current byte has been transferred. + // + while(I2CMasterIntStatus(I2C_MASTER_BASE, false) == 0) + { + } + + // + // Provide the required inter-byte delay. + // + OSRAMDelay(g_ulDelay); + + // + // Write the next byte to the controller. + // + I2CMasterDataPut(I2C_MASTER_BASE, *pucBuffer++); + ulCount--; + + // + // Continue the transfer. + // + I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_CONT); + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Finish a transfer to the SSD0303 controller. +//! +//! \param ucChar is the final byte to be written to the controller. +//! +//! This function will finish a transfer to the SSD0303 controller via the I2C +//! bus. This must only be called after calling OSRAMWriteFirst(). +//! +//! The data is written in a polled fashion; this function will not return +//! until the byte has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteFinal(unsigned char ucChar) +{ + // + // Wait until the current byte has been transferred. + // + while(I2CMasterIntStatus(I2C_MASTER_BASE, false) == 0) + { + } + + // + // Provide the required inter-byte delay. + // + OSRAMDelay(g_ulDelay); + + // + // Write the final byte to the controller. + // + I2CMasterDataPut(I2C_MASTER_BASE, ucChar); + + // + // Finish the transfer. + // + I2CMasterControl(I2C_MASTER_BASE, I2C_MASTER_CMD_BURST_SEND_FINISH); + + // + // Wait until the final byte has been transferred. + // + while(I2CMasterIntStatus(I2C_MASTER_BASE, false) == 0) + { + } + + // + // Provide the required inter-byte delay. + // + OSRAMDelay(g_ulDelay); +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display. All pixels in the display will be +//! turned off. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMClear(void) +{ + static const unsigned char pucRow1[] = + { + 0xb0, 0x80, 0x04, 0x80, 0x12, 0x40 + }; + static const unsigned char pucRow2[] = + { + 0xb1, 0x80, 0x04, 0x80, 0x12, 0x40 + }; + unsigned long ulIdx; + + // + // Move the display cursor to the first column of the first row. + // + OSRAMWriteFirst(0x80); + OSRAMWriteArray(pucRow1, sizeof(pucRow1)); + + // + // Fill this row with zeros. + // + for(ulIdx = 0; ulIdx < 95; ulIdx++) + { + OSRAMWriteByte(0x00); + } + OSRAMWriteFinal(0x00); + + // + // Move the display cursor to the first column of the second row. + // + OSRAMWriteFirst(0x80); + OSRAMWriteArray(pucRow2, sizeof(pucRow2)); + + // + // Fill this row with zeros. + // + for(ulIdx = 0; ulIdx < 95; ulIdx++) + { + OSRAMWriteByte(0x00); + } + OSRAMWriteFinal(0x00); +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! eight scan line blocks from the top of the display (i.e. only 0 and 1 are +//! valid). +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMStringDraw(const char *pcStr, unsigned long ulX, unsigned long ulY) +{ + // + // Check the arguments. + // + ASSERT(ulX < 96); + ASSERT(ulY < 2); + + // + // Move the display cursor to the requested position on the display. + // + OSRAMWriteFirst(0x80); + OSRAMWriteByte((ulY == 0) ? 0xb0 : 0xb1); + OSRAMWriteByte(0x80); + OSRAMWriteByte((ulX + 36) & 0x0f); + OSRAMWriteByte(0x80); + OSRAMWriteByte(0x10 | (((ulX + 36) >> 4) & 0x0f)); + OSRAMWriteByte(0x40); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // See if there is enough space on the display for this entire + // character. + // + if(ulX <= 90) + { + // + // Write the contents of this character to the display. + // + OSRAMWriteArray(g_pucFont[*pcStr - ' '], 5); + + // + // See if this is the last character to display (either because the + // right edge has been reached or because there are no more + // characters). + // + if((ulX == 90) || (pcStr[1] == 0)) + { + // + // Write the final column of the display. + // + OSRAMWriteFinal(0x00); + + // + // The string has been displayed. + // + return; + } + + // + // Write the inter-character padding column. + // + OSRAMWriteByte(0x00); + } + else + { + // + // Write the portion of the character that will fit onto the + // display. + // + OSRAMWriteArray(g_pucFont[*pcStr - ' '], 95 - ulX); + OSRAMWriteFinal(g_pucFont[*pcStr - ' '][95 - ulX]); + + // + // The string has been displayed. + // + return; + } + + // + // Advance to the next character. + // + pcStr++; + + // + // Increment the X coordinate by the six columns that were just + // written. + // + ulX += 6; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! eight scan line blocks from the top of the display (i.e. only 0 and 1 are +//! valid). +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in eight row blocks +//! (i.e. only 1 and 2 are valid). +//! +//! This function will display a bitmap graphic on the display. The image to +//! be displayed must be a multiple of eight scan lines high (i.e. one row) and +//! will be drawn at a vertical position that is a multiple of eight scan lines +//! (i.e. scan line zero or scan line eight, corresponding to row zero or row +//! one). +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for the eight scan lines of the column, with the top scan +//! line being in the least significant bit of the byte and the bottom scan +//! line being in the most significant bit of the byte. +//! +//! For example, an image four columns wide and sixteen scan lines tall would +//! be arranged as follows (showing how the eight bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------+ +-------+ +-------+ +-------+ +//! | | 0 | | | 0 | | | 0 | | | 0 | +//! | B | 1 | | B | 1 | | B | 1 | | B | 1 | +//! | y | 2 | | y | 2 | | y | 2 | | y | 2 | +//! | t | 3 | | t | 3 | | t | 3 | | t | 3 | +//! | e | 4 | | e | 4 | | e | 4 | | e | 4 | +//! | | 5 | | | 5 | | | 5 | | | 5 | +//! | 0 | 6 | | 1 | 6 | | 2 | 6 | | 3 | 6 | +//! | | 7 | | | 7 | | | 7 | | | 7 | +//! +-------+ +-------+ +-------+ +-------+ +//! +//! +-------+ +-------+ +-------+ +-------+ +//! | | 0 | | | 0 | | | 0 | | | 0 | +//! | B | 1 | | B | 1 | | B | 1 | | B | 1 | +//! | y | 2 | | y | 2 | | y | 2 | | y | 2 | +//! | t | 3 | | t | 3 | | t | 3 | | t | 3 | +//! | e | 4 | | e | 4 | | e | 4 | | e | 4 | +//! | | 5 | | | 5 | | | 5 | | | 5 | +//! | 4 | 6 | | 5 | 6 | | 6 | 6 | | 7 | 6 | +//! | | 7 | | | 7 | | | 7 | | | 7 | +//! +-------+ +-------+ +-------+ +-------+ +//! \endverbatim +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + // + // Check the arguments. + // + ASSERT(ulX < 96); + ASSERT(ulY < 2); + ASSERT((ulX + ulWidth) <= 96); + ASSERT((ulY + ulHeight) <= 2); + + // + // The first 36 columns of the LCD buffer are not displayed, so increment + // the X coorddinate by 36 to account for the non-displayed frame buffer + // memory. + // + ulX += 36; + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write the starting address within this row. + // + OSRAMWriteFirst(0x80); + OSRAMWriteByte((ulY == 0) ? 0xb0 : 0xb1); + OSRAMWriteByte(0x80); + OSRAMWriteByte(ulX & 0x0f); + OSRAMWriteByte(0x80); + OSRAMWriteByte(0x10 | ((ulX >> 4) & 0x0f)); + OSRAMWriteByte(0x40); + + // + // Write this row of image data. + // + OSRAMWriteArray(pucImage, ulWidth - 1); + OSRAMWriteFinal(pucImage[ulWidth - 1]); + + // + // Advance to the next row of the image. + // + pucImage += ulWidth; + ulY++; + } +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param bFast is a boolean that is \e true if the I2C interface should be +//! run at 400 kbps and \e false if it should be run at 100 kbps. +//! +//! This function initializes the I2C interface to the OLED display and +//! configures the SSD0303 controller on the panel. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMInit(tBoolean bFast) +{ + unsigned long ulIdx; + + // + // Enable the I2C and GPIO port B blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + + // + // Configure the I2C SCL and SDA pins for I2C operation. + // + GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3); + + // + // Initialize the I2C master. + // + I2CMasterInitExpClk(I2C_MASTER_BASE, SysCtlClockGet(), bFast); + + // + // Compute the inter-byte delay for the SSD0303 controller. This delay is + // dependent upon the I2C bus clock rate; the slower the clock the longer + // the delay required. + // + // The derivation of this formula is based on a measured delay of + // OSRAMDelay(1700) for a 100 kHz I2C bus with the CPU running at 50 MHz + // (referred to as C). To scale this to the delay for a different CPU + // speed (since this is just a CPU-based delay loop) is: + // + // f(CPU) + // C * ---------- + // 50,000,000 + // + // To then scale this to the actual I2C rate (since it won't always be + // precisely 100 kHz): + // + // f(CPU) 100,000 + // C * ---------- * ------- + // 50,000,000 f(I2C) + // + // This equation will give the inter-byte delay required for any + // configuration of the I2C master. But, as arranged it is impossible to + // directly compute in 32-bit arithmetic (without loosing a lot of + // accuracy). So, the equation is simplified. + // + // Since f(I2C) is generated by dividing down from f(CPU), replace it with + // the equivalent (where TPR is the value programmed into the Master Timer + // Period Register of the I2C master, with the 1 added back): + // + // 100,000 + // f(CPU) ------- + // C * ---------- * f(CPU) + // 50,000,000 ------------ + // 2 * 10 * TPR + // + // Inverting the dividend in the last term: + // + // f(CPU) 100,000 * 2 * 10 * TPR + // C * ---------- * ---------------------- + // 50,000,000 f(CPU) + // + // The f(CPU) now cancels out. + // + // 100,000 * 2 * 10 * TPR + // C * ---------------------- + // 50,000,000 + // + // Since there are no clock frequencies left in the equation, this equation + // also works for 400 kHz bus operation as well, since the 100,000 in the + // numerator becomes 400,000 but C is 1/4, which cancel out each other. + // Reducing the constants gives: + // + // TPR TPR TPR + // C * --- = 1700 * --- = 340 * --- + // 25 25 5 + // + // Note that the constant C is actually a bit larger than it needs to be in + // order to provide some safety margin. + // + // When the panel is being initialized, the value of C actually needs to be + // a bit longer (3200 instead of 1700). So, set the larger value for now. + // + g_ulDelay = (640 * (HWREG(I2C_MASTER_BASE + I2C_MASTER_O_TPR) + 1)) / 5; + + // + // Initialize the SSD0303 controller. Loop through the initialization + // sequence doing a single I2C transfer for each command. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAMInit); + ulIdx += g_pucOSRAMInit[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteFirst(g_pucOSRAMInit[ulIdx + 1]); + OSRAMWriteArray(g_pucOSRAMInit + ulIdx + 2, g_pucOSRAMInit[ulIdx] - 2); + OSRAMWriteFinal(g_pucOSRAMInit[ulIdx + g_pucOSRAMInit[ulIdx]]); + } + + // + // Now, switch to the actual value of C. + // + g_ulDelay = (340 * (HWREG(I2C_MASTER_BASE + I2C_MASTER_O_TPR) + 1)) / 5; + + // + // Clear the frame buffer. + // + OSRAMClear(); +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMDisplayOn(void) +{ + // + // Turn on the DC-DC converter and the display. + // + OSRAMWriteFirst(0x80); + OSRAMWriteByte(0xad); + OSRAMWriteByte(0x80); + OSRAMWriteByte(0x8b); + OSRAMWriteByte(0x80); + OSRAMWriteFinal(0xaf); +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! \return None. +// +//***************************************************************************** +void +OSRAMDisplayOff(void) +{ + // + // Turn off the DC-DC converter and the display. + // + OSRAMWriteFirst(0x80); + OSRAMWriteByte(0xad); + OSRAMWriteByte(0x80); + OSRAMWriteByte(0x8a); + OSRAMWriteByte(0x80); + OSRAMWriteFinal(0xae); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/osram96x16.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/osram96x16.h new file mode 100644 index 0000000..54cf421 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/osram96x16.h @@ -0,0 +1,47 @@ +//***************************************************************************** +// +// osram96x16.h - Prototypes for the driver for the OSRAM 96x16 graphical OLED +// display. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 852 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __OSRAM96X16_H__ +#define __OSRAM96X16_H__ + +//***************************************************************************** +// +// Prototypes for the driver APIs. +// +//***************************************************************************** +extern void OSRAMClear(void); +extern void OSRAMStringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY); +extern void OSRAMImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight); +extern void OSRAMInit(tBoolean bFast); +extern void OSRAMDisplayOn(void); +extern void OSRAMDisplayOff(void); + +#endif // __OSRAM96X16_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/adc.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/adc.h new file mode 100644 index 0000000..ee06b9c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/adc.h @@ -0,0 +1,124 @@ +//***************************************************************************** +// +// adc.h - ADC headers for using the ADC driver functions. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __ADC_H__ +#define __ADC_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceConfigure as the ulTrigger +// parameter. +// +//***************************************************************************** +#define ADC_TRIGGER_PROCESSOR 0x00000000 // Processor event +#define ADC_TRIGGER_COMP0 0x00000001 // Analog comparator 0 event +#define ADC_TRIGGER_COMP1 0x00000002 // Analog comparator 1 event +#define ADC_TRIGGER_COMP2 0x00000003 // Analog comparator 2 event +#define ADC_TRIGGER_EXTERNAL 0x00000004 // External event +#define ADC_TRIGGER_TIMER 0x00000005 // Timer event +#define ADC_TRIGGER_PWM0 0x00000006 // PWM0 event +#define ADC_TRIGGER_PWM1 0x00000007 // PWM1 event +#define ADC_TRIGGER_PWM2 0x00000008 // PWM2 event +#define ADC_TRIGGER_ALWAYS 0x0000000F // Always event + +//***************************************************************************** +// +// Values that can be passed to ADCSequenceStepConfigure as the ulConfig +// parameter. +// +//***************************************************************************** +#define ADC_CTL_TS 0x00000080 // Temperature sensor select +#define ADC_CTL_IE 0x00000040 // Interrupt enable +#define ADC_CTL_END 0x00000020 // Sequence end select +#define ADC_CTL_D 0x00000010 // Differential select +#define ADC_CTL_CH0 0x00000000 // Input channel 0 +#define ADC_CTL_CH1 0x00000001 // Input channel 1 +#define ADC_CTL_CH2 0x00000002 // Input channel 2 +#define ADC_CTL_CH3 0x00000003 // Input channel 3 +#define ADC_CTL_CH4 0x00000004 // Input channel 4 +#define ADC_CTL_CH5 0x00000005 // Input channel 5 +#define ADC_CTL_CH6 0x00000006 // Input channel 6 +#define ADC_CTL_CH7 0x00000007 // Input channel 7 + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ADCIntRegister(unsigned long ulBase, unsigned long ulSequenceNum, + void (*pfnHandler)(void)); +extern void ADCIntUnregister(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCIntDisable(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCIntEnable(unsigned long ulBase, unsigned long ulSequenceNum); +extern unsigned long ADCIntStatus(unsigned long ulBase, + unsigned long ulSequenceNum, + tBoolean bMasked); +extern void ADCIntClear(unsigned long ulBase, unsigned long ulSequenceNum); +extern void ADCSequenceEnable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceDisable(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSequenceConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulTrigger, + unsigned long ulPriority); +extern void ADCSequenceStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern long ADCSequenceOverflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceUnderflow(unsigned long ulBase, + unsigned long ulSequenceNum); +extern long ADCSequenceDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer); +extern void ADCProcessorTrigger(unsigned long ulBase, + unsigned long ulSequenceNum); +extern void ADCSoftwareOversampleConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulFactor); +extern void ADCSoftwareOversampleStepConfigure(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long ulStep, + unsigned long ulConfig); +extern void ADCSoftwareOversampleDataGet(unsigned long ulBase, + unsigned long ulSequenceNum, + unsigned long *pulBuffer, + unsigned long ulCount); + +#ifdef __cplusplus +} +#endif + +#endif // __ADC_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/comp.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/comp.h new file mode 100644 index 0000000..1475122 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/comp.h @@ -0,0 +1,120 @@ +//***************************************************************************** +// +// comp.h - Prototypes for the analog comparator driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __COMP_H__ +#define __COMP_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to ComparatorConfigure() as the ulConfig +// parameter. For each group (i.e. COMP_TRIG_xxx, COMP_INT_xxx, etc.), one of +// the values may be selected and ORed together will values from the other +// groups. +// +//***************************************************************************** +#define COMP_TRIG_NONE 0x00000000 // No ADC trigger +#define COMP_TRIG_HIGH 0x00000880 // Trigger when high +#define COMP_TRIG_LOW 0x00000800 // Trigger when low +#define COMP_TRIG_FALL 0x00000820 // Trigger on falling edge +#define COMP_TRIG_RISE 0x00000840 // Trigger on rising edge +#define COMP_TRIG_BOTH 0x00000860 // Trigger on both edges +#define COMP_INT_HIGH 0x00000010 // Interrupt when high +#define COMP_INT_LOW 0x00000000 // Interrupt when low +#define COMP_INT_FALL 0x00000004 // Interrupt on falling edge +#define COMP_INT_RISE 0x00000008 // Interrupt on rising edge +#define COMP_INT_BOTH 0x0000000C // Interrupt on both edges +#define COMP_ASRCP_PIN 0x00000000 // Dedicated Comp+ pin +#define COMP_ASRCP_PIN0 0x00000200 // Comp0+ pin +#define COMP_ASRCP_REF 0x00000400 // Internal voltage reference +#define COMP_OUTPUT_NONE 0x00000000 // No comparator output +#define COMP_OUTPUT_NORMAL 0x00000100 // Comparator output normal +#define COMP_OUTPUT_INVERT 0x00000102 // Comparator output inverted + +//***************************************************************************** +// +// Values that can be passed to ComparatorSetRef() as the ulRef parameter. +// +//***************************************************************************** +#define COMP_REF_OFF 0x00000000 // Turn off the internal reference +#define COMP_REF_0V 0x00000300 // Internal reference of 0V +#define COMP_REF_0_1375V 0x00000301 // Internal reference of 0.1375V +#define COMP_REF_0_275V 0x00000302 // Internal reference of 0.275V +#define COMP_REF_0_4125V 0x00000303 // Internal reference of 0.4125V +#define COMP_REF_0_55V 0x00000304 // Internal reference of 0.55V +#define COMP_REF_0_6875V 0x00000305 // Internal reference of 0.6875V +#define COMP_REF_0_825V 0x00000306 // Internal reference of 0.825V +#define COMP_REF_0_928125V 0x00000201 // Internal reference of 0.928125V +#define COMP_REF_0_9625V 0x00000307 // Internal reference of 0.9625V +#define COMP_REF_1_03125V 0x00000202 // Internal reference of 1.03125V +#define COMP_REF_1_134375V 0x00000203 // Internal reference of 1.134375V +#define COMP_REF_1_1V 0x00000308 // Internal reference of 1.1V +#define COMP_REF_1_2375V 0x00000309 // Internal reference of 1.2375V +#define COMP_REF_1_340625V 0x00000205 // Internal reference of 1.340625V +#define COMP_REF_1_375V 0x0000030A // Internal reference of 1.375V +#define COMP_REF_1_44375V 0x00000206 // Internal reference of 1.44375V +#define COMP_REF_1_5125V 0x0000030B // Internal reference of 1.5125V +#define COMP_REF_1_546875V 0x00000207 // Internal reference of 1.546875V +#define COMP_REF_1_65V 0x0000030C // Internal reference of 1.65V +#define COMP_REF_1_753125V 0x00000209 // Internal reference of 1.753125V +#define COMP_REF_1_7875V 0x0000030D // Internal reference of 1.7875V +#define COMP_REF_1_85625V 0x0000020A // Internal reference of 1.85625V +#define COMP_REF_1_925V 0x0000030E // Internal reference of 1.925V +#define COMP_REF_1_959375V 0x0000020B // Internal reference of 1.959375V +#define COMP_REF_2_0625V 0x0000030F // Internal reference of 2.0625V +#define COMP_REF_2_165625V 0x0000020D // Internal reference of 2.165625V +#define COMP_REF_2_26875V 0x0000020E // Internal reference of 2.26875V +#define COMP_REF_2_371875V 0x0000020F // Internal reference of 2.371875V + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void ComparatorConfigure(unsigned long ulBase, unsigned long ulComp, + unsigned long ulConfig); +extern void ComparatorRefSet(unsigned long ulBase, unsigned long ulRef); +extern tBoolean ComparatorValueGet(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntRegister(unsigned long ulBase, unsigned long ulComp, + void (*pfnHandler)(void)); +extern void ComparatorIntUnregister(unsigned long ulBase, + unsigned long ulComp); +extern void ComparatorIntEnable(unsigned long ulBase, unsigned long ulComp); +extern void ComparatorIntDisable(unsigned long ulBase, unsigned long ulComp); +extern tBoolean ComparatorIntStatus(unsigned long ulBase, unsigned long ulComp, + tBoolean bMasked); +extern void ComparatorIntClear(unsigned long ulBase, unsigned long ulComp); + +#ifdef __cplusplus +} +#endif + +#endif // __COMP_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/cpu.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/cpu.h new file mode 100644 index 0000000..a71928c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/cpu.h @@ -0,0 +1,40 @@ +//***************************************************************************** +// +// cpu.h - Prototypes for the CPU instruction wrapper functions. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __CPU_H__ +#define __CPU_H__ + +//***************************************************************************** +// +// Prototypes. +// +//***************************************************************************** +extern void CPUcpsid(void); +extern void CPUcpsie(void); +extern void CPUwfi(void); + +#endif // __CPU_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/debug.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/debug.h new file mode 100644 index 0000000..0000ed3 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/debug.h @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// debug.h - Macros for assisting debug of the driver library. +// +// Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __DEBUG_H__ +#define __DEBUG_H__ + +//***************************************************************************** +// +// Prototype for the function that is called when an invalid argument is passed +// to an API. This is only used when doing a DEBUG build. +// +//***************************************************************************** +extern void __error__(char *pcFilename, unsigned long ulLine); + +//***************************************************************************** +// +// The ASSERT macro, which does the actual assertion checking. Typically, this +// will be for procedure arguments. +// +//***************************************************************************** +#ifdef DEBUG +#define ASSERT(expr) { \ + if(!(expr)) \ + { \ + __error__(__FILE__, __LINE__); \ + } \ + } +#else +#define ASSERT(expr) +#endif + +#endif // __DEBUG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/flash.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/flash.h new file mode 100644 index 0000000..f8ff60a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/flash.h @@ -0,0 +1,75 @@ +//***************************************************************************** +// +// flash.h - Prototypes for the flash driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __FLASH_H__ +#define __FLASH_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to FlashProtectSet(), and returned by +// FlashProtectGet(). +// +//***************************************************************************** +typedef enum +{ + FlashReadWrite, // Flash can be read and written + FlashReadOnly, // Flash can only be read + FlashExecuteOnly // Flash can only be executed +} +tFlashProtection; + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long FlashUsecGet(void); +extern void FlashUsecSet(unsigned long ulClocks); +extern long FlashErase(unsigned long ulAddress); +extern long FlashProgram(unsigned long *pulData, unsigned long ulAddress, + unsigned long ulCount); +extern tFlashProtection FlashProtectGet(unsigned long ulAddress); +extern long FlashProtectSet(unsigned long ulAddress, + tFlashProtection eProtect); +extern long FlashProtectSave(void); +extern void FlashIntRegister(void (*pfnHandler)(void)); +extern void FlashIntUnregister(void); +extern void FlashIntEnable(unsigned long ulIntFlags); +extern void FlashIntDisable(unsigned long ulIntFlags); +extern unsigned long FlashIntGetStatus(tBoolean bMasked); +extern void FlashIntClear(unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __FLASH_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/gpio.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/gpio.h new file mode 100644 index 0000000..ec682b5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/gpio.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// gpio.h - Defines and Macros for GPIO API. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following values define the bit field for the ucPins argument to several +// of the APIs. +// +//***************************************************************************** +#define GPIO_PIN_0 0x00000001 // GPIO pin 0 +#define GPIO_PIN_1 0x00000002 // GPIO pin 1 +#define GPIO_PIN_2 0x00000004 // GPIO pin 2 +#define GPIO_PIN_3 0x00000008 // GPIO pin 3 +#define GPIO_PIN_4 0x00000010 // GPIO pin 4 +#define GPIO_PIN_5 0x00000020 // GPIO pin 5 +#define GPIO_PIN_6 0x00000040 // GPIO pin 6 +#define GPIO_PIN_7 0x00000080 // GPIO pin 7 + +//***************************************************************************** +// +// Values that can be passed to GPIODirModeSet as the ulPinIO parameter, and +// returned from GPIODirModeGet. +// +//***************************************************************************** +#define GPIO_DIR_MODE_IN 0x00000000 // Pin is a GPIO input +#define GPIO_DIR_MODE_OUT 0x00000001 // Pin is a GPIO output +#define GPIO_DIR_MODE_HW 0x00000002 // Pin is a peripheral function + +//***************************************************************************** +// +// Values that can be passed to GPIOIntTypeSet as the ulIntType parameter, and +// returned from GPIOIntTypeGet. +// +//***************************************************************************** +#define GPIO_FALLING_EDGE 0x00000000 // Interrupt on falling edge +#define GPIO_RISING_EDGE 0x00000004 // Interrupt on rising edge +#define GPIO_BOTH_EDGES 0x00000001 // Interrupt on both edges +#define GPIO_LOW_LEVEL 0x00000002 // Interrupt on low level +#define GPIO_HIGH_LEVEL 0x00000007 // Interrupt on high level + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulStrength parameter, +// and returned by GPIOPadConfigGet in the *pulStrength parameter. +// +//***************************************************************************** +#define GPIO_STRENGTH_2MA 0x00000001 // 2mA drive strength +#define GPIO_STRENGTH_4MA 0x00000002 // 4mA drive strength +#define GPIO_STRENGTH_8MA 0x00000004 // 8mA drive strength +#define GPIO_STRENGTH_8MA_SC 0x0000000C // 8mA drive with slew rate control + +//***************************************************************************** +// +// Values that can be passed to GPIOPadConfigSet as the ulPadType parameter, +// and returned by GPIOPadConfigGet in the *pulPadType parameter. +// +//***************************************************************************** +#define GPIO_PIN_TYPE_STD 0x00000008 // Push-pull +#define GPIO_PIN_TYPE_STD_WPU 0x0000000A // Push-pull with weak pull-up +#define GPIO_PIN_TYPE_STD_WPD 0x0000000C // Push-pull with weak pull-down +#define GPIO_PIN_TYPE_OD 0x00000009 // Open-drain +#define GPIO_PIN_TYPE_OD_WPU 0x0000000B // Open-drain with weak pull-up +#define GPIO_PIN_TYPE_OD_WPD 0x0000000D // Open-drain with weak pull-down +#define GPIO_PIN_TYPE_ANALOG 0x00000000 // Analog comparator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void GPIODirModeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulPinIO); +extern unsigned long GPIODirModeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOIntTypeSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulIntType); +extern unsigned long GPIOIntTypeGet(unsigned long ulPort, unsigned char ucPin); +extern void GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins, + unsigned long ulStrength, + unsigned long ulPadType); +extern void GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin, + unsigned long *pulStrength, + unsigned long *pulPadType); +extern void GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins); +extern long GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked); +extern void GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPortIntRegister(unsigned long ulPort, + void (*pfIntHandler)(void)); +extern void GPIOPortIntUnregister(unsigned long ulPort); +extern long GPIOPinRead(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinWrite(unsigned long ulPort, unsigned char ucPins, + unsigned char ucVal); +extern void GPIOPinTypeComparator(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeI2C(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypePWM(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeQEI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeSSI(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeTimer(unsigned long ulPort, unsigned char ucPins); +extern void GPIOPinTypeUART(unsigned long ulPort, unsigned char ucPins); + +#ifdef __cplusplus +} +#endif + +#endif // __GPIO_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/i2c.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/i2c.h new file mode 100644 index 0000000..88234a8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/i2c.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// i2c.h - Prototypes for the I2C Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Defines for the API. +// +//***************************************************************************** +//***************************************************************************** +// +// Interrupt defines. +// +//***************************************************************************** +#define I2C_INT_MASTER 0x00000001 +#define I2C_INT_SLAVE 0x00000002 + +//***************************************************************************** +// +// I2C Master commands. +// +//***************************************************************************** +#define I2C_MASTER_CMD_SINGLE_SEND \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_SINGLE_RECEIVE \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_START \ + (I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_CONT \ + (I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_SEND_ERROR_STOP \ + (I2C_MASTER_CS_STOP) +#define I2C_MASTER_CMD_BURST_RECEIVE_START \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_START | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_CONT \ + (I2C_MASTER_CS_ACK | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_FINISH \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) +#define I2C_MASTER_CMD_BURST_RECEIVE_ERROR_STOP \ + (I2C_MASTER_CS_STOP | I2C_MASTER_CS_RUN) + +//***************************************************************************** +// +// I2C Master error status. +// +//***************************************************************************** +#define I2C_MASTER_ERR_NONE 0 +#define I2C_MASTER_ERR_ADDR_ACK 0x00000004 +#define I2C_MASTER_ERR_DATA_ACK 0x00000008 +#define I2C_MASTER_ERR_ARB_LOST 0x00000010 + +//***************************************************************************** +// +// I2C Slave action requests +// +//***************************************************************************** +#define I2C_SLAVE_ACT_NONE 0 +#define I2C_SLAVE_ACT_RREQ 0x00000001 // Master has sent data +#define I2C_SLAVE_ACT_TREQ 0x00000002 // Master has requested data + +//***************************************************************************** +// Miscellaneous I2C driver definitions. +//***************************************************************************** +#define I2C_MASTER_MAX_RETRIES 1000 // Number of retries + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void I2CIntRegister(unsigned long ulBase, void(fnHandler)(void)); +extern void I2CIntUnregister(unsigned long ulBase); +extern tBoolean I2CMasterBusBusy(unsigned long ulBase); +extern tBoolean I2CMasterBusy(unsigned long ulBase); +extern void I2CMasterControl(unsigned long ulBase, unsigned long ulCmd); +extern unsigned long I2CMasterDataGet(unsigned long ulBase); +extern void I2CMasterDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CMasterDisable(unsigned long ulBase); +extern void I2CMasterEnable(unsigned long ulBase); +extern unsigned long I2CMasterErr(unsigned long ulBase); +extern void I2CMasterInit(unsigned long ulBase, tBoolean bFast); +extern void I2CMasterIntClear(unsigned long ulBase); +extern void I2CMasterIntDisable(unsigned long ulBase); +extern void I2CMasterIntEnable(unsigned long ulBase); +extern tBoolean I2CMasterIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void I2CMasterSlaveAddrSet(unsigned long ulBase, + unsigned char ucSlaveAddr, + tBoolean bReceive); +extern unsigned long I2CSlaveDataGet(unsigned long ulBase); +extern void I2CSlaveDataPut(unsigned long ulBase, unsigned char ucData); +extern void I2CSlaveDisable(unsigned long ulBase); +extern void I2CSlaveEnable(unsigned long ulBase); +extern void I2CSlaveInit(unsigned long ulBase, unsigned char ucSlaveAddr); +extern void I2CSlaveIntClear(unsigned long ulBase); +extern void I2CSlaveIntDisable(unsigned long ulBase); +extern void I2CSlaveIntEnable(unsigned long ulBase); +extern tBoolean I2CSlaveIntStatus(unsigned long ulBase, tBoolean bMasked); +extern unsigned long I2CSlaveStatus(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __I2C_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/interrupt.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/interrupt.h new file mode 100644 index 0000000..edd8a08 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/interrupt.h @@ -0,0 +1,57 @@ +//***************************************************************************** +// +// interrupt.h - Prototypes for the NVIC Interrupt Controller Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __INTERRUPT_H__ +#define __INTERRUPT_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void IntMasterEnable(void); +extern void IntMasterDisable(void); +extern void IntRegister(unsigned long ulInterrupt, void (*pfnHandler)(void)); +extern void IntUnregister(unsigned long ulInterrupt); +extern void IntPriorityGroupingSet(unsigned long ulBits); +extern unsigned long IntPriorityGroupingGet(void); +extern void IntPrioritySet(unsigned long ulInterrupt, + unsigned char ucPriority); +extern long IntPriorityGet(unsigned long ulInterrupt); +extern void IntEnable(unsigned long ulInterrupt); +extern void IntDisable(unsigned long ulInterrupt); + +#ifdef __cplusplus +} +#endif + +#endif // __INTERRUPT_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/pwm.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/pwm.h new file mode 100644 index 0000000..0986833 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/pwm.h @@ -0,0 +1,161 @@ +//***************************************************************************** +// +// pwm.h - API function protoypes for Pulse Width Modulation (PWM) ports +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __PWM_H__ +#define __PWM_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following defines are passed to PWMGenConfigure() as the ulConfig +// parameter and specify the configuration of the PWM generator. +// +//***************************************************************************** +#define PWM_GEN_MODE_DOWN 0x00000000 // Down count mode +#define PWM_GEN_MODE_UP_DOWN 0x00000002 // Up/Down count mode +#define PWM_GEN_MODE_SYNC 0x00000038 // Synchronous updates +#define PWM_GEN_MODE_NO_SYNC 0x00000000 // Immediate updates +#define PWM_GEN_MODE_DBG_RUN 0x00000004 // Continue running in debug mode +#define PWM_GEN_MODE_DBG_STOP 0x00000000 // Stop running in debug mode + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM generator interrupts and +// triggers. +// +//***************************************************************************** +#define PWM_INT_CNT_ZERO 0x00000001 // Int if COUNT = 0 +#define PWM_INT_CNT_LOAD 0x00000002 // Int if COUNT = LOAD +#define PWM_INT_CNT_AU 0x00000004 // Int if COUNT = CMPA U +#define PWM_INT_CNT_AD 0x00000008 // Int if COUNT = CMPA D +#define PWM_INT_CNT_BU 0x00000010 // Int if COUNT = CMPA U +#define PWM_INT_CNT_BD 0x00000020 // Int if COUNT = CMPA D +#define PWM_TR_CNT_ZERO 0x00000100 // Trig if COUNT = 0 +#define PWM_TR_CNT_LOAD 0x00000200 // Trig if COUNT = LOAD +#define PWM_TR_CNT_AU 0x00000400 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_AD 0x00000800 // Trig if COUNT = CMPA D +#define PWM_TR_CNT_BU 0x00001000 // Trig if COUNT = CMPA U +#define PWM_TR_CNT_BD 0x00002000 // Trig if COUNT = CMPA D + +//***************************************************************************** +// +// Defines for enabling, disabling, and clearing PWM interrupts. +// +//***************************************************************************** +#define PWM_INT_GEN_0 0x00000001 // Generator 0 interrupt +#define PWM_INT_GEN_1 0x00000002 // Generator 1 interrupt +#define PWM_INT_GEN_2 0x00000004 // Generator 2 interrupt +#define PWM_INT_FAULT 0x00010000 // Fault interrupt + +//***************************************************************************** +// +// Defines to identify the generators within a module. +// +//***************************************************************************** +#define PWM_GEN_0 0x00000040 // Offset address of Gen0 +#define PWM_GEN_1 0x00000080 // Offset address of Gen1 +#define PWM_GEN_2 0x000000C0 // Offset address of Gen2 + +#define PWM_GEN_0_BIT 0x00000001 // Bit-wise ID for Gen0 +#define PWM_GEN_1_BIT 0x00000002 // Bit-wise ID for Gen1 +#define PWM_GEN_2_BIT 0x00000004 // Bit-wise ID for Gen2 + +//***************************************************************************** +// +// Defines to identify the outputs within a module. +// +//***************************************************************************** +#define PWM_OUT_0 0x00000040 // Encoded offset address of PWM0 +#define PWM_OUT_1 0x00000041 // Encoded offset address of PWM1 +#define PWM_OUT_2 0x00000082 // Encoded offset address of PWM2 +#define PWM_OUT_3 0x00000083 // Encoded offset address of PWM3 +#define PWM_OUT_4 0x000000C4 // Encoded offset address of PWM4 +#define PWM_OUT_5 0x000000C5 // Encoded offset address of PWM5 + +#define PWM_OUT_0_BIT 0x00000001 // Bit-wise ID for PWM0 +#define PWM_OUT_1_BIT 0x00000002 // Bit-wise ID for PWM1 +#define PWM_OUT_2_BIT 0x00000004 // Bit-wise ID for PWM2 +#define PWM_OUT_3_BIT 0x00000008 // Bit-wise ID for PWM3 +#define PWM_OUT_4_BIT 0x00000010 // Bit-wise ID for PWM4 +#define PWM_OUT_5_BIT 0x00000020 // Bit-wise ID for PWM5 + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void PWMGenConfigure(unsigned long ulBase, unsigned long ulGen, + unsigned long ulConfig); +extern void PWMGenPeriodSet(unsigned long ulBase, unsigned long ulGen, + unsigned long ulPeriod); +extern unsigned long PWMGenPeriodGet(unsigned long ulBase, + unsigned long ulGen); +extern void PWMGenEnable(unsigned long ulBase, unsigned long ulGen); +extern void PWMGenDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMPulseWidthSet(unsigned long ulBase, unsigned long ulPWMOut, + unsigned long ulWidth); +extern unsigned long PWMPulseWidthGet(unsigned long ulBase, + unsigned long ulPWMOut); +extern void PWMDeadBandEnable(unsigned long ulBase, unsigned long ulGen, + unsigned short usRise, unsigned short usFall); +extern void PWMDeadBandDisable(unsigned long ulBase, unsigned long ulGen); +extern void PWMSyncUpdate(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMSyncTimeBase(unsigned long ulBase, unsigned long ulGenBits); +extern void PWMOutputState(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bEnable); +extern void PWMOutputInvert(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bInvert); +extern void PWMOutputFault(unsigned long ulBase, unsigned long ulPWMOutBits, + tBoolean bFaultKill); +extern void PWMGenIntRegister(unsigned long ulBase, unsigned long ulGen, + void (*pfIntHandler)(void)); +extern void PWMGenIntUnregister(unsigned long ulBase, unsigned long ulGen); +extern void PWMFaultIntRegister(unsigned long ulBase, + void (*pfIntHandler)(void)); +extern void PWMFaultIntUnregister(unsigned long ulBase); +extern void PWMGenIntTrigEnable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern void PWMGenIntTrigDisable(unsigned long ulBase, unsigned long ulGen, + unsigned long ulIntTrig); +extern unsigned long PWMGenIntStatus(unsigned long ulBase, unsigned long ulGen, + tBoolean bMasked); +extern void PWMGenIntClear(unsigned long ulBase, unsigned long ulGen, + unsigned long ulInts); +extern void PWMIntEnable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMIntDisable(unsigned long ulBase, unsigned long ulGenFault); +extern void PWMFaultIntClear(unsigned long ulBase); +extern unsigned long PWMIntStatus(unsigned long ulBase, tBoolean bMasked); + +#ifdef __cplusplus +} +#endif + +#endif // __PWM_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/qei.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/qei.h new file mode 100644 index 0000000..9cea48b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/qei.h @@ -0,0 +1,104 @@ +//***************************************************************************** +// +// qei.h - Prototypes for the Quadrature Encoder Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __QEI_H__ +#define __QEI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to QEIConfigure as the ulConfig paramater. +// +//***************************************************************************** +#define QEI_CONFIG_CAPTURE_A 0x00000000 // Count on ChA edges only +#define QEI_CONFIG_CAPTURE_A_B 0x00000008 // Count on ChA and ChB edges +#define QEI_CONFIG_NO_RESET 0x00000000 // Do not reset on index pulse +#define QEI_CONFIG_RESET_IDX 0x00000010 // Reset position on index pulse +#define QEI_CONFIG_QUADRATURE 0x00000000 // ChA and ChB are quadrature +#define QEI_CONFIG_CLOCK_DIR 0x00000004 // ChA and ChB are clock and dir +#define QEI_CONFIG_NO_SWAP 0x00000000 // Do not swap ChA and ChB +#define QEI_CONFIG_SWAP 0x00000002 // Swap ChA and ChB + +//***************************************************************************** +// +// Values that can be passed to QEIVelocityConfigure as the ulPreDiv parameter. +// +//***************************************************************************** +#define QEI_VELDIV_1 0x00000000 // Predivide by 1 +#define QEI_VELDIV_2 0x00000040 // Predivide by 2 +#define QEI_VELDIV_4 0x00000080 // Predivide by 4 +#define QEI_VELDIV_8 0x000000C0 // Predivide by 8 +#define QEI_VELDIV_16 0x00000100 // Predivide by 16 +#define QEI_VELDIV_32 0x00000140 // Predivide by 32 +#define QEI_VELDIV_64 0x00000180 // Predivide by 64 +#define QEI_VELDIV_128 0x000001C0 // Predivide by 128 + +//***************************************************************************** +// +// Values that can be passed to QEIEnableInts, QEIDisableInts, and QEIClearInts +// as the ulIntFlags parameter, and returned by QEIGetIntStatus. +// +//***************************************************************************** +#define QEI_INTERROR 0x00000008 // Phase error detected +#define QEI_INTDIR 0x00000004 // Direction change +#define QEI_INTTIMER 0x00000002 // Velocity timer expired +#define QEI_INTINDEX 0x00000001 // Index pulse detected + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void QEIEnable(unsigned long ulBase); +extern void QEIDisable(unsigned long ulBase); +extern void QEIConfigure(unsigned long ulBase, unsigned long ulConfig, + unsigned long ulMaxPosition); +extern unsigned long QEIPositionGet(unsigned long ulBase); +extern void QEIPositionSet(unsigned long ulBase, unsigned long ulPosition); +extern long QEIDirectionGet(unsigned long ulBase); +extern tBoolean QEIErrorGet(unsigned long ulBase); +extern void QEIVelocityEnable(unsigned long ulBase); +extern void QEIVelocityDisable(unsigned long ulBase); +extern void QEIVelocityConfigure(unsigned long ulBase, unsigned long ulPreDiv, + unsigned long ulPeriod); +extern unsigned long QEIVelocityGet(unsigned long ulBase); +extern void QEIIntRegister(unsigned long ulBase, void (*pfnHandler)(void)); +extern void QEIIntUnregister(unsigned long ulBase); +extern void QEIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void QEIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long QEIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void QEIIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __QEI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/ssi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/ssi.h new file mode 100644 index 0000000..b697a10 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/ssi.h @@ -0,0 +1,88 @@ +//***************************************************************************** +// +// ssi.h - Prototypes for the Synchronous Serial Interface Driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SSI_H__ +#define __SSI_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to SSIIntEnable, SSIIntDisable, and SSIIntClear +// as the ulIntFlags parameter, and returned by SSIIntStatus. +// +//***************************************************************************** +#define SSI_TXFF 0x00000008 // TX FIFO half empty or less +#define SSI_RXFF 0x00000004 // RX FIFO half full or less +#define SSI_RXTO 0x00000002 // RX timeout +#define SSI_RXOR 0x00000001 // RX overrun + +//***************************************************************************** +// +// Values that can be passed to SSIConfig. +// +//***************************************************************************** +#define SSI_FRF_MOTO_MODE_0 0x00000000 // Moto fmt, polarity 0, phase 0 +#define SSI_FRF_MOTO_MODE_1 0x00000002 // Moto fmt, polarity 0, phase 1 +#define SSI_FRF_MOTO_MODE_2 0x00000001 // Moto fmt, polarity 1, phase 0 +#define SSI_FRF_MOTO_MODE_3 0x00000003 // Moto fmt, polarity 1, phase 1 +#define SSI_FRF_TI 0x00000010 // TI frame format +#define SSI_FRF_NMW 0x00000020 // National MicroWire frame format + +#define SSI_MODE_MASTER 0x00000000 // SSI master +#define SSI_MODE_SLAVE 0x00000001 // SSI slave +#define SSI_MODE_SLAVE_OD 0x00000002 // SSI slave with output disabled + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SSIConfig(unsigned long ulBase, unsigned long ulProtocol, + unsigned long ulMode, unsigned long ulBitRate, + unsigned long ulDataWidth); +extern void SSIDataGet(unsigned long ulBase, unsigned long *ulData); +extern long SSIDataNonBlockingGet(unsigned long ulBase, unsigned long *ulData); +extern void SSIDataPut(unsigned long ulBase, unsigned long ulData); +extern long SSIDataNonBlockingPut(unsigned long ulBase, unsigned long ulData); +extern void SSIDisable(unsigned long ulBase); +extern void SSIEnable(unsigned long ulBase); +extern void SSIIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void SSIIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern unsigned long SSIIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void SSIIntUnregister(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __SSI_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/sysctl.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/sysctl.h new file mode 100644 index 0000000..de5273f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/sysctl.h @@ -0,0 +1,285 @@ +//***************************************************************************** +// +// sysctl.h - Prototypes for the system control driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SYSCTL_H__ +#define __SYSCTL_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// The following are values that can be passed to the +// SysCtlPeripheralPresent(), SysCtlPeripheralEnable(), +// SysCtlPeripheralDisable(), and SysCtlPeripheralReset() APIs as the +// ulPeripheral parameter. The peripherals in the fourth group (upper nibble +// is 3) can only be used with the SysCtlPeripheralPresent() API. +// +//***************************************************************************** +#define SYSCTL_PERIPH_PWM 0x00100000 // PWM +#define SYSCTL_PERIPH_ADC 0x00010000 // ADC +#define SYSCTL_PERIPH_WDOG 0x00000008 // Watchdog +#define SYSCTL_PERIPH_UART0 0x10000001 // UART 0 +#define SYSCTL_PERIPH_UART1 0x10000002 // UART 1 +#define SYSCTL_PERIPH_SSI 0x10000010 // SSI +#define SYSCTL_PERIPH_QEI 0x10000100 // QEI +#define SYSCTL_PERIPH_I2C 0x10001000 // I2C +#define SYSCTL_PERIPH_TIMER0 0x10010000 // Timer 0 +#define SYSCTL_PERIPH_TIMER1 0x10020000 // Timer 1 +#define SYSCTL_PERIPH_TIMER2 0x10040000 // Timer 2 +#define SYSCTL_PERIPH_COMP0 0x11000000 // Analog comparator 0 +#define SYSCTL_PERIPH_COMP1 0x12000000 // Analog comparator 1 +#define SYSCTL_PERIPH_COMP2 0x14000000 // Analog comparator 2 +#define SYSCTL_PERIPH_GPIOA 0x20000001 // GPIO A +#define SYSCTL_PERIPH_GPIOB 0x20000002 // GPIO B +#define SYSCTL_PERIPH_GPIOC 0x20000004 // GPIO C +#define SYSCTL_PERIPH_GPIOD 0x20000008 // GPIO D +#define SYSCTL_PERIPH_GPIOE 0x20000010 // GPIO E +#define SYSCTL_PERIPH_MPU 0x30000080 // Cortex-M3 MPU +#define SYSCTL_PERIPH_TEMP 0x30000020 // Temperature sensor +#define SYSCTL_PERIPH_PLL 0x30000010 // PLL + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPinPresent() API +// as the ulPin parameter. +// +//***************************************************************************** +#define SYSCTL_PIN_PWM0 0x00000001 // PWM0 pin +#define SYSCTL_PIN_PWM1 0x00000002 // PWM1 pin +#define SYSCTL_PIN_PWM2 0x00000004 // PWM2 pin +#define SYSCTL_PIN_PWM3 0x00000008 // PWM3 pin +#define SYSCTL_PIN_PWM4 0x00000010 // PWM4 pin +#define SYSCTL_PIN_PWM5 0x00000020 // PWM5 pin +#define SYSCTL_PIN_C0MINUS 0x00000040 // C0- pin +#define SYSCTL_PIN_C0PLUS 0x00000080 // C0+ pin +#define SYSCTL_PIN_C0O 0x00000100 // C0o pin +#define SYSCTL_PIN_C1MINUS 0x00000200 // C1- pin +#define SYSCTL_PIN_C1PLUS 0x00000400 // C1+ pin +#define SYSCTL_PIN_C1O 0x00000800 // C1o pin +#define SYSCTL_PIN_C2MINUS 0x00001000 // C2- pin +#define SYSCTL_PIN_C2PLUS 0x00002000 // C2+ pin +#define SYSCTL_PIN_C2O 0x00004000 // C2o pin +#define SYSCTL_PIN_ADC0 0x00010000 // ADC0 pin +#define SYSCTL_PIN_ADC1 0x00020000 // ADC1 pin +#define SYSCTL_PIN_ADC2 0x00040000 // ADC2 pin +#define SYSCTL_PIN_ADC3 0x00080000 // ADC3 pin +#define SYSCTL_PIN_ADC4 0x00100000 // ADC4 pin +#define SYSCTL_PIN_ADC5 0x00200000 // ADC5 pin +#define SYSCTL_PIN_ADC6 0x00400000 // ADC6 pin +#define SYSCTL_PIN_ADC7 0x00800000 // ADC7 pin +#define SYSCTL_PIN_CCP0 0x01000000 // CCP0 pin +#define SYSCTL_PIN_CCP1 0x02000000 // CCP1 pin +#define SYSCTL_PIN_CCP2 0x04000000 // CCP2 pin +#define SYSCTL_PIN_CCP3 0x08000000 // CCP3 pin +#define SYSCTL_PIN_CCP4 0x10000000 // CCP4 pin +#define SYSCTL_PIN_CCP5 0x20000000 // CCP5 pin +#define SYSCTL_PIN_32KHZ 0x80000000 // 32kHz pin + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOSet() API as +// the ulVoltage value, or returned by the SysCtlLDOGet() API. +// +//***************************************************************************** +#define SYSCTL_LDO_2_25V 0x00000005 // LDO output of 2.25V +#define SYSCTL_LDO_2_30V 0x00000004 // LDO output of 2.30V +#define SYSCTL_LDO_2_35V 0x00000003 // LDO output of 2.35V +#define SYSCTL_LDO_2_40V 0x00000002 // LDO output of 2.40V +#define SYSCTL_LDO_2_45V 0x00000001 // LDO output of 2.45V +#define SYSCTL_LDO_2_50V 0x00000000 // LDO output of 2.50V +#define SYSCTL_LDO_2_55V 0x0000001f // LDO output of 2.55V +#define SYSCTL_LDO_2_60V 0x0000001e // LDO output of 2.60V +#define SYSCTL_LDO_2_65V 0x0000001d // LDO output of 2.65V +#define SYSCTL_LDO_2_70V 0x0000001c // LDO output of 2.70V +#define SYSCTL_LDO_2_75V 0x0000001b // LDO output of 2.75V + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlLDOConfigSet() API. +// +//***************************************************************************** +#define SYSCTL_LDOCFG_ARST 0x00000001 // Allow LDO failure to reset +#define SYSCTL_LDOCFG_NORST 0x00000000 // Do not reset on LDO failure + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlIntEnable(), +// SysCtlIntDisable(), and SysCtlIntClear() APIs, or returned in the bit mask +// by the SysCtlIntStatus() API. +// +//***************************************************************************** +#define SYSCTL_INT_PLL_LOCK 0x00000040 // PLL lock interrupt +#define SYSCTL_INT_CUR_LIMIT 0x00000020 // Current limit interrupt +#define SYSCTL_INT_IOSC_FAIL 0x00000010 // Internal oscillator failure int +#define SYSCTL_INT_MOSC_FAIL 0x00000008 // Main oscillator failure int +#define SYSCTL_INT_POR 0x00000004 // Power on reset interrupt +#define SYSCTL_INT_BOR 0x00000002 // Brown out interrupt +#define SYSCTL_INT_PLL_FAIL 0x00000001 // PLL failure interrupt + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlResetCauseClear() +// API or returned by the SysCtlResetCauseGet() API. +// +//***************************************************************************** +#define SYSCTL_CAUSE_LDO 0x00000020 // LDO power not OK reset +#define SYSCTL_CAUSE_SW 0x00000010 // Software reset +#define SYSCTL_CAUSE_WDOG 0x00000008 // Watchdog reset +#define SYSCTL_CAUSE_BOR 0x00000004 // Brown-out reset +#define SYSCTL_CAUSE_POR 0x00000002 // Power on reset +#define SYSCTL_CAUSE_EXT 0x00000001 // External reset + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlBrownOutConfigSet() +// API as the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_BOR_RESET 0x00000002 // Reset instead of interrupting +#define SYSCTL_BOR_RESAMPLE 0x00000001 // Resample BOR before asserting + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlPWMClockSet() API +// as the ulConfig parameter, and can be returned by the SysCtlPWMClockGet() +// API. +// +//***************************************************************************** +#define SYSCTL_PWMDIV_1 0x00000000 // PWM clock is processor clock /1 +#define SYSCTL_PWMDIV_2 0x00100000 // PWM clock is processor clock /2 +#define SYSCTL_PWMDIV_4 0x00120000 // PWM clock is processor clock /4 +#define SYSCTL_PWMDIV_8 0x00140000 // PWM clock is processor clock /8 +#define SYSCTL_PWMDIV_16 0x00160000 // PWM clock is processor clock /16 +#define SYSCTL_PWMDIV_32 0x00180000 // PWM clock is processor clock /32 +#define SYSCTL_PWMDIV_64 0x001A0000 // PWM clock is processor clock /64 + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlADCSpeedSet() API +// as the ulSpeed parameter, and can be returned by the SyCtlADCSpeedGet() +// API. +// +//***************************************************************************** +#define SYSCTL_ADCSPEED_1MSPS 0x00000300 // 1,000,000 samples per second +#define SYSCTL_ADCSPEED_500KSPS 0x00000200 // 500,000 samples per second +#define SYSCTL_ADCSPEED_250KSPS 0x00000100 // 250,000 samples per second +#define SYSCTL_ADCSPEED_125KSPS 0x00000000 // 125,000 samples per second + +//***************************************************************************** +// +// The following are values that can be passed to the SysCtlClockSet() API as +// the ulConfig parameter. +// +//***************************************************************************** +#define SYSCTL_SYSDIV_1 0x07800000 // Processor clock is osc/pll /1 +#define SYSCTL_SYSDIV_2 0x00C00000 // Processor clock is osc/pll /2 +#define SYSCTL_SYSDIV_3 0x01400000 // Processor clock is osc/pll /3 +#define SYSCTL_SYSDIV_4 0x01C00000 // Processor clock is osc/pll /4 +#define SYSCTL_SYSDIV_5 0x02400000 // Processor clock is osc/pll /5 +#define SYSCTL_SYSDIV_6 0x02C00000 // Processor clock is osc/pll /6 +#define SYSCTL_SYSDIV_7 0x03400000 // Processor clock is osc/pll /7 +#define SYSCTL_SYSDIV_8 0x03C00000 // Processor clock is osc/pll /8 +#define SYSCTL_SYSDIV_9 0x04400000 // Processor clock is osc/pll /9 +#define SYSCTL_SYSDIV_10 0x04C00000 // Processor clock is osc/pll /10 +#define SYSCTL_SYSDIV_11 0x05400000 // Processor clock is osc/pll /11 +#define SYSCTL_SYSDIV_12 0x05C00000 // Processor clock is osc/pll /12 +#define SYSCTL_SYSDIV_13 0x06400000 // Processor clock is osc/pll /13 +#define SYSCTL_SYSDIV_14 0x06C00000 // Processor clock is osc/pll /14 +#define SYSCTL_SYSDIV_15 0x07400000 // Processor clock is osc/pll /15 +#define SYSCTL_SYSDIV_16 0x07C00000 // Processor clock is osc/pll /16 +#define SYSCTL_USE_PLL 0x00000000 // System clock is the PLL clock +#define SYSCTL_USE_OSC 0x00003800 // System clock is the osc clock +#define SYSCTL_XTAL_3_57MHZ 0x00000100 // External crystal is 3.579545MHz +#define SYSCTL_XTAL_3_68MHZ 0x00000140 // External crystal is 3.6864MHz +#define SYSCTL_XTAL_4MHZ 0x00000180 // External crystal is 4MHz +#define SYSCTL_XTAL_4_09MHZ 0x000001C0 // External crystal is 4.096MHz +#define SYSCTL_XTAL_4_91MHZ 0x00000200 // External crystal is 4.9152MHz +#define SYSCTL_XTAL_5MHZ 0x00000240 // External crystal is 5MHz +#define SYSCTL_XTAL_5_12MHZ 0x00000280 // External crystal is 5.12MHz +#define SYSCTL_XTAL_6MHZ 0x000002C0 // External crystal is 6MHz +#define SYSCTL_XTAL_6_14MHZ 0x00000300 // External crystal is 6.144MHz +#define SYSCTL_XTAL_7_37MHZ 0x00000340 // External crystal is 7.3728MHz +#define SYSCTL_XTAL_8MHZ 0x00000380 // External crystal is 8MHz +#define SYSCTL_XTAL_8_19MHZ 0x000003C0 // External crystal is 8.192MHz +#define SYSCTL_OSC_MAIN 0x00000000 // Oscillator source is main osc +#define SYSCTL_OSC_INT 0x00000010 // Oscillator source is int. osc +#define SYSCTL_OSC_INT4 0x00000020 // Oscillator source is int. osc /4 +#define SYSCTL_INT_OSC_DIS 0x00000002 // Disable internal oscillator +#define SYSCTL_MAIN_OSC_DIS 0x00000001 // Disable main oscillator + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern unsigned long SysCtlSRAMSizeGet(void); +extern unsigned long SysCtlFlashSizeGet(void); +extern tBoolean SysCtlPinPresent(unsigned long ulPin); +extern tBoolean SysCtlPeripheralPresent(unsigned long ulPeripheral); +extern void SysCtlPeripheralReset(unsigned long ulPeripheral); +extern void SysCtlPeripheralEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepEnable(unsigned long ulPeripheral); +extern void SysCtlPeripheralDeepSleepDisable(unsigned long ulPeripheral); +extern void SysCtlPeripheralClockGating(tBoolean bEnable); +extern void SysCtlIntRegister(void (*pfnHandler)(void)); +extern void SysCtlIntUnregister(void); +extern void SysCtlIntEnable(unsigned long ulInts); +extern void SysCtlIntDisable(unsigned long ulInts); +extern void SysCtlIntClear(unsigned long ulInts); +extern unsigned long SysCtlIntStatus(tBoolean bMasked); +extern void SysCtlLDOSet(unsigned long ulVoltage); +extern unsigned long SysCtlLDOGet(void); +extern void SysCtlLDOConfigSet(unsigned long ulConfig); +extern void SysCtlReset(void); +extern void SysCtlSleep(void); +extern void SysCtlDeepSleep(void); +extern unsigned long SysCtlResetCauseGet(void); +extern void SysCtlResetCauseClear(unsigned long ulCauses); +extern void SysCtlBrownOutConfigSet(unsigned long ulConfig, + unsigned long ulDelay); +extern void SysCtlClockSet(unsigned long ulConfig); +extern unsigned long SysCtlClockGet(void); +extern void SysCtlPWMClockSet(unsigned long ulConfig); +extern unsigned long SysCtlPWMClockGet(void); +extern void SysCtlADCSpeedSet(unsigned long ulSpeed); +extern unsigned long SysCtlADCSpeedGet(void); +extern void SysCtlIOSCVerificationSet(tBoolean bEnable); +extern void SysCtlMOSCVerificationSet(tBoolean bEnable); +extern void SysCtlPLLVerificationSet(tBoolean bEnable); +extern void SysCtlClkVerificationClear(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSCTL_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/systick.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/systick.h new file mode 100644 index 0000000..beffd88 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/systick.h @@ -0,0 +1,55 @@ +//***************************************************************************** +// +// systick.h - Prototypes for the SysTick driver. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __SYSTICK_H__ +#define __SYSTICK_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void SysTickEnable(void); +extern void SysTickDisable(void); +extern void SysTickIntRegister(void (*pfnHandler)(void)); +extern void SysTickIntUnregister(void); +extern void SysTickIntEnable(void); +extern void SysTickIntDisable(void); +extern void SysTickPeriodSet(unsigned long ulPeriod); +extern unsigned long SysTickPeriodGet(void); +extern unsigned long SysTickValueGet(void); + +#ifdef __cplusplus +} +#endif + +#endif // __SYSTICK_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/timer.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/timer.h new file mode 100644 index 0000000..ef98c0d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/timer.h @@ -0,0 +1,137 @@ +//***************************************************************************** +// +// timer.h - Prototypes for the timer module +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to TimerConfigure as the ulConfig parameter. +// +//***************************************************************************** +#define TIMER_CFG_32_BIT_OS 0x00000001 // 32-bit one-shot timer +#define TIMER_CFG_32_BIT_PER 0x00000002 // 32-bit periodic timer +#define TIMER_CFG_32_RTC 0x01000000 // 32-bit RTC timer +#define TIMER_CFG_16_BIT_PAIR 0x04000000 // Two 16-bit timers +#define TIMER_CFG_A_ONE_SHOT 0x00000001 // Timer A one-shot timer +#define TIMER_CFG_A_PERIODIC 0x00000002 // Timer A periodic timer +#define TIMER_CFG_A_CAP_COUNT 0x00000003 // Timer A event counter +#define TIMER_CFG_A_CAP_TIME 0x00000007 // Timer A event timer +#define TIMER_CFG_A_PWM 0x0000000A // Timer A PWM output +#define TIMER_CFG_B_ONE_SHOT 0x00000100 // Timer B one-shot timer +#define TIMER_CFG_B_PERIODIC 0x00000200 // Timer B periodic timer +#define TIMER_CFG_B_CAP_COUNT 0x00000300 // Timer B event counter +#define TIMER_CFG_B_CAP_TIME 0x00000700 // Timer B event timer +#define TIMER_CFG_B_PWM 0x00000A00 // Timer B PWM output + +//***************************************************************************** +// +// Values that can be passed to TimerIntEnable, TimerIntDisable, and +// TimerIntClear as the ulIntFlags parameter, and returned from TimerIntStatus. +// +//***************************************************************************** +#define TIMER_CAPB_EVENT 0x00000400 // CaptureB event interrupt +#define TIMER_CAPB_MATCH 0x00000200 // CaptureB match interrupt +#define TIMER_TIMB_TIMEOUT 0x00000100 // TimerB time out interrupt +#define TIMER_RTC_MATCH 0x00000008 // RTC interrupt mask +#define TIMER_CAPA_EVENT 0x00000004 // CaptureA event interrupt +#define TIMER_CAPA_MATCH 0x00000002 // CaptureA match interrupt +#define TIMER_TIMA_TIMEOUT 0x00000001 // TimerA time out interrupt + +//***************************************************************************** +// +// Values that can be passed to TimerControlEvent as the ulEvent parameter. +// +//***************************************************************************** +#define TIMER_EVENT_POS_EDGE 0x00000000 // Count positive edges +#define TIMER_EVENT_NEG_EDGE 0x00000404 // Count negative edges +#define TIMER_EVENT_BOTH_EDGES 0x00000C0C // Count both edges + +//***************************************************************************** +// +// Values that can be passed to most of the timer APIs as the ulTimer +// parameter. +// +//***************************************************************************** +#define TIMER_A 0x000000ff // Timer A +#define TIMER_B 0x0000ff00 // Timer B +#define TIMER_BOTH 0x0000ffff // Timer Both + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern void TimerEnable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerDisable(unsigned long ulBase, unsigned long ulTimer); +extern void TimerConfigure(unsigned long ulBase, unsigned long ulConfig); +extern void TimerControlLevel(unsigned long ulBase, unsigned long ulTimer, + tBoolean bInvert); +extern void TimerControlTrigger(unsigned long ulBase, unsigned long ulTimer, + tBoolean bEnable); +extern void TimerControlEvent(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulEvent); +extern void TimerControlStall(unsigned long ulBase, unsigned long ulTimer, + tBoolean bStall); +extern void TimerRTCEnable(unsigned long ulBase); +extern void TimerRTCDisable(unsigned long ulBase); +extern void TimerPrescaleSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerPrescaleMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerPrescaleMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerLoadSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerLoadGet(unsigned long ulBase, unsigned long ulTimer); +extern unsigned long TimerValueGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerMatchSet(unsigned long ulBase, unsigned long ulTimer, + unsigned long ulValue); +extern unsigned long TimerMatchGet(unsigned long ulBase, + unsigned long ulTimer); +extern void TimerIntRegister(unsigned long ulBase, unsigned long ulTimer, + void (*pfnHandler)(void)); +extern void TimerIntUnregister(unsigned long ulBase, unsigned long ulTimer); +extern void TimerIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long TimerIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void TimerIntClear(unsigned long ulBase, unsigned long ulIntFlags); +extern void TimerQuiesce(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __TIMER_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/uart.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/uart.h new file mode 100644 index 0000000..43eb8d5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/uart.h @@ -0,0 +1,102 @@ +//***************************************************************************** +// +// uart.h - Defines and Macros for the UART. +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __UART_H__ +#define __UART_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Values that can be passed to UARTIntEnable, UARTIntDisable, and UARTIntClear +// as the ulIntFlags parameter, and returned from UARTIntStatus. +// +//***************************************************************************** +#define UART_INT_OE 0x400 // Overrun Error Interrupt Mask +#define UART_INT_BE 0x200 // Break Error Interrupt Mask +#define UART_INT_PE 0x100 // Parity Error Interrupt Mask +#define UART_INT_FE 0x080 // Framing Error Interrupt Mask +#define UART_INT_RT 0x040 // Receive Timeout Interrupt Mask +#define UART_INT_TX 0x020 // Transmit Interrupt Mask +#define UART_INT_RX 0x010 // Receive Interrupt Mask + +//***************************************************************************** +// +// Values that can be passed to UARTConfigSet as the ulConfig parameter and +// returned by UARTConfigGet in the pulConfig parameter. Additionally, the +// UART_CONFIG_PAR_* subset can be passed to UARTParityModeSet as the ulParity +// parameter, and are returned by UARTParityModeGet. +// +//***************************************************************************** +#define UART_CONFIG_WLEN_8 0x00000060 // 8 bit data +#define UART_CONFIG_WLEN_7 0x00000040 // 7 bit data +#define UART_CONFIG_WLEN_6 0x00000020 // 6 bit data +#define UART_CONFIG_WLEN_5 0x00000000 // 5 bit data +#define UART_CONFIG_STOP_ONE 0x00000000 // One stop bit +#define UART_CONFIG_STOP_TWO 0x00000008 // Two stop bits +#define UART_CONFIG_PAR_NONE 0x00000000 // No parity +#define UART_CONFIG_PAR_EVEN 0x00000006 // Even parity +#define UART_CONFIG_PAR_ODD 0x00000002 // Odd parity +#define UART_CONFIG_PAR_ONE 0x00000086 // Parity bit is one +#define UART_CONFIG_PAR_ZERO 0x00000082 // Parity bit is zero + +//***************************************************************************** +// +// API Function prototypes +// +//***************************************************************************** +extern void UARTParityModeSet(unsigned long ulBase, unsigned long ulParity); +extern unsigned long UARTParityModeGet(unsigned long ulBase); +extern void UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, + unsigned long ulConfig); +extern void UARTConfigGet(unsigned long ulBase, unsigned long *pulBaud, + unsigned long *pulConfig); +extern void UARTEnable(unsigned long ulBase); +extern void UARTDisable(unsigned long ulBase); +extern tBoolean UARTCharsAvail(unsigned long ulBase); +extern tBoolean UARTSpaceAvail(unsigned long ulBase); +extern long UARTCharNonBlockingGet(unsigned long ulBase); +extern long UARTCharGet(unsigned long ulBase); +extern tBoolean UARTCharNonBlockingPut(unsigned long ulBase, + unsigned char ucData); +extern void UARTCharPut(unsigned long ulBase, unsigned char ucData); +extern void UARTBreakCtl(unsigned long ulBase, tBoolean bBreakState); +extern void UARTIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void UARTIntUnregister(unsigned long ulBase); +extern void UARTIntEnable(unsigned long ulBase, unsigned long ulIntFlags); +extern void UARTIntDisable(unsigned long ulBase, unsigned long ulIntFlags); +extern unsigned long UARTIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void UARTIntClear(unsigned long ulBase, unsigned long ulIntFlags); + +#ifdef __cplusplus +} +#endif + +#endif // __UART_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/watchdog.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/watchdog.h new file mode 100644 index 0000000..ad8bc45 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/LuminaryCode/src/watchdog.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// watchdog.h - Prototypes for the Watchdog Timer API +// +// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's Stellaris Family of microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 816 of the Stellaris Driver Library. +// +//***************************************************************************** + +#ifndef __WATCHDOG_H__ +#define __WATCHDOG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +//***************************************************************************** +// +// Prototypes for the APIs. +// +//***************************************************************************** +extern tBoolean WatchdogRunning(unsigned long ulBase); +extern void WatchdogEnable(unsigned long ulBase); +extern void WatchdogResetEnable(unsigned long ulBase); +extern void WatchdogResetDisable(unsigned long ulBase); +extern void WatchdogLock(unsigned long ulBase); +extern void WatchdogUnlock(unsigned long ulBase); +extern tBoolean WatchdogLockState(unsigned long ulBase); +extern void WatchdogReloadSet(unsigned long ulBase, unsigned long ulLoadVal); +extern unsigned long WatchdogReloadGet(unsigned long ulBase); +extern unsigned long WatchdogValueGet(unsigned long ulBase); +extern void WatchdogIntRegister(unsigned long ulBase, void(*pfnHandler)(void)); +extern void WatchdogIntUnregister(unsigned long ulBase); +extern void WatchdogIntEnable(unsigned long ulBase); +extern unsigned long WatchdogIntStatus(unsigned long ulBase, tBoolean bMasked); +extern void WatchdogIntClear(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); +extern void WatchdogStallDisable(unsigned long ulBase); + +#ifdef __cplusplus +} +#endif + +#endif // __WATCHDOG_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/RTOSDemo.Opt b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/RTOSDemo.Opt new file mode 100644 index 0000000..425ad06 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/RTOSDemo.Opt @@ -0,0 +1,54 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + + cExt (*.c) + aExt (*.s*; *.src; *.a*) + oExt (*.obj) + lExt (*.lib) + tExt (*.txt; *.h; *.inc) + pExt (*.plm) + CppX (*.cpp) + DaveTm { 0,0,0,0,0,0,0,0 } + +Target (FreeRTOS_Demo), 0x0004 // Tools: 'ARM-ADS' +GRPOPT 1,(Demo_Source),1,0,0 +GRPOPT 2,(Libraries),0,0,0 +GRPOPT 3,(RTOS_Source),0,0,0 +GRPOPT 4,(Documentation),0,0,0 + +OPTFFF 1,1,2,301989888,0,0,0,0,<.\startup_rvmdk.S> +OPTFFF 1,2,1,167772160,0,0,0,0,<.\LuminaryCode\osram96x16.c> +OPTFFF 1,3,1,2,0,148,161,0,<.\main.c> { 44,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,12,0,0,0,27,4,0,0,178,1,0,0 } +OPTFFF 1,4,1,0,0,0,0,0,<..\Common\Minimal\semtest.c> +OPTFFF 1,5,1,989855744,0,0,0,0,<..\Common\Minimal\integer.c> +OPTFFF 1,6,1,939524096,0,0,0,0,<..\Common\Minimal\PollQ.c> +OPTFFF 1,7,1,201326592,0,0,0,0,<..\Common\Minimal\BlockQ.c> +OPTFFF 1,8,1,0,0,0,0,0,<.\heap\heap_1.c> +OPTFFF 2,9,4,0,0,0,0,0, +OPTFFF 3,10,1,0,0,0,0,0,<..\..\Source\tasks.c> +OPTFFF 3,11,1,0,0,0,0,0,<..\..\Source\list.c> +OPTFFF 3,12,1,0,0,0,0,0,<..\..\Source\queue.c> +OPTFFF 3,13,1,335544320,0,0,0,0,<..\..\Source\portable\RVDS\ARM_CM3\port.c> +OPTFFF 4,14,5,0,0,0,0,0,<.\readme.txt> + + +TARGOPT 1, (FreeRTOS_Demo) + ADSCLK=50000000 + OPTTT 1,1,1,0 + OPTHX 1,65535,0,0,0 + OPTLX 79,66,8,<.\rvmdk\> + OPTOX 16 + OPTLT 1,1,1,0,1,1,0,1,0,0,0,0 + OPTXL 1,1,1,1,1,1,1,0,0 + OPTFL 1,0,1 + OPTAX 0 + OPTDL (SARMCM3.DLL)()(DLM.DLL)(-pLM3S811)(SARMCM3.DLL)()(TLM.DLL)(-pLM3S811) + OPTDBG 48126,4,()()()()()()()()()() (BIN\lmidk-agdi.dll)()()() + OPTKEY 0,(DLGTARM)((1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)(103=-1,-1,-1,-1,0)(104=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(163=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1013=-1,-1,-1,-1,0)(171=-1,-1,-1,-1,0)(172=-1,-1,-1,-1,0)(173=-1,-1,-1,-1,0)(1014=-1,-1,-1,-1,0)(1016=-1,-1,-1,-1,0)(136=-1,-1,-1,-1,0)) + OPTKEY 0,(ARMDBGFLAGS)(-T5F) + OPTKEY 0,(LMIDK-AGDI)(-B0 -O1792) + OPTDF 0x84 + OPTLE <> + OPTLC <> +EndOpt + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/RTOSDemo.Uv2 b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/RTOSDemo.Uv2 new file mode 100644 index 0000000..11d87f4 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/RTOSDemo.Uv2 @@ -0,0 +1,116 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + +Target (FreeRTOS_Demo), 0x0004 // Tools: 'ARM-ADS' + +Group (Demo_Source) +Group (Libraries) +Group (RTOS_Source) +Group (Documentation) + +File 1,2,<.\startup_rvmdk.S> +File 1,1,<.\LuminaryCode\osram96x16.c> +File 1,1,<.\main.c> +File 1,1,<..\Common\Minimal\semtest.c> +File 1,1,<..\Common\Minimal\integer.c> +File 1,1,<..\Common\Minimal\PollQ.c> +File 1,1,<..\Common\Minimal\BlockQ.c> +File 1,1,<.\heap\heap_1.c> +File 2,4,<..\Common\drivers\LuminaryMicro\keil\driverlib.lib> +File 3,1,<..\..\Source\tasks.c> +File 3,1,<..\..\Source\list.c> +File 3,1,<..\..\Source\queue.c> +File 3,1,<..\..\Source\portable\RVDS\ARM_CM3\port.c> +File 4,5,<.\readme.txt> + + +Options 1,0,0 // Target 'FreeRTOS_Demo' + Device (LM3S811) + Vendor (Luminary Micro) + Cpu (IRAM(0x20000000-0x20001fff) IROM(0-0xffff) CLOCK(50000000) CPUTYPE("Cortex-M3")) + FlashUt () + StupF ("STARTUP\Luminary\Startup.s" ("Luminary Startup Code")) + FlashDR (LMIDK-AGDI(-U40296420 -O7 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_8 -FS00 -FL02000)) + DevID (4079) + Rgf (LM3Sxxx.H) + Mem () + C () + A () + RL () + OH () + DBC_IFX () + DBC_CMS () + DBC_AMS () + DBC_LMS () + UseEnv=0 + EnvBin () + EnvInc () + EnvLib () + EnvReg (ÿLuminary\) + OrgReg (ÿLuminary\) + TgStat=16 + OutDir (.\rvmdk\) + OutName (RTOSDemo) + GenApp=1 + GenLib=0 + GenHex=0 + Debug=1 + Browse=1 + LstDir (.\rvmdk\) + HexSel=1 + MG32K=0 + TGMORE=0 + RunUsr 0 0 <> + RunUsr 1 0 <> + BrunUsr 0 0 <> + BrunUsr 1 0 <> + CrunUsr 0 0 <> + CrunUsr 1 0 <> + SVCSID <> + GLFLAGS=1790 + ADSFLGA { 176,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ACPUTYP ("Cortex-M3") + RVDEV () + ADSTFLGA { 0,12,0,2,99,0,0,66,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSOCM { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSIRAM { 0,0,0,0,32,0,32,0,0 } + OCMADSIROM { 1,0,0,0,0,0,0,1,0 } + OCMADSXRAM { 0,0,0,0,0,0,0,0,0 } + OCR_RVCT { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,32,0,0,0,0,0,0,0,0,0,0,0 } + RV_STAVEC () + ADSCCFLG { 9,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSCMISC () + ADSCDEFN (RVDS_ARMCM3_LM3S102) + ADSCUDEF () + ADSCINCD (.;./LuminaryCode;..\..\Source\portable\RVDS\ARM_CM3;..\..\Source\include;..\Common\include) + ADSASFLG { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSAMISC () + ADSADEFN () + ADSAUDEF () + ADSAINCD () + PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + IncBld=1 + AlwaysBuild=0 + GenAsm=0 + AsmAsm=0 + PublicsOnly=0 + StopCode=3 + CustArgs () + LibMods () + ADSLDFG { 17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSLDTA (0x00000000) + ADSLDDA (0x20000000) + ADSLDSC () + ADSLDIB () + ADSLDIC () + ADSLDMC (--entry Reset_Handler --last xHeap) + ADSLDIF () + ADSLDDW () + OPTDL (SARMCM3.DLL)()(DLM.DLL)(-pLM3S811)(SARMCM3.DLL)()(TLM.DLL)(-pLM3S811) + OPTDBG 48126,4,()()()()()()()()()() (BIN\lmidk-agdi.dll)()()() + FLASH1 { 1,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0 } + FLASH2 (BIN\LMIDK-AGDI.DLL) + FLASH3 ("" ()) + FLASH4 () +EndOpt + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/heap/heap_1.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/heap/heap_1.c new file mode 100644 index 0000000..8224dde --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/heap/heap_1.c @@ -0,0 +1,137 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + + +/* + * The simplest possible implementation of pvPortMalloc(). Note that this + * implementation does NOT allow allocated memory to be freed again. + * + * See heap_2.c and heap_3.c for alternative implementations, and the memory + * management pages of http://www.FreeRTOS.org for more information. + */ +#include +#include "FreeRTOS.h" +#include "task.h" + + +/* Allocate the memory for the heap. The struct is used to force byte +alignment without using any non-portable code. */ +extern struct xRTOS_HEAP +{ + unsigned long ulDummy; + unsigned char ucHeap[ configTOTAL_HEAP_SIZE ]; +} xHeap; + +static size_t xNextFreeByte = ( size_t ) 0; +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +void *pvReturn = NULL; + + /* Ensure that blocks are always aligned to the required number of bytes. */ + #if portBYTE_ALIGNMENT != 1 + if( xWantedSize & portBYTE_ALIGNMENT_MASK ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + #endif + + vTaskSuspendAll(); + { + /* Check there is enough room left for the allocation. */ + if( ( ( xNextFreeByte + xWantedSize ) < configTOTAL_HEAP_SIZE ) && + ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) )/* Check for overflow. */ + { + /* Return the next free byte then increment the index past this + block. */ + pvReturn = &( xHeap.ucHeap[ xNextFreeByte ] ); + xNextFreeByte += xWantedSize; + } + } + xTaskResumeAll(); + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ + /* Memory cannot be freed using this scheme. See heap_2.c and heap_3.c + for alternative implementations, and the memory management pages of + http://www.FreeRTOS.org for more information. */ + ( void ) pv; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* Only required when static memory is not cleared. */ + xNextFreeByte = ( size_t ) 0; +} + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/main.c new file mode 100644 index 0000000..8538660 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/main.c @@ -0,0 +1,399 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * This project contains an application demonstrating the use of the + * FreeRTOS.org mini real time scheduler on the Luminary Micro LM3S811 Eval + * board. See http://www.FreeRTOS.org for more information. + * + * main() simply sets up the hardware, creates all the demo application tasks, + * then starts the scheduler. http://www.freertos.org/a00102.html provides + * more information on the standard demo tasks. + * + * In addition to a subset of the standard demo application tasks, main.c also + * defines the following tasks: + * + * + A 'Print' task. The print task is the only task permitted to access the + * LCD - thus ensuring mutual exclusion and consistent access to the resource. + * Other tasks do not access the LCD directly, but instead send the text they + * wish to display to the print task. The print task spends most of its time + * blocked - only waking when a message is queued for display. + * + * + A 'Button handler' task. The eval board contains a user push button that + * is configured to generate interrupts. The interrupt handler uses a + * semaphore to wake the button handler task - demonstrating how the priority + * mechanism can be used to defer interrupt processing to the task level. The + * button handler task sends a message both to the LCD (via the print task) and + * the UART where it can be viewed using a dumb terminal (via the UART to USB + * converter on the eval board). NOTES: The dumb terminal must be closed in + * order to reflash the microcontroller. A very basic interrupt driven UART + * driver is used that does not use the FIFO. 19200 baud is used. + * + * + A 'check' task. The check task only executes every five seconds but has a + * high priority so is guaranteed to get processor time. Its function is to + * check that all the other tasks are still operational and that no errors have + * been detected at any time. If no errors have every been detected 'PASS' is + * written to the display (via the print task) - if an error has ever been + * detected the message is changed to 'FAIL'. The position of the message is + * changed for each write. + */ + + + +/* Environment includes. */ +#include "DriverLib.h" + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +/* Demo app includes. */ +#include "integer.h" +#include "PollQ.h" +#include "semtest.h" +#include "BlockQ.h" + +/* Delay between cycles of the 'check' task. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) + +/* UART configuration - note this does not use the FIFO so is not very +efficient. */ +#define mainBAUD_RATE ( 19200 ) +#define mainFIFO_SET ( 0x10 ) + +/* Demo task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) + +/* Demo board specifics. */ +#define mainPUSH_BUTTON GPIO_PIN_4 + +/* Misc. */ +#define mainQUEUE_SIZE ( 3 ) +#define mainDEBOUNCE_DELAY ( ( portTickType ) 150 / portTICK_RATE_MS ) +#define mainNO_DELAY ( ( portTickType ) 0 ) +/* + * Configure the processor and peripherals for this demo. + */ +static void prvSetupHardware( void ); + +/* + * The 'check' task, as described at the top of this file. + */ +static void vCheckTask( void *pvParameters ); + +/* + * The task that is woken by the ISR that processes GPIO interrupts originating + * from the push button. + */ +static void vButtonHandlerTask( void *pvParameters ); + +/* + * The task that controls access to the LCD. + */ +static void vPrintTask( void *pvParameter ); + +/* String that is transmitted on the UART. */ +static char *cMessage = "Task woken by button interrupt! --- "; +static volatile char *pcNextChar; + +/* The semaphore used to wake the button handler task from within the GPIO +interrupt handler. */ +xSemaphoreHandle xButtonSemaphore; + +/* The queue used to send strings to the print task for display on the LCD. */ +xQueueHandle xPrintQueue; + +/* Newer library version. */ +extern void UARTConfigSetExpClk(unsigned long ulBase, unsigned long ulUARTClk, unsigned long ulBaud, unsigned long ulConfig); +/*-----------------------------------------------------------*/ + +int main( void ) +{ + /* Configure the clocks, UART and GPIO. */ + prvSetupHardware(); + + /* Create the semaphore used to wake the button handler task from the GPIO + ISR. */ + vSemaphoreCreateBinary( xButtonSemaphore ); + xSemaphoreTake( xButtonSemaphore, 0 ); + + /* Create the queue used to pass message to vPrintTask. */ + xPrintQueue = xQueueCreate( mainQUEUE_SIZE, sizeof( char * ) ); + + /* Start the standard demo tasks. */ + vStartIntegerMathTasks( tskIDLE_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + + /* Start the tasks defined within the file. */ + xTaskCreate( vCheckTask, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); + xTaskCreate( vButtonHandlerTask, "Status", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY + 1, NULL ); + xTaskCreate( vPrintTask, "Print", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL ); + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient heap to start the + scheduler. */ + + return 0; +} +/*-----------------------------------------------------------*/ + +static void vCheckTask( void *pvParameters ) +{ +portBASE_TYPE xErrorOccurred = pdFALSE; +portTickType xLastExecutionTime; +const char *pcPassMessage = "PASS"; +const char *pcFailMessage = "FAIL"; + + /* Initialise xLastExecutionTime so the first call to vTaskDelayUntil() + works correctly. */ + xLastExecutionTime = xTaskGetTickCount(); + + for( ;; ) + { + /* Perform this check every mainCHECK_DELAY milliseconds. */ + vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY ); + + /* Has an error been found in any task? */ + + if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + xErrorOccurred = pdTRUE; + } + + if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xErrorOccurred = pdTRUE; + } + + if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + xErrorOccurred = pdTRUE; + } + + if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + xErrorOccurred = pdTRUE; + } + + /* Send either a pass or fail message. If an error is found it is + never cleared again. We do not write directly to the LCD, but instead + queue a message for display by the print task. */ + if( xErrorOccurred == pdTRUE ) + { + xQueueSend( xPrintQueue, &pcFailMessage, portMAX_DELAY ); + } + else + { + xQueueSend( xPrintQueue, &pcPassMessage, portMAX_DELAY ); + } + } +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* Setup the PLL. */ + SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ ); + + /* Setup the push button. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + GPIODirModeSet(GPIO_PORTC_BASE, mainPUSH_BUTTON, GPIO_DIR_MODE_IN); + GPIOIntTypeSet( GPIO_PORTC_BASE, mainPUSH_BUTTON,GPIO_FALLING_EDGE ); + IntPrioritySet( INT_GPIOC, configKERNEL_INTERRUPT_PRIORITY ); + GPIOPinIntEnable( GPIO_PORTC_BASE, mainPUSH_BUTTON ); + IntEnable( INT_GPIOC ); + + + + /* Enable the UART. */ + SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + + /* Set GPIO A0 and A1 as peripheral function. They are used to output the + UART signals. */ + GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW ); + + /* Configure the UART for 8-N-1 operation. */ + UARTConfigSetExpClk( UART0_BASE, SysCtlClockGet(), mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE ); + + /* We don't want to use the fifo. This is for test purposes to generate + as many interrupts as possible. */ + HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET; + + /* Enable Tx interrupts. */ + HWREG( UART0_BASE + UART_O_IM ) |= UART_INT_TX; + IntPrioritySet( INT_UART0, configKERNEL_INTERRUPT_PRIORITY ); + IntEnable( INT_UART0 ); + + + /* Initialise the LCD> */ + OSRAMInit( false ); + OSRAMStringDraw("www.FreeRTOS.org", 0, 0); + OSRAMStringDraw("LM3S811 demo", 16, 1); +} +/*-----------------------------------------------------------*/ + +static void vButtonHandlerTask( void *pvParameters ) +{ +const char *pcInterruptMessage = "Int"; + + for( ;; ) + { + /* Wait for a GPIO interrupt to wake this task. */ + while( xSemaphoreTake( xButtonSemaphore, portMAX_DELAY ) != pdPASS ); + + /* Start the Tx of the message on the UART. */ + UARTIntDisable( UART0_BASE, UART_INT_TX ); + { + pcNextChar = cMessage; + + /* Send the first character. */ + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = *pcNextChar; + } + + pcNextChar++; + } + UARTIntEnable(UART0_BASE, UART_INT_TX); + + /* Queue a message for the print task to display on the LCD. */ + xQueueSend( xPrintQueue, &pcInterruptMessage, portMAX_DELAY ); + + /* Make sure we don't process bounces. */ + vTaskDelay( mainDEBOUNCE_DELAY ); + xSemaphoreTake( xButtonSemaphore, mainNO_DELAY ); + } +} + +/*-----------------------------------------------------------*/ + +void vUART_ISR(void) +{ +unsigned long ulStatus; + + /* What caused the interrupt. */ + ulStatus = UARTIntStatus( UART0_BASE, pdTRUE ); + + /* Clear the interrupt. */ + UARTIntClear( UART0_BASE, ulStatus ); + + /* Was a Tx interrupt pending? */ + if( ulStatus & UART_INT_TX ) + { + /* Send the next character in the string. We are not using the FIFO. */ + if( *pcNextChar != NULL ) + { + if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) ) + { + HWREG( UART0_BASE + UART_O_DR ) = *pcNextChar; + } + pcNextChar++; + } + } +} +/*-----------------------------------------------------------*/ + +void vGPIO_ISR( void ) +{ +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* Clear the interrupt. */ + GPIOPinIntClear( GPIO_PORTC_BASE, mainPUSH_BUTTON ); + + /* Wake the button handler task. */ + xSemaphoreGiveFromISR( xButtonSemaphore, &xHigherPriorityTaskWoken ); + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + +static void vPrintTask( void *pvParameters ) +{ +char *pcMessage; +unsigned portBASE_TYPE uxLine = 0, uxRow = 0; + + for( ;; ) + { + /* Wait for a message to arrive. */ + xQueueReceive( xPrintQueue, &pcMessage, portMAX_DELAY ); + + /* Write the message to the LCD. */ + uxRow++; + uxLine++; + OSRAMClear(); + OSRAMStringDraw( pcMessage, uxLine & 0x3f, uxRow & 0x01); + } +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/readme.txt b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/readme.txt new file mode 100644 index 0000000..371a25b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/readme.txt @@ -0,0 +1,36 @@ +/* + * This project contains an application demonstrating the use of the + * FreeRTOS.org mini real time scheduler on the Luminary Micro LM3S811 Eval + * board. See http://www.FreeRTOS.org for more information. + * + * main() simply sets up the hardware, creates all the demo application tasks, + * then starts the scheduler. http://www.freertos.org/a00102.html provides + * more information on the standard demo tasks. + * + * In addition to a subset of the standard demo application tasks, main.c also + * defines the following tasks: + * + * + A 'Print' task. The print task is the only task permitted to access the + * LCD - thus ensuring mutual exclusion and consistent access to the resource. + * Other tasks do not access the LCD directly, but instead send the text they + * wish to display to the print task. The print task spends most of its time + * blocked - only waking when a message is queued for display. + * + * + A 'Button handler' task. The eval board contains a user push button that + * is configured to generate interrupts. The interrupt handler uses a + * semaphore to wake the button handler task - demonstrating how the priority + * mechanism can be used to defer interrupt processing to the task level. The + * button handler task sends a message both to the LCD (via the print task) and + * the UART where it can be viewed using a dumb terminal (via the UART to USB + * converter on the eval board). NOTES: The dumb terminal must be closed in + * order to reflash the microcontroller. A very basic interrupt driven UART + * driver is used that does not use the FIFO. 19200 baud is used. + * + * + A 'check' task. The check task only executes every five seconds but has a + * high priority so is guaranteed to get processor time. Its function is to + * check that all the other tasks are still operational and that no errors have + * been detected at any time. If no errors have every been detected 'PASS' is + * written to the display (via the print task) - if an error has ever been + * detected the message is changed to 'FAIL'. The position of the message is + * changed for each write. + */ \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/startup_rvmdk.S b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/startup_rvmdk.S new file mode 100644 index 0000000..8cd8aaa --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S811_KEIL/startup_rvmdk.S @@ -0,0 +1,240 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for Stellaris. +; +; Copyright (c) 2006 Luminary Micro, Inc. All rights reserved. +; +; Software License Agreement +; +; Luminary Micro, Inc. (LMI) is supplying this software for use solely and +; exclusively on LMI's Stellaris Family of microcontroller products. +; +; The software is owned by LMI and/or its suppliers, and is protected under +; applicable copyright laws. All rights are reserved. Any use in violation of +; the foregoing restrictions may subject the user to criminal sanctions under +; applicable laws, as well as to civil liability for the breach of the terms +; and conditions of this license. +; +; THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +; OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +; MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +; LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +; CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 816 of the Stellaris Driver Library. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +; +;****************************************************************************** +Stack EQU 0x00000100 + +;****************************************************************************** +; +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +HeapMem + SPACE Heap + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; MPU Fault Handler + DCD IntDefaultHandler ; Bus Fault Handler + DCD IntDefaultHandler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD vPortSVCHandler ; SVCall Handler + DCD IntDefaultHandler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD xPortPendSVHandler ; PendSV Handler + DCD xPortSysTickHandler ; SysTick Handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD vGPIO_ISR ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD vUART_ISR ; UART0 + DCD IntDefaultHandler ; UART1 + DCD IntDefaultHandler ; SSI + DCD IntDefaultHandler ; I2C + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog + DCD IntDefaultHandler ; Timer 0A + DCD IntDefaultHandler ; Timer 0B + DCD IntDefaultHandler ; Timer 1A + DCD IntDefaultHandler ; Timer 1B + DCD IntDefaultHandler ; Timer 2A + DCD IntDefaultHandler ; Timer 2B + DCD IntDefaultHandler ; Comp 0 + DCD IntDefaultHandler ; Comp 1 + DCD IntDefaultHandler ; Comp 2 + DCD IntDefaultHandler ; System Control + DCD IntDefaultHandler ; Flash Control + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Call __main() in the C library, which will call the application + ; supplied main(). + ; + IMPORT __main + IMPORT vGPIO_ISR + IMPORT vUART_ISR + IMPORT xPortPendSVHandler + IMPORT xPortSysTickHandler + IMPORT vPortSVCHandler + + LDR R0, =__main + BX R0 + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. +; +;****************************************************************************** + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +; Note: +; Using READWRITE places Section .RTOSHeap in Region ER_RW. +; Using NOINIT places Section .RTOSHeap in Region ER_ZI,which means +; "ZEROINITIALIZE" (sic), and which is the last region in memory. Then +; we need to make this section the last section, which is somewhat tricky, +; because we cannot use the sectionname, but need to use a defined symbol: +; Linker option: "--last xHeap" + + EXPORT xHeap + + AREA RTOSHeap, DATA, NOINIT +xHeap + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/FreeRTOSConfig.h new file mode 100644 index 0000000..e2671c5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/FreeRTOSConfig.h @@ -0,0 +1,131 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 1 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 50000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 80 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 24000 ) ) +#define configMAX_TASK_NAME_LEN ( 12 ) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 1 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 10 +#define configGENERATE_RUN_TIME_STATS 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 + +/* This demo makes use of one or more example stats formatting functions. These +format the raw data provided by the uxTaskGetSystemState() function in to human +readable ASCII form. See the notes in the implementation of vTaskList() within +FreeRTOS/Source/tasks.c for limitations. */ +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 + +#define configKERNEL_INTERRUPT_PRIORITY ( ( unsigned char ) 7 << ( unsigned char ) 5 ) /* Priority 7, or 255 as only the top three bits are implemented. This is the lowest priority. */ +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( ( unsigned char ) 5 << ( unsigned char ) 5 ) /* Priority 5, or 160 as only the top three bits are implemented. */ + +extern volatile unsigned long ulHighFrequencyTimerTicks; +/* There is already a high frequency timer running - just reset its count back +to zero. */ +#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ( ulHighFrequencyTimerTicks = 0UL ) +#define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTimerTicks + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/IntQueueTimer.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/IntQueueTimer.c new file mode 100644 index 0000000..5d360cb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/IntQueueTimer.c @@ -0,0 +1,133 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Demo includes. */ +#include "IntQueueTimer.h" +#include "IntQueue.h" + +/* Library includes. */ +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "interrupt.h" +#include "sysctl.h" +#include "lmi_timer.h" + +#define tmrTIMER_2_FREQUENCY ( 2000UL ) +#define tmrTIMER_3_FREQUENCY ( 2001UL ) + +void vInitialiseTimerForIntQueueTest( void ) +{ +unsigned long ulFrequency; + + /* Timer 2 and 3 are utilised for this test. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER2 ); + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER3 ); + TimerConfigure( TIMER2_BASE, TIMER_CFG_32_BIT_PER ); + TimerConfigure( TIMER3_BASE, TIMER_CFG_32_BIT_PER ); + + /* Set the timer interrupts to be above the kernel. The interrupts are + assigned different priorities so they nest with each other. */ + IntPrioritySet( INT_TIMER2A, configMAX_SYSCALL_INTERRUPT_PRIORITY + ( 1 << 5 ) ); /* Shift left 5 as only the top 3 bits are implemented. */ + IntPrioritySet( INT_TIMER3A, configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* Ensure interrupts do not start until the scheduler is running. */ + portDISABLE_INTERRUPTS(); + + /* The rate at which the timers will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / tmrTIMER_2_FREQUENCY; + TimerLoadSet( TIMER2_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER2A ); + TimerIntEnable( TIMER2_BASE, TIMER_TIMA_TIMEOUT ); + + /* The rate at which the timers will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / tmrTIMER_3_FREQUENCY; + TimerLoadSet( TIMER3_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER3A ); + TimerIntEnable( TIMER3_BASE, TIMER_TIMA_TIMEOUT ); + + /* Enable both timers. */ + TimerEnable( TIMER2_BASE, TIMER_A ); + TimerEnable( TIMER3_BASE, TIMER_A ); +} +/*-----------------------------------------------------------*/ + +void vT2InterruptHandler( void ) +{ + TimerIntClear( TIMER2_BASE, TIMER_TIMA_TIMEOUT ); + portEND_SWITCHING_ISR( xFirstTimerHandler() ); +} +/*-----------------------------------------------------------*/ + +void vT3InterruptHandler( void ) +{ + TimerIntClear( TIMER3_BASE, TIMER_TIMA_TIMEOUT ); + portEND_SWITCHING_ISR( xSecondTimerHandler() ); +} + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/IntQueueTimer.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/IntQueueTimer.h new file mode 100644 index 0000000..83edd5d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/IntQueueTimer.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef INT_QUEUE_TIMER_H +#define INT_QUEUE_TIMER_H + +void vInitialiseTimerForIntQueueTest( void ); +portBASE_TYPE xTimer0Handler( void ); +portBASE_TYPE xTimer1Handler( void ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/Makefile b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/Makefile new file mode 100644 index 0000000..367ff9c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/Makefile @@ -0,0 +1,141 @@ +#/* +# FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. +# +# +# *************************************************************************** +# * * +# * FreeRTOS tutorial books are available in pdf and paperback. * +# * Complete, revised, and edited pdf reference manuals are also * +# * available. * +# * * +# * Purchasing FreeRTOS documentation will not only help you, by * +# * ensuring you get running as quickly as possible and with an * +# * in-depth knowledge of how to use FreeRTOS, it will also help * +# * the FreeRTOS project to continue with its mission of providing * +# * professional grade, cross platform, de facto standard solutions * +# * for microcontrollers - completely free of charge! * +# * * +# * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +# * * +# * Thank you for using FreeRTOS, and thank you for your support! * +# * * +# *************************************************************************** +# +# +# This file is part of the FreeRTOS distribution. +# +# FreeRTOS is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License (version 2) as published by the +# Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +# >>>NOTE<<< The modification to the GPL is included to allow you to +# distribute a combined work that includes FreeRTOS without being obliged to +# provide the source code for proprietary components outside of the FreeRTOS +# kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it +# can be viewed here: http://www.freertos.org/a00114.html and also obtained +# by writing to Richard Barry, contact details for whom are available on the +# FreeRTOS WEB site. +# +# 1 tab == 4 spaces! +# +# http://www.FreeRTOS.org - Documentation, latest information, license and +# contact details. +# +# http://www.SafeRTOS.com - A version that is certified for use in safety +# critical systems. +# +# http://www.OpenRTOS.com - Commercial support, development, porting, +# licensing and training services. +#*/ + + +#/************************************************************************* +# * Please ensure to read http://www.freertos.org/portLM3Sxxxx_Eclipse.html +# * which provides information on configuring and running this demo for the +# * various Luminary Micro EKs. +# *************************************************************************/ + +RTOS_SOURCE_DIR=../../../Source +DEMO_COMMON_DIR=../../Common/Minimal +DEMO_INCLUDE_DIR=../../Common/include +UIP_COMMON_DIR=../../Common/ethernet/uIP/uip-1.0/uip +LUMINARY_DRIVER_DIR=../../Common/drivers/LuminaryMicro + +CC=arm-none-eabi-gcc +OBJCOPY=arm-none-eabi-objcopy +LDSCRIPT=standalone.ld + +# should use --gc-sections but the debugger does not seem to be able to cope with the option. +LINKER_FLAGS=-nostartfiles -Xlinker -oRTOSDemo.axf -Xlinker -M -Xlinker -Map=rtosdemo.map -Xlinker --no-gc-sections + +DEBUG=-g +OPTIM=-O0 + + +CFLAGS=$(DEBUG) -I . -I $(RTOS_SOURCE_DIR)/include -I $(RTOS_SOURCE_DIR)/portable/GCC/ARM_CM3 \ + -I $(DEMO_INCLUDE_DIR) -D GCC_ARMCM3_LM3S102 -D inline= -mthumb -mcpu=cortex-m3 $(OPTIM) -T$(LDSCRIPT) \ + -D PACK_STRUCT_END=__attribute\(\(packed\)\) -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) -D sprintf=usprintf -D snprintf=usnprintf -D printf=uipprintf \ + -I $(UIP_COMMON_DIR) -I ./webserver -ffunction-sections -fdata-sections -I $(LUMINARY_DRIVER_DIR) + +SOURCE= main.c \ + timertest.c \ + ./ParTest/ParTest.c \ + rit128x96x4.c \ + osram128x64x4.c \ + formike128x128x16.c \ + $(LUMINARY_DRIVER_DIR)/ustdlib.c \ + $(DEMO_COMMON_DIR)/BlockQ.c \ + $(DEMO_COMMON_DIR)/blocktim.c \ + $(DEMO_COMMON_DIR)/death.c \ + $(DEMO_COMMON_DIR)/integer.c \ + $(DEMO_COMMON_DIR)/PollQ.c \ + $(DEMO_COMMON_DIR)/semtest.c \ + $(DEMO_COMMON_DIR)/GenQTest.c \ + $(DEMO_COMMON_DIR)/QPeek.c \ + $(DEMO_COMMON_DIR)/recmutex.c \ + $(DEMO_COMMON_DIR)/IntQueue.c \ + ./IntQueueTimer.c \ + ./webserver/uIP_Task.c \ + ./webserver/emac.c \ + ./webserver/httpd.c \ + ./webserver/httpd-cgi.c \ + ./webserver/httpd-fs.c \ + ./webserver/http-strings.c \ + $(UIP_COMMON_DIR)/uip_arp.c \ + $(UIP_COMMON_DIR)/psock.c \ + $(UIP_COMMON_DIR)/timer.c \ + $(UIP_COMMON_DIR)/uip.c \ + $(RTOS_SOURCE_DIR)/list.c \ + $(RTOS_SOURCE_DIR)/queue.c \ + $(RTOS_SOURCE_DIR)/tasks.c \ + $(RTOS_SOURCE_DIR)/portable/GCC/ARM_CM3/port.c \ + $(RTOS_SOURCE_DIR)/portable/MemMang/heap_2.c + +LIBS= $(LUMINARY_DRIVER_DIR)/arm-none-eabi-gcc/libdriver.a $(LUMINARY_DRIVER_DIR)/arm-none-eabi-gcc/libgr.a + +OBJS = $(SOURCE:.c=.o) + +all: RTOSDemo.bin + +RTOSDemo.bin : RTOSDemo.axf + $(OBJCOPY) RTOSDemo.axf -O binary RTOSDemo.bin + +RTOSDemo.axf : $(OBJS) startup.o Makefile + $(CC) $(CFLAGS) $(OBJS) startup.o $(LIBS) $(LINKER_FLAGS) + +$(OBJS) : %.o : %.c Makefile FreeRTOSConfig.h + $(CC) -c $(CFLAGS) $< -o $@ + +startup.o : startup.c Makefile + $(CC) -c $(CFLAGS) -O1 startup.c -o startup.o + +clean : + touch Makefile + cs-rm $(OBJS) + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/ParTest/ParTest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/ParTest/ParTest.c new file mode 100644 index 0000000..f7b26ef --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/ParTest/ParTest.c @@ -0,0 +1,113 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo includes. */ +#include "partest.h" + +/* Library includes. */ +#include "hw_types.h" +#include "gpio.h" +#include "hw_memmap.h" + + +/*-----------------------------------------------------------*/ + +void vParTestInitialise( void ) +{ + GPIODirModeSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT ); + GPIOPadConfigSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, 0 ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, xValue ); +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxParTestGetLED( unsigned portBASE_TYPE uxLED ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + return GPIOPinRead( GPIO_PORTF_BASE, GPIO_PIN_0 ); +} + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/bitmap.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/bitmap.h new file mode 100644 index 0000000..29f813f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/bitmap.h @@ -0,0 +1,336 @@ +#ifndef BITMAP_H +#define BITMAP_H + +#define bmpBITMAP_HEIGHT 50 +#define bmpBITMAP_WIDTH 128 + +const unsigned char pucBasicBitmap[] = +{ +0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, +0x00, 0x8f, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xf0, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, +0x00, 0x70, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0x87, 0x77, +0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x88, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0x80, 0x00, 0x8f, 0x8f, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x8f, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, +0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x08, 0x00, 0x88, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x70, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, +0x88, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x7f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf7, 0x88, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, +0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x88, 0x88, 0x88, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, +0x00, 0x00, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x07, 0xff, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, +0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x77, +0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x07, 0x70, 0x07, +0x88, 0x88, 0x88, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x00, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, +0x00 }; + +const unsigned char pucGrLibBitmap[] = +{ + IMAGE_FMT_4BPP_COMP, + 124, 0, + 49, 0, + + 15, + 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x00, + 0x20, 0x44, 0x20, + 0x00, 0x75, 0x00, + 0x69, 0x69, 0x69, + 0x00, 0xc2, 0x00, + 0x00, 0xd2, 0x00, + 0x38, 0xb6, 0x38, + 0x00, 0xea, 0x00, + 0x00, 0xf2, 0x00, + 0xaa, 0xb2, 0xaa, + 0x65, 0xff, 0x65, + 0x69, 0xff, 0x69, + 0x6d, 0xff, 0x6d, + 0x71, 0xff, 0x71, + 0xff, 0xff, 0xff, + + 0x03, 0x21, 0x33, 0x53, 0x33, 0x33, 0x33, 0xe9, 0xd4, 0xf8, 0xa7, 0x5f, + 0x17, 0x07, 0x06, 0x35, 0x33, 0x12, 0x03, 0x23, 0x96, 0x68, 0x88, 0x88, + 0x88, 0xe9, 0xd4, 0xf8, 0xa7, 0x5f, 0x17, 0x07, 0x06, 0x86, 0x69, 0x32, + 0x03, 0x29, 0x66, 0x65, 0x66, 0x66, 0x66, 0xe9, 0xd4, 0xf8, 0xa7, 0x5f, + 0x17, 0x07, 0x06, 0x56, 0x66, 0x92, 0x07, 0x78, 0x63, 0x11, 0x11, 0x11, + 0xe9, 0xd4, 0xa7, 0xf0, 0x5f, 0x17, 0x07, 0x07, 0x11, 0x36, 0x87, 0x78, + 0x0f, 0x63, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xe0, 0x17, 0x07, + 0x07, 0x00, 0x36, 0x87, 0x78, 0x63, 0xfe, 0x07, 0x07, 0x77, 0x2f, 0x07, + 0x07, 0x02, 0x36, 0x1e, 0x87, 0x78, 0x63, 0x07, 0x07, 0x77, 0x2f, 0x00, + 0x10, 0x01, 0x22, 0x20, 0x07, 0x00, 0x00, 0x22, 0x21, 0x84, 0x03, 0x36, + 0x87, 0x78, 0x63, 0x02, 0x02, 0xaa, 0x01, 0xa2, 0x22, 0x20, 0x02, 0x77, + 0x77, 0x77, 0xe9, 0x3a, 0x22, 0x22, 0x7a, 0xa4, 0x71, 0x20, 0x0a, 0x27, + 0xb8, 0x29, 0x72, 0xb2, 0x9e, 0x93, 0x36, 0x87, 0x78, 0x40, 0x63, 0x62, + 0x2a, 0xff, 0xf2, 0xaa, 0x40, 0x07, 0x08, 0xad, 0xdd, 0xdd, 0xdd, 0xe9, + 0xd7, 0x72, 0x00, 0x40, 0x00, 0xa6, 0xdd, 0xda, 0x70, 0x00, 0x00, 0x02, + 0x00, 0x77, 0xdd, 0xdc, 0xcc, 0xcd, 0xde, 0xc7, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x27, 0xde, 0xdc, 0x08, 0xcc, 0xcc, 0xdd, 0xea, 0x99, + 0x36, 0x87, 0x78, 0x40, 0x63, 0x69, 0x02, 0xaf, 0xaa, 0xf2, 0x2f, 0xa0, + 0x04, 0x02, 0xdb, 0xbb, 0xbb, 0xbb, 0xe9, 0xbc, 0xe7, 0x10, 0x20, 0x00, + 0x07, 0xa5, 0xbb, 0xbd, 0x70, 0x00, 0x10, 0x00, 0x27, 0xec, 0x3b, 0xcd, + 0xd7, 0x00, 0x00, 0x80, 0x9f, 0xbd, 0x20, 0x00, 0x00, 0x36, 0x87, 0x78, + 0x40, 0x63, 0x69, 0x02, 0xfa, 0x2a, 0xf2, 0x2f, 0xa0, 0x31, 0x02, 0xdb, + 0x43, 0x31, 0x42, 0x00, 0x07, 0xa7, 0x0a, 0x70, 0x00, 0x02, 0xdd, 0x41, + 0xcc, 0x21, 0xce, 0x04, 0x70, 0x00, 0x00, 0x02, 0x7d, 0x39, 0xbc, 0xcb, + 0x00, 0xbb, 0xbd, 0x20, 0x00, 0x00, 0x36, 0x87, 0x78, 0x20, 0x63, 0x00, + 0x69, 0xfa, 0x0a, 0xf2, 0x2f, 0xa0, 0x01, 0x02, 0xdb, 0xbb, 0xbb, 0xdd, + 0xdd, 0xdc, 0x11, 0x08, 0xe7, 0x00, 0x07, 0xad, 0xbb, 0xcd, 0xdd, 0xda, + 0x09, 0x70, 0x00, 0x2d, 0xcb, 0x41, 0xcc, 0xdd, 0xd1, 0x04, 0xe7, 0x00, + 0x00, 0x07, 0xeb, 0x51, 0xdc, 0xcd, 0x00, 0xdd, 0xdd, 0x20, 0x00, 0x00, + 0x36, 0x87, 0x78, 0x00, 0x63, 0x00, 0x00, 0x00, 0x02, 0xfa, 0x2a, 0xf2, + 0x00, 0xaf, 0xa0, 0x02, 0xdb, 0xbb, 0xbd, 0x72, 0x22, 0x00, 0x77, 0xdc, + 0xbb, 0xbb, 0xc7, 0x20, 0x07, 0x77, 0x04, 0x77, 0x77, 0xcb, 0xbb, 0xbc, + 0xd1, 0x20, 0x01, 0x28, 0x7d, 0xbb, 0x42, 0x27, 0x41, 0xcd, 0x20, 0x00, + 0x40, 0x27, 0x51, 0x72, 0x22, 0x22, 0x27, 0x7c, 0x20, 0x00, 0x00, 0x00, + 0x36, 0x87, 0x78, 0x63, 0x00, 0x00, 0x00, 0x00, 0x02, 0xaf, 0xaa, 0xfa, + 0xff, 0x20, 0x02, 0x10, 0xdb, 0xbb, 0xbe, 0x61, 0x2d, 0xbb, 0xbb, 0xcc, + 0xa8, 0x29, 0x00, 0x89, 0xbd, 0xc3, 0xeb, 0xbb, 0xbb, 0x00, 0xd7, 0x10, + 0x00, 0x00, 0x2c, 0xcb, 0xbb, 0xbd, 0x58, 0x70, 0x12, 0xc7, 0x13, 0x29, + 0x36, 0x87, 0x78, 0x40, 0x63, 0xa9, 0x00, 0xaf, 0xff, 0xff, 0xfa, 0x20, + 0x08, 0x02, 0xdb, 0xbb, 0xbd, 0x39, 0x07, 0xdb, 0xbb, 0x72, 0xcc, 0x03, + 0x8c, 0x82, 0xbd, 0x70, 0x84, 0xbc, 0x03, 0xd2, 0x00, 0x2d, 0xbb, 0xbb, + 0xd7, 0x19, 0x01, 0x02, 0x00, 0x00, 0x36, 0x87, 0x78, 0x63, 0xa2, 0x0a, + 0x10, 0xaf, 0xff, 0xa2, 0x0a, 0xbd, 0x20, 0x00, 0x00, 0x0c, 0x07, 0xdb, + 0xbb, 0xc7, 0xc9, 0x8e, 0x00, 0x2c, 0x40, 0xcb, 0xc4, 0x00, 0x7c, 0xbb, + 0xbb, 0xe7, 0x00, 0x06, 0x2d, 0xbb, 0xbb, 0xc7, 0x10, 0x92, 0x31, 0x36, + 0x10, 0x87, 0x78, 0x63, 0xab, 0x22, 0x22, 0x00, 0x00, 0x00, 0x02, 0xdb, + 0xbb, 0xbd, 0x20, 0x00, 0x00, 0x07, 0x18, 0xcb, 0xbb, 0xd7, 0x0a, 0x8d, + 0x00, 0x2d, 0xbb, 0x23, 0xbb, 0xc7, 0x82, 0x00, 0x2e, 0xbb, 0x39, 0x91, + 0x20, 0xbd, 0x72, 0x8b, 0x00, 0x00, 0x36, 0x87, 0x78, 0x48, 0x63, 0x33, + 0x02, 0x20, 0xe1, 0xdb, 0xbb, 0xbd, 0x01, 0x20, 0x00, 0x02, 0x7d, 0xbb, + 0xbb, 0xe2, 0x6b, 0x94, 0x8b, 0x00, 0x00, 0x81, 0xd7, 0x82, 0x00, 0x2d, + 0x00, 0xbb, 0xbb, 0xc7, 0x20, 0x2c, 0xcb, 0xbb, 0xbb, 0x10, 0xdd, 0x77, + 0x22, 0x7b, 0x36, 0x87, 0x78, 0x63, 0x80, 0x32, 0x02, 0xaa, 0xf2, 0x22, + 0x20, 0x02, 0xdb, 0x00, 0xbb, 0xbc, 0x77, 0x77, 0x77, 0xdb, 0xbb, 0xce, + 0x42, 0x71, 0x63, 0xdb, 0xbb, 0xbd, 0x20, 0x19, 0x7d, 0x10, 0xbb, 0xbb, + 0xd2, 0x82, 0x00, 0x27, 0xcb, 0xbb, 0x00, 0xc7, 0x20, 0x07, 0xeb, 0xbb, + 0xbb, 0xbb, 0xcd, 0x21, 0xd7, 0x72, 0x72, 0x36, 0x87, 0x78, 0x63, 0x32, + 0x01, 0x4f, 0xff, 0xf2, 0xaf, 0xa0, 0x02, 0xdb, 0x41, 0x03, 0xdd, 0xdc, + 0xbb, 0xbc, 0xd7, 0x20, 0x22, 0x89, 0x42, 0xbd, 0xba, 0x7d, 0xbb, 0xbb, + 0xd2, 0x82, 0x00, 0x02, 0x27, 0xcb, 0xbb, 0xcc, 0x20, 0x02, 0x89, 0xbb, + 0x08, 0xbb, 0xbc, 0xdd, 0x72, 0x31, 0x36, 0x87, 0x78, 0x40, 0x63, 0x31, + 0x02, 0xaf, 0xaa, 0xf2, 0x2f, 0xa0, 0x21, 0x02, 0xdb, 0x3a, 0xbb, 0xbb, + 0xc7, 0x20, 0x31, 0x88, 0x59, 0xdb, 0xbb, 0xbd, 0xb2, 0x7d, 0xbb, 0xbb, + 0x40, 0xd2, 0x7b, 0x27, 0xcb, 0xbb, 0xcc, 0x20, 0x00, 0x00, 0x27, 0xec, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xe7, 0x84, 0x29, 0x36, 0x87, 0x78, 0x63, + 0x31, 0x02, 0xfa, 0x02, 0x0a, 0xf2, 0x2f, 0xa0, 0x02, 0xdb, 0x42, 0xbb, + 0x31, 0xbb, 0xc7, 0x39, 0x5a, 0xdb, 0xbb, 0xbd, 0xb2, 0x08, 0x7d, 0xbb, + 0xbb, 0xd2, 0x7b, 0x27, 0xcb, 0xbb, 0x00, 0xcc, 0x20, 0x00, 0x02, 0x77, + 0xed, 0xcb, 0xbb, 0x00, 0xbb, 0xbb, 0xbd, 0x71, 0x00, 0x00, 0x36, 0x87, + 0x20, 0x78, 0x63, 0x31, 0x02, 0xfa, 0x0a, 0xf2, 0x2f, 0x00, 0xa0, 0x02, + 0xdb, 0xbb, 0xbb, 0xcd, 0xdd, 0xcb, 0x18, 0xbb, 0xbc, 0xe2, 0x69, 0x59, + 0xdb, 0xbb, 0xbd, 0x42, 0x20, 0x19, 0x7d, 0xbb, 0xbb, 0xd2, 0x7b, 0x27, + 0x10, 0xcb, 0xbb, 0xcb, 0x79, 0x02, 0x27, 0x7d, 0xdc, 0x00, 0xbb, 0xbb, + 0xbb, 0xe2, 0x00, 0x00, 0x36, 0x87, 0x20, 0x78, 0x63, 0x31, 0x02, 0xfa, + 0x2a, 0xf2, 0xaf, 0x00, 0xa0, 0x02, 0xdb, 0xbb, 0xbd, 0x72, 0x27, 0x4c, + 0x1d, 0xbb, 0xbb, 0xd7, 0x69, 0x59, 0x89, 0x20, 0x19, 0x42, 0x7d, 0x7e, + 0x2c, 0xbb, 0xbb, 0xc7, 0x7a, 0x00, 0x10, 0x22, 0x7c, 0xcb, 0x63, 0x36, + 0x87, 0x78, 0x63, 0x80, 0x31, 0x02, 0xaf, 0xfa, 0xff, 0xff, 0x20, 0x02, + 0x00, 0xdb, 0xbb, 0xbd, 0x20, 0x00, 0x2c, 0xcb, 0xbb, 0x28, 0xcb, 0x20, + 0x61, 0x00, 0x8c, 0x00, 0x00, 0x2d, 0x12, 0xbb, 0xbb, 0xd7, 0x82, 0x00, + 0x2e, 0xbe, 0x00, 0x21, 0x02, 0x7c, 0x63, 0x36, 0x87, 0x78, 0x63, 0x32, + 0x00, 0x2f, 0xff, 0xff, 0xfa, 0x00, 0x02, 0xdb, 0xbb, 0x00, 0xbd, 0x20, + 0x00, 0x07, 0xdb, 0xbb, 0xbe, 0x20, 0xc2, 0x62, 0x8c, 0x00, 0x00, 0x2c, + 0xcb, 0xc4, 0x00, 0x0c, 0x7d, 0xbb, 0xbb, 0xe7, 0x3a, 0x19, 0x2d, 0xbb, + 0x00, 0xbb, 0xc7, 0x00, 0x00, 0x36, 0x87, 0x78, 0x63, 0x80, 0x3a, 0x02, + 0xaa, 0xaa, 0x40, 0x00, 0x02, 0xdb, 0x00, 0xbb, 0xbd, 0x20, 0x00, 0x02, + 0xcc, 0xbb, 0xbd, 0x63, 0x70, 0x63, 0x8b, 0x00, 0x00, 0x07, 0x49, 0x7a, + 0x98, 0x09, 0xbb, 0xd2, 0x3a, 0x19, 0x2d, 0xbb, 0xbb, 0x01, 0xd7, 0x00, + 0x00, 0x36, 0x87, 0x78, 0x63, 0x3a, 0x14, 0xaa, 0x22, 0x20, 0x0b, 0xbd, + 0xc9, 0x7d, 0xbb, 0x30, 0xbb, 0xd2, 0x61, 0x8e, 0x00, 0x02, 0xeb, 0xbb, + 0x20, 0xbb, 0xd7, 0x79, 0x27, 0xcb, 0xbb, 0xbd, 0x70, 0x24, 0x00, 0x02, + 0x6a, 0x00, 0x7d, 0x6b, 0x36, 0x87, 0x24, 0x78, 0x63, 0x39, 0x02, 0xff, + 0x62, 0x02, 0xdb, 0x21, 0xbb, 0xbd, 0x21, 0x2e, 0xbb, 0xbb, 0xe7, 0x61, + 0x80, 0x8e, 0x00, 0x02, 0x7d, 0xbb, 0xbb, 0xbd, 0x72, 0x00, 0x22, 0x27, + 0xcc, 0xbb, 0xbb, 0xcd, 0x20, 0x00, 0x08, 0x07, 0xe7, 0x72, 0x22, 0xa3, + 0xe2, 0x00, 0x00, 0x00, 0x36, 0x87, 0x78, 0x63, 0x00, 0x00, 0x00, 0x02, + 0x20, 0xaf, 0xa0, 0xd2, 0xdb, 0xbb, 0xbd, 0x20, 0x00, 0x03, 0x00, 0x2b, + 0xcb, 0xbb, 0xc7, 0x10, 0x8f, 0x11, 0x01, 0x2d, 0xcb, 0xbb, 0xbb, 0xdd, + 0xb7, 0xcd, 0xd1, 0x00, 0xe7, 0x00, 0x00, 0x07, 0xdc, 0xdd, 0xcb, 0x7b, + 0x00, 0xdd, 0xcb, 0xbb, 0xbc, 0x72, 0x00, 0x00, 0x36, 0x10, 0x87, 0x78, + 0x63, 0x01, 0x00, 0x2a, 0xfa, 0x42, 0x01, 0x22, 0x20, 0x02, 0xdb, 0xbb, + 0xbd, 0x20, 0x01, 0xb0, 0xcc, 0x00, 0x8d, 0xb9, 0xec, 0xbb, 0xbb, 0xbb, + 0x00, 0xcc, 0xcb, 0xbb, 0xbb, 0xbe, 0x71, 0x00, 0x00, 0x05, 0x27, 0xcb, + 0xbb, 0xcc, 0xcc, 0x81, 0xce, 0x29, 0x08, 0x36, 0x87, 0x78, 0x63, 0x02, + 0xaa, 0xff, 0xff, 0x02, 0xff, 0xa0, 0x02, 0xdb, 0xbb, 0xbd, 0x61, 0x02, + 0x0e, 0xeb, 0xbb, 0xbd, 0x70, 0x5a, 0x8c, 0x09, 0x27, 0x00, 0xec, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xd7, 0x54, 0x10, 0xa1, 0xcb, 0xa4, 0xd2, + 0x31, 0x36, 0x87, 0x20, 0x78, 0x63, 0x01, 0x02, 0xff, 0xff, 0xff, 0xff, + 0x02, 0xa0, 0x07, 0xad, 0xdd, 0xda, 0x20, 0x99, 0xde, 0x1c, 0xdd, 0xde, + 0xc2, 0x21, 0x8d, 0x0a, 0x7c, 0xed, 0x04, 0xcc, 0xcc, 0xcc, 0xde, 0xd7, + 0x92, 0x2c, 0xed, 0x40, 0xdc, 0xa7, 0x36, 0x87, 0x78, 0x63, 0x00, 0x02, + 0x00, 0x22, 0x02, 0xaa, 0xaa, 0xaa, 0xaa, 0x20, 0x02, 0x1b, 0x77, 0x77, + 0x77, 0x5a, 0xc9, 0x72, 0x21, 0x8e, 0x88, 0xaa, 0x27, 0x77, 0x7b, 0x9d, + 0x12, 0x27, 0x77, 0x20, 0x77, 0xb7, 0x3d, 0x36, 0x87, 0x78, 0x63, 0x00, + 0x3e, 0x02, 0xaa, 0x43, 0x22, 0xc6, 0x87, 0x3e, 0x12, 0x21, 0x22, 0x22, + 0x06, 0x01, 0x22, 0x22, 0x21, 0x04, 0x00, 0x36, 0x87, 0x78, 0x63, 0x00, + 0x02, 0xfa, 0x22, 0x3f, 0xaa, 0x20, 0x26, 0xc6, 0x87, 0x3f, 0x07, 0x07, + 0x00, 0x36, 0x87, 0x78, 0x63, 0x00, 0x02, 0xfa, 0x02, 0x7e, 0xff, 0x07, + 0x07, 0x77, 0x2f, 0x07, 0x06, 0x36, 0x00, 0x87, 0x78, 0x63, 0x00, 0x02, + 0xff, 0xaa, 0xfa, 0x07, 0x44, 0x44, 0x44, 0x20, 0x02, 0xd9, 0xc1, 0xd4, + 0xf0, 0xa7, 0x5f, 0x17, 0x04, 0x42, 0x00, 0x00, 0x36, 0x00, 0x87, 0x78, + 0x63, 0x00, 0x02, 0xff, 0xff, 0xff, 0x9f, 0xe9, 0xa0, 0x0a, 0xc4, 0x94, + 0xa7, 0x5f, 0x17, 0x80, 0x04, 0xfa, 0x20, 0x00, 0x36, 0x87, 0x78, 0x63, + 0x13, 0x00, 0x00, 0xaf, 0x03, 0xa0, 0x0a, 0x07, 0xbf, 0xe0, 0x77, 0x2f, + 0x07, 0xfa, 0x20, 0x00, 0x36, 0x87, 0x00, 0x78, 0x63, 0x00, 0x00, 0x02, + 0xaa, 0xfa, 0xaa, 0x0f, 0xaa, 0xaa, 0x20, 0x02, 0xd9, 0xc1, 0xd4, 0xa7, + 0xe0, 0x5f, 0x17, 0x05, 0x00, 0x00, 0x36, 0x87, 0x78, 0x03, 0x63, 0x00, + 0x00, 0x00, 0x02, 0xff, 0xd9, 0xc1, 0xfc, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0x03, 0x36, 0x87, 0x23, 0x78, 0x63, 0x01, 0x02, 0x44, 0x20, 0x07, 0x07, + 0xf0, 0x77, 0x2f, 0x07, 0x05, 0x36, 0x87, 0x78, 0x63, 0xfe, 0x07, 0x07, + 0x77, 0x2f, 0x07, 0x07, 0x02, 0x36, 0x1f, 0x87, 0x78, 0x63, 0x07, 0x07, + 0x77, 0x2f, 0x07, 0xc0, 0x07, 0x02, 0x36, 0x87, 0x78, 0x63, 0x11, 0x11, + 0x7f, 0x11, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x00, 0x11, 0x36, + 0x87, 0x29, 0x66, 0x55, 0x55, 0x55, 0xfe, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, + 0x07, 0x07, 0x55, 0x00, 0x66, 0x92, 0x23, 0x96, 0x68, 0x88, 0x88, 0x88, + 0xfe, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x06, 0x86, 0x01, 0x69, 0x32, + 0x21, 0x33, 0x55, 0x55, 0x55, 0xe9, 0xfc, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0x07, 0x55, 0x33, 0x00, 0x12, +}; + + +#endif diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/formike128x128x16.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/formike128x128x16.c new file mode 100644 index 0000000..87ff5fe --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/formike128x128x16.c @@ -0,0 +1,902 @@ +//***************************************************************************** +// +// formike128x128x16.c - Display driver for the Formike Electronic +// KWH015C04-F01 CSTN panel with an ST7637 controller. +// +// Copyright (c) 2008 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. You may not combine +// this software with "viral" open-source software in order to form a larger +// program. Any use in violation of the foregoing restrictions may subject +// the user to criminal sanctions under applicable laws, as well as to civil +// liability for the breach of the terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2523 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3s3748_api +//! @{ +// +//***************************************************************************** + +#include "hw_gpio.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "gpio.h" +#include "sysctl.h" +#include "rom.h" +#include "grlib.h" +#include "formike128x128x16.h" +#include + +//***************************************************************************** +// +// Defines for the pins that are used to communicate with the ST7637. +// +//***************************************************************************** +#define LCD_A0_BASE GPIO_PORTB_BASE +#define LCD_A0_PIN GPIO_PIN_2 +#define LCD_WR_BASE GPIO_PORTC_BASE +#define LCD_WR_PIN GPIO_PIN_4 +#define LCD_RD_BASE GPIO_PORTC_BASE +#define LCD_RD_PIN GPIO_PIN_5 +#define LCD_BL_BASE GPIO_PORTF_BASE +#define LCD_BL_PIN GPIO_PIN_1 +#define LCD_DATA_BASE GPIO_PORTG_BASE + +//***************************************************************************** +// +// Translates a 24-bit RGB color to a display driver-specific color. +// +// \param c is the 24-bit RGB color. The least-significant byte is the blue +// channel, the next byte is the green channel, and the third byte is the red +// channel. +// +// This macro translates a 24-bit RGB color into a value that can be written +// into the display's frame buffer in order to reproduce that color, or the +// closest possible approximation of that color. +// +// \return Returns the display-driver specific color. +// +//***************************************************************************** +#define DPYCOLORTRANSLATE(c) ((((c) & 0x00ff0000) >> 19) | \ + ((((c) & 0x0000ff00) >> 5) & 0x000007e0) | \ + ((((c) & 0x000000ff) << 8) & 0x0000f800)) + +//***************************************************************************** +// +// Writes a data word to the ST7637. +// +//***************************************************************************** +static void +WriteData(unsigned char ucData) +{ + // + // Write the data to the data bus. + // + HWREG(LCD_DATA_BASE + GPIO_O_DATA + (0xff << 2)) = ucData; + + // + // Assert the write enable signal. + // + HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0; + + // + // Deassert the write enable signal. + // + HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; +} + +//***************************************************************************** +// +// Writes a command to the ST7637. +// +//***************************************************************************** +static void +WriteCommand(unsigned char ucData) +{ + // + // Write the command to the data bus. + // + HWREG(LCD_DATA_BASE + GPIO_O_DATA + (0xff << 2)) = ucData; + + // + // Set the A0 signal low, indicating a command. + // + HWREG(LCD_A0_BASE + GPIO_O_DATA + (LCD_A0_PIN << 2)) = 0; + + // + // Assert the write enable signal. + // + HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0; + + // + // Deassert the write enable signal. + // + HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; + + // + // Set the A0 signal high, indicating that following writes are data. + // + HWREG(LCD_A0_BASE + GPIO_O_DATA + (LCD_A0_PIN << 2)) = LCD_A0_PIN; +} + +//***************************************************************************** +// +//! Initializes the display driver. +//! +//! This function initializes the ST7637 display controller on the panel, +//! preparing it to display data. +//! +//! \return None. +// +//***************************************************************************** +void +Formike128x128x16Init(void) +{ + unsigned long ulClockMS, ulCount; + + // + // Get the value to pass to SysCtlDelay() in order to delay for 1 ms. + // + ulClockMS = SysCtlClockGet() / (3 * 1000); + + // + // Enable the GPIO peripherals used to interface to the ST7637. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + + // + // Configure the pins that connect to the LCD as GPIO outputs. + // + GPIOPinTypeGPIOOutput(LCD_A0_BASE, LCD_A0_PIN); + GPIOPinTypeGPIOOutput(LCD_WR_BASE, LCD_WR_PIN); + GPIOPinTypeGPIOOutput(LCD_RD_BASE, LCD_RD_PIN); + GPIOPinTypeGPIOOutput(LCD_BL_BASE, LCD_BL_PIN); + GPIOPinTypeGPIOOutput(LCD_DATA_BASE, 0xff); + + // + // Set the LCD control pins to their default values. + // + GPIOPinWrite(LCD_A0_BASE, LCD_A0_PIN, LCD_A0_PIN); + GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN | LCD_RD_PIN, + LCD_WR_PIN | LCD_RD_PIN); + GPIOPinWrite(LCD_BL_BASE, LCD_BL_PIN, 0); + GPIOPinWrite(LCD_DATA_BASE, 0xff, 0x00); + + // + // Perform a software reset of the ST7637. + // + WriteCommand(0x01); + + // + // Delay for 120ms. + // + SysCtlDelay(ulClockMS * 120); + + // + // Disable auto-load of mask rom data. + // + WriteCommand(0xD7); + WriteData(0xBF); + + // + // Set the OTP control mode to read. + // + WriteCommand(0xE0); + WriteData(0x00); + + // + // Delay for 10ms. + // + SysCtlDelay(ulClockMS * 10); + + // + // Start the OTP read. + // + WriteCommand(0xE3); + + // + // Delay for 20ms. + // + SysCtlDelay(ulClockMS * 20); + + // + // Cancel the OTP read (it should have finished by now). + // + WriteCommand(0xE1); + + // + // Turn off the display. + // + WriteCommand(0x28); + + // + // Exit sleep mode. + // + WriteCommand(0x11); + + // + // Delay for 50ms. + // + SysCtlDelay(ulClockMS * 50); + + // + // Program the LCD supply voltage V0 to 14V. + // + WriteCommand(0xC0); + WriteData(0x04); + WriteData(0x01); + + // + // Select an LCD bias voltage ratio of 1/12. + // + WriteCommand(0xC3); + WriteData(0x00); + + // + // Enable the x8 booster circuit. + // + WriteCommand(0xC4); + WriteData(0x07); + + // + // Invert the column scan direction for the panel. + // + WriteCommand(0xB7); + WriteData(0xC0); + + // + // Select 16bpp, 5-6-5 data input mode. + // + WriteCommand(0x3A); + WriteData(0x05); + + // + // Select the memory scanning direction. The scanning mode does not matter + // for this driver since the row/column selects will constrain the writes + // to the desired area of the display. + // + WriteCommand(0x36); + WriteData(0x00); + + // + // Turn on the display. + // + WriteCommand(0x29); + + // + // Clear the contents of the display buffer. + // + WriteCommand(0x2A); + WriteData(0x00); + WriteData(0x7F); + WriteCommand(0x2B); + WriteData(0x01); + WriteData(0x80); + WriteCommand(0x2c); + for(ulCount = 0; ulCount < (128 * 128); ulCount++) + { + WriteData(0x00); + WriteData(0x00); + } + + // + // Enable normal operation of the LCD. + // + WriteCommand(0x13); +} + +//***************************************************************************** +// +//! Turns on the backlight. +//! +//! This function turns on the backlight on the display. +//! +//! \return None. +// +//***************************************************************************** +void +Formike128x128x16BacklightOn(void) +{ + // + // Assert the signal that turns on the backlight. + // + HWREG(LCD_BL_BASE + GPIO_O_DATA + (LCD_BL_PIN << 2)) = LCD_BL_PIN; +} + +//***************************************************************************** +// +//! Turns off the backlight. +//! +//! This function turns off the backlight on the display. +//! +//! \return None. +// +//***************************************************************************** +void +Formike128x128x16BacklightOff(void) +{ + // + // Deassert the signal that turns on the backlight. + // + HWREG(LCD_BL_BASE + GPIO_O_DATA + (LCD_BL_PIN << 2)) = 0; +} + +//***************************************************************************** +// +//! Draws a pixel on the screen. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param lX is the X coordinate of the pixel. +//! \param lY is the Y coordinate of the pixel. +//! \param ulValue is the color of the pixel. +//! +//! This function sets the given pixel to a particular color. The coordinates +//! of the pixel are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16PixelDraw(void *pvDisplayData, long lX, long lY, + unsigned long ulValue) +{ + // + // Set the X address of the display cursor. + // + WriteCommand(0x2a); + WriteData(lX); + WriteData(lX); + + // + // Set the Y address of the display cursor. + // + WriteCommand(0x2b); + WriteData(lY + 1); + WriteData(lY + 1); + + // + // Write the pixel value. + // + WriteCommand(0x2c); + WriteData(ulValue >> 8); + WriteData(ulValue); +} + +//***************************************************************************** +// +//! Draws a horizontal sequence of pixels on the screen. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param lX is the X coordinate of the first pixel. +//! \param lY is the Y coordinate of the first pixel. +//! \param lX0 is sub-pixel offset within the pixel data, which is valid for 1 +//! or 4 bit per pixel formats. +//! \param lCount is the number of pixels to draw. +//! \param lBPP is the number of bits per pixel; must be 1, 4, or 8. +//! \param pucData is a pointer to the pixel data. For 1 and 4 bit per pixel +//! formats, the most significant bit(s) represent the left-most pixel. +//! \param pucPalette is a pointer to the palette used to draw the pixels. +//! +//! This function draws a horizontal sequence of pixels on the screen, using +//! the supplied palette. For 1 bit per pixel format, the palette contains +//! pre-translated colors; for 4 and 8 bit per pixel formats, the palette +//! contains 24-bit RGB values that must be translated before being written to +//! the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16PixelDrawMultiple(void *pvDisplayData, long lX, long lY, + long lX0, long lCount, long lBPP, + const unsigned char *pucData, + const unsigned char *pucPalette) +{ + unsigned long ulByte; + + // + // Set the extent of the line along the X axis. + // + WriteCommand(0x2a); + WriteData(lX); + WriteData(lX + lCount - 1); + + // + // Set the Y address of the display cursor. + // + WriteCommand(0x2b); + WriteData(lY + 1); + WriteData(lY + 1); + + // + // Write the data RAM write command. + // + WriteCommand(0x2c); + + // + // Determine how to interpret the pixel data based on the number of bits + // per pixel. + // + switch(lBPP) + { + // + // The pixel data is in 1 bit per pixel format. + // + case 1: + { + // + // Loop while there are more pixels to draw. + // + while(lCount) + { + // + // Get the next byte of image data. + // + ulByte = *pucData++; + + // + // Loop through the pixels in this byte of image data. + // + for(; (lX0 < 8) && lCount; lX0++, lCount--) + { + // + // Draw this pixel in the appropriate color. + // + lBPP = ((unsigned long *)pucPalette)[(ulByte >> + (7 - lX0)) & 1]; + WriteData(lBPP >> 8); + WriteData(lBPP); + } + + // + // Start at the beginning of the next byte of image data. + // + lX0 = 0; + } + + // + // The image data has been drawn. + // + break; + } + + // + // The pixel data is in 4 bit per pixel format. + // + case 4: + { + // + // Loop while there are more pixels to draw. "Duff's device" is + // used to jump into the middle of the loop if the first nibble of + // the pixel data should not be used. Duff's device makes use of + // the fact that a case statement is legal anywhere within a + // sub-block of a switch statement. See + // http://en.wikipedia.org/wiki/Duff's_device for detailed + // information about Duff's device. + // + switch(lX0 & 1) + { + case 0: + while(lCount) + { + // + // Get the upper nibble of the next byte of pixel data + // and extract the corresponding entry from the + // palette. + // + ulByte = (*pucData >> 4) * 3; + ulByte = (*(unsigned long *)(pucPalette + ulByte) & + 0x00ffffff); + + // + // Translate this palette entry and write it to the + // screen. + // + ulByte = DPYCOLORTRANSLATE(ulByte); + WriteData(ulByte >> 8); + WriteData(ulByte); + + // + // Decrement the count of pixels to draw. + // + lCount--; + + // + // See if there is another pixel to draw. + // + if(lCount) + { + case 1: + // + // Get the lower nibble of the next byte of pixel + // data and extract the corresponding entry from + // the palette. + // + ulByte = (*pucData++ & 15) * 3; + ulByte = (*(unsigned long *)(pucPalette + ulByte) & + 0x00ffffff); + + // + // Translate this palette entry and write it to the + // screen. + // + ulByte = DPYCOLORTRANSLATE(ulByte); + WriteData(ulByte >> 8); + WriteData(ulByte); + + // + // Decrement the count of pixels to draw. + // + lCount--; + } + } + } + + // + // The image data has been drawn. + // + break; + } + + // + // The pixel data is in 8 bit per pixel format. + // + case 8: + { + // + // Loop while there are more pixels to draw. + // + while(lCount--) + { + // + // Get the next byte of pixel data and extract the + // corresponding entry from the palette. + // + ulByte = *pucData++ * 3; + ulByte = *(unsigned long *)(pucPalette + ulByte) & 0x00ffffff; + + // + // Translate this palette entry and write it to the screen. + // + ulByte = DPYCOLORTRANSLATE(ulByte); + WriteData(ulByte >> 8); + WriteData(ulByte); + } + + // + // The image data has been drawn. + // + break; + } + } +} + +//***************************************************************************** +// +//! Flushes any cached drawing operations. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! +//! This functions flushes any cached drawing operations to the display. This +//! is useful when a local frame buffer is used for drawing operations, and the +//! flush would copy the local frame buffer to the display. For the ST7637 +//! driver, the flush is a no operation. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16Flush(void *pvDisplayData) +{ + // + // There is nothing to be done. + // +} + +//***************************************************************************** +// +//! Draws a horizontal line. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param lX1 is the X coordinate of the start of the line. +//! \param lX2 is the X coordinate of the end of the line. +//! \param lY is the Y coordinate of the line. +//! \param ulValue is the color of the line. +//! +//! This function draws a horizontal line on the display. The coordinates of +//! the line are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16LineDrawH(void *pvDisplayData, long lX1, long lX2, long lY, + unsigned long ulValue) +{ + // + // Set the extent of the line along the X axis. + // + WriteCommand(0x2a); + WriteData(lX1); + WriteData(lX2); + + // + // Set the Y address of the display cursor. + // + WriteCommand(0x2b); + WriteData(lY + 1); + WriteData(lY + 1); + + // + // Write the data RAM write command. + // + WriteCommand(0x2c); + + // + // Loop through the pixels of this horizontal line. + // + while(lX1++ <= lX2) + { + // + // Write the pixel value. + // + WriteData(ulValue >> 8); + WriteData(ulValue); + } +} + +//***************************************************************************** +// +//! Draws a vertical line. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param lX is the X coordinate of the line. +//! \param lY1 is the Y coordinate of the start of the line. +//! \param lY2 is the Y coordinate of the end of the line. +//! \param ulValue is the color of the line. +//! +//! This function draws a vertical line on the display. The coordinates of the +//! line are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16LineDrawV(void *pvDisplayData, long lX, long lY1, long lY2, + unsigned long ulValue) +{ + // + // Set the X address of the display cursor. + // + WriteCommand(0x2a); + WriteData(lX); + WriteData(lX); + + // + // Set the extent of the line along the Y axis. + // + WriteCommand(0x2b); + WriteData(lY1 + 1); + WriteData(lY2 + 1); + + // + // Write the data RAM write command. + // + WriteCommand(0x2c); + + // + // Loop through the pixels of this vertical line. + // + while(lY1++ <= lY2) + { + // + // Write the pixel value. + // + WriteData(ulValue >> 8); + WriteData(ulValue); + } +} + +//***************************************************************************** +// +//! Fills a rectangle. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param pRect is a pointer to the structure describing the rectangle. +//! \param ulValue is the color of the rectangle. +//! +//! This function fills a rectangle on the display. The coordinates of the +//! rectangle are assumed to be within the extents of the display, and the +//! rectangle specification is fully inclusive (i.e. both sXMin and sXMax are +//! drawn, along with sYMin and sYMax). +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16RectFill(void *pvDisplayData, const tRectangle *pRect, + unsigned long ulValue) +{ + long lCount; + + // + // Set the extent of the rectangle along the X axis. + // + WriteCommand(0x2a); + WriteData(pRect->sXMin); + WriteData(pRect->sXMax); + + // + // Set the extent of the rectangle along the Y axis. + // + WriteCommand(0x2b); + WriteData(pRect->sYMin + 1); + WriteData(pRect->sYMax + 1); + + // + // Write the data RAM write command. + // + WriteCommand(0x2c); + + // + // Loop through the pixels in this rectangle. + // + for(lCount = ((pRect->sXMax - pRect->sXMin + 1) * + (pRect->sYMax - pRect->sYMin + 1)); lCount > 0; lCount--) + { + // + // Write the pixel value. + // + WriteData(ulValue >> 8); + WriteData(ulValue); + } +} + +//***************************************************************************** +// +//! Translates a 24-bit RGB color to a display driver-specific color. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param ulValue is the 24-bit RGB color. The least-significant byte is the +//! blue channel, the next byte is the green channel, and the third byte is the +//! red channel. +//! +//! This function translates a 24-bit RGB color into a value that can be +//! written into the display's frame buffer in order to reproduce that color, +//! or the closest possible approximation of that color. +//! +//! \return Returns the display-driver specific color. +// +//***************************************************************************** +static unsigned long +Formike128x128x16ColorTranslate(void *pvDisplayData, unsigned long ulValue) +{ + // + // Translate from a 24-bit RGB color to a 5-6-5 RGB color. + // + return(DPYCOLORTRANSLATE(ulValue)); +} + +//***************************************************************************** +// +//! The display structure that describes the driver for the Formike Electronic +//! KWH015C04-F01 CSTN panel with an ST7637 controller. +// +//***************************************************************************** +const tDisplay g_sFormike128x128x16 = +{ + sizeof(tDisplay), + 0, + 128, + 128, + Formike128x128x16PixelDraw, + Formike128x128x16PixelDrawMultiple, + Formike128x128x16LineDrawH, + Formike128x128x16LineDrawV, + Formike128x128x16RectFill, + Formike128x128x16ColorTranslate, + Formike128x128x16Flush +}; + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + + + + + + + + + + + + + + + + +/* FreeRTOS.org demo wrappers. These are required so the prototypes for the +functions are the same as for the display drivers used by other evaluation +kits. */ + +static tContext sContext; + +void vFormike128x128x16Clear( void ) +{ +const tRectangle xRectangle = { 0, 0, 127, 127 }; + + GrContextForegroundSet( &sContext, ClrBlack ); + GrRectFill( &sContext, &xRectangle ); + GrContextForegroundSet(&sContext, ClrWhite); +} +/*-----------------------------------------------------------*/ + +void vFormike128x128x16StringDraw( const char *pcString, unsigned long lX, unsigned long lY, unsigned char ucColor ) +{ + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDraw( &sContext, pcString, strlen( pcString ), lX, lY, false ); +} +/*-----------------------------------------------------------*/ + +void vFormike128x128x16Init( unsigned long ul ) +{ +tRectangle rectScreen; +const unsigned char *pcAppName = "www.FreeRTOS.org"; + + ( void ) ul; + + Formike128x128x16Init(); + Formike128x128x16BacklightOn(); + GrContextInit(&sContext, &g_sFormike128x128x16); + GrContextFontSet(&sContext, &g_sFontCmss12); + rectScreen.sXMin = 0; + + /* Fill the screen with a black rectangle. */ + rectScreen.sYMin = 0; + rectScreen.sXMax = g_sFormike128x128x16.usWidth - 1; + rectScreen.sYMax = g_sFormike128x128x16.usHeight - 1; + GrContextForegroundSet(&sContext, ClrBlack); + GrRectFill(&sContext, &rectScreen); +} +/*-----------------------------------------------------------*/ + +void vFormike128x128x16ImageDraw( const unsigned char *pucImage, unsigned long ulX, unsigned long ulY, unsigned long ulWidth, unsigned long ulHeight ) +{ + GrImageDraw( &sContext, pucImage, ( long ) ulX, ( long ) ulY); +} + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/formike128x128x16.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/formike128x128x16.h new file mode 100644 index 0000000..feaec75 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/formike128x128x16.h @@ -0,0 +1,51 @@ +//***************************************************************************** +// +// formike128x128x16.h - Prototypes for the Formike Electronic KWH015C04-F01 +// display driver. +// +// Copyright (c) 2008 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. You may not combine +// this software with "viral" open-source software in order to form a larger +// program. Any use in violation of the foregoing restrictions may subject +// the user to criminal sanctions under applicable laws, as well as to civil +// liability for the breach of the terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2523 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __FORMIKE128X128X16_H__ +#define __FORMIKE128X128X16_H__ + +//***************************************************************************** +// +// Prototypes for the globals exported by this driver. +// +//***************************************************************************** +extern void Formike128x128x16Init(void); +extern void Formike128x128x16BacklightOn(void); +extern void Formike128x128x16BacklightOff(void); +extern const tDisplay g_sFormike128x128x16; + +/* FreeRTOS.org demo wrappers. These are required so the prototypes for the +functions are the same as for the display drivers used by other evaluation +kits. */ +void vFormike128x128x16Clear( void ); +void vFormike128x128x16StringDraw( const char *pcString, unsigned long lX, unsigned long lY, unsigned char ucColor ); +void vFormike128x128x16Init( unsigned long ul ); +void vFormike128x128x16ImageDraw( const unsigned char *pucImage, unsigned long ulX, unsigned long ulY, unsigned long ulWidth, unsigned long ulHeight ); + +#endif // __FORMIKE128X128X16_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/lcd_message.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/lcd_message.h new file mode 100644 index 0000000..ced7a1d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/lcd_message.h @@ -0,0 +1,9 @@ +#ifndef LCD_MESSAGE_H +#define LCD_MESSAGE_H + +typedef struct +{ + char *pcMessage; +} xOLEDMessage; + +#endif /* LCD_MESSAGE_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/main.c new file mode 100644 index 0000000..5054784 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/main.c @@ -0,0 +1,459 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * Creates all the demo application tasks, then starts the scheduler. The WEB + * documentation provides more details of the standard demo application tasks. + * In addition to the standard demo tasks, the following tasks and tests are + * defined and/or created within this file: + * + * "Fast Interrupt Test" - A high frequency periodic interrupt is generated + * using a free running timer to demonstrate the use of the + * configKERNEL_INTERRUPT_PRIORITY configuration constant. The interrupt + * service routine measures the number of processor clocks that occur between + * each interrupt - and in so doing measures the jitter in the interrupt timing. + * The maximum measured jitter time is latched in the ulMaxJitter variable, and + * displayed on the OLED display by the 'OLED' task as described below. The + * fast interrupt is configured and handled in the timertest.c source file. + * + * "OLED" task - the OLED task is a 'gatekeeper' task. It is the only task that + * is permitted to access the display directly. Other tasks wishing to write a + * message to the OLED send the message on a queue to the OLED task instead of + * accessing the OLED themselves. The OLED task just blocks on the queue waiting + * for messages - waking and displaying the messages as they arrive. + * + * "Check" hook - This only executes every five seconds from the tick hook. + * Its main function is to check that all the standard demo tasks are still + * operational. Should any unexpected behaviour within a demo task be discovered + * the tick hook will write an error to the OLED (via the OLED task). If all the + * demo tasks are executing with their expected behaviour then the check task + * writes PASS to the OLED (again via the OLED task), as described above. + * + * "uIP" task - This is the task that handles the uIP stack. All TCP/IP + * processing is performed in this task. + */ + + + + +/************************************************************************* + * Please ensure to read http://www.freertos.org/portLM3Sxxxx_Eclipse.html + * which provides information on configuring and running this demo for the + * various Luminary Micro EKs. + *************************************************************************/ + + + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +/* Hardware library includes. */ +#include "hw_memmap.h" +#include "hw_types.h" +#include "hw_sysctl.h" +#include "sysctl.h" +#include "gpio.h" +#include "grlib.h" +#include "rit128x96x4.h" +#include "osram128x64x4.h" +#include "formike128x128x16.h" + +/* Demo app includes. */ +#include "BlockQ.h" +#include "death.h" +#include "integer.h" +#include "blocktim.h" +#include "flash.h" +#include "partest.h" +#include "semtest.h" +#include "PollQ.h" +#include "lcd_message.h" +#include "bitmap.h" +#include "GenQTest.h" +#include "QPeek.h" +#include "recmutex.h" +#include "IntQueue.h" + +/*-----------------------------------------------------------*/ + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) + +/* Size of the stack allocated to the uIP task. */ +#define mainBASIC_WEB_STACK_SIZE ( configMINIMAL_STACK_SIZE * 3 ) + +/* The OLED task uses the sprintf function so requires a little more stack too. */ +#define mainOLED_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE + 50 ) + +/* Task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainGEN_QUEUE_TASK_PRIORITY ( tskIDLE_PRIORITY ) + +/* The maximum number of message that can be waiting for display at any one +time. */ +#define mainOLED_QUEUE_SIZE ( 3 ) + +/* Dimensions the buffer into which the jitter time is written. */ +#define mainMAX_MSG_LEN 25 + +/* The period of the system clock in nano seconds. This is used to calculate +the jitter time in nano seconds. */ +#define mainNS_PER_CLOCK ( ( unsigned portLONG ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) ) + +/* Constants used when writing strings to the display. */ +#define mainCHARACTER_HEIGHT ( 9 ) +#define mainMAX_ROWS_128 ( mainCHARACTER_HEIGHT * 14 ) +#define mainMAX_ROWS_96 ( mainCHARACTER_HEIGHT * 10 ) +#define mainMAX_ROWS_64 ( mainCHARACTER_HEIGHT * 7 ) +#define mainFULL_SCALE ( 15 ) +#define ulSSI_FREQUENCY ( 3500000UL ) + +/*-----------------------------------------------------------*/ + +/* + * The task that handles the uIP stack. All TCP/IP processing is performed in + * this task. + */ +extern void vuIP_Task( void *pvParameters ); + +/* + * The display is written two by more than one task so is controlled by a + * 'gatekeeper' task. This is the only task that is actually permitted to + * access the display directly. Other tasks wanting to display a message send + * the message to the gatekeeper. + */ +static void vOLEDTask( void *pvParameters ); + +/* + * Configure the hardware for the demo. + */ +static void prvSetupHardware( void ); + +/* + * Configures the high frequency timers - those used to measure the timing + * jitter while the real time kernel is executing. + */ +extern void vSetupHighFrequencyTimer( void ); + +/* + * The idle hook is used to run a test of the scheduler context switch + * mechanism. + */ +void vApplicationIdleHook( void ) __attribute__((naked)); +/*-----------------------------------------------------------*/ + +/* The queue used to send messages to the OLED task. */ +xQueueHandle xOLEDQueue; + +/* The welcome text. */ +const portCHAR * const pcWelcomeMessage = " www.FreeRTOS.org"; + +/* Variables used to detect the test in the idle hook failing. */ +unsigned portLONG ulIdleError = pdFALSE; + +/*-----------------------------------------------------------*/ + +/************************************************************************* + * Please ensure to read http://www.freertos.org/portLM3Sxxxx_Eclipse.html + * which provides information on configuring and running this demo for the + * various Luminary Micro EKs. + *************************************************************************/ +int main( void ) +{ + prvSetupHardware(); + + /* Create the queue used by the OLED task. Messages for display on the OLED + are received via this queue. */ + xOLEDQueue = xQueueCreate( mainOLED_QUEUE_SIZE, sizeof( xOLEDMessage ) ); + + /* Create the uIP task if running on a processor that includes a MAC and + PHY. */ + if( SysCtlPeripheralPresent( SYSCTL_PERIPH_ETH ) ) + { + xTaskCreate( vuIP_Task, ( signed portCHAR * ) "uIP", mainBASIC_WEB_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL ); + } + + /* Start the standard demo tasks. */ + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + vCreateBlockTimeTasks(); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); + vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY ); + vStartQueuePeekTasks(); + vStartRecursiveMutexTasks(); + vStartInterruptQueueTasks(); + + /* Start the tasks defined within this file/specific to this demo. */ + xTaskCreate( vOLEDTask, ( signed portCHAR * ) "OLED", mainOLED_TASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation in order to ascertain whether + or not the correct/expected number of tasks are running at any given time. */ + vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Configure the high frequency interrupt used to measure the interrupt + jitter time. */ + vSetupHighFrequencyTimer(); + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. */ + for( ;; ); + return 0; +} +/*-----------------------------------------------------------*/ + +void prvSetupHardware( void ) +{ + /* If running on Rev A2 silicon, turn the LDO voltage up to 2.75V. This is + a workaround to allow the PLL to operate reliably. */ + if( DEVICE_IS_REVA2 ) + { + SysCtlLDOSet( SYSCTL_LDO_2_75V ); + } + + /* Set the clocking to run from the PLL at 50 MHz */ + SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ ); + + /* Enable Port F for Ethernet LEDs + LED0 Bit 3 Output + LED1 Bit 2 Output */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF ); + GPIODirModeSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3), GPIO_DIR_MODE_HW ); + GPIOPadConfigSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3 ), GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + + vParTestInitialise(); +} +/*-----------------------------------------------------------*/ + +void vApplicationTickHook( void ) +{ +static xOLEDMessage xMessage = { "PASS" }; +static unsigned portLONG ulTicksSinceLastDisplay = 0; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* Called from every tick interrupt. Have enough ticks passed to make it + time to perform our health status check again? */ + ulTicksSinceLastDisplay++; + if( ulTicksSinceLastDisplay >= mainCHECK_DELAY ) + { + ulTicksSinceLastDisplay = 0; + + /* Has an error been found in any task? */ + if( xAreGenericQueueTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN GEN Q"; + } + else if( xAreQueuePeekTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN PEEK Q"; + } + else if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK Q"; + } + else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK TIME"; + } + else if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN SEMAPHORE"; + } + else if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN POLL Q"; + } + else if( xIsCreateTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN CREATE"; + } + else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN MATH"; + } + else if( xAreRecursiveMutexTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN REC MUTEX"; + } + else if( ulIdleError != pdFALSE ) + { + xMessage.pcMessage = "ERROR IN HOOK"; + } + else if( xAreIntQueueTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN INT QUEUE"; + } + + + /* Send the message to the OLED gatekeeper for display. */ + xHigherPriorityTaskWoken = pdFALSE; + xQueueSendFromISR( xOLEDQueue, &xMessage, &xHigherPriorityTaskWoken ); + } +} +/*-----------------------------------------------------------*/ + +void vOLEDTask( void *pvParameters ) +{ +xOLEDMessage xMessage; +unsigned portLONG ulY, ulMaxY; +static portCHAR cMessage[ mainMAX_MSG_LEN ]; +extern volatile unsigned portLONG ulMaxJitter; +unsigned portBASE_TYPE uxUnusedStackOnEntry, uxUnusedStackNow; +const unsigned portCHAR *pucImage; + +/* Functions to access the OLED. The one used depends on the dev kit +being used. */ +void ( *vOLEDInit )( unsigned portLONG ) = NULL; +void ( *vOLEDStringDraw )( const portCHAR *, unsigned portLONG, unsigned portLONG, unsigned portCHAR ) = NULL; +void ( *vOLEDImageDraw )( const unsigned portCHAR *, unsigned portLONG, unsigned portLONG, unsigned portLONG, unsigned portLONG ) = NULL; +void ( *vOLEDClear )( void ) = NULL; + + /* Just for demo purposes. */ + uxUnusedStackOnEntry = uxTaskGetStackHighWaterMark( NULL ); + + /* Map the OLED access functions to the driver functions that are appropriate + for the evaluation kit being used. */ + switch( HWREG( SYSCTL_DID1 ) & SYSCTL_DID1_PRTNO_MASK ) + { + case SYSCTL_DID1_PRTNO_6965 : + case SYSCTL_DID1_PRTNO_2965 : vOLEDInit = OSRAM128x64x4Init; + vOLEDStringDraw = OSRAM128x64x4StringDraw; + vOLEDImageDraw = OSRAM128x64x4ImageDraw; + vOLEDClear = OSRAM128x64x4Clear; + ulMaxY = mainMAX_ROWS_64; + pucImage = pucBasicBitmap; + break; + + case SYSCTL_DID1_PRTNO_1968 : + case SYSCTL_DID1_PRTNO_8962 : vOLEDInit = RIT128x96x4Init; + vOLEDStringDraw = RIT128x96x4StringDraw; + vOLEDImageDraw = RIT128x96x4ImageDraw; + vOLEDClear = RIT128x96x4Clear; + ulMaxY = mainMAX_ROWS_96; + pucImage = pucBasicBitmap; + break; + + default : vOLEDInit = vFormike128x128x16Init; + vOLEDStringDraw = vFormike128x128x16StringDraw; + vOLEDImageDraw = vFormike128x128x16ImageDraw; + vOLEDClear = vFormike128x128x16Clear; + ulMaxY = mainMAX_ROWS_128; + pucImage = pucGrLibBitmap; + break; + } + + ulY = ulMaxY; + + /* Initialise the OLED and display a startup message. */ + vOLEDInit( ulSSI_FREQUENCY ); + vOLEDStringDraw( "POWERED BY FreeRTOS", 0, 0, mainFULL_SCALE ); + vOLEDImageDraw( pucImage, 0, mainCHARACTER_HEIGHT + 1, bmpBITMAP_WIDTH, bmpBITMAP_HEIGHT ); + + for( ;; ) + { + /* Wait for a message to arrive that requires displaying. */ + xQueueReceive( xOLEDQueue, &xMessage, portMAX_DELAY ); + + /* Write the message on the next available row. */ + ulY += mainCHARACTER_HEIGHT; + if( ulY >= ulMaxY ) + { + ulY = mainCHARACTER_HEIGHT; + vOLEDClear(); + vOLEDStringDraw( pcWelcomeMessage, 0, 0, mainFULL_SCALE ); + } + + /* Display the message along with the maximum jitter time from the + high priority time test. */ + sprintf( cMessage, "%s [%uns]", xMessage.pcMessage, ulMaxJitter * mainNS_PER_CLOCK ); + vOLEDStringDraw( cMessage, 0, ulY, mainFULL_SCALE ); + } +} +/*-----------------------------------------------------------*/ + +void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName ) +{ + for( ;; ); +} + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/osram128x64x4.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/osram128x64x4.c new file mode 100644 index 0000000..3353a82 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/osram128x64x4.c @@ -0,0 +1,933 @@ +//***************************************************************************** +// +// osram128x64x4.c - Driver for the OSRAM 128x64x4 graphical OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3sx965_api +//! @{ +// +//***************************************************************************** + +#include "hw_ssi.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "osram128x64x4.h" + +//***************************************************************************** +// +// Flag to indicate if SSI port is enabled for OSRAM usage. +// +//***************************************************************************** +static volatile tBoolean g_bSSIEnabled = false; + +//***************************************************************************** +// +// Define the OSRAM 128x64x4 Remap Setting(s). This will be used in +// several places in the code to switch between vertical and horizontal +// address incrementing. +// +// The Remap Command (0xA0) takes one 8-bit parameter. The parameter is +// defined as follows. +// +// Bit 7: Reserved +// Bit 6: Disable(0)/Enable(1) COM Split Odd Even +// When enabled, the COM signals are split Odd on one side, even on +// the other. Otherwise, they are split 0-39 on one side, 40-79 on +// the other. +// Bit 5: Reserved +// Bit 4: Disable(0)/Enable(1) COM Remap +// When Enabled, ROW 0-79 map to COM 79-0 (i.e. reverse row order) +// Bit 3: Reserved +// Bit 2: Horizontal(0)/Vertical(1) Address Increment +// When set, data RAM address will increment along the column rather +// than along the row. +// Bit 1: Disable(0)/Enable(1) Nibble Remap +// When enabled, the upper and lower nibbles in the DATA bus for access +// to the data RAM are swapped. +// Bit 0: Disable(0)/Enable(1) Column Address Remap +// When enabled, DATA RAM columns 0-63 are remapped to Segment Columns +// 127-0. +// +//***************************************************************************** +#define OSRAM_INIT_REMAP 0x52 +#define OSRAM_INIT_OFFSET 0x4C +static const unsigned char g_pucOSRAM128x64x4VerticalInc[] = { 0xA0, 0x56 }; +static const unsigned char g_pucOSRAM128x64x4HorizontalInc[] = { 0xA0, 0x52 }; + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +// Note: This is the same font data that is used in the EK-LM3S811 +// osram96x16x1 driver. The single bit-per-pixel is expaned in the StringDraw +// function to the appropriate four bit-per-pixel gray scale format. +// +//***************************************************************************** +static const unsigned char g_pucFont[96][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD0303 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the command sequence, followed by that many bytes of command data. +// Note: This initialization sequence is derived from OSRAM App Note AN018. +// +//***************************************************************************** +static const unsigned char g_pucOSRAM128x64x4Init[] = +{ + // + // Column Address + // + 4, 0x15, 0, 63, 0xe3, + + // + // Row Address + // + 4, 0x75, 0, 63, 0xe3, + + // + // Contrast Control + // + 3, 0x81, 50, 0xe3, + + // + // Half Current Range + // + 2, 0x85, 0xe3, + + // + // Display Re-map + // + 3, 0xA0, OSRAM_INIT_REMAP, 0xe3, + + // + // Display Start Line + // + 3, 0xA1, 0, 0xe3, + + // + // Display Offset + // + 3, 0xA2, OSRAM_INIT_OFFSET, 0xe3, + + // + // Display Mode Normal + // + 2, 0xA4, 0xe3, + + // + // Multiplex Ratio + // + 3, 0xA8, 63, 0xe3, + + // + // Phase Length + // + 3, 0xB1, 0x22, 0xe3, + + // + // Row Period + // + 3, 0xB2, 70, 0xe3, + + // + // Display Clock Divide + // + 3, 0xB3, 0xF1, 0xe3, + + // + // VSL + // + 3, 0xBF, 0x0D, 0xe3, + + // + // VCOMH + // + 3, 0xBE, 0x02, 0xe3, + + // + // VP + // + 3, 0xBC, 0x10, 0xe3, + + // + // Gamma + // + 10, 0xB8, 0x01, 0x11, 0x22, 0x32, 0x43, 0x54, 0x65, 0x76, 0xe3, + + // + // Set DC-DC + 3, 0xAD, 0x03, 0xe3, + + // + // Display ON/OFF + // + 2, 0xAF, 0xe3, +}; + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of command bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteCommand(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Clear the command/control bit to enable command mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, 0); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of data bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteData(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Set the command/control bit to enable data mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display RAM. All pixels in the display will +//! be turned off. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Clear(void) +{ + static const unsigned char pucCommand1[] = { 0x15, 0, 63 }; + static const unsigned char pucCommand2[] = { 0x75, 0, 79 }; + unsigned long ulRow, ulColumn; + static unsigned char pucZeroBuffer[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; + + // + // Set the window to fill the entire display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); + OSRAMWriteCommand(pucCommand2, sizeof(pucCommand2)); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // In vertical address increment mode, loop through each column, filling + // each row with 0. + // + for(ulColumn = 0; ulColumn < (128/2); ulColumn++) + { + // + // 8 rows (bytes) per row of text. + // + for(ulRow = 0; ulRow < 80; ulRow += 8) + { + OSRAMWriteData(pucZeroBuffer, sizeof(pucZeroBuffer)); + } + } +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! rows from the top edge of the display. +//! \param ucLevel is the 4-bit grey scale value to be used for displayed text. +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \note Because the OLED display packs 2 pixels of data in a single byte, the +//! parameter \e ulX must be an even column number (e.g. 0, 2, 4, etc). +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4StringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY, unsigned char ucLevel) +{ + static unsigned char pucBuffer[8]; + unsigned long ulIdx1, ulIdx2; + unsigned char ucTemp; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT(ucLevel < 16); + + // + // Setup a window starting at the specified column and row, ending + // at the right edge of the display and 8 rows down (single character row). + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = 63; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + 7; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // Get a working copy of the current character and convert to an + // index into the character bit-map array. + // + ucTemp = *pcStr; + ucTemp &= 0x7F; + if(ucTemp < ' ') + { + ucTemp = ' '; + } + else + { + ucTemp -= ' '; + } + + // + // Build and display the character buffer. + // + for(ulIdx1 = 0; ulIdx1 < 3; ulIdx1++) + { + // + // Convert two columns of 1-bit font data into a single data + // byte column of 4-bit font data. + // + for(ulIdx2 = 0; ulIdx2 < 8; ulIdx2++) + { + pucBuffer[ulIdx2] = 0; + if(g_pucFont[ucTemp][ulIdx1*2] & (1 << ulIdx2)) + { + pucBuffer[ulIdx2] = ((ucLevel << 4) & 0xf0); + } + if((ulIdx1 < 2) && + (g_pucFont[ucTemp][ulIdx1*2+1] & (1 << ulIdx2))) + { + pucBuffer[ulIdx2] |= ((ucLevel << 0) & 0x0f); + } + } + + // + // If there is room, dump the single data byte column to the + // display. Otherwise, bail out. + // + if(ulX < 126) + { + OSRAMWriteData(pucBuffer, 8); + ulX += 2; + } + else + { + return; + } + } + + // + // Advance to the next character. + // + pcStr++; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! rows from the top of the display. +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in rows. +//! +//! This function will display a bitmap graphic on the display. Because of the +//! format of the display RAM, the starting column (/e ulX) and the number of +//! columns (/e ulWidth) must be an integer multiple of two. +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for two columns in the current row, with the leftmost +//! column being contained in bits 7:4 and the rightmost column being contained +//! in bits 3:0. +//! +//! For example, an image six columns wide and seven scan lines tall would +//! be arranged as follows (showing how the twenty one bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------------------+-------------------+-------------------+ +//! | Byte 0 | Byte 1 | Byte 2 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 3 | Byte 4 | Byte 5 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 6 | Byte 7 | Byte 8 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 9 | Byte 10 | Byte 11 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 12 | Byte 13 | Byte 14 | +//! +---------+---------+---------+--3------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 15 | Byte 16 | Byte 17 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 18 | Byte 19 | Byte 20 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! \endverbatim +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by` +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4ImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + static unsigned char pucBuffer[8]; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT((ulX + ulWidth) <= 128); + ASSERT((ulY + ulHeight) <= 64); + ASSERT((ulWidth & 1) == 0); + + // + // Setup a window starting at the specified column and row, and ending + // at the column + width and row+height. + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = (ulX + ulWidth - 2) / 2; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + ulHeight - 1; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4HorizontalInc, + sizeof(g_pucOSRAM128x64x4HorizontalInc)); + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write this row of image data. + // + OSRAMWriteData(pucImage, (ulWidth / 2)); + + // + // Advance to the next row of the image. + // + pucImage += (ulWidth / 2); + } +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Enable(unsigned long ulFrequency) +{ + unsigned long ulTemp; + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Configure the SSI0 port for master mode. + // + SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_2, SSI_MODE_MASTER, ulFrequency, 8); + + // + // (Re)Enable SSI control of the FSS pin. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Enable the SSI port. + // + SSIEnable(SSI0_BASE); + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Indicate that the OSRAM driver can use the SSI Port. + // + g_bSSIEnabled = true; +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Disable(void) +{ + unsigned long ulTemp; + + // + // Indicate that the OSRAM driver can no longer use the SSI Port. + // + g_bSSIEnabled = false; + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Disable SSI control of the FSS pin. + // + GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); + +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display and +//! configures the SSD0323 controller on the panel. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Init(unsigned long ulFrequency) +{ + unsigned long ulIdx; + + // + // Enable the SSI0 and GPIO port blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + + // + // Configure the SSI0CLK and SSIOTX pins for SSI operation. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_5, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the PC7 pin as a D/Cn signal for OLED device. + // + GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD); + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Configure and enable the SSI0 port for master mode. + // + OSRAM128x64x4Enable(ulFrequency); + + // + // Clear the frame buffer. + // + OSRAM128x64x4Clear(); + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOn(void) +{ + unsigned long ulIdx; + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOff(void) +{ + static const unsigned char pucCommand1[] = + { + 0xAE, 0xAD, 0x02 + }; + + // + // Turn off the DC-DC converter and the display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/osram128x64x4.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/osram128x64x4.h new file mode 100644 index 0000000..2ba7cb9 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/osram128x64x4.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// osram128x64x4.h - Prototypes for the driver for the OSRAM 128x64x4 graphical +// OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __OSRAM128X64X4_H__ +#define __OSRAM128X64X4_H__ + +//***************************************************************************** +// +// Prototypes for the driver APIs. +// +//***************************************************************************** +extern void OSRAM128x64x4Clear(void); +extern void OSRAM128x64x4StringDraw(const char *pcStr, + unsigned long ulX, + unsigned long ulY, + unsigned char ucLevel); +extern void OSRAM128x64x4ImageDraw(const unsigned char *pucImage, + unsigned long ulX, + unsigned long ulY, + unsigned long ulWidth, + unsigned long ulHeight); +extern void OSRAM128x64x4Init(unsigned long ulFrequency); +extern void OSRAM128x64x4Enable(unsigned long ulFrequency); +extern void OSRAM128x64x4Disable(void); +extern void OSRAM128x64x4DisplayOn(void); +extern void OSRAM128x64x4DisplayOff(void); + +//***************************************************************************** +// +// The following macro(s) map old names for the OSRAM functions to the new +// names. In new code, the new names should be used in favor of the old names. +// +//***************************************************************************** +#ifndef DEPRECATED +#define OSRAM128x64x1InitSSI OSRAM128x64x4Enable +#endif + +#endif // __OSRAM128X64X4_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/pack_struct_end.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/pack_struct_end.h new file mode 100644 index 0000000..621c9fe --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/pack_struct_end.h @@ -0,0 +1,2 @@ +/* Note used by this port of uIP, but required for compilation. */ + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/pack_struct_start.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/pack_struct_start.h new file mode 100644 index 0000000..621c9fe --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/pack_struct_start.h @@ -0,0 +1,2 @@ +/* Note used by this port of uIP, but required for compilation. */ + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/rit128x96x4.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/rit128x96x4.c new file mode 100644 index 0000000..cff38d5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/rit128x96x4.c @@ -0,0 +1,981 @@ +//***************************************************************************** +// +// rit128x96x4.c - Driver for the RIT 128x96x4 graphical OLED display. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1504-conf of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3sLM3S8962_api +//! @{ +// +//***************************************************************************** + +#include "hw_ssi.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "rit128x96x4.h" + +//***************************************************************************** +// +// Macros that define the peripheral, port, and pin used for the OLEDDC +// panel control signal. +// +//***************************************************************************** + +unsigned long ulGPIOId = 0, ulGPIOBase = 0, ulOLEDDC_PIN = 0, ulOLEDEN_PIN = 0; + +#define LM3S8962_SYSCTL_PERIPH_GPIO_OLEDDC SYSCTL_PERIPH_GPIOA +#define LM3S8962_GPIO_OLEDDC_BASE GPIO_PORTA_BASE +#define LM3S8962_GPIO_OLEDDC_PIN GPIO_PIN_6 +#define LM3S8962_GPIO_OLEDEN_PIN GPIO_PIN_7 + +#define LM3S1968_SYSCTL_PERIPH_GPIO_OLEDDC SYSCTL_PERIPH_GPIOH +#define LM3S1968_GPIO_OLEDDC_BASE GPIO_PORTH_BASE +#define LM3S1968_GPIO_OLEDDC_PIN GPIO_PIN_2 +#define LM3S1968_GPIO_OLEDEN_PIN GPIO_PIN_3 + + +//***************************************************************************** +// +// Flag to indicate if SSI port is enabled for display usage. +// +//***************************************************************************** +static volatile tBoolean g_bSSIEnabled = false; + +//***************************************************************************** +// +// Buffer for storing sequences of command and data for the display. +// +//***************************************************************************** +static unsigned char g_pucBuffer[8]; + +//***************************************************************************** +// +// Define the SSD1329 128x96x4 Remap Setting(s). This will be used in +// several places in the code to switch between vertical and horizontal +// address incrementing. Note that the controller support 128 rows while +// the RIT display only uses 96. +// +// The Remap Command (0xA0) takes one 8-bit parameter. The parameter is +// defined as follows. +// +// Bit 7: Reserved +// Bit 6: Disable(0)/Enable(1) COM Split Odd Even +// When enabled, the COM signals are split Odd on one side, even on +// the other. Otherwise, they are split 0-63 on one side, 64-127 on +// the other. +// Bit 5: Reserved +// Bit 4: Disable(0)/Enable(1) COM Remap +// When Enabled, ROW 0-127 map to COM 127-0 (i.e. reverse row order) +// Bit 3: Reserved +// Bit 2: Horizontal(0)/Vertical(1) Address Increment +// When set, data RAM address will increment along the column rather +// than along the row. +// Bit 1: Disable(0)/Enable(1) Nibble Remap +// When enabled, the upper and lower nibbles in the DATA bus for access +// to the data RAM are swapped. +// Bit 0: Disable(0)/Enable(1) Column Address Remap +// When enabled, DATA RAM columns 0-63 are remapped to Segment Columns +// 127-0. +// +//***************************************************************************** +#define RIT_INIT_REMAP 0x52 // app note says 0x51 +#define RIT_INIT_OFFSET 0x00 +static const unsigned char g_pucRIT128x96x4VerticalInc[] = { 0xA0, 0x56 }; +static const unsigned char g_pucRIT128x96x4HorizontalInc[] = { 0xA0, 0x52 }; + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +// Note: This is the same font data that is used in the EK-LM3S811 +// osram96x16x1 driver. The single bit-per-pixel is expaned in the StringDraw +// function to the appropriate four bit-per-pixel gray scale format. +// +//***************************************************************************** +static const unsigned char g_pucFont[96][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD1329 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the command sequence, followed by that many bytes of command data. +// Note: This initialization sequence is derived from RIT App Note for +// the P14201. Values used are from the RIT app note, except where noted. +// +//***************************************************************************** +static const unsigned char g_pucRIT128x96x4Init[] = +{ + // + // Unlock commands + // + 3, 0xFD, 0x12, 0xe3, + + // + // Display off + // + 2, 0xAE, 0xe3, + + // + // Icon off + // + 3, 0x94, 0, 0xe3, + + // + // Multiplex ratio + // + 3, 0xA8, 95, 0xe3, + + // + // Contrast + // + 3, 0x81, 0xb7, 0xe3, + + // + // Pre-charge current + // + 3, 0x82, 0x3f, 0xe3, + + // + // Display Re-map + // + 3, 0xA0, RIT_INIT_REMAP, 0xe3, + + // + // Display Start Line + // + 3, 0xA1, 0, 0xe3, + + // + // Display Offset + // + 3, 0xA2, RIT_INIT_OFFSET, 0xe3, + + // + // Display Mode Normal + // + 2, 0xA4, 0xe3, + + // + // Phase Length + // + 3, 0xB1, 0x11, 0xe3, + + // + // Frame frequency + // + 3, 0xB2, 0x23, 0xe3, + + // + // Front Clock Divider + // + 3, 0xB3, 0xe2, 0xe3, + + // + // Set gray scale table. App note uses default command: + // 2, 0xB7, 0xe3 + // This gray scale attempts some gamma correction to reduce the + // the brightness of the low levels. + // + 17, 0xB8, 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 19, 22, 26, 30, 0xe3, + + // + // Second pre-charge period. App note uses value 0x04. + // + 3, 0xBB, 0x01, 0xe3, + + // + // Pre-charge voltage + // + 3, 0xBC, 0x3f, 0xe3, + + // + // Display ON + // + 2, 0xAF, 0xe3, +}; + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of command bytes to the SSD1329 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +RITWriteCommand(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return if SSI port is not enabled for RIT display. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Clear the command/control bit to enable command mode. + // + GPIOPinWrite(ulGPIOBase, ulOLEDDC_PIN, 0); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of data bytes to the SSD1329 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +RITWriteData(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return if SSI port is not enabled for RIT display. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Set the command/control bit to enable data mode. + // + GPIOPinWrite(ulGPIOBase, ulOLEDDC_PIN, ulOLEDDC_PIN); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display RAM. All pixels in the display will +//! be turned off. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4Clear(void) +{ + static const unsigned char pucCommand1[] = { 0x15, 0, 63 }; + static const unsigned char pucCommand2[] = { 0x75, 0, 127 }; + unsigned long ulRow, ulColumn; + + // + // Clear out the buffer used for sending bytes to the display. + *(unsigned long *)&g_pucBuffer[0] = 0; + *(unsigned long *)&g_pucBuffer[4] = 0; + + // + // Set the window to fill the entire display. + // + RITWriteCommand(pucCommand1, sizeof(pucCommand1)); + RITWriteCommand(pucCommand2, sizeof(pucCommand2)); + RITWriteCommand(g_pucRIT128x96x4HorizontalInc, + sizeof(g_pucRIT128x96x4HorizontalInc)); + + // + // Loop through the rows + // + for(ulRow = 0; ulRow < 96; ulRow++) + { + // + // Loop through the columns. Each byte is two pixels, + // and the buffer hold 8 bytes, so 16 pixels are cleared + // at a time. + // + for(ulColumn = 0; ulColumn < 128; ulColumn += 8 * 2) + { + // + // Write 8 clearing bytes to the display, which will + // clear 16 pixels across. + // + RITWriteData(g_pucBuffer, sizeof(g_pucBuffer)); + } + } +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! rows from the top edge of the display. +//! \param ucLevel is the 4-bit grey scale value to be used for displayed text. +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \note Because the OLED display packs 2 pixels of data in a single byte, the +//! parameter \e ulX must be an even column number (e.g. 0, 2, 4, etc). +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4StringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY, unsigned char ucLevel) +{ + unsigned long ulIdx1, ulIdx2; + unsigned char ucTemp; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 96); + ASSERT(ucLevel < 16); + + // + // Setup a window starting at the specified column and row, ending + // at the right edge of the display and 8 rows down (single character row). + // + g_pucBuffer[0] = 0x15; + g_pucBuffer[1] = ulX / 2; + g_pucBuffer[2] = 63; + RITWriteCommand(g_pucBuffer, 3); + g_pucBuffer[0] = 0x75; + g_pucBuffer[1] = ulY; + g_pucBuffer[2] = ulY + 7; + RITWriteCommand(g_pucBuffer, 3); + RITWriteCommand(g_pucRIT128x96x4VerticalInc, + sizeof(g_pucRIT128x96x4VerticalInc)); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // Get a working copy of the current character and convert to an + // index into the character bit-map array. + // + ucTemp = *pcStr; + ucTemp &= 0x7F; + if(ucTemp < ' ') + { + ucTemp = ' '; + } + else + { + ucTemp -= ' '; + } + + // + // Build and display the character buffer. + // + for(ulIdx1 = 0; ulIdx1 < 3; ulIdx1++) + { + // + // Convert two columns of 1-bit font data into a single data + // byte column of 4-bit font data. + // + for(ulIdx2 = 0; ulIdx2 < 8; ulIdx2++) + { + g_pucBuffer[ulIdx2] = 0; + if(g_pucFont[ucTemp][ulIdx1*2] & (1 << ulIdx2)) + { + g_pucBuffer[ulIdx2] = ((ucLevel << 4) & 0xf0); + } + if((ulIdx1 < 2) && + (g_pucFont[ucTemp][ulIdx1*2+1] & (1 << ulIdx2))) + { + g_pucBuffer[ulIdx2] |= ((ucLevel << 0) & 0x0f); + } + } + + // + // If there is room, dump the single data byte column to the + // display. Otherwise, bail out. + // + if(ulX < 126) + { + RITWriteData(g_pucBuffer, 8); + ulX += 2; + } + else + { + return; + } + } + + // + // Advance to the next character. + // + pcStr++; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! rows from the top of the display. +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in rows. +//! +//! This function will display a bitmap graphic on the display. Because of the +//! format of the display RAM, the starting column (\e ulX) and the number of +//! columns (\e ulWidth) must be an integer multiple of two. +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for two columns in the current row, with the leftmost +//! column being contained in bits 7:4 and the rightmost column being contained +//! in bits 3:0. +//! +//! For example, an image six columns wide and seven scan lines tall would +//! be arranged as follows (showing how the twenty one bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------------------+-------------------+-------------------+ +//! | Byte 0 | Byte 1 | Byte 2 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 3 | Byte 4 | Byte 5 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 6 | Byte 7 | Byte 8 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 9 | Byte 10 | Byte 11 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 12 | Byte 13 | Byte 14 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 15 | Byte 16 | Byte 17 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 18 | Byte 19 | Byte 20 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! \endverbatim +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4ImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 96); + ASSERT((ulX + ulWidth) <= 128); + ASSERT((ulY + ulHeight) <= 96); + ASSERT((ulWidth & 1) == 0); + + // + // Setup a window starting at the specified column and row, and ending + // at the column + width and row+height. + // + g_pucBuffer[0] = 0x15; + g_pucBuffer[1] = ulX / 2; + g_pucBuffer[2] = (ulX + ulWidth - 2) / 2; + RITWriteCommand(g_pucBuffer, 3); + g_pucBuffer[0] = 0x75; + g_pucBuffer[1] = ulY; + g_pucBuffer[2] = ulY + ulHeight - 1; + RITWriteCommand(g_pucBuffer, 3); + RITWriteCommand(g_pucRIT128x96x4HorizontalInc, + sizeof(g_pucRIT128x96x4HorizontalInc)); + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write this row of image data. + // + RITWriteData(pucImage, (ulWidth / 2)); + + // + // Advance to the next row of the image. + // + pucImage += (ulWidth / 2); + } +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4Enable(unsigned long ulFrequency) +{ + unsigned long ulTemp; + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Configure the SSI0 port for master mode. + // + SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_2, SSI_MODE_MASTER, ulFrequency, 8); + + // + // (Re)Enable SSI control of the FSS pin. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Enable the SSI port. + // + SSIEnable(SSI0_BASE); + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Indicate that the RIT driver can use the SSI Port. + // + g_bSSIEnabled = true; +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4Disable(void) +{ + unsigned long ulTemp; + + // + // Indicate that the RIT driver can no longer use the SSI Port. + // + g_bSSIEnabled = false; + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Disable SSI control of the FSS pin. + // + GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display and +//! configures the SSD1329 controller on the panel. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4Init(unsigned long ulFrequency) +{ + unsigned long ulIdx; + + + /* Determine which board is being used. */ + if( SysCtlPeripheralPresent( SYSCTL_PERIPH_ETH ) ) + { + /* Ethernet is present, we must be using the LM3S8962 EK. */ + ulGPIOId = LM3S8962_SYSCTL_PERIPH_GPIO_OLEDDC; + ulGPIOBase = LM3S8962_GPIO_OLEDDC_BASE; + ulOLEDDC_PIN = GPIO_PIN_6; + ulOLEDEN_PIN = GPIO_PIN_7; + } + else + { + /* Ethernet is not present, we must be using the LM3S1968 EK. */ + ulGPIOId = LM3S1968_SYSCTL_PERIPH_GPIO_OLEDDC; + ulGPIOBase = LM3S1968_GPIO_OLEDDC_BASE; + ulOLEDDC_PIN = GPIO_PIN_2; + ulOLEDEN_PIN = GPIO_PIN_3; + } + + // + // Enable the SSI0 and GPIO port blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + SysCtlPeripheralEnable(ulGPIOId); + + // + // Configure the SSI0CLK and SSIOTX pins for SSI operation. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5, + GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the GPIO port pin used as a D/Cn signal for OLED device, + // and the port pin used to enable power to the OLED panel. + // + GPIOPinTypeGPIOOutput(ulGPIOBase, ulOLEDDC_PIN | ulOLEDEN_PIN); + GPIOPadConfigSet(ulGPIOBase, ulOLEDDC_PIN | ulOLEDEN_PIN, + GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); + GPIOPinWrite(ulGPIOBase, ulOLEDDC_PIN | ulOLEDEN_PIN, + ulOLEDDC_PIN | ulOLEDEN_PIN); + + // + // Configure and enable the SSI0 port for master mode. + // + RIT128x96x4Enable(ulFrequency); + + // + // Clear the frame buffer. + // + RIT128x96x4Clear(); + + // + // Initialize the SSD1329 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucRIT128x96x4Init); + ulIdx += g_pucRIT128x96x4Init[ulIdx] + 1) + { + // + // Send this command. + // + RITWriteCommand(g_pucRIT128x96x4Init + ulIdx + 1, + g_pucRIT128x96x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4DisplayOn(void) +{ + unsigned long ulIdx; + + // + // Initialize the SSD1329 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucRIT128x96x4Init); + ulIdx += g_pucRIT128x96x4Init[ulIdx] + 1) + { + // + // Send this command. + // + RITWriteCommand(g_pucRIT128x96x4Init + ulIdx + 1, + g_pucRIT128x96x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4DisplayOff(void) +{ + static const unsigned char pucCommand1[] = + { + 0xAE, 0xe3 + }; + + // + // Put the display to sleep. + // + RITWriteCommand(pucCommand1, sizeof(pucCommand1)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/standalone.ld b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/standalone.ld new file mode 100644 index 0000000..3511144 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/standalone.ld @@ -0,0 +1,60 @@ +/****************************************************************************** + * + * standalone.ld - Linker script for applications using startup.c and + * DriverLib. + * + * Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. + * + * Software License Agreement + * + * Luminary Micro, Inc. (LMI) is supplying this software for use solely and + * exclusively on LMI's microcontroller products. + * + * The software is owned by LMI and/or its suppliers, and is protected under + * applicable copyright laws. All rights are reserved. Any use in violation + * of the foregoing restrictions may subject the user to criminal sanctions + * under applicable laws, as well as to civil liability for the breach of the + * terms and conditions of this license. + * + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + * This is part of revision 1392 of the Stellaris Peripheral Driver Library. + * + *****************************************************************************/ + +MEMORY +{ + FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K + SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 64K +} + +SECTIONS +{ + .text : + { + KEEP(*(.isr_vector)) + *(.text*) + *(.rodata*) + _etext = .; + } > FLASH + + .data : AT (ADDR(.text) + SIZEOF(.text)) + { + _data = .; + *(vtable) + *(.data*) + _edata = .; + } > SRAM + + .bss : + { + _bss = .; + *(.bss*) + *(COMMON) + _ebss = .; + } > SRAM +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/startup.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/startup.c new file mode 100644 index 0000000..b987b2c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/startup.c @@ -0,0 +1,251 @@ +//***************************************************************************** +// +// startup.c - Boot code for Stellaris. +// +// Copyright (c) 2005-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1392 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +void ResetISR(void); +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern int main(void); +extern void xPortPendSVHandler(void); +extern void xPortSysTickHandler(void); +extern void vPortSVCHandler( void ); +extern void Timer0IntHandler( void ); +extern void vT2InterruptHandler( void ); +extern void vT3InterruptHandler( void ); +extern void vEMAC_ISR(void); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +#ifndef STACK_SIZE +#define STACK_SIZE 120 +#endif +static unsigned long pulStack[STACK_SIZE]; + +//***************************************************************************** +// +// The minimal vector table for a Cortex-M3. Note that the proper constructs +// must be placed on this to ensure that it ends up at physical address +// 0x0000.0000. +// +//***************************************************************************** +__attribute__ ((section(".isr_vector"))) +void (* const g_pfnVectors[])(void) = +{ + (void (*)(void))((unsigned long)pulStack + sizeof(pulStack)), + // The initial stack pointer + ResetISR, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI Rx and Tx + IntDefaultHandler, // I2C Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + vT2InterruptHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + vT3InterruptHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + 0, // Reserved + vEMAC_ISR, // Ethernet + IntDefaultHandler // Hibernate +}; + +//***************************************************************************** +// +// The following are constructs created by the linker, indicating where the +// the "data" and "bss" segments reside in memory. The initializers for the +// for the "data" segment resides immediately following the "text" segment. +// +//***************************************************************************** +extern unsigned long _etext; +extern unsigned long _data; +extern unsigned long _edata; +extern unsigned long _bss; +extern unsigned long _ebss; + +//***************************************************************************** +// +// This is the code that gets called when the processor first starts execution +// following a reset event. Only the absolutely necessary set is performed, +// after which the application supplied main() routine is called. Any fancy +// actions (such as making decisions based on the reset cause register, and +// resetting the bits in that register) are left solely in the hands of the +// application. +// +//***************************************************************************** +void +ResetISR(void) +{ + unsigned long *pulSrc, *pulDest; + + // + // Copy the data segment initializers from flash to SRAM. + // + pulSrc = &_etext; + for(pulDest = &_data; pulDest < &_edata; ) + { + *pulDest++ = *pulSrc++; + } + + // + // Zero fill the bss segment. + // + for(pulDest = &_bss; pulDest < &_ebss; ) + { + *pulDest++ = 0; + } + + // + // Call the application's entry point. + // + main(); +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// A dummy printf function to satisfy the calls to printf from uip. This +// avoids pulling in the run-time library. +// +//***************************************************************************** +int +uipprintf(const char *fmt, ...) +{ + return(0); +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/timertest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/timertest.c new file mode 100644 index 0000000..7ee6d5e --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/timertest.c @@ -0,0 +1,176 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* High speed timer test as described in main.c. */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Library includes. */ +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "interrupt.h" +#include "sysctl.h" +#include "lmi_timer.h" + +/* The set frequency of the interrupt. Deviations from this are measured as +the jitter. */ +#define timerINTERRUPT_FREQUENCY ( 20000UL ) + +/* The expected time between each of the timer interrupts - if the jitter was +zero. */ +#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY ) + +/* The highest available interrupt priority. */ +#define timerHIGHEST_PRIORITY ( 0 ) + +/* Misc defines. */ +#define timerMAX_32BIT_VALUE ( 0xffffffffUL ) +#define timerTIMER_1_COUNT_VALUE ( * ( ( unsigned long * ) ( TIMER1_BASE + 0x48 ) ) ) + +/*-----------------------------------------------------------*/ + +/* Interrupt handler in which the jitter is measured. */ +void Timer0IntHandler( void ); + +/* Stores the value of the maximum recorded jitter between interrupts. */ +volatile unsigned portLONG ulMaxJitter = 0UL; + +/* Counts the total number of times that the high frequency timer has 'ticked'. +This value is used by the run time stats function to work out what percentage +of CPU time each task is taking. */ +volatile unsigned portLONG ulHighFrequencyTimerTicks = 0UL; +/*-----------------------------------------------------------*/ + +void vSetupHighFrequencyTimer( void ) +{ +unsigned long ulFrequency; + + /* Timer zero is used to generate the interrupts, and timer 1 is used + to measure the jitter. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 ); + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 ); + TimerConfigure( TIMER0_BASE, TIMER_CFG_32_BIT_PER ); + TimerConfigure( TIMER1_BASE, TIMER_CFG_32_BIT_PER ); + + /* Set the timer interrupt to be above the kernel - highest. */ + IntPrioritySet( INT_TIMER0A, timerHIGHEST_PRIORITY ); + + /* Just used to measure time. */ + TimerLoadSet(TIMER1_BASE, TIMER_A, timerMAX_32BIT_VALUE ); + + /* Ensure interrupts do not start until the scheduler is running. */ + portDISABLE_INTERRUPTS(); + + /* The rate at which the timer will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY; + TimerLoadSet( TIMER0_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER0A ); + TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); + + /* Enable both timers. */ + TimerEnable( TIMER0_BASE, TIMER_A ); + TimerEnable( TIMER1_BASE, TIMER_A ); +} +/*-----------------------------------------------------------*/ + +void Timer0IntHandler( void ) +{ +unsigned portLONG ulDifference; +volatile unsigned portLONG ulCurrentCount; +static unsigned portLONG ulMaxDifference = 0, ulLastCount = 0; + + /* We use the timer 1 counter value to measure the clock cycles between + the timer 0 interrupts. */ + ulCurrentCount = timerTIMER_1_COUNT_VALUE; + + TimerIntClear( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); + + if( ulCurrentCount < ulLastCount ) + { + /* How many times has timer 1 counted since the last interrupt? */ + ulDifference = ulLastCount - ulCurrentCount; + + /* Is this the largest difference we have measured yet? */ + if( ulDifference > ulMaxDifference ) + { + ulMaxDifference = ulDifference; + ulMaxJitter = ulMaxDifference - timerEXPECTED_DIFFERENCE_VALUE; + } + } + + ulLastCount = ulCurrentCount; + + /* Keep a count of the total number of 20KHz ticks. This is used by the + run time stats functionality to calculate how much CPU time is used by + each task. */ + ulHighFrequencyTimerTicks++; +} + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/Makefile.webserver b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/Makefile.webserver new file mode 100644 index 0000000..f38c47a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/Makefile.webserver @@ -0,0 +1 @@ +APP_SOURCES += httpd.c http-strings.c httpd-fs.c httpd-cgi.c diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/clock-arch.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/clock-arch.h new file mode 100644 index 0000000..cde657b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/clock-arch.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +#include "FreeRTOS.h" + +typedef unsigned long clock_time_t; +#define CLOCK_CONF_SECOND configTICK_RATE_HZ + +#endif /* __CLOCK_ARCH_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/emac.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/emac.c new file mode 100644 index 0000000..69e8ec6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/emac.c @@ -0,0 +1,313 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "semphr.h" +#include "task.h" + +/* Demo includes. */ +#include "emac.h" + +/* uIP includes. */ +#include "uip.h" + +/* Hardware library includes. */ +#include "hw_types.h" +#include "hw_memmap.h" +#include "hw_ints.h" +#include "hw_ethernet.h" +#include "ethernet.h" +#include "interrupt.h" + +#define emacNUM_RX_BUFFERS 5 +#define emacFRAM_SIZE_BYTES 2 +#define macNEGOTIATE_DELAY 2000 +#define macWAIT_SEND_TIME ( 10 ) + +/* The task that handles the MAC peripheral. This is created at a high +priority and is effectively a deferred interrupt handler. The peripheral +handling is deferred to a task to prevent the entire FIFO having to be read +from within an ISR. */ +void vMACHandleTask( void *pvParameters ); + +/*-----------------------------------------------------------*/ + +/* The semaphore used to wake the uIP task when data arrives. */ +xSemaphoreHandle xEMACSemaphore = NULL; + +/* The semaphore used to wake the interrupt handler task. The peripheral +is processed at the task level to prevent the need to read the entire FIFO from +within the ISR itself. */ +xSemaphoreHandle xMACInterruptSemaphore = NULL; + +/* The buffer used by the uIP stack. In this case the pointer is used to +point to one of the Rx buffers. */ +unsigned portCHAR *uip_buf; + +/* Buffers into which Rx data is placed. */ +static unsigned portCHAR ucRxBuffers[ emacNUM_RX_BUFFERS ][ UIP_BUFSIZE + ( 4 * emacFRAM_SIZE_BYTES ) ]; + +/* The length of the data within each of the Rx buffers. */ +static unsigned portLONG ulRxLength[ emacNUM_RX_BUFFERS ]; + +/* Used to keep a track of the number of bytes to transmit. */ +static unsigned portLONG ulNextTxSpace; + +/*-----------------------------------------------------------*/ + +portBASE_TYPE vInitEMAC( void ) +{ +unsigned long ulTemp; +portBASE_TYPE xReturn; + + /* Ensure all interrupts are disabled. */ + EthernetIntDisable( ETH_BASE, ( ETH_INT_PHY | ETH_INT_MDIO | ETH_INT_RXER | ETH_INT_RXOF | ETH_INT_TX | ETH_INT_TXER | ETH_INT_RX)); + + /* Clear any interrupts that were already pending. */ + ulTemp = EthernetIntStatus( ETH_BASE, pdFALSE ); + EthernetIntClear( ETH_BASE, ulTemp ); + + /* Initialise the MAC and connect. */ + EthernetInit( ETH_BASE ); + EthernetConfigSet( ETH_BASE, ( ETH_CFG_TX_DPLXEN | ETH_CFG_TX_CRCEN | ETH_CFG_TX_PADEN ) ); + EthernetEnable( ETH_BASE ); + + /* Mark each Rx buffer as empty. */ + for( ulTemp = 0; ulTemp < emacNUM_RX_BUFFERS; ulTemp++ ) + { + ulRxLength[ ulTemp ] = 0; + } + + /* Create the queue and task used to defer the MAC processing to the + task level. */ + vSemaphoreCreateBinary( xMACInterruptSemaphore ); + xSemaphoreTake( xMACInterruptSemaphore, 0 ); + xReturn = xTaskCreate( vMACHandleTask, ( signed portCHAR * ) "MAC", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL ); + vTaskDelay( macNEGOTIATE_DELAY ); + + /* We are only interested in Rx interrupts. */ + IntPrioritySet( INT_ETH, configKERNEL_INTERRUPT_PRIORITY ); + IntEnable( INT_ETH ); + EthernetIntEnable(ETH_BASE, ETH_INT_RX); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned int uiGetEMACRxData( unsigned char *ucBuffer ) +{ +static unsigned long ulNextRxBuffer = 0; +unsigned int iLen; + + iLen = ulRxLength[ ulNextRxBuffer ]; + + if( iLen != 0 ) + { + /* Leave room for the size at the start of the buffer. */ + uip_buf = &( ucRxBuffers[ ulNextRxBuffer ][ 2 ] ); + + ulRxLength[ ulNextRxBuffer ] = 0; + + ulNextRxBuffer++; + if( ulNextRxBuffer >= emacNUM_RX_BUFFERS ) + { + ulNextRxBuffer = 0; + } + } + + return iLen; +} +/*-----------------------------------------------------------*/ + +void vInitialiseSend( void ) +{ + /* Set the index to the first byte to send - skipping over the size + bytes. */ + ulNextTxSpace = 2; +} +/*-----------------------------------------------------------*/ + +void vIncrementTxLength( unsigned portLONG ulLength ) +{ + ulNextTxSpace += ulLength; +} +/*-----------------------------------------------------------*/ + +void vSendBufferToMAC( void ) +{ +unsigned long *pulSource; +unsigned portSHORT * pus; +unsigned portLONG ulNextWord; + + /* Locate the data to be send. */ + pus = ( unsigned portSHORT * ) uip_buf; + + /* Add in the size of the data. */ + pus--; + *pus = ulNextTxSpace; + + /* Wait for data to be sent if there is no space immediately. */ + while( !EthernetSpaceAvail( ETH_BASE ) ) + { + vTaskDelay( macWAIT_SEND_TIME ); + } + + pulSource = ( unsigned portLONG * ) pus; + + for( ulNextWord = 0; ulNextWord < ulNextTxSpace; ulNextWord += sizeof( unsigned portLONG ) ) + { + HWREG(ETH_BASE + MAC_O_DATA) = *pulSource; + pulSource++; + } + + /* Go. */ + HWREG( ETH_BASE + MAC_O_TR ) = MAC_TR_NEWTX; +} +/*-----------------------------------------------------------*/ + +void vEMAC_ISR( void ) +{ +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; +unsigned portLONG ulTemp; + + /* Clear the interrupt. */ + ulTemp = EthernetIntStatus( ETH_BASE, pdFALSE ); + EthernetIntClear( ETH_BASE, ulTemp ); + + /* Was it an Rx interrupt? */ + if( ulTemp & ETH_INT_RX ) + { + xSemaphoreGiveFromISR( xMACInterruptSemaphore, &xHigherPriorityTaskWoken ); + EthernetIntDisable( ETH_BASE, ETH_INT_RX ); + } + + /* Switch to the uIP task. */ + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + +void vMACHandleTask( void *pvParameters ) +{ +unsigned long ulLen = 0, i; +unsigned portLONG ulLength, ulInt; +unsigned long *pulBuffer; +static unsigned portLONG ulNextRxBuffer = 0; +portBASE_TYPE xSwitchRequired = pdFALSE; + + for( ;; ) + { + /* Wait for something to do. */ + xSemaphoreTake( xMACInterruptSemaphore, portMAX_DELAY ); + + while( ( ulInt = ( EthernetIntStatus( ETH_BASE, pdFALSE ) & ETH_INT_RX ) ) != 0 ) + { + ulLength = HWREG( ETH_BASE + MAC_O_DATA ); + + /* Leave room at the start of the buffer for the size. */ + pulBuffer = ( unsigned long * ) &( ucRxBuffers[ ulNextRxBuffer ][ 2 ] ); + *pulBuffer = ( ulLength >> 16 ); + + /* Get the size of the data. */ + pulBuffer = ( unsigned long * ) &( ucRxBuffers[ ulNextRxBuffer ][ 4 ] ); + ulLength &= 0xFFFF; + + if( ulLength > 4 ) + { + ulLength -= 4; + + if( ulLength >= UIP_BUFSIZE ) + { + /* The data won't fit in our buffer. Ensure we don't + try to write into the buffer. */ + ulLength = 0; + } + + /* Read out the data into our buffer. */ + for( i = 0; i < ulLength; i += sizeof( unsigned portLONG ) ) + { + *pulBuffer = HWREG( ETH_BASE + MAC_O_DATA ); + pulBuffer++; + } + + /* Store the length of the data into the separate array. */ + ulRxLength[ ulNextRxBuffer ] = ulLength; + + /* Use the next buffer the next time through. */ + ulNextRxBuffer++; + if( ulNextRxBuffer >= emacNUM_RX_BUFFERS ) + { + ulNextRxBuffer = 0; + } + + /* Ensure the uIP task is not blocked as data has arrived. */ + xSemaphoreGive( xEMACSemaphore ); + } + } + + EthernetIntEnable( ETH_BASE, ETH_INT_RX ); + } +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/emac.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/emac.h new file mode 100644 index 0000000..a49b598 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/emac.h @@ -0,0 +1,322 @@ +/*---------------------------------------------------------------------------- + * LPC2378 Ethernet Definitions + *---------------------------------------------------------------------------- + * Name: EMAC.H + * Purpose: Philips LPC2378 EMAC hardware definitions + *---------------------------------------------------------------------------- + * Copyright (c) 2006 KEIL - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ +#ifndef __EMAC_H +#define __EMAC_H + +/* MAC address definition. The MAC address must be unique on the network. */ +#define emacETHADDR0 0 +#define emacETHADDR1 0xbd +#define emacETHADDR2 0x33 +#define emacETHADDR3 0x02 +#define emacETHADDR4 0x64 +#define emacETHADDR5 0x24 + + +/* EMAC Memory Buffer configuration for 16K Ethernet RAM. */ +#define NUM_RX_FRAG 4 /* Num.of RX Fragments 4*1536= 6.0kB */ +#define NUM_TX_FRAG 2 /* Num.of TX Fragments 2*1536= 3.0kB */ +#define ETH_FRAG_SIZE 1536 /* Packet Fragment size 1536 Bytes */ + +#define ETH_MAX_FLEN 1536 /* Max. Ethernet Frame Size */ + +/* EMAC variables located in 16K Ethernet SRAM */ +#define RX_DESC_BASE 0x7FE00000 +#define RX_STAT_BASE (RX_DESC_BASE + NUM_RX_FRAG*8) +#define TX_DESC_BASE (RX_STAT_BASE + NUM_RX_FRAG*8) +#define TX_STAT_BASE (TX_DESC_BASE + NUM_TX_FRAG*8) +#define RX_BUF_BASE (TX_STAT_BASE + NUM_TX_FRAG*4) +#define TX_BUF_BASE (RX_BUF_BASE + NUM_RX_FRAG*ETH_FRAG_SIZE) + +/* RX and TX descriptor and status definitions. */ +#define RX_DESC_PACKET(i) (*(unsigned int *)(RX_DESC_BASE + 8*i)) +#define RX_DESC_CTRL(i) (*(unsigned int *)(RX_DESC_BASE+4 + 8*i)) +#define RX_STAT_INFO(i) (*(unsigned int *)(RX_STAT_BASE + 8*i)) +#define RX_STAT_HASHCRC(i) (*(unsigned int *)(RX_STAT_BASE+4 + 8*i)) +#define TX_DESC_PACKET(i) (*(unsigned int *)(TX_DESC_BASE + 8*i)) +#define TX_DESC_CTRL(i) (*(unsigned int *)(TX_DESC_BASE+4 + 8*i)) +#define TX_STAT_INFO(i) (*(unsigned int *)(TX_STAT_BASE + 4*i)) +#define RX_BUF(i) (RX_BUF_BASE + ETH_FRAG_SIZE*i) +#define TX_BUF(i) (TX_BUF_BASE + ETH_FRAG_SIZE*i) + +/* MAC Configuration Register 1 */ +#define MAC1_REC_EN 0x00000001 /* Receive Enable */ +#define MAC1_PASS_ALL 0x00000002 /* Pass All Receive Frames */ +#define MAC1_RX_FLOWC 0x00000004 /* RX Flow Control */ +#define MAC1_TX_FLOWC 0x00000008 /* TX Flow Control */ +#define MAC1_LOOPB 0x00000010 /* Loop Back Mode */ +#define MAC1_RES_TX 0x00000100 /* Reset TX Logic */ +#define MAC1_RES_MCS_TX 0x00000200 /* Reset MAC TX Control Sublayer */ +#define MAC1_RES_RX 0x00000400 /* Reset RX Logic */ +#define MAC1_RES_MCS_RX 0x00000800 /* Reset MAC RX Control Sublayer */ +#define MAC1_SIM_RES 0x00004000 /* Simulation Reset */ +#define MAC1_SOFT_RES 0x00008000 /* Soft Reset MAC */ + +/* MAC Configuration Register 2 */ +#define MAC2_FULL_DUP 0x00000001 /* Full Duplex Mode */ +#define MAC2_FRM_LEN_CHK 0x00000002 /* Frame Length Checking */ +#define MAC2_HUGE_FRM_EN 0x00000004 /* Huge Frame Enable */ +#define MAC2_DLY_CRC 0x00000008 /* Delayed CRC Mode */ +#define MAC2_CRC_EN 0x00000010 /* Append CRC to every Frame */ +#define MAC2_PAD_EN 0x00000020 /* Pad all Short Frames */ +#define MAC2_VLAN_PAD_EN 0x00000040 /* VLAN Pad Enable */ +#define MAC2_ADET_PAD_EN 0x00000080 /* Auto Detect Pad Enable */ +#define MAC2_PPREAM_ENF 0x00000100 /* Pure Preamble Enforcement */ +#define MAC2_LPREAM_ENF 0x00000200 /* Long Preamble Enforcement */ +#undef MAC2_NO_BACKOFF /* Remove compiler warning. */ +#define MAC2_NO_BACKOFF 0x00001000 /* No Backoff Algorithm */ +#define MAC2_BACK_PRESSURE 0x00002000 /* Backoff Presurre / No Backoff */ +#define MAC2_EXCESS_DEF 0x00004000 /* Excess Defer */ + +/* Back-to-Back Inter-Packet-Gap Register */ +#define IPGT_FULL_DUP 0x00000015 /* Recommended value for Full Duplex */ +#define IPGT_HALF_DUP 0x00000012 /* Recommended value for Half Duplex */ + +/* Non Back-to-Back Inter-Packet-Gap Register */ +#define IPGR_DEF 0x00000012 /* Recommended value */ + +/* Collision Window/Retry Register */ +#define CLRT_DEF 0x0000370F /* Default value */ + +/* PHY Support Register */ +#undef SUPP_SPEED /* Remove compiler warning. */ +#define SUPP_SPEED 0x00000100 /* Reduced MII Logic Current Speed */ +#define SUPP_RES_RMII 0x00000800 /* Reset Reduced MII Logic */ + +/* Test Register */ +#define TEST_SHCUT_PQUANTA 0x00000001 /* Shortcut Pause Quanta */ +#define TEST_TST_PAUSE 0x00000002 /* Test Pause */ +#define TEST_TST_BACKP 0x00000004 /* Test Back Pressure */ + +/* MII Management Configuration Register */ +#define MCFG_SCAN_INC 0x00000001 /* Scan Increment PHY Address */ +#define MCFG_SUPP_PREAM 0x00000002 /* Suppress Preamble */ +#define MCFG_CLK_SEL 0x0000001C /* Clock Select Mask */ +#define MCFG_RES_MII 0x00008000 /* Reset MII Management Hardware */ + +/* MII Management Command Register */ +#undef MCMD_READ /* Remove compiler warning. */ +#define MCMD_READ 0x00000001 /* MII Read */ +#undef MCMD_SCAN /* Remove compiler warning. */ +#define MCMD_SCAN 0x00000002 /* MII Scan continuously */ + +#define MII_WR_TOUT 0x00050000 /* MII Write timeout count */ +#define MII_RD_TOUT 0x00050000 /* MII Read timeout count */ + +/* MII Management Address Register */ +#define MADR_REG_ADR 0x0000001F /* MII Register Address Mask */ +#define MADR_PHY_ADR 0x00001F00 /* PHY Address Mask */ + +/* MII Management Indicators Register */ +#undef MIND_BUSY /* Remove compiler warning. */ +#define MIND_BUSY 0x00000001 /* MII is Busy */ +#define MIND_SCAN 0x00000002 /* MII Scanning in Progress */ +#define MIND_NOT_VAL 0x00000004 /* MII Read Data not valid */ +#define MIND_MII_LINK_FAIL 0x00000008 /* MII Link Failed */ + +/* Command Register */ +#define CR_RX_EN 0x00000001 /* Enable Receive */ +#define CR_TX_EN 0x00000002 /* Enable Transmit */ +#define CR_REG_RES 0x00000008 /* Reset Host Registers */ +#define CR_TX_RES 0x00000010 /* Reset Transmit Datapath */ +#define CR_RX_RES 0x00000020 /* Reset Receive Datapath */ +#define CR_PASS_RUNT_FRM 0x00000040 /* Pass Runt Frames */ +#define CR_PASS_RX_FILT 0x00000080 /* Pass RX Filter */ +#define CR_TX_FLOW_CTRL 0x00000100 /* TX Flow Control */ +#define CR_RMII 0x00000200 /* Reduced MII Interface */ +#define CR_FULL_DUP 0x00000400 /* Full Duplex */ + +/* Status Register */ +#define SR_RX_EN 0x00000001 /* Enable Receive */ +#define SR_TX_EN 0x00000002 /* Enable Transmit */ + +/* Transmit Status Vector 0 Register */ +#define TSV0_CRC_ERR 0x00000001 /* CRC error */ +#define TSV0_LEN_CHKERR 0x00000002 /* Length Check Error */ +#define TSV0_LEN_OUTRNG 0x00000004 /* Length Out of Range */ +#define TSV0_DONE 0x00000008 /* Tramsmission Completed */ +#define TSV0_MCAST 0x00000010 /* Multicast Destination */ +#define TSV0_BCAST 0x00000020 /* Broadcast Destination */ +#define TSV0_PKT_DEFER 0x00000040 /* Packet Deferred */ +#define TSV0_EXC_DEFER 0x00000080 /* Excessive Packet Deferral */ +#define TSV0_EXC_COLL 0x00000100 /* Excessive Collision */ +#define TSV0_LATE_COLL 0x00000200 /* Late Collision Occured */ +#define TSV0_GIANT 0x00000400 /* Giant Frame */ +#define TSV0_UNDERRUN 0x00000800 /* Buffer Underrun */ +#define TSV0_BYTES 0x0FFFF000 /* Total Bytes Transferred */ +#define TSV0_CTRL_FRAME 0x10000000 /* Control Frame */ +#define TSV0_PAUSE 0x20000000 /* Pause Frame */ +#define TSV0_BACK_PRESS 0x40000000 /* Backpressure Method Applied */ +#define TSV0_VLAN 0x80000000 /* VLAN Frame */ + +/* Transmit Status Vector 1 Register */ +#define TSV1_BYTE_CNT 0x0000FFFF /* Transmit Byte Count */ +#define TSV1_COLL_CNT 0x000F0000 /* Transmit Collision Count */ + +/* Receive Status Vector Register */ +#define RSV_BYTE_CNT 0x0000FFFF /* Receive Byte Count */ +#define RSV_PKT_IGNORED 0x00010000 /* Packet Previously Ignored */ +#define RSV_RXDV_SEEN 0x00020000 /* RXDV Event Previously Seen */ +#define RSV_CARR_SEEN 0x00040000 /* Carrier Event Previously Seen */ +#define RSV_REC_CODEV 0x00080000 /* Receive Code Violation */ +#define RSV_CRC_ERR 0x00100000 /* CRC Error */ +#define RSV_LEN_CHKERR 0x00200000 /* Length Check Error */ +#define RSV_LEN_OUTRNG 0x00400000 /* Length Out of Range */ +#define RSV_REC_OK 0x00800000 /* Frame Received OK */ +#define RSV_MCAST 0x01000000 /* Multicast Frame */ +#define RSV_BCAST 0x02000000 /* Broadcast Frame */ +#define RSV_DRIB_NIBB 0x04000000 /* Dribble Nibble */ +#define RSV_CTRL_FRAME 0x08000000 /* Control Frame */ +#define RSV_PAUSE 0x10000000 /* Pause Frame */ +#define RSV_UNSUPP_OPC 0x20000000 /* Unsupported Opcode */ +#define RSV_VLAN 0x40000000 /* VLAN Frame */ + +/* Flow Control Counter Register */ +#define FCC_MIRR_CNT 0x0000FFFF /* Mirror Counter */ +#define FCC_PAUSE_TIM 0xFFFF0000 /* Pause Timer */ + +/* Flow Control Status Register */ +#define FCS_MIRR_CNT 0x0000FFFF /* Mirror Counter Current */ + +/* Receive Filter Control Register */ +#define RFC_UCAST_EN 0x00000001 /* Accept Unicast Frames Enable */ +#define RFC_BCAST_EN 0x00000002 /* Accept Broadcast Frames Enable */ +#define RFC_MCAST_EN 0x00000004 /* Accept Multicast Frames Enable */ +#define RFC_UCAST_HASH_EN 0x00000008 /* Accept Unicast Hash Filter Frames */ +#define RFC_MCAST_HASH_EN 0x00000010 /* Accept Multicast Hash Filter Fram.*/ +#define RFC_PERFECT_EN 0x00000020 /* Accept Perfect Match Enable */ +#define RFC_MAGP_WOL_EN 0x00001000 /* Magic Packet Filter WoL Enable */ +#define RFC_PFILT_WOL_EN 0x00002000 /* Perfect Filter WoL Enable */ + +/* Receive Filter WoL Status/Clear Registers */ +#define WOL_UCAST 0x00000001 /* Unicast Frame caused WoL */ +#define WOL_BCAST 0x00000002 /* Broadcast Frame caused WoL */ +#define WOL_MCAST 0x00000004 /* Multicast Frame caused WoL */ +#define WOL_UCAST_HASH 0x00000008 /* Unicast Hash Filter Frame WoL */ +#define WOL_MCAST_HASH 0x00000010 /* Multicast Hash Filter Frame WoL */ +#define WOL_PERFECT 0x00000020 /* Perfect Filter WoL */ +#define WOL_RX_FILTER 0x00000080 /* RX Filter caused WoL */ +#define WOL_MAG_PACKET 0x00000100 /* Magic Packet Filter caused WoL */ + +/* Interrupt Status/Enable/Clear/Set Registers */ +#define INT_RX_OVERRUN 0x00000001 /* Overrun Error in RX Queue */ +#define INT_RX_ERR 0x00000002 /* Receive Error */ +#define INT_RX_FIN 0x00000004 /* RX Finished Process Descriptors */ +#define INT_RX_DONE 0x00000008 /* Receive Done */ +#define INT_TX_UNDERRUN 0x00000010 /* Transmit Underrun */ +#define INT_TX_ERR 0x00000020 /* Transmit Error */ +#define INT_TX_FIN 0x00000040 /* TX Finished Process Descriptors */ +#define INT_TX_DONE 0x00000080 /* Transmit Done */ +#define INT_SOFT_INT 0x00001000 /* Software Triggered Interrupt */ +#define INT_WAKEUP 0x00002000 /* Wakeup Event Interrupt */ + +/* Power Down Register */ +#define PD_POWER_DOWN 0x80000000 /* Power Down MAC */ + +/* RX Descriptor Control Word */ +#define RCTRL_SIZE 0x000007FF /* Buffer size mask */ +#define RCTRL_INT 0x80000000 /* Generate RxDone Interrupt */ + +/* RX Status Hash CRC Word */ +#define RHASH_SA 0x000001FF /* Hash CRC for Source Address */ +#define RHASH_DA 0x001FF000 /* Hash CRC for Destination Address */ + +/* RX Status Information Word */ +#define RINFO_SIZE 0x000007FF /* Data size in bytes */ +#define RINFO_CTRL_FRAME 0x00040000 /* Control Frame */ +#define RINFO_VLAN 0x00080000 /* VLAN Frame */ +#define RINFO_FAIL_FILT 0x00100000 /* RX Filter Failed */ +#define RINFO_MCAST 0x00200000 /* Multicast Frame */ +#define RINFO_BCAST 0x00400000 /* Broadcast Frame */ +#define RINFO_CRC_ERR 0x00800000 /* CRC Error in Frame */ +#define RINFO_SYM_ERR 0x01000000 /* Symbol Error from PHY */ +#define RINFO_LEN_ERR 0x02000000 /* Length Error */ +#define RINFO_RANGE_ERR 0x04000000 /* Range Error (exceeded max. size) */ +#define RINFO_ALIGN_ERR 0x08000000 /* Alignment Error */ +#define RINFO_OVERRUN 0x10000000 /* Receive overrun */ +#define RINFO_NO_DESCR 0x20000000 /* No new Descriptor available */ +#define RINFO_LAST_FLAG 0x40000000 /* Last Fragment in Frame */ +#define RINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +#define RINFO_ERR_MASK (RINFO_FAIL_FILT | RINFO_CRC_ERR | RINFO_SYM_ERR | \ + RINFO_LEN_ERR | RINFO_ALIGN_ERR | RINFO_OVERRUN) + +/* TX Descriptor Control Word */ +#define TCTRL_SIZE 0x000007FF /* Size of data buffer in bytes */ +#define TCTRL_OVERRIDE 0x04000000 /* Override Default MAC Registers */ +#define TCTRL_HUGE 0x08000000 /* Enable Huge Frame */ +#define TCTRL_PAD 0x10000000 /* Pad short Frames to 64 bytes */ +#define TCTRL_CRC 0x20000000 /* Append a hardware CRC to Frame */ +#define TCTRL_LAST 0x40000000 /* Last Descriptor for TX Frame */ +#define TCTRL_INT 0x80000000 /* Generate TxDone Interrupt */ + +/* TX Status Information Word */ +#define TINFO_COL_CNT 0x01E00000 /* Collision Count */ +#define TINFO_DEFER 0x02000000 /* Packet Deferred (not an error) */ +#define TINFO_EXCESS_DEF 0x04000000 /* Excessive Deferral */ +#define TINFO_EXCESS_COL 0x08000000 /* Excessive Collision */ +#define TINFO_LATE_COL 0x10000000 /* Late Collision Occured */ +#define TINFO_UNDERRUN 0x20000000 /* Transmit Underrun */ +#define TINFO_NO_DESCR 0x40000000 /* No new Descriptor available */ +#define TINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +/* DP83848C PHY Registers */ +#define PHY_REG_BMCR 0x00 /* Basic Mode Control Register */ +#define PHY_REG_BMSR 0x01 /* Basic Mode Status Register */ +#define PHY_REG_IDR1 0x02 /* PHY Identifier 1 */ +#define PHY_REG_IDR2 0x03 /* PHY Identifier 2 */ +#define PHY_REG_ANAR 0x04 /* Auto-Negotiation Advertisement */ +#define PHY_REG_ANLPAR 0x05 /* Auto-Neg. Link Partner Abitily */ +#define PHY_REG_ANER 0x06 /* Auto-Neg. Expansion Register */ +#define PHY_REG_ANNPTR 0x07 /* Auto-Neg. Next Page TX */ + +/* PHY Extended Registers */ +#define PHY_REG_STS 0x10 /* Status Register */ +#define PHY_REG_MICR 0x11 /* MII Interrupt Control Register */ +#define PHY_REG_MISR 0x12 /* MII Interrupt Status Register */ +#define PHY_REG_FCSCR 0x14 /* False Carrier Sense Counter */ +#define PHY_REG_RECR 0x15 /* Receive Error Counter */ +#define PHY_REG_PCSR 0x16 /* PCS Sublayer Config. and Status */ +#define PHY_REG_RBR 0x17 /* RMII and Bypass Register */ +#define PHY_REG_LEDCR 0x18 /* LED Direct Control Register */ +#define PHY_REG_PHYCR 0x19 /* PHY Control Register */ +#define PHY_REG_10BTSCR 0x1A /* 10Base-T Status/Control Register */ +#define PHY_REG_CDCTRL1 0x1B /* CD Test Control and BIST Extens. */ +#define PHY_REG_EDCR 0x1D /* Energy Detect Control Register */ + +#define PHY_FULLD_100M 0x2100 /* Full Duplex 100Mbit */ +#define PHY_HALFD_100M 0x2000 /* Half Duplex 100Mbit */ +#define PHY_FULLD_10M 0x0100 /* Full Duplex 10Mbit */ +#define PHY_HALFD_10M 0x0000 /* Half Duplex 10MBit */ +#define PHY_AUTO_NEG 0x3000 /* Select Auto Negotiation */ + +#define DP83848C_DEF_ADR 0x0100 /* Default PHY device address */ +#define DP83848C_ID 0x20005C90 /* PHY Identifier */ + +// prototypes +portBASE_TYPE vInitEMAC(void); +unsigned short ReadFrameBE_EMAC(void); +void vIncrementTxLength(unsigned long ulLength); +void CopyFromFrame_EMAC(void *Dest, unsigned short Size); +void DummyReadFrame_EMAC(unsigned short Size); +unsigned short StartReadFrame(void); +void EndReadFrame(void); +unsigned int CheckFrameReceived(void); +void vInitialiseSend(void); +unsigned int Rdy4Tx(void); +void vSendBufferToMAC(void); +void vEMACWaitForInput( void ); +unsigned int uiGetEMACRxData( unsigned char *ucBuffer ); + + +#endif + +/*---------------------------------------------------------------------------- + * end of file + *---------------------------------------------------------------------------*/ + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/http-strings b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/http-strings new file mode 100644 index 0000000..0d3c30c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/http-strings @@ -0,0 +1,35 @@ +http_http "http://" +http_200 "200 " +http_301 "301 " +http_302 "302 " +http_get "GET " +http_10 "HTTP/1.0" +http_11 "HTTP/1.1" +http_content_type "content-type: " +http_texthtml "text/html" +http_location "location: " +http_host "host: " +http_crnl "\r\n" +http_index_html "/index.html" +http_404_html "/404.html" +http_referer "Referer:" +http_header_200 "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_header_404 "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_content_type_plain "Content-type: text/plain\r\n\r\n" +http_content_type_html "Content-type: text/html\r\n\r\n" +http_content_type_css "Content-type: text/css\r\n\r\n" +http_content_type_text "Content-type: text/text\r\n\r\n" +http_content_type_png "Content-type: image/png\r\n\r\n" +http_content_type_gif "Content-type: image/gif\r\n\r\n" +http_content_type_jpg "Content-type: image/jpeg\r\n\r\n" +http_content_type_binary "Content-type: application/octet-stream\r\n\r\n" +http_html ".html" +http_shtml ".shtml" +http_htm ".htm" +http_css ".css" +http_png ".png" +http_gif ".gif" +http_jpg ".jpg" +http_text ".txt" +http_txt ".txt" + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/http-strings.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/http-strings.c new file mode 100644 index 0000000..ef7a41c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/http-strings.c @@ -0,0 +1,102 @@ +const char http_http[8] = +/* "http://" */ +{0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, }; +const char http_200[5] = +/* "200 " */ +{0x32, 0x30, 0x30, 0x20, }; +const char http_301[5] = +/* "301 " */ +{0x33, 0x30, 0x31, 0x20, }; +const char http_302[5] = +/* "302 " */ +{0x33, 0x30, 0x32, 0x20, }; +const char http_get[5] = +/* "GET " */ +{0x47, 0x45, 0x54, 0x20, }; +const char http_10[9] = +/* "HTTP/1.0" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, }; +const char http_11[9] = +/* "HTTP/1.1" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, }; +const char http_content_type[15] = +/* "content-type: " */ +{0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, }; +const char http_texthtml[10] = +/* "text/html" */ +{0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_location[11] = +/* "location: " */ +{0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, }; +const char http_host[7] = +/* "host: " */ +{0x68, 0x6f, 0x73, 0x74, 0x3a, 0x20, }; +const char http_crnl[3] = +/* "\r\n" */ +{0xd, 0xa, }; +const char http_index_html[12] = +/* "/index.html" */ +{0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_404_html[10] = +/* "/404.html" */ +{0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_referer[9] = +/* "Referer:" */ +{0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x3a, }; +const char http_header_200[84] = +/* "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_header_404[91] = +/* "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x34, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_content_type_plain[29] = +/* "Content-type: text/plain\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_html[28] = +/* "Content-type: text/html\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_css [27] = +/* "Content-type: text/css\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_text[28] = +/* "Content-type: text/text\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x78, 0x74, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_png [28] = +/* "Content-type: image/png\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_gif [28] = +/* "Content-type: image/gif\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_jpg [29] = +/* "Content-type: image/jpeg\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x65, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_binary[43] = +/* "Content-type: application/octet-stream\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0xd, 0xa, }; +const char http_html[6] = +/* ".html" */ +{0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_shtml[7] = +/* ".shtml" */ +{0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_htm[5] = +/* ".htm" */ +{0x2e, 0x68, 0x74, 0x6d, }; +const char http_css[5] = +/* ".css" */ +{0x2e, 0x63, 0x73, 0x73, }; +const char http_png[5] = +/* ".png" */ +{0x2e, 0x70, 0x6e, 0x67, }; +const char http_gif[5] = +/* ".gif" */ +{0x2e, 0x67, 0x69, 0x66, }; +const char http_jpg[5] = +/* ".jpg" */ +{0x2e, 0x6a, 0x70, 0x67, }; +const char http_text[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; +const char http_txt[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/http-strings.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/http-strings.h new file mode 100644 index 0000000..acbe7e1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/http-strings.h @@ -0,0 +1,34 @@ +extern const char http_http[8]; +extern const char http_200[5]; +extern const char http_301[5]; +extern const char http_302[5]; +extern const char http_get[5]; +extern const char http_10[9]; +extern const char http_11[9]; +extern const char http_content_type[15]; +extern const char http_texthtml[10]; +extern const char http_location[11]; +extern const char http_host[7]; +extern const char http_crnl[3]; +extern const char http_index_html[12]; +extern const char http_404_html[10]; +extern const char http_referer[9]; +extern const char http_header_200[84]; +extern const char http_header_404[91]; +extern const char http_content_type_plain[29]; +extern const char http_content_type_html[28]; +extern const char http_content_type_css [27]; +extern const char http_content_type_text[28]; +extern const char http_content_type_png [28]; +extern const char http_content_type_gif [28]; +extern const char http_content_type_jpg [29]; +extern const char http_content_type_binary[43]; +extern const char http_html[6]; +extern const char http_shtml[7]; +extern const char http_htm[5]; +extern const char http_css[5]; +extern const char http_png[5]; +extern const char http_gif[5]; +extern const char http_jpg[5]; +extern const char http_text[5]; +extern const char http_txt[5]; diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-cgi.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-cgi.c new file mode 100644 index 0000000..5a5ce9b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-cgi.c @@ -0,0 +1,293 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface + * \author + * Adam Dunkels + * + */ + +/* + * Copyright (c) 2001-2006, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $ + * + */ + +#include "uip.h" +#include "psock.h" +#include "httpd.h" +#include "httpd-cgi.h" +#include "httpd-fs.h" + +#include +#include + +HTTPD_CGI_CALL(file, "file-stats", file_stats); +HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats); +HTTPD_CGI_CALL(net, "net-stats", net_stats); +HTTPD_CGI_CALL(rtos, "rtos-stats", rtos_stats ); +HTTPD_CGI_CALL(run, "run-time", run_time ); +HTTPD_CGI_CALL(io, "led-io", led_io ); + + +static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, &rtos, &run, &io, NULL }; + +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(nullfunction(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +httpd_cgifunction +httpd_cgi(char *name) +{ + const struct httpd_cgi_call **f; + + /* Find the matching name in the table, return the function. */ + for(f = calls; *f != NULL; ++f) { + if(strncmp((*f)->name, name, strlen((*f)->name)) == 0) { + return (*f)->function; + } + } + return nullfunction; +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_file_stats(void *arg) +{ + char *f = (char *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f)); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(file_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, strchr(ptr, ' ') + 1); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static const char closed[] = /* "CLOSED",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0}; +static const char syn_rcvd[] = /* "SYN-RCVD",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56, + 0x44, 0}; +static const char syn_sent[] = /* "SYN-SENT",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e, + 0x54, 0}; +static const char established[] = /* "ESTABLISHED",*/ +{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, + 0x45, 0x44, 0}; +static const char fin_wait_1[] = /* "FIN-WAIT-1",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x31, 0}; +static const char fin_wait_2[] = /* "FIN-WAIT-2",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x32, 0}; +static const char closing[] = /* "CLOSING",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x49, + 0x4e, 0x47, 0}; +static const char time_wait[] = /* "TIME-WAIT,"*/ +{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41, + 0x49, 0x54, 0}; +static const char last_ack[] = /* "LAST-ACK"*/ +{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43, + 0x4b, 0}; + +static const char *states[] = { + closed, + syn_rcvd, + syn_sent, + established, + fin_wait_1, + fin_wait_2, + closing, + time_wait, + last_ack}; + + +static unsigned short +generate_tcp_stats(void *arg) +{ + struct uip_conn *conn; + struct httpd_state *s = (struct httpd_state *)arg; + + conn = &uip_conns[s->count]; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "%d%u.%u.%u.%u:%u%s%u%u%c %c\r\n", + htons(conn->lport), + htons(conn->ripaddr[0]) >> 8, + htons(conn->ripaddr[0]) & 0xff, + htons(conn->ripaddr[1]) >> 8, + htons(conn->ripaddr[1]) & 0xff, + htons(conn->rport), + states[conn->tcpstateflags & UIP_TS_MASK], + conn->nrtx, + conn->timer, + (uip_outstanding(conn))? '*':' ', + (uip_stopped(conn))? '!':' '); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr)) +{ + + PSOCK_BEGIN(&s->sout); + + for(s->count = 0; s->count < UIP_CONNS; ++s->count) { + if((uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) { + PSOCK_GENERATOR_SEND(&s->sout, generate_tcp_stats, s); + } + } + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_net_stats(void *arg) +{ + struct httpd_state *s = (struct httpd_state *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "%5u\n", ((uip_stats_t *)&uip_stat)[s->count]); +} + +static +PT_THREAD(net_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + +#if UIP_STATISTICS + + for(s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t); + ++s->count) { + PSOCK_GENERATOR_SEND(&s->sout, generate_net_stats, s); + } + +#endif /* UIP_STATISTICS */ + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +extern void vTaskList( signed char *pcWriteBuffer ); +static char cCountBuf[ 32 ]; +long lRefreshCount = 0; +static unsigned short +generate_rtos_stats(void *arg) +{ + lRefreshCount++; + sprintf( cCountBuf, "


Refresh count = %d", lRefreshCount ); + vTaskList( uip_appdata ); + strcat( uip_appdata, cCountBuf ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + + +static +PT_THREAD(rtos_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_rtos_stats, NULL); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +char *pcStatus; +extern unsigned long uxParTestGetLED( unsigned long uxLED ); + +static unsigned short generate_io_state( void *arg ) +{ + if( uxParTestGetLED( 0 ) ) + { + pcStatus = "checked"; + } + else + { + pcStatus = ""; + } + + sprintf( uip_appdata, + "LED"\ + "

"\ + "", + pcStatus ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + +extern void vTaskGetRunTimeStats( signed char *pcWriteBuffer ); +static unsigned short +generate_runtime_stats(void *arg) +{ + lRefreshCount++; + sprintf( cCountBuf, "


Refresh count = %d", lRefreshCount ); + vTaskGetRunTimeStats( uip_appdata ); + strcat( uip_appdata, cCountBuf ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + + +static +PT_THREAD(run_time(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_runtime_stats, NULL); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +static PT_THREAD(led_io(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_io_state, NULL); + PSOCK_END(&s->sout); +} + +/** @} */ + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-cgi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-cgi.h new file mode 100644 index 0000000..7ae9283 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-cgi.h @@ -0,0 +1,84 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface header file + * \author + * Adam Dunkels + * + */ + + + +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_CGI_H__ +#define __HTTPD_CGI_H__ + +#include "psock.h" +#include "httpd.h" + +typedef PT_THREAD((* httpd_cgifunction)(struct httpd_state *, char *)); + +httpd_cgifunction httpd_cgi(char *name); + +struct httpd_cgi_call { + const char *name; + const httpd_cgifunction function; +}; + +/** + * \brief HTTPD CGI function declaration + * \param name The C variable name of the function + * \param str The string name of the function, used in the script file + * \param function A pointer to the function that implements it + * + * This macro is used for declaring a HTTPD CGI + * function. This function is then added to the list of + * HTTPD CGI functions with the httpd_cgi_add() function. + * + * \hideinitializer + */ +#define HTTPD_CGI_CALL(name, str, function) \ +static PT_THREAD(function(struct httpd_state *, char *)); \ +static const struct httpd_cgi_call name = {str, function} + +void httpd_cgi_init(void); +#endif /* __HTTPD_CGI_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs.c new file mode 100644 index 0000000..dc4aef0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.c,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ + +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-fsdata.h" + +#ifndef NULL +#define NULL 0 +#endif /* NULL */ + +#include "httpd-fsdata.c" + +#if HTTPD_FS_STATISTICS +static u16_t count[HTTPD_FS_NUMFILES]; +#endif /* HTTPD_FS_STATISTICS */ + +/*-----------------------------------------------------------------------------------*/ +static u8_t +httpd_fs_strcmp(const char *str1, const char *str2) +{ + u8_t i; + i = 0; + loop: + + if(str2[i] == 0 || + str1[i] == '\r' || + str1[i] == '\n') { + return 0; + } + + if(str1[i] != str2[i]) { + return 1; + } + + + ++i; + goto loop; +} +/*-----------------------------------------------------------------------------------*/ +int +httpd_fs_open(const char *name, struct httpd_fs_file *file) +{ +#if HTTPD_FS_STATISTICS + u16_t i = 0; +#endif /* HTTPD_FS_STATISTICS */ + struct httpd_fsdata_file_noconst *f; + + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + file->data = f->data; + file->len = f->len; +#if HTTPD_FS_STATISTICS + ++count[i]; +#endif /* HTTPD_FS_STATISTICS */ + return 1; + } +#if HTTPD_FS_STATISTICS + ++i; +#endif /* HTTPD_FS_STATISTICS */ + + } + return 0; +} +/*-----------------------------------------------------------------------------------*/ +void +httpd_fs_init(void) +{ +#if HTTPD_FS_STATISTICS + u16_t i; + for(i = 0; i < HTTPD_FS_NUMFILES; i++) { + count[i] = 0; + } +#endif /* HTTPD_FS_STATISTICS */ +} +/*-----------------------------------------------------------------------------------*/ +#if HTTPD_FS_STATISTICS +u16_t httpd_fs_count +(char *name) +{ + struct httpd_fsdata_file_noconst *f; + u16_t i; + + i = 0; + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + return count[i]; + } + ++i; + } + return 0; +} +#endif /* HTTPD_FS_STATISTICS */ +/*-----------------------------------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs.h new file mode 100644 index 0000000..b594eea --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FS_H__ +#define __HTTPD_FS_H__ + +#define HTTPD_FS_STATISTICS 1 + +struct httpd_fs_file { + char *data; + int len; +}; + +/* file must be allocated by caller and will be filled in + by the function. */ +int httpd_fs_open(const char *name, struct httpd_fs_file *file); + +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 +u16_t httpd_fs_count(char *name); +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ + +void httpd_fs_init(void); + +#endif /* __HTTPD_FS_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/404.html b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/404.html new file mode 100644 index 0000000..43e7f4c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/404.html @@ -0,0 +1,8 @@ + + +

+

404 - file not found

+

Go here instead.

+
+ + \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/index.html b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/index.html new file mode 100644 index 0000000..4937dc6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/index.html @@ -0,0 +1,13 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Loading index.shtml. Click here if not automatically redirected. + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/index.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/index.shtml new file mode 100644 index 0000000..29d242c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/index.shtml @@ -0,0 +1,20 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Task Stats | Run Time Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Task statistics

+Page will refresh every 2 seconds.

+

Task          State  Priority  Stack	#
************************************************
+%! rtos-stats +
+
+ + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/io.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/io.shtml new file mode 100644 index 0000000..fd0697d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/io.shtml @@ -0,0 +1,28 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Task Stats | Run Time Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+LED and LCD IO
+ +

+ +Use the check box to turn on or off the LED, enter text to display on the OLED display, then click "Update IO". + + +

+

+%! led-io +

+ +

+

+ + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/runtime.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/runtime.shtml new file mode 100644 index 0000000..67cae46 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/runtime.shtml @@ -0,0 +1,20 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Task Stats | Run Time Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Run-time statistics

+Page will refresh every 2 seconds.

+

Task            Abs Time      % Time
****************************************
+%! run-time +
+
+ + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/stats.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/stats.shtml new file mode 100644 index 0000000..d95a693 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/stats.shtml @@ -0,0 +1,41 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Task Stats | Run Time Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Network statistics

+ +
+IP           Packets dropped
+             Packets received
+             Packets sent
+IP errors    IP version/header length
+             IP length, high byte
+             IP length, low byte
+             IP fragments
+             Header checksum
+             Wrong protocol
+ICMP	     Packets dropped
+             Packets received
+             Packets sent
+             Type errors
+TCP          Packets dropped
+             Packets received
+             Packets sent
+             Checksum errors
+             Data packets without ACKs
+             Resets
+             Retransmissions
+	     No connection avaliable
+	     Connection attempts to closed ports
+
%! net-stats
+
+
+ + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/tcp.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/tcp.shtml new file mode 100644 index 0000000..4105367 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fs/tcp.shtml @@ -0,0 +1,21 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Task Stats | Run Time Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+
+

Network connections

+

+ + +%! tcp-connections + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fsdata.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fsdata.c new file mode 100644 index 0000000..7348902 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fsdata.c @@ -0,0 +1,557 @@ +static const unsigned char data_404_html[] = { + /* /404.html */ + 0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x3c, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65, 0x22, + 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x68, 0x31, 0x3e, 0x34, 0x30, 0x34, 0x20, 0x2d, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x3c, 0x2f, 0x68, 0x31, 0x3e, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x33, + 0x3e, 0x47, 0x6f, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x68, 0x65, 0x72, 0x65, + 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, + 0x61, 0x64, 0x2e, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, +0}; + +static const unsigned char data_index_html[] = { + /* /index.html */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, + 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 0x57, 0x45, 0x42, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, + 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x42, 0x4f, 0x44, 0x59, 0x20, 0x6f, + 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x3d, 0x22, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x28, 0x26, 0x71, 0x75, 0x6f, 0x74, + 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x27, 0x26, 0x71, + 0x75, 0x6f, 0x74, 0x3b, 0x2c, 0x31, 0x30, 0x30, 0x29, 0x22, + 0x3e, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, + 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x22, + 0x3e, 0xa, 0x4c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x2e, 0x20, 0x20, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x20, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x68, 0x65, 0x72, 0x65, 0x3c, 0x2f, 0x61, 0x3e, + 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, + 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x2e, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, + 0x3e, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, + 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0xa, 0}; + +static const unsigned char data_index_shtml[] = { + /* /index.shtml */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, + 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 0x57, 0x45, 0x42, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, + 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x42, 0x4f, 0x44, 0x59, 0x20, 0x6f, + 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x3d, 0x22, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x28, 0x26, 0x71, 0x75, 0x6f, 0x74, + 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x27, 0x26, 0x71, + 0x75, 0x6f, 0x74, 0x3b, 0x2c, 0x32, 0x30, 0x30, 0x30, 0x29, + 0x22, 0x3e, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, + 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 0x6c, + 0x22, 0x3e, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, + 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, + 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x52, 0x75, 0x6e, 0x20, 0x54, 0x69, 0x6d, + 0x65, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, + 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xa, 0x3c, 0x62, 0x72, + 0x3e, 0x3c, 0x70, 0x3e, 0xa, 0x3c, 0x68, 0x72, 0x3e, 0xa, + 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xa, 0x3c, 0x68, + 0x32, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, + 0x32, 0x3e, 0xa, 0x50, 0x61, 0x67, 0x65, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x32, 0x20, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x3c, 0x70, 0x3e, + 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, + 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, + 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x54, 0x61, 0x73, + 0x6b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x20, 0x50, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x20, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x9, 0x23, 0x3c, 0x62, 0x72, 0x3e, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x3c, 0x62, 0x72, + 0x3e, 0xa, 0x25, 0x21, 0x20, 0x72, 0x74, 0x6f, 0x73, 0x2d, + 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0x3c, 0x2f, 0x70, 0x72, + 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, + 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, 0x3c, 0x2f, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3e, 0xa, 0xa, 0}; + +static const unsigned char data_io_shtml[] = { + /* /io.shtml */ + 0x2f, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, + 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 0x57, 0x45, 0x42, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, + 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x42, 0x4f, 0x44, 0x59, 0x3e, 0xa, + 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, + 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x3e, 0xa, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x52, 0x75, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x66, 0x72, + 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, 0x6f, 0x6d, 0x65, + 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6f, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x49, 0x4f, 0x3c, + 0x2f, 0x61, 0x3e, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, + 0x3e, 0xa, 0x3c, 0x68, 0x72, 0x3e, 0xa, 0x3c, 0x62, 0x3e, + 0x4c, 0x45, 0x44, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x4c, 0x43, + 0x44, 0x20, 0x49, 0x4f, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x62, + 0x72, 0x3e, 0xa, 0xa, 0x3c, 0x70, 0x3e, 0xa, 0xa, 0x55, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x20, 0x62, 0x6f, 0x78, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x6f, 0x72, + 0x20, 0x6f, 0x66, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, + 0x45, 0x44, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, + 0x74, 0x65, 0x78, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4f, 0x4c, 0x45, 0x44, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x22, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x49, 0x4f, 0x22, 0x2e, + 0xa, 0xa, 0xa, 0x3c, 0x70, 0x3e, 0xa, 0x3c, 0x66, 0x6f, + 0x72, 0x6d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x61, + 0x46, 0x6f, 0x72, 0x6d, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x2f, 0x69, 0x6f, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3e, 0xa, 0x25, + 0x21, 0x20, 0x6c, 0x65, 0x64, 0x2d, 0x69, 0x6f, 0xa, 0x3c, + 0x70, 0x3e, 0xa, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, + 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x49, 0x4f, + 0x22, 0x3e, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, + 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xa, 0x3c, + 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, 0x3c, 0x2f, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, + 0x6c, 0x3e, 0xa, 0xa, 0}; + +static const unsigned char data_runtime_shtml[] = { + /* /runtime.shtml */ + 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, + 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 0x57, 0x45, 0x42, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, + 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x42, 0x4f, 0x44, 0x59, 0x20, 0x6f, + 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x3d, 0x22, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x28, 0x26, 0x71, 0x75, 0x6f, 0x74, + 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x27, + 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, 0x32, 0x30, 0x30, + 0x30, 0x29, 0x22, 0x3e, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, + 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, + 0x61, 0x6c, 0x22, 0x3e, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x54, 0x61, 0x73, + 0x6b, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x75, 0x6e, 0x20, 0x54, + 0x69, 0x6d, 0x65, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, + 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, + 0x73, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x22, 0x3e, 0x46, 0x72, + 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, 0x72, 0x67, + 0x20, 0x48, 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xa, 0x3c, + 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xa, + 0x3c, 0x68, 0x32, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x3c, + 0x2f, 0x68, 0x32, 0x3e, 0xa, 0x50, 0x61, 0x67, 0x65, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x32, + 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x3c, + 0x70, 0x3e, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, + 0x61, 0x63, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x75, 0x72, 0x69, + 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x54, + 0x61, 0x73, 0x6b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x62, 0x73, 0x20, 0x54, + 0x69, 0x6d, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x25, + 0x20, 0x54, 0x69, 0x6d, 0x65, 0x3c, 0x62, 0x72, 0x3e, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x3c, + 0x62, 0x72, 0x3e, 0xa, 0x25, 0x21, 0x20, 0x72, 0x75, 0x6e, + 0x2d, 0x74, 0x69, 0x6d, 0x65, 0xa, 0x3c, 0x2f, 0x70, 0x72, + 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, + 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, 0x3c, 0x2f, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3e, 0xa, 0xa, 0}; + +static const unsigned char data_stats_shtml[] = { + /* /stats.shtml */ + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, + 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 0x57, 0x45, 0x42, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, + 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x42, 0x4f, 0x44, 0x59, 0x3e, 0xa, + 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, + 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x3e, 0xa, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x52, 0x75, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x66, 0x72, + 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, 0x6f, 0x6d, 0x65, + 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6f, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x49, 0x4f, 0x3c, + 0x2f, 0x61, 0x3e, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, + 0x3e, 0xa, 0x3c, 0x68, 0x72, 0x3e, 0xa, 0x3c, 0x62, 0x72, + 0x3e, 0x3c, 0x70, 0x3e, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, + 0x32, 0x3e, 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x33, 0x30, 0x30, + 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, + 0x30, 0x22, 0x3e, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, + 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, + 0x65, 0x66, 0x74, 0x22, 0x3e, 0x3c, 0x66, 0x6f, 0x6e, 0x74, + 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x75, + 0x72, 0x69, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x65, + 0x3e, 0xa, 0x49, 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xa, 0x49, 0x50, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, 0x20, 0x20, 0x20, + 0x49, 0x50, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, + 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x68, + 0x69, 0x67, 0x68, 0x20, 0x62, 0x79, 0x74, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x49, 0x50, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x20, 0x6c, 0x6f, 0x77, 0x20, 0x62, 0x79, 0x74, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x57, 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0xa, 0x49, 0x43, 0x4d, 0x50, 0x9, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x54, 0x79, 0x70, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0xa, 0x54, 0x43, 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, + 0x41, 0x43, 0x4b, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, + 0x73, 0x65, 0x74, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4e, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, 0x61, 0x6c, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x20, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0xa, 0x3c, 0x2f, 0x70, 0x72, + 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x70, + 0x72, 0x65, 0x3e, 0x25, 0x21, 0x20, 0x6e, 0x65, 0x74, 0x2d, + 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0x3c, 0x2f, 0x70, 0x72, + 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, 0x3c, + 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, + 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0}; + +static const unsigned char data_tcp_shtml[] = { + /* /tcp.shtml */ + 0x2f, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, + 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 0x57, 0x45, 0x42, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, + 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x42, 0x4f, 0x44, 0x59, 0x3e, 0xa, + 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, + 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x3e, 0xa, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x52, 0x75, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x66, 0x72, + 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, 0x6f, 0x6d, 0x65, + 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6f, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x49, 0x4f, 0x3c, + 0x2f, 0x61, 0x3e, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, + 0x3e, 0xa, 0x3c, 0x68, 0x72, 0x3e, 0xa, 0x3c, 0x62, 0x72, + 0x3e, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, + 0xa, 0x3c, 0x70, 0x3e, 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, + 0x3e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x68, + 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, + 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, + 0x68, 0x3e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3c, 0x2f, 0x74, + 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x25, 0x21, + 0x20, 0x74, 0x63, 0x70, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa, 0x3c, 0x2f, 0x70, + 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, + 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, 0x3c, + 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, + 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0xa, 0}; + +const struct httpd_fsdata_file file_404_html[] = {{NULL, data_404_html, data_404_html + 10, sizeof(data_404_html) - 10}}; + +const struct httpd_fsdata_file file_index_html[] = {{file_404_html, data_index_html, data_index_html + 12, sizeof(data_index_html) - 12}}; + +const struct httpd_fsdata_file file_index_shtml[] = {{file_index_html, data_index_shtml, data_index_shtml + 13, sizeof(data_index_shtml) - 13}}; + +const struct httpd_fsdata_file file_io_shtml[] = {{file_index_shtml, data_io_shtml, data_io_shtml + 10, sizeof(data_io_shtml) - 10}}; + +const struct httpd_fsdata_file file_runtime_shtml[] = {{file_io_shtml, data_runtime_shtml, data_runtime_shtml + 15, sizeof(data_runtime_shtml) - 15}}; + +const struct httpd_fsdata_file file_stats_shtml[] = {{file_runtime_shtml, data_stats_shtml, data_stats_shtml + 13, sizeof(data_stats_shtml) - 13}}; + +const struct httpd_fsdata_file file_tcp_shtml[] = {{file_stats_shtml, data_tcp_shtml, data_tcp_shtml + 11, sizeof(data_tcp_shtml) - 11}}; + +#define HTTPD_FS_ROOT file_tcp_shtml + +#define HTTPD_FS_NUMFILES 7 diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fsdata.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fsdata.h new file mode 100644 index 0000000..52d35c2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd-fsdata.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fsdata.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FSDATA_H__ +#define __HTTPD_FSDATA_H__ + +#include "uip.h" + +struct httpd_fsdata_file { + const struct httpd_fsdata_file *next; + const char *name; + const char *data; + const int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +struct httpd_fsdata_file_noconst { + struct httpd_fsdata_file *next; + char *name; + char *data; + int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +#endif /* __HTTPD_FSDATA_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd.c new file mode 100644 index 0000000..644cf16 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd.c @@ -0,0 +1,346 @@ +/** + * \addtogroup apps + * @{ + */ + +/** + * \defgroup httpd Web server + * @{ + * The uIP web server is a very simplistic implementation of an HTTP + * server. It can serve web pages and files from a read-only ROM + * filesystem, and provides a very small scripting language. + + */ + +/** + * \file + * Web server + * \author + * Adam Dunkels + */ + + +/* + * Copyright (c) 2004, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd.c,v 1.2 2006/06/11 21:46:38 adam Exp $ + */ + +#include "uip.h" +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-cgi.h" +#include "http-strings.h" + +#include + +#define STATE_WAITING 0 +#define STATE_OUTPUT 1 + +#define ISO_nl 0x0a +#define ISO_space 0x20 +#define ISO_bang 0x21 +#define ISO_percent 0x25 +#define ISO_period 0x2e +#define ISO_slash 0x2f +#define ISO_colon 0x3a + + +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_part_of_file(void *state) +{ + struct httpd_state *s = (struct httpd_state *)state; + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + memcpy(uip_appdata, s->file.data, s->len); + + return s->len; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + do { + PSOCK_GENERATOR_SEND(&s->sout, generate_part_of_file, s); + s->file.len -= s->len; + s->file.data += s->len; + } while(s->file.len > 0); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_part_of_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND(&s->sout, s->file.data, s->len); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static void +next_scriptstate(struct httpd_state *s) +{ + char *p; + p = strchr(s->scriptptr, ISO_nl) + 1; + s->scriptlen -= (unsigned short)(p - s->scriptptr); + s->scriptptr = p; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_script(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->scriptpt); + + + while(s->file.len > 0) { + + /* Check if we should start executing a script. */ + if(*s->file.data == ISO_percent && + *(s->file.data + 1) == ISO_bang) { + s->scriptptr = s->file.data + 3; + s->scriptlen = s->file.len - 3; + if(*(s->scriptptr - 1) == ISO_colon) { + httpd_fs_open(s->scriptptr + 1, &s->file); + PT_WAIT_THREAD(&s->scriptpt, send_file(s)); + } else { + PT_WAIT_THREAD(&s->scriptpt, + httpd_cgi(s->scriptptr)(s, s->scriptptr)); + } + next_scriptstate(s); + + /* The script is over, so we reset the pointers and continue + sending the rest of the file. */ + s->file.data = s->scriptptr; + s->file.len = s->scriptlen; + } else { + /* See if we find the start of script marker in the block of HTML + to be sent. */ + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + + if(*s->file.data == ISO_percent) { + ptr = strchr(s->file.data + 1, ISO_percent); + } else { + ptr = strchr(s->file.data, ISO_percent); + } + if(ptr != NULL && + ptr != s->file.data) { + s->len = (int)(ptr - s->file.data); + if(s->len >= uip_mss()) { + s->len = uip_mss(); + } + } + PT_WAIT_THREAD(&s->scriptpt, send_part_of_file(s)); + s->file.data += s->len; + s->file.len -= s->len; + + } + } + + PT_END(&s->scriptpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_headers(struct httpd_state *s, const char *statushdr)) +{ + char *ptr; + + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND_STR(&s->sout, statushdr); + + ptr = strrchr(s->filename, ISO_period); + if(ptr == NULL) { + PSOCK_SEND_STR(&s->sout, http_content_type_binary); + } else if(strncmp(http_html, ptr, 5) == 0 || + strncmp(http_shtml, ptr, 6) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_html); + } else if(strncmp(http_css, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_css); + } else if(strncmp(http_png, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_png); + } else if(strncmp(http_gif, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_gif); + } else if(strncmp(http_jpg, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_jpg); + } else { + PSOCK_SEND_STR(&s->sout, http_content_type_plain); + } + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_output(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->outputpt); + + if(!httpd_fs_open(s->filename, &s->file)) { + httpd_fs_open(http_404_html, &s->file); + strcpy(s->filename, http_404_html); + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_404)); + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_200)); + ptr = strchr(s->filename, ISO_period); + if(ptr != NULL && strncmp(ptr, http_shtml, 6) == 0) { + PT_INIT(&s->scriptpt); + PT_WAIT_THREAD(&s->outputpt, handle_script(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } + } + PSOCK_CLOSE(&s->sout); + PT_END(&s->outputpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_input(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sin); + + PSOCK_READTO(&s->sin, ISO_space); + + + if(strncmp(s->inputbuf, http_get, 4) != 0) { + PSOCK_CLOSE_EXIT(&s->sin); + } + PSOCK_READTO(&s->sin, ISO_space); + + if(s->inputbuf[0] != ISO_slash) { + PSOCK_CLOSE_EXIT(&s->sin); + } + + if(s->inputbuf[1] == ISO_space) { + strncpy(s->filename, http_index_html, sizeof(s->filename)); + } else { + + s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; + + /* Process any form input being sent to the server. */ + { + extern void vApplicationProcessFormInput( char *pcInputString, long xInputLength ); + vApplicationProcessFormInput( s->inputbuf, PSOCK_DATALEN(&s->sin) ); + } + + strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); + } + + /* httpd_log_file(uip_conn->ripaddr, s->filename);*/ + + s->state = STATE_OUTPUT; + + while(1) { + PSOCK_READTO(&s->sin, ISO_nl); + + if(strncmp(s->inputbuf, http_referer, 8) == 0) { + s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0; + /* httpd_log(&s->inputbuf[9]);*/ + } + } + + PSOCK_END(&s->sin); +} +/*---------------------------------------------------------------------------*/ +static void +handle_connection(struct httpd_state *s) +{ + handle_input(s); + if(s->state == STATE_OUTPUT) { + handle_output(s); + } +} +/*---------------------------------------------------------------------------*/ +void +httpd_appcall(void) +{ + struct httpd_state *s = (struct httpd_state *)&(uip_conn->appstate); + + if(uip_closed() || uip_aborted() || uip_timedout()) { + } else if(uip_connected()) { + PSOCK_INIT(&s->sin, s->inputbuf, sizeof(s->inputbuf) - 1); + PSOCK_INIT(&s->sout, s->inputbuf, sizeof(s->inputbuf) - 1); + PT_INIT(&s->outputpt); + s->state = STATE_WAITING; + /* timer_set(&s->timer, CLOCK_SECOND * 100);*/ + s->timer = 0; + handle_connection(s); + } else if(s != NULL) { + if(uip_poll()) { + ++s->timer; + if(s->timer >= 20) { + uip_abort(); + } + } else { + s->timer = 0; + } + handle_connection(s); + } else { + uip_abort(); + } +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Initialize the web server + * + * This function initializes the web server and should be + * called at system boot-up. + */ +void +httpd_init(void) +{ + uip_listen(HTONS(80)); +} +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd.h new file mode 100644 index 0000000..7f7a666 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/httpd.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2001-2005, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_H__ +#define __HTTPD_H__ + +#include "psock.h" +#include "httpd-fs.h" + +struct httpd_state { + unsigned char timer; + struct psock sin, sout; + struct pt outputpt, scriptpt; + char inputbuf[50]; + char filename[20]; + char state; + struct httpd_fs_file file; + int len; + char *scriptptr; + int scriptlen; + + unsigned short count; +}; + +void httpd_init(void); +void httpd_appcall(void); + +void httpd_log(char *msg); +void httpd_log_file(u16_t *requester, char *file); + +#endif /* __HTTPD_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/makefsdata b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/makefsdata new file mode 100644 index 0000000..8d2715a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/makefsdata @@ -0,0 +1,78 @@ +#!/usr/bin/perl + +open(OUTPUT, "> httpd-fsdata.c"); + +chdir("httpd-fs"); + +opendir(DIR, "."); +@files = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); +closedir(DIR); + +foreach $file (@files) { + + if(-d $file && $file !~ /^\./) { + print "Processing directory $file\n"; + opendir(DIR, $file); + @newfiles = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); + closedir(DIR); + printf "Adding files @newfiles\n"; + @files = (@files, map { $_ = "$file/$_" } @newfiles); + next; + } +} + +foreach $file (@files) { + if(-f $file) { + + print "Adding file $file\n"; + + open(FILE, $file) || die "Could not open file $file\n"; + + $file =~ s-^-/-; + $fvar = $file; + $fvar =~ s-/-_-g; + $fvar =~ s-\.-_-g; + # for AVR, add PROGMEM here + print(OUTPUT "static const unsigned char data".$fvar."[] = {\n"); + print(OUTPUT "\t/* $file */\n\t"); + for($j = 0; $j < length($file); $j++) { + printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1))); + } + printf(OUTPUT "0,\n"); + + + $i = 0; + while(read(FILE, $data, 1)) { + if($i == 0) { + print(OUTPUT "\t"); + } + printf(OUTPUT "%#02x, ", unpack("C", $data)); + $i++; + if($i == 10) { + print(OUTPUT "\n"); + $i = 0; + } + } + print(OUTPUT "0};\n\n"); + close(FILE); + push(@fvars, $fvar); + push(@pfiles, $file); + } +} + +for($i = 0; $i < @fvars; $i++) { + $file = $pfiles[$i]; + $fvar = $fvars[$i]; + + if($i == 0) { + $prevfile = "NULL"; + } else { + $prevfile = "file" . $fvars[$i - 1]; + } + print(OUTPUT "const struct httpd_fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, "); + print(OUTPUT "data$fvar + ". (length($file) + 1) .", "); + print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n"); +} + +print(OUTPUT "#define HTTPD_FS_ROOT file$fvars[$i - 1]\n\n"); +print(OUTPUT "#define HTTPD_FS_NUMFILES $i\n"); diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/makestrings b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/makestrings new file mode 100644 index 0000000..8a13c6d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/makestrings @@ -0,0 +1,40 @@ +#!/usr/bin/perl + + +sub stringify { + my $name = shift(@_); + open(OUTPUTC, "> $name.c"); + open(OUTPUTH, "> $name.h"); + + open(FILE, "$name"); + + while() { + if(/(.+) "(.+)"/) { + $var = $1; + $data = $2; + + $datan = $data; + $datan =~ s/\\r/\r/g; + $datan =~ s/\\n/\n/g; + $datan =~ s/\\01/\01/g; + $datan =~ s/\\0/\0/g; + + printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1); + printf(OUTPUTC "/* \"$data\" */\n"); + printf(OUTPUTC "{"); + for($j = 0; $j < length($datan); $j++) { + printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1))); + } + printf(OUTPUTC "};\n"); + + printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1); + + } + } + close(OUTPUTC); + close(OUTPUTH); +} +stringify("http-strings"); + +exit 0; + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/uIP_Task.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/uIP_Task.c new file mode 100644 index 0000000..6315c9c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/uIP_Task.c @@ -0,0 +1,338 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +#include "lcd_message.h" + +/* uip includes. */ +#include "hw_types.h" + +#include "uip.h" +#include "uip_arp.h" +#include "httpd.h" +#include "timer.h" +#include "clock-arch.h" +#include "hw_ethernet.h" +#include "ethernet.h" +#include "hw_memmap.h" +#include "lmi_flash.h" +#include "sysctl.h" + +/* Demo includes. */ +#include "emac.h" +#include "partest.h" + +/*-----------------------------------------------------------*/ + +/* IP address configuration. */ +#define uipIP_ADDR0 172 +#define uipIP_ADDR1 25 +#define uipIP_ADDR2 218 +#define uipIP_ADDR3 19 + +/* How long to wait before attempting to connect the MAC again. */ +#define uipINIT_WAIT 100 + +/* Shortcut to the header within the Rx buffer. */ +#define xHeader ((struct uip_eth_hdr *) &uip_buf[ 0 ]) + +/* Standard constant. */ +#define uipTOTAL_FRAME_HEADER_SIZE 54 + +/*-----------------------------------------------------------*/ + +/* + * Send the uIP buffer to the MAC. + */ +static void prvENET_Send(void); + +/* + * Setup the MAC address in the MAC itself, and in the uIP stack. + */ +static void prvSetMACAddress( void ); + +/* + * Port functions required by the uIP stack. + */ +void clock_init( void ); +clock_time_t clock_time( void ); + +/*-----------------------------------------------------------*/ + +/* The semaphore used by the ISR to wake the uIP task. */ +extern xSemaphoreHandle xEMACSemaphore; + +/*-----------------------------------------------------------*/ + +void clock_init(void) +{ + /* This is done when the scheduler starts. */ +} +/*-----------------------------------------------------------*/ + +clock_time_t clock_time( void ) +{ + return xTaskGetTickCount(); +} + + +void vuIP_Task( void *pvParameters ) +{ +portBASE_TYPE i; +uip_ipaddr_t xIPAddr; +struct timer periodic_timer, arp_timer; +extern void ( vEMAC_ISR )( void ); + + /* Enable/Reset the Ethernet Controller */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_ETH ); + SysCtlPeripheralReset( SYSCTL_PERIPH_ETH ); + + /* Create the semaphore used by the ISR to wake this task. */ + vSemaphoreCreateBinary( xEMACSemaphore ); + + /* Initialise the uIP stack. */ + timer_set( &periodic_timer, configTICK_RATE_HZ / 2 ); + timer_set( &arp_timer, configTICK_RATE_HZ * 10 ); + uip_init(); + uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 ); + uip_sethostaddr( xIPAddr ); + httpd_init(); + + while( vInitEMAC() != pdPASS ) + { + vTaskDelay( uipINIT_WAIT ); + } + prvSetMACAddress(); + + + for( ;; ) + { + /* Is there received data ready to be processed? */ + uip_len = uiGetEMACRxData( uip_buf ); + + if( uip_len > 0 ) + { + /* Standard uIP loop taken from the uIP manual. */ + + if( xHeader->type == htons( UIP_ETHTYPE_IP ) ) + { + uip_arp_ipin(); + uip_input(); + + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if( uip_len > 0 ) + { + uip_arp_out(); + prvENET_Send(); + } + } + else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) ) + { + uip_arp_arpin(); + + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if( uip_len > 0 ) + { + prvENET_Send(); + } + } + } + else + { + if( timer_expired( &periodic_timer ) ) + { + timer_reset( &periodic_timer ); + for( i = 0; i < UIP_CONNS; i++ ) + { + uip_periodic( i ); + + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if( uip_len > 0 ) + { + uip_arp_out(); + prvENET_Send(); + } + } + + /* Call the ARP timer function every 10 seconds. */ + if( timer_expired( &arp_timer ) ) + { + timer_reset( &arp_timer ); + uip_arp_timer(); + } + } + else + { + /* We did not receive a packet, and there was no periodic + processing to perform. Block for a fixed period. If a packet + is received during this period we will be woken by the ISR + giving us the Semaphore. */ + xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 2 ); + } + } + } +} +/*-----------------------------------------------------------*/ + +static void prvENET_Send(void) +{ + vInitialiseSend(); + vIncrementTxLength( uip_len ); + vSendBufferToMAC(); +} +/*-----------------------------------------------------------*/ + +static void prvSetMACAddress( void ) +{ +unsigned portLONG ulUser0, ulUser1; +unsigned char pucMACArray[8]; +struct uip_eth_addr xAddr; + + /* Get the device MAC address from flash */ + FlashUserGet(&ulUser0, &ulUser1); + + /* Convert the MAC address from flash into sequence of bytes. */ + pucMACArray[0] = ((ulUser0 >> 0) & 0xff); + pucMACArray[1] = ((ulUser0 >> 8) & 0xff); + pucMACArray[2] = ((ulUser0 >> 16) & 0xff); + pucMACArray[3] = ((ulUser1 >> 0) & 0xff); + pucMACArray[4] = ((ulUser1 >> 8) & 0xff); + pucMACArray[5] = ((ulUser1 >> 16) & 0xff); + + /* Program the MAC address. */ + EthernetMACAddrSet(ETH_BASE, pucMACArray); + + xAddr.addr[ 0 ] = pucMACArray[0]; + xAddr.addr[ 1 ] = pucMACArray[1]; + xAddr.addr[ 2 ] = pucMACArray[2]; + xAddr.addr[ 3 ] = pucMACArray[3]; + xAddr.addr[ 4 ] = pucMACArray[4]; + xAddr.addr[ 5 ] = pucMACArray[5]; + uip_setethaddr( xAddr ); +} +/*-----------------------------------------------------------*/ + +void vApplicationProcessFormInput( portCHAR *pcInputString, portBASE_TYPE xInputLength ) +{ +char *c, *pcText; +static portCHAR cMessageForDisplay[ 32 ]; +extern xQueueHandle xOLEDQueue; +xOLEDMessage xOLEDMessage; + + /* Process the form input sent by the IO page of the served HTML. */ + + c = strstr( pcInputString, "?" ); + + if( c ) + { + /* Turn LED's on or off in accordance with the check box status. */ + if( strstr( c, "LED0=1" ) != NULL ) + { + vParTestSetLED( 0, 1 ); + } + else + { + vParTestSetLED( 0, 0 ); + } + + /* Find the start of the text to be displayed on the LCD. */ + pcText = strstr( c, "LCD=" ); + pcText += strlen( "LCD=" ); + + /* Terminate the file name for further processing within uIP. */ + *c = 0x00; + + /* Terminate the LCD string. */ + c = strstr( pcText, " " ); + if( c != NULL ) + { + *c = 0x00; + } + + /* Add required spaces. */ + while( ( c = strstr( pcText, "+" ) ) != NULL ) + { + *c = ' '; + } + + /* Write the message to the LCD. */ + strcpy( cMessageForDisplay, pcText ); + xOLEDMessage.pcMessage = cMessageForDisplay; + xQueueSend( xOLEDQueue, &xOLEDMessage, portMAX_DELAY ); + } +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/uip-conf.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/uip-conf.h new file mode 100644 index 0000000..664077d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/uip-conf.h @@ -0,0 +1,159 @@ +/** + * \addtogroup uipopt + * @{ + */ + +/** + * \name Project-specific configuration options + * @{ + * + * uIP has a number of configuration options that can be overridden + * for each project. These are kept in a project-specific uip-conf.h + * file and all configuration names have the prefix UIP_CONF. + */ + +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * An example uIP configuration file + * \author + * Adam Dunkels + */ + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + +#include + +/** + * 8 bit datatype + * + * This typedef defines the 8-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint8_t u8_t; + +/** + * 16 bit datatype + * + * This typedef defines the 16-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint16_t u16_t; + +/** + * Statistics datatype + * + * This typedef defines the dataype used for keeping statistics in + * uIP. + * + * \hideinitializer + */ +typedef unsigned short uip_stats_t; + +/** + * Maximum number of TCP connections. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_CONNECTIONS 40 + +/** + * Maximum number of listening TCP ports. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_LISTENPORTS 40 + +/** + * uIP buffer size. + * + * \hideinitializer + */ +#define UIP_CONF_BUFFER_SIZE 1500 + +/** + * CPU byte order. + * + * \hideinitializer + */ +#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN + +/** + * Logging on or off + * + * \hideinitializer + */ +#define UIP_CONF_LOGGING 0 + +/** + * UDP support on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP 0 + +/** + * UDP checksums on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP_CHECKSUMS 1 + +/** + * uIP statistics on or off + * + * \hideinitializer + */ +#define UIP_CONF_STATISTICS 1 + +/* Here we include the header file for the application(s) we use in + our project. */ +/*#include "smtp.h"*/ +/*#include "hello-world.h"*/ +/*#include "telnetd.h"*/ +#include "webserver.h" +/*#include "dhcpc.h"*/ +/*#include "resolv.h"*/ +/*#include "webclient.h"*/ + +#define UIP_CONF_EXTERNAL_BUFFER + +#endif /* __UIP_CONF_H__ */ + +/** @} */ +/** @} */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/webserver.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/webserver.h new file mode 100644 index 0000000..1acb290 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/RTOSDemo/webserver/webserver.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: webserver.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ +#ifndef __WEBSERVER_H__ +#define __WEBSERVER_H__ + +#include "httpd.h" + +typedef struct httpd_state uip_tcp_appstate_t; +/* UIP_APPCALL: the name of the application function. This function + must return void and take no arguments (i.e., C type "void + appfunc(void)"). */ +#ifndef UIP_APPCALL +#define UIP_APPCALL httpd_appcall +#endif + + +#endif /* __WEBSERVER_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/fury_ft2232.cfg b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/fury_ft2232.cfg new file mode 100644 index 0000000..8f2b3ed --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/fury_ft2232.cfg @@ -0,0 +1,28 @@ +#daemon configuration +telnet_port 4444 +gdb_port 3333 + +#interface +interface ft2232 +ft2232_device_desc "Stellaris Evaluation Board A" +ft2232_layout evb_lm3s811 +ft2232_vid_pid 0x0403 0xbcd9 +jtag_speed 40 +#LM3S811 Evaluation Board has only srst +reset_config srst_only separate + +#jtag scan chain +#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE) +jtag_device 4 0x1 0xf 0xe + +#target configuration +daemon_startup attach +#target +#target arm7tdmi +target cortex_m3 little run_and_halt 0 +# 4k working area at base of ram +working_area 0 0x20000800 0x1200 nobackup +#target_script 0 reset ../doc/scripts/evb_lm3s811_test.script + +#flash configuration +flash bank stellaris 0 0 0 0 0 diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/fury_ft2232_flash.cfg b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/fury_ft2232_flash.cfg new file mode 100644 index 0000000..28ffaea --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/fury_ft2232_flash.cfg @@ -0,0 +1,34 @@ +#daemon configuration +telnet_port 4444 +gdb_port 3333 + +#interface +interface ft2232 +ft2232_device_desc "Stellaris Evaluation Board A" +ft2232_layout evb_lm3s811 +ft2232_vid_pid 0x0403 0xbcd9 +jtag_speed 40 +#LM3S811 Evaluation Board has only srst +reset_config srst_only separate + +#jtag scan chain +#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE) +jtag_device 4 0x1 0xf 0xe + +#target configuration +daemon_startup reset +#target +#target arm7tdmi +target cortex_m3 little run_and_init 0 +# 4k working area at base of ram +working_area 0 0x20000800 0x1200 nobackup +#target_script 0 reset ../doc/scripts/evb_lm3s811_test.script + +target_script 0 reset program.script + + +#flash configuration +flash bank stellaris 0 0 0 0 0 + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/program.script b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/program.script new file mode 100644 index 0000000..314624b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Eclipse/program.script @@ -0,0 +1,17 @@ +halt +sleep 200 +wait_halt +flash probe 0 +#sleep 500 +flash info 0 +#sleep 500 +#flash protect 0 0 31 off +#sleep 500 +flash erase 0 0 255 +sleep 200 +flash write 0 ./RTOSDemo/RTOSDemo.bin 0 +sleep 200 +reset run +shutdown + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Backup of RTOSDemo.ewd b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Backup of RTOSDemo.ewd new file mode 100644 index 0000000..1d3a442 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Backup of RTOSDemo.ewd @@ -0,0 +1,586 @@ + + + + 1 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 13 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + IARROM_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + JLINK_ID + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + MACRAIGOR_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CMXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CMXTinyArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OSE\OseEpsilonPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Profiling\Profiling.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Backup of RTOSDemo.ewp b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Backup of RTOSDemo.ewp new file mode 100644 index 0000000..a0a8e38 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Backup of RTOSDemo.ewp @@ -0,0 +1,947 @@ + + + + 1 + + Debug + + ARM + + 1 + + General + 2 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 7 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 2 + + 18 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 2 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Demo files + + $PROJ_DIR$\..\Common\Minimal\BlockQ.c + + + $PROJ_DIR$\..\Common\Minimal\blocktim.c + + + $PROJ_DIR$\..\Common\Minimal\death.c + + + $PROJ_DIR$\..\Common\Minimal\flash.c + + + $PROJ_DIR$\..\Common\Minimal\GenQTest.c + + + $PROJ_DIR$\..\Common\Minimal\integer.c + + + $PROJ_DIR$\main.c + + + $PROJ_DIR$\ParTest\ParTest.c + + + $PROJ_DIR$\..\Common\Minimal\PollQ.c + + + $PROJ_DIR$\..\Common\Minimal\QPeek.c + + + $PROJ_DIR$\..\Common\Minimal\semtest.c + + + $PROJ_DIR$\timertest.c + + + + Library files + + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\IAR\driverlib.r79 + + + $PROJ_DIR$\osram128x64x4.c + + + $PROJ_DIR$\rit128x96x4.c + + + + Scheduler files + + $PROJ_DIR$\..\..\Source\portable\MemMang\heap_2.c + + + $PROJ_DIR$\..\..\Source\list.c + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\port.c + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portasm.s + + + $PROJ_DIR$\..\..\Source\queue.c + + + $PROJ_DIR$\..\..\Source\tasks.c + + + + System files + + $PROJ_DIR$\startup_ewarm.c + + + + uIP files + + $PROJ_DIR$\webserver\emac.c + + + $PROJ_DIR$\webserver\http-strings.c + + + $PROJ_DIR$\webserver\httpd-cgi.c + + + $PROJ_DIR$\webserver\httpd-fs.c + + + $PROJ_DIR$\webserver\httpd.c + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\psock.c + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\timer.c + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip.c + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c + + + $PROJ_DIR$\webserver\uIP_Task.c + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Exe/RTOSDemo.out b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Exe/RTOSDemo.out new file mode 100644 index 0000000..51ee890 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Exe/RTOSDemo.out differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Exe/RTOSDemo.sim b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Exe/RTOSDemo.sim new file mode 100644 index 0000000..640164d Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Exe/RTOSDemo.sim differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/BlockQ.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/BlockQ.pbi new file mode 100644 index 0000000..dcca4c1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/BlockQ.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 16s +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\BlockQ.c +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\BlockQ.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/GenQTest.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/GenQTest.pbi new file mode 100644 index 0000000..f520d85 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/GenQTest.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 17s +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\GenQTest.c +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\GenQTest.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/ParTest.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/ParTest.pbi new file mode 100644 index 0000000..70657dc --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/ParTest.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 18s +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ParTest\ParTest.c +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ParTest\ParTest.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/PollQ.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/PollQ.pbi new file mode 100644 index 0000000..03ca0a5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/PollQ.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 19s +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\PollQ.c +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\PollQ.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/QPeek.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/QPeek.pbi new file mode 100644 index 0000000..63930bc --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/QPeek.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 19s +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\QPeek.c +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\QPeek.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/RTOSDemo.pbd b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/RTOSDemo.pbd new file mode 100644 index 0000000..d4563ba --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/RTOSDemo.pbd @@ -0,0 +1,32 @@ +This is an internal working file generated by the Source Browser. +08:43 51s +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\BlockQ.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\GenQTest.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ParTest.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\PollQ.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\QPeek.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\blocktim.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\death.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\emac.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\flash.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\heap_2.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\http-strings.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\httpd-cgi.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\httpd-fs.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\httpd.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\integer.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\list.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\main.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\osram128x64x4.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\port.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\psock.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\queue.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\rit128x96x4.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\semtest.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\startup_ewarm.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\tasks.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\timer.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\timertest.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\uIP_Task.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\uip.pbi +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\uip_arp.pbi diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/blocktim.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/blocktim.pbi new file mode 100644 index 0000000..f9c643e --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/blocktim.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 16s +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\blocktim.c +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\blocktim.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/death.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/death.pbi new file mode 100644 index 0000000..6a62956 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/death.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 17s +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\death.c +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\death.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/emac.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/emac.pbi new file mode 100644 index 0000000..08372c0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/emac.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 39s +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\emac.c +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\emac.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/flash.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/flash.pbi new file mode 100644 index 0000000..d2e6e1b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/flash.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 17s +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\flash.c +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\flash.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/heap_2.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/heap_2.pbi new file mode 100644 index 0000000..ae068e3 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/heap_2.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 20s +C:\home\dwilson\dev\FreeRTOS\Source\portable\MemMang\heap_2.c +C:\home\dwilson\dev\FreeRTOS\Source\portable\MemMang\heap_2.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/http-strings.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/http-strings.pbi new file mode 100644 index 0000000..5733b96 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/http-strings.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 39s +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\http-strings.c +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\http-strings.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/httpd-cgi.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/httpd-cgi.pbi new file mode 100644 index 0000000..73bd264 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/httpd-cgi.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 39s +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\httpd-cgi.c +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\httpd-cgi.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/httpd-fs.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/httpd-fs.pbi new file mode 100644 index 0000000..bb1e976 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/httpd-fs.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 40s +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\httpd-fs.c +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\httpd-fs.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/httpd.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/httpd.pbi new file mode 100644 index 0000000..9bc502d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/httpd.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 40s +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\httpd.c +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\httpd.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/integer.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/integer.pbi new file mode 100644 index 0000000..56ecedd --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/integer.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 18s +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\integer.c +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\integer.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/list.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/list.pbi new file mode 100644 index 0000000..77b5077 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/list.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 21s +C:\home\dwilson\dev\FreeRTOS\Source\list.c +C:\home\dwilson\dev\FreeRTOS\Source\list.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/main.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/main.pbi new file mode 100644 index 0000000..b3e83de --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/main.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 18s +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\main.c +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\main.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/osram128x64x4.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/osram128x64x4.pbi new file mode 100644 index 0000000..d86afb3 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/osram128x64x4.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 20s +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\osram128x64x4.c +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\osram128x64x4.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/port.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/port.pbi new file mode 100644 index 0000000..e102f0e --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/port.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 37s +C:\home\dwilson\dev\FreeRTOS\Source\portable\IAR\ARM_CM3\port.c +C:\home\dwilson\dev\FreeRTOS\Source\portable\IAR\ARM_CM3\port.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/psock.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/psock.pbi new file mode 100644 index 0000000..8f09fb1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/psock.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 40s +C:\home\dwilson\dev\FreeRTOS\Demo\Common\ethernet\uIP\uip-1.0\uip\psock.c +C:\home\dwilson\dev\FreeRTOS\Demo\Common\ethernet\uIP\uip-1.0\uip\psock.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/queue.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/queue.pbi new file mode 100644 index 0000000..dac592b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/queue.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 38s +C:\home\dwilson\dev\FreeRTOS\Source\queue.c +C:\home\dwilson\dev\FreeRTOS\Source\queue.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/rit128x96x4.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/rit128x96x4.pbi new file mode 100644 index 0000000..54087a1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/rit128x96x4.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 20s +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\rit128x96x4.c +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\rit128x96x4.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/semtest.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/semtest.pbi new file mode 100644 index 0000000..3c27b78 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/semtest.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 19s +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\semtest.c +C:\home\dwilson\dev\FreeRTOS\Demo\Common\Minimal\semtest.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/startup_ewarm.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/startup_ewarm.pbi new file mode 100644 index 0000000..e88c578 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/startup_ewarm.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 51s +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\startup_ewarm.c +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\startup_ewarm.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/tasks.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/tasks.pbi new file mode 100644 index 0000000..00ddacc --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/tasks.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 38s +C:\home\dwilson\dev\FreeRTOS\Source\tasks.c +C:\home\dwilson\dev\FreeRTOS\Source\tasks.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/timer.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/timer.pbi new file mode 100644 index 0000000..a7a0a22 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/timer.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 40s +C:\home\dwilson\dev\FreeRTOS\Demo\Common\ethernet\uIP\uip-1.0\uip\timer.c +C:\home\dwilson\dev\FreeRTOS\Demo\Common\ethernet\uIP\uip-1.0\uip\timer.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/timertest.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/timertest.pbi new file mode 100644 index 0000000..a6ce4bc --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/timertest.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 19s +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\timertest.c +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\timertest.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uIP_Task.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uIP_Task.pbi new file mode 100644 index 0000000..5b785e1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uIP_Task.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 41s +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\uIP_Task.c +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\uIP_Task.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uip.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uip.pbi new file mode 100644 index 0000000..21ebc05 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uip.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 41s +C:\home\dwilson\dev\FreeRTOS\Demo\Common\ethernet\uIP\uip-1.0\uip\uip.c +C:\home\dwilson\dev\FreeRTOS\Demo\Common\ethernet\uIP\uip-1.0\uip\uip.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uip_arp.pbi b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uip_arp.pbi new file mode 100644 index 0000000..b717d61 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/Debug/Obj/uip_arp.pbi @@ -0,0 +1,38 @@ +This is an internal working file generated by the Source Browser. +08:43 41s +C:\home\dwilson\dev\FreeRTOS\Demo\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c +C:\home\dwilson\dev\FreeRTOS\Demo\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c +-D +IAR_ARMCM3_LM +-D +PACK_STRUCT_END= +--diag_suppress +pa082,pe513,pe167,pe550,pe144,pe191,pe177,pa039,pa050 +-o +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\Debug\Obj\ +--no_unroll +--no_inline +--no_tbaa +--no_clustering +--no_scheduling +--debug +--endian=little +--cpu=Cortex-M3 +-e +--fpu=None +--dlib_config +C:\Program Files\IAR Systems\Embedded Workbench 6.0\arm\INC\c\DLib_Config_Normal.h +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\drivers\LuminaryMicro\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\common\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\..\source\include\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\webserver\ +-I +C:\home\dwilson\dev\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\..\Common\ethernet\uIP\uip-1.0\uip\ +-Om +--use_c++_inline diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/FreeRTOSConfig.h new file mode 100644 index 0000000..84f5fa3 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/FreeRTOSConfig.h @@ -0,0 +1,148 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 1 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 50000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 70 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 24000 ) ) +#define configMAX_TASK_NAME_LEN ( 12 ) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_QUEUE_SETS 1 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_ALTERNATIVE_API 1 + +#define configMAX_PRIORITIES ( 5UL ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) +#define configQUEUE_REGISTRY_SIZE 10 + +/* Timer related defines. */ +#define configUSE_TIMERS 0 +#define configTIMER_TASK_PRIORITY 2 +#define configTIMER_QUEUE_LENGTH 20 +#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xTimerGetTimerDaemonTaskHandle 1 +#define INCLUDE_xTaskGetIdleTaskHandle 1 +#define INCLUDE_pcTaskGetTaskName 1 +#define INCLUDE_eTaskGetState 1 +#define INCLUDE_xSemaphoreGetMutexHolder 1 + +/* This demo makes use of one or more example stats formatting functions. These +format the raw data provided by the uxTaskGetSystemState() function in to human +readable ASCII form. See the notes in the implementation of vTaskList() within +FreeRTOS/Source/tasks.c for limitations. */ +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 + +#define configKERNEL_INTERRUPT_PRIORITY ( 7 << 5 ) /* Priority 7, or 255 as only the top three bits are implemented. This is the lowest priority. */ +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( 5 << 5 ) /* Priority 5, or 160 as only the top three bits are implemented. */ + +/* Use the Cortex-M3 optimised task selection rather than the generic C code +version. */ +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + +#ifdef __ICCARM__ + void vAssertCalled( const char *pcFile, unsigned long ulLine ); + #define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled( __FILE__, __LINE__ ); +#endif + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/IntQueueTimer.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/IntQueueTimer.c new file mode 100644 index 0000000..5d360cb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/IntQueueTimer.c @@ -0,0 +1,133 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Demo includes. */ +#include "IntQueueTimer.h" +#include "IntQueue.h" + +/* Library includes. */ +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "interrupt.h" +#include "sysctl.h" +#include "lmi_timer.h" + +#define tmrTIMER_2_FREQUENCY ( 2000UL ) +#define tmrTIMER_3_FREQUENCY ( 2001UL ) + +void vInitialiseTimerForIntQueueTest( void ) +{ +unsigned long ulFrequency; + + /* Timer 2 and 3 are utilised for this test. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER2 ); + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER3 ); + TimerConfigure( TIMER2_BASE, TIMER_CFG_32_BIT_PER ); + TimerConfigure( TIMER3_BASE, TIMER_CFG_32_BIT_PER ); + + /* Set the timer interrupts to be above the kernel. The interrupts are + assigned different priorities so they nest with each other. */ + IntPrioritySet( INT_TIMER2A, configMAX_SYSCALL_INTERRUPT_PRIORITY + ( 1 << 5 ) ); /* Shift left 5 as only the top 3 bits are implemented. */ + IntPrioritySet( INT_TIMER3A, configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* Ensure interrupts do not start until the scheduler is running. */ + portDISABLE_INTERRUPTS(); + + /* The rate at which the timers will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / tmrTIMER_2_FREQUENCY; + TimerLoadSet( TIMER2_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER2A ); + TimerIntEnable( TIMER2_BASE, TIMER_TIMA_TIMEOUT ); + + /* The rate at which the timers will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / tmrTIMER_3_FREQUENCY; + TimerLoadSet( TIMER3_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER3A ); + TimerIntEnable( TIMER3_BASE, TIMER_TIMA_TIMEOUT ); + + /* Enable both timers. */ + TimerEnable( TIMER2_BASE, TIMER_A ); + TimerEnable( TIMER3_BASE, TIMER_A ); +} +/*-----------------------------------------------------------*/ + +void vT2InterruptHandler( void ) +{ + TimerIntClear( TIMER2_BASE, TIMER_TIMA_TIMEOUT ); + portEND_SWITCHING_ISR( xFirstTimerHandler() ); +} +/*-----------------------------------------------------------*/ + +void vT3InterruptHandler( void ) +{ + TimerIntClear( TIMER3_BASE, TIMER_TIMA_TIMEOUT ); + portEND_SWITCHING_ISR( xSecondTimerHandler() ); +} + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/IntQueueTimer.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/IntQueueTimer.h new file mode 100644 index 0000000..83edd5d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/IntQueueTimer.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef INT_QUEUE_TIMER_H +#define INT_QUEUE_TIMER_H + +void vInitialiseTimerForIntQueueTest( void ); +portBASE_TYPE xTimer0Handler( void ); +portBASE_TYPE xTimer1Handler( void ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/LM3Sxxxx.icf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/LM3Sxxxx.icf new file mode 100644 index 0000000..575329d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/LM3Sxxxx.icf @@ -0,0 +1,58 @@ +//***************************************************************************** +// +// enet_lwip.icf - Linker configuration file for enet_lwip. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// Luminary Micro Confidential - For Use Under NDA Only +// +//***************************************************************************** + +// +// Define a memory region that covers the entire 4 GB addressible space of the +// processor. +// +define memory mem with size = 4G; + +// +// Define a region for the on-chip flash. +// +define region FLASH = mem:[from 0x00000000 to 0x0003ffff]; + +// +// Define a region for the on-chip SRAM. +// +define region SRAM = mem:[from 0x20000000 to 0x2000ffff]; + +// +// Define a block for the heap. The size should be set to something other +// than zero if things in the C library that require the heap are used. +// +define block HEAP with alignment = 8, size = 0x00000000 { }; + +// +// Indicate that the read/write values should be initialized by copying from +// flash. +// +initialize by copy { readwrite }; + +// +// Initicate that the noinit values should be left alone. This includes the +// stack, which if initialized will destroy the return address from the +// initialization code, causing the processor to branch to zero and fault. +// +do not initialize { section .noinit }; + +// +// Place the interrupt vectors at the start of flash. +// +place at start of FLASH { readonly section .intvec }; + +// +// Place the remainder of the read-only items into flash. +// +place in FLASH { readonly }; + +// +// Place all read/write items into SRAM. +// +place in SRAM { readwrite, block HEAP }; diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/ParTest/ParTest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/ParTest/ParTest.c new file mode 100644 index 0000000..f7b26ef --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/ParTest/ParTest.c @@ -0,0 +1,113 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo includes. */ +#include "partest.h" + +/* Library includes. */ +#include "hw_types.h" +#include "gpio.h" +#include "hw_memmap.h" + + +/*-----------------------------------------------------------*/ + +void vParTestInitialise( void ) +{ + GPIODirModeSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT ); + GPIOPadConfigSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, 0 ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, xValue ); +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxParTestGetLED( unsigned portBASE_TYPE uxLED ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + return GPIOPinRead( GPIO_PORTF_BASE, GPIO_PIN_0 ); +} + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.Uv2.bak b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.Uv2.bak new file mode 100644 index 0000000..cbc6fdb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.Uv2.bak @@ -0,0 +1,138 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + +Target (FreeRTOS_Demo), 0x0004 // Tools: 'ARM-ADS' + +Group (Demo_Source) +Group (Libraries) +Group (RTOS_Source) +Group (uIP_Source) + +File 1,1,<..\Common\Minimal\BlockQ.c> +File 1,1,<..\Common\Minimal\blocktim.c> +File 1,1,<..\Common\Minimal\death.c> +File 1,1,<..\Common\Minimal\integer.c> +File 1,1,<.\main.c> +File 1,1,<.\ParTest\ParTest.c> +File 1,1,<..\Common\Minimal\PollQ.c> +File 1,1,<..\Common\Minimal\semtest.c> +File 1,2,<.\startup_rvmdk.S> +File 1,1,<.\timertest.c> +File 1,5,<.\FreeRTOSConfig.h> +File 1,1,<..\Common\Minimal\GenQTest.c> +File 1,1,<..\Common\Minimal\QPeek.c> +File 1,1,<.\IntQueueTimer.c> +File 1,1,<..\Common\Minimal\IntQueue.c> +File 1,1,<..\Common\Minimal\recmutex.c> +File 2,1,<.\rit128x96x4.c> +File 2,1,<.\osram128x64x4.c> +File 2,4,<..\Common\drivers\LuminaryMicro\Keil\driverlib.lib> +File 2,1,<.\formike128x128x16.c> +File 2,4,<..\Common\drivers\LuminaryMicro\Keil\grlib.lib> +File 3,1,<..\..\Source\tasks.c> +File 3,1,<..\..\Source\list.c> +File 3,1,<..\..\Source\queue.c> +File 3,1,<..\..\Source\portable\RVDS\ARM_CM3\port.c> +File 3,1,<..\..\Source\portable\MemMang\heap_2.c> +File 4,1,<.\webserver\uIP_Task.c> +File 4,1,<.\webserver\emac.c> +File 4,1,<.\webserver\httpd.c> +File 4,1,<.\webserver\httpd-cgi.c> +File 4,1,<.\webserver\httpd-fs.c> +File 4,1,<.\webserver\http-strings.c> +File 4,1,<..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c> +File 4,1,<..\Common\ethernet\uIP\uip-1.0\uip\psock.c> +File 4,1,<..\Common\ethernet\uIP\uip-1.0\uip\timer.c> +File 4,1,<..\Common\ethernet\uIP\uip-1.0\uip\uip.c> + + +Options 1,0,0 // Target 'FreeRTOS_Demo' + Device (LM3S8962) + Vendor (Luminary Micro) + Cpu (IRAM(0x20000000-0x2000FFFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3")) + FlashUt () + StupF ("STARTUP\Luminary\Startup.s" ("Luminary Startup Code")) + FlashDR (UL2CM3(-UU0101L5E -O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_256 -FS00 -FL040000)) + DevID (4285) + Rgf (LM3Sxxx.H) + Mem () + C () + A () + RL () + OH () + DBC_IFX () + DBC_CMS () + DBC_AMS () + DBC_LMS () + UseEnv=0 + EnvBin () + EnvInc () + EnvLib () + EnvReg (ÿLuminary\) + OrgReg (ÿLuminary\) + TgStat=16 + OutDir (.\rvmdk\) + OutName (RTOSDemo) + GenApp=1 + GenLib=0 + GenHex=0 + Debug=1 + Browse=1 + LstDir (.\rvmdk\) + HexSel=1 + MG32K=0 + TGMORE=0 + RunUsr 0 1 + RunUsr 1 0 <> + BrunUsr 0 0 <> + BrunUsr 1 0 <> + CrunUsr 0 0 <> + CrunUsr 1 0 <> + SVCSID <> + GLFLAGS=1790 + ADSFLGA { 16,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ACPUTYP ("Cortex-M3") + RVDEV () + ADSTFLGA { 0,12,0,2,99,0,0,66,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSOCM { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + OCMADSIRAM { 0,0,0,0,32,0,0,1,0 } + OCMADSIROM { 1,0,0,0,0,0,0,4,0 } + OCMADSXRAM { 0,0,0,0,0,0,0,0,0 } + OCR_RVCT { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,4,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,1,0,0,0,0,0,0,0,0,0,0 } + RV_STAVEC () + ADSCCFLG { 5,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSCMISC (--diag_suppress 191,550,513,167,177,144) + ADSCDEFN (RVDS_ARMCM3_LM3S102, "PACK_STRUCT_END=","ALIGN_STRUCT_END=") + ADSCUDEF () + ADSCINCD (.;.\..\Common\drivers\LuminaryMicro;..\..\Source\portable\RVDS\ARM_CM3;..\..\Source\include;..\Common\include;..\Common\ethernet\uIP\uip-1.0\uip;.\webserver) + ADSASFLG { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSAMISC () + ADSADEFN () + ADSAUDEF () + ADSAINCD () + PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + IncBld=1 + AlwaysBuild=0 + GenAsm=0 + AsmAsm=0 + PublicsOnly=0 + StopCode=3 + CustArgs () + LibMods () + ADSLDFG { 17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } + ADSLDTA (0x00000000) + ADSLDDA (0x20000000) + ADSLDSC () + ADSLDIB () + ADSLDIC () + ADSLDMC (--entry Reset_Handler) + ADSLDIF () + ADSLDDW () + OPTDL (SARMCM3.DLL)()(DLM.DLL)(-pLM3S8962)(SARMCM3.DLL)()(TLM.DLL)(-pLM3S8962) + OPTDBG 48126,4,()()()()()()()()()() (BIN\lmidk-agdi.dll)()()() + FLASH1 { 1,0,0,0,1,0,0,0,3,16,0,0,0,0,0,0,0,0,0,0 } + FLASH2 (BIN\lmidk-agdi.dll) + FLASH3 ("" ()) + FLASH4 () +EndOpt + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.dep b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.dep new file mode 100644 index 0000000..68371b3 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.dep @@ -0,0 +1,990 @@ + + + + 2 + 864588464 + + Debug + + $TOOLKIT_DIR$\inc\c\stdio.h + $TOOLKIT_DIR$\inc\c\ystdio.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\Debug\Obj\main.o + $PROJ_DIR$\Debug\Obj\uip_arp.pbi + $PROJ_DIR$\Debug\Obj\blocktim.o + $PROJ_DIR$\LuminaryDrivers\hw_types.h + $PROJ_DIR$\Debug\Obj\death.o + $PROJ_DIR$\LuminaryDrivers\ssi.h + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\hw_sysctl.h + $PROJ_DIR$\Debug\Obj\QPeek.pbi + $PROJ_DIR$\Debug\Obj\psock.pbi + $PROJ_DIR$\Debug\Obj\port.o + $PROJ_DIR$\Debug\Obj\pdc.pbi + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\timer.h + $PROJ_DIR$\Debug\Obj\PollQ.pbi + $PROJ_DIR$\Debug\Obj\uip.r79 + $PROJ_DIR$\Debug\Obj\psock.r79 + $PROJ_DIR$\Debug\Obj\uIP_Task.r79 + $PROJ_DIR$\Debug\Obj\list.r79 + $PROJ_DIR$\Debug\Obj\timer.pbi + $PROJ_DIR$\Debug\Obj\startup_ewarm.pbi + $PROJ_DIR$\..\Common\include\flash.h + $PROJ_DIR$\Debug\Obj\uip.pbi + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\psock.h + $PROJ_DIR$\webserver\webserver.h + $PROJ_DIR$\Debug\Obj\ParTest.r79 + $PROJ_DIR$\Debug\Obj\portasm.r79 + $PROJ_DIR$\Debug\Obj\death.r79 + $PROJ_DIR$\Debug\Obj\heap_2.r79 + $PROJ_DIR$\..\Common\include\semtest.h + $PROJ_DIR$\Debug\Obj\httpd-cgi.r79 + $PROJ_DIR$\Debug\Obj\integer.pbi + $PROJ_DIR$\..\Common\include\death.h + $PROJ_DIR$\Debug\Obj\rit128x96x4.pbi + $PROJ_DIR$\LuminaryDrivers\pdc.c + $PROJ_DIR$\Debug\Obj\httpd-cgi.pbi + $PROJ_DIR$\..\Common\include\integer.h + $PROJ_DIR$\..\..\Source\include\portable.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\pt.h + $PROJ_DIR$\LuminaryDrivers\gpio.h + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\lmi_flash.h + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\hw_ssi.h + $PROJ_DIR$\ParTest\ParTest.c + $PROJ_DIR$\..\Common\Minimal\BlockQ.c + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\clock.h + $PROJ_DIR$\LuminaryDrivers\sysctl.h + $PROJ_DIR$\webserver\httpd.h + $PROJ_DIR$\Debug\Obj\flash.r79 + $PROJ_DIR$\webserver\httpd-fsdata.h + $PROJ_DIR$\Debug\Obj\uip_arp.r79 + $PROJ_DIR$\Debug\Obj\main.r79 + $PROJ_DIR$\..\Common\include\blocktim.h + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\lmi_timer.h + $PROJ_DIR$\..\..\Source\include\croutine.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uipopt.h + $PROJ_DIR$\Debug\Obj\osram128x64x4.pbi + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\hw_memmap.h + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\rit128x96x4.h + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\ethernet.h + $PROJ_DIR$\Debug\Obj\death.pbi + $PROJ_DIR$\..\..\Source\include\projdefs.h + $PROJ_DIR$\Debug\Obj\semtest.pbi + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\hw_types.h + $PROJ_DIR$\Debug\Obj\emac.r79 + $PROJ_DIR$\Debug\Obj\heap_2.pbi + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\Debug\Obj\BlockQ.o + $PROJ_DIR$\Debug\Obj\timertest.o + $PROJ_DIR$\Debug\Obj\http-strings.r79 + $PROJ_DIR$\LuminaryDrivers\hw_sysctl.h + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\debug.h + $PROJ_DIR$\Debug\Obj\timertest.r79 + $PROJ_DIR$\LuminaryDrivers\osram128x64x4.c + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\interrupt.h + $PROJ_DIR$\LuminaryDrivers\debug.h + $PROJ_DIR$\Debug\Obj\blocktim.r79 + $PROJ_DIR$\Debug\Obj\PollQ.r79 + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\gpio.h + $PROJ_DIR$\Debug\Obj\queue.pbi + $PROJ_DIR$\webserver\emac.h + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\hw_ints.h + $PROJ_DIR$\Debug\Obj\uIP_Task.pbi + $PROJ_DIR$\Debug\Obj\timer.r79 + $PROJ_DIR$\webserver\httpd-fsdata.c + $PROJ_DIR$\Debug\Obj\QPeek.r79 + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\timer.h + $PROJ_DIR$\Debug\Obj\tasks.r79 + $PROJ_DIR$\Debug\Obj\blocktim.pbi + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\lc.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip.h + $PROJ_DIR$\LuminaryDrivers\hw_ssi.h + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\hw_ethernet.h + $PROJ_DIR$\Debug\Obj\queue.r79 + $PROJ_DIR$\..\Common\include\PollQ.h + $PROJ_DIR$\osram128x64x4.h + $PROJ_DIR$\Debug\Obj\main.pbi + $PROJ_DIR$\Debug\Obj\httpd.pbi + $PROJ_DIR$\webserver\uip-conf.h + $PROJ_DIR$\Debug\Obj\BlockQ.r79 + $PROJ_DIR$\Debug\Obj\BlockQ.pbi + $PROJ_DIR$\..\..\Source\include\FreeRTOS.h + $PROJ_DIR$\..\Common\include\BlockQ.h + $PROJ_DIR$\Debug\Obj\flash.pbi + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\ssi.h + $PROJ_DIR$\..\..\Source\include\semphr.h + $PROJ_DIR$\Debug\Obj\port.r79 + $PROJ_DIR$\Debug\Obj\emac.pbi + $PROJ_DIR$\Debug\Obj\httpd-fs.pbi + $PROJ_DIR$\Debug\Obj\osram128x64x4.r79 + $PROJ_DIR$\Debug\Obj\semtest.r79 + $PROJ_DIR$\..\Common\include\QPeek.h + $PROJ_DIR$\Debug\Obj\startup_ewarm.r79 + $PROJ_DIR$\webserver\http-strings.h + $PROJ_DIR$\..\..\Source\include\task.h + $PROJ_DIR$\LuminaryDrivers\pdc.h + $PROJ_DIR$\FreeRTOSConfig.h + $PROJ_DIR$\..\Common\include\partest.h + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\sysctl.h + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\Debug\Obj\tasks.pbi + $PROJ_DIR$\Debug\Obj\RTOSDemo.pbd + $PROJ_DIR$\Debug\Obj\rit128x96x4.r79 + $PROJ_DIR$\Debug\Obj\httpd.r79 + $PROJ_DIR$\Debug\Obj\pdc.r79 + $PROJ_DIR$\Debug\Obj\integer.r79 + $PROJ_DIR$\..\Common\Minimal\flash.c + $PROJ_DIR$\..\Common\Minimal\GenQTest.c + $PROJ_DIR$\..\Common\Minimal\integer.c + $PROJ_DIR$\main.c + $PROJ_DIR$\osram128x64x4.c + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\psock.c + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\timer.c + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip.c + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c + $PROJ_DIR$\webserver\uIP_Task.c + $PROJ_DIR$\webserver\httpd-fs.h + $PROJ_DIR$\startup_ewarm.c + $PROJ_DIR$\webserver\http-strings.c + $PROJ_DIR$\webserver\httpd-cgi.c + $PROJ_DIR$\webserver\httpd-fs.c + $PROJ_DIR$\webserver\httpd.c + $PROJ_DIR$\Debug\Obj\port.pbi + $PROJ_DIR$\lcd_message.h + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portmacro.h + $PROJ_DIR$\..\Common\include\GenQTest.h + $PROJ_DIR$\Debug\Obj\GenQTest.r79 + $PROJ_DIR$\LuminaryDrivers\osram128x64x4.h + $TOOLKIT_DIR$\lib\dl7M_tln.a + $PROJ_DIR$\Debug\Obj\timertest.pbi + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\lc-switch.h + $PROJ_DIR$\Debug\Obj\list.pbi + $PROJ_DIR$\Debug\Obj\GenQTest.pbi + $PROJ_DIR$\Debug\Obj\http-strings.pbi + $PROJ_DIR$\Debug\Obj\httpd-fs.r79 + $PROJ_DIR$\..\..\Source\include\queue.h + $PROJ_DIR$\webserver\httpd-cgi.h + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arch.h + $PROJ_DIR$\..\..\Source\include\list.h + $PROJ_DIR$\..\Common\Minimal\PollQ.c + $PROJ_DIR$\..\Common\Minimal\QPeek.c + $PROJ_DIR$\..\Common\Minimal\semtest.c + $PROJ_DIR$\timertest.c + $PROJ_DIR$\..\..\Source\portable\MemMang\heap_2.c + $PROJ_DIR$\rit128x96x4.c + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\port.c + $PROJ_DIR$\..\..\Source\list.c + $PROJ_DIR$\webserver\emac.c + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portasm.s + $PROJ_DIR$\..\..\Source\queue.c + $PROJ_DIR$\..\..\Source\tasks.c + $PROJ_DIR$\..\Common\Minimal\blocktim.c + $PROJ_DIR$\..\Common\Minimal\death.c + $PROJ_DIR$\bitmap.h + $PROJ_DIR$\webserver\clock-arch.h + $PROJ_DIR$\Debug\Obj\ParTest.pbi + $PROJ_DIR$\LuminaryDrivers\hw_memmap.h + $PROJ_DIR$\Debug\Obj\flash.o + $PROJ_DIR$\Debug\Obj\GenQTest.o + $PROJ_DIR$\Debug\Obj\PollQ.o + $PROJ_DIR$\Debug\Obj\rit128x96x4.o + $PROJ_DIR$\Debug\Obj\QPeek.o + $PROJ_DIR$\Debug\Obj\semtest.o + $PROJ_DIR$\Debug\Obj\osram128x64x4.o + $PROJ_DIR$\Debug\Obj\startup_ewarm.o + $PROJ_DIR$\Debug\Obj\heap_2.o + $PROJ_DIR$\Debug\Obj\list.o + $PROJ_DIR$\Debug\Obj\queue.o + $PROJ_DIR$\Debug\Obj\tasks.o + $PROJ_DIR$\Debug\Obj\emac.o + $PROJ_DIR$\Debug\Obj\integer.o + $PROJ_DIR$\Debug\Obj\ParTest.o + $PROJ_DIR$\Debug\Obj\http-strings.o + $PROJ_DIR$\Debug\Obj\httpd-cgi.o + $PROJ_DIR$\Debug\Obj\httpd-fs.o + $PROJ_DIR$\Debug\Obj\httpd.o + $PROJ_DIR$\Debug\Obj\psock.o + $PROJ_DIR$\Debug\Obj\timer.o + $PROJ_DIR$\Debug\Obj\uip.o + $PROJ_DIR$\Debug\Obj\uip_arp.o + $PROJ_DIR$\Debug\Obj\uIP_Task.o + $PROJ_DIR$\Debug\Obj\portasm.o + $PROJ_DIR$\Debug\Exe\RTOSDemo.out + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $TOOLKIT_DIR$\inc\c\stdint.h + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\lib\rt7M_tl.a + $TOOLKIT_DIR$\lib\m7M_tl.a + $TOOLKIT_DIR$\lib\shb_l.a + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\inc\c\stddef.h + $PROJ_DIR$\..\..\..\DriverLib\driverlib\ewarm\Exe\driverlib.a + $TOOLKIT_DIR$\config\generic_cortex.icf + + + [ROOT_NODE] + + + ILINK + 203 + + + + + $PROJ_DIR$\LuminaryDrivers\pdc.c + + + ICCARM + 125 + + + BICOMP + 13 + + + + + ICCARM + 177 6 76 41 8 47 116 + + + BICOMP + 177 6 76 41 8 47 116 + + + + + $PROJ_DIR$\ParTest\ParTest.c + + + ICCARM + 192 + + + BICOMP + 176 + + + + + ICCARM + 102 216 2 206 204 120 207 208 209 215 62 117 38 145 115 159 118 64 79 58 + + + BICOMP + 102 216 2 206 204 207 208 209 215 62 117 38 145 115 159 118 64 79 58 + + + + + $PROJ_DIR$\..\Common\Minimal\BlockQ.c + + + ICCARM + 68 + + + BICOMP + 101 + + + + + ICCARM + 67 2 206 204 120 207 208 209 215 102 216 62 117 38 145 115 159 156 103 + + + BICOMP + 67 2 206 204 207 208 209 215 102 216 62 117 38 145 115 159 156 103 + + + + + $PROJ_DIR$\LuminaryDrivers\osram128x64x4.c + + + ICCARM + 110 + + + BICOMP + 57 + + + + + ICCARM + 92 177 71 6 76 41 8 47 148 + + + + + $PROJ_DIR$\Debug\Obj\RTOSDemo.pbd + + + BILINK + 101 153 176 15 10 89 61 108 104 66 154 36 109 98 32 152 97 57 143 11 80 34 63 21 121 20 150 83 23 4 + + + + + $PROJ_DIR$\..\Common\Minimal\flash.c + + + ICCARM + 178 + + + BICOMP + 104 + + + + + ICCARM + 67 2 206 204 120 207 208 209 215 102 216 62 117 38 145 115 159 118 22 + + + BICOMP + 67 2 206 204 207 208 209 215 102 216 62 117 38 145 115 159 118 22 + + + + + $PROJ_DIR$\..\Common\Minimal\GenQTest.c + + + ICCARM + 179 + + + BICOMP + 153 + + + + + ICCARM + 67 2 206 204 120 207 208 209 215 102 216 62 117 38 145 115 159 156 106 146 + + + BICOMP + 67 2 206 204 207 208 209 215 102 216 62 117 38 145 115 159 156 106 146 + + + + + $PROJ_DIR$\..\Common\Minimal\integer.c + + + ICCARM + 191 + + + BICOMP + 32 + + + + + ICCARM + 67 2 206 204 120 207 208 209 215 102 216 62 117 38 145 115 159 37 + + + BICOMP + 67 2 206 204 207 208 209 215 102 216 62 117 38 145 115 159 37 + + + + + $PROJ_DIR$\main.c + + + ICCARM + 3 + + + BICOMP + 97 + + + + + ICCARM + 0 2 206 204 120 207 208 209 215 1 102 216 62 117 38 145 115 159 156 106 103 33 37 53 22 118 30 95 144 174 146 112 58 64 9 119 79 59 96 + + + BICOMP + 0 2 206 204 207 208 209 215 1 102 216 62 117 38 145 115 159 156 106 103 33 37 53 22 118 30 95 144 174 146 112 58 64 9 119 79 59 96 + + + + + $PROJ_DIR$\osram128x64x4.c + + + ICCARM + 184 + + + BICOMP + 57 + + + + + ICCARM + 43 58 9 64 72 79 105 119 96 + + + BICOMP + 43 58 9 64 72 79 105 119 96 + + + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\psock.c + + + ICCARM + 197 + + + BICOMP + 11 + + + + + ICCARM + 0 2 206 204 120 207 208 209 215 1 210 214 56 99 205 25 48 24 40 90 151 137 91 + + + BICOMP + 0 2 206 204 207 208 209 215 1 210 214 56 99 205 25 48 24 40 90 151 137 91 + + + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\timer.c + + + ICCARM + 198 + + + BICOMP + 20 + + + + + ICCARM + 46 175 102 216 2 206 204 120 207 208 209 215 62 117 38 145 87 + + + BICOMP + 46 175 102 216 2 206 204 207 208 209 215 62 117 38 145 87 + + + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip.c + + + ICCARM + 199 + + + BICOMP + 23 + + + + + ICCARM + 91 56 99 205 2 206 204 120 207 208 209 25 48 24 40 90 151 137 158 210 215 214 + + + BICOMP + 91 56 99 205 2 206 204 207 208 209 25 48 24 40 90 151 137 158 210 215 214 + + + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c + + + ICCARM + 200 + + + BICOMP + 4 + + + + + ICCARM + 39 91 56 99 205 2 206 204 120 207 208 209 25 48 24 40 90 151 137 210 215 214 + + + BICOMP + 39 91 56 99 205 2 206 204 207 208 209 25 48 24 40 90 151 137 210 215 214 + + + + + $PROJ_DIR$\webserver\uIP_Task.c + + + ICCARM + 201 + + + BICOMP + 83 + + + + + ICCARM + 210 2 206 204 120 207 208 209 215 214 102 216 62 117 38 145 115 159 106 156 64 91 56 99 205 25 48 24 40 90 151 137 39 14 175 93 60 119 58 42 81 118 144 + + + BICOMP + 210 2 206 204 207 208 209 215 214 102 216 62 117 38 145 115 159 106 156 64 91 56 99 205 25 48 24 40 90 151 137 39 14 175 93 60 119 58 42 81 118 144 + + + + + $PROJ_DIR$\startup_ewarm.c + + + ICCARM + 185 + + + BICOMP + 21 + + + + + $PROJ_DIR$\webserver\http-strings.c + + + ICCARM + 193 + + + BICOMP + 154 + + + + + $PROJ_DIR$\webserver\httpd-cgi.c + + + ICCARM + 194 + + + BICOMP + 36 + + + + + ICCARM + 91 56 99 205 2 206 204 120 207 208 209 25 48 24 40 90 151 137 157 0 215 1 210 214 + + + BICOMP + 91 56 99 205 2 206 204 207 208 209 25 48 24 40 90 151 137 157 0 215 1 210 214 + + + + + $PROJ_DIR$\webserver\httpd-fs.c + + + ICCARM + 195 + + + BICOMP + 109 + + + + + ICCARM + 48 24 56 99 205 2 206 204 120 207 208 209 25 40 90 151 137 50 91 85 + + + BICOMP + 48 24 56 99 205 2 206 204 207 208 209 25 40 90 151 137 50 91 85 + + + + + $PROJ_DIR$\webserver\httpd.c + + + ICCARM + 196 + + + BICOMP + 98 + + + + + ICCARM + 91 56 99 205 2 206 204 120 207 208 209 25 48 24 40 90 151 137 157 114 210 215 214 + + + BICOMP + 91 56 99 205 2 206 204 207 208 209 25 48 24 40 90 151 137 157 114 210 215 214 + + + + + $PROJ_DIR$\..\Common\Minimal\PollQ.c + + + ICCARM + 180 + + + BICOMP + 15 + + + + + ICCARM + 67 2 206 204 120 207 208 209 215 102 216 62 117 38 145 115 159 156 95 + + + BICOMP + 67 2 206 204 207 208 209 215 102 216 62 117 38 145 115 159 156 95 + + + + + $PROJ_DIR$\..\Common\Minimal\QPeek.c + + + ICCARM + 182 + + + BICOMP + 10 + + + + + ICCARM + 67 2 206 204 120 207 208 209 215 102 216 62 117 38 145 115 159 156 106 112 + + + BICOMP + 67 2 206 204 207 208 209 215 102 216 62 117 38 145 115 159 156 106 112 + + + + + $PROJ_DIR$\..\Common\Minimal\semtest.c + + + ICCARM + 183 + + + BICOMP + 63 + + + + + ICCARM + 67 2 206 204 120 207 208 209 215 102 216 62 117 38 145 115 159 106 156 30 + + + BICOMP + 67 2 206 204 207 208 209 215 102 216 62 117 38 145 115 159 106 156 30 + + + + + $PROJ_DIR$\timertest.c + + + ICCARM + 69 + + + BICOMP + 150 + + + + + ICCARM + 102 216 2 206 204 120 207 208 209 215 62 117 38 145 82 58 64 75 119 54 + + + BICOMP + 102 216 2 206 204 207 208 209 215 62 117 38 145 82 58 64 75 119 54 + + + + + $PROJ_DIR$\..\..\Source\portable\MemMang\heap_2.c + + + ICCARM + 186 + + + BICOMP + 66 + + + + + ICCARM + 67 2 206 204 120 207 208 209 215 102 216 62 117 38 145 115 159 + + + BICOMP + 67 2 206 204 207 208 209 215 102 216 62 117 38 145 115 159 + + + + + $PROJ_DIR$\rit128x96x4.c + + + ICCARM + 181 + + + BICOMP + 34 + + + + + ICCARM + 43 58 9 64 72 79 105 119 59 + + + BICOMP + 43 58 9 64 72 79 105 119 59 + + + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\port.c + + + ICCARM + 12 + + + BICOMP + 143 + + + + + ICCARM + 102 216 2 206 204 120 207 208 209 215 62 117 38 145 115 159 + + + BICOMP + 102 216 2 206 204 207 208 209 215 62 117 38 145 115 159 + + + + + $PROJ_DIR$\..\..\Source\list.c + + + ICCARM + 187 + + + BICOMP + 152 + + + + + ICCARM + 67 2 206 204 120 207 208 209 215 102 216 62 117 38 145 159 + + + BICOMP + 67 2 206 204 207 208 209 215 102 216 62 117 38 145 159 + + + + + $PROJ_DIR$\webserver\emac.c + + + ICCARM + 190 + + + BICOMP + 108 + + + + + ICCARM + 102 216 2 206 204 120 207 208 209 215 62 117 38 145 106 156 115 159 81 91 56 99 205 25 48 24 40 90 151 137 64 58 82 93 60 119 75 + + + BICOMP + 102 216 2 206 204 207 208 209 215 62 117 38 145 106 156 115 159 81 91 56 99 205 25 48 24 40 90 151 137 64 58 82 93 60 119 75 + + + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portasm.s + + + AARM + 202 + + + + + AARM + 117 + + + + + $PROJ_DIR$\..\..\Source\queue.c + + + ICCARM + 188 + + + BICOMP + 80 + + + + + ICCARM + 67 2 206 204 120 207 208 209 215 210 214 102 216 62 117 38 145 115 159 55 + + + BICOMP + 67 2 206 204 207 208 209 215 210 214 102 216 62 117 38 145 115 159 55 + + + + + $PROJ_DIR$\..\..\Source\tasks.c + + + ICCARM + 189 + + + BICOMP + 121 + + + + + ICCARM + 0 2 206 204 120 207 208 209 215 1 67 210 214 102 216 62 117 38 145 115 159 + + + BICOMP + 0 2 206 204 207 208 209 215 1 67 210 214 102 216 62 117 38 145 115 159 + + + + + $PROJ_DIR$\..\Common\Minimal\blocktim.c + + + ICCARM + 5 + + + BICOMP + 89 + + + + + ICCARM + 102 216 2 206 204 120 207 208 209 215 62 117 38 145 115 159 156 53 + + + BICOMP + 102 216 2 206 204 207 208 209 215 62 117 38 145 115 159 156 53 + + + + + $PROJ_DIR$\..\Common\Minimal\death.c + + + ICCARM + 7 + + + BICOMP + 61 + + + + + ICCARM + 67 2 206 204 120 207 208 209 215 102 216 62 117 38 145 115 159 33 + + + BICOMP + 67 2 206 204 207 208 209 215 102 216 62 117 38 145 115 159 33 + + + + + $PROJ_DIR$\Debug\Exe\RTOSDemo.out + + + ILINK + 218 68 179 192 180 182 5 7 190 178 186 193 194 195 196 191 187 3 184 12 202 197 188 181 183 185 189 198 69 201 199 200 217 213 211 212 149 + + + + + $PROJ_DIR$\LuminaryDrivers\osram128x64x4.c + ICCARM + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.ewd b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.ewd new file mode 100644 index 0000000..1f046f8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.ewd @@ -0,0 +1,982 @@ + + + + 2 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + ANGEL_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IARROM_ID + 2 + + 1 + 1 + 1 + + + + + + + + + JLINK_ID + 2 + + 14 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + MACRAIGOR_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + PEMICRO_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + + + + + + + RDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + RDIJTAGJET_ID + 0 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + STLINK_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + XDS100_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\AVIX\AVIX.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\MQX\MQXRtosPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\PowerPac\PowerPacRTOS.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Quadros\Quadros_EWB6_Plugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.ewp b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.ewp new file mode 100644 index 0000000..0634e8f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.ewp @@ -0,0 +1,1065 @@ + + + + 2 + + Debug + + ARM + + 1 + + General + 3 + + 21 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 28 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 15 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Demo files + + $PROJ_DIR$\..\Common\Minimal\BlockQ.c + + + $PROJ_DIR$\..\Common\Minimal\blocktim.c + + + $PROJ_DIR$\..\Common\Minimal\death.c + + + $PROJ_DIR$\..\Common\Minimal\flash.c + + + $PROJ_DIR$\..\Common\Minimal\GenQTest.c + + + $PROJ_DIR$\..\Common\Minimal\integer.c + + + $PROJ_DIR$\..\Common\Minimal\IntQueue.c + + + $PROJ_DIR$\IntQueueTimer.c + + + $PROJ_DIR$\main.c + + + $PROJ_DIR$\ParTest\ParTest.c + + + $PROJ_DIR$\..\Common\Minimal\PollQ.c + + + $PROJ_DIR$\..\Common\Minimal\QPeek.c + + + $PROJ_DIR$\..\Common\Minimal\QueueSet.c + + + $PROJ_DIR$\..\Common\Minimal\recmutex.c + + + $PROJ_DIR$\..\Common\Minimal\semtest.c + + + $PROJ_DIR$\timertest.c + + + + Library files + + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\IAR\driverlib.a + + + $PROJ_DIR$\formike128x128x16.c + + + $PROJ_DIR$\..\Common\drivers\LuminaryMicro\IAR\grlib.a + + + $PROJ_DIR$\osram128x64x4.c + + + $PROJ_DIR$\rit128x96x4.c + + + + Scheduler files + + $PROJ_DIR$\..\..\Source\croutine.c + + + $PROJ_DIR$\..\..\Source\portable\MemMang\heap_4.c + + + $PROJ_DIR$\..\..\Source\list.c + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\port.c + + + $PROJ_DIR$\..\..\Source\portable\IAR\ARM_CM3\portasm.s + + + $PROJ_DIR$\..\..\Source\queue.c + + + $PROJ_DIR$\..\..\Source\tasks.c + + + $PROJ_DIR$\..\..\Source\timers.c + + + + System files + + $PROJ_DIR$\startup_ewarm.c + + + + uIP files + + $PROJ_DIR$\webserver\emac.c + + + $PROJ_DIR$\webserver\http-strings.c + + + $PROJ_DIR$\webserver\httpd-cgi.c + + + $PROJ_DIR$\webserver\httpd-fs.c + + + $PROJ_DIR$\webserver\httpd.c + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\psock.c + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\timer.c + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip.c + + + $PROJ_DIR$\..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c + + + $PROJ_DIR$\webserver\uIP_Task.c + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.eww b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.eww new file mode 100644 index 0000000..239a938 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\RTOSDemo.ewp + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.opt.bak b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.opt.bak new file mode 100644 index 0000000..6a29b7a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.opt.bak @@ -0,0 +1,79 @@ +### uVision2 Project, (C) Keil Software +### Do not modify ! + + cExt (*.c) + aExt (*.s*; *.src; *.a*) + oExt (*.obj) + lExt (*.lib) + tExt (*.txt; *.h; *.inc) + pExt (*.plm) + CppX (*.cpp) + DaveTm { 0,0,0,0,0,0,0,0 } + +Target (FreeRTOS_Demo), 0x0004 // Tools: 'ARM-ADS' +GRPOPT 1,(Demo_Source),1,0,0 +GRPOPT 2,(Libraries),0,0,0 +GRPOPT 3,(RTOS_Source),1,0,0 +GRPOPT 4,(uIP_Source),0,0,0 + +OPTFFF 1,1,1,0,0,0,0,0,<..\Common\Minimal\BlockQ.c> +OPTFFF 1,2,1,0,0,0,0,0,<..\Common\Minimal\blocktim.c> +OPTFFF 1,3,1,0,0,0,0,0,<..\Common\Minimal\death.c> +OPTFFF 1,4,1,0,0,0,0,0,<..\Common\Minimal\integer.c> +OPTFFF 1,5,1,0,0,216,228,0,<.\main.c> { 44,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,252,255,255,255,232,255,255,255,110,0,0,0,115,0,0,0,248,3,0,0,22,2,0,0 } +OPTFFF 1,6,1,0,0,0,0,0,<.\ParTest\ParTest.c> +OPTFFF 1,7,1,0,0,0,0,0,<..\Common\Minimal\PollQ.c> +OPTFFF 1,8,1,0,0,0,0,0,<..\Common\Minimal\semtest.c> +OPTFFF 1,9,2,0,0,0,0,0,<.\startup_rvmdk.S> +OPTFFF 1,10,1,0,0,0,0,0,<.\timertest.c> +OPTFFF 1,11,5,922746880,0,0,0,0,<.\FreeRTOSConfig.h> +OPTFFF 1,12,1,0,0,0,0,0,<..\Common\Minimal\GenQTest.c> +OPTFFF 1,13,1,0,0,0,0,0,<..\Common\Minimal\QPeek.c> +OPTFFF 1,14,1,721420288,0,83,83,0,<.\IntQueueTimer.c> { 44,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,252,255,255,255,232,255,255,255,44,0,0,0,46,0,0,0,171,3,0,0,193,1,0,0 } +OPTFFF 1,15,1,33554434,0,628,653,0,<..\Common\Minimal\IntQueue.c> { 44,0,0,0,2,0,0,0,3,0,0,0,255,255,255,255,255,255,255,255,252,255,255,255,232,255,255,255,66,0,0,0,69,0,0,0,193,3,0,0,216,1,0,0 } +OPTFFF 1,16,1,0,0,0,0,0,<..\Common\Minimal\recmutex.c> +OPTFFF 2,17,1,0,0,0,0,0,<.\rit128x96x4.c> +OPTFFF 2,18,1,0,0,0,0,0,<.\osram128x64x4.c> +OPTFFF 2,19,4,0,0,0,0,0,<..\Common\drivers\LuminaryMicro\Keil\driverlib.lib> +OPTFFF 2,20,1,0,0,0,0,0,<.\formike128x128x16.c> +OPTFFF 2,21,4,0,0,0,0,0,<..\Common\drivers\LuminaryMicro\Keil\grlib.lib> +OPTFFF 3,22,1,0,0,0,0,0,<..\..\Source\tasks.c> +OPTFFF 3,23,1,0,0,0,0,0,<..\..\Source\list.c> +OPTFFF 3,24,1,0,0,0,0,0,<..\..\Source\queue.c> +OPTFFF 3,25,1,0,0,122,122,0,<..\..\Source\portable\RVDS\ARM_CM3\port.c> { 44,0,0,0,0,0,0,0,1,0,0,0,255,255,255,255,255,255,255,255,252,255,255,255,232,255,255,255,22,0,0,0,23,0,0,0,173,4,0,0,170,1,0,0 } +OPTFFF 3,26,1,0,0,0,0,0,<..\..\Source\portable\MemMang\heap_2.c> +OPTFFF 4,27,1,822083584,0,0,0,0,<.\webserver\uIP_Task.c> +OPTFFF 4,28,1,0,0,0,0,0,<.\webserver\emac.c> +OPTFFF 4,29,1,0,0,0,0,0,<.\webserver\httpd.c> +OPTFFF 4,30,1,0,0,0,0,0,<.\webserver\httpd-cgi.c> +OPTFFF 4,31,1,0,0,0,0,0,<.\webserver\httpd-fs.c> +OPTFFF 4,32,1,0,0,0,0,0,<.\webserver\http-strings.c> +OPTFFF 4,33,1,0,0,0,0,0,<..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c> +OPTFFF 4,34,1,0,0,0,0,0,<..\Common\ethernet\uIP\uip-1.0\uip\psock.c> +OPTFFF 4,35,1,0,0,0,0,0,<..\Common\ethernet\uIP\uip-1.0\uip\timer.c> +OPTFFF 4,36,1,0,0,0,0,0,<..\Common\ethernet\uIP\uip-1.0\uip\uip.c> + + +TARGOPT 1, (FreeRTOS_Demo) + ADSCLK=8000000 + OPTTT 1,1,1,0 + OPTHX 1,65535,0,0,0 + OPTLX 79,66,8,<.\rvmdk\> + OPTOX 16 + OPTLT 1,1,1,0,1,1,0,1,0,0,0,0 + OPTXL 1,1,1,1,1,1,1,0,0 + OPTFL 1,0,1 + OPTAX 255 + OPTBL 0,(Data Sheet) + OPTDL (SARMCM3.DLL)()(DLM.DLL)(-pLM3S8962)(SARMCM3.DLL)()(TLM.DLL)(-pLM3S8962) + OPTDBG 48126,4,()()()()()()()()()() (BIN\lmidk-agdi.dll)()()() + OPTKEY 0,(UL2CM3)(-UU0101L5E -O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_256 -FS00 -FL040000) + OPTKEY 0,(DLGTARM)((1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)(103=-1,-1,-1,-1,0)(104=-1,-1,-1,-1,0)(105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(163=-1,-1,-1,-1,0)(164=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1014=-1,-1,-1,-1,0)(1016=-1,-1,-1,-1,0)(136=-1,-1,-1,-1,0)) + OPTKEY 0,(ARMDBGFLAGS)() + OPTKEY 0,(lmidk-agdi)(-B0 -O1792) + OPTMM 1,2,(0) + OPTDF 0x84 + OPTLE <> + OPTLC <> +EndOpt + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvgui.a0190789 b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvgui.a0190789 new file mode 100644 index 0000000..9bd96d7 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvgui.a0190789 @@ -0,0 +1,2646 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + + + 38003 + Registers + 115 100 + + + 1506 + Symbols + 84 45 65 + + + 1935 + Locals + 1302 120 + + + 1936 + Watch 1 + 1241 181 + + + 1937 + Watch 2 + 1241 181 + + + 1944 + Call Stack + 711 711 + + + 1507 + Call Stack + 150 1272 + + + 346 + Code Coverage + 708 282 + + + 204 + Performance Analyzer + 182 150 150 524 + + + + + + 572 + New Symbols + 133 133 133 + + + 575 + Locals + 238 238 238 + + + 573 + Watch 1 + 133 133 133 + + + 574 + Watch 2 + 133 133 133 + + + 363 + New Call Stack + 238 -1 + + + + + + 0 + 0 + 0 + + + + + + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 15 + 9 + 1571 + 1013 + + + + 0 + + 362 + 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000002000000010000000100000048433A5C686F6D655C6477696C736F6E5C6465765C4343533577735C4672656552544F535C44656D6F5C434F525445585F4C4D3353787878785F4941525F4B65696C5C6D61696E2E6300000000066D61696E2E6300000000FFDC7800FFFFFFFF44433A5C686F6D655C6477696C736F6E5C6465765C4343533577735C4672656552544F535C536F757263655C706F727461626C655C4D656D4D616E675C686561705F322E630000000008686561705F322E6300000000BECEA100FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000DD0000007C0000001F060000B4020000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D00000004F000000C8040000E0000000 + + + 16 + DD0000007C000000D50400000D010000 + + + + 1005 + 1005 + 1 + 0 + 0 + 1 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C90000006E020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C90000006E020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 1507 + 1507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D300000069000000C5040000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1944 + 1944 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C90000006E020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C90000006E020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 197 + 197 + 1 + 0 + 0 + 1 + 32767 + 0 + 32768 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000001C02000098050000C4020000 + + + 16 + 5C000000920000002803000023010000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + D300000069000000C5040000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D300000069000000C5040000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D300000069000000C5040000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D300000069000000C5040000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D300000069000000C5040000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C90000006E020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 38007 + 38007 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 50008 + 50008 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0D000000440000009D0100005F000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 940 + 0 + 8192 + 0 + + 16 + 0000000000000000B70300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000B103000012060000C4030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59398 + 59398 + 1 + 0 + 0 + 0 + 391 + 0 + 8192 + 1 + + 16 + 000000001C0000009201000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 593980 + 59398 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000001206000017000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 593981b4 + 59398 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000001206000017000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 593987a06 + 59398 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000001206000017000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 0 + 0 + 0 + 0 + 644 + 0 + 8192 + 2 + + 16 + 00000000380000008F02000054000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2485 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFD0000000E0000000C8040000E4000000000000000100000004000000010000000000000000000000FFFFFFFF06000000CB00000057010000CC000000F08B00005A01000079070000FFFF02000B004354616262656450616E650020000000000000DD0000007C000000D50400000D010000D00000004F000000C8040000E00000000000000040280046060000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFFC80400004F000000CC040000C4020000000000000200000004000000010000000000000000000000FFFFFFFF16000000E20500002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000001800040000000000000D90400007C000000A5050000F1020000CC0400004F00000098050000C40200000000000040410046160000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFCC0000004F000000D000000087020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000D0000007C000000D9000000B4020000000000004F000000CC000000870200000000000040140056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000018020000980500001C02000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0900000098070000E30500008F0700009007000091070000B9050000BA050000BB050000BC050000018000800000000000000D00000049020000A5050000F1020000000000001C02000098050000C40200000000000040820046090000000A43616C6C20537461636B000000009807000001000000FFFFFFFFFFFFFFFF0A43616C6C20537461636B00000000E305000001000000FFFFFFFFFFFFFFFF064C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFCC0200001C020000D0020000C402000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF9807000001000000FFFFFFFF9807000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF0000000087020000120600008B0200000100000001000010040000000100000042FEFFFF99010000FFFFFFFF07000000C5000000C70000007794000093070000940700009507000096070000018000800000010000000D000000B80200001F060000DE030000000000008B02000012060000B10300000000000040820056070000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0742726F77736572010000007794000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2120 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000F675F707563437573746F6D31367074960000000000000007000F675F707563437573746F6D313670740E55415254496E7448616E646C6572056D61696E28046D61696E08707563496D6167650A454550524F4D546573740C466C61736850726F6772616D00000000000000000000000000000000000000000000000000000000018024E10000020000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020000001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020001001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65AC030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59398 + Build + + 583 + 00200000010000000D00FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E00000000000000000000000000000000010000000100000001809E8A0000000004001F0000000000000000000000000000000001000000010000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000000D4672656552544F535F44656D6F960000000000000001000D4672656552544F535F44656D6F000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A0000000004002400000000000000000000000000000000010000000100000000000000054275696C6487010000 + + + 478 + 0D00FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 478 + 0D00FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A00000000000009000000000000000000000000000000000100000001000000 + + + + 59399 + Debug + + 2353 + 00200000000000001B00FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380DB8B00000000000031000000064C6F63616C73000000000000000000000000010000000100000000000000000000000100000000001380D88B000000000000310000000757617463682031000000000000000000000000010000000100000000000000000000000100000000001380D98B0000000000003100000007576174636820320000000000000000000000000100000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000084D656D6F72792031000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000084D656D6F72792032000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000084D656D6F72792033000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000084D656D6F727920340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000755415254202331000000000000000000000000010000000100000000000000000000000100000000001380940700000000000033000000075541525420233200000000000000000000000001000000010000000000000000000000010000000000138095070000000000003300000007554152542023330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000000E49544D2F525441205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000003400000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380658A000000000000340000000E4C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E00000014506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000D436F646520436F76657261676500000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000138001890000000000003600000007546F6F6C626F7800000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804601000000000000490000000000000000000000000000000001000000010000000000000005446562756784020000 + + + 968 + 1B00FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180DB8B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804601000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 968 + 1B00FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180DB8B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018001890000000000001300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180460100000000000014000000000000000000000000000000000100000001000000 + + + + 0 + 1920 + 1080 + + + + 1 + Debug + + -1 + -1 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D00000004F00000042050000E0000000 + + + 16 + DD0000007C0000004F0500000D010000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C9000000EC020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 109 + 109 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C9000000EC020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 1465 + 1465 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1506 + 1506 + 1 + 0 + 0 + 1 + 32767 + 0 + 16384 + 0 + + 16 + 46050000660000001206000005030000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 1507 + 1507 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D3000000690000003F050000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 1935 + 1935 + 1 + 0 + 0 + 1 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1944 + 1944 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 195 + 195 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C9000000EC020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 196 + 196 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C9000000EC020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 197 + 197 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 198 + 198 + 1 + 0 + 0 + 1 + 32767 + 0 + 32768 + 0 + + 16 + 000000000903000009030000B1030000 + + + 16 + 5C000000920000002803000023010000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 203 + 203 + 1 + 0 + 0 + 1 + 32767 + 0 + 8192 + 0 + + 16 + D00000006600000042050000E0000000 + + + 16 + 5C000000920000002803000023010000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D3000000690000003F050000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D3000000690000003F050000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D3000000690000003F050000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D3000000690000003F050000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 38003 + 38003 + 1 + 0 + 0 + 1 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C9000000EC020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 50008 + 50008 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0D000000440000009D0100005F000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 940 + 0 + 8192 + 0 + + 16 + 0000000000000000B70300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000B103000012060000C4030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59398 + 59398 + 0 + 0 + 0 + 0 + 391 + 0 + 8192 + 1 + + 16 + 000000001C0000009201000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 593980 + 59398 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000001206000017000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 593981b4 + 59398 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000001206000017000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 593987a06 + 59398 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000001206000017000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 644 + 0 + 8192 + 2 + + 16 + 000000001C0000008F02000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2484 + 000000000B000000000000000020000001000000FFFFFFFFFFFFFFFFD0000000E000000042050000E4000000010000000100001004000000010000000000000000000000FFFFFFFF06000000CB00000057010000CC000000F08B00005A01000079070000FFFF02000B004354616262656450616E650020000001000000DD0000007C0000004F0500000D010000D00000004F00000042050000E00000000000000040280056060000000B446973617373656D626C7901000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000001000000FFFFFFFFFFFFFFFF420500004F0000004605000005030000010000000200001004000000010000000000000000000000FFFFFFFF16000000E20500002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000001800040000001000000530500007C0000001F06000032030000460500004F00000012060000050300000000000040410056160000000753796D626F6C7301000000E205000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFCC0000004F000000D000000005030000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000D0000007C000000D900000032030000000000004F000000CC000000050300000000000040140056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73000000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7300000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657300000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273010000007394000001000000FFFFFFFFFFFFFFFF04000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000001000000FFFFFFFFFFFFFFFF0000000005030000120600000903000001000000010000100400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0900000098070000E30500008F0700009007000091070000B9050000BA050000BB050000BC050000018000800000010000001A030000360300001F060000DE0300000D0300000903000012060000B10300000000000040820056090000000A43616C6C20537461636B000000009807000001000000FFFFFFFFFFFFFFFF0A43616C6C20537461636B01000000E305000001000000FFFFFFFFFFFFFFFF064C6F63616C73010000008F07000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF084D656D6F7279203101000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF020000000000000001000000000000000100000001000000FFFFFFFF09030000090300000D030000B103000001000000020000100400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF9807000001000000FFFFFFFF9807000001000000C6000000000000000080000000000000FFFFFFFFFFFFFFFF000000002F0200009805000033020000000000000100000004000000010000000000000000000000FFFFFFFF07000000C5000000C70000007794000093070000940700009507000096070000018000800000000000000D00000060020000A5050000F1020000000000003302000098050000C40200000000000040820046070000000C4275696C64204F757470757400000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0642726F777365000000007794000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2120 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000004000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000004000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000F675F707563437573746F6D31367074960000000000000007000F675F707563437573746F6D313670740E55415254496E7448616E646C6572056D61696E28046D61696E08707563496D6167650A454550524F4D546573740C466C61736850726F6772616D00000000000000000000000000000000000000000000000000000000018024E10000020005001100000000000000000000000000000000010000000100000001800A810000000004001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020001001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020001001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65AC030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59398 + Build + + 552 + 00200000000000000D00FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E00000000000000000000000000000000010000000100000001809E8A0000000000001F0000000000000000000000000000000001000000010000000180D17F0000000000002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050FFFFFFFF00960000000000000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A0000000000002400000000000000000000000000000000010000000100000000000000054275696C6487010000 + + + 478 + 0D00FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 478 + 0D00FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A00000000000009000000000000000000000000000000000100000001000000 + + + + 59399 + Debug + + 2353 + 00200000010000001B00FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000004002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000004002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000020001002D0000000000000000000000000000000001000000010000000180F07F0000020001002E0000000000000000000000000000000001000000010000000180E8880000020001003700000000000000000000000000000000010000000100000001803B010000020001002F0000000000000000000000000000000001000000010000000180BB8A00000200010030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000002000100310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380DB8B00000000000031000000064C6F63616C73000000000000000000000000010000000100000000000000000000000100000000001380D88B000000000000310000000757617463682031000000000000000000000000010000000100000000000000000000000100000000001380D98B0000000000003100000007576174636820320000000000000000000000000100000001000000000000000000000001000000000013800F01000002000100320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000084D656D6F72792031000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000084D656D6F72792032000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000084D656D6F72792033000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000084D656D6F727920340000000000000000000000000100000001000000000000000000000001000000000013801001000002000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000755415254202331000000000000000000000000010000000100000000000000000000000100000000001380940700000000000033000000075541525420233200000000000000000000000001000000010000000000000000000000010000000000138095070000000000003300000007554152542023330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000000E49544D2F525441205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000020000003400000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380658A000000000000340000000E4C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E00000014506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000D436F646520436F76657261676500000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000138001890000020000003600000007546F6F6C626F7800000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804601000000000400490000000000000000000000000000000001000000010000000000000005446562756784020000 + + + 968 + 1B00FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180DB8B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804601000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 968 + 1B00FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180DB8B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018001890000000000001300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180460100000000000014000000000000000000000000000000000100000001000000 + + + + 0 + 1920 + 1080 + + + + +
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvgui_a0190789.bak b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvgui_a0190789.bak new file mode 100644 index 0000000..9c55599 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvgui_a0190789.bak @@ -0,0 +1,2646 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + + + 38003 + Registers + 115 100 + + + 1506 + Symbols + 53 47 100 + + + 1935 + Locals + 643 120 + + + 1936 + Watch 1 + 582 181 + + + 1937 + Watch 2 + 582 181 + + + 1944 + Call Stack + 381 382 + + + 1507 + Call Stack + 150 613 + + + 346 + Code Coverage + 830 282 + + + 204 + Performance Analyzer + 304 150 150 524 + + + + + + 572 + New Symbols + 133 133 133 + + + 575 + Locals + 238 238 238 + + + 573 + Watch 1 + 133 133 133 + + + 574 + Watch 2 + 133 133 133 + + + 363 + New Call Stack + 238 -1 + + + + + + 0 + 0 + 0 + + + + + + + 44 + 0 + 1 + + -1 + -1 + + + -1 + -1 + + + 15 + 9 + 1571 + 1013 + + + + 0 + + 362 + 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000002000000010000000100000048433A5C686F6D655C6477696C736F6E5C6465765C4343533577735C4672656552544F535C44656D6F5C434F525445585F4C4D3353787878785F4941525F4B65696C5C6D61696E2E6300000000066D61696E2E6300000000C5D4F200FFFFFFFF44433A5C686F6D655C6477696C736F6E5C6465765C4343533577735C4672656552544F535C536F757263655C706F727461626C655C4D656D4D616E675C686561705F322E630000000008686561705F322E6300000000FFDC7800FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000DD0000007C0000001F060000B4020000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D00000004F000000C8040000E0000000 + + + 16 + DD0000007C000000D50400000D010000 + + + + 1005 + 1005 + 1 + 0 + 0 + 1 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C90000006E020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C90000006E020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 1507 + 1507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D300000069000000C5040000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1944 + 1944 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 030000003602000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C90000006E020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C90000006E020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 197 + 197 + 1 + 0 + 0 + 1 + 32767 + 0 + 32768 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000001C02000098050000C4020000 + + + 16 + 5C000000920000002803000023010000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + D300000069000000C5040000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D300000069000000C5040000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D300000069000000C5040000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D300000069000000C5040000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D300000069000000C5040000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + CF0400006900000095050000AB020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C90000006E020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 38007 + 38007 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000A50200000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 50008 + 50008 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0D000000440000009D0100005F000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 940 + 0 + 8192 + 0 + + 16 + 0000000000000000B70300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000B103000012060000C4030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59398 + 59398 + 1 + 0 + 0 + 0 + 391 + 0 + 8192 + 1 + + 16 + 000000001C0000009201000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 593980 + 59398 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000001206000017000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 593981b4 + 59398 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000001206000017000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 593987a06 + 59398 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000001206000017000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 0 + 0 + 0 + 0 + 644 + 0 + 8192 + 2 + + 16 + 00000000380000008F02000054000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2485 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFD0000000E0000000C8040000E4000000000000000100000004000000010000000000000000000000FFFFFFFF06000000CB00000057010000CC000000F08B00005A01000079070000FFFF02000B004354616262656450616E650020000000000000DD0000007C000000D50400000D010000D00000004F000000C8040000E00000000000000040280046060000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFFC80400004F000000CC040000C4020000000000000200000004000000010000000000000000000000FFFFFFFF16000000E20500002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000001800040000000000000D90400007C000000A5050000F1020000CC0400004F00000098050000C40200000000000040410046160000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFCC0000004F000000D000000087020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000D0000007C000000D9000000B4020000000000004F000000CC000000870200000000000040140056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000018020000980500001C02000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0900000098070000E30500008F0700009007000091070000B9050000BA050000BB050000BC050000018000800000000000000D00000049020000A5050000F1020000000000001C02000098050000C40200000000000040820046090000000A43616C6C20537461636B000000009807000001000000FFFFFFFFFFFFFFFF0A43616C6C20537461636B00000000E305000001000000FFFFFFFFFFFFFFFF064C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFCC0200001C020000D0020000C402000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF9807000001000000FFFFFFFF9807000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF0000000087020000120600008B0200000100000001000010040000000100000042FEFFFF99010000FFFFFFFF07000000C5000000C70000007794000093070000940700009507000096070000018000800000010000000D000000B80200001F060000DE030000000000008B02000012060000B10300000000000040820056070000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0742726F77736572010000007794000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2120 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000F675F707563437573746F6D31367074960000000000000007000F675F707563437573746F6D313670740E55415254496E7448616E646C6572056D61696E28046D61696E08707563496D6167650A454550524F4D546573740C466C61736850726F6772616D00000000000000000000000000000000000000000000000000000000018024E10000020001001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020000001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020001001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65AC030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59398 + Build + + 583 + 00200000010000000D00FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E00000000000000000000000000000000010000000100000001809E8A0000000004001F0000000000000000000000000000000001000000010000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000000D4672656552544F535F44656D6F960000000000000001000D4672656552544F535F44656D6F000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A0000000004002400000000000000000000000000000000010000000100000000000000054275696C6487010000 + + + 478 + 0D00FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 478 + 0D00FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A00000000000009000000000000000000000000000000000100000001000000 + + + + 59399 + Debug + + 2353 + 00200000000000001B00FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380DB8B00000000000031000000064C6F63616C73000000000000000000000000010000000100000000000000000000000100000000001380D88B000000000000310000000757617463682031000000000000000000000000010000000100000000000000000000000100000000001380D98B0000000000003100000007576174636820320000000000000000000000000100000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000084D656D6F72792031000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000084D656D6F72792032000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000084D656D6F72792033000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000084D656D6F727920340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000755415254202331000000000000000000000000010000000100000000000000000000000100000000001380940700000000000033000000075541525420233200000000000000000000000001000000010000000000000000000000010000000000138095070000000000003300000007554152542023330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000000E49544D2F525441205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000003400000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380658A000000000000340000000E4C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E00000014506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000D436F646520436F76657261676500000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000138001890000000000003600000007546F6F6C626F7800000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804601000000000000490000000000000000000000000000000001000000010000000000000005446562756784020000 + + + 968 + 1B00FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180DB8B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804601000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 968 + 1B00FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180DB8B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018001890000000000001300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180460100000000000014000000000000000000000000000000000100000001000000 + + + + 0 + 1920 + 1080 + + + + 1 + Debug + + -1 + -1 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D00000004F00000042050000E0000000 + + + 16 + DD0000007C0000004F0500000D010000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C9000000EC020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 109 + 109 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C9000000EC020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 1465 + 1465 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1506 + 1506 + 1 + 0 + 0 + 1 + 32767 + 0 + 16384 + 0 + + 16 + 46050000660000001206000005030000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 1507 + 1507 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D3000000690000003F050000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 1935 + 1935 + 1 + 0 + 0 + 1 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 1944 + 1944 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 10030000230300000F06000098030000 + + + 16 + 5C000000920000002803000023010000 + + + + 195 + 195 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C9000000EC020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 196 + 196 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C9000000EC020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 197 + 197 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 198 + 198 + 1 + 0 + 0 + 1 + 32767 + 0 + 32768 + 0 + + 16 + 000000000903000009030000B1030000 + + + 16 + 5C000000920000002803000023010000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 203 + 203 + 1 + 0 + 0 + 1 + 32767 + 0 + 8192 + 0 + + 16 + D00000006600000042050000E0000000 + + + 16 + 5C000000920000002803000023010000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D3000000690000003F050000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D3000000690000003F050000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D3000000690000003F050000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + D3000000690000003F050000C7000000 + + + 16 + 5C000000920000002803000023010000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 49050000690000000F060000EC020000 + + + 16 + 5C00000092000000EC01000022020000 + + + + 38003 + 38003 + 1 + 0 + 0 + 1 + 32767 + 0 + 4096 + 0 + + 16 + 0300000069000000C9000000EC020000 + + + 16 + 5C0000009200000028010000D8020000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000004D02000095050000AB020000 + + + 16 + 5C000000920000002803000023010000 + + + + 50008 + 50008 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0D000000440000009D0100005F000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 940 + 0 + 8192 + 0 + + 16 + 0000000000000000B70300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000B103000012060000C4030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59398 + 59398 + 0 + 0 + 0 + 0 + 391 + 0 + 8192 + 1 + + 16 + 000000001C0000009201000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 593980 + 59398 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000001206000017000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 593981b4 + 59398 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000001206000017000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 593987a06 + 59398 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000001206000017000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 644 + 0 + 8192 + 2 + + 16 + 000000001C0000008F02000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2484 + 000000000B000000000000000020000001000000FFFFFFFFFFFFFFFFD0000000E000000042050000E4000000010000000100001004000000010000000000000000000000FFFFFFFF06000000CB00000057010000CC000000F08B00005A01000079070000FFFF02000B004354616262656450616E650020000001000000DD0000007C0000004F0500000D010000D00000004F00000042050000E00000000000000040280056060000000B446973617373656D626C7901000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000001000000FFFFFFFFFFFFFFFF420500004F0000004605000005030000010000000200001004000000010000000000000000000000FFFFFFFF16000000E20500002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000001800040000001000000530500007C0000001F06000032030000460500004F00000012060000050300000000000040410056160000000753796D626F6C7301000000E205000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFCC0000004F000000D000000005030000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000000D0000007C000000D900000032030000000000004F000000CC000000050300000000000040140056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73000000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7300000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657300000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273010000007394000001000000FFFFFFFFFFFFFFFF04000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000001000000FFFFFFFFFFFFFFFF0000000005030000120600000903000001000000010000100400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0900000098070000E30500008F0700009007000091070000B9050000BA050000BB050000BC050000018000800000010000001A030000360300001F060000DE0300000D0300000903000012060000B10300000000000040820056090000000A43616C6C20537461636B000000009807000001000000FFFFFFFFFFFFFFFF0A43616C6C20537461636B01000000E305000001000000FFFFFFFFFFFFFFFF064C6F63616C73010000008F07000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF084D656D6F7279203101000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF020000000000000001000000000000000100000001000000FFFFFFFF09030000090300000D030000B103000001000000020000100400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF9807000001000000FFFFFFFF9807000001000000C6000000000000000080000000000000FFFFFFFFFFFFFFFF000000002F0200009805000033020000000000000100000004000000010000000000000000000000FFFFFFFF07000000C5000000C70000007794000093070000940700009507000096070000018000800000000000000D00000060020000A5050000F1020000000000003302000098050000C40200000000000040820046070000000C4275696C64204F757470757400000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0642726F777365000000007794000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2120 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000004000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000004000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000F675F707563437573746F6D31367074960000000000000007000F675F707563437573746F6D313670740E55415254496E7448616E646C6572056D61696E28046D61696E08707563496D6167650A454550524F4D546573740C466C61736850726F6772616D00000000000000000000000000000000000000000000000000000000018024E10000020005001100000000000000000000000000000000010000000100000001800A810000000004001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020001001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020001001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65AC030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59398 + Build + + 552 + 00200000000000000D00FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E00000000000000000000000000000000010000000100000001809E8A0000000000001F0000000000000000000000000000000001000000010000000180D17F0000000000002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050FFFFFFFF00960000000000000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A0000000000002400000000000000000000000000000000010000000100000000000000054275696C6487010000 + + + 478 + 0D00FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 478 + 0D00FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A00000000000009000000000000000000000000000000000100000001000000 + + + + 59399 + Debug + + 2353 + 00200000010000001B00FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000004002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000004002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000020001002D0000000000000000000000000000000001000000010000000180F07F0000020001002E0000000000000000000000000000000001000000010000000180E8880000020001003700000000000000000000000000000000010000000100000001803B010000020001002F0000000000000000000000000000000001000000010000000180BB8A00000200010030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000002000100310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380DB8B00000000000031000000064C6F63616C73000000000000000000000000010000000100000000000000000000000100000000001380D88B000000000000310000000757617463682031000000000000000000000000010000000100000000000000000000000100000000001380D98B0000000000003100000007576174636820320000000000000000000000000100000001000000000000000000000001000000000013800F01000002000100320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000084D656D6F72792031000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000084D656D6F72792032000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000084D656D6F72792033000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000084D656D6F727920340000000000000000000000000100000001000000000000000000000001000000000013801001000002000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000755415254202331000000000000000000000000010000000100000000000000000000000100000000001380940700000000000033000000075541525420233200000000000000000000000001000000010000000000000000000000010000000000138095070000000000003300000007554152542023330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000000E49544D2F525441205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000020000003400000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380658A000000000000340000000E4C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E00000014506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000D436F646520436F76657261676500000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000138001890000020000003600000007546F6F6C626F7800000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804601000000000400490000000000000000000000000000000001000000010000000000000005446562756784020000 + + + 968 + 1B00FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180DB8B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804601000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 968 + 1B00FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180DB8B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018001890000000000001300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180460100000000000014000000000000000000000000000000000100000001000000 + + + + 0 + 1920 + 1080 + + + + +
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvopt b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvopt new file mode 100644 index 0000000..e4db295 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvopt @@ -0,0 +1,800 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + FreeRTOS_Demo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\LM3S8962.PDF + + + + SARMCM3.DLL + + DLM.DLL + -pLM3S8962 + SARMCM3.DLL + + TLM.DLL + -pLM3S8962 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 5 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + UL2CM3 + -UU0101L5E -O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_256 -FS00 -FL040000 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)(103=-1,-1,-1,-1,0)(104=-1,-1,-1,-1,0)(105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(163=-1,-1,-1,-1,0)(164=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1013=-1,-1,-1,-1,0)(171=-1,-1,-1,-1,0)(172=-1,-1,-1,-1,0)(173=-1,-1,-1,-1,0)(1014=-1,-1,-1,-1,0)(1016=-1,-1,-1,-1,0)(136=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + lmidk-agdi + -U063107FEA -O1536 -S3 -FO29 + + + + + 1 + 2 + 0 + + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Demo_Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\BlockQ.c + BlockQ.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\blocktim.c + blocktim.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\death.c + death.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\integer.c + integer.c + + + 1 + 5 + 1 + 0 + 0 + 33 + 0 + 97 + 101 + 0 + .\main.c + main.c + + 44 + 0 + 1 + + -1 + -1 + + + -4 + -24 + + + 115 + 110 + 1016 + 534 + + + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\ParTest\ParTest.c + ParTest.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\PollQ.c + PollQ.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\semtest.c + semtest.c + + + 1 + 9 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\timertest.c + timertest.c + + + 1 + 11 + 5 + 0 + 0 + 55 + 0 + 0 + 0 + 0 + .\FreeRTOSConfig.h + FreeRTOSConfig.h + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\GenQTest.c + GenQTest.c + + + 1 + 13 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\QPeek.c + QPeek.c + + + 1 + 14 + 1 + 0 + 0 + 43 + 0 + 83 + 83 + 0 + .\IntQueueTimer.c + IntQueueTimer.c + + 44 + 0 + 1 + + -1 + -1 + + + -4 + -24 + + + 46 + 44 + 939 + 449 + + + + + 1 + 15 + 1 + 0 + 1 + 2 + 0 + 628 + 653 + 0 + ..\Common\Minimal\IntQueue.c + IntQueue.c + + 44 + 2 + 3 + + -1 + -1 + + + -4 + -24 + + + 69 + 66 + 961 + 472 + + + + + 1 + 16 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\recmutex.c + recmutex.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 17 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\rit128x96x4.c + rit128x96x4.c + + + 2 + 18 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\drivers\LuminaryMicro\Keil\driverlib.lib + driverlib.lib + + + 2 + 19 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\formike128x128x16.c + formike128x128x16.c + + + 2 + 20 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\drivers\LuminaryMicro\Keil\grlib.lib + grlib.lib + + + + + RTOS_Source + 1 + 0 + 0 + + 3 + 21 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\Source\tasks.c + tasks.c + + + 3 + 22 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\Source\list.c + list.c + + + 3 + 23 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\Source\queue.c + queue.c + + + 3 + 24 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\Source\portable\RVDS\ARM_CM3\port.c + port.c + + + 3 + 25 + 1 + 0 + 0 + 36 + 0 + 33 + 33 + 0 + ..\..\Source\portable\MemMang\heap_2.c + heap_2.c + + + 3 + 26 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\osram128x64x4.c + osram128x64x4.c + + + + + uIP_Source + 0 + 0 + 0 + + 4 + 27 + 1 + 0 + 0 + 49 + 0 + 0 + 0 + 0 + .\webserver\uIP_Task.c + uIP_Task.c + + + 4 + 28 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\webserver\emac.c + emac.c + + + 4 + 29 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\webserver\httpd.c + httpd.c + + + 4 + 30 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\webserver\httpd-cgi.c + httpd-cgi.c + + + 4 + 31 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\webserver\httpd-fs.c + httpd-fs.c + + + 4 + 32 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\webserver\http-strings.c + http-strings.c + + + 4 + 33 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c + uip_arp.c + + + 4 + 34 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\ethernet\uIP\uip-1.0\uip\psock.c + psock.c + + + 4 + 35 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\ethernet\uIP\uip-1.0\uip\timer.c + timer.c + + + 4 + 36 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\ethernet\uIP\uip-1.0\uip\uip.c + uip.c + + + + + 1 + 0 + + 100 + 1 + + + .\main.c + 33 + 97 + 101 + + + ..\..\Source\portable\MemMang\heap_2.c + 36 + 33 + 33 + + + + + +
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvproj b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvproj new file mode 100644 index 0000000..0764111 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.uvproj @@ -0,0 +1,600 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + FreeRTOS_Demo + 0x4 + ARM-ADS + + + LM3S8962 + Luminary Micro + IRAM(0x20000000-0x2000FFFF) IROM(0-0x3FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") + + "STARTUP\Luminary\Startup.s" ("Luminary Startup Code") + UL2CM3(-UU0101L5E -O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_256 -FS00 -FL040000) + 4285 + LM3Sxxx.H + + + + + + + + + + + 0 + + + + Luminary\ + Luminary\ + + 0 + 0 + 0 + 0 + 1 + + .\rvmdk\ + RTOSDemo + 1 + 0 + 0 + 1 + 1 + .\rvmdk\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 1 + 0 + fromelf --bin --output .\rvmdk\RTOSDemo.bin .\rvmdk\RTOSDemo.axf + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + + + SARMCM3.DLL + + DLM.DLL + -pLM3S8962 + SARMCM3.DLL + + TLM.DLL + -pLM3S8962 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + + + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + + 0 + 4 + + + + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + + 1 + 0 + 0 + 0 + 1 + 4099 + + BIN\lmidk-agdi.dll + "" () + + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 1 + 0x0 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + --diag_suppress 191,550,513,167,177,144 + RVDS_ARMCM3_LM3S102, "PACK_STRUCT_END=","ALIGN_STRUCT_END=" + + .;.\..\Common\drivers\LuminaryMicro;..\..\Source\portable\RVDS\ARM_CM3;..\..\Source\include;..\Common\include;..\Common\ethernet\uIP\uip-1.0\uip;.\webserver + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x00000000 + 0x20000000 + + + + --entry Reset_Handler + + + + + + + + Demo_Source + + + BlockQ.c + 1 + ..\Common\Minimal\BlockQ.c + + + blocktim.c + 1 + ..\Common\Minimal\blocktim.c + + + death.c + 1 + ..\Common\Minimal\death.c + + + integer.c + 1 + ..\Common\Minimal\integer.c + + + main.c + 1 + .\main.c + + + ParTest.c + 1 + .\ParTest\ParTest.c + + + PollQ.c + 1 + ..\Common\Minimal\PollQ.c + + + semtest.c + 1 + ..\Common\Minimal\semtest.c + + + startup_rvmdk.S + 2 + .\startup_rvmdk.S + + + timertest.c + 1 + .\timertest.c + + + FreeRTOSConfig.h + 5 + .\FreeRTOSConfig.h + + + GenQTest.c + 1 + ..\Common\Minimal\GenQTest.c + + + QPeek.c + 1 + ..\Common\Minimal\QPeek.c + + + IntQueueTimer.c + 1 + .\IntQueueTimer.c + + + IntQueue.c + 1 + ..\Common\Minimal\IntQueue.c + + + recmutex.c + 1 + ..\Common\Minimal\recmutex.c + + + QueueSet.c + 1 + ..\Common\Minimal\QueueSet.c + + + + + Libraries + + + rit128x96x4.c + 1 + .\rit128x96x4.c + + + osram128x64x4.c + 1 + .\osram128x64x4.c + + + driverlib.lib + 4 + ..\Common\drivers\LuminaryMicro\Keil\driverlib.lib + + + formike128x128x16.c + 1 + .\formike128x128x16.c + + + grlib.lib + 4 + ..\Common\drivers\LuminaryMicro\Keil\grlib.lib + + + + + RTOS_Source + + + tasks.c + 1 + ..\..\Source\tasks.c + + + list.c + 1 + ..\..\Source\list.c + + + queue.c + 1 + ..\..\Source\queue.c + + + port.c + 1 + ..\..\Source\portable\RVDS\ARM_CM3\port.c + + + heap_2.c + 1 + ..\..\Source\portable\MemMang\heap_2.c + + + + + uIP_Source + + + uIP_Task.c + 1 + .\webserver\uIP_Task.c + + + emac.c + 1 + .\webserver\emac.c + + + httpd.c + 1 + .\webserver\httpd.c + + + httpd-cgi.c + 1 + .\webserver\httpd-cgi.c + + + httpd-fs.c + 1 + .\webserver\httpd-fs.c + + + http-strings.c + 1 + .\webserver\http-strings.c + + + uip_arp.c + 1 + ..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c + + + psock.c + 1 + ..\Common\ethernet\uIP\uip-1.0\uip\psock.c + + + timer.c + 1 + ..\Common\ethernet\uIP\uip-1.0\uip\timer.c + + + uip.c + 1 + ..\Common\ethernet\uIP\uip-1.0\uip\uip.c + + + + + + + +
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.xcl b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.xcl new file mode 100644 index 0000000..9bca99f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo.xcl @@ -0,0 +1,56 @@ +//***************************************************************************** +// +// webserver-lwip.xcl - Linker script for EW-ARM. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED AS IS. NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +//***************************************************************************** + +// +// Set the CPU type to ARM. +// +-carm + +// +// Define the size of flash and SRAM. +// +-DROMSTART=00000000 +-DROMEND=00040000 +-DRAMSTART=20000000 +-DRAMEND=20010000 + + + +// +// Define the sections to place into flash, and the order to place them. +// +-Z(CODE)INTVEC=ROMSTART-ROMEND +-Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND +-Z(CODE)CODE=ROMSTART-ROMEND +-Z(CONST)CODE_ID=ROMSTART-ROMEND +-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND +-Z(CONST)CHECKSUM=ROMSTART-ROMEND + +// +// Define the sections to place into SRAM, and the order to place them. +// +-Z(DATA)VTABLE=RAMSTART-RAMEND +-Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND +-Z(DATA)CODE_I=RAMSTART-RAMEND diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo_FreeRTOS_Demo.dep b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo_FreeRTOS_Demo.dep new file mode 100644 index 0000000..b72b03d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo_FreeRTOS_Demo.dep @@ -0,0 +1,471 @@ +Dependencies for Project 'RTOSDemo', Target 'FreeRTOS_Demo': (DO NOT MODIFY !) +F (..\Common\Minimal\BlockQ.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\blockq.o" --omf_browse ".\rvmdk\blockq.crf" --depend ".\rvmdk\blockq.d") +I (C:\Keil\ARM\RV31\INC\stdlib.h)(0x4D4C44E4) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\..\Source\include\queue.h)(0x4E78C6B7) +I (..\Common\include\BlockQ.h)(0x4E78C6B7) +F (..\Common\Minimal\blocktim.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\blocktim.o" --omf_browse ".\rvmdk\blocktim.crf" --depend ".\rvmdk\blocktim.d") +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\..\Source\include\queue.h)(0x4E78C6B7) +I (..\Common\include\blocktim.h)(0x4E78C6B7) +F (..\Common\Minimal\death.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\death.o" --omf_browse ".\rvmdk\death.crf" --depend ".\rvmdk\death.d") +I (C:\Keil\ARM\RV31\INC\stdlib.h)(0x4D4C44E4) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\Common\include\death.h)(0x4E78C6B7) +F (..\Common\Minimal\integer.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\integer.o" --omf_browse ".\rvmdk\integer.crf" --depend ".\rvmdk\integer.d") +I (C:\Keil\ARM\RV31\INC\stdlib.h)(0x4D4C44E4) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\Common\include\integer.h)(0x4E78C6B7) +F (.\main.c)(0x4ED7964B)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\main.o" --omf_browse ".\rvmdk\main.crf" --depend ".\rvmdk\main.d") +I (C:\Keil\ARM\RV31\INC\stdio.h)(0x4D46C1D6) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\..\Source\include\queue.h)(0x4E78C6B7) +I (..\..\Source\include\semphr.h)(0x4E78C6B7) +I (.\..\Common\drivers\LuminaryMicro\hw_memmap.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_types.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_sysctl.h)(0x4D4D7ED3) +I (.\..\Common\drivers\LuminaryMicro\sysctl.h)(0x4D4D7ED3) +I (.\..\Common\drivers\LuminaryMicro\gpio.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\grlib.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\rit128x96x4.h)(0x4A8A85D4) +I (osram128x64x4.h)(0x4A8A84A4) +I (formike128x128x16.h)(0x4A8A84A4) +I (..\Common\include\BlockQ.h)(0x4E78C6B7) +I (..\Common\include\death.h)(0x4E78C6B7) +I (..\Common\include\integer.h)(0x4E78C6B7) +I (..\Common\include\blocktim.h)(0x4E78C6B7) +I (..\Common\include\flash.h)(0x4E78C6B7) +I (..\Common\include\partest.h)(0x4E78C6B7) +I (..\Common\include\semtest.h)(0x4E78C6B7) +I (..\Common\include\PollQ.h)(0x4E78C6B7) +I (lcd_message.h)(0x4A8A84A4) +I (bitmap.h)(0x4A8A84A4) +I (..\Common\include\GenQTest.h)(0x4E78C6B7) +I (..\Common\include\QPeek.h)(0x4E78C6B7) +I (..\Common\include\recmutex.h)(0x4E78C6B7) +I (..\Common\include\IntQueue.h)(0x4E78C6B7) +F (.\ParTest\ParTest.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\partest.o" --omf_browse ".\rvmdk\partest.crf" --depend ".\rvmdk\partest.d") +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\Common\include\partest.h)(0x4E78C6B7) +I (.\..\Common\drivers\LuminaryMicro\hw_types.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\gpio.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_memmap.h)(0x4A8A85D4) +F (..\Common\Minimal\PollQ.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\pollq.o" --omf_browse ".\rvmdk\pollq.crf" --depend ".\rvmdk\pollq.d") +I (C:\Keil\ARM\RV31\INC\stdlib.h)(0x4D4C44E4) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\..\Source\include\queue.h)(0x4E78C6B7) +I (..\Common\include\PollQ.h)(0x4E78C6B7) +F (..\Common\Minimal\semtest.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\semtest.o" --omf_browse ".\rvmdk\semtest.crf" --depend ".\rvmdk\semtest.d") +I (C:\Keil\ARM\RV31\INC\stdlib.h)(0x4D4C44E4) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\..\Source\include\semphr.h)(0x4E78C6B7) +I (..\..\Source\include\queue.h)(0x4E78C6B7) +I (..\Common\include\semtest.h)(0x4E78C6B7) +F (.\startup_rvmdk.S)(0x4A8A84A4)(--cpu Cortex-M3 -g --apcs=interwork -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -o ".\rvmdk\startup_rvmdk.o" --depend ".\rvmdk\startup_rvmdk.d") +F (.\timertest.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\timertest.o" --omf_browse ".\rvmdk\timertest.crf" --depend ".\rvmdk\timertest.d") +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (.\..\Common\drivers\LuminaryMicro\hw_ints.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_memmap.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_types.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\interrupt.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\sysctl.h)(0x4D4D7ED3) +I (.\..\Common\drivers\LuminaryMicro\lmi_timer.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_timer.h)(0x4A8A85D4) +F (.\FreeRTOSConfig.h)(0x4E78C6B7)() +F (..\Common\Minimal\GenQTest.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\genqtest.o" --omf_browse ".\rvmdk\genqtest.crf" --depend ".\rvmdk\genqtest.d") +I (C:\Keil\ARM\RV31\INC\stdlib.h)(0x4D4C44E4) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\..\Source\include\queue.h)(0x4E78C6B7) +I (..\..\Source\include\semphr.h)(0x4E78C6B7) +I (..\Common\include\GenQTest.h)(0x4E78C6B7) +F (..\Common\Minimal\QPeek.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\qpeek.o" --omf_browse ".\rvmdk\qpeek.crf" --depend ".\rvmdk\qpeek.d") +I (C:\Keil\ARM\RV31\INC\stdlib.h)(0x4D4C44E4) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\..\Source\include\queue.h)(0x4E78C6B7) +I (..\..\Source\include\semphr.h)(0x4E78C6B7) +I (..\Common\include\QPeek.h)(0x4E78C6B7) +F (.\IntQueueTimer.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\intqueuetimer.o" --omf_browse ".\rvmdk\intqueuetimer.crf" --depend ".\rvmdk\intqueuetimer.d") +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (IntQueueTimer.h)(0x4E78C6B7) +I (..\Common\include\IntQueue.h)(0x4E78C6B7) +I (.\..\Common\drivers\LuminaryMicro\hw_ints.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_memmap.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_types.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\interrupt.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\sysctl.h)(0x4D4D7ED3) +I (.\..\Common\drivers\LuminaryMicro\lmi_timer.h)(0x4A8A85D4) +F (..\Common\Minimal\IntQueue.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\intqueue.o" --omf_browse ".\rvmdk\intqueue.crf" --depend ".\rvmdk\intqueue.d") +I (C:\Keil\ARM\RV31\INC\string.h)(0x4D46C1D6) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\queue.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\Common\include\IntQueue.h)(0x4E78C6B7) +I (.\IntQueueTimer.h)(0x4E78C6B7) +F (..\Common\Minimal\recmutex.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\recmutex.o" --omf_browse ".\rvmdk\recmutex.crf" --depend ".\rvmdk\recmutex.d") +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\..\Source\include\semphr.h)(0x4E78C6B7) +I (..\..\Source\include\queue.h)(0x4E78C6B7) +I (..\Common\include\recmutex.h)(0x4E78C6B7) +F (.\rit128x96x4.c)(0x4A8A84A4)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\rit128x96x4.o" --omf_browse ".\rvmdk\rit128x96x4.crf" --depend ".\rvmdk\rit128x96x4.d") +I (.\..\Common\drivers\LuminaryMicro\hw_ssi.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_memmap.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_sysctl.h)(0x4D4D7ED3) +I (.\..\Common\drivers\LuminaryMicro\hw_types.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\debug.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\gpio.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\ssi.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\sysctl.h)(0x4D4D7ED3) +I (.\..\Common\drivers\LuminaryMicro\rit128x96x4.h)(0x4A8A85D4) +F (..\Common\drivers\LuminaryMicro\Keil\driverlib.lib)(0x4A8A85C2)() +F (.\formike128x128x16.c)(0x4A8A84A4)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\formike128x128x16.o" --omf_browse ".\rvmdk\formike128x128x16.crf" --depend ".\rvmdk\formike128x128x16.d") +I (.\..\Common\drivers\LuminaryMicro\hw_gpio.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_memmap.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_types.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\gpio.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\sysctl.h)(0x4D4D7ED3) +I (.\..\Common\drivers\LuminaryMicro\rom.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\grlib.h)(0x4A8A85D4) +I (formike128x128x16.h)(0x4A8A84A4) +I (C:\Keil\ARM\RV31\INC\string.h)(0x4D46C1D6) +F (..\Common\drivers\LuminaryMicro\Keil\grlib.lib)(0x4A8A85C0)() +F (..\..\Source\tasks.c)(0x4E78C6B7)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\tasks.o" --omf_browse ".\rvmdk\tasks.crf" --depend ".\rvmdk\tasks.d") +I (C:\Keil\ARM\RV31\INC\stdio.h)(0x4D46C1D6) +I (C:\Keil\ARM\RV31\INC\stdlib.h)(0x4D4C44E4) +I (C:\Keil\ARM\RV31\INC\string.h)(0x4D46C1D6) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\..\Source\include\timers.h)(0x4E78C6B7) +I (..\..\Source\include\StackMacros.h)(0x4E78C6B7) +F (..\..\Source\list.c)(0x4E78C6B7)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\list.o" --omf_browse ".\rvmdk\list.crf" --depend ".\rvmdk\list.d") +I (C:\Keil\ARM\RV31\INC\stdlib.h)(0x4D4C44E4) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +F (..\..\Source\queue.c)(0x4E78C6B7)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\queue.o" --omf_browse ".\rvmdk\queue.crf" --depend ".\rvmdk\queue.d") +I (C:\Keil\ARM\RV31\INC\stdlib.h)(0x4D4C44E4) +I (C:\Keil\ARM\RV31\INC\string.h)(0x4D46C1D6) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +F (..\..\Source\portable\RVDS\ARM_CM3\port.c)(0x4E78C6B7)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\port.o" --omf_browse ".\rvmdk\port.crf" --depend ".\rvmdk\port.d") +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +F (..\..\Source\portable\MemMang\heap_2.c)(0x4E78C6B7)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\heap_2.o" --omf_browse ".\rvmdk\heap_2.crf" --depend ".\rvmdk\heap_2.d") +I (C:\Keil\ARM\RV31\INC\stdlib.h)(0x4D4C44E4) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +F (.\osram128x64x4.c)(0x4A8A84A4)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\osram128x64x4.o" --omf_browse ".\rvmdk\osram128x64x4.crf" --depend ".\rvmdk\osram128x64x4.d") +I (.\..\Common\drivers\LuminaryMicro\hw_ssi.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_memmap.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_sysctl.h)(0x4D4D7ED3) +I (.\..\Common\drivers\LuminaryMicro\hw_types.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\debug.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\gpio.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\ssi.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\sysctl.h)(0x4D4D7ED3) +I (osram128x64x4.h)(0x4A8A84A4) +F (.\webserver\uIP_Task.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\uip_task.o" --omf_browse ".\rvmdk\uip_task.crf" --depend ".\rvmdk\uip_task.d") +I (C:\Keil\ARM\RV31\INC\string.h)(0x4D46C1D6) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (..\..\Source\include\semphr.h)(0x4E78C6B7) +I (..\..\Source\include\queue.h)(0x4E78C6B7) +I (.\..\Common\drivers\LuminaryMicro\hw_types.h)(0x4A8A85D4) +I (..\Common\ethernet\uIP\uip-1.0\uip\uip.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\uipopt.h)(0x4A8A85F4) +I (.\webserver\uip-conf.h)(0x4A8A84A2) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4D46C1D4) +I (.\webserver\webserver.h)(0x4A8A84A2) +I (.\webserver\httpd.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\psock.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\pt.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc-switch.h)(0x4A8A85F4) +I (.\webserver\httpd-fs.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.h)(0x4A8A85F4) +I (.\..\Common\drivers\LuminaryMicro\timer.h)(0x4A8A85D4) +I (webserver\clock-arch.h)(0x4A8A84A2) +I (.\..\Common\drivers\LuminaryMicro\hw_ethernet.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\ethernet.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\sysctl.h)(0x4D4D7ED3) +I (.\..\Common\drivers\LuminaryMicro\hw_memmap.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\lmi_flash.h)(0x4A8A85D4) +I (webserver\emac.h)(0x4A8A84A2) +I (..\Common\include\partest.h)(0x4E78C6B7) +I (.\lcd_message.h)(0x4A8A84A4) +F (.\webserver\emac.c)(0x4E78C6B6)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\emac.o" --omf_browse ".\rvmdk\emac.crf" --depend ".\rvmdk\emac.d") +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\..\Source\include\semphr.h)(0x4E78C6B7) +I (..\..\Source\include\queue.h)(0x4E78C6B7) +I (..\..\Source\include\task.h)(0x4E78C6B7) +I (..\..\Source\include\list.h)(0x4E78C6B7) +I (webserver\emac.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\uip.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\uipopt.h)(0x4A8A85F4) +I (.\webserver\uip-conf.h)(0x4A8A84A2) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4D46C1D4) +I (.\webserver\webserver.h)(0x4A8A84A2) +I (.\webserver\httpd.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\psock.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\pt.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc-switch.h)(0x4A8A85F4) +I (.\webserver\httpd-fs.h)(0x4A8A84A2) +I (.\..\Common\drivers\LuminaryMicro\hw_types.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_memmap.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_ints.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\hw_ethernet.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\ethernet.h)(0x4A8A85D4) +I (.\..\Common\drivers\LuminaryMicro\sysctl.h)(0x4D4D7ED3) +I (.\..\Common\drivers\LuminaryMicro\interrupt.h)(0x4A8A85D4) +F (.\webserver\httpd.c)(0x4A8A84A2)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\httpd.o" --omf_browse ".\rvmdk\httpd.crf" --depend ".\rvmdk\httpd.d") +I (..\Common\ethernet\uIP\uip-1.0\uip\uip.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\uipopt.h)(0x4A8A85F4) +I (.\webserver\uip-conf.h)(0x4A8A84A2) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4D46C1D4) +I (.\webserver\webserver.h)(0x4A8A84A2) +I (.\webserver\httpd.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\psock.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\pt.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc-switch.h)(0x4A8A85F4) +I (.\webserver\httpd-fs.h)(0x4A8A84A2) +I (webserver\httpd-cgi.h)(0x4A8A84A4) +I (webserver\http-strings.h)(0x4A8A84A2) +I (C:\Keil\ARM\RV31\INC\string.h)(0x4D46C1D6) +F (.\webserver\httpd-cgi.c)(0x4A8A84A2)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\httpd-cgi.o" --omf_browse ".\rvmdk\httpd-cgi.crf" --depend ".\rvmdk\httpd-cgi.d") +I (..\Common\ethernet\uIP\uip-1.0\uip\uip.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\uipopt.h)(0x4A8A85F4) +I (.\webserver\uip-conf.h)(0x4A8A84A2) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4D46C1D4) +I (.\webserver\webserver.h)(0x4A8A84A2) +I (.\webserver\httpd.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\psock.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\pt.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc-switch.h)(0x4A8A85F4) +I (.\webserver\httpd-fs.h)(0x4A8A84A2) +I (webserver\httpd-cgi.h)(0x4A8A84A4) +I (C:\Keil\ARM\RV31\INC\stdio.h)(0x4D46C1D6) +I (C:\Keil\ARM\RV31\INC\string.h)(0x4D46C1D6) +F (.\webserver\httpd-fs.c)(0x4A8A84A4)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\httpd-fs.o" --omf_browse ".\rvmdk\httpd-fs.crf" --depend ".\rvmdk\httpd-fs.d") +I (webserver\httpd.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\psock.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\uipopt.h)(0x4A8A85F4) +I (.\webserver\uip-conf.h)(0x4A8A84A2) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4D46C1D4) +I (.\webserver\webserver.h)(0x4A8A84A2) +I (.\webserver\httpd.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\pt.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc-switch.h)(0x4A8A85F4) +I (webserver\httpd-fs.h)(0x4A8A84A2) +I (webserver\httpd-fsdata.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\uip.h)(0x4A8A85F4) +I (webserver\httpd-fsdata.c)(0x4A8A84A2) +F (.\webserver\http-strings.c)(0x4A8A84A2)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\http-strings.o" --omf_browse ".\rvmdk\http-strings.crf" --depend ".\rvmdk\http-strings.d") +F (..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c)(0x4A8A85F4)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\uip_arp.o" --omf_browse ".\rvmdk\uip_arp.crf" --depend ".\rvmdk\uip_arp.d") +I (..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\uip.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\uipopt.h)(0x4A8A85F4) +I (.\webserver\uip-conf.h)(0x4A8A84A2) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4D46C1D4) +I (.\webserver\webserver.h)(0x4A8A84A2) +I (.\webserver\httpd.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\psock.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\pt.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc-switch.h)(0x4A8A85F4) +I (.\webserver\httpd-fs.h)(0x4A8A84A2) +I (C:\Keil\ARM\RV31\INC\string.h)(0x4D46C1D6) +F (..\Common\ethernet\uIP\uip-1.0\uip\psock.c)(0x4A8A85F4)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\psock.o" --omf_browse ".\rvmdk\psock.crf" --depend ".\rvmdk\psock.d") +I (C:\Keil\ARM\RV31\INC\stdio.h)(0x4D46C1D6) +I (C:\Keil\ARM\RV31\INC\string.h)(0x4D46C1D6) +I (..\Common\ethernet\uIP\uip-1.0\uip\uipopt.h)(0x4A8A85F4) +I (.\webserver\uip-conf.h)(0x4A8A84A2) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4D46C1D4) +I (.\webserver\webserver.h)(0x4A8A84A2) +I (.\webserver\httpd.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\psock.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\pt.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc-switch.h)(0x4A8A85F4) +I (.\webserver\httpd-fs.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\uip.h)(0x4A8A85F4) +F (..\Common\ethernet\uIP\uip-1.0\uip\timer.c)(0x4A8A85F4)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\timer.o" --omf_browse ".\rvmdk\timer.crf" --depend ".\rvmdk\timer.d") +I (..\Common\ethernet\uIP\uip-1.0\uip\clock.h)(0x4A8A85F4) +I (.\webserver\clock-arch.h)(0x4A8A84A2) +I (..\..\Source\include\FreeRTOS.h)(0x4E78C6B7) +I (C:\Keil\ARM\RV31\INC\stddef.h)(0x4D4262DE) +I (..\..\Source\include\projdefs.h)(0x4E78C6B7) +I (.\FreeRTOSConfig.h)(0x4E78C6B7) +I (..\..\Source\include\portable.h)(0x4E78C6B7) +I (..\..\Source\include\../../Source/portable/RVDS/ARM_CM3/portmacro.h)(0x4E78C6B7) +I (..\..\Source\include\mpu_wrappers.h)(0x4E78C6B7) +I (..\Common\ethernet\uIP\uip-1.0\uip\timer.h)(0x4A8A85F4) +F (..\Common\ethernet\uIP\uip-1.0\uip\uip.c)(0x4A8A85F4)(-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\uip.o" --omf_browse ".\rvmdk\uip.crf" --depend ".\rvmdk\uip.d") +I (..\Common\ethernet\uIP\uip-1.0\uip\uip.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\uipopt.h)(0x4A8A85F4) +I (.\webserver\uip-conf.h)(0x4A8A84A2) +I (C:\Keil\ARM\RV31\INC\stdint.h)(0x4D46C1D4) +I (.\webserver\webserver.h)(0x4A8A84A2) +I (.\webserver\httpd.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\psock.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\pt.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc.h)(0x4A8A85F4) +I (..\Common\ethernet\uIP\uip-1.0\uip\lc-switch.h)(0x4A8A85F4) +I (.\webserver\httpd-fs.h)(0x4A8A84A2) +I (..\Common\ethernet\uIP\uip-1.0\uip\uip_arch.h)(0x4A8A85F4) +I (C:\Keil\ARM\RV31\INC\string.h)(0x4D46C1D6) diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo_uvopt.bak b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo_uvopt.bak new file mode 100644 index 0000000..fd8e2b8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/RTOSDemo_uvopt.bak @@ -0,0 +1,823 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + FreeRTOS_Demo + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\rvmdk\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\Luminary\LM3S8962.PDF + + + + SARMCM3.DLL + + DLM.DLL + -pLM3S8962 + SARMCM3.DLL + + TLM.DLL + -pLM3S8962 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 0 + 5 + + + + + + + + + + + BIN\lmidk-agdi.dll + + + + 0 + DLGUARM + + + 0 + UL2CM3 + -UU0101L5E -O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_256 -FS00 -FL040000 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)(103=-1,-1,-1,-1,0)(104=-1,-1,-1,-1,0)(105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(163=-1,-1,-1,-1,0)(164=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1013=-1,-1,-1,-1,0)(171=-1,-1,-1,-1,0)(172=-1,-1,-1,-1,0)(173=-1,-1,-1,-1,0)(1014=-1,-1,-1,-1,0)(1016=-1,-1,-1,-1,0)(136=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + lmidk-agdi + -U063107FEA -O1536 -S3 -FO29 + + + + + 1 + 2 + 0 + + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + Demo_Source + 1 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\BlockQ.c + BlockQ.c + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\blocktim.c + blocktim.c + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\death.c + death.c + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\integer.c + integer.c + + + 1 + 5 + 1 + 0 + 0 + 33 + 0 + 97 + 101 + 0 + .\main.c + main.c + + 44 + 0 + 1 + + -1 + -1 + + + -4 + -24 + + + 115 + 110 + 1016 + 534 + + + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\ParTest\ParTest.c + ParTest.c + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\PollQ.c + PollQ.c + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\semtest.c + semtest.c + + + 1 + 9 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\startup_rvmdk.S + startup_rvmdk.S + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\timertest.c + timertest.c + + + 1 + 11 + 5 + 0 + 0 + 55 + 0 + 0 + 0 + 0 + .\FreeRTOSConfig.h + FreeRTOSConfig.h + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\GenQTest.c + GenQTest.c + + + 1 + 13 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\QPeek.c + QPeek.c + + + 1 + 14 + 1 + 0 + 0 + 43 + 0 + 83 + 83 + 0 + .\IntQueueTimer.c + IntQueueTimer.c + + 44 + 0 + 1 + + -1 + -1 + + + -4 + -24 + + + 46 + 44 + 939 + 449 + + + + + 1 + 15 + 1 + 0 + 1 + 2 + 0 + 628 + 653 + 0 + ..\Common\Minimal\IntQueue.c + IntQueue.c + + 44 + 2 + 3 + + -1 + -1 + + + -4 + -24 + + + 69 + 66 + 961 + 472 + + + + + 1 + 16 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\Minimal\recmutex.c + recmutex.c + + + + + Libraries + 1 + 0 + 0 + + 2 + 17 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\rit128x96x4.c + rit128x96x4.c + + + 2 + 19 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\drivers\LuminaryMicro\Keil\driverlib.lib + driverlib.lib + + + 2 + 20 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\formike128x128x16.c + formike128x128x16.c + + + 2 + 21 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\drivers\LuminaryMicro\Keil\grlib.lib + grlib.lib + + + + + RTOS_Source + 1 + 0 + 0 + + 3 + 22 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\Source\tasks.c + tasks.c + + + 3 + 23 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\Source\list.c + list.c + + + 3 + 24 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\Source\queue.c + queue.c + + + 3 + 25 + 1 + 0 + 0 + 0 + 0 + 122 + 122 + 0 + ..\..\Source\portable\RVDS\ARM_CM3\port.c + port.c + + 44 + 0 + 1 + + -1 + -1 + + + -4 + -24 + + + 23 + 22 + 1197 + 426 + + + + + 3 + 26 + 1 + 0 + 0 + 36 + 0 + 1 + 18 + 0 + ..\..\Source\portable\MemMang\heap_2.c + heap_2.c + + + 3 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\osram128x64x4.c + osram128x64x4.c + + + + + uIP_Source + 0 + 0 + 0 + + 4 + 27 + 1 + 0 + 0 + 49 + 0 + 0 + 0 + 0 + .\webserver\uIP_Task.c + uIP_Task.c + + + 4 + 28 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\webserver\emac.c + emac.c + + + 4 + 29 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\webserver\httpd.c + httpd.c + + + 4 + 30 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\webserver\httpd-cgi.c + httpd-cgi.c + + + 4 + 31 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\webserver\httpd-fs.c + httpd-fs.c + + + 4 + 32 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + .\webserver\http-strings.c + http-strings.c + + + 4 + 33 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c + uip_arp.c + + + 4 + 34 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\ethernet\uIP\uip-1.0\uip\psock.c + psock.c + + + 4 + 35 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\ethernet\uIP\uip-1.0\uip\timer.c + timer.c + + + 4 + 36 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\Common\ethernet\uIP\uip-1.0\uip\uip.c + uip.c + + + + + 1 + 0 + + 100 + 1 + + + .\main.c + 33 + 97 + 101 + + + ..\..\Source\portable\MemMang\heap_2.c + 36 + 1 + 18 + + + + + +
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/bitmap.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/bitmap.h new file mode 100644 index 0000000..29f813f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/bitmap.h @@ -0,0 +1,336 @@ +#ifndef BITMAP_H +#define BITMAP_H + +#define bmpBITMAP_HEIGHT 50 +#define bmpBITMAP_WIDTH 128 + +const unsigned char pucBasicBitmap[] = +{ +0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, +0x00, 0x8f, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xf0, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, +0x00, 0x70, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0x87, 0x77, +0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x88, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0x80, 0x00, 0x8f, 0x8f, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x8f, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, +0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x08, 0x00, 0x88, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x70, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, +0x88, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x7f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf7, 0x88, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, +0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x88, 0x88, 0x88, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, +0x00, 0x00, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x07, 0xff, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, +0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x77, +0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x07, 0x70, 0x07, +0x88, 0x88, 0x88, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x00, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, +0x00 }; + +const unsigned char pucGrLibBitmap[] = +{ + IMAGE_FMT_4BPP_COMP, + 124, 0, + 49, 0, + + 15, + 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x00, + 0x20, 0x44, 0x20, + 0x00, 0x75, 0x00, + 0x69, 0x69, 0x69, + 0x00, 0xc2, 0x00, + 0x00, 0xd2, 0x00, + 0x38, 0xb6, 0x38, + 0x00, 0xea, 0x00, + 0x00, 0xf2, 0x00, + 0xaa, 0xb2, 0xaa, + 0x65, 0xff, 0x65, + 0x69, 0xff, 0x69, + 0x6d, 0xff, 0x6d, + 0x71, 0xff, 0x71, + 0xff, 0xff, 0xff, + + 0x03, 0x21, 0x33, 0x53, 0x33, 0x33, 0x33, 0xe9, 0xd4, 0xf8, 0xa7, 0x5f, + 0x17, 0x07, 0x06, 0x35, 0x33, 0x12, 0x03, 0x23, 0x96, 0x68, 0x88, 0x88, + 0x88, 0xe9, 0xd4, 0xf8, 0xa7, 0x5f, 0x17, 0x07, 0x06, 0x86, 0x69, 0x32, + 0x03, 0x29, 0x66, 0x65, 0x66, 0x66, 0x66, 0xe9, 0xd4, 0xf8, 0xa7, 0x5f, + 0x17, 0x07, 0x06, 0x56, 0x66, 0x92, 0x07, 0x78, 0x63, 0x11, 0x11, 0x11, + 0xe9, 0xd4, 0xa7, 0xf0, 0x5f, 0x17, 0x07, 0x07, 0x11, 0x36, 0x87, 0x78, + 0x0f, 0x63, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xe0, 0x17, 0x07, + 0x07, 0x00, 0x36, 0x87, 0x78, 0x63, 0xfe, 0x07, 0x07, 0x77, 0x2f, 0x07, + 0x07, 0x02, 0x36, 0x1e, 0x87, 0x78, 0x63, 0x07, 0x07, 0x77, 0x2f, 0x00, + 0x10, 0x01, 0x22, 0x20, 0x07, 0x00, 0x00, 0x22, 0x21, 0x84, 0x03, 0x36, + 0x87, 0x78, 0x63, 0x02, 0x02, 0xaa, 0x01, 0xa2, 0x22, 0x20, 0x02, 0x77, + 0x77, 0x77, 0xe9, 0x3a, 0x22, 0x22, 0x7a, 0xa4, 0x71, 0x20, 0x0a, 0x27, + 0xb8, 0x29, 0x72, 0xb2, 0x9e, 0x93, 0x36, 0x87, 0x78, 0x40, 0x63, 0x62, + 0x2a, 0xff, 0xf2, 0xaa, 0x40, 0x07, 0x08, 0xad, 0xdd, 0xdd, 0xdd, 0xe9, + 0xd7, 0x72, 0x00, 0x40, 0x00, 0xa6, 0xdd, 0xda, 0x70, 0x00, 0x00, 0x02, + 0x00, 0x77, 0xdd, 0xdc, 0xcc, 0xcd, 0xde, 0xc7, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x27, 0xde, 0xdc, 0x08, 0xcc, 0xcc, 0xdd, 0xea, 0x99, + 0x36, 0x87, 0x78, 0x40, 0x63, 0x69, 0x02, 0xaf, 0xaa, 0xf2, 0x2f, 0xa0, + 0x04, 0x02, 0xdb, 0xbb, 0xbb, 0xbb, 0xe9, 0xbc, 0xe7, 0x10, 0x20, 0x00, + 0x07, 0xa5, 0xbb, 0xbd, 0x70, 0x00, 0x10, 0x00, 0x27, 0xec, 0x3b, 0xcd, + 0xd7, 0x00, 0x00, 0x80, 0x9f, 0xbd, 0x20, 0x00, 0x00, 0x36, 0x87, 0x78, + 0x40, 0x63, 0x69, 0x02, 0xfa, 0x2a, 0xf2, 0x2f, 0xa0, 0x31, 0x02, 0xdb, + 0x43, 0x31, 0x42, 0x00, 0x07, 0xa7, 0x0a, 0x70, 0x00, 0x02, 0xdd, 0x41, + 0xcc, 0x21, 0xce, 0x04, 0x70, 0x00, 0x00, 0x02, 0x7d, 0x39, 0xbc, 0xcb, + 0x00, 0xbb, 0xbd, 0x20, 0x00, 0x00, 0x36, 0x87, 0x78, 0x20, 0x63, 0x00, + 0x69, 0xfa, 0x0a, 0xf2, 0x2f, 0xa0, 0x01, 0x02, 0xdb, 0xbb, 0xbb, 0xdd, + 0xdd, 0xdc, 0x11, 0x08, 0xe7, 0x00, 0x07, 0xad, 0xbb, 0xcd, 0xdd, 0xda, + 0x09, 0x70, 0x00, 0x2d, 0xcb, 0x41, 0xcc, 0xdd, 0xd1, 0x04, 0xe7, 0x00, + 0x00, 0x07, 0xeb, 0x51, 0xdc, 0xcd, 0x00, 0xdd, 0xdd, 0x20, 0x00, 0x00, + 0x36, 0x87, 0x78, 0x00, 0x63, 0x00, 0x00, 0x00, 0x02, 0xfa, 0x2a, 0xf2, + 0x00, 0xaf, 0xa0, 0x02, 0xdb, 0xbb, 0xbd, 0x72, 0x22, 0x00, 0x77, 0xdc, + 0xbb, 0xbb, 0xc7, 0x20, 0x07, 0x77, 0x04, 0x77, 0x77, 0xcb, 0xbb, 0xbc, + 0xd1, 0x20, 0x01, 0x28, 0x7d, 0xbb, 0x42, 0x27, 0x41, 0xcd, 0x20, 0x00, + 0x40, 0x27, 0x51, 0x72, 0x22, 0x22, 0x27, 0x7c, 0x20, 0x00, 0x00, 0x00, + 0x36, 0x87, 0x78, 0x63, 0x00, 0x00, 0x00, 0x00, 0x02, 0xaf, 0xaa, 0xfa, + 0xff, 0x20, 0x02, 0x10, 0xdb, 0xbb, 0xbe, 0x61, 0x2d, 0xbb, 0xbb, 0xcc, + 0xa8, 0x29, 0x00, 0x89, 0xbd, 0xc3, 0xeb, 0xbb, 0xbb, 0x00, 0xd7, 0x10, + 0x00, 0x00, 0x2c, 0xcb, 0xbb, 0xbd, 0x58, 0x70, 0x12, 0xc7, 0x13, 0x29, + 0x36, 0x87, 0x78, 0x40, 0x63, 0xa9, 0x00, 0xaf, 0xff, 0xff, 0xfa, 0x20, + 0x08, 0x02, 0xdb, 0xbb, 0xbd, 0x39, 0x07, 0xdb, 0xbb, 0x72, 0xcc, 0x03, + 0x8c, 0x82, 0xbd, 0x70, 0x84, 0xbc, 0x03, 0xd2, 0x00, 0x2d, 0xbb, 0xbb, + 0xd7, 0x19, 0x01, 0x02, 0x00, 0x00, 0x36, 0x87, 0x78, 0x63, 0xa2, 0x0a, + 0x10, 0xaf, 0xff, 0xa2, 0x0a, 0xbd, 0x20, 0x00, 0x00, 0x0c, 0x07, 0xdb, + 0xbb, 0xc7, 0xc9, 0x8e, 0x00, 0x2c, 0x40, 0xcb, 0xc4, 0x00, 0x7c, 0xbb, + 0xbb, 0xe7, 0x00, 0x06, 0x2d, 0xbb, 0xbb, 0xc7, 0x10, 0x92, 0x31, 0x36, + 0x10, 0x87, 0x78, 0x63, 0xab, 0x22, 0x22, 0x00, 0x00, 0x00, 0x02, 0xdb, + 0xbb, 0xbd, 0x20, 0x00, 0x00, 0x07, 0x18, 0xcb, 0xbb, 0xd7, 0x0a, 0x8d, + 0x00, 0x2d, 0xbb, 0x23, 0xbb, 0xc7, 0x82, 0x00, 0x2e, 0xbb, 0x39, 0x91, + 0x20, 0xbd, 0x72, 0x8b, 0x00, 0x00, 0x36, 0x87, 0x78, 0x48, 0x63, 0x33, + 0x02, 0x20, 0xe1, 0xdb, 0xbb, 0xbd, 0x01, 0x20, 0x00, 0x02, 0x7d, 0xbb, + 0xbb, 0xe2, 0x6b, 0x94, 0x8b, 0x00, 0x00, 0x81, 0xd7, 0x82, 0x00, 0x2d, + 0x00, 0xbb, 0xbb, 0xc7, 0x20, 0x2c, 0xcb, 0xbb, 0xbb, 0x10, 0xdd, 0x77, + 0x22, 0x7b, 0x36, 0x87, 0x78, 0x63, 0x80, 0x32, 0x02, 0xaa, 0xf2, 0x22, + 0x20, 0x02, 0xdb, 0x00, 0xbb, 0xbc, 0x77, 0x77, 0x77, 0xdb, 0xbb, 0xce, + 0x42, 0x71, 0x63, 0xdb, 0xbb, 0xbd, 0x20, 0x19, 0x7d, 0x10, 0xbb, 0xbb, + 0xd2, 0x82, 0x00, 0x27, 0xcb, 0xbb, 0x00, 0xc7, 0x20, 0x07, 0xeb, 0xbb, + 0xbb, 0xbb, 0xcd, 0x21, 0xd7, 0x72, 0x72, 0x36, 0x87, 0x78, 0x63, 0x32, + 0x01, 0x4f, 0xff, 0xf2, 0xaf, 0xa0, 0x02, 0xdb, 0x41, 0x03, 0xdd, 0xdc, + 0xbb, 0xbc, 0xd7, 0x20, 0x22, 0x89, 0x42, 0xbd, 0xba, 0x7d, 0xbb, 0xbb, + 0xd2, 0x82, 0x00, 0x02, 0x27, 0xcb, 0xbb, 0xcc, 0x20, 0x02, 0x89, 0xbb, + 0x08, 0xbb, 0xbc, 0xdd, 0x72, 0x31, 0x36, 0x87, 0x78, 0x40, 0x63, 0x31, + 0x02, 0xaf, 0xaa, 0xf2, 0x2f, 0xa0, 0x21, 0x02, 0xdb, 0x3a, 0xbb, 0xbb, + 0xc7, 0x20, 0x31, 0x88, 0x59, 0xdb, 0xbb, 0xbd, 0xb2, 0x7d, 0xbb, 0xbb, + 0x40, 0xd2, 0x7b, 0x27, 0xcb, 0xbb, 0xcc, 0x20, 0x00, 0x00, 0x27, 0xec, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xe7, 0x84, 0x29, 0x36, 0x87, 0x78, 0x63, + 0x31, 0x02, 0xfa, 0x02, 0x0a, 0xf2, 0x2f, 0xa0, 0x02, 0xdb, 0x42, 0xbb, + 0x31, 0xbb, 0xc7, 0x39, 0x5a, 0xdb, 0xbb, 0xbd, 0xb2, 0x08, 0x7d, 0xbb, + 0xbb, 0xd2, 0x7b, 0x27, 0xcb, 0xbb, 0x00, 0xcc, 0x20, 0x00, 0x02, 0x77, + 0xed, 0xcb, 0xbb, 0x00, 0xbb, 0xbb, 0xbd, 0x71, 0x00, 0x00, 0x36, 0x87, + 0x20, 0x78, 0x63, 0x31, 0x02, 0xfa, 0x0a, 0xf2, 0x2f, 0x00, 0xa0, 0x02, + 0xdb, 0xbb, 0xbb, 0xcd, 0xdd, 0xcb, 0x18, 0xbb, 0xbc, 0xe2, 0x69, 0x59, + 0xdb, 0xbb, 0xbd, 0x42, 0x20, 0x19, 0x7d, 0xbb, 0xbb, 0xd2, 0x7b, 0x27, + 0x10, 0xcb, 0xbb, 0xcb, 0x79, 0x02, 0x27, 0x7d, 0xdc, 0x00, 0xbb, 0xbb, + 0xbb, 0xe2, 0x00, 0x00, 0x36, 0x87, 0x20, 0x78, 0x63, 0x31, 0x02, 0xfa, + 0x2a, 0xf2, 0xaf, 0x00, 0xa0, 0x02, 0xdb, 0xbb, 0xbd, 0x72, 0x27, 0x4c, + 0x1d, 0xbb, 0xbb, 0xd7, 0x69, 0x59, 0x89, 0x20, 0x19, 0x42, 0x7d, 0x7e, + 0x2c, 0xbb, 0xbb, 0xc7, 0x7a, 0x00, 0x10, 0x22, 0x7c, 0xcb, 0x63, 0x36, + 0x87, 0x78, 0x63, 0x80, 0x31, 0x02, 0xaf, 0xfa, 0xff, 0xff, 0x20, 0x02, + 0x00, 0xdb, 0xbb, 0xbd, 0x20, 0x00, 0x2c, 0xcb, 0xbb, 0x28, 0xcb, 0x20, + 0x61, 0x00, 0x8c, 0x00, 0x00, 0x2d, 0x12, 0xbb, 0xbb, 0xd7, 0x82, 0x00, + 0x2e, 0xbe, 0x00, 0x21, 0x02, 0x7c, 0x63, 0x36, 0x87, 0x78, 0x63, 0x32, + 0x00, 0x2f, 0xff, 0xff, 0xfa, 0x00, 0x02, 0xdb, 0xbb, 0x00, 0xbd, 0x20, + 0x00, 0x07, 0xdb, 0xbb, 0xbe, 0x20, 0xc2, 0x62, 0x8c, 0x00, 0x00, 0x2c, + 0xcb, 0xc4, 0x00, 0x0c, 0x7d, 0xbb, 0xbb, 0xe7, 0x3a, 0x19, 0x2d, 0xbb, + 0x00, 0xbb, 0xc7, 0x00, 0x00, 0x36, 0x87, 0x78, 0x63, 0x80, 0x3a, 0x02, + 0xaa, 0xaa, 0x40, 0x00, 0x02, 0xdb, 0x00, 0xbb, 0xbd, 0x20, 0x00, 0x02, + 0xcc, 0xbb, 0xbd, 0x63, 0x70, 0x63, 0x8b, 0x00, 0x00, 0x07, 0x49, 0x7a, + 0x98, 0x09, 0xbb, 0xd2, 0x3a, 0x19, 0x2d, 0xbb, 0xbb, 0x01, 0xd7, 0x00, + 0x00, 0x36, 0x87, 0x78, 0x63, 0x3a, 0x14, 0xaa, 0x22, 0x20, 0x0b, 0xbd, + 0xc9, 0x7d, 0xbb, 0x30, 0xbb, 0xd2, 0x61, 0x8e, 0x00, 0x02, 0xeb, 0xbb, + 0x20, 0xbb, 0xd7, 0x79, 0x27, 0xcb, 0xbb, 0xbd, 0x70, 0x24, 0x00, 0x02, + 0x6a, 0x00, 0x7d, 0x6b, 0x36, 0x87, 0x24, 0x78, 0x63, 0x39, 0x02, 0xff, + 0x62, 0x02, 0xdb, 0x21, 0xbb, 0xbd, 0x21, 0x2e, 0xbb, 0xbb, 0xe7, 0x61, + 0x80, 0x8e, 0x00, 0x02, 0x7d, 0xbb, 0xbb, 0xbd, 0x72, 0x00, 0x22, 0x27, + 0xcc, 0xbb, 0xbb, 0xcd, 0x20, 0x00, 0x08, 0x07, 0xe7, 0x72, 0x22, 0xa3, + 0xe2, 0x00, 0x00, 0x00, 0x36, 0x87, 0x78, 0x63, 0x00, 0x00, 0x00, 0x02, + 0x20, 0xaf, 0xa0, 0xd2, 0xdb, 0xbb, 0xbd, 0x20, 0x00, 0x03, 0x00, 0x2b, + 0xcb, 0xbb, 0xc7, 0x10, 0x8f, 0x11, 0x01, 0x2d, 0xcb, 0xbb, 0xbb, 0xdd, + 0xb7, 0xcd, 0xd1, 0x00, 0xe7, 0x00, 0x00, 0x07, 0xdc, 0xdd, 0xcb, 0x7b, + 0x00, 0xdd, 0xcb, 0xbb, 0xbc, 0x72, 0x00, 0x00, 0x36, 0x10, 0x87, 0x78, + 0x63, 0x01, 0x00, 0x2a, 0xfa, 0x42, 0x01, 0x22, 0x20, 0x02, 0xdb, 0xbb, + 0xbd, 0x20, 0x01, 0xb0, 0xcc, 0x00, 0x8d, 0xb9, 0xec, 0xbb, 0xbb, 0xbb, + 0x00, 0xcc, 0xcb, 0xbb, 0xbb, 0xbe, 0x71, 0x00, 0x00, 0x05, 0x27, 0xcb, + 0xbb, 0xcc, 0xcc, 0x81, 0xce, 0x29, 0x08, 0x36, 0x87, 0x78, 0x63, 0x02, + 0xaa, 0xff, 0xff, 0x02, 0xff, 0xa0, 0x02, 0xdb, 0xbb, 0xbd, 0x61, 0x02, + 0x0e, 0xeb, 0xbb, 0xbd, 0x70, 0x5a, 0x8c, 0x09, 0x27, 0x00, 0xec, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xd7, 0x54, 0x10, 0xa1, 0xcb, 0xa4, 0xd2, + 0x31, 0x36, 0x87, 0x20, 0x78, 0x63, 0x01, 0x02, 0xff, 0xff, 0xff, 0xff, + 0x02, 0xa0, 0x07, 0xad, 0xdd, 0xda, 0x20, 0x99, 0xde, 0x1c, 0xdd, 0xde, + 0xc2, 0x21, 0x8d, 0x0a, 0x7c, 0xed, 0x04, 0xcc, 0xcc, 0xcc, 0xde, 0xd7, + 0x92, 0x2c, 0xed, 0x40, 0xdc, 0xa7, 0x36, 0x87, 0x78, 0x63, 0x00, 0x02, + 0x00, 0x22, 0x02, 0xaa, 0xaa, 0xaa, 0xaa, 0x20, 0x02, 0x1b, 0x77, 0x77, + 0x77, 0x5a, 0xc9, 0x72, 0x21, 0x8e, 0x88, 0xaa, 0x27, 0x77, 0x7b, 0x9d, + 0x12, 0x27, 0x77, 0x20, 0x77, 0xb7, 0x3d, 0x36, 0x87, 0x78, 0x63, 0x00, + 0x3e, 0x02, 0xaa, 0x43, 0x22, 0xc6, 0x87, 0x3e, 0x12, 0x21, 0x22, 0x22, + 0x06, 0x01, 0x22, 0x22, 0x21, 0x04, 0x00, 0x36, 0x87, 0x78, 0x63, 0x00, + 0x02, 0xfa, 0x22, 0x3f, 0xaa, 0x20, 0x26, 0xc6, 0x87, 0x3f, 0x07, 0x07, + 0x00, 0x36, 0x87, 0x78, 0x63, 0x00, 0x02, 0xfa, 0x02, 0x7e, 0xff, 0x07, + 0x07, 0x77, 0x2f, 0x07, 0x06, 0x36, 0x00, 0x87, 0x78, 0x63, 0x00, 0x02, + 0xff, 0xaa, 0xfa, 0x07, 0x44, 0x44, 0x44, 0x20, 0x02, 0xd9, 0xc1, 0xd4, + 0xf0, 0xa7, 0x5f, 0x17, 0x04, 0x42, 0x00, 0x00, 0x36, 0x00, 0x87, 0x78, + 0x63, 0x00, 0x02, 0xff, 0xff, 0xff, 0x9f, 0xe9, 0xa0, 0x0a, 0xc4, 0x94, + 0xa7, 0x5f, 0x17, 0x80, 0x04, 0xfa, 0x20, 0x00, 0x36, 0x87, 0x78, 0x63, + 0x13, 0x00, 0x00, 0xaf, 0x03, 0xa0, 0x0a, 0x07, 0xbf, 0xe0, 0x77, 0x2f, + 0x07, 0xfa, 0x20, 0x00, 0x36, 0x87, 0x00, 0x78, 0x63, 0x00, 0x00, 0x02, + 0xaa, 0xfa, 0xaa, 0x0f, 0xaa, 0xaa, 0x20, 0x02, 0xd9, 0xc1, 0xd4, 0xa7, + 0xe0, 0x5f, 0x17, 0x05, 0x00, 0x00, 0x36, 0x87, 0x78, 0x03, 0x63, 0x00, + 0x00, 0x00, 0x02, 0xff, 0xd9, 0xc1, 0xfc, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0x03, 0x36, 0x87, 0x23, 0x78, 0x63, 0x01, 0x02, 0x44, 0x20, 0x07, 0x07, + 0xf0, 0x77, 0x2f, 0x07, 0x05, 0x36, 0x87, 0x78, 0x63, 0xfe, 0x07, 0x07, + 0x77, 0x2f, 0x07, 0x07, 0x02, 0x36, 0x1f, 0x87, 0x78, 0x63, 0x07, 0x07, + 0x77, 0x2f, 0x07, 0xc0, 0x07, 0x02, 0x36, 0x87, 0x78, 0x63, 0x11, 0x11, + 0x7f, 0x11, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x00, 0x11, 0x36, + 0x87, 0x29, 0x66, 0x55, 0x55, 0x55, 0xfe, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, + 0x07, 0x07, 0x55, 0x00, 0x66, 0x92, 0x23, 0x96, 0x68, 0x88, 0x88, 0x88, + 0xfe, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x06, 0x86, 0x01, 0x69, 0x32, + 0x21, 0x33, 0x55, 0x55, 0x55, 0xe9, 0xfc, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0x07, 0x55, 0x33, 0x00, 0x12, +}; + + +#endif diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/formike128x128x16.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/formike128x128x16.c new file mode 100644 index 0000000..188099a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/formike128x128x16.c @@ -0,0 +1,902 @@ +//***************************************************************************** +// +// formike128x128x16.c - Display driver for the Formike Electronic +// KWH015C04-F01 CSTN panel with an ST7637 controller. +// +// Copyright (c) 2008 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. You may not combine +// this software with "viral" open-source software in order to form a larger +// program. Any use in violation of the foregoing restrictions may subject +// the user to criminal sanctions under applicable laws, as well as to civil +// liability for the breach of the terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2523 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3s3748_api +//! @{ +// +//***************************************************************************** + +#include "hw_gpio.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "gpio.h" +#include "sysctl.h" +#include "rom.h" +#include "grlib.h" +#include "formike128x128x16.h" +#include + +//***************************************************************************** +// +// Defines for the pins that are used to communicate with the ST7637. +// +//***************************************************************************** +#define LCD_A0_BASE GPIO_PORTB_BASE +#define LCD_A0_PIN GPIO_PIN_2 +#define LCD_WR_BASE GPIO_PORTC_BASE +#define LCD_WR_PIN GPIO_PIN_4 +#define LCD_RD_BASE GPIO_PORTC_BASE +#define LCD_RD_PIN GPIO_PIN_5 +#define LCD_BL_BASE GPIO_PORTF_BASE +#define LCD_BL_PIN GPIO_PIN_1 +#define LCD_DATA_BASE GPIO_PORTG_BASE + +//***************************************************************************** +// +// Translates a 24-bit RGB color to a display driver-specific color. +// +// \param c is the 24-bit RGB color. The least-significant byte is the blue +// channel, the next byte is the green channel, and the third byte is the red +// channel. +// +// This macro translates a 24-bit RGB color into a value that can be written +// into the display's frame buffer in order to reproduce that color, or the +// closest possible approximation of that color. +// +// \return Returns the display-driver specific color. +// +//***************************************************************************** +#define DPYCOLORTRANSLATE(c) ((((c) & 0x00ff0000) >> 19) | \ + ((((c) & 0x0000ff00) >> 5) & 0x000007e0) | \ + ((((c) & 0x000000ff) << 8) & 0x0000f800)) + +//***************************************************************************** +// +// Writes a data word to the ST7637. +// +//***************************************************************************** +static void +WriteData(unsigned char ucData) +{ + // + // Write the data to the data bus. + // + HWREG(LCD_DATA_BASE + GPIO_O_DATA + (0xff << 2)) = ucData; + + // + // Assert the write enable signal. + // + HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0; + + // + // Deassert the write enable signal. + // + HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; +} + +//***************************************************************************** +// +// Writes a command to the ST7637. +// +//***************************************************************************** +static void +WriteCommand(unsigned char ucData) +{ + // + // Write the command to the data bus. + // + HWREG(LCD_DATA_BASE + GPIO_O_DATA + (0xff << 2)) = ucData; + + // + // Set the A0 signal low, indicating a command. + // + HWREG(LCD_A0_BASE + GPIO_O_DATA + (LCD_A0_PIN << 2)) = 0; + + // + // Assert the write enable signal. + // + HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0; + + // + // Deassert the write enable signal. + // + HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; + + // + // Set the A0 signal high, indicating that following writes are data. + // + HWREG(LCD_A0_BASE + GPIO_O_DATA + (LCD_A0_PIN << 2)) = LCD_A0_PIN; +} + +//***************************************************************************** +// +//! Initializes the display driver. +//! +//! This function initializes the ST7637 display controller on the panel, +//! preparing it to display data. +//! +//! \return None. +// +//***************************************************************************** +void +Formike128x128x16Init(void) +{ + unsigned long ulClockMS, ulCount; + + // + // Get the value to pass to SysCtlDelay() in order to delay for 1 ms. + // + ulClockMS = SysCtlClockGet() / (3 * 1000); + + // + // Enable the GPIO peripherals used to interface to the ST7637. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + + // + // Configure the pins that connect to the LCD as GPIO outputs. + // + GPIOPinTypeGPIOOutput(LCD_A0_BASE, LCD_A0_PIN); + GPIOPinTypeGPIOOutput(LCD_WR_BASE, LCD_WR_PIN); + GPIOPinTypeGPIOOutput(LCD_RD_BASE, LCD_RD_PIN); + GPIOPinTypeGPIOOutput(LCD_BL_BASE, LCD_BL_PIN); + GPIOPinTypeGPIOOutput(LCD_DATA_BASE, 0xff); + + // + // Set the LCD control pins to their default values. + // + GPIOPinWrite(LCD_A0_BASE, LCD_A0_PIN, LCD_A0_PIN); + GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN | LCD_RD_PIN, + LCD_WR_PIN | LCD_RD_PIN); + GPIOPinWrite(LCD_BL_BASE, LCD_BL_PIN, 0); + GPIOPinWrite(LCD_DATA_BASE, 0xff, 0x00); + + // + // Perform a software reset of the ST7637. + // + WriteCommand(0x01); + + // + // Delay for 120ms. + // + SysCtlDelay(ulClockMS * 120); + + // + // Disable auto-load of mask rom data. + // + WriteCommand(0xD7); + WriteData(0xBF); + + // + // Set the OTP control mode to read. + // + WriteCommand(0xE0); + WriteData(0x00); + + // + // Delay for 10ms. + // + SysCtlDelay(ulClockMS * 10); + + // + // Start the OTP read. + // + WriteCommand(0xE3); + + // + // Delay for 20ms. + // + SysCtlDelay(ulClockMS * 20); + + // + // Cancel the OTP read (it should have finished by now). + // + WriteCommand(0xE1); + + // + // Turn off the display. + // + WriteCommand(0x28); + + // + // Exit sleep mode. + // + WriteCommand(0x11); + + // + // Delay for 50ms. + // + SysCtlDelay(ulClockMS * 50); + + // + // Program the LCD supply voltage V0 to 14V. + // + WriteCommand(0xC0); + WriteData(0x04); + WriteData(0x01); + + // + // Select an LCD bias voltage ratio of 1/12. + // + WriteCommand(0xC3); + WriteData(0x00); + + // + // Enable the x8 booster circuit. + // + WriteCommand(0xC4); + WriteData(0x07); + + // + // Invert the column scan direction for the panel. + // + WriteCommand(0xB7); + WriteData(0xC0); + + // + // Select 16bpp, 5-6-5 data input mode. + // + WriteCommand(0x3A); + WriteData(0x05); + + // + // Select the memory scanning direction. The scanning mode does not matter + // for this driver since the row/column selects will constrain the writes + // to the desired area of the display. + // + WriteCommand(0x36); + WriteData(0x00); + + // + // Turn on the display. + // + WriteCommand(0x29); + + // + // Clear the contents of the display buffer. + // + WriteCommand(0x2A); + WriteData(0x00); + WriteData(0x7F); + WriteCommand(0x2B); + WriteData(0x01); + WriteData(0x80); + WriteCommand(0x2c); + for(ulCount = 0; ulCount < (128 * 128); ulCount++) + { + WriteData(0x00); + WriteData(0x00); + } + + // + // Enable normal operation of the LCD. + // + WriteCommand(0x13); +} + +//***************************************************************************** +// +//! Turns on the backlight. +//! +//! This function turns on the backlight on the display. +//! +//! \return None. +// +//***************************************************************************** +void +Formike128x128x16BacklightOn(void) +{ + // + // Assert the signal that turns on the backlight. + // + HWREG(LCD_BL_BASE + GPIO_O_DATA + (LCD_BL_PIN << 2)) = LCD_BL_PIN; +} + +//***************************************************************************** +// +//! Turns off the backlight. +//! +//! This function turns off the backlight on the display. +//! +//! \return None. +// +//***************************************************************************** +void +Formike128x128x16BacklightOff(void) +{ + // + // Deassert the signal that turns on the backlight. + // + HWREG(LCD_BL_BASE + GPIO_O_DATA + (LCD_BL_PIN << 2)) = 0; +} + +//***************************************************************************** +// +//! Draws a pixel on the screen. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param lX is the X coordinate of the pixel. +//! \param lY is the Y coordinate of the pixel. +//! \param ulValue is the color of the pixel. +//! +//! This function sets the given pixel to a particular color. The coordinates +//! of the pixel are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16PixelDraw(void *pvDisplayData, long lX, long lY, + unsigned long ulValue) +{ + // + // Set the X address of the display cursor. + // + WriteCommand(0x2a); + WriteData(lX); + WriteData(lX); + + // + // Set the Y address of the display cursor. + // + WriteCommand(0x2b); + WriteData(lY + 1); + WriteData(lY + 1); + + // + // Write the pixel value. + // + WriteCommand(0x2c); + WriteData(ulValue >> 8); + WriteData(ulValue); +} + +//***************************************************************************** +// +//! Draws a horizontal sequence of pixels on the screen. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param lX is the X coordinate of the first pixel. +//! \param lY is the Y coordinate of the first pixel. +//! \param lX0 is sub-pixel offset within the pixel data, which is valid for 1 +//! or 4 bit per pixel formats. +//! \param lCount is the number of pixels to draw. +//! \param lBPP is the number of bits per pixel; must be 1, 4, or 8. +//! \param pucData is a pointer to the pixel data. For 1 and 4 bit per pixel +//! formats, the most significant bit(s) represent the left-most pixel. +//! \param pucPalette is a pointer to the palette used to draw the pixels. +//! +//! This function draws a horizontal sequence of pixels on the screen, using +//! the supplied palette. For 1 bit per pixel format, the palette contains +//! pre-translated colors; for 4 and 8 bit per pixel formats, the palette +//! contains 24-bit RGB values that must be translated before being written to +//! the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16PixelDrawMultiple(void *pvDisplayData, long lX, long lY, + long lX0, long lCount, long lBPP, + const unsigned char *pucData, + const unsigned char *pucPalette) +{ + unsigned long ulByte; + + // + // Set the extent of the line along the X axis. + // + WriteCommand(0x2a); + WriteData(lX); + WriteData(lX + lCount - 1); + + // + // Set the Y address of the display cursor. + // + WriteCommand(0x2b); + WriteData(lY + 1); + WriteData(lY + 1); + + // + // Write the data RAM write command. + // + WriteCommand(0x2c); + + // + // Determine how to interpret the pixel data based on the number of bits + // per pixel. + // + switch(lBPP) + { + // + // The pixel data is in 1 bit per pixel format. + // + case 1: + { + // + // Loop while there are more pixels to draw. + // + while(lCount) + { + // + // Get the next byte of image data. + // + ulByte = *pucData++; + + // + // Loop through the pixels in this byte of image data. + // + for(; (lX0 < 8) && lCount; lX0++, lCount--) + { + // + // Draw this pixel in the appropriate color. + // + lBPP = ((unsigned long *)pucPalette)[(ulByte >> + (7 - lX0)) & 1]; + WriteData(lBPP >> 8); + WriteData(lBPP); + } + + // + // Start at the beginning of the next byte of image data. + // + lX0 = 0; + } + + // + // The image data has been drawn. + // + break; + } + + // + // The pixel data is in 4 bit per pixel format. + // + case 4: + { + // + // Loop while there are more pixels to draw. "Duff's device" is + // used to jump into the middle of the loop if the first nibble of + // the pixel data should not be used. Duff's device makes use of + // the fact that a case statement is legal anywhere within a + // sub-block of a switch statement. See + // http://en.wikipedia.org/wiki/Duff's_device for detailed + // information about Duff's device. + // + switch(lX0 & 1) + { + case 0: + while(lCount) + { + // + // Get the upper nibble of the next byte of pixel data + // and extract the corresponding entry from the + // palette. + // + ulByte = (*pucData >> 4) * 3; + ulByte = (*(unsigned long *)(pucPalette + ulByte) & + 0x00ffffff); + + // + // Translate this palette entry and write it to the + // screen. + // + ulByte = DPYCOLORTRANSLATE(ulByte); + WriteData(ulByte >> 8); + WriteData(ulByte); + + // + // Decrement the count of pixels to draw. + // + lCount--; + + // + // See if there is another pixel to draw. + // + if(lCount) + { + case 1: + // + // Get the lower nibble of the next byte of pixel + // data and extract the corresponding entry from + // the palette. + // + ulByte = (*pucData++ & 15) * 3; + ulByte = (*(unsigned long *)(pucPalette + ulByte) & + 0x00ffffff); + + // + // Translate this palette entry and write it to the + // screen. + // + ulByte = DPYCOLORTRANSLATE(ulByte); + WriteData(ulByte >> 8); + WriteData(ulByte); + + // + // Decrement the count of pixels to draw. + // + lCount--; + } + } + } + + // + // The image data has been drawn. + // + break; + } + + // + // The pixel data is in 8 bit per pixel format. + // + case 8: + { + // + // Loop while there are more pixels to draw. + // + while(lCount--) + { + // + // Get the next byte of pixel data and extract the + // corresponding entry from the palette. + // + ulByte = *pucData++ * 3; + ulByte = *(unsigned long *)(pucPalette + ulByte) & 0x00ffffff; + + // + // Translate this palette entry and write it to the screen. + // + ulByte = DPYCOLORTRANSLATE(ulByte); + WriteData(ulByte >> 8); + WriteData(ulByte); + } + + // + // The image data has been drawn. + // + break; + } + } +} + +//***************************************************************************** +// +//! Flushes any cached drawing operations. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! +//! This functions flushes any cached drawing operations to the display. This +//! is useful when a local frame buffer is used for drawing operations, and the +//! flush would copy the local frame buffer to the display. For the ST7637 +//! driver, the flush is a no operation. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16Flush(void *pvDisplayData) +{ + // + // There is nothing to be done. + // +} + +//***************************************************************************** +// +//! Draws a horizontal line. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param lX1 is the X coordinate of the start of the line. +//! \param lX2 is the X coordinate of the end of the line. +//! \param lY is the Y coordinate of the line. +//! \param ulValue is the color of the line. +//! +//! This function draws a horizontal line on the display. The coordinates of +//! the line are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16LineDrawH(void *pvDisplayData, long lX1, long lX2, long lY, + unsigned long ulValue) +{ + // + // Set the extent of the line along the X axis. + // + WriteCommand(0x2a); + WriteData(lX1); + WriteData(lX2); + + // + // Set the Y address of the display cursor. + // + WriteCommand(0x2b); + WriteData(lY + 1); + WriteData(lY + 1); + + // + // Write the data RAM write command. + // + WriteCommand(0x2c); + + // + // Loop through the pixels of this horizontal line. + // + while(lX1++ <= lX2) + { + // + // Write the pixel value. + // + WriteData(ulValue >> 8); + WriteData(ulValue); + } +} + +//***************************************************************************** +// +//! Draws a vertical line. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param lX is the X coordinate of the line. +//! \param lY1 is the Y coordinate of the start of the line. +//! \param lY2 is the Y coordinate of the end of the line. +//! \param ulValue is the color of the line. +//! +//! This function draws a vertical line on the display. The coordinates of the +//! line are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16LineDrawV(void *pvDisplayData, long lX, long lY1, long lY2, + unsigned long ulValue) +{ + // + // Set the X address of the display cursor. + // + WriteCommand(0x2a); + WriteData(lX); + WriteData(lX); + + // + // Set the extent of the line along the Y axis. + // + WriteCommand(0x2b); + WriteData(lY1 + 1); + WriteData(lY2 + 1); + + // + // Write the data RAM write command. + // + WriteCommand(0x2c); + + // + // Loop through the pixels of this vertical line. + // + while(lY1++ <= lY2) + { + // + // Write the pixel value. + // + WriteData(ulValue >> 8); + WriteData(ulValue); + } +} + +//***************************************************************************** +// +//! Fills a rectangle. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param pRect is a pointer to the structure describing the rectangle. +//! \param ulValue is the color of the rectangle. +//! +//! This function fills a rectangle on the display. The coordinates of the +//! rectangle are assumed to be within the extents of the display, and the +//! rectangle specification is fully inclusive (i.e. both sXMin and sXMax are +//! drawn, along with sYMin and sYMax). +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16RectFill(void *pvDisplayData, const tRectangle *pRect, + unsigned long ulValue) +{ + long lCount; + + // + // Set the extent of the rectangle along the X axis. + // + WriteCommand(0x2a); + WriteData(pRect->sXMin); + WriteData(pRect->sXMax); + + // + // Set the extent of the rectangle along the Y axis. + // + WriteCommand(0x2b); + WriteData(pRect->sYMin + 1); + WriteData(pRect->sYMax + 1); + + // + // Write the data RAM write command. + // + WriteCommand(0x2c); + + // + // Loop through the pixels in this rectangle. + // + for(lCount = ((pRect->sXMax - pRect->sXMin + 1) * + (pRect->sYMax - pRect->sYMin + 1)); lCount > 0; lCount--) + { + // + // Write the pixel value. + // + WriteData(ulValue >> 8); + WriteData(ulValue); + } +} + +//***************************************************************************** +// +//! Translates a 24-bit RGB color to a display driver-specific color. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param ulValue is the 24-bit RGB color. The least-significant byte is the +//! blue channel, the next byte is the green channel, and the third byte is the +//! red channel. +//! +//! This function translates a 24-bit RGB color into a value that can be +//! written into the display's frame buffer in order to reproduce that color, +//! or the closest possible approximation of that color. +//! +//! \return Returns the display-driver specific color. +// +//***************************************************************************** +static unsigned long +Formike128x128x16ColorTranslate(void *pvDisplayData, unsigned long ulValue) +{ + // + // Translate from a 24-bit RGB color to a 5-6-5 RGB color. + // + return(DPYCOLORTRANSLATE(ulValue)); +} + +//***************************************************************************** +// +//! The display structure that describes the driver for the Formike Electronic +//! KWH015C04-F01 CSTN panel with an ST7637 controller. +// +//***************************************************************************** +const tDisplay g_sFormike128x128x16 = +{ + sizeof(tDisplay), + 0, + 128, + 128, + Formike128x128x16PixelDraw, + Formike128x128x16PixelDrawMultiple, + Formike128x128x16LineDrawH, + Formike128x128x16LineDrawV, + Formike128x128x16RectFill, + Formike128x128x16ColorTranslate, + Formike128x128x16Flush +}; + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + + + + + + + + + + + + + + + + +/* FreeRTOS.org demo wrappers. These are required so the prototypes for the +functions are the same as for the display drivers used by other evaluation +kits. */ + +static tContext sContext; + +void vFormike128x128x16Clear( void ) +{ +const tRectangle xRectangle = { 0, 0, 127, 127 }; + + GrContextForegroundSet( &sContext, ClrBlack ); + GrRectFill( &sContext, &xRectangle ); + GrContextForegroundSet(&sContext, ClrWhite); +} +/*-----------------------------------------------------------*/ + +void vFormike128x128x16StringDraw( const char *pcString, unsigned long lX, unsigned long lY, unsigned char ucColor ) +{ + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDraw( &sContext, pcString, strlen( pcString ), lX, lY, false ); +} +/*-----------------------------------------------------------*/ + +void vFormike128x128x16Init( unsigned long ul ) +{ +tRectangle rectScreen; + + ( void ) ul; + + Formike128x128x16Init(); + Formike128x128x16BacklightOn(); + GrContextInit(&sContext, &g_sFormike128x128x16); + GrContextFontSet(&sContext, &g_sFontCmss12); + rectScreen.sXMin = 0; + + /* Fill the screen with a black rectangle. */ + rectScreen.sYMin = 0; + rectScreen.sXMax = g_sFormike128x128x16.usWidth - 1; + rectScreen.sYMax = g_sFormike128x128x16.usHeight - 1; + GrContextForegroundSet(&sContext, ClrBlack); + GrRectFill(&sContext, &rectScreen); +} +/*-----------------------------------------------------------*/ + +void vFormike128x128x16ImageDraw( const unsigned char *pucImage, unsigned long ulX, unsigned long ulY, unsigned long ulWidth, unsigned long ulHeight ) +{ + GrImageDraw( &sContext, pucImage, ( long ) ulX, ( long ) ulY); + +} + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/formike128x128x16.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/formike128x128x16.h new file mode 100644 index 0000000..feaec75 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/formike128x128x16.h @@ -0,0 +1,51 @@ +//***************************************************************************** +// +// formike128x128x16.h - Prototypes for the Formike Electronic KWH015C04-F01 +// display driver. +// +// Copyright (c) 2008 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. You may not combine +// this software with "viral" open-source software in order to form a larger +// program. Any use in violation of the foregoing restrictions may subject +// the user to criminal sanctions under applicable laws, as well as to civil +// liability for the breach of the terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2523 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __FORMIKE128X128X16_H__ +#define __FORMIKE128X128X16_H__ + +//***************************************************************************** +// +// Prototypes for the globals exported by this driver. +// +//***************************************************************************** +extern void Formike128x128x16Init(void); +extern void Formike128x128x16BacklightOn(void); +extern void Formike128x128x16BacklightOff(void); +extern const tDisplay g_sFormike128x128x16; + +/* FreeRTOS.org demo wrappers. These are required so the prototypes for the +functions are the same as for the display drivers used by other evaluation +kits. */ +void vFormike128x128x16Clear( void ); +void vFormike128x128x16StringDraw( const char *pcString, unsigned long lX, unsigned long lY, unsigned char ucColor ); +void vFormike128x128x16Init( unsigned long ul ); +void vFormike128x128x16ImageDraw( const unsigned char *pucImage, unsigned long ulX, unsigned long ulY, unsigned long ulWidth, unsigned long ulHeight ); + +#endif // __FORMIKE128X128X16_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/lcd_message.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/lcd_message.h new file mode 100644 index 0000000..adfc18b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/lcd_message.h @@ -0,0 +1,9 @@ +#ifndef LCD_MESSAGE_H +#define LCD_MESSAGE_H + +typedef struct +{ + signed char *pcMessage; +} xOLEDMessage; + +#endif /* LCD_MESSAGE_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/main.c new file mode 100644 index 0000000..437675f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/main.c @@ -0,0 +1,496 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * Creates all the demo application tasks, then starts the scheduler. The WEB + * documentation provides more details of the standard demo application tasks. + * In addition to the standard demo tasks, the following tasks and tests are + * defined and/or created within this file: + * + * "Fast Interrupt Test" - A high frequency periodic interrupt is generated + * using a free running timer to demonstrate the use of the + * configKERNEL_INTERRUPT_PRIORITY configuration constant. The interrupt + * service routine measures the number of processor clocks that occur between + * each interrupt - and in so doing measures the jitter in the interrupt timing. + * The maximum measured jitter time is latched in the ulMaxJitter variable, and + * displayed on the OLED display by the 'OLED' task as described below. The + * fast interrupt is configured and handled in the timertest.c source file. + * + * "OLED" task - the OLED task is a 'gatekeeper' task. It is the only task that + * is permitted to access the display directly. Other tasks wishing to write a + * message to the OLED send the message on a queue to the OLED task instead of + * accessing the OLED themselves. The OLED task just blocks on the queue waiting + * for messages - waking and displaying the messages as they arrive. + * + * "Check" hook - This only executes every five seconds from the tick hook. + * Its main function is to check that all the standard demo tasks are still + * operational. Should any unexpected behaviour within a demo task be discovered + * the tick hook will write an error to the OLED (via the OLED task). If all the + * demo tasks are executing with their expected behaviour then the check task + * writes PASS to the OLED (again via the OLED task), as described above. + * + * "uIP" task - This is the task that handles the uIP stack. All TCP/IP + * processing is performed in this task. + */ + + + + +/************************************************************************* + * Please ensure to read http://www.freertos.org/portlm3sx965.html + * which provides information on configuring and running this demo for the + * various Luminary Micro EKs. + *************************************************************************/ + +/* Set the following option to 1 to include the WEB server in the build. By +default the WEB server is excluded to keep the compiled code size under the 32K +limit imposed by the KickStart version of the IAR compiler. The graphics +libraries take up a lot of ROM space, hence including the graphics libraries +and the TCP/IP stack together cannot be accommodated with the 32K size limit. */ +#define mainINCLUDE_WEB_SERVER 0 + + +/* Standard includes. */ +#include +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +/* Hardware library includes. */ +#include "hw_memmap.h" +#include "hw_types.h" +#include "hw_sysctl.h" +#include "sysctl.h" +#include "gpio.h" +#include "grlib.h" +#include "rit128x96x4.h" +#include "osram128x64x4.h" +#include "formike128x128x16.h" + +/* Demo app includes. */ +#include "BlockQ.h" +#include "death.h" +#include "integer.h" +#include "blocktim.h" +#include "flash.h" +#include "partest.h" +#include "semtest.h" +#include "PollQ.h" +#include "lcd_message.h" +#include "bitmap.h" +#include "GenQTest.h" +#include "QPeek.h" +#include "recmutex.h" +#include "IntQueue.h" +#include "QueueSet.h" + +/*-----------------------------------------------------------*/ + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) + +/* Size of the stack allocated to the uIP task. */ +#define mainBASIC_WEB_STACK_SIZE ( configMINIMAL_STACK_SIZE * 3 ) + +/* The OLED task uses the sprintf function so requires a little more stack too. */ +#define mainOLED_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE + 50 ) + +/* Task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainGEN_QUEUE_TASK_PRIORITY ( tskIDLE_PRIORITY ) + +/* The maximum number of message that can be waiting for display at any one +time. */ +#define mainOLED_QUEUE_SIZE ( 3 ) + +/* Dimensions the buffer into which the jitter time is written. */ +#define mainMAX_MSG_LEN 25 + +/* The period of the system clock in nano seconds. This is used to calculate +the jitter time in nano seconds. */ +#define mainNS_PER_CLOCK ( ( unsigned portLONG ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) ) + +/* Constants used when writing strings to the display. */ +#define mainCHARACTER_HEIGHT ( 9 ) +#define mainMAX_ROWS_128 ( mainCHARACTER_HEIGHT * 14 ) +#define mainMAX_ROWS_96 ( mainCHARACTER_HEIGHT * 10 ) +#define mainMAX_ROWS_64 ( mainCHARACTER_HEIGHT * 7 ) +#define mainFULL_SCALE ( 15 ) +#define ulSSI_FREQUENCY ( 3500000UL ) + +/*-----------------------------------------------------------*/ + +/* + * The task that handles the uIP stack. All TCP/IP processing is performed in + * this task. + */ +extern void vuIP_Task( void *pvParameters ); + +/* + * The display is written two by more than one task so is controlled by a + * 'gatekeeper' task. This is the only task that is actually permitted to + * access the display directly. Other tasks wanting to display a message send + * the message to the gatekeeper. + */ +static void vOLEDTask( void *pvParameters ); + +/* + * Configure the hardware for the demo. + */ +static void prvSetupHardware( void ); + +/* + * Configures the high frequency timers - those used to measure the timing + * jitter while the real time kernel is executing. + */ +extern void vSetupHighFrequencyTimer( void ); + +/* + * Hook functions that can get called by the kernel. + */ +void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName ); +void vApplicationTickHook( void ); + + +/*-----------------------------------------------------------*/ + +/* The queue used to send messages to the OLED task. */ +xQueueHandle xOLEDQueue; + +/* The welcome text. */ +const portCHAR * const pcWelcomeMessage = " www.FreeRTOS.org"; + +/*-----------------------------------------------------------*/ + + +/************************************************************************* + * Please ensure to read http://www.freertos.org/portlm3sx965.html + * which provides information on configuring and running this demo for the + * various Luminary Micro EKs. + *************************************************************************/ +int main( void ) +{ + prvSetupHardware(); + + /* Create the queue used by the OLED task. Messages for display on the OLED + are received via this queue. */ + xOLEDQueue = xQueueCreate( mainOLED_QUEUE_SIZE, sizeof( xOLEDMessage ) ); + + /* Start the standard demo tasks. */ + vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); + vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY ); + vStartInterruptQueueTasks(); + vStartRecursiveMutexTasks(); + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + vCreateBlockTimeTasks(); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartQueuePeekTasks(); + vStartQueueSetTasks(); + + /* Exclude some tasks if using the kickstart version to ensure we stay within + the 32K code size limit. */ + #if mainINCLUDE_WEB_SERVER != 0 + { + /* Create the uIP task if running on a processor that includes a MAC and + PHY. */ + if( SysCtlPeripheralPresent( SYSCTL_PERIPH_ETH ) ) + { + xTaskCreate( vuIP_Task, ( signed portCHAR * ) "uIP", mainBASIC_WEB_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL ); + } + } + #endif + + + + /* Start the tasks defined within this file/specific to this demo. */ + xTaskCreate( vOLEDTask, ( signed portCHAR * ) "OLED", mainOLED_TASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation in order to ascertain whether + or not the correct/expected number of tasks are running at any given time. */ + vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Configure the high frequency interrupt used to measure the interrupt + jitter time. */ + vSetupHighFrequencyTimer(); + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. */ + return 0; +} +/*-----------------------------------------------------------*/ + +void prvSetupHardware( void ) +{ + /* If running on Rev A2 silicon, turn the LDO voltage up to 2.75V. This is + a workaround to allow the PLL to operate reliably. */ + if( DEVICE_IS_REVA2 ) + { + SysCtlLDOSet( SYSCTL_LDO_2_75V ); + } + + /* Set the clocking to run from the PLL at 50 MHz */ + SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ ); + + /* Enable Port F for Ethernet LEDs + LED0 Bit 3 Output + LED1 Bit 2 Output */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF ); + GPIODirModeSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3), GPIO_DIR_MODE_HW ); + GPIOPadConfigSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3 ), GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + + vParTestInitialise(); +} +/*-----------------------------------------------------------*/ + +void vApplicationTickHook( void ) +{ +static xOLEDMessage xMessage = { "PASS" }; +static unsigned portLONG ulTicksSinceLastDisplay = 0; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* Called from every tick interrupt. Have enough ticks passed to make it + time to perform our health status check again? */ + ulTicksSinceLastDisplay++; + if( ulTicksSinceLastDisplay >= mainCHECK_DELAY ) + { + ulTicksSinceLastDisplay = 0; + + /* Has an error been found in any task? */ + if( xAreGenericQueueTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN GEN Q"; + } + else if( xIsCreateTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN CREATE"; + } + else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN MATH"; + } + else if( xAreIntQueueTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN INT QUEUE"; + } + else if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK Q"; + } + else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK TIME"; + } + else if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN SEMAPHORE"; + } + else if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN POLL Q"; + } + else if( xAreQueuePeekTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN PEEK Q"; + } + else if( xAreRecursiveMutexTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN REC MUTEX"; + } + else if( xAreQueueSetTasksStillRunning() != pdPASS ) + { + xMessage.pcMessage = "ERROR IN Q SET"; + } + + configASSERT( strcmp( ( const char * ) xMessage.pcMessage, "PASS" ) == 0 ); + + /* Send the message to the OLED gatekeeper for display. */ + xHigherPriorityTaskWoken = pdFALSE; + xQueueSendFromISR( xOLEDQueue, &xMessage, &xHigherPriorityTaskWoken ); + } + + /* Write to a queue that is in use as part of the queue set demo to + demonstrate using queue sets from an ISR. */ + vQueueSetAccessQueueSetFromISR(); +} +/*-----------------------------------------------------------*/ + +void vOLEDTask( void *pvParameters ) +{ +xOLEDMessage xMessage; +unsigned portLONG ulY, ulMaxY; +static portCHAR cMessage[ mainMAX_MSG_LEN ]; +extern volatile unsigned portLONG ulMaxJitter; +const unsigned portCHAR *pucImage; + +/* Functions to access the OLED. The one used depends on the dev kit +being used. */ +void ( *vOLEDInit )( unsigned portLONG ) = NULL; +void ( *vOLEDStringDraw )( const portCHAR *, unsigned portLONG, unsigned portLONG, unsigned portCHAR ) = NULL; +void ( *vOLEDImageDraw )( const unsigned portCHAR *, unsigned portLONG, unsigned portLONG, unsigned portLONG, unsigned portLONG ) = NULL; +void ( *vOLEDClear )( void ) = NULL; + + /* Map the OLED access functions to the driver functions that are appropriate + for the evaluation kit being used. */ + switch( HWREG( SYSCTL_DID1 ) & SYSCTL_DID1_PRTNO_MASK ) + { + case SYSCTL_DID1_PRTNO_6965 : + case SYSCTL_DID1_PRTNO_2965 : vOLEDInit = OSRAM128x64x4Init; + vOLEDStringDraw = OSRAM128x64x4StringDraw; + vOLEDImageDraw = OSRAM128x64x4ImageDraw; + vOLEDClear = OSRAM128x64x4Clear; + ulMaxY = mainMAX_ROWS_64; + pucImage = pucBasicBitmap; + break; + + case SYSCTL_DID1_PRTNO_1968 : + case SYSCTL_DID1_PRTNO_8962 : vOLEDInit = RIT128x96x4Init; + vOLEDStringDraw = RIT128x96x4StringDraw; + vOLEDImageDraw = RIT128x96x4ImageDraw; + vOLEDClear = RIT128x96x4Clear; + ulMaxY = mainMAX_ROWS_96; + pucImage = pucBasicBitmap; + break; + + default : vOLEDInit = vFormike128x128x16Init; + vOLEDStringDraw = vFormike128x128x16StringDraw; + vOLEDImageDraw = vFormike128x128x16ImageDraw; + vOLEDClear = vFormike128x128x16Clear; + ulMaxY = mainMAX_ROWS_128; + pucImage = pucGrLibBitmap; + break; + + } + + ulY = ulMaxY; + + /* Initialise the OLED and display a startup message. */ + vOLEDInit( ulSSI_FREQUENCY ); + vOLEDStringDraw( "POWERED BY FreeRTOS", 0, 0, mainFULL_SCALE ); + vOLEDImageDraw( pucImage, 0, mainCHARACTER_HEIGHT + 1, bmpBITMAP_WIDTH, bmpBITMAP_HEIGHT ); + + for( ;; ) + { + /* Wait for a message to arrive that requires displaying. */ + xQueueReceive( xOLEDQueue, &xMessage, portMAX_DELAY ); + + /* Write the message on the next available row. */ + ulY += mainCHARACTER_HEIGHT; + if( ulY >= ulMaxY ) + { + ulY = mainCHARACTER_HEIGHT; + vOLEDClear(); + vOLEDStringDraw( pcWelcomeMessage, 0, 0, mainFULL_SCALE ); + } + + /* Display the message along with the maximum jitter time from the + high priority time test. */ + sprintf( cMessage, "%s [%uns]", xMessage.pcMessage, ulMaxJitter * mainNS_PER_CLOCK ); + vOLEDStringDraw( cMessage, 0, ulY, mainFULL_SCALE ); + } +} +/*-----------------------------------------------------------*/ + +void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName ) +{ + ( void ) pxTask; + ( void ) pcTaskName; + + for( ;; ); +} +/*-----------------------------------------------------------*/ + +void vAssertCalled( const char *pcFile, unsigned long ulLine ) +{ +volatile unsigned long ulSetTo1InDebuggerToExit = 0; + + taskENTER_CRITICAL(); + { + while( ulSetTo1InDebuggerToExit == 0 ) + { + /* Nothing do do here. Set the loop variable to a non zero value in + the debugger to step out of this function to the point that caused + the assertion. */ + ( void ) pcFile; + ( void ) ulLine; + } + } + taskEXIT_CRITICAL(); +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/osram128x64x4.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/osram128x64x4.c new file mode 100644 index 0000000..3353a82 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/osram128x64x4.c @@ -0,0 +1,933 @@ +//***************************************************************************** +// +// osram128x64x4.c - Driver for the OSRAM 128x64x4 graphical OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3sx965_api +//! @{ +// +//***************************************************************************** + +#include "hw_ssi.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "osram128x64x4.h" + +//***************************************************************************** +// +// Flag to indicate if SSI port is enabled for OSRAM usage. +// +//***************************************************************************** +static volatile tBoolean g_bSSIEnabled = false; + +//***************************************************************************** +// +// Define the OSRAM 128x64x4 Remap Setting(s). This will be used in +// several places in the code to switch between vertical and horizontal +// address incrementing. +// +// The Remap Command (0xA0) takes one 8-bit parameter. The parameter is +// defined as follows. +// +// Bit 7: Reserved +// Bit 6: Disable(0)/Enable(1) COM Split Odd Even +// When enabled, the COM signals are split Odd on one side, even on +// the other. Otherwise, they are split 0-39 on one side, 40-79 on +// the other. +// Bit 5: Reserved +// Bit 4: Disable(0)/Enable(1) COM Remap +// When Enabled, ROW 0-79 map to COM 79-0 (i.e. reverse row order) +// Bit 3: Reserved +// Bit 2: Horizontal(0)/Vertical(1) Address Increment +// When set, data RAM address will increment along the column rather +// than along the row. +// Bit 1: Disable(0)/Enable(1) Nibble Remap +// When enabled, the upper and lower nibbles in the DATA bus for access +// to the data RAM are swapped. +// Bit 0: Disable(0)/Enable(1) Column Address Remap +// When enabled, DATA RAM columns 0-63 are remapped to Segment Columns +// 127-0. +// +//***************************************************************************** +#define OSRAM_INIT_REMAP 0x52 +#define OSRAM_INIT_OFFSET 0x4C +static const unsigned char g_pucOSRAM128x64x4VerticalInc[] = { 0xA0, 0x56 }; +static const unsigned char g_pucOSRAM128x64x4HorizontalInc[] = { 0xA0, 0x52 }; + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +// Note: This is the same font data that is used in the EK-LM3S811 +// osram96x16x1 driver. The single bit-per-pixel is expaned in the StringDraw +// function to the appropriate four bit-per-pixel gray scale format. +// +//***************************************************************************** +static const unsigned char g_pucFont[96][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD0303 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the command sequence, followed by that many bytes of command data. +// Note: This initialization sequence is derived from OSRAM App Note AN018. +// +//***************************************************************************** +static const unsigned char g_pucOSRAM128x64x4Init[] = +{ + // + // Column Address + // + 4, 0x15, 0, 63, 0xe3, + + // + // Row Address + // + 4, 0x75, 0, 63, 0xe3, + + // + // Contrast Control + // + 3, 0x81, 50, 0xe3, + + // + // Half Current Range + // + 2, 0x85, 0xe3, + + // + // Display Re-map + // + 3, 0xA0, OSRAM_INIT_REMAP, 0xe3, + + // + // Display Start Line + // + 3, 0xA1, 0, 0xe3, + + // + // Display Offset + // + 3, 0xA2, OSRAM_INIT_OFFSET, 0xe3, + + // + // Display Mode Normal + // + 2, 0xA4, 0xe3, + + // + // Multiplex Ratio + // + 3, 0xA8, 63, 0xe3, + + // + // Phase Length + // + 3, 0xB1, 0x22, 0xe3, + + // + // Row Period + // + 3, 0xB2, 70, 0xe3, + + // + // Display Clock Divide + // + 3, 0xB3, 0xF1, 0xe3, + + // + // VSL + // + 3, 0xBF, 0x0D, 0xe3, + + // + // VCOMH + // + 3, 0xBE, 0x02, 0xe3, + + // + // VP + // + 3, 0xBC, 0x10, 0xe3, + + // + // Gamma + // + 10, 0xB8, 0x01, 0x11, 0x22, 0x32, 0x43, 0x54, 0x65, 0x76, 0xe3, + + // + // Set DC-DC + 3, 0xAD, 0x03, 0xe3, + + // + // Display ON/OFF + // + 2, 0xAF, 0xe3, +}; + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of command bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteCommand(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Clear the command/control bit to enable command mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, 0); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of data bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteData(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Set the command/control bit to enable data mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display RAM. All pixels in the display will +//! be turned off. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Clear(void) +{ + static const unsigned char pucCommand1[] = { 0x15, 0, 63 }; + static const unsigned char pucCommand2[] = { 0x75, 0, 79 }; + unsigned long ulRow, ulColumn; + static unsigned char pucZeroBuffer[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; + + // + // Set the window to fill the entire display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); + OSRAMWriteCommand(pucCommand2, sizeof(pucCommand2)); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // In vertical address increment mode, loop through each column, filling + // each row with 0. + // + for(ulColumn = 0; ulColumn < (128/2); ulColumn++) + { + // + // 8 rows (bytes) per row of text. + // + for(ulRow = 0; ulRow < 80; ulRow += 8) + { + OSRAMWriteData(pucZeroBuffer, sizeof(pucZeroBuffer)); + } + } +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! rows from the top edge of the display. +//! \param ucLevel is the 4-bit grey scale value to be used for displayed text. +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \note Because the OLED display packs 2 pixels of data in a single byte, the +//! parameter \e ulX must be an even column number (e.g. 0, 2, 4, etc). +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4StringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY, unsigned char ucLevel) +{ + static unsigned char pucBuffer[8]; + unsigned long ulIdx1, ulIdx2; + unsigned char ucTemp; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT(ucLevel < 16); + + // + // Setup a window starting at the specified column and row, ending + // at the right edge of the display and 8 rows down (single character row). + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = 63; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + 7; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // Get a working copy of the current character and convert to an + // index into the character bit-map array. + // + ucTemp = *pcStr; + ucTemp &= 0x7F; + if(ucTemp < ' ') + { + ucTemp = ' '; + } + else + { + ucTemp -= ' '; + } + + // + // Build and display the character buffer. + // + for(ulIdx1 = 0; ulIdx1 < 3; ulIdx1++) + { + // + // Convert two columns of 1-bit font data into a single data + // byte column of 4-bit font data. + // + for(ulIdx2 = 0; ulIdx2 < 8; ulIdx2++) + { + pucBuffer[ulIdx2] = 0; + if(g_pucFont[ucTemp][ulIdx1*2] & (1 << ulIdx2)) + { + pucBuffer[ulIdx2] = ((ucLevel << 4) & 0xf0); + } + if((ulIdx1 < 2) && + (g_pucFont[ucTemp][ulIdx1*2+1] & (1 << ulIdx2))) + { + pucBuffer[ulIdx2] |= ((ucLevel << 0) & 0x0f); + } + } + + // + // If there is room, dump the single data byte column to the + // display. Otherwise, bail out. + // + if(ulX < 126) + { + OSRAMWriteData(pucBuffer, 8); + ulX += 2; + } + else + { + return; + } + } + + // + // Advance to the next character. + // + pcStr++; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! rows from the top of the display. +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in rows. +//! +//! This function will display a bitmap graphic on the display. Because of the +//! format of the display RAM, the starting column (/e ulX) and the number of +//! columns (/e ulWidth) must be an integer multiple of two. +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for two columns in the current row, with the leftmost +//! column being contained in bits 7:4 and the rightmost column being contained +//! in bits 3:0. +//! +//! For example, an image six columns wide and seven scan lines tall would +//! be arranged as follows (showing how the twenty one bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------------------+-------------------+-------------------+ +//! | Byte 0 | Byte 1 | Byte 2 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 3 | Byte 4 | Byte 5 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 6 | Byte 7 | Byte 8 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 9 | Byte 10 | Byte 11 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 12 | Byte 13 | Byte 14 | +//! +---------+---------+---------+--3------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 15 | Byte 16 | Byte 17 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 18 | Byte 19 | Byte 20 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! \endverbatim +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by` +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4ImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + static unsigned char pucBuffer[8]; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT((ulX + ulWidth) <= 128); + ASSERT((ulY + ulHeight) <= 64); + ASSERT((ulWidth & 1) == 0); + + // + // Setup a window starting at the specified column and row, and ending + // at the column + width and row+height. + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = (ulX + ulWidth - 2) / 2; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + ulHeight - 1; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4HorizontalInc, + sizeof(g_pucOSRAM128x64x4HorizontalInc)); + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write this row of image data. + // + OSRAMWriteData(pucImage, (ulWidth / 2)); + + // + // Advance to the next row of the image. + // + pucImage += (ulWidth / 2); + } +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Enable(unsigned long ulFrequency) +{ + unsigned long ulTemp; + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Configure the SSI0 port for master mode. + // + SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_2, SSI_MODE_MASTER, ulFrequency, 8); + + // + // (Re)Enable SSI control of the FSS pin. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Enable the SSI port. + // + SSIEnable(SSI0_BASE); + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Indicate that the OSRAM driver can use the SSI Port. + // + g_bSSIEnabled = true; +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Disable(void) +{ + unsigned long ulTemp; + + // + // Indicate that the OSRAM driver can no longer use the SSI Port. + // + g_bSSIEnabled = false; + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Disable SSI control of the FSS pin. + // + GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); + +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display and +//! configures the SSD0323 controller on the panel. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Init(unsigned long ulFrequency) +{ + unsigned long ulIdx; + + // + // Enable the SSI0 and GPIO port blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + + // + // Configure the SSI0CLK and SSIOTX pins for SSI operation. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_5, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the PC7 pin as a D/Cn signal for OLED device. + // + GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD); + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Configure and enable the SSI0 port for master mode. + // + OSRAM128x64x4Enable(ulFrequency); + + // + // Clear the frame buffer. + // + OSRAM128x64x4Clear(); + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOn(void) +{ + unsigned long ulIdx; + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOff(void) +{ + static const unsigned char pucCommand1[] = + { + 0xAE, 0xAD, 0x02 + }; + + // + // Turn off the DC-DC converter and the display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/osram128x64x4.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/osram128x64x4.h new file mode 100644 index 0000000..2ba7cb9 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/osram128x64x4.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// osram128x64x4.h - Prototypes for the driver for the OSRAM 128x64x4 graphical +// OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __OSRAM128X64X4_H__ +#define __OSRAM128X64X4_H__ + +//***************************************************************************** +// +// Prototypes for the driver APIs. +// +//***************************************************************************** +extern void OSRAM128x64x4Clear(void); +extern void OSRAM128x64x4StringDraw(const char *pcStr, + unsigned long ulX, + unsigned long ulY, + unsigned char ucLevel); +extern void OSRAM128x64x4ImageDraw(const unsigned char *pucImage, + unsigned long ulX, + unsigned long ulY, + unsigned long ulWidth, + unsigned long ulHeight); +extern void OSRAM128x64x4Init(unsigned long ulFrequency); +extern void OSRAM128x64x4Enable(unsigned long ulFrequency); +extern void OSRAM128x64x4Disable(void); +extern void OSRAM128x64x4DisplayOn(void); +extern void OSRAM128x64x4DisplayOff(void); + +//***************************************************************************** +// +// The following macro(s) map old names for the OSRAM functions to the new +// names. In new code, the new names should be used in favor of the old names. +// +//***************************************************************************** +#ifndef DEPRECATED +#define OSRAM128x64x1InitSSI OSRAM128x64x4Enable +#endif + +#endif // __OSRAM128X64X4_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rit128x96x4.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rit128x96x4.c new file mode 100644 index 0000000..cff38d5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rit128x96x4.c @@ -0,0 +1,981 @@ +//***************************************************************************** +// +// rit128x96x4.c - Driver for the RIT 128x96x4 graphical OLED display. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1504-conf of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3sLM3S8962_api +//! @{ +// +//***************************************************************************** + +#include "hw_ssi.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "rit128x96x4.h" + +//***************************************************************************** +// +// Macros that define the peripheral, port, and pin used for the OLEDDC +// panel control signal. +// +//***************************************************************************** + +unsigned long ulGPIOId = 0, ulGPIOBase = 0, ulOLEDDC_PIN = 0, ulOLEDEN_PIN = 0; + +#define LM3S8962_SYSCTL_PERIPH_GPIO_OLEDDC SYSCTL_PERIPH_GPIOA +#define LM3S8962_GPIO_OLEDDC_BASE GPIO_PORTA_BASE +#define LM3S8962_GPIO_OLEDDC_PIN GPIO_PIN_6 +#define LM3S8962_GPIO_OLEDEN_PIN GPIO_PIN_7 + +#define LM3S1968_SYSCTL_PERIPH_GPIO_OLEDDC SYSCTL_PERIPH_GPIOH +#define LM3S1968_GPIO_OLEDDC_BASE GPIO_PORTH_BASE +#define LM3S1968_GPIO_OLEDDC_PIN GPIO_PIN_2 +#define LM3S1968_GPIO_OLEDEN_PIN GPIO_PIN_3 + + +//***************************************************************************** +// +// Flag to indicate if SSI port is enabled for display usage. +// +//***************************************************************************** +static volatile tBoolean g_bSSIEnabled = false; + +//***************************************************************************** +// +// Buffer for storing sequences of command and data for the display. +// +//***************************************************************************** +static unsigned char g_pucBuffer[8]; + +//***************************************************************************** +// +// Define the SSD1329 128x96x4 Remap Setting(s). This will be used in +// several places in the code to switch between vertical and horizontal +// address incrementing. Note that the controller support 128 rows while +// the RIT display only uses 96. +// +// The Remap Command (0xA0) takes one 8-bit parameter. The parameter is +// defined as follows. +// +// Bit 7: Reserved +// Bit 6: Disable(0)/Enable(1) COM Split Odd Even +// When enabled, the COM signals are split Odd on one side, even on +// the other. Otherwise, they are split 0-63 on one side, 64-127 on +// the other. +// Bit 5: Reserved +// Bit 4: Disable(0)/Enable(1) COM Remap +// When Enabled, ROW 0-127 map to COM 127-0 (i.e. reverse row order) +// Bit 3: Reserved +// Bit 2: Horizontal(0)/Vertical(1) Address Increment +// When set, data RAM address will increment along the column rather +// than along the row. +// Bit 1: Disable(0)/Enable(1) Nibble Remap +// When enabled, the upper and lower nibbles in the DATA bus for access +// to the data RAM are swapped. +// Bit 0: Disable(0)/Enable(1) Column Address Remap +// When enabled, DATA RAM columns 0-63 are remapped to Segment Columns +// 127-0. +// +//***************************************************************************** +#define RIT_INIT_REMAP 0x52 // app note says 0x51 +#define RIT_INIT_OFFSET 0x00 +static const unsigned char g_pucRIT128x96x4VerticalInc[] = { 0xA0, 0x56 }; +static const unsigned char g_pucRIT128x96x4HorizontalInc[] = { 0xA0, 0x52 }; + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +// Note: This is the same font data that is used in the EK-LM3S811 +// osram96x16x1 driver. The single bit-per-pixel is expaned in the StringDraw +// function to the appropriate four bit-per-pixel gray scale format. +// +//***************************************************************************** +static const unsigned char g_pucFont[96][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD1329 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the command sequence, followed by that many bytes of command data. +// Note: This initialization sequence is derived from RIT App Note for +// the P14201. Values used are from the RIT app note, except where noted. +// +//***************************************************************************** +static const unsigned char g_pucRIT128x96x4Init[] = +{ + // + // Unlock commands + // + 3, 0xFD, 0x12, 0xe3, + + // + // Display off + // + 2, 0xAE, 0xe3, + + // + // Icon off + // + 3, 0x94, 0, 0xe3, + + // + // Multiplex ratio + // + 3, 0xA8, 95, 0xe3, + + // + // Contrast + // + 3, 0x81, 0xb7, 0xe3, + + // + // Pre-charge current + // + 3, 0x82, 0x3f, 0xe3, + + // + // Display Re-map + // + 3, 0xA0, RIT_INIT_REMAP, 0xe3, + + // + // Display Start Line + // + 3, 0xA1, 0, 0xe3, + + // + // Display Offset + // + 3, 0xA2, RIT_INIT_OFFSET, 0xe3, + + // + // Display Mode Normal + // + 2, 0xA4, 0xe3, + + // + // Phase Length + // + 3, 0xB1, 0x11, 0xe3, + + // + // Frame frequency + // + 3, 0xB2, 0x23, 0xe3, + + // + // Front Clock Divider + // + 3, 0xB3, 0xe2, 0xe3, + + // + // Set gray scale table. App note uses default command: + // 2, 0xB7, 0xe3 + // This gray scale attempts some gamma correction to reduce the + // the brightness of the low levels. + // + 17, 0xB8, 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 19, 22, 26, 30, 0xe3, + + // + // Second pre-charge period. App note uses value 0x04. + // + 3, 0xBB, 0x01, 0xe3, + + // + // Pre-charge voltage + // + 3, 0xBC, 0x3f, 0xe3, + + // + // Display ON + // + 2, 0xAF, 0xe3, +}; + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of command bytes to the SSD1329 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +RITWriteCommand(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return if SSI port is not enabled for RIT display. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Clear the command/control bit to enable command mode. + // + GPIOPinWrite(ulGPIOBase, ulOLEDDC_PIN, 0); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of data bytes to the SSD1329 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +RITWriteData(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return if SSI port is not enabled for RIT display. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Set the command/control bit to enable data mode. + // + GPIOPinWrite(ulGPIOBase, ulOLEDDC_PIN, ulOLEDDC_PIN); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display RAM. All pixels in the display will +//! be turned off. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4Clear(void) +{ + static const unsigned char pucCommand1[] = { 0x15, 0, 63 }; + static const unsigned char pucCommand2[] = { 0x75, 0, 127 }; + unsigned long ulRow, ulColumn; + + // + // Clear out the buffer used for sending bytes to the display. + *(unsigned long *)&g_pucBuffer[0] = 0; + *(unsigned long *)&g_pucBuffer[4] = 0; + + // + // Set the window to fill the entire display. + // + RITWriteCommand(pucCommand1, sizeof(pucCommand1)); + RITWriteCommand(pucCommand2, sizeof(pucCommand2)); + RITWriteCommand(g_pucRIT128x96x4HorizontalInc, + sizeof(g_pucRIT128x96x4HorizontalInc)); + + // + // Loop through the rows + // + for(ulRow = 0; ulRow < 96; ulRow++) + { + // + // Loop through the columns. Each byte is two pixels, + // and the buffer hold 8 bytes, so 16 pixels are cleared + // at a time. + // + for(ulColumn = 0; ulColumn < 128; ulColumn += 8 * 2) + { + // + // Write 8 clearing bytes to the display, which will + // clear 16 pixels across. + // + RITWriteData(g_pucBuffer, sizeof(g_pucBuffer)); + } + } +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! rows from the top edge of the display. +//! \param ucLevel is the 4-bit grey scale value to be used for displayed text. +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \note Because the OLED display packs 2 pixels of data in a single byte, the +//! parameter \e ulX must be an even column number (e.g. 0, 2, 4, etc). +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4StringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY, unsigned char ucLevel) +{ + unsigned long ulIdx1, ulIdx2; + unsigned char ucTemp; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 96); + ASSERT(ucLevel < 16); + + // + // Setup a window starting at the specified column and row, ending + // at the right edge of the display and 8 rows down (single character row). + // + g_pucBuffer[0] = 0x15; + g_pucBuffer[1] = ulX / 2; + g_pucBuffer[2] = 63; + RITWriteCommand(g_pucBuffer, 3); + g_pucBuffer[0] = 0x75; + g_pucBuffer[1] = ulY; + g_pucBuffer[2] = ulY + 7; + RITWriteCommand(g_pucBuffer, 3); + RITWriteCommand(g_pucRIT128x96x4VerticalInc, + sizeof(g_pucRIT128x96x4VerticalInc)); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // Get a working copy of the current character and convert to an + // index into the character bit-map array. + // + ucTemp = *pcStr; + ucTemp &= 0x7F; + if(ucTemp < ' ') + { + ucTemp = ' '; + } + else + { + ucTemp -= ' '; + } + + // + // Build and display the character buffer. + // + for(ulIdx1 = 0; ulIdx1 < 3; ulIdx1++) + { + // + // Convert two columns of 1-bit font data into a single data + // byte column of 4-bit font data. + // + for(ulIdx2 = 0; ulIdx2 < 8; ulIdx2++) + { + g_pucBuffer[ulIdx2] = 0; + if(g_pucFont[ucTemp][ulIdx1*2] & (1 << ulIdx2)) + { + g_pucBuffer[ulIdx2] = ((ucLevel << 4) & 0xf0); + } + if((ulIdx1 < 2) && + (g_pucFont[ucTemp][ulIdx1*2+1] & (1 << ulIdx2))) + { + g_pucBuffer[ulIdx2] |= ((ucLevel << 0) & 0x0f); + } + } + + // + // If there is room, dump the single data byte column to the + // display. Otherwise, bail out. + // + if(ulX < 126) + { + RITWriteData(g_pucBuffer, 8); + ulX += 2; + } + else + { + return; + } + } + + // + // Advance to the next character. + // + pcStr++; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! rows from the top of the display. +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in rows. +//! +//! This function will display a bitmap graphic on the display. Because of the +//! format of the display RAM, the starting column (\e ulX) and the number of +//! columns (\e ulWidth) must be an integer multiple of two. +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for two columns in the current row, with the leftmost +//! column being contained in bits 7:4 and the rightmost column being contained +//! in bits 3:0. +//! +//! For example, an image six columns wide and seven scan lines tall would +//! be arranged as follows (showing how the twenty one bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------------------+-------------------+-------------------+ +//! | Byte 0 | Byte 1 | Byte 2 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 3 | Byte 4 | Byte 5 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 6 | Byte 7 | Byte 8 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 9 | Byte 10 | Byte 11 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 12 | Byte 13 | Byte 14 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 15 | Byte 16 | Byte 17 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 18 | Byte 19 | Byte 20 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! \endverbatim +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4ImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 96); + ASSERT((ulX + ulWidth) <= 128); + ASSERT((ulY + ulHeight) <= 96); + ASSERT((ulWidth & 1) == 0); + + // + // Setup a window starting at the specified column and row, and ending + // at the column + width and row+height. + // + g_pucBuffer[0] = 0x15; + g_pucBuffer[1] = ulX / 2; + g_pucBuffer[2] = (ulX + ulWidth - 2) / 2; + RITWriteCommand(g_pucBuffer, 3); + g_pucBuffer[0] = 0x75; + g_pucBuffer[1] = ulY; + g_pucBuffer[2] = ulY + ulHeight - 1; + RITWriteCommand(g_pucBuffer, 3); + RITWriteCommand(g_pucRIT128x96x4HorizontalInc, + sizeof(g_pucRIT128x96x4HorizontalInc)); + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write this row of image data. + // + RITWriteData(pucImage, (ulWidth / 2)); + + // + // Advance to the next row of the image. + // + pucImage += (ulWidth / 2); + } +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4Enable(unsigned long ulFrequency) +{ + unsigned long ulTemp; + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Configure the SSI0 port for master mode. + // + SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_2, SSI_MODE_MASTER, ulFrequency, 8); + + // + // (Re)Enable SSI control of the FSS pin. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Enable the SSI port. + // + SSIEnable(SSI0_BASE); + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Indicate that the RIT driver can use the SSI Port. + // + g_bSSIEnabled = true; +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4Disable(void) +{ + unsigned long ulTemp; + + // + // Indicate that the RIT driver can no longer use the SSI Port. + // + g_bSSIEnabled = false; + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Disable SSI control of the FSS pin. + // + GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display and +//! configures the SSD1329 controller on the panel. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4Init(unsigned long ulFrequency) +{ + unsigned long ulIdx; + + + /* Determine which board is being used. */ + if( SysCtlPeripheralPresent( SYSCTL_PERIPH_ETH ) ) + { + /* Ethernet is present, we must be using the LM3S8962 EK. */ + ulGPIOId = LM3S8962_SYSCTL_PERIPH_GPIO_OLEDDC; + ulGPIOBase = LM3S8962_GPIO_OLEDDC_BASE; + ulOLEDDC_PIN = GPIO_PIN_6; + ulOLEDEN_PIN = GPIO_PIN_7; + } + else + { + /* Ethernet is not present, we must be using the LM3S1968 EK. */ + ulGPIOId = LM3S1968_SYSCTL_PERIPH_GPIO_OLEDDC; + ulGPIOBase = LM3S1968_GPIO_OLEDDC_BASE; + ulOLEDDC_PIN = GPIO_PIN_2; + ulOLEDEN_PIN = GPIO_PIN_3; + } + + // + // Enable the SSI0 and GPIO port blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + SysCtlPeripheralEnable(ulGPIOId); + + // + // Configure the SSI0CLK and SSIOTX pins for SSI operation. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5, + GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the GPIO port pin used as a D/Cn signal for OLED device, + // and the port pin used to enable power to the OLED panel. + // + GPIOPinTypeGPIOOutput(ulGPIOBase, ulOLEDDC_PIN | ulOLEDEN_PIN); + GPIOPadConfigSet(ulGPIOBase, ulOLEDDC_PIN | ulOLEDEN_PIN, + GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); + GPIOPinWrite(ulGPIOBase, ulOLEDDC_PIN | ulOLEDEN_PIN, + ulOLEDDC_PIN | ulOLEDEN_PIN); + + // + // Configure and enable the SSI0 port for master mode. + // + RIT128x96x4Enable(ulFrequency); + + // + // Clear the frame buffer. + // + RIT128x96x4Clear(); + + // + // Initialize the SSD1329 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucRIT128x96x4Init); + ulIdx += g_pucRIT128x96x4Init[ulIdx] + 1) + { + // + // Send this command. + // + RITWriteCommand(g_pucRIT128x96x4Init + ulIdx + 1, + g_pucRIT128x96x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4DisplayOn(void) +{ + unsigned long ulIdx; + + // + // Initialize the SSD1329 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucRIT128x96x4Init); + ulIdx += g_pucRIT128x96x4Init[ulIdx] + 1) + { + // + // Send this command. + // + RITWriteCommand(g_pucRIT128x96x4Init + ulIdx + 1, + g_pucRIT128x96x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4DisplayOff(void) +{ + static const unsigned char pucCommand1[] = + { + 0xAE, 0xe3 + }; + + // + // Put the display to sleep. + // + RITWriteCommand(pucCommand1, sizeof(pucCommand1)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/ExtDll.iex b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/ExtDll.iex new file mode 100644 index 0000000..b661f48 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/ExtDll.iex @@ -0,0 +1,2 @@ +[EXTDLL] +Count=0 diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.axf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.axf new file mode 100644 index 0000000..ffc1c9d Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.axf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.bin b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.bin new file mode 100644 index 0000000..c89d6f3 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.bin differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.lnp b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.lnp new file mode 100644 index 0000000..1baf87c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.lnp @@ -0,0 +1,3 @@ +--cpu Cortex-M3 ".\rvmdk\blockq.o" ".\rvmdk\blocktim.o" ".\rvmdk\death.o" ".\rvmdk\integer.o" ".\rvmdk\main.o" ".\rvmdk\partest.o" ".\rvmdk\pollq.o" ".\rvmdk\semtest.o" ".\rvmdk\startup_rvmdk.o" ".\rvmdk\timertest.o" ".\rvmdk\genqtest.o" ".\rvmdk\qpeek.o" ".\rvmdk\intqueuetimer.o" ".\rvmdk\intqueue.o" ".\rvmdk\recmutex.o" ".\rvmdk\rit128x96x4.o" "..\Common\drivers\LuminaryMicro\Keil\driverlib.lib" ".\rvmdk\formike128x128x16.o" "..\Common\drivers\LuminaryMicro\Keil\grlib.lib" ".\rvmdk\tasks.o" ".\rvmdk\list.o" ".\rvmdk\queue.o" ".\rvmdk\port.o" ".\rvmdk\heap_2.o" ".\rvmdk\osram128x64x4.o" ".\rvmdk\uip_task.o" ".\rvmdk\emac.o" ".\rvmdk\httpd.o" ".\rvmdk\httpd-cgi.o" ".\rvmdk\httpd-fs.o" ".\rvmdk\http-strings.o" ".\rvmdk\uip_arp.o" ".\rvmdk\psock.o" ".\rvmdk\timer.o" ".\rvmdk\uip.o" --strict --scatter ".\rvmdk\RTOSDemo.sct" +--entry Reset_Handler --autoat --summary_stderr --info summarysizes --info sizes --info totals + --list ".\rvmdk\RTOSDemo.map" -o ".\rvmdk\RTOSDemo.axf" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.map b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.map new file mode 100644 index 0000000..ecd7484 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.map @@ -0,0 +1,133 @@ +ARM Linker, 4.1 [Build 713] [Standard] + +============================================================================== + +Image component sizes + + + Code (inc. data) RO Data RW Data ZI Data Debug Object Name + + 684 82 0 24 0 13516 blockq.o + 1148 114 0 32 0 3117 blocktim.o + 356 62 0 20 0 3078 death.o + 72 8 0 24 0 2827 emac.o + 1598 80 48 0 28 10418 formike128x128x16.o + 1400 154 0 32 0 4030 genqtest.o + 300 32 0 24 24000 3375 heap_2.o + 178 20 0 4 0 2556 integer.o + 2216 288 0 84 400 11284 intqueue.o + 200 26 0 0 0 1398 intqueuetimer.o + 160 0 0 0 0 2769 list.o + 956 340 4933 12 25 23214 main.o + 888 86 571 25 0 5912 osram128x64x4.o + 40 4 0 0 0 425 partest.o + 360 62 0 12 0 2481 pollq.o + 352 40 0 4 0 4285 port.o + 984 166 0 24 0 3821 qpeek.o + 1438 6 0 0 80 12145 queue.o + 776 166 0 48 0 3122 recmutex.o + 1036 122 571 25 0 6352 rit128x96x4.o + 576 86 0 18 0 3080 semtest.o + 276 256 0 0 2048 456 startup_rvmdk.o + 3028 436 20 80 250 22209 tasks.o + 196 32 0 12 0 1272 timertest.o + + ---------------------------------------------------------------------- + 19228 2668 6180 512 26840 147142 Object Totals + 0 0 32 0 0 0 (incl. Generated) + 10 0 5 8 9 0 (incl. Padding) + + ---------------------------------------------------------------------- + + Code (inc. data) RO Data RW Data ZI Data Debug Library Member Name + + 44 6 0 0 0 84 __2sprintf.o + 58 0 0 0 0 0 __dczerorl.o + 8 0 0 0 0 68 __main.o + 284 0 0 0 0 156 __printf_wp.o + 52 8 0 0 0 0 __scatter.o + 28 0 0 0 0 0 __scatter_zi.o + 44 0 0 0 0 108 _printf_char.o + 48 6 0 0 0 96 _printf_char_common.o + 120 18 0 0 0 92 _printf_dec.o + 180 0 0 0 0 88 _printf_intcommon.o + 0 0 0 0 0 0 _printf_percent.o + 4 0 0 0 0 0 _printf_percent_end.o + 6 0 0 0 0 0 _printf_s.o + 82 0 0 0 0 80 _printf_str.o + 6 0 0 0 0 0 _printf_u.o + 10 0 0 0 0 68 _sputc.o + 16 0 0 0 0 68 aeabi_memset.o + 12 0 0 0 0 72 exit.o + 6 0 0 0 0 152 heapauxi.o + 0 0 0 0 0 0 indicate_semi.o + 6 0 0 0 0 0 libinit.o + 2 0 0 0 0 0 libinit2.o + 2 0 0 0 0 0 libshutdown.o + 2 0 0 0 0 0 libshutdown2.o + 8 4 0 0 96 68 libspace.o + 84 0 0 0 0 76 memcmp.o + 8 4 0 0 0 68 rt_fp_status_addr_intlibspace.o + 68 0 0 0 0 68 rt_memclr.o + 78 0 0 0 0 80 rt_memclr_w.o + 138 0 0 0 0 68 rt_memcpy_v6.o + 100 0 0 0 0 80 rt_memcpy_w.o + 0 0 0 0 0 0 rtentry.o + 12 0 0 0 0 0 rtentry2.o + 6 0 0 0 0 0 rtentry4.o + 2 0 0 0 0 0 rtexit.o + 10 0 0 0 0 0 rtexit2.o + 62 0 0 0 0 76 strlen.o + 86 0 0 0 0 76 strncpy.o + 12 4 0 0 0 68 sys_exit.o + 74 0 0 0 0 80 sys_stackheap_outer.o + 2 0 0 0 0 68 use_no_semi.o + 28 0 0 0 0 5171 ethernet.o + 278 0 0 0 0 3540 gpio.o + 144 4 96 0 0 1943 interrupt.o + 138 0 0 0 0 3529 ssi.o + 690 70 156 0 0 4940 sysctl.o + 72 0 0 0 0 2700 timer.o + 14 0 0 0 0 76 fpinit.o + 32 0 0 0 0 14114 context.o + 0 0 1500 0 0 14171 fontcmss12.o + 744 6 0 0 32 16318 image.o + 88 0 0 0 0 1366 line.o + 172 0 0 0 0 920 rectangle.o + 678 0 0 0 0 1899 string.o + + ---------------------------------------------------------------------- + 4872 130 1752 0 128 72695 Library Totals + 24 0 0 0 0 0 (incl. Padding) + + ---------------------------------------------------------------------- + + Code (inc. data) RO Data RW Data ZI Data Debug Library Name + + 1770 50 0 0 96 2008 c_w.l + 1350 74 252 0 0 21823 driverlib.lib + 14 0 0 0 0 76 fz_ws.l + 1714 6 1500 0 32 48788 grlib.lib + + ---------------------------------------------------------------------- + 4872 130 1752 0 128 72695 Library Totals + + ---------------------------------------------------------------------- + +============================================================================== + + + Code (inc. data) RO Data RW Data ZI Data Debug + + 24100 2798 7932 512 26968 209283 Grand Totals + 24100 2798 7932 28 26968 209283 ELF Image Totals (compressed) + 24100 2798 7932 28 0 0 ROM Totals + +============================================================================== + + Total RO Size (Code + RO Data) 32032 ( 31.28kB) + Total RW Size (RW Data + ZI Data) 27480 ( 26.84kB) + Total ROM Size (Code + RO Data + RW Data) 32060 ( 31.31kB) + +============================================================================== + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.plg b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.plg new file mode 100644 index 0000000..ebc3ee6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.plg @@ -0,0 +1,9 @@ + + +
+

µVision Build Log

+

Project:

+C:\home\dwilson\dev\CCS5ws\FreeRTOS\Demo\CORTEX_LM3Sxxxx_IAR_Keil\RTOSDemo.uvproj +Project File Date: 12/01/2011 + +

Output:

diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.sct b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.sct new file mode 100644 index 0000000..79a39c7 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x00000000 0x00040000 { ; load region size_region + ER_IROM1 0x00000000 0x00040000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x00010000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.tra b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.tra new file mode 100644 index 0000000..d81e4f6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/RTOSDemo.tra @@ -0,0 +1,52 @@ +*** Creating Trace Output File '.\rvmdk\RTOSDemo.tra' Ok. +### Preparing for ADS-LD. +### Creating ADS-LD Command Line +### List of Objects: adding '".\rvmdk\blockq.o"' +### List of Objects: adding '".\rvmdk\blocktim.o"' +### List of Objects: adding '".\rvmdk\death.o"' +### List of Objects: adding '".\rvmdk\integer.o"' +### List of Objects: adding '".\rvmdk\main.o"' +### List of Objects: adding '".\rvmdk\partest.o"' +### List of Objects: adding '".\rvmdk\pollq.o"' +### List of Objects: adding '".\rvmdk\semtest.o"' +### List of Objects: adding '".\rvmdk\startup_rvmdk.o"' +### List of Objects: adding '".\rvmdk\timertest.o"' +### List of Objects: adding '".\rvmdk\genqtest.o"' +### List of Objects: adding '".\rvmdk\qpeek.o"' +### List of Objects: adding '".\rvmdk\intqueuetimer.o"' +### List of Objects: adding '".\rvmdk\intqueue.o"' +### List of Objects: adding '".\rvmdk\recmutex.o"' +### List of Objects: adding '".\rvmdk\rit128x96x4.o"' +### List of Objects: adding '"..\Common\drivers\LuminaryMicro\Keil\driverlib.lib"' +### List of Objects: adding '".\rvmdk\formike128x128x16.o"' +### List of Objects: adding '"..\Common\drivers\LuminaryMicro\Keil\grlib.lib"' +### List of Objects: adding '".\rvmdk\tasks.o"' +### List of Objects: adding '".\rvmdk\list.o"' +### List of Objects: adding '".\rvmdk\queue.o"' +### List of Objects: adding '".\rvmdk\port.o"' +### List of Objects: adding '".\rvmdk\heap_2.o"' +### List of Objects: adding '".\rvmdk\osram128x64x4.o"' +### List of Objects: adding '".\rvmdk\uip_task.o"' +### List of Objects: adding '".\rvmdk\emac.o"' +### List of Objects: adding '".\rvmdk\httpd.o"' +### List of Objects: adding '".\rvmdk\httpd-cgi.o"' +### List of Objects: adding '".\rvmdk\httpd-fs.o"' +### List of Objects: adding '".\rvmdk\http-strings.o"' +### List of Objects: adding '".\rvmdk\uip_arp.o"' +### List of Objects: adding '".\rvmdk\psock.o"' +### List of Objects: adding '".\rvmdk\timer.o"' +### List of Objects: adding '".\rvmdk\uip.o"' +### ADS-LD Command completed: +--cpu Cortex-M3 ".\rvmdk\blockq.o" ".\rvmdk\blocktim.o" ".\rvmdk\death.o" ".\rvmdk\integer.o" ".\rvmdk\main.o" ".\rvmdk\partest.o" ".\rvmdk\pollq.o" ".\rvmdk\semtest.o" ".\rvmdk\startup_rvmdk.o" ".\rvmdk\timertest.o" ".\rvmdk\genqtest.o" ".\rvmdk\qpeek.o" ".\rvmdk\intqueuetimer.o" ".\rvmdk\intqueue.o" ".\rvmdk\recmutex.o" ".\rvmdk\rit128x96x4.o" "..\Common\drivers\LuminaryMicro\Keil\driverlib.lib" ".\rvmdk\formike128x128x16.o" "..\Common\drivers\LuminaryMicro\Keil\grlib.lib" ".\rvmdk\tasks.o" ".\rvmdk\list.o" ".\rvmdk\queue.o" ".\rvmdk\port.o" ".\rvmdk\heap_2.o" ".\rvmdk\osram128x64x4.o" ".\rvmdk\uip_task.o" ".\rvmdk\emac.o" ".\rvmdk\httpd.o" ".\rvmdk\httpd-cgi.o" ".\rvmdk\httpd-fs.o" ".\rvmdk\http-strings.o" ".\rvmdk\uip_arp.o" ".\rvmdk\psock.o" ".\rvmdk\timer.o" ".\rvmdk\uip.o" --strict --scatter ".\rvmdk\RTOSDemo.sct" +--entry Reset_Handler --autoat --summary_stderr --info summarysizes --info sizes --info totals + --list ".\rvmdk\RTOSDemo.map" -o ".\rvmdk\RTOSDemo.axf"### Preparing Environment (PrepEnvAds) +### ADS-LD Output File: '.\rvmdk\RTOSDemo.axf' +### ADS-LD Command File: '.\rvmdk\RTOSDemo.lnp' +### Checking for dirty Components... +### Creating CmdFile '.\rvmdk\RTOSDemo.lnp', Handle=0x000004F8 +### Writing '.lnp' file +### ADS-LD Command file '.\rvmdk\RTOSDemo.lnp' is ready. +### ADS-LD: About to start ADS-LD Thread. +### ADS-LD: executed with 0 errors +### Updating obj list +### LDADS_file() completed. diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/blockq.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/blockq.crf new file mode 100644 index 0000000..5196cca Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/blockq.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/blocktim.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/blocktim.crf new file mode 100644 index 0000000..3b63b91 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/blocktim.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/death.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/death.crf new file mode 100644 index 0000000..73c2fbe Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/death.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/emac.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/emac.__i new file mode 100644 index 0000000..704405c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/emac.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\emac.o" --omf_browse ".\rvmdk\emac.crf" --depend ".\rvmdk\emac.d" "webserver\emac.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/emac.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/emac.crf new file mode 100644 index 0000000..93bf01d Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/emac.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/formike128x128x16.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/formike128x128x16.__i new file mode 100644 index 0000000..1243fe1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/formike128x128x16.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\formike128x128x16.o" --omf_browse ".\rvmdk\formike128x128x16.crf" --depend ".\rvmdk\formike128x128x16.d" "formike128x128x16.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/formike128x128x16.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/formike128x128x16.crf new file mode 100644 index 0000000..e23bd97 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/formike128x128x16.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/genqtest.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/genqtest.crf new file mode 100644 index 0000000..d3cc151 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/genqtest.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/heap_2.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/heap_2.__i new file mode 100644 index 0000000..3160c8c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/heap_2.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\heap_2.o" --omf_browse ".\rvmdk\heap_2.crf" --depend ".\rvmdk\heap_2.d" "..\..\Source\portable\MemMang\heap_2.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/heap_2.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/heap_2.crf new file mode 100644 index 0000000..bb4eba2 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/heap_2.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/http-strings.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/http-strings.__i new file mode 100644 index 0000000..6a9a268 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/http-strings.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\http-strings.o" --omf_browse ".\rvmdk\http-strings.crf" --depend ".\rvmdk\http-strings.d" "webserver\http-strings.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/http-strings.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/http-strings.crf new file mode 100644 index 0000000..cd74580 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/http-strings.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-cgi.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-cgi.__i new file mode 100644 index 0000000..c8b71ef --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-cgi.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\httpd-cgi.o" --omf_browse ".\rvmdk\httpd-cgi.crf" --depend ".\rvmdk\httpd-cgi.d" "webserver\httpd-cgi.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-cgi.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-cgi.crf new file mode 100644 index 0000000..2482816 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-cgi.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-fs.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-fs.__i new file mode 100644 index 0000000..62de74e --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-fs.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\httpd-fs.o" --omf_browse ".\rvmdk\httpd-fs.crf" --depend ".\rvmdk\httpd-fs.d" "webserver\httpd-fs.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-fs.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-fs.crf new file mode 100644 index 0000000..6f28e6c Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd-fs.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd.__i new file mode 100644 index 0000000..7ac8d3d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\httpd.o" --omf_browse ".\rvmdk\httpd.crf" --depend ".\rvmdk\httpd.d" "webserver\httpd.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd.crf new file mode 100644 index 0000000..d47ea2e Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/httpd.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/integer.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/integer.crf new file mode 100644 index 0000000..97e0e74 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/integer.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/intqueue.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/intqueue.crf new file mode 100644 index 0000000..2094ca1 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/intqueue.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/intqueuetimer.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/intqueuetimer.crf new file mode 100644 index 0000000..79f0384 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/intqueuetimer.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/list.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/list.__i new file mode 100644 index 0000000..662962b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/list.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\list.o" --omf_browse ".\rvmdk\list.crf" --depend ".\rvmdk\list.d" "..\..\Source\list.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/list.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/list.crf new file mode 100644 index 0000000..ba9fff8 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/list.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/main.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/main.__i new file mode 100644 index 0000000..7c1cff3 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/main.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\main.o" --omf_browse ".\rvmdk\main.crf" --depend ".\rvmdk\main.d" "main.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/main.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/main.crf new file mode 100644 index 0000000..c7fa24c Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/main.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/osram128x64x4.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/osram128x64x4.__i new file mode 100644 index 0000000..a07efc6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/osram128x64x4.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\osram128x64x4.o" --omf_browse ".\rvmdk\osram128x64x4.crf" --depend ".\rvmdk\osram128x64x4.d" "osram128x64x4.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/osram128x64x4.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/osram128x64x4.crf new file mode 100644 index 0000000..b1c5ac2 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/osram128x64x4.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/partest.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/partest.crf new file mode 100644 index 0000000..db9ffc8 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/partest.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/pollq.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/pollq.crf new file mode 100644 index 0000000..8ee4d5a Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/pollq.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/port.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/port.__i new file mode 100644 index 0000000..84ad890 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/port.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\port.o" --omf_browse ".\rvmdk\port.crf" --depend ".\rvmdk\port.d" "..\..\Source\portable\RVDS\ARM_CM3\port.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/port.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/port.crf new file mode 100644 index 0000000..8fd5549 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/port.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/psock.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/psock.__i new file mode 100644 index 0000000..81742f7 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/psock.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\psock.o" --omf_browse ".\rvmdk\psock.crf" --depend ".\rvmdk\psock.d" "..\Common\ethernet\uIP\uip-1.0\uip\psock.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/psock.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/psock.crf new file mode 100644 index 0000000..c5ef03e Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/psock.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/qpeek.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/qpeek.crf new file mode 100644 index 0000000..953808e Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/qpeek.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/queue.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/queue.__i new file mode 100644 index 0000000..7256e84 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/queue.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\queue.o" --omf_browse ".\rvmdk\queue.crf" --depend ".\rvmdk\queue.d" "..\..\Source\queue.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/queue.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/queue.crf new file mode 100644 index 0000000..83bc6be Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/queue.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/recmutex.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/recmutex.crf new file mode 100644 index 0000000..8905d60 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/recmutex.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/rit128x96x4.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/rit128x96x4.crf new file mode 100644 index 0000000..8d1bf1e Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/rit128x96x4.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/semtest.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/semtest.crf new file mode 100644 index 0000000..f38f94b Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/semtest.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/tasks.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/tasks.__i new file mode 100644 index 0000000..d05cd48 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/tasks.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\tasks.o" --omf_browse ".\rvmdk\tasks.crf" --depend ".\rvmdk\tasks.d" "..\..\Source\tasks.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/tasks.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/tasks.crf new file mode 100644 index 0000000..dca898f Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/tasks.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timer.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timer.__i new file mode 100644 index 0000000..30e1462 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timer.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\timer.o" --omf_browse ".\rvmdk\timer.crf" --depend ".\rvmdk\timer.d" "..\Common\ethernet\uIP\uip-1.0\uip\timer.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timer.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timer.crf new file mode 100644 index 0000000..e3c960b Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timer.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timertest.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timertest.crf new file mode 100644 index 0000000..9b17f93 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/timertest.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip.__i new file mode 100644 index 0000000..3c6f379 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\uip.o" --omf_browse ".\rvmdk\uip.crf" --depend ".\rvmdk\uip.d" "..\Common\ethernet\uIP\uip-1.0\uip\uip.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip.crf new file mode 100644 index 0000000..27f3a59 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_arp.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_arp.__i new file mode 100644 index 0000000..f3ec4a5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_arp.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\uip_arp.o" --omf_browse ".\rvmdk\uip_arp.crf" --depend ".\rvmdk\uip_arp.d" "..\Common\ethernet\uIP\uip-1.0\uip\uip_arp.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_arp.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_arp.crf new file mode 100644 index 0000000..f2abf22 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_arp.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_task.__i b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_task.__i new file mode 100644 index 0000000..b546891 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_task.__i @@ -0,0 +1 @@ +-c --cpu Cortex-M3 -g -O0 --apcs=interwork --split_sections -I. -I.\..\Common\drivers\LuminaryMicro -I..\..\Source\portable\RVDS\ARM_CM3 -I..\..\Source\include -I..\Common\include -I..\Common\ethernet\uIP\uip-1.0\uip -I.\webserver --diag_suppress 191,550,513,167,177,144 -I "C:\Keil\ARM\CMSIS\Include" -I "C:\Keil\ARM\INC\Luminary" -DRVDS_ARMCM3_LM3S102 -DPACK_STRUCT_END= -DALIGN_STRUCT_END= -o ".\rvmdk\uip_task.o" --omf_browse ".\rvmdk\uip_task.crf" --depend ".\rvmdk\uip_task.d" "webserver\uIP_Task.c" \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_task.crf b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_task.crf new file mode 100644 index 0000000..2d0d0b7 Binary files /dev/null and b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/rvmdk/uip_task.crf differ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.cspy.bat b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.cspy.bat new file mode 100644 index 0000000..9d325f6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.cspy.bat @@ -0,0 +1,24 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +"C:\devtools\IAR Systems\Embedded Workbench 6.5\common\bin\cspybat" "C:\devtools\IAR Systems\Embedded Workbench 6.5\arm\bin\armproc.dll" "C:\devtools\IAR Systems\Embedded Workbench 6.5\arm\bin\armlmiftdi.dll" %1 --plugin "C:\devtools\IAR Systems\Embedded Workbench 6.5\arm\bin\armbat.dll" --flash_loader "C:\devtools\IAR Systems\Embedded Workbench 6.5\arm\config\flashloader\TexasInstruments\FlashLM3Sx8xx.board" --backend -B "--endian=little" "--cpu=Cortex-M3" "--fpu=None" "-p" "C:\devtools\IAR Systems\Embedded Workbench 6.5\arm\CONFIG\debugger\TexasInstruments\LM3S6965.ddf" "--drv_verify_download" "--semihosting=none" "--device=LM3S6965" "--lmiftdi_speed=500" + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.dbgdt b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.dbgdt new file mode 100644 index 0000000..81fb875 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.dbgdt @@ -0,0 +1,80 @@ + + + + + + 201622 + + 20 + 1006 + 268 + 67 + + + + + + + + 164272727 + + + + + + + + 200 + + + 10Disassembly_I05002000 + 200100100100100 + + + + + + + TabID-10465-12018 + Debug Log + Debug-Log + + + + TabID-9942-12028 + Build + Build + + + TabID-31294-227BreakpointsBreakpoints + + 0 + + + TabID-21213-12021 + Workspace + Workspace + + + RTOSDemoRTOSDemo/Demo filesRTOSDemo/System filesRTOSDemo/uIP files + + + + 0 + + + + + + TextEditor$WS_DIR$\main.c00000457110051100500100000010000001 + + + + + + + iaridepm.enu1debuggergui.enu1-2-2740238-2-2240200142857203666142857755601-2-21981682-2-216842001002381203666142857203666 + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.dni b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.dni new file mode 100644 index 0000000..b77749e --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.dni @@ -0,0 +1,61 @@ +[CodeCoverage] +Enabled=_ 0 +[DisAssemblyWindow] +NumStates=_ 1 +State 1=_ 1 +[Profiling] +Enabled=0 +[StackPlugin] +Enabled=1 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnHow=0 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[Stack] +FillEnabled=0 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnLogOnly=1 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[LMIFTDIDriver] +LMI_ResetMode=0x00000000 +[DebugChecksum] +Checksum=-1311150949 +[Exceptions] +StopOnUncaught=_ 0 +StopOnThrow=_ 0 +[CallStack] +ShowArgs=0 +[Disassembly] +MixedMode=1 +[Log file] +LoggingEnabled=_ 0 +LogFile=_ "" +Category=_ 0 +[TermIOLog] +LoggingEnabled=_ 0 +LogFile=_ "" +[CallStackLog] +Enabled=0 +[DriverProfiling] +Enabled=0 +Mode=0 +Graph=0 +Symbiont=0 +Exclusions= +[Disassemble mode] +mode=1 +[Breakpoints] +Bp0=_ "STD_CODE" "{$PROJ_DIR$\main.c}.489.3" 1 0 0 0 "" 0 "" +Count=1 +[Aliases] +Count=0 +SuppressDialog=0 diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.wsdt b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.wsdt new file mode 100644 index 0000000..c5db75f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/settings/RTOSDemo.wsdt @@ -0,0 +1,49 @@ + + + + + + RTOSDemo/Debug + + + + + + + + + 241272727 + + 4826882619100726867 + + + + + + TabID-18883-22024 + Workspace + Workspace + + + RTOSDemoRTOSDemo/Demo filesRTOSDemo/Scheduler files + + + + 0TabID-29040-7360Find in FilesFind-in-FilesTabID-19024-10413BuildBuildTabID-19202-19100Debug LogDebug-Log1 + + + + + + TextEditor$WS_DIR$\main.c00000443110051100500100000010000001 + + + + + + + iaridepm.enu1-2-2719315-2-2200200119048203666188690734216-2-22191682-2-216842211002381225051119048203666 + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/startup_ewarm.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/startup_ewarm.c new file mode 100644 index 0000000..dfb51d9 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/startup_ewarm.c @@ -0,0 +1,219 @@ +//***************************************************************************** +// +// startup_ewarm.c - Boot code for Stellaris. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 100 of the Stellaris Ethernet +// Applications Library. +// +//***************************************************************************** + +//***************************************************************************** +// +// Enable the IAR extensions for this source file. +// +//***************************************************************************** +#pragma language=extended + +//***************************************************************************** +// +// Forward declaration of the default fault handlers. +// +//***************************************************************************** +static void NmiSR(void); +static void FaultISR(void); +static void IntDefaultHandler(void); + +//***************************************************************************** +// +// External declaration for the interrupt handler used by the application. +// +//***************************************************************************** + + +//***************************************************************************** +// +// The entry point for the application. +// +//***************************************************************************** +extern void __iar_program_start(void); +extern void xPortPendSVHandler(void); +extern void xPortSysTickHandler(void); +extern void vPortSVCHandler(void); +extern void vT2InterruptHandler( void ); +extern void vT3InterruptHandler( void ); +extern void vEMAC_ISR( void ); +extern void Timer0IntHandler( void ); + +//***************************************************************************** +// +// Reserve space for the system stack. +// +//***************************************************************************** +#ifndef STACK_SIZE +#define STACK_SIZE 120 +#endif +static unsigned long pulStack[STACK_SIZE] @ ".noinit"; + +//***************************************************************************** +// +// A union that describes the entries of the vector table. The union is needed +// since the first entry is the stack pointer and the remainder are function +// pointers. +// +//***************************************************************************** +typedef union +{ + void (*pfnHandler)(void); + unsigned long ulPtr; +} +uVectorEntry; + +//***************************************************************************** +// +// The minimal vector table for a Cortex-M3. Note that the proper constructs +// must be placed on this to ensure that it ends up at physical address +// 0x0000.0000. +// +//***************************************************************************** +__root const uVectorEntry __vector_table[] @ ".intvec" = +{ + { .ulPtr = (unsigned long)pulStack + sizeof(pulStack) }, + // The initial stack pointer + __iar_program_start, // The reset handler + NmiSR, // The NMI handler + FaultISR, // The hard fault handler + IntDefaultHandler, // The MPU fault handler + IntDefaultHandler, // The bus fault handler + IntDefaultHandler, // The usage fault handler + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + vPortSVCHandler, // SVCall handler + IntDefaultHandler, // Debug monitor handler + 0, // Reserved + xPortPendSVHandler, // The PendSV handler + xPortSysTickHandler, // The SysTick handler + IntDefaultHandler, // GPIO Port A + IntDefaultHandler, // GPIO Port B + IntDefaultHandler, // GPIO Port C + IntDefaultHandler, // GPIO Port D + IntDefaultHandler, // GPIO Port E + IntDefaultHandler, // UART0 Rx and Tx + IntDefaultHandler, // UART1 Rx and Tx + IntDefaultHandler, // SSI Rx and Tx + IntDefaultHandler, // I2C Master and Slave + IntDefaultHandler, // PWM Fault + IntDefaultHandler, // PWM Generator 0 + IntDefaultHandler, // PWM Generator 1 + IntDefaultHandler, // PWM Generator 2 + IntDefaultHandler, // Quadrature Encoder + IntDefaultHandler, // ADC Sequence 0 + IntDefaultHandler, // ADC Sequence 1 + IntDefaultHandler, // ADC Sequence 2 + IntDefaultHandler, // ADC Sequence 3 + IntDefaultHandler, // Watchdog timer + Timer0IntHandler, // Timer 0 subtimer A + IntDefaultHandler, // Timer 0 subtimer B + IntDefaultHandler, // Timer 1 subtimer A + IntDefaultHandler, // Timer 1 subtimer B + vT2InterruptHandler, // Timer 2 subtimer A + IntDefaultHandler, // Timer 2 subtimer B + IntDefaultHandler, // Analog Comparator 0 + IntDefaultHandler, // Analog Comparator 1 + IntDefaultHandler, // Analog Comparator 2 + IntDefaultHandler, // System Control (PLL, OSC, BO) + IntDefaultHandler, // FLASH Control + IntDefaultHandler, // GPIO Port F + IntDefaultHandler, // GPIO Port G + IntDefaultHandler, // GPIO Port H + IntDefaultHandler, // UART2 Rx and Tx + IntDefaultHandler, // SSI1 Rx and Tx + vT3InterruptHandler, // Timer 3 subtimer A + IntDefaultHandler, // Timer 3 subtimer B + IntDefaultHandler, // I2C1 Master and Slave + IntDefaultHandler, // Quadrature Encoder 1 + IntDefaultHandler, // CAN0 + IntDefaultHandler, // CAN1 + IntDefaultHandler, // CAN2 + vEMAC_ISR, // Ethernet + IntDefaultHandler, // Hibernate + IntDefaultHandler, // USB0 + IntDefaultHandler, // PWM Generator 3 + IntDefaultHandler, // uDMA Software Transfer + IntDefaultHandler // uDMA Error +}; + + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a NMI. This +// simply enters an infinite loop, preserving the system state for examination +// by a debugger. +// +//***************************************************************************** +static void +NmiSR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives a fault +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +FaultISR(void) +{ + // + // Enter an infinite loop. + // + while(1) + { + } +} + +//***************************************************************************** +// +// This is the code that gets called when the processor receives an unexpected +// interrupt. This simply enters an infinite loop, preserving the system state +// for examination by a debugger. +// +//***************************************************************************** +static void +IntDefaultHandler(void) +{ + // + // Go into an infinite loop. + // + while(1) + { + } +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/startup_rvmdk.S b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/startup_rvmdk.S new file mode 100644 index 0000000..b7077b1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/startup_rvmdk.S @@ -0,0 +1,251 @@ +; <<< Use Configuration Wizard in Context Menu >>> +;****************************************************************************** +; +; startup_rvmdk.S - Startup code for use with Keil's uVision. +; +; Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +; +; Software License Agreement +; +; Luminary Micro, Inc. (LMI) is supplying this software for use solely and +; exclusively on LMI's microcontroller products. +; +; The software is owned by LMI and/or its suppliers, and is protected under +; applicable copyright laws. All rights are reserved. Any use in violation +; of the foregoing restrictions may subject the user to criminal sanctions +; under applicable laws, as well as to civil liability for the breach of the +; terms and conditions of this license. +; +; THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +; OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +; MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +; LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +; CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +; +; This is part of revision 1408 of the Stellaris Peripheral Driver Library. +; +;****************************************************************************** + +;****************************************************************************** +; +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Stack EQU 0x00000800 + +;****************************************************************************** +; +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; +;****************************************************************************** +Heap EQU 0x00000000 + +;****************************************************************************** +; +; Allocate space for the stack. +; +;****************************************************************************** + AREA STACK, NOINIT, READWRITE, ALIGN=3 +StackMem + SPACE Stack +__initial_sp + +;****************************************************************************** +; +; Allocate space for the heap. +; +;****************************************************************************** + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +HeapMem + SPACE Heap +__heap_limit + +;****************************************************************************** +; +; Indicate that the code in this file preserves 8-byte alignment of the stack. +; +;****************************************************************************** + PRESERVE8 + +;****************************************************************************** +; +; Place code into the reset code section. +; +;****************************************************************************** + AREA RESET, CODE, READONLY + THUMB + +;****************************************************************************** +; +; The vector table. +; +;****************************************************************************** + EXPORT __Vectors +__Vectors + DCD StackMem + Stack ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NmiSR ; NMI Handler + DCD FaultISR ; Hard Fault Handler + DCD IntDefaultHandler ; MPU Fault Handler + DCD IntDefaultHandler ; Bus Fault Handler + DCD IntDefaultHandler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + EXTERN vPortSVCHandler + DCD vPortSVCHandler ; SVCall Handler + DCD IntDefaultHandler ; Debug Monitor Handler + DCD 0 ; Reserved + EXTERN xPortPendSVHandler + DCD xPortPendSVHandler ; PendSV Handler + EXTERN xPortSysTickHandler + DCD xPortSysTickHandler ; SysTick Handler + DCD IntDefaultHandler ; GPIO Port A + DCD IntDefaultHandler ; GPIO Port B + DCD IntDefaultHandler ; GPIO Port C + DCD IntDefaultHandler ; GPIO Port D + DCD IntDefaultHandler ; GPIO Port E + DCD IntDefaultHandler ; UART0 + DCD IntDefaultHandler ; UART1 + DCD IntDefaultHandler ; SSI + DCD IntDefaultHandler ; I2C + DCD IntDefaultHandler ; PWM Fault + DCD IntDefaultHandler ; PWM Generator 0 + DCD IntDefaultHandler ; PWM Generator 1 + DCD IntDefaultHandler ; PWM Generator 2 + DCD IntDefaultHandler ; Quadrature Encoder + DCD IntDefaultHandler ; ADC Sequence 0 + DCD IntDefaultHandler ; ADC Sequence 1 + DCD IntDefaultHandler ; ADC Sequence 2 + DCD IntDefaultHandler ; ADC Sequence 3 + DCD IntDefaultHandler ; Watchdog + EXTERN Timer0IntHandler + DCD Timer0IntHandler ; Timer 0A + DCD IntDefaultHandler ; Timer 0B + DCD IntDefaultHandler ; Timer 1A + DCD IntDefaultHandler ; Timer 1B + EXTERN vT2InterruptHandler + DCD vT2InterruptHandler ; Timer 2A + DCD IntDefaultHandler ; Timer 2B + DCD IntDefaultHandler ; Comp 0 + DCD IntDefaultHandler ; Comp 1 + DCD IntDefaultHandler ; Comp 2 + DCD IntDefaultHandler ; System Control + DCD IntDefaultHandler ; Flash Control + DCD IntDefaultHandler ; GPIO Port F + DCD IntDefaultHandler ; GPIO Port G + DCD IntDefaultHandler ; GPIO Port H + DCD IntDefaultHandler ; UART2 Rx and Tx + DCD IntDefaultHandler ; SSI1 Rx and Tx + EXTERN vT3InterruptHandler + DCD vT3InterruptHandler ; Timer 3 subtimer A + DCD IntDefaultHandler ; Timer 3 subtimer B + DCD IntDefaultHandler ; I2C1 Master and Slave + DCD IntDefaultHandler ; Quadrature Encoder 1 + DCD IntDefaultHandler ; CAN0 + DCD IntDefaultHandler ; CAN1 + DCD 0 ; Reserved + EXTERN vEMAC_ISR + DCD vEMAC_ISR ; Ethernet + DCD IntDefaultHandler ; Hibernate + +;****************************************************************************** +; +; This is the code that gets called when the processor first starts execution +; following a reset event. +; +;****************************************************************************** + EXPORT Reset_Handler +Reset_Handler + ; + ; Call the C library enty point that handles startup. This will copy + ; the .data section initializers from flash to SRAM and zero fill the + ; .bss section. It will then call __rt_entry, which will be either the + ; C library version or the one supplied here depending on the + ; configured startup type. + ; + IMPORT __main + B __main + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a NMI. This +; simply enters an infinite loop, preserving the system state for examination +; by a debugger. +; +;****************************************************************************** +NmiSR + B NmiSR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives a fault +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +FaultISR + B FaultISR + +;****************************************************************************** +; +; This is the code that gets called when the processor receives an unexpected +; interrupt. This simply enters an infinite loop, preserving the system state +; for examination by a debugger. +; +;****************************************************************************** +IntDefaultHandler + B IntDefaultHandler + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Some code in the normal code section for initializing the heap and stack. +; +;****************************************************************************** + AREA |.text|, CODE, READONLY + +;****************************************************************************** +; +; The function expected of the C library startup code for defining the stack +; and heap memory locations. For the C library version of the startup code, +; provide this function so that the C library initialization code can find out +; the location of the stack and heap. +; +;****************************************************************************** + IF :DEF: __MICROLIB + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + ELSE + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap +__user_initial_stackheap + LDR R0, =HeapMem + LDR R1, =(StackMem + Stack) + LDR R2, =(HeapMem + Heap) + LDR R3, =StackMem + BX LR + ENDIF + +;****************************************************************************** +; +; Make sure the end of this section is aligned. +; +;****************************************************************************** + ALIGN + +;****************************************************************************** +; +; Tell the assembler that we're done. +; +;****************************************************************************** + END diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/timertest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/timertest.c new file mode 100644 index 0000000..9c65f38 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/timertest.c @@ -0,0 +1,170 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* High speed timer test as described in main.c. */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Library includes. */ +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "interrupt.h" +#include "sysctl.h" +#include "lmi_timer.h" +#include "hw_timer.h" + +/* The set frequency of the interrupt. Deviations from this are measured as +the jitter. */ +#define timerINTERRUPT_FREQUENCY ( 20000UL ) + +/* The expected time between each of the timer interrupts - if the jitter was +zero. */ +#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY ) + +/* The highest available interrupt priority. */ +#define timerHIGHEST_PRIORITY ( 0 ) + +/* Misc defines. */ +#define timerMAX_32BIT_VALUE ( 0xffffffffUL ) +#define timerTIMER_1_COUNT_VALUE ( * ( ( volatile unsigned long * ) ( ( unsigned portLONG ) TIMER1_BASE + 0x48UL ) ) ) + +/*-----------------------------------------------------------*/ + +/* Interrupt handler in which the jitter is measured. */ +void Timer0IntHandler( void ); + +/* Stores the value of the maximum recorded jitter between interrupts. */ +volatile unsigned portLONG ulMaxJitter = 0; + +/*-----------------------------------------------------------*/ + +void vSetupHighFrequencyTimer( void ) +{ +unsigned long ulFrequency; + + /* Timer zero is used to generate the interrupts, and timer 1 is used + to measure the jitter. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 ); + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 ); + TimerConfigure( TIMER0_BASE, TIMER_CFG_32_BIT_PER ); + TimerConfigure( TIMER1_BASE, TIMER_CFG_32_BIT_PER ); + + /* Set the timer interrupt to be above the kernel - highest. */ + IntPrioritySet( INT_TIMER0A, timerHIGHEST_PRIORITY ); + + /* Just used to measure time. */ + TimerLoadSet(TIMER1_BASE, TIMER_A, timerMAX_32BIT_VALUE ); + + /* Ensure interrupts do not start until the scheduler is running. */ + portDISABLE_INTERRUPTS(); + + /* The rate at which the timer will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY; + TimerLoadSet( TIMER0_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER0A ); + TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); + + /* Enable both timers. */ + TimerEnable( TIMER0_BASE, TIMER_A ); + TimerEnable( TIMER1_BASE, TIMER_A ); +} +/*-----------------------------------------------------------*/ + +void Timer0IntHandler( void ) +{ +unsigned portLONG ulDifference; +volatile unsigned portLONG ulCurrentCount; +static unsigned portLONG ulMaxDifference = 0, ulLastCount = 0; + + /* We use the timer 1 counter value to measure the clock cycles between + the timer 0 interrupts. */ + ulCurrentCount = timerTIMER_1_COUNT_VALUE; + + TimerIntClear( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); + + if( ulCurrentCount < ulLastCount ) + { + /* How many times has timer 1 counted since the last interrupt? */ + ulDifference = ulLastCount - ulCurrentCount; + + /* Is this the largest difference we have measured yet? */ + if( ulDifference > ulMaxDifference ) + { + ulMaxDifference = ulDifference; + ulMaxJitter = ulMaxDifference - timerEXPECTED_DIFFERENCE_VALUE; + } + } + + ulLastCount = ulCurrentCount; +} + + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/Makefile.webserver b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/Makefile.webserver new file mode 100644 index 0000000..f38c47a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/Makefile.webserver @@ -0,0 +1 @@ +APP_SOURCES += httpd.c http-strings.c httpd-fs.c httpd-cgi.c diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/clock-arch.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/clock-arch.h new file mode 100644 index 0000000..cde657b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/clock-arch.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +#include "FreeRTOS.h" + +typedef unsigned long clock_time_t; +#define CLOCK_CONF_SECOND configTICK_RATE_HZ + +#endif /* __CLOCK_ARCH_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/emac.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/emac.c new file mode 100644 index 0000000..8570d66 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/emac.c @@ -0,0 +1,318 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "semphr.h" +#include "task.h" + +/* Demo includes. */ +#include "emac.h" + +/* uIP includes. */ +#include "uip.h" + +/* Hardware library includes. */ +#include "hw_types.h" +#include "hw_memmap.h" +#include "hw_ints.h" +#include "hw_ethernet.h" +#include "ethernet.h" +#include "interrupt.h" + +#define emacNUM_RX_BUFFERS 5 +#define emacFRAM_SIZE_BYTES 2 +#define macNEGOTIATE_DELAY 2000 +#define macWAIT_SEND_TIME ( 10 ) + +/* The task that handles the MAC peripheral. This is created at a high +priority and is effectively a deferred interrupt handler. The peripheral +handling is deferred to a task to prevent the entire FIFO having to be read +from within an ISR. */ +void vMACHandleTask( void *pvParameters ); + +/*-----------------------------------------------------------*/ + +/* The semaphore used to wake the uIP task when data arrives. */ +xSemaphoreHandle xEMACSemaphore = NULL; + +/* The semaphore used to wake the interrupt handler task. The peripheral +is processed at the task level to prevent the need to read the entire FIFO from +within the ISR itself. */ +xSemaphoreHandle xMACInterruptSemaphore = NULL; + +/* The buffer used by the uIP stack. In this case the pointer is used to +point to one of the Rx buffers. */ +unsigned portCHAR *uip_buf; + +/* Buffers into which Rx data is placed. */ +static union +{ + unsigned portLONG ulJustForAlignment; + unsigned portCHAR ucRxBuffers[ emacNUM_RX_BUFFERS ][ UIP_BUFSIZE + ( 4 * emacFRAM_SIZE_BYTES ) ]; +} uxRxBuffers; + +/* The length of the data within each of the Rx buffers. */ +static unsigned portLONG ulRxLength[ emacNUM_RX_BUFFERS ]; + +/* Used to keep a track of the number of bytes to transmit. */ +static unsigned portLONG ulNextTxSpace; + +/*-----------------------------------------------------------*/ + +portBASE_TYPE vInitEMAC( void ) +{ +unsigned long ulTemp; +portBASE_TYPE xReturn; + + /* Ensure all interrupts are disabled. */ + EthernetIntDisable( ETH_BASE, ( ETH_INT_PHY | ETH_INT_MDIO | ETH_INT_RXER | ETH_INT_RXOF | ETH_INT_TX | ETH_INT_TXER | ETH_INT_RX)); + + /* Clear any interrupts that were already pending. */ + ulTemp = EthernetIntStatus( ETH_BASE, pdFALSE ); + EthernetIntClear( ETH_BASE, ulTemp ); + + /* Initialise the MAC and connect. */ + EthernetInit( ETH_BASE ); + EthernetConfigSet( ETH_BASE, ( ETH_CFG_TX_DPLXEN | ETH_CFG_TX_CRCEN | ETH_CFG_TX_PADEN ) ); + EthernetEnable( ETH_BASE ); + + /* Mark each Rx buffer as empty. */ + for( ulTemp = 0; ulTemp < emacNUM_RX_BUFFERS; ulTemp++ ) + { + ulRxLength[ ulTemp ] = 0; + } + + /* Create the queue and task used to defer the MAC processing to the + task level. */ + vSemaphoreCreateBinary( xMACInterruptSemaphore ); + xSemaphoreTake( xMACInterruptSemaphore, 0 ); + xReturn = xTaskCreate( vMACHandleTask, ( signed portCHAR * ) "MAC", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL ); + vTaskDelay( macNEGOTIATE_DELAY ); + + /* We are only interested in Rx interrupts. */ + IntPrioritySet( INT_ETH, configKERNEL_INTERRUPT_PRIORITY ); + IntEnable( INT_ETH ); + EthernetIntEnable(ETH_BASE, ETH_INT_RX); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned int uiGetEMACRxData( unsigned char *ucBuffer ) +{ +static unsigned long ulNextRxBuffer = 0; +unsigned int iLen; + + iLen = ulRxLength[ ulNextRxBuffer ]; + + if( iLen != 0 ) + { + /* Leave room for the size at the start of the buffer. */ + uip_buf = &( uxRxBuffers.ucRxBuffers[ ulNextRxBuffer ][ 2 ] ); + + ulRxLength[ ulNextRxBuffer ] = 0; + + ulNextRxBuffer++; + if( ulNextRxBuffer >= emacNUM_RX_BUFFERS ) + { + ulNextRxBuffer = 0; + } + } + + return iLen; +} +/*-----------------------------------------------------------*/ + +void vInitialiseSend( void ) +{ + /* Set the index to the first byte to send - skipping over the size + bytes. */ + ulNextTxSpace = 2; +} +/*-----------------------------------------------------------*/ + +void vIncrementTxLength( unsigned portLONG ulLength ) +{ + ulNextTxSpace += ulLength; +} +/*-----------------------------------------------------------*/ + +void vSendBufferToMAC( void ) +{ +unsigned long *pulSource; +unsigned portSHORT * pus; +unsigned portLONG ulNextWord; + + /* Locate the data to be send. */ + pus = ( unsigned portSHORT * ) uip_buf; + + /* Add in the size of the data. */ + pus--; + *pus = ulNextTxSpace; + + /* Wait for data to be sent if there is no space immediately. */ + while( !EthernetSpaceAvail( ETH_BASE ) ) + { + vTaskDelay( macWAIT_SEND_TIME ); + } + + pulSource = ( unsigned portLONG * ) pus; + + for( ulNextWord = 0; ulNextWord < ulNextTxSpace; ulNextWord += sizeof( unsigned portLONG ) ) + { + HWREG(ETH_BASE + MAC_O_DATA) = *pulSource; + pulSource++; + } + + /* Go. */ + HWREG( ETH_BASE + MAC_O_TR ) = MAC_TR_NEWTX; +} +/*-----------------------------------------------------------*/ + +void vEMAC_ISR( void ) +{ +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; +unsigned portLONG ulTemp; + + /* Clear the interrupt. */ + ulTemp = EthernetIntStatus( ETH_BASE, pdFALSE ); + EthernetIntClear( ETH_BASE, ulTemp ); + + /* Was it an Rx interrupt? */ + if( ulTemp & ETH_INT_RX ) + { + xSemaphoreGiveFromISR( xMACInterruptSemaphore, &xHigherPriorityTaskWoken ); + EthernetIntDisable( ETH_BASE, ETH_INT_RX ); + } + + /* Switch to the uIP task. */ + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + +void vMACHandleTask( void *pvParameters ) +{ +unsigned long i, ulInt; +unsigned portLONG ulLength; +unsigned long *pulBuffer; +static unsigned portLONG ulNextRxBuffer = 0; + + for( ;; ) + { + /* Wait for something to do. */ + xSemaphoreTake( xMACInterruptSemaphore, portMAX_DELAY ); + + while( ( ulInt = ( EthernetIntStatus( ETH_BASE, pdFALSE ) & ETH_INT_RX ) ) != 0 ) + { + ulLength = HWREG( ETH_BASE + MAC_O_DATA ); + + /* Leave room at the start of the buffer for the size. */ + pulBuffer = ( unsigned long * ) &( uxRxBuffers.ucRxBuffers[ ulNextRxBuffer ][ 2 ] ); + *pulBuffer = ( ulLength >> 16 ); + + /* Get the size of the data. */ + pulBuffer = ( unsigned long * ) &( uxRxBuffers.ucRxBuffers[ ulNextRxBuffer ][ 4 ] ); + ulLength &= 0xFFFF; + + if( ulLength > 4 ) + { + ulLength -= 4; + + if( ulLength >= UIP_BUFSIZE ) + { + /* The data won't fit in our buffer. Ensure we don't + try to write into the buffer. */ + ulLength = 0; + } + + /* Read out the data into our buffer. */ + for( i = 0; i < ulLength; i += sizeof( unsigned portLONG ) ) + { + *pulBuffer = HWREG( ETH_BASE + MAC_O_DATA ); + pulBuffer++; + } + + /* Store the length of the data into the separate array. */ + ulRxLength[ ulNextRxBuffer ] = ulLength; + + /* Use the next buffer the next time through. */ + ulNextRxBuffer++; + if( ulNextRxBuffer >= emacNUM_RX_BUFFERS ) + { + ulNextRxBuffer = 0; + } + + /* Ensure the uIP task is not blocked as data has arrived. */ + xSemaphoreGive( xEMACSemaphore ); + } + } + + EthernetIntEnable( ETH_BASE, ETH_INT_RX ); + + ( void ) ulInt; + } +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/emac.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/emac.h new file mode 100644 index 0000000..a49b598 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/emac.h @@ -0,0 +1,322 @@ +/*---------------------------------------------------------------------------- + * LPC2378 Ethernet Definitions + *---------------------------------------------------------------------------- + * Name: EMAC.H + * Purpose: Philips LPC2378 EMAC hardware definitions + *---------------------------------------------------------------------------- + * Copyright (c) 2006 KEIL - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ +#ifndef __EMAC_H +#define __EMAC_H + +/* MAC address definition. The MAC address must be unique on the network. */ +#define emacETHADDR0 0 +#define emacETHADDR1 0xbd +#define emacETHADDR2 0x33 +#define emacETHADDR3 0x02 +#define emacETHADDR4 0x64 +#define emacETHADDR5 0x24 + + +/* EMAC Memory Buffer configuration for 16K Ethernet RAM. */ +#define NUM_RX_FRAG 4 /* Num.of RX Fragments 4*1536= 6.0kB */ +#define NUM_TX_FRAG 2 /* Num.of TX Fragments 2*1536= 3.0kB */ +#define ETH_FRAG_SIZE 1536 /* Packet Fragment size 1536 Bytes */ + +#define ETH_MAX_FLEN 1536 /* Max. Ethernet Frame Size */ + +/* EMAC variables located in 16K Ethernet SRAM */ +#define RX_DESC_BASE 0x7FE00000 +#define RX_STAT_BASE (RX_DESC_BASE + NUM_RX_FRAG*8) +#define TX_DESC_BASE (RX_STAT_BASE + NUM_RX_FRAG*8) +#define TX_STAT_BASE (TX_DESC_BASE + NUM_TX_FRAG*8) +#define RX_BUF_BASE (TX_STAT_BASE + NUM_TX_FRAG*4) +#define TX_BUF_BASE (RX_BUF_BASE + NUM_RX_FRAG*ETH_FRAG_SIZE) + +/* RX and TX descriptor and status definitions. */ +#define RX_DESC_PACKET(i) (*(unsigned int *)(RX_DESC_BASE + 8*i)) +#define RX_DESC_CTRL(i) (*(unsigned int *)(RX_DESC_BASE+4 + 8*i)) +#define RX_STAT_INFO(i) (*(unsigned int *)(RX_STAT_BASE + 8*i)) +#define RX_STAT_HASHCRC(i) (*(unsigned int *)(RX_STAT_BASE+4 + 8*i)) +#define TX_DESC_PACKET(i) (*(unsigned int *)(TX_DESC_BASE + 8*i)) +#define TX_DESC_CTRL(i) (*(unsigned int *)(TX_DESC_BASE+4 + 8*i)) +#define TX_STAT_INFO(i) (*(unsigned int *)(TX_STAT_BASE + 4*i)) +#define RX_BUF(i) (RX_BUF_BASE + ETH_FRAG_SIZE*i) +#define TX_BUF(i) (TX_BUF_BASE + ETH_FRAG_SIZE*i) + +/* MAC Configuration Register 1 */ +#define MAC1_REC_EN 0x00000001 /* Receive Enable */ +#define MAC1_PASS_ALL 0x00000002 /* Pass All Receive Frames */ +#define MAC1_RX_FLOWC 0x00000004 /* RX Flow Control */ +#define MAC1_TX_FLOWC 0x00000008 /* TX Flow Control */ +#define MAC1_LOOPB 0x00000010 /* Loop Back Mode */ +#define MAC1_RES_TX 0x00000100 /* Reset TX Logic */ +#define MAC1_RES_MCS_TX 0x00000200 /* Reset MAC TX Control Sublayer */ +#define MAC1_RES_RX 0x00000400 /* Reset RX Logic */ +#define MAC1_RES_MCS_RX 0x00000800 /* Reset MAC RX Control Sublayer */ +#define MAC1_SIM_RES 0x00004000 /* Simulation Reset */ +#define MAC1_SOFT_RES 0x00008000 /* Soft Reset MAC */ + +/* MAC Configuration Register 2 */ +#define MAC2_FULL_DUP 0x00000001 /* Full Duplex Mode */ +#define MAC2_FRM_LEN_CHK 0x00000002 /* Frame Length Checking */ +#define MAC2_HUGE_FRM_EN 0x00000004 /* Huge Frame Enable */ +#define MAC2_DLY_CRC 0x00000008 /* Delayed CRC Mode */ +#define MAC2_CRC_EN 0x00000010 /* Append CRC to every Frame */ +#define MAC2_PAD_EN 0x00000020 /* Pad all Short Frames */ +#define MAC2_VLAN_PAD_EN 0x00000040 /* VLAN Pad Enable */ +#define MAC2_ADET_PAD_EN 0x00000080 /* Auto Detect Pad Enable */ +#define MAC2_PPREAM_ENF 0x00000100 /* Pure Preamble Enforcement */ +#define MAC2_LPREAM_ENF 0x00000200 /* Long Preamble Enforcement */ +#undef MAC2_NO_BACKOFF /* Remove compiler warning. */ +#define MAC2_NO_BACKOFF 0x00001000 /* No Backoff Algorithm */ +#define MAC2_BACK_PRESSURE 0x00002000 /* Backoff Presurre / No Backoff */ +#define MAC2_EXCESS_DEF 0x00004000 /* Excess Defer */ + +/* Back-to-Back Inter-Packet-Gap Register */ +#define IPGT_FULL_DUP 0x00000015 /* Recommended value for Full Duplex */ +#define IPGT_HALF_DUP 0x00000012 /* Recommended value for Half Duplex */ + +/* Non Back-to-Back Inter-Packet-Gap Register */ +#define IPGR_DEF 0x00000012 /* Recommended value */ + +/* Collision Window/Retry Register */ +#define CLRT_DEF 0x0000370F /* Default value */ + +/* PHY Support Register */ +#undef SUPP_SPEED /* Remove compiler warning. */ +#define SUPP_SPEED 0x00000100 /* Reduced MII Logic Current Speed */ +#define SUPP_RES_RMII 0x00000800 /* Reset Reduced MII Logic */ + +/* Test Register */ +#define TEST_SHCUT_PQUANTA 0x00000001 /* Shortcut Pause Quanta */ +#define TEST_TST_PAUSE 0x00000002 /* Test Pause */ +#define TEST_TST_BACKP 0x00000004 /* Test Back Pressure */ + +/* MII Management Configuration Register */ +#define MCFG_SCAN_INC 0x00000001 /* Scan Increment PHY Address */ +#define MCFG_SUPP_PREAM 0x00000002 /* Suppress Preamble */ +#define MCFG_CLK_SEL 0x0000001C /* Clock Select Mask */ +#define MCFG_RES_MII 0x00008000 /* Reset MII Management Hardware */ + +/* MII Management Command Register */ +#undef MCMD_READ /* Remove compiler warning. */ +#define MCMD_READ 0x00000001 /* MII Read */ +#undef MCMD_SCAN /* Remove compiler warning. */ +#define MCMD_SCAN 0x00000002 /* MII Scan continuously */ + +#define MII_WR_TOUT 0x00050000 /* MII Write timeout count */ +#define MII_RD_TOUT 0x00050000 /* MII Read timeout count */ + +/* MII Management Address Register */ +#define MADR_REG_ADR 0x0000001F /* MII Register Address Mask */ +#define MADR_PHY_ADR 0x00001F00 /* PHY Address Mask */ + +/* MII Management Indicators Register */ +#undef MIND_BUSY /* Remove compiler warning. */ +#define MIND_BUSY 0x00000001 /* MII is Busy */ +#define MIND_SCAN 0x00000002 /* MII Scanning in Progress */ +#define MIND_NOT_VAL 0x00000004 /* MII Read Data not valid */ +#define MIND_MII_LINK_FAIL 0x00000008 /* MII Link Failed */ + +/* Command Register */ +#define CR_RX_EN 0x00000001 /* Enable Receive */ +#define CR_TX_EN 0x00000002 /* Enable Transmit */ +#define CR_REG_RES 0x00000008 /* Reset Host Registers */ +#define CR_TX_RES 0x00000010 /* Reset Transmit Datapath */ +#define CR_RX_RES 0x00000020 /* Reset Receive Datapath */ +#define CR_PASS_RUNT_FRM 0x00000040 /* Pass Runt Frames */ +#define CR_PASS_RX_FILT 0x00000080 /* Pass RX Filter */ +#define CR_TX_FLOW_CTRL 0x00000100 /* TX Flow Control */ +#define CR_RMII 0x00000200 /* Reduced MII Interface */ +#define CR_FULL_DUP 0x00000400 /* Full Duplex */ + +/* Status Register */ +#define SR_RX_EN 0x00000001 /* Enable Receive */ +#define SR_TX_EN 0x00000002 /* Enable Transmit */ + +/* Transmit Status Vector 0 Register */ +#define TSV0_CRC_ERR 0x00000001 /* CRC error */ +#define TSV0_LEN_CHKERR 0x00000002 /* Length Check Error */ +#define TSV0_LEN_OUTRNG 0x00000004 /* Length Out of Range */ +#define TSV0_DONE 0x00000008 /* Tramsmission Completed */ +#define TSV0_MCAST 0x00000010 /* Multicast Destination */ +#define TSV0_BCAST 0x00000020 /* Broadcast Destination */ +#define TSV0_PKT_DEFER 0x00000040 /* Packet Deferred */ +#define TSV0_EXC_DEFER 0x00000080 /* Excessive Packet Deferral */ +#define TSV0_EXC_COLL 0x00000100 /* Excessive Collision */ +#define TSV0_LATE_COLL 0x00000200 /* Late Collision Occured */ +#define TSV0_GIANT 0x00000400 /* Giant Frame */ +#define TSV0_UNDERRUN 0x00000800 /* Buffer Underrun */ +#define TSV0_BYTES 0x0FFFF000 /* Total Bytes Transferred */ +#define TSV0_CTRL_FRAME 0x10000000 /* Control Frame */ +#define TSV0_PAUSE 0x20000000 /* Pause Frame */ +#define TSV0_BACK_PRESS 0x40000000 /* Backpressure Method Applied */ +#define TSV0_VLAN 0x80000000 /* VLAN Frame */ + +/* Transmit Status Vector 1 Register */ +#define TSV1_BYTE_CNT 0x0000FFFF /* Transmit Byte Count */ +#define TSV1_COLL_CNT 0x000F0000 /* Transmit Collision Count */ + +/* Receive Status Vector Register */ +#define RSV_BYTE_CNT 0x0000FFFF /* Receive Byte Count */ +#define RSV_PKT_IGNORED 0x00010000 /* Packet Previously Ignored */ +#define RSV_RXDV_SEEN 0x00020000 /* RXDV Event Previously Seen */ +#define RSV_CARR_SEEN 0x00040000 /* Carrier Event Previously Seen */ +#define RSV_REC_CODEV 0x00080000 /* Receive Code Violation */ +#define RSV_CRC_ERR 0x00100000 /* CRC Error */ +#define RSV_LEN_CHKERR 0x00200000 /* Length Check Error */ +#define RSV_LEN_OUTRNG 0x00400000 /* Length Out of Range */ +#define RSV_REC_OK 0x00800000 /* Frame Received OK */ +#define RSV_MCAST 0x01000000 /* Multicast Frame */ +#define RSV_BCAST 0x02000000 /* Broadcast Frame */ +#define RSV_DRIB_NIBB 0x04000000 /* Dribble Nibble */ +#define RSV_CTRL_FRAME 0x08000000 /* Control Frame */ +#define RSV_PAUSE 0x10000000 /* Pause Frame */ +#define RSV_UNSUPP_OPC 0x20000000 /* Unsupported Opcode */ +#define RSV_VLAN 0x40000000 /* VLAN Frame */ + +/* Flow Control Counter Register */ +#define FCC_MIRR_CNT 0x0000FFFF /* Mirror Counter */ +#define FCC_PAUSE_TIM 0xFFFF0000 /* Pause Timer */ + +/* Flow Control Status Register */ +#define FCS_MIRR_CNT 0x0000FFFF /* Mirror Counter Current */ + +/* Receive Filter Control Register */ +#define RFC_UCAST_EN 0x00000001 /* Accept Unicast Frames Enable */ +#define RFC_BCAST_EN 0x00000002 /* Accept Broadcast Frames Enable */ +#define RFC_MCAST_EN 0x00000004 /* Accept Multicast Frames Enable */ +#define RFC_UCAST_HASH_EN 0x00000008 /* Accept Unicast Hash Filter Frames */ +#define RFC_MCAST_HASH_EN 0x00000010 /* Accept Multicast Hash Filter Fram.*/ +#define RFC_PERFECT_EN 0x00000020 /* Accept Perfect Match Enable */ +#define RFC_MAGP_WOL_EN 0x00001000 /* Magic Packet Filter WoL Enable */ +#define RFC_PFILT_WOL_EN 0x00002000 /* Perfect Filter WoL Enable */ + +/* Receive Filter WoL Status/Clear Registers */ +#define WOL_UCAST 0x00000001 /* Unicast Frame caused WoL */ +#define WOL_BCAST 0x00000002 /* Broadcast Frame caused WoL */ +#define WOL_MCAST 0x00000004 /* Multicast Frame caused WoL */ +#define WOL_UCAST_HASH 0x00000008 /* Unicast Hash Filter Frame WoL */ +#define WOL_MCAST_HASH 0x00000010 /* Multicast Hash Filter Frame WoL */ +#define WOL_PERFECT 0x00000020 /* Perfect Filter WoL */ +#define WOL_RX_FILTER 0x00000080 /* RX Filter caused WoL */ +#define WOL_MAG_PACKET 0x00000100 /* Magic Packet Filter caused WoL */ + +/* Interrupt Status/Enable/Clear/Set Registers */ +#define INT_RX_OVERRUN 0x00000001 /* Overrun Error in RX Queue */ +#define INT_RX_ERR 0x00000002 /* Receive Error */ +#define INT_RX_FIN 0x00000004 /* RX Finished Process Descriptors */ +#define INT_RX_DONE 0x00000008 /* Receive Done */ +#define INT_TX_UNDERRUN 0x00000010 /* Transmit Underrun */ +#define INT_TX_ERR 0x00000020 /* Transmit Error */ +#define INT_TX_FIN 0x00000040 /* TX Finished Process Descriptors */ +#define INT_TX_DONE 0x00000080 /* Transmit Done */ +#define INT_SOFT_INT 0x00001000 /* Software Triggered Interrupt */ +#define INT_WAKEUP 0x00002000 /* Wakeup Event Interrupt */ + +/* Power Down Register */ +#define PD_POWER_DOWN 0x80000000 /* Power Down MAC */ + +/* RX Descriptor Control Word */ +#define RCTRL_SIZE 0x000007FF /* Buffer size mask */ +#define RCTRL_INT 0x80000000 /* Generate RxDone Interrupt */ + +/* RX Status Hash CRC Word */ +#define RHASH_SA 0x000001FF /* Hash CRC for Source Address */ +#define RHASH_DA 0x001FF000 /* Hash CRC for Destination Address */ + +/* RX Status Information Word */ +#define RINFO_SIZE 0x000007FF /* Data size in bytes */ +#define RINFO_CTRL_FRAME 0x00040000 /* Control Frame */ +#define RINFO_VLAN 0x00080000 /* VLAN Frame */ +#define RINFO_FAIL_FILT 0x00100000 /* RX Filter Failed */ +#define RINFO_MCAST 0x00200000 /* Multicast Frame */ +#define RINFO_BCAST 0x00400000 /* Broadcast Frame */ +#define RINFO_CRC_ERR 0x00800000 /* CRC Error in Frame */ +#define RINFO_SYM_ERR 0x01000000 /* Symbol Error from PHY */ +#define RINFO_LEN_ERR 0x02000000 /* Length Error */ +#define RINFO_RANGE_ERR 0x04000000 /* Range Error (exceeded max. size) */ +#define RINFO_ALIGN_ERR 0x08000000 /* Alignment Error */ +#define RINFO_OVERRUN 0x10000000 /* Receive overrun */ +#define RINFO_NO_DESCR 0x20000000 /* No new Descriptor available */ +#define RINFO_LAST_FLAG 0x40000000 /* Last Fragment in Frame */ +#define RINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +#define RINFO_ERR_MASK (RINFO_FAIL_FILT | RINFO_CRC_ERR | RINFO_SYM_ERR | \ + RINFO_LEN_ERR | RINFO_ALIGN_ERR | RINFO_OVERRUN) + +/* TX Descriptor Control Word */ +#define TCTRL_SIZE 0x000007FF /* Size of data buffer in bytes */ +#define TCTRL_OVERRIDE 0x04000000 /* Override Default MAC Registers */ +#define TCTRL_HUGE 0x08000000 /* Enable Huge Frame */ +#define TCTRL_PAD 0x10000000 /* Pad short Frames to 64 bytes */ +#define TCTRL_CRC 0x20000000 /* Append a hardware CRC to Frame */ +#define TCTRL_LAST 0x40000000 /* Last Descriptor for TX Frame */ +#define TCTRL_INT 0x80000000 /* Generate TxDone Interrupt */ + +/* TX Status Information Word */ +#define TINFO_COL_CNT 0x01E00000 /* Collision Count */ +#define TINFO_DEFER 0x02000000 /* Packet Deferred (not an error) */ +#define TINFO_EXCESS_DEF 0x04000000 /* Excessive Deferral */ +#define TINFO_EXCESS_COL 0x08000000 /* Excessive Collision */ +#define TINFO_LATE_COL 0x10000000 /* Late Collision Occured */ +#define TINFO_UNDERRUN 0x20000000 /* Transmit Underrun */ +#define TINFO_NO_DESCR 0x40000000 /* No new Descriptor available */ +#define TINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +/* DP83848C PHY Registers */ +#define PHY_REG_BMCR 0x00 /* Basic Mode Control Register */ +#define PHY_REG_BMSR 0x01 /* Basic Mode Status Register */ +#define PHY_REG_IDR1 0x02 /* PHY Identifier 1 */ +#define PHY_REG_IDR2 0x03 /* PHY Identifier 2 */ +#define PHY_REG_ANAR 0x04 /* Auto-Negotiation Advertisement */ +#define PHY_REG_ANLPAR 0x05 /* Auto-Neg. Link Partner Abitily */ +#define PHY_REG_ANER 0x06 /* Auto-Neg. Expansion Register */ +#define PHY_REG_ANNPTR 0x07 /* Auto-Neg. Next Page TX */ + +/* PHY Extended Registers */ +#define PHY_REG_STS 0x10 /* Status Register */ +#define PHY_REG_MICR 0x11 /* MII Interrupt Control Register */ +#define PHY_REG_MISR 0x12 /* MII Interrupt Status Register */ +#define PHY_REG_FCSCR 0x14 /* False Carrier Sense Counter */ +#define PHY_REG_RECR 0x15 /* Receive Error Counter */ +#define PHY_REG_PCSR 0x16 /* PCS Sublayer Config. and Status */ +#define PHY_REG_RBR 0x17 /* RMII and Bypass Register */ +#define PHY_REG_LEDCR 0x18 /* LED Direct Control Register */ +#define PHY_REG_PHYCR 0x19 /* PHY Control Register */ +#define PHY_REG_10BTSCR 0x1A /* 10Base-T Status/Control Register */ +#define PHY_REG_CDCTRL1 0x1B /* CD Test Control and BIST Extens. */ +#define PHY_REG_EDCR 0x1D /* Energy Detect Control Register */ + +#define PHY_FULLD_100M 0x2100 /* Full Duplex 100Mbit */ +#define PHY_HALFD_100M 0x2000 /* Half Duplex 100Mbit */ +#define PHY_FULLD_10M 0x0100 /* Full Duplex 10Mbit */ +#define PHY_HALFD_10M 0x0000 /* Half Duplex 10MBit */ +#define PHY_AUTO_NEG 0x3000 /* Select Auto Negotiation */ + +#define DP83848C_DEF_ADR 0x0100 /* Default PHY device address */ +#define DP83848C_ID 0x20005C90 /* PHY Identifier */ + +// prototypes +portBASE_TYPE vInitEMAC(void); +unsigned short ReadFrameBE_EMAC(void); +void vIncrementTxLength(unsigned long ulLength); +void CopyFromFrame_EMAC(void *Dest, unsigned short Size); +void DummyReadFrame_EMAC(unsigned short Size); +unsigned short StartReadFrame(void); +void EndReadFrame(void); +unsigned int CheckFrameReceived(void); +void vInitialiseSend(void); +unsigned int Rdy4Tx(void); +void vSendBufferToMAC(void); +void vEMACWaitForInput( void ); +unsigned int uiGetEMACRxData( unsigned char *ucBuffer ); + + +#endif + +/*---------------------------------------------------------------------------- + * end of file + *---------------------------------------------------------------------------*/ + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/http-strings b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/http-strings new file mode 100644 index 0000000..0d3c30c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/http-strings @@ -0,0 +1,35 @@ +http_http "http://" +http_200 "200 " +http_301 "301 " +http_302 "302 " +http_get "GET " +http_10 "HTTP/1.0" +http_11 "HTTP/1.1" +http_content_type "content-type: " +http_texthtml "text/html" +http_location "location: " +http_host "host: " +http_crnl "\r\n" +http_index_html "/index.html" +http_404_html "/404.html" +http_referer "Referer:" +http_header_200 "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_header_404 "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_content_type_plain "Content-type: text/plain\r\n\r\n" +http_content_type_html "Content-type: text/html\r\n\r\n" +http_content_type_css "Content-type: text/css\r\n\r\n" +http_content_type_text "Content-type: text/text\r\n\r\n" +http_content_type_png "Content-type: image/png\r\n\r\n" +http_content_type_gif "Content-type: image/gif\r\n\r\n" +http_content_type_jpg "Content-type: image/jpeg\r\n\r\n" +http_content_type_binary "Content-type: application/octet-stream\r\n\r\n" +http_html ".html" +http_shtml ".shtml" +http_htm ".htm" +http_css ".css" +http_png ".png" +http_gif ".gif" +http_jpg ".jpg" +http_text ".txt" +http_txt ".txt" + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/http-strings.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/http-strings.c new file mode 100644 index 0000000..ef7a41c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/http-strings.c @@ -0,0 +1,102 @@ +const char http_http[8] = +/* "http://" */ +{0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, }; +const char http_200[5] = +/* "200 " */ +{0x32, 0x30, 0x30, 0x20, }; +const char http_301[5] = +/* "301 " */ +{0x33, 0x30, 0x31, 0x20, }; +const char http_302[5] = +/* "302 " */ +{0x33, 0x30, 0x32, 0x20, }; +const char http_get[5] = +/* "GET " */ +{0x47, 0x45, 0x54, 0x20, }; +const char http_10[9] = +/* "HTTP/1.0" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, }; +const char http_11[9] = +/* "HTTP/1.1" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, }; +const char http_content_type[15] = +/* "content-type: " */ +{0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, }; +const char http_texthtml[10] = +/* "text/html" */ +{0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_location[11] = +/* "location: " */ +{0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, }; +const char http_host[7] = +/* "host: " */ +{0x68, 0x6f, 0x73, 0x74, 0x3a, 0x20, }; +const char http_crnl[3] = +/* "\r\n" */ +{0xd, 0xa, }; +const char http_index_html[12] = +/* "/index.html" */ +{0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_404_html[10] = +/* "/404.html" */ +{0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_referer[9] = +/* "Referer:" */ +{0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x3a, }; +const char http_header_200[84] = +/* "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_header_404[91] = +/* "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x34, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_content_type_plain[29] = +/* "Content-type: text/plain\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_html[28] = +/* "Content-type: text/html\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_css [27] = +/* "Content-type: text/css\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_text[28] = +/* "Content-type: text/text\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x78, 0x74, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_png [28] = +/* "Content-type: image/png\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_gif [28] = +/* "Content-type: image/gif\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_jpg [29] = +/* "Content-type: image/jpeg\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x65, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_binary[43] = +/* "Content-type: application/octet-stream\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0xd, 0xa, }; +const char http_html[6] = +/* ".html" */ +{0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_shtml[7] = +/* ".shtml" */ +{0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_htm[5] = +/* ".htm" */ +{0x2e, 0x68, 0x74, 0x6d, }; +const char http_css[5] = +/* ".css" */ +{0x2e, 0x63, 0x73, 0x73, }; +const char http_png[5] = +/* ".png" */ +{0x2e, 0x70, 0x6e, 0x67, }; +const char http_gif[5] = +/* ".gif" */ +{0x2e, 0x67, 0x69, 0x66, }; +const char http_jpg[5] = +/* ".jpg" */ +{0x2e, 0x6a, 0x70, 0x67, }; +const char http_text[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; +const char http_txt[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/http-strings.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/http-strings.h new file mode 100644 index 0000000..acbe7e1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/http-strings.h @@ -0,0 +1,34 @@ +extern const char http_http[8]; +extern const char http_200[5]; +extern const char http_301[5]; +extern const char http_302[5]; +extern const char http_get[5]; +extern const char http_10[9]; +extern const char http_11[9]; +extern const char http_content_type[15]; +extern const char http_texthtml[10]; +extern const char http_location[11]; +extern const char http_host[7]; +extern const char http_crnl[3]; +extern const char http_index_html[12]; +extern const char http_404_html[10]; +extern const char http_referer[9]; +extern const char http_header_200[84]; +extern const char http_header_404[91]; +extern const char http_content_type_plain[29]; +extern const char http_content_type_html[28]; +extern const char http_content_type_css [27]; +extern const char http_content_type_text[28]; +extern const char http_content_type_png [28]; +extern const char http_content_type_gif [28]; +extern const char http_content_type_jpg [29]; +extern const char http_content_type_binary[43]; +extern const char http_html[6]; +extern const char http_shtml[7]; +extern const char http_htm[5]; +extern const char http_css[5]; +extern const char http_png[5]; +extern const char http_gif[5]; +extern const char http_jpg[5]; +extern const char http_text[5]; +extern const char http_txt[5]; diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-cgi.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-cgi.c new file mode 100644 index 0000000..803b771 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-cgi.c @@ -0,0 +1,269 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface + * \author + * Adam Dunkels + * + */ + +/* + * Copyright (c) 2001-2006, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $ + * + */ + +#include "uip.h" +#include "psock.h" +#include "httpd.h" +#include "httpd-cgi.h" +#include "httpd-fs.h" + +#include +#include + +HTTPD_CGI_CALL(file, "file-stats", file_stats); +HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats); +HTTPD_CGI_CALL(net, "net-stats", net_stats); +HTTPD_CGI_CALL(rtos, "rtos-stats", rtos_stats ); +HTTPD_CGI_CALL(io, "led-io", led_io ); + + +static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, &rtos, &io, NULL }; + +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(nullfunction(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +httpd_cgifunction +httpd_cgi(char *name) +{ + const struct httpd_cgi_call **f; + + /* Find the matching name in the table, return the function. */ + for(f = calls; *f != NULL; ++f) { + if(strncmp((*f)->name, name, strlen((*f)->name)) == 0) { + return (*f)->function; + } + } + return nullfunction; +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_file_stats(void *arg) +{ + char *f = (char *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f)); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(file_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, strchr(ptr, ' ') + 1); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static const char closed[] = /* "CLOSED",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0}; +static const char syn_rcvd[] = /* "SYN-RCVD",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56, + 0x44, 0}; +static const char syn_sent[] = /* "SYN-SENT",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e, + 0x54, 0}; +static const char established[] = /* "ESTABLISHED",*/ +{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, + 0x45, 0x44, 0}; +static const char fin_wait_1[] = /* "FIN-WAIT-1",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x31, 0}; +static const char fin_wait_2[] = /* "FIN-WAIT-2",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x32, 0}; +static const char closing[] = /* "CLOSING",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x49, + 0x4e, 0x47, 0}; +static const char time_wait[] = /* "TIME-WAIT,"*/ +{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41, + 0x49, 0x54, 0}; +static const char last_ack[] = /* "LAST-ACK"*/ +{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43, + 0x4b, 0}; + +static const char *states[] = { + closed, + syn_rcvd, + syn_sent, + established, + fin_wait_1, + fin_wait_2, + closing, + time_wait, + last_ack}; + + +static unsigned short +generate_tcp_stats(void *arg) +{ + struct uip_conn *conn; + struct httpd_state *s = (struct httpd_state *)arg; + + conn = &uip_conns[s->count]; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "
\r\n", + htons(conn->lport), + htons(conn->ripaddr[0]) >> 8, + htons(conn->ripaddr[0]) & 0xff, + htons(conn->ripaddr[1]) >> 8, + htons(conn->ripaddr[1]) & 0xff, + htons(conn->rport), + states[conn->tcpstateflags & UIP_TS_MASK], + conn->nrtx, + conn->timer, + (uip_outstanding(conn))? '*':' ', + (uip_stopped(conn))? '!':' '); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr)) +{ + + PSOCK_BEGIN(&s->sout); + + for(s->count = 0; s->count < UIP_CONNS; ++s->count) { + if((uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) { + PSOCK_GENERATOR_SEND(&s->sout, generate_tcp_stats, s); + } + } + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_net_stats(void *arg) +{ + struct httpd_state *s = (struct httpd_state *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "%5u\n", ((uip_stats_t *)&uip_stat)[s->count]); +} + +static +PT_THREAD(net_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + +#if UIP_STATISTICS + + for(s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t); + ++s->count) { + PSOCK_GENERATOR_SEND(&s->sout, generate_net_stats, s); + } + +#endif /* UIP_STATISTICS */ + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +extern void vTaskList( signed char *pcWriteBuffer ); +static char cCountBuf[ 32 ]; +long lRefreshCount = 0; +static unsigned short +generate_rtos_stats(void *arg) +{ + lRefreshCount++; + sprintf( cCountBuf, "


Refresh count = %d", lRefreshCount ); + vTaskList( uip_appdata ); + strcat( uip_appdata, cCountBuf ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + + +static +PT_THREAD(rtos_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_rtos_stats, NULL); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +char *pcStatus; +extern unsigned long uxParTestGetLED( unsigned long uxLED ); + +static unsigned short generate_io_state( void *arg ) +{ + if( uxParTestGetLED( 0 ) ) + { + pcStatus = "checked"; + } + else + { + pcStatus = ""; + } + + sprintf( uip_appdata, + "LED"\ + "

"\ + "", + pcStatus ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + +static PT_THREAD(led_io(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_io_state, NULL); + PSOCK_END(&s->sout); +} + +/** @} */ + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-cgi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-cgi.h new file mode 100644 index 0000000..7ae9283 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-cgi.h @@ -0,0 +1,84 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface header file + * \author + * Adam Dunkels + * + */ + + + +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_CGI_H__ +#define __HTTPD_CGI_H__ + +#include "psock.h" +#include "httpd.h" + +typedef PT_THREAD((* httpd_cgifunction)(struct httpd_state *, char *)); + +httpd_cgifunction httpd_cgi(char *name); + +struct httpd_cgi_call { + const char *name; + const httpd_cgifunction function; +}; + +/** + * \brief HTTPD CGI function declaration + * \param name The C variable name of the function + * \param str The string name of the function, used in the script file + * \param function A pointer to the function that implements it + * + * This macro is used for declaring a HTTPD CGI + * function. This function is then added to the list of + * HTTPD CGI functions with the httpd_cgi_add() function. + * + * \hideinitializer + */ +#define HTTPD_CGI_CALL(name, str, function) \ +static PT_THREAD(function(struct httpd_state *, char *)); \ +static const struct httpd_cgi_call name = {str, function} + +void httpd_cgi_init(void); +#endif /* __HTTPD_CGI_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs.c new file mode 100644 index 0000000..dc4aef0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.c,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ + +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-fsdata.h" + +#ifndef NULL +#define NULL 0 +#endif /* NULL */ + +#include "httpd-fsdata.c" + +#if HTTPD_FS_STATISTICS +static u16_t count[HTTPD_FS_NUMFILES]; +#endif /* HTTPD_FS_STATISTICS */ + +/*-----------------------------------------------------------------------------------*/ +static u8_t +httpd_fs_strcmp(const char *str1, const char *str2) +{ + u8_t i; + i = 0; + loop: + + if(str2[i] == 0 || + str1[i] == '\r' || + str1[i] == '\n') { + return 0; + } + + if(str1[i] != str2[i]) { + return 1; + } + + + ++i; + goto loop; +} +/*-----------------------------------------------------------------------------------*/ +int +httpd_fs_open(const char *name, struct httpd_fs_file *file) +{ +#if HTTPD_FS_STATISTICS + u16_t i = 0; +#endif /* HTTPD_FS_STATISTICS */ + struct httpd_fsdata_file_noconst *f; + + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + file->data = f->data; + file->len = f->len; +#if HTTPD_FS_STATISTICS + ++count[i]; +#endif /* HTTPD_FS_STATISTICS */ + return 1; + } +#if HTTPD_FS_STATISTICS + ++i; +#endif /* HTTPD_FS_STATISTICS */ + + } + return 0; +} +/*-----------------------------------------------------------------------------------*/ +void +httpd_fs_init(void) +{ +#if HTTPD_FS_STATISTICS + u16_t i; + for(i = 0; i < HTTPD_FS_NUMFILES; i++) { + count[i] = 0; + } +#endif /* HTTPD_FS_STATISTICS */ +} +/*-----------------------------------------------------------------------------------*/ +#if HTTPD_FS_STATISTICS +u16_t httpd_fs_count +(char *name) +{ + struct httpd_fsdata_file_noconst *f; + u16_t i; + + i = 0; + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + return count[i]; + } + ++i; + } + return 0; +} +#endif /* HTTPD_FS_STATISTICS */ +/*-----------------------------------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs.h new file mode 100644 index 0000000..b594eea --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FS_H__ +#define __HTTPD_FS_H__ + +#define HTTPD_FS_STATISTICS 1 + +struct httpd_fs_file { + char *data; + int len; +}; + +/* file must be allocated by caller and will be filled in + by the function. */ +int httpd_fs_open(const char *name, struct httpd_fs_file *file); + +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 +u16_t httpd_fs_count(char *name); +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ + +void httpd_fs_init(void); + +#endif /* __HTTPD_FS_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/404.html b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/404.html new file mode 100644 index 0000000..43e7f4c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/404.html @@ -0,0 +1,8 @@ + + +

+

404 - file not found

+

Go here instead.

+
+ + \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/index.html b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/index.html new file mode 100644 index 0000000..1d3bbee --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/index.html @@ -0,0 +1,13 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Loading index.shtml. Click here if not automatically redirected. + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/index.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/index.shtml new file mode 100644 index 0000000..1923ea7 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/index.shtml @@ -0,0 +1,20 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Task statistics

+Page will refresh every 2 seconds.

+

Task          State  Priority  Stack	#
************************************************
+%! rtos-stats +
+
+ + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/io.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/io.shtml new file mode 100644 index 0000000..07554bb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/io.shtml @@ -0,0 +1,28 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+LED and LCD IO
+ +

+ +Use the check box to turn on or off the LED, enter text to display on the OLED display, then click "Update IO". + + +

+
+%! led-io +

+ + +

+ + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/stats.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/stats.shtml new file mode 100644 index 0000000..d762f40 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/stats.shtml @@ -0,0 +1,41 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Network statistics

+
LocalRemoteStateRetransmissionsTimerFlags
%d%u.%u.%u.%u:%u%s%u%u%c %c
+
+IP           Packets dropped
+             Packets received
+             Packets sent
+IP errors    IP version/header length
+             IP length, high byte
+             IP length, low byte
+             IP fragments
+             Header checksum
+             Wrong protocol
+ICMP	     Packets dropped
+             Packets received
+             Packets sent
+             Type errors
+TCP          Packets dropped
+             Packets received
+             Packets sent
+             Checksum errors
+             Data packets without ACKs
+             Resets
+             Retransmissions
+	     No connection avaliable
+	     Connection attempts to closed ports
+
%! net-stats
+
+ + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/tcp.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/tcp.shtml new file mode 100644 index 0000000..654d61f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fs/tcp.shtml @@ -0,0 +1,21 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +RTOS Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+
+

Network connections

+

+ + +%! tcp-connections + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fsdata.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fsdata.c new file mode 100644 index 0000000..a7fcfab --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fsdata.c @@ -0,0 +1,470 @@ +static const unsigned char data_404_html[] = { + /* /404.html */ + 0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0x20, 0x20, + 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65, + 0x22, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0xd, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x31, 0x3e, 0x34, 0x30, + 0x34, 0x20, 0x2d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6e, + 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x3c, 0x2f, + 0x68, 0x31, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x68, 0x33, 0x3e, 0x47, 0x6f, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, + 0x68, 0x65, 0x72, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x2e, 0x3c, 0x2f, 0x68, + 0x33, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, 0xd, 0xa, 0x20, + 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, + 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0}; + +static const unsigned char data_index_html[] = { + /* /index.html */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x6f, 0x6e, 0x4c, 0x6f, 0x61, 0x64, + 0x3d, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, + 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, + 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x27, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, + 0x6d, 0x6c, 0x27, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, + 0x31, 0x30, 0x30, 0x29, 0x22, 0x62, 0x67, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, + 0x66, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, + 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, + 0x61, 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x4c, 0x6f, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x2e, 0x20, 0x20, 0x43, 0x6c, + 0x69, 0x63, 0x6b, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x68, 0x65, 0x72, 0x65, + 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, + 0x74, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, + 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0xd, 0xa, 0x3c, + 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, + 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, 0}; + +static const unsigned char data_index_shtml[] = { + /* /index.shtml */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x6f, 0x6e, 0x4c, 0x6f, 0x61, 0x64, + 0x3d, 0x22, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x73, + 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x28, + 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x72, 0x65, 0x66, 0x3d, + 0x27, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, + 0x6d, 0x6c, 0x27, 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, + 0x32, 0x30, 0x30, 0x30, 0x29, 0x22, 0x62, 0x67, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, + 0x66, 0x66, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, + 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, + 0x69, 0x61, 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, + 0x54, 0x4f, 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, + 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, + 0x73, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x22, 0x3e, 0x46, 0x72, + 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, 0x72, 0x67, + 0x20, 0x48, 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, + 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, + 0x68, 0x72, 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, + 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x54, 0x61, + 0x73, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, + 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, 0xa, + 0x50, 0x61, 0x67, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x20, 0x65, 0x76, + 0x65, 0x72, 0x79, 0x20, 0x32, 0x20, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x2e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, + 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, + 0x22, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x22, 0x3e, + 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x20, 0x20, 0x50, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x20, 0x20, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x9, 0x23, 0x3c, 0x62, 0x72, 0x3e, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x3c, 0x62, 0x72, 0x3e, 0xd, + 0xa, 0x25, 0x21, 0x20, 0x72, 0x74, 0x6f, 0x73, 0x2d, 0x73, + 0x74, 0x61, 0x74, 0x73, 0xd, 0xa, 0x3c, 0x2f, 0x70, 0x72, + 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, + 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, + 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, + 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, +0}; + +static const unsigned char data_io_shtml[] = { + /* /io.shtml */ + 0x2f, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, + 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, + 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x3e, 0x4c, 0x45, 0x44, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x4c, 0x43, 0x44, 0x20, 0x49, 0x4f, + 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0xd, 0xa, + 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0xd, 0xa, 0x55, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x20, 0x62, 0x6f, 0x78, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x6f, 0x72, + 0x20, 0x6f, 0x66, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, + 0x45, 0x44, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, + 0x74, 0x65, 0x78, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4f, 0x4c, 0x45, 0x44, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x22, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x49, 0x4f, 0x22, 0x2e, + 0xd, 0xa, 0xd, 0xa, 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, + 0xa, 0x3c, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x22, 0x61, 0x46, 0x6f, 0x72, 0x6d, 0x22, 0x20, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x2f, 0x69, + 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x20, 0x6d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, + 0x22, 0x3e, 0xd, 0xa, 0x25, 0x21, 0x20, 0x6c, 0x65, 0x64, + 0x2d, 0x69, 0x6f, 0xd, 0xa, 0x3c, 0x70, 0x3e, 0xd, 0xa, + 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, + 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x20, 0x49, 0x4f, 0x22, 0x3e, 0xd, + 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0xd, 0xa, + 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, + 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, + 0x74, 0x6d, 0x6c, 0x3e, 0xd, 0xa, 0xd, 0xa, 0}; + +static const unsigned char data_stats_shtml[] = { + /* /stats.shtml */ + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, + 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, + 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, + 0xd, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, + 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x33, 0x30, 0x30, 0x22, 0x20, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, 0x30, 0x22, + 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, + 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, 0x65, + 0x66, 0x74, 0x22, 0x3e, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x75, 0x72, + 0x69, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, + 0xd, 0xa, 0x49, 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xd, 0xa, + 0x49, 0x50, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, + 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xd, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x49, 0x50, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x20, 0x68, 0x69, 0x67, 0x68, 0x20, 0x62, 0x79, + 0x74, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, + 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x6c, 0x6f, + 0x77, 0x20, 0x62, 0x79, 0x74, 0x65, 0xd, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x49, 0x50, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x75, 0x6d, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x57, 0x72, + 0x6f, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0xd, 0xa, 0x49, 0x43, 0x4d, 0x50, 0x9, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0xd, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xd, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x54, 0x79, 0x70, 0x65, 0x20, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0xd, 0xa, 0x54, 0x43, 0x50, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, + 0x70, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, + 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, + 0x74, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x73, 0x75, 0x6d, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, 0x61, 0x74, 0x61, + 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x41, 0x43, 0x4b, + 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x73, 0x65, + 0x74, 0x73, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0xd, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4e, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, 0x61, 0x6c, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0xd, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, + 0x20, 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, + 0x20, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xd, 0xa, 0x3c, 0x2f, + 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, + 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, + 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x25, 0x21, 0x20, 0x6e, 0x65, + 0x74, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0xd, 0xa, 0x3c, + 0x2f, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, + 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, + 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0}; + +static const unsigned char data_tcp_shtml[] = { + /* /tcp.shtml */ + 0x2f, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, + 0x57, 0x45, 0x42, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x20, 0x64, 0x65, 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, + 0x65, 0x61, 0x64, 0x3e, 0xd, 0xa, 0x20, 0x20, 0x3c, 0x42, + 0x4f, 0x44, 0x59, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3d, 0x22, 0x23, 0x43, 0x43, 0x43, 0x43, 0x66, 0x66, + 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, + 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, + 0x6c, 0x22, 0x3e, 0xd, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x54, 0x4f, + 0x53, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, + 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xd, 0xa, 0x3c, 0x62, + 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xd, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0xd, 0xa, 0x3c, + 0x68, 0x32, 0x3e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, 0xd, 0xa, 0x3c, + 0x70, 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x3e, 0xd, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, + 0x3e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x68, + 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, + 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, + 0x68, 0x3e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3c, 0x2f, 0x74, + 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xd, 0xa, 0x25, + 0x21, 0x20, 0x74, 0x63, 0x70, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xd, 0xa, 0x3c, + 0x2f, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, + 0x74, 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, + 0x3e, 0xd, 0xa, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, + 0xd, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xd, + 0xa, 0xd, 0xa, 0}; + +const struct httpd_fsdata_file file_404_html[] = {{NULL, data_404_html, data_404_html + 10, sizeof(data_404_html) - 10}}; + +const struct httpd_fsdata_file file_index_html[] = {{file_404_html, data_index_html, data_index_html + 12, sizeof(data_index_html) - 12}}; + +const struct httpd_fsdata_file file_index_shtml[] = {{file_index_html, data_index_shtml, data_index_shtml + 13, sizeof(data_index_shtml) - 13}}; + +const struct httpd_fsdata_file file_io_shtml[] = {{file_index_shtml, data_io_shtml, data_io_shtml + 10, sizeof(data_io_shtml) - 10}}; + +const struct httpd_fsdata_file file_stats_shtml[] = {{file_io_shtml, data_stats_shtml, data_stats_shtml + 13, sizeof(data_stats_shtml) - 13}}; + +const struct httpd_fsdata_file file_tcp_shtml[] = {{file_stats_shtml, data_tcp_shtml, data_tcp_shtml + 11, sizeof(data_tcp_shtml) - 11}}; + +#define HTTPD_FS_ROOT file_tcp_shtml + +#define HTTPD_FS_NUMFILES 6 diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fsdata.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fsdata.h new file mode 100644 index 0000000..52d35c2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd-fsdata.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fsdata.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FSDATA_H__ +#define __HTTPD_FSDATA_H__ + +#include "uip.h" + +struct httpd_fsdata_file { + const struct httpd_fsdata_file *next; + const char *name; + const char *data; + const int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +struct httpd_fsdata_file_noconst { + struct httpd_fsdata_file *next; + char *name; + char *data; + int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +#endif /* __HTTPD_FSDATA_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd.c new file mode 100644 index 0000000..644cf16 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd.c @@ -0,0 +1,346 @@ +/** + * \addtogroup apps + * @{ + */ + +/** + * \defgroup httpd Web server + * @{ + * The uIP web server is a very simplistic implementation of an HTTP + * server. It can serve web pages and files from a read-only ROM + * filesystem, and provides a very small scripting language. + + */ + +/** + * \file + * Web server + * \author + * Adam Dunkels + */ + + +/* + * Copyright (c) 2004, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd.c,v 1.2 2006/06/11 21:46:38 adam Exp $ + */ + +#include "uip.h" +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-cgi.h" +#include "http-strings.h" + +#include + +#define STATE_WAITING 0 +#define STATE_OUTPUT 1 + +#define ISO_nl 0x0a +#define ISO_space 0x20 +#define ISO_bang 0x21 +#define ISO_percent 0x25 +#define ISO_period 0x2e +#define ISO_slash 0x2f +#define ISO_colon 0x3a + + +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_part_of_file(void *state) +{ + struct httpd_state *s = (struct httpd_state *)state; + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + memcpy(uip_appdata, s->file.data, s->len); + + return s->len; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + do { + PSOCK_GENERATOR_SEND(&s->sout, generate_part_of_file, s); + s->file.len -= s->len; + s->file.data += s->len; + } while(s->file.len > 0); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_part_of_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND(&s->sout, s->file.data, s->len); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static void +next_scriptstate(struct httpd_state *s) +{ + char *p; + p = strchr(s->scriptptr, ISO_nl) + 1; + s->scriptlen -= (unsigned short)(p - s->scriptptr); + s->scriptptr = p; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_script(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->scriptpt); + + + while(s->file.len > 0) { + + /* Check if we should start executing a script. */ + if(*s->file.data == ISO_percent && + *(s->file.data + 1) == ISO_bang) { + s->scriptptr = s->file.data + 3; + s->scriptlen = s->file.len - 3; + if(*(s->scriptptr - 1) == ISO_colon) { + httpd_fs_open(s->scriptptr + 1, &s->file); + PT_WAIT_THREAD(&s->scriptpt, send_file(s)); + } else { + PT_WAIT_THREAD(&s->scriptpt, + httpd_cgi(s->scriptptr)(s, s->scriptptr)); + } + next_scriptstate(s); + + /* The script is over, so we reset the pointers and continue + sending the rest of the file. */ + s->file.data = s->scriptptr; + s->file.len = s->scriptlen; + } else { + /* See if we find the start of script marker in the block of HTML + to be sent. */ + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + + if(*s->file.data == ISO_percent) { + ptr = strchr(s->file.data + 1, ISO_percent); + } else { + ptr = strchr(s->file.data, ISO_percent); + } + if(ptr != NULL && + ptr != s->file.data) { + s->len = (int)(ptr - s->file.data); + if(s->len >= uip_mss()) { + s->len = uip_mss(); + } + } + PT_WAIT_THREAD(&s->scriptpt, send_part_of_file(s)); + s->file.data += s->len; + s->file.len -= s->len; + + } + } + + PT_END(&s->scriptpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_headers(struct httpd_state *s, const char *statushdr)) +{ + char *ptr; + + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND_STR(&s->sout, statushdr); + + ptr = strrchr(s->filename, ISO_period); + if(ptr == NULL) { + PSOCK_SEND_STR(&s->sout, http_content_type_binary); + } else if(strncmp(http_html, ptr, 5) == 0 || + strncmp(http_shtml, ptr, 6) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_html); + } else if(strncmp(http_css, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_css); + } else if(strncmp(http_png, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_png); + } else if(strncmp(http_gif, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_gif); + } else if(strncmp(http_jpg, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_jpg); + } else { + PSOCK_SEND_STR(&s->sout, http_content_type_plain); + } + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_output(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->outputpt); + + if(!httpd_fs_open(s->filename, &s->file)) { + httpd_fs_open(http_404_html, &s->file); + strcpy(s->filename, http_404_html); + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_404)); + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_200)); + ptr = strchr(s->filename, ISO_period); + if(ptr != NULL && strncmp(ptr, http_shtml, 6) == 0) { + PT_INIT(&s->scriptpt); + PT_WAIT_THREAD(&s->outputpt, handle_script(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } + } + PSOCK_CLOSE(&s->sout); + PT_END(&s->outputpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_input(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sin); + + PSOCK_READTO(&s->sin, ISO_space); + + + if(strncmp(s->inputbuf, http_get, 4) != 0) { + PSOCK_CLOSE_EXIT(&s->sin); + } + PSOCK_READTO(&s->sin, ISO_space); + + if(s->inputbuf[0] != ISO_slash) { + PSOCK_CLOSE_EXIT(&s->sin); + } + + if(s->inputbuf[1] == ISO_space) { + strncpy(s->filename, http_index_html, sizeof(s->filename)); + } else { + + s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; + + /* Process any form input being sent to the server. */ + { + extern void vApplicationProcessFormInput( char *pcInputString, long xInputLength ); + vApplicationProcessFormInput( s->inputbuf, PSOCK_DATALEN(&s->sin) ); + } + + strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); + } + + /* httpd_log_file(uip_conn->ripaddr, s->filename);*/ + + s->state = STATE_OUTPUT; + + while(1) { + PSOCK_READTO(&s->sin, ISO_nl); + + if(strncmp(s->inputbuf, http_referer, 8) == 0) { + s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0; + /* httpd_log(&s->inputbuf[9]);*/ + } + } + + PSOCK_END(&s->sin); +} +/*---------------------------------------------------------------------------*/ +static void +handle_connection(struct httpd_state *s) +{ + handle_input(s); + if(s->state == STATE_OUTPUT) { + handle_output(s); + } +} +/*---------------------------------------------------------------------------*/ +void +httpd_appcall(void) +{ + struct httpd_state *s = (struct httpd_state *)&(uip_conn->appstate); + + if(uip_closed() || uip_aborted() || uip_timedout()) { + } else if(uip_connected()) { + PSOCK_INIT(&s->sin, s->inputbuf, sizeof(s->inputbuf) - 1); + PSOCK_INIT(&s->sout, s->inputbuf, sizeof(s->inputbuf) - 1); + PT_INIT(&s->outputpt); + s->state = STATE_WAITING; + /* timer_set(&s->timer, CLOCK_SECOND * 100);*/ + s->timer = 0; + handle_connection(s); + } else if(s != NULL) { + if(uip_poll()) { + ++s->timer; + if(s->timer >= 20) { + uip_abort(); + } + } else { + s->timer = 0; + } + handle_connection(s); + } else { + uip_abort(); + } +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Initialize the web server + * + * This function initializes the web server and should be + * called at system boot-up. + */ +void +httpd_init(void) +{ + uip_listen(HTONS(80)); +} +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd.h new file mode 100644 index 0000000..7f7a666 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/httpd.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2001-2005, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_H__ +#define __HTTPD_H__ + +#include "psock.h" +#include "httpd-fs.h" + +struct httpd_state { + unsigned char timer; + struct psock sin, sout; + struct pt outputpt, scriptpt; + char inputbuf[50]; + char filename[20]; + char state; + struct httpd_fs_file file; + int len; + char *scriptptr; + int scriptlen; + + unsigned short count; +}; + +void httpd_init(void); +void httpd_appcall(void); + +void httpd_log(char *msg); +void httpd_log_file(u16_t *requester, char *file); + +#endif /* __HTTPD_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/makefsdata b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/makefsdata new file mode 100644 index 0000000..8d2715a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/makefsdata @@ -0,0 +1,78 @@ +#!/usr/bin/perl + +open(OUTPUT, "> httpd-fsdata.c"); + +chdir("httpd-fs"); + +opendir(DIR, "."); +@files = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); +closedir(DIR); + +foreach $file (@files) { + + if(-d $file && $file !~ /^\./) { + print "Processing directory $file\n"; + opendir(DIR, $file); + @newfiles = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); + closedir(DIR); + printf "Adding files @newfiles\n"; + @files = (@files, map { $_ = "$file/$_" } @newfiles); + next; + } +} + +foreach $file (@files) { + if(-f $file) { + + print "Adding file $file\n"; + + open(FILE, $file) || die "Could not open file $file\n"; + + $file =~ s-^-/-; + $fvar = $file; + $fvar =~ s-/-_-g; + $fvar =~ s-\.-_-g; + # for AVR, add PROGMEM here + print(OUTPUT "static const unsigned char data".$fvar."[] = {\n"); + print(OUTPUT "\t/* $file */\n\t"); + for($j = 0; $j < length($file); $j++) { + printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1))); + } + printf(OUTPUT "0,\n"); + + + $i = 0; + while(read(FILE, $data, 1)) { + if($i == 0) { + print(OUTPUT "\t"); + } + printf(OUTPUT "%#02x, ", unpack("C", $data)); + $i++; + if($i == 10) { + print(OUTPUT "\n"); + $i = 0; + } + } + print(OUTPUT "0};\n\n"); + close(FILE); + push(@fvars, $fvar); + push(@pfiles, $file); + } +} + +for($i = 0; $i < @fvars; $i++) { + $file = $pfiles[$i]; + $fvar = $fvars[$i]; + + if($i == 0) { + $prevfile = "NULL"; + } else { + $prevfile = "file" . $fvars[$i - 1]; + } + print(OUTPUT "const struct httpd_fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, "); + print(OUTPUT "data$fvar + ". (length($file) + 1) .", "); + print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n"); +} + +print(OUTPUT "#define HTTPD_FS_ROOT file$fvars[$i - 1]\n\n"); +print(OUTPUT "#define HTTPD_FS_NUMFILES $i\n"); diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/makestrings b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/makestrings new file mode 100644 index 0000000..8a13c6d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/makestrings @@ -0,0 +1,40 @@ +#!/usr/bin/perl + + +sub stringify { + my $name = shift(@_); + open(OUTPUTC, "> $name.c"); + open(OUTPUTH, "> $name.h"); + + open(FILE, "$name"); + + while() { + if(/(.+) "(.+)"/) { + $var = $1; + $data = $2; + + $datan = $data; + $datan =~ s/\\r/\r/g; + $datan =~ s/\\n/\n/g; + $datan =~ s/\\01/\01/g; + $datan =~ s/\\0/\0/g; + + printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1); + printf(OUTPUTC "/* \"$data\" */\n"); + printf(OUTPUTC "{"); + for($j = 0; $j < length($datan); $j++) { + printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1))); + } + printf(OUTPUTC "};\n"); + + printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1); + + } + } + close(OUTPUTC); + close(OUTPUTH); +} +stringify("http-strings"); + +exit 0; + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/uIP_Task.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/uIP_Task.c new file mode 100644 index 0000000..6859049 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/uIP_Task.c @@ -0,0 +1,349 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +/* uip includes. */ +#include "hw_types.h" +#include "uip.h" +#include "uip_arp.h" +#include "httpd.h" +#include "timer.h" +#include "clock-arch.h" +#include "hw_ethernet.h" +#include "ethernet.h" +#include "hw_memmap.h" +#include "lmi_flash.h" +#include "sysctl.h" + +/* Demo includes. */ +#include "emac.h" +#include "partest.h" +#include "lcd_message.h" + +struct timer { + clock_time_t start; + clock_time_t interval; +}; + + +/*-----------------------------------------------------------*/ + +/* IP address configuration. */ +#define uipIP_ADDR0 172 +#define uipIP_ADDR1 25 +#define uipIP_ADDR2 218 +#define uipIP_ADDR3 19 + +/* How long to wait before attempting to connect the MAC again. */ +#define uipINIT_WAIT 100 + +/* Shortcut to the header within the Rx buffer. */ +#define xHeader ((struct uip_eth_hdr *) &uip_buf[ 0 ]) + +/* Standard constant. */ +#define uipTOTAL_FRAME_HEADER_SIZE 54 + +/*-----------------------------------------------------------*/ + +/* + * Send the uIP buffer to the MAC. + */ +static void prvENET_Send(void); + +/* + * Setup the MAC address in the MAC itself, and in the uIP stack. + */ +static void prvSetMACAddress( void ); + +/* + * Port functions required by the uIP stack. + */ +void clock_init( void ); +clock_time_t clock_time( void ); + +/*-----------------------------------------------------------*/ + +/* The semaphore used by the ISR to wake the uIP task. */ +extern xSemaphoreHandle xEMACSemaphore; + +/*-----------------------------------------------------------*/ + +void clock_init(void) +{ + /* This is done when the scheduler starts. */ +} +/*-----------------------------------------------------------*/ + +/* Define clock functions here to avoid header file name clash between uIP +and the Luminary Micro driver library. */ +clock_time_t clock_time( void ) +{ + return xTaskGetTickCount(); +} +extern void timer_set(struct timer *t, clock_time_t interval); +extern int timer_expired(struct timer *t); +extern void timer_reset(struct timer *t); + + + + +void vuIP_Task( void *pvParameters ) +{ +portBASE_TYPE i; +uip_ipaddr_t xIPAddr; +struct timer periodic_timer, arp_timer; +extern void ( vEMAC_ISR )( void ); + + /* Enable/Reset the Ethernet Controller */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_ETH ); + SysCtlPeripheralReset( SYSCTL_PERIPH_ETH ); + + /* Create the semaphore used by the ISR to wake this task. */ + vSemaphoreCreateBinary( xEMACSemaphore ); + + /* Initialise the uIP stack. */ + timer_set( &periodic_timer, configTICK_RATE_HZ / 2 ); + timer_set( &arp_timer, configTICK_RATE_HZ * 10 ); + uip_init(); + uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 ); + uip_sethostaddr( xIPAddr ); + httpd_init(); + + while( vInitEMAC() != pdPASS ) + { + vTaskDelay( uipINIT_WAIT ); + } + prvSetMACAddress(); + + + for( ;; ) + { + /* Is there received data ready to be processed? */ + uip_len = uiGetEMACRxData( uip_buf ); + + if( uip_len > 0 ) + { + /* Standard uIP loop taken from the uIP manual. */ + + if( xHeader->type == htons( UIP_ETHTYPE_IP ) ) + { + uip_arp_ipin(); + uip_input(); + + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if( uip_len > 0 ) + { + uip_arp_out(); + prvENET_Send(); + } + } + else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) ) + { + uip_arp_arpin(); + + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if( uip_len > 0 ) + { + prvENET_Send(); + } + } + } + else + { + if( timer_expired( &periodic_timer ) ) + { + timer_reset( &periodic_timer ); + for( i = 0; i < UIP_CONNS; i++ ) + { + uip_periodic( i ); + + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if( uip_len > 0 ) + { + uip_arp_out(); + prvENET_Send(); + } + } + + /* Call the ARP timer function every 10 seconds. */ + if( timer_expired( &arp_timer ) ) + { + timer_reset( &arp_timer ); + uip_arp_timer(); + } + } + else + { + /* We did not receive a packet, and there was no periodic + processing to perform. Block for a fixed period. If a packet + is received during this period we will be woken by the ISR + giving us the Semaphore. */ + xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 2 ); + } + } + } +} +/*-----------------------------------------------------------*/ + +static void prvENET_Send(void) +{ + vInitialiseSend(); + vIncrementTxLength( uip_len ); + vSendBufferToMAC(); +} +/*-----------------------------------------------------------*/ + +static void prvSetMACAddress( void ) +{ +unsigned portLONG ulUser0, ulUser1; +unsigned char pucMACArray[8]; +struct uip_eth_addr xAddr; + + /* Get the device MAC address from flash */ + FlashUserGet(&ulUser0, &ulUser1); + + /* Convert the MAC address from flash into sequence of bytes. */ + pucMACArray[0] = ((ulUser0 >> 0) & 0xff); + pucMACArray[1] = ((ulUser0 >> 8) & 0xff); + pucMACArray[2] = ((ulUser0 >> 16) & 0xff); + pucMACArray[3] = ((ulUser1 >> 0) & 0xff); + pucMACArray[4] = ((ulUser1 >> 8) & 0xff); + pucMACArray[5] = ((ulUser1 >> 16) & 0xff); + + /* Program the MAC address. */ + EthernetMACAddrSet(ETH_BASE, pucMACArray); + + xAddr.addr[ 0 ] = pucMACArray[0]; + xAddr.addr[ 1 ] = pucMACArray[1]; + xAddr.addr[ 2 ] = pucMACArray[2]; + xAddr.addr[ 3 ] = pucMACArray[3]; + xAddr.addr[ 4 ] = pucMACArray[4]; + xAddr.addr[ 5 ] = pucMACArray[5]; + uip_setethaddr( xAddr ); +} +/*-----------------------------------------------------------*/ + +void vApplicationProcessFormInput( portCHAR *pcInputString, portBASE_TYPE xInputLength ) +{ +char *c, *pcText; +static portCHAR cMessageForDisplay[ 32 ]; +extern xQueueHandle xOLEDQueue; +xOLEDMessage xOLEDMessage; + + /* Process the form input sent by the IO page of the served HTML. */ + + c = strstr( pcInputString, "?" ); + + if( c ) + { + /* Turn LED's on or off in accordance with the check box status. */ + if( strstr( c, "LED0=1" ) != NULL ) + { + vParTestSetLED( 0, 1 ); + } + else + { + vParTestSetLED( 0, 0 ); + } + + /* Find the start of the text to be displayed on the LCD. */ + pcText = strstr( c, "LCD=" ); + pcText += strlen( "LCD=" ); + + /* Terminate the file name for further processing within uIP. */ + *c = 0x00; + + /* Terminate the LCD string. */ + c = strstr( pcText, " " ); + if( c != NULL ) + { + *c = 0x00; + } + + /* Add required spaces. */ + while( ( c = strstr( pcText, "+" ) ) != NULL ) + { + *c = ' '; + } + + /* Write the message to the LCD. */ + strcpy( cMessageForDisplay, pcText ); + xOLEDMessage.pcMessage = ( signed portCHAR * ) cMessageForDisplay; + xQueueSend( xOLEDQueue, &xOLEDMessage, portMAX_DELAY ); + } +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/uip-conf.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/uip-conf.h new file mode 100644 index 0000000..455540d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/uip-conf.h @@ -0,0 +1,159 @@ +/** + * \addtogroup uipopt + * @{ + */ + +/** + * \name Project-specific configuration options + * @{ + * + * uIP has a number of configuration options that can be overridden + * for each project. These are kept in a project-specific uip-conf.h + * file and all configuration names have the prefix UIP_CONF. + */ + +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * An example uIP configuration file + * \author + * Adam Dunkels + */ + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + +#include + +/** + * 8 bit datatype + * + * This typedef defines the 8-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint8_t u8_t; + +/** + * 16 bit datatype + * + * This typedef defines the 16-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint16_t u16_t; + +/** + * Statistics datatype + * + * This typedef defines the dataype used for keeping statistics in + * uIP. + * + * \hideinitializer + */ +typedef unsigned short uip_stats_t; + +/** + * Maximum number of TCP connections. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_CONNECTIONS 40 + +/** + * Maximum number of listening TCP ports. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_LISTENPORTS 40 + +/** + * uIP buffer size. + * + * \hideinitializer + */ +#define UIP_CONF_BUFFER_SIZE 1480 + +/** + * CPU byte order. + * + * \hideinitializer + */ +#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN + +/** + * Logging on or off + * + * \hideinitializer + */ +#define UIP_CONF_LOGGING 0 + +/** + * UDP support on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP 0 + +/** + * UDP checksums on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP_CHECKSUMS 1 + +/** + * uIP statistics on or off + * + * \hideinitializer + */ +#define UIP_CONF_STATISTICS 1 + +/* Here we include the header file for the application(s) we use in + our project. */ +/*#include "smtp.h"*/ +/*#include "hello-world.h"*/ +/*#include "telnetd.h"*/ +#include "webserver.h" +/*#include "dhcpc.h"*/ +/*#include "resolv.h"*/ +/*#include "webclient.h"*/ + +#define UIP_CONF_EXTERNAL_BUFFER + +#endif /* __UIP_CONF_H__ */ + +/** @} */ +/** @} */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/webserver.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/webserver.h new file mode 100644 index 0000000..1acb290 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_IAR_Keil/webserver/webserver.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: webserver.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ +#ifndef __WEBSERVER_H__ +#define __WEBSERVER_H__ + +#include "httpd.h" + +typedef struct httpd_state uip_tcp_appstate_t; +/* UIP_APPCALL: the name of the application function. This function + must return void and take no arguments (i.e., C type "void + appfunc(void)"). */ +#ifndef UIP_APPCALL +#define UIP_APPCALL httpd_appcall +#endif + + +#endif /* __WEBSERVER_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/FreeRTOSConfig.h new file mode 100644 index 0000000..c65a929 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/FreeRTOSConfig.h @@ -0,0 +1,150 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 1 +#define configCPU_CLOCK_HZ ( 50000000UL ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 80 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 24000 ) ) +#define configMAX_TASK_NAME_LEN ( 12 ) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 1 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 10 +#define configGENERATE_RUN_TIME_STATS 1 +#define configUSE_MALLOC_FAILED_HOOK 1 +#define configUSE_QUEUE_SETS 1 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configUSE_ALTERNATIVE_API 1 + +#define configMAX_PRIORITIES ( 5UL ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Software timer related constants. */ +#define configUSE_TIMERS 0 +#define configTIMER_TASK_PRIORITY 2 +#define configTIMER_QUEUE_LENGTH 20 +#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE * 2 ) + + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_xSemaphoreGetMutexHolder 1 + +/* This demo makes use of one or more example stats formatting functions. These +format the raw data provided by the uxTaskGetSystemState() function in to human +readable ASCII form. See the notes in the implementation of vTaskList() within +FreeRTOS/Source/tasks.c for limitations. */ +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 + +#define configKERNEL_INTERRUPT_PRIORITY ( ( unsigned char ) 7 << ( unsigned char ) 5 ) /* Priority 7, or 255 as only the top three bits are implemented. This is the lowest priority. */ +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( ( unsigned char ) 5 << ( unsigned char ) 5 ) /* Priority 5, or 160 as only the top three bits are implemented. */ + +extern volatile unsigned long ulHighFrequencyTimerTicks; +/* There is already a high frequency timer running - just reset its count back +to zero. */ +#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ( ulHighFrequencyTimerTicks = 0UL ) +#define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTimerTicks + +/* Use Cortex-M3 optimised task selection rather than the generic C code +version. */ +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 + +/* Disable interrupts and sit in a null loop if assert is called. */ +#define configASSERT( x ) if( ( ( x ) == 0 ) ) { taskDISABLE_INTERRUPTS(); for( ;; ); } + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/IntQueueTimer.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/IntQueueTimer.c new file mode 100644 index 0000000..5d360cb --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/IntQueueTimer.c @@ -0,0 +1,133 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Demo includes. */ +#include "IntQueueTimer.h" +#include "IntQueue.h" + +/* Library includes. */ +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "interrupt.h" +#include "sysctl.h" +#include "lmi_timer.h" + +#define tmrTIMER_2_FREQUENCY ( 2000UL ) +#define tmrTIMER_3_FREQUENCY ( 2001UL ) + +void vInitialiseTimerForIntQueueTest( void ) +{ +unsigned long ulFrequency; + + /* Timer 2 and 3 are utilised for this test. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER2 ); + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER3 ); + TimerConfigure( TIMER2_BASE, TIMER_CFG_32_BIT_PER ); + TimerConfigure( TIMER3_BASE, TIMER_CFG_32_BIT_PER ); + + /* Set the timer interrupts to be above the kernel. The interrupts are + assigned different priorities so they nest with each other. */ + IntPrioritySet( INT_TIMER2A, configMAX_SYSCALL_INTERRUPT_PRIORITY + ( 1 << 5 ) ); /* Shift left 5 as only the top 3 bits are implemented. */ + IntPrioritySet( INT_TIMER3A, configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + /* Ensure interrupts do not start until the scheduler is running. */ + portDISABLE_INTERRUPTS(); + + /* The rate at which the timers will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / tmrTIMER_2_FREQUENCY; + TimerLoadSet( TIMER2_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER2A ); + TimerIntEnable( TIMER2_BASE, TIMER_TIMA_TIMEOUT ); + + /* The rate at which the timers will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / tmrTIMER_3_FREQUENCY; + TimerLoadSet( TIMER3_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER3A ); + TimerIntEnable( TIMER3_BASE, TIMER_TIMA_TIMEOUT ); + + /* Enable both timers. */ + TimerEnable( TIMER2_BASE, TIMER_A ); + TimerEnable( TIMER3_BASE, TIMER_A ); +} +/*-----------------------------------------------------------*/ + +void vT2InterruptHandler( void ) +{ + TimerIntClear( TIMER2_BASE, TIMER_TIMA_TIMEOUT ); + portEND_SWITCHING_ISR( xFirstTimerHandler() ); +} +/*-----------------------------------------------------------*/ + +void vT3InterruptHandler( void ) +{ + TimerIntClear( TIMER3_BASE, TIMER_TIMA_TIMEOUT ); + portEND_SWITCHING_ISR( xSecondTimerHandler() ); +} + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/IntQueueTimer.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/IntQueueTimer.h new file mode 100644 index 0000000..83edd5d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/IntQueueTimer.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef INT_QUEUE_TIMER_H +#define INT_QUEUE_TIMER_H + +void vInitialiseTimerForIntQueueTest( void ); +portBASE_TYPE xTimer0Handler( void ); +portBASE_TYPE xTimer1Handler( void ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/LM3S_Startup.s b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/LM3S_Startup.s new file mode 100644 index 0000000..53ce62b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/LM3S_Startup.s @@ -0,0 +1,199 @@ +/***************************************************************************** + * Copyright (c) 2006 Rowley Associates Limited. * + * * + * This file may be distributed under the terms of the License Agreement * + * provided with this software. * + * * + * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE * + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * + *****************************************************************************/ + +/***************************************************************************** + * Preprocessor Definitions + * ------------------------ + * + * STARTUP_FROM_RESET + * + * If defined, the program will startup from power-on/reset. If not defined + * the program will just loop endlessly from power-on/reset. + * + * This definition is not defined by default on this target because the + * debugger is unable to reset this target and maintain control of it over the + * JTAG interface. The advantage of doing this is that it allows the debugger + * to reset the CPU and run programs from a known reset CPU state on each run. + * It also acts as a safety net if you accidently download a program in FLASH + * that crashes and prevents the debugger from taking control over JTAG + * rendering the target unusable over JTAG. The obvious disadvantage of doing + * this is that your application will not startup without the debugger. + * + * We advise that on this target you keep STARTUP_FROM_RESET undefined whilst + * you are developing and only define STARTUP_FROM_RESET when development is + * complete. + * + *****************************************************************************/ + +.extern xPortPendSVHandler +.extern xPortSysTickHandler +.extern vPortSVCHandler +.extern Timer0IntHandler +.extern vT2InterruptHandler +.extern vT3InterruptHandler +.extern vEMAC_ISR + + +.global reset_handler + +.macro DEFAULT_ISR_HANDLER name= + .thumb_func + .weak \name +\name: +1: b 1b /* endless loop */ +.endm + + .section .vectors, "ax" + .code 16 + .align 0 + .global _vectors + +_vectors: + .word __stack_end__ +#ifdef STARTUP_FROM_RESET + .word reset_handler +#else + .word reset_wait +#endif /* STARTUP_FROM_RESET */ + .word Nmi_ISR + .word Fault_ISR + .word MPU_Fault_ISR + .word 0 /* Populate if using Bus fault */ + .word 0 /* Populate if using Usage fault */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word vPortSVCHandler + .word 0 /* Populate if using a debug monitor */ + .word 0 /* Reserved */ + .word xPortPendSVHandler + .word xPortSysTickHandler + .word GPIO_Port_A_ISR + .word GPIO_Port_B_ISR + .word GPIO_Port_C_ISR + .word GPIO_Port_D_ISR + .word GPIO_Port_E_ISR + .word UART0_ISR + .word UART1_ISR + .word SSI_ISR + .word I2C_ISR + .word PWM_Fault_ISR + .word PWM_Generator_0_ISR + .word PWM_Generator_1_ISR + .word PWM_Generator_2_ISR + .word QEI_ISR + .word ADC_Sequence_0_ISR + .word ADC_Sequence_1_ISR + .word ADC_Sequence_2_ISR + .word ADC_Sequence_3_ISR + .word Watchdog_Timer_ISR + .word Timer0IntHandler + .word Timer0B_ISR + .word Timer1A_ISR + .word Timer1B_ISR + .word vT2InterruptHandler + .word Timer2B_ISR + .word Analog_Comparator_0_ISR + .word Analog_Comparator_1_ISR + .word Analog_Comparator_2_ISR + .word System_Control_ISR + .word FLASH_Control_ISR + .word GPIO_Port_F_ISR + .word GPIO_Port_G_ISR + .word GPIO_Port_H_ISR + .word UART2_ISR + .word SSI1_ISR + .word vT3InterruptHandler + .word Timer3B_ISR + .word I2C1_ISR + .word QEI1_ISR + .word CAN0_ISR + .word CAN1_ISR + .word CAN2_ISR + .word vEMAC_ISR + .word HIBERNATE_ISR + .word USB0_ISR + .word PWM_Generator_3_ISR + .word uDMA_Software_Transfer_ISR + .word uDMA_Error_ISR +_vectors_end: + + .section .init, "ax" + .thumb_func + +reset_handler: +#ifdef __RAM_BUILD + /* If this is a RAM build, configure vector table offset register to point + to the RAM vector table. */ + ldr r0, =0xE000ED08 + ldr r1, =_vectors + str r1, [r0] +#endif + b _start + +DEFAULT_ISR_HANDLER Nmi_ISR +DEFAULT_ISR_HANDLER Fault_ISR +DEFAULT_ISR_HANDLER MPU_Fault_ISR +DEFAULT_ISR_HANDLER SVCall_ISR +DEFAULT_ISR_HANDLER SysTick_ISR +DEFAULT_ISR_HANDLER PendSV_ISR +DEFAULT_ISR_HANDLER GPIO_Port_A_ISR +DEFAULT_ISR_HANDLER GPIO_Port_B_ISR +DEFAULT_ISR_HANDLER GPIO_Port_C_ISR +DEFAULT_ISR_HANDLER GPIO_Port_D_ISR +DEFAULT_ISR_HANDLER GPIO_Port_E_ISR +DEFAULT_ISR_HANDLER UART0_ISR +DEFAULT_ISR_HANDLER UART1_ISR +DEFAULT_ISR_HANDLER SSI_ISR +DEFAULT_ISR_HANDLER I2C_ISR +DEFAULT_ISR_HANDLER PWM_Fault_ISR +DEFAULT_ISR_HANDLER PWM_Generator_0_ISR +DEFAULT_ISR_HANDLER PWM_Generator_1_ISR +DEFAULT_ISR_HANDLER PWM_Generator_2_ISR +DEFAULT_ISR_HANDLER QEI_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_0_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_1_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_2_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_3_ISR +DEFAULT_ISR_HANDLER Watchdog_Timer_ISR +DEFAULT_ISR_HANDLER Timer0A_ISR +DEFAULT_ISR_HANDLER Timer0B_ISR +DEFAULT_ISR_HANDLER Timer1A_ISR +DEFAULT_ISR_HANDLER Timer1B_ISR +DEFAULT_ISR_HANDLER Timer2A_ISR +DEFAULT_ISR_HANDLER Timer2B_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_0_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_1_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_2_ISR +DEFAULT_ISR_HANDLER System_Control_ISR +DEFAULT_ISR_HANDLER FLASH_Control_ISR +DEFAULT_ISR_HANDLER GPIO_Port_F_ISR +DEFAULT_ISR_HANDLER GPIO_Port_G_ISR +DEFAULT_ISR_HANDLER GPIO_Port_H_ISR +DEFAULT_ISR_HANDLER UART2_ISR +DEFAULT_ISR_HANDLER SSI1_ISR +DEFAULT_ISR_HANDLER Timer3A_ISR +DEFAULT_ISR_HANDLER Timer3B_ISR +DEFAULT_ISR_HANDLER I2C1_ISR +DEFAULT_ISR_HANDLER QEI1_ISR +DEFAULT_ISR_HANDLER CAN0_ISR +DEFAULT_ISR_HANDLER CAN1_ISR +DEFAULT_ISR_HANDLER CAN2_ISR +DEFAULT_ISR_HANDLER ETHERNET_ISR +DEFAULT_ISR_HANDLER HIBERNATE_ISR +DEFAULT_ISR_HANDLER USB0_ISR +DEFAULT_ISR_HANDLER PWM_Generator_3_ISR +DEFAULT_ISR_HANDLER uDMA_Software_Transfer_ISR +DEFAULT_ISR_HANDLER uDMA_Error_ISR + +#ifndef STARTUP_FROM_RESET +DEFAULT_ISR_HANDLER reset_wait +#endif /* STARTUP_FROM_RESET */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/LM3S_Target.js b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/LM3S_Target.js new file mode 100644 index 0000000..55a9c2c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/LM3S_Target.js @@ -0,0 +1,28 @@ +/****************************************************************************** + Target Script for LM3S. + + Copyright (c) 2006 Rowley Associates Limited. + + This file may be distributed under the terms of the License Agreement + provided with this software. + + THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE + WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + ******************************************************************************/ + +function Reset() +{ + TargetInterface.resetAndStop(1000); +} + +function RAMReset() +{ + Reset(); +} + +function FLASHReset() +{ + Reset(); +} + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/ParTest/ParTest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/ParTest/ParTest.c new file mode 100644 index 0000000..f7b26ef --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/ParTest/ParTest.c @@ -0,0 +1,113 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Simple parallel port IO routines. + *-----------------------------------------------------------*/ + +/* +*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo includes. */ +#include "partest.h" + +/* Library includes. */ +#include "hw_types.h" +#include "gpio.h" +#include "hw_memmap.h" + + +/*-----------------------------------------------------------*/ + +void vParTestInitialise( void ) +{ + GPIODirModeSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_DIR_MODE_OUT ); + GPIOPadConfigSet( GPIO_PORTF_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, 0 ); +} +/*-----------------------------------------------------------*/ + +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + GPIOPinWrite( GPIO_PORTF_BASE, GPIO_PIN_0, xValue ); +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxParTestGetLED( unsigned portBASE_TYPE uxLED ) +{ + /* There is only one LED. */ + ( void ) uxLED; + + return GPIOPinRead( GPIO_PORTF_BASE, GPIO_PIN_0 ); +} + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/RTOSDemo.hzp b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/RTOSDemo.hzp new file mode 100644 index 0000000..a8fc86c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/RTOSDemo.hzp @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/RTOSDemo.hzs b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/RTOSDemo.hzs new file mode 100644 index 0000000..4d744e7 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/RTOSDemo.hzs @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/bitmap.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/bitmap.h new file mode 100644 index 0000000..29f813f --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/bitmap.h @@ -0,0 +1,336 @@ +#ifndef BITMAP_H +#define BITMAP_H + +#define bmpBITMAP_HEIGHT 50 +#define bmpBITMAP_WIDTH 128 + +const unsigned char pucBasicBitmap[] = +{ +0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0x00, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, +0x00, 0x8f, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x88, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xf0, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, +0x00, 0x70, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0x88, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x0f, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0x87, 0x77, +0x77, 0x77, 0x78, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x88, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0x80, 0x00, 0x8f, 0x8f, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x8f, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x07, 0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x0f, 0x00, 0x8f, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, +0x00, 0x8f, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, +0x78, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x08, 0x00, 0x88, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0x88, 0x88, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x70, 0x07, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0x77, 0x77, +0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x87, 0x88, +0x88, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x7f, 0xff, +0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xf7, 0x88, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf7, +0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x00, 0x88, 0x88, 0x88, 0xff, 0x87, 0x77, 0x77, 0x77, +0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0xff, +0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, +0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x78, 0xff, 0xff, 0xff, 0x87, 0x77, +0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, +0x00, 0x00, 0x00, 0xff, 0x87, 0x77, 0x77, 0x77, 0xff, 0xff, 0xff, 0xff, 0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, +0x77, 0x77, 0x77, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, +0xff, 0xff, 0x87, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x8f, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x07, 0xff, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x88, +0xff, 0xff, 0xff, 0xff, 0x88, 0x88, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x87, 0x77, 0x77, 0x77, +0x88, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x88, 0x77, 0x77, 0x77, 0x77, 0x88, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x0f, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0x00, 0x07, 0x70, 0x07, +0x88, 0x88, 0x88, 0xff, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, +0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x70, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0x70, 0x08, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaf, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xaa, +0xaa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xfa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xa0, 0x00, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, +0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, +0x00 }; + +const unsigned char pucGrLibBitmap[] = +{ + IMAGE_FMT_4BPP_COMP, + 124, 0, + 49, 0, + + 15, + 0x00, 0x00, 0x00, + 0x00, 0x0c, 0x00, + 0x20, 0x44, 0x20, + 0x00, 0x75, 0x00, + 0x69, 0x69, 0x69, + 0x00, 0xc2, 0x00, + 0x00, 0xd2, 0x00, + 0x38, 0xb6, 0x38, + 0x00, 0xea, 0x00, + 0x00, 0xf2, 0x00, + 0xaa, 0xb2, 0xaa, + 0x65, 0xff, 0x65, + 0x69, 0xff, 0x69, + 0x6d, 0xff, 0x6d, + 0x71, 0xff, 0x71, + 0xff, 0xff, 0xff, + + 0x03, 0x21, 0x33, 0x53, 0x33, 0x33, 0x33, 0xe9, 0xd4, 0xf8, 0xa7, 0x5f, + 0x17, 0x07, 0x06, 0x35, 0x33, 0x12, 0x03, 0x23, 0x96, 0x68, 0x88, 0x88, + 0x88, 0xe9, 0xd4, 0xf8, 0xa7, 0x5f, 0x17, 0x07, 0x06, 0x86, 0x69, 0x32, + 0x03, 0x29, 0x66, 0x65, 0x66, 0x66, 0x66, 0xe9, 0xd4, 0xf8, 0xa7, 0x5f, + 0x17, 0x07, 0x06, 0x56, 0x66, 0x92, 0x07, 0x78, 0x63, 0x11, 0x11, 0x11, + 0xe9, 0xd4, 0xa7, 0xf0, 0x5f, 0x17, 0x07, 0x07, 0x11, 0x36, 0x87, 0x78, + 0x0f, 0x63, 0x00, 0x00, 0x00, 0xe9, 0xd4, 0xa7, 0x5f, 0xe0, 0x17, 0x07, + 0x07, 0x00, 0x36, 0x87, 0x78, 0x63, 0xfe, 0x07, 0x07, 0x77, 0x2f, 0x07, + 0x07, 0x02, 0x36, 0x1e, 0x87, 0x78, 0x63, 0x07, 0x07, 0x77, 0x2f, 0x00, + 0x10, 0x01, 0x22, 0x20, 0x07, 0x00, 0x00, 0x22, 0x21, 0x84, 0x03, 0x36, + 0x87, 0x78, 0x63, 0x02, 0x02, 0xaa, 0x01, 0xa2, 0x22, 0x20, 0x02, 0x77, + 0x77, 0x77, 0xe9, 0x3a, 0x22, 0x22, 0x7a, 0xa4, 0x71, 0x20, 0x0a, 0x27, + 0xb8, 0x29, 0x72, 0xb2, 0x9e, 0x93, 0x36, 0x87, 0x78, 0x40, 0x63, 0x62, + 0x2a, 0xff, 0xf2, 0xaa, 0x40, 0x07, 0x08, 0xad, 0xdd, 0xdd, 0xdd, 0xe9, + 0xd7, 0x72, 0x00, 0x40, 0x00, 0xa6, 0xdd, 0xda, 0x70, 0x00, 0x00, 0x02, + 0x00, 0x77, 0xdd, 0xdc, 0xcc, 0xcd, 0xde, 0xc7, 0x20, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x27, 0xde, 0xdc, 0x08, 0xcc, 0xcc, 0xdd, 0xea, 0x99, + 0x36, 0x87, 0x78, 0x40, 0x63, 0x69, 0x02, 0xaf, 0xaa, 0xf2, 0x2f, 0xa0, + 0x04, 0x02, 0xdb, 0xbb, 0xbb, 0xbb, 0xe9, 0xbc, 0xe7, 0x10, 0x20, 0x00, + 0x07, 0xa5, 0xbb, 0xbd, 0x70, 0x00, 0x10, 0x00, 0x27, 0xec, 0x3b, 0xcd, + 0xd7, 0x00, 0x00, 0x80, 0x9f, 0xbd, 0x20, 0x00, 0x00, 0x36, 0x87, 0x78, + 0x40, 0x63, 0x69, 0x02, 0xfa, 0x2a, 0xf2, 0x2f, 0xa0, 0x31, 0x02, 0xdb, + 0x43, 0x31, 0x42, 0x00, 0x07, 0xa7, 0x0a, 0x70, 0x00, 0x02, 0xdd, 0x41, + 0xcc, 0x21, 0xce, 0x04, 0x70, 0x00, 0x00, 0x02, 0x7d, 0x39, 0xbc, 0xcb, + 0x00, 0xbb, 0xbd, 0x20, 0x00, 0x00, 0x36, 0x87, 0x78, 0x20, 0x63, 0x00, + 0x69, 0xfa, 0x0a, 0xf2, 0x2f, 0xa0, 0x01, 0x02, 0xdb, 0xbb, 0xbb, 0xdd, + 0xdd, 0xdc, 0x11, 0x08, 0xe7, 0x00, 0x07, 0xad, 0xbb, 0xcd, 0xdd, 0xda, + 0x09, 0x70, 0x00, 0x2d, 0xcb, 0x41, 0xcc, 0xdd, 0xd1, 0x04, 0xe7, 0x00, + 0x00, 0x07, 0xeb, 0x51, 0xdc, 0xcd, 0x00, 0xdd, 0xdd, 0x20, 0x00, 0x00, + 0x36, 0x87, 0x78, 0x00, 0x63, 0x00, 0x00, 0x00, 0x02, 0xfa, 0x2a, 0xf2, + 0x00, 0xaf, 0xa0, 0x02, 0xdb, 0xbb, 0xbd, 0x72, 0x22, 0x00, 0x77, 0xdc, + 0xbb, 0xbb, 0xc7, 0x20, 0x07, 0x77, 0x04, 0x77, 0x77, 0xcb, 0xbb, 0xbc, + 0xd1, 0x20, 0x01, 0x28, 0x7d, 0xbb, 0x42, 0x27, 0x41, 0xcd, 0x20, 0x00, + 0x40, 0x27, 0x51, 0x72, 0x22, 0x22, 0x27, 0x7c, 0x20, 0x00, 0x00, 0x00, + 0x36, 0x87, 0x78, 0x63, 0x00, 0x00, 0x00, 0x00, 0x02, 0xaf, 0xaa, 0xfa, + 0xff, 0x20, 0x02, 0x10, 0xdb, 0xbb, 0xbe, 0x61, 0x2d, 0xbb, 0xbb, 0xcc, + 0xa8, 0x29, 0x00, 0x89, 0xbd, 0xc3, 0xeb, 0xbb, 0xbb, 0x00, 0xd7, 0x10, + 0x00, 0x00, 0x2c, 0xcb, 0xbb, 0xbd, 0x58, 0x70, 0x12, 0xc7, 0x13, 0x29, + 0x36, 0x87, 0x78, 0x40, 0x63, 0xa9, 0x00, 0xaf, 0xff, 0xff, 0xfa, 0x20, + 0x08, 0x02, 0xdb, 0xbb, 0xbd, 0x39, 0x07, 0xdb, 0xbb, 0x72, 0xcc, 0x03, + 0x8c, 0x82, 0xbd, 0x70, 0x84, 0xbc, 0x03, 0xd2, 0x00, 0x2d, 0xbb, 0xbb, + 0xd7, 0x19, 0x01, 0x02, 0x00, 0x00, 0x36, 0x87, 0x78, 0x63, 0xa2, 0x0a, + 0x10, 0xaf, 0xff, 0xa2, 0x0a, 0xbd, 0x20, 0x00, 0x00, 0x0c, 0x07, 0xdb, + 0xbb, 0xc7, 0xc9, 0x8e, 0x00, 0x2c, 0x40, 0xcb, 0xc4, 0x00, 0x7c, 0xbb, + 0xbb, 0xe7, 0x00, 0x06, 0x2d, 0xbb, 0xbb, 0xc7, 0x10, 0x92, 0x31, 0x36, + 0x10, 0x87, 0x78, 0x63, 0xab, 0x22, 0x22, 0x00, 0x00, 0x00, 0x02, 0xdb, + 0xbb, 0xbd, 0x20, 0x00, 0x00, 0x07, 0x18, 0xcb, 0xbb, 0xd7, 0x0a, 0x8d, + 0x00, 0x2d, 0xbb, 0x23, 0xbb, 0xc7, 0x82, 0x00, 0x2e, 0xbb, 0x39, 0x91, + 0x20, 0xbd, 0x72, 0x8b, 0x00, 0x00, 0x36, 0x87, 0x78, 0x48, 0x63, 0x33, + 0x02, 0x20, 0xe1, 0xdb, 0xbb, 0xbd, 0x01, 0x20, 0x00, 0x02, 0x7d, 0xbb, + 0xbb, 0xe2, 0x6b, 0x94, 0x8b, 0x00, 0x00, 0x81, 0xd7, 0x82, 0x00, 0x2d, + 0x00, 0xbb, 0xbb, 0xc7, 0x20, 0x2c, 0xcb, 0xbb, 0xbb, 0x10, 0xdd, 0x77, + 0x22, 0x7b, 0x36, 0x87, 0x78, 0x63, 0x80, 0x32, 0x02, 0xaa, 0xf2, 0x22, + 0x20, 0x02, 0xdb, 0x00, 0xbb, 0xbc, 0x77, 0x77, 0x77, 0xdb, 0xbb, 0xce, + 0x42, 0x71, 0x63, 0xdb, 0xbb, 0xbd, 0x20, 0x19, 0x7d, 0x10, 0xbb, 0xbb, + 0xd2, 0x82, 0x00, 0x27, 0xcb, 0xbb, 0x00, 0xc7, 0x20, 0x07, 0xeb, 0xbb, + 0xbb, 0xbb, 0xcd, 0x21, 0xd7, 0x72, 0x72, 0x36, 0x87, 0x78, 0x63, 0x32, + 0x01, 0x4f, 0xff, 0xf2, 0xaf, 0xa0, 0x02, 0xdb, 0x41, 0x03, 0xdd, 0xdc, + 0xbb, 0xbc, 0xd7, 0x20, 0x22, 0x89, 0x42, 0xbd, 0xba, 0x7d, 0xbb, 0xbb, + 0xd2, 0x82, 0x00, 0x02, 0x27, 0xcb, 0xbb, 0xcc, 0x20, 0x02, 0x89, 0xbb, + 0x08, 0xbb, 0xbc, 0xdd, 0x72, 0x31, 0x36, 0x87, 0x78, 0x40, 0x63, 0x31, + 0x02, 0xaf, 0xaa, 0xf2, 0x2f, 0xa0, 0x21, 0x02, 0xdb, 0x3a, 0xbb, 0xbb, + 0xc7, 0x20, 0x31, 0x88, 0x59, 0xdb, 0xbb, 0xbd, 0xb2, 0x7d, 0xbb, 0xbb, + 0x40, 0xd2, 0x7b, 0x27, 0xcb, 0xbb, 0xcc, 0x20, 0x00, 0x00, 0x27, 0xec, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbc, 0xe7, 0x84, 0x29, 0x36, 0x87, 0x78, 0x63, + 0x31, 0x02, 0xfa, 0x02, 0x0a, 0xf2, 0x2f, 0xa0, 0x02, 0xdb, 0x42, 0xbb, + 0x31, 0xbb, 0xc7, 0x39, 0x5a, 0xdb, 0xbb, 0xbd, 0xb2, 0x08, 0x7d, 0xbb, + 0xbb, 0xd2, 0x7b, 0x27, 0xcb, 0xbb, 0x00, 0xcc, 0x20, 0x00, 0x02, 0x77, + 0xed, 0xcb, 0xbb, 0x00, 0xbb, 0xbb, 0xbd, 0x71, 0x00, 0x00, 0x36, 0x87, + 0x20, 0x78, 0x63, 0x31, 0x02, 0xfa, 0x0a, 0xf2, 0x2f, 0x00, 0xa0, 0x02, + 0xdb, 0xbb, 0xbb, 0xcd, 0xdd, 0xcb, 0x18, 0xbb, 0xbc, 0xe2, 0x69, 0x59, + 0xdb, 0xbb, 0xbd, 0x42, 0x20, 0x19, 0x7d, 0xbb, 0xbb, 0xd2, 0x7b, 0x27, + 0x10, 0xcb, 0xbb, 0xcb, 0x79, 0x02, 0x27, 0x7d, 0xdc, 0x00, 0xbb, 0xbb, + 0xbb, 0xe2, 0x00, 0x00, 0x36, 0x87, 0x20, 0x78, 0x63, 0x31, 0x02, 0xfa, + 0x2a, 0xf2, 0xaf, 0x00, 0xa0, 0x02, 0xdb, 0xbb, 0xbd, 0x72, 0x27, 0x4c, + 0x1d, 0xbb, 0xbb, 0xd7, 0x69, 0x59, 0x89, 0x20, 0x19, 0x42, 0x7d, 0x7e, + 0x2c, 0xbb, 0xbb, 0xc7, 0x7a, 0x00, 0x10, 0x22, 0x7c, 0xcb, 0x63, 0x36, + 0x87, 0x78, 0x63, 0x80, 0x31, 0x02, 0xaf, 0xfa, 0xff, 0xff, 0x20, 0x02, + 0x00, 0xdb, 0xbb, 0xbd, 0x20, 0x00, 0x2c, 0xcb, 0xbb, 0x28, 0xcb, 0x20, + 0x61, 0x00, 0x8c, 0x00, 0x00, 0x2d, 0x12, 0xbb, 0xbb, 0xd7, 0x82, 0x00, + 0x2e, 0xbe, 0x00, 0x21, 0x02, 0x7c, 0x63, 0x36, 0x87, 0x78, 0x63, 0x32, + 0x00, 0x2f, 0xff, 0xff, 0xfa, 0x00, 0x02, 0xdb, 0xbb, 0x00, 0xbd, 0x20, + 0x00, 0x07, 0xdb, 0xbb, 0xbe, 0x20, 0xc2, 0x62, 0x8c, 0x00, 0x00, 0x2c, + 0xcb, 0xc4, 0x00, 0x0c, 0x7d, 0xbb, 0xbb, 0xe7, 0x3a, 0x19, 0x2d, 0xbb, + 0x00, 0xbb, 0xc7, 0x00, 0x00, 0x36, 0x87, 0x78, 0x63, 0x80, 0x3a, 0x02, + 0xaa, 0xaa, 0x40, 0x00, 0x02, 0xdb, 0x00, 0xbb, 0xbd, 0x20, 0x00, 0x02, + 0xcc, 0xbb, 0xbd, 0x63, 0x70, 0x63, 0x8b, 0x00, 0x00, 0x07, 0x49, 0x7a, + 0x98, 0x09, 0xbb, 0xd2, 0x3a, 0x19, 0x2d, 0xbb, 0xbb, 0x01, 0xd7, 0x00, + 0x00, 0x36, 0x87, 0x78, 0x63, 0x3a, 0x14, 0xaa, 0x22, 0x20, 0x0b, 0xbd, + 0xc9, 0x7d, 0xbb, 0x30, 0xbb, 0xd2, 0x61, 0x8e, 0x00, 0x02, 0xeb, 0xbb, + 0x20, 0xbb, 0xd7, 0x79, 0x27, 0xcb, 0xbb, 0xbd, 0x70, 0x24, 0x00, 0x02, + 0x6a, 0x00, 0x7d, 0x6b, 0x36, 0x87, 0x24, 0x78, 0x63, 0x39, 0x02, 0xff, + 0x62, 0x02, 0xdb, 0x21, 0xbb, 0xbd, 0x21, 0x2e, 0xbb, 0xbb, 0xe7, 0x61, + 0x80, 0x8e, 0x00, 0x02, 0x7d, 0xbb, 0xbb, 0xbd, 0x72, 0x00, 0x22, 0x27, + 0xcc, 0xbb, 0xbb, 0xcd, 0x20, 0x00, 0x08, 0x07, 0xe7, 0x72, 0x22, 0xa3, + 0xe2, 0x00, 0x00, 0x00, 0x36, 0x87, 0x78, 0x63, 0x00, 0x00, 0x00, 0x02, + 0x20, 0xaf, 0xa0, 0xd2, 0xdb, 0xbb, 0xbd, 0x20, 0x00, 0x03, 0x00, 0x2b, + 0xcb, 0xbb, 0xc7, 0x10, 0x8f, 0x11, 0x01, 0x2d, 0xcb, 0xbb, 0xbb, 0xdd, + 0xb7, 0xcd, 0xd1, 0x00, 0xe7, 0x00, 0x00, 0x07, 0xdc, 0xdd, 0xcb, 0x7b, + 0x00, 0xdd, 0xcb, 0xbb, 0xbc, 0x72, 0x00, 0x00, 0x36, 0x10, 0x87, 0x78, + 0x63, 0x01, 0x00, 0x2a, 0xfa, 0x42, 0x01, 0x22, 0x20, 0x02, 0xdb, 0xbb, + 0xbd, 0x20, 0x01, 0xb0, 0xcc, 0x00, 0x8d, 0xb9, 0xec, 0xbb, 0xbb, 0xbb, + 0x00, 0xcc, 0xcb, 0xbb, 0xbb, 0xbe, 0x71, 0x00, 0x00, 0x05, 0x27, 0xcb, + 0xbb, 0xcc, 0xcc, 0x81, 0xce, 0x29, 0x08, 0x36, 0x87, 0x78, 0x63, 0x02, + 0xaa, 0xff, 0xff, 0x02, 0xff, 0xa0, 0x02, 0xdb, 0xbb, 0xbd, 0x61, 0x02, + 0x0e, 0xeb, 0xbb, 0xbd, 0x70, 0x5a, 0x8c, 0x09, 0x27, 0x00, 0xec, 0xbb, + 0xbb, 0xbb, 0xbb, 0xbb, 0xbd, 0xd7, 0x54, 0x10, 0xa1, 0xcb, 0xa4, 0xd2, + 0x31, 0x36, 0x87, 0x20, 0x78, 0x63, 0x01, 0x02, 0xff, 0xff, 0xff, 0xff, + 0x02, 0xa0, 0x07, 0xad, 0xdd, 0xda, 0x20, 0x99, 0xde, 0x1c, 0xdd, 0xde, + 0xc2, 0x21, 0x8d, 0x0a, 0x7c, 0xed, 0x04, 0xcc, 0xcc, 0xcc, 0xde, 0xd7, + 0x92, 0x2c, 0xed, 0x40, 0xdc, 0xa7, 0x36, 0x87, 0x78, 0x63, 0x00, 0x02, + 0x00, 0x22, 0x02, 0xaa, 0xaa, 0xaa, 0xaa, 0x20, 0x02, 0x1b, 0x77, 0x77, + 0x77, 0x5a, 0xc9, 0x72, 0x21, 0x8e, 0x88, 0xaa, 0x27, 0x77, 0x7b, 0x9d, + 0x12, 0x27, 0x77, 0x20, 0x77, 0xb7, 0x3d, 0x36, 0x87, 0x78, 0x63, 0x00, + 0x3e, 0x02, 0xaa, 0x43, 0x22, 0xc6, 0x87, 0x3e, 0x12, 0x21, 0x22, 0x22, + 0x06, 0x01, 0x22, 0x22, 0x21, 0x04, 0x00, 0x36, 0x87, 0x78, 0x63, 0x00, + 0x02, 0xfa, 0x22, 0x3f, 0xaa, 0x20, 0x26, 0xc6, 0x87, 0x3f, 0x07, 0x07, + 0x00, 0x36, 0x87, 0x78, 0x63, 0x00, 0x02, 0xfa, 0x02, 0x7e, 0xff, 0x07, + 0x07, 0x77, 0x2f, 0x07, 0x06, 0x36, 0x00, 0x87, 0x78, 0x63, 0x00, 0x02, + 0xff, 0xaa, 0xfa, 0x07, 0x44, 0x44, 0x44, 0x20, 0x02, 0xd9, 0xc1, 0xd4, + 0xf0, 0xa7, 0x5f, 0x17, 0x04, 0x42, 0x00, 0x00, 0x36, 0x00, 0x87, 0x78, + 0x63, 0x00, 0x02, 0xff, 0xff, 0xff, 0x9f, 0xe9, 0xa0, 0x0a, 0xc4, 0x94, + 0xa7, 0x5f, 0x17, 0x80, 0x04, 0xfa, 0x20, 0x00, 0x36, 0x87, 0x78, 0x63, + 0x13, 0x00, 0x00, 0xaf, 0x03, 0xa0, 0x0a, 0x07, 0xbf, 0xe0, 0x77, 0x2f, + 0x07, 0xfa, 0x20, 0x00, 0x36, 0x87, 0x00, 0x78, 0x63, 0x00, 0x00, 0x02, + 0xaa, 0xfa, 0xaa, 0x0f, 0xaa, 0xaa, 0x20, 0x02, 0xd9, 0xc1, 0xd4, 0xa7, + 0xe0, 0x5f, 0x17, 0x05, 0x00, 0x00, 0x36, 0x87, 0x78, 0x03, 0x63, 0x00, + 0x00, 0x00, 0x02, 0xff, 0xd9, 0xc1, 0xfc, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0x03, 0x36, 0x87, 0x23, 0x78, 0x63, 0x01, 0x02, 0x44, 0x20, 0x07, 0x07, + 0xf0, 0x77, 0x2f, 0x07, 0x05, 0x36, 0x87, 0x78, 0x63, 0xfe, 0x07, 0x07, + 0x77, 0x2f, 0x07, 0x07, 0x02, 0x36, 0x1f, 0x87, 0x78, 0x63, 0x07, 0x07, + 0x77, 0x2f, 0x07, 0xc0, 0x07, 0x02, 0x36, 0x87, 0x78, 0x63, 0x11, 0x11, + 0x7f, 0x11, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x07, 0x00, 0x11, 0x36, + 0x87, 0x29, 0x66, 0x55, 0x55, 0x55, 0xfe, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, + 0x07, 0x07, 0x55, 0x00, 0x66, 0x92, 0x23, 0x96, 0x68, 0x88, 0x88, 0x88, + 0xfe, 0xe9, 0xd4, 0xa7, 0x5f, 0x17, 0x07, 0x06, 0x86, 0x01, 0x69, 0x32, + 0x21, 0x33, 0x55, 0x55, 0x55, 0xe9, 0xfc, 0xd4, 0xa7, 0x5f, 0x17, 0x07, + 0x07, 0x55, 0x33, 0x00, 0x12, +}; + + +#endif diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/formike128x128x16.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/formike128x128x16.c new file mode 100644 index 0000000..87ff5fe --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/formike128x128x16.c @@ -0,0 +1,902 @@ +//***************************************************************************** +// +// formike128x128x16.c - Display driver for the Formike Electronic +// KWH015C04-F01 CSTN panel with an ST7637 controller. +// +// Copyright (c) 2008 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. You may not combine +// this software with "viral" open-source software in order to form a larger +// program. Any use in violation of the foregoing restrictions may subject +// the user to criminal sanctions under applicable laws, as well as to civil +// liability for the breach of the terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2523 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3s3748_api +//! @{ +// +//***************************************************************************** + +#include "hw_gpio.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "gpio.h" +#include "sysctl.h" +#include "rom.h" +#include "grlib.h" +#include "formike128x128x16.h" +#include + +//***************************************************************************** +// +// Defines for the pins that are used to communicate with the ST7637. +// +//***************************************************************************** +#define LCD_A0_BASE GPIO_PORTB_BASE +#define LCD_A0_PIN GPIO_PIN_2 +#define LCD_WR_BASE GPIO_PORTC_BASE +#define LCD_WR_PIN GPIO_PIN_4 +#define LCD_RD_BASE GPIO_PORTC_BASE +#define LCD_RD_PIN GPIO_PIN_5 +#define LCD_BL_BASE GPIO_PORTF_BASE +#define LCD_BL_PIN GPIO_PIN_1 +#define LCD_DATA_BASE GPIO_PORTG_BASE + +//***************************************************************************** +// +// Translates a 24-bit RGB color to a display driver-specific color. +// +// \param c is the 24-bit RGB color. The least-significant byte is the blue +// channel, the next byte is the green channel, and the third byte is the red +// channel. +// +// This macro translates a 24-bit RGB color into a value that can be written +// into the display's frame buffer in order to reproduce that color, or the +// closest possible approximation of that color. +// +// \return Returns the display-driver specific color. +// +//***************************************************************************** +#define DPYCOLORTRANSLATE(c) ((((c) & 0x00ff0000) >> 19) | \ + ((((c) & 0x0000ff00) >> 5) & 0x000007e0) | \ + ((((c) & 0x000000ff) << 8) & 0x0000f800)) + +//***************************************************************************** +// +// Writes a data word to the ST7637. +// +//***************************************************************************** +static void +WriteData(unsigned char ucData) +{ + // + // Write the data to the data bus. + // + HWREG(LCD_DATA_BASE + GPIO_O_DATA + (0xff << 2)) = ucData; + + // + // Assert the write enable signal. + // + HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0; + + // + // Deassert the write enable signal. + // + HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; +} + +//***************************************************************************** +// +// Writes a command to the ST7637. +// +//***************************************************************************** +static void +WriteCommand(unsigned char ucData) +{ + // + // Write the command to the data bus. + // + HWREG(LCD_DATA_BASE + GPIO_O_DATA + (0xff << 2)) = ucData; + + // + // Set the A0 signal low, indicating a command. + // + HWREG(LCD_A0_BASE + GPIO_O_DATA + (LCD_A0_PIN << 2)) = 0; + + // + // Assert the write enable signal. + // + HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = 0; + + // + // Deassert the write enable signal. + // + HWREG(LCD_WR_BASE + GPIO_O_DATA + (LCD_WR_PIN << 2)) = LCD_WR_PIN; + + // + // Set the A0 signal high, indicating that following writes are data. + // + HWREG(LCD_A0_BASE + GPIO_O_DATA + (LCD_A0_PIN << 2)) = LCD_A0_PIN; +} + +//***************************************************************************** +// +//! Initializes the display driver. +//! +//! This function initializes the ST7637 display controller on the panel, +//! preparing it to display data. +//! +//! \return None. +// +//***************************************************************************** +void +Formike128x128x16Init(void) +{ + unsigned long ulClockMS, ulCount; + + // + // Get the value to pass to SysCtlDelay() in order to delay for 1 ms. + // + ulClockMS = SysCtlClockGet() / (3 * 1000); + + // + // Enable the GPIO peripherals used to interface to the ST7637. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOG); + + // + // Configure the pins that connect to the LCD as GPIO outputs. + // + GPIOPinTypeGPIOOutput(LCD_A0_BASE, LCD_A0_PIN); + GPIOPinTypeGPIOOutput(LCD_WR_BASE, LCD_WR_PIN); + GPIOPinTypeGPIOOutput(LCD_RD_BASE, LCD_RD_PIN); + GPIOPinTypeGPIOOutput(LCD_BL_BASE, LCD_BL_PIN); + GPIOPinTypeGPIOOutput(LCD_DATA_BASE, 0xff); + + // + // Set the LCD control pins to their default values. + // + GPIOPinWrite(LCD_A0_BASE, LCD_A0_PIN, LCD_A0_PIN); + GPIOPinWrite(LCD_WR_BASE, LCD_WR_PIN | LCD_RD_PIN, + LCD_WR_PIN | LCD_RD_PIN); + GPIOPinWrite(LCD_BL_BASE, LCD_BL_PIN, 0); + GPIOPinWrite(LCD_DATA_BASE, 0xff, 0x00); + + // + // Perform a software reset of the ST7637. + // + WriteCommand(0x01); + + // + // Delay for 120ms. + // + SysCtlDelay(ulClockMS * 120); + + // + // Disable auto-load of mask rom data. + // + WriteCommand(0xD7); + WriteData(0xBF); + + // + // Set the OTP control mode to read. + // + WriteCommand(0xE0); + WriteData(0x00); + + // + // Delay for 10ms. + // + SysCtlDelay(ulClockMS * 10); + + // + // Start the OTP read. + // + WriteCommand(0xE3); + + // + // Delay for 20ms. + // + SysCtlDelay(ulClockMS * 20); + + // + // Cancel the OTP read (it should have finished by now). + // + WriteCommand(0xE1); + + // + // Turn off the display. + // + WriteCommand(0x28); + + // + // Exit sleep mode. + // + WriteCommand(0x11); + + // + // Delay for 50ms. + // + SysCtlDelay(ulClockMS * 50); + + // + // Program the LCD supply voltage V0 to 14V. + // + WriteCommand(0xC0); + WriteData(0x04); + WriteData(0x01); + + // + // Select an LCD bias voltage ratio of 1/12. + // + WriteCommand(0xC3); + WriteData(0x00); + + // + // Enable the x8 booster circuit. + // + WriteCommand(0xC4); + WriteData(0x07); + + // + // Invert the column scan direction for the panel. + // + WriteCommand(0xB7); + WriteData(0xC0); + + // + // Select 16bpp, 5-6-5 data input mode. + // + WriteCommand(0x3A); + WriteData(0x05); + + // + // Select the memory scanning direction. The scanning mode does not matter + // for this driver since the row/column selects will constrain the writes + // to the desired area of the display. + // + WriteCommand(0x36); + WriteData(0x00); + + // + // Turn on the display. + // + WriteCommand(0x29); + + // + // Clear the contents of the display buffer. + // + WriteCommand(0x2A); + WriteData(0x00); + WriteData(0x7F); + WriteCommand(0x2B); + WriteData(0x01); + WriteData(0x80); + WriteCommand(0x2c); + for(ulCount = 0; ulCount < (128 * 128); ulCount++) + { + WriteData(0x00); + WriteData(0x00); + } + + // + // Enable normal operation of the LCD. + // + WriteCommand(0x13); +} + +//***************************************************************************** +// +//! Turns on the backlight. +//! +//! This function turns on the backlight on the display. +//! +//! \return None. +// +//***************************************************************************** +void +Formike128x128x16BacklightOn(void) +{ + // + // Assert the signal that turns on the backlight. + // + HWREG(LCD_BL_BASE + GPIO_O_DATA + (LCD_BL_PIN << 2)) = LCD_BL_PIN; +} + +//***************************************************************************** +// +//! Turns off the backlight. +//! +//! This function turns off the backlight on the display. +//! +//! \return None. +// +//***************************************************************************** +void +Formike128x128x16BacklightOff(void) +{ + // + // Deassert the signal that turns on the backlight. + // + HWREG(LCD_BL_BASE + GPIO_O_DATA + (LCD_BL_PIN << 2)) = 0; +} + +//***************************************************************************** +// +//! Draws a pixel on the screen. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param lX is the X coordinate of the pixel. +//! \param lY is the Y coordinate of the pixel. +//! \param ulValue is the color of the pixel. +//! +//! This function sets the given pixel to a particular color. The coordinates +//! of the pixel are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16PixelDraw(void *pvDisplayData, long lX, long lY, + unsigned long ulValue) +{ + // + // Set the X address of the display cursor. + // + WriteCommand(0x2a); + WriteData(lX); + WriteData(lX); + + // + // Set the Y address of the display cursor. + // + WriteCommand(0x2b); + WriteData(lY + 1); + WriteData(lY + 1); + + // + // Write the pixel value. + // + WriteCommand(0x2c); + WriteData(ulValue >> 8); + WriteData(ulValue); +} + +//***************************************************************************** +// +//! Draws a horizontal sequence of pixels on the screen. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param lX is the X coordinate of the first pixel. +//! \param lY is the Y coordinate of the first pixel. +//! \param lX0 is sub-pixel offset within the pixel data, which is valid for 1 +//! or 4 bit per pixel formats. +//! \param lCount is the number of pixels to draw. +//! \param lBPP is the number of bits per pixel; must be 1, 4, or 8. +//! \param pucData is a pointer to the pixel data. For 1 and 4 bit per pixel +//! formats, the most significant bit(s) represent the left-most pixel. +//! \param pucPalette is a pointer to the palette used to draw the pixels. +//! +//! This function draws a horizontal sequence of pixels on the screen, using +//! the supplied palette. For 1 bit per pixel format, the palette contains +//! pre-translated colors; for 4 and 8 bit per pixel formats, the palette +//! contains 24-bit RGB values that must be translated before being written to +//! the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16PixelDrawMultiple(void *pvDisplayData, long lX, long lY, + long lX0, long lCount, long lBPP, + const unsigned char *pucData, + const unsigned char *pucPalette) +{ + unsigned long ulByte; + + // + // Set the extent of the line along the X axis. + // + WriteCommand(0x2a); + WriteData(lX); + WriteData(lX + lCount - 1); + + // + // Set the Y address of the display cursor. + // + WriteCommand(0x2b); + WriteData(lY + 1); + WriteData(lY + 1); + + // + // Write the data RAM write command. + // + WriteCommand(0x2c); + + // + // Determine how to interpret the pixel data based on the number of bits + // per pixel. + // + switch(lBPP) + { + // + // The pixel data is in 1 bit per pixel format. + // + case 1: + { + // + // Loop while there are more pixels to draw. + // + while(lCount) + { + // + // Get the next byte of image data. + // + ulByte = *pucData++; + + // + // Loop through the pixels in this byte of image data. + // + for(; (lX0 < 8) && lCount; lX0++, lCount--) + { + // + // Draw this pixel in the appropriate color. + // + lBPP = ((unsigned long *)pucPalette)[(ulByte >> + (7 - lX0)) & 1]; + WriteData(lBPP >> 8); + WriteData(lBPP); + } + + // + // Start at the beginning of the next byte of image data. + // + lX0 = 0; + } + + // + // The image data has been drawn. + // + break; + } + + // + // The pixel data is in 4 bit per pixel format. + // + case 4: + { + // + // Loop while there are more pixels to draw. "Duff's device" is + // used to jump into the middle of the loop if the first nibble of + // the pixel data should not be used. Duff's device makes use of + // the fact that a case statement is legal anywhere within a + // sub-block of a switch statement. See + // http://en.wikipedia.org/wiki/Duff's_device for detailed + // information about Duff's device. + // + switch(lX0 & 1) + { + case 0: + while(lCount) + { + // + // Get the upper nibble of the next byte of pixel data + // and extract the corresponding entry from the + // palette. + // + ulByte = (*pucData >> 4) * 3; + ulByte = (*(unsigned long *)(pucPalette + ulByte) & + 0x00ffffff); + + // + // Translate this palette entry and write it to the + // screen. + // + ulByte = DPYCOLORTRANSLATE(ulByte); + WriteData(ulByte >> 8); + WriteData(ulByte); + + // + // Decrement the count of pixels to draw. + // + lCount--; + + // + // See if there is another pixel to draw. + // + if(lCount) + { + case 1: + // + // Get the lower nibble of the next byte of pixel + // data and extract the corresponding entry from + // the palette. + // + ulByte = (*pucData++ & 15) * 3; + ulByte = (*(unsigned long *)(pucPalette + ulByte) & + 0x00ffffff); + + // + // Translate this palette entry and write it to the + // screen. + // + ulByte = DPYCOLORTRANSLATE(ulByte); + WriteData(ulByte >> 8); + WriteData(ulByte); + + // + // Decrement the count of pixels to draw. + // + lCount--; + } + } + } + + // + // The image data has been drawn. + // + break; + } + + // + // The pixel data is in 8 bit per pixel format. + // + case 8: + { + // + // Loop while there are more pixels to draw. + // + while(lCount--) + { + // + // Get the next byte of pixel data and extract the + // corresponding entry from the palette. + // + ulByte = *pucData++ * 3; + ulByte = *(unsigned long *)(pucPalette + ulByte) & 0x00ffffff; + + // + // Translate this palette entry and write it to the screen. + // + ulByte = DPYCOLORTRANSLATE(ulByte); + WriteData(ulByte >> 8); + WriteData(ulByte); + } + + // + // The image data has been drawn. + // + break; + } + } +} + +//***************************************************************************** +// +//! Flushes any cached drawing operations. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! +//! This functions flushes any cached drawing operations to the display. This +//! is useful when a local frame buffer is used for drawing operations, and the +//! flush would copy the local frame buffer to the display. For the ST7637 +//! driver, the flush is a no operation. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16Flush(void *pvDisplayData) +{ + // + // There is nothing to be done. + // +} + +//***************************************************************************** +// +//! Draws a horizontal line. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param lX1 is the X coordinate of the start of the line. +//! \param lX2 is the X coordinate of the end of the line. +//! \param lY is the Y coordinate of the line. +//! \param ulValue is the color of the line. +//! +//! This function draws a horizontal line on the display. The coordinates of +//! the line are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16LineDrawH(void *pvDisplayData, long lX1, long lX2, long lY, + unsigned long ulValue) +{ + // + // Set the extent of the line along the X axis. + // + WriteCommand(0x2a); + WriteData(lX1); + WriteData(lX2); + + // + // Set the Y address of the display cursor. + // + WriteCommand(0x2b); + WriteData(lY + 1); + WriteData(lY + 1); + + // + // Write the data RAM write command. + // + WriteCommand(0x2c); + + // + // Loop through the pixels of this horizontal line. + // + while(lX1++ <= lX2) + { + // + // Write the pixel value. + // + WriteData(ulValue >> 8); + WriteData(ulValue); + } +} + +//***************************************************************************** +// +//! Draws a vertical line. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param lX is the X coordinate of the line. +//! \param lY1 is the Y coordinate of the start of the line. +//! \param lY2 is the Y coordinate of the end of the line. +//! \param ulValue is the color of the line. +//! +//! This function draws a vertical line on the display. The coordinates of the +//! line are assumed to be within the extents of the display. +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16LineDrawV(void *pvDisplayData, long lX, long lY1, long lY2, + unsigned long ulValue) +{ + // + // Set the X address of the display cursor. + // + WriteCommand(0x2a); + WriteData(lX); + WriteData(lX); + + // + // Set the extent of the line along the Y axis. + // + WriteCommand(0x2b); + WriteData(lY1 + 1); + WriteData(lY2 + 1); + + // + // Write the data RAM write command. + // + WriteCommand(0x2c); + + // + // Loop through the pixels of this vertical line. + // + while(lY1++ <= lY2) + { + // + // Write the pixel value. + // + WriteData(ulValue >> 8); + WriteData(ulValue); + } +} + +//***************************************************************************** +// +//! Fills a rectangle. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param pRect is a pointer to the structure describing the rectangle. +//! \param ulValue is the color of the rectangle. +//! +//! This function fills a rectangle on the display. The coordinates of the +//! rectangle are assumed to be within the extents of the display, and the +//! rectangle specification is fully inclusive (i.e. both sXMin and sXMax are +//! drawn, along with sYMin and sYMax). +//! +//! \return None. +// +//***************************************************************************** +static void +Formike128x128x16RectFill(void *pvDisplayData, const tRectangle *pRect, + unsigned long ulValue) +{ + long lCount; + + // + // Set the extent of the rectangle along the X axis. + // + WriteCommand(0x2a); + WriteData(pRect->sXMin); + WriteData(pRect->sXMax); + + // + // Set the extent of the rectangle along the Y axis. + // + WriteCommand(0x2b); + WriteData(pRect->sYMin + 1); + WriteData(pRect->sYMax + 1); + + // + // Write the data RAM write command. + // + WriteCommand(0x2c); + + // + // Loop through the pixels in this rectangle. + // + for(lCount = ((pRect->sXMax - pRect->sXMin + 1) * + (pRect->sYMax - pRect->sYMin + 1)); lCount > 0; lCount--) + { + // + // Write the pixel value. + // + WriteData(ulValue >> 8); + WriteData(ulValue); + } +} + +//***************************************************************************** +// +//! Translates a 24-bit RGB color to a display driver-specific color. +//! +//! \param pvDisplayData is a pointer to the driver-specific data for this +//! display driver. +//! \param ulValue is the 24-bit RGB color. The least-significant byte is the +//! blue channel, the next byte is the green channel, and the third byte is the +//! red channel. +//! +//! This function translates a 24-bit RGB color into a value that can be +//! written into the display's frame buffer in order to reproduce that color, +//! or the closest possible approximation of that color. +//! +//! \return Returns the display-driver specific color. +// +//***************************************************************************** +static unsigned long +Formike128x128x16ColorTranslate(void *pvDisplayData, unsigned long ulValue) +{ + // + // Translate from a 24-bit RGB color to a 5-6-5 RGB color. + // + return(DPYCOLORTRANSLATE(ulValue)); +} + +//***************************************************************************** +// +//! The display structure that describes the driver for the Formike Electronic +//! KWH015C04-F01 CSTN panel with an ST7637 controller. +// +//***************************************************************************** +const tDisplay g_sFormike128x128x16 = +{ + sizeof(tDisplay), + 0, + 128, + 128, + Formike128x128x16PixelDraw, + Formike128x128x16PixelDrawMultiple, + Formike128x128x16LineDrawH, + Formike128x128x16LineDrawV, + Formike128x128x16RectFill, + Formike128x128x16ColorTranslate, + Formike128x128x16Flush +}; + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** + + + + + + + + + + + + + + + + +/* FreeRTOS.org demo wrappers. These are required so the prototypes for the +functions are the same as for the display drivers used by other evaluation +kits. */ + +static tContext sContext; + +void vFormike128x128x16Clear( void ) +{ +const tRectangle xRectangle = { 0, 0, 127, 127 }; + + GrContextForegroundSet( &sContext, ClrBlack ); + GrRectFill( &sContext, &xRectangle ); + GrContextForegroundSet(&sContext, ClrWhite); +} +/*-----------------------------------------------------------*/ + +void vFormike128x128x16StringDraw( const char *pcString, unsigned long lX, unsigned long lY, unsigned char ucColor ) +{ + GrContextForegroundSet(&sContext, ClrWhite); + GrStringDraw( &sContext, pcString, strlen( pcString ), lX, lY, false ); +} +/*-----------------------------------------------------------*/ + +void vFormike128x128x16Init( unsigned long ul ) +{ +tRectangle rectScreen; +const unsigned char *pcAppName = "www.FreeRTOS.org"; + + ( void ) ul; + + Formike128x128x16Init(); + Formike128x128x16BacklightOn(); + GrContextInit(&sContext, &g_sFormike128x128x16); + GrContextFontSet(&sContext, &g_sFontCmss12); + rectScreen.sXMin = 0; + + /* Fill the screen with a black rectangle. */ + rectScreen.sYMin = 0; + rectScreen.sXMax = g_sFormike128x128x16.usWidth - 1; + rectScreen.sYMax = g_sFormike128x128x16.usHeight - 1; + GrContextForegroundSet(&sContext, ClrBlack); + GrRectFill(&sContext, &rectScreen); +} +/*-----------------------------------------------------------*/ + +void vFormike128x128x16ImageDraw( const unsigned char *pucImage, unsigned long ulX, unsigned long ulY, unsigned long ulWidth, unsigned long ulHeight ) +{ + GrImageDraw( &sContext, pucImage, ( long ) ulX, ( long ) ulY); +} + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/formike128x128x16.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/formike128x128x16.h new file mode 100644 index 0000000..feaec75 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/formike128x128x16.h @@ -0,0 +1,51 @@ +//***************************************************************************** +// +// formike128x128x16.h - Prototypes for the Formike Electronic KWH015C04-F01 +// display driver. +// +// Copyright (c) 2008 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. You may not combine +// this software with "viral" open-source software in order to form a larger +// program. Any use in violation of the foregoing restrictions may subject +// the user to criminal sanctions under applicable laws, as well as to civil +// liability for the breach of the terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 2523 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __FORMIKE128X128X16_H__ +#define __FORMIKE128X128X16_H__ + +//***************************************************************************** +// +// Prototypes for the globals exported by this driver. +// +//***************************************************************************** +extern void Formike128x128x16Init(void); +extern void Formike128x128x16BacklightOn(void); +extern void Formike128x128x16BacklightOff(void); +extern const tDisplay g_sFormike128x128x16; + +/* FreeRTOS.org demo wrappers. These are required so the prototypes for the +functions are the same as for the display drivers used by other evaluation +kits. */ +void vFormike128x128x16Clear( void ); +void vFormike128x128x16StringDraw( const char *pcString, unsigned long lX, unsigned long lY, unsigned char ucColor ); +void vFormike128x128x16Init( unsigned long ul ); +void vFormike128x128x16ImageDraw( const unsigned char *pucImage, unsigned long ulX, unsigned long ulY, unsigned long ulWidth, unsigned long ulHeight ); + +#endif // __FORMIKE128X128X16_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/lcd_message.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/lcd_message.h new file mode 100644 index 0000000..ced7a1d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/lcd_message.h @@ -0,0 +1,9 @@ +#ifndef LCD_MESSAGE_H +#define LCD_MESSAGE_H + +typedef struct +{ + char *pcMessage; +} xOLEDMessage; + +#endif /* LCD_MESSAGE_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/main.c new file mode 100644 index 0000000..09c9414 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/main.c @@ -0,0 +1,483 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * Creates all the demo application tasks, then starts the scheduler. The WEB + * documentation provides more details of the standard demo application tasks. + * In addition to the standard demo tasks, the following tasks and tests are + * defined and/or created within this file: + * + * "Fast Interrupt Test" - A high frequency periodic interrupt is generated + * using a free running timer to demonstrate the use of the + * configKERNEL_INTERRUPT_PRIORITY configuration constant. The interrupt + * service routine measures the number of processor clocks that occur between + * each interrupt - and in so doing measures the jitter in the interrupt timing. + * The maximum measured jitter time is latched in the ulMaxJitter variable, and + * displayed on the OLED display by the 'OLED' task as described below. The + * fast interrupt is configured and handled in the timertest.c source file. + * + * "OLED" task - the OLED task is a 'gatekeeper' task. It is the only task that + * is permitted to access the display directly. Other tasks wishing to write a + * message to the OLED send the message on a queue to the OLED task instead of + * accessing the OLED themselves. The OLED task just blocks on the queue waiting + * for messages - waking and displaying the messages as they arrive. + * + * "Check" hook - This only executes every five seconds from the tick hook. + * Its main function is to check that all the standard demo tasks are still + * operational. Should any unexpected behaviour within a demo task be discovered + * the tick hook will write an error to the OLED (via the OLED task). If all the + * demo tasks are executing with their expected behaviour then the check task + * writes PASS to the OLED (again via the OLED task), as described above. + * + * "uIP" task - This is the task that handles the uIP stack. All TCP/IP + * processing is performed in this task. + */ + + + + +/************************************************************************* + * Please ensure to read http://www.freertos.org/portLM3Sxxxx_Eclipse.html + * which provides information on configuring and running this demo for the + * various Luminary Micro EKs. + *************************************************************************/ + + + + +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +/* Hardware library includes. */ +#include "hw_memmap.h" +#include "hw_types.h" +#include "hw_sysctl.h" +#include "sysctl.h" +#include "gpio.h" +#include "grlib.h" +#include "rit128x96x4.h" +#include "osram128x64x4.h" +#include "formike128x128x16.h" + +/* Demo app includes. */ +#include "BlockQ.h" +#include "death.h" +#include "integer.h" +#include "blocktim.h" +#include "flash.h" +#include "partest.h" +#include "semtest.h" +#include "PollQ.h" +#include "lcd_message.h" +#include "bitmap.h" +#include "GenQTest.h" +#include "QPeek.h" +#include "recmutex.h" +#include "IntQueue.h" +#include "QueueSet.h" + +/*-----------------------------------------------------------*/ + +/* The time between cycles of the 'check' functionality (defined within the +tick hook. */ +#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS ) + +/* Size of the stack allocated to the uIP task. */ +#define mainBASIC_WEB_STACK_SIZE ( configMINIMAL_STACK_SIZE * 3 ) + +/* The OLED task uses the sprintf function so requires a little more stack too. */ +#define mainOLED_TASK_STACK_SIZE ( configMINIMAL_STACK_SIZE + 50 ) + +/* Task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainGEN_QUEUE_TASK_PRIORITY ( tskIDLE_PRIORITY ) + +/* The maximum number of message that can be waiting for display at any one +time. */ +#define mainOLED_QUEUE_SIZE ( 3 ) + +/* Dimensions the buffer into which the jitter time is written. */ +#define mainMAX_MSG_LEN 25 + +/* The period of the system clock in nano seconds. This is used to calculate +the jitter time in nano seconds. */ +#define mainNS_PER_CLOCK ( ( unsigned long ) ( ( 1.0 / ( double ) configCPU_CLOCK_HZ ) * 1000000000.0 ) ) + +/* Constants used when writing strings to the display. */ +#define mainCHARACTER_HEIGHT ( 9 ) +#define mainMAX_ROWS_128 ( mainCHARACTER_HEIGHT * 14 ) +#define mainMAX_ROWS_96 ( mainCHARACTER_HEIGHT * 10 ) +#define mainMAX_ROWS_64 ( mainCHARACTER_HEIGHT * 7 ) +#define mainFULL_SCALE ( 15 ) +#define ulSSI_FREQUENCY ( 3500000UL ) + +/*-----------------------------------------------------------*/ + +/* + * The task that handles the uIP stack. All TCP/IP processing is performed in + * this task. + */ +extern void vuIP_Task( void *pvParameters ); + +/* + * The display is written two by more than one task so is controlled by a + * 'gatekeeper' task. This is the only task that is actually permitted to + * access the display directly. Other tasks wanting to display a message send + * the message to the gatekeeper. + */ +static void vOLEDTask( void *pvParameters ); + +/* + * Configure the hardware for the demo. + */ +static void prvSetupHardware( void ); + +/* + * Configures the high frequency timers - those used to measure the timing + * jitter while the real time kernel is executing. + */ +extern void vSetupHighFrequencyTimer( void ); + +/* + * The idle hook is used to run a test of the scheduler context switch + * mechanism. + */ +void vApplicationIdleHook( void ) __attribute__((naked)); +/*-----------------------------------------------------------*/ + +/* The queue used to send messages to the OLED task. */ +xQueueHandle xOLEDQueue; + +/* The welcome text. */ +const char * const pcWelcomeMessage = " www.FreeRTOS.org"; + +/* Variables used to detect the test in the idle hook failing. */ +unsigned long ulIdleError = pdFALSE; + +/*-----------------------------------------------------------*/ + +/************************************************************************* + * Please ensure to read http://www.freertos.org/portLM3Sxxxx_Eclipse.html + * which provides information on configuring and running this demo for the + * various Luminary Micro EKs. + *************************************************************************/ +int main( void ) +{ + prvSetupHardware(); + + /* Create the queue used by the OLED task. Messages for display on the OLED + are received via this queue. */ + xOLEDQueue = xQueueCreate( mainOLED_QUEUE_SIZE, sizeof( xOLEDMessage ) ); + + /* Create the uIP task if running on a processor that includes a MAC and + PHY. */ + if( SysCtlPeripheralPresent( SYSCTL_PERIPH_ETH ) ) + { + xTaskCreate( vuIP_Task, ( signed char * ) "uIP", mainBASIC_WEB_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY - 1, NULL ); + } + + /* Start the standard demo tasks. */ + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + vCreateBlockTimeTasks(); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); + vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY ); + vStartQueuePeekTasks(); + vStartRecursiveMutexTasks(); + vStartInterruptQueueTasks(); + vStartQueueSetTasks(); + + /* Start the tasks defined within this file/specific to this demo. */ + xTaskCreate( vOLEDTask, ( signed char * ) "OLED", mainOLED_TASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation in order to ascertain whether + or not the correct/expected number of tasks are running at any given time. */ + vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Configure the high frequency interrupt used to measure the interrupt + jitter time. */ + vSetupHighFrequencyTimer(); + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. */ + for( ;; ); + return 0; +} +/*-----------------------------------------------------------*/ + +void prvSetupHardware( void ) +{ + /* If running on Rev A2 silicon, turn the LDO voltage up to 2.75V. This is + a workaround to allow the PLL to operate reliably. */ + if( DEVICE_IS_REVA2 ) + { + SysCtlLDOSet( SYSCTL_LDO_2_75V ); + } + + /* Set the clocking to run from the PLL at 50 MHz */ + SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ ); + + /* Enable Port F for Ethernet LEDs + LED0 Bit 3 Output + LED1 Bit 2 Output */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_GPIOF ); + GPIODirModeSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3), GPIO_DIR_MODE_HW ); + GPIOPadConfigSet( GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3 ), GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD ); + + vParTestInitialise(); +} +/*-----------------------------------------------------------*/ + +void vApplicationTickHook( void ) +{ +static xOLEDMessage xMessage = { "PASS" }; +static unsigned long ulTicksSinceLastDisplay = 0; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + /* Called from every tick interrupt. Have enough ticks passed to make it + time to perform our health status check again? */ + ulTicksSinceLastDisplay++; + if( ulTicksSinceLastDisplay >= mainCHECK_DELAY ) + { + ulTicksSinceLastDisplay = 0; + + /* Has an error been found in any task? */ + if( xAreGenericQueueTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN GEN Q"; + } + else if( xAreQueuePeekTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN PEEK Q"; + } + else if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK Q"; + } + else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN BLOCK TIME"; + } + else if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN SEMAPHORE"; + } + else if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN POLL Q"; + } + else if( xIsCreateTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN CREATE"; + } + else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN MATH"; + } + else if( xAreRecursiveMutexTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN REC MUTEX"; + } + else if( ulIdleError != pdFALSE ) + { + xMessage.pcMessage = "ERROR IN HOOK"; + } + else if( xAreIntQueueTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN INT QUEUE"; + } + else if( xAreQueueSetTasksStillRunning() != pdTRUE ) + { + xMessage.pcMessage = "ERROR IN QUEUE SET"; + } + + /* Send the message to the OLED gatekeeper for display. */ + xHigherPriorityTaskWoken = pdFALSE; + xQueueSendFromISR( xOLEDQueue, &xMessage, &xHigherPriorityTaskWoken ); + } + + /* Exercise the queue sets from an ISR. */ + vQueueSetAccessQueueSetFromISR(); +} +/*-----------------------------------------------------------*/ + +void vOLEDTask( void *pvParameters ) +{ +xOLEDMessage xMessage; +unsigned long ulY, ulMaxY; +static char cMessage[ mainMAX_MSG_LEN ]; +extern volatile unsigned long ulMaxJitter; +unsigned portBASE_TYPE uxUnusedStackOnEntry; +const unsigned char *pucImage; + +/* Functions to access the OLED. The one used depends on the dev kit +being used. */ +void ( *vOLEDInit )( unsigned long ) = NULL; +void ( *vOLEDStringDraw )( const char *, unsigned long, unsigned long, unsigned char ) = NULL; +void ( *vOLEDImageDraw )( const unsigned char *, unsigned long, unsigned long, unsigned long, unsigned long ) = NULL; +void ( *vOLEDClear )( void ) = NULL; + + /* Just for demo purposes. */ + uxUnusedStackOnEntry = uxTaskGetStackHighWaterMark( NULL ); + + /* Map the OLED access functions to the driver functions that are appropriate + for the evaluation kit being used. */ + switch( HWREG( SYSCTL_DID1 ) & SYSCTL_DID1_PRTNO_MASK ) + { + case SYSCTL_DID1_PRTNO_6965 : + case SYSCTL_DID1_PRTNO_2965 : vOLEDInit = OSRAM128x64x4Init; + vOLEDStringDraw = OSRAM128x64x4StringDraw; + vOLEDImageDraw = OSRAM128x64x4ImageDraw; + vOLEDClear = OSRAM128x64x4Clear; + ulMaxY = mainMAX_ROWS_64; + pucImage = pucBasicBitmap; + break; + + case SYSCTL_DID1_PRTNO_1968 : + case SYSCTL_DID1_PRTNO_8962 : vOLEDInit = RIT128x96x4Init; + vOLEDStringDraw = RIT128x96x4StringDraw; + vOLEDImageDraw = RIT128x96x4ImageDraw; + vOLEDClear = RIT128x96x4Clear; + ulMaxY = mainMAX_ROWS_96; + pucImage = pucBasicBitmap; + break; + + default : vOLEDInit = vFormike128x128x16Init; + vOLEDStringDraw = vFormike128x128x16StringDraw; + vOLEDImageDraw = vFormike128x128x16ImageDraw; + vOLEDClear = vFormike128x128x16Clear; + ulMaxY = mainMAX_ROWS_128; + pucImage = pucGrLibBitmap; + break; + } + + ulY = ulMaxY; + + /* Initialise the OLED and display a startup message. */ + vOLEDInit( ulSSI_FREQUENCY ); + vOLEDStringDraw( "POWERED BY FreeRTOS", 0, 0, mainFULL_SCALE ); + vOLEDImageDraw( pucImage, 0, mainCHARACTER_HEIGHT + 1, bmpBITMAP_WIDTH, bmpBITMAP_HEIGHT ); + + for( ;; ) + { + /* Wait for a message to arrive that requires displaying. */ + xQueueReceive( xOLEDQueue, &xMessage, portMAX_DELAY ); + + /* Write the message on the next available row. */ + ulY += mainCHARACTER_HEIGHT; + if( ulY >= ulMaxY ) + { + ulY = mainCHARACTER_HEIGHT; + vOLEDClear(); + vOLEDStringDraw( pcWelcomeMessage, 0, 0, mainFULL_SCALE ); + } + + /* Display the message along with the maximum jitter time from the + high priority time test. */ + sprintf( cMessage, "%s [%uns]", xMessage.pcMessage, ulMaxJitter * mainNS_PER_CLOCK ); + vOLEDStringDraw( cMessage, 0, ulY, mainFULL_SCALE ); + } +} +/*-----------------------------------------------------------*/ + +void vApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName ) +{ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +void vApplicationMallocFailedHook( void ) +{ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* Just to keep the linker happy. */ +void __error__( char *pcFilename, unsigned long ulLine ) +{ + for( ;; ); +} + +int uipprintf( const char *fmt, ... ) +{ + return( 0 ); +} diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/osram128x64x4.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/osram128x64x4.c new file mode 100644 index 0000000..3353a82 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/osram128x64x4.c @@ -0,0 +1,933 @@ +//***************************************************************************** +// +// osram128x64x4.c - Driver for the OSRAM 128x64x4 graphical OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3sx965_api +//! @{ +// +//***************************************************************************** + +#include "hw_ssi.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "osram128x64x4.h" + +//***************************************************************************** +// +// Flag to indicate if SSI port is enabled for OSRAM usage. +// +//***************************************************************************** +static volatile tBoolean g_bSSIEnabled = false; + +//***************************************************************************** +// +// Define the OSRAM 128x64x4 Remap Setting(s). This will be used in +// several places in the code to switch between vertical and horizontal +// address incrementing. +// +// The Remap Command (0xA0) takes one 8-bit parameter. The parameter is +// defined as follows. +// +// Bit 7: Reserved +// Bit 6: Disable(0)/Enable(1) COM Split Odd Even +// When enabled, the COM signals are split Odd on one side, even on +// the other. Otherwise, they are split 0-39 on one side, 40-79 on +// the other. +// Bit 5: Reserved +// Bit 4: Disable(0)/Enable(1) COM Remap +// When Enabled, ROW 0-79 map to COM 79-0 (i.e. reverse row order) +// Bit 3: Reserved +// Bit 2: Horizontal(0)/Vertical(1) Address Increment +// When set, data RAM address will increment along the column rather +// than along the row. +// Bit 1: Disable(0)/Enable(1) Nibble Remap +// When enabled, the upper and lower nibbles in the DATA bus for access +// to the data RAM are swapped. +// Bit 0: Disable(0)/Enable(1) Column Address Remap +// When enabled, DATA RAM columns 0-63 are remapped to Segment Columns +// 127-0. +// +//***************************************************************************** +#define OSRAM_INIT_REMAP 0x52 +#define OSRAM_INIT_OFFSET 0x4C +static const unsigned char g_pucOSRAM128x64x4VerticalInc[] = { 0xA0, 0x56 }; +static const unsigned char g_pucOSRAM128x64x4HorizontalInc[] = { 0xA0, 0x52 }; + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +// Note: This is the same font data that is used in the EK-LM3S811 +// osram96x16x1 driver. The single bit-per-pixel is expaned in the StringDraw +// function to the appropriate four bit-per-pixel gray scale format. +// +//***************************************************************************** +static const unsigned char g_pucFont[96][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD0303 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the command sequence, followed by that many bytes of command data. +// Note: This initialization sequence is derived from OSRAM App Note AN018. +// +//***************************************************************************** +static const unsigned char g_pucOSRAM128x64x4Init[] = +{ + // + // Column Address + // + 4, 0x15, 0, 63, 0xe3, + + // + // Row Address + // + 4, 0x75, 0, 63, 0xe3, + + // + // Contrast Control + // + 3, 0x81, 50, 0xe3, + + // + // Half Current Range + // + 2, 0x85, 0xe3, + + // + // Display Re-map + // + 3, 0xA0, OSRAM_INIT_REMAP, 0xe3, + + // + // Display Start Line + // + 3, 0xA1, 0, 0xe3, + + // + // Display Offset + // + 3, 0xA2, OSRAM_INIT_OFFSET, 0xe3, + + // + // Display Mode Normal + // + 2, 0xA4, 0xe3, + + // + // Multiplex Ratio + // + 3, 0xA8, 63, 0xe3, + + // + // Phase Length + // + 3, 0xB1, 0x22, 0xe3, + + // + // Row Period + // + 3, 0xB2, 70, 0xe3, + + // + // Display Clock Divide + // + 3, 0xB3, 0xF1, 0xe3, + + // + // VSL + // + 3, 0xBF, 0x0D, 0xe3, + + // + // VCOMH + // + 3, 0xBE, 0x02, 0xe3, + + // + // VP + // + 3, 0xBC, 0x10, 0xe3, + + // + // Gamma + // + 10, 0xB8, 0x01, 0x11, 0x22, 0x32, 0x43, 0x54, 0x65, 0x76, 0xe3, + + // + // Set DC-DC + 3, 0xAD, 0x03, 0xe3, + + // + // Display ON/OFF + // + 2, 0xAF, 0xe3, +}; + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of command bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteCommand(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Clear the command/control bit to enable command mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, 0); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of data bytes to the SSD0323 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +OSRAMWriteData(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return iff SSI port is not enabled for OSRAM. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Set the command/control bit to enable data mode. + // + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display RAM. All pixels in the display will +//! be turned off. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Clear(void) +{ + static const unsigned char pucCommand1[] = { 0x15, 0, 63 }; + static const unsigned char pucCommand2[] = { 0x75, 0, 79 }; + unsigned long ulRow, ulColumn; + static unsigned char pucZeroBuffer[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; + + // + // Set the window to fill the entire display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); + OSRAMWriteCommand(pucCommand2, sizeof(pucCommand2)); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // In vertical address increment mode, loop through each column, filling + // each row with 0. + // + for(ulColumn = 0; ulColumn < (128/2); ulColumn++) + { + // + // 8 rows (bytes) per row of text. + // + for(ulRow = 0; ulRow < 80; ulRow += 8) + { + OSRAMWriteData(pucZeroBuffer, sizeof(pucZeroBuffer)); + } + } +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! rows from the top edge of the display. +//! \param ucLevel is the 4-bit grey scale value to be used for displayed text. +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \note Because the OLED display packs 2 pixels of data in a single byte, the +//! parameter \e ulX must be an even column number (e.g. 0, 2, 4, etc). +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4StringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY, unsigned char ucLevel) +{ + static unsigned char pucBuffer[8]; + unsigned long ulIdx1, ulIdx2; + unsigned char ucTemp; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT(ucLevel < 16); + + // + // Setup a window starting at the specified column and row, ending + // at the right edge of the display and 8 rows down (single character row). + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = 63; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + 7; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4VerticalInc, + sizeof(g_pucOSRAM128x64x4VerticalInc)); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // Get a working copy of the current character and convert to an + // index into the character bit-map array. + // + ucTemp = *pcStr; + ucTemp &= 0x7F; + if(ucTemp < ' ') + { + ucTemp = ' '; + } + else + { + ucTemp -= ' '; + } + + // + // Build and display the character buffer. + // + for(ulIdx1 = 0; ulIdx1 < 3; ulIdx1++) + { + // + // Convert two columns of 1-bit font data into a single data + // byte column of 4-bit font data. + // + for(ulIdx2 = 0; ulIdx2 < 8; ulIdx2++) + { + pucBuffer[ulIdx2] = 0; + if(g_pucFont[ucTemp][ulIdx1*2] & (1 << ulIdx2)) + { + pucBuffer[ulIdx2] = ((ucLevel << 4) & 0xf0); + } + if((ulIdx1 < 2) && + (g_pucFont[ucTemp][ulIdx1*2+1] & (1 << ulIdx2))) + { + pucBuffer[ulIdx2] |= ((ucLevel << 0) & 0x0f); + } + } + + // + // If there is room, dump the single data byte column to the + // display. Otherwise, bail out. + // + if(ulX < 126) + { + OSRAMWriteData(pucBuffer, 8); + ulX += 2; + } + else + { + return; + } + } + + // + // Advance to the next character. + // + pcStr++; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! rows from the top of the display. +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in rows. +//! +//! This function will display a bitmap graphic on the display. Because of the +//! format of the display RAM, the starting column (/e ulX) and the number of +//! columns (/e ulWidth) must be an integer multiple of two. +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for two columns in the current row, with the leftmost +//! column being contained in bits 7:4 and the rightmost column being contained +//! in bits 3:0. +//! +//! For example, an image six columns wide and seven scan lines tall would +//! be arranged as follows (showing how the twenty one bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------------------+-------------------+-------------------+ +//! | Byte 0 | Byte 1 | Byte 2 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 3 | Byte 4 | Byte 5 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 6 | Byte 7 | Byte 8 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 9 | Byte 10 | Byte 11 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 12 | Byte 13 | Byte 14 | +//! +---------+---------+---------+--3------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 15 | Byte 16 | Byte 17 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 18 | Byte 19 | Byte 20 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! \endverbatim +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by` +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4ImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + static unsigned char pucBuffer[8]; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 64); + ASSERT((ulX + ulWidth) <= 128); + ASSERT((ulY + ulHeight) <= 64); + ASSERT((ulWidth & 1) == 0); + + // + // Setup a window starting at the specified column and row, and ending + // at the column + width and row+height. + // + pucBuffer[0] = 0x15; + pucBuffer[1] = ulX / 2; + pucBuffer[2] = (ulX + ulWidth - 2) / 2; + OSRAMWriteCommand(pucBuffer, 3); + pucBuffer[0] = 0x75; + pucBuffer[1] = ulY; + pucBuffer[2] = ulY + ulHeight - 1; + OSRAMWriteCommand(pucBuffer, 3); + OSRAMWriteCommand(g_pucOSRAM128x64x4HorizontalInc, + sizeof(g_pucOSRAM128x64x4HorizontalInc)); + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write this row of image data. + // + OSRAMWriteData(pucImage, (ulWidth / 2)); + + // + // Advance to the next row of the image. + // + pucImage += (ulWidth / 2); + } +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Enable(unsigned long ulFrequency) +{ + unsigned long ulTemp; + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Configure the SSI0 port for master mode. + // + SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_2, SSI_MODE_MASTER, ulFrequency, 8); + + // + // (Re)Enable SSI control of the FSS pin. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Enable the SSI port. + // + SSIEnable(SSI0_BASE); + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Indicate that the OSRAM driver can use the SSI Port. + // + g_bSSIEnabled = true; +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Disable(void) +{ + unsigned long ulTemp; + + // + // Indicate that the OSRAM driver can no longer use the SSI Port. + // + g_bSSIEnabled = false; + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Disable SSI control of the FSS pin. + // + GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); + +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display and +//! configures the SSD0323 controller on the panel. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4Init(unsigned long ulFrequency) +{ + unsigned long ulIdx; + + // + // Enable the SSI0 and GPIO port blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); + + // + // Configure the SSI0CLK and SSIOTX pins for SSI operation. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_5, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the PC7 pin as a D/Cn signal for OLED device. + // + GPIODirModeSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_DIR_MODE_OUT); + GPIOPadConfigSet(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD); + GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, GPIO_PIN_7); + + // + // Configure and enable the SSI0 port for master mode. + // + OSRAM128x64x4Enable(ulFrequency); + + // + // Clear the frame buffer. + // + OSRAM128x64x4Clear(); + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOn(void) +{ + unsigned long ulIdx; + + // + // Initialize the SSD0323 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucOSRAM128x64x4Init); + ulIdx += g_pucOSRAM128x64x4Init[ulIdx] + 1) + { + // + // Send this command. + // + OSRAMWriteCommand(g_pucOSRAM128x64x4Init + ulIdx + 1, + g_pucOSRAM128x64x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in osram128x64x4.c, with +//! osram128x64x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +OSRAM128x64x4DisplayOff(void) +{ + static const unsigned char pucCommand1[] = + { + 0xAE, 0xAD, 0x02 + }; + + // + // Turn off the DC-DC converter and the display. + // + OSRAMWriteCommand(pucCommand1, sizeof(pucCommand1)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/osram128x64x4.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/osram128x64x4.h new file mode 100644 index 0000000..2ba7cb9 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/osram128x64x4.h @@ -0,0 +1,63 @@ +//***************************************************************************** +// +// osram128x64x4.h - Prototypes for the driver for the OSRAM 128x64x4 graphical +// OLED display. +// +// Copyright (c) 2006-2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1408 of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +#ifndef __OSRAM128X64X4_H__ +#define __OSRAM128X64X4_H__ + +//***************************************************************************** +// +// Prototypes for the driver APIs. +// +//***************************************************************************** +extern void OSRAM128x64x4Clear(void); +extern void OSRAM128x64x4StringDraw(const char *pcStr, + unsigned long ulX, + unsigned long ulY, + unsigned char ucLevel); +extern void OSRAM128x64x4ImageDraw(const unsigned char *pucImage, + unsigned long ulX, + unsigned long ulY, + unsigned long ulWidth, + unsigned long ulHeight); +extern void OSRAM128x64x4Init(unsigned long ulFrequency); +extern void OSRAM128x64x4Enable(unsigned long ulFrequency); +extern void OSRAM128x64x4Disable(void); +extern void OSRAM128x64x4DisplayOn(void); +extern void OSRAM128x64x4DisplayOff(void); + +//***************************************************************************** +// +// The following macro(s) map old names for the OSRAM functions to the new +// names. In new code, the new names should be used in favor of the old names. +// +//***************************************************************************** +#ifndef DEPRECATED +#define OSRAM128x64x1InitSSI OSRAM128x64x4Enable +#endif + +#endif // __OSRAM128X64X4_H__ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/pack_struct_end.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/pack_struct_end.h new file mode 100644 index 0000000..621c9fe --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/pack_struct_end.h @@ -0,0 +1,2 @@ +/* Note used by this port of uIP, but required for compilation. */ + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/pack_struct_start.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/pack_struct_start.h new file mode 100644 index 0000000..621c9fe --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/pack_struct_start.h @@ -0,0 +1,2 @@ +/* Note used by this port of uIP, but required for compilation. */ + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/rit128x96x4.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/rit128x96x4.c new file mode 100644 index 0000000..cff38d5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/rit128x96x4.c @@ -0,0 +1,981 @@ +//***************************************************************************** +// +// rit128x96x4.c - Driver for the RIT 128x96x4 graphical OLED display. +// +// Copyright (c) 2007 Luminary Micro, Inc. All rights reserved. +// +// Software License Agreement +// +// Luminary Micro, Inc. (LMI) is supplying this software for use solely and +// exclusively on LMI's microcontroller products. +// +// The software is owned by LMI and/or its suppliers, and is protected under +// applicable copyright laws. All rights are reserved. Any use in violation +// of the foregoing restrictions may subject the user to criminal sanctions +// under applicable laws, as well as to civil liability for the breach of the +// terms and conditions of this license. +// +// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED +// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. +// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR +// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. +// +// This is part of revision 1504-conf of the Stellaris Peripheral Driver Library. +// +//***************************************************************************** + +//***************************************************************************** +// +//! \addtogroup ek_lm3sLM3S8962_api +//! @{ +// +//***************************************************************************** + +#include "hw_ssi.h" +#include "hw_memmap.h" +#include "hw_sysctl.h" +#include "hw_types.h" +#include "debug.h" +#include "gpio.h" +#include "ssi.h" +#include "sysctl.h" +#include "rit128x96x4.h" + +//***************************************************************************** +// +// Macros that define the peripheral, port, and pin used for the OLEDDC +// panel control signal. +// +//***************************************************************************** + +unsigned long ulGPIOId = 0, ulGPIOBase = 0, ulOLEDDC_PIN = 0, ulOLEDEN_PIN = 0; + +#define LM3S8962_SYSCTL_PERIPH_GPIO_OLEDDC SYSCTL_PERIPH_GPIOA +#define LM3S8962_GPIO_OLEDDC_BASE GPIO_PORTA_BASE +#define LM3S8962_GPIO_OLEDDC_PIN GPIO_PIN_6 +#define LM3S8962_GPIO_OLEDEN_PIN GPIO_PIN_7 + +#define LM3S1968_SYSCTL_PERIPH_GPIO_OLEDDC SYSCTL_PERIPH_GPIOH +#define LM3S1968_GPIO_OLEDDC_BASE GPIO_PORTH_BASE +#define LM3S1968_GPIO_OLEDDC_PIN GPIO_PIN_2 +#define LM3S1968_GPIO_OLEDEN_PIN GPIO_PIN_3 + + +//***************************************************************************** +// +// Flag to indicate if SSI port is enabled for display usage. +// +//***************************************************************************** +static volatile tBoolean g_bSSIEnabled = false; + +//***************************************************************************** +// +// Buffer for storing sequences of command and data for the display. +// +//***************************************************************************** +static unsigned char g_pucBuffer[8]; + +//***************************************************************************** +// +// Define the SSD1329 128x96x4 Remap Setting(s). This will be used in +// several places in the code to switch between vertical and horizontal +// address incrementing. Note that the controller support 128 rows while +// the RIT display only uses 96. +// +// The Remap Command (0xA0) takes one 8-bit parameter. The parameter is +// defined as follows. +// +// Bit 7: Reserved +// Bit 6: Disable(0)/Enable(1) COM Split Odd Even +// When enabled, the COM signals are split Odd on one side, even on +// the other. Otherwise, they are split 0-63 on one side, 64-127 on +// the other. +// Bit 5: Reserved +// Bit 4: Disable(0)/Enable(1) COM Remap +// When Enabled, ROW 0-127 map to COM 127-0 (i.e. reverse row order) +// Bit 3: Reserved +// Bit 2: Horizontal(0)/Vertical(1) Address Increment +// When set, data RAM address will increment along the column rather +// than along the row. +// Bit 1: Disable(0)/Enable(1) Nibble Remap +// When enabled, the upper and lower nibbles in the DATA bus for access +// to the data RAM are swapped. +// Bit 0: Disable(0)/Enable(1) Column Address Remap +// When enabled, DATA RAM columns 0-63 are remapped to Segment Columns +// 127-0. +// +//***************************************************************************** +#define RIT_INIT_REMAP 0x52 // app note says 0x51 +#define RIT_INIT_OFFSET 0x00 +static const unsigned char g_pucRIT128x96x4VerticalInc[] = { 0xA0, 0x56 }; +static const unsigned char g_pucRIT128x96x4HorizontalInc[] = { 0xA0, 0x52 }; + +//***************************************************************************** +// +// A 5x7 font (in a 6x8 cell, where the sixth column is omitted from this +// table) for displaying text on the OLED display. The data is organized as +// bytes from the left column to the right column, with each byte containing +// the top row in the LSB and the bottom row in the MSB. +// +// Note: This is the same font data that is used in the EK-LM3S811 +// osram96x16x1 driver. The single bit-per-pixel is expaned in the StringDraw +// function to the appropriate four bit-per-pixel gray scale format. +// +//***************************************************************************** +static const unsigned char g_pucFont[96][5] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " + { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // ! + { 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x23, 0x13, 0x08, 0x64, 0x62 }, // % + { 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // * + { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // + + { 0x00, 0x50, 0x30, 0x00, 0x00 }, // , + { 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0 + { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1 + { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3 + { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4 + { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6 + { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9 + { 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @ + { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A + { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D + { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G + { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H + { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I + { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J + { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M + { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N + { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O + { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q + { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T + { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U + { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V + { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W + { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [ + { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" + { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ] + { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x01, 0x02, 0x04, 0x00 }, // ` + { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d + { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f + { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g + { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i + { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j + { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l + { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p + { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q + { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t + { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u + { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v + { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w + { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y + { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z + { 0x00, 0x08, 0x36, 0x41, 0x00 }, // { + { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // | + { 0x00, 0x41, 0x36, 0x08, 0x00 }, // } + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ + { 0x02, 0x01, 0x02, 0x04, 0x02 }, // ~ +}; + +//***************************************************************************** +// +// The sequence of commands used to initialize the SSD1329 controller. Each +// command is described as follows: there is a byte specifying the number of +// bytes in the command sequence, followed by that many bytes of command data. +// Note: This initialization sequence is derived from RIT App Note for +// the P14201. Values used are from the RIT app note, except where noted. +// +//***************************************************************************** +static const unsigned char g_pucRIT128x96x4Init[] = +{ + // + // Unlock commands + // + 3, 0xFD, 0x12, 0xe3, + + // + // Display off + // + 2, 0xAE, 0xe3, + + // + // Icon off + // + 3, 0x94, 0, 0xe3, + + // + // Multiplex ratio + // + 3, 0xA8, 95, 0xe3, + + // + // Contrast + // + 3, 0x81, 0xb7, 0xe3, + + // + // Pre-charge current + // + 3, 0x82, 0x3f, 0xe3, + + // + // Display Re-map + // + 3, 0xA0, RIT_INIT_REMAP, 0xe3, + + // + // Display Start Line + // + 3, 0xA1, 0, 0xe3, + + // + // Display Offset + // + 3, 0xA2, RIT_INIT_OFFSET, 0xe3, + + // + // Display Mode Normal + // + 2, 0xA4, 0xe3, + + // + // Phase Length + // + 3, 0xB1, 0x11, 0xe3, + + // + // Frame frequency + // + 3, 0xB2, 0x23, 0xe3, + + // + // Front Clock Divider + // + 3, 0xB3, 0xe2, 0xe3, + + // + // Set gray scale table. App note uses default command: + // 2, 0xB7, 0xe3 + // This gray scale attempts some gamma correction to reduce the + // the brightness of the low levels. + // + 17, 0xB8, 1, 2, 3, 4, 5, 6, 8, 10, 12, 14, 16, 19, 22, 26, 30, 0xe3, + + // + // Second pre-charge period. App note uses value 0x04. + // + 3, 0xBB, 0x01, 0xe3, + + // + // Pre-charge voltage + // + 3, 0xBC, 0x3f, 0xe3, + + // + // Display ON + // + 2, 0xAF, 0xe3, +}; + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of command bytes to the SSD1329 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +RITWriteCommand(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return if SSI port is not enabled for RIT display. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Clear the command/control bit to enable command mode. + // + GPIOPinWrite(ulGPIOBase, ulOLEDDC_PIN, 0); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! \internal +//! +//! Write a sequence of data bytes to the SSD1329 controller. +//! +//! The data is written in a polled fashion; this function will not return +//! until the entire byte sequence has been written to the controller. +//! +//! \return None. +// +//***************************************************************************** +static void +RITWriteData(const unsigned char *pucBuffer, unsigned long ulCount) +{ + unsigned long ulTemp; + + // + // Return if SSI port is not enabled for RIT display. + // + if(!g_bSSIEnabled) + { + return; + } + + // + // Set the command/control bit to enable data mode. + // + GPIOPinWrite(ulGPIOBase, ulOLEDDC_PIN, ulOLEDDC_PIN); + + // + // Loop while there are more bytes left to be transferred. + // + while(ulCount != 0) + { + // + // Write the next byte to the controller. + // + SSIDataPut(SSI0_BASE, *pucBuffer++); + + // + // Dummy read to drain the fifo and time the GPIO signal. + // + SSIDataGet(SSI0_BASE, &ulTemp); + + // + // Decrement the BYTE counter. + // + ulCount--; + } +} + +//***************************************************************************** +// +//! Clears the OLED display. +//! +//! This function will clear the display RAM. All pixels in the display will +//! be turned off. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4Clear(void) +{ + static const unsigned char pucCommand1[] = { 0x15, 0, 63 }; + static const unsigned char pucCommand2[] = { 0x75, 0, 127 }; + unsigned long ulRow, ulColumn; + + // + // Clear out the buffer used for sending bytes to the display. + *(unsigned long *)&g_pucBuffer[0] = 0; + *(unsigned long *)&g_pucBuffer[4] = 0; + + // + // Set the window to fill the entire display. + // + RITWriteCommand(pucCommand1, sizeof(pucCommand1)); + RITWriteCommand(pucCommand2, sizeof(pucCommand2)); + RITWriteCommand(g_pucRIT128x96x4HorizontalInc, + sizeof(g_pucRIT128x96x4HorizontalInc)); + + // + // Loop through the rows + // + for(ulRow = 0; ulRow < 96; ulRow++) + { + // + // Loop through the columns. Each byte is two pixels, + // and the buffer hold 8 bytes, so 16 pixels are cleared + // at a time. + // + for(ulColumn = 0; ulColumn < 128; ulColumn += 8 * 2) + { + // + // Write 8 clearing bytes to the display, which will + // clear 16 pixels across. + // + RITWriteData(g_pucBuffer, sizeof(g_pucBuffer)); + } + } +} + +//***************************************************************************** +// +//! Displays a string on the OLED display. +//! +//! \param pcStr is a pointer to the string to display. +//! \param ulX is the horizontal position to display the string, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display the string, specified in +//! rows from the top edge of the display. +//! \param ucLevel is the 4-bit grey scale value to be used for displayed text. +//! +//! This function will draw a string on the display. Only the ASCII characters +//! between 32 (space) and 126 (tilde) are supported; other characters will +//! result in random data being draw on the display (based on whatever appears +//! before/after the font in memory). The font is mono-spaced, so characters +//! such as "i" and "l" have more white space around them than characters such +//! as "m" or "w". +//! +//! If the drawing of the string reaches the right edge of the display, no more +//! characters will be drawn. Therefore, special care is not required to avoid +//! supplying a string that is "too long" to display. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \note Because the OLED display packs 2 pixels of data in a single byte, the +//! parameter \e ulX must be an even column number (e.g. 0, 2, 4, etc). +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4StringDraw(const char *pcStr, unsigned long ulX, + unsigned long ulY, unsigned char ucLevel) +{ + unsigned long ulIdx1, ulIdx2; + unsigned char ucTemp; + + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 96); + ASSERT(ucLevel < 16); + + // + // Setup a window starting at the specified column and row, ending + // at the right edge of the display and 8 rows down (single character row). + // + g_pucBuffer[0] = 0x15; + g_pucBuffer[1] = ulX / 2; + g_pucBuffer[2] = 63; + RITWriteCommand(g_pucBuffer, 3); + g_pucBuffer[0] = 0x75; + g_pucBuffer[1] = ulY; + g_pucBuffer[2] = ulY + 7; + RITWriteCommand(g_pucBuffer, 3); + RITWriteCommand(g_pucRIT128x96x4VerticalInc, + sizeof(g_pucRIT128x96x4VerticalInc)); + + // + // Loop while there are more characters in the string. + // + while(*pcStr != 0) + { + // + // Get a working copy of the current character and convert to an + // index into the character bit-map array. + // + ucTemp = *pcStr; + ucTemp &= 0x7F; + if(ucTemp < ' ') + { + ucTemp = ' '; + } + else + { + ucTemp -= ' '; + } + + // + // Build and display the character buffer. + // + for(ulIdx1 = 0; ulIdx1 < 3; ulIdx1++) + { + // + // Convert two columns of 1-bit font data into a single data + // byte column of 4-bit font data. + // + for(ulIdx2 = 0; ulIdx2 < 8; ulIdx2++) + { + g_pucBuffer[ulIdx2] = 0; + if(g_pucFont[ucTemp][ulIdx1*2] & (1 << ulIdx2)) + { + g_pucBuffer[ulIdx2] = ((ucLevel << 4) & 0xf0); + } + if((ulIdx1 < 2) && + (g_pucFont[ucTemp][ulIdx1*2+1] & (1 << ulIdx2))) + { + g_pucBuffer[ulIdx2] |= ((ucLevel << 0) & 0x0f); + } + } + + // + // If there is room, dump the single data byte column to the + // display. Otherwise, bail out. + // + if(ulX < 126) + { + RITWriteData(g_pucBuffer, 8); + ulX += 2; + } + else + { + return; + } + } + + // + // Advance to the next character. + // + pcStr++; + } +} + +//***************************************************************************** +// +//! Displays an image on the OLED display. +//! +//! \param pucImage is a pointer to the image data. +//! \param ulX is the horizontal position to display this image, specified in +//! columns from the left edge of the display. +//! \param ulY is the vertical position to display this image, specified in +//! rows from the top of the display. +//! \param ulWidth is the width of the image, specified in columns. +//! \param ulHeight is the height of the image, specified in rows. +//! +//! This function will display a bitmap graphic on the display. Because of the +//! format of the display RAM, the starting column (\e ulX) and the number of +//! columns (\e ulWidth) must be an integer multiple of two. +//! +//! The image data is organized with the first row of image data appearing left +//! to right, followed immediately by the second row of image data. Each byte +//! contains the data for two columns in the current row, with the leftmost +//! column being contained in bits 7:4 and the rightmost column being contained +//! in bits 3:0. +//! +//! For example, an image six columns wide and seven scan lines tall would +//! be arranged as follows (showing how the twenty one bytes of the image would +//! appear on the display): +//! +//! \verbatim +//! +-------------------+-------------------+-------------------+ +//! | Byte 0 | Byte 1 | Byte 2 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 3 | Byte 4 | Byte 5 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 6 | Byte 7 | Byte 8 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 9 | Byte 10 | Byte 11 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 12 | Byte 13 | Byte 14 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 15 | Byte 16 | Byte 17 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! | Byte 18 | Byte 19 | Byte 20 | +//! +---------+---------+---------+---------+---------+---------+ +//! | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | 7 6 5 4 | 3 2 1 0 | +//! +---------+---------+---------+---------+---------+---------+ +//! \endverbatim +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4ImageDraw(const unsigned char *pucImage, unsigned long ulX, + unsigned long ulY, unsigned long ulWidth, + unsigned long ulHeight) +{ + // + // Check the arguments. + // + ASSERT(ulX < 128); + ASSERT((ulX & 1) == 0); + ASSERT(ulY < 96); + ASSERT((ulX + ulWidth) <= 128); + ASSERT((ulY + ulHeight) <= 96); + ASSERT((ulWidth & 1) == 0); + + // + // Setup a window starting at the specified column and row, and ending + // at the column + width and row+height. + // + g_pucBuffer[0] = 0x15; + g_pucBuffer[1] = ulX / 2; + g_pucBuffer[2] = (ulX + ulWidth - 2) / 2; + RITWriteCommand(g_pucBuffer, 3); + g_pucBuffer[0] = 0x75; + g_pucBuffer[1] = ulY; + g_pucBuffer[2] = ulY + ulHeight - 1; + RITWriteCommand(g_pucBuffer, 3); + RITWriteCommand(g_pucRIT128x96x4HorizontalInc, + sizeof(g_pucRIT128x96x4HorizontalInc)); + + // + // Loop while there are more rows to display. + // + while(ulHeight--) + { + // + // Write this row of image data. + // + RITWriteData(pucImage, (ulWidth / 2)); + + // + // Advance to the next row of the image. + // + pucImage += (ulWidth / 2); + } +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4Enable(unsigned long ulFrequency) +{ + unsigned long ulTemp; + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Configure the SSI0 port for master mode. + // + SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_2, SSI_MODE_MASTER, ulFrequency, 8); + + // + // (Re)Enable SSI control of the FSS pin. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + + // + // Enable the SSI port. + // + SSIEnable(SSI0_BASE); + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Indicate that the RIT driver can use the SSI Port. + // + g_bSSIEnabled = true; +} + +//***************************************************************************** +// +//! Enable the SSI component of the OLED display driver. +//! +//! This function initializes the SSI interface to the OLED display. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4Disable(void) +{ + unsigned long ulTemp; + + // + // Indicate that the RIT driver can no longer use the SSI Port. + // + g_bSSIEnabled = false; + + // + // Drain the receive fifo. + // + while(SSIDataNonBlockingGet(SSI0_BASE, &ulTemp) != 0) + { + } + + // + // Disable the SSI port. + // + SSIDisable(SSI0_BASE); + + // + // Disable SSI control of the FSS pin. + // + GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_3); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, + GPIO_PIN_TYPE_STD_WPU); + GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3); +} + +//***************************************************************************** +// +//! Initialize the OLED display. +//! +//! \param ulFrequency specifies the SSI Clock Frequency to be used. +//! +//! This function initializes the SSI interface to the OLED display and +//! configures the SSD1329 controller on the panel. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4Init(unsigned long ulFrequency) +{ + unsigned long ulIdx; + + + /* Determine which board is being used. */ + if( SysCtlPeripheralPresent( SYSCTL_PERIPH_ETH ) ) + { + /* Ethernet is present, we must be using the LM3S8962 EK. */ + ulGPIOId = LM3S8962_SYSCTL_PERIPH_GPIO_OLEDDC; + ulGPIOBase = LM3S8962_GPIO_OLEDDC_BASE; + ulOLEDDC_PIN = GPIO_PIN_6; + ulOLEDEN_PIN = GPIO_PIN_7; + } + else + { + /* Ethernet is not present, we must be using the LM3S1968 EK. */ + ulGPIOId = LM3S1968_SYSCTL_PERIPH_GPIO_OLEDDC; + ulGPIOBase = LM3S1968_GPIO_OLEDDC_BASE; + ulOLEDDC_PIN = GPIO_PIN_2; + ulOLEDEN_PIN = GPIO_PIN_3; + } + + // + // Enable the SSI0 and GPIO port blocks as they are needed by this driver. + // + SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0); + SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); + SysCtlPeripheralEnable(ulGPIOId); + + // + // Configure the SSI0CLK and SSIOTX pins for SSI operation. + // + GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5); + GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_5, + GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); + + // + // Configure the GPIO port pin used as a D/Cn signal for OLED device, + // and the port pin used to enable power to the OLED panel. + // + GPIOPinTypeGPIOOutput(ulGPIOBase, ulOLEDDC_PIN | ulOLEDEN_PIN); + GPIOPadConfigSet(ulGPIOBase, ulOLEDDC_PIN | ulOLEDEN_PIN, + GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); + GPIOPinWrite(ulGPIOBase, ulOLEDDC_PIN | ulOLEDEN_PIN, + ulOLEDDC_PIN | ulOLEDEN_PIN); + + // + // Configure and enable the SSI0 port for master mode. + // + RIT128x96x4Enable(ulFrequency); + + // + // Clear the frame buffer. + // + RIT128x96x4Clear(); + + // + // Initialize the SSD1329 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucRIT128x96x4Init); + ulIdx += g_pucRIT128x96x4Init[ulIdx] + 1) + { + // + // Send this command. + // + RITWriteCommand(g_pucRIT128x96x4Init + ulIdx + 1, + g_pucRIT128x96x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns on the OLED display. +//! +//! This function will turn on the OLED display, causing it to display the +//! contents of its internal frame buffer. +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4DisplayOn(void) +{ + unsigned long ulIdx; + + // + // Initialize the SSD1329 controller. Loop through the initialization + // sequence array, sending each command "string" to the controller. + // + for(ulIdx = 0; ulIdx < sizeof(g_pucRIT128x96x4Init); + ulIdx += g_pucRIT128x96x4Init[ulIdx] + 1) + { + // + // Send this command. + // + RITWriteCommand(g_pucRIT128x96x4Init + ulIdx + 1, + g_pucRIT128x96x4Init[ulIdx] - 1); + } +} + +//***************************************************************************** +// +//! Turns off the OLED display. +//! +//! This function will turn off the OLED display. This will stop the scanning +//! of the panel and turn off the on-chip DC-DC converter, preventing damage to +//! the panel due to burn-in (it has similar characters to a CRT in this +//! respect). +//! +//! This function is contained in rit128x96x4.c, with +//! rit128x96x4.h containing the API definition for use by +//! applications. +//! +//! \return None. +// +//***************************************************************************** +void +RIT128x96x4DisplayOff(void) +{ + static const unsigned char pucCommand1[] = + { + 0xAE, 0xe3 + }; + + // + // Put the display to sleep. + // + RITWriteCommand(pucCommand1, sizeof(pucCommand1)); +} + +//***************************************************************************** +// +// Close the Doxygen group. +//! @} +// +//***************************************************************************** diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/thumb_crt0.s b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/thumb_crt0.s new file mode 100644 index 0000000..4c4b71d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/thumb_crt0.s @@ -0,0 +1,227 @@ +/***************************************************************************** + * Copyright (c) 2009 Rowley Associates Limited. * + * * + * This file may be distributed under the terms of the License Agreement * + * provided with this software. * + * * + * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE * + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * + *****************************************************************************/ + +/***************************************************************************** + * Preprocessor Definitions + * ------------------------ + * APP_ENTRY_POINT + * + * Defines the application entry point function, if undefined this setting + * defaults to "main". + * + * USE_PROCESS_STACK + * + * If defined, thread mode will be configured to use the process stack if + * the size of the process stack is greater than zero bytes in length. + * + * INITIALIZE_STACK + * + * If defined, the contents of the stack will be initialized to a the + * value 0xCC. + * + * FULL_LIBRARY + * + * If defined then + * - argc, argv are setup by the debug_getargs. + * - the exit symbol is defined and executes on return from main. + * - the exit symbol calls destructors, atexit functions and then debug_exit. + * + * If not defined then + * - argc and argv are zero. + * - no exit symbol, code loops on return from main. + *****************************************************************************/ + +#ifndef APP_ENTRY_POINT +#define APP_ENTRY_POINT main +#endif + +#ifndef ARGSSPACE +#define ARGSSPACE 128 +#endif + + .global _start + .syntax unified + .extern APP_ENTRY_POINT +#ifdef FULL_LIBRARY + .global exit +#endif + + .section .init, "ax" + .code 16 + .align 2 + .thumb_func + +_start: +#ifdef __RAM_BUILD + ldr r1, =__stack_end__ + mov sp, r1 +#endif +#ifdef INITIALIZE_STACK + mov r2, #0xCC + ldr r0, =__stack_start__ +#ifndef __RAM_BUILD + mov r1, sp +#endif + bl memory_set +#endif + +#ifdef USE_PROCESS_STACK + /* Set up process stack if size > 0 */ + ldr r1, =__stack_process_end__ + ldr r0, =__stack_process_start__ + subs r2, r1, r0 + beq 1f + msr psp, r1 + mov r2, #2 + msr control, r2 +#ifdef INITIALIZE_STACK + mov r2, #0xCC + bl memory_set +#endif +1: +#endif + /* Copy initialised memory sections into RAM (if necessary). */ + ldr r0, =__data_load_start__ + ldr r1, =__data_start__ + ldr r2, =__data_end__ + bl memory_copy + ldr r0, =__text_load_start__ + ldr r1, =__text_start__ + ldr r2, =__text_end__ + bl memory_copy + ldr r0, =__fast_load_start__ + ldr r1, =__fast_start__ + ldr r2, =__fast_end__ + bl memory_copy + ldr r0, =__ctors_load_start__ + ldr r1, =__ctors_start__ + ldr r2, =__ctors_end__ + bl memory_copy + ldr r0, =__dtors_load_start__ + ldr r1, =__dtors_start__ + ldr r2, =__dtors_end__ + bl memory_copy + ldr r0, =__rodata_load_start__ + ldr r1, =__rodata_start__ + ldr r2, =__rodata_end__ + bl memory_copy + + /* Zero the bss. */ + ldr r0, =__bss_start__ + ldr r1, =__bss_end__ + mov r2, #0 + bl memory_set + + /* Initialise the heap */ + ldr r0, = __heap_start__ + ldr r1, = __heap_end__ + sub r1, r1, r0 + mov r2, #0 + str r2, [r0] + add r0, r0, #4 + str r1, [r0] + + /* Call constructors */ + ldr r0, =__ctors_start__ + ldr r1, =__ctors_end__ +ctor_loop: + cmp r0, r1 + beq ctor_end + ldr r2, [r0] + add r0, #4 + push {r0-r1} + blx r2 + pop {r0-r1} + b ctor_loop +ctor_end: + + /* Setup initial call frame */ + mov r0, #0 + mov lr, r0 + mov r12, sp + +start: + /* Jump to application entry point */ +#ifdef FULL_LIBRARY + mov r0, #ARGSSPACE + ldr r1, =args + ldr r2, =debug_getargs + blx r2 + ldr r1, =args +#else + mov r0, #0 + mov r1, #0 +#endif + ldr r2, =APP_ENTRY_POINT + blx r2 + +#ifdef FULL_LIBRARY + .thumb_func +exit: + mov r5, r0 // save the exit parameter/return result + + /* Call destructors */ + ldr r0, =__dtors_start__ + ldr r1, =__dtors_end__ +dtor_loop: + cmp r0, r1 + beq dtor_end + ldr r2, [r0] + add r0, #4 + push {r0-r1} + blx r2 + pop {r0-r1} + b dtor_loop +dtor_end: + + /* Call atexit functions */ + ldr r2, =_execute_at_exit_fns + blx r2 + + /* Call debug_exit with return result/exit parameter */ + mov r0, r5 + ldr r2, =debug_exit + blx r2 +#endif + + /* Returned from application entry point, loop forever. */ +exit_loop: + b exit_loop + +memory_copy: + cmp r0, r1 + beq 2f + subs r2, r2, r1 + beq 2f +1: + ldrb r3, [r0] + add r0, r0, #1 + strb r3, [r1] + add r1, r1, #1 + subs r2, r2, #1 + bne 1b +2: + bx lr + +memory_set: + cmp r0, r1 + beq 1f + strb r2, [r0] + add r0, r0, #1 + b memory_set +1: + bx lr + +#ifdef FULL_LIBRARY + .bss +args: + .space ARGSSPACE +#endif + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/timertest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/timertest.c new file mode 100644 index 0000000..7fcc85e --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/timertest.c @@ -0,0 +1,176 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* High speed timer test as described in main.c. */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" + +/* Library includes. */ +#include "hw_ints.h" +#include "hw_memmap.h" +#include "hw_types.h" +#include "interrupt.h" +#include "sysctl.h" +#include "lmi_timer.h" + +/* The set frequency of the interrupt. Deviations from this are measured as +the jitter. */ +#define timerINTERRUPT_FREQUENCY ( 20000UL ) + +/* The expected time between each of the timer interrupts - if the jitter was +zero. */ +#define timerEXPECTED_DIFFERENCE_VALUE ( configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY ) + +/* The highest available interrupt priority. */ +#define timerHIGHEST_PRIORITY ( 0 ) + +/* Misc defines. */ +#define timerMAX_32BIT_VALUE ( 0xffffffffUL ) +#define timerTIMER_1_COUNT_VALUE ( * ( ( unsigned long * ) ( TIMER1_BASE + 0x48 ) ) ) + +/*-----------------------------------------------------------*/ + +/* Interrupt handler in which the jitter is measured. */ +void Timer0IntHandler( void ); + +/* Stores the value of the maximum recorded jitter between interrupts. */ +volatile unsigned long ulMaxJitter = 0UL; + +/* Counts the total number of times that the high frequency timer has 'ticked'. +This value is used by the run time stats function to work out what percentage +of CPU time each task is taking. */ +volatile unsigned long ulHighFrequencyTimerTicks = 0UL; +/*-----------------------------------------------------------*/ + +void vSetupHighFrequencyTimer( void ) +{ +unsigned long ulFrequency; + + /* Timer zero is used to generate the interrupts, and timer 1 is used + to measure the jitter. */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER0 ); + SysCtlPeripheralEnable( SYSCTL_PERIPH_TIMER1 ); + TimerConfigure( TIMER0_BASE, TIMER_CFG_32_BIT_PER ); + TimerConfigure( TIMER1_BASE, TIMER_CFG_32_BIT_PER ); + + /* Set the timer interrupt to be above the kernel - highest. */ + IntPrioritySet( INT_TIMER0A, timerHIGHEST_PRIORITY ); + + /* Just used to measure time. */ + TimerLoadSet(TIMER1_BASE, TIMER_A, timerMAX_32BIT_VALUE ); + + /* Ensure interrupts do not start until the scheduler is running. */ + portDISABLE_INTERRUPTS(); + + /* The rate at which the timer will interrupt. */ + ulFrequency = configCPU_CLOCK_HZ / timerINTERRUPT_FREQUENCY; + TimerLoadSet( TIMER0_BASE, TIMER_A, ulFrequency ); + IntEnable( INT_TIMER0A ); + TimerIntEnable( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); + + /* Enable both timers. */ + TimerEnable( TIMER0_BASE, TIMER_A ); + TimerEnable( TIMER1_BASE, TIMER_A ); +} +/*-----------------------------------------------------------*/ + +void Timer0IntHandler( void ) +{ +unsigned long ulDifference; +volatile unsigned long ulCurrentCount; +static unsigned long ulMaxDifference = 0, ulLastCount = 0; + + /* We use the timer 1 counter value to measure the clock cycles between + the timer 0 interrupts. */ + ulCurrentCount = timerTIMER_1_COUNT_VALUE; + + TimerIntClear( TIMER0_BASE, TIMER_TIMA_TIMEOUT ); + + if( ulCurrentCount < ulLastCount ) + { + /* How many times has timer 1 counted since the last interrupt? */ + ulDifference = ulLastCount - ulCurrentCount; + + /* Is this the largest difference we have measured yet? */ + if( ulDifference > ulMaxDifference ) + { + ulMaxDifference = ulDifference; + ulMaxJitter = ulMaxDifference - timerEXPECTED_DIFFERENCE_VALUE; + } + } + + ulLastCount = ulCurrentCount; + + /* Keep a count of the total number of 20KHz ticks. This is used by the + run time stats functionality to calculate how much CPU time is used by + each task. */ + ulHighFrequencyTimerTicks++; +} + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/Makefile.webserver b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/Makefile.webserver new file mode 100644 index 0000000..f38c47a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/Makefile.webserver @@ -0,0 +1 @@ +APP_SOURCES += httpd.c http-strings.c httpd-fs.c httpd-cgi.c diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/clock-arch.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/clock-arch.h new file mode 100644 index 0000000..cde657b --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/clock-arch.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +#include "FreeRTOS.h" + +typedef unsigned long clock_time_t; +#define CLOCK_CONF_SECOND configTICK_RATE_HZ + +#endif /* __CLOCK_ARCH_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/emac.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/emac.c new file mode 100644 index 0000000..60e17de --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/emac.c @@ -0,0 +1,312 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "semphr.h" +#include "task.h" + +/* Demo includes. */ +#include "emac.h" + +/* uIP includes. */ +#include "uip.h" + +/* Hardware library includes. */ +#include "hw_types.h" +#include "hw_memmap.h" +#include "hw_ints.h" +#include "hw_ethernet.h" +#include "ethernet.h" +#include "interrupt.h" + +#define emacNUM_RX_BUFFERS 5 +#define emacFRAM_SIZE_BYTES 2 +#define macNEGOTIATE_DELAY 2000 +#define macWAIT_SEND_TIME ( 10 ) + +/* The task that handles the MAC peripheral. This is created at a high +priority and is effectively a deferred interrupt handler. The peripheral +handling is deferred to a task to prevent the entire FIFO having to be read +from within an ISR. */ +void vMACHandleTask( void *pvParameters ); + +/*-----------------------------------------------------------*/ + +/* The semaphore used to wake the uIP task when data arrives. */ +xSemaphoreHandle xEMACSemaphore = NULL; + +/* The semaphore used to wake the interrupt handler task. The peripheral +is processed at the task level to prevent the need to read the entire FIFO from +within the ISR itself. */ +xSemaphoreHandle xMACInterruptSemaphore = NULL; + +/* The buffer used by the uIP stack. In this case the pointer is used to +point to one of the Rx buffers. */ +unsigned char *uip_buf; + +/* Buffers into which Rx data is placed. */ +static unsigned char ucRxBuffers[ emacNUM_RX_BUFFERS ][ UIP_BUFSIZE + ( 4 * emacFRAM_SIZE_BYTES ) ] __attribute__((aligned(4))); + +/* The length of the data within each of the Rx buffers. */ +static unsigned long ulRxLength[ emacNUM_RX_BUFFERS ]; + +/* Used to keep a track of the number of bytes to transmit. */ +static unsigned long ulNextTxSpace; + +/*-----------------------------------------------------------*/ + +portBASE_TYPE vInitEMAC( void ) +{ +unsigned long ulTemp; +portBASE_TYPE xReturn; + + /* Ensure all interrupts are disabled. */ + EthernetIntDisable( ETH_BASE, ( ETH_INT_PHY | ETH_INT_MDIO | ETH_INT_RXER | ETH_INT_RXOF | ETH_INT_TX | ETH_INT_TXER | ETH_INT_RX)); + + /* Clear any interrupts that were already pending. */ + ulTemp = EthernetIntStatus( ETH_BASE, pdFALSE ); + EthernetIntClear( ETH_BASE, ulTemp ); + + /* Initialise the MAC and connect. */ + EthernetInit( ETH_BASE ); + EthernetConfigSet( ETH_BASE, ( ETH_CFG_TX_DPLXEN | ETH_CFG_TX_CRCEN | ETH_CFG_TX_PADEN ) ); + EthernetEnable( ETH_BASE ); + + /* Mark each Rx buffer as empty. */ + for( ulTemp = 0; ulTemp < emacNUM_RX_BUFFERS; ulTemp++ ) + { + ulRxLength[ ulTemp ] = 0; + } + + /* Create the queue and task used to defer the MAC processing to the + task level. */ + vSemaphoreCreateBinary( xMACInterruptSemaphore ); + xSemaphoreTake( xMACInterruptSemaphore, 0 ); + xReturn = xTaskCreate( vMACHandleTask, ( signed char * ) "MAC", configMINIMAL_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL ); + vTaskDelay( macNEGOTIATE_DELAY ); + + /* We are only interested in Rx interrupts. */ + IntPrioritySet( INT_ETH, configKERNEL_INTERRUPT_PRIORITY ); + IntEnable( INT_ETH ); + EthernetIntEnable(ETH_BASE, ETH_INT_RX); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned int uiGetEMACRxData( unsigned char *ucBuffer ) +{ +static unsigned long ulNextRxBuffer = 0; +unsigned int iLen; + + iLen = ulRxLength[ ulNextRxBuffer ]; + + if( iLen != 0 ) + { + /* Leave room for the size at the start of the buffer. */ + uip_buf = &( ucRxBuffers[ ulNextRxBuffer ][ 2 ] ); + + ulRxLength[ ulNextRxBuffer ] = 0; + + ulNextRxBuffer++; + if( ulNextRxBuffer >= emacNUM_RX_BUFFERS ) + { + ulNextRxBuffer = 0; + } + } + + return iLen; +} +/*-----------------------------------------------------------*/ + +void vInitialiseSend( void ) +{ + /* Set the index to the first byte to send - skipping over the size + bytes. */ + ulNextTxSpace = 2; +} +/*-----------------------------------------------------------*/ + +void vIncrementTxLength( unsigned long ulLength ) +{ + ulNextTxSpace += ulLength; +} +/*-----------------------------------------------------------*/ + +void vSendBufferToMAC( void ) +{ +unsigned long *pulSource; +unsigned short * pus; +unsigned long ulNextWord; + + /* Locate the data to be send. */ + pus = ( unsigned short * ) uip_buf; + + /* Add in the size of the data. */ + pus--; + *pus = ulNextTxSpace; + + /* Wait for data to be sent if there is no space immediately. */ + while( !EthernetSpaceAvail( ETH_BASE ) ) + { + vTaskDelay( macWAIT_SEND_TIME ); + } + + pulSource = ( unsigned long * ) pus; + + for( ulNextWord = 0; ulNextWord < ulNextTxSpace; ulNextWord += sizeof( unsigned long ) ) + { + HWREG(ETH_BASE + MAC_O_DATA) = *pulSource; + pulSource++; + } + + /* Go. */ + HWREG( ETH_BASE + MAC_O_TR ) = MAC_TR_NEWTX; +} +/*-----------------------------------------------------------*/ + +void vEMAC_ISR( void ) +{ +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; +unsigned long ulTemp; + + /* Clear the interrupt. */ + ulTemp = EthernetIntStatus( ETH_BASE, pdFALSE ); + EthernetIntClear( ETH_BASE, ulTemp ); + + /* Was it an Rx interrupt? */ + if( ulTemp & ETH_INT_RX ) + { + xSemaphoreGiveFromISR( xMACInterruptSemaphore, &xHigherPriorityTaskWoken ); + EthernetIntDisable( ETH_BASE, ETH_INT_RX ); + } + + /* Switch to the uIP task. */ + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} +/*-----------------------------------------------------------*/ + +void vMACHandleTask( void *pvParameters ) +{ +unsigned long i; +unsigned long ulLength, ulInt; +unsigned long *pulBuffer; +static unsigned long ulNextRxBuffer = 0; + + for( ;; ) + { + /* Wait for something to do. */ + xSemaphoreTake( xMACInterruptSemaphore, portMAX_DELAY ); + + while( ( ulInt = ( EthernetIntStatus( ETH_BASE, pdFALSE ) & ETH_INT_RX ) ) != 0 ) + { + ulLength = HWREG( ETH_BASE + MAC_O_DATA ); + + /* Leave room at the start of the buffer for the size. */ + pulBuffer = ( unsigned long * ) &( ucRxBuffers[ ulNextRxBuffer ][ 2 ] ); + *pulBuffer = ( ulLength >> 16 ); + + /* Get the size of the data. */ + pulBuffer = ( unsigned long * ) &( ucRxBuffers[ ulNextRxBuffer ][ 4 ] ); + ulLength &= 0xFFFF; + + if( ulLength > 4 ) + { + ulLength -= 4; + + if( ulLength >= UIP_BUFSIZE ) + { + /* The data won't fit in our buffer. Ensure we don't + try to write into the buffer. */ + ulLength = 0; + } + + /* Read out the data into our buffer. */ + for( i = 0; i < ulLength; i += sizeof( unsigned long ) ) + { + *pulBuffer = HWREG( ETH_BASE + MAC_O_DATA ); + pulBuffer++; + } + + /* Store the length of the data into the separate array. */ + ulRxLength[ ulNextRxBuffer ] = ulLength; + + /* Use the next buffer the next time through. */ + ulNextRxBuffer++; + if( ulNextRxBuffer >= emacNUM_RX_BUFFERS ) + { + ulNextRxBuffer = 0; + } + + /* Ensure the uIP task is not blocked as data has arrived. */ + xSemaphoreGive( xEMACSemaphore ); + } + } + + EthernetIntEnable( ETH_BASE, ETH_INT_RX ); + } +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/emac.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/emac.h new file mode 100644 index 0000000..a49b598 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/emac.h @@ -0,0 +1,322 @@ +/*---------------------------------------------------------------------------- + * LPC2378 Ethernet Definitions + *---------------------------------------------------------------------------- + * Name: EMAC.H + * Purpose: Philips LPC2378 EMAC hardware definitions + *---------------------------------------------------------------------------- + * Copyright (c) 2006 KEIL - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ +#ifndef __EMAC_H +#define __EMAC_H + +/* MAC address definition. The MAC address must be unique on the network. */ +#define emacETHADDR0 0 +#define emacETHADDR1 0xbd +#define emacETHADDR2 0x33 +#define emacETHADDR3 0x02 +#define emacETHADDR4 0x64 +#define emacETHADDR5 0x24 + + +/* EMAC Memory Buffer configuration for 16K Ethernet RAM. */ +#define NUM_RX_FRAG 4 /* Num.of RX Fragments 4*1536= 6.0kB */ +#define NUM_TX_FRAG 2 /* Num.of TX Fragments 2*1536= 3.0kB */ +#define ETH_FRAG_SIZE 1536 /* Packet Fragment size 1536 Bytes */ + +#define ETH_MAX_FLEN 1536 /* Max. Ethernet Frame Size */ + +/* EMAC variables located in 16K Ethernet SRAM */ +#define RX_DESC_BASE 0x7FE00000 +#define RX_STAT_BASE (RX_DESC_BASE + NUM_RX_FRAG*8) +#define TX_DESC_BASE (RX_STAT_BASE + NUM_RX_FRAG*8) +#define TX_STAT_BASE (TX_DESC_BASE + NUM_TX_FRAG*8) +#define RX_BUF_BASE (TX_STAT_BASE + NUM_TX_FRAG*4) +#define TX_BUF_BASE (RX_BUF_BASE + NUM_RX_FRAG*ETH_FRAG_SIZE) + +/* RX and TX descriptor and status definitions. */ +#define RX_DESC_PACKET(i) (*(unsigned int *)(RX_DESC_BASE + 8*i)) +#define RX_DESC_CTRL(i) (*(unsigned int *)(RX_DESC_BASE+4 + 8*i)) +#define RX_STAT_INFO(i) (*(unsigned int *)(RX_STAT_BASE + 8*i)) +#define RX_STAT_HASHCRC(i) (*(unsigned int *)(RX_STAT_BASE+4 + 8*i)) +#define TX_DESC_PACKET(i) (*(unsigned int *)(TX_DESC_BASE + 8*i)) +#define TX_DESC_CTRL(i) (*(unsigned int *)(TX_DESC_BASE+4 + 8*i)) +#define TX_STAT_INFO(i) (*(unsigned int *)(TX_STAT_BASE + 4*i)) +#define RX_BUF(i) (RX_BUF_BASE + ETH_FRAG_SIZE*i) +#define TX_BUF(i) (TX_BUF_BASE + ETH_FRAG_SIZE*i) + +/* MAC Configuration Register 1 */ +#define MAC1_REC_EN 0x00000001 /* Receive Enable */ +#define MAC1_PASS_ALL 0x00000002 /* Pass All Receive Frames */ +#define MAC1_RX_FLOWC 0x00000004 /* RX Flow Control */ +#define MAC1_TX_FLOWC 0x00000008 /* TX Flow Control */ +#define MAC1_LOOPB 0x00000010 /* Loop Back Mode */ +#define MAC1_RES_TX 0x00000100 /* Reset TX Logic */ +#define MAC1_RES_MCS_TX 0x00000200 /* Reset MAC TX Control Sublayer */ +#define MAC1_RES_RX 0x00000400 /* Reset RX Logic */ +#define MAC1_RES_MCS_RX 0x00000800 /* Reset MAC RX Control Sublayer */ +#define MAC1_SIM_RES 0x00004000 /* Simulation Reset */ +#define MAC1_SOFT_RES 0x00008000 /* Soft Reset MAC */ + +/* MAC Configuration Register 2 */ +#define MAC2_FULL_DUP 0x00000001 /* Full Duplex Mode */ +#define MAC2_FRM_LEN_CHK 0x00000002 /* Frame Length Checking */ +#define MAC2_HUGE_FRM_EN 0x00000004 /* Huge Frame Enable */ +#define MAC2_DLY_CRC 0x00000008 /* Delayed CRC Mode */ +#define MAC2_CRC_EN 0x00000010 /* Append CRC to every Frame */ +#define MAC2_PAD_EN 0x00000020 /* Pad all Short Frames */ +#define MAC2_VLAN_PAD_EN 0x00000040 /* VLAN Pad Enable */ +#define MAC2_ADET_PAD_EN 0x00000080 /* Auto Detect Pad Enable */ +#define MAC2_PPREAM_ENF 0x00000100 /* Pure Preamble Enforcement */ +#define MAC2_LPREAM_ENF 0x00000200 /* Long Preamble Enforcement */ +#undef MAC2_NO_BACKOFF /* Remove compiler warning. */ +#define MAC2_NO_BACKOFF 0x00001000 /* No Backoff Algorithm */ +#define MAC2_BACK_PRESSURE 0x00002000 /* Backoff Presurre / No Backoff */ +#define MAC2_EXCESS_DEF 0x00004000 /* Excess Defer */ + +/* Back-to-Back Inter-Packet-Gap Register */ +#define IPGT_FULL_DUP 0x00000015 /* Recommended value for Full Duplex */ +#define IPGT_HALF_DUP 0x00000012 /* Recommended value for Half Duplex */ + +/* Non Back-to-Back Inter-Packet-Gap Register */ +#define IPGR_DEF 0x00000012 /* Recommended value */ + +/* Collision Window/Retry Register */ +#define CLRT_DEF 0x0000370F /* Default value */ + +/* PHY Support Register */ +#undef SUPP_SPEED /* Remove compiler warning. */ +#define SUPP_SPEED 0x00000100 /* Reduced MII Logic Current Speed */ +#define SUPP_RES_RMII 0x00000800 /* Reset Reduced MII Logic */ + +/* Test Register */ +#define TEST_SHCUT_PQUANTA 0x00000001 /* Shortcut Pause Quanta */ +#define TEST_TST_PAUSE 0x00000002 /* Test Pause */ +#define TEST_TST_BACKP 0x00000004 /* Test Back Pressure */ + +/* MII Management Configuration Register */ +#define MCFG_SCAN_INC 0x00000001 /* Scan Increment PHY Address */ +#define MCFG_SUPP_PREAM 0x00000002 /* Suppress Preamble */ +#define MCFG_CLK_SEL 0x0000001C /* Clock Select Mask */ +#define MCFG_RES_MII 0x00008000 /* Reset MII Management Hardware */ + +/* MII Management Command Register */ +#undef MCMD_READ /* Remove compiler warning. */ +#define MCMD_READ 0x00000001 /* MII Read */ +#undef MCMD_SCAN /* Remove compiler warning. */ +#define MCMD_SCAN 0x00000002 /* MII Scan continuously */ + +#define MII_WR_TOUT 0x00050000 /* MII Write timeout count */ +#define MII_RD_TOUT 0x00050000 /* MII Read timeout count */ + +/* MII Management Address Register */ +#define MADR_REG_ADR 0x0000001F /* MII Register Address Mask */ +#define MADR_PHY_ADR 0x00001F00 /* PHY Address Mask */ + +/* MII Management Indicators Register */ +#undef MIND_BUSY /* Remove compiler warning. */ +#define MIND_BUSY 0x00000001 /* MII is Busy */ +#define MIND_SCAN 0x00000002 /* MII Scanning in Progress */ +#define MIND_NOT_VAL 0x00000004 /* MII Read Data not valid */ +#define MIND_MII_LINK_FAIL 0x00000008 /* MII Link Failed */ + +/* Command Register */ +#define CR_RX_EN 0x00000001 /* Enable Receive */ +#define CR_TX_EN 0x00000002 /* Enable Transmit */ +#define CR_REG_RES 0x00000008 /* Reset Host Registers */ +#define CR_TX_RES 0x00000010 /* Reset Transmit Datapath */ +#define CR_RX_RES 0x00000020 /* Reset Receive Datapath */ +#define CR_PASS_RUNT_FRM 0x00000040 /* Pass Runt Frames */ +#define CR_PASS_RX_FILT 0x00000080 /* Pass RX Filter */ +#define CR_TX_FLOW_CTRL 0x00000100 /* TX Flow Control */ +#define CR_RMII 0x00000200 /* Reduced MII Interface */ +#define CR_FULL_DUP 0x00000400 /* Full Duplex */ + +/* Status Register */ +#define SR_RX_EN 0x00000001 /* Enable Receive */ +#define SR_TX_EN 0x00000002 /* Enable Transmit */ + +/* Transmit Status Vector 0 Register */ +#define TSV0_CRC_ERR 0x00000001 /* CRC error */ +#define TSV0_LEN_CHKERR 0x00000002 /* Length Check Error */ +#define TSV0_LEN_OUTRNG 0x00000004 /* Length Out of Range */ +#define TSV0_DONE 0x00000008 /* Tramsmission Completed */ +#define TSV0_MCAST 0x00000010 /* Multicast Destination */ +#define TSV0_BCAST 0x00000020 /* Broadcast Destination */ +#define TSV0_PKT_DEFER 0x00000040 /* Packet Deferred */ +#define TSV0_EXC_DEFER 0x00000080 /* Excessive Packet Deferral */ +#define TSV0_EXC_COLL 0x00000100 /* Excessive Collision */ +#define TSV0_LATE_COLL 0x00000200 /* Late Collision Occured */ +#define TSV0_GIANT 0x00000400 /* Giant Frame */ +#define TSV0_UNDERRUN 0x00000800 /* Buffer Underrun */ +#define TSV0_BYTES 0x0FFFF000 /* Total Bytes Transferred */ +#define TSV0_CTRL_FRAME 0x10000000 /* Control Frame */ +#define TSV0_PAUSE 0x20000000 /* Pause Frame */ +#define TSV0_BACK_PRESS 0x40000000 /* Backpressure Method Applied */ +#define TSV0_VLAN 0x80000000 /* VLAN Frame */ + +/* Transmit Status Vector 1 Register */ +#define TSV1_BYTE_CNT 0x0000FFFF /* Transmit Byte Count */ +#define TSV1_COLL_CNT 0x000F0000 /* Transmit Collision Count */ + +/* Receive Status Vector Register */ +#define RSV_BYTE_CNT 0x0000FFFF /* Receive Byte Count */ +#define RSV_PKT_IGNORED 0x00010000 /* Packet Previously Ignored */ +#define RSV_RXDV_SEEN 0x00020000 /* RXDV Event Previously Seen */ +#define RSV_CARR_SEEN 0x00040000 /* Carrier Event Previously Seen */ +#define RSV_REC_CODEV 0x00080000 /* Receive Code Violation */ +#define RSV_CRC_ERR 0x00100000 /* CRC Error */ +#define RSV_LEN_CHKERR 0x00200000 /* Length Check Error */ +#define RSV_LEN_OUTRNG 0x00400000 /* Length Out of Range */ +#define RSV_REC_OK 0x00800000 /* Frame Received OK */ +#define RSV_MCAST 0x01000000 /* Multicast Frame */ +#define RSV_BCAST 0x02000000 /* Broadcast Frame */ +#define RSV_DRIB_NIBB 0x04000000 /* Dribble Nibble */ +#define RSV_CTRL_FRAME 0x08000000 /* Control Frame */ +#define RSV_PAUSE 0x10000000 /* Pause Frame */ +#define RSV_UNSUPP_OPC 0x20000000 /* Unsupported Opcode */ +#define RSV_VLAN 0x40000000 /* VLAN Frame */ + +/* Flow Control Counter Register */ +#define FCC_MIRR_CNT 0x0000FFFF /* Mirror Counter */ +#define FCC_PAUSE_TIM 0xFFFF0000 /* Pause Timer */ + +/* Flow Control Status Register */ +#define FCS_MIRR_CNT 0x0000FFFF /* Mirror Counter Current */ + +/* Receive Filter Control Register */ +#define RFC_UCAST_EN 0x00000001 /* Accept Unicast Frames Enable */ +#define RFC_BCAST_EN 0x00000002 /* Accept Broadcast Frames Enable */ +#define RFC_MCAST_EN 0x00000004 /* Accept Multicast Frames Enable */ +#define RFC_UCAST_HASH_EN 0x00000008 /* Accept Unicast Hash Filter Frames */ +#define RFC_MCAST_HASH_EN 0x00000010 /* Accept Multicast Hash Filter Fram.*/ +#define RFC_PERFECT_EN 0x00000020 /* Accept Perfect Match Enable */ +#define RFC_MAGP_WOL_EN 0x00001000 /* Magic Packet Filter WoL Enable */ +#define RFC_PFILT_WOL_EN 0x00002000 /* Perfect Filter WoL Enable */ + +/* Receive Filter WoL Status/Clear Registers */ +#define WOL_UCAST 0x00000001 /* Unicast Frame caused WoL */ +#define WOL_BCAST 0x00000002 /* Broadcast Frame caused WoL */ +#define WOL_MCAST 0x00000004 /* Multicast Frame caused WoL */ +#define WOL_UCAST_HASH 0x00000008 /* Unicast Hash Filter Frame WoL */ +#define WOL_MCAST_HASH 0x00000010 /* Multicast Hash Filter Frame WoL */ +#define WOL_PERFECT 0x00000020 /* Perfect Filter WoL */ +#define WOL_RX_FILTER 0x00000080 /* RX Filter caused WoL */ +#define WOL_MAG_PACKET 0x00000100 /* Magic Packet Filter caused WoL */ + +/* Interrupt Status/Enable/Clear/Set Registers */ +#define INT_RX_OVERRUN 0x00000001 /* Overrun Error in RX Queue */ +#define INT_RX_ERR 0x00000002 /* Receive Error */ +#define INT_RX_FIN 0x00000004 /* RX Finished Process Descriptors */ +#define INT_RX_DONE 0x00000008 /* Receive Done */ +#define INT_TX_UNDERRUN 0x00000010 /* Transmit Underrun */ +#define INT_TX_ERR 0x00000020 /* Transmit Error */ +#define INT_TX_FIN 0x00000040 /* TX Finished Process Descriptors */ +#define INT_TX_DONE 0x00000080 /* Transmit Done */ +#define INT_SOFT_INT 0x00001000 /* Software Triggered Interrupt */ +#define INT_WAKEUP 0x00002000 /* Wakeup Event Interrupt */ + +/* Power Down Register */ +#define PD_POWER_DOWN 0x80000000 /* Power Down MAC */ + +/* RX Descriptor Control Word */ +#define RCTRL_SIZE 0x000007FF /* Buffer size mask */ +#define RCTRL_INT 0x80000000 /* Generate RxDone Interrupt */ + +/* RX Status Hash CRC Word */ +#define RHASH_SA 0x000001FF /* Hash CRC for Source Address */ +#define RHASH_DA 0x001FF000 /* Hash CRC for Destination Address */ + +/* RX Status Information Word */ +#define RINFO_SIZE 0x000007FF /* Data size in bytes */ +#define RINFO_CTRL_FRAME 0x00040000 /* Control Frame */ +#define RINFO_VLAN 0x00080000 /* VLAN Frame */ +#define RINFO_FAIL_FILT 0x00100000 /* RX Filter Failed */ +#define RINFO_MCAST 0x00200000 /* Multicast Frame */ +#define RINFO_BCAST 0x00400000 /* Broadcast Frame */ +#define RINFO_CRC_ERR 0x00800000 /* CRC Error in Frame */ +#define RINFO_SYM_ERR 0x01000000 /* Symbol Error from PHY */ +#define RINFO_LEN_ERR 0x02000000 /* Length Error */ +#define RINFO_RANGE_ERR 0x04000000 /* Range Error (exceeded max. size) */ +#define RINFO_ALIGN_ERR 0x08000000 /* Alignment Error */ +#define RINFO_OVERRUN 0x10000000 /* Receive overrun */ +#define RINFO_NO_DESCR 0x20000000 /* No new Descriptor available */ +#define RINFO_LAST_FLAG 0x40000000 /* Last Fragment in Frame */ +#define RINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +#define RINFO_ERR_MASK (RINFO_FAIL_FILT | RINFO_CRC_ERR | RINFO_SYM_ERR | \ + RINFO_LEN_ERR | RINFO_ALIGN_ERR | RINFO_OVERRUN) + +/* TX Descriptor Control Word */ +#define TCTRL_SIZE 0x000007FF /* Size of data buffer in bytes */ +#define TCTRL_OVERRIDE 0x04000000 /* Override Default MAC Registers */ +#define TCTRL_HUGE 0x08000000 /* Enable Huge Frame */ +#define TCTRL_PAD 0x10000000 /* Pad short Frames to 64 bytes */ +#define TCTRL_CRC 0x20000000 /* Append a hardware CRC to Frame */ +#define TCTRL_LAST 0x40000000 /* Last Descriptor for TX Frame */ +#define TCTRL_INT 0x80000000 /* Generate TxDone Interrupt */ + +/* TX Status Information Word */ +#define TINFO_COL_CNT 0x01E00000 /* Collision Count */ +#define TINFO_DEFER 0x02000000 /* Packet Deferred (not an error) */ +#define TINFO_EXCESS_DEF 0x04000000 /* Excessive Deferral */ +#define TINFO_EXCESS_COL 0x08000000 /* Excessive Collision */ +#define TINFO_LATE_COL 0x10000000 /* Late Collision Occured */ +#define TINFO_UNDERRUN 0x20000000 /* Transmit Underrun */ +#define TINFO_NO_DESCR 0x40000000 /* No new Descriptor available */ +#define TINFO_ERR 0x80000000 /* Error Occured (OR of all errors) */ + +/* DP83848C PHY Registers */ +#define PHY_REG_BMCR 0x00 /* Basic Mode Control Register */ +#define PHY_REG_BMSR 0x01 /* Basic Mode Status Register */ +#define PHY_REG_IDR1 0x02 /* PHY Identifier 1 */ +#define PHY_REG_IDR2 0x03 /* PHY Identifier 2 */ +#define PHY_REG_ANAR 0x04 /* Auto-Negotiation Advertisement */ +#define PHY_REG_ANLPAR 0x05 /* Auto-Neg. Link Partner Abitily */ +#define PHY_REG_ANER 0x06 /* Auto-Neg. Expansion Register */ +#define PHY_REG_ANNPTR 0x07 /* Auto-Neg. Next Page TX */ + +/* PHY Extended Registers */ +#define PHY_REG_STS 0x10 /* Status Register */ +#define PHY_REG_MICR 0x11 /* MII Interrupt Control Register */ +#define PHY_REG_MISR 0x12 /* MII Interrupt Status Register */ +#define PHY_REG_FCSCR 0x14 /* False Carrier Sense Counter */ +#define PHY_REG_RECR 0x15 /* Receive Error Counter */ +#define PHY_REG_PCSR 0x16 /* PCS Sublayer Config. and Status */ +#define PHY_REG_RBR 0x17 /* RMII and Bypass Register */ +#define PHY_REG_LEDCR 0x18 /* LED Direct Control Register */ +#define PHY_REG_PHYCR 0x19 /* PHY Control Register */ +#define PHY_REG_10BTSCR 0x1A /* 10Base-T Status/Control Register */ +#define PHY_REG_CDCTRL1 0x1B /* CD Test Control and BIST Extens. */ +#define PHY_REG_EDCR 0x1D /* Energy Detect Control Register */ + +#define PHY_FULLD_100M 0x2100 /* Full Duplex 100Mbit */ +#define PHY_HALFD_100M 0x2000 /* Half Duplex 100Mbit */ +#define PHY_FULLD_10M 0x0100 /* Full Duplex 10Mbit */ +#define PHY_HALFD_10M 0x0000 /* Half Duplex 10MBit */ +#define PHY_AUTO_NEG 0x3000 /* Select Auto Negotiation */ + +#define DP83848C_DEF_ADR 0x0100 /* Default PHY device address */ +#define DP83848C_ID 0x20005C90 /* PHY Identifier */ + +// prototypes +portBASE_TYPE vInitEMAC(void); +unsigned short ReadFrameBE_EMAC(void); +void vIncrementTxLength(unsigned long ulLength); +void CopyFromFrame_EMAC(void *Dest, unsigned short Size); +void DummyReadFrame_EMAC(unsigned short Size); +unsigned short StartReadFrame(void); +void EndReadFrame(void); +unsigned int CheckFrameReceived(void); +void vInitialiseSend(void); +unsigned int Rdy4Tx(void); +void vSendBufferToMAC(void); +void vEMACWaitForInput( void ); +unsigned int uiGetEMACRxData( unsigned char *ucBuffer ); + + +#endif + +/*---------------------------------------------------------------------------- + * end of file + *---------------------------------------------------------------------------*/ + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/http-strings b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/http-strings new file mode 100644 index 0000000..0d3c30c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/http-strings @@ -0,0 +1,35 @@ +http_http "http://" +http_200 "200 " +http_301 "301 " +http_302 "302 " +http_get "GET " +http_10 "HTTP/1.0" +http_11 "HTTP/1.1" +http_content_type "content-type: " +http_texthtml "text/html" +http_location "location: " +http_host "host: " +http_crnl "\r\n" +http_index_html "/index.html" +http_404_html "/404.html" +http_referer "Referer:" +http_header_200 "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_header_404 "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_content_type_plain "Content-type: text/plain\r\n\r\n" +http_content_type_html "Content-type: text/html\r\n\r\n" +http_content_type_css "Content-type: text/css\r\n\r\n" +http_content_type_text "Content-type: text/text\r\n\r\n" +http_content_type_png "Content-type: image/png\r\n\r\n" +http_content_type_gif "Content-type: image/gif\r\n\r\n" +http_content_type_jpg "Content-type: image/jpeg\r\n\r\n" +http_content_type_binary "Content-type: application/octet-stream\r\n\r\n" +http_html ".html" +http_shtml ".shtml" +http_htm ".htm" +http_css ".css" +http_png ".png" +http_gif ".gif" +http_jpg ".jpg" +http_text ".txt" +http_txt ".txt" + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/http-strings.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/http-strings.c new file mode 100644 index 0000000..ef7a41c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/http-strings.c @@ -0,0 +1,102 @@ +const char http_http[8] = +/* "http://" */ +{0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, }; +const char http_200[5] = +/* "200 " */ +{0x32, 0x30, 0x30, 0x20, }; +const char http_301[5] = +/* "301 " */ +{0x33, 0x30, 0x31, 0x20, }; +const char http_302[5] = +/* "302 " */ +{0x33, 0x30, 0x32, 0x20, }; +const char http_get[5] = +/* "GET " */ +{0x47, 0x45, 0x54, 0x20, }; +const char http_10[9] = +/* "HTTP/1.0" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, }; +const char http_11[9] = +/* "HTTP/1.1" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, }; +const char http_content_type[15] = +/* "content-type: " */ +{0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, }; +const char http_texthtml[10] = +/* "text/html" */ +{0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_location[11] = +/* "location: " */ +{0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, }; +const char http_host[7] = +/* "host: " */ +{0x68, 0x6f, 0x73, 0x74, 0x3a, 0x20, }; +const char http_crnl[3] = +/* "\r\n" */ +{0xd, 0xa, }; +const char http_index_html[12] = +/* "/index.html" */ +{0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_404_html[10] = +/* "/404.html" */ +{0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_referer[9] = +/* "Referer:" */ +{0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x3a, }; +const char http_header_200[84] = +/* "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_header_404[91] = +/* "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x34, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_content_type_plain[29] = +/* "Content-type: text/plain\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_html[28] = +/* "Content-type: text/html\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_css [27] = +/* "Content-type: text/css\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_text[28] = +/* "Content-type: text/text\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x78, 0x74, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_png [28] = +/* "Content-type: image/png\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_gif [28] = +/* "Content-type: image/gif\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_jpg [29] = +/* "Content-type: image/jpeg\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x65, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_binary[43] = +/* "Content-type: application/octet-stream\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0xd, 0xa, }; +const char http_html[6] = +/* ".html" */ +{0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_shtml[7] = +/* ".shtml" */ +{0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_htm[5] = +/* ".htm" */ +{0x2e, 0x68, 0x74, 0x6d, }; +const char http_css[5] = +/* ".css" */ +{0x2e, 0x63, 0x73, 0x73, }; +const char http_png[5] = +/* ".png" */ +{0x2e, 0x70, 0x6e, 0x67, }; +const char http_gif[5] = +/* ".gif" */ +{0x2e, 0x67, 0x69, 0x66, }; +const char http_jpg[5] = +/* ".jpg" */ +{0x2e, 0x6a, 0x70, 0x67, }; +const char http_text[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; +const char http_txt[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/http-strings.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/http-strings.h new file mode 100644 index 0000000..acbe7e1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/http-strings.h @@ -0,0 +1,34 @@ +extern const char http_http[8]; +extern const char http_200[5]; +extern const char http_301[5]; +extern const char http_302[5]; +extern const char http_get[5]; +extern const char http_10[9]; +extern const char http_11[9]; +extern const char http_content_type[15]; +extern const char http_texthtml[10]; +extern const char http_location[11]; +extern const char http_host[7]; +extern const char http_crnl[3]; +extern const char http_index_html[12]; +extern const char http_404_html[10]; +extern const char http_referer[9]; +extern const char http_header_200[84]; +extern const char http_header_404[91]; +extern const char http_content_type_plain[29]; +extern const char http_content_type_html[28]; +extern const char http_content_type_css [27]; +extern const char http_content_type_text[28]; +extern const char http_content_type_png [28]; +extern const char http_content_type_gif [28]; +extern const char http_content_type_jpg [29]; +extern const char http_content_type_binary[43]; +extern const char http_html[6]; +extern const char http_shtml[7]; +extern const char http_htm[5]; +extern const char http_css[5]; +extern const char http_png[5]; +extern const char http_gif[5]; +extern const char http_jpg[5]; +extern const char http_text[5]; +extern const char http_txt[5]; diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-cgi.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-cgi.c new file mode 100644 index 0000000..1bf08e2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-cgi.c @@ -0,0 +1,293 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface + * \author + * Adam Dunkels + * + */ + +/* + * Copyright (c) 2001-2006, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $ + * + */ + +#include "uip.h" +#include "psock.h" +#include "httpd.h" +#include "httpd-cgi.h" +#include "httpd-fs.h" + +#include +#include + +HTTPD_CGI_CALL(file, "file-stats", file_stats); +HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats); +HTTPD_CGI_CALL(net, "net-stats", net_stats); +HTTPD_CGI_CALL(rtos, "rtos-stats", rtos_stats ); +HTTPD_CGI_CALL(run, "run-time", run_time ); +HTTPD_CGI_CALL(io, "led-io", led_io ); + + +static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, &rtos, &run, &io, NULL }; + +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(nullfunction(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +httpd_cgifunction +httpd_cgi(char *name) +{ + const struct httpd_cgi_call **f; + + /* Find the matching name in the table, return the function. */ + for(f = calls; *f != NULL; ++f) { + if(strncmp((*f)->name, name, strlen((*f)->name)) == 0) { + return (*f)->function; + } + } + return nullfunction; +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_file_stats(void *arg) +{ + char *f = (char *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f)); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(file_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, strchr(ptr, ' ') + 1); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static const char closed[] = /* "CLOSED",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0}; +static const char syn_rcvd[] = /* "SYN-RCVD",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56, + 0x44, 0}; +static const char syn_sent[] = /* "SYN-SENT",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e, + 0x54, 0}; +static const char established[] = /* "ESTABLISHED",*/ +{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, + 0x45, 0x44, 0}; +static const char fin_wait_1[] = /* "FIN-WAIT-1",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x31, 0}; +static const char fin_wait_2[] = /* "FIN-WAIT-2",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x32, 0}; +static const char closing[] = /* "CLOSING",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x49, + 0x4e, 0x47, 0}; +static const char time_wait[] = /* "TIME-WAIT,"*/ +{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41, + 0x49, 0x54, 0}; +static const char last_ack[] = /* "LAST-ACK"*/ +{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43, + 0x4b, 0}; + +static const char *states[] = { + closed, + syn_rcvd, + syn_sent, + established, + fin_wait_1, + fin_wait_2, + closing, + time_wait, + last_ack}; + + +static unsigned short +generate_tcp_stats(void *arg) +{ + struct uip_conn *conn; + struct httpd_state *s = (struct httpd_state *)arg; + + conn = &uip_conns[s->count]; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "\r\n", + htons(conn->lport), + htons(conn->ripaddr[0]) >> 8, + htons(conn->ripaddr[0]) & 0xff, + htons(conn->ripaddr[1]) >> 8, + htons(conn->ripaddr[1]) & 0xff, + htons(conn->rport), + states[conn->tcpstateflags & UIP_TS_MASK], + conn->nrtx, + conn->timer, + (uip_outstanding(conn))? '*':' ', + (uip_stopped(conn))? '!':' '); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr)) +{ + + PSOCK_BEGIN(&s->sout); + + for(s->count = 0; s->count < UIP_CONNS; ++s->count) { + if((uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) { + PSOCK_GENERATOR_SEND(&s->sout, generate_tcp_stats, s); + } + } + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_net_stats(void *arg) +{ + struct httpd_state *s = (struct httpd_state *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "%5u\n", ((uip_stats_t *)&uip_stat)[s->count]); +} + +static +PT_THREAD(net_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + +#if UIP_STATISTICS + + for(s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t); + ++s->count) { + PSOCK_GENERATOR_SEND(&s->sout, generate_net_stats, s); + } + +#endif /* UIP_STATISTICS */ + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +extern void vTaskList( signed char *pcWriteBuffer ); +static char cCountBuf[ 32 ]; +long lRefreshCount = 0; +static unsigned short +generate_rtos_stats(void *arg) +{ + lRefreshCount++; + sprintf( cCountBuf, "


Refresh count = %d", lRefreshCount ); + vTaskList( uip_appdata ); + strcat( uip_appdata, cCountBuf ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + + +static +PT_THREAD(rtos_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_rtos_stats, NULL); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +char *pcStatus; +extern unsigned long uxParTestGetLED( unsigned long uxLED ); + +static unsigned short generate_io_state( void *arg ) +{ + if( uxParTestGetLED( 0 ) ) + { + pcStatus = "checked"; + } + else + { + pcStatus = ""; + } + + sprintf( uip_appdata, + "LED"\ + "

"\ + "", + pcStatus ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + +extern void vTaskGetRunTimeStats( signed char *pcWriteBuffer ); +static unsigned short +generate_runtime_stats(void *arg) +{ + lRefreshCount++; + sprintf( cCountBuf, "


Refresh count = %d", lRefreshCount ); + vTaskGetRunTimeStats( uip_appdata ); + strcat( uip_appdata, cCountBuf ); + + return strlen( uip_appdata ); +} +/*---------------------------------------------------------------------------*/ + + +static +PT_THREAD(run_time(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_runtime_stats, NULL); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ + +static PT_THREAD(led_io(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_GENERATOR_SEND(&s->sout, generate_io_state, NULL); + PSOCK_END(&s->sout); +} + +/** @} */ + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-cgi.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-cgi.h new file mode 100644 index 0000000..7ae9283 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-cgi.h @@ -0,0 +1,84 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface header file + * \author + * Adam Dunkels + * + */ + + + +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_CGI_H__ +#define __HTTPD_CGI_H__ + +#include "psock.h" +#include "httpd.h" + +typedef PT_THREAD((* httpd_cgifunction)(struct httpd_state *, char *)); + +httpd_cgifunction httpd_cgi(char *name); + +struct httpd_cgi_call { + const char *name; + const httpd_cgifunction function; +}; + +/** + * \brief HTTPD CGI function declaration + * \param name The C variable name of the function + * \param str The string name of the function, used in the script file + * \param function A pointer to the function that implements it + * + * This macro is used for declaring a HTTPD CGI + * function. This function is then added to the list of + * HTTPD CGI functions with the httpd_cgi_add() function. + * + * \hideinitializer + */ +#define HTTPD_CGI_CALL(name, str, function) \ +static PT_THREAD(function(struct httpd_state *, char *)); \ +static const struct httpd_cgi_call name = {str, function} + +void httpd_cgi_init(void); +#endif /* __HTTPD_CGI_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs.c new file mode 100644 index 0000000..dc4aef0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.c,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ + +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-fsdata.h" + +#ifndef NULL +#define NULL 0 +#endif /* NULL */ + +#include "httpd-fsdata.c" + +#if HTTPD_FS_STATISTICS +static u16_t count[HTTPD_FS_NUMFILES]; +#endif /* HTTPD_FS_STATISTICS */ + +/*-----------------------------------------------------------------------------------*/ +static u8_t +httpd_fs_strcmp(const char *str1, const char *str2) +{ + u8_t i; + i = 0; + loop: + + if(str2[i] == 0 || + str1[i] == '\r' || + str1[i] == '\n') { + return 0; + } + + if(str1[i] != str2[i]) { + return 1; + } + + + ++i; + goto loop; +} +/*-----------------------------------------------------------------------------------*/ +int +httpd_fs_open(const char *name, struct httpd_fs_file *file) +{ +#if HTTPD_FS_STATISTICS + u16_t i = 0; +#endif /* HTTPD_FS_STATISTICS */ + struct httpd_fsdata_file_noconst *f; + + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + file->data = f->data; + file->len = f->len; +#if HTTPD_FS_STATISTICS + ++count[i]; +#endif /* HTTPD_FS_STATISTICS */ + return 1; + } +#if HTTPD_FS_STATISTICS + ++i; +#endif /* HTTPD_FS_STATISTICS */ + + } + return 0; +} +/*-----------------------------------------------------------------------------------*/ +void +httpd_fs_init(void) +{ +#if HTTPD_FS_STATISTICS + u16_t i; + for(i = 0; i < HTTPD_FS_NUMFILES; i++) { + count[i] = 0; + } +#endif /* HTTPD_FS_STATISTICS */ +} +/*-----------------------------------------------------------------------------------*/ +#if HTTPD_FS_STATISTICS +u16_t httpd_fs_count +(char *name) +{ + struct httpd_fsdata_file_noconst *f; + u16_t i; + + i = 0; + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + return count[i]; + } + ++i; + } + return 0; +} +#endif /* HTTPD_FS_STATISTICS */ +/*-----------------------------------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs.h new file mode 100644 index 0000000..b594eea --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FS_H__ +#define __HTTPD_FS_H__ + +#define HTTPD_FS_STATISTICS 1 + +struct httpd_fs_file { + char *data; + int len; +}; + +/* file must be allocated by caller and will be filled in + by the function. */ +int httpd_fs_open(const char *name, struct httpd_fs_file *file); + +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 +u16_t httpd_fs_count(char *name); +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ + +void httpd_fs_init(void); + +#endif /* __HTTPD_FS_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/404.html b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/404.html new file mode 100644 index 0000000..43e7f4c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/404.html @@ -0,0 +1,8 @@ + + +

+

404 - file not found

+

Go here instead.

+
+ + \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/index.html b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/index.html new file mode 100644 index 0000000..4937dc6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/index.html @@ -0,0 +1,13 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Loading index.shtml. Click here if not automatically redirected. + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/index.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/index.shtml new file mode 100644 index 0000000..29d242c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/index.shtml @@ -0,0 +1,20 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Task Stats | Run Time Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Task statistics

+Page will refresh every 2 seconds.

+

Task          State  Priority  Stack	#
************************************************
+%! rtos-stats +
+
+ + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/io.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/io.shtml new file mode 100644 index 0000000..fd0697d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/io.shtml @@ -0,0 +1,28 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Task Stats | Run Time Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+LED and LCD IO
+ +

+ +Use the check box to turn on or off the LED, enter text to display on the OLED display, then click "Update IO". + + +

+
+%! led-io +

+ + +

+ + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/runtime.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/runtime.shtml new file mode 100644 index 0000000..67cae46 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/runtime.shtml @@ -0,0 +1,20 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Task Stats | Run Time Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Run-time statistics

+Page will refresh every 2 seconds.

+

Task            Abs Time      % Time
****************************************
+%! run-time +
+
+ + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/stats.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/stats.shtml new file mode 100644 index 0000000..d95a693 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/stats.shtml @@ -0,0 +1,41 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Task Stats | Run Time Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+

+

Network statistics

+
LocalRemoteStateRetransmissionsTimerFlags
%d%u.%u.%u.%u:%u%s%u%u%c %c
+
+IP           Packets dropped
+             Packets received
+             Packets sent
+IP errors    IP version/header length
+             IP length, high byte
+             IP length, low byte
+             IP fragments
+             Header checksum
+             Wrong protocol
+ICMP	     Packets dropped
+             Packets received
+             Packets sent
+             Type errors
+TCP          Packets dropped
+             Packets received
+             Packets sent
+             Checksum errors
+             Data packets without ACKs
+             Resets
+             Retransmissions
+	     No connection avaliable
+	     Connection attempts to closed ports
+
%! net-stats
+
+ + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/tcp.shtml b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/tcp.shtml new file mode 100644 index 0000000..4105367 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fs/tcp.shtml @@ -0,0 +1,21 @@ + + + + FreeRTOS.org uIP WEB server demo + + + +Task Stats | Run Time Stats | TCP Stats | Connections | FreeRTOS.org Homepage | IO +

+


+
+

Network connections

+

+ + +%! tcp-connections + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fsdata.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fsdata.c new file mode 100644 index 0000000..7348902 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fsdata.c @@ -0,0 +1,557 @@ +static const unsigned char data_404_html[] = { + /* /404.html */ + 0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x3c, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65, 0x22, + 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x68, 0x31, 0x3e, 0x34, 0x30, 0x34, 0x20, 0x2d, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x3c, 0x2f, 0x68, 0x31, 0x3e, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x33, + 0x3e, 0x47, 0x6f, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x68, 0x65, 0x72, 0x65, + 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, + 0x61, 0x64, 0x2e, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, +0}; + +static const unsigned char data_index_html[] = { + /* /index.html */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, + 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 0x57, 0x45, 0x42, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, + 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x42, 0x4f, 0x44, 0x59, 0x20, 0x6f, + 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x3d, 0x22, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x28, 0x26, 0x71, 0x75, 0x6f, 0x74, + 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x27, 0x26, 0x71, + 0x75, 0x6f, 0x74, 0x3b, 0x2c, 0x31, 0x30, 0x30, 0x29, 0x22, + 0x3e, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, + 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x22, + 0x3e, 0xa, 0x4c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x2e, 0x20, 0x20, 0x43, 0x6c, 0x69, 0x63, 0x6b, 0x20, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x68, 0x65, 0x72, 0x65, 0x3c, 0x2f, 0x61, 0x3e, + 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x75, + 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, + 0x79, 0x20, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x2e, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, + 0x3e, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, + 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, + 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0xa, 0}; + +static const unsigned char data_index_shtml[] = { + /* /index.shtml */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, + 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 0x57, 0x45, 0x42, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, + 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x42, 0x4f, 0x44, 0x59, 0x20, 0x6f, + 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x3d, 0x22, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x28, 0x26, 0x71, 0x75, 0x6f, 0x74, + 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x27, 0x26, 0x71, + 0x75, 0x6f, 0x74, 0x3b, 0x2c, 0x32, 0x30, 0x30, 0x30, 0x29, + 0x22, 0x3e, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, + 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 0x6c, + 0x22, 0x3e, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, + 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, + 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x52, 0x75, 0x6e, 0x20, 0x54, 0x69, 0x6d, + 0x65, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, + 0x2e, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, + 0x6f, 0x72, 0x67, 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, + 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, + 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xa, 0x3c, 0x62, 0x72, + 0x3e, 0x3c, 0x70, 0x3e, 0xa, 0x3c, 0x68, 0x72, 0x3e, 0xa, + 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xa, 0x3c, 0x68, + 0x32, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, + 0x32, 0x3e, 0xa, 0x50, 0x61, 0x67, 0x65, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x32, 0x20, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x3c, 0x70, 0x3e, + 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, + 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, + 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x54, 0x61, 0x73, + 0x6b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x20, 0x50, 0x72, + 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x20, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x9, 0x23, 0x3c, 0x62, 0x72, 0x3e, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x3c, 0x62, 0x72, + 0x3e, 0xa, 0x25, 0x21, 0x20, 0x72, 0x74, 0x6f, 0x73, 0x2d, + 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0x3c, 0x2f, 0x70, 0x72, + 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, + 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, 0x3c, 0x2f, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3e, 0xa, 0xa, 0}; + +static const unsigned char data_io_shtml[] = { + /* /io.shtml */ + 0x2f, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, + 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 0x57, 0x45, 0x42, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, + 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x42, 0x4f, 0x44, 0x59, 0x3e, 0xa, + 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, + 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x3e, 0xa, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x52, 0x75, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x66, 0x72, + 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, 0x6f, 0x6d, 0x65, + 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6f, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x49, 0x4f, 0x3c, + 0x2f, 0x61, 0x3e, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, + 0x3e, 0xa, 0x3c, 0x68, 0x72, 0x3e, 0xa, 0x3c, 0x62, 0x3e, + 0x4c, 0x45, 0x44, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x4c, 0x43, + 0x44, 0x20, 0x49, 0x4f, 0x3c, 0x2f, 0x62, 0x3e, 0x3c, 0x62, + 0x72, 0x3e, 0xa, 0xa, 0x3c, 0x70, 0x3e, 0xa, 0xa, 0x55, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x20, 0x62, 0x6f, 0x78, 0x20, 0x74, 0x6f, 0x20, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6f, 0x6e, 0x20, 0x6f, 0x72, + 0x20, 0x6f, 0x66, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, + 0x45, 0x44, 0x2c, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, + 0x74, 0x65, 0x78, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x20, 0x6f, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x4f, 0x4c, 0x45, 0x44, 0x20, 0x64, 0x69, + 0x73, 0x70, 0x6c, 0x61, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x65, + 0x6e, 0x20, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x20, 0x22, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x49, 0x4f, 0x22, 0x2e, + 0xa, 0xa, 0xa, 0x3c, 0x70, 0x3e, 0xa, 0x3c, 0x66, 0x6f, + 0x72, 0x6d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x61, + 0x46, 0x6f, 0x72, 0x6d, 0x22, 0x20, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x3d, 0x22, 0x2f, 0x69, 0x6f, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x20, 0x6d, 0x65, 0x74, 0x68, 0x6f, + 0x64, 0x3d, 0x22, 0x67, 0x65, 0x74, 0x22, 0x3e, 0xa, 0x25, + 0x21, 0x20, 0x6c, 0x65, 0x64, 0x2d, 0x69, 0x6f, 0xa, 0x3c, + 0x70, 0x3e, 0xa, 0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, + 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x49, 0x4f, + 0x22, 0x3e, 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, + 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xa, 0x3c, + 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, 0x3c, 0x2f, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, + 0x6c, 0x3e, 0xa, 0xa, 0}; + +static const unsigned char data_runtime_shtml[] = { + /* /runtime.shtml */ + 0x2f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, + 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 0x57, 0x45, 0x42, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, + 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x42, 0x4f, 0x44, 0x59, 0x20, 0x6f, + 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x3d, 0x22, 0x77, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x2e, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x28, 0x26, 0x71, 0x75, 0x6f, 0x74, + 0x3b, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x27, 0x72, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x27, + 0x26, 0x71, 0x75, 0x6f, 0x74, 0x3b, 0x2c, 0x32, 0x30, 0x30, + 0x30, 0x29, 0x22, 0x3e, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, + 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x61, 0x72, 0x69, + 0x61, 0x6c, 0x22, 0x3e, 0xa, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x54, 0x61, 0x73, + 0x6b, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, + 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, + 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, + 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x52, 0x75, 0x6e, 0x20, 0x54, + 0x69, 0x6d, 0x65, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x54, 0x43, 0x50, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, + 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, + 0x77, 0x77, 0x2e, 0x66, 0x72, 0x65, 0x65, 0x72, 0x74, 0x6f, + 0x73, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x22, 0x3e, 0x46, 0x72, + 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, 0x72, 0x67, + 0x20, 0x48, 0x6f, 0x6d, 0x65, 0x70, 0x61, 0x67, 0x65, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x69, 0x6f, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x49, 0x4f, 0x3c, 0x2f, 0x61, 0x3e, 0xa, 0x3c, + 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xa, 0x3c, 0x68, 0x72, + 0x3e, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, 0x3e, 0xa, + 0x3c, 0x68, 0x32, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x3c, + 0x2f, 0x68, 0x32, 0x3e, 0xa, 0x50, 0x61, 0x67, 0x65, 0x20, + 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x20, 0x65, 0x76, 0x65, 0x72, 0x79, 0x20, 0x32, + 0x20, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x2e, 0x3c, + 0x70, 0x3e, 0xa, 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, + 0x61, 0x63, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x75, 0x72, 0x69, + 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x54, + 0x61, 0x73, 0x6b, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x41, 0x62, 0x73, 0x20, 0x54, + 0x69, 0x6d, 0x65, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x25, + 0x20, 0x54, 0x69, 0x6d, 0x65, 0x3c, 0x62, 0x72, 0x3e, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x3c, + 0x62, 0x72, 0x3e, 0xa, 0x25, 0x21, 0x20, 0x72, 0x75, 0x6e, + 0x2d, 0x74, 0x69, 0x6d, 0x65, 0xa, 0x3c, 0x2f, 0x70, 0x72, + 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, + 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, 0x3c, 0x2f, + 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74, + 0x6d, 0x6c, 0x3e, 0xa, 0xa, 0}; + +static const unsigned char data_stats_shtml[] = { + /* /stats.shtml */ + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, + 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 0x57, 0x45, 0x42, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, + 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x42, 0x4f, 0x44, 0x59, 0x3e, 0xa, + 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, + 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x3e, 0xa, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x52, 0x75, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x66, 0x72, + 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, 0x6f, 0x6d, 0x65, + 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6f, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x49, 0x4f, 0x3c, + 0x2f, 0x61, 0x3e, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, + 0x3e, 0xa, 0x3c, 0x68, 0x72, 0x3e, 0xa, 0x3c, 0x62, 0x72, + 0x3e, 0x3c, 0x70, 0x3e, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, + 0x32, 0x3e, 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x33, 0x30, 0x30, + 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, 0x22, + 0x30, 0x22, 0x3e, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, + 0x64, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3d, 0x22, 0x6c, + 0x65, 0x66, 0x74, 0x22, 0x3e, 0x3c, 0x66, 0x6f, 0x6e, 0x74, + 0x20, 0x66, 0x61, 0x63, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x75, + 0x72, 0x69, 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x65, + 0x3e, 0xa, 0x49, 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xa, 0x49, 0x50, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, 0x20, 0x20, 0x20, + 0x49, 0x50, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, + 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x68, + 0x69, 0x67, 0x68, 0x20, 0x62, 0x79, 0x74, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x49, 0x50, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x20, 0x6c, 0x6f, 0x77, 0x20, 0x62, 0x79, 0x74, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x57, 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0xa, 0x49, 0x43, 0x4d, 0x50, 0x9, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x54, 0x79, 0x70, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0xa, 0x54, 0x43, 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, + 0x41, 0x43, 0x4b, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, + 0x73, 0x65, 0x74, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4e, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, 0x61, 0x6c, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x20, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0xa, 0x3c, 0x2f, 0x70, 0x72, + 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0x3c, + 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x70, + 0x72, 0x65, 0x3e, 0x25, 0x21, 0x20, 0x6e, 0x65, 0x74, 0x2d, + 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0x3c, 0x2f, 0x70, 0x72, + 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3e, + 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, 0x3c, + 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, + 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0}; + +static const unsigned char data_tcp_shtml[] = { + /* /tcp.shtml */ + 0x2f, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, 0x53, 0x2e, 0x6f, + 0x72, 0x67, 0x20, 0x75, 0x49, 0x50, 0x20, 0x57, 0x45, 0x42, + 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x64, 0x65, + 0x6d, 0x6f, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x42, 0x4f, 0x44, 0x59, 0x3e, 0xa, + 0x3c, 0x66, 0x6f, 0x6e, 0x74, 0x20, 0x66, 0x61, 0x63, 0x65, + 0x3d, 0x22, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x3e, 0xa, + 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x22, 0x3e, 0x54, 0x61, 0x73, 0x6b, 0x20, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, + 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, + 0x72, 0x65, 0x66, 0x3d, 0x22, 0x72, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x52, 0x75, 0x6e, 0x20, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x54, 0x43, 0x50, 0x20, 0x53, 0x74, 0x61, 0x74, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x20, 0x3c, 0x62, 0x3e, 0x7c, 0x3c, 0x2f, + 0x62, 0x3e, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, + 0x6c, 0x22, 0x3e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, + 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x66, 0x72, + 0x65, 0x65, 0x72, 0x74, 0x6f, 0x73, 0x2e, 0x6f, 0x72, 0x67, + 0x2f, 0x22, 0x3e, 0x46, 0x72, 0x65, 0x65, 0x52, 0x54, 0x4f, + 0x53, 0x2e, 0x6f, 0x72, 0x67, 0x20, 0x48, 0x6f, 0x6d, 0x65, + 0x70, 0x61, 0x67, 0x65, 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x3c, + 0x62, 0x3e, 0x7c, 0x3c, 0x2f, 0x62, 0x3e, 0x20, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x69, 0x6f, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x49, 0x4f, 0x3c, + 0x2f, 0x61, 0x3e, 0xa, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x70, + 0x3e, 0xa, 0x3c, 0x68, 0x72, 0x3e, 0xa, 0x3c, 0x62, 0x72, + 0x3e, 0xa, 0x3c, 0x68, 0x32, 0x3e, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x68, 0x32, 0x3e, + 0xa, 0x3c, 0x70, 0x3e, 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x3e, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, + 0x3e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x68, + 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, + 0x3c, 0x74, 0x68, 0x3e, 0x52, 0x65, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, + 0x68, 0x3e, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3c, 0x2f, 0x74, + 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x25, 0x21, + 0x20, 0x74, 0x63, 0x70, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa, 0x3c, 0x2f, 0x70, + 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, + 0xa, 0x3c, 0x2f, 0x66, 0x6f, 0x6e, 0x74, 0x3e, 0xa, 0x3c, + 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, + 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0xa, 0}; + +const struct httpd_fsdata_file file_404_html[] = {{NULL, data_404_html, data_404_html + 10, sizeof(data_404_html) - 10}}; + +const struct httpd_fsdata_file file_index_html[] = {{file_404_html, data_index_html, data_index_html + 12, sizeof(data_index_html) - 12}}; + +const struct httpd_fsdata_file file_index_shtml[] = {{file_index_html, data_index_shtml, data_index_shtml + 13, sizeof(data_index_shtml) - 13}}; + +const struct httpd_fsdata_file file_io_shtml[] = {{file_index_shtml, data_io_shtml, data_io_shtml + 10, sizeof(data_io_shtml) - 10}}; + +const struct httpd_fsdata_file file_runtime_shtml[] = {{file_io_shtml, data_runtime_shtml, data_runtime_shtml + 15, sizeof(data_runtime_shtml) - 15}}; + +const struct httpd_fsdata_file file_stats_shtml[] = {{file_runtime_shtml, data_stats_shtml, data_stats_shtml + 13, sizeof(data_stats_shtml) - 13}}; + +const struct httpd_fsdata_file file_tcp_shtml[] = {{file_stats_shtml, data_tcp_shtml, data_tcp_shtml + 11, sizeof(data_tcp_shtml) - 11}}; + +#define HTTPD_FS_ROOT file_tcp_shtml + +#define HTTPD_FS_NUMFILES 7 diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fsdata.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fsdata.h new file mode 100644 index 0000000..52d35c2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd-fsdata.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fsdata.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FSDATA_H__ +#define __HTTPD_FSDATA_H__ + +#include "uip.h" + +struct httpd_fsdata_file { + const struct httpd_fsdata_file *next; + const char *name; + const char *data; + const int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +struct httpd_fsdata_file_noconst { + struct httpd_fsdata_file *next; + char *name; + char *data; + int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +#endif /* __HTTPD_FSDATA_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd.c new file mode 100644 index 0000000..644cf16 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd.c @@ -0,0 +1,346 @@ +/** + * \addtogroup apps + * @{ + */ + +/** + * \defgroup httpd Web server + * @{ + * The uIP web server is a very simplistic implementation of an HTTP + * server. It can serve web pages and files from a read-only ROM + * filesystem, and provides a very small scripting language. + + */ + +/** + * \file + * Web server + * \author + * Adam Dunkels + */ + + +/* + * Copyright (c) 2004, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd.c,v 1.2 2006/06/11 21:46:38 adam Exp $ + */ + +#include "uip.h" +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-cgi.h" +#include "http-strings.h" + +#include + +#define STATE_WAITING 0 +#define STATE_OUTPUT 1 + +#define ISO_nl 0x0a +#define ISO_space 0x20 +#define ISO_bang 0x21 +#define ISO_percent 0x25 +#define ISO_period 0x2e +#define ISO_slash 0x2f +#define ISO_colon 0x3a + + +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_part_of_file(void *state) +{ + struct httpd_state *s = (struct httpd_state *)state; + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + memcpy(uip_appdata, s->file.data, s->len); + + return s->len; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + do { + PSOCK_GENERATOR_SEND(&s->sout, generate_part_of_file, s); + s->file.len -= s->len; + s->file.data += s->len; + } while(s->file.len > 0); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_part_of_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND(&s->sout, s->file.data, s->len); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static void +next_scriptstate(struct httpd_state *s) +{ + char *p; + p = strchr(s->scriptptr, ISO_nl) + 1; + s->scriptlen -= (unsigned short)(p - s->scriptptr); + s->scriptptr = p; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_script(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->scriptpt); + + + while(s->file.len > 0) { + + /* Check if we should start executing a script. */ + if(*s->file.data == ISO_percent && + *(s->file.data + 1) == ISO_bang) { + s->scriptptr = s->file.data + 3; + s->scriptlen = s->file.len - 3; + if(*(s->scriptptr - 1) == ISO_colon) { + httpd_fs_open(s->scriptptr + 1, &s->file); + PT_WAIT_THREAD(&s->scriptpt, send_file(s)); + } else { + PT_WAIT_THREAD(&s->scriptpt, + httpd_cgi(s->scriptptr)(s, s->scriptptr)); + } + next_scriptstate(s); + + /* The script is over, so we reset the pointers and continue + sending the rest of the file. */ + s->file.data = s->scriptptr; + s->file.len = s->scriptlen; + } else { + /* See if we find the start of script marker in the block of HTML + to be sent. */ + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + + if(*s->file.data == ISO_percent) { + ptr = strchr(s->file.data + 1, ISO_percent); + } else { + ptr = strchr(s->file.data, ISO_percent); + } + if(ptr != NULL && + ptr != s->file.data) { + s->len = (int)(ptr - s->file.data); + if(s->len >= uip_mss()) { + s->len = uip_mss(); + } + } + PT_WAIT_THREAD(&s->scriptpt, send_part_of_file(s)); + s->file.data += s->len; + s->file.len -= s->len; + + } + } + + PT_END(&s->scriptpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_headers(struct httpd_state *s, const char *statushdr)) +{ + char *ptr; + + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND_STR(&s->sout, statushdr); + + ptr = strrchr(s->filename, ISO_period); + if(ptr == NULL) { + PSOCK_SEND_STR(&s->sout, http_content_type_binary); + } else if(strncmp(http_html, ptr, 5) == 0 || + strncmp(http_shtml, ptr, 6) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_html); + } else if(strncmp(http_css, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_css); + } else if(strncmp(http_png, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_png); + } else if(strncmp(http_gif, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_gif); + } else if(strncmp(http_jpg, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_jpg); + } else { + PSOCK_SEND_STR(&s->sout, http_content_type_plain); + } + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_output(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->outputpt); + + if(!httpd_fs_open(s->filename, &s->file)) { + httpd_fs_open(http_404_html, &s->file); + strcpy(s->filename, http_404_html); + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_404)); + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_200)); + ptr = strchr(s->filename, ISO_period); + if(ptr != NULL && strncmp(ptr, http_shtml, 6) == 0) { + PT_INIT(&s->scriptpt); + PT_WAIT_THREAD(&s->outputpt, handle_script(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } + } + PSOCK_CLOSE(&s->sout); + PT_END(&s->outputpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_input(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sin); + + PSOCK_READTO(&s->sin, ISO_space); + + + if(strncmp(s->inputbuf, http_get, 4) != 0) { + PSOCK_CLOSE_EXIT(&s->sin); + } + PSOCK_READTO(&s->sin, ISO_space); + + if(s->inputbuf[0] != ISO_slash) { + PSOCK_CLOSE_EXIT(&s->sin); + } + + if(s->inputbuf[1] == ISO_space) { + strncpy(s->filename, http_index_html, sizeof(s->filename)); + } else { + + s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; + + /* Process any form input being sent to the server. */ + { + extern void vApplicationProcessFormInput( char *pcInputString, long xInputLength ); + vApplicationProcessFormInput( s->inputbuf, PSOCK_DATALEN(&s->sin) ); + } + + strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); + } + + /* httpd_log_file(uip_conn->ripaddr, s->filename);*/ + + s->state = STATE_OUTPUT; + + while(1) { + PSOCK_READTO(&s->sin, ISO_nl); + + if(strncmp(s->inputbuf, http_referer, 8) == 0) { + s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0; + /* httpd_log(&s->inputbuf[9]);*/ + } + } + + PSOCK_END(&s->sin); +} +/*---------------------------------------------------------------------------*/ +static void +handle_connection(struct httpd_state *s) +{ + handle_input(s); + if(s->state == STATE_OUTPUT) { + handle_output(s); + } +} +/*---------------------------------------------------------------------------*/ +void +httpd_appcall(void) +{ + struct httpd_state *s = (struct httpd_state *)&(uip_conn->appstate); + + if(uip_closed() || uip_aborted() || uip_timedout()) { + } else if(uip_connected()) { + PSOCK_INIT(&s->sin, s->inputbuf, sizeof(s->inputbuf) - 1); + PSOCK_INIT(&s->sout, s->inputbuf, sizeof(s->inputbuf) - 1); + PT_INIT(&s->outputpt); + s->state = STATE_WAITING; + /* timer_set(&s->timer, CLOCK_SECOND * 100);*/ + s->timer = 0; + handle_connection(s); + } else if(s != NULL) { + if(uip_poll()) { + ++s->timer; + if(s->timer >= 20) { + uip_abort(); + } + } else { + s->timer = 0; + } + handle_connection(s); + } else { + uip_abort(); + } +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Initialize the web server + * + * This function initializes the web server and should be + * called at system boot-up. + */ +void +httpd_init(void) +{ + uip_listen(HTONS(80)); +} +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd.h new file mode 100644 index 0000000..7f7a666 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/httpd.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2001-2005, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_H__ +#define __HTTPD_H__ + +#include "psock.h" +#include "httpd-fs.h" + +struct httpd_state { + unsigned char timer; + struct psock sin, sout; + struct pt outputpt, scriptpt; + char inputbuf[50]; + char filename[20]; + char state; + struct httpd_fs_file file; + int len; + char *scriptptr; + int scriptlen; + + unsigned short count; +}; + +void httpd_init(void); +void httpd_appcall(void); + +void httpd_log(char *msg); +void httpd_log_file(u16_t *requester, char *file); + +#endif /* __HTTPD_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/makefsdata b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/makefsdata new file mode 100644 index 0000000..8d2715a --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/makefsdata @@ -0,0 +1,78 @@ +#!/usr/bin/perl + +open(OUTPUT, "> httpd-fsdata.c"); + +chdir("httpd-fs"); + +opendir(DIR, "."); +@files = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); +closedir(DIR); + +foreach $file (@files) { + + if(-d $file && $file !~ /^\./) { + print "Processing directory $file\n"; + opendir(DIR, $file); + @newfiles = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); + closedir(DIR); + printf "Adding files @newfiles\n"; + @files = (@files, map { $_ = "$file/$_" } @newfiles); + next; + } +} + +foreach $file (@files) { + if(-f $file) { + + print "Adding file $file\n"; + + open(FILE, $file) || die "Could not open file $file\n"; + + $file =~ s-^-/-; + $fvar = $file; + $fvar =~ s-/-_-g; + $fvar =~ s-\.-_-g; + # for AVR, add PROGMEM here + print(OUTPUT "static const unsigned char data".$fvar."[] = {\n"); + print(OUTPUT "\t/* $file */\n\t"); + for($j = 0; $j < length($file); $j++) { + printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1))); + } + printf(OUTPUT "0,\n"); + + + $i = 0; + while(read(FILE, $data, 1)) { + if($i == 0) { + print(OUTPUT "\t"); + } + printf(OUTPUT "%#02x, ", unpack("C", $data)); + $i++; + if($i == 10) { + print(OUTPUT "\n"); + $i = 0; + } + } + print(OUTPUT "0};\n\n"); + close(FILE); + push(@fvars, $fvar); + push(@pfiles, $file); + } +} + +for($i = 0; $i < @fvars; $i++) { + $file = $pfiles[$i]; + $fvar = $fvars[$i]; + + if($i == 0) { + $prevfile = "NULL"; + } else { + $prevfile = "file" . $fvars[$i - 1]; + } + print(OUTPUT "const struct httpd_fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, "); + print(OUTPUT "data$fvar + ". (length($file) + 1) .", "); + print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n"); +} + +print(OUTPUT "#define HTTPD_FS_ROOT file$fvars[$i - 1]\n\n"); +print(OUTPUT "#define HTTPD_FS_NUMFILES $i\n"); diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/makestrings b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/makestrings new file mode 100644 index 0000000..8a13c6d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/makestrings @@ -0,0 +1,40 @@ +#!/usr/bin/perl + + +sub stringify { + my $name = shift(@_); + open(OUTPUTC, "> $name.c"); + open(OUTPUTH, "> $name.h"); + + open(FILE, "$name"); + + while() { + if(/(.+) "(.+)"/) { + $var = $1; + $data = $2; + + $datan = $data; + $datan =~ s/\\r/\r/g; + $datan =~ s/\\n/\n/g; + $datan =~ s/\\01/\01/g; + $datan =~ s/\\0/\0/g; + + printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1); + printf(OUTPUTC "/* \"$data\" */\n"); + printf(OUTPUTC "{"); + for($j = 0; $j < length($datan); $j++) { + printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1))); + } + printf(OUTPUTC "};\n"); + + printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1); + + } + } + close(OUTPUTC); + close(OUTPUTH); +} +stringify("http-strings"); + +exit 0; + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/uIP_Task.c b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/uIP_Task.c new file mode 100644 index 0000000..366e9c2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/uIP_Task.c @@ -0,0 +1,349 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ +/* Standard includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +#include "lcd_message.h" + +/* uip includes. */ +#include "hw_types.h" + +#include "uip.h" +#include "uip_arp.h" +#include "httpd.h" +#include "timer.h" +#include "clock-arch.h" +#include "hw_ethernet.h" +#include "ethernet.h" +#include "hw_memmap.h" +#include "lmi_flash.h" +#include "sysctl.h" + +/* Demo includes. */ +#include "emac.h" +#include "partest.h" + +/*-----------------------------------------------------------*/ + +/* IP address configuration. */ +#define uipIP_ADDR0 192 +#define uipIP_ADDR1 168 +#define uipIP_ADDR2 0 +#define uipIP_ADDR3 201 + +/* Netmask configuration. */ +#define uipNETMASK_0 255 +#define uipNETMASK_1 255 +#define uipNETMASK_2 255 +#define uipNETMASK_3 0 + +/* How long to wait before attempting to connect the MAC again. */ +#define uipINIT_WAIT 100 + +/* Shortcut to the header within the Rx buffer. */ +#define xHeader ((struct uip_eth_hdr *) &uip_buf[ 0 ]) + +/* Standard constant. */ +#define uipTOTAL_FRAME_HEADER_SIZE 54 + +/*-----------------------------------------------------------*/ + +/* + * Send the uIP buffer to the MAC. + */ +static void prvENET_Send(void); + +/* + * Setup the MAC address in the MAC itself, and in the uIP stack. + */ +static void prvSetMACAddress( void ); + +/* + * Port functions required by the uIP stack. + */ +void clock_init( void ); +clock_time_t clock_time( void ); + +/*-----------------------------------------------------------*/ + +/* The semaphore used by the ISR to wake the uIP task. */ +extern xSemaphoreHandle xEMACSemaphore; + +/*-----------------------------------------------------------*/ + +void clock_init(void) +{ + /* This is done when the scheduler starts. */ +} +/*-----------------------------------------------------------*/ + +clock_time_t clock_time( void ) +{ + return xTaskGetTickCount(); +} + + +void vuIP_Task( void *pvParameters ) +{ +portBASE_TYPE i; +uip_ipaddr_t xIPAddr; +struct timer periodic_timer, arp_timer; +extern void ( vEMAC_ISR )( void ); + + /* Enable/Reset the Ethernet Controller */ + SysCtlPeripheralEnable( SYSCTL_PERIPH_ETH ); + SysCtlPeripheralReset( SYSCTL_PERIPH_ETH ); + + /* Create the semaphore used by the ISR to wake this task. */ + vSemaphoreCreateBinary( xEMACSemaphore ); + + /* Initialise the uIP stack. */ + timer_set( &periodic_timer, configTICK_RATE_HZ / 2 ); + timer_set( &arp_timer, configTICK_RATE_HZ * 10 ); + uip_init(); + uip_ipaddr( xIPAddr, uipIP_ADDR0, uipIP_ADDR1, uipIP_ADDR2, uipIP_ADDR3 ); + uip_sethostaddr( xIPAddr ); + uip_ipaddr( xIPAddr, uipNETMASK_0, uipNETMASK_1, uipNETMASK_2, uipNETMASK_3 ); + uip_setnetmask( xIPAddr ); + httpd_init(); + + while( vInitEMAC() != pdPASS ) + { + vTaskDelay( uipINIT_WAIT ); + } + prvSetMACAddress(); + + + for( ;; ) + { + /* Is there received data ready to be processed? */ + uip_len = uiGetEMACRxData( uip_buf ); + + if( uip_len > 0 ) + { + /* Standard uIP loop taken from the uIP manual. */ + + if( xHeader->type == htons( UIP_ETHTYPE_IP ) ) + { + uip_arp_ipin(); + uip_input(); + + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if( uip_len > 0 ) + { + uip_arp_out(); + prvENET_Send(); + } + } + else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) ) + { + uip_arp_arpin(); + + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if( uip_len > 0 ) + { + prvENET_Send(); + } + } + } + else + { + if( timer_expired( &periodic_timer ) ) + { + timer_reset( &periodic_timer ); + for( i = 0; i < UIP_CONNS; i++ ) + { + uip_periodic( i ); + + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if( uip_len > 0 ) + { + uip_arp_out(); + prvENET_Send(); + } + } + + /* Call the ARP timer function every 10 seconds. */ + if( timer_expired( &arp_timer ) ) + { + timer_reset( &arp_timer ); + uip_arp_timer(); + } + } + else + { + /* We did not receive a packet, and there was no periodic + processing to perform. Block for a fixed period. If a packet + is received during this period we will be woken by the ISR + giving us the Semaphore. */ + xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 2 ); + } + } + } +} +/*-----------------------------------------------------------*/ + +static void prvENET_Send(void) +{ + vInitialiseSend(); + vIncrementTxLength( uip_len ); + vSendBufferToMAC(); + vInitialiseSend(); + vIncrementTxLength( uip_len ); + vSendBufferToMAC(); +} +/*-----------------------------------------------------------*/ + +static void prvSetMACAddress( void ) +{ +unsigned long ulUser0, ulUser1; +unsigned char pucMACArray[8]; +struct uip_eth_addr xAddr; + + /* Get the device MAC address from flash */ + FlashUserGet(&ulUser0, &ulUser1); + + /* Convert the MAC address from flash into sequence of bytes. */ + pucMACArray[0] = ((ulUser0 >> 0) & 0xff); + pucMACArray[1] = ((ulUser0 >> 8) & 0xff); + pucMACArray[2] = ((ulUser0 >> 16) & 0xff); + pucMACArray[3] = ((ulUser1 >> 0) & 0xff); + pucMACArray[4] = ((ulUser1 >> 8) & 0xff); + pucMACArray[5] = ((ulUser1 >> 16) & 0xff); + + /* Program the MAC address. */ + EthernetMACAddrSet(ETH_BASE, pucMACArray); + + xAddr.addr[ 0 ] = pucMACArray[0]; + xAddr.addr[ 1 ] = pucMACArray[1]; + xAddr.addr[ 2 ] = pucMACArray[2]; + xAddr.addr[ 3 ] = pucMACArray[3]; + xAddr.addr[ 4 ] = pucMACArray[4]; + xAddr.addr[ 5 ] = pucMACArray[5]; + uip_setethaddr( xAddr ); +} +/*-----------------------------------------------------------*/ + +void vApplicationProcessFormInput( char *pcInputString, portBASE_TYPE xInputLength ) +{ +char *c, *pcText; +static char cMessageForDisplay[ 32 ]; +extern xQueueHandle xOLEDQueue; +xOLEDMessage xOLEDMessage; + + /* Process the form input sent by the IO page of the served HTML. */ + + c = strstr( pcInputString, "?" ); + + if( c ) + { + /* Turn LED's on or off in accordance with the check box status. */ + if( strstr( c, "LED0=1" ) != NULL ) + { + vParTestSetLED( 0, 1 ); + } + else + { + vParTestSetLED( 0, 0 ); + } + + /* Find the start of the text to be displayed on the LCD. */ + pcText = strstr( c, "LCD=" ); + pcText += strlen( "LCD=" ); + + /* Terminate the file name for further processing within uIP. */ + *c = 0x00; + + /* Terminate the LCD string. */ + c = strstr( pcText, " " ); + if( c != NULL ) + { + *c = 0x00; + } + + /* Add required spaces. */ + while( ( c = strstr( pcText, "+" ) ) != NULL ) + { + *c = ' '; + } + + /* Write the message to the LCD. */ + strcpy( cMessageForDisplay, pcText ); + xOLEDMessage.pcMessage = cMessageForDisplay; + xQueueSend( xOLEDQueue, &xOLEDMessage, portMAX_DELAY ); + } +} + diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/uip-conf.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/uip-conf.h new file mode 100644 index 0000000..664077d --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/uip-conf.h @@ -0,0 +1,159 @@ +/** + * \addtogroup uipopt + * @{ + */ + +/** + * \name Project-specific configuration options + * @{ + * + * uIP has a number of configuration options that can be overridden + * for each project. These are kept in a project-specific uip-conf.h + * file and all configuration names have the prefix UIP_CONF. + */ + +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * An example uIP configuration file + * \author + * Adam Dunkels + */ + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + +#include + +/** + * 8 bit datatype + * + * This typedef defines the 8-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint8_t u8_t; + +/** + * 16 bit datatype + * + * This typedef defines the 16-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint16_t u16_t; + +/** + * Statistics datatype + * + * This typedef defines the dataype used for keeping statistics in + * uIP. + * + * \hideinitializer + */ +typedef unsigned short uip_stats_t; + +/** + * Maximum number of TCP connections. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_CONNECTIONS 40 + +/** + * Maximum number of listening TCP ports. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_LISTENPORTS 40 + +/** + * uIP buffer size. + * + * \hideinitializer + */ +#define UIP_CONF_BUFFER_SIZE 1500 + +/** + * CPU byte order. + * + * \hideinitializer + */ +#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN + +/** + * Logging on or off + * + * \hideinitializer + */ +#define UIP_CONF_LOGGING 0 + +/** + * UDP support on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP 0 + +/** + * UDP checksums on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP_CHECKSUMS 1 + +/** + * uIP statistics on or off + * + * \hideinitializer + */ +#define UIP_CONF_STATISTICS 1 + +/* Here we include the header file for the application(s) we use in + our project. */ +/*#include "smtp.h"*/ +/*#include "hello-world.h"*/ +/*#include "telnetd.h"*/ +#include "webserver.h" +/*#include "dhcpc.h"*/ +/*#include "resolv.h"*/ +/*#include "webclient.h"*/ + +#define UIP_CONF_EXTERNAL_BUFFER + +#endif /* __UIP_CONF_H__ */ + +/** @} */ +/** @} */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/webserver.h b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/webserver.h new file mode 100644 index 0000000..1acb290 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_LM3Sxxxx_Rowley/webserver/webserver.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: webserver.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ +#ifndef __WEBSERVER_H__ +#define __WEBSERVER_H__ + +#include "httpd.h" + +typedef struct httpd_state uip_tcp_appstate_t; +/* UIP_APPCALL: the name of the application function. This function + must return void and take no arguments (i.e., C type "void + appfunc(void)"). */ +#ifndef UIP_APPCALL +#define UIP_APPCALL httpd_appcall +#endif + + +#endif /* __WEBSERVER_H__ */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/FreeRTOSConfig.h new file mode 100644 index 0000000..51898d3 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/FreeRTOSConfig.h @@ -0,0 +1,127 @@ +/* + FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong? * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, training, latest information, + license and contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool. + + Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell + the code with commercial support, indemnification, and middleware, under + the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also + provide a safety engineered and independently SIL3 certified version under + the SafeRTOS brand: http://www.SafeRTOS.com. +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 1 +#define configCPU_CLOCK_HZ ( ( unsigned long ) 50000000 ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 100 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 2560 ) ) +#define configMAX_TASK_NAME_LEN ( 12 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 0 +#define configUSE_COUNTING_SEMAPHORES 0 +#define configCHECK_FOR_STACK_OVERFLOW 0 +#define configUSE_RECURSIVE_MUTEXES 0 +#define configQUEUE_REGISTRY_SIZE 0 +#define configGENERATE_RUN_TIME_STATS 0 +#define configUSE_MALLOC_FAILED_HOOK 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 0 +#define INCLUDE_uxTaskPriorityGet 0 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 0 +#define INCLUDE_vTaskDelayUntil 0 +#define INCLUDE_vTaskDelay 0 +#define INCLUDE_uxTaskGetStackHighWaterMark 0 + +#ifdef __NVIC_PRIO_BITS + #define configPRIO_BITS __NVIC_PRIO_BITS +#else + #define configPRIO_BITS 3 +#endif +#define configUNUSED_PRIO_BITS ( ( unsigned char ) ( 8 - configPRIO_BITS ) ) + +#define configKERNEL_INTERRUPT_PRIORITY ( ( unsigned char ) 7 << configUNUSED_PRIO_BITS ) /* Priority 7, or 255 as only the top three bits are implemented. This is the lowest priority. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( ( unsigned char ) 5 << configUNUSED_PRIO_BITS ) /* Priority 5, or 160 as only the top three bits are implemented. */ + +#endif /* FREERTOS_CONFIG_H */ diff --git a/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/LM3S_Startup.s b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/LM3S_Startup.s new file mode 100644 index 0000000..cbf6ecf --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/LM3S_Startup.s @@ -0,0 +1,196 @@ +/***************************************************************************** + * Copyright (c) 2006 Rowley Associates Limited. * + * * + * This file may be distributed under the terms of the License Agreement * + * provided with this software. * + * * + * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE * + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * + *****************************************************************************/ + +/***************************************************************************** + * Preprocessor Definitions + * ------------------------ + * + * STARTUP_FROM_RESET + * + * If defined, the program will startup from power-on/reset. If not defined + * the program will just loop endlessly from power-on/reset. + * + * This definition is not defined by default on this target because the + * debugger is unable to reset this target and maintain control of it over the + * JTAG interface. The advantage of doing this is that it allows the debugger + * to reset the CPU and run programs from a known reset CPU state on each run. + * It also acts as a safety net if you accidently download a program in FLASH + * that crashes and prevents the debugger from taking control over JTAG + * rendering the target unusable over JTAG. The obvious disadvantage of doing + * this is that your application will not startup without the debugger. + * + * We advise that on this target you keep STARTUP_FROM_RESET undefined whilst + * you are developing and only define STARTUP_FROM_RESET when development is + * complete. + * + *****************************************************************************/ + +.extern xPortPendSVHandler +.extern xPortSysTickHandler +.extern vPortSVCHandler + +.global reset_handler + +.macro DEFAULT_ISR_HANDLER name= + .thumb_func + .weak \name +\name: +1: b 1b /* endless loop */ +.endm + + .section .vectors, "ax" + .code 16 + .align 0 + .global _vectors + +_vectors: + .word __stack_end__ +#ifdef STARTUP_FROM_RESET + .word reset_handler +#else + .word reset_wait +#endif /* STARTUP_FROM_RESET */ + .word Nmi_ISR + .word Fault_ISR + .word MPU_Fault_ISR + .word 0 /* Populate if using Bus fault */ + .word 0 /* Populate if using Usage fault */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word 0 /* Reserved */ + .word vPortSVCHandler + .word 0 /* Populate if using a debug monitor */ + .word 0 /* Reserved */ + .word xPortPendSVHandler + .word xPortSysTickHandler + .word GPIO_Port_A_ISR + .word GPIO_Port_B_ISR + .word GPIO_Port_C_ISR + .word GPIO_Port_D_ISR + .word GPIO_Port_E_ISR + .word UART0_ISR + .word UART1_ISR + .word SSI_ISR + .word I2C_ISR + .word PWM_Fault_ISR + .word PWM_Generator_0_ISR + .word PWM_Generator_1_ISR + .word PWM_Generator_2_ISR + .word QEI_ISR + .word ADC_Sequence_0_ISR + .word ADC_Sequence_1_ISR + .word ADC_Sequence_2_ISR + .word ADC_Sequence_3_ISR + .word Watchdog_Timer_ISR + .word Timer0A_ISR + .word Timer0B_ISR + .word Timer1A_ISR + .word Timer1B_ISR + .word Timer2A_ISR + .word Timer2B_ISR + .word Analog_Comparator_0_ISR + .word Analog_Comparator_1_ISR + .word Analog_Comparator_2_ISR + .word System_Control_ISR + .word FLASH_Control_ISR + .word GPIO_Port_F_ISR + .word GPIO_Port_G_ISR + .word GPIO_Port_H_ISR + .word UART2_ISR + .word SSI1_ISR + .word Timer3A_ISR + .word Timer3B_ISR + .word I2C1_ISR + .word QEI1_ISR + .word CAN0_ISR + .word CAN1_ISR + .word CAN2_ISR + .word EMAC_ISR + .word HIBERNATE_ISR + .word USB0_ISR + .word PWM_Generator_3_ISR + .word uDMA_Software_Transfer_ISR + .word uDMA_Error_ISR +_vectors_end: + + .section .init, "ax" + .thumb_func + +reset_handler: +#ifdef __RAM_BUILD + /* If this is a RAM build, configure vector table offset register to point + to the RAM vector table. */ + ldr r0, =0xE000ED08 + ldr r1, =_vectors + str r1, [r0] +#endif + b _start + +DEFAULT_ISR_HANDLER Nmi_ISR +/*DEFAULT_ISR_HANDLER Fault_ISR*/ +/*DEFAULT_ISR_HANDLER MPU_Fault_ISR*/ +DEFAULT_ISR_HANDLER SVCall_ISR +DEFAULT_ISR_HANDLER SysTick_ISR +DEFAULT_ISR_HANDLER PendSV_ISR +DEFAULT_ISR_HANDLER GPIO_Port_A_ISR +DEFAULT_ISR_HANDLER GPIO_Port_B_ISR +DEFAULT_ISR_HANDLER GPIO_Port_C_ISR +DEFAULT_ISR_HANDLER GPIO_Port_D_ISR +DEFAULT_ISR_HANDLER GPIO_Port_E_ISR +DEFAULT_ISR_HANDLER UART0_ISR +DEFAULT_ISR_HANDLER UART1_ISR +DEFAULT_ISR_HANDLER SSI_ISR +DEFAULT_ISR_HANDLER I2C_ISR +DEFAULT_ISR_HANDLER PWM_Fault_ISR +DEFAULT_ISR_HANDLER PWM_Generator_0_ISR +DEFAULT_ISR_HANDLER PWM_Generator_1_ISR +DEFAULT_ISR_HANDLER PWM_Generator_2_ISR +DEFAULT_ISR_HANDLER QEI_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_0_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_1_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_2_ISR +DEFAULT_ISR_HANDLER ADC_Sequence_3_ISR +DEFAULT_ISR_HANDLER Watchdog_Timer_ISR +DEFAULT_ISR_HANDLER Timer0A_ISR +DEFAULT_ISR_HANDLER Timer0B_ISR +DEFAULT_ISR_HANDLER Timer1A_ISR +DEFAULT_ISR_HANDLER Timer1B_ISR +DEFAULT_ISR_HANDLER Timer2A_ISR +DEFAULT_ISR_HANDLER Timer2B_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_0_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_1_ISR +DEFAULT_ISR_HANDLER Analog_Comparator_2_ISR +DEFAULT_ISR_HANDLER System_Control_ISR +DEFAULT_ISR_HANDLER FLASH_Control_ISR +DEFAULT_ISR_HANDLER GPIO_Port_F_ISR +DEFAULT_ISR_HANDLER GPIO_Port_G_ISR +DEFAULT_ISR_HANDLER GPIO_Port_H_ISR +DEFAULT_ISR_HANDLER UART2_ISR +DEFAULT_ISR_HANDLER SSI1_ISR +DEFAULT_ISR_HANDLER Timer3A_ISR +DEFAULT_ISR_HANDLER Timer3B_ISR +DEFAULT_ISR_HANDLER I2C1_ISR +DEFAULT_ISR_HANDLER QEI1_ISR +DEFAULT_ISR_HANDLER CAN0_ISR +DEFAULT_ISR_HANDLER CAN1_ISR +DEFAULT_ISR_HANDLER CAN2_ISR +DEFAULT_ISR_HANDLER ETHERNET_ISR +DEFAULT_ISR_HANDLER HIBERNATE_ISR +DEFAULT_ISR_HANDLER USB0_ISR +DEFAULT_ISR_HANDLER PWM_Generator_3_ISR +DEFAULT_ISR_HANDLER uDMA_Software_Transfer_ISR +DEFAULT_ISR_HANDLER uDMA_Error_ISR +DEFAULT_ISR_HANDLER EMAC_ISR + +#ifndef STARTUP_FROM_RESET +DEFAULT_ISR_HANDLER reset_wait +#endif /* STARTUP_FROM_RESET */ + diff --git a/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/LM3S_Target.js b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/LM3S_Target.js new file mode 100644 index 0000000..55a9c2c --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/LM3S_Target.js @@ -0,0 +1,28 @@ +/****************************************************************************** + Target Script for LM3S. + + Copyright (c) 2006 Rowley Associates Limited. + + This file may be distributed under the terms of the License Agreement + provided with this software. + + THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE + WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + ******************************************************************************/ + +function Reset() +{ + TargetInterface.resetAndStop(1000); +} + +function RAMReset() +{ + Reset(); +} + +function FLASHReset() +{ + Reset(); +} + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/RTOSDemo.hzp b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/RTOSDemo.hzp new file mode 100644 index 0000000..fab3463 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/RTOSDemo.hzp @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/RTOSDemo.hzs b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/RTOSDemo.hzs new file mode 100644 index 0000000..93cb286 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/RTOSDemo.hzs @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/flash_placement.xml b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/flash_placement.xml new file mode 100644 index 0000000..1a5c7a5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/flash_placement.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/main.c b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/main.c new file mode 100644 index 0000000..749b7e1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/main.c @@ -0,0 +1,1006 @@ +/* + FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong? * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, training, latest information, + license and contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool. + + Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell + the code with commercial support, indemnification, and middleware, under + the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also + provide a safety engineered and independently SIL3 certified version under + the SafeRTOS brand: http://www.SafeRTOS.com. +*/ + + +/* + * This file demonstrates the use of FreeRTOS-MPU. It creates tasks in both + * User mode and Privileged mode, and using both the original xTaskCreate() and + * the new xTaskCreateRestricted() API functions. The purpose of each created + * task is documented in the comments above the task function prototype (in + * this file), with the task behaviour demonstrated and documented within the + * task function itself. In addition a queue is used to demonstrate passing + * data between protected/restricted tasks as well as passing data between an + * interrupt and a protected/restricted task. + */ + + + +/* Standard includes. */ +#include +#include <__cross_studio_io.h> + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +/* Hardware library includes. */ +#include "hw_types.h" +#include "hw_sysctl.h" +#include "sysctl.h" + +/*-----------------------------------------------------------*/ + +/* Misc constants. */ +#define mainDONT_BLOCK ( 0 ) + +/* Definitions for the messages that can be sent to the check task. */ +#define mainREG_TEST_1_STILL_EXECUTING ( 0 ) +#define mainREG_TEST_2_STILL_EXECUTING ( 1 ) +#define mainPRINT_SYSTEM_STATUS ( 2 ) + +/* GCC specifics. */ +#define mainALIGN_TO( x ) __attribute__((aligned(x))) + + +/*-----------------------------------------------------------*/ +/* Prototypes for functions that implement tasks. -----------*/ +/*-----------------------------------------------------------*/ + +/* + * Prototype for the reg test tasks. Amongst other things, these fill the CPU + * registers with known values before checking that the registers still contain + * the expected values. Each of the two tasks use different values so an error + * in the context switch mechanism can be caught. Both reg test tasks execute + * at the idle priority so will get preempted regularly. Each task repeatedly + * sends a message on a queue so long as it remains functioning correctly. If + * an error is detected within the task the task is simply deleted. + */ +static void prvRegTest1Task( void *pvParameters ); +static void prvRegTest2Task( void *pvParameters ); + +/* + * Prototype for the check task. The check task demonstrates various features + * of the MPU before entering a loop where it waits for messages to arrive on a + * queue. + * + * Two types of messages can be processes: + * + * 1) "I'm Alive" messages sent from the reg test tasks, indicating that the + * task is still operational. + * + * 2) "Print Status commands" sent periodically by the tick hook function (and + * therefore from within an interrupt) which command the check task to write + * either pass or fail to the terminal, depending on the status of the reg + * test tasks. + */ +static void prvCheckTask( void *pvParameters ); + +/* + * Prototype for a task created in User mode using the original vTaskCreate() + * API function. The task demonstrates the characteristics of such a task, + * before simply deleting itself. + */ +static void prvOldStyleUserModeTask( void *pvParameters ); + +/* + * Prototype for a task created in Privileged mode using the original + * vTaskCreate() API function. The task demonstrates the characteristics of + * such a task, before simply deleting itself. + */ +static void prvOldStylePrivilegedModeTask( void *pvParameters ); + + +/*-----------------------------------------------------------*/ +/* Prototypes for other misc functions. --------------------*/ +/*-----------------------------------------------------------*/ + +/* + * Just configures any clocks and IO necessary. + */ +static void prvSetupHardware( void ); + +/* + * Simply deletes the calling task. The function is provided only because it + * is simpler to call from asm code than the normal vTaskDelete() API function. + * It has the noinline attribute because it is called from asm code. + */ +static void prvDeleteMe( void ) __attribute__((noinline)); + +/* + * Used by both reg test tasks to send messages to the check task. The message + * just lets the check task know that the task is still functioning correctly. + * If a reg test task detects an error it will delete itself, and in so doing + * prevent itself from sending any more 'I'm Alive' messages to the check task. + */ +static void prvSendImAlive( xQueueHandle xHandle, unsigned long ulTaskNumber ); + +/* + * The check task is created with access to three memory regions (plus its + * stack). Each memory region is configured with different parameters and + * prvTestMemoryRegions() demonstrates what can and cannot be accessed for each + * region. prvTestMemoryRegions() also demonstrates a task that was created + * as a privileged task settings its own privilege level down to that of a user + * task. + */ +static void prvTestMemoryRegions( void ); + +/*-----------------------------------------------------------*/ + +/* The handle of the queue used to communicate between tasks and between tasks +and interrupts. Note that this is a file scope variable that falls outside of +any MPU region. As such other techniques have to be used to allow the tasks +to gain access to the queue. See the comments in the tasks themselves for +further information. */ +static xQueueHandle xFileScopeCheckQueue = NULL; + + +/*-----------------------------------------------------------*/ +/* Data used by the 'check' task. ---------------------------*/ +/*-----------------------------------------------------------*/ + +/* Define the constants used to allocate the check task stack. Note that the +stack size is defined in words, not bytes. */ +#define mainCHECK_TASK_STACK_SIZE_WORDS 128 +#define mainCHECK_TASK_STACK_ALIGNMENT ( mainCHECK_TASK_STACK_SIZE_WORDS * sizeof( portSTACK_TYPE ) ) + +/* Declare the stack that will be used by the check task. The kernel will + automatically create an MPU region for the stack. The stack alignment must + match its size, so if 128 words are reserved for the stack then it must be + aligned to ( 128 * 4 ) bytes. */ +static portSTACK_TYPE xCheckTaskStack[ mainCHECK_TASK_STACK_SIZE_WORDS ] mainALIGN_TO( mainCHECK_TASK_STACK_ALIGNMENT ); + +/* Declare three arrays - an MPU region will be created for each array +using the xTaskParameters structure below. THIS IS JUST TO DEMONSTRATE THE +MPU FUNCTIONALITY, the data is not used by the check tasks primary function +of monitoring the reg test tasks and printing out status information. + +Note that the arrays allocate slightly more RAM than is actually assigned to +the MPU region. This is to permit writes off the end of the array to be +detected even when the arrays are placed in adjacent memory locations (with no +gaps between them). The align size must be a power of two. */ +#define mainREAD_WRITE_ARRAY_SIZE 130 +#define mainREAD_WRITE_ALIGN_SIZE 128 +char cReadWriteArray[ mainREAD_WRITE_ARRAY_SIZE ] mainALIGN_TO( mainREAD_WRITE_ALIGN_SIZE ); + +#define mainREAD_ONLY_ARRAY_SIZE 260 +#define mainREAD_ONLY_ALIGN_SIZE 256 +char cReadOnlyArray[ mainREAD_ONLY_ARRAY_SIZE ] mainALIGN_TO( mainREAD_ONLY_ALIGN_SIZE ); + +#define mainPRIVILEGED_ONLY_ACCESS_ARRAY_SIZE 130 +#define mainPRIVILEGED_ONLY_ACCESS_ALIGN_SIZE 128 +char cPrivilegedOnlyAccessArray[ mainPRIVILEGED_ONLY_ACCESS_ALIGN_SIZE ] mainALIGN_TO( mainPRIVILEGED_ONLY_ACCESS_ALIGN_SIZE ); + +/* Fill in a xTaskParameters structure to define the check task - this is the +structure passed to the xTaskCreateRestricted() function. */ +static const xTaskParameters xCheckTaskParameters = +{ + prvCheckTask, /* pvTaskCode - the function that implements the task. */ + ( signed char * ) "Check", /* pcName */ + mainCHECK_TASK_STACK_SIZE_WORDS, /* usStackDepth - defined in words, not bytes. */ + ( void * ) 0x12121212, /* pvParameters - this value is just to test that the parameter is being passed into the task correctly. */ + ( tskIDLE_PRIORITY + 1 ) | portPRIVILEGE_BIT,/* uxPriority - this is the highest priority task in the system. The task is created in privileged mode to demonstrate accessing the privileged only data. */ + xCheckTaskStack, /* puxStackBuffer - the array to use as the task stack, as declared above. */ + + /* xRegions - In this case the xRegions array is used to create MPU regions + for all three of the arrays declared directly above. Each MPU region is + created with different parameters. Again, THIS IS JUST TO DEMONSTRATE THE + MPU FUNCTIONALITY, the data is not used by the check tasks primary function + of monitoring the reg test tasks and printing out status information.*/ + { + /* Base address Length Parameters */ + { cReadWriteArray, mainREAD_WRITE_ALIGN_SIZE, portMPU_REGION_READ_WRITE }, + { cReadOnlyArray, mainREAD_ONLY_ALIGN_SIZE, portMPU_REGION_READ_ONLY }, + { cPrivilegedOnlyAccessArray, mainPRIVILEGED_ONLY_ACCESS_ALIGN_SIZE, portMPU_REGION_PRIVILEGED_READ_WRITE } + } +}; + +/* Three MPU regions are defined for use by the 'check' task when the task is +created. These are only used to demonstrate the MPU features and are not +actually necessary for the check task to fulfill its primary purpose. Instead +the MPU regions are replaced with those defined by xAltRegions prior to the +check task receiving any data on the queue or printing any messages to the +debug console. The region configured by xAltRegions just gives the check task +access to the debug variables that form part of the Rowley library, and are +accessed within the debug_printf() function. */ +extern unsigned long dbgCntrlWord_mempoll; +static const xMemoryRegion xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] = +{ + /* Base address Length Parameters */ + { ( void * ) &dbgCntrlWord_mempoll, 32, portMPU_REGION_READ_WRITE }, + { 0, 0, 0 }, + { 0, 0, 0 } +}; + + + +/*-----------------------------------------------------------*/ +/* Data used by the 'reg test' tasks. -----------------------*/ +/*-----------------------------------------------------------*/ + +/* Define the constants used to allocate the reg test task stacks. Note that +that stack size is defined in words, not bytes. */ +#define mainREG_TEST_STACK_SIZE_WORDS 128 +#define mainREG_TEST_STACK_ALIGNMENT ( mainREG_TEST_STACK_SIZE_WORDS * sizeof( portSTACK_TYPE ) ) + +/* Declare the stacks that will be used by the reg test tasks. The kernel will +automatically create an MPU region for the stack. The stack alignment must +match its size, so if 128 words are reserved for the stack then it must be +aligned to ( 128 * 4 ) bytes. */ +static portSTACK_TYPE xRegTest1Stack[ mainREG_TEST_STACK_SIZE_WORDS ] mainALIGN_TO( mainREG_TEST_STACK_ALIGNMENT ); +static portSTACK_TYPE xRegTest2Stack[ mainREG_TEST_STACK_SIZE_WORDS ] mainALIGN_TO( mainREG_TEST_STACK_ALIGNMENT ); + +/* Fill in a xTaskParameters structure per reg test task to define the tasks. */ +static const xTaskParameters xRegTest1Parameters = +{ + prvRegTest1Task, /* pvTaskCode - the function that implements the task. */ + ( signed char * ) "RegTest1", /* pcName */ + mainREG_TEST_STACK_SIZE_WORDS, /* usStackDepth */ + ( void * ) 0x12345678, /* pvParameters - this value is just to test that the parameter is being passed into the task correctly. */ + tskIDLE_PRIORITY | portPRIVILEGE_BIT, /* uxPriority - note that this task is created with privileges to demonstrate one method of passing a queue handle into the task. */ + xRegTest1Stack, /* puxStackBuffer - the array to use as the task stack, as declared above. */ + { /* xRegions - this task does not use any non-stack data hence all members are zero. */ + /* Base address Length Parameters */ + { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00 } + } +}; +/*-----------------------------------------------------------*/ + +static xTaskParameters xRegTest2Parameters = +{ + prvRegTest2Task, /* pvTaskCode - the function that implements the task. */ + ( signed char * ) "RegTest2", /* pcName */ + mainREG_TEST_STACK_SIZE_WORDS, /* usStackDepth */ + ( void * ) NULL, /* pvParameters - this task uses the parameter to pass in a queue handle, but the queue is not created yet. */ + tskIDLE_PRIORITY, /* uxPriority */ + xRegTest2Stack, /* puxStackBuffer - the array to use as the task stack, as declared above. */ + { /* xRegions - this task does not use any non-stack data hence all members are zero. */ + /* Base address Length Parameters */ + { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00 } + } +}; + +/*-----------------------------------------------------------*/ + +int main( void ) +{ + prvSetupHardware(); + + /* Create the queue used to pass "I'm alive" messages to the check task. */ + xFileScopeCheckQueue = xQueueCreate( 1, sizeof( unsigned long ) ); + + /* One check task uses the task parameter to receive the queue handle. + This allows the file scope variable to be accessed from within the task. + The pvParameters member of xRegTest2Parameters can only be set after the + queue has been created so is set here. */ + xRegTest2Parameters.pvParameters = xFileScopeCheckQueue; + + /* Create the three test tasks. Handles to the created tasks are not + required, hence the second parameter is NULL. */ + xTaskCreateRestricted( &xRegTest1Parameters, NULL ); + xTaskCreateRestricted( &xRegTest2Parameters, NULL ); + xTaskCreateRestricted( &xCheckTaskParameters, NULL ); + + /* Create the tasks that are created using the original xTaskCreate() API + function. */ + xTaskCreate( prvOldStyleUserModeTask, /* The function that implements the task. */ + ( signed char * ) "Task1", /* Text name for the task. */ + 100, /* Stack depth in words. */ + NULL, /* Task parameters. */ + 3, /* Priority and mode (user in this case). */ + NULL /* Handle. */ + ); + + xTaskCreate( prvOldStylePrivilegedModeTask, /* The function that implements the task. */ + ( signed char * ) "Task2", /* Text name for the task. */ + 100, /* Stack depth in words. */ + NULL, /* Task parameters. */ + ( 3 | portPRIVILEGE_BIT ), /* Priority and mode. */ + NULL /* Handle. */ + ); + + /* Start the scheduler. */ + vTaskStartScheduler(); + + /* Will only get here if there was insufficient memory to create the idle + task. */ + for( ;; ); + return 0; +} +/*-----------------------------------------------------------*/ + +static void prvCheckTask( void *pvParameters ) +{ +/* This task is created in privileged mode so can access the file scope +queue variable. Take a stack copy of this before the task is set into user +mode. Once that task is in user mode the file scope queue variable will no +longer be accessible but the stack copy will. */ +xQueueHandle xQueue = xFileScopeCheckQueue; +long lMessage; +unsigned long ulStillAliveCounts[ 2 ] = { 0 }; +const char *pcStatusMessage = "PASS\r\n"; + + /* Just to remove compiler warning. */ + ( void ) pvParameters; + + /* Print out the amount of free heap space so configTOTAL_HEAP_SIZE can be + tuned. The heap size is set to be very small in this example and will need + to be increased before many more tasks, queues or semaphores can be + created. */ + debug_printf( "There are %d bytes of unused heap space.\r\n", xPortGetFreeHeapSize() ); + + /* Demonstrate how the various memory regions can and can't be accessed. + The task privilege level is set down to user mode within this function. */ + prvTestMemoryRegions(); + + /* Change the memory regions allocated to this task to those initially + set up for demonstration purposes to those actually required by the task. */ + vTaskAllocateMPURegions( NULL, xAltRegions ); + + /* This loop performs the main function of the task, which is blocking + on a message queue then processing each message as it arrives. */ + for( ;; ) + { + /* Wait for the next message to arrive. */ + xQueueReceive( xQueue, &lMessage, portMAX_DELAY ); + + switch( lMessage ) + { + case mainREG_TEST_1_STILL_EXECUTING : + /* Message from task 1, so task 1 must still be executing. */ + ( ulStillAliveCounts[ 0 ] )++; + break; + + case mainREG_TEST_2_STILL_EXECUTING : + /* Message from task 2, so task 2 must still be executing. */ + ( ulStillAliveCounts[ 1 ] )++; + break; + + case mainPRINT_SYSTEM_STATUS : + /* Message from tick hook, time to print out the system + status. If messages has stopped arriving from either reg + test task then the status must be set to fail. */ + if( ( ulStillAliveCounts[ 0 ] == 0 ) || ( ulStillAliveCounts[ 1 ] == 0 ) ) + { + /* One or both of the test tasks are no longer sending + 'still alive' messages. */ + pcStatusMessage = "FAIL\r\n"; + } + + /* Print a pass/fail message to the terminal. This will be + visible in the CrossWorks IDE. */ + debug_printf( pcStatusMessage ); + + /* Reset the count of 'still alive' messages. */ + memset( ulStillAliveCounts, 0x00, sizeof( ulStillAliveCounts ) ); + break; + + default : + /* Something unexpected happened. Delete this task so the + error is apparent (no output will be displayed). */ + prvDeleteMe(); + break; + } + } +} +/*-----------------------------------------------------------*/ + +static void prvTestMemoryRegions( void ) +{ +long l; +char cTemp; + + /* The check task (from which this function is called) is created in the + Privileged mode. The privileged array can be both read from and written + to while this task is privileged. */ + cPrivilegedOnlyAccessArray[ 0 ] = 'a'; + if( cPrivilegedOnlyAccessArray[ 0 ] != 'a' ) + { + /* Something unexpected happened. Delete this task so the error is + apparent (no output will be displayed). */ + prvDeleteMe(); + } + + /* Writing off the end of the RAM allocated to this task will *NOT* cause a + protection fault because the task is still executing in a privileged mode. + Uncomment the following to test. */ + /*cPrivilegedOnlyAccessArray[ mainPRIVILEGED_ONLY_ACCESS_ALIGN_SIZE ] = 'a';*/ + + /* Now set the task into user mode. */ + portSWITCH_TO_USER_MODE(); + + /* Accessing the privileged only array will now cause a fault. Uncomment + the following line to test. */ + /*cPrivilegedOnlyAccessArray[ 0 ] = 'a';*/ + + /* The read/write array can still be successfully read and written. */ + for( l = 0; l < mainREAD_WRITE_ALIGN_SIZE; l++ ) + { + cReadWriteArray[ l ] = 'a'; + if( cReadWriteArray[ l ] != 'a' ) + { + /* Something unexpected happened. Delete this task so the error is + apparent (no output will be displayed). */ + prvDeleteMe(); + } + } + + /* But attempting to read or write off the end of the RAM allocated to this + task will cause a fault. Uncomment either of the following two lines to + test. */ + /* cReadWriteArray[ 0 ] = cReadWriteArray[ -1 ]; */ + /* cReadWriteArray[ mainREAD_WRITE_ALIGN_SIZE ] = 0x00; */ + + /* The read only array can be successfully read... */ + for( l = 0; l < mainREAD_ONLY_ALIGN_SIZE; l++ ) + { + cTemp = cReadOnlyArray[ l ]; + } + + /* ...but cannot be written. Uncomment the following line to test. */ + /* cReadOnlyArray[ 0 ] = 'a'; */ + + /* Writing to the first and last locations in the stack array should not + cause a protection fault. Note that doing this will cause the kernel to + detect a stack overflow if configCHECK_FOR_STACK_OVERFLOW is greater than + 1. */ + xCheckTaskStack[ 0 ] = 0; + xCheckTaskStack[ mainCHECK_TASK_STACK_SIZE_WORDS - 1 ] = 0; + + /* Writing off either end of the stack array should cause a protection + fault, uncomment either of the following two lines to test. */ + /* xCheckTaskStack[ -1 ] = 0; */ + /* xCheckTaskStack[ mainCHECK_TASK_STACK_SIZE_WORDS ] = 0; */ + + ( void ) cTemp; +} +/*-----------------------------------------------------------*/ + +static void prvRegTest1Task( void *pvParameters ) +{ +/* This task is created in privileged mode so can access the file scope +queue variable. Take a stack copy of this before the task is set into user +mode. Once this task is in user mode the file scope queue variable will no +longer be accessible but the stack copy will. */ +xQueueHandle xQueue = xFileScopeCheckQueue; + + /* Now the queue handle has been obtained the task can switch to user + mode. This is just one method of passing a handle into a protected + task, the other reg test task uses the task parameter instead. */ + portSWITCH_TO_USER_MODE(); + + /* First check that the parameter value is as expected. */ + if( pvParameters != ( void * ) 0x12345678 ) + { + /* Error detected. Delete the task so it stops communicating with + the check task. */ + prvDeleteMe(); + } + + + for( ;; ) + { + /* This task tests the kernel context switch mechanism by reading and + writing directly to registers - which requires the test to be written + in assembly code. */ + __asm volatile + ( + " MOV R4, #104 \n" /* Set registers to a known value. R0 to R1 are done in the loop below. */ + " MOV R5, #105 \n" + " MOV R6, #106 \n" + " MOV R8, #108 \n" + " MOV R9, #109 \n" + " MOV R10, #110 \n" + " MOV R11, #111 \n" + "reg1loop: \n" + " MOV R0, #100 \n" /* Set the scratch registers to known values - done inside the loop as they get clobbered. */ + " MOV R1, #101 \n" + " MOV R2, #102 \n" + " MOV R3, #103 \n" + " MOV R12, #112 \n" + " SVC #1 \n" /* Yield just to increase test coverage. */ + " CMP R0, #100 \n" /* Check all the registers still contain their expected values. */ + " BNE prvDeleteMe \n" /* Value was not as expected, delete the task so it stops communicating with the check task. */ + " CMP R1, #101 \n" + " BNE prvDeleteMe \n" + " CMP R2, #102 \n" + " BNE prvDeleteMe \n" + " CMP R3, #103 \n" + " BNE prvDeleteMe \n" + " CMP R4, #104 \n" + " BNE prvDeleteMe \n" + " CMP R5, #105 \n" + " BNE prvDeleteMe \n" + " CMP R6, #106 \n" + " BNE prvDeleteMe \n" + " CMP R8, #108 \n" + " BNE prvDeleteMe \n" + " CMP R9, #109 \n" + " BNE prvDeleteMe \n" + " CMP R10, #110 \n" + " BNE prvDeleteMe \n" + " CMP R11, #111 \n" + " BNE prvDeleteMe \n" + " CMP R12, #112 \n" + " BNE prvDeleteMe \n" + :::"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + ); + + /* Send mainREG_TEST_1_STILL_EXECUTING to the check task to indicate that this + task is still functioning. */ + prvSendImAlive( xQueue, mainREG_TEST_1_STILL_EXECUTING ); + + /* Go back to check all the register values again. */ + __asm volatile( " B reg1loop " ); + } +} +/*-----------------------------------------------------------*/ + +static void prvRegTest2Task( void *pvParameters ) +{ +/* The queue handle is passed in as the task parameter. This is one method of +passing data into a protected task, the other reg test task uses a different +method. */ +xQueueHandle xQueue = ( xQueueHandle ) pvParameters; + + for( ;; ) + { + /* This task tests the kernel context switch mechanism by reading and + writing directly to registers - which requires the test to be written + in assembly code. */ + __asm volatile + ( + " MOV R4, #4 \n" /* Set registers to a known value. R0 to R1 are done in the loop below. */ + " MOV R5, #5 \n" + " MOV R6, #6 \n" + " MOV R8, #8 \n" /* Frame pointer is omitted as it must not be changed. */ + " MOV R9, #9 \n" + " MOV R10, 10 \n" + " MOV R11, #11 \n" + "reg2loop: \n" + " MOV R0, #13 \n" /* Set the scratch registers to known values - done inside the loop as they get clobbered. */ + " MOV R1, #1 \n" + " MOV R2, #2 \n" + " MOV R3, #3 \n" + " MOV R12, #12 \n" + " CMP R0, #13 \n" /* Check all the registers still contain their expected values. */ + " BNE prvDeleteMe \n" /* Value was not as expected, delete the task so it stops communicating with the check task */ + " CMP R1, #1 \n" + " BNE prvDeleteMe \n" + " CMP R2, #2 \n" + " BNE prvDeleteMe \n" + " CMP R3, #3 \n" + " BNE prvDeleteMe \n" + " CMP R4, #4 \n" + " BNE prvDeleteMe \n" + " CMP R5, #5 \n" + " BNE prvDeleteMe \n" + " CMP R6, #6 \n" + " BNE prvDeleteMe \n" + " CMP R8, #8 \n" + " BNE prvDeleteMe \n" + " CMP R9, #9 \n" + " BNE prvDeleteMe \n" + " CMP R10, #10 \n" + " BNE prvDeleteMe \n" + " CMP R11, #11 \n" + " BNE prvDeleteMe \n" + " CMP R12, #12 \n" + " BNE prvDeleteMe \n" + :::"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r8", "r9", "r10", "r11", "r12" + ); + + /* Send mainREG_TEST_2_STILL_EXECUTING to the check task to indicate that this + task is still functioning. */ + prvSendImAlive( xQueue, mainREG_TEST_2_STILL_EXECUTING ); + + /* Go back to check all the register values again. */ + __asm volatile( " B reg2loop " ); + } +} +/*-----------------------------------------------------------*/ + +void vApplicationIdleHook( void ) +{ +extern unsigned long __SRAM_segment_end__[]; +extern unsigned long __privileged_data_start__[]; +extern unsigned long __privileged_data_end__[]; +extern unsigned long __FLASH_segment_start__[]; +extern unsigned long __FLASH_segment_end__[]; +volatile unsigned long *pul; +volatile unsigned long ulReadData; + + /* The idle task, and therefore this function, run in Supervisor mode and + can therefore access all memory. Try reading from corners of flash and + RAM to ensure a memory fault does not occur. + + Start with the edges of the privileged data area. */ + pul = __privileged_data_start__; + ulReadData = *pul; + pul = __privileged_data_end__ - 1; + ulReadData = *pul; + + /* Next the standard SRAM area. */ + pul = __SRAM_segment_end__ - 1; + ulReadData = *pul; + + /* And the standard Flash area - the start of which is marked for + privileged access only. */ + pul = __FLASH_segment_start__; + ulReadData = *pul; + pul = __FLASH_segment_end__ - 1; + ulReadData = *pul; + + /* Reading off the end of Flash or SRAM space should cause a fault. + Uncomment one of the following two pairs of lines to test. */ + + /* pul = __FLASH_segment_end__ + 4; + ulReadData = *pul; */ + + /* pul = __SRAM_segment_end__ + 1; + ulReadData = *pul; */ + + ( void ) ulReadData; +} +/*-----------------------------------------------------------*/ + +static void prvOldStyleUserModeTask( void *pvParameters ) +{ +extern unsigned long __privileged_data_start__[]; +extern unsigned long __privileged_data_end__[]; +extern unsigned long __SRAM_segment_end__[]; +extern unsigned long __privileged_functions_end__[]; +extern unsigned long __FLASH_segment_start__[]; +extern unsigned long __FLASH_segment_end__[]; +const volatile unsigned long *pulStandardPeripheralRegister = ( volatile unsigned long * ) 0x400FC0C4; /* PCONP */ +volatile unsigned long *pul; +volatile unsigned long ulReadData; + +/* The following lines are commented out to prevent the unused variable +compiler warnings when the tests that use the variable are also commented out. +extern unsigned long __privileged_functions_start__[]; +const volatile unsigned long *pulSystemPeripheralRegister = ( volatile unsigned long * ) 0xe000e014; */ + + ( void ) pvParameters; + + /* This task is created in User mode using the original xTaskCreate() API + function. It should have access to all Flash and RAM except that marked + as Privileged access only. Reading from the start and end of the non- + privileged RAM should not cause a problem (the privileged RAM is the first + block at the bottom of the RAM memory). */ + pul = __privileged_data_end__ + 1; + ulReadData = *pul; + pul = __SRAM_segment_end__ - 1; + ulReadData = *pul; + + /* Likewise reading from the start and end of the non-privileged Flash + should not be a problem (the privileged Flash is the first block at the + bottom of the Flash memory). */ + pul = __privileged_functions_end__ + 1; + ulReadData = *pul; + pul = __FLASH_segment_end__ - 1; + ulReadData = *pul; + + /* Standard peripherals are accessible. */ + ulReadData = *pulStandardPeripheralRegister; + + /* System peripherals are not accessible. Uncomment the following line + to test. Also uncomment the declaration of pulSystemPeripheralRegister + at the top of this function. */ + /* ulReadData = *pulSystemPeripheralRegister; */ + + /* Reading from anywhere inside the privileged Flash or RAM should cause a + fault. This can be tested by uncommenting any of the following pairs of + lines. Also uncomment the declaration of __privileged_functions_start__ + at the top of this function. */ + + /* pul = __privileged_functions_start__; + ulReadData = *pul; */ + + /* pul = __privileged_functions_end__ - 1; + ulReadData = *pul; */ + + /* pul = __privileged_data_start__; + ulReadData = *pul; */ + + /* pul = __privileged_data_end__ - 1; + ulReadData = *pul; */ + + /* Must not just run off the end of a task function, so delete this task. + Note that because this task was created using xTaskCreate() the stack was + allocated dynamically and I have not included any code to free it again. */ + vTaskDelete( NULL ); + + ( void ) ulReadData; +} +/*-----------------------------------------------------------*/ + +static void prvOldStylePrivilegedModeTask( void *pvParameters ) +{ +extern unsigned long __privileged_data_start__[]; +extern unsigned long __privileged_data_end__[]; +extern unsigned long __SRAM_segment_end__[]; +extern unsigned long __privileged_functions_start__[]; +extern unsigned long __privileged_functions_end__[]; +extern unsigned long __FLASH_segment_start__[]; +extern unsigned long __FLASH_segment_end__[]; +volatile unsigned long *pul; +volatile unsigned long ulReadData; +const volatile unsigned long *pulSystemPeripheralRegister = ( volatile unsigned long * ) 0xe000e014; /* Systick */ +const volatile unsigned long *pulStandardPeripheralRegister = ( volatile unsigned long * ) 0x400FC0C4; /* PCONP */ + + ( void ) pvParameters; + + /* This task is created in Privileged mode using the original xTaskCreate() + API function. It should have access to all Flash and RAM including that + marked as Privileged access only. So reading from the start and end of the + non-privileged RAM should not cause a problem (the privileged RAM is the + first block at the bottom of the RAM memory). */ + pul = __privileged_data_end__ + 1; + ulReadData = *pul; + pul = __SRAM_segment_end__ - 1; + ulReadData = *pul; + + /* Likewise reading from the start and end of the non-privileged Flash + should not be a problem (the privileged Flash is the first block at the + bottom of the Flash memory). */ + pul = __privileged_functions_end__ + 1; + ulReadData = *pul; + pul = __FLASH_segment_end__ - 1; + ulReadData = *pul; + + /* Reading from anywhere inside the privileged Flash or RAM should also + not be a problem. */ + pul = __privileged_functions_start__; + ulReadData = *pul; + pul = __privileged_functions_end__ - 1; + ulReadData = *pul; + pul = __privileged_data_start__; + ulReadData = *pul; + pul = __privileged_data_end__ - 1; + ulReadData = *pul; + + /* Finally, accessing both System and normal peripherals should both be + possible. */ + ulReadData = *pulSystemPeripheralRegister; + ulReadData = *pulStandardPeripheralRegister; + + /* Must not just run off the end of a task function, so delete this task. + Note that because this task was created using xTaskCreate() the stack was + allocated dynamically and I have not included any code to free it again. */ + vTaskDelete( NULL ); + + ( void ) ulReadData; +} +/*-----------------------------------------------------------*/ + +static void prvDeleteMe( void ) +{ + vTaskDelete( NULL ); +} +/*-----------------------------------------------------------*/ + +static void prvSendImAlive( xQueueHandle xHandle, unsigned long ulTaskNumber ) +{ + if( xHandle != NULL ) + { + xQueueSend( xHandle, &ulTaskNumber, mainDONT_BLOCK ); + } +} +/*-----------------------------------------------------------*/ + +static void prvSetupHardware( void ) +{ + /* If running on Rev A2 silicon, turn the LDO voltage up to 2.75V. This is + a workaround to allow the PLL to operate reliably. */ + if( DEVICE_IS_REVA2 ) + { + SysCtlLDOSet( SYSCTL_LDO_2_75V ); + } + + /* Set the clocking to run from the PLL at 50 MHz */ + SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_8MHZ ); +} +/*-----------------------------------------------------------*/ + +void vApplicationTickHook( void ) +{ +static unsigned long ulCallCount; +const unsigned long ulCallsBetweenSends = 5000 / portTICK_RATE_MS; +const unsigned long ulMessage = mainPRINT_SYSTEM_STATUS; +portBASE_TYPE xDummy; + + /* If configUSE_TICK_HOOK is set to 1 then this function will get called + from each RTOS tick. It is called from the tick interrupt and therefore + will be executing in the privileged state. */ + + ulCallCount++; + + /* Is it time to print out the pass/fail message again? */ + if( ulCallCount >= ulCallsBetweenSends ) + { + ulCallCount = 0; + + /* Send a message to the check task to command it to check that all + the tasks are still running then print out the status. + + This is running in an ISR so has to use the "FromISR" version of + xQueueSend(). Because it is in an ISR it is running with privileges + so can access xFileScopeCheckQueue directly. */ + xQueueSendFromISR( xFileScopeCheckQueue, &ulMessage, &xDummy ); + } +} +/*-----------------------------------------------------------*/ + +void vApplicationStackOverflowHook( xTaskHandle pxTask, signed char *pcTaskName ) +{ + /* If configCHECK_FOR_STACK_OVERFLOW is set to either 1 or 2 then this + function will automatically get called if a task overflows its stack. */ + ( void ) pxTask; + ( void ) pcTaskName; + for( ;; ); +} +/*-----------------------------------------------------------*/ + +void vApplicationMallocFailedHook( void ) +{ + /* If configUSE_MALLOC_FAILED_HOOK is set to 1 then this function will + be called automatically if a call to pvPortMalloc() fails. pvPortMalloc() + is called automatically when a task, queue or semaphore is created. */ + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* Just to keep the linker happy. */ +void __error__( char *pcFilename, unsigned long ulLine ) +{ + ( void ) pcFilename; + ( void ) ulLine; + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* Just to keep the linker happy. */ +int uipprintf( const char *fmt, ... ) +{ + ( void ) fmt; + return( 0 ); +} +/*-----------------------------------------------------------*/ + +void hard_fault_handler(unsigned int * hardfault_args) +{ +volatile unsigned int stacked_r0; +volatile unsigned int stacked_r1; +volatile unsigned int stacked_r2; +volatile unsigned int stacked_r3; +volatile unsigned int stacked_r12; +volatile unsigned int stacked_lr; +volatile unsigned int stacked_pc; +volatile unsigned int stacked_psr; + + stacked_r0 = ((unsigned long) hardfault_args[0]); + stacked_r1 = ((unsigned long) hardfault_args[1]); + stacked_r2 = ((unsigned long) hardfault_args[2]); + stacked_r3 = ((unsigned long) hardfault_args[3]); + + stacked_r12 = ((unsigned long) hardfault_args[4]); + stacked_lr = ((unsigned long) hardfault_args[5]); + stacked_pc = ((unsigned long) hardfault_args[6]); + stacked_psr = ((unsigned long) hardfault_args[7]); + + /* Inspect stacked_pc to locate the offending instruction. */ + for( ;; ); + + ( void ) stacked_psr; + ( void ) stacked_pc; + ( void ) stacked_lr; + ( void ) stacked_r12; + ( void ) stacked_r0; + ( void ) stacked_r1; + ( void ) stacked_r2; + ( void ) stacked_r3; +} +/*-----------------------------------------------------------*/ + +void Fault_ISR( void ) __attribute__((naked)); +void Fault_ISR( void ) +{ + __asm volatile + ( + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + " ldr r1, [r0, #24] \n" + " ldr r2, handler_address_const \n" + " bx r2 \n" + " handler_address_const: .word hard_fault_handler \n" + ); +} +/*-----------------------------------------------------------*/ + +void MPU_Fault_ISR( void ) __attribute__((naked)); +void MPU_Fault_ISR( void ) +{ + __asm volatile + ( + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + " ldr r1, [r0, #24] \n" + " ldr r2, handler_address_const \n" + " bx r2 \n" + " handler2_address_const: .word hard_fault_handler \n" + ); +} +/*-----------------------------------------------------------*/ \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/thumb_crt0.s b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/thumb_crt0.s new file mode 100644 index 0000000..10fc4cd --- /dev/null +++ b/third_party/FreeRTOS/Demo/CORTEX_MPU_LM3Sxxxx_Rowley/thumb_crt0.s @@ -0,0 +1,233 @@ +/***************************************************************************** + * Copyright (c) 2009 Rowley Associates Limited. * + * * + * This file may be distributed under the terms of the License Agreement * + * provided with this software. * + * * + * THIS FILE IS PROVIDED AS IS WITH NO WARRANTY OF ANY KIND, INCLUDING THE * + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * + *****************************************************************************/ + +/***************************************************************************** + * Preprocessor Definitions + * ------------------------ + * APP_ENTRY_POINT + * + * Defines the application entry point function, if undefined this setting + * defaults to "main". + * + * USE_PROCESS_STACK + * + * If defined, thread mode will be configured to use the process stack if + * the size of the process stack is greater than zero bytes in length. + * + * INITIALIZE_STACK + * + * If defined, the contents of the stack will be initialized to a the + * value 0xCC. + * + * FULL_LIBRARY + * + * If defined then + * - argc, argv are setup by the debug_getargs. + * - the exit symbol is defined and executes on return from main. + * - the exit symbol calls destructors, atexit functions and then debug_exit. + * + * If not defined then + * - argc and argv are zero. + * - no exit symbol, code loops on return from main. + *****************************************************************************/ + +#ifndef APP_ENTRY_POINT +#define APP_ENTRY_POINT main +#endif + +#ifndef ARGSSPACE +#define ARGSSPACE 128 +#endif + + .global _start + .syntax unified + .extern APP_ENTRY_POINT +#ifdef FULL_LIBRARY + .global exit +#endif + + .section .init, "ax" + .code 16 + .align 2 + .thumb_func + +_start: +#ifdef __RAM_BUILD + ldr r1, =__stack_end__ + mov sp, r1 +#endif +#ifdef INITIALIZE_STACK + mov r2, #0xCC + ldr r0, =__stack_start__ +#ifndef __RAM_BUILD + mov r1, sp +#endif + bl memory_set +#endif + +#ifdef USE_PROCESS_STACK + /* Set up process stack if size > 0 */ + ldr r1, =__stack_process_end__ + ldr r0, =__stack_process_start__ + subs r2, r1, r0 + beq 1f + msr psp, r1 + mov r2, #2 + msr control, r2 +#ifdef INITIALIZE_STACK + mov r2, #0xCC + bl memory_set +#endif +1: +#endif + /* Copy initialised memory sections into RAM (if necessary). */ + ldr r0, =__data_load_start__ + ldr r1, =__data_start__ + ldr r2, =__data_end__ + bl memory_copy + ldr r0, =__text_load_start__ + ldr r1, =__text_start__ + ldr r2, =__text_end__ + bl memory_copy + ldr r0, =__fast_load_start__ + ldr r1, =__fast_start__ + ldr r2, =__fast_end__ + bl memory_copy + ldr r0, =__ctors_load_start__ + ldr r1, =__ctors_start__ + ldr r2, =__ctors_end__ + bl memory_copy + ldr r0, =__dtors_load_start__ + ldr r1, =__dtors_start__ + ldr r2, =__dtors_end__ + bl memory_copy + ldr r0, =__rodata_load_start__ + ldr r1, =__rodata_start__ + ldr r2, =__rodata_end__ + bl memory_copy + + /* Zero the bss. */ + ldr r0, =__bss_start__ + ldr r1, =__bss_end__ + mov r2, #0 + bl memory_set + + /* Zero the privileged data. */ + ldr r0, =__privileged_data_start__ + ldr r1, =__privileged_data_end__ + mov r2, #0 + bl memory_set + + /* Initialise the heap */ + ldr r0, = __heap_start__ + ldr r1, = __heap_end__ + sub r1, r1, r0 + mov r2, #0 + str r2, [r0] + add r0, r0, #4 + str r1, [r0] + + /* Call constructors */ + ldr r0, =__ctors_start__ + ldr r1, =__ctors_end__ +ctor_loop: + cmp r0, r1 + beq ctor_end + ldr r2, [r0] + add r0, #4 + push {r0-r1} + blx r2 + pop {r0-r1} + b ctor_loop +ctor_end: + + /* Setup initial call frame */ + mov r0, #0 + mov lr, r0 + mov r12, sp + +start: + /* Jump to application entry point */ +#ifdef FULL_LIBRARY + mov r0, #ARGSSPACE + ldr r1, =args + ldr r2, =debug_getargs + blx r2 + ldr r1, =args +#else + mov r0, #0 + mov r1, #0 +#endif + ldr r2, =APP_ENTRY_POINT + blx r2 + +#ifdef FULL_LIBRARY + .thumb_func +exit: + mov r5, r0 // save the exit parameter/return result + + /* Call destructors */ + ldr r0, =__dtors_start__ + ldr r1, =__dtors_end__ +dtor_loop: + cmp r0, r1 + beq dtor_end + ldr r2, [r0] + add r0, #4 + push {r0-r1} + blx r2 + pop {r0-r1} + b dtor_loop +dtor_end: + + /* Call atexit functions */ + ldr r2, =_execute_at_exit_fns + blx r2 + + /* Call debug_exit with return result/exit parameter */ + mov r0, r5 + ldr r2, =debug_exit + blx r2 +#endif + + /* Returned from application entry point, loop forever. */ +exit_loop: + b exit_loop + +memory_copy: + cmp r0, r1 + beq 2f + subs r2, r2, r1 + beq 2f +1: + ldrb r3, [r0] + add r0, r0, #1 + strb r3, [r1] + add r1, r1, #1 + subs r2, r2, #1 + bne 1b +2: + bx lr + +memory_set: + cmp r0, r1 + beq 1f + strb r2, [r0] + add r0, r0, #1 + b memory_set +1: + bx lr + +#ifdef FULL_LIBRARY + .bss +args: + .space ARGSSPACE +#endif + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/00index_e.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/00index_e.html new file mode 100644 index 0000000..478093c --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/00index_e.html @@ -0,0 +1,101 @@ + + + + + + + +ELM - FAT File System Module + + + +

FAT File System Module

+
+ +
+layer +

FatFs is a generic FAT file system module for small embedded systems. The FatFs is written in compliance with ANSI C and completely separated from the disk I/O layer. Therefore it is independent of hardware architecture. It can be incorporated into low cost microcontrollers, such as AVR, 8051, PIC, ARM, Z80 and etc..., without any change. Petit FatFs module is also available here.

+ +

Features

+
    +
  • Windows compatible FAT12/16/32 file system.
  • +
  • Platform independent. Easy to port.
  • +
  • Very small footprint for code and work area.
  • +
  • Various configuration options: +
      +
    • Multiple volumes (physical drives and partitions).
    • +
    • Multiple OEM code pages including DBCS.
    • +
    • Long file name (LFN) support in OEM code or Unicode.
    • +
    • RTOS support.
    • +
    • Multiple sector size support.
    • +
    • Read-only, minimized API, I/O buffer and etc...
    • +
    +
  • +
+
+ + +
+

Application Interface

+

FatFs module provides following functions to access the FAT volumes.

+ +
+ + +
+

Disk I/O Interface

+

Since the FatFs module is completely separated from disk I/O layer, it requires following functions to lower layer to read/write the physical disk and to get current time. The low level disk I/O module is not a part of FatFs module so that it must be provided by user. The sample drivers are also available in the resources.

+ +
+ + +
+

Resources

+

The FatFs module is a free software opened for education, research and development. You can use, modify and/or republish it for personal, non-profit use or commercial products without any restriction under your responsibility.

+ +
+ + + + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/00index_j.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/00index_j.html new file mode 100644 index 0000000..ea8e25c --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/00index_j.html @@ -0,0 +1,102 @@ + + + + + + + +ELM - ”Ä—pFATƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€Eƒ‚ƒWƒ…[ƒ‹ + + + +

FATƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€Eƒ‚ƒWƒ…[ƒ‹

+
+ +
+layer +

FatFs‚ͬ‹K–͂ȑg‚Ýž‚݃VƒXƒeƒ€Œü‚¯‚̔ėpFATƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€Eƒ‚ƒWƒ…[ƒ‹‚Å‚·BANSI C€‹’‚Ńn[ƒhƒEƒFƒAEƒA[ƒLƒeƒNƒ`ƒƒ‚ɂ͈ˑ¶‚µ‚È‚¢‚Ì‚ÅA•K—v‚ȃ[ƒNEƒGƒŠƒA‚ªŠm•Û‚Å‚«‚ê‚ÎA8051, PIC, AVR, SH, Z80, H8, ARM‚ȂLjÀ‰¿‚ȃ}ƒCƒRƒ“‚Å‚àŽg—p‰Â”\‚Å‚·BFatFs‚ðƒVƒ…ƒŠƒ“ƒN‚µ‚½‚Õ‚¿FatFs‚à‚ ‚è‚Ü‚·B

+

FatFsƒ‚ƒWƒ…[ƒ‹‚Ì“Á’¥

+
    +
  • WindowsŒÝŠ· FAT12/16/32ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€
  • +
  • ƒvƒ‰ƒbƒgƒtƒH[ƒ€”ñˆË‘¶
  • +
  • ƒRƒ“ƒpƒNƒg‚ȃR[ƒhEƒTƒCƒY‚ÆRAMŽg—p—Ê
  • +
  • ‘½‚­‚Ì\¬ƒIƒvƒVƒ‡ƒ“: +
      +
    • •¡”‚̃{ƒŠƒ…[ƒ€(•¨—ƒhƒ‰ƒCƒuE‹æ‰æ)
    • +
    • DBCS‚ðŠÜ‚Þ•¡”‚ÌOEMƒR[ƒhEƒy[ƒW
    • +
    • ’·‚¢ƒtƒ@ƒCƒ‹–¼(LFN)‘Ήž (Unicode API‚à‘I‘ð‰Â)
    • +
    • ƒ}ƒ‹ƒ`ƒ^ƒXƒN‘Ήž
    • +
    • ƒ}ƒ‹ƒ`EƒZƒNƒ^EƒTƒCƒY‘Ήž
    • +
    • ƒŠ[ƒhEƒIƒ“ƒŠ[Aˆê•”API‚ÌíœAƒoƒbƒtƒ@\¬A‚»‚Ì‘¼c
    • +
    +
  • +
+
+ + +
+

ãˆÊƒŒƒCƒ„I/F

+

FatFsƒ‚ƒWƒ…[ƒ‹‚ÍAŽŸ‚̃tƒ@ƒCƒ‹‘€ìŠÖ”‚ð’ñ‹Ÿ‚µ‚Ä‚¢‚Ü‚·B

+
    +
  • f_mount - ƒ[ƒNƒGƒŠƒA‚Ì“o˜^Eíœ
  • +
  • f_open - ƒtƒ@ƒCƒ‹‚̃I[ƒvƒ“Eì¬
  • +
  • f_close - ƒtƒ@ƒCƒ‹‚̃Nƒ[ƒY
  • +
  • f_read - ƒtƒ@ƒCƒ‹‚̓ǂݞ‚Ý
  • +
  • f_write - ƒtƒ@ƒCƒ‹‚Ì‘‚«ž‚Ý
  • +
  • f_lseek - R/Wƒ|ƒCƒ“ƒ^‚̈ړ®, ƒtƒ@ƒCƒ‹EƒTƒCƒY‚ÌŠg’£
  • +
  • f_truncate - ƒtƒ@ƒCƒ‹EƒTƒCƒY‚ÌØ‚è‹l‚ß
  • +
  • f_sync - ƒLƒƒƒbƒVƒ…‚³‚ꂽƒf[ƒ^‚̃tƒ‰ƒbƒVƒ…
  • +
  • f_opendir - ƒfƒBƒŒƒNƒgƒŠ‚̃I[ƒvƒ“
  • +
  • f_readdir - ƒfƒBƒŒƒNƒgƒŠ‚̓ǂÝo‚µ
  • +
  • f_getfree - ƒfƒBƒXƒN‹ó‚«—̈æ‚̎擾
  • +
  • f_stat - ƒtƒ@ƒCƒ‹EƒXƒe[ƒ^ƒX‚̎擾
  • +
  • f_mkdir - ƒfƒBƒŒƒNƒgƒŠ‚Ìì¬
  • +
  • f_unlink - ƒtƒ@ƒCƒ‹/ƒfƒBƒŒƒNƒgƒŠ‚Ìíœ
  • +
  • f_chmod - ƒtƒ@ƒCƒ‹/ƒfƒBƒŒƒNƒgƒŠ‚Ì‘®«‚Ì•ÏX
  • +
  • f_utime - ƒtƒ@ƒCƒ‹/ƒfƒBƒŒƒNƒgƒŠ‚̃^ƒCƒ€ƒXƒ^ƒ“ƒv‚Ì•ÏX
  • +
  • f_rename - ƒtƒ@ƒCƒ‹/ƒfƒBƒŒƒNƒgƒŠ‚Ì–¼‘O•ÏXEˆÚ“®
  • +
  • f_mkfs - ƒfƒBƒXƒN‚̃tƒH[ƒ}ƒbƒg
  • +
  • f_chdir - ƒJƒŒƒ“ƒgEƒfƒBƒŒƒNƒgƒŠ‚Ì•ÏX
  • +
  • f_chdrive - ƒJƒŒƒ“ƒgEƒhƒ‰ƒCƒu‚Ì•ÏX
  • +
  • f_forward - ƒtƒ@ƒCƒ‹Eƒf[ƒ^‚ðƒXƒgƒŠ[ƒ€ŠÖ”‚É’¼Ú“]‘—‚·‚é
  • +
  • f_gets - •¶Žš—ñ‚̓ǂݞ‚Ý
  • +
  • f_putc - •¶Žš‚Ì‘‚«ž‚Ý
  • +
  • f_puts - •¶Žš—ñ‚Ì‘‚«ž‚Ý
  • +
  • f_printf - ‘Ž®‰»•¶Žš—ñ‚Ì‘‚«ž‚Ý
  • +
+
+ + +
+

‰ºˆÊƒŒƒCƒ„I/F

+

FatFsƒ‚ƒWƒ…[ƒ‹‚ÍA•¨—ƒhƒ‰ƒCƒu“™‚ւ̃AƒNƒZƒX‚Ì‚½‚ßA‰ºˆÊƒŒƒCƒ„‚ÉŽŸ‚̃Cƒ“ƒ^[ƒtƒF[ƒX‚ð—v‹‚µ‚Ü‚·B‚»‚ꂼ‚ê‚Ì‹L˜^ƒƒfƒBƒA‚ɑΉž‚µ‚½ƒfƒBƒXƒNI/Oƒ‚ƒWƒ…[ƒ‹‚ÍAƒ†[ƒU‚É‚æ‚Á‚Ä—pˆÓ‚³‚ê‚é•K—v‚ª‚ ‚è‚Ü‚·BŽ‘—¿‚Ƀhƒ‰ƒCƒo‚ðŠÜ‚ÞƒTƒ“ƒvƒ‹EƒvƒƒWƒFƒNƒg‚ ‚èB

+
    +
  • disk_initialize - ƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚̉Šú‰»
  • +
  • disk_status - ƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚Ìó‘Ԏ擾
  • +
  • disk_read - ƒfƒBƒXƒN‚©‚ç‚̓ǂݞ‚Ý
  • +
  • disk_write - ƒfƒBƒXƒN‚Ö‚Ì‘‚«ž‚Ý
  • +
  • disk_ioctl - ‚»‚Ì‘¼‚̃hƒ‰ƒCƒu§Œä
  • +
  • get_fattime - “ú•tEŽž‚̎擾
  • +
+
+ + +
+

Ž‘—¿

+

FatFsƒ‚ƒWƒ…[ƒ‹‚̓tƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Æ‚µ‚Ä‹³ˆçEŒ¤‹†EŠJ”­—p‚ÉŒöŠJ‚µ‚Ä‚¢‚Ü‚·B‚ǂ̂悤‚È—˜—p–Ú“IiŒÂlE”ñ¤—pE¤—pj‚Å‚àŽg—pE‰ü•ÏE”z•z‚ɂ‚¢‚ÄˆêØ‚Ì§ŒÀ‚Í‚ ‚è‚Ü‚¹‚ñ‚ªA‘S‚Ä—˜—pŽÒ‚ÌÓ”C‚̉º‚ł̗˜—p‚Æ‚µ‚Ü‚·B

+ +
+ + +
+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/css_e.css b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/css_e.css new file mode 100644 index 0000000..b462e31 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/css_e.css @@ -0,0 +1,56 @@ +* {margin: 0; padding: 0; border-width: 0;} +body {margin: 8px; background-color: #e0ffff; font-color: black; font-family: serif; line-height: 133%; max-width: 1024px;} +a:link {color: blue;} +a:visited {color: darkmagenta;} +a:hover {background-color: #a0ffff;} +a:active {color: darkmagenta; position: relative; top: 1px; left: 1px;} +abbr {border-width: 1px;} + +p {margin: 0 0 0.3em 1em;} +em {font-style: normal; font-weight: bold; margin: 0 0.1em;} +pre em {font-style: italic; font-weight: normal;} +strong {} +pre {margin: 0.5em 1em; padding: 0.5em; line-height: 1.2em; background-color: white;} +tt {margin: 0 0.2em;} +ol {margin: 0 2.5em;} +ul {margin: 0 2em;} +dl {margin: 0 1em;} +dt {font-family: monospace;} +dl.par dt {margin: 0.5em 0 0 0 ; font-style: italic; } +dl.ret dt {margin: 0.5em 0 0 0 ; font-weight: bold;} +dd {margin: 0 2em;} +hr {border-width: 1px; margin: 1em;} +div.abst {font-family: sans-serif;} +div.para {clear: both; font-family: serif;} +.equ {text-indent: 0; margin: 1em 2em 1em;} +.indent {margin-left: 2em;} +.rset {float: right; margin: 0 0 0.5em 0.5em;} +.lset {float: left; margin: 0 0.5em 0.5em 0.5em;} +ul.flat li {list-style-type: none; margin: 0;} +a.imglnk img {border: 1px solid;} +.iequ {white-space: nowrap; font-weight: bold;} +.clr {clear: both;} +.it {font-style: italic;} +.mfd {font-size: 0.7em; padding: 0 1px; border: 1px solid; white-space : nowrap} + +h1 {line-height: 1em; font-size: 2em; font-family: sans-serif; padding: 0.3em 0 0.3em;} +p.hdd {float: right; text-align: right; margin-top: 0.5em;} +hr.hds {clear: both; margin-bottom: 1em;} + +h2 {font-size: 1.5em; font-family: sans-serif; margin: 0 0 0.5em;} +h3 {font-size: 1.5em; font-family: sans-serif; margin: 1.5em 0 0.5em;} +h4 {font-size: 1.2em; font-family: sans-serif; margin: 1em 0 0.2em;} +h5 {font-size: 1em; font-family: sans-serif; margin: 0.5em 0 0em;} +small {font-size: 80%;} +.indent {margin-left: 2em;} + +/* Tables */ +table {margin: 0.5em 1em; border-collapse: collapse; border-style: solid; border-width: 2px; border-color: black; } +th {background-color: white; border-style: solid; border-width: 1px 1px 2px; border-color: black; padding: 0 3px; vertical-align: top; white-space: nowrap;} +td {background-color: white; border-style: solid; border-width: 1px; border-color: black; padding: 0 3px; vertical-align: top; line-height: 1.3em;} +table.lst td:first-child {font-family: monospace;} +table.lst2 td {font-family: monospace;} +table caption {font-family: sans-serif; font-weight: bold;} +tr.lst3 td { border-width: 2px 1px 1px; } + +p.foot {clear: both; text-indent: 0; margin: 1em 0.5em 1em;} diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/css_j.css b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/css_j.css new file mode 100644 index 0000000..7a73e5a --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/css_j.css @@ -0,0 +1,59 @@ +@charset "Shift_JIS"; +/* Common style sheet for Tech Notes */ + +* {margin: 0; padding: 0; border-width: 0;} +body {margin: 8px; background-color: #e0ffff; font-color: black; font-family:"‚l‚r ‚o–¾’©", serif; line-height: 150%; letter-spacing: 1px; max-width: 1024px;} +a:link {color: blue;} +a:visited {color: darkmagenta;} +a:hover {background-color: #a0ffff;} +a:active {color: darkmagenta; position: relative; top: 1px; left: 1px;} +abbr {border-width: 1px;} + +p {text-indent: 1em; margin: 0 0 0.3em 0.5em;} +em {font-style: normal; font-weight: bold; margin: 0 0.1em;} +pre em {font-style: italic; font-weight: normal;} +strong {} +pre {margin: 0.5em 1em; padding: 0.5em; line-height: 1.2em; letter-spacing: 0; background-color: white;} +tt {margin: 0 0.2em; letter-spacing: 0;} +ol {margin: 0 2.5em;} +ul {margin: 0 2em;} +dl {margin: 0 1em;} +dt {font-family: monospace;} +dl.par dt {margin: 0.5em 0 0 0 ; font-style: italic; letter-spacing: 0;} +dl.ret dt {margin: 0.5em 0 0 0 ; font-family: monospace; letter-spacing: 0; font-weight: bold;} +dd {margin: 0 2em;} +hr {border-width: 1px; margin: 1em;} +div.abst {font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif;} +div.para {clear: both; font-family: "‚l‚r ‚o–¾’©",serif;} +.equ {text-indent: 0; margin: 1em 2em 1em;} +.indent {margin-left: 2em;} +.rset {float: right; margin: 0 0 0.5em 0.5em;} +.lset {float: left; margin: 0 0.5em 0.5em 0.5em;} +ul.flat li {list-style-type: none; margin: 0;} +a.imglnk img {border: 1px solid;} +.iequ {white-space: nowrap; font-weight: bold;} +.clr {clear: both;} +.it {font-style: italic;} +.mfd {font-size: 0.7em; padding: 0 1px; border: 1px solid; white-space : nowrap} + +h1 {line-height: 1em; font-size: 2em; font-family: sans-serif; padding: 0.3em 0 0.3em;} +p.hdd {float: right; text-align: right; margin-top: 0.5em;} +hr.hds {clear: both; margin-bottom: 1em;} + +h2 {font-size: 1.5em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 0 0 0.5em;} +h3 {font-size: 1.5em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 1.5em 0 0.5em;} +h4 {font-size: 1.2em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 1em 0 0.2em;} +h5 {font-size: 1em; font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif; margin: 0.5em 0 0em;} +small {font-size: 80%;} +.indent {margin-left: 2em;} + +/* Tables */ +table {margin: 0.5em 1em; border-collapse: collapse; border-style: solid; border-width: 2px; border-color: black; letter-spacing: 0;} +th {background-color: white; border-style: solid; border-width: 1px 1px 2px; border-color: black; padding: 0 3px; vertical-align: top;} +td {background-color: white; border-style: solid; border-width: 1px; border-color: black; padding: 0 3px; vertical-align: top; line-height: 1.3em;} +table.lst td:first-child {font-family: monospace; white-space: nowrap;} +table.lst2 td {font-family: monospace; white-space: nowrap;} +table caption {font-family: sans-serif; font-weight: bold;} +tr.lst3 td { border-width: 2px 1px 1px; } + +p.foot {clear: both; text-indent: 0; margin: 1em 0.5em 1em;} diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/appnote.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/appnote.html new file mode 100644 index 0000000..ff37d64 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/appnote.html @@ -0,0 +1,189 @@ + + + + + + + +FatFs Module Application Note + + + +

FatFs Module Application Note

+
+ +
+

Considerations on porting to various platform

+

The FatFs module is assuming following terms on portability.

+
    +
  • ANSI C
    +The FatFs module is a middleware that written in ANSI C. There is no platform dependence, so long as the compiler is in compliance with ANSI C.
  • +
  • Size of integer types
    +The FatFs module assumes that size of char/short/long are 8/16/32-bit and int is 16 or 32 bit. These correspondence are defined in integer.h. This will not be a problem on most compilers. When any conflict with existing definitions is occured, you must resolve it with care.
  • +
+
+ +
+

Memory Usage (R0.07e)

+
LocalRemoteStateRetransmissionsTimerFlags
+ + + + + + + + + + +
AVRH8/300HPICTLCS-870/CV850ESSH2ARM7TDMIx86
CompilerWinAVR(gcc)CH38C30(gcc)CC870CCA850SHCWinARM(gcc)VC6
_WORD_ACCESS10011001
text (Full, R/W)1219410559109241522976868727105647342
text (Min, R/W)79886903710899604884565165444764
text (Full, R/O)55324753502067603462377746243316
text (Min, R/O)40403631373650832556290732842510
bssD*2 + 2D*4 + 2D*2 + 2D*2 + 2D*4 + 2D*4 + 2D*4 + 2D*4 + 2
Work area
(_FS_TINY == 0)
D*560 +
F*544
D*560 +
F*550
D*560 +
F*544
D*560 +
F*550
D*560 +
F*550
D*560 +
F*550
D*560 +
F*550
Work area
(_FS_TINY == 1)
D*560 +
F*32
D*560 +
F*36
D*560 +
F*32
D*560 +
F*32
D*560 +
F*36
D*560 +
F*36
D*560 +
F*36
D*560 +
F*36
+

These are the memory usage on some target systems with following condition. The memory sizes are in unit of byte, D means number of volumes and F means number of open files. All samples are optimezed in code size.

+
+_FS_READONLY     0 (R/W), 1 (R/O)
+_FS_MINIMIZE     0 (Full function), 3 (Minimized function)
+_USE_STRFUNC     0 (Disable string functions)
+_USE_MKFS        0 (Disable f_mkfs function)
+_USE_FORWARD     0 (Disable f_forward function)
+_CODE_PAGE       932 (Japanese Shift-JIS)
+_USE_LFN         0 (Disable LFN)
+_LFN_UNICODE     0 (Disable Unicode API)
+_MAX_SS          512 (Single sector size)
+_FS_RPATH        0 (Disable relative path)
+_MULTI_PARTITION 0 (Single partition per drive)
+_FS_REENTRANT    0 (Disable reentrancy)
+
+ + +
+

Module Size Reduction

+

Follwing table shows which function is removed by configuration options for the module size reduction.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function_FS_MINIMIZE_FS_READONLY_USE_STRFUNC_FS_RPATH_USE_MKFS_USE_FORWARD
12310000
f_mount
f_open
f_close
f_read
f_writex
f_syncx
f_lseekx
f_opendirxx
f_readdirxx
f_statxxx
f_getfreexxxx
f_truncatexxxx
f_unlinkxxxx
f_mkdirxxxx
f_chmodxxxx
f_utimexxxx
f_renamexxxx
f_chdirx
f_chdrivex
f_mkfsxx
f_forwardx
f_putcxx
f_putsxx
f_printfxx
f_getsx
+
+ +
+

Long File Name

+

The FatFs module supports long file name (LFN) from revision 0.07. The two different file names, SFN and LFN, of a file is transparent in the file functions except for f_readdir function. To enable LFN feature, set _USE_LFN to 1 or 2, and add a Unicode code conversion function ff_convert and ff_wtoupper to the project. This function is available in cc*.c. The LFN feature requiers a certain working buffer in addition. The buffer size can be configured by _MAX_LFN corresponding to the available memory size. The size of long file name will reach up to 255 characters so that the _MAX_LFN should be set to 255 for full featured LFN operation. When the size of working buffer is insufficient for the given file name, the file function will fail with FR_INVALID_NAME. When enable the LFN feature with re-entrant feature, _USE_LFN must be set to 2. In this case, the file funciton allocates the working buffer on the stack. The working buffer occupies (_MAX_LFN + 1) * 2 bytes so that the caller's stack must be a sufficient size considering the working buffer.

+ + + + + + + + +
LFN cfg on ARM7
Code pageROM size [bytes]
SBCS+3721
932(Shift-JIS)+62609
936(GBK)+177797
949(Korean)+139857
950(Big5)+111497
+

When the LFN feature is enabled, the module size will be increased depends on the selected code page. Right table shows the difference in module size when LFN is enabled with some code pages. We are the Japanese, Chinese and Korean have tens of thousands of characters. Unfortunately, it requires a huge OEM-Unicode bidirectional conversion table and the module size will be drastically increased that shown in the table. As the result, the FatFs with LFN will not able to be implemented to most 8-bit microcontrollers including AVR. This is the reason why I had not been interested in implementing the LFN feature for a long time :-)

+

Note that the LFN feature on the FAT file system is a patent of Microsoft Corporation. When enable it on the commercial products, a license from Microsoft may be required depends on the final destination.

+
+ +
+

Re-entrancy

+

The file operations to the different volume can always work simultaneously regardless of re-entrancy setting. The re-entrancy to the same volume can be enabled with _FS_REENTRANT option. In this case, also the OS dependent synchronization object control functions, ff_cre_syncobj, ff_del_syncobj, ff_req_grant and ff_rel_grant must be added to the project. The sample code with documentation is available in syncobj.c.

+

When a file function is called while the volume is in use by any other task, the access is blocked until the task leaves file function. If wait time exceeded a period defined by _TIMEOUT, the file function will abort with FR_TIMEOUT. The timeout feature might not be supported on some RTOS.

+

There is an exception on f_mount and f_mkfs function. These functions are not re-entrant to the same volume. When use these functions, all other task must close the corresponding file on the volume and avoid to access the volume.

+

Note that this section describes on the re-entrancy of the FatFs module itself. There is no assumtion on the re-entrancy of low level disk I/O module.

+
+ +
+

Duplicated file access

+

FatFs module does not support the shareing controls of duplicated file access. It is permitted when open method to the file is only read mode. The duplicated open in write mode to a file is always prohibited and open file must not be renamed, deleted, otherwise the FAT structure on the volume can be collapted.

+
+ +
+

Performance effective file access

+

For good performance on reading/writing files on the small embedded system, application programmer should consider what process is done in the FatFs module. The file data on the disk is transferred in following sequence by f_read function.

+

Figure 1. Sector miss-aligned read (short)
+ +

+

Figure 2. Sector miss-aligned read (long)
+ +

+

Figure 3. Sector aligned read
+ +

+

The file I/O buffer means a sector buffer to read/write a partial data on the sector. The sector buffer is either file private sector buffer on each file object or shared sector buffer on the file system object. The buffer configuration option _FS_TINY determins which sector buffer is used for the file data transfer. When tiny buffer (1) is selected, data memory consumption is reduced 512 bytes each file object. In this case, FatFs module uses only a sector buffer on the file system object for file data transfer and FAT/directory access. The disadvantage of the tiny buffer configuration is: the FAT data cached in the sector buffer will be lost by file data transfer and it must be reloaded at every cluster boundary. However it will be suitable for most application from view point of the decent performance and low memory comsumption.

+

Figure 1 shows that partial sector data is transferred via the file I/O buffer. On long data transfer shown in Figure 2, middle of transfer data that covers one or more sector is transferred to application buffer directly. Figure 3 shows that the case of entier transfer data is aligned to the sector boundary. In this case, file I/O buffer is not used. On the direct transfer, the maximum extent of sectors are read with disk_read function at a time but the multi sector transfer never across the cluster boundary even if it is contiguous.

+

Therefore taking effort to sector aligned read/write accesss avoids buffered data transfer and the read/write performance will be improved. Besides the effect, cached FAT data will not be flushed by file data transfer on the tiny configuration so that it can achieve same performance as non tiny configuration with small memory footprint.

+
+ +
+

Critical Section

+

When write operation to the FAT file system is interrupted due to any accidental failure, such as sudden blackout, incorrect disk removal and unrecoverable disk error, the FAT structure can be collapted. Following images shows the critical section on the FatFs application.

+
+Figure 4. Long critical section
+fig.4 +
+
+Figure 5. Minimized critical section
+fig.5 +
+
+

An interruption in the red section can cause a cross link; as a result, the file/directory being changed may be lost. There is one or more possibility listed below when an interruption in the yellow section is occured.

+
    +
  • File data being rewrited is collapted.
  • +
  • A file being appended returns initial state.
  • +
  • A file created as new is gone.
  • +
  • A file created as new or in overwritten remains with length of zero.
  • +
  • Efficiency of disk use gets worse due to lost chain.
  • +
+

Each case does not affect the files that not in write mode open. To minimize risk of data loss, the critical section can be minimized like shown in Figure 5 by minimizing the time that file is opened in write mode or using f_sync function properly.

+
+ +
+

Unicode API

+

FatFs supports OEM code set on the API in default but FatFs can also switch the code set to Unicode. For more information, refer to the description in the file name.

+
+ + +
+

About FatFs License

+

This is a copy of the FatFs license document that included in the source codes.

+
/*----------------------------------------------------------------------------/
+/  FatFs - FAT file system module  R0.07e                    (C)ChaN, 2009
+/-----------------------------------------------------------------------------/
+/ FatFs module is a generic FAT file system module for small embedded systems.
+/ This is a free software that opened for education, research and commercial
+/ developments under license policy of following trems.
+/
+/  Copyright (C) 2009, ChaN, all right reserved.
+/
+/ * The FatFs module is a free software and there is NO WARRANTY.
+/ * No restriction on use. You can use, modify and redistribute it for
+/   personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY.
+/ * Redistributions of source code must retain the above copyright notice.
+/
+/-----------------------------------------------------------------------------/
+

Therefore FatFs license is one of the BSD-style license but there is a big difference. Because FatFs is for embedded projects, the conditions for redistributions in binary form, such as embedded code, hex file and binary library, are not specified to increase its usability. The documentation of the distributions need not include about FatFs and its license document, and it may also. Of course FatFs is compatible with the projects under GNU GPL. When redistribute it with any modification, the license can also be changed to GNU GPL or BSD license.

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/chdir.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/chdir.html new file mode 100644 index 0000000..b28c73a --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/chdir.html @@ -0,0 +1,87 @@ + + + + + + + +FatFs - f_chdir + + + + +
+

f_chdir

+

The f_chdir function changes the current directory of a drive.

+
+FRESULT f_chdir (
+  const XCHAR* Path /* Pointer to the path name */
+);
+
+
+ +
+

Parameters

+
+
Path
+
Pointer to the null-terminated string that specifies a directory to go.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The path name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT volume on the disk.
+
+
+ + +
+

Description

+

The f_chdir function changes the current directory of the logical drive. The current directory of a drive is initialized to the root directory when the drive is auto-mounted. Note that the current directory is retained in the each file system object so that it also affects other tasks that using the drive.

+
+ + +
+

QuickInfo

+

Available when _FS_RPATH == 1.

+
+ + +
+

Example

+
+    // Change current direcoty of the current drive (dir1 under root dir)
+    f_chdir("/dir1");
+
+    // Change current direcoty of drive 2 (parent dir)
+    f_chdir("2:..");
+
+
+ +
+

See Also

+

f_chdrive

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/chdrive.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/chdrive.html new file mode 100644 index 0000000..c3b599e --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/chdrive.html @@ -0,0 +1,61 @@ + + + + + + + +FatFs - f_chdrive + + + + +
+

f_chdrive

+

The f_chdrive function changes the current drive.

+
+FRESULT f_chdrive (
+  BYTE Drive /* Logical drive number */
+);
+
+
+ +
+

Parameters

+
+
Drive
+
Specifies the logical drive number to be set as the current drive.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
+
+ + +
+

Description

+

The f_chdrive function changes the current drive. The initial value of the current drive number is 0. Note that the current drive is retained in a static variable so that it also affects other tasks that using the file functions.

+
+ +
+

QuickInfo

+

Available when _FS_RPATH == 1.

+
+ + +
+

See Also

+

f_chdir

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/chmod.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/chmod.html new file mode 100644 index 0000000..d72e201 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/chmod.html @@ -0,0 +1,97 @@ + + + + + + + +FatFs - f_chmod + + + + +
+

f_chmod

+

The f_chmod function changes the attribute of a file or directory.

+
+FRESULT f_chmod (
+  const XCHAR* FileName, /* Pointer to the file or directory */
+  BYTE Attribute,        /* Attribute flags */
+  BYTE AttributeMask     /* Attribute masks */
+);
+
+
+ +
+

Parameters

+
+
FileName
+
Pointer to the null-terminated string that specifies a file or directory to be changed
+
Attribute
+
Attribute flags to be set in one or more combination of the following flags. The specified flags are set and others are cleard.
+ + + + + + +
AttributeDescription
AM_RDORead only
AM_ARCArchive
AM_SYSSystem
AM_HIDHidden
+
+
AttributeMask
+
Attribute mask that specifies which attribute is changed. The specified aattributes are set or cleard.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NO_FILE
+
Could not find the file.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The file name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_WRITE_PROTECTED
+
The medium is write protected.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT volume on the disk.
+
+
+ + +
+

Description

+

The f_chmod function changes the attribute of a file or directory.

+
+ + +
+

QuickInfo

+

Available when _FS_READONLY == 0 and _FS_MINIMIZE == 0.

+
+ + +
+

Example

+
+    // Set read-only flag, clear archive flag and others are retained.
+    f_chmod("file.txt", AR_RDO, AR_RDO | AR_ARC);
+
+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/close.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/close.html new file mode 100644 index 0000000..e69fece --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/close.html @@ -0,0 +1,68 @@ + + + + + + + +FatFs - f_close + + + + +
+

f_close

+

The f_close function closes an open file.

+
+FRESULT f_close (
+  FIL* FileObject     /* Pointer to the file object structure */
+);
+
+
+ +
+

Parameter

+
+
FileObject
+
Pointer to the open file object structure to be closed.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The file object has been closed successfuly.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_INVALID_OBJECT
+
The file object is invalid.
+
+
+ + +
+

Description

+

The f_close function closes an open file object. If any data has been written to the file, the cached information of the file is written back to the disk. After the function succeeded, the file object is no longer valid and it can be discarded. If the file object has been opened in read-only mode, it may be discarded without closing process by this function.

+
+ + +
+

QuickInfo

+

Always available.

+
+ + +
+

See Also

+

f_open, f_read, f_write, f_sync, FIL, FATFS

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dinit.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dinit.html new file mode 100644 index 0000000..5bf3870 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dinit.html @@ -0,0 +1,45 @@ + + + + + + + +FatFs - disk_initialize + + + + +
+

disk_initialize

+

The disk_initialize function initializes the disk drive.

+
+DSTATUS disk_initialize (
+  BYTE Drive           /* Physical drive number */
+);
+
+
+ +
+

Parameter

+
+
Drive
+
Specifies the physical drive number to initialize.
+
+
+ + +
+

Return Values

+

This function returns a disk status as the result. For details of the disk status, refer to the disk_status function.

+
+ +
+

Description

+

The disk_initialize function initializes a physical drive. When the function succeeded, STA_NOINIT flag in the return value is cleard.

+

This function is called from volume mount process in the FatFs module to manage the media change. Application program must not call this function while FatFs module is active, or FAT structure on the volume can be collapted. To re-initialize the file system, use f_mount function.

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dioctl.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dioctl.html new file mode 100644 index 0000000..cdd4f8c --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dioctl.html @@ -0,0 +1,68 @@ + + + + + + + +FatFs - disk_ioctl + + + + +
+

disk_ioctl

+

The disk_ioctl function cntrols device specified features and miscellaneous functions other than disk read/write.

+
+DRESULT disk_ioctl (
+  BYTE Drive,      /* Drive number */
+  BYTE Command,    /* Control command code */
+  void* Buffer     /* Data transfer buffer */
+);
+
+
+ +
+

Parameters

+
+
Drive
+
Specifies the drive number (0-9).
+
Command
+
Specifies the command code.
+
Buffer
+
Pointer to the parameter buffer depends on the command code. When it is not used, specify a NULL pointer.
+
+
+ + +
+

Return Value

+
+
RES_OK (0)
+
The function succeeded.
+
RES_ERROR
+
Any error occured.
+
RES_PARERR
+
Invalid command code.
+
RES_NOTRDY
+
The disk drive has not been initialized.
+
+
+ + +
+

Description

+

The FatFs module uses only device independent commands described below. Any device dependent function is not used.

+ + + + + + +
CommandDescription
CTRL_SYNCMake sure that the disk drive has finished pending write process. When the disk I/O module has a write back cache, flush the dirty sector immediately. This command is not required in read-only configuration.

+
GET_SECTOR_SIZEReturns sector size of the drive into the WORD variable pointed by Buffer. This command is not required in single sector size configuration, _MAX_SS is 512.
GET_SECTOR_COUNTReturns total sectors on the drive into the DWORD variable pointed by Buffer. This command is used in only f_mkfs function.
GET_BLOCK_SIZEReturns erase block size of the memory array in unit of sector into the DWORD variable pointed by Buffer. When the erase block size is unknown or magnetic disk device, return 1. This command is used in only f_mkfs function.
+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dread.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dread.html new file mode 100644 index 0000000..f0f6a79 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dread.html @@ -0,0 +1,58 @@ + + + + + + + +FatFs - disk_read + + + + +
+

disk_read

+

The disk_read function reads sector(s) from the disk drive.

+
+DRESULT disk_read (
+  BYTE Drive,          /* Physical drive number */
+  BYTE* Buffer,        /* Pointer to the read data buffer */
+  DWORD SectorNumber,  /* Start sector number */
+  BYTE SectorCount     /* Number of sectros to read */
+);
+
+
+ +
+

Parameters

+
+
Drive
+
Specifies the physical drive number.
+
Buffer
+
Pointer to the byte array to store the read data. The buffer size of number of bytes to be read, sector size * sector count, is required. The memory address specified by upper layer may or may not be aligned to word boundary.
+
SectorNumber
+
Specifies the start sector number in logical block address (LBA).
+
SectorCount
+
Specifies number of sectors to read. The value can be 1 to 255.
+
+
+ + +
+

Return Value

+
+
RES_OK (0)
+
The function succeeded.
+
RES_ERROR
+
Any hard error occured during the read operation and could not recover it.
+
RES_PARERR
+
Invalid parameter.
+
RES_NOTRDY
+
The disk drive has not been initialized.
+
+
+ + +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dstat.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dstat.html new file mode 100644 index 0000000..6b3a247 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dstat.html @@ -0,0 +1,47 @@ + + + + + + + +FatFs - disk_status + + + + +
+

disk_status

+

The disk_status function returns the current disk status.

+
+DSTATUS disk_status (
+  BYTE Drive     /* Physical drive number */
+);
+
+
+ +
+

Parameter

+
+
Drive
+
Specifies the physical drive number to be confirmed.
+
+
+ + +
+

Return Values

+

The disk status is returned in combination of following flags.

+
+
STA_NOINIT
+
Indicates that the disk drive has not been initialized. This flag is set on: system reset, disk removal and disk_initialize function failed, and cleared on: disk_initialize function succeeded.
+
STA_NODISK
+
Indicates that no medium in the drive. This is always cleared on fixed disk drive.
+
STA_PROTECTED
+
Indicates that the medium is write protected. This is always cleared on the drive that does not support write protect notch. Not valid when STA_NODISK is set.
+
+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dwrite.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dwrite.html new file mode 100644 index 0000000..2fac546 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/dwrite.html @@ -0,0 +1,66 @@ + + + + + + + +FatFs - disk_write + + + + +
+

disk_write

+

The disk_write writes sector(s) to the disk.

+
+DRESULT disk_write (
+  BYTE Drive,          /* Physical drive number */
+  const BYTE* Buffer,  /* Pointer to the write data (may be non aligned) */
+  DWORD SectorNumber,  /* Sector number to write */
+  BYTE SectorCount     /* Number of sectors to write */
+);
+
+
+ +
+

Parameters

+
+
Drive
+
Specifies the physical drive number.
+
Buffer
+
Pointer to the byte array to be written. The memory address specified by upper layer may or may not be aligned to word boundary.
+
SectorNumber
+
Specifies the start sector number in logical block address (LBA).
+
SectorCount
+
Specifies the number of sectors to write. The value can be 1 to 255.
+
+
+ + +
+

Return Values

+
+
RES_OK (0)
+
The function succeeded.
+
RES_ERROR
+
Any hard error occured during the write operation and could not recover it.
+
RES_WRPRT
+
The medium is write protected.
+
RES_PARERR
+
Invalid parameter.
+
RES_NOTRDY
+
The disk drive has not been initialized.
+
+
+ + +
+

Description

+

This function is not required in read only configuration.

+
+ + +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/fattime.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/fattime.html new file mode 100644 index 0000000..7e15797 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/fattime.html @@ -0,0 +1,50 @@ + + + + + + + +FatFs - get_fattime + + + + +
+

get_fattime

+

The get_fattime function gets current time.

+
+DWORD get_fattime (void);
+
+
+ + +
+

Return Value

+

Currnet time is returned with packed into a DWORD value. The bit field is as follows:

+
+
bit31:25
+
Year from 1980 (0..127)
+
bit24:21
+
Month (1..12)
+
bit20:16
+
Day in month(1..31)
+
bit15:11
+
Hour (0..23)
+
bit10:5
+
Minute (0..59)
+
bit4:0
+
Second / 2 (0..29)
+
+
+ + +
+

Description

+

The get_fattime function must return any valid time even if the system does not support a real time clock. If a zero is returned, the file will not have a valid time. This fucntion is not required in read only configuration.

+
+ + +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/filename.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/filename.html new file mode 100644 index 0000000..00b8626 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/filename.html @@ -0,0 +1,68 @@ + + + + + + + +FatFs - Path Names + + + + +
+

Format of the path names

+

The path name format on the FatFs module is similer to the filename specs of DOS/Windos as follows:

+
+ "[drive#:][/]directory/file"
+
+

The FatFs module supports long file name (LFN) and 8.3 format file name (SFN). The LFN can be used when LFN feature is enabled (_USE_LFN > 0). The differences between DOS/Windows are directory separator and logical drive number. The sub directories are separated with a / or \. The logical drive is specified in a numeral with a colon. When the drive number is omitted, it is assumed as default drive (0 or current drive). Leading/embedded spaces in the given path name are valid as a part of the name on LFN configuration but they are recognized as end of the path name on non-LFN configuration.

+

In default configuration (_FS_RPATH == 0), it does not have a concept of current directory like OS oriented file system. All objects on the volume are always specified in full path name that follows from the root directory. Dot directory names are not allowed. Heading separator is ignored and it can be exist or omitted. The default drive number is fixed to 0.

+

When relative path feature is enabled (_FS_RPATH == 1), specified path is followed from the root directory if a heading separator is exist. If not, the path is followed from the current directory set with f_chdir function. Dot names are also allowed for the directory name. The default drive number is the current drive number set with f_chdrive function.

+ + + + + + + + + + + + + +
Path name_FS_RPATH == 0_FS_RPATH == 1
file.txtA file in the root directory on the drive 0A file in the current directory on the current drive
/file.txtA file in the root directory on the drive 0A file in the root directory on the current drive
The root directory on the drive 0The current directory on the current drive
2:The root directory on the drive 2The current directory on the drive 2
2:file.txtA file in the root directory on the drive 2A file in the current directory on the drive 2
2:/The root directory on the drive 2The root directory on the drive 2
../file.txtInvalid nameA file in the parent directory
.Invalid nameThis directory
..Invalid nameParent directory of the current directory
dir1/..Invalid nameThe current directory
/..Invalid nameInvalid name (Cannot use dot names at the root directory)
+
+ +


+
+

Unicode API

+

The path names are input/output in either OEM code (SBCS/DBCS) or Unicode depends on the configuration options. The type of arguments that specifies the file names are defined as XCHAR which is an alias of char in default. The code set of the file name string is the OEM code set specifid by _CODE_PAGE. When _LFN_UNICODE is set to 1 under LFN configuration, the type of the XCHAR is switched to unsigned short (wide character) to support Unicode. In this case, the LFN feature is fully supported and the Unicode specific characters, such as âœâ˜ªâœ¡â˜¸â˜­, can also be used for the path name.

+
+ +


+
+

Correspondence between logical and physical drives

+

The FatFs module has work areas that called file system object for each volume (logical drive). In default, the logical drive is bound to the physical drive that has same drive number, and the first partition is mounted. When _MULTI_PARTITION == 1 is specified in configuration option, each individual logical drive can be bound to any physical drive/partition. In this case, a drive number resolution table must be defined as follows:

+
+Example: Logical drive 0-2 are assigned to three pri-partitions on the physical drive 0 (fixed disk)
+         Logical drive 3 is assigned to physical drive 1 (removable disk)
+
+const PARTITION Drives[] = {
+    {0, 0},     /* Logical drive 0 ==> Physical drive 0, 1st partition */
+    {0, 1},     /* Logical drive 1 ==> Physical drive 0, 2nd partition */
+    {0, 2},     /* Logical drive 2 ==> Physical drive 0, 3rd partition */
+    {1, 0}      /* Logical drive 3 ==> Physical drive 1 */
+};
+
+

There are some considerations when use _MULTI_PARTITION configuration.

+
    +
  • Only pri-partition (0-3) can be mounted.
  • +
  • When the physical drive has no partition table (SFD format), the partition number is ignored.
  • +
  • The physical drive that has two or more logical drives must be a fixed drive.
  • +
+
+ + + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/forward.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/forward.html new file mode 100644 index 0000000..581e50e --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/forward.html @@ -0,0 +1,142 @@ + + + + + + + +FatFs - f_forward + + + + +
+

f_forward

+

The f_forward function reads the file data and forward it to the data streaming device.

+
+FRESULT f_forward (
+  FIL* FileObject,                 /* File object */
+  UINT (*Func)(const BYTE*,UINT),  /* Data streaming function */
+  UINT ByteToFwd,                  /* Number of bytes to forward */
+  UINT* ByteFwd                    /* Number of bytes forwarded */
+);
+
+
+ +
+

Parameters

+
+
FileObject
+
Pointer to the open file object.
+
Func
+
Pointer to the user-defined data streaming function. For details, refer to the sample code.
+
ByteToFwd
+
Number of bytes to forward in range of UINT.
+
ByteFwd
+
Pointer to the UINT variable to return number of bytes forwarded.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_DENIED
+
The function denied due to the file has been opened in non-read mode.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_INVALID_OBJECT
+
The file object is invalid.
+
+
+ + +
+

Description

+

The f_forward function reads the data from the file and forward it to the outgoing stream without data buffer. This is suitable for small memory system because it does not require any data buffer at application module. The file pointer of the file object increases in number of bytes forwarded. In case of *ByteFwd < ByteToFwd without error, it means the requested bytes could not be transferred due to end of file or stream goes busy during data transfer.

+
+ + +
+

QuickInfo

+

Available when _USE_FORWARD == 1 and _FS_TINY == 1.

+
+ + +
+

Example (Audio playback)

+
+/*-----------------------------------------------------------------------*/
+/* Sample code of data transfer function to be called from f_forward     */
+/*-----------------------------------------------------------------------*/
+
+UINT out_stream (   /* Returns number of bytes sent or stream status */
+    const BYTE *p,  /* Pointer to the data block to be sent */
+    UINT btf        /* >0: Transfer call (Number of bytes to be sent). 0: Sense call */
+)
+{
+    UINT cnt = 0;
+
+
+    if (btf == 0) {     /* Sense call */
+        /* Return stream status (0: Busy, 1: Ready) */
+        /* When once it returned ready to sense call, it must accept a byte at least */
+        /* at subsequent transfer call, or f_forward will fail with FR_INT_ERROR. */
+        if (FIFO_READY) cnt = 1;
+    }
+    else {              /* Transfer call */
+        do {    /* Repeat while there is any data to be sent and the stream is ready */
+            FIFO_PORT = *p++;
+            cnt++;
+        } while (cnt < btf && FIFO_READY);
+    }
+
+    return cnt;
+}
+
+
+/*-----------------------------------------------------------------------*/
+/* Sample code using f_forward function                                  */
+/*-----------------------------------------------------------------------*/
+
+FRESULT play_file (
+    char *fn        /* Pointer to the audio file name to be played */
+)
+{
+    FRESULT rc;
+    FIL fil;
+    UINT dmy;
+
+    /* Open the audio file in read only mode */
+    rc = f_open(&fil, fn, FA_READ);
+
+    /* Repeat until the file pointer reaches end of the file */
+    while (rc == FR_OK && fil.fptr < fil.fsize) {
+
+        /* any other processes... */
+
+        /* Fill output stream periodicaly or on-demand */
+        rc = f_forward(&fil, out_stream, 1000, &dmy);
+    }
+
+    /* The read-only file object may be discarded without close */
+    return rc;
+}
+
+
+ + +
+

See Also

+

f_open, fgets, f_write, f_close, FIL

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/getfree.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/getfree.html new file mode 100644 index 0000000..26ca344 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/getfree.html @@ -0,0 +1,101 @@ + + + + + + + +FatFs - f_getfree + + + + +
+

f_getfree

+

The f_getfree function gets number of the free clusters.

+
+FRESULT f_getfree (
+  const XCHAR* Path,        /* Root directory of the drive */
+  DWORD* Clusters,          /* Pointer to the variable to store number of free clusters */
+  FATFS** FileSystemObject  /* Pointer to pointer to file system object */
+);
+
+
+ +
+

Parameters

+
+
Path
+
Pinter to the null-terminated string that specifies the root directory of the logical drive.
+
Clusters
+
Pointer to the DWORD variable to store number of free clusters.
+
FileSystemObject
+
Pointer to pointer that to store a pointer to the corresponding file system object.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded. The *Clusters has number of free clusters and *FileSystemObject points the file system object.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT partition on the disk.
+
+
+ + +
+

Descriptions

+

The f_getfree function gets number of free clusters on the drive. The member csize in the file system object is refrecting number of sectors per cluster, so that the free space in unit of sector can be calcurated with this. When FSInfo structure on FAT32 volume is not in sync, this function can return an incorrect free cluster count.

+
+ + +
+

QuickInfo

+

Available when _FS_READONLY == 0 and _FS_MINIMIZE == 0.

+
+ + +
+

Example

+
+    FATFS *fs;
+    DWORD fre_clust, fre_sect, tot_sect;
+
+
+    /* Get drive information and free clusters */
+    res = f_getfree("/", &fre_clust, &fs);
+    if (res) die(res);
+
+    /* Get total sectors and free sectors */
+    tot_sect = (fs->max_clust - 2) * fs->csize;
+    fre_sect = fre_clust * fs->csize;
+
+    /* Print free space in unit of KB (assuming 512B/sector) */
+    printf("%lu KB total drive space.\n"
+           "%lu KB available.\n",
+           fre_sect / 2, tot_sect / 2);
+
+
+ + +
+

See Also

+

FATFS

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/gets.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/gets.html new file mode 100644 index 0000000..1df618a --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/gets.html @@ -0,0 +1,63 @@ + + + + + + + +FatFs - f_gets + + + + +
+

f_gets

+

The f_gets reads a string from the file.

+
+char* f_gets (
+  char* Str,        /* Read buffer */
+  int Size,         /* Size of the read buffer */
+  FIL* FileObject   /* File object */
+);
+
+
+ +
+

Parameters

+
+
Str
+
Pointer to read buffer to store the read string.
+
Size
+
Size of the read buffer.
+
FileObject
+
Pointer to the open file object structure.
+
+
+ + +
+

Return Values

+

When the function succeeded, Str will be returuned.

+
+ + +
+

Description

+

The f_gets() is a wrapper function of f_read(). The read operation continues until a '\n' is stored, reached end of file or buffer is filled with Size - 1 characters. The read string is terminated with a '\0'. When the file has reached end of the file or any error occured during read operation, f_gets() returns a NULL. The EOF and error status can be examined with f_eof() and f_error() macro.

+
+ + +
+

QuickInfo

+

Available when _USE_STRFUNC is 1 or 2. When it is set to 2, '\r's contained in the file are stripped out.

+
+ + + + +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/lseek.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/lseek.html new file mode 100644 index 0000000..3639f64 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/lseek.html @@ -0,0 +1,111 @@ + + + + + + + +FatFs - f_lseek + + + + +
+

f_lseek

+

The f_lseek function moves the file read/write pointer of an open file object. It can also be used to increase the file size (cluster pre-allocation).

+ +
+FRESULT f_lseek (
+  FIL* FileObject,   /* Pointer to the file object structure */
+  DWORD Offset       /* File offset in unit of byte */
+);
+
+
+ +
+

Parameters

+
+
FileObject
+
Pointer to the open file object.
+
Offset
+
Number of bytes where from start of the file
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_INVALID_OBJECT
+
The file object is invalid.
+
+
+ + +
+

Description

+

The f_lseek function moves the file R/W pointer of an open file. The offset can be specified in only origin from top of the file. When an offset above the file size is specified in write mode, the file size is increased and the data in the expanded area is undefined. This is suitable to create a large file quickly, for fast write operation. After the f_lseek function succeeded, member fptr in the file object should be checked in order to make sure the R/W pointer has been moved correctry. In case of fptr is not the expected value, either of followings has been occured.

+
    +
  • End of file. The specified Offset was clipped at the file size because the file has been opened in read-only mode.
  • +
  • Disk full. There is insufficient free space on the volume to expand the file size.
  • +
+
+ + +
+

QuickInfo

+

Available when _FS_MINIMIZE <= 2.

+
+ + +
+

Example

+
+    /* Move to offset of 5000 from top of the file */
+    res = f_lseek(file, 5000);
+
+    /* Move to end of the file to append data */
+    res = f_lseek(file, file->fsize);
+
+    /* Forward 3000 bytes */
+    res = f_lseek(file, file->fptr + 3000);
+
+    /* Rewind 2000 bytes (take care on overflow) */
+    res = f_lseek(file, file->fptr - 2000);
+
+
+    /* Cluster pre-allocation (to prevent buffer overrun on streaming write) */
+
+    res = f_open(file, recfile, FA_CREATE_NEW | FA_WRITE); /* Create a file */
+
+    res = f_lseek(file, PRE_SIZE);         /* Pre-allocate clusters */
+    if (res || file->fptr != PRE_SIZE) ... /* Check if the file size has been increased correctly */
+
+    res = f_lseek(file, DATA_START);       /* Record data stream without cluster allocation delay */
+    ...
+
+    res = f_truncate(file);                /* Truncate unused area */
+    res = f_lseek(file, 0);                /* Put file header */
+    ...
+
+    res = f_close(file);
+
+
+ + +
+

See Also

+

f_open, f_truncate, FIL

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/mkdir.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/mkdir.html new file mode 100644 index 0000000..c76991d --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/mkdir.html @@ -0,0 +1,89 @@ + + + + + + + +FatFs - f_mkdir + + + + +
+

f_mkdir

+

The f_mkdir function creates a new directory.

+
+FRESULT f_mkdir (
+  const XCHAR* DirName /* Pointer to the directory name */
+);
+
+
+ +
+

Parameter

+
+
DirName
+
Pointer to the null-terminated string that specifies the directory name to create.
+
+
+ + +
+

Return Value

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The path name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_DENIED
+
The directory cannot be created due to directory table or disk is full.
+
FR_EXIST
+
A file or directory that has same name is already existing.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_WRITE_PROTECTED
+
The medium is write protected.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT volume on the disk.
+
+
+ + +
+

Description

+

The f_mkdir function creates a new directory.

+
+ + +
+

QuickInfo

+

Available when _FS_READONLY == 0 and _FS_MINIMIZE == 0.

+
+ + +
+

Example

+
+    res = f_mkdir("sub1");
+    if (res) die(res);
+    res = f_mkdir("sub1/sub2");
+    if (res) die(res);
+    res = f_mkdir("sub1/sub2/sub3");
+    if (res) die(res);
+
+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/mkfs.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/mkfs.html new file mode 100644 index 0000000..dd860bb --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/mkfs.html @@ -0,0 +1,78 @@ + + + + + + + +FatFs - f_mkfs + + + + +
+

f_mkfs

+

The f_mkfs fucntion creates a file system on the drive.

+
+FRESULT f_mkfs (
+  BYTE  Drive,            /* Logical drive number */
+  BYTE  PartitioningRule, /* Partitioning rule */
+  WORD  AllocSize         /* Size of the allocation unit */
+);
+
+
+ +
+

Parameters

+
+
Drive
+
Logical drive number (0-9) to be formatted.
+
PartitioningRule
+
When 0 is given, a partition table is created into the first sector on the drive and then the file system is created on the partition. This is called FDISK format and used for harddisk and memory card. When 1 is given, the file system starts from the first sector without partition table. This is often called super floppy disk (SFD) format and used for floppy disk and removable disk.
+
AllocSize
+
Specifies allocation unit size in number of bytes per cluster. The value must be 0 or power of 2 in range of from 512 to 32768. When 0 is specified, the cluster size is determined depends on the volume size. FAT64 (64KB/cluster on FAT16) cannot be created by this function.
+
+
+ +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The drive cannot work due to any reason.
+
FR_WRITE_PROTECTED
+
The drive is write protected.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_MKFS_ABORTED
+
The function aborted before start in format due to a reason as follows. +
    +
  • The disk size is too small.
  • +
  • Invalid parameter was given to any parameter.
  • +
  • Not allowable cluster size for this drive. This can occure when number of clusters becomes around 0xFF7 and 0xFFF7.
  • +
+
+
+
+ +
+

Description

+

The f_mkfs function creates a FAT file system on the drive. There are two partitioning rules, FDISK and SFD, for removable media. It can be selected with an argument. The FDISK format is recommended for the most case. This function currently does not support multiple partition, so that existing partitions on the physical dirve will be deleted and re-created a new partition occupies entire disk space.

+

The FAT sub-type, FAT12/FAT16/FAT32, is determined by number of clusters on the drive and nothing else, according to the FAT specification issued by Microsoft. Thus which FAT sub-type is selected, is depends on the volume size and the specified cluster size. The cluster size affects performance of the file system and large cluster increases the performance.

+
+ + +
+

QuickInfo

+

Available when _FS_READOLNY == 0 and _USE_MKFS == 1.

+
+ + +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/mount.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/mount.html new file mode 100644 index 0000000..aa80f3b --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/mount.html @@ -0,0 +1,65 @@ + + + + + + + +FatFs - f_mount + + + + +
+

f_mount

+

The f_mount fucntion registers/unregisters a work area to the FatFs module.

+
+FRESULT f_mount (
+  BYTE  Drive,              /* Logical drive number */
+  FATFS*  FileSystemObject  /* Pointer to the work area */
+);
+
+
+ +
+

Parameters

+
+
Drive
+
Logical drive number (0-9) to register/unregister the work area.
+
FileSystemObject
+
Pointer to the work area (file system object) to be registered.
+
+
+ +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
+
+ + +
+

Description

+

The f_mount function registers/unregisters a work area to the FatFs module. The work area must be given to the each volume with this function prior to use any other file function. To unregister a work area, specify a NULL to the FileSystemObject, and then the work area can be discarded.

+

This function only initializes the given work area and registers its address to the internal table, any access to the disk I/O layer does not occure. The volume mount process is performed on first file access after f_mount function or media change.

+
+ + +
+

QuickInfo

+

Always available.

+
+ + +
+

See Also

+

FATFS

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/open.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/open.html new file mode 100644 index 0000000..33d6d9c --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/open.html @@ -0,0 +1,148 @@ + + + + + + + +FatFs - f_open + + + + +
+

f_open

+

The f_open function creates a file object to be used to access the file.

+
+FRESULT f_open (
+  FIL* FileObject,       /* Pointer to the blank file object structure */
+  const XCHAR* FileName, /* Pointer to the file neme */
+  BYTE ModeFlags         /* Mode flags */
+);
+
+
+ +
+

Parameters

+
+
FileObject
+
Pointer to the file object structure to be created.
+
FileName
+
Pointer to a null-terminated string that specifies the file name to create or open.
+
ModeFlags
+
Specifies the type of access and open method for the file. It is specified by a combination of following flags.
+ + + + + + + + +
ValueDescription
FA_READSpecifies read access to the object. Data can be read from the file.
Combine with FA_WRITE for read-write access.
FA_WRITESpecifies write access to the object. Data can be written to the file.
Combine with FA_READ for read-write access.
FA_OPEN_EXISTINGOpens the file. The function fails if the file is not existing. (Default)
FA_OPEN_ALWAYSOpens the file, if it is existing. If not, a new file is created.
FA_CREATE_NEWCreates a new file. The function fails if the file is already existing.
FA_CREATE_ALWAYSCreates a new file. If the file is existing, it is truncated and overwritten.
+
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded and the file object is valid.
+
FR_NO_FILE
+
Could not find the file.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The file name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_EXIST
+
The file is already existing.
+
FR_DENIED
+
The required access was denied due to one of the following reasons: +
  • Write mode open of a read-only file.
  • +
  • File cannot be created due to a read-only file or same name directory is existing.
  • +
  • File cannot be created due to the directory table or disk is full.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_WRITE_PROTECTED
+
Write mode open or creation under the medium is write protected.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT volume on the disk.
+
+
+ + +
+

Description

+

A file object is created when the function succeeded. The file object is used for subsequent read/write functions to refer to the file. When close an open file object, use f_close function. If the modified file is not closed, the file may be collapsed.

+

Before using any file function, a work area (file system object) must be given to the logical drive with f_mount function. All file functions can work after this procedure.

+
+ + +
+

QuickInfo

+

Always available. The mode flags, FA_WRITE, FA_CREATE_ALWAYS, FA_CREATE_NEW, FA_OPEN_ALWAYS, are not available when _FS_READONLY == 1.

+
+ + +
+

Example (File Copy)

+
+void main (void)
+{
+    FATFS fs[2];         /* Work area (file system object) for logical drives */
+    FIL fsrc, fdst;      /* file objects */
+    BYTE buffer[4096];   /* file copy buffer */
+    FRESULT res;         /* FatFs function common result code */
+    UINT br, bw;         /* File R/W count */
+
+
+    /* Register work area for logical drives */
+    f_mount(0, &fs[0]);
+    f_mount(1, &fs[1]);
+
+    /* Open source file on the drive 1 */
+    res = f_open(&fsrc, "1:srcfile.dat", FA_OPEN_EXISTING | FA_READ);
+    if (res) die(res);
+
+    /* Create destination file on the drive 0 */
+    res = f_open(&fdst, "0:dstfile.dat", FA_CREATE_ALWAYS | FA_WRITE);
+    if (res) die(res);
+
+    /* Copy source to destination */
+    for (;;) {
+        res = f_read(&fsrc, buffer, sizeof(buffer), &br);
+        if (res || br == 0) break;   /* error or eof */
+        res = f_write(&fdst, buffer, br, &bw);
+        if (res || bw < br) break;   /* error or disk full */
+    }
+
+    /* Close open files */
+    f_close(&fsrc);
+    f_close(&fdst);
+
+    /* Unregister work area prior to discard it */
+    f_mount(0, NULL);
+    f_mount(1, NULL);
+}
+
+
+ + +
+

See Also

+

f_read, f_write, f_close, FIL, FATFS

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/opendir.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/opendir.html new file mode 100644 index 0000000..eb180f2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/opendir.html @@ -0,0 +1,79 @@ + + + + + + + +FatFs - f_opendir + + + + +
+

f_opendir

+

The f_opendir function opens a directory.

+
+FRESULT f_opendir (
+  DIR* DirObject,       /* Pointer to the blank directory object structure */
+  const XCHAR* DirName  /* Pointer to the directory name */
+);
+
+
+ +
+

Parameters

+
+
DirObject
+
Pointer to the blank directory object to be created.
+
DirName
+
Pinter to the null-terminated string that specifies the directory name to be opened.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded and the directory object is created. It is used for subsequent calls to read the directory entries.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The path name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT volume on the disk.
+
+
+ + +
+

Description

+

The f_opendir function opens an exsisting directory and creates the directory object for subsequent calls. The directory object structure can be discarded at any time without any procedure.

+
+ + +
+

QuickInfo

+

Available when _FS_MINIMIZE <= 1.

+
+ + +
+

See Also

+

f_readdir, DIR

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/printf.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/printf.html new file mode 100644 index 0000000..a672662 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/printf.html @@ -0,0 +1,82 @@ + + + + + + + +FatFs - f_printf + + + + +
+

f_printf

+

The f_printf function writes formatted string to the file.

+
+int f_printf (
+  FIL* FileObject,     /* File object */
+  const char* Foramt,  /* Format stirng */
+  ...
+);
+
+
+ +
+

Parameters

+
+
FileObject
+
Pointer to the open file object structure.
+
Format
+
Pointer to the null-terminated format string.
+
...
+
Optional arguments.
+ +
+
+ + +
+

Return Values

+

When the function succeeded, number of characters written is returned. When the function failed due to disk full or any error, an EOF will be returned.

+
+ + +
+

Description

+

The f_printf() is a wrapper function of f_putc() and f_puts(). The format control directive is a sub-set of standard library shown as follos:

+
    +
  • Type: c s d u X
  • +
  • Size: l
  • +
  • Flag: 0
  • +
+
+ + +
+

QuickInfo

+

Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, '\n's contained in the output are converted to "\r\n".

+
+ + +
+

Example

+
+    f_printf(&fil, "%6d", -200);         /* "  -200" */
+    f_printf(&fil, "%02u", 5);           /* "05" */
+    f_printf(&fil, "%ld", 12345678L);    /* "12345678" */
+    f_printf(&fil, "%08lX", 1194684UL);  /* "00123ABC" */
+    f_printf(&fil, "%s", "String");      /* "String" */
+    f_printf(&fil, "%c", 'a');           /* "a" */
+
+
+ + +
+

See Also

+

f_open, f_putc, f_puts, f_gets, f_close, FIL

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/putc.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/putc.html new file mode 100644 index 0000000..374e677 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/putc.html @@ -0,0 +1,60 @@ + + + + + + + +FatFs - f_putc + + + + +
+

f_putc

+

The f_putc funciton puts a character to the file.

+
+int f_putc (
+  int Chr,          /* A character to put */
+  FIL* FileObject   /* File object */
+);
+
+
+ +
+

Parameters

+
+
Chr
+
A character to be put.
+
FileObject
+
Pointer to the open file object structuer.
+
+
+ + +
+

Return Values

+

When the character was written successfuly, the function returns the character. When the function failed due to disk full or any error, an EOF will be returned.

+
+ + +
+

Description

+

The f_putc() is a wrapper function of f_write().

+
+ + +
+

QuickInfo

+

Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, a '\n' is converted to "\r\n".

+
+ + +
+

See Also

+

f_open, f_puts, f_printf, f_gets, f_close, FIL

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/puts.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/puts.html new file mode 100644 index 0000000..7aca04b --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/puts.html @@ -0,0 +1,60 @@ + + + + + + + +FatFs - f_puts + + + + +
+

f_puts

+

The f_puts function writes a string to the file.

+
+int f_puts (
+  const char* Str,  /* String */
+  FIL* FileObject   /* File object */
+);
+
+
+ +
+

Parameters

+
+
Str
+
Pointer to the null terminated string to be written. The null character will not be written.
+
FileObject
+
Pointer to the open file object structure.
+
+
+ + +
+

Return Value

+

When the function succeeded, number of characters written that is not minus value is returned. When the function failed due to disk full or any error, an EOF will be returned.

+
+ + +
+

Description

+

The f_puts() is a wrapper function of f_putc().

+
+ + +
+

QuickInfo

+

Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, '\n's contained in the string are converted to "\r\n".

+
+ + +
+

See Also

+

f_open, f_putc, f_printf, f_gets, f_close, FIL

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/read.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/read.html new file mode 100644 index 0000000..ef01573 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/read.html @@ -0,0 +1,79 @@ + + + + + + + +FatFs - f_read + + + + +
+

f_read

+

The f_read function reads data from a file.

+
+FRESULT f_read (
+  FIL* FileObject,    /* Pointer to the file object structure */
+  void* Buffer,       /* Pointer to the buffer to store read data */
+  UINT ByteToRead,    /* Number of bytes to read */
+  UINT* ByteRead      /* Pointer to the variable to return number of bytes read */
+);
+
+
+ +
+

Parameters

+
+
FileObject
+
Pointer to the open file object.
+
Buffer
+
Pointer to the buffer to store read data
+
ByteToRead
+
Number of bytes to read in range of UINT.
+
ByteRead
+
Pointer to the UINT variable to return number of bytes read. The value is always valid after the function call regardless of the result.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_DENIED
+
The function denied due to the file has been opened in non-read mode.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_INVALID_OBJECT
+
The file object is invalid.
+
+
+ + +
+

Description

+

The file pointer of the file object increases in number of bytes read. After the function succeeded, *ByteRead should be checked to detect the end of file. In case of *ByteRead < ByteToRead, it means the R/W pointer reached end of the file during read operation.

+
+ + +
+

QuickInfo

+

Always available.

+
+ + +
+

See Also

+

f_open, fgets, f_write, f_close, FIL

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/readdir.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/readdir.html new file mode 100644 index 0000000..b37193f --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/readdir.html @@ -0,0 +1,119 @@ + + + + + + + +FatFs - f_readdir + + + + +
+

f_readdir

+

The f_readdir function reads directory entries.

+
+FRESULT f_readdir (
+  DIR* DirObject,    /* Pointer to the open directory object */
+  FILINFO* FileInfo  /* Pointer to the file information structure */
+);
+
+
+ +
+

Parameters

+
+
DirObject
+
Pointer to the open directory object.
+
FileInfo
+
Pointer to the file information structure to store the read item.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_INVALID_OBJECT
+
The directory object is invalid.
+
+
+ + +
+

Description

+

The f_readdir function reads directory entries in sequence. All items in the directory can be read by calling f_readdir function repeatedly. When all directory entries have been read and no item to read, the function returns a null string into f_name[] member without any error. When a null pointer is given to the FileInfo, the read index of the directory object will be rewinded.

+

When LFN feature is enabled, lfname and lfsize in the file information structure must be initialized with valid value prior to use the f_readdir function. The lfname is a pointer to the string buffer to return the long file name. The lfsize is the size of the string buffer in unit of character. If either the size of read buffer or LFN working buffer is insufficient for the LFN or the object has no LFN, a null string will be returned to the LFN read buffer. If the LFN contains any charactrer that cannot be converted to OEM code, a null string will be returned but this is not the case on Unicode API configuration. When lfname is a NULL, nothing of the LFN is returned. When the object has no LFN, any small capitals can be contained in the SFN.

+

When relative path feature is enabled (_FS_RPATH == 1), "." and ".." entries are not filtered out and it will appear in the read entries.

+
+ + +
+

QuickInfo

+

Available when _FS_MINIMIZE <= 1.

+
+ + +
+

Sample Code

+
+FRESULT scan_files (char* path)
+{
+    FRESULT res;
+    FILINFO fno;
+    DIR dir;
+    int i;
+    char *fn;
+#if _USE_LFN
+    static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1];
+    fno.lfname = lfn;
+    fno.lfsize = sizeof(lfn);
+#endif
+
+
+    res = f_opendir(&dir, path);
+    if (res == FR_OK) {
+        i = strlen(path);
+        for (;;) {
+            res = f_readdir(&dir, &fno);
+            if (res != FR_OK || fno.fname[0] == 0) break;
+            if (fno.fname[0] == '.') continue;
+#if _USE_LFN
+            fn = *fno.lfname ? fno.lfname : fno.fname;
+#else
+            fn = fno.fname;
+#endif
+            if (fno.fattrib & AM_DIR) {
+                sprintf(&path[i], "/%s", fn);
+                res = scan_files(path);
+                if (res != FR_OK) break;
+                path[i] = 0;
+            } else {
+                printf("%s/%s\n", path, fn);
+            }
+        }
+    }
+
+    return res;
+}
+
+
+ + +
+

See Also

+

f_opendir, f_stat, FILINFO, DIR

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/rename.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/rename.html new file mode 100644 index 0000000..4a2de3b --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/rename.html @@ -0,0 +1,93 @@ + + + + + + + +FatFs - f_rename + + + + +
+

f_rename

+

Renames an object.

+
+FRESULT f_rename (
+  const XCHAR* OldName, /* Pointer to old object name */
+  const XCHAR* NewName  /* Pointer to new object name */
+);
+
+
+ +
+

Parameters

+
+
OldName
+
Pointer to a null-terminated string specifies the old object name to be renamed.
+
NewName
+
Pointer to a null-terminated string specifies the new object name without drive number.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NO_FILE
+
Could not find the old name.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The file name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_EXIST
+
The new name is colliding with an existing name.
+
FR_DENIED
+
The new name could not be created due to any reason.
+
FR_WRITE_PROTECTED
+
The medium is write protected.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT volume on the disk.
+
+
+ + +
+

Description

+

Renames an object and can also move it to other directory. The logical drive number is determined by old name, new name must not contain a logical drive number. Do not rename open objects.

+
+ + +
+

QuickInfo

+

Available when _FS_READONLY == 0 and _FS_MINIMIZE == 0.

+
+ + +
+

Example

+
+    /* Rename an object */
+    f_rename("oldname.txt", "newname.txt");
+
+    /* Rename and move an object to other directory */
+    f_rename("oldname.txt", "dir1/newname.txt");
+
+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sdir.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sdir.html new file mode 100644 index 0000000..fe4f8ff --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sdir.html @@ -0,0 +1,36 @@ + + + + + + + +FatFs - DIR + + + + +
+

DIR

+

The DIR structure is used for the work area to read a directory by f_oepndir, f_readdir function. There is no member that can be changed by application.

+
+typedef struct _DIR_ {
+    FATFS*  fs;         /* Pointer to the owner file system object */
+    WORD    id;         /* Owner file system mount ID */
+    WORD    index;      /* Current read/write index number */
+    DWORD   sclust;     /* Table start cluster (0:Static table) */
+    DWORD   clust;      /* Current cluster */
+    DWORD   sect;       /* Current sector */
+    BYTE*   dir;        /* Pointer to the current SFN entry in the win[] */
+    BYTE*   fn;         /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */
+#if _USE_LFN
+    WCHAR*  lfn;        /* Pointer to the LFN working buffer */
+    WORD    lfn_idx;    /* Last matched LFN index (0xFFFF:No LFN) */
+#endif
+} DIR;
+
+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sfatfs.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sfatfs.html new file mode 100644 index 0000000..fb9dad8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sfatfs.html @@ -0,0 +1,53 @@ + + + + + + + +FatFs - FATFS + + + + +
+

FATFS

+

The FATFS structure holds dynamic work area of individual logical drives. It is given by application program and registerd/unregisterd to the FatFs module with f_mount function. Following members are in standard configuration. There is no member that can be changed from the application program.

+
+typedef struct _FATFS_ {
+    BYTE    fs_type;    /* FAT sub type */
+    BYTE    drive;      /* Physical drive number */
+    BYTE    csize;      /* Number of sectors per cluster */
+    BYTE    n_fats;     /* Number of FAT copies */
+    BYTE    wflag;      /* win[] dirty flag (1:must be written back) */
+    BYTE    fsi_flag;   /* fsinfo dirty flag (1:must be written back) */
+    WORD    id;         /* File system mount ID */
+    WORD    n_rootdir;  /* Number of root directory entries (0 on FAT32) */
+#if _FS_REENTRANT
+    _SYNC_t sobj;       /* Identifier of sync object */
+#endif
+#if _MAX_SS != 512
+    WORD    s_size;     /* Sector size */
+#endif
+#if !_FS_READONLY
+    DWORD   last_clust; /* Last allocated cluster */
+    DWORD   free_clust; /* Number of free clusters */
+    DWORD   fsi_sector; /* fsinfo sector */
+#endif
+#if _FS_RPATH
+    DWORD   cdir;       /* Current directory (0:root)*/
+#endif
+    DWORD   sects_fat;  /* Sectors per fat */
+    DWORD   max_clust;  /* Maximum cluster# + 1. Number of clusters is max_clust - 2 */
+    DWORD   fatbase;    /* FAT start sector */
+    DWORD   dirbase;    /* Root directory start sector (Cluster# on FAT32) */
+    DWORD   database;   /* Data start sector */
+    DWORD   winsect;    /* Current sector appearing in the win[] */
+    BYTE    win[_MAX_SS];/* Disk access window for Directory/FAT */
+} FATFS;
+
+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sfile.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sfile.html new file mode 100644 index 0000000..c6af008 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sfile.html @@ -0,0 +1,42 @@ + + + + + + + +FatFs - FIL + + + + +
+

FIL

+

The FIL structure (file object) holds state of an open file. It is initialzed by f_open function and discarded by f_close function. There is no member that can be changed by the application program.

+ +
+typedef struct _FIL_ {
+    FATFS*  fs;         /* Pointer to the owner file system object */
+    WORD    id;         /* Owner file system mount ID */
+    BYTE    flag;       /* File status flags */
+    BYTE    csect;      /* Sector address in the cluster */
+    DWORD   fptr;       /* File R/W pointer */
+    DWORD   fsize;      /* File size */
+    DWORD   org_clust;  /* File start cluster */
+    DWORD   curr_clust; /* Current cluster */
+    DWORD   dsect;      /* Current data sector */
+#if !_FS_READONLY
+    DWORD   dir_sect;   /* Sector containing the directory entry */
+    BYTE*   dir_ptr;    /* Ponter to the directory entry in the window */
+#endif
+#if !_FS_TINY
+    BYTE    buf[_MAX_SS];/* File R/W buffer */
+#endif
+} FIL;
+
+ +
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sfileinfo.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sfileinfo.html new file mode 100644 index 0000000..ab3e887 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sfileinfo.html @@ -0,0 +1,69 @@ + + + + + + + +FatFs - FILINFO + + + + +
+

FILINFO

+

The FILINFO structure holds a file information returned by f_stat and f_readdir function.

+
+typedef struct _FILINFO_ {
+    DWORD fsize;      /* File size */
+    WORD  fdate;      /* Last modified date */
+    WORD  ftime;      /* Last modified time */
+    BYTE  fattrib;    /* Attribute */
+    char  fname[13];  /* Short file name (8.3 format) */
+#if _USE_LFN
+    XCHAR* lfname;    /* Pointer to the LFN buffer */
+    int   lfsize;     /* Size of LFN buffer [characters] */
+#endif
+} FILINFO;
+
+
+ +

Members

+
+
fsize
+
Indicates size of the file in unit of byte. This is always zero when it is a directory.
+
fdate
+
Indicates the date that the file was modified or the directory was created.
+
+
bit15:9
+
Year origin from 1980 (0..127)
+
bit8:5
+
Month (1..12)
+
bit4:0
+
Day (1..31)
+
+
+
ftime
+
Indicates the time that the file was modified or the directory was created.
+
+
bit15:11
+
Hour (0..23)
+
bit10:5
+
Minute (0..59)
+
bit4:0
+
Second / 2 (0..29)
+
+
+
fattrib
+
Indicates the file/directory attribute in combination of AM_DIR, AM_RDO, AM_HID, AM_SYS and AM_ARC.
+
fname[]
+
Indicates the file/directory name in 8.3 format null-terminated string. It is always returnd with upper case on non-LFN configuration but it can be returned with lower case on LFN configuration.
+
lfname
+
Pointer to the LFN buffer to store the read LFN. This member must be initialized by application prior to use this structure. Not available on non-LFN configuration.
+
lfsize
+
Size of the LFN buffer in unit of chars. This member must be initialized by application prior to use this structure. Not available on non-LFN configuration.
+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/stat.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/stat.html new file mode 100644 index 0000000..7f92754 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/stat.html @@ -0,0 +1,75 @@ + + + + + + + +FatFs - f_stat + + + + +
+

f_stat

+

The f_stat gets the file status.

+
+FRESULT f_stat (
+  const XCHAR* FileName,  /* Pointer to the file or directory name */
+  FILINFO* FileInfo       /* Pointer to the FILINFO structure */
+);
+
+
+ +
+

Parameters

+
+
FileName
+
Pointer to the null-terminated string that specifies the file or directory to get its information.
+
FileInfo
+
Pointer to the blank FILINFO structure to store the information.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NO_FILE
+
Could not find the file or directory.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The file name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT volume on the disk.
+
+
+ + +
+

Description

+

The f_stat gets the information of a file or directory. For details of the infomation, refer to the FILINFO structure and f_readdir function. This function is not supported in minimization level of >= 1.

+
+ + +
+

References

+

f_opendir, f_readdir, FILINFO

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sync.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sync.html new file mode 100644 index 0000000..21b9953 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/sync.html @@ -0,0 +1,68 @@ + + + + + + + +FatFs - f_sync + + + + +
+

f_sync

+

The f_sync function flushes the cached information of a writing file.

+
+FRESULT f_sync (
+  FIL* FileObject     /* Pointer to the file object */
+);
+
+
+ +
+

Parameter

+
+
FileObject
+
Pointer to the open file object to be flushed.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_INVALID_OBJECT
+
The file object is invalid.
+
+
+ + +
+

Description

+

The f_sync function performs the same process as f_close function but the file is left opened and can continue read/write/seek operations to the file. This is suitable for the applications that open files for a long time in write mode, such as data logger. Performing f_sync of periodic or immediataly after f_write can minimize the risk of data loss due to a sudden blackout or an unintentional disk removal. However f_sync immediataly before f_close has no advantage because f_close performs f_sync in it. In other words, the differnce between those functions is that the file object is invalidated or not.

+
+ + +
+

QuickInfo

+

Available when _FS_READONLY == 0.

+
+ + +
+

See Also

+

f_close

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/truncate.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/truncate.html new file mode 100644 index 0000000..cb6f0b0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/truncate.html @@ -0,0 +1,71 @@ + + + + + + + +FatFs - f_truncate + + + + +
+

f_truncate

+

The f_truncate function truncates the file size.

+
+FRESULT f_truncate (
+  FIL* FileObject     /* Pointer to the file object */
+);
+
+
+ +
+

Parameter

+
+
FileObject
+
Pointer to the open file object to be truncated.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_DENIED
+
The file has been opened in read-only mode.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_INVALID_OBJECT
+
The file object is invalid.
+
+
+ + +
+

Description

+

The f_truncate function truncates the file size to the current file R/W point. When the file R/W pointer is already pointing end of the file, this function has no effect.

+
+ + +
+

QuickInfo

+

Available when _FS_READONLY == 0 and _FS_MINIMIZE == 0.

+
+ + +
+

See Also

+

f_open, f_lseek, FIL

+
+ + +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/unlink.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/unlink.html new file mode 100644 index 0000000..8755680 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/unlink.html @@ -0,0 +1,78 @@ + + + + + + + +FatFs - f_unlink + + + + +
+

f_unlink

+

The f_unlink removes an object.

+
+FRESULT f_unlink (
+  const XCHAR* FileName  /* Pointer to the object name */
+);
+
+
+ +
+

Parameter

+
+
FileName
+
Pointer to the null-terminated string that specifies an object to be removed.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NO_FILE
+
Could not find the file or directory.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The path name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_DENIED
+
The function was denied due to either of following reasons: +
  • The object has read-only attribute
  • The directory is not empty.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_WRITE_PROTECTED
+
The medium is write protected.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT volume on the disk.
+
+
+ + +
+

Description

+

The f_unlink function removes an object. Do not remove open objects and current directory.

+
+ + +
+

QuickInfo

+

Available when _FS_READONLY == 0 and _FS_MINIMIZE == 0.

+
+ + +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/utime.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/utime.html new file mode 100644 index 0000000..9c596f5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/utime.html @@ -0,0 +1,83 @@ + + + + + + + +FatFs - f_utime + + + + +
+

f_utime

+

The f_utime function changes the timestamp of a file or directory.

+
+FRESULT f_utime (
+  const XCHAR* FileName,   /* Pointer to the file or directory path */
+  const FILINFO* TimeDate  /* Time and data to be set */
+);
+
+
+ +
+

Parameters

+
+
FileName
+
Pointer to the null-terminated string that specifies a file or directory to be changed.
+
TimeDate
+
Pointer to the file information structure that has a timestamp to be set in member fdate and ftime. Do not care any other members.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NO_FILE
+
Could not find the file.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The file name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_WRITE_PROTECTED
+
The medium is write protected.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT volume on the disk.
+
+
+ + +
+

Description

+

The f_utime function changes the timestamp of a file or directory

+
+ + +
+

QuickInfo

+

Available when _FS_READONLY == 0 and _FS_MINIMIZE == 0.

+
+ + +
+

See Also

+

f_stat, FILINFO

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/write.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/write.html new file mode 100644 index 0000000..291c046 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/en/write.html @@ -0,0 +1,79 @@ + + + + + + + +FatFs - f_write + + + + +
+

f_write

+

The f_write writes data to a file.

+
+FRESULT f_write (
+  FIL* FileObject,     /* Pointer to the file object structure */
+  const void* Buffer,  /* Pointer to the data to be written */
+  UINT ByteToWrite,    /* Number of bytes to write */
+  UINT* ByteWritten    /* Pointer to the variable to return number of bytes written */
+);
+
+
+ +
+

Parameters

+
+
FileObject
+
Pointer to the open file object structure.
+
Buffer
+
Pointer to the data to be written.
+
ByteToWrite
+
Specifies number of bytes to write in range of UINT.
+
ByteWritten
+
Pointer to the UINT variable to return the number of bytes written. The value is always valid after the function call regardless of the result.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_DENIED
+
The function denied due to the file has been opened in non-write mode.
+
FR_DISK_ERR
+
The function failed due to an error in the disk function.
+
FR_INT_ERR
+
The function failed due to a wrong FAT structure or an internal error.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_INVALID_OBJECT
+
The file object is invalid.
+
+
+ + +
+

Description

+

The R/W pointer in the file object is increased in number of bytes written. After the function succeeded, *ByteWritten should be checked to detect the disk full. In case of *ByteWritten < ByteToWrite, it means the volume got full during the write operation.

+
+ + +
+

QuickInfo

+

Available when _FS_READONLY == 0.

+
+ + +
+

See Also

+

f_open, f_read, fputc, fputs, fprintf, f_close, FIL

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f1.png b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f1.png new file mode 100644 index 0000000..42cc271 Binary files /dev/null and b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f1.png differ diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f2.png b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f2.png new file mode 100644 index 0000000..8ef0ec2 Binary files /dev/null and b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f2.png differ diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f3.png b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f3.png new file mode 100644 index 0000000..9111bfc Binary files /dev/null and b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f3.png differ diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f4.png b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f4.png new file mode 100644 index 0000000..f9a6b46 Binary files /dev/null and b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f4.png differ diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f5.png b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f5.png new file mode 100644 index 0000000..b110b29 Binary files /dev/null and b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/f5.png differ diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/layers.png b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/layers.png new file mode 100644 index 0000000..d485d6b Binary files /dev/null and b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/layers.png differ diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/rwtest.png b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/rwtest.png new file mode 100644 index 0000000..a34bf06 Binary files /dev/null and b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/rwtest.png differ diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/rwtest2.png b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/rwtest2.png new file mode 100644 index 0000000..aeb38be Binary files /dev/null and b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/img/rwtest2.png differ diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/appnote.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/appnote.html new file mode 100644 index 0000000..216872f --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/appnote.html @@ -0,0 +1,194 @@ + + + + + + + +FatFsモジュール アプリケーション・ノート + + + +

FatFsモジュール アプリケーション・ノート

+
+ +
+

ãƒãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã®éš›ã«é…æ…®ã™ã¹ãã“ã¨

+

FatFsモジュールã¯ç§»æ¤æ€§ã«é–¢ã—ã¦æ¬¡ã®ç‚¹ã‚’剿ã¨ã—ã¦ã„ã¾ã™ã€‚

+
    +
  • 処ç†ç³»ã¯ANSI C準拠ã§ã‚ã‚‹ã“ã¨ã€‚
    +FatFsモジュールã¯ANSI C準拠ã§è¨˜è¿°ã•れã¦ã„ã‚‹ã®ã§ã€ANSI C準拠ã®ã‚³ãƒ³ãƒ‘イラãªã‚‰ç‰¹ã«å‡¦ç†ç³»ä¾å­˜ãªç‚¹ã¯ã‚りã¾ã›ã‚“。
  • +
  • char/short/longã®ã‚µã‚¤ã‚ºã¯ã€ãれãžã‚Œ8/16/32ビットã§ã€intã¯16ã¾ãŸã¯32ビットã§ã‚ã‚‹ã“ã¨ã€‚
    +サイズを明示ã™ã‚‹æ•´æ•°ã®åž‹ãŒ integer.h 内ã§å®šç¾©ã•れã¦ã„ã¾ã™ã€‚æ•´æ•°ã®åž‹ã¨ã‚µã‚¤ã‚ºã«é–¢ã—ã¦ã¯ã€ã¾ã£ã¨ã†ãªå‡¦ç†ç³»ãªã‚‰å•題ãªã„ã¯ãšã§ã™ãŒã€æ—¢å­˜ã®å®šç¾©ã¨è¡çªã—ãŸå ´åˆã¯ãƒ¦ãƒ¼ã‚¶ã«ã‚ˆã£ã¦è§£æ±ºã•れãªã‘れã°ãªã‚Šã¾ã›ã‚“。
  • +
+
+ +
+

ãƒ¡ãƒ¢ãƒªä½¿ç”¨é‡ (R0.07e)

+ + + + + + + + + + + +
AVRH8/300HPICTLCS-870/CV850ESSH2ARM7TDMIx86
CompilerWinAVR(gcc)CH38C30(gcc)CC870CCA850SHCWinARM(gcc)VC6
_WORD_ACCESS10011001
text (Full, R/W)1219410559109241522976868727105647342
text (Min, R/W)79886903710899604884565165444764
text (Full, R/O)55324753502067603462377746243316
text (Min, R/O)40403631373650832556290732842510
bssD*2 + 2D*4 + 2D*2 + 2D*2 + 2D*4 + 2D*4 + 2D*4 + 2D*4 + 2
Work area
(_FS_TINY == 0)
D*560 +
F*544
D*560 +
F*550
D*560 +
F*544
D*560 +
F*550
D*560 +
F*550
D*560 +
F*550
D*560 +
F*550
Work area
(_FS_TINY == 1)
D*560 +
F*32
D*560 +
F*36
D*560 +
F*32
D*560 +
F*32
D*560 +
F*36
D*560 +
F*36
D*560 +
F*36
D*560 +
F*36
+

上ã®è¡¨ã«ã„ãã¤ã‹ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã«ãŠã‘るメモリ使用é‡ã®ä¾‹ã‚’示ã—ã¾ã™ã€‚ãƒ†ã‚¹ãƒˆæ™‚ã®æ§‹æˆã‚ªãƒ—ã‚·ãƒ§ãƒ³ã¯æ¬¡ã®é€šã‚Šã§ã™ã€‚数値ã®å˜ä½ã¯ãƒã‚¤ãƒˆã§ã€Dã¯è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–æ•°ã€Fã¯åŒæ™‚オープン・ファイル数を示ã—ã¾ã™ã€‚ã‚³ãƒ³ãƒ‘ã‚¤ãƒ©ã®æœ€é©åŒ–オプションã¯ã‚³ãƒ¼ãƒ‰ãƒ»ã‚µã‚¤ã‚ºã¨ã—ã¦ã„ã¾ã™ã€‚

+
+_FS_READONLY     0 (R/W), 1 (R/O)
+_FS_MINIMIZE     0 (Full function), 3 (Minimized function)
+_USE_STRFUNC     0 (Disable string functions)
+_USE_MKFS        0 (Disable f_mkfs function)
+_USE_FORWARD     0 (Disable f_forward function)
+_CODE_PAGE       932 (Japanese Shift-JIS)
+_USE_LFN         0 (Disable LFN)
+_LFN_UNICODE     0 (Disable Unicode API)
+_MAX_SS          512 (Single sector size)
+_FS_RPATH        0 (Disable relative path)
+_MULTI_PARTITION 0 (Single partition per drive)
+_FS_REENTRANT    0 (Disable reentrancy)
+
+
+ +
+

モジュール・サイズã®ç¸®å°

+

次ã®è¡¨ã¯æ§‹æˆã‚ªãƒ—ションã®è¨­å®šå€¤ã«ã‚ˆã‚Šã©ã®æ©Ÿèƒ½ãŒå‰Šé™¤ã•れるã‹ã‚’示ã—ã¾ã™ã€‚

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Function_FS_MINIMIZE_FS_READONLY_USE_STRFUNC_FS_RPATH_USE_MKFS_USE_FORWARD
12310000
f_mount
f_open
f_close
f_read
f_writex
f_syncx
f_lseekx
f_opendirxx
f_readdirxx
f_statxxx
f_getfreexxxx
f_truncatexxxx
f_unlinkxxxx
f_mkdirxxxx
f_chmodxxxx
f_utimexxxx
f_renamexxxx
f_chdirx
f_chdrivex
f_mkfsxx
f_forwardx
f_putcxx
f_putsxx
f_printfxx
f_getsx
+
+ +
+

é•·ã„ファイルå

+

FatFsモジュールã¯R0.07ã‹ã‚‰é•·ã„ファイルå(LFN)をサãƒãƒ¼ãƒˆã—ã¾ã—ãŸã€‚ファイルã«ä»˜ã‘られãŸ2ã¤ã®ç•°ãªã‚‹åå‰(短ã„ファルåã¨é•·ã„ファイルå)ã¯ã€f_readdir関数を除ãファイルæ“作関数ã«ãŠã„ã¦é€éŽã§ã™ã€‚LFN機能を有効ã«ã™ã‚‹ã«ã¯ã€_USE_LFNã‚’1ã¾ãŸã¯2ã«è¨­å®šã—ã€Unicode変æ›é–¢æ•° ff_convert, ff_wtoupper をプロジェクトã«è¿½åŠ ã—ã¾ã™ã€‚ã“れらã®é–¢æ•°ã¯ã€cc*.cã«å«ã¾ã‚Œã¦ã„ã¾ã™ã€‚LFN機能ã¯ã€åŠ ãˆã¦ã‚る程度ã®ãƒ¯ãƒ¼ã‚¯ãƒ»ã‚¨ãƒªã‚¢(LFNæ“作ãƒãƒƒãƒ•ã‚¡)ã‚’å¿…è¦ã¨ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ã‚¡é•·ã¯ä½¿ç”¨ã§ãるメモリã«å¿œã˜ã¦_MAX_LFNã‚ªãƒ—ã‚·ãƒ§ãƒ³ã§æ§‹æˆã•れるã“ã¨ãŒã§ãã¾ã™ã€‚LFNã®é•·ã•ã¯æœ€å¤§255文字ã«é”ã™ã‚‹ã®ã§ã€LFN完全対応ã®ãŸã‚ã«ã¯_MAX_LFNã¯255ã«è¨­å®šã•れるã¹ãã§ã™ã€‚与ãˆã‚‰ã‚ŒãŸãƒ•ァイルåã«å¯¾ã—ã¦ãƒãƒƒãƒ•ã‚¡é•·ãŒä¸è¶³ã—ãŸå ´åˆã€ãƒ•ァイル関数ã¯FR_INVALID_NAMEã§å¤±æ•—ã—ã¾ã™ã€‚

+

LFN機能をリエントラント構æˆã§ä½¿ç”¨ã™ã‚‹å ´åˆã¯ã€_USE_LFNã¯2ã«è¨­å®šã•れãªã‘れã°ãªã‚Šã¾ã›ã‚“。ã“ã®å ´åˆã€ãƒ•ァイル関数ã¯ãƒãƒƒãƒ•ァをスタックã«ç¢ºä¿ã—ã¾ã™ã€‚ãƒãƒƒãƒ•ァ・サイズã¯ã€(_MAX_LFN + 1) * 2ãƒã‚¤ãƒˆã«ãªã‚‹ã®ã§ã€å‘¼ã³å‡ºã—å´ã‚¹ã‚¿ãƒƒã‚¯ã®ã‚µã‚¤ã‚ºã¯ãれを考慮ã—ãŸå分ãªã‚µã‚¤ã‚ºã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。

+ + + + + + + + +
LFN cfg on ARM7
コードページROMサイズ[bytes]
SBCS+3721
932(Shift-JIS)+62609
936(GBK)+177797
949(Korean)+139857
950(Big5)+111497
+

LFNを有効ã«ã™ã‚‹ã¨ã€é¸æŠžã•れãŸã‚³ãƒ¼ãƒ‰ãƒ»ãƒšãƒ¼ã‚¸ã«å¿œã˜ã¦ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãƒ»ã‚µã‚¤ã‚ºãŒå¢—大ã•れã¾ã™ã€‚å³ã®è¡¨ã«å„コード・ページã«ãŠã‘ã‚‹LFNを有効ã«ã—ãŸã¨ãã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãƒ»ã‚µã‚¤ã‚ºã®é•ã„を示ã—ã¾ã™ã€‚ç§ãŸã¡æ—¥æœ¬äººã€ä¸­å›½äººãŠã‚ˆã³éŸ“å›½äººã¯æ•°ä¸‡ã®æ–‡å­—ã‚’æŒã¡ã¾ã™ã€‚ä¸å¹¸ãªã“ã¨ã«ã€ãれã¯å·¨å¤§ãªOEMï¼Unicode相互変æ›ãƒ†ãƒ¼ãƒ–ãƒ«ã‚’è¦æ±‚ã—ã€ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ãƒ»ã‚µã‚¤ã‚ºã¯åŠ‡çš„ã«å¢—大ã•れã¾ã™ã€‚ãã®çµæžœã€LFNを有効ã«ã—ãŸFatFsモジュールã¯ã€AVRã‚’å«ã‚€æ®†ã©ã®8ビット・マイコンã«ã‚¤ãƒ³ãƒ—リメントã•れるã“ã¨ãŒã§ãã¾ã›ã‚“。ã“れã¯é•·ã„é–“ç§ãŒLFNをインプリメントã™ã‚‹ã“ã¨ã«èˆˆå‘³ã‚’æŒã£ã¦ã“ãªã‹ã£ãŸç†ç”±ã§ã™ã€‚

+

注: FATファイル・システム上ã®LFN機能ã¯ãƒžã‚¤ã‚¯ãƒ­ã‚½ãƒ•ト社ã®ç‰¹è¨±ã§ã™ã€‚商用製å“ã§ãれを有効ã«ã™ã‚‹ã¨ãã¯ã€æœ€çµ‚仕å‘地ã«ã‚ˆã£ã¦ã¯ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ãŒå¿…è¦ã‹ã‚‚知れã¾ã›ã‚“。

+
+ +
+

リエントランシー

+

互ã„ã«ç•°ãªã‚‹ãƒœãƒªãƒ¥ãƒ¼ãƒ (è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–)ã«å¯¾ã™ã‚‹ãƒ•ァイルæ“作ã¯ã€å¸¸ã«åŒæ™‚平行ã«å‹•作ã§ãã¾ã™ã€‚åŒã˜ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã—ã¦ã¯ãƒ‡ãƒ•ォルトã§ã¯ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã¯ã‚りã¾ã›ã‚“ãŒã€_FS_REENTRANTオプションã§ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã«ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“ã®å ´åˆã€OSä¾å­˜ã®åŒæœŸã‚ªãƒ–ジェクトæ“作関数 ff_cre_syncobj, ff_del_syncobj, ff_req_grant 㨠ff_rel_grant ã‚‚ã¾ãŸãƒ—ロジェクトã«è¿½åŠ ã•れãªã‘れã°ãªã‚Šã¾ã›ã‚“。サンプル・コードã¨è§£èª¬ã¯syncobj.cã«ã‚りã¾ã™ã€‚

+

ã‚るタスクãŒãƒœãƒªãƒ¥ãƒ¼ãƒ ã‚’使用中ã«ä»–ã®ã‚¿ã‚¹ã‚¯ã‹ã‚‰ãã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã™ã‚‹ãƒ•ァイル関数ãŒå‘¼ã³å‡ºã•れるã¨ã€ãã®ã‚¢ã‚¯ã‚»ã‚¹ã¯å…ˆã®ã‚¿ã‚¹ã‚¯ãŒãƒ•ァイル関数を抜ã‘ã‚‹ã¾ã§ãƒ–ロックã•れã¾ã™ã€‚ã‚‚ã—ã€å¾…ã¡æ™‚é–“ãŒ_TIMEOUTã§æŒ‡å®šã•ã‚ŒãŸæœŸé–“ã‚’è¶Šã™ã¨ã€ãã®é–¢æ•°ã¯FR_TIMEOUTã§ã‚¢ãƒœãƒ¼ãƒˆã—ã¾ã™ã€‚ã„ãã¤ã‹ã®RTOSã§ã¯ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæ©Ÿèƒ½ã¯ã‚µãƒãƒ¼ãƒˆã•れãªã„ã‹ã‚‚知れã¾ã›ã‚“。

+

ã²ã¨ã¤ã®ä¾‹å¤–ãŒf_mountã¨f_mkfs関数ã«ã‚りã¾ã™ã€‚ã“れらã®é–¢æ•°ã¯åŒã˜ãƒœãƒªãƒ¥ãƒ¼ãƒ ã«å¯¾ã—ã¦ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ãƒˆã§ã¯ã‚りã¾ã›ã‚“。ã“れらã®é–¢æ•°ã‚’使用ã™ã‚‹ã¨ãã¯ã€ã‚¢ãƒ—ãƒªã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãƒ»ãƒ¬ãƒ™ãƒ«ã§æŽ’ä»–åˆ¶å¾¡ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。

+

注: ã“ã®ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã¯FatFsモジュールãれ自体ã®ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ã‚·ãƒ¼ã«ã¤ã„ã¦èª¬æ˜Žã—ã¦ã„ã¾ã™ã€‚ディスクI/Oモジュールã®ãƒªã‚¨ãƒ³ãƒˆãƒ©ãƒ³ã‚·ãƒ¼ã«é–¢ã—ã¦ã¯ä½•ã®å‰æã‚‚ã‚りã¾ã›ã‚“。

+
+ +
+

多é‡ãƒ•ァイル・アクセス

+

FatFsモジュールã§ã¯å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹æ©Ÿèƒ½ã¯ã‚µãƒãƒ¼ãƒˆã•れã¾ã›ã‚“。ファイルã«å¯¾ã™ã‚‹å¤šé‡ã‚¢ã‚¯ã‚»ã‚¹ã¯ã€ãã®ã‚¢ã‚¯ã‚»ã‚¹ãƒ»ãƒ¢ãƒ¼ãƒ‰ã«ã‚ˆã£ã¦åˆ¶é™ã•れã¾ã™ã€‚一ã¤ã®ãƒ•ァイルã«å¯¾ã™ã‚‹å¤šé‡ã‚ªãƒ¼ãƒ—ンã¯ã€ãれらãŒå…¨ã¦ãƒªãƒ¼ãƒ‰ãƒ»ãƒ¢ãƒ¼ãƒ‰ã®ã¨ãã«é™ã£ã¦è¨±å¯ã•れã¾ã™ã€‚書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã‚’å«ã‚€å¤šé‡ã‚ªãƒ¼ãƒ—ンã€ã¾ãŸé–‹ã‹ã‚Œã¦ã„るファイルã«å¯¾ã™ã‚‹ãƒªãƒãƒ¼ãƒ ã‚„消去を行ã£ã¦ã¯ãªã‚Šã¾ã›ã‚“。ã•ã‚‚ãªã„ã¨ã€ãã®ãƒœãƒªãƒ¥ãƒ¼ãƒ ã®FAT構造ãŒç ´å£Šã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚

+
+ +
+

効率的ãªãƒ•ァイル・アクセス

+

å°è¦æ¨¡ãªçµ„込システムã§ã®ãƒ•ァイルã®èª­ã¿æ›¸ãã«ãŠã‘る効率ã®è‰¯ã„アクセスã®ãŸã‚ã€ã‚¢ãƒ—リケーション・プログラマã¯FatFsモジュールã®ä¸­ã§ã©ã®ã‚ˆã†ãªå‡¦ç†ãŒè¡Œã‚れã¦ã„ã‚‹ã‹è€ƒæ…®ã™ã¹ãã§ã™ã€‚ディスク上ã®ãƒ‡ãƒ¼ã‚¿ã¯f_read関数ã«ã‚ˆã‚Šæ¬¡ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã§è»¢é€ã•れã¾ã™ã€‚

+

図1. セクタ・ミスアラインド・リード (ショート)
+fig.1 +

+

図2. セクタ・ミスアラインド・リード (ロング)
+fig.2 +

+

図3. セクタ・アラインド・リード
+fig.3 +

+

ファイルI/Oãƒãƒƒãƒ•ã‚¡ã¯ã‚»ã‚¯ã‚¿ã®ä¸€éƒ¨ã®ãƒ‡ãƒ¼ã‚¿ã‚’èª­ã¿æ›¸ãã™ã‚‹ãŸã‚ã®ã‚»ã‚¯ã‚¿ãƒ»ãƒãƒƒãƒ•ã‚¡ã‚’æ„味ã—ã¾ã™ã€‚セクタ・ãƒãƒƒãƒ•ã‚¡ã¯ã€ãれãžã‚Œã®ãƒ•ァイル・オブジェクト内ã®ãƒ—ライベート・セクタ・ãƒãƒƒãƒ•ã‚¡ã¾ãŸã¯ãƒ•ァイル・システム・オブジェクト内ã®å…±æœ‰ã‚»ã‚¯ã‚¿ãƒ»ãƒãƒƒãƒ•ã‚¡ã®ã©ã¡ã‚‰ã‹ã§ã™ã€‚ãƒãƒƒãƒ•ã‚¡æ§‹æˆã‚ªãƒ—ションã®_FS_TINYã¯ã€ãƒ‡ãƒ¼ã‚¿è»¢é€ã«ã©ã¡ã‚‰ã‚’使ã†ã‹ã‚’決定ã—ã¾ã™ã€‚タイニー・ãƒãƒƒãƒ•ã‚¡(1)ãŒé¸æŠžã•れるã¨ãƒ‡ãƒ¼ã‚¿ãƒ»ãƒ¡ãƒ¢ãƒªã®æ¶ˆè²»ã¯ãれãžã‚Œã®ãƒ•ァイル・オブジェクトã§512ãƒã‚¤ãƒˆæ¸›å°‘ã•れã¾ã™ã€‚ã“ã®å ´åˆã€FatFsモジュールã¯ãƒ•ァイル・データã®è»¢é€ã¨FAT/ディレクトリ・アクセスã«ãƒ•ァイル・システム・オブジェクト内ã®ã‚»ã‚¯ã‚¿ãƒ»ãƒãƒƒãƒ•ã‚¡ã ã‘を使用ã—ã¾ã™ã€‚タイニー・ãƒãƒƒãƒ•ã‚¡ã®æ¬ ç‚¹ã¯ã€ã‚»ã‚¯ã‚¿ãƒ»ãƒãƒƒãƒ•ã‚¡ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れãŸFATデータãŒãƒ•ァイル・データã®è»¢é€ã«ã‚ˆã‚Šå¤±ã‚れã€ã‚¯ãƒ©ã‚¹ã‚¿å¢ƒç•Œã®æ¯Žã«ãƒªãƒ­ãƒ¼ãƒ‰ã•れãªã‘れã°ãªã‚‰ãªã„ã“ã¨ã§ã™ã€‚ã§ã‚‚ã€æ‚ªããªã„性能ã¨å°‘ãªã„メモリ消費ã®è¦–点ã‹ã‚‰å¤šãã®ã‚¢ãƒ—リケーションã«é©ã™ã‚‹ã§ã—ょã†ã€‚

+

図1ã¯ã‚»ã‚¯ã‚¿ã®ä¸€éƒ¨ã®ãƒ‡ãƒ¼ã‚¿ãŒãƒ•ァイルI/Oãƒãƒƒãƒ•ァを経由ã§è»¢é€ã•れるã“ã¨ã‚’示ã—ã¾ã™ã€‚図2ã«ç¤ºã•れる長ã„データã®è»¢é€ã§ã¯ã€è»¢é€ãƒ‡ãƒ¼ã‚¿ã®ä¸­é–“ã®1セクタã¾ãŸã¯ãれ以上ã®ã‚»ã‚¯ã‚¿ã«ã¾ãŸãŒã‚‹è»¢é€ãƒ‡ãƒ¼ã‚¿ãŒã‚¢ãƒ—リケーション・ãƒãƒƒãƒ•ã‚¡ã«ç›´æŽ¥è»¢é€ã•れã¦ã„ã¾ã™ã€‚図3ã¯è»¢é€ãƒ‡ãƒ¼ã‚¿å…¨ä½“ãŒã‚»ã‚¯ã‚¿å¢ƒç•Œã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã•れã¦ã„ã‚‹å ´åˆã‚’示ã—ã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ãƒ•ァイルI/Oãƒãƒƒãƒ•ã‚¡ã¯ä½¿ç”¨ã•れã¾ã›ã‚“。直接転é€ã«ãŠã„ã¦ã¯æœ€å¤§ã®ç¯„囲ã®ã‚»ã‚¯ã‚¿ãŒdisk_read関数ã§ä¸€åº¦ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã™ãŒã€ã‚¯ãƒ©ã‚¹ã‚¿å¢ƒç•Œã‚’è¶Šãˆã‚‹ãƒžãƒ«ãƒãƒ»ã‚»ã‚¯ã‚¿è»¢é€ã¯ãれãŒéš£æŽ¥ã§ã‚ã£ã¦ã‚‚行ã‚れã¾ã›ã‚“。

+

ã“ã®ã‚ˆã†ã«ã€ã‚»ã‚¯ã‚¿ã«ã‚¢ãƒ©ã‚¤ãƒ¡ãƒ³ãƒˆã—ãŸãƒ•ァイルã®èª­ã¿æ›¸ãã¸ã®é…æ…®ã¯ãƒãƒƒãƒ•ァ経由ã®ãƒ‡ãƒ¼ã‚¿è»¢é€ã‚’é¿ã‘ã€èª­ã¿æ›¸ãæ€§èƒ½ã¯æ”¹å–„ã•れるã§ã—ょã†ã€‚ãã®åŠ¹æžœã«åŠ ãˆã€ã‚¿ã‚¤ãƒ‹ãƒ¼æ§‹æˆã§ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れãŸFATデータãŒãƒ•ァイル・データã®è»¢é€ã«ã‚ˆã‚Šãƒ•ラッシュã•れãšã€éžã‚¿ã‚¤ãƒ‹ãƒ¼æ§‹æˆã¨åŒã˜æ€§èƒ½ã‚’å°ã•ãªãƒ¡ãƒ¢ãƒªãƒ»ãƒ•ットプリントã§é”æˆã§ãã¾ã™ã€‚

+
+ +
+

クリãƒã‚«ãƒ«ãƒ»ã‚»ã‚¯ã‚·ãƒ§ãƒ³

+

ディスク上ã®FAT構造をæ“作ã—ã¦ã„る途中ã§ã€åœé›»ã€ä¸æ­£ãªãƒ¡ãƒ‡ã‚£ã‚¢ã®å–り外ã—ã€å›žå¾©ä¸èƒ½ãªãƒ‡ãƒ¼ã‚¿ãƒ»ã‚¨ãƒ©ãƒ¼ç­‰ã®éšœå®³ãŒç™ºç”Ÿã™ã‚‹ã¨ã€å‡¦ç†ãŒä¸­é€”åŠç«¯ãªçŠ¶æ…‹ã§ä¸­æ–­ã•れã€ãã®çµæžœã¨ã—ã¦FAT構造ãŒç ´å£Šã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚次ã«FatFsモジュールã«ãŠã‘るクリãƒã‚«ãƒ«ãƒ»ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã¨ã€ãã®é–“ã®éšœå®³ã«ã‚ˆã‚Šèµ·ãã†ã‚‹ã‚¨ãƒ©ãƒ¼ã®çŠ¶æ…‹ã‚’ç¤ºã—ã¾ã™ã€‚

+
+図4. é•·ã„クリãƒã‚«ãƒ«ãƒ»ã‚»ã‚¯ã‚·ãƒ§ãƒ³
+fig.4 +
+
+図5. 最å°åŒ–ã—ãŸã‚¯ãƒªãƒã‚«ãƒ«ãƒ»ã‚»ã‚¯ã‚·ãƒ§ãƒ³
+fig.5 +
+
+

赤ã§ç¤ºã—ãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行中ã«éšœå®³ãŒç™ºç”Ÿã—ãŸå ´åˆã€ã‚¯ãƒ­ã‚¹ãƒ»ãƒªãƒ³ã‚¯ãŒç™ºç”Ÿã—ã¦æ“作対象ã®ãƒ•ァイル・ディレクトリãŒå¤±ã‚れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚黄色ã§ç¤ºã—ãŸã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行中ã«éšœå®³ãŒç™ºç”Ÿã—ãŸå ´åˆã€ã¤ãŽã®ã†ã¡ã„ãšã‚Œã‹ã¾ãŸã¯è¤‡æ•°ã®çµæžœãŒç”Ÿã˜ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚

+
    +
  • æ›¸ãæ›ãˆä¸­ã®ãƒ•ァイルã®ãƒ‡ãƒ¼ã‚¿ãŒç ´å£Šã•れる。
  • +
  • 追記中ã®ãƒ•ァイルãŒã‚ªãƒ¼ãƒ—ンå‰ã®çŠ¶æ…‹ã«æˆ»ã‚‹ã€‚
  • +
  • æ–°è¦ã«ä½œæˆã•れãŸãƒ•ã‚¡ã‚¤ãƒ«ãŒæ¶ˆãˆã‚‹ã€‚
  • +
  • æ–°è¦ã¾ãŸã¯ä¸Šæ›¸ãã§ä½œæˆã•れãŸãƒ•ァイルã®é•·ã•ãŒã‚¼ãƒ­ã«ãªã£ã¦æ®‹ã‚‹ã€‚
  • +
  • ロストãƒã‚§ãƒ¼ãƒ³ã®ç™ºç”Ÿã«ã‚ˆã‚Šãƒ‡ã‚£ã‚¹ã‚¯ã®åˆ©ç”¨åŠ¹çŽ‡ãŒæ‚ªåŒ–ã™ã‚‹ã€‚
  • +
+

ã„ãšã‚Œã‚‚書ãè¾¼ã¿ä¸­ã‚„æ“作対象ã§ãªã„ファイルã«ã¯å½±éŸ¿ã¯ã‚りã¾ã›ã‚“。ã“れらã®ã‚¯ãƒªãƒã‚«ãƒ«ãƒ»ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã¯ã€ãƒ•ァイルを書ãè¾¼ã¿ãƒ¢ãƒ¼ãƒ‰ã§é–‹ã„ã¦ã„る時間を最å°é™ã«ã™ã‚‹ã‹ã€f_sync()ã‚’é©å®œä½¿ç”¨ã™ã‚‹ã“ã¨ã§å›³5ã®ã‚ˆã†ã«ãƒªã‚¹ã‚¯ã‚’最å°åŒ–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚

+
+ +
+

日本語ファイルåã®å¤§æ–‡å­—変æ›

+

CP932(Shift_JIS)ã§ã‹ã¤éžLFNæ§‹æˆã®ã¨ãã¯ã€æ‹¡å¼µæ–‡å­—ã®å°æ–‡å­—(2ãƒã‚¤ãƒˆè‹±å­—・キリル文字・ギリシャ文字)ã«å¯¾ã—ã¦å¤§æ–‡å­—変æ›ã‚’行ã‚ãšã€å°æ–‡å­—ã®ã¾ã¾SFNエントリã«è¨˜éŒ²ãƒ»æ¤œç´¢ã•れã¾ã™ã€‚ã“ã‚Œã¯æ—¥æœ¬èªžMSDOSã¨åŒã˜ä»•様ã¨ãªã‚Šã¾ã™ã€‚ã“ã®ãŸã‚ã€å…¨è§’å°æ–‡å­—ã‚’å«ã‚€ãƒ•ァイルを作æˆã™ã‚‹ã¨ã€NTç³»Windowsã§ãã®ãƒ•ァイルを開ã‘ãªããªã‚Šã¾ã™ã€‚LFNæ§‹æˆã§ã¯å¤§æ–‡å­—変æ›ã‚’行ã„ã¾ã™(NTç³»Windows仕様)。

+
+ +
+

Unicode入出力ã¸ã®å¯¾å¿œ

+

ファイル関数ã®ãƒ•ァイルå入出力ã¯ãƒ‡ãƒ•ォルトã§ã¯ OEMコードã§ã™ãŒã€ã“れをUnicodeã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚詳細ã¯ã€ãƒ•ァイルåã‚’å‚ç…§ã—ã¦ãã ã•ã„。

+
+ +
+

FatFsã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã«ã¤ã„ã¦

+

ソース・ファイルã®ãƒ˜ãƒƒãƒ€ã«ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ¡ä»¶ãŒè¨˜è¿°ã•れã¦ã„ã‚‹ã®ã§ã€åˆ©ç”¨ã®éš›ã¯ãれã«å¾“ã†ã“ã¨ã€‚英語を読ã‚ãªã„æ–¹ã®ãŸã‚ã«ä»¥ä¸‹ã«æ—¥æœ¬èªžè¨³ã‚’示ã—ã¦ãŠãã¾ã™ã€‚

+
/*----------------------------------------------------------------------------/
+/  FatFs - FAT file system module  R0.07e                    (C)ChaN, 2009
+/-----------------------------------------------------------------------------/
+/ FatFsモジュールã¯ã€å°è¦æ¨¡ãªçµ„ã¿è¾¼ã¿ã‚·ã‚¹ãƒ†ãƒ å‘ã‘ã®æ±Žç”¨FATファイルシステム・
+/ モジュールã§ã™ã€‚ã“れã¯ãƒ•リー・ソフトウェアã¨ã—ã¦ã€æ•™è‚²ãƒ»ç ”究・開発ã®ãŸã‚ã«
+/ 以下ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹ãƒ»ãƒãƒªã‚·ãƒ¼ã®ä¸‹ã§å…¬é–‹ã•れã¦ã„ã¾ã™ã€‚
+/
+/  Copyright (C) 2009, ChaN, all right reserved.
+/
+/ * FatFsモジュールã¯ãƒ•リー・ソフトウェアã§ã‚りã€ã¾ãŸç„¡ä¿è¨¼ã§ã™ã€‚
+/ * 用途ã«åˆ¶é™ã¯ã‚りã¾ã›ã‚“。ã‚ãªãŸã®è²¬ä»»ã®ä¸‹ã«ãŠã„ã¦ã€å€‹äººçš„・éžå–¶åˆ©çš„ãª
+/   ã‚‚ã®ã‹ã‚‰å•†ç”¨è£½å“ã®é–‹ç™ºã«åŠã¶ç›®çš„ã«ä½¿ç”¨ãƒ»æ”¹å¤‰ãƒ»å†é…布ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+/ * ソース・コードをå†é…布ã™ã‚‹ã¨ãã¯ã€ä¸Šè¨˜ã®è‘—ä½œæ¨©è¡¨ç¤ºã‚’ä¿æŒã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。
+/
+/-----------------------------------------------------------------------------/
+

è¦ã™ã‚‹ã«FatFsã¯ã‚¿ãƒ€ã§è‡ªç”±ã«ä½¿ãˆã‚‹ã¨ã„ã†ã“ã¨ã§ã™ã€‚ソース・コードをå†é…布ã™ã‚‹ã¨ãã¯ã€ã“ã®ãƒ–ロックをãã®ã¾ã¾ä¿æŒã—ã¦ãŠãã“ã¨ã€‚ã“ã®ã‚ˆã†ã«FatFsã¯BSDライクãªãƒ©ã‚¤ã‚»ãƒ³ã‚¹ã¨ã—ã¦ã„ã¾ã™ãŒã€ä¸€ã¤å¤§ããªé•ã„ãŒã‚りã¾ã™ã€‚特ã«çµ„ã¿è¾¼ã¿ç”¨é€”ã§ã®åˆ©ç”¨ä¾¡å€¤ã‚’高ã‚ã‚‹ãŸã‚ã€ãƒã‚¤ãƒŠãƒªå½¢å¼(ソース・コードをå«ã¾ãªã„å½¢å¼å…¨ã¦)ã§ã®å†é…布ã«ã¤ã„ã¦ã¯ã€æ¡ä»¶ã¯è¨­ã‘ã¦ã„ã¾ã›ã‚“。ãã®å ´åˆã¯ã€FatFsãŠã‚ˆã³ãã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹æ–‡æ›¸ã«ã¤ã„ã¦ã¯ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã«æ˜Žè¨˜ã—ã¦ã‚‚ã—ãªãã¦ã‚‚ã‹ã¾ã„ã¾ã›ã‚“。もã¡ã‚ã‚“GNU GPLプロジェクトã¨ã‚‚共存å¯èƒ½ã§ã™ã€‚何らã‹ã®å¤‰æ›´ã‚’加ãˆã¦å†é…布ã™ã‚‹éš›ã¯ã€ä»–ã®ãƒ©ã‚¤ã‚»ãƒ³ã‚¹(GNU GPLã‹BSDライセンス)ã«å¤‰æ›´ã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚

+
+ +

戻る

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/chdir.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/chdir.html new file mode 100644 index 0000000..6a72931 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/chdir.html @@ -0,0 +1,91 @@ + + + + + + + +FatFs - f_chdir + + + + +
+

f_chdir

+

ƒJƒŒƒ“ƒgEƒfƒBƒŒƒNƒgƒŠ‚ð•ÏX‚µ‚Ü‚·B

+
+FRESULT f_chdir (
+  const XCHAR* Path /* ƒfƒBƒŒƒNƒgƒŠ–¼‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
Path
+
ˆÚ“®‘Îۂ̃fƒBƒŒƒNƒgƒŠ‚̃pƒX–¼‚Ì“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_FILE
+
ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘ÔB
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
‚»‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ª—^‚¦‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒ{ƒŠƒ…[ƒ€‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

f_chdirŠÖ”‚ÍŠeƒ{ƒŠƒ…[ƒ€‚̃JƒŒƒ“ƒgEƒfƒBƒŒƒNƒgƒŠ‚ð•ÏX‚µ‚Ü‚·BƒJƒŒƒ“ƒgEƒfƒBƒŒƒNƒgƒŠ‚̓tƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg‚̉Šú‰»‚ªs‚í‚ꂽ‚Æ‚«Aƒ‹[ƒgEƒfƒBƒŒƒNƒgƒŠ‚Éݒ肳‚ê‚Ü‚·BƒJƒŒƒ“ƒgEƒfƒBƒŒƒNƒgƒŠ‚ÍAƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg‚É‹L˜^‚³‚ê‚邽‚ßA‚»‚̃{ƒŠƒ…[ƒ€‚ðŽg—p‚·‚é‘S‚Ẵ^ƒXƒN‚ɑ΂µ‚ĉe‹¿‚ð—^‚¦‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

_FS_RPATH == 1‚̂Ƃ«‚ÉŽg—p‰Â”\‚ƂȂè‚Ü‚·B

+
+ + +
+

ƒTƒ“ƒvƒ‹EƒR[ƒh

+
+    // ƒJƒŒƒ“ƒgEƒhƒ‰ƒCƒu‚̃JƒŒƒ“ƒgEƒfƒBƒŒƒNƒgƒŠ‚ð•ÏX (ƒ‹[ƒg‰º‚Ìdir1‚Ö)
+    f_chdir("/dir1");
+
+    // ƒhƒ‰ƒCƒu2‚̃JƒŒƒ“ƒgEƒfƒBƒŒƒNƒgƒŠ‚ð•ÏX (eƒfƒBƒŒƒNƒgƒŠ‚Ö)
+    f_chdir("2:..");
+
+
+ +
+

ŽQÆ

+

f_chdrive

+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/chdrive.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/chdrive.html new file mode 100644 index 0000000..cd0f31b --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/chdrive.html @@ -0,0 +1,62 @@ + + + + + + + +FatFs - f_chdrive + + + + +
+

f_chdrive

+

ƒJƒŒƒ“ƒgEƒhƒ‰ƒCƒu‚ð•ÏX‚µ‚Ü‚·B

+
+FRESULT f_chdrive (
+  BYTE Drive /* ˜_—ƒhƒ‰ƒCƒu”Ô† */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
ƒJƒŒƒ“ƒgEƒhƒ‰ƒCƒu‚ÉÝ’è‚·‚é˜_—ƒhƒ‰ƒCƒu”Ô†‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
+
+ + +
+

‰ðà

+

f_chdriveŠÖ”‚̓JƒŒƒ“ƒgEƒhƒ‰ƒCƒu‚ð•ÏX‚µ‚Ü‚·BƒVƒXƒeƒ€‹N“®Žž‚̉Šú’l‚Í0‚Å‚·B‚±‚ÌÝ’è‚ÍFatFsƒ‚ƒWƒ…[ƒ‹‚ÌÓI•Ï”‚É‹L˜^‚³‚ê‚邽‚ßA‘S‚Ẵ^ƒXƒN‚ɑ΂µ‚ĉe‹¿‚ð—^‚¦‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

_FS_RPATH == 1‚̂Ƃ«‚ÉŽg—p‰Â”\‚ƂȂè‚Ü‚·B

+
+ + +
+

ŽQÆ

+

f_chdir

+
+ +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/chmod.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/chmod.html new file mode 100644 index 0000000..34fd695 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/chmod.html @@ -0,0 +1,97 @@ + + + + + + + +FatFs - f_chmod + + + + +
+

f_chmod

+

ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚Ì‘®«‚ð•ÏX‚µ‚Ü‚·B

+
+FRESULT f_chmod (
+  const XCHAR* FileName, /* ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ–¼‚ւ̃|ƒCƒ“ƒ^ */
+  BYTE Attribute,        /* Ý’è’l */
+  BYTE AttributeMask     /* •ÏXƒ}ƒXƒN */
+);
+
+
+ +
+

ˆø”

+
+
FileName
+
‘®«•ÏX‘Îۂ̃tƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚̃pƒX–¼‚Ì“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ðŽw’肵‚Ü‚·B
+
Attribute
+
Ý’è‚·‚é‘®«BŽw’è‰Â”\‚È‘®«‚ÍŽŸ‚Ì’Ê‚è‚ÅA‚±‚ê‚ç‚Ì‘g‚݇‚킹‚ÅŽw’肵‚Ü‚·BŽw’肳‚ê‚È‚©‚Á‚½‘®«‚͉𜂳‚ê‚Ü‚·B
+ + + + + + +
’lˆÓ–¡
AM_RDOƒŠ[ƒhEƒIƒ“ƒŠ[
AM_ARCƒA[ƒJƒCƒu
AM_SYSƒVƒXƒeƒ€
AM_HIDƒqƒhƒDƒ“
+
+
AttributeMask
+
•ÏX‚·‚é‘®«‚̃}ƒXƒNBŽw’肵‚½‘®«‚ªÝ’è‚Ü‚½‚͉𜂳‚êAŽw’肳‚ê‚È‚©‚Á‚½‘®«‚Íó‘Ô‚ª•ÛŽ‚³‚ê‚Ü‚·BAttribute‚Æ“¯‚¶’l‚ðŽg‚¢‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_FILE
+
ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘ÔB
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
‚»‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ª—^‚¦‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒ{ƒŠƒ…[ƒ€‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚Ì‘®«‚ð•ÏX‚µ‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

_FS_READONLY == 0‚ÅAŠŽ‚Â_FS_MINIMIZE == 0‚̂Ƃ«Žg—p‰Â”\‚Å‚·B

+
+ + +
+

Žg—p—á

+
+    /* ƒŠ[ƒhƒIƒ“ƒŠ[‚ðƒZƒbƒgAƒA[ƒJƒCƒu‚ðƒNƒŠƒAA‚»‚Ì‘¼‚Í•ÏX‚µ‚È‚¢ */
+    f_chmod("file.txt", AM_RDO, AM_RDO | AM_ARC);
+
+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/close.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/close.html new file mode 100644 index 0000000..dfa5eec --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/close.html @@ -0,0 +1,68 @@ + + + + + + + +FatFs - f_close + + + + +
+

f_close

+

ƒtƒ@ƒCƒ‹‚ð•‚¶‚Ü‚·B

+
+FRESULT f_close (
+  FIL* FileObject     /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
•‚¶‚悤‚Æ‚·‚éƒtƒ@ƒCƒ‹‚̃tƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_INVALID_OBJECT
+
–³Œø‚ȃtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒgB
+
+
+ + +
+

‰ðà

+

ƒtƒ@ƒCƒ‹‚ð•‚¶‚Ü‚·B‘‚«ž‚Ý‚Ìs‚í‚ꂽƒtƒ@ƒCƒ‹‚Ìê‡AƒLƒƒƒbƒVƒ…‚³‚ꂽó‘ÔiR/Wƒoƒbƒtƒ@ã‚̃f[ƒ^A•ÏX‚³‚ꂽFAT‚âƒfƒBƒŒƒNƒgƒŠ€–Új‚̓fƒBƒXƒN‚É‘‚«–ß‚³‚ê‚Ü‚·BŠÖ”‚ª³íI—¹‚·‚邯A‚»‚̃tƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚Í–³Œø‚ɂȂèA‚»‚̃ƒ‚ƒŠ‚à‰ð•ú‚Å‚«‚Ü‚·B“ǂݞ‚Ýê—pƒ‚[ƒh‚ÅŠJ‚©‚ꂽƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ÍA‚±‚ÌŠÖ”‚É‚æ‚éƒNƒ[ƒYˆ—‚ðŒo‚¸‚É”jŠü‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

‘S‚Ä‚Ì\¬‚ÅŽg—p‰Â”\‚Å‚·B

+
+ + + + +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dinit.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dinit.html new file mode 100644 index 0000000..4cba323 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dinit.html @@ -0,0 +1,45 @@ + + + + + + + +FatFs - disk_initialize + + + + +
+

disk_initialize

+

ƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ð‰Šú‰»‚µ‚Ü‚·B

+
+DSTATUS disk_initialize (
+  BYTE Drive      /* •¨—ƒhƒ‰ƒCƒu”Ô† */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
‰Šú‰»‚·‚镨—ƒhƒ‰ƒCƒu”Ô†(0-9)‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+

‚±‚ÌŠÖ”‚Í–ß‚è’l‚Æ‚µ‚ăfƒBƒXƒNEƒXƒe[ƒ^ƒX‚ð•Ô‚µ‚Ü‚·BƒfƒBƒXƒNEƒXƒe[ƒ^ƒX‚ÌÚׂɊւµ‚Ä‚Ídisk_status()‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B

+
+ +
+

‰ðà

+

ƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ð‰Šú‰»‚µ‚Ü‚·BŠÖ”‚ª¬Œ÷‚·‚邯A–ß‚è’l‚ÌSTA_NOINITƒtƒ‰ƒO‚ªƒNƒŠƒA‚³‚ê‚Ü‚·B

+

FatFsƒ‚ƒWƒ…[ƒ‹‚ÍAŽ©“®ƒ}ƒEƒ“ƒg“®ì‚É‚æ‚è•K—v‚ɉž‚¶‚Ä‚±‚ÌŠÖ”‚ðŒÄ‚Ño‚µ‚Ü‚·BFatFsƒ‚ƒWƒ…[ƒ‹Žg—p’†‚̓AƒvƒŠƒP[ƒVƒ‡ƒ“‚©‚炱‚ÌŠÖ”‚ðŒÄ‚Ño‚µ‚Ă͂Ȃè‚Ü‚¹‚ñB‚³‚à‚È‚¢‚ÆFAT\‘¢‚ª”j‰ó‚³‚ê‚é‰Â”\«‚ª‚ ‚è‚Ü‚·BƒGƒ‰[“™‚É‚æ‚èĉŠú‰»‚ª•K—v‚ȂƂ«‚ÍAf_mount()‚ðŽg—p‚µ‚Ü‚·B

+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dioctl.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dioctl.html new file mode 100644 index 0000000..af5f4b3 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dioctl.html @@ -0,0 +1,67 @@ + + + + + + + +FatFs - disk_ioctl + + + + +
+

disk_ioctl

+

ƒZƒNƒ^‚̓ǂݑ‚«ˆÈŠO‚̃fƒBƒXƒNEƒhƒ‰ƒCƒuŽ©‘̂ɑ΂·‚é—lX‚ȧŒä‚ð‚µ‚Ü‚·B

+
+DRESULT disk_ioctl (
+  BYTE Drive,      /* •¨—ƒhƒ‰ƒCƒu”Ô† */
+  BYTE Command,    /* §ŒäƒRƒ}ƒ“ƒh */
+  void* Buffer     /* ƒf[ƒ^Žó‚¯“n‚µƒoƒbƒtƒ@ */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
•¨—ƒhƒ‰ƒCƒu”Ô†(0-9)‚ðŽw’肵‚Ü‚·B
+
Command
+
§ŒäƒRƒ}ƒ“ƒhEƒR[ƒh‚ðŽw’肵‚Ü‚·B
+
Buffer
+
§ŒäƒRƒ}ƒ“ƒh‚Ɉˑ¶‚µ‚½ƒpƒ‰ƒ[ƒ^‚ðŽöŽó‚·‚éƒoƒbƒtƒ@‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·Bƒoƒbƒtƒ@‚ðŽg—p‚µ‚È‚¢ƒRƒ}ƒ“ƒh‚ÌꇂÍANULL‚ðŽw’肵‚Ü‚·B
+
+
+ +
+

–ß‚è’l

+
+
RES_OK (0)
+
³íI—¹B
+
RES_ERROR
+
‰½‚ç‚©‚̃Gƒ‰[‚ª”­¶‚µ‚½B
+
RES_PARERR
+
ƒRƒ}ƒ“ƒh‚ª•s³B
+
RES_NOTRDY
+
ƒhƒ‰ƒCƒu‚ª“®ì‰Â”\ó‘Ԃł͂Ȃ¢A‚Ü‚½‚͉Šú‰»‚³‚ê‚Ä‚¢‚È‚¢B
+
+
+ +
+

‰ðà

+

•¨—ƒhƒ‰ƒCƒu‚ÌŽí—Þ‚É‚æ‚èƒTƒ|[ƒg‚³‚ê‚éƒRƒ}ƒ“ƒh‚͈قȂè‚Ü‚·‚ªAFatFsƒ‚ƒWƒ…[ƒ‹‚Å‚ÍAŽŸ‚̔ėpƒRƒ}ƒ“ƒh‚̂ݎg—p‚µAƒhƒ‰ƒCƒu‚ÌŽí—ނɈˑ¶‚µ‚½§Œä‚Ís‚¢‚Ü‚¹‚ñB

+

‚±‚ÌŠÖ”‚̓Š[ƒhEƒIƒ“ƒŠ[\¬‚ł͕K—v‚Æ‚³‚ê‚Ü‚¹‚ñB

+ + + + + + +
ƒRƒ}ƒ“ƒh‰ðà
CTRL_SYNCƒhƒ‰ƒCƒu‚ªƒf[ƒ^‚Ì‘‚«ž‚Ý‚ðŠ®—¹‚·‚é‚Ì‚ð‘Ò‚¿‚Ü‚·Bƒ‰ƒCƒgEƒoƒbƒNEƒLƒƒƒbƒVƒ…‚ª‚ ‚éꇂÍA‘‚«ž‚Ü‚ê‚Ä‚¢‚È‚¢ƒf[ƒ^‚𑦎ž‘‚«–ß‚µ‚Ü‚·B
GET_SECTOR_SIZEBuffer‚ÌŽw‚·WORD•Ï”‚Ƀhƒ‰ƒCƒu‚̃ZƒNƒ^EƒTƒCƒY‚ð•Ô‚µ‚Ü‚·B_MAX_SS‚ª1024ˆÈã‚̂Ƃ«•K—v‚Æ‚³‚ê‚Ü‚·B
GET_SECTOR_COUNTBuffer‚ÌŽw‚·DWORD•Ï”‚Ƀhƒ‰ƒCƒuã‚Ì‘ƒZƒNƒ^”‚ð•Ô‚µ‚Ü‚·Bf_mkfs“à‚ł̂ݎg—pB
GET_BLOCK_SIZEBuffer‚ÌŽw‚·DWORD•Ï”‚Ƀƒ‚ƒŠEƒAƒŒ[‚ÌÁ‹ŽƒuƒƒbƒNƒTƒCƒY‚ðƒZƒNƒ^’PˆÊ‚ŕԂµ‚Ü‚·B•s–¾‚Èꇂ܂½‚ÍHDD‚Å‚Í1‚ð•Ô‚µ‚Ü‚·Bf_mkfs“à‚ł̂ݎg—pB
+
+ + +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dread.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dread.html new file mode 100644 index 0000000..5baf770 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dread.html @@ -0,0 +1,58 @@ + + + + + + + +FatFs - disk_read + + + + +
+

disk_read

+

ƒfƒBƒXƒN‚©‚çƒZƒNƒ^‚ð“Ç‚Ýo‚µ‚Ü‚·B

+
+DRESULT disk_read (
+  BYTE Drive,          /* •¨—ƒhƒ‰ƒCƒu”Ô† */
+  BYTE* Buffer,        /* “Ç‚Ýo‚µƒoƒbƒtƒ@‚ւ̃|ƒCƒ“ƒ^ */
+  DWORD SectorNumber,  /* “Ç‚Ýo‚µŠJŽnƒZƒNƒ^”Ô† */
+  BYTE SectorCount     /* “Ç‚Ýo‚µƒZƒNƒ^” */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
•¨—ƒhƒ‰ƒCƒu”Ô†(0-9)‚ðŽw’肵‚Ü‚·B
+
Buffer
+
ƒfƒBƒXƒN‚©‚ç“Ç‚Ýo‚µ‚½ƒf[ƒ^‚ðŠi”[‚·‚éƒoƒCƒg”z—ñ‚ÅA“Ç‚Ýo‚³‚ê‚éƒoƒCƒg”•ª‚̃TƒCƒY‚ª•K—v‚Å‚·BƒAƒhƒŒƒX‚̓Aƒ‰ƒCƒƒ“ƒg‚³‚ê‚Ä‚¢‚邯‚ÍŒÀ‚è‚Ü‚¹‚ñB
+
SectorNumber
+
“Ç‚Ýo‚µ‚ðŠJŽn‚·‚éƒZƒNƒ^”Ô†BLBA‚ÅŽw’肵‚Ü‚·B
+
SectorCount
+
“Ç‚Ýo‚·ƒZƒNƒ^”B 1`255‚͈̔͂Åݒ肵‚Ü‚·
+
+
+ + +
+

–ß‚è’l

+
+
RES_OK (0)
+
³íI—¹B
+
RES_ERROR
+
“ǂݞ‚Ý’†‚ɃGƒ‰[‚ª”­¶‚µA‚»‚̉ñ•œ‚É‚àŽ¸”s‚µ‚½B
+
RES_PARERR
+
ƒpƒ‰ƒ[ƒ^‚ª•s³B
+
RES_NOTRDY
+
ƒhƒ‰ƒCƒu‚ª“®ì‰Â”\ó‘Ԃł͂Ȃ¢i‰Šú‰»‚³‚ê‚Ä‚¢‚È‚¢jB
+
+
+ + +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dstat.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dstat.html new file mode 100644 index 0000000..9e04ccb --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dstat.html @@ -0,0 +1,47 @@ + + + + + + + +FatFs - disk_status + + + + +
+

disk_status

+

ƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚Ìó‘Ô‚ðŽæ“¾‚µ‚Ü‚·B

+
+DSTATUS disk_status (
+  BYTE Drive           /* •¨—ƒhƒ‰ƒCƒu”Ô† */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
ƒXƒe[ƒ^ƒX‚ðŽæ“¾‚·‚镨—ƒhƒ‰ƒCƒu”Ô†‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+

•¨—ƒhƒ‰ƒCƒu‚Ìó‘Ô‚ªŽŸ‚̃tƒ‰ƒO‚Ì‘g‚݇‚킹‚Ì’l‚ŕԂ³‚ê‚Ü‚·B

+
+
STA_NOINIT
+
ƒhƒ‰ƒCƒu‚ª‰Šú‰»‚³‚ê‚Ä‚¢‚È‚¢‚±‚Æ‚ðŽ¦‚·ƒtƒ‰ƒOBƒVƒXƒeƒ€EƒŠƒZƒbƒg‚⃃fƒBƒA‚ÌŽæ‚èŠO‚µ“™‚ŃZƒbƒg‚³‚êAdisk_initialize() ‚̳íI—¹‚ŃNƒŠƒAAޏ”s‚ŃZƒbƒg‚³‚ê‚Ü‚·B
+
STA_NODISK
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚±‚Æ‚ðŽ¦‚·ƒtƒ‰ƒOBƒƒfƒBƒA‚ªŽæ‚èŠO‚³‚ê‚Ä‚¢‚éŠÔ‚̓Zƒbƒg‚³‚êAƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚éŠÔ‚̓NƒŠƒA‚³‚ê‚Ü‚·BŒÅ’èƒfƒBƒXƒN‚Å‚Íí‚ɃNƒŠƒA‚³‚ê‚Ä‚¢‚Ü‚·B
+
STA_PROTECTED
+
ƒƒfƒBƒA‚ªƒ‰ƒCƒgEƒvƒƒeƒNƒg‚³‚ê‚Ä‚¢‚邱‚Æ‚ðŽ¦‚·ƒtƒ‰ƒOBƒ‰ƒCƒgEƒvƒƒeƒNƒg‹@”\‚ðƒTƒ|[ƒg‚µ‚È‚¢ƒƒfƒBƒA‚Å‚Íí‚ɃNƒŠƒA‚³‚ê‚Ä‚¢‚Ü‚·B
+
+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dwrite.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dwrite.html new file mode 100644 index 0000000..821989c --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/dwrite.html @@ -0,0 +1,66 @@ + + + + + + + +FatFs - disk_write + + + + +
+

disk_write

+

ƒfƒBƒXƒN‚Ƀf[ƒ^‚ð‘‚«ž‚݂܂·B

+
+DRESULT disk_write (
+  BYTE Drive,          /* •¨—ƒhƒ‰ƒCƒu”Ô† */
+  const BYTE* Buffer,  /* ‘‚«ž‚Þƒf[ƒ^‚ւ̃|ƒCƒ“ƒ^ */
+  DWORD SectorNumber,  /* ‘‚«ž‚ÝŠJŽnƒZƒNƒ^”Ô† */
+  BYTE SectorCount     /* ‘‚«ž‚݃ZƒNƒ^” */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
•¨—ƒhƒ‰ƒCƒu”Ô†(0-9)‚ðŽw’肵‚Ü‚·B
+
Buffer
+
ƒfƒBƒXƒN‚É‘‚«ž‚ÞƒoƒCƒg”z—ñ‚ðŽw’肵‚Ü‚·BƒAƒhƒŒƒX‚̓Aƒ‰ƒCƒƒ“ƒg‚³‚ê‚Ä‚¢‚邯‚ÍŒÀ‚è‚Ü‚¹‚ñB
+
SectorNumber
+
‘‚«ž‚Ý‚ðŠJŽn‚·‚éƒZƒNƒ^”Ô†BLBA‚ÅŽw’肵‚Ü‚·B
+
SectorCount
+
‘‚«ž‚ÞƒZƒNƒ^”B 1`255‚Åݒ肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
RES_OK (0)
+
³íI—¹B
+
RES_ERROR
+
‘‚«ž‚Ý’†‚ɃGƒ‰[‚ª”­¶‚µA‚»‚̉ñ•œ‚É‚àŽ¸”s‚µ‚½B
+
RES_WRPRT
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘ÔB
+
RES_PARERR
+
ƒpƒ‰ƒ[ƒ^‚ª•s³B
+
RES_NOTRDY
+
ƒhƒ‰ƒCƒu‚ª“®ì‰Â”\ó‘Ԃł͂Ȃ¢i‰Šú‰»‚³‚ê‚Ä‚¢‚È‚¢jB
+
+
+ + +
+

‰ðà

+

ƒŠ[ƒhEƒIƒ“ƒŠ[\¬‚ł͂±‚ÌŠÖ”‚Í•K—v‚Æ‚³‚ê‚Ü‚¹‚ñB

+
+ + +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/fattime.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/fattime.html new file mode 100644 index 0000000..d627a12 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/fattime.html @@ -0,0 +1,50 @@ + + + + + + + +FatFs - get_fattime + + + + +
+

get_fattime

+

Œ»ÝŽž‚ðŽæ“¾‚µ‚Ü‚·B

+
+DWORD get_fattime (void);
+
+
+ + +
+

–ß‚è’l

+

Œ»Ý‚̃[ƒJƒ‹Eƒ^ƒCƒ€‚ªDWORD’l‚ɃpƒbƒN‚³‚ê‚ĕԂ³‚ê‚Ü‚·BƒrƒbƒgEƒtƒB[ƒ‹ƒh‚ÍŽŸ‚ÉŽ¦‚·‚悤‚ɂȂè‚Ü‚·B

+
+
bit31:25
+
1980”N‚ð‹N“_‚Æ‚µ‚½”N‚ª 0..127 ‚Å“ü‚è‚Ü‚·B
+
bit24:21
+
ŒŽ‚ª 1..12 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
bit20:16
+
“ú‚ª 1..31 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
bit15:11
+
Žž‚ª 0..23 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
bit10:5
+
•ª‚ª 0..59 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
bit4:0
+
•b/2‚ª 0..29 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
+
+ + +
+

‰ðà

+

RTC‚ðƒTƒ|[ƒg‚µ‚È‚¢ƒVƒXƒeƒ€‚Å‚àA‰½‚ç‚©‚Ì“ú•t‚Æ‚µ‚Ä—LŒø‚È’l‚ð•Ô‚³‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB0‚ð•Ô‚µ‚½ê‡A‚»‚̃tƒ@ƒCƒ‹‚Í“ú•t‚ðŽ‚¿‚Ü‚¹‚ñBƒŠ[ƒhEƒIƒ“ƒŠ[\¬‚ł͂±‚ÌŠÖ”‚Í•K—v‚Æ‚³‚ê‚Ü‚¹‚ñB

+
+ + +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/filename.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/filename.html new file mode 100644 index 0000000..0e9fd99 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/filename.html @@ -0,0 +1,67 @@ + + + + + + + +FatFs - ãƒ•ã‚¡ã‚¤ãƒ«ãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®æŒ‡å®šæ–¹æ³• + + + +
+

ãƒ•ã‚¡ã‚¤ãƒ«ãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®æŒ‡å®šæ–¹æ³•

+

FatFsモジュールã§ã®ãƒ•ァイルã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã€ãƒ‰ãƒ©ã‚¤ãƒ–ã®æŒ‡å®šæ–¹æ³•ã¯DOS/Windowsã¨ã»ã¼åŒã˜ã§ã™ã€‚パスåã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã¯æ¬¡ã®é€šã‚Šã§ã™ã€‚

+
+ "[è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·:][/]ディレクトリå/ファイルå"
+
+

FatFsモジュールã¯é•·ã„ファイルå(LFN)ãŠã‚ˆã³8.3å½¢å¼ãƒ•ァイルå(SFN)ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚LFNã¯ã€(_USE_LFN > 0)ã®ã¨ã使用å¯èƒ½ã«ãªã‚Šã¾ã™ã€‚DOS/Windowsã¨ã®é•ã„ã¯ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ»ã‚»ãƒ‘レータã¨è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã®æŒ‡å®šã§ã™ã€‚ディレクトリ・セパレータã«ã¯ / ã¾ãŸã¯ \ を使用ã—ã¾ã™ã€‚è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·ã¯ã€'0'~'9'ã®ä¸€æ–‡å­—ã®æ•°å­—ã¨ã‚³ãƒ­ãƒ³ã§æŒ‡å®šã—ã€çœç•¥ã—ãŸå ´åˆã¯ãƒ‡ãƒ•ォルト・ドライブ(0ã¾ãŸã¯ã‚«ãƒ¬ãƒ³ãƒˆãƒ»ãƒ‰ãƒ©ã‚¤ãƒ–)ãŒé¸æŠžã•れã¾ã™ã€‚パスåã«å…ˆè¡Œã‚ã‚‹ã„ã¯ä¸­ã«å«ã¾ã‚Œã‚‹ã‚¹ãƒšãƒ¼ã‚¹ã¯ã€LFNæ§‹æˆã§ã¯åå‰ã®ä¸€éƒ¨ã¨ã—ã¦æœ‰åйã§ã™ãŒã€éžLFNæ§‹æˆã§ã¯ãƒ‘スåã®çµ‚端ã¨ã—ã¦èªè­˜ã•れã¾ã™ã€‚

+

標準構æˆ(_FS_RPATH == 0)ã®ã¨ãã¯ã€å…¨ã¦ã®ã‚ªãƒ–ジェクトãŒãƒ«ãƒ¼ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‹ã‚‰è¾¿ã‚‹çµ¶å¯¾ãƒ‘ã‚¹ã§æŒ‡å®šã•れã¾ã™ã€‚OS指å‘ãªã‚«ãƒ¬ãƒ³ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ã„ã†æ¦‚念ã¯ç„¡ãã€ã¾ãŸãƒ‰ãƒƒãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª("."ã‚„"..")ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“。パスå先頭ã®ã‚»ãƒ‘レータã¯ç„¡è¦–ã•れã¾ã™ã€‚デフォルト・ドライブ番å·ã¯å¸¸ã«0ã«ãªã‚Šã¾ã™ã€‚

+

相対パスを有効(_FS_RPATH == 1)ã«ã—ãŸã¨ãã¯ã€å…ˆè¡Œã™ã‚‹ã‚»ãƒ‘ãƒ¬ãƒ¼ã‚¿ã®æœ‰ç„¡ã«ã‚ˆã£ã¦æ¤œç´¢é–‹å§‹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒå¤‰ã‚りã€ã‚»ãƒ‘レータãŒã‚ã‚‹å ´åˆã¯ãƒ«ãƒ¼ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‹ã‚‰ã€ç„¡ã„å ´åˆã¯f_chdir関数ã§è¨­å®šã•れるカレント・ディレクトリã‹ã‚‰ã«ãªã‚Šã¾ã™ã€‚ã¾ãŸãƒ‘スåã«ãƒ‰ãƒƒãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãŒä½¿ç”¨ã§ãã¾ã™ã€‚デフォルト・ドライブ番å·ã¯f_chdrive関数ã§è¨­å®šã•れãŸå€¤ã¨ãªã‚Šã¾ã™ã€‚

+ + + + + + + + + + + + + +
パスå_FS_RPATH == 0_FS_RPATH == 1
file.txtドライブ0ã®ãƒ«ãƒ¼ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªä¸‹ã®ãƒ•ァイルカレント・ドライブã®ã‚«ãƒ¬ãƒ³ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªä¸‹ã®ãƒ•ァイル
/file.txtドライブ0ã®ãƒ«ãƒ¼ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªä¸‹ã®ãƒ•ァイルカレント・ドライブã®ãƒ«ãƒ¼ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªä¸‹ã®ãƒ•ァイル
ドライブ0ã®ãƒ«ãƒ¼ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚«ãƒ¬ãƒ³ãƒˆãƒ»ãƒ‰ãƒ©ã‚¤ãƒ–ã®ã‚«ãƒ¬ãƒ³ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª
2:ドライブ2ã®ãƒ«ãƒ¼ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ‰ãƒ©ã‚¤ãƒ–2ã®ã‚«ãƒ¬ãƒ³ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª
2:file1.txtドライブ2ã®ãƒ«ãƒ¼ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªä¸‹ã®ãƒ•ァイルドライブ2ã®ã‚«ãƒ¬ãƒ³ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªä¸‹ã®ãƒ•ァイル
2:/ドライブ2ã®ãƒ«ãƒ¼ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªãƒ‰ãƒ©ã‚¤ãƒ–2ã®ãƒ«ãƒ¼ãƒˆãƒ»ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª
../file.txt無効親ディレクトリ下ã®ãƒ•ァイル
.無効ã“ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª
..無効カレント・ディレクトリã®è¦ªãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒª
dir1/..無効カレント・ディレクトリ
/..無効無効(ルート・ディレクトリã§ã¯ãƒ‰ãƒƒãƒˆåã¯ä½¿ç”¨ä¸å¯)
+
+ +


+
+

Unicode API

+

ファイル関数ã®å…¥å‡ºåŠ›ã®ã†ã¡ãƒ•ァイルåやパスåを指定ã™ã‚‹å¼•æ•°ã®åž‹ã¯ã€XCHARã§å®šç¾©ã•れã¦ã„ã¾ã™ãŒã€ã“れã¯charã®ã‚¨ãƒªã‚¢ã‚¹ã«ãªã£ã¦ã„ã¾ã™ã€‚ãã—ã¦ã€_CODE_PAGEã§æŒ‡å®šã•れる OEMコード(SBCSã¾ãŸã¯DBCS)ã®æ–‡å­—列ã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚ファイルå入出力をUnicodeã¨ã™ã‚‹æ§‹æˆ(LFNæ§‹æˆã§ã€ã‹ã¤_LFN_UNICODEã‚’ 1)ã«ã—ãŸã¨ãã¯ã€XCHARã¯ãƒ¯ã‚¤ãƒ‰æ–‡å­—(unsigned short)ã«åˆ‡ã‚Šæ›¿ã‚りã€ãƒ‘スåã«Unicodeを使用ã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ã“れã«ã‚ˆã‚Š LFNフル対応ã¨ãªã‚Šã€OEMコードã«ãªã„文字(ãŸã¨ãˆã° âœâ˜ªâœ¡â˜¸â˜­ãªã©)も使用ã§ãã¾ã™ã€‚

+
+ +


+
+

è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–(ボリューム)ã¨ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–(ディスク装置)ã®å¯¾å¿œ

+

ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®æ§‹æˆã§ã¯ã€ãれãžã‚Œã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¯åŒã˜ç•ªå·ã®ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«1:1ã§çµã³ã¤ã‘られã¦ã„ã¦ã€ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã®å…ˆé ­ã®åŒºç”»ãŒãƒžã‚¦ãƒ³ãƒˆã•れã¾ã™ã€‚_MULTI_PARTITIONã« 1を指定ã™ã‚‹ã¨ã€è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã«å¯¾ã—ã¦å€‹åˆ¥ã«ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–番å·ãƒ»åŒºç”»ã‚’指定ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®æ§‹æˆã§ã¯ã€è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¨åŒºç”»ã®å¯¾å¿œã‚’解決ã™ã‚‹ãŸã‚ã®ãƒ†ãƒ¼ãƒ–ルを次ã«ç¤ºã™ã‚ˆã†ã«å®šç¾©ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚

+
+例:è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–0~2を物ç†ãƒ‰ãƒ©ã‚¤ãƒ–0(固定ディスク)ã®3ã¤ã®åŸºæœ¬åŒºç”»ã«å‰²ã‚Šå½“ã¦ã€
+   è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–3を物ç†ãƒ‰ãƒ©ã‚¤ãƒ–1(リムーãƒãƒ–ル・ディスク)ã«å‰²ã‚Šå½“ã¦ã‚‹å ´åˆã€‚
+
+const PARTITION Drives[] = {
+    {0, 0},     /* Logical drive 0 ==> Physical drive 0, 1st partition */
+    {0, 1},     /* Logical drive 1 ==> Physical drive 0, 2nd partition */
+    {0, 2},     /* Logical drive 2 ==> Physical drive 0, 3rd partition */
+    {1, 0}      /* Logical drive 3 ==> Physical drive 1 */
+};
+
+

複数区画指定を使用ã™ã‚‹å ´åˆã€æ¬¡ã®ç‚¹ã«æ³¨æ„ã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。 +

    +
  • 指定å¯èƒ½ãªåŒºç”»ã¯åŸºæœ¬åŒºç”»(0~3)ã®ã¿ã€‚
  • +
  • 物ç†ãƒ‰ãƒ©ã‚¤ãƒ–ãŒSFDå½¢å¼(区画テーブル無ã—)ã®å ´åˆã€åŒºç”»æŒ‡å®šã¯ç„¡è¦–ã•れる。
  • +
  • 複数ã®è«–ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã‚’æŒã¤ç‰©ç†ãƒ‰ãƒ©ã‚¤ãƒ–ã¯ã€å›ºå®šãƒ‡ã‚£ã‚¹ã‚¯ã§ãªã‘れã°ãªã‚‰ãªã„。
  • +
+
+ + + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/forward.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/forward.html new file mode 100644 index 0000000..6101449 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/forward.html @@ -0,0 +1,141 @@ + + + + + + + +FatFs - f_forward + + + + +
+

f_forward

+

ƒtƒ@ƒCƒ‹‚©‚çƒf[ƒ^‚ð“Ç‚Ýo‚µA‘—MƒXƒgƒŠ[ƒ€‚É’¼Ú“]‘—‚µ‚Ü‚·B

+
+FRESULT f_forward (
+  FIL* FileObject,                 /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘Ì */
+  UINT (*Func)(const BYTE*,UINT),  /* ƒf[ƒ^“]‘—ŠÖ” */
+  UINT ByteToFwd,                  /* “]‘—‚·‚éƒoƒCƒg” */
+  UINT* ByteFwd                    /* “]‘—‚³‚ꂽƒoƒCƒg” */
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
Func
+
ƒf[ƒ^‚ð“n‚·ƒ†[ƒU’è‹`ŠÖ”‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B‚±‚ÌŠÖ”‚ÌŽd—l‚̓Tƒ“ƒvƒ‹‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B
+
ByteToRead
+
“]‘—‚·‚éƒoƒCƒg”(0`UINT‚ÌÅ‘å’l)‚ðŽw’肵‚Ü‚·B
+
ByteRead
+
ŽÀÛ‚É“]‘—‚³‚ꂽƒoƒCƒg”‚ðŠi”[‚·‚é•Ï”‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_DENIED
+
”ñ“ǂݞ‚݃‚[ƒh‚ÅŠJ‚¢‚½ƒtƒ@ƒCƒ‹‚©‚ç“ǂݞ‚à‚¤‚Æ‚µ‚½B
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_INVALID_OBJECT
+
–³Œø‚ȃtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒgB
+
+
+ + +
+

‰ðà

+

ƒtƒ@ƒCƒ‹‚̃f[ƒ^‚ðƒoƒbƒtƒ@‚ɓǂÝo‚³‚¸‚É‘—MƒXƒgƒŠ[ƒ€‚É’¼Ú“]‘—‚µ‚Ü‚·BƒAƒvƒŠƒP[ƒVƒ‡ƒ“‘¤‚Ńf[ƒ^Eƒoƒbƒtƒ@‚ð•K—v‚Æ‚µ‚È‚¢‚Ì‚ÅAƒƒ‚ƒŠ‚ÌŒÀ‚ç‚ꂽŠÂ‹«‚Å—LŒø‚Å‚·B“]‘—ŠJŽnˆÊ’u‚ÍAŒ»Ý‚̃tƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚©‚ç‚ɂȂè‚Ü‚·Bƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚Í“]‘—‚³‚ꂽƒoƒCƒg”‚¾‚¯i‚݂܂·BŽw’肳‚ꂽƒoƒCƒg”‚Ì“]‘—’†‚Ƀtƒ@ƒCƒ‹‚ÌI’[‚É’B‚µ‚½ê‡‚â‘—MƒXƒgƒŠ[ƒ€‚ªƒrƒW[‚ɂȂÁ‚½ê‡A*ByteFwd‚ÍByteToFwd‚æ‚è‚ଂ³‚­‚È‚è‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

_USE_FORWARD == 1‚ÅAŠŽ‚Â_FS_TINY == 1‚̂Ƃ«‚ÉŽg—p‰Â”\‚Å‚·B

+
+ + +
+

Žg—p—áiƒI[ƒfƒBƒIĶj

+
+/*-----------------------------------------------------------------------*/
+/* f_forwardŠÖ”‚©‚çŒÄ‚΂ê‚éƒf[ƒ^‘—MŠÖ”‚Ì—á                           */
+/*-----------------------------------------------------------------------*/
+
+UINT out_stream (   /* –ß‚è’l: “]‘—‚³‚ꂽƒoƒCƒg”‚Ü‚½‚̓XƒgƒŠ[ƒ€‚Ìó‘Ô */
+    const BYTE *p,  /* “]‘—‚·‚éƒf[ƒ^‚ðŽw‚·ƒ|ƒCƒ“ƒ^ */
+    UINT btf        /* >0: “]‘—‚ðs‚¤(ƒoƒCƒg”). 0: ƒXƒgƒŠ[ƒ€‚Ìó‘Ԃ𒲂ׂé */
+)
+{
+    UINT cnt = 0;
+
+
+    if (btf == 0) {     /* ƒZƒ“ƒX—v‹ */
+        /* ƒXƒgƒŠ[ƒ€‚Ìó‘Ô‚ð•Ô‚· (0: ƒrƒW[, 1: ƒŒƒfƒB) */
+        /* ˆê’UAƒŒƒfƒB‚ð•Ô‚µ‚½‚çA‘±‚­“]‘——v‹‚Å­‚È‚­‚Æ‚à1ƒoƒCƒg‚Í */
+        /* “]‘—‚³‚ê‚È‚¢‚Æ f_forwardŠÖ”‚Í FR_RW_ERROR ‚ƂȂéB */
+        if (FIFO_READY) cnt = 1;
+    }
+    else {              /* “]‘——v‹ */
+        do {    /* ‘S‚ẴoƒCƒg‚ð“]‘—‚·‚é‚©AƒXƒgƒŠ[ƒ€‚ªƒrƒW[‚ɂȂé‚܂ŌJ‚è•Ô‚· */
+            FIFO_PORT = *p++;
+            cnt++;
+        } while (cnt < btf && FIFO_READY);
+    }
+
+    return cnt;
+}
+
+
+/*-----------------------------------------------------------------------*/
+/* f_forwardŠÖ”‚ÌŽg—p—á                                                 */
+/*-----------------------------------------------------------------------*/
+
+FRESULT play_file (
+    char *fn        /* Ķ‚·‚éƒI[ƒfƒBƒIEƒtƒ@ƒCƒ‹–¼‚ðŽw‚·ƒ|ƒCƒ“ƒ^ */
+)
+{
+    FRESULT rc;
+    FIL fil;
+    UINT dmy;
+
+    /* ƒtƒ@ƒCƒ‹‚ð“Ç‚Ýo‚µƒ‚[ƒh‚ÅŠJ‚­ */
+    rc = f_open(&fil, fn, FA_READ);
+
+    /* ‘S‚Ẵf[ƒ^‚ª“]‘—‚³‚ê‚é‚©ƒGƒ‰[‚ª”­¶‚·‚é‚܂ő±‚¯‚é */
+    while (rc == FR_OK && fil.fptr < fil.fsize) {
+
+        /* ‚Ù‚©‚̈—... */
+
+        /* ’èŠú“I‚Ü‚½‚Í—v‹‚ɉž‚¶‚ăf[ƒ^‚ðƒXƒgƒŠ[ƒ€‚É‘—o‚·‚é */
+        rc = f_forward(&fil, out_stream, 1000, &dmy);
+    }
+
+    return rc;	/* FR_OK: ³íI—¹, ‚Ù‚©:ˆÙíI—¹ */
+}
+
+
+ + +
+

ŽQÆ

+

f_open, fgets, f_write, f_close, FIL

+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/getfree.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/getfree.html new file mode 100644 index 0000000..23751c6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/getfree.html @@ -0,0 +1,101 @@ + + + + + + + +FatFs - f_getfree + + + + +
+

f_getfree

+

˜_—ƒhƒ‰ƒCƒuã‚Ì–¢Žg—pƒNƒ‰ƒXƒ^”‚𓾂܂·B

+
+FRESULT f_getfree (
+  const XCHAR* Path,       /* ‘ÎÛƒhƒ‰ƒCƒu‚̃‹[ƒgEƒfƒBƒŒƒNƒgƒŠ */
+  DWORD* Clusters,         /* ‹ó‚«ƒNƒ‰ƒXƒ^”‚ðŠi”[‚·‚é•Ï”‚ւ̃|ƒCƒ“ƒ^ */
+  FATFS** FileSystemObject /* ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
Path
+
‘Îۂ̘_—ƒhƒ‰ƒCƒu‚̃‹[ƒgƒfƒBƒŒƒNƒgƒŠ‚̃pƒX–¼‚ª“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
Clusters
+
‹ó‚«ƒNƒ‰ƒXƒ^”‚ðŠi”[‚·‚éDWORD•Ï”‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
FileSystemObject
+
‘ÎÛƒhƒ‰ƒCƒu‚̃tƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ª•Ô‚³‚ê‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B*Clusters‚ɋ󂫃Nƒ‰ƒXƒ^”‚ª•Ô‚³‚ê‚Ü‚·B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
‚»‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ª—^‚¦‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒp[ƒe[ƒVƒ‡ƒ“‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

˜_—ƒhƒ‰ƒCƒuã‚̋󂫃Nƒ‰ƒXƒ^”‚ðŽæ“¾‚µ‚Ü‚·B•Ô‚³‚ꂽƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg‚Ìcsizeƒƒ“ƒo‚ªƒNƒ‰ƒXƒ^‚ ‚½‚è‚̃ZƒNƒ^”‚ðŽ¦‚µ‚Ä‚¢‚é‚Ì‚ÅA‚±‚ê‚ðŒ³‚ÉŽÀۂ̋󂫃TƒCƒY‚ªŒvŽZ‚Å‚«‚Ü‚·BFAT32ƒ{ƒŠƒ…[ƒ€‚É‚¨‚¢‚Ä‚ÍAFSINFO‚Ìó‘Ô‚É‚æ‚Á‚Ă͕s³Šm‚È’l‚ð•Ô‚µ‚½‚èAˆ—‚ÉŽžŠÔ‚ª‚©‚©‚Á‚½‚è‚·‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

_FS_READONLY == 0‚ÅAŠŽ‚Â_FS_MINIMIZE == 0‚̂Ƃ«Žg—p‰Â”\‚Å‚·B

+
+ + +
+

Žg—p—á

+
+    FATFS *fs;
+    DWORD fre_clust, fre_sect, tot_sect;
+
+
+    /* Get drive information and free clusters */
+    res = f_getfree("/", &fre_clust, &fs);
+    if (res) die(res);
+
+    /* Get total sectors and free sectors */
+    tot_sect = (fs->max_clust - 2) * fs->csize;
+    fre_sect = fre_clust * fs->csize;
+
+    /* Print free space in unit of KB (assuming 512B/sector) */
+    printf("%lu KB total drive space.\n"
+           "%lu KB available.\n",
+           fre_sect / 2, tot_sect / 2);
+
+
+ + +
+

ŽQÆ

+FATFS +
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/gets.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/gets.html new file mode 100644 index 0000000..a464a9f --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/gets.html @@ -0,0 +1,63 @@ + + + + + + + +FatFs - f_gets + + + + +
+

f_gets

+

ƒtƒ@ƒCƒ‹‚©‚ç•¶Žš—ñ‚ð“Ç‚Ýo‚µ‚Ü‚·B

+
+char* f_gets (
+  char* Str,        /* ƒoƒbƒtƒ@ */
+  int Size,         /* ƒoƒbƒtƒ@‚̃TƒCƒY */
+  FIL* FileObject   /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg */
+);
+
+
+ +
+

ˆø”

+
+
Str
+
•¶Žš—ñ‚ð“Ç‚Ýo‚·ƒoƒbƒtƒ@‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
Size
+
ƒoƒbƒtƒ@‚̃TƒCƒY‚ðŽw’肵‚Ü‚·B
+
FileObject
+
ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+

ŠÖ”‚ª¬Œ÷‚·‚邯Str‚ª•Ô‚³‚ê‚Ü‚·B

+
+ + +
+

‰ðà

+

‚±‚ÌŠÖ”‚Íf_read()‚̃‰ƒbƒp[ŠÖ”‚Å‚·B“Ç‚Ýo‚µ“®ì‚ÍAʼn‚Ì'\n'‚ð“ǂݞ‚Þ‚©Aƒtƒ@ƒCƒ‹I’[‚É’B‚·‚é‚©ASize - 1•¶Žš‚ð“Ç‚Ýo‚·‚܂ő±‚«‚Ü‚·B“ǂݞ‚܂ꂽ•¶Žš—ñ‚ÌI’[‚É‚Í'\0'‚ª•t‰Á‚³‚ê‚Ü‚·BŠù‚Ƀtƒ@ƒCƒ‹I’[‚Å1•¶Žš‚à“ǂݞ‚Ü‚ê‚È‚©‚Á‚½‚Æ‚«A‚Ü‚½‚͉½‚ç‚©‚̃Gƒ‰[‚ª”­¶‚µ‚½‚Æ‚«‚ÍNULL‚ð•Ô‚µ‚Ü‚·Bƒtƒ@ƒCƒ‹I’[‚©ƒGƒ‰[‚©‚Íf_eof(),f_error()ƒ}ƒNƒ‚Å’²‚ׂç‚ê‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

_USE_STRFUNC‚ª 1‚Ü‚½‚Í 2‚̂Ƃ«Žg—p‰Â”\‚Å‚·B2‚̂Ƃ«‚ÍAƒtƒ@ƒCƒ‹‚Ɋ܂܂ê‚é'\r'‚ªŽæ‚蜂©‚ê‚ăoƒbƒtƒ@‚ɓǂݞ‚Ü‚ê‚Ü‚·B

+
+ + + + +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/lseek.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/lseek.html new file mode 100644 index 0000000..3ea09a5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/lseek.html @@ -0,0 +1,110 @@ + + + + + + + +FatFs - f_lseek + + + + +
+

f_lseek

+

ƒtƒ@ƒCƒ‹‚ÌR/Wƒ|ƒCƒ“ƒ^‚ðˆÚ“®‚µ‚Ü‚·B

+
+FRESULT f_lseek (
+  FIL* FileObject,   /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^ */
+  DWORD Offset       /* ˆÚ“®æƒIƒtƒZƒbƒg */
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
‘ÎۂƂȂéƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
Offset
+
ˆÚ“®æ‚̃IƒtƒZƒbƒgiR/Wƒ|ƒCƒ“ƒ^j’lBƒtƒ@ƒCƒ‹æ“ª‚©‚ç‚̃IƒtƒZƒbƒg‚ðƒoƒCƒg’PˆÊ‚ÅŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_INVALID_OBJECT
+
–³Œø‚ȃtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒgB
+
+
+ + +
+

‰ðà

+

ƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^(ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg“à‚Ìfptrƒƒ“ƒo‚ÅAŽŸ‚ɓǂÝo‚µE‘‚«ž‚Ý‚³‚ê‚éƒoƒCƒg‚̃IƒtƒZƒbƒg‚ðŽ¦‚·)‚ðˆÚ“®‚µ‚Ü‚·BƒIƒtƒZƒbƒg‚ÌŒ´“_‚̓tƒ@ƒCƒ‹æ“ª‚©‚ç‚Å‚·B‘‚«ž‚݃‚[ƒh‚Ńtƒ@ƒCƒ‹EƒTƒCƒY‚æ‚è‘å‚«‚È’l‚ðŽw’è‚·‚邯A‚»‚±‚܂Ńtƒ@ƒCƒ‹‚ªŠg’£‚³‚êAŠg’£‚³‚ꂽ•”•ª‚̃f[ƒ^‚Í–¢’è‹`‚ƂȂè‚Ü‚·Bƒf[ƒ^‚ð’x‰„–³‚­‚‘¬‚É‘‚«ž‚Ý‚½‚¢‚Æ‚«‚ÍA—\‚ß‚±‚ÌŠÖ”‚Å•K—v‚ȃTƒCƒY‚܂Ńtƒ@ƒCƒ‹EƒTƒCƒY‚ðŠg’£‚µ‚Ä‚¨‚­‚Æ—Ç‚¢‚Å‚µ‚傤Bf_lseekŠÖ”‚ª³íI—¹‚µ‚½‚ ‚Æ‚ÍAƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚ª³‚µ‚­ˆÚ“®‚µ‚½‚©fptr‚ðƒ`ƒFƒbƒN‚·‚é‚ׂ«‚Å‚·Bƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚ªŽw’è‚æ‚謂³‚¢‚Æ‚«‚ÍAŽŸ‚ÌŒ´ˆö‚ªl‚¦‚ç‚ê‚Ü‚·B

+
    +
  • ”ñ‘‚«ž‚݃‚[ƒh‚Ì‚½‚ßAƒtƒ@ƒCƒ‹EƒTƒCƒY‚ŃNƒŠƒbƒv‚³‚ꂽB
  • +
  • ƒtƒ@ƒCƒ‹Šg’£’†‚ɃfƒBƒXƒN‚ª–ž”t‚ɂȂÁ‚½B
  • +
+
+ + +
+

‘Ήžî•ñ

+

_FS_MINIMIZE < 3‚̂Ƃ«Žg—p‰Â”\‚Å‚·B

+
+ + +
+

Žg—p—á

+
+    /* ƒIƒtƒZƒbƒg5000‚ÖˆÚ“® */
+    res = f_lseek(&file, 5000);
+
+    /* ƒtƒ@ƒCƒ‹’Ç‹L‚Ì€”õ (ƒtƒ@ƒCƒ‹I’[‚ÖˆÚ“®) */
+    res = f_lseek(&file, file.fsize);
+
+    /* 3000ƒoƒCƒgi‚ß‚é */
+    res = f_lseek(&file, file.fptr + 3000);
+
+    /* 2000ƒoƒCƒg–ß‚· (ƒI[ƒo[ƒtƒ[‚É’ˆÓ) */
+    res = f_lseek(&file, file.fptr - 2000);
+
+
+    /* ƒNƒ‰ƒXƒ^æsŠ„‚è“–‚Ä (ƒXƒgƒŠ[ƒ~ƒ“ƒOEƒ‰ƒCƒgŽž‚̃oƒbƒtƒ@EƒI[ƒo[ƒ‰ƒ“–hŽ~) */
+
+    res = f_open(&file, "record.wav", FA_CREATE_NEW | FA_WRITE); /* ƒtƒ@ƒCƒ‹ì¬ */
+
+    res = f_lseek(&file, MAX_SIZE);        /* \•ª‚ȃNƒ‰ƒXƒ^‚ÌæsŠ„‚è“–‚Ä */
+    if (res || file.fptr != PRE_SIZE) .... /* ³‚µ‚­ƒtƒ@ƒCƒ‹‚ªŠg’£‚³‚ꂽ‚©ƒ`ƒFƒbƒN */
+
+    res = f_lseek(&file, DATA_START);      /* ƒf[ƒ^EƒXƒgƒŠ[ƒ€‚Ì‹L˜^(ƒAƒƒP[ƒVƒ‡ƒ“ƒfƒBƒŒƒC–³‚µ) */
+    ...
+
+    res = f_truncate(&file);              /* •s—v—̈æ‚ÌØ‚èŽÌ‚Ä */
+    res = f_lseek(&file, 0);              /* ƒwƒbƒ_‚Ì‹L˜^ */
+    ...
+
+    res = f_close(&file);
+
+
+ + +
+

ŽQÆ

+

f_open, FIL

+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/mkdir.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/mkdir.html new file mode 100644 index 0000000..5dd3860 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/mkdir.html @@ -0,0 +1,89 @@ + + + + + + + +FatFs - f_mkdir + + + + +
+

f_mkdir

+

ƒfƒBƒŒƒNƒgƒŠ‚ð쬂µ‚Ü‚·B

+
+FRESULT f_mkdir (
+  const XCHAR* DirName /* 쬂·‚éƒfƒBƒŒƒNƒgƒŠ–¼‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
DirName
+
쬂·‚éƒfƒBƒŒƒNƒgƒŠ‚̃pƒX–¼‚ª“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_DENIED
+
ƒfƒBƒXƒN‚âƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ª–ž”t‚ÌꇂȂÇB
+
FR_EXIST
+
“¯–¼‚̃fƒBƒŒƒNƒgƒŠ‚âƒtƒ@ƒCƒ‹‚ª‘¶Ý‚·‚éB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘ÔB
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
‚»‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ª—^‚¦‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒ{ƒŠƒ…[ƒ€‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

‹ó‚̃fƒBƒŒƒNƒgƒŠ‚ð쬂µ‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

_FS_READONLY == 0‚ÅAŠŽ‚Â_FS_MINIMIZE == 0‚̂Ƃ«Žg—p‰Â”\‚Å‚·B

+
+ + +
+

Žg—p—á

+
+    res = f_mkdir("sub1");
+    if (res) die(res);
+    res = f_mkdir("sub1/sub2");
+    if (res) die(res);
+    res = f_mkdir("sub1/sub2/sub3");
+    if (res) die(res);
+
+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/mkfs.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/mkfs.html new file mode 100644 index 0000000..14fdff4 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/mkfs.html @@ -0,0 +1,78 @@ + + + + + + + +FatFs - f_mkfs + + + + +
+

f_mkfs

+

ƒhƒ‰ƒCƒuã‚ÉFATƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚ðì¬(ƒtƒH[ƒ}ƒbƒg)‚µ‚Ü‚·B

+
+FRESULT f_mkfs (
+  BYTE  Drive,              /* ˜_—ƒhƒ‰ƒCƒu”Ô† */
+  BYTE  PartitioningRule,   /* ‹æ‰æì¬•û–@ */
+  WORD  AllocSize           /* ƒNƒ‰ƒXEƒ^ƒTƒCƒY */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
ƒtƒH[ƒ}ƒbƒg‚·‚é˜_—ƒhƒ‰ƒCƒu(0-9)B
+
PartitioningRule
+
0‚ðŽw’è‚·‚邯Aƒhƒ‰ƒCƒu‚Ì‘S—̈æ‚ðè‚ß‚éŠî–{DOS‹æ‰æ‚ð쬂µ‚½‚ ‚Æ‚»‚Ì‹æ‰æ‚Ƀtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚ð쬂µ‚Ü‚·(FDISKƒtƒH[ƒ}ƒbƒg)B1‚ðŽw’è‚·‚邯A‹æ‰æƒe[ƒuƒ‹‚ð쬂¹‚¸ƒhƒ‰ƒCƒu‚Ìæ“ªƒZƒNƒ^‚©‚ç’¼Úƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚ð쬂µ‚Ü‚·(super floppy (SFD) ƒtƒH[ƒ}ƒbƒg)B
+
AllocSize
+
ƒNƒ‰ƒXƒ^EƒTƒCƒY‚ðƒoƒCƒg’PˆÊ‚ÅŽw’肵‚Ü‚·B0‚Ü‚½‚Í512`32768‚͈̔͂ł©‚Â2‚Ì—Ýæ‚łȂ¯‚ê‚΂Ȃè‚Ü‚¹‚ñB0‚ðŽw’è‚·‚邯ƒhƒ‰ƒCƒuEƒTƒCƒY‚ɉž‚¶‚½ƒfƒtƒHƒ‹ƒg‚̃Nƒ‰ƒXƒ^EƒTƒCƒY‚ð‘I‘ð‚µ‚Ü‚·BFAT64(64KB/ƒNƒ‰ƒXƒ^)‚Í‘I‘ð‚Å‚«‚Ü‚¹‚ñB
+
+
+ +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª–³ŒøB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘ÔB
+
FR_NOT_ENABLED
+
‚»‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ªŠ„‚è“–‚Ä‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_MKFS_ABORTED
+
ŽŸ‚Ì——R‚ÅŠJŽn‘O‚Ɉ—‚ª’†’f‚³‚ꂽB +
    +
  • ƒfƒBƒXƒNEƒTƒCƒY‚ª¬‚³‚·‚¬‚éB
  • +
  • ‰½‚ç‚©‚̈ø”‚ª•s³B
  • +
  • ‚»‚̃Nƒ‰ƒXƒ^EƒTƒCƒY‚ªŽg‚¦‚È‚¢BƒNƒ‰ƒXƒ^”‚ª0xFF7‚Æ0xFFF7‹ß•Ó‚É‚È‚é‚Æ‚«”­¶‚·‚é‰Â”\«‚ª‚ ‚éB
  • +
+
+
+
+ +
+

à–¾

+

f_mkfsŠÖ”‚ÍFATƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚ðƒhƒ‰ƒCƒuã‚É쬂µ‚Ü‚·BƒŠƒ€[ƒoƒuƒ‹EƒƒfƒBƒA‚̃p[ƒe[ƒVƒ‡ƒjƒ“ƒOEƒ‹[ƒ‹‚Æ‚µ‚Ä‚ÍFDISKŒ`Ž®‚ÆSFDŒ`Ž®‚ª‚ ‚èAƒƒ‚ƒŠEƒJ[ƒh‚Å‚ÍFDISKŒ`Ž®‚ª•’ʂł·B‚±‚ÌŠÖ”‚Í•¡”‹æ‰æ‚ɂ͑Ήž‚µ‚Ä‚¢‚È‚¢‚Ì‚ÅA‚»‚Ì•¨—ƒhƒ‰ƒCƒu‚ÌŠù‘¶‚Ì‹æ‰æ‚Í‘S‚Ä휂³‚êA‘S‘Ì‚ªˆê‚Â‚Ì‹æ‰æ‚ɂȂè‚Ü‚·B

+

FATƒ^ƒCƒv(FAT12/FAT16/FAT32)‚ÍA‚»‚̘_—ƒhƒ‰ƒCƒuã‚̃Nƒ‰ƒXƒ^”‚É‚æ‚Á‚Ă̂݌ˆ’肳‚ê‚é[FATŽd—l‘‚æ‚è]Œˆ‚Ü‚è‚ɂȂÁ‚Ä‚¢‚ÄA‚»‚êˆÈŠO‚Ì—vˆö‚Í‚ ‚è‚Ü‚¹‚ñB‚µ‚½‚ª‚Á‚ÄA‚Ç‚ÌFATƒ^ƒCƒv‚ɂȂ邩‚̓hƒ‰ƒCƒuEƒTƒCƒY‚ÆŽw’肳‚ꂽƒNƒ‰ƒXƒ^EƒTƒCƒY‚Ɉˑ¶‚µ‚Ü‚·BƒNƒ‰ƒXƒ^EƒTƒCƒY‚͑傫‚­‚·‚é‚Ù‚Ç«”\‚ªã‚ª‚èA‹t‚ɃfƒBƒXƒN—˜—pŒø—¦‚Í—Ž‚¿‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

_FS_READONLY == 0‚ÅAŠŽ‚Â_USE_MKFS == 1‚̂Ƃ«Žg—p‰Â”\‚Å‚·B

+
+ + +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/mount.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/mount.html new file mode 100644 index 0000000..425f921 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/mount.html @@ -0,0 +1,65 @@ + + + + + + + +FatFs - f_mount + + + + +
+

f_mount

+

˜_—ƒhƒ‰ƒCƒu(ƒ{ƒŠƒ…[ƒ€)‚̃[ƒNEƒGƒŠƒA‚ð“o˜^E–•Á‚µ‚Ü‚·B

+
+FRESULT f_mount (
+  BYTE  Drive,               /* ˜_—ƒhƒ‰ƒCƒu”Ô† */
+  FATFS*  FileSystemObject   /* ƒ[ƒNEƒGƒŠƒA‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
˜_—ƒhƒ‰ƒCƒu”Ô†(0-9)B
+
FileSystemObject
+
“o˜^‚·‚éƒ[ƒNEƒGƒŠƒA(ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg)‚ւ̃|ƒCƒ“ƒ^B
+
+
+ +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª–³ŒøB
+
+
+ + +
+

‰ðà

+

FatFsƒ‚ƒWƒ…[ƒ‹‚ł͂»‚ꂼ‚ê‚̘_—ƒhƒ‰ƒCƒu‚Ƀtƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg‚Æ‚¢‚¤ƒ[ƒNEƒGƒŠƒA‚ª•K—v‚Å‚·B‚±‚ÌŠÖ”‚͘_—ƒhƒ‰ƒCƒu‚É‚»‚̃[ƒNEƒGƒŠƒA‚ð“o˜^‚µ‚½‚è–•Á‚µ‚½‚肵‚Ü‚·B‰½‚ç‚©‚̃tƒ@ƒCƒ‹ŠÖ”‚ðŽg—p‚·‚é‘O‚É‚±‚ÌŠÖ”‚Å‚»‚̘_—ƒhƒ‰ƒCƒu‚̃[ƒNEƒGƒŠƒA‚ð—^‚¦‚Ä‚¨‚©‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñBFileSystemObject‚Ƀkƒ‹Eƒ|ƒCƒ“ƒ^‚ðŽw’è‚·‚邯‚»‚̘_—ƒhƒ‰ƒCƒu‚̃[ƒNEƒGƒŠƒA‚Ì“o˜^‚Í–•Á‚³‚êA“o˜^‚³‚ê‚Ä‚¢‚½ƒ[ƒNEƒGƒŠƒA‚Í”jŠü‚Å‚«‚Ü‚·B

+

‚±‚ÌŠÖ”“à‚ł͕¨—ƒhƒ‰ƒCƒu‚ւ̃AƒNƒZƒX‚Í”­¶‚¹‚¸Aƒ[ƒNEƒGƒŠƒA‚ð‰Šú‰»‚µ‚Ä“à•””z—ñ‚É‚»‚̃AƒhƒŒƒX‚ð“o˜^‚·‚邾‚¯‚Å‚·BŽÀۂ̃}ƒEƒ“ƒg“®ì‚ÍAf_mount()‚Ü‚½‚̓ƒfƒBƒAŒðŠ·ŒãAʼn‚̃tƒ@ƒCƒ‹EƒAƒNƒZƒX‚̂Ƃ«‚És‚í‚ê‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

‘S‚Ä‚Ì\¬‚ÅŽg—p‰Â”\‚Å‚·B

+
+ + +
+

ŽQÆ

+

FATFS

+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/open.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/open.html new file mode 100644 index 0000000..6be7497 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/open.html @@ -0,0 +1,144 @@ + + + + + + + +FatFs - f_open + + + + +
+

f_open

+

ƒtƒ@ƒCƒ‹‚ðƒI[ƒvƒ“‚Ü‚½‚Í쬂µ‚Ü‚·B

+
+FRESULT f_open (
+  FIL* FileObject,       /* ‹ó‚̃tƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^ */
+  const XCHAR* FileName, /* ƒtƒ@ƒCƒ‹‚̃tƒ‹ƒpƒX–¼‚ւ̃|ƒCƒ“ƒ^ */
+  BYTE ModeFlags         /* ƒ‚[ƒhƒtƒ‰ƒO */
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
V‚µ‚­ì¬‚·‚éƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·BˆÈ~A‚»‚̃tƒ@ƒCƒ‹‚ð•‚¶‚é‚܂ł±‚̃tƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ðŽg—p‚µ‚ătƒ@ƒCƒ‹‘€ì‚ð‚µ‚Ü‚·B
+
FileName
+
ŠJ‚­(‚Ü‚½‚Í쬂·‚é)ƒtƒ@ƒCƒ‹‚Ì ƒtƒ@ƒCƒ‹–¼‚ª“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
ModeFlags
+
ƒtƒ@ƒCƒ‹‚̃AƒNƒZƒX•û–@‚âƒI[ƒvƒ“•û–@‚ðŒˆ‚ß‚éƒtƒ‰ƒO‚Å‚·B‚±‚̃pƒ‰ƒ[ƒ^‚ɂ͎Ÿ‚Ì‘g‚݇‚킹‚ðŽw’肵‚Ü‚·B
+ + + + + + + + +
’lˆÓ–¡
FA_READ“Ç‚Ýo‚µƒ‚[ƒh‚ÅŠJ‚«‚Ü‚·B“ǂݑ‚«‚·‚éꇂÍFA_WRITE‚Æ‹¤‚ÉŽw’肵‚Ü‚·B
FA_WRITE‘‚«ž‚݃‚[ƒh‚ÅŠJ‚«‚Ü‚·B“ǂݑ‚«‚·‚éꇂÍFA_READ‚Æ‹¤‚ÉŽw’肵‚Ü‚·B
FA_OPEN_EXISTINGŠù‘¶‚̃tƒ@ƒCƒ‹‚ðŠJ‚«‚Ü‚·Bƒtƒ@ƒCƒ‹‚ª–³‚¢‚Æ‚«‚̓Gƒ‰[‚ɂȂè‚Ü‚·B(ƒfƒtƒHƒ‹ƒg)
FA_OPEN_ALWAYSŠù‘¶‚̃tƒ@ƒCƒ‹‚ðŠJ‚«‚Ü‚·Bƒtƒ@ƒCƒ‹‚ª–³‚¢‚Æ‚«‚̓tƒ@ƒCƒ‹‚ð쬂µ‚Ü‚·B
FA_CREATE_NEWƒtƒ@ƒCƒ‹‚ð쬂µ‚Ü‚·B“¯–¼‚̃tƒ@ƒCƒ‹‚ª‚ ‚éꇂÍAƒGƒ‰[‚ɂȂè‚Ü‚·B
FA_CREATE_ALWAYSƒtƒ@ƒCƒ‹‚ð쬂µ‚Ü‚·B“¯–¼‚̃tƒ@ƒCƒ‹‚ª‚ ‚éꇂÍAƒTƒCƒY‚ð0‚É‚µ‚Ä‚©‚çŠJ‚«‚Ü‚·B
+
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹BˆÈ~AFileObject\‘¢‘Ì‚ðŽg‚Á‚Ä‚±‚̃tƒ@ƒCƒ‹‚ð‘€ì‚Å‚«‚Ü‚·B
+
FR_NO_FILE
+
ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒtƒ@ƒCƒ‹–¼‚ª•s³B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_EXIST
+
“¯–¼‚̃tƒ@ƒCƒ‹‚ªŠù‚É‚ ‚éB
+
FR_DENIED
+
ƒAƒNƒZƒX‚ª‹‘”Û‚³‚ꂽBƒŠ[ƒhEƒIƒ“ƒŠ[Eƒtƒ@ƒCƒ‹‚Ì‘‚«ž‚݃‚[ƒhEƒI[ƒvƒ“A“¯–¼‚̃fƒBƒŒƒNƒgƒŠ‚Ü‚½‚̓Š[ƒhEƒIƒ“ƒŠ[Eƒtƒ@ƒCƒ‹‚ª‚ ‚éó‘Ԃł̃tƒ@ƒCƒ‹ì¬AƒfƒBƒXƒN‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠEƒe[ƒuƒ‹‚ª–ž”t‚Ńtƒ@ƒCƒ‹‚ð쬂ł«‚È‚¢‚È‚ÇB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘Ô‚Å‘‚«ž‚ÝŒnƒI[ƒvƒ“‚ð‚µ‚½B
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
‚»‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ªŠ„‚è“–‚Ä‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒ{ƒŠƒ…[ƒ€‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

Šù‘¶‚̃tƒ@ƒCƒ‹‚ðŠJ‚¢‚½‚èAV‚µ‚¢ƒtƒ@ƒCƒ‹‚ð쬂µ‚Ü‚·BŠÖ”‚ª¬Œ÷‚·‚邯ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ªì¬‚³‚êAˆÈ~‚»‚̃tƒ@ƒCƒ‹‚ɑ΂·‚éƒAƒNƒZƒX‚ÉŽg—p‚µ‚Ü‚·Bƒtƒ@ƒCƒ‹‚ð•‚¶‚邯‚«‚ÍAf_close()‚ðŽg—p‚µ‚Ü‚·B‰½‚ç‚©‚Ì•ÏX‚ªs‚í‚ꂽƒtƒ@ƒCƒ‹‚ª‚»‚̌㳂µ‚­•‚¶‚ç‚ê‚È‚©‚Á‚½ê‡A‚»‚̃tƒ@ƒCƒ‹‚ª”j‘¹‚·‚éꇂª‚ ‚è‚Ü‚·B

+

ƒtƒ@ƒCƒ‹EƒAƒNƒZƒX‚ðŠJŽn‚·‚é‘O‚ÉAf_mount()‚ðŽg‚Á‚Ä‚»‚ꂼ‚ê‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA(ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg)‚ð—^‚¦‚é•K—v‚ª‚ ‚è‚Ü‚·B‚±‚̉Šú‰»‚ÌŒãA‚»‚̘_—ƒhƒ‰ƒCƒu‚ɑ΂µ‚Ä‘S‚Ẵtƒ@ƒCƒ‹ŠÖ”‚ªŽg‚¦‚邿‚¤‚ɂȂè‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

‘S‚Ä‚Ì\¬‚ÅŽg—p‰Â”\‚Å‚·B_FS_READONLY == 1‚̂Ƃ«‚ÍAFA_WRITE, FA_CREATE_ALWAYS, FA_CREATE_NEW, FA_OPEN_ALWAYS‚ÌŠeƒtƒ‰ƒO‚̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+
+ + +
+

Žg—p—áiƒtƒ@ƒCƒ‹EƒRƒs[j

+
+void main (void)
+{
+    FATFS fs[2];         /* ˜_—ƒhƒ‰ƒCƒu‚̃[ƒNEƒGƒŠƒA(ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg) */
+    FIL fsrc, fdst;      /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg */
+    BYTE buffer[4096];   /* file copy buffer */
+    FRESULT res;         /* FatFs function common result code */
+    UINT br, bw;         /* File R/W count */
+
+    /* ƒhƒ‰ƒCƒu0,1‚Ƀ[ƒNEƒGƒŠƒA‚ð—^‚¦‚é */
+    f_mount(0, &fs[0]);
+    f_mount(1, &fs[1]);
+
+    /* ƒhƒ‰ƒCƒu1‚̃\[ƒXEƒtƒ@ƒCƒ‹‚ðŠJ‚­ */
+    res = f_open(&fsrc, "1:srcfile.dat", FA_OPEN_EXISTING | FA_READ);
+    if (res) die(res);
+
+    /* ƒhƒ‰ƒCƒu0‚ɃfƒXƒeƒBƒl[ƒVƒ‡ƒ“Eƒtƒ@ƒCƒ‹‚ð쬂·‚é */
+    res = f_open(&fdst, "0:dstfile.dat", FA_CREATE_ALWAYS | FA_WRITE);
+    if (res) die(res);
+
+    /* ƒ\[ƒX‚©‚çƒfƒXƒeƒBƒl[ƒVƒ‡ƒ“‚ɃRƒs[‚·‚é */
+    for (;;) {
+        res = f_read(&fsrc, buffer, sizeof(buffer), &br);
+        if (res || br == 0) break;   /* ƒGƒ‰[‚©ƒtƒ@ƒCƒ‹I’[ */
+        res = f_write(&fdst, buffer, br, &bw);
+        if (res || bw < br) break;   /* ƒGƒ‰[‚©ƒfƒBƒXƒN–ž”t */
+    }
+
+    /* ‘S‚Ẵtƒ@ƒCƒ‹‚ð•‚¶‚é */
+    f_close(&fsrc);
+    f_close(&fdst);
+
+    /* ƒ[ƒNEƒGƒŠƒA‚ðŠJ•ú‚·‚é */
+    f_mount(0, NULL);
+    f_mount(1, NULL);
+}
+
+
+ + +
+

ŽQÆ

+

f_read, f_write, f_close, FIL, FATFS

+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/opendir.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/opendir.html new file mode 100644 index 0000000..311ffeb --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/opendir.html @@ -0,0 +1,79 @@ + + + + + + + +FatFs - f_opendir + + + + +
+

f_opendir

+

ƒfƒBƒŒƒNƒgƒŠ‚ðŠJ‚«‚Ü‚·B

+
+FRESULT f_opendir (
+  DIR* DirObject,       /* ƒfƒBƒŒƒNƒgƒŠEƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^ */
+  const XCHAR* DirName  /* ƒfƒBƒŒƒNƒgƒŠ–¼‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
DirObject
+
‰Šú‰»‚·‚éƒfƒBƒŒƒNƒgƒŠEƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
DirName
+
ƒI[ƒvƒ“‚·‚éƒfƒBƒŒƒNƒgƒŠ‚ւ̃pƒX–¼‚ª“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
˜_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ª—^‚¦‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒ{ƒŠƒ…[ƒ€‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

ƒfƒBƒŒƒNƒgƒŠ‚ðŠJ‚«‚Ü‚·B³íI—¹‚µ‚½‚çADirObject\‘¢‘Ì‚ðŽg‚Á‚Ä‚±‚̃fƒBƒŒƒNƒgƒŠ‚Ì€–Ú‚ð‡ŽŸ“Ç‚Ýo‚¹‚Ü‚·BDirObject\‘¢‘͎̂g—pŒã‚Í”CˆÓ‚ÌŽž“_‚Å”jŠü‚Å‚«‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

_FS_MINIMIZE <= 1‚̂Ƃ«Žg—p‰Â”\‚ɂȂè‚Ü‚·B

+
+ + +
+

ŽQÆ

+

f_readdir, DIR

+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/printf.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/printf.html new file mode 100644 index 0000000..c742972 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/printf.html @@ -0,0 +1,82 @@ + + + + + + + +FatFs - f_printf + + + + +
+

f_printf

+

ƒtƒ@ƒCƒ‹‚ɑޮ‰»•¶Žš—ñ‚ð‘‚«ž‚݂܂·B

+
+int f_printf (
+  FIL* FileObject,     /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg */
+  const char* Foramt,  /* ‘Ž®§Œä•¶Žš—ñ */
+  ...
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
Format
+
'\0'‚ÅI‚í‚鑎®§Œä•¶Žš—ñ‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B'\0'‚Í‘‚«ž‚Ü‚ê‚Ü‚¹‚ñB
+
...
+
ƒIƒvƒVƒ‡ƒ“‚̈ø”B
+ +
+
+ + +
+

–ß‚è’l

+

•¶Žš—ñ‚ª³í‚É‘‚«ž‚Ü‚ê‚邯‘‚«ž‚ñ‚¾•¶Žš”‚ª•Ô‚³‚ê‚Ü‚·BƒfƒBƒXƒN‚ª–ž”t‚Ü‚½‚Í‚»‚Ì‘¼ƒGƒ‰[‚É‚æ‚è³í‚É‘‚«ž‚Ü‚ê‚È‚©‚Á‚½‚Æ‚«‚ÍEOF(-1)‚ª•Ô‚³‚ê‚Ü‚·B

+
+ + +
+

‰ðà

+

‚±‚ÌŠÖ”‚Íf_putc()‚¨‚æ‚Ñf_puts()‚̃‰ƒbƒp[ŠÖ”‚Å‚·B‘Ž®§Œä‹@”\‚̓TƒuƒZƒbƒg‚ƂȂÁ‚Ä‚¢‚ÄA‘Ž®§Œä•¶Žš‚ÍŽŸ‚ÉŽ¦‚·‚à‚Ì‚ªŽg—p‰Â”\‚Å‚·B

+
    +
  • ƒ^ƒCƒv: c s d u X
  • +
  • ¸“xŽw’è: l
  • +
  • ƒtƒ‰ƒO: 0
  • +
+
+ + +
+

‘Ήžî•ñ

+

_FS_READONLY == 0‚ÅAŠŽ‚Â_USE_STRFUNC‚ª 1‚Ü‚½‚Í 2‚̂Ƃ«Žg—p‰Â”\‚ɂȂè‚Ü‚·B2‚ÌŽž‚ÍAo—͂Ɋ܂܂ê‚é'\n'‚ª"\r\n"‚É“WŠJ‚³‚ê‚ătƒ@ƒCƒ‹‚É‘‚«ž‚Ü‚ê‚Ü‚·B

+
+ + +
+

Žg—p—á

+
+    f_printf(&fil, "%6d", -200);         // "  -200"
+    f_printf(&fil, "%02u", 5);           // "05"
+    f_printf(&fil, "%ld", 12345678L);    // "12345678"
+    f_printf(&fil, "%08lX", 1194684UL);  // "00123ABC"
+    f_printf(&fil, "%s", "String");      // "String"
+    f_printf(&fil, "%c", 'a');           // "a"
+
+
+ + + + +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/putc.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/putc.html new file mode 100644 index 0000000..c117cf3 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/putc.html @@ -0,0 +1,60 @@ + + + + + + + +FatFs - f_putc + + + + +
+

f_putc

+

ƒtƒ@ƒCƒ‹‚É•¶Žš‚ð‘‚«ž‚݂܂·B

+
+int f_putc (
+  int Chr,          /* ‘‚«ž‚Þ•¶Žš */
+  FIL* FileObject   /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg */
+);
+
+
+ +
+

ˆø”

+
+
Chr
+
‘‚«ž‚Þ•¶Žš‚ðŽw’肵‚Ü‚·B
+
FileObject
+
ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+

•¶Žš‚ª³í‚É‘‚«ž‚Ü‚ê‚邯‘‚«ž‚ñ‚¾•¶Žš‚ª•Ô‚³‚ê‚Ü‚·BƒfƒBƒXƒN‚ª–ž”t‚Ü‚½‚Í‚»‚Ì‘¼ƒGƒ‰[‚É‚æ‚è‘‚«ž‚Ü‚ê‚È‚©‚Á‚½‚Æ‚«‚ÍEOF‚ª•Ô‚³‚ê‚Ü‚·B

+
+ + +
+

‰ðà

+

1•¶Žš‚ðƒtƒ@ƒCƒ‹‚É‘‚«ž‚݂܂·B‚±‚ÌŠÖ”‚Íf_write()‚̃‰ƒbƒp[ŠÖ”‚Å‚·B

+
+ + +
+

‘Ήžî•ñ

+

_FS_READONLY == 0‚ÅAŠŽ‚Â_USE_STRFUNC‚ª 1‚Ü‚½‚Í 2‚̂Ƃ«Žg—p‰Â”\‚Å‚·B2‚ðŽw’è‚·‚邯A'\n'‚Í"\r\n"‚É“WŠJ‚³‚ê‚ătƒ@ƒCƒ‹‚É‘‚«ž‚Ü‚ê‚Ü‚·B

+
+ + + + +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/puts.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/puts.html new file mode 100644 index 0000000..7d8044f --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/puts.html @@ -0,0 +1,60 @@ + + + + + + + +FatFs - f_puts + + + + +
+

f_puts

+

ƒtƒ@ƒCƒ‹‚É•¶Žš—ñ‚ð‘‚«ž‚݂܂·B

+
+int f_puts (
+  const char* Str,  /* •¶Žš—ñ */
+  FIL* FileObject   /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg */
+);
+
+
+ +
+

ˆø”

+
+
Str
+
‘‚«ž‚Þ'\0'‚ÅI‚í‚é•¶Žš—ñ‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B'\0'‚Í‘‚«ž‚Ü‚ê‚Ü‚¹‚ñB
+
FileObject
+
ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+

•¶Žš—ñ‚ª³í‚É‘‚«ž‚Ü‚ê‚邯‘‚«ž‚ñ‚¾•¶Žš”‚ª•Ô‚³‚ê‚Ü‚·BƒfƒBƒXƒN‚ª–ž”t‚Ü‚½‚Í‚»‚Ì‘¼ƒGƒ‰[‚É‚æ‚è³í‚É‘‚«ž‚Ü‚ê‚È‚©‚Á‚½‚Æ‚«‚ÍEOF‚ª•Ô‚³‚ê‚Ü‚·B

+
+ + +
+

‰ðà

+

•¶Žš—ñ‚ðƒtƒ@ƒCƒ‹‚É‘‚«ž‚݂܂·B‚±‚ÌŠÖ”‚Íf_putc()‚̃‰ƒbƒp[ŠÖ”‚Å‚·B

+
+ + +
+

‘Ήžî•ñ

+

_FS_READONLY == 0‚ÅAŠŽ‚Â_USE_STRFUNC‚ª 1‚Ü‚½‚Í 2‚̂Ƃ«Žg—p‰Â”\‚Å‚·B2‚ðŽw’è‚·‚邯A•¶Žš—ñ‚Ɋ܂܂ê‚é'\n'‚Í"\r\n"‚É“WŠJ‚³‚ê‚ătƒ@ƒCƒ‹‚É‘‚«ž‚Ü‚ê‚Ü‚·B

+
+ + + + +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/read.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/read.html new file mode 100644 index 0000000..b4096de --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/read.html @@ -0,0 +1,79 @@ + + + + + + + +FatFs - f_read + + + + +
+

f_read

+

ƒtƒ@ƒCƒ‹‚©‚çƒf[ƒ^‚ð“Ç‚Ýo‚µ‚Ü‚·B

+
+FRESULT f_read (
+  FIL* FileObject,    /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘Ì */
+  void* Buffer,       /* “Ç‚Ýo‚µ‚½ƒf[ƒ^‚ðŠi”[‚·‚éƒoƒbƒtƒ@ */
+  UINT ByteToRead,    /* “Ç‚Ýo‚·ƒoƒCƒg” */
+  UINT* ByteRead      /* “Ç‚Ýo‚³‚ꂽƒoƒCƒg” */
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
Buffer
+
“Ç‚Ýo‚µ‚½ƒf[ƒ^‚ðŠi”[‚·‚éƒoƒbƒtƒ@‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
ByteToRead
+
“Ç‚Ýo‚·ƒoƒCƒg”(0`UINT‚ÌÅ‘å’l)‚ðŽw’肵‚Ü‚·B
+
ByteRead
+
ŽÀۂɓǂÝo‚³‚ꂽƒoƒCƒg”‚ðŠi”[‚·‚é•Ï”‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B–ß‚è’l‚ÍŠÖ”‚̬”Û‚É‚©‚©‚í‚炸í‚É—LŒø‚Å‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_DENIED
+
”ñ“ǂݞ‚݃‚[ƒh‚ÅŠJ‚¢‚½ƒtƒ@ƒCƒ‹‚©‚ç“ǂݞ‚à‚¤‚Æ‚µ‚½B
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_INVALID_OBJECT
+
–³Œø‚ȃtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒgB
+
+
+ + +
+

‰ðà

+

“ǂݞ‚ÝŠJŽnˆÊ’u‚ÍAŒ»Ý‚̃tƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚©‚ç‚ɂȂè‚Ü‚·Bƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚͓ǂݞ‚܂ꂽƒoƒCƒg”‚¾‚¯i‚݂܂·B“ǂݞ‚Ý’†‚Ƀtƒ@ƒCƒ‹‚ÌI’[‚É’B‚·‚邯A*ByteRead‚ÍByteToRead‚æ‚è‚ଂ³‚­‚È‚è‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

‘S‚Ä‚Ì\¬‚ÅŽg—p‰Â”\‚Å‚·B

+
+ + +
+

ŽQÆ

+

f_open, fgets, f_write, f_close, FIL

+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/readdir.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/readdir.html new file mode 100644 index 0000000..13c6b56 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/readdir.html @@ -0,0 +1,124 @@ + + + + + + + +FatFs - f_readdir + + + + +
+

f_readdir

+

ƒfƒBƒŒƒNƒgƒŠ€–Ú‚ð“Ç‚Ýo‚µ‚Ü‚·

+
+FRESULT f_readdir (
+  DIR* DirObject,    /* ƒfƒBƒŒƒNƒgƒŠEƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^ */
+  FILINFO* FileInfo  /* ƒtƒ@ƒCƒ‹î•ñ\‘¢‘̂ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
DirObject
+
ƒfƒBƒŒƒNƒgƒŠEƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
FileInfo
+
“Ç‚Ýo‚µ‚½ƒfƒBƒŒƒNƒgƒŠ€–Ú‚ðŠi”[‚·‚éƒtƒ@ƒCƒ‹î•ñ\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INVALID_OBJECT
+
–³Œø‚ȃfƒBƒŒƒNƒgƒŠEƒIƒuƒWƒFƒNƒgB
+
+
+ + +
+

‰ðà

+

ƒfƒBƒŒƒNƒgƒŠ€–Ú‚ð‡ŽŸ“Ç‚Ýo‚µ‚Ü‚·B‚±‚ÌŠÖ”‚ðŒJ‚è•Ô‚µŽÀs‚·‚邱‚Ƃɂæ‚èƒfƒBƒŒƒNƒgƒŠ‚Ì‘S‚Ằ–Ú‚ð“Ç‚Ýo‚·‚±‚Æ‚ª‚Å‚«‚Ü‚·B‘S‚Ằ–Ú‚ð“Ç‚Ýo‚µA“Ç‚Ýo‚·€–Ú‚ª‚à‚¤–³‚¢‚Æ‚«‚ÍAf_name[]ƒƒ“ƒo‚Ƀkƒ‹•¶Žš—ñ‚ª•Ô‚³‚ê‚Ü‚·Bƒ{ƒŠƒ…[ƒ€–¼‚͓ǂÝo‚·‚Æ‚«‚ÉŠü‚Ä‚ç‚êAŒ»‚ê‚邱‚Ƃ͂ ‚è‚Ü‚¹‚ñB"."A".."‚ÍA‘Š‘ÎƒpƒX‚ª—LŒø‚ȂƂ«(_FS_RPATH == 1)‚ɂ̂݌»‚ê‚Ü‚·B“¾‚ç‚ê‚éƒtƒ@ƒCƒ‹î•ñ‚ÌÚׂɂ‚¢‚Ä‚Í FILINFO\‘¢‘Ì‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢BFileInfo‚Ƀkƒ‹Eƒ|ƒCƒ“ƒ^‚ðŽw’è‚·‚邯A‚»‚̃fƒBƒŒƒNƒgƒŠ‚̃Š[ƒhEƒCƒ“ƒfƒbƒNƒX‚ðŠª‚«–ß‚µ‚Ü‚·B

+

LFN‹@”\‚ª—LŒø‚ÈŽž‚ÍAf_readdirŠÖ”‚̌ĂÑo‚µ‚Éæ—§‚Á‚ÄFILINFO\‘¢‘Ì‚Ìlfname‚Ælfsize‚ª—LŒø‚È’l‚ʼnŠú‰»‚³‚ê‚Ä‚¢‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñBlfname‚ÍLFN‚ðŠi”[‚·‚éƒoƒbƒtƒ@‚ÅAlfsize‚Í‚»‚̃oƒbƒtƒ@EƒTƒCƒY(•¶Žš”)‚Å‚·BŽŸ‚ÌðŒ‚Ɉê‚‚łàŠY“–‚·‚éꇂÍALFNŠi”[ƒoƒbƒtƒ@‚Ƀkƒ‹•¶Žš—ñ‚ª•Ô‚³‚ê‚Ü‚·B

+
    +
  • ‚»‚̃fƒBƒŒƒNƒgƒŠ€–Ú‚ÉLFN‚ª‘¶Ý‚µ‚È‚¢B
  • +
  • LFN‚Ì’·‚³‚ɑ΂µ‚ÄLFNŠi”[ƒoƒbƒtƒ@‚Ü‚½‚ÍLFN‘€ìƒoƒbƒtƒ@‚̃TƒCƒY‚ª•s\•ªB
  • +
  • LFN‚ÉOEMƒR[ƒh‚É‘¶Ý‚µ‚È‚¢•¶Žš‚ªŠÜ‚Ü‚ê‚Ä‚¢‚éB(Unicode API‚ł͂Ȃ¢‚Æ‚«)
  • +
+

‚Ü‚½Alfname‚Ƀkƒ‹Eƒ|ƒCƒ“ƒ^‚ðŽw’肵‚½ê‡‚ÍALFN‚ÉŠÖ‚µ‚ĉ½‚à•Ô‚³‚ê‚Ü‚¹‚ñBLFN‚ª‘¶Ý‚µ‚È‚¢‚Æ‚«‚ÍAf_name[]ƒƒ“ƒo‚ÌSFN‚ÉASCII‰p¬•¶Žš‚ªŠÜ‚Ü‚ê‚éꇂª‚ ‚è‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

_FS_MINIMIZE <= 1‚̂Ƃ«‚ÉŽg—p‰Â”\‚Å‚·B

+
+ + +
+

Žg—p—á

+
+FRESULT scan_files (char* path)
+{
+    FRESULT res;
+    FILINFO fno;
+    DIR dir;
+    int i;
+    char *fn;
+#if _USE_LFN
+    static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1];
+    fno.lfname = lfn;
+    fno.lfsize = sizeof(lfn);
+#endif
+
+
+    res = f_opendir(&dir, path);
+    if (res == FR_OK) {
+        i = strlen(path);
+        for (;;) {
+            res = f_readdir(&dir, &fno);
+            if (res != FR_OK || fno.fname[0] == 0) break;
+            if (fno.fname[0] == '.') continue;
+#if _USE_LFN
+            fn = *fno.lfname ? fno.lfname : fno.fname;
+#else
+            fn = fno.fname;
+#endif
+            if (fno.fattrib & AM_DIR) {
+                sprintf(&path[i], "/%s", fn);
+                res = scan_files(path);
+                if (res != FR_OK) break;
+                path[i] = 0;
+            } else {
+                printf("%s/%s\n", path, fn);
+            }
+        }
+    }
+
+    return res;
+}
+
+
+ + +
+

ŽQÆ

+

f_opendir, f_stat, FILINFO, DIR

+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/rename.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/rename.html new file mode 100644 index 0000000..4f4e796 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/rename.html @@ -0,0 +1,93 @@ + + + + + + + +FatFs - f_rename + + + + +
+

f_rename

+

ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚Ì–¼‘O‚Ì•ÏX‚Ü‚½‚͈ړ®B

+
+FRESULT f_rename (
+  const XCHAR* OldName, /* ŒÃ‚¢ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ–¼ */
+  const XCHAR* NewName  /* V‚µ‚¢ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ–¼ */
+);
+
+
+ +
+

ˆø”

+
+
OldName
+
•ÏX‘Îۂ̃IƒuƒWƒFƒNƒg(ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ)‚ւ̃pƒX–¼‚Ì“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
NewName
+
V‚µ‚¢ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚̃tƒ‹ƒpƒX–¼‚Ì“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·BŠù‚É‘¶Ý‚·‚é–¼‘O‚ÍŽg‚¦‚Ü‚¹‚ñB‚Ü‚½Aƒhƒ‰ƒCƒu”Ô†‚ÍŽw’è‚Å‚«‚¸AOldName‚ÅŽw’肳‚ꂽƒ{ƒŠƒ…[ƒ€ã‚̃IƒuƒWƒFƒNƒg‚Æ‚µ‚Ĉµ‚í‚ê‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_FILE
+
OldName‚̃IƒuƒWƒFƒNƒg‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_DENIED
+
ƒhƒ‰ƒCƒu—e—ʂ̕s‘«“™‚Ì——R‚ÅV‚µ‚¢–¼‘O‚̃IƒuƒWƒFƒNƒg‚ªì‚ê‚È‚¢B
+
FR_EXIST
+
NewName‚Æ“¯‚¶–¼‘O‚ªŠù‚É‘¶Ý‚·‚éB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘ÔB
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
˜_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNƒGƒŠƒA‚ªŠ„‚è“–‚Ä‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒ{ƒŠƒ…[ƒ€‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

ƒIƒuƒWƒFƒNƒg‚Ì–¼‘O‚ð•ÏX‚µ‚Ü‚·B‚Ü‚½A•ʂ̃fƒBƒŒƒNƒgƒŠ‚ւ̈ړ®(“¯‚¶ƒhƒ‰ƒCƒu“à‚Ì‚Ý)‚à‰Â”\‚Å‚·BŠJ‚©‚ê‚Ä‚¢‚éƒIƒuƒWƒFƒNƒg‚ɑ΂µ‚ÄŽg—p‚µ‚Ă͂Ȃè‚Ü‚¹‚ñB

+
+ + +
+

‘Ήžî•ñ

+

_FS_READONLY == 0‚ÅAŠŽ‚Â_FS_MINIMIZE == 0‚̂Ƃ«‚ÉŽg—p‰Â”\‚Å‚·B

+
+ + +
+

Žg—p—á

+
+    /* ƒtƒ@ƒCƒ‹‚Ü‚½‚̓TƒuƒfƒBƒŒƒNƒgƒŠ‚Ì–¼‘O‚ð•ÏX‚·‚é */
+    f_rename("oldname.txt", "newname.txt");
+
+    /* ƒtƒ@ƒCƒ‹‚Ü‚½‚̓TƒuƒfƒBƒŒƒNƒgƒŠ‚Ì–¼‘O‚Ì•ÏX‚ƕʂ̃fƒBƒŒƒNƒgƒŠ‚ւ̈ړ® */
+    f_rename("oldname.txt", "dir1/newname.txt");
+
+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sdir.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sdir.html new file mode 100644 index 0000000..7e8d5f7 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sdir.html @@ -0,0 +1,36 @@ + + + + + + + +FatFs - DIR + + + + +
+

DIR

+

DIR\‘¢‘Ì‚ÍAf_opendir(), f_readdir()‚̃[ƒNEƒGƒŠƒA‚Æ‚µ‚ÄŽg—p‚³‚ê‚Ü‚·BƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚©‚ç•ÏX‰Â”\‚ȃƒ“ƒo‚Í‚ ‚è‚Ü‚¹‚ñB

+
+typedef struct _DIR_ {
+    FATFS*  fs;        /* Pointer to the owner file system object */
+    WORD    id;        /* Owner file system mount ID */
+    WORD    index;     /* Current index number */
+    DWORD   sclust;    /* Table start cluster (0:Static table) */
+    DWORD   clust;     /* Current cluster */
+    DWORD   sect;      /* Current sector */
+    BYTE*   dir;       /* Pointer to the current SFN entry in the win[] */
+    BYTE*   fn;        /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */
+#if _USE_LFN
+    WCHAR*  lfn;       /* Pointer to the LFN working buffer */
+    WORD    lfn_idx;   /* Last matched LFN index (0xFFFF:No LFN) */
+#endif
+} DIR;
+
+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sfatfs.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sfatfs.html new file mode 100644 index 0000000..2789e40 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sfatfs.html @@ -0,0 +1,51 @@ + + + + + + + +FatFs - FATFS + + + + +
+

FATFS

+

FATFS\‘¢‘Ì‚ÍAŒÂX‚̘_—ƒhƒ‰ƒCƒu‚̃_ƒCƒiƒ~ƒbƒNEƒ[ƒNEƒGƒŠƒA‚ð•ÛŽ‚µAf_mount()‚ÅFatFsƒ‚ƒWƒ…[ƒ‹‚É“o˜^‚³‚ê‚Ü‚·B•W€ó‘Ԃł͎Ÿ‚̂悤‚ȃƒ“ƒo‚ɂȂÁ‚Ä‚¢‚Ü‚·BƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚©‚ç‘‚«Š·‚¦‰Â”\‚ȃƒ“ƒo‚Í‚ ‚è‚Ü‚¹‚ñB

+ +
+typedef struct _FATFS_ {
+    BYTE    fs_type;      /* FAT sub type */
+    BYTE    drive;        /* Physical drive number */
+    BYTE    csize;        /* Number of sectors per cluster */
+    BYTE    n_fats;       /* Number of FAT copies */
+    BYTE    wflag;        /* win[] dirty flag (1:must be written back) */
+    BYTE    fsi_flag;     /* fsinfo dirty flag (1:must be written back) */
+    WORD    id;           /* File system mount ID */
+    WORD    n_rootdir;    /* Number of root directory entries (0 on FAT32) */
+#if _FS_REENTRANT
+    HANDLE  h_mutex;      /* Handle to the mutex (Platform dependent) */
+#endif
+#if _MAX_SS != 512
+    WORD    s_size;       /* Sector size */
+#endif
+#if !_FS_READONLY
+    DWORD   last_clust;   /* Last allocated cluster */
+    DWORD   free_clust;   /* Number of free clusters */
+    DWORD   fsi_sector;   /* fsinfo sector */
+#endif
+    DWORD   sects_fat;    /* Sectors per fat */
+    DWORD   max_clust;    /* Maximum cluster# + 1. Number of clusters is max_clust - 2 */
+    DWORD   fatbase;      /* FAT start sector */
+    DWORD   dirbase;      /* Root directory start sector (Cluster# on FAT32) */
+    DWORD   database;     /* Data start sector */
+    DWORD   winsect;      /* Current sector appearing in the win[] */
+    BYTE    win[_MAX_SS]; /* Disk access window for Directory/FAT */
+} FATFS;
+
+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sfile.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sfile.html new file mode 100644 index 0000000..e30b910 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sfile.html @@ -0,0 +1,41 @@ + + + + + + + +FatFs - FIL + + + + +
+

FIL

+

FIL\‘¢‘Ì‚ÍAf_open()‚Å쬂³‚êA‚»‚̃tƒ@ƒCƒ‹‚Ìó‘Ô‚ð•ÛŽ‚µ‚Ü‚·BƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚©‚ç‘‚«Š·‚¦‰Â”\‚ȃƒ“ƒo‚Í‚ ‚è‚Ü‚¹‚ñB

+ +
+typedef struct _FIL_ {
+    FATFS*  fs;           /* Pointer to the owner file system object */
+    WORD    id;           /* Owner file system mount ID */
+    BYTE    flag;         /* File status flags */
+    BYTE    csect;        /* Sector address in the cluster */
+    DWORD   fptr;         /* File R/W pointer */
+    DWORD   fsize;        /* File size */
+    DWORD   org_clust;    /* File start cluster */
+    DWORD   curr_clust;   /* Current cluster */
+    DWORD   dsect;        /* Current data sector */
+#if _FS_READONLY == 0
+    DWORD   dir_sect;     /* Sector containing the directory entry */
+    BYTE*   dir_ptr;      /* Ponter to the directory entry in the window */
+#endif
+#if !_FS_TINY
+    BYTE    buf[_MAX_SS];  /* File R/W buffer */
+#endif
+} FIL;
+
+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sfileinfo.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sfileinfo.html new file mode 100644 index 0000000..dfdb704 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sfileinfo.html @@ -0,0 +1,69 @@ + + + + + + + +FatFs - FILINFO + + + + +
+

FILINFO

+

FILINFO\‘¢‘Ì‚ÍAf_stat(), f_readdir()‚ŕԂ³‚ê‚éƒtƒ@ƒCƒ‹î•ñ‚ð•ÛŽ‚µ‚Ü‚·B

+
+typedef struct _FILINFO_ {
+    DWORD fsize;     /* File size */
+    WORD fdate;      /* Last modified date */
+    WORD ftime;      /* Last modified time */
+    BYTE fattrib;    /* Attribute */
+    char fname[13];  /* Short file name (8.3 format) */
+#if _USE_LFN
+    XCHAR* lfname;   /* Pointer to the LFN buffer */
+    int lfsize;      /* Size of LFN buffer [characters] */
+#endif
+} FILINFO;
+
+
+ +

ƒƒ“ƒo

+
+
fsize
+
ƒtƒ@ƒCƒ‹‚̃oƒCƒg’PˆÊ‚̃TƒCƒY‚ªŠi”[‚³‚ê‚Ü‚·BƒfƒBƒŒƒNƒgƒŠ‚ÌꇂÍí‚É0‚Å‚·B
+
fdate
+
ƒtƒ@ƒCƒ‹‚Ì•ÏX‚³‚ꂽ“ú•tA‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚Ì쬂³‚ꂽ“ú•t‚ªŠi”[‚³‚ê‚Ü‚·B
+
+
bit15:9
+
1980”N‚ð‹N“_‚Æ‚µ‚½”N‚ª 0..127 ‚Å“ü‚è‚Ü‚·B
+
bit8:5
+
ŒŽ‚ª 1..12 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
bit4:0
+
“ú‚ª 1..31 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
+
+
ftime
+
ƒtƒ@ƒCƒ‹‚Ì•ÏX‚³‚ê‚½ŽžA‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚Ì쬂³‚ê‚½Žž‚ªŠi”[‚³‚ê‚Ü‚·B
+
+
bit15:11
+
Žž‚ª 0..23 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
bit10:5
+
•ª‚ª 0..59 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
bit4:0
+
•b/2‚ª 0..29 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
+
+
fattrib
+
‘®«ƒtƒ‰ƒO‚ªŠi”[‚³‚ê‚Ü‚·Bƒtƒ‰ƒO‚ÍAM_DIR, AM_RDO, AM_HID, AM_SYS, AM_ARC‚Ì‘g‚݇‚킹‚ƂȂè‚Ü‚·B
+
fname[]
+
8.3Œ`Ž®‚Ì–¼‘O‚ª'\0'‚ÅI‚í‚é•¶Žš—ñ‚Æ‚µ‚ÄŠi”[‚³‚ê‚Ü‚·B”ñLFN\¬‚̂Ƃ«‚ÍAí‚É‘å•¶Žš‚ŕԂ³‚ê‚Ü‚·BLFN\¬‚̂Ƃ«‚Í’Z‚¢–¼‘O‚ª•Ô‚³‚ê‚Ü‚·‚ªAASCII‰pŽš‚ª¬•¶Žš‚ɂȂéꇂª‚ ‚è‚Ü‚·B
+
lfname
+
•Ô‚³‚ê‚é’·‚¢ƒtƒ@ƒCƒ‹–¼‚ðŠi”[‚·‚éƒoƒbƒtƒ@‚ւ̃|ƒCƒ“ƒ^B‚±‚Ì\‘¢‘Ì‚ðŽg—p‚·‚é‘O‚ɃAƒvƒŠƒP[ƒVƒ‡ƒ“‚É‚æ‚艊ú‰»‚³‚ê‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB”ñLFN\¬‚̂Ƃ«‚Í‚±‚̃ƒ“ƒo‚Í‘¶Ý‚µ‚Ü‚¹‚ñB
+
lfsize
+
’·‚¢ƒtƒ@ƒCƒ‹–¼‚ðŠi”[‚·‚éƒoƒbƒtƒ@‚̃TƒCƒY(•¶Žš”)B‚±‚Ì\‘¢‘Ì‚ðŽg—p‚·‚é‘O‚ɃAƒvƒŠƒP[ƒVƒ‡ƒ“‚É‚æ‚艊ú‰»‚³‚ê‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB”ñLFN\¬‚̂Ƃ«‚Í‚±‚̃ƒ“ƒo‚Í‘¶Ý‚µ‚Ü‚¹‚ñB
+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/stat.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/stat.html new file mode 100644 index 0000000..3db289c --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/stat.html @@ -0,0 +1,80 @@ + + + + + + + +FatFs - f_stat + + + + +
+

f_stat

+
+FRESULT f_stat (
+  const char* FileName,  /* ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ–¼‚ւ̃|ƒCƒ“ƒ^ */
+  FILINFO* FileInfo      /* ƒtƒ@ƒCƒ‹î•ñ\‘¢‘̂ւ̃|ƒCƒ“ƒ^ *
+);
+
+
+ +
+

ˆø”

+
+
FileName
+
î•ñ‚𓾂éƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ–¼‚Ì'\0'‚ÅI‚í‚é•¶Žš—ñ‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
FileInfo
+
“Ç‚Ýo‚µ‚½ƒtƒ@ƒCƒ‹î•ñ‚ðŠi”[‚·‚éƒtƒ@ƒCƒ‹î•ñ\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_FILE
+
ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
˜_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNƒGƒŠƒA‚ªŠ„‚è“–‚Ä‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒ{ƒŠƒ…[ƒ€‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚ÉŠÖ‚·‚éî•ñ‚𓾂܂·B“¾‚ç‚ê‚éƒtƒ@ƒCƒ‹î•ñ‚ÌÚׂɂ‚¢‚Ä‚Í FILINFO\‘¢‘Ì‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B

+
+ + +
+

‘Ήžî•ñ

+

_FS_MINIMIZE == 0‚̂Ƃ«‚ÉŽg—p‰Â”\‚Å‚·B

+
+ + + + +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sync.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sync.html new file mode 100644 index 0000000..670ccfb --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/sync.html @@ -0,0 +1,68 @@ + + + + + + + +FatFs - f_sync + + + + +
+

f_sync

+

‘‚«ž‚Ý’†‚̃tƒ@ƒCƒ‹‚̃LƒƒƒbƒVƒ…‚³‚ꂽî•ñ‚ðƒtƒ‰ƒbƒVƒ…‚µ‚Ü‚·B

+
+FRESULT f_sync (
+  FIL* FileObject     /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
sync‚·‚éƒtƒ@ƒCƒ‹‚̃tƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_INVALID_OBJECT
+
ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ª–³ŒøB
+
+
+ + +
+

‰ðà

+

‚±‚ÌŠÖ”‚Íf_close()‚Æ“¯‚¶ˆ—‚ðŽÀs‚µ‚Ü‚·‚ªAƒtƒ@ƒCƒ‹‚͈ø‚«‘±‚«ŠJ‚©‚ꂽ‚܂܂ɂȂèA“ǂݑ‚«‚ð‘±s‚Å‚«‚Ü‚·BƒƒMƒ“ƒO‚È‚ÇA‘‚«ž‚݃‚[ƒh‚Å’·ŽžŠÔƒtƒ@ƒCƒ‹‚ªŠJ‚©‚ê‚Ä‚¢‚éƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚É‚¨‚¢‚ÄA’èŠú“I‚Ü‚½‚Í‹æØ‚è‚Ì—Ç‚¢‚Æ‚±‚ë‚Åsync‚·‚邱‚Ƃɂæ‚èA•sˆÓ‚Ì“dŒ¹’f‚⃃fƒBƒA‚ÌŽæ‚èŠO‚µ‚É‚æ‚莸‚í‚ê‚éƒf[ƒ^‚ðŬ‚É‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·BŽÀۂ̂Ƃ±‚ëAf_close‚Å‚Ísync‚µ‚½‚ ‚ƃtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ð”jŠü‚µ‚Ä‚¢‚邾‚¯‚Ȃ̂ÅAf_close’¼‘O‚Ìsync‚͈Ӗ¡‚ª‚ ‚è‚Ü‚¹‚ñB

+
+ + +
+

‘Ήžî•ñ

+

_FS_READONLY == 0‚̂Ƃ«‚ÉŽg—p‰Â”\‚Å‚·B

+
+ + +
+

ŽQÆ

+

f_close

+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/truncate.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/truncate.html new file mode 100644 index 0000000..c002609 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/truncate.html @@ -0,0 +1,71 @@ + + + + + + + +FatFs - f_truncate + + + + +
+

f_truncate

+

ƒtƒ@ƒCƒ‹’·‚ðØ‚è‹l‚߂܂·B

+
+FRESULT f_truncate (
+  FIL* FileObject     /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
Ø‚è‹l‚ß‘ÎÛƒtƒ@ƒCƒ‹‚̃tƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ւ̃|ƒCƒ“ƒ^
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_DENIED
+
ƒtƒ@ƒCƒ‹‚ª”ñ‘‚«ž‚݃‚[ƒh‚ÅŠJ‚©‚ê‚Ä‚¢‚éB
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_INVALID_OBJECT
+
–³Œø‚ȃtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒgB
+
+
+ + +
+

‰ðà

+

ƒtƒ@ƒCƒ‹‚Ì’·‚³‚ªŒ»Ý‚̃tƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚ÉØ‚è‹l‚ß‚ç‚ê‚Ü‚·Bƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚ªƒtƒ@ƒCƒ‹‚ÌI’[‚ðŽw‚µ‚Ä‚¢‚邯‚«‚ÍA‚±‚ÌŠÖ”‚͉½‚ÌŒø‰Ê‚àŽ‚¿‚Ü‚¹‚ñB

+
+ + +
+

‘Ήžî•ñ

+

_FS_READONLY == 0‚ÅAŠŽ‚Â_FS_MINIMIZE == 0‚̂Ƃ«‚ÉŽg—p‰Â”\‚Å‚·B

+
+ + +
+

ŽQÆ

+

f_open, f_lseek, FIL

+
+ + +

Return

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/unlink.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/unlink.html new file mode 100644 index 0000000..de3fb75 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/unlink.html @@ -0,0 +1,76 @@ + + + + + + + +FatFs - f_unlink + + + + +
+

f_unlink

+

ƒIƒuƒWƒFƒNƒg‚ð휂µ‚Ü‚·B

+
+FRESULT f_unlink (
+  const XCHAR* FileName  /* ƒIƒuƒWƒFƒNƒg–¼‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
FileName
+
휑Îۂ̃tƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ–¼‚Ì“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_FILE
+
ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_DENIED
+
‘ÎÛƒIƒuƒWƒFƒNƒg‚ªƒŠ[ƒhEƒIƒ“ƒŠ[‘®«AƒfƒBƒŒƒNƒgƒŠ‚Ìꇂ͋ó‚łȂ¢ê‡‚È‚ÇB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘ÔB
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
˜_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ªŠ„‚è“–‚Ä‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒ{ƒŠƒ…[ƒ€‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

ƒIƒuƒWƒFƒNƒg‚ð휂µ‚Ü‚·BŠJ‚©‚ê‚Ä‚¢‚éƒIƒuƒWƒFƒNƒg‚âƒJƒŒƒ“ƒgEƒfƒBƒŒƒNƒgƒŠ‚Í휂µ‚Ă͂Ȃè‚Ü‚¹‚ñB

+
+ +
+

‘Ήžî•ñ

+

_FS_READONLY == 0‚ÅAŠŽ‚Â_FS_MINIMIZE == 0‚̂Ƃ«‚ÉŽg—p‰Â”\‚Å‚·B

+
+ + +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/utime.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/utime.html new file mode 100644 index 0000000..05a36a6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/utime.html @@ -0,0 +1,83 @@ + + + + + + + +FatFs - f_utime + + + + +
+

f_utime

+

ƒIƒuƒWƒFƒNƒg‚̃^ƒCƒ€ƒXƒ^ƒ“ƒv‚ð•ÏX‚µ‚Ü‚·B

+
+FRESULT f_utime (
+  const XCHAR* FileName,   /* ƒIƒuƒWƒFƒNƒg–¼‚ւ̃|ƒCƒ“ƒ^ */
+  const FILINFO* TimeDate  /* Ý’è‚·‚é“ú•t */
+);
+
+
+ +
+

ˆø”

+
+
FileName
+
•ÏX‘Îۂ̃tƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚ւ̃pƒX–¼‚Ì“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ðŽw’肵‚Ü‚·B
+
TimeDate
+
Ý’è‚·‚é“ú•t‚ÆŽžŠÔ‚ðfdate‚Æftimeƒƒ“ƒo‚Éݒ肳‚ꂽFILINFO\‘¢‘̂ւ̃|ƒCƒ“ƒ^B‘¼‚̃ƒ“ƒo‚ÍDon't care‚Å‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_FILE
+
ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_NAME
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘ÔB
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
‚»‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ª—^‚¦‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒ{ƒŠƒ…[ƒ€‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

ƒIƒuƒWƒFƒNƒg‚̃^ƒCƒ€ƒXƒ^ƒ“ƒv‚ð•ÏX‚µ‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

_FS_READONLY == 0‚ÅAŠŽ‚Â_FS_MINIMIZE == 0‚̂Ƃ«‚ÉŽg—p‰Â”\‚Å‚·B

+
+ + +
+

ŽQÆ

+

f_stat, FILINFO

+
+ +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/write.html b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/write.html new file mode 100644 index 0000000..447e779 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/ja/write.html @@ -0,0 +1,79 @@ + + + + + + + +FatFs - f_write + + + + +
+

f_write

+

ƒtƒ@ƒCƒ‹‚Ƀf[ƒ^‚ð‘‚«ž‚݂܂·B

+
+FRESULT f_write (
+  FIL* FileObject,     /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg */
+  const void* Buffer,  /* ‘‚«ž‚݃f[ƒ^ */
+  UINT ByteToWrite,    /* ‘‚«ž‚ÞƒoƒCƒg” */
+  UINT* ByteWritten    /* ‘‚«ž‚܂ꂽƒoƒCƒg” */
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
Buffer
+
‘‚«ž‚Þƒf[ƒ^‚ðŠi”[‚µ‚½ƒoƒbƒtƒ@‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
ByteToWrite
+
‘‚«ž‚ÞƒoƒCƒg”(0`UINT‚ÌÅ‘å’l)‚ðŽw’肵‚Ü‚·B
+
ByteWritten
+
‘‚«ž‚܂ꂽƒoƒCƒg”‚ðŠi”[‚·‚é•Ï”‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B–ß‚è’l‚ÍŠÖ”‚̬”Û‚É‚©‚©‚í‚炸í‚É—LŒø‚Å‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_DENIED
+
”ñ‘‚«ž‚݃‚[ƒh‚ÅŠJ‚©‚ꂽƒtƒ@ƒCƒ‹‚É‘‚«ž‚à‚¤‚Æ‚µ‚½B
+
FR_DISK_ERR
+
ƒfƒBƒXƒNEƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INT_ERR
+
•s³‚ÈFAT\‘¢‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_INVALID_OBJECT
+
–³Œø‚ȃtƒ@ƒCƒ‹ƒIƒuƒWƒFƒNƒgB
+
+
+ + +
+

‰ðà

+

‘‚«ž‚ÝŠJŽnˆÊ’u‚ÍAƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚̈ʒu‚©‚ç‚ɂȂè‚Ü‚·Bƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚ÍŽÀÛ‚É‘‚«ž‚܂ꂽƒoƒCƒg”‚¾‚¯i‚݂܂·BŠÖ”‚ª³íI—¹‚µ‚½ŒãA—v‹‚µ‚½ƒoƒCƒg”‚ª‘‚«ž‚܂ꂽ‚©‚Ç‚¤‚©*ByteWritten‚ðƒ`ƒFƒbƒN‚·‚ׂ«‚Å‚·B*ByteWritten < ByteToWrite‚̂Ƃ«‚ÍAƒfƒBƒXƒNEƒtƒ‹‚ðˆÓ–¡‚µ‚Ü‚·B

+
+ + +
+

‘Ήžî•ñ

+

_FS_READONLY == 0‚̂Ƃ«‚ÉŽg—p‰Â”\‚Å‚·B

+
+ + + + +

–ß‚é

+ + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/updates.txt b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/updates.txt new file mode 100644 index 0000000..e2eda29 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/doc/updates.txt @@ -0,0 +1,89 @@ +R0.07e, Nov 3, 2009 + Separated out configuration options from ff.h to ffconf.h. + Added a configuration option, _LFN_UNICODE. + Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. + Fixed name matching error on the 13 char boundary. + Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. + +R0.07c, Jun 21, 2009 + Fixed f_unlink() may return FR_OK on error. + Fixed wrong cache control in f_lseek(). + Added relative path feature. + Added f_chdir(). + Added f_chdrive(). + Added proper case conversion to extended characters. + +R0.07a, Apr 14, 2009 + Separated out OS dependent code on re-entrant configuration. + Added multiple sector size support. + +R0.07, Apr 01, 2009 + Merged Tiny-FatFs into FatFs as a buffer configuration option. + Added long file name support. + Added multiple code page support. + Added re-entrancy for multitask operation. + Added auto cluster size selection to f_mkfs(). + Added rewind option to f_readdir(). + Changed result code of critical errors. + Renamed string functions to avoid name collision. + +R0.06, Apr 01, 2008 + Added f_forward. (Tiny-FatFs) + Added string functions: fgets, fputc, fputs and fprintf. + Improved performance of f_lseek on moving to the same or following cluster. + +R0.05a, Feb 03, 2008 + Added f_truncate. + Added f_utime. + Fixed off by one error at FAT sub-type determination. + Fixed btr in f_read can be mistruncated. + Fixed cached sector is left not flushed when create and close without write. + +R0.05, Aug 26, 2007 + Changed arguments of f_read, f_write. + Changed arguments of f_mkfs. (FatFs) + Fixed f_mkfs on FAT32 creates incorrect FSInfo. (FatFs) + Fixed f_mkdir on FAT32 creates incorrect directory. (FatFs) + +R0.04b, May 05, 2007 + Added _USE_NTFLAG option. + Added FSInfo support. + Fixed some problems corresponds to FAT32. (Tiny-FatFs) + Fixed DBCS name can result FR_INVALID_NAME. + Fixed short seek (<= csize) collapses the file object. + +R0.04a, Apr 01, 2007 + Supported multiple partitions on a plysical drive. (FatFs) + Added minimization level 3. + Added a capability of extending file size to f_lseek. + Fixed an endian sensitive code in f_mkfs. (FatFs) + Fixed a problem corresponds to FAT32 support. (Tiny-FatFs) + +R0.04, Feb 04, 2007 + Supported multiple drive system. (FatFs) + Changed some APIs for multiple drive system. + Added f_mkfs. (FatFs) + Added _USE_FAT32 option. (Tiny-FatFs) + +R0.03a, Dec 11, 2006 + Improved cluster scan algolithm to write files fast. + Fixed f_mkdir creates incorrect directory on FAT32. + +R0.03, Sep 22, 2006 + Added f_rename. + Changed option _FS_MINIMUM to _FS_MINIMIZE. + +R0.02a, Jun 10, 2006 + Added a configuration option _FS_MINIMUM. + +R0.02, Jun 01, 2006 + Added FAT12. + Removed unbuffered mode. + Fixed a problem on small (<32M) patition. + +R0.01, Apr 29, 2006 + First release + +R0.00, Feb 26, 2006 + Prototype (not released) + diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/00readme.txt b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/00readme.txt new file mode 100644 index 0000000..c46a0fa --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/00readme.txt @@ -0,0 +1,110 @@ +FatFs Module Source Files R0.07e (C)ChaN, 2009 + + +FILES + + ffconf.h Configuration file for FatFs module. + ff.h Common include file for FatFs and application module. + ff.c FatFs module. + diskio.h Common include file for FatFs and disk I/O module. + diskio.c Skeleton of low level disk I/O module. + integer.h Alternative type definitions for integer variables. + option Optional external functions. + + Low level disk I/O module is not included in this archive because the FatFs + module is only a generic file system layer and not depend on any specific + storage device. You have to provide a low level disk I/O module that written + to control your storage device. + + + +AGREEMENTS + + FatFs module is an open source software to implement FAT file system to + small embedded systems. This is a free software and is opened for education, + research and commercial developments under license policy of following trems. + + Copyright (C) 2009, ChaN, all right reserved. + + * The FatFs module is a free software and there is NO WARRANTY. + * No restriction on use. You can use, modify and redistribute it for + personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. + * Redistributions of source code must retain the above copyright notice. + + + +REVISION HISTORY + + Feb 26, 2006 R0.00 Prototype + + Apr 29, 2006 R0.01 First release. + + Jun 01, 2006 R0.02 Added FAT12. + Removed unbuffered mode. + Fixed a problem on small (<32M) patition. + + Jun 10, 2006 R0.02a Added a configuration option _FS_MINIMUM. + + Sep 22, 2006 R0.03 Added f_rename. + Changed option _FS_MINIMUM to _FS_MINIMIZE. + + Dec 11, 2006 R0.03a Improved cluster scan algolithm to write files fast. + Fixed f_mkdir creates incorrect directory on FAT32. + + Feb 04, 2007 R0.04 Supported multiple drive system. (FatFs) + Changed some APIs for multiple drive system. + Added f_mkfs. (FatFs) + Added _USE_FAT32 option. (Tiny-FatFs) + + Apr 01, 2007 R0.04a Supported multiple partitions on a plysical drive. (FatFs) + Fixed an endian sensitive code in f_mkfs. (FatFs) + Added a capability of extending the file size to f_lseek. + Added minimization level 3. + Fixed a problem that can collapse a sector when recreate an + existing file in any sub-directory at non FAT32 cfg. (Tiny-FatFs) + + May 05, 2007 R0.04b Added _USE_NTFLAG option. + Added FSInfo support. + Fixed some problems corresponds to FAT32. (Tiny-FatFs) + Fixed DBCS name can result FR_INVALID_NAME. + Fixed short seek (0 < ofs <= csize) collapses the file object. + + Aug 25, 2007 R0.05 Changed arguments of f_read, f_write. + Changed arguments of f_mkfs. (FatFs) + Fixed f_mkfs on FAT32 creates incorrect FSInfo. (FatFs) + Fixed f_mkdir on FAT32 creates incorrect directory. (FatFs) + + Feb 03, 2008 R0.05a Added f_truncate(). + Added f_utime(). + Fixed off by one error at FAT sub-type determination. + Fixed btr in f_read() can be mistruncated. + Fixed cached sector is not flushed when create and close without write. + + Apr 01, 2008 R0.06 Added f_forward(). (Tiny-FatFs) + Added string functions: fputc(), fputs(), fprintf() and fgets(). + Improved performance of f_lseek() on move to the same or following cluster. + + Apr 01, 2009, R0.07 Merged Tiny-FatFs as a buffer configuration option. + Added long file name support. + Added multiple code page support. + Added re-entrancy for multitask operation. + Added auto cluster size selection to f_mkfs(). + Added rewind option to f_readdir(). + Changed result code of critical errors. + Renamed string functions to avoid name collision. + + Apr 14, 2009, R0.07a Separated out OS dependent code on reentrant cfg. + Added multiple sector size support. + + Jun 21, 2009, R0.07c Fixed f_unlink() may return FR_OK on error. + Fixed wrong cache control in f_lseek(). + Added relative path feature. + Added f_chdir(). + Added f_chdrive(). + Added proper case conversion for extended characters. + + Nov 03,'2009 R0.07e Separated out configuration options from ff.h to ffconf.h. + Added a configuration option, _LFN_UNICODE. + Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. + Fixed name matching error on the 13 char boundary. + Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/Copy of ff.c b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/Copy of ff.c new file mode 100644 index 0000000..80efa7b --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/Copy of ff.c @@ -0,0 +1,3153 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - FAT file system module R0.07e (C)ChaN, 2009 +/-----------------------------------------------------------------------------/ +/ FatFs module is a generic FAT file system module for small embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following trems. +/ +/ Copyright (C) 2009, ChaN, all right reserved. +/ +/ * The FatFs module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/-----------------------------------------------------------------------------/ +/ Feb 26,'06 R0.00 Prototype. +/ +/ Apr 29,'06 R0.01 First stable version. +/ +/ Jun 01,'06 R0.02 Added FAT12 support. +/ Removed unbuffered mode. +/ Fixed a problem on small (<32M) patition. +/ Jun 10,'06 R0.02a Added a configuration option (_FS_MINIMUM). +/ +/ Sep 22,'06 R0.03 Added f_rename(). +/ Changed option _FS_MINIMUM to _FS_MINIMIZE. +/ Dec 11,'06 R0.03a Improved cluster scan algolithm to write files fast. +/ Fixed f_mkdir() creates incorrect directory on FAT32. +/ +/ Feb 04,'07 R0.04 Supported multiple drive system. +/ Changed some interfaces for multiple drive system. +/ Changed f_mountdrv() to f_mount(). +/ Added f_mkfs(). +/ Apr 01,'07 R0.04a Supported multiple partitions on a plysical drive. +/ Added a capability of extending file size to f_lseek(). +/ Added minimization level 3. +/ Fixed an endian sensitive code in f_mkfs(). +/ May 05,'07 R0.04b Added a configuration option _USE_NTFLAG. +/ Added FSInfo support. +/ Fixed DBCS name can result FR_INVALID_NAME. +/ Fixed short seek (<= csize) collapses the file object. +/ +/ Aug 25,'07 R0.05 Changed arguments of f_read(), f_write() and f_mkfs(). +/ Fixed f_mkfs() on FAT32 creates incorrect FSInfo. +/ Fixed f_mkdir() on FAT32 creates incorrect directory. +/ Feb 03,'08 R0.05a Added f_truncate() and f_utime(). +/ Fixed off by one error at FAT sub-type determination. +/ Fixed btr in f_read() can be mistruncated. +/ Fixed cached sector is not flushed when create and close +/ without write. +/ +/ Apr 01,'08 R0.06 Added fputc(), fputs(), fprintf() and fgets(). +/ Improved performance of f_lseek() on moving to the same +/ or following cluster. +/ +/ Apr 01,'09 R0.07 Merged Tiny-FatFs as a buffer configuration option. +/ Added long file name support. +/ Added multiple code page support. +/ Added re-entrancy for multitask operation. +/ Added auto cluster size selection to f_mkfs(). +/ Added rewind option to f_readdir(). +/ Changed result code of critical errors. +/ Renamed string functions to avoid name collision. +/ Apr 14,'09 R0.07a Separated out OS dependent code on reentrant cfg. +/ Added multiple sector size support. +/ Jun 21,'09 R0.07c Fixed f_unlink() can return FR_OK on error. +/ Fixed wrong cache control in f_lseek(). +/ Added relative path feature. +/ Added f_chdir() and f_chdrive(). +/ Added proper case conversion to extended char. +/ Nov 03,'09 R0.07e Separated out configuration options from ff.h to ffconf.h. +/ Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. +/ Fixed name matching error on the 13 char boundary. +/ Added a configuration option, _LFN_UNICODE. +/ Changed f_readdir() to return the SFN with always upper +/ case on non-LFN cfg. +/---------------------------------------------------------------------------*/ + +#include "ff.h" /* FatFs configurations and declarations */ +#include "diskio.h" /* Declarations of low level disk I/O functions */ + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if _FATFS != 0x007E +#error Wrong include file (ff.h). +#endif + +#if _FS_REENTRANT +#if _USE_LFN == 1 +#error Static LFN work area must not be used in re-entrant configuration. +#endif +#define ENTER_FF(fs) { if (!lock_fs(fs)) return FR_TIMEOUT; } +#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } + +#else +#define ENTER_FF(fs) +#define LEAVE_FF(fs, res) return res + +#endif + +#define ABORT(fs, res) { fp->flag |= FA__ERROR; LEAVE_FF(fs, res); } + +#ifndef NULL +#define NULL 0 +#endif + +/* Name status flags */ +#define NS 11 /* Offset of name status byte */ +#define NS_LOSS 0x01 /* Out of 8.3 format */ +#define NS_LFN 0x02 /* Force to create LFN entry */ +#define NS_LAST 0x04 /* Last segment */ +#define NS_BODY 0x08 /* Lower case flag (body) */ +#define NS_EXT 0x10 /* Lower case flag (ext) */ +#define NS_DOT 0x20 /* Dot entry */ + + + + +/*-------------------------------------------------------------------------- + + Private Work Area + +---------------------------------------------------------------------------*/ + +#if _DRIVES < 1 || _DRIVES > 9 +#error Number of drives must be 1-9. +#endif +static +FATFS *FatFs[_DRIVES]; /* Pointer to the file system objects (logical drives) */ + +static +WORD Fsid; /* File system mount ID */ + +#if _FS_RPATH +static +BYTE Drive; /* Current drive */ +#endif + + +#if _USE_LFN == 1 /* LFN with static LFN working buffer */ +static +WCHAR LfnBuf[_MAX_LFN + 1]; +#define NAMEBUF(sp,lp) BYTE sp[12]; WCHAR *lp = LfnBuf +#define INITBUF(dj,sp,lp) dj.fn = sp; dj.lfn = lp + +#elif _USE_LFN > 1 /* LFN with dynamic LFN working buffer */ +#define NAMEBUF(sp,lp) BYTE sp[12]; WCHAR lbuf[_MAX_LFN + 1], *lp = lbuf +#define INITBUF(dj,sp,lp) dj.fn = sp; dj.lfn = lp + +#else /* No LFN */ +#define NAMEBUF(sp,lp) BYTE sp[12] +#define INITBUF(dj,sp,lp) dj.fn = sp + +#endif + + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/* Copy memory to memory */ +static +void mem_cpy (void* dst, const void* src, int cnt) { + char *d = (char*)dst; + const char *s = (const char *)src; + while (cnt--) *d++ = *s++; +} + +/* Fill memory */ +static +void mem_set (void* dst, int val, int cnt) { + char *d = (char*)dst; + while (cnt--) *d++ = (char)val; +} + +/* Compare memory to memory */ +static +int mem_cmp (const void* dst, const void* src, int cnt) { + const char *d = (const char *)dst, *s = (const char *)src; + int r = 0; + while (cnt-- && (r = *d++ - *s++) == 0) ; + return r; +} + +/* Check if chr is contained in the string */ +static +int chk_chr (const char* str, int chr) { + while (*str && *str != chr) str++; + return *str; +} + + + +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ +#if _FS_REENTRANT + +static +BOOL lock_fs ( + FATFS *fs /* File system object */ +) +{ + return ff_req_grant(fs->sobj); +} + + +static +void unlock_fs ( + FATFS *fs, /* File system object */ + FRESULT res /* Result code to be returned */ +) +{ + if (res != FR_NOT_ENABLED && + res != FR_INVALID_DRIVE && + res != FR_INVALID_OBJECT && + res != FR_TIMEOUT) { + ff_rel_grant(fs->sobj); + } +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Change window offset */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT move_window ( + FATFS *fs, /* File system object */ + DWORD sector /* Sector number to make apperance in the fs->win[] */ +) /* Move to zero only writes back dirty window */ +{ + DWORD wsect; + + + wsect = fs->winsect; + if (wsect != sector) { /* Changed current window */ +#if !_FS_READONLY + if (fs->wflag) { /* Write back dirty window if needed */ + if (disk_write(fs->drive, fs->win, wsect, 1) != RES_OK) + return FR_DISK_ERR; + fs->wflag = 0; + if (wsect < (fs->fatbase + fs->sects_fat)) { /* In FAT area */ + BYTE nf; + for (nf = fs->n_fats; nf > 1; nf--) { /* Refrect the change to all FAT copies */ + wsect += fs->sects_fat; + disk_write(fs->drive, fs->win, wsect, 1); + } + } + } +#endif + if (sector) { + if (disk_read(fs->drive, fs->win, sector, 1) != RES_OK) + return FR_DISK_ERR; + fs->winsect = sector; + } + } + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Clean-up cached data */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT sync ( /* FR_OK: successful, FR_DISK_ERR: failed */ + FATFS *fs /* File system object */ +) +{ + FRESULT res; + + + res = move_window(fs, 0); + if (res == FR_OK) { + /* Update FSInfo sector if needed */ + if (fs->fs_type == FS_FAT32 && fs->fsi_flag) { + fs->winsect = 0; + mem_set(fs->win, 0, 512); + ST_WORD(fs->win+BS_55AA, 0xAA55); + ST_DWORD(fs->win+FSI_LeadSig, 0x41615252); + ST_DWORD(fs->win+FSI_StrucSig, 0x61417272); + ST_DWORD(fs->win+FSI_Free_Count, fs->free_clust); + ST_DWORD(fs->win+FSI_Nxt_Free, fs->last_clust); + disk_write(fs->drive, fs->win, fs->fsi_sector, 1); + fs->fsi_flag = 0; + } + /* Make sure that no pending write process in the physical drive */ + if (disk_ioctl(fs->drive, CTRL_SYNC, (void*)NULL) != RES_OK) + res = FR_DISK_ERR; + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Read value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + + +DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Interal error, Else:Cluster status */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to get the link information */ +) +{ + UINT wc, bc; + DWORD fsect; + + + if (clst < 2 || clst >= fs->max_clust) /* Range check */ + return 1; + + fsect = fs->fatbase; + switch (fs->fs_type) { + case FS_FAT12 : + bc = clst; bc += bc / 2; + if (move_window(fs, fsect + (bc / SS(fs)))) break; + wc = fs->win[bc & (SS(fs) - 1)]; bc++; + if (move_window(fs, fsect + (bc / SS(fs)))) break; + wc |= (WORD)fs->win[bc & (SS(fs) - 1)] << 8; + return (clst & 1) ? (wc >> 4) : (wc & 0xFFF); + + case FS_FAT16 : + if (move_window(fs, fsect + (clst / (SS(fs) / 2)))) break; + return LD_WORD(&fs->win[((WORD)clst * 2) & (SS(fs) - 1)]); + + case FS_FAT32 : + if (move_window(fs, fsect + (clst / (SS(fs) / 4)))) break; + return LD_DWORD(&fs->win[((WORD)clst * 4) & (SS(fs) - 1)]) & 0x0FFFFFFF; + } + + return 0xFFFFFFFF; /* An error occured at the disk I/O layer */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Change value of a FAT entry */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY + +FRESULT put_fat ( + FATFS *fs, /* File system object */ + DWORD clst, /* Cluster# to be changed in range of 2 to fs->max_clust - 1 */ + DWORD val /* New value to mark the cluster */ +) +{ + UINT bc; + BYTE *p; + DWORD fsect; + FRESULT res; + + + if (clst < 2 || clst >= fs->max_clust) { /* Range check */ + res = FR_INT_ERR; + + } else { + fsect = fs->fatbase; + switch (fs->fs_type) { + case FS_FAT12 : + bc = clst; bc += bc / 2; + res = move_window(fs, fsect + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc & (SS(fs) - 1)]; + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; + bc++; + fs->wflag = 1; + res = move_window(fs, fsect + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc & (SS(fs) - 1)]; + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); + break; + + case FS_FAT16 : + res = move_window(fs, fsect + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + ST_WORD(&fs->win[((WORD)clst * 2) & (SS(fs) - 1)], (WORD)val); + break; + + case FS_FAT32 : + res = move_window(fs, fsect + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + ST_DWORD(&fs->win[((WORD)clst * 4) & (SS(fs) - 1)], val); + break; + + default : + res = FR_INT_ERR; + } + fs->wflag = 1; + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT remove_chain ( + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to remove a chain from */ +) +{ + FRESULT res; + DWORD nxt; + + + if (clst < 2 || clst >= fs->max_clust) { /* Check the range of cluster# */ + res = FR_INT_ERR; + + } else { + res = FR_OK; + while (clst < fs->max_clust) { /* Not a last link? */ + nxt = get_fat(fs, clst); /* Get cluster status */ + if (nxt == 0) break; /* Empty cluster? */ + if (nxt == 1) { res = FR_INT_ERR; break; } /* Internal error? */ + if (nxt == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } /* Disk error? */ + res = put_fat(fs, clst, 0); /* Mark the cluster "empty" */ + if (res != FR_OK) break; + if (fs->free_clust != 0xFFFFFFFF) { /* Update FSInfo */ + fs->free_clust++; + fs->fsi_flag = 1; + } + clst = nxt; /* Next cluster */ + } + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Stretch or Create a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to stretch. 0 means create a new chain. */ +) +{ + DWORD cs, ncl, scl, mcl; + + + mcl = fs->max_clust; + if (clst == 0) { /* Create new chain */ + scl = fs->last_clust; /* Get suggested start point */ + if (scl == 0 || scl >= mcl) scl = 1; + } + else { /* Stretch existing chain */ + cs = get_fat(fs, clst); /* Check the cluster status */ + if (cs < 2) return 1; /* It is an invalid cluster */ + if (cs < mcl) return cs; /* It is already followed by next cluster */ + scl = clst; + } + + ncl = scl; /* Start cluster */ + for (;;) { + ncl++; /* Next cluster */ + if (ncl >= mcl) { /* Wrap around */ + ncl = 2; + if (ncl > scl) return 0; /* No free custer */ + } + cs = get_fat(fs, ncl); /* Get the cluster status */ + if (cs == 0) break; /* Found a free cluster */ + if (cs == 0xFFFFFFFF || cs == 1)/* An error occured */ + return cs; + if (ncl == scl) return 0; /* No free custer */ + } + + if (put_fat(fs, ncl, 0x0FFFFFFF)) /* Mark the new cluster "in use" */ + return 0xFFFFFFFF; + if (clst != 0) { /* Link it to the previous one if needed */ + if (put_fat(fs, clst, ncl)) + return 0xFFFFFFFF; + } + + fs->last_clust = ncl; /* Update FSINFO */ + if (fs->free_clust != 0xFFFFFFFF) { + fs->free_clust--; + fs->fsi_flag = 1; + } + + return ncl; /* Return new cluster number */ +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Get sector# from cluster# */ +/*-----------------------------------------------------------------------*/ + + +DWORD clust2sect ( /* !=0: Sector number, 0: Failed - invalid cluster# */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; + if (clst >= (fs->max_clust - 2)) return 0; /* Invalid cluster# */ + return clst * fs->csize + fs->database; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Seek directory index */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_seek ( + DIR *dj, /* Pointer to directory object */ + WORD idx /* Directory index number */ +) +{ + DWORD clst; + WORD ic; + + + dj->index = idx; + clst = dj->sclust; + if (clst == 1 || clst >= dj->fs->max_clust) /* Check start cluster range */ + return FR_INT_ERR; + if (!clst && dj->fs->fs_type == FS_FAT32) /* Replace cluster# 0 with root cluster# if in FAT32 */ + clst = dj->fs->dirbase; + + if (clst == 0) { /* Static table */ + dj->clust = clst; + if (idx >= dj->fs->n_rootdir) /* Index is out of range */ + return FR_INT_ERR; + dj->sect = dj->fs->dirbase + idx / (SS(dj->fs) / 32); /* Sector# */ + } + else { /* Dynamic table */ + ic = SS(dj->fs) / 32 * dj->fs->csize; /* Entries per cluster */ + while (idx >= ic) { /* Follow cluster chain */ + clst = get_fat(dj->fs, clst); /* Get next cluster */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst < 2 || clst >= dj->fs->max_clust) /* Reached to end of table or int error */ + return FR_INT_ERR; + idx -= ic; + } + dj->clust = clst; + dj->sect = clust2sect(dj->fs, clst) + idx / (SS(dj->fs) / 32); /* Sector# */ + } + + dj->dir = dj->fs->win + (idx % (SS(dj->fs) / 32)) * 32; /* Ptr to the entry in the sector */ + + return FR_OK; /* Seek succeeded */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Move directory index next */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:EOT and could not streach */ + DIR *dj, /* Pointer to directory object */ + BOOL streach /* FALSE: Do not streach table, TRUE: Streach table if needed */ +) +{ + DWORD clst; + WORD i; + + + i = dj->index + 1; + if (!i || !dj->sect) /* Report EOT when index has reached 65535 */ + return FR_NO_FILE; + + if (!(i % (SS(dj->fs) / 32))) { /* Sector changed? */ + dj->sect++; /* Next sector */ + + if (dj->clust == 0) { /* Static table */ + if (i >= dj->fs->n_rootdir) /* Report EOT when end of table */ + return FR_NO_FILE; + } + else { /* Dynamic table */ + if (((i / (SS(dj->fs) / 32)) & (dj->fs->csize - 1)) == 0) { /* Cluster changed? */ + clst = get_fat(dj->fs, dj->clust); /* Get next cluster */ + if (clst <= 1) return FR_INT_ERR; + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; + if (clst >= dj->fs->max_clust) { /* When it reached end of dynamic table */ +#if !_FS_READONLY + BYTE c; + if (!streach) return FR_NO_FILE; /* When do not streach, report EOT */ + clst = create_chain(dj->fs, dj->clust); /* Streach cluster chain */ + if (clst == 0) return FR_DENIED; /* No free cluster */ + if (clst == 1) return FR_INT_ERR; + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; + /* Clean-up streached table */ + if (move_window(dj->fs, 0)) return FR_DISK_ERR; /* Flush active window */ + mem_set(dj->fs->win, 0, SS(dj->fs)); /* Clear window buffer */ + dj->fs->winsect = clust2sect(dj->fs, clst); /* Cluster start sector */ + for (c = 0; c < dj->fs->csize; c++) { /* Fill the new cluster with 0 */ + dj->fs->wflag = 1; + if (move_window(dj->fs, 0)) return FR_DISK_ERR; + dj->fs->winsect++; + } + dj->fs->winsect -= c; /* Rewind window address */ +#else + return FR_NO_FILE; /* Report EOT */ +#endif + } + dj->clust = clst; /* Initialize data for new cluster */ + dj->sect = clust2sect(dj->fs, clst); + } + } + } + + dj->index = i; + dj->dir = dj->fs->win + (i % (SS(dj->fs) / 32)) * 32; + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* LFN handling - Test/Pick/Fit an LFN segment from/to directory entry */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static +const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* Offset of LFN chars in the directory entry */ + + +static +BOOL cmp_lfn ( /* TRUE:Matched, FALSE:Not matched */ + WCHAR *lfnbuf, /* Pointer to the LFN to be compared */ + BYTE *dir /* Pointer to the directory entry containing a part of LFN */ +) +{ + int i, s; + WCHAR wc, uc; + + + i = ((dir[LDIR_Ord] & 0xBF) - 1) * 13; /* Get offset in the LFN buffer */ + s = 0; wc = 1; + do { + uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ + if (wc) { /* Last char has not been processed */ + wc = ff_wtoupper(uc); /* Convert it to upper case */ + if (i >= _MAX_LFN || wc != ff_wtoupper(lfnbuf[i++])) /* Compare it */ + return FALSE; /* Not matched */ + } else { + if (uc != 0xFFFF) return FALSE; /* Check filler */ + } + } while (++s < 13); /* Repeat until all chars in the entry are checked */ + + if ((dir[LDIR_Ord] & 0x40) && wc && lfnbuf[i]) /* Last segment matched but different length */ + return FALSE; + + return TRUE; /* The part of LFN matched */ +} + + + +static +BOOL pick_lfn ( /* TRUE:Succeeded, FALSE:Buffer overflow */ + WCHAR *lfnbuf, /* Pointer to the Unicode-LFN buffer */ + BYTE *dir /* Pointer to the directory entry */ +) +{ + int i, s; + WCHAR wc, uc; + + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + s = 0; wc = 1; + do { + uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ + if (wc) { /* Last char has not been processed */ + if (i >= _MAX_LFN) return FALSE; /* Buffer overflow? */ + lfnbuf[i++] = wc = uc; /* Store it */ + } else { + if (uc != 0xFFFF) return FALSE; /* Check filler */ + } + } while (++s < 13); /* Read all character in the entry */ + + if (dir[LDIR_Ord] & 0x40) { /* Put terminator if it is the last LFN part */ + if (i >= _MAX_LFN) return FALSE; /* Buffer overflow? */ + lfnbuf[i] = 0; + } + + return TRUE; +} + + +#if !_FS_READONLY +static +void fit_lfn ( + const WCHAR *lfnbuf, /* Pointer to the LFN buffer */ + BYTE *dir, /* Pointer to the directory entry */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* SFN sum */ +) +{ + int i, s; + WCHAR wc; + + + dir[LDIR_Chksum] = sum; /* Set check sum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + ST_WORD(dir+LDIR_FstClusLO, 0); + + i = (ord - 1) * 13; /* Get offset in the LFN buffer */ + s = wc = 0; + do { + if (wc != 0xFFFF) wc = lfnbuf[i++]; /* Get an effective char */ + ST_WORD(dir+LfnOfs[s], wc); /* Put it */ + if (!wc) wc = 0xFFFF; /* Padding chars following last char */ + } while (++s < 13); + if (wc == 0xFFFF || !lfnbuf[i]) ord |= 0x40; /* Bottom LFN part is the start of LFN sequence */ + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + +#endif +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Create numbered name */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +void gen_numname ( + BYTE *dst, /* Pointer to genartated SFN */ + const BYTE *src, /* Pointer to source SFN to be modified */ + const WCHAR *lfn, /* Pointer to LFN */ + WORD num /* Sequense number */ +) +{ + char ns[8]; + int i, j; + + + mem_cpy(dst, src, 11); + + if (num > 5) { /* On many collisions, generate a hash number instead of sequencial number */ + do num = (num >> 1) + (num << 15) + (WORD)*lfn++; while (*lfn); + } + + /* itoa */ + i = 7; + do { + ns[i--] = (num % 10) + '0'; + num /= 10; + } while (num); + ns[i] = '~'; + + /* Append the number */ + for (j = 0; j < i && dst[j] != ' '; j++) { + if (IsDBCS1(dst[j])) { + if (j == i - 1) break; + j++; + } + } + do { + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Calculate sum of an SFN */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static +BYTE sum_sfn ( + const BYTE *dir /* Ptr to directory entry */ +) +{ + BYTE sum = 0; + int n = 11; + + do sum = (sum >> 1) + (sum << 7) + *dir++; while (--n); + return sum; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_find ( + DIR *dj /* Pointer to the directory object linked to the file name */ +) +{ + FRESULT res; + BYTE c, *dir; +#if _USE_LFN + BYTE a, ord, sum; +#endif + + res = dir_seek(dj, 0); /* Rewind directory object */ + if (res != FR_OK) return res; + +#if _USE_LFN + ord = sum = 0xFF; +#endif + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if _USE_LFN /* LFN configuration */ + a = dir[DIR_Attr] & AM_MASK; + if (c == 0xE5 || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (dj->lfn) { + if (c & 0x40) { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= 0xBF; ord = c; /* LFN start order */ + dj->lfn_idx = dj->index; + } + /* Check validity of the LFN entry and compare it with given name */ + ord = (c == ord && sum == dir[LDIR_Chksum] && cmp_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF; + } + } else { /* An SFN entry is found */ + if (!ord && sum == sum_sfn(dir)) break; /* LFN matched? */ + ord = 0xFF; dj->lfn_idx = 0xFFFF; /* Reset LFN sequence */ + if (!(dj->fn[NS] & NS_LOSS) && !mem_cmp(dir, dj->fn, 11)) break; /* SFN matched? */ + } + } +#else /* Non LFN configuration */ + if (!(dir[DIR_Attr] & AM_VOL) && !mem_cmp(dir, dj->fn, 11)) /* Is it a valid entry? */ + break; +#endif + res = dir_next(dj, FALSE); /* Next entry */ + } while (res == FR_OK); + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 +static +FRESULT dir_read ( + DIR *dj /* Pointer to the directory object that pointing the entry to be read */ +) +{ + FRESULT res; + BYTE c, *dir; +#if _USE_LFN + BYTE a, ord = 0xFF, sum = 0xFF; +#endif + + res = FR_NO_FILE; + while (dj->sect) { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if _USE_LFN /* LFN configuration */ + a = dir[DIR_Attr] & AM_MASK; + if (c == 0xE5 || (!_FS_RPATH && c == '.') || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (c & 0x40) { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= 0xBF; ord = c; + dj->lfn_idx = dj->index; + } + /* Check LFN validity and capture it */ + ord = (c == ord && sum == dir[LDIR_Chksum] && pick_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF; + } else { /* An SFN entry is found */ + if (ord || sum != sum_sfn(dir)) /* Is there a valid LFN? */ + dj->lfn_idx = 0xFFFF; /* It has no LFN. */ + break; + } + } +#else /* Non LFN configuration */ + if (c != 0xE5 && (_FS_RPATH || c != '.') && !(dir[DIR_Attr] & AM_VOL)) /* Is it a valid entry? */ + break; +#endif + res = dir_next(dj, FALSE); /* Next entry */ + if (res != FR_OK) break; + } + + if (res != FR_OK) dj->sect = 0; + + return res; +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Register an object to the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many SFN collision, FR_DISK_ERR:Disk error */ + DIR *dj /* Target directory with object name to be created */ +) +{ + FRESULT res; + BYTE c, *dir; +#if _USE_LFN /* LFN configuration */ + WORD n, ne, is; + BYTE sn[12], *fn, sum; + WCHAR *lfn; + + + fn = dj->fn; lfn = dj->lfn; + mem_cpy(sn, fn, 12); + + if (_FS_RPATH && (sn[NS] & NS_DOT)) return FR_INVALID_NAME; /* Cannot create dot entry */ + + if (sn[NS] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ + fn[NS] = 0; dj->lfn = NULL; /* Find only SFN */ + for (n = 1; n < 100; n++) { + gen_numname(fn, sn, lfn, n); /* Generate a numbered name */ + res = dir_find(dj); /* Check if the name collides with existing SFN */ + if (res != FR_OK) break; + } + if (n == 100) return FR_DENIED; /* Abort if too many collisions */ + if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ + fn[NS] = sn[NS]; dj->lfn = lfn; + } + + if (sn[NS] & NS_LFN) { /* When LFN is to be created, reserve reserve an SFN + LFN entries. */ + for (ne = 0; lfn[ne]; ne++) ; + ne = (ne + 25) / 13; + } else { /* Otherwise reserve only an SFN entry. */ + ne = 1; + } + + /* Reserve contiguous entries */ + res = dir_seek(dj, 0); + if (res != FR_OK) return res; + n = is = 0; + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + c = *dj->dir; /* Check the entry status */ + if (c == 0xE5 || c == 0) { /* Is it a blank entry? */ + if (n == 0) is = dj->index; /* First index of the contigulus entry */ + if (++n == ne) break; /* A contiguous entry that requiered count is found */ + } else { + n = 0; /* Not a blank entry. Restart to search */ + } + res = dir_next(dj, TRUE); /* Next entry with table streach */ + } while (res == FR_OK); + + if (res == FR_OK && ne > 1) { /* Initialize LFN entry if needed */ + res = dir_seek(dj, is); + if (res == FR_OK) { + sum = sum_sfn(dj->fn); /* Sum of the SFN tied to the LFN */ + ne--; + do { /* Store LFN entries in bottom first */ + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + fit_lfn(dj->lfn, dj->dir, (BYTE)ne, sum); + dj->fs->wflag = 1; + res = dir_next(dj, FALSE); /* Next entry */ + } while (res == FR_OK && --ne); + } + } + +#else /* Non LFN configuration */ + res = dir_seek(dj, 0); + if (res == FR_OK) { + do { /* Find a blank entry for the SFN */ + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + c = *dj->dir; + if (c == 0xE5 || c == 0) break; /* Is it a blank entry? */ + res = dir_next(dj, TRUE); /* Next entry with table streach */ + } while (res == FR_OK); + } +#endif + + if (res == FR_OK) { /* Initialize the SFN entry */ + res = move_window(dj->fs, dj->sect); + if (res == FR_OK) { + dir = dj->dir; + mem_set(dir, 0, 32); /* Clean the entry */ + mem_cpy(dir, dj->fn, 11); /* Put SFN */ + dir[DIR_NTres] = *(dj->fn+NS) & (NS_BODY | NS_EXT); /* Put NT flag */ + dj->fs->wflag = 1; + } + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Remove an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY && !_FS_MINIMIZE +static +FRESULT dir_remove ( /* FR_OK: Successful, FR_DISK_ERR: A disk error */ + DIR *dj /* Directory object pointing the entry to be removed */ +) +{ + FRESULT res; +#if _USE_LFN /* LFN configuration */ + WORD i; + + i = dj->index; /* SFN index */ + res = dir_seek(dj, (WORD)((dj->lfn_idx == 0xFFFF) ? i : dj->lfn_idx)); /* Goto the SFN or top of the LFN entries */ + if (res == FR_OK) { + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + *dj->dir = 0xE5; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + if (dj->index >= i) break; /* When reached SFN, all entries of the object has been deleted. */ + res = dir_next(dj, FALSE); /* Next entry */ + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR; + } + +#else /* Non LFN configuration */ + res = dir_seek(dj, dj->index); + if (res == FR_OK) { + res = move_window(dj->fs, dj->sect); + if (res == FR_OK) { + *dj->dir = 0xE5; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + } + } +#endif + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Pick a segment and create the object name in directory form */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT create_name ( + DIR *dj, /* Pointer to the directory object */ + const XCHAR **path /* Pointer to pointer to the segment in the path string */ +) +{ +#ifdef _EXCVT + static const BYTE cvt[] = _EXCVT; +#endif + +#if _USE_LFN /* LFN configuration */ + BYTE b, cf; + WCHAR w, *lfn; + int i, ni, si, di; + const XCHAR *p; + + /* Create LFN in Unicode */ + si = di = 0; + p = *path; + lfn = dj->lfn; + for (;;) { + w = p[si++]; /* Get a character */ + if (w < ' ' || w == '/' || w == '\\') break; /* Break on end of segment */ + if (di >= _MAX_LFN) /* Reject too long name */ + return FR_INVALID_NAME; +#if !_LFN_UNICODE + w &= 0xFF; + if (IsDBCS1(w)) { /* If it is a DBC 1st byte */ + b = p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(b)) /* Reject invalid code for DBC */ + return FR_INVALID_NAME; + w = (w << 8) + b; + } + w = ff_convert(w, 1); /* Convert OEM to Unicode */ + if (!w) return FR_INVALID_NAME; /* Reject invalid code */ +#endif + if (w < 0x80 && chk_chr("\"*:<>\?|\x7F", w)) /* Reject illegal chars for LFN */ + return FR_INVALID_NAME; + lfn[di++] = w; /* Store the Unicode char */ + } + *path = &p[si]; /* Rerurn pointer to the next segment */ + cf = (w < ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ +#if _FS_RPATH + if ((di == 1 && lfn[di - 1] == '.') || /* Is this a dot entry? */ + (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { + lfn[di] = 0; + for (i = 0; i < 11; i++) + dj->fn[i] = (i < di) ? '.' : ' '; + dj->fn[i] = cf | NS_DOT; /* This is a dot entry */ + return FR_OK; + } +#endif + while (di) { /* Strip trailing spaces and dots */ + w = lfn[di - 1]; + if (w != ' ' && w != '.') break; + di--; + } + if (!di) return FR_INVALID_NAME; /* Reject null string */ + + lfn[di] = 0; /* LFN is created */ + + /* Create SFN in directory form */ + mem_set(dj->fn, ' ', 11); + for (si = 0; lfn[si] == ' ' || lfn[si] == '.'; si++) ; /* Strip leading spaces and dots */ + if (si) cf |= NS_LOSS | NS_LFN; + while (di && lfn[di - 1] != '.') di--; /* Find extension (di<=si: no extension) */ + + b = i = 0; ni = 8; + for (;;) { + w = lfn[si++]; /* Get an LFN char */ + if (!w) break; /* Break on enf of the LFN */ + if (w == ' ' || (w == '.' && si != di)) { /* Remove spaces and dots */ + cf |= NS_LOSS | NS_LFN; continue; + } + + if (i >= ni || si == di) { /* Extension or end of SFN */ + if (ni == 11) { /* Long extension */ + cf |= NS_LOSS | NS_LFN; break; + } + if (si != di) cf |= NS_LOSS | NS_LFN; /* Out of 8.3 format */ + if (si > di) break; /* No extension */ + si = di; i = 8; ni = 11; /* Enter extension section */ + b <<= 2; continue; + } + + if (w >= 0x80) { /* Non ASCII char */ +#ifdef _EXCVT + w = ff_convert(w, 0); /* Unicode -> OEM code */ + if (w) w = cvt[w - 0x80]; /* Convert extended char to upper (SBCS) */ +#else + w = ff_convert(ff_wtoupper(w), 0); /* Upper converted Unicode -> OEM code */ +#endif + cf |= NS_LFN; /* Force create LFN entry */ + } + + if (_DF1S && w >= 0x100) { /* Double byte char */ + if (i >= ni - 1) { + cf |= NS_LOSS | NS_LFN; i = ni; continue; + } + dj->fn[i++] = (BYTE)(w >> 8); + } else { /* Single byte char */ + if (!w || chk_chr("+,;[=]", w)) { /* Replace illegal chars for SFN */ + w = '_'; cf |= NS_LOSS | NS_LFN; /* Lossy conversion */ + } else { + if (IsUpper(w)) { /* ASCII large capital */ + b |= 2; + } else { + if (IsLower(w)) { /* ASCII small capital */ + b |= 1; w -= 0x20; + } + } + } + } + dj->fn[i++] = (BYTE)w; + } + + if (dj->fn[0] == 0xE5) dj->fn[0] = 0x05; /* If the first char collides with deleted mark, replace it with 0x05 */ + + if (ni == 8) b <<= 2; + if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) /* Create LFN entry when there are composite capitals */ + cf |= NS_LFN; + if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended char, NT flags are created */ + if ((b & 0x03) == 0x01) cf |= NS_EXT; /* NT flag (Extension has only small capital) */ + if ((b & 0x0C) == 0x04) cf |= NS_BODY; /* NT flag (Filename has only small capital) */ + } + + dj->fn[NS] = cf; /* SFN is created */ + + return FR_OK; + + +#else /* Non-LFN configuration */ + BYTE b, c, d, *sfn; + int ni, si, i; + const char *p; + + /* Create file name in directory form */ + sfn = dj->fn; + mem_set(sfn, ' ', 11); + si = i = b = 0; ni = 8; + p = *path; +#if _FS_RPATH + if (p[si] == '.') { /* Is this a dot entry? */ + for (;;) { + c = p[si++]; + if (c != '.' || si >= 3) break; + sfn[i++] = c; + } + if (c != '/' && c != '\\' && c > ' ') return FR_INVALID_NAME; + *path = &p[si]; /* Rerurn pointer to the next segment */ + sfn[NS] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT; /* Set last segment flag if end of path */ + return FR_OK; + } +#endif + for (;;) { + c = p[si++]; + if (c <= ' ' || c == '/' || c == '\\') break; /* Break on end of segment */ + if (c == '.' || i >= ni) { + if (ni != 8 || c != '.') return FR_INVALID_NAME; + i = 8; ni = 11; + b <<= 2; continue; + } + if (c >= 0x80) { /* Extended char */ +#ifdef _EXCVT + c = cvt[c - 0x80]; /* Convert extend char (SBCS) */ +#else + b |= 3; /* Eliminate NT flag if ext char is exist */ +#if !_DF1S /* ASCII only cfg */ + return FR_INVALID_NAME; +#endif +#endif + } + if (IsDBCS1(c)) { /* DBC 1st byte? */ + d = p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(d) || i >= ni - 1) /* Reject invalid DBC */ + return FR_INVALID_NAME; + sfn[i++] = c; + sfn[i++] = d; + } else { /* Single byte code */ + if (chk_chr(" \"*+,[=]|\x7F", c)) /* Reject illegal chrs for SFN */ + return FR_INVALID_NAME; + if (IsUpper(c)) { /* ASCII large capital? */ + b |= 2; + } else { + if (IsLower(c)) { /* ASCII small capital? */ + b |= 1; c -= 0x20; + } + } + sfn[i++] = c; + } + } + *path = &p[si]; /* Rerurn pointer to the next segment */ + c = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ + + if (!i) return FR_INVALID_NAME; /* Reject null string */ + if (sfn[0] == 0xE5) sfn[0] = 0x05; /* When first char collides with 0xE5, replace it with 0x05 */ + + if (ni == 8) b <<= 2; + if ((b & 0x03) == 0x01) c |= NS_EXT; /* NT flag (Extension has only small capital) */ + if ((b & 0x0C) == 0x04) c |= NS_BODY; /* NT flag (Filename has only small capital) */ + + sfn[NS] = c; /* Store NT flag, File name is created */ + + return FR_OK; +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get file information from directory entry */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 +static +void get_fileinfo ( /* No return code */ + DIR *dj, /* Pointer to the directory object */ + FILINFO *fno /* Pointer to the file information to be filled */ +) +{ + int i; + BYTE c, nt, *dir; + char *p; + + + p = fno->fname; + if (dj->sect) { + dir = dj->dir; + nt = dir[DIR_NTres]; /* NT flag */ + for (i = 0; i < 8; i++) { /* Copy name body */ + c = dir[i]; + if (c == ' ') break; + if (c == 0x05) c = 0xE5; + if (_USE_LFN && (nt & NS_BODY) && IsUpper(c)) c += 0x20; + *p++ = c; + } + if (dir[8] != ' ') { /* Copy name extension */ + *p++ = '.'; + for (i = 8; i < 11; i++) { + c = dir[i]; + if (c == ' ') break; + if (_USE_LFN && (nt & NS_EXT) && IsUpper(c)) c += 0x20; + *p++ = c; + } + } + fno->fattrib = dir[DIR_Attr]; /* Attribute */ + fno->fsize = LD_DWORD(dir+DIR_FileSize); /* Size */ + fno->fdate = LD_WORD(dir+DIR_WrtDate); /* Date */ + fno->ftime = LD_WORD(dir+DIR_WrtTime); /* Time */ + } + *p = 0; + +#if _USE_LFN + if (fno->lfname) { + XCHAR *tp = fno->lfname; + WCHAR w, *lfn; + + i = 0; + if (dj->sect && dj->lfn_idx != 0xFFFF) {/* Get LFN if available */ + lfn = dj->lfn; + while ((w = *lfn++) != 0) { /* Get an LFN char */ +#if !_LFN_UNICODE + w = ff_convert(w, 0); /* Unicode -> OEM conversion */ + if (!w) { i = 0; break; } /* Could not convert, no LFN */ + if (_DF1S && w >= 0x100) /* Put 1st byte if it is a DBC */ + tp[i++] = (XCHAR)(w >> 8); +#endif + if (i >= fno->lfsize - 1) { i = 0; break; } /* Buffer overrun, no LFN */ + tp[i++] = (XCHAR)w; + } + } + tp[i] = 0; /* Terminator */ + } +#endif +} +#endif /* _FS_MINIMIZE <= 1 */ + + + + +/*-----------------------------------------------------------------------*/ +/* Follow a file path */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ + DIR *dj, /* Directory object to return last directory and found object */ + const XCHAR *path /* Full-path string to find a file or directory */ +) +{ + FRESULT res; + BYTE *dir, last; + + + while (!_USE_LFN && *path == ' ') path++; /* Skip leading spaces */ +#if _FS_RPATH + if (*path == '/' || *path == '\\') { /* There is a heading separator */ + path++; dj->sclust = 0; /* Strip it and start from the root dir */ + } else { /* No heading saparator */ + dj->sclust = dj->fs->cdir; /* Start from the current dir */ + } +#else + if (*path == '/' || *path == '\\') /* Strip heading separator if exist */ + path++; + dj->sclust = 0; /* Start from the root dir */ +#endif + + if ((UINT)*path < ' ') { /* Null path means the start directory itself */ + res = dir_seek(dj, 0); + dj->dir = NULL; + + } else { /* Follow path */ + for (;;) { + res = create_name(dj, &path); /* Get a segment */ + if (res != FR_OK) break; + res = dir_find(dj); /* Find it */ + last = *(dj->fn+NS) & NS_LAST; + if (res != FR_OK) { /* Could not find the object */ + if (res == FR_NO_FILE && !last) + res = FR_NO_PATH; + break; + } + if (last) break; /* Last segment match. Function completed. */ + dir = dj->dir; /* There is next segment. Follow the sub directory */ + if (!(dir[DIR_Attr] & AM_DIR)) { /* Cannot follow because it is a file */ + res = FR_NO_PATH; break; + } + dj->sclust = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + } + } + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load boot record and check if it is an FAT boot record */ +/*-----------------------------------------------------------------------*/ + +static +BYTE check_fs ( /* 0:The FAT boot record, 1:Valid boot record but not an FAT, 2:Not a boot record, 3:Error */ + FATFS *fs, /* File system object */ + DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */ +) +{ + if (disk_read(fs->drive, fs->win, sect, 1) != RES_OK) /* Load boot record */ + return 3; + if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55) /* Check record signature (always placed at offset 510 even if the sector size is >512) */ + return 2; + + if ((LD_DWORD(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146) /* Check "FAT" string */ + return 0; + if ((LD_DWORD(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146) + return 0; + + return 1; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Make sure that the file system is valid */ +/*-----------------------------------------------------------------------*/ + + +FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occured */ + const XCHAR **path, /* Pointer to pointer to the path name (drive number) */ + FATFS **rfs, /* Pointer to pointer to the found file system object */ + BYTE chk_wp /* !=0: Check media write protection for write access */ +) +{ + BYTE fmt, *tbl; + UINT vol; + DSTATUS stat; + DWORD bsect, fsize, tsect, mclst; + const XCHAR *p = *path; + FATFS *fs; + + /* Get logical drive number from the path name */ + vol = p[0] - '0'; /* Is there a drive number? */ + if (vol <= 9 && p[1] == ':') { /* Found a drive number, get and strip it */ + p += 2; *path = p; /* Return pointer to the path name */ + } else { /* No drive number is given */ +#if _FS_RPATH + vol = Drive; /* Use current drive */ +#else + vol = 0; /* Use drive 0 */ +#endif + } + + /* Check if the logical drive is valid or not */ + if (vol >= _DRIVES) /* Is the drive number valid? */ + return FR_INVALID_DRIVE; + *rfs = fs = FatFs[vol]; /* Returen pointer to the corresponding file system object */ + if (!fs) return FR_NOT_ENABLED; /* Is the file system object available? */ + + ENTER_FF(fs); /* Lock file system */ + + if (fs->fs_type) { /* If the logical drive has been mounted */ + stat = disk_status(fs->drive); + if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized (has not been changed), */ +#if !_FS_READONLY + if (chk_wp && (stat & STA_PROTECT)) /* Check write protection if needed */ + return FR_WRITE_PROTECTED; +#endif + return FR_OK; /* The file system object is valid */ + } + } + + /* The logical drive must be mounted. Following code attempts to mount the volume */ + + fs->fs_type = 0; /* Clear the file system object */ + fs->drive = (BYTE)LD2PD(vol); /* Bind the logical drive and a physical drive */ + stat = disk_initialize(fs->drive); /* Initialize low level disk I/O layer */ + if (stat & STA_NOINIT) /* Check if the drive is ready */ + return FR_NOT_READY; +#if _MAX_SS != 512 /* Get disk sector size if needed */ + if (disk_ioctl(fs->drive, GET_SECTOR_SIZE, &SS(fs)) != RES_OK || SS(fs) > _MAX_SS) + return FR_NO_FILESYSTEM; +#endif +#if !_FS_READONLY + if (chk_wp && (stat & STA_PROTECT)) /* Check disk write protection if needed */ + return FR_WRITE_PROTECTED; +#endif + /* Search FAT partition on the drive */ + fmt = check_fs(fs, bsect = 0); /* Check sector 0 as an SFD format */ + if (fmt == 1) { /* Not an FAT boot record, it may be patitioned */ + /* Check a partition listed in top of the partition table */ + tbl = &fs->win[MBR_Table + LD2PT(vol) * 16]; /* Partition table */ + if (tbl[4]) { /* Is the partition existing? */ + bsect = LD_DWORD(&tbl[8]); /* Partition offset in LBA */ + fmt = check_fs(fs, bsect); /* Check the partition */ + } + } + if (fmt == 3) return FR_DISK_ERR; + if (fmt || LD_WORD(fs->win+BPB_BytsPerSec) != SS(fs)) /* No valid FAT patition is found */ + return FR_NO_FILESYSTEM; + + /* Initialize the file system object */ + fsize = LD_WORD(fs->win+BPB_FATSz16); /* Number of sectors per FAT */ + if (!fsize) fsize = LD_DWORD(fs->win+BPB_FATSz32); + fs->sects_fat = fsize; + fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FAT copies */ + fsize *= fs->n_fats; /* (Number of sectors in FAT area) */ + fs->fatbase = bsect + LD_WORD(fs->win+BPB_RsvdSecCnt); /* FAT start sector (lba) */ + fs->csize = fs->win[BPB_SecPerClus]; /* Number of sectors per cluster */ + fs->n_rootdir = LD_WORD(fs->win+BPB_RootEntCnt); /* Nmuber of root directory entries */ + tsect = LD_WORD(fs->win+BPB_TotSec16); /* Number of sectors on the volume */ + if (!tsect) tsect = LD_DWORD(fs->win+BPB_TotSec32); + fs->max_clust = mclst = (tsect /* Last cluster# + 1 (Number of clusters + 2) */ + - LD_WORD(fs->win+BPB_RsvdSecCnt) - fsize - fs->n_rootdir / (SS(fs)/32) + ) / fs->csize + 2; + + fmt = FS_FAT12; /* Determine the FAT sub type */ + if (mclst >= 0xFF7) fmt = FS_FAT16; /* Number of clusters >= 0xFF5 */ + if (mclst >= 0xFFF7) fmt = FS_FAT32; /* Number of clusters >= 0xFFF5 */ + + if (fmt == FS_FAT32) + fs->dirbase = LD_DWORD(fs->win+BPB_RootClus); /* Root directory start cluster */ + else + fs->dirbase = fs->fatbase + fsize; /* Root directory start sector (lba) */ + fs->database = fs->fatbase + fsize + fs->n_rootdir / (SS(fs)/32); /* Data start sector (lba) */ + +#if !_FS_READONLY + /* Initialize allocation information */ + fs->free_clust = 0xFFFFFFFF; + fs->wflag = 0; + /* Get fsinfo if needed */ + if (fmt == FS_FAT32) { + fs->fsi_flag = 0; + fs->fsi_sector = bsect + LD_WORD(fs->win+BPB_FSInfo); + if (disk_read(fs->drive, fs->win, fs->fsi_sector, 1) == RES_OK && + LD_WORD(fs->win+BS_55AA) == 0xAA55 && + LD_DWORD(fs->win+FSI_LeadSig) == 0x41615252 && + LD_DWORD(fs->win+FSI_StrucSig) == 0x61417272) { + fs->last_clust = LD_DWORD(fs->win+FSI_Nxt_Free); + fs->free_clust = LD_DWORD(fs->win+FSI_Free_Count); + } + } +#endif + fs->fs_type = fmt; /* FAT sub-type */ + fs->winsect = 0; /* Invalidate sector cache */ +#if _FS_RPATH + fs->cdir = 0; /* Current directory (root dir) */ +#endif + fs->id = ++Fsid; /* File system mount ID */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file/dir object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT validate ( /* FR_OK(0): The object is valid, !=0: Invalid */ + FATFS *fs, /* Pointer to the file system object */ + WORD id /* Member id of the target object to be checked */ +) +{ + if (!fs || !fs->fs_type || fs->id != id) + return FR_INVALID_OBJECT; + + ENTER_FF(fs); /* Lock file system */ + + if (disk_status(fs->drive) & STA_NOINIT) + return FR_NOT_READY; + + return FR_OK; +} + + + + +/*-------------------------------------------------------------------------- + + Public Functions + +--------------------------------------------------------------------------*/ + + + +/*-----------------------------------------------------------------------*/ +/* Mount/Unmount a Locical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mount ( + BYTE vol, /* Logical drive number to be mounted/unmounted */ + FATFS *fs /* Pointer to new file system object (NULL for unmount)*/ +) +{ + FATFS *rfs; + + + if (vol >= _DRIVES) /* Check if the drive number is valid */ + return FR_INVALID_DRIVE; + rfs = FatFs[vol]; /* Get current fs object */ + + if (rfs) { +#if _FS_REENTRANT /* Discard sync object of the current volume */ + if (!ff_del_syncobj(rfs->sobj)) return FR_INT_ERR; +#endif + rfs->fs_type = 0; /* Clear old fs object */ + } + + if (fs) { + fs->fs_type = 0; /* Clear new fs object */ +#if _FS_REENTRANT /* Create sync object for the new volume */ + if (!ff_cre_syncobj(vol, &fs->sobj)) return FR_INT_ERR; +#endif + } + FatFs[vol] = fs; /* Register new fs object */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Open or Create a File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_open ( + FIL *fp, /* Pointer to the blank file object */ + const XCHAR *path, /* Pointer to the file name */ + BYTE mode /* Access mode and file open mode flags */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + fp->fs = NULL; /* Clear file object */ +#if !_FS_READONLY + mode &= (FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW); + res = chk_mounted(&path, &dj.fs, (BYTE)(mode & (FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW))); +#else + mode &= FA_READ; + res = chk_mounted(&path, &dj.fs, 0); +#endif + if (res != FR_OK) LEAVE_FF(dj.fs, res); + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + +#if !_FS_READONLY + /* Create or Open a file */ + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + DWORD ps, cl; + + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) /* There is no file to open, create a new entry */ + res = dir_register(&dj); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + mode |= FA_CREATE_ALWAYS; + dir = dj.dir; /* Created entry (SFN entry) */ + } + else { /* Any object is already existing */ + if (mode & FA_CREATE_NEW) /* Cannot create new */ + LEAVE_FF(dj.fs, FR_EXIST); + dir = dj.dir; + if (!dir || (dir[DIR_Attr] & (AM_RDO | AM_DIR))) /* Cannot overwrite it (R/O or DIR) */ + LEAVE_FF(dj.fs, FR_DENIED); + if (mode & FA_CREATE_ALWAYS) { /* Resize it to zero on over write mode */ + cl = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); /* Get start cluster */ + ST_WORD(dir+DIR_FstClusHI, 0); /* cluster = 0 */ + ST_WORD(dir+DIR_FstClusLO, 0); + ST_DWORD(dir+DIR_FileSize, 0); /* size = 0 */ + dj.fs->wflag = 1; + ps = dj.fs->winsect; /* Remove the cluster chain */ + if (cl) { + res = remove_chain(dj.fs, cl); + if (res) LEAVE_FF(dj.fs, res); + dj.fs->last_clust = cl - 1; /* Reuse the cluster hole */ + } + res = move_window(dj.fs, ps); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + } + } + if (mode & FA_CREATE_ALWAYS) { + dir[DIR_Attr] = 0; /* Reset attribute */ + ps = get_fattime(); + ST_DWORD(dir+DIR_CrtTime, ps); /* Created time */ + dj.fs->wflag = 1; + mode |= FA__WRITTEN; /* Set file changed flag */ + } + } + /* Open an existing file */ + else { +#endif /* !_FS_READONLY */ + if (res != FR_OK) LEAVE_FF(dj.fs, res); /* Follow failed */ + dir = dj.dir; + if (!dir || (dir[DIR_Attr] & AM_DIR)) /* It is a directory */ + LEAVE_FF(dj.fs, FR_NO_FILE); +#if !_FS_READONLY + if ((mode & FA_WRITE) && (dir[DIR_Attr] & AM_RDO)) /* R/O violation */ + LEAVE_FF(dj.fs, FR_DENIED); + } + fp->dir_sect = dj.fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dj.dir; +#endif + fp->flag = mode; /* File access mode */ + fp->org_clust = /* File start cluster */ + ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + fp->fsize = LD_DWORD(dir+DIR_FileSize); /* File size */ + fp->fptr = 0; fp->csect = 255; /* File pointer */ + fp->dsect = 0; + fp->fs = dj.fs; fp->id = dj.fs->id; /* Owner file system object of the file */ + + LEAVE_FF(dj.fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_read ( + FIL *fp, /* Pointer to the file object */ + void *buff, /* Pointer to data buffer */ + UINT btr, /* Number of bytes to read */ + UINT *br /* Pointer to number of bytes read */ +) +{ + FRESULT res; + DWORD clst, sect, remain; + UINT rcnt, cc; + BYTE *rbuff = buff; + + + *br = 0; /* Initialize bytes read */ + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_READ)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + remain = fp->fsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr; /* Repeat until all data transferred */ + rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->org_clust : get_fat(fp->fs, fp->curr_clust); + if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector offset in the cluster */ + } + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += fp->csect; + cc = btr / SS(fp->fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Read maximum contiguous sectors directly */ + if (fp->csect + cc > fp->fs->csize) /* Clip at cluster boundary */ + cc = fp->fs->csize - fp->csect; + if (disk_read(fp->fs->drive, rbuff, sect, (BYTE)cc) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#if !_FS_READONLY && _FS_MINIMIZE <= 2 +#if _FS_TINY + if (fp->fs->wflag && fp->fs->winsect - sect < cc) /* Replace one of the read sectors with cached data if it contains a dirty sector */ + mem_cpy(rbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), fp->fs->win, SS(fp->fs)); +#else + if ((fp->flag & FA__DIRTY) && fp->dsect - sect < cc) /* Replace one of the read sectors with cached data if it contains a dirty sector */ + mem_cpy(rbuff + ((fp->dsect - sect) * SS(fp->fs)), fp->buf, SS(fp->fs)); +#endif +#endif + fp->csect += (BYTE)cc; /* Next sector address in the cluster */ + rcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ + continue; + } +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Write sector I/O buffer if needed */ + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + if (fp->dsect != sect) { /* Fill sector buffer with file data */ + if (disk_read(fp->fs->drive, fp->buf, sect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + } +#endif + fp->dsect = sect; + fp->csect++; /* Next sector address in the cluster */ + } + rcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs)); /* Get partial sector data from sector buffer */ + if (rcnt > btr) rcnt = btr; +#if _FS_TINY + if (move_window(fp->fs, fp->dsect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + mem_cpy(rbuff, &fp->fs->win[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ +#else + mem_cpy(rbuff, &fp->buf[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ +#endif + } + + LEAVE_FF(fp->fs, FR_OK); +} + + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Write File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_write ( + FIL *fp, /* Pointer to the file object */ + const void *buff, /* Pointer to the data to be written */ + UINT btw, /* Number of bytes to write */ + UINT *bw /* Pointer to number of bytes written */ +) +{ + FRESULT res; + DWORD clst, sect; + UINT wcnt, cc; + const BYTE *wbuff = buff; + + + *bw = 0; /* Initialize bytes written */ + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_WRITE)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + if (fp->fsize + btw < fp->fsize) btw = 0; /* File size cannot reach 4GB */ + + for ( ; btw; /* Repeat until all data transferred */ + wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->org_clust; /* Follow from the origin */ + if (clst == 0) /* When there is no cluster chain, */ + fp->org_clust = clst = create_chain(fp->fs, 0); /* Create a new cluster chain */ + } else { /* Middle or end of the file */ + clst = create_chain(fp->fs, fp->curr_clust); /* Follow or streach cluster chain */ + } + if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ + if (clst == 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector address in the cluster */ + } +#if _FS_TINY + if (fp->fs->winsect == fp->dsect && move_window(fp->fs, 0)) /* Write back data buffer prior to following direct transfer */ + ABORT(fp->fs, FR_DISK_ERR); +#else + if (fp->flag & FA__DIRTY) { /* Write back data buffer prior to following direct transfer */ + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += fp->csect; + cc = btw / SS(fp->fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Write maximum contiguous sectors directly */ + if (fp->csect + cc > fp->fs->csize) /* Clip at cluster boundary */ + cc = fp->fs->csize - fp->csect; + if (disk_write(fp->fs->drive, wbuff, sect, (BYTE)cc) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#if _FS_TINY + if (fp->fs->winsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */ + mem_cpy(fp->fs->win, wbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), SS(fp->fs)); + fp->fs->wflag = 0; + } +#else + if (fp->dsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */ + mem_cpy(fp->buf, wbuff + ((fp->dsect - sect) * SS(fp->fs)), SS(fp->fs)); + fp->flag &= ~FA__DIRTY; + } +#endif + fp->csect += (BYTE)cc; /* Next sector address in the cluster */ + wcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ + continue; + } +#if _FS_TINY + if (fp->fptr >= fp->fsize) { /* Avoid silly buffer filling at growing edge */ + if (move_window(fp->fs, 0)) ABORT(fp->fs, FR_DISK_ERR); + fp->fs->winsect = sect; + } +#else + if (fp->dsect != sect) { /* Fill sector buffer with file data */ + if (fp->fptr < fp->fsize && + disk_read(fp->fs->drive, fp->buf, sect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + } +#endif + fp->dsect = sect; + fp->csect++; /* Next sector address in the cluster */ + } + wcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs)); /* Put partial sector into file I/O buffer */ + if (wcnt > btw) wcnt = btw; +#if _FS_TINY + if (move_window(fp->fs, fp->dsect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + mem_cpy(&fp->fs->win[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ + fp->fs->wflag = 1; +#else + mem_cpy(&fp->buf[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ + fp->flag |= FA__DIRTY; +#endif + } + + if (fp->fptr > fp->fsize) fp->fsize = fp->fptr; /* Update file size if needed */ + fp->flag |= FA__WRITTEN; /* Set file changed flag */ + + LEAVE_FF(fp->fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize the File Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_sync ( + FIL *fp /* Pointer to the file object */ +) +{ + FRESULT res; + DWORD tim; + BYTE *dir; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res == FR_OK) { + if (fp->flag & FA__WRITTEN) { /* Has the file been written? */ +#if !_FS_TINY /* Write-back dirty buffer */ + if (fp->flag & FA__DIRTY) { + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + LEAVE_FF(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + /* Update the directory entry */ + res = move_window(fp->fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ + ST_DWORD(dir+DIR_FileSize, fp->fsize); /* Update file size */ + ST_WORD(dir+DIR_FstClusLO, fp->org_clust); /* Update start cluster */ + ST_WORD(dir+DIR_FstClusHI, fp->org_clust >> 16); + tim = get_fattime(); /* Updated time */ + ST_DWORD(dir+DIR_WrtTime, tim); + fp->flag &= ~FA__WRITTEN; + fp->fs->wflag = 1; + res = sync(fp->fs); + } + } + } + + LEAVE_FF(fp->fs, res); +} + +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Close File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_close ( + FIL *fp /* Pointer to the file object to be closed */ +) +{ + FRESULT res; + + +#if _FS_READONLY + res = validate(fp->fs, fp->id); + if (res == FR_OK) fp->fs = NULL; + LEAVE_FF(fp->fs, res); +#else + res = f_sync(fp); + if (res == FR_OK) fp->fs = NULL; + return res; +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Current Drive/Directory */ +/*-----------------------------------------------------------------------*/ + +#if _FS_RPATH + +FRESULT f_chdrive ( + BYTE drv /* Drive number */ +) +{ + if (drv >= _DRIVES) return FR_INVALID_DRIVE; + + Drive = drv; + + return FR_OK; +} + + + + +FRESULT f_chdir ( + const XCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = chk_mounted(&path, &dj.fs, 0); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follow completed */ + dir = dj.dir; /* Pointer to the entry */ + if (!dir) { + dj.fs->cdir = 0; /* No entry (root dir) */ + } else { + if (dir[DIR_Attr] & AM_DIR) /* Reached to the dir */ + dj.fs->cdir = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + else + res = FR_NO_PATH; /* Could not reach the dir (it is a file) */ + } + } + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + + LEAVE_FF(dj.fs, res); +} + +#endif + + + +#if _FS_MINIMIZE <= 2 +/*-----------------------------------------------------------------------*/ +/* Seek File R/W Pointer */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_lseek ( + FIL *fp, /* Pointer to the file object */ + DWORD ofs /* File pointer from top of file */ +) +{ + FRESULT res; + DWORD clst, bcs, nsect, ifptr; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (ofs > fp->fsize /* In read-only mode, clip offset with the file size */ +#if !_FS_READONLY + && !(fp->flag & FA_WRITE) +#endif + ) ofs = fp->fsize; + + ifptr = fp->fptr; + fp->fptr = nsect = 0; fp->csect = 255; + if (ofs > 0) { + bcs = (DWORD)fp->fs->csize * SS(fp->fs); /* Cluster size (byte) */ + if (ifptr > 0 && + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + fp->fptr = (ifptr - 1) & ~(bcs - 1); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->curr_clust; + } else { /* When seek to back cluster, */ + clst = fp->org_clust; /* start from the first cluster */ +#if !_FS_READONLY + if (clst == 0) { /* If no cluster chain, create a new chain */ + clst = create_chain(fp->fs, 0); + if (clst == 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->org_clust = clst; + } +#endif + fp->curr_clust = clst; + } + if (clst != 0) { + while (ofs > bcs) { /* Cluster following loop */ +#if !_FS_READONLY + if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ + clst = create_chain(fp->fs, clst); /* Force streached if in write mode */ + if (clst == 0) { /* When disk gets full, clip file size */ + ofs = bcs; break; + } + } else +#endif + clst = get_fat(fp->fs, clst); /* Follow cluster chain if not in write mode */ + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + if (clst <= 1 || clst >= fp->fs->max_clust) ABORT(fp->fs, FR_INT_ERR); + fp->curr_clust = clst; + fp->fptr += bcs; + ofs -= bcs; + } + fp->fptr += ofs; + fp->csect = (BYTE)(ofs / SS(fp->fs)); /* Sector offset in the cluster */ + if (ofs % SS(fp->fs)) { + nsect = clust2sect(fp->fs, clst); /* Current sector */ + if (!nsect) ABORT(fp->fs, FR_INT_ERR); + nsect += fp->csect; + fp->csect++; + } + } + } + if (fp->fptr % SS(fp->fs) && nsect != fp->dsect) { +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Write-back dirty buffer if needed */ + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + if (disk_read(fp->fs->drive, fp->buf, nsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#endif + fp->dsect = nsect; + } +#if !_FS_READONLY + if (fp->fptr > fp->fsize) { /* Set changed flag if the file size is extended */ + fp->fsize = fp->fptr; + fp->flag |= FA__WRITTEN; + } +#endif + + LEAVE_FF(fp->fs, res); +} + + + + +#if _FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Create a Directroy Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_opendir ( + DIR *dj, /* Pointer to directory object to create */ + const XCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = chk_mounted(&path, &dj->fs, 0); + if (res == FR_OK) { + INITBUF((*dj), sfn, lfn); + res = follow_path(dj, path); /* Follow the path to the directory */ + if (res == FR_OK) { /* Follow completed */ + dir = dj->dir; + if (dir) { /* It is not the root dir */ + if (dir[DIR_Attr] & AM_DIR) { /* The object is a directory */ + dj->sclust = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + } else { /* The object is not a directory */ + res = FR_NO_PATH; + } + } + if (res == FR_OK) { + dj->id = dj->fs->id; + res = dir_seek(dj, 0); /* Rewind dir */ + } + } + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + + LEAVE_FF(dj->fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read Directory Entry in Sequense */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_readdir ( + DIR *dj, /* Pointer to the open directory object */ + FILINFO *fno /* Pointer to file information to return */ +) +{ + FRESULT res; + NAMEBUF(sfn, lfn); + + + res = validate(dj->fs, dj->id); /* Check validity of the object */ + if (res == FR_OK) { + INITBUF((*dj), sfn, lfn); + if (!fno) { + res = dir_seek(dj, 0); + } else { + res = dir_read(dj); + if (res == FR_NO_FILE) { + dj->sect = 0; + res = FR_OK; + } + if (res == FR_OK) { /* A valid entry is found */ + get_fileinfo(dj, fno); /* Get the object information */ + res = dir_next(dj, FALSE); /* Increment index for next */ + if (res == FR_NO_FILE) { + dj->sect = 0; + res = FR_OK; + } + } + } + } + + LEAVE_FF(dj->fs, res); +} + + + +#if _FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Get File Status */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_stat ( + const XCHAR *path, /* Pointer to the file path */ + FILINFO *fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + + + res = chk_mounted(&path, &dj.fs, 0); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follwo completed */ + if (dj.dir) /* Found an object */ + get_fileinfo(&dj, fno); + else /* It is root dir */ + res = FR_INVALID_NAME; + } + } + + LEAVE_FF(dj.fs, res); +} + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Get Number of Free Clusters */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getfree ( + const XCHAR *path, /* Pointer to the logical drive number (root dir) */ + DWORD *nclst, /* Pointer to the variable to return number of free clusters */ + FATFS **fatfs /* Pointer to pointer to corresponding file system object to return */ +) +{ + FRESULT res; + DWORD n, clst, sect, stat; + UINT i; + BYTE fat, *p; + + + /* Get drive number */ + res = chk_mounted(&path, fatfs, 0); + if (res != FR_OK) LEAVE_FF(*fatfs, res); + + /* If number of free cluster is valid, return it without cluster scan. */ + if ((*fatfs)->free_clust <= (*fatfs)->max_clust - 2) { + *nclst = (*fatfs)->free_clust; + LEAVE_FF(*fatfs, FR_OK); + } + + /* Get number of free clusters */ + fat = (*fatfs)->fs_type; + n = 0; + if (fat == FS_FAT12) { + clst = 2; + do { + stat = get_fat(*fatfs, clst); + if (stat == 0xFFFFFFFF) LEAVE_FF(*fatfs, FR_DISK_ERR); + if (stat == 1) LEAVE_FF(*fatfs, FR_INT_ERR); + if (stat == 0) n++; + } while (++clst < (*fatfs)->max_clust); + } else { + clst = (*fatfs)->max_clust; + sect = (*fatfs)->fatbase; + i = 0; p = 0; + do { + if (!i) { + res = move_window(*fatfs, sect++); + if (res != FR_OK) + LEAVE_FF(*fatfs, res); + p = (*fatfs)->win; + i = SS(*fatfs); + } + if (fat == FS_FAT16) { + if (LD_WORD(p) == 0) n++; + p += 2; i -= 2; + } else { + if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) n++; + p += 4; i -= 4; + } + } while (--clst); + } + (*fatfs)->free_clust = n; + if (fat == FS_FAT32) (*fatfs)->fsi_flag = 1; + *nclst = n; + + LEAVE_FF(*fatfs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Truncate File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_truncate ( + FIL *fp /* Pointer to the file object */ +) +{ + FRESULT res; + DWORD ncl; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_WRITE)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + + if (fp->fsize > fp->fptr) { + fp->fsize = fp->fptr; /* Set file size to current R/W point */ + fp->flag |= FA__WRITTEN; + if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain(fp->fs, fp->org_clust); + fp->org_clust = 0; + } else { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_fat(fp->fs, fp->curr_clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (ncl == 1) res = FR_INT_ERR; + if (res == FR_OK && ncl < fp->fs->max_clust) { + res = put_fat(fp->fs, fp->curr_clust, 0x0FFFFFFF); + if (res == FR_OK) res = remove_chain(fp->fs, ncl); + } + } + } + if (res != FR_OK) fp->flag |= FA__ERROR; + + LEAVE_FF(fp->fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Delete a File or Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_unlink ( + const XCHAR *path /* Pointer to the file or directory path */ +) +{ + FRESULT res; + DIR dj, sdj; + NAMEBUF(sfn, lfn); + BYTE *dir; + DWORD dclst; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res != FR_OK) LEAVE_FF(dj.fs, res); /* Follow failed */ + + dir = dj.dir; + if (!dir) /* Is it the root directory? */ + LEAVE_FF(dj.fs, FR_INVALID_NAME); + if (dir[DIR_Attr] & AM_RDO) /* Is it a R/O object? */ + LEAVE_FF(dj.fs, FR_DENIED); + dclst = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + + if (dir[DIR_Attr] & AM_DIR) { /* It is a sub-directory */ + if (dclst < 2) LEAVE_FF(dj.fs, FR_INT_ERR); + mem_cpy(&sdj, &dj, sizeof(DIR)); /* Check if the sub-dir is empty or not */ + sdj.sclust = dclst; + res = dir_seek(&sdj, 2); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + res = dir_read(&sdj); + if (res == FR_OK) res = FR_DENIED; /* Not empty sub-dir */ + if (res != FR_NO_FILE) LEAVE_FF(dj.fs, res); + } + + res = dir_remove(&dj); /* Remove directory entry */ + if (res == FR_OK) { + if (dclst) + res = remove_chain(dj.fs, dclst); /* Remove the cluster chain */ + if (res == FR_OK) res = sync(dj.fs); + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create a Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkdir ( + const XCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir, n; + DWORD dsect, dclst, pclst, tim; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) res = FR_EXIST; /* Any file or directory is already existing */ + if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res != FR_NO_FILE) /* Any error occured */ + LEAVE_FF(dj.fs, res); + + dclst = create_chain(dj.fs, 0); /* Allocate a new cluster for new directory table */ + res = FR_OK; + if (dclst == 0) res = FR_DENIED; + if (dclst == 1) res = FR_INT_ERR; + if (dclst == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) + res = move_window(dj.fs, 0); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + dsect = clust2sect(dj.fs, dclst); + + dir = dj.fs->win; /* Initialize the new directory table */ + mem_set(dir, 0, SS(dj.fs)); + mem_set(dir+DIR_Name, ' ', 8+3); /* Create "." entry */ + dir[DIR_Name] = '.'; + dir[DIR_Attr] = AM_DIR; + tim = get_fattime(); + ST_DWORD(dir+DIR_WrtTime, tim); + ST_WORD(dir+DIR_FstClusLO, dclst); + ST_WORD(dir+DIR_FstClusHI, dclst >> 16); + mem_cpy(dir+32, dir, 32); /* Create ".." entry */ + dir[33] = '.'; + pclst = dj.sclust; + if (dj.fs->fs_type == FS_FAT32 && pclst == dj.fs->dirbase) + pclst = 0; + ST_WORD(dir+32+DIR_FstClusLO, pclst); + ST_WORD(dir+32+DIR_FstClusHI, pclst >> 16); + for (n = 0; n < dj.fs->csize; n++) { /* Write dot entries and clear left sectors */ + dj.fs->winsect = dsect++; + dj.fs->wflag = 1; + res = move_window(dj.fs, 0); + if (res) LEAVE_FF(dj.fs, res); + mem_set(dir, 0, SS(dj.fs)); + } + + res = dir_register(&dj); + if (res != FR_OK) { + remove_chain(dj.fs, dclst); + } else { + dir = dj.dir; + dir[DIR_Attr] = AM_DIR; /* Attribute */ + ST_DWORD(dir+DIR_WrtTime, tim); /* Crated time */ + ST_WORD(dir+DIR_FstClusLO, dclst); /* Table start cluster */ + ST_WORD(dir+DIR_FstClusHI, dclst >> 16); + dj.fs->wflag = 1; + res = sync(dj.fs); + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change File Attribute */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chmod ( + const XCHAR *path, /* Pointer to the file path */ + BYTE value, /* Attribute bits */ + BYTE mask /* Attribute mask to change */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res == FR_OK) { + dir = dj.dir; + if (!dir) { /* Is it a root directory? */ + res = FR_INVALID_NAME; + } else { /* File or sub directory */ + mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ + dir[DIR_Attr] = (value & mask) | (dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + dj.fs->wflag = 1; + res = sync(dj.fs); + } + } + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Timestamp */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_utime ( + const XCHAR *path, /* Pointer to the file/directory name */ + const FILINFO *fno /* Pointer to the timestamp to be set */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res == FR_OK) { + dir = dj.dir; + if (!dir) { /* Root directory */ + res = FR_INVALID_NAME; + } else { /* File or sub-directory */ + ST_WORD(dir+DIR_WrtTime, fno->ftime); + ST_WORD(dir+DIR_WrtDate, fno->fdate); + dj.fs->wflag = 1; + res = sync(dj.fs); + } + } + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Rename File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_rename ( + const XCHAR *path_old, /* Pointer to the old name */ + const XCHAR *path_new /* Pointer to the new name */ +) +{ + FRESULT res; + DIR dj_old, dj_new; + NAMEBUF(sfn, lfn); + BYTE buf[21], *dir; + DWORD dw; + + + INITBUF(dj_old, sfn, lfn); + res = chk_mounted(&path_old, &dj_old.fs, 1); + if (res == FR_OK) { + dj_new.fs = dj_old.fs; + res = follow_path(&dj_old, path_old); /* Check old object */ + if (_FS_RPATH && res == FR_OK && (dj_old.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + } + if (res != FR_OK) LEAVE_FF(dj_old.fs, res); /* The old object is not found */ + + if (!dj_old.dir) LEAVE_FF(dj_old.fs, FR_NO_FILE); /* Is root dir? */ + mem_cpy(buf, dj_old.dir+DIR_Attr, 21); /* Save the object information */ + + mem_cpy(&dj_new, &dj_old, sizeof(DIR)); + res = follow_path(&dj_new, path_new); /* Check new object */ + if (res == FR_OK) res = FR_EXIST; /* The new object name is already existing */ + if (res == FR_NO_FILE) { /* Is it a valid path and no name collision? */ + res = dir_register(&dj_new); /* Register the new object */ + if (res == FR_OK) { + dir = dj_new.dir; /* Copy object information into new entry */ + mem_cpy(dir+13, buf+2, 19); + dir[DIR_Attr] = buf[0] | AM_ARC; + dj_old.fs->wflag = 1; + if (dir[DIR_Attr] & AM_DIR) { /* Update .. entry in the directory if needed */ + dw = clust2sect(dj_new.fs, (DWORD)LD_WORD(dir+DIR_FstClusHI) | LD_WORD(dir+DIR_FstClusLO)); + if (!dw) { + res = FR_INT_ERR; + } else { + res = move_window(dj_new.fs, dw); + dir = dj_new.fs->win+32; + if (res == FR_OK && dir[1] == '.') { + dw = (dj_new.fs->fs_type == FS_FAT32 && dj_new.sclust == dj_new.fs->dirbase) ? 0 : dj_new.sclust; + ST_WORD(dir+DIR_FstClusLO, dw); + ST_WORD(dir+DIR_FstClusHI, dw >> 16); + dj_new.fs->wflag = 1; + } + } + } + if (res == FR_OK) { + res = dir_remove(&dj_old); /* Remove old entry */ + if (res == FR_OK) + res = sync(dj_old.fs); + } + } + } + + LEAVE_FF(dj_old.fs, res); +} + +#endif /* !_FS_READONLY */ +#endif /* _FS_MINIMIZE == 0 */ +#endif /* _FS_MINIMIZE <= 1 */ +#endif /* _FS_MINIMIZE <= 2 */ + + + +/*-----------------------------------------------------------------------*/ +/* Forward data to the stream directly (Available on only _FS_TINY cfg) */ +/*-----------------------------------------------------------------------*/ +#if _USE_FORWARD && _FS_TINY + +FRESULT f_forward ( + FIL *fp, /* Pointer to the file object */ + UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ + UINT btr, /* Number of bytes to forward */ + UINT *bf /* Pointer to number of bytes forwarded */ +) +{ + FRESULT res; + DWORD remain, clst, sect; + UINT rcnt; + + + *bf = 0; + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check error flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_READ)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + + remain = fp->fsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr && (*func)(NULL, 0); /* Repeat until all data transferred or stream becomes busy */ + fp->fptr += rcnt, *bf += rcnt, btr -= rcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->org_clust : get_fat(fp->fs, fp->curr_clust); + if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector address in the cluster */ + } + fp->csect++; /* Next sector address in the cluster */ + } + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current data sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += fp->csect - 1; + if (move_window(fp->fs, sect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + fp->dsect = sect; + rcnt = SS(fp->fs) - (WORD)(fp->fptr % SS(fp->fs)); /* Forward data from sector window */ + if (rcnt > btr) rcnt = btr; + rcnt = (*func)(&fp->fs->win[(WORD)fp->fptr % SS(fp->fs)], rcnt); + if (!rcnt) ABORT(fp->fs, FR_INT_ERR); + } + + LEAVE_FF(fp->fs, FR_OK); +} +#endif /* _USE_FORWARD */ + + + +#if _USE_MKFS && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Create File System on the Drive */ +/*-----------------------------------------------------------------------*/ +#define N_ROOTDIR 512 /* Multiple of 32 and <= 2048 */ +#define N_FATS 1 /* 1 or 2 */ +#define MAX_SECTOR 131072000UL /* Maximum partition size */ +#define MIN_SECTOR 2000UL /* Minimum partition size */ + + +FRESULT f_mkfs ( + BYTE drv, /* Logical drive number */ + BYTE partition, /* Partitioning rule 0:FDISK, 1:SFD */ + WORD allocsize /* Allocation unit size [bytes] */ +) +{ + static const DWORD sstbl[] = { 2048000, 1024000, 512000, 256000, 128000, 64000, 32000, 16000, 8000, 4000, 0 }; + static const WORD cstbl[] = { 32768, 16384, 8192, 4096, 2048, 16384, 8192, 4096, 2048, 1024, 512 }; + BYTE fmt, m, *tbl; + DWORD b_part, b_fat, b_dir, b_data; /* Area offset (LBA) */ + DWORD n_part, n_rsv, n_fat, n_dir; /* Area size */ + DWORD n_clst, d, n; + WORD as; + FATFS *fs; + DSTATUS stat; + + + /* Check validity of the parameters */ + if (drv >= _DRIVES) return FR_INVALID_DRIVE; + if (partition >= 2) return FR_MKFS_ABORTED; + + /* Check mounted drive and clear work area */ + fs = FatFs[drv]; + if (!fs) return FR_NOT_ENABLED; + fs->fs_type = 0; + drv = LD2PD(drv); + + /* Get disk statics */ + stat = disk_initialize(drv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; +#if _MAX_SS != 512 /* Get disk sector size */ + if (disk_ioctl(drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK + || SS(fs) > _MAX_SS) + return FR_MKFS_ABORTED; +#endif + if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_part) != RES_OK || n_part < MIN_SECTOR) + return FR_MKFS_ABORTED; + if (n_part > MAX_SECTOR) n_part = MAX_SECTOR; + b_part = (!partition) ? 63 : 0; /* Boot sector */ + n_part -= b_part; + for (d = 512; d <= 32768U && d != allocsize; d <<= 1) ; /* Check validity of the allocation unit size */ + if (d != allocsize) allocsize = 0; + if (!allocsize) { /* Auto selection of cluster size */ + d = n_part; + for (as = SS(fs); as > 512U; as >>= 1) d >>= 1; + for (n = 0; d < sstbl[n]; n++) ; + allocsize = cstbl[n]; + } + if (allocsize < SS(fs)) allocsize = SS(fs); + + allocsize /= SS(fs); /* Number of sectors per cluster */ + + /* Pre-compute number of clusters and FAT type */ + n_clst = n_part / allocsize; + fmt = FS_FAT12; + if (n_clst >= 0xFF5) fmt = FS_FAT16; + if (n_clst >= 0xFFF5) fmt = FS_FAT32; + + /* Determine offset and size of FAT structure */ + switch (fmt) { + case FS_FAT12: + n_fat = ((n_clst * 3 + 1) / 2 + 3 + SS(fs) - 1) / SS(fs); + n_rsv = 1 + partition; + n_dir = N_ROOTDIR * 32 / SS(fs); + break; + case FS_FAT16: + n_fat = ((n_clst * 2) + 4 + SS(fs) - 1) / SS(fs); + n_rsv = 1 + partition; + n_dir = N_ROOTDIR * 32 / SS(fs); + break; + default: + n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); + n_rsv = 33 - partition; + n_dir = 0; + } + b_fat = b_part + n_rsv; /* FATs start sector */ + b_dir = b_fat + n_fat * N_FATS; /* Directory start sector */ + b_data = b_dir + n_dir; /* Data start sector */ + + /* Align data start sector to erase block boundary (for flash memory media) */ + if (disk_ioctl(drv, GET_BLOCK_SIZE, &n) != RES_OK) return FR_MKFS_ABORTED; + n = (b_data + n - 1) & ~(n - 1); + n_fat += (n - b_data) / N_FATS; + /* b_dir and b_data are no longer used below */ + + /* Determine number of cluster and final check of validity of the FAT type */ + n_clst = (n_part - n_rsv - n_fat * N_FATS - n_dir) / allocsize; + if ( (fmt == FS_FAT16 && n_clst < 0xFF5) + || (fmt == FS_FAT32 && n_clst < 0xFFF5)) + return FR_MKFS_ABORTED; + + /* Create partition table if needed */ + if (!partition) { + DWORD n_disk = b_part + n_part; + + mem_set(fs->win, 0, SS(fs)); + tbl = fs->win+MBR_Table; + ST_DWORD(tbl, 0x00010180); /* Partition start in CHS */ + if (n_disk < 63UL * 255 * 1024) { /* Partition end in CHS */ + n_disk = n_disk / 63 / 255; + tbl[7] = (BYTE)n_disk; + tbl[6] = (BYTE)((n_disk >> 2) | 63); + } else { + ST_WORD(&tbl[6], 0xFFFF); + } + tbl[5] = 254; + if (fmt != FS_FAT32) /* System ID */ + tbl[4] = (n_part < 0x10000) ? 0x04 : 0x06; + else + tbl[4] = 0x0c; + ST_DWORD(tbl+8, 63); /* Partition start in LBA */ + ST_DWORD(tbl+12, n_part); /* Partition size in LBA */ + ST_WORD(tbl+64, 0xAA55); /* Signature */ + if (disk_write(drv, fs->win, 0, 1) != RES_OK) + return FR_DISK_ERR; + partition = 0xF8; + } else { + partition = 0xF0; + } + + /* Create boot record */ + tbl = fs->win; /* Clear buffer */ + mem_set(tbl, 0, SS(fs)); + ST_DWORD(tbl+BS_jmpBoot, 0x90FEEB); /* Boot code (jmp $, nop) */ + ST_WORD(tbl+BPB_BytsPerSec, SS(fs)); /* Sector size */ + tbl[BPB_SecPerClus] = (BYTE)allocsize; /* Sectors per cluster */ + ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ + tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ + ST_WORD(tbl+BPB_RootEntCnt, SS(fs) / 32 * n_dir); /* Number of rootdir entries */ + if (n_part < 0x10000) { /* Number of total sectors */ + ST_WORD(tbl+BPB_TotSec16, n_part); + } else { + ST_DWORD(tbl+BPB_TotSec32, n_part); + } + tbl[BPB_Media] = partition; /* Media descripter */ + ST_WORD(tbl+BPB_SecPerTrk, 63); /* Number of sectors per track */ + ST_WORD(tbl+BPB_NumHeads, 255); /* Number of heads */ + ST_DWORD(tbl+BPB_HiddSec, b_part); /* Hidden sectors */ + n = get_fattime(); /* Use current time as a VSN */ + if (fmt != FS_FAT32) { + ST_DWORD(tbl+BS_VolID, n); /* Volume serial number */ + ST_WORD(tbl+BPB_FATSz16, n_fat); /* Number of secters per FAT */ + tbl[BS_DrvNum] = 0x80; /* Drive number */ + tbl[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab, "NO NAME FAT ", 19); /* Volume lavel, FAT signature */ + } else { + ST_DWORD(tbl+BS_VolID32, n); /* Volume serial number */ + ST_DWORD(tbl+BPB_FATSz32, n_fat); /* Number of secters per FAT */ + ST_DWORD(tbl+BPB_RootClus, 2); /* Root directory cluster (2) */ + ST_WORD(tbl+BPB_FSInfo, 1); /* FSInfo record offset (bs+1) */ + ST_WORD(tbl+BPB_BkBootSec, 6); /* Backup boot record offset (bs+6) */ + tbl[BS_DrvNum32] = 0x80; /* Drive number */ + tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab32, "NO NAME FAT32 ", 19); /* Volume lavel, FAT signature */ + } + ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature */ + if (SS(fs) > 512U) { + ST_WORD(tbl+SS(fs)-2, 0xAA55); + } + if (disk_write(drv, tbl, b_part+0, 1) != RES_OK) + return FR_DISK_ERR; + if (fmt == FS_FAT32) + disk_write(drv, tbl, b_part+6, 1); + + /* Initialize FAT area */ + for (m = 0; m < N_FATS; m++) { + mem_set(tbl, 0, SS(fs)); /* 1st sector of the FAT */ + if (fmt != FS_FAT32) { + n = (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00; + n |= partition; + ST_DWORD(tbl, n); /* Reserve cluster #0-1 (FAT12/16) */ + } else { + ST_DWORD(tbl+0, 0xFFFFFFF8); /* Reserve cluster #0-1 (FAT32) */ + ST_DWORD(tbl+4, 0xFFFFFFFF); + ST_DWORD(tbl+8, 0x0FFFFFFF); /* Reserve cluster #2 for root dir */ + } + if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + return FR_DISK_ERR; + mem_set(tbl, 0, SS(fs)); /* Following FAT entries are filled by zero */ + for (n = 1; n < n_fat; n++) { + if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + return FR_DISK_ERR; + } + } + + /* Initialize Root directory */ + m = (BYTE)((fmt == FS_FAT32) ? allocsize : n_dir); + do { + if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + return FR_DISK_ERR; + } while (--m); + + /* Create FSInfo record if needed */ + if (fmt == FS_FAT32) { + ST_WORD(tbl+BS_55AA, 0xAA55); + ST_DWORD(tbl+FSI_LeadSig, 0x41615252); + ST_DWORD(tbl+FSI_StrucSig, 0x61417272); + ST_DWORD(tbl+FSI_Free_Count, n_clst - 1); + ST_DWORD(tbl+FSI_Nxt_Free, 0xFFFFFFFF); + disk_write(drv, tbl, b_part+1, 1); + disk_write(drv, tbl, b_part+7, 1); + } + + return (disk_ioctl(drv, CTRL_SYNC, (void*)NULL) == RES_OK) ? FR_OK : FR_DISK_ERR; +} + +#endif /* _USE_MKFS && !_FS_READONLY */ + + + + +#if _USE_STRFUNC +/*-----------------------------------------------------------------------*/ +/* Get a string from the file */ +/*-----------------------------------------------------------------------*/ +char* f_gets ( + char* buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer */ + FIL* fil /* Pointer to the file object */ +) +{ + int i = 0; + char *p = buff; + UINT rc; + + + while (i < len - 1) { /* Read bytes until buffer gets filled */ + f_read(fil, p, 1, &rc); + if (rc != 1) break; /* Break when no data to read */ +#if _USE_STRFUNC >= 2 + if (*p == '\r') continue; /* Strip '\r' */ +#endif + i++; + if (*p++ == '\n') break; /* Break when reached end of line */ + } + *p = 0; + return i ? buff : NULL; /* When no data read (eof or error), return with error. */ +} + + + +#if !_FS_READONLY +#include +/*-----------------------------------------------------------------------*/ +/* Put a character to the file */ +/*-----------------------------------------------------------------------*/ +int f_putc ( + int chr, /* A character to be output */ + FIL* fil /* Ponter to the file object */ +) +{ + UINT bw; + char c; + + +#if _USE_STRFUNC >= 2 + if (chr == '\n') f_putc ('\r', fil); /* LF -> CRLF conversion */ +#endif + if (!fil) { /* Special value may be used to switch the destination to any other device */ + /* put_console(chr); */ + return chr; + } + c = (char)chr; + f_write(fil, &c, 1, &bw); /* Write a byte to the file */ + return bw ? chr : EOF; /* Return the result */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a string to the file */ +/*-----------------------------------------------------------------------*/ +int f_puts ( + const char* str, /* Pointer to the string to be output */ + FIL* fil /* Pointer to the file object */ +) +{ + int n; + + + for (n = 0; *str; str++, n++) { + if (f_putc(*str, fil) == EOF) return EOF; + } + return n; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a formatted string to the file */ +/*-----------------------------------------------------------------------*/ +int f_printf ( + FIL* fil, /* Pointer to the file object */ + const char* str, /* Pointer to the format string */ + ... /* Optional arguments... */ +) +{ + va_list arp; + UCHAR c, f, r; + ULONG val; + char s[16]; + int i, w, res, cc; + + + va_start(arp, str); + + for (cc = res = 0; cc != EOF; res += cc) { + c = *str++; + if (c == 0) break; /* End of string */ + if (c != '%') { /* Non escape cahracter */ + cc = f_putc(c, fil); + if (cc != EOF) cc = 1; + continue; + } + w = f = 0; + c = *str++; + if (c == '0') { /* Flag: '0' padding */ + f = 1; c = *str++; + } + while (c >= '0' && c <= '9') { /* Precision */ + w = w * 10 + (c - '0'); + c = *str++; + } + if (c == 'l') { /* Prefix: Size is long int */ + f |= 2; c = *str++; + } + if (c == 's') { /* Type is string */ + cc = f_puts(va_arg(arp, char*), fil); + continue; + } + if (c == 'c') { /* Type is character */ + cc = f_putc(va_arg(arp, int), fil); + if (cc != EOF) cc = 1; + continue; + } + r = 0; + if (c == 'd') r = 10; /* Type is signed decimal */ + if (c == 'u') r = 10; /* Type is unsigned decimal */ + if (c == 'X') r = 16; /* Type is unsigned hexdecimal */ + if (r == 0) break; /* Unknown type */ + if (f & 2) { /* Get the value */ + val = (ULONG)va_arg(arp, long); + } else { + val = (c == 'd') ? (ULONG)(long)va_arg(arp, int) : (ULONG)va_arg(arp, unsigned int); + } + /* Put numeral string */ + if (c == 'd') { + if (val & 0x80000000) { + val = 0 - val; + f |= 4; + } + } + i = sizeof(s) - 1; s[i] = 0; + do { + c = (UCHAR)(val % r + '0'); + if (c > '9') c += 7; + s[--i] = c; + val /= r; + } while (i && val); + if (i && (f & 4)) s[--i] = '-'; + w = sizeof(s) - 1 - w; + while (i && i > w) s[--i] = (f & 1) ? '0' : ' '; + cc = f_puts(&s[i], fil); + } + + va_end(arp); + return (cc == EOF) ? cc : res; +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_STRFUNC */ diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/fat_integer.h b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/fat_integer.h new file mode 100644 index 0000000..1d6bac3 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/fat_integer.h @@ -0,0 +1,37 @@ +/*-------------------------------------------*/ +/* Integer type definitions for FatFs module */ +/*-------------------------------------------*/ + +#ifndef _INTEGER + +#if 0 +#include +#else + +/* These types must be 16-bit, 32-bit or larger integer */ +typedef int INT; +typedef unsigned int UINT; + +/* These types must be 8-bit integer */ +typedef signed char CHAR; +typedef unsigned char UCHAR; +typedef unsigned char BYTE; + +/* These types must be 16-bit integer */ +typedef short SHORT; +typedef unsigned short USHORT; +typedef unsigned short WORD; +typedef unsigned short WCHAR; + +/* These types must be 32-bit integer */ +typedef long LONG; +typedef unsigned long ULONG; +typedef unsigned long DWORD; + +/* Boolean type */ +typedef enum { FALSE = 0, TRUE } BOOL; + +#endif + +#define _INTEGER +#endif diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/ff.c b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/ff.c new file mode 100644 index 0000000..7c8d55a --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/ff.c @@ -0,0 +1,4460 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - FAT file system module R0.07e (C)ChaN, 2009 +/-----------------------------------------------------------------------------/ +/ FatFs module is a generic FAT file system module for small embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following trems. +/ +/ Copyright (C) 2009, ChaN, all right reserved. +/ +/ * The FatFs module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/-----------------------------------------------------------------------------/ +/ Feb 26,'06 R0.00 Prototype. +/ +/ Apr 29,'06 R0.01 First stable version. +/ +/ Jun 01,'06 R0.02 Added FAT12 support. +/ Removed unbuffered mode. +/ Fixed a problem on small (<32M) patition. +/ Jun 10,'06 R0.02a Added a configuration option (_FS_MINIMUM). +/ +/ Sep 22,'06 R0.03 Added f_rename(). +/ Changed option _FS_MINIMUM to _FS_MINIMIZE. +/ Dec 11,'06 R0.03a Improved cluster scan algolithm to write files fast. +/ Fixed f_mkdir() creates incorrect directory on FAT32. +/ +/ Feb 04,'07 R0.04 Supported multiple drive system. +/ Changed some interfaces for multiple drive system. +/ Changed f_mountdrv() to f_mount(). +/ Added f_mkfs(). +/ Apr 01,'07 R0.04a Supported multiple partitions on a plysical drive. +/ Added a capability of extending file size to f_lseek(). +/ Added minimization level 3. +/ Fixed an endian sensitive code in f_mkfs(). +/ May 05,'07 R0.04b Added a configuration option _USE_NTFLAG. +/ Added FSInfo support. +/ Fixed DBCS name can result FR_INVALID_NAME. +/ Fixed short seek (<= csize) collapses the file object. +/ +/ Aug 25,'07 R0.05 Changed arguments of f_read(), f_write() and f_mkfs(). +/ Fixed f_mkfs() on FAT32 creates incorrect FSInfo. +/ Fixed f_mkdir() on FAT32 creates incorrect directory. +/ Feb 03,'08 R0.05a Added f_truncate() and f_utime(). +/ Fixed off by one error at FAT sub-type determination. +/ Fixed btr in f_read() can be mistruncated. +/ Fixed cached sector is not flushed when create and close +/ without write. +/ +/ Apr 01,'08 R0.06 Added fputc(), fputs(), fprintf() and fgets(). +/ Improved performance of f_lseek() on moving to the same +/ or following cluster. +/ +/ Apr 01,'09 R0.07 Merged Tiny-FatFs as a buffer configuration option. +/ Added long file name support. +/ Added multiple code page support. +/ Added re-entrancy for multitask operation. +/ Added auto cluster size selection to f_mkfs(). +/ Added rewind option to f_readdir(). +/ Changed result code of critical errors. +/ Renamed string functions to avoid name collision. +/ Apr 14,'09 R0.07a Separated out OS dependent code on reentrant cfg. +/ Added multiple sector size support. +/ Jun 21,'09 R0.07c Fixed f_unlink() can return FR_OK on error. +/ Fixed wrong cache control in f_lseek(). +/ Added relative path feature. +/ Added f_chdir() and f_chdrive(). +/ Added proper case conversion to extended char. +/ Nov 03,'09 R0.07e Separated out configuration options from ff.h to ffconf.h. +/ Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. +/ Fixed name matching error on the 13 char boundary. +/ Added a configuration option, _LFN_UNICODE. +/ Changed f_readdir() to return the SFN with always upper +/ case on non-LFN cfg. +/---------------------------------------------------------------------------*/ +#include "ff.h" /* FatFs configurations and declarations */ +#include "diskio.h" /* Declarations of low level disk I/O functions */ + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ +#if _FATFS != 0x007E + #error Wrong include file (ff.h). +#endif +#if _FS_REENTRANT + #if _USE_LFN == 1 + #error Static LFN work area must not be used in re-entrant configuration. + #endif + #define ENTER_FF( fs ) \ + { \ + if( !lock_fs(fs) ) \ + { \ + return FR_TIMEOUT; \ + } \ + } + + #define LEAVE_FF( fs, res ) \ + { \ + unlock_fs( fs, res ); \ + return res; \ + } + +#else + #define ENTER_FF( fs ) + #define LEAVE_FF( fs, res ) return res +#endif +#define ABORT( fs, res ) \ + { \ + fp->flag |= FA__ERROR; \ + LEAVE_FF( fs, res ); \ + } + +#ifndef NULL + #define NULL 0 +#endif + +/* Name status flags */ +#define NS 11 /* Offset of name status byte */ +#define NS_LOSS 0x01 /* Out of 8.3 format */ +#define NS_LFN 0x02 /* Force to create LFN entry */ +#define NS_LAST 0x04 /* Last segment */ +#define NS_BODY 0x08 /* Lower case flag (body) */ +#define NS_EXT 0x10 /* Lower case flag (ext) */ +#define NS_DOT 0x20 /* Dot entry */ + +/*-------------------------------------------------------------------------- + + Private Work Area + +---------------------------------------------------------------------------*/ +#if _DRIVES < 1 || _DRIVES > 9 + #error Number of drives must be 1-9. +#endif +static FATFS *FatFs[_DRIVES]; /* Pointer to the file system objects (logical drives) */ + +static WORD Fsid; /* File system mount ID */ + +#if _FS_RPATH +static BYTE Drive; /* Current drive */ +#endif +#if _USE_LFN == 1 /* LFN with static LFN working buffer */ +static WCHAR LfnBuf[_MAX_LFN + 1]; + #define NAMEBUF( sp, lp ) \ + BYTE sp[12]; \ + WCHAR *lp = LfnBuf + #define INITBUF( dj, sp, lp ) \ + dj.fn = sp; \ + dj.lfn = lp + +#elif _USE_LFN > 1 /* LFN with dynamic LFN working buffer */ + #define NAMEBUF( sp, lp ) \ + BYTE sp[12]; \ + WCHAR lbuf[_MAX_LFN + 1], *lp = lbuf + #define INITBUF( dj, sp, lp ) \ + dj.fn = sp; \ + dj.lfn = lp + +#else /* No LFN */ + #define NAMEBUF( sp, lp ) BYTE sp[12] + #define INITBUF( dj, sp, lp ) dj.fn = sp +#endif + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + +/*-----------------------------------------------------------------------*/ + +/* String functions */ + +/*-----------------------------------------------------------------------*/ + +/* Copy memory to memory */ +static void mem_cpy ( void *dst, const void *src, int cnt ) +{ + char *d = ( char * ) dst; + const char *s = ( const char * ) src; + while( cnt-- ) + { + *d++ = *s++; + } +} + +/* Fill memory */ +static void mem_set ( void *dst, int val, int cnt ) +{ + char *d = ( char * ) dst; + while( cnt-- ) + { + *d++ = ( char ) val; + } +} + +/* Compare memory to memory */ +static int mem_cmp ( const void *dst, const void *src, int cnt ) +{ + const char *d = ( const char * ) dst, *s = ( const char * ) src; + int r = 0; + while( cnt-- && (r = *d++ -*s++) == 0 ); + return r; +} + +/* Check if chr is contained in the string */ +static int chk_chr ( const char *str, int chr ) +{ + while( *str && *str != chr ) + { + str++; + } + + return *str; +} + +/*-----------------------------------------------------------------------*/ + +/* Request/Release grant to access the volume */ + +/*-----------------------------------------------------------------------*/ +#if _FS_REENTRANT +static BOOL lock_fs ( FATFS * fs /* File system object */ ) +{ + return ff_req_grant( fs->sobj ); +} + +static void unlock_fs ( FATFS * fs, /* File system object */ FRESULT res /* Result code to be returned */ ) +{ + if( res != FR_NOT_ENABLED && res != FR_INVALID_DRIVE && res != FR_INVALID_OBJECT && res != FR_TIMEOUT ) + { + ff_rel_grant( fs->sobj ); + } +} + +#endif + +/*-----------------------------------------------------------------------*/ + +/* Change window offset */ + +/*-----------------------------------------------------------------------*/ +static FRESULT move_window ( FATFS * fs, /* File system object */ DWORD sector /* Sector number to make apperance in the fs->win[] */ ) /* Move to zero only writes back dirty window */ +{ + DWORD wsect; + + wsect = fs->winsect; + if( wsect != sector ) + { /* Changed current window */ + #if !_FS_READONLY + if( fs->wflag ) + { /* Write back dirty window if needed */ + if( disk_write(fs->drive, fs->win, wsect, 1) != RES_OK ) + { + return FR_DISK_ERR; + } + + fs->wflag = 0; + if( wsect < (fs->fatbase + fs->sects_fat) ) + { /* In FAT area */ + BYTE nf; + for( nf = fs->n_fats; nf > 1; nf-- ) + { /* Refrect the change to all FAT copies */ + wsect += fs->sects_fat; + disk_write( fs->drive, fs->win, wsect, 1 ); + } + } + } + + #endif + if( sector ) + { + if( disk_read(fs->drive, fs->win, sector, 1) != RES_OK ) + { + return FR_DISK_ERR; + } + + fs->winsect = sector; + } + } + + return FR_OK; +} + +/*-----------------------------------------------------------------------*/ + +/* Clean-up cached data */ + +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static FRESULT sync ( /* FR_OK: successful, FR_DISK_ERR: failed */ FATFS * fs /* File system object */ ) +{ + FRESULT res; + + res = move_window( fs, 0 ); + if( res == FR_OK ) + { + /* Update FSInfo sector if needed */ + if( fs->fs_type == FS_FAT32 && fs->fsi_flag ) + { + fs->winsect = 0; + mem_set( fs->win, 0, 512 ); + ST_WORD( fs->win + BS_55AA, 0xAA55 ); + ST_DWORD( fs->win + FSI_LeadSig, 0x41615252 ); + ST_DWORD( fs->win + FSI_StrucSig, 0x61417272 ); + ST_DWORD( fs->win + FSI_Free_Count, fs->free_clust ); + ST_DWORD( fs->win + FSI_Nxt_Free, fs->last_clust ); + disk_write( fs->drive, fs->win, fs->fsi_sector, 1 ); + fs->fsi_flag = 0; + } + + /* Make sure that no pending write process in the physical drive */ + if( disk_ioctl(fs->drive, CTRL_SYNC, ( void * ) NULL) != RES_OK ) + { + res = FR_DISK_ERR; + } + } + + return res; +} + +#endif + +/*-----------------------------------------------------------------------*/ + +/* FAT access - Read value of a FAT entry */ + +/*-----------------------------------------------------------------------*/ +DWORD get_fat + ( /* 0xFFFFFFFF:Disk error, 1:Interal error, Else:Cluster status */ + FATFS * fs, /* File system object */ DWORD clst /* Cluster# to get the link information */ + ) +{ + UINT wc, bc; + DWORD fsect; + + if( clst < 2 || clst >= fs->max_clust ) + { /* Range check */ + return 1; + } + + fsect = fs->fatbase; + switch( fs->fs_type ) + { + case FS_FAT12: + bc = clst; + bc += bc / 2; + if( move_window(fs, fsect + (bc / SS(fs))) ) + { + break; + } + + wc = fs->win[bc & ( SS(fs) - 1 )]; + bc++; + if( move_window(fs, fsect + (bc / SS(fs))) ) + { + break; + } + + wc |= ( WORD ) fs->win[bc & ( SS(fs) - 1 )] << 8; + return( clst & 1 ) ? ( wc >> 4 ) : ( wc & 0xFFF ); + + case FS_FAT16: + if( move_window(fs, fsect + (clst / (SS(fs) / 2))) ) + { + break; + } + + return LD_WORD( &fs->win[((WORD) clst * 2) & (SS(fs) - 1)] ); + + case FS_FAT32: + if( move_window(fs, fsect + (clst / (SS(fs) / 4))) ) + { + break; + } + + return + LD_DWORD( &fs->win[((WORD) clst * 4) & (SS(fs) - 1)] ) + & 0x0FFFFFFF; + } + + return 0xFFFFFFFF; /* An error occured at the disk I/O layer */ +} + +/*-----------------------------------------------------------------------*/ + +/* FAT access - Change value of a FAT entry */ + +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +FRESULT put_fat + ( FATFS * fs, /* File system object */ DWORD clst, /* Cluster# to be changed in range of 2 to fs->max_clust - 1 */ DWORD val /* New value to mark the cluster */ ) +{ + UINT bc; + BYTE * p; + DWORD fsect; + FRESULT res; + + if( clst < 2 || clst >= fs->max_clust ) + { /* Range check */ + res = FR_INT_ERR; + } + else + { + fsect = fs->fatbase; + switch( fs->fs_type ) + { + case FS_FAT12: + bc = clst; + bc += bc / 2; + res = move_window( fs, fsect + (bc / SS(fs)) ); + if( res != FR_OK ) + { + break; + } + + p = &fs->win[bc & ( SS(fs) - 1 )]; + *p = ( clst & 1 ) ? ( (*p & 0x0F) | ((BYTE) val << 4) ) : ( BYTE ) val; + bc++; + fs->wflag = 1; + res = move_window( fs, fsect + (bc / SS(fs)) ); + if( res != FR_OK ) + { + break; + } + + p = &fs->win[bc & ( SS(fs) - 1 )]; + *p = ( clst & 1 ) ? ( BYTE ) ( val >> 4 ) : ( (*p & 0xF0) | ((BYTE) (val >> 8) & 0x0F) ); + break; + + case FS_FAT16: + res = move_window( fs, fsect + (clst / (SS(fs) / 2)) ); + if( res != FR_OK ) + { + break; + } + + ST_WORD( &fs->win[((WORD) clst * 2) & (SS(fs) - 1)], (WORD) val ); + break; + + case FS_FAT32: + res = move_window( fs, fsect + (clst / (SS(fs) / 4)) ); + if( res != FR_OK ) + { + break; + } + + ST_DWORD( &fs->win[((WORD) clst * 4) & (SS(fs) - 1)], val ); + break; + + default: + res = FR_INT_ERR; + } + + fs->wflag = 1; + } + + return res; +} + +#endif /* !_FS_READONLY */ + +/*-----------------------------------------------------------------------*/ + +/* FAT handling - Remove a cluster chain */ + +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static FRESULT remove_chain ( FATFS * fs, /* File system object */ DWORD clst /* Cluster# to remove a chain from */ ) +{ + FRESULT res; + DWORD nxt; + + if( clst < 2 || clst >= fs->max_clust ) + { /* Check the range of cluster# */ + res = FR_INT_ERR; + } + else + { + res = FR_OK; + while( clst < fs->max_clust ) + { /* Not a last link? */ + nxt = get_fat( fs, clst ); /* Get cluster status */ + if( nxt == 0 ) + { + break; /* Empty cluster? */ + } + + if( nxt == 1 ) + { + res = FR_INT_ERR; + break; + } /* Internal error? */ + if( nxt == 0xFFFFFFFF ) + { + res = FR_DISK_ERR; + break; + } /* Disk error? */ + res = put_fat( fs, clst, 0 ); /* Mark the cluster "empty" */ + if( res != FR_OK ) + { + break; + } + + if( fs->free_clust != 0xFFFFFFFF ) + { /* Update FSInfo */ + fs->free_clust++; + fs->fsi_flag = 1; + } + + clst = nxt; /* Next cluster */ + } + } + + return res; +} + +#endif + +/*-----------------------------------------------------------------------*/ + +/* FAT handling - Stretch or Create a cluster chain */ + +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static DWORD create_chain + ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + FATFS * fs, /* File system object */ DWORD clst /* Cluster# to stretch. 0 means create a new chain. */ + ) +{ + DWORD cs, ncl, scl, mcl; + + mcl = fs->max_clust; + if( clst == 0 ) + { /* Create new chain */ + scl = fs->last_clust; /* Get suggested start point */ + if( scl == 0 || scl >= mcl ) + { + scl = 1; + } + } + else + { /* Stretch existing chain */ + cs = get_fat( fs, clst ); /* Check the cluster status */ + if( cs < 2 ) + { + return 1; /* It is an invalid cluster */ + } + + if( cs < mcl ) + { + return cs; /* It is already followed by next cluster */ + } + + scl = clst; + } + + ncl = scl; /* Start cluster */ + for( ;; ) + { + ncl++; /* Next cluster */ + if( ncl >= mcl ) + { /* Wrap around */ + ncl = 2; + if( ncl > scl ) + { + return 0; /* No free custer */ + } + } + + cs = get_fat( fs, ncl ); /* Get the cluster status */ + if( cs == 0 ) + { + break; /* Found a free cluster */ + } + + if( cs == 0xFFFFFFFF || cs == 1 ) + { /* An error occured */ + return cs; + } + + if( ncl == scl ) + { + return 0; /* No free custer */ + } + } + + if( put_fat(fs, ncl, 0x0FFFFFFF) ) + { /* Mark the new cluster "in use" */ + return 0xFFFFFFFF; + } + + if( clst != 0 ) + { /* Link it to the previous one if needed */ + if( put_fat(fs, clst, ncl) ) + { + return 0xFFFFFFFF; + } + } + + fs->last_clust = ncl; /* Update FSINFO */ + if( fs->free_clust != 0xFFFFFFFF ) + { + fs->free_clust--; + fs->fsi_flag = 1; + } + + return ncl; /* Return new cluster number */ +} + +#endif /* !_FS_READONLY */ + +/*-----------------------------------------------------------------------*/ + +/* Get sector# from cluster# */ + +/*-----------------------------------------------------------------------*/ +DWORD clust2sect + ( /* !=0: Sector number, 0: Failed - invalid cluster# */ FATFS * fs, /* File system object */ DWORD clst /* Cluster# to be converted */ ) +{ + clst -= 2; + if( clst >= (fs->max_clust - 2) ) + { + return 0; /* Invalid cluster# */ + } + + return clst * fs->csize + fs->database; +} + +/*-----------------------------------------------------------------------*/ + +/* Directory handling - Seek directory index */ + +/*-----------------------------------------------------------------------*/ +static FRESULT dir_seek ( DIR * dj, /* Pointer to directory object */ WORD idx /* Directory index number */ ) +{ + DWORD clst; + WORD ic; + + dj->index = idx; + clst = dj->sclust; + if( clst == 1 || clst >= dj->fs->max_clust ) + { /* Check start cluster range */ + return FR_INT_ERR; + } + + if( !clst && dj->fs->fs_type == FS_FAT32 ) + { /* Replace cluster# 0 with root cluster# if in FAT32 */ + clst = dj->fs->dirbase; + } + + if( clst == 0 ) + { /* Static table */ + dj->clust = clst; + if( idx >= dj->fs->n_rootdir ) + { /* Index is out of range */ + return FR_INT_ERR; + } + + dj->sect = dj->fs->dirbase + idx / ( SS(dj->fs) / 32 ); /* Sector# */ + } + else + { /* Dynamic table */ + ic = + SS( dj->fs ) + / 32 * dj->fs->csize; /* Entries per cluster */ + while( idx >= ic ) + { /* Follow cluster chain */ + clst = get_fat( dj->fs, clst ); /* Get next cluster */ + if( clst == 0xFFFFFFFF ) + { + return FR_DISK_ERR; /* Disk error */ + } + + if( clst < 2 || clst >= dj->fs->max_clust ) + { /* Reached to end of table or int error */ + return FR_INT_ERR; + } + + idx -= ic; + } + + dj->clust = clst; + dj->sect = + clust2sect( dj->fs, clst ) + + idx / ( SS(dj->fs) / 32 ); /* Sector# */ + } + + dj->dir = dj->fs->win + ( idx % (SS(dj->fs) / 32) ) * 32; /* Ptr to the entry in the sector */ + + return FR_OK; /* Seek succeeded */ +} + +/*-----------------------------------------------------------------------*/ + +/* Directory handling - Move directory index next */ + +/*-----------------------------------------------------------------------*/ +static FRESULT dir_next + ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:EOT and could not streach */ + DIR * + dj, /* Pointer to directory object */ BOOL streach /* FALSE: Do not streach table, TRUE: Streach table if needed */ + ) +{ + DWORD clst; + WORD i; + + i = dj->index + 1; + if( !i || !dj->sect ) + { /* Report EOT when index has reached 65535 */ + return FR_NO_FILE; + } + + if( !(i % (SS(dj->fs) / 32)) ) + { /* Sector changed? */ + dj->sect++; /* Next sector */ + + if( dj->clust == 0 ) + { /* Static table */ + if( i >= dj->fs->n_rootdir ) + { /* Report EOT when end of table */ + return FR_NO_FILE; + } + } + else + { /* Dynamic table */ + if( ((i / (SS(dj->fs) / 32)) & (dj->fs->csize - 1)) == 0 ) + { /* Cluster changed? */ + clst = get_fat( dj->fs, dj->clust ); /* Get next cluster */ + if( clst <= 1 ) + { + return FR_INT_ERR; + } + + if( clst == 0xFFFFFFFF ) + { + return FR_DISK_ERR; + } + + if( clst >= dj->fs->max_clust ) + { /* When it reached end of dynamic table */ + #if !_FS_READONLY + BYTE c; + if( !streach ) + { + return FR_NO_FILE; /* When do not streach, report EOT */ + } + + clst = create_chain( dj->fs, dj->clust ); /* Streach cluster chain */ + if( clst == 0 ) + { + return FR_DENIED; /* No free cluster */ + } + + if( clst == 1 ) + { + return FR_INT_ERR; + } + + if( clst == 0xFFFFFFFF ) + { + return FR_DISK_ERR; + } + + /* Clean-up streached table */ + if( move_window(dj->fs, 0) ) + { + return FR_DISK_ERR; /* Flush active window */ + } + + mem_set( dj->fs->win, 0, SS(dj->fs) ); /* Clear window buffer */ + dj->fs->winsect = clust2sect( dj->fs, clst ); /* Cluster start sector */ + for( c = 0; c < dj->fs->csize; c++ ) + { /* Fill the new cluster with 0 */ + dj->fs->wflag = 1; + if( move_window(dj->fs, 0) ) + { + return FR_DISK_ERR; + } + + dj->fs->winsect++; + } + + dj->fs->winsect -= c; /* Rewind window address */ + #else + return FR_NO_FILE; /* Report EOT */ + #endif + } + + dj->clust = clst; /* Initialize data for new cluster */ + dj->sect = clust2sect( dj->fs, clst ); + } + } + } + + dj->index = i; + dj->dir = dj->fs->win + ( i % (SS(dj->fs) / 32) ) * 32; + + return FR_OK; +} + +/*-----------------------------------------------------------------------*/ + +/* LFN handling - Test/Pick/Fit an LFN segment from/to directory entry */ + +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static const BYTE LfnOfs[] = { 1, 3, 5, 7, 9, 14, 16, 18, 20, 22, 24, 28, 30 }; + +/* Offset of LFN chars in the directory entry */ + +static BOOL cmp_lfn + ( /* TRUE:Matched, FALSE:Not matched */ + WCHAR *lfnbuf, /* Pointer to the LFN to be compared */ + BYTE *dir /* Pointer to the directory entry containing a part of LFN */ + ) +{ + int i, s; + WCHAR wc, uc; + + i = ( (dir[LDIR_Ord] & 0xBF) - 1 ) * 13; /* Get offset in the LFN buffer */ + s = 0; + wc = 1; + do + { + uc = LD_WORD( dir + LfnOfs[s] ); /* Pick an LFN character from the entry */ + if( wc ) + { /* Last char has not been processed */ + wc = ff_wtoupper( uc ); /* Convert it to upper case */ + if( i >= _MAX_LFN || wc != ff_wtoupper(lfnbuf[i++]) ) + { /* Compare it */ + return FALSE; /* Not matched */ + } + } + else + { + if( uc != 0xFFFF ) + { + return FALSE; /* Check filler */ + } + } + } while( ++s < 13 ); + + /* Repeat until all chars in the entry are checked */ + + if( (dir[LDIR_Ord] & 0x40) && wc && lfnbuf[i] ) + { /* Last segment matched but different length */ + return FALSE; + } + + return TRUE; /* The part of LFN matched */ +} + +static BOOL pick_lfn + ( /* TRUE:Succeeded, FALSE:Buffer overflow */ + WCHAR *lfnbuf, /* Pointer to the Unicode-LFN buffer */ + BYTE *dir /* Pointer to the directory entry */ + ) +{ + int i, s; + WCHAR wc, uc; + + i = ( (dir[LDIR_Ord] & 0x3F) - 1 ) * 13; /* Offset in the LFN buffer */ + + s = 0; + wc = 1; + do + { + uc = LD_WORD( dir + LfnOfs[s] ); /* Pick an LFN character from the entry */ + if( wc ) + { /* Last char has not been processed */ + if( i >= _MAX_LFN ) + { + return FALSE; /* Buffer overflow? */ + } + + lfnbuf[i++] = wc = uc; /* Store it */ + } + else + { + if( uc != 0xFFFF ) + { + return FALSE; /* Check filler */ + } + } + } while( ++s < 13 ); + + /* Read all character in the entry */ + + if( dir[LDIR_Ord] & 0x40 ) + { /* Put terminator if it is the last LFN part */ + if( i >= _MAX_LFN ) + { + return FALSE; /* Buffer overflow? */ + } + + lfnbuf[i] = 0; + } + + return TRUE; +} + + #if !_FS_READONLY +static void fit_lfn + ( + const WCHAR *lfnbuf, /* Pointer to the LFN buffer */ + BYTE *dir, /* Pointer to the directory entry */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* SFN sum */ + ) +{ + int i, s; + WCHAR wc; + + dir[LDIR_Chksum] = sum; /* Set check sum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + ST_WORD( dir + LDIR_FstClusLO, 0 ); + + i = ( ord - 1 ) * 13; /* Get offset in the LFN buffer */ + s = wc = 0; + do + { + if( wc != 0xFFFF ) + { + wc = lfnbuf[i++]; /* Get an effective char */ + } + + ST_WORD( dir + LfnOfs[s], wc ); /* Put it */ + if( !wc ) + { + wc = 0xFFFF; /* Padding chars following last char */ + } + } while( ++s < 13 ); + if( wc == 0xFFFF || !lfnbuf[i] ) + { + ord |= 0x40; /* Bottom LFN part is the start of LFN sequence */ + } + + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + + #endif +#endif + +/*-----------------------------------------------------------------------*/ + +/* Create numbered name */ + +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +void gen_numname + ( + BYTE *dst, /* Pointer to genartated SFN */ + const BYTE *src, /* Pointer to source SFN to be modified */ + const WCHAR *lfn, /* Pointer to LFN */ + WORD num /* Sequense number */ + ) +{ + char ns[8]; + int i, j; + + mem_cpy( dst, src, 11 ); + + if( num > 5 ) + { /* On many collisions, generate a hash number instead of sequencial number */ + do + { + num = ( num >> 1 ) + ( num << 15 ) + ( WORD ) * lfn++; + } while( *lfn ); + } + + /* itoa */ + i = 7; + do + { + ns[i--] = ( num % 10 ) + '0'; + num /= 10; + } while( num ); + ns[i] = '~'; + + /* Append the number */ + for( j = 0; j < i && dst[j] != ' '; j++ ) + { + if( IsDBCS1(dst[j]) ) + { + if( j == i - 1 ) + { + break; + } + + j++; + } + } + + do + { + dst[j++] = ( i < 8 ) ? ns[i++] : ' '; + } while( j < 8 ); +} + +#endif + +/*-----------------------------------------------------------------------*/ + +/* Calculate sum of an SFN */ + +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static BYTE sum_sfn( const BYTE *dir /* Ptr to directory entry */ ) +{ + BYTE sum = 0; + int n = 11; + + do + { + sum = ( sum >> 1 ) + ( sum << 7 ) +*dir++; + } while( --n ); + return sum; +} + +#endif + +/*-----------------------------------------------------------------------*/ + +/* Directory handling - Find an object in the directory */ + +/*-----------------------------------------------------------------------*/ +static FRESULT dir_find( DIR *dj /* Pointer to the directory object linked to the file name */ ) +{ + FRESULT res; + BYTE c, *dir; + #if _USE_LFN + BYTE a, ord, sum; + #endif + res = dir_seek( dj, 0 ); /* Rewind directory object */ + if( res != FR_OK ) + { + return res; + } + + #if _USE_LFN + ord = sum = 0xFF; + #endif + do + { + res = move_window( dj->fs, dj->sect ); + if( res != FR_OK ) + { + break; + } + + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if( c == 0 ) + { + res = FR_NO_FILE; + break; + } /* Reached to end of table */ + + #if _USE_LFN /* LFN configuration */ + a = dir[DIR_Attr] & AM_MASK; + if( c == 0xE5 || ((a & AM_VOL) && a != AM_LFN) ) + { /* An entry without valid data */ + ord = 0xFF; + } + else + { + if( a == AM_LFN ) + { /* An LFN entry is found */ + if( dj->lfn ) + { + if( c & 0x40 ) + { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= 0xBF; + ord = c; /* LFN start order */ + dj->lfn_idx = dj->index; + } + + /* Check validity of the LFN entry and compare it with given name */ + ord = ( c == ord && sum == dir[LDIR_Chksum] && cmp_lfn(dj->lfn, dir) ) ? ord - 1 : 0xFF; + } + } + else + { /* An SFN entry is found */ + if( !ord && sum == sum_sfn(dir) ) + { + break; /* LFN matched? */ + } + + ord = 0xFF; + dj->lfn_idx = 0xFFFF; /* Reset LFN sequence */ + if( !(dj->fn[NS] & NS_LOSS) && !mem_cmp(dir, dj->fn, 11) ) + { + break; /* SFN matched? */ + } + } + } + + #else /* Non LFN configuration */ + if( !(dir[DIR_Attr] & AM_VOL) && !mem_cmp(dir, dj->fn, 11) ) + { /* Is it a valid entry? */ + break; + } + + #endif + res = dir_next( dj, FALSE ); /* Next entry */ + } while( res == FR_OK ); + + return res; +} + +/*-----------------------------------------------------------------------*/ + +/* Read an object from the directory */ + +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 +static FRESULT dir_read( DIR *dj /* Pointer to the directory object that pointing the entry to be read */ ) +{ + FRESULT res; + BYTE c, *dir; + #if _USE_LFN + BYTE a, ord = 0xFF, sum = 0xFF; + #endif + res = FR_NO_FILE; + while( dj->sect ) + { + res = move_window( dj->fs, dj->sect ); + if( res != FR_OK ) + { + break; + } + + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if( c == 0 ) + { + res = FR_NO_FILE; + break; + } /* Reached to end of table */ + + #if _USE_LFN /* LFN configuration */ + a = dir[DIR_Attr] & AM_MASK; + if( c == 0xE5 || (!_FS_RPATH && c == '.') || ((a & AM_VOL) && a != AM_LFN) ) + { /* An entry without valid data */ + ord = 0xFF; + } + else + { + if( a == AM_LFN ) + { /* An LFN entry is found */ + if( c & 0x40 ) + { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= 0xBF; + ord = c; + dj->lfn_idx = dj->index; + } + + /* Check LFN validity and capture it */ + ord = ( c == ord && sum == dir[LDIR_Chksum] && pick_lfn(dj->lfn, dir) ) ? ord - 1 : 0xFF; + } + else + { /* An SFN entry is found */ + if( ord || sum != sum_sfn(dir) ) + { /* Is there a valid LFN? */ + dj->lfn_idx = 0xFFFF; /* It has no LFN. */ + } + + break; + } + } + + #else /* Non LFN configuration */ + if( c != 0xE5 && (_FS_RPATH || c != '.') && !(dir[DIR_Attr] & AM_VOL) ) + { /* Is it a valid entry? */ + break; + } + + #endif + res = dir_next( dj, FALSE ); /* Next entry */ + if( res != FR_OK ) + { + break; + } + } + + if( res != FR_OK ) + { + dj->sect = 0; + } + + return res; +} + +#endif + +/*-----------------------------------------------------------------------*/ + +/* Register an object to the directory */ + +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static FRESULT dir_register + ( /* FR_OK:Successful, FR_DENIED:No free entry or too many SFN collision, FR_DISK_ERR:Disk error */ + DIR *dj /* Target directory with object name to be created */ + ) +{ + FRESULT res; + BYTE c, *dir; + #if _USE_LFN /* LFN configuration */ + WORD n, ne, is; + BYTE sn[12], *fn, sum; + WCHAR *lfn; + + fn = dj->fn; + lfn = dj->lfn; + mem_cpy( sn, fn, 12 ); + + if( _FS_RPATH && (sn[NS] & NS_DOT) ) + { + return FR_INVALID_NAME; /* Cannot create dot entry */ + } + + if( sn[NS] & NS_LOSS ) + { /* When LFN is out of 8.3 format, generate a numbered name */ + fn[NS] = 0; + dj->lfn = NULL; /* Find only SFN */ + for( n = 1; n < 100; n++ ) + { + gen_numname( fn, sn, lfn, n ); /* Generate a numbered name */ + res = dir_find( dj ); /* Check if the name collides with existing SFN */ + if( res != FR_OK ) + { + break; + } + } + + if( n == 100 ) + { + return FR_DENIED; /* Abort if too many collisions */ + } + + if( res != FR_NO_FILE ) + { + return res; /* Abort if the result is other than 'not collided' */ + } + + fn[NS] = sn[NS]; + dj->lfn = lfn; + } + + if( sn[NS] & NS_LFN ) + { /* When LFN is to be created, reserve reserve an SFN + LFN entries. */ + for( ne = 0; lfn[ne]; ne++ ); + ne = ( ne + 25 ) / 13; + } + else + { /* Otherwise reserve only an SFN entry. */ + ne = 1; + } + + /* Reserve contiguous entries */ + res = dir_seek( dj, 0 ); + if( res != FR_OK ) + { + return res; + } + + n = is = 0; + do + { + res = move_window( dj->fs, dj->sect ); + if( res != FR_OK ) + { + break; + } + + c = *dj->dir; /* Check the entry status */ + if( c == 0xE5 || c == 0 ) + { /* Is it a blank entry? */ + if( n == 0 ) + { + is = dj->index; /* First index of the contigulus entry */ + } + + if( ++n == ne ) + { + break; /* A contiguous entry that requiered count is found */ + } + } + else + { + n = 0; /* Not a blank entry. Restart to search */ + } + + res = dir_next( dj, TRUE ); /* Next entry with table streach */ + } while( res == FR_OK ); + + if( res == FR_OK && ne > 1 ) + { /* Initialize LFN entry if needed */ + res = dir_seek( dj, is ); + if( res == FR_OK ) + { + sum = sum_sfn( dj->fn ); /* Sum of the SFN tied to the LFN */ + ne--; + do + { /* Store LFN entries in bottom first */ + res = move_window( dj->fs, dj->sect ); + if( res != FR_OK ) + { + break; + } + + fit_lfn( dj->lfn, dj->dir, (BYTE) ne, sum ); + dj->fs->wflag = 1; + res = dir_next( dj, FALSE ); /* Next entry */ + } while( res == FR_OK && --ne ); + } + } + + #else /* Non LFN configuration */ + res = dir_seek( dj, 0 ); + if( res == FR_OK ) + { + do + { /* Find a blank entry for the SFN */ + res = move_window( dj->fs, dj->sect ); + if( res != FR_OK ) + { + break; + } + + c = *dj->dir; + if( c == 0xE5 || c == 0 ) + { + break; /* Is it a blank entry? */ + } + + res = dir_next( dj, TRUE ); /* Next entry with table streach */ + } while( res == FR_OK ); + } + + #endif + if( res == FR_OK ) + { /* Initialize the SFN entry */ + res = move_window( dj->fs, dj->sect ); + if( res == FR_OK ) + { + dir = dj->dir; + mem_set( dir, 0, 32 ); /* Clean the entry */ + mem_cpy( dir, dj->fn, 11 ); /* Put SFN */ + dir[DIR_NTres] = *( dj->fn + NS ) & ( NS_BODY | NS_EXT ); /* Put NT flag */ + dj->fs->wflag = 1; + } + } + + return res; +} + +#endif /* !_FS_READONLY */ + +/*-----------------------------------------------------------------------*/ + +/* Remove an object from the directory */ + +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY && !_FS_MINIMIZE +static FRESULT dir_remove + ( /* FR_OK: Successful, FR_DISK_ERR: A disk error */ + DIR *dj /* Directory object pointing the entry to be removed */ + ) +{ + FRESULT res; + #if _USE_LFN /* LFN configuration */ + WORD i; + + i = dj->index; /* SFN index */ + res = dir_seek( dj, (WORD) ((dj->lfn_idx == 0xFFFF) ? i : dj->lfn_idx) ); /* Goto the SFN or top of the LFN entries */ + if( res == FR_OK ) + { + do + { + res = move_window( dj->fs, dj->sect ); + if( res != FR_OK ) + { + break; + } + + *dj->dir = 0xE5; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + if( dj->index >= i ) + { + break; /* When reached SFN, all entries of the object has been deleted. */ + } + + res = dir_next( dj, FALSE ); /* Next entry */ + } while( res == FR_OK ); + if( res == FR_NO_FILE ) + { + res = FR_INT_ERR; + } + } + + #else /* Non LFN configuration */ + res = dir_seek( dj, dj->index ); + if( res == FR_OK ) + { + res = move_window( dj->fs, dj->sect ); + if( res == FR_OK ) + { + *dj->dir = 0xE5; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + } + } + + #endif + return res; +} + +#endif /* !_FS_READONLY */ + +/*-----------------------------------------------------------------------*/ + +/* Pick a segment and create the object name in directory form */ + +/*-----------------------------------------------------------------------*/ +static FRESULT create_name + ( + DIR *dj, /* Pointer to the directory object */ + const XCHAR **path /* Pointer to pointer to the segment in the path string */ + ) +{ + #ifdef _EXCVT + + static const BYTE cvt[] = _EXCVT; + #endif + #if _USE_LFN /* LFN configuration */ + BYTE b, cf; + WCHAR w, *lfn; + int i, ni, si, di; + const XCHAR *p; + + /* Create LFN in Unicode */ + si = di = 0; + p = *path; + lfn = dj->lfn; + for( ;; ) + { + w = p[si++]; /* Get a character */ + if( w < ' ' || w == '/' || w == '\\' ) + { + break; /* Break on end of segment */ + } + + if( di >= _MAX_LFN ) + { /* Reject too long name */ + return FR_INVALID_NAME; + } + + #if !_LFN_UNICODE + w &= 0xFF; + if( IsDBCS1(w) ) + { /* If it is a DBC 1st byte */ + b = p[si++]; /* Get 2nd byte */ + if( !IsDBCS2(b) ) + { /* Reject invalid code for DBC */ + return FR_INVALID_NAME; + } + + w = ( w << 8 ) + b; + } + + w = ff_convert( w, 1 ); /* Convert OEM to Unicode */ + if( !w ) + { + return FR_INVALID_NAME; /* Reject invalid code */ + } + + #endif + if( w < 0x80 && chk_chr("\"*:<>\?|\x7F", w) ) + { /* Reject illegal chars for LFN */ + return FR_INVALID_NAME; + } + + lfn[di++] = w; /* Store the Unicode char */ + } + + *path = &p[si]; /* Rerurn pointer to the next segment */ + cf = ( w < ' ' ) ? NS_LAST : 0; /* Set last segment flag if end of path */ + #if _FS_RPATH + if( (di == 1 && lfn[di - 1] == '.') || /* Is this a dot entry? */ (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.') ) + { + lfn[di] = 0; + for( i = 0; i < 11; i++ ) + { + dj->fn[i] = ( i < di ) ? '.' : ' '; + } + + dj->fn[i] = cf | NS_DOT; /* This is a dot entry */ + return FR_OK; + } + + #endif + while( di ) + { /* Strip trailing spaces and dots */ + w = lfn[di - 1]; + if( w != ' ' && w != '.' ) + { + break; + } + + di--; + } + + if( !di ) + { + return FR_INVALID_NAME; /* Reject null string */ + } + + lfn[di] = 0; /* LFN is created */ + + /* Create SFN in directory form */ + mem_set( dj->fn, ' ', 11 ); + for( si = 0; lfn[si] == ' ' || lfn[si] == '.'; si++ ); + + /* Strip leading spaces and dots */ + if( si ) + { + cf |= NS_LOSS | NS_LFN; + } + + while( di && lfn[di - 1] != '.' ) + { + di--; /* Find extension (di<=si: no extension) */ + } + + b = i = 0; + ni = 8; + for( ;; ) + { + w = lfn[si++]; /* Get an LFN char */ + if( !w ) + { + break; /* Break on enf of the LFN */ + } + + if( w == ' ' || (w == '.' && si != di) ) + { /* Remove spaces and dots */ + cf |= NS_LOSS | NS_LFN; + continue; + } + + if( i >= ni || si == di ) + { /* Extension or end of SFN */ + if( ni == 11 ) + { /* Long extension */ + cf |= NS_LOSS | NS_LFN; + break; + } + + if( si != di ) + { + cf |= NS_LOSS | NS_LFN; /* Out of 8.3 format */ + } + + if( si > di ) + { + break; /* No extension */ + } + + si = di; + i = 8; + ni = 11; /* Enter extension section */ + b <<= 2; + continue; + } + + if( w >= 0x80 ) + { /* Non ASCII char */ + #ifdef _EXCVT + w = ff_convert( w, 0 ); /* Unicode -> OEM code */ + if( w ) + { + w = cvt[w - 0x80]; /* Convert extended char to upper (SBCS) */ + } + + #else + w = ff_convert( ff_wtoupper(w), 0 ); /* Upper converted Unicode -> OEM code */ + #endif + cf |= NS_LFN; /* Force create LFN entry */ + } + + if( _DF1S && w >= 0x100 ) + { /* Double byte char */ + if( i >= ni - 1 ) + { + cf |= NS_LOSS | NS_LFN; + i = ni; + continue; + } + + dj->fn[i++] = ( BYTE ) ( w >> 8 ); + } + else + { /* Single byte char */ + if( !w || chk_chr("+,;[=]", w) ) + { /* Replace illegal chars for SFN */ + w = '_'; + cf |= NS_LOSS | NS_LFN; /* Lossy conversion */ + } + else + { + if( IsUpper(w) ) + { /* ASCII large capital */ + b |= 2; + } + else + { + if( IsLower(w) ) + { /* ASCII small capital */ + b |= 1; + w -= 0x20; + } + } + } + } + + dj->fn[i++] = ( BYTE ) w; + } + + if( dj->fn[0] == 0xE5 ) + { + dj->fn[0] = 0x05; /* If the first char collides with deleted mark, replace it with 0x05 */ + } + + if( ni == 8 ) + { + b <<= 2; + } + + if( (b & 0x0C) == 0x0C || (b & 0x03) == 0x03 ) + { /* Create LFN entry when there are composite capitals */ + cf |= NS_LFN; + } + + if( !(cf & NS_LFN) ) + { /* When LFN is in 8.3 format without extended char, NT flags are created */ + if( (b & 0x03) == 0x01 ) + { + cf |= NS_EXT; /* NT flag (Extension has only small capital) */ + } + + if( (b & 0x0C) == 0x04 ) + { + cf |= NS_BODY; /* NT flag (Filename has only small capital) */ + } + } + + dj->fn[NS] = cf; /* SFN is created */ + + return FR_OK; + + #else /* Non-LFN configuration */ + BYTE b, c, d, *sfn; + int ni, si, i; + const char *p; + + /* Create file name in directory form */ + sfn = dj->fn; + mem_set( sfn, ' ', 11 ); + si = i = b = 0; + ni = 8; + p = *path; + #if _FS_RPATH + if( p[si] == '.' ) + { /* Is this a dot entry? */ + for( ;; ) + { + c = p[si++]; + if( c != '.' || si >= 3 ) + { + break; + } + + sfn[i++] = c; + } + + if( c != '/' && c != '\\' && c > ' ' ) + { + return FR_INVALID_NAME; + } + + *path = &p[si]; /* Rerurn pointer to the next segment */ + sfn[NS] = ( c <= ' ' ) ? NS_LAST | NS_DOT : NS_DOT; /* Set last segment flag if end of path */ + return FR_OK; + } + + #endif + for( ;; ) + { + c = p[si++]; + if( c <= ' ' || c == '/' || c == '\\' ) + { + break; /* Break on end of segment */ + } + + if( c == '.' || i >= ni ) + { + if( ni != 8 || c != '.' ) + { + return FR_INVALID_NAME; + } + + i = 8; + ni = 11; + b <<= 2; + continue; + } + + if( c >= 0x80 ) + { /* Extended char */ + #ifdef _EXCVT + c = cvt[c - 0x80]; /* Convert extend char (SBCS) */ + #else + b |= 3; /* Eliminate NT flag if ext char is exist */ + #if !_DF1S /* ASCII only cfg */ + return FR_INVALID_NAME; + #endif + #endif + } + + if( IsDBCS1(c) ) + { /* DBC 1st byte? */ + d = p[si++]; /* Get 2nd byte */ + if( !IsDBCS2(d) || i >= ni - 1 ) + { /* Reject invalid DBC */ + return FR_INVALID_NAME; + } + + sfn[i++] = c; + sfn[i++] = d; + } + else + { /* Single byte code */ + if( chk_chr(" \"*+,[=]|\x7F", c) ) + { /* Reject illegal chrs for SFN */ + return FR_INVALID_NAME; + } + + if( IsUpper(c) ) + { /* ASCII large capital? */ + b |= 2; + } + else + { + if( IsLower(c) ) + { /* ASCII small capital? */ + b |= 1; + c -= 0x20; + } + } + + sfn[i++] = c; + } + } + + *path = &p[si]; /* Return pointer to the next segment */ + c = ( c <= ' ' ) ? NS_LAST : 0; /* Set last segment flag if end of path */ + + if( !i ) + { + return FR_INVALID_NAME; /* Reject null string */ + } + + if( sfn[0] == 0xE5 ) + { + sfn[0] = 0x05; /* When first char collides with 0xE5, replace it with 0x05 */ + } + + if( ni == 8 ) + { + b <<= 2; + } + + if( (b & 0x03) == 0x01 ) + { + c |= NS_EXT; /* NT flag (Extension has only small capital) */ + } + + if( (b & 0x0C) == 0x04 ) + { + c |= NS_BODY; /* NT flag (Filename has only small capital) */ + } + + sfn[NS] = c; /* Store NT flag, File name is created */ + + return FR_OK; + #endif +} + +/*-----------------------------------------------------------------------*/ + +/* Get file information from directory entry */ + +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 +static void get_fileinfo + ( /* No return code */ + DIR *dj, /* Pointer to the directory object */ + FILINFO *fno /* Pointer to the file information to be filled */ + ) +{ + int i; + BYTE c, nt, *dir; + char *p; + + p = fno->fname; + if( dj->sect ) + { + dir = dj->dir; + nt = dir[DIR_NTres]; /* NT flag */ + for( i = 0; i < 8; i++ ) + { /* Copy name body */ + c = dir[i]; + if( c == ' ' ) + { + break; + } + + if( c == 0x05 ) + { + c = 0xE5; + } + + if( _USE_LFN && (nt & NS_BODY) && IsUpper(c) ) + { + c += 0x20; + } + + *p++ = c; + } + + if( dir[8] != ' ' ) + { /* Copy name extension */ + *p++ = '.'; + for( i = 8; i < 11; i++ ) + { + c = dir[i]; + if( c == ' ' ) + { + break; + } + + if( _USE_LFN && (nt & NS_EXT) && IsUpper(c) ) + { + c += 0x20; + } + + *p++ = c; + } + } + + fno->fattrib = dir[DIR_Attr]; /* Attribute */ + fno->fsize = LD_DWORD( dir + DIR_FileSize ); /* Size */ + fno->fdate = LD_WORD( dir + DIR_WrtDate ); /* Date */ + fno->ftime = LD_WORD( dir + DIR_WrtTime ); /* Time */ + } + + *p = 0; + + #if _USE_LFN + if( fno->lfname ) + { + XCHAR *tp = fno->lfname; + WCHAR w, *lfn; + + i = 0; + if( dj->sect && dj->lfn_idx != 0xFFFF ) + { /* Get LFN if available */ + lfn = dj->lfn; + while( (w = *lfn++) != 0 ) + { /* Get an LFN char */ + #if !_LFN_UNICODE + w = ff_convert( w, 0 ); /* Unicode -> OEM conversion */ + if( !w ) + { + i = 0; + break; + } /* Could not convert, no LFN */ + + if( _DF1S && w >= 0x100 ) + { /* Put 1st byte if it is a DBC */ + tp[i++] = ( XCHAR ) ( w >> 8 ); + } + + #endif + if( i >= fno->lfsize - 1 ) + { + i = 0; + break; + } /* Buffer overrun, no LFN */ + + tp[i++] = ( XCHAR ) w; + } + } + + tp[i] = 0; /* Terminator */ + } + + #endif +} + +#endif /* _FS_MINIMIZE <= 1 */ + +/*-----------------------------------------------------------------------*/ + +/* Follow a file path */ + +/*-----------------------------------------------------------------------*/ +static FRESULT follow_path + ( /* FR_OK(0): successful, !=0: error code */ + DIR *dj, /* Directory object to return last directory and found object */ + const XCHAR *path /* Full-path string to find a file or directory */ + ) +{ + FRESULT res; + BYTE *dir, last; + + while( !_USE_LFN && *path == ' ' ) + { + path++; /* Skip leading spaces */ + } + + #if _FS_RPATH + if( *path == '/' || *path == '\\' ) + { /* There is a heading separator */ + path++; + dj->sclust = 0; /* Strip it and start from the root dir */ + } + else + { /* No heading saparator */ + dj->sclust = dj->fs->cdir; /* Start from the current dir */ + } + + #else + if( *path == '/' || *path == '\\' ) + { /* Strip heading separator if exist */ + path++; + } + + dj->sclust = 0; /* Start from the root dir */ + #endif + if( (UINT) * path < ' ' ) + { /* Null path means the start directory itself */ + res = dir_seek( dj, 0 ); + dj->dir = NULL; + } + else + { /* Follow path */ + for( ;; ) + { + res = create_name( dj, &path ); /* Get a segment */ + if( res != FR_OK ) + { + break; + } + + res = dir_find( dj ); /* Find it */ + last = *( dj->fn + NS ) & NS_LAST; + if( res != FR_OK ) + { /* Could not find the object */ + if( res == FR_NO_FILE && !last ) + { + res = FR_NO_PATH; + } + + break; + } + + if( last ) + { + break; /* Last segment match. Function completed. */ + } + + dir = dj->dir; /* There is next segment. Follow the sub directory */ + if( !(dir[DIR_Attr] & AM_DIR) ) + { /* Cannot follow because it is a file */ + res = FR_NO_PATH; + break; + } + + dj->sclust = ( (DWORD) LD_WORD(dir + DIR_FstClusHI) << 16 ) | LD_WORD( dir + DIR_FstClusLO ); + } + } + + return res; +} + +/*-----------------------------------------------------------------------*/ + +/* Load boot record and check if it is an FAT boot record */ + +/*-----------------------------------------------------------------------*/ +static BYTE check_fs + ( /* 0:The FAT boot record, 1:Valid boot record but not an FAT, 2:Not a boot record, 3:Error */ + FATFS *fs, /* File system object */ + DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */ + ) +{ + if( disk_read(fs->drive, fs->win, sect, 1) != RES_OK ) + { /* Load boot record */ + return 3; + } + + if( LD_WORD(&fs->win[BS_55AA]) != 0xAA55 ) + { /* Check record signature (always placed at offset 510 even if the sector size is >512) */ + return 2; + } + + if( (LD_DWORD(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146 ) + { /* Check "FAT" string */ + return 0; + } + + if( (LD_DWORD(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146 ) + { + return 0; + } + + return 1; +} + +/*-----------------------------------------------------------------------*/ + +/* Make sure that the file system is valid */ + +/*-----------------------------------------------------------------------*/ +FRESULT chk_mounted + ( /* FR_OK(0): successful, !=0: any error occured */ + const XCHAR **path, /* Pointer to pointer to the path name (drive number) */ + FATFS **rfs, /* Pointer to pointer to the found file system object */ + BYTE chk_wp /* !=0: Check media write protection for write access */ + ) +{ + BYTE fmt, *tbl; + UINT vol; + DSTATUS stat; + DWORD bsect, fsize, tsect, mclst; + const XCHAR *p = *path; + FATFS *fs; + + /* Get logical drive number from the path name */ + vol = p[0] - '0'; /* Is there a drive number? */ + if( vol <= 9 && p[1] == ':' ) + { /* Found a drive number, get and strip it */ + p += 2; + *path = p; /* Return pointer to the path name */ + } + else + { /* No drive number is given */ + #if _FS_RPATH + vol = Drive; /* Use current drive */ + #else + vol = 0; /* Use drive 0 */ + #endif + } + + /* Check if the logical drive is valid or not */ + if( vol >= _DRIVES ) + { /* Is the drive number valid? */ + return FR_INVALID_DRIVE; + } + + *rfs = fs = FatFs[vol]; /* Returen pointer to the corresponding file system object */ + if( !fs ) + { + return FR_NOT_ENABLED; /* Is the file system object available? */ + } + + ENTER_FF( fs ); /* Lock file system */ + + if( fs->fs_type ) + { /* If the logical drive has been mounted */ + stat = disk_status( fs->drive ); + if( !(stat & STA_NOINIT) ) + { /* and the physical drive is kept initialized (has not been changed), */ + #if !_FS_READONLY + if( chk_wp && (stat & STA_PROTECT) ) + { /* Check write protection if needed */ + return FR_WRITE_PROTECTED; + } + + #endif + return FR_OK; /* The file system object is valid */ + } + } + + /* The logical drive must be mounted. Following code attempts to mount the volume */ + fs->fs_type = 0; /* Clear the file system object */ + fs->drive = ( BYTE ) LD2PD( vol ); /* Bind the logical drive and a physical drive */ + stat = disk_initialize( fs->drive ); /* Initialize low level disk I/O layer */ + if( stat & STA_NOINIT ) + { /* Check if the drive is ready */ + return FR_NOT_READY; + } + + #if _MAX_SS != 512 /* Get disk sector size if needed */ + if( disk_ioctl(fs->drive, GET_SECTOR_SIZE, &SS(fs)) != RES_OK || SS(fs) > _MAX_SS ) + { + return FR_NO_FILESYSTEM; + } + + #endif + #if !_FS_READONLY + if( chk_wp && (stat & STA_PROTECT) ) + { /* Check disk write protection if needed */ + return FR_WRITE_PROTECTED; + } + + #endif + + /* Search FAT partition on the drive */ + fmt = check_fs( fs, bsect = 0 ); /* Check sector 0 as an SFD format */ + if( fmt == 1 ) + { /* Not an FAT boot record, it may be patitioned */ + /* Check a partition listed in top of the partition table */ + tbl = &fs->win[MBR_Table + LD2PT( vol ) * 16]; /* Partition table */ + if( tbl[4] ) + { /* Is the partition existing? */ + bsect = LD_DWORD( &tbl[8] ); /* Partition offset in LBA */ + fmt = check_fs( fs, bsect ); /* Check the partition */ + } + } + + if( fmt == 3 ) + { + return FR_DISK_ERR; + } + + if( fmt || LD_WORD(fs->win + BPB_BytsPerSec) != SS(fs) ) + { /* No valid FAT patition is found */ + return FR_NO_FILESYSTEM; + } + + /* Initialize the file system object */ + fsize = LD_WORD( fs->win + BPB_FATSz16 ); /* Number of sectors per FAT */ + if( !fsize ) + { + fsize = LD_DWORD( fs->win + BPB_FATSz32 ); + } + + fs->sects_fat = fsize; + fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FAT copies */ + fsize *= fs->n_fats; /* (Number of sectors in FAT area) */ + fs->fatbase = bsect + LD_WORD( fs->win + BPB_RsvdSecCnt ); /* FAT start sector (lba) */ + fs->csize = fs->win[BPB_SecPerClus]; /* Number of sectors per cluster */ + fs->n_rootdir = LD_WORD( fs->win + BPB_RootEntCnt ); /* Nmuber of root directory entries */ + tsect = LD_WORD( fs->win + BPB_TotSec16 ); /* Number of sectors on the volume */ + if( !tsect ) + { + tsect = LD_DWORD( fs->win + BPB_TotSec32 ); + } + + fs->max_clust = mclst = + ( + tsect /* Last cluster# + 1 (Number of clusters + 2) */ - + LD_WORD(fs->win + BPB_RsvdSecCnt) - + fsize - + fs->n_rootdir / + (SS(fs) / 32) + ) / + fs->csize + + 2; + + fmt = FS_FAT12; /* Determine the FAT sub type */ + if( mclst >= 0xFF7 ) + { + fmt = FS_FAT16; /* Number of clusters >= 0xFF5 */ + } + + if( mclst >= 0xFFF7 ) + { + fmt = FS_FAT32; /* Number of clusters >= 0xFFF5 */ + } + + if( fmt == FS_FAT32 ) + { + fs->dirbase = LD_DWORD( fs->win + BPB_RootClus ); /* Root directory start cluster */ + } + else + { + fs->dirbase = fs->fatbase + fsize; /* Root directory start sector (lba) */ + } + + fs->database = fs->fatbase + fsize + fs->n_rootdir / ( SS(fs) / 32 ); /* Data start sector (lba) */ + + #if !_FS_READONLY + + /* Initialize allocation information */ + fs->free_clust = 0xFFFFFFFF; + fs->wflag = 0; + + /* Get fsinfo if needed */ + if( fmt == FS_FAT32 ) + { + fs->fsi_flag = 0; + fs->fsi_sector = bsect + LD_WORD( fs->win + BPB_FSInfo ); + if + ( + disk_read(fs->drive, fs->win, fs->fsi_sector, 1) == RES_OK && + LD_WORD(fs->win + BS_55AA) == 0xAA55 && + LD_DWORD(fs->win + FSI_LeadSig) == 0x41615252 && + LD_DWORD(fs->win + FSI_StrucSig) == 0x61417272 + ) + { + fs->last_clust = LD_DWORD( fs->win + FSI_Nxt_Free ); + fs->free_clust = LD_DWORD( fs->win + FSI_Free_Count ); + } + } + + #endif + fs->fs_type = fmt; /* FAT sub-type */ + fs->winsect = 0; /* Invalidate sector cache */ + #if _FS_RPATH + fs->cdir = 0; /* Current directory (root dir) */ + #endif + fs->id = ++Fsid; /* File system mount ID */ + + return FR_OK; +} + +/*-----------------------------------------------------------------------*/ + +/* Check if the file/dir object is valid or not */ + +/*-----------------------------------------------------------------------*/ +static FRESULT validate + ( /* FR_OK(0): The object is valid, !=0: Invalid */ + FATFS *fs, /* Pointer to the file system object */ + WORD id /* Member id of the target object to be checked */ + ) +{ + if( !fs || !fs->fs_type || fs->id != id ) + { + return FR_INVALID_OBJECT; + } + + ENTER_FF( fs ); /* Lock file system */ + + if( disk_status(fs->drive) & STA_NOINIT ) + { + return FR_NOT_READY; + } + + return FR_OK; +} + +/*-------------------------------------------------------------------------- + + Public Functions + +--------------------------------------------------------------------------*/ + +/*-----------------------------------------------------------------------*/ + +/* Mount/Unmount a Locical Drive */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_mount + ( + BYTE vol, /* Logical drive number to be mounted/unmounted */ + FATFS *fs /* Pointer to new file system object (NULL for unmount)*/ + ) +{ + FATFS *rfs; + + if( vol >= _DRIVES ) + { /* Check if the drive number is valid */ + return FR_INVALID_DRIVE; + } + + rfs = FatFs[vol]; /* Get current fs object */ + + if( rfs ) + { + #if _FS_REENTRANT /* Discard sync object of the current volume */ + if( !ff_del_syncobj(rfs->sobj) ) + { + return FR_INT_ERR; + } + + #endif + rfs->fs_type = 0; /* Clear old fs object */ + } + + if( fs ) + { + fs->fs_type = 0; /* Clear new fs object */ + #if _FS_REENTRANT /* Create sync object for the new volume */ + if( !ff_cre_syncobj(vol, &fs->sobj) ) + { + return FR_INT_ERR; + } + + #endif + } + + FatFs[vol] = fs; /* Register new fs object */ + + return FR_OK; +} + +/*-----------------------------------------------------------------------*/ + +/* Open or Create a File */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_open + ( + FIL *fp, /* Pointer to the blank file object */ + const XCHAR *path, /* Pointer to the file name */ + BYTE mode /* Access mode and file open mode flags */ + ) +{ + FRESULT res; + DIR dj; + NAMEBUF( sfn, lfn ); + + BYTE *dir; + + fp->fs = NULL; /* Clear file object */ + #if !_FS_READONLY + mode &= ( FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW ); + res = chk_mounted( &path, &dj.fs, (BYTE) (mode & (FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) ); + #else + mode &= FA_READ; + res = chk_mounted( &path, &dj.fs, 0 ); + #endif + if( res != FR_OK ) + { + LEAVE_FF( dj.fs, res ); + } + + INITBUF( dj, sfn, lfn ); + res = follow_path( &dj, path ); /* Follow the file path */ + + #if !_FS_READONLY + + /* Create or Open a file */ + if( mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW) ) + { + DWORD ps, cl; + + if( res != FR_OK ) + { /* No file, create new */ + if( res == FR_NO_FILE ) + { /* There is no file to open, create a new entry */ + res = dir_register( &dj ); + } + + if( res != FR_OK ) + { + LEAVE_FF( dj.fs, res ); + } + + mode |= FA_CREATE_ALWAYS; + dir = dj.dir; /* Created entry (SFN entry) */ + } + else + { /* Any object is already existing */ + if( mode & FA_CREATE_NEW ) + { /* Cannot create new */ + LEAVE_FF( dj.fs, FR_EXIST ); + } + + dir = dj.dir; + if( !dir || (dir[DIR_Attr] & (AM_RDO | AM_DIR)) ) + { /* Cannot overwrite it (R/O or DIR) */ + LEAVE_FF( dj.fs, FR_DENIED ); + } + + if( mode & FA_CREATE_ALWAYS ) + { /* Resize it to zero on over write mode */ + cl = ( (DWORD) LD_WORD(dir + DIR_FstClusHI) << 16 ) | LD_WORD( dir + DIR_FstClusLO ); /* Get start cluster */ + ST_WORD( dir + DIR_FstClusHI, 0 ); /* cluster = 0 */ + ST_WORD( dir + DIR_FstClusLO, 0 ); + ST_DWORD( dir + DIR_FileSize, 0 ); /* size = 0 */ + dj.fs->wflag = 1; + ps = dj.fs->winsect; /* Remove the cluster chain */ + if( cl ) + { + res = remove_chain( dj.fs, cl ); + if( res ) + { + LEAVE_FF( dj.fs, res ); + } + + dj.fs->last_clust = cl - 1; /* Reuse the cluster hole */ + } + + res = move_window( dj.fs, ps ); + if( res != FR_OK ) + { + LEAVE_FF( dj.fs, res ); + } + } + } + + if( mode & FA_CREATE_ALWAYS ) + { + dir[DIR_Attr] = 0; /* Reset attribute */ + ps = get_fattime(); + ST_DWORD( dir + DIR_CrtTime, ps ); /* Created time */ + dj.fs->wflag = 1; + mode |= FA__WRITTEN; /* Set file changed flag */ + } + } + + /* Open an existing file */ + else + { + #endif /* !_FS_READONLY */ + if( res != FR_OK ) + { + LEAVE_FF( dj.fs, res ); /* Follow failed */ + } + + dir = dj.dir; + if( !dir || (dir[DIR_Attr] & AM_DIR) ) + { /* It is a directory */ + LEAVE_FF( dj.fs, FR_NO_FILE ); + } + + #if !_FS_READONLY + if( (mode & FA_WRITE) && (dir[DIR_Attr] & AM_RDO) ) + { /* R/O violation */ + LEAVE_FF( dj.fs, FR_DENIED ); + } + } + + fp->dir_sect = dj.fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dj.dir; + #endif + fp->flag = mode; /* File access mode */ + fp->org_clust = /* File start cluster */ + ( (DWORD) LD_WORD(dir + DIR_FstClusHI) << 16 ) | LD_WORD( dir + DIR_FstClusLO ); + fp->fsize = LD_DWORD( dir + DIR_FileSize ); /* File size */ + fp->fptr = 0; + fp->csect = 255; /* File pointer */ + fp->dsect = 0; + fp->fs = dj.fs; + fp->id = dj.fs->id; /* Owner file system object of the file */ + + LEAVE_FF( dj.fs, FR_OK ); +} + +/*-----------------------------------------------------------------------*/ + +/* Read File */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_read + ( + FIL *fp, /* Pointer to the file object */ + void *buff, /* Pointer to data buffer */ + UINT btr, /* Number of bytes to read */ + UINT *br /* Pointer to number of bytes read */ + ) +{ + FRESULT res; + DWORD clst, sect, remain; + UINT rcnt, cc; + BYTE *rbuff = buff; + + *br = 0; /* Initialize bytes read */ + + res = validate( fp->fs, fp->id ); /* Check validity of the object */ + if( res != FR_OK ) + { + LEAVE_FF( fp->fs, res ); + } + + if( fp->flag & FA__ERROR ) + { /* Check abort flag */ + LEAVE_FF( fp->fs, FR_INT_ERR ); + } + + if( !(fp->flag & FA_READ) ) + { /* Check access mode */ + LEAVE_FF( fp->fs, FR_DENIED ); + } + + remain = fp->fsize - fp->fptr; + if( btr > remain ) + { + btr = ( UINT ) remain; /* Truncate btr by remaining bytes */ + } + + for( ; btr; /* Repeat until all data transferred */ rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt ) + { + if( (fp->fptr % SS(fp->fs)) == 0 ) + { /* On the sector boundary? */ + if( fp->csect >= fp->fs->csize ) + { /* On the cluster boundary? */ + clst = ( fp->fptr == 0 ) ? /* On the top of the file? */ + fp->org_clust : get_fat( fp->fs, fp->curr_clust ); + if( clst <= 1 ) + { + ABORT( fp->fs, FR_INT_ERR ); + } + + if( clst == 0xFFFFFFFF ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector offset in the cluster */ + } + + sect = clust2sect( fp->fs, fp->curr_clust ); /* Get current sector */ + if( !sect ) + { + ABORT( fp->fs, FR_INT_ERR ); + } + + sect += fp->csect; + cc = btr / SS( fp->fs ); /* When remaining bytes >= sector size, */ + if( cc ) + { /* Read maximum contiguous sectors directly */ + if( fp->csect + cc > fp->fs->csize ) + { /* Clip at cluster boundary */ + cc = fp->fs->csize - fp->csect; + } + + if( disk_read(fp->fs->drive, rbuff, sect, (BYTE) cc) != RES_OK ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + + #if !_FS_READONLY && _FS_MINIMIZE <= 2 + #if _FS_TINY + if( fp->fs->wflag && fp->fs->winsect - sect < cc ) + { /* Replace one of the read sectors with cached data if it contains a dirty sector */ + mem_cpy( rbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), fp->fs->win, SS(fp->fs) ); + } + + #else + if( (fp->flag & FA__DIRTY) && fp->dsect - sect < cc ) + { /* Replace one of the read sectors with cached data if it contains a dirty sector */ + mem_cpy( rbuff + ((fp->dsect - sect) * SS(fp->fs)), fp->buf, SS(fp->fs) ); + } + + #endif + #endif + fp->csect += ( BYTE ) cc; /* Next sector address in the cluster */ + rcnt = SS( fp->fs ) * cc; /* Number of bytes transferred */ + continue; + } + + #if !_FS_TINY + #if !_FS_READONLY + if( fp->flag & FA__DIRTY ) + { /* Write sector I/O buffer if needed */ + if( disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + + fp->flag &= ~FA__DIRTY; + } + + #endif + if( fp->dsect != sect ) + { /* Fill sector buffer with file data */ + if( disk_read(fp->fs->drive, fp->buf, sect, 1) != RES_OK ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + } + + #endif + fp->dsect = sect; + fp->csect++; /* Next sector address in the cluster */ + } + + rcnt = SS( fp->fs ) - ( fp->fptr % SS(fp->fs) ); /* Get partial sector data from sector buffer */ + if( rcnt > btr ) + { + rcnt = btr; + } + + #if _FS_TINY + if( move_window(fp->fs, fp->dsect) ) + { /* Move sector window */ + ABORT( fp->fs, FR_DISK_ERR ); + } + + mem_cpy( rbuff, &fp->fs->win[fp->fptr % SS(fp->fs)], rcnt ); /* Pick partial sector */ + #else + mem_cpy( rbuff, &fp->buf[fp->fptr % SS(fp->fs)], rcnt ); /* Pick partial sector */ + #endif + } + + LEAVE_FF( fp->fs, FR_OK ); +} + +#if !_FS_READONLY + +/*-----------------------------------------------------------------------*/ + +/* Write File */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_write + ( + FIL *fp, /* Pointer to the file object */ + const void *buff, /* Pointer to the data to be written */ + UINT btw, /* Number of bytes to write */ + UINT *bw /* Pointer to number of bytes written */ + ) +{ + FRESULT res; + DWORD clst, sect; + UINT wcnt, cc; + const BYTE *wbuff = buff; + + *bw = 0; /* Initialize bytes written */ + + res = validate( fp->fs, fp->id ); /* Check validity of the object */ + if( res != FR_OK ) + { + LEAVE_FF( fp->fs, res ); + } + + if( fp->flag & FA__ERROR ) + { /* Check abort flag */ + LEAVE_FF( fp->fs, FR_INT_ERR ); + } + + if( !(fp->flag & FA_WRITE) ) + { /* Check access mode */ + LEAVE_FF( fp->fs, FR_DENIED ); + } + + if( fp->fsize + btw < fp->fsize ) + { + btw = 0; /* File size cannot reach 4GB */ + } + + for( ; btw; /* Repeat until all data transferred */ wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt ) + { + if( (fp->fptr % SS(fp->fs)) == 0 ) + { /* On the sector boundary? */ + if( fp->csect >= fp->fs->csize ) + { /* On the cluster boundary? */ + if( fp->fptr == 0 ) + { /* On the top of the file? */ + clst = fp->org_clust; /* Follow from the origin */ + if( clst == 0 ) + { /* When there is no cluster chain, */ + fp->org_clust = clst = create_chain( fp->fs, 0 ); /* Create a new cluster chain */ + } + } + else + { /* Middle or end of the file */ + clst = create_chain( fp->fs, fp->curr_clust ); /* Follow or streach cluster chain */ + } + + if( clst == 0 ) + { + break; /* Could not allocate a new cluster (disk full) */ + } + + if( clst == 1 ) + { + ABORT( fp->fs, FR_INT_ERR ); + } + + if( clst == 0xFFFFFFFF ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector address in the cluster */ + } + + #if _FS_TINY + if( fp->fs->winsect == fp->dsect && move_window(fp->fs, 0) ) + { /* Write back data buffer prior to following direct transfer */ + ABORT( fp->fs, FR_DISK_ERR ); + } + + #else + if( fp->flag & FA__DIRTY ) + { /* Write back data buffer prior to following direct transfer */ + if( disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + + fp->flag &= ~FA__DIRTY; + } + + #endif + sect = clust2sect( fp->fs, fp->curr_clust ); /* Get current sector */ + if( !sect ) + { + ABORT( fp->fs, FR_INT_ERR ); + } + + sect += fp->csect; + cc = btw / SS( fp->fs ); /* When remaining bytes >= sector size, */ + if( cc ) + { /* Write maximum contiguous sectors directly */ + if( fp->csect + cc > fp->fs->csize ) + { /* Clip at cluster boundary */ + cc = fp->fs->csize - fp->csect; + } + + if( disk_write(fp->fs->drive, wbuff, sect, (BYTE) cc) != RES_OK ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + + #if _FS_TINY + if( fp->fs->winsect - sect < cc ) + { /* Refill sector cache if it gets dirty by the direct write */ + mem_cpy( fp->fs->win, wbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), SS(fp->fs) ); + fp->fs->wflag = 0; + } + + #else + if( fp->dsect - sect < cc ) + { /* Refill sector cache if it gets dirty by the direct write */ + mem_cpy( fp->buf, wbuff + ((fp->dsect - sect) * SS(fp->fs)), SS(fp->fs) ); + fp->flag &= ~FA__DIRTY; + } + + #endif + fp->csect += ( BYTE ) cc; /* Next sector address in the cluster */ + wcnt = SS( fp->fs ) * cc; /* Number of bytes transferred */ + continue; + } + + #if _FS_TINY + if( fp->fptr >= fp->fsize ) + { /* Avoid silly buffer filling at growing edge */ + if( move_window(fp->fs, 0) ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + + fp->fs->winsect = sect; + } + + #else + if( fp->dsect != sect ) + { /* Fill sector buffer with file data */ + if( fp->fptr < fp->fsize && disk_read(fp->fs->drive, fp->buf, sect, 1) != RES_OK ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + } + + #endif + fp->dsect = sect; + fp->csect++; /* Next sector address in the cluster */ + } + + wcnt = SS( fp->fs ) - ( fp->fptr % SS(fp->fs) ); /* Put partial sector into file I/O buffer */ + if( wcnt > btw ) + { + wcnt = btw; + } + + #if _FS_TINY + if( move_window(fp->fs, fp->dsect) ) + { /* Move sector window */ + ABORT( fp->fs, FR_DISK_ERR ); + } + + mem_cpy( &fp->fs->win[fp->fptr % SS(fp->fs)], wbuff, wcnt ); /* Fit partial sector */ + fp->fs->wflag = 1; + #else + mem_cpy( &fp->buf[fp->fptr % SS(fp->fs)], wbuff, wcnt ); /* Fit partial sector */ + fp->flag |= FA__DIRTY; + #endif + } + + if( fp->fptr > fp->fsize ) + { + fp->fsize = fp->fptr; /* Update file size if needed */ + } + + fp->flag |= FA__WRITTEN; /* Set file changed flag */ + + LEAVE_FF( fp->fs, FR_OK ); +} + +/*-----------------------------------------------------------------------*/ + +/* Synchronize the File Object */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_sync( FIL *fp /* Pointer to the file object */ ) +{ + FRESULT res; + DWORD tim; + BYTE *dir; + + res = validate( fp->fs, fp->id ); /* Check validity of the object */ + if( res == FR_OK ) + { + if( fp->flag & FA__WRITTEN ) + { /* Has the file been written? */ + #if !_FS_TINY /* Write-back dirty buffer */ + if( fp->flag & FA__DIRTY ) + { + if( disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK ) + { + LEAVE_FF( fp->fs, FR_DISK_ERR ); + } + + fp->flag &= ~FA__DIRTY; + } + + #endif + + /* Update the directory entry */ + res = move_window( fp->fs, fp->dir_sect ); + if( res == FR_OK ) + { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ + ST_DWORD( dir + DIR_FileSize, fp->fsize ); /* Update file size */ + ST_WORD( dir + DIR_FstClusLO, fp->org_clust ); /* Update start cluster */ + ST_WORD( dir + DIR_FstClusHI, fp->org_clust >> 16 ); + tim = get_fattime(); /* Updated time */ + ST_DWORD( dir + DIR_WrtTime, tim ); + fp->flag &= ~FA__WRITTEN; + fp->fs->wflag = 1; + res = sync( fp->fs ); + } + } + } + + LEAVE_FF( fp->fs, res ); +} + +#endif /* !_FS_READONLY */ + +/*-----------------------------------------------------------------------*/ + +/* Close File */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_close( FIL *fp /* Pointer to the file object to be closed */ ) +{ + FRESULT res; + + #if _FS_READONLY + res = validate( fp->fs, fp->id ); + if( res == FR_OK ) + { + fp->fs = NULL; + } + + LEAVE_FF( fp->fs, res ); + #else + res = f_sync( fp ); + if( res == FR_OK ) + { + fp->fs = NULL; + } + + return res; + #endif +} + +/*-----------------------------------------------------------------------*/ + +/* Change Current Drive/Directory */ + +/*-----------------------------------------------------------------------*/ +#if _FS_RPATH +FRESULT f_chdrive( BYTE drv /* Drive number */ ) +{ + if( drv >= _DRIVES ) + { + return FR_INVALID_DRIVE; + } + + Drive = drv; + + return FR_OK; +} + +FRESULT f_chdir( const XCHAR *path /* Pointer to the directory path */ ) +{ + FRESULT res; + DIR dj; + NAMEBUF( sfn, lfn ); + + BYTE *dir; + + res = chk_mounted( &path, &dj.fs, 0 ); + if( res == FR_OK ) + { + INITBUF( dj, sfn, lfn ); + res = follow_path( &dj, path ); /* Follow the file path */ + if( res == FR_OK ) + { /* Follow completed */ + dir = dj.dir; /* Pointer to the entry */ + if( !dir ) + { + dj.fs->cdir = 0; /* No entry (root dir) */ + } + else + { + if( dir[DIR_Attr] & AM_DIR ) + { /* Reached to the dir */ + dj.fs->cdir = ( (DWORD) LD_WORD(dir + DIR_FstClusHI) << 16 ) | LD_WORD( dir + DIR_FstClusLO ); + } + else + { + res = FR_NO_PATH; /* Could not reach the dir (it is a file) */ + } + } + } + + if( res == FR_NO_FILE ) + { + res = FR_NO_PATH; + } + } + + LEAVE_FF( dj.fs, res ); +} + +#endif +#if _FS_MINIMIZE <= 2 + +/*-----------------------------------------------------------------------*/ + +/* Seek File R/W Pointer */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_lseek( FIL *fp, /* Pointer to the file object */ DWORD ofs /* File pointer from top of file */ ) +{ + FRESULT res; + DWORD clst, bcs, nsect, ifptr; + + res = validate( fp->fs, fp->id ); /* Check validity of the object */ + if( res != FR_OK ) + { + LEAVE_FF( fp->fs, res ); + } + + if( fp->flag & FA__ERROR ) + { /* Check abort flag */ + LEAVE_FF( fp->fs, FR_INT_ERR ); + } + + if( ofs > fp->fsize /* In read-only mode, clip offset with the file size */ + #if !_FS_READONLY + && !(fp->flag & FA_WRITE) + #endif + ) + { + ofs = fp->fsize; + } + + ifptr = fp->fptr; + fp->fptr = nsect = 0; + fp->csect = 255; + if( ofs > 0 ) + { + bcs = ( DWORD ) fp->fs->csize * SS( fp->fs ); /* Cluster size (byte) */ + if( ifptr > 0 && (ofs - 1) / bcs >= (ifptr - 1) / bcs ) + { /* When seek to same or following cluster, */ + fp->fptr = ( ifptr - 1 ) &~( bcs - 1 ); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->curr_clust; + } + else + { /* When seek to back cluster, */ + clst = fp->org_clust; /* start from the first cluster */ + #if !_FS_READONLY + if( clst == 0 ) + { /* If no cluster chain, create a new chain */ + clst = create_chain( fp->fs, 0 ); + if( clst == 1 ) + { + ABORT( fp->fs, FR_INT_ERR ); + } + + if( clst == 0xFFFFFFFF ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + + fp->org_clust = clst; + } + + #endif + fp->curr_clust = clst; + } + + if( clst != 0 ) + { + while( ofs > bcs ) + { /* Cluster following loop */ + #if !_FS_READONLY + if( fp->flag & FA_WRITE ) + { /* Check if in write mode or not */ + clst = create_chain( fp->fs, clst ); /* Force streached if in write mode */ + if( clst == 0 ) + { /* When disk gets full, clip file size */ + ofs = bcs; + break; + } + } + else + #endif + clst = get_fat( fp->fs, clst ); /* Follow cluster chain if not in write mode */ + if( clst == 0xFFFFFFFF ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + + if( clst <= 1 || clst >= fp->fs->max_clust ) + { + ABORT( fp->fs, FR_INT_ERR ); + } + + fp->curr_clust = clst; + fp->fptr += bcs; + ofs -= bcs; + } + + fp->fptr += ofs; + fp->csect = ( BYTE ) ( ofs / SS(fp->fs) ); /* Sector offset in the cluster */ + if( ofs % SS(fp->fs) ) + { + nsect = clust2sect( fp->fs, clst ); /* Current sector */ + if( !nsect ) + { + ABORT( fp->fs, FR_INT_ERR ); + } + + nsect += fp->csect; + fp->csect++; + } + } + } + + if( fp->fptr % SS(fp->fs) && nsect != fp->dsect ) + { + #if !_FS_TINY + #if !_FS_READONLY + if( fp->flag & FA__DIRTY ) + { /* Write-back dirty buffer if needed */ + if( disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + + fp->flag &= ~FA__DIRTY; + } + + #endif + if( disk_read(fp->fs->drive, fp->buf, nsect, 1) != RES_OK ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + + #endif + fp->dsect = nsect; + } + + #if !_FS_READONLY + if( fp->fptr > fp->fsize ) + { /* Set changed flag if the file size is extended */ + fp->fsize = fp->fptr; + fp->flag |= FA__WRITTEN; + } + + #endif + LEAVE_FF( fp->fs, res ); +} + + #if _FS_MINIMIZE <= 1 + +/*-----------------------------------------------------------------------*/ + +/* Create a Directroy Object */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_opendir( DIR *dj, /* Pointer to directory object to create */ const XCHAR *path /* Pointer to the directory path */ ) +{ + FRESULT res; + NAMEBUF( sfn, lfn ); + + BYTE *dir; + + res = chk_mounted( &path, &dj->fs, 0 ); + if( res == FR_OK ) + { + INITBUF( (*dj), sfn, lfn ); + res = follow_path( dj, path ); /* Follow the path to the directory */ + if( res == FR_OK ) + { /* Follow completed */ + dir = dj->dir; + if( dir ) + { /* It is not the root dir */ + if( dir[DIR_Attr] & AM_DIR ) + { /* The object is a directory */ + dj->sclust = ( (DWORD) LD_WORD(dir + DIR_FstClusHI) << 16 ) | LD_WORD( dir + DIR_FstClusLO ); + } + else + { /* The object is not a directory */ + res = FR_NO_PATH; + } + } + + if( res == FR_OK ) + { + dj->id = dj->fs->id; + res = dir_seek( dj, 0 ); /* Rewind dir */ + } + } + + if( res == FR_NO_FILE ) + { + res = FR_NO_PATH; + } + } + + LEAVE_FF( dj->fs, res ); +} + +/*-----------------------------------------------------------------------*/ + +/* Read Directory Entry in Sequense */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_readdir( DIR *dj, /* Pointer to the open directory object */ FILINFO *fno /* Pointer to file information to return */ ) +{ + FRESULT res; + NAMEBUF( sfn, lfn ); + + res = validate( dj->fs, dj->id ); /* Check validity of the object */ + if( res == FR_OK ) + { + INITBUF( (*dj), sfn, lfn ); + if( !fno ) + { + res = dir_seek( dj, 0 ); + } + else + { + res = dir_read( dj ); + if( res == FR_NO_FILE ) + { + dj->sect = 0; + res = FR_OK; + } + + if( res == FR_OK ) + { /* A valid entry is found */ + get_fileinfo( dj, fno ); /* Get the object information */ + res = dir_next( dj, FALSE ); /* Increment index for next */ + if( res == FR_NO_FILE ) + { + dj->sect = 0; + res = FR_OK; + } + } + } + } + + LEAVE_FF( dj->fs, res ); +} + + #if _FS_MINIMIZE == 0 + +/*-----------------------------------------------------------------------*/ + +/* Get File Status */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_stat( const XCHAR *path, /* Pointer to the file path */ FILINFO *fno /* Pointer to file information to return */ ) +{ + FRESULT res; + DIR dj; + NAMEBUF( sfn, lfn ); + + res = chk_mounted( &path, &dj.fs, 0 ); + if( res == FR_OK ) + { + INITBUF( dj, sfn, lfn ); + res = follow_path( &dj, path ); /* Follow the file path */ + if( res == FR_OK ) + { /* Follwo completed */ + if( dj.dir ) + { /* Found an object */ + get_fileinfo( &dj, fno ); + } + else + { /* It is root dir */ + res = FR_INVALID_NAME; + } + } + } + + LEAVE_FF( dj.fs, res ); +} + + #if !_FS_READONLY + +/*-----------------------------------------------------------------------*/ + +/* Get Number of Free Clusters */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_getfree + ( + const XCHAR *path, /* Pointer to the logical drive number (root dir) */ + DWORD *nclst, /* Pointer to the variable to return number of free clusters */ + FATFS **fatfs /* Pointer to pointer to corresponding file system object to return */ + ) +{ + FRESULT res; + DWORD n, clst, sect, stat; + UINT i; + BYTE fat, *p; + + /* Get drive number */ + res = chk_mounted( &path, fatfs, 0 ); + if( res != FR_OK ) + { + LEAVE_FF( *fatfs, res ); + } + + /* If number of free cluster is valid, return it without cluster scan. */ + if( (*fatfs)->free_clust <= (*fatfs)->max_clust - 2 ) + { + *nclst = ( *fatfs )->free_clust; + LEAVE_FF( *fatfs, FR_OK ); + } + + /* Get number of free clusters */ + fat = ( *fatfs )->fs_type; + n = 0; + if( fat == FS_FAT12 ) + { + clst = 2; + do + { + stat = get_fat( *fatfs, clst ); + if( stat == 0xFFFFFFFF ) + { + LEAVE_FF( *fatfs, FR_DISK_ERR ); + } + + if( stat == 1 ) + { + LEAVE_FF( *fatfs, FR_INT_ERR ); + } + + if( stat == 0 ) + { + n++; + } + } while( ++clst < (*fatfs)->max_clust ); + } + else + { + clst = ( *fatfs )->max_clust; + sect = ( *fatfs )->fatbase; + i = 0; + p = 0; + do + { + if( !i ) + { + res = move_window( *fatfs, sect++ ); + if( res != FR_OK ) + { + LEAVE_FF( *fatfs, res ); + } + + p = ( *fatfs )->win; + i = SS( *fatfs ); + } + + if( fat == FS_FAT16 ) + { + if( LD_WORD(p) == 0 ) + { + n++; + } + + p += 2; + i -= 2; + } + else + { + if( (LD_DWORD(p) & 0x0FFFFFFF) == 0 ) + { + n++; + } + + p += 4; + i -= 4; + } + } while( --clst ); + } + + ( *fatfs )->free_clust = n; + if( fat == FS_FAT32 ) + { + ( *fatfs )->fsi_flag = 1; + } + + *nclst = n; + + LEAVE_FF( *fatfs, FR_OK ); +} + +/*-----------------------------------------------------------------------*/ + +/* Truncate File */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_truncate( FIL *fp /* Pointer to the file object */ ) +{ + FRESULT res; + DWORD ncl; + + res = validate( fp->fs, fp->id ); /* Check validity of the object */ + if( res != FR_OK ) + { + LEAVE_FF( fp->fs, res ); + } + + if( fp->flag & FA__ERROR ) + { /* Check abort flag */ + LEAVE_FF( fp->fs, FR_INT_ERR ); + } + + if( !(fp->flag & FA_WRITE) ) + { /* Check access mode */ + LEAVE_FF( fp->fs, FR_DENIED ); + } + + if( fp->fsize > fp->fptr ) + { + fp->fsize = fp->fptr; /* Set file size to current R/W point */ + fp->flag |= FA__WRITTEN; + if( fp->fptr == 0 ) + { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain( fp->fs, fp->org_clust ); + fp->org_clust = 0; + } + else + { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_fat( fp->fs, fp->curr_clust ); + res = FR_OK; + if( ncl == 0xFFFFFFFF ) + { + res = FR_DISK_ERR; + } + + if( ncl == 1 ) + { + res = FR_INT_ERR; + } + + if( res == FR_OK && ncl < fp->fs->max_clust ) + { + res = put_fat( fp->fs, fp->curr_clust, 0x0FFFFFFF ); + if( res == FR_OK ) + { + res = remove_chain( fp->fs, ncl ); + } + } + } + } + + if( res != FR_OK ) + { + fp->flag |= FA__ERROR; + } + + LEAVE_FF( fp->fs, res ); +} + +/*-----------------------------------------------------------------------*/ + +/* Delete a File or Directory */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_unlink( const XCHAR *path /* Pointer to the file or directory path */ ) +{ + FRESULT res; + DIR dj, sdj; + NAMEBUF( sfn, lfn ); + + BYTE *dir; + DWORD dclst; + + res = chk_mounted( &path, &dj.fs, 1 ); + if( res != FR_OK ) + { + LEAVE_FF( dj.fs, res ); + } + + INITBUF( dj, sfn, lfn ); + res = follow_path( &dj, path ); /* Follow the file path */ + if( _FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT) ) + { + res = FR_INVALID_NAME; + } + + if( res != FR_OK ) + { + LEAVE_FF( dj.fs, res ); /* Follow failed */ + } + + dir = dj.dir; + if( !dir ) + { /* Is it the root directory? */ + LEAVE_FF( dj.fs, FR_INVALID_NAME ); + } + + if( dir[DIR_Attr] & AM_RDO ) + { /* Is it a R/O object? */ + LEAVE_FF( dj.fs, FR_DENIED ); + } + + dclst = ( (DWORD) LD_WORD(dir + DIR_FstClusHI) << 16 ) | LD_WORD( dir + DIR_FstClusLO ); + + if( dir[DIR_Attr] & AM_DIR ) + { /* It is a sub-directory */ + if( dclst < 2 ) + { + LEAVE_FF( dj.fs, FR_INT_ERR ); + } + + mem_cpy( &sdj, &dj, sizeof(DIR) ); /* Check if the sub-dir is empty or not */ + sdj.sclust = dclst; + res = dir_seek( &sdj, 2 ); + if( res != FR_OK ) + { + LEAVE_FF( dj.fs, res ); + } + + res = dir_read( &sdj ); + if( res == FR_OK ) + { + res = FR_DENIED; /* Not empty sub-dir */ + } + + if( res != FR_NO_FILE ) + { + LEAVE_FF( dj.fs, res ); + } + } + + res = dir_remove( &dj ); /* Remove directory entry */ + if( res == FR_OK ) + { + if( dclst ) + { + res = remove_chain( dj.fs, dclst ); /* Remove the cluster chain */ + } + + if( res == FR_OK ) + { + res = sync( dj.fs ); + } + } + + LEAVE_FF( dj.fs, res ); +} + +/*-----------------------------------------------------------------------*/ + +/* Create a Directory */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_mkdir( const XCHAR *path /* Pointer to the directory path */ ) +{ + FRESULT res; + DIR dj; + NAMEBUF( sfn, lfn ); + + BYTE *dir, n; + DWORD dsect, dclst, pclst, tim; + + res = chk_mounted( &path, &dj.fs, 1 ); + if( res != FR_OK ) + { + LEAVE_FF( dj.fs, res ); + } + + INITBUF( dj, sfn, lfn ); + res = follow_path( &dj, path ); /* Follow the file path */ + if( res == FR_OK ) + { + res = FR_EXIST; /* Any file or directory is already existing */ + } + + if( _FS_RPATH && res == FR_NO_FILE && (dj.fn[NS] & NS_DOT) ) + { + res = FR_INVALID_NAME; + } + + if( res != FR_NO_FILE ) + { /* Any error occured */ + LEAVE_FF( dj.fs, res ); + } + + dclst = create_chain( dj.fs, 0 ); /* Allocate a new cluster for new directory table */ + res = FR_OK; + if( dclst == 0 ) + { + res = FR_DENIED; + } + + if( dclst == 1 ) + { + res = FR_INT_ERR; + } + + if( dclst == 0xFFFFFFFF ) + { + res = FR_DISK_ERR; + } + + if( res == FR_OK ) + { + res = move_window( dj.fs, 0 ); + } + + if( res != FR_OK ) + { + LEAVE_FF( dj.fs, res ); + } + + dsect = clust2sect( dj.fs, dclst ); + + dir = dj.fs->win; /* Initialize the new directory table */ + mem_set( dir, 0, SS(dj.fs) ); + mem_set( dir + DIR_Name, ' ', 8 + 3 ); /* Create "." entry */ + dir[DIR_Name] = '.'; + dir[DIR_Attr] = AM_DIR; + tim = get_fattime(); + ST_DWORD( dir + DIR_WrtTime, tim ); + ST_WORD( dir + DIR_FstClusLO, dclst ); + ST_WORD( dir + DIR_FstClusHI, dclst >> 16 ); + mem_cpy( dir + 32, dir, 32 ); /* Create ".." entry */ + dir[33] = '.'; + pclst = dj.sclust; + if( dj.fs->fs_type == FS_FAT32 && pclst == dj.fs->dirbase ) + { + pclst = 0; + } + + ST_WORD( dir + 32 + DIR_FstClusLO, pclst ); + ST_WORD( dir + 32 + DIR_FstClusHI, pclst >> 16 ); + for( n = 0; n < dj.fs->csize; n++ ) + { /* Write dot entries and clear left sectors */ + dj.fs->winsect = dsect++; + dj.fs->wflag = 1; + res = move_window( dj.fs, 0 ); + if( res ) + { + LEAVE_FF( dj.fs, res ); + } + + mem_set( dir, 0, SS(dj.fs) ); + } + + res = dir_register( &dj ); + if( res != FR_OK ) + { + remove_chain( dj.fs, dclst ); + } + else + { + dir = dj.dir; + dir[DIR_Attr] = AM_DIR; /* Attribute */ + ST_DWORD( dir + DIR_WrtTime, tim ); /* Crated time */ + ST_WORD( dir + DIR_FstClusLO, dclst ); /* Table start cluster */ + ST_WORD( dir + DIR_FstClusHI, dclst >> 16 ); + dj.fs->wflag = 1; + res = sync( dj.fs ); + } + + LEAVE_FF( dj.fs, res ); +} + +/*-----------------------------------------------------------------------*/ + +/* Change File Attribute */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_chmod( const XCHAR *path, /* Pointer to the file path */ BYTE value, /* Attribute bits */ BYTE mask /* Attribute mask to change */ ) +{ + FRESULT res; + DIR dj; + NAMEBUF( sfn, lfn ); + + BYTE *dir; + + res = chk_mounted( &path, &dj.fs, 1 ); + if( res == FR_OK ) + { + INITBUF( dj, sfn, lfn ); + res = follow_path( &dj, path ); /* Follow the file path */ + if( _FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT) ) + { + res = FR_INVALID_NAME; + } + + if( res == FR_OK ) + { + dir = dj.dir; + if( !dir ) + { /* Is it a root directory? */ + res = FR_INVALID_NAME; + } + else + { /* File or sub directory */ + mask &= AM_RDO | AM_HID | AM_SYS | AM_ARC; /* Valid attribute mask */ + dir[DIR_Attr] = ( value & mask ) | ( dir[DIR_Attr] & (BYTE)~mask ); /* Apply attribute change */ + dj.fs->wflag = 1; + res = sync( dj.fs ); + } + } + } + + LEAVE_FF( dj.fs, res ); +} + +/*-----------------------------------------------------------------------*/ + +/* Change Timestamp */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_utime( const XCHAR *path, /* Pointer to the file/directory name */ const FILINFO *fno /* Pointer to the timestamp to be set */ ) +{ + FRESULT res; + DIR dj; + NAMEBUF( sfn, lfn ); + + BYTE *dir; + + res = chk_mounted( &path, &dj.fs, 1 ); + if( res == FR_OK ) + { + INITBUF( dj, sfn, lfn ); + res = follow_path( &dj, path ); /* Follow the file path */ + if( _FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT) ) + { + res = FR_INVALID_NAME; + } + + if( res == FR_OK ) + { + dir = dj.dir; + if( !dir ) + { /* Root directory */ + res = FR_INVALID_NAME; + } + else + { /* File or sub-directory */ + ST_WORD( dir + DIR_WrtTime, fno->ftime ); + ST_WORD( dir + DIR_WrtDate, fno->fdate ); + dj.fs->wflag = 1; + res = sync( dj.fs ); + } + } + } + + LEAVE_FF( dj.fs, res ); +} + +/*-----------------------------------------------------------------------*/ + +/* Rename File/Directory */ + +/*-----------------------------------------------------------------------*/ +FRESULT f_rename( const XCHAR *path_old, /* Pointer to the old name */ const XCHAR *path_new /* Pointer to the new name */ ) +{ + FRESULT res; + DIR dj_old, dj_new; + NAMEBUF( sfn, lfn ); + + BYTE buf[21], *dir; + DWORD dw; + + INITBUF( dj_old, sfn, lfn ); + res = chk_mounted( &path_old, &dj_old.fs, 1 ); + if( res == FR_OK ) + { + dj_new.fs = dj_old.fs; + res = follow_path( &dj_old, path_old ); /* Check old object */ + if( _FS_RPATH && res == FR_OK && (dj_old.fn[NS] & NS_DOT) ) + { + res = FR_INVALID_NAME; + } + } + + if( res != FR_OK ) + { + LEAVE_FF( dj_old.fs, res ); /* The old object is not found */ + } + + if( !dj_old.dir ) + { + LEAVE_FF( dj_old.fs, FR_NO_FILE ); /* Is root dir? */ + } + + mem_cpy( buf, dj_old.dir + DIR_Attr, 21 ); /* Save the object information */ + + mem_cpy( &dj_new, &dj_old, sizeof(DIR) ); + res = follow_path( &dj_new, path_new ); /* Check new object */ + if( res == FR_OK ) + { + res = FR_EXIST; /* The new object name is already existing */ + } + + if( res == FR_NO_FILE ) + { /* Is it a valid path and no name collision? */ + res = dir_register( &dj_new ); /* Register the new object */ + if( res == FR_OK ) + { + dir = dj_new.dir; /* Copy object information into new entry */ + mem_cpy( dir + 13, buf + 2, 19 ); + dir[DIR_Attr] = buf[0] | AM_ARC; + dj_old.fs->wflag = 1; + if( dir[DIR_Attr] & AM_DIR ) + { /* Update .. entry in the directory if needed */ + dw = clust2sect( dj_new.fs, (DWORD) LD_WORD(dir + DIR_FstClusHI) | LD_WORD(dir + DIR_FstClusLO) ); + if( !dw ) + { + res = FR_INT_ERR; + } + else + { + res = move_window( dj_new.fs, dw ); + dir = dj_new.fs->win + 32; + if( res == FR_OK && dir[1] == '.' ) + { + dw = ( dj_new.fs->fs_type == FS_FAT32 && dj_new.sclust == dj_new.fs->dirbase ) ? 0 : dj_new.sclust; + ST_WORD( dir + DIR_FstClusLO, dw ); + ST_WORD( dir + DIR_FstClusHI, dw >> 16 ); + dj_new.fs->wflag = 1; + } + } + } + + if( res == FR_OK ) + { + res = dir_remove( &dj_old ); /* Remove old entry */ + if( res == FR_OK ) + { + res = sync( dj_old.fs ); + } + } + } + } + + LEAVE_FF( dj_old.fs, res ); +} + + #endif /* !_FS_READONLY */ + #endif /* _FS_MINIMIZE == 0 */ + #endif /* _FS_MINIMIZE <= 1 */ +#endif /* _FS_MINIMIZE <= 2 */ + +/*-----------------------------------------------------------------------*/ + +/* Forward data to the stream directly (Available on only _FS_TINY cfg) */ + +/*-----------------------------------------------------------------------*/ +#if _USE_FORWARD && _FS_TINY +FRESULT f_forward + ( + FIL *fp, /* Pointer to the file object */ + UINT (*func) ( const BYTE *, UINT ), /* Pointer to the streaming function */ + UINT btr, /* Number of bytes to forward */ + UINT *bf /* Pointer to number of bytes forwarded */ + ) +{ + FRESULT res; + DWORD remain, clst, sect; + UINT rcnt; + + *bf = 0; + + res = validate( fp->fs, fp->id ); /* Check validity of the object */ + if( res != FR_OK ) + { + LEAVE_FF( fp->fs, res ); + } + + if( fp->flag & FA__ERROR ) + { /* Check error flag */ + LEAVE_FF( fp->fs, FR_INT_ERR ); + } + + if( !(fp->flag & FA_READ) ) + { /* Check access mode */ + LEAVE_FF( fp->fs, FR_DENIED ); + } + + remain = fp->fsize - fp->fptr; + if( btr > remain ) + { + btr = ( UINT ) remain; /* Truncate btr by remaining bytes */ + } + + for + ( + ; + btr && (*func) (NULL, 0); /* Repeat until all data transferred or stream becomes busy */ + fp->fptr += rcnt, *bf += rcnt, btr -= rcnt + ) + { + if( (fp->fptr % SS(fp->fs)) == 0 ) + { /* On the sector boundary? */ + if( fp->csect >= fp->fs->csize ) + { /* On the cluster boundary? */ + clst = ( fp->fptr == 0 ) ? /* On the top of the file? */ + fp->org_clust : get_fat( fp->fs, fp->curr_clust ); + if( clst <= 1 ) + { + ABORT( fp->fs, FR_INT_ERR ); + } + + if( clst == 0xFFFFFFFF ) + { + ABORT( fp->fs, FR_DISK_ERR ); + } + + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector address in the cluster */ + } + + fp->csect++; /* Next sector address in the cluster */ + } + + sect = clust2sect( fp->fs, fp->curr_clust ); /* Get current data sector */ + if( !sect ) + { + ABORT( fp->fs, FR_INT_ERR ); + } + + sect += fp->csect - 1; + if( move_window(fp->fs, sect) ) + { /* Move sector window */ + ABORT( fp->fs, FR_DISK_ERR ); + } + + fp->dsect = sect; + rcnt = SS( fp->fs ) - ( WORD ) ( fp->fptr % SS(fp->fs) ); /* Forward data from sector window */ + if( rcnt > btr ) + { + rcnt = btr; + } + + rcnt = ( *func ) ( &fp->fs->win[(WORD) fp->fptr % SS(fp->fs)], rcnt ); + if( !rcnt ) + { + ABORT( fp->fs, FR_INT_ERR ); + } + } + + LEAVE_FF( fp->fs, FR_OK ); +} + +#endif /* _USE_FORWARD */ + +#if _USE_MKFS && !_FS_READONLY + +/*-----------------------------------------------------------------------*/ + +/* Create File System on the Drive */ + +/*-----------------------------------------------------------------------*/ + #define N_ROOTDIR 512 /* Multiple of 32 and <= 2048 */ + #define N_FATS 1 /* 1 or 2 */ + #define MAX_SECTOR 131072000UL /* Maximum partition size */ + #define MIN_SECTOR 2000UL /* Minimum partition size */ + +FRESULT f_mkfs + ( + BYTE drv, /* Logical drive number */ + BYTE partition, /* Partitioning rule 0:FDISK, 1:SFD */ + WORD allocsize /* Allocation unit size [bytes] */ + ) +{ + static const DWORD sstbl[] = { 2048000, 1024000, 512000, 256000, 128000, 64000, 32000, 16000, 8000, 4000, 0 }; + static const WORD cstbl[] = { 32768, 16384, 8192, 4096, 2048, 16384, 8192, 4096, 2048, 1024, 512 }; + BYTE fmt, m, *tbl; + DWORD b_part, b_fat, b_dir, b_data; /* Area offset (LBA) */ + DWORD n_part, n_rsv, n_fat, n_dir; /* Area size */ + DWORD n_clst, d, n; + WORD as; + FATFS *fs; + DSTATUS stat; + + /* Check validity of the parameters */ + if( drv >= _DRIVES ) + { + return FR_INVALID_DRIVE; + } + + if( partition >= 2 ) + { + return FR_MKFS_ABORTED; + } + + /* Check mounted drive and clear work area */ + fs = FatFs[drv]; + if( !fs ) + { + return FR_NOT_ENABLED; + } + + fs->fs_type = 0; + drv = LD2PD( drv ); + + /* Get disk statics */ + stat = disk_initialize( drv ); + if( stat & STA_NOINIT ) + { + return FR_NOT_READY; + } + + if( stat & STA_PROTECT ) + { + return FR_WRITE_PROTECTED; + } + + #if _MAX_SS != 512 /* Get disk sector size */ + if( disk_ioctl(drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK || SS(fs) > _MAX_SS ) + { + return FR_MKFS_ABORTED; + } + + #endif + if( disk_ioctl(drv, GET_SECTOR_COUNT, &n_part) != RES_OK || n_part < MIN_SECTOR ) + { + return FR_MKFS_ABORTED; + } + + if( n_part > MAX_SECTOR ) + { + n_part = MAX_SECTOR; + } + + b_part = ( !partition ) ? 63 : 0; /* Boot sector */ + n_part -= b_part; + for( d = 512; d <= 32768U && d != allocsize; d <<= 1 ); + + /* Check validity of the allocation unit size */ + if( d != allocsize ) + { + allocsize = 0; + } + + if( !allocsize ) + { /* Auto selection of cluster size */ + d = n_part; + for( as = SS(fs); as > 512U; as >>= 1 ) + { + d >>= 1; + } + + for( n = 0; d < sstbl[n]; n++ ); + allocsize = cstbl[n]; + } + + if( allocsize < SS(fs) ) + { + allocsize = SS( fs ); + } + + allocsize /= SS( fs ); /* Number of sectors per cluster */ + + /* Pre-compute number of clusters and FAT type */ + n_clst = n_part / allocsize; + fmt = FS_FAT12; + if( n_clst >= 0xFF5 ) + { + fmt = FS_FAT16; + } + + if( n_clst >= 0xFFF5 ) + { + fmt = FS_FAT32; + } + + /* Determine offset and size of FAT structure */ + switch( fmt ) + { + case FS_FAT12: + n_fat = ( (n_clst * 3 + 1) / 2 + 3 + SS(fs) - 1 ) / SS( fs ); + n_rsv = 1 + partition; + n_dir = N_ROOTDIR * 32 / SS( fs ); + break; + + case FS_FAT16: + n_fat = ( (n_clst * 2) + 4 + SS(fs) - 1 ) / SS( fs ); + n_rsv = 1 + partition; + n_dir = N_ROOTDIR * 32 / SS( fs ); + break; + + default: + n_fat = ( (n_clst * 4) + 8 + SS(fs) - 1 ) / SS( fs ); + n_rsv = 33 - partition; + n_dir = 0; + } + + b_fat = b_part + n_rsv; /* FATs start sector */ + b_dir = b_fat + n_fat * N_FATS; /* Directory start sector */ + b_data = b_dir + n_dir; /* Data start sector */ + + /* Align data start sector to erase block boundary (for flash memory media) */ + if( disk_ioctl(drv, GET_BLOCK_SIZE, &n) != RES_OK ) + { + return FR_MKFS_ABORTED; + } + + n = ( b_data + n - 1 ) &~( n - 1 ); + n_fat += ( n - b_data ) / N_FATS; + + /* b_dir and b_data are no longer used below */ + + /* Determine number of cluster and final check of validity of the FAT type */ + n_clst = ( n_part - n_rsv - n_fat * N_FATS - n_dir ) / allocsize; + if( (fmt == FS_FAT16 && n_clst < 0xFF5) || (fmt == FS_FAT32 && n_clst < 0xFFF5) ) + { + return FR_MKFS_ABORTED; + } + + /* Create partition table if needed */ + if( !partition ) + { + DWORD n_disk = b_part + n_part; + + mem_set( fs->win, 0, SS(fs) ); + tbl = fs->win + MBR_Table; + ST_DWORD( tbl, 0x00010180 ); /* Partition start in CHS */ + if( n_disk < 63UL * 255 * 1024 ) + { /* Partition end in CHS */ + n_disk = n_disk / 63 / 255; + tbl[7] = ( BYTE ) n_disk; + tbl[6] = ( BYTE ) ( (n_disk >> 2) | 63 ); + } + else + { + ST_WORD( &tbl[6], 0xFFFF ); + } + + tbl[5] = 254; + if( fmt != FS_FAT32 ) + { /* System ID */ + tbl[4] = ( n_part < 0x10000 ) ? 0x04 : 0x06; + } + else + { + tbl[4] = 0x0c; + } + + ST_DWORD( tbl + 8, 63 ); /* Partition start in LBA */ + ST_DWORD( tbl + 12, n_part ); /* Partition size in LBA */ + ST_WORD( tbl + 64, 0xAA55 ); /* Signature */ + if( disk_write(drv, fs->win, 0, 1) != RES_OK ) + { + return FR_DISK_ERR; + } + + partition = 0xF8; + } + else + { + partition = 0xF0; + } + + /* Create boot record */ + tbl = fs->win; /* Clear buffer */ + mem_set( tbl, 0, SS(fs) ); + ST_DWORD( tbl + BS_jmpBoot, 0x90FEEB ); /* Boot code (jmp $, nop) */ + ST_WORD( tbl + BPB_BytsPerSec, SS(fs) ); /* Sector size */ + tbl[BPB_SecPerClus] = ( BYTE ) allocsize; /* Sectors per cluster */ + ST_WORD( tbl + BPB_RsvdSecCnt, n_rsv ); /* Reserved sectors */ + tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ + ST_WORD( tbl + BPB_RootEntCnt, SS(fs) / 32 * n_dir ); /* Number of rootdir entries */ + if( n_part < 0x10000 ) + { /* Number of total sectors */ + ST_WORD( tbl + BPB_TotSec16, n_part ); + } + else + { + ST_DWORD( tbl + BPB_TotSec32, n_part ); + } + + tbl[BPB_Media] = partition; /* Media descripter */ + ST_WORD( tbl + BPB_SecPerTrk, 63 ); /* Number of sectors per track */ + ST_WORD( tbl + BPB_NumHeads, 255 ); /* Number of heads */ + ST_DWORD( tbl + BPB_HiddSec, b_part ); /* Hidden sectors */ + n = get_fattime(); /* Use current time as a VSN */ + if( fmt != FS_FAT32 ) + { + ST_DWORD( tbl + BS_VolID, n ); /* Volume serial number */ + ST_WORD( tbl + BPB_FATSz16, n_fat ); /* Number of secters per FAT */ + tbl[BS_DrvNum] = 0x80; /* Drive number */ + tbl[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy( tbl + BS_VolLab, "NO NAME FAT ", 19 ); /* Volume lavel, FAT signature */ + } + else + { + ST_DWORD( tbl + BS_VolID32, n ); /* Volume serial number */ + ST_DWORD( tbl + BPB_FATSz32, n_fat ); /* Number of secters per FAT */ + ST_DWORD( tbl + BPB_RootClus, 2 ); /* Root directory cluster (2) */ + ST_WORD( tbl + BPB_FSInfo, 1 ); /* FSInfo record offset (bs+1) */ + ST_WORD( tbl + BPB_BkBootSec, 6 ); /* Backup boot record offset (bs+6) */ + tbl[BS_DrvNum32] = 0x80; /* Drive number */ + tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy( tbl + BS_VolLab32, "NO NAME FAT32 ", 19 ); /* Volume lavel, FAT signature */ + } + + ST_WORD( tbl + BS_55AA, 0xAA55 ); /* Signature */ + if( SS(fs) > 512U ) + { + ST_WORD( tbl + SS(fs) - 2, 0xAA55 ); + } + + if( disk_write(drv, tbl, b_part + 0, 1) != RES_OK ) + { + return FR_DISK_ERR; + } + + if( fmt == FS_FAT32 ) + { + disk_write( drv, tbl, b_part + 6, 1 ); + } + + /* Initialize FAT area */ + for( m = 0; m < N_FATS; m++ ) + { + mem_set( tbl, 0, SS(fs) ); /* 1st sector of the FAT */ + if( fmt != FS_FAT32 ) + { + n = ( fmt == FS_FAT12 ) ? 0x00FFFF00 : 0xFFFFFF00; + n |= partition; + ST_DWORD( tbl, n ); /* Reserve cluster #0-1 (FAT12/16) */ + } + else + { + ST_DWORD( tbl + 0, 0xFFFFFFF8 ); /* Reserve cluster #0-1 (FAT32) */ + ST_DWORD( tbl + 4, 0xFFFFFFFF ); + ST_DWORD( tbl + 8, 0x0FFFFFFF ); /* Reserve cluster #2 for root dir */ + } + + if( disk_write(drv, tbl, b_fat++, 1) != RES_OK ) + { + return FR_DISK_ERR; + } + + mem_set( tbl, 0, SS(fs) ); /* Following FAT entries are filled by zero */ + for( n = 1; n < n_fat; n++ ) + { + if( disk_write(drv, tbl, b_fat++, 1) != RES_OK ) + { + return FR_DISK_ERR; + } + } + } + + /* Initialize Root directory */ + m = ( BYTE ) ( (fmt == FS_FAT32) ? allocsize : n_dir ); + do + { + if( disk_write(drv, tbl, b_fat++, 1) != RES_OK ) + { + return FR_DISK_ERR; + } + } while( --m ); + + /* Create FSInfo record if needed */ + if( fmt == FS_FAT32 ) + { + ST_WORD( tbl + BS_55AA, 0xAA55 ); + ST_DWORD( tbl + FSI_LeadSig, 0x41615252 ); + ST_DWORD( tbl + FSI_StrucSig, 0x61417272 ); + ST_DWORD( tbl + FSI_Free_Count, n_clst - 1 ); + ST_DWORD( tbl + FSI_Nxt_Free, 0xFFFFFFFF ); + disk_write( drv, tbl, b_part + 1, 1 ); + disk_write( drv, tbl, b_part + 7, 1 ); + } + + return( disk_ioctl(drv, CTRL_SYNC, ( void * ) NULL) == RES_OK ) ? FR_OK : FR_DISK_ERR; +} + +#endif /* _USE_MKFS && !_FS_READONLY */ + +#if _USE_STRFUNC + +/*-----------------------------------------------------------------------*/ + +/* Get a string from the file */ + +/*-----------------------------------------------------------------------*/ +char *f_gets + ( + char *buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer */ + FIL *fil /* Pointer to the file object */ + ) +{ + int i = 0; + char *p = buff; + UINT rc; + + while( i < len - 1 ) + { /* Read bytes until buffer gets filled */ + f_read( fil, p, 1, &rc ); + if( rc != 1 ) + { + break; /* Break when no data to read */ + } + + #if _USE_STRFUNC >= 2 + if( *p == '\r' ) + { + continue; /* Strip '\r' */ + } + + #endif + i++; + if( *p++ == '\n' ) + { + break; /* Break when reached end of line */ + } + } + + *p = 0; + return i ? buff : NULL; /* When no data read (eof or error), return with error. */ +} + + #if !_FS_READONLY + #include + +/*-----------------------------------------------------------------------*/ + +/* Put a character to the file */ + +/*-----------------------------------------------------------------------*/ +int f_putc( int chr, /* A character to be output */ FIL *fil /* Ponter to the file object */ ) +{ + UINT bw; + char c; + + #if _USE_STRFUNC >= 2 + if( chr == '\n' ) + { + f_putc( '\r', fil ); /* LF -> CRLF conversion */ + } + + #endif + if( !fil ) + { /* Special value may be used to switch the destination to any other device */ + /* put_console(chr); */ + return chr; + } + + c = ( char ) chr; + f_write( fil, &c, 1, &bw ); /* Write a byte to the file */ + return bw ? chr : EOF; /* Return the result */ +} + +/*-----------------------------------------------------------------------*/ + +/* Put a string to the file */ + +/*-----------------------------------------------------------------------*/ +int f_puts( const char *str, /* Pointer to the string to be output */ FIL *fil /* Pointer to the file object */ ) +{ + int n; + + for( n = 0; *str; str++, n++ ) + { + if( f_putc(*str, fil) == EOF ) + { + return EOF; + } + } + + return n; +} + +/*-----------------------------------------------------------------------*/ + +/* Put a formatted string to the file */ + +/*-----------------------------------------------------------------------*/ +int f_printf( FIL *fil, /* Pointer to the file object */ const char *str, /* Pointer to the format string */ ... /* Optional arguments... */ ) +{ + va_list arp; + UCHAR c, f, r; + ULONG val; + char s[16]; + int i, w, res, cc; + + va_start( arp, str ); + + for( cc = res = 0; cc != EOF; res += cc ) + { + c = *str++; + if( c == 0 ) + { + break; /* End of string */ + } + + if( c != '%' ) + { /* Non escape cahracter */ + cc = f_putc( c, fil ); + if( cc != EOF ) + { + cc = 1; + } + + continue; + } + + w = f = 0; + c = *str++; + if( c == '0' ) + { /* Flag: '0' padding */ + f = 1; + c = *str++; + } + + while( c >= '0' && c <= '9' ) + { /* Precision */ + w = w * 10 + ( c - '0' ); + c = *str++; + } + + if( c == 'l' ) + { /* Prefix: Size is long int */ + f |= 2; + c = *str++; + } + + if( c == 's' ) + { /* Type is string */ + cc = f_puts( va_arg(arp, char *), fil ); + continue; + } + + if( c == 'c' ) + { /* Type is character */ + cc = f_putc( va_arg(arp, int), fil ); + if( cc != EOF ) + { + cc = 1; + } + + continue; + } + + r = 0; + if( c == 'd' ) + { + r = 10; /* Type is signed decimal */ + } + + if( c == 'u' ) + { + r = 10; /* Type is unsigned decimal */ + } + + if( c == 'X' ) + { + r = 16; /* Type is unsigned hexdecimal */ + } + + if( r == 0 ) + { + break; /* Unknown type */ + } + + if( f & 2 ) + { /* Get the value */ + val = ( ULONG ) va_arg( arp, long ); + } + else + { + val = ( c == 'd' ) ? ( ULONG ) ( long ) va_arg( arp, int ) : ( ULONG ) va_arg( arp, unsigned int ); + } + + /* Put numeral string */ + if( c == 'd' ) + { + if( val & 0x80000000 ) + { + val = 0 - val; + f |= 4; + } + } + + i = sizeof( s ) - 1; + s[i] = 0; + do + { + c = ( UCHAR ) ( val % r + '0' ); + if( c > '9' ) + { + c += 7; + } + + s[--i] = c; + val /= r; + } while( i && val ); + if( i && (f & 4) ) + { + s[--i] = '-'; + } + + w = sizeof( s ) - 1 - w; + while( i && i > w ) + { + s[--i] = ( f & 1 ) ? '0' : ' '; + } + + cc = f_puts( &s[i], fil ); + } + + va_end( arp ); + return( cc == EOF ) ? cc : res; +} + + #endif /* !_FS_READONLY */ +#endif /* _USE_STRFUNC */ diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/ff.h b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/ff.h new file mode 100644 index 0000000..0e2f212 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/ff.h @@ -0,0 +1,596 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module include file R0.07e (C)ChaN, 2009 +/----------------------------------------------------------------------------/ +/ FatFs module is a generic FAT file system module for small embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following trems. +/ +/ Copyright (C) 2009, ChaN, all right reserved. +/ +/ * The FatFs module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/----------------------------------------------------------------------------*/ + +#ifndef _FATFS +#define _FATFS 0x007E + +#include "fat_integer.h" /* Basic integer types */ +#include "ffconf.h" /* FatFs configuration options */ + +#if _FATFS != _FFCONFIG +#error Wrong configuration file (ffconf.h). +#endif + + +/* DBCS code ranges and SBCS extend char conversion table */ + +#if _CODE_PAGE == 932 /* Japanese Shift-JIS */ +#define _DF1S 0x81 /* DBC 1st byte range 1 start */ +#define _DF1E 0x9F /* DBC 1st byte range 1 end */ +#define _DF2S 0xE0 /* DBC 1st byte range 2 start */ +#define _DF2E 0xFC /* DBC 1st byte range 2 end */ +#define _DS1S 0x40 /* DBC 2nd byte range 1 start */ +#define _DS1E 0x7E /* DBC 2nd byte range 1 end */ +#define _DS2S 0x80 /* DBC 2nd byte range 2 start */ +#define _DS2E 0xFC /* DBC 2nd byte range 2 end */ + +#elif _CODE_PAGE == 936 /* Simplified Chinese GBK */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0x80 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 949 /* Korean */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x41 +#define _DS1E 0x5A +#define _DS2S 0x61 +#define _DS2E 0x7A +#define _DS3S 0x81 +#define _DS3E 0xFE + +#elif _CODE_PAGE == 950 /* Traditional Chinese Big5 */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0xA1 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 437 /* U.S. (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F,0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 720 /* Arabic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x45,0x41,0x84,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x49,0x49,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 737 /* Greek (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xE7,0xE8,0xF1,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 775 /* Baltic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 850 /* Multilingual Latin 1 (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 852 /* Latin 2 (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F,0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} + +#elif _CODE_PAGE == 855 /* Cyrillic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F,0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 857 /* Turkish (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x98,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0x59,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 858 /* Multilingual Latin 1 + Euro (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 862 /* Hebrew (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 866 /* Russian (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 874 /* Thai (OEM, Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1250 /* Central Europe (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xA3,0xB4,0xB5,0xB6,0xB7,0xB8,0xA5,0xAA,0xBB,0xBC,0xBD,0xBC,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} + +#elif _CODE_PAGE == 1251 /* Cyrillic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x82,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x80,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ + 0xA0,0xA2,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB2,0xA5,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xA3,0xBD,0xBD,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF} + +#elif _CODE_PAGE == 1252 /* Latin 1 (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xAd,0x9B,0x8C,0x9D,0xAE,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} + +#elif _CODE_PAGE == 1253 /* Greek (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xA2,0xB8,0xB9,0xBA, \ + 0xE0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xFB,0xBC,0xFD,0xBF,0xFF} + +#elif _CODE_PAGE == 1254 /* Turkish (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} + +#elif _CODE_PAGE == 1255 /* Hebrew (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1256 /* Arabic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x8C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x41,0xE1,0x41,0xE3,0xE4,0xE5,0xE6,0x43,0x45,0x45,0x45,0x45,0xEC,0xED,0x49,0x49,0xF0,0xF1,0xF2,0xF3,0x4F,0xF5,0xF6,0xF7,0xF8,0x55,0xFA,0x55,0x55,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1257 /* Baltic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xBC,0xBD,0xBE,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} + +#elif _CODE_PAGE == 1258 /* Vietnam (OEM, Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0xAC,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xEC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xFE,0x9F} + +#elif _CODE_PAGE == 1 /* ASCII (for only non-LFN cfg) */ +#define _DF1S 0 + +#else +#error Unknown code page + +#endif + + + +/* Character code support macros */ + +#define IsUpper(c) (((c)>='A')&&((c)<='Z')) +#define IsLower(c) (((c)>='a')&&((c)<='z')) + +#if _DF1S /* DBCS configuration */ + +#ifdef _DF2S /* Two 1st byte areas */ +#define IsDBCS1(c) (((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) || ((BYTE)(c) >= _DF2S && (BYTE)(c) <= _DF2E)) +#else /* One 1st byte area */ +#define IsDBCS1(c) ((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) +#endif + +#ifdef _DS3S /* Three 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E) || ((BYTE)(c) >= _DS3S && (BYTE)(c) <= _DS3E)) +#else /* Two 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E)) +#endif + +#else /* SBCS configuration */ + +#define IsDBCS1(c) 0 +#define IsDBCS2(c) 0 + +#endif /* _DF1S */ + + + +/* Definitions corresponds to multi partition */ + +#if _MULTI_PARTITION /* Multiple partition configuration */ + +typedef struct _PARTITION { + BYTE pd; /* Physical drive# */ + BYTE pt; /* Partition # (0-3) */ +} PARTITION; + +extern +const PARTITION Drives[]; /* Logical drive# to physical location conversion table */ +#define LD2PD(drv) (Drives[drv].pd) /* Get physical drive# */ +#define LD2PT(drv) (Drives[drv].pt) /* Get partition# */ + +#else /* Single partition configuration */ + +#define LD2PD(drv) (drv) /* Physical drive# is equal to the logical drive# */ +#define LD2PT(drv) 0 /* Always mounts the 1st partition */ + +#endif + + + +/* Definitions corresponds to multiple sector size */ + +#if _MAX_SS == 512 /* Single sector size */ +#define SS(fs) 512U + +#elif _MAX_SS == 1024 || _MAX_SS == 2048 || _MAX_SS == 4096 /* Multiple sector size */ +#define SS(fs) ((fs)->s_size) + +#else +#error Sector size must be 512, 1024, 2048 or 4096. + +#endif + + + +/* Type of file name on FatFs API */ + +#if _LFN_UNICODE && _USE_LFN +typedef WCHAR XCHAR; /* Unicode */ +#else +typedef char XCHAR; /* SBCS, DBCS */ +#endif + + + +/* File system object structure */ + +typedef struct _FATFS_ { + BYTE fs_type; /* FAT sub type */ + BYTE drive; /* Physical drive number */ + BYTE csize; /* Number of sectors per cluster */ + BYTE n_fats; /* Number of FAT copies */ + BYTE wflag; /* win[] dirty flag (1:must be written back) */ + BYTE fsi_flag; /* fsinfo dirty flag (1:must be written back) */ + WORD id; /* File system mount ID */ + WORD n_rootdir; /* Number of root directory entries (0 on FAT32) */ +#if _FS_REENTRANT + _SYNC_t sobj; /* Identifier of sync object */ +#endif +#if _MAX_SS != 512 + WORD s_size; /* Sector size */ +#endif +#if !_FS_READONLY + DWORD last_clust; /* Last allocated cluster */ + DWORD free_clust; /* Number of free clusters */ + DWORD fsi_sector; /* fsinfo sector */ +#endif +#if _FS_RPATH + DWORD cdir; /* Current directory (0:root)*/ +#endif + DWORD sects_fat; /* Sectors per fat */ + DWORD max_clust; /* Maximum cluster# + 1. Number of clusters is max_clust - 2 */ + DWORD fatbase; /* FAT start sector */ + DWORD dirbase; /* Root directory start sector (Cluster# on FAT32) */ + DWORD database; /* Data start sector */ + DWORD winsect; /* Current sector appearing in the win[] */ + BYTE win[_MAX_SS];/* Disk access window for Directory/FAT */ +} FATFS; + + + +/* Directory object structure */ + +typedef struct _DIR_ { + FATFS* fs; /* Pointer to the owner file system object */ + WORD id; /* Owner file system mount ID */ + WORD index; /* Current read/write index number */ + DWORD sclust; /* Table start cluster (0:Static table) */ + DWORD clust; /* Current cluster */ + DWORD sect; /* Current sector */ + BYTE* dir; /* Pointer to the current SFN entry in the win[] */ + BYTE* fn; /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */ +#if _USE_LFN + WCHAR* lfn; /* Pointer to the LFN working buffer */ + WORD lfn_idx; /* Last matched LFN index number (0xFFFF:No LFN) */ +#endif +} DIR; + + + +/* File object structure */ + +typedef struct _FIL_ { + FATFS* fs; /* Pointer to the owner file system object */ + WORD id; /* Owner file system mount ID */ + BYTE flag; /* File status flags */ + BYTE csect; /* Sector address in the cluster */ + DWORD fptr; /* File R/W pointer */ + DWORD fsize; /* File size */ + DWORD org_clust; /* File start cluster */ + DWORD curr_clust; /* Current cluster */ + DWORD dsect; /* Current data sector */ +#if !_FS_READONLY + DWORD dir_sect; /* Sector containing the directory entry */ + BYTE* dir_ptr; /* Ponter to the directory entry in the window */ +#endif +#if !_FS_TINY + BYTE buf[_MAX_SS];/* File R/W buffer */ +#endif +} FIL; + + + +/* File status structure */ + +typedef struct _FILINFO_ { + DWORD fsize; /* File size */ + WORD fdate; /* Last modified date */ + WORD ftime; /* Last modified time */ + BYTE fattrib; /* Attribute */ + char fname[13]; /* Short file name (8.3 format) */ +#if _USE_LFN + XCHAR* lfname; /* Pointer to the LFN buffer */ + int lfsize; /* Size of LFN buffer [chrs] */ +#endif +} FILINFO; + + + +/* File function return code (FRESULT) */ + +typedef enum { + FR_OK = 0, /* 0 */ + FR_DISK_ERR, /* 1 */ + FR_INT_ERR, /* 2 */ + FR_NOT_READY, /* 3 */ + FR_NO_FILE, /* 4 */ + FR_NO_PATH, /* 5 */ + FR_INVALID_NAME, /* 6 */ + FR_DENIED, /* 7 */ + FR_EXIST, /* 8 */ + FR_INVALID_OBJECT, /* 9 */ + FR_WRITE_PROTECTED, /* 10 */ + FR_INVALID_DRIVE, /* 11 */ + FR_NOT_ENABLED, /* 12 */ + FR_NO_FILESYSTEM, /* 13 */ + FR_MKFS_ABORTED, /* 14 */ + FR_TIMEOUT /* 15 */ +} FRESULT; + + + +/*--------------------------------------------------------------*/ +/* FatFs module application interface */ + +FRESULT f_mount (BYTE, FATFS*); /* Mount/Unmount a logical drive */ +FRESULT f_open (FIL*, const XCHAR*, BYTE); /* Open or create a file */ +FRESULT f_read (FIL*, void*, UINT, UINT*); /* Read data from a file */ +FRESULT f_write (FIL*, const void*, UINT, UINT*); /* Write data to a file */ +FRESULT f_lseek (FIL*, DWORD); /* Move file pointer of a file object */ +FRESULT f_close (FIL*); /* Close an open file object */ +FRESULT f_opendir (DIR*, const XCHAR*); /* Open an existing directory */ +FRESULT f_readdir (DIR*, FILINFO*); /* Read a directory item */ +FRESULT f_stat (const XCHAR*, FILINFO*); /* Get file status */ +FRESULT f_getfree (const XCHAR*, DWORD*, FATFS**); /* Get number of free clusters on the drive */ +FRESULT f_truncate (FIL*); /* Truncate file */ +FRESULT f_sync (FIL*); /* Flush cached data of a writing file */ +FRESULT f_unlink (const XCHAR*); /* Delete an existing file or directory */ +FRESULT f_mkdir (const XCHAR*); /* Create a new directory */ +FRESULT f_chmod (const XCHAR*, BYTE, BYTE); /* Change attriburte of the file/dir */ +FRESULT f_utime (const XCHAR*, const FILINFO*); /* Change timestamp of the file/dir */ +FRESULT f_rename (const XCHAR*, const XCHAR*); /* Rename/Move a file or directory */ +FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream */ +FRESULT f_mkfs (BYTE, BYTE, WORD); /* Create a file system on the drive */ +FRESULT f_chdir (const XCHAR*); /* Change current directory */ +FRESULT f_chdrive (BYTE); /* Change current drive */ + +#if _USE_STRFUNC +int f_putc (int, FIL*); /* Put a character to the file */ +int f_puts (const char*, FIL*); /* Put a string to the file */ +int f_printf (FIL*, const char*, ...); /* Put a formatted string to the file */ +char* f_gets (char*, int, FIL*); /* Get a string from the file */ +#define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0) +#define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0) +#ifndef EOF +#define EOF -1 +#endif +#endif + + + +/*--------------------------------------------------------------*/ +/* User defined functions */ + +/* Real time clock */ +#if !_FS_READONLY +DWORD get_fattime (void); /* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */ + /* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */ +#endif + +/* Unicode - OEM code conversion */ +#if _USE_LFN +WCHAR ff_convert (WCHAR, UINT); +WCHAR ff_wtoupper (WCHAR); +#endif + +/* Sync functions */ +#if _FS_REENTRANT +BOOL ff_cre_syncobj(BYTE, _SYNC_t*); +BOOL ff_del_syncobj(_SYNC_t); +BOOL ff_req_grant(_SYNC_t); +void ff_rel_grant(_SYNC_t); +#endif + + + +/*--------------------------------------------------------------*/ +/* Flags and offset address */ + + +/* File access control and file status flags (FIL.flag) */ + +#define FA_READ 0x01 +#define FA_OPEN_EXISTING 0x00 +#if _FS_READONLY == 0 +#define FA_WRITE 0x02 +#define FA_CREATE_NEW 0x04 +#define FA_CREATE_ALWAYS 0x08 +#define FA_OPEN_ALWAYS 0x10 +#define FA__WRITTEN 0x20 +#define FA__DIRTY 0x40 +#endif +#define FA__ERROR 0x80 + + +/* FAT sub type (FATFS.fs_type) */ + +#define FS_FAT12 1 +#define FS_FAT16 2 +#define FS_FAT32 3 + + +/* File attribute bits for directory entry */ + +#define AM_RDO 0x01 /* Read only */ +#define AM_HID 0x02 /* Hidden */ +#define AM_SYS 0x04 /* System */ +#define AM_VOL 0x08 /* Volume label */ +#define AM_LFN 0x0F /* LFN entry */ +#define AM_DIR 0x10 /* Directory */ +#define AM_ARC 0x20 /* Archive */ +#define AM_MASK 0x3F /* Mask of defined bits */ + + +/* FatFs refers the members in the FAT structures with byte offset instead +/ of structure member because there are incompatibility of the packing option +/ between various compilers. */ + +#define BS_jmpBoot 0 +#define BS_OEMName 3 +#define BPB_BytsPerSec 11 +#define BPB_SecPerClus 13 +#define BPB_RsvdSecCnt 14 +#define BPB_NumFATs 16 +#define BPB_RootEntCnt 17 +#define BPB_TotSec16 19 +#define BPB_Media 21 +#define BPB_FATSz16 22 +#define BPB_SecPerTrk 24 +#define BPB_NumHeads 26 +#define BPB_HiddSec 28 +#define BPB_TotSec32 32 +#define BS_55AA 510 + +#define BS_DrvNum 36 +#define BS_BootSig 38 +#define BS_VolID 39 +#define BS_VolLab 43 +#define BS_FilSysType 54 + +#define BPB_FATSz32 36 +#define BPB_ExtFlags 40 +#define BPB_FSVer 42 +#define BPB_RootClus 44 +#define BPB_FSInfo 48 +#define BPB_BkBootSec 50 +#define BS_DrvNum32 64 +#define BS_BootSig32 66 +#define BS_VolID32 67 +#define BS_VolLab32 71 +#define BS_FilSysType32 82 + +#define FSI_LeadSig 0 +#define FSI_StrucSig 484 +#define FSI_Free_Count 488 +#define FSI_Nxt_Free 492 + +#define MBR_Table 446 + +#define DIR_Name 0 +#define DIR_Attr 11 +#define DIR_NTres 12 +#define DIR_CrtTime 14 +#define DIR_CrtDate 16 +#define DIR_FstClusHI 20 +#define DIR_WrtTime 22 +#define DIR_WrtDate 24 +#define DIR_FstClusLO 26 +#define DIR_FileSize 28 +#define LDIR_Ord 0 +#define LDIR_Attr 11 +#define LDIR_Type 12 +#define LDIR_Chksum 13 +#define LDIR_FstClusLO 26 + + + +/*--------------------------------*/ +/* Multi-byte word access macros */ + +#if _WORD_ACCESS == 1 /* Enable word access to the FAT structure */ +#define LD_WORD(ptr) (WORD)(*(WORD*)(BYTE*)(ptr)) +#define LD_DWORD(ptr) (DWORD)(*(DWORD*)(BYTE*)(ptr)) +#define ST_WORD(ptr,val) *(WORD*)(BYTE*)(ptr)=(WORD)(val) +#define ST_DWORD(ptr,val) *(DWORD*)(BYTE*)(ptr)=(DWORD)(val) +#else /* Use byte-by-byte access to the FAT structure */ +#define LD_WORD(ptr) (WORD)(((WORD)*(BYTE*)((ptr)+1)<<8)|(WORD)*(BYTE*)(ptr)) +#define LD_DWORD(ptr) (DWORD)(((DWORD)*(BYTE*)((ptr)+3)<<24)|((DWORD)*(BYTE*)((ptr)+2)<<16)|((WORD)*(BYTE*)((ptr)+1)<<8)|*(BYTE*)(ptr)) +#define ST_WORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8) +#define ST_DWORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8); *(BYTE*)((ptr)+2)=(BYTE)((DWORD)(val)>>16); *(BYTE*)((ptr)+3)=(BYTE)((DWORD)(val)>>24) +#endif + + +#endif /* _FATFS */ diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc932.c b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc932.c new file mode 100644 index 0000000..779ef68 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc932.c @@ -0,0 +1,3798 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ +/* */ +/* CP932 (Japanese Shift-JIS) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + +#define _TINY_TABLE 0 + +#if !_USE_LFN || _CODE_PAGE != 932 +#error This file is not needed in current configuration. +#endif + + +static +const WCHAR uni2sjis[] = { +/* Unicode - Sjis, Unicode - Sjis, Unicode - Sjis, Unicode - Sjis, */ + 0x00A7, 0x8198, 0x00A8, 0x814E, 0x00B0, 0x818B, 0x00B1, 0x817D, + 0x00B4, 0x814C, 0x00B6, 0x81F7, 0x00D7, 0x817E, 0x00F7, 0x8180, + 0x0391, 0x839F, 0x0392, 0x83A0, 0x0393, 0x83A1, 0x0394, 0x83A2, + 0x0395, 0x83A3, 0x0396, 0x83A4, 0x0397, 0x83A5, 0x0398, 0x83A6, + 0x0399, 0x83A7, 0x039A, 0x83A8, 0x039B, 0x83A9, 0x039C, 0x83AA, + 0x039D, 0x83AB, 0x039E, 0x83AC, 0x039F, 0x83AD, 0x03A0, 0x83AE, + 0x03A1, 0x83AF, 0x03A3, 0x83B0, 0x03A4, 0x83B1, 0x03A5, 0x83B2, + 0x03A6, 0x83B3, 0x03A7, 0x83B4, 0x03A8, 0x83B5, 0x03A9, 0x83B6, + 0x03B1, 0x83BF, 0x03B2, 0x83C0, 0x03B3, 0x83C1, 0x03B4, 0x83C2, + 0x03B5, 0x83C3, 0x03B6, 0x83C4, 0x03B7, 0x83C5, 0x03B8, 0x83C6, + 0x03B9, 0x83C7, 0x03BA, 0x83C8, 0x03BB, 0x83C9, 0x03BC, 0x83CA, + 0x03BD, 0x83CB, 0x03BE, 0x83CC, 0x03BF, 0x83CD, 0x03C0, 0x83CE, + 0x03C1, 0x83CF, 0x03C3, 0x83D0, 0x03C4, 0x83D1, 0x03C5, 0x83D2, + 0x03C6, 0x83D3, 0x03C7, 0x83D4, 0x03C8, 0x83D5, 0x03C9, 0x83D6, + 0x0401, 0x8446, 0x0410, 0x8440, 0x0411, 0x8441, 0x0412, 0x8442, + 0x0413, 0x8443, 0x0414, 0x8444, 0x0415, 0x8445, 0x0416, 0x8447, + 0x0417, 0x8448, 0x0418, 0x8449, 0x0419, 0x844A, 0x041A, 0x844B, + 0x041B, 0x844C, 0x041C, 0x844D, 0x041D, 0x844E, 0x041E, 0x844F, + 0x041F, 0x8450, 0x0420, 0x8451, 0x0421, 0x8452, 0x0422, 0x8453, + 0x0423, 0x8454, 0x0424, 0x8455, 0x0425, 0x8456, 0x0426, 0x8457, + 0x0427, 0x8458, 0x0428, 0x8459, 0x0429, 0x845A, 0x042A, 0x845B, + 0x042B, 0x845C, 0x042C, 0x845D, 0x042D, 0x845E, 0x042E, 0x845F, + 0x042F, 0x8460, 0x0430, 0x8470, 0x0431, 0x8471, 0x0432, 0x8472, + 0x0433, 0x8473, 0x0434, 0x8474, 0x0435, 0x8475, 0x0436, 0x8477, + 0x0437, 0x8478, 0x0438, 0x8479, 0x0439, 0x847A, 0x043A, 0x847B, + 0x043B, 0x847C, 0x043C, 0x847D, 0x043D, 0x847E, 0x043E, 0x8480, + 0x043F, 0x8481, 0x0440, 0x8482, 0x0441, 0x8483, 0x0442, 0x8484, + 0x0443, 0x8485, 0x0444, 0x8486, 0x0445, 0x8487, 0x0446, 0x8488, + 0x0447, 0x8489, 0x0448, 0x848A, 0x0449, 0x848B, 0x044A, 0x848C, + 0x044B, 0x848D, 0x044C, 0x848E, 0x044D, 0x848F, 0x044E, 0x8490, + 0x044F, 0x8491, 0x0451, 0x8476, 0x2010, 0x815D, 0x2015, 0x815C, + 0x2018, 0x8165, 0x2019, 0x8166, 0x201C, 0x8167, 0x201D, 0x8168, + 0x2020, 0x81F5, 0x2021, 0x81F6, 0x2025, 0x8164, 0x2026, 0x8163, + 0x2030, 0x81F1, 0x2032, 0x818C, 0x2033, 0x818D, 0x203B, 0x81A6, + 0x2103, 0x818E, 0x2116, 0x8782, 0x2121, 0x8784, 0x212B, 0x81F0, + 0x2160, 0x8754, 0x2161, 0x8755, 0x2162, 0x8756, 0x2163, 0x8757, + 0x2164, 0x8758, 0x2165, 0x8759, 0x2166, 0x875A, 0x2167, 0x875B, + 0x2168, 0x875C, 0x2169, 0x875D, 0x2170, 0xFA40, 0x2171, 0xFA41, + 0x2172, 0xFA42, 0x2173, 0xFA43, 0x2174, 0xFA44, 0x2175, 0xFA45, + 0x2176, 0xFA46, 0x2177, 0xFA47, 0x2178, 0xFA48, 0x2179, 0xFA49, + 0x2190, 0x81A9, 0x2191, 0x81AA, 0x2192, 0x81A8, 0x2193, 0x81AB, + 0x21D2, 0x81CB, 0x21D4, 0x81CC, 0x2200, 0x81CD, 0x2202, 0x81DD, + 0x2203, 0x81CE, 0x2207, 0x81DE, 0x2208, 0x81B8, 0x220B, 0x81B9, + 0x2211, 0x8794, 0x221A, 0x81E3, 0x221D, 0x81E5, 0x221E, 0x8187, + 0x221F, 0x8798, 0x2220, 0x81DA, 0x2225, 0x8161, 0x2227, 0x81C8, + 0x2228, 0x81C9, 0x2229, 0x81BF, 0x222A, 0x81BE, 0x222B, 0x81E7, + 0x222C, 0x81E8, 0x222E, 0x8793, 0x2234, 0x8188, 0x2235, 0x81E6, + 0x223D, 0x81E4, 0x2252, 0x81E0, 0x2260, 0x8182, 0x2261, 0x81DF, + 0x2266, 0x8185, 0x2267, 0x8186, 0x226A, 0x81E1, 0x226B, 0x81E2, + 0x2282, 0x81BC, 0x2283, 0x81BD, 0x2286, 0x81BA, 0x2287, 0x81BB, + 0x22A5, 0x81DB, 0x22BF, 0x8799, 0x2312, 0x81DC, 0x2460, 0x8740, + 0x2461, 0x8741, 0x2462, 0x8742, 0x2463, 0x8743, 0x2464, 0x8744, + 0x2465, 0x8745, 0x2466, 0x8746, 0x2467, 0x8747, 0x2468, 0x8748, + 0x2469, 0x8749, 0x246A, 0x874A, 0x246B, 0x874B, 0x246C, 0x874C, + 0x246D, 0x874D, 0x246E, 0x874E, 0x246F, 0x874F, 0x2470, 0x8750, + 0x2471, 0x8751, 0x2472, 0x8752, 0x2473, 0x8753, 0x2500, 0x849F, + 0x2501, 0x84AA, 0x2502, 0x84A0, 0x2503, 0x84AB, 0x250C, 0x84A1, + 0x250F, 0x84AC, 0x2510, 0x84A2, 0x2513, 0x84AD, 0x2514, 0x84A4, + 0x2517, 0x84AF, 0x2518, 0x84A3, 0x251B, 0x84AE, 0x251C, 0x84A5, + 0x251D, 0x84BA, 0x2520, 0x84B5, 0x2523, 0x84B0, 0x2524, 0x84A7, + 0x2525, 0x84BC, 0x2528, 0x84B7, 0x252B, 0x84B2, 0x252C, 0x84A6, + 0x252F, 0x84B6, 0x2530, 0x84BB, 0x2533, 0x84B1, 0x2534, 0x84A8, + 0x2537, 0x84B8, 0x2538, 0x84BD, 0x253B, 0x84B3, 0x253C, 0x84A9, + 0x253F, 0x84B9, 0x2542, 0x84BE, 0x254B, 0x84B4, 0x25A0, 0x81A1, + 0x25A1, 0x81A0, 0x25B2, 0x81A3, 0x25B3, 0x81A2, 0x25BC, 0x81A5, + 0x25BD, 0x81A4, 0x25C6, 0x819F, 0x25C7, 0x819E, 0x25CB, 0x819B, + 0x25CE, 0x819D, 0x25CF, 0x819C, 0x25EF, 0x81FC, 0x2605, 0x819A, + 0x2606, 0x8199, 0x2640, 0x818A, 0x2642, 0x8189, 0x266A, 0x81F4, + 0x266D, 0x81F3, 0x266F, 0x81F2, 0x3000, 0x8140, 0x3001, 0x8141, + 0x3002, 0x8142, 0x3003, 0x8156, 0x3005, 0x8158, 0x3006, 0x8159, + 0x3007, 0x815A, 0x3008, 0x8171, 0x3009, 0x8172, 0x300A, 0x8173, + 0x300B, 0x8174, 0x300C, 0x8175, 0x300D, 0x8176, 0x300E, 0x8177, + 0x300F, 0x8178, 0x3010, 0x8179, 0x3011, 0x817A, 0x3012, 0x81A7, + 0x3013, 0x81AC, 0x3014, 0x816B, 0x3015, 0x816C, 0x301D, 0x8780, + 0x301F, 0x8781, 0x3041, 0x829F, 0x3042, 0x82A0, 0x3043, 0x82A1, + 0x3044, 0x82A2, 0x3045, 0x82A3, 0x3046, 0x82A4, 0x3047, 0x82A5, + 0x3048, 0x82A6, 0x3049, 0x82A7, 0x304A, 0x82A8, 0x304B, 0x82A9, + 0x304C, 0x82AA, 0x304D, 0x82AB, 0x304E, 0x82AC, 0x304F, 0x82AD, + 0x3050, 0x82AE, 0x3051, 0x82AF, 0x3052, 0x82B0, 0x3053, 0x82B1, + 0x3054, 0x82B2, 0x3055, 0x82B3, 0x3056, 0x82B4, 0x3057, 0x82B5, + 0x3058, 0x82B6, 0x3059, 0x82B7, 0x305A, 0x82B8, 0x305B, 0x82B9, + 0x305C, 0x82BA, 0x305D, 0x82BB, 0x305E, 0x82BC, 0x305F, 0x82BD, + 0x3060, 0x82BE, 0x3061, 0x82BF, 0x3062, 0x82C0, 0x3063, 0x82C1, + 0x3064, 0x82C2, 0x3065, 0x82C3, 0x3066, 0x82C4, 0x3067, 0x82C5, + 0x3068, 0x82C6, 0x3069, 0x82C7, 0x306A, 0x82C8, 0x306B, 0x82C9, + 0x306C, 0x82CA, 0x306D, 0x82CB, 0x306E, 0x82CC, 0x306F, 0x82CD, + 0x3070, 0x82CE, 0x3071, 0x82CF, 0x3072, 0x82D0, 0x3073, 0x82D1, + 0x3074, 0x82D2, 0x3075, 0x82D3, 0x3076, 0x82D4, 0x3077, 0x82D5, + 0x3078, 0x82D6, 0x3079, 0x82D7, 0x307A, 0x82D8, 0x307B, 0x82D9, + 0x307C, 0x82DA, 0x307D, 0x82DB, 0x307E, 0x82DC, 0x307F, 0x82DD, + 0x3080, 0x82DE, 0x3081, 0x82DF, 0x3082, 0x82E0, 0x3083, 0x82E1, + 0x3084, 0x82E2, 0x3085, 0x82E3, 0x3086, 0x82E4, 0x3087, 0x82E5, + 0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9, + 0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED, + 0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1, + 0x3094, 0x8394, 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, + 0x309E, 0x8155, 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, + 0x30A4, 0x8343, 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, + 0x30A8, 0x8347, 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, + 0x30AC, 0x834B, 0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, + 0x30B0, 0x834F, 0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, + 0x30B4, 0x8353, 0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, + 0x30B8, 0x8357, 0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, + 0x30BC, 0x835B, 0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, + 0x30C0, 0x835F, 0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, + 0x30C4, 0x8363, 0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, + 0x30C8, 0x8367, 0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, + 0x30CC, 0x836B, 0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, + 0x30D0, 0x836F, 0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, + 0x30D4, 0x8373, 0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, + 0x30D8, 0x8377, 0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, + 0x30DC, 0x837B, 0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, + 0x30E0, 0x8380, 0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, + 0x30E4, 0x8384, 0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, + 0x30E8, 0x8388, 0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, + 0x30EC, 0x838C, 0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, + 0x30F0, 0x8390, 0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, + 0x30F4, 0x8394, 0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, + 0x30FC, 0x815B, 0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, + 0x3232, 0x878B, 0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, + 0x32A6, 0x8787, 0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, + 0x330D, 0x8769, 0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, + 0x3323, 0x876B, 0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, + 0x3336, 0x8766, 0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, + 0x334D, 0x8762, 0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, + 0x337C, 0x878F, 0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, + 0x338F, 0x8773, 0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, + 0x33A1, 0x8775, 0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, + 0x4E01, 0x929A, 0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, + 0x4E09, 0x8E4F, 0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, + 0x4E0E, 0x975E, 0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, + 0x4E15, 0x98A1, 0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, + 0x4E19, 0x95B8, 0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, + 0x4E28, 0xFA68, 0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, + 0x4E32, 0x8BF8, 0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, + 0x4E3B, 0x8EE5, 0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, + 0x4E43, 0x9454, 0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, + 0x4E4E, 0x8CC1, 0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, + 0x4E57, 0x8FE6, 0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, + 0x4E5E, 0x8CEE, 0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, + 0x4E73, 0x93FB, 0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, + 0x4E85, 0x98AB, 0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, + 0x4E8A, 0x98AD, 0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, + 0x4E91, 0x895D, 0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, + 0x4E98, 0x986A, 0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, + 0x4E9E, 0x98B1, 0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, + 0x4EA2, 0x98B4, 0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, + 0x4EA8, 0x8B9C, 0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, + 0x4EAE, 0x97BA, 0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, + 0x4EBA, 0x906C, 0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, + 0x4EC4, 0x98BA, 0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, + 0x4ECB, 0x89EE, 0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, + 0x4ED4, 0x8E65, 0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, + 0x4ED8, 0x9574, 0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, + 0x4EDF, 0x98C0, 0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, + 0x4EE5, 0x88C8, 0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, + 0x4EF2, 0x9287, 0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, + 0x4EFC, 0xFA6A, 0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, + 0x4F09, 0x98C2, 0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, + 0x4F0F, 0x959A, 0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, + 0x4F1C, 0x98E5, 0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, + 0x4F34, 0x94BA, 0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, + 0x4F3A, 0x8E66, 0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, + 0x4F46, 0x9241, 0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, + 0x4F4F, 0x8F5A, 0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, + 0x4F55, 0x89BD, 0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, + 0x4F5A, 0x98C3, 0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, + 0x4F5E, 0x9B43, 0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, + 0x4F73, 0x89C0, 0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, + 0x4F7C, 0x8CF1, 0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, + 0x4F88, 0x98CA, 0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, + 0x4F8F, 0x98CB, 0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, + 0x4F96, 0x98D3, 0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, + 0x4F9D, 0x88CB, 0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, + 0x4FAD, 0x9699, 0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, + 0x4FB6, 0x97B5, 0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, + 0x4FC4, 0x89E2, 0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, + 0x4FCE, 0x98D7, 0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, + 0x4FD7, 0x91AD, 0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, + 0x4FDD, 0x95DB, 0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, + 0x4FE4, 0x98DD, 0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, + 0x4FF3, 0x946F, 0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, + 0x4FFA, 0x89B4, 0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, + 0x5006, 0x98ED, 0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, + 0x500F, 0xE0C5, 0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, + 0x5016, 0x8CF4, 0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, + 0x501F, 0x8ED8, 0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, + 0x5024, 0x926C, 0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, + 0x5029, 0x98E8, 0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, + 0x502D, 0x9860, 0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, + 0x5042, 0xFA7A, 0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, + 0x5048, 0x98F3, 0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, + 0x5055, 0x98F1, 0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, + 0x5065, 0x8C92, 0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, + 0x5074, 0x91A4, 0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, + 0x507D, 0x8B55, 0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, + 0x5091, 0x8C86, 0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, + 0x509A, 0x98F9, 0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, + 0x50B3, 0x9942, 0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, + 0x50BE, 0x8C58, 0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, + 0x50CA, 0x9941, 0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, + 0x50D5, 0x966C, 0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, + 0x50DE, 0x9945, 0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, + 0x50ED, 0x9947, 0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, + 0x50F9, 0x994A, 0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, + 0x5102, 0x994E, 0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, + 0x5114, 0x9951, 0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, + 0x511A, 0x9952, 0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, + 0x5132, 0x96D7, 0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, + 0x513C, 0x9956, 0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, + 0x5143, 0x8CB3, 0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, + 0x5147, 0x8BA2, 0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, + 0x514B, 0x8D8E, 0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, + 0x5150, 0x8E99, 0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, + 0x515C, 0x8A95, 0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, + 0x5168, 0x9153, 0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, + 0x516C, 0x8CF6, 0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, + 0x5175, 0x95BA, 0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, + 0x517C, 0x8C93, 0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, + 0x5186, 0x897E, 0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, + 0x518D, 0x8DC4, 0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, + 0x5192, 0x9660, 0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, + 0x5197, 0x8FE7, 0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, + 0x51A2, 0x996E, 0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, + 0x51A8, 0x9579, 0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, + 0x51AC, 0x937E, 0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, + 0x51B3, 0x9972, 0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, + 0x51B7, 0x97E2, 0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, + 0x51C5, 0x9978, 0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, + 0x51CC, 0x97BD, 0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, + 0x51DC, 0xEAA3, 0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, + 0x51E6, 0x8F88, 0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, + 0x51EC, 0xFA83, 0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, + 0x51F5, 0x9981, 0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, + 0x51FA, 0x8F6F, 0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, + 0x5203, 0x906E, 0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, + 0x5208, 0x8AA0, 0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, + 0x5211, 0x8C59, 0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, + 0x521D, 0x8F89, 0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, + 0x5229, 0x9798, 0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, + 0x5233, 0x998A, 0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, + 0x5239, 0x998B, 0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, + 0x5244, 0x998D, 0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, + 0x524C, 0x998F, 0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, + 0x5256, 0x9655, 0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, + 0x5264, 0x8DDC, 0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, + 0x526F, 0x959B, 0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, + 0x5273, 0x9995, 0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, + 0x527F, 0x9996, 0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, + 0x5289, 0x97AB, 0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, + 0x5294, 0x9999, 0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, + 0x52A0, 0x89C1, 0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, + 0x52AA, 0x9377, 0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, + 0x52AF, 0xFB77, 0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, + 0x52B9, 0x8CF8, 0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, + 0x52C1, 0x99A4, 0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, + 0x52C9, 0x95D7, 0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, + 0x52D7, 0x99A6, 0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, + 0x52DD, 0x8F9F, 0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, + 0x52E2, 0x90A8, 0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, + 0x52E7, 0x8AA9, 0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, + 0x52F8, 0x99AE, 0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, + 0x52FF, 0x96DC, 0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, + 0x5305, 0x95EF, 0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, + 0x530D, 0x99B3, 0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, + 0x5316, 0x89BB, 0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, + 0x531D, 0x9178, 0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, + 0x5324, 0xFA8B, 0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, + 0x5333, 0x99BB, 0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, + 0x533B, 0x88E3, 0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, + 0x5343, 0x90E7, 0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, + 0x5348, 0x8CDF, 0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, + 0x5351, 0x94DA, 0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, + 0x5357, 0x93EC, 0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, + 0x535E, 0x99C4, 0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, + 0x536E, 0x99C6, 0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, + 0x5372, 0xFA8C, 0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, + 0x5377, 0x99C9, 0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, + 0x5382, 0x99CA, 0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, + 0x5398, 0x97D0, 0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, + 0x53A5, 0x99CE, 0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, + 0x53AD, 0x897D, 0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, + 0x53B3, 0x8CB5, 0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, + 0x53C3, 0x99D2, 0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, + 0x53CB, 0x9746, 0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, + 0x53D4, 0x8F66, 0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, + 0x53DB, 0x94BE, 0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, + 0x53E2, 0x9170, 0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, + 0x53E8, 0x99D9, 0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, + 0x53EC, 0x8FA2, 0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, + 0x53F0, 0x91E4, 0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, + 0x53F6, 0x8A90, 0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, + 0x5401, 0x99DC, 0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, + 0x5409, 0x8B67, 0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, + 0x540D, 0x96BC, 0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, + 0x5411, 0x8CFC, 0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, + 0x5420, 0x9669, 0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, + 0x542C, 0x99DF, 0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, + 0x5438, 0x8B7A, 0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, + 0x543D, 0x99DD, 0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, + 0x5446, 0x95F0, 0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, + 0x544E, 0x99E6, 0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, + 0x546A, 0x8EF4, 0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, + 0x5475, 0x99E8, 0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, + 0x547C, 0x8CC4, 0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, + 0x5486, 0x99F4, 0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, + 0x548E, 0x99E9, 0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, + 0x549C, 0xFA91, 0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, + 0x54A8, 0x99FC, 0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, + 0x54AF, 0x9A5D, 0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, + 0x54BC, 0x9A44, 0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, + 0x54C1, 0x9569, 0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, + 0x54C8, 0x99FB, 0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, + 0x54E2, 0x9A4E, 0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, + 0x54E9, 0x9689, 0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, + 0x54FA, 0x9A4D, 0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, + 0x5506, 0x8DB4, 0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, + 0x5514, 0x9A49, 0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, + 0x5531, 0x8FA5, 0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, + 0x553E, 0x91C1, 0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, + 0x5546, 0x8FA4, 0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, + 0x5556, 0x9A56, 0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, + 0x5563, 0x9A51, 0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, + 0x5580, 0x9A5C, 0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, + 0x5587, 0x9A68, 0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, + 0x5598, 0x9A62, 0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, + 0x559D, 0x8A85, 0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, + 0x55A8, 0x9A69, 0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, + 0x55AC, 0x8BAA, 0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, + 0x55C4, 0x9A6D, 0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, + 0x55DA, 0x9A6A, 0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, + 0x55E4, 0x9A6F, 0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, + 0x55FE, 0x9A74, 0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, + 0x5616, 0x9A73, 0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, + 0x5629, 0x89DC, 0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, + 0x5634, 0x9A7B, 0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, + 0x564C, 0x9158, 0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, + 0x5664, 0x9A81, 0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, + 0x566C, 0x9A83, 0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, + 0x5680, 0x9A86, 0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, + 0x568F, 0x9A8A, 0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, + 0x56A5, 0x9A8B, 0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, + 0x56BC, 0x9A90, 0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, + 0x56C3, 0x9A92, 0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, + 0x56D3, 0x9A97, 0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, + 0x56DB, 0x8E6C, 0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, + 0x56EE, 0x9A99, 0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, + 0x56F9, 0x9A9A, 0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, + 0x5700, 0x9A9B, 0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, + 0x5709, 0x9A9E, 0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, + 0x5712, 0x8980, 0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, + 0x571C, 0x9AA6, 0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, + 0x5728, 0x8DDD, 0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, + 0x5738, 0x9AA9, 0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, + 0x5747, 0x8BCF, 0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, + 0x5750, 0x8DBF, 0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, + 0x5764, 0x8DA3, 0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, + 0x576A, 0x92D8, 0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, + 0x5789, 0x9AB3, 0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, + 0x57A2, 0x8D43, 0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, + 0x57AC, 0xFA98, 0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, + 0x57C3, 0x9ABA, 0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, + 0x57CB, 0x9684, 0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, + 0x57D4, 0x9ABC, 0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, + 0x57E0, 0x9575, 0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, + 0x57F9, 0x947C, 0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, + 0x5802, 0x93B0, 0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, + 0x580B, 0x9AC2, 0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, + 0x5821, 0x9AC6, 0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, + 0x5830, 0x8981, 0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, + 0x583A, 0x8DE4, 0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, + 0x584A, 0x89F2, 0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, + 0x5854, 0x9383, 0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, + 0x585A, 0x92CB, 0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, + 0x586B, 0x9355, 0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, + 0x5879, 0x9ACD, 0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, + 0x5893, 0x95E6, 0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, + 0x589F, 0x9AD0, 0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, + 0x58B2, 0xFA9E, 0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, + 0x58BA, 0x9AD2, 0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, + 0x58C5, 0x9AD7, 0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, + 0x58D1, 0x9AD9, 0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, + 0x58D8, 0x9ADC, 0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, + 0x58DF, 0x9AE0, 0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, + 0x58EC, 0x9070, 0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, + 0x58F1, 0x88EB, 0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, + 0x58FA, 0x9AE2, 0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, + 0x5902, 0x9AE7, 0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, + 0x590F, 0x89C4, 0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, + 0x5918, 0x99C7, 0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, + 0x591C, 0x96E9, 0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, + 0x5929, 0x9356, 0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, + 0x592D, 0x9AEE, 0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, + 0x5937, 0x88CE, 0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, + 0x5947, 0x8AEF, 0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, + 0x594F, 0x9174, 0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, + 0x5954, 0x967A, 0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, + 0x595A, 0x9AF6, 0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, + 0x5962, 0x9AF8, 0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, + 0x5968, 0x8FA7, 0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, + 0x596E, 0x95B1, 0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, + 0x597D, 0x8D44, 0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, + 0x5984, 0x96CF, 0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, + 0x5996, 0x9764, 0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, + 0x59A3, 0x9B45, 0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, + 0x59AC, 0x9369, 0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, + 0x59BB, 0x8DC8, 0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, + 0x59CB, 0x8E6E, 0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, + 0x59D4, 0x88CF, 0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, + 0x59E5, 0x8957, 0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, + 0x59EB, 0x9550, 0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, + 0x5A01, 0x88D0, 0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, + 0x5A18, 0x96BA, 0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, + 0x5A20, 0x9050, 0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, + 0x5A35, 0x9B56, 0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, + 0x5A41, 0x984B, 0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, + 0x5A62, 0x9B58, 0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, + 0x5A7F, 0x96B9, 0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, + 0x5ABC, 0x9B5B, 0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, + 0x5AC2, 0x9B5E, 0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, + 0x5AD0, 0x9B6B, 0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, + 0x5AE3, 0x9B60, 0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, + 0x5AFB, 0x9B66, 0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, + 0x5B16, 0x9B69, 0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, + 0x5B30, 0x8964, 0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, + 0x5B40, 0x9B71, 0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, + 0x5B51, 0x9B72, 0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, + 0x5B57, 0x8E9A, 0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, + 0x5B5C, 0x8E79, 0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, + 0x5B64, 0x8CC7, 0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, + 0x5B6B, 0x91B7, 0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, + 0x5B75, 0x9B7A, 0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, + 0x5B83, 0x9B80, 0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, + 0x5B89, 0x88C0, 0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, + 0x5B8F, 0x8D47, 0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, + 0x5B99, 0x9288, 0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, + 0x5B9D, 0x95F3, 0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, + 0x5BA4, 0x8EBA, 0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, + 0x5BB0, 0x8DC9, 0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, + 0x5BB6, 0x89C6, 0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, + 0x5BC0, 0xFAA7, 0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, + 0x5BC5, 0x93D0, 0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, + 0x5BCC, 0x9578, 0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, + 0x5BD4, 0x9B86, 0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, + 0x5BDE, 0x9B8B, 0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, + 0x5BE4, 0x9B88, 0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, + 0x5BE8, 0x9ECB, 0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, + 0x5BEE, 0x97BE, 0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, + 0x5BF6, 0x9B8F, 0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, + 0x5BFF, 0x8EF5, 0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, + 0x5C05, 0x9B91, 0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, + 0x5C09, 0x88D1, 0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, + 0x5C0E, 0x93B1, 0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, + 0x5C16, 0x90EB, 0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, + 0x5C22, 0x9B97, 0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, + 0x5C31, 0x8F41, 0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, + 0x5C3B, 0x904B, 0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, + 0x5C3F, 0x9441, 0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, + 0x5C46, 0x9B9C, 0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, + 0x5C4D, 0x8E72, 0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, + 0x5C51, 0x8BFB, 0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, + 0x5C60, 0x936A, 0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, + 0x5C6C, 0x9BA2, 0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, + 0x5C76, 0x9BA5, 0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, + 0x5C91, 0x9BA8, 0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, + 0x5CA8, 0x915A, 0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, + 0x5CB1, 0x91D0, 0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, + 0x5CB8, 0x8ADD, 0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, + 0x5CBE, 0x9BB1, 0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, + 0x5CE0, 0x93BB, 0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, + 0x5CEA, 0x9BB9, 0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, + 0x5CF5, 0xFAAE, 0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, + 0x5CFD, 0x9BB5, 0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, + 0x5D11, 0x9BC0, 0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, + 0x5D17, 0x9BBC, 0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, + 0x5D1B, 0x9BBF, 0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, + 0x5D29, 0x95F6, 0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, + 0x5D4E, 0x9BC8, 0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, + 0x5D5C, 0x9BBD, 0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, + 0x5D6F, 0x8DB5, 0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, + 0x5D84, 0x9BCE, 0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, + 0x5D90, 0x9BD5, 0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, + 0x5DAE, 0x9BD3, 0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, + 0x5DBA, 0x97E4, 0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, + 0x5DCC, 0x8ADE, 0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, + 0x5DD3, 0x9BDA, 0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, + 0x5DDE, 0x8F42, 0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, + 0x5DE6, 0x8DB6, 0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, + 0x5DEE, 0x8DB7, 0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, + 0x5DF4, 0x9462, 0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, + 0x5DFD, 0x9246, 0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, + 0x5E06, 0x94BF, 0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, + 0x5E16, 0x929F, 0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, + 0x5E1D, 0x92E9, 0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, + 0x5E2F, 0x91D1, 0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, + 0x5E37, 0x9BE7, 0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, + 0x5E43, 0x9BE9, 0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, + 0x5E4C, 0x9679, 0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, + 0x5E57, 0x9BEC, 0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, + 0x5E63, 0x95BC, 0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, + 0x5E74, 0x944E, 0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, + 0x5E79, 0x8AB2, 0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, + 0x5E7D, 0x9748, 0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, + 0x5E83, 0x8D4C, 0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, + 0x5E8F, 0x8F98, 0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, + 0x5E9A, 0x8D4D, 0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, + 0x5EA7, 0x8DC0, 0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, + 0x5EB6, 0x8F8E, 0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, + 0x5EC2, 0x9BF9, 0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, + 0x5ECA, 0x984C, 0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, + 0x5ED6, 0x9C40, 0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, + 0x5EDF, 0x955F, 0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, + 0x5EE3, 0x9C41, 0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, + 0x5EF0, 0x9C4C, 0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, + 0x5EF6, 0x8984, 0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, + 0x5EFB, 0x89F4, 0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, + 0x5F01, 0x95D9, 0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, + 0x5F0A, 0x95BE, 0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, + 0x5F0F, 0x8EAE, 0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, + 0x5F14, 0x92A2, 0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, + 0x5F18, 0x8D4F, 0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, + 0x5F25, 0x96ED, 0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, + 0x5F2D, 0x9C58, 0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, + 0x5F35, 0x92A3, 0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, + 0x5F3E, 0x9265, 0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, + 0x5F4A, 0x8BAE, 0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, + 0x5F53, 0x9396, 0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, + 0x5F5C, 0x9C53, 0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, + 0x5F66, 0x9546, 0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, + 0x5F6B, 0x92A4, 0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, + 0x5F71, 0x8965, 0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, + 0x5F7C, 0x94DE, 0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, + 0x5F82, 0x9C68, 0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, + 0x5F87, 0x9C6D, 0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, + 0x5F8C, 0x8CE3, 0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, + 0x5F93, 0x8F5D, 0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, + 0x5F9E, 0x9C6E, 0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, + 0x5FA9, 0x959C, 0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, + 0x5FB3, 0x93BF, 0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, + 0x5FBC, 0x9C74, 0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, + 0x5FCC, 0x8AF5, 0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, + 0x5FD8, 0x9659, 0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, + 0x5FDE, 0xFABB, 0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, + 0x5FF0, 0x9CAB, 0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, + 0x5FFB, 0x9C76, 0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, + 0x600F, 0x9C89, 0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, + 0x6016, 0x957C, 0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, + 0x601D, 0x8E76, 0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, + 0x6026, 0x9C88, 0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, + 0x602A, 0x89F6, 0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, + 0x603A, 0x9C8A, 0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, + 0x6046, 0x9C91, 0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, + 0x6050, 0x8BB0, 0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, + 0x605A, 0x9C8B, 0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, + 0x6062, 0x89F8, 0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, + 0x6068, 0x8DA6, 0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, + 0x606C, 0x9C97, 0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, + 0x6075, 0x8C62, 0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, + 0x6084, 0x9C9F, 0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, + 0x608B, 0x9CA5, 0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, + 0x6094, 0x89F7, 0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, + 0x609B, 0x9CA0, 0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, + 0x60A6, 0x8978, 0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, + 0x60B2, 0x94DF, 0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, + 0x60B6, 0x96E3, 0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, + 0x60C5, 0x8FEE, 0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, + 0x60D3, 0x9CA9, 0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, + 0x60DC, 0x90C9, 0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, + 0x60E1, 0x9CA6, 0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, + 0x60F0, 0x91C4, 0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, + 0x60F4, 0x9CB6, 0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, + 0x60FA, 0x9CB7, 0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, + 0x6103, 0x9CB8, 0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, + 0x610D, 0x9CBC, 0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, + 0x6115, 0x9CB1, 0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, + 0x6120, 0xFAC1, 0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, + 0x612C, 0x9CC5, 0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, + 0x613C, 0x9CC4, 0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, + 0x6142, 0x9CC8, 0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, + 0x614A, 0x9CC2, 0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, + 0x614E, 0x9054, 0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, + 0x6159, 0x9CCD, 0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, + 0x6162, 0x969D, 0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, + 0x6168, 0x8A53, 0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, + 0x6170, 0x88D4, 0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, + 0x6175, 0x9CD7, 0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, + 0x6182, 0x974A, 0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, + 0x6190, 0x97F7, 0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, + 0x6198, 0xFAC6, 0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, + 0x61A7, 0x93B2, 0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, + 0x61AE, 0x9CE1, 0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, + 0x61BE, 0x8AB6, 0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, + 0x61C8, 0x9CE6, 0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, + 0x61CC, 0x9CE2, 0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, + 0x61E6, 0x9CED, 0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, + 0x61F7, 0x9CE5, 0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, + 0x61FD, 0x9CF3, 0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, + 0x6208, 0x9CF7, 0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, + 0x620D, 0x9CF9, 0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, + 0x6212, 0x89FA, 0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, + 0x621A, 0x90CA, 0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, + 0x621F, 0x8C81, 0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, + 0x622E, 0x9D43, 0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, + 0x6233, 0x9D46, 0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, + 0x623F, 0x965B, 0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, + 0x6248, 0xE7BB, 0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, + 0x624E, 0x9D48, 0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, + 0x625B, 0x9D4B, 0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, + 0x6268, 0x9D4D, 0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, + 0x6279, 0x94E1, 0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, + 0x6280, 0x8B5A, 0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, + 0x6289, 0x9D50, 0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, + 0x6293, 0x9D53, 0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, + 0x6297, 0x8D52, 0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, + 0x629E, 0x91F0, 0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, + 0x62B1, 0x95F8, 0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, + 0x62BC, 0x899F, 0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, + 0x62C6, 0x9D5D, 0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, + 0x62CA, 0x9D62, 0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, + 0x62D0, 0x89FB, 0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, + 0x62D4, 0x9D55, 0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, + 0x62DB, 0x8FB5, 0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, + 0x62E1, 0x8A67, 0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, + 0x62EF, 0x9D6D, 0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, + 0x62F6, 0x8E41, 0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, + 0x6301, 0x8E9D, 0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, + 0x6309, 0x88C2, 0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, + 0x631F, 0x8BB2, 0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, + 0x632F, 0x9055, 0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, + 0x633F, 0x917D, 0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, + 0x634F, 0x9D73, 0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, + 0x635C, 0x917B, 0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, + 0x636B, 0x9D7E, 0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, + 0x6377, 0x8FB7, 0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, + 0x6383, 0x917C, 0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, + 0x638E, 0x9D75, 0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, + 0x6398, 0x8C40, 0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, + 0x63A1, 0x8DCC, 0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, + 0x63A7, 0x8D54, 0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, + 0x63AB, 0x9D77, 0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, + 0x63B5, 0x9D7D, 0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, + 0x63C3, 0x91B5, 0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, + 0x63CF, 0x9560, 0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, + 0x63DA, 0x9767, 0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, + 0x63E9, 0x9D82, 0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, + 0x63F6, 0x9D88, 0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, + 0x640F, 0x9D93, 0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, + 0x641C, 0x9D72, 0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, + 0x642D, 0x938B, 0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, + 0x643E, 0x8DEF, 0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, + 0x6460, 0xFACA, 0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, + 0x6476, 0x9D96, 0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, + 0x6488, 0x9D9D, 0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, + 0x649A, 0x9451, 0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, + 0x64A5, 0x9D9B, 0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, + 0x64AE, 0x8E42, 0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, + 0x64BB, 0x9DA3, 0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, + 0x64C5, 0x9DA1, 0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, + 0x64D2, 0x9DA0, 0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, + 0x64E0, 0x9DA9, 0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, + 0x64E6, 0x8E43, 0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, + 0x64F1, 0x9DA6, 0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, + 0x64FA, 0x9DB2, 0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, + 0x6505, 0x9DB7, 0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, + 0x6523, 0x9DB9, 0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, + 0x652C, 0x9DAE, 0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, + 0x6536, 0x9DBE, 0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, + 0x653B, 0x8D55, 0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, + 0x6548, 0x9DC1, 0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, + 0x6551, 0x8B7E, 0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, + 0x6558, 0x9DC5, 0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, + 0x6562, 0x8AB8, 0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, + 0x6570, 0x9094, 0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, + 0x6577, 0x957E, 0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, + 0x6587, 0x95B6, 0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, + 0x658E, 0x8DD6, 0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, + 0x6599, 0x97BF, 0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, + 0x65A1, 0x88B4, 0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, + 0x65AB, 0x9DCF, 0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, + 0x65B0, 0x9056, 0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, + 0x65BD, 0x8E7B, 0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, + 0x65C5, 0x97B7, 0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, + 0x65CF, 0x91B0, 0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, + 0x65DB, 0x9DD7, 0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, + 0x65E5, 0x93FA, 0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, + 0x65E9, 0x9181, 0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, + 0x65FA, 0x89A0, 0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, + 0x6603, 0x9DDE, 0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, + 0x660A, 0x9DDD, 0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, + 0x6613, 0x88D5, 0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, + 0x661E, 0xFAD3, 0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, + 0x6625, 0x8F74, 0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, + 0x662E, 0xFAD2, 0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, + 0x6635, 0x9DE1, 0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, + 0x663F, 0x9E45, 0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, + 0x6644, 0x9DE6, 0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, + 0x6652, 0x8E4E, 0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, + 0x665E, 0x9DE9, 0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, + 0x6665, 0xFAD5, 0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, + 0x6669, 0x94D3, 0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, + 0x6673, 0xFAD9, 0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, + 0x6681, 0x8BC5, 0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, + 0x6688, 0x9DF2, 0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, + 0x6696, 0x9267, 0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, + 0x669D, 0x9DF7, 0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, + 0x66AB, 0x8E62, 0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, + 0x66B8, 0x9E41, 0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, + 0x66BF, 0xFADD, 0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, + 0x66C9, 0x9DFA, 0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, + 0x66DC, 0x976A, 0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, + 0x66E9, 0x9E47, 0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, + 0x66F4, 0x8D58, 0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, + 0x66F9, 0x9182, 0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, + 0x66FD, 0x915D, 0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, + 0x6703, 0x98F0, 0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, + 0x670D, 0x959E, 0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, + 0x6715, 0x92BD, 0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, + 0x671D, 0x92A9, 0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, + 0x6727, 0x9E4F, 0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, + 0x672C, 0x967B, 0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, + 0x6734, 0x9670, 0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, + 0x673A, 0x8AF7, 0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, + 0x6746, 0x9E57, 0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, + 0x6750, 0x8DDE, 0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, + 0x6759, 0x9E5A, 0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, + 0x6760, 0x9E59, 0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, + 0x6764, 0x9E5C, 0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, + 0x676D, 0x8D59, 0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, + 0x6772, 0x9DDC, 0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, + 0x677C, 0x9E60, 0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, + 0x6787, 0x94F8, 0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, + 0x6790, 0x90CD, 0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, + 0x679C, 0x89CA, 0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, + 0x67A2, 0x9095, 0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, + 0x67B3, 0x9E6B, 0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, + 0x67B8, 0x9E6D, 0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, + 0x67C1, 0x91C6, 0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, + 0x67CE, 0x9E74, 0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, + 0x67D3, 0x90F5, 0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, + 0x67DD, 0x9E70, 0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, + 0x67E7, 0x9E76, 0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, + 0x67EF, 0x9E68, 0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, + 0x67F5, 0x8DF2, 0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, + 0x6801, 0xFAE5, 0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, + 0x6813, 0x90F0, 0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, + 0x6821, 0x8D5A, 0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, + 0x682B, 0x9E81, 0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, + 0x6839, 0x8DAA, 0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, + 0x6841, 0x8C85, 0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, + 0x6846, 0x9E79, 0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, + 0x6850, 0x8BCB, 0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, + 0x6854, 0x8B6A, 0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, + 0x685F, 0x8E56, 0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, + 0x6876, 0x89B1, 0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, + 0x6881, 0x97C0, 0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, + 0x688F, 0x9E87, 0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, + 0x689B, 0x9E8B, 0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, + 0x68A2, 0x8FBD, 0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, + 0x68AD, 0x9E88, 0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, + 0x68B3, 0x9E80, 0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, + 0x68BA, 0x9E92, 0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, + 0x68C8, 0xFA64, 0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, + 0x68CD, 0x9E9E, 0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, + 0x68D5, 0x9EA1, 0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, + 0x68DF, 0x938F, 0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, + 0x68E7, 0x9EA0, 0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, + 0x68F9, 0x9EA8, 0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, + 0x6904, 0x9EA4, 0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, + 0x690C, 0x9E9D, 0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, + 0x6912, 0x9EA3, 0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, + 0x691C, 0x8C9F, 0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, + 0x6925, 0x9EA7, 0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, + 0x6930, 0x9EBD, 0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, + 0x693D, 0x9EBB, 0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, + 0x6954, 0x9EB6, 0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, + 0x695C, 0x9EB3, 0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, + 0x6961, 0x9EBE, 0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, + 0x696B, 0x9EB5, 0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, + 0x6973, 0x9480, 0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, + 0x6978, 0x9EB4, 0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, + 0x697E, 0x9EB7, 0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, + 0x698E, 0x897C, 0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, + 0x6998, 0xFAEB, 0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, + 0x69A7, 0x9ED0, 0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, + 0x69B4, 0x9ED6, 0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, + 0x69C1, 0x9EC7, 0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, + 0x69CB, 0x8D5C, 0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, + 0x69D0, 0x9EC5, 0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, + 0x69DD, 0x9ECD, 0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, + 0x69E8, 0x9ED8, 0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, + 0x69F9, 0x9EDD, 0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, + 0x6A02, 0x9ED9, 0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, + 0x6A0C, 0x9EEC, 0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, + 0x6A17, 0x9294, 0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, + 0x6A1F, 0x8FBE, 0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, + 0x6A29, 0x8CA0, 0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, + 0x6A30, 0xFAED, 0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, + 0x6A39, 0x8EF7, 0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, + 0x6A46, 0xFAEF, 0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, + 0x6A58, 0x8B6B, 0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, + 0x6A62, 0x9EF1, 0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, + 0x6A73, 0xFAF0, 0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, + 0x6A80, 0x9268, 0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, + 0x6A90, 0x9EF7, 0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, + 0x6AA2, 0x9EFB, 0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, + 0x6AAE, 0x9E8D, 0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, + 0x6AC1, 0x9EE8, 0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, + 0x6AD3, 0x9845, 0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, + 0x6ADF, 0x9F4A, 0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, + 0x6AEA, 0x9F4D, 0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, + 0x6B05, 0x9F4F, 0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, + 0x6B1D, 0x8954, 0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, + 0x6B23, 0x8BD3, 0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, + 0x6B38, 0x9F56, 0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, + 0x6B3E, 0x8ABC, 0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, + 0x6B4C, 0x89CC, 0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, + 0x6B54, 0x9F60, 0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, + 0x6B61, 0x9F63, 0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, + 0x6B66, 0x9590, 0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, + 0x6B73, 0x8DCE, 0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, + 0x6B7B, 0x8E80, 0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, + 0x6B84, 0x9F68, 0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, + 0x6B8B, 0x8E63, 0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, + 0x6B98, 0x9F6B, 0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, + 0x6BAB, 0x9F70, 0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, + 0x6BB3, 0x9F74, 0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, + 0x6BBA, 0x8E45, 0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, + 0x6BC0, 0x9ACA, 0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, + 0x6BCD, 0x95EA, 0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, + 0x6BD4, 0x94E4, 0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, + 0x6BDF, 0x9F7A, 0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, + 0x6BF3, 0x9F7D, 0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, + 0x6C13, 0x9F82, 0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, + 0x6C23, 0x9F86, 0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, + 0x6C38, 0x8969, 0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, + 0x6C41, 0x8F60, 0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, + 0x6C55, 0x9F88, 0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, + 0x6C5D, 0x93F0, 0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, + 0x6C62, 0x9F89, 0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, + 0x6C70, 0x91BF, 0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, + 0x6C7D, 0x8B44, 0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, + 0x6C83, 0x9780, 0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, + 0x6C8D, 0x9F8C, 0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, + 0x6C96, 0x89AB, 0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, + 0x6CA1, 0x9676, 0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, + 0x6CB1, 0x9F9D, 0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, + 0x6CBA, 0x9F9F, 0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, + 0x6CBE, 0x9F9E, 0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, + 0x6CC5, 0x9F9A, 0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, + 0x6CD3, 0x9F97, 0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, + 0x6CDA, 0xFAF9, 0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, + 0x6CE2, 0x9467, 0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, + 0x6CEA, 0x9FA3, 0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, + 0x6CF3, 0x896A, 0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, + 0x6D12, 0x9FAD, 0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, + 0x6D1E, 0x93B4, 0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, + 0x6D2A, 0x8D5E, 0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, + 0x6D35, 0x9FAB, 0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, + 0x6D3D, 0x9FA8, 0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, + 0x6D45, 0x90F3, 0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, + 0x6D63, 0x9FAF, 0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, + 0x6D6A, 0x9851, 0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, + 0x6D74, 0x9781, 0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, + 0x6D85, 0x9FB8, 0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, + 0x6D8E, 0x9FB5, 0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, + 0x6D99, 0x97DC, 0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, + 0x6DAF, 0x8A55, 0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, + 0x6DBC, 0x97C1, 0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, + 0x6DC7, 0x9FBD, 0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, + 0x6DD1, 0x8F69, 0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, + 0x6DD9, 0x9FC8, 0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, + 0x6DE6, 0x9FBE, 0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, + 0x6DEC, 0x9FC1, 0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, + 0x6DF3, 0x8F7E, 0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, + 0x6DF9, 0x9FB9, 0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, + 0x6E05, 0x90B4, 0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, + 0x6E0A, 0x9FBB, 0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, + 0x6E19, 0x9FD0, 0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, + 0x6E1F, 0x9FD9, 0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, + 0x6E24, 0x9FDD, 0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, + 0x6E29, 0x89B7, 0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, + 0x6E2E, 0x9FCF, 0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, + 0x6E3A, 0x9FDB, 0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, + 0x6E4A, 0x96A9, 0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, + 0x6E58, 0x8FC3, 0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, + 0x6E67, 0x974E, 0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, + 0x6E72, 0x9FD1, 0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, + 0x6E80, 0x969E, 0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, + 0x6E90, 0x8CB9, 0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, + 0x6E9D, 0x8D61, 0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, + 0x6EAA, 0x9FE2, 0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, + 0x6EB7, 0x9FE5, 0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, + 0x6EC2, 0x9FEF, 0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, + 0x6ECB, 0x8EA0, 0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, + 0x6ED4, 0x9FEB, 0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, + 0x6EEC, 0x9FF4, 0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, + 0x6EF7, 0xE042, 0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, + 0x6F01, 0x8B99, 0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, + 0x6F0F, 0x9852, 0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, + 0x6F15, 0x9186, 0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, + 0x6F2B, 0x969F, 0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, + 0x6F38, 0x9151, 0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, + 0x6F45, 0x8AC1, 0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, + 0x6F5C, 0x90F6, 0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, + 0x6F6D, 0xE04B, 0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, + 0x6F74, 0xE06B, 0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, + 0x6F80, 0xE047, 0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, + 0x6F86, 0xE043, 0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, + 0x6F97, 0x8AC0, 0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, + 0x6FAA, 0xE059, 0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, + 0x6FB9, 0xE057, 0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, + 0x6FC3, 0x945A, 0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, + 0x6FD8, 0xE05E, 0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, + 0x6FE1, 0x9447, 0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, + 0x6FEE, 0xE060, 0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, + 0x6FF5, 0xFB4D, 0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, + 0x7001, 0xE066, 0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, + 0x700B, 0xE063, 0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, + 0x7018, 0xE06D, 0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, + 0x701E, 0x93D2, 0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, + 0x7028, 0xFB50, 0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, + 0x703E, 0xE070, 0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, + 0x7063, 0xE073, 0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, + 0x7078, 0x8B84, 0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, + 0x7089, 0x9846, 0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, + 0x7099, 0xE074, 0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, + 0x70AE, 0xE07B, 0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, + 0x70B9, 0x935F, 0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, + 0x70CB, 0xE07D, 0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, + 0x70DF, 0xE07C, 0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, + 0x7104, 0xFB54, 0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, + 0x7119, 0xE084, 0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, + 0x7126, 0x8FC5, 0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, + 0x7147, 0xFB57, 0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, + 0x7155, 0xE086, 0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, + 0x7162, 0xE089, 0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, + 0x7167, 0x8FC6, 0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, + 0x717D, 0x90F8, 0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, + 0x718F, 0xE08D, 0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, + 0x719F, 0x8F6E, 0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, + 0x71B9, 0xE094, 0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, + 0x71C8, 0x9395, 0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, + 0x71D2, 0xE096, 0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, + 0x71DF, 0x9A7A, 0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, + 0x71E7, 0xE09C, 0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, + 0x71F5, 0xE09D, 0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, + 0x71FE, 0xFB5A, 0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, + 0x7210, 0xE0A2, 0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, + 0x722C, 0xE0A6, 0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, + 0x7235, 0x8EDD, 0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, + 0x723C, 0xE0AA, 0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, + 0x7240, 0xE0AC, 0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, + 0x724B, 0xE0AE, 0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, + 0x7259, 0x89E5, 0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, + 0x7261, 0x89B2, 0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, + 0x7272, 0x90B5, 0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, + 0x727E, 0xE0B1, 0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, + 0x7287, 0xE0B4, 0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, + 0x72A2, 0xE0B7, 0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, + 0x72B1, 0xFB5B, 0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, + 0x72BE, 0xFB5C, 0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, + 0x72C6, 0xE0BC, 0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, + 0x72D7, 0x8BE7, 0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, + 0x72E1, 0xE0C2, 0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, + 0x72ED, 0x8BB7, 0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, + 0x72FC, 0x9854, 0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, + 0x7317, 0xE0C6, 0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, + 0x731F, 0x97C2, 0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, + 0x732A, 0x9296, 0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, + 0x7334, 0xE0CB, 0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, + 0x733F, 0x898E, 0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, + 0x734F, 0xE0D1, 0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, + 0x736A, 0xE0D4, 0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, + 0x7377, 0xFB5F, 0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, + 0x7384, 0x8CBA, 0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, + 0x7396, 0x8BE8, 0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, + 0x73BB, 0xE0DE, 0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, + 0x73C8, 0xE0DB, 0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, + 0x73CE, 0xE0DD, 0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, + 0x73E0, 0x8EEC, 0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, + 0x73ED, 0x94C7, 0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, + 0x73F8, 0xE0E7, 0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, + 0x7406, 0x979D, 0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, + 0x7425, 0xE0E6, 0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, + 0x742E, 0xFB6A, 0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, + 0x7435, 0x94FA, 0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, + 0x7441, 0xE0EE, 0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, + 0x745B, 0x896C, 0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, + 0x7460, 0x97DA, 0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, + 0x7469, 0xE0F0, 0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, + 0x7473, 0x8DBA, 0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, + 0x7489, 0xFB6C, 0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, + 0x74A2, 0xE0E3, 0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, + 0x74CA, 0xE0F9, 0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, + 0x74E0, 0xE140, 0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, + 0x74E7, 0xE142, 0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, + 0x74F1, 0xE147, 0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, + 0x74F8, 0xE148, 0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, + 0x7505, 0xE14C, 0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, + 0x7511, 0x8D99, 0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, + 0x751A, 0x9072, 0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, + 0x7523, 0x8E59, 0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, + 0x752B, 0x95E1, 0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, + 0x7531, 0x9752, 0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, + 0x7538, 0x99B2, 0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, + 0x7544, 0xE156, 0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, + 0x754B, 0x9DC0, 0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, + 0x7551, 0x94A8, 0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, + 0x755B, 0xE15A, 0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, + 0x7562, 0x954C, 0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, + 0x7567, 0xE15F, 0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, + 0x756D, 0xE161, 0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, + 0x7574, 0xE166, 0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, + 0x757F, 0x8B45, 0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, + 0x7589, 0xE168, 0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, + 0x758F, 0x9160, 0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, + 0x759D, 0xE16C, 0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, + 0x75B1, 0xE176, 0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, + 0x75B8, 0xE174, 0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, + 0x75BE, 0x8EBE, 0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, + 0x75C7, 0x8FC7, 0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, + 0x75D4, 0x8EA4, 0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, + 0x75DB, 0x92C9, 0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, + 0x75E9, 0x9189, 0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, + 0x75F4, 0x9273, 0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, + 0x75FF, 0xE17E, 0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, + 0x760D, 0xE187, 0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, + 0x7622, 0xE18D, 0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, + 0x7634, 0xE18F, 0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, + 0x7647, 0xE192, 0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, + 0x7656, 0x95C8, 0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, + 0x7662, 0xE198, 0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, + 0x766A, 0xE19B, 0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, + 0x7676, 0xE1A0, 0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, + 0x767C, 0xE1A2, 0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, + 0x7682, 0xFB70, 0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, + 0x7687, 0x8D63, 0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, + 0x7690, 0x8E48, 0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, + 0x769A, 0xE1AB, 0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, + 0x76A6, 0xFB74, 0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, + 0x76B7, 0xEA89, 0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, + 0x76BF, 0x8E4D, 0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, + 0x76C8, 0x896D, 0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, + 0x76D6, 0xE1B3, 0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, + 0x76DE, 0xE1B5, 0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, + 0x76E4, 0x94D5, 0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, + 0x76EE, 0x96DA, 0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, + 0x76FB, 0xE1BB, 0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, + 0x7707, 0xE1BD, 0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, + 0x770C, 0x8CA7, 0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, + 0x7720, 0x96B0, 0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, + 0x7729, 0xE1BF, 0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, + 0x773C, 0x8AE1, 0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, + 0x775A, 0xE1C8, 0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, + 0x7765, 0xE1CC, 0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, + 0x7779, 0xE1CF, 0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, + 0x778E, 0xE1D0, 0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, + 0x77A5, 0x95CB, 0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, + 0x77B3, 0x93B5, 0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, + 0x77BC, 0xE1D9, 0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, + 0x77CD, 0xE1DD, 0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, + 0x77DC, 0xE1E0, 0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, + 0x77E7, 0x948A, 0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, + 0x77EF, 0x8BB8, 0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, + 0x780C, 0xE1E4, 0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, + 0x7820, 0xE1E7, 0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, + 0x7827, 0x8B6D, 0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, + 0x783F, 0x8D7B, 0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, + 0x7864, 0xFB7A, 0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, + 0x7872, 0x94A1, 0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, + 0x7881, 0x8CE9, 0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, + 0x788D, 0x8A56, 0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, + 0x7895, 0x8DEA, 0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, + 0x78A7, 0x95C9, 0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, + 0x78B5, 0xE1F1, 0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, + 0x78C1, 0x8EA5, 0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, + 0x78CB, 0xE1F6, 0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, + 0x78DA, 0xE241, 0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, + 0x78EF, 0x88E9, 0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, + 0x7907, 0xE244, 0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, + 0x7919, 0xE247, 0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, + 0x792C, 0xE248, 0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, + 0x793E, 0x8ED0, 0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, + 0x7948, 0x8B46, 0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, + 0x7955, 0xE24F, 0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, + 0x795D, 0x8F6A, 0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, + 0x7962, 0x9449, 0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, + 0x7977, 0x9398, 0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, + 0x7981, 0x8BD6, 0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, + 0x798D, 0x89D0, 0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, + 0x799B, 0xFB83, 0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, + 0x79AA, 0xE257, 0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, + 0x79B9, 0xE25A, 0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, + 0x79BF, 0x93C3, 0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, + 0x79CB, 0x8F48, 0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, + 0x79D8, 0x94E9, 0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, + 0x79E4, 0x9489, 0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, + 0x79EC, 0xE25F, 0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, + 0x7A08, 0xE262, 0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, + 0x7A14, 0x96AB, 0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, + 0x7A1A, 0x9274, 0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, + 0x7A2E, 0x8EED, 0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, + 0x7A3B, 0xE26A, 0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, + 0x7A3F, 0x8D65, 0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, + 0x7A46, 0x9673, 0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, + 0x7A4F, 0x89B8, 0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, + 0x7A62, 0xE271, 0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, + 0x7A70, 0xE274, 0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, + 0x7A7A, 0x8BF3, 0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, + 0x7A83, 0x90DE, 0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, + 0x7A93, 0x918B, 0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, + 0x7A98, 0xE27A, 0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, + 0x7AAE, 0x8B87, 0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, + 0x7ABA, 0x894D, 0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, + 0x7AC5, 0xE281, 0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, + 0x7ACB, 0x97A7, 0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, + 0x7AD2, 0x9AF2, 0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, + 0x7ADA, 0xE28C, 0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, + 0x7AE0, 0x8FCD, 0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, + 0x7AE5, 0x93B6, 0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, + 0x7AEB, 0xFB87, 0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, + 0x7AF6, 0x8BA3, 0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, + 0x7AFF, 0x8AC6, 0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, + 0x7B08, 0x8B88, 0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, + 0x7B11, 0x8FCE, 0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, + 0x7B1E, 0xE29A, 0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, + 0x7B28, 0xE29C, 0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, + 0x7B36, 0xE29D, 0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, + 0x7B48, 0x94A4, 0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, + 0x7B4D, 0xE2A1, 0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, + 0x7B52, 0x939B, 0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, + 0x7B65, 0xE2A6, 0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, + 0x7B70, 0xE2A9, 0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, + 0x7B7A, 0xE29F, 0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, + 0x7B8D, 0xE2B0, 0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, + 0x7B95, 0x96A5, 0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, + 0x7B9A, 0xE2B2, 0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, + 0x7B9F, 0xE2AF, 0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, + 0x7BB1, 0x94A0, 0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, + 0x7BC1, 0xE2B9, 0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, + 0x7BC9, 0x927A, 0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, + 0x7BDD, 0xE2BE, 0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, + 0x7BE6, 0xE2C2, 0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, + 0x7BF6, 0xE2CC, 0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, + 0x7C0D, 0xE2CB, 0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, + 0x7C14, 0xE2C1, 0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, + 0x7C23, 0xE2CD, 0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, + 0x7C37, 0xE2D1, 0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, + 0x7C3F, 0x95EB, 0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, + 0x7C4D, 0x90D0, 0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, + 0x7C56, 0xE2DD, 0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, + 0x7C64, 0xE2DC, 0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, + 0x7C75, 0xE2E0, 0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, + 0x7C83, 0xE2E1, 0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, + 0x7C90, 0xE2E2, 0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, + 0x7C98, 0x9453, 0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, + 0x7CA2, 0xE2E5, 0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, + 0x7CA8, 0xE2E8, 0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, + 0x7CB1, 0xE2EB, 0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, + 0x7CBD, 0xE2EE, 0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, + 0x7CC5, 0xE2F0, 0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, + 0x7CD6, 0x939C, 0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, + 0x7CDF, 0x918C, 0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, + 0x7CEF, 0xE2F7, 0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, + 0x7CF8, 0x8E85, 0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, + 0x7D00, 0x8B49, 0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, + 0x7D06, 0xE2FC, 0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, + 0x7D10, 0x9552, 0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, + 0x7D18, 0x8D68, 0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, + 0x7D1C, 0xE341, 0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, + 0x7D2B, 0x8E87, 0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, + 0x7D30, 0x8DD7, 0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, + 0x7D39, 0x8FD0, 0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, + 0x7D43, 0x8CBC, 0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, + 0x7D48, 0xFB8A, 0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, + 0x7D4F, 0xE351, 0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, + 0x7D5C, 0xFB8B, 0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, + 0x7D63, 0xE352, 0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, + 0x7D71, 0x939D, 0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, + 0x7D76, 0x90E2, 0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, + 0x7D8F, 0xE356, 0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, + 0x7D9B, 0xE358, 0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, + 0x7DA2, 0xE361, 0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, + 0x7DAD, 0x88DB, 0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, + 0x7DB1, 0x8D6A, 0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, + 0x7DB7, 0xFB8C, 0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, + 0x7DBD, 0xE35E, 0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, + 0x7DCA, 0x8BD9, 0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, + 0x7DD2, 0x8F8F, 0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, + 0x7DDA, 0x90FC, 0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, + 0x7DE0, 0x92F7, 0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, + 0x7DE9, 0x8AC9, 0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, + 0x7DF4, 0x97FB, 0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, + 0x7E05, 0xE36E, 0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, + 0x7E12, 0xE372, 0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, + 0x7E21, 0xE371, 0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, + 0x7E2B, 0x9644, 0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, + 0x7E35, 0xE37B, 0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, + 0x7E3B, 0xE37A, 0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, + 0x7E43, 0xE37D, 0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, + 0x7E4D, 0x8F4A, 0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, + 0x7E56, 0xE384, 0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, + 0x7E5E, 0xE385, 0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, + 0x7E6A, 0xE389, 0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, + 0x7E7B, 0xE38C, 0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, + 0x7E82, 0x8E5B, 0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, + 0x7E8A, 0xFA5C, 0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, + 0x7E90, 0xE396, 0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, + 0x7E96, 0xE399, 0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, + 0x7F38, 0xE39D, 0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, + 0x7F4C, 0xE3A0, 0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, + 0x7F51, 0xE3A4, 0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, + 0x7F5F, 0xE3A8, 0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, + 0x7F69, 0xE3AB, 0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, + 0x7F70, 0x94B1, 0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, + 0x7F78, 0xE3AD, 0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, + 0x7F85, 0x9785, 0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, + 0x7F8A, 0x9772, 0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, + 0x7F9A, 0xE3B7, 0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, + 0x7FA3, 0xE3B8, 0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, + 0x7FAE, 0xE3BC, 0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, + 0x7FB8, 0xE3BE, 0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, + 0x7FC5, 0xE3C0, 0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, + 0x7FD2, 0x8F4B, 0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, + 0x7FE1, 0xE3C5, 0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, + 0x7FF0, 0x8ACB, 0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, + 0x7FFC, 0x9783, 0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, + 0x8004, 0xE3CC, 0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, + 0x800C, 0x8EA7, 0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, + 0x8017, 0x96D5, 0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, + 0x8021, 0xE3D2, 0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, + 0x803B, 0xE3D5, 0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, + 0x804A, 0xE3D6, 0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, + 0x805A, 0xE3DA, 0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, + 0x8062, 0xE3DC, 0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, + 0x8072, 0xE3DF, 0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, + 0x8077, 0x9045, 0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, + 0x807F, 0xE3E4, 0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, + 0x8087, 0x94A3, 0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, + 0x8093, 0xE3E9, 0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, + 0x809B, 0xE3E8, 0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, + 0x80A5, 0x94EC, 0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, + 0x80AD, 0xE3EB, 0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, + 0x80B4, 0x8DE6, 0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, + 0x80C6, 0x925F, 0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, + 0x80D9, 0xE3F0, 0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, + 0x80DE, 0x9645, 0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, + 0x80EF, 0xE3F6, 0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, + 0x80FC, 0xE445, 0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, + 0x8106, 0x90C6, 0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, + 0x810A, 0x90D2, 0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, + 0x8129, 0xE3F9, 0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, + 0x8139, 0x92AF, 0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, + 0x814E, 0x9074, 0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, + 0x8154, 0x8D6F, 0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, + 0x8166, 0xE449, 0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, + 0x8171, 0xE446, 0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, + 0x817A, 0x9142, 0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, + 0x8183, 0xE44B, 0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, + 0x8193, 0xE455, 0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, + 0x819D, 0x9547, 0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, + 0x81A8, 0x9663, 0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, + 0x81B5, 0xE458, 0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, + 0x81BE, 0xE459, 0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, + 0x81C6, 0x89B0, 0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, + 0x81D1, 0xE461, 0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, + 0x81DA, 0xE465, 0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, + 0x81E5, 0x89E7, 0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, + 0x81ED, 0x8F4C, 0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, + 0x81FB, 0xE46A, 0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, + 0x8202, 0xE46D, 0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, + 0x8209, 0x9DA8, 0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, + 0x820E, 0x8EC9, 0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, + 0x8217, 0x95DC, 0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, + 0x821E, 0x9591, 0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, + 0x822B, 0xE475, 0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, + 0x8235, 0x91C7, 0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, + 0x8239, 0x9144, 0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, + 0x8259, 0xE479, 0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, + 0x8262, 0xE480, 0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, + 0x826A, 0xE482, 0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, + 0x8271, 0xE485, 0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, + 0x8278, 0xE487, 0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, + 0x8292, 0xE48A, 0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, + 0x82A5, 0x8A48, 0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, + 0x82AD, 0x946D, 0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, + 0x82B8, 0x8C7C, 0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, + 0x82C5, 0x8AA1, 0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, + 0x82D4, 0x91DB, 0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, + 0x82DC, 0xE49C, 0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, + 0x82E3, 0xE490, 0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, + 0x82EB, 0x93CF, 0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, + 0x82F9, 0xE499, 0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, + 0x8302, 0x96CE, 0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, + 0x8306, 0xE49B, 0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, + 0x8317, 0xE4AA, 0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, + 0x8328, 0x88EF, 0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, + 0x8332, 0xE4A2, 0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, + 0x8338, 0x91F9, 0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, + 0x8349, 0x9190, 0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, + 0x8352, 0x8D72, 0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, + 0x8375, 0xE4B9, 0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, + 0x837F, 0xFB95, 0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, + 0x838A, 0xE4B5, 0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, + 0x839A, 0xE4AD, 0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, + 0x83A2, 0xE4B0, 0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, + 0x83B1, 0x9789, 0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, + 0x83C5, 0x909B, 0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, + 0x83CE, 0xE4C0, 0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, + 0x83DC, 0x8DD8, 0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, + 0x83EB, 0xE4BF, 0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, + 0x83F2, 0xE4C9, 0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, + 0x83FB, 0xE4D0, 0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, + 0x8407, 0xE4C7, 0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, + 0x840E, 0x88DE, 0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, + 0x8429, 0x948B, 0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, + 0x8435, 0xE4E0, 0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, + 0x8446, 0xE4DC, 0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, + 0x8457, 0x9298, 0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, + 0x8463, 0x939F, 0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, + 0x846C, 0x9192, 0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, + 0x8471, 0x944B, 0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, + 0x847A, 0x9598, 0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, + 0x8490, 0x8F4E, 0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, + 0x849F, 0xE4E5, 0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, + 0x84B4, 0xFB99, 0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, + 0x84BC, 0x9193, 0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, + 0x84C6, 0xE4EC, 0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, + 0x84CD, 0xE4E7, 0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, + 0x84D9, 0xE4E6, 0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, + 0x84EE, 0x9840, 0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, + 0x8500, 0x8EC1, 0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, + 0x8514, 0xE4F7, 0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, + 0x851A, 0x8955, 0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, + 0x852C, 0xE4F4, 0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, + 0x8540, 0xE4F9, 0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, + 0x8549, 0x8FD4, 0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, + 0x8553, 0xFB9A, 0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, + 0x8559, 0xFB9B, 0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, + 0x8569, 0x93A0, 0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, + 0x8577, 0xE550, 0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, + 0x8587, 0xE54E, 0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, + 0x8591, 0xE547, 0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, + 0x859B, 0xE54C, 0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, + 0x85A8, 0xE549, 0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, + 0x85AC, 0x96F2, 0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, + 0x85B9, 0xE556, 0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, + 0x85CD, 0x9795, 0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, + 0x85DC, 0xE55B, 0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, + 0x85E9, 0x94CB, 0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, + 0x85FA, 0xE561, 0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, + 0x8606, 0xE562, 0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, + 0x8613, 0xE55E, 0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, + 0x8622, 0xE563, 0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, + 0x863F, 0xE566, 0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, + 0x8654, 0xE569, 0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, + 0x865E, 0x8BF1, 0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, + 0x8671, 0xE56C, 0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, + 0x868B, 0xE571, 0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, + 0x86A3, 0xE56E, 0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, + 0x86AB, 0xE57A, 0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, + 0x86C4, 0xE575, 0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, + 0x86CB, 0x9260, 0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, + 0x86D9, 0x8A5E, 0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, + 0x86E4, 0x94B8, 0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, + 0x86EE, 0x94D8, 0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, + 0x86FB, 0xE588, 0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, + 0x8703, 0xE587, 0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, + 0x870A, 0xE58D, 0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, + 0x8718, 0x9277, 0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, + 0x8729, 0xE593, 0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, + 0x873F, 0xE58F, 0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, + 0x874E, 0xE599, 0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, + 0x8759, 0xE59E, 0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, + 0x8766, 0x89DA, 0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, + 0x8774, 0xE59A, 0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, + 0x8782, 0xE5A5, 0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, + 0x87AB, 0xE5AC, 0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, + 0x87BB, 0xE5B1, 0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, + 0x87C6, 0xE5B0, 0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, + 0x87D2, 0xE5BB, 0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, + 0x87F6, 0xE5B8, 0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, + 0x87FE, 0xE5B7, 0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, + 0x880E, 0xE5BA, 0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, + 0x8816, 0xE5BD, 0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, + 0x8827, 0xE5C4, 0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, + 0x883B, 0xE5C5, 0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, + 0x8846, 0x8F4F, 0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, + 0x8853, 0x8F70, 0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, + 0x885D, 0x8FD5, 0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, + 0x8863, 0x88DF, 0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, + 0x8872, 0xE5D3, 0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, + 0x887E, 0xE5CE, 0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, + 0x8888, 0x8C55, 0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, + 0x8896, 0x91B3, 0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, + 0x88A2, 0xE5D9, 0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, + 0x88B0, 0xE5DC, 0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, + 0x88B7, 0x88BF, 0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, + 0x88C3, 0xE5DF, 0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, + 0x88D4, 0xE5E1, 0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, + 0x88DC, 0x95E2, 0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, + 0x88E8, 0xE5E9, 0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, + 0x88F5, 0xFBA2, 0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, + 0x88FD, 0x90BB, 0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, + 0x8907, 0x95A1, 0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, + 0x8912, 0x964A, 0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, + 0x891E, 0xE5F0, 0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, + 0x8936, 0xE5F7, 0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, + 0x8943, 0xE5EF, 0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, + 0x8956, 0x89A6, 0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, + 0x8964, 0xE641, 0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, + 0x896F, 0xE644, 0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, + 0x897E, 0xE647, 0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, + 0x8986, 0x95A2, 0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, + 0x898B, 0x8CA9, 0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, + 0x8997, 0x9460, 0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, + 0x89A6, 0xE64F, 0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, + 0x89AC, 0xE650, 0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, + 0x89BA, 0xE653, 0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, + 0x89D2, 0x8A70, 0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, + 0x89E3, 0x89F0, 0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, + 0x89F8, 0xE65C, 0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, + 0x8A08, 0x8C76, 0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, + 0x8A10, 0xE65F, 0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, + 0x8A17, 0x91F5, 0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, + 0x8A1F, 0x8FD7, 0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, + 0x8A2D, 0x90DD, 0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, + 0x8A36, 0xE664, 0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, + 0x8A3C, 0x8FD8, 0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, + 0x8A50, 0x8DBC, 0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, + 0x8A55, 0x955D, 0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, + 0x8A62, 0xE66D, 0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, + 0x8A6B, 0x986C, 0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, + 0x8A70, 0x8B6C, 0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, + 0x8A79, 0xFBA5, 0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, + 0x8A85, 0xE66E, 0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, + 0x8A8D, 0x9446, 0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, + 0x8A98, 0x9755, 0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, + 0x8AA1, 0xE672, 0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, + 0x8AA6, 0xE675, 0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, + 0x8AAD, 0x93C7, 0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, + 0x8ABC, 0x8B62, 0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, + 0x8AC4, 0xE678, 0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, + 0x8ACD, 0xE679, 0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, + 0x8ADA, 0xE67B, 0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, + 0x8ADF, 0xFBA8, 0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, + 0x8AE4, 0xE680, 0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, + 0x8AED, 0x9740, 0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, + 0x8AF6, 0xFBAA, 0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, + 0x8AFE, 0x91F8, 0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, + 0x8B04, 0x93A3, 0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, + 0x8B10, 0xE68D, 0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, + 0x8B19, 0x8CAA, 0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, + 0x8B20, 0xE68F, 0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, + 0x8B2B, 0xE693, 0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, + 0x8B3E, 0xE694, 0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, + 0x8B4E, 0xE699, 0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, + 0x8B58, 0x8EAF, 0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, + 0x8B5F, 0xE69F, 0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, + 0x8B6F, 0xE6A1, 0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, + 0x8B74, 0xE6A2, 0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, + 0x8B80, 0xE6A4, 0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, + 0x8B8E, 0xE6A6, 0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, + 0x8B96, 0xE6A9, 0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, + 0x8C3A, 0xE6AC, 0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, + 0x8C48, 0xE6AF, 0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, + 0x8C50, 0xE6B2, 0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, + 0x8C62, 0xE6B4, 0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, + 0x8C78, 0xE6B6, 0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, + 0x8C82, 0xE6B8, 0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, + 0x8C8C, 0x9665, 0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, + 0x8C98, 0xE6C0, 0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, + 0x8CA1, 0x8DE0, 0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, + 0x8CA9, 0x94CC, 0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, + 0x8CAD, 0xE6C2, 0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, + 0x8CB2, 0xE6C5, 0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, + 0x8CB7, 0x9483, 0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, + 0x8CBD, 0xE6C4, 0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, + 0x8CC2, 0x9847, 0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, + 0x8CC8, 0xE6C9, 0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, + 0x8CD1, 0x93F6, 0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, + 0x8CDC, 0x8E92, 0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, + 0x8CE3, 0xE6CC, 0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, + 0x8CED, 0x9371, 0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, + 0x8CFB, 0xE6D0, 0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, + 0x8D05, 0xE6D2, 0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, + 0x8D0B, 0x8AE4, 0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, + 0x8D12, 0xFBAF, 0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, + 0x8D64, 0x90D4, 0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, + 0x8D6D, 0xE6DE, 0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, + 0x8D74, 0x958B, 0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, + 0x8D85, 0x92B4, 0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, + 0x8DA8, 0x9096, 0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, + 0x8DC2, 0xE6E3, 0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, + 0x8DD6, 0xE6E8, 0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, + 0x8DDF, 0xE6EE, 0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, + 0x8DEA, 0xE6EC, 0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, + 0x8DF5, 0x9148, 0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, + 0x8E09, 0xE6F2, 0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, + 0x8E1D, 0xE6F4, 0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, + 0x8E30, 0xE6FA, 0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, + 0x8E44, 0x92FB, 0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, + 0x8E4A, 0xE6FC, 0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, + 0x8E59, 0xE745, 0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, + 0x8E64, 0xE746, 0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, + 0x8E7C, 0xE74D, 0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, + 0x8E87, 0xE74F, 0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, + 0x8E91, 0xE755, 0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, + 0x8EA1, 0xE759, 0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, + 0x8EAF, 0x8BEB, 0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, + 0x8EC5, 0xE75F, 0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, + 0x8ECB, 0xE761, 0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, + 0x8ED2, 0x8CAC, 0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, + 0x8EE3, 0xE763, 0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, + 0x8EFC, 0xE764, 0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, + 0x8F05, 0xE769, 0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, + 0x8F12, 0xE76B, 0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, + 0x8F19, 0xE76C, 0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, + 0x8F1F, 0xE76F, 0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, + 0x8F2F, 0x8F53, 0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, + 0x8F3B, 0xE774, 0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, + 0x8F44, 0x8A8D, 0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, + 0x8F4C, 0xE779, 0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, + 0x8F5C, 0xE77E, 0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, + 0x8F63, 0xE781, 0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, + 0x8F9E, 0x8EAB, 0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, + 0x8FA8, 0x999E, 0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, + 0x8FB0, 0x9243, 0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, + 0x8FBA, 0x95D3, 0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, + 0x8FC2, 0x8949, 0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, + 0x8FD1, 0x8BDF, 0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, + 0x8FE5, 0xE78A, 0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, + 0x8FEB, 0x9497, 0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, + 0x8FF4, 0xE78F, 0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, + 0x8FFA, 0xE792, 0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, + 0x9003, 0x93A6, 0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, + 0x900D, 0xE796, 0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, + 0x9011, 0xE793, 0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, + 0x9016, 0xE798, 0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, + 0x901D, 0x90C0, 0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, + 0x9021, 0xE795, 0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, + 0x902E, 0x91DF, 0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, + 0x9036, 0xE79B, 0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, + 0x903E, 0xE7A5, 0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, + 0x9047, 0x8BF6, 0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, + 0x904D, 0x95D5, 0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, + 0x9051, 0xE7A1, 0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, + 0x9055, 0x88E1, 0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, + 0x905C, 0x91BB, 0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, + 0x9063, 0x8CAD, 0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, + 0x9069, 0x934B, 0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, + 0x9072, 0xE7AD, 0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, + 0x9078, 0x9149, 0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, + 0x907F, 0x94F0, 0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, + 0x9083, 0xE284, 0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, + 0x908A, 0xE7B2, 0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, + 0x90A6, 0x964D, 0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, + 0x90B1, 0xE7B7, 0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, + 0x90CA, 0x8D78, 0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, + 0x90E1, 0x8C53, 0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, + 0x90ED, 0x8A73, 0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, + 0x9102, 0xE7BD, 0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, + 0x9127, 0xFBB9, 0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, + 0x9149, 0x93D1, 0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, + 0x914D, 0x947A, 0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, + 0x9156, 0xE7C3, 0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, + 0x9165, 0xE7C6, 0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, + 0x9172, 0xE7C9, 0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, + 0x9178, 0x8E5F, 0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, + 0x918B, 0xE7CA, 0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, + 0x9197, 0x94AE, 0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, + 0x91AA, 0xE7D0, 0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, + 0x91B5, 0xE7D1, 0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, + 0x91C1, 0xE7D5, 0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, + 0x91C9, 0xE7D6, 0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, + 0x91CE, 0x96EC, 0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, + 0x91D6, 0xE7D9, 0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, + 0x91DB, 0xE7DC, 0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, + 0x91DF, 0xE7DA, 0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, + 0x91E5, 0xFBC0, 0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, + 0x91EE, 0xFBBE, 0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, + 0x91FF, 0xE7E1, 0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, + 0x920E, 0x8A62, 0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, + 0x9215, 0xE7E4, 0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, + 0x9234, 0x97E9, 0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, + 0x923C, 0xFBC6, 0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, + 0x9245, 0xE7E8, 0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, + 0x924E, 0xFBC7, 0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, + 0x9259, 0xFBC8, 0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, + 0x9262, 0x94AB, 0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, + 0x9271, 0x8D7A, 0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, + 0x9280, 0x8BE2, 0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, + 0x9291, 0x914C, 0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, + 0x9298, 0x96C1, 0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, + 0x92A7, 0xFBCC, 0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, + 0x92CF, 0xE7F5, 0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, + 0x92D5, 0xFBD4, 0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, + 0x92E4, 0x8F9B, 0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, + 0x92ED, 0x8973, 0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, + 0x92F9, 0xFA65, 0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, + 0x92FF, 0xFBDC, 0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, + 0x9310, 0x908D, 0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, + 0x931D, 0xFBDD, 0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, + 0x9322, 0xE841, 0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, + 0x9328, 0x9564, 0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, + 0x932F, 0x8DF6, 0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, + 0x933B, 0xE846, 0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, + 0x934D, 0x9374, 0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, + 0x935B, 0x9262, 0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, + 0x936E, 0xE84A, 0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, + 0x937E, 0x8FDF, 0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, + 0x9397, 0x9199, 0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, + 0x93AC, 0xE84D, 0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, + 0x93B9, 0xE850, 0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, + 0x93D0, 0xE858, 0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, + 0x93D8, 0xE855, 0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, + 0x93E4, 0xE85A, 0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, + 0x9403, 0xE85E, 0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, + 0x9414, 0xE85C, 0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, + 0x9421, 0xE864, 0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, + 0x9436, 0xE861, 0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, + 0x9444, 0xE868, 0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, + 0x9452, 0xE867, 0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, + 0x945E, 0xE86C, 0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, + 0x9470, 0xE86F, 0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, + 0x947D, 0xE872, 0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, + 0x9577, 0x92B7, 0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, + 0x9587, 0xE879, 0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, + 0x958F, 0x895B, 0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, + 0x9594, 0xE87B, 0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, + 0x95A0, 0xE880, 0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, + 0x95A5, 0x94B4, 0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, + 0x95B2, 0x897B, 0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, + 0x95BE, 0xE887, 0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, + 0x95CC, 0xE88C, 0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, + 0x95D6, 0xE88F, 0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, + 0x95E2, 0xE893, 0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, + 0x9628, 0xE895, 0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, + 0x9632, 0x9668, 0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, + 0x9642, 0xE898, 0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, + 0x964D, 0x8D7E, 0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, + 0x965C, 0xE89D, 0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, + 0x9662, 0x8940, 0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, + 0x9666, 0xE8A1, 0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, + 0x9672, 0xE8A2, 0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, + 0x9677, 0xE89C, 0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, + 0x9685, 0x8BF7, 0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, + 0x968B, 0xE440, 0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, + 0x9694, 0x8A75, 0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, + 0x9699, 0x8C84, 0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, + 0x96A0, 0x8942, 0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, + 0x96AA, 0xE8A8, 0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, + 0x96B2, 0xE8AB, 0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, + 0x96B8, 0xE8AF, 0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, + 0x96C0, 0x909D, 0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, + 0x96C6, 0x8F57, 0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, + 0x96CC, 0x8E93, 0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, + 0x96D5, 0xE8B8, 0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, + 0x96DC, 0xE8B6, 0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, + 0x96EA, 0x90E1, 0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, + 0x96F6, 0x97EB, 0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, + 0x9700, 0x8EF9, 0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, + 0x9708, 0xE8BC, 0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, + 0x970F, 0xE8C0, 0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, + 0x9719, 0xE8C2, 0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, + 0x9727, 0x96B6, 0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, + 0x9733, 0xFBED, 0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, + 0x973D, 0xE8C7, 0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, + 0x9744, 0xE8C9, 0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, + 0x974D, 0xFBF0, 0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, + 0x9755, 0xFBF3, 0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, + 0x975E, 0x94F1, 0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, + 0x9764, 0xE8D0, 0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, + 0x976B, 0xE8D4, 0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, + 0x9779, 0xE8D6, 0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, + 0x9784, 0x8A93, 0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, + 0x978D, 0x88C6, 0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, + 0x979C, 0xE8DF, 0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, + 0x97A8, 0xE8E0, 0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, + 0x97B4, 0xE8E4, 0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, + 0x97CB, 0xE8E8, 0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, + 0x97EE, 0x9442, 0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, + 0x97F6, 0xE8EE, 0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, + 0x9802, 0x92B8, 0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, + 0x9808, 0x907B, 0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, + 0x9811, 0x8AE6, 0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, + 0x9818, 0x97CC, 0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, + 0x982C, 0x966A, 0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, + 0x9838, 0xE8F2, 0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, + 0x9846, 0xE8F7, 0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, + 0x984E, 0x8A7B, 0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, + 0x9857, 0xFBF4, 0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, + 0x9865, 0xFBF5, 0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, + 0x9870, 0xE8FC, 0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, + 0x98A8, 0x9597, 0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, + 0x98B6, 0xE946, 0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, + 0x98DB, 0x94F2, 0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, + 0x98E9, 0xE94A, 0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, + 0x98EF, 0x94D1, 0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, + 0x98FD, 0x964F, 0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, + 0x9909, 0xE94D, 0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, + 0x9912, 0xE94E, 0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, + 0x991D, 0xE952, 0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, + 0x9924, 0xE954, 0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, + 0x992E, 0xE957, 0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, + 0x9945, 0xE95C, 0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, + 0x9950, 0xE95D, 0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, + 0x9957, 0x8BC0, 0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, + 0x9999, 0x8D81, 0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, + 0x99AC, 0x946E, 0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, + 0x99B4, 0x93E9, 0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, + 0x99C5, 0x8977, 0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, + 0x99D1, 0xE96D, 0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, + 0x99DB, 0xE96A, 0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, + 0x99ED, 0xE96E, 0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, + 0x99F8, 0xE973, 0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, + 0x9A05, 0xE976, 0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, + 0x9A13, 0x8CB1, 0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, + 0x9A30, 0x93AB, 0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, + 0x9A42, 0xE97C, 0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, + 0x9A4E, 0xFBFB, 0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, + 0x9A5B, 0xE983, 0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, + 0x9A65, 0xE987, 0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, + 0x9AA8, 0x8D9C, 0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, + 0x9ABC, 0xE98E, 0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, + 0x9AD1, 0xE991, 0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, + 0x9AD9, 0xFBFC, 0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, + 0x9AE2, 0xE996, 0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, + 0x9AEB, 0xE99A, 0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, + 0x9AF1, 0xE99D, 0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, + 0x9B06, 0xE9A0, 0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, + 0x9B22, 0xE9A4, 0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, + 0x9B28, 0xE9A8, 0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, + 0x9B2F, 0xE9AC, 0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, + 0x9B3C, 0x8B53, 0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, + 0x9B44, 0xE9AE, 0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, + 0x9B4F, 0xE9B0, 0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, + 0x9B5A, 0x8B9B, 0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, + 0x9B75, 0xFC41, 0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, + 0x9B91, 0xE9B8, 0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, + 0x9B97, 0xE9BA, 0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, + 0x9BAA, 0x968E, 0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, + 0x9BB1, 0xFC44, 0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, + 0x9BC0, 0xE9BF, 0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, + 0x9BCF, 0xE9C3, 0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, + 0x9BD6, 0x8E49, 0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, + 0x9BE3, 0xE9C6, 0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, + 0x9BF1, 0xE9CD, 0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, + 0x9C04, 0xE9D8, 0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, + 0x9C0A, 0xE9D7, 0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, + 0x9C12, 0xE9D6, 0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, + 0x9C1B, 0xE9DA, 0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, + 0x9C2D, 0x9568, 0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, + 0x9C32, 0xE9E0, 0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, + 0x9C3E, 0xE9E2, 0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, + 0x9C52, 0x9690, 0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, + 0x9C67, 0xE9E5, 0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, + 0x9CE7, 0xE9E8, 0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, + 0x9CF0, 0xE9EA, 0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, + 0x9D03, 0xE9EE, 0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, + 0x9D09, 0xE9EB, 0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, + 0x9D1B, 0x8995, 0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, + 0x9D28, 0x8A9B, 0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, + 0x9D3B, 0x8D83, 0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, + 0x9D44, 0xE9F5, 0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, + 0x9D51, 0xEA43, 0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, + 0x9D5E, 0xEA41, 0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, + 0x9D6B, 0xFC48, 0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, + 0x9D72, 0xEA46, 0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, + 0x9D8F, 0x8C7B, 0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, + 0x9DAB, 0xEA49, 0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, + 0x9DB8, 0xEA53, 0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, + 0x9DC2, 0xEA57, 0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, + 0x9DD3, 0xEA59, 0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, + 0x9DEF, 0xEA5D, 0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, + 0x9DFA, 0x8DEB, 0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, + 0x9E1B, 0xEA60, 0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, + 0x9E79, 0xEA63, 0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, + 0x9E88, 0xEA66, 0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, + 0x9E92, 0xEA69, 0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, + 0x9E9D, 0xEA6C, 0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, + 0x9EA9, 0xEA6E, 0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, + 0x9EB9, 0x8D8D, 0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, + 0x9EBE, 0x9F80, 0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, + 0x9ECD, 0x8B6F, 0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, + 0x9ED1, 0xFC4B, 0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, + 0x9ED9, 0x96D9, 0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, + 0x9EDE, 0xEA79, 0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, + 0x9EEF, 0xEA7E, 0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, + 0x9EF9, 0xEA83, 0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, + 0x9F07, 0xEA87, 0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, + 0x9F15, 0xEA8A, 0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, + 0x9F3B, 0x9540, 0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, + 0x9F4E, 0xE6D8, 0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, + 0x9F5F, 0xEA92, 0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, + 0x9F63, 0xEA91, 0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, + 0x9F6C, 0xEA97, 0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, + 0x9F8D, 0x97B4, 0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, + 0x9FA0, 0xEA9E, 0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, + 0xFA0F, 0xFA9B, 0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, + 0xFA13, 0xFAE8, 0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, + 0xFA17, 0xFB75, 0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, + 0xFA1B, 0xFB82, 0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, + 0xFA1F, 0xFB9D, 0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, + 0xFA23, 0xFBB1, 0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, + 0xFA27, 0xFBD3, 0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, + 0xFA2B, 0xFBF7, 0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, + 0xFF02, 0xFA57, 0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, + 0xFF06, 0x8195, 0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, + 0xFF0A, 0x8196, 0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, + 0xFF0E, 0x8144, 0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, + 0xFF12, 0x8251, 0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, + 0xFF16, 0x8255, 0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, + 0xFF1A, 0x8146, 0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, + 0xFF1E, 0x8184, 0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, + 0xFF22, 0x8261, 0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, + 0xFF26, 0x8265, 0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, + 0xFF2A, 0x8269, 0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, + 0xFF2E, 0x826D, 0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, + 0xFF32, 0x8271, 0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, + 0xFF36, 0x8275, 0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, + 0xFF3A, 0x8279, 0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, + 0xFF3E, 0x814F, 0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, + 0xFF42, 0x8282, 0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, + 0xFF46, 0x8286, 0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, + 0xFF4A, 0x828A, 0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, + 0xFF4E, 0x828E, 0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, + 0xFF52, 0x8292, 0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, + 0xFF56, 0x8296, 0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, + 0xFF5A, 0x829A, 0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, + 0xFF5E, 0x8160, 0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, + 0xFF64, 0x00A4, 0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, + 0xFF68, 0x00A8, 0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, + 0xFF6C, 0x00AC, 0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, + 0xFF70, 0x00B0, 0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, + 0xFF74, 0x00B4, 0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, + 0xFF78, 0x00B8, 0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, + 0xFF7C, 0x00BC, 0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, + 0xFF80, 0x00C0, 0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, + 0xFF84, 0x00C4, 0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, + 0xFF88, 0x00C8, 0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, + 0xFF8C, 0x00CC, 0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, + 0xFF90, 0x00D0, 0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, + 0xFF94, 0x00D4, 0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, + 0xFF98, 0x00D8, 0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, + 0xFF9C, 0x00DC, 0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, + 0xFFE0, 0x8191, 0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, + 0xFFE4, 0xFA55, 0xFFE5, 0x818F, 0, 0 +}; + +#if !_TINY_TABLE +static +const WCHAR sjis2uni[] = { +/* SJIS - Unicode, SJIS - Unicode, SJIS - Unicode, SJIS - Unicode, */ + 0x00A1, 0xFF61, 0x00A2, 0xFF62, 0x00A3, 0xFF63, 0x00A4, 0xFF64, + 0x00A5, 0xFF65, 0x00A6, 0xFF66, 0x00A7, 0xFF67, 0x00A8, 0xFF68, + 0x00A9, 0xFF69, 0x00AA, 0xFF6A, 0x00AB, 0xFF6B, 0x00AC, 0xFF6C, + 0x00AD, 0xFF6D, 0x00AE, 0xFF6E, 0x00AF, 0xFF6F, 0x00B0, 0xFF70, + 0x00B1, 0xFF71, 0x00B2, 0xFF72, 0x00B3, 0xFF73, 0x00B4, 0xFF74, + 0x00B5, 0xFF75, 0x00B6, 0xFF76, 0x00B7, 0xFF77, 0x00B8, 0xFF78, + 0x00B9, 0xFF79, 0x00BA, 0xFF7A, 0x00BB, 0xFF7B, 0x00BC, 0xFF7C, + 0x00BD, 0xFF7D, 0x00BE, 0xFF7E, 0x00BF, 0xFF7F, 0x00C0, 0xFF80, + 0x00C1, 0xFF81, 0x00C2, 0xFF82, 0x00C3, 0xFF83, 0x00C4, 0xFF84, + 0x00C5, 0xFF85, 0x00C6, 0xFF86, 0x00C7, 0xFF87, 0x00C8, 0xFF88, + 0x00C9, 0xFF89, 0x00CA, 0xFF8A, 0x00CB, 0xFF8B, 0x00CC, 0xFF8C, + 0x00CD, 0xFF8D, 0x00CE, 0xFF8E, 0x00CF, 0xFF8F, 0x00D0, 0xFF90, + 0x00D1, 0xFF91, 0x00D2, 0xFF92, 0x00D3, 0xFF93, 0x00D4, 0xFF94, + 0x00D5, 0xFF95, 0x00D6, 0xFF96, 0x00D7, 0xFF97, 0x00D8, 0xFF98, + 0x00D9, 0xFF99, 0x00DA, 0xFF9A, 0x00DB, 0xFF9B, 0x00DC, 0xFF9C, + 0x00DD, 0xFF9D, 0x00DE, 0xFF9E, 0x00DF, 0xFF9F, 0x8140, 0x3000, + 0x8141, 0x3001, 0x8142, 0x3002, 0x8143, 0xFF0C, 0x8144, 0xFF0E, + 0x8145, 0x30FB, 0x8146, 0xFF1A, 0x8147, 0xFF1B, 0x8148, 0xFF1F, + 0x8149, 0xFF01, 0x814A, 0x309B, 0x814B, 0x309C, 0x814C, 0x00B4, + 0x814D, 0xFF40, 0x814E, 0x00A8, 0x814F, 0xFF3E, 0x8150, 0xFFE3, + 0x8151, 0xFF3F, 0x8152, 0x30FD, 0x8153, 0x30FE, 0x8154, 0x309D, + 0x8155, 0x309E, 0x8156, 0x3003, 0x8157, 0x4EDD, 0x8158, 0x3005, + 0x8159, 0x3006, 0x815A, 0x3007, 0x815B, 0x30FC, 0x815C, 0x2015, + 0x815D, 0x2010, 0x815E, 0xFF0F, 0x815F, 0xFF3C, 0x8160, 0xFF5E, + 0x8161, 0x2225, 0x8162, 0xFF5C, 0x8163, 0x2026, 0x8164, 0x2025, + 0x8165, 0x2018, 0x8166, 0x2019, 0x8167, 0x201C, 0x8168, 0x201D, + 0x8169, 0xFF08, 0x816A, 0xFF09, 0x816B, 0x3014, 0x816C, 0x3015, + 0x816D, 0xFF3B, 0x816E, 0xFF3D, 0x816F, 0xFF5B, 0x8170, 0xFF5D, + 0x8171, 0x3008, 0x8172, 0x3009, 0x8173, 0x300A, 0x8174, 0x300B, + 0x8175, 0x300C, 0x8176, 0x300D, 0x8177, 0x300E, 0x8178, 0x300F, + 0x8179, 0x3010, 0x817A, 0x3011, 0x817B, 0xFF0B, 0x817C, 0xFF0D, + 0x817D, 0x00B1, 0x817E, 0x00D7, 0x8180, 0x00F7, 0x8181, 0xFF1D, + 0x8182, 0x2260, 0x8183, 0xFF1C, 0x8184, 0xFF1E, 0x8185, 0x2266, + 0x8186, 0x2267, 0x8187, 0x221E, 0x8188, 0x2234, 0x8189, 0x2642, + 0x818A, 0x2640, 0x818B, 0x00B0, 0x818C, 0x2032, 0x818D, 0x2033, + 0x818E, 0x2103, 0x818F, 0xFFE5, 0x8190, 0xFF04, 0x8191, 0xFFE0, + 0x8192, 0xFFE1, 0x8193, 0xFF05, 0x8194, 0xFF03, 0x8195, 0xFF06, + 0x8196, 0xFF0A, 0x8197, 0xFF20, 0x8198, 0x00A7, 0x8199, 0x2606, + 0x819A, 0x2605, 0x819B, 0x25CB, 0x819C, 0x25CF, 0x819D, 0x25CE, + 0x819E, 0x25C7, 0x819F, 0x25C6, 0x81A0, 0x25A1, 0x81A1, 0x25A0, + 0x81A2, 0x25B3, 0x81A3, 0x25B2, 0x81A4, 0x25BD, 0x81A5, 0x25BC, + 0x81A6, 0x203B, 0x81A7, 0x3012, 0x81A8, 0x2192, 0x81A9, 0x2190, + 0x81AA, 0x2191, 0x81AB, 0x2193, 0x81AC, 0x3013, 0x81B8, 0x2208, + 0x81B9, 0x220B, 0x81BA, 0x2286, 0x81BB, 0x2287, 0x81BC, 0x2282, + 0x81BD, 0x2283, 0x81BE, 0x222A, 0x81BF, 0x2229, 0x81C8, 0x2227, + 0x81C9, 0x2228, 0x81CA, 0xFFE2, 0x81CB, 0x21D2, 0x81CC, 0x21D4, + 0x81CD, 0x2200, 0x81CE, 0x2203, 0x81DA, 0x2220, 0x81DB, 0x22A5, + 0x81DC, 0x2312, 0x81DD, 0x2202, 0x81DE, 0x2207, 0x81DF, 0x2261, + 0x81E0, 0x2252, 0x81E1, 0x226A, 0x81E2, 0x226B, 0x81E3, 0x221A, + 0x81E4, 0x223D, 0x81E5, 0x221D, 0x81E6, 0x2235, 0x81E7, 0x222B, + 0x81E8, 0x222C, 0x81F0, 0x212B, 0x81F1, 0x2030, 0x81F2, 0x266F, + 0x81F3, 0x266D, 0x81F4, 0x266A, 0x81F5, 0x2020, 0x81F6, 0x2021, + 0x81F7, 0x00B6, 0x81FC, 0x25EF, 0x824F, 0xFF10, 0x8250, 0xFF11, + 0x8251, 0xFF12, 0x8252, 0xFF13, 0x8253, 0xFF14, 0x8254, 0xFF15, + 0x8255, 0xFF16, 0x8256, 0xFF17, 0x8257, 0xFF18, 0x8258, 0xFF19, + 0x8260, 0xFF21, 0x8261, 0xFF22, 0x8262, 0xFF23, 0x8263, 0xFF24, + 0x8264, 0xFF25, 0x8265, 0xFF26, 0x8266, 0xFF27, 0x8267, 0xFF28, + 0x8268, 0xFF29, 0x8269, 0xFF2A, 0x826A, 0xFF2B, 0x826B, 0xFF2C, + 0x826C, 0xFF2D, 0x826D, 0xFF2E, 0x826E, 0xFF2F, 0x826F, 0xFF30, + 0x8270, 0xFF31, 0x8271, 0xFF32, 0x8272, 0xFF33, 0x8273, 0xFF34, + 0x8274, 0xFF35, 0x8275, 0xFF36, 0x8276, 0xFF37, 0x8277, 0xFF38, + 0x8278, 0xFF39, 0x8279, 0xFF3A, 0x8281, 0xFF41, 0x8282, 0xFF42, + 0x8283, 0xFF43, 0x8284, 0xFF44, 0x8285, 0xFF45, 0x8286, 0xFF46, + 0x8287, 0xFF47, 0x8288, 0xFF48, 0x8289, 0xFF49, 0x828A, 0xFF4A, + 0x828B, 0xFF4B, 0x828C, 0xFF4C, 0x828D, 0xFF4D, 0x828E, 0xFF4E, + 0x828F, 0xFF4F, 0x8290, 0xFF50, 0x8291, 0xFF51, 0x8292, 0xFF52, + 0x8293, 0xFF53, 0x8294, 0xFF54, 0x8295, 0xFF55, 0x8296, 0xFF56, + 0x8297, 0xFF57, 0x8298, 0xFF58, 0x8299, 0xFF59, 0x829A, 0xFF5A, + 0x829F, 0x3041, 0x82A0, 0x3042, 0x82A1, 0x3043, 0x82A2, 0x3044, + 0x82A3, 0x3045, 0x82A4, 0x3046, 0x82A5, 0x3047, 0x82A6, 0x3048, + 0x82A7, 0x3049, 0x82A8, 0x304A, 0x82A9, 0x304B, 0x82AA, 0x304C, + 0x82AB, 0x304D, 0x82AC, 0x304E, 0x82AD, 0x304F, 0x82AE, 0x3050, + 0x82AF, 0x3051, 0x82B0, 0x3052, 0x82B1, 0x3053, 0x82B2, 0x3054, + 0x82B3, 0x3055, 0x82B4, 0x3056, 0x82B5, 0x3057, 0x82B6, 0x3058, + 0x82B7, 0x3059, 0x82B8, 0x305A, 0x82B9, 0x305B, 0x82BA, 0x305C, + 0x82BB, 0x305D, 0x82BC, 0x305E, 0x82BD, 0x305F, 0x82BE, 0x3060, + 0x82BF, 0x3061, 0x82C0, 0x3062, 0x82C1, 0x3063, 0x82C2, 0x3064, + 0x82C3, 0x3065, 0x82C4, 0x3066, 0x82C5, 0x3067, 0x82C6, 0x3068, + 0x82C7, 0x3069, 0x82C8, 0x306A, 0x82C9, 0x306B, 0x82CA, 0x306C, + 0x82CB, 0x306D, 0x82CC, 0x306E, 0x82CD, 0x306F, 0x82CE, 0x3070, + 0x82CF, 0x3071, 0x82D0, 0x3072, 0x82D1, 0x3073, 0x82D2, 0x3074, + 0x82D3, 0x3075, 0x82D4, 0x3076, 0x82D5, 0x3077, 0x82D6, 0x3078, + 0x82D7, 0x3079, 0x82D8, 0x307A, 0x82D9, 0x307B, 0x82DA, 0x307C, + 0x82DB, 0x307D, 0x82DC, 0x307E, 0x82DD, 0x307F, 0x82DE, 0x3080, + 0x82DF, 0x3081, 0x82E0, 0x3082, 0x82E1, 0x3083, 0x82E2, 0x3084, + 0x82E3, 0x3085, 0x82E4, 0x3086, 0x82E5, 0x3087, 0x82E6, 0x3088, + 0x82E7, 0x3089, 0x82E8, 0x308A, 0x82E9, 0x308B, 0x82EA, 0x308C, + 0x82EB, 0x308D, 0x82EC, 0x308E, 0x82ED, 0x308F, 0x82EE, 0x3090, + 0x82EF, 0x3091, 0x82F0, 0x3092, 0x82F1, 0x3093, 0x8340, 0x30A1, + 0x8341, 0x30A2, 0x8342, 0x30A3, 0x8343, 0x30A4, 0x8344, 0x30A5, + 0x8345, 0x30A6, 0x8346, 0x30A7, 0x8347, 0x30A8, 0x8348, 0x30A9, + 0x8349, 0x30AA, 0x834A, 0x30AB, 0x834B, 0x30AC, 0x834C, 0x30AD, + 0x834D, 0x30AE, 0x834E, 0x30AF, 0x834F, 0x30B0, 0x8350, 0x30B1, + 0x8351, 0x30B2, 0x8352, 0x30B3, 0x8353, 0x30B4, 0x8354, 0x30B5, + 0x8355, 0x30B6, 0x8356, 0x30B7, 0x8357, 0x30B8, 0x8358, 0x30B9, + 0x8359, 0x30BA, 0x835A, 0x30BB, 0x835B, 0x30BC, 0x835C, 0x30BD, + 0x835D, 0x30BE, 0x835E, 0x30BF, 0x835F, 0x30C0, 0x8360, 0x30C1, + 0x8361, 0x30C2, 0x8362, 0x30C3, 0x8363, 0x30C4, 0x8364, 0x30C5, + 0x8365, 0x30C6, 0x8366, 0x30C7, 0x8367, 0x30C8, 0x8368, 0x30C9, + 0x8369, 0x30CA, 0x836A, 0x30CB, 0x836B, 0x30CC, 0x836C, 0x30CD, + 0x836D, 0x30CE, 0x836E, 0x30CF, 0x836F, 0x30D0, 0x8370, 0x30D1, + 0x8371, 0x30D2, 0x8372, 0x30D3, 0x8373, 0x30D4, 0x8374, 0x30D5, + 0x8375, 0x30D6, 0x8376, 0x30D7, 0x8377, 0x30D8, 0x8378, 0x30D9, + 0x8379, 0x30DA, 0x837A, 0x30DB, 0x837B, 0x30DC, 0x837C, 0x30DD, + 0x837D, 0x30DE, 0x837E, 0x30DF, 0x8380, 0x30E0, 0x8381, 0x30E1, + 0x8382, 0x30E2, 0x8383, 0x30E3, 0x8384, 0x30E4, 0x8385, 0x30E5, + 0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9, + 0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED, + 0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1, + 0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x3094, 0x8394, 0x30F4, + 0x8395, 0x30F5, 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, + 0x83A1, 0x0393, 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, + 0x83A5, 0x0397, 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, + 0x83A9, 0x039B, 0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, + 0x83AD, 0x039F, 0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, + 0x83B1, 0x03A4, 0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, + 0x83B5, 0x03A8, 0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, + 0x83C1, 0x03B3, 0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, + 0x83C5, 0x03B7, 0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, + 0x83C9, 0x03BB, 0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, + 0x83CD, 0x03BF, 0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, + 0x83D1, 0x03C4, 0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, + 0x83D5, 0x03C8, 0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, + 0x8442, 0x0412, 0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, + 0x8446, 0x0401, 0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, + 0x844A, 0x0419, 0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, + 0x844E, 0x041D, 0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, + 0x8452, 0x0421, 0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, + 0x8456, 0x0425, 0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, + 0x845A, 0x0429, 0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, + 0x845E, 0x042D, 0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, + 0x8471, 0x0431, 0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, + 0x8475, 0x0435, 0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, + 0x8479, 0x0438, 0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, + 0x847D, 0x043C, 0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, + 0x8482, 0x0440, 0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, + 0x8486, 0x0444, 0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, + 0x848A, 0x0448, 0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, + 0x848E, 0x044C, 0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, + 0x849F, 0x2500, 0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, + 0x84A3, 0x2518, 0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, + 0x84A7, 0x2524, 0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, + 0x84AB, 0x2503, 0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, + 0x84AF, 0x2517, 0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, + 0x84B3, 0x253B, 0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, + 0x84B7, 0x2528, 0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, + 0x84BB, 0x2530, 0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, + 0x8740, 0x2460, 0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, + 0x8744, 0x2464, 0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, + 0x8748, 0x2468, 0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, + 0x874C, 0x246C, 0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, + 0x8750, 0x2470, 0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, + 0x8754, 0x2160, 0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, + 0x8758, 0x2164, 0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, + 0x875C, 0x2168, 0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, + 0x8761, 0x3322, 0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, + 0x8765, 0x3303, 0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, + 0x8769, 0x330D, 0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, + 0x876D, 0x334A, 0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, + 0x8771, 0x339E, 0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, + 0x8775, 0x33A1, 0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, + 0x8782, 0x2116, 0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, + 0x8786, 0x32A5, 0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, + 0x878A, 0x3231, 0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, + 0x878E, 0x337D, 0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, + 0x8798, 0x221F, 0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, + 0x88A1, 0x5A03, 0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, + 0x88A5, 0x6328, 0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, + 0x88A9, 0x831C, 0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, + 0x88AD, 0x6E25, 0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, + 0x88B1, 0x9BF5, 0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, + 0x88B5, 0x6271, 0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, + 0x88B9, 0x98F4, 0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, + 0x88BD, 0x6216, 0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, + 0x88C1, 0x5EB5, 0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, + 0x88C5, 0x95C7, 0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, + 0x88C9, 0x4F0A, 0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, + 0x88CD, 0x56F2, 0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, + 0x88D1, 0x5C09, 0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, + 0x88D5, 0x6613, 0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, + 0x88D9, 0x7570, 0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, + 0x88DD, 0x80C3, 0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, + 0x88E1, 0x9055, 0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, + 0x88E5, 0x4EA5, 0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, + 0x88E9, 0x78EF, 0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, + 0x88ED, 0x9038, 0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, + 0x88F1, 0x9C2F, 0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, + 0x88F5, 0x54E1, 0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, + 0x88F9, 0x98F2, 0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, + 0x8940, 0x9662, 0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, + 0x8944, 0x540B, 0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, + 0x8948, 0x7FBD, 0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, + 0x894C, 0x9D5C, 0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, + 0x8950, 0x81FC, 0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, + 0x8954, 0x6B1D, 0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, + 0x8958, 0x53A9, 0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, + 0x895C, 0x5642, 0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, + 0x8960, 0x834F, 0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, + 0x8964, 0x5B30, 0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, + 0x8968, 0x6804, 0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, + 0x896C, 0x745B, 0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, + 0x8970, 0x82F1, 0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, + 0x8974, 0x6DB2, 0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, + 0x8978, 0x60A6, 0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, + 0x897C, 0x698E, 0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, + 0x8981, 0x5830, 0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, + 0x8985, 0x6028, 0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, + 0x8989, 0x6F14, 0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, + 0x898D, 0x71D5, 0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, + 0x8991, 0x82D1, 0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, + 0x8995, 0x9D1B, 0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, + 0x8999, 0x7525, 0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, + 0x899D, 0x5F80, 0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, + 0x89A1, 0x6A2A, 0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, + 0x89A5, 0x7FC1, 0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, + 0x89A9, 0x9EC4, 0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, + 0x89AD, 0x5104, 0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, + 0x89B1, 0x6876, 0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, + 0x89B5, 0x5378, 0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, + 0x89B9, 0x97F3, 0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, + 0x89BD, 0x4F55, 0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, + 0x89C1, 0x52A0, 0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, + 0x89C5, 0x5AC1, 0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, + 0x89C9, 0x6687, 0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, + 0x89CD, 0x6CB3, 0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, + 0x89D1, 0x79BE, 0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, + 0x89D5, 0x82DB, 0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, + 0x89D9, 0x83D3, 0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, + 0x89DD, 0x8CA8, 0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, + 0x89E1, 0x868A, 0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, + 0x89E5, 0x7259, 0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, + 0x89E9, 0x86FE, 0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, + 0x89ED, 0x99D5, 0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, + 0x89F1, 0x56DE, 0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, + 0x89F5, 0x5FEB, 0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, + 0x89F9, 0x61D0, 0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, + 0x8A40, 0x9B41, 0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, + 0x8A44, 0x7070, 0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, + 0x8A48, 0x82A5, 0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, + 0x8A4C, 0x8C9D, 0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, + 0x8A50, 0x54B3, 0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, + 0x8A54, 0x6982, 0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, + 0x8A58, 0x8857, 0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, + 0x8A5C, 0x6D6C, 0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, + 0x8A60, 0x67FF, 0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, + 0x8A64, 0x5687, 0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, + 0x8A68, 0x64B9, 0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, + 0x8A6C, 0x7372, 0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, + 0x8A70, 0x89D2, 0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, + 0x8A74, 0x95A3, 0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, + 0x8A78, 0x5CB3, 0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, + 0x8A7C, 0x639B, 0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, + 0x8A81, 0x68B6, 0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, + 0x8A85, 0x559D, 0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, + 0x8A89, 0x6E07, 0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, + 0x8A8D, 0x8F44, 0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, + 0x8A91, 0x691B, 0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, + 0x8A95, 0x515C, 0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, + 0x8A99, 0x938C, 0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, + 0x8A9D, 0x8305, 0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, + 0x8AA1, 0x82C5, 0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, + 0x8AA5, 0x51A0, 0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, + 0x8AA9, 0x52E7, 0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, + 0x8AAD, 0x59E6, 0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, + 0x8AB1, 0x5E72, 0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, + 0x8AB5, 0x6163, 0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, + 0x8AB9, 0x67D1, 0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, + 0x8ABD, 0x6B53, 0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, + 0x8AC1, 0x6F45, 0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, + 0x8AC5, 0x770B, 0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, + 0x8AC9, 0x7DE9, 0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, + 0x8ACD, 0x8266, 0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, + 0x8AD1, 0x8CAB, 0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, + 0x8AD5, 0x9591, 0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, + 0x8AD9, 0x9928, 0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, + 0x8ADD, 0x5CB8, 0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, + 0x8AE1, 0x773C, 0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, + 0x8AE5, 0x96C1, 0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, + 0x8AE9, 0x4F01, 0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, + 0x8AED, 0x5668, 0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, + 0x8AF1, 0x5BC4, 0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, + 0x8AF5, 0x5FCC, 0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, + 0x8AF9, 0x65E2, 0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, + 0x8B40, 0x6A5F, 0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, + 0x8B44, 0x6C7D, 0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, + 0x8B48, 0x7A00, 0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, + 0x8B4C, 0x8A18, 0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, + 0x8B50, 0x8F1D, 0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, + 0x8B54, 0x4E80, 0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, + 0x8B58, 0x5B9C, 0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, + 0x8B5C, 0x6B3A, 0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, + 0x8B60, 0x7FA9, 0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, + 0x8B64, 0x63AC, 0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, + 0x8B68, 0x5403, 0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, + 0x8B6C, 0x8A70, 0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, + 0x8B70, 0x5374, 0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, + 0x8B74, 0x9006, 0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, + 0x8B78, 0x4F11, 0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, + 0x8B7C, 0x5F13, 0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, + 0x8B81, 0x6C42, 0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, + 0x8B85, 0x7403, 0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, + 0x8B89, 0x7D1A, 0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, + 0x8B8D, 0x725B, 0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, + 0x8B91, 0x62D2, 0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, + 0x8B95, 0x865A, 0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, + 0x8B99, 0x6F01, 0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, + 0x8B9D, 0x4EAB, 0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, + 0x8BA1, 0x50D1, 0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, + 0x8BA5, 0x51F6, 0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, + 0x8BA9, 0x53EB, 0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, + 0x8BAD, 0x5F37, 0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, + 0x8BB1, 0x606D, 0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, + 0x8BB5, 0x6CC1, 0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, + 0x8BB9, 0x80F8, 0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, + 0x8BBD, 0x90F7, 0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, + 0x8BC1, 0x9A5A, 0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, + 0x8BC5, 0x6681, 0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, + 0x8BC9, 0x6975, 0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, + 0x8BCD, 0x50C5, 0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, + 0x8BD1, 0x9326, 0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, + 0x8BD5, 0x7434, 0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, + 0x8BD9, 0x7DCA, 0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, + 0x8BDD, 0x895F, 0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, + 0x8BE1, 0x541F, 0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, + 0x8BE5, 0x53E5, 0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, + 0x8BE9, 0x77E9, 0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, + 0x8BED, 0x99C8, 0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, + 0x8BF1, 0x865E, 0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, + 0x8BF5, 0x5BD3, 0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, + 0x8BF9, 0x6ADB, 0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, + 0x8C40, 0x6398, 0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, + 0x8C44, 0x8F61, 0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, + 0x8C48, 0x7C82, 0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, + 0x8C4C, 0x936C, 0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, + 0x8C50, 0x8A13, 0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, + 0x8C54, 0x5366, 0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, + 0x8C58, 0x50BE, 0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, + 0x8C5C, 0x572D, 0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, + 0x8C60, 0x5F62, 0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, + 0x8C64, 0x6167, 0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, + 0x8C68, 0x656C, 0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, + 0x8C6C, 0x7566, 0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, + 0x8C70, 0x7D99, 0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, + 0x8C74, 0x834A, 0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, + 0x8C78, 0x8B66, 0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, + 0x8C7C, 0x82B8, 0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, + 0x8C81, 0x621F, 0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, + 0x8C85, 0x6841, 0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, + 0x8C89, 0x6F54, 0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, + 0x8C8D, 0x8A23, 0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, + 0x8C91, 0x5026, 0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, + 0x8C95, 0x5263, 0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, + 0x8C99, 0x5ACC, 0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, + 0x8C9D, 0x62F3, 0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, + 0x8CA1, 0x727D, 0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, + 0x8CA5, 0x786F, 0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, + 0x8CA9, 0x898B, 0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, + 0x8CAD, 0x9063, 0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, + 0x8CB1, 0x9A13, 0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, + 0x8CB5, 0x53B3, 0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, + 0x8CB9, 0x6E90, 0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, + 0x8CBD, 0x8237, 0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, + 0x8CC1, 0x4E4E, 0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, + 0x8CC5, 0x56FA, 0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, + 0x8CC9, 0x5EAB, 0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, + 0x8CCD, 0x67AF, 0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, + 0x8CD1, 0x88B4, 0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, + 0x8CD5, 0x864E, 0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, + 0x8CD9, 0x96C7, 0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, + 0x8CDD, 0x4E92, 0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, + 0x8CE1, 0x543E, 0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, + 0x8CE5, 0x609F, 0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, + 0x8CE9, 0x7881, 0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, + 0x8CED, 0x9190, 0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, + 0x8CF1, 0x4F7C, 0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, + 0x8CF5, 0x5149, 0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, + 0x8CF9, 0x52FE, 0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, + 0x8D40, 0x540E, 0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, + 0x8D44, 0x597D, 0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, + 0x8D48, 0x5DE5, 0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, + 0x8D4C, 0x5E83, 0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, + 0x8D50, 0x6052, 0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, + 0x8D54, 0x63A7, 0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, + 0x8D58, 0x66F4, 0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, + 0x8D5C, 0x69CB, 0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, + 0x8D60, 0x6E2F, 0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, + 0x8D64, 0x786C, 0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, + 0x8D68, 0x7D18, 0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, + 0x8D6C, 0x8003, 0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, + 0x8D70, 0x818F, 0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, + 0x8D74, 0x8861, 0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, + 0x8D78, 0x90CA, 0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, + 0x8D7C, 0x92FC, 0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, + 0x8D81, 0x9999, 0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, + 0x8D85, 0x52AB, 0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, + 0x8D89, 0x62F7, 0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, + 0x8D8D, 0x9EB9, 0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, + 0x8D91, 0x56FD, 0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, + 0x8D95, 0x9ED2, 0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, + 0x8D99, 0x7511, 0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, + 0x8D9D, 0x72DB, 0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, + 0x8DA1, 0x4ECA, 0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, + 0x8DA5, 0x5A5A, 0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, + 0x8DA9, 0x6606, 0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, + 0x8DAD, 0x75D5, 0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, + 0x8DB1, 0x4E9B, 0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, + 0x8DB5, 0x5D6F, 0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, + 0x8DB9, 0x6C99, 0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, + 0x8DBD, 0x9396, 0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, + 0x8DC1, 0x632B, 0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, + 0x8DC5, 0x6700, 0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, + 0x8DC9, 0x5BB0, 0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, + 0x8DCD, 0x683D, 0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, + 0x8DD1, 0x91C7, 0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, + 0x8DD5, 0x796D, 0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, + 0x8DD9, 0x88C1, 0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, + 0x8DDD, 0x5728, 0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, + 0x8DE1, 0x51B4, 0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, + 0x8DE5, 0x698A, 0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, + 0x8DE9, 0x57FC, 0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, + 0x8DED, 0x524A, 0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, + 0x8DF1, 0x6714, 0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, + 0x8DF5, 0x7D22, 0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, + 0x8DF9, 0x7B39, 0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, + 0x8E40, 0x5BDF, 0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, + 0x8E44, 0x672D, 0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, + 0x8E48, 0x7690, 0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, + 0x8E4C, 0x9BAB, 0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, + 0x8E50, 0x5098, 0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, + 0x8E54, 0x6492, 0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, + 0x8E58, 0x73CA, 0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, + 0x8E5C, 0x8695, 0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, + 0x8E60, 0x9910, 0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, + 0x8E64, 0x4ED5, 0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, + 0x8E68, 0x523A, 0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, + 0x8E6C, 0x56DB, 0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, + 0x8E70, 0x59FF, 0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, + 0x8E74, 0x5E2B, 0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, + 0x8E78, 0x652F, 0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, + 0x8E7C, 0x65E8, 0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, + 0x8E81, 0x6C0F, 0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, + 0x8E85, 0x7CF8, 0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, + 0x8E89, 0x8102, 0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, + 0x8E8D, 0x8A69, 0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, + 0x8E91, 0x8CC7, 0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, + 0x8E95, 0x6B6F, 0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, + 0x8E99, 0x5150, 0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, + 0x8E9D, 0x6301, 0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, + 0x8EA1, 0x6CBB, 0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, + 0x8EA5, 0x78C1, 0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, + 0x8EA9, 0x81EA, 0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, + 0x8EAD, 0x9E7F, 0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, + 0x8EB1, 0x7AFA, 0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, + 0x8EB5, 0x4E03, 0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, + 0x8EB9, 0x5AC9, 0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, + 0x8EBD, 0x6F06, 0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, + 0x8EC1, 0x8500, 0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, + 0x8EC5, 0x829D, 0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, + 0x8EC9, 0x820E, 0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, + 0x8ECD, 0x8D66, 0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, + 0x8ED1, 0x7D17, 0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, + 0x8ED5, 0x906E, 0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, + 0x8ED9, 0x52FA, 0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, + 0x8EDD, 0x7235, 0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, + 0x8EE1, 0x82E5, 0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, + 0x8EE5, 0x4E3B, 0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, + 0x8EE9, 0x6731, 0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, + 0x8EED, 0x7A2E, 0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, + 0x8EF1, 0x9996, 0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, + 0x8EF5, 0x5BFF, 0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, + 0x8EF9, 0x9700, 0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, + 0x8F40, 0x5B97, 0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, + 0x8F44, 0x6101, 0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, + 0x8F48, 0x79CB, 0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, + 0x8F4C, 0x81ED, 0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, + 0x8F50, 0x8972, 0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, + 0x8F54, 0x9031, 0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, + 0x8F58, 0x919C, 0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, + 0x8F5C, 0x5341, 0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, + 0x8F60, 0x6C41, 0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, + 0x8F64, 0x91CD, 0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, + 0x8F68, 0x5BBF, 0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, + 0x8F6C, 0x7C9B, 0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, + 0x8F70, 0x8853, 0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, + 0x8F74, 0x6625, 0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, + 0x8F78, 0x99FF, 0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, + 0x8F7C, 0x696F, 0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, + 0x8F81, 0x6F64, 0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, + 0x8F85, 0x9075, 0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, + 0x8F89, 0x521D, 0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, + 0x8F8D, 0x6E1A, 0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, + 0x8F91, 0x66F8, 0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, + 0x8F95, 0x52A9, 0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, + 0x8F99, 0x5F90, 0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, + 0x8F9D, 0x50B7, 0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, + 0x8FA1, 0x5347, 0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, + 0x8FA5, 0x5531, 0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, + 0x8FA9, 0x5A3C, 0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, + 0x8FAD, 0x5C11, 0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, + 0x8FB1, 0x5EE0, 0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, + 0x8FB5, 0x62DB, 0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, + 0x8FB9, 0x660C, 0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, + 0x8FBD, 0x68A2, 0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, + 0x8FC1, 0x6D88, 0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, + 0x8FC5, 0x7126, 0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, + 0x8FC9, 0x785D, 0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, + 0x8FCD, 0x7AE0, 0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, + 0x8FD1, 0x8096, 0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, + 0x8FD5, 0x885D, 0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, + 0x8FD9, 0x8A54, 0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, + 0x8FDD, 0x91A4, 0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, + 0x8FE1, 0x969C, 0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, + 0x8FE5, 0x4E1E, 0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, + 0x8FE9, 0x57CE, 0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, + 0x8FED, 0x5E38, 0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, + 0x8FF1, 0x6756, 0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, + 0x8FF5, 0x7A63, 0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, + 0x8FF9, 0x9320, 0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, + 0x9040, 0x62ED, 0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, + 0x9044, 0x7E54, 0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, + 0x9048, 0x98DF, 0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, + 0x904C, 0x4F38, 0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, + 0x9050, 0x5A20, 0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, + 0x9054, 0x614E, 0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, + 0x9058, 0x68EE, 0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, + 0x905C, 0x7533, 0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, + 0x9060, 0x79E6, 0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, + 0x9064, 0x85AA, 0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, + 0x9068, 0x8F9B, 0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, + 0x906C, 0x4EBA, 0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, + 0x9070, 0x58EC, 0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, + 0x9074, 0x814E, 0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, + 0x9078, 0x976D, 0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, + 0x907C, 0x9162, 0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, + 0x9081, 0x5439, 0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, + 0x9085, 0x6C34, 0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, + 0x9089, 0x7FE0, 0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, + 0x908D, 0x9310, 0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, + 0x9091, 0x9AC4, 0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, + 0x9095, 0x67A2, 0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, + 0x9099, 0x6749, 0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, + 0x909D, 0x96C0, 0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, + 0x90A1, 0x5BF8, 0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, + 0x90A5, 0x662F, 0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, + 0x90A9, 0x59D3, 0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, + 0x90AD, 0x653F, 0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, + 0x90B1, 0x68F2, 0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, + 0x90B5, 0x7272, 0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, + 0x90B9, 0x8056, 0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, + 0x90BD, 0x8AA0, 0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, + 0x90C1, 0x9192, 0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, + 0x90C5, 0x7A0E, 0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, + 0x90C9, 0x60DC, 0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, + 0x90CD, 0x6790, 0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, + 0x90D1, 0x7E3E, 0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, + 0x90D5, 0x8DE1, 0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, + 0x90D9, 0x62D9, 0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, + 0x90DD, 0x8A2D, 0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, + 0x90E1, 0x96EA, 0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, + 0x90E5, 0x4ED9, 0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, + 0x90E9, 0x5BA3, 0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, + 0x90ED, 0x6226, 0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, + 0x90F1, 0x6834, 0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, + 0x90F5, 0x67D3, 0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, + 0x90F9, 0x65CB, 0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, + 0x9140, 0x7E4A, 0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, + 0x9144, 0x8239, 0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, + 0x9148, 0x8DF5, 0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, + 0x914C, 0x9291, 0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, + 0x9150, 0x5584, 0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, + 0x9154, 0x7985, 0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, + 0x9158, 0x564C, 0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, + 0x915C, 0x66FE, 0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, + 0x9160, 0x758F, 0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, + 0x9164, 0x79DF, 0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, + 0x9168, 0x8607, 0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, + 0x916C, 0x9F20, 0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, + 0x9170, 0x53E2, 0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, + 0x9174, 0x594F, 0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, + 0x9178, 0x531D, 0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, + 0x917C, 0x6383, 0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, + 0x9181, 0x65E9, 0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, + 0x9185, 0x69FD, 0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, + 0x9189, 0x75E9, 0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, + 0x918D, 0x7DCF, 0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, + 0x9191, 0x8358, 0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, + 0x9195, 0x88C5, 0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, + 0x9199, 0x9397, 0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, + 0x919D, 0x5897, 0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, + 0x91A1, 0x8D08, 0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, + 0x91A5, 0x5247, 0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, + 0x91A9, 0x675F, 0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, + 0x91AD, 0x4FD7, 0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, + 0x91B1, 0x7D9A, 0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, + 0x91B5, 0x63C3, 0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, + 0x91B9, 0x640D, 0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, + 0x91BD, 0x591A, 0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, + 0x91C1, 0x553E, 0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, + 0x91C5, 0x6253, 0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, + 0x91C9, 0x9640, 0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, + 0x91CD, 0x5806, 0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, + 0x91D1, 0x5E2F, 0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, + 0x91D5, 0x6234, 0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, + 0x91D9, 0x80CE, 0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, + 0x91DD, 0x8CB8, 0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, + 0x91E1, 0x9EDB, 0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, + 0x91E5, 0x5927, 0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, + 0x91E9, 0x9DF9, 0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, + 0x91ED, 0x5544, 0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, + 0x91F1, 0x62D3, 0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, + 0x91F5, 0x8A17, 0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, + 0x91F9, 0x8338, 0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, + 0x9240, 0x53E9, 0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, + 0x9244, 0x596A, 0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, + 0x9248, 0x8FBF, 0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, + 0x924C, 0x9C48, 0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, + 0x9250, 0x5358, 0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, + 0x9254, 0x63A2, 0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, + 0x9258, 0x6E5B, 0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, + 0x925C, 0x7BAA, 0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, + 0x9260, 0x86CB, 0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, + 0x9264, 0x58C7, 0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, + 0x9268, 0x6A80, 0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, + 0x926C, 0x5024, 0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, + 0x9270, 0x6065, 0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, + 0x9274, 0x7A1A, 0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, + 0x9278, 0x9045, 0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, + 0x927C, 0x7AF9, 0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, + 0x9281, 0x79E9, 0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, + 0x9285, 0x7740, 0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, + 0x9289, 0x5FE0, 0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, + 0x928D, 0x6CE8, 0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, + 0x9291, 0x914E, 0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, + 0x9295, 0x7026, 0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, + 0x9299, 0x8CAF, 0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, + 0x929D, 0x558B, 0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, + 0x92A1, 0x5E81, 0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, + 0x92A5, 0x5FB4, 0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, + 0x92A9, 0x671D, 0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, + 0x92AD, 0x773A, 0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, + 0x92B1, 0x8776, 0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, + 0x92B5, 0x8DF3, 0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, + 0x92B9, 0x9CE5, 0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, + 0x92BD, 0x6715, 0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, + 0x92C1, 0x93AE, 0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, + 0x92C5, 0x690E, 0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, + 0x92C9, 0x75DB, 0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, + 0x92CD, 0x63B4, 0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, + 0x92D1, 0x67D8, 0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, + 0x92D5, 0x9354, 0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, + 0x92D9, 0x58F7, 0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, + 0x92DD, 0x540A, 0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, + 0x92E1, 0x4F4E, 0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, + 0x92E5, 0x8C9E, 0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, + 0x92E9, 0x5E1D, 0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, + 0x92ED, 0x5F1F, 0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, + 0x92F1, 0x63D0, 0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, + 0x92F5, 0x798E, 0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, + 0x92F9, 0x8A02, 0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, + 0x9340, 0x90B8, 0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, + 0x9344, 0x6CE5, 0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, + 0x9348, 0x6EF4, 0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, + 0x934C, 0x93D1, 0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, + 0x9350, 0x64A4, 0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, + 0x9354, 0x5178, 0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, + 0x9358, 0x5E97, 0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, + 0x935C, 0x8CBC, 0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, + 0x9360, 0x4F1D, 0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, + 0x9364, 0x96FB, 0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, + 0x9368, 0x5857, 0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, + 0x936C, 0x6597, 0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, + 0x9370, 0x83DF, 0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, + 0x9374, 0x934D, 0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, + 0x9378, 0x5EA6, 0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, + 0x937C, 0x5012, 0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, + 0x9381, 0x5200, 0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, + 0x9385, 0x5957, 0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, + 0x9389, 0x60BC, 0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, + 0x938D, 0x6843, 0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, + 0x9391, 0x6DD8, 0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, + 0x9395, 0x71C8, 0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, + 0x9399, 0x7B49, 0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, + 0x939D, 0x7D71, 0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, + 0x93A1, 0x85E4, 0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, + 0x93A5, 0x8E0F, 0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, + 0x93A9, 0x9676, 0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, + 0x93AD, 0x50CD, 0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, + 0x93B1, 0x5C0E, 0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, + 0x93B5, 0x77B3, 0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, + 0x93B9, 0x9053, 0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, + 0x93BD, 0x533F, 0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, + 0x93C1, 0x7279, 0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, + 0x93C5, 0x6BD2, 0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, + 0x93C9, 0x6A61, 0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, + 0x93CD, 0x5C4A, 0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, + 0x93D1, 0x9149, 0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, + 0x93D5, 0x60C7, 0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, + 0x93D9, 0x9041, 0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, + 0x93DD, 0x920D, 0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, + 0x93E1, 0x4E4D, 0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, + 0x93E5, 0x7058, 0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, + 0x93E9, 0x99B4, 0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, + 0x93ED, 0x6960, 0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, + 0x93F1, 0x4E8C, 0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, + 0x93F5, 0x5302, 0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, + 0x93F9, 0x5EFF, 0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, + 0x9440, 0x5982, 0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, + 0x9444, 0x598A, 0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, + 0x9448, 0x79B0, 0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, + 0x944C, 0x732B, 0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, + 0x9450, 0x637B, 0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, + 0x9454, 0x4E43, 0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, + 0x9458, 0x56A2, 0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, + 0x945C, 0x80FD, 0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, + 0x9460, 0x8997, 0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, + 0x9464, 0x64AD, 0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, + 0x9468, 0x6D3E, 0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, + 0x946C, 0x7F75, 0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, + 0x9470, 0x5EC3, 0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, + 0x9474, 0x676F, 0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, + 0x9478, 0x80BA, 0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, + 0x947C, 0x57F9, 0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, + 0x9481, 0x7164, 0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, + 0x9485, 0x8CE0, 0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, + 0x9489, 0x79E4, 0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, + 0x948D, 0x5265, 0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, + 0x9491, 0x6CCA, 0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, + 0x9495, 0x8236, 0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, + 0x9499, 0x6F20, 0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, + 0x949D, 0x99C1, 0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, + 0x94A1, 0x7872, 0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, + 0x94A5, 0x6AE8, 0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, + 0x94A9, 0x7560, 0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, + 0x94AD, 0x767A, 0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, + 0x94B1, 0x7F70, 0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, + 0x94B5, 0x9CE9, 0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, + 0x94B9, 0x96BC, 0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, + 0x94BD, 0x53CD, 0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, + 0x94C1, 0x6591, 0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, + 0x94C5, 0x7248, 0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, + 0x94C9, 0x7E41, 0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, + 0x94CD, 0x7BC4, 0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, + 0x94D1, 0x98EF, 0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, + 0x94D5, 0x76E4, 0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, + 0x94D9, 0x532A, 0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, + 0x94DD, 0x5E87, 0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, + 0x94E1, 0x6279, 0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, + 0x94E5, 0x6CCC, 0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, + 0x94E9, 0x79D8, 0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, + 0x94ED, 0x88AB, 0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, + 0x94F1, 0x975E, 0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, + 0x94F5, 0x5099, 0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, + 0x94F9, 0x6BD8, 0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, + 0x9540, 0x9F3B, 0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, + 0x9544, 0x758B, 0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, + 0x9548, 0x83F1, 0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, + 0x954C, 0x7562, 0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, + 0x9550, 0x59EB, 0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, + 0x9554, 0x8B2C, 0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, + 0x9558, 0x6C37, 0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, + 0x955C, 0x8868, 0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, + 0x9560, 0x63CF, 0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, + 0x9564, 0x9328, 0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, + 0x9568, 0x9C2D, 0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, + 0x956C, 0x6D5C, 0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, + 0x9570, 0x983B, 0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, + 0x9574, 0x4ED8, 0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, + 0x9578, 0x5BCC, 0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, + 0x957C, 0x6016, 0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, + 0x9581, 0x666E, 0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, + 0x9585, 0x8150, 0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, + 0x9589, 0x8CA0, 0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, + 0x958D, 0x9644, 0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, + 0x9591, 0x821E, 0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, + 0x9595, 0x5C01, 0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, + 0x9599, 0x8557, 0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, + 0x959D, 0x5E45, 0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, + 0x95A1, 0x8907, 0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, + 0x95A5, 0x6255, 0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, + 0x95A9, 0x9B92, 0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, + 0x95AD, 0x58B3, 0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, + 0x95B1, 0x596E, 0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, + 0x95B5, 0x96F0, 0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, + 0x95B9, 0x4F75, 0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, + 0x95BD, 0x5E73, 0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, + 0x95C1, 0x853D, 0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, + 0x95C5, 0x9801, 0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, + 0x95C9, 0x78A7, 0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, + 0x95CD, 0x7B86, 0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, + 0x95D1, 0x7BC7, 0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, + 0x95D5, 0x904D, 0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, + 0x95D9, 0x5F01, 0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, + 0x95DD, 0x92EA, 0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, + 0x95E1, 0x752B, 0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, + 0x95E5, 0x52DF, 0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, + 0x95E9, 0x66AE, 0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, + 0x95ED, 0x5023, 0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, + 0x95F1, 0x5831, 0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, + 0x95F5, 0x5CEF, 0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, + 0x95F9, 0x6367, 0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, + 0x9640, 0x6CD5, 0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, + 0x9644, 0x7E2B, 0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, + 0x9648, 0x84EC, 0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, + 0x964C, 0x8C4A, 0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, + 0x9650, 0x9CF3, 0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, + 0x9654, 0x508D, 0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, + 0x9658, 0x5E3D, 0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, + 0x965C, 0x66B4, 0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, + 0x9660, 0x5192, 0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, + 0x9664, 0x8B00, 0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, + 0x9668, 0x9632, 0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, + 0x966C, 0x50D5, 0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, + 0x9670, 0x6734, 0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, + 0x9674, 0x91E6, 0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, + 0x9678, 0x5800, 0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, + 0x967C, 0x7FFB, 0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, + 0x9681, 0x78E8, 0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, + 0x9685, 0x59B9, 0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, + 0x9689, 0x54E9, 0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, + 0x968D, 0x6795, 0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, + 0x9691, 0x685D, 0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, + 0x9695, 0x62B9, 0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, + 0x9699, 0x4FAD, 0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, + 0x969D, 0x6162, 0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, + 0x96A1, 0x5473, 0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, + 0x96A5, 0x7B95, 0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, + 0x96A9, 0x6E4A, 0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, + 0x96AD, 0x5999, 0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, + 0x96B1, 0x52D9, 0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, + 0x96B5, 0x77DB, 0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, + 0x96B9, 0x5A7F, 0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, + 0x96BD, 0x547D, 0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, + 0x96C1, 0x9298, 0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, + 0x96C5, 0x6EC5, 0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, + 0x96C9, 0x7DEC, 0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, + 0x96CD, 0x6A21, 0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, + 0x96D1, 0x6BDB, 0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, + 0x96D5, 0x8017, 0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, + 0x96D9, 0x9ED9, 0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, + 0x96DD, 0x9905, 0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, + 0x96E1, 0x8CB0, 0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, + 0x96E5, 0x9580, 0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, + 0x96E9, 0x591C, 0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, + 0x96ED, 0x5F25, 0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, + 0x96F1, 0x7D04, 0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, + 0x96F5, 0x9756, 0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, + 0x96F9, 0x6109, 0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, + 0x9740, 0x8AED, 0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, + 0x9744, 0x512A, 0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, + 0x9748, 0x5E7D, 0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, + 0x974C, 0x6709, 0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, + 0x9750, 0x7336, 0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, + 0x9754, 0x88D5, 0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, + 0x9758, 0x90F5, 0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, + 0x975C, 0x4E88, 0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, + 0x9760, 0x8F3F, 0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, + 0x9764, 0x5996, 0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, + 0x9768, 0x63FA, 0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, + 0x976C, 0x69D8, 0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, + 0x9770, 0x7528, 0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, + 0x9774, 0x8449, 0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, + 0x9778, 0x8E0A, 0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, + 0x977C, 0x617E, 0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, + 0x9781, 0x6D74, 0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, + 0x9785, 0x7F85, 0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, + 0x9789, 0x83B1, 0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, + 0x978D, 0x7D61, 0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, + 0x9791, 0x5375, 0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, + 0x9795, 0x85CD, 0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, + 0x9799, 0x540F, 0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, + 0x979D, 0x7406, 0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, + 0x97A1, 0x88E1, 0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, + 0x97A5, 0x5F8B, 0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, + 0x97A9, 0x63A0, 0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, + 0x97AD, 0x6E9C, 0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, + 0x97B1, 0x7C92, 0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, + 0x97B5, 0x4FB6, 0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, + 0x97B9, 0x4E86, 0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, + 0x97BD, 0x51CC, 0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, + 0x97C1, 0x6DBC, 0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, + 0x97C5, 0x7A1C, 0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, + 0x97C9, 0x907C, 0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, + 0x97CD, 0x529B, 0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, + 0x97D1, 0x6797, 0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, + 0x97D5, 0x81E8, 0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, + 0x97D9, 0x9E9F, 0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, + 0x97DD, 0x7D2F, 0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, + 0x97E1, 0x4F8B, 0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, + 0x97E5, 0x601C, 0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, + 0x97E9, 0x9234, 0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, + 0x97ED, 0x9E97, 0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, + 0x97F1, 0x5217, 0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, + 0x97F5, 0x5EC9, 0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, + 0x97F9, 0x7149, 0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, + 0x9840, 0x84EE, 0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, + 0x9844, 0x9B6F, 0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, + 0x9848, 0x8DEF, 0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, + 0x984C, 0x5ECA, 0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, + 0x9850, 0x6994, 0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, + 0x9854, 0x72FC, 0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, + 0x9858, 0x874B, 0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, + 0x985C, 0x7984, 0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, + 0x9860, 0x502D, 0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, + 0x9864, 0x8CC4, 0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, + 0x9868, 0x9DF2, 0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, + 0x986C, 0x8A6B, 0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, + 0x9870, 0x6E7E, 0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, + 0x98A0, 0x4E10, 0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, + 0x98A4, 0x4E36, 0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, + 0x98A8, 0x4E56, 0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, + 0x98AC, 0x8C6B, 0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, + 0x98B0, 0x4E8E, 0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, + 0x98B4, 0x4EA2, 0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, + 0x98B8, 0x4ECE, 0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, + 0x98BC, 0x4EC2, 0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, + 0x98C0, 0x4EDF, 0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, + 0x98C4, 0x4F30, 0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, + 0x98C8, 0x4F47, 0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, + 0x98CC, 0x4F98, 0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, + 0x98D0, 0x4F91, 0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, + 0x98D4, 0x5118, 0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, + 0x98D8, 0x4FD8, 0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, + 0x98DC, 0x4FD0, 0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, + 0x98E0, 0x5028, 0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, + 0x98E4, 0x5005, 0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, + 0x98E8, 0x5029, 0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, + 0x98EC, 0x5011, 0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, + 0x98F0, 0x6703, 0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, + 0x98F4, 0x505A, 0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, + 0x98F8, 0x5080, 0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, + 0x98FC, 0x50B2, 0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, + 0x9943, 0x50C2, 0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, + 0x9947, 0x50ED, 0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, + 0x994B, 0x50F5, 0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, + 0x994F, 0x5116, 0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, + 0x9953, 0x5121, 0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, + 0x9957, 0x513B, 0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, + 0x995B, 0x514C, 0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, + 0x995F, 0x5169, 0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, + 0x9963, 0x5182, 0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, + 0x9967, 0x518F, 0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, + 0x996B, 0x5196, 0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, + 0x996F, 0x51A9, 0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, + 0x9973, 0x51B1, 0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, + 0x9977, 0x51BD, 0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, + 0x997B, 0x51E0, 0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, + 0x9980, 0x51F0, 0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, + 0x9984, 0x520B, 0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, + 0x9988, 0x522A, 0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, + 0x998C, 0x524F, 0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, + 0x9990, 0x525E, 0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, + 0x9994, 0x5269, 0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, + 0x9998, 0x528D, 0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, + 0x999C, 0x5288, 0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, + 0x99A0, 0x52AC, 0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, + 0x99A4, 0x52C1, 0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, + 0x99A8, 0x52E3, 0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, + 0x99AC, 0x52F3, 0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, + 0x99B0, 0x5306, 0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, + 0x99B4, 0x5310, 0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, + 0x99B8, 0x5323, 0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, + 0x99BC, 0x5338, 0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, + 0x99C0, 0x4E17, 0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, + 0x99C4, 0x535E, 0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, + 0x99C8, 0x537B, 0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, + 0x99CC, 0x53A0, 0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, + 0x99D0, 0x53B0, 0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, + 0x99D4, 0x96D9, 0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, + 0x99D8, 0x53EE, 0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, + 0x99DC, 0x5401, 0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, + 0x99E0, 0x542D, 0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, + 0x99E4, 0x5429, 0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, + 0x99E8, 0x5475, 0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, + 0x99EC, 0x5477, 0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, + 0x99F0, 0x5480, 0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, + 0x99F4, 0x5486, 0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, + 0x99F8, 0x54A5, 0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, + 0x99FC, 0x54A8, 0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, + 0x9A43, 0x54BE, 0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, + 0x9A47, 0x54E6, 0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, + 0x9A4B, 0x54EE, 0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, + 0x9A4F, 0x5539, 0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, + 0x9A53, 0x552E, 0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, + 0x9A57, 0x5557, 0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, + 0x9A5B, 0x5599, 0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, + 0x9A5F, 0x559F, 0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, + 0x9A63, 0x559E, 0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, + 0x9A67, 0x55A9, 0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, + 0x9A6B, 0x55C5, 0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, + 0x9A6F, 0x55E4, 0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, + 0x9A73, 0x5616, 0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, + 0x9A77, 0x55F9, 0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, + 0x9A7B, 0x5634, 0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, + 0x9A80, 0x566B, 0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, + 0x9A84, 0x566A, 0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, + 0x9A88, 0x56A0, 0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, + 0x9A8C, 0x56AE, 0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, + 0x9A90, 0x56BC, 0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, + 0x9A94, 0x56C8, 0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, + 0x9A98, 0x56D7, 0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, + 0x9A9C, 0x56FF, 0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, + 0x9AA0, 0x570B, 0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, + 0x9AA4, 0x5716, 0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, + 0x9AA8, 0x5737, 0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, + 0x9AAC, 0x5740, 0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, + 0x9AB0, 0x5788, 0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, + 0x9AB4, 0x5793, 0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, + 0x9AB8, 0x57AA, 0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, + 0x9ABC, 0x57D4, 0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, + 0x9AC0, 0x57D6, 0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, + 0x9AC4, 0x581D, 0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, + 0x9AC8, 0x584B, 0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, + 0x9ACC, 0x583D, 0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, + 0x9AD0, 0x589F, 0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, + 0x9AD4, 0x58BB, 0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, + 0x9AD8, 0x58D3, 0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, + 0x9ADC, 0x58D8, 0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, + 0x9AE0, 0x58DF, 0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, + 0x9AE4, 0x58FB, 0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, + 0x9AE8, 0x590A, 0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, + 0x9AEC, 0x5925, 0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, + 0x9AF0, 0x5938, 0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, + 0x9AF4, 0x5950, 0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, + 0x9AF8, 0x5962, 0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, + 0x9AFC, 0x5969, 0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, + 0x9B43, 0x4F5E, 0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, + 0x9B47, 0x59C6, 0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, + 0x9B4B, 0x59D9, 0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, + 0x9B4F, 0x5A11, 0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, + 0x9B53, 0x5A40, 0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, + 0x9B57, 0x5A36, 0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, + 0x9B5B, 0x5ABC, 0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, + 0x9B5F, 0x5ABD, 0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, + 0x9B63, 0x5AE9, 0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, + 0x9B67, 0x5B0C, 0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, + 0x9B6B, 0x5AD0, 0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, + 0x9B6F, 0x5B43, 0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, + 0x9B73, 0x5B55, 0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, + 0x9B77, 0x5B69, 0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, + 0x9B7B, 0x5B78, 0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, + 0x9B80, 0x5B83, 0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, + 0x9B84, 0x5BC7, 0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, + 0x9B88, 0x5BE4, 0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, + 0x9B8C, 0x5BE5, 0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, + 0x9B90, 0x5BF3, 0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, + 0x9B94, 0x5C0D, 0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, + 0x9B98, 0x5C28, 0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, + 0x9B9C, 0x5C46, 0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, + 0x9BA0, 0x5C4F, 0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, + 0x9BA4, 0x4E62, 0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, + 0x9BA8, 0x5C91, 0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, + 0x9BAC, 0x5CBB, 0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, + 0x9BB0, 0x5CC5, 0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, + 0x9BB4, 0x5CE9, 0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, + 0x9BB8, 0x5D8C, 0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, + 0x9BBC, 0x5D17, 0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, + 0x9BC0, 0x5D11, 0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, + 0x9BC4, 0x5D19, 0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, + 0x9BC8, 0x5D4E, 0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, + 0x9BCC, 0x5D76, 0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, + 0x9BD0, 0x5DA2, 0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, + 0x9BD4, 0x5DBD, 0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, + 0x9BD8, 0x5DC9, 0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, + 0x9BDC, 0x5DD6, 0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, + 0x9BE0, 0x5DF5, 0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, + 0x9BE4, 0x5E11, 0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, + 0x9BE8, 0x5E44, 0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, + 0x9BEC, 0x5E57, 0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, + 0x9BF0, 0x5E64, 0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, + 0x9BF4, 0x5E7A, 0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, + 0x9BF8, 0x5EC1, 0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, + 0x9BFC, 0x5ECF, 0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, + 0x9C43, 0x5EDA, 0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, + 0x9C47, 0x5EE8, 0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, + 0x9C4B, 0x5EF3, 0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, + 0x9C4F, 0x5EFE, 0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, + 0x9C53, 0x5F5C, 0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, + 0x9C57, 0x5F29, 0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, + 0x9C5B, 0x5F48, 0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, + 0x9C5F, 0x5F51, 0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, + 0x9C63, 0x5F61, 0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, + 0x9C67, 0x5F83, 0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, + 0x9C6B, 0x5F88, 0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, + 0x9C6F, 0x5F99, 0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, + 0x9C73, 0x5FAD, 0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, + 0x9C77, 0x5FE4, 0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, + 0x9C7B, 0x60B3, 0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, + 0x9C80, 0x6019, 0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, + 0x9C84, 0x6031, 0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, + 0x9C88, 0x6026, 0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, + 0x9C8C, 0x6041, 0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, + 0x9C90, 0x604A, 0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, + 0x9C94, 0x6043, 0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, + 0x9C98, 0x606B, 0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, + 0x9C9C, 0x60E7, 0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, + 0x9CA0, 0x609B, 0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, + 0x9CA4, 0x60A7, 0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, + 0x9CA8, 0x60E0, 0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, + 0x9CAC, 0x60BD, 0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, + 0x9CB0, 0x614D, 0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, + 0x9CB4, 0x60F7, 0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, + 0x9CB8, 0x6103, 0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, + 0x9CBC, 0x610D, 0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, + 0x9CC0, 0x6128, 0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, + 0x9CC4, 0x613C, 0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, + 0x9CC8, 0x6142, 0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, + 0x9CCC, 0x6158, 0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, + 0x9CD0, 0x6174, 0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, + 0x9CD4, 0x615F, 0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, + 0x9CD8, 0x6199, 0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, + 0x9CDC, 0x6194, 0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, + 0x9CE0, 0x61AB, 0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, + 0x9CE4, 0x61C9, 0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, + 0x9CE8, 0x61C6, 0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, + 0x9CEC, 0x61CD, 0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, + 0x9CF0, 0x61FA, 0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, + 0x9CF4, 0x61FC, 0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, + 0x9CF8, 0x6209, 0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, + 0x9CFC, 0x621B, 0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, + 0x9D43, 0x622E, 0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, + 0x9D47, 0x6241, 0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, + 0x9D4B, 0x625B, 0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, + 0x9D4F, 0x6282, 0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, + 0x9D53, 0x6293, 0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, + 0x9D57, 0x6294, 0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, + 0x9D5B, 0x62CF, 0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, + 0x9D5F, 0x62C8, 0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, + 0x9D63, 0x62C2, 0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, + 0x9D67, 0x630C, 0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, + 0x9D6B, 0x6302, 0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, + 0x9D6F, 0x6350, 0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, + 0x9D73, 0x634F, 0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, + 0x9D77, 0x63AB, 0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, + 0x9D7B, 0x6389, 0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, + 0x9D80, 0x6369, 0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, + 0x9D84, 0x63C6, 0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, + 0x9D88, 0x63F6, 0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, + 0x9D8C, 0x6406, 0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, + 0x9D90, 0x651D, 0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, + 0x9D94, 0x6467, 0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, + 0x9D98, 0x652A, 0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, + 0x9D9C, 0x64A9, 0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, + 0x9DA0, 0x64D2, 0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, + 0x9DA4, 0x64D8, 0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, + 0x9DA8, 0x8209, 0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, + 0x9DAC, 0x64E3, 0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, + 0x9DB0, 0x64F4, 0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, + 0x9DB4, 0x64FD, 0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, + 0x9DB8, 0x6524, 0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, + 0x9DBC, 0x6535, 0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, + 0x9DC0, 0x754B, 0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, + 0x9DC4, 0x654D, 0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, + 0x9DC8, 0x6572, 0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, + 0x9DCC, 0x8B8A, 0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, + 0x9DD0, 0x65B7, 0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, + 0x9DD4, 0x65C4, 0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, + 0x9DD8, 0x65D9, 0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, + 0x9DDC, 0x6772, 0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, + 0x9DE0, 0x6773, 0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, + 0x9DE4, 0x661C, 0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, + 0x9DE8, 0x6641, 0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, + 0x9DEC, 0x6667, 0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, + 0x9DF0, 0x6670, 0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, + 0x9DF4, 0x6689, 0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, + 0x9DF8, 0x66C1, 0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, + 0x9DFC, 0x66BC, 0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, + 0x9E43, 0x66DA, 0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, + 0x9E47, 0x66E9, 0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, + 0x9E4B, 0x670F, 0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, + 0x9E4F, 0x6727, 0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, + 0x9E53, 0x6736, 0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, + 0x9E57, 0x6746, 0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, + 0x9E5B, 0x6763, 0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, + 0x9E5F, 0x67A9, 0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, + 0x9E63, 0x678B, 0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, + 0x9E67, 0x67B7, 0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, + 0x9E6B, 0x67B3, 0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, + 0x9E6F, 0x67DE, 0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, + 0x9E73, 0x67B9, 0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, + 0x9E77, 0x6A9C, 0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, + 0x9E7B, 0x6840, 0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, + 0x9E80, 0x68B3, 0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, + 0x9E84, 0x6877, 0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, + 0x9E88, 0x68AD, 0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, + 0x9E8C, 0x6883, 0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, + 0x9E90, 0x68B5, 0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, + 0x9E94, 0x688D, 0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, + 0x9E98, 0x6908, 0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, + 0x9E9C, 0x68E1, 0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, + 0x9EA0, 0x68E7, 0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, + 0x9EA4, 0x6904, 0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, + 0x9EA8, 0x68F9, 0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, + 0x9EAC, 0x692A, 0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, + 0x9EB0, 0x68C6, 0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, + 0x9EB4, 0x6978, 0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, + 0x9EB8, 0x696E, 0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, + 0x9EBC, 0x6959, 0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, + 0x9EC0, 0x695D, 0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, + 0x9EC4, 0x69AE, 0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, + 0x9EC8, 0x69D3, 0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, + 0x9ECC, 0x69CA, 0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, + 0x9ED0, 0x69A7, 0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, + 0x9ED4, 0x699C, 0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, + 0x9ED8, 0x69E8, 0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, + 0x9EDC, 0x6B0A, 0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, + 0x9EE0, 0x6A05, 0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, + 0x9EE4, 0x6A14, 0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, + 0x9EE8, 0x6AC1, 0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, + 0x9EEC, 0x6A0C, 0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, + 0x9EF0, 0x6A47, 0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, + 0x9EF4, 0x6A48, 0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, + 0x9EF8, 0x6A8D, 0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, + 0x9EFC, 0x6AA3, 0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, + 0x9F43, 0x6AC3, 0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, + 0x9F47, 0x6AAC, 0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, + 0x9F4B, 0x6AAA, 0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, + 0x9F4F, 0x6B05, 0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, + 0x9F53, 0x6B16, 0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, + 0x9F57, 0x6B37, 0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, + 0x9F5B, 0x6B47, 0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, + 0x9F5F, 0x6B59, 0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, + 0x9F63, 0x6B61, 0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, + 0x9F67, 0x6B80, 0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, + 0x9F6B, 0x6B98, 0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, + 0x9F6F, 0x6BAA, 0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, + 0x9F73, 0x6BB1, 0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, + 0x9F77, 0x6BC6, 0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, + 0x9F7B, 0x6BEC, 0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, + 0x9F80, 0x9EBE, 0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, + 0x9F84, 0x6C1B, 0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, + 0x9F88, 0x6C55, 0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, + 0x9F8C, 0x6C8D, 0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, + 0x9F90, 0x6C7E, 0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, + 0x9F94, 0x6C90, 0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, + 0x9F98, 0x6CBD, 0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, + 0x9F9C, 0x6CAE, 0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, + 0x9FA0, 0x6CDB, 0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, + 0x9FA4, 0x6D1F, 0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, + 0x9FA8, 0x6D3D, 0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, + 0x9FAC, 0x6D33, 0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, + 0x9FB0, 0x6D93, 0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, + 0x9FB4, 0x6D59, 0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, + 0x9FB8, 0x6D85, 0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, + 0x9FBC, 0x6DB5, 0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, + 0x9FC0, 0x6DC6, 0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, + 0x9FC4, 0x6DE8, 0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, + 0x9FC8, 0x6DD9, 0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, + 0x9FCC, 0x6DEE, 0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, + 0x9FD0, 0x6E19, 0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, + 0x9FD4, 0x6E23, 0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, + 0x9FD8, 0x6E4D, 0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, + 0x9FDC, 0x6E4E, 0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, + 0x9FE0, 0x6E38, 0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, + 0x9FE4, 0x6EC9, 0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, + 0x9FE8, 0x6EAF, 0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, + 0x9FEC, 0x6ED5, 0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, + 0x9FF0, 0x6E9F, 0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, + 0x9FF4, 0x6EEC, 0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, + 0x9FF8, 0x6EF2, 0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, + 0x9FFC, 0x6ECC, 0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, + 0xE043, 0x6F86, 0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, + 0xE047, 0x6F80, 0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, + 0xE04B, 0x6F6D, 0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, + 0xE04F, 0x6F8E, 0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, + 0xE053, 0x6FB3, 0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, + 0xE057, 0x6FB9, 0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, + 0xE05B, 0x6FD5, 0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, + 0xE05F, 0x6FF1, 0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, + 0xE063, 0x700B, 0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, + 0xE067, 0x700F, 0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, + 0xE06B, 0x6F74, 0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, + 0xE06F, 0x7030, 0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, + 0xE073, 0x7063, 0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, + 0xE077, 0x70F1, 0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, + 0xE07B, 0x70AE, 0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, + 0xE080, 0x70D9, 0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, + 0xE084, 0x7119, 0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, + 0xE088, 0x7166, 0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, + 0xE08C, 0x716C, 0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, + 0xE090, 0x7195, 0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, + 0xE094, 0x71B9, 0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, + 0xE098, 0x71D4, 0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, + 0xE09C, 0x71E7, 0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, + 0xE0A0, 0x71FF, 0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, + 0xE0A4, 0x7228, 0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, + 0xE0A8, 0x7232, 0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, + 0xE0AC, 0x7240, 0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, + 0xE0B0, 0x7274, 0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, + 0xE0B4, 0x7287, 0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, + 0xE0B8, 0x72A7, 0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, + 0xE0BC, 0x72C6, 0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, + 0xE0C0, 0x72E2, 0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, + 0xE0C4, 0x72F7, 0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, + 0xE0C8, 0x731C, 0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, + 0xE0CC, 0x732F, 0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, + 0xE0D0, 0x734E, 0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, + 0xE0D4, 0x736A, 0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, + 0xE0D8, 0x7375, 0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, + 0xE0DC, 0x73B3, 0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, + 0xE0E0, 0x73E5, 0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, + 0xE0E4, 0x7405, 0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, + 0xE0E8, 0x7432, 0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, + 0xE0EC, 0x745F, 0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, + 0xE0F0, 0x7469, 0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, + 0xE0F4, 0x7476, 0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, + 0xE0F8, 0x74A7, 0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, + 0xE0FC, 0x73F1, 0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, + 0xE143, 0x74E9, 0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, + 0xE147, 0x74F1, 0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, + 0xE14B, 0x7503, 0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, + 0xE14F, 0x750D, 0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, + 0xE153, 0x7526, 0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, + 0xE157, 0x754D, 0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, + 0xE15B, 0x7546, 0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, + 0xE15F, 0x7567, 0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, + 0xE163, 0x7576, 0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, + 0xE167, 0x758A, 0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, + 0xE16B, 0x759A, 0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, + 0xE16F, 0x75C2, 0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, + 0xE173, 0x75BD, 0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, + 0xE177, 0x75CD, 0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, + 0xE17B, 0x75E3, 0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, + 0xE180, 0x75FC, 0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, + 0xE184, 0x75F2, 0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, + 0xE188, 0x7609, 0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, + 0xE18C, 0x7621, 0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, + 0xE190, 0x7630, 0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, + 0xE194, 0x7646, 0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, + 0xE198, 0x7662, 0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, + 0xE19C, 0x7667, 0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, + 0xE1A0, 0x7676, 0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, + 0xE1A4, 0x7683, 0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, + 0xE1A8, 0x7696, 0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, + 0xE1AC, 0x76B0, 0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, + 0xE1B0, 0x76BA, 0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, + 0xE1B4, 0x76D2, 0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, + 0xE1B8, 0x76E7, 0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, + 0xE1BC, 0x7708, 0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, + 0xE1C0, 0x7724, 0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, + 0xE1C4, 0x771B, 0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, + 0xE1C8, 0x775A, 0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, + 0xE1CC, 0x7765, 0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, + 0xE1D0, 0x778E, 0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, + 0xE1D4, 0x779E, 0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, + 0xE1D8, 0x77BF, 0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, + 0xE1DC, 0x77C7, 0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, + 0xE1E0, 0x77DC, 0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, + 0xE1E4, 0x780C, 0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, + 0xE1E8, 0x792A, 0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, + 0xE1EC, 0x7886, 0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, + 0xE1F0, 0x78A3, 0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, + 0xE1F4, 0x78D1, 0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, + 0xE1F8, 0x78BE, 0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, + 0xE1FC, 0x78EC, 0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, + 0xE243, 0x78F4, 0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, + 0xE247, 0x7919, 0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, + 0xE24B, 0x7960, 0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, + 0xE24F, 0x7955, 0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, + 0xE253, 0x798A, 0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, + 0xE257, 0x79AA, 0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, + 0xE25B, 0x79BA, 0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, + 0xE25F, 0x79EC, 0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, + 0xE263, 0x7A0D, 0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, + 0xE267, 0x7A1F, 0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, + 0xE26B, 0x7A3E, 0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, + 0xE26F, 0x7A49, 0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, + 0xE273, 0x9F9D, 0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, + 0xE277, 0x7A88, 0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, + 0xE27B, 0x7A96, 0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, + 0xE280, 0x7AB6, 0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, + 0xE284, 0x9083, 0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, + 0xE288, 0x7ACF, 0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, + 0xE28C, 0x7ADA, 0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, + 0xE290, 0x7AE6, 0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, + 0xE294, 0x7B0F, 0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, + 0xE298, 0x7B18, 0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, + 0xE29C, 0x7B28, 0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, + 0xE2A0, 0x7B04, 0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, + 0xE2A4, 0x7B45, 0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, + 0xE2A8, 0x7B67, 0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, + 0xE2AC, 0x7B6E, 0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, + 0xE2B0, 0x7B8D, 0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, + 0xE2B4, 0x7B92, 0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, + 0xE2B8, 0x7BCB, 0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, + 0xE2BC, 0x7BB4, 0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, + 0xE2C0, 0x7C11, 0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, + 0xE2C4, 0x7C60, 0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, + 0xE2C8, 0x7BF3, 0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, + 0xE2CC, 0x7BF6, 0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, + 0xE2D0, 0x7C1F, 0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, + 0xE2D4, 0x7C4C, 0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, + 0xE2D8, 0x7C40, 0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, + 0xE2DC, 0x7C64, 0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, + 0xE2E0, 0x7C75, 0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, + 0xE2E4, 0x7CAD, 0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, + 0xE2E8, 0x7CA8, 0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, + 0xE2EC, 0x7CAE, 0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, + 0xE2F0, 0x7CC5, 0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, + 0xE2F4, 0x7CDC, 0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, + 0xE2F8, 0x7CF2, 0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, + 0xE2FC, 0x7D06, 0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, + 0xE343, 0x7D0A, 0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, + 0xE347, 0x7D32, 0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, + 0xE34B, 0x7D73, 0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, + 0xE34F, 0x7D68, 0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, + 0xE353, 0x7D93, 0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, + 0xE357, 0x7D7D, 0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, + 0xE35B, 0x7DA3, 0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, + 0xE35F, 0x7DAB, 0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, + 0xE363, 0x7DDC, 0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, + 0xE367, 0x7DD8, 0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, + 0xE36B, 0x7DFB, 0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, + 0xE36F, 0x7E0A, 0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, + 0xE373, 0x7E31, 0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, + 0xE377, 0x7E22, 0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, + 0xE37B, 0x7E35, 0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, + 0xE380, 0x7E32, 0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, + 0xE384, 0x7E56, 0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, + 0xE388, 0x7E79, 0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, + 0xE38C, 0x7E7B, 0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, + 0xE390, 0x8FAE, 0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, + 0xE394, 0x7E8C, 0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, + 0xE398, 0x7E94, 0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, + 0xE39C, 0x7E9C, 0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, + 0xE3A0, 0x7F4C, 0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, + 0xE3A4, 0x7F51, 0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, + 0xE3A8, 0x7F5F, 0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, + 0xE3AC, 0x7F67, 0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, + 0xE3B0, 0x7F83, 0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, + 0xE3B4, 0x7F94, 0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, + 0xE3B8, 0x7FA3, 0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, + 0xE3BC, 0x7FAE, 0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, + 0xE3C0, 0x7FC5, 0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, + 0xE3C4, 0x7FD4, 0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, + 0xE3C8, 0x7FF3, 0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, + 0xE3CC, 0x8004, 0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, + 0xE3D0, 0x8019, 0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, + 0xE3D4, 0x803F, 0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, + 0xE3D8, 0x8052, 0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, + 0xE3DC, 0x8062, 0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, + 0xE3E0, 0x8070, 0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, + 0xE3E4, 0x807F, 0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, + 0xE3E8, 0x809B, 0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, + 0xE3EC, 0x5190, 0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, + 0xE3F0, 0x80D9, 0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, + 0xE3F4, 0x80D6, 0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, + 0xE3F8, 0x811B, 0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, + 0xE3FC, 0x814B, 0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, + 0xE443, 0x8153, 0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, + 0xE447, 0x816E, 0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, + 0xE44B, 0x8183, 0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, + 0xE44F, 0x8182, 0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, + 0xE453, 0x81A3, 0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, + 0xE457, 0x81B0, 0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, + 0xE45B, 0x81BD, 0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, + 0xE45F, 0x81C9, 0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, + 0xE463, 0x81D8, 0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, + 0xE467, 0x81E0, 0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, + 0xE46B, 0x81FE, 0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, + 0xE46F, 0x8207, 0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, + 0xE473, 0x8216, 0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, + 0xE477, 0x8233, 0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, + 0xE47B, 0x825D, 0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, + 0xE480, 0x8262, 0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, + 0xE484, 0x822E, 0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, + 0xE488, 0x827E, 0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, + 0xE48C, 0x829F, 0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, + 0xE490, 0x82E3, 0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, + 0xE494, 0x82F3, 0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, + 0xE498, 0x82FB, 0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, + 0xE49C, 0x82DC, 0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, + 0xE4A0, 0x8334, 0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, + 0xE4A4, 0x8340, 0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, + 0xE4A8, 0x832F, 0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, + 0xE4AC, 0x8385, 0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, + 0xE4B0, 0x83A2, 0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, + 0xE4B4, 0x8387, 0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, + 0xE4B8, 0x8373, 0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, + 0xE4BC, 0x83A8, 0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, + 0xE4C0, 0x83CE, 0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, + 0xE4C4, 0x840B, 0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, + 0xE4C8, 0x83E0, 0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, + 0xE4CC, 0x8420, 0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, + 0xE4D0, 0x83FB, 0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, + 0xE4D4, 0x855A, 0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, + 0xE4D8, 0x84AD, 0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, + 0xE4DC, 0x8446, 0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, + 0xE4E0, 0x8435, 0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, + 0xE4E4, 0x84BF, 0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, + 0xE4E8, 0x84BB, 0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, + 0xE4EC, 0x84C6, 0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, + 0xE4F0, 0x84FF, 0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, + 0xE4F4, 0x852C, 0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, + 0xE4F8, 0x84FC, 0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, + 0xE4FC, 0x8548, 0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, + 0xE543, 0x8555, 0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, + 0xE547, 0x8591, 0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, + 0xE54B, 0x8594, 0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, + 0xE54F, 0x859C, 0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, + 0xE553, 0x85C9, 0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, + 0xE557, 0x85D0, 0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, + 0xE55B, 0x85DC, 0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, + 0xE55F, 0x860B, 0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, + 0xE563, 0x8622, 0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, + 0xE567, 0x864D, 0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, + 0xE56B, 0x8667, 0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, + 0xE56F, 0x86A9, 0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, + 0xE573, 0x86B6, 0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, + 0xE577, 0x86B0, 0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, + 0xE57B, 0x86D4, 0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, + 0xE580, 0x86DF, 0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, + 0xE584, 0x8706, 0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, + 0xE588, 0x86FB, 0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, + 0xE58C, 0x86F9, 0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, + 0xE590, 0x8737, 0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, + 0xE594, 0x871A, 0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, + 0xE598, 0x874C, 0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, + 0xE59C, 0x8768, 0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, + 0xE5A0, 0x8763, 0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, + 0xE5A4, 0x879F, 0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, + 0xE5A8, 0x87BD, 0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, + 0xE5AC, 0x87AB, 0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, + 0xE5B0, 0x87C6, 0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, + 0xE5B4, 0x87E0, 0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, + 0xE5B8, 0x87F6, 0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, + 0xE5BC, 0x8811, 0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, + 0xE5C0, 0x8821, 0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, + 0xE5C4, 0x8827, 0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, + 0xE5C8, 0x8852, 0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, + 0xE5CC, 0x886B, 0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, + 0xE5D0, 0x8875, 0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, + 0xE5D4, 0x8882, 0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, + 0xE5D8, 0x8899, 0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, + 0xE5DC, 0x88B0, 0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, + 0xE5E0, 0x88C4, 0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, + 0xE5E4, 0x88DD, 0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, + 0xE5E8, 0x88F4, 0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, + 0xE5EC, 0x890C, 0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, + 0xE5F0, 0x891E, 0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, + 0xE5F4, 0x8941, 0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, + 0xE5F8, 0x8938, 0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, + 0xE5FC, 0x895E, 0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, + 0xE643, 0x896A, 0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, + 0xE647, 0x897E, 0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, + 0xE64B, 0x8993, 0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, + 0xE64F, 0x89A6, 0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, + 0xE653, 0x89BA, 0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, + 0xE657, 0x89DA, 0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, + 0xE65B, 0x89F4, 0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, + 0xE65F, 0x8A10, 0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, + 0xE663, 0x8A25, 0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, + 0xE667, 0x8A52, 0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, + 0xE66B, 0x8A6D, 0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, + 0xE66F, 0x8A82, 0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, + 0xE673, 0x8A91, 0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, + 0xE677, 0x8AA3, 0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, + 0xE67B, 0x8ADA, 0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, + 0xE680, 0x8AE4, 0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, + 0xE684, 0x8AE2, 0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, + 0xE688, 0x8B0C, 0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, + 0xE68C, 0x8B16, 0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, + 0xE690, 0x8B33, 0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, + 0xE694, 0x8B3E, 0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, + 0xE698, 0x8B4F, 0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, + 0xE69C, 0x8B5B, 0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, + 0xE6A0, 0x8B6C, 0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, + 0xE6A4, 0x8B80, 0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, + 0xE6A8, 0x8B93, 0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, + 0xE6AC, 0x8C3A, 0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, + 0xE6B0, 0x8C4C, 0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, + 0xE6B4, 0x8C62, 0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, + 0xE6B8, 0x8C82, 0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, + 0xE6BC, 0x8C8D, 0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, + 0xE6C0, 0x8C98, 0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, + 0xE6C4, 0x8CBD, 0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, + 0xE6C8, 0x8CB6, 0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, + 0xE6CC, 0x8CE3, 0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, + 0xE6D0, 0x8CFB, 0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, + 0xE6D4, 0x8D07, 0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, + 0xE6D8, 0x9F4E, 0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, + 0xE6DC, 0x8D16, 0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, + 0xE6E0, 0x8D73, 0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, + 0xE6E4, 0x8DBE, 0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, + 0xE6E8, 0x8DD6, 0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, + 0xE6EC, 0x8DEA, 0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, + 0xE6F0, 0x8DFC, 0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, + 0xE6F4, 0x8E1D, 0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, + 0xE6F8, 0x8E42, 0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, + 0xE6FC, 0x8E4A, 0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, + 0xE743, 0x8E50, 0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, + 0xE747, 0x8E60, 0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, + 0xE74B, 0x8E76, 0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, + 0xE74F, 0x8E87, 0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, + 0xE753, 0x8E8A, 0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, + 0xE757, 0x8E99, 0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, + 0xE75B, 0x8EB0, 0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, + 0xE75F, 0x8EC5, 0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, + 0xE763, 0x8EE3, 0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, + 0xE767, 0x8EFE, 0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, + 0xE76B, 0x8F12, 0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, + 0xE76F, 0x8F1F, 0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, + 0xE773, 0x8F33, 0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, + 0xE777, 0x8F42, 0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, + 0xE77B, 0x8F46, 0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, + 0xE780, 0x8F62, 0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, + 0xE784, 0x8F9F, 0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, + 0xE788, 0x8FB7, 0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, + 0xE78C, 0x8FEA, 0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, + 0xE790, 0x9005, 0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, + 0xE794, 0x9015, 0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, + 0xE798, 0x9016, 0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, + 0xE79C, 0x9035, 0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, + 0xE7A0, 0x9050, 0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, + 0xE7A4, 0x9049, 0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, + 0xE7A8, 0x905E, 0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, + 0xE7AC, 0x96A8, 0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, + 0xE7B0, 0x9081, 0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, + 0xE7B4, 0x908F, 0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, + 0xE7B8, 0x90B5, 0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, + 0xE7BC, 0x90DB, 0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, + 0xE7C0, 0x9132, 0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, + 0xE7C4, 0x9158, 0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, + 0xE7C8, 0x9173, 0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, + 0xE7CC, 0x9182, 0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, + 0xE7D0, 0x91AA, 0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, + 0xE7D4, 0x91C0, 0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, + 0xE7D8, 0x91D0, 0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, + 0xE7DC, 0x91DB, 0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, + 0xE7E0, 0x921E, 0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, + 0xE7E4, 0x9215, 0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, + 0xE7E8, 0x9245, 0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, + 0xE7EC, 0x9295, 0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, + 0xE7F0, 0x929C, 0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, + 0xE7F4, 0x925A, 0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, + 0xE7F8, 0x92E9, 0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, + 0xE7FC, 0x932E, 0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, + 0xE843, 0x9323, 0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, + 0xE847, 0x935C, 0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, + 0xE84B, 0x9356, 0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, + 0xE84F, 0x9394, 0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, + 0xE853, 0x93E8, 0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, + 0xE857, 0x93DD, 0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, + 0xE85B, 0x941A, 0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, + 0xE85F, 0x9407, 0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, + 0xE863, 0x9435, 0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, + 0xE867, 0x9452, 0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, + 0xE86B, 0x9462, 0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, + 0xE86F, 0x9470, 0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, + 0xE873, 0x945A, 0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, + 0xE877, 0x947F, 0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, + 0xE87B, 0x9594, 0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, + 0xE880, 0x95A0, 0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, + 0xE884, 0x95BC, 0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, + 0xE888, 0x95CA, 0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, + 0xE88C, 0x95CC, 0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, + 0xE890, 0x95DC, 0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, + 0xE894, 0x9621, 0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, + 0xE898, 0x9642, 0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, + 0xE89C, 0x9677, 0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, + 0xE8A0, 0x965F, 0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, + 0xE8A4, 0x968D, 0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, + 0xE8A8, 0x96AA, 0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, + 0xE8AC, 0x96B0, 0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, + 0xE8B0, 0x96B9, 0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, + 0xE8B4, 0x96CD, 0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, + 0xE8B8, 0x96D5, 0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, + 0xE8BC, 0x9708, 0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, + 0xE8C0, 0x970F, 0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, + 0xE8C4, 0x972A, 0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, + 0xE8C8, 0x973E, 0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, + 0xE8CC, 0x9742, 0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, + 0xE8D0, 0x9764, 0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, + 0xE8D4, 0x976B, 0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, + 0xE8D8, 0x977C, 0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, + 0xE8DC, 0x978B, 0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, + 0xE8E0, 0x97A8, 0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, + 0xE8E4, 0x97B4, 0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, + 0xE8E8, 0x97CB, 0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, + 0xE8EC, 0x97F2, 0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, + 0xE8F0, 0x980F, 0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, + 0xE8F4, 0x9821, 0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, + 0xE8F8, 0x984F, 0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, + 0xE8FC, 0x9870, 0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, + 0xE943, 0x98AA, 0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, + 0xE947, 0x98C4, 0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, + 0xE94B, 0x98EB, 0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, + 0xE94F, 0x9914, 0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, + 0xE953, 0x991E, 0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, + 0xE957, 0x992E, 0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, + 0xE95B, 0x9949, 0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, + 0xE95F, 0x9951, 0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, + 0xE963, 0x9997, 0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, + 0xE967, 0x99AE, 0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, + 0xE96B, 0x99DD, 0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, + 0xE96F, 0x99EE, 0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, + 0xE973, 0x99F8, 0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, + 0xE977, 0x99E2, 0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, + 0xE97B, 0x9A45, 0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, + 0xE980, 0x9A3E, 0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, + 0xE984, 0x9A57, 0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, + 0xE988, 0x9A64, 0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, + 0xE98C, 0x9AAD, 0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, + 0xE990, 0x9ACF, 0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, + 0xE994, 0x9ADE, 0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, + 0xE998, 0x9AE6, 0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, + 0xE99C, 0x9AF4, 0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, + 0xE9A0, 0x9B06, 0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, + 0xE9A4, 0x9B22, 0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, + 0xE9A8, 0x9B28, 0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, + 0xE9AC, 0x9B2F, 0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, + 0xE9B0, 0x9B4F, 0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, + 0xE9B4, 0x9B58, 0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, + 0xE9B8, 0x9B91, 0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, + 0xE9BC, 0x9BA0, 0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, + 0xE9C0, 0x9BCA, 0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, + 0xE9C4, 0x9BD1, 0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, + 0xE9C8, 0x9BE4, 0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, + 0xE9CC, 0x9BF2, 0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, + 0xE9D0, 0x9C14, 0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, + 0xE9D4, 0x9C06, 0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, + 0xE9D8, 0x9C04, 0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, + 0xE9DC, 0x9C24, 0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, + 0xE9E0, 0x9C32, 0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, + 0xE9E4, 0x9C60, 0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, + 0xE9E8, 0x9CE7, 0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, + 0xE9EC, 0x9D08, 0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, + 0xE9F0, 0x9D2A, 0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, + 0xE9F4, 0x9D1F, 0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, + 0xE9F8, 0x9D41, 0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, + 0xE9FC, 0x9D48, 0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, + 0xEA43, 0x9D51, 0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, + 0xEA47, 0x9D89, 0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, + 0xEA4B, 0x9D7A, 0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, + 0xEA4F, 0x9DB2, 0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, + 0xEA53, 0x9DB8, 0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, + 0xEA57, 0x9DC2, 0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, + 0xEA5B, 0x9DE6, 0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, + 0xEA5F, 0x9E1A, 0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, + 0xEA63, 0x9E79, 0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, + 0xEA67, 0x9E8B, 0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, + 0xEA6B, 0x9E91, 0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, + 0xEA6F, 0x9EB8, 0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, + 0xEA73, 0x9ECC, 0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, + 0xEA77, 0x9ED4, 0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, + 0xEA7B, 0x9EE0, 0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, + 0xEA80, 0x9EF4, 0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, + 0xEA84, 0x9EFB, 0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, + 0xEA88, 0x9F08, 0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, + 0xEA8C, 0x9F2C, 0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, + 0xEA90, 0x9F54, 0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, + 0xEA94, 0x9F61, 0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, + 0xEA98, 0x9F6A, 0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, + 0xEA9C, 0x9F95, 0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, + 0xEAA0, 0x69C7, 0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, + 0xEAA4, 0x7199, 0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, + 0xFA43, 0x2173, 0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, + 0xFA47, 0x2177, 0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, + 0xFA56, 0xFF07, 0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, + 0xFA5E, 0x9348, 0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, + 0xFA62, 0x70BB, 0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, + 0xFA66, 0x66FB, 0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, + 0xFA6A, 0x4EFC, 0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, + 0xFA6E, 0x4F56, 0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, + 0xFA72, 0x4F94, 0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, + 0xFA76, 0x4FFF, 0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, + 0xFA7A, 0x5042, 0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, + 0xFA7E, 0x514A, 0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, + 0xFA83, 0x51EC, 0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, + 0xFA87, 0x52C0, 0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, + 0xFA8B, 0x5324, 0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, + 0xFA8F, 0x53DD, 0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, + 0xFA93, 0x54A9, 0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, + 0xFA97, 0x5765, 0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, + 0xFA9B, 0xFA0F, 0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, + 0xFA9F, 0x590B, 0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, + 0xFAA3, 0x5963, 0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, + 0xFAA7, 0x5BC0, 0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, + 0xFAAB, 0x5C1E, 0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, + 0xFAAF, 0x5D27, 0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, + 0xFAB3, 0x5D6D, 0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, + 0xFAB7, 0x5F21, 0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, + 0xFABB, 0x5FDE, 0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, + 0xFABF, 0x60DE, 0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, + 0xFAC3, 0x6111, 0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, + 0xFAC7, 0x6213, 0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, + 0xFACB, 0x649D, 0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, + 0xFACF, 0x6615, 0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, + 0xFAD3, 0x661E, 0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, + 0xFAD7, 0x6659, 0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, + 0xFADB, 0x66A0, 0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, + 0xFADF, 0x670E, 0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, + 0xFAE3, 0x6852, 0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, + 0xFAE7, 0x68CF, 0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, + 0xFAEB, 0x6998, 0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, + 0xFAEF, 0x6A46, 0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, + 0xFAF3, 0x6AE4, 0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, + 0xFAF7, 0x6C86, 0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, + 0xFAFB, 0x6D87, 0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, + 0xFB42, 0x6DCF, 0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, + 0xFB46, 0x6E39, 0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, + 0xFB4A, 0x6EBF, 0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, + 0xFB4E, 0x7005, 0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, + 0xFB52, 0x70AB, 0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, + 0xFB56, 0x7146, 0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, + 0xFB5A, 0x71FE, 0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, + 0xFB5E, 0xFA16, 0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, + 0xFB62, 0x73D6, 0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, + 0xFB66, 0x73F5, 0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, + 0xFB6A, 0x742E, 0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, + 0xFB6E, 0x7501, 0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, + 0xFB72, 0x769E, 0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, + 0xFB76, 0x7746, 0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, + 0xFB7A, 0x7864, 0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, + 0xFB7E, 0xFA19, 0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, + 0xFB83, 0x799B, 0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, + 0xFB87, 0x7AEB, 0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, + 0xFB8B, 0x7D5C, 0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, + 0xFB8F, 0x7E52, 0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, + 0xFB93, 0x8301, 0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, + 0xFB97, 0x83F6, 0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, + 0xFB9B, 0x8559, 0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, + 0xFB9F, 0xFA20, 0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, + 0xFBA3, 0x8A12, 0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, + 0xFBA7, 0x8ABE, 0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, + 0xFBAB, 0x8B53, 0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, + 0xFBAF, 0x8D12, 0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, + 0xFBB3, 0xFA24, 0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, + 0xFBB7, 0xFA26, 0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, + 0xFBBB, 0x91D7, 0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, + 0xFBBF, 0x91E4, 0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, + 0xFBC3, 0x920A, 0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, + 0xFBC7, 0x924E, 0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, + 0xFBCB, 0x9267, 0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, + 0xFBCF, 0x92E7, 0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, + 0xFBD3, 0xFA27, 0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, + 0xFBD7, 0x9325, 0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, + 0xFBDB, 0x931E, 0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, + 0xFBDF, 0x9370, 0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, + 0xFBE3, 0x93DE, 0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, + 0xFBE7, 0x9448, 0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, + 0xFBEB, 0x969D, 0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, + 0xFBEF, 0x9743, 0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, + 0xFBF3, 0x9755, 0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, + 0xFBF7, 0xFA2B, 0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, + 0xFBFB, 0x9A4E, 0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, + 0xFC42, 0x9B72, 0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, + 0xFC46, 0x9C00, 0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, + 0xFC4A, 0x9E19, 0xFC4B, 0x9ED1, 0, 0 +}; +#endif + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR src, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (src <= 0x80) { /* ASCII */ + c = src; + } else { +#if !_TINY_TABLE + if (dir) { /* OEMCP to unicode */ + p = sjis2uni; + hi = sizeof(sjis2uni) / 4 - 1; + } else { /* Unicode to OEMCP */ + p = uni2sjis; + hi = sizeof(uni2sjis) / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (src == p[i * 2]) break; + if (src > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; +#else + if (dir) { /* OEMCP to unicode (Incremental search)*/ + p = &uni2sjis[1]; + do { + c = *p; + p += 2; + p -= 3; + c = *p; + } while (c && c != src); + } else { /* Unicode to OEMCP */ + li = 0; hi = sizeof(uni2sjis) / 4 - 1; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (src == uni2sjis[i * 2]) break; + if (src > uni2sjis[i * 2]) + li = i; + else + hi = i; + } + c = n ? uni2sjis[i * 2 + 1] : 0; + } +#endif + } + + return c; +} + + + +WCHAR ff_wtoupper ( /* Upper converted character */ + WCHAR chr /* Input character */ +) +{ + static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; + static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; + int i; + + + for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + + return tbl_lower[i] ? tbl_upper[i] : chr; +} diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc936.c b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc936.c new file mode 100644 index 0000000..276a83f --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc936.c @@ -0,0 +1,10973 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ +/* */ +/* CP936 (Simplified Chinese GBK) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + + +#if !_USE_LFN || _CODE_PAGE != 936 +#error This file is not needed in current configuration. +#endif + +static +const WCHAR uni2oem[] = { +/* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ + 0x00A4, 0xA1E8, 0x00A7, 0xA1EC, 0x00A8, 0xA1A7, 0x00B0, 0xA1E3, + 0x00B1, 0xA1C0, 0x00B7, 0xA1A4, 0x00D7, 0xA1C1, 0x00E0, 0xA8A4, + 0x00E1, 0xA8A2, 0x00E8, 0xA8A8, 0x00E9, 0xA8A6, 0x00EA, 0xA8BA, + 0x00EC, 0xA8AC, 0x00ED, 0xA8AA, 0x00F2, 0xA8B0, 0x00F3, 0xA8AE, + 0x00F7, 0xA1C2, 0x00F9, 0xA8B4, 0x00FA, 0xA8B2, 0x00FC, 0xA8B9, + 0x0101, 0xA8A1, 0x0113, 0xA8A5, 0x011B, 0xA8A7, 0x012B, 0xA8A9, + 0x0144, 0xA8BD, 0x0148, 0xA8BE, 0x014D, 0xA8AD, 0x016B, 0xA8B1, + 0x01CE, 0xA8A3, 0x01D0, 0xA8AB, 0x01D2, 0xA8AF, 0x01D4, 0xA8B3, + 0x01D6, 0xA8B5, 0x01D8, 0xA8B6, 0x01DA, 0xA8B7, 0x01DC, 0xA8B8, + 0x0251, 0xA8BB, 0x0261, 0xA8C0, 0x02C7, 0xA1A6, 0x02C9, 0xA1A5, + 0x02CA, 0xA840, 0x02CB, 0xA841, 0x02D9, 0xA842, 0x0391, 0xA6A1, + 0x0392, 0xA6A2, 0x0393, 0xA6A3, 0x0394, 0xA6A4, 0x0395, 0xA6A5, + 0x0396, 0xA6A6, 0x0397, 0xA6A7, 0x0398, 0xA6A8, 0x0399, 0xA6A9, + 0x039A, 0xA6AA, 0x039B, 0xA6AB, 0x039C, 0xA6AC, 0x039D, 0xA6AD, + 0x039E, 0xA6AE, 0x039F, 0xA6AF, 0x03A0, 0xA6B0, 0x03A1, 0xA6B1, + 0x03A3, 0xA6B2, 0x03A4, 0xA6B3, 0x03A5, 0xA6B4, 0x03A6, 0xA6B5, + 0x03A7, 0xA6B6, 0x03A8, 0xA6B7, 0x03A9, 0xA6B8, 0x03B1, 0xA6C1, + 0x03B2, 0xA6C2, 0x03B3, 0xA6C3, 0x03B4, 0xA6C4, 0x03B5, 0xA6C5, + 0x03B6, 0xA6C6, 0x03B7, 0xA6C7, 0x03B8, 0xA6C8, 0x03B9, 0xA6C9, + 0x03BA, 0xA6CA, 0x03BB, 0xA6CB, 0x03BC, 0xA6CC, 0x03BD, 0xA6CD, + 0x03BE, 0xA6CE, 0x03BF, 0xA6CF, 0x03C0, 0xA6D0, 0x03C1, 0xA6D1, + 0x03C3, 0xA6D2, 0x03C4, 0xA6D3, 0x03C5, 0xA6D4, 0x03C6, 0xA6D5, + 0x03C7, 0xA6D6, 0x03C8, 0xA6D7, 0x03C9, 0xA6D8, 0x0401, 0xA7A7, + 0x0410, 0xA7A1, 0x0411, 0xA7A2, 0x0412, 0xA7A3, 0x0413, 0xA7A4, + 0x0414, 0xA7A5, 0x0415, 0xA7A6, 0x0416, 0xA7A8, 0x0417, 0xA7A9, + 0x0418, 0xA7AA, 0x0419, 0xA7AB, 0x041A, 0xA7AC, 0x041B, 0xA7AD, + 0x041C, 0xA7AE, 0x041D, 0xA7AF, 0x041E, 0xA7B0, 0x041F, 0xA7B1, + 0x0420, 0xA7B2, 0x0421, 0xA7B3, 0x0422, 0xA7B4, 0x0423, 0xA7B5, + 0x0424, 0xA7B6, 0x0425, 0xA7B7, 0x0426, 0xA7B8, 0x0427, 0xA7B9, + 0x0428, 0xA7BA, 0x0429, 0xA7BB, 0x042A, 0xA7BC, 0x042B, 0xA7BD, + 0x042C, 0xA7BE, 0x042D, 0xA7BF, 0x042E, 0xA7C0, 0x042F, 0xA7C1, + 0x0430, 0xA7D1, 0x0431, 0xA7D2, 0x0432, 0xA7D3, 0x0433, 0xA7D4, + 0x0434, 0xA7D5, 0x0435, 0xA7D6, 0x0436, 0xA7D8, 0x0437, 0xA7D9, + 0x0438, 0xA7DA, 0x0439, 0xA7DB, 0x043A, 0xA7DC, 0x043B, 0xA7DD, + 0x043C, 0xA7DE, 0x043D, 0xA7DF, 0x043E, 0xA7E0, 0x043F, 0xA7E1, + 0x0440, 0xA7E2, 0x0441, 0xA7E3, 0x0442, 0xA7E4, 0x0443, 0xA7E5, + 0x0444, 0xA7E6, 0x0445, 0xA7E7, 0x0446, 0xA7E8, 0x0447, 0xA7E9, + 0x0448, 0xA7EA, 0x0449, 0xA7EB, 0x044A, 0xA7EC, 0x044B, 0xA7ED, + 0x044C, 0xA7EE, 0x044D, 0xA7EF, 0x044E, 0xA7F0, 0x044F, 0xA7F1, + 0x0451, 0xA7D7, 0x2010, 0xA95C, 0x2013, 0xA843, 0x2014, 0xA1AA, + 0x2015, 0xA844, 0x2016, 0xA1AC, 0x2018, 0xA1AE, 0x2019, 0xA1AF, + 0x201C, 0xA1B0, 0x201D, 0xA1B1, 0x2025, 0xA845, 0x2026, 0xA1AD, + 0x2030, 0xA1EB, 0x2032, 0xA1E4, 0x2033, 0xA1E5, 0x2035, 0xA846, + 0x203B, 0xA1F9, 0x20AC, 0x0080, 0x2103, 0xA1E6, 0x2105, 0xA847, + 0x2109, 0xA848, 0x2116, 0xA1ED, 0x2121, 0xA959, 0x2160, 0xA2F1, + 0x2161, 0xA2F2, 0x2162, 0xA2F3, 0x2163, 0xA2F4, 0x2164, 0xA2F5, + 0x2165, 0xA2F6, 0x2166, 0xA2F7, 0x2167, 0xA2F8, 0x2168, 0xA2F9, + 0x2169, 0xA2FA, 0x216A, 0xA2FB, 0x216B, 0xA2FC, 0x2170, 0xA2A1, + 0x2171, 0xA2A2, 0x2172, 0xA2A3, 0x2173, 0xA2A4, 0x2174, 0xA2A5, + 0x2175, 0xA2A6, 0x2176, 0xA2A7, 0x2177, 0xA2A8, 0x2178, 0xA2A9, + 0x2179, 0xA2AA, 0x2190, 0xA1FB, 0x2191, 0xA1FC, 0x2192, 0xA1FA, + 0x2193, 0xA1FD, 0x2196, 0xA849, 0x2197, 0xA84A, 0x2198, 0xA84B, + 0x2199, 0xA84C, 0x2208, 0xA1CA, 0x220F, 0xA1C7, 0x2211, 0xA1C6, + 0x2215, 0xA84D, 0x221A, 0xA1CC, 0x221D, 0xA1D8, 0x221E, 0xA1DE, + 0x221F, 0xA84E, 0x2220, 0xA1CF, 0x2223, 0xA84F, 0x2225, 0xA1CE, + 0x2227, 0xA1C4, 0x2228, 0xA1C5, 0x2229, 0xA1C9, 0x222A, 0xA1C8, + 0x222B, 0xA1D2, 0x222E, 0xA1D3, 0x2234, 0xA1E0, 0x2235, 0xA1DF, + 0x2236, 0xA1C3, 0x2237, 0xA1CB, 0x223D, 0xA1D7, 0x2248, 0xA1D6, + 0x224C, 0xA1D5, 0x2252, 0xA850, 0x2260, 0xA1D9, 0x2261, 0xA1D4, + 0x2264, 0xA1DC, 0x2265, 0xA1DD, 0x2266, 0xA851, 0x2267, 0xA852, + 0x226E, 0xA1DA, 0x226F, 0xA1DB, 0x2295, 0xA892, 0x2299, 0xA1D1, + 0x22A5, 0xA1CD, 0x22BF, 0xA853, 0x2312, 0xA1D0, 0x2460, 0xA2D9, + 0x2461, 0xA2DA, 0x2462, 0xA2DB, 0x2463, 0xA2DC, 0x2464, 0xA2DD, + 0x2465, 0xA2DE, 0x2466, 0xA2DF, 0x2467, 0xA2E0, 0x2468, 0xA2E1, + 0x2469, 0xA2E2, 0x2474, 0xA2C5, 0x2475, 0xA2C6, 0x2476, 0xA2C7, + 0x2477, 0xA2C8, 0x2478, 0xA2C9, 0x2479, 0xA2CA, 0x247A, 0xA2CB, + 0x247B, 0xA2CC, 0x247C, 0xA2CD, 0x247D, 0xA2CE, 0x247E, 0xA2CF, + 0x247F, 0xA2D0, 0x2480, 0xA2D1, 0x2481, 0xA2D2, 0x2482, 0xA2D3, + 0x2483, 0xA2D4, 0x2484, 0xA2D5, 0x2485, 0xA2D6, 0x2486, 0xA2D7, + 0x2487, 0xA2D8, 0x2488, 0xA2B1, 0x2489, 0xA2B2, 0x248A, 0xA2B3, + 0x248B, 0xA2B4, 0x248C, 0xA2B5, 0x248D, 0xA2B6, 0x248E, 0xA2B7, + 0x248F, 0xA2B8, 0x2490, 0xA2B9, 0x2491, 0xA2BA, 0x2492, 0xA2BB, + 0x2493, 0xA2BC, 0x2494, 0xA2BD, 0x2495, 0xA2BE, 0x2496, 0xA2BF, + 0x2497, 0xA2C0, 0x2498, 0xA2C1, 0x2499, 0xA2C2, 0x249A, 0xA2C3, + 0x249B, 0xA2C4, 0x2500, 0xA9A4, 0x2501, 0xA9A5, 0x2502, 0xA9A6, + 0x2503, 0xA9A7, 0x2504, 0xA9A8, 0x2505, 0xA9A9, 0x2506, 0xA9AA, + 0x2507, 0xA9AB, 0x2508, 0xA9AC, 0x2509, 0xA9AD, 0x250A, 0xA9AE, + 0x250B, 0xA9AF, 0x250C, 0xA9B0, 0x250D, 0xA9B1, 0x250E, 0xA9B2, + 0x250F, 0xA9B3, 0x2510, 0xA9B4, 0x2511, 0xA9B5, 0x2512, 0xA9B6, + 0x2513, 0xA9B7, 0x2514, 0xA9B8, 0x2515, 0xA9B9, 0x2516, 0xA9BA, + 0x2517, 0xA9BB, 0x2518, 0xA9BC, 0x2519, 0xA9BD, 0x251A, 0xA9BE, + 0x251B, 0xA9BF, 0x251C, 0xA9C0, 0x251D, 0xA9C1, 0x251E, 0xA9C2, + 0x251F, 0xA9C3, 0x2520, 0xA9C4, 0x2521, 0xA9C5, 0x2522, 0xA9C6, + 0x2523, 0xA9C7, 0x2524, 0xA9C8, 0x2525, 0xA9C9, 0x2526, 0xA9CA, + 0x2527, 0xA9CB, 0x2528, 0xA9CC, 0x2529, 0xA9CD, 0x252A, 0xA9CE, + 0x252B, 0xA9CF, 0x252C, 0xA9D0, 0x252D, 0xA9D1, 0x252E, 0xA9D2, + 0x252F, 0xA9D3, 0x2530, 0xA9D4, 0x2531, 0xA9D5, 0x2532, 0xA9D6, + 0x2533, 0xA9D7, 0x2534, 0xA9D8, 0x2535, 0xA9D9, 0x2536, 0xA9DA, + 0x2537, 0xA9DB, 0x2538, 0xA9DC, 0x2539, 0xA9DD, 0x253A, 0xA9DE, + 0x253B, 0xA9DF, 0x253C, 0xA9E0, 0x253D, 0xA9E1, 0x253E, 0xA9E2, + 0x253F, 0xA9E3, 0x2540, 0xA9E4, 0x2541, 0xA9E5, 0x2542, 0xA9E6, + 0x2543, 0xA9E7, 0x2544, 0xA9E8, 0x2545, 0xA9E9, 0x2546, 0xA9EA, + 0x2547, 0xA9EB, 0x2548, 0xA9EC, 0x2549, 0xA9ED, 0x254A, 0xA9EE, + 0x254B, 0xA9EF, 0x2550, 0xA854, 0x2551, 0xA855, 0x2552, 0xA856, + 0x2553, 0xA857, 0x2554, 0xA858, 0x2555, 0xA859, 0x2556, 0xA85A, + 0x2557, 0xA85B, 0x2558, 0xA85C, 0x2559, 0xA85D, 0x255A, 0xA85E, + 0x255B, 0xA85F, 0x255C, 0xA860, 0x255D, 0xA861, 0x255E, 0xA862, + 0x255F, 0xA863, 0x2560, 0xA864, 0x2561, 0xA865, 0x2562, 0xA866, + 0x2563, 0xA867, 0x2564, 0xA868, 0x2565, 0xA869, 0x2566, 0xA86A, + 0x2567, 0xA86B, 0x2568, 0xA86C, 0x2569, 0xA86D, 0x256A, 0xA86E, + 0x256B, 0xA86F, 0x256C, 0xA870, 0x256D, 0xA871, 0x256E, 0xA872, + 0x256F, 0xA873, 0x2570, 0xA874, 0x2571, 0xA875, 0x2572, 0xA876, + 0x2573, 0xA877, 0x2581, 0xA878, 0x2582, 0xA879, 0x2583, 0xA87A, + 0x2584, 0xA87B, 0x2585, 0xA87C, 0x2586, 0xA87D, 0x2587, 0xA87E, + 0x2588, 0xA880, 0x2589, 0xA881, 0x258A, 0xA882, 0x258B, 0xA883, + 0x258C, 0xA884, 0x258D, 0xA885, 0x258E, 0xA886, 0x258F, 0xA887, + 0x2593, 0xA888, 0x2594, 0xA889, 0x2595, 0xA88A, 0x25A0, 0xA1F6, + 0x25A1, 0xA1F5, 0x25B2, 0xA1F8, 0x25B3, 0xA1F7, 0x25BC, 0xA88B, + 0x25BD, 0xA88C, 0x25C6, 0xA1F4, 0x25C7, 0xA1F3, 0x25CB, 0xA1F0, + 0x25CE, 0xA1F2, 0x25CF, 0xA1F1, 0x25E2, 0xA88D, 0x25E3, 0xA88E, + 0x25E4, 0xA88F, 0x25E5, 0xA890, 0x2605, 0xA1EF, 0x2606, 0xA1EE, + 0x2609, 0xA891, 0x2640, 0xA1E2, 0x2642, 0xA1E1, 0x3000, 0xA1A1, + 0x3001, 0xA1A2, 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3005, 0xA1A9, + 0x3006, 0xA965, 0x3007, 0xA996, 0x3008, 0xA1B4, 0x3009, 0xA1B5, + 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, + 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BE, 0x3011, 0xA1BF, + 0x3012, 0xA893, 0x3013, 0xA1FE, 0x3014, 0xA1B2, 0x3015, 0xA1B3, + 0x3016, 0xA1BC, 0x3017, 0xA1BD, 0x301D, 0xA894, 0x301E, 0xA895, + 0x3021, 0xA940, 0x3022, 0xA941, 0x3023, 0xA942, 0x3024, 0xA943, + 0x3025, 0xA944, 0x3026, 0xA945, 0x3027, 0xA946, 0x3028, 0xA947, + 0x3029, 0xA948, 0x3041, 0xA4A1, 0x3042, 0xA4A2, 0x3043, 0xA4A3, + 0x3044, 0xA4A4, 0x3045, 0xA4A5, 0x3046, 0xA4A6, 0x3047, 0xA4A7, + 0x3048, 0xA4A8, 0x3049, 0xA4A9, 0x304A, 0xA4AA, 0x304B, 0xA4AB, + 0x304C, 0xA4AC, 0x304D, 0xA4AD, 0x304E, 0xA4AE, 0x304F, 0xA4AF, + 0x3050, 0xA4B0, 0x3051, 0xA4B1, 0x3052, 0xA4B2, 0x3053, 0xA4B3, + 0x3054, 0xA4B4, 0x3055, 0xA4B5, 0x3056, 0xA4B6, 0x3057, 0xA4B7, + 0x3058, 0xA4B8, 0x3059, 0xA4B9, 0x305A, 0xA4BA, 0x305B, 0xA4BB, + 0x305C, 0xA4BC, 0x305D, 0xA4BD, 0x305E, 0xA4BE, 0x305F, 0xA4BF, + 0x3060, 0xA4C0, 0x3061, 0xA4C1, 0x3062, 0xA4C2, 0x3063, 0xA4C3, + 0x3064, 0xA4C4, 0x3065, 0xA4C5, 0x3066, 0xA4C6, 0x3067, 0xA4C7, + 0x3068, 0xA4C8, 0x3069, 0xA4C9, 0x306A, 0xA4CA, 0x306B, 0xA4CB, + 0x306C, 0xA4CC, 0x306D, 0xA4CD, 0x306E, 0xA4CE, 0x306F, 0xA4CF, + 0x3070, 0xA4D0, 0x3071, 0xA4D1, 0x3072, 0xA4D2, 0x3073, 0xA4D3, + 0x3074, 0xA4D4, 0x3075, 0xA4D5, 0x3076, 0xA4D6, 0x3077, 0xA4D7, + 0x3078, 0xA4D8, 0x3079, 0xA4D9, 0x307A, 0xA4DA, 0x307B, 0xA4DB, + 0x307C, 0xA4DC, 0x307D, 0xA4DD, 0x307E, 0xA4DE, 0x307F, 0xA4DF, + 0x3080, 0xA4E0, 0x3081, 0xA4E1, 0x3082, 0xA4E2, 0x3083, 0xA4E3, + 0x3084, 0xA4E4, 0x3085, 0xA4E5, 0x3086, 0xA4E6, 0x3087, 0xA4E7, + 0x3088, 0xA4E8, 0x3089, 0xA4E9, 0x308A, 0xA4EA, 0x308B, 0xA4EB, + 0x308C, 0xA4EC, 0x308D, 0xA4ED, 0x308E, 0xA4EE, 0x308F, 0xA4EF, + 0x3090, 0xA4F0, 0x3091, 0xA4F1, 0x3092, 0xA4F2, 0x3093, 0xA4F3, + 0x309B, 0xA961, 0x309C, 0xA962, 0x309D, 0xA966, 0x309E, 0xA967, + 0x30A1, 0xA5A1, 0x30A2, 0xA5A2, 0x30A3, 0xA5A3, 0x30A4, 0xA5A4, + 0x30A5, 0xA5A5, 0x30A6, 0xA5A6, 0x30A7, 0xA5A7, 0x30A8, 0xA5A8, + 0x30A9, 0xA5A9, 0x30AA, 0xA5AA, 0x30AB, 0xA5AB, 0x30AC, 0xA5AC, + 0x30AD, 0xA5AD, 0x30AE, 0xA5AE, 0x30AF, 0xA5AF, 0x30B0, 0xA5B0, + 0x30B1, 0xA5B1, 0x30B2, 0xA5B2, 0x30B3, 0xA5B3, 0x30B4, 0xA5B4, + 0x30B5, 0xA5B5, 0x30B6, 0xA5B6, 0x30B7, 0xA5B7, 0x30B8, 0xA5B8, + 0x30B9, 0xA5B9, 0x30BA, 0xA5BA, 0x30BB, 0xA5BB, 0x30BC, 0xA5BC, + 0x30BD, 0xA5BD, 0x30BE, 0xA5BE, 0x30BF, 0xA5BF, 0x30C0, 0xA5C0, + 0x30C1, 0xA5C1, 0x30C2, 0xA5C2, 0x30C3, 0xA5C3, 0x30C4, 0xA5C4, + 0x30C5, 0xA5C5, 0x30C6, 0xA5C6, 0x30C7, 0xA5C7, 0x30C8, 0xA5C8, + 0x30C9, 0xA5C9, 0x30CA, 0xA5CA, 0x30CB, 0xA5CB, 0x30CC, 0xA5CC, + 0x30CD, 0xA5CD, 0x30CE, 0xA5CE, 0x30CF, 0xA5CF, 0x30D0, 0xA5D0, + 0x30D1, 0xA5D1, 0x30D2, 0xA5D2, 0x30D3, 0xA5D3, 0x30D4, 0xA5D4, + 0x30D5, 0xA5D5, 0x30D6, 0xA5D6, 0x30D7, 0xA5D7, 0x30D8, 0xA5D8, + 0x30D9, 0xA5D9, 0x30DA, 0xA5DA, 0x30DB, 0xA5DB, 0x30DC, 0xA5DC, + 0x30DD, 0xA5DD, 0x30DE, 0xA5DE, 0x30DF, 0xA5DF, 0x30E0, 0xA5E0, + 0x30E1, 0xA5E1, 0x30E2, 0xA5E2, 0x30E3, 0xA5E3, 0x30E4, 0xA5E4, + 0x30E5, 0xA5E5, 0x30E6, 0xA5E6, 0x30E7, 0xA5E7, 0x30E8, 0xA5E8, + 0x30E9, 0xA5E9, 0x30EA, 0xA5EA, 0x30EB, 0xA5EB, 0x30EC, 0xA5EC, + 0x30ED, 0xA5ED, 0x30EE, 0xA5EE, 0x30EF, 0xA5EF, 0x30F0, 0xA5F0, + 0x30F1, 0xA5F1, 0x30F2, 0xA5F2, 0x30F3, 0xA5F3, 0x30F4, 0xA5F4, + 0x30F5, 0xA5F5, 0x30F6, 0xA5F6, 0x30FC, 0xA960, 0x30FD, 0xA963, + 0x30FE, 0xA964, 0x3105, 0xA8C5, 0x3106, 0xA8C6, 0x3107, 0xA8C7, + 0x3108, 0xA8C8, 0x3109, 0xA8C9, 0x310A, 0xA8CA, 0x310B, 0xA8CB, + 0x310C, 0xA8CC, 0x310D, 0xA8CD, 0x310E, 0xA8CE, 0x310F, 0xA8CF, + 0x3110, 0xA8D0, 0x3111, 0xA8D1, 0x3112, 0xA8D2, 0x3113, 0xA8D3, + 0x3114, 0xA8D4, 0x3115, 0xA8D5, 0x3116, 0xA8D6, 0x3117, 0xA8D7, + 0x3118, 0xA8D8, 0x3119, 0xA8D9, 0x311A, 0xA8DA, 0x311B, 0xA8DB, + 0x311C, 0xA8DC, 0x311D, 0xA8DD, 0x311E, 0xA8DE, 0x311F, 0xA8DF, + 0x3120, 0xA8E0, 0x3121, 0xA8E1, 0x3122, 0xA8E2, 0x3123, 0xA8E3, + 0x3124, 0xA8E4, 0x3125, 0xA8E5, 0x3126, 0xA8E6, 0x3127, 0xA8E7, + 0x3128, 0xA8E8, 0x3129, 0xA8E9, 0x3220, 0xA2E5, 0x3221, 0xA2E6, + 0x3222, 0xA2E7, 0x3223, 0xA2E8, 0x3224, 0xA2E9, 0x3225, 0xA2EA, + 0x3226, 0xA2EB, 0x3227, 0xA2EC, 0x3228, 0xA2ED, 0x3229, 0xA2EE, + 0x3231, 0xA95A, 0x32A3, 0xA949, 0x338E, 0xA94A, 0x338F, 0xA94B, + 0x339C, 0xA94C, 0x339D, 0xA94D, 0x339E, 0xA94E, 0x33A1, 0xA94F, + 0x33C4, 0xA950, 0x33CE, 0xA951, 0x33D1, 0xA952, 0x33D2, 0xA953, + 0x33D5, 0xA954, 0x4E00, 0xD2BB, 0x4E01, 0xB6A1, 0x4E02, 0x8140, + 0x4E03, 0xC6DF, 0x4E04, 0x8141, 0x4E05, 0x8142, 0x4E06, 0x8143, + 0x4E07, 0xCDF2, 0x4E08, 0xD5C9, 0x4E09, 0xC8FD, 0x4E0A, 0xC9CF, + 0x4E0B, 0xCFC2, 0x4E0C, 0xD8A2, 0x4E0D, 0xB2BB, 0x4E0E, 0xD3EB, + 0x4E0F, 0x8144, 0x4E10, 0xD8A4, 0x4E11, 0xB3F3, 0x4E12, 0x8145, + 0x4E13, 0xD7A8, 0x4E14, 0xC7D2, 0x4E15, 0xD8A7, 0x4E16, 0xCAC0, + 0x4E17, 0x8146, 0x4E18, 0xC7F0, 0x4E19, 0xB1FB, 0x4E1A, 0xD2B5, + 0x4E1B, 0xB4D4, 0x4E1C, 0xB6AB, 0x4E1D, 0xCBBF, 0x4E1E, 0xD8A9, + 0x4E1F, 0x8147, 0x4E20, 0x8148, 0x4E21, 0x8149, 0x4E22, 0xB6AA, + 0x4E23, 0x814A, 0x4E24, 0xC1BD, 0x4E25, 0xD1CF, 0x4E26, 0x814B, + 0x4E27, 0xC9A5, 0x4E28, 0xD8AD, 0x4E29, 0x814C, 0x4E2A, 0xB8F6, + 0x4E2B, 0xD1BE, 0x4E2C, 0xE3DC, 0x4E2D, 0xD6D0, 0x4E2E, 0x814D, + 0x4E2F, 0x814E, 0x4E30, 0xB7E1, 0x4E31, 0x814F, 0x4E32, 0xB4AE, + 0x4E33, 0x8150, 0x4E34, 0xC1D9, 0x4E35, 0x8151, 0x4E36, 0xD8BC, + 0x4E37, 0x8152, 0x4E38, 0xCDE8, 0x4E39, 0xB5A4, 0x4E3A, 0xCEAA, + 0x4E3B, 0xD6F7, 0x4E3C, 0x8153, 0x4E3D, 0xC0F6, 0x4E3E, 0xBED9, + 0x4E3F, 0xD8AF, 0x4E40, 0x8154, 0x4E41, 0x8155, 0x4E42, 0x8156, + 0x4E43, 0xC4CB, 0x4E44, 0x8157, 0x4E45, 0xBEC3, 0x4E46, 0x8158, + 0x4E47, 0xD8B1, 0x4E48, 0xC3B4, 0x4E49, 0xD2E5, 0x4E4A, 0x8159, + 0x4E4B, 0xD6AE, 0x4E4C, 0xCEDA, 0x4E4D, 0xD5A7, 0x4E4E, 0xBAF5, + 0x4E4F, 0xB7A6, 0x4E50, 0xC0D6, 0x4E51, 0x815A, 0x4E52, 0xC6B9, + 0x4E53, 0xC5D2, 0x4E54, 0xC7C7, 0x4E55, 0x815B, 0x4E56, 0xB9D4, + 0x4E57, 0x815C, 0x4E58, 0xB3CB, 0x4E59, 0xD2D2, 0x4E5A, 0x815D, + 0x4E5B, 0x815E, 0x4E5C, 0xD8BF, 0x4E5D, 0xBEC5, 0x4E5E, 0xC6F2, + 0x4E5F, 0xD2B2, 0x4E60, 0xCFB0, 0x4E61, 0xCFE7, 0x4E62, 0x815F, + 0x4E63, 0x8160, 0x4E64, 0x8161, 0x4E65, 0x8162, 0x4E66, 0xCAE9, + 0x4E67, 0x8163, 0x4E68, 0x8164, 0x4E69, 0xD8C0, 0x4E6A, 0x8165, + 0x4E6B, 0x8166, 0x4E6C, 0x8167, 0x4E6D, 0x8168, 0x4E6E, 0x8169, + 0x4E6F, 0x816A, 0x4E70, 0xC2F2, 0x4E71, 0xC2D2, 0x4E72, 0x816B, + 0x4E73, 0xC8E9, 0x4E74, 0x816C, 0x4E75, 0x816D, 0x4E76, 0x816E, + 0x4E77, 0x816F, 0x4E78, 0x8170, 0x4E79, 0x8171, 0x4E7A, 0x8172, + 0x4E7B, 0x8173, 0x4E7C, 0x8174, 0x4E7D, 0x8175, 0x4E7E, 0xC7AC, + 0x4E7F, 0x8176, 0x4E80, 0x8177, 0x4E81, 0x8178, 0x4E82, 0x8179, + 0x4E83, 0x817A, 0x4E84, 0x817B, 0x4E85, 0x817C, 0x4E86, 0xC1CB, + 0x4E87, 0x817D, 0x4E88, 0xD3E8, 0x4E89, 0xD5F9, 0x4E8A, 0x817E, + 0x4E8B, 0xCAC2, 0x4E8C, 0xB6FE, 0x4E8D, 0xD8A1, 0x4E8E, 0xD3DA, + 0x4E8F, 0xBFF7, 0x4E90, 0x8180, 0x4E91, 0xD4C6, 0x4E92, 0xBBA5, + 0x4E93, 0xD8C1, 0x4E94, 0xCEE5, 0x4E95, 0xBEAE, 0x4E96, 0x8181, + 0x4E97, 0x8182, 0x4E98, 0xD8A8, 0x4E99, 0x8183, 0x4E9A, 0xD1C7, + 0x4E9B, 0xD0A9, 0x4E9C, 0x8184, 0x4E9D, 0x8185, 0x4E9E, 0x8186, + 0x4E9F, 0xD8BD, 0x4EA0, 0xD9EF, 0x4EA1, 0xCDF6, 0x4EA2, 0xBFBA, + 0x4EA3, 0x8187, 0x4EA4, 0xBDBB, 0x4EA5, 0xBAA5, 0x4EA6, 0xD2E0, + 0x4EA7, 0xB2FA, 0x4EA8, 0xBAE0, 0x4EA9, 0xC4B6, 0x4EAA, 0x8188, + 0x4EAB, 0xCFED, 0x4EAC, 0xBEA9, 0x4EAD, 0xCDA4, 0x4EAE, 0xC1C1, + 0x4EAF, 0x8189, 0x4EB0, 0x818A, 0x4EB1, 0x818B, 0x4EB2, 0xC7D7, + 0x4EB3, 0xD9F1, 0x4EB4, 0x818C, 0x4EB5, 0xD9F4, 0x4EB6, 0x818D, + 0x4EB7, 0x818E, 0x4EB8, 0x818F, 0x4EB9, 0x8190, 0x4EBA, 0xC8CB, + 0x4EBB, 0xD8E9, 0x4EBC, 0x8191, 0x4EBD, 0x8192, 0x4EBE, 0x8193, + 0x4EBF, 0xD2DA, 0x4EC0, 0xCAB2, 0x4EC1, 0xC8CA, 0x4EC2, 0xD8EC, + 0x4EC3, 0xD8EA, 0x4EC4, 0xD8C6, 0x4EC5, 0xBDF6, 0x4EC6, 0xC6CD, + 0x4EC7, 0xB3F0, 0x4EC8, 0x8194, 0x4EC9, 0xD8EB, 0x4ECA, 0xBDF1, + 0x4ECB, 0xBDE9, 0x4ECC, 0x8195, 0x4ECD, 0xC8D4, 0x4ECE, 0xB4D3, + 0x4ECF, 0x8196, 0x4ED0, 0x8197, 0x4ED1, 0xC2D8, 0x4ED2, 0x8198, + 0x4ED3, 0xB2D6, 0x4ED4, 0xD7D0, 0x4ED5, 0xCACB, 0x4ED6, 0xCBFB, + 0x4ED7, 0xD5CC, 0x4ED8, 0xB8B6, 0x4ED9, 0xCFC9, 0x4EDA, 0x8199, + 0x4EDB, 0x819A, 0x4EDC, 0x819B, 0x4EDD, 0xD9DA, 0x4EDE, 0xD8F0, + 0x4EDF, 0xC7AA, 0x4EE0, 0x819C, 0x4EE1, 0xD8EE, 0x4EE2, 0x819D, + 0x4EE3, 0xB4FA, 0x4EE4, 0xC1EE, 0x4EE5, 0xD2D4, 0x4EE6, 0x819E, + 0x4EE7, 0x819F, 0x4EE8, 0xD8ED, 0x4EE9, 0x81A0, 0x4EEA, 0xD2C7, + 0x4EEB, 0xD8EF, 0x4EEC, 0xC3C7, 0x4EED, 0x81A1, 0x4EEE, 0x81A2, + 0x4EEF, 0x81A3, 0x4EF0, 0xD1F6, 0x4EF1, 0x81A4, 0x4EF2, 0xD6D9, + 0x4EF3, 0xD8F2, 0x4EF4, 0x81A5, 0x4EF5, 0xD8F5, 0x4EF6, 0xBCFE, + 0x4EF7, 0xBCDB, 0x4EF8, 0x81A6, 0x4EF9, 0x81A7, 0x4EFA, 0x81A8, + 0x4EFB, 0xC8CE, 0x4EFC, 0x81A9, 0x4EFD, 0xB7DD, 0x4EFE, 0x81AA, + 0x4EFF, 0xB7C2, 0x4F00, 0x81AB, 0x4F01, 0xC6F3, 0x4F02, 0x81AC, + 0x4F03, 0x81AD, 0x4F04, 0x81AE, 0x4F05, 0x81AF, 0x4F06, 0x81B0, + 0x4F07, 0x81B1, 0x4F08, 0x81B2, 0x4F09, 0xD8F8, 0x4F0A, 0xD2C1, + 0x4F0B, 0x81B3, 0x4F0C, 0x81B4, 0x4F0D, 0xCEE9, 0x4F0E, 0xBCBF, + 0x4F0F, 0xB7FC, 0x4F10, 0xB7A5, 0x4F11, 0xD0DD, 0x4F12, 0x81B5, + 0x4F13, 0x81B6, 0x4F14, 0x81B7, 0x4F15, 0x81B8, 0x4F16, 0x81B9, + 0x4F17, 0xD6DA, 0x4F18, 0xD3C5, 0x4F19, 0xBBEF, 0x4F1A, 0xBBE1, + 0x4F1B, 0xD8F1, 0x4F1C, 0x81BA, 0x4F1D, 0x81BB, 0x4F1E, 0xC9A1, + 0x4F1F, 0xCEB0, 0x4F20, 0xB4AB, 0x4F21, 0x81BC, 0x4F22, 0xD8F3, + 0x4F23, 0x81BD, 0x4F24, 0xC9CB, 0x4F25, 0xD8F6, 0x4F26, 0xC2D7, + 0x4F27, 0xD8F7, 0x4F28, 0x81BE, 0x4F29, 0x81BF, 0x4F2A, 0xCEB1, + 0x4F2B, 0xD8F9, 0x4F2C, 0x81C0, 0x4F2D, 0x81C1, 0x4F2E, 0x81C2, + 0x4F2F, 0xB2AE, 0x4F30, 0xB9C0, 0x4F31, 0x81C3, 0x4F32, 0xD9A3, + 0x4F33, 0x81C4, 0x4F34, 0xB0E9, 0x4F35, 0x81C5, 0x4F36, 0xC1E6, + 0x4F37, 0x81C6, 0x4F38, 0xC9EC, 0x4F39, 0x81C7, 0x4F3A, 0xCBC5, + 0x4F3B, 0x81C8, 0x4F3C, 0xCBC6, 0x4F3D, 0xD9A4, 0x4F3E, 0x81C9, + 0x4F3F, 0x81CA, 0x4F40, 0x81CB, 0x4F41, 0x81CC, 0x4F42, 0x81CD, + 0x4F43, 0xB5E8, 0x4F44, 0x81CE, 0x4F45, 0x81CF, 0x4F46, 0xB5AB, + 0x4F47, 0x81D0, 0x4F48, 0x81D1, 0x4F49, 0x81D2, 0x4F4A, 0x81D3, + 0x4F4B, 0x81D4, 0x4F4C, 0x81D5, 0x4F4D, 0xCEBB, 0x4F4E, 0xB5CD, + 0x4F4F, 0xD7A1, 0x4F50, 0xD7F4, 0x4F51, 0xD3D3, 0x4F52, 0x81D6, + 0x4F53, 0xCCE5, 0x4F54, 0x81D7, 0x4F55, 0xBACE, 0x4F56, 0x81D8, + 0x4F57, 0xD9A2, 0x4F58, 0xD9DC, 0x4F59, 0xD3E0, 0x4F5A, 0xD8FD, + 0x4F5B, 0xB7F0, 0x4F5C, 0xD7F7, 0x4F5D, 0xD8FE, 0x4F5E, 0xD8FA, + 0x4F5F, 0xD9A1, 0x4F60, 0xC4E3, 0x4F61, 0x81D9, 0x4F62, 0x81DA, + 0x4F63, 0xD3B6, 0x4F64, 0xD8F4, 0x4F65, 0xD9DD, 0x4F66, 0x81DB, + 0x4F67, 0xD8FB, 0x4F68, 0x81DC, 0x4F69, 0xC5E5, 0x4F6A, 0x81DD, + 0x4F6B, 0x81DE, 0x4F6C, 0xC0D0, 0x4F6D, 0x81DF, 0x4F6E, 0x81E0, + 0x4F6F, 0xD1F0, 0x4F70, 0xB0DB, 0x4F71, 0x81E1, 0x4F72, 0x81E2, + 0x4F73, 0xBCD1, 0x4F74, 0xD9A6, 0x4F75, 0x81E3, 0x4F76, 0xD9A5, + 0x4F77, 0x81E4, 0x4F78, 0x81E5, 0x4F79, 0x81E6, 0x4F7A, 0x81E7, + 0x4F7B, 0xD9AC, 0x4F7C, 0xD9AE, 0x4F7D, 0x81E8, 0x4F7E, 0xD9AB, + 0x4F7F, 0xCAB9, 0x4F80, 0x81E9, 0x4F81, 0x81EA, 0x4F82, 0x81EB, + 0x4F83, 0xD9A9, 0x4F84, 0xD6B6, 0x4F85, 0x81EC, 0x4F86, 0x81ED, + 0x4F87, 0x81EE, 0x4F88, 0xB3DE, 0x4F89, 0xD9A8, 0x4F8A, 0x81EF, + 0x4F8B, 0xC0FD, 0x4F8C, 0x81F0, 0x4F8D, 0xCACC, 0x4F8E, 0x81F1, + 0x4F8F, 0xD9AA, 0x4F90, 0x81F2, 0x4F91, 0xD9A7, 0x4F92, 0x81F3, + 0x4F93, 0x81F4, 0x4F94, 0xD9B0, 0x4F95, 0x81F5, 0x4F96, 0x81F6, + 0x4F97, 0xB6B1, 0x4F98, 0x81F7, 0x4F99, 0x81F8, 0x4F9A, 0x81F9, + 0x4F9B, 0xB9A9, 0x4F9C, 0x81FA, 0x4F9D, 0xD2C0, 0x4F9E, 0x81FB, + 0x4F9F, 0x81FC, 0x4FA0, 0xCFC0, 0x4FA1, 0x81FD, 0x4FA2, 0x81FE, + 0x4FA3, 0xC2C2, 0x4FA4, 0x8240, 0x4FA5, 0xBDC4, 0x4FA6, 0xD5EC, + 0x4FA7, 0xB2E0, 0x4FA8, 0xC7C8, 0x4FA9, 0xBFEB, 0x4FAA, 0xD9AD, + 0x4FAB, 0x8241, 0x4FAC, 0xD9AF, 0x4FAD, 0x8242, 0x4FAE, 0xCEEA, + 0x4FAF, 0xBAEE, 0x4FB0, 0x8243, 0x4FB1, 0x8244, 0x4FB2, 0x8245, + 0x4FB3, 0x8246, 0x4FB4, 0x8247, 0x4FB5, 0xC7D6, 0x4FB6, 0x8248, + 0x4FB7, 0x8249, 0x4FB8, 0x824A, 0x4FB9, 0x824B, 0x4FBA, 0x824C, + 0x4FBB, 0x824D, 0x4FBC, 0x824E, 0x4FBD, 0x824F, 0x4FBE, 0x8250, + 0x4FBF, 0xB1E3, 0x4FC0, 0x8251, 0x4FC1, 0x8252, 0x4FC2, 0x8253, + 0x4FC3, 0xB4D9, 0x4FC4, 0xB6ED, 0x4FC5, 0xD9B4, 0x4FC6, 0x8254, + 0x4FC7, 0x8255, 0x4FC8, 0x8256, 0x4FC9, 0x8257, 0x4FCA, 0xBFA1, + 0x4FCB, 0x8258, 0x4FCC, 0x8259, 0x4FCD, 0x825A, 0x4FCE, 0xD9DE, + 0x4FCF, 0xC7CE, 0x4FD0, 0xC0FE, 0x4FD1, 0xD9B8, 0x4FD2, 0x825B, + 0x4FD3, 0x825C, 0x4FD4, 0x825D, 0x4FD5, 0x825E, 0x4FD6, 0x825F, + 0x4FD7, 0xCBD7, 0x4FD8, 0xB7FD, 0x4FD9, 0x8260, 0x4FDA, 0xD9B5, + 0x4FDB, 0x8261, 0x4FDC, 0xD9B7, 0x4FDD, 0xB1A3, 0x4FDE, 0xD3E1, + 0x4FDF, 0xD9B9, 0x4FE0, 0x8262, 0x4FE1, 0xD0C5, 0x4FE2, 0x8263, + 0x4FE3, 0xD9B6, 0x4FE4, 0x8264, 0x4FE5, 0x8265, 0x4FE6, 0xD9B1, + 0x4FE7, 0x8266, 0x4FE8, 0xD9B2, 0x4FE9, 0xC1A9, 0x4FEA, 0xD9B3, + 0x4FEB, 0x8267, 0x4FEC, 0x8268, 0x4FED, 0xBCF3, 0x4FEE, 0xD0DE, + 0x4FEF, 0xB8A9, 0x4FF0, 0x8269, 0x4FF1, 0xBEE3, 0x4FF2, 0x826A, + 0x4FF3, 0xD9BD, 0x4FF4, 0x826B, 0x4FF5, 0x826C, 0x4FF6, 0x826D, + 0x4FF7, 0x826E, 0x4FF8, 0xD9BA, 0x4FF9, 0x826F, 0x4FFA, 0xB0B3, + 0x4FFB, 0x8270, 0x4FFC, 0x8271, 0x4FFD, 0x8272, 0x4FFE, 0xD9C2, + 0x4FFF, 0x8273, 0x5000, 0x8274, 0x5001, 0x8275, 0x5002, 0x8276, + 0x5003, 0x8277, 0x5004, 0x8278, 0x5005, 0x8279, 0x5006, 0x827A, + 0x5007, 0x827B, 0x5008, 0x827C, 0x5009, 0x827D, 0x500A, 0x827E, + 0x500B, 0x8280, 0x500C, 0xD9C4, 0x500D, 0xB1B6, 0x500E, 0x8281, + 0x500F, 0xD9BF, 0x5010, 0x8282, 0x5011, 0x8283, 0x5012, 0xB5B9, + 0x5013, 0x8284, 0x5014, 0xBEF3, 0x5015, 0x8285, 0x5016, 0x8286, + 0x5017, 0x8287, 0x5018, 0xCCC8, 0x5019, 0xBAF2, 0x501A, 0xD2D0, + 0x501B, 0x8288, 0x501C, 0xD9C3, 0x501D, 0x8289, 0x501E, 0x828A, + 0x501F, 0xBDE8, 0x5020, 0x828B, 0x5021, 0xB3AB, 0x5022, 0x828C, + 0x5023, 0x828D, 0x5024, 0x828E, 0x5025, 0xD9C5, 0x5026, 0xBEEB, + 0x5027, 0x828F, 0x5028, 0xD9C6, 0x5029, 0xD9BB, 0x502A, 0xC4DF, + 0x502B, 0x8290, 0x502C, 0xD9BE, 0x502D, 0xD9C1, 0x502E, 0xD9C0, + 0x502F, 0x8291, 0x5030, 0x8292, 0x5031, 0x8293, 0x5032, 0x8294, + 0x5033, 0x8295, 0x5034, 0x8296, 0x5035, 0x8297, 0x5036, 0x8298, + 0x5037, 0x8299, 0x5038, 0x829A, 0x5039, 0x829B, 0x503A, 0xD5AE, + 0x503B, 0x829C, 0x503C, 0xD6B5, 0x503D, 0x829D, 0x503E, 0xC7E3, + 0x503F, 0x829E, 0x5040, 0x829F, 0x5041, 0x82A0, 0x5042, 0x82A1, + 0x5043, 0xD9C8, 0x5044, 0x82A2, 0x5045, 0x82A3, 0x5046, 0x82A4, + 0x5047, 0xBCD9, 0x5048, 0xD9CA, 0x5049, 0x82A5, 0x504A, 0x82A6, + 0x504B, 0x82A7, 0x504C, 0xD9BC, 0x504D, 0x82A8, 0x504E, 0xD9CB, + 0x504F, 0xC6AB, 0x5050, 0x82A9, 0x5051, 0x82AA, 0x5052, 0x82AB, + 0x5053, 0x82AC, 0x5054, 0x82AD, 0x5055, 0xD9C9, 0x5056, 0x82AE, + 0x5057, 0x82AF, 0x5058, 0x82B0, 0x5059, 0x82B1, 0x505A, 0xD7F6, + 0x505B, 0x82B2, 0x505C, 0xCDA3, 0x505D, 0x82B3, 0x505E, 0x82B4, + 0x505F, 0x82B5, 0x5060, 0x82B6, 0x5061, 0x82B7, 0x5062, 0x82B8, + 0x5063, 0x82B9, 0x5064, 0x82BA, 0x5065, 0xBDA1, 0x5066, 0x82BB, + 0x5067, 0x82BC, 0x5068, 0x82BD, 0x5069, 0x82BE, 0x506A, 0x82BF, + 0x506B, 0x82C0, 0x506C, 0xD9CC, 0x506D, 0x82C1, 0x506E, 0x82C2, + 0x506F, 0x82C3, 0x5070, 0x82C4, 0x5071, 0x82C5, 0x5072, 0x82C6, + 0x5073, 0x82C7, 0x5074, 0x82C8, 0x5075, 0x82C9, 0x5076, 0xC5BC, + 0x5077, 0xCDB5, 0x5078, 0x82CA, 0x5079, 0x82CB, 0x507A, 0x82CC, + 0x507B, 0xD9CD, 0x507C, 0x82CD, 0x507D, 0x82CE, 0x507E, 0xD9C7, + 0x507F, 0xB3A5, 0x5080, 0xBFFE, 0x5081, 0x82CF, 0x5082, 0x82D0, + 0x5083, 0x82D1, 0x5084, 0x82D2, 0x5085, 0xB8B5, 0x5086, 0x82D3, + 0x5087, 0x82D4, 0x5088, 0xC0FC, 0x5089, 0x82D5, 0x508A, 0x82D6, + 0x508B, 0x82D7, 0x508C, 0x82D8, 0x508D, 0xB0F8, 0x508E, 0x82D9, + 0x508F, 0x82DA, 0x5090, 0x82DB, 0x5091, 0x82DC, 0x5092, 0x82DD, + 0x5093, 0x82DE, 0x5094, 0x82DF, 0x5095, 0x82E0, 0x5096, 0x82E1, + 0x5097, 0x82E2, 0x5098, 0x82E3, 0x5099, 0x82E4, 0x509A, 0x82E5, + 0x509B, 0x82E6, 0x509C, 0x82E7, 0x509D, 0x82E8, 0x509E, 0x82E9, + 0x509F, 0x82EA, 0x50A0, 0x82EB, 0x50A1, 0x82EC, 0x50A2, 0x82ED, + 0x50A3, 0xB4F6, 0x50A4, 0x82EE, 0x50A5, 0xD9CE, 0x50A6, 0x82EF, + 0x50A7, 0xD9CF, 0x50A8, 0xB4A2, 0x50A9, 0xD9D0, 0x50AA, 0x82F0, + 0x50AB, 0x82F1, 0x50AC, 0xB4DF, 0x50AD, 0x82F2, 0x50AE, 0x82F3, + 0x50AF, 0x82F4, 0x50B0, 0x82F5, 0x50B1, 0x82F6, 0x50B2, 0xB0C1, + 0x50B3, 0x82F7, 0x50B4, 0x82F8, 0x50B5, 0x82F9, 0x50B6, 0x82FA, + 0x50B7, 0x82FB, 0x50B8, 0x82FC, 0x50B9, 0x82FD, 0x50BA, 0xD9D1, + 0x50BB, 0xC9B5, 0x50BC, 0x82FE, 0x50BD, 0x8340, 0x50BE, 0x8341, + 0x50BF, 0x8342, 0x50C0, 0x8343, 0x50C1, 0x8344, 0x50C2, 0x8345, + 0x50C3, 0x8346, 0x50C4, 0x8347, 0x50C5, 0x8348, 0x50C6, 0x8349, + 0x50C7, 0x834A, 0x50C8, 0x834B, 0x50C9, 0x834C, 0x50CA, 0x834D, + 0x50CB, 0x834E, 0x50CC, 0x834F, 0x50CD, 0x8350, 0x50CE, 0x8351, + 0x50CF, 0xCFF1, 0x50D0, 0x8352, 0x50D1, 0x8353, 0x50D2, 0x8354, + 0x50D3, 0x8355, 0x50D4, 0x8356, 0x50D5, 0x8357, 0x50D6, 0xD9D2, + 0x50D7, 0x8358, 0x50D8, 0x8359, 0x50D9, 0x835A, 0x50DA, 0xC1C5, + 0x50DB, 0x835B, 0x50DC, 0x835C, 0x50DD, 0x835D, 0x50DE, 0x835E, + 0x50DF, 0x835F, 0x50E0, 0x8360, 0x50E1, 0x8361, 0x50E2, 0x8362, + 0x50E3, 0x8363, 0x50E4, 0x8364, 0x50E5, 0x8365, 0x50E6, 0xD9D6, + 0x50E7, 0xC9AE, 0x50E8, 0x8366, 0x50E9, 0x8367, 0x50EA, 0x8368, + 0x50EB, 0x8369, 0x50EC, 0xD9D5, 0x50ED, 0xD9D4, 0x50EE, 0xD9D7, + 0x50EF, 0x836A, 0x50F0, 0x836B, 0x50F1, 0x836C, 0x50F2, 0x836D, + 0x50F3, 0xCBDB, 0x50F4, 0x836E, 0x50F5, 0xBDA9, 0x50F6, 0x836F, + 0x50F7, 0x8370, 0x50F8, 0x8371, 0x50F9, 0x8372, 0x50FA, 0x8373, + 0x50FB, 0xC6A7, 0x50FC, 0x8374, 0x50FD, 0x8375, 0x50FE, 0x8376, + 0x50FF, 0x8377, 0x5100, 0x8378, 0x5101, 0x8379, 0x5102, 0x837A, + 0x5103, 0x837B, 0x5104, 0x837C, 0x5105, 0x837D, 0x5106, 0xD9D3, + 0x5107, 0xD9D8, 0x5108, 0x837E, 0x5109, 0x8380, 0x510A, 0x8381, + 0x510B, 0xD9D9, 0x510C, 0x8382, 0x510D, 0x8383, 0x510E, 0x8384, + 0x510F, 0x8385, 0x5110, 0x8386, 0x5111, 0x8387, 0x5112, 0xC8E5, + 0x5113, 0x8388, 0x5114, 0x8389, 0x5115, 0x838A, 0x5116, 0x838B, + 0x5117, 0x838C, 0x5118, 0x838D, 0x5119, 0x838E, 0x511A, 0x838F, + 0x511B, 0x8390, 0x511C, 0x8391, 0x511D, 0x8392, 0x511E, 0x8393, + 0x511F, 0x8394, 0x5120, 0x8395, 0x5121, 0xC0DC, 0x5122, 0x8396, + 0x5123, 0x8397, 0x5124, 0x8398, 0x5125, 0x8399, 0x5126, 0x839A, + 0x5127, 0x839B, 0x5128, 0x839C, 0x5129, 0x839D, 0x512A, 0x839E, + 0x512B, 0x839F, 0x512C, 0x83A0, 0x512D, 0x83A1, 0x512E, 0x83A2, + 0x512F, 0x83A3, 0x5130, 0x83A4, 0x5131, 0x83A5, 0x5132, 0x83A6, + 0x5133, 0x83A7, 0x5134, 0x83A8, 0x5135, 0x83A9, 0x5136, 0x83AA, + 0x5137, 0x83AB, 0x5138, 0x83AC, 0x5139, 0x83AD, 0x513A, 0x83AE, + 0x513B, 0x83AF, 0x513C, 0x83B0, 0x513D, 0x83B1, 0x513E, 0x83B2, + 0x513F, 0xB6F9, 0x5140, 0xD8A3, 0x5141, 0xD4CA, 0x5142, 0x83B3, + 0x5143, 0xD4AA, 0x5144, 0xD0D6, 0x5145, 0xB3E4, 0x5146, 0xD5D7, + 0x5147, 0x83B4, 0x5148, 0xCFC8, 0x5149, 0xB9E2, 0x514A, 0x83B5, + 0x514B, 0xBFCB, 0x514C, 0x83B6, 0x514D, 0xC3E2, 0x514E, 0x83B7, + 0x514F, 0x83B8, 0x5150, 0x83B9, 0x5151, 0xB6D2, 0x5152, 0x83BA, + 0x5153, 0x83BB, 0x5154, 0xCDC3, 0x5155, 0xD9EE, 0x5156, 0xD9F0, + 0x5157, 0x83BC, 0x5158, 0x83BD, 0x5159, 0x83BE, 0x515A, 0xB5B3, + 0x515B, 0x83BF, 0x515C, 0xB6B5, 0x515D, 0x83C0, 0x515E, 0x83C1, + 0x515F, 0x83C2, 0x5160, 0x83C3, 0x5161, 0x83C4, 0x5162, 0xBEA4, + 0x5163, 0x83C5, 0x5164, 0x83C6, 0x5165, 0xC8EB, 0x5166, 0x83C7, + 0x5167, 0x83C8, 0x5168, 0xC8AB, 0x5169, 0x83C9, 0x516A, 0x83CA, + 0x516B, 0xB0CB, 0x516C, 0xB9AB, 0x516D, 0xC1F9, 0x516E, 0xD9E2, + 0x516F, 0x83CB, 0x5170, 0xC0BC, 0x5171, 0xB9B2, 0x5172, 0x83CC, + 0x5173, 0xB9D8, 0x5174, 0xD0CB, 0x5175, 0xB1F8, 0x5176, 0xC6E4, + 0x5177, 0xBEDF, 0x5178, 0xB5E4, 0x5179, 0xD7C8, 0x517A, 0x83CD, + 0x517B, 0xD1F8, 0x517C, 0xBCE6, 0x517D, 0xCADE, 0x517E, 0x83CE, + 0x517F, 0x83CF, 0x5180, 0xBCBD, 0x5181, 0xD9E6, 0x5182, 0xD8E7, + 0x5183, 0x83D0, 0x5184, 0x83D1, 0x5185, 0xC4DA, 0x5186, 0x83D2, + 0x5187, 0x83D3, 0x5188, 0xB8D4, 0x5189, 0xC8BD, 0x518A, 0x83D4, + 0x518B, 0x83D5, 0x518C, 0xB2E1, 0x518D, 0xD4D9, 0x518E, 0x83D6, + 0x518F, 0x83D7, 0x5190, 0x83D8, 0x5191, 0x83D9, 0x5192, 0xC3B0, + 0x5193, 0x83DA, 0x5194, 0x83DB, 0x5195, 0xC3E1, 0x5196, 0xDAA2, + 0x5197, 0xC8DF, 0x5198, 0x83DC, 0x5199, 0xD0B4, 0x519A, 0x83DD, + 0x519B, 0xBEFC, 0x519C, 0xC5A9, 0x519D, 0x83DE, 0x519E, 0x83DF, + 0x519F, 0x83E0, 0x51A0, 0xB9DA, 0x51A1, 0x83E1, 0x51A2, 0xDAA3, + 0x51A3, 0x83E2, 0x51A4, 0xD4A9, 0x51A5, 0xDAA4, 0x51A6, 0x83E3, + 0x51A7, 0x83E4, 0x51A8, 0x83E5, 0x51A9, 0x83E6, 0x51AA, 0x83E7, + 0x51AB, 0xD9FB, 0x51AC, 0xB6AC, 0x51AD, 0x83E8, 0x51AE, 0x83E9, + 0x51AF, 0xB7EB, 0x51B0, 0xB1F9, 0x51B1, 0xD9FC, 0x51B2, 0xB3E5, + 0x51B3, 0xBEF6, 0x51B4, 0x83EA, 0x51B5, 0xBFF6, 0x51B6, 0xD2B1, + 0x51B7, 0xC0E4, 0x51B8, 0x83EB, 0x51B9, 0x83EC, 0x51BA, 0x83ED, + 0x51BB, 0xB6B3, 0x51BC, 0xD9FE, 0x51BD, 0xD9FD, 0x51BE, 0x83EE, + 0x51BF, 0x83EF, 0x51C0, 0xBEBB, 0x51C1, 0x83F0, 0x51C2, 0x83F1, + 0x51C3, 0x83F2, 0x51C4, 0xC6E0, 0x51C5, 0x83F3, 0x51C6, 0xD7BC, + 0x51C7, 0xDAA1, 0x51C8, 0x83F4, 0x51C9, 0xC1B9, 0x51CA, 0x83F5, + 0x51CB, 0xB5F2, 0x51CC, 0xC1E8, 0x51CD, 0x83F6, 0x51CE, 0x83F7, + 0x51CF, 0xBCF5, 0x51D0, 0x83F8, 0x51D1, 0xB4D5, 0x51D2, 0x83F9, + 0x51D3, 0x83FA, 0x51D4, 0x83FB, 0x51D5, 0x83FC, 0x51D6, 0x83FD, + 0x51D7, 0x83FE, 0x51D8, 0x8440, 0x51D9, 0x8441, 0x51DA, 0x8442, + 0x51DB, 0xC1DD, 0x51DC, 0x8443, 0x51DD, 0xC4FD, 0x51DE, 0x8444, + 0x51DF, 0x8445, 0x51E0, 0xBCB8, 0x51E1, 0xB7B2, 0x51E2, 0x8446, + 0x51E3, 0x8447, 0x51E4, 0xB7EF, 0x51E5, 0x8448, 0x51E6, 0x8449, + 0x51E7, 0x844A, 0x51E8, 0x844B, 0x51E9, 0x844C, 0x51EA, 0x844D, + 0x51EB, 0xD9EC, 0x51EC, 0x844E, 0x51ED, 0xC6BE, 0x51EE, 0x844F, + 0x51EF, 0xBFAD, 0x51F0, 0xBBCB, 0x51F1, 0x8450, 0x51F2, 0x8451, + 0x51F3, 0xB5CA, 0x51F4, 0x8452, 0x51F5, 0xDBC9, 0x51F6, 0xD0D7, + 0x51F7, 0x8453, 0x51F8, 0xCDB9, 0x51F9, 0xB0BC, 0x51FA, 0xB3F6, + 0x51FB, 0xBBF7, 0x51FC, 0xDBCA, 0x51FD, 0xBAAF, 0x51FE, 0x8454, + 0x51FF, 0xD4E4, 0x5200, 0xB5B6, 0x5201, 0xB5F3, 0x5202, 0xD8D6, + 0x5203, 0xC8D0, 0x5204, 0x8455, 0x5205, 0x8456, 0x5206, 0xB7D6, + 0x5207, 0xC7D0, 0x5208, 0xD8D7, 0x5209, 0x8457, 0x520A, 0xBFAF, + 0x520B, 0x8458, 0x520C, 0x8459, 0x520D, 0xDBBB, 0x520E, 0xD8D8, + 0x520F, 0x845A, 0x5210, 0x845B, 0x5211, 0xD0CC, 0x5212, 0xBBAE, + 0x5213, 0x845C, 0x5214, 0x845D, 0x5215, 0x845E, 0x5216, 0xEBBE, + 0x5217, 0xC1D0, 0x5218, 0xC1F5, 0x5219, 0xD4F2, 0x521A, 0xB8D5, + 0x521B, 0xB4B4, 0x521C, 0x845F, 0x521D, 0xB3F5, 0x521E, 0x8460, + 0x521F, 0x8461, 0x5220, 0xC9BE, 0x5221, 0x8462, 0x5222, 0x8463, + 0x5223, 0x8464, 0x5224, 0xC5D0, 0x5225, 0x8465, 0x5226, 0x8466, + 0x5227, 0x8467, 0x5228, 0xC5D9, 0x5229, 0xC0FB, 0x522A, 0x8468, + 0x522B, 0xB1F0, 0x522C, 0x8469, 0x522D, 0xD8D9, 0x522E, 0xB9CE, + 0x522F, 0x846A, 0x5230, 0xB5BD, 0x5231, 0x846B, 0x5232, 0x846C, + 0x5233, 0xD8DA, 0x5234, 0x846D, 0x5235, 0x846E, 0x5236, 0xD6C6, + 0x5237, 0xCBA2, 0x5238, 0xC8AF, 0x5239, 0xC9B2, 0x523A, 0xB4CC, + 0x523B, 0xBFCC, 0x523C, 0x846F, 0x523D, 0xB9F4, 0x523E, 0x8470, + 0x523F, 0xD8DB, 0x5240, 0xD8DC, 0x5241, 0xB6E7, 0x5242, 0xBCC1, + 0x5243, 0xCCEA, 0x5244, 0x8471, 0x5245, 0x8472, 0x5246, 0x8473, + 0x5247, 0x8474, 0x5248, 0x8475, 0x5249, 0x8476, 0x524A, 0xCFF7, + 0x524B, 0x8477, 0x524C, 0xD8DD, 0x524D, 0xC7B0, 0x524E, 0x8478, + 0x524F, 0x8479, 0x5250, 0xB9D0, 0x5251, 0xBDA3, 0x5252, 0x847A, + 0x5253, 0x847B, 0x5254, 0xCCDE, 0x5255, 0x847C, 0x5256, 0xC6CA, + 0x5257, 0x847D, 0x5258, 0x847E, 0x5259, 0x8480, 0x525A, 0x8481, + 0x525B, 0x8482, 0x525C, 0xD8E0, 0x525D, 0x8483, 0x525E, 0xD8DE, + 0x525F, 0x8484, 0x5260, 0x8485, 0x5261, 0xD8DF, 0x5262, 0x8486, + 0x5263, 0x8487, 0x5264, 0x8488, 0x5265, 0xB0FE, 0x5266, 0x8489, + 0x5267, 0xBEE7, 0x5268, 0x848A, 0x5269, 0xCAA3, 0x526A, 0xBCF4, + 0x526B, 0x848B, 0x526C, 0x848C, 0x526D, 0x848D, 0x526E, 0x848E, + 0x526F, 0xB8B1, 0x5270, 0x848F, 0x5271, 0x8490, 0x5272, 0xB8EE, + 0x5273, 0x8491, 0x5274, 0x8492, 0x5275, 0x8493, 0x5276, 0x8494, + 0x5277, 0x8495, 0x5278, 0x8496, 0x5279, 0x8497, 0x527A, 0x8498, + 0x527B, 0x8499, 0x527C, 0x849A, 0x527D, 0xD8E2, 0x527E, 0x849B, + 0x527F, 0xBDCB, 0x5280, 0x849C, 0x5281, 0xD8E4, 0x5282, 0xD8E3, + 0x5283, 0x849D, 0x5284, 0x849E, 0x5285, 0x849F, 0x5286, 0x84A0, + 0x5287, 0x84A1, 0x5288, 0xC5FC, 0x5289, 0x84A2, 0x528A, 0x84A3, + 0x528B, 0x84A4, 0x528C, 0x84A5, 0x528D, 0x84A6, 0x528E, 0x84A7, + 0x528F, 0x84A8, 0x5290, 0xD8E5, 0x5291, 0x84A9, 0x5292, 0x84AA, + 0x5293, 0xD8E6, 0x5294, 0x84AB, 0x5295, 0x84AC, 0x5296, 0x84AD, + 0x5297, 0x84AE, 0x5298, 0x84AF, 0x5299, 0x84B0, 0x529A, 0x84B1, + 0x529B, 0xC1A6, 0x529C, 0x84B2, 0x529D, 0xC8B0, 0x529E, 0xB0EC, + 0x529F, 0xB9A6, 0x52A0, 0xBCD3, 0x52A1, 0xCEF1, 0x52A2, 0xDBBD, + 0x52A3, 0xC1D3, 0x52A4, 0x84B3, 0x52A5, 0x84B4, 0x52A6, 0x84B5, + 0x52A7, 0x84B6, 0x52A8, 0xB6AF, 0x52A9, 0xD6FA, 0x52AA, 0xC5AC, + 0x52AB, 0xBDD9, 0x52AC, 0xDBBE, 0x52AD, 0xDBBF, 0x52AE, 0x84B7, + 0x52AF, 0x84B8, 0x52B0, 0x84B9, 0x52B1, 0xC0F8, 0x52B2, 0xBEA2, + 0x52B3, 0xC0CD, 0x52B4, 0x84BA, 0x52B5, 0x84BB, 0x52B6, 0x84BC, + 0x52B7, 0x84BD, 0x52B8, 0x84BE, 0x52B9, 0x84BF, 0x52BA, 0x84C0, + 0x52BB, 0x84C1, 0x52BC, 0x84C2, 0x52BD, 0x84C3, 0x52BE, 0xDBC0, + 0x52BF, 0xCAC6, 0x52C0, 0x84C4, 0x52C1, 0x84C5, 0x52C2, 0x84C6, + 0x52C3, 0xB2AA, 0x52C4, 0x84C7, 0x52C5, 0x84C8, 0x52C6, 0x84C9, + 0x52C7, 0xD3C2, 0x52C8, 0x84CA, 0x52C9, 0xC3E3, 0x52CA, 0x84CB, + 0x52CB, 0xD1AB, 0x52CC, 0x84CC, 0x52CD, 0x84CD, 0x52CE, 0x84CE, + 0x52CF, 0x84CF, 0x52D0, 0xDBC2, 0x52D1, 0x84D0, 0x52D2, 0xC0D5, + 0x52D3, 0x84D1, 0x52D4, 0x84D2, 0x52D5, 0x84D3, 0x52D6, 0xDBC3, + 0x52D7, 0x84D4, 0x52D8, 0xBFB1, 0x52D9, 0x84D5, 0x52DA, 0x84D6, + 0x52DB, 0x84D7, 0x52DC, 0x84D8, 0x52DD, 0x84D9, 0x52DE, 0x84DA, + 0x52DF, 0xC4BC, 0x52E0, 0x84DB, 0x52E1, 0x84DC, 0x52E2, 0x84DD, + 0x52E3, 0x84DE, 0x52E4, 0xC7DA, 0x52E5, 0x84DF, 0x52E6, 0x84E0, + 0x52E7, 0x84E1, 0x52E8, 0x84E2, 0x52E9, 0x84E3, 0x52EA, 0x84E4, + 0x52EB, 0x84E5, 0x52EC, 0x84E6, 0x52ED, 0x84E7, 0x52EE, 0x84E8, + 0x52EF, 0x84E9, 0x52F0, 0xDBC4, 0x52F1, 0x84EA, 0x52F2, 0x84EB, + 0x52F3, 0x84EC, 0x52F4, 0x84ED, 0x52F5, 0x84EE, 0x52F6, 0x84EF, + 0x52F7, 0x84F0, 0x52F8, 0x84F1, 0x52F9, 0xD9E8, 0x52FA, 0xC9D7, + 0x52FB, 0x84F2, 0x52FC, 0x84F3, 0x52FD, 0x84F4, 0x52FE, 0xB9B4, + 0x52FF, 0xCEF0, 0x5300, 0xD4C8, 0x5301, 0x84F5, 0x5302, 0x84F6, + 0x5303, 0x84F7, 0x5304, 0x84F8, 0x5305, 0xB0FC, 0x5306, 0xB4D2, + 0x5307, 0x84F9, 0x5308, 0xD0D9, 0x5309, 0x84FA, 0x530A, 0x84FB, + 0x530B, 0x84FC, 0x530C, 0x84FD, 0x530D, 0xD9E9, 0x530E, 0x84FE, + 0x530F, 0xDECB, 0x5310, 0xD9EB, 0x5311, 0x8540, 0x5312, 0x8541, + 0x5313, 0x8542, 0x5314, 0x8543, 0x5315, 0xD8B0, 0x5316, 0xBBAF, + 0x5317, 0xB1B1, 0x5318, 0x8544, 0x5319, 0xB3D7, 0x531A, 0xD8CE, + 0x531B, 0x8545, 0x531C, 0x8546, 0x531D, 0xD4D1, 0x531E, 0x8547, + 0x531F, 0x8548, 0x5320, 0xBDB3, 0x5321, 0xBFEF, 0x5322, 0x8549, + 0x5323, 0xCFBB, 0x5324, 0x854A, 0x5325, 0x854B, 0x5326, 0xD8D0, + 0x5327, 0x854C, 0x5328, 0x854D, 0x5329, 0x854E, 0x532A, 0xB7CB, + 0x532B, 0x854F, 0x532C, 0x8550, 0x532D, 0x8551, 0x532E, 0xD8D1, + 0x532F, 0x8552, 0x5330, 0x8553, 0x5331, 0x8554, 0x5332, 0x8555, + 0x5333, 0x8556, 0x5334, 0x8557, 0x5335, 0x8558, 0x5336, 0x8559, + 0x5337, 0x855A, 0x5338, 0x855B, 0x5339, 0xC6A5, 0x533A, 0xC7F8, + 0x533B, 0xD2BD, 0x533C, 0x855C, 0x533D, 0x855D, 0x533E, 0xD8D2, + 0x533F, 0xC4E4, 0x5340, 0x855E, 0x5341, 0xCAAE, 0x5342, 0x855F, + 0x5343, 0xC7A7, 0x5344, 0x8560, 0x5345, 0xD8A6, 0x5346, 0x8561, + 0x5347, 0xC9FD, 0x5348, 0xCEE7, 0x5349, 0xBBDC, 0x534A, 0xB0EB, + 0x534B, 0x8562, 0x534C, 0x8563, 0x534D, 0x8564, 0x534E, 0xBBAA, + 0x534F, 0xD0AD, 0x5350, 0x8565, 0x5351, 0xB1B0, 0x5352, 0xD7E4, + 0x5353, 0xD7BF, 0x5354, 0x8566, 0x5355, 0xB5A5, 0x5356, 0xC2F4, + 0x5357, 0xC4CF, 0x5358, 0x8567, 0x5359, 0x8568, 0x535A, 0xB2A9, + 0x535B, 0x8569, 0x535C, 0xB2B7, 0x535D, 0x856A, 0x535E, 0xB1E5, + 0x535F, 0xDFB2, 0x5360, 0xD5BC, 0x5361, 0xBFA8, 0x5362, 0xC2AC, + 0x5363, 0xD8D5, 0x5364, 0xC2B1, 0x5365, 0x856B, 0x5366, 0xD8D4, + 0x5367, 0xCED4, 0x5368, 0x856C, 0x5369, 0xDAE0, 0x536A, 0x856D, + 0x536B, 0xCEC0, 0x536C, 0x856E, 0x536D, 0x856F, 0x536E, 0xD8B4, + 0x536F, 0xC3AE, 0x5370, 0xD3A1, 0x5371, 0xCEA3, 0x5372, 0x8570, + 0x5373, 0xBCB4, 0x5374, 0xC8B4, 0x5375, 0xC2D1, 0x5376, 0x8571, + 0x5377, 0xBEED, 0x5378, 0xD0B6, 0x5379, 0x8572, 0x537A, 0xDAE1, + 0x537B, 0x8573, 0x537C, 0x8574, 0x537D, 0x8575, 0x537E, 0x8576, + 0x537F, 0xC7E4, 0x5380, 0x8577, 0x5381, 0x8578, 0x5382, 0xB3A7, + 0x5383, 0x8579, 0x5384, 0xB6F2, 0x5385, 0xCCFC, 0x5386, 0xC0FA, + 0x5387, 0x857A, 0x5388, 0x857B, 0x5389, 0xC0F7, 0x538A, 0x857C, + 0x538B, 0xD1B9, 0x538C, 0xD1E1, 0x538D, 0xD8C7, 0x538E, 0x857D, + 0x538F, 0x857E, 0x5390, 0x8580, 0x5391, 0x8581, 0x5392, 0x8582, + 0x5393, 0x8583, 0x5394, 0x8584, 0x5395, 0xB2DE, 0x5396, 0x8585, + 0x5397, 0x8586, 0x5398, 0xC0E5, 0x5399, 0x8587, 0x539A, 0xBAF1, + 0x539B, 0x8588, 0x539C, 0x8589, 0x539D, 0xD8C8, 0x539E, 0x858A, + 0x539F, 0xD4AD, 0x53A0, 0x858B, 0x53A1, 0x858C, 0x53A2, 0xCFE1, + 0x53A3, 0xD8C9, 0x53A4, 0x858D, 0x53A5, 0xD8CA, 0x53A6, 0xCFC3, + 0x53A7, 0x858E, 0x53A8, 0xB3F8, 0x53A9, 0xBEC7, 0x53AA, 0x858F, + 0x53AB, 0x8590, 0x53AC, 0x8591, 0x53AD, 0x8592, 0x53AE, 0xD8CB, + 0x53AF, 0x8593, 0x53B0, 0x8594, 0x53B1, 0x8595, 0x53B2, 0x8596, + 0x53B3, 0x8597, 0x53B4, 0x8598, 0x53B5, 0x8599, 0x53B6, 0xDBCC, + 0x53B7, 0x859A, 0x53B8, 0x859B, 0x53B9, 0x859C, 0x53BA, 0x859D, + 0x53BB, 0xC8A5, 0x53BC, 0x859E, 0x53BD, 0x859F, 0x53BE, 0x85A0, + 0x53BF, 0xCFD8, 0x53C0, 0x85A1, 0x53C1, 0xC8FE, 0x53C2, 0xB2CE, + 0x53C3, 0x85A2, 0x53C4, 0x85A3, 0x53C5, 0x85A4, 0x53C6, 0x85A5, + 0x53C7, 0x85A6, 0x53C8, 0xD3D6, 0x53C9, 0xB2E6, 0x53CA, 0xBCB0, + 0x53CB, 0xD3D1, 0x53CC, 0xCBAB, 0x53CD, 0xB7B4, 0x53CE, 0x85A7, + 0x53CF, 0x85A8, 0x53D0, 0x85A9, 0x53D1, 0xB7A2, 0x53D2, 0x85AA, + 0x53D3, 0x85AB, 0x53D4, 0xCAE5, 0x53D5, 0x85AC, 0x53D6, 0xC8A1, + 0x53D7, 0xCADC, 0x53D8, 0xB1E4, 0x53D9, 0xD0F0, 0x53DA, 0x85AD, + 0x53DB, 0xC5D1, 0x53DC, 0x85AE, 0x53DD, 0x85AF, 0x53DE, 0x85B0, + 0x53DF, 0xDBC5, 0x53E0, 0xB5FE, 0x53E1, 0x85B1, 0x53E2, 0x85B2, + 0x53E3, 0xBFDA, 0x53E4, 0xB9C5, 0x53E5, 0xBEE4, 0x53E6, 0xC1ED, + 0x53E7, 0x85B3, 0x53E8, 0xDFB6, 0x53E9, 0xDFB5, 0x53EA, 0xD6BB, + 0x53EB, 0xBDD0, 0x53EC, 0xD5D9, 0x53ED, 0xB0C8, 0x53EE, 0xB6A3, + 0x53EF, 0xBFC9, 0x53F0, 0xCCA8, 0x53F1, 0xDFB3, 0x53F2, 0xCAB7, + 0x53F3, 0xD3D2, 0x53F4, 0x85B4, 0x53F5, 0xD8CF, 0x53F6, 0xD2B6, + 0x53F7, 0xBAC5, 0x53F8, 0xCBBE, 0x53F9, 0xCCBE, 0x53FA, 0x85B5, + 0x53FB, 0xDFB7, 0x53FC, 0xB5F0, 0x53FD, 0xDFB4, 0x53FE, 0x85B6, + 0x53FF, 0x85B7, 0x5400, 0x85B8, 0x5401, 0xD3F5, 0x5402, 0x85B9, + 0x5403, 0xB3D4, 0x5404, 0xB8F7, 0x5405, 0x85BA, 0x5406, 0xDFBA, + 0x5407, 0x85BB, 0x5408, 0xBACF, 0x5409, 0xBCAA, 0x540A, 0xB5F5, + 0x540B, 0x85BC, 0x540C, 0xCDAC, 0x540D, 0xC3FB, 0x540E, 0xBAF3, + 0x540F, 0xC0F4, 0x5410, 0xCDC2, 0x5411, 0xCFF2, 0x5412, 0xDFB8, + 0x5413, 0xCFC5, 0x5414, 0x85BD, 0x5415, 0xC2C0, 0x5416, 0xDFB9, + 0x5417, 0xC2F0, 0x5418, 0x85BE, 0x5419, 0x85BF, 0x541A, 0x85C0, + 0x541B, 0xBEFD, 0x541C, 0x85C1, 0x541D, 0xC1DF, 0x541E, 0xCDCC, + 0x541F, 0xD2F7, 0x5420, 0xB7CD, 0x5421, 0xDFC1, 0x5422, 0x85C2, + 0x5423, 0xDFC4, 0x5424, 0x85C3, 0x5425, 0x85C4, 0x5426, 0xB7F1, + 0x5427, 0xB0C9, 0x5428, 0xB6D6, 0x5429, 0xB7D4, 0x542A, 0x85C5, + 0x542B, 0xBAAC, 0x542C, 0xCCFD, 0x542D, 0xBFD4, 0x542E, 0xCBB1, + 0x542F, 0xC6F4, 0x5430, 0x85C6, 0x5431, 0xD6A8, 0x5432, 0xDFC5, + 0x5433, 0x85C7, 0x5434, 0xCEE2, 0x5435, 0xB3B3, 0x5436, 0x85C8, + 0x5437, 0x85C9, 0x5438, 0xCEFC, 0x5439, 0xB4B5, 0x543A, 0x85CA, + 0x543B, 0xCEC7, 0x543C, 0xBAF0, 0x543D, 0x85CB, 0x543E, 0xCEE1, + 0x543F, 0x85CC, 0x5440, 0xD1BD, 0x5441, 0x85CD, 0x5442, 0x85CE, + 0x5443, 0xDFC0, 0x5444, 0x85CF, 0x5445, 0x85D0, 0x5446, 0xB4F4, + 0x5447, 0x85D1, 0x5448, 0xB3CA, 0x5449, 0x85D2, 0x544A, 0xB8E6, + 0x544B, 0xDFBB, 0x544C, 0x85D3, 0x544D, 0x85D4, 0x544E, 0x85D5, + 0x544F, 0x85D6, 0x5450, 0xC4C5, 0x5451, 0x85D7, 0x5452, 0xDFBC, + 0x5453, 0xDFBD, 0x5454, 0xDFBE, 0x5455, 0xC5BB, 0x5456, 0xDFBF, + 0x5457, 0xDFC2, 0x5458, 0xD4B1, 0x5459, 0xDFC3, 0x545A, 0x85D8, + 0x545B, 0xC7BA, 0x545C, 0xCED8, 0x545D, 0x85D9, 0x545E, 0x85DA, + 0x545F, 0x85DB, 0x5460, 0x85DC, 0x5461, 0x85DD, 0x5462, 0xC4D8, + 0x5463, 0x85DE, 0x5464, 0xDFCA, 0x5465, 0x85DF, 0x5466, 0xDFCF, + 0x5467, 0x85E0, 0x5468, 0xD6DC, 0x5469, 0x85E1, 0x546A, 0x85E2, + 0x546B, 0x85E3, 0x546C, 0x85E4, 0x546D, 0x85E5, 0x546E, 0x85E6, + 0x546F, 0x85E7, 0x5470, 0x85E8, 0x5471, 0xDFC9, 0x5472, 0xDFDA, + 0x5473, 0xCEB6, 0x5474, 0x85E9, 0x5475, 0xBAC7, 0x5476, 0xDFCE, + 0x5477, 0xDFC8, 0x5478, 0xC5DE, 0x5479, 0x85EA, 0x547A, 0x85EB, + 0x547B, 0xC9EB, 0x547C, 0xBAF4, 0x547D, 0xC3FC, 0x547E, 0x85EC, + 0x547F, 0x85ED, 0x5480, 0xBED7, 0x5481, 0x85EE, 0x5482, 0xDFC6, + 0x5483, 0x85EF, 0x5484, 0xDFCD, 0x5485, 0x85F0, 0x5486, 0xC5D8, + 0x5487, 0x85F1, 0x5488, 0x85F2, 0x5489, 0x85F3, 0x548A, 0x85F4, + 0x548B, 0xD5A6, 0x548C, 0xBACD, 0x548D, 0x85F5, 0x548E, 0xBECC, + 0x548F, 0xD3BD, 0x5490, 0xB8C0, 0x5491, 0x85F6, 0x5492, 0xD6E4, + 0x5493, 0x85F7, 0x5494, 0xDFC7, 0x5495, 0xB9BE, 0x5496, 0xBFA7, + 0x5497, 0x85F8, 0x5498, 0x85F9, 0x5499, 0xC1FC, 0x549A, 0xDFCB, + 0x549B, 0xDFCC, 0x549C, 0x85FA, 0x549D, 0xDFD0, 0x549E, 0x85FB, + 0x549F, 0x85FC, 0x54A0, 0x85FD, 0x54A1, 0x85FE, 0x54A2, 0x8640, + 0x54A3, 0xDFDB, 0x54A4, 0xDFE5, 0x54A5, 0x8641, 0x54A6, 0xDFD7, + 0x54A7, 0xDFD6, 0x54A8, 0xD7C9, 0x54A9, 0xDFE3, 0x54AA, 0xDFE4, + 0x54AB, 0xE5EB, 0x54AC, 0xD2A7, 0x54AD, 0xDFD2, 0x54AE, 0x8642, + 0x54AF, 0xBFA9, 0x54B0, 0x8643, 0x54B1, 0xD4DB, 0x54B2, 0x8644, + 0x54B3, 0xBFC8, 0x54B4, 0xDFD4, 0x54B5, 0x8645, 0x54B6, 0x8646, + 0x54B7, 0x8647, 0x54B8, 0xCFCC, 0x54B9, 0x8648, 0x54BA, 0x8649, + 0x54BB, 0xDFDD, 0x54BC, 0x864A, 0x54BD, 0xD1CA, 0x54BE, 0x864B, + 0x54BF, 0xDFDE, 0x54C0, 0xB0A7, 0x54C1, 0xC6B7, 0x54C2, 0xDFD3, + 0x54C3, 0x864C, 0x54C4, 0xBAE5, 0x54C5, 0x864D, 0x54C6, 0xB6DF, + 0x54C7, 0xCDDB, 0x54C8, 0xB9FE, 0x54C9, 0xD4D5, 0x54CA, 0x864E, + 0x54CB, 0x864F, 0x54CC, 0xDFDF, 0x54CD, 0xCFEC, 0x54CE, 0xB0A5, + 0x54CF, 0xDFE7, 0x54D0, 0xDFD1, 0x54D1, 0xD1C6, 0x54D2, 0xDFD5, + 0x54D3, 0xDFD8, 0x54D4, 0xDFD9, 0x54D5, 0xDFDC, 0x54D6, 0x8650, + 0x54D7, 0xBBA9, 0x54D8, 0x8651, 0x54D9, 0xDFE0, 0x54DA, 0xDFE1, + 0x54DB, 0x8652, 0x54DC, 0xDFE2, 0x54DD, 0xDFE6, 0x54DE, 0xDFE8, + 0x54DF, 0xD3B4, 0x54E0, 0x8653, 0x54E1, 0x8654, 0x54E2, 0x8655, + 0x54E3, 0x8656, 0x54E4, 0x8657, 0x54E5, 0xB8E7, 0x54E6, 0xC5B6, + 0x54E7, 0xDFEA, 0x54E8, 0xC9DA, 0x54E9, 0xC1A8, 0x54EA, 0xC4C4, + 0x54EB, 0x8658, 0x54EC, 0x8659, 0x54ED, 0xBFDE, 0x54EE, 0xCFF8, + 0x54EF, 0x865A, 0x54F0, 0x865B, 0x54F1, 0x865C, 0x54F2, 0xD5DC, + 0x54F3, 0xDFEE, 0x54F4, 0x865D, 0x54F5, 0x865E, 0x54F6, 0x865F, + 0x54F7, 0x8660, 0x54F8, 0x8661, 0x54F9, 0x8662, 0x54FA, 0xB2B8, + 0x54FB, 0x8663, 0x54FC, 0xBADF, 0x54FD, 0xDFEC, 0x54FE, 0x8664, + 0x54FF, 0xDBC1, 0x5500, 0x8665, 0x5501, 0xD1E4, 0x5502, 0x8666, + 0x5503, 0x8667, 0x5504, 0x8668, 0x5505, 0x8669, 0x5506, 0xCBF4, + 0x5507, 0xB4BD, 0x5508, 0x866A, 0x5509, 0xB0A6, 0x550A, 0x866B, + 0x550B, 0x866C, 0x550C, 0x866D, 0x550D, 0x866E, 0x550E, 0x866F, + 0x550F, 0xDFF1, 0x5510, 0xCCC6, 0x5511, 0xDFF2, 0x5512, 0x8670, + 0x5513, 0x8671, 0x5514, 0xDFED, 0x5515, 0x8672, 0x5516, 0x8673, + 0x5517, 0x8674, 0x5518, 0x8675, 0x5519, 0x8676, 0x551A, 0x8677, + 0x551B, 0xDFE9, 0x551C, 0x8678, 0x551D, 0x8679, 0x551E, 0x867A, + 0x551F, 0x867B, 0x5520, 0xDFEB, 0x5521, 0x867C, 0x5522, 0xDFEF, + 0x5523, 0xDFF0, 0x5524, 0xBBBD, 0x5525, 0x867D, 0x5526, 0x867E, + 0x5527, 0xDFF3, 0x5528, 0x8680, 0x5529, 0x8681, 0x552A, 0xDFF4, + 0x552B, 0x8682, 0x552C, 0xBBA3, 0x552D, 0x8683, 0x552E, 0xCADB, + 0x552F, 0xCEA8, 0x5530, 0xE0A7, 0x5531, 0xB3AA, 0x5532, 0x8684, + 0x5533, 0xE0A6, 0x5534, 0x8685, 0x5535, 0x8686, 0x5536, 0x8687, + 0x5537, 0xE0A1, 0x5538, 0x8688, 0x5539, 0x8689, 0x553A, 0x868A, + 0x553B, 0x868B, 0x553C, 0xDFFE, 0x553D, 0x868C, 0x553E, 0xCDD9, + 0x553F, 0xDFFC, 0x5540, 0x868D, 0x5541, 0xDFFA, 0x5542, 0x868E, + 0x5543, 0xBFD0, 0x5544, 0xD7C4, 0x5545, 0x868F, 0x5546, 0xC9CC, + 0x5547, 0x8690, 0x5548, 0x8691, 0x5549, 0xDFF8, 0x554A, 0xB0A1, + 0x554B, 0x8692, 0x554C, 0x8693, 0x554D, 0x8694, 0x554E, 0x8695, + 0x554F, 0x8696, 0x5550, 0xDFFD, 0x5551, 0x8697, 0x5552, 0x8698, + 0x5553, 0x8699, 0x5554, 0x869A, 0x5555, 0xDFFB, 0x5556, 0xE0A2, + 0x5557, 0x869B, 0x5558, 0x869C, 0x5559, 0x869D, 0x555A, 0x869E, + 0x555B, 0x869F, 0x555C, 0xE0A8, 0x555D, 0x86A0, 0x555E, 0x86A1, + 0x555F, 0x86A2, 0x5560, 0x86A3, 0x5561, 0xB7C8, 0x5562, 0x86A4, + 0x5563, 0x86A5, 0x5564, 0xC6A1, 0x5565, 0xC9B6, 0x5566, 0xC0B2, + 0x5567, 0xDFF5, 0x5568, 0x86A6, 0x5569, 0x86A7, 0x556A, 0xC5BE, + 0x556B, 0x86A8, 0x556C, 0xD8C4, 0x556D, 0xDFF9, 0x556E, 0xC4F6, + 0x556F, 0x86A9, 0x5570, 0x86AA, 0x5571, 0x86AB, 0x5572, 0x86AC, + 0x5573, 0x86AD, 0x5574, 0x86AE, 0x5575, 0xE0A3, 0x5576, 0xE0A4, + 0x5577, 0xE0A5, 0x5578, 0xD0A5, 0x5579, 0x86AF, 0x557A, 0x86B0, + 0x557B, 0xE0B4, 0x557C, 0xCCE4, 0x557D, 0x86B1, 0x557E, 0xE0B1, + 0x557F, 0x86B2, 0x5580, 0xBFA6, 0x5581, 0xE0AF, 0x5582, 0xCEB9, + 0x5583, 0xE0AB, 0x5584, 0xC9C6, 0x5585, 0x86B3, 0x5586, 0x86B4, + 0x5587, 0xC0AE, 0x5588, 0xE0AE, 0x5589, 0xBAED, 0x558A, 0xBAB0, + 0x558B, 0xE0A9, 0x558C, 0x86B5, 0x558D, 0x86B6, 0x558E, 0x86B7, + 0x558F, 0xDFF6, 0x5590, 0x86B8, 0x5591, 0xE0B3, 0x5592, 0x86B9, + 0x5593, 0x86BA, 0x5594, 0xE0B8, 0x5595, 0x86BB, 0x5596, 0x86BC, + 0x5597, 0x86BD, 0x5598, 0xB4AD, 0x5599, 0xE0B9, 0x559A, 0x86BE, + 0x559B, 0x86BF, 0x559C, 0xCFB2, 0x559D, 0xBAC8, 0x559E, 0x86C0, + 0x559F, 0xE0B0, 0x55A0, 0x86C1, 0x55A1, 0x86C2, 0x55A2, 0x86C3, + 0x55A3, 0x86C4, 0x55A4, 0x86C5, 0x55A5, 0x86C6, 0x55A6, 0x86C7, + 0x55A7, 0xD0FA, 0x55A8, 0x86C8, 0x55A9, 0x86C9, 0x55AA, 0x86CA, + 0x55AB, 0x86CB, 0x55AC, 0x86CC, 0x55AD, 0x86CD, 0x55AE, 0x86CE, + 0x55AF, 0x86CF, 0x55B0, 0x86D0, 0x55B1, 0xE0AC, 0x55B2, 0x86D1, + 0x55B3, 0xD4FB, 0x55B4, 0x86D2, 0x55B5, 0xDFF7, 0x55B6, 0x86D3, + 0x55B7, 0xC5E7, 0x55B8, 0x86D4, 0x55B9, 0xE0AD, 0x55BA, 0x86D5, + 0x55BB, 0xD3F7, 0x55BC, 0x86D6, 0x55BD, 0xE0B6, 0x55BE, 0xE0B7, + 0x55BF, 0x86D7, 0x55C0, 0x86D8, 0x55C1, 0x86D9, 0x55C2, 0x86DA, + 0x55C3, 0x86DB, 0x55C4, 0xE0C4, 0x55C5, 0xD0E1, 0x55C6, 0x86DC, + 0x55C7, 0x86DD, 0x55C8, 0x86DE, 0x55C9, 0xE0BC, 0x55CA, 0x86DF, + 0x55CB, 0x86E0, 0x55CC, 0xE0C9, 0x55CD, 0xE0CA, 0x55CE, 0x86E1, + 0x55CF, 0x86E2, 0x55D0, 0x86E3, 0x55D1, 0xE0BE, 0x55D2, 0xE0AA, + 0x55D3, 0xC9A4, 0x55D4, 0xE0C1, 0x55D5, 0x86E4, 0x55D6, 0xE0B2, + 0x55D7, 0x86E5, 0x55D8, 0x86E6, 0x55D9, 0x86E7, 0x55DA, 0x86E8, + 0x55DB, 0x86E9, 0x55DC, 0xCAC8, 0x55DD, 0xE0C3, 0x55DE, 0x86EA, + 0x55DF, 0xE0B5, 0x55E0, 0x86EB, 0x55E1, 0xCECB, 0x55E2, 0x86EC, + 0x55E3, 0xCBC3, 0x55E4, 0xE0CD, 0x55E5, 0xE0C6, 0x55E6, 0xE0C2, + 0x55E7, 0x86ED, 0x55E8, 0xE0CB, 0x55E9, 0x86EE, 0x55EA, 0xE0BA, + 0x55EB, 0xE0BF, 0x55EC, 0xE0C0, 0x55ED, 0x86EF, 0x55EE, 0x86F0, + 0x55EF, 0xE0C5, 0x55F0, 0x86F1, 0x55F1, 0x86F2, 0x55F2, 0xE0C7, + 0x55F3, 0xE0C8, 0x55F4, 0x86F3, 0x55F5, 0xE0CC, 0x55F6, 0x86F4, + 0x55F7, 0xE0BB, 0x55F8, 0x86F5, 0x55F9, 0x86F6, 0x55FA, 0x86F7, + 0x55FB, 0x86F8, 0x55FC, 0x86F9, 0x55FD, 0xCBD4, 0x55FE, 0xE0D5, + 0x55FF, 0x86FA, 0x5600, 0xE0D6, 0x5601, 0xE0D2, 0x5602, 0x86FB, + 0x5603, 0x86FC, 0x5604, 0x86FD, 0x5605, 0x86FE, 0x5606, 0x8740, + 0x5607, 0x8741, 0x5608, 0xE0D0, 0x5609, 0xBCCE, 0x560A, 0x8742, + 0x560B, 0x8743, 0x560C, 0xE0D1, 0x560D, 0x8744, 0x560E, 0xB8C2, + 0x560F, 0xD8C5, 0x5610, 0x8745, 0x5611, 0x8746, 0x5612, 0x8747, + 0x5613, 0x8748, 0x5614, 0x8749, 0x5615, 0x874A, 0x5616, 0x874B, + 0x5617, 0x874C, 0x5618, 0xD0EA, 0x5619, 0x874D, 0x561A, 0x874E, + 0x561B, 0xC2EF, 0x561C, 0x874F, 0x561D, 0x8750, 0x561E, 0xE0CF, + 0x561F, 0xE0BD, 0x5620, 0x8751, 0x5621, 0x8752, 0x5622, 0x8753, + 0x5623, 0xE0D4, 0x5624, 0xE0D3, 0x5625, 0x8754, 0x5626, 0x8755, + 0x5627, 0xE0D7, 0x5628, 0x8756, 0x5629, 0x8757, 0x562A, 0x8758, + 0x562B, 0x8759, 0x562C, 0xE0DC, 0x562D, 0xE0D8, 0x562E, 0x875A, + 0x562F, 0x875B, 0x5630, 0x875C, 0x5631, 0xD6F6, 0x5632, 0xB3B0, + 0x5633, 0x875D, 0x5634, 0xD7EC, 0x5635, 0x875E, 0x5636, 0xCBBB, + 0x5637, 0x875F, 0x5638, 0x8760, 0x5639, 0xE0DA, 0x563A, 0x8761, + 0x563B, 0xCEFB, 0x563C, 0x8762, 0x563D, 0x8763, 0x563E, 0x8764, + 0x563F, 0xBAD9, 0x5640, 0x8765, 0x5641, 0x8766, 0x5642, 0x8767, + 0x5643, 0x8768, 0x5644, 0x8769, 0x5645, 0x876A, 0x5646, 0x876B, + 0x5647, 0x876C, 0x5648, 0x876D, 0x5649, 0x876E, 0x564A, 0x876F, + 0x564B, 0x8770, 0x564C, 0xE0E1, 0x564D, 0xE0DD, 0x564E, 0xD2AD, + 0x564F, 0x8771, 0x5650, 0x8772, 0x5651, 0x8773, 0x5652, 0x8774, + 0x5653, 0x8775, 0x5654, 0xE0E2, 0x5655, 0x8776, 0x5656, 0x8777, + 0x5657, 0xE0DB, 0x5658, 0xE0D9, 0x5659, 0xE0DF, 0x565A, 0x8778, + 0x565B, 0x8779, 0x565C, 0xE0E0, 0x565D, 0x877A, 0x565E, 0x877B, + 0x565F, 0x877C, 0x5660, 0x877D, 0x5661, 0x877E, 0x5662, 0xE0DE, + 0x5663, 0x8780, 0x5664, 0xE0E4, 0x5665, 0x8781, 0x5666, 0x8782, + 0x5667, 0x8783, 0x5668, 0xC6F7, 0x5669, 0xD8AC, 0x566A, 0xD4EB, + 0x566B, 0xE0E6, 0x566C, 0xCAC9, 0x566D, 0x8784, 0x566E, 0x8785, + 0x566F, 0x8786, 0x5670, 0x8787, 0x5671, 0xE0E5, 0x5672, 0x8788, + 0x5673, 0x8789, 0x5674, 0x878A, 0x5675, 0x878B, 0x5676, 0xB8C1, + 0x5677, 0x878C, 0x5678, 0x878D, 0x5679, 0x878E, 0x567A, 0x878F, + 0x567B, 0xE0E7, 0x567C, 0xE0E8, 0x567D, 0x8790, 0x567E, 0x8791, + 0x567F, 0x8792, 0x5680, 0x8793, 0x5681, 0x8794, 0x5682, 0x8795, + 0x5683, 0x8796, 0x5684, 0x8797, 0x5685, 0xE0E9, 0x5686, 0xE0E3, + 0x5687, 0x8798, 0x5688, 0x8799, 0x5689, 0x879A, 0x568A, 0x879B, + 0x568B, 0x879C, 0x568C, 0x879D, 0x568D, 0x879E, 0x568E, 0xBABF, + 0x568F, 0xCCE7, 0x5690, 0x879F, 0x5691, 0x87A0, 0x5692, 0x87A1, + 0x5693, 0xE0EA, 0x5694, 0x87A2, 0x5695, 0x87A3, 0x5696, 0x87A4, + 0x5697, 0x87A5, 0x5698, 0x87A6, 0x5699, 0x87A7, 0x569A, 0x87A8, + 0x569B, 0x87A9, 0x569C, 0x87AA, 0x569D, 0x87AB, 0x569E, 0x87AC, + 0x569F, 0x87AD, 0x56A0, 0x87AE, 0x56A1, 0x87AF, 0x56A2, 0x87B0, + 0x56A3, 0xCFF9, 0x56A4, 0x87B1, 0x56A5, 0x87B2, 0x56A6, 0x87B3, + 0x56A7, 0x87B4, 0x56A8, 0x87B5, 0x56A9, 0x87B6, 0x56AA, 0x87B7, + 0x56AB, 0x87B8, 0x56AC, 0x87B9, 0x56AD, 0x87BA, 0x56AE, 0x87BB, + 0x56AF, 0xE0EB, 0x56B0, 0x87BC, 0x56B1, 0x87BD, 0x56B2, 0x87BE, + 0x56B3, 0x87BF, 0x56B4, 0x87C0, 0x56B5, 0x87C1, 0x56B6, 0x87C2, + 0x56B7, 0xC8C2, 0x56B8, 0x87C3, 0x56B9, 0x87C4, 0x56BA, 0x87C5, + 0x56BB, 0x87C6, 0x56BC, 0xBDC0, 0x56BD, 0x87C7, 0x56BE, 0x87C8, + 0x56BF, 0x87C9, 0x56C0, 0x87CA, 0x56C1, 0x87CB, 0x56C2, 0x87CC, + 0x56C3, 0x87CD, 0x56C4, 0x87CE, 0x56C5, 0x87CF, 0x56C6, 0x87D0, + 0x56C7, 0x87D1, 0x56C8, 0x87D2, 0x56C9, 0x87D3, 0x56CA, 0xC4D2, + 0x56CB, 0x87D4, 0x56CC, 0x87D5, 0x56CD, 0x87D6, 0x56CE, 0x87D7, + 0x56CF, 0x87D8, 0x56D0, 0x87D9, 0x56D1, 0x87DA, 0x56D2, 0x87DB, + 0x56D3, 0x87DC, 0x56D4, 0xE0EC, 0x56D5, 0x87DD, 0x56D6, 0x87DE, + 0x56D7, 0xE0ED, 0x56D8, 0x87DF, 0x56D9, 0x87E0, 0x56DA, 0xC7F4, + 0x56DB, 0xCBC4, 0x56DC, 0x87E1, 0x56DD, 0xE0EE, 0x56DE, 0xBBD8, + 0x56DF, 0xD8B6, 0x56E0, 0xD2F2, 0x56E1, 0xE0EF, 0x56E2, 0xCDC5, + 0x56E3, 0x87E2, 0x56E4, 0xB6DA, 0x56E5, 0x87E3, 0x56E6, 0x87E4, + 0x56E7, 0x87E5, 0x56E8, 0x87E6, 0x56E9, 0x87E7, 0x56EA, 0x87E8, + 0x56EB, 0xE0F1, 0x56EC, 0x87E9, 0x56ED, 0xD4B0, 0x56EE, 0x87EA, + 0x56EF, 0x87EB, 0x56F0, 0xC0A7, 0x56F1, 0xB4D1, 0x56F2, 0x87EC, + 0x56F3, 0x87ED, 0x56F4, 0xCEA7, 0x56F5, 0xE0F0, 0x56F6, 0x87EE, + 0x56F7, 0x87EF, 0x56F8, 0x87F0, 0x56F9, 0xE0F2, 0x56FA, 0xB9CC, + 0x56FB, 0x87F1, 0x56FC, 0x87F2, 0x56FD, 0xB9FA, 0x56FE, 0xCDBC, + 0x56FF, 0xE0F3, 0x5700, 0x87F3, 0x5701, 0x87F4, 0x5702, 0x87F5, + 0x5703, 0xC6D4, 0x5704, 0xE0F4, 0x5705, 0x87F6, 0x5706, 0xD4B2, + 0x5707, 0x87F7, 0x5708, 0xC8A6, 0x5709, 0xE0F6, 0x570A, 0xE0F5, + 0x570B, 0x87F8, 0x570C, 0x87F9, 0x570D, 0x87FA, 0x570E, 0x87FB, + 0x570F, 0x87FC, 0x5710, 0x87FD, 0x5711, 0x87FE, 0x5712, 0x8840, + 0x5713, 0x8841, 0x5714, 0x8842, 0x5715, 0x8843, 0x5716, 0x8844, + 0x5717, 0x8845, 0x5718, 0x8846, 0x5719, 0x8847, 0x571A, 0x8848, + 0x571B, 0x8849, 0x571C, 0xE0F7, 0x571D, 0x884A, 0x571E, 0x884B, + 0x571F, 0xCDC1, 0x5720, 0x884C, 0x5721, 0x884D, 0x5722, 0x884E, + 0x5723, 0xCAA5, 0x5724, 0x884F, 0x5725, 0x8850, 0x5726, 0x8851, + 0x5727, 0x8852, 0x5728, 0xD4DA, 0x5729, 0xDBD7, 0x572A, 0xDBD9, + 0x572B, 0x8853, 0x572C, 0xDBD8, 0x572D, 0xB9E7, 0x572E, 0xDBDC, + 0x572F, 0xDBDD, 0x5730, 0xB5D8, 0x5731, 0x8854, 0x5732, 0x8855, + 0x5733, 0xDBDA, 0x5734, 0x8856, 0x5735, 0x8857, 0x5736, 0x8858, + 0x5737, 0x8859, 0x5738, 0x885A, 0x5739, 0xDBDB, 0x573A, 0xB3A1, + 0x573B, 0xDBDF, 0x573C, 0x885B, 0x573D, 0x885C, 0x573E, 0xBBF8, + 0x573F, 0x885D, 0x5740, 0xD6B7, 0x5741, 0x885E, 0x5742, 0xDBE0, + 0x5743, 0x885F, 0x5744, 0x8860, 0x5745, 0x8861, 0x5746, 0x8862, + 0x5747, 0xBEF9, 0x5748, 0x8863, 0x5749, 0x8864, 0x574A, 0xB7BB, + 0x574B, 0x8865, 0x574C, 0xDBD0, 0x574D, 0xCCAE, 0x574E, 0xBFB2, + 0x574F, 0xBBB5, 0x5750, 0xD7F8, 0x5751, 0xBFD3, 0x5752, 0x8866, + 0x5753, 0x8867, 0x5754, 0x8868, 0x5755, 0x8869, 0x5756, 0x886A, + 0x5757, 0xBFE9, 0x5758, 0x886B, 0x5759, 0x886C, 0x575A, 0xBCE1, + 0x575B, 0xCCB3, 0x575C, 0xDBDE, 0x575D, 0xB0D3, 0x575E, 0xCEEB, + 0x575F, 0xB7D8, 0x5760, 0xD7B9, 0x5761, 0xC6C2, 0x5762, 0x886D, + 0x5763, 0x886E, 0x5764, 0xC0A4, 0x5765, 0x886F, 0x5766, 0xCCB9, + 0x5767, 0x8870, 0x5768, 0xDBE7, 0x5769, 0xDBE1, 0x576A, 0xC6BA, + 0x576B, 0xDBE3, 0x576C, 0x8871, 0x576D, 0xDBE8, 0x576E, 0x8872, + 0x576F, 0xC5F7, 0x5770, 0x8873, 0x5771, 0x8874, 0x5772, 0x8875, + 0x5773, 0xDBEA, 0x5774, 0x8876, 0x5775, 0x8877, 0x5776, 0xDBE9, + 0x5777, 0xBFC0, 0x5778, 0x8878, 0x5779, 0x8879, 0x577A, 0x887A, + 0x577B, 0xDBE6, 0x577C, 0xDBE5, 0x577D, 0x887B, 0x577E, 0x887C, + 0x577F, 0x887D, 0x5780, 0x887E, 0x5781, 0x8880, 0x5782, 0xB4B9, + 0x5783, 0xC0AC, 0x5784, 0xC2A2, 0x5785, 0xDBE2, 0x5786, 0xDBE4, + 0x5787, 0x8881, 0x5788, 0x8882, 0x5789, 0x8883, 0x578A, 0x8884, + 0x578B, 0xD0CD, 0x578C, 0xDBED, 0x578D, 0x8885, 0x578E, 0x8886, + 0x578F, 0x8887, 0x5790, 0x8888, 0x5791, 0x8889, 0x5792, 0xC0DD, + 0x5793, 0xDBF2, 0x5794, 0x888A, 0x5795, 0x888B, 0x5796, 0x888C, + 0x5797, 0x888D, 0x5798, 0x888E, 0x5799, 0x888F, 0x579A, 0x8890, + 0x579B, 0xB6E2, 0x579C, 0x8891, 0x579D, 0x8892, 0x579E, 0x8893, + 0x579F, 0x8894, 0x57A0, 0xDBF3, 0x57A1, 0xDBD2, 0x57A2, 0xB9B8, + 0x57A3, 0xD4AB, 0x57A4, 0xDBEC, 0x57A5, 0x8895, 0x57A6, 0xBFD1, + 0x57A7, 0xDBF0, 0x57A8, 0x8896, 0x57A9, 0xDBD1, 0x57AA, 0x8897, + 0x57AB, 0xB5E6, 0x57AC, 0x8898, 0x57AD, 0xDBEB, 0x57AE, 0xBFE5, + 0x57AF, 0x8899, 0x57B0, 0x889A, 0x57B1, 0x889B, 0x57B2, 0xDBEE, + 0x57B3, 0x889C, 0x57B4, 0xDBF1, 0x57B5, 0x889D, 0x57B6, 0x889E, + 0x57B7, 0x889F, 0x57B8, 0xDBF9, 0x57B9, 0x88A0, 0x57BA, 0x88A1, + 0x57BB, 0x88A2, 0x57BC, 0x88A3, 0x57BD, 0x88A4, 0x57BE, 0x88A5, + 0x57BF, 0x88A6, 0x57C0, 0x88A7, 0x57C1, 0x88A8, 0x57C2, 0xB9A1, + 0x57C3, 0xB0A3, 0x57C4, 0x88A9, 0x57C5, 0x88AA, 0x57C6, 0x88AB, + 0x57C7, 0x88AC, 0x57C8, 0x88AD, 0x57C9, 0x88AE, 0x57CA, 0x88AF, + 0x57CB, 0xC2F1, 0x57CC, 0x88B0, 0x57CD, 0x88B1, 0x57CE, 0xB3C7, + 0x57CF, 0xDBEF, 0x57D0, 0x88B2, 0x57D1, 0x88B3, 0x57D2, 0xDBF8, + 0x57D3, 0x88B4, 0x57D4, 0xC6D2, 0x57D5, 0xDBF4, 0x57D6, 0x88B5, + 0x57D7, 0x88B6, 0x57D8, 0xDBF5, 0x57D9, 0xDBF7, 0x57DA, 0xDBF6, + 0x57DB, 0x88B7, 0x57DC, 0x88B8, 0x57DD, 0xDBFE, 0x57DE, 0x88B9, + 0x57DF, 0xD3F2, 0x57E0, 0xB2BA, 0x57E1, 0x88BA, 0x57E2, 0x88BB, + 0x57E3, 0x88BC, 0x57E4, 0xDBFD, 0x57E5, 0x88BD, 0x57E6, 0x88BE, + 0x57E7, 0x88BF, 0x57E8, 0x88C0, 0x57E9, 0x88C1, 0x57EA, 0x88C2, + 0x57EB, 0x88C3, 0x57EC, 0x88C4, 0x57ED, 0xDCA4, 0x57EE, 0x88C5, + 0x57EF, 0xDBFB, 0x57F0, 0x88C6, 0x57F1, 0x88C7, 0x57F2, 0x88C8, + 0x57F3, 0x88C9, 0x57F4, 0xDBFA, 0x57F5, 0x88CA, 0x57F6, 0x88CB, + 0x57F7, 0x88CC, 0x57F8, 0xDBFC, 0x57F9, 0xC5E0, 0x57FA, 0xBBF9, + 0x57FB, 0x88CD, 0x57FC, 0x88CE, 0x57FD, 0xDCA3, 0x57FE, 0x88CF, + 0x57FF, 0x88D0, 0x5800, 0xDCA5, 0x5801, 0x88D1, 0x5802, 0xCCC3, + 0x5803, 0x88D2, 0x5804, 0x88D3, 0x5805, 0x88D4, 0x5806, 0xB6D1, + 0x5807, 0xDDC0, 0x5808, 0x88D5, 0x5809, 0x88D6, 0x580A, 0x88D7, + 0x580B, 0xDCA1, 0x580C, 0x88D8, 0x580D, 0xDCA2, 0x580E, 0x88D9, + 0x580F, 0x88DA, 0x5810, 0x88DB, 0x5811, 0xC7B5, 0x5812, 0x88DC, + 0x5813, 0x88DD, 0x5814, 0x88DE, 0x5815, 0xB6E9, 0x5816, 0x88DF, + 0x5817, 0x88E0, 0x5818, 0x88E1, 0x5819, 0xDCA7, 0x581A, 0x88E2, + 0x581B, 0x88E3, 0x581C, 0x88E4, 0x581D, 0x88E5, 0x581E, 0xDCA6, + 0x581F, 0x88E6, 0x5820, 0xDCA9, 0x5821, 0xB1A4, 0x5822, 0x88E7, + 0x5823, 0x88E8, 0x5824, 0xB5CC, 0x5825, 0x88E9, 0x5826, 0x88EA, + 0x5827, 0x88EB, 0x5828, 0x88EC, 0x5829, 0x88ED, 0x582A, 0xBFB0, + 0x582B, 0x88EE, 0x582C, 0x88EF, 0x582D, 0x88F0, 0x582E, 0x88F1, + 0x582F, 0x88F2, 0x5830, 0xD1DF, 0x5831, 0x88F3, 0x5832, 0x88F4, + 0x5833, 0x88F5, 0x5834, 0x88F6, 0x5835, 0xB6C2, 0x5836, 0x88F7, + 0x5837, 0x88F8, 0x5838, 0x88F9, 0x5839, 0x88FA, 0x583A, 0x88FB, + 0x583B, 0x88FC, 0x583C, 0x88FD, 0x583D, 0x88FE, 0x583E, 0x8940, + 0x583F, 0x8941, 0x5840, 0x8942, 0x5841, 0x8943, 0x5842, 0x8944, + 0x5843, 0x8945, 0x5844, 0xDCA8, 0x5845, 0x8946, 0x5846, 0x8947, + 0x5847, 0x8948, 0x5848, 0x8949, 0x5849, 0x894A, 0x584A, 0x894B, + 0x584B, 0x894C, 0x584C, 0xCBFA, 0x584D, 0xEBF3, 0x584E, 0x894D, + 0x584F, 0x894E, 0x5850, 0x894F, 0x5851, 0xCBDC, 0x5852, 0x8950, + 0x5853, 0x8951, 0x5854, 0xCBFE, 0x5855, 0x8952, 0x5856, 0x8953, + 0x5857, 0x8954, 0x5858, 0xCCC1, 0x5859, 0x8955, 0x585A, 0x8956, + 0x585B, 0x8957, 0x585C, 0x8958, 0x585D, 0x8959, 0x585E, 0xC8FB, + 0x585F, 0x895A, 0x5860, 0x895B, 0x5861, 0x895C, 0x5862, 0x895D, + 0x5863, 0x895E, 0x5864, 0x895F, 0x5865, 0xDCAA, 0x5866, 0x8960, + 0x5867, 0x8961, 0x5868, 0x8962, 0x5869, 0x8963, 0x586A, 0x8964, + 0x586B, 0xCCEE, 0x586C, 0xDCAB, 0x586D, 0x8965, 0x586E, 0x8966, + 0x586F, 0x8967, 0x5870, 0x8968, 0x5871, 0x8969, 0x5872, 0x896A, + 0x5873, 0x896B, 0x5874, 0x896C, 0x5875, 0x896D, 0x5876, 0x896E, + 0x5877, 0x896F, 0x5878, 0x8970, 0x5879, 0x8971, 0x587A, 0x8972, + 0x587B, 0x8973, 0x587C, 0x8974, 0x587D, 0x8975, 0x587E, 0xDBD3, + 0x587F, 0x8976, 0x5880, 0xDCAF, 0x5881, 0xDCAC, 0x5882, 0x8977, + 0x5883, 0xBEB3, 0x5884, 0x8978, 0x5885, 0xCAFB, 0x5886, 0x8979, + 0x5887, 0x897A, 0x5888, 0x897B, 0x5889, 0xDCAD, 0x588A, 0x897C, + 0x588B, 0x897D, 0x588C, 0x897E, 0x588D, 0x8980, 0x588E, 0x8981, + 0x588F, 0x8982, 0x5890, 0x8983, 0x5891, 0x8984, 0x5892, 0xC9CA, + 0x5893, 0xC4B9, 0x5894, 0x8985, 0x5895, 0x8986, 0x5896, 0x8987, + 0x5897, 0x8988, 0x5898, 0x8989, 0x5899, 0xC7BD, 0x589A, 0xDCAE, + 0x589B, 0x898A, 0x589C, 0x898B, 0x589D, 0x898C, 0x589E, 0xD4F6, + 0x589F, 0xD0E6, 0x58A0, 0x898D, 0x58A1, 0x898E, 0x58A2, 0x898F, + 0x58A3, 0x8990, 0x58A4, 0x8991, 0x58A5, 0x8992, 0x58A6, 0x8993, + 0x58A7, 0x8994, 0x58A8, 0xC4AB, 0x58A9, 0xB6D5, 0x58AA, 0x8995, + 0x58AB, 0x8996, 0x58AC, 0x8997, 0x58AD, 0x8998, 0x58AE, 0x8999, + 0x58AF, 0x899A, 0x58B0, 0x899B, 0x58B1, 0x899C, 0x58B2, 0x899D, + 0x58B3, 0x899E, 0x58B4, 0x899F, 0x58B5, 0x89A0, 0x58B6, 0x89A1, + 0x58B7, 0x89A2, 0x58B8, 0x89A3, 0x58B9, 0x89A4, 0x58BA, 0x89A5, + 0x58BB, 0x89A6, 0x58BC, 0xDBD4, 0x58BD, 0x89A7, 0x58BE, 0x89A8, + 0x58BF, 0x89A9, 0x58C0, 0x89AA, 0x58C1, 0xB1DA, 0x58C2, 0x89AB, + 0x58C3, 0x89AC, 0x58C4, 0x89AD, 0x58C5, 0xDBD5, 0x58C6, 0x89AE, + 0x58C7, 0x89AF, 0x58C8, 0x89B0, 0x58C9, 0x89B1, 0x58CA, 0x89B2, + 0x58CB, 0x89B3, 0x58CC, 0x89B4, 0x58CD, 0x89B5, 0x58CE, 0x89B6, + 0x58CF, 0x89B7, 0x58D0, 0x89B8, 0x58D1, 0xDBD6, 0x58D2, 0x89B9, + 0x58D3, 0x89BA, 0x58D4, 0x89BB, 0x58D5, 0xBABE, 0x58D6, 0x89BC, + 0x58D7, 0x89BD, 0x58D8, 0x89BE, 0x58D9, 0x89BF, 0x58DA, 0x89C0, + 0x58DB, 0x89C1, 0x58DC, 0x89C2, 0x58DD, 0x89C3, 0x58DE, 0x89C4, + 0x58DF, 0x89C5, 0x58E0, 0x89C6, 0x58E1, 0x89C7, 0x58E2, 0x89C8, + 0x58E3, 0x89C9, 0x58E4, 0xC8C0, 0x58E5, 0x89CA, 0x58E6, 0x89CB, + 0x58E7, 0x89CC, 0x58E8, 0x89CD, 0x58E9, 0x89CE, 0x58EA, 0x89CF, + 0x58EB, 0xCABF, 0x58EC, 0xC8C9, 0x58ED, 0x89D0, 0x58EE, 0xD7B3, + 0x58EF, 0x89D1, 0x58F0, 0xC9F9, 0x58F1, 0x89D2, 0x58F2, 0x89D3, + 0x58F3, 0xBFC7, 0x58F4, 0x89D4, 0x58F5, 0x89D5, 0x58F6, 0xBAF8, + 0x58F7, 0x89D6, 0x58F8, 0x89D7, 0x58F9, 0xD2BC, 0x58FA, 0x89D8, + 0x58FB, 0x89D9, 0x58FC, 0x89DA, 0x58FD, 0x89DB, 0x58FE, 0x89DC, + 0x58FF, 0x89DD, 0x5900, 0x89DE, 0x5901, 0x89DF, 0x5902, 0xE2BA, + 0x5903, 0x89E0, 0x5904, 0xB4A6, 0x5905, 0x89E1, 0x5906, 0x89E2, + 0x5907, 0xB1B8, 0x5908, 0x89E3, 0x5909, 0x89E4, 0x590A, 0x89E5, + 0x590B, 0x89E6, 0x590C, 0x89E7, 0x590D, 0xB8B4, 0x590E, 0x89E8, + 0x590F, 0xCFC4, 0x5910, 0x89E9, 0x5911, 0x89EA, 0x5912, 0x89EB, + 0x5913, 0x89EC, 0x5914, 0xD9E7, 0x5915, 0xCFA6, 0x5916, 0xCDE2, + 0x5917, 0x89ED, 0x5918, 0x89EE, 0x5919, 0xD9ED, 0x591A, 0xB6E0, + 0x591B, 0x89EF, 0x591C, 0xD2B9, 0x591D, 0x89F0, 0x591E, 0x89F1, + 0x591F, 0xB9BB, 0x5920, 0x89F2, 0x5921, 0x89F3, 0x5922, 0x89F4, + 0x5923, 0x89F5, 0x5924, 0xE2B9, 0x5925, 0xE2B7, 0x5926, 0x89F6, + 0x5927, 0xB4F3, 0x5928, 0x89F7, 0x5929, 0xCCEC, 0x592A, 0xCCAB, + 0x592B, 0xB7F2, 0x592C, 0x89F8, 0x592D, 0xD8B2, 0x592E, 0xD1EB, + 0x592F, 0xBABB, 0x5930, 0x89F9, 0x5931, 0xCAA7, 0x5932, 0x89FA, + 0x5933, 0x89FB, 0x5934, 0xCDB7, 0x5935, 0x89FC, 0x5936, 0x89FD, + 0x5937, 0xD2C4, 0x5938, 0xBFE4, 0x5939, 0xBCD0, 0x593A, 0xB6E1, + 0x593B, 0x89FE, 0x593C, 0xDEC5, 0x593D, 0x8A40, 0x593E, 0x8A41, + 0x593F, 0x8A42, 0x5940, 0x8A43, 0x5941, 0xDEC6, 0x5942, 0xDBBC, + 0x5943, 0x8A44, 0x5944, 0xD1D9, 0x5945, 0x8A45, 0x5946, 0x8A46, + 0x5947, 0xC6E6, 0x5948, 0xC4CE, 0x5949, 0xB7EE, 0x594A, 0x8A47, + 0x594B, 0xB7DC, 0x594C, 0x8A48, 0x594D, 0x8A49, 0x594E, 0xBFFC, + 0x594F, 0xD7E0, 0x5950, 0x8A4A, 0x5951, 0xC6F5, 0x5952, 0x8A4B, + 0x5953, 0x8A4C, 0x5954, 0xB1BC, 0x5955, 0xDEC8, 0x5956, 0xBDB1, + 0x5957, 0xCCD7, 0x5958, 0xDECA, 0x5959, 0x8A4D, 0x595A, 0xDEC9, + 0x595B, 0x8A4E, 0x595C, 0x8A4F, 0x595D, 0x8A50, 0x595E, 0x8A51, + 0x595F, 0x8A52, 0x5960, 0xB5EC, 0x5961, 0x8A53, 0x5962, 0xC9DD, + 0x5963, 0x8A54, 0x5964, 0x8A55, 0x5965, 0xB0C2, 0x5966, 0x8A56, + 0x5967, 0x8A57, 0x5968, 0x8A58, 0x5969, 0x8A59, 0x596A, 0x8A5A, + 0x596B, 0x8A5B, 0x596C, 0x8A5C, 0x596D, 0x8A5D, 0x596E, 0x8A5E, + 0x596F, 0x8A5F, 0x5970, 0x8A60, 0x5971, 0x8A61, 0x5972, 0x8A62, + 0x5973, 0xC5AE, 0x5974, 0xC5AB, 0x5975, 0x8A63, 0x5976, 0xC4CC, + 0x5977, 0x8A64, 0x5978, 0xBCE9, 0x5979, 0xCBFD, 0x597A, 0x8A65, + 0x597B, 0x8A66, 0x597C, 0x8A67, 0x597D, 0xBAC3, 0x597E, 0x8A68, + 0x597F, 0x8A69, 0x5980, 0x8A6A, 0x5981, 0xE5F9, 0x5982, 0xC8E7, + 0x5983, 0xE5FA, 0x5984, 0xCDFD, 0x5985, 0x8A6B, 0x5986, 0xD7B1, + 0x5987, 0xB8BE, 0x5988, 0xC2E8, 0x5989, 0x8A6C, 0x598A, 0xC8D1, + 0x598B, 0x8A6D, 0x598C, 0x8A6E, 0x598D, 0xE5FB, 0x598E, 0x8A6F, + 0x598F, 0x8A70, 0x5990, 0x8A71, 0x5991, 0x8A72, 0x5992, 0xB6CA, + 0x5993, 0xBCCB, 0x5994, 0x8A73, 0x5995, 0x8A74, 0x5996, 0xD1FD, + 0x5997, 0xE6A1, 0x5998, 0x8A75, 0x5999, 0xC3EE, 0x599A, 0x8A76, + 0x599B, 0x8A77, 0x599C, 0x8A78, 0x599D, 0x8A79, 0x599E, 0xE6A4, + 0x599F, 0x8A7A, 0x59A0, 0x8A7B, 0x59A1, 0x8A7C, 0x59A2, 0x8A7D, + 0x59A3, 0xE5FE, 0x59A4, 0xE6A5, 0x59A5, 0xCDD7, 0x59A6, 0x8A7E, + 0x59A7, 0x8A80, 0x59A8, 0xB7C1, 0x59A9, 0xE5FC, 0x59AA, 0xE5FD, + 0x59AB, 0xE6A3, 0x59AC, 0x8A81, 0x59AD, 0x8A82, 0x59AE, 0xC4DD, + 0x59AF, 0xE6A8, 0x59B0, 0x8A83, 0x59B1, 0x8A84, 0x59B2, 0xE6A7, + 0x59B3, 0x8A85, 0x59B4, 0x8A86, 0x59B5, 0x8A87, 0x59B6, 0x8A88, + 0x59B7, 0x8A89, 0x59B8, 0x8A8A, 0x59B9, 0xC3C3, 0x59BA, 0x8A8B, + 0x59BB, 0xC6DE, 0x59BC, 0x8A8C, 0x59BD, 0x8A8D, 0x59BE, 0xE6AA, + 0x59BF, 0x8A8E, 0x59C0, 0x8A8F, 0x59C1, 0x8A90, 0x59C2, 0x8A91, + 0x59C3, 0x8A92, 0x59C4, 0x8A93, 0x59C5, 0x8A94, 0x59C6, 0xC4B7, + 0x59C7, 0x8A95, 0x59C8, 0x8A96, 0x59C9, 0x8A97, 0x59CA, 0xE6A2, + 0x59CB, 0xCABC, 0x59CC, 0x8A98, 0x59CD, 0x8A99, 0x59CE, 0x8A9A, + 0x59CF, 0x8A9B, 0x59D0, 0xBDE3, 0x59D1, 0xB9C3, 0x59D2, 0xE6A6, + 0x59D3, 0xD0D5, 0x59D4, 0xCEAF, 0x59D5, 0x8A9C, 0x59D6, 0x8A9D, + 0x59D7, 0xE6A9, 0x59D8, 0xE6B0, 0x59D9, 0x8A9E, 0x59DA, 0xD2A6, + 0x59DB, 0x8A9F, 0x59DC, 0xBDAA, 0x59DD, 0xE6AD, 0x59DE, 0x8AA0, + 0x59DF, 0x8AA1, 0x59E0, 0x8AA2, 0x59E1, 0x8AA3, 0x59E2, 0x8AA4, + 0x59E3, 0xE6AF, 0x59E4, 0x8AA5, 0x59E5, 0xC0D1, 0x59E6, 0x8AA6, + 0x59E7, 0x8AA7, 0x59E8, 0xD2CC, 0x59E9, 0x8AA8, 0x59EA, 0x8AA9, + 0x59EB, 0x8AAA, 0x59EC, 0xBCA7, 0x59ED, 0x8AAB, 0x59EE, 0x8AAC, + 0x59EF, 0x8AAD, 0x59F0, 0x8AAE, 0x59F1, 0x8AAF, 0x59F2, 0x8AB0, + 0x59F3, 0x8AB1, 0x59F4, 0x8AB2, 0x59F5, 0x8AB3, 0x59F6, 0x8AB4, + 0x59F7, 0x8AB5, 0x59F8, 0x8AB6, 0x59F9, 0xE6B1, 0x59FA, 0x8AB7, + 0x59FB, 0xD2F6, 0x59FC, 0x8AB8, 0x59FD, 0x8AB9, 0x59FE, 0x8ABA, + 0x59FF, 0xD7CB, 0x5A00, 0x8ABB, 0x5A01, 0xCDFE, 0x5A02, 0x8ABC, + 0x5A03, 0xCDDE, 0x5A04, 0xC2A6, 0x5A05, 0xE6AB, 0x5A06, 0xE6AC, + 0x5A07, 0xBDBF, 0x5A08, 0xE6AE, 0x5A09, 0xE6B3, 0x5A0A, 0x8ABD, + 0x5A0B, 0x8ABE, 0x5A0C, 0xE6B2, 0x5A0D, 0x8ABF, 0x5A0E, 0x8AC0, + 0x5A0F, 0x8AC1, 0x5A10, 0x8AC2, 0x5A11, 0xE6B6, 0x5A12, 0x8AC3, + 0x5A13, 0xE6B8, 0x5A14, 0x8AC4, 0x5A15, 0x8AC5, 0x5A16, 0x8AC6, + 0x5A17, 0x8AC7, 0x5A18, 0xC4EF, 0x5A19, 0x8AC8, 0x5A1A, 0x8AC9, + 0x5A1B, 0x8ACA, 0x5A1C, 0xC4C8, 0x5A1D, 0x8ACB, 0x5A1E, 0x8ACC, + 0x5A1F, 0xBEEA, 0x5A20, 0xC9EF, 0x5A21, 0x8ACD, 0x5A22, 0x8ACE, + 0x5A23, 0xE6B7, 0x5A24, 0x8ACF, 0x5A25, 0xB6F0, 0x5A26, 0x8AD0, + 0x5A27, 0x8AD1, 0x5A28, 0x8AD2, 0x5A29, 0xC3E4, 0x5A2A, 0x8AD3, + 0x5A2B, 0x8AD4, 0x5A2C, 0x8AD5, 0x5A2D, 0x8AD6, 0x5A2E, 0x8AD7, + 0x5A2F, 0x8AD8, 0x5A30, 0x8AD9, 0x5A31, 0xD3E9, 0x5A32, 0xE6B4, + 0x5A33, 0x8ADA, 0x5A34, 0xE6B5, 0x5A35, 0x8ADB, 0x5A36, 0xC8A2, + 0x5A37, 0x8ADC, 0x5A38, 0x8ADD, 0x5A39, 0x8ADE, 0x5A3A, 0x8ADF, + 0x5A3B, 0x8AE0, 0x5A3C, 0xE6BD, 0x5A3D, 0x8AE1, 0x5A3E, 0x8AE2, + 0x5A3F, 0x8AE3, 0x5A40, 0xE6B9, 0x5A41, 0x8AE4, 0x5A42, 0x8AE5, + 0x5A43, 0x8AE6, 0x5A44, 0x8AE7, 0x5A45, 0x8AE8, 0x5A46, 0xC6C5, + 0x5A47, 0x8AE9, 0x5A48, 0x8AEA, 0x5A49, 0xCDF1, 0x5A4A, 0xE6BB, + 0x5A4B, 0x8AEB, 0x5A4C, 0x8AEC, 0x5A4D, 0x8AED, 0x5A4E, 0x8AEE, + 0x5A4F, 0x8AEF, 0x5A50, 0x8AF0, 0x5A51, 0x8AF1, 0x5A52, 0x8AF2, + 0x5A53, 0x8AF3, 0x5A54, 0x8AF4, 0x5A55, 0xE6BC, 0x5A56, 0x8AF5, + 0x5A57, 0x8AF6, 0x5A58, 0x8AF7, 0x5A59, 0x8AF8, 0x5A5A, 0xBBE9, + 0x5A5B, 0x8AF9, 0x5A5C, 0x8AFA, 0x5A5D, 0x8AFB, 0x5A5E, 0x8AFC, + 0x5A5F, 0x8AFD, 0x5A60, 0x8AFE, 0x5A61, 0x8B40, 0x5A62, 0xE6BE, + 0x5A63, 0x8B41, 0x5A64, 0x8B42, 0x5A65, 0x8B43, 0x5A66, 0x8B44, + 0x5A67, 0xE6BA, 0x5A68, 0x8B45, 0x5A69, 0x8B46, 0x5A6A, 0xC0B7, + 0x5A6B, 0x8B47, 0x5A6C, 0x8B48, 0x5A6D, 0x8B49, 0x5A6E, 0x8B4A, + 0x5A6F, 0x8B4B, 0x5A70, 0x8B4C, 0x5A71, 0x8B4D, 0x5A72, 0x8B4E, + 0x5A73, 0x8B4F, 0x5A74, 0xD3A4, 0x5A75, 0xE6BF, 0x5A76, 0xC9F4, + 0x5A77, 0xE6C3, 0x5A78, 0x8B50, 0x5A79, 0x8B51, 0x5A7A, 0xE6C4, + 0x5A7B, 0x8B52, 0x5A7C, 0x8B53, 0x5A7D, 0x8B54, 0x5A7E, 0x8B55, + 0x5A7F, 0xD0F6, 0x5A80, 0x8B56, 0x5A81, 0x8B57, 0x5A82, 0x8B58, + 0x5A83, 0x8B59, 0x5A84, 0x8B5A, 0x5A85, 0x8B5B, 0x5A86, 0x8B5C, + 0x5A87, 0x8B5D, 0x5A88, 0x8B5E, 0x5A89, 0x8B5F, 0x5A8A, 0x8B60, + 0x5A8B, 0x8B61, 0x5A8C, 0x8B62, 0x5A8D, 0x8B63, 0x5A8E, 0x8B64, + 0x5A8F, 0x8B65, 0x5A90, 0x8B66, 0x5A91, 0x8B67, 0x5A92, 0xC3BD, + 0x5A93, 0x8B68, 0x5A94, 0x8B69, 0x5A95, 0x8B6A, 0x5A96, 0x8B6B, + 0x5A97, 0x8B6C, 0x5A98, 0x8B6D, 0x5A99, 0x8B6E, 0x5A9A, 0xC3C4, + 0x5A9B, 0xE6C2, 0x5A9C, 0x8B6F, 0x5A9D, 0x8B70, 0x5A9E, 0x8B71, + 0x5A9F, 0x8B72, 0x5AA0, 0x8B73, 0x5AA1, 0x8B74, 0x5AA2, 0x8B75, + 0x5AA3, 0x8B76, 0x5AA4, 0x8B77, 0x5AA5, 0x8B78, 0x5AA6, 0x8B79, + 0x5AA7, 0x8B7A, 0x5AA8, 0x8B7B, 0x5AA9, 0x8B7C, 0x5AAA, 0xE6C1, + 0x5AAB, 0x8B7D, 0x5AAC, 0x8B7E, 0x5AAD, 0x8B80, 0x5AAE, 0x8B81, + 0x5AAF, 0x8B82, 0x5AB0, 0x8B83, 0x5AB1, 0x8B84, 0x5AB2, 0xE6C7, + 0x5AB3, 0xCFB1, 0x5AB4, 0x8B85, 0x5AB5, 0xEBF4, 0x5AB6, 0x8B86, + 0x5AB7, 0x8B87, 0x5AB8, 0xE6CA, 0x5AB9, 0x8B88, 0x5ABA, 0x8B89, + 0x5ABB, 0x8B8A, 0x5ABC, 0x8B8B, 0x5ABD, 0x8B8C, 0x5ABE, 0xE6C5, + 0x5ABF, 0x8B8D, 0x5AC0, 0x8B8E, 0x5AC1, 0xBCDE, 0x5AC2, 0xC9A9, + 0x5AC3, 0x8B8F, 0x5AC4, 0x8B90, 0x5AC5, 0x8B91, 0x5AC6, 0x8B92, + 0x5AC7, 0x8B93, 0x5AC8, 0x8B94, 0x5AC9, 0xBCB5, 0x5ACA, 0x8B95, + 0x5ACB, 0x8B96, 0x5ACC, 0xCFD3, 0x5ACD, 0x8B97, 0x5ACE, 0x8B98, + 0x5ACF, 0x8B99, 0x5AD0, 0x8B9A, 0x5AD1, 0x8B9B, 0x5AD2, 0xE6C8, + 0x5AD3, 0x8B9C, 0x5AD4, 0xE6C9, 0x5AD5, 0x8B9D, 0x5AD6, 0xE6CE, + 0x5AD7, 0x8B9E, 0x5AD8, 0xE6D0, 0x5AD9, 0x8B9F, 0x5ADA, 0x8BA0, + 0x5ADB, 0x8BA1, 0x5ADC, 0xE6D1, 0x5ADD, 0x8BA2, 0x5ADE, 0x8BA3, + 0x5ADF, 0x8BA4, 0x5AE0, 0xE6CB, 0x5AE1, 0xB5D5, 0x5AE2, 0x8BA5, + 0x5AE3, 0xE6CC, 0x5AE4, 0x8BA6, 0x5AE5, 0x8BA7, 0x5AE6, 0xE6CF, + 0x5AE7, 0x8BA8, 0x5AE8, 0x8BA9, 0x5AE9, 0xC4DB, 0x5AEA, 0x8BAA, + 0x5AEB, 0xE6C6, 0x5AEC, 0x8BAB, 0x5AED, 0x8BAC, 0x5AEE, 0x8BAD, + 0x5AEF, 0x8BAE, 0x5AF0, 0x8BAF, 0x5AF1, 0xE6CD, 0x5AF2, 0x8BB0, + 0x5AF3, 0x8BB1, 0x5AF4, 0x8BB2, 0x5AF5, 0x8BB3, 0x5AF6, 0x8BB4, + 0x5AF7, 0x8BB5, 0x5AF8, 0x8BB6, 0x5AF9, 0x8BB7, 0x5AFA, 0x8BB8, + 0x5AFB, 0x8BB9, 0x5AFC, 0x8BBA, 0x5AFD, 0x8BBB, 0x5AFE, 0x8BBC, + 0x5AFF, 0x8BBD, 0x5B00, 0x8BBE, 0x5B01, 0x8BBF, 0x5B02, 0x8BC0, + 0x5B03, 0x8BC1, 0x5B04, 0x8BC2, 0x5B05, 0x8BC3, 0x5B06, 0x8BC4, + 0x5B07, 0x8BC5, 0x5B08, 0x8BC6, 0x5B09, 0xE6D2, 0x5B0A, 0x8BC7, + 0x5B0B, 0x8BC8, 0x5B0C, 0x8BC9, 0x5B0D, 0x8BCA, 0x5B0E, 0x8BCB, + 0x5B0F, 0x8BCC, 0x5B10, 0x8BCD, 0x5B11, 0x8BCE, 0x5B12, 0x8BCF, + 0x5B13, 0x8BD0, 0x5B14, 0x8BD1, 0x5B15, 0x8BD2, 0x5B16, 0xE6D4, + 0x5B17, 0xE6D3, 0x5B18, 0x8BD3, 0x5B19, 0x8BD4, 0x5B1A, 0x8BD5, + 0x5B1B, 0x8BD6, 0x5B1C, 0x8BD7, 0x5B1D, 0x8BD8, 0x5B1E, 0x8BD9, + 0x5B1F, 0x8BDA, 0x5B20, 0x8BDB, 0x5B21, 0x8BDC, 0x5B22, 0x8BDD, + 0x5B23, 0x8BDE, 0x5B24, 0x8BDF, 0x5B25, 0x8BE0, 0x5B26, 0x8BE1, + 0x5B27, 0x8BE2, 0x5B28, 0x8BE3, 0x5B29, 0x8BE4, 0x5B2A, 0x8BE5, + 0x5B2B, 0x8BE6, 0x5B2C, 0x8BE7, 0x5B2D, 0x8BE8, 0x5B2E, 0x8BE9, + 0x5B2F, 0x8BEA, 0x5B30, 0x8BEB, 0x5B31, 0x8BEC, 0x5B32, 0xE6D5, + 0x5B33, 0x8BED, 0x5B34, 0xD9F8, 0x5B35, 0x8BEE, 0x5B36, 0x8BEF, + 0x5B37, 0xE6D6, 0x5B38, 0x8BF0, 0x5B39, 0x8BF1, 0x5B3A, 0x8BF2, + 0x5B3B, 0x8BF3, 0x5B3C, 0x8BF4, 0x5B3D, 0x8BF5, 0x5B3E, 0x8BF6, + 0x5B3F, 0x8BF7, 0x5B40, 0xE6D7, 0x5B41, 0x8BF8, 0x5B42, 0x8BF9, + 0x5B43, 0x8BFA, 0x5B44, 0x8BFB, 0x5B45, 0x8BFC, 0x5B46, 0x8BFD, + 0x5B47, 0x8BFE, 0x5B48, 0x8C40, 0x5B49, 0x8C41, 0x5B4A, 0x8C42, + 0x5B4B, 0x8C43, 0x5B4C, 0x8C44, 0x5B4D, 0x8C45, 0x5B4E, 0x8C46, + 0x5B4F, 0x8C47, 0x5B50, 0xD7D3, 0x5B51, 0xE6DD, 0x5B52, 0x8C48, + 0x5B53, 0xE6DE, 0x5B54, 0xBFD7, 0x5B55, 0xD4D0, 0x5B56, 0x8C49, + 0x5B57, 0xD7D6, 0x5B58, 0xB4E6, 0x5B59, 0xCBEF, 0x5B5A, 0xE6DA, + 0x5B5B, 0xD8C3, 0x5B5C, 0xD7CE, 0x5B5D, 0xD0A2, 0x5B5E, 0x8C4A, + 0x5B5F, 0xC3CF, 0x5B60, 0x8C4B, 0x5B61, 0x8C4C, 0x5B62, 0xE6DF, + 0x5B63, 0xBCBE, 0x5B64, 0xB9C2, 0x5B65, 0xE6DB, 0x5B66, 0xD1A7, + 0x5B67, 0x8C4D, 0x5B68, 0x8C4E, 0x5B69, 0xBAA2, 0x5B6A, 0xC2CF, + 0x5B6B, 0x8C4F, 0x5B6C, 0xD8AB, 0x5B6D, 0x8C50, 0x5B6E, 0x8C51, + 0x5B6F, 0x8C52, 0x5B70, 0xCAEB, 0x5B71, 0xE5EE, 0x5B72, 0x8C53, + 0x5B73, 0xE6DC, 0x5B74, 0x8C54, 0x5B75, 0xB7F5, 0x5B76, 0x8C55, + 0x5B77, 0x8C56, 0x5B78, 0x8C57, 0x5B79, 0x8C58, 0x5B7A, 0xC8E6, + 0x5B7B, 0x8C59, 0x5B7C, 0x8C5A, 0x5B7D, 0xC4F5, 0x5B7E, 0x8C5B, + 0x5B7F, 0x8C5C, 0x5B80, 0xE5B2, 0x5B81, 0xC4FE, 0x5B82, 0x8C5D, + 0x5B83, 0xCBFC, 0x5B84, 0xE5B3, 0x5B85, 0xD5AC, 0x5B86, 0x8C5E, + 0x5B87, 0xD3EE, 0x5B88, 0xCAD8, 0x5B89, 0xB0B2, 0x5B8A, 0x8C5F, + 0x5B8B, 0xCBCE, 0x5B8C, 0xCDEA, 0x5B8D, 0x8C60, 0x5B8E, 0x8C61, + 0x5B8F, 0xBAEA, 0x5B90, 0x8C62, 0x5B91, 0x8C63, 0x5B92, 0x8C64, + 0x5B93, 0xE5B5, 0x5B94, 0x8C65, 0x5B95, 0xE5B4, 0x5B96, 0x8C66, + 0x5B97, 0xD7DA, 0x5B98, 0xB9D9, 0x5B99, 0xD6E6, 0x5B9A, 0xB6A8, + 0x5B9B, 0xCDF0, 0x5B9C, 0xD2CB, 0x5B9D, 0xB1A6, 0x5B9E, 0xCAB5, + 0x5B9F, 0x8C67, 0x5BA0, 0xB3E8, 0x5BA1, 0xC9F3, 0x5BA2, 0xBFCD, + 0x5BA3, 0xD0FB, 0x5BA4, 0xCAD2, 0x5BA5, 0xE5B6, 0x5BA6, 0xBBC2, + 0x5BA7, 0x8C68, 0x5BA8, 0x8C69, 0x5BA9, 0x8C6A, 0x5BAA, 0xCFDC, + 0x5BAB, 0xB9AC, 0x5BAC, 0x8C6B, 0x5BAD, 0x8C6C, 0x5BAE, 0x8C6D, + 0x5BAF, 0x8C6E, 0x5BB0, 0xD4D7, 0x5BB1, 0x8C6F, 0x5BB2, 0x8C70, + 0x5BB3, 0xBAA6, 0x5BB4, 0xD1E7, 0x5BB5, 0xCFFC, 0x5BB6, 0xBCD2, + 0x5BB7, 0x8C71, 0x5BB8, 0xE5B7, 0x5BB9, 0xC8DD, 0x5BBA, 0x8C72, + 0x5BBB, 0x8C73, 0x5BBC, 0x8C74, 0x5BBD, 0xBFED, 0x5BBE, 0xB1F6, + 0x5BBF, 0xCBDE, 0x5BC0, 0x8C75, 0x5BC1, 0x8C76, 0x5BC2, 0xBCC5, + 0x5BC3, 0x8C77, 0x5BC4, 0xBCC4, 0x5BC5, 0xD2FA, 0x5BC6, 0xC3DC, + 0x5BC7, 0xBFDC, 0x5BC8, 0x8C78, 0x5BC9, 0x8C79, 0x5BCA, 0x8C7A, + 0x5BCB, 0x8C7B, 0x5BCC, 0xB8BB, 0x5BCD, 0x8C7C, 0x5BCE, 0x8C7D, + 0x5BCF, 0x8C7E, 0x5BD0, 0xC3C2, 0x5BD1, 0x8C80, 0x5BD2, 0xBAAE, + 0x5BD3, 0xD4A2, 0x5BD4, 0x8C81, 0x5BD5, 0x8C82, 0x5BD6, 0x8C83, + 0x5BD7, 0x8C84, 0x5BD8, 0x8C85, 0x5BD9, 0x8C86, 0x5BDA, 0x8C87, + 0x5BDB, 0x8C88, 0x5BDC, 0x8C89, 0x5BDD, 0xC7DE, 0x5BDE, 0xC4AF, + 0x5BDF, 0xB2EC, 0x5BE0, 0x8C8A, 0x5BE1, 0xB9D1, 0x5BE2, 0x8C8B, + 0x5BE3, 0x8C8C, 0x5BE4, 0xE5BB, 0x5BE5, 0xC1C8, 0x5BE6, 0x8C8D, + 0x5BE7, 0x8C8E, 0x5BE8, 0xD5AF, 0x5BE9, 0x8C8F, 0x5BEA, 0x8C90, + 0x5BEB, 0x8C91, 0x5BEC, 0x8C92, 0x5BED, 0x8C93, 0x5BEE, 0xE5BC, + 0x5BEF, 0x8C94, 0x5BF0, 0xE5BE, 0x5BF1, 0x8C95, 0x5BF2, 0x8C96, + 0x5BF3, 0x8C97, 0x5BF4, 0x8C98, 0x5BF5, 0x8C99, 0x5BF6, 0x8C9A, + 0x5BF7, 0x8C9B, 0x5BF8, 0xB4E7, 0x5BF9, 0xB6D4, 0x5BFA, 0xCBC2, + 0x5BFB, 0xD1B0, 0x5BFC, 0xB5BC, 0x5BFD, 0x8C9C, 0x5BFE, 0x8C9D, + 0x5BFF, 0xCAD9, 0x5C00, 0x8C9E, 0x5C01, 0xB7E2, 0x5C02, 0x8C9F, + 0x5C03, 0x8CA0, 0x5C04, 0xC9E4, 0x5C05, 0x8CA1, 0x5C06, 0xBDAB, + 0x5C07, 0x8CA2, 0x5C08, 0x8CA3, 0x5C09, 0xCEBE, 0x5C0A, 0xD7F0, + 0x5C0B, 0x8CA4, 0x5C0C, 0x8CA5, 0x5C0D, 0x8CA6, 0x5C0E, 0x8CA7, + 0x5C0F, 0xD0A1, 0x5C10, 0x8CA8, 0x5C11, 0xC9D9, 0x5C12, 0x8CA9, + 0x5C13, 0x8CAA, 0x5C14, 0xB6FB, 0x5C15, 0xE6D8, 0x5C16, 0xBCE2, + 0x5C17, 0x8CAB, 0x5C18, 0xB3BE, 0x5C19, 0x8CAC, 0x5C1A, 0xC9D0, + 0x5C1B, 0x8CAD, 0x5C1C, 0xE6D9, 0x5C1D, 0xB3A2, 0x5C1E, 0x8CAE, + 0x5C1F, 0x8CAF, 0x5C20, 0x8CB0, 0x5C21, 0x8CB1, 0x5C22, 0xDECC, + 0x5C23, 0x8CB2, 0x5C24, 0xD3C8, 0x5C25, 0xDECD, 0x5C26, 0x8CB3, + 0x5C27, 0xD2A2, 0x5C28, 0x8CB4, 0x5C29, 0x8CB5, 0x5C2A, 0x8CB6, + 0x5C2B, 0x8CB7, 0x5C2C, 0xDECE, 0x5C2D, 0x8CB8, 0x5C2E, 0x8CB9, + 0x5C2F, 0x8CBA, 0x5C30, 0x8CBB, 0x5C31, 0xBECD, 0x5C32, 0x8CBC, + 0x5C33, 0x8CBD, 0x5C34, 0xDECF, 0x5C35, 0x8CBE, 0x5C36, 0x8CBF, + 0x5C37, 0x8CC0, 0x5C38, 0xCAAC, 0x5C39, 0xD2FC, 0x5C3A, 0xB3DF, + 0x5C3B, 0xE5EA, 0x5C3C, 0xC4E1, 0x5C3D, 0xBEA1, 0x5C3E, 0xCEB2, + 0x5C3F, 0xC4F2, 0x5C40, 0xBED6, 0x5C41, 0xC6A8, 0x5C42, 0xB2E3, + 0x5C43, 0x8CC1, 0x5C44, 0x8CC2, 0x5C45, 0xBED3, 0x5C46, 0x8CC3, + 0x5C47, 0x8CC4, 0x5C48, 0xC7FC, 0x5C49, 0xCCEB, 0x5C4A, 0xBDEC, + 0x5C4B, 0xCEDD, 0x5C4C, 0x8CC5, 0x5C4D, 0x8CC6, 0x5C4E, 0xCABA, + 0x5C4F, 0xC6C1, 0x5C50, 0xE5EC, 0x5C51, 0xD0BC, 0x5C52, 0x8CC7, + 0x5C53, 0x8CC8, 0x5C54, 0x8CC9, 0x5C55, 0xD5B9, 0x5C56, 0x8CCA, + 0x5C57, 0x8CCB, 0x5C58, 0x8CCC, 0x5C59, 0xE5ED, 0x5C5A, 0x8CCD, + 0x5C5B, 0x8CCE, 0x5C5C, 0x8CCF, 0x5C5D, 0x8CD0, 0x5C5E, 0xCAF4, + 0x5C5F, 0x8CD1, 0x5C60, 0xCDC0, 0x5C61, 0xC2C5, 0x5C62, 0x8CD2, + 0x5C63, 0xE5EF, 0x5C64, 0x8CD3, 0x5C65, 0xC2C4, 0x5C66, 0xE5F0, + 0x5C67, 0x8CD4, 0x5C68, 0x8CD5, 0x5C69, 0x8CD6, 0x5C6A, 0x8CD7, + 0x5C6B, 0x8CD8, 0x5C6C, 0x8CD9, 0x5C6D, 0x8CDA, 0x5C6E, 0xE5F8, + 0x5C6F, 0xCDCD, 0x5C70, 0x8CDB, 0x5C71, 0xC9BD, 0x5C72, 0x8CDC, + 0x5C73, 0x8CDD, 0x5C74, 0x8CDE, 0x5C75, 0x8CDF, 0x5C76, 0x8CE0, + 0x5C77, 0x8CE1, 0x5C78, 0x8CE2, 0x5C79, 0xD2D9, 0x5C7A, 0xE1A8, + 0x5C7B, 0x8CE3, 0x5C7C, 0x8CE4, 0x5C7D, 0x8CE5, 0x5C7E, 0x8CE6, + 0x5C7F, 0xD3EC, 0x5C80, 0x8CE7, 0x5C81, 0xCBEA, 0x5C82, 0xC6F1, + 0x5C83, 0x8CE8, 0x5C84, 0x8CE9, 0x5C85, 0x8CEA, 0x5C86, 0x8CEB, + 0x5C87, 0x8CEC, 0x5C88, 0xE1AC, 0x5C89, 0x8CED, 0x5C8A, 0x8CEE, + 0x5C8B, 0x8CEF, 0x5C8C, 0xE1A7, 0x5C8D, 0xE1A9, 0x5C8E, 0x8CF0, + 0x5C8F, 0x8CF1, 0x5C90, 0xE1AA, 0x5C91, 0xE1AF, 0x5C92, 0x8CF2, + 0x5C93, 0x8CF3, 0x5C94, 0xB2ED, 0x5C95, 0x8CF4, 0x5C96, 0xE1AB, + 0x5C97, 0xB8DA, 0x5C98, 0xE1AD, 0x5C99, 0xE1AE, 0x5C9A, 0xE1B0, + 0x5C9B, 0xB5BA, 0x5C9C, 0xE1B1, 0x5C9D, 0x8CF5, 0x5C9E, 0x8CF6, + 0x5C9F, 0x8CF7, 0x5CA0, 0x8CF8, 0x5CA1, 0x8CF9, 0x5CA2, 0xE1B3, + 0x5CA3, 0xE1B8, 0x5CA4, 0x8CFA, 0x5CA5, 0x8CFB, 0x5CA6, 0x8CFC, + 0x5CA7, 0x8CFD, 0x5CA8, 0x8CFE, 0x5CA9, 0xD1D2, 0x5CAA, 0x8D40, + 0x5CAB, 0xE1B6, 0x5CAC, 0xE1B5, 0x5CAD, 0xC1EB, 0x5CAE, 0x8D41, + 0x5CAF, 0x8D42, 0x5CB0, 0x8D43, 0x5CB1, 0xE1B7, 0x5CB2, 0x8D44, + 0x5CB3, 0xD4C0, 0x5CB4, 0x8D45, 0x5CB5, 0xE1B2, 0x5CB6, 0x8D46, + 0x5CB7, 0xE1BA, 0x5CB8, 0xB0B6, 0x5CB9, 0x8D47, 0x5CBA, 0x8D48, + 0x5CBB, 0x8D49, 0x5CBC, 0x8D4A, 0x5CBD, 0xE1B4, 0x5CBE, 0x8D4B, + 0x5CBF, 0xBFF9, 0x5CC0, 0x8D4C, 0x5CC1, 0xE1B9, 0x5CC2, 0x8D4D, + 0x5CC3, 0x8D4E, 0x5CC4, 0xE1BB, 0x5CC5, 0x8D4F, 0x5CC6, 0x8D50, + 0x5CC7, 0x8D51, 0x5CC8, 0x8D52, 0x5CC9, 0x8D53, 0x5CCA, 0x8D54, + 0x5CCB, 0xE1BE, 0x5CCC, 0x8D55, 0x5CCD, 0x8D56, 0x5CCE, 0x8D57, + 0x5CCF, 0x8D58, 0x5CD0, 0x8D59, 0x5CD1, 0x8D5A, 0x5CD2, 0xE1BC, + 0x5CD3, 0x8D5B, 0x5CD4, 0x8D5C, 0x5CD5, 0x8D5D, 0x5CD6, 0x8D5E, + 0x5CD7, 0x8D5F, 0x5CD8, 0x8D60, 0x5CD9, 0xD6C5, 0x5CDA, 0x8D61, + 0x5CDB, 0x8D62, 0x5CDC, 0x8D63, 0x5CDD, 0x8D64, 0x5CDE, 0x8D65, + 0x5CDF, 0x8D66, 0x5CE0, 0x8D67, 0x5CE1, 0xCFBF, 0x5CE2, 0x8D68, + 0x5CE3, 0x8D69, 0x5CE4, 0xE1BD, 0x5CE5, 0xE1BF, 0x5CE6, 0xC2CD, + 0x5CE7, 0x8D6A, 0x5CE8, 0xB6EB, 0x5CE9, 0x8D6B, 0x5CEA, 0xD3F8, + 0x5CEB, 0x8D6C, 0x5CEC, 0x8D6D, 0x5CED, 0xC7CD, 0x5CEE, 0x8D6E, + 0x5CEF, 0x8D6F, 0x5CF0, 0xB7E5, 0x5CF1, 0x8D70, 0x5CF2, 0x8D71, + 0x5CF3, 0x8D72, 0x5CF4, 0x8D73, 0x5CF5, 0x8D74, 0x5CF6, 0x8D75, + 0x5CF7, 0x8D76, 0x5CF8, 0x8D77, 0x5CF9, 0x8D78, 0x5CFA, 0x8D79, + 0x5CFB, 0xBEFE, 0x5CFC, 0x8D7A, 0x5CFD, 0x8D7B, 0x5CFE, 0x8D7C, + 0x5CFF, 0x8D7D, 0x5D00, 0x8D7E, 0x5D01, 0x8D80, 0x5D02, 0xE1C0, + 0x5D03, 0xE1C1, 0x5D04, 0x8D81, 0x5D05, 0x8D82, 0x5D06, 0xE1C7, + 0x5D07, 0xB3E7, 0x5D08, 0x8D83, 0x5D09, 0x8D84, 0x5D0A, 0x8D85, + 0x5D0B, 0x8D86, 0x5D0C, 0x8D87, 0x5D0D, 0x8D88, 0x5D0E, 0xC6E9, + 0x5D0F, 0x8D89, 0x5D10, 0x8D8A, 0x5D11, 0x8D8B, 0x5D12, 0x8D8C, + 0x5D13, 0x8D8D, 0x5D14, 0xB4DE, 0x5D15, 0x8D8E, 0x5D16, 0xD1C2, + 0x5D17, 0x8D8F, 0x5D18, 0x8D90, 0x5D19, 0x8D91, 0x5D1A, 0x8D92, + 0x5D1B, 0xE1C8, 0x5D1C, 0x8D93, 0x5D1D, 0x8D94, 0x5D1E, 0xE1C6, + 0x5D1F, 0x8D95, 0x5D20, 0x8D96, 0x5D21, 0x8D97, 0x5D22, 0x8D98, + 0x5D23, 0x8D99, 0x5D24, 0xE1C5, 0x5D25, 0x8D9A, 0x5D26, 0xE1C3, + 0x5D27, 0xE1C2, 0x5D28, 0x8D9B, 0x5D29, 0xB1C0, 0x5D2A, 0x8D9C, + 0x5D2B, 0x8D9D, 0x5D2C, 0x8D9E, 0x5D2D, 0xD5B8, 0x5D2E, 0xE1C4, + 0x5D2F, 0x8D9F, 0x5D30, 0x8DA0, 0x5D31, 0x8DA1, 0x5D32, 0x8DA2, + 0x5D33, 0x8DA3, 0x5D34, 0xE1CB, 0x5D35, 0x8DA4, 0x5D36, 0x8DA5, + 0x5D37, 0x8DA6, 0x5D38, 0x8DA7, 0x5D39, 0x8DA8, 0x5D3A, 0x8DA9, + 0x5D3B, 0x8DAA, 0x5D3C, 0x8DAB, 0x5D3D, 0xE1CC, 0x5D3E, 0xE1CA, + 0x5D3F, 0x8DAC, 0x5D40, 0x8DAD, 0x5D41, 0x8DAE, 0x5D42, 0x8DAF, + 0x5D43, 0x8DB0, 0x5D44, 0x8DB1, 0x5D45, 0x8DB2, 0x5D46, 0x8DB3, + 0x5D47, 0xEFFA, 0x5D48, 0x8DB4, 0x5D49, 0x8DB5, 0x5D4A, 0xE1D3, + 0x5D4B, 0xE1D2, 0x5D4C, 0xC7B6, 0x5D4D, 0x8DB6, 0x5D4E, 0x8DB7, + 0x5D4F, 0x8DB8, 0x5D50, 0x8DB9, 0x5D51, 0x8DBA, 0x5D52, 0x8DBB, + 0x5D53, 0x8DBC, 0x5D54, 0x8DBD, 0x5D55, 0x8DBE, 0x5D56, 0x8DBF, + 0x5D57, 0x8DC0, 0x5D58, 0xE1C9, 0x5D59, 0x8DC1, 0x5D5A, 0x8DC2, + 0x5D5B, 0xE1CE, 0x5D5C, 0x8DC3, 0x5D5D, 0xE1D0, 0x5D5E, 0x8DC4, + 0x5D5F, 0x8DC5, 0x5D60, 0x8DC6, 0x5D61, 0x8DC7, 0x5D62, 0x8DC8, + 0x5D63, 0x8DC9, 0x5D64, 0x8DCA, 0x5D65, 0x8DCB, 0x5D66, 0x8DCC, + 0x5D67, 0x8DCD, 0x5D68, 0x8DCE, 0x5D69, 0xE1D4, 0x5D6A, 0x8DCF, + 0x5D6B, 0xE1D1, 0x5D6C, 0xE1CD, 0x5D6D, 0x8DD0, 0x5D6E, 0x8DD1, + 0x5D6F, 0xE1CF, 0x5D70, 0x8DD2, 0x5D71, 0x8DD3, 0x5D72, 0x8DD4, + 0x5D73, 0x8DD5, 0x5D74, 0xE1D5, 0x5D75, 0x8DD6, 0x5D76, 0x8DD7, + 0x5D77, 0x8DD8, 0x5D78, 0x8DD9, 0x5D79, 0x8DDA, 0x5D7A, 0x8DDB, + 0x5D7B, 0x8DDC, 0x5D7C, 0x8DDD, 0x5D7D, 0x8DDE, 0x5D7E, 0x8DDF, + 0x5D7F, 0x8DE0, 0x5D80, 0x8DE1, 0x5D81, 0x8DE2, 0x5D82, 0xE1D6, + 0x5D83, 0x8DE3, 0x5D84, 0x8DE4, 0x5D85, 0x8DE5, 0x5D86, 0x8DE6, + 0x5D87, 0x8DE7, 0x5D88, 0x8DE8, 0x5D89, 0x8DE9, 0x5D8A, 0x8DEA, + 0x5D8B, 0x8DEB, 0x5D8C, 0x8DEC, 0x5D8D, 0x8DED, 0x5D8E, 0x8DEE, + 0x5D8F, 0x8DEF, 0x5D90, 0x8DF0, 0x5D91, 0x8DF1, 0x5D92, 0x8DF2, + 0x5D93, 0x8DF3, 0x5D94, 0x8DF4, 0x5D95, 0x8DF5, 0x5D96, 0x8DF6, + 0x5D97, 0x8DF7, 0x5D98, 0x8DF8, 0x5D99, 0xE1D7, 0x5D9A, 0x8DF9, + 0x5D9B, 0x8DFA, 0x5D9C, 0x8DFB, 0x5D9D, 0xE1D8, 0x5D9E, 0x8DFC, + 0x5D9F, 0x8DFD, 0x5DA0, 0x8DFE, 0x5DA1, 0x8E40, 0x5DA2, 0x8E41, + 0x5DA3, 0x8E42, 0x5DA4, 0x8E43, 0x5DA5, 0x8E44, 0x5DA6, 0x8E45, + 0x5DA7, 0x8E46, 0x5DA8, 0x8E47, 0x5DA9, 0x8E48, 0x5DAA, 0x8E49, + 0x5DAB, 0x8E4A, 0x5DAC, 0x8E4B, 0x5DAD, 0x8E4C, 0x5DAE, 0x8E4D, + 0x5DAF, 0x8E4E, 0x5DB0, 0x8E4F, 0x5DB1, 0x8E50, 0x5DB2, 0x8E51, + 0x5DB3, 0x8E52, 0x5DB4, 0x8E53, 0x5DB5, 0x8E54, 0x5DB6, 0x8E55, + 0x5DB7, 0xE1DA, 0x5DB8, 0x8E56, 0x5DB9, 0x8E57, 0x5DBA, 0x8E58, + 0x5DBB, 0x8E59, 0x5DBC, 0x8E5A, 0x5DBD, 0x8E5B, 0x5DBE, 0x8E5C, + 0x5DBF, 0x8E5D, 0x5DC0, 0x8E5E, 0x5DC1, 0x8E5F, 0x5DC2, 0x8E60, + 0x5DC3, 0x8E61, 0x5DC4, 0x8E62, 0x5DC5, 0xE1DB, 0x5DC6, 0x8E63, + 0x5DC7, 0x8E64, 0x5DC8, 0x8E65, 0x5DC9, 0x8E66, 0x5DCA, 0x8E67, + 0x5DCB, 0x8E68, 0x5DCC, 0x8E69, 0x5DCD, 0xCEA1, 0x5DCE, 0x8E6A, + 0x5DCF, 0x8E6B, 0x5DD0, 0x8E6C, 0x5DD1, 0x8E6D, 0x5DD2, 0x8E6E, + 0x5DD3, 0x8E6F, 0x5DD4, 0x8E70, 0x5DD5, 0x8E71, 0x5DD6, 0x8E72, + 0x5DD7, 0x8E73, 0x5DD8, 0x8E74, 0x5DD9, 0x8E75, 0x5DDA, 0x8E76, + 0x5DDB, 0xE7DD, 0x5DDC, 0x8E77, 0x5DDD, 0xB4A8, 0x5DDE, 0xD6DD, + 0x5DDF, 0x8E78, 0x5DE0, 0x8E79, 0x5DE1, 0xD1B2, 0x5DE2, 0xB3B2, + 0x5DE3, 0x8E7A, 0x5DE4, 0x8E7B, 0x5DE5, 0xB9A4, 0x5DE6, 0xD7F3, + 0x5DE7, 0xC7C9, 0x5DE8, 0xBEDE, 0x5DE9, 0xB9AE, 0x5DEA, 0x8E7C, + 0x5DEB, 0xCED7, 0x5DEC, 0x8E7D, 0x5DED, 0x8E7E, 0x5DEE, 0xB2EE, + 0x5DEF, 0xDBCF, 0x5DF0, 0x8E80, 0x5DF1, 0xBCBA, 0x5DF2, 0xD2D1, + 0x5DF3, 0xCBC8, 0x5DF4, 0xB0CD, 0x5DF5, 0x8E81, 0x5DF6, 0x8E82, + 0x5DF7, 0xCFEF, 0x5DF8, 0x8E83, 0x5DF9, 0x8E84, 0x5DFA, 0x8E85, + 0x5DFB, 0x8E86, 0x5DFC, 0x8E87, 0x5DFD, 0xD9E3, 0x5DFE, 0xBDED, + 0x5DFF, 0x8E88, 0x5E00, 0x8E89, 0x5E01, 0xB1D2, 0x5E02, 0xCAD0, + 0x5E03, 0xB2BC, 0x5E04, 0x8E8A, 0x5E05, 0xCBA7, 0x5E06, 0xB7AB, + 0x5E07, 0x8E8B, 0x5E08, 0xCAA6, 0x5E09, 0x8E8C, 0x5E0A, 0x8E8D, + 0x5E0B, 0x8E8E, 0x5E0C, 0xCFA3, 0x5E0D, 0x8E8F, 0x5E0E, 0x8E90, + 0x5E0F, 0xE0F8, 0x5E10, 0xD5CA, 0x5E11, 0xE0FB, 0x5E12, 0x8E91, + 0x5E13, 0x8E92, 0x5E14, 0xE0FA, 0x5E15, 0xC5C1, 0x5E16, 0xCCFB, + 0x5E17, 0x8E93, 0x5E18, 0xC1B1, 0x5E19, 0xE0F9, 0x5E1A, 0xD6E3, + 0x5E1B, 0xB2AF, 0x5E1C, 0xD6C4, 0x5E1D, 0xB5DB, 0x5E1E, 0x8E94, + 0x5E1F, 0x8E95, 0x5E20, 0x8E96, 0x5E21, 0x8E97, 0x5E22, 0x8E98, + 0x5E23, 0x8E99, 0x5E24, 0x8E9A, 0x5E25, 0x8E9B, 0x5E26, 0xB4F8, + 0x5E27, 0xD6A1, 0x5E28, 0x8E9C, 0x5E29, 0x8E9D, 0x5E2A, 0x8E9E, + 0x5E2B, 0x8E9F, 0x5E2C, 0x8EA0, 0x5E2D, 0xCFAF, 0x5E2E, 0xB0EF, + 0x5E2F, 0x8EA1, 0x5E30, 0x8EA2, 0x5E31, 0xE0FC, 0x5E32, 0x8EA3, + 0x5E33, 0x8EA4, 0x5E34, 0x8EA5, 0x5E35, 0x8EA6, 0x5E36, 0x8EA7, + 0x5E37, 0xE1A1, 0x5E38, 0xB3A3, 0x5E39, 0x8EA8, 0x5E3A, 0x8EA9, + 0x5E3B, 0xE0FD, 0x5E3C, 0xE0FE, 0x5E3D, 0xC3B1, 0x5E3E, 0x8EAA, + 0x5E3F, 0x8EAB, 0x5E40, 0x8EAC, 0x5E41, 0x8EAD, 0x5E42, 0xC3DD, + 0x5E43, 0x8EAE, 0x5E44, 0xE1A2, 0x5E45, 0xB7F9, 0x5E46, 0x8EAF, + 0x5E47, 0x8EB0, 0x5E48, 0x8EB1, 0x5E49, 0x8EB2, 0x5E4A, 0x8EB3, + 0x5E4B, 0x8EB4, 0x5E4C, 0xBBCF, 0x5E4D, 0x8EB5, 0x5E4E, 0x8EB6, + 0x5E4F, 0x8EB7, 0x5E50, 0x8EB8, 0x5E51, 0x8EB9, 0x5E52, 0x8EBA, + 0x5E53, 0x8EBB, 0x5E54, 0xE1A3, 0x5E55, 0xC4BB, 0x5E56, 0x8EBC, + 0x5E57, 0x8EBD, 0x5E58, 0x8EBE, 0x5E59, 0x8EBF, 0x5E5A, 0x8EC0, + 0x5E5B, 0xE1A4, 0x5E5C, 0x8EC1, 0x5E5D, 0x8EC2, 0x5E5E, 0xE1A5, + 0x5E5F, 0x8EC3, 0x5E60, 0x8EC4, 0x5E61, 0xE1A6, 0x5E62, 0xB4B1, + 0x5E63, 0x8EC5, 0x5E64, 0x8EC6, 0x5E65, 0x8EC7, 0x5E66, 0x8EC8, + 0x5E67, 0x8EC9, 0x5E68, 0x8ECA, 0x5E69, 0x8ECB, 0x5E6A, 0x8ECC, + 0x5E6B, 0x8ECD, 0x5E6C, 0x8ECE, 0x5E6D, 0x8ECF, 0x5E6E, 0x8ED0, + 0x5E6F, 0x8ED1, 0x5E70, 0x8ED2, 0x5E71, 0x8ED3, 0x5E72, 0xB8C9, + 0x5E73, 0xC6BD, 0x5E74, 0xC4EA, 0x5E75, 0x8ED4, 0x5E76, 0xB2A2, + 0x5E77, 0x8ED5, 0x5E78, 0xD0D2, 0x5E79, 0x8ED6, 0x5E7A, 0xE7DB, + 0x5E7B, 0xBBC3, 0x5E7C, 0xD3D7, 0x5E7D, 0xD3C4, 0x5E7E, 0x8ED7, + 0x5E7F, 0xB9E3, 0x5E80, 0xE2CF, 0x5E81, 0x8ED8, 0x5E82, 0x8ED9, + 0x5E83, 0x8EDA, 0x5E84, 0xD7AF, 0x5E85, 0x8EDB, 0x5E86, 0xC7EC, + 0x5E87, 0xB1D3, 0x5E88, 0x8EDC, 0x5E89, 0x8EDD, 0x5E8A, 0xB4B2, + 0x5E8B, 0xE2D1, 0x5E8C, 0x8EDE, 0x5E8D, 0x8EDF, 0x5E8E, 0x8EE0, + 0x5E8F, 0xD0F2, 0x5E90, 0xC2AE, 0x5E91, 0xE2D0, 0x5E92, 0x8EE1, + 0x5E93, 0xBFE2, 0x5E94, 0xD3A6, 0x5E95, 0xB5D7, 0x5E96, 0xE2D2, + 0x5E97, 0xB5EA, 0x5E98, 0x8EE2, 0x5E99, 0xC3ED, 0x5E9A, 0xB8FD, + 0x5E9B, 0x8EE3, 0x5E9C, 0xB8AE, 0x5E9D, 0x8EE4, 0x5E9E, 0xC5D3, + 0x5E9F, 0xB7CF, 0x5EA0, 0xE2D4, 0x5EA1, 0x8EE5, 0x5EA2, 0x8EE6, + 0x5EA3, 0x8EE7, 0x5EA4, 0x8EE8, 0x5EA5, 0xE2D3, 0x5EA6, 0xB6C8, + 0x5EA7, 0xD7F9, 0x5EA8, 0x8EE9, 0x5EA9, 0x8EEA, 0x5EAA, 0x8EEB, + 0x5EAB, 0x8EEC, 0x5EAC, 0x8EED, 0x5EAD, 0xCDA5, 0x5EAE, 0x8EEE, + 0x5EAF, 0x8EEF, 0x5EB0, 0x8EF0, 0x5EB1, 0x8EF1, 0x5EB2, 0x8EF2, + 0x5EB3, 0xE2D8, 0x5EB4, 0x8EF3, 0x5EB5, 0xE2D6, 0x5EB6, 0xCAFC, + 0x5EB7, 0xBFB5, 0x5EB8, 0xD3B9, 0x5EB9, 0xE2D5, 0x5EBA, 0x8EF4, + 0x5EBB, 0x8EF5, 0x5EBC, 0x8EF6, 0x5EBD, 0x8EF7, 0x5EBE, 0xE2D7, + 0x5EBF, 0x8EF8, 0x5EC0, 0x8EF9, 0x5EC1, 0x8EFA, 0x5EC2, 0x8EFB, + 0x5EC3, 0x8EFC, 0x5EC4, 0x8EFD, 0x5EC5, 0x8EFE, 0x5EC6, 0x8F40, + 0x5EC7, 0x8F41, 0x5EC8, 0x8F42, 0x5EC9, 0xC1AE, 0x5ECA, 0xC0C8, + 0x5ECB, 0x8F43, 0x5ECC, 0x8F44, 0x5ECD, 0x8F45, 0x5ECE, 0x8F46, + 0x5ECF, 0x8F47, 0x5ED0, 0x8F48, 0x5ED1, 0xE2DB, 0x5ED2, 0xE2DA, + 0x5ED3, 0xC0AA, 0x5ED4, 0x8F49, 0x5ED5, 0x8F4A, 0x5ED6, 0xC1CE, + 0x5ED7, 0x8F4B, 0x5ED8, 0x8F4C, 0x5ED9, 0x8F4D, 0x5EDA, 0x8F4E, + 0x5EDB, 0xE2DC, 0x5EDC, 0x8F4F, 0x5EDD, 0x8F50, 0x5EDE, 0x8F51, + 0x5EDF, 0x8F52, 0x5EE0, 0x8F53, 0x5EE1, 0x8F54, 0x5EE2, 0x8F55, + 0x5EE3, 0x8F56, 0x5EE4, 0x8F57, 0x5EE5, 0x8F58, 0x5EE6, 0x8F59, + 0x5EE7, 0x8F5A, 0x5EE8, 0xE2DD, 0x5EE9, 0x8F5B, 0x5EEA, 0xE2DE, + 0x5EEB, 0x8F5C, 0x5EEC, 0x8F5D, 0x5EED, 0x8F5E, 0x5EEE, 0x8F5F, + 0x5EEF, 0x8F60, 0x5EF0, 0x8F61, 0x5EF1, 0x8F62, 0x5EF2, 0x8F63, + 0x5EF3, 0x8F64, 0x5EF4, 0xDBC8, 0x5EF5, 0x8F65, 0x5EF6, 0xD1D3, + 0x5EF7, 0xCDA2, 0x5EF8, 0x8F66, 0x5EF9, 0x8F67, 0x5EFA, 0xBDA8, + 0x5EFB, 0x8F68, 0x5EFC, 0x8F69, 0x5EFD, 0x8F6A, 0x5EFE, 0xDEC3, + 0x5EFF, 0xD8A5, 0x5F00, 0xBFAA, 0x5F01, 0xDBCD, 0x5F02, 0xD2EC, + 0x5F03, 0xC6FA, 0x5F04, 0xC5AA, 0x5F05, 0x8F6B, 0x5F06, 0x8F6C, + 0x5F07, 0x8F6D, 0x5F08, 0xDEC4, 0x5F09, 0x8F6E, 0x5F0A, 0xB1D7, + 0x5F0B, 0xDFAE, 0x5F0C, 0x8F6F, 0x5F0D, 0x8F70, 0x5F0E, 0x8F71, + 0x5F0F, 0xCABD, 0x5F10, 0x8F72, 0x5F11, 0xDFB1, 0x5F12, 0x8F73, + 0x5F13, 0xB9AD, 0x5F14, 0x8F74, 0x5F15, 0xD2FD, 0x5F16, 0x8F75, + 0x5F17, 0xB8A5, 0x5F18, 0xBAEB, 0x5F19, 0x8F76, 0x5F1A, 0x8F77, + 0x5F1B, 0xB3DA, 0x5F1C, 0x8F78, 0x5F1D, 0x8F79, 0x5F1E, 0x8F7A, + 0x5F1F, 0xB5DC, 0x5F20, 0xD5C5, 0x5F21, 0x8F7B, 0x5F22, 0x8F7C, + 0x5F23, 0x8F7D, 0x5F24, 0x8F7E, 0x5F25, 0xC3D6, 0x5F26, 0xCFD2, + 0x5F27, 0xBBA1, 0x5F28, 0x8F80, 0x5F29, 0xE5F3, 0x5F2A, 0xE5F2, + 0x5F2B, 0x8F81, 0x5F2C, 0x8F82, 0x5F2D, 0xE5F4, 0x5F2E, 0x8F83, + 0x5F2F, 0xCDE4, 0x5F30, 0x8F84, 0x5F31, 0xC8F5, 0x5F32, 0x8F85, + 0x5F33, 0x8F86, 0x5F34, 0x8F87, 0x5F35, 0x8F88, 0x5F36, 0x8F89, + 0x5F37, 0x8F8A, 0x5F38, 0x8F8B, 0x5F39, 0xB5AF, 0x5F3A, 0xC7BF, + 0x5F3B, 0x8F8C, 0x5F3C, 0xE5F6, 0x5F3D, 0x8F8D, 0x5F3E, 0x8F8E, + 0x5F3F, 0x8F8F, 0x5F40, 0xECB0, 0x5F41, 0x8F90, 0x5F42, 0x8F91, + 0x5F43, 0x8F92, 0x5F44, 0x8F93, 0x5F45, 0x8F94, 0x5F46, 0x8F95, + 0x5F47, 0x8F96, 0x5F48, 0x8F97, 0x5F49, 0x8F98, 0x5F4A, 0x8F99, + 0x5F4B, 0x8F9A, 0x5F4C, 0x8F9B, 0x5F4D, 0x8F9C, 0x5F4E, 0x8F9D, + 0x5F4F, 0x8F9E, 0x5F50, 0xE5E6, 0x5F51, 0x8F9F, 0x5F52, 0xB9E9, + 0x5F53, 0xB5B1, 0x5F54, 0x8FA0, 0x5F55, 0xC2BC, 0x5F56, 0xE5E8, + 0x5F57, 0xE5E7, 0x5F58, 0xE5E9, 0x5F59, 0x8FA1, 0x5F5A, 0x8FA2, + 0x5F5B, 0x8FA3, 0x5F5C, 0x8FA4, 0x5F5D, 0xD2CD, 0x5F5E, 0x8FA5, + 0x5F5F, 0x8FA6, 0x5F60, 0x8FA7, 0x5F61, 0xE1EA, 0x5F62, 0xD0CE, + 0x5F63, 0x8FA8, 0x5F64, 0xCDAE, 0x5F65, 0x8FA9, 0x5F66, 0xD1E5, + 0x5F67, 0x8FAA, 0x5F68, 0x8FAB, 0x5F69, 0xB2CA, 0x5F6A, 0xB1EB, + 0x5F6B, 0x8FAC, 0x5F6C, 0xB1F2, 0x5F6D, 0xC5ED, 0x5F6E, 0x8FAD, + 0x5F6F, 0x8FAE, 0x5F70, 0xD5C3, 0x5F71, 0xD3B0, 0x5F72, 0x8FAF, + 0x5F73, 0xE1DC, 0x5F74, 0x8FB0, 0x5F75, 0x8FB1, 0x5F76, 0x8FB2, + 0x5F77, 0xE1DD, 0x5F78, 0x8FB3, 0x5F79, 0xD2DB, 0x5F7A, 0x8FB4, + 0x5F7B, 0xB3B9, 0x5F7C, 0xB1CB, 0x5F7D, 0x8FB5, 0x5F7E, 0x8FB6, + 0x5F7F, 0x8FB7, 0x5F80, 0xCDF9, 0x5F81, 0xD5F7, 0x5F82, 0xE1DE, + 0x5F83, 0x8FB8, 0x5F84, 0xBEB6, 0x5F85, 0xB4FD, 0x5F86, 0x8FB9, + 0x5F87, 0xE1DF, 0x5F88, 0xBADC, 0x5F89, 0xE1E0, 0x5F8A, 0xBBB2, + 0x5F8B, 0xC2C9, 0x5F8C, 0xE1E1, 0x5F8D, 0x8FBA, 0x5F8E, 0x8FBB, + 0x5F8F, 0x8FBC, 0x5F90, 0xD0EC, 0x5F91, 0x8FBD, 0x5F92, 0xCDBD, + 0x5F93, 0x8FBE, 0x5F94, 0x8FBF, 0x5F95, 0xE1E2, 0x5F96, 0x8FC0, + 0x5F97, 0xB5C3, 0x5F98, 0xC5C7, 0x5F99, 0xE1E3, 0x5F9A, 0x8FC1, + 0x5F9B, 0x8FC2, 0x5F9C, 0xE1E4, 0x5F9D, 0x8FC3, 0x5F9E, 0x8FC4, + 0x5F9F, 0x8FC5, 0x5FA0, 0x8FC6, 0x5FA1, 0xD3F9, 0x5FA2, 0x8FC7, + 0x5FA3, 0x8FC8, 0x5FA4, 0x8FC9, 0x5FA5, 0x8FCA, 0x5FA6, 0x8FCB, + 0x5FA7, 0x8FCC, 0x5FA8, 0xE1E5, 0x5FA9, 0x8FCD, 0x5FAA, 0xD1AD, + 0x5FAB, 0x8FCE, 0x5FAC, 0x8FCF, 0x5FAD, 0xE1E6, 0x5FAE, 0xCEA2, + 0x5FAF, 0x8FD0, 0x5FB0, 0x8FD1, 0x5FB1, 0x8FD2, 0x5FB2, 0x8FD3, + 0x5FB3, 0x8FD4, 0x5FB4, 0x8FD5, 0x5FB5, 0xE1E7, 0x5FB6, 0x8FD6, + 0x5FB7, 0xB5C2, 0x5FB8, 0x8FD7, 0x5FB9, 0x8FD8, 0x5FBA, 0x8FD9, + 0x5FBB, 0x8FDA, 0x5FBC, 0xE1E8, 0x5FBD, 0xBBD5, 0x5FBE, 0x8FDB, + 0x5FBF, 0x8FDC, 0x5FC0, 0x8FDD, 0x5FC1, 0x8FDE, 0x5FC2, 0x8FDF, + 0x5FC3, 0xD0C4, 0x5FC4, 0xE2E0, 0x5FC5, 0xB1D8, 0x5FC6, 0xD2E4, + 0x5FC7, 0x8FE0, 0x5FC8, 0x8FE1, 0x5FC9, 0xE2E1, 0x5FCA, 0x8FE2, + 0x5FCB, 0x8FE3, 0x5FCC, 0xBCC9, 0x5FCD, 0xC8CC, 0x5FCE, 0x8FE4, + 0x5FCF, 0xE2E3, 0x5FD0, 0xECFE, 0x5FD1, 0xECFD, 0x5FD2, 0xDFAF, + 0x5FD3, 0x8FE5, 0x5FD4, 0x8FE6, 0x5FD5, 0x8FE7, 0x5FD6, 0xE2E2, + 0x5FD7, 0xD6BE, 0x5FD8, 0xCDFC, 0x5FD9, 0xC3A6, 0x5FDA, 0x8FE8, + 0x5FDB, 0x8FE9, 0x5FDC, 0x8FEA, 0x5FDD, 0xE3C3, 0x5FDE, 0x8FEB, + 0x5FDF, 0x8FEC, 0x5FE0, 0xD6D2, 0x5FE1, 0xE2E7, 0x5FE2, 0x8FED, + 0x5FE3, 0x8FEE, 0x5FE4, 0xE2E8, 0x5FE5, 0x8FEF, 0x5FE6, 0x8FF0, + 0x5FE7, 0xD3C7, 0x5FE8, 0x8FF1, 0x5FE9, 0x8FF2, 0x5FEA, 0xE2EC, + 0x5FEB, 0xBFEC, 0x5FEC, 0x8FF3, 0x5FED, 0xE2ED, 0x5FEE, 0xE2E5, + 0x5FEF, 0x8FF4, 0x5FF0, 0x8FF5, 0x5FF1, 0xB3C0, 0x5FF2, 0x8FF6, + 0x5FF3, 0x8FF7, 0x5FF4, 0x8FF8, 0x5FF5, 0xC4EE, 0x5FF6, 0x8FF9, + 0x5FF7, 0x8FFA, 0x5FF8, 0xE2EE, 0x5FF9, 0x8FFB, 0x5FFA, 0x8FFC, + 0x5FFB, 0xD0C3, 0x5FFC, 0x8FFD, 0x5FFD, 0xBAF6, 0x5FFE, 0xE2E9, + 0x5FFF, 0xB7DE, 0x6000, 0xBBB3, 0x6001, 0xCCAC, 0x6002, 0xCBCB, + 0x6003, 0xE2E4, 0x6004, 0xE2E6, 0x6005, 0xE2EA, 0x6006, 0xE2EB, + 0x6007, 0x8FFE, 0x6008, 0x9040, 0x6009, 0x9041, 0x600A, 0xE2F7, + 0x600B, 0x9042, 0x600C, 0x9043, 0x600D, 0xE2F4, 0x600E, 0xD4F5, + 0x600F, 0xE2F3, 0x6010, 0x9044, 0x6011, 0x9045, 0x6012, 0xC5AD, + 0x6013, 0x9046, 0x6014, 0xD5FA, 0x6015, 0xC5C2, 0x6016, 0xB2C0, + 0x6017, 0x9047, 0x6018, 0x9048, 0x6019, 0xE2EF, 0x601A, 0x9049, + 0x601B, 0xE2F2, 0x601C, 0xC1AF, 0x601D, 0xCBBC, 0x601E, 0x904A, + 0x601F, 0x904B, 0x6020, 0xB5A1, 0x6021, 0xE2F9, 0x6022, 0x904C, + 0x6023, 0x904D, 0x6024, 0x904E, 0x6025, 0xBCB1, 0x6026, 0xE2F1, + 0x6027, 0xD0D4, 0x6028, 0xD4B9, 0x6029, 0xE2F5, 0x602A, 0xB9D6, + 0x602B, 0xE2F6, 0x602C, 0x904F, 0x602D, 0x9050, 0x602E, 0x9051, + 0x602F, 0xC7D3, 0x6030, 0x9052, 0x6031, 0x9053, 0x6032, 0x9054, + 0x6033, 0x9055, 0x6034, 0x9056, 0x6035, 0xE2F0, 0x6036, 0x9057, + 0x6037, 0x9058, 0x6038, 0x9059, 0x6039, 0x905A, 0x603A, 0x905B, + 0x603B, 0xD7DC, 0x603C, 0xEDA1, 0x603D, 0x905C, 0x603E, 0x905D, + 0x603F, 0xE2F8, 0x6040, 0x905E, 0x6041, 0xEDA5, 0x6042, 0xE2FE, + 0x6043, 0xCAD1, 0x6044, 0x905F, 0x6045, 0x9060, 0x6046, 0x9061, + 0x6047, 0x9062, 0x6048, 0x9063, 0x6049, 0x9064, 0x604A, 0x9065, + 0x604B, 0xC1B5, 0x604C, 0x9066, 0x604D, 0xBBD0, 0x604E, 0x9067, + 0x604F, 0x9068, 0x6050, 0xBFD6, 0x6051, 0x9069, 0x6052, 0xBAE3, + 0x6053, 0x906A, 0x6054, 0x906B, 0x6055, 0xCBA1, 0x6056, 0x906C, + 0x6057, 0x906D, 0x6058, 0x906E, 0x6059, 0xEDA6, 0x605A, 0xEDA3, + 0x605B, 0x906F, 0x605C, 0x9070, 0x605D, 0xEDA2, 0x605E, 0x9071, + 0x605F, 0x9072, 0x6060, 0x9073, 0x6061, 0x9074, 0x6062, 0xBBD6, + 0x6063, 0xEDA7, 0x6064, 0xD0F4, 0x6065, 0x9075, 0x6066, 0x9076, + 0x6067, 0xEDA4, 0x6068, 0xBADE, 0x6069, 0xB6F7, 0x606A, 0xE3A1, + 0x606B, 0xB6B2, 0x606C, 0xCCF1, 0x606D, 0xB9A7, 0x606E, 0x9077, + 0x606F, 0xCFA2, 0x6070, 0xC7A1, 0x6071, 0x9078, 0x6072, 0x9079, + 0x6073, 0xBFD2, 0x6074, 0x907A, 0x6075, 0x907B, 0x6076, 0xB6F1, + 0x6077, 0x907C, 0x6078, 0xE2FA, 0x6079, 0xE2FB, 0x607A, 0xE2FD, + 0x607B, 0xE2FC, 0x607C, 0xC4D5, 0x607D, 0xE3A2, 0x607E, 0x907D, + 0x607F, 0xD3C1, 0x6080, 0x907E, 0x6081, 0x9080, 0x6082, 0x9081, + 0x6083, 0xE3A7, 0x6084, 0xC7C4, 0x6085, 0x9082, 0x6086, 0x9083, + 0x6087, 0x9084, 0x6088, 0x9085, 0x6089, 0xCFA4, 0x608A, 0x9086, + 0x608B, 0x9087, 0x608C, 0xE3A9, 0x608D, 0xBAB7, 0x608E, 0x9088, + 0x608F, 0x9089, 0x6090, 0x908A, 0x6091, 0x908B, 0x6092, 0xE3A8, + 0x6093, 0x908C, 0x6094, 0xBBDA, 0x6095, 0x908D, 0x6096, 0xE3A3, + 0x6097, 0x908E, 0x6098, 0x908F, 0x6099, 0x9090, 0x609A, 0xE3A4, + 0x609B, 0xE3AA, 0x609C, 0x9091, 0x609D, 0xE3A6, 0x609E, 0x9092, + 0x609F, 0xCEF2, 0x60A0, 0xD3C6, 0x60A1, 0x9093, 0x60A2, 0x9094, + 0x60A3, 0xBBBC, 0x60A4, 0x9095, 0x60A5, 0x9096, 0x60A6, 0xD4C3, + 0x60A7, 0x9097, 0x60A8, 0xC4FA, 0x60A9, 0x9098, 0x60AA, 0x9099, + 0x60AB, 0xEDA8, 0x60AC, 0xD0FC, 0x60AD, 0xE3A5, 0x60AE, 0x909A, + 0x60AF, 0xC3F5, 0x60B0, 0x909B, 0x60B1, 0xE3AD, 0x60B2, 0xB1AF, + 0x60B3, 0x909C, 0x60B4, 0xE3B2, 0x60B5, 0x909D, 0x60B6, 0x909E, + 0x60B7, 0x909F, 0x60B8, 0xBCC2, 0x60B9, 0x90A0, 0x60BA, 0x90A1, + 0x60BB, 0xE3AC, 0x60BC, 0xB5BF, 0x60BD, 0x90A2, 0x60BE, 0x90A3, + 0x60BF, 0x90A4, 0x60C0, 0x90A5, 0x60C1, 0x90A6, 0x60C2, 0x90A7, + 0x60C3, 0x90A8, 0x60C4, 0x90A9, 0x60C5, 0xC7E9, 0x60C6, 0xE3B0, + 0x60C7, 0x90AA, 0x60C8, 0x90AB, 0x60C9, 0x90AC, 0x60CA, 0xBEAA, + 0x60CB, 0xCDEF, 0x60CC, 0x90AD, 0x60CD, 0x90AE, 0x60CE, 0x90AF, + 0x60CF, 0x90B0, 0x60D0, 0x90B1, 0x60D1, 0xBBF3, 0x60D2, 0x90B2, + 0x60D3, 0x90B3, 0x60D4, 0x90B4, 0x60D5, 0xCCE8, 0x60D6, 0x90B5, + 0x60D7, 0x90B6, 0x60D8, 0xE3AF, 0x60D9, 0x90B7, 0x60DA, 0xE3B1, + 0x60DB, 0x90B8, 0x60DC, 0xCFA7, 0x60DD, 0xE3AE, 0x60DE, 0x90B9, + 0x60DF, 0xCEA9, 0x60E0, 0xBBDD, 0x60E1, 0x90BA, 0x60E2, 0x90BB, + 0x60E3, 0x90BC, 0x60E4, 0x90BD, 0x60E5, 0x90BE, 0x60E6, 0xB5EB, + 0x60E7, 0xBEE5, 0x60E8, 0xB2D2, 0x60E9, 0xB3CD, 0x60EA, 0x90BF, + 0x60EB, 0xB1B9, 0x60EC, 0xE3AB, 0x60ED, 0xB2D1, 0x60EE, 0xB5AC, + 0x60EF, 0xB9DF, 0x60F0, 0xB6E8, 0x60F1, 0x90C0, 0x60F2, 0x90C1, + 0x60F3, 0xCFEB, 0x60F4, 0xE3B7, 0x60F5, 0x90C2, 0x60F6, 0xBBCC, + 0x60F7, 0x90C3, 0x60F8, 0x90C4, 0x60F9, 0xC8C7, 0x60FA, 0xD0CA, + 0x60FB, 0x90C5, 0x60FC, 0x90C6, 0x60FD, 0x90C7, 0x60FE, 0x90C8, + 0x60FF, 0x90C9, 0x6100, 0xE3B8, 0x6101, 0xB3EE, 0x6102, 0x90CA, + 0x6103, 0x90CB, 0x6104, 0x90CC, 0x6105, 0x90CD, 0x6106, 0xEDA9, + 0x6107, 0x90CE, 0x6108, 0xD3FA, 0x6109, 0xD3E4, 0x610A, 0x90CF, + 0x610B, 0x90D0, 0x610C, 0x90D1, 0x610D, 0xEDAA, 0x610E, 0xE3B9, + 0x610F, 0xD2E2, 0x6110, 0x90D2, 0x6111, 0x90D3, 0x6112, 0x90D4, + 0x6113, 0x90D5, 0x6114, 0x90D6, 0x6115, 0xE3B5, 0x6116, 0x90D7, + 0x6117, 0x90D8, 0x6118, 0x90D9, 0x6119, 0x90DA, 0x611A, 0xD3DE, + 0x611B, 0x90DB, 0x611C, 0x90DC, 0x611D, 0x90DD, 0x611E, 0x90DE, + 0x611F, 0xB8D0, 0x6120, 0xE3B3, 0x6121, 0x90DF, 0x6122, 0x90E0, + 0x6123, 0xE3B6, 0x6124, 0xB7DF, 0x6125, 0x90E1, 0x6126, 0xE3B4, + 0x6127, 0xC0A2, 0x6128, 0x90E2, 0x6129, 0x90E3, 0x612A, 0x90E4, + 0x612B, 0xE3BA, 0x612C, 0x90E5, 0x612D, 0x90E6, 0x612E, 0x90E7, + 0x612F, 0x90E8, 0x6130, 0x90E9, 0x6131, 0x90EA, 0x6132, 0x90EB, + 0x6133, 0x90EC, 0x6134, 0x90ED, 0x6135, 0x90EE, 0x6136, 0x90EF, + 0x6137, 0x90F0, 0x6138, 0x90F1, 0x6139, 0x90F2, 0x613A, 0x90F3, + 0x613B, 0x90F4, 0x613C, 0x90F5, 0x613D, 0x90F6, 0x613E, 0x90F7, + 0x613F, 0xD4B8, 0x6140, 0x90F8, 0x6141, 0x90F9, 0x6142, 0x90FA, + 0x6143, 0x90FB, 0x6144, 0x90FC, 0x6145, 0x90FD, 0x6146, 0x90FE, + 0x6147, 0x9140, 0x6148, 0xB4C8, 0x6149, 0x9141, 0x614A, 0xE3BB, + 0x614B, 0x9142, 0x614C, 0xBBC5, 0x614D, 0x9143, 0x614E, 0xC9F7, + 0x614F, 0x9144, 0x6150, 0x9145, 0x6151, 0xC9E5, 0x6152, 0x9146, + 0x6153, 0x9147, 0x6154, 0x9148, 0x6155, 0xC4BD, 0x6156, 0x9149, + 0x6157, 0x914A, 0x6158, 0x914B, 0x6159, 0x914C, 0x615A, 0x914D, + 0x615B, 0x914E, 0x615C, 0x914F, 0x615D, 0xEDAB, 0x615E, 0x9150, + 0x615F, 0x9151, 0x6160, 0x9152, 0x6161, 0x9153, 0x6162, 0xC2FD, + 0x6163, 0x9154, 0x6164, 0x9155, 0x6165, 0x9156, 0x6166, 0x9157, + 0x6167, 0xBBDB, 0x6168, 0xBFAE, 0x6169, 0x9158, 0x616A, 0x9159, + 0x616B, 0x915A, 0x616C, 0x915B, 0x616D, 0x915C, 0x616E, 0x915D, + 0x616F, 0x915E, 0x6170, 0xCEBF, 0x6171, 0x915F, 0x6172, 0x9160, + 0x6173, 0x9161, 0x6174, 0x9162, 0x6175, 0xE3BC, 0x6176, 0x9163, + 0x6177, 0xBFB6, 0x6178, 0x9164, 0x6179, 0x9165, 0x617A, 0x9166, + 0x617B, 0x9167, 0x617C, 0x9168, 0x617D, 0x9169, 0x617E, 0x916A, + 0x617F, 0x916B, 0x6180, 0x916C, 0x6181, 0x916D, 0x6182, 0x916E, + 0x6183, 0x916F, 0x6184, 0x9170, 0x6185, 0x9171, 0x6186, 0x9172, + 0x6187, 0x9173, 0x6188, 0x9174, 0x6189, 0x9175, 0x618A, 0x9176, + 0x618B, 0xB1EF, 0x618C, 0x9177, 0x618D, 0x9178, 0x618E, 0xD4F7, + 0x618F, 0x9179, 0x6190, 0x917A, 0x6191, 0x917B, 0x6192, 0x917C, + 0x6193, 0x917D, 0x6194, 0xE3BE, 0x6195, 0x917E, 0x6196, 0x9180, + 0x6197, 0x9181, 0x6198, 0x9182, 0x6199, 0x9183, 0x619A, 0x9184, + 0x619B, 0x9185, 0x619C, 0x9186, 0x619D, 0xEDAD, 0x619E, 0x9187, + 0x619F, 0x9188, 0x61A0, 0x9189, 0x61A1, 0x918A, 0x61A2, 0x918B, + 0x61A3, 0x918C, 0x61A4, 0x918D, 0x61A5, 0x918E, 0x61A6, 0x918F, + 0x61A7, 0xE3BF, 0x61A8, 0xBAA9, 0x61A9, 0xEDAC, 0x61AA, 0x9190, + 0x61AB, 0x9191, 0x61AC, 0xE3BD, 0x61AD, 0x9192, 0x61AE, 0x9193, + 0x61AF, 0x9194, 0x61B0, 0x9195, 0x61B1, 0x9196, 0x61B2, 0x9197, + 0x61B3, 0x9198, 0x61B4, 0x9199, 0x61B5, 0x919A, 0x61B6, 0x919B, + 0x61B7, 0xE3C0, 0x61B8, 0x919C, 0x61B9, 0x919D, 0x61BA, 0x919E, + 0x61BB, 0x919F, 0x61BC, 0x91A0, 0x61BD, 0x91A1, 0x61BE, 0xBAB6, + 0x61BF, 0x91A2, 0x61C0, 0x91A3, 0x61C1, 0x91A4, 0x61C2, 0xB6AE, + 0x61C3, 0x91A5, 0x61C4, 0x91A6, 0x61C5, 0x91A7, 0x61C6, 0x91A8, + 0x61C7, 0x91A9, 0x61C8, 0xD0B8, 0x61C9, 0x91AA, 0x61CA, 0xB0C3, + 0x61CB, 0xEDAE, 0x61CC, 0x91AB, 0x61CD, 0x91AC, 0x61CE, 0x91AD, + 0x61CF, 0x91AE, 0x61D0, 0x91AF, 0x61D1, 0xEDAF, 0x61D2, 0xC0C1, + 0x61D3, 0x91B0, 0x61D4, 0xE3C1, 0x61D5, 0x91B1, 0x61D6, 0x91B2, + 0x61D7, 0x91B3, 0x61D8, 0x91B4, 0x61D9, 0x91B5, 0x61DA, 0x91B6, + 0x61DB, 0x91B7, 0x61DC, 0x91B8, 0x61DD, 0x91B9, 0x61DE, 0x91BA, + 0x61DF, 0x91BB, 0x61E0, 0x91BC, 0x61E1, 0x91BD, 0x61E2, 0x91BE, + 0x61E3, 0x91BF, 0x61E4, 0x91C0, 0x61E5, 0x91C1, 0x61E6, 0xC5B3, + 0x61E7, 0x91C2, 0x61E8, 0x91C3, 0x61E9, 0x91C4, 0x61EA, 0x91C5, + 0x61EB, 0x91C6, 0x61EC, 0x91C7, 0x61ED, 0x91C8, 0x61EE, 0x91C9, + 0x61EF, 0x91CA, 0x61F0, 0x91CB, 0x61F1, 0x91CC, 0x61F2, 0x91CD, + 0x61F3, 0x91CE, 0x61F4, 0x91CF, 0x61F5, 0xE3C2, 0x61F6, 0x91D0, + 0x61F7, 0x91D1, 0x61F8, 0x91D2, 0x61F9, 0x91D3, 0x61FA, 0x91D4, + 0x61FB, 0x91D5, 0x61FC, 0x91D6, 0x61FD, 0x91D7, 0x61FE, 0x91D8, + 0x61FF, 0xDCB2, 0x6200, 0x91D9, 0x6201, 0x91DA, 0x6202, 0x91DB, + 0x6203, 0x91DC, 0x6204, 0x91DD, 0x6205, 0x91DE, 0x6206, 0xEDB0, + 0x6207, 0x91DF, 0x6208, 0xB8EA, 0x6209, 0x91E0, 0x620A, 0xCEEC, + 0x620B, 0xEAA7, 0x620C, 0xD0E7, 0x620D, 0xCAF9, 0x620E, 0xC8D6, + 0x620F, 0xCFB7, 0x6210, 0xB3C9, 0x6211, 0xCED2, 0x6212, 0xBDE4, + 0x6213, 0x91E1, 0x6214, 0x91E2, 0x6215, 0xE3DE, 0x6216, 0xBBF2, + 0x6217, 0xEAA8, 0x6218, 0xD5BD, 0x6219, 0x91E3, 0x621A, 0xC6DD, + 0x621B, 0xEAA9, 0x621C, 0x91E4, 0x621D, 0x91E5, 0x621E, 0x91E6, + 0x621F, 0xEAAA, 0x6220, 0x91E7, 0x6221, 0xEAAC, 0x6222, 0xEAAB, + 0x6223, 0x91E8, 0x6224, 0xEAAE, 0x6225, 0xEAAD, 0x6226, 0x91E9, + 0x6227, 0x91EA, 0x6228, 0x91EB, 0x6229, 0x91EC, 0x622A, 0xBDD8, + 0x622B, 0x91ED, 0x622C, 0xEAAF, 0x622D, 0x91EE, 0x622E, 0xC2BE, + 0x622F, 0x91EF, 0x6230, 0x91F0, 0x6231, 0x91F1, 0x6232, 0x91F2, + 0x6233, 0xB4C1, 0x6234, 0xB4F7, 0x6235, 0x91F3, 0x6236, 0x91F4, + 0x6237, 0xBBA7, 0x6238, 0x91F5, 0x6239, 0x91F6, 0x623A, 0x91F7, + 0x623B, 0x91F8, 0x623C, 0x91F9, 0x623D, 0xECE6, 0x623E, 0xECE5, + 0x623F, 0xB7BF, 0x6240, 0xCBF9, 0x6241, 0xB1E2, 0x6242, 0x91FA, + 0x6243, 0xECE7, 0x6244, 0x91FB, 0x6245, 0x91FC, 0x6246, 0x91FD, + 0x6247, 0xC9C8, 0x6248, 0xECE8, 0x6249, 0xECE9, 0x624A, 0x91FE, + 0x624B, 0xCAD6, 0x624C, 0xDED0, 0x624D, 0xB2C5, 0x624E, 0xD4FA, + 0x624F, 0x9240, 0x6250, 0x9241, 0x6251, 0xC6CB, 0x6252, 0xB0C7, + 0x6253, 0xB4F2, 0x6254, 0xC8D3, 0x6255, 0x9242, 0x6256, 0x9243, + 0x6257, 0x9244, 0x6258, 0xCDD0, 0x6259, 0x9245, 0x625A, 0x9246, + 0x625B, 0xBFB8, 0x625C, 0x9247, 0x625D, 0x9248, 0x625E, 0x9249, + 0x625F, 0x924A, 0x6260, 0x924B, 0x6261, 0x924C, 0x6262, 0x924D, + 0x6263, 0xBFDB, 0x6264, 0x924E, 0x6265, 0x924F, 0x6266, 0xC7A4, + 0x6267, 0xD6B4, 0x6268, 0x9250, 0x6269, 0xC0A9, 0x626A, 0xDED1, + 0x626B, 0xC9A8, 0x626C, 0xD1EF, 0x626D, 0xC5A4, 0x626E, 0xB0E7, + 0x626F, 0xB3B6, 0x6270, 0xC8C5, 0x6271, 0x9251, 0x6272, 0x9252, + 0x6273, 0xB0E2, 0x6274, 0x9253, 0x6275, 0x9254, 0x6276, 0xB7F6, + 0x6277, 0x9255, 0x6278, 0x9256, 0x6279, 0xC5FA, 0x627A, 0x9257, + 0x627B, 0x9258, 0x627C, 0xB6F3, 0x627D, 0x9259, 0x627E, 0xD5D2, + 0x627F, 0xB3D0, 0x6280, 0xBCBC, 0x6281, 0x925A, 0x6282, 0x925B, + 0x6283, 0x925C, 0x6284, 0xB3AD, 0x6285, 0x925D, 0x6286, 0x925E, + 0x6287, 0x925F, 0x6288, 0x9260, 0x6289, 0xBEF1, 0x628A, 0xB0D1, + 0x628B, 0x9261, 0x628C, 0x9262, 0x628D, 0x9263, 0x628E, 0x9264, + 0x628F, 0x9265, 0x6290, 0x9266, 0x6291, 0xD2D6, 0x6292, 0xCAE3, + 0x6293, 0xD7A5, 0x6294, 0x9267, 0x6295, 0xCDB6, 0x6296, 0xB6B6, + 0x6297, 0xBFB9, 0x6298, 0xD5DB, 0x6299, 0x9268, 0x629A, 0xB8A7, + 0x629B, 0xC5D7, 0x629C, 0x9269, 0x629D, 0x926A, 0x629E, 0x926B, + 0x629F, 0xDED2, 0x62A0, 0xBFD9, 0x62A1, 0xC2D5, 0x62A2, 0xC7C0, + 0x62A3, 0x926C, 0x62A4, 0xBBA4, 0x62A5, 0xB1A8, 0x62A6, 0x926D, + 0x62A7, 0x926E, 0x62A8, 0xC5EA, 0x62A9, 0x926F, 0x62AA, 0x9270, + 0x62AB, 0xC5FB, 0x62AC, 0xCCA7, 0x62AD, 0x9271, 0x62AE, 0x9272, + 0x62AF, 0x9273, 0x62B0, 0x9274, 0x62B1, 0xB1A7, 0x62B2, 0x9275, + 0x62B3, 0x9276, 0x62B4, 0x9277, 0x62B5, 0xB5D6, 0x62B6, 0x9278, + 0x62B7, 0x9279, 0x62B8, 0x927A, 0x62B9, 0xC4A8, 0x62BA, 0x927B, + 0x62BB, 0xDED3, 0x62BC, 0xD1BA, 0x62BD, 0xB3E9, 0x62BE, 0x927C, + 0x62BF, 0xC3F2, 0x62C0, 0x927D, 0x62C1, 0x927E, 0x62C2, 0xB7F7, + 0x62C3, 0x9280, 0x62C4, 0xD6F4, 0x62C5, 0xB5A3, 0x62C6, 0xB2F0, + 0x62C7, 0xC4B4, 0x62C8, 0xC4E9, 0x62C9, 0xC0AD, 0x62CA, 0xDED4, + 0x62CB, 0x9281, 0x62CC, 0xB0E8, 0x62CD, 0xC5C4, 0x62CE, 0xC1E0, + 0x62CF, 0x9282, 0x62D0, 0xB9D5, 0x62D1, 0x9283, 0x62D2, 0xBEDC, + 0x62D3, 0xCDD8, 0x62D4, 0xB0CE, 0x62D5, 0x9284, 0x62D6, 0xCDCF, + 0x62D7, 0xDED6, 0x62D8, 0xBED0, 0x62D9, 0xD7BE, 0x62DA, 0xDED5, + 0x62DB, 0xD5D0, 0x62DC, 0xB0DD, 0x62DD, 0x9285, 0x62DE, 0x9286, + 0x62DF, 0xC4E2, 0x62E0, 0x9287, 0x62E1, 0x9288, 0x62E2, 0xC2A3, + 0x62E3, 0xBCF0, 0x62E4, 0x9289, 0x62E5, 0xD3B5, 0x62E6, 0xC0B9, + 0x62E7, 0xC5A1, 0x62E8, 0xB2A6, 0x62E9, 0xD4F1, 0x62EA, 0x928A, + 0x62EB, 0x928B, 0x62EC, 0xC0A8, 0x62ED, 0xCAC3, 0x62EE, 0xDED7, + 0x62EF, 0xD5FC, 0x62F0, 0x928C, 0x62F1, 0xB9B0, 0x62F2, 0x928D, + 0x62F3, 0xC8AD, 0x62F4, 0xCBA9, 0x62F5, 0x928E, 0x62F6, 0xDED9, + 0x62F7, 0xBFBD, 0x62F8, 0x928F, 0x62F9, 0x9290, 0x62FA, 0x9291, + 0x62FB, 0x9292, 0x62FC, 0xC6B4, 0x62FD, 0xD7A7, 0x62FE, 0xCAB0, + 0x62FF, 0xC4C3, 0x6300, 0x9293, 0x6301, 0xB3D6, 0x6302, 0xB9D2, + 0x6303, 0x9294, 0x6304, 0x9295, 0x6305, 0x9296, 0x6306, 0x9297, + 0x6307, 0xD6B8, 0x6308, 0xEAFC, 0x6309, 0xB0B4, 0x630A, 0x9298, + 0x630B, 0x9299, 0x630C, 0x929A, 0x630D, 0x929B, 0x630E, 0xBFE6, + 0x630F, 0x929C, 0x6310, 0x929D, 0x6311, 0xCCF4, 0x6312, 0x929E, + 0x6313, 0x929F, 0x6314, 0x92A0, 0x6315, 0x92A1, 0x6316, 0xCDDA, + 0x6317, 0x92A2, 0x6318, 0x92A3, 0x6319, 0x92A4, 0x631A, 0xD6BF, + 0x631B, 0xC2CE, 0x631C, 0x92A5, 0x631D, 0xCECE, 0x631E, 0xCCA2, + 0x631F, 0xD0AE, 0x6320, 0xC4D3, 0x6321, 0xB5B2, 0x6322, 0xDED8, + 0x6323, 0xD5F5, 0x6324, 0xBCB7, 0x6325, 0xBBD3, 0x6326, 0x92A6, + 0x6327, 0x92A7, 0x6328, 0xB0A4, 0x6329, 0x92A8, 0x632A, 0xC5B2, + 0x632B, 0xB4EC, 0x632C, 0x92A9, 0x632D, 0x92AA, 0x632E, 0x92AB, + 0x632F, 0xD5F1, 0x6330, 0x92AC, 0x6331, 0x92AD, 0x6332, 0xEAFD, + 0x6333, 0x92AE, 0x6334, 0x92AF, 0x6335, 0x92B0, 0x6336, 0x92B1, + 0x6337, 0x92B2, 0x6338, 0x92B3, 0x6339, 0xDEDA, 0x633A, 0xCDA6, + 0x633B, 0x92B4, 0x633C, 0x92B5, 0x633D, 0xCDEC, 0x633E, 0x92B6, + 0x633F, 0x92B7, 0x6340, 0x92B8, 0x6341, 0x92B9, 0x6342, 0xCEE6, + 0x6343, 0xDEDC, 0x6344, 0x92BA, 0x6345, 0xCDB1, 0x6346, 0xC0A6, + 0x6347, 0x92BB, 0x6348, 0x92BC, 0x6349, 0xD7BD, 0x634A, 0x92BD, + 0x634B, 0xDEDB, 0x634C, 0xB0C6, 0x634D, 0xBAB4, 0x634E, 0xC9D3, + 0x634F, 0xC4F3, 0x6350, 0xBEE8, 0x6351, 0x92BE, 0x6352, 0x92BF, + 0x6353, 0x92C0, 0x6354, 0x92C1, 0x6355, 0xB2B6, 0x6356, 0x92C2, + 0x6357, 0x92C3, 0x6358, 0x92C4, 0x6359, 0x92C5, 0x635A, 0x92C6, + 0x635B, 0x92C7, 0x635C, 0x92C8, 0x635D, 0x92C9, 0x635E, 0xC0CC, + 0x635F, 0xCBF0, 0x6360, 0x92CA, 0x6361, 0xBCF1, 0x6362, 0xBBBB, + 0x6363, 0xB5B7, 0x6364, 0x92CB, 0x6365, 0x92CC, 0x6366, 0x92CD, + 0x6367, 0xC5F5, 0x6368, 0x92CE, 0x6369, 0xDEE6, 0x636A, 0x92CF, + 0x636B, 0x92D0, 0x636C, 0x92D1, 0x636D, 0xDEE3, 0x636E, 0xBEDD, + 0x636F, 0x92D2, 0x6370, 0x92D3, 0x6371, 0xDEDF, 0x6372, 0x92D4, + 0x6373, 0x92D5, 0x6374, 0x92D6, 0x6375, 0x92D7, 0x6376, 0xB4B7, + 0x6377, 0xBDDD, 0x6378, 0x92D8, 0x6379, 0x92D9, 0x637A, 0xDEE0, + 0x637B, 0xC4ED, 0x637C, 0x92DA, 0x637D, 0x92DB, 0x637E, 0x92DC, + 0x637F, 0x92DD, 0x6380, 0xCFC6, 0x6381, 0x92DE, 0x6382, 0xB5E0, + 0x6383, 0x92DF, 0x6384, 0x92E0, 0x6385, 0x92E1, 0x6386, 0x92E2, + 0x6387, 0xB6DE, 0x6388, 0xCADA, 0x6389, 0xB5F4, 0x638A, 0xDEE5, + 0x638B, 0x92E3, 0x638C, 0xD5C6, 0x638D, 0x92E4, 0x638E, 0xDEE1, + 0x638F, 0xCCCD, 0x6390, 0xC6FE, 0x6391, 0x92E5, 0x6392, 0xC5C5, + 0x6393, 0x92E6, 0x6394, 0x92E7, 0x6395, 0x92E8, 0x6396, 0xD2B4, + 0x6397, 0x92E9, 0x6398, 0xBEF2, 0x6399, 0x92EA, 0x639A, 0x92EB, + 0x639B, 0x92EC, 0x639C, 0x92ED, 0x639D, 0x92EE, 0x639E, 0x92EF, + 0x639F, 0x92F0, 0x63A0, 0xC2D3, 0x63A1, 0x92F1, 0x63A2, 0xCCBD, + 0x63A3, 0xB3B8, 0x63A4, 0x92F2, 0x63A5, 0xBDD3, 0x63A6, 0x92F3, + 0x63A7, 0xBFD8, 0x63A8, 0xCDC6, 0x63A9, 0xD1DA, 0x63AA, 0xB4EB, + 0x63AB, 0x92F4, 0x63AC, 0xDEE4, 0x63AD, 0xDEDD, 0x63AE, 0xDEE7, + 0x63AF, 0x92F5, 0x63B0, 0xEAFE, 0x63B1, 0x92F6, 0x63B2, 0x92F7, + 0x63B3, 0xC2B0, 0x63B4, 0xDEE2, 0x63B5, 0x92F8, 0x63B6, 0x92F9, + 0x63B7, 0xD6C0, 0x63B8, 0xB5A7, 0x63B9, 0x92FA, 0x63BA, 0xB2F4, + 0x63BB, 0x92FB, 0x63BC, 0xDEE8, 0x63BD, 0x92FC, 0x63BE, 0xDEF2, + 0x63BF, 0x92FD, 0x63C0, 0x92FE, 0x63C1, 0x9340, 0x63C2, 0x9341, + 0x63C3, 0x9342, 0x63C4, 0xDEED, 0x63C5, 0x9343, 0x63C6, 0xDEF1, + 0x63C7, 0x9344, 0x63C8, 0x9345, 0x63C9, 0xC8E0, 0x63CA, 0x9346, + 0x63CB, 0x9347, 0x63CC, 0x9348, 0x63CD, 0xD7E1, 0x63CE, 0xDEEF, + 0x63CF, 0xC3E8, 0x63D0, 0xCCE1, 0x63D1, 0x9349, 0x63D2, 0xB2E5, + 0x63D3, 0x934A, 0x63D4, 0x934B, 0x63D5, 0x934C, 0x63D6, 0xD2BE, + 0x63D7, 0x934D, 0x63D8, 0x934E, 0x63D9, 0x934F, 0x63DA, 0x9350, + 0x63DB, 0x9351, 0x63DC, 0x9352, 0x63DD, 0x9353, 0x63DE, 0xDEEE, + 0x63DF, 0x9354, 0x63E0, 0xDEEB, 0x63E1, 0xCED5, 0x63E2, 0x9355, + 0x63E3, 0xB4A7, 0x63E4, 0x9356, 0x63E5, 0x9357, 0x63E6, 0x9358, + 0x63E7, 0x9359, 0x63E8, 0x935A, 0x63E9, 0xBFAB, 0x63EA, 0xBEBE, + 0x63EB, 0x935B, 0x63EC, 0x935C, 0x63ED, 0xBDD2, 0x63EE, 0x935D, + 0x63EF, 0x935E, 0x63F0, 0x935F, 0x63F1, 0x9360, 0x63F2, 0xDEE9, + 0x63F3, 0x9361, 0x63F4, 0xD4AE, 0x63F5, 0x9362, 0x63F6, 0xDEDE, + 0x63F7, 0x9363, 0x63F8, 0xDEEA, 0x63F9, 0x9364, 0x63FA, 0x9365, + 0x63FB, 0x9366, 0x63FC, 0x9367, 0x63FD, 0xC0BF, 0x63FE, 0x9368, + 0x63FF, 0xDEEC, 0x6400, 0xB2F3, 0x6401, 0xB8E9, 0x6402, 0xC2A7, + 0x6403, 0x9369, 0x6404, 0x936A, 0x6405, 0xBDC1, 0x6406, 0x936B, + 0x6407, 0x936C, 0x6408, 0x936D, 0x6409, 0x936E, 0x640A, 0x936F, + 0x640B, 0xDEF5, 0x640C, 0xDEF8, 0x640D, 0x9370, 0x640E, 0x9371, + 0x640F, 0xB2AB, 0x6410, 0xB4A4, 0x6411, 0x9372, 0x6412, 0x9373, + 0x6413, 0xB4EA, 0x6414, 0xC9A6, 0x6415, 0x9374, 0x6416, 0x9375, + 0x6417, 0x9376, 0x6418, 0x9377, 0x6419, 0x9378, 0x641A, 0x9379, + 0x641B, 0xDEF6, 0x641C, 0xCBD1, 0x641D, 0x937A, 0x641E, 0xB8E3, + 0x641F, 0x937B, 0x6420, 0xDEF7, 0x6421, 0xDEFA, 0x6422, 0x937C, + 0x6423, 0x937D, 0x6424, 0x937E, 0x6425, 0x9380, 0x6426, 0xDEF9, + 0x6427, 0x9381, 0x6428, 0x9382, 0x6429, 0x9383, 0x642A, 0xCCC2, + 0x642B, 0x9384, 0x642C, 0xB0E1, 0x642D, 0xB4EE, 0x642E, 0x9385, + 0x642F, 0x9386, 0x6430, 0x9387, 0x6431, 0x9388, 0x6432, 0x9389, + 0x6433, 0x938A, 0x6434, 0xE5BA, 0x6435, 0x938B, 0x6436, 0x938C, + 0x6437, 0x938D, 0x6438, 0x938E, 0x6439, 0x938F, 0x643A, 0xD0AF, + 0x643B, 0x9390, 0x643C, 0x9391, 0x643D, 0xB2EB, 0x643E, 0x9392, + 0x643F, 0xEBA1, 0x6440, 0x9393, 0x6441, 0xDEF4, 0x6442, 0x9394, + 0x6443, 0x9395, 0x6444, 0xC9E3, 0x6445, 0xDEF3, 0x6446, 0xB0DA, + 0x6447, 0xD2A1, 0x6448, 0xB1F7, 0x6449, 0x9396, 0x644A, 0xCCAF, + 0x644B, 0x9397, 0x644C, 0x9398, 0x644D, 0x9399, 0x644E, 0x939A, + 0x644F, 0x939B, 0x6450, 0x939C, 0x6451, 0x939D, 0x6452, 0xDEF0, + 0x6453, 0x939E, 0x6454, 0xCBA4, 0x6455, 0x939F, 0x6456, 0x93A0, + 0x6457, 0x93A1, 0x6458, 0xD5AA, 0x6459, 0x93A2, 0x645A, 0x93A3, + 0x645B, 0x93A4, 0x645C, 0x93A5, 0x645D, 0x93A6, 0x645E, 0xDEFB, + 0x645F, 0x93A7, 0x6460, 0x93A8, 0x6461, 0x93A9, 0x6462, 0x93AA, + 0x6463, 0x93AB, 0x6464, 0x93AC, 0x6465, 0x93AD, 0x6466, 0x93AE, + 0x6467, 0xB4DD, 0x6468, 0x93AF, 0x6469, 0xC4A6, 0x646A, 0x93B0, + 0x646B, 0x93B1, 0x646C, 0x93B2, 0x646D, 0xDEFD, 0x646E, 0x93B3, + 0x646F, 0x93B4, 0x6470, 0x93B5, 0x6471, 0x93B6, 0x6472, 0x93B7, + 0x6473, 0x93B8, 0x6474, 0x93B9, 0x6475, 0x93BA, 0x6476, 0x93BB, + 0x6477, 0x93BC, 0x6478, 0xC3FE, 0x6479, 0xC4A1, 0x647A, 0xDFA1, + 0x647B, 0x93BD, 0x647C, 0x93BE, 0x647D, 0x93BF, 0x647E, 0x93C0, + 0x647F, 0x93C1, 0x6480, 0x93C2, 0x6481, 0x93C3, 0x6482, 0xC1CC, + 0x6483, 0x93C4, 0x6484, 0xDEFC, 0x6485, 0xBEEF, 0x6486, 0x93C5, + 0x6487, 0xC6B2, 0x6488, 0x93C6, 0x6489, 0x93C7, 0x648A, 0x93C8, + 0x648B, 0x93C9, 0x648C, 0x93CA, 0x648D, 0x93CB, 0x648E, 0x93CC, + 0x648F, 0x93CD, 0x6490, 0x93CE, 0x6491, 0xB3C5, 0x6492, 0xC8F6, + 0x6493, 0x93CF, 0x6494, 0x93D0, 0x6495, 0xCBBA, 0x6496, 0xDEFE, + 0x6497, 0x93D1, 0x6498, 0x93D2, 0x6499, 0xDFA4, 0x649A, 0x93D3, + 0x649B, 0x93D4, 0x649C, 0x93D5, 0x649D, 0x93D6, 0x649E, 0xD7B2, + 0x649F, 0x93D7, 0x64A0, 0x93D8, 0x64A1, 0x93D9, 0x64A2, 0x93DA, + 0x64A3, 0x93DB, 0x64A4, 0xB3B7, 0x64A5, 0x93DC, 0x64A6, 0x93DD, + 0x64A7, 0x93DE, 0x64A8, 0x93DF, 0x64A9, 0xC1C3, 0x64AA, 0x93E0, + 0x64AB, 0x93E1, 0x64AC, 0xC7CB, 0x64AD, 0xB2A5, 0x64AE, 0xB4E9, + 0x64AF, 0x93E2, 0x64B0, 0xD7AB, 0x64B1, 0x93E3, 0x64B2, 0x93E4, + 0x64B3, 0x93E5, 0x64B4, 0x93E6, 0x64B5, 0xC4EC, 0x64B6, 0x93E7, + 0x64B7, 0xDFA2, 0x64B8, 0xDFA3, 0x64B9, 0x93E8, 0x64BA, 0xDFA5, + 0x64BB, 0x93E9, 0x64BC, 0xBAB3, 0x64BD, 0x93EA, 0x64BE, 0x93EB, + 0x64BF, 0x93EC, 0x64C0, 0xDFA6, 0x64C1, 0x93ED, 0x64C2, 0xC0DE, + 0x64C3, 0x93EE, 0x64C4, 0x93EF, 0x64C5, 0xC9C3, 0x64C6, 0x93F0, + 0x64C7, 0x93F1, 0x64C8, 0x93F2, 0x64C9, 0x93F3, 0x64CA, 0x93F4, + 0x64CB, 0x93F5, 0x64CC, 0x93F6, 0x64CD, 0xB2D9, 0x64CE, 0xC7E6, + 0x64CF, 0x93F7, 0x64D0, 0xDFA7, 0x64D1, 0x93F8, 0x64D2, 0xC7DC, + 0x64D3, 0x93F9, 0x64D4, 0x93FA, 0x64D5, 0x93FB, 0x64D6, 0x93FC, + 0x64D7, 0xDFA8, 0x64D8, 0xEBA2, 0x64D9, 0x93FD, 0x64DA, 0x93FE, + 0x64DB, 0x9440, 0x64DC, 0x9441, 0x64DD, 0x9442, 0x64DE, 0xCBD3, + 0x64DF, 0x9443, 0x64E0, 0x9444, 0x64E1, 0x9445, 0x64E2, 0xDFAA, + 0x64E3, 0x9446, 0x64E4, 0xDFA9, 0x64E5, 0x9447, 0x64E6, 0xB2C1, + 0x64E7, 0x9448, 0x64E8, 0x9449, 0x64E9, 0x944A, 0x64EA, 0x944B, + 0x64EB, 0x944C, 0x64EC, 0x944D, 0x64ED, 0x944E, 0x64EE, 0x944F, + 0x64EF, 0x9450, 0x64F0, 0x9451, 0x64F1, 0x9452, 0x64F2, 0x9453, + 0x64F3, 0x9454, 0x64F4, 0x9455, 0x64F5, 0x9456, 0x64F6, 0x9457, + 0x64F7, 0x9458, 0x64F8, 0x9459, 0x64F9, 0x945A, 0x64FA, 0x945B, + 0x64FB, 0x945C, 0x64FC, 0x945D, 0x64FD, 0x945E, 0x64FE, 0x945F, + 0x64FF, 0x9460, 0x6500, 0xC5CA, 0x6501, 0x9461, 0x6502, 0x9462, + 0x6503, 0x9463, 0x6504, 0x9464, 0x6505, 0x9465, 0x6506, 0x9466, + 0x6507, 0x9467, 0x6508, 0x9468, 0x6509, 0xDFAB, 0x650A, 0x9469, + 0x650B, 0x946A, 0x650C, 0x946B, 0x650D, 0x946C, 0x650E, 0x946D, + 0x650F, 0x946E, 0x6510, 0x946F, 0x6511, 0x9470, 0x6512, 0xD4DC, + 0x6513, 0x9471, 0x6514, 0x9472, 0x6515, 0x9473, 0x6516, 0x9474, + 0x6517, 0x9475, 0x6518, 0xC8C1, 0x6519, 0x9476, 0x651A, 0x9477, + 0x651B, 0x9478, 0x651C, 0x9479, 0x651D, 0x947A, 0x651E, 0x947B, + 0x651F, 0x947C, 0x6520, 0x947D, 0x6521, 0x947E, 0x6522, 0x9480, + 0x6523, 0x9481, 0x6524, 0x9482, 0x6525, 0xDFAC, 0x6526, 0x9483, + 0x6527, 0x9484, 0x6528, 0x9485, 0x6529, 0x9486, 0x652A, 0x9487, + 0x652B, 0xBEF0, 0x652C, 0x9488, 0x652D, 0x9489, 0x652E, 0xDFAD, + 0x652F, 0xD6A7, 0x6530, 0x948A, 0x6531, 0x948B, 0x6532, 0x948C, + 0x6533, 0x948D, 0x6534, 0xEAB7, 0x6535, 0xEBB6, 0x6536, 0xCAD5, + 0x6537, 0x948E, 0x6538, 0xD8FC, 0x6539, 0xB8C4, 0x653A, 0x948F, + 0x653B, 0xB9A5, 0x653C, 0x9490, 0x653D, 0x9491, 0x653E, 0xB7C5, + 0x653F, 0xD5FE, 0x6540, 0x9492, 0x6541, 0x9493, 0x6542, 0x9494, + 0x6543, 0x9495, 0x6544, 0x9496, 0x6545, 0xB9CA, 0x6546, 0x9497, + 0x6547, 0x9498, 0x6548, 0xD0A7, 0x6549, 0xF4CD, 0x654A, 0x9499, + 0x654B, 0x949A, 0x654C, 0xB5D0, 0x654D, 0x949B, 0x654E, 0x949C, + 0x654F, 0xC3F4, 0x6550, 0x949D, 0x6551, 0xBEC8, 0x6552, 0x949E, + 0x6553, 0x949F, 0x6554, 0x94A0, 0x6555, 0xEBB7, 0x6556, 0xB0BD, + 0x6557, 0x94A1, 0x6558, 0x94A2, 0x6559, 0xBDCC, 0x655A, 0x94A3, + 0x655B, 0xC1B2, 0x655C, 0x94A4, 0x655D, 0xB1D6, 0x655E, 0xB3A8, + 0x655F, 0x94A5, 0x6560, 0x94A6, 0x6561, 0x94A7, 0x6562, 0xB8D2, + 0x6563, 0xC9A2, 0x6564, 0x94A8, 0x6565, 0x94A9, 0x6566, 0xB6D8, + 0x6567, 0x94AA, 0x6568, 0x94AB, 0x6569, 0x94AC, 0x656A, 0x94AD, + 0x656B, 0xEBB8, 0x656C, 0xBEB4, 0x656D, 0x94AE, 0x656E, 0x94AF, + 0x656F, 0x94B0, 0x6570, 0xCAFD, 0x6571, 0x94B1, 0x6572, 0xC7C3, + 0x6573, 0x94B2, 0x6574, 0xD5FB, 0x6575, 0x94B3, 0x6576, 0x94B4, + 0x6577, 0xB7F3, 0x6578, 0x94B5, 0x6579, 0x94B6, 0x657A, 0x94B7, + 0x657B, 0x94B8, 0x657C, 0x94B9, 0x657D, 0x94BA, 0x657E, 0x94BB, + 0x657F, 0x94BC, 0x6580, 0x94BD, 0x6581, 0x94BE, 0x6582, 0x94BF, + 0x6583, 0x94C0, 0x6584, 0x94C1, 0x6585, 0x94C2, 0x6586, 0x94C3, + 0x6587, 0xCEC4, 0x6588, 0x94C4, 0x6589, 0x94C5, 0x658A, 0x94C6, + 0x658B, 0xD5AB, 0x658C, 0xB1F3, 0x658D, 0x94C7, 0x658E, 0x94C8, + 0x658F, 0x94C9, 0x6590, 0xECB3, 0x6591, 0xB0DF, 0x6592, 0x94CA, + 0x6593, 0xECB5, 0x6594, 0x94CB, 0x6595, 0x94CC, 0x6596, 0x94CD, + 0x6597, 0xB6B7, 0x6598, 0x94CE, 0x6599, 0xC1CF, 0x659A, 0x94CF, + 0x659B, 0xF5FA, 0x659C, 0xD0B1, 0x659D, 0x94D0, 0x659E, 0x94D1, + 0x659F, 0xD5E5, 0x65A0, 0x94D2, 0x65A1, 0xCED3, 0x65A2, 0x94D3, + 0x65A3, 0x94D4, 0x65A4, 0xBDEF, 0x65A5, 0xB3E2, 0x65A6, 0x94D5, + 0x65A7, 0xB8AB, 0x65A8, 0x94D6, 0x65A9, 0xD5B6, 0x65AA, 0x94D7, + 0x65AB, 0xEDBD, 0x65AC, 0x94D8, 0x65AD, 0xB6CF, 0x65AE, 0x94D9, + 0x65AF, 0xCBB9, 0x65B0, 0xD0C2, 0x65B1, 0x94DA, 0x65B2, 0x94DB, + 0x65B3, 0x94DC, 0x65B4, 0x94DD, 0x65B5, 0x94DE, 0x65B6, 0x94DF, + 0x65B7, 0x94E0, 0x65B8, 0x94E1, 0x65B9, 0xB7BD, 0x65BA, 0x94E2, + 0x65BB, 0x94E3, 0x65BC, 0xECB6, 0x65BD, 0xCAA9, 0x65BE, 0x94E4, + 0x65BF, 0x94E5, 0x65C0, 0x94E6, 0x65C1, 0xC5D4, 0x65C2, 0x94E7, + 0x65C3, 0xECB9, 0x65C4, 0xECB8, 0x65C5, 0xC2C3, 0x65C6, 0xECB7, + 0x65C7, 0x94E8, 0x65C8, 0x94E9, 0x65C9, 0x94EA, 0x65CA, 0x94EB, + 0x65CB, 0xD0FD, 0x65CC, 0xECBA, 0x65CD, 0x94EC, 0x65CE, 0xECBB, + 0x65CF, 0xD7E5, 0x65D0, 0x94ED, 0x65D1, 0x94EE, 0x65D2, 0xECBC, + 0x65D3, 0x94EF, 0x65D4, 0x94F0, 0x65D5, 0x94F1, 0x65D6, 0xECBD, + 0x65D7, 0xC6EC, 0x65D8, 0x94F2, 0x65D9, 0x94F3, 0x65DA, 0x94F4, + 0x65DB, 0x94F5, 0x65DC, 0x94F6, 0x65DD, 0x94F7, 0x65DE, 0x94F8, + 0x65DF, 0x94F9, 0x65E0, 0xCEDE, 0x65E1, 0x94FA, 0x65E2, 0xBCC8, + 0x65E3, 0x94FB, 0x65E4, 0x94FC, 0x65E5, 0xC8D5, 0x65E6, 0xB5A9, + 0x65E7, 0xBEC9, 0x65E8, 0xD6BC, 0x65E9, 0xD4E7, 0x65EA, 0x94FD, + 0x65EB, 0x94FE, 0x65EC, 0xD1AE, 0x65ED, 0xD0F1, 0x65EE, 0xEAB8, + 0x65EF, 0xEAB9, 0x65F0, 0xEABA, 0x65F1, 0xBAB5, 0x65F2, 0x9540, + 0x65F3, 0x9541, 0x65F4, 0x9542, 0x65F5, 0x9543, 0x65F6, 0xCAB1, + 0x65F7, 0xBFF5, 0x65F8, 0x9544, 0x65F9, 0x9545, 0x65FA, 0xCDFA, + 0x65FB, 0x9546, 0x65FC, 0x9547, 0x65FD, 0x9548, 0x65FE, 0x9549, + 0x65FF, 0x954A, 0x6600, 0xEAC0, 0x6601, 0x954B, 0x6602, 0xB0BA, + 0x6603, 0xEABE, 0x6604, 0x954C, 0x6605, 0x954D, 0x6606, 0xC0A5, + 0x6607, 0x954E, 0x6608, 0x954F, 0x6609, 0x9550, 0x660A, 0xEABB, + 0x660B, 0x9551, 0x660C, 0xB2FD, 0x660D, 0x9552, 0x660E, 0xC3F7, + 0x660F, 0xBBE8, 0x6610, 0x9553, 0x6611, 0x9554, 0x6612, 0x9555, + 0x6613, 0xD2D7, 0x6614, 0xCEF4, 0x6615, 0xEABF, 0x6616, 0x9556, + 0x6617, 0x9557, 0x6618, 0x9558, 0x6619, 0xEABC, 0x661A, 0x9559, + 0x661B, 0x955A, 0x661C, 0x955B, 0x661D, 0xEAC3, 0x661E, 0x955C, + 0x661F, 0xD0C7, 0x6620, 0xD3B3, 0x6621, 0x955D, 0x6622, 0x955E, + 0x6623, 0x955F, 0x6624, 0x9560, 0x6625, 0xB4BA, 0x6626, 0x9561, + 0x6627, 0xC3C1, 0x6628, 0xD7F2, 0x6629, 0x9562, 0x662A, 0x9563, + 0x662B, 0x9564, 0x662C, 0x9565, 0x662D, 0xD5D1, 0x662E, 0x9566, + 0x662F, 0xCAC7, 0x6630, 0x9567, 0x6631, 0xEAC5, 0x6632, 0x9568, + 0x6633, 0x9569, 0x6634, 0xEAC4, 0x6635, 0xEAC7, 0x6636, 0xEAC6, + 0x6637, 0x956A, 0x6638, 0x956B, 0x6639, 0x956C, 0x663A, 0x956D, + 0x663B, 0x956E, 0x663C, 0xD6E7, 0x663D, 0x956F, 0x663E, 0xCFD4, + 0x663F, 0x9570, 0x6640, 0x9571, 0x6641, 0xEACB, 0x6642, 0x9572, + 0x6643, 0xBBCE, 0x6644, 0x9573, 0x6645, 0x9574, 0x6646, 0x9575, + 0x6647, 0x9576, 0x6648, 0x9577, 0x6649, 0x9578, 0x664A, 0x9579, + 0x664B, 0xBDFA, 0x664C, 0xC9CE, 0x664D, 0x957A, 0x664E, 0x957B, + 0x664F, 0xEACC, 0x6650, 0x957C, 0x6651, 0x957D, 0x6652, 0xC9B9, + 0x6653, 0xCFFE, 0x6654, 0xEACA, 0x6655, 0xD4CE, 0x6656, 0xEACD, + 0x6657, 0xEACF, 0x6658, 0x957E, 0x6659, 0x9580, 0x665A, 0xCDED, + 0x665B, 0x9581, 0x665C, 0x9582, 0x665D, 0x9583, 0x665E, 0x9584, + 0x665F, 0xEAC9, 0x6660, 0x9585, 0x6661, 0xEACE, 0x6662, 0x9586, + 0x6663, 0x9587, 0x6664, 0xCEEE, 0x6665, 0x9588, 0x6666, 0xBBDE, + 0x6667, 0x9589, 0x6668, 0xB3BF, 0x6669, 0x958A, 0x666A, 0x958B, + 0x666B, 0x958C, 0x666C, 0x958D, 0x666D, 0x958E, 0x666E, 0xC6D5, + 0x666F, 0xBEB0, 0x6670, 0xCEFA, 0x6671, 0x958F, 0x6672, 0x9590, + 0x6673, 0x9591, 0x6674, 0xC7E7, 0x6675, 0x9592, 0x6676, 0xBEA7, + 0x6677, 0xEAD0, 0x6678, 0x9593, 0x6679, 0x9594, 0x667A, 0xD6C7, + 0x667B, 0x9595, 0x667C, 0x9596, 0x667D, 0x9597, 0x667E, 0xC1C0, + 0x667F, 0x9598, 0x6680, 0x9599, 0x6681, 0x959A, 0x6682, 0xD4DD, + 0x6683, 0x959B, 0x6684, 0xEAD1, 0x6685, 0x959C, 0x6686, 0x959D, + 0x6687, 0xCFBE, 0x6688, 0x959E, 0x6689, 0x959F, 0x668A, 0x95A0, + 0x668B, 0x95A1, 0x668C, 0xEAD2, 0x668D, 0x95A2, 0x668E, 0x95A3, + 0x668F, 0x95A4, 0x6690, 0x95A5, 0x6691, 0xCAEE, 0x6692, 0x95A6, + 0x6693, 0x95A7, 0x6694, 0x95A8, 0x6695, 0x95A9, 0x6696, 0xC5AF, + 0x6697, 0xB0B5, 0x6698, 0x95AA, 0x6699, 0x95AB, 0x669A, 0x95AC, + 0x669B, 0x95AD, 0x669C, 0x95AE, 0x669D, 0xEAD4, 0x669E, 0x95AF, + 0x669F, 0x95B0, 0x66A0, 0x95B1, 0x66A1, 0x95B2, 0x66A2, 0x95B3, + 0x66A3, 0x95B4, 0x66A4, 0x95B5, 0x66A5, 0x95B6, 0x66A6, 0x95B7, + 0x66A7, 0xEAD3, 0x66A8, 0xF4DF, 0x66A9, 0x95B8, 0x66AA, 0x95B9, + 0x66AB, 0x95BA, 0x66AC, 0x95BB, 0x66AD, 0x95BC, 0x66AE, 0xC4BA, + 0x66AF, 0x95BD, 0x66B0, 0x95BE, 0x66B1, 0x95BF, 0x66B2, 0x95C0, + 0x66B3, 0x95C1, 0x66B4, 0xB1A9, 0x66B5, 0x95C2, 0x66B6, 0x95C3, + 0x66B7, 0x95C4, 0x66B8, 0x95C5, 0x66B9, 0xE5DF, 0x66BA, 0x95C6, + 0x66BB, 0x95C7, 0x66BC, 0x95C8, 0x66BD, 0x95C9, 0x66BE, 0xEAD5, + 0x66BF, 0x95CA, 0x66C0, 0x95CB, 0x66C1, 0x95CC, 0x66C2, 0x95CD, + 0x66C3, 0x95CE, 0x66C4, 0x95CF, 0x66C5, 0x95D0, 0x66C6, 0x95D1, + 0x66C7, 0x95D2, 0x66C8, 0x95D3, 0x66C9, 0x95D4, 0x66CA, 0x95D5, + 0x66CB, 0x95D6, 0x66CC, 0x95D7, 0x66CD, 0x95D8, 0x66CE, 0x95D9, + 0x66CF, 0x95DA, 0x66D0, 0x95DB, 0x66D1, 0x95DC, 0x66D2, 0x95DD, + 0x66D3, 0x95DE, 0x66D4, 0x95DF, 0x66D5, 0x95E0, 0x66D6, 0x95E1, + 0x66D7, 0x95E2, 0x66D8, 0x95E3, 0x66D9, 0xCAEF, 0x66DA, 0x95E4, + 0x66DB, 0xEAD6, 0x66DC, 0xEAD7, 0x66DD, 0xC6D8, 0x66DE, 0x95E5, + 0x66DF, 0x95E6, 0x66E0, 0x95E7, 0x66E1, 0x95E8, 0x66E2, 0x95E9, + 0x66E3, 0x95EA, 0x66E4, 0x95EB, 0x66E5, 0x95EC, 0x66E6, 0xEAD8, + 0x66E7, 0x95ED, 0x66E8, 0x95EE, 0x66E9, 0xEAD9, 0x66EA, 0x95EF, + 0x66EB, 0x95F0, 0x66EC, 0x95F1, 0x66ED, 0x95F2, 0x66EE, 0x95F3, + 0x66EF, 0x95F4, 0x66F0, 0xD4BB, 0x66F1, 0x95F5, 0x66F2, 0xC7FA, + 0x66F3, 0xD2B7, 0x66F4, 0xB8FC, 0x66F5, 0x95F6, 0x66F6, 0x95F7, + 0x66F7, 0xEAC2, 0x66F8, 0x95F8, 0x66F9, 0xB2DC, 0x66FA, 0x95F9, + 0x66FB, 0x95FA, 0x66FC, 0xC2FC, 0x66FD, 0x95FB, 0x66FE, 0xD4F8, + 0x66FF, 0xCCE6, 0x6700, 0xD7EE, 0x6701, 0x95FC, 0x6702, 0x95FD, + 0x6703, 0x95FE, 0x6704, 0x9640, 0x6705, 0x9641, 0x6706, 0x9642, + 0x6707, 0x9643, 0x6708, 0xD4C2, 0x6709, 0xD3D0, 0x670A, 0xEBC3, + 0x670B, 0xC5F3, 0x670C, 0x9644, 0x670D, 0xB7FE, 0x670E, 0x9645, + 0x670F, 0x9646, 0x6710, 0xEBD4, 0x6711, 0x9647, 0x6712, 0x9648, + 0x6713, 0x9649, 0x6714, 0xCBB7, 0x6715, 0xEBDE, 0x6716, 0x964A, + 0x6717, 0xC0CA, 0x6718, 0x964B, 0x6719, 0x964C, 0x671A, 0x964D, + 0x671B, 0xCDFB, 0x671C, 0x964E, 0x671D, 0xB3AF, 0x671E, 0x964F, + 0x671F, 0xC6DA, 0x6720, 0x9650, 0x6721, 0x9651, 0x6722, 0x9652, + 0x6723, 0x9653, 0x6724, 0x9654, 0x6725, 0x9655, 0x6726, 0xEBFC, + 0x6727, 0x9656, 0x6728, 0xC4BE, 0x6729, 0x9657, 0x672A, 0xCEB4, + 0x672B, 0xC4A9, 0x672C, 0xB1BE, 0x672D, 0xD4FD, 0x672E, 0x9658, + 0x672F, 0xCAF5, 0x6730, 0x9659, 0x6731, 0xD6EC, 0x6732, 0x965A, + 0x6733, 0x965B, 0x6734, 0xC6D3, 0x6735, 0xB6E4, 0x6736, 0x965C, + 0x6737, 0x965D, 0x6738, 0x965E, 0x6739, 0x965F, 0x673A, 0xBBFA, + 0x673B, 0x9660, 0x673C, 0x9661, 0x673D, 0xD0E0, 0x673E, 0x9662, + 0x673F, 0x9663, 0x6740, 0xC9B1, 0x6741, 0x9664, 0x6742, 0xD4D3, + 0x6743, 0xC8A8, 0x6744, 0x9665, 0x6745, 0x9666, 0x6746, 0xB8CB, + 0x6747, 0x9667, 0x6748, 0xE8BE, 0x6749, 0xC9BC, 0x674A, 0x9668, + 0x674B, 0x9669, 0x674C, 0xE8BB, 0x674D, 0x966A, 0x674E, 0xC0EE, + 0x674F, 0xD0D3, 0x6750, 0xB2C4, 0x6751, 0xB4E5, 0x6752, 0x966B, + 0x6753, 0xE8BC, 0x6754, 0x966C, 0x6755, 0x966D, 0x6756, 0xD5C8, + 0x6757, 0x966E, 0x6758, 0x966F, 0x6759, 0x9670, 0x675A, 0x9671, + 0x675B, 0x9672, 0x675C, 0xB6C5, 0x675D, 0x9673, 0x675E, 0xE8BD, + 0x675F, 0xCAF8, 0x6760, 0xB8DC, 0x6761, 0xCCF5, 0x6762, 0x9674, + 0x6763, 0x9675, 0x6764, 0x9676, 0x6765, 0xC0B4, 0x6766, 0x9677, + 0x6767, 0x9678, 0x6768, 0xD1EE, 0x6769, 0xE8BF, 0x676A, 0xE8C2, + 0x676B, 0x9679, 0x676C, 0x967A, 0x676D, 0xBABC, 0x676E, 0x967B, + 0x676F, 0xB1AD, 0x6770, 0xBDDC, 0x6771, 0x967C, 0x6772, 0xEABD, + 0x6773, 0xE8C3, 0x6774, 0x967D, 0x6775, 0xE8C6, 0x6776, 0x967E, + 0x6777, 0xE8CB, 0x6778, 0x9680, 0x6779, 0x9681, 0x677A, 0x9682, + 0x677B, 0x9683, 0x677C, 0xE8CC, 0x677D, 0x9684, 0x677E, 0xCBC9, + 0x677F, 0xB0E5, 0x6780, 0x9685, 0x6781, 0xBCAB, 0x6782, 0x9686, + 0x6783, 0x9687, 0x6784, 0xB9B9, 0x6785, 0x9688, 0x6786, 0x9689, + 0x6787, 0xE8C1, 0x6788, 0x968A, 0x6789, 0xCDF7, 0x678A, 0x968B, + 0x678B, 0xE8CA, 0x678C, 0x968C, 0x678D, 0x968D, 0x678E, 0x968E, + 0x678F, 0x968F, 0x6790, 0xCEF6, 0x6791, 0x9690, 0x6792, 0x9691, + 0x6793, 0x9692, 0x6794, 0x9693, 0x6795, 0xD5ED, 0x6796, 0x9694, + 0x6797, 0xC1D6, 0x6798, 0xE8C4, 0x6799, 0x9695, 0x679A, 0xC3B6, + 0x679B, 0x9696, 0x679C, 0xB9FB, 0x679D, 0xD6A6, 0x679E, 0xE8C8, + 0x679F, 0x9697, 0x67A0, 0x9698, 0x67A1, 0x9699, 0x67A2, 0xCAE0, + 0x67A3, 0xD4E6, 0x67A4, 0x969A, 0x67A5, 0xE8C0, 0x67A6, 0x969B, + 0x67A7, 0xE8C5, 0x67A8, 0xE8C7, 0x67A9, 0x969C, 0x67AA, 0xC7B9, + 0x67AB, 0xB7E3, 0x67AC, 0x969D, 0x67AD, 0xE8C9, 0x67AE, 0x969E, + 0x67AF, 0xBFDD, 0x67B0, 0xE8D2, 0x67B1, 0x969F, 0x67B2, 0x96A0, + 0x67B3, 0xE8D7, 0x67B4, 0x96A1, 0x67B5, 0xE8D5, 0x67B6, 0xBCDC, + 0x67B7, 0xBCCF, 0x67B8, 0xE8DB, 0x67B9, 0x96A2, 0x67BA, 0x96A3, + 0x67BB, 0x96A4, 0x67BC, 0x96A5, 0x67BD, 0x96A6, 0x67BE, 0x96A7, + 0x67BF, 0x96A8, 0x67C0, 0x96A9, 0x67C1, 0xE8DE, 0x67C2, 0x96AA, + 0x67C3, 0xE8DA, 0x67C4, 0xB1FA, 0x67C5, 0x96AB, 0x67C6, 0x96AC, + 0x67C7, 0x96AD, 0x67C8, 0x96AE, 0x67C9, 0x96AF, 0x67CA, 0x96B0, + 0x67CB, 0x96B1, 0x67CC, 0x96B2, 0x67CD, 0x96B3, 0x67CE, 0x96B4, + 0x67CF, 0xB0D8, 0x67D0, 0xC4B3, 0x67D1, 0xB8CC, 0x67D2, 0xC6E2, + 0x67D3, 0xC8BE, 0x67D4, 0xC8E1, 0x67D5, 0x96B5, 0x67D6, 0x96B6, + 0x67D7, 0x96B7, 0x67D8, 0xE8CF, 0x67D9, 0xE8D4, 0x67DA, 0xE8D6, + 0x67DB, 0x96B8, 0x67DC, 0xB9F1, 0x67DD, 0xE8D8, 0x67DE, 0xD7F5, + 0x67DF, 0x96B9, 0x67E0, 0xC4FB, 0x67E1, 0x96BA, 0x67E2, 0xE8DC, + 0x67E3, 0x96BB, 0x67E4, 0x96BC, 0x67E5, 0xB2E9, 0x67E6, 0x96BD, + 0x67E7, 0x96BE, 0x67E8, 0x96BF, 0x67E9, 0xE8D1, 0x67EA, 0x96C0, + 0x67EB, 0x96C1, 0x67EC, 0xBCED, 0x67ED, 0x96C2, 0x67EE, 0x96C3, + 0x67EF, 0xBFC2, 0x67F0, 0xE8CD, 0x67F1, 0xD6F9, 0x67F2, 0x96C4, + 0x67F3, 0xC1F8, 0x67F4, 0xB2F1, 0x67F5, 0x96C5, 0x67F6, 0x96C6, + 0x67F7, 0x96C7, 0x67F8, 0x96C8, 0x67F9, 0x96C9, 0x67FA, 0x96CA, + 0x67FB, 0x96CB, 0x67FC, 0x96CC, 0x67FD, 0xE8DF, 0x67FE, 0x96CD, + 0x67FF, 0xCAC1, 0x6800, 0xE8D9, 0x6801, 0x96CE, 0x6802, 0x96CF, + 0x6803, 0x96D0, 0x6804, 0x96D1, 0x6805, 0xD5A4, 0x6806, 0x96D2, + 0x6807, 0xB1EA, 0x6808, 0xD5BB, 0x6809, 0xE8CE, 0x680A, 0xE8D0, + 0x680B, 0xB6B0, 0x680C, 0xE8D3, 0x680D, 0x96D3, 0x680E, 0xE8DD, + 0x680F, 0xC0B8, 0x6810, 0x96D4, 0x6811, 0xCAF7, 0x6812, 0x96D5, + 0x6813, 0xCBA8, 0x6814, 0x96D6, 0x6815, 0x96D7, 0x6816, 0xC6DC, + 0x6817, 0xC0F5, 0x6818, 0x96D8, 0x6819, 0x96D9, 0x681A, 0x96DA, + 0x681B, 0x96DB, 0x681C, 0x96DC, 0x681D, 0xE8E9, 0x681E, 0x96DD, + 0x681F, 0x96DE, 0x6820, 0x96DF, 0x6821, 0xD0A3, 0x6822, 0x96E0, + 0x6823, 0x96E1, 0x6824, 0x96E2, 0x6825, 0x96E3, 0x6826, 0x96E4, + 0x6827, 0x96E5, 0x6828, 0x96E6, 0x6829, 0xE8F2, 0x682A, 0xD6EA, + 0x682B, 0x96E7, 0x682C, 0x96E8, 0x682D, 0x96E9, 0x682E, 0x96EA, + 0x682F, 0x96EB, 0x6830, 0x96EC, 0x6831, 0x96ED, 0x6832, 0xE8E0, + 0x6833, 0xE8E1, 0x6834, 0x96EE, 0x6835, 0x96EF, 0x6836, 0x96F0, + 0x6837, 0xD1F9, 0x6838, 0xBACB, 0x6839, 0xB8F9, 0x683A, 0x96F1, + 0x683B, 0x96F2, 0x683C, 0xB8F1, 0x683D, 0xD4D4, 0x683E, 0xE8EF, + 0x683F, 0x96F3, 0x6840, 0xE8EE, 0x6841, 0xE8EC, 0x6842, 0xB9F0, + 0x6843, 0xCCD2, 0x6844, 0xE8E6, 0x6845, 0xCEA6, 0x6846, 0xBFF2, + 0x6847, 0x96F4, 0x6848, 0xB0B8, 0x6849, 0xE8F1, 0x684A, 0xE8F0, + 0x684B, 0x96F5, 0x684C, 0xD7C0, 0x684D, 0x96F6, 0x684E, 0xE8E4, + 0x684F, 0x96F7, 0x6850, 0xCDA9, 0x6851, 0xC9A3, 0x6852, 0x96F8, + 0x6853, 0xBBB8, 0x6854, 0xBDDB, 0x6855, 0xE8EA, 0x6856, 0x96F9, + 0x6857, 0x96FA, 0x6858, 0x96FB, 0x6859, 0x96FC, 0x685A, 0x96FD, + 0x685B, 0x96FE, 0x685C, 0x9740, 0x685D, 0x9741, 0x685E, 0x9742, + 0x685F, 0x9743, 0x6860, 0xE8E2, 0x6861, 0xE8E3, 0x6862, 0xE8E5, + 0x6863, 0xB5B5, 0x6864, 0xE8E7, 0x6865, 0xC7C5, 0x6866, 0xE8EB, + 0x6867, 0xE8ED, 0x6868, 0xBDB0, 0x6869, 0xD7AE, 0x686A, 0x9744, + 0x686B, 0xE8F8, 0x686C, 0x9745, 0x686D, 0x9746, 0x686E, 0x9747, + 0x686F, 0x9748, 0x6870, 0x9749, 0x6871, 0x974A, 0x6872, 0x974B, + 0x6873, 0x974C, 0x6874, 0xE8F5, 0x6875, 0x974D, 0x6876, 0xCDB0, + 0x6877, 0xE8F6, 0x6878, 0x974E, 0x6879, 0x974F, 0x687A, 0x9750, + 0x687B, 0x9751, 0x687C, 0x9752, 0x687D, 0x9753, 0x687E, 0x9754, + 0x687F, 0x9755, 0x6880, 0x9756, 0x6881, 0xC1BA, 0x6882, 0x9757, + 0x6883, 0xE8E8, 0x6884, 0x9758, 0x6885, 0xC3B7, 0x6886, 0xB0F0, + 0x6887, 0x9759, 0x6888, 0x975A, 0x6889, 0x975B, 0x688A, 0x975C, + 0x688B, 0x975D, 0x688C, 0x975E, 0x688D, 0x975F, 0x688E, 0x9760, + 0x688F, 0xE8F4, 0x6890, 0x9761, 0x6891, 0x9762, 0x6892, 0x9763, + 0x6893, 0xE8F7, 0x6894, 0x9764, 0x6895, 0x9765, 0x6896, 0x9766, + 0x6897, 0xB9A3, 0x6898, 0x9767, 0x6899, 0x9768, 0x689A, 0x9769, + 0x689B, 0x976A, 0x689C, 0x976B, 0x689D, 0x976C, 0x689E, 0x976D, + 0x689F, 0x976E, 0x68A0, 0x976F, 0x68A1, 0x9770, 0x68A2, 0xC9D2, + 0x68A3, 0x9771, 0x68A4, 0x9772, 0x68A5, 0x9773, 0x68A6, 0xC3CE, + 0x68A7, 0xCEE0, 0x68A8, 0xC0E6, 0x68A9, 0x9774, 0x68AA, 0x9775, + 0x68AB, 0x9776, 0x68AC, 0x9777, 0x68AD, 0xCBF3, 0x68AE, 0x9778, + 0x68AF, 0xCCDD, 0x68B0, 0xD0B5, 0x68B1, 0x9779, 0x68B2, 0x977A, + 0x68B3, 0xCAE1, 0x68B4, 0x977B, 0x68B5, 0xE8F3, 0x68B6, 0x977C, + 0x68B7, 0x977D, 0x68B8, 0x977E, 0x68B9, 0x9780, 0x68BA, 0x9781, + 0x68BB, 0x9782, 0x68BC, 0x9783, 0x68BD, 0x9784, 0x68BE, 0x9785, + 0x68BF, 0x9786, 0x68C0, 0xBCEC, 0x68C1, 0x9787, 0x68C2, 0xE8F9, + 0x68C3, 0x9788, 0x68C4, 0x9789, 0x68C5, 0x978A, 0x68C6, 0x978B, + 0x68C7, 0x978C, 0x68C8, 0x978D, 0x68C9, 0xC3DE, 0x68CA, 0x978E, + 0x68CB, 0xC6E5, 0x68CC, 0x978F, 0x68CD, 0xB9F7, 0x68CE, 0x9790, + 0x68CF, 0x9791, 0x68D0, 0x9792, 0x68D1, 0x9793, 0x68D2, 0xB0F4, + 0x68D3, 0x9794, 0x68D4, 0x9795, 0x68D5, 0xD7D8, 0x68D6, 0x9796, + 0x68D7, 0x9797, 0x68D8, 0xBCAC, 0x68D9, 0x9798, 0x68DA, 0xC5EF, + 0x68DB, 0x9799, 0x68DC, 0x979A, 0x68DD, 0x979B, 0x68DE, 0x979C, + 0x68DF, 0x979D, 0x68E0, 0xCCC4, 0x68E1, 0x979E, 0x68E2, 0x979F, + 0x68E3, 0xE9A6, 0x68E4, 0x97A0, 0x68E5, 0x97A1, 0x68E6, 0x97A2, + 0x68E7, 0x97A3, 0x68E8, 0x97A4, 0x68E9, 0x97A5, 0x68EA, 0x97A6, + 0x68EB, 0x97A7, 0x68EC, 0x97A8, 0x68ED, 0x97A9, 0x68EE, 0xC9AD, + 0x68EF, 0x97AA, 0x68F0, 0xE9A2, 0x68F1, 0xC0E2, 0x68F2, 0x97AB, + 0x68F3, 0x97AC, 0x68F4, 0x97AD, 0x68F5, 0xBFC3, 0x68F6, 0x97AE, + 0x68F7, 0x97AF, 0x68F8, 0x97B0, 0x68F9, 0xE8FE, 0x68FA, 0xB9D7, + 0x68FB, 0x97B1, 0x68FC, 0xE8FB, 0x68FD, 0x97B2, 0x68FE, 0x97B3, + 0x68FF, 0x97B4, 0x6900, 0x97B5, 0x6901, 0xE9A4, 0x6902, 0x97B6, + 0x6903, 0x97B7, 0x6904, 0x97B8, 0x6905, 0xD2CE, 0x6906, 0x97B9, + 0x6907, 0x97BA, 0x6908, 0x97BB, 0x6909, 0x97BC, 0x690A, 0x97BD, + 0x690B, 0xE9A3, 0x690C, 0x97BE, 0x690D, 0xD6B2, 0x690E, 0xD7B5, + 0x690F, 0x97BF, 0x6910, 0xE9A7, 0x6911, 0x97C0, 0x6912, 0xBDB7, + 0x6913, 0x97C1, 0x6914, 0x97C2, 0x6915, 0x97C3, 0x6916, 0x97C4, + 0x6917, 0x97C5, 0x6918, 0x97C6, 0x6919, 0x97C7, 0x691A, 0x97C8, + 0x691B, 0x97C9, 0x691C, 0x97CA, 0x691D, 0x97CB, 0x691E, 0x97CC, + 0x691F, 0xE8FC, 0x6920, 0xE8FD, 0x6921, 0x97CD, 0x6922, 0x97CE, + 0x6923, 0x97CF, 0x6924, 0xE9A1, 0x6925, 0x97D0, 0x6926, 0x97D1, + 0x6927, 0x97D2, 0x6928, 0x97D3, 0x6929, 0x97D4, 0x692A, 0x97D5, + 0x692B, 0x97D6, 0x692C, 0x97D7, 0x692D, 0xCDD6, 0x692E, 0x97D8, + 0x692F, 0x97D9, 0x6930, 0xD2AC, 0x6931, 0x97DA, 0x6932, 0x97DB, + 0x6933, 0x97DC, 0x6934, 0xE9B2, 0x6935, 0x97DD, 0x6936, 0x97DE, + 0x6937, 0x97DF, 0x6938, 0x97E0, 0x6939, 0xE9A9, 0x693A, 0x97E1, + 0x693B, 0x97E2, 0x693C, 0x97E3, 0x693D, 0xB4AA, 0x693E, 0x97E4, + 0x693F, 0xB4BB, 0x6940, 0x97E5, 0x6941, 0x97E6, 0x6942, 0xE9AB, + 0x6943, 0x97E7, 0x6944, 0x97E8, 0x6945, 0x97E9, 0x6946, 0x97EA, + 0x6947, 0x97EB, 0x6948, 0x97EC, 0x6949, 0x97ED, 0x694A, 0x97EE, + 0x694B, 0x97EF, 0x694C, 0x97F0, 0x694D, 0x97F1, 0x694E, 0x97F2, + 0x694F, 0x97F3, 0x6950, 0x97F4, 0x6951, 0x97F5, 0x6952, 0x97F6, + 0x6953, 0x97F7, 0x6954, 0xD0A8, 0x6955, 0x97F8, 0x6956, 0x97F9, + 0x6957, 0xE9A5, 0x6958, 0x97FA, 0x6959, 0x97FB, 0x695A, 0xB3FE, + 0x695B, 0x97FC, 0x695C, 0x97FD, 0x695D, 0xE9AC, 0x695E, 0xC0E3, + 0x695F, 0x97FE, 0x6960, 0xE9AA, 0x6961, 0x9840, 0x6962, 0x9841, + 0x6963, 0xE9B9, 0x6964, 0x9842, 0x6965, 0x9843, 0x6966, 0xE9B8, + 0x6967, 0x9844, 0x6968, 0x9845, 0x6969, 0x9846, 0x696A, 0x9847, + 0x696B, 0xE9AE, 0x696C, 0x9848, 0x696D, 0x9849, 0x696E, 0xE8FA, + 0x696F, 0x984A, 0x6970, 0x984B, 0x6971, 0xE9A8, 0x6972, 0x984C, + 0x6973, 0x984D, 0x6974, 0x984E, 0x6975, 0x984F, 0x6976, 0x9850, + 0x6977, 0xBFAC, 0x6978, 0xE9B1, 0x6979, 0xE9BA, 0x697A, 0x9851, + 0x697B, 0x9852, 0x697C, 0xC2A5, 0x697D, 0x9853, 0x697E, 0x9854, + 0x697F, 0x9855, 0x6980, 0xE9AF, 0x6981, 0x9856, 0x6982, 0xB8C5, + 0x6983, 0x9857, 0x6984, 0xE9AD, 0x6985, 0x9858, 0x6986, 0xD3DC, + 0x6987, 0xE9B4, 0x6988, 0xE9B5, 0x6989, 0xE9B7, 0x698A, 0x9859, + 0x698B, 0x985A, 0x698C, 0x985B, 0x698D, 0xE9C7, 0x698E, 0x985C, + 0x698F, 0x985D, 0x6990, 0x985E, 0x6991, 0x985F, 0x6992, 0x9860, + 0x6993, 0x9861, 0x6994, 0xC0C6, 0x6995, 0xE9C5, 0x6996, 0x9862, + 0x6997, 0x9863, 0x6998, 0xE9B0, 0x6999, 0x9864, 0x699A, 0x9865, + 0x699B, 0xE9BB, 0x699C, 0xB0F1, 0x699D, 0x9866, 0x699E, 0x9867, + 0x699F, 0x9868, 0x69A0, 0x9869, 0x69A1, 0x986A, 0x69A2, 0x986B, + 0x69A3, 0x986C, 0x69A4, 0x986D, 0x69A5, 0x986E, 0x69A6, 0x986F, + 0x69A7, 0xE9BC, 0x69A8, 0xD5A5, 0x69A9, 0x9870, 0x69AA, 0x9871, + 0x69AB, 0xE9BE, 0x69AC, 0x9872, 0x69AD, 0xE9BF, 0x69AE, 0x9873, + 0x69AF, 0x9874, 0x69B0, 0x9875, 0x69B1, 0xE9C1, 0x69B2, 0x9876, + 0x69B3, 0x9877, 0x69B4, 0xC1F1, 0x69B5, 0x9878, 0x69B6, 0x9879, + 0x69B7, 0xC8B6, 0x69B8, 0x987A, 0x69B9, 0x987B, 0x69BA, 0x987C, + 0x69BB, 0xE9BD, 0x69BC, 0x987D, 0x69BD, 0x987E, 0x69BE, 0x9880, + 0x69BF, 0x9881, 0x69C0, 0x9882, 0x69C1, 0xE9C2, 0x69C2, 0x9883, + 0x69C3, 0x9884, 0x69C4, 0x9885, 0x69C5, 0x9886, 0x69C6, 0x9887, + 0x69C7, 0x9888, 0x69C8, 0x9889, 0x69C9, 0x988A, 0x69CA, 0xE9C3, + 0x69CB, 0x988B, 0x69CC, 0xE9B3, 0x69CD, 0x988C, 0x69CE, 0xE9B6, + 0x69CF, 0x988D, 0x69D0, 0xBBB1, 0x69D1, 0x988E, 0x69D2, 0x988F, + 0x69D3, 0x9890, 0x69D4, 0xE9C0, 0x69D5, 0x9891, 0x69D6, 0x9892, + 0x69D7, 0x9893, 0x69D8, 0x9894, 0x69D9, 0x9895, 0x69DA, 0x9896, + 0x69DB, 0xBCF7, 0x69DC, 0x9897, 0x69DD, 0x9898, 0x69DE, 0x9899, + 0x69DF, 0xE9C4, 0x69E0, 0xE9C6, 0x69E1, 0x989A, 0x69E2, 0x989B, + 0x69E3, 0x989C, 0x69E4, 0x989D, 0x69E5, 0x989E, 0x69E6, 0x989F, + 0x69E7, 0x98A0, 0x69E8, 0x98A1, 0x69E9, 0x98A2, 0x69EA, 0x98A3, + 0x69EB, 0x98A4, 0x69EC, 0x98A5, 0x69ED, 0xE9CA, 0x69EE, 0x98A6, + 0x69EF, 0x98A7, 0x69F0, 0x98A8, 0x69F1, 0x98A9, 0x69F2, 0xE9CE, + 0x69F3, 0x98AA, 0x69F4, 0x98AB, 0x69F5, 0x98AC, 0x69F6, 0x98AD, + 0x69F7, 0x98AE, 0x69F8, 0x98AF, 0x69F9, 0x98B0, 0x69FA, 0x98B1, + 0x69FB, 0x98B2, 0x69FC, 0x98B3, 0x69FD, 0xB2DB, 0x69FE, 0x98B4, + 0x69FF, 0xE9C8, 0x6A00, 0x98B5, 0x6A01, 0x98B6, 0x6A02, 0x98B7, + 0x6A03, 0x98B8, 0x6A04, 0x98B9, 0x6A05, 0x98BA, 0x6A06, 0x98BB, + 0x6A07, 0x98BC, 0x6A08, 0x98BD, 0x6A09, 0x98BE, 0x6A0A, 0xB7AE, + 0x6A0B, 0x98BF, 0x6A0C, 0x98C0, 0x6A0D, 0x98C1, 0x6A0E, 0x98C2, + 0x6A0F, 0x98C3, 0x6A10, 0x98C4, 0x6A11, 0x98C5, 0x6A12, 0x98C6, + 0x6A13, 0x98C7, 0x6A14, 0x98C8, 0x6A15, 0x98C9, 0x6A16, 0x98CA, + 0x6A17, 0xE9CB, 0x6A18, 0xE9CC, 0x6A19, 0x98CB, 0x6A1A, 0x98CC, + 0x6A1B, 0x98CD, 0x6A1C, 0x98CE, 0x6A1D, 0x98CF, 0x6A1E, 0x98D0, + 0x6A1F, 0xD5C1, 0x6A20, 0x98D1, 0x6A21, 0xC4A3, 0x6A22, 0x98D2, + 0x6A23, 0x98D3, 0x6A24, 0x98D4, 0x6A25, 0x98D5, 0x6A26, 0x98D6, + 0x6A27, 0x98D7, 0x6A28, 0xE9D8, 0x6A29, 0x98D8, 0x6A2A, 0xBAE1, + 0x6A2B, 0x98D9, 0x6A2C, 0x98DA, 0x6A2D, 0x98DB, 0x6A2E, 0x98DC, + 0x6A2F, 0xE9C9, 0x6A30, 0x98DD, 0x6A31, 0xD3A3, 0x6A32, 0x98DE, + 0x6A33, 0x98DF, 0x6A34, 0x98E0, 0x6A35, 0xE9D4, 0x6A36, 0x98E1, + 0x6A37, 0x98E2, 0x6A38, 0x98E3, 0x6A39, 0x98E4, 0x6A3A, 0x98E5, + 0x6A3B, 0x98E6, 0x6A3C, 0x98E7, 0x6A3D, 0xE9D7, 0x6A3E, 0xE9D0, + 0x6A3F, 0x98E8, 0x6A40, 0x98E9, 0x6A41, 0x98EA, 0x6A42, 0x98EB, + 0x6A43, 0x98EC, 0x6A44, 0xE9CF, 0x6A45, 0x98ED, 0x6A46, 0x98EE, + 0x6A47, 0xC7C1, 0x6A48, 0x98EF, 0x6A49, 0x98F0, 0x6A4A, 0x98F1, + 0x6A4B, 0x98F2, 0x6A4C, 0x98F3, 0x6A4D, 0x98F4, 0x6A4E, 0x98F5, + 0x6A4F, 0x98F6, 0x6A50, 0xE9D2, 0x6A51, 0x98F7, 0x6A52, 0x98F8, + 0x6A53, 0x98F9, 0x6A54, 0x98FA, 0x6A55, 0x98FB, 0x6A56, 0x98FC, + 0x6A57, 0x98FD, 0x6A58, 0xE9D9, 0x6A59, 0xB3C8, 0x6A5A, 0x98FE, + 0x6A5B, 0xE9D3, 0x6A5C, 0x9940, 0x6A5D, 0x9941, 0x6A5E, 0x9942, + 0x6A5F, 0x9943, 0x6A60, 0x9944, 0x6A61, 0xCFF0, 0x6A62, 0x9945, + 0x6A63, 0x9946, 0x6A64, 0x9947, 0x6A65, 0xE9CD, 0x6A66, 0x9948, + 0x6A67, 0x9949, 0x6A68, 0x994A, 0x6A69, 0x994B, 0x6A6A, 0x994C, + 0x6A6B, 0x994D, 0x6A6C, 0x994E, 0x6A6D, 0x994F, 0x6A6E, 0x9950, + 0x6A6F, 0x9951, 0x6A70, 0x9952, 0x6A71, 0xB3F7, 0x6A72, 0x9953, + 0x6A73, 0x9954, 0x6A74, 0x9955, 0x6A75, 0x9956, 0x6A76, 0x9957, + 0x6A77, 0x9958, 0x6A78, 0x9959, 0x6A79, 0xE9D6, 0x6A7A, 0x995A, + 0x6A7B, 0x995B, 0x6A7C, 0xE9DA, 0x6A7D, 0x995C, 0x6A7E, 0x995D, + 0x6A7F, 0x995E, 0x6A80, 0xCCB4, 0x6A81, 0x995F, 0x6A82, 0x9960, + 0x6A83, 0x9961, 0x6A84, 0xCFAD, 0x6A85, 0x9962, 0x6A86, 0x9963, + 0x6A87, 0x9964, 0x6A88, 0x9965, 0x6A89, 0x9966, 0x6A8A, 0x9967, + 0x6A8B, 0x9968, 0x6A8C, 0x9969, 0x6A8D, 0x996A, 0x6A8E, 0xE9D5, + 0x6A8F, 0x996B, 0x6A90, 0xE9DC, 0x6A91, 0xE9DB, 0x6A92, 0x996C, + 0x6A93, 0x996D, 0x6A94, 0x996E, 0x6A95, 0x996F, 0x6A96, 0x9970, + 0x6A97, 0xE9DE, 0x6A98, 0x9971, 0x6A99, 0x9972, 0x6A9A, 0x9973, + 0x6A9B, 0x9974, 0x6A9C, 0x9975, 0x6A9D, 0x9976, 0x6A9E, 0x9977, + 0x6A9F, 0x9978, 0x6AA0, 0xE9D1, 0x6AA1, 0x9979, 0x6AA2, 0x997A, + 0x6AA3, 0x997B, 0x6AA4, 0x997C, 0x6AA5, 0x997D, 0x6AA6, 0x997E, + 0x6AA7, 0x9980, 0x6AA8, 0x9981, 0x6AA9, 0xE9DD, 0x6AAA, 0x9982, + 0x6AAB, 0xE9DF, 0x6AAC, 0xC3CA, 0x6AAD, 0x9983, 0x6AAE, 0x9984, + 0x6AAF, 0x9985, 0x6AB0, 0x9986, 0x6AB1, 0x9987, 0x6AB2, 0x9988, + 0x6AB3, 0x9989, 0x6AB4, 0x998A, 0x6AB5, 0x998B, 0x6AB6, 0x998C, + 0x6AB7, 0x998D, 0x6AB8, 0x998E, 0x6AB9, 0x998F, 0x6ABA, 0x9990, + 0x6ABB, 0x9991, 0x6ABC, 0x9992, 0x6ABD, 0x9993, 0x6ABE, 0x9994, + 0x6ABF, 0x9995, 0x6AC0, 0x9996, 0x6AC1, 0x9997, 0x6AC2, 0x9998, + 0x6AC3, 0x9999, 0x6AC4, 0x999A, 0x6AC5, 0x999B, 0x6AC6, 0x999C, + 0x6AC7, 0x999D, 0x6AC8, 0x999E, 0x6AC9, 0x999F, 0x6ACA, 0x99A0, + 0x6ACB, 0x99A1, 0x6ACC, 0x99A2, 0x6ACD, 0x99A3, 0x6ACE, 0x99A4, + 0x6ACF, 0x99A5, 0x6AD0, 0x99A6, 0x6AD1, 0x99A7, 0x6AD2, 0x99A8, + 0x6AD3, 0x99A9, 0x6AD4, 0x99AA, 0x6AD5, 0x99AB, 0x6AD6, 0x99AC, + 0x6AD7, 0x99AD, 0x6AD8, 0x99AE, 0x6AD9, 0x99AF, 0x6ADA, 0x99B0, + 0x6ADB, 0x99B1, 0x6ADC, 0x99B2, 0x6ADD, 0x99B3, 0x6ADE, 0x99B4, + 0x6ADF, 0x99B5, 0x6AE0, 0x99B6, 0x6AE1, 0x99B7, 0x6AE2, 0x99B8, + 0x6AE3, 0x99B9, 0x6AE4, 0x99BA, 0x6AE5, 0x99BB, 0x6AE6, 0x99BC, + 0x6AE7, 0x99BD, 0x6AE8, 0x99BE, 0x6AE9, 0x99BF, 0x6AEA, 0x99C0, + 0x6AEB, 0x99C1, 0x6AEC, 0x99C2, 0x6AED, 0x99C3, 0x6AEE, 0x99C4, + 0x6AEF, 0x99C5, 0x6AF0, 0x99C6, 0x6AF1, 0x99C7, 0x6AF2, 0x99C8, + 0x6AF3, 0x99C9, 0x6AF4, 0x99CA, 0x6AF5, 0x99CB, 0x6AF6, 0x99CC, + 0x6AF7, 0x99CD, 0x6AF8, 0x99CE, 0x6AF9, 0x99CF, 0x6AFA, 0x99D0, + 0x6AFB, 0x99D1, 0x6AFC, 0x99D2, 0x6AFD, 0x99D3, 0x6AFE, 0x99D4, + 0x6AFF, 0x99D5, 0x6B00, 0x99D6, 0x6B01, 0x99D7, 0x6B02, 0x99D8, + 0x6B03, 0x99D9, 0x6B04, 0x99DA, 0x6B05, 0x99DB, 0x6B06, 0x99DC, + 0x6B07, 0x99DD, 0x6B08, 0x99DE, 0x6B09, 0x99DF, 0x6B0A, 0x99E0, + 0x6B0B, 0x99E1, 0x6B0C, 0x99E2, 0x6B0D, 0x99E3, 0x6B0E, 0x99E4, + 0x6B0F, 0x99E5, 0x6B10, 0x99E6, 0x6B11, 0x99E7, 0x6B12, 0x99E8, + 0x6B13, 0x99E9, 0x6B14, 0x99EA, 0x6B15, 0x99EB, 0x6B16, 0x99EC, + 0x6B17, 0x99ED, 0x6B18, 0x99EE, 0x6B19, 0x99EF, 0x6B1A, 0x99F0, + 0x6B1B, 0x99F1, 0x6B1C, 0x99F2, 0x6B1D, 0x99F3, 0x6B1E, 0x99F4, + 0x6B1F, 0x99F5, 0x6B20, 0xC7B7, 0x6B21, 0xB4CE, 0x6B22, 0xBBB6, + 0x6B23, 0xD0C0, 0x6B24, 0xECA3, 0x6B25, 0x99F6, 0x6B26, 0x99F7, + 0x6B27, 0xC5B7, 0x6B28, 0x99F8, 0x6B29, 0x99F9, 0x6B2A, 0x99FA, + 0x6B2B, 0x99FB, 0x6B2C, 0x99FC, 0x6B2D, 0x99FD, 0x6B2E, 0x99FE, + 0x6B2F, 0x9A40, 0x6B30, 0x9A41, 0x6B31, 0x9A42, 0x6B32, 0xD3FB, + 0x6B33, 0x9A43, 0x6B34, 0x9A44, 0x6B35, 0x9A45, 0x6B36, 0x9A46, + 0x6B37, 0xECA4, 0x6B38, 0x9A47, 0x6B39, 0xECA5, 0x6B3A, 0xC6DB, + 0x6B3B, 0x9A48, 0x6B3C, 0x9A49, 0x6B3D, 0x9A4A, 0x6B3E, 0xBFEE, + 0x6B3F, 0x9A4B, 0x6B40, 0x9A4C, 0x6B41, 0x9A4D, 0x6B42, 0x9A4E, + 0x6B43, 0xECA6, 0x6B44, 0x9A4F, 0x6B45, 0x9A50, 0x6B46, 0xECA7, + 0x6B47, 0xD0AA, 0x6B48, 0x9A51, 0x6B49, 0xC7B8, 0x6B4A, 0x9A52, + 0x6B4B, 0x9A53, 0x6B4C, 0xB8E8, 0x6B4D, 0x9A54, 0x6B4E, 0x9A55, + 0x6B4F, 0x9A56, 0x6B50, 0x9A57, 0x6B51, 0x9A58, 0x6B52, 0x9A59, + 0x6B53, 0x9A5A, 0x6B54, 0x9A5B, 0x6B55, 0x9A5C, 0x6B56, 0x9A5D, + 0x6B57, 0x9A5E, 0x6B58, 0x9A5F, 0x6B59, 0xECA8, 0x6B5A, 0x9A60, + 0x6B5B, 0x9A61, 0x6B5C, 0x9A62, 0x6B5D, 0x9A63, 0x6B5E, 0x9A64, + 0x6B5F, 0x9A65, 0x6B60, 0x9A66, 0x6B61, 0x9A67, 0x6B62, 0xD6B9, + 0x6B63, 0xD5FD, 0x6B64, 0xB4CB, 0x6B65, 0xB2BD, 0x6B66, 0xCEE4, + 0x6B67, 0xC6E7, 0x6B68, 0x9A68, 0x6B69, 0x9A69, 0x6B6A, 0xCDE1, + 0x6B6B, 0x9A6A, 0x6B6C, 0x9A6B, 0x6B6D, 0x9A6C, 0x6B6E, 0x9A6D, + 0x6B6F, 0x9A6E, 0x6B70, 0x9A6F, 0x6B71, 0x9A70, 0x6B72, 0x9A71, + 0x6B73, 0x9A72, 0x6B74, 0x9A73, 0x6B75, 0x9A74, 0x6B76, 0x9A75, + 0x6B77, 0x9A76, 0x6B78, 0x9A77, 0x6B79, 0xB4F5, 0x6B7A, 0x9A78, + 0x6B7B, 0xCBC0, 0x6B7C, 0xBCDF, 0x6B7D, 0x9A79, 0x6B7E, 0x9A7A, + 0x6B7F, 0x9A7B, 0x6B80, 0x9A7C, 0x6B81, 0xE9E2, 0x6B82, 0xE9E3, + 0x6B83, 0xD1EA, 0x6B84, 0xE9E5, 0x6B85, 0x9A7D, 0x6B86, 0xB4F9, + 0x6B87, 0xE9E4, 0x6B88, 0x9A7E, 0x6B89, 0xD1B3, 0x6B8A, 0xCAE2, + 0x6B8B, 0xB2D0, 0x6B8C, 0x9A80, 0x6B8D, 0xE9E8, 0x6B8E, 0x9A81, + 0x6B8F, 0x9A82, 0x6B90, 0x9A83, 0x6B91, 0x9A84, 0x6B92, 0xE9E6, + 0x6B93, 0xE9E7, 0x6B94, 0x9A85, 0x6B95, 0x9A86, 0x6B96, 0xD6B3, + 0x6B97, 0x9A87, 0x6B98, 0x9A88, 0x6B99, 0x9A89, 0x6B9A, 0xE9E9, + 0x6B9B, 0xE9EA, 0x6B9C, 0x9A8A, 0x6B9D, 0x9A8B, 0x6B9E, 0x9A8C, + 0x6B9F, 0x9A8D, 0x6BA0, 0x9A8E, 0x6BA1, 0xE9EB, 0x6BA2, 0x9A8F, + 0x6BA3, 0x9A90, 0x6BA4, 0x9A91, 0x6BA5, 0x9A92, 0x6BA6, 0x9A93, + 0x6BA7, 0x9A94, 0x6BA8, 0x9A95, 0x6BA9, 0x9A96, 0x6BAA, 0xE9EC, + 0x6BAB, 0x9A97, 0x6BAC, 0x9A98, 0x6BAD, 0x9A99, 0x6BAE, 0x9A9A, + 0x6BAF, 0x9A9B, 0x6BB0, 0x9A9C, 0x6BB1, 0x9A9D, 0x6BB2, 0x9A9E, + 0x6BB3, 0xECAF, 0x6BB4, 0xC5B9, 0x6BB5, 0xB6CE, 0x6BB6, 0x9A9F, + 0x6BB7, 0xD2F3, 0x6BB8, 0x9AA0, 0x6BB9, 0x9AA1, 0x6BBA, 0x9AA2, + 0x6BBB, 0x9AA3, 0x6BBC, 0x9AA4, 0x6BBD, 0x9AA5, 0x6BBE, 0x9AA6, + 0x6BBF, 0xB5EE, 0x6BC0, 0x9AA7, 0x6BC1, 0xBBD9, 0x6BC2, 0xECB1, + 0x6BC3, 0x9AA8, 0x6BC4, 0x9AA9, 0x6BC5, 0xD2E3, 0x6BC6, 0x9AAA, + 0x6BC7, 0x9AAB, 0x6BC8, 0x9AAC, 0x6BC9, 0x9AAD, 0x6BCA, 0x9AAE, + 0x6BCB, 0xCEE3, 0x6BCC, 0x9AAF, 0x6BCD, 0xC4B8, 0x6BCE, 0x9AB0, + 0x6BCF, 0xC3BF, 0x6BD0, 0x9AB1, 0x6BD1, 0x9AB2, 0x6BD2, 0xB6BE, + 0x6BD3, 0xD8B9, 0x6BD4, 0xB1C8, 0x6BD5, 0xB1CF, 0x6BD6, 0xB1D1, + 0x6BD7, 0xC5FE, 0x6BD8, 0x9AB3, 0x6BD9, 0xB1D0, 0x6BDA, 0x9AB4, + 0x6BDB, 0xC3AB, 0x6BDC, 0x9AB5, 0x6BDD, 0x9AB6, 0x6BDE, 0x9AB7, + 0x6BDF, 0x9AB8, 0x6BE0, 0x9AB9, 0x6BE1, 0xD5B1, 0x6BE2, 0x9ABA, + 0x6BE3, 0x9ABB, 0x6BE4, 0x9ABC, 0x6BE5, 0x9ABD, 0x6BE6, 0x9ABE, + 0x6BE7, 0x9ABF, 0x6BE8, 0x9AC0, 0x6BE9, 0x9AC1, 0x6BEA, 0xEBA4, + 0x6BEB, 0xBAC1, 0x6BEC, 0x9AC2, 0x6BED, 0x9AC3, 0x6BEE, 0x9AC4, + 0x6BEF, 0xCCBA, 0x6BF0, 0x9AC5, 0x6BF1, 0x9AC6, 0x6BF2, 0x9AC7, + 0x6BF3, 0xEBA5, 0x6BF4, 0x9AC8, 0x6BF5, 0xEBA7, 0x6BF6, 0x9AC9, + 0x6BF7, 0x9ACA, 0x6BF8, 0x9ACB, 0x6BF9, 0xEBA8, 0x6BFA, 0x9ACC, + 0x6BFB, 0x9ACD, 0x6BFC, 0x9ACE, 0x6BFD, 0xEBA6, 0x6BFE, 0x9ACF, + 0x6BFF, 0x9AD0, 0x6C00, 0x9AD1, 0x6C01, 0x9AD2, 0x6C02, 0x9AD3, + 0x6C03, 0x9AD4, 0x6C04, 0x9AD5, 0x6C05, 0xEBA9, 0x6C06, 0xEBAB, + 0x6C07, 0xEBAA, 0x6C08, 0x9AD6, 0x6C09, 0x9AD7, 0x6C0A, 0x9AD8, + 0x6C0B, 0x9AD9, 0x6C0C, 0x9ADA, 0x6C0D, 0xEBAC, 0x6C0E, 0x9ADB, + 0x6C0F, 0xCACF, 0x6C10, 0xD8B5, 0x6C11, 0xC3F1, 0x6C12, 0x9ADC, + 0x6C13, 0xC3A5, 0x6C14, 0xC6F8, 0x6C15, 0xEBAD, 0x6C16, 0xC4CA, + 0x6C17, 0x9ADD, 0x6C18, 0xEBAE, 0x6C19, 0xEBAF, 0x6C1A, 0xEBB0, + 0x6C1B, 0xB7D5, 0x6C1C, 0x9ADE, 0x6C1D, 0x9ADF, 0x6C1E, 0x9AE0, + 0x6C1F, 0xB7FA, 0x6C20, 0x9AE1, 0x6C21, 0xEBB1, 0x6C22, 0xC7E2, + 0x6C23, 0x9AE2, 0x6C24, 0xEBB3, 0x6C25, 0x9AE3, 0x6C26, 0xBAA4, + 0x6C27, 0xD1F5, 0x6C28, 0xB0B1, 0x6C29, 0xEBB2, 0x6C2A, 0xEBB4, + 0x6C2B, 0x9AE4, 0x6C2C, 0x9AE5, 0x6C2D, 0x9AE6, 0x6C2E, 0xB5AA, + 0x6C2F, 0xC2C8, 0x6C30, 0xC7E8, 0x6C31, 0x9AE7, 0x6C32, 0xEBB5, + 0x6C33, 0x9AE8, 0x6C34, 0xCBAE, 0x6C35, 0xE3DF, 0x6C36, 0x9AE9, + 0x6C37, 0x9AEA, 0x6C38, 0xD3C0, 0x6C39, 0x9AEB, 0x6C3A, 0x9AEC, + 0x6C3B, 0x9AED, 0x6C3C, 0x9AEE, 0x6C3D, 0xD9DB, 0x6C3E, 0x9AEF, + 0x6C3F, 0x9AF0, 0x6C40, 0xCDA1, 0x6C41, 0xD6AD, 0x6C42, 0xC7F3, + 0x6C43, 0x9AF1, 0x6C44, 0x9AF2, 0x6C45, 0x9AF3, 0x6C46, 0xD9E0, + 0x6C47, 0xBBE3, 0x6C48, 0x9AF4, 0x6C49, 0xBABA, 0x6C4A, 0xE3E2, + 0x6C4B, 0x9AF5, 0x6C4C, 0x9AF6, 0x6C4D, 0x9AF7, 0x6C4E, 0x9AF8, + 0x6C4F, 0x9AF9, 0x6C50, 0xCFAB, 0x6C51, 0x9AFA, 0x6C52, 0x9AFB, + 0x6C53, 0x9AFC, 0x6C54, 0xE3E0, 0x6C55, 0xC9C7, 0x6C56, 0x9AFD, + 0x6C57, 0xBAB9, 0x6C58, 0x9AFE, 0x6C59, 0x9B40, 0x6C5A, 0x9B41, + 0x6C5B, 0xD1B4, 0x6C5C, 0xE3E1, 0x6C5D, 0xC8EA, 0x6C5E, 0xB9AF, + 0x6C5F, 0xBDAD, 0x6C60, 0xB3D8, 0x6C61, 0xCEDB, 0x6C62, 0x9B42, + 0x6C63, 0x9B43, 0x6C64, 0xCCC0, 0x6C65, 0x9B44, 0x6C66, 0x9B45, + 0x6C67, 0x9B46, 0x6C68, 0xE3E8, 0x6C69, 0xE3E9, 0x6C6A, 0xCDF4, + 0x6C6B, 0x9B47, 0x6C6C, 0x9B48, 0x6C6D, 0x9B49, 0x6C6E, 0x9B4A, + 0x6C6F, 0x9B4B, 0x6C70, 0xCCAD, 0x6C71, 0x9B4C, 0x6C72, 0xBCB3, + 0x6C73, 0x9B4D, 0x6C74, 0xE3EA, 0x6C75, 0x9B4E, 0x6C76, 0xE3EB, + 0x6C77, 0x9B4F, 0x6C78, 0x9B50, 0x6C79, 0xD0DA, 0x6C7A, 0x9B51, + 0x6C7B, 0x9B52, 0x6C7C, 0x9B53, 0x6C7D, 0xC6FB, 0x6C7E, 0xB7DA, + 0x6C7F, 0x9B54, 0x6C80, 0x9B55, 0x6C81, 0xC7DF, 0x6C82, 0xD2CA, + 0x6C83, 0xCED6, 0x6C84, 0x9B56, 0x6C85, 0xE3E4, 0x6C86, 0xE3EC, + 0x6C87, 0x9B57, 0x6C88, 0xC9F2, 0x6C89, 0xB3C1, 0x6C8A, 0x9B58, + 0x6C8B, 0x9B59, 0x6C8C, 0xE3E7, 0x6C8D, 0x9B5A, 0x6C8E, 0x9B5B, + 0x6C8F, 0xC6E3, 0x6C90, 0xE3E5, 0x6C91, 0x9B5C, 0x6C92, 0x9B5D, + 0x6C93, 0xEDB3, 0x6C94, 0xE3E6, 0x6C95, 0x9B5E, 0x6C96, 0x9B5F, + 0x6C97, 0x9B60, 0x6C98, 0x9B61, 0x6C99, 0xC9B3, 0x6C9A, 0x9B62, + 0x6C9B, 0xC5E6, 0x6C9C, 0x9B63, 0x6C9D, 0x9B64, 0x6C9E, 0x9B65, + 0x6C9F, 0xB9B5, 0x6CA0, 0x9B66, 0x6CA1, 0xC3BB, 0x6CA2, 0x9B67, + 0x6CA3, 0xE3E3, 0x6CA4, 0xC5BD, 0x6CA5, 0xC1A4, 0x6CA6, 0xC2D9, + 0x6CA7, 0xB2D7, 0x6CA8, 0x9B68, 0x6CA9, 0xE3ED, 0x6CAA, 0xBBA6, + 0x6CAB, 0xC4AD, 0x6CAC, 0x9B69, 0x6CAD, 0xE3F0, 0x6CAE, 0xBEDA, + 0x6CAF, 0x9B6A, 0x6CB0, 0x9B6B, 0x6CB1, 0xE3FB, 0x6CB2, 0xE3F5, + 0x6CB3, 0xBAD3, 0x6CB4, 0x9B6C, 0x6CB5, 0x9B6D, 0x6CB6, 0x9B6E, + 0x6CB7, 0x9B6F, 0x6CB8, 0xB7D0, 0x6CB9, 0xD3CD, 0x6CBA, 0x9B70, + 0x6CBB, 0xD6CE, 0x6CBC, 0xD5D3, 0x6CBD, 0xB9C1, 0x6CBE, 0xD5B4, + 0x6CBF, 0xD1D8, 0x6CC0, 0x9B71, 0x6CC1, 0x9B72, 0x6CC2, 0x9B73, + 0x6CC3, 0x9B74, 0x6CC4, 0xD0B9, 0x6CC5, 0xC7F6, 0x6CC6, 0x9B75, + 0x6CC7, 0x9B76, 0x6CC8, 0x9B77, 0x6CC9, 0xC8AA, 0x6CCA, 0xB2B4, + 0x6CCB, 0x9B78, 0x6CCC, 0xC3DA, 0x6CCD, 0x9B79, 0x6CCE, 0x9B7A, + 0x6CCF, 0x9B7B, 0x6CD0, 0xE3EE, 0x6CD1, 0x9B7C, 0x6CD2, 0x9B7D, + 0x6CD3, 0xE3FC, 0x6CD4, 0xE3EF, 0x6CD5, 0xB7A8, 0x6CD6, 0xE3F7, + 0x6CD7, 0xE3F4, 0x6CD8, 0x9B7E, 0x6CD9, 0x9B80, 0x6CDA, 0x9B81, + 0x6CDB, 0xB7BA, 0x6CDC, 0x9B82, 0x6CDD, 0x9B83, 0x6CDE, 0xC5A2, + 0x6CDF, 0x9B84, 0x6CE0, 0xE3F6, 0x6CE1, 0xC5DD, 0x6CE2, 0xB2A8, + 0x6CE3, 0xC6FC, 0x6CE4, 0x9B85, 0x6CE5, 0xC4E0, 0x6CE6, 0x9B86, + 0x6CE7, 0x9B87, 0x6CE8, 0xD7A2, 0x6CE9, 0x9B88, 0x6CEA, 0xC0E1, + 0x6CEB, 0xE3F9, 0x6CEC, 0x9B89, 0x6CED, 0x9B8A, 0x6CEE, 0xE3FA, + 0x6CEF, 0xE3FD, 0x6CF0, 0xCCA9, 0x6CF1, 0xE3F3, 0x6CF2, 0x9B8B, + 0x6CF3, 0xD3BE, 0x6CF4, 0x9B8C, 0x6CF5, 0xB1C3, 0x6CF6, 0xEDB4, + 0x6CF7, 0xE3F1, 0x6CF8, 0xE3F2, 0x6CF9, 0x9B8D, 0x6CFA, 0xE3F8, + 0x6CFB, 0xD0BA, 0x6CFC, 0xC6C3, 0x6CFD, 0xD4F3, 0x6CFE, 0xE3FE, + 0x6CFF, 0x9B8E, 0x6D00, 0x9B8F, 0x6D01, 0xBDE0, 0x6D02, 0x9B90, + 0x6D03, 0x9B91, 0x6D04, 0xE4A7, 0x6D05, 0x9B92, 0x6D06, 0x9B93, + 0x6D07, 0xE4A6, 0x6D08, 0x9B94, 0x6D09, 0x9B95, 0x6D0A, 0x9B96, + 0x6D0B, 0xD1F3, 0x6D0C, 0xE4A3, 0x6D0D, 0x9B97, 0x6D0E, 0xE4A9, + 0x6D0F, 0x9B98, 0x6D10, 0x9B99, 0x6D11, 0x9B9A, 0x6D12, 0xC8F7, + 0x6D13, 0x9B9B, 0x6D14, 0x9B9C, 0x6D15, 0x9B9D, 0x6D16, 0x9B9E, + 0x6D17, 0xCFB4, 0x6D18, 0x9B9F, 0x6D19, 0xE4A8, 0x6D1A, 0xE4AE, + 0x6D1B, 0xC2E5, 0x6D1C, 0x9BA0, 0x6D1D, 0x9BA1, 0x6D1E, 0xB6B4, + 0x6D1F, 0x9BA2, 0x6D20, 0x9BA3, 0x6D21, 0x9BA4, 0x6D22, 0x9BA5, + 0x6D23, 0x9BA6, 0x6D24, 0x9BA7, 0x6D25, 0xBDF2, 0x6D26, 0x9BA8, + 0x6D27, 0xE4A2, 0x6D28, 0x9BA9, 0x6D29, 0x9BAA, 0x6D2A, 0xBAE9, + 0x6D2B, 0xE4AA, 0x6D2C, 0x9BAB, 0x6D2D, 0x9BAC, 0x6D2E, 0xE4AC, + 0x6D2F, 0x9BAD, 0x6D30, 0x9BAE, 0x6D31, 0xB6FD, 0x6D32, 0xD6DE, + 0x6D33, 0xE4B2, 0x6D34, 0x9BAF, 0x6D35, 0xE4AD, 0x6D36, 0x9BB0, + 0x6D37, 0x9BB1, 0x6D38, 0x9BB2, 0x6D39, 0xE4A1, 0x6D3A, 0x9BB3, + 0x6D3B, 0xBBEE, 0x6D3C, 0xCDDD, 0x6D3D, 0xC7A2, 0x6D3E, 0xC5C9, + 0x6D3F, 0x9BB4, 0x6D40, 0x9BB5, 0x6D41, 0xC1F7, 0x6D42, 0x9BB6, + 0x6D43, 0xE4A4, 0x6D44, 0x9BB7, 0x6D45, 0xC7B3, 0x6D46, 0xBDAC, + 0x6D47, 0xBDBD, 0x6D48, 0xE4A5, 0x6D49, 0x9BB8, 0x6D4A, 0xD7C7, + 0x6D4B, 0xB2E2, 0x6D4C, 0x9BB9, 0x6D4D, 0xE4AB, 0x6D4E, 0xBCC3, + 0x6D4F, 0xE4AF, 0x6D50, 0x9BBA, 0x6D51, 0xBBEB, 0x6D52, 0xE4B0, + 0x6D53, 0xC5A8, 0x6D54, 0xE4B1, 0x6D55, 0x9BBB, 0x6D56, 0x9BBC, + 0x6D57, 0x9BBD, 0x6D58, 0x9BBE, 0x6D59, 0xD5E3, 0x6D5A, 0xBFA3, + 0x6D5B, 0x9BBF, 0x6D5C, 0xE4BA, 0x6D5D, 0x9BC0, 0x6D5E, 0xE4B7, + 0x6D5F, 0x9BC1, 0x6D60, 0xE4BB, 0x6D61, 0x9BC2, 0x6D62, 0x9BC3, + 0x6D63, 0xE4BD, 0x6D64, 0x9BC4, 0x6D65, 0x9BC5, 0x6D66, 0xC6D6, + 0x6D67, 0x9BC6, 0x6D68, 0x9BC7, 0x6D69, 0xBAC6, 0x6D6A, 0xC0CB, + 0x6D6B, 0x9BC8, 0x6D6C, 0x9BC9, 0x6D6D, 0x9BCA, 0x6D6E, 0xB8A1, + 0x6D6F, 0xE4B4, 0x6D70, 0x9BCB, 0x6D71, 0x9BCC, 0x6D72, 0x9BCD, + 0x6D73, 0x9BCE, 0x6D74, 0xD4A1, 0x6D75, 0x9BCF, 0x6D76, 0x9BD0, + 0x6D77, 0xBAA3, 0x6D78, 0xBDFE, 0x6D79, 0x9BD1, 0x6D7A, 0x9BD2, + 0x6D7B, 0x9BD3, 0x6D7C, 0xE4BC, 0x6D7D, 0x9BD4, 0x6D7E, 0x9BD5, + 0x6D7F, 0x9BD6, 0x6D80, 0x9BD7, 0x6D81, 0x9BD8, 0x6D82, 0xCDBF, + 0x6D83, 0x9BD9, 0x6D84, 0x9BDA, 0x6D85, 0xC4F9, 0x6D86, 0x9BDB, + 0x6D87, 0x9BDC, 0x6D88, 0xCFFB, 0x6D89, 0xC9E6, 0x6D8A, 0x9BDD, + 0x6D8B, 0x9BDE, 0x6D8C, 0xD3BF, 0x6D8D, 0x9BDF, 0x6D8E, 0xCFD1, + 0x6D8F, 0x9BE0, 0x6D90, 0x9BE1, 0x6D91, 0xE4B3, 0x6D92, 0x9BE2, + 0x6D93, 0xE4B8, 0x6D94, 0xE4B9, 0x6D95, 0xCCE9, 0x6D96, 0x9BE3, + 0x6D97, 0x9BE4, 0x6D98, 0x9BE5, 0x6D99, 0x9BE6, 0x6D9A, 0x9BE7, + 0x6D9B, 0xCCCE, 0x6D9C, 0x9BE8, 0x6D9D, 0xC0D4, 0x6D9E, 0xE4B5, + 0x6D9F, 0xC1B0, 0x6DA0, 0xE4B6, 0x6DA1, 0xCED0, 0x6DA2, 0x9BE9, + 0x6DA3, 0xBBC1, 0x6DA4, 0xB5D3, 0x6DA5, 0x9BEA, 0x6DA6, 0xC8F3, + 0x6DA7, 0xBDA7, 0x6DA8, 0xD5C7, 0x6DA9, 0xC9AC, 0x6DAA, 0xB8A2, + 0x6DAB, 0xE4CA, 0x6DAC, 0x9BEB, 0x6DAD, 0x9BEC, 0x6DAE, 0xE4CC, + 0x6DAF, 0xD1C4, 0x6DB0, 0x9BED, 0x6DB1, 0x9BEE, 0x6DB2, 0xD2BA, + 0x6DB3, 0x9BEF, 0x6DB4, 0x9BF0, 0x6DB5, 0xBAAD, 0x6DB6, 0x9BF1, + 0x6DB7, 0x9BF2, 0x6DB8, 0xBAD4, 0x6DB9, 0x9BF3, 0x6DBA, 0x9BF4, + 0x6DBB, 0x9BF5, 0x6DBC, 0x9BF6, 0x6DBD, 0x9BF7, 0x6DBE, 0x9BF8, + 0x6DBF, 0xE4C3, 0x6DC0, 0xB5ED, 0x6DC1, 0x9BF9, 0x6DC2, 0x9BFA, + 0x6DC3, 0x9BFB, 0x6DC4, 0xD7CD, 0x6DC5, 0xE4C0, 0x6DC6, 0xCFFD, + 0x6DC7, 0xE4BF, 0x6DC8, 0x9BFC, 0x6DC9, 0x9BFD, 0x6DCA, 0x9BFE, + 0x6DCB, 0xC1DC, 0x6DCC, 0xCCCA, 0x6DCD, 0x9C40, 0x6DCE, 0x9C41, + 0x6DCF, 0x9C42, 0x6DD0, 0x9C43, 0x6DD1, 0xCAE7, 0x6DD2, 0x9C44, + 0x6DD3, 0x9C45, 0x6DD4, 0x9C46, 0x6DD5, 0x9C47, 0x6DD6, 0xC4D7, + 0x6DD7, 0x9C48, 0x6DD8, 0xCCD4, 0x6DD9, 0xE4C8, 0x6DDA, 0x9C49, + 0x6DDB, 0x9C4A, 0x6DDC, 0x9C4B, 0x6DDD, 0xE4C7, 0x6DDE, 0xE4C1, + 0x6DDF, 0x9C4C, 0x6DE0, 0xE4C4, 0x6DE1, 0xB5AD, 0x6DE2, 0x9C4D, + 0x6DE3, 0x9C4E, 0x6DE4, 0xD3D9, 0x6DE5, 0x9C4F, 0x6DE6, 0xE4C6, + 0x6DE7, 0x9C50, 0x6DE8, 0x9C51, 0x6DE9, 0x9C52, 0x6DEA, 0x9C53, + 0x6DEB, 0xD2F9, 0x6DEC, 0xB4E3, 0x6DED, 0x9C54, 0x6DEE, 0xBBB4, + 0x6DEF, 0x9C55, 0x6DF0, 0x9C56, 0x6DF1, 0xC9EE, 0x6DF2, 0x9C57, + 0x6DF3, 0xB4BE, 0x6DF4, 0x9C58, 0x6DF5, 0x9C59, 0x6DF6, 0x9C5A, + 0x6DF7, 0xBBEC, 0x6DF8, 0x9C5B, 0x6DF9, 0xD1CD, 0x6DFA, 0x9C5C, + 0x6DFB, 0xCCED, 0x6DFC, 0xEDB5, 0x6DFD, 0x9C5D, 0x6DFE, 0x9C5E, + 0x6DFF, 0x9C5F, 0x6E00, 0x9C60, 0x6E01, 0x9C61, 0x6E02, 0x9C62, + 0x6E03, 0x9C63, 0x6E04, 0x9C64, 0x6E05, 0xC7E5, 0x6E06, 0x9C65, + 0x6E07, 0x9C66, 0x6E08, 0x9C67, 0x6E09, 0x9C68, 0x6E0A, 0xD4A8, + 0x6E0B, 0x9C69, 0x6E0C, 0xE4CB, 0x6E0D, 0xD7D5, 0x6E0E, 0xE4C2, + 0x6E0F, 0x9C6A, 0x6E10, 0xBDA5, 0x6E11, 0xE4C5, 0x6E12, 0x9C6B, + 0x6E13, 0x9C6C, 0x6E14, 0xD3E6, 0x6E15, 0x9C6D, 0x6E16, 0xE4C9, + 0x6E17, 0xC9F8, 0x6E18, 0x9C6E, 0x6E19, 0x9C6F, 0x6E1A, 0xE4BE, + 0x6E1B, 0x9C70, 0x6E1C, 0x9C71, 0x6E1D, 0xD3E5, 0x6E1E, 0x9C72, + 0x6E1F, 0x9C73, 0x6E20, 0xC7FE, 0x6E21, 0xB6C9, 0x6E22, 0x9C74, + 0x6E23, 0xD4FC, 0x6E24, 0xB2B3, 0x6E25, 0xE4D7, 0x6E26, 0x9C75, + 0x6E27, 0x9C76, 0x6E28, 0x9C77, 0x6E29, 0xCEC2, 0x6E2A, 0x9C78, + 0x6E2B, 0xE4CD, 0x6E2C, 0x9C79, 0x6E2D, 0xCEBC, 0x6E2E, 0x9C7A, + 0x6E2F, 0xB8DB, 0x6E30, 0x9C7B, 0x6E31, 0x9C7C, 0x6E32, 0xE4D6, + 0x6E33, 0x9C7D, 0x6E34, 0xBFCA, 0x6E35, 0x9C7E, 0x6E36, 0x9C80, + 0x6E37, 0x9C81, 0x6E38, 0xD3CE, 0x6E39, 0x9C82, 0x6E3A, 0xC3EC, + 0x6E3B, 0x9C83, 0x6E3C, 0x9C84, 0x6E3D, 0x9C85, 0x6E3E, 0x9C86, + 0x6E3F, 0x9C87, 0x6E40, 0x9C88, 0x6E41, 0x9C89, 0x6E42, 0x9C8A, + 0x6E43, 0xC5C8, 0x6E44, 0xE4D8, 0x6E45, 0x9C8B, 0x6E46, 0x9C8C, + 0x6E47, 0x9C8D, 0x6E48, 0x9C8E, 0x6E49, 0x9C8F, 0x6E4A, 0x9C90, + 0x6E4B, 0x9C91, 0x6E4C, 0x9C92, 0x6E4D, 0xCDC4, 0x6E4E, 0xE4CF, + 0x6E4F, 0x9C93, 0x6E50, 0x9C94, 0x6E51, 0x9C95, 0x6E52, 0x9C96, + 0x6E53, 0xE4D4, 0x6E54, 0xE4D5, 0x6E55, 0x9C97, 0x6E56, 0xBAFE, + 0x6E57, 0x9C98, 0x6E58, 0xCFE6, 0x6E59, 0x9C99, 0x6E5A, 0x9C9A, + 0x6E5B, 0xD5BF, 0x6E5C, 0x9C9B, 0x6E5D, 0x9C9C, 0x6E5E, 0x9C9D, + 0x6E5F, 0xE4D2, 0x6E60, 0x9C9E, 0x6E61, 0x9C9F, 0x6E62, 0x9CA0, + 0x6E63, 0x9CA1, 0x6E64, 0x9CA2, 0x6E65, 0x9CA3, 0x6E66, 0x9CA4, + 0x6E67, 0x9CA5, 0x6E68, 0x9CA6, 0x6E69, 0x9CA7, 0x6E6A, 0x9CA8, + 0x6E6B, 0xE4D0, 0x6E6C, 0x9CA9, 0x6E6D, 0x9CAA, 0x6E6E, 0xE4CE, + 0x6E6F, 0x9CAB, 0x6E70, 0x9CAC, 0x6E71, 0x9CAD, 0x6E72, 0x9CAE, + 0x6E73, 0x9CAF, 0x6E74, 0x9CB0, 0x6E75, 0x9CB1, 0x6E76, 0x9CB2, + 0x6E77, 0x9CB3, 0x6E78, 0x9CB4, 0x6E79, 0x9CB5, 0x6E7A, 0x9CB6, + 0x6E7B, 0x9CB7, 0x6E7C, 0x9CB8, 0x6E7D, 0x9CB9, 0x6E7E, 0xCDE5, + 0x6E7F, 0xCAAA, 0x6E80, 0x9CBA, 0x6E81, 0x9CBB, 0x6E82, 0x9CBC, + 0x6E83, 0xC0A3, 0x6E84, 0x9CBD, 0x6E85, 0xBDA6, 0x6E86, 0xE4D3, + 0x6E87, 0x9CBE, 0x6E88, 0x9CBF, 0x6E89, 0xB8C8, 0x6E8A, 0x9CC0, + 0x6E8B, 0x9CC1, 0x6E8C, 0x9CC2, 0x6E8D, 0x9CC3, 0x6E8E, 0x9CC4, + 0x6E8F, 0xE4E7, 0x6E90, 0xD4B4, 0x6E91, 0x9CC5, 0x6E92, 0x9CC6, + 0x6E93, 0x9CC7, 0x6E94, 0x9CC8, 0x6E95, 0x9CC9, 0x6E96, 0x9CCA, + 0x6E97, 0x9CCB, 0x6E98, 0xE4DB, 0x6E99, 0x9CCC, 0x6E9A, 0x9CCD, + 0x6E9B, 0x9CCE, 0x6E9C, 0xC1EF, 0x6E9D, 0x9CCF, 0x6E9E, 0x9CD0, + 0x6E9F, 0xE4E9, 0x6EA0, 0x9CD1, 0x6EA1, 0x9CD2, 0x6EA2, 0xD2E7, + 0x6EA3, 0x9CD3, 0x6EA4, 0x9CD4, 0x6EA5, 0xE4DF, 0x6EA6, 0x9CD5, + 0x6EA7, 0xE4E0, 0x6EA8, 0x9CD6, 0x6EA9, 0x9CD7, 0x6EAA, 0xCFAA, + 0x6EAB, 0x9CD8, 0x6EAC, 0x9CD9, 0x6EAD, 0x9CDA, 0x6EAE, 0x9CDB, + 0x6EAF, 0xCBDD, 0x6EB0, 0x9CDC, 0x6EB1, 0xE4DA, 0x6EB2, 0xE4D1, + 0x6EB3, 0x9CDD, 0x6EB4, 0xE4E5, 0x6EB5, 0x9CDE, 0x6EB6, 0xC8DC, + 0x6EB7, 0xE4E3, 0x6EB8, 0x9CDF, 0x6EB9, 0x9CE0, 0x6EBA, 0xC4E7, + 0x6EBB, 0xE4E2, 0x6EBC, 0x9CE1, 0x6EBD, 0xE4E1, 0x6EBE, 0x9CE2, + 0x6EBF, 0x9CE3, 0x6EC0, 0x9CE4, 0x6EC1, 0xB3FC, 0x6EC2, 0xE4E8, + 0x6EC3, 0x9CE5, 0x6EC4, 0x9CE6, 0x6EC5, 0x9CE7, 0x6EC6, 0x9CE8, + 0x6EC7, 0xB5E1, 0x6EC8, 0x9CE9, 0x6EC9, 0x9CEA, 0x6ECA, 0x9CEB, + 0x6ECB, 0xD7CC, 0x6ECC, 0x9CEC, 0x6ECD, 0x9CED, 0x6ECE, 0x9CEE, + 0x6ECF, 0xE4E6, 0x6ED0, 0x9CEF, 0x6ED1, 0xBBAC, 0x6ED2, 0x9CF0, + 0x6ED3, 0xD7D2, 0x6ED4, 0xCCCF, 0x6ED5, 0xEBF8, 0x6ED6, 0x9CF1, + 0x6ED7, 0xE4E4, 0x6ED8, 0x9CF2, 0x6ED9, 0x9CF3, 0x6EDA, 0xB9F6, + 0x6EDB, 0x9CF4, 0x6EDC, 0x9CF5, 0x6EDD, 0x9CF6, 0x6EDE, 0xD6CD, + 0x6EDF, 0xE4D9, 0x6EE0, 0xE4DC, 0x6EE1, 0xC2FA, 0x6EE2, 0xE4DE, + 0x6EE3, 0x9CF7, 0x6EE4, 0xC2CB, 0x6EE5, 0xC0C4, 0x6EE6, 0xC2D0, + 0x6EE7, 0x9CF8, 0x6EE8, 0xB1F5, 0x6EE9, 0xCCB2, 0x6EEA, 0x9CF9, + 0x6EEB, 0x9CFA, 0x6EEC, 0x9CFB, 0x6EED, 0x9CFC, 0x6EEE, 0x9CFD, + 0x6EEF, 0x9CFE, 0x6EF0, 0x9D40, 0x6EF1, 0x9D41, 0x6EF2, 0x9D42, + 0x6EF3, 0x9D43, 0x6EF4, 0xB5CE, 0x6EF5, 0x9D44, 0x6EF6, 0x9D45, + 0x6EF7, 0x9D46, 0x6EF8, 0x9D47, 0x6EF9, 0xE4EF, 0x6EFA, 0x9D48, + 0x6EFB, 0x9D49, 0x6EFC, 0x9D4A, 0x6EFD, 0x9D4B, 0x6EFE, 0x9D4C, + 0x6EFF, 0x9D4D, 0x6F00, 0x9D4E, 0x6F01, 0x9D4F, 0x6F02, 0xC6AF, + 0x6F03, 0x9D50, 0x6F04, 0x9D51, 0x6F05, 0x9D52, 0x6F06, 0xC6E1, + 0x6F07, 0x9D53, 0x6F08, 0x9D54, 0x6F09, 0xE4F5, 0x6F0A, 0x9D55, + 0x6F0B, 0x9D56, 0x6F0C, 0x9D57, 0x6F0D, 0x9D58, 0x6F0E, 0x9D59, + 0x6F0F, 0xC2A9, 0x6F10, 0x9D5A, 0x6F11, 0x9D5B, 0x6F12, 0x9D5C, + 0x6F13, 0xC0EC, 0x6F14, 0xD1DD, 0x6F15, 0xE4EE, 0x6F16, 0x9D5D, + 0x6F17, 0x9D5E, 0x6F18, 0x9D5F, 0x6F19, 0x9D60, 0x6F1A, 0x9D61, + 0x6F1B, 0x9D62, 0x6F1C, 0x9D63, 0x6F1D, 0x9D64, 0x6F1E, 0x9D65, + 0x6F1F, 0x9D66, 0x6F20, 0xC4AE, 0x6F21, 0x9D67, 0x6F22, 0x9D68, + 0x6F23, 0x9D69, 0x6F24, 0xE4ED, 0x6F25, 0x9D6A, 0x6F26, 0x9D6B, + 0x6F27, 0x9D6C, 0x6F28, 0x9D6D, 0x6F29, 0xE4F6, 0x6F2A, 0xE4F4, + 0x6F2B, 0xC2FE, 0x6F2C, 0x9D6E, 0x6F2D, 0xE4DD, 0x6F2E, 0x9D6F, + 0x6F2F, 0xE4F0, 0x6F30, 0x9D70, 0x6F31, 0xCAFE, 0x6F32, 0x9D71, + 0x6F33, 0xD5C4, 0x6F34, 0x9D72, 0x6F35, 0x9D73, 0x6F36, 0xE4F1, + 0x6F37, 0x9D74, 0x6F38, 0x9D75, 0x6F39, 0x9D76, 0x6F3A, 0x9D77, + 0x6F3B, 0x9D78, 0x6F3C, 0x9D79, 0x6F3D, 0x9D7A, 0x6F3E, 0xD1FA, + 0x6F3F, 0x9D7B, 0x6F40, 0x9D7C, 0x6F41, 0x9D7D, 0x6F42, 0x9D7E, + 0x6F43, 0x9D80, 0x6F44, 0x9D81, 0x6F45, 0x9D82, 0x6F46, 0xE4EB, + 0x6F47, 0xE4EC, 0x6F48, 0x9D83, 0x6F49, 0x9D84, 0x6F4A, 0x9D85, + 0x6F4B, 0xE4F2, 0x6F4C, 0x9D86, 0x6F4D, 0xCEAB, 0x6F4E, 0x9D87, + 0x6F4F, 0x9D88, 0x6F50, 0x9D89, 0x6F51, 0x9D8A, 0x6F52, 0x9D8B, + 0x6F53, 0x9D8C, 0x6F54, 0x9D8D, 0x6F55, 0x9D8E, 0x6F56, 0x9D8F, + 0x6F57, 0x9D90, 0x6F58, 0xC5CB, 0x6F59, 0x9D91, 0x6F5A, 0x9D92, + 0x6F5B, 0x9D93, 0x6F5C, 0xC7B1, 0x6F5D, 0x9D94, 0x6F5E, 0xC2BA, + 0x6F5F, 0x9D95, 0x6F60, 0x9D96, 0x6F61, 0x9D97, 0x6F62, 0xE4EA, + 0x6F63, 0x9D98, 0x6F64, 0x9D99, 0x6F65, 0x9D9A, 0x6F66, 0xC1CA, + 0x6F67, 0x9D9B, 0x6F68, 0x9D9C, 0x6F69, 0x9D9D, 0x6F6A, 0x9D9E, + 0x6F6B, 0x9D9F, 0x6F6C, 0x9DA0, 0x6F6D, 0xCCB6, 0x6F6E, 0xB3B1, + 0x6F6F, 0x9DA1, 0x6F70, 0x9DA2, 0x6F71, 0x9DA3, 0x6F72, 0xE4FB, + 0x6F73, 0x9DA4, 0x6F74, 0xE4F3, 0x6F75, 0x9DA5, 0x6F76, 0x9DA6, + 0x6F77, 0x9DA7, 0x6F78, 0xE4FA, 0x6F79, 0x9DA8, 0x6F7A, 0xE4FD, + 0x6F7B, 0x9DA9, 0x6F7C, 0xE4FC, 0x6F7D, 0x9DAA, 0x6F7E, 0x9DAB, + 0x6F7F, 0x9DAC, 0x6F80, 0x9DAD, 0x6F81, 0x9DAE, 0x6F82, 0x9DAF, + 0x6F83, 0x9DB0, 0x6F84, 0xB3CE, 0x6F85, 0x9DB1, 0x6F86, 0x9DB2, + 0x6F87, 0x9DB3, 0x6F88, 0xB3BA, 0x6F89, 0xE4F7, 0x6F8A, 0x9DB4, + 0x6F8B, 0x9DB5, 0x6F8C, 0xE4F9, 0x6F8D, 0xE4F8, 0x6F8E, 0xC5EC, + 0x6F8F, 0x9DB6, 0x6F90, 0x9DB7, 0x6F91, 0x9DB8, 0x6F92, 0x9DB9, + 0x6F93, 0x9DBA, 0x6F94, 0x9DBB, 0x6F95, 0x9DBC, 0x6F96, 0x9DBD, + 0x6F97, 0x9DBE, 0x6F98, 0x9DBF, 0x6F99, 0x9DC0, 0x6F9A, 0x9DC1, + 0x6F9B, 0x9DC2, 0x6F9C, 0xC0BD, 0x6F9D, 0x9DC3, 0x6F9E, 0x9DC4, + 0x6F9F, 0x9DC5, 0x6FA0, 0x9DC6, 0x6FA1, 0xD4E8, 0x6FA2, 0x9DC7, + 0x6FA3, 0x9DC8, 0x6FA4, 0x9DC9, 0x6FA5, 0x9DCA, 0x6FA6, 0x9DCB, + 0x6FA7, 0xE5A2, 0x6FA8, 0x9DCC, 0x6FA9, 0x9DCD, 0x6FAA, 0x9DCE, + 0x6FAB, 0x9DCF, 0x6FAC, 0x9DD0, 0x6FAD, 0x9DD1, 0x6FAE, 0x9DD2, + 0x6FAF, 0x9DD3, 0x6FB0, 0x9DD4, 0x6FB1, 0x9DD5, 0x6FB2, 0x9DD6, + 0x6FB3, 0xB0C4, 0x6FB4, 0x9DD7, 0x6FB5, 0x9DD8, 0x6FB6, 0xE5A4, + 0x6FB7, 0x9DD9, 0x6FB8, 0x9DDA, 0x6FB9, 0xE5A3, 0x6FBA, 0x9DDB, + 0x6FBB, 0x9DDC, 0x6FBC, 0x9DDD, 0x6FBD, 0x9DDE, 0x6FBE, 0x9DDF, + 0x6FBF, 0x9DE0, 0x6FC0, 0xBCA4, 0x6FC1, 0x9DE1, 0x6FC2, 0xE5A5, + 0x6FC3, 0x9DE2, 0x6FC4, 0x9DE3, 0x6FC5, 0x9DE4, 0x6FC6, 0x9DE5, + 0x6FC7, 0x9DE6, 0x6FC8, 0x9DE7, 0x6FC9, 0xE5A1, 0x6FCA, 0x9DE8, + 0x6FCB, 0x9DE9, 0x6FCC, 0x9DEA, 0x6FCD, 0x9DEB, 0x6FCE, 0x9DEC, + 0x6FCF, 0x9DED, 0x6FD0, 0x9DEE, 0x6FD1, 0xE4FE, 0x6FD2, 0xB1F4, + 0x6FD3, 0x9DEF, 0x6FD4, 0x9DF0, 0x6FD5, 0x9DF1, 0x6FD6, 0x9DF2, + 0x6FD7, 0x9DF3, 0x6FD8, 0x9DF4, 0x6FD9, 0x9DF5, 0x6FDA, 0x9DF6, + 0x6FDB, 0x9DF7, 0x6FDC, 0x9DF8, 0x6FDD, 0x9DF9, 0x6FDE, 0xE5A8, + 0x6FDF, 0x9DFA, 0x6FE0, 0xE5A9, 0x6FE1, 0xE5A6, 0x6FE2, 0x9DFB, + 0x6FE3, 0x9DFC, 0x6FE4, 0x9DFD, 0x6FE5, 0x9DFE, 0x6FE6, 0x9E40, + 0x6FE7, 0x9E41, 0x6FE8, 0x9E42, 0x6FE9, 0x9E43, 0x6FEA, 0x9E44, + 0x6FEB, 0x9E45, 0x6FEC, 0x9E46, 0x6FED, 0x9E47, 0x6FEE, 0xE5A7, + 0x6FEF, 0xE5AA, 0x6FF0, 0x9E48, 0x6FF1, 0x9E49, 0x6FF2, 0x9E4A, + 0x6FF3, 0x9E4B, 0x6FF4, 0x9E4C, 0x6FF5, 0x9E4D, 0x6FF6, 0x9E4E, + 0x6FF7, 0x9E4F, 0x6FF8, 0x9E50, 0x6FF9, 0x9E51, 0x6FFA, 0x9E52, + 0x6FFB, 0x9E53, 0x6FFC, 0x9E54, 0x6FFD, 0x9E55, 0x6FFE, 0x9E56, + 0x6FFF, 0x9E57, 0x7000, 0x9E58, 0x7001, 0x9E59, 0x7002, 0x9E5A, + 0x7003, 0x9E5B, 0x7004, 0x9E5C, 0x7005, 0x9E5D, 0x7006, 0x9E5E, + 0x7007, 0x9E5F, 0x7008, 0x9E60, 0x7009, 0x9E61, 0x700A, 0x9E62, + 0x700B, 0x9E63, 0x700C, 0x9E64, 0x700D, 0x9E65, 0x700E, 0x9E66, + 0x700F, 0x9E67, 0x7010, 0x9E68, 0x7011, 0xC6D9, 0x7012, 0x9E69, + 0x7013, 0x9E6A, 0x7014, 0x9E6B, 0x7015, 0x9E6C, 0x7016, 0x9E6D, + 0x7017, 0x9E6E, 0x7018, 0x9E6F, 0x7019, 0x9E70, 0x701A, 0xE5AB, + 0x701B, 0xE5AD, 0x701C, 0x9E71, 0x701D, 0x9E72, 0x701E, 0x9E73, + 0x701F, 0x9E74, 0x7020, 0x9E75, 0x7021, 0x9E76, 0x7022, 0x9E77, + 0x7023, 0xE5AC, 0x7024, 0x9E78, 0x7025, 0x9E79, 0x7026, 0x9E7A, + 0x7027, 0x9E7B, 0x7028, 0x9E7C, 0x7029, 0x9E7D, 0x702A, 0x9E7E, + 0x702B, 0x9E80, 0x702C, 0x9E81, 0x702D, 0x9E82, 0x702E, 0x9E83, + 0x702F, 0x9E84, 0x7030, 0x9E85, 0x7031, 0x9E86, 0x7032, 0x9E87, + 0x7033, 0x9E88, 0x7034, 0x9E89, 0x7035, 0xE5AF, 0x7036, 0x9E8A, + 0x7037, 0x9E8B, 0x7038, 0x9E8C, 0x7039, 0xE5AE, 0x703A, 0x9E8D, + 0x703B, 0x9E8E, 0x703C, 0x9E8F, 0x703D, 0x9E90, 0x703E, 0x9E91, + 0x703F, 0x9E92, 0x7040, 0x9E93, 0x7041, 0x9E94, 0x7042, 0x9E95, + 0x7043, 0x9E96, 0x7044, 0x9E97, 0x7045, 0x9E98, 0x7046, 0x9E99, + 0x7047, 0x9E9A, 0x7048, 0x9E9B, 0x7049, 0x9E9C, 0x704A, 0x9E9D, + 0x704B, 0x9E9E, 0x704C, 0xB9E0, 0x704D, 0x9E9F, 0x704E, 0x9EA0, + 0x704F, 0xE5B0, 0x7050, 0x9EA1, 0x7051, 0x9EA2, 0x7052, 0x9EA3, + 0x7053, 0x9EA4, 0x7054, 0x9EA5, 0x7055, 0x9EA6, 0x7056, 0x9EA7, + 0x7057, 0x9EA8, 0x7058, 0x9EA9, 0x7059, 0x9EAA, 0x705A, 0x9EAB, + 0x705B, 0x9EAC, 0x705C, 0x9EAD, 0x705D, 0x9EAE, 0x705E, 0xE5B1, + 0x705F, 0x9EAF, 0x7060, 0x9EB0, 0x7061, 0x9EB1, 0x7062, 0x9EB2, + 0x7063, 0x9EB3, 0x7064, 0x9EB4, 0x7065, 0x9EB5, 0x7066, 0x9EB6, + 0x7067, 0x9EB7, 0x7068, 0x9EB8, 0x7069, 0x9EB9, 0x706A, 0x9EBA, + 0x706B, 0xBBF0, 0x706C, 0xECE1, 0x706D, 0xC3F0, 0x706E, 0x9EBB, + 0x706F, 0xB5C6, 0x7070, 0xBBD2, 0x7071, 0x9EBC, 0x7072, 0x9EBD, + 0x7073, 0x9EBE, 0x7074, 0x9EBF, 0x7075, 0xC1E9, 0x7076, 0xD4EE, + 0x7077, 0x9EC0, 0x7078, 0xBEC4, 0x7079, 0x9EC1, 0x707A, 0x9EC2, + 0x707B, 0x9EC3, 0x707C, 0xD7C6, 0x707D, 0x9EC4, 0x707E, 0xD4D6, + 0x707F, 0xB2D3, 0x7080, 0xECBE, 0x7081, 0x9EC5, 0x7082, 0x9EC6, + 0x7083, 0x9EC7, 0x7084, 0x9EC8, 0x7085, 0xEAC1, 0x7086, 0x9EC9, + 0x7087, 0x9ECA, 0x7088, 0x9ECB, 0x7089, 0xC2AF, 0x708A, 0xB4B6, + 0x708B, 0x9ECC, 0x708C, 0x9ECD, 0x708D, 0x9ECE, 0x708E, 0xD1D7, + 0x708F, 0x9ECF, 0x7090, 0x9ED0, 0x7091, 0x9ED1, 0x7092, 0xB3B4, + 0x7093, 0x9ED2, 0x7094, 0xC8B2, 0x7095, 0xBFBB, 0x7096, 0xECC0, + 0x7097, 0x9ED3, 0x7098, 0x9ED4, 0x7099, 0xD6CB, 0x709A, 0x9ED5, + 0x709B, 0x9ED6, 0x709C, 0xECBF, 0x709D, 0xECC1, 0x709E, 0x9ED7, + 0x709F, 0x9ED8, 0x70A0, 0x9ED9, 0x70A1, 0x9EDA, 0x70A2, 0x9EDB, + 0x70A3, 0x9EDC, 0x70A4, 0x9EDD, 0x70A5, 0x9EDE, 0x70A6, 0x9EDF, + 0x70A7, 0x9EE0, 0x70A8, 0x9EE1, 0x70A9, 0x9EE2, 0x70AA, 0x9EE3, + 0x70AB, 0xECC5, 0x70AC, 0xBEE6, 0x70AD, 0xCCBF, 0x70AE, 0xC5DA, + 0x70AF, 0xBEBC, 0x70B0, 0x9EE4, 0x70B1, 0xECC6, 0x70B2, 0x9EE5, + 0x70B3, 0xB1FE, 0x70B4, 0x9EE6, 0x70B5, 0x9EE7, 0x70B6, 0x9EE8, + 0x70B7, 0xECC4, 0x70B8, 0xD5A8, 0x70B9, 0xB5E3, 0x70BA, 0x9EE9, + 0x70BB, 0xECC2, 0x70BC, 0xC1B6, 0x70BD, 0xB3E3, 0x70BE, 0x9EEA, + 0x70BF, 0x9EEB, 0x70C0, 0xECC3, 0x70C1, 0xCBB8, 0x70C2, 0xC0C3, + 0x70C3, 0xCCFE, 0x70C4, 0x9EEC, 0x70C5, 0x9EED, 0x70C6, 0x9EEE, + 0x70C7, 0x9EEF, 0x70C8, 0xC1D2, 0x70C9, 0x9EF0, 0x70CA, 0xECC8, + 0x70CB, 0x9EF1, 0x70CC, 0x9EF2, 0x70CD, 0x9EF3, 0x70CE, 0x9EF4, + 0x70CF, 0x9EF5, 0x70D0, 0x9EF6, 0x70D1, 0x9EF7, 0x70D2, 0x9EF8, + 0x70D3, 0x9EF9, 0x70D4, 0x9EFA, 0x70D5, 0x9EFB, 0x70D6, 0x9EFC, + 0x70D7, 0x9EFD, 0x70D8, 0xBAE6, 0x70D9, 0xC0D3, 0x70DA, 0x9EFE, + 0x70DB, 0xD6F2, 0x70DC, 0x9F40, 0x70DD, 0x9F41, 0x70DE, 0x9F42, + 0x70DF, 0xD1CC, 0x70E0, 0x9F43, 0x70E1, 0x9F44, 0x70E2, 0x9F45, + 0x70E3, 0x9F46, 0x70E4, 0xBFBE, 0x70E5, 0x9F47, 0x70E6, 0xB7B3, + 0x70E7, 0xC9D5, 0x70E8, 0xECC7, 0x70E9, 0xBBE2, 0x70EA, 0x9F48, + 0x70EB, 0xCCCC, 0x70EC, 0xBDFD, 0x70ED, 0xC8C8, 0x70EE, 0x9F49, + 0x70EF, 0xCFA9, 0x70F0, 0x9F4A, 0x70F1, 0x9F4B, 0x70F2, 0x9F4C, + 0x70F3, 0x9F4D, 0x70F4, 0x9F4E, 0x70F5, 0x9F4F, 0x70F6, 0x9F50, + 0x70F7, 0xCDE9, 0x70F8, 0x9F51, 0x70F9, 0xC5EB, 0x70FA, 0x9F52, + 0x70FB, 0x9F53, 0x70FC, 0x9F54, 0x70FD, 0xB7E9, 0x70FE, 0x9F55, + 0x70FF, 0x9F56, 0x7100, 0x9F57, 0x7101, 0x9F58, 0x7102, 0x9F59, + 0x7103, 0x9F5A, 0x7104, 0x9F5B, 0x7105, 0x9F5C, 0x7106, 0x9F5D, + 0x7107, 0x9F5E, 0x7108, 0x9F5F, 0x7109, 0xD1C9, 0x710A, 0xBAB8, + 0x710B, 0x9F60, 0x710C, 0x9F61, 0x710D, 0x9F62, 0x710E, 0x9F63, + 0x710F, 0x9F64, 0x7110, 0xECC9, 0x7111, 0x9F65, 0x7112, 0x9F66, + 0x7113, 0xECCA, 0x7114, 0x9F67, 0x7115, 0xBBC0, 0x7116, 0xECCB, + 0x7117, 0x9F68, 0x7118, 0xECE2, 0x7119, 0xB1BA, 0x711A, 0xB7D9, + 0x711B, 0x9F69, 0x711C, 0x9F6A, 0x711D, 0x9F6B, 0x711E, 0x9F6C, + 0x711F, 0x9F6D, 0x7120, 0x9F6E, 0x7121, 0x9F6F, 0x7122, 0x9F70, + 0x7123, 0x9F71, 0x7124, 0x9F72, 0x7125, 0x9F73, 0x7126, 0xBDB9, + 0x7127, 0x9F74, 0x7128, 0x9F75, 0x7129, 0x9F76, 0x712A, 0x9F77, + 0x712B, 0x9F78, 0x712C, 0x9F79, 0x712D, 0x9F7A, 0x712E, 0x9F7B, + 0x712F, 0xECCC, 0x7130, 0xD1E6, 0x7131, 0xECCD, 0x7132, 0x9F7C, + 0x7133, 0x9F7D, 0x7134, 0x9F7E, 0x7135, 0x9F80, 0x7136, 0xC8BB, + 0x7137, 0x9F81, 0x7138, 0x9F82, 0x7139, 0x9F83, 0x713A, 0x9F84, + 0x713B, 0x9F85, 0x713C, 0x9F86, 0x713D, 0x9F87, 0x713E, 0x9F88, + 0x713F, 0x9F89, 0x7140, 0x9F8A, 0x7141, 0x9F8B, 0x7142, 0x9F8C, + 0x7143, 0x9F8D, 0x7144, 0x9F8E, 0x7145, 0xECD1, 0x7146, 0x9F8F, + 0x7147, 0x9F90, 0x7148, 0x9F91, 0x7149, 0x9F92, 0x714A, 0xECD3, + 0x714B, 0x9F93, 0x714C, 0xBBCD, 0x714D, 0x9F94, 0x714E, 0xBCE5, + 0x714F, 0x9F95, 0x7150, 0x9F96, 0x7151, 0x9F97, 0x7152, 0x9F98, + 0x7153, 0x9F99, 0x7154, 0x9F9A, 0x7155, 0x9F9B, 0x7156, 0x9F9C, + 0x7157, 0x9F9D, 0x7158, 0x9F9E, 0x7159, 0x9F9F, 0x715A, 0x9FA0, + 0x715B, 0x9FA1, 0x715C, 0xECCF, 0x715D, 0x9FA2, 0x715E, 0xC9B7, + 0x715F, 0x9FA3, 0x7160, 0x9FA4, 0x7161, 0x9FA5, 0x7162, 0x9FA6, + 0x7163, 0x9FA7, 0x7164, 0xC3BA, 0x7165, 0x9FA8, 0x7166, 0xECE3, + 0x7167, 0xD5D5, 0x7168, 0xECD0, 0x7169, 0x9FA9, 0x716A, 0x9FAA, + 0x716B, 0x9FAB, 0x716C, 0x9FAC, 0x716D, 0x9FAD, 0x716E, 0xD6F3, + 0x716F, 0x9FAE, 0x7170, 0x9FAF, 0x7171, 0x9FB0, 0x7172, 0xECD2, + 0x7173, 0xECCE, 0x7174, 0x9FB1, 0x7175, 0x9FB2, 0x7176, 0x9FB3, + 0x7177, 0x9FB4, 0x7178, 0xECD4, 0x7179, 0x9FB5, 0x717A, 0xECD5, + 0x717B, 0x9FB6, 0x717C, 0x9FB7, 0x717D, 0xC9BF, 0x717E, 0x9FB8, + 0x717F, 0x9FB9, 0x7180, 0x9FBA, 0x7181, 0x9FBB, 0x7182, 0x9FBC, + 0x7183, 0x9FBD, 0x7184, 0xCFA8, 0x7185, 0x9FBE, 0x7186, 0x9FBF, + 0x7187, 0x9FC0, 0x7188, 0x9FC1, 0x7189, 0x9FC2, 0x718A, 0xD0DC, + 0x718B, 0x9FC3, 0x718C, 0x9FC4, 0x718D, 0x9FC5, 0x718E, 0x9FC6, + 0x718F, 0xD1AC, 0x7190, 0x9FC7, 0x7191, 0x9FC8, 0x7192, 0x9FC9, + 0x7193, 0x9FCA, 0x7194, 0xC8DB, 0x7195, 0x9FCB, 0x7196, 0x9FCC, + 0x7197, 0x9FCD, 0x7198, 0xECD6, 0x7199, 0xCEF5, 0x719A, 0x9FCE, + 0x719B, 0x9FCF, 0x719C, 0x9FD0, 0x719D, 0x9FD1, 0x719E, 0x9FD2, + 0x719F, 0xCAEC, 0x71A0, 0xECDA, 0x71A1, 0x9FD3, 0x71A2, 0x9FD4, + 0x71A3, 0x9FD5, 0x71A4, 0x9FD6, 0x71A5, 0x9FD7, 0x71A6, 0x9FD8, + 0x71A7, 0x9FD9, 0x71A8, 0xECD9, 0x71A9, 0x9FDA, 0x71AA, 0x9FDB, + 0x71AB, 0x9FDC, 0x71AC, 0xB0BE, 0x71AD, 0x9FDD, 0x71AE, 0x9FDE, + 0x71AF, 0x9FDF, 0x71B0, 0x9FE0, 0x71B1, 0x9FE1, 0x71B2, 0x9FE2, + 0x71B3, 0xECD7, 0x71B4, 0x9FE3, 0x71B5, 0xECD8, 0x71B6, 0x9FE4, + 0x71B7, 0x9FE5, 0x71B8, 0x9FE6, 0x71B9, 0xECE4, 0x71BA, 0x9FE7, + 0x71BB, 0x9FE8, 0x71BC, 0x9FE9, 0x71BD, 0x9FEA, 0x71BE, 0x9FEB, + 0x71BF, 0x9FEC, 0x71C0, 0x9FED, 0x71C1, 0x9FEE, 0x71C2, 0x9FEF, + 0x71C3, 0xC8BC, 0x71C4, 0x9FF0, 0x71C5, 0x9FF1, 0x71C6, 0x9FF2, + 0x71C7, 0x9FF3, 0x71C8, 0x9FF4, 0x71C9, 0x9FF5, 0x71CA, 0x9FF6, + 0x71CB, 0x9FF7, 0x71CC, 0x9FF8, 0x71CD, 0x9FF9, 0x71CE, 0xC1C7, + 0x71CF, 0x9FFA, 0x71D0, 0x9FFB, 0x71D1, 0x9FFC, 0x71D2, 0x9FFD, + 0x71D3, 0x9FFE, 0x71D4, 0xECDC, 0x71D5, 0xD1E0, 0x71D6, 0xA040, + 0x71D7, 0xA041, 0x71D8, 0xA042, 0x71D9, 0xA043, 0x71DA, 0xA044, + 0x71DB, 0xA045, 0x71DC, 0xA046, 0x71DD, 0xA047, 0x71DE, 0xA048, + 0x71DF, 0xA049, 0x71E0, 0xECDB, 0x71E1, 0xA04A, 0x71E2, 0xA04B, + 0x71E3, 0xA04C, 0x71E4, 0xA04D, 0x71E5, 0xD4EF, 0x71E6, 0xA04E, + 0x71E7, 0xECDD, 0x71E8, 0xA04F, 0x71E9, 0xA050, 0x71EA, 0xA051, + 0x71EB, 0xA052, 0x71EC, 0xA053, 0x71ED, 0xA054, 0x71EE, 0xDBC6, + 0x71EF, 0xA055, 0x71F0, 0xA056, 0x71F1, 0xA057, 0x71F2, 0xA058, + 0x71F3, 0xA059, 0x71F4, 0xA05A, 0x71F5, 0xA05B, 0x71F6, 0xA05C, + 0x71F7, 0xA05D, 0x71F8, 0xA05E, 0x71F9, 0xECDE, 0x71FA, 0xA05F, + 0x71FB, 0xA060, 0x71FC, 0xA061, 0x71FD, 0xA062, 0x71FE, 0xA063, + 0x71FF, 0xA064, 0x7200, 0xA065, 0x7201, 0xA066, 0x7202, 0xA067, + 0x7203, 0xA068, 0x7204, 0xA069, 0x7205, 0xA06A, 0x7206, 0xB1AC, + 0x7207, 0xA06B, 0x7208, 0xA06C, 0x7209, 0xA06D, 0x720A, 0xA06E, + 0x720B, 0xA06F, 0x720C, 0xA070, 0x720D, 0xA071, 0x720E, 0xA072, + 0x720F, 0xA073, 0x7210, 0xA074, 0x7211, 0xA075, 0x7212, 0xA076, + 0x7213, 0xA077, 0x7214, 0xA078, 0x7215, 0xA079, 0x7216, 0xA07A, + 0x7217, 0xA07B, 0x7218, 0xA07C, 0x7219, 0xA07D, 0x721A, 0xA07E, + 0x721B, 0xA080, 0x721C, 0xA081, 0x721D, 0xECDF, 0x721E, 0xA082, + 0x721F, 0xA083, 0x7220, 0xA084, 0x7221, 0xA085, 0x7222, 0xA086, + 0x7223, 0xA087, 0x7224, 0xA088, 0x7225, 0xA089, 0x7226, 0xA08A, + 0x7227, 0xA08B, 0x7228, 0xECE0, 0x7229, 0xA08C, 0x722A, 0xD7A6, + 0x722B, 0xA08D, 0x722C, 0xC5C0, 0x722D, 0xA08E, 0x722E, 0xA08F, + 0x722F, 0xA090, 0x7230, 0xEBBC, 0x7231, 0xB0AE, 0x7232, 0xA091, + 0x7233, 0xA092, 0x7234, 0xA093, 0x7235, 0xBEF4, 0x7236, 0xB8B8, + 0x7237, 0xD2AF, 0x7238, 0xB0D6, 0x7239, 0xB5F9, 0x723A, 0xA094, + 0x723B, 0xD8B3, 0x723C, 0xA095, 0x723D, 0xCBAC, 0x723E, 0xA096, + 0x723F, 0xE3DD, 0x7240, 0xA097, 0x7241, 0xA098, 0x7242, 0xA099, + 0x7243, 0xA09A, 0x7244, 0xA09B, 0x7245, 0xA09C, 0x7246, 0xA09D, + 0x7247, 0xC6AC, 0x7248, 0xB0E6, 0x7249, 0xA09E, 0x724A, 0xA09F, + 0x724B, 0xA0A0, 0x724C, 0xC5C6, 0x724D, 0xEBB9, 0x724E, 0xA0A1, + 0x724F, 0xA0A2, 0x7250, 0xA0A3, 0x7251, 0xA0A4, 0x7252, 0xEBBA, + 0x7253, 0xA0A5, 0x7254, 0xA0A6, 0x7255, 0xA0A7, 0x7256, 0xEBBB, + 0x7257, 0xA0A8, 0x7258, 0xA0A9, 0x7259, 0xD1C0, 0x725A, 0xA0AA, + 0x725B, 0xC5A3, 0x725C, 0xA0AB, 0x725D, 0xEAF2, 0x725E, 0xA0AC, + 0x725F, 0xC4B2, 0x7260, 0xA0AD, 0x7261, 0xC4B5, 0x7262, 0xC0CE, + 0x7263, 0xA0AE, 0x7264, 0xA0AF, 0x7265, 0xA0B0, 0x7266, 0xEAF3, + 0x7267, 0xC4C1, 0x7268, 0xA0B1, 0x7269, 0xCEEF, 0x726A, 0xA0B2, + 0x726B, 0xA0B3, 0x726C, 0xA0B4, 0x726D, 0xA0B5, 0x726E, 0xEAF0, + 0x726F, 0xEAF4, 0x7270, 0xA0B6, 0x7271, 0xA0B7, 0x7272, 0xC9FC, + 0x7273, 0xA0B8, 0x7274, 0xA0B9, 0x7275, 0xC7A3, 0x7276, 0xA0BA, + 0x7277, 0xA0BB, 0x7278, 0xA0BC, 0x7279, 0xCCD8, 0x727A, 0xCEFE, + 0x727B, 0xA0BD, 0x727C, 0xA0BE, 0x727D, 0xA0BF, 0x727E, 0xEAF5, + 0x727F, 0xEAF6, 0x7280, 0xCFAC, 0x7281, 0xC0E7, 0x7282, 0xA0C0, + 0x7283, 0xA0C1, 0x7284, 0xEAF7, 0x7285, 0xA0C2, 0x7286, 0xA0C3, + 0x7287, 0xA0C4, 0x7288, 0xA0C5, 0x7289, 0xA0C6, 0x728A, 0xB6BF, + 0x728B, 0xEAF8, 0x728C, 0xA0C7, 0x728D, 0xEAF9, 0x728E, 0xA0C8, + 0x728F, 0xEAFA, 0x7290, 0xA0C9, 0x7291, 0xA0CA, 0x7292, 0xEAFB, + 0x7293, 0xA0CB, 0x7294, 0xA0CC, 0x7295, 0xA0CD, 0x7296, 0xA0CE, + 0x7297, 0xA0CF, 0x7298, 0xA0D0, 0x7299, 0xA0D1, 0x729A, 0xA0D2, + 0x729B, 0xA0D3, 0x729C, 0xA0D4, 0x729D, 0xA0D5, 0x729E, 0xA0D6, + 0x729F, 0xEAF1, 0x72A0, 0xA0D7, 0x72A1, 0xA0D8, 0x72A2, 0xA0D9, + 0x72A3, 0xA0DA, 0x72A4, 0xA0DB, 0x72A5, 0xA0DC, 0x72A6, 0xA0DD, + 0x72A7, 0xA0DE, 0x72A8, 0xA0DF, 0x72A9, 0xA0E0, 0x72AA, 0xA0E1, + 0x72AB, 0xA0E2, 0x72AC, 0xC8AE, 0x72AD, 0xE1EB, 0x72AE, 0xA0E3, + 0x72AF, 0xB7B8, 0x72B0, 0xE1EC, 0x72B1, 0xA0E4, 0x72B2, 0xA0E5, + 0x72B3, 0xA0E6, 0x72B4, 0xE1ED, 0x72B5, 0xA0E7, 0x72B6, 0xD7B4, + 0x72B7, 0xE1EE, 0x72B8, 0xE1EF, 0x72B9, 0xD3CC, 0x72BA, 0xA0E8, + 0x72BB, 0xA0E9, 0x72BC, 0xA0EA, 0x72BD, 0xA0EB, 0x72BE, 0xA0EC, + 0x72BF, 0xA0ED, 0x72C0, 0xA0EE, 0x72C1, 0xE1F1, 0x72C2, 0xBFF1, + 0x72C3, 0xE1F0, 0x72C4, 0xB5D2, 0x72C5, 0xA0EF, 0x72C6, 0xA0F0, + 0x72C7, 0xA0F1, 0x72C8, 0xB1B7, 0x72C9, 0xA0F2, 0x72CA, 0xA0F3, + 0x72CB, 0xA0F4, 0x72CC, 0xA0F5, 0x72CD, 0xE1F3, 0x72CE, 0xE1F2, + 0x72CF, 0xA0F6, 0x72D0, 0xBAFC, 0x72D1, 0xA0F7, 0x72D2, 0xE1F4, + 0x72D3, 0xA0F8, 0x72D4, 0xA0F9, 0x72D5, 0xA0FA, 0x72D6, 0xA0FB, + 0x72D7, 0xB9B7, 0x72D8, 0xA0FC, 0x72D9, 0xBED1, 0x72DA, 0xA0FD, + 0x72DB, 0xA0FE, 0x72DC, 0xAA40, 0x72DD, 0xAA41, 0x72DE, 0xC4FC, + 0x72DF, 0xAA42, 0x72E0, 0xBADD, 0x72E1, 0xBDC6, 0x72E2, 0xAA43, + 0x72E3, 0xAA44, 0x72E4, 0xAA45, 0x72E5, 0xAA46, 0x72E6, 0xAA47, + 0x72E7, 0xAA48, 0x72E8, 0xE1F5, 0x72E9, 0xE1F7, 0x72EA, 0xAA49, + 0x72EB, 0xAA4A, 0x72EC, 0xB6C0, 0x72ED, 0xCFC1, 0x72EE, 0xCAA8, + 0x72EF, 0xE1F6, 0x72F0, 0xD5F8, 0x72F1, 0xD3FC, 0x72F2, 0xE1F8, + 0x72F3, 0xE1FC, 0x72F4, 0xE1F9, 0x72F5, 0xAA4B, 0x72F6, 0xAA4C, + 0x72F7, 0xE1FA, 0x72F8, 0xC0EA, 0x72F9, 0xAA4D, 0x72FA, 0xE1FE, + 0x72FB, 0xE2A1, 0x72FC, 0xC0C7, 0x72FD, 0xAA4E, 0x72FE, 0xAA4F, + 0x72FF, 0xAA50, 0x7300, 0xAA51, 0x7301, 0xE1FB, 0x7302, 0xAA52, + 0x7303, 0xE1FD, 0x7304, 0xAA53, 0x7305, 0xAA54, 0x7306, 0xAA55, + 0x7307, 0xAA56, 0x7308, 0xAA57, 0x7309, 0xAA58, 0x730A, 0xE2A5, + 0x730B, 0xAA59, 0x730C, 0xAA5A, 0x730D, 0xAA5B, 0x730E, 0xC1D4, + 0x730F, 0xAA5C, 0x7310, 0xAA5D, 0x7311, 0xAA5E, 0x7312, 0xAA5F, + 0x7313, 0xE2A3, 0x7314, 0xAA60, 0x7315, 0xE2A8, 0x7316, 0xB2FE, + 0x7317, 0xE2A2, 0x7318, 0xAA61, 0x7319, 0xAA62, 0x731A, 0xAA63, + 0x731B, 0xC3CD, 0x731C, 0xB2C2, 0x731D, 0xE2A7, 0x731E, 0xE2A6, + 0x731F, 0xAA64, 0x7320, 0xAA65, 0x7321, 0xE2A4, 0x7322, 0xE2A9, + 0x7323, 0xAA66, 0x7324, 0xAA67, 0x7325, 0xE2AB, 0x7326, 0xAA68, + 0x7327, 0xAA69, 0x7328, 0xAA6A, 0x7329, 0xD0C9, 0x732A, 0xD6ED, + 0x732B, 0xC3A8, 0x732C, 0xE2AC, 0x732D, 0xAA6B, 0x732E, 0xCFD7, + 0x732F, 0xAA6C, 0x7330, 0xAA6D, 0x7331, 0xE2AE, 0x7332, 0xAA6E, + 0x7333, 0xAA6F, 0x7334, 0xBAEF, 0x7335, 0xAA70, 0x7336, 0xAA71, + 0x7337, 0xE9E0, 0x7338, 0xE2AD, 0x7339, 0xE2AA, 0x733A, 0xAA72, + 0x733B, 0xAA73, 0x733C, 0xAA74, 0x733D, 0xAA75, 0x733E, 0xBBAB, + 0x733F, 0xD4B3, 0x7340, 0xAA76, 0x7341, 0xAA77, 0x7342, 0xAA78, + 0x7343, 0xAA79, 0x7344, 0xAA7A, 0x7345, 0xAA7B, 0x7346, 0xAA7C, + 0x7347, 0xAA7D, 0x7348, 0xAA7E, 0x7349, 0xAA80, 0x734A, 0xAA81, + 0x734B, 0xAA82, 0x734C, 0xAA83, 0x734D, 0xE2B0, 0x734E, 0xAA84, + 0x734F, 0xAA85, 0x7350, 0xE2AF, 0x7351, 0xAA86, 0x7352, 0xE9E1, + 0x7353, 0xAA87, 0x7354, 0xAA88, 0x7355, 0xAA89, 0x7356, 0xAA8A, + 0x7357, 0xE2B1, 0x7358, 0xAA8B, 0x7359, 0xAA8C, 0x735A, 0xAA8D, + 0x735B, 0xAA8E, 0x735C, 0xAA8F, 0x735D, 0xAA90, 0x735E, 0xAA91, + 0x735F, 0xAA92, 0x7360, 0xE2B2, 0x7361, 0xAA93, 0x7362, 0xAA94, + 0x7363, 0xAA95, 0x7364, 0xAA96, 0x7365, 0xAA97, 0x7366, 0xAA98, + 0x7367, 0xAA99, 0x7368, 0xAA9A, 0x7369, 0xAA9B, 0x736A, 0xAA9C, + 0x736B, 0xAA9D, 0x736C, 0xE2B3, 0x736D, 0xCCA1, 0x736E, 0xAA9E, + 0x736F, 0xE2B4, 0x7370, 0xAA9F, 0x7371, 0xAAA0, 0x7372, 0xAB40, + 0x7373, 0xAB41, 0x7374, 0xAB42, 0x7375, 0xAB43, 0x7376, 0xAB44, + 0x7377, 0xAB45, 0x7378, 0xAB46, 0x7379, 0xAB47, 0x737A, 0xAB48, + 0x737B, 0xAB49, 0x737C, 0xAB4A, 0x737D, 0xAB4B, 0x737E, 0xE2B5, + 0x737F, 0xAB4C, 0x7380, 0xAB4D, 0x7381, 0xAB4E, 0x7382, 0xAB4F, + 0x7383, 0xAB50, 0x7384, 0xD0FE, 0x7385, 0xAB51, 0x7386, 0xAB52, + 0x7387, 0xC2CA, 0x7388, 0xAB53, 0x7389, 0xD3F1, 0x738A, 0xAB54, + 0x738B, 0xCDF5, 0x738C, 0xAB55, 0x738D, 0xAB56, 0x738E, 0xE7E0, + 0x738F, 0xAB57, 0x7390, 0xAB58, 0x7391, 0xE7E1, 0x7392, 0xAB59, + 0x7393, 0xAB5A, 0x7394, 0xAB5B, 0x7395, 0xAB5C, 0x7396, 0xBEC1, + 0x7397, 0xAB5D, 0x7398, 0xAB5E, 0x7399, 0xAB5F, 0x739A, 0xAB60, + 0x739B, 0xC2EA, 0x739C, 0xAB61, 0x739D, 0xAB62, 0x739E, 0xAB63, + 0x739F, 0xE7E4, 0x73A0, 0xAB64, 0x73A1, 0xAB65, 0x73A2, 0xE7E3, + 0x73A3, 0xAB66, 0x73A4, 0xAB67, 0x73A5, 0xAB68, 0x73A6, 0xAB69, + 0x73A7, 0xAB6A, 0x73A8, 0xAB6B, 0x73A9, 0xCDE6, 0x73AA, 0xAB6C, + 0x73AB, 0xC3B5, 0x73AC, 0xAB6D, 0x73AD, 0xAB6E, 0x73AE, 0xE7E2, + 0x73AF, 0xBBB7, 0x73B0, 0xCFD6, 0x73B1, 0xAB6F, 0x73B2, 0xC1E1, + 0x73B3, 0xE7E9, 0x73B4, 0xAB70, 0x73B5, 0xAB71, 0x73B6, 0xAB72, + 0x73B7, 0xE7E8, 0x73B8, 0xAB73, 0x73B9, 0xAB74, 0x73BA, 0xE7F4, + 0x73BB, 0xB2A3, 0x73BC, 0xAB75, 0x73BD, 0xAB76, 0x73BE, 0xAB77, + 0x73BF, 0xAB78, 0x73C0, 0xE7EA, 0x73C1, 0xAB79, 0x73C2, 0xE7E6, + 0x73C3, 0xAB7A, 0x73C4, 0xAB7B, 0x73C5, 0xAB7C, 0x73C6, 0xAB7D, + 0x73C7, 0xAB7E, 0x73C8, 0xE7EC, 0x73C9, 0xE7EB, 0x73CA, 0xC9BA, + 0x73CB, 0xAB80, 0x73CC, 0xAB81, 0x73CD, 0xD5E4, 0x73CE, 0xAB82, + 0x73CF, 0xE7E5, 0x73D0, 0xB7A9, 0x73D1, 0xE7E7, 0x73D2, 0xAB83, + 0x73D3, 0xAB84, 0x73D4, 0xAB85, 0x73D5, 0xAB86, 0x73D6, 0xAB87, + 0x73D7, 0xAB88, 0x73D8, 0xAB89, 0x73D9, 0xE7EE, 0x73DA, 0xAB8A, + 0x73DB, 0xAB8B, 0x73DC, 0xAB8C, 0x73DD, 0xAB8D, 0x73DE, 0xE7F3, + 0x73DF, 0xAB8E, 0x73E0, 0xD6E9, 0x73E1, 0xAB8F, 0x73E2, 0xAB90, + 0x73E3, 0xAB91, 0x73E4, 0xAB92, 0x73E5, 0xE7ED, 0x73E6, 0xAB93, + 0x73E7, 0xE7F2, 0x73E8, 0xAB94, 0x73E9, 0xE7F1, 0x73EA, 0xAB95, + 0x73EB, 0xAB96, 0x73EC, 0xAB97, 0x73ED, 0xB0E0, 0x73EE, 0xAB98, + 0x73EF, 0xAB99, 0x73F0, 0xAB9A, 0x73F1, 0xAB9B, 0x73F2, 0xE7F5, + 0x73F3, 0xAB9C, 0x73F4, 0xAB9D, 0x73F5, 0xAB9E, 0x73F6, 0xAB9F, + 0x73F7, 0xABA0, 0x73F8, 0xAC40, 0x73F9, 0xAC41, 0x73FA, 0xAC42, + 0x73FB, 0xAC43, 0x73FC, 0xAC44, 0x73FD, 0xAC45, 0x73FE, 0xAC46, + 0x73FF, 0xAC47, 0x7400, 0xAC48, 0x7401, 0xAC49, 0x7402, 0xAC4A, + 0x7403, 0xC7F2, 0x7404, 0xAC4B, 0x7405, 0xC0C5, 0x7406, 0xC0ED, + 0x7407, 0xAC4C, 0x7408, 0xAC4D, 0x7409, 0xC1F0, 0x740A, 0xE7F0, + 0x740B, 0xAC4E, 0x740C, 0xAC4F, 0x740D, 0xAC50, 0x740E, 0xAC51, + 0x740F, 0xE7F6, 0x7410, 0xCBF6, 0x7411, 0xAC52, 0x7412, 0xAC53, + 0x7413, 0xAC54, 0x7414, 0xAC55, 0x7415, 0xAC56, 0x7416, 0xAC57, + 0x7417, 0xAC58, 0x7418, 0xAC59, 0x7419, 0xAC5A, 0x741A, 0xE8A2, + 0x741B, 0xE8A1, 0x741C, 0xAC5B, 0x741D, 0xAC5C, 0x741E, 0xAC5D, + 0x741F, 0xAC5E, 0x7420, 0xAC5F, 0x7421, 0xAC60, 0x7422, 0xD7C1, + 0x7423, 0xAC61, 0x7424, 0xAC62, 0x7425, 0xE7FA, 0x7426, 0xE7F9, + 0x7427, 0xAC63, 0x7428, 0xE7FB, 0x7429, 0xAC64, 0x742A, 0xE7F7, + 0x742B, 0xAC65, 0x742C, 0xE7FE, 0x742D, 0xAC66, 0x742E, 0xE7FD, + 0x742F, 0xAC67, 0x7430, 0xE7FC, 0x7431, 0xAC68, 0x7432, 0xAC69, + 0x7433, 0xC1D5, 0x7434, 0xC7D9, 0x7435, 0xC5FD, 0x7436, 0xC5C3, + 0x7437, 0xAC6A, 0x7438, 0xAC6B, 0x7439, 0xAC6C, 0x743A, 0xAC6D, + 0x743B, 0xAC6E, 0x743C, 0xC7ED, 0x743D, 0xAC6F, 0x743E, 0xAC70, + 0x743F, 0xAC71, 0x7440, 0xAC72, 0x7441, 0xE8A3, 0x7442, 0xAC73, + 0x7443, 0xAC74, 0x7444, 0xAC75, 0x7445, 0xAC76, 0x7446, 0xAC77, + 0x7447, 0xAC78, 0x7448, 0xAC79, 0x7449, 0xAC7A, 0x744A, 0xAC7B, + 0x744B, 0xAC7C, 0x744C, 0xAC7D, 0x744D, 0xAC7E, 0x744E, 0xAC80, + 0x744F, 0xAC81, 0x7450, 0xAC82, 0x7451, 0xAC83, 0x7452, 0xAC84, + 0x7453, 0xAC85, 0x7454, 0xAC86, 0x7455, 0xE8A6, 0x7456, 0xAC87, + 0x7457, 0xE8A5, 0x7458, 0xAC88, 0x7459, 0xE8A7, 0x745A, 0xBAF7, + 0x745B, 0xE7F8, 0x745C, 0xE8A4, 0x745D, 0xAC89, 0x745E, 0xC8F0, + 0x745F, 0xC9AA, 0x7460, 0xAC8A, 0x7461, 0xAC8B, 0x7462, 0xAC8C, + 0x7463, 0xAC8D, 0x7464, 0xAC8E, 0x7465, 0xAC8F, 0x7466, 0xAC90, + 0x7467, 0xAC91, 0x7468, 0xAC92, 0x7469, 0xAC93, 0x746A, 0xAC94, + 0x746B, 0xAC95, 0x746C, 0xAC96, 0x746D, 0xE8A9, 0x746E, 0xAC97, + 0x746F, 0xAC98, 0x7470, 0xB9E5, 0x7471, 0xAC99, 0x7472, 0xAC9A, + 0x7473, 0xAC9B, 0x7474, 0xAC9C, 0x7475, 0xAC9D, 0x7476, 0xD1FE, + 0x7477, 0xE8A8, 0x7478, 0xAC9E, 0x7479, 0xAC9F, 0x747A, 0xACA0, + 0x747B, 0xAD40, 0x747C, 0xAD41, 0x747D, 0xAD42, 0x747E, 0xE8AA, + 0x747F, 0xAD43, 0x7480, 0xE8AD, 0x7481, 0xE8AE, 0x7482, 0xAD44, + 0x7483, 0xC1A7, 0x7484, 0xAD45, 0x7485, 0xAD46, 0x7486, 0xAD47, + 0x7487, 0xE8AF, 0x7488, 0xAD48, 0x7489, 0xAD49, 0x748A, 0xAD4A, + 0x748B, 0xE8B0, 0x748C, 0xAD4B, 0x748D, 0xAD4C, 0x748E, 0xE8AC, + 0x748F, 0xAD4D, 0x7490, 0xE8B4, 0x7491, 0xAD4E, 0x7492, 0xAD4F, + 0x7493, 0xAD50, 0x7494, 0xAD51, 0x7495, 0xAD52, 0x7496, 0xAD53, + 0x7497, 0xAD54, 0x7498, 0xAD55, 0x7499, 0xAD56, 0x749A, 0xAD57, + 0x749B, 0xAD58, 0x749C, 0xE8AB, 0x749D, 0xAD59, 0x749E, 0xE8B1, + 0x749F, 0xAD5A, 0x74A0, 0xAD5B, 0x74A1, 0xAD5C, 0x74A2, 0xAD5D, + 0x74A3, 0xAD5E, 0x74A4, 0xAD5F, 0x74A5, 0xAD60, 0x74A6, 0xAD61, + 0x74A7, 0xE8B5, 0x74A8, 0xE8B2, 0x74A9, 0xE8B3, 0x74AA, 0xAD62, + 0x74AB, 0xAD63, 0x74AC, 0xAD64, 0x74AD, 0xAD65, 0x74AE, 0xAD66, + 0x74AF, 0xAD67, 0x74B0, 0xAD68, 0x74B1, 0xAD69, 0x74B2, 0xAD6A, + 0x74B3, 0xAD6B, 0x74B4, 0xAD6C, 0x74B5, 0xAD6D, 0x74B6, 0xAD6E, + 0x74B7, 0xAD6F, 0x74B8, 0xAD70, 0x74B9, 0xAD71, 0x74BA, 0xE8B7, + 0x74BB, 0xAD72, 0x74BC, 0xAD73, 0x74BD, 0xAD74, 0x74BE, 0xAD75, + 0x74BF, 0xAD76, 0x74C0, 0xAD77, 0x74C1, 0xAD78, 0x74C2, 0xAD79, + 0x74C3, 0xAD7A, 0x74C4, 0xAD7B, 0x74C5, 0xAD7C, 0x74C6, 0xAD7D, + 0x74C7, 0xAD7E, 0x74C8, 0xAD80, 0x74C9, 0xAD81, 0x74CA, 0xAD82, + 0x74CB, 0xAD83, 0x74CC, 0xAD84, 0x74CD, 0xAD85, 0x74CE, 0xAD86, + 0x74CF, 0xAD87, 0x74D0, 0xAD88, 0x74D1, 0xAD89, 0x74D2, 0xE8B6, + 0x74D3, 0xAD8A, 0x74D4, 0xAD8B, 0x74D5, 0xAD8C, 0x74D6, 0xAD8D, + 0x74D7, 0xAD8E, 0x74D8, 0xAD8F, 0x74D9, 0xAD90, 0x74DA, 0xAD91, + 0x74DB, 0xAD92, 0x74DC, 0xB9CF, 0x74DD, 0xAD93, 0x74DE, 0xF0AC, + 0x74DF, 0xAD94, 0x74E0, 0xF0AD, 0x74E1, 0xAD95, 0x74E2, 0xC6B0, + 0x74E3, 0xB0EA, 0x74E4, 0xC8BF, 0x74E5, 0xAD96, 0x74E6, 0xCDDF, + 0x74E7, 0xAD97, 0x74E8, 0xAD98, 0x74E9, 0xAD99, 0x74EA, 0xAD9A, + 0x74EB, 0xAD9B, 0x74EC, 0xAD9C, 0x74ED, 0xAD9D, 0x74EE, 0xCECD, + 0x74EF, 0xEAB1, 0x74F0, 0xAD9E, 0x74F1, 0xAD9F, 0x74F2, 0xADA0, + 0x74F3, 0xAE40, 0x74F4, 0xEAB2, 0x74F5, 0xAE41, 0x74F6, 0xC6BF, + 0x74F7, 0xB4C9, 0x74F8, 0xAE42, 0x74F9, 0xAE43, 0x74FA, 0xAE44, + 0x74FB, 0xAE45, 0x74FC, 0xAE46, 0x74FD, 0xAE47, 0x74FE, 0xAE48, + 0x74FF, 0xEAB3, 0x7500, 0xAE49, 0x7501, 0xAE4A, 0x7502, 0xAE4B, + 0x7503, 0xAE4C, 0x7504, 0xD5E7, 0x7505, 0xAE4D, 0x7506, 0xAE4E, + 0x7507, 0xAE4F, 0x7508, 0xAE50, 0x7509, 0xAE51, 0x750A, 0xAE52, + 0x750B, 0xAE53, 0x750C, 0xAE54, 0x750D, 0xDDF9, 0x750E, 0xAE55, + 0x750F, 0xEAB4, 0x7510, 0xAE56, 0x7511, 0xEAB5, 0x7512, 0xAE57, + 0x7513, 0xEAB6, 0x7514, 0xAE58, 0x7515, 0xAE59, 0x7516, 0xAE5A, + 0x7517, 0xAE5B, 0x7518, 0xB8CA, 0x7519, 0xDFB0, 0x751A, 0xC9F5, + 0x751B, 0xAE5C, 0x751C, 0xCCF0, 0x751D, 0xAE5D, 0x751E, 0xAE5E, + 0x751F, 0xC9FA, 0x7520, 0xAE5F, 0x7521, 0xAE60, 0x7522, 0xAE61, + 0x7523, 0xAE62, 0x7524, 0xAE63, 0x7525, 0xC9FB, 0x7526, 0xAE64, + 0x7527, 0xAE65, 0x7528, 0xD3C3, 0x7529, 0xCBA6, 0x752A, 0xAE66, + 0x752B, 0xB8A6, 0x752C, 0xF0AE, 0x752D, 0xB1C2, 0x752E, 0xAE67, + 0x752F, 0xE5B8, 0x7530, 0xCCEF, 0x7531, 0xD3C9, 0x7532, 0xBCD7, + 0x7533, 0xC9EA, 0x7534, 0xAE68, 0x7535, 0xB5E7, 0x7536, 0xAE69, + 0x7537, 0xC4D0, 0x7538, 0xB5E9, 0x7539, 0xAE6A, 0x753A, 0xEEAE, + 0x753B, 0xBBAD, 0x753C, 0xAE6B, 0x753D, 0xAE6C, 0x753E, 0xE7DE, + 0x753F, 0xAE6D, 0x7540, 0xEEAF, 0x7541, 0xAE6E, 0x7542, 0xAE6F, + 0x7543, 0xAE70, 0x7544, 0xAE71, 0x7545, 0xB3A9, 0x7546, 0xAE72, + 0x7547, 0xAE73, 0x7548, 0xEEB2, 0x7549, 0xAE74, 0x754A, 0xAE75, + 0x754B, 0xEEB1, 0x754C, 0xBDE7, 0x754D, 0xAE76, 0x754E, 0xEEB0, + 0x754F, 0xCEB7, 0x7550, 0xAE77, 0x7551, 0xAE78, 0x7552, 0xAE79, + 0x7553, 0xAE7A, 0x7554, 0xC5CF, 0x7555, 0xAE7B, 0x7556, 0xAE7C, + 0x7557, 0xAE7D, 0x7558, 0xAE7E, 0x7559, 0xC1F4, 0x755A, 0xDBCE, + 0x755B, 0xEEB3, 0x755C, 0xD0F3, 0x755D, 0xAE80, 0x755E, 0xAE81, + 0x755F, 0xAE82, 0x7560, 0xAE83, 0x7561, 0xAE84, 0x7562, 0xAE85, + 0x7563, 0xAE86, 0x7564, 0xAE87, 0x7565, 0xC2D4, 0x7566, 0xC6E8, + 0x7567, 0xAE88, 0x7568, 0xAE89, 0x7569, 0xAE8A, 0x756A, 0xB7AC, + 0x756B, 0xAE8B, 0x756C, 0xAE8C, 0x756D, 0xAE8D, 0x756E, 0xAE8E, + 0x756F, 0xAE8F, 0x7570, 0xAE90, 0x7571, 0xAE91, 0x7572, 0xEEB4, + 0x7573, 0xAE92, 0x7574, 0xB3EB, 0x7575, 0xAE93, 0x7576, 0xAE94, + 0x7577, 0xAE95, 0x7578, 0xBBFB, 0x7579, 0xEEB5, 0x757A, 0xAE96, + 0x757B, 0xAE97, 0x757C, 0xAE98, 0x757D, 0xAE99, 0x757E, 0xAE9A, + 0x757F, 0xE7DC, 0x7580, 0xAE9B, 0x7581, 0xAE9C, 0x7582, 0xAE9D, + 0x7583, 0xEEB6, 0x7584, 0xAE9E, 0x7585, 0xAE9F, 0x7586, 0xBDAE, + 0x7587, 0xAEA0, 0x7588, 0xAF40, 0x7589, 0xAF41, 0x758A, 0xAF42, + 0x758B, 0xF1E2, 0x758C, 0xAF43, 0x758D, 0xAF44, 0x758E, 0xAF45, + 0x758F, 0xCAE8, 0x7590, 0xAF46, 0x7591, 0xD2C9, 0x7592, 0xF0DA, + 0x7593, 0xAF47, 0x7594, 0xF0DB, 0x7595, 0xAF48, 0x7596, 0xF0DC, + 0x7597, 0xC1C6, 0x7598, 0xAF49, 0x7599, 0xB8ED, 0x759A, 0xBECE, + 0x759B, 0xAF4A, 0x759C, 0xAF4B, 0x759D, 0xF0DE, 0x759E, 0xAF4C, + 0x759F, 0xC5B1, 0x75A0, 0xF0DD, 0x75A1, 0xD1F1, 0x75A2, 0xAF4D, + 0x75A3, 0xF0E0, 0x75A4, 0xB0CC, 0x75A5, 0xBDEA, 0x75A6, 0xAF4E, + 0x75A7, 0xAF4F, 0x75A8, 0xAF50, 0x75A9, 0xAF51, 0x75AA, 0xAF52, + 0x75AB, 0xD2DF, 0x75AC, 0xF0DF, 0x75AD, 0xAF53, 0x75AE, 0xB4AF, + 0x75AF, 0xB7E8, 0x75B0, 0xF0E6, 0x75B1, 0xF0E5, 0x75B2, 0xC6A3, + 0x75B3, 0xF0E1, 0x75B4, 0xF0E2, 0x75B5, 0xB4C3, 0x75B6, 0xAF54, + 0x75B7, 0xAF55, 0x75B8, 0xF0E3, 0x75B9, 0xD5EE, 0x75BA, 0xAF56, + 0x75BB, 0xAF57, 0x75BC, 0xCCDB, 0x75BD, 0xBED2, 0x75BE, 0xBCB2, + 0x75BF, 0xAF58, 0x75C0, 0xAF59, 0x75C1, 0xAF5A, 0x75C2, 0xF0E8, + 0x75C3, 0xF0E7, 0x75C4, 0xF0E4, 0x75C5, 0xB2A1, 0x75C6, 0xAF5B, + 0x75C7, 0xD6A2, 0x75C8, 0xD3B8, 0x75C9, 0xBEB7, 0x75CA, 0xC8AC, + 0x75CB, 0xAF5C, 0x75CC, 0xAF5D, 0x75CD, 0xF0EA, 0x75CE, 0xAF5E, + 0x75CF, 0xAF5F, 0x75D0, 0xAF60, 0x75D1, 0xAF61, 0x75D2, 0xD1F7, + 0x75D3, 0xAF62, 0x75D4, 0xD6CC, 0x75D5, 0xBADB, 0x75D6, 0xF0E9, + 0x75D7, 0xAF63, 0x75D8, 0xB6BB, 0x75D9, 0xAF64, 0x75DA, 0xAF65, + 0x75DB, 0xCDB4, 0x75DC, 0xAF66, 0x75DD, 0xAF67, 0x75DE, 0xC6A6, + 0x75DF, 0xAF68, 0x75E0, 0xAF69, 0x75E1, 0xAF6A, 0x75E2, 0xC1A1, + 0x75E3, 0xF0EB, 0x75E4, 0xF0EE, 0x75E5, 0xAF6B, 0x75E6, 0xF0ED, + 0x75E7, 0xF0F0, 0x75E8, 0xF0EC, 0x75E9, 0xAF6C, 0x75EA, 0xBBBE, + 0x75EB, 0xF0EF, 0x75EC, 0xAF6D, 0x75ED, 0xAF6E, 0x75EE, 0xAF6F, + 0x75EF, 0xAF70, 0x75F0, 0xCCB5, 0x75F1, 0xF0F2, 0x75F2, 0xAF71, + 0x75F3, 0xAF72, 0x75F4, 0xB3D5, 0x75F5, 0xAF73, 0x75F6, 0xAF74, + 0x75F7, 0xAF75, 0x75F8, 0xAF76, 0x75F9, 0xB1D4, 0x75FA, 0xAF77, + 0x75FB, 0xAF78, 0x75FC, 0xF0F3, 0x75FD, 0xAF79, 0x75FE, 0xAF7A, + 0x75FF, 0xF0F4, 0x7600, 0xF0F6, 0x7601, 0xB4E1, 0x7602, 0xAF7B, + 0x7603, 0xF0F1, 0x7604, 0xAF7C, 0x7605, 0xF0F7, 0x7606, 0xAF7D, + 0x7607, 0xAF7E, 0x7608, 0xAF80, 0x7609, 0xAF81, 0x760A, 0xF0FA, + 0x760B, 0xAF82, 0x760C, 0xF0F8, 0x760D, 0xAF83, 0x760E, 0xAF84, + 0x760F, 0xAF85, 0x7610, 0xF0F5, 0x7611, 0xAF86, 0x7612, 0xAF87, + 0x7613, 0xAF88, 0x7614, 0xAF89, 0x7615, 0xF0FD, 0x7616, 0xAF8A, + 0x7617, 0xF0F9, 0x7618, 0xF0FC, 0x7619, 0xF0FE, 0x761A, 0xAF8B, + 0x761B, 0xF1A1, 0x761C, 0xAF8C, 0x761D, 0xAF8D, 0x761E, 0xAF8E, + 0x761F, 0xCEC1, 0x7620, 0xF1A4, 0x7621, 0xAF8F, 0x7622, 0xF1A3, + 0x7623, 0xAF90, 0x7624, 0xC1F6, 0x7625, 0xF0FB, 0x7626, 0xCADD, + 0x7627, 0xAF91, 0x7628, 0xAF92, 0x7629, 0xB4F1, 0x762A, 0xB1F1, + 0x762B, 0xCCB1, 0x762C, 0xAF93, 0x762D, 0xF1A6, 0x762E, 0xAF94, + 0x762F, 0xAF95, 0x7630, 0xF1A7, 0x7631, 0xAF96, 0x7632, 0xAF97, + 0x7633, 0xF1AC, 0x7634, 0xD5CE, 0x7635, 0xF1A9, 0x7636, 0xAF98, + 0x7637, 0xAF99, 0x7638, 0xC8B3, 0x7639, 0xAF9A, 0x763A, 0xAF9B, + 0x763B, 0xAF9C, 0x763C, 0xF1A2, 0x763D, 0xAF9D, 0x763E, 0xF1AB, + 0x763F, 0xF1A8, 0x7640, 0xF1A5, 0x7641, 0xAF9E, 0x7642, 0xAF9F, + 0x7643, 0xF1AA, 0x7644, 0xAFA0, 0x7645, 0xB040, 0x7646, 0xB041, + 0x7647, 0xB042, 0x7648, 0xB043, 0x7649, 0xB044, 0x764A, 0xB045, + 0x764B, 0xB046, 0x764C, 0xB0A9, 0x764D, 0xF1AD, 0x764E, 0xB047, + 0x764F, 0xB048, 0x7650, 0xB049, 0x7651, 0xB04A, 0x7652, 0xB04B, + 0x7653, 0xB04C, 0x7654, 0xF1AF, 0x7655, 0xB04D, 0x7656, 0xF1B1, + 0x7657, 0xB04E, 0x7658, 0xB04F, 0x7659, 0xB050, 0x765A, 0xB051, + 0x765B, 0xB052, 0x765C, 0xF1B0, 0x765D, 0xB053, 0x765E, 0xF1AE, + 0x765F, 0xB054, 0x7660, 0xB055, 0x7661, 0xB056, 0x7662, 0xB057, + 0x7663, 0xD1A2, 0x7664, 0xB058, 0x7665, 0xB059, 0x7666, 0xB05A, + 0x7667, 0xB05B, 0x7668, 0xB05C, 0x7669, 0xB05D, 0x766A, 0xB05E, + 0x766B, 0xF1B2, 0x766C, 0xB05F, 0x766D, 0xB060, 0x766E, 0xB061, + 0x766F, 0xF1B3, 0x7670, 0xB062, 0x7671, 0xB063, 0x7672, 0xB064, + 0x7673, 0xB065, 0x7674, 0xB066, 0x7675, 0xB067, 0x7676, 0xB068, + 0x7677, 0xB069, 0x7678, 0xB9EF, 0x7679, 0xB06A, 0x767A, 0xB06B, + 0x767B, 0xB5C7, 0x767C, 0xB06C, 0x767D, 0xB0D7, 0x767E, 0xB0D9, + 0x767F, 0xB06D, 0x7680, 0xB06E, 0x7681, 0xB06F, 0x7682, 0xD4ED, + 0x7683, 0xB070, 0x7684, 0xB5C4, 0x7685, 0xB071, 0x7686, 0xBDD4, + 0x7687, 0xBBCA, 0x7688, 0xF0A7, 0x7689, 0xB072, 0x768A, 0xB073, + 0x768B, 0xB8DE, 0x768C, 0xB074, 0x768D, 0xB075, 0x768E, 0xF0A8, + 0x768F, 0xB076, 0x7690, 0xB077, 0x7691, 0xB0A8, 0x7692, 0xB078, + 0x7693, 0xF0A9, 0x7694, 0xB079, 0x7695, 0xB07A, 0x7696, 0xCDEE, + 0x7697, 0xB07B, 0x7698, 0xB07C, 0x7699, 0xF0AA, 0x769A, 0xB07D, + 0x769B, 0xB07E, 0x769C, 0xB080, 0x769D, 0xB081, 0x769E, 0xB082, + 0x769F, 0xB083, 0x76A0, 0xB084, 0x76A1, 0xB085, 0x76A2, 0xB086, + 0x76A3, 0xB087, 0x76A4, 0xF0AB, 0x76A5, 0xB088, 0x76A6, 0xB089, + 0x76A7, 0xB08A, 0x76A8, 0xB08B, 0x76A9, 0xB08C, 0x76AA, 0xB08D, + 0x76AB, 0xB08E, 0x76AC, 0xB08F, 0x76AD, 0xB090, 0x76AE, 0xC6A4, + 0x76AF, 0xB091, 0x76B0, 0xB092, 0x76B1, 0xD6E5, 0x76B2, 0xF1E4, + 0x76B3, 0xB093, 0x76B4, 0xF1E5, 0x76B5, 0xB094, 0x76B6, 0xB095, + 0x76B7, 0xB096, 0x76B8, 0xB097, 0x76B9, 0xB098, 0x76BA, 0xB099, + 0x76BB, 0xB09A, 0x76BC, 0xB09B, 0x76BD, 0xB09C, 0x76BE, 0xB09D, + 0x76BF, 0xC3F3, 0x76C0, 0xB09E, 0x76C1, 0xB09F, 0x76C2, 0xD3DB, + 0x76C3, 0xB0A0, 0x76C4, 0xB140, 0x76C5, 0xD6D1, 0x76C6, 0xC5E8, + 0x76C7, 0xB141, 0x76C8, 0xD3AF, 0x76C9, 0xB142, 0x76CA, 0xD2E6, + 0x76CB, 0xB143, 0x76CC, 0xB144, 0x76CD, 0xEEC1, 0x76CE, 0xB0BB, + 0x76CF, 0xD5B5, 0x76D0, 0xD1CE, 0x76D1, 0xBCE0, 0x76D2, 0xBAD0, + 0x76D3, 0xB145, 0x76D4, 0xBFF8, 0x76D5, 0xB146, 0x76D6, 0xB8C7, + 0x76D7, 0xB5C1, 0x76D8, 0xC5CC, 0x76D9, 0xB147, 0x76DA, 0xB148, + 0x76DB, 0xCAA2, 0x76DC, 0xB149, 0x76DD, 0xB14A, 0x76DE, 0xB14B, + 0x76DF, 0xC3CB, 0x76E0, 0xB14C, 0x76E1, 0xB14D, 0x76E2, 0xB14E, + 0x76E3, 0xB14F, 0x76E4, 0xB150, 0x76E5, 0xEEC2, 0x76E6, 0xB151, + 0x76E7, 0xB152, 0x76E8, 0xB153, 0x76E9, 0xB154, 0x76EA, 0xB155, + 0x76EB, 0xB156, 0x76EC, 0xB157, 0x76ED, 0xB158, 0x76EE, 0xC4BF, + 0x76EF, 0xB6A2, 0x76F0, 0xB159, 0x76F1, 0xEDEC, 0x76F2, 0xC3A4, + 0x76F3, 0xB15A, 0x76F4, 0xD6B1, 0x76F5, 0xB15B, 0x76F6, 0xB15C, + 0x76F7, 0xB15D, 0x76F8, 0xCFE0, 0x76F9, 0xEDEF, 0x76FA, 0xB15E, + 0x76FB, 0xB15F, 0x76FC, 0xC5CE, 0x76FD, 0xB160, 0x76FE, 0xB6DC, + 0x76FF, 0xB161, 0x7700, 0xB162, 0x7701, 0xCAA1, 0x7702, 0xB163, + 0x7703, 0xB164, 0x7704, 0xEDED, 0x7705, 0xB165, 0x7706, 0xB166, + 0x7707, 0xEDF0, 0x7708, 0xEDF1, 0x7709, 0xC3BC, 0x770A, 0xB167, + 0x770B, 0xBFB4, 0x770C, 0xB168, 0x770D, 0xEDEE, 0x770E, 0xB169, + 0x770F, 0xB16A, 0x7710, 0xB16B, 0x7711, 0xB16C, 0x7712, 0xB16D, + 0x7713, 0xB16E, 0x7714, 0xB16F, 0x7715, 0xB170, 0x7716, 0xB171, + 0x7717, 0xB172, 0x7718, 0xB173, 0x7719, 0xEDF4, 0x771A, 0xEDF2, + 0x771B, 0xB174, 0x771C, 0xB175, 0x771D, 0xB176, 0x771E, 0xB177, + 0x771F, 0xD5E6, 0x7720, 0xC3DF, 0x7721, 0xB178, 0x7722, 0xEDF3, + 0x7723, 0xB179, 0x7724, 0xB17A, 0x7725, 0xB17B, 0x7726, 0xEDF6, + 0x7727, 0xB17C, 0x7728, 0xD5A3, 0x7729, 0xD1A3, 0x772A, 0xB17D, + 0x772B, 0xB17E, 0x772C, 0xB180, 0x772D, 0xEDF5, 0x772E, 0xB181, + 0x772F, 0xC3D0, 0x7730, 0xB182, 0x7731, 0xB183, 0x7732, 0xB184, + 0x7733, 0xB185, 0x7734, 0xB186, 0x7735, 0xEDF7, 0x7736, 0xBFF4, + 0x7737, 0xBEEC, 0x7738, 0xEDF8, 0x7739, 0xB187, 0x773A, 0xCCF7, + 0x773B, 0xB188, 0x773C, 0xD1DB, 0x773D, 0xB189, 0x773E, 0xB18A, + 0x773F, 0xB18B, 0x7740, 0xD7C5, 0x7741, 0xD5F6, 0x7742, 0xB18C, + 0x7743, 0xEDFC, 0x7744, 0xB18D, 0x7745, 0xB18E, 0x7746, 0xB18F, + 0x7747, 0xEDFB, 0x7748, 0xB190, 0x7749, 0xB191, 0x774A, 0xB192, + 0x774B, 0xB193, 0x774C, 0xB194, 0x774D, 0xB195, 0x774E, 0xB196, + 0x774F, 0xB197, 0x7750, 0xEDF9, 0x7751, 0xEDFA, 0x7752, 0xB198, + 0x7753, 0xB199, 0x7754, 0xB19A, 0x7755, 0xB19B, 0x7756, 0xB19C, + 0x7757, 0xB19D, 0x7758, 0xB19E, 0x7759, 0xB19F, 0x775A, 0xEDFD, + 0x775B, 0xBEA6, 0x775C, 0xB1A0, 0x775D, 0xB240, 0x775E, 0xB241, + 0x775F, 0xB242, 0x7760, 0xB243, 0x7761, 0xCBAF, 0x7762, 0xEEA1, + 0x7763, 0xB6BD, 0x7764, 0xB244, 0x7765, 0xEEA2, 0x7766, 0xC4C0, + 0x7767, 0xB245, 0x7768, 0xEDFE, 0x7769, 0xB246, 0x776A, 0xB247, + 0x776B, 0xBDDE, 0x776C, 0xB2C7, 0x776D, 0xB248, 0x776E, 0xB249, + 0x776F, 0xB24A, 0x7770, 0xB24B, 0x7771, 0xB24C, 0x7772, 0xB24D, + 0x7773, 0xB24E, 0x7774, 0xB24F, 0x7775, 0xB250, 0x7776, 0xB251, + 0x7777, 0xB252, 0x7778, 0xB253, 0x7779, 0xB6C3, 0x777A, 0xB254, + 0x777B, 0xB255, 0x777C, 0xB256, 0x777D, 0xEEA5, 0x777E, 0xD8BA, + 0x777F, 0xEEA3, 0x7780, 0xEEA6, 0x7781, 0xB257, 0x7782, 0xB258, + 0x7783, 0xB259, 0x7784, 0xC3E9, 0x7785, 0xB3F2, 0x7786, 0xB25A, + 0x7787, 0xB25B, 0x7788, 0xB25C, 0x7789, 0xB25D, 0x778A, 0xB25E, + 0x778B, 0xB25F, 0x778C, 0xEEA7, 0x778D, 0xEEA4, 0x778E, 0xCFB9, + 0x778F, 0xB260, 0x7790, 0xB261, 0x7791, 0xEEA8, 0x7792, 0xC2F7, + 0x7793, 0xB262, 0x7794, 0xB263, 0x7795, 0xB264, 0x7796, 0xB265, + 0x7797, 0xB266, 0x7798, 0xB267, 0x7799, 0xB268, 0x779A, 0xB269, + 0x779B, 0xB26A, 0x779C, 0xB26B, 0x779D, 0xB26C, 0x779E, 0xB26D, + 0x779F, 0xEEA9, 0x77A0, 0xEEAA, 0x77A1, 0xB26E, 0x77A2, 0xDEAB, + 0x77A3, 0xB26F, 0x77A4, 0xB270, 0x77A5, 0xC6B3, 0x77A6, 0xB271, + 0x77A7, 0xC7C6, 0x77A8, 0xB272, 0x77A9, 0xD6F5, 0x77AA, 0xB5C9, + 0x77AB, 0xB273, 0x77AC, 0xCBB2, 0x77AD, 0xB274, 0x77AE, 0xB275, + 0x77AF, 0xB276, 0x77B0, 0xEEAB, 0x77B1, 0xB277, 0x77B2, 0xB278, + 0x77B3, 0xCDAB, 0x77B4, 0xB279, 0x77B5, 0xEEAC, 0x77B6, 0xB27A, + 0x77B7, 0xB27B, 0x77B8, 0xB27C, 0x77B9, 0xB27D, 0x77BA, 0xB27E, + 0x77BB, 0xD5B0, 0x77BC, 0xB280, 0x77BD, 0xEEAD, 0x77BE, 0xB281, + 0x77BF, 0xF6C4, 0x77C0, 0xB282, 0x77C1, 0xB283, 0x77C2, 0xB284, + 0x77C3, 0xB285, 0x77C4, 0xB286, 0x77C5, 0xB287, 0x77C6, 0xB288, + 0x77C7, 0xB289, 0x77C8, 0xB28A, 0x77C9, 0xB28B, 0x77CA, 0xB28C, + 0x77CB, 0xB28D, 0x77CC, 0xB28E, 0x77CD, 0xDBC7, 0x77CE, 0xB28F, + 0x77CF, 0xB290, 0x77D0, 0xB291, 0x77D1, 0xB292, 0x77D2, 0xB293, + 0x77D3, 0xB294, 0x77D4, 0xB295, 0x77D5, 0xB296, 0x77D6, 0xB297, + 0x77D7, 0xB4A3, 0x77D8, 0xB298, 0x77D9, 0xB299, 0x77DA, 0xB29A, + 0x77DB, 0xC3AC, 0x77DC, 0xF1E6, 0x77DD, 0xB29B, 0x77DE, 0xB29C, + 0x77DF, 0xB29D, 0x77E0, 0xB29E, 0x77E1, 0xB29F, 0x77E2, 0xCAB8, + 0x77E3, 0xD2D3, 0x77E4, 0xB2A0, 0x77E5, 0xD6AA, 0x77E6, 0xB340, + 0x77E7, 0xEFF2, 0x77E8, 0xB341, 0x77E9, 0xBED8, 0x77EA, 0xB342, + 0x77EB, 0xBDC3, 0x77EC, 0xEFF3, 0x77ED, 0xB6CC, 0x77EE, 0xB0AB, + 0x77EF, 0xB343, 0x77F0, 0xB344, 0x77F1, 0xB345, 0x77F2, 0xB346, + 0x77F3, 0xCAAF, 0x77F4, 0xB347, 0x77F5, 0xB348, 0x77F6, 0xEDB6, + 0x77F7, 0xB349, 0x77F8, 0xEDB7, 0x77F9, 0xB34A, 0x77FA, 0xB34B, + 0x77FB, 0xB34C, 0x77FC, 0xB34D, 0x77FD, 0xCEF9, 0x77FE, 0xB7AF, + 0x77FF, 0xBFF3, 0x7800, 0xEDB8, 0x7801, 0xC2EB, 0x7802, 0xC9B0, + 0x7803, 0xB34E, 0x7804, 0xB34F, 0x7805, 0xB350, 0x7806, 0xB351, + 0x7807, 0xB352, 0x7808, 0xB353, 0x7809, 0xEDB9, 0x780A, 0xB354, + 0x780B, 0xB355, 0x780C, 0xC6F6, 0x780D, 0xBFB3, 0x780E, 0xB356, + 0x780F, 0xB357, 0x7810, 0xB358, 0x7811, 0xEDBC, 0x7812, 0xC5F8, + 0x7813, 0xB359, 0x7814, 0xD1D0, 0x7815, 0xB35A, 0x7816, 0xD7A9, + 0x7817, 0xEDBA, 0x7818, 0xEDBB, 0x7819, 0xB35B, 0x781A, 0xD1E2, + 0x781B, 0xB35C, 0x781C, 0xEDBF, 0x781D, 0xEDC0, 0x781E, 0xB35D, + 0x781F, 0xEDC4, 0x7820, 0xB35E, 0x7821, 0xB35F, 0x7822, 0xB360, + 0x7823, 0xEDC8, 0x7824, 0xB361, 0x7825, 0xEDC6, 0x7826, 0xEDCE, + 0x7827, 0xD5E8, 0x7828, 0xB362, 0x7829, 0xEDC9, 0x782A, 0xB363, + 0x782B, 0xB364, 0x782C, 0xEDC7, 0x782D, 0xEDBE, 0x782E, 0xB365, + 0x782F, 0xB366, 0x7830, 0xC5E9, 0x7831, 0xB367, 0x7832, 0xB368, + 0x7833, 0xB369, 0x7834, 0xC6C6, 0x7835, 0xB36A, 0x7836, 0xB36B, + 0x7837, 0xC9E9, 0x7838, 0xD4D2, 0x7839, 0xEDC1, 0x783A, 0xEDC2, + 0x783B, 0xEDC3, 0x783C, 0xEDC5, 0x783D, 0xB36C, 0x783E, 0xC0F9, + 0x783F, 0xB36D, 0x7840, 0xB4A1, 0x7841, 0xB36E, 0x7842, 0xB36F, + 0x7843, 0xB370, 0x7844, 0xB371, 0x7845, 0xB9E8, 0x7846, 0xB372, + 0x7847, 0xEDD0, 0x7848, 0xB373, 0x7849, 0xB374, 0x784A, 0xB375, + 0x784B, 0xB376, 0x784C, 0xEDD1, 0x784D, 0xB377, 0x784E, 0xEDCA, + 0x784F, 0xB378, 0x7850, 0xEDCF, 0x7851, 0xB379, 0x7852, 0xCEF8, + 0x7853, 0xB37A, 0x7854, 0xB37B, 0x7855, 0xCBB6, 0x7856, 0xEDCC, + 0x7857, 0xEDCD, 0x7858, 0xB37C, 0x7859, 0xB37D, 0x785A, 0xB37E, + 0x785B, 0xB380, 0x785C, 0xB381, 0x785D, 0xCFF5, 0x785E, 0xB382, + 0x785F, 0xB383, 0x7860, 0xB384, 0x7861, 0xB385, 0x7862, 0xB386, + 0x7863, 0xB387, 0x7864, 0xB388, 0x7865, 0xB389, 0x7866, 0xB38A, + 0x7867, 0xB38B, 0x7868, 0xB38C, 0x7869, 0xB38D, 0x786A, 0xEDD2, + 0x786B, 0xC1F2, 0x786C, 0xD3B2, 0x786D, 0xEDCB, 0x786E, 0xC8B7, + 0x786F, 0xB38E, 0x7870, 0xB38F, 0x7871, 0xB390, 0x7872, 0xB391, + 0x7873, 0xB392, 0x7874, 0xB393, 0x7875, 0xB394, 0x7876, 0xB395, + 0x7877, 0xBCEF, 0x7878, 0xB396, 0x7879, 0xB397, 0x787A, 0xB398, + 0x787B, 0xB399, 0x787C, 0xC5F0, 0x787D, 0xB39A, 0x787E, 0xB39B, + 0x787F, 0xB39C, 0x7880, 0xB39D, 0x7881, 0xB39E, 0x7882, 0xB39F, + 0x7883, 0xB3A0, 0x7884, 0xB440, 0x7885, 0xB441, 0x7886, 0xB442, + 0x7887, 0xEDD6, 0x7888, 0xB443, 0x7889, 0xB5EF, 0x788A, 0xB444, + 0x788B, 0xB445, 0x788C, 0xC2B5, 0x788D, 0xB0AD, 0x788E, 0xCBE9, + 0x788F, 0xB446, 0x7890, 0xB447, 0x7891, 0xB1AE, 0x7892, 0xB448, + 0x7893, 0xEDD4, 0x7894, 0xB449, 0x7895, 0xB44A, 0x7896, 0xB44B, + 0x7897, 0xCDEB, 0x7898, 0xB5E2, 0x7899, 0xB44C, 0x789A, 0xEDD5, + 0x789B, 0xEDD3, 0x789C, 0xEDD7, 0x789D, 0xB44D, 0x789E, 0xB44E, + 0x789F, 0xB5FA, 0x78A0, 0xB44F, 0x78A1, 0xEDD8, 0x78A2, 0xB450, + 0x78A3, 0xEDD9, 0x78A4, 0xB451, 0x78A5, 0xEDDC, 0x78A6, 0xB452, + 0x78A7, 0xB1CC, 0x78A8, 0xB453, 0x78A9, 0xB454, 0x78AA, 0xB455, + 0x78AB, 0xB456, 0x78AC, 0xB457, 0x78AD, 0xB458, 0x78AE, 0xB459, + 0x78AF, 0xB45A, 0x78B0, 0xC5F6, 0x78B1, 0xBCEE, 0x78B2, 0xEDDA, + 0x78B3, 0xCCBC, 0x78B4, 0xB2EA, 0x78B5, 0xB45B, 0x78B6, 0xB45C, + 0x78B7, 0xB45D, 0x78B8, 0xB45E, 0x78B9, 0xEDDB, 0x78BA, 0xB45F, + 0x78BB, 0xB460, 0x78BC, 0xB461, 0x78BD, 0xB462, 0x78BE, 0xC4EB, + 0x78BF, 0xB463, 0x78C0, 0xB464, 0x78C1, 0xB4C5, 0x78C2, 0xB465, + 0x78C3, 0xB466, 0x78C4, 0xB467, 0x78C5, 0xB0F5, 0x78C6, 0xB468, + 0x78C7, 0xB469, 0x78C8, 0xB46A, 0x78C9, 0xEDDF, 0x78CA, 0xC0DA, + 0x78CB, 0xB4E8, 0x78CC, 0xB46B, 0x78CD, 0xB46C, 0x78CE, 0xB46D, + 0x78CF, 0xB46E, 0x78D0, 0xC5CD, 0x78D1, 0xB46F, 0x78D2, 0xB470, + 0x78D3, 0xB471, 0x78D4, 0xEDDD, 0x78D5, 0xBFC4, 0x78D6, 0xB472, + 0x78D7, 0xB473, 0x78D8, 0xB474, 0x78D9, 0xEDDE, 0x78DA, 0xB475, + 0x78DB, 0xB476, 0x78DC, 0xB477, 0x78DD, 0xB478, 0x78DE, 0xB479, + 0x78DF, 0xB47A, 0x78E0, 0xB47B, 0x78E1, 0xB47C, 0x78E2, 0xB47D, + 0x78E3, 0xB47E, 0x78E4, 0xB480, 0x78E5, 0xB481, 0x78E6, 0xB482, + 0x78E7, 0xB483, 0x78E8, 0xC4A5, 0x78E9, 0xB484, 0x78EA, 0xB485, + 0x78EB, 0xB486, 0x78EC, 0xEDE0, 0x78ED, 0xB487, 0x78EE, 0xB488, + 0x78EF, 0xB489, 0x78F0, 0xB48A, 0x78F1, 0xB48B, 0x78F2, 0xEDE1, + 0x78F3, 0xB48C, 0x78F4, 0xEDE3, 0x78F5, 0xB48D, 0x78F6, 0xB48E, + 0x78F7, 0xC1D7, 0x78F8, 0xB48F, 0x78F9, 0xB490, 0x78FA, 0xBBC7, + 0x78FB, 0xB491, 0x78FC, 0xB492, 0x78FD, 0xB493, 0x78FE, 0xB494, + 0x78FF, 0xB495, 0x7900, 0xB496, 0x7901, 0xBDB8, 0x7902, 0xB497, + 0x7903, 0xB498, 0x7904, 0xB499, 0x7905, 0xEDE2, 0x7906, 0xB49A, + 0x7907, 0xB49B, 0x7908, 0xB49C, 0x7909, 0xB49D, 0x790A, 0xB49E, + 0x790B, 0xB49F, 0x790C, 0xB4A0, 0x790D, 0xB540, 0x790E, 0xB541, + 0x790F, 0xB542, 0x7910, 0xB543, 0x7911, 0xB544, 0x7912, 0xB545, + 0x7913, 0xEDE4, 0x7914, 0xB546, 0x7915, 0xB547, 0x7916, 0xB548, + 0x7917, 0xB549, 0x7918, 0xB54A, 0x7919, 0xB54B, 0x791A, 0xB54C, + 0x791B, 0xB54D, 0x791C, 0xB54E, 0x791D, 0xB54F, 0x791E, 0xEDE6, + 0x791F, 0xB550, 0x7920, 0xB551, 0x7921, 0xB552, 0x7922, 0xB553, + 0x7923, 0xB554, 0x7924, 0xEDE5, 0x7925, 0xB555, 0x7926, 0xB556, + 0x7927, 0xB557, 0x7928, 0xB558, 0x7929, 0xB559, 0x792A, 0xB55A, + 0x792B, 0xB55B, 0x792C, 0xB55C, 0x792D, 0xB55D, 0x792E, 0xB55E, + 0x792F, 0xB55F, 0x7930, 0xB560, 0x7931, 0xB561, 0x7932, 0xB562, + 0x7933, 0xB563, 0x7934, 0xEDE7, 0x7935, 0xB564, 0x7936, 0xB565, + 0x7937, 0xB566, 0x7938, 0xB567, 0x7939, 0xB568, 0x793A, 0xCABE, + 0x793B, 0xECEA, 0x793C, 0xC0F1, 0x793D, 0xB569, 0x793E, 0xC9E7, + 0x793F, 0xB56A, 0x7940, 0xECEB, 0x7941, 0xC6EE, 0x7942, 0xB56B, + 0x7943, 0xB56C, 0x7944, 0xB56D, 0x7945, 0xB56E, 0x7946, 0xECEC, + 0x7947, 0xB56F, 0x7948, 0xC6ED, 0x7949, 0xECED, 0x794A, 0xB570, + 0x794B, 0xB571, 0x794C, 0xB572, 0x794D, 0xB573, 0x794E, 0xB574, + 0x794F, 0xB575, 0x7950, 0xB576, 0x7951, 0xB577, 0x7952, 0xB578, + 0x7953, 0xECF0, 0x7954, 0xB579, 0x7955, 0xB57A, 0x7956, 0xD7E6, + 0x7957, 0xECF3, 0x7958, 0xB57B, 0x7959, 0xB57C, 0x795A, 0xECF1, + 0x795B, 0xECEE, 0x795C, 0xECEF, 0x795D, 0xD7A3, 0x795E, 0xC9F1, + 0x795F, 0xCBEE, 0x7960, 0xECF4, 0x7961, 0xB57D, 0x7962, 0xECF2, + 0x7963, 0xB57E, 0x7964, 0xB580, 0x7965, 0xCFE9, 0x7966, 0xB581, + 0x7967, 0xECF6, 0x7968, 0xC6B1, 0x7969, 0xB582, 0x796A, 0xB583, + 0x796B, 0xB584, 0x796C, 0xB585, 0x796D, 0xBCC0, 0x796E, 0xB586, + 0x796F, 0xECF5, 0x7970, 0xB587, 0x7971, 0xB588, 0x7972, 0xB589, + 0x7973, 0xB58A, 0x7974, 0xB58B, 0x7975, 0xB58C, 0x7976, 0xB58D, + 0x7977, 0xB5BB, 0x7978, 0xBBF6, 0x7979, 0xB58E, 0x797A, 0xECF7, + 0x797B, 0xB58F, 0x797C, 0xB590, 0x797D, 0xB591, 0x797E, 0xB592, + 0x797F, 0xB593, 0x7980, 0xD9F7, 0x7981, 0xBDFB, 0x7982, 0xB594, + 0x7983, 0xB595, 0x7984, 0xC2BB, 0x7985, 0xECF8, 0x7986, 0xB596, + 0x7987, 0xB597, 0x7988, 0xB598, 0x7989, 0xB599, 0x798A, 0xECF9, + 0x798B, 0xB59A, 0x798C, 0xB59B, 0x798D, 0xB59C, 0x798E, 0xB59D, + 0x798F, 0xB8A3, 0x7990, 0xB59E, 0x7991, 0xB59F, 0x7992, 0xB5A0, + 0x7993, 0xB640, 0x7994, 0xB641, 0x7995, 0xB642, 0x7996, 0xB643, + 0x7997, 0xB644, 0x7998, 0xB645, 0x7999, 0xB646, 0x799A, 0xECFA, + 0x799B, 0xB647, 0x799C, 0xB648, 0x799D, 0xB649, 0x799E, 0xB64A, + 0x799F, 0xB64B, 0x79A0, 0xB64C, 0x79A1, 0xB64D, 0x79A2, 0xB64E, + 0x79A3, 0xB64F, 0x79A4, 0xB650, 0x79A5, 0xB651, 0x79A6, 0xB652, + 0x79A7, 0xECFB, 0x79A8, 0xB653, 0x79A9, 0xB654, 0x79AA, 0xB655, + 0x79AB, 0xB656, 0x79AC, 0xB657, 0x79AD, 0xB658, 0x79AE, 0xB659, + 0x79AF, 0xB65A, 0x79B0, 0xB65B, 0x79B1, 0xB65C, 0x79B2, 0xB65D, + 0x79B3, 0xECFC, 0x79B4, 0xB65E, 0x79B5, 0xB65F, 0x79B6, 0xB660, + 0x79B7, 0xB661, 0x79B8, 0xB662, 0x79B9, 0xD3ED, 0x79BA, 0xD8AE, + 0x79BB, 0xC0EB, 0x79BC, 0xB663, 0x79BD, 0xC7DD, 0x79BE, 0xBACC, + 0x79BF, 0xB664, 0x79C0, 0xD0E3, 0x79C1, 0xCBBD, 0x79C2, 0xB665, + 0x79C3, 0xCDBA, 0x79C4, 0xB666, 0x79C5, 0xB667, 0x79C6, 0xB8D1, + 0x79C7, 0xB668, 0x79C8, 0xB669, 0x79C9, 0xB1FC, 0x79CA, 0xB66A, + 0x79CB, 0xC7EF, 0x79CC, 0xB66B, 0x79CD, 0xD6D6, 0x79CE, 0xB66C, + 0x79CF, 0xB66D, 0x79D0, 0xB66E, 0x79D1, 0xBFC6, 0x79D2, 0xC3EB, + 0x79D3, 0xB66F, 0x79D4, 0xB670, 0x79D5, 0xEFF5, 0x79D6, 0xB671, + 0x79D7, 0xB672, 0x79D8, 0xC3D8, 0x79D9, 0xB673, 0x79DA, 0xB674, + 0x79DB, 0xB675, 0x79DC, 0xB676, 0x79DD, 0xB677, 0x79DE, 0xB678, + 0x79DF, 0xD7E2, 0x79E0, 0xB679, 0x79E1, 0xB67A, 0x79E2, 0xB67B, + 0x79E3, 0xEFF7, 0x79E4, 0xB3D3, 0x79E5, 0xB67C, 0x79E6, 0xC7D8, + 0x79E7, 0xD1ED, 0x79E8, 0xB67D, 0x79E9, 0xD6C8, 0x79EA, 0xB67E, + 0x79EB, 0xEFF8, 0x79EC, 0xB680, 0x79ED, 0xEFF6, 0x79EE, 0xB681, + 0x79EF, 0xBBFD, 0x79F0, 0xB3C6, 0x79F1, 0xB682, 0x79F2, 0xB683, + 0x79F3, 0xB684, 0x79F4, 0xB685, 0x79F5, 0xB686, 0x79F6, 0xB687, + 0x79F7, 0xB688, 0x79F8, 0xBDD5, 0x79F9, 0xB689, 0x79FA, 0xB68A, + 0x79FB, 0xD2C6, 0x79FC, 0xB68B, 0x79FD, 0xBBE0, 0x79FE, 0xB68C, + 0x79FF, 0xB68D, 0x7A00, 0xCFA1, 0x7A01, 0xB68E, 0x7A02, 0xEFFC, + 0x7A03, 0xEFFB, 0x7A04, 0xB68F, 0x7A05, 0xB690, 0x7A06, 0xEFF9, + 0x7A07, 0xB691, 0x7A08, 0xB692, 0x7A09, 0xB693, 0x7A0A, 0xB694, + 0x7A0B, 0xB3CC, 0x7A0C, 0xB695, 0x7A0D, 0xC9D4, 0x7A0E, 0xCBB0, + 0x7A0F, 0xB696, 0x7A10, 0xB697, 0x7A11, 0xB698, 0x7A12, 0xB699, + 0x7A13, 0xB69A, 0x7A14, 0xEFFE, 0x7A15, 0xB69B, 0x7A16, 0xB69C, + 0x7A17, 0xB0DE, 0x7A18, 0xB69D, 0x7A19, 0xB69E, 0x7A1A, 0xD6C9, + 0x7A1B, 0xB69F, 0x7A1C, 0xB6A0, 0x7A1D, 0xB740, 0x7A1E, 0xEFFD, + 0x7A1F, 0xB741, 0x7A20, 0xB3ED, 0x7A21, 0xB742, 0x7A22, 0xB743, + 0x7A23, 0xF6D5, 0x7A24, 0xB744, 0x7A25, 0xB745, 0x7A26, 0xB746, + 0x7A27, 0xB747, 0x7A28, 0xB748, 0x7A29, 0xB749, 0x7A2A, 0xB74A, + 0x7A2B, 0xB74B, 0x7A2C, 0xB74C, 0x7A2D, 0xB74D, 0x7A2E, 0xB74E, + 0x7A2F, 0xB74F, 0x7A30, 0xB750, 0x7A31, 0xB751, 0x7A32, 0xB752, + 0x7A33, 0xCEC8, 0x7A34, 0xB753, 0x7A35, 0xB754, 0x7A36, 0xB755, + 0x7A37, 0xF0A2, 0x7A38, 0xB756, 0x7A39, 0xF0A1, 0x7A3A, 0xB757, + 0x7A3B, 0xB5BE, 0x7A3C, 0xBCDA, 0x7A3D, 0xBBFC, 0x7A3E, 0xB758, + 0x7A3F, 0xB8E5, 0x7A40, 0xB759, 0x7A41, 0xB75A, 0x7A42, 0xB75B, + 0x7A43, 0xB75C, 0x7A44, 0xB75D, 0x7A45, 0xB75E, 0x7A46, 0xC4C2, + 0x7A47, 0xB75F, 0x7A48, 0xB760, 0x7A49, 0xB761, 0x7A4A, 0xB762, + 0x7A4B, 0xB763, 0x7A4C, 0xB764, 0x7A4D, 0xB765, 0x7A4E, 0xB766, + 0x7A4F, 0xB767, 0x7A50, 0xB768, 0x7A51, 0xF0A3, 0x7A52, 0xB769, + 0x7A53, 0xB76A, 0x7A54, 0xB76B, 0x7A55, 0xB76C, 0x7A56, 0xB76D, + 0x7A57, 0xCBEB, 0x7A58, 0xB76E, 0x7A59, 0xB76F, 0x7A5A, 0xB770, + 0x7A5B, 0xB771, 0x7A5C, 0xB772, 0x7A5D, 0xB773, 0x7A5E, 0xB774, + 0x7A5F, 0xB775, 0x7A60, 0xB776, 0x7A61, 0xB777, 0x7A62, 0xB778, + 0x7A63, 0xB779, 0x7A64, 0xB77A, 0x7A65, 0xB77B, 0x7A66, 0xB77C, + 0x7A67, 0xB77D, 0x7A68, 0xB77E, 0x7A69, 0xB780, 0x7A6A, 0xB781, + 0x7A6B, 0xB782, 0x7A6C, 0xB783, 0x7A6D, 0xB784, 0x7A6E, 0xB785, + 0x7A6F, 0xB786, 0x7A70, 0xF0A6, 0x7A71, 0xB787, 0x7A72, 0xB788, + 0x7A73, 0xB789, 0x7A74, 0xD1A8, 0x7A75, 0xB78A, 0x7A76, 0xBEBF, + 0x7A77, 0xC7EE, 0x7A78, 0xF1B6, 0x7A79, 0xF1B7, 0x7A7A, 0xBFD5, + 0x7A7B, 0xB78B, 0x7A7C, 0xB78C, 0x7A7D, 0xB78D, 0x7A7E, 0xB78E, + 0x7A7F, 0xB4A9, 0x7A80, 0xF1B8, 0x7A81, 0xCDBB, 0x7A82, 0xB78F, + 0x7A83, 0xC7D4, 0x7A84, 0xD5AD, 0x7A85, 0xB790, 0x7A86, 0xF1B9, + 0x7A87, 0xB791, 0x7A88, 0xF1BA, 0x7A89, 0xB792, 0x7A8A, 0xB793, + 0x7A8B, 0xB794, 0x7A8C, 0xB795, 0x7A8D, 0xC7CF, 0x7A8E, 0xB796, + 0x7A8F, 0xB797, 0x7A90, 0xB798, 0x7A91, 0xD2A4, 0x7A92, 0xD6CF, + 0x7A93, 0xB799, 0x7A94, 0xB79A, 0x7A95, 0xF1BB, 0x7A96, 0xBDD1, + 0x7A97, 0xB4B0, 0x7A98, 0xBEBD, 0x7A99, 0xB79B, 0x7A9A, 0xB79C, + 0x7A9B, 0xB79D, 0x7A9C, 0xB4DC, 0x7A9D, 0xCED1, 0x7A9E, 0xB79E, + 0x7A9F, 0xBFDF, 0x7AA0, 0xF1BD, 0x7AA1, 0xB79F, 0x7AA2, 0xB7A0, + 0x7AA3, 0xB840, 0x7AA4, 0xB841, 0x7AA5, 0xBFFA, 0x7AA6, 0xF1BC, + 0x7AA7, 0xB842, 0x7AA8, 0xF1BF, 0x7AA9, 0xB843, 0x7AAA, 0xB844, + 0x7AAB, 0xB845, 0x7AAC, 0xF1BE, 0x7AAD, 0xF1C0, 0x7AAE, 0xB846, + 0x7AAF, 0xB847, 0x7AB0, 0xB848, 0x7AB1, 0xB849, 0x7AB2, 0xB84A, + 0x7AB3, 0xF1C1, 0x7AB4, 0xB84B, 0x7AB5, 0xB84C, 0x7AB6, 0xB84D, + 0x7AB7, 0xB84E, 0x7AB8, 0xB84F, 0x7AB9, 0xB850, 0x7ABA, 0xB851, + 0x7ABB, 0xB852, 0x7ABC, 0xB853, 0x7ABD, 0xB854, 0x7ABE, 0xB855, + 0x7ABF, 0xC1FE, 0x7AC0, 0xB856, 0x7AC1, 0xB857, 0x7AC2, 0xB858, + 0x7AC3, 0xB859, 0x7AC4, 0xB85A, 0x7AC5, 0xB85B, 0x7AC6, 0xB85C, + 0x7AC7, 0xB85D, 0x7AC8, 0xB85E, 0x7AC9, 0xB85F, 0x7ACA, 0xB860, + 0x7ACB, 0xC1A2, 0x7ACC, 0xB861, 0x7ACD, 0xB862, 0x7ACE, 0xB863, + 0x7ACF, 0xB864, 0x7AD0, 0xB865, 0x7AD1, 0xB866, 0x7AD2, 0xB867, + 0x7AD3, 0xB868, 0x7AD4, 0xB869, 0x7AD5, 0xB86A, 0x7AD6, 0xCAFA, + 0x7AD7, 0xB86B, 0x7AD8, 0xB86C, 0x7AD9, 0xD5BE, 0x7ADA, 0xB86D, + 0x7ADB, 0xB86E, 0x7ADC, 0xB86F, 0x7ADD, 0xB870, 0x7ADE, 0xBEBA, + 0x7ADF, 0xBEB9, 0x7AE0, 0xD5C2, 0x7AE1, 0xB871, 0x7AE2, 0xB872, + 0x7AE3, 0xBFA2, 0x7AE4, 0xB873, 0x7AE5, 0xCDAF, 0x7AE6, 0xF1B5, + 0x7AE7, 0xB874, 0x7AE8, 0xB875, 0x7AE9, 0xB876, 0x7AEA, 0xB877, + 0x7AEB, 0xB878, 0x7AEC, 0xB879, 0x7AED, 0xBDDF, 0x7AEE, 0xB87A, + 0x7AEF, 0xB6CB, 0x7AF0, 0xB87B, 0x7AF1, 0xB87C, 0x7AF2, 0xB87D, + 0x7AF3, 0xB87E, 0x7AF4, 0xB880, 0x7AF5, 0xB881, 0x7AF6, 0xB882, + 0x7AF7, 0xB883, 0x7AF8, 0xB884, 0x7AF9, 0xD6F1, 0x7AFA, 0xF3C3, + 0x7AFB, 0xB885, 0x7AFC, 0xB886, 0x7AFD, 0xF3C4, 0x7AFE, 0xB887, + 0x7AFF, 0xB8CD, 0x7B00, 0xB888, 0x7B01, 0xB889, 0x7B02, 0xB88A, + 0x7B03, 0xF3C6, 0x7B04, 0xF3C7, 0x7B05, 0xB88B, 0x7B06, 0xB0CA, + 0x7B07, 0xB88C, 0x7B08, 0xF3C5, 0x7B09, 0xB88D, 0x7B0A, 0xF3C9, + 0x7B0B, 0xCBF1, 0x7B0C, 0xB88E, 0x7B0D, 0xB88F, 0x7B0E, 0xB890, + 0x7B0F, 0xF3CB, 0x7B10, 0xB891, 0x7B11, 0xD0A6, 0x7B12, 0xB892, + 0x7B13, 0xB893, 0x7B14, 0xB1CA, 0x7B15, 0xF3C8, 0x7B16, 0xB894, + 0x7B17, 0xB895, 0x7B18, 0xB896, 0x7B19, 0xF3CF, 0x7B1A, 0xB897, + 0x7B1B, 0xB5D1, 0x7B1C, 0xB898, 0x7B1D, 0xB899, 0x7B1E, 0xF3D7, + 0x7B1F, 0xB89A, 0x7B20, 0xF3D2, 0x7B21, 0xB89B, 0x7B22, 0xB89C, + 0x7B23, 0xB89D, 0x7B24, 0xF3D4, 0x7B25, 0xF3D3, 0x7B26, 0xB7FB, + 0x7B27, 0xB89E, 0x7B28, 0xB1BF, 0x7B29, 0xB89F, 0x7B2A, 0xF3CE, + 0x7B2B, 0xF3CA, 0x7B2C, 0xB5DA, 0x7B2D, 0xB8A0, 0x7B2E, 0xF3D0, + 0x7B2F, 0xB940, 0x7B30, 0xB941, 0x7B31, 0xF3D1, 0x7B32, 0xB942, + 0x7B33, 0xF3D5, 0x7B34, 0xB943, 0x7B35, 0xB944, 0x7B36, 0xB945, + 0x7B37, 0xB946, 0x7B38, 0xF3CD, 0x7B39, 0xB947, 0x7B3A, 0xBCE3, + 0x7B3B, 0xB948, 0x7B3C, 0xC1FD, 0x7B3D, 0xB949, 0x7B3E, 0xF3D6, + 0x7B3F, 0xB94A, 0x7B40, 0xB94B, 0x7B41, 0xB94C, 0x7B42, 0xB94D, + 0x7B43, 0xB94E, 0x7B44, 0xB94F, 0x7B45, 0xF3DA, 0x7B46, 0xB950, + 0x7B47, 0xF3CC, 0x7B48, 0xB951, 0x7B49, 0xB5C8, 0x7B4A, 0xB952, + 0x7B4B, 0xBDEE, 0x7B4C, 0xF3DC, 0x7B4D, 0xB953, 0x7B4E, 0xB954, + 0x7B4F, 0xB7A4, 0x7B50, 0xBFF0, 0x7B51, 0xD6FE, 0x7B52, 0xCDB2, + 0x7B53, 0xB955, 0x7B54, 0xB4F0, 0x7B55, 0xB956, 0x7B56, 0xB2DF, + 0x7B57, 0xB957, 0x7B58, 0xF3D8, 0x7B59, 0xB958, 0x7B5A, 0xF3D9, + 0x7B5B, 0xC9B8, 0x7B5C, 0xB959, 0x7B5D, 0xF3DD, 0x7B5E, 0xB95A, + 0x7B5F, 0xB95B, 0x7B60, 0xF3DE, 0x7B61, 0xB95C, 0x7B62, 0xF3E1, + 0x7B63, 0xB95D, 0x7B64, 0xB95E, 0x7B65, 0xB95F, 0x7B66, 0xB960, + 0x7B67, 0xB961, 0x7B68, 0xB962, 0x7B69, 0xB963, 0x7B6A, 0xB964, + 0x7B6B, 0xB965, 0x7B6C, 0xB966, 0x7B6D, 0xB967, 0x7B6E, 0xF3DF, + 0x7B6F, 0xB968, 0x7B70, 0xB969, 0x7B71, 0xF3E3, 0x7B72, 0xF3E2, + 0x7B73, 0xB96A, 0x7B74, 0xB96B, 0x7B75, 0xF3DB, 0x7B76, 0xB96C, + 0x7B77, 0xBFEA, 0x7B78, 0xB96D, 0x7B79, 0xB3EF, 0x7B7A, 0xB96E, + 0x7B7B, 0xF3E0, 0x7B7C, 0xB96F, 0x7B7D, 0xB970, 0x7B7E, 0xC7A9, + 0x7B7F, 0xB971, 0x7B80, 0xBCF2, 0x7B81, 0xB972, 0x7B82, 0xB973, + 0x7B83, 0xB974, 0x7B84, 0xB975, 0x7B85, 0xF3EB, 0x7B86, 0xB976, + 0x7B87, 0xB977, 0x7B88, 0xB978, 0x7B89, 0xB979, 0x7B8A, 0xB97A, + 0x7B8B, 0xB97B, 0x7B8C, 0xB97C, 0x7B8D, 0xB9BF, 0x7B8E, 0xB97D, + 0x7B8F, 0xB97E, 0x7B90, 0xF3E4, 0x7B91, 0xB980, 0x7B92, 0xB981, + 0x7B93, 0xB982, 0x7B94, 0xB2AD, 0x7B95, 0xBBFE, 0x7B96, 0xB983, + 0x7B97, 0xCBE3, 0x7B98, 0xB984, 0x7B99, 0xB985, 0x7B9A, 0xB986, + 0x7B9B, 0xB987, 0x7B9C, 0xF3ED, 0x7B9D, 0xF3E9, 0x7B9E, 0xB988, + 0x7B9F, 0xB989, 0x7BA0, 0xB98A, 0x7BA1, 0xB9DC, 0x7BA2, 0xF3EE, + 0x7BA3, 0xB98B, 0x7BA4, 0xB98C, 0x7BA5, 0xB98D, 0x7BA6, 0xF3E5, + 0x7BA7, 0xF3E6, 0x7BA8, 0xF3EA, 0x7BA9, 0xC2E1, 0x7BAA, 0xF3EC, + 0x7BAB, 0xF3EF, 0x7BAC, 0xF3E8, 0x7BAD, 0xBCFD, 0x7BAE, 0xB98E, + 0x7BAF, 0xB98F, 0x7BB0, 0xB990, 0x7BB1, 0xCFE4, 0x7BB2, 0xB991, + 0x7BB3, 0xB992, 0x7BB4, 0xF3F0, 0x7BB5, 0xB993, 0x7BB6, 0xB994, + 0x7BB7, 0xB995, 0x7BB8, 0xF3E7, 0x7BB9, 0xB996, 0x7BBA, 0xB997, + 0x7BBB, 0xB998, 0x7BBC, 0xB999, 0x7BBD, 0xB99A, 0x7BBE, 0xB99B, + 0x7BBF, 0xB99C, 0x7BC0, 0xB99D, 0x7BC1, 0xF3F2, 0x7BC2, 0xB99E, + 0x7BC3, 0xB99F, 0x7BC4, 0xB9A0, 0x7BC5, 0xBA40, 0x7BC6, 0xD7AD, + 0x7BC7, 0xC6AA, 0x7BC8, 0xBA41, 0x7BC9, 0xBA42, 0x7BCA, 0xBA43, + 0x7BCB, 0xBA44, 0x7BCC, 0xF3F3, 0x7BCD, 0xBA45, 0x7BCE, 0xBA46, + 0x7BCF, 0xBA47, 0x7BD0, 0xBA48, 0x7BD1, 0xF3F1, 0x7BD2, 0xBA49, + 0x7BD3, 0xC2A8, 0x7BD4, 0xBA4A, 0x7BD5, 0xBA4B, 0x7BD6, 0xBA4C, + 0x7BD7, 0xBA4D, 0x7BD8, 0xBA4E, 0x7BD9, 0xB8DD, 0x7BDA, 0xF3F5, + 0x7BDB, 0xBA4F, 0x7BDC, 0xBA50, 0x7BDD, 0xF3F4, 0x7BDE, 0xBA51, + 0x7BDF, 0xBA52, 0x7BE0, 0xBA53, 0x7BE1, 0xB4DB, 0x7BE2, 0xBA54, + 0x7BE3, 0xBA55, 0x7BE4, 0xBA56, 0x7BE5, 0xF3F6, 0x7BE6, 0xF3F7, + 0x7BE7, 0xBA57, 0x7BE8, 0xBA58, 0x7BE9, 0xBA59, 0x7BEA, 0xF3F8, + 0x7BEB, 0xBA5A, 0x7BEC, 0xBA5B, 0x7BED, 0xBA5C, 0x7BEE, 0xC0BA, + 0x7BEF, 0xBA5D, 0x7BF0, 0xBA5E, 0x7BF1, 0xC0E9, 0x7BF2, 0xBA5F, + 0x7BF3, 0xBA60, 0x7BF4, 0xBA61, 0x7BF5, 0xBA62, 0x7BF6, 0xBA63, + 0x7BF7, 0xC5F1, 0x7BF8, 0xBA64, 0x7BF9, 0xBA65, 0x7BFA, 0xBA66, + 0x7BFB, 0xBA67, 0x7BFC, 0xF3FB, 0x7BFD, 0xBA68, 0x7BFE, 0xF3FA, + 0x7BFF, 0xBA69, 0x7C00, 0xBA6A, 0x7C01, 0xBA6B, 0x7C02, 0xBA6C, + 0x7C03, 0xBA6D, 0x7C04, 0xBA6E, 0x7C05, 0xBA6F, 0x7C06, 0xBA70, + 0x7C07, 0xB4D8, 0x7C08, 0xBA71, 0x7C09, 0xBA72, 0x7C0A, 0xBA73, + 0x7C0B, 0xF3FE, 0x7C0C, 0xF3F9, 0x7C0D, 0xBA74, 0x7C0E, 0xBA75, + 0x7C0F, 0xF3FC, 0x7C10, 0xBA76, 0x7C11, 0xBA77, 0x7C12, 0xBA78, + 0x7C13, 0xBA79, 0x7C14, 0xBA7A, 0x7C15, 0xBA7B, 0x7C16, 0xF3FD, + 0x7C17, 0xBA7C, 0x7C18, 0xBA7D, 0x7C19, 0xBA7E, 0x7C1A, 0xBA80, + 0x7C1B, 0xBA81, 0x7C1C, 0xBA82, 0x7C1D, 0xBA83, 0x7C1E, 0xBA84, + 0x7C1F, 0xF4A1, 0x7C20, 0xBA85, 0x7C21, 0xBA86, 0x7C22, 0xBA87, + 0x7C23, 0xBA88, 0x7C24, 0xBA89, 0x7C25, 0xBA8A, 0x7C26, 0xF4A3, + 0x7C27, 0xBBC9, 0x7C28, 0xBA8B, 0x7C29, 0xBA8C, 0x7C2A, 0xF4A2, + 0x7C2B, 0xBA8D, 0x7C2C, 0xBA8E, 0x7C2D, 0xBA8F, 0x7C2E, 0xBA90, + 0x7C2F, 0xBA91, 0x7C30, 0xBA92, 0x7C31, 0xBA93, 0x7C32, 0xBA94, + 0x7C33, 0xBA95, 0x7C34, 0xBA96, 0x7C35, 0xBA97, 0x7C36, 0xBA98, + 0x7C37, 0xBA99, 0x7C38, 0xF4A4, 0x7C39, 0xBA9A, 0x7C3A, 0xBA9B, + 0x7C3B, 0xBA9C, 0x7C3C, 0xBA9D, 0x7C3D, 0xBA9E, 0x7C3E, 0xBA9F, + 0x7C3F, 0xB2BE, 0x7C40, 0xF4A6, 0x7C41, 0xF4A5, 0x7C42, 0xBAA0, + 0x7C43, 0xBB40, 0x7C44, 0xBB41, 0x7C45, 0xBB42, 0x7C46, 0xBB43, + 0x7C47, 0xBB44, 0x7C48, 0xBB45, 0x7C49, 0xBB46, 0x7C4A, 0xBB47, + 0x7C4B, 0xBB48, 0x7C4C, 0xBB49, 0x7C4D, 0xBCAE, 0x7C4E, 0xBB4A, + 0x7C4F, 0xBB4B, 0x7C50, 0xBB4C, 0x7C51, 0xBB4D, 0x7C52, 0xBB4E, + 0x7C53, 0xBB4F, 0x7C54, 0xBB50, 0x7C55, 0xBB51, 0x7C56, 0xBB52, + 0x7C57, 0xBB53, 0x7C58, 0xBB54, 0x7C59, 0xBB55, 0x7C5A, 0xBB56, + 0x7C5B, 0xBB57, 0x7C5C, 0xBB58, 0x7C5D, 0xBB59, 0x7C5E, 0xBB5A, + 0x7C5F, 0xBB5B, 0x7C60, 0xBB5C, 0x7C61, 0xBB5D, 0x7C62, 0xBB5E, + 0x7C63, 0xBB5F, 0x7C64, 0xBB60, 0x7C65, 0xBB61, 0x7C66, 0xBB62, + 0x7C67, 0xBB63, 0x7C68, 0xBB64, 0x7C69, 0xBB65, 0x7C6A, 0xBB66, + 0x7C6B, 0xBB67, 0x7C6C, 0xBB68, 0x7C6D, 0xBB69, 0x7C6E, 0xBB6A, + 0x7C6F, 0xBB6B, 0x7C70, 0xBB6C, 0x7C71, 0xBB6D, 0x7C72, 0xBB6E, + 0x7C73, 0xC3D7, 0x7C74, 0xD9E1, 0x7C75, 0xBB6F, 0x7C76, 0xBB70, + 0x7C77, 0xBB71, 0x7C78, 0xBB72, 0x7C79, 0xBB73, 0x7C7A, 0xBB74, + 0x7C7B, 0xC0E0, 0x7C7C, 0xF4CC, 0x7C7D, 0xD7D1, 0x7C7E, 0xBB75, + 0x7C7F, 0xBB76, 0x7C80, 0xBB77, 0x7C81, 0xBB78, 0x7C82, 0xBB79, + 0x7C83, 0xBB7A, 0x7C84, 0xBB7B, 0x7C85, 0xBB7C, 0x7C86, 0xBB7D, + 0x7C87, 0xBB7E, 0x7C88, 0xBB80, 0x7C89, 0xB7DB, 0x7C8A, 0xBB81, + 0x7C8B, 0xBB82, 0x7C8C, 0xBB83, 0x7C8D, 0xBB84, 0x7C8E, 0xBB85, + 0x7C8F, 0xBB86, 0x7C90, 0xBB87, 0x7C91, 0xF4CE, 0x7C92, 0xC1A3, + 0x7C93, 0xBB88, 0x7C94, 0xBB89, 0x7C95, 0xC6C9, 0x7C96, 0xBB8A, + 0x7C97, 0xB4D6, 0x7C98, 0xD5B3, 0x7C99, 0xBB8B, 0x7C9A, 0xBB8C, + 0x7C9B, 0xBB8D, 0x7C9C, 0xF4D0, 0x7C9D, 0xF4CF, 0x7C9E, 0xF4D1, + 0x7C9F, 0xCBDA, 0x7CA0, 0xBB8E, 0x7CA1, 0xBB8F, 0x7CA2, 0xF4D2, + 0x7CA3, 0xBB90, 0x7CA4, 0xD4C1, 0x7CA5, 0xD6E0, 0x7CA6, 0xBB91, + 0x7CA7, 0xBB92, 0x7CA8, 0xBB93, 0x7CA9, 0xBB94, 0x7CAA, 0xB7E0, + 0x7CAB, 0xBB95, 0x7CAC, 0xBB96, 0x7CAD, 0xBB97, 0x7CAE, 0xC1B8, + 0x7CAF, 0xBB98, 0x7CB0, 0xBB99, 0x7CB1, 0xC1BB, 0x7CB2, 0xF4D3, + 0x7CB3, 0xBEAC, 0x7CB4, 0xBB9A, 0x7CB5, 0xBB9B, 0x7CB6, 0xBB9C, + 0x7CB7, 0xBB9D, 0x7CB8, 0xBB9E, 0x7CB9, 0xB4E2, 0x7CBA, 0xBB9F, + 0x7CBB, 0xBBA0, 0x7CBC, 0xF4D4, 0x7CBD, 0xF4D5, 0x7CBE, 0xBEAB, + 0x7CBF, 0xBC40, 0x7CC0, 0xBC41, 0x7CC1, 0xF4D6, 0x7CC2, 0xBC42, + 0x7CC3, 0xBC43, 0x7CC4, 0xBC44, 0x7CC5, 0xF4DB, 0x7CC6, 0xBC45, + 0x7CC7, 0xF4D7, 0x7CC8, 0xF4DA, 0x7CC9, 0xBC46, 0x7CCA, 0xBAFD, + 0x7CCB, 0xBC47, 0x7CCC, 0xF4D8, 0x7CCD, 0xF4D9, 0x7CCE, 0xBC48, + 0x7CCF, 0xBC49, 0x7CD0, 0xBC4A, 0x7CD1, 0xBC4B, 0x7CD2, 0xBC4C, + 0x7CD3, 0xBC4D, 0x7CD4, 0xBC4E, 0x7CD5, 0xB8E2, 0x7CD6, 0xCCC7, + 0x7CD7, 0xF4DC, 0x7CD8, 0xBC4F, 0x7CD9, 0xB2DA, 0x7CDA, 0xBC50, + 0x7CDB, 0xBC51, 0x7CDC, 0xC3D3, 0x7CDD, 0xBC52, 0x7CDE, 0xBC53, + 0x7CDF, 0xD4E3, 0x7CE0, 0xBFB7, 0x7CE1, 0xBC54, 0x7CE2, 0xBC55, + 0x7CE3, 0xBC56, 0x7CE4, 0xBC57, 0x7CE5, 0xBC58, 0x7CE6, 0xBC59, + 0x7CE7, 0xBC5A, 0x7CE8, 0xF4DD, 0x7CE9, 0xBC5B, 0x7CEA, 0xBC5C, + 0x7CEB, 0xBC5D, 0x7CEC, 0xBC5E, 0x7CED, 0xBC5F, 0x7CEE, 0xBC60, + 0x7CEF, 0xC5B4, 0x7CF0, 0xBC61, 0x7CF1, 0xBC62, 0x7CF2, 0xBC63, + 0x7CF3, 0xBC64, 0x7CF4, 0xBC65, 0x7CF5, 0xBC66, 0x7CF6, 0xBC67, + 0x7CF7, 0xBC68, 0x7CF8, 0xF4E9, 0x7CF9, 0xBC69, 0x7CFA, 0xBC6A, + 0x7CFB, 0xCFB5, 0x7CFC, 0xBC6B, 0x7CFD, 0xBC6C, 0x7CFE, 0xBC6D, + 0x7CFF, 0xBC6E, 0x7D00, 0xBC6F, 0x7D01, 0xBC70, 0x7D02, 0xBC71, + 0x7D03, 0xBC72, 0x7D04, 0xBC73, 0x7D05, 0xBC74, 0x7D06, 0xBC75, + 0x7D07, 0xBC76, 0x7D08, 0xBC77, 0x7D09, 0xBC78, 0x7D0A, 0xCEC9, + 0x7D0B, 0xBC79, 0x7D0C, 0xBC7A, 0x7D0D, 0xBC7B, 0x7D0E, 0xBC7C, + 0x7D0F, 0xBC7D, 0x7D10, 0xBC7E, 0x7D11, 0xBC80, 0x7D12, 0xBC81, + 0x7D13, 0xBC82, 0x7D14, 0xBC83, 0x7D15, 0xBC84, 0x7D16, 0xBC85, + 0x7D17, 0xBC86, 0x7D18, 0xBC87, 0x7D19, 0xBC88, 0x7D1A, 0xBC89, + 0x7D1B, 0xBC8A, 0x7D1C, 0xBC8B, 0x7D1D, 0xBC8C, 0x7D1E, 0xBC8D, + 0x7D1F, 0xBC8E, 0x7D20, 0xCBD8, 0x7D21, 0xBC8F, 0x7D22, 0xCBF7, + 0x7D23, 0xBC90, 0x7D24, 0xBC91, 0x7D25, 0xBC92, 0x7D26, 0xBC93, + 0x7D27, 0xBDF4, 0x7D28, 0xBC94, 0x7D29, 0xBC95, 0x7D2A, 0xBC96, + 0x7D2B, 0xD7CF, 0x7D2C, 0xBC97, 0x7D2D, 0xBC98, 0x7D2E, 0xBC99, + 0x7D2F, 0xC0DB, 0x7D30, 0xBC9A, 0x7D31, 0xBC9B, 0x7D32, 0xBC9C, + 0x7D33, 0xBC9D, 0x7D34, 0xBC9E, 0x7D35, 0xBC9F, 0x7D36, 0xBCA0, + 0x7D37, 0xBD40, 0x7D38, 0xBD41, 0x7D39, 0xBD42, 0x7D3A, 0xBD43, + 0x7D3B, 0xBD44, 0x7D3C, 0xBD45, 0x7D3D, 0xBD46, 0x7D3E, 0xBD47, + 0x7D3F, 0xBD48, 0x7D40, 0xBD49, 0x7D41, 0xBD4A, 0x7D42, 0xBD4B, + 0x7D43, 0xBD4C, 0x7D44, 0xBD4D, 0x7D45, 0xBD4E, 0x7D46, 0xBD4F, + 0x7D47, 0xBD50, 0x7D48, 0xBD51, 0x7D49, 0xBD52, 0x7D4A, 0xBD53, + 0x7D4B, 0xBD54, 0x7D4C, 0xBD55, 0x7D4D, 0xBD56, 0x7D4E, 0xBD57, + 0x7D4F, 0xBD58, 0x7D50, 0xBD59, 0x7D51, 0xBD5A, 0x7D52, 0xBD5B, + 0x7D53, 0xBD5C, 0x7D54, 0xBD5D, 0x7D55, 0xBD5E, 0x7D56, 0xBD5F, + 0x7D57, 0xBD60, 0x7D58, 0xBD61, 0x7D59, 0xBD62, 0x7D5A, 0xBD63, + 0x7D5B, 0xBD64, 0x7D5C, 0xBD65, 0x7D5D, 0xBD66, 0x7D5E, 0xBD67, + 0x7D5F, 0xBD68, 0x7D60, 0xBD69, 0x7D61, 0xBD6A, 0x7D62, 0xBD6B, + 0x7D63, 0xBD6C, 0x7D64, 0xBD6D, 0x7D65, 0xBD6E, 0x7D66, 0xBD6F, + 0x7D67, 0xBD70, 0x7D68, 0xBD71, 0x7D69, 0xBD72, 0x7D6A, 0xBD73, + 0x7D6B, 0xBD74, 0x7D6C, 0xBD75, 0x7D6D, 0xBD76, 0x7D6E, 0xD0F5, + 0x7D6F, 0xBD77, 0x7D70, 0xBD78, 0x7D71, 0xBD79, 0x7D72, 0xBD7A, + 0x7D73, 0xBD7B, 0x7D74, 0xBD7C, 0x7D75, 0xBD7D, 0x7D76, 0xBD7E, + 0x7D77, 0xF4EA, 0x7D78, 0xBD80, 0x7D79, 0xBD81, 0x7D7A, 0xBD82, + 0x7D7B, 0xBD83, 0x7D7C, 0xBD84, 0x7D7D, 0xBD85, 0x7D7E, 0xBD86, + 0x7D7F, 0xBD87, 0x7D80, 0xBD88, 0x7D81, 0xBD89, 0x7D82, 0xBD8A, + 0x7D83, 0xBD8B, 0x7D84, 0xBD8C, 0x7D85, 0xBD8D, 0x7D86, 0xBD8E, + 0x7D87, 0xBD8F, 0x7D88, 0xBD90, 0x7D89, 0xBD91, 0x7D8A, 0xBD92, + 0x7D8B, 0xBD93, 0x7D8C, 0xBD94, 0x7D8D, 0xBD95, 0x7D8E, 0xBD96, + 0x7D8F, 0xBD97, 0x7D90, 0xBD98, 0x7D91, 0xBD99, 0x7D92, 0xBD9A, + 0x7D93, 0xBD9B, 0x7D94, 0xBD9C, 0x7D95, 0xBD9D, 0x7D96, 0xBD9E, + 0x7D97, 0xBD9F, 0x7D98, 0xBDA0, 0x7D99, 0xBE40, 0x7D9A, 0xBE41, + 0x7D9B, 0xBE42, 0x7D9C, 0xBE43, 0x7D9D, 0xBE44, 0x7D9E, 0xBE45, + 0x7D9F, 0xBE46, 0x7DA0, 0xBE47, 0x7DA1, 0xBE48, 0x7DA2, 0xBE49, + 0x7DA3, 0xBE4A, 0x7DA4, 0xBE4B, 0x7DA5, 0xBE4C, 0x7DA6, 0xF4EB, + 0x7DA7, 0xBE4D, 0x7DA8, 0xBE4E, 0x7DA9, 0xBE4F, 0x7DAA, 0xBE50, + 0x7DAB, 0xBE51, 0x7DAC, 0xBE52, 0x7DAD, 0xBE53, 0x7DAE, 0xF4EC, + 0x7DAF, 0xBE54, 0x7DB0, 0xBE55, 0x7DB1, 0xBE56, 0x7DB2, 0xBE57, + 0x7DB3, 0xBE58, 0x7DB4, 0xBE59, 0x7DB5, 0xBE5A, 0x7DB6, 0xBE5B, + 0x7DB7, 0xBE5C, 0x7DB8, 0xBE5D, 0x7DB9, 0xBE5E, 0x7DBA, 0xBE5F, + 0x7DBB, 0xBE60, 0x7DBC, 0xBE61, 0x7DBD, 0xBE62, 0x7DBE, 0xBE63, + 0x7DBF, 0xBE64, 0x7DC0, 0xBE65, 0x7DC1, 0xBE66, 0x7DC2, 0xBE67, + 0x7DC3, 0xBE68, 0x7DC4, 0xBE69, 0x7DC5, 0xBE6A, 0x7DC6, 0xBE6B, + 0x7DC7, 0xBE6C, 0x7DC8, 0xBE6D, 0x7DC9, 0xBE6E, 0x7DCA, 0xBE6F, + 0x7DCB, 0xBE70, 0x7DCC, 0xBE71, 0x7DCD, 0xBE72, 0x7DCE, 0xBE73, + 0x7DCF, 0xBE74, 0x7DD0, 0xBE75, 0x7DD1, 0xBE76, 0x7DD2, 0xBE77, + 0x7DD3, 0xBE78, 0x7DD4, 0xBE79, 0x7DD5, 0xBE7A, 0x7DD6, 0xBE7B, + 0x7DD7, 0xBE7C, 0x7DD8, 0xBE7D, 0x7DD9, 0xBE7E, 0x7DDA, 0xBE80, + 0x7DDB, 0xBE81, 0x7DDC, 0xBE82, 0x7DDD, 0xBE83, 0x7DDE, 0xBE84, + 0x7DDF, 0xBE85, 0x7DE0, 0xBE86, 0x7DE1, 0xBE87, 0x7DE2, 0xBE88, + 0x7DE3, 0xBE89, 0x7DE4, 0xBE8A, 0x7DE5, 0xBE8B, 0x7DE6, 0xBE8C, + 0x7DE7, 0xBE8D, 0x7DE8, 0xBE8E, 0x7DE9, 0xBE8F, 0x7DEA, 0xBE90, + 0x7DEB, 0xBE91, 0x7DEC, 0xBE92, 0x7DED, 0xBE93, 0x7DEE, 0xBE94, + 0x7DEF, 0xBE95, 0x7DF0, 0xBE96, 0x7DF1, 0xBE97, 0x7DF2, 0xBE98, + 0x7DF3, 0xBE99, 0x7DF4, 0xBE9A, 0x7DF5, 0xBE9B, 0x7DF6, 0xBE9C, + 0x7DF7, 0xBE9D, 0x7DF8, 0xBE9E, 0x7DF9, 0xBE9F, 0x7DFA, 0xBEA0, + 0x7DFB, 0xBF40, 0x7DFC, 0xBF41, 0x7DFD, 0xBF42, 0x7DFE, 0xBF43, + 0x7DFF, 0xBF44, 0x7E00, 0xBF45, 0x7E01, 0xBF46, 0x7E02, 0xBF47, + 0x7E03, 0xBF48, 0x7E04, 0xBF49, 0x7E05, 0xBF4A, 0x7E06, 0xBF4B, + 0x7E07, 0xBF4C, 0x7E08, 0xBF4D, 0x7E09, 0xBF4E, 0x7E0A, 0xBF4F, + 0x7E0B, 0xBF50, 0x7E0C, 0xBF51, 0x7E0D, 0xBF52, 0x7E0E, 0xBF53, + 0x7E0F, 0xBF54, 0x7E10, 0xBF55, 0x7E11, 0xBF56, 0x7E12, 0xBF57, + 0x7E13, 0xBF58, 0x7E14, 0xBF59, 0x7E15, 0xBF5A, 0x7E16, 0xBF5B, + 0x7E17, 0xBF5C, 0x7E18, 0xBF5D, 0x7E19, 0xBF5E, 0x7E1A, 0xBF5F, + 0x7E1B, 0xBF60, 0x7E1C, 0xBF61, 0x7E1D, 0xBF62, 0x7E1E, 0xBF63, + 0x7E1F, 0xBF64, 0x7E20, 0xBF65, 0x7E21, 0xBF66, 0x7E22, 0xBF67, + 0x7E23, 0xBF68, 0x7E24, 0xBF69, 0x7E25, 0xBF6A, 0x7E26, 0xBF6B, + 0x7E27, 0xBF6C, 0x7E28, 0xBF6D, 0x7E29, 0xBF6E, 0x7E2A, 0xBF6F, + 0x7E2B, 0xBF70, 0x7E2C, 0xBF71, 0x7E2D, 0xBF72, 0x7E2E, 0xBF73, + 0x7E2F, 0xBF74, 0x7E30, 0xBF75, 0x7E31, 0xBF76, 0x7E32, 0xBF77, + 0x7E33, 0xBF78, 0x7E34, 0xBF79, 0x7E35, 0xBF7A, 0x7E36, 0xBF7B, + 0x7E37, 0xBF7C, 0x7E38, 0xBF7D, 0x7E39, 0xBF7E, 0x7E3A, 0xBF80, + 0x7E3B, 0xF7E3, 0x7E3C, 0xBF81, 0x7E3D, 0xBF82, 0x7E3E, 0xBF83, + 0x7E3F, 0xBF84, 0x7E40, 0xBF85, 0x7E41, 0xB7B1, 0x7E42, 0xBF86, + 0x7E43, 0xBF87, 0x7E44, 0xBF88, 0x7E45, 0xBF89, 0x7E46, 0xBF8A, + 0x7E47, 0xF4ED, 0x7E48, 0xBF8B, 0x7E49, 0xBF8C, 0x7E4A, 0xBF8D, + 0x7E4B, 0xBF8E, 0x7E4C, 0xBF8F, 0x7E4D, 0xBF90, 0x7E4E, 0xBF91, + 0x7E4F, 0xBF92, 0x7E50, 0xBF93, 0x7E51, 0xBF94, 0x7E52, 0xBF95, + 0x7E53, 0xBF96, 0x7E54, 0xBF97, 0x7E55, 0xBF98, 0x7E56, 0xBF99, + 0x7E57, 0xBF9A, 0x7E58, 0xBF9B, 0x7E59, 0xBF9C, 0x7E5A, 0xBF9D, + 0x7E5B, 0xBF9E, 0x7E5C, 0xBF9F, 0x7E5D, 0xBFA0, 0x7E5E, 0xC040, + 0x7E5F, 0xC041, 0x7E60, 0xC042, 0x7E61, 0xC043, 0x7E62, 0xC044, + 0x7E63, 0xC045, 0x7E64, 0xC046, 0x7E65, 0xC047, 0x7E66, 0xC048, + 0x7E67, 0xC049, 0x7E68, 0xC04A, 0x7E69, 0xC04B, 0x7E6A, 0xC04C, + 0x7E6B, 0xC04D, 0x7E6C, 0xC04E, 0x7E6D, 0xC04F, 0x7E6E, 0xC050, + 0x7E6F, 0xC051, 0x7E70, 0xC052, 0x7E71, 0xC053, 0x7E72, 0xC054, + 0x7E73, 0xC055, 0x7E74, 0xC056, 0x7E75, 0xC057, 0x7E76, 0xC058, + 0x7E77, 0xC059, 0x7E78, 0xC05A, 0x7E79, 0xC05B, 0x7E7A, 0xC05C, + 0x7E7B, 0xC05D, 0x7E7C, 0xC05E, 0x7E7D, 0xC05F, 0x7E7E, 0xC060, + 0x7E7F, 0xC061, 0x7E80, 0xC062, 0x7E81, 0xC063, 0x7E82, 0xD7EB, + 0x7E83, 0xC064, 0x7E84, 0xC065, 0x7E85, 0xC066, 0x7E86, 0xC067, + 0x7E87, 0xC068, 0x7E88, 0xC069, 0x7E89, 0xC06A, 0x7E8A, 0xC06B, + 0x7E8B, 0xC06C, 0x7E8C, 0xC06D, 0x7E8D, 0xC06E, 0x7E8E, 0xC06F, + 0x7E8F, 0xC070, 0x7E90, 0xC071, 0x7E91, 0xC072, 0x7E92, 0xC073, + 0x7E93, 0xC074, 0x7E94, 0xC075, 0x7E95, 0xC076, 0x7E96, 0xC077, + 0x7E97, 0xC078, 0x7E98, 0xC079, 0x7E99, 0xC07A, 0x7E9A, 0xC07B, + 0x7E9B, 0xF4EE, 0x7E9C, 0xC07C, 0x7E9D, 0xC07D, 0x7E9E, 0xC07E, + 0x7E9F, 0xE6F9, 0x7EA0, 0xBEC0, 0x7EA1, 0xE6FA, 0x7EA2, 0xBAEC, + 0x7EA3, 0xE6FB, 0x7EA4, 0xCFCB, 0x7EA5, 0xE6FC, 0x7EA6, 0xD4BC, + 0x7EA7, 0xBCB6, 0x7EA8, 0xE6FD, 0x7EA9, 0xE6FE, 0x7EAA, 0xBCCD, + 0x7EAB, 0xC8D2, 0x7EAC, 0xCEB3, 0x7EAD, 0xE7A1, 0x7EAE, 0xC080, + 0x7EAF, 0xB4BF, 0x7EB0, 0xE7A2, 0x7EB1, 0xC9B4, 0x7EB2, 0xB8D9, + 0x7EB3, 0xC4C9, 0x7EB4, 0xC081, 0x7EB5, 0xD7DD, 0x7EB6, 0xC2DA, + 0x7EB7, 0xB7D7, 0x7EB8, 0xD6BD, 0x7EB9, 0xCEC6, 0x7EBA, 0xB7C4, + 0x7EBB, 0xC082, 0x7EBC, 0xC083, 0x7EBD, 0xC5A6, 0x7EBE, 0xE7A3, + 0x7EBF, 0xCFDF, 0x7EC0, 0xE7A4, 0x7EC1, 0xE7A5, 0x7EC2, 0xE7A6, + 0x7EC3, 0xC1B7, 0x7EC4, 0xD7E9, 0x7EC5, 0xC9F0, 0x7EC6, 0xCFB8, + 0x7EC7, 0xD6AF, 0x7EC8, 0xD6D5, 0x7EC9, 0xE7A7, 0x7ECA, 0xB0ED, + 0x7ECB, 0xE7A8, 0x7ECC, 0xE7A9, 0x7ECD, 0xC9DC, 0x7ECE, 0xD2EF, + 0x7ECF, 0xBEAD, 0x7ED0, 0xE7AA, 0x7ED1, 0xB0F3, 0x7ED2, 0xC8DE, + 0x7ED3, 0xBDE1, 0x7ED4, 0xE7AB, 0x7ED5, 0xC8C6, 0x7ED6, 0xC084, + 0x7ED7, 0xE7AC, 0x7ED8, 0xBBE6, 0x7ED9, 0xB8F8, 0x7EDA, 0xD1A4, + 0x7EDB, 0xE7AD, 0x7EDC, 0xC2E7, 0x7EDD, 0xBEF8, 0x7EDE, 0xBDCA, + 0x7EDF, 0xCDB3, 0x7EE0, 0xE7AE, 0x7EE1, 0xE7AF, 0x7EE2, 0xBEEE, + 0x7EE3, 0xD0E5, 0x7EE4, 0xC085, 0x7EE5, 0xCBE7, 0x7EE6, 0xCCD0, + 0x7EE7, 0xBCCC, 0x7EE8, 0xE7B0, 0x7EE9, 0xBCA8, 0x7EEA, 0xD0F7, + 0x7EEB, 0xE7B1, 0x7EEC, 0xC086, 0x7EED, 0xD0F8, 0x7EEE, 0xE7B2, + 0x7EEF, 0xE7B3, 0x7EF0, 0xB4C2, 0x7EF1, 0xE7B4, 0x7EF2, 0xE7B5, + 0x7EF3, 0xC9FE, 0x7EF4, 0xCEAC, 0x7EF5, 0xC3E0, 0x7EF6, 0xE7B7, + 0x7EF7, 0xB1C1, 0x7EF8, 0xB3F1, 0x7EF9, 0xC087, 0x7EFA, 0xE7B8, + 0x7EFB, 0xE7B9, 0x7EFC, 0xD7DB, 0x7EFD, 0xD5C0, 0x7EFE, 0xE7BA, + 0x7EFF, 0xC2CC, 0x7F00, 0xD7BA, 0x7F01, 0xE7BB, 0x7F02, 0xE7BC, + 0x7F03, 0xE7BD, 0x7F04, 0xBCEA, 0x7F05, 0xC3E5, 0x7F06, 0xC0C2, + 0x7F07, 0xE7BE, 0x7F08, 0xE7BF, 0x7F09, 0xBCA9, 0x7F0A, 0xC088, + 0x7F0B, 0xE7C0, 0x7F0C, 0xE7C1, 0x7F0D, 0xE7B6, 0x7F0E, 0xB6D0, + 0x7F0F, 0xE7C2, 0x7F10, 0xC089, 0x7F11, 0xE7C3, 0x7F12, 0xE7C4, + 0x7F13, 0xBBBA, 0x7F14, 0xB5DE, 0x7F15, 0xC2C6, 0x7F16, 0xB1E0, + 0x7F17, 0xE7C5, 0x7F18, 0xD4B5, 0x7F19, 0xE7C6, 0x7F1A, 0xB8BF, + 0x7F1B, 0xE7C8, 0x7F1C, 0xE7C7, 0x7F1D, 0xB7EC, 0x7F1E, 0xC08A, + 0x7F1F, 0xE7C9, 0x7F20, 0xB2F8, 0x7F21, 0xE7CA, 0x7F22, 0xE7CB, + 0x7F23, 0xE7CC, 0x7F24, 0xE7CD, 0x7F25, 0xE7CE, 0x7F26, 0xE7CF, + 0x7F27, 0xE7D0, 0x7F28, 0xD3A7, 0x7F29, 0xCBF5, 0x7F2A, 0xE7D1, + 0x7F2B, 0xE7D2, 0x7F2C, 0xE7D3, 0x7F2D, 0xE7D4, 0x7F2E, 0xC9C9, + 0x7F2F, 0xE7D5, 0x7F30, 0xE7D6, 0x7F31, 0xE7D7, 0x7F32, 0xE7D8, + 0x7F33, 0xE7D9, 0x7F34, 0xBDC9, 0x7F35, 0xE7DA, 0x7F36, 0xF3BE, + 0x7F37, 0xC08B, 0x7F38, 0xB8D7, 0x7F39, 0xC08C, 0x7F3A, 0xC8B1, + 0x7F3B, 0xC08D, 0x7F3C, 0xC08E, 0x7F3D, 0xC08F, 0x7F3E, 0xC090, + 0x7F3F, 0xC091, 0x7F40, 0xC092, 0x7F41, 0xC093, 0x7F42, 0xF3BF, + 0x7F43, 0xC094, 0x7F44, 0xF3C0, 0x7F45, 0xF3C1, 0x7F46, 0xC095, + 0x7F47, 0xC096, 0x7F48, 0xC097, 0x7F49, 0xC098, 0x7F4A, 0xC099, + 0x7F4B, 0xC09A, 0x7F4C, 0xC09B, 0x7F4D, 0xC09C, 0x7F4E, 0xC09D, + 0x7F4F, 0xC09E, 0x7F50, 0xB9DE, 0x7F51, 0xCDF8, 0x7F52, 0xC09F, + 0x7F53, 0xC0A0, 0x7F54, 0xD8E8, 0x7F55, 0xBAB1, 0x7F56, 0xC140, + 0x7F57, 0xC2DE, 0x7F58, 0xEEB7, 0x7F59, 0xC141, 0x7F5A, 0xB7A3, + 0x7F5B, 0xC142, 0x7F5C, 0xC143, 0x7F5D, 0xC144, 0x7F5E, 0xC145, + 0x7F5F, 0xEEB9, 0x7F60, 0xC146, 0x7F61, 0xEEB8, 0x7F62, 0xB0D5, + 0x7F63, 0xC147, 0x7F64, 0xC148, 0x7F65, 0xC149, 0x7F66, 0xC14A, + 0x7F67, 0xC14B, 0x7F68, 0xEEBB, 0x7F69, 0xD5D6, 0x7F6A, 0xD7EF, + 0x7F6B, 0xC14C, 0x7F6C, 0xC14D, 0x7F6D, 0xC14E, 0x7F6E, 0xD6C3, + 0x7F6F, 0xC14F, 0x7F70, 0xC150, 0x7F71, 0xEEBD, 0x7F72, 0xCAF0, + 0x7F73, 0xC151, 0x7F74, 0xEEBC, 0x7F75, 0xC152, 0x7F76, 0xC153, + 0x7F77, 0xC154, 0x7F78, 0xC155, 0x7F79, 0xEEBE, 0x7F7A, 0xC156, + 0x7F7B, 0xC157, 0x7F7C, 0xC158, 0x7F7D, 0xC159, 0x7F7E, 0xEEC0, + 0x7F7F, 0xC15A, 0x7F80, 0xC15B, 0x7F81, 0xEEBF, 0x7F82, 0xC15C, + 0x7F83, 0xC15D, 0x7F84, 0xC15E, 0x7F85, 0xC15F, 0x7F86, 0xC160, + 0x7F87, 0xC161, 0x7F88, 0xC162, 0x7F89, 0xC163, 0x7F8A, 0xD1F2, + 0x7F8B, 0xC164, 0x7F8C, 0xC7BC, 0x7F8D, 0xC165, 0x7F8E, 0xC3C0, + 0x7F8F, 0xC166, 0x7F90, 0xC167, 0x7F91, 0xC168, 0x7F92, 0xC169, + 0x7F93, 0xC16A, 0x7F94, 0xB8E1, 0x7F95, 0xC16B, 0x7F96, 0xC16C, + 0x7F97, 0xC16D, 0x7F98, 0xC16E, 0x7F99, 0xC16F, 0x7F9A, 0xC1E7, + 0x7F9B, 0xC170, 0x7F9C, 0xC171, 0x7F9D, 0xF4C6, 0x7F9E, 0xD0DF, + 0x7F9F, 0xF4C7, 0x7FA0, 0xC172, 0x7FA1, 0xCFDB, 0x7FA2, 0xC173, + 0x7FA3, 0xC174, 0x7FA4, 0xC8BA, 0x7FA5, 0xC175, 0x7FA6, 0xC176, + 0x7FA7, 0xF4C8, 0x7FA8, 0xC177, 0x7FA9, 0xC178, 0x7FAA, 0xC179, + 0x7FAB, 0xC17A, 0x7FAC, 0xC17B, 0x7FAD, 0xC17C, 0x7FAE, 0xC17D, + 0x7FAF, 0xF4C9, 0x7FB0, 0xF4CA, 0x7FB1, 0xC17E, 0x7FB2, 0xF4CB, + 0x7FB3, 0xC180, 0x7FB4, 0xC181, 0x7FB5, 0xC182, 0x7FB6, 0xC183, + 0x7FB7, 0xC184, 0x7FB8, 0xD9FA, 0x7FB9, 0xB8FE, 0x7FBA, 0xC185, + 0x7FBB, 0xC186, 0x7FBC, 0xE5F1, 0x7FBD, 0xD3F0, 0x7FBE, 0xC187, + 0x7FBF, 0xF4E0, 0x7FC0, 0xC188, 0x7FC1, 0xCECC, 0x7FC2, 0xC189, + 0x7FC3, 0xC18A, 0x7FC4, 0xC18B, 0x7FC5, 0xB3E1, 0x7FC6, 0xC18C, + 0x7FC7, 0xC18D, 0x7FC8, 0xC18E, 0x7FC9, 0xC18F, 0x7FCA, 0xF1B4, + 0x7FCB, 0xC190, 0x7FCC, 0xD2EE, 0x7FCD, 0xC191, 0x7FCE, 0xF4E1, + 0x7FCF, 0xC192, 0x7FD0, 0xC193, 0x7FD1, 0xC194, 0x7FD2, 0xC195, + 0x7FD3, 0xC196, 0x7FD4, 0xCFE8, 0x7FD5, 0xF4E2, 0x7FD6, 0xC197, + 0x7FD7, 0xC198, 0x7FD8, 0xC7CC, 0x7FD9, 0xC199, 0x7FDA, 0xC19A, + 0x7FDB, 0xC19B, 0x7FDC, 0xC19C, 0x7FDD, 0xC19D, 0x7FDE, 0xC19E, + 0x7FDF, 0xB5D4, 0x7FE0, 0xB4E4, 0x7FE1, 0xF4E4, 0x7FE2, 0xC19F, + 0x7FE3, 0xC1A0, 0x7FE4, 0xC240, 0x7FE5, 0xF4E3, 0x7FE6, 0xF4E5, + 0x7FE7, 0xC241, 0x7FE8, 0xC242, 0x7FE9, 0xF4E6, 0x7FEA, 0xC243, + 0x7FEB, 0xC244, 0x7FEC, 0xC245, 0x7FED, 0xC246, 0x7FEE, 0xF4E7, + 0x7FEF, 0xC247, 0x7FF0, 0xBAB2, 0x7FF1, 0xB0BF, 0x7FF2, 0xC248, + 0x7FF3, 0xF4E8, 0x7FF4, 0xC249, 0x7FF5, 0xC24A, 0x7FF6, 0xC24B, + 0x7FF7, 0xC24C, 0x7FF8, 0xC24D, 0x7FF9, 0xC24E, 0x7FFA, 0xC24F, + 0x7FFB, 0xB7AD, 0x7FFC, 0xD2ED, 0x7FFD, 0xC250, 0x7FFE, 0xC251, + 0x7FFF, 0xC252, 0x8000, 0xD2AB, 0x8001, 0xC0CF, 0x8002, 0xC253, + 0x8003, 0xBFBC, 0x8004, 0xEBA3, 0x8005, 0xD5DF, 0x8006, 0xEAC8, + 0x8007, 0xC254, 0x8008, 0xC255, 0x8009, 0xC256, 0x800A, 0xC257, + 0x800B, 0xF1F3, 0x800C, 0xB6F8, 0x800D, 0xCBA3, 0x800E, 0xC258, + 0x800F, 0xC259, 0x8010, 0xC4CD, 0x8011, 0xC25A, 0x8012, 0xF1E7, + 0x8013, 0xC25B, 0x8014, 0xF1E8, 0x8015, 0xB8FB, 0x8016, 0xF1E9, + 0x8017, 0xBAC4, 0x8018, 0xD4C5, 0x8019, 0xB0D2, 0x801A, 0xC25C, + 0x801B, 0xC25D, 0x801C, 0xF1EA, 0x801D, 0xC25E, 0x801E, 0xC25F, + 0x801F, 0xC260, 0x8020, 0xF1EB, 0x8021, 0xC261, 0x8022, 0xF1EC, + 0x8023, 0xC262, 0x8024, 0xC263, 0x8025, 0xF1ED, 0x8026, 0xF1EE, + 0x8027, 0xF1EF, 0x8028, 0xF1F1, 0x8029, 0xF1F0, 0x802A, 0xC5D5, + 0x802B, 0xC264, 0x802C, 0xC265, 0x802D, 0xC266, 0x802E, 0xC267, + 0x802F, 0xC268, 0x8030, 0xC269, 0x8031, 0xF1F2, 0x8032, 0xC26A, + 0x8033, 0xB6FA, 0x8034, 0xC26B, 0x8035, 0xF1F4, 0x8036, 0xD2AE, + 0x8037, 0xDEC7, 0x8038, 0xCBCA, 0x8039, 0xC26C, 0x803A, 0xC26D, + 0x803B, 0xB3DC, 0x803C, 0xC26E, 0x803D, 0xB5A2, 0x803E, 0xC26F, + 0x803F, 0xB9A2, 0x8040, 0xC270, 0x8041, 0xC271, 0x8042, 0xC4F4, + 0x8043, 0xF1F5, 0x8044, 0xC272, 0x8045, 0xC273, 0x8046, 0xF1F6, + 0x8047, 0xC274, 0x8048, 0xC275, 0x8049, 0xC276, 0x804A, 0xC1C4, + 0x804B, 0xC1FB, 0x804C, 0xD6B0, 0x804D, 0xF1F7, 0x804E, 0xC277, + 0x804F, 0xC278, 0x8050, 0xC279, 0x8051, 0xC27A, 0x8052, 0xF1F8, + 0x8053, 0xC27B, 0x8054, 0xC1AA, 0x8055, 0xC27C, 0x8056, 0xC27D, + 0x8057, 0xC27E, 0x8058, 0xC6B8, 0x8059, 0xC280, 0x805A, 0xBEDB, + 0x805B, 0xC281, 0x805C, 0xC282, 0x805D, 0xC283, 0x805E, 0xC284, + 0x805F, 0xC285, 0x8060, 0xC286, 0x8061, 0xC287, 0x8062, 0xC288, + 0x8063, 0xC289, 0x8064, 0xC28A, 0x8065, 0xC28B, 0x8066, 0xC28C, + 0x8067, 0xC28D, 0x8068, 0xC28E, 0x8069, 0xF1F9, 0x806A, 0xB4CF, + 0x806B, 0xC28F, 0x806C, 0xC290, 0x806D, 0xC291, 0x806E, 0xC292, + 0x806F, 0xC293, 0x8070, 0xC294, 0x8071, 0xF1FA, 0x8072, 0xC295, + 0x8073, 0xC296, 0x8074, 0xC297, 0x8075, 0xC298, 0x8076, 0xC299, + 0x8077, 0xC29A, 0x8078, 0xC29B, 0x8079, 0xC29C, 0x807A, 0xC29D, + 0x807B, 0xC29E, 0x807C, 0xC29F, 0x807D, 0xC2A0, 0x807E, 0xC340, + 0x807F, 0xEDB2, 0x8080, 0xEDB1, 0x8081, 0xC341, 0x8082, 0xC342, + 0x8083, 0xCBE0, 0x8084, 0xD2DE, 0x8085, 0xC343, 0x8086, 0xCBC1, + 0x8087, 0xD5D8, 0x8088, 0xC344, 0x8089, 0xC8E2, 0x808A, 0xC345, + 0x808B, 0xC0DF, 0x808C, 0xBCA1, 0x808D, 0xC346, 0x808E, 0xC347, + 0x808F, 0xC348, 0x8090, 0xC349, 0x8091, 0xC34A, 0x8092, 0xC34B, + 0x8093, 0xEBC1, 0x8094, 0xC34C, 0x8095, 0xC34D, 0x8096, 0xD0A4, + 0x8097, 0xC34E, 0x8098, 0xD6E2, 0x8099, 0xC34F, 0x809A, 0xB6C7, + 0x809B, 0xB8D8, 0x809C, 0xEBC0, 0x809D, 0xB8CE, 0x809E, 0xC350, + 0x809F, 0xEBBF, 0x80A0, 0xB3A6, 0x80A1, 0xB9C9, 0x80A2, 0xD6AB, + 0x80A3, 0xC351, 0x80A4, 0xB7F4, 0x80A5, 0xB7CA, 0x80A6, 0xC352, + 0x80A7, 0xC353, 0x80A8, 0xC354, 0x80A9, 0xBCE7, 0x80AA, 0xB7BE, + 0x80AB, 0xEBC6, 0x80AC, 0xC355, 0x80AD, 0xEBC7, 0x80AE, 0xB0B9, + 0x80AF, 0xBFCF, 0x80B0, 0xC356, 0x80B1, 0xEBC5, 0x80B2, 0xD3FD, + 0x80B3, 0xC357, 0x80B4, 0xEBC8, 0x80B5, 0xC358, 0x80B6, 0xC359, + 0x80B7, 0xEBC9, 0x80B8, 0xC35A, 0x80B9, 0xC35B, 0x80BA, 0xB7CE, + 0x80BB, 0xC35C, 0x80BC, 0xEBC2, 0x80BD, 0xEBC4, 0x80BE, 0xC9F6, + 0x80BF, 0xD6D7, 0x80C0, 0xD5CD, 0x80C1, 0xD0B2, 0x80C2, 0xEBCF, + 0x80C3, 0xCEB8, 0x80C4, 0xEBD0, 0x80C5, 0xC35D, 0x80C6, 0xB5A8, + 0x80C7, 0xC35E, 0x80C8, 0xC35F, 0x80C9, 0xC360, 0x80CA, 0xC361, + 0x80CB, 0xC362, 0x80CC, 0xB1B3, 0x80CD, 0xEBD2, 0x80CE, 0xCCA5, + 0x80CF, 0xC363, 0x80D0, 0xC364, 0x80D1, 0xC365, 0x80D2, 0xC366, + 0x80D3, 0xC367, 0x80D4, 0xC368, 0x80D5, 0xC369, 0x80D6, 0xC5D6, + 0x80D7, 0xEBD3, 0x80D8, 0xC36A, 0x80D9, 0xEBD1, 0x80DA, 0xC5DF, + 0x80DB, 0xEBCE, 0x80DC, 0xCAA4, 0x80DD, 0xEBD5, 0x80DE, 0xB0FB, + 0x80DF, 0xC36B, 0x80E0, 0xC36C, 0x80E1, 0xBAFA, 0x80E2, 0xC36D, + 0x80E3, 0xC36E, 0x80E4, 0xD8B7, 0x80E5, 0xF1E3, 0x80E6, 0xC36F, + 0x80E7, 0xEBCA, 0x80E8, 0xEBCB, 0x80E9, 0xEBCC, 0x80EA, 0xEBCD, + 0x80EB, 0xEBD6, 0x80EC, 0xE6C0, 0x80ED, 0xEBD9, 0x80EE, 0xC370, + 0x80EF, 0xBFE8, 0x80F0, 0xD2C8, 0x80F1, 0xEBD7, 0x80F2, 0xEBDC, + 0x80F3, 0xB8EC, 0x80F4, 0xEBD8, 0x80F5, 0xC371, 0x80F6, 0xBDBA, + 0x80F7, 0xC372, 0x80F8, 0xD0D8, 0x80F9, 0xC373, 0x80FA, 0xB0B7, + 0x80FB, 0xC374, 0x80FC, 0xEBDD, 0x80FD, 0xC4DC, 0x80FE, 0xC375, + 0x80FF, 0xC376, 0x8100, 0xC377, 0x8101, 0xC378, 0x8102, 0xD6AC, + 0x8103, 0xC379, 0x8104, 0xC37A, 0x8105, 0xC37B, 0x8106, 0xB4E0, + 0x8107, 0xC37C, 0x8108, 0xC37D, 0x8109, 0xC2F6, 0x810A, 0xBCB9, + 0x810B, 0xC37E, 0x810C, 0xC380, 0x810D, 0xEBDA, 0x810E, 0xEBDB, + 0x810F, 0xD4E0, 0x8110, 0xC6EA, 0x8111, 0xC4D4, 0x8112, 0xEBDF, + 0x8113, 0xC5A7, 0x8114, 0xD9F5, 0x8115, 0xC381, 0x8116, 0xB2B1, + 0x8117, 0xC382, 0x8118, 0xEBE4, 0x8119, 0xC383, 0x811A, 0xBDC5, + 0x811B, 0xC384, 0x811C, 0xC385, 0x811D, 0xC386, 0x811E, 0xEBE2, + 0x811F, 0xC387, 0x8120, 0xC388, 0x8121, 0xC389, 0x8122, 0xC38A, + 0x8123, 0xC38B, 0x8124, 0xC38C, 0x8125, 0xC38D, 0x8126, 0xC38E, + 0x8127, 0xC38F, 0x8128, 0xC390, 0x8129, 0xC391, 0x812A, 0xC392, + 0x812B, 0xC393, 0x812C, 0xEBE3, 0x812D, 0xC394, 0x812E, 0xC395, + 0x812F, 0xB8AC, 0x8130, 0xC396, 0x8131, 0xCDD1, 0x8132, 0xEBE5, + 0x8133, 0xC397, 0x8134, 0xC398, 0x8135, 0xC399, 0x8136, 0xEBE1, + 0x8137, 0xC39A, 0x8138, 0xC1B3, 0x8139, 0xC39B, 0x813A, 0xC39C, + 0x813B, 0xC39D, 0x813C, 0xC39E, 0x813D, 0xC39F, 0x813E, 0xC6A2, + 0x813F, 0xC3A0, 0x8140, 0xC440, 0x8141, 0xC441, 0x8142, 0xC442, + 0x8143, 0xC443, 0x8144, 0xC444, 0x8145, 0xC445, 0x8146, 0xCCF3, + 0x8147, 0xC446, 0x8148, 0xEBE6, 0x8149, 0xC447, 0x814A, 0xC0B0, + 0x814B, 0xD2B8, 0x814C, 0xEBE7, 0x814D, 0xC448, 0x814E, 0xC449, + 0x814F, 0xC44A, 0x8150, 0xB8AF, 0x8151, 0xB8AD, 0x8152, 0xC44B, + 0x8153, 0xEBE8, 0x8154, 0xC7BB, 0x8155, 0xCDF3, 0x8156, 0xC44C, + 0x8157, 0xC44D, 0x8158, 0xC44E, 0x8159, 0xEBEA, 0x815A, 0xEBEB, + 0x815B, 0xC44F, 0x815C, 0xC450, 0x815D, 0xC451, 0x815E, 0xC452, + 0x815F, 0xC453, 0x8160, 0xEBED, 0x8161, 0xC454, 0x8162, 0xC455, + 0x8163, 0xC456, 0x8164, 0xC457, 0x8165, 0xD0C8, 0x8166, 0xC458, + 0x8167, 0xEBF2, 0x8168, 0xC459, 0x8169, 0xEBEE, 0x816A, 0xC45A, + 0x816B, 0xC45B, 0x816C, 0xC45C, 0x816D, 0xEBF1, 0x816E, 0xC8F9, + 0x816F, 0xC45D, 0x8170, 0xD1FC, 0x8171, 0xEBEC, 0x8172, 0xC45E, + 0x8173, 0xC45F, 0x8174, 0xEBE9, 0x8175, 0xC460, 0x8176, 0xC461, + 0x8177, 0xC462, 0x8178, 0xC463, 0x8179, 0xB8B9, 0x817A, 0xCFD9, + 0x817B, 0xC4E5, 0x817C, 0xEBEF, 0x817D, 0xEBF0, 0x817E, 0xCCDA, + 0x817F, 0xCDC8, 0x8180, 0xB0F2, 0x8181, 0xC464, 0x8182, 0xEBF6, + 0x8183, 0xC465, 0x8184, 0xC466, 0x8185, 0xC467, 0x8186, 0xC468, + 0x8187, 0xC469, 0x8188, 0xEBF5, 0x8189, 0xC46A, 0x818A, 0xB2B2, + 0x818B, 0xC46B, 0x818C, 0xC46C, 0x818D, 0xC46D, 0x818E, 0xC46E, + 0x818F, 0xB8E0, 0x8190, 0xC46F, 0x8191, 0xEBF7, 0x8192, 0xC470, + 0x8193, 0xC471, 0x8194, 0xC472, 0x8195, 0xC473, 0x8196, 0xC474, + 0x8197, 0xC475, 0x8198, 0xB1EC, 0x8199, 0xC476, 0x819A, 0xC477, + 0x819B, 0xCCC5, 0x819C, 0xC4A4, 0x819D, 0xCFA5, 0x819E, 0xC478, + 0x819F, 0xC479, 0x81A0, 0xC47A, 0x81A1, 0xC47B, 0x81A2, 0xC47C, + 0x81A3, 0xEBF9, 0x81A4, 0xC47D, 0x81A5, 0xC47E, 0x81A6, 0xECA2, + 0x81A7, 0xC480, 0x81A8, 0xC5F2, 0x81A9, 0xC481, 0x81AA, 0xEBFA, + 0x81AB, 0xC482, 0x81AC, 0xC483, 0x81AD, 0xC484, 0x81AE, 0xC485, + 0x81AF, 0xC486, 0x81B0, 0xC487, 0x81B1, 0xC488, 0x81B2, 0xC489, + 0x81B3, 0xC9C5, 0x81B4, 0xC48A, 0x81B5, 0xC48B, 0x81B6, 0xC48C, + 0x81B7, 0xC48D, 0x81B8, 0xC48E, 0x81B9, 0xC48F, 0x81BA, 0xE2DF, + 0x81BB, 0xEBFE, 0x81BC, 0xC490, 0x81BD, 0xC491, 0x81BE, 0xC492, + 0x81BF, 0xC493, 0x81C0, 0xCDCE, 0x81C1, 0xECA1, 0x81C2, 0xB1DB, + 0x81C3, 0xD3B7, 0x81C4, 0xC494, 0x81C5, 0xC495, 0x81C6, 0xD2DC, + 0x81C7, 0xC496, 0x81C8, 0xC497, 0x81C9, 0xC498, 0x81CA, 0xEBFD, + 0x81CB, 0xC499, 0x81CC, 0xEBFB, 0x81CD, 0xC49A, 0x81CE, 0xC49B, + 0x81CF, 0xC49C, 0x81D0, 0xC49D, 0x81D1, 0xC49E, 0x81D2, 0xC49F, + 0x81D3, 0xC4A0, 0x81D4, 0xC540, 0x81D5, 0xC541, 0x81D6, 0xC542, + 0x81D7, 0xC543, 0x81D8, 0xC544, 0x81D9, 0xC545, 0x81DA, 0xC546, + 0x81DB, 0xC547, 0x81DC, 0xC548, 0x81DD, 0xC549, 0x81DE, 0xC54A, + 0x81DF, 0xC54B, 0x81E0, 0xC54C, 0x81E1, 0xC54D, 0x81E2, 0xC54E, + 0x81E3, 0xB3BC, 0x81E4, 0xC54F, 0x81E5, 0xC550, 0x81E6, 0xC551, + 0x81E7, 0xEAB0, 0x81E8, 0xC552, 0x81E9, 0xC553, 0x81EA, 0xD7D4, + 0x81EB, 0xC554, 0x81EC, 0xF4AB, 0x81ED, 0xB3F4, 0x81EE, 0xC555, + 0x81EF, 0xC556, 0x81F0, 0xC557, 0x81F1, 0xC558, 0x81F2, 0xC559, + 0x81F3, 0xD6C1, 0x81F4, 0xD6C2, 0x81F5, 0xC55A, 0x81F6, 0xC55B, + 0x81F7, 0xC55C, 0x81F8, 0xC55D, 0x81F9, 0xC55E, 0x81FA, 0xC55F, + 0x81FB, 0xD5E9, 0x81FC, 0xBECA, 0x81FD, 0xC560, 0x81FE, 0xF4A7, + 0x81FF, 0xC561, 0x8200, 0xD2A8, 0x8201, 0xF4A8, 0x8202, 0xF4A9, + 0x8203, 0xC562, 0x8204, 0xF4AA, 0x8205, 0xBECB, 0x8206, 0xD3DF, + 0x8207, 0xC563, 0x8208, 0xC564, 0x8209, 0xC565, 0x820A, 0xC566, + 0x820B, 0xC567, 0x820C, 0xC9E0, 0x820D, 0xC9E1, 0x820E, 0xC568, + 0x820F, 0xC569, 0x8210, 0xF3C2, 0x8211, 0xC56A, 0x8212, 0xCAE6, + 0x8213, 0xC56B, 0x8214, 0xCCF2, 0x8215, 0xC56C, 0x8216, 0xC56D, + 0x8217, 0xC56E, 0x8218, 0xC56F, 0x8219, 0xC570, 0x821A, 0xC571, + 0x821B, 0xE2B6, 0x821C, 0xCBB4, 0x821D, 0xC572, 0x821E, 0xCEE8, + 0x821F, 0xD6DB, 0x8220, 0xC573, 0x8221, 0xF4AD, 0x8222, 0xF4AE, + 0x8223, 0xF4AF, 0x8224, 0xC574, 0x8225, 0xC575, 0x8226, 0xC576, + 0x8227, 0xC577, 0x8228, 0xF4B2, 0x8229, 0xC578, 0x822A, 0xBABD, + 0x822B, 0xF4B3, 0x822C, 0xB0E3, 0x822D, 0xF4B0, 0x822E, 0xC579, + 0x822F, 0xF4B1, 0x8230, 0xBDA2, 0x8231, 0xB2D5, 0x8232, 0xC57A, + 0x8233, 0xF4B6, 0x8234, 0xF4B7, 0x8235, 0xB6E6, 0x8236, 0xB2B0, + 0x8237, 0xCFCF, 0x8238, 0xF4B4, 0x8239, 0xB4AC, 0x823A, 0xC57B, + 0x823B, 0xF4B5, 0x823C, 0xC57C, 0x823D, 0xC57D, 0x823E, 0xF4B8, + 0x823F, 0xC57E, 0x8240, 0xC580, 0x8241, 0xC581, 0x8242, 0xC582, + 0x8243, 0xC583, 0x8244, 0xF4B9, 0x8245, 0xC584, 0x8246, 0xC585, + 0x8247, 0xCDA7, 0x8248, 0xC586, 0x8249, 0xF4BA, 0x824A, 0xC587, + 0x824B, 0xF4BB, 0x824C, 0xC588, 0x824D, 0xC589, 0x824E, 0xC58A, + 0x824F, 0xF4BC, 0x8250, 0xC58B, 0x8251, 0xC58C, 0x8252, 0xC58D, + 0x8253, 0xC58E, 0x8254, 0xC58F, 0x8255, 0xC590, 0x8256, 0xC591, + 0x8257, 0xC592, 0x8258, 0xCBD2, 0x8259, 0xC593, 0x825A, 0xF4BD, + 0x825B, 0xC594, 0x825C, 0xC595, 0x825D, 0xC596, 0x825E, 0xC597, + 0x825F, 0xF4BE, 0x8260, 0xC598, 0x8261, 0xC599, 0x8262, 0xC59A, + 0x8263, 0xC59B, 0x8264, 0xC59C, 0x8265, 0xC59D, 0x8266, 0xC59E, + 0x8267, 0xC59F, 0x8268, 0xF4BF, 0x8269, 0xC5A0, 0x826A, 0xC640, + 0x826B, 0xC641, 0x826C, 0xC642, 0x826D, 0xC643, 0x826E, 0xF4DE, + 0x826F, 0xC1BC, 0x8270, 0xBCE8, 0x8271, 0xC644, 0x8272, 0xC9AB, + 0x8273, 0xD1DE, 0x8274, 0xE5F5, 0x8275, 0xC645, 0x8276, 0xC646, + 0x8277, 0xC647, 0x8278, 0xC648, 0x8279, 0xDCB3, 0x827A, 0xD2D5, + 0x827B, 0xC649, 0x827C, 0xC64A, 0x827D, 0xDCB4, 0x827E, 0xB0AC, + 0x827F, 0xDCB5, 0x8280, 0xC64B, 0x8281, 0xC64C, 0x8282, 0xBDDA, + 0x8283, 0xC64D, 0x8284, 0xDCB9, 0x8285, 0xC64E, 0x8286, 0xC64F, + 0x8287, 0xC650, 0x8288, 0xD8C2, 0x8289, 0xC651, 0x828A, 0xDCB7, + 0x828B, 0xD3F3, 0x828C, 0xC652, 0x828D, 0xC9D6, 0x828E, 0xDCBA, + 0x828F, 0xDCB6, 0x8290, 0xC653, 0x8291, 0xDCBB, 0x8292, 0xC3A2, + 0x8293, 0xC654, 0x8294, 0xC655, 0x8295, 0xC656, 0x8296, 0xC657, + 0x8297, 0xDCBC, 0x8298, 0xDCC5, 0x8299, 0xDCBD, 0x829A, 0xC658, + 0x829B, 0xC659, 0x829C, 0xCEDF, 0x829D, 0xD6A5, 0x829E, 0xC65A, + 0x829F, 0xDCCF, 0x82A0, 0xC65B, 0x82A1, 0xDCCD, 0x82A2, 0xC65C, + 0x82A3, 0xC65D, 0x82A4, 0xDCD2, 0x82A5, 0xBDE6, 0x82A6, 0xC2AB, + 0x82A7, 0xC65E, 0x82A8, 0xDCB8, 0x82A9, 0xDCCB, 0x82AA, 0xDCCE, + 0x82AB, 0xDCBE, 0x82AC, 0xB7D2, 0x82AD, 0xB0C5, 0x82AE, 0xDCC7, + 0x82AF, 0xD0BE, 0x82B0, 0xDCC1, 0x82B1, 0xBBA8, 0x82B2, 0xC65F, + 0x82B3, 0xB7BC, 0x82B4, 0xDCCC, 0x82B5, 0xC660, 0x82B6, 0xC661, + 0x82B7, 0xDCC6, 0x82B8, 0xDCBF, 0x82B9, 0xC7DB, 0x82BA, 0xC662, + 0x82BB, 0xC663, 0x82BC, 0xC664, 0x82BD, 0xD1BF, 0x82BE, 0xDCC0, + 0x82BF, 0xC665, 0x82C0, 0xC666, 0x82C1, 0xDCCA, 0x82C2, 0xC667, + 0x82C3, 0xC668, 0x82C4, 0xDCD0, 0x82C5, 0xC669, 0x82C6, 0xC66A, + 0x82C7, 0xCEAD, 0x82C8, 0xDCC2, 0x82C9, 0xC66B, 0x82CA, 0xDCC3, + 0x82CB, 0xDCC8, 0x82CC, 0xDCC9, 0x82CD, 0xB2D4, 0x82CE, 0xDCD1, + 0x82CF, 0xCBD5, 0x82D0, 0xC66C, 0x82D1, 0xD4B7, 0x82D2, 0xDCDB, + 0x82D3, 0xDCDF, 0x82D4, 0xCCA6, 0x82D5, 0xDCE6, 0x82D6, 0xC66D, + 0x82D7, 0xC3E7, 0x82D8, 0xDCDC, 0x82D9, 0xC66E, 0x82DA, 0xC66F, + 0x82DB, 0xBFC1, 0x82DC, 0xDCD9, 0x82DD, 0xC670, 0x82DE, 0xB0FA, + 0x82DF, 0xB9B6, 0x82E0, 0xDCE5, 0x82E1, 0xDCD3, 0x82E2, 0xC671, + 0x82E3, 0xDCC4, 0x82E4, 0xDCD6, 0x82E5, 0xC8F4, 0x82E6, 0xBFE0, + 0x82E7, 0xC672, 0x82E8, 0xC673, 0x82E9, 0xC674, 0x82EA, 0xC675, + 0x82EB, 0xC9BB, 0x82EC, 0xC676, 0x82ED, 0xC677, 0x82EE, 0xC678, + 0x82EF, 0xB1BD, 0x82F0, 0xC679, 0x82F1, 0xD3A2, 0x82F2, 0xC67A, + 0x82F3, 0xC67B, 0x82F4, 0xDCDA, 0x82F5, 0xC67C, 0x82F6, 0xC67D, + 0x82F7, 0xDCD5, 0x82F8, 0xC67E, 0x82F9, 0xC6BB, 0x82FA, 0xC680, + 0x82FB, 0xDCDE, 0x82FC, 0xC681, 0x82FD, 0xC682, 0x82FE, 0xC683, + 0x82FF, 0xC684, 0x8300, 0xC685, 0x8301, 0xD7C2, 0x8302, 0xC3AF, + 0x8303, 0xB7B6, 0x8304, 0xC7D1, 0x8305, 0xC3A9, 0x8306, 0xDCE2, + 0x8307, 0xDCD8, 0x8308, 0xDCEB, 0x8309, 0xDCD4, 0x830A, 0xC686, + 0x830B, 0xC687, 0x830C, 0xDCDD, 0x830D, 0xC688, 0x830E, 0xBEA5, + 0x830F, 0xDCD7, 0x8310, 0xC689, 0x8311, 0xDCE0, 0x8312, 0xC68A, + 0x8313, 0xC68B, 0x8314, 0xDCE3, 0x8315, 0xDCE4, 0x8316, 0xC68C, + 0x8317, 0xDCF8, 0x8318, 0xC68D, 0x8319, 0xC68E, 0x831A, 0xDCE1, + 0x831B, 0xDDA2, 0x831C, 0xDCE7, 0x831D, 0xC68F, 0x831E, 0xC690, + 0x831F, 0xC691, 0x8320, 0xC692, 0x8321, 0xC693, 0x8322, 0xC694, + 0x8323, 0xC695, 0x8324, 0xC696, 0x8325, 0xC697, 0x8326, 0xC698, + 0x8327, 0xBCEB, 0x8328, 0xB4C4, 0x8329, 0xC699, 0x832A, 0xC69A, + 0x832B, 0xC3A3, 0x832C, 0xB2E7, 0x832D, 0xDCFA, 0x832E, 0xC69B, + 0x832F, 0xDCF2, 0x8330, 0xC69C, 0x8331, 0xDCEF, 0x8332, 0xC69D, + 0x8333, 0xDCFC, 0x8334, 0xDCEE, 0x8335, 0xD2F0, 0x8336, 0xB2E8, + 0x8337, 0xC69E, 0x8338, 0xC8D7, 0x8339, 0xC8E3, 0x833A, 0xDCFB, + 0x833B, 0xC69F, 0x833C, 0xDCED, 0x833D, 0xC6A0, 0x833E, 0xC740, + 0x833F, 0xC741, 0x8340, 0xDCF7, 0x8341, 0xC742, 0x8342, 0xC743, + 0x8343, 0xDCF5, 0x8344, 0xC744, 0x8345, 0xC745, 0x8346, 0xBEA3, + 0x8347, 0xDCF4, 0x8348, 0xC746, 0x8349, 0xB2DD, 0x834A, 0xC747, + 0x834B, 0xC748, 0x834C, 0xC749, 0x834D, 0xC74A, 0x834E, 0xC74B, + 0x834F, 0xDCF3, 0x8350, 0xBCF6, 0x8351, 0xDCE8, 0x8352, 0xBBC4, + 0x8353, 0xC74C, 0x8354, 0xC0F3, 0x8355, 0xC74D, 0x8356, 0xC74E, + 0x8357, 0xC74F, 0x8358, 0xC750, 0x8359, 0xC751, 0x835A, 0xBCD4, + 0x835B, 0xDCE9, 0x835C, 0xDCEA, 0x835D, 0xC752, 0x835E, 0xDCF1, + 0x835F, 0xDCF6, 0x8360, 0xDCF9, 0x8361, 0xB5B4, 0x8362, 0xC753, + 0x8363, 0xC8D9, 0x8364, 0xBBE7, 0x8365, 0xDCFE, 0x8366, 0xDCFD, + 0x8367, 0xD3AB, 0x8368, 0xDDA1, 0x8369, 0xDDA3, 0x836A, 0xDDA5, + 0x836B, 0xD2F1, 0x836C, 0xDDA4, 0x836D, 0xDDA6, 0x836E, 0xDDA7, + 0x836F, 0xD2A9, 0x8370, 0xC754, 0x8371, 0xC755, 0x8372, 0xC756, + 0x8373, 0xC757, 0x8374, 0xC758, 0x8375, 0xC759, 0x8376, 0xC75A, + 0x8377, 0xBAC9, 0x8378, 0xDDA9, 0x8379, 0xC75B, 0x837A, 0xC75C, + 0x837B, 0xDDB6, 0x837C, 0xDDB1, 0x837D, 0xDDB4, 0x837E, 0xC75D, + 0x837F, 0xC75E, 0x8380, 0xC75F, 0x8381, 0xC760, 0x8382, 0xC761, + 0x8383, 0xC762, 0x8384, 0xC763, 0x8385, 0xDDB0, 0x8386, 0xC6CE, + 0x8387, 0xC764, 0x8388, 0xC765, 0x8389, 0xC0F2, 0x838A, 0xC766, + 0x838B, 0xC767, 0x838C, 0xC768, 0x838D, 0xC769, 0x838E, 0xC9AF, + 0x838F, 0xC76A, 0x8390, 0xC76B, 0x8391, 0xC76C, 0x8392, 0xDCEC, + 0x8393, 0xDDAE, 0x8394, 0xC76D, 0x8395, 0xC76E, 0x8396, 0xC76F, + 0x8397, 0xC770, 0x8398, 0xDDB7, 0x8399, 0xC771, 0x839A, 0xC772, + 0x839B, 0xDCF0, 0x839C, 0xDDAF, 0x839D, 0xC773, 0x839E, 0xDDB8, + 0x839F, 0xC774, 0x83A0, 0xDDAC, 0x83A1, 0xC775, 0x83A2, 0xC776, + 0x83A3, 0xC777, 0x83A4, 0xC778, 0x83A5, 0xC779, 0x83A6, 0xC77A, + 0x83A7, 0xC77B, 0x83A8, 0xDDB9, 0x83A9, 0xDDB3, 0x83AA, 0xDDAD, + 0x83AB, 0xC4AA, 0x83AC, 0xC77C, 0x83AD, 0xC77D, 0x83AE, 0xC77E, + 0x83AF, 0xC780, 0x83B0, 0xDDA8, 0x83B1, 0xC0B3, 0x83B2, 0xC1AB, + 0x83B3, 0xDDAA, 0x83B4, 0xDDAB, 0x83B5, 0xC781, 0x83B6, 0xDDB2, + 0x83B7, 0xBBF1, 0x83B8, 0xDDB5, 0x83B9, 0xD3A8, 0x83BA, 0xDDBA, + 0x83BB, 0xC782, 0x83BC, 0xDDBB, 0x83BD, 0xC3A7, 0x83BE, 0xC783, + 0x83BF, 0xC784, 0x83C0, 0xDDD2, 0x83C1, 0xDDBC, 0x83C2, 0xC785, + 0x83C3, 0xC786, 0x83C4, 0xC787, 0x83C5, 0xDDD1, 0x83C6, 0xC788, + 0x83C7, 0xB9BD, 0x83C8, 0xC789, 0x83C9, 0xC78A, 0x83CA, 0xBED5, + 0x83CB, 0xC78B, 0x83CC, 0xBEFA, 0x83CD, 0xC78C, 0x83CE, 0xC78D, + 0x83CF, 0xBACA, 0x83D0, 0xC78E, 0x83D1, 0xC78F, 0x83D2, 0xC790, + 0x83D3, 0xC791, 0x83D4, 0xDDCA, 0x83D5, 0xC792, 0x83D6, 0xDDC5, + 0x83D7, 0xC793, 0x83D8, 0xDDBF, 0x83D9, 0xC794, 0x83DA, 0xC795, + 0x83DB, 0xC796, 0x83DC, 0xB2CB, 0x83DD, 0xDDC3, 0x83DE, 0xC797, + 0x83DF, 0xDDCB, 0x83E0, 0xB2A4, 0x83E1, 0xDDD5, 0x83E2, 0xC798, + 0x83E3, 0xC799, 0x83E4, 0xC79A, 0x83E5, 0xDDBE, 0x83E6, 0xC79B, + 0x83E7, 0xC79C, 0x83E8, 0xC79D, 0x83E9, 0xC6D0, 0x83EA, 0xDDD0, + 0x83EB, 0xC79E, 0x83EC, 0xC79F, 0x83ED, 0xC7A0, 0x83EE, 0xC840, + 0x83EF, 0xC841, 0x83F0, 0xDDD4, 0x83F1, 0xC1E2, 0x83F2, 0xB7C6, + 0x83F3, 0xC842, 0x83F4, 0xC843, 0x83F5, 0xC844, 0x83F6, 0xC845, + 0x83F7, 0xC846, 0x83F8, 0xDDCE, 0x83F9, 0xDDCF, 0x83FA, 0xC847, + 0x83FB, 0xC848, 0x83FC, 0xC849, 0x83FD, 0xDDC4, 0x83FE, 0xC84A, + 0x83FF, 0xC84B, 0x8400, 0xC84C, 0x8401, 0xDDBD, 0x8402, 0xC84D, + 0x8403, 0xDDCD, 0x8404, 0xCCD1, 0x8405, 0xC84E, 0x8406, 0xDDC9, + 0x8407, 0xC84F, 0x8408, 0xC850, 0x8409, 0xC851, 0x840A, 0xC852, + 0x840B, 0xDDC2, 0x840C, 0xC3C8, 0x840D, 0xC6BC, 0x840E, 0xCEAE, + 0x840F, 0xDDCC, 0x8410, 0xC853, 0x8411, 0xDDC8, 0x8412, 0xC854, + 0x8413, 0xC855, 0x8414, 0xC856, 0x8415, 0xC857, 0x8416, 0xC858, + 0x8417, 0xC859, 0x8418, 0xDDC1, 0x8419, 0xC85A, 0x841A, 0xC85B, + 0x841B, 0xC85C, 0x841C, 0xDDC6, 0x841D, 0xC2DC, 0x841E, 0xC85D, + 0x841F, 0xC85E, 0x8420, 0xC85F, 0x8421, 0xC860, 0x8422, 0xC861, + 0x8423, 0xC862, 0x8424, 0xD3A9, 0x8425, 0xD3AA, 0x8426, 0xDDD3, + 0x8427, 0xCFF4, 0x8428, 0xC8F8, 0x8429, 0xC863, 0x842A, 0xC864, + 0x842B, 0xC865, 0x842C, 0xC866, 0x842D, 0xC867, 0x842E, 0xC868, + 0x842F, 0xC869, 0x8430, 0xC86A, 0x8431, 0xDDE6, 0x8432, 0xC86B, + 0x8433, 0xC86C, 0x8434, 0xC86D, 0x8435, 0xC86E, 0x8436, 0xC86F, + 0x8437, 0xC870, 0x8438, 0xDDC7, 0x8439, 0xC871, 0x843A, 0xC872, + 0x843B, 0xC873, 0x843C, 0xDDE0, 0x843D, 0xC2E4, 0x843E, 0xC874, + 0x843F, 0xC875, 0x8440, 0xC876, 0x8441, 0xC877, 0x8442, 0xC878, + 0x8443, 0xC879, 0x8444, 0xC87A, 0x8445, 0xC87B, 0x8446, 0xDDE1, + 0x8447, 0xC87C, 0x8448, 0xC87D, 0x8449, 0xC87E, 0x844A, 0xC880, + 0x844B, 0xC881, 0x844C, 0xC882, 0x844D, 0xC883, 0x844E, 0xC884, + 0x844F, 0xC885, 0x8450, 0xC886, 0x8451, 0xDDD7, 0x8452, 0xC887, + 0x8453, 0xC888, 0x8454, 0xC889, 0x8455, 0xC88A, 0x8456, 0xC88B, + 0x8457, 0xD6F8, 0x8458, 0xC88C, 0x8459, 0xDDD9, 0x845A, 0xDDD8, + 0x845B, 0xB8F0, 0x845C, 0xDDD6, 0x845D, 0xC88D, 0x845E, 0xC88E, + 0x845F, 0xC88F, 0x8460, 0xC890, 0x8461, 0xC6CF, 0x8462, 0xC891, + 0x8463, 0xB6AD, 0x8464, 0xC892, 0x8465, 0xC893, 0x8466, 0xC894, + 0x8467, 0xC895, 0x8468, 0xC896, 0x8469, 0xDDE2, 0x846A, 0xC897, + 0x846B, 0xBAF9, 0x846C, 0xD4E1, 0x846D, 0xDDE7, 0x846E, 0xC898, + 0x846F, 0xC899, 0x8470, 0xC89A, 0x8471, 0xB4D0, 0x8472, 0xC89B, + 0x8473, 0xDDDA, 0x8474, 0xC89C, 0x8475, 0xBFFB, 0x8476, 0xDDE3, + 0x8477, 0xC89D, 0x8478, 0xDDDF, 0x8479, 0xC89E, 0x847A, 0xDDDD, + 0x847B, 0xC89F, 0x847C, 0xC8A0, 0x847D, 0xC940, 0x847E, 0xC941, + 0x847F, 0xC942, 0x8480, 0xC943, 0x8481, 0xC944, 0x8482, 0xB5D9, + 0x8483, 0xC945, 0x8484, 0xC946, 0x8485, 0xC947, 0x8486, 0xC948, + 0x8487, 0xDDDB, 0x8488, 0xDDDC, 0x8489, 0xDDDE, 0x848A, 0xC949, + 0x848B, 0xBDAF, 0x848C, 0xDDE4, 0x848D, 0xC94A, 0x848E, 0xDDE5, + 0x848F, 0xC94B, 0x8490, 0xC94C, 0x8491, 0xC94D, 0x8492, 0xC94E, + 0x8493, 0xC94F, 0x8494, 0xC950, 0x8495, 0xC951, 0x8496, 0xC952, + 0x8497, 0xDDF5, 0x8498, 0xC953, 0x8499, 0xC3C9, 0x849A, 0xC954, + 0x849B, 0xC955, 0x849C, 0xCBE2, 0x849D, 0xC956, 0x849E, 0xC957, + 0x849F, 0xC958, 0x84A0, 0xC959, 0x84A1, 0xDDF2, 0x84A2, 0xC95A, + 0x84A3, 0xC95B, 0x84A4, 0xC95C, 0x84A5, 0xC95D, 0x84A6, 0xC95E, + 0x84A7, 0xC95F, 0x84A8, 0xC960, 0x84A9, 0xC961, 0x84AA, 0xC962, + 0x84AB, 0xC963, 0x84AC, 0xC964, 0x84AD, 0xC965, 0x84AE, 0xC966, + 0x84AF, 0xD8E1, 0x84B0, 0xC967, 0x84B1, 0xC968, 0x84B2, 0xC6D1, + 0x84B3, 0xC969, 0x84B4, 0xDDF4, 0x84B5, 0xC96A, 0x84B6, 0xC96B, + 0x84B7, 0xC96C, 0x84B8, 0xD5F4, 0x84B9, 0xDDF3, 0x84BA, 0xDDF0, + 0x84BB, 0xC96D, 0x84BC, 0xC96E, 0x84BD, 0xDDEC, 0x84BE, 0xC96F, + 0x84BF, 0xDDEF, 0x84C0, 0xC970, 0x84C1, 0xDDE8, 0x84C2, 0xC971, + 0x84C3, 0xC972, 0x84C4, 0xD0EE, 0x84C5, 0xC973, 0x84C6, 0xC974, + 0x84C7, 0xC975, 0x84C8, 0xC976, 0x84C9, 0xC8D8, 0x84CA, 0xDDEE, + 0x84CB, 0xC977, 0x84CC, 0xC978, 0x84CD, 0xDDE9, 0x84CE, 0xC979, + 0x84CF, 0xC97A, 0x84D0, 0xDDEA, 0x84D1, 0xCBF2, 0x84D2, 0xC97B, + 0x84D3, 0xDDED, 0x84D4, 0xC97C, 0x84D5, 0xC97D, 0x84D6, 0xB1CD, + 0x84D7, 0xC97E, 0x84D8, 0xC980, 0x84D9, 0xC981, 0x84DA, 0xC982, + 0x84DB, 0xC983, 0x84DC, 0xC984, 0x84DD, 0xC0B6, 0x84DE, 0xC985, + 0x84DF, 0xBCBB, 0x84E0, 0xDDF1, 0x84E1, 0xC986, 0x84E2, 0xC987, + 0x84E3, 0xDDF7, 0x84E4, 0xC988, 0x84E5, 0xDDF6, 0x84E6, 0xDDEB, + 0x84E7, 0xC989, 0x84E8, 0xC98A, 0x84E9, 0xC98B, 0x84EA, 0xC98C, + 0x84EB, 0xC98D, 0x84EC, 0xC5EE, 0x84ED, 0xC98E, 0x84EE, 0xC98F, + 0x84EF, 0xC990, 0x84F0, 0xDDFB, 0x84F1, 0xC991, 0x84F2, 0xC992, + 0x84F3, 0xC993, 0x84F4, 0xC994, 0x84F5, 0xC995, 0x84F6, 0xC996, + 0x84F7, 0xC997, 0x84F8, 0xC998, 0x84F9, 0xC999, 0x84FA, 0xC99A, + 0x84FB, 0xC99B, 0x84FC, 0xDEA4, 0x84FD, 0xC99C, 0x84FE, 0xC99D, + 0x84FF, 0xDEA3, 0x8500, 0xC99E, 0x8501, 0xC99F, 0x8502, 0xC9A0, + 0x8503, 0xCA40, 0x8504, 0xCA41, 0x8505, 0xCA42, 0x8506, 0xCA43, + 0x8507, 0xCA44, 0x8508, 0xCA45, 0x8509, 0xCA46, 0x850A, 0xCA47, + 0x850B, 0xCA48, 0x850C, 0xDDF8, 0x850D, 0xCA49, 0x850E, 0xCA4A, + 0x850F, 0xCA4B, 0x8510, 0xCA4C, 0x8511, 0xC3EF, 0x8512, 0xCA4D, + 0x8513, 0xC2FB, 0x8514, 0xCA4E, 0x8515, 0xCA4F, 0x8516, 0xCA50, + 0x8517, 0xD5E1, 0x8518, 0xCA51, 0x8519, 0xCA52, 0x851A, 0xCEB5, + 0x851B, 0xCA53, 0x851C, 0xCA54, 0x851D, 0xCA55, 0x851E, 0xCA56, + 0x851F, 0xDDFD, 0x8520, 0xCA57, 0x8521, 0xB2CC, 0x8522, 0xCA58, + 0x8523, 0xCA59, 0x8524, 0xCA5A, 0x8525, 0xCA5B, 0x8526, 0xCA5C, + 0x8527, 0xCA5D, 0x8528, 0xCA5E, 0x8529, 0xCA5F, 0x852A, 0xCA60, + 0x852B, 0xC4E8, 0x852C, 0xCADF, 0x852D, 0xCA61, 0x852E, 0xCA62, + 0x852F, 0xCA63, 0x8530, 0xCA64, 0x8531, 0xCA65, 0x8532, 0xCA66, + 0x8533, 0xCA67, 0x8534, 0xCA68, 0x8535, 0xCA69, 0x8536, 0xCA6A, + 0x8537, 0xC7BE, 0x8538, 0xDDFA, 0x8539, 0xDDFC, 0x853A, 0xDDFE, + 0x853B, 0xDEA2, 0x853C, 0xB0AA, 0x853D, 0xB1CE, 0x853E, 0xCA6B, + 0x853F, 0xCA6C, 0x8540, 0xCA6D, 0x8541, 0xCA6E, 0x8542, 0xCA6F, + 0x8543, 0xDEAC, 0x8544, 0xCA70, 0x8545, 0xCA71, 0x8546, 0xCA72, + 0x8547, 0xCA73, 0x8548, 0xDEA6, 0x8549, 0xBDB6, 0x854A, 0xC8EF, + 0x854B, 0xCA74, 0x854C, 0xCA75, 0x854D, 0xCA76, 0x854E, 0xCA77, + 0x854F, 0xCA78, 0x8550, 0xCA79, 0x8551, 0xCA7A, 0x8552, 0xCA7B, + 0x8553, 0xCA7C, 0x8554, 0xCA7D, 0x8555, 0xCA7E, 0x8556, 0xDEA1, + 0x8557, 0xCA80, 0x8558, 0xCA81, 0x8559, 0xDEA5, 0x855A, 0xCA82, + 0x855B, 0xCA83, 0x855C, 0xCA84, 0x855D, 0xCA85, 0x855E, 0xDEA9, + 0x855F, 0xCA86, 0x8560, 0xCA87, 0x8561, 0xCA88, 0x8562, 0xCA89, + 0x8563, 0xCA8A, 0x8564, 0xDEA8, 0x8565, 0xCA8B, 0x8566, 0xCA8C, + 0x8567, 0xCA8D, 0x8568, 0xDEA7, 0x8569, 0xCA8E, 0x856A, 0xCA8F, + 0x856B, 0xCA90, 0x856C, 0xCA91, 0x856D, 0xCA92, 0x856E, 0xCA93, + 0x856F, 0xCA94, 0x8570, 0xCA95, 0x8571, 0xCA96, 0x8572, 0xDEAD, + 0x8573, 0xCA97, 0x8574, 0xD4CC, 0x8575, 0xCA98, 0x8576, 0xCA99, + 0x8577, 0xCA9A, 0x8578, 0xCA9B, 0x8579, 0xDEB3, 0x857A, 0xDEAA, + 0x857B, 0xDEAE, 0x857C, 0xCA9C, 0x857D, 0xCA9D, 0x857E, 0xC0D9, + 0x857F, 0xCA9E, 0x8580, 0xCA9F, 0x8581, 0xCAA0, 0x8582, 0xCB40, + 0x8583, 0xCB41, 0x8584, 0xB1A1, 0x8585, 0xDEB6, 0x8586, 0xCB42, + 0x8587, 0xDEB1, 0x8588, 0xCB43, 0x8589, 0xCB44, 0x858A, 0xCB45, + 0x858B, 0xCB46, 0x858C, 0xCB47, 0x858D, 0xCB48, 0x858E, 0xCB49, + 0x858F, 0xDEB2, 0x8590, 0xCB4A, 0x8591, 0xCB4B, 0x8592, 0xCB4C, + 0x8593, 0xCB4D, 0x8594, 0xCB4E, 0x8595, 0xCB4F, 0x8596, 0xCB50, + 0x8597, 0xCB51, 0x8598, 0xCB52, 0x8599, 0xCB53, 0x859A, 0xCB54, + 0x859B, 0xD1A6, 0x859C, 0xDEB5, 0x859D, 0xCB55, 0x859E, 0xCB56, + 0x859F, 0xCB57, 0x85A0, 0xCB58, 0x85A1, 0xCB59, 0x85A2, 0xCB5A, + 0x85A3, 0xCB5B, 0x85A4, 0xDEAF, 0x85A5, 0xCB5C, 0x85A6, 0xCB5D, + 0x85A7, 0xCB5E, 0x85A8, 0xDEB0, 0x85A9, 0xCB5F, 0x85AA, 0xD0BD, + 0x85AB, 0xCB60, 0x85AC, 0xCB61, 0x85AD, 0xCB62, 0x85AE, 0xDEB4, + 0x85AF, 0xCAED, 0x85B0, 0xDEB9, 0x85B1, 0xCB63, 0x85B2, 0xCB64, + 0x85B3, 0xCB65, 0x85B4, 0xCB66, 0x85B5, 0xCB67, 0x85B6, 0xCB68, + 0x85B7, 0xDEB8, 0x85B8, 0xCB69, 0x85B9, 0xDEB7, 0x85BA, 0xCB6A, + 0x85BB, 0xCB6B, 0x85BC, 0xCB6C, 0x85BD, 0xCB6D, 0x85BE, 0xCB6E, + 0x85BF, 0xCB6F, 0x85C0, 0xCB70, 0x85C1, 0xDEBB, 0x85C2, 0xCB71, + 0x85C3, 0xCB72, 0x85C4, 0xCB73, 0x85C5, 0xCB74, 0x85C6, 0xCB75, + 0x85C7, 0xCB76, 0x85C8, 0xCB77, 0x85C9, 0xBDE5, 0x85CA, 0xCB78, + 0x85CB, 0xCB79, 0x85CC, 0xCB7A, 0x85CD, 0xCB7B, 0x85CE, 0xCB7C, + 0x85CF, 0xB2D8, 0x85D0, 0xC3EA, 0x85D1, 0xCB7D, 0x85D2, 0xCB7E, + 0x85D3, 0xDEBA, 0x85D4, 0xCB80, 0x85D5, 0xC5BA, 0x85D6, 0xCB81, + 0x85D7, 0xCB82, 0x85D8, 0xCB83, 0x85D9, 0xCB84, 0x85DA, 0xCB85, + 0x85DB, 0xCB86, 0x85DC, 0xDEBC, 0x85DD, 0xCB87, 0x85DE, 0xCB88, + 0x85DF, 0xCB89, 0x85E0, 0xCB8A, 0x85E1, 0xCB8B, 0x85E2, 0xCB8C, + 0x85E3, 0xCB8D, 0x85E4, 0xCCD9, 0x85E5, 0xCB8E, 0x85E6, 0xCB8F, + 0x85E7, 0xCB90, 0x85E8, 0xCB91, 0x85E9, 0xB7AA, 0x85EA, 0xCB92, + 0x85EB, 0xCB93, 0x85EC, 0xCB94, 0x85ED, 0xCB95, 0x85EE, 0xCB96, + 0x85EF, 0xCB97, 0x85F0, 0xCB98, 0x85F1, 0xCB99, 0x85F2, 0xCB9A, + 0x85F3, 0xCB9B, 0x85F4, 0xCB9C, 0x85F5, 0xCB9D, 0x85F6, 0xCB9E, + 0x85F7, 0xCB9F, 0x85F8, 0xCBA0, 0x85F9, 0xCC40, 0x85FA, 0xCC41, + 0x85FB, 0xD4E5, 0x85FC, 0xCC42, 0x85FD, 0xCC43, 0x85FE, 0xCC44, + 0x85FF, 0xDEBD, 0x8600, 0xCC45, 0x8601, 0xCC46, 0x8602, 0xCC47, + 0x8603, 0xCC48, 0x8604, 0xCC49, 0x8605, 0xDEBF, 0x8606, 0xCC4A, + 0x8607, 0xCC4B, 0x8608, 0xCC4C, 0x8609, 0xCC4D, 0x860A, 0xCC4E, + 0x860B, 0xCC4F, 0x860C, 0xCC50, 0x860D, 0xCC51, 0x860E, 0xCC52, + 0x860F, 0xCC53, 0x8610, 0xCC54, 0x8611, 0xC4A2, 0x8612, 0xCC55, + 0x8613, 0xCC56, 0x8614, 0xCC57, 0x8615, 0xCC58, 0x8616, 0xDEC1, + 0x8617, 0xCC59, 0x8618, 0xCC5A, 0x8619, 0xCC5B, 0x861A, 0xCC5C, + 0x861B, 0xCC5D, 0x861C, 0xCC5E, 0x861D, 0xCC5F, 0x861E, 0xCC60, + 0x861F, 0xCC61, 0x8620, 0xCC62, 0x8621, 0xCC63, 0x8622, 0xCC64, + 0x8623, 0xCC65, 0x8624, 0xCC66, 0x8625, 0xCC67, 0x8626, 0xCC68, + 0x8627, 0xDEBE, 0x8628, 0xCC69, 0x8629, 0xDEC0, 0x862A, 0xCC6A, + 0x862B, 0xCC6B, 0x862C, 0xCC6C, 0x862D, 0xCC6D, 0x862E, 0xCC6E, + 0x862F, 0xCC6F, 0x8630, 0xCC70, 0x8631, 0xCC71, 0x8632, 0xCC72, + 0x8633, 0xCC73, 0x8634, 0xCC74, 0x8635, 0xCC75, 0x8636, 0xCC76, + 0x8637, 0xCC77, 0x8638, 0xD5BA, 0x8639, 0xCC78, 0x863A, 0xCC79, + 0x863B, 0xCC7A, 0x863C, 0xDEC2, 0x863D, 0xCC7B, 0x863E, 0xCC7C, + 0x863F, 0xCC7D, 0x8640, 0xCC7E, 0x8641, 0xCC80, 0x8642, 0xCC81, + 0x8643, 0xCC82, 0x8644, 0xCC83, 0x8645, 0xCC84, 0x8646, 0xCC85, + 0x8647, 0xCC86, 0x8648, 0xCC87, 0x8649, 0xCC88, 0x864A, 0xCC89, + 0x864B, 0xCC8A, 0x864C, 0xCC8B, 0x864D, 0xF2AE, 0x864E, 0xBBA2, + 0x864F, 0xC2B2, 0x8650, 0xC5B0, 0x8651, 0xC2C7, 0x8652, 0xCC8C, + 0x8653, 0xCC8D, 0x8654, 0xF2AF, 0x8655, 0xCC8E, 0x8656, 0xCC8F, + 0x8657, 0xCC90, 0x8658, 0xCC91, 0x8659, 0xCC92, 0x865A, 0xD0E9, + 0x865B, 0xCC93, 0x865C, 0xCC94, 0x865D, 0xCC95, 0x865E, 0xD3DD, + 0x865F, 0xCC96, 0x8660, 0xCC97, 0x8661, 0xCC98, 0x8662, 0xEBBD, + 0x8663, 0xCC99, 0x8664, 0xCC9A, 0x8665, 0xCC9B, 0x8666, 0xCC9C, + 0x8667, 0xCC9D, 0x8668, 0xCC9E, 0x8669, 0xCC9F, 0x866A, 0xCCA0, + 0x866B, 0xB3E6, 0x866C, 0xF2B0, 0x866D, 0xCD40, 0x866E, 0xF2B1, + 0x866F, 0xCD41, 0x8670, 0xCD42, 0x8671, 0xCAAD, 0x8672, 0xCD43, + 0x8673, 0xCD44, 0x8674, 0xCD45, 0x8675, 0xCD46, 0x8676, 0xCD47, + 0x8677, 0xCD48, 0x8678, 0xCD49, 0x8679, 0xBAE7, 0x867A, 0xF2B3, + 0x867B, 0xF2B5, 0x867C, 0xF2B4, 0x867D, 0xCBE4, 0x867E, 0xCFBA, + 0x867F, 0xF2B2, 0x8680, 0xCAB4, 0x8681, 0xD2CF, 0x8682, 0xC2EC, + 0x8683, 0xCD4A, 0x8684, 0xCD4B, 0x8685, 0xCD4C, 0x8686, 0xCD4D, + 0x8687, 0xCD4E, 0x8688, 0xCD4F, 0x8689, 0xCD50, 0x868A, 0xCEC3, + 0x868B, 0xF2B8, 0x868C, 0xB0F6, 0x868D, 0xF2B7, 0x868E, 0xCD51, + 0x868F, 0xCD52, 0x8690, 0xCD53, 0x8691, 0xCD54, 0x8692, 0xCD55, + 0x8693, 0xF2BE, 0x8694, 0xCD56, 0x8695, 0xB2CF, 0x8696, 0xCD57, + 0x8697, 0xCD58, 0x8698, 0xCD59, 0x8699, 0xCD5A, 0x869A, 0xCD5B, + 0x869B, 0xCD5C, 0x869C, 0xD1C1, 0x869D, 0xF2BA, 0x869E, 0xCD5D, + 0x869F, 0xCD5E, 0x86A0, 0xCD5F, 0x86A1, 0xCD60, 0x86A2, 0xCD61, + 0x86A3, 0xF2BC, 0x86A4, 0xD4E9, 0x86A5, 0xCD62, 0x86A6, 0xCD63, + 0x86A7, 0xF2BB, 0x86A8, 0xF2B6, 0x86A9, 0xF2BF, 0x86AA, 0xF2BD, + 0x86AB, 0xCD64, 0x86AC, 0xF2B9, 0x86AD, 0xCD65, 0x86AE, 0xCD66, + 0x86AF, 0xF2C7, 0x86B0, 0xF2C4, 0x86B1, 0xF2C6, 0x86B2, 0xCD67, + 0x86B3, 0xCD68, 0x86B4, 0xF2CA, 0x86B5, 0xF2C2, 0x86B6, 0xF2C0, + 0x86B7, 0xCD69, 0x86B8, 0xCD6A, 0x86B9, 0xCD6B, 0x86BA, 0xF2C5, + 0x86BB, 0xCD6C, 0x86BC, 0xCD6D, 0x86BD, 0xCD6E, 0x86BE, 0xCD6F, + 0x86BF, 0xCD70, 0x86C0, 0xD6FB, 0x86C1, 0xCD71, 0x86C2, 0xCD72, + 0x86C3, 0xCD73, 0x86C4, 0xF2C1, 0x86C5, 0xCD74, 0x86C6, 0xC7F9, + 0x86C7, 0xC9DF, 0x86C8, 0xCD75, 0x86C9, 0xF2C8, 0x86CA, 0xB9C6, + 0x86CB, 0xB5B0, 0x86CC, 0xCD76, 0x86CD, 0xCD77, 0x86CE, 0xF2C3, + 0x86CF, 0xF2C9, 0x86D0, 0xF2D0, 0x86D1, 0xF2D6, 0x86D2, 0xCD78, + 0x86D3, 0xCD79, 0x86D4, 0xBBD7, 0x86D5, 0xCD7A, 0x86D6, 0xCD7B, + 0x86D7, 0xCD7C, 0x86D8, 0xF2D5, 0x86D9, 0xCDDC, 0x86DA, 0xCD7D, + 0x86DB, 0xD6EB, 0x86DC, 0xCD7E, 0x86DD, 0xCD80, 0x86DE, 0xF2D2, + 0x86DF, 0xF2D4, 0x86E0, 0xCD81, 0x86E1, 0xCD82, 0x86E2, 0xCD83, + 0x86E3, 0xCD84, 0x86E4, 0xB8F2, 0x86E5, 0xCD85, 0x86E6, 0xCD86, + 0x86E7, 0xCD87, 0x86E8, 0xCD88, 0x86E9, 0xF2CB, 0x86EA, 0xCD89, + 0x86EB, 0xCD8A, 0x86EC, 0xCD8B, 0x86ED, 0xF2CE, 0x86EE, 0xC2F9, + 0x86EF, 0xCD8C, 0x86F0, 0xD5DD, 0x86F1, 0xF2CC, 0x86F2, 0xF2CD, + 0x86F3, 0xF2CF, 0x86F4, 0xF2D3, 0x86F5, 0xCD8D, 0x86F6, 0xCD8E, + 0x86F7, 0xCD8F, 0x86F8, 0xF2D9, 0x86F9, 0xD3BC, 0x86FA, 0xCD90, + 0x86FB, 0xCD91, 0x86FC, 0xCD92, 0x86FD, 0xCD93, 0x86FE, 0xB6EA, + 0x86FF, 0xCD94, 0x8700, 0xCAF1, 0x8701, 0xCD95, 0x8702, 0xB7E4, + 0x8703, 0xF2D7, 0x8704, 0xCD96, 0x8705, 0xCD97, 0x8706, 0xCD98, + 0x8707, 0xF2D8, 0x8708, 0xF2DA, 0x8709, 0xF2DD, 0x870A, 0xF2DB, + 0x870B, 0xCD99, 0x870C, 0xCD9A, 0x870D, 0xF2DC, 0x870E, 0xCD9B, + 0x870F, 0xCD9C, 0x8710, 0xCD9D, 0x8711, 0xCD9E, 0x8712, 0xD1D1, + 0x8713, 0xF2D1, 0x8714, 0xCD9F, 0x8715, 0xCDC9, 0x8716, 0xCDA0, + 0x8717, 0xCECF, 0x8718, 0xD6A9, 0x8719, 0xCE40, 0x871A, 0xF2E3, + 0x871B, 0xCE41, 0x871C, 0xC3DB, 0x871D, 0xCE42, 0x871E, 0xF2E0, + 0x871F, 0xCE43, 0x8720, 0xCE44, 0x8721, 0xC0AF, 0x8722, 0xF2EC, + 0x8723, 0xF2DE, 0x8724, 0xCE45, 0x8725, 0xF2E1, 0x8726, 0xCE46, + 0x8727, 0xCE47, 0x8728, 0xCE48, 0x8729, 0xF2E8, 0x872A, 0xCE49, + 0x872B, 0xCE4A, 0x872C, 0xCE4B, 0x872D, 0xCE4C, 0x872E, 0xF2E2, + 0x872F, 0xCE4D, 0x8730, 0xCE4E, 0x8731, 0xF2E7, 0x8732, 0xCE4F, + 0x8733, 0xCE50, 0x8734, 0xF2E6, 0x8735, 0xCE51, 0x8736, 0xCE52, + 0x8737, 0xF2E9, 0x8738, 0xCE53, 0x8739, 0xCE54, 0x873A, 0xCE55, + 0x873B, 0xF2DF, 0x873C, 0xCE56, 0x873D, 0xCE57, 0x873E, 0xF2E4, + 0x873F, 0xF2EA, 0x8740, 0xCE58, 0x8741, 0xCE59, 0x8742, 0xCE5A, + 0x8743, 0xCE5B, 0x8744, 0xCE5C, 0x8745, 0xCE5D, 0x8746, 0xCE5E, + 0x8747, 0xD3AC, 0x8748, 0xF2E5, 0x8749, 0xB2F5, 0x874A, 0xCE5F, + 0x874B, 0xCE60, 0x874C, 0xF2F2, 0x874D, 0xCE61, 0x874E, 0xD0AB, + 0x874F, 0xCE62, 0x8750, 0xCE63, 0x8751, 0xCE64, 0x8752, 0xCE65, + 0x8753, 0xF2F5, 0x8754, 0xCE66, 0x8755, 0xCE67, 0x8756, 0xCE68, + 0x8757, 0xBBC8, 0x8758, 0xCE69, 0x8759, 0xF2F9, 0x875A, 0xCE6A, + 0x875B, 0xCE6B, 0x875C, 0xCE6C, 0x875D, 0xCE6D, 0x875E, 0xCE6E, + 0x875F, 0xCE6F, 0x8760, 0xF2F0, 0x8761, 0xCE70, 0x8762, 0xCE71, + 0x8763, 0xF2F6, 0x8764, 0xF2F8, 0x8765, 0xF2FA, 0x8766, 0xCE72, + 0x8767, 0xCE73, 0x8768, 0xCE74, 0x8769, 0xCE75, 0x876A, 0xCE76, + 0x876B, 0xCE77, 0x876C, 0xCE78, 0x876D, 0xCE79, 0x876E, 0xF2F3, + 0x876F, 0xCE7A, 0x8770, 0xF2F1, 0x8771, 0xCE7B, 0x8772, 0xCE7C, + 0x8773, 0xCE7D, 0x8774, 0xBAFB, 0x8775, 0xCE7E, 0x8776, 0xB5FB, + 0x8777, 0xCE80, 0x8778, 0xCE81, 0x8779, 0xCE82, 0x877A, 0xCE83, + 0x877B, 0xF2EF, 0x877C, 0xF2F7, 0x877D, 0xF2ED, 0x877E, 0xF2EE, + 0x877F, 0xCE84, 0x8780, 0xCE85, 0x8781, 0xCE86, 0x8782, 0xF2EB, + 0x8783, 0xF3A6, 0x8784, 0xCE87, 0x8785, 0xF3A3, 0x8786, 0xCE88, + 0x8787, 0xCE89, 0x8788, 0xF3A2, 0x8789, 0xCE8A, 0x878A, 0xCE8B, + 0x878B, 0xF2F4, 0x878C, 0xCE8C, 0x878D, 0xC8DA, 0x878E, 0xCE8D, + 0x878F, 0xCE8E, 0x8790, 0xCE8F, 0x8791, 0xCE90, 0x8792, 0xCE91, + 0x8793, 0xF2FB, 0x8794, 0xCE92, 0x8795, 0xCE93, 0x8796, 0xCE94, + 0x8797, 0xF3A5, 0x8798, 0xCE95, 0x8799, 0xCE96, 0x879A, 0xCE97, + 0x879B, 0xCE98, 0x879C, 0xCE99, 0x879D, 0xCE9A, 0x879E, 0xCE9B, + 0x879F, 0xC3F8, 0x87A0, 0xCE9C, 0x87A1, 0xCE9D, 0x87A2, 0xCE9E, + 0x87A3, 0xCE9F, 0x87A4, 0xCEA0, 0x87A5, 0xCF40, 0x87A6, 0xCF41, + 0x87A7, 0xCF42, 0x87A8, 0xF2FD, 0x87A9, 0xCF43, 0x87AA, 0xCF44, + 0x87AB, 0xF3A7, 0x87AC, 0xF3A9, 0x87AD, 0xF3A4, 0x87AE, 0xCF45, + 0x87AF, 0xF2FC, 0x87B0, 0xCF46, 0x87B1, 0xCF47, 0x87B2, 0xCF48, + 0x87B3, 0xF3AB, 0x87B4, 0xCF49, 0x87B5, 0xF3AA, 0x87B6, 0xCF4A, + 0x87B7, 0xCF4B, 0x87B8, 0xCF4C, 0x87B9, 0xCF4D, 0x87BA, 0xC2DD, + 0x87BB, 0xCF4E, 0x87BC, 0xCF4F, 0x87BD, 0xF3AE, 0x87BE, 0xCF50, + 0x87BF, 0xCF51, 0x87C0, 0xF3B0, 0x87C1, 0xCF52, 0x87C2, 0xCF53, + 0x87C3, 0xCF54, 0x87C4, 0xCF55, 0x87C5, 0xCF56, 0x87C6, 0xF3A1, + 0x87C7, 0xCF57, 0x87C8, 0xCF58, 0x87C9, 0xCF59, 0x87CA, 0xF3B1, + 0x87CB, 0xF3AC, 0x87CC, 0xCF5A, 0x87CD, 0xCF5B, 0x87CE, 0xCF5C, + 0x87CF, 0xCF5D, 0x87D0, 0xCF5E, 0x87D1, 0xF3AF, 0x87D2, 0xF2FE, + 0x87D3, 0xF3AD, 0x87D4, 0xCF5F, 0x87D5, 0xCF60, 0x87D6, 0xCF61, + 0x87D7, 0xCF62, 0x87D8, 0xCF63, 0x87D9, 0xCF64, 0x87DA, 0xCF65, + 0x87DB, 0xF3B2, 0x87DC, 0xCF66, 0x87DD, 0xCF67, 0x87DE, 0xCF68, + 0x87DF, 0xCF69, 0x87E0, 0xF3B4, 0x87E1, 0xCF6A, 0x87E2, 0xCF6B, + 0x87E3, 0xCF6C, 0x87E4, 0xCF6D, 0x87E5, 0xF3A8, 0x87E6, 0xCF6E, + 0x87E7, 0xCF6F, 0x87E8, 0xCF70, 0x87E9, 0xCF71, 0x87EA, 0xF3B3, + 0x87EB, 0xCF72, 0x87EC, 0xCF73, 0x87ED, 0xCF74, 0x87EE, 0xF3B5, + 0x87EF, 0xCF75, 0x87F0, 0xCF76, 0x87F1, 0xCF77, 0x87F2, 0xCF78, + 0x87F3, 0xCF79, 0x87F4, 0xCF7A, 0x87F5, 0xCF7B, 0x87F6, 0xCF7C, + 0x87F7, 0xCF7D, 0x87F8, 0xCF7E, 0x87F9, 0xD0B7, 0x87FA, 0xCF80, + 0x87FB, 0xCF81, 0x87FC, 0xCF82, 0x87FD, 0xCF83, 0x87FE, 0xF3B8, + 0x87FF, 0xCF84, 0x8800, 0xCF85, 0x8801, 0xCF86, 0x8802, 0xCF87, + 0x8803, 0xD9F9, 0x8804, 0xCF88, 0x8805, 0xCF89, 0x8806, 0xCF8A, + 0x8807, 0xCF8B, 0x8808, 0xCF8C, 0x8809, 0xCF8D, 0x880A, 0xF3B9, + 0x880B, 0xCF8E, 0x880C, 0xCF8F, 0x880D, 0xCF90, 0x880E, 0xCF91, + 0x880F, 0xCF92, 0x8810, 0xCF93, 0x8811, 0xCF94, 0x8812, 0xCF95, + 0x8813, 0xF3B7, 0x8814, 0xCF96, 0x8815, 0xC8E4, 0x8816, 0xF3B6, + 0x8817, 0xCF97, 0x8818, 0xCF98, 0x8819, 0xCF99, 0x881A, 0xCF9A, + 0x881B, 0xF3BA, 0x881C, 0xCF9B, 0x881D, 0xCF9C, 0x881E, 0xCF9D, + 0x881F, 0xCF9E, 0x8820, 0xCF9F, 0x8821, 0xF3BB, 0x8822, 0xB4C0, + 0x8823, 0xCFA0, 0x8824, 0xD040, 0x8825, 0xD041, 0x8826, 0xD042, + 0x8827, 0xD043, 0x8828, 0xD044, 0x8829, 0xD045, 0x882A, 0xD046, + 0x882B, 0xD047, 0x882C, 0xD048, 0x882D, 0xD049, 0x882E, 0xD04A, + 0x882F, 0xD04B, 0x8830, 0xD04C, 0x8831, 0xD04D, 0x8832, 0xEEC3, + 0x8833, 0xD04E, 0x8834, 0xD04F, 0x8835, 0xD050, 0x8836, 0xD051, + 0x8837, 0xD052, 0x8838, 0xD053, 0x8839, 0xF3BC, 0x883A, 0xD054, + 0x883B, 0xD055, 0x883C, 0xF3BD, 0x883D, 0xD056, 0x883E, 0xD057, + 0x883F, 0xD058, 0x8840, 0xD1AA, 0x8841, 0xD059, 0x8842, 0xD05A, + 0x8843, 0xD05B, 0x8844, 0xF4AC, 0x8845, 0xD0C6, 0x8846, 0xD05C, + 0x8847, 0xD05D, 0x8848, 0xD05E, 0x8849, 0xD05F, 0x884A, 0xD060, + 0x884B, 0xD061, 0x884C, 0xD0D0, 0x884D, 0xD1DC, 0x884E, 0xD062, + 0x884F, 0xD063, 0x8850, 0xD064, 0x8851, 0xD065, 0x8852, 0xD066, + 0x8853, 0xD067, 0x8854, 0xCFCE, 0x8855, 0xD068, 0x8856, 0xD069, + 0x8857, 0xBDD6, 0x8858, 0xD06A, 0x8859, 0xD1C3, 0x885A, 0xD06B, + 0x885B, 0xD06C, 0x885C, 0xD06D, 0x885D, 0xD06E, 0x885E, 0xD06F, + 0x885F, 0xD070, 0x8860, 0xD071, 0x8861, 0xBAE2, 0x8862, 0xE1E9, + 0x8863, 0xD2C2, 0x8864, 0xF1C2, 0x8865, 0xB2B9, 0x8866, 0xD072, + 0x8867, 0xD073, 0x8868, 0xB1ED, 0x8869, 0xF1C3, 0x886A, 0xD074, + 0x886B, 0xC9C0, 0x886C, 0xB3C4, 0x886D, 0xD075, 0x886E, 0xD9F2, + 0x886F, 0xD076, 0x8870, 0xCBA5, 0x8871, 0xD077, 0x8872, 0xF1C4, + 0x8873, 0xD078, 0x8874, 0xD079, 0x8875, 0xD07A, 0x8876, 0xD07B, + 0x8877, 0xD6D4, 0x8878, 0xD07C, 0x8879, 0xD07D, 0x887A, 0xD07E, + 0x887B, 0xD080, 0x887C, 0xD081, 0x887D, 0xF1C5, 0x887E, 0xF4C0, + 0x887F, 0xF1C6, 0x8880, 0xD082, 0x8881, 0xD4AC, 0x8882, 0xF1C7, + 0x8883, 0xD083, 0x8884, 0xB0C0, 0x8885, 0xF4C1, 0x8886, 0xD084, + 0x8887, 0xD085, 0x8888, 0xF4C2, 0x8889, 0xD086, 0x888A, 0xD087, + 0x888B, 0xB4FC, 0x888C, 0xD088, 0x888D, 0xC5DB, 0x888E, 0xD089, + 0x888F, 0xD08A, 0x8890, 0xD08B, 0x8891, 0xD08C, 0x8892, 0xCCBB, + 0x8893, 0xD08D, 0x8894, 0xD08E, 0x8895, 0xD08F, 0x8896, 0xD0E4, + 0x8897, 0xD090, 0x8898, 0xD091, 0x8899, 0xD092, 0x889A, 0xD093, + 0x889B, 0xD094, 0x889C, 0xCDE0, 0x889D, 0xD095, 0x889E, 0xD096, + 0x889F, 0xD097, 0x88A0, 0xD098, 0x88A1, 0xD099, 0x88A2, 0xF1C8, + 0x88A3, 0xD09A, 0x88A4, 0xD9F3, 0x88A5, 0xD09B, 0x88A6, 0xD09C, + 0x88A7, 0xD09D, 0x88A8, 0xD09E, 0x88A9, 0xD09F, 0x88AA, 0xD0A0, + 0x88AB, 0xB1BB, 0x88AC, 0xD140, 0x88AD, 0xCFAE, 0x88AE, 0xD141, + 0x88AF, 0xD142, 0x88B0, 0xD143, 0x88B1, 0xB8A4, 0x88B2, 0xD144, + 0x88B3, 0xD145, 0x88B4, 0xD146, 0x88B5, 0xD147, 0x88B6, 0xD148, + 0x88B7, 0xF1CA, 0x88B8, 0xD149, 0x88B9, 0xD14A, 0x88BA, 0xD14B, + 0x88BB, 0xD14C, 0x88BC, 0xF1CB, 0x88BD, 0xD14D, 0x88BE, 0xD14E, + 0x88BF, 0xD14F, 0x88C0, 0xD150, 0x88C1, 0xB2C3, 0x88C2, 0xC1D1, + 0x88C3, 0xD151, 0x88C4, 0xD152, 0x88C5, 0xD7B0, 0x88C6, 0xF1C9, + 0x88C7, 0xD153, 0x88C8, 0xD154, 0x88C9, 0xF1CC, 0x88CA, 0xD155, + 0x88CB, 0xD156, 0x88CC, 0xD157, 0x88CD, 0xD158, 0x88CE, 0xF1CE, + 0x88CF, 0xD159, 0x88D0, 0xD15A, 0x88D1, 0xD15B, 0x88D2, 0xD9F6, + 0x88D3, 0xD15C, 0x88D4, 0xD2E1, 0x88D5, 0xD4A3, 0x88D6, 0xD15D, + 0x88D7, 0xD15E, 0x88D8, 0xF4C3, 0x88D9, 0xC8B9, 0x88DA, 0xD15F, + 0x88DB, 0xD160, 0x88DC, 0xD161, 0x88DD, 0xD162, 0x88DE, 0xD163, + 0x88DF, 0xF4C4, 0x88E0, 0xD164, 0x88E1, 0xD165, 0x88E2, 0xF1CD, + 0x88E3, 0xF1CF, 0x88E4, 0xBFE3, 0x88E5, 0xF1D0, 0x88E6, 0xD166, + 0x88E7, 0xD167, 0x88E8, 0xF1D4, 0x88E9, 0xD168, 0x88EA, 0xD169, + 0x88EB, 0xD16A, 0x88EC, 0xD16B, 0x88ED, 0xD16C, 0x88EE, 0xD16D, + 0x88EF, 0xD16E, 0x88F0, 0xF1D6, 0x88F1, 0xF1D1, 0x88F2, 0xD16F, + 0x88F3, 0xC9D1, 0x88F4, 0xC5E1, 0x88F5, 0xD170, 0x88F6, 0xD171, + 0x88F7, 0xD172, 0x88F8, 0xC2E3, 0x88F9, 0xB9FC, 0x88FA, 0xD173, + 0x88FB, 0xD174, 0x88FC, 0xF1D3, 0x88FD, 0xD175, 0x88FE, 0xF1D5, + 0x88FF, 0xD176, 0x8900, 0xD177, 0x8901, 0xD178, 0x8902, 0xB9D3, + 0x8903, 0xD179, 0x8904, 0xD17A, 0x8905, 0xD17B, 0x8906, 0xD17C, + 0x8907, 0xD17D, 0x8908, 0xD17E, 0x8909, 0xD180, 0x890A, 0xF1DB, + 0x890B, 0xD181, 0x890C, 0xD182, 0x890D, 0xD183, 0x890E, 0xD184, + 0x890F, 0xD185, 0x8910, 0xBAD6, 0x8911, 0xD186, 0x8912, 0xB0FD, + 0x8913, 0xF1D9, 0x8914, 0xD187, 0x8915, 0xD188, 0x8916, 0xD189, + 0x8917, 0xD18A, 0x8918, 0xD18B, 0x8919, 0xF1D8, 0x891A, 0xF1D2, + 0x891B, 0xF1DA, 0x891C, 0xD18C, 0x891D, 0xD18D, 0x891E, 0xD18E, + 0x891F, 0xD18F, 0x8920, 0xD190, 0x8921, 0xF1D7, 0x8922, 0xD191, + 0x8923, 0xD192, 0x8924, 0xD193, 0x8925, 0xC8EC, 0x8926, 0xD194, + 0x8927, 0xD195, 0x8928, 0xD196, 0x8929, 0xD197, 0x892A, 0xCDCA, + 0x892B, 0xF1DD, 0x892C, 0xD198, 0x892D, 0xD199, 0x892E, 0xD19A, + 0x892F, 0xD19B, 0x8930, 0xE5BD, 0x8931, 0xD19C, 0x8932, 0xD19D, + 0x8933, 0xD19E, 0x8934, 0xF1DC, 0x8935, 0xD19F, 0x8936, 0xF1DE, + 0x8937, 0xD1A0, 0x8938, 0xD240, 0x8939, 0xD241, 0x893A, 0xD242, + 0x893B, 0xD243, 0x893C, 0xD244, 0x893D, 0xD245, 0x893E, 0xD246, + 0x893F, 0xD247, 0x8940, 0xD248, 0x8941, 0xF1DF, 0x8942, 0xD249, + 0x8943, 0xD24A, 0x8944, 0xCFE5, 0x8945, 0xD24B, 0x8946, 0xD24C, + 0x8947, 0xD24D, 0x8948, 0xD24E, 0x8949, 0xD24F, 0x894A, 0xD250, + 0x894B, 0xD251, 0x894C, 0xD252, 0x894D, 0xD253, 0x894E, 0xD254, + 0x894F, 0xD255, 0x8950, 0xD256, 0x8951, 0xD257, 0x8952, 0xD258, + 0x8953, 0xD259, 0x8954, 0xD25A, 0x8955, 0xD25B, 0x8956, 0xD25C, + 0x8957, 0xD25D, 0x8958, 0xD25E, 0x8959, 0xD25F, 0x895A, 0xD260, + 0x895B, 0xD261, 0x895C, 0xD262, 0x895D, 0xD263, 0x895E, 0xF4C5, + 0x895F, 0xBDF3, 0x8960, 0xD264, 0x8961, 0xD265, 0x8962, 0xD266, + 0x8963, 0xD267, 0x8964, 0xD268, 0x8965, 0xD269, 0x8966, 0xF1E0, + 0x8967, 0xD26A, 0x8968, 0xD26B, 0x8969, 0xD26C, 0x896A, 0xD26D, + 0x896B, 0xD26E, 0x896C, 0xD26F, 0x896D, 0xD270, 0x896E, 0xD271, + 0x896F, 0xD272, 0x8970, 0xD273, 0x8971, 0xD274, 0x8972, 0xD275, + 0x8973, 0xD276, 0x8974, 0xD277, 0x8975, 0xD278, 0x8976, 0xD279, + 0x8977, 0xD27A, 0x8978, 0xD27B, 0x8979, 0xD27C, 0x897A, 0xD27D, + 0x897B, 0xF1E1, 0x897C, 0xD27E, 0x897D, 0xD280, 0x897E, 0xD281, + 0x897F, 0xCEF7, 0x8980, 0xD282, 0x8981, 0xD2AA, 0x8982, 0xD283, + 0x8983, 0xF1FB, 0x8984, 0xD284, 0x8985, 0xD285, 0x8986, 0xB8B2, + 0x8987, 0xD286, 0x8988, 0xD287, 0x8989, 0xD288, 0x898A, 0xD289, + 0x898B, 0xD28A, 0x898C, 0xD28B, 0x898D, 0xD28C, 0x898E, 0xD28D, + 0x898F, 0xD28E, 0x8990, 0xD28F, 0x8991, 0xD290, 0x8992, 0xD291, + 0x8993, 0xD292, 0x8994, 0xD293, 0x8995, 0xD294, 0x8996, 0xD295, + 0x8997, 0xD296, 0x8998, 0xD297, 0x8999, 0xD298, 0x899A, 0xD299, + 0x899B, 0xD29A, 0x899C, 0xD29B, 0x899D, 0xD29C, 0x899E, 0xD29D, + 0x899F, 0xD29E, 0x89A0, 0xD29F, 0x89A1, 0xD2A0, 0x89A2, 0xD340, + 0x89A3, 0xD341, 0x89A4, 0xD342, 0x89A5, 0xD343, 0x89A6, 0xD344, + 0x89A7, 0xD345, 0x89A8, 0xD346, 0x89A9, 0xD347, 0x89AA, 0xD348, + 0x89AB, 0xD349, 0x89AC, 0xD34A, 0x89AD, 0xD34B, 0x89AE, 0xD34C, + 0x89AF, 0xD34D, 0x89B0, 0xD34E, 0x89B1, 0xD34F, 0x89B2, 0xD350, + 0x89B3, 0xD351, 0x89B4, 0xD352, 0x89B5, 0xD353, 0x89B6, 0xD354, + 0x89B7, 0xD355, 0x89B8, 0xD356, 0x89B9, 0xD357, 0x89BA, 0xD358, + 0x89BB, 0xD359, 0x89BC, 0xD35A, 0x89BD, 0xD35B, 0x89BE, 0xD35C, + 0x89BF, 0xD35D, 0x89C0, 0xD35E, 0x89C1, 0xBCFB, 0x89C2, 0xB9DB, + 0x89C3, 0xD35F, 0x89C4, 0xB9E6, 0x89C5, 0xC3D9, 0x89C6, 0xCAD3, + 0x89C7, 0xEAE8, 0x89C8, 0xC0C0, 0x89C9, 0xBEF5, 0x89CA, 0xEAE9, + 0x89CB, 0xEAEA, 0x89CC, 0xEAEB, 0x89CD, 0xD360, 0x89CE, 0xEAEC, + 0x89CF, 0xEAED, 0x89D0, 0xEAEE, 0x89D1, 0xEAEF, 0x89D2, 0xBDC7, + 0x89D3, 0xD361, 0x89D4, 0xD362, 0x89D5, 0xD363, 0x89D6, 0xF5FB, + 0x89D7, 0xD364, 0x89D8, 0xD365, 0x89D9, 0xD366, 0x89DA, 0xF5FD, + 0x89DB, 0xD367, 0x89DC, 0xF5FE, 0x89DD, 0xD368, 0x89DE, 0xF5FC, + 0x89DF, 0xD369, 0x89E0, 0xD36A, 0x89E1, 0xD36B, 0x89E2, 0xD36C, + 0x89E3, 0xBDE2, 0x89E4, 0xD36D, 0x89E5, 0xF6A1, 0x89E6, 0xB4A5, + 0x89E7, 0xD36E, 0x89E8, 0xD36F, 0x89E9, 0xD370, 0x89EA, 0xD371, + 0x89EB, 0xF6A2, 0x89EC, 0xD372, 0x89ED, 0xD373, 0x89EE, 0xD374, + 0x89EF, 0xF6A3, 0x89F0, 0xD375, 0x89F1, 0xD376, 0x89F2, 0xD377, + 0x89F3, 0xECB2, 0x89F4, 0xD378, 0x89F5, 0xD379, 0x89F6, 0xD37A, + 0x89F7, 0xD37B, 0x89F8, 0xD37C, 0x89F9, 0xD37D, 0x89FA, 0xD37E, + 0x89FB, 0xD380, 0x89FC, 0xD381, 0x89FD, 0xD382, 0x89FE, 0xD383, + 0x89FF, 0xD384, 0x8A00, 0xD1D4, 0x8A01, 0xD385, 0x8A02, 0xD386, + 0x8A03, 0xD387, 0x8A04, 0xD388, 0x8A05, 0xD389, 0x8A06, 0xD38A, + 0x8A07, 0xD9EA, 0x8A08, 0xD38B, 0x8A09, 0xD38C, 0x8A0A, 0xD38D, + 0x8A0B, 0xD38E, 0x8A0C, 0xD38F, 0x8A0D, 0xD390, 0x8A0E, 0xD391, + 0x8A0F, 0xD392, 0x8A10, 0xD393, 0x8A11, 0xD394, 0x8A12, 0xD395, + 0x8A13, 0xD396, 0x8A14, 0xD397, 0x8A15, 0xD398, 0x8A16, 0xD399, + 0x8A17, 0xD39A, 0x8A18, 0xD39B, 0x8A19, 0xD39C, 0x8A1A, 0xD39D, + 0x8A1B, 0xD39E, 0x8A1C, 0xD39F, 0x8A1D, 0xD3A0, 0x8A1E, 0xD440, + 0x8A1F, 0xD441, 0x8A20, 0xD442, 0x8A21, 0xD443, 0x8A22, 0xD444, + 0x8A23, 0xD445, 0x8A24, 0xD446, 0x8A25, 0xD447, 0x8A26, 0xD448, + 0x8A27, 0xD449, 0x8A28, 0xD44A, 0x8A29, 0xD44B, 0x8A2A, 0xD44C, + 0x8A2B, 0xD44D, 0x8A2C, 0xD44E, 0x8A2D, 0xD44F, 0x8A2E, 0xD450, + 0x8A2F, 0xD451, 0x8A30, 0xD452, 0x8A31, 0xD453, 0x8A32, 0xD454, + 0x8A33, 0xD455, 0x8A34, 0xD456, 0x8A35, 0xD457, 0x8A36, 0xD458, + 0x8A37, 0xD459, 0x8A38, 0xD45A, 0x8A39, 0xD45B, 0x8A3A, 0xD45C, + 0x8A3B, 0xD45D, 0x8A3C, 0xD45E, 0x8A3D, 0xD45F, 0x8A3E, 0xF6A4, + 0x8A3F, 0xD460, 0x8A40, 0xD461, 0x8A41, 0xD462, 0x8A42, 0xD463, + 0x8A43, 0xD464, 0x8A44, 0xD465, 0x8A45, 0xD466, 0x8A46, 0xD467, + 0x8A47, 0xD468, 0x8A48, 0xEEBA, 0x8A49, 0xD469, 0x8A4A, 0xD46A, + 0x8A4B, 0xD46B, 0x8A4C, 0xD46C, 0x8A4D, 0xD46D, 0x8A4E, 0xD46E, + 0x8A4F, 0xD46F, 0x8A50, 0xD470, 0x8A51, 0xD471, 0x8A52, 0xD472, + 0x8A53, 0xD473, 0x8A54, 0xD474, 0x8A55, 0xD475, 0x8A56, 0xD476, + 0x8A57, 0xD477, 0x8A58, 0xD478, 0x8A59, 0xD479, 0x8A5A, 0xD47A, + 0x8A5B, 0xD47B, 0x8A5C, 0xD47C, 0x8A5D, 0xD47D, 0x8A5E, 0xD47E, + 0x8A5F, 0xD480, 0x8A60, 0xD481, 0x8A61, 0xD482, 0x8A62, 0xD483, + 0x8A63, 0xD484, 0x8A64, 0xD485, 0x8A65, 0xD486, 0x8A66, 0xD487, + 0x8A67, 0xD488, 0x8A68, 0xD489, 0x8A69, 0xD48A, 0x8A6A, 0xD48B, + 0x8A6B, 0xD48C, 0x8A6C, 0xD48D, 0x8A6D, 0xD48E, 0x8A6E, 0xD48F, + 0x8A6F, 0xD490, 0x8A70, 0xD491, 0x8A71, 0xD492, 0x8A72, 0xD493, + 0x8A73, 0xD494, 0x8A74, 0xD495, 0x8A75, 0xD496, 0x8A76, 0xD497, + 0x8A77, 0xD498, 0x8A78, 0xD499, 0x8A79, 0xD5B2, 0x8A7A, 0xD49A, + 0x8A7B, 0xD49B, 0x8A7C, 0xD49C, 0x8A7D, 0xD49D, 0x8A7E, 0xD49E, + 0x8A7F, 0xD49F, 0x8A80, 0xD4A0, 0x8A81, 0xD540, 0x8A82, 0xD541, + 0x8A83, 0xD542, 0x8A84, 0xD543, 0x8A85, 0xD544, 0x8A86, 0xD545, + 0x8A87, 0xD546, 0x8A88, 0xD547, 0x8A89, 0xD3FE, 0x8A8A, 0xCCDC, + 0x8A8B, 0xD548, 0x8A8C, 0xD549, 0x8A8D, 0xD54A, 0x8A8E, 0xD54B, + 0x8A8F, 0xD54C, 0x8A90, 0xD54D, 0x8A91, 0xD54E, 0x8A92, 0xD54F, + 0x8A93, 0xCAC4, 0x8A94, 0xD550, 0x8A95, 0xD551, 0x8A96, 0xD552, + 0x8A97, 0xD553, 0x8A98, 0xD554, 0x8A99, 0xD555, 0x8A9A, 0xD556, + 0x8A9B, 0xD557, 0x8A9C, 0xD558, 0x8A9D, 0xD559, 0x8A9E, 0xD55A, + 0x8A9F, 0xD55B, 0x8AA0, 0xD55C, 0x8AA1, 0xD55D, 0x8AA2, 0xD55E, + 0x8AA3, 0xD55F, 0x8AA4, 0xD560, 0x8AA5, 0xD561, 0x8AA6, 0xD562, + 0x8AA7, 0xD563, 0x8AA8, 0xD564, 0x8AA9, 0xD565, 0x8AAA, 0xD566, + 0x8AAB, 0xD567, 0x8AAC, 0xD568, 0x8AAD, 0xD569, 0x8AAE, 0xD56A, + 0x8AAF, 0xD56B, 0x8AB0, 0xD56C, 0x8AB1, 0xD56D, 0x8AB2, 0xD56E, + 0x8AB3, 0xD56F, 0x8AB4, 0xD570, 0x8AB5, 0xD571, 0x8AB6, 0xD572, + 0x8AB7, 0xD573, 0x8AB8, 0xD574, 0x8AB9, 0xD575, 0x8ABA, 0xD576, + 0x8ABB, 0xD577, 0x8ABC, 0xD578, 0x8ABD, 0xD579, 0x8ABE, 0xD57A, + 0x8ABF, 0xD57B, 0x8AC0, 0xD57C, 0x8AC1, 0xD57D, 0x8AC2, 0xD57E, + 0x8AC3, 0xD580, 0x8AC4, 0xD581, 0x8AC5, 0xD582, 0x8AC6, 0xD583, + 0x8AC7, 0xD584, 0x8AC8, 0xD585, 0x8AC9, 0xD586, 0x8ACA, 0xD587, + 0x8ACB, 0xD588, 0x8ACC, 0xD589, 0x8ACD, 0xD58A, 0x8ACE, 0xD58B, + 0x8ACF, 0xD58C, 0x8AD0, 0xD58D, 0x8AD1, 0xD58E, 0x8AD2, 0xD58F, + 0x8AD3, 0xD590, 0x8AD4, 0xD591, 0x8AD5, 0xD592, 0x8AD6, 0xD593, + 0x8AD7, 0xD594, 0x8AD8, 0xD595, 0x8AD9, 0xD596, 0x8ADA, 0xD597, + 0x8ADB, 0xD598, 0x8ADC, 0xD599, 0x8ADD, 0xD59A, 0x8ADE, 0xD59B, + 0x8ADF, 0xD59C, 0x8AE0, 0xD59D, 0x8AE1, 0xD59E, 0x8AE2, 0xD59F, + 0x8AE3, 0xD5A0, 0x8AE4, 0xD640, 0x8AE5, 0xD641, 0x8AE6, 0xD642, + 0x8AE7, 0xD643, 0x8AE8, 0xD644, 0x8AE9, 0xD645, 0x8AEA, 0xD646, + 0x8AEB, 0xD647, 0x8AEC, 0xD648, 0x8AED, 0xD649, 0x8AEE, 0xD64A, + 0x8AEF, 0xD64B, 0x8AF0, 0xD64C, 0x8AF1, 0xD64D, 0x8AF2, 0xD64E, + 0x8AF3, 0xD64F, 0x8AF4, 0xD650, 0x8AF5, 0xD651, 0x8AF6, 0xD652, + 0x8AF7, 0xD653, 0x8AF8, 0xD654, 0x8AF9, 0xD655, 0x8AFA, 0xD656, + 0x8AFB, 0xD657, 0x8AFC, 0xD658, 0x8AFD, 0xD659, 0x8AFE, 0xD65A, + 0x8AFF, 0xD65B, 0x8B00, 0xD65C, 0x8B01, 0xD65D, 0x8B02, 0xD65E, + 0x8B03, 0xD65F, 0x8B04, 0xD660, 0x8B05, 0xD661, 0x8B06, 0xD662, + 0x8B07, 0xE5C0, 0x8B08, 0xD663, 0x8B09, 0xD664, 0x8B0A, 0xD665, + 0x8B0B, 0xD666, 0x8B0C, 0xD667, 0x8B0D, 0xD668, 0x8B0E, 0xD669, + 0x8B0F, 0xD66A, 0x8B10, 0xD66B, 0x8B11, 0xD66C, 0x8B12, 0xD66D, + 0x8B13, 0xD66E, 0x8B14, 0xD66F, 0x8B15, 0xD670, 0x8B16, 0xD671, + 0x8B17, 0xD672, 0x8B18, 0xD673, 0x8B19, 0xD674, 0x8B1A, 0xD675, + 0x8B1B, 0xD676, 0x8B1C, 0xD677, 0x8B1D, 0xD678, 0x8B1E, 0xD679, + 0x8B1F, 0xD67A, 0x8B20, 0xD67B, 0x8B21, 0xD67C, 0x8B22, 0xD67D, + 0x8B23, 0xD67E, 0x8B24, 0xD680, 0x8B25, 0xD681, 0x8B26, 0xF6A5, + 0x8B27, 0xD682, 0x8B28, 0xD683, 0x8B29, 0xD684, 0x8B2A, 0xD685, + 0x8B2B, 0xD686, 0x8B2C, 0xD687, 0x8B2D, 0xD688, 0x8B2E, 0xD689, + 0x8B2F, 0xD68A, 0x8B30, 0xD68B, 0x8B31, 0xD68C, 0x8B32, 0xD68D, + 0x8B33, 0xD68E, 0x8B34, 0xD68F, 0x8B35, 0xD690, 0x8B36, 0xD691, + 0x8B37, 0xD692, 0x8B38, 0xD693, 0x8B39, 0xD694, 0x8B3A, 0xD695, + 0x8B3B, 0xD696, 0x8B3C, 0xD697, 0x8B3D, 0xD698, 0x8B3E, 0xD699, + 0x8B3F, 0xD69A, 0x8B40, 0xD69B, 0x8B41, 0xD69C, 0x8B42, 0xD69D, + 0x8B43, 0xD69E, 0x8B44, 0xD69F, 0x8B45, 0xD6A0, 0x8B46, 0xD740, + 0x8B47, 0xD741, 0x8B48, 0xD742, 0x8B49, 0xD743, 0x8B4A, 0xD744, + 0x8B4B, 0xD745, 0x8B4C, 0xD746, 0x8B4D, 0xD747, 0x8B4E, 0xD748, + 0x8B4F, 0xD749, 0x8B50, 0xD74A, 0x8B51, 0xD74B, 0x8B52, 0xD74C, + 0x8B53, 0xD74D, 0x8B54, 0xD74E, 0x8B55, 0xD74F, 0x8B56, 0xD750, + 0x8B57, 0xD751, 0x8B58, 0xD752, 0x8B59, 0xD753, 0x8B5A, 0xD754, + 0x8B5B, 0xD755, 0x8B5C, 0xD756, 0x8B5D, 0xD757, 0x8B5E, 0xD758, + 0x8B5F, 0xD759, 0x8B60, 0xD75A, 0x8B61, 0xD75B, 0x8B62, 0xD75C, + 0x8B63, 0xD75D, 0x8B64, 0xD75E, 0x8B65, 0xD75F, 0x8B66, 0xBEAF, + 0x8B67, 0xD760, 0x8B68, 0xD761, 0x8B69, 0xD762, 0x8B6A, 0xD763, + 0x8B6B, 0xD764, 0x8B6C, 0xC6A9, 0x8B6D, 0xD765, 0x8B6E, 0xD766, + 0x8B6F, 0xD767, 0x8B70, 0xD768, 0x8B71, 0xD769, 0x8B72, 0xD76A, + 0x8B73, 0xD76B, 0x8B74, 0xD76C, 0x8B75, 0xD76D, 0x8B76, 0xD76E, + 0x8B77, 0xD76F, 0x8B78, 0xD770, 0x8B79, 0xD771, 0x8B7A, 0xD772, + 0x8B7B, 0xD773, 0x8B7C, 0xD774, 0x8B7D, 0xD775, 0x8B7E, 0xD776, + 0x8B7F, 0xD777, 0x8B80, 0xD778, 0x8B81, 0xD779, 0x8B82, 0xD77A, + 0x8B83, 0xD77B, 0x8B84, 0xD77C, 0x8B85, 0xD77D, 0x8B86, 0xD77E, + 0x8B87, 0xD780, 0x8B88, 0xD781, 0x8B89, 0xD782, 0x8B8A, 0xD783, + 0x8B8B, 0xD784, 0x8B8C, 0xD785, 0x8B8D, 0xD786, 0x8B8E, 0xD787, + 0x8B8F, 0xD788, 0x8B90, 0xD789, 0x8B91, 0xD78A, 0x8B92, 0xD78B, + 0x8B93, 0xD78C, 0x8B94, 0xD78D, 0x8B95, 0xD78E, 0x8B96, 0xD78F, + 0x8B97, 0xD790, 0x8B98, 0xD791, 0x8B99, 0xD792, 0x8B9A, 0xD793, + 0x8B9B, 0xD794, 0x8B9C, 0xD795, 0x8B9D, 0xD796, 0x8B9E, 0xD797, + 0x8B9F, 0xD798, 0x8BA0, 0xDAA5, 0x8BA1, 0xBCC6, 0x8BA2, 0xB6A9, + 0x8BA3, 0xB8BC, 0x8BA4, 0xC8CF, 0x8BA5, 0xBCA5, 0x8BA6, 0xDAA6, + 0x8BA7, 0xDAA7, 0x8BA8, 0xCCD6, 0x8BA9, 0xC8C3, 0x8BAA, 0xDAA8, + 0x8BAB, 0xC6FD, 0x8BAC, 0xD799, 0x8BAD, 0xD1B5, 0x8BAE, 0xD2E9, + 0x8BAF, 0xD1B6, 0x8BB0, 0xBCC7, 0x8BB1, 0xD79A, 0x8BB2, 0xBDB2, + 0x8BB3, 0xBBE4, 0x8BB4, 0xDAA9, 0x8BB5, 0xDAAA, 0x8BB6, 0xD1C8, + 0x8BB7, 0xDAAB, 0x8BB8, 0xD0ED, 0x8BB9, 0xB6EF, 0x8BBA, 0xC2DB, + 0x8BBB, 0xD79B, 0x8BBC, 0xCBCF, 0x8BBD, 0xB7ED, 0x8BBE, 0xC9E8, + 0x8BBF, 0xB7C3, 0x8BC0, 0xBEF7, 0x8BC1, 0xD6A4, 0x8BC2, 0xDAAC, + 0x8BC3, 0xDAAD, 0x8BC4, 0xC6C0, 0x8BC5, 0xD7E7, 0x8BC6, 0xCAB6, + 0x8BC7, 0xD79C, 0x8BC8, 0xD5A9, 0x8BC9, 0xCBDF, 0x8BCA, 0xD5EF, + 0x8BCB, 0xDAAE, 0x8BCC, 0xD6DF, 0x8BCD, 0xB4CA, 0x8BCE, 0xDAB0, + 0x8BCF, 0xDAAF, 0x8BD0, 0xD79D, 0x8BD1, 0xD2EB, 0x8BD2, 0xDAB1, + 0x8BD3, 0xDAB2, 0x8BD4, 0xDAB3, 0x8BD5, 0xCAD4, 0x8BD6, 0xDAB4, + 0x8BD7, 0xCAAB, 0x8BD8, 0xDAB5, 0x8BD9, 0xDAB6, 0x8BDA, 0xB3CF, + 0x8BDB, 0xD6EF, 0x8BDC, 0xDAB7, 0x8BDD, 0xBBB0, 0x8BDE, 0xB5AE, + 0x8BDF, 0xDAB8, 0x8BE0, 0xDAB9, 0x8BE1, 0xB9EE, 0x8BE2, 0xD1AF, + 0x8BE3, 0xD2E8, 0x8BE4, 0xDABA, 0x8BE5, 0xB8C3, 0x8BE6, 0xCFEA, + 0x8BE7, 0xB2EF, 0x8BE8, 0xDABB, 0x8BE9, 0xDABC, 0x8BEA, 0xD79E, + 0x8BEB, 0xBDEB, 0x8BEC, 0xCEDC, 0x8BED, 0xD3EF, 0x8BEE, 0xDABD, + 0x8BEF, 0xCEF3, 0x8BF0, 0xDABE, 0x8BF1, 0xD3D5, 0x8BF2, 0xBBE5, + 0x8BF3, 0xDABF, 0x8BF4, 0xCBB5, 0x8BF5, 0xCBD0, 0x8BF6, 0xDAC0, + 0x8BF7, 0xC7EB, 0x8BF8, 0xD6EE, 0x8BF9, 0xDAC1, 0x8BFA, 0xC5B5, + 0x8BFB, 0xB6C1, 0x8BFC, 0xDAC2, 0x8BFD, 0xB7CC, 0x8BFE, 0xBFCE, + 0x8BFF, 0xDAC3, 0x8C00, 0xDAC4, 0x8C01, 0xCBAD, 0x8C02, 0xDAC5, + 0x8C03, 0xB5F7, 0x8C04, 0xDAC6, 0x8C05, 0xC1C2, 0x8C06, 0xD7BB, + 0x8C07, 0xDAC7, 0x8C08, 0xCCB8, 0x8C09, 0xD79F, 0x8C0A, 0xD2EA, + 0x8C0B, 0xC4B1, 0x8C0C, 0xDAC8, 0x8C0D, 0xB5FD, 0x8C0E, 0xBBD1, + 0x8C0F, 0xDAC9, 0x8C10, 0xD0B3, 0x8C11, 0xDACA, 0x8C12, 0xDACB, + 0x8C13, 0xCEBD, 0x8C14, 0xDACC, 0x8C15, 0xDACD, 0x8C16, 0xDACE, + 0x8C17, 0xB2F7, 0x8C18, 0xDAD1, 0x8C19, 0xDACF, 0x8C1A, 0xD1E8, + 0x8C1B, 0xDAD0, 0x8C1C, 0xC3D5, 0x8C1D, 0xDAD2, 0x8C1E, 0xD7A0, + 0x8C1F, 0xDAD3, 0x8C20, 0xDAD4, 0x8C21, 0xDAD5, 0x8C22, 0xD0BB, + 0x8C23, 0xD2A5, 0x8C24, 0xB0F9, 0x8C25, 0xDAD6, 0x8C26, 0xC7AB, + 0x8C27, 0xDAD7, 0x8C28, 0xBDF7, 0x8C29, 0xC3A1, 0x8C2A, 0xDAD8, + 0x8C2B, 0xDAD9, 0x8C2C, 0xC3FD, 0x8C2D, 0xCCB7, 0x8C2E, 0xDADA, + 0x8C2F, 0xDADB, 0x8C30, 0xC0BE, 0x8C31, 0xC6D7, 0x8C32, 0xDADC, + 0x8C33, 0xDADD, 0x8C34, 0xC7B4, 0x8C35, 0xDADE, 0x8C36, 0xDADF, + 0x8C37, 0xB9C8, 0x8C38, 0xD840, 0x8C39, 0xD841, 0x8C3A, 0xD842, + 0x8C3B, 0xD843, 0x8C3C, 0xD844, 0x8C3D, 0xD845, 0x8C3E, 0xD846, + 0x8C3F, 0xD847, 0x8C40, 0xD848, 0x8C41, 0xBBED, 0x8C42, 0xD849, + 0x8C43, 0xD84A, 0x8C44, 0xD84B, 0x8C45, 0xD84C, 0x8C46, 0xB6B9, + 0x8C47, 0xF4F8, 0x8C48, 0xD84D, 0x8C49, 0xF4F9, 0x8C4A, 0xD84E, + 0x8C4B, 0xD84F, 0x8C4C, 0xCDE3, 0x8C4D, 0xD850, 0x8C4E, 0xD851, + 0x8C4F, 0xD852, 0x8C50, 0xD853, 0x8C51, 0xD854, 0x8C52, 0xD855, + 0x8C53, 0xD856, 0x8C54, 0xD857, 0x8C55, 0xF5B9, 0x8C56, 0xD858, + 0x8C57, 0xD859, 0x8C58, 0xD85A, 0x8C59, 0xD85B, 0x8C5A, 0xEBE0, + 0x8C5B, 0xD85C, 0x8C5C, 0xD85D, 0x8C5D, 0xD85E, 0x8C5E, 0xD85F, + 0x8C5F, 0xD860, 0x8C60, 0xD861, 0x8C61, 0xCFF3, 0x8C62, 0xBBBF, + 0x8C63, 0xD862, 0x8C64, 0xD863, 0x8C65, 0xD864, 0x8C66, 0xD865, + 0x8C67, 0xD866, 0x8C68, 0xD867, 0x8C69, 0xD868, 0x8C6A, 0xBAC0, + 0x8C6B, 0xD4A5, 0x8C6C, 0xD869, 0x8C6D, 0xD86A, 0x8C6E, 0xD86B, + 0x8C6F, 0xD86C, 0x8C70, 0xD86D, 0x8C71, 0xD86E, 0x8C72, 0xD86F, + 0x8C73, 0xE1D9, 0x8C74, 0xD870, 0x8C75, 0xD871, 0x8C76, 0xD872, + 0x8C77, 0xD873, 0x8C78, 0xF5F4, 0x8C79, 0xB1AA, 0x8C7A, 0xB2F2, + 0x8C7B, 0xD874, 0x8C7C, 0xD875, 0x8C7D, 0xD876, 0x8C7E, 0xD877, + 0x8C7F, 0xD878, 0x8C80, 0xD879, 0x8C81, 0xD87A, 0x8C82, 0xF5F5, + 0x8C83, 0xD87B, 0x8C84, 0xD87C, 0x8C85, 0xF5F7, 0x8C86, 0xD87D, + 0x8C87, 0xD87E, 0x8C88, 0xD880, 0x8C89, 0xBAD1, 0x8C8A, 0xF5F6, + 0x8C8B, 0xD881, 0x8C8C, 0xC3B2, 0x8C8D, 0xD882, 0x8C8E, 0xD883, + 0x8C8F, 0xD884, 0x8C90, 0xD885, 0x8C91, 0xD886, 0x8C92, 0xD887, + 0x8C93, 0xD888, 0x8C94, 0xF5F9, 0x8C95, 0xD889, 0x8C96, 0xD88A, + 0x8C97, 0xD88B, 0x8C98, 0xF5F8, 0x8C99, 0xD88C, 0x8C9A, 0xD88D, + 0x8C9B, 0xD88E, 0x8C9C, 0xD88F, 0x8C9D, 0xD890, 0x8C9E, 0xD891, + 0x8C9F, 0xD892, 0x8CA0, 0xD893, 0x8CA1, 0xD894, 0x8CA2, 0xD895, + 0x8CA3, 0xD896, 0x8CA4, 0xD897, 0x8CA5, 0xD898, 0x8CA6, 0xD899, + 0x8CA7, 0xD89A, 0x8CA8, 0xD89B, 0x8CA9, 0xD89C, 0x8CAA, 0xD89D, + 0x8CAB, 0xD89E, 0x8CAC, 0xD89F, 0x8CAD, 0xD8A0, 0x8CAE, 0xD940, + 0x8CAF, 0xD941, 0x8CB0, 0xD942, 0x8CB1, 0xD943, 0x8CB2, 0xD944, + 0x8CB3, 0xD945, 0x8CB4, 0xD946, 0x8CB5, 0xD947, 0x8CB6, 0xD948, + 0x8CB7, 0xD949, 0x8CB8, 0xD94A, 0x8CB9, 0xD94B, 0x8CBA, 0xD94C, + 0x8CBB, 0xD94D, 0x8CBC, 0xD94E, 0x8CBD, 0xD94F, 0x8CBE, 0xD950, + 0x8CBF, 0xD951, 0x8CC0, 0xD952, 0x8CC1, 0xD953, 0x8CC2, 0xD954, + 0x8CC3, 0xD955, 0x8CC4, 0xD956, 0x8CC5, 0xD957, 0x8CC6, 0xD958, + 0x8CC7, 0xD959, 0x8CC8, 0xD95A, 0x8CC9, 0xD95B, 0x8CCA, 0xD95C, + 0x8CCB, 0xD95D, 0x8CCC, 0xD95E, 0x8CCD, 0xD95F, 0x8CCE, 0xD960, + 0x8CCF, 0xD961, 0x8CD0, 0xD962, 0x8CD1, 0xD963, 0x8CD2, 0xD964, + 0x8CD3, 0xD965, 0x8CD4, 0xD966, 0x8CD5, 0xD967, 0x8CD6, 0xD968, + 0x8CD7, 0xD969, 0x8CD8, 0xD96A, 0x8CD9, 0xD96B, 0x8CDA, 0xD96C, + 0x8CDB, 0xD96D, 0x8CDC, 0xD96E, 0x8CDD, 0xD96F, 0x8CDE, 0xD970, + 0x8CDF, 0xD971, 0x8CE0, 0xD972, 0x8CE1, 0xD973, 0x8CE2, 0xD974, + 0x8CE3, 0xD975, 0x8CE4, 0xD976, 0x8CE5, 0xD977, 0x8CE6, 0xD978, + 0x8CE7, 0xD979, 0x8CE8, 0xD97A, 0x8CE9, 0xD97B, 0x8CEA, 0xD97C, + 0x8CEB, 0xD97D, 0x8CEC, 0xD97E, 0x8CED, 0xD980, 0x8CEE, 0xD981, + 0x8CEF, 0xD982, 0x8CF0, 0xD983, 0x8CF1, 0xD984, 0x8CF2, 0xD985, + 0x8CF3, 0xD986, 0x8CF4, 0xD987, 0x8CF5, 0xD988, 0x8CF6, 0xD989, + 0x8CF7, 0xD98A, 0x8CF8, 0xD98B, 0x8CF9, 0xD98C, 0x8CFA, 0xD98D, + 0x8CFB, 0xD98E, 0x8CFC, 0xD98F, 0x8CFD, 0xD990, 0x8CFE, 0xD991, + 0x8CFF, 0xD992, 0x8D00, 0xD993, 0x8D01, 0xD994, 0x8D02, 0xD995, + 0x8D03, 0xD996, 0x8D04, 0xD997, 0x8D05, 0xD998, 0x8D06, 0xD999, + 0x8D07, 0xD99A, 0x8D08, 0xD99B, 0x8D09, 0xD99C, 0x8D0A, 0xD99D, + 0x8D0B, 0xD99E, 0x8D0C, 0xD99F, 0x8D0D, 0xD9A0, 0x8D0E, 0xDA40, + 0x8D0F, 0xDA41, 0x8D10, 0xDA42, 0x8D11, 0xDA43, 0x8D12, 0xDA44, + 0x8D13, 0xDA45, 0x8D14, 0xDA46, 0x8D15, 0xDA47, 0x8D16, 0xDA48, + 0x8D17, 0xDA49, 0x8D18, 0xDA4A, 0x8D19, 0xDA4B, 0x8D1A, 0xDA4C, + 0x8D1B, 0xDA4D, 0x8D1C, 0xDA4E, 0x8D1D, 0xB1B4, 0x8D1E, 0xD5EA, + 0x8D1F, 0xB8BA, 0x8D20, 0xDA4F, 0x8D21, 0xB9B1, 0x8D22, 0xB2C6, + 0x8D23, 0xD4F0, 0x8D24, 0xCFCD, 0x8D25, 0xB0DC, 0x8D26, 0xD5CB, + 0x8D27, 0xBBF5, 0x8D28, 0xD6CA, 0x8D29, 0xB7B7, 0x8D2A, 0xCCB0, + 0x8D2B, 0xC6B6, 0x8D2C, 0xB1E1, 0x8D2D, 0xB9BA, 0x8D2E, 0xD6FC, + 0x8D2F, 0xB9E1, 0x8D30, 0xB7A1, 0x8D31, 0xBCFA, 0x8D32, 0xEADA, + 0x8D33, 0xEADB, 0x8D34, 0xCCF9, 0x8D35, 0xB9F3, 0x8D36, 0xEADC, + 0x8D37, 0xB4FB, 0x8D38, 0xC3B3, 0x8D39, 0xB7D1, 0x8D3A, 0xBAD8, + 0x8D3B, 0xEADD, 0x8D3C, 0xD4F4, 0x8D3D, 0xEADE, 0x8D3E, 0xBCD6, + 0x8D3F, 0xBBDF, 0x8D40, 0xEADF, 0x8D41, 0xC1DE, 0x8D42, 0xC2B8, + 0x8D43, 0xD4DF, 0x8D44, 0xD7CA, 0x8D45, 0xEAE0, 0x8D46, 0xEAE1, + 0x8D47, 0xEAE4, 0x8D48, 0xEAE2, 0x8D49, 0xEAE3, 0x8D4A, 0xC9DE, + 0x8D4B, 0xB8B3, 0x8D4C, 0xB6C4, 0x8D4D, 0xEAE5, 0x8D4E, 0xCAEA, + 0x8D4F, 0xC9CD, 0x8D50, 0xB4CD, 0x8D51, 0xDA50, 0x8D52, 0xDA51, + 0x8D53, 0xE2D9, 0x8D54, 0xC5E2, 0x8D55, 0xEAE6, 0x8D56, 0xC0B5, + 0x8D57, 0xDA52, 0x8D58, 0xD7B8, 0x8D59, 0xEAE7, 0x8D5A, 0xD7AC, + 0x8D5B, 0xC8FC, 0x8D5C, 0xD8D3, 0x8D5D, 0xD8CD, 0x8D5E, 0xD4DE, + 0x8D5F, 0xDA53, 0x8D60, 0xD4F9, 0x8D61, 0xC9C4, 0x8D62, 0xD3AE, + 0x8D63, 0xB8D3, 0x8D64, 0xB3E0, 0x8D65, 0xDA54, 0x8D66, 0xC9E2, + 0x8D67, 0xF4F6, 0x8D68, 0xDA55, 0x8D69, 0xDA56, 0x8D6A, 0xDA57, + 0x8D6B, 0xBAD5, 0x8D6C, 0xDA58, 0x8D6D, 0xF4F7, 0x8D6E, 0xDA59, + 0x8D6F, 0xDA5A, 0x8D70, 0xD7DF, 0x8D71, 0xDA5B, 0x8D72, 0xDA5C, + 0x8D73, 0xF4F1, 0x8D74, 0xB8B0, 0x8D75, 0xD5D4, 0x8D76, 0xB8CF, + 0x8D77, 0xC6F0, 0x8D78, 0xDA5D, 0x8D79, 0xDA5E, 0x8D7A, 0xDA5F, + 0x8D7B, 0xDA60, 0x8D7C, 0xDA61, 0x8D7D, 0xDA62, 0x8D7E, 0xDA63, + 0x8D7F, 0xDA64, 0x8D80, 0xDA65, 0x8D81, 0xB3C3, 0x8D82, 0xDA66, + 0x8D83, 0xDA67, 0x8D84, 0xF4F2, 0x8D85, 0xB3AC, 0x8D86, 0xDA68, + 0x8D87, 0xDA69, 0x8D88, 0xDA6A, 0x8D89, 0xDA6B, 0x8D8A, 0xD4BD, + 0x8D8B, 0xC7F7, 0x8D8C, 0xDA6C, 0x8D8D, 0xDA6D, 0x8D8E, 0xDA6E, + 0x8D8F, 0xDA6F, 0x8D90, 0xDA70, 0x8D91, 0xF4F4, 0x8D92, 0xDA71, + 0x8D93, 0xDA72, 0x8D94, 0xF4F3, 0x8D95, 0xDA73, 0x8D96, 0xDA74, + 0x8D97, 0xDA75, 0x8D98, 0xDA76, 0x8D99, 0xDA77, 0x8D9A, 0xDA78, + 0x8D9B, 0xDA79, 0x8D9C, 0xDA7A, 0x8D9D, 0xDA7B, 0x8D9E, 0xDA7C, + 0x8D9F, 0xCCCB, 0x8DA0, 0xDA7D, 0x8DA1, 0xDA7E, 0x8DA2, 0xDA80, + 0x8DA3, 0xC8A4, 0x8DA4, 0xDA81, 0x8DA5, 0xDA82, 0x8DA6, 0xDA83, + 0x8DA7, 0xDA84, 0x8DA8, 0xDA85, 0x8DA9, 0xDA86, 0x8DAA, 0xDA87, + 0x8DAB, 0xDA88, 0x8DAC, 0xDA89, 0x8DAD, 0xDA8A, 0x8DAE, 0xDA8B, + 0x8DAF, 0xDA8C, 0x8DB0, 0xDA8D, 0x8DB1, 0xF4F5, 0x8DB2, 0xDA8E, + 0x8DB3, 0xD7E3, 0x8DB4, 0xC5BF, 0x8DB5, 0xF5C0, 0x8DB6, 0xDA8F, + 0x8DB7, 0xDA90, 0x8DB8, 0xF5BB, 0x8DB9, 0xDA91, 0x8DBA, 0xF5C3, + 0x8DBB, 0xDA92, 0x8DBC, 0xF5C2, 0x8DBD, 0xDA93, 0x8DBE, 0xD6BA, + 0x8DBF, 0xF5C1, 0x8DC0, 0xDA94, 0x8DC1, 0xDA95, 0x8DC2, 0xDA96, + 0x8DC3, 0xD4BE, 0x8DC4, 0xF5C4, 0x8DC5, 0xDA97, 0x8DC6, 0xF5CC, + 0x8DC7, 0xDA98, 0x8DC8, 0xDA99, 0x8DC9, 0xDA9A, 0x8DCA, 0xDA9B, + 0x8DCB, 0xB0CF, 0x8DCC, 0xB5F8, 0x8DCD, 0xDA9C, 0x8DCE, 0xF5C9, + 0x8DCF, 0xF5CA, 0x8DD0, 0xDA9D, 0x8DD1, 0xC5DC, 0x8DD2, 0xDA9E, + 0x8DD3, 0xDA9F, 0x8DD4, 0xDAA0, 0x8DD5, 0xDB40, 0x8DD6, 0xF5C5, + 0x8DD7, 0xF5C6, 0x8DD8, 0xDB41, 0x8DD9, 0xDB42, 0x8DDA, 0xF5C7, + 0x8DDB, 0xF5CB, 0x8DDC, 0xDB43, 0x8DDD, 0xBEE0, 0x8DDE, 0xF5C8, + 0x8DDF, 0xB8FA, 0x8DE0, 0xDB44, 0x8DE1, 0xDB45, 0x8DE2, 0xDB46, + 0x8DE3, 0xF5D0, 0x8DE4, 0xF5D3, 0x8DE5, 0xDB47, 0x8DE6, 0xDB48, + 0x8DE7, 0xDB49, 0x8DE8, 0xBFE7, 0x8DE9, 0xDB4A, 0x8DEA, 0xB9F2, + 0x8DEB, 0xF5BC, 0x8DEC, 0xF5CD, 0x8DED, 0xDB4B, 0x8DEE, 0xDB4C, + 0x8DEF, 0xC2B7, 0x8DF0, 0xDB4D, 0x8DF1, 0xDB4E, 0x8DF2, 0xDB4F, + 0x8DF3, 0xCCF8, 0x8DF4, 0xDB50, 0x8DF5, 0xBCF9, 0x8DF6, 0xDB51, + 0x8DF7, 0xF5CE, 0x8DF8, 0xF5CF, 0x8DF9, 0xF5D1, 0x8DFA, 0xB6E5, + 0x8DFB, 0xF5D2, 0x8DFC, 0xDB52, 0x8DFD, 0xF5D5, 0x8DFE, 0xDB53, + 0x8DFF, 0xDB54, 0x8E00, 0xDB55, 0x8E01, 0xDB56, 0x8E02, 0xDB57, + 0x8E03, 0xDB58, 0x8E04, 0xDB59, 0x8E05, 0xF5BD, 0x8E06, 0xDB5A, + 0x8E07, 0xDB5B, 0x8E08, 0xDB5C, 0x8E09, 0xF5D4, 0x8E0A, 0xD3BB, + 0x8E0B, 0xDB5D, 0x8E0C, 0xB3EC, 0x8E0D, 0xDB5E, 0x8E0E, 0xDB5F, + 0x8E0F, 0xCCA4, 0x8E10, 0xDB60, 0x8E11, 0xDB61, 0x8E12, 0xDB62, + 0x8E13, 0xDB63, 0x8E14, 0xF5D6, 0x8E15, 0xDB64, 0x8E16, 0xDB65, + 0x8E17, 0xDB66, 0x8E18, 0xDB67, 0x8E19, 0xDB68, 0x8E1A, 0xDB69, + 0x8E1B, 0xDB6A, 0x8E1C, 0xDB6B, 0x8E1D, 0xF5D7, 0x8E1E, 0xBEE1, + 0x8E1F, 0xF5D8, 0x8E20, 0xDB6C, 0x8E21, 0xDB6D, 0x8E22, 0xCCDF, + 0x8E23, 0xF5DB, 0x8E24, 0xDB6E, 0x8E25, 0xDB6F, 0x8E26, 0xDB70, + 0x8E27, 0xDB71, 0x8E28, 0xDB72, 0x8E29, 0xB2C8, 0x8E2A, 0xD7D9, + 0x8E2B, 0xDB73, 0x8E2C, 0xF5D9, 0x8E2D, 0xDB74, 0x8E2E, 0xF5DA, + 0x8E2F, 0xF5DC, 0x8E30, 0xDB75, 0x8E31, 0xF5E2, 0x8E32, 0xDB76, + 0x8E33, 0xDB77, 0x8E34, 0xDB78, 0x8E35, 0xF5E0, 0x8E36, 0xDB79, + 0x8E37, 0xDB7A, 0x8E38, 0xDB7B, 0x8E39, 0xF5DF, 0x8E3A, 0xF5DD, + 0x8E3B, 0xDB7C, 0x8E3C, 0xDB7D, 0x8E3D, 0xF5E1, 0x8E3E, 0xDB7E, + 0x8E3F, 0xDB80, 0x8E40, 0xF5DE, 0x8E41, 0xF5E4, 0x8E42, 0xF5E5, + 0x8E43, 0xDB81, 0x8E44, 0xCCE3, 0x8E45, 0xDB82, 0x8E46, 0xDB83, + 0x8E47, 0xE5BF, 0x8E48, 0xB5B8, 0x8E49, 0xF5E3, 0x8E4A, 0xF5E8, + 0x8E4B, 0xCCA3, 0x8E4C, 0xDB84, 0x8E4D, 0xDB85, 0x8E4E, 0xDB86, + 0x8E4F, 0xDB87, 0x8E50, 0xDB88, 0x8E51, 0xF5E6, 0x8E52, 0xF5E7, + 0x8E53, 0xDB89, 0x8E54, 0xDB8A, 0x8E55, 0xDB8B, 0x8E56, 0xDB8C, + 0x8E57, 0xDB8D, 0x8E58, 0xDB8E, 0x8E59, 0xF5BE, 0x8E5A, 0xDB8F, + 0x8E5B, 0xDB90, 0x8E5C, 0xDB91, 0x8E5D, 0xDB92, 0x8E5E, 0xDB93, + 0x8E5F, 0xDB94, 0x8E60, 0xDB95, 0x8E61, 0xDB96, 0x8E62, 0xDB97, + 0x8E63, 0xDB98, 0x8E64, 0xDB99, 0x8E65, 0xDB9A, 0x8E66, 0xB1C4, + 0x8E67, 0xDB9B, 0x8E68, 0xDB9C, 0x8E69, 0xF5BF, 0x8E6A, 0xDB9D, + 0x8E6B, 0xDB9E, 0x8E6C, 0xB5C5, 0x8E6D, 0xB2E4, 0x8E6E, 0xDB9F, + 0x8E6F, 0xF5EC, 0x8E70, 0xF5E9, 0x8E71, 0xDBA0, 0x8E72, 0xB6D7, + 0x8E73, 0xDC40, 0x8E74, 0xF5ED, 0x8E75, 0xDC41, 0x8E76, 0xF5EA, + 0x8E77, 0xDC42, 0x8E78, 0xDC43, 0x8E79, 0xDC44, 0x8E7A, 0xDC45, + 0x8E7B, 0xDC46, 0x8E7C, 0xF5EB, 0x8E7D, 0xDC47, 0x8E7E, 0xDC48, + 0x8E7F, 0xB4DA, 0x8E80, 0xDC49, 0x8E81, 0xD4EA, 0x8E82, 0xDC4A, + 0x8E83, 0xDC4B, 0x8E84, 0xDC4C, 0x8E85, 0xF5EE, 0x8E86, 0xDC4D, + 0x8E87, 0xB3F9, 0x8E88, 0xDC4E, 0x8E89, 0xDC4F, 0x8E8A, 0xDC50, + 0x8E8B, 0xDC51, 0x8E8C, 0xDC52, 0x8E8D, 0xDC53, 0x8E8E, 0xDC54, + 0x8E8F, 0xF5EF, 0x8E90, 0xF5F1, 0x8E91, 0xDC55, 0x8E92, 0xDC56, + 0x8E93, 0xDC57, 0x8E94, 0xF5F0, 0x8E95, 0xDC58, 0x8E96, 0xDC59, + 0x8E97, 0xDC5A, 0x8E98, 0xDC5B, 0x8E99, 0xDC5C, 0x8E9A, 0xDC5D, + 0x8E9B, 0xDC5E, 0x8E9C, 0xF5F2, 0x8E9D, 0xDC5F, 0x8E9E, 0xF5F3, + 0x8E9F, 0xDC60, 0x8EA0, 0xDC61, 0x8EA1, 0xDC62, 0x8EA2, 0xDC63, + 0x8EA3, 0xDC64, 0x8EA4, 0xDC65, 0x8EA5, 0xDC66, 0x8EA6, 0xDC67, + 0x8EA7, 0xDC68, 0x8EA8, 0xDC69, 0x8EA9, 0xDC6A, 0x8EAA, 0xDC6B, + 0x8EAB, 0xC9ED, 0x8EAC, 0xB9AA, 0x8EAD, 0xDC6C, 0x8EAE, 0xDC6D, + 0x8EAF, 0xC7FB, 0x8EB0, 0xDC6E, 0x8EB1, 0xDC6F, 0x8EB2, 0xB6E3, + 0x8EB3, 0xDC70, 0x8EB4, 0xDC71, 0x8EB5, 0xDC72, 0x8EB6, 0xDC73, + 0x8EB7, 0xDC74, 0x8EB8, 0xDC75, 0x8EB9, 0xDC76, 0x8EBA, 0xCCC9, + 0x8EBB, 0xDC77, 0x8EBC, 0xDC78, 0x8EBD, 0xDC79, 0x8EBE, 0xDC7A, + 0x8EBF, 0xDC7B, 0x8EC0, 0xDC7C, 0x8EC1, 0xDC7D, 0x8EC2, 0xDC7E, + 0x8EC3, 0xDC80, 0x8EC4, 0xDC81, 0x8EC5, 0xDC82, 0x8EC6, 0xDC83, + 0x8EC7, 0xDC84, 0x8EC8, 0xDC85, 0x8EC9, 0xDC86, 0x8ECA, 0xDC87, + 0x8ECB, 0xDC88, 0x8ECC, 0xDC89, 0x8ECD, 0xDC8A, 0x8ECE, 0xEAA6, + 0x8ECF, 0xDC8B, 0x8ED0, 0xDC8C, 0x8ED1, 0xDC8D, 0x8ED2, 0xDC8E, + 0x8ED3, 0xDC8F, 0x8ED4, 0xDC90, 0x8ED5, 0xDC91, 0x8ED6, 0xDC92, + 0x8ED7, 0xDC93, 0x8ED8, 0xDC94, 0x8ED9, 0xDC95, 0x8EDA, 0xDC96, + 0x8EDB, 0xDC97, 0x8EDC, 0xDC98, 0x8EDD, 0xDC99, 0x8EDE, 0xDC9A, + 0x8EDF, 0xDC9B, 0x8EE0, 0xDC9C, 0x8EE1, 0xDC9D, 0x8EE2, 0xDC9E, + 0x8EE3, 0xDC9F, 0x8EE4, 0xDCA0, 0x8EE5, 0xDD40, 0x8EE6, 0xDD41, + 0x8EE7, 0xDD42, 0x8EE8, 0xDD43, 0x8EE9, 0xDD44, 0x8EEA, 0xDD45, + 0x8EEB, 0xDD46, 0x8EEC, 0xDD47, 0x8EED, 0xDD48, 0x8EEE, 0xDD49, + 0x8EEF, 0xDD4A, 0x8EF0, 0xDD4B, 0x8EF1, 0xDD4C, 0x8EF2, 0xDD4D, + 0x8EF3, 0xDD4E, 0x8EF4, 0xDD4F, 0x8EF5, 0xDD50, 0x8EF6, 0xDD51, + 0x8EF7, 0xDD52, 0x8EF8, 0xDD53, 0x8EF9, 0xDD54, 0x8EFA, 0xDD55, + 0x8EFB, 0xDD56, 0x8EFC, 0xDD57, 0x8EFD, 0xDD58, 0x8EFE, 0xDD59, + 0x8EFF, 0xDD5A, 0x8F00, 0xDD5B, 0x8F01, 0xDD5C, 0x8F02, 0xDD5D, + 0x8F03, 0xDD5E, 0x8F04, 0xDD5F, 0x8F05, 0xDD60, 0x8F06, 0xDD61, + 0x8F07, 0xDD62, 0x8F08, 0xDD63, 0x8F09, 0xDD64, 0x8F0A, 0xDD65, + 0x8F0B, 0xDD66, 0x8F0C, 0xDD67, 0x8F0D, 0xDD68, 0x8F0E, 0xDD69, + 0x8F0F, 0xDD6A, 0x8F10, 0xDD6B, 0x8F11, 0xDD6C, 0x8F12, 0xDD6D, + 0x8F13, 0xDD6E, 0x8F14, 0xDD6F, 0x8F15, 0xDD70, 0x8F16, 0xDD71, + 0x8F17, 0xDD72, 0x8F18, 0xDD73, 0x8F19, 0xDD74, 0x8F1A, 0xDD75, + 0x8F1B, 0xDD76, 0x8F1C, 0xDD77, 0x8F1D, 0xDD78, 0x8F1E, 0xDD79, + 0x8F1F, 0xDD7A, 0x8F20, 0xDD7B, 0x8F21, 0xDD7C, 0x8F22, 0xDD7D, + 0x8F23, 0xDD7E, 0x8F24, 0xDD80, 0x8F25, 0xDD81, 0x8F26, 0xDD82, + 0x8F27, 0xDD83, 0x8F28, 0xDD84, 0x8F29, 0xDD85, 0x8F2A, 0xDD86, + 0x8F2B, 0xDD87, 0x8F2C, 0xDD88, 0x8F2D, 0xDD89, 0x8F2E, 0xDD8A, + 0x8F2F, 0xDD8B, 0x8F30, 0xDD8C, 0x8F31, 0xDD8D, 0x8F32, 0xDD8E, + 0x8F33, 0xDD8F, 0x8F34, 0xDD90, 0x8F35, 0xDD91, 0x8F36, 0xDD92, + 0x8F37, 0xDD93, 0x8F38, 0xDD94, 0x8F39, 0xDD95, 0x8F3A, 0xDD96, + 0x8F3B, 0xDD97, 0x8F3C, 0xDD98, 0x8F3D, 0xDD99, 0x8F3E, 0xDD9A, + 0x8F3F, 0xDD9B, 0x8F40, 0xDD9C, 0x8F41, 0xDD9D, 0x8F42, 0xDD9E, + 0x8F43, 0xDD9F, 0x8F44, 0xDDA0, 0x8F45, 0xDE40, 0x8F46, 0xDE41, + 0x8F47, 0xDE42, 0x8F48, 0xDE43, 0x8F49, 0xDE44, 0x8F4A, 0xDE45, + 0x8F4B, 0xDE46, 0x8F4C, 0xDE47, 0x8F4D, 0xDE48, 0x8F4E, 0xDE49, + 0x8F4F, 0xDE4A, 0x8F50, 0xDE4B, 0x8F51, 0xDE4C, 0x8F52, 0xDE4D, + 0x8F53, 0xDE4E, 0x8F54, 0xDE4F, 0x8F55, 0xDE50, 0x8F56, 0xDE51, + 0x8F57, 0xDE52, 0x8F58, 0xDE53, 0x8F59, 0xDE54, 0x8F5A, 0xDE55, + 0x8F5B, 0xDE56, 0x8F5C, 0xDE57, 0x8F5D, 0xDE58, 0x8F5E, 0xDE59, + 0x8F5F, 0xDE5A, 0x8F60, 0xDE5B, 0x8F61, 0xDE5C, 0x8F62, 0xDE5D, + 0x8F63, 0xDE5E, 0x8F64, 0xDE5F, 0x8F65, 0xDE60, 0x8F66, 0xB3B5, + 0x8F67, 0xD4FE, 0x8F68, 0xB9EC, 0x8F69, 0xD0F9, 0x8F6A, 0xDE61, + 0x8F6B, 0xE9ED, 0x8F6C, 0xD7AA, 0x8F6D, 0xE9EE, 0x8F6E, 0xC2D6, + 0x8F6F, 0xC8ED, 0x8F70, 0xBAE4, 0x8F71, 0xE9EF, 0x8F72, 0xE9F0, + 0x8F73, 0xE9F1, 0x8F74, 0xD6E1, 0x8F75, 0xE9F2, 0x8F76, 0xE9F3, + 0x8F77, 0xE9F5, 0x8F78, 0xE9F4, 0x8F79, 0xE9F6, 0x8F7A, 0xE9F7, + 0x8F7B, 0xC7E1, 0x8F7C, 0xE9F8, 0x8F7D, 0xD4D8, 0x8F7E, 0xE9F9, + 0x8F7F, 0xBDCE, 0x8F80, 0xDE62, 0x8F81, 0xE9FA, 0x8F82, 0xE9FB, + 0x8F83, 0xBDCF, 0x8F84, 0xE9FC, 0x8F85, 0xB8A8, 0x8F86, 0xC1BE, + 0x8F87, 0xE9FD, 0x8F88, 0xB1B2, 0x8F89, 0xBBD4, 0x8F8A, 0xB9F5, + 0x8F8B, 0xE9FE, 0x8F8C, 0xDE63, 0x8F8D, 0xEAA1, 0x8F8E, 0xEAA2, + 0x8F8F, 0xEAA3, 0x8F90, 0xB7F8, 0x8F91, 0xBCAD, 0x8F92, 0xDE64, + 0x8F93, 0xCAE4, 0x8F94, 0xE0CE, 0x8F95, 0xD4AF, 0x8F96, 0xCFBD, + 0x8F97, 0xD5B7, 0x8F98, 0xEAA4, 0x8F99, 0xD5DE, 0x8F9A, 0xEAA5, + 0x8F9B, 0xD0C1, 0x8F9C, 0xB9BC, 0x8F9D, 0xDE65, 0x8F9E, 0xB4C7, + 0x8F9F, 0xB1D9, 0x8FA0, 0xDE66, 0x8FA1, 0xDE67, 0x8FA2, 0xDE68, + 0x8FA3, 0xC0B1, 0x8FA4, 0xDE69, 0x8FA5, 0xDE6A, 0x8FA6, 0xDE6B, + 0x8FA7, 0xDE6C, 0x8FA8, 0xB1E6, 0x8FA9, 0xB1E7, 0x8FAA, 0xDE6D, + 0x8FAB, 0xB1E8, 0x8FAC, 0xDE6E, 0x8FAD, 0xDE6F, 0x8FAE, 0xDE70, + 0x8FAF, 0xDE71, 0x8FB0, 0xB3BD, 0x8FB1, 0xC8E8, 0x8FB2, 0xDE72, + 0x8FB3, 0xDE73, 0x8FB4, 0xDE74, 0x8FB5, 0xDE75, 0x8FB6, 0xE5C1, + 0x8FB7, 0xDE76, 0x8FB8, 0xDE77, 0x8FB9, 0xB1DF, 0x8FBA, 0xDE78, + 0x8FBB, 0xDE79, 0x8FBC, 0xDE7A, 0x8FBD, 0xC1C9, 0x8FBE, 0xB4EF, + 0x8FBF, 0xDE7B, 0x8FC0, 0xDE7C, 0x8FC1, 0xC7A8, 0x8FC2, 0xD3D8, + 0x8FC3, 0xDE7D, 0x8FC4, 0xC6F9, 0x8FC5, 0xD1B8, 0x8FC6, 0xDE7E, + 0x8FC7, 0xB9FD, 0x8FC8, 0xC2F5, 0x8FC9, 0xDE80, 0x8FCA, 0xDE81, + 0x8FCB, 0xDE82, 0x8FCC, 0xDE83, 0x8FCD, 0xDE84, 0x8FCE, 0xD3AD, + 0x8FCF, 0xDE85, 0x8FD0, 0xD4CB, 0x8FD1, 0xBDFC, 0x8FD2, 0xDE86, + 0x8FD3, 0xE5C2, 0x8FD4, 0xB7B5, 0x8FD5, 0xE5C3, 0x8FD6, 0xDE87, + 0x8FD7, 0xDE88, 0x8FD8, 0xBBB9, 0x8FD9, 0xD5E2, 0x8FDA, 0xDE89, + 0x8FDB, 0xBDF8, 0x8FDC, 0xD4B6, 0x8FDD, 0xCEA5, 0x8FDE, 0xC1AC, + 0x8FDF, 0xB3D9, 0x8FE0, 0xDE8A, 0x8FE1, 0xDE8B, 0x8FE2, 0xCCF6, + 0x8FE3, 0xDE8C, 0x8FE4, 0xE5C6, 0x8FE5, 0xE5C4, 0x8FE6, 0xE5C8, + 0x8FE7, 0xDE8D, 0x8FE8, 0xE5CA, 0x8FE9, 0xE5C7, 0x8FEA, 0xB5CF, + 0x8FEB, 0xC6C8, 0x8FEC, 0xDE8E, 0x8FED, 0xB5FC, 0x8FEE, 0xE5C5, + 0x8FEF, 0xDE8F, 0x8FF0, 0xCAF6, 0x8FF1, 0xDE90, 0x8FF2, 0xDE91, + 0x8FF3, 0xE5C9, 0x8FF4, 0xDE92, 0x8FF5, 0xDE93, 0x8FF6, 0xDE94, + 0x8FF7, 0xC3D4, 0x8FF8, 0xB1C5, 0x8FF9, 0xBCA3, 0x8FFA, 0xDE95, + 0x8FFB, 0xDE96, 0x8FFC, 0xDE97, 0x8FFD, 0xD7B7, 0x8FFE, 0xDE98, + 0x8FFF, 0xDE99, 0x9000, 0xCDCB, 0x9001, 0xCBCD, 0x9002, 0xCACA, + 0x9003, 0xCCD3, 0x9004, 0xE5CC, 0x9005, 0xE5CB, 0x9006, 0xC4E6, + 0x9007, 0xDE9A, 0x9008, 0xDE9B, 0x9009, 0xD1A1, 0x900A, 0xD1B7, + 0x900B, 0xE5CD, 0x900C, 0xDE9C, 0x900D, 0xE5D0, 0x900E, 0xDE9D, + 0x900F, 0xCDB8, 0x9010, 0xD6F0, 0x9011, 0xE5CF, 0x9012, 0xB5DD, + 0x9013, 0xDE9E, 0x9014, 0xCDBE, 0x9015, 0xDE9F, 0x9016, 0xE5D1, + 0x9017, 0xB6BA, 0x9018, 0xDEA0, 0x9019, 0xDF40, 0x901A, 0xCDA8, + 0x901B, 0xB9E4, 0x901C, 0xDF41, 0x901D, 0xCAC5, 0x901E, 0xB3D1, + 0x901F, 0xCBD9, 0x9020, 0xD4EC, 0x9021, 0xE5D2, 0x9022, 0xB7EA, + 0x9023, 0xDF42, 0x9024, 0xDF43, 0x9025, 0xDF44, 0x9026, 0xE5CE, + 0x9027, 0xDF45, 0x9028, 0xDF46, 0x9029, 0xDF47, 0x902A, 0xDF48, + 0x902B, 0xDF49, 0x902C, 0xDF4A, 0x902D, 0xE5D5, 0x902E, 0xB4FE, + 0x902F, 0xE5D6, 0x9030, 0xDF4B, 0x9031, 0xDF4C, 0x9032, 0xDF4D, + 0x9033, 0xDF4E, 0x9034, 0xDF4F, 0x9035, 0xE5D3, 0x9036, 0xE5D4, + 0x9037, 0xDF50, 0x9038, 0xD2DD, 0x9039, 0xDF51, 0x903A, 0xDF52, + 0x903B, 0xC2DF, 0x903C, 0xB1C6, 0x903D, 0xDF53, 0x903E, 0xD3E2, + 0x903F, 0xDF54, 0x9040, 0xDF55, 0x9041, 0xB6DD, 0x9042, 0xCBEC, + 0x9043, 0xDF56, 0x9044, 0xE5D7, 0x9045, 0xDF57, 0x9046, 0xDF58, + 0x9047, 0xD3F6, 0x9048, 0xDF59, 0x9049, 0xDF5A, 0x904A, 0xDF5B, + 0x904B, 0xDF5C, 0x904C, 0xDF5D, 0x904D, 0xB1E9, 0x904E, 0xDF5E, + 0x904F, 0xB6F4, 0x9050, 0xE5DA, 0x9051, 0xE5D8, 0x9052, 0xE5D9, + 0x9053, 0xB5C0, 0x9054, 0xDF5F, 0x9055, 0xDF60, 0x9056, 0xDF61, + 0x9057, 0xD2C5, 0x9058, 0xE5DC, 0x9059, 0xDF62, 0x905A, 0xDF63, + 0x905B, 0xE5DE, 0x905C, 0xDF64, 0x905D, 0xDF65, 0x905E, 0xDF66, + 0x905F, 0xDF67, 0x9060, 0xDF68, 0x9061, 0xDF69, 0x9062, 0xE5DD, + 0x9063, 0xC7B2, 0x9064, 0xDF6A, 0x9065, 0xD2A3, 0x9066, 0xDF6B, + 0x9067, 0xDF6C, 0x9068, 0xE5DB, 0x9069, 0xDF6D, 0x906A, 0xDF6E, + 0x906B, 0xDF6F, 0x906C, 0xDF70, 0x906D, 0xD4E2, 0x906E, 0xD5DA, + 0x906F, 0xDF71, 0x9070, 0xDF72, 0x9071, 0xDF73, 0x9072, 0xDF74, + 0x9073, 0xDF75, 0x9074, 0xE5E0, 0x9075, 0xD7F1, 0x9076, 0xDF76, + 0x9077, 0xDF77, 0x9078, 0xDF78, 0x9079, 0xDF79, 0x907A, 0xDF7A, + 0x907B, 0xDF7B, 0x907C, 0xDF7C, 0x907D, 0xE5E1, 0x907E, 0xDF7D, + 0x907F, 0xB1DC, 0x9080, 0xD1FB, 0x9081, 0xDF7E, 0x9082, 0xE5E2, + 0x9083, 0xE5E4, 0x9084, 0xDF80, 0x9085, 0xDF81, 0x9086, 0xDF82, + 0x9087, 0xDF83, 0x9088, 0xE5E3, 0x9089, 0xDF84, 0x908A, 0xDF85, + 0x908B, 0xE5E5, 0x908C, 0xDF86, 0x908D, 0xDF87, 0x908E, 0xDF88, + 0x908F, 0xDF89, 0x9090, 0xDF8A, 0x9091, 0xD2D8, 0x9092, 0xDF8B, + 0x9093, 0xB5CB, 0x9094, 0xDF8C, 0x9095, 0xE7DF, 0x9096, 0xDF8D, + 0x9097, 0xDAF5, 0x9098, 0xDF8E, 0x9099, 0xDAF8, 0x909A, 0xDF8F, + 0x909B, 0xDAF6, 0x909C, 0xDF90, 0x909D, 0xDAF7, 0x909E, 0xDF91, + 0x909F, 0xDF92, 0x90A0, 0xDF93, 0x90A1, 0xDAFA, 0x90A2, 0xD0CF, + 0x90A3, 0xC4C7, 0x90A4, 0xDF94, 0x90A5, 0xDF95, 0x90A6, 0xB0EE, + 0x90A7, 0xDF96, 0x90A8, 0xDF97, 0x90A9, 0xDF98, 0x90AA, 0xD0B0, + 0x90AB, 0xDF99, 0x90AC, 0xDAF9, 0x90AD, 0xDF9A, 0x90AE, 0xD3CA, + 0x90AF, 0xBAAA, 0x90B0, 0xDBA2, 0x90B1, 0xC7F1, 0x90B2, 0xDF9B, + 0x90B3, 0xDAFC, 0x90B4, 0xDAFB, 0x90B5, 0xC9DB, 0x90B6, 0xDAFD, + 0x90B7, 0xDF9C, 0x90B8, 0xDBA1, 0x90B9, 0xD7DE, 0x90BA, 0xDAFE, + 0x90BB, 0xC1DA, 0x90BC, 0xDF9D, 0x90BD, 0xDF9E, 0x90BE, 0xDBA5, + 0x90BF, 0xDF9F, 0x90C0, 0xDFA0, 0x90C1, 0xD3F4, 0x90C2, 0xE040, + 0x90C3, 0xE041, 0x90C4, 0xDBA7, 0x90C5, 0xDBA4, 0x90C6, 0xE042, + 0x90C7, 0xDBA8, 0x90C8, 0xE043, 0x90C9, 0xE044, 0x90CA, 0xBDBC, + 0x90CB, 0xE045, 0x90CC, 0xE046, 0x90CD, 0xE047, 0x90CE, 0xC0C9, + 0x90CF, 0xDBA3, 0x90D0, 0xDBA6, 0x90D1, 0xD6A3, 0x90D2, 0xE048, + 0x90D3, 0xDBA9, 0x90D4, 0xE049, 0x90D5, 0xE04A, 0x90D6, 0xE04B, + 0x90D7, 0xDBAD, 0x90D8, 0xE04C, 0x90D9, 0xE04D, 0x90DA, 0xE04E, + 0x90DB, 0xDBAE, 0x90DC, 0xDBAC, 0x90DD, 0xBAC2, 0x90DE, 0xE04F, + 0x90DF, 0xE050, 0x90E0, 0xE051, 0x90E1, 0xBFA4, 0x90E2, 0xDBAB, + 0x90E3, 0xE052, 0x90E4, 0xE053, 0x90E5, 0xE054, 0x90E6, 0xDBAA, + 0x90E7, 0xD4C7, 0x90E8, 0xB2BF, 0x90E9, 0xE055, 0x90EA, 0xE056, + 0x90EB, 0xDBAF, 0x90EC, 0xE057, 0x90ED, 0xB9F9, 0x90EE, 0xE058, + 0x90EF, 0xDBB0, 0x90F0, 0xE059, 0x90F1, 0xE05A, 0x90F2, 0xE05B, + 0x90F3, 0xE05C, 0x90F4, 0xB3BB, 0x90F5, 0xE05D, 0x90F6, 0xE05E, + 0x90F7, 0xE05F, 0x90F8, 0xB5A6, 0x90F9, 0xE060, 0x90FA, 0xE061, + 0x90FB, 0xE062, 0x90FC, 0xE063, 0x90FD, 0xB6BC, 0x90FE, 0xDBB1, + 0x90FF, 0xE064, 0x9100, 0xE065, 0x9101, 0xE066, 0x9102, 0xB6F5, + 0x9103, 0xE067, 0x9104, 0xDBB2, 0x9105, 0xE068, 0x9106, 0xE069, + 0x9107, 0xE06A, 0x9108, 0xE06B, 0x9109, 0xE06C, 0x910A, 0xE06D, + 0x910B, 0xE06E, 0x910C, 0xE06F, 0x910D, 0xE070, 0x910E, 0xE071, + 0x910F, 0xE072, 0x9110, 0xE073, 0x9111, 0xE074, 0x9112, 0xE075, + 0x9113, 0xE076, 0x9114, 0xE077, 0x9115, 0xE078, 0x9116, 0xE079, + 0x9117, 0xE07A, 0x9118, 0xE07B, 0x9119, 0xB1C9, 0x911A, 0xE07C, + 0x911B, 0xE07D, 0x911C, 0xE07E, 0x911D, 0xE080, 0x911E, 0xDBB4, + 0x911F, 0xE081, 0x9120, 0xE082, 0x9121, 0xE083, 0x9122, 0xDBB3, + 0x9123, 0xDBB5, 0x9124, 0xE084, 0x9125, 0xE085, 0x9126, 0xE086, + 0x9127, 0xE087, 0x9128, 0xE088, 0x9129, 0xE089, 0x912A, 0xE08A, + 0x912B, 0xE08B, 0x912C, 0xE08C, 0x912D, 0xE08D, 0x912E, 0xE08E, + 0x912F, 0xDBB7, 0x9130, 0xE08F, 0x9131, 0xDBB6, 0x9132, 0xE090, + 0x9133, 0xE091, 0x9134, 0xE092, 0x9135, 0xE093, 0x9136, 0xE094, + 0x9137, 0xE095, 0x9138, 0xE096, 0x9139, 0xDBB8, 0x913A, 0xE097, + 0x913B, 0xE098, 0x913C, 0xE099, 0x913D, 0xE09A, 0x913E, 0xE09B, + 0x913F, 0xE09C, 0x9140, 0xE09D, 0x9141, 0xE09E, 0x9142, 0xE09F, + 0x9143, 0xDBB9, 0x9144, 0xE0A0, 0x9145, 0xE140, 0x9146, 0xDBBA, + 0x9147, 0xE141, 0x9148, 0xE142, 0x9149, 0xD3CF, 0x914A, 0xF4FA, + 0x914B, 0xC7F5, 0x914C, 0xD7C3, 0x914D, 0xC5E4, 0x914E, 0xF4FC, + 0x914F, 0xF4FD, 0x9150, 0xF4FB, 0x9151, 0xE143, 0x9152, 0xBEC6, + 0x9153, 0xE144, 0x9154, 0xE145, 0x9155, 0xE146, 0x9156, 0xE147, + 0x9157, 0xD0EF, 0x9158, 0xE148, 0x9159, 0xE149, 0x915A, 0xB7D3, + 0x915B, 0xE14A, 0x915C, 0xE14B, 0x915D, 0xD4CD, 0x915E, 0xCCAA, + 0x915F, 0xE14C, 0x9160, 0xE14D, 0x9161, 0xF5A2, 0x9162, 0xF5A1, + 0x9163, 0xBAA8, 0x9164, 0xF4FE, 0x9165, 0xCBD6, 0x9166, 0xE14E, + 0x9167, 0xE14F, 0x9168, 0xE150, 0x9169, 0xF5A4, 0x916A, 0xC0D2, + 0x916B, 0xE151, 0x916C, 0xB3EA, 0x916D, 0xE152, 0x916E, 0xCDAA, + 0x916F, 0xF5A5, 0x9170, 0xF5A3, 0x9171, 0xBDB4, 0x9172, 0xF5A8, + 0x9173, 0xE153, 0x9174, 0xF5A9, 0x9175, 0xBDCD, 0x9176, 0xC3B8, + 0x9177, 0xBFE1, 0x9178, 0xCBE1, 0x9179, 0xF5AA, 0x917A, 0xE154, + 0x917B, 0xE155, 0x917C, 0xE156, 0x917D, 0xF5A6, 0x917E, 0xF5A7, + 0x917F, 0xC4F0, 0x9180, 0xE157, 0x9181, 0xE158, 0x9182, 0xE159, + 0x9183, 0xE15A, 0x9184, 0xE15B, 0x9185, 0xF5AC, 0x9186, 0xE15C, + 0x9187, 0xB4BC, 0x9188, 0xE15D, 0x9189, 0xD7ED, 0x918A, 0xE15E, + 0x918B, 0xB4D7, 0x918C, 0xF5AB, 0x918D, 0xF5AE, 0x918E, 0xE15F, + 0x918F, 0xE160, 0x9190, 0xF5AD, 0x9191, 0xF5AF, 0x9192, 0xD0D1, + 0x9193, 0xE161, 0x9194, 0xE162, 0x9195, 0xE163, 0x9196, 0xE164, + 0x9197, 0xE165, 0x9198, 0xE166, 0x9199, 0xE167, 0x919A, 0xC3D1, + 0x919B, 0xC8A9, 0x919C, 0xE168, 0x919D, 0xE169, 0x919E, 0xE16A, + 0x919F, 0xE16B, 0x91A0, 0xE16C, 0x91A1, 0xE16D, 0x91A2, 0xF5B0, + 0x91A3, 0xF5B1, 0x91A4, 0xE16E, 0x91A5, 0xE16F, 0x91A6, 0xE170, + 0x91A7, 0xE171, 0x91A8, 0xE172, 0x91A9, 0xE173, 0x91AA, 0xF5B2, + 0x91AB, 0xE174, 0x91AC, 0xE175, 0x91AD, 0xF5B3, 0x91AE, 0xF5B4, + 0x91AF, 0xF5B5, 0x91B0, 0xE176, 0x91B1, 0xE177, 0x91B2, 0xE178, + 0x91B3, 0xE179, 0x91B4, 0xF5B7, 0x91B5, 0xF5B6, 0x91B6, 0xE17A, + 0x91B7, 0xE17B, 0x91B8, 0xE17C, 0x91B9, 0xE17D, 0x91BA, 0xF5B8, + 0x91BB, 0xE17E, 0x91BC, 0xE180, 0x91BD, 0xE181, 0x91BE, 0xE182, + 0x91BF, 0xE183, 0x91C0, 0xE184, 0x91C1, 0xE185, 0x91C2, 0xE186, + 0x91C3, 0xE187, 0x91C4, 0xE188, 0x91C5, 0xE189, 0x91C6, 0xE18A, + 0x91C7, 0xB2C9, 0x91C8, 0xE18B, 0x91C9, 0xD3D4, 0x91CA, 0xCACD, + 0x91CB, 0xE18C, 0x91CC, 0xC0EF, 0x91CD, 0xD6D8, 0x91CE, 0xD2B0, + 0x91CF, 0xC1BF, 0x91D0, 0xE18D, 0x91D1, 0xBDF0, 0x91D2, 0xE18E, + 0x91D3, 0xE18F, 0x91D4, 0xE190, 0x91D5, 0xE191, 0x91D6, 0xE192, + 0x91D7, 0xE193, 0x91D8, 0xE194, 0x91D9, 0xE195, 0x91DA, 0xE196, + 0x91DB, 0xE197, 0x91DC, 0xB8AA, 0x91DD, 0xE198, 0x91DE, 0xE199, + 0x91DF, 0xE19A, 0x91E0, 0xE19B, 0x91E1, 0xE19C, 0x91E2, 0xE19D, + 0x91E3, 0xE19E, 0x91E4, 0xE19F, 0x91E5, 0xE1A0, 0x91E6, 0xE240, + 0x91E7, 0xE241, 0x91E8, 0xE242, 0x91E9, 0xE243, 0x91EA, 0xE244, + 0x91EB, 0xE245, 0x91EC, 0xE246, 0x91ED, 0xE247, 0x91EE, 0xE248, + 0x91EF, 0xE249, 0x91F0, 0xE24A, 0x91F1, 0xE24B, 0x91F2, 0xE24C, + 0x91F3, 0xE24D, 0x91F4, 0xE24E, 0x91F5, 0xE24F, 0x91F6, 0xE250, + 0x91F7, 0xE251, 0x91F8, 0xE252, 0x91F9, 0xE253, 0x91FA, 0xE254, + 0x91FB, 0xE255, 0x91FC, 0xE256, 0x91FD, 0xE257, 0x91FE, 0xE258, + 0x91FF, 0xE259, 0x9200, 0xE25A, 0x9201, 0xE25B, 0x9202, 0xE25C, + 0x9203, 0xE25D, 0x9204, 0xE25E, 0x9205, 0xE25F, 0x9206, 0xE260, + 0x9207, 0xE261, 0x9208, 0xE262, 0x9209, 0xE263, 0x920A, 0xE264, + 0x920B, 0xE265, 0x920C, 0xE266, 0x920D, 0xE267, 0x920E, 0xE268, + 0x920F, 0xE269, 0x9210, 0xE26A, 0x9211, 0xE26B, 0x9212, 0xE26C, + 0x9213, 0xE26D, 0x9214, 0xE26E, 0x9215, 0xE26F, 0x9216, 0xE270, + 0x9217, 0xE271, 0x9218, 0xE272, 0x9219, 0xE273, 0x921A, 0xE274, + 0x921B, 0xE275, 0x921C, 0xE276, 0x921D, 0xE277, 0x921E, 0xE278, + 0x921F, 0xE279, 0x9220, 0xE27A, 0x9221, 0xE27B, 0x9222, 0xE27C, + 0x9223, 0xE27D, 0x9224, 0xE27E, 0x9225, 0xE280, 0x9226, 0xE281, + 0x9227, 0xE282, 0x9228, 0xE283, 0x9229, 0xE284, 0x922A, 0xE285, + 0x922B, 0xE286, 0x922C, 0xE287, 0x922D, 0xE288, 0x922E, 0xE289, + 0x922F, 0xE28A, 0x9230, 0xE28B, 0x9231, 0xE28C, 0x9232, 0xE28D, + 0x9233, 0xE28E, 0x9234, 0xE28F, 0x9235, 0xE290, 0x9236, 0xE291, + 0x9237, 0xE292, 0x9238, 0xE293, 0x9239, 0xE294, 0x923A, 0xE295, + 0x923B, 0xE296, 0x923C, 0xE297, 0x923D, 0xE298, 0x923E, 0xE299, + 0x923F, 0xE29A, 0x9240, 0xE29B, 0x9241, 0xE29C, 0x9242, 0xE29D, + 0x9243, 0xE29E, 0x9244, 0xE29F, 0x9245, 0xE2A0, 0x9246, 0xE340, + 0x9247, 0xE341, 0x9248, 0xE342, 0x9249, 0xE343, 0x924A, 0xE344, + 0x924B, 0xE345, 0x924C, 0xE346, 0x924D, 0xE347, 0x924E, 0xE348, + 0x924F, 0xE349, 0x9250, 0xE34A, 0x9251, 0xE34B, 0x9252, 0xE34C, + 0x9253, 0xE34D, 0x9254, 0xE34E, 0x9255, 0xE34F, 0x9256, 0xE350, + 0x9257, 0xE351, 0x9258, 0xE352, 0x9259, 0xE353, 0x925A, 0xE354, + 0x925B, 0xE355, 0x925C, 0xE356, 0x925D, 0xE357, 0x925E, 0xE358, + 0x925F, 0xE359, 0x9260, 0xE35A, 0x9261, 0xE35B, 0x9262, 0xE35C, + 0x9263, 0xE35D, 0x9264, 0xE35E, 0x9265, 0xE35F, 0x9266, 0xE360, + 0x9267, 0xE361, 0x9268, 0xE362, 0x9269, 0xE363, 0x926A, 0xE364, + 0x926B, 0xE365, 0x926C, 0xE366, 0x926D, 0xE367, 0x926E, 0xE368, + 0x926F, 0xE369, 0x9270, 0xE36A, 0x9271, 0xE36B, 0x9272, 0xE36C, + 0x9273, 0xE36D, 0x9274, 0xBCF8, 0x9275, 0xE36E, 0x9276, 0xE36F, + 0x9277, 0xE370, 0x9278, 0xE371, 0x9279, 0xE372, 0x927A, 0xE373, + 0x927B, 0xE374, 0x927C, 0xE375, 0x927D, 0xE376, 0x927E, 0xE377, + 0x927F, 0xE378, 0x9280, 0xE379, 0x9281, 0xE37A, 0x9282, 0xE37B, + 0x9283, 0xE37C, 0x9284, 0xE37D, 0x9285, 0xE37E, 0x9286, 0xE380, + 0x9287, 0xE381, 0x9288, 0xE382, 0x9289, 0xE383, 0x928A, 0xE384, + 0x928B, 0xE385, 0x928C, 0xE386, 0x928D, 0xE387, 0x928E, 0xF6C6, + 0x928F, 0xE388, 0x9290, 0xE389, 0x9291, 0xE38A, 0x9292, 0xE38B, + 0x9293, 0xE38C, 0x9294, 0xE38D, 0x9295, 0xE38E, 0x9296, 0xE38F, + 0x9297, 0xE390, 0x9298, 0xE391, 0x9299, 0xE392, 0x929A, 0xE393, + 0x929B, 0xE394, 0x929C, 0xE395, 0x929D, 0xE396, 0x929E, 0xE397, + 0x929F, 0xE398, 0x92A0, 0xE399, 0x92A1, 0xE39A, 0x92A2, 0xE39B, + 0x92A3, 0xE39C, 0x92A4, 0xE39D, 0x92A5, 0xE39E, 0x92A6, 0xE39F, + 0x92A7, 0xE3A0, 0x92A8, 0xE440, 0x92A9, 0xE441, 0x92AA, 0xE442, + 0x92AB, 0xE443, 0x92AC, 0xE444, 0x92AD, 0xE445, 0x92AE, 0xF6C7, + 0x92AF, 0xE446, 0x92B0, 0xE447, 0x92B1, 0xE448, 0x92B2, 0xE449, + 0x92B3, 0xE44A, 0x92B4, 0xE44B, 0x92B5, 0xE44C, 0x92B6, 0xE44D, + 0x92B7, 0xE44E, 0x92B8, 0xE44F, 0x92B9, 0xE450, 0x92BA, 0xE451, + 0x92BB, 0xE452, 0x92BC, 0xE453, 0x92BD, 0xE454, 0x92BE, 0xE455, + 0x92BF, 0xE456, 0x92C0, 0xE457, 0x92C1, 0xE458, 0x92C2, 0xE459, + 0x92C3, 0xE45A, 0x92C4, 0xE45B, 0x92C5, 0xE45C, 0x92C6, 0xE45D, + 0x92C7, 0xE45E, 0x92C8, 0xF6C8, 0x92C9, 0xE45F, 0x92CA, 0xE460, + 0x92CB, 0xE461, 0x92CC, 0xE462, 0x92CD, 0xE463, 0x92CE, 0xE464, + 0x92CF, 0xE465, 0x92D0, 0xE466, 0x92D1, 0xE467, 0x92D2, 0xE468, + 0x92D3, 0xE469, 0x92D4, 0xE46A, 0x92D5, 0xE46B, 0x92D6, 0xE46C, + 0x92D7, 0xE46D, 0x92D8, 0xE46E, 0x92D9, 0xE46F, 0x92DA, 0xE470, + 0x92DB, 0xE471, 0x92DC, 0xE472, 0x92DD, 0xE473, 0x92DE, 0xE474, + 0x92DF, 0xE475, 0x92E0, 0xE476, 0x92E1, 0xE477, 0x92E2, 0xE478, + 0x92E3, 0xE479, 0x92E4, 0xE47A, 0x92E5, 0xE47B, 0x92E6, 0xE47C, + 0x92E7, 0xE47D, 0x92E8, 0xE47E, 0x92E9, 0xE480, 0x92EA, 0xE481, + 0x92EB, 0xE482, 0x92EC, 0xE483, 0x92ED, 0xE484, 0x92EE, 0xE485, + 0x92EF, 0xE486, 0x92F0, 0xE487, 0x92F1, 0xE488, 0x92F2, 0xE489, + 0x92F3, 0xE48A, 0x92F4, 0xE48B, 0x92F5, 0xE48C, 0x92F6, 0xE48D, + 0x92F7, 0xE48E, 0x92F8, 0xE48F, 0x92F9, 0xE490, 0x92FA, 0xE491, + 0x92FB, 0xE492, 0x92FC, 0xE493, 0x92FD, 0xE494, 0x92FE, 0xE495, + 0x92FF, 0xE496, 0x9300, 0xE497, 0x9301, 0xE498, 0x9302, 0xE499, + 0x9303, 0xE49A, 0x9304, 0xE49B, 0x9305, 0xE49C, 0x9306, 0xE49D, + 0x9307, 0xE49E, 0x9308, 0xE49F, 0x9309, 0xE4A0, 0x930A, 0xE540, + 0x930B, 0xE541, 0x930C, 0xE542, 0x930D, 0xE543, 0x930E, 0xE544, + 0x930F, 0xE545, 0x9310, 0xE546, 0x9311, 0xE547, 0x9312, 0xE548, + 0x9313, 0xE549, 0x9314, 0xE54A, 0x9315, 0xE54B, 0x9316, 0xE54C, + 0x9317, 0xE54D, 0x9318, 0xE54E, 0x9319, 0xE54F, 0x931A, 0xE550, + 0x931B, 0xE551, 0x931C, 0xE552, 0x931D, 0xE553, 0x931E, 0xE554, + 0x931F, 0xE555, 0x9320, 0xE556, 0x9321, 0xE557, 0x9322, 0xE558, + 0x9323, 0xE559, 0x9324, 0xE55A, 0x9325, 0xE55B, 0x9326, 0xE55C, + 0x9327, 0xE55D, 0x9328, 0xE55E, 0x9329, 0xE55F, 0x932A, 0xE560, + 0x932B, 0xE561, 0x932C, 0xE562, 0x932D, 0xE563, 0x932E, 0xE564, + 0x932F, 0xE565, 0x9330, 0xE566, 0x9331, 0xE567, 0x9332, 0xE568, + 0x9333, 0xE569, 0x9334, 0xE56A, 0x9335, 0xE56B, 0x9336, 0xE56C, + 0x9337, 0xE56D, 0x9338, 0xE56E, 0x9339, 0xE56F, 0x933A, 0xE570, + 0x933B, 0xE571, 0x933C, 0xE572, 0x933D, 0xE573, 0x933E, 0xF6C9, + 0x933F, 0xE574, 0x9340, 0xE575, 0x9341, 0xE576, 0x9342, 0xE577, + 0x9343, 0xE578, 0x9344, 0xE579, 0x9345, 0xE57A, 0x9346, 0xE57B, + 0x9347, 0xE57C, 0x9348, 0xE57D, 0x9349, 0xE57E, 0x934A, 0xE580, + 0x934B, 0xE581, 0x934C, 0xE582, 0x934D, 0xE583, 0x934E, 0xE584, + 0x934F, 0xE585, 0x9350, 0xE586, 0x9351, 0xE587, 0x9352, 0xE588, + 0x9353, 0xE589, 0x9354, 0xE58A, 0x9355, 0xE58B, 0x9356, 0xE58C, + 0x9357, 0xE58D, 0x9358, 0xE58E, 0x9359, 0xE58F, 0x935A, 0xE590, + 0x935B, 0xE591, 0x935C, 0xE592, 0x935D, 0xE593, 0x935E, 0xE594, + 0x935F, 0xE595, 0x9360, 0xE596, 0x9361, 0xE597, 0x9362, 0xE598, + 0x9363, 0xE599, 0x9364, 0xE59A, 0x9365, 0xE59B, 0x9366, 0xE59C, + 0x9367, 0xE59D, 0x9368, 0xE59E, 0x9369, 0xE59F, 0x936A, 0xF6CA, + 0x936B, 0xE5A0, 0x936C, 0xE640, 0x936D, 0xE641, 0x936E, 0xE642, + 0x936F, 0xE643, 0x9370, 0xE644, 0x9371, 0xE645, 0x9372, 0xE646, + 0x9373, 0xE647, 0x9374, 0xE648, 0x9375, 0xE649, 0x9376, 0xE64A, + 0x9377, 0xE64B, 0x9378, 0xE64C, 0x9379, 0xE64D, 0x937A, 0xE64E, + 0x937B, 0xE64F, 0x937C, 0xE650, 0x937D, 0xE651, 0x937E, 0xE652, + 0x937F, 0xE653, 0x9380, 0xE654, 0x9381, 0xE655, 0x9382, 0xE656, + 0x9383, 0xE657, 0x9384, 0xE658, 0x9385, 0xE659, 0x9386, 0xE65A, + 0x9387, 0xE65B, 0x9388, 0xE65C, 0x9389, 0xE65D, 0x938A, 0xE65E, + 0x938B, 0xE65F, 0x938C, 0xE660, 0x938D, 0xE661, 0x938E, 0xE662, + 0x938F, 0xF6CC, 0x9390, 0xE663, 0x9391, 0xE664, 0x9392, 0xE665, + 0x9393, 0xE666, 0x9394, 0xE667, 0x9395, 0xE668, 0x9396, 0xE669, + 0x9397, 0xE66A, 0x9398, 0xE66B, 0x9399, 0xE66C, 0x939A, 0xE66D, + 0x939B, 0xE66E, 0x939C, 0xE66F, 0x939D, 0xE670, 0x939E, 0xE671, + 0x939F, 0xE672, 0x93A0, 0xE673, 0x93A1, 0xE674, 0x93A2, 0xE675, + 0x93A3, 0xE676, 0x93A4, 0xE677, 0x93A5, 0xE678, 0x93A6, 0xE679, + 0x93A7, 0xE67A, 0x93A8, 0xE67B, 0x93A9, 0xE67C, 0x93AA, 0xE67D, + 0x93AB, 0xE67E, 0x93AC, 0xE680, 0x93AD, 0xE681, 0x93AE, 0xE682, + 0x93AF, 0xE683, 0x93B0, 0xE684, 0x93B1, 0xE685, 0x93B2, 0xE686, + 0x93B3, 0xE687, 0x93B4, 0xE688, 0x93B5, 0xE689, 0x93B6, 0xE68A, + 0x93B7, 0xE68B, 0x93B8, 0xE68C, 0x93B9, 0xE68D, 0x93BA, 0xE68E, + 0x93BB, 0xE68F, 0x93BC, 0xE690, 0x93BD, 0xE691, 0x93BE, 0xE692, + 0x93BF, 0xE693, 0x93C0, 0xE694, 0x93C1, 0xE695, 0x93C2, 0xE696, + 0x93C3, 0xE697, 0x93C4, 0xE698, 0x93C5, 0xE699, 0x93C6, 0xE69A, + 0x93C7, 0xE69B, 0x93C8, 0xE69C, 0x93C9, 0xE69D, 0x93CA, 0xF6CB, + 0x93CB, 0xE69E, 0x93CC, 0xE69F, 0x93CD, 0xE6A0, 0x93CE, 0xE740, + 0x93CF, 0xE741, 0x93D0, 0xE742, 0x93D1, 0xE743, 0x93D2, 0xE744, + 0x93D3, 0xE745, 0x93D4, 0xE746, 0x93D5, 0xE747, 0x93D6, 0xF7E9, + 0x93D7, 0xE748, 0x93D8, 0xE749, 0x93D9, 0xE74A, 0x93DA, 0xE74B, + 0x93DB, 0xE74C, 0x93DC, 0xE74D, 0x93DD, 0xE74E, 0x93DE, 0xE74F, + 0x93DF, 0xE750, 0x93E0, 0xE751, 0x93E1, 0xE752, 0x93E2, 0xE753, + 0x93E3, 0xE754, 0x93E4, 0xE755, 0x93E5, 0xE756, 0x93E6, 0xE757, + 0x93E7, 0xE758, 0x93E8, 0xE759, 0x93E9, 0xE75A, 0x93EA, 0xE75B, + 0x93EB, 0xE75C, 0x93EC, 0xE75D, 0x93ED, 0xE75E, 0x93EE, 0xE75F, + 0x93EF, 0xE760, 0x93F0, 0xE761, 0x93F1, 0xE762, 0x93F2, 0xE763, + 0x93F3, 0xE764, 0x93F4, 0xE765, 0x93F5, 0xE766, 0x93F6, 0xE767, + 0x93F7, 0xE768, 0x93F8, 0xE769, 0x93F9, 0xE76A, 0x93FA, 0xE76B, + 0x93FB, 0xE76C, 0x93FC, 0xE76D, 0x93FD, 0xE76E, 0x93FE, 0xE76F, + 0x93FF, 0xE770, 0x9400, 0xE771, 0x9401, 0xE772, 0x9402, 0xE773, + 0x9403, 0xE774, 0x9404, 0xE775, 0x9405, 0xE776, 0x9406, 0xE777, + 0x9407, 0xE778, 0x9408, 0xE779, 0x9409, 0xE77A, 0x940A, 0xE77B, + 0x940B, 0xE77C, 0x940C, 0xE77D, 0x940D, 0xE77E, 0x940E, 0xE780, + 0x940F, 0xE781, 0x9410, 0xE782, 0x9411, 0xE783, 0x9412, 0xE784, + 0x9413, 0xE785, 0x9414, 0xE786, 0x9415, 0xE787, 0x9416, 0xE788, + 0x9417, 0xE789, 0x9418, 0xE78A, 0x9419, 0xE78B, 0x941A, 0xE78C, + 0x941B, 0xE78D, 0x941C, 0xE78E, 0x941D, 0xE78F, 0x941E, 0xE790, + 0x941F, 0xE791, 0x9420, 0xE792, 0x9421, 0xE793, 0x9422, 0xE794, + 0x9423, 0xE795, 0x9424, 0xE796, 0x9425, 0xE797, 0x9426, 0xE798, + 0x9427, 0xE799, 0x9428, 0xE79A, 0x9429, 0xE79B, 0x942A, 0xE79C, + 0x942B, 0xE79D, 0x942C, 0xE79E, 0x942D, 0xE79F, 0x942E, 0xE7A0, + 0x942F, 0xE840, 0x9430, 0xE841, 0x9431, 0xE842, 0x9432, 0xE843, + 0x9433, 0xE844, 0x9434, 0xE845, 0x9435, 0xE846, 0x9436, 0xE847, + 0x9437, 0xE848, 0x9438, 0xE849, 0x9439, 0xE84A, 0x943A, 0xE84B, + 0x943B, 0xE84C, 0x943C, 0xE84D, 0x943D, 0xE84E, 0x943E, 0xF6CD, + 0x943F, 0xE84F, 0x9440, 0xE850, 0x9441, 0xE851, 0x9442, 0xE852, + 0x9443, 0xE853, 0x9444, 0xE854, 0x9445, 0xE855, 0x9446, 0xE856, + 0x9447, 0xE857, 0x9448, 0xE858, 0x9449, 0xE859, 0x944A, 0xE85A, + 0x944B, 0xE85B, 0x944C, 0xE85C, 0x944D, 0xE85D, 0x944E, 0xE85E, + 0x944F, 0xE85F, 0x9450, 0xE860, 0x9451, 0xE861, 0x9452, 0xE862, + 0x9453, 0xE863, 0x9454, 0xE864, 0x9455, 0xE865, 0x9456, 0xE866, + 0x9457, 0xE867, 0x9458, 0xE868, 0x9459, 0xE869, 0x945A, 0xE86A, + 0x945B, 0xE86B, 0x945C, 0xE86C, 0x945D, 0xE86D, 0x945E, 0xE86E, + 0x945F, 0xE86F, 0x9460, 0xE870, 0x9461, 0xE871, 0x9462, 0xE872, + 0x9463, 0xE873, 0x9464, 0xE874, 0x9465, 0xE875, 0x9466, 0xE876, + 0x9467, 0xE877, 0x9468, 0xE878, 0x9469, 0xE879, 0x946A, 0xE87A, + 0x946B, 0xF6CE, 0x946C, 0xE87B, 0x946D, 0xE87C, 0x946E, 0xE87D, + 0x946F, 0xE87E, 0x9470, 0xE880, 0x9471, 0xE881, 0x9472, 0xE882, + 0x9473, 0xE883, 0x9474, 0xE884, 0x9475, 0xE885, 0x9476, 0xE886, + 0x9477, 0xE887, 0x9478, 0xE888, 0x9479, 0xE889, 0x947A, 0xE88A, + 0x947B, 0xE88B, 0x947C, 0xE88C, 0x947D, 0xE88D, 0x947E, 0xE88E, + 0x947F, 0xE88F, 0x9480, 0xE890, 0x9481, 0xE891, 0x9482, 0xE892, + 0x9483, 0xE893, 0x9484, 0xE894, 0x9485, 0xEEC4, 0x9486, 0xEEC5, + 0x9487, 0xEEC6, 0x9488, 0xD5EB, 0x9489, 0xB6A4, 0x948A, 0xEEC8, + 0x948B, 0xEEC7, 0x948C, 0xEEC9, 0x948D, 0xEECA, 0x948E, 0xC7A5, + 0x948F, 0xEECB, 0x9490, 0xEECC, 0x9491, 0xE895, 0x9492, 0xB7B0, + 0x9493, 0xB5F6, 0x9494, 0xEECD, 0x9495, 0xEECF, 0x9496, 0xE896, + 0x9497, 0xEECE, 0x9498, 0xE897, 0x9499, 0xB8C6, 0x949A, 0xEED0, + 0x949B, 0xEED1, 0x949C, 0xEED2, 0x949D, 0xB6DB, 0x949E, 0xB3AE, + 0x949F, 0xD6D3, 0x94A0, 0xC4C6, 0x94A1, 0xB1B5, 0x94A2, 0xB8D6, + 0x94A3, 0xEED3, 0x94A4, 0xEED4, 0x94A5, 0xD4BF, 0x94A6, 0xC7D5, + 0x94A7, 0xBEFB, 0x94A8, 0xCED9, 0x94A9, 0xB9B3, 0x94AA, 0xEED6, + 0x94AB, 0xEED5, 0x94AC, 0xEED8, 0x94AD, 0xEED7, 0x94AE, 0xC5A5, + 0x94AF, 0xEED9, 0x94B0, 0xEEDA, 0x94B1, 0xC7AE, 0x94B2, 0xEEDB, + 0x94B3, 0xC7AF, 0x94B4, 0xEEDC, 0x94B5, 0xB2A7, 0x94B6, 0xEEDD, + 0x94B7, 0xEEDE, 0x94B8, 0xEEDF, 0x94B9, 0xEEE0, 0x94BA, 0xEEE1, + 0x94BB, 0xD7EA, 0x94BC, 0xEEE2, 0x94BD, 0xEEE3, 0x94BE, 0xBCD8, + 0x94BF, 0xEEE4, 0x94C0, 0xD3CB, 0x94C1, 0xCCFA, 0x94C2, 0xB2AC, + 0x94C3, 0xC1E5, 0x94C4, 0xEEE5, 0x94C5, 0xC7A6, 0x94C6, 0xC3AD, + 0x94C7, 0xE898, 0x94C8, 0xEEE6, 0x94C9, 0xEEE7, 0x94CA, 0xEEE8, + 0x94CB, 0xEEE9, 0x94CC, 0xEEEA, 0x94CD, 0xEEEB, 0x94CE, 0xEEEC, + 0x94CF, 0xE899, 0x94D0, 0xEEED, 0x94D1, 0xEEEE, 0x94D2, 0xEEEF, + 0x94D3, 0xE89A, 0x94D4, 0xE89B, 0x94D5, 0xEEF0, 0x94D6, 0xEEF1, + 0x94D7, 0xEEF2, 0x94D8, 0xEEF4, 0x94D9, 0xEEF3, 0x94DA, 0xE89C, + 0x94DB, 0xEEF5, 0x94DC, 0xCDAD, 0x94DD, 0xC2C1, 0x94DE, 0xEEF6, + 0x94DF, 0xEEF7, 0x94E0, 0xEEF8, 0x94E1, 0xD5A1, 0x94E2, 0xEEF9, + 0x94E3, 0xCFB3, 0x94E4, 0xEEFA, 0x94E5, 0xEEFB, 0x94E6, 0xE89D, + 0x94E7, 0xEEFC, 0x94E8, 0xEEFD, 0x94E9, 0xEFA1, 0x94EA, 0xEEFE, + 0x94EB, 0xEFA2, 0x94EC, 0xB8F5, 0x94ED, 0xC3FA, 0x94EE, 0xEFA3, + 0x94EF, 0xEFA4, 0x94F0, 0xBDC2, 0x94F1, 0xD2BF, 0x94F2, 0xB2F9, + 0x94F3, 0xEFA5, 0x94F4, 0xEFA6, 0x94F5, 0xEFA7, 0x94F6, 0xD2F8, + 0x94F7, 0xEFA8, 0x94F8, 0xD6FD, 0x94F9, 0xEFA9, 0x94FA, 0xC6CC, + 0x94FB, 0xE89E, 0x94FC, 0xEFAA, 0x94FD, 0xEFAB, 0x94FE, 0xC1B4, + 0x94FF, 0xEFAC, 0x9500, 0xCFFA, 0x9501, 0xCBF8, 0x9502, 0xEFAE, + 0x9503, 0xEFAD, 0x9504, 0xB3FA, 0x9505, 0xB9F8, 0x9506, 0xEFAF, + 0x9507, 0xEFB0, 0x9508, 0xD0E2, 0x9509, 0xEFB1, 0x950A, 0xEFB2, + 0x950B, 0xB7E6, 0x950C, 0xD0BF, 0x950D, 0xEFB3, 0x950E, 0xEFB4, + 0x950F, 0xEFB5, 0x9510, 0xC8F1, 0x9511, 0xCCE0, 0x9512, 0xEFB6, + 0x9513, 0xEFB7, 0x9514, 0xEFB8, 0x9515, 0xEFB9, 0x9516, 0xEFBA, + 0x9517, 0xD5E0, 0x9518, 0xEFBB, 0x9519, 0xB4ED, 0x951A, 0xC3AA, + 0x951B, 0xEFBC, 0x951C, 0xE89F, 0x951D, 0xEFBD, 0x951E, 0xEFBE, + 0x951F, 0xEFBF, 0x9520, 0xE8A0, 0x9521, 0xCEFD, 0x9522, 0xEFC0, + 0x9523, 0xC2E0, 0x9524, 0xB4B8, 0x9525, 0xD7B6, 0x9526, 0xBDF5, + 0x9527, 0xE940, 0x9528, 0xCFC7, 0x9529, 0xEFC3, 0x952A, 0xEFC1, + 0x952B, 0xEFC2, 0x952C, 0xEFC4, 0x952D, 0xB6A7, 0x952E, 0xBCFC, + 0x952F, 0xBEE2, 0x9530, 0xC3CC, 0x9531, 0xEFC5, 0x9532, 0xEFC6, + 0x9533, 0xE941, 0x9534, 0xEFC7, 0x9535, 0xEFCF, 0x9536, 0xEFC8, + 0x9537, 0xEFC9, 0x9538, 0xEFCA, 0x9539, 0xC7C2, 0x953A, 0xEFF1, + 0x953B, 0xB6CD, 0x953C, 0xEFCB, 0x953D, 0xE942, 0x953E, 0xEFCC, + 0x953F, 0xEFCD, 0x9540, 0xB6C6, 0x9541, 0xC3BE, 0x9542, 0xEFCE, + 0x9543, 0xE943, 0x9544, 0xEFD0, 0x9545, 0xEFD1, 0x9546, 0xEFD2, + 0x9547, 0xD5F2, 0x9548, 0xE944, 0x9549, 0xEFD3, 0x954A, 0xC4F7, + 0x954B, 0xE945, 0x954C, 0xEFD4, 0x954D, 0xC4F8, 0x954E, 0xEFD5, + 0x954F, 0xEFD6, 0x9550, 0xB8E4, 0x9551, 0xB0F7, 0x9552, 0xEFD7, + 0x9553, 0xEFD8, 0x9554, 0xEFD9, 0x9555, 0xE946, 0x9556, 0xEFDA, + 0x9557, 0xEFDB, 0x9558, 0xEFDC, 0x9559, 0xEFDD, 0x955A, 0xE947, + 0x955B, 0xEFDE, 0x955C, 0xBEB5, 0x955D, 0xEFE1, 0x955E, 0xEFDF, + 0x955F, 0xEFE0, 0x9560, 0xE948, 0x9561, 0xEFE2, 0x9562, 0xEFE3, + 0x9563, 0xC1CD, 0x9564, 0xEFE4, 0x9565, 0xEFE5, 0x9566, 0xEFE6, + 0x9567, 0xEFE7, 0x9568, 0xEFE8, 0x9569, 0xEFE9, 0x956A, 0xEFEA, + 0x956B, 0xEFEB, 0x956C, 0xEFEC, 0x956D, 0xC0D8, 0x956E, 0xE949, + 0x956F, 0xEFED, 0x9570, 0xC1AD, 0x9571, 0xEFEE, 0x9572, 0xEFEF, + 0x9573, 0xEFF0, 0x9574, 0xE94A, 0x9575, 0xE94B, 0x9576, 0xCFE2, + 0x9577, 0xE94C, 0x9578, 0xE94D, 0x9579, 0xE94E, 0x957A, 0xE94F, + 0x957B, 0xE950, 0x957C, 0xE951, 0x957D, 0xE952, 0x957E, 0xE953, + 0x957F, 0xB3A4, 0x9580, 0xE954, 0x9581, 0xE955, 0x9582, 0xE956, + 0x9583, 0xE957, 0x9584, 0xE958, 0x9585, 0xE959, 0x9586, 0xE95A, + 0x9587, 0xE95B, 0x9588, 0xE95C, 0x9589, 0xE95D, 0x958A, 0xE95E, + 0x958B, 0xE95F, 0x958C, 0xE960, 0x958D, 0xE961, 0x958E, 0xE962, + 0x958F, 0xE963, 0x9590, 0xE964, 0x9591, 0xE965, 0x9592, 0xE966, + 0x9593, 0xE967, 0x9594, 0xE968, 0x9595, 0xE969, 0x9596, 0xE96A, + 0x9597, 0xE96B, 0x9598, 0xE96C, 0x9599, 0xE96D, 0x959A, 0xE96E, + 0x959B, 0xE96F, 0x959C, 0xE970, 0x959D, 0xE971, 0x959E, 0xE972, + 0x959F, 0xE973, 0x95A0, 0xE974, 0x95A1, 0xE975, 0x95A2, 0xE976, + 0x95A3, 0xE977, 0x95A4, 0xE978, 0x95A5, 0xE979, 0x95A6, 0xE97A, + 0x95A7, 0xE97B, 0x95A8, 0xE97C, 0x95A9, 0xE97D, 0x95AA, 0xE97E, + 0x95AB, 0xE980, 0x95AC, 0xE981, 0x95AD, 0xE982, 0x95AE, 0xE983, + 0x95AF, 0xE984, 0x95B0, 0xE985, 0x95B1, 0xE986, 0x95B2, 0xE987, + 0x95B3, 0xE988, 0x95B4, 0xE989, 0x95B5, 0xE98A, 0x95B6, 0xE98B, + 0x95B7, 0xE98C, 0x95B8, 0xE98D, 0x95B9, 0xE98E, 0x95BA, 0xE98F, + 0x95BB, 0xE990, 0x95BC, 0xE991, 0x95BD, 0xE992, 0x95BE, 0xE993, + 0x95BF, 0xE994, 0x95C0, 0xE995, 0x95C1, 0xE996, 0x95C2, 0xE997, + 0x95C3, 0xE998, 0x95C4, 0xE999, 0x95C5, 0xE99A, 0x95C6, 0xE99B, + 0x95C7, 0xE99C, 0x95C8, 0xE99D, 0x95C9, 0xE99E, 0x95CA, 0xE99F, + 0x95CB, 0xE9A0, 0x95CC, 0xEA40, 0x95CD, 0xEA41, 0x95CE, 0xEA42, + 0x95CF, 0xEA43, 0x95D0, 0xEA44, 0x95D1, 0xEA45, 0x95D2, 0xEA46, + 0x95D3, 0xEA47, 0x95D4, 0xEA48, 0x95D5, 0xEA49, 0x95D6, 0xEA4A, + 0x95D7, 0xEA4B, 0x95D8, 0xEA4C, 0x95D9, 0xEA4D, 0x95DA, 0xEA4E, + 0x95DB, 0xEA4F, 0x95DC, 0xEA50, 0x95DD, 0xEA51, 0x95DE, 0xEA52, + 0x95DF, 0xEA53, 0x95E0, 0xEA54, 0x95E1, 0xEA55, 0x95E2, 0xEA56, + 0x95E3, 0xEA57, 0x95E4, 0xEA58, 0x95E5, 0xEA59, 0x95E6, 0xEA5A, + 0x95E7, 0xEA5B, 0x95E8, 0xC3C5, 0x95E9, 0xE3C5, 0x95EA, 0xC9C1, + 0x95EB, 0xE3C6, 0x95EC, 0xEA5C, 0x95ED, 0xB1D5, 0x95EE, 0xCECA, + 0x95EF, 0xB4B3, 0x95F0, 0xC8F2, 0x95F1, 0xE3C7, 0x95F2, 0xCFD0, + 0x95F3, 0xE3C8, 0x95F4, 0xBCE4, 0x95F5, 0xE3C9, 0x95F6, 0xE3CA, + 0x95F7, 0xC3C6, 0x95F8, 0xD5A2, 0x95F9, 0xC4D6, 0x95FA, 0xB9EB, + 0x95FB, 0xCEC5, 0x95FC, 0xE3CB, 0x95FD, 0xC3F6, 0x95FE, 0xE3CC, + 0x95FF, 0xEA5D, 0x9600, 0xB7A7, 0x9601, 0xB8F3, 0x9602, 0xBAD2, + 0x9603, 0xE3CD, 0x9604, 0xE3CE, 0x9605, 0xD4C4, 0x9606, 0xE3CF, + 0x9607, 0xEA5E, 0x9608, 0xE3D0, 0x9609, 0xD1CB, 0x960A, 0xE3D1, + 0x960B, 0xE3D2, 0x960C, 0xE3D3, 0x960D, 0xE3D4, 0x960E, 0xD1D6, + 0x960F, 0xE3D5, 0x9610, 0xB2FB, 0x9611, 0xC0BB, 0x9612, 0xE3D6, + 0x9613, 0xEA5F, 0x9614, 0xC0AB, 0x9615, 0xE3D7, 0x9616, 0xE3D8, + 0x9617, 0xE3D9, 0x9618, 0xEA60, 0x9619, 0xE3DA, 0x961A, 0xE3DB, + 0x961B, 0xEA61, 0x961C, 0xB8B7, 0x961D, 0xDAE2, 0x961E, 0xEA62, + 0x961F, 0xB6D3, 0x9620, 0xEA63, 0x9621, 0xDAE4, 0x9622, 0xDAE3, + 0x9623, 0xEA64, 0x9624, 0xEA65, 0x9625, 0xEA66, 0x9626, 0xEA67, + 0x9627, 0xEA68, 0x9628, 0xEA69, 0x9629, 0xEA6A, 0x962A, 0xDAE6, + 0x962B, 0xEA6B, 0x962C, 0xEA6C, 0x962D, 0xEA6D, 0x962E, 0xC8EE, + 0x962F, 0xEA6E, 0x9630, 0xEA6F, 0x9631, 0xDAE5, 0x9632, 0xB7C0, + 0x9633, 0xD1F4, 0x9634, 0xD2F5, 0x9635, 0xD5F3, 0x9636, 0xBDD7, + 0x9637, 0xEA70, 0x9638, 0xEA71, 0x9639, 0xEA72, 0x963A, 0xEA73, + 0x963B, 0xD7E8, 0x963C, 0xDAE8, 0x963D, 0xDAE7, 0x963E, 0xEA74, + 0x963F, 0xB0A2, 0x9640, 0xCDD3, 0x9641, 0xEA75, 0x9642, 0xDAE9, + 0x9643, 0xEA76, 0x9644, 0xB8BD, 0x9645, 0xBCCA, 0x9646, 0xC2BD, + 0x9647, 0xC2A4, 0x9648, 0xB3C2, 0x9649, 0xDAEA, 0x964A, 0xEA77, + 0x964B, 0xC2AA, 0x964C, 0xC4B0, 0x964D, 0xBDB5, 0x964E, 0xEA78, + 0x964F, 0xEA79, 0x9650, 0xCFDE, 0x9651, 0xEA7A, 0x9652, 0xEA7B, + 0x9653, 0xEA7C, 0x9654, 0xDAEB, 0x9655, 0xC9C2, 0x9656, 0xEA7D, + 0x9657, 0xEA7E, 0x9658, 0xEA80, 0x9659, 0xEA81, 0x965A, 0xEA82, + 0x965B, 0xB1DD, 0x965C, 0xEA83, 0x965D, 0xEA84, 0x965E, 0xEA85, + 0x965F, 0xDAEC, 0x9660, 0xEA86, 0x9661, 0xB6B8, 0x9662, 0xD4BA, + 0x9663, 0xEA87, 0x9664, 0xB3FD, 0x9665, 0xEA88, 0x9666, 0xEA89, + 0x9667, 0xDAED, 0x9668, 0xD4C9, 0x9669, 0xCFD5, 0x966A, 0xC5E3, + 0x966B, 0xEA8A, 0x966C, 0xDAEE, 0x966D, 0xEA8B, 0x966E, 0xEA8C, + 0x966F, 0xEA8D, 0x9670, 0xEA8E, 0x9671, 0xEA8F, 0x9672, 0xDAEF, + 0x9673, 0xEA90, 0x9674, 0xDAF0, 0x9675, 0xC1EA, 0x9676, 0xCCD5, + 0x9677, 0xCFDD, 0x9678, 0xEA91, 0x9679, 0xEA92, 0x967A, 0xEA93, + 0x967B, 0xEA94, 0x967C, 0xEA95, 0x967D, 0xEA96, 0x967E, 0xEA97, + 0x967F, 0xEA98, 0x9680, 0xEA99, 0x9681, 0xEA9A, 0x9682, 0xEA9B, + 0x9683, 0xEA9C, 0x9684, 0xEA9D, 0x9685, 0xD3E7, 0x9686, 0xC2A1, + 0x9687, 0xEA9E, 0x9688, 0xDAF1, 0x9689, 0xEA9F, 0x968A, 0xEAA0, + 0x968B, 0xCBE5, 0x968C, 0xEB40, 0x968D, 0xDAF2, 0x968E, 0xEB41, + 0x968F, 0xCBE6, 0x9690, 0xD2FE, 0x9691, 0xEB42, 0x9692, 0xEB43, + 0x9693, 0xEB44, 0x9694, 0xB8F4, 0x9695, 0xEB45, 0x9696, 0xEB46, + 0x9697, 0xDAF3, 0x9698, 0xB0AF, 0x9699, 0xCFB6, 0x969A, 0xEB47, + 0x969B, 0xEB48, 0x969C, 0xD5CF, 0x969D, 0xEB49, 0x969E, 0xEB4A, + 0x969F, 0xEB4B, 0x96A0, 0xEB4C, 0x96A1, 0xEB4D, 0x96A2, 0xEB4E, + 0x96A3, 0xEB4F, 0x96A4, 0xEB50, 0x96A5, 0xEB51, 0x96A6, 0xEB52, + 0x96A7, 0xCBED, 0x96A8, 0xEB53, 0x96A9, 0xEB54, 0x96AA, 0xEB55, + 0x96AB, 0xEB56, 0x96AC, 0xEB57, 0x96AD, 0xEB58, 0x96AE, 0xEB59, + 0x96AF, 0xEB5A, 0x96B0, 0xDAF4, 0x96B1, 0xEB5B, 0x96B2, 0xEB5C, + 0x96B3, 0xE3C4, 0x96B4, 0xEB5D, 0x96B5, 0xEB5E, 0x96B6, 0xC1A5, + 0x96B7, 0xEB5F, 0x96B8, 0xEB60, 0x96B9, 0xF6BF, 0x96BA, 0xEB61, + 0x96BB, 0xEB62, 0x96BC, 0xF6C0, 0x96BD, 0xF6C1, 0x96BE, 0xC4D1, + 0x96BF, 0xEB63, 0x96C0, 0xC8B8, 0x96C1, 0xD1E3, 0x96C2, 0xEB64, + 0x96C3, 0xEB65, 0x96C4, 0xD0DB, 0x96C5, 0xD1C5, 0x96C6, 0xBCAF, + 0x96C7, 0xB9CD, 0x96C8, 0xEB66, 0x96C9, 0xEFF4, 0x96CA, 0xEB67, + 0x96CB, 0xEB68, 0x96CC, 0xB4C6, 0x96CD, 0xD3BA, 0x96CE, 0xF6C2, + 0x96CF, 0xB3FB, 0x96D0, 0xEB69, 0x96D1, 0xEB6A, 0x96D2, 0xF6C3, + 0x96D3, 0xEB6B, 0x96D4, 0xEB6C, 0x96D5, 0xB5F1, 0x96D6, 0xEB6D, + 0x96D7, 0xEB6E, 0x96D8, 0xEB6F, 0x96D9, 0xEB70, 0x96DA, 0xEB71, + 0x96DB, 0xEB72, 0x96DC, 0xEB73, 0x96DD, 0xEB74, 0x96DE, 0xEB75, + 0x96DF, 0xEB76, 0x96E0, 0xF6C5, 0x96E1, 0xEB77, 0x96E2, 0xEB78, + 0x96E3, 0xEB79, 0x96E4, 0xEB7A, 0x96E5, 0xEB7B, 0x96E6, 0xEB7C, + 0x96E7, 0xEB7D, 0x96E8, 0xD3EA, 0x96E9, 0xF6A7, 0x96EA, 0xD1A9, + 0x96EB, 0xEB7E, 0x96EC, 0xEB80, 0x96ED, 0xEB81, 0x96EE, 0xEB82, + 0x96EF, 0xF6A9, 0x96F0, 0xEB83, 0x96F1, 0xEB84, 0x96F2, 0xEB85, + 0x96F3, 0xF6A8, 0x96F4, 0xEB86, 0x96F5, 0xEB87, 0x96F6, 0xC1E3, + 0x96F7, 0xC0D7, 0x96F8, 0xEB88, 0x96F9, 0xB1A2, 0x96FA, 0xEB89, + 0x96FB, 0xEB8A, 0x96FC, 0xEB8B, 0x96FD, 0xEB8C, 0x96FE, 0xCEED, + 0x96FF, 0xEB8D, 0x9700, 0xD0E8, 0x9701, 0xF6AB, 0x9702, 0xEB8E, + 0x9703, 0xEB8F, 0x9704, 0xCFF6, 0x9705, 0xEB90, 0x9706, 0xF6AA, + 0x9707, 0xD5F0, 0x9708, 0xF6AC, 0x9709, 0xC3B9, 0x970A, 0xEB91, + 0x970B, 0xEB92, 0x970C, 0xEB93, 0x970D, 0xBBF4, 0x970E, 0xF6AE, + 0x970F, 0xF6AD, 0x9710, 0xEB94, 0x9711, 0xEB95, 0x9712, 0xEB96, + 0x9713, 0xC4DE, 0x9714, 0xEB97, 0x9715, 0xEB98, 0x9716, 0xC1D8, + 0x9717, 0xEB99, 0x9718, 0xEB9A, 0x9719, 0xEB9B, 0x971A, 0xEB9C, + 0x971B, 0xEB9D, 0x971C, 0xCBAA, 0x971D, 0xEB9E, 0x971E, 0xCFBC, + 0x971F, 0xEB9F, 0x9720, 0xEBA0, 0x9721, 0xEC40, 0x9722, 0xEC41, + 0x9723, 0xEC42, 0x9724, 0xEC43, 0x9725, 0xEC44, 0x9726, 0xEC45, + 0x9727, 0xEC46, 0x9728, 0xEC47, 0x9729, 0xEC48, 0x972A, 0xF6AF, + 0x972B, 0xEC49, 0x972C, 0xEC4A, 0x972D, 0xF6B0, 0x972E, 0xEC4B, + 0x972F, 0xEC4C, 0x9730, 0xF6B1, 0x9731, 0xEC4D, 0x9732, 0xC2B6, + 0x9733, 0xEC4E, 0x9734, 0xEC4F, 0x9735, 0xEC50, 0x9736, 0xEC51, + 0x9737, 0xEC52, 0x9738, 0xB0D4, 0x9739, 0xC5F9, 0x973A, 0xEC53, + 0x973B, 0xEC54, 0x973C, 0xEC55, 0x973D, 0xEC56, 0x973E, 0xF6B2, + 0x973F, 0xEC57, 0x9740, 0xEC58, 0x9741, 0xEC59, 0x9742, 0xEC5A, + 0x9743, 0xEC5B, 0x9744, 0xEC5C, 0x9745, 0xEC5D, 0x9746, 0xEC5E, + 0x9747, 0xEC5F, 0x9748, 0xEC60, 0x9749, 0xEC61, 0x974A, 0xEC62, + 0x974B, 0xEC63, 0x974C, 0xEC64, 0x974D, 0xEC65, 0x974E, 0xEC66, + 0x974F, 0xEC67, 0x9750, 0xEC68, 0x9751, 0xEC69, 0x9752, 0xC7E0, + 0x9753, 0xF6A6, 0x9754, 0xEC6A, 0x9755, 0xEC6B, 0x9756, 0xBEB8, + 0x9757, 0xEC6C, 0x9758, 0xEC6D, 0x9759, 0xBEB2, 0x975A, 0xEC6E, + 0x975B, 0xB5E5, 0x975C, 0xEC6F, 0x975D, 0xEC70, 0x975E, 0xB7C7, + 0x975F, 0xEC71, 0x9760, 0xBFBF, 0x9761, 0xC3D2, 0x9762, 0xC3E6, + 0x9763, 0xEC72, 0x9764, 0xEC73, 0x9765, 0xD8CC, 0x9766, 0xEC74, + 0x9767, 0xEC75, 0x9768, 0xEC76, 0x9769, 0xB8EF, 0x976A, 0xEC77, + 0x976B, 0xEC78, 0x976C, 0xEC79, 0x976D, 0xEC7A, 0x976E, 0xEC7B, + 0x976F, 0xEC7C, 0x9770, 0xEC7D, 0x9771, 0xEC7E, 0x9772, 0xEC80, + 0x9773, 0xBDF9, 0x9774, 0xD1A5, 0x9775, 0xEC81, 0x9776, 0xB0D0, + 0x9777, 0xEC82, 0x9778, 0xEC83, 0x9779, 0xEC84, 0x977A, 0xEC85, + 0x977B, 0xEC86, 0x977C, 0xF7B0, 0x977D, 0xEC87, 0x977E, 0xEC88, + 0x977F, 0xEC89, 0x9780, 0xEC8A, 0x9781, 0xEC8B, 0x9782, 0xEC8C, + 0x9783, 0xEC8D, 0x9784, 0xEC8E, 0x9785, 0xF7B1, 0x9786, 0xEC8F, + 0x9787, 0xEC90, 0x9788, 0xEC91, 0x9789, 0xEC92, 0x978A, 0xEC93, + 0x978B, 0xD0AC, 0x978C, 0xEC94, 0x978D, 0xB0B0, 0x978E, 0xEC95, + 0x978F, 0xEC96, 0x9790, 0xEC97, 0x9791, 0xF7B2, 0x9792, 0xF7B3, + 0x9793, 0xEC98, 0x9794, 0xF7B4, 0x9795, 0xEC99, 0x9796, 0xEC9A, + 0x9797, 0xEC9B, 0x9798, 0xC7CA, 0x9799, 0xEC9C, 0x979A, 0xEC9D, + 0x979B, 0xEC9E, 0x979C, 0xEC9F, 0x979D, 0xECA0, 0x979E, 0xED40, + 0x979F, 0xED41, 0x97A0, 0xBECF, 0x97A1, 0xED42, 0x97A2, 0xED43, + 0x97A3, 0xF7B7, 0x97A4, 0xED44, 0x97A5, 0xED45, 0x97A6, 0xED46, + 0x97A7, 0xED47, 0x97A8, 0xED48, 0x97A9, 0xED49, 0x97AA, 0xED4A, + 0x97AB, 0xF7B6, 0x97AC, 0xED4B, 0x97AD, 0xB1DE, 0x97AE, 0xED4C, + 0x97AF, 0xF7B5, 0x97B0, 0xED4D, 0x97B1, 0xED4E, 0x97B2, 0xF7B8, + 0x97B3, 0xED4F, 0x97B4, 0xF7B9, 0x97B5, 0xED50, 0x97B6, 0xED51, + 0x97B7, 0xED52, 0x97B8, 0xED53, 0x97B9, 0xED54, 0x97BA, 0xED55, + 0x97BB, 0xED56, 0x97BC, 0xED57, 0x97BD, 0xED58, 0x97BE, 0xED59, + 0x97BF, 0xED5A, 0x97C0, 0xED5B, 0x97C1, 0xED5C, 0x97C2, 0xED5D, + 0x97C3, 0xED5E, 0x97C4, 0xED5F, 0x97C5, 0xED60, 0x97C6, 0xED61, + 0x97C7, 0xED62, 0x97C8, 0xED63, 0x97C9, 0xED64, 0x97CA, 0xED65, + 0x97CB, 0xED66, 0x97CC, 0xED67, 0x97CD, 0xED68, 0x97CE, 0xED69, + 0x97CF, 0xED6A, 0x97D0, 0xED6B, 0x97D1, 0xED6C, 0x97D2, 0xED6D, + 0x97D3, 0xED6E, 0x97D4, 0xED6F, 0x97D5, 0xED70, 0x97D6, 0xED71, + 0x97D7, 0xED72, 0x97D8, 0xED73, 0x97D9, 0xED74, 0x97DA, 0xED75, + 0x97DB, 0xED76, 0x97DC, 0xED77, 0x97DD, 0xED78, 0x97DE, 0xED79, + 0x97DF, 0xED7A, 0x97E0, 0xED7B, 0x97E1, 0xED7C, 0x97E2, 0xED7D, + 0x97E3, 0xED7E, 0x97E4, 0xED80, 0x97E5, 0xED81, 0x97E6, 0xCEA4, + 0x97E7, 0xC8CD, 0x97E8, 0xED82, 0x97E9, 0xBAAB, 0x97EA, 0xE8B8, + 0x97EB, 0xE8B9, 0x97EC, 0xE8BA, 0x97ED, 0xBEC2, 0x97EE, 0xED83, + 0x97EF, 0xED84, 0x97F0, 0xED85, 0x97F1, 0xED86, 0x97F2, 0xED87, + 0x97F3, 0xD2F4, 0x97F4, 0xED88, 0x97F5, 0xD4CF, 0x97F6, 0xC9D8, + 0x97F7, 0xED89, 0x97F8, 0xED8A, 0x97F9, 0xED8B, 0x97FA, 0xED8C, + 0x97FB, 0xED8D, 0x97FC, 0xED8E, 0x97FD, 0xED8F, 0x97FE, 0xED90, + 0x97FF, 0xED91, 0x9800, 0xED92, 0x9801, 0xED93, 0x9802, 0xED94, + 0x9803, 0xED95, 0x9804, 0xED96, 0x9805, 0xED97, 0x9806, 0xED98, + 0x9807, 0xED99, 0x9808, 0xED9A, 0x9809, 0xED9B, 0x980A, 0xED9C, + 0x980B, 0xED9D, 0x980C, 0xED9E, 0x980D, 0xED9F, 0x980E, 0xEDA0, + 0x980F, 0xEE40, 0x9810, 0xEE41, 0x9811, 0xEE42, 0x9812, 0xEE43, + 0x9813, 0xEE44, 0x9814, 0xEE45, 0x9815, 0xEE46, 0x9816, 0xEE47, + 0x9817, 0xEE48, 0x9818, 0xEE49, 0x9819, 0xEE4A, 0x981A, 0xEE4B, + 0x981B, 0xEE4C, 0x981C, 0xEE4D, 0x981D, 0xEE4E, 0x981E, 0xEE4F, + 0x981F, 0xEE50, 0x9820, 0xEE51, 0x9821, 0xEE52, 0x9822, 0xEE53, + 0x9823, 0xEE54, 0x9824, 0xEE55, 0x9825, 0xEE56, 0x9826, 0xEE57, + 0x9827, 0xEE58, 0x9828, 0xEE59, 0x9829, 0xEE5A, 0x982A, 0xEE5B, + 0x982B, 0xEE5C, 0x982C, 0xEE5D, 0x982D, 0xEE5E, 0x982E, 0xEE5F, + 0x982F, 0xEE60, 0x9830, 0xEE61, 0x9831, 0xEE62, 0x9832, 0xEE63, + 0x9833, 0xEE64, 0x9834, 0xEE65, 0x9835, 0xEE66, 0x9836, 0xEE67, + 0x9837, 0xEE68, 0x9838, 0xEE69, 0x9839, 0xEE6A, 0x983A, 0xEE6B, + 0x983B, 0xEE6C, 0x983C, 0xEE6D, 0x983D, 0xEE6E, 0x983E, 0xEE6F, + 0x983F, 0xEE70, 0x9840, 0xEE71, 0x9841, 0xEE72, 0x9842, 0xEE73, + 0x9843, 0xEE74, 0x9844, 0xEE75, 0x9845, 0xEE76, 0x9846, 0xEE77, + 0x9847, 0xEE78, 0x9848, 0xEE79, 0x9849, 0xEE7A, 0x984A, 0xEE7B, + 0x984B, 0xEE7C, 0x984C, 0xEE7D, 0x984D, 0xEE7E, 0x984E, 0xEE80, + 0x984F, 0xEE81, 0x9850, 0xEE82, 0x9851, 0xEE83, 0x9852, 0xEE84, + 0x9853, 0xEE85, 0x9854, 0xEE86, 0x9855, 0xEE87, 0x9856, 0xEE88, + 0x9857, 0xEE89, 0x9858, 0xEE8A, 0x9859, 0xEE8B, 0x985A, 0xEE8C, + 0x985B, 0xEE8D, 0x985C, 0xEE8E, 0x985D, 0xEE8F, 0x985E, 0xEE90, + 0x985F, 0xEE91, 0x9860, 0xEE92, 0x9861, 0xEE93, 0x9862, 0xEE94, + 0x9863, 0xEE95, 0x9864, 0xEE96, 0x9865, 0xEE97, 0x9866, 0xEE98, + 0x9867, 0xEE99, 0x9868, 0xEE9A, 0x9869, 0xEE9B, 0x986A, 0xEE9C, + 0x986B, 0xEE9D, 0x986C, 0xEE9E, 0x986D, 0xEE9F, 0x986E, 0xEEA0, + 0x986F, 0xEF40, 0x9870, 0xEF41, 0x9871, 0xEF42, 0x9872, 0xEF43, + 0x9873, 0xEF44, 0x9874, 0xEF45, 0x9875, 0xD2B3, 0x9876, 0xB6A5, + 0x9877, 0xC7EA, 0x9878, 0xF1FC, 0x9879, 0xCFEE, 0x987A, 0xCBB3, + 0x987B, 0xD0EB, 0x987C, 0xE7EF, 0x987D, 0xCDE7, 0x987E, 0xB9CB, + 0x987F, 0xB6D9, 0x9880, 0xF1FD, 0x9881, 0xB0E4, 0x9882, 0xCBCC, + 0x9883, 0xF1FE, 0x9884, 0xD4A4, 0x9885, 0xC2AD, 0x9886, 0xC1EC, + 0x9887, 0xC6C4, 0x9888, 0xBEB1, 0x9889, 0xF2A1, 0x988A, 0xBCD5, + 0x988B, 0xEF46, 0x988C, 0xF2A2, 0x988D, 0xF2A3, 0x988E, 0xEF47, + 0x988F, 0xF2A4, 0x9890, 0xD2C3, 0x9891, 0xC6B5, 0x9892, 0xEF48, + 0x9893, 0xCDC7, 0x9894, 0xF2A5, 0x9895, 0xEF49, 0x9896, 0xD3B1, + 0x9897, 0xBFC5, 0x9898, 0xCCE2, 0x9899, 0xEF4A, 0x989A, 0xF2A6, + 0x989B, 0xF2A7, 0x989C, 0xD1D5, 0x989D, 0xB6EE, 0x989E, 0xF2A8, + 0x989F, 0xF2A9, 0x98A0, 0xB5DF, 0x98A1, 0xF2AA, 0x98A2, 0xF2AB, + 0x98A3, 0xEF4B, 0x98A4, 0xB2FC, 0x98A5, 0xF2AC, 0x98A6, 0xF2AD, + 0x98A7, 0xC8A7, 0x98A8, 0xEF4C, 0x98A9, 0xEF4D, 0x98AA, 0xEF4E, + 0x98AB, 0xEF4F, 0x98AC, 0xEF50, 0x98AD, 0xEF51, 0x98AE, 0xEF52, + 0x98AF, 0xEF53, 0x98B0, 0xEF54, 0x98B1, 0xEF55, 0x98B2, 0xEF56, + 0x98B3, 0xEF57, 0x98B4, 0xEF58, 0x98B5, 0xEF59, 0x98B6, 0xEF5A, + 0x98B7, 0xEF5B, 0x98B8, 0xEF5C, 0x98B9, 0xEF5D, 0x98BA, 0xEF5E, + 0x98BB, 0xEF5F, 0x98BC, 0xEF60, 0x98BD, 0xEF61, 0x98BE, 0xEF62, + 0x98BF, 0xEF63, 0x98C0, 0xEF64, 0x98C1, 0xEF65, 0x98C2, 0xEF66, + 0x98C3, 0xEF67, 0x98C4, 0xEF68, 0x98C5, 0xEF69, 0x98C6, 0xEF6A, + 0x98C7, 0xEF6B, 0x98C8, 0xEF6C, 0x98C9, 0xEF6D, 0x98CA, 0xEF6E, + 0x98CB, 0xEF6F, 0x98CC, 0xEF70, 0x98CD, 0xEF71, 0x98CE, 0xB7E7, + 0x98CF, 0xEF72, 0x98D0, 0xEF73, 0x98D1, 0xECA9, 0x98D2, 0xECAA, + 0x98D3, 0xECAB, 0x98D4, 0xEF74, 0x98D5, 0xECAC, 0x98D6, 0xEF75, + 0x98D7, 0xEF76, 0x98D8, 0xC6AE, 0x98D9, 0xECAD, 0x98DA, 0xECAE, + 0x98DB, 0xEF77, 0x98DC, 0xEF78, 0x98DD, 0xEF79, 0x98DE, 0xB7C9, + 0x98DF, 0xCAB3, 0x98E0, 0xEF7A, 0x98E1, 0xEF7B, 0x98E2, 0xEF7C, + 0x98E3, 0xEF7D, 0x98E4, 0xEF7E, 0x98E5, 0xEF80, 0x98E6, 0xEF81, + 0x98E7, 0xE2B8, 0x98E8, 0xF7CF, 0x98E9, 0xEF82, 0x98EA, 0xEF83, + 0x98EB, 0xEF84, 0x98EC, 0xEF85, 0x98ED, 0xEF86, 0x98EE, 0xEF87, + 0x98EF, 0xEF88, 0x98F0, 0xEF89, 0x98F1, 0xEF8A, 0x98F2, 0xEF8B, + 0x98F3, 0xEF8C, 0x98F4, 0xEF8D, 0x98F5, 0xEF8E, 0x98F6, 0xEF8F, + 0x98F7, 0xEF90, 0x98F8, 0xEF91, 0x98F9, 0xEF92, 0x98FA, 0xEF93, + 0x98FB, 0xEF94, 0x98FC, 0xEF95, 0x98FD, 0xEF96, 0x98FE, 0xEF97, + 0x98FF, 0xEF98, 0x9900, 0xEF99, 0x9901, 0xEF9A, 0x9902, 0xEF9B, + 0x9903, 0xEF9C, 0x9904, 0xEF9D, 0x9905, 0xEF9E, 0x9906, 0xEF9F, + 0x9907, 0xEFA0, 0x9908, 0xF040, 0x9909, 0xF041, 0x990A, 0xF042, + 0x990B, 0xF043, 0x990C, 0xF044, 0x990D, 0xF7D0, 0x990E, 0xF045, + 0x990F, 0xF046, 0x9910, 0xB2CD, 0x9911, 0xF047, 0x9912, 0xF048, + 0x9913, 0xF049, 0x9914, 0xF04A, 0x9915, 0xF04B, 0x9916, 0xF04C, + 0x9917, 0xF04D, 0x9918, 0xF04E, 0x9919, 0xF04F, 0x991A, 0xF050, + 0x991B, 0xF051, 0x991C, 0xF052, 0x991D, 0xF053, 0x991E, 0xF054, + 0x991F, 0xF055, 0x9920, 0xF056, 0x9921, 0xF057, 0x9922, 0xF058, + 0x9923, 0xF059, 0x9924, 0xF05A, 0x9925, 0xF05B, 0x9926, 0xF05C, + 0x9927, 0xF05D, 0x9928, 0xF05E, 0x9929, 0xF05F, 0x992A, 0xF060, + 0x992B, 0xF061, 0x992C, 0xF062, 0x992D, 0xF063, 0x992E, 0xF7D1, + 0x992F, 0xF064, 0x9930, 0xF065, 0x9931, 0xF066, 0x9932, 0xF067, + 0x9933, 0xF068, 0x9934, 0xF069, 0x9935, 0xF06A, 0x9936, 0xF06B, + 0x9937, 0xF06C, 0x9938, 0xF06D, 0x9939, 0xF06E, 0x993A, 0xF06F, + 0x993B, 0xF070, 0x993C, 0xF071, 0x993D, 0xF072, 0x993E, 0xF073, + 0x993F, 0xF074, 0x9940, 0xF075, 0x9941, 0xF076, 0x9942, 0xF077, + 0x9943, 0xF078, 0x9944, 0xF079, 0x9945, 0xF07A, 0x9946, 0xF07B, + 0x9947, 0xF07C, 0x9948, 0xF07D, 0x9949, 0xF07E, 0x994A, 0xF080, + 0x994B, 0xF081, 0x994C, 0xF082, 0x994D, 0xF083, 0x994E, 0xF084, + 0x994F, 0xF085, 0x9950, 0xF086, 0x9951, 0xF087, 0x9952, 0xF088, + 0x9953, 0xF089, 0x9954, 0xF7D3, 0x9955, 0xF7D2, 0x9956, 0xF08A, + 0x9957, 0xF08B, 0x9958, 0xF08C, 0x9959, 0xF08D, 0x995A, 0xF08E, + 0x995B, 0xF08F, 0x995C, 0xF090, 0x995D, 0xF091, 0x995E, 0xF092, + 0x995F, 0xF093, 0x9960, 0xF094, 0x9961, 0xF095, 0x9962, 0xF096, + 0x9963, 0xE2BB, 0x9964, 0xF097, 0x9965, 0xBCA2, 0x9966, 0xF098, + 0x9967, 0xE2BC, 0x9968, 0xE2BD, 0x9969, 0xE2BE, 0x996A, 0xE2BF, + 0x996B, 0xE2C0, 0x996C, 0xE2C1, 0x996D, 0xB7B9, 0x996E, 0xD2FB, + 0x996F, 0xBDA4, 0x9970, 0xCACE, 0x9971, 0xB1A5, 0x9972, 0xCBC7, + 0x9973, 0xF099, 0x9974, 0xE2C2, 0x9975, 0xB6FC, 0x9976, 0xC8C4, + 0x9977, 0xE2C3, 0x9978, 0xF09A, 0x9979, 0xF09B, 0x997A, 0xBDC8, + 0x997B, 0xF09C, 0x997C, 0xB1FD, 0x997D, 0xE2C4, 0x997E, 0xF09D, + 0x997F, 0xB6F6, 0x9980, 0xE2C5, 0x9981, 0xC4D9, 0x9982, 0xF09E, + 0x9983, 0xF09F, 0x9984, 0xE2C6, 0x9985, 0xCFDA, 0x9986, 0xB9DD, + 0x9987, 0xE2C7, 0x9988, 0xC0A1, 0x9989, 0xF0A0, 0x998A, 0xE2C8, + 0x998B, 0xB2F6, 0x998C, 0xF140, 0x998D, 0xE2C9, 0x998E, 0xF141, + 0x998F, 0xC1F3, 0x9990, 0xE2CA, 0x9991, 0xE2CB, 0x9992, 0xC2F8, + 0x9993, 0xE2CC, 0x9994, 0xE2CD, 0x9995, 0xE2CE, 0x9996, 0xCAD7, + 0x9997, 0xD8B8, 0x9998, 0xD9E5, 0x9999, 0xCFE3, 0x999A, 0xF142, + 0x999B, 0xF143, 0x999C, 0xF144, 0x999D, 0xF145, 0x999E, 0xF146, + 0x999F, 0xF147, 0x99A0, 0xF148, 0x99A1, 0xF149, 0x99A2, 0xF14A, + 0x99A3, 0xF14B, 0x99A4, 0xF14C, 0x99A5, 0xF0A5, 0x99A6, 0xF14D, + 0x99A7, 0xF14E, 0x99A8, 0xDCB0, 0x99A9, 0xF14F, 0x99AA, 0xF150, + 0x99AB, 0xF151, 0x99AC, 0xF152, 0x99AD, 0xF153, 0x99AE, 0xF154, + 0x99AF, 0xF155, 0x99B0, 0xF156, 0x99B1, 0xF157, 0x99B2, 0xF158, + 0x99B3, 0xF159, 0x99B4, 0xF15A, 0x99B5, 0xF15B, 0x99B6, 0xF15C, + 0x99B7, 0xF15D, 0x99B8, 0xF15E, 0x99B9, 0xF15F, 0x99BA, 0xF160, + 0x99BB, 0xF161, 0x99BC, 0xF162, 0x99BD, 0xF163, 0x99BE, 0xF164, + 0x99BF, 0xF165, 0x99C0, 0xF166, 0x99C1, 0xF167, 0x99C2, 0xF168, + 0x99C3, 0xF169, 0x99C4, 0xF16A, 0x99C5, 0xF16B, 0x99C6, 0xF16C, + 0x99C7, 0xF16D, 0x99C8, 0xF16E, 0x99C9, 0xF16F, 0x99CA, 0xF170, + 0x99CB, 0xF171, 0x99CC, 0xF172, 0x99CD, 0xF173, 0x99CE, 0xF174, + 0x99CF, 0xF175, 0x99D0, 0xF176, 0x99D1, 0xF177, 0x99D2, 0xF178, + 0x99D3, 0xF179, 0x99D4, 0xF17A, 0x99D5, 0xF17B, 0x99D6, 0xF17C, + 0x99D7, 0xF17D, 0x99D8, 0xF17E, 0x99D9, 0xF180, 0x99DA, 0xF181, + 0x99DB, 0xF182, 0x99DC, 0xF183, 0x99DD, 0xF184, 0x99DE, 0xF185, + 0x99DF, 0xF186, 0x99E0, 0xF187, 0x99E1, 0xF188, 0x99E2, 0xF189, + 0x99E3, 0xF18A, 0x99E4, 0xF18B, 0x99E5, 0xF18C, 0x99E6, 0xF18D, + 0x99E7, 0xF18E, 0x99E8, 0xF18F, 0x99E9, 0xF190, 0x99EA, 0xF191, + 0x99EB, 0xF192, 0x99EC, 0xF193, 0x99ED, 0xF194, 0x99EE, 0xF195, + 0x99EF, 0xF196, 0x99F0, 0xF197, 0x99F1, 0xF198, 0x99F2, 0xF199, + 0x99F3, 0xF19A, 0x99F4, 0xF19B, 0x99F5, 0xF19C, 0x99F6, 0xF19D, + 0x99F7, 0xF19E, 0x99F8, 0xF19F, 0x99F9, 0xF1A0, 0x99FA, 0xF240, + 0x99FB, 0xF241, 0x99FC, 0xF242, 0x99FD, 0xF243, 0x99FE, 0xF244, + 0x99FF, 0xF245, 0x9A00, 0xF246, 0x9A01, 0xF247, 0x9A02, 0xF248, + 0x9A03, 0xF249, 0x9A04, 0xF24A, 0x9A05, 0xF24B, 0x9A06, 0xF24C, + 0x9A07, 0xF24D, 0x9A08, 0xF24E, 0x9A09, 0xF24F, 0x9A0A, 0xF250, + 0x9A0B, 0xF251, 0x9A0C, 0xF252, 0x9A0D, 0xF253, 0x9A0E, 0xF254, + 0x9A0F, 0xF255, 0x9A10, 0xF256, 0x9A11, 0xF257, 0x9A12, 0xF258, + 0x9A13, 0xF259, 0x9A14, 0xF25A, 0x9A15, 0xF25B, 0x9A16, 0xF25C, + 0x9A17, 0xF25D, 0x9A18, 0xF25E, 0x9A19, 0xF25F, 0x9A1A, 0xF260, + 0x9A1B, 0xF261, 0x9A1C, 0xF262, 0x9A1D, 0xF263, 0x9A1E, 0xF264, + 0x9A1F, 0xF265, 0x9A20, 0xF266, 0x9A21, 0xF267, 0x9A22, 0xF268, + 0x9A23, 0xF269, 0x9A24, 0xF26A, 0x9A25, 0xF26B, 0x9A26, 0xF26C, + 0x9A27, 0xF26D, 0x9A28, 0xF26E, 0x9A29, 0xF26F, 0x9A2A, 0xF270, + 0x9A2B, 0xF271, 0x9A2C, 0xF272, 0x9A2D, 0xF273, 0x9A2E, 0xF274, + 0x9A2F, 0xF275, 0x9A30, 0xF276, 0x9A31, 0xF277, 0x9A32, 0xF278, + 0x9A33, 0xF279, 0x9A34, 0xF27A, 0x9A35, 0xF27B, 0x9A36, 0xF27C, + 0x9A37, 0xF27D, 0x9A38, 0xF27E, 0x9A39, 0xF280, 0x9A3A, 0xF281, + 0x9A3B, 0xF282, 0x9A3C, 0xF283, 0x9A3D, 0xF284, 0x9A3E, 0xF285, + 0x9A3F, 0xF286, 0x9A40, 0xF287, 0x9A41, 0xF288, 0x9A42, 0xF289, + 0x9A43, 0xF28A, 0x9A44, 0xF28B, 0x9A45, 0xF28C, 0x9A46, 0xF28D, + 0x9A47, 0xF28E, 0x9A48, 0xF28F, 0x9A49, 0xF290, 0x9A4A, 0xF291, + 0x9A4B, 0xF292, 0x9A4C, 0xF293, 0x9A4D, 0xF294, 0x9A4E, 0xF295, + 0x9A4F, 0xF296, 0x9A50, 0xF297, 0x9A51, 0xF298, 0x9A52, 0xF299, + 0x9A53, 0xF29A, 0x9A54, 0xF29B, 0x9A55, 0xF29C, 0x9A56, 0xF29D, + 0x9A57, 0xF29E, 0x9A58, 0xF29F, 0x9A59, 0xF2A0, 0x9A5A, 0xF340, + 0x9A5B, 0xF341, 0x9A5C, 0xF342, 0x9A5D, 0xF343, 0x9A5E, 0xF344, + 0x9A5F, 0xF345, 0x9A60, 0xF346, 0x9A61, 0xF347, 0x9A62, 0xF348, + 0x9A63, 0xF349, 0x9A64, 0xF34A, 0x9A65, 0xF34B, 0x9A66, 0xF34C, + 0x9A67, 0xF34D, 0x9A68, 0xF34E, 0x9A69, 0xF34F, 0x9A6A, 0xF350, + 0x9A6B, 0xF351, 0x9A6C, 0xC2ED, 0x9A6D, 0xD4A6, 0x9A6E, 0xCDD4, + 0x9A6F, 0xD1B1, 0x9A70, 0xB3DB, 0x9A71, 0xC7FD, 0x9A72, 0xF352, + 0x9A73, 0xB2B5, 0x9A74, 0xC2BF, 0x9A75, 0xE6E0, 0x9A76, 0xCABB, + 0x9A77, 0xE6E1, 0x9A78, 0xE6E2, 0x9A79, 0xBED4, 0x9A7A, 0xE6E3, + 0x9A7B, 0xD7A4, 0x9A7C, 0xCDD5, 0x9A7D, 0xE6E5, 0x9A7E, 0xBCDD, + 0x9A7F, 0xE6E4, 0x9A80, 0xE6E6, 0x9A81, 0xE6E7, 0x9A82, 0xC2EE, + 0x9A83, 0xF353, 0x9A84, 0xBDBE, 0x9A85, 0xE6E8, 0x9A86, 0xC2E6, + 0x9A87, 0xBAA7, 0x9A88, 0xE6E9, 0x9A89, 0xF354, 0x9A8A, 0xE6EA, + 0x9A8B, 0xB3D2, 0x9A8C, 0xD1E9, 0x9A8D, 0xF355, 0x9A8E, 0xF356, + 0x9A8F, 0xBFA5, 0x9A90, 0xE6EB, 0x9A91, 0xC6EF, 0x9A92, 0xE6EC, + 0x9A93, 0xE6ED, 0x9A94, 0xF357, 0x9A95, 0xF358, 0x9A96, 0xE6EE, + 0x9A97, 0xC6AD, 0x9A98, 0xE6EF, 0x9A99, 0xF359, 0x9A9A, 0xC9A7, + 0x9A9B, 0xE6F0, 0x9A9C, 0xE6F1, 0x9A9D, 0xE6F2, 0x9A9E, 0xE5B9, + 0x9A9F, 0xE6F3, 0x9AA0, 0xE6F4, 0x9AA1, 0xC2E2, 0x9AA2, 0xE6F5, + 0x9AA3, 0xE6F6, 0x9AA4, 0xD6E8, 0x9AA5, 0xE6F7, 0x9AA6, 0xF35A, + 0x9AA7, 0xE6F8, 0x9AA8, 0xB9C7, 0x9AA9, 0xF35B, 0x9AAA, 0xF35C, + 0x9AAB, 0xF35D, 0x9AAC, 0xF35E, 0x9AAD, 0xF35F, 0x9AAE, 0xF360, + 0x9AAF, 0xF361, 0x9AB0, 0xF7BB, 0x9AB1, 0xF7BA, 0x9AB2, 0xF362, + 0x9AB3, 0xF363, 0x9AB4, 0xF364, 0x9AB5, 0xF365, 0x9AB6, 0xF7BE, + 0x9AB7, 0xF7BC, 0x9AB8, 0xBAA1, 0x9AB9, 0xF366, 0x9ABA, 0xF7BF, + 0x9ABB, 0xF367, 0x9ABC, 0xF7C0, 0x9ABD, 0xF368, 0x9ABE, 0xF369, + 0x9ABF, 0xF36A, 0x9AC0, 0xF7C2, 0x9AC1, 0xF7C1, 0x9AC2, 0xF7C4, + 0x9AC3, 0xF36B, 0x9AC4, 0xF36C, 0x9AC5, 0xF7C3, 0x9AC6, 0xF36D, + 0x9AC7, 0xF36E, 0x9AC8, 0xF36F, 0x9AC9, 0xF370, 0x9ACA, 0xF371, + 0x9ACB, 0xF7C5, 0x9ACC, 0xF7C6, 0x9ACD, 0xF372, 0x9ACE, 0xF373, + 0x9ACF, 0xF374, 0x9AD0, 0xF375, 0x9AD1, 0xF7C7, 0x9AD2, 0xF376, + 0x9AD3, 0xCBE8, 0x9AD4, 0xF377, 0x9AD5, 0xF378, 0x9AD6, 0xF379, + 0x9AD7, 0xF37A, 0x9AD8, 0xB8DF, 0x9AD9, 0xF37B, 0x9ADA, 0xF37C, + 0x9ADB, 0xF37D, 0x9ADC, 0xF37E, 0x9ADD, 0xF380, 0x9ADE, 0xF381, + 0x9ADF, 0xF7D4, 0x9AE0, 0xF382, 0x9AE1, 0xF7D5, 0x9AE2, 0xF383, + 0x9AE3, 0xF384, 0x9AE4, 0xF385, 0x9AE5, 0xF386, 0x9AE6, 0xF7D6, + 0x9AE7, 0xF387, 0x9AE8, 0xF388, 0x9AE9, 0xF389, 0x9AEA, 0xF38A, + 0x9AEB, 0xF7D8, 0x9AEC, 0xF38B, 0x9AED, 0xF7DA, 0x9AEE, 0xF38C, + 0x9AEF, 0xF7D7, 0x9AF0, 0xF38D, 0x9AF1, 0xF38E, 0x9AF2, 0xF38F, + 0x9AF3, 0xF390, 0x9AF4, 0xF391, 0x9AF5, 0xF392, 0x9AF6, 0xF393, + 0x9AF7, 0xF394, 0x9AF8, 0xF395, 0x9AF9, 0xF7DB, 0x9AFA, 0xF396, + 0x9AFB, 0xF7D9, 0x9AFC, 0xF397, 0x9AFD, 0xF398, 0x9AFE, 0xF399, + 0x9AFF, 0xF39A, 0x9B00, 0xF39B, 0x9B01, 0xF39C, 0x9B02, 0xF39D, + 0x9B03, 0xD7D7, 0x9B04, 0xF39E, 0x9B05, 0xF39F, 0x9B06, 0xF3A0, + 0x9B07, 0xF440, 0x9B08, 0xF7DC, 0x9B09, 0xF441, 0x9B0A, 0xF442, + 0x9B0B, 0xF443, 0x9B0C, 0xF444, 0x9B0D, 0xF445, 0x9B0E, 0xF446, + 0x9B0F, 0xF7DD, 0x9B10, 0xF447, 0x9B11, 0xF448, 0x9B12, 0xF449, + 0x9B13, 0xF7DE, 0x9B14, 0xF44A, 0x9B15, 0xF44B, 0x9B16, 0xF44C, + 0x9B17, 0xF44D, 0x9B18, 0xF44E, 0x9B19, 0xF44F, 0x9B1A, 0xF450, + 0x9B1B, 0xF451, 0x9B1C, 0xF452, 0x9B1D, 0xF453, 0x9B1E, 0xF454, + 0x9B1F, 0xF7DF, 0x9B20, 0xF455, 0x9B21, 0xF456, 0x9B22, 0xF457, + 0x9B23, 0xF7E0, 0x9B24, 0xF458, 0x9B25, 0xF459, 0x9B26, 0xF45A, + 0x9B27, 0xF45B, 0x9B28, 0xF45C, 0x9B29, 0xF45D, 0x9B2A, 0xF45E, + 0x9B2B, 0xF45F, 0x9B2C, 0xF460, 0x9B2D, 0xF461, 0x9B2E, 0xF462, + 0x9B2F, 0xDBCB, 0x9B30, 0xF463, 0x9B31, 0xF464, 0x9B32, 0xD8AA, + 0x9B33, 0xF465, 0x9B34, 0xF466, 0x9B35, 0xF467, 0x9B36, 0xF468, + 0x9B37, 0xF469, 0x9B38, 0xF46A, 0x9B39, 0xF46B, 0x9B3A, 0xF46C, + 0x9B3B, 0xE5F7, 0x9B3C, 0xB9ED, 0x9B3D, 0xF46D, 0x9B3E, 0xF46E, + 0x9B3F, 0xF46F, 0x9B40, 0xF470, 0x9B41, 0xBFFD, 0x9B42, 0xBBEA, + 0x9B43, 0xF7C9, 0x9B44, 0xC6C7, 0x9B45, 0xF7C8, 0x9B46, 0xF471, + 0x9B47, 0xF7CA, 0x9B48, 0xF7CC, 0x9B49, 0xF7CB, 0x9B4A, 0xF472, + 0x9B4B, 0xF473, 0x9B4C, 0xF474, 0x9B4D, 0xF7CD, 0x9B4E, 0xF475, + 0x9B4F, 0xCEBA, 0x9B50, 0xF476, 0x9B51, 0xF7CE, 0x9B52, 0xF477, + 0x9B53, 0xF478, 0x9B54, 0xC4A7, 0x9B55, 0xF479, 0x9B56, 0xF47A, + 0x9B57, 0xF47B, 0x9B58, 0xF47C, 0x9B59, 0xF47D, 0x9B5A, 0xF47E, + 0x9B5B, 0xF480, 0x9B5C, 0xF481, 0x9B5D, 0xF482, 0x9B5E, 0xF483, + 0x9B5F, 0xF484, 0x9B60, 0xF485, 0x9B61, 0xF486, 0x9B62, 0xF487, + 0x9B63, 0xF488, 0x9B64, 0xF489, 0x9B65, 0xF48A, 0x9B66, 0xF48B, + 0x9B67, 0xF48C, 0x9B68, 0xF48D, 0x9B69, 0xF48E, 0x9B6A, 0xF48F, + 0x9B6B, 0xF490, 0x9B6C, 0xF491, 0x9B6D, 0xF492, 0x9B6E, 0xF493, + 0x9B6F, 0xF494, 0x9B70, 0xF495, 0x9B71, 0xF496, 0x9B72, 0xF497, + 0x9B73, 0xF498, 0x9B74, 0xF499, 0x9B75, 0xF49A, 0x9B76, 0xF49B, + 0x9B77, 0xF49C, 0x9B78, 0xF49D, 0x9B79, 0xF49E, 0x9B7A, 0xF49F, + 0x9B7B, 0xF4A0, 0x9B7C, 0xF540, 0x9B7D, 0xF541, 0x9B7E, 0xF542, + 0x9B7F, 0xF543, 0x9B80, 0xF544, 0x9B81, 0xF545, 0x9B82, 0xF546, + 0x9B83, 0xF547, 0x9B84, 0xF548, 0x9B85, 0xF549, 0x9B86, 0xF54A, + 0x9B87, 0xF54B, 0x9B88, 0xF54C, 0x9B89, 0xF54D, 0x9B8A, 0xF54E, + 0x9B8B, 0xF54F, 0x9B8C, 0xF550, 0x9B8D, 0xF551, 0x9B8E, 0xF552, + 0x9B8F, 0xF553, 0x9B90, 0xF554, 0x9B91, 0xF555, 0x9B92, 0xF556, + 0x9B93, 0xF557, 0x9B94, 0xF558, 0x9B95, 0xF559, 0x9B96, 0xF55A, + 0x9B97, 0xF55B, 0x9B98, 0xF55C, 0x9B99, 0xF55D, 0x9B9A, 0xF55E, + 0x9B9B, 0xF55F, 0x9B9C, 0xF560, 0x9B9D, 0xF561, 0x9B9E, 0xF562, + 0x9B9F, 0xF563, 0x9BA0, 0xF564, 0x9BA1, 0xF565, 0x9BA2, 0xF566, + 0x9BA3, 0xF567, 0x9BA4, 0xF568, 0x9BA5, 0xF569, 0x9BA6, 0xF56A, + 0x9BA7, 0xF56B, 0x9BA8, 0xF56C, 0x9BA9, 0xF56D, 0x9BAA, 0xF56E, + 0x9BAB, 0xF56F, 0x9BAC, 0xF570, 0x9BAD, 0xF571, 0x9BAE, 0xF572, + 0x9BAF, 0xF573, 0x9BB0, 0xF574, 0x9BB1, 0xF575, 0x9BB2, 0xF576, + 0x9BB3, 0xF577, 0x9BB4, 0xF578, 0x9BB5, 0xF579, 0x9BB6, 0xF57A, + 0x9BB7, 0xF57B, 0x9BB8, 0xF57C, 0x9BB9, 0xF57D, 0x9BBA, 0xF57E, + 0x9BBB, 0xF580, 0x9BBC, 0xF581, 0x9BBD, 0xF582, 0x9BBE, 0xF583, + 0x9BBF, 0xF584, 0x9BC0, 0xF585, 0x9BC1, 0xF586, 0x9BC2, 0xF587, + 0x9BC3, 0xF588, 0x9BC4, 0xF589, 0x9BC5, 0xF58A, 0x9BC6, 0xF58B, + 0x9BC7, 0xF58C, 0x9BC8, 0xF58D, 0x9BC9, 0xF58E, 0x9BCA, 0xF58F, + 0x9BCB, 0xF590, 0x9BCC, 0xF591, 0x9BCD, 0xF592, 0x9BCE, 0xF593, + 0x9BCF, 0xF594, 0x9BD0, 0xF595, 0x9BD1, 0xF596, 0x9BD2, 0xF597, + 0x9BD3, 0xF598, 0x9BD4, 0xF599, 0x9BD5, 0xF59A, 0x9BD6, 0xF59B, + 0x9BD7, 0xF59C, 0x9BD8, 0xF59D, 0x9BD9, 0xF59E, 0x9BDA, 0xF59F, + 0x9BDB, 0xF5A0, 0x9BDC, 0xF640, 0x9BDD, 0xF641, 0x9BDE, 0xF642, + 0x9BDF, 0xF643, 0x9BE0, 0xF644, 0x9BE1, 0xF645, 0x9BE2, 0xF646, + 0x9BE3, 0xF647, 0x9BE4, 0xF648, 0x9BE5, 0xF649, 0x9BE6, 0xF64A, + 0x9BE7, 0xF64B, 0x9BE8, 0xF64C, 0x9BE9, 0xF64D, 0x9BEA, 0xF64E, + 0x9BEB, 0xF64F, 0x9BEC, 0xF650, 0x9BED, 0xF651, 0x9BEE, 0xF652, + 0x9BEF, 0xF653, 0x9BF0, 0xF654, 0x9BF1, 0xF655, 0x9BF2, 0xF656, + 0x9BF3, 0xF657, 0x9BF4, 0xF658, 0x9BF5, 0xF659, 0x9BF6, 0xF65A, + 0x9BF7, 0xF65B, 0x9BF8, 0xF65C, 0x9BF9, 0xF65D, 0x9BFA, 0xF65E, + 0x9BFB, 0xF65F, 0x9BFC, 0xF660, 0x9BFD, 0xF661, 0x9BFE, 0xF662, + 0x9BFF, 0xF663, 0x9C00, 0xF664, 0x9C01, 0xF665, 0x9C02, 0xF666, + 0x9C03, 0xF667, 0x9C04, 0xF668, 0x9C05, 0xF669, 0x9C06, 0xF66A, + 0x9C07, 0xF66B, 0x9C08, 0xF66C, 0x9C09, 0xF66D, 0x9C0A, 0xF66E, + 0x9C0B, 0xF66F, 0x9C0C, 0xF670, 0x9C0D, 0xF671, 0x9C0E, 0xF672, + 0x9C0F, 0xF673, 0x9C10, 0xF674, 0x9C11, 0xF675, 0x9C12, 0xF676, + 0x9C13, 0xF677, 0x9C14, 0xF678, 0x9C15, 0xF679, 0x9C16, 0xF67A, + 0x9C17, 0xF67B, 0x9C18, 0xF67C, 0x9C19, 0xF67D, 0x9C1A, 0xF67E, + 0x9C1B, 0xF680, 0x9C1C, 0xF681, 0x9C1D, 0xF682, 0x9C1E, 0xF683, + 0x9C1F, 0xF684, 0x9C20, 0xF685, 0x9C21, 0xF686, 0x9C22, 0xF687, + 0x9C23, 0xF688, 0x9C24, 0xF689, 0x9C25, 0xF68A, 0x9C26, 0xF68B, + 0x9C27, 0xF68C, 0x9C28, 0xF68D, 0x9C29, 0xF68E, 0x9C2A, 0xF68F, + 0x9C2B, 0xF690, 0x9C2C, 0xF691, 0x9C2D, 0xF692, 0x9C2E, 0xF693, + 0x9C2F, 0xF694, 0x9C30, 0xF695, 0x9C31, 0xF696, 0x9C32, 0xF697, + 0x9C33, 0xF698, 0x9C34, 0xF699, 0x9C35, 0xF69A, 0x9C36, 0xF69B, + 0x9C37, 0xF69C, 0x9C38, 0xF69D, 0x9C39, 0xF69E, 0x9C3A, 0xF69F, + 0x9C3B, 0xF6A0, 0x9C3C, 0xF740, 0x9C3D, 0xF741, 0x9C3E, 0xF742, + 0x9C3F, 0xF743, 0x9C40, 0xF744, 0x9C41, 0xF745, 0x9C42, 0xF746, + 0x9C43, 0xF747, 0x9C44, 0xF748, 0x9C45, 0xF749, 0x9C46, 0xF74A, + 0x9C47, 0xF74B, 0x9C48, 0xF74C, 0x9C49, 0xF74D, 0x9C4A, 0xF74E, + 0x9C4B, 0xF74F, 0x9C4C, 0xF750, 0x9C4D, 0xF751, 0x9C4E, 0xF752, + 0x9C4F, 0xF753, 0x9C50, 0xF754, 0x9C51, 0xF755, 0x9C52, 0xF756, + 0x9C53, 0xF757, 0x9C54, 0xF758, 0x9C55, 0xF759, 0x9C56, 0xF75A, + 0x9C57, 0xF75B, 0x9C58, 0xF75C, 0x9C59, 0xF75D, 0x9C5A, 0xF75E, + 0x9C5B, 0xF75F, 0x9C5C, 0xF760, 0x9C5D, 0xF761, 0x9C5E, 0xF762, + 0x9C5F, 0xF763, 0x9C60, 0xF764, 0x9C61, 0xF765, 0x9C62, 0xF766, + 0x9C63, 0xF767, 0x9C64, 0xF768, 0x9C65, 0xF769, 0x9C66, 0xF76A, + 0x9C67, 0xF76B, 0x9C68, 0xF76C, 0x9C69, 0xF76D, 0x9C6A, 0xF76E, + 0x9C6B, 0xF76F, 0x9C6C, 0xF770, 0x9C6D, 0xF771, 0x9C6E, 0xF772, + 0x9C6F, 0xF773, 0x9C70, 0xF774, 0x9C71, 0xF775, 0x9C72, 0xF776, + 0x9C73, 0xF777, 0x9C74, 0xF778, 0x9C75, 0xF779, 0x9C76, 0xF77A, + 0x9C77, 0xF77B, 0x9C78, 0xF77C, 0x9C79, 0xF77D, 0x9C7A, 0xF77E, + 0x9C7B, 0xF780, 0x9C7C, 0xD3E3, 0x9C7D, 0xF781, 0x9C7E, 0xF782, + 0x9C7F, 0xF6CF, 0x9C80, 0xF783, 0x9C81, 0xC2B3, 0x9C82, 0xF6D0, + 0x9C83, 0xF784, 0x9C84, 0xF785, 0x9C85, 0xF6D1, 0x9C86, 0xF6D2, + 0x9C87, 0xF6D3, 0x9C88, 0xF6D4, 0x9C89, 0xF786, 0x9C8A, 0xF787, + 0x9C8B, 0xF6D6, 0x9C8C, 0xF788, 0x9C8D, 0xB1AB, 0x9C8E, 0xF6D7, + 0x9C8F, 0xF789, 0x9C90, 0xF6D8, 0x9C91, 0xF6D9, 0x9C92, 0xF6DA, + 0x9C93, 0xF78A, 0x9C94, 0xF6DB, 0x9C95, 0xF6DC, 0x9C96, 0xF78B, + 0x9C97, 0xF78C, 0x9C98, 0xF78D, 0x9C99, 0xF78E, 0x9C9A, 0xF6DD, + 0x9C9B, 0xF6DE, 0x9C9C, 0xCFCA, 0x9C9D, 0xF78F, 0x9C9E, 0xF6DF, + 0x9C9F, 0xF6E0, 0x9CA0, 0xF6E1, 0x9CA1, 0xF6E2, 0x9CA2, 0xF6E3, + 0x9CA3, 0xF6E4, 0x9CA4, 0xC0F0, 0x9CA5, 0xF6E5, 0x9CA6, 0xF6E6, + 0x9CA7, 0xF6E7, 0x9CA8, 0xF6E8, 0x9CA9, 0xF6E9, 0x9CAA, 0xF790, + 0x9CAB, 0xF6EA, 0x9CAC, 0xF791, 0x9CAD, 0xF6EB, 0x9CAE, 0xF6EC, + 0x9CAF, 0xF792, 0x9CB0, 0xF6ED, 0x9CB1, 0xF6EE, 0x9CB2, 0xF6EF, + 0x9CB3, 0xF6F0, 0x9CB4, 0xF6F1, 0x9CB5, 0xF6F2, 0x9CB6, 0xF6F3, + 0x9CB7, 0xF6F4, 0x9CB8, 0xBEA8, 0x9CB9, 0xF793, 0x9CBA, 0xF6F5, + 0x9CBB, 0xF6F6, 0x9CBC, 0xF6F7, 0x9CBD, 0xF6F8, 0x9CBE, 0xF794, + 0x9CBF, 0xF795, 0x9CC0, 0xF796, 0x9CC1, 0xF797, 0x9CC2, 0xF798, + 0x9CC3, 0xC8FA, 0x9CC4, 0xF6F9, 0x9CC5, 0xF6FA, 0x9CC6, 0xF6FB, + 0x9CC7, 0xF6FC, 0x9CC8, 0xF799, 0x9CC9, 0xF79A, 0x9CCA, 0xF6FD, + 0x9CCB, 0xF6FE, 0x9CCC, 0xF7A1, 0x9CCD, 0xF7A2, 0x9CCE, 0xF7A3, + 0x9CCF, 0xF7A4, 0x9CD0, 0xF7A5, 0x9CD1, 0xF79B, 0x9CD2, 0xF79C, + 0x9CD3, 0xF7A6, 0x9CD4, 0xF7A7, 0x9CD5, 0xF7A8, 0x9CD6, 0xB1EE, + 0x9CD7, 0xF7A9, 0x9CD8, 0xF7AA, 0x9CD9, 0xF7AB, 0x9CDA, 0xF79D, + 0x9CDB, 0xF79E, 0x9CDC, 0xF7AC, 0x9CDD, 0xF7AD, 0x9CDE, 0xC1DB, + 0x9CDF, 0xF7AE, 0x9CE0, 0xF79F, 0x9CE1, 0xF7A0, 0x9CE2, 0xF7AF, + 0x9CE3, 0xF840, 0x9CE4, 0xF841, 0x9CE5, 0xF842, 0x9CE6, 0xF843, + 0x9CE7, 0xF844, 0x9CE8, 0xF845, 0x9CE9, 0xF846, 0x9CEA, 0xF847, + 0x9CEB, 0xF848, 0x9CEC, 0xF849, 0x9CED, 0xF84A, 0x9CEE, 0xF84B, + 0x9CEF, 0xF84C, 0x9CF0, 0xF84D, 0x9CF1, 0xF84E, 0x9CF2, 0xF84F, + 0x9CF3, 0xF850, 0x9CF4, 0xF851, 0x9CF5, 0xF852, 0x9CF6, 0xF853, + 0x9CF7, 0xF854, 0x9CF8, 0xF855, 0x9CF9, 0xF856, 0x9CFA, 0xF857, + 0x9CFB, 0xF858, 0x9CFC, 0xF859, 0x9CFD, 0xF85A, 0x9CFE, 0xF85B, + 0x9CFF, 0xF85C, 0x9D00, 0xF85D, 0x9D01, 0xF85E, 0x9D02, 0xF85F, + 0x9D03, 0xF860, 0x9D04, 0xF861, 0x9D05, 0xF862, 0x9D06, 0xF863, + 0x9D07, 0xF864, 0x9D08, 0xF865, 0x9D09, 0xF866, 0x9D0A, 0xF867, + 0x9D0B, 0xF868, 0x9D0C, 0xF869, 0x9D0D, 0xF86A, 0x9D0E, 0xF86B, + 0x9D0F, 0xF86C, 0x9D10, 0xF86D, 0x9D11, 0xF86E, 0x9D12, 0xF86F, + 0x9D13, 0xF870, 0x9D14, 0xF871, 0x9D15, 0xF872, 0x9D16, 0xF873, + 0x9D17, 0xF874, 0x9D18, 0xF875, 0x9D19, 0xF876, 0x9D1A, 0xF877, + 0x9D1B, 0xF878, 0x9D1C, 0xF879, 0x9D1D, 0xF87A, 0x9D1E, 0xF87B, + 0x9D1F, 0xF87C, 0x9D20, 0xF87D, 0x9D21, 0xF87E, 0x9D22, 0xF880, + 0x9D23, 0xF881, 0x9D24, 0xF882, 0x9D25, 0xF883, 0x9D26, 0xF884, + 0x9D27, 0xF885, 0x9D28, 0xF886, 0x9D29, 0xF887, 0x9D2A, 0xF888, + 0x9D2B, 0xF889, 0x9D2C, 0xF88A, 0x9D2D, 0xF88B, 0x9D2E, 0xF88C, + 0x9D2F, 0xF88D, 0x9D30, 0xF88E, 0x9D31, 0xF88F, 0x9D32, 0xF890, + 0x9D33, 0xF891, 0x9D34, 0xF892, 0x9D35, 0xF893, 0x9D36, 0xF894, + 0x9D37, 0xF895, 0x9D38, 0xF896, 0x9D39, 0xF897, 0x9D3A, 0xF898, + 0x9D3B, 0xF899, 0x9D3C, 0xF89A, 0x9D3D, 0xF89B, 0x9D3E, 0xF89C, + 0x9D3F, 0xF89D, 0x9D40, 0xF89E, 0x9D41, 0xF89F, 0x9D42, 0xF8A0, + 0x9D43, 0xF940, 0x9D44, 0xF941, 0x9D45, 0xF942, 0x9D46, 0xF943, + 0x9D47, 0xF944, 0x9D48, 0xF945, 0x9D49, 0xF946, 0x9D4A, 0xF947, + 0x9D4B, 0xF948, 0x9D4C, 0xF949, 0x9D4D, 0xF94A, 0x9D4E, 0xF94B, + 0x9D4F, 0xF94C, 0x9D50, 0xF94D, 0x9D51, 0xF94E, 0x9D52, 0xF94F, + 0x9D53, 0xF950, 0x9D54, 0xF951, 0x9D55, 0xF952, 0x9D56, 0xF953, + 0x9D57, 0xF954, 0x9D58, 0xF955, 0x9D59, 0xF956, 0x9D5A, 0xF957, + 0x9D5B, 0xF958, 0x9D5C, 0xF959, 0x9D5D, 0xF95A, 0x9D5E, 0xF95B, + 0x9D5F, 0xF95C, 0x9D60, 0xF95D, 0x9D61, 0xF95E, 0x9D62, 0xF95F, + 0x9D63, 0xF960, 0x9D64, 0xF961, 0x9D65, 0xF962, 0x9D66, 0xF963, + 0x9D67, 0xF964, 0x9D68, 0xF965, 0x9D69, 0xF966, 0x9D6A, 0xF967, + 0x9D6B, 0xF968, 0x9D6C, 0xF969, 0x9D6D, 0xF96A, 0x9D6E, 0xF96B, + 0x9D6F, 0xF96C, 0x9D70, 0xF96D, 0x9D71, 0xF96E, 0x9D72, 0xF96F, + 0x9D73, 0xF970, 0x9D74, 0xF971, 0x9D75, 0xF972, 0x9D76, 0xF973, + 0x9D77, 0xF974, 0x9D78, 0xF975, 0x9D79, 0xF976, 0x9D7A, 0xF977, + 0x9D7B, 0xF978, 0x9D7C, 0xF979, 0x9D7D, 0xF97A, 0x9D7E, 0xF97B, + 0x9D7F, 0xF97C, 0x9D80, 0xF97D, 0x9D81, 0xF97E, 0x9D82, 0xF980, + 0x9D83, 0xF981, 0x9D84, 0xF982, 0x9D85, 0xF983, 0x9D86, 0xF984, + 0x9D87, 0xF985, 0x9D88, 0xF986, 0x9D89, 0xF987, 0x9D8A, 0xF988, + 0x9D8B, 0xF989, 0x9D8C, 0xF98A, 0x9D8D, 0xF98B, 0x9D8E, 0xF98C, + 0x9D8F, 0xF98D, 0x9D90, 0xF98E, 0x9D91, 0xF98F, 0x9D92, 0xF990, + 0x9D93, 0xF991, 0x9D94, 0xF992, 0x9D95, 0xF993, 0x9D96, 0xF994, + 0x9D97, 0xF995, 0x9D98, 0xF996, 0x9D99, 0xF997, 0x9D9A, 0xF998, + 0x9D9B, 0xF999, 0x9D9C, 0xF99A, 0x9D9D, 0xF99B, 0x9D9E, 0xF99C, + 0x9D9F, 0xF99D, 0x9DA0, 0xF99E, 0x9DA1, 0xF99F, 0x9DA2, 0xF9A0, + 0x9DA3, 0xFA40, 0x9DA4, 0xFA41, 0x9DA5, 0xFA42, 0x9DA6, 0xFA43, + 0x9DA7, 0xFA44, 0x9DA8, 0xFA45, 0x9DA9, 0xFA46, 0x9DAA, 0xFA47, + 0x9DAB, 0xFA48, 0x9DAC, 0xFA49, 0x9DAD, 0xFA4A, 0x9DAE, 0xFA4B, + 0x9DAF, 0xFA4C, 0x9DB0, 0xFA4D, 0x9DB1, 0xFA4E, 0x9DB2, 0xFA4F, + 0x9DB3, 0xFA50, 0x9DB4, 0xFA51, 0x9DB5, 0xFA52, 0x9DB6, 0xFA53, + 0x9DB7, 0xFA54, 0x9DB8, 0xFA55, 0x9DB9, 0xFA56, 0x9DBA, 0xFA57, + 0x9DBB, 0xFA58, 0x9DBC, 0xFA59, 0x9DBD, 0xFA5A, 0x9DBE, 0xFA5B, + 0x9DBF, 0xFA5C, 0x9DC0, 0xFA5D, 0x9DC1, 0xFA5E, 0x9DC2, 0xFA5F, + 0x9DC3, 0xFA60, 0x9DC4, 0xFA61, 0x9DC5, 0xFA62, 0x9DC6, 0xFA63, + 0x9DC7, 0xFA64, 0x9DC8, 0xFA65, 0x9DC9, 0xFA66, 0x9DCA, 0xFA67, + 0x9DCB, 0xFA68, 0x9DCC, 0xFA69, 0x9DCD, 0xFA6A, 0x9DCE, 0xFA6B, + 0x9DCF, 0xFA6C, 0x9DD0, 0xFA6D, 0x9DD1, 0xFA6E, 0x9DD2, 0xFA6F, + 0x9DD3, 0xFA70, 0x9DD4, 0xFA71, 0x9DD5, 0xFA72, 0x9DD6, 0xFA73, + 0x9DD7, 0xFA74, 0x9DD8, 0xFA75, 0x9DD9, 0xFA76, 0x9DDA, 0xFA77, + 0x9DDB, 0xFA78, 0x9DDC, 0xFA79, 0x9DDD, 0xFA7A, 0x9DDE, 0xFA7B, + 0x9DDF, 0xFA7C, 0x9DE0, 0xFA7D, 0x9DE1, 0xFA7E, 0x9DE2, 0xFA80, + 0x9DE3, 0xFA81, 0x9DE4, 0xFA82, 0x9DE5, 0xFA83, 0x9DE6, 0xFA84, + 0x9DE7, 0xFA85, 0x9DE8, 0xFA86, 0x9DE9, 0xFA87, 0x9DEA, 0xFA88, + 0x9DEB, 0xFA89, 0x9DEC, 0xFA8A, 0x9DED, 0xFA8B, 0x9DEE, 0xFA8C, + 0x9DEF, 0xFA8D, 0x9DF0, 0xFA8E, 0x9DF1, 0xFA8F, 0x9DF2, 0xFA90, + 0x9DF3, 0xFA91, 0x9DF4, 0xFA92, 0x9DF5, 0xFA93, 0x9DF6, 0xFA94, + 0x9DF7, 0xFA95, 0x9DF8, 0xFA96, 0x9DF9, 0xFA97, 0x9DFA, 0xFA98, + 0x9DFB, 0xFA99, 0x9DFC, 0xFA9A, 0x9DFD, 0xFA9B, 0x9DFE, 0xFA9C, + 0x9DFF, 0xFA9D, 0x9E00, 0xFA9E, 0x9E01, 0xFA9F, 0x9E02, 0xFAA0, + 0x9E03, 0xFB40, 0x9E04, 0xFB41, 0x9E05, 0xFB42, 0x9E06, 0xFB43, + 0x9E07, 0xFB44, 0x9E08, 0xFB45, 0x9E09, 0xFB46, 0x9E0A, 0xFB47, + 0x9E0B, 0xFB48, 0x9E0C, 0xFB49, 0x9E0D, 0xFB4A, 0x9E0E, 0xFB4B, + 0x9E0F, 0xFB4C, 0x9E10, 0xFB4D, 0x9E11, 0xFB4E, 0x9E12, 0xFB4F, + 0x9E13, 0xFB50, 0x9E14, 0xFB51, 0x9E15, 0xFB52, 0x9E16, 0xFB53, + 0x9E17, 0xFB54, 0x9E18, 0xFB55, 0x9E19, 0xFB56, 0x9E1A, 0xFB57, + 0x9E1B, 0xFB58, 0x9E1C, 0xFB59, 0x9E1D, 0xFB5A, 0x9E1E, 0xFB5B, + 0x9E1F, 0xC4F1, 0x9E20, 0xF0AF, 0x9E21, 0xBCA6, 0x9E22, 0xF0B0, + 0x9E23, 0xC3F9, 0x9E24, 0xFB5C, 0x9E25, 0xC5B8, 0x9E26, 0xD1BB, + 0x9E27, 0xFB5D, 0x9E28, 0xF0B1, 0x9E29, 0xF0B2, 0x9E2A, 0xF0B3, + 0x9E2B, 0xF0B4, 0x9E2C, 0xF0B5, 0x9E2D, 0xD1BC, 0x9E2E, 0xFB5E, + 0x9E2F, 0xD1EC, 0x9E30, 0xFB5F, 0x9E31, 0xF0B7, 0x9E32, 0xF0B6, + 0x9E33, 0xD4A7, 0x9E34, 0xFB60, 0x9E35, 0xCDD2, 0x9E36, 0xF0B8, + 0x9E37, 0xF0BA, 0x9E38, 0xF0B9, 0x9E39, 0xF0BB, 0x9E3A, 0xF0BC, + 0x9E3B, 0xFB61, 0x9E3C, 0xFB62, 0x9E3D, 0xB8EB, 0x9E3E, 0xF0BD, + 0x9E3F, 0xBAE8, 0x9E40, 0xFB63, 0x9E41, 0xF0BE, 0x9E42, 0xF0BF, + 0x9E43, 0xBEE9, 0x9E44, 0xF0C0, 0x9E45, 0xB6EC, 0x9E46, 0xF0C1, + 0x9E47, 0xF0C2, 0x9E48, 0xF0C3, 0x9E49, 0xF0C4, 0x9E4A, 0xC8B5, + 0x9E4B, 0xF0C5, 0x9E4C, 0xF0C6, 0x9E4D, 0xFB64, 0x9E4E, 0xF0C7, + 0x9E4F, 0xC5F4, 0x9E50, 0xFB65, 0x9E51, 0xF0C8, 0x9E52, 0xFB66, + 0x9E53, 0xFB67, 0x9E54, 0xFB68, 0x9E55, 0xF0C9, 0x9E56, 0xFB69, + 0x9E57, 0xF0CA, 0x9E58, 0xF7BD, 0x9E59, 0xFB6A, 0x9E5A, 0xF0CB, + 0x9E5B, 0xF0CC, 0x9E5C, 0xF0CD, 0x9E5D, 0xFB6B, 0x9E5E, 0xF0CE, + 0x9E5F, 0xFB6C, 0x9E60, 0xFB6D, 0x9E61, 0xFB6E, 0x9E62, 0xFB6F, + 0x9E63, 0xF0CF, 0x9E64, 0xBAD7, 0x9E65, 0xFB70, 0x9E66, 0xF0D0, + 0x9E67, 0xF0D1, 0x9E68, 0xF0D2, 0x9E69, 0xF0D3, 0x9E6A, 0xF0D4, + 0x9E6B, 0xF0D5, 0x9E6C, 0xF0D6, 0x9E6D, 0xF0D8, 0x9E6E, 0xFB71, + 0x9E6F, 0xFB72, 0x9E70, 0xD3A5, 0x9E71, 0xF0D7, 0x9E72, 0xFB73, + 0x9E73, 0xF0D9, 0x9E74, 0xFB74, 0x9E75, 0xFB75, 0x9E76, 0xFB76, + 0x9E77, 0xFB77, 0x9E78, 0xFB78, 0x9E79, 0xFB79, 0x9E7A, 0xFB7A, + 0x9E7B, 0xFB7B, 0x9E7C, 0xFB7C, 0x9E7D, 0xFB7D, 0x9E7E, 0xF5BA, + 0x9E7F, 0xC2B9, 0x9E80, 0xFB7E, 0x9E81, 0xFB80, 0x9E82, 0xF7E4, + 0x9E83, 0xFB81, 0x9E84, 0xFB82, 0x9E85, 0xFB83, 0x9E86, 0xFB84, + 0x9E87, 0xF7E5, 0x9E88, 0xF7E6, 0x9E89, 0xFB85, 0x9E8A, 0xFB86, + 0x9E8B, 0xF7E7, 0x9E8C, 0xFB87, 0x9E8D, 0xFB88, 0x9E8E, 0xFB89, + 0x9E8F, 0xFB8A, 0x9E90, 0xFB8B, 0x9E91, 0xFB8C, 0x9E92, 0xF7E8, + 0x9E93, 0xC2B4, 0x9E94, 0xFB8D, 0x9E95, 0xFB8E, 0x9E96, 0xFB8F, + 0x9E97, 0xFB90, 0x9E98, 0xFB91, 0x9E99, 0xFB92, 0x9E9A, 0xFB93, + 0x9E9B, 0xFB94, 0x9E9C, 0xFB95, 0x9E9D, 0xF7EA, 0x9E9E, 0xFB96, + 0x9E9F, 0xF7EB, 0x9EA0, 0xFB97, 0x9EA1, 0xFB98, 0x9EA2, 0xFB99, + 0x9EA3, 0xFB9A, 0x9EA4, 0xFB9B, 0x9EA5, 0xFB9C, 0x9EA6, 0xC2F3, + 0x9EA7, 0xFB9D, 0x9EA8, 0xFB9E, 0x9EA9, 0xFB9F, 0x9EAA, 0xFBA0, + 0x9EAB, 0xFC40, 0x9EAC, 0xFC41, 0x9EAD, 0xFC42, 0x9EAE, 0xFC43, + 0x9EAF, 0xFC44, 0x9EB0, 0xFC45, 0x9EB1, 0xFC46, 0x9EB2, 0xFC47, + 0x9EB3, 0xFC48, 0x9EB4, 0xF4F0, 0x9EB5, 0xFC49, 0x9EB6, 0xFC4A, + 0x9EB7, 0xFC4B, 0x9EB8, 0xF4EF, 0x9EB9, 0xFC4C, 0x9EBA, 0xFC4D, + 0x9EBB, 0xC2E9, 0x9EBC, 0xFC4E, 0x9EBD, 0xF7E1, 0x9EBE, 0xF7E2, + 0x9EBF, 0xFC4F, 0x9EC0, 0xFC50, 0x9EC1, 0xFC51, 0x9EC2, 0xFC52, + 0x9EC3, 0xFC53, 0x9EC4, 0xBBC6, 0x9EC5, 0xFC54, 0x9EC6, 0xFC55, + 0x9EC7, 0xFC56, 0x9EC8, 0xFC57, 0x9EC9, 0xD9E4, 0x9ECA, 0xFC58, + 0x9ECB, 0xFC59, 0x9ECC, 0xFC5A, 0x9ECD, 0xCAF2, 0x9ECE, 0xC0E8, + 0x9ECF, 0xF0A4, 0x9ED0, 0xFC5B, 0x9ED1, 0xBADA, 0x9ED2, 0xFC5C, + 0x9ED3, 0xFC5D, 0x9ED4, 0xC7AD, 0x9ED5, 0xFC5E, 0x9ED6, 0xFC5F, + 0x9ED7, 0xFC60, 0x9ED8, 0xC4AC, 0x9ED9, 0xFC61, 0x9EDA, 0xFC62, + 0x9EDB, 0xF7EC, 0x9EDC, 0xF7ED, 0x9EDD, 0xF7EE, 0x9EDE, 0xFC63, + 0x9EDF, 0xF7F0, 0x9EE0, 0xF7EF, 0x9EE1, 0xFC64, 0x9EE2, 0xF7F1, + 0x9EE3, 0xFC65, 0x9EE4, 0xFC66, 0x9EE5, 0xF7F4, 0x9EE6, 0xFC67, + 0x9EE7, 0xF7F3, 0x9EE8, 0xFC68, 0x9EE9, 0xF7F2, 0x9EEA, 0xF7F5, + 0x9EEB, 0xFC69, 0x9EEC, 0xFC6A, 0x9EED, 0xFC6B, 0x9EEE, 0xFC6C, + 0x9EEF, 0xF7F6, 0x9EF0, 0xFC6D, 0x9EF1, 0xFC6E, 0x9EF2, 0xFC6F, + 0x9EF3, 0xFC70, 0x9EF4, 0xFC71, 0x9EF5, 0xFC72, 0x9EF6, 0xFC73, + 0x9EF7, 0xFC74, 0x9EF8, 0xFC75, 0x9EF9, 0xEDE9, 0x9EFA, 0xFC76, + 0x9EFB, 0xEDEA, 0x9EFC, 0xEDEB, 0x9EFD, 0xFC77, 0x9EFE, 0xF6BC, + 0x9EFF, 0xFC78, 0x9F00, 0xFC79, 0x9F01, 0xFC7A, 0x9F02, 0xFC7B, + 0x9F03, 0xFC7C, 0x9F04, 0xFC7D, 0x9F05, 0xFC7E, 0x9F06, 0xFC80, + 0x9F07, 0xFC81, 0x9F08, 0xFC82, 0x9F09, 0xFC83, 0x9F0A, 0xFC84, + 0x9F0B, 0xF6BD, 0x9F0C, 0xFC85, 0x9F0D, 0xF6BE, 0x9F0E, 0xB6A6, + 0x9F0F, 0xFC86, 0x9F10, 0xD8BE, 0x9F11, 0xFC87, 0x9F12, 0xFC88, + 0x9F13, 0xB9C4, 0x9F14, 0xFC89, 0x9F15, 0xFC8A, 0x9F16, 0xFC8B, + 0x9F17, 0xD8BB, 0x9F18, 0xFC8C, 0x9F19, 0xDCB1, 0x9F1A, 0xFC8D, + 0x9F1B, 0xFC8E, 0x9F1C, 0xFC8F, 0x9F1D, 0xFC90, 0x9F1E, 0xFC91, + 0x9F1F, 0xFC92, 0x9F20, 0xCAF3, 0x9F21, 0xFC93, 0x9F22, 0xF7F7, + 0x9F23, 0xFC94, 0x9F24, 0xFC95, 0x9F25, 0xFC96, 0x9F26, 0xFC97, + 0x9F27, 0xFC98, 0x9F28, 0xFC99, 0x9F29, 0xFC9A, 0x9F2A, 0xFC9B, + 0x9F2B, 0xFC9C, 0x9F2C, 0xF7F8, 0x9F2D, 0xFC9D, 0x9F2E, 0xFC9E, + 0x9F2F, 0xF7F9, 0x9F30, 0xFC9F, 0x9F31, 0xFCA0, 0x9F32, 0xFD40, + 0x9F33, 0xFD41, 0x9F34, 0xFD42, 0x9F35, 0xFD43, 0x9F36, 0xFD44, + 0x9F37, 0xF7FB, 0x9F38, 0xFD45, 0x9F39, 0xF7FA, 0x9F3A, 0xFD46, + 0x9F3B, 0xB1C7, 0x9F3C, 0xFD47, 0x9F3D, 0xF7FC, 0x9F3E, 0xF7FD, + 0x9F3F, 0xFD48, 0x9F40, 0xFD49, 0x9F41, 0xFD4A, 0x9F42, 0xFD4B, + 0x9F43, 0xFD4C, 0x9F44, 0xF7FE, 0x9F45, 0xFD4D, 0x9F46, 0xFD4E, + 0x9F47, 0xFD4F, 0x9F48, 0xFD50, 0x9F49, 0xFD51, 0x9F4A, 0xFD52, + 0x9F4B, 0xFD53, 0x9F4C, 0xFD54, 0x9F4D, 0xFD55, 0x9F4E, 0xFD56, + 0x9F4F, 0xFD57, 0x9F50, 0xC6EB, 0x9F51, 0xECB4, 0x9F52, 0xFD58, + 0x9F53, 0xFD59, 0x9F54, 0xFD5A, 0x9F55, 0xFD5B, 0x9F56, 0xFD5C, + 0x9F57, 0xFD5D, 0x9F58, 0xFD5E, 0x9F59, 0xFD5F, 0x9F5A, 0xFD60, + 0x9F5B, 0xFD61, 0x9F5C, 0xFD62, 0x9F5D, 0xFD63, 0x9F5E, 0xFD64, + 0x9F5F, 0xFD65, 0x9F60, 0xFD66, 0x9F61, 0xFD67, 0x9F62, 0xFD68, + 0x9F63, 0xFD69, 0x9F64, 0xFD6A, 0x9F65, 0xFD6B, 0x9F66, 0xFD6C, + 0x9F67, 0xFD6D, 0x9F68, 0xFD6E, 0x9F69, 0xFD6F, 0x9F6A, 0xFD70, + 0x9F6B, 0xFD71, 0x9F6C, 0xFD72, 0x9F6D, 0xFD73, 0x9F6E, 0xFD74, + 0x9F6F, 0xFD75, 0x9F70, 0xFD76, 0x9F71, 0xFD77, 0x9F72, 0xFD78, + 0x9F73, 0xFD79, 0x9F74, 0xFD7A, 0x9F75, 0xFD7B, 0x9F76, 0xFD7C, + 0x9F77, 0xFD7D, 0x9F78, 0xFD7E, 0x9F79, 0xFD80, 0x9F7A, 0xFD81, + 0x9F7B, 0xFD82, 0x9F7C, 0xFD83, 0x9F7D, 0xFD84, 0x9F7E, 0xFD85, + 0x9F7F, 0xB3DD, 0x9F80, 0xF6B3, 0x9F81, 0xFD86, 0x9F82, 0xFD87, + 0x9F83, 0xF6B4, 0x9F84, 0xC1E4, 0x9F85, 0xF6B5, 0x9F86, 0xF6B6, + 0x9F87, 0xF6B7, 0x9F88, 0xF6B8, 0x9F89, 0xF6B9, 0x9F8A, 0xF6BA, + 0x9F8B, 0xC8A3, 0x9F8C, 0xF6BB, 0x9F8D, 0xFD88, 0x9F8E, 0xFD89, + 0x9F8F, 0xFD8A, 0x9F90, 0xFD8B, 0x9F91, 0xFD8C, 0x9F92, 0xFD8D, + 0x9F93, 0xFD8E, 0x9F94, 0xFD8F, 0x9F95, 0xFD90, 0x9F96, 0xFD91, + 0x9F97, 0xFD92, 0x9F98, 0xFD93, 0x9F99, 0xC1FA, 0x9F9A, 0xB9A8, + 0x9F9B, 0xEDE8, 0x9F9C, 0xFD94, 0x9F9D, 0xFD95, 0x9F9E, 0xFD96, + 0x9F9F, 0xB9EA, 0x9FA0, 0xD9DF, 0x9FA1, 0xFD97, 0x9FA2, 0xFD98, + 0x9FA3, 0xFD99, 0x9FA4, 0xFD9A, 0x9FA5, 0xFD9B, 0xF92C, 0xFD9C, + 0xF979, 0xFD9D, 0xF995, 0xFD9E, 0xF9E7, 0xFD9F, 0xF9F1, 0xFDA0, + 0xFA0C, 0xFE40, 0xFA0D, 0xFE41, 0xFA0E, 0xFE42, 0xFA0F, 0xFE43, + 0xFA11, 0xFE44, 0xFA13, 0xFE45, 0xFA14, 0xFE46, 0xFA18, 0xFE47, + 0xFA1F, 0xFE48, 0xFA20, 0xFE49, 0xFA21, 0xFE4A, 0xFA23, 0xFE4B, + 0xFA24, 0xFE4C, 0xFA27, 0xFE4D, 0xFA28, 0xFE4E, 0xFA29, 0xFE4F, + 0xFE30, 0xA955, 0xFE31, 0xA6F2, 0xFE33, 0xA6F4, 0xFE34, 0xA6F5, + 0xFE35, 0xA6E0, 0xFE36, 0xA6E1, 0xFE37, 0xA6F0, 0xFE38, 0xA6F1, + 0xFE39, 0xA6E2, 0xFE3A, 0xA6E3, 0xFE3B, 0xA6EE, 0xFE3C, 0xA6EF, + 0xFE3D, 0xA6E6, 0xFE3E, 0xA6E7, 0xFE3F, 0xA6E4, 0xFE40, 0xA6E5, + 0xFE41, 0xA6E8, 0xFE42, 0xA6E9, 0xFE43, 0xA6EA, 0xFE44, 0xA6EB, + 0xFE49, 0xA968, 0xFE4A, 0xA969, 0xFE4B, 0xA96A, 0xFE4C, 0xA96B, + 0xFE4D, 0xA96C, 0xFE4E, 0xA96D, 0xFE4F, 0xA96E, 0xFE50, 0xA96F, + 0xFE51, 0xA970, 0xFE52, 0xA971, 0xFE54, 0xA972, 0xFE55, 0xA973, + 0xFE56, 0xA974, 0xFE57, 0xA975, 0xFE59, 0xA976, 0xFE5A, 0xA977, + 0xFE5B, 0xA978, 0xFE5C, 0xA979, 0xFE5D, 0xA97A, 0xFE5E, 0xA97B, + 0xFE5F, 0xA97C, 0xFE60, 0xA97D, 0xFE61, 0xA97E, 0xFE62, 0xA980, + 0xFE63, 0xA981, 0xFE64, 0xA982, 0xFE65, 0xA983, 0xFE66, 0xA984, + 0xFE68, 0xA985, 0xFE69, 0xA986, 0xFE6A, 0xA987, 0xFE6B, 0xA988, + 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA1E7, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, + 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, + 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, + 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, + 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, + 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, + 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, + 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA3DC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, + 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, + 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, + 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, + 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA1AB, 0xFFE0, 0xA1E9, 0xFFE1, 0xA1EA, + 0xFFE2, 0xA956, 0xFFE3, 0xA3FE, 0xFFE4, 0xA957, 0xFFE5, 0xA3A4, + 0, 0 +}; + +static +const WCHAR oem2uni[] = { +/* OEM - Unicode, OEM - Unicode, OEM - Unicode, OEM - Unicode */ + 0x0080, 0x20AC, 0x8140, 0x4E02, 0x8141, 0x4E04, 0x8142, 0x4E05, + 0x8143, 0x4E06, 0x8144, 0x4E0F, 0x8145, 0x4E12, 0x8146, 0x4E17, + 0x8147, 0x4E1F, 0x8148, 0x4E20, 0x8149, 0x4E21, 0x814A, 0x4E23, + 0x814B, 0x4E26, 0x814C, 0x4E29, 0x814D, 0x4E2E, 0x814E, 0x4E2F, + 0x814F, 0x4E31, 0x8150, 0x4E33, 0x8151, 0x4E35, 0x8152, 0x4E37, + 0x8153, 0x4E3C, 0x8154, 0x4E40, 0x8155, 0x4E41, 0x8156, 0x4E42, + 0x8157, 0x4E44, 0x8158, 0x4E46, 0x8159, 0x4E4A, 0x815A, 0x4E51, + 0x815B, 0x4E55, 0x815C, 0x4E57, 0x815D, 0x4E5A, 0x815E, 0x4E5B, + 0x815F, 0x4E62, 0x8160, 0x4E63, 0x8161, 0x4E64, 0x8162, 0x4E65, + 0x8163, 0x4E67, 0x8164, 0x4E68, 0x8165, 0x4E6A, 0x8166, 0x4E6B, + 0x8167, 0x4E6C, 0x8168, 0x4E6D, 0x8169, 0x4E6E, 0x816A, 0x4E6F, + 0x816B, 0x4E72, 0x816C, 0x4E74, 0x816D, 0x4E75, 0x816E, 0x4E76, + 0x816F, 0x4E77, 0x8170, 0x4E78, 0x8171, 0x4E79, 0x8172, 0x4E7A, + 0x8173, 0x4E7B, 0x8174, 0x4E7C, 0x8175, 0x4E7D, 0x8176, 0x4E7F, + 0x8177, 0x4E80, 0x8178, 0x4E81, 0x8179, 0x4E82, 0x817A, 0x4E83, + 0x817B, 0x4E84, 0x817C, 0x4E85, 0x817D, 0x4E87, 0x817E, 0x4E8A, + 0x8180, 0x4E90, 0x8181, 0x4E96, 0x8182, 0x4E97, 0x8183, 0x4E99, + 0x8184, 0x4E9C, 0x8185, 0x4E9D, 0x8186, 0x4E9E, 0x8187, 0x4EA3, + 0x8188, 0x4EAA, 0x8189, 0x4EAF, 0x818A, 0x4EB0, 0x818B, 0x4EB1, + 0x818C, 0x4EB4, 0x818D, 0x4EB6, 0x818E, 0x4EB7, 0x818F, 0x4EB8, + 0x8190, 0x4EB9, 0x8191, 0x4EBC, 0x8192, 0x4EBD, 0x8193, 0x4EBE, + 0x8194, 0x4EC8, 0x8195, 0x4ECC, 0x8196, 0x4ECF, 0x8197, 0x4ED0, + 0x8198, 0x4ED2, 0x8199, 0x4EDA, 0x819A, 0x4EDB, 0x819B, 0x4EDC, + 0x819C, 0x4EE0, 0x819D, 0x4EE2, 0x819E, 0x4EE6, 0x819F, 0x4EE7, + 0x81A0, 0x4EE9, 0x81A1, 0x4EED, 0x81A2, 0x4EEE, 0x81A3, 0x4EEF, + 0x81A4, 0x4EF1, 0x81A5, 0x4EF4, 0x81A6, 0x4EF8, 0x81A7, 0x4EF9, + 0x81A8, 0x4EFA, 0x81A9, 0x4EFC, 0x81AA, 0x4EFE, 0x81AB, 0x4F00, + 0x81AC, 0x4F02, 0x81AD, 0x4F03, 0x81AE, 0x4F04, 0x81AF, 0x4F05, + 0x81B0, 0x4F06, 0x81B1, 0x4F07, 0x81B2, 0x4F08, 0x81B3, 0x4F0B, + 0x81B4, 0x4F0C, 0x81B5, 0x4F12, 0x81B6, 0x4F13, 0x81B7, 0x4F14, + 0x81B8, 0x4F15, 0x81B9, 0x4F16, 0x81BA, 0x4F1C, 0x81BB, 0x4F1D, + 0x81BC, 0x4F21, 0x81BD, 0x4F23, 0x81BE, 0x4F28, 0x81BF, 0x4F29, + 0x81C0, 0x4F2C, 0x81C1, 0x4F2D, 0x81C2, 0x4F2E, 0x81C3, 0x4F31, + 0x81C4, 0x4F33, 0x81C5, 0x4F35, 0x81C6, 0x4F37, 0x81C7, 0x4F39, + 0x81C8, 0x4F3B, 0x81C9, 0x4F3E, 0x81CA, 0x4F3F, 0x81CB, 0x4F40, + 0x81CC, 0x4F41, 0x81CD, 0x4F42, 0x81CE, 0x4F44, 0x81CF, 0x4F45, + 0x81D0, 0x4F47, 0x81D1, 0x4F48, 0x81D2, 0x4F49, 0x81D3, 0x4F4A, + 0x81D4, 0x4F4B, 0x81D5, 0x4F4C, 0x81D6, 0x4F52, 0x81D7, 0x4F54, + 0x81D8, 0x4F56, 0x81D9, 0x4F61, 0x81DA, 0x4F62, 0x81DB, 0x4F66, + 0x81DC, 0x4F68, 0x81DD, 0x4F6A, 0x81DE, 0x4F6B, 0x81DF, 0x4F6D, + 0x81E0, 0x4F6E, 0x81E1, 0x4F71, 0x81E2, 0x4F72, 0x81E3, 0x4F75, + 0x81E4, 0x4F77, 0x81E5, 0x4F78, 0x81E6, 0x4F79, 0x81E7, 0x4F7A, + 0x81E8, 0x4F7D, 0x81E9, 0x4F80, 0x81EA, 0x4F81, 0x81EB, 0x4F82, + 0x81EC, 0x4F85, 0x81ED, 0x4F86, 0x81EE, 0x4F87, 0x81EF, 0x4F8A, + 0x81F0, 0x4F8C, 0x81F1, 0x4F8E, 0x81F2, 0x4F90, 0x81F3, 0x4F92, + 0x81F4, 0x4F93, 0x81F5, 0x4F95, 0x81F6, 0x4F96, 0x81F7, 0x4F98, + 0x81F8, 0x4F99, 0x81F9, 0x4F9A, 0x81FA, 0x4F9C, 0x81FB, 0x4F9E, + 0x81FC, 0x4F9F, 0x81FD, 0x4FA1, 0x81FE, 0x4FA2, 0x8240, 0x4FA4, + 0x8241, 0x4FAB, 0x8242, 0x4FAD, 0x8243, 0x4FB0, 0x8244, 0x4FB1, + 0x8245, 0x4FB2, 0x8246, 0x4FB3, 0x8247, 0x4FB4, 0x8248, 0x4FB6, + 0x8249, 0x4FB7, 0x824A, 0x4FB8, 0x824B, 0x4FB9, 0x824C, 0x4FBA, + 0x824D, 0x4FBB, 0x824E, 0x4FBC, 0x824F, 0x4FBD, 0x8250, 0x4FBE, + 0x8251, 0x4FC0, 0x8252, 0x4FC1, 0x8253, 0x4FC2, 0x8254, 0x4FC6, + 0x8255, 0x4FC7, 0x8256, 0x4FC8, 0x8257, 0x4FC9, 0x8258, 0x4FCB, + 0x8259, 0x4FCC, 0x825A, 0x4FCD, 0x825B, 0x4FD2, 0x825C, 0x4FD3, + 0x825D, 0x4FD4, 0x825E, 0x4FD5, 0x825F, 0x4FD6, 0x8260, 0x4FD9, + 0x8261, 0x4FDB, 0x8262, 0x4FE0, 0x8263, 0x4FE2, 0x8264, 0x4FE4, + 0x8265, 0x4FE5, 0x8266, 0x4FE7, 0x8267, 0x4FEB, 0x8268, 0x4FEC, + 0x8269, 0x4FF0, 0x826A, 0x4FF2, 0x826B, 0x4FF4, 0x826C, 0x4FF5, + 0x826D, 0x4FF6, 0x826E, 0x4FF7, 0x826F, 0x4FF9, 0x8270, 0x4FFB, + 0x8271, 0x4FFC, 0x8272, 0x4FFD, 0x8273, 0x4FFF, 0x8274, 0x5000, + 0x8275, 0x5001, 0x8276, 0x5002, 0x8277, 0x5003, 0x8278, 0x5004, + 0x8279, 0x5005, 0x827A, 0x5006, 0x827B, 0x5007, 0x827C, 0x5008, + 0x827D, 0x5009, 0x827E, 0x500A, 0x8280, 0x500B, 0x8281, 0x500E, + 0x8282, 0x5010, 0x8283, 0x5011, 0x8284, 0x5013, 0x8285, 0x5015, + 0x8286, 0x5016, 0x8287, 0x5017, 0x8288, 0x501B, 0x8289, 0x501D, + 0x828A, 0x501E, 0x828B, 0x5020, 0x828C, 0x5022, 0x828D, 0x5023, + 0x828E, 0x5024, 0x828F, 0x5027, 0x8290, 0x502B, 0x8291, 0x502F, + 0x8292, 0x5030, 0x8293, 0x5031, 0x8294, 0x5032, 0x8295, 0x5033, + 0x8296, 0x5034, 0x8297, 0x5035, 0x8298, 0x5036, 0x8299, 0x5037, + 0x829A, 0x5038, 0x829B, 0x5039, 0x829C, 0x503B, 0x829D, 0x503D, + 0x829E, 0x503F, 0x829F, 0x5040, 0x82A0, 0x5041, 0x82A1, 0x5042, + 0x82A2, 0x5044, 0x82A3, 0x5045, 0x82A4, 0x5046, 0x82A5, 0x5049, + 0x82A6, 0x504A, 0x82A7, 0x504B, 0x82A8, 0x504D, 0x82A9, 0x5050, + 0x82AA, 0x5051, 0x82AB, 0x5052, 0x82AC, 0x5053, 0x82AD, 0x5054, + 0x82AE, 0x5056, 0x82AF, 0x5057, 0x82B0, 0x5058, 0x82B1, 0x5059, + 0x82B2, 0x505B, 0x82B3, 0x505D, 0x82B4, 0x505E, 0x82B5, 0x505F, + 0x82B6, 0x5060, 0x82B7, 0x5061, 0x82B8, 0x5062, 0x82B9, 0x5063, + 0x82BA, 0x5064, 0x82BB, 0x5066, 0x82BC, 0x5067, 0x82BD, 0x5068, + 0x82BE, 0x5069, 0x82BF, 0x506A, 0x82C0, 0x506B, 0x82C1, 0x506D, + 0x82C2, 0x506E, 0x82C3, 0x506F, 0x82C4, 0x5070, 0x82C5, 0x5071, + 0x82C6, 0x5072, 0x82C7, 0x5073, 0x82C8, 0x5074, 0x82C9, 0x5075, + 0x82CA, 0x5078, 0x82CB, 0x5079, 0x82CC, 0x507A, 0x82CD, 0x507C, + 0x82CE, 0x507D, 0x82CF, 0x5081, 0x82D0, 0x5082, 0x82D1, 0x5083, + 0x82D2, 0x5084, 0x82D3, 0x5086, 0x82D4, 0x5087, 0x82D5, 0x5089, + 0x82D6, 0x508A, 0x82D7, 0x508B, 0x82D8, 0x508C, 0x82D9, 0x508E, + 0x82DA, 0x508F, 0x82DB, 0x5090, 0x82DC, 0x5091, 0x82DD, 0x5092, + 0x82DE, 0x5093, 0x82DF, 0x5094, 0x82E0, 0x5095, 0x82E1, 0x5096, + 0x82E2, 0x5097, 0x82E3, 0x5098, 0x82E4, 0x5099, 0x82E5, 0x509A, + 0x82E6, 0x509B, 0x82E7, 0x509C, 0x82E8, 0x509D, 0x82E9, 0x509E, + 0x82EA, 0x509F, 0x82EB, 0x50A0, 0x82EC, 0x50A1, 0x82ED, 0x50A2, + 0x82EE, 0x50A4, 0x82EF, 0x50A6, 0x82F0, 0x50AA, 0x82F1, 0x50AB, + 0x82F2, 0x50AD, 0x82F3, 0x50AE, 0x82F4, 0x50AF, 0x82F5, 0x50B0, + 0x82F6, 0x50B1, 0x82F7, 0x50B3, 0x82F8, 0x50B4, 0x82F9, 0x50B5, + 0x82FA, 0x50B6, 0x82FB, 0x50B7, 0x82FC, 0x50B8, 0x82FD, 0x50B9, + 0x82FE, 0x50BC, 0x8340, 0x50BD, 0x8341, 0x50BE, 0x8342, 0x50BF, + 0x8343, 0x50C0, 0x8344, 0x50C1, 0x8345, 0x50C2, 0x8346, 0x50C3, + 0x8347, 0x50C4, 0x8348, 0x50C5, 0x8349, 0x50C6, 0x834A, 0x50C7, + 0x834B, 0x50C8, 0x834C, 0x50C9, 0x834D, 0x50CA, 0x834E, 0x50CB, + 0x834F, 0x50CC, 0x8350, 0x50CD, 0x8351, 0x50CE, 0x8352, 0x50D0, + 0x8353, 0x50D1, 0x8354, 0x50D2, 0x8355, 0x50D3, 0x8356, 0x50D4, + 0x8357, 0x50D5, 0x8358, 0x50D7, 0x8359, 0x50D8, 0x835A, 0x50D9, + 0x835B, 0x50DB, 0x835C, 0x50DC, 0x835D, 0x50DD, 0x835E, 0x50DE, + 0x835F, 0x50DF, 0x8360, 0x50E0, 0x8361, 0x50E1, 0x8362, 0x50E2, + 0x8363, 0x50E3, 0x8364, 0x50E4, 0x8365, 0x50E5, 0x8366, 0x50E8, + 0x8367, 0x50E9, 0x8368, 0x50EA, 0x8369, 0x50EB, 0x836A, 0x50EF, + 0x836B, 0x50F0, 0x836C, 0x50F1, 0x836D, 0x50F2, 0x836E, 0x50F4, + 0x836F, 0x50F6, 0x8370, 0x50F7, 0x8371, 0x50F8, 0x8372, 0x50F9, + 0x8373, 0x50FA, 0x8374, 0x50FC, 0x8375, 0x50FD, 0x8376, 0x50FE, + 0x8377, 0x50FF, 0x8378, 0x5100, 0x8379, 0x5101, 0x837A, 0x5102, + 0x837B, 0x5103, 0x837C, 0x5104, 0x837D, 0x5105, 0x837E, 0x5108, + 0x8380, 0x5109, 0x8381, 0x510A, 0x8382, 0x510C, 0x8383, 0x510D, + 0x8384, 0x510E, 0x8385, 0x510F, 0x8386, 0x5110, 0x8387, 0x5111, + 0x8388, 0x5113, 0x8389, 0x5114, 0x838A, 0x5115, 0x838B, 0x5116, + 0x838C, 0x5117, 0x838D, 0x5118, 0x838E, 0x5119, 0x838F, 0x511A, + 0x8390, 0x511B, 0x8391, 0x511C, 0x8392, 0x511D, 0x8393, 0x511E, + 0x8394, 0x511F, 0x8395, 0x5120, 0x8396, 0x5122, 0x8397, 0x5123, + 0x8398, 0x5124, 0x8399, 0x5125, 0x839A, 0x5126, 0x839B, 0x5127, + 0x839C, 0x5128, 0x839D, 0x5129, 0x839E, 0x512A, 0x839F, 0x512B, + 0x83A0, 0x512C, 0x83A1, 0x512D, 0x83A2, 0x512E, 0x83A3, 0x512F, + 0x83A4, 0x5130, 0x83A5, 0x5131, 0x83A6, 0x5132, 0x83A7, 0x5133, + 0x83A8, 0x5134, 0x83A9, 0x5135, 0x83AA, 0x5136, 0x83AB, 0x5137, + 0x83AC, 0x5138, 0x83AD, 0x5139, 0x83AE, 0x513A, 0x83AF, 0x513B, + 0x83B0, 0x513C, 0x83B1, 0x513D, 0x83B2, 0x513E, 0x83B3, 0x5142, + 0x83B4, 0x5147, 0x83B5, 0x514A, 0x83B6, 0x514C, 0x83B7, 0x514E, + 0x83B8, 0x514F, 0x83B9, 0x5150, 0x83BA, 0x5152, 0x83BB, 0x5153, + 0x83BC, 0x5157, 0x83BD, 0x5158, 0x83BE, 0x5159, 0x83BF, 0x515B, + 0x83C0, 0x515D, 0x83C1, 0x515E, 0x83C2, 0x515F, 0x83C3, 0x5160, + 0x83C4, 0x5161, 0x83C5, 0x5163, 0x83C6, 0x5164, 0x83C7, 0x5166, + 0x83C8, 0x5167, 0x83C9, 0x5169, 0x83CA, 0x516A, 0x83CB, 0x516F, + 0x83CC, 0x5172, 0x83CD, 0x517A, 0x83CE, 0x517E, 0x83CF, 0x517F, + 0x83D0, 0x5183, 0x83D1, 0x5184, 0x83D2, 0x5186, 0x83D3, 0x5187, + 0x83D4, 0x518A, 0x83D5, 0x518B, 0x83D6, 0x518E, 0x83D7, 0x518F, + 0x83D8, 0x5190, 0x83D9, 0x5191, 0x83DA, 0x5193, 0x83DB, 0x5194, + 0x83DC, 0x5198, 0x83DD, 0x519A, 0x83DE, 0x519D, 0x83DF, 0x519E, + 0x83E0, 0x519F, 0x83E1, 0x51A1, 0x83E2, 0x51A3, 0x83E3, 0x51A6, + 0x83E4, 0x51A7, 0x83E5, 0x51A8, 0x83E6, 0x51A9, 0x83E7, 0x51AA, + 0x83E8, 0x51AD, 0x83E9, 0x51AE, 0x83EA, 0x51B4, 0x83EB, 0x51B8, + 0x83EC, 0x51B9, 0x83ED, 0x51BA, 0x83EE, 0x51BE, 0x83EF, 0x51BF, + 0x83F0, 0x51C1, 0x83F1, 0x51C2, 0x83F2, 0x51C3, 0x83F3, 0x51C5, + 0x83F4, 0x51C8, 0x83F5, 0x51CA, 0x83F6, 0x51CD, 0x83F7, 0x51CE, + 0x83F8, 0x51D0, 0x83F9, 0x51D2, 0x83FA, 0x51D3, 0x83FB, 0x51D4, + 0x83FC, 0x51D5, 0x83FD, 0x51D6, 0x83FE, 0x51D7, 0x8440, 0x51D8, + 0x8441, 0x51D9, 0x8442, 0x51DA, 0x8443, 0x51DC, 0x8444, 0x51DE, + 0x8445, 0x51DF, 0x8446, 0x51E2, 0x8447, 0x51E3, 0x8448, 0x51E5, + 0x8449, 0x51E6, 0x844A, 0x51E7, 0x844B, 0x51E8, 0x844C, 0x51E9, + 0x844D, 0x51EA, 0x844E, 0x51EC, 0x844F, 0x51EE, 0x8450, 0x51F1, + 0x8451, 0x51F2, 0x8452, 0x51F4, 0x8453, 0x51F7, 0x8454, 0x51FE, + 0x8455, 0x5204, 0x8456, 0x5205, 0x8457, 0x5209, 0x8458, 0x520B, + 0x8459, 0x520C, 0x845A, 0x520F, 0x845B, 0x5210, 0x845C, 0x5213, + 0x845D, 0x5214, 0x845E, 0x5215, 0x845F, 0x521C, 0x8460, 0x521E, + 0x8461, 0x521F, 0x8462, 0x5221, 0x8463, 0x5222, 0x8464, 0x5223, + 0x8465, 0x5225, 0x8466, 0x5226, 0x8467, 0x5227, 0x8468, 0x522A, + 0x8469, 0x522C, 0x846A, 0x522F, 0x846B, 0x5231, 0x846C, 0x5232, + 0x846D, 0x5234, 0x846E, 0x5235, 0x846F, 0x523C, 0x8470, 0x523E, + 0x8471, 0x5244, 0x8472, 0x5245, 0x8473, 0x5246, 0x8474, 0x5247, + 0x8475, 0x5248, 0x8476, 0x5249, 0x8477, 0x524B, 0x8478, 0x524E, + 0x8479, 0x524F, 0x847A, 0x5252, 0x847B, 0x5253, 0x847C, 0x5255, + 0x847D, 0x5257, 0x847E, 0x5258, 0x8480, 0x5259, 0x8481, 0x525A, + 0x8482, 0x525B, 0x8483, 0x525D, 0x8484, 0x525F, 0x8485, 0x5260, + 0x8486, 0x5262, 0x8487, 0x5263, 0x8488, 0x5264, 0x8489, 0x5266, + 0x848A, 0x5268, 0x848B, 0x526B, 0x848C, 0x526C, 0x848D, 0x526D, + 0x848E, 0x526E, 0x848F, 0x5270, 0x8490, 0x5271, 0x8491, 0x5273, + 0x8492, 0x5274, 0x8493, 0x5275, 0x8494, 0x5276, 0x8495, 0x5277, + 0x8496, 0x5278, 0x8497, 0x5279, 0x8498, 0x527A, 0x8499, 0x527B, + 0x849A, 0x527C, 0x849B, 0x527E, 0x849C, 0x5280, 0x849D, 0x5283, + 0x849E, 0x5284, 0x849F, 0x5285, 0x84A0, 0x5286, 0x84A1, 0x5287, + 0x84A2, 0x5289, 0x84A3, 0x528A, 0x84A4, 0x528B, 0x84A5, 0x528C, + 0x84A6, 0x528D, 0x84A7, 0x528E, 0x84A8, 0x528F, 0x84A9, 0x5291, + 0x84AA, 0x5292, 0x84AB, 0x5294, 0x84AC, 0x5295, 0x84AD, 0x5296, + 0x84AE, 0x5297, 0x84AF, 0x5298, 0x84B0, 0x5299, 0x84B1, 0x529A, + 0x84B2, 0x529C, 0x84B3, 0x52A4, 0x84B4, 0x52A5, 0x84B5, 0x52A6, + 0x84B6, 0x52A7, 0x84B7, 0x52AE, 0x84B8, 0x52AF, 0x84B9, 0x52B0, + 0x84BA, 0x52B4, 0x84BB, 0x52B5, 0x84BC, 0x52B6, 0x84BD, 0x52B7, + 0x84BE, 0x52B8, 0x84BF, 0x52B9, 0x84C0, 0x52BA, 0x84C1, 0x52BB, + 0x84C2, 0x52BC, 0x84C3, 0x52BD, 0x84C4, 0x52C0, 0x84C5, 0x52C1, + 0x84C6, 0x52C2, 0x84C7, 0x52C4, 0x84C8, 0x52C5, 0x84C9, 0x52C6, + 0x84CA, 0x52C8, 0x84CB, 0x52CA, 0x84CC, 0x52CC, 0x84CD, 0x52CD, + 0x84CE, 0x52CE, 0x84CF, 0x52CF, 0x84D0, 0x52D1, 0x84D1, 0x52D3, + 0x84D2, 0x52D4, 0x84D3, 0x52D5, 0x84D4, 0x52D7, 0x84D5, 0x52D9, + 0x84D6, 0x52DA, 0x84D7, 0x52DB, 0x84D8, 0x52DC, 0x84D9, 0x52DD, + 0x84DA, 0x52DE, 0x84DB, 0x52E0, 0x84DC, 0x52E1, 0x84DD, 0x52E2, + 0x84DE, 0x52E3, 0x84DF, 0x52E5, 0x84E0, 0x52E6, 0x84E1, 0x52E7, + 0x84E2, 0x52E8, 0x84E3, 0x52E9, 0x84E4, 0x52EA, 0x84E5, 0x52EB, + 0x84E6, 0x52EC, 0x84E7, 0x52ED, 0x84E8, 0x52EE, 0x84E9, 0x52EF, + 0x84EA, 0x52F1, 0x84EB, 0x52F2, 0x84EC, 0x52F3, 0x84ED, 0x52F4, + 0x84EE, 0x52F5, 0x84EF, 0x52F6, 0x84F0, 0x52F7, 0x84F1, 0x52F8, + 0x84F2, 0x52FB, 0x84F3, 0x52FC, 0x84F4, 0x52FD, 0x84F5, 0x5301, + 0x84F6, 0x5302, 0x84F7, 0x5303, 0x84F8, 0x5304, 0x84F9, 0x5307, + 0x84FA, 0x5309, 0x84FB, 0x530A, 0x84FC, 0x530B, 0x84FD, 0x530C, + 0x84FE, 0x530E, 0x8540, 0x5311, 0x8541, 0x5312, 0x8542, 0x5313, + 0x8543, 0x5314, 0x8544, 0x5318, 0x8545, 0x531B, 0x8546, 0x531C, + 0x8547, 0x531E, 0x8548, 0x531F, 0x8549, 0x5322, 0x854A, 0x5324, + 0x854B, 0x5325, 0x854C, 0x5327, 0x854D, 0x5328, 0x854E, 0x5329, + 0x854F, 0x532B, 0x8550, 0x532C, 0x8551, 0x532D, 0x8552, 0x532F, + 0x8553, 0x5330, 0x8554, 0x5331, 0x8555, 0x5332, 0x8556, 0x5333, + 0x8557, 0x5334, 0x8558, 0x5335, 0x8559, 0x5336, 0x855A, 0x5337, + 0x855B, 0x5338, 0x855C, 0x533C, 0x855D, 0x533D, 0x855E, 0x5340, + 0x855F, 0x5342, 0x8560, 0x5344, 0x8561, 0x5346, 0x8562, 0x534B, + 0x8563, 0x534C, 0x8564, 0x534D, 0x8565, 0x5350, 0x8566, 0x5354, + 0x8567, 0x5358, 0x8568, 0x5359, 0x8569, 0x535B, 0x856A, 0x535D, + 0x856B, 0x5365, 0x856C, 0x5368, 0x856D, 0x536A, 0x856E, 0x536C, + 0x856F, 0x536D, 0x8570, 0x5372, 0x8571, 0x5376, 0x8572, 0x5379, + 0x8573, 0x537B, 0x8574, 0x537C, 0x8575, 0x537D, 0x8576, 0x537E, + 0x8577, 0x5380, 0x8578, 0x5381, 0x8579, 0x5383, 0x857A, 0x5387, + 0x857B, 0x5388, 0x857C, 0x538A, 0x857D, 0x538E, 0x857E, 0x538F, + 0x8580, 0x5390, 0x8581, 0x5391, 0x8582, 0x5392, 0x8583, 0x5393, + 0x8584, 0x5394, 0x8585, 0x5396, 0x8586, 0x5397, 0x8587, 0x5399, + 0x8588, 0x539B, 0x8589, 0x539C, 0x858A, 0x539E, 0x858B, 0x53A0, + 0x858C, 0x53A1, 0x858D, 0x53A4, 0x858E, 0x53A7, 0x858F, 0x53AA, + 0x8590, 0x53AB, 0x8591, 0x53AC, 0x8592, 0x53AD, 0x8593, 0x53AF, + 0x8594, 0x53B0, 0x8595, 0x53B1, 0x8596, 0x53B2, 0x8597, 0x53B3, + 0x8598, 0x53B4, 0x8599, 0x53B5, 0x859A, 0x53B7, 0x859B, 0x53B8, + 0x859C, 0x53B9, 0x859D, 0x53BA, 0x859E, 0x53BC, 0x859F, 0x53BD, + 0x85A0, 0x53BE, 0x85A1, 0x53C0, 0x85A2, 0x53C3, 0x85A3, 0x53C4, + 0x85A4, 0x53C5, 0x85A5, 0x53C6, 0x85A6, 0x53C7, 0x85A7, 0x53CE, + 0x85A8, 0x53CF, 0x85A9, 0x53D0, 0x85AA, 0x53D2, 0x85AB, 0x53D3, + 0x85AC, 0x53D5, 0x85AD, 0x53DA, 0x85AE, 0x53DC, 0x85AF, 0x53DD, + 0x85B0, 0x53DE, 0x85B1, 0x53E1, 0x85B2, 0x53E2, 0x85B3, 0x53E7, + 0x85B4, 0x53F4, 0x85B5, 0x53FA, 0x85B6, 0x53FE, 0x85B7, 0x53FF, + 0x85B8, 0x5400, 0x85B9, 0x5402, 0x85BA, 0x5405, 0x85BB, 0x5407, + 0x85BC, 0x540B, 0x85BD, 0x5414, 0x85BE, 0x5418, 0x85BF, 0x5419, + 0x85C0, 0x541A, 0x85C1, 0x541C, 0x85C2, 0x5422, 0x85C3, 0x5424, + 0x85C4, 0x5425, 0x85C5, 0x542A, 0x85C6, 0x5430, 0x85C7, 0x5433, + 0x85C8, 0x5436, 0x85C9, 0x5437, 0x85CA, 0x543A, 0x85CB, 0x543D, + 0x85CC, 0x543F, 0x85CD, 0x5441, 0x85CE, 0x5442, 0x85CF, 0x5444, + 0x85D0, 0x5445, 0x85D1, 0x5447, 0x85D2, 0x5449, 0x85D3, 0x544C, + 0x85D4, 0x544D, 0x85D5, 0x544E, 0x85D6, 0x544F, 0x85D7, 0x5451, + 0x85D8, 0x545A, 0x85D9, 0x545D, 0x85DA, 0x545E, 0x85DB, 0x545F, + 0x85DC, 0x5460, 0x85DD, 0x5461, 0x85DE, 0x5463, 0x85DF, 0x5465, + 0x85E0, 0x5467, 0x85E1, 0x5469, 0x85E2, 0x546A, 0x85E3, 0x546B, + 0x85E4, 0x546C, 0x85E5, 0x546D, 0x85E6, 0x546E, 0x85E7, 0x546F, + 0x85E8, 0x5470, 0x85E9, 0x5474, 0x85EA, 0x5479, 0x85EB, 0x547A, + 0x85EC, 0x547E, 0x85ED, 0x547F, 0x85EE, 0x5481, 0x85EF, 0x5483, + 0x85F0, 0x5485, 0x85F1, 0x5487, 0x85F2, 0x5488, 0x85F3, 0x5489, + 0x85F4, 0x548A, 0x85F5, 0x548D, 0x85F6, 0x5491, 0x85F7, 0x5493, + 0x85F8, 0x5497, 0x85F9, 0x5498, 0x85FA, 0x549C, 0x85FB, 0x549E, + 0x85FC, 0x549F, 0x85FD, 0x54A0, 0x85FE, 0x54A1, 0x8640, 0x54A2, + 0x8641, 0x54A5, 0x8642, 0x54AE, 0x8643, 0x54B0, 0x8644, 0x54B2, + 0x8645, 0x54B5, 0x8646, 0x54B6, 0x8647, 0x54B7, 0x8648, 0x54B9, + 0x8649, 0x54BA, 0x864A, 0x54BC, 0x864B, 0x54BE, 0x864C, 0x54C3, + 0x864D, 0x54C5, 0x864E, 0x54CA, 0x864F, 0x54CB, 0x8650, 0x54D6, + 0x8651, 0x54D8, 0x8652, 0x54DB, 0x8653, 0x54E0, 0x8654, 0x54E1, + 0x8655, 0x54E2, 0x8656, 0x54E3, 0x8657, 0x54E4, 0x8658, 0x54EB, + 0x8659, 0x54EC, 0x865A, 0x54EF, 0x865B, 0x54F0, 0x865C, 0x54F1, + 0x865D, 0x54F4, 0x865E, 0x54F5, 0x865F, 0x54F6, 0x8660, 0x54F7, + 0x8661, 0x54F8, 0x8662, 0x54F9, 0x8663, 0x54FB, 0x8664, 0x54FE, + 0x8665, 0x5500, 0x8666, 0x5502, 0x8667, 0x5503, 0x8668, 0x5504, + 0x8669, 0x5505, 0x866A, 0x5508, 0x866B, 0x550A, 0x866C, 0x550B, + 0x866D, 0x550C, 0x866E, 0x550D, 0x866F, 0x550E, 0x8670, 0x5512, + 0x8671, 0x5513, 0x8672, 0x5515, 0x8673, 0x5516, 0x8674, 0x5517, + 0x8675, 0x5518, 0x8676, 0x5519, 0x8677, 0x551A, 0x8678, 0x551C, + 0x8679, 0x551D, 0x867A, 0x551E, 0x867B, 0x551F, 0x867C, 0x5521, + 0x867D, 0x5525, 0x867E, 0x5526, 0x8680, 0x5528, 0x8681, 0x5529, + 0x8682, 0x552B, 0x8683, 0x552D, 0x8684, 0x5532, 0x8685, 0x5534, + 0x8686, 0x5535, 0x8687, 0x5536, 0x8688, 0x5538, 0x8689, 0x5539, + 0x868A, 0x553A, 0x868B, 0x553B, 0x868C, 0x553D, 0x868D, 0x5540, + 0x868E, 0x5542, 0x868F, 0x5545, 0x8690, 0x5547, 0x8691, 0x5548, + 0x8692, 0x554B, 0x8693, 0x554C, 0x8694, 0x554D, 0x8695, 0x554E, + 0x8696, 0x554F, 0x8697, 0x5551, 0x8698, 0x5552, 0x8699, 0x5553, + 0x869A, 0x5554, 0x869B, 0x5557, 0x869C, 0x5558, 0x869D, 0x5559, + 0x869E, 0x555A, 0x869F, 0x555B, 0x86A0, 0x555D, 0x86A1, 0x555E, + 0x86A2, 0x555F, 0x86A3, 0x5560, 0x86A4, 0x5562, 0x86A5, 0x5563, + 0x86A6, 0x5568, 0x86A7, 0x5569, 0x86A8, 0x556B, 0x86A9, 0x556F, + 0x86AA, 0x5570, 0x86AB, 0x5571, 0x86AC, 0x5572, 0x86AD, 0x5573, + 0x86AE, 0x5574, 0x86AF, 0x5579, 0x86B0, 0x557A, 0x86B1, 0x557D, + 0x86B2, 0x557F, 0x86B3, 0x5585, 0x86B4, 0x5586, 0x86B5, 0x558C, + 0x86B6, 0x558D, 0x86B7, 0x558E, 0x86B8, 0x5590, 0x86B9, 0x5592, + 0x86BA, 0x5593, 0x86BB, 0x5595, 0x86BC, 0x5596, 0x86BD, 0x5597, + 0x86BE, 0x559A, 0x86BF, 0x559B, 0x86C0, 0x559E, 0x86C1, 0x55A0, + 0x86C2, 0x55A1, 0x86C3, 0x55A2, 0x86C4, 0x55A3, 0x86C5, 0x55A4, + 0x86C6, 0x55A5, 0x86C7, 0x55A6, 0x86C8, 0x55A8, 0x86C9, 0x55A9, + 0x86CA, 0x55AA, 0x86CB, 0x55AB, 0x86CC, 0x55AC, 0x86CD, 0x55AD, + 0x86CE, 0x55AE, 0x86CF, 0x55AF, 0x86D0, 0x55B0, 0x86D1, 0x55B2, + 0x86D2, 0x55B4, 0x86D3, 0x55B6, 0x86D4, 0x55B8, 0x86D5, 0x55BA, + 0x86D6, 0x55BC, 0x86D7, 0x55BF, 0x86D8, 0x55C0, 0x86D9, 0x55C1, + 0x86DA, 0x55C2, 0x86DB, 0x55C3, 0x86DC, 0x55C6, 0x86DD, 0x55C7, + 0x86DE, 0x55C8, 0x86DF, 0x55CA, 0x86E0, 0x55CB, 0x86E1, 0x55CE, + 0x86E2, 0x55CF, 0x86E3, 0x55D0, 0x86E4, 0x55D5, 0x86E5, 0x55D7, + 0x86E6, 0x55D8, 0x86E7, 0x55D9, 0x86E8, 0x55DA, 0x86E9, 0x55DB, + 0x86EA, 0x55DE, 0x86EB, 0x55E0, 0x86EC, 0x55E2, 0x86ED, 0x55E7, + 0x86EE, 0x55E9, 0x86EF, 0x55ED, 0x86F0, 0x55EE, 0x86F1, 0x55F0, + 0x86F2, 0x55F1, 0x86F3, 0x55F4, 0x86F4, 0x55F6, 0x86F5, 0x55F8, + 0x86F6, 0x55F9, 0x86F7, 0x55FA, 0x86F8, 0x55FB, 0x86F9, 0x55FC, + 0x86FA, 0x55FF, 0x86FB, 0x5602, 0x86FC, 0x5603, 0x86FD, 0x5604, + 0x86FE, 0x5605, 0x8740, 0x5606, 0x8741, 0x5607, 0x8742, 0x560A, + 0x8743, 0x560B, 0x8744, 0x560D, 0x8745, 0x5610, 0x8746, 0x5611, + 0x8747, 0x5612, 0x8748, 0x5613, 0x8749, 0x5614, 0x874A, 0x5615, + 0x874B, 0x5616, 0x874C, 0x5617, 0x874D, 0x5619, 0x874E, 0x561A, + 0x874F, 0x561C, 0x8750, 0x561D, 0x8751, 0x5620, 0x8752, 0x5621, + 0x8753, 0x5622, 0x8754, 0x5625, 0x8755, 0x5626, 0x8756, 0x5628, + 0x8757, 0x5629, 0x8758, 0x562A, 0x8759, 0x562B, 0x875A, 0x562E, + 0x875B, 0x562F, 0x875C, 0x5630, 0x875D, 0x5633, 0x875E, 0x5635, + 0x875F, 0x5637, 0x8760, 0x5638, 0x8761, 0x563A, 0x8762, 0x563C, + 0x8763, 0x563D, 0x8764, 0x563E, 0x8765, 0x5640, 0x8766, 0x5641, + 0x8767, 0x5642, 0x8768, 0x5643, 0x8769, 0x5644, 0x876A, 0x5645, + 0x876B, 0x5646, 0x876C, 0x5647, 0x876D, 0x5648, 0x876E, 0x5649, + 0x876F, 0x564A, 0x8770, 0x564B, 0x8771, 0x564F, 0x8772, 0x5650, + 0x8773, 0x5651, 0x8774, 0x5652, 0x8775, 0x5653, 0x8776, 0x5655, + 0x8777, 0x5656, 0x8778, 0x565A, 0x8779, 0x565B, 0x877A, 0x565D, + 0x877B, 0x565E, 0x877C, 0x565F, 0x877D, 0x5660, 0x877E, 0x5661, + 0x8780, 0x5663, 0x8781, 0x5665, 0x8782, 0x5666, 0x8783, 0x5667, + 0x8784, 0x566D, 0x8785, 0x566E, 0x8786, 0x566F, 0x8787, 0x5670, + 0x8788, 0x5672, 0x8789, 0x5673, 0x878A, 0x5674, 0x878B, 0x5675, + 0x878C, 0x5677, 0x878D, 0x5678, 0x878E, 0x5679, 0x878F, 0x567A, + 0x8790, 0x567D, 0x8791, 0x567E, 0x8792, 0x567F, 0x8793, 0x5680, + 0x8794, 0x5681, 0x8795, 0x5682, 0x8796, 0x5683, 0x8797, 0x5684, + 0x8798, 0x5687, 0x8799, 0x5688, 0x879A, 0x5689, 0x879B, 0x568A, + 0x879C, 0x568B, 0x879D, 0x568C, 0x879E, 0x568D, 0x879F, 0x5690, + 0x87A0, 0x5691, 0x87A1, 0x5692, 0x87A2, 0x5694, 0x87A3, 0x5695, + 0x87A4, 0x5696, 0x87A5, 0x5697, 0x87A6, 0x5698, 0x87A7, 0x5699, + 0x87A8, 0x569A, 0x87A9, 0x569B, 0x87AA, 0x569C, 0x87AB, 0x569D, + 0x87AC, 0x569E, 0x87AD, 0x569F, 0x87AE, 0x56A0, 0x87AF, 0x56A1, + 0x87B0, 0x56A2, 0x87B1, 0x56A4, 0x87B2, 0x56A5, 0x87B3, 0x56A6, + 0x87B4, 0x56A7, 0x87B5, 0x56A8, 0x87B6, 0x56A9, 0x87B7, 0x56AA, + 0x87B8, 0x56AB, 0x87B9, 0x56AC, 0x87BA, 0x56AD, 0x87BB, 0x56AE, + 0x87BC, 0x56B0, 0x87BD, 0x56B1, 0x87BE, 0x56B2, 0x87BF, 0x56B3, + 0x87C0, 0x56B4, 0x87C1, 0x56B5, 0x87C2, 0x56B6, 0x87C3, 0x56B8, + 0x87C4, 0x56B9, 0x87C5, 0x56BA, 0x87C6, 0x56BB, 0x87C7, 0x56BD, + 0x87C8, 0x56BE, 0x87C9, 0x56BF, 0x87CA, 0x56C0, 0x87CB, 0x56C1, + 0x87CC, 0x56C2, 0x87CD, 0x56C3, 0x87CE, 0x56C4, 0x87CF, 0x56C5, + 0x87D0, 0x56C6, 0x87D1, 0x56C7, 0x87D2, 0x56C8, 0x87D3, 0x56C9, + 0x87D4, 0x56CB, 0x87D5, 0x56CC, 0x87D6, 0x56CD, 0x87D7, 0x56CE, + 0x87D8, 0x56CF, 0x87D9, 0x56D0, 0x87DA, 0x56D1, 0x87DB, 0x56D2, + 0x87DC, 0x56D3, 0x87DD, 0x56D5, 0x87DE, 0x56D6, 0x87DF, 0x56D8, + 0x87E0, 0x56D9, 0x87E1, 0x56DC, 0x87E2, 0x56E3, 0x87E3, 0x56E5, + 0x87E4, 0x56E6, 0x87E5, 0x56E7, 0x87E6, 0x56E8, 0x87E7, 0x56E9, + 0x87E8, 0x56EA, 0x87E9, 0x56EC, 0x87EA, 0x56EE, 0x87EB, 0x56EF, + 0x87EC, 0x56F2, 0x87ED, 0x56F3, 0x87EE, 0x56F6, 0x87EF, 0x56F7, + 0x87F0, 0x56F8, 0x87F1, 0x56FB, 0x87F2, 0x56FC, 0x87F3, 0x5700, + 0x87F4, 0x5701, 0x87F5, 0x5702, 0x87F6, 0x5705, 0x87F7, 0x5707, + 0x87F8, 0x570B, 0x87F9, 0x570C, 0x87FA, 0x570D, 0x87FB, 0x570E, + 0x87FC, 0x570F, 0x87FD, 0x5710, 0x87FE, 0x5711, 0x8840, 0x5712, + 0x8841, 0x5713, 0x8842, 0x5714, 0x8843, 0x5715, 0x8844, 0x5716, + 0x8845, 0x5717, 0x8846, 0x5718, 0x8847, 0x5719, 0x8848, 0x571A, + 0x8849, 0x571B, 0x884A, 0x571D, 0x884B, 0x571E, 0x884C, 0x5720, + 0x884D, 0x5721, 0x884E, 0x5722, 0x884F, 0x5724, 0x8850, 0x5725, + 0x8851, 0x5726, 0x8852, 0x5727, 0x8853, 0x572B, 0x8854, 0x5731, + 0x8855, 0x5732, 0x8856, 0x5734, 0x8857, 0x5735, 0x8858, 0x5736, + 0x8859, 0x5737, 0x885A, 0x5738, 0x885B, 0x573C, 0x885C, 0x573D, + 0x885D, 0x573F, 0x885E, 0x5741, 0x885F, 0x5743, 0x8860, 0x5744, + 0x8861, 0x5745, 0x8862, 0x5746, 0x8863, 0x5748, 0x8864, 0x5749, + 0x8865, 0x574B, 0x8866, 0x5752, 0x8867, 0x5753, 0x8868, 0x5754, + 0x8869, 0x5755, 0x886A, 0x5756, 0x886B, 0x5758, 0x886C, 0x5759, + 0x886D, 0x5762, 0x886E, 0x5763, 0x886F, 0x5765, 0x8870, 0x5767, + 0x8871, 0x576C, 0x8872, 0x576E, 0x8873, 0x5770, 0x8874, 0x5771, + 0x8875, 0x5772, 0x8876, 0x5774, 0x8877, 0x5775, 0x8878, 0x5778, + 0x8879, 0x5779, 0x887A, 0x577A, 0x887B, 0x577D, 0x887C, 0x577E, + 0x887D, 0x577F, 0x887E, 0x5780, 0x8880, 0x5781, 0x8881, 0x5787, + 0x8882, 0x5788, 0x8883, 0x5789, 0x8884, 0x578A, 0x8885, 0x578D, + 0x8886, 0x578E, 0x8887, 0x578F, 0x8888, 0x5790, 0x8889, 0x5791, + 0x888A, 0x5794, 0x888B, 0x5795, 0x888C, 0x5796, 0x888D, 0x5797, + 0x888E, 0x5798, 0x888F, 0x5799, 0x8890, 0x579A, 0x8891, 0x579C, + 0x8892, 0x579D, 0x8893, 0x579E, 0x8894, 0x579F, 0x8895, 0x57A5, + 0x8896, 0x57A8, 0x8897, 0x57AA, 0x8898, 0x57AC, 0x8899, 0x57AF, + 0x889A, 0x57B0, 0x889B, 0x57B1, 0x889C, 0x57B3, 0x889D, 0x57B5, + 0x889E, 0x57B6, 0x889F, 0x57B7, 0x88A0, 0x57B9, 0x88A1, 0x57BA, + 0x88A2, 0x57BB, 0x88A3, 0x57BC, 0x88A4, 0x57BD, 0x88A5, 0x57BE, + 0x88A6, 0x57BF, 0x88A7, 0x57C0, 0x88A8, 0x57C1, 0x88A9, 0x57C4, + 0x88AA, 0x57C5, 0x88AB, 0x57C6, 0x88AC, 0x57C7, 0x88AD, 0x57C8, + 0x88AE, 0x57C9, 0x88AF, 0x57CA, 0x88B0, 0x57CC, 0x88B1, 0x57CD, + 0x88B2, 0x57D0, 0x88B3, 0x57D1, 0x88B4, 0x57D3, 0x88B5, 0x57D6, + 0x88B6, 0x57D7, 0x88B7, 0x57DB, 0x88B8, 0x57DC, 0x88B9, 0x57DE, + 0x88BA, 0x57E1, 0x88BB, 0x57E2, 0x88BC, 0x57E3, 0x88BD, 0x57E5, + 0x88BE, 0x57E6, 0x88BF, 0x57E7, 0x88C0, 0x57E8, 0x88C1, 0x57E9, + 0x88C2, 0x57EA, 0x88C3, 0x57EB, 0x88C4, 0x57EC, 0x88C5, 0x57EE, + 0x88C6, 0x57F0, 0x88C7, 0x57F1, 0x88C8, 0x57F2, 0x88C9, 0x57F3, + 0x88CA, 0x57F5, 0x88CB, 0x57F6, 0x88CC, 0x57F7, 0x88CD, 0x57FB, + 0x88CE, 0x57FC, 0x88CF, 0x57FE, 0x88D0, 0x57FF, 0x88D1, 0x5801, + 0x88D2, 0x5803, 0x88D3, 0x5804, 0x88D4, 0x5805, 0x88D5, 0x5808, + 0x88D6, 0x5809, 0x88D7, 0x580A, 0x88D8, 0x580C, 0x88D9, 0x580E, + 0x88DA, 0x580F, 0x88DB, 0x5810, 0x88DC, 0x5812, 0x88DD, 0x5813, + 0x88DE, 0x5814, 0x88DF, 0x5816, 0x88E0, 0x5817, 0x88E1, 0x5818, + 0x88E2, 0x581A, 0x88E3, 0x581B, 0x88E4, 0x581C, 0x88E5, 0x581D, + 0x88E6, 0x581F, 0x88E7, 0x5822, 0x88E8, 0x5823, 0x88E9, 0x5825, + 0x88EA, 0x5826, 0x88EB, 0x5827, 0x88EC, 0x5828, 0x88ED, 0x5829, + 0x88EE, 0x582B, 0x88EF, 0x582C, 0x88F0, 0x582D, 0x88F1, 0x582E, + 0x88F2, 0x582F, 0x88F3, 0x5831, 0x88F4, 0x5832, 0x88F5, 0x5833, + 0x88F6, 0x5834, 0x88F7, 0x5836, 0x88F8, 0x5837, 0x88F9, 0x5838, + 0x88FA, 0x5839, 0x88FB, 0x583A, 0x88FC, 0x583B, 0x88FD, 0x583C, + 0x88FE, 0x583D, 0x8940, 0x583E, 0x8941, 0x583F, 0x8942, 0x5840, + 0x8943, 0x5841, 0x8944, 0x5842, 0x8945, 0x5843, 0x8946, 0x5845, + 0x8947, 0x5846, 0x8948, 0x5847, 0x8949, 0x5848, 0x894A, 0x5849, + 0x894B, 0x584A, 0x894C, 0x584B, 0x894D, 0x584E, 0x894E, 0x584F, + 0x894F, 0x5850, 0x8950, 0x5852, 0x8951, 0x5853, 0x8952, 0x5855, + 0x8953, 0x5856, 0x8954, 0x5857, 0x8955, 0x5859, 0x8956, 0x585A, + 0x8957, 0x585B, 0x8958, 0x585C, 0x8959, 0x585D, 0x895A, 0x585F, + 0x895B, 0x5860, 0x895C, 0x5861, 0x895D, 0x5862, 0x895E, 0x5863, + 0x895F, 0x5864, 0x8960, 0x5866, 0x8961, 0x5867, 0x8962, 0x5868, + 0x8963, 0x5869, 0x8964, 0x586A, 0x8965, 0x586D, 0x8966, 0x586E, + 0x8967, 0x586F, 0x8968, 0x5870, 0x8969, 0x5871, 0x896A, 0x5872, + 0x896B, 0x5873, 0x896C, 0x5874, 0x896D, 0x5875, 0x896E, 0x5876, + 0x896F, 0x5877, 0x8970, 0x5878, 0x8971, 0x5879, 0x8972, 0x587A, + 0x8973, 0x587B, 0x8974, 0x587C, 0x8975, 0x587D, 0x8976, 0x587F, + 0x8977, 0x5882, 0x8978, 0x5884, 0x8979, 0x5886, 0x897A, 0x5887, + 0x897B, 0x5888, 0x897C, 0x588A, 0x897D, 0x588B, 0x897E, 0x588C, + 0x8980, 0x588D, 0x8981, 0x588E, 0x8982, 0x588F, 0x8983, 0x5890, + 0x8984, 0x5891, 0x8985, 0x5894, 0x8986, 0x5895, 0x8987, 0x5896, + 0x8988, 0x5897, 0x8989, 0x5898, 0x898A, 0x589B, 0x898B, 0x589C, + 0x898C, 0x589D, 0x898D, 0x58A0, 0x898E, 0x58A1, 0x898F, 0x58A2, + 0x8990, 0x58A3, 0x8991, 0x58A4, 0x8992, 0x58A5, 0x8993, 0x58A6, + 0x8994, 0x58A7, 0x8995, 0x58AA, 0x8996, 0x58AB, 0x8997, 0x58AC, + 0x8998, 0x58AD, 0x8999, 0x58AE, 0x899A, 0x58AF, 0x899B, 0x58B0, + 0x899C, 0x58B1, 0x899D, 0x58B2, 0x899E, 0x58B3, 0x899F, 0x58B4, + 0x89A0, 0x58B5, 0x89A1, 0x58B6, 0x89A2, 0x58B7, 0x89A3, 0x58B8, + 0x89A4, 0x58B9, 0x89A5, 0x58BA, 0x89A6, 0x58BB, 0x89A7, 0x58BD, + 0x89A8, 0x58BE, 0x89A9, 0x58BF, 0x89AA, 0x58C0, 0x89AB, 0x58C2, + 0x89AC, 0x58C3, 0x89AD, 0x58C4, 0x89AE, 0x58C6, 0x89AF, 0x58C7, + 0x89B0, 0x58C8, 0x89B1, 0x58C9, 0x89B2, 0x58CA, 0x89B3, 0x58CB, + 0x89B4, 0x58CC, 0x89B5, 0x58CD, 0x89B6, 0x58CE, 0x89B7, 0x58CF, + 0x89B8, 0x58D0, 0x89B9, 0x58D2, 0x89BA, 0x58D3, 0x89BB, 0x58D4, + 0x89BC, 0x58D6, 0x89BD, 0x58D7, 0x89BE, 0x58D8, 0x89BF, 0x58D9, + 0x89C0, 0x58DA, 0x89C1, 0x58DB, 0x89C2, 0x58DC, 0x89C3, 0x58DD, + 0x89C4, 0x58DE, 0x89C5, 0x58DF, 0x89C6, 0x58E0, 0x89C7, 0x58E1, + 0x89C8, 0x58E2, 0x89C9, 0x58E3, 0x89CA, 0x58E5, 0x89CB, 0x58E6, + 0x89CC, 0x58E7, 0x89CD, 0x58E8, 0x89CE, 0x58E9, 0x89CF, 0x58EA, + 0x89D0, 0x58ED, 0x89D1, 0x58EF, 0x89D2, 0x58F1, 0x89D3, 0x58F2, + 0x89D4, 0x58F4, 0x89D5, 0x58F5, 0x89D6, 0x58F7, 0x89D7, 0x58F8, + 0x89D8, 0x58FA, 0x89D9, 0x58FB, 0x89DA, 0x58FC, 0x89DB, 0x58FD, + 0x89DC, 0x58FE, 0x89DD, 0x58FF, 0x89DE, 0x5900, 0x89DF, 0x5901, + 0x89E0, 0x5903, 0x89E1, 0x5905, 0x89E2, 0x5906, 0x89E3, 0x5908, + 0x89E4, 0x5909, 0x89E5, 0x590A, 0x89E6, 0x590B, 0x89E7, 0x590C, + 0x89E8, 0x590E, 0x89E9, 0x5910, 0x89EA, 0x5911, 0x89EB, 0x5912, + 0x89EC, 0x5913, 0x89ED, 0x5917, 0x89EE, 0x5918, 0x89EF, 0x591B, + 0x89F0, 0x591D, 0x89F1, 0x591E, 0x89F2, 0x5920, 0x89F3, 0x5921, + 0x89F4, 0x5922, 0x89F5, 0x5923, 0x89F6, 0x5926, 0x89F7, 0x5928, + 0x89F8, 0x592C, 0x89F9, 0x5930, 0x89FA, 0x5932, 0x89FB, 0x5933, + 0x89FC, 0x5935, 0x89FD, 0x5936, 0x89FE, 0x593B, 0x8A40, 0x593D, + 0x8A41, 0x593E, 0x8A42, 0x593F, 0x8A43, 0x5940, 0x8A44, 0x5943, + 0x8A45, 0x5945, 0x8A46, 0x5946, 0x8A47, 0x594A, 0x8A48, 0x594C, + 0x8A49, 0x594D, 0x8A4A, 0x5950, 0x8A4B, 0x5952, 0x8A4C, 0x5953, + 0x8A4D, 0x5959, 0x8A4E, 0x595B, 0x8A4F, 0x595C, 0x8A50, 0x595D, + 0x8A51, 0x595E, 0x8A52, 0x595F, 0x8A53, 0x5961, 0x8A54, 0x5963, + 0x8A55, 0x5964, 0x8A56, 0x5966, 0x8A57, 0x5967, 0x8A58, 0x5968, + 0x8A59, 0x5969, 0x8A5A, 0x596A, 0x8A5B, 0x596B, 0x8A5C, 0x596C, + 0x8A5D, 0x596D, 0x8A5E, 0x596E, 0x8A5F, 0x596F, 0x8A60, 0x5970, + 0x8A61, 0x5971, 0x8A62, 0x5972, 0x8A63, 0x5975, 0x8A64, 0x5977, + 0x8A65, 0x597A, 0x8A66, 0x597B, 0x8A67, 0x597C, 0x8A68, 0x597E, + 0x8A69, 0x597F, 0x8A6A, 0x5980, 0x8A6B, 0x5985, 0x8A6C, 0x5989, + 0x8A6D, 0x598B, 0x8A6E, 0x598C, 0x8A6F, 0x598E, 0x8A70, 0x598F, + 0x8A71, 0x5990, 0x8A72, 0x5991, 0x8A73, 0x5994, 0x8A74, 0x5995, + 0x8A75, 0x5998, 0x8A76, 0x599A, 0x8A77, 0x599B, 0x8A78, 0x599C, + 0x8A79, 0x599D, 0x8A7A, 0x599F, 0x8A7B, 0x59A0, 0x8A7C, 0x59A1, + 0x8A7D, 0x59A2, 0x8A7E, 0x59A6, 0x8A80, 0x59A7, 0x8A81, 0x59AC, + 0x8A82, 0x59AD, 0x8A83, 0x59B0, 0x8A84, 0x59B1, 0x8A85, 0x59B3, + 0x8A86, 0x59B4, 0x8A87, 0x59B5, 0x8A88, 0x59B6, 0x8A89, 0x59B7, + 0x8A8A, 0x59B8, 0x8A8B, 0x59BA, 0x8A8C, 0x59BC, 0x8A8D, 0x59BD, + 0x8A8E, 0x59BF, 0x8A8F, 0x59C0, 0x8A90, 0x59C1, 0x8A91, 0x59C2, + 0x8A92, 0x59C3, 0x8A93, 0x59C4, 0x8A94, 0x59C5, 0x8A95, 0x59C7, + 0x8A96, 0x59C8, 0x8A97, 0x59C9, 0x8A98, 0x59CC, 0x8A99, 0x59CD, + 0x8A9A, 0x59CE, 0x8A9B, 0x59CF, 0x8A9C, 0x59D5, 0x8A9D, 0x59D6, + 0x8A9E, 0x59D9, 0x8A9F, 0x59DB, 0x8AA0, 0x59DE, 0x8AA1, 0x59DF, + 0x8AA2, 0x59E0, 0x8AA3, 0x59E1, 0x8AA4, 0x59E2, 0x8AA5, 0x59E4, + 0x8AA6, 0x59E6, 0x8AA7, 0x59E7, 0x8AA8, 0x59E9, 0x8AA9, 0x59EA, + 0x8AAA, 0x59EB, 0x8AAB, 0x59ED, 0x8AAC, 0x59EE, 0x8AAD, 0x59EF, + 0x8AAE, 0x59F0, 0x8AAF, 0x59F1, 0x8AB0, 0x59F2, 0x8AB1, 0x59F3, + 0x8AB2, 0x59F4, 0x8AB3, 0x59F5, 0x8AB4, 0x59F6, 0x8AB5, 0x59F7, + 0x8AB6, 0x59F8, 0x8AB7, 0x59FA, 0x8AB8, 0x59FC, 0x8AB9, 0x59FD, + 0x8ABA, 0x59FE, 0x8ABB, 0x5A00, 0x8ABC, 0x5A02, 0x8ABD, 0x5A0A, + 0x8ABE, 0x5A0B, 0x8ABF, 0x5A0D, 0x8AC0, 0x5A0E, 0x8AC1, 0x5A0F, + 0x8AC2, 0x5A10, 0x8AC3, 0x5A12, 0x8AC4, 0x5A14, 0x8AC5, 0x5A15, + 0x8AC6, 0x5A16, 0x8AC7, 0x5A17, 0x8AC8, 0x5A19, 0x8AC9, 0x5A1A, + 0x8ACA, 0x5A1B, 0x8ACB, 0x5A1D, 0x8ACC, 0x5A1E, 0x8ACD, 0x5A21, + 0x8ACE, 0x5A22, 0x8ACF, 0x5A24, 0x8AD0, 0x5A26, 0x8AD1, 0x5A27, + 0x8AD2, 0x5A28, 0x8AD3, 0x5A2A, 0x8AD4, 0x5A2B, 0x8AD5, 0x5A2C, + 0x8AD6, 0x5A2D, 0x8AD7, 0x5A2E, 0x8AD8, 0x5A2F, 0x8AD9, 0x5A30, + 0x8ADA, 0x5A33, 0x8ADB, 0x5A35, 0x8ADC, 0x5A37, 0x8ADD, 0x5A38, + 0x8ADE, 0x5A39, 0x8ADF, 0x5A3A, 0x8AE0, 0x5A3B, 0x8AE1, 0x5A3D, + 0x8AE2, 0x5A3E, 0x8AE3, 0x5A3F, 0x8AE4, 0x5A41, 0x8AE5, 0x5A42, + 0x8AE6, 0x5A43, 0x8AE7, 0x5A44, 0x8AE8, 0x5A45, 0x8AE9, 0x5A47, + 0x8AEA, 0x5A48, 0x8AEB, 0x5A4B, 0x8AEC, 0x5A4C, 0x8AED, 0x5A4D, + 0x8AEE, 0x5A4E, 0x8AEF, 0x5A4F, 0x8AF0, 0x5A50, 0x8AF1, 0x5A51, + 0x8AF2, 0x5A52, 0x8AF3, 0x5A53, 0x8AF4, 0x5A54, 0x8AF5, 0x5A56, + 0x8AF6, 0x5A57, 0x8AF7, 0x5A58, 0x8AF8, 0x5A59, 0x8AF9, 0x5A5B, + 0x8AFA, 0x5A5C, 0x8AFB, 0x5A5D, 0x8AFC, 0x5A5E, 0x8AFD, 0x5A5F, + 0x8AFE, 0x5A60, 0x8B40, 0x5A61, 0x8B41, 0x5A63, 0x8B42, 0x5A64, + 0x8B43, 0x5A65, 0x8B44, 0x5A66, 0x8B45, 0x5A68, 0x8B46, 0x5A69, + 0x8B47, 0x5A6B, 0x8B48, 0x5A6C, 0x8B49, 0x5A6D, 0x8B4A, 0x5A6E, + 0x8B4B, 0x5A6F, 0x8B4C, 0x5A70, 0x8B4D, 0x5A71, 0x8B4E, 0x5A72, + 0x8B4F, 0x5A73, 0x8B50, 0x5A78, 0x8B51, 0x5A79, 0x8B52, 0x5A7B, + 0x8B53, 0x5A7C, 0x8B54, 0x5A7D, 0x8B55, 0x5A7E, 0x8B56, 0x5A80, + 0x8B57, 0x5A81, 0x8B58, 0x5A82, 0x8B59, 0x5A83, 0x8B5A, 0x5A84, + 0x8B5B, 0x5A85, 0x8B5C, 0x5A86, 0x8B5D, 0x5A87, 0x8B5E, 0x5A88, + 0x8B5F, 0x5A89, 0x8B60, 0x5A8A, 0x8B61, 0x5A8B, 0x8B62, 0x5A8C, + 0x8B63, 0x5A8D, 0x8B64, 0x5A8E, 0x8B65, 0x5A8F, 0x8B66, 0x5A90, + 0x8B67, 0x5A91, 0x8B68, 0x5A93, 0x8B69, 0x5A94, 0x8B6A, 0x5A95, + 0x8B6B, 0x5A96, 0x8B6C, 0x5A97, 0x8B6D, 0x5A98, 0x8B6E, 0x5A99, + 0x8B6F, 0x5A9C, 0x8B70, 0x5A9D, 0x8B71, 0x5A9E, 0x8B72, 0x5A9F, + 0x8B73, 0x5AA0, 0x8B74, 0x5AA1, 0x8B75, 0x5AA2, 0x8B76, 0x5AA3, + 0x8B77, 0x5AA4, 0x8B78, 0x5AA5, 0x8B79, 0x5AA6, 0x8B7A, 0x5AA7, + 0x8B7B, 0x5AA8, 0x8B7C, 0x5AA9, 0x8B7D, 0x5AAB, 0x8B7E, 0x5AAC, + 0x8B80, 0x5AAD, 0x8B81, 0x5AAE, 0x8B82, 0x5AAF, 0x8B83, 0x5AB0, + 0x8B84, 0x5AB1, 0x8B85, 0x5AB4, 0x8B86, 0x5AB6, 0x8B87, 0x5AB7, + 0x8B88, 0x5AB9, 0x8B89, 0x5ABA, 0x8B8A, 0x5ABB, 0x8B8B, 0x5ABC, + 0x8B8C, 0x5ABD, 0x8B8D, 0x5ABF, 0x8B8E, 0x5AC0, 0x8B8F, 0x5AC3, + 0x8B90, 0x5AC4, 0x8B91, 0x5AC5, 0x8B92, 0x5AC6, 0x8B93, 0x5AC7, + 0x8B94, 0x5AC8, 0x8B95, 0x5ACA, 0x8B96, 0x5ACB, 0x8B97, 0x5ACD, + 0x8B98, 0x5ACE, 0x8B99, 0x5ACF, 0x8B9A, 0x5AD0, 0x8B9B, 0x5AD1, + 0x8B9C, 0x5AD3, 0x8B9D, 0x5AD5, 0x8B9E, 0x5AD7, 0x8B9F, 0x5AD9, + 0x8BA0, 0x5ADA, 0x8BA1, 0x5ADB, 0x8BA2, 0x5ADD, 0x8BA3, 0x5ADE, + 0x8BA4, 0x5ADF, 0x8BA5, 0x5AE2, 0x8BA6, 0x5AE4, 0x8BA7, 0x5AE5, + 0x8BA8, 0x5AE7, 0x8BA9, 0x5AE8, 0x8BAA, 0x5AEA, 0x8BAB, 0x5AEC, + 0x8BAC, 0x5AED, 0x8BAD, 0x5AEE, 0x8BAE, 0x5AEF, 0x8BAF, 0x5AF0, + 0x8BB0, 0x5AF2, 0x8BB1, 0x5AF3, 0x8BB2, 0x5AF4, 0x8BB3, 0x5AF5, + 0x8BB4, 0x5AF6, 0x8BB5, 0x5AF7, 0x8BB6, 0x5AF8, 0x8BB7, 0x5AF9, + 0x8BB8, 0x5AFA, 0x8BB9, 0x5AFB, 0x8BBA, 0x5AFC, 0x8BBB, 0x5AFD, + 0x8BBC, 0x5AFE, 0x8BBD, 0x5AFF, 0x8BBE, 0x5B00, 0x8BBF, 0x5B01, + 0x8BC0, 0x5B02, 0x8BC1, 0x5B03, 0x8BC2, 0x5B04, 0x8BC3, 0x5B05, + 0x8BC4, 0x5B06, 0x8BC5, 0x5B07, 0x8BC6, 0x5B08, 0x8BC7, 0x5B0A, + 0x8BC8, 0x5B0B, 0x8BC9, 0x5B0C, 0x8BCA, 0x5B0D, 0x8BCB, 0x5B0E, + 0x8BCC, 0x5B0F, 0x8BCD, 0x5B10, 0x8BCE, 0x5B11, 0x8BCF, 0x5B12, + 0x8BD0, 0x5B13, 0x8BD1, 0x5B14, 0x8BD2, 0x5B15, 0x8BD3, 0x5B18, + 0x8BD4, 0x5B19, 0x8BD5, 0x5B1A, 0x8BD6, 0x5B1B, 0x8BD7, 0x5B1C, + 0x8BD8, 0x5B1D, 0x8BD9, 0x5B1E, 0x8BDA, 0x5B1F, 0x8BDB, 0x5B20, + 0x8BDC, 0x5B21, 0x8BDD, 0x5B22, 0x8BDE, 0x5B23, 0x8BDF, 0x5B24, + 0x8BE0, 0x5B25, 0x8BE1, 0x5B26, 0x8BE2, 0x5B27, 0x8BE3, 0x5B28, + 0x8BE4, 0x5B29, 0x8BE5, 0x5B2A, 0x8BE6, 0x5B2B, 0x8BE7, 0x5B2C, + 0x8BE8, 0x5B2D, 0x8BE9, 0x5B2E, 0x8BEA, 0x5B2F, 0x8BEB, 0x5B30, + 0x8BEC, 0x5B31, 0x8BED, 0x5B33, 0x8BEE, 0x5B35, 0x8BEF, 0x5B36, + 0x8BF0, 0x5B38, 0x8BF1, 0x5B39, 0x8BF2, 0x5B3A, 0x8BF3, 0x5B3B, + 0x8BF4, 0x5B3C, 0x8BF5, 0x5B3D, 0x8BF6, 0x5B3E, 0x8BF7, 0x5B3F, + 0x8BF8, 0x5B41, 0x8BF9, 0x5B42, 0x8BFA, 0x5B43, 0x8BFB, 0x5B44, + 0x8BFC, 0x5B45, 0x8BFD, 0x5B46, 0x8BFE, 0x5B47, 0x8C40, 0x5B48, + 0x8C41, 0x5B49, 0x8C42, 0x5B4A, 0x8C43, 0x5B4B, 0x8C44, 0x5B4C, + 0x8C45, 0x5B4D, 0x8C46, 0x5B4E, 0x8C47, 0x5B4F, 0x8C48, 0x5B52, + 0x8C49, 0x5B56, 0x8C4A, 0x5B5E, 0x8C4B, 0x5B60, 0x8C4C, 0x5B61, + 0x8C4D, 0x5B67, 0x8C4E, 0x5B68, 0x8C4F, 0x5B6B, 0x8C50, 0x5B6D, + 0x8C51, 0x5B6E, 0x8C52, 0x5B6F, 0x8C53, 0x5B72, 0x8C54, 0x5B74, + 0x8C55, 0x5B76, 0x8C56, 0x5B77, 0x8C57, 0x5B78, 0x8C58, 0x5B79, + 0x8C59, 0x5B7B, 0x8C5A, 0x5B7C, 0x8C5B, 0x5B7E, 0x8C5C, 0x5B7F, + 0x8C5D, 0x5B82, 0x8C5E, 0x5B86, 0x8C5F, 0x5B8A, 0x8C60, 0x5B8D, + 0x8C61, 0x5B8E, 0x8C62, 0x5B90, 0x8C63, 0x5B91, 0x8C64, 0x5B92, + 0x8C65, 0x5B94, 0x8C66, 0x5B96, 0x8C67, 0x5B9F, 0x8C68, 0x5BA7, + 0x8C69, 0x5BA8, 0x8C6A, 0x5BA9, 0x8C6B, 0x5BAC, 0x8C6C, 0x5BAD, + 0x8C6D, 0x5BAE, 0x8C6E, 0x5BAF, 0x8C6F, 0x5BB1, 0x8C70, 0x5BB2, + 0x8C71, 0x5BB7, 0x8C72, 0x5BBA, 0x8C73, 0x5BBB, 0x8C74, 0x5BBC, + 0x8C75, 0x5BC0, 0x8C76, 0x5BC1, 0x8C77, 0x5BC3, 0x8C78, 0x5BC8, + 0x8C79, 0x5BC9, 0x8C7A, 0x5BCA, 0x8C7B, 0x5BCB, 0x8C7C, 0x5BCD, + 0x8C7D, 0x5BCE, 0x8C7E, 0x5BCF, 0x8C80, 0x5BD1, 0x8C81, 0x5BD4, + 0x8C82, 0x5BD5, 0x8C83, 0x5BD6, 0x8C84, 0x5BD7, 0x8C85, 0x5BD8, + 0x8C86, 0x5BD9, 0x8C87, 0x5BDA, 0x8C88, 0x5BDB, 0x8C89, 0x5BDC, + 0x8C8A, 0x5BE0, 0x8C8B, 0x5BE2, 0x8C8C, 0x5BE3, 0x8C8D, 0x5BE6, + 0x8C8E, 0x5BE7, 0x8C8F, 0x5BE9, 0x8C90, 0x5BEA, 0x8C91, 0x5BEB, + 0x8C92, 0x5BEC, 0x8C93, 0x5BED, 0x8C94, 0x5BEF, 0x8C95, 0x5BF1, + 0x8C96, 0x5BF2, 0x8C97, 0x5BF3, 0x8C98, 0x5BF4, 0x8C99, 0x5BF5, + 0x8C9A, 0x5BF6, 0x8C9B, 0x5BF7, 0x8C9C, 0x5BFD, 0x8C9D, 0x5BFE, + 0x8C9E, 0x5C00, 0x8C9F, 0x5C02, 0x8CA0, 0x5C03, 0x8CA1, 0x5C05, + 0x8CA2, 0x5C07, 0x8CA3, 0x5C08, 0x8CA4, 0x5C0B, 0x8CA5, 0x5C0C, + 0x8CA6, 0x5C0D, 0x8CA7, 0x5C0E, 0x8CA8, 0x5C10, 0x8CA9, 0x5C12, + 0x8CAA, 0x5C13, 0x8CAB, 0x5C17, 0x8CAC, 0x5C19, 0x8CAD, 0x5C1B, + 0x8CAE, 0x5C1E, 0x8CAF, 0x5C1F, 0x8CB0, 0x5C20, 0x8CB1, 0x5C21, + 0x8CB2, 0x5C23, 0x8CB3, 0x5C26, 0x8CB4, 0x5C28, 0x8CB5, 0x5C29, + 0x8CB6, 0x5C2A, 0x8CB7, 0x5C2B, 0x8CB8, 0x5C2D, 0x8CB9, 0x5C2E, + 0x8CBA, 0x5C2F, 0x8CBB, 0x5C30, 0x8CBC, 0x5C32, 0x8CBD, 0x5C33, + 0x8CBE, 0x5C35, 0x8CBF, 0x5C36, 0x8CC0, 0x5C37, 0x8CC1, 0x5C43, + 0x8CC2, 0x5C44, 0x8CC3, 0x5C46, 0x8CC4, 0x5C47, 0x8CC5, 0x5C4C, + 0x8CC6, 0x5C4D, 0x8CC7, 0x5C52, 0x8CC8, 0x5C53, 0x8CC9, 0x5C54, + 0x8CCA, 0x5C56, 0x8CCB, 0x5C57, 0x8CCC, 0x5C58, 0x8CCD, 0x5C5A, + 0x8CCE, 0x5C5B, 0x8CCF, 0x5C5C, 0x8CD0, 0x5C5D, 0x8CD1, 0x5C5F, + 0x8CD2, 0x5C62, 0x8CD3, 0x5C64, 0x8CD4, 0x5C67, 0x8CD5, 0x5C68, + 0x8CD6, 0x5C69, 0x8CD7, 0x5C6A, 0x8CD8, 0x5C6B, 0x8CD9, 0x5C6C, + 0x8CDA, 0x5C6D, 0x8CDB, 0x5C70, 0x8CDC, 0x5C72, 0x8CDD, 0x5C73, + 0x8CDE, 0x5C74, 0x8CDF, 0x5C75, 0x8CE0, 0x5C76, 0x8CE1, 0x5C77, + 0x8CE2, 0x5C78, 0x8CE3, 0x5C7B, 0x8CE4, 0x5C7C, 0x8CE5, 0x5C7D, + 0x8CE6, 0x5C7E, 0x8CE7, 0x5C80, 0x8CE8, 0x5C83, 0x8CE9, 0x5C84, + 0x8CEA, 0x5C85, 0x8CEB, 0x5C86, 0x8CEC, 0x5C87, 0x8CED, 0x5C89, + 0x8CEE, 0x5C8A, 0x8CEF, 0x5C8B, 0x8CF0, 0x5C8E, 0x8CF1, 0x5C8F, + 0x8CF2, 0x5C92, 0x8CF3, 0x5C93, 0x8CF4, 0x5C95, 0x8CF5, 0x5C9D, + 0x8CF6, 0x5C9E, 0x8CF7, 0x5C9F, 0x8CF8, 0x5CA0, 0x8CF9, 0x5CA1, + 0x8CFA, 0x5CA4, 0x8CFB, 0x5CA5, 0x8CFC, 0x5CA6, 0x8CFD, 0x5CA7, + 0x8CFE, 0x5CA8, 0x8D40, 0x5CAA, 0x8D41, 0x5CAE, 0x8D42, 0x5CAF, + 0x8D43, 0x5CB0, 0x8D44, 0x5CB2, 0x8D45, 0x5CB4, 0x8D46, 0x5CB6, + 0x8D47, 0x5CB9, 0x8D48, 0x5CBA, 0x8D49, 0x5CBB, 0x8D4A, 0x5CBC, + 0x8D4B, 0x5CBE, 0x8D4C, 0x5CC0, 0x8D4D, 0x5CC2, 0x8D4E, 0x5CC3, + 0x8D4F, 0x5CC5, 0x8D50, 0x5CC6, 0x8D51, 0x5CC7, 0x8D52, 0x5CC8, + 0x8D53, 0x5CC9, 0x8D54, 0x5CCA, 0x8D55, 0x5CCC, 0x8D56, 0x5CCD, + 0x8D57, 0x5CCE, 0x8D58, 0x5CCF, 0x8D59, 0x5CD0, 0x8D5A, 0x5CD1, + 0x8D5B, 0x5CD3, 0x8D5C, 0x5CD4, 0x8D5D, 0x5CD5, 0x8D5E, 0x5CD6, + 0x8D5F, 0x5CD7, 0x8D60, 0x5CD8, 0x8D61, 0x5CDA, 0x8D62, 0x5CDB, + 0x8D63, 0x5CDC, 0x8D64, 0x5CDD, 0x8D65, 0x5CDE, 0x8D66, 0x5CDF, + 0x8D67, 0x5CE0, 0x8D68, 0x5CE2, 0x8D69, 0x5CE3, 0x8D6A, 0x5CE7, + 0x8D6B, 0x5CE9, 0x8D6C, 0x5CEB, 0x8D6D, 0x5CEC, 0x8D6E, 0x5CEE, + 0x8D6F, 0x5CEF, 0x8D70, 0x5CF1, 0x8D71, 0x5CF2, 0x8D72, 0x5CF3, + 0x8D73, 0x5CF4, 0x8D74, 0x5CF5, 0x8D75, 0x5CF6, 0x8D76, 0x5CF7, + 0x8D77, 0x5CF8, 0x8D78, 0x5CF9, 0x8D79, 0x5CFA, 0x8D7A, 0x5CFC, + 0x8D7B, 0x5CFD, 0x8D7C, 0x5CFE, 0x8D7D, 0x5CFF, 0x8D7E, 0x5D00, + 0x8D80, 0x5D01, 0x8D81, 0x5D04, 0x8D82, 0x5D05, 0x8D83, 0x5D08, + 0x8D84, 0x5D09, 0x8D85, 0x5D0A, 0x8D86, 0x5D0B, 0x8D87, 0x5D0C, + 0x8D88, 0x5D0D, 0x8D89, 0x5D0F, 0x8D8A, 0x5D10, 0x8D8B, 0x5D11, + 0x8D8C, 0x5D12, 0x8D8D, 0x5D13, 0x8D8E, 0x5D15, 0x8D8F, 0x5D17, + 0x8D90, 0x5D18, 0x8D91, 0x5D19, 0x8D92, 0x5D1A, 0x8D93, 0x5D1C, + 0x8D94, 0x5D1D, 0x8D95, 0x5D1F, 0x8D96, 0x5D20, 0x8D97, 0x5D21, + 0x8D98, 0x5D22, 0x8D99, 0x5D23, 0x8D9A, 0x5D25, 0x8D9B, 0x5D28, + 0x8D9C, 0x5D2A, 0x8D9D, 0x5D2B, 0x8D9E, 0x5D2C, 0x8D9F, 0x5D2F, + 0x8DA0, 0x5D30, 0x8DA1, 0x5D31, 0x8DA2, 0x5D32, 0x8DA3, 0x5D33, + 0x8DA4, 0x5D35, 0x8DA5, 0x5D36, 0x8DA6, 0x5D37, 0x8DA7, 0x5D38, + 0x8DA8, 0x5D39, 0x8DA9, 0x5D3A, 0x8DAA, 0x5D3B, 0x8DAB, 0x5D3C, + 0x8DAC, 0x5D3F, 0x8DAD, 0x5D40, 0x8DAE, 0x5D41, 0x8DAF, 0x5D42, + 0x8DB0, 0x5D43, 0x8DB1, 0x5D44, 0x8DB2, 0x5D45, 0x8DB3, 0x5D46, + 0x8DB4, 0x5D48, 0x8DB5, 0x5D49, 0x8DB6, 0x5D4D, 0x8DB7, 0x5D4E, + 0x8DB8, 0x5D4F, 0x8DB9, 0x5D50, 0x8DBA, 0x5D51, 0x8DBB, 0x5D52, + 0x8DBC, 0x5D53, 0x8DBD, 0x5D54, 0x8DBE, 0x5D55, 0x8DBF, 0x5D56, + 0x8DC0, 0x5D57, 0x8DC1, 0x5D59, 0x8DC2, 0x5D5A, 0x8DC3, 0x5D5C, + 0x8DC4, 0x5D5E, 0x8DC5, 0x5D5F, 0x8DC6, 0x5D60, 0x8DC7, 0x5D61, + 0x8DC8, 0x5D62, 0x8DC9, 0x5D63, 0x8DCA, 0x5D64, 0x8DCB, 0x5D65, + 0x8DCC, 0x5D66, 0x8DCD, 0x5D67, 0x8DCE, 0x5D68, 0x8DCF, 0x5D6A, + 0x8DD0, 0x5D6D, 0x8DD1, 0x5D6E, 0x8DD2, 0x5D70, 0x8DD3, 0x5D71, + 0x8DD4, 0x5D72, 0x8DD5, 0x5D73, 0x8DD6, 0x5D75, 0x8DD7, 0x5D76, + 0x8DD8, 0x5D77, 0x8DD9, 0x5D78, 0x8DDA, 0x5D79, 0x8DDB, 0x5D7A, + 0x8DDC, 0x5D7B, 0x8DDD, 0x5D7C, 0x8DDE, 0x5D7D, 0x8DDF, 0x5D7E, + 0x8DE0, 0x5D7F, 0x8DE1, 0x5D80, 0x8DE2, 0x5D81, 0x8DE3, 0x5D83, + 0x8DE4, 0x5D84, 0x8DE5, 0x5D85, 0x8DE6, 0x5D86, 0x8DE7, 0x5D87, + 0x8DE8, 0x5D88, 0x8DE9, 0x5D89, 0x8DEA, 0x5D8A, 0x8DEB, 0x5D8B, + 0x8DEC, 0x5D8C, 0x8DED, 0x5D8D, 0x8DEE, 0x5D8E, 0x8DEF, 0x5D8F, + 0x8DF0, 0x5D90, 0x8DF1, 0x5D91, 0x8DF2, 0x5D92, 0x8DF3, 0x5D93, + 0x8DF4, 0x5D94, 0x8DF5, 0x5D95, 0x8DF6, 0x5D96, 0x8DF7, 0x5D97, + 0x8DF8, 0x5D98, 0x8DF9, 0x5D9A, 0x8DFA, 0x5D9B, 0x8DFB, 0x5D9C, + 0x8DFC, 0x5D9E, 0x8DFD, 0x5D9F, 0x8DFE, 0x5DA0, 0x8E40, 0x5DA1, + 0x8E41, 0x5DA2, 0x8E42, 0x5DA3, 0x8E43, 0x5DA4, 0x8E44, 0x5DA5, + 0x8E45, 0x5DA6, 0x8E46, 0x5DA7, 0x8E47, 0x5DA8, 0x8E48, 0x5DA9, + 0x8E49, 0x5DAA, 0x8E4A, 0x5DAB, 0x8E4B, 0x5DAC, 0x8E4C, 0x5DAD, + 0x8E4D, 0x5DAE, 0x8E4E, 0x5DAF, 0x8E4F, 0x5DB0, 0x8E50, 0x5DB1, + 0x8E51, 0x5DB2, 0x8E52, 0x5DB3, 0x8E53, 0x5DB4, 0x8E54, 0x5DB5, + 0x8E55, 0x5DB6, 0x8E56, 0x5DB8, 0x8E57, 0x5DB9, 0x8E58, 0x5DBA, + 0x8E59, 0x5DBB, 0x8E5A, 0x5DBC, 0x8E5B, 0x5DBD, 0x8E5C, 0x5DBE, + 0x8E5D, 0x5DBF, 0x8E5E, 0x5DC0, 0x8E5F, 0x5DC1, 0x8E60, 0x5DC2, + 0x8E61, 0x5DC3, 0x8E62, 0x5DC4, 0x8E63, 0x5DC6, 0x8E64, 0x5DC7, + 0x8E65, 0x5DC8, 0x8E66, 0x5DC9, 0x8E67, 0x5DCA, 0x8E68, 0x5DCB, + 0x8E69, 0x5DCC, 0x8E6A, 0x5DCE, 0x8E6B, 0x5DCF, 0x8E6C, 0x5DD0, + 0x8E6D, 0x5DD1, 0x8E6E, 0x5DD2, 0x8E6F, 0x5DD3, 0x8E70, 0x5DD4, + 0x8E71, 0x5DD5, 0x8E72, 0x5DD6, 0x8E73, 0x5DD7, 0x8E74, 0x5DD8, + 0x8E75, 0x5DD9, 0x8E76, 0x5DDA, 0x8E77, 0x5DDC, 0x8E78, 0x5DDF, + 0x8E79, 0x5DE0, 0x8E7A, 0x5DE3, 0x8E7B, 0x5DE4, 0x8E7C, 0x5DEA, + 0x8E7D, 0x5DEC, 0x8E7E, 0x5DED, 0x8E80, 0x5DF0, 0x8E81, 0x5DF5, + 0x8E82, 0x5DF6, 0x8E83, 0x5DF8, 0x8E84, 0x5DF9, 0x8E85, 0x5DFA, + 0x8E86, 0x5DFB, 0x8E87, 0x5DFC, 0x8E88, 0x5DFF, 0x8E89, 0x5E00, + 0x8E8A, 0x5E04, 0x8E8B, 0x5E07, 0x8E8C, 0x5E09, 0x8E8D, 0x5E0A, + 0x8E8E, 0x5E0B, 0x8E8F, 0x5E0D, 0x8E90, 0x5E0E, 0x8E91, 0x5E12, + 0x8E92, 0x5E13, 0x8E93, 0x5E17, 0x8E94, 0x5E1E, 0x8E95, 0x5E1F, + 0x8E96, 0x5E20, 0x8E97, 0x5E21, 0x8E98, 0x5E22, 0x8E99, 0x5E23, + 0x8E9A, 0x5E24, 0x8E9B, 0x5E25, 0x8E9C, 0x5E28, 0x8E9D, 0x5E29, + 0x8E9E, 0x5E2A, 0x8E9F, 0x5E2B, 0x8EA0, 0x5E2C, 0x8EA1, 0x5E2F, + 0x8EA2, 0x5E30, 0x8EA3, 0x5E32, 0x8EA4, 0x5E33, 0x8EA5, 0x5E34, + 0x8EA6, 0x5E35, 0x8EA7, 0x5E36, 0x8EA8, 0x5E39, 0x8EA9, 0x5E3A, + 0x8EAA, 0x5E3E, 0x8EAB, 0x5E3F, 0x8EAC, 0x5E40, 0x8EAD, 0x5E41, + 0x8EAE, 0x5E43, 0x8EAF, 0x5E46, 0x8EB0, 0x5E47, 0x8EB1, 0x5E48, + 0x8EB2, 0x5E49, 0x8EB3, 0x5E4A, 0x8EB4, 0x5E4B, 0x8EB5, 0x5E4D, + 0x8EB6, 0x5E4E, 0x8EB7, 0x5E4F, 0x8EB8, 0x5E50, 0x8EB9, 0x5E51, + 0x8EBA, 0x5E52, 0x8EBB, 0x5E53, 0x8EBC, 0x5E56, 0x8EBD, 0x5E57, + 0x8EBE, 0x5E58, 0x8EBF, 0x5E59, 0x8EC0, 0x5E5A, 0x8EC1, 0x5E5C, + 0x8EC2, 0x5E5D, 0x8EC3, 0x5E5F, 0x8EC4, 0x5E60, 0x8EC5, 0x5E63, + 0x8EC6, 0x5E64, 0x8EC7, 0x5E65, 0x8EC8, 0x5E66, 0x8EC9, 0x5E67, + 0x8ECA, 0x5E68, 0x8ECB, 0x5E69, 0x8ECC, 0x5E6A, 0x8ECD, 0x5E6B, + 0x8ECE, 0x5E6C, 0x8ECF, 0x5E6D, 0x8ED0, 0x5E6E, 0x8ED1, 0x5E6F, + 0x8ED2, 0x5E70, 0x8ED3, 0x5E71, 0x8ED4, 0x5E75, 0x8ED5, 0x5E77, + 0x8ED6, 0x5E79, 0x8ED7, 0x5E7E, 0x8ED8, 0x5E81, 0x8ED9, 0x5E82, + 0x8EDA, 0x5E83, 0x8EDB, 0x5E85, 0x8EDC, 0x5E88, 0x8EDD, 0x5E89, + 0x8EDE, 0x5E8C, 0x8EDF, 0x5E8D, 0x8EE0, 0x5E8E, 0x8EE1, 0x5E92, + 0x8EE2, 0x5E98, 0x8EE3, 0x5E9B, 0x8EE4, 0x5E9D, 0x8EE5, 0x5EA1, + 0x8EE6, 0x5EA2, 0x8EE7, 0x5EA3, 0x8EE8, 0x5EA4, 0x8EE9, 0x5EA8, + 0x8EEA, 0x5EA9, 0x8EEB, 0x5EAA, 0x8EEC, 0x5EAB, 0x8EED, 0x5EAC, + 0x8EEE, 0x5EAE, 0x8EEF, 0x5EAF, 0x8EF0, 0x5EB0, 0x8EF1, 0x5EB1, + 0x8EF2, 0x5EB2, 0x8EF3, 0x5EB4, 0x8EF4, 0x5EBA, 0x8EF5, 0x5EBB, + 0x8EF6, 0x5EBC, 0x8EF7, 0x5EBD, 0x8EF8, 0x5EBF, 0x8EF9, 0x5EC0, + 0x8EFA, 0x5EC1, 0x8EFB, 0x5EC2, 0x8EFC, 0x5EC3, 0x8EFD, 0x5EC4, + 0x8EFE, 0x5EC5, 0x8F40, 0x5EC6, 0x8F41, 0x5EC7, 0x8F42, 0x5EC8, + 0x8F43, 0x5ECB, 0x8F44, 0x5ECC, 0x8F45, 0x5ECD, 0x8F46, 0x5ECE, + 0x8F47, 0x5ECF, 0x8F48, 0x5ED0, 0x8F49, 0x5ED4, 0x8F4A, 0x5ED5, + 0x8F4B, 0x5ED7, 0x8F4C, 0x5ED8, 0x8F4D, 0x5ED9, 0x8F4E, 0x5EDA, + 0x8F4F, 0x5EDC, 0x8F50, 0x5EDD, 0x8F51, 0x5EDE, 0x8F52, 0x5EDF, + 0x8F53, 0x5EE0, 0x8F54, 0x5EE1, 0x8F55, 0x5EE2, 0x8F56, 0x5EE3, + 0x8F57, 0x5EE4, 0x8F58, 0x5EE5, 0x8F59, 0x5EE6, 0x8F5A, 0x5EE7, + 0x8F5B, 0x5EE9, 0x8F5C, 0x5EEB, 0x8F5D, 0x5EEC, 0x8F5E, 0x5EED, + 0x8F5F, 0x5EEE, 0x8F60, 0x5EEF, 0x8F61, 0x5EF0, 0x8F62, 0x5EF1, + 0x8F63, 0x5EF2, 0x8F64, 0x5EF3, 0x8F65, 0x5EF5, 0x8F66, 0x5EF8, + 0x8F67, 0x5EF9, 0x8F68, 0x5EFB, 0x8F69, 0x5EFC, 0x8F6A, 0x5EFD, + 0x8F6B, 0x5F05, 0x8F6C, 0x5F06, 0x8F6D, 0x5F07, 0x8F6E, 0x5F09, + 0x8F6F, 0x5F0C, 0x8F70, 0x5F0D, 0x8F71, 0x5F0E, 0x8F72, 0x5F10, + 0x8F73, 0x5F12, 0x8F74, 0x5F14, 0x8F75, 0x5F16, 0x8F76, 0x5F19, + 0x8F77, 0x5F1A, 0x8F78, 0x5F1C, 0x8F79, 0x5F1D, 0x8F7A, 0x5F1E, + 0x8F7B, 0x5F21, 0x8F7C, 0x5F22, 0x8F7D, 0x5F23, 0x8F7E, 0x5F24, + 0x8F80, 0x5F28, 0x8F81, 0x5F2B, 0x8F82, 0x5F2C, 0x8F83, 0x5F2E, + 0x8F84, 0x5F30, 0x8F85, 0x5F32, 0x8F86, 0x5F33, 0x8F87, 0x5F34, + 0x8F88, 0x5F35, 0x8F89, 0x5F36, 0x8F8A, 0x5F37, 0x8F8B, 0x5F38, + 0x8F8C, 0x5F3B, 0x8F8D, 0x5F3D, 0x8F8E, 0x5F3E, 0x8F8F, 0x5F3F, + 0x8F90, 0x5F41, 0x8F91, 0x5F42, 0x8F92, 0x5F43, 0x8F93, 0x5F44, + 0x8F94, 0x5F45, 0x8F95, 0x5F46, 0x8F96, 0x5F47, 0x8F97, 0x5F48, + 0x8F98, 0x5F49, 0x8F99, 0x5F4A, 0x8F9A, 0x5F4B, 0x8F9B, 0x5F4C, + 0x8F9C, 0x5F4D, 0x8F9D, 0x5F4E, 0x8F9E, 0x5F4F, 0x8F9F, 0x5F51, + 0x8FA0, 0x5F54, 0x8FA1, 0x5F59, 0x8FA2, 0x5F5A, 0x8FA3, 0x5F5B, + 0x8FA4, 0x5F5C, 0x8FA5, 0x5F5E, 0x8FA6, 0x5F5F, 0x8FA7, 0x5F60, + 0x8FA8, 0x5F63, 0x8FA9, 0x5F65, 0x8FAA, 0x5F67, 0x8FAB, 0x5F68, + 0x8FAC, 0x5F6B, 0x8FAD, 0x5F6E, 0x8FAE, 0x5F6F, 0x8FAF, 0x5F72, + 0x8FB0, 0x5F74, 0x8FB1, 0x5F75, 0x8FB2, 0x5F76, 0x8FB3, 0x5F78, + 0x8FB4, 0x5F7A, 0x8FB5, 0x5F7D, 0x8FB6, 0x5F7E, 0x8FB7, 0x5F7F, + 0x8FB8, 0x5F83, 0x8FB9, 0x5F86, 0x8FBA, 0x5F8D, 0x8FBB, 0x5F8E, + 0x8FBC, 0x5F8F, 0x8FBD, 0x5F91, 0x8FBE, 0x5F93, 0x8FBF, 0x5F94, + 0x8FC0, 0x5F96, 0x8FC1, 0x5F9A, 0x8FC2, 0x5F9B, 0x8FC3, 0x5F9D, + 0x8FC4, 0x5F9E, 0x8FC5, 0x5F9F, 0x8FC6, 0x5FA0, 0x8FC7, 0x5FA2, + 0x8FC8, 0x5FA3, 0x8FC9, 0x5FA4, 0x8FCA, 0x5FA5, 0x8FCB, 0x5FA6, + 0x8FCC, 0x5FA7, 0x8FCD, 0x5FA9, 0x8FCE, 0x5FAB, 0x8FCF, 0x5FAC, + 0x8FD0, 0x5FAF, 0x8FD1, 0x5FB0, 0x8FD2, 0x5FB1, 0x8FD3, 0x5FB2, + 0x8FD4, 0x5FB3, 0x8FD5, 0x5FB4, 0x8FD6, 0x5FB6, 0x8FD7, 0x5FB8, + 0x8FD8, 0x5FB9, 0x8FD9, 0x5FBA, 0x8FDA, 0x5FBB, 0x8FDB, 0x5FBE, + 0x8FDC, 0x5FBF, 0x8FDD, 0x5FC0, 0x8FDE, 0x5FC1, 0x8FDF, 0x5FC2, + 0x8FE0, 0x5FC7, 0x8FE1, 0x5FC8, 0x8FE2, 0x5FCA, 0x8FE3, 0x5FCB, + 0x8FE4, 0x5FCE, 0x8FE5, 0x5FD3, 0x8FE6, 0x5FD4, 0x8FE7, 0x5FD5, + 0x8FE8, 0x5FDA, 0x8FE9, 0x5FDB, 0x8FEA, 0x5FDC, 0x8FEB, 0x5FDE, + 0x8FEC, 0x5FDF, 0x8FED, 0x5FE2, 0x8FEE, 0x5FE3, 0x8FEF, 0x5FE5, + 0x8FF0, 0x5FE6, 0x8FF1, 0x5FE8, 0x8FF2, 0x5FE9, 0x8FF3, 0x5FEC, + 0x8FF4, 0x5FEF, 0x8FF5, 0x5FF0, 0x8FF6, 0x5FF2, 0x8FF7, 0x5FF3, + 0x8FF8, 0x5FF4, 0x8FF9, 0x5FF6, 0x8FFA, 0x5FF7, 0x8FFB, 0x5FF9, + 0x8FFC, 0x5FFA, 0x8FFD, 0x5FFC, 0x8FFE, 0x6007, 0x9040, 0x6008, + 0x9041, 0x6009, 0x9042, 0x600B, 0x9043, 0x600C, 0x9044, 0x6010, + 0x9045, 0x6011, 0x9046, 0x6013, 0x9047, 0x6017, 0x9048, 0x6018, + 0x9049, 0x601A, 0x904A, 0x601E, 0x904B, 0x601F, 0x904C, 0x6022, + 0x904D, 0x6023, 0x904E, 0x6024, 0x904F, 0x602C, 0x9050, 0x602D, + 0x9051, 0x602E, 0x9052, 0x6030, 0x9053, 0x6031, 0x9054, 0x6032, + 0x9055, 0x6033, 0x9056, 0x6034, 0x9057, 0x6036, 0x9058, 0x6037, + 0x9059, 0x6038, 0x905A, 0x6039, 0x905B, 0x603A, 0x905C, 0x603D, + 0x905D, 0x603E, 0x905E, 0x6040, 0x905F, 0x6044, 0x9060, 0x6045, + 0x9061, 0x6046, 0x9062, 0x6047, 0x9063, 0x6048, 0x9064, 0x6049, + 0x9065, 0x604A, 0x9066, 0x604C, 0x9067, 0x604E, 0x9068, 0x604F, + 0x9069, 0x6051, 0x906A, 0x6053, 0x906B, 0x6054, 0x906C, 0x6056, + 0x906D, 0x6057, 0x906E, 0x6058, 0x906F, 0x605B, 0x9070, 0x605C, + 0x9071, 0x605E, 0x9072, 0x605F, 0x9073, 0x6060, 0x9074, 0x6061, + 0x9075, 0x6065, 0x9076, 0x6066, 0x9077, 0x606E, 0x9078, 0x6071, + 0x9079, 0x6072, 0x907A, 0x6074, 0x907B, 0x6075, 0x907C, 0x6077, + 0x907D, 0x607E, 0x907E, 0x6080, 0x9080, 0x6081, 0x9081, 0x6082, + 0x9082, 0x6085, 0x9083, 0x6086, 0x9084, 0x6087, 0x9085, 0x6088, + 0x9086, 0x608A, 0x9087, 0x608B, 0x9088, 0x608E, 0x9089, 0x608F, + 0x908A, 0x6090, 0x908B, 0x6091, 0x908C, 0x6093, 0x908D, 0x6095, + 0x908E, 0x6097, 0x908F, 0x6098, 0x9090, 0x6099, 0x9091, 0x609C, + 0x9092, 0x609E, 0x9093, 0x60A1, 0x9094, 0x60A2, 0x9095, 0x60A4, + 0x9096, 0x60A5, 0x9097, 0x60A7, 0x9098, 0x60A9, 0x9099, 0x60AA, + 0x909A, 0x60AE, 0x909B, 0x60B0, 0x909C, 0x60B3, 0x909D, 0x60B5, + 0x909E, 0x60B6, 0x909F, 0x60B7, 0x90A0, 0x60B9, 0x90A1, 0x60BA, + 0x90A2, 0x60BD, 0x90A3, 0x60BE, 0x90A4, 0x60BF, 0x90A5, 0x60C0, + 0x90A6, 0x60C1, 0x90A7, 0x60C2, 0x90A8, 0x60C3, 0x90A9, 0x60C4, + 0x90AA, 0x60C7, 0x90AB, 0x60C8, 0x90AC, 0x60C9, 0x90AD, 0x60CC, + 0x90AE, 0x60CD, 0x90AF, 0x60CE, 0x90B0, 0x60CF, 0x90B1, 0x60D0, + 0x90B2, 0x60D2, 0x90B3, 0x60D3, 0x90B4, 0x60D4, 0x90B5, 0x60D6, + 0x90B6, 0x60D7, 0x90B7, 0x60D9, 0x90B8, 0x60DB, 0x90B9, 0x60DE, + 0x90BA, 0x60E1, 0x90BB, 0x60E2, 0x90BC, 0x60E3, 0x90BD, 0x60E4, + 0x90BE, 0x60E5, 0x90BF, 0x60EA, 0x90C0, 0x60F1, 0x90C1, 0x60F2, + 0x90C2, 0x60F5, 0x90C3, 0x60F7, 0x90C4, 0x60F8, 0x90C5, 0x60FB, + 0x90C6, 0x60FC, 0x90C7, 0x60FD, 0x90C8, 0x60FE, 0x90C9, 0x60FF, + 0x90CA, 0x6102, 0x90CB, 0x6103, 0x90CC, 0x6104, 0x90CD, 0x6105, + 0x90CE, 0x6107, 0x90CF, 0x610A, 0x90D0, 0x610B, 0x90D1, 0x610C, + 0x90D2, 0x6110, 0x90D3, 0x6111, 0x90D4, 0x6112, 0x90D5, 0x6113, + 0x90D6, 0x6114, 0x90D7, 0x6116, 0x90D8, 0x6117, 0x90D9, 0x6118, + 0x90DA, 0x6119, 0x90DB, 0x611B, 0x90DC, 0x611C, 0x90DD, 0x611D, + 0x90DE, 0x611E, 0x90DF, 0x6121, 0x90E0, 0x6122, 0x90E1, 0x6125, + 0x90E2, 0x6128, 0x90E3, 0x6129, 0x90E4, 0x612A, 0x90E5, 0x612C, + 0x90E6, 0x612D, 0x90E7, 0x612E, 0x90E8, 0x612F, 0x90E9, 0x6130, + 0x90EA, 0x6131, 0x90EB, 0x6132, 0x90EC, 0x6133, 0x90ED, 0x6134, + 0x90EE, 0x6135, 0x90EF, 0x6136, 0x90F0, 0x6137, 0x90F1, 0x6138, + 0x90F2, 0x6139, 0x90F3, 0x613A, 0x90F4, 0x613B, 0x90F5, 0x613C, + 0x90F6, 0x613D, 0x90F7, 0x613E, 0x90F8, 0x6140, 0x90F9, 0x6141, + 0x90FA, 0x6142, 0x90FB, 0x6143, 0x90FC, 0x6144, 0x90FD, 0x6145, + 0x90FE, 0x6146, 0x9140, 0x6147, 0x9141, 0x6149, 0x9142, 0x614B, + 0x9143, 0x614D, 0x9144, 0x614F, 0x9145, 0x6150, 0x9146, 0x6152, + 0x9147, 0x6153, 0x9148, 0x6154, 0x9149, 0x6156, 0x914A, 0x6157, + 0x914B, 0x6158, 0x914C, 0x6159, 0x914D, 0x615A, 0x914E, 0x615B, + 0x914F, 0x615C, 0x9150, 0x615E, 0x9151, 0x615F, 0x9152, 0x6160, + 0x9153, 0x6161, 0x9154, 0x6163, 0x9155, 0x6164, 0x9156, 0x6165, + 0x9157, 0x6166, 0x9158, 0x6169, 0x9159, 0x616A, 0x915A, 0x616B, + 0x915B, 0x616C, 0x915C, 0x616D, 0x915D, 0x616E, 0x915E, 0x616F, + 0x915F, 0x6171, 0x9160, 0x6172, 0x9161, 0x6173, 0x9162, 0x6174, + 0x9163, 0x6176, 0x9164, 0x6178, 0x9165, 0x6179, 0x9166, 0x617A, + 0x9167, 0x617B, 0x9168, 0x617C, 0x9169, 0x617D, 0x916A, 0x617E, + 0x916B, 0x617F, 0x916C, 0x6180, 0x916D, 0x6181, 0x916E, 0x6182, + 0x916F, 0x6183, 0x9170, 0x6184, 0x9171, 0x6185, 0x9172, 0x6186, + 0x9173, 0x6187, 0x9174, 0x6188, 0x9175, 0x6189, 0x9176, 0x618A, + 0x9177, 0x618C, 0x9178, 0x618D, 0x9179, 0x618F, 0x917A, 0x6190, + 0x917B, 0x6191, 0x917C, 0x6192, 0x917D, 0x6193, 0x917E, 0x6195, + 0x9180, 0x6196, 0x9181, 0x6197, 0x9182, 0x6198, 0x9183, 0x6199, + 0x9184, 0x619A, 0x9185, 0x619B, 0x9186, 0x619C, 0x9187, 0x619E, + 0x9188, 0x619F, 0x9189, 0x61A0, 0x918A, 0x61A1, 0x918B, 0x61A2, + 0x918C, 0x61A3, 0x918D, 0x61A4, 0x918E, 0x61A5, 0x918F, 0x61A6, + 0x9190, 0x61AA, 0x9191, 0x61AB, 0x9192, 0x61AD, 0x9193, 0x61AE, + 0x9194, 0x61AF, 0x9195, 0x61B0, 0x9196, 0x61B1, 0x9197, 0x61B2, + 0x9198, 0x61B3, 0x9199, 0x61B4, 0x919A, 0x61B5, 0x919B, 0x61B6, + 0x919C, 0x61B8, 0x919D, 0x61B9, 0x919E, 0x61BA, 0x919F, 0x61BB, + 0x91A0, 0x61BC, 0x91A1, 0x61BD, 0x91A2, 0x61BF, 0x91A3, 0x61C0, + 0x91A4, 0x61C1, 0x91A5, 0x61C3, 0x91A6, 0x61C4, 0x91A7, 0x61C5, + 0x91A8, 0x61C6, 0x91A9, 0x61C7, 0x91AA, 0x61C9, 0x91AB, 0x61CC, + 0x91AC, 0x61CD, 0x91AD, 0x61CE, 0x91AE, 0x61CF, 0x91AF, 0x61D0, + 0x91B0, 0x61D3, 0x91B1, 0x61D5, 0x91B2, 0x61D6, 0x91B3, 0x61D7, + 0x91B4, 0x61D8, 0x91B5, 0x61D9, 0x91B6, 0x61DA, 0x91B7, 0x61DB, + 0x91B8, 0x61DC, 0x91B9, 0x61DD, 0x91BA, 0x61DE, 0x91BB, 0x61DF, + 0x91BC, 0x61E0, 0x91BD, 0x61E1, 0x91BE, 0x61E2, 0x91BF, 0x61E3, + 0x91C0, 0x61E4, 0x91C1, 0x61E5, 0x91C2, 0x61E7, 0x91C3, 0x61E8, + 0x91C4, 0x61E9, 0x91C5, 0x61EA, 0x91C6, 0x61EB, 0x91C7, 0x61EC, + 0x91C8, 0x61ED, 0x91C9, 0x61EE, 0x91CA, 0x61EF, 0x91CB, 0x61F0, + 0x91CC, 0x61F1, 0x91CD, 0x61F2, 0x91CE, 0x61F3, 0x91CF, 0x61F4, + 0x91D0, 0x61F6, 0x91D1, 0x61F7, 0x91D2, 0x61F8, 0x91D3, 0x61F9, + 0x91D4, 0x61FA, 0x91D5, 0x61FB, 0x91D6, 0x61FC, 0x91D7, 0x61FD, + 0x91D8, 0x61FE, 0x91D9, 0x6200, 0x91DA, 0x6201, 0x91DB, 0x6202, + 0x91DC, 0x6203, 0x91DD, 0x6204, 0x91DE, 0x6205, 0x91DF, 0x6207, + 0x91E0, 0x6209, 0x91E1, 0x6213, 0x91E2, 0x6214, 0x91E3, 0x6219, + 0x91E4, 0x621C, 0x91E5, 0x621D, 0x91E6, 0x621E, 0x91E7, 0x6220, + 0x91E8, 0x6223, 0x91E9, 0x6226, 0x91EA, 0x6227, 0x91EB, 0x6228, + 0x91EC, 0x6229, 0x91ED, 0x622B, 0x91EE, 0x622D, 0x91EF, 0x622F, + 0x91F0, 0x6230, 0x91F1, 0x6231, 0x91F2, 0x6232, 0x91F3, 0x6235, + 0x91F4, 0x6236, 0x91F5, 0x6238, 0x91F6, 0x6239, 0x91F7, 0x623A, + 0x91F8, 0x623B, 0x91F9, 0x623C, 0x91FA, 0x6242, 0x91FB, 0x6244, + 0x91FC, 0x6245, 0x91FD, 0x6246, 0x91FE, 0x624A, 0x9240, 0x624F, + 0x9241, 0x6250, 0x9242, 0x6255, 0x9243, 0x6256, 0x9244, 0x6257, + 0x9245, 0x6259, 0x9246, 0x625A, 0x9247, 0x625C, 0x9248, 0x625D, + 0x9249, 0x625E, 0x924A, 0x625F, 0x924B, 0x6260, 0x924C, 0x6261, + 0x924D, 0x6262, 0x924E, 0x6264, 0x924F, 0x6265, 0x9250, 0x6268, + 0x9251, 0x6271, 0x9252, 0x6272, 0x9253, 0x6274, 0x9254, 0x6275, + 0x9255, 0x6277, 0x9256, 0x6278, 0x9257, 0x627A, 0x9258, 0x627B, + 0x9259, 0x627D, 0x925A, 0x6281, 0x925B, 0x6282, 0x925C, 0x6283, + 0x925D, 0x6285, 0x925E, 0x6286, 0x925F, 0x6287, 0x9260, 0x6288, + 0x9261, 0x628B, 0x9262, 0x628C, 0x9263, 0x628D, 0x9264, 0x628E, + 0x9265, 0x628F, 0x9266, 0x6290, 0x9267, 0x6294, 0x9268, 0x6299, + 0x9269, 0x629C, 0x926A, 0x629D, 0x926B, 0x629E, 0x926C, 0x62A3, + 0x926D, 0x62A6, 0x926E, 0x62A7, 0x926F, 0x62A9, 0x9270, 0x62AA, + 0x9271, 0x62AD, 0x9272, 0x62AE, 0x9273, 0x62AF, 0x9274, 0x62B0, + 0x9275, 0x62B2, 0x9276, 0x62B3, 0x9277, 0x62B4, 0x9278, 0x62B6, + 0x9279, 0x62B7, 0x927A, 0x62B8, 0x927B, 0x62BA, 0x927C, 0x62BE, + 0x927D, 0x62C0, 0x927E, 0x62C1, 0x9280, 0x62C3, 0x9281, 0x62CB, + 0x9282, 0x62CF, 0x9283, 0x62D1, 0x9284, 0x62D5, 0x9285, 0x62DD, + 0x9286, 0x62DE, 0x9287, 0x62E0, 0x9288, 0x62E1, 0x9289, 0x62E4, + 0x928A, 0x62EA, 0x928B, 0x62EB, 0x928C, 0x62F0, 0x928D, 0x62F2, + 0x928E, 0x62F5, 0x928F, 0x62F8, 0x9290, 0x62F9, 0x9291, 0x62FA, + 0x9292, 0x62FB, 0x9293, 0x6300, 0x9294, 0x6303, 0x9295, 0x6304, + 0x9296, 0x6305, 0x9297, 0x6306, 0x9298, 0x630A, 0x9299, 0x630B, + 0x929A, 0x630C, 0x929B, 0x630D, 0x929C, 0x630F, 0x929D, 0x6310, + 0x929E, 0x6312, 0x929F, 0x6313, 0x92A0, 0x6314, 0x92A1, 0x6315, + 0x92A2, 0x6317, 0x92A3, 0x6318, 0x92A4, 0x6319, 0x92A5, 0x631C, + 0x92A6, 0x6326, 0x92A7, 0x6327, 0x92A8, 0x6329, 0x92A9, 0x632C, + 0x92AA, 0x632D, 0x92AB, 0x632E, 0x92AC, 0x6330, 0x92AD, 0x6331, + 0x92AE, 0x6333, 0x92AF, 0x6334, 0x92B0, 0x6335, 0x92B1, 0x6336, + 0x92B2, 0x6337, 0x92B3, 0x6338, 0x92B4, 0x633B, 0x92B5, 0x633C, + 0x92B6, 0x633E, 0x92B7, 0x633F, 0x92B8, 0x6340, 0x92B9, 0x6341, + 0x92BA, 0x6344, 0x92BB, 0x6347, 0x92BC, 0x6348, 0x92BD, 0x634A, + 0x92BE, 0x6351, 0x92BF, 0x6352, 0x92C0, 0x6353, 0x92C1, 0x6354, + 0x92C2, 0x6356, 0x92C3, 0x6357, 0x92C4, 0x6358, 0x92C5, 0x6359, + 0x92C6, 0x635A, 0x92C7, 0x635B, 0x92C8, 0x635C, 0x92C9, 0x635D, + 0x92CA, 0x6360, 0x92CB, 0x6364, 0x92CC, 0x6365, 0x92CD, 0x6366, + 0x92CE, 0x6368, 0x92CF, 0x636A, 0x92D0, 0x636B, 0x92D1, 0x636C, + 0x92D2, 0x636F, 0x92D3, 0x6370, 0x92D4, 0x6372, 0x92D5, 0x6373, + 0x92D6, 0x6374, 0x92D7, 0x6375, 0x92D8, 0x6378, 0x92D9, 0x6379, + 0x92DA, 0x637C, 0x92DB, 0x637D, 0x92DC, 0x637E, 0x92DD, 0x637F, + 0x92DE, 0x6381, 0x92DF, 0x6383, 0x92E0, 0x6384, 0x92E1, 0x6385, + 0x92E2, 0x6386, 0x92E3, 0x638B, 0x92E4, 0x638D, 0x92E5, 0x6391, + 0x92E6, 0x6393, 0x92E7, 0x6394, 0x92E8, 0x6395, 0x92E9, 0x6397, + 0x92EA, 0x6399, 0x92EB, 0x639A, 0x92EC, 0x639B, 0x92ED, 0x639C, + 0x92EE, 0x639D, 0x92EF, 0x639E, 0x92F0, 0x639F, 0x92F1, 0x63A1, + 0x92F2, 0x63A4, 0x92F3, 0x63A6, 0x92F4, 0x63AB, 0x92F5, 0x63AF, + 0x92F6, 0x63B1, 0x92F7, 0x63B2, 0x92F8, 0x63B5, 0x92F9, 0x63B6, + 0x92FA, 0x63B9, 0x92FB, 0x63BB, 0x92FC, 0x63BD, 0x92FD, 0x63BF, + 0x92FE, 0x63C0, 0x9340, 0x63C1, 0x9341, 0x63C2, 0x9342, 0x63C3, + 0x9343, 0x63C5, 0x9344, 0x63C7, 0x9345, 0x63C8, 0x9346, 0x63CA, + 0x9347, 0x63CB, 0x9348, 0x63CC, 0x9349, 0x63D1, 0x934A, 0x63D3, + 0x934B, 0x63D4, 0x934C, 0x63D5, 0x934D, 0x63D7, 0x934E, 0x63D8, + 0x934F, 0x63D9, 0x9350, 0x63DA, 0x9351, 0x63DB, 0x9352, 0x63DC, + 0x9353, 0x63DD, 0x9354, 0x63DF, 0x9355, 0x63E2, 0x9356, 0x63E4, + 0x9357, 0x63E5, 0x9358, 0x63E6, 0x9359, 0x63E7, 0x935A, 0x63E8, + 0x935B, 0x63EB, 0x935C, 0x63EC, 0x935D, 0x63EE, 0x935E, 0x63EF, + 0x935F, 0x63F0, 0x9360, 0x63F1, 0x9361, 0x63F3, 0x9362, 0x63F5, + 0x9363, 0x63F7, 0x9364, 0x63F9, 0x9365, 0x63FA, 0x9366, 0x63FB, + 0x9367, 0x63FC, 0x9368, 0x63FE, 0x9369, 0x6403, 0x936A, 0x6404, + 0x936B, 0x6406, 0x936C, 0x6407, 0x936D, 0x6408, 0x936E, 0x6409, + 0x936F, 0x640A, 0x9370, 0x640D, 0x9371, 0x640E, 0x9372, 0x6411, + 0x9373, 0x6412, 0x9374, 0x6415, 0x9375, 0x6416, 0x9376, 0x6417, + 0x9377, 0x6418, 0x9378, 0x6419, 0x9379, 0x641A, 0x937A, 0x641D, + 0x937B, 0x641F, 0x937C, 0x6422, 0x937D, 0x6423, 0x937E, 0x6424, + 0x9380, 0x6425, 0x9381, 0x6427, 0x9382, 0x6428, 0x9383, 0x6429, + 0x9384, 0x642B, 0x9385, 0x642E, 0x9386, 0x642F, 0x9387, 0x6430, + 0x9388, 0x6431, 0x9389, 0x6432, 0x938A, 0x6433, 0x938B, 0x6435, + 0x938C, 0x6436, 0x938D, 0x6437, 0x938E, 0x6438, 0x938F, 0x6439, + 0x9390, 0x643B, 0x9391, 0x643C, 0x9392, 0x643E, 0x9393, 0x6440, + 0x9394, 0x6442, 0x9395, 0x6443, 0x9396, 0x6449, 0x9397, 0x644B, + 0x9398, 0x644C, 0x9399, 0x644D, 0x939A, 0x644E, 0x939B, 0x644F, + 0x939C, 0x6450, 0x939D, 0x6451, 0x939E, 0x6453, 0x939F, 0x6455, + 0x93A0, 0x6456, 0x93A1, 0x6457, 0x93A2, 0x6459, 0x93A3, 0x645A, + 0x93A4, 0x645B, 0x93A5, 0x645C, 0x93A6, 0x645D, 0x93A7, 0x645F, + 0x93A8, 0x6460, 0x93A9, 0x6461, 0x93AA, 0x6462, 0x93AB, 0x6463, + 0x93AC, 0x6464, 0x93AD, 0x6465, 0x93AE, 0x6466, 0x93AF, 0x6468, + 0x93B0, 0x646A, 0x93B1, 0x646B, 0x93B2, 0x646C, 0x93B3, 0x646E, + 0x93B4, 0x646F, 0x93B5, 0x6470, 0x93B6, 0x6471, 0x93B7, 0x6472, + 0x93B8, 0x6473, 0x93B9, 0x6474, 0x93BA, 0x6475, 0x93BB, 0x6476, + 0x93BC, 0x6477, 0x93BD, 0x647B, 0x93BE, 0x647C, 0x93BF, 0x647D, + 0x93C0, 0x647E, 0x93C1, 0x647F, 0x93C2, 0x6480, 0x93C3, 0x6481, + 0x93C4, 0x6483, 0x93C5, 0x6486, 0x93C6, 0x6488, 0x93C7, 0x6489, + 0x93C8, 0x648A, 0x93C9, 0x648B, 0x93CA, 0x648C, 0x93CB, 0x648D, + 0x93CC, 0x648E, 0x93CD, 0x648F, 0x93CE, 0x6490, 0x93CF, 0x6493, + 0x93D0, 0x6494, 0x93D1, 0x6497, 0x93D2, 0x6498, 0x93D3, 0x649A, + 0x93D4, 0x649B, 0x93D5, 0x649C, 0x93D6, 0x649D, 0x93D7, 0x649F, + 0x93D8, 0x64A0, 0x93D9, 0x64A1, 0x93DA, 0x64A2, 0x93DB, 0x64A3, + 0x93DC, 0x64A5, 0x93DD, 0x64A6, 0x93DE, 0x64A7, 0x93DF, 0x64A8, + 0x93E0, 0x64AA, 0x93E1, 0x64AB, 0x93E2, 0x64AF, 0x93E3, 0x64B1, + 0x93E4, 0x64B2, 0x93E5, 0x64B3, 0x93E6, 0x64B4, 0x93E7, 0x64B6, + 0x93E8, 0x64B9, 0x93E9, 0x64BB, 0x93EA, 0x64BD, 0x93EB, 0x64BE, + 0x93EC, 0x64BF, 0x93ED, 0x64C1, 0x93EE, 0x64C3, 0x93EF, 0x64C4, + 0x93F0, 0x64C6, 0x93F1, 0x64C7, 0x93F2, 0x64C8, 0x93F3, 0x64C9, + 0x93F4, 0x64CA, 0x93F5, 0x64CB, 0x93F6, 0x64CC, 0x93F7, 0x64CF, + 0x93F8, 0x64D1, 0x93F9, 0x64D3, 0x93FA, 0x64D4, 0x93FB, 0x64D5, + 0x93FC, 0x64D6, 0x93FD, 0x64D9, 0x93FE, 0x64DA, 0x9440, 0x64DB, + 0x9441, 0x64DC, 0x9442, 0x64DD, 0x9443, 0x64DF, 0x9444, 0x64E0, + 0x9445, 0x64E1, 0x9446, 0x64E3, 0x9447, 0x64E5, 0x9448, 0x64E7, + 0x9449, 0x64E8, 0x944A, 0x64E9, 0x944B, 0x64EA, 0x944C, 0x64EB, + 0x944D, 0x64EC, 0x944E, 0x64ED, 0x944F, 0x64EE, 0x9450, 0x64EF, + 0x9451, 0x64F0, 0x9452, 0x64F1, 0x9453, 0x64F2, 0x9454, 0x64F3, + 0x9455, 0x64F4, 0x9456, 0x64F5, 0x9457, 0x64F6, 0x9458, 0x64F7, + 0x9459, 0x64F8, 0x945A, 0x64F9, 0x945B, 0x64FA, 0x945C, 0x64FB, + 0x945D, 0x64FC, 0x945E, 0x64FD, 0x945F, 0x64FE, 0x9460, 0x64FF, + 0x9461, 0x6501, 0x9462, 0x6502, 0x9463, 0x6503, 0x9464, 0x6504, + 0x9465, 0x6505, 0x9466, 0x6506, 0x9467, 0x6507, 0x9468, 0x6508, + 0x9469, 0x650A, 0x946A, 0x650B, 0x946B, 0x650C, 0x946C, 0x650D, + 0x946D, 0x650E, 0x946E, 0x650F, 0x946F, 0x6510, 0x9470, 0x6511, + 0x9471, 0x6513, 0x9472, 0x6514, 0x9473, 0x6515, 0x9474, 0x6516, + 0x9475, 0x6517, 0x9476, 0x6519, 0x9477, 0x651A, 0x9478, 0x651B, + 0x9479, 0x651C, 0x947A, 0x651D, 0x947B, 0x651E, 0x947C, 0x651F, + 0x947D, 0x6520, 0x947E, 0x6521, 0x9480, 0x6522, 0x9481, 0x6523, + 0x9482, 0x6524, 0x9483, 0x6526, 0x9484, 0x6527, 0x9485, 0x6528, + 0x9486, 0x6529, 0x9487, 0x652A, 0x9488, 0x652C, 0x9489, 0x652D, + 0x948A, 0x6530, 0x948B, 0x6531, 0x948C, 0x6532, 0x948D, 0x6533, + 0x948E, 0x6537, 0x948F, 0x653A, 0x9490, 0x653C, 0x9491, 0x653D, + 0x9492, 0x6540, 0x9493, 0x6541, 0x9494, 0x6542, 0x9495, 0x6543, + 0x9496, 0x6544, 0x9497, 0x6546, 0x9498, 0x6547, 0x9499, 0x654A, + 0x949A, 0x654B, 0x949B, 0x654D, 0x949C, 0x654E, 0x949D, 0x6550, + 0x949E, 0x6552, 0x949F, 0x6553, 0x94A0, 0x6554, 0x94A1, 0x6557, + 0x94A2, 0x6558, 0x94A3, 0x655A, 0x94A4, 0x655C, 0x94A5, 0x655F, + 0x94A6, 0x6560, 0x94A7, 0x6561, 0x94A8, 0x6564, 0x94A9, 0x6565, + 0x94AA, 0x6567, 0x94AB, 0x6568, 0x94AC, 0x6569, 0x94AD, 0x656A, + 0x94AE, 0x656D, 0x94AF, 0x656E, 0x94B0, 0x656F, 0x94B1, 0x6571, + 0x94B2, 0x6573, 0x94B3, 0x6575, 0x94B4, 0x6576, 0x94B5, 0x6578, + 0x94B6, 0x6579, 0x94B7, 0x657A, 0x94B8, 0x657B, 0x94B9, 0x657C, + 0x94BA, 0x657D, 0x94BB, 0x657E, 0x94BC, 0x657F, 0x94BD, 0x6580, + 0x94BE, 0x6581, 0x94BF, 0x6582, 0x94C0, 0x6583, 0x94C1, 0x6584, + 0x94C2, 0x6585, 0x94C3, 0x6586, 0x94C4, 0x6588, 0x94C5, 0x6589, + 0x94C6, 0x658A, 0x94C7, 0x658D, 0x94C8, 0x658E, 0x94C9, 0x658F, + 0x94CA, 0x6592, 0x94CB, 0x6594, 0x94CC, 0x6595, 0x94CD, 0x6596, + 0x94CE, 0x6598, 0x94CF, 0x659A, 0x94D0, 0x659D, 0x94D1, 0x659E, + 0x94D2, 0x65A0, 0x94D3, 0x65A2, 0x94D4, 0x65A3, 0x94D5, 0x65A6, + 0x94D6, 0x65A8, 0x94D7, 0x65AA, 0x94D8, 0x65AC, 0x94D9, 0x65AE, + 0x94DA, 0x65B1, 0x94DB, 0x65B2, 0x94DC, 0x65B3, 0x94DD, 0x65B4, + 0x94DE, 0x65B5, 0x94DF, 0x65B6, 0x94E0, 0x65B7, 0x94E1, 0x65B8, + 0x94E2, 0x65BA, 0x94E3, 0x65BB, 0x94E4, 0x65BE, 0x94E5, 0x65BF, + 0x94E6, 0x65C0, 0x94E7, 0x65C2, 0x94E8, 0x65C7, 0x94E9, 0x65C8, + 0x94EA, 0x65C9, 0x94EB, 0x65CA, 0x94EC, 0x65CD, 0x94ED, 0x65D0, + 0x94EE, 0x65D1, 0x94EF, 0x65D3, 0x94F0, 0x65D4, 0x94F1, 0x65D5, + 0x94F2, 0x65D8, 0x94F3, 0x65D9, 0x94F4, 0x65DA, 0x94F5, 0x65DB, + 0x94F6, 0x65DC, 0x94F7, 0x65DD, 0x94F8, 0x65DE, 0x94F9, 0x65DF, + 0x94FA, 0x65E1, 0x94FB, 0x65E3, 0x94FC, 0x65E4, 0x94FD, 0x65EA, + 0x94FE, 0x65EB, 0x9540, 0x65F2, 0x9541, 0x65F3, 0x9542, 0x65F4, + 0x9543, 0x65F5, 0x9544, 0x65F8, 0x9545, 0x65F9, 0x9546, 0x65FB, + 0x9547, 0x65FC, 0x9548, 0x65FD, 0x9549, 0x65FE, 0x954A, 0x65FF, + 0x954B, 0x6601, 0x954C, 0x6604, 0x954D, 0x6605, 0x954E, 0x6607, + 0x954F, 0x6608, 0x9550, 0x6609, 0x9551, 0x660B, 0x9552, 0x660D, + 0x9553, 0x6610, 0x9554, 0x6611, 0x9555, 0x6612, 0x9556, 0x6616, + 0x9557, 0x6617, 0x9558, 0x6618, 0x9559, 0x661A, 0x955A, 0x661B, + 0x955B, 0x661C, 0x955C, 0x661E, 0x955D, 0x6621, 0x955E, 0x6622, + 0x955F, 0x6623, 0x9560, 0x6624, 0x9561, 0x6626, 0x9562, 0x6629, + 0x9563, 0x662A, 0x9564, 0x662B, 0x9565, 0x662C, 0x9566, 0x662E, + 0x9567, 0x6630, 0x9568, 0x6632, 0x9569, 0x6633, 0x956A, 0x6637, + 0x956B, 0x6638, 0x956C, 0x6639, 0x956D, 0x663A, 0x956E, 0x663B, + 0x956F, 0x663D, 0x9570, 0x663F, 0x9571, 0x6640, 0x9572, 0x6642, + 0x9573, 0x6644, 0x9574, 0x6645, 0x9575, 0x6646, 0x9576, 0x6647, + 0x9577, 0x6648, 0x9578, 0x6649, 0x9579, 0x664A, 0x957A, 0x664D, + 0x957B, 0x664E, 0x957C, 0x6650, 0x957D, 0x6651, 0x957E, 0x6658, + 0x9580, 0x6659, 0x9581, 0x665B, 0x9582, 0x665C, 0x9583, 0x665D, + 0x9584, 0x665E, 0x9585, 0x6660, 0x9586, 0x6662, 0x9587, 0x6663, + 0x9588, 0x6665, 0x9589, 0x6667, 0x958A, 0x6669, 0x958B, 0x666A, + 0x958C, 0x666B, 0x958D, 0x666C, 0x958E, 0x666D, 0x958F, 0x6671, + 0x9590, 0x6672, 0x9591, 0x6673, 0x9592, 0x6675, 0x9593, 0x6678, + 0x9594, 0x6679, 0x9595, 0x667B, 0x9596, 0x667C, 0x9597, 0x667D, + 0x9598, 0x667F, 0x9599, 0x6680, 0x959A, 0x6681, 0x959B, 0x6683, + 0x959C, 0x6685, 0x959D, 0x6686, 0x959E, 0x6688, 0x959F, 0x6689, + 0x95A0, 0x668A, 0x95A1, 0x668B, 0x95A2, 0x668D, 0x95A3, 0x668E, + 0x95A4, 0x668F, 0x95A5, 0x6690, 0x95A6, 0x6692, 0x95A7, 0x6693, + 0x95A8, 0x6694, 0x95A9, 0x6695, 0x95AA, 0x6698, 0x95AB, 0x6699, + 0x95AC, 0x669A, 0x95AD, 0x669B, 0x95AE, 0x669C, 0x95AF, 0x669E, + 0x95B0, 0x669F, 0x95B1, 0x66A0, 0x95B2, 0x66A1, 0x95B3, 0x66A2, + 0x95B4, 0x66A3, 0x95B5, 0x66A4, 0x95B6, 0x66A5, 0x95B7, 0x66A6, + 0x95B8, 0x66A9, 0x95B9, 0x66AA, 0x95BA, 0x66AB, 0x95BB, 0x66AC, + 0x95BC, 0x66AD, 0x95BD, 0x66AF, 0x95BE, 0x66B0, 0x95BF, 0x66B1, + 0x95C0, 0x66B2, 0x95C1, 0x66B3, 0x95C2, 0x66B5, 0x95C3, 0x66B6, + 0x95C4, 0x66B7, 0x95C5, 0x66B8, 0x95C6, 0x66BA, 0x95C7, 0x66BB, + 0x95C8, 0x66BC, 0x95C9, 0x66BD, 0x95CA, 0x66BF, 0x95CB, 0x66C0, + 0x95CC, 0x66C1, 0x95CD, 0x66C2, 0x95CE, 0x66C3, 0x95CF, 0x66C4, + 0x95D0, 0x66C5, 0x95D1, 0x66C6, 0x95D2, 0x66C7, 0x95D3, 0x66C8, + 0x95D4, 0x66C9, 0x95D5, 0x66CA, 0x95D6, 0x66CB, 0x95D7, 0x66CC, + 0x95D8, 0x66CD, 0x95D9, 0x66CE, 0x95DA, 0x66CF, 0x95DB, 0x66D0, + 0x95DC, 0x66D1, 0x95DD, 0x66D2, 0x95DE, 0x66D3, 0x95DF, 0x66D4, + 0x95E0, 0x66D5, 0x95E1, 0x66D6, 0x95E2, 0x66D7, 0x95E3, 0x66D8, + 0x95E4, 0x66DA, 0x95E5, 0x66DE, 0x95E6, 0x66DF, 0x95E7, 0x66E0, + 0x95E8, 0x66E1, 0x95E9, 0x66E2, 0x95EA, 0x66E3, 0x95EB, 0x66E4, + 0x95EC, 0x66E5, 0x95ED, 0x66E7, 0x95EE, 0x66E8, 0x95EF, 0x66EA, + 0x95F0, 0x66EB, 0x95F1, 0x66EC, 0x95F2, 0x66ED, 0x95F3, 0x66EE, + 0x95F4, 0x66EF, 0x95F5, 0x66F1, 0x95F6, 0x66F5, 0x95F7, 0x66F6, + 0x95F8, 0x66F8, 0x95F9, 0x66FA, 0x95FA, 0x66FB, 0x95FB, 0x66FD, + 0x95FC, 0x6701, 0x95FD, 0x6702, 0x95FE, 0x6703, 0x9640, 0x6704, + 0x9641, 0x6705, 0x9642, 0x6706, 0x9643, 0x6707, 0x9644, 0x670C, + 0x9645, 0x670E, 0x9646, 0x670F, 0x9647, 0x6711, 0x9648, 0x6712, + 0x9649, 0x6713, 0x964A, 0x6716, 0x964B, 0x6718, 0x964C, 0x6719, + 0x964D, 0x671A, 0x964E, 0x671C, 0x964F, 0x671E, 0x9650, 0x6720, + 0x9651, 0x6721, 0x9652, 0x6722, 0x9653, 0x6723, 0x9654, 0x6724, + 0x9655, 0x6725, 0x9656, 0x6727, 0x9657, 0x6729, 0x9658, 0x672E, + 0x9659, 0x6730, 0x965A, 0x6732, 0x965B, 0x6733, 0x965C, 0x6736, + 0x965D, 0x6737, 0x965E, 0x6738, 0x965F, 0x6739, 0x9660, 0x673B, + 0x9661, 0x673C, 0x9662, 0x673E, 0x9663, 0x673F, 0x9664, 0x6741, + 0x9665, 0x6744, 0x9666, 0x6745, 0x9667, 0x6747, 0x9668, 0x674A, + 0x9669, 0x674B, 0x966A, 0x674D, 0x966B, 0x6752, 0x966C, 0x6754, + 0x966D, 0x6755, 0x966E, 0x6757, 0x966F, 0x6758, 0x9670, 0x6759, + 0x9671, 0x675A, 0x9672, 0x675B, 0x9673, 0x675D, 0x9674, 0x6762, + 0x9675, 0x6763, 0x9676, 0x6764, 0x9677, 0x6766, 0x9678, 0x6767, + 0x9679, 0x676B, 0x967A, 0x676C, 0x967B, 0x676E, 0x967C, 0x6771, + 0x967D, 0x6774, 0x967E, 0x6776, 0x9680, 0x6778, 0x9681, 0x6779, + 0x9682, 0x677A, 0x9683, 0x677B, 0x9684, 0x677D, 0x9685, 0x6780, + 0x9686, 0x6782, 0x9687, 0x6783, 0x9688, 0x6785, 0x9689, 0x6786, + 0x968A, 0x6788, 0x968B, 0x678A, 0x968C, 0x678C, 0x968D, 0x678D, + 0x968E, 0x678E, 0x968F, 0x678F, 0x9690, 0x6791, 0x9691, 0x6792, + 0x9692, 0x6793, 0x9693, 0x6794, 0x9694, 0x6796, 0x9695, 0x6799, + 0x9696, 0x679B, 0x9697, 0x679F, 0x9698, 0x67A0, 0x9699, 0x67A1, + 0x969A, 0x67A4, 0x969B, 0x67A6, 0x969C, 0x67A9, 0x969D, 0x67AC, + 0x969E, 0x67AE, 0x969F, 0x67B1, 0x96A0, 0x67B2, 0x96A1, 0x67B4, + 0x96A2, 0x67B9, 0x96A3, 0x67BA, 0x96A4, 0x67BB, 0x96A5, 0x67BC, + 0x96A6, 0x67BD, 0x96A7, 0x67BE, 0x96A8, 0x67BF, 0x96A9, 0x67C0, + 0x96AA, 0x67C2, 0x96AB, 0x67C5, 0x96AC, 0x67C6, 0x96AD, 0x67C7, + 0x96AE, 0x67C8, 0x96AF, 0x67C9, 0x96B0, 0x67CA, 0x96B1, 0x67CB, + 0x96B2, 0x67CC, 0x96B3, 0x67CD, 0x96B4, 0x67CE, 0x96B5, 0x67D5, + 0x96B6, 0x67D6, 0x96B7, 0x67D7, 0x96B8, 0x67DB, 0x96B9, 0x67DF, + 0x96BA, 0x67E1, 0x96BB, 0x67E3, 0x96BC, 0x67E4, 0x96BD, 0x67E6, + 0x96BE, 0x67E7, 0x96BF, 0x67E8, 0x96C0, 0x67EA, 0x96C1, 0x67EB, + 0x96C2, 0x67ED, 0x96C3, 0x67EE, 0x96C4, 0x67F2, 0x96C5, 0x67F5, + 0x96C6, 0x67F6, 0x96C7, 0x67F7, 0x96C8, 0x67F8, 0x96C9, 0x67F9, + 0x96CA, 0x67FA, 0x96CB, 0x67FB, 0x96CC, 0x67FC, 0x96CD, 0x67FE, + 0x96CE, 0x6801, 0x96CF, 0x6802, 0x96D0, 0x6803, 0x96D1, 0x6804, + 0x96D2, 0x6806, 0x96D3, 0x680D, 0x96D4, 0x6810, 0x96D5, 0x6812, + 0x96D6, 0x6814, 0x96D7, 0x6815, 0x96D8, 0x6818, 0x96D9, 0x6819, + 0x96DA, 0x681A, 0x96DB, 0x681B, 0x96DC, 0x681C, 0x96DD, 0x681E, + 0x96DE, 0x681F, 0x96DF, 0x6820, 0x96E0, 0x6822, 0x96E1, 0x6823, + 0x96E2, 0x6824, 0x96E3, 0x6825, 0x96E4, 0x6826, 0x96E5, 0x6827, + 0x96E6, 0x6828, 0x96E7, 0x682B, 0x96E8, 0x682C, 0x96E9, 0x682D, + 0x96EA, 0x682E, 0x96EB, 0x682F, 0x96EC, 0x6830, 0x96ED, 0x6831, + 0x96EE, 0x6834, 0x96EF, 0x6835, 0x96F0, 0x6836, 0x96F1, 0x683A, + 0x96F2, 0x683B, 0x96F3, 0x683F, 0x96F4, 0x6847, 0x96F5, 0x684B, + 0x96F6, 0x684D, 0x96F7, 0x684F, 0x96F8, 0x6852, 0x96F9, 0x6856, + 0x96FA, 0x6857, 0x96FB, 0x6858, 0x96FC, 0x6859, 0x96FD, 0x685A, + 0x96FE, 0x685B, 0x9740, 0x685C, 0x9741, 0x685D, 0x9742, 0x685E, + 0x9743, 0x685F, 0x9744, 0x686A, 0x9745, 0x686C, 0x9746, 0x686D, + 0x9747, 0x686E, 0x9748, 0x686F, 0x9749, 0x6870, 0x974A, 0x6871, + 0x974B, 0x6872, 0x974C, 0x6873, 0x974D, 0x6875, 0x974E, 0x6878, + 0x974F, 0x6879, 0x9750, 0x687A, 0x9751, 0x687B, 0x9752, 0x687C, + 0x9753, 0x687D, 0x9754, 0x687E, 0x9755, 0x687F, 0x9756, 0x6880, + 0x9757, 0x6882, 0x9758, 0x6884, 0x9759, 0x6887, 0x975A, 0x6888, + 0x975B, 0x6889, 0x975C, 0x688A, 0x975D, 0x688B, 0x975E, 0x688C, + 0x975F, 0x688D, 0x9760, 0x688E, 0x9761, 0x6890, 0x9762, 0x6891, + 0x9763, 0x6892, 0x9764, 0x6894, 0x9765, 0x6895, 0x9766, 0x6896, + 0x9767, 0x6898, 0x9768, 0x6899, 0x9769, 0x689A, 0x976A, 0x689B, + 0x976B, 0x689C, 0x976C, 0x689D, 0x976D, 0x689E, 0x976E, 0x689F, + 0x976F, 0x68A0, 0x9770, 0x68A1, 0x9771, 0x68A3, 0x9772, 0x68A4, + 0x9773, 0x68A5, 0x9774, 0x68A9, 0x9775, 0x68AA, 0x9776, 0x68AB, + 0x9777, 0x68AC, 0x9778, 0x68AE, 0x9779, 0x68B1, 0x977A, 0x68B2, + 0x977B, 0x68B4, 0x977C, 0x68B6, 0x977D, 0x68B7, 0x977E, 0x68B8, + 0x9780, 0x68B9, 0x9781, 0x68BA, 0x9782, 0x68BB, 0x9783, 0x68BC, + 0x9784, 0x68BD, 0x9785, 0x68BE, 0x9786, 0x68BF, 0x9787, 0x68C1, + 0x9788, 0x68C3, 0x9789, 0x68C4, 0x978A, 0x68C5, 0x978B, 0x68C6, + 0x978C, 0x68C7, 0x978D, 0x68C8, 0x978E, 0x68CA, 0x978F, 0x68CC, + 0x9790, 0x68CE, 0x9791, 0x68CF, 0x9792, 0x68D0, 0x9793, 0x68D1, + 0x9794, 0x68D3, 0x9795, 0x68D4, 0x9796, 0x68D6, 0x9797, 0x68D7, + 0x9798, 0x68D9, 0x9799, 0x68DB, 0x979A, 0x68DC, 0x979B, 0x68DD, + 0x979C, 0x68DE, 0x979D, 0x68DF, 0x979E, 0x68E1, 0x979F, 0x68E2, + 0x97A0, 0x68E4, 0x97A1, 0x68E5, 0x97A2, 0x68E6, 0x97A3, 0x68E7, + 0x97A4, 0x68E8, 0x97A5, 0x68E9, 0x97A6, 0x68EA, 0x97A7, 0x68EB, + 0x97A8, 0x68EC, 0x97A9, 0x68ED, 0x97AA, 0x68EF, 0x97AB, 0x68F2, + 0x97AC, 0x68F3, 0x97AD, 0x68F4, 0x97AE, 0x68F6, 0x97AF, 0x68F7, + 0x97B0, 0x68F8, 0x97B1, 0x68FB, 0x97B2, 0x68FD, 0x97B3, 0x68FE, + 0x97B4, 0x68FF, 0x97B5, 0x6900, 0x97B6, 0x6902, 0x97B7, 0x6903, + 0x97B8, 0x6904, 0x97B9, 0x6906, 0x97BA, 0x6907, 0x97BB, 0x6908, + 0x97BC, 0x6909, 0x97BD, 0x690A, 0x97BE, 0x690C, 0x97BF, 0x690F, + 0x97C0, 0x6911, 0x97C1, 0x6913, 0x97C2, 0x6914, 0x97C3, 0x6915, + 0x97C4, 0x6916, 0x97C5, 0x6917, 0x97C6, 0x6918, 0x97C7, 0x6919, + 0x97C8, 0x691A, 0x97C9, 0x691B, 0x97CA, 0x691C, 0x97CB, 0x691D, + 0x97CC, 0x691E, 0x97CD, 0x6921, 0x97CE, 0x6922, 0x97CF, 0x6923, + 0x97D0, 0x6925, 0x97D1, 0x6926, 0x97D2, 0x6927, 0x97D3, 0x6928, + 0x97D4, 0x6929, 0x97D5, 0x692A, 0x97D6, 0x692B, 0x97D7, 0x692C, + 0x97D8, 0x692E, 0x97D9, 0x692F, 0x97DA, 0x6931, 0x97DB, 0x6932, + 0x97DC, 0x6933, 0x97DD, 0x6935, 0x97DE, 0x6936, 0x97DF, 0x6937, + 0x97E0, 0x6938, 0x97E1, 0x693A, 0x97E2, 0x693B, 0x97E3, 0x693C, + 0x97E4, 0x693E, 0x97E5, 0x6940, 0x97E6, 0x6941, 0x97E7, 0x6943, + 0x97E8, 0x6944, 0x97E9, 0x6945, 0x97EA, 0x6946, 0x97EB, 0x6947, + 0x97EC, 0x6948, 0x97ED, 0x6949, 0x97EE, 0x694A, 0x97EF, 0x694B, + 0x97F0, 0x694C, 0x97F1, 0x694D, 0x97F2, 0x694E, 0x97F3, 0x694F, + 0x97F4, 0x6950, 0x97F5, 0x6951, 0x97F6, 0x6952, 0x97F7, 0x6953, + 0x97F8, 0x6955, 0x97F9, 0x6956, 0x97FA, 0x6958, 0x97FB, 0x6959, + 0x97FC, 0x695B, 0x97FD, 0x695C, 0x97FE, 0x695F, 0x9840, 0x6961, + 0x9841, 0x6962, 0x9842, 0x6964, 0x9843, 0x6965, 0x9844, 0x6967, + 0x9845, 0x6968, 0x9846, 0x6969, 0x9847, 0x696A, 0x9848, 0x696C, + 0x9849, 0x696D, 0x984A, 0x696F, 0x984B, 0x6970, 0x984C, 0x6972, + 0x984D, 0x6973, 0x984E, 0x6974, 0x984F, 0x6975, 0x9850, 0x6976, + 0x9851, 0x697A, 0x9852, 0x697B, 0x9853, 0x697D, 0x9854, 0x697E, + 0x9855, 0x697F, 0x9856, 0x6981, 0x9857, 0x6983, 0x9858, 0x6985, + 0x9859, 0x698A, 0x985A, 0x698B, 0x985B, 0x698C, 0x985C, 0x698E, + 0x985D, 0x698F, 0x985E, 0x6990, 0x985F, 0x6991, 0x9860, 0x6992, + 0x9861, 0x6993, 0x9862, 0x6996, 0x9863, 0x6997, 0x9864, 0x6999, + 0x9865, 0x699A, 0x9866, 0x699D, 0x9867, 0x699E, 0x9868, 0x699F, + 0x9869, 0x69A0, 0x986A, 0x69A1, 0x986B, 0x69A2, 0x986C, 0x69A3, + 0x986D, 0x69A4, 0x986E, 0x69A5, 0x986F, 0x69A6, 0x9870, 0x69A9, + 0x9871, 0x69AA, 0x9872, 0x69AC, 0x9873, 0x69AE, 0x9874, 0x69AF, + 0x9875, 0x69B0, 0x9876, 0x69B2, 0x9877, 0x69B3, 0x9878, 0x69B5, + 0x9879, 0x69B6, 0x987A, 0x69B8, 0x987B, 0x69B9, 0x987C, 0x69BA, + 0x987D, 0x69BC, 0x987E, 0x69BD, 0x9880, 0x69BE, 0x9881, 0x69BF, + 0x9882, 0x69C0, 0x9883, 0x69C2, 0x9884, 0x69C3, 0x9885, 0x69C4, + 0x9886, 0x69C5, 0x9887, 0x69C6, 0x9888, 0x69C7, 0x9889, 0x69C8, + 0x988A, 0x69C9, 0x988B, 0x69CB, 0x988C, 0x69CD, 0x988D, 0x69CF, + 0x988E, 0x69D1, 0x988F, 0x69D2, 0x9890, 0x69D3, 0x9891, 0x69D5, + 0x9892, 0x69D6, 0x9893, 0x69D7, 0x9894, 0x69D8, 0x9895, 0x69D9, + 0x9896, 0x69DA, 0x9897, 0x69DC, 0x9898, 0x69DD, 0x9899, 0x69DE, + 0x989A, 0x69E1, 0x989B, 0x69E2, 0x989C, 0x69E3, 0x989D, 0x69E4, + 0x989E, 0x69E5, 0x989F, 0x69E6, 0x98A0, 0x69E7, 0x98A1, 0x69E8, + 0x98A2, 0x69E9, 0x98A3, 0x69EA, 0x98A4, 0x69EB, 0x98A5, 0x69EC, + 0x98A6, 0x69EE, 0x98A7, 0x69EF, 0x98A8, 0x69F0, 0x98A9, 0x69F1, + 0x98AA, 0x69F3, 0x98AB, 0x69F4, 0x98AC, 0x69F5, 0x98AD, 0x69F6, + 0x98AE, 0x69F7, 0x98AF, 0x69F8, 0x98B0, 0x69F9, 0x98B1, 0x69FA, + 0x98B2, 0x69FB, 0x98B3, 0x69FC, 0x98B4, 0x69FE, 0x98B5, 0x6A00, + 0x98B6, 0x6A01, 0x98B7, 0x6A02, 0x98B8, 0x6A03, 0x98B9, 0x6A04, + 0x98BA, 0x6A05, 0x98BB, 0x6A06, 0x98BC, 0x6A07, 0x98BD, 0x6A08, + 0x98BE, 0x6A09, 0x98BF, 0x6A0B, 0x98C0, 0x6A0C, 0x98C1, 0x6A0D, + 0x98C2, 0x6A0E, 0x98C3, 0x6A0F, 0x98C4, 0x6A10, 0x98C5, 0x6A11, + 0x98C6, 0x6A12, 0x98C7, 0x6A13, 0x98C8, 0x6A14, 0x98C9, 0x6A15, + 0x98CA, 0x6A16, 0x98CB, 0x6A19, 0x98CC, 0x6A1A, 0x98CD, 0x6A1B, + 0x98CE, 0x6A1C, 0x98CF, 0x6A1D, 0x98D0, 0x6A1E, 0x98D1, 0x6A20, + 0x98D2, 0x6A22, 0x98D3, 0x6A23, 0x98D4, 0x6A24, 0x98D5, 0x6A25, + 0x98D6, 0x6A26, 0x98D7, 0x6A27, 0x98D8, 0x6A29, 0x98D9, 0x6A2B, + 0x98DA, 0x6A2C, 0x98DB, 0x6A2D, 0x98DC, 0x6A2E, 0x98DD, 0x6A30, + 0x98DE, 0x6A32, 0x98DF, 0x6A33, 0x98E0, 0x6A34, 0x98E1, 0x6A36, + 0x98E2, 0x6A37, 0x98E3, 0x6A38, 0x98E4, 0x6A39, 0x98E5, 0x6A3A, + 0x98E6, 0x6A3B, 0x98E7, 0x6A3C, 0x98E8, 0x6A3F, 0x98E9, 0x6A40, + 0x98EA, 0x6A41, 0x98EB, 0x6A42, 0x98EC, 0x6A43, 0x98ED, 0x6A45, + 0x98EE, 0x6A46, 0x98EF, 0x6A48, 0x98F0, 0x6A49, 0x98F1, 0x6A4A, + 0x98F2, 0x6A4B, 0x98F3, 0x6A4C, 0x98F4, 0x6A4D, 0x98F5, 0x6A4E, + 0x98F6, 0x6A4F, 0x98F7, 0x6A51, 0x98F8, 0x6A52, 0x98F9, 0x6A53, + 0x98FA, 0x6A54, 0x98FB, 0x6A55, 0x98FC, 0x6A56, 0x98FD, 0x6A57, + 0x98FE, 0x6A5A, 0x9940, 0x6A5C, 0x9941, 0x6A5D, 0x9942, 0x6A5E, + 0x9943, 0x6A5F, 0x9944, 0x6A60, 0x9945, 0x6A62, 0x9946, 0x6A63, + 0x9947, 0x6A64, 0x9948, 0x6A66, 0x9949, 0x6A67, 0x994A, 0x6A68, + 0x994B, 0x6A69, 0x994C, 0x6A6A, 0x994D, 0x6A6B, 0x994E, 0x6A6C, + 0x994F, 0x6A6D, 0x9950, 0x6A6E, 0x9951, 0x6A6F, 0x9952, 0x6A70, + 0x9953, 0x6A72, 0x9954, 0x6A73, 0x9955, 0x6A74, 0x9956, 0x6A75, + 0x9957, 0x6A76, 0x9958, 0x6A77, 0x9959, 0x6A78, 0x995A, 0x6A7A, + 0x995B, 0x6A7B, 0x995C, 0x6A7D, 0x995D, 0x6A7E, 0x995E, 0x6A7F, + 0x995F, 0x6A81, 0x9960, 0x6A82, 0x9961, 0x6A83, 0x9962, 0x6A85, + 0x9963, 0x6A86, 0x9964, 0x6A87, 0x9965, 0x6A88, 0x9966, 0x6A89, + 0x9967, 0x6A8A, 0x9968, 0x6A8B, 0x9969, 0x6A8C, 0x996A, 0x6A8D, + 0x996B, 0x6A8F, 0x996C, 0x6A92, 0x996D, 0x6A93, 0x996E, 0x6A94, + 0x996F, 0x6A95, 0x9970, 0x6A96, 0x9971, 0x6A98, 0x9972, 0x6A99, + 0x9973, 0x6A9A, 0x9974, 0x6A9B, 0x9975, 0x6A9C, 0x9976, 0x6A9D, + 0x9977, 0x6A9E, 0x9978, 0x6A9F, 0x9979, 0x6AA1, 0x997A, 0x6AA2, + 0x997B, 0x6AA3, 0x997C, 0x6AA4, 0x997D, 0x6AA5, 0x997E, 0x6AA6, + 0x9980, 0x6AA7, 0x9981, 0x6AA8, 0x9982, 0x6AAA, 0x9983, 0x6AAD, + 0x9984, 0x6AAE, 0x9985, 0x6AAF, 0x9986, 0x6AB0, 0x9987, 0x6AB1, + 0x9988, 0x6AB2, 0x9989, 0x6AB3, 0x998A, 0x6AB4, 0x998B, 0x6AB5, + 0x998C, 0x6AB6, 0x998D, 0x6AB7, 0x998E, 0x6AB8, 0x998F, 0x6AB9, + 0x9990, 0x6ABA, 0x9991, 0x6ABB, 0x9992, 0x6ABC, 0x9993, 0x6ABD, + 0x9994, 0x6ABE, 0x9995, 0x6ABF, 0x9996, 0x6AC0, 0x9997, 0x6AC1, + 0x9998, 0x6AC2, 0x9999, 0x6AC3, 0x999A, 0x6AC4, 0x999B, 0x6AC5, + 0x999C, 0x6AC6, 0x999D, 0x6AC7, 0x999E, 0x6AC8, 0x999F, 0x6AC9, + 0x99A0, 0x6ACA, 0x99A1, 0x6ACB, 0x99A2, 0x6ACC, 0x99A3, 0x6ACD, + 0x99A4, 0x6ACE, 0x99A5, 0x6ACF, 0x99A6, 0x6AD0, 0x99A7, 0x6AD1, + 0x99A8, 0x6AD2, 0x99A9, 0x6AD3, 0x99AA, 0x6AD4, 0x99AB, 0x6AD5, + 0x99AC, 0x6AD6, 0x99AD, 0x6AD7, 0x99AE, 0x6AD8, 0x99AF, 0x6AD9, + 0x99B0, 0x6ADA, 0x99B1, 0x6ADB, 0x99B2, 0x6ADC, 0x99B3, 0x6ADD, + 0x99B4, 0x6ADE, 0x99B5, 0x6ADF, 0x99B6, 0x6AE0, 0x99B7, 0x6AE1, + 0x99B8, 0x6AE2, 0x99B9, 0x6AE3, 0x99BA, 0x6AE4, 0x99BB, 0x6AE5, + 0x99BC, 0x6AE6, 0x99BD, 0x6AE7, 0x99BE, 0x6AE8, 0x99BF, 0x6AE9, + 0x99C0, 0x6AEA, 0x99C1, 0x6AEB, 0x99C2, 0x6AEC, 0x99C3, 0x6AED, + 0x99C4, 0x6AEE, 0x99C5, 0x6AEF, 0x99C6, 0x6AF0, 0x99C7, 0x6AF1, + 0x99C8, 0x6AF2, 0x99C9, 0x6AF3, 0x99CA, 0x6AF4, 0x99CB, 0x6AF5, + 0x99CC, 0x6AF6, 0x99CD, 0x6AF7, 0x99CE, 0x6AF8, 0x99CF, 0x6AF9, + 0x99D0, 0x6AFA, 0x99D1, 0x6AFB, 0x99D2, 0x6AFC, 0x99D3, 0x6AFD, + 0x99D4, 0x6AFE, 0x99D5, 0x6AFF, 0x99D6, 0x6B00, 0x99D7, 0x6B01, + 0x99D8, 0x6B02, 0x99D9, 0x6B03, 0x99DA, 0x6B04, 0x99DB, 0x6B05, + 0x99DC, 0x6B06, 0x99DD, 0x6B07, 0x99DE, 0x6B08, 0x99DF, 0x6B09, + 0x99E0, 0x6B0A, 0x99E1, 0x6B0B, 0x99E2, 0x6B0C, 0x99E3, 0x6B0D, + 0x99E4, 0x6B0E, 0x99E5, 0x6B0F, 0x99E6, 0x6B10, 0x99E7, 0x6B11, + 0x99E8, 0x6B12, 0x99E9, 0x6B13, 0x99EA, 0x6B14, 0x99EB, 0x6B15, + 0x99EC, 0x6B16, 0x99ED, 0x6B17, 0x99EE, 0x6B18, 0x99EF, 0x6B19, + 0x99F0, 0x6B1A, 0x99F1, 0x6B1B, 0x99F2, 0x6B1C, 0x99F3, 0x6B1D, + 0x99F4, 0x6B1E, 0x99F5, 0x6B1F, 0x99F6, 0x6B25, 0x99F7, 0x6B26, + 0x99F8, 0x6B28, 0x99F9, 0x6B29, 0x99FA, 0x6B2A, 0x99FB, 0x6B2B, + 0x99FC, 0x6B2C, 0x99FD, 0x6B2D, 0x99FE, 0x6B2E, 0x9A40, 0x6B2F, + 0x9A41, 0x6B30, 0x9A42, 0x6B31, 0x9A43, 0x6B33, 0x9A44, 0x6B34, + 0x9A45, 0x6B35, 0x9A46, 0x6B36, 0x9A47, 0x6B38, 0x9A48, 0x6B3B, + 0x9A49, 0x6B3C, 0x9A4A, 0x6B3D, 0x9A4B, 0x6B3F, 0x9A4C, 0x6B40, + 0x9A4D, 0x6B41, 0x9A4E, 0x6B42, 0x9A4F, 0x6B44, 0x9A50, 0x6B45, + 0x9A51, 0x6B48, 0x9A52, 0x6B4A, 0x9A53, 0x6B4B, 0x9A54, 0x6B4D, + 0x9A55, 0x6B4E, 0x9A56, 0x6B4F, 0x9A57, 0x6B50, 0x9A58, 0x6B51, + 0x9A59, 0x6B52, 0x9A5A, 0x6B53, 0x9A5B, 0x6B54, 0x9A5C, 0x6B55, + 0x9A5D, 0x6B56, 0x9A5E, 0x6B57, 0x9A5F, 0x6B58, 0x9A60, 0x6B5A, + 0x9A61, 0x6B5B, 0x9A62, 0x6B5C, 0x9A63, 0x6B5D, 0x9A64, 0x6B5E, + 0x9A65, 0x6B5F, 0x9A66, 0x6B60, 0x9A67, 0x6B61, 0x9A68, 0x6B68, + 0x9A69, 0x6B69, 0x9A6A, 0x6B6B, 0x9A6B, 0x6B6C, 0x9A6C, 0x6B6D, + 0x9A6D, 0x6B6E, 0x9A6E, 0x6B6F, 0x9A6F, 0x6B70, 0x9A70, 0x6B71, + 0x9A71, 0x6B72, 0x9A72, 0x6B73, 0x9A73, 0x6B74, 0x9A74, 0x6B75, + 0x9A75, 0x6B76, 0x9A76, 0x6B77, 0x9A77, 0x6B78, 0x9A78, 0x6B7A, + 0x9A79, 0x6B7D, 0x9A7A, 0x6B7E, 0x9A7B, 0x6B7F, 0x9A7C, 0x6B80, + 0x9A7D, 0x6B85, 0x9A7E, 0x6B88, 0x9A80, 0x6B8C, 0x9A81, 0x6B8E, + 0x9A82, 0x6B8F, 0x9A83, 0x6B90, 0x9A84, 0x6B91, 0x9A85, 0x6B94, + 0x9A86, 0x6B95, 0x9A87, 0x6B97, 0x9A88, 0x6B98, 0x9A89, 0x6B99, + 0x9A8A, 0x6B9C, 0x9A8B, 0x6B9D, 0x9A8C, 0x6B9E, 0x9A8D, 0x6B9F, + 0x9A8E, 0x6BA0, 0x9A8F, 0x6BA2, 0x9A90, 0x6BA3, 0x9A91, 0x6BA4, + 0x9A92, 0x6BA5, 0x9A93, 0x6BA6, 0x9A94, 0x6BA7, 0x9A95, 0x6BA8, + 0x9A96, 0x6BA9, 0x9A97, 0x6BAB, 0x9A98, 0x6BAC, 0x9A99, 0x6BAD, + 0x9A9A, 0x6BAE, 0x9A9B, 0x6BAF, 0x9A9C, 0x6BB0, 0x9A9D, 0x6BB1, + 0x9A9E, 0x6BB2, 0x9A9F, 0x6BB6, 0x9AA0, 0x6BB8, 0x9AA1, 0x6BB9, + 0x9AA2, 0x6BBA, 0x9AA3, 0x6BBB, 0x9AA4, 0x6BBC, 0x9AA5, 0x6BBD, + 0x9AA6, 0x6BBE, 0x9AA7, 0x6BC0, 0x9AA8, 0x6BC3, 0x9AA9, 0x6BC4, + 0x9AAA, 0x6BC6, 0x9AAB, 0x6BC7, 0x9AAC, 0x6BC8, 0x9AAD, 0x6BC9, + 0x9AAE, 0x6BCA, 0x9AAF, 0x6BCC, 0x9AB0, 0x6BCE, 0x9AB1, 0x6BD0, + 0x9AB2, 0x6BD1, 0x9AB3, 0x6BD8, 0x9AB4, 0x6BDA, 0x9AB5, 0x6BDC, + 0x9AB6, 0x6BDD, 0x9AB7, 0x6BDE, 0x9AB8, 0x6BDF, 0x9AB9, 0x6BE0, + 0x9ABA, 0x6BE2, 0x9ABB, 0x6BE3, 0x9ABC, 0x6BE4, 0x9ABD, 0x6BE5, + 0x9ABE, 0x6BE6, 0x9ABF, 0x6BE7, 0x9AC0, 0x6BE8, 0x9AC1, 0x6BE9, + 0x9AC2, 0x6BEC, 0x9AC3, 0x6BED, 0x9AC4, 0x6BEE, 0x9AC5, 0x6BF0, + 0x9AC6, 0x6BF1, 0x9AC7, 0x6BF2, 0x9AC8, 0x6BF4, 0x9AC9, 0x6BF6, + 0x9ACA, 0x6BF7, 0x9ACB, 0x6BF8, 0x9ACC, 0x6BFA, 0x9ACD, 0x6BFB, + 0x9ACE, 0x6BFC, 0x9ACF, 0x6BFE, 0x9AD0, 0x6BFF, 0x9AD1, 0x6C00, + 0x9AD2, 0x6C01, 0x9AD3, 0x6C02, 0x9AD4, 0x6C03, 0x9AD5, 0x6C04, + 0x9AD6, 0x6C08, 0x9AD7, 0x6C09, 0x9AD8, 0x6C0A, 0x9AD9, 0x6C0B, + 0x9ADA, 0x6C0C, 0x9ADB, 0x6C0E, 0x9ADC, 0x6C12, 0x9ADD, 0x6C17, + 0x9ADE, 0x6C1C, 0x9ADF, 0x6C1D, 0x9AE0, 0x6C1E, 0x9AE1, 0x6C20, + 0x9AE2, 0x6C23, 0x9AE3, 0x6C25, 0x9AE4, 0x6C2B, 0x9AE5, 0x6C2C, + 0x9AE6, 0x6C2D, 0x9AE7, 0x6C31, 0x9AE8, 0x6C33, 0x9AE9, 0x6C36, + 0x9AEA, 0x6C37, 0x9AEB, 0x6C39, 0x9AEC, 0x6C3A, 0x9AED, 0x6C3B, + 0x9AEE, 0x6C3C, 0x9AEF, 0x6C3E, 0x9AF0, 0x6C3F, 0x9AF1, 0x6C43, + 0x9AF2, 0x6C44, 0x9AF3, 0x6C45, 0x9AF4, 0x6C48, 0x9AF5, 0x6C4B, + 0x9AF6, 0x6C4C, 0x9AF7, 0x6C4D, 0x9AF8, 0x6C4E, 0x9AF9, 0x6C4F, + 0x9AFA, 0x6C51, 0x9AFB, 0x6C52, 0x9AFC, 0x6C53, 0x9AFD, 0x6C56, + 0x9AFE, 0x6C58, 0x9B40, 0x6C59, 0x9B41, 0x6C5A, 0x9B42, 0x6C62, + 0x9B43, 0x6C63, 0x9B44, 0x6C65, 0x9B45, 0x6C66, 0x9B46, 0x6C67, + 0x9B47, 0x6C6B, 0x9B48, 0x6C6C, 0x9B49, 0x6C6D, 0x9B4A, 0x6C6E, + 0x9B4B, 0x6C6F, 0x9B4C, 0x6C71, 0x9B4D, 0x6C73, 0x9B4E, 0x6C75, + 0x9B4F, 0x6C77, 0x9B50, 0x6C78, 0x9B51, 0x6C7A, 0x9B52, 0x6C7B, + 0x9B53, 0x6C7C, 0x9B54, 0x6C7F, 0x9B55, 0x6C80, 0x9B56, 0x6C84, + 0x9B57, 0x6C87, 0x9B58, 0x6C8A, 0x9B59, 0x6C8B, 0x9B5A, 0x6C8D, + 0x9B5B, 0x6C8E, 0x9B5C, 0x6C91, 0x9B5D, 0x6C92, 0x9B5E, 0x6C95, + 0x9B5F, 0x6C96, 0x9B60, 0x6C97, 0x9B61, 0x6C98, 0x9B62, 0x6C9A, + 0x9B63, 0x6C9C, 0x9B64, 0x6C9D, 0x9B65, 0x6C9E, 0x9B66, 0x6CA0, + 0x9B67, 0x6CA2, 0x9B68, 0x6CA8, 0x9B69, 0x6CAC, 0x9B6A, 0x6CAF, + 0x9B6B, 0x6CB0, 0x9B6C, 0x6CB4, 0x9B6D, 0x6CB5, 0x9B6E, 0x6CB6, + 0x9B6F, 0x6CB7, 0x9B70, 0x6CBA, 0x9B71, 0x6CC0, 0x9B72, 0x6CC1, + 0x9B73, 0x6CC2, 0x9B74, 0x6CC3, 0x9B75, 0x6CC6, 0x9B76, 0x6CC7, + 0x9B77, 0x6CC8, 0x9B78, 0x6CCB, 0x9B79, 0x6CCD, 0x9B7A, 0x6CCE, + 0x9B7B, 0x6CCF, 0x9B7C, 0x6CD1, 0x9B7D, 0x6CD2, 0x9B7E, 0x6CD8, + 0x9B80, 0x6CD9, 0x9B81, 0x6CDA, 0x9B82, 0x6CDC, 0x9B83, 0x6CDD, + 0x9B84, 0x6CDF, 0x9B85, 0x6CE4, 0x9B86, 0x6CE6, 0x9B87, 0x6CE7, + 0x9B88, 0x6CE9, 0x9B89, 0x6CEC, 0x9B8A, 0x6CED, 0x9B8B, 0x6CF2, + 0x9B8C, 0x6CF4, 0x9B8D, 0x6CF9, 0x9B8E, 0x6CFF, 0x9B8F, 0x6D00, + 0x9B90, 0x6D02, 0x9B91, 0x6D03, 0x9B92, 0x6D05, 0x9B93, 0x6D06, + 0x9B94, 0x6D08, 0x9B95, 0x6D09, 0x9B96, 0x6D0A, 0x9B97, 0x6D0D, + 0x9B98, 0x6D0F, 0x9B99, 0x6D10, 0x9B9A, 0x6D11, 0x9B9B, 0x6D13, + 0x9B9C, 0x6D14, 0x9B9D, 0x6D15, 0x9B9E, 0x6D16, 0x9B9F, 0x6D18, + 0x9BA0, 0x6D1C, 0x9BA1, 0x6D1D, 0x9BA2, 0x6D1F, 0x9BA3, 0x6D20, + 0x9BA4, 0x6D21, 0x9BA5, 0x6D22, 0x9BA6, 0x6D23, 0x9BA7, 0x6D24, + 0x9BA8, 0x6D26, 0x9BA9, 0x6D28, 0x9BAA, 0x6D29, 0x9BAB, 0x6D2C, + 0x9BAC, 0x6D2D, 0x9BAD, 0x6D2F, 0x9BAE, 0x6D30, 0x9BAF, 0x6D34, + 0x9BB0, 0x6D36, 0x9BB1, 0x6D37, 0x9BB2, 0x6D38, 0x9BB3, 0x6D3A, + 0x9BB4, 0x6D3F, 0x9BB5, 0x6D40, 0x9BB6, 0x6D42, 0x9BB7, 0x6D44, + 0x9BB8, 0x6D49, 0x9BB9, 0x6D4C, 0x9BBA, 0x6D50, 0x9BBB, 0x6D55, + 0x9BBC, 0x6D56, 0x9BBD, 0x6D57, 0x9BBE, 0x6D58, 0x9BBF, 0x6D5B, + 0x9BC0, 0x6D5D, 0x9BC1, 0x6D5F, 0x9BC2, 0x6D61, 0x9BC3, 0x6D62, + 0x9BC4, 0x6D64, 0x9BC5, 0x6D65, 0x9BC6, 0x6D67, 0x9BC7, 0x6D68, + 0x9BC8, 0x6D6B, 0x9BC9, 0x6D6C, 0x9BCA, 0x6D6D, 0x9BCB, 0x6D70, + 0x9BCC, 0x6D71, 0x9BCD, 0x6D72, 0x9BCE, 0x6D73, 0x9BCF, 0x6D75, + 0x9BD0, 0x6D76, 0x9BD1, 0x6D79, 0x9BD2, 0x6D7A, 0x9BD3, 0x6D7B, + 0x9BD4, 0x6D7D, 0x9BD5, 0x6D7E, 0x9BD6, 0x6D7F, 0x9BD7, 0x6D80, + 0x9BD8, 0x6D81, 0x9BD9, 0x6D83, 0x9BDA, 0x6D84, 0x9BDB, 0x6D86, + 0x9BDC, 0x6D87, 0x9BDD, 0x6D8A, 0x9BDE, 0x6D8B, 0x9BDF, 0x6D8D, + 0x9BE0, 0x6D8F, 0x9BE1, 0x6D90, 0x9BE2, 0x6D92, 0x9BE3, 0x6D96, + 0x9BE4, 0x6D97, 0x9BE5, 0x6D98, 0x9BE6, 0x6D99, 0x9BE7, 0x6D9A, + 0x9BE8, 0x6D9C, 0x9BE9, 0x6DA2, 0x9BEA, 0x6DA5, 0x9BEB, 0x6DAC, + 0x9BEC, 0x6DAD, 0x9BED, 0x6DB0, 0x9BEE, 0x6DB1, 0x9BEF, 0x6DB3, + 0x9BF0, 0x6DB4, 0x9BF1, 0x6DB6, 0x9BF2, 0x6DB7, 0x9BF3, 0x6DB9, + 0x9BF4, 0x6DBA, 0x9BF5, 0x6DBB, 0x9BF6, 0x6DBC, 0x9BF7, 0x6DBD, + 0x9BF8, 0x6DBE, 0x9BF9, 0x6DC1, 0x9BFA, 0x6DC2, 0x9BFB, 0x6DC3, + 0x9BFC, 0x6DC8, 0x9BFD, 0x6DC9, 0x9BFE, 0x6DCA, 0x9C40, 0x6DCD, + 0x9C41, 0x6DCE, 0x9C42, 0x6DCF, 0x9C43, 0x6DD0, 0x9C44, 0x6DD2, + 0x9C45, 0x6DD3, 0x9C46, 0x6DD4, 0x9C47, 0x6DD5, 0x9C48, 0x6DD7, + 0x9C49, 0x6DDA, 0x9C4A, 0x6DDB, 0x9C4B, 0x6DDC, 0x9C4C, 0x6DDF, + 0x9C4D, 0x6DE2, 0x9C4E, 0x6DE3, 0x9C4F, 0x6DE5, 0x9C50, 0x6DE7, + 0x9C51, 0x6DE8, 0x9C52, 0x6DE9, 0x9C53, 0x6DEA, 0x9C54, 0x6DED, + 0x9C55, 0x6DEF, 0x9C56, 0x6DF0, 0x9C57, 0x6DF2, 0x9C58, 0x6DF4, + 0x9C59, 0x6DF5, 0x9C5A, 0x6DF6, 0x9C5B, 0x6DF8, 0x9C5C, 0x6DFA, + 0x9C5D, 0x6DFD, 0x9C5E, 0x6DFE, 0x9C5F, 0x6DFF, 0x9C60, 0x6E00, + 0x9C61, 0x6E01, 0x9C62, 0x6E02, 0x9C63, 0x6E03, 0x9C64, 0x6E04, + 0x9C65, 0x6E06, 0x9C66, 0x6E07, 0x9C67, 0x6E08, 0x9C68, 0x6E09, + 0x9C69, 0x6E0B, 0x9C6A, 0x6E0F, 0x9C6B, 0x6E12, 0x9C6C, 0x6E13, + 0x9C6D, 0x6E15, 0x9C6E, 0x6E18, 0x9C6F, 0x6E19, 0x9C70, 0x6E1B, + 0x9C71, 0x6E1C, 0x9C72, 0x6E1E, 0x9C73, 0x6E1F, 0x9C74, 0x6E22, + 0x9C75, 0x6E26, 0x9C76, 0x6E27, 0x9C77, 0x6E28, 0x9C78, 0x6E2A, + 0x9C79, 0x6E2C, 0x9C7A, 0x6E2E, 0x9C7B, 0x6E30, 0x9C7C, 0x6E31, + 0x9C7D, 0x6E33, 0x9C7E, 0x6E35, 0x9C80, 0x6E36, 0x9C81, 0x6E37, + 0x9C82, 0x6E39, 0x9C83, 0x6E3B, 0x9C84, 0x6E3C, 0x9C85, 0x6E3D, + 0x9C86, 0x6E3E, 0x9C87, 0x6E3F, 0x9C88, 0x6E40, 0x9C89, 0x6E41, + 0x9C8A, 0x6E42, 0x9C8B, 0x6E45, 0x9C8C, 0x6E46, 0x9C8D, 0x6E47, + 0x9C8E, 0x6E48, 0x9C8F, 0x6E49, 0x9C90, 0x6E4A, 0x9C91, 0x6E4B, + 0x9C92, 0x6E4C, 0x9C93, 0x6E4F, 0x9C94, 0x6E50, 0x9C95, 0x6E51, + 0x9C96, 0x6E52, 0x9C97, 0x6E55, 0x9C98, 0x6E57, 0x9C99, 0x6E59, + 0x9C9A, 0x6E5A, 0x9C9B, 0x6E5C, 0x9C9C, 0x6E5D, 0x9C9D, 0x6E5E, + 0x9C9E, 0x6E60, 0x9C9F, 0x6E61, 0x9CA0, 0x6E62, 0x9CA1, 0x6E63, + 0x9CA2, 0x6E64, 0x9CA3, 0x6E65, 0x9CA4, 0x6E66, 0x9CA5, 0x6E67, + 0x9CA6, 0x6E68, 0x9CA7, 0x6E69, 0x9CA8, 0x6E6A, 0x9CA9, 0x6E6C, + 0x9CAA, 0x6E6D, 0x9CAB, 0x6E6F, 0x9CAC, 0x6E70, 0x9CAD, 0x6E71, + 0x9CAE, 0x6E72, 0x9CAF, 0x6E73, 0x9CB0, 0x6E74, 0x9CB1, 0x6E75, + 0x9CB2, 0x6E76, 0x9CB3, 0x6E77, 0x9CB4, 0x6E78, 0x9CB5, 0x6E79, + 0x9CB6, 0x6E7A, 0x9CB7, 0x6E7B, 0x9CB8, 0x6E7C, 0x9CB9, 0x6E7D, + 0x9CBA, 0x6E80, 0x9CBB, 0x6E81, 0x9CBC, 0x6E82, 0x9CBD, 0x6E84, + 0x9CBE, 0x6E87, 0x9CBF, 0x6E88, 0x9CC0, 0x6E8A, 0x9CC1, 0x6E8B, + 0x9CC2, 0x6E8C, 0x9CC3, 0x6E8D, 0x9CC4, 0x6E8E, 0x9CC5, 0x6E91, + 0x9CC6, 0x6E92, 0x9CC7, 0x6E93, 0x9CC8, 0x6E94, 0x9CC9, 0x6E95, + 0x9CCA, 0x6E96, 0x9CCB, 0x6E97, 0x9CCC, 0x6E99, 0x9CCD, 0x6E9A, + 0x9CCE, 0x6E9B, 0x9CCF, 0x6E9D, 0x9CD0, 0x6E9E, 0x9CD1, 0x6EA0, + 0x9CD2, 0x6EA1, 0x9CD3, 0x6EA3, 0x9CD4, 0x6EA4, 0x9CD5, 0x6EA6, + 0x9CD6, 0x6EA8, 0x9CD7, 0x6EA9, 0x9CD8, 0x6EAB, 0x9CD9, 0x6EAC, + 0x9CDA, 0x6EAD, 0x9CDB, 0x6EAE, 0x9CDC, 0x6EB0, 0x9CDD, 0x6EB3, + 0x9CDE, 0x6EB5, 0x9CDF, 0x6EB8, 0x9CE0, 0x6EB9, 0x9CE1, 0x6EBC, + 0x9CE2, 0x6EBE, 0x9CE3, 0x6EBF, 0x9CE4, 0x6EC0, 0x9CE5, 0x6EC3, + 0x9CE6, 0x6EC4, 0x9CE7, 0x6EC5, 0x9CE8, 0x6EC6, 0x9CE9, 0x6EC8, + 0x9CEA, 0x6EC9, 0x9CEB, 0x6ECA, 0x9CEC, 0x6ECC, 0x9CED, 0x6ECD, + 0x9CEE, 0x6ECE, 0x9CEF, 0x6ED0, 0x9CF0, 0x6ED2, 0x9CF1, 0x6ED6, + 0x9CF2, 0x6ED8, 0x9CF3, 0x6ED9, 0x9CF4, 0x6EDB, 0x9CF5, 0x6EDC, + 0x9CF6, 0x6EDD, 0x9CF7, 0x6EE3, 0x9CF8, 0x6EE7, 0x9CF9, 0x6EEA, + 0x9CFA, 0x6EEB, 0x9CFB, 0x6EEC, 0x9CFC, 0x6EED, 0x9CFD, 0x6EEE, + 0x9CFE, 0x6EEF, 0x9D40, 0x6EF0, 0x9D41, 0x6EF1, 0x9D42, 0x6EF2, + 0x9D43, 0x6EF3, 0x9D44, 0x6EF5, 0x9D45, 0x6EF6, 0x9D46, 0x6EF7, + 0x9D47, 0x6EF8, 0x9D48, 0x6EFA, 0x9D49, 0x6EFB, 0x9D4A, 0x6EFC, + 0x9D4B, 0x6EFD, 0x9D4C, 0x6EFE, 0x9D4D, 0x6EFF, 0x9D4E, 0x6F00, + 0x9D4F, 0x6F01, 0x9D50, 0x6F03, 0x9D51, 0x6F04, 0x9D52, 0x6F05, + 0x9D53, 0x6F07, 0x9D54, 0x6F08, 0x9D55, 0x6F0A, 0x9D56, 0x6F0B, + 0x9D57, 0x6F0C, 0x9D58, 0x6F0D, 0x9D59, 0x6F0E, 0x9D5A, 0x6F10, + 0x9D5B, 0x6F11, 0x9D5C, 0x6F12, 0x9D5D, 0x6F16, 0x9D5E, 0x6F17, + 0x9D5F, 0x6F18, 0x9D60, 0x6F19, 0x9D61, 0x6F1A, 0x9D62, 0x6F1B, + 0x9D63, 0x6F1C, 0x9D64, 0x6F1D, 0x9D65, 0x6F1E, 0x9D66, 0x6F1F, + 0x9D67, 0x6F21, 0x9D68, 0x6F22, 0x9D69, 0x6F23, 0x9D6A, 0x6F25, + 0x9D6B, 0x6F26, 0x9D6C, 0x6F27, 0x9D6D, 0x6F28, 0x9D6E, 0x6F2C, + 0x9D6F, 0x6F2E, 0x9D70, 0x6F30, 0x9D71, 0x6F32, 0x9D72, 0x6F34, + 0x9D73, 0x6F35, 0x9D74, 0x6F37, 0x9D75, 0x6F38, 0x9D76, 0x6F39, + 0x9D77, 0x6F3A, 0x9D78, 0x6F3B, 0x9D79, 0x6F3C, 0x9D7A, 0x6F3D, + 0x9D7B, 0x6F3F, 0x9D7C, 0x6F40, 0x9D7D, 0x6F41, 0x9D7E, 0x6F42, + 0x9D80, 0x6F43, 0x9D81, 0x6F44, 0x9D82, 0x6F45, 0x9D83, 0x6F48, + 0x9D84, 0x6F49, 0x9D85, 0x6F4A, 0x9D86, 0x6F4C, 0x9D87, 0x6F4E, + 0x9D88, 0x6F4F, 0x9D89, 0x6F50, 0x9D8A, 0x6F51, 0x9D8B, 0x6F52, + 0x9D8C, 0x6F53, 0x9D8D, 0x6F54, 0x9D8E, 0x6F55, 0x9D8F, 0x6F56, + 0x9D90, 0x6F57, 0x9D91, 0x6F59, 0x9D92, 0x6F5A, 0x9D93, 0x6F5B, + 0x9D94, 0x6F5D, 0x9D95, 0x6F5F, 0x9D96, 0x6F60, 0x9D97, 0x6F61, + 0x9D98, 0x6F63, 0x9D99, 0x6F64, 0x9D9A, 0x6F65, 0x9D9B, 0x6F67, + 0x9D9C, 0x6F68, 0x9D9D, 0x6F69, 0x9D9E, 0x6F6A, 0x9D9F, 0x6F6B, + 0x9DA0, 0x6F6C, 0x9DA1, 0x6F6F, 0x9DA2, 0x6F70, 0x9DA3, 0x6F71, + 0x9DA4, 0x6F73, 0x9DA5, 0x6F75, 0x9DA6, 0x6F76, 0x9DA7, 0x6F77, + 0x9DA8, 0x6F79, 0x9DA9, 0x6F7B, 0x9DAA, 0x6F7D, 0x9DAB, 0x6F7E, + 0x9DAC, 0x6F7F, 0x9DAD, 0x6F80, 0x9DAE, 0x6F81, 0x9DAF, 0x6F82, + 0x9DB0, 0x6F83, 0x9DB1, 0x6F85, 0x9DB2, 0x6F86, 0x9DB3, 0x6F87, + 0x9DB4, 0x6F8A, 0x9DB5, 0x6F8B, 0x9DB6, 0x6F8F, 0x9DB7, 0x6F90, + 0x9DB8, 0x6F91, 0x9DB9, 0x6F92, 0x9DBA, 0x6F93, 0x9DBB, 0x6F94, + 0x9DBC, 0x6F95, 0x9DBD, 0x6F96, 0x9DBE, 0x6F97, 0x9DBF, 0x6F98, + 0x9DC0, 0x6F99, 0x9DC1, 0x6F9A, 0x9DC2, 0x6F9B, 0x9DC3, 0x6F9D, + 0x9DC4, 0x6F9E, 0x9DC5, 0x6F9F, 0x9DC6, 0x6FA0, 0x9DC7, 0x6FA2, + 0x9DC8, 0x6FA3, 0x9DC9, 0x6FA4, 0x9DCA, 0x6FA5, 0x9DCB, 0x6FA6, + 0x9DCC, 0x6FA8, 0x9DCD, 0x6FA9, 0x9DCE, 0x6FAA, 0x9DCF, 0x6FAB, + 0x9DD0, 0x6FAC, 0x9DD1, 0x6FAD, 0x9DD2, 0x6FAE, 0x9DD3, 0x6FAF, + 0x9DD4, 0x6FB0, 0x9DD5, 0x6FB1, 0x9DD6, 0x6FB2, 0x9DD7, 0x6FB4, + 0x9DD8, 0x6FB5, 0x9DD9, 0x6FB7, 0x9DDA, 0x6FB8, 0x9DDB, 0x6FBA, + 0x9DDC, 0x6FBB, 0x9DDD, 0x6FBC, 0x9DDE, 0x6FBD, 0x9DDF, 0x6FBE, + 0x9DE0, 0x6FBF, 0x9DE1, 0x6FC1, 0x9DE2, 0x6FC3, 0x9DE3, 0x6FC4, + 0x9DE4, 0x6FC5, 0x9DE5, 0x6FC6, 0x9DE6, 0x6FC7, 0x9DE7, 0x6FC8, + 0x9DE8, 0x6FCA, 0x9DE9, 0x6FCB, 0x9DEA, 0x6FCC, 0x9DEB, 0x6FCD, + 0x9DEC, 0x6FCE, 0x9DED, 0x6FCF, 0x9DEE, 0x6FD0, 0x9DEF, 0x6FD3, + 0x9DF0, 0x6FD4, 0x9DF1, 0x6FD5, 0x9DF2, 0x6FD6, 0x9DF3, 0x6FD7, + 0x9DF4, 0x6FD8, 0x9DF5, 0x6FD9, 0x9DF6, 0x6FDA, 0x9DF7, 0x6FDB, + 0x9DF8, 0x6FDC, 0x9DF9, 0x6FDD, 0x9DFA, 0x6FDF, 0x9DFB, 0x6FE2, + 0x9DFC, 0x6FE3, 0x9DFD, 0x6FE4, 0x9DFE, 0x6FE5, 0x9E40, 0x6FE6, + 0x9E41, 0x6FE7, 0x9E42, 0x6FE8, 0x9E43, 0x6FE9, 0x9E44, 0x6FEA, + 0x9E45, 0x6FEB, 0x9E46, 0x6FEC, 0x9E47, 0x6FED, 0x9E48, 0x6FF0, + 0x9E49, 0x6FF1, 0x9E4A, 0x6FF2, 0x9E4B, 0x6FF3, 0x9E4C, 0x6FF4, + 0x9E4D, 0x6FF5, 0x9E4E, 0x6FF6, 0x9E4F, 0x6FF7, 0x9E50, 0x6FF8, + 0x9E51, 0x6FF9, 0x9E52, 0x6FFA, 0x9E53, 0x6FFB, 0x9E54, 0x6FFC, + 0x9E55, 0x6FFD, 0x9E56, 0x6FFE, 0x9E57, 0x6FFF, 0x9E58, 0x7000, + 0x9E59, 0x7001, 0x9E5A, 0x7002, 0x9E5B, 0x7003, 0x9E5C, 0x7004, + 0x9E5D, 0x7005, 0x9E5E, 0x7006, 0x9E5F, 0x7007, 0x9E60, 0x7008, + 0x9E61, 0x7009, 0x9E62, 0x700A, 0x9E63, 0x700B, 0x9E64, 0x700C, + 0x9E65, 0x700D, 0x9E66, 0x700E, 0x9E67, 0x700F, 0x9E68, 0x7010, + 0x9E69, 0x7012, 0x9E6A, 0x7013, 0x9E6B, 0x7014, 0x9E6C, 0x7015, + 0x9E6D, 0x7016, 0x9E6E, 0x7017, 0x9E6F, 0x7018, 0x9E70, 0x7019, + 0x9E71, 0x701C, 0x9E72, 0x701D, 0x9E73, 0x701E, 0x9E74, 0x701F, + 0x9E75, 0x7020, 0x9E76, 0x7021, 0x9E77, 0x7022, 0x9E78, 0x7024, + 0x9E79, 0x7025, 0x9E7A, 0x7026, 0x9E7B, 0x7027, 0x9E7C, 0x7028, + 0x9E7D, 0x7029, 0x9E7E, 0x702A, 0x9E80, 0x702B, 0x9E81, 0x702C, + 0x9E82, 0x702D, 0x9E83, 0x702E, 0x9E84, 0x702F, 0x9E85, 0x7030, + 0x9E86, 0x7031, 0x9E87, 0x7032, 0x9E88, 0x7033, 0x9E89, 0x7034, + 0x9E8A, 0x7036, 0x9E8B, 0x7037, 0x9E8C, 0x7038, 0x9E8D, 0x703A, + 0x9E8E, 0x703B, 0x9E8F, 0x703C, 0x9E90, 0x703D, 0x9E91, 0x703E, + 0x9E92, 0x703F, 0x9E93, 0x7040, 0x9E94, 0x7041, 0x9E95, 0x7042, + 0x9E96, 0x7043, 0x9E97, 0x7044, 0x9E98, 0x7045, 0x9E99, 0x7046, + 0x9E9A, 0x7047, 0x9E9B, 0x7048, 0x9E9C, 0x7049, 0x9E9D, 0x704A, + 0x9E9E, 0x704B, 0x9E9F, 0x704D, 0x9EA0, 0x704E, 0x9EA1, 0x7050, + 0x9EA2, 0x7051, 0x9EA3, 0x7052, 0x9EA4, 0x7053, 0x9EA5, 0x7054, + 0x9EA6, 0x7055, 0x9EA7, 0x7056, 0x9EA8, 0x7057, 0x9EA9, 0x7058, + 0x9EAA, 0x7059, 0x9EAB, 0x705A, 0x9EAC, 0x705B, 0x9EAD, 0x705C, + 0x9EAE, 0x705D, 0x9EAF, 0x705F, 0x9EB0, 0x7060, 0x9EB1, 0x7061, + 0x9EB2, 0x7062, 0x9EB3, 0x7063, 0x9EB4, 0x7064, 0x9EB5, 0x7065, + 0x9EB6, 0x7066, 0x9EB7, 0x7067, 0x9EB8, 0x7068, 0x9EB9, 0x7069, + 0x9EBA, 0x706A, 0x9EBB, 0x706E, 0x9EBC, 0x7071, 0x9EBD, 0x7072, + 0x9EBE, 0x7073, 0x9EBF, 0x7074, 0x9EC0, 0x7077, 0x9EC1, 0x7079, + 0x9EC2, 0x707A, 0x9EC3, 0x707B, 0x9EC4, 0x707D, 0x9EC5, 0x7081, + 0x9EC6, 0x7082, 0x9EC7, 0x7083, 0x9EC8, 0x7084, 0x9EC9, 0x7086, + 0x9ECA, 0x7087, 0x9ECB, 0x7088, 0x9ECC, 0x708B, 0x9ECD, 0x708C, + 0x9ECE, 0x708D, 0x9ECF, 0x708F, 0x9ED0, 0x7090, 0x9ED1, 0x7091, + 0x9ED2, 0x7093, 0x9ED3, 0x7097, 0x9ED4, 0x7098, 0x9ED5, 0x709A, + 0x9ED6, 0x709B, 0x9ED7, 0x709E, 0x9ED8, 0x709F, 0x9ED9, 0x70A0, + 0x9EDA, 0x70A1, 0x9EDB, 0x70A2, 0x9EDC, 0x70A3, 0x9EDD, 0x70A4, + 0x9EDE, 0x70A5, 0x9EDF, 0x70A6, 0x9EE0, 0x70A7, 0x9EE1, 0x70A8, + 0x9EE2, 0x70A9, 0x9EE3, 0x70AA, 0x9EE4, 0x70B0, 0x9EE5, 0x70B2, + 0x9EE6, 0x70B4, 0x9EE7, 0x70B5, 0x9EE8, 0x70B6, 0x9EE9, 0x70BA, + 0x9EEA, 0x70BE, 0x9EEB, 0x70BF, 0x9EEC, 0x70C4, 0x9EED, 0x70C5, + 0x9EEE, 0x70C6, 0x9EEF, 0x70C7, 0x9EF0, 0x70C9, 0x9EF1, 0x70CB, + 0x9EF2, 0x70CC, 0x9EF3, 0x70CD, 0x9EF4, 0x70CE, 0x9EF5, 0x70CF, + 0x9EF6, 0x70D0, 0x9EF7, 0x70D1, 0x9EF8, 0x70D2, 0x9EF9, 0x70D3, + 0x9EFA, 0x70D4, 0x9EFB, 0x70D5, 0x9EFC, 0x70D6, 0x9EFD, 0x70D7, + 0x9EFE, 0x70DA, 0x9F40, 0x70DC, 0x9F41, 0x70DD, 0x9F42, 0x70DE, + 0x9F43, 0x70E0, 0x9F44, 0x70E1, 0x9F45, 0x70E2, 0x9F46, 0x70E3, + 0x9F47, 0x70E5, 0x9F48, 0x70EA, 0x9F49, 0x70EE, 0x9F4A, 0x70F0, + 0x9F4B, 0x70F1, 0x9F4C, 0x70F2, 0x9F4D, 0x70F3, 0x9F4E, 0x70F4, + 0x9F4F, 0x70F5, 0x9F50, 0x70F6, 0x9F51, 0x70F8, 0x9F52, 0x70FA, + 0x9F53, 0x70FB, 0x9F54, 0x70FC, 0x9F55, 0x70FE, 0x9F56, 0x70FF, + 0x9F57, 0x7100, 0x9F58, 0x7101, 0x9F59, 0x7102, 0x9F5A, 0x7103, + 0x9F5B, 0x7104, 0x9F5C, 0x7105, 0x9F5D, 0x7106, 0x9F5E, 0x7107, + 0x9F5F, 0x7108, 0x9F60, 0x710B, 0x9F61, 0x710C, 0x9F62, 0x710D, + 0x9F63, 0x710E, 0x9F64, 0x710F, 0x9F65, 0x7111, 0x9F66, 0x7112, + 0x9F67, 0x7114, 0x9F68, 0x7117, 0x9F69, 0x711B, 0x9F6A, 0x711C, + 0x9F6B, 0x711D, 0x9F6C, 0x711E, 0x9F6D, 0x711F, 0x9F6E, 0x7120, + 0x9F6F, 0x7121, 0x9F70, 0x7122, 0x9F71, 0x7123, 0x9F72, 0x7124, + 0x9F73, 0x7125, 0x9F74, 0x7127, 0x9F75, 0x7128, 0x9F76, 0x7129, + 0x9F77, 0x712A, 0x9F78, 0x712B, 0x9F79, 0x712C, 0x9F7A, 0x712D, + 0x9F7B, 0x712E, 0x9F7C, 0x7132, 0x9F7D, 0x7133, 0x9F7E, 0x7134, + 0x9F80, 0x7135, 0x9F81, 0x7137, 0x9F82, 0x7138, 0x9F83, 0x7139, + 0x9F84, 0x713A, 0x9F85, 0x713B, 0x9F86, 0x713C, 0x9F87, 0x713D, + 0x9F88, 0x713E, 0x9F89, 0x713F, 0x9F8A, 0x7140, 0x9F8B, 0x7141, + 0x9F8C, 0x7142, 0x9F8D, 0x7143, 0x9F8E, 0x7144, 0x9F8F, 0x7146, + 0x9F90, 0x7147, 0x9F91, 0x7148, 0x9F92, 0x7149, 0x9F93, 0x714B, + 0x9F94, 0x714D, 0x9F95, 0x714F, 0x9F96, 0x7150, 0x9F97, 0x7151, + 0x9F98, 0x7152, 0x9F99, 0x7153, 0x9F9A, 0x7154, 0x9F9B, 0x7155, + 0x9F9C, 0x7156, 0x9F9D, 0x7157, 0x9F9E, 0x7158, 0x9F9F, 0x7159, + 0x9FA0, 0x715A, 0x9FA1, 0x715B, 0x9FA2, 0x715D, 0x9FA3, 0x715F, + 0x9FA4, 0x7160, 0x9FA5, 0x7161, 0x9FA6, 0x7162, 0x9FA7, 0x7163, + 0x9FA8, 0x7165, 0x9FA9, 0x7169, 0x9FAA, 0x716A, 0x9FAB, 0x716B, + 0x9FAC, 0x716C, 0x9FAD, 0x716D, 0x9FAE, 0x716F, 0x9FAF, 0x7170, + 0x9FB0, 0x7171, 0x9FB1, 0x7174, 0x9FB2, 0x7175, 0x9FB3, 0x7176, + 0x9FB4, 0x7177, 0x9FB5, 0x7179, 0x9FB6, 0x717B, 0x9FB7, 0x717C, + 0x9FB8, 0x717E, 0x9FB9, 0x717F, 0x9FBA, 0x7180, 0x9FBB, 0x7181, + 0x9FBC, 0x7182, 0x9FBD, 0x7183, 0x9FBE, 0x7185, 0x9FBF, 0x7186, + 0x9FC0, 0x7187, 0x9FC1, 0x7188, 0x9FC2, 0x7189, 0x9FC3, 0x718B, + 0x9FC4, 0x718C, 0x9FC5, 0x718D, 0x9FC6, 0x718E, 0x9FC7, 0x7190, + 0x9FC8, 0x7191, 0x9FC9, 0x7192, 0x9FCA, 0x7193, 0x9FCB, 0x7195, + 0x9FCC, 0x7196, 0x9FCD, 0x7197, 0x9FCE, 0x719A, 0x9FCF, 0x719B, + 0x9FD0, 0x719C, 0x9FD1, 0x719D, 0x9FD2, 0x719E, 0x9FD3, 0x71A1, + 0x9FD4, 0x71A2, 0x9FD5, 0x71A3, 0x9FD6, 0x71A4, 0x9FD7, 0x71A5, + 0x9FD8, 0x71A6, 0x9FD9, 0x71A7, 0x9FDA, 0x71A9, 0x9FDB, 0x71AA, + 0x9FDC, 0x71AB, 0x9FDD, 0x71AD, 0x9FDE, 0x71AE, 0x9FDF, 0x71AF, + 0x9FE0, 0x71B0, 0x9FE1, 0x71B1, 0x9FE2, 0x71B2, 0x9FE3, 0x71B4, + 0x9FE4, 0x71B6, 0x9FE5, 0x71B7, 0x9FE6, 0x71B8, 0x9FE7, 0x71BA, + 0x9FE8, 0x71BB, 0x9FE9, 0x71BC, 0x9FEA, 0x71BD, 0x9FEB, 0x71BE, + 0x9FEC, 0x71BF, 0x9FED, 0x71C0, 0x9FEE, 0x71C1, 0x9FEF, 0x71C2, + 0x9FF0, 0x71C4, 0x9FF1, 0x71C5, 0x9FF2, 0x71C6, 0x9FF3, 0x71C7, + 0x9FF4, 0x71C8, 0x9FF5, 0x71C9, 0x9FF6, 0x71CA, 0x9FF7, 0x71CB, + 0x9FF8, 0x71CC, 0x9FF9, 0x71CD, 0x9FFA, 0x71CF, 0x9FFB, 0x71D0, + 0x9FFC, 0x71D1, 0x9FFD, 0x71D2, 0x9FFE, 0x71D3, 0xA040, 0x71D6, + 0xA041, 0x71D7, 0xA042, 0x71D8, 0xA043, 0x71D9, 0xA044, 0x71DA, + 0xA045, 0x71DB, 0xA046, 0x71DC, 0xA047, 0x71DD, 0xA048, 0x71DE, + 0xA049, 0x71DF, 0xA04A, 0x71E1, 0xA04B, 0x71E2, 0xA04C, 0x71E3, + 0xA04D, 0x71E4, 0xA04E, 0x71E6, 0xA04F, 0x71E8, 0xA050, 0x71E9, + 0xA051, 0x71EA, 0xA052, 0x71EB, 0xA053, 0x71EC, 0xA054, 0x71ED, + 0xA055, 0x71EF, 0xA056, 0x71F0, 0xA057, 0x71F1, 0xA058, 0x71F2, + 0xA059, 0x71F3, 0xA05A, 0x71F4, 0xA05B, 0x71F5, 0xA05C, 0x71F6, + 0xA05D, 0x71F7, 0xA05E, 0x71F8, 0xA05F, 0x71FA, 0xA060, 0x71FB, + 0xA061, 0x71FC, 0xA062, 0x71FD, 0xA063, 0x71FE, 0xA064, 0x71FF, + 0xA065, 0x7200, 0xA066, 0x7201, 0xA067, 0x7202, 0xA068, 0x7203, + 0xA069, 0x7204, 0xA06A, 0x7205, 0xA06B, 0x7207, 0xA06C, 0x7208, + 0xA06D, 0x7209, 0xA06E, 0x720A, 0xA06F, 0x720B, 0xA070, 0x720C, + 0xA071, 0x720D, 0xA072, 0x720E, 0xA073, 0x720F, 0xA074, 0x7210, + 0xA075, 0x7211, 0xA076, 0x7212, 0xA077, 0x7213, 0xA078, 0x7214, + 0xA079, 0x7215, 0xA07A, 0x7216, 0xA07B, 0x7217, 0xA07C, 0x7218, + 0xA07D, 0x7219, 0xA07E, 0x721A, 0xA080, 0x721B, 0xA081, 0x721C, + 0xA082, 0x721E, 0xA083, 0x721F, 0xA084, 0x7220, 0xA085, 0x7221, + 0xA086, 0x7222, 0xA087, 0x7223, 0xA088, 0x7224, 0xA089, 0x7225, + 0xA08A, 0x7226, 0xA08B, 0x7227, 0xA08C, 0x7229, 0xA08D, 0x722B, + 0xA08E, 0x722D, 0xA08F, 0x722E, 0xA090, 0x722F, 0xA091, 0x7232, + 0xA092, 0x7233, 0xA093, 0x7234, 0xA094, 0x723A, 0xA095, 0x723C, + 0xA096, 0x723E, 0xA097, 0x7240, 0xA098, 0x7241, 0xA099, 0x7242, + 0xA09A, 0x7243, 0xA09B, 0x7244, 0xA09C, 0x7245, 0xA09D, 0x7246, + 0xA09E, 0x7249, 0xA09F, 0x724A, 0xA0A0, 0x724B, 0xA0A1, 0x724E, + 0xA0A2, 0x724F, 0xA0A3, 0x7250, 0xA0A4, 0x7251, 0xA0A5, 0x7253, + 0xA0A6, 0x7254, 0xA0A7, 0x7255, 0xA0A8, 0x7257, 0xA0A9, 0x7258, + 0xA0AA, 0x725A, 0xA0AB, 0x725C, 0xA0AC, 0x725E, 0xA0AD, 0x7260, + 0xA0AE, 0x7263, 0xA0AF, 0x7264, 0xA0B0, 0x7265, 0xA0B1, 0x7268, + 0xA0B2, 0x726A, 0xA0B3, 0x726B, 0xA0B4, 0x726C, 0xA0B5, 0x726D, + 0xA0B6, 0x7270, 0xA0B7, 0x7271, 0xA0B8, 0x7273, 0xA0B9, 0x7274, + 0xA0BA, 0x7276, 0xA0BB, 0x7277, 0xA0BC, 0x7278, 0xA0BD, 0x727B, + 0xA0BE, 0x727C, 0xA0BF, 0x727D, 0xA0C0, 0x7282, 0xA0C1, 0x7283, + 0xA0C2, 0x7285, 0xA0C3, 0x7286, 0xA0C4, 0x7287, 0xA0C5, 0x7288, + 0xA0C6, 0x7289, 0xA0C7, 0x728C, 0xA0C8, 0x728E, 0xA0C9, 0x7290, + 0xA0CA, 0x7291, 0xA0CB, 0x7293, 0xA0CC, 0x7294, 0xA0CD, 0x7295, + 0xA0CE, 0x7296, 0xA0CF, 0x7297, 0xA0D0, 0x7298, 0xA0D1, 0x7299, + 0xA0D2, 0x729A, 0xA0D3, 0x729B, 0xA0D4, 0x729C, 0xA0D5, 0x729D, + 0xA0D6, 0x729E, 0xA0D7, 0x72A0, 0xA0D8, 0x72A1, 0xA0D9, 0x72A2, + 0xA0DA, 0x72A3, 0xA0DB, 0x72A4, 0xA0DC, 0x72A5, 0xA0DD, 0x72A6, + 0xA0DE, 0x72A7, 0xA0DF, 0x72A8, 0xA0E0, 0x72A9, 0xA0E1, 0x72AA, + 0xA0E2, 0x72AB, 0xA0E3, 0x72AE, 0xA0E4, 0x72B1, 0xA0E5, 0x72B2, + 0xA0E6, 0x72B3, 0xA0E7, 0x72B5, 0xA0E8, 0x72BA, 0xA0E9, 0x72BB, + 0xA0EA, 0x72BC, 0xA0EB, 0x72BD, 0xA0EC, 0x72BE, 0xA0ED, 0x72BF, + 0xA0EE, 0x72C0, 0xA0EF, 0x72C5, 0xA0F0, 0x72C6, 0xA0F1, 0x72C7, + 0xA0F2, 0x72C9, 0xA0F3, 0x72CA, 0xA0F4, 0x72CB, 0xA0F5, 0x72CC, + 0xA0F6, 0x72CF, 0xA0F7, 0x72D1, 0xA0F8, 0x72D3, 0xA0F9, 0x72D4, + 0xA0FA, 0x72D5, 0xA0FB, 0x72D6, 0xA0FC, 0x72D8, 0xA0FD, 0x72DA, + 0xA0FE, 0x72DB, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, + 0xA1A4, 0x00B7, 0xA1A5, 0x02C9, 0xA1A6, 0x02C7, 0xA1A7, 0x00A8, + 0xA1A8, 0x3003, 0xA1A9, 0x3005, 0xA1AA, 0x2014, 0xA1AB, 0xFF5E, + 0xA1AC, 0x2016, 0xA1AD, 0x2026, 0xA1AE, 0x2018, 0xA1AF, 0x2019, + 0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, + 0xA1B4, 0x3008, 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, + 0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, + 0xA1BC, 0x3016, 0xA1BD, 0x3017, 0xA1BE, 0x3010, 0xA1BF, 0x3011, + 0xA1C0, 0x00B1, 0xA1C1, 0x00D7, 0xA1C2, 0x00F7, 0xA1C3, 0x2236, + 0xA1C4, 0x2227, 0xA1C5, 0x2228, 0xA1C6, 0x2211, 0xA1C7, 0x220F, + 0xA1C8, 0x222A, 0xA1C9, 0x2229, 0xA1CA, 0x2208, 0xA1CB, 0x2237, + 0xA1CC, 0x221A, 0xA1CD, 0x22A5, 0xA1CE, 0x2225, 0xA1CF, 0x2220, + 0xA1D0, 0x2312, 0xA1D1, 0x2299, 0xA1D2, 0x222B, 0xA1D3, 0x222E, + 0xA1D4, 0x2261, 0xA1D5, 0x224C, 0xA1D6, 0x2248, 0xA1D7, 0x223D, + 0xA1D8, 0x221D, 0xA1D9, 0x2260, 0xA1DA, 0x226E, 0xA1DB, 0x226F, + 0xA1DC, 0x2264, 0xA1DD, 0x2265, 0xA1DE, 0x221E, 0xA1DF, 0x2235, + 0xA1E0, 0x2234, 0xA1E1, 0x2642, 0xA1E2, 0x2640, 0xA1E3, 0x00B0, + 0xA1E4, 0x2032, 0xA1E5, 0x2033, 0xA1E6, 0x2103, 0xA1E7, 0xFF04, + 0xA1E8, 0x00A4, 0xA1E9, 0xFFE0, 0xA1EA, 0xFFE1, 0xA1EB, 0x2030, + 0xA1EC, 0x00A7, 0xA1ED, 0x2116, 0xA1EE, 0x2606, 0xA1EF, 0x2605, + 0xA1F0, 0x25CB, 0xA1F1, 0x25CF, 0xA1F2, 0x25CE, 0xA1F3, 0x25C7, + 0xA1F4, 0x25C6, 0xA1F5, 0x25A1, 0xA1F6, 0x25A0, 0xA1F7, 0x25B3, + 0xA1F8, 0x25B2, 0xA1F9, 0x203B, 0xA1FA, 0x2192, 0xA1FB, 0x2190, + 0xA1FC, 0x2191, 0xA1FD, 0x2193, 0xA1FE, 0x3013, 0xA2A1, 0x2170, + 0xA2A2, 0x2171, 0xA2A3, 0x2172, 0xA2A4, 0x2173, 0xA2A5, 0x2174, + 0xA2A6, 0x2175, 0xA2A7, 0x2176, 0xA2A8, 0x2177, 0xA2A9, 0x2178, + 0xA2AA, 0x2179, 0xA2B1, 0x2488, 0xA2B2, 0x2489, 0xA2B3, 0x248A, + 0xA2B4, 0x248B, 0xA2B5, 0x248C, 0xA2B6, 0x248D, 0xA2B7, 0x248E, + 0xA2B8, 0x248F, 0xA2B9, 0x2490, 0xA2BA, 0x2491, 0xA2BB, 0x2492, + 0xA2BC, 0x2493, 0xA2BD, 0x2494, 0xA2BE, 0x2495, 0xA2BF, 0x2496, + 0xA2C0, 0x2497, 0xA2C1, 0x2498, 0xA2C2, 0x2499, 0xA2C3, 0x249A, + 0xA2C4, 0x249B, 0xA2C5, 0x2474, 0xA2C6, 0x2475, 0xA2C7, 0x2476, + 0xA2C8, 0x2477, 0xA2C9, 0x2478, 0xA2CA, 0x2479, 0xA2CB, 0x247A, + 0xA2CC, 0x247B, 0xA2CD, 0x247C, 0xA2CE, 0x247D, 0xA2CF, 0x247E, + 0xA2D0, 0x247F, 0xA2D1, 0x2480, 0xA2D2, 0x2481, 0xA2D3, 0x2482, + 0xA2D4, 0x2483, 0xA2D5, 0x2484, 0xA2D6, 0x2485, 0xA2D7, 0x2486, + 0xA2D8, 0x2487, 0xA2D9, 0x2460, 0xA2DA, 0x2461, 0xA2DB, 0x2462, + 0xA2DC, 0x2463, 0xA2DD, 0x2464, 0xA2DE, 0x2465, 0xA2DF, 0x2466, + 0xA2E0, 0x2467, 0xA2E1, 0x2468, 0xA2E2, 0x2469, 0xA2E5, 0x3220, + 0xA2E6, 0x3221, 0xA2E7, 0x3222, 0xA2E8, 0x3223, 0xA2E9, 0x3224, + 0xA2EA, 0x3225, 0xA2EB, 0x3226, 0xA2EC, 0x3227, 0xA2ED, 0x3228, + 0xA2EE, 0x3229, 0xA2F1, 0x2160, 0xA2F2, 0x2161, 0xA2F3, 0x2162, + 0xA2F4, 0x2163, 0xA2F5, 0x2164, 0xA2F6, 0x2165, 0xA2F7, 0x2166, + 0xA2F8, 0x2167, 0xA2F9, 0x2168, 0xA2FA, 0x2169, 0xA2FB, 0x216A, + 0xA2FC, 0x216B, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, + 0xA3A4, 0xFFE5, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, + 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, + 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, + 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, + 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, + 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, + 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, + 0xA3DC, 0xFF3C, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, + 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, + 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, + 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, + 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA4A1, 0x3041, + 0xA4A2, 0x3042, 0xA4A3, 0x3043, 0xA4A4, 0x3044, 0xA4A5, 0x3045, + 0xA4A6, 0x3046, 0xA4A7, 0x3047, 0xA4A8, 0x3048, 0xA4A9, 0x3049, + 0xA4AA, 0x304A, 0xA4AB, 0x304B, 0xA4AC, 0x304C, 0xA4AD, 0x304D, + 0xA4AE, 0x304E, 0xA4AF, 0x304F, 0xA4B0, 0x3050, 0xA4B1, 0x3051, + 0xA4B2, 0x3052, 0xA4B3, 0x3053, 0xA4B4, 0x3054, 0xA4B5, 0x3055, + 0xA4B6, 0x3056, 0xA4B7, 0x3057, 0xA4B8, 0x3058, 0xA4B9, 0x3059, + 0xA4BA, 0x305A, 0xA4BB, 0x305B, 0xA4BC, 0x305C, 0xA4BD, 0x305D, + 0xA4BE, 0x305E, 0xA4BF, 0x305F, 0xA4C0, 0x3060, 0xA4C1, 0x3061, + 0xA4C2, 0x3062, 0xA4C3, 0x3063, 0xA4C4, 0x3064, 0xA4C5, 0x3065, + 0xA4C6, 0x3066, 0xA4C7, 0x3067, 0xA4C8, 0x3068, 0xA4C9, 0x3069, + 0xA4CA, 0x306A, 0xA4CB, 0x306B, 0xA4CC, 0x306C, 0xA4CD, 0x306D, + 0xA4CE, 0x306E, 0xA4CF, 0x306F, 0xA4D0, 0x3070, 0xA4D1, 0x3071, + 0xA4D2, 0x3072, 0xA4D3, 0x3073, 0xA4D4, 0x3074, 0xA4D5, 0x3075, + 0xA4D6, 0x3076, 0xA4D7, 0x3077, 0xA4D8, 0x3078, 0xA4D9, 0x3079, + 0xA4DA, 0x307A, 0xA4DB, 0x307B, 0xA4DC, 0x307C, 0xA4DD, 0x307D, + 0xA4DE, 0x307E, 0xA4DF, 0x307F, 0xA4E0, 0x3080, 0xA4E1, 0x3081, + 0xA4E2, 0x3082, 0xA4E3, 0x3083, 0xA4E4, 0x3084, 0xA4E5, 0x3085, + 0xA4E6, 0x3086, 0xA4E7, 0x3087, 0xA4E8, 0x3088, 0xA4E9, 0x3089, + 0xA4EA, 0x308A, 0xA4EB, 0x308B, 0xA4EC, 0x308C, 0xA4ED, 0x308D, + 0xA4EE, 0x308E, 0xA4EF, 0x308F, 0xA4F0, 0x3090, 0xA4F1, 0x3091, + 0xA4F2, 0x3092, 0xA4F3, 0x3093, 0xA5A1, 0x30A1, 0xA5A2, 0x30A2, + 0xA5A3, 0x30A3, 0xA5A4, 0x30A4, 0xA5A5, 0x30A5, 0xA5A6, 0x30A6, + 0xA5A7, 0x30A7, 0xA5A8, 0x30A8, 0xA5A9, 0x30A9, 0xA5AA, 0x30AA, + 0xA5AB, 0x30AB, 0xA5AC, 0x30AC, 0xA5AD, 0x30AD, 0xA5AE, 0x30AE, + 0xA5AF, 0x30AF, 0xA5B0, 0x30B0, 0xA5B1, 0x30B1, 0xA5B2, 0x30B2, + 0xA5B3, 0x30B3, 0xA5B4, 0x30B4, 0xA5B5, 0x30B5, 0xA5B6, 0x30B6, + 0xA5B7, 0x30B7, 0xA5B8, 0x30B8, 0xA5B9, 0x30B9, 0xA5BA, 0x30BA, + 0xA5BB, 0x30BB, 0xA5BC, 0x30BC, 0xA5BD, 0x30BD, 0xA5BE, 0x30BE, + 0xA5BF, 0x30BF, 0xA5C0, 0x30C0, 0xA5C1, 0x30C1, 0xA5C2, 0x30C2, + 0xA5C3, 0x30C3, 0xA5C4, 0x30C4, 0xA5C5, 0x30C5, 0xA5C6, 0x30C6, + 0xA5C7, 0x30C7, 0xA5C8, 0x30C8, 0xA5C9, 0x30C9, 0xA5CA, 0x30CA, + 0xA5CB, 0x30CB, 0xA5CC, 0x30CC, 0xA5CD, 0x30CD, 0xA5CE, 0x30CE, + 0xA5CF, 0x30CF, 0xA5D0, 0x30D0, 0xA5D1, 0x30D1, 0xA5D2, 0x30D2, + 0xA5D3, 0x30D3, 0xA5D4, 0x30D4, 0xA5D5, 0x30D5, 0xA5D6, 0x30D6, + 0xA5D7, 0x30D7, 0xA5D8, 0x30D8, 0xA5D9, 0x30D9, 0xA5DA, 0x30DA, + 0xA5DB, 0x30DB, 0xA5DC, 0x30DC, 0xA5DD, 0x30DD, 0xA5DE, 0x30DE, + 0xA5DF, 0x30DF, 0xA5E0, 0x30E0, 0xA5E1, 0x30E1, 0xA5E2, 0x30E2, + 0xA5E3, 0x30E3, 0xA5E4, 0x30E4, 0xA5E5, 0x30E5, 0xA5E6, 0x30E6, + 0xA5E7, 0x30E7, 0xA5E8, 0x30E8, 0xA5E9, 0x30E9, 0xA5EA, 0x30EA, + 0xA5EB, 0x30EB, 0xA5EC, 0x30EC, 0xA5ED, 0x30ED, 0xA5EE, 0x30EE, + 0xA5EF, 0x30EF, 0xA5F0, 0x30F0, 0xA5F1, 0x30F1, 0xA5F2, 0x30F2, + 0xA5F3, 0x30F3, 0xA5F4, 0x30F4, 0xA5F5, 0x30F5, 0xA5F6, 0x30F6, + 0xA6A1, 0x0391, 0xA6A2, 0x0392, 0xA6A3, 0x0393, 0xA6A4, 0x0394, + 0xA6A5, 0x0395, 0xA6A6, 0x0396, 0xA6A7, 0x0397, 0xA6A8, 0x0398, + 0xA6A9, 0x0399, 0xA6AA, 0x039A, 0xA6AB, 0x039B, 0xA6AC, 0x039C, + 0xA6AD, 0x039D, 0xA6AE, 0x039E, 0xA6AF, 0x039F, 0xA6B0, 0x03A0, + 0xA6B1, 0x03A1, 0xA6B2, 0x03A3, 0xA6B3, 0x03A4, 0xA6B4, 0x03A5, + 0xA6B5, 0x03A6, 0xA6B6, 0x03A7, 0xA6B7, 0x03A8, 0xA6B8, 0x03A9, + 0xA6C1, 0x03B1, 0xA6C2, 0x03B2, 0xA6C3, 0x03B3, 0xA6C4, 0x03B4, + 0xA6C5, 0x03B5, 0xA6C6, 0x03B6, 0xA6C7, 0x03B7, 0xA6C8, 0x03B8, + 0xA6C9, 0x03B9, 0xA6CA, 0x03BA, 0xA6CB, 0x03BB, 0xA6CC, 0x03BC, + 0xA6CD, 0x03BD, 0xA6CE, 0x03BE, 0xA6CF, 0x03BF, 0xA6D0, 0x03C0, + 0xA6D1, 0x03C1, 0xA6D2, 0x03C3, 0xA6D3, 0x03C4, 0xA6D4, 0x03C5, + 0xA6D5, 0x03C6, 0xA6D6, 0x03C7, 0xA6D7, 0x03C8, 0xA6D8, 0x03C9, + 0xA6E0, 0xFE35, 0xA6E1, 0xFE36, 0xA6E2, 0xFE39, 0xA6E3, 0xFE3A, + 0xA6E4, 0xFE3F, 0xA6E5, 0xFE40, 0xA6E6, 0xFE3D, 0xA6E7, 0xFE3E, + 0xA6E8, 0xFE41, 0xA6E9, 0xFE42, 0xA6EA, 0xFE43, 0xA6EB, 0xFE44, + 0xA6EE, 0xFE3B, 0xA6EF, 0xFE3C, 0xA6F0, 0xFE37, 0xA6F1, 0xFE38, + 0xA6F2, 0xFE31, 0xA6F4, 0xFE33, 0xA6F5, 0xFE34, 0xA7A1, 0x0410, + 0xA7A2, 0x0411, 0xA7A3, 0x0412, 0xA7A4, 0x0413, 0xA7A5, 0x0414, + 0xA7A6, 0x0415, 0xA7A7, 0x0401, 0xA7A8, 0x0416, 0xA7A9, 0x0417, + 0xA7AA, 0x0418, 0xA7AB, 0x0419, 0xA7AC, 0x041A, 0xA7AD, 0x041B, + 0xA7AE, 0x041C, 0xA7AF, 0x041D, 0xA7B0, 0x041E, 0xA7B1, 0x041F, + 0xA7B2, 0x0420, 0xA7B3, 0x0421, 0xA7B4, 0x0422, 0xA7B5, 0x0423, + 0xA7B6, 0x0424, 0xA7B7, 0x0425, 0xA7B8, 0x0426, 0xA7B9, 0x0427, + 0xA7BA, 0x0428, 0xA7BB, 0x0429, 0xA7BC, 0x042A, 0xA7BD, 0x042B, + 0xA7BE, 0x042C, 0xA7BF, 0x042D, 0xA7C0, 0x042E, 0xA7C1, 0x042F, + 0xA7D1, 0x0430, 0xA7D2, 0x0431, 0xA7D3, 0x0432, 0xA7D4, 0x0433, + 0xA7D5, 0x0434, 0xA7D6, 0x0435, 0xA7D7, 0x0451, 0xA7D8, 0x0436, + 0xA7D9, 0x0437, 0xA7DA, 0x0438, 0xA7DB, 0x0439, 0xA7DC, 0x043A, + 0xA7DD, 0x043B, 0xA7DE, 0x043C, 0xA7DF, 0x043D, 0xA7E0, 0x043E, + 0xA7E1, 0x043F, 0xA7E2, 0x0440, 0xA7E3, 0x0441, 0xA7E4, 0x0442, + 0xA7E5, 0x0443, 0xA7E6, 0x0444, 0xA7E7, 0x0445, 0xA7E8, 0x0446, + 0xA7E9, 0x0447, 0xA7EA, 0x0448, 0xA7EB, 0x0449, 0xA7EC, 0x044A, + 0xA7ED, 0x044B, 0xA7EE, 0x044C, 0xA7EF, 0x044D, 0xA7F0, 0x044E, + 0xA7F1, 0x044F, 0xA840, 0x02CA, 0xA841, 0x02CB, 0xA842, 0x02D9, + 0xA843, 0x2013, 0xA844, 0x2015, 0xA845, 0x2025, 0xA846, 0x2035, + 0xA847, 0x2105, 0xA848, 0x2109, 0xA849, 0x2196, 0xA84A, 0x2197, + 0xA84B, 0x2198, 0xA84C, 0x2199, 0xA84D, 0x2215, 0xA84E, 0x221F, + 0xA84F, 0x2223, 0xA850, 0x2252, 0xA851, 0x2266, 0xA852, 0x2267, + 0xA853, 0x22BF, 0xA854, 0x2550, 0xA855, 0x2551, 0xA856, 0x2552, + 0xA857, 0x2553, 0xA858, 0x2554, 0xA859, 0x2555, 0xA85A, 0x2556, + 0xA85B, 0x2557, 0xA85C, 0x2558, 0xA85D, 0x2559, 0xA85E, 0x255A, + 0xA85F, 0x255B, 0xA860, 0x255C, 0xA861, 0x255D, 0xA862, 0x255E, + 0xA863, 0x255F, 0xA864, 0x2560, 0xA865, 0x2561, 0xA866, 0x2562, + 0xA867, 0x2563, 0xA868, 0x2564, 0xA869, 0x2565, 0xA86A, 0x2566, + 0xA86B, 0x2567, 0xA86C, 0x2568, 0xA86D, 0x2569, 0xA86E, 0x256A, + 0xA86F, 0x256B, 0xA870, 0x256C, 0xA871, 0x256D, 0xA872, 0x256E, + 0xA873, 0x256F, 0xA874, 0x2570, 0xA875, 0x2571, 0xA876, 0x2572, + 0xA877, 0x2573, 0xA878, 0x2581, 0xA879, 0x2582, 0xA87A, 0x2583, + 0xA87B, 0x2584, 0xA87C, 0x2585, 0xA87D, 0x2586, 0xA87E, 0x2587, + 0xA880, 0x2588, 0xA881, 0x2589, 0xA882, 0x258A, 0xA883, 0x258B, + 0xA884, 0x258C, 0xA885, 0x258D, 0xA886, 0x258E, 0xA887, 0x258F, + 0xA888, 0x2593, 0xA889, 0x2594, 0xA88A, 0x2595, 0xA88B, 0x25BC, + 0xA88C, 0x25BD, 0xA88D, 0x25E2, 0xA88E, 0x25E3, 0xA88F, 0x25E4, + 0xA890, 0x25E5, 0xA891, 0x2609, 0xA892, 0x2295, 0xA893, 0x3012, + 0xA894, 0x301D, 0xA895, 0x301E, 0xA8A1, 0x0101, 0xA8A2, 0x00E1, + 0xA8A3, 0x01CE, 0xA8A4, 0x00E0, 0xA8A5, 0x0113, 0xA8A6, 0x00E9, + 0xA8A7, 0x011B, 0xA8A8, 0x00E8, 0xA8A9, 0x012B, 0xA8AA, 0x00ED, + 0xA8AB, 0x01D0, 0xA8AC, 0x00EC, 0xA8AD, 0x014D, 0xA8AE, 0x00F3, + 0xA8AF, 0x01D2, 0xA8B0, 0x00F2, 0xA8B1, 0x016B, 0xA8B2, 0x00FA, + 0xA8B3, 0x01D4, 0xA8B4, 0x00F9, 0xA8B5, 0x01D6, 0xA8B6, 0x01D8, + 0xA8B7, 0x01DA, 0xA8B8, 0x01DC, 0xA8B9, 0x00FC, 0xA8BA, 0x00EA, + 0xA8BB, 0x0251, 0xA8BD, 0x0144, 0xA8BE, 0x0148, 0xA8C0, 0x0261, + 0xA8C5, 0x3105, 0xA8C6, 0x3106, 0xA8C7, 0x3107, 0xA8C8, 0x3108, + 0xA8C9, 0x3109, 0xA8CA, 0x310A, 0xA8CB, 0x310B, 0xA8CC, 0x310C, + 0xA8CD, 0x310D, 0xA8CE, 0x310E, 0xA8CF, 0x310F, 0xA8D0, 0x3110, + 0xA8D1, 0x3111, 0xA8D2, 0x3112, 0xA8D3, 0x3113, 0xA8D4, 0x3114, + 0xA8D5, 0x3115, 0xA8D6, 0x3116, 0xA8D7, 0x3117, 0xA8D8, 0x3118, + 0xA8D9, 0x3119, 0xA8DA, 0x311A, 0xA8DB, 0x311B, 0xA8DC, 0x311C, + 0xA8DD, 0x311D, 0xA8DE, 0x311E, 0xA8DF, 0x311F, 0xA8E0, 0x3120, + 0xA8E1, 0x3121, 0xA8E2, 0x3122, 0xA8E3, 0x3123, 0xA8E4, 0x3124, + 0xA8E5, 0x3125, 0xA8E6, 0x3126, 0xA8E7, 0x3127, 0xA8E8, 0x3128, + 0xA8E9, 0x3129, 0xA940, 0x3021, 0xA941, 0x3022, 0xA942, 0x3023, + 0xA943, 0x3024, 0xA944, 0x3025, 0xA945, 0x3026, 0xA946, 0x3027, + 0xA947, 0x3028, 0xA948, 0x3029, 0xA949, 0x32A3, 0xA94A, 0x338E, + 0xA94B, 0x338F, 0xA94C, 0x339C, 0xA94D, 0x339D, 0xA94E, 0x339E, + 0xA94F, 0x33A1, 0xA950, 0x33C4, 0xA951, 0x33CE, 0xA952, 0x33D1, + 0xA953, 0x33D2, 0xA954, 0x33D5, 0xA955, 0xFE30, 0xA956, 0xFFE2, + 0xA957, 0xFFE4, 0xA959, 0x2121, 0xA95A, 0x3231, 0xA95C, 0x2010, + 0xA960, 0x30FC, 0xA961, 0x309B, 0xA962, 0x309C, 0xA963, 0x30FD, + 0xA964, 0x30FE, 0xA965, 0x3006, 0xA966, 0x309D, 0xA967, 0x309E, + 0xA968, 0xFE49, 0xA969, 0xFE4A, 0xA96A, 0xFE4B, 0xA96B, 0xFE4C, + 0xA96C, 0xFE4D, 0xA96D, 0xFE4E, 0xA96E, 0xFE4F, 0xA96F, 0xFE50, + 0xA970, 0xFE51, 0xA971, 0xFE52, 0xA972, 0xFE54, 0xA973, 0xFE55, + 0xA974, 0xFE56, 0xA975, 0xFE57, 0xA976, 0xFE59, 0xA977, 0xFE5A, + 0xA978, 0xFE5B, 0xA979, 0xFE5C, 0xA97A, 0xFE5D, 0xA97B, 0xFE5E, + 0xA97C, 0xFE5F, 0xA97D, 0xFE60, 0xA97E, 0xFE61, 0xA980, 0xFE62, + 0xA981, 0xFE63, 0xA982, 0xFE64, 0xA983, 0xFE65, 0xA984, 0xFE66, + 0xA985, 0xFE68, 0xA986, 0xFE69, 0xA987, 0xFE6A, 0xA988, 0xFE6B, + 0xA996, 0x3007, 0xA9A4, 0x2500, 0xA9A5, 0x2501, 0xA9A6, 0x2502, + 0xA9A7, 0x2503, 0xA9A8, 0x2504, 0xA9A9, 0x2505, 0xA9AA, 0x2506, + 0xA9AB, 0x2507, 0xA9AC, 0x2508, 0xA9AD, 0x2509, 0xA9AE, 0x250A, + 0xA9AF, 0x250B, 0xA9B0, 0x250C, 0xA9B1, 0x250D, 0xA9B2, 0x250E, + 0xA9B3, 0x250F, 0xA9B4, 0x2510, 0xA9B5, 0x2511, 0xA9B6, 0x2512, + 0xA9B7, 0x2513, 0xA9B8, 0x2514, 0xA9B9, 0x2515, 0xA9BA, 0x2516, + 0xA9BB, 0x2517, 0xA9BC, 0x2518, 0xA9BD, 0x2519, 0xA9BE, 0x251A, + 0xA9BF, 0x251B, 0xA9C0, 0x251C, 0xA9C1, 0x251D, 0xA9C2, 0x251E, + 0xA9C3, 0x251F, 0xA9C4, 0x2520, 0xA9C5, 0x2521, 0xA9C6, 0x2522, + 0xA9C7, 0x2523, 0xA9C8, 0x2524, 0xA9C9, 0x2525, 0xA9CA, 0x2526, + 0xA9CB, 0x2527, 0xA9CC, 0x2528, 0xA9CD, 0x2529, 0xA9CE, 0x252A, + 0xA9CF, 0x252B, 0xA9D0, 0x252C, 0xA9D1, 0x252D, 0xA9D2, 0x252E, + 0xA9D3, 0x252F, 0xA9D4, 0x2530, 0xA9D5, 0x2531, 0xA9D6, 0x2532, + 0xA9D7, 0x2533, 0xA9D8, 0x2534, 0xA9D9, 0x2535, 0xA9DA, 0x2536, + 0xA9DB, 0x2537, 0xA9DC, 0x2538, 0xA9DD, 0x2539, 0xA9DE, 0x253A, + 0xA9DF, 0x253B, 0xA9E0, 0x253C, 0xA9E1, 0x253D, 0xA9E2, 0x253E, + 0xA9E3, 0x253F, 0xA9E4, 0x2540, 0xA9E5, 0x2541, 0xA9E6, 0x2542, + 0xA9E7, 0x2543, 0xA9E8, 0x2544, 0xA9E9, 0x2545, 0xA9EA, 0x2546, + 0xA9EB, 0x2547, 0xA9EC, 0x2548, 0xA9ED, 0x2549, 0xA9EE, 0x254A, + 0xA9EF, 0x254B, 0xAA40, 0x72DC, 0xAA41, 0x72DD, 0xAA42, 0x72DF, + 0xAA43, 0x72E2, 0xAA44, 0x72E3, 0xAA45, 0x72E4, 0xAA46, 0x72E5, + 0xAA47, 0x72E6, 0xAA48, 0x72E7, 0xAA49, 0x72EA, 0xAA4A, 0x72EB, + 0xAA4B, 0x72F5, 0xAA4C, 0x72F6, 0xAA4D, 0x72F9, 0xAA4E, 0x72FD, + 0xAA4F, 0x72FE, 0xAA50, 0x72FF, 0xAA51, 0x7300, 0xAA52, 0x7302, + 0xAA53, 0x7304, 0xAA54, 0x7305, 0xAA55, 0x7306, 0xAA56, 0x7307, + 0xAA57, 0x7308, 0xAA58, 0x7309, 0xAA59, 0x730B, 0xAA5A, 0x730C, + 0xAA5B, 0x730D, 0xAA5C, 0x730F, 0xAA5D, 0x7310, 0xAA5E, 0x7311, + 0xAA5F, 0x7312, 0xAA60, 0x7314, 0xAA61, 0x7318, 0xAA62, 0x7319, + 0xAA63, 0x731A, 0xAA64, 0x731F, 0xAA65, 0x7320, 0xAA66, 0x7323, + 0xAA67, 0x7324, 0xAA68, 0x7326, 0xAA69, 0x7327, 0xAA6A, 0x7328, + 0xAA6B, 0x732D, 0xAA6C, 0x732F, 0xAA6D, 0x7330, 0xAA6E, 0x7332, + 0xAA6F, 0x7333, 0xAA70, 0x7335, 0xAA71, 0x7336, 0xAA72, 0x733A, + 0xAA73, 0x733B, 0xAA74, 0x733C, 0xAA75, 0x733D, 0xAA76, 0x7340, + 0xAA77, 0x7341, 0xAA78, 0x7342, 0xAA79, 0x7343, 0xAA7A, 0x7344, + 0xAA7B, 0x7345, 0xAA7C, 0x7346, 0xAA7D, 0x7347, 0xAA7E, 0x7348, + 0xAA80, 0x7349, 0xAA81, 0x734A, 0xAA82, 0x734B, 0xAA83, 0x734C, + 0xAA84, 0x734E, 0xAA85, 0x734F, 0xAA86, 0x7351, 0xAA87, 0x7353, + 0xAA88, 0x7354, 0xAA89, 0x7355, 0xAA8A, 0x7356, 0xAA8B, 0x7358, + 0xAA8C, 0x7359, 0xAA8D, 0x735A, 0xAA8E, 0x735B, 0xAA8F, 0x735C, + 0xAA90, 0x735D, 0xAA91, 0x735E, 0xAA92, 0x735F, 0xAA93, 0x7361, + 0xAA94, 0x7362, 0xAA95, 0x7363, 0xAA96, 0x7364, 0xAA97, 0x7365, + 0xAA98, 0x7366, 0xAA99, 0x7367, 0xAA9A, 0x7368, 0xAA9B, 0x7369, + 0xAA9C, 0x736A, 0xAA9D, 0x736B, 0xAA9E, 0x736E, 0xAA9F, 0x7370, + 0xAAA0, 0x7371, 0xAB40, 0x7372, 0xAB41, 0x7373, 0xAB42, 0x7374, + 0xAB43, 0x7375, 0xAB44, 0x7376, 0xAB45, 0x7377, 0xAB46, 0x7378, + 0xAB47, 0x7379, 0xAB48, 0x737A, 0xAB49, 0x737B, 0xAB4A, 0x737C, + 0xAB4B, 0x737D, 0xAB4C, 0x737F, 0xAB4D, 0x7380, 0xAB4E, 0x7381, + 0xAB4F, 0x7382, 0xAB50, 0x7383, 0xAB51, 0x7385, 0xAB52, 0x7386, + 0xAB53, 0x7388, 0xAB54, 0x738A, 0xAB55, 0x738C, 0xAB56, 0x738D, + 0xAB57, 0x738F, 0xAB58, 0x7390, 0xAB59, 0x7392, 0xAB5A, 0x7393, + 0xAB5B, 0x7394, 0xAB5C, 0x7395, 0xAB5D, 0x7397, 0xAB5E, 0x7398, + 0xAB5F, 0x7399, 0xAB60, 0x739A, 0xAB61, 0x739C, 0xAB62, 0x739D, + 0xAB63, 0x739E, 0xAB64, 0x73A0, 0xAB65, 0x73A1, 0xAB66, 0x73A3, + 0xAB67, 0x73A4, 0xAB68, 0x73A5, 0xAB69, 0x73A6, 0xAB6A, 0x73A7, + 0xAB6B, 0x73A8, 0xAB6C, 0x73AA, 0xAB6D, 0x73AC, 0xAB6E, 0x73AD, + 0xAB6F, 0x73B1, 0xAB70, 0x73B4, 0xAB71, 0x73B5, 0xAB72, 0x73B6, + 0xAB73, 0x73B8, 0xAB74, 0x73B9, 0xAB75, 0x73BC, 0xAB76, 0x73BD, + 0xAB77, 0x73BE, 0xAB78, 0x73BF, 0xAB79, 0x73C1, 0xAB7A, 0x73C3, + 0xAB7B, 0x73C4, 0xAB7C, 0x73C5, 0xAB7D, 0x73C6, 0xAB7E, 0x73C7, + 0xAB80, 0x73CB, 0xAB81, 0x73CC, 0xAB82, 0x73CE, 0xAB83, 0x73D2, + 0xAB84, 0x73D3, 0xAB85, 0x73D4, 0xAB86, 0x73D5, 0xAB87, 0x73D6, + 0xAB88, 0x73D7, 0xAB89, 0x73D8, 0xAB8A, 0x73DA, 0xAB8B, 0x73DB, + 0xAB8C, 0x73DC, 0xAB8D, 0x73DD, 0xAB8E, 0x73DF, 0xAB8F, 0x73E1, + 0xAB90, 0x73E2, 0xAB91, 0x73E3, 0xAB92, 0x73E4, 0xAB93, 0x73E6, + 0xAB94, 0x73E8, 0xAB95, 0x73EA, 0xAB96, 0x73EB, 0xAB97, 0x73EC, + 0xAB98, 0x73EE, 0xAB99, 0x73EF, 0xAB9A, 0x73F0, 0xAB9B, 0x73F1, + 0xAB9C, 0x73F3, 0xAB9D, 0x73F4, 0xAB9E, 0x73F5, 0xAB9F, 0x73F6, + 0xABA0, 0x73F7, 0xAC40, 0x73F8, 0xAC41, 0x73F9, 0xAC42, 0x73FA, + 0xAC43, 0x73FB, 0xAC44, 0x73FC, 0xAC45, 0x73FD, 0xAC46, 0x73FE, + 0xAC47, 0x73FF, 0xAC48, 0x7400, 0xAC49, 0x7401, 0xAC4A, 0x7402, + 0xAC4B, 0x7404, 0xAC4C, 0x7407, 0xAC4D, 0x7408, 0xAC4E, 0x740B, + 0xAC4F, 0x740C, 0xAC50, 0x740D, 0xAC51, 0x740E, 0xAC52, 0x7411, + 0xAC53, 0x7412, 0xAC54, 0x7413, 0xAC55, 0x7414, 0xAC56, 0x7415, + 0xAC57, 0x7416, 0xAC58, 0x7417, 0xAC59, 0x7418, 0xAC5A, 0x7419, + 0xAC5B, 0x741C, 0xAC5C, 0x741D, 0xAC5D, 0x741E, 0xAC5E, 0x741F, + 0xAC5F, 0x7420, 0xAC60, 0x7421, 0xAC61, 0x7423, 0xAC62, 0x7424, + 0xAC63, 0x7427, 0xAC64, 0x7429, 0xAC65, 0x742B, 0xAC66, 0x742D, + 0xAC67, 0x742F, 0xAC68, 0x7431, 0xAC69, 0x7432, 0xAC6A, 0x7437, + 0xAC6B, 0x7438, 0xAC6C, 0x7439, 0xAC6D, 0x743A, 0xAC6E, 0x743B, + 0xAC6F, 0x743D, 0xAC70, 0x743E, 0xAC71, 0x743F, 0xAC72, 0x7440, + 0xAC73, 0x7442, 0xAC74, 0x7443, 0xAC75, 0x7444, 0xAC76, 0x7445, + 0xAC77, 0x7446, 0xAC78, 0x7447, 0xAC79, 0x7448, 0xAC7A, 0x7449, + 0xAC7B, 0x744A, 0xAC7C, 0x744B, 0xAC7D, 0x744C, 0xAC7E, 0x744D, + 0xAC80, 0x744E, 0xAC81, 0x744F, 0xAC82, 0x7450, 0xAC83, 0x7451, + 0xAC84, 0x7452, 0xAC85, 0x7453, 0xAC86, 0x7454, 0xAC87, 0x7456, + 0xAC88, 0x7458, 0xAC89, 0x745D, 0xAC8A, 0x7460, 0xAC8B, 0x7461, + 0xAC8C, 0x7462, 0xAC8D, 0x7463, 0xAC8E, 0x7464, 0xAC8F, 0x7465, + 0xAC90, 0x7466, 0xAC91, 0x7467, 0xAC92, 0x7468, 0xAC93, 0x7469, + 0xAC94, 0x746A, 0xAC95, 0x746B, 0xAC96, 0x746C, 0xAC97, 0x746E, + 0xAC98, 0x746F, 0xAC99, 0x7471, 0xAC9A, 0x7472, 0xAC9B, 0x7473, + 0xAC9C, 0x7474, 0xAC9D, 0x7475, 0xAC9E, 0x7478, 0xAC9F, 0x7479, + 0xACA0, 0x747A, 0xAD40, 0x747B, 0xAD41, 0x747C, 0xAD42, 0x747D, + 0xAD43, 0x747F, 0xAD44, 0x7482, 0xAD45, 0x7484, 0xAD46, 0x7485, + 0xAD47, 0x7486, 0xAD48, 0x7488, 0xAD49, 0x7489, 0xAD4A, 0x748A, + 0xAD4B, 0x748C, 0xAD4C, 0x748D, 0xAD4D, 0x748F, 0xAD4E, 0x7491, + 0xAD4F, 0x7492, 0xAD50, 0x7493, 0xAD51, 0x7494, 0xAD52, 0x7495, + 0xAD53, 0x7496, 0xAD54, 0x7497, 0xAD55, 0x7498, 0xAD56, 0x7499, + 0xAD57, 0x749A, 0xAD58, 0x749B, 0xAD59, 0x749D, 0xAD5A, 0x749F, + 0xAD5B, 0x74A0, 0xAD5C, 0x74A1, 0xAD5D, 0x74A2, 0xAD5E, 0x74A3, + 0xAD5F, 0x74A4, 0xAD60, 0x74A5, 0xAD61, 0x74A6, 0xAD62, 0x74AA, + 0xAD63, 0x74AB, 0xAD64, 0x74AC, 0xAD65, 0x74AD, 0xAD66, 0x74AE, + 0xAD67, 0x74AF, 0xAD68, 0x74B0, 0xAD69, 0x74B1, 0xAD6A, 0x74B2, + 0xAD6B, 0x74B3, 0xAD6C, 0x74B4, 0xAD6D, 0x74B5, 0xAD6E, 0x74B6, + 0xAD6F, 0x74B7, 0xAD70, 0x74B8, 0xAD71, 0x74B9, 0xAD72, 0x74BB, + 0xAD73, 0x74BC, 0xAD74, 0x74BD, 0xAD75, 0x74BE, 0xAD76, 0x74BF, + 0xAD77, 0x74C0, 0xAD78, 0x74C1, 0xAD79, 0x74C2, 0xAD7A, 0x74C3, + 0xAD7B, 0x74C4, 0xAD7C, 0x74C5, 0xAD7D, 0x74C6, 0xAD7E, 0x74C7, + 0xAD80, 0x74C8, 0xAD81, 0x74C9, 0xAD82, 0x74CA, 0xAD83, 0x74CB, + 0xAD84, 0x74CC, 0xAD85, 0x74CD, 0xAD86, 0x74CE, 0xAD87, 0x74CF, + 0xAD88, 0x74D0, 0xAD89, 0x74D1, 0xAD8A, 0x74D3, 0xAD8B, 0x74D4, + 0xAD8C, 0x74D5, 0xAD8D, 0x74D6, 0xAD8E, 0x74D7, 0xAD8F, 0x74D8, + 0xAD90, 0x74D9, 0xAD91, 0x74DA, 0xAD92, 0x74DB, 0xAD93, 0x74DD, + 0xAD94, 0x74DF, 0xAD95, 0x74E1, 0xAD96, 0x74E5, 0xAD97, 0x74E7, + 0xAD98, 0x74E8, 0xAD99, 0x74E9, 0xAD9A, 0x74EA, 0xAD9B, 0x74EB, + 0xAD9C, 0x74EC, 0xAD9D, 0x74ED, 0xAD9E, 0x74F0, 0xAD9F, 0x74F1, + 0xADA0, 0x74F2, 0xAE40, 0x74F3, 0xAE41, 0x74F5, 0xAE42, 0x74F8, + 0xAE43, 0x74F9, 0xAE44, 0x74FA, 0xAE45, 0x74FB, 0xAE46, 0x74FC, + 0xAE47, 0x74FD, 0xAE48, 0x74FE, 0xAE49, 0x7500, 0xAE4A, 0x7501, + 0xAE4B, 0x7502, 0xAE4C, 0x7503, 0xAE4D, 0x7505, 0xAE4E, 0x7506, + 0xAE4F, 0x7507, 0xAE50, 0x7508, 0xAE51, 0x7509, 0xAE52, 0x750A, + 0xAE53, 0x750B, 0xAE54, 0x750C, 0xAE55, 0x750E, 0xAE56, 0x7510, + 0xAE57, 0x7512, 0xAE58, 0x7514, 0xAE59, 0x7515, 0xAE5A, 0x7516, + 0xAE5B, 0x7517, 0xAE5C, 0x751B, 0xAE5D, 0x751D, 0xAE5E, 0x751E, + 0xAE5F, 0x7520, 0xAE60, 0x7521, 0xAE61, 0x7522, 0xAE62, 0x7523, + 0xAE63, 0x7524, 0xAE64, 0x7526, 0xAE65, 0x7527, 0xAE66, 0x752A, + 0xAE67, 0x752E, 0xAE68, 0x7534, 0xAE69, 0x7536, 0xAE6A, 0x7539, + 0xAE6B, 0x753C, 0xAE6C, 0x753D, 0xAE6D, 0x753F, 0xAE6E, 0x7541, + 0xAE6F, 0x7542, 0xAE70, 0x7543, 0xAE71, 0x7544, 0xAE72, 0x7546, + 0xAE73, 0x7547, 0xAE74, 0x7549, 0xAE75, 0x754A, 0xAE76, 0x754D, + 0xAE77, 0x7550, 0xAE78, 0x7551, 0xAE79, 0x7552, 0xAE7A, 0x7553, + 0xAE7B, 0x7555, 0xAE7C, 0x7556, 0xAE7D, 0x7557, 0xAE7E, 0x7558, + 0xAE80, 0x755D, 0xAE81, 0x755E, 0xAE82, 0x755F, 0xAE83, 0x7560, + 0xAE84, 0x7561, 0xAE85, 0x7562, 0xAE86, 0x7563, 0xAE87, 0x7564, + 0xAE88, 0x7567, 0xAE89, 0x7568, 0xAE8A, 0x7569, 0xAE8B, 0x756B, + 0xAE8C, 0x756C, 0xAE8D, 0x756D, 0xAE8E, 0x756E, 0xAE8F, 0x756F, + 0xAE90, 0x7570, 0xAE91, 0x7571, 0xAE92, 0x7573, 0xAE93, 0x7575, + 0xAE94, 0x7576, 0xAE95, 0x7577, 0xAE96, 0x757A, 0xAE97, 0x757B, + 0xAE98, 0x757C, 0xAE99, 0x757D, 0xAE9A, 0x757E, 0xAE9B, 0x7580, + 0xAE9C, 0x7581, 0xAE9D, 0x7582, 0xAE9E, 0x7584, 0xAE9F, 0x7585, + 0xAEA0, 0x7587, 0xAF40, 0x7588, 0xAF41, 0x7589, 0xAF42, 0x758A, + 0xAF43, 0x758C, 0xAF44, 0x758D, 0xAF45, 0x758E, 0xAF46, 0x7590, + 0xAF47, 0x7593, 0xAF48, 0x7595, 0xAF49, 0x7598, 0xAF4A, 0x759B, + 0xAF4B, 0x759C, 0xAF4C, 0x759E, 0xAF4D, 0x75A2, 0xAF4E, 0x75A6, + 0xAF4F, 0x75A7, 0xAF50, 0x75A8, 0xAF51, 0x75A9, 0xAF52, 0x75AA, + 0xAF53, 0x75AD, 0xAF54, 0x75B6, 0xAF55, 0x75B7, 0xAF56, 0x75BA, + 0xAF57, 0x75BB, 0xAF58, 0x75BF, 0xAF59, 0x75C0, 0xAF5A, 0x75C1, + 0xAF5B, 0x75C6, 0xAF5C, 0x75CB, 0xAF5D, 0x75CC, 0xAF5E, 0x75CE, + 0xAF5F, 0x75CF, 0xAF60, 0x75D0, 0xAF61, 0x75D1, 0xAF62, 0x75D3, + 0xAF63, 0x75D7, 0xAF64, 0x75D9, 0xAF65, 0x75DA, 0xAF66, 0x75DC, + 0xAF67, 0x75DD, 0xAF68, 0x75DF, 0xAF69, 0x75E0, 0xAF6A, 0x75E1, + 0xAF6B, 0x75E5, 0xAF6C, 0x75E9, 0xAF6D, 0x75EC, 0xAF6E, 0x75ED, + 0xAF6F, 0x75EE, 0xAF70, 0x75EF, 0xAF71, 0x75F2, 0xAF72, 0x75F3, + 0xAF73, 0x75F5, 0xAF74, 0x75F6, 0xAF75, 0x75F7, 0xAF76, 0x75F8, + 0xAF77, 0x75FA, 0xAF78, 0x75FB, 0xAF79, 0x75FD, 0xAF7A, 0x75FE, + 0xAF7B, 0x7602, 0xAF7C, 0x7604, 0xAF7D, 0x7606, 0xAF7E, 0x7607, + 0xAF80, 0x7608, 0xAF81, 0x7609, 0xAF82, 0x760B, 0xAF83, 0x760D, + 0xAF84, 0x760E, 0xAF85, 0x760F, 0xAF86, 0x7611, 0xAF87, 0x7612, + 0xAF88, 0x7613, 0xAF89, 0x7614, 0xAF8A, 0x7616, 0xAF8B, 0x761A, + 0xAF8C, 0x761C, 0xAF8D, 0x761D, 0xAF8E, 0x761E, 0xAF8F, 0x7621, + 0xAF90, 0x7623, 0xAF91, 0x7627, 0xAF92, 0x7628, 0xAF93, 0x762C, + 0xAF94, 0x762E, 0xAF95, 0x762F, 0xAF96, 0x7631, 0xAF97, 0x7632, + 0xAF98, 0x7636, 0xAF99, 0x7637, 0xAF9A, 0x7639, 0xAF9B, 0x763A, + 0xAF9C, 0x763B, 0xAF9D, 0x763D, 0xAF9E, 0x7641, 0xAF9F, 0x7642, + 0xAFA0, 0x7644, 0xB040, 0x7645, 0xB041, 0x7646, 0xB042, 0x7647, + 0xB043, 0x7648, 0xB044, 0x7649, 0xB045, 0x764A, 0xB046, 0x764B, + 0xB047, 0x764E, 0xB048, 0x764F, 0xB049, 0x7650, 0xB04A, 0x7651, + 0xB04B, 0x7652, 0xB04C, 0x7653, 0xB04D, 0x7655, 0xB04E, 0x7657, + 0xB04F, 0x7658, 0xB050, 0x7659, 0xB051, 0x765A, 0xB052, 0x765B, + 0xB053, 0x765D, 0xB054, 0x765F, 0xB055, 0x7660, 0xB056, 0x7661, + 0xB057, 0x7662, 0xB058, 0x7664, 0xB059, 0x7665, 0xB05A, 0x7666, + 0xB05B, 0x7667, 0xB05C, 0x7668, 0xB05D, 0x7669, 0xB05E, 0x766A, + 0xB05F, 0x766C, 0xB060, 0x766D, 0xB061, 0x766E, 0xB062, 0x7670, + 0xB063, 0x7671, 0xB064, 0x7672, 0xB065, 0x7673, 0xB066, 0x7674, + 0xB067, 0x7675, 0xB068, 0x7676, 0xB069, 0x7677, 0xB06A, 0x7679, + 0xB06B, 0x767A, 0xB06C, 0x767C, 0xB06D, 0x767F, 0xB06E, 0x7680, + 0xB06F, 0x7681, 0xB070, 0x7683, 0xB071, 0x7685, 0xB072, 0x7689, + 0xB073, 0x768A, 0xB074, 0x768C, 0xB075, 0x768D, 0xB076, 0x768F, + 0xB077, 0x7690, 0xB078, 0x7692, 0xB079, 0x7694, 0xB07A, 0x7695, + 0xB07B, 0x7697, 0xB07C, 0x7698, 0xB07D, 0x769A, 0xB07E, 0x769B, + 0xB080, 0x769C, 0xB081, 0x769D, 0xB082, 0x769E, 0xB083, 0x769F, + 0xB084, 0x76A0, 0xB085, 0x76A1, 0xB086, 0x76A2, 0xB087, 0x76A3, + 0xB088, 0x76A5, 0xB089, 0x76A6, 0xB08A, 0x76A7, 0xB08B, 0x76A8, + 0xB08C, 0x76A9, 0xB08D, 0x76AA, 0xB08E, 0x76AB, 0xB08F, 0x76AC, + 0xB090, 0x76AD, 0xB091, 0x76AF, 0xB092, 0x76B0, 0xB093, 0x76B3, + 0xB094, 0x76B5, 0xB095, 0x76B6, 0xB096, 0x76B7, 0xB097, 0x76B8, + 0xB098, 0x76B9, 0xB099, 0x76BA, 0xB09A, 0x76BB, 0xB09B, 0x76BC, + 0xB09C, 0x76BD, 0xB09D, 0x76BE, 0xB09E, 0x76C0, 0xB09F, 0x76C1, + 0xB0A0, 0x76C3, 0xB0A1, 0x554A, 0xB0A2, 0x963F, 0xB0A3, 0x57C3, + 0xB0A4, 0x6328, 0xB0A5, 0x54CE, 0xB0A6, 0x5509, 0xB0A7, 0x54C0, + 0xB0A8, 0x7691, 0xB0A9, 0x764C, 0xB0AA, 0x853C, 0xB0AB, 0x77EE, + 0xB0AC, 0x827E, 0xB0AD, 0x788D, 0xB0AE, 0x7231, 0xB0AF, 0x9698, + 0xB0B0, 0x978D, 0xB0B1, 0x6C28, 0xB0B2, 0x5B89, 0xB0B3, 0x4FFA, + 0xB0B4, 0x6309, 0xB0B5, 0x6697, 0xB0B6, 0x5CB8, 0xB0B7, 0x80FA, + 0xB0B8, 0x6848, 0xB0B9, 0x80AE, 0xB0BA, 0x6602, 0xB0BB, 0x76CE, + 0xB0BC, 0x51F9, 0xB0BD, 0x6556, 0xB0BE, 0x71AC, 0xB0BF, 0x7FF1, + 0xB0C0, 0x8884, 0xB0C1, 0x50B2, 0xB0C2, 0x5965, 0xB0C3, 0x61CA, + 0xB0C4, 0x6FB3, 0xB0C5, 0x82AD, 0xB0C6, 0x634C, 0xB0C7, 0x6252, + 0xB0C8, 0x53ED, 0xB0C9, 0x5427, 0xB0CA, 0x7B06, 0xB0CB, 0x516B, + 0xB0CC, 0x75A4, 0xB0CD, 0x5DF4, 0xB0CE, 0x62D4, 0xB0CF, 0x8DCB, + 0xB0D0, 0x9776, 0xB0D1, 0x628A, 0xB0D2, 0x8019, 0xB0D3, 0x575D, + 0xB0D4, 0x9738, 0xB0D5, 0x7F62, 0xB0D6, 0x7238, 0xB0D7, 0x767D, + 0xB0D8, 0x67CF, 0xB0D9, 0x767E, 0xB0DA, 0x6446, 0xB0DB, 0x4F70, + 0xB0DC, 0x8D25, 0xB0DD, 0x62DC, 0xB0DE, 0x7A17, 0xB0DF, 0x6591, + 0xB0E0, 0x73ED, 0xB0E1, 0x642C, 0xB0E2, 0x6273, 0xB0E3, 0x822C, + 0xB0E4, 0x9881, 0xB0E5, 0x677F, 0xB0E6, 0x7248, 0xB0E7, 0x626E, + 0xB0E8, 0x62CC, 0xB0E9, 0x4F34, 0xB0EA, 0x74E3, 0xB0EB, 0x534A, + 0xB0EC, 0x529E, 0xB0ED, 0x7ECA, 0xB0EE, 0x90A6, 0xB0EF, 0x5E2E, + 0xB0F0, 0x6886, 0xB0F1, 0x699C, 0xB0F2, 0x8180, 0xB0F3, 0x7ED1, + 0xB0F4, 0x68D2, 0xB0F5, 0x78C5, 0xB0F6, 0x868C, 0xB0F7, 0x9551, + 0xB0F8, 0x508D, 0xB0F9, 0x8C24, 0xB0FA, 0x82DE, 0xB0FB, 0x80DE, + 0xB0FC, 0x5305, 0xB0FD, 0x8912, 0xB0FE, 0x5265, 0xB140, 0x76C4, + 0xB141, 0x76C7, 0xB142, 0x76C9, 0xB143, 0x76CB, 0xB144, 0x76CC, + 0xB145, 0x76D3, 0xB146, 0x76D5, 0xB147, 0x76D9, 0xB148, 0x76DA, + 0xB149, 0x76DC, 0xB14A, 0x76DD, 0xB14B, 0x76DE, 0xB14C, 0x76E0, + 0xB14D, 0x76E1, 0xB14E, 0x76E2, 0xB14F, 0x76E3, 0xB150, 0x76E4, + 0xB151, 0x76E6, 0xB152, 0x76E7, 0xB153, 0x76E8, 0xB154, 0x76E9, + 0xB155, 0x76EA, 0xB156, 0x76EB, 0xB157, 0x76EC, 0xB158, 0x76ED, + 0xB159, 0x76F0, 0xB15A, 0x76F3, 0xB15B, 0x76F5, 0xB15C, 0x76F6, + 0xB15D, 0x76F7, 0xB15E, 0x76FA, 0xB15F, 0x76FB, 0xB160, 0x76FD, + 0xB161, 0x76FF, 0xB162, 0x7700, 0xB163, 0x7702, 0xB164, 0x7703, + 0xB165, 0x7705, 0xB166, 0x7706, 0xB167, 0x770A, 0xB168, 0x770C, + 0xB169, 0x770E, 0xB16A, 0x770F, 0xB16B, 0x7710, 0xB16C, 0x7711, + 0xB16D, 0x7712, 0xB16E, 0x7713, 0xB16F, 0x7714, 0xB170, 0x7715, + 0xB171, 0x7716, 0xB172, 0x7717, 0xB173, 0x7718, 0xB174, 0x771B, + 0xB175, 0x771C, 0xB176, 0x771D, 0xB177, 0x771E, 0xB178, 0x7721, + 0xB179, 0x7723, 0xB17A, 0x7724, 0xB17B, 0x7725, 0xB17C, 0x7727, + 0xB17D, 0x772A, 0xB17E, 0x772B, 0xB180, 0x772C, 0xB181, 0x772E, + 0xB182, 0x7730, 0xB183, 0x7731, 0xB184, 0x7732, 0xB185, 0x7733, + 0xB186, 0x7734, 0xB187, 0x7739, 0xB188, 0x773B, 0xB189, 0x773D, + 0xB18A, 0x773E, 0xB18B, 0x773F, 0xB18C, 0x7742, 0xB18D, 0x7744, + 0xB18E, 0x7745, 0xB18F, 0x7746, 0xB190, 0x7748, 0xB191, 0x7749, + 0xB192, 0x774A, 0xB193, 0x774B, 0xB194, 0x774C, 0xB195, 0x774D, + 0xB196, 0x774E, 0xB197, 0x774F, 0xB198, 0x7752, 0xB199, 0x7753, + 0xB19A, 0x7754, 0xB19B, 0x7755, 0xB19C, 0x7756, 0xB19D, 0x7757, + 0xB19E, 0x7758, 0xB19F, 0x7759, 0xB1A0, 0x775C, 0xB1A1, 0x8584, + 0xB1A2, 0x96F9, 0xB1A3, 0x4FDD, 0xB1A4, 0x5821, 0xB1A5, 0x9971, + 0xB1A6, 0x5B9D, 0xB1A7, 0x62B1, 0xB1A8, 0x62A5, 0xB1A9, 0x66B4, + 0xB1AA, 0x8C79, 0xB1AB, 0x9C8D, 0xB1AC, 0x7206, 0xB1AD, 0x676F, + 0xB1AE, 0x7891, 0xB1AF, 0x60B2, 0xB1B0, 0x5351, 0xB1B1, 0x5317, + 0xB1B2, 0x8F88, 0xB1B3, 0x80CC, 0xB1B4, 0x8D1D, 0xB1B5, 0x94A1, + 0xB1B6, 0x500D, 0xB1B7, 0x72C8, 0xB1B8, 0x5907, 0xB1B9, 0x60EB, + 0xB1BA, 0x7119, 0xB1BB, 0x88AB, 0xB1BC, 0x5954, 0xB1BD, 0x82EF, + 0xB1BE, 0x672C, 0xB1BF, 0x7B28, 0xB1C0, 0x5D29, 0xB1C1, 0x7EF7, + 0xB1C2, 0x752D, 0xB1C3, 0x6CF5, 0xB1C4, 0x8E66, 0xB1C5, 0x8FF8, + 0xB1C6, 0x903C, 0xB1C7, 0x9F3B, 0xB1C8, 0x6BD4, 0xB1C9, 0x9119, + 0xB1CA, 0x7B14, 0xB1CB, 0x5F7C, 0xB1CC, 0x78A7, 0xB1CD, 0x84D6, + 0xB1CE, 0x853D, 0xB1CF, 0x6BD5, 0xB1D0, 0x6BD9, 0xB1D1, 0x6BD6, + 0xB1D2, 0x5E01, 0xB1D3, 0x5E87, 0xB1D4, 0x75F9, 0xB1D5, 0x95ED, + 0xB1D6, 0x655D, 0xB1D7, 0x5F0A, 0xB1D8, 0x5FC5, 0xB1D9, 0x8F9F, + 0xB1DA, 0x58C1, 0xB1DB, 0x81C2, 0xB1DC, 0x907F, 0xB1DD, 0x965B, + 0xB1DE, 0x97AD, 0xB1DF, 0x8FB9, 0xB1E0, 0x7F16, 0xB1E1, 0x8D2C, + 0xB1E2, 0x6241, 0xB1E3, 0x4FBF, 0xB1E4, 0x53D8, 0xB1E5, 0x535E, + 0xB1E6, 0x8FA8, 0xB1E7, 0x8FA9, 0xB1E8, 0x8FAB, 0xB1E9, 0x904D, + 0xB1EA, 0x6807, 0xB1EB, 0x5F6A, 0xB1EC, 0x8198, 0xB1ED, 0x8868, + 0xB1EE, 0x9CD6, 0xB1EF, 0x618B, 0xB1F0, 0x522B, 0xB1F1, 0x762A, + 0xB1F2, 0x5F6C, 0xB1F3, 0x658C, 0xB1F4, 0x6FD2, 0xB1F5, 0x6EE8, + 0xB1F6, 0x5BBE, 0xB1F7, 0x6448, 0xB1F8, 0x5175, 0xB1F9, 0x51B0, + 0xB1FA, 0x67C4, 0xB1FB, 0x4E19, 0xB1FC, 0x79C9, 0xB1FD, 0x997C, + 0xB1FE, 0x70B3, 0xB240, 0x775D, 0xB241, 0x775E, 0xB242, 0x775F, + 0xB243, 0x7760, 0xB244, 0x7764, 0xB245, 0x7767, 0xB246, 0x7769, + 0xB247, 0x776A, 0xB248, 0x776D, 0xB249, 0x776E, 0xB24A, 0x776F, + 0xB24B, 0x7770, 0xB24C, 0x7771, 0xB24D, 0x7772, 0xB24E, 0x7773, + 0xB24F, 0x7774, 0xB250, 0x7775, 0xB251, 0x7776, 0xB252, 0x7777, + 0xB253, 0x7778, 0xB254, 0x777A, 0xB255, 0x777B, 0xB256, 0x777C, + 0xB257, 0x7781, 0xB258, 0x7782, 0xB259, 0x7783, 0xB25A, 0x7786, + 0xB25B, 0x7787, 0xB25C, 0x7788, 0xB25D, 0x7789, 0xB25E, 0x778A, + 0xB25F, 0x778B, 0xB260, 0x778F, 0xB261, 0x7790, 0xB262, 0x7793, + 0xB263, 0x7794, 0xB264, 0x7795, 0xB265, 0x7796, 0xB266, 0x7797, + 0xB267, 0x7798, 0xB268, 0x7799, 0xB269, 0x779A, 0xB26A, 0x779B, + 0xB26B, 0x779C, 0xB26C, 0x779D, 0xB26D, 0x779E, 0xB26E, 0x77A1, + 0xB26F, 0x77A3, 0xB270, 0x77A4, 0xB271, 0x77A6, 0xB272, 0x77A8, + 0xB273, 0x77AB, 0xB274, 0x77AD, 0xB275, 0x77AE, 0xB276, 0x77AF, + 0xB277, 0x77B1, 0xB278, 0x77B2, 0xB279, 0x77B4, 0xB27A, 0x77B6, + 0xB27B, 0x77B7, 0xB27C, 0x77B8, 0xB27D, 0x77B9, 0xB27E, 0x77BA, + 0xB280, 0x77BC, 0xB281, 0x77BE, 0xB282, 0x77C0, 0xB283, 0x77C1, + 0xB284, 0x77C2, 0xB285, 0x77C3, 0xB286, 0x77C4, 0xB287, 0x77C5, + 0xB288, 0x77C6, 0xB289, 0x77C7, 0xB28A, 0x77C8, 0xB28B, 0x77C9, + 0xB28C, 0x77CA, 0xB28D, 0x77CB, 0xB28E, 0x77CC, 0xB28F, 0x77CE, + 0xB290, 0x77CF, 0xB291, 0x77D0, 0xB292, 0x77D1, 0xB293, 0x77D2, + 0xB294, 0x77D3, 0xB295, 0x77D4, 0xB296, 0x77D5, 0xB297, 0x77D6, + 0xB298, 0x77D8, 0xB299, 0x77D9, 0xB29A, 0x77DA, 0xB29B, 0x77DD, + 0xB29C, 0x77DE, 0xB29D, 0x77DF, 0xB29E, 0x77E0, 0xB29F, 0x77E1, + 0xB2A0, 0x77E4, 0xB2A1, 0x75C5, 0xB2A2, 0x5E76, 0xB2A3, 0x73BB, + 0xB2A4, 0x83E0, 0xB2A5, 0x64AD, 0xB2A6, 0x62E8, 0xB2A7, 0x94B5, + 0xB2A8, 0x6CE2, 0xB2A9, 0x535A, 0xB2AA, 0x52C3, 0xB2AB, 0x640F, + 0xB2AC, 0x94C2, 0xB2AD, 0x7B94, 0xB2AE, 0x4F2F, 0xB2AF, 0x5E1B, + 0xB2B0, 0x8236, 0xB2B1, 0x8116, 0xB2B2, 0x818A, 0xB2B3, 0x6E24, + 0xB2B4, 0x6CCA, 0xB2B5, 0x9A73, 0xB2B6, 0x6355, 0xB2B7, 0x535C, + 0xB2B8, 0x54FA, 0xB2B9, 0x8865, 0xB2BA, 0x57E0, 0xB2BB, 0x4E0D, + 0xB2BC, 0x5E03, 0xB2BD, 0x6B65, 0xB2BE, 0x7C3F, 0xB2BF, 0x90E8, + 0xB2C0, 0x6016, 0xB2C1, 0x64E6, 0xB2C2, 0x731C, 0xB2C3, 0x88C1, + 0xB2C4, 0x6750, 0xB2C5, 0x624D, 0xB2C6, 0x8D22, 0xB2C7, 0x776C, + 0xB2C8, 0x8E29, 0xB2C9, 0x91C7, 0xB2CA, 0x5F69, 0xB2CB, 0x83DC, + 0xB2CC, 0x8521, 0xB2CD, 0x9910, 0xB2CE, 0x53C2, 0xB2CF, 0x8695, + 0xB2D0, 0x6B8B, 0xB2D1, 0x60ED, 0xB2D2, 0x60E8, 0xB2D3, 0x707F, + 0xB2D4, 0x82CD, 0xB2D5, 0x8231, 0xB2D6, 0x4ED3, 0xB2D7, 0x6CA7, + 0xB2D8, 0x85CF, 0xB2D9, 0x64CD, 0xB2DA, 0x7CD9, 0xB2DB, 0x69FD, + 0xB2DC, 0x66F9, 0xB2DD, 0x8349, 0xB2DE, 0x5395, 0xB2DF, 0x7B56, + 0xB2E0, 0x4FA7, 0xB2E1, 0x518C, 0xB2E2, 0x6D4B, 0xB2E3, 0x5C42, + 0xB2E4, 0x8E6D, 0xB2E5, 0x63D2, 0xB2E6, 0x53C9, 0xB2E7, 0x832C, + 0xB2E8, 0x8336, 0xB2E9, 0x67E5, 0xB2EA, 0x78B4, 0xB2EB, 0x643D, + 0xB2EC, 0x5BDF, 0xB2ED, 0x5C94, 0xB2EE, 0x5DEE, 0xB2EF, 0x8BE7, + 0xB2F0, 0x62C6, 0xB2F1, 0x67F4, 0xB2F2, 0x8C7A, 0xB2F3, 0x6400, + 0xB2F4, 0x63BA, 0xB2F5, 0x8749, 0xB2F6, 0x998B, 0xB2F7, 0x8C17, + 0xB2F8, 0x7F20, 0xB2F9, 0x94F2, 0xB2FA, 0x4EA7, 0xB2FB, 0x9610, + 0xB2FC, 0x98A4, 0xB2FD, 0x660C, 0xB2FE, 0x7316, 0xB340, 0x77E6, + 0xB341, 0x77E8, 0xB342, 0x77EA, 0xB343, 0x77EF, 0xB344, 0x77F0, + 0xB345, 0x77F1, 0xB346, 0x77F2, 0xB347, 0x77F4, 0xB348, 0x77F5, + 0xB349, 0x77F7, 0xB34A, 0x77F9, 0xB34B, 0x77FA, 0xB34C, 0x77FB, + 0xB34D, 0x77FC, 0xB34E, 0x7803, 0xB34F, 0x7804, 0xB350, 0x7805, + 0xB351, 0x7806, 0xB352, 0x7807, 0xB353, 0x7808, 0xB354, 0x780A, + 0xB355, 0x780B, 0xB356, 0x780E, 0xB357, 0x780F, 0xB358, 0x7810, + 0xB359, 0x7813, 0xB35A, 0x7815, 0xB35B, 0x7819, 0xB35C, 0x781B, + 0xB35D, 0x781E, 0xB35E, 0x7820, 0xB35F, 0x7821, 0xB360, 0x7822, + 0xB361, 0x7824, 0xB362, 0x7828, 0xB363, 0x782A, 0xB364, 0x782B, + 0xB365, 0x782E, 0xB366, 0x782F, 0xB367, 0x7831, 0xB368, 0x7832, + 0xB369, 0x7833, 0xB36A, 0x7835, 0xB36B, 0x7836, 0xB36C, 0x783D, + 0xB36D, 0x783F, 0xB36E, 0x7841, 0xB36F, 0x7842, 0xB370, 0x7843, + 0xB371, 0x7844, 0xB372, 0x7846, 0xB373, 0x7848, 0xB374, 0x7849, + 0xB375, 0x784A, 0xB376, 0x784B, 0xB377, 0x784D, 0xB378, 0x784F, + 0xB379, 0x7851, 0xB37A, 0x7853, 0xB37B, 0x7854, 0xB37C, 0x7858, + 0xB37D, 0x7859, 0xB37E, 0x785A, 0xB380, 0x785B, 0xB381, 0x785C, + 0xB382, 0x785E, 0xB383, 0x785F, 0xB384, 0x7860, 0xB385, 0x7861, + 0xB386, 0x7862, 0xB387, 0x7863, 0xB388, 0x7864, 0xB389, 0x7865, + 0xB38A, 0x7866, 0xB38B, 0x7867, 0xB38C, 0x7868, 0xB38D, 0x7869, + 0xB38E, 0x786F, 0xB38F, 0x7870, 0xB390, 0x7871, 0xB391, 0x7872, + 0xB392, 0x7873, 0xB393, 0x7874, 0xB394, 0x7875, 0xB395, 0x7876, + 0xB396, 0x7878, 0xB397, 0x7879, 0xB398, 0x787A, 0xB399, 0x787B, + 0xB39A, 0x787D, 0xB39B, 0x787E, 0xB39C, 0x787F, 0xB39D, 0x7880, + 0xB39E, 0x7881, 0xB39F, 0x7882, 0xB3A0, 0x7883, 0xB3A1, 0x573A, + 0xB3A2, 0x5C1D, 0xB3A3, 0x5E38, 0xB3A4, 0x957F, 0xB3A5, 0x507F, + 0xB3A6, 0x80A0, 0xB3A7, 0x5382, 0xB3A8, 0x655E, 0xB3A9, 0x7545, + 0xB3AA, 0x5531, 0xB3AB, 0x5021, 0xB3AC, 0x8D85, 0xB3AD, 0x6284, + 0xB3AE, 0x949E, 0xB3AF, 0x671D, 0xB3B0, 0x5632, 0xB3B1, 0x6F6E, + 0xB3B2, 0x5DE2, 0xB3B3, 0x5435, 0xB3B4, 0x7092, 0xB3B5, 0x8F66, + 0xB3B6, 0x626F, 0xB3B7, 0x64A4, 0xB3B8, 0x63A3, 0xB3B9, 0x5F7B, + 0xB3BA, 0x6F88, 0xB3BB, 0x90F4, 0xB3BC, 0x81E3, 0xB3BD, 0x8FB0, + 0xB3BE, 0x5C18, 0xB3BF, 0x6668, 0xB3C0, 0x5FF1, 0xB3C1, 0x6C89, + 0xB3C2, 0x9648, 0xB3C3, 0x8D81, 0xB3C4, 0x886C, 0xB3C5, 0x6491, + 0xB3C6, 0x79F0, 0xB3C7, 0x57CE, 0xB3C8, 0x6A59, 0xB3C9, 0x6210, + 0xB3CA, 0x5448, 0xB3CB, 0x4E58, 0xB3CC, 0x7A0B, 0xB3CD, 0x60E9, + 0xB3CE, 0x6F84, 0xB3CF, 0x8BDA, 0xB3D0, 0x627F, 0xB3D1, 0x901E, + 0xB3D2, 0x9A8B, 0xB3D3, 0x79E4, 0xB3D4, 0x5403, 0xB3D5, 0x75F4, + 0xB3D6, 0x6301, 0xB3D7, 0x5319, 0xB3D8, 0x6C60, 0xB3D9, 0x8FDF, + 0xB3DA, 0x5F1B, 0xB3DB, 0x9A70, 0xB3DC, 0x803B, 0xB3DD, 0x9F7F, + 0xB3DE, 0x4F88, 0xB3DF, 0x5C3A, 0xB3E0, 0x8D64, 0xB3E1, 0x7FC5, + 0xB3E2, 0x65A5, 0xB3E3, 0x70BD, 0xB3E4, 0x5145, 0xB3E5, 0x51B2, + 0xB3E6, 0x866B, 0xB3E7, 0x5D07, 0xB3E8, 0x5BA0, 0xB3E9, 0x62BD, + 0xB3EA, 0x916C, 0xB3EB, 0x7574, 0xB3EC, 0x8E0C, 0xB3ED, 0x7A20, + 0xB3EE, 0x6101, 0xB3EF, 0x7B79, 0xB3F0, 0x4EC7, 0xB3F1, 0x7EF8, + 0xB3F2, 0x7785, 0xB3F3, 0x4E11, 0xB3F4, 0x81ED, 0xB3F5, 0x521D, + 0xB3F6, 0x51FA, 0xB3F7, 0x6A71, 0xB3F8, 0x53A8, 0xB3F9, 0x8E87, + 0xB3FA, 0x9504, 0xB3FB, 0x96CF, 0xB3FC, 0x6EC1, 0xB3FD, 0x9664, + 0xB3FE, 0x695A, 0xB440, 0x7884, 0xB441, 0x7885, 0xB442, 0x7886, + 0xB443, 0x7888, 0xB444, 0x788A, 0xB445, 0x788B, 0xB446, 0x788F, + 0xB447, 0x7890, 0xB448, 0x7892, 0xB449, 0x7894, 0xB44A, 0x7895, + 0xB44B, 0x7896, 0xB44C, 0x7899, 0xB44D, 0x789D, 0xB44E, 0x789E, + 0xB44F, 0x78A0, 0xB450, 0x78A2, 0xB451, 0x78A4, 0xB452, 0x78A6, + 0xB453, 0x78A8, 0xB454, 0x78A9, 0xB455, 0x78AA, 0xB456, 0x78AB, + 0xB457, 0x78AC, 0xB458, 0x78AD, 0xB459, 0x78AE, 0xB45A, 0x78AF, + 0xB45B, 0x78B5, 0xB45C, 0x78B6, 0xB45D, 0x78B7, 0xB45E, 0x78B8, + 0xB45F, 0x78BA, 0xB460, 0x78BB, 0xB461, 0x78BC, 0xB462, 0x78BD, + 0xB463, 0x78BF, 0xB464, 0x78C0, 0xB465, 0x78C2, 0xB466, 0x78C3, + 0xB467, 0x78C4, 0xB468, 0x78C6, 0xB469, 0x78C7, 0xB46A, 0x78C8, + 0xB46B, 0x78CC, 0xB46C, 0x78CD, 0xB46D, 0x78CE, 0xB46E, 0x78CF, + 0xB46F, 0x78D1, 0xB470, 0x78D2, 0xB471, 0x78D3, 0xB472, 0x78D6, + 0xB473, 0x78D7, 0xB474, 0x78D8, 0xB475, 0x78DA, 0xB476, 0x78DB, + 0xB477, 0x78DC, 0xB478, 0x78DD, 0xB479, 0x78DE, 0xB47A, 0x78DF, + 0xB47B, 0x78E0, 0xB47C, 0x78E1, 0xB47D, 0x78E2, 0xB47E, 0x78E3, + 0xB480, 0x78E4, 0xB481, 0x78E5, 0xB482, 0x78E6, 0xB483, 0x78E7, + 0xB484, 0x78E9, 0xB485, 0x78EA, 0xB486, 0x78EB, 0xB487, 0x78ED, + 0xB488, 0x78EE, 0xB489, 0x78EF, 0xB48A, 0x78F0, 0xB48B, 0x78F1, + 0xB48C, 0x78F3, 0xB48D, 0x78F5, 0xB48E, 0x78F6, 0xB48F, 0x78F8, + 0xB490, 0x78F9, 0xB491, 0x78FB, 0xB492, 0x78FC, 0xB493, 0x78FD, + 0xB494, 0x78FE, 0xB495, 0x78FF, 0xB496, 0x7900, 0xB497, 0x7902, + 0xB498, 0x7903, 0xB499, 0x7904, 0xB49A, 0x7906, 0xB49B, 0x7907, + 0xB49C, 0x7908, 0xB49D, 0x7909, 0xB49E, 0x790A, 0xB49F, 0x790B, + 0xB4A0, 0x790C, 0xB4A1, 0x7840, 0xB4A2, 0x50A8, 0xB4A3, 0x77D7, + 0xB4A4, 0x6410, 0xB4A5, 0x89E6, 0xB4A6, 0x5904, 0xB4A7, 0x63E3, + 0xB4A8, 0x5DDD, 0xB4A9, 0x7A7F, 0xB4AA, 0x693D, 0xB4AB, 0x4F20, + 0xB4AC, 0x8239, 0xB4AD, 0x5598, 0xB4AE, 0x4E32, 0xB4AF, 0x75AE, + 0xB4B0, 0x7A97, 0xB4B1, 0x5E62, 0xB4B2, 0x5E8A, 0xB4B3, 0x95EF, + 0xB4B4, 0x521B, 0xB4B5, 0x5439, 0xB4B6, 0x708A, 0xB4B7, 0x6376, + 0xB4B8, 0x9524, 0xB4B9, 0x5782, 0xB4BA, 0x6625, 0xB4BB, 0x693F, + 0xB4BC, 0x9187, 0xB4BD, 0x5507, 0xB4BE, 0x6DF3, 0xB4BF, 0x7EAF, + 0xB4C0, 0x8822, 0xB4C1, 0x6233, 0xB4C2, 0x7EF0, 0xB4C3, 0x75B5, + 0xB4C4, 0x8328, 0xB4C5, 0x78C1, 0xB4C6, 0x96CC, 0xB4C7, 0x8F9E, + 0xB4C8, 0x6148, 0xB4C9, 0x74F7, 0xB4CA, 0x8BCD, 0xB4CB, 0x6B64, + 0xB4CC, 0x523A, 0xB4CD, 0x8D50, 0xB4CE, 0x6B21, 0xB4CF, 0x806A, + 0xB4D0, 0x8471, 0xB4D1, 0x56F1, 0xB4D2, 0x5306, 0xB4D3, 0x4ECE, + 0xB4D4, 0x4E1B, 0xB4D5, 0x51D1, 0xB4D6, 0x7C97, 0xB4D7, 0x918B, + 0xB4D8, 0x7C07, 0xB4D9, 0x4FC3, 0xB4DA, 0x8E7F, 0xB4DB, 0x7BE1, + 0xB4DC, 0x7A9C, 0xB4DD, 0x6467, 0xB4DE, 0x5D14, 0xB4DF, 0x50AC, + 0xB4E0, 0x8106, 0xB4E1, 0x7601, 0xB4E2, 0x7CB9, 0xB4E3, 0x6DEC, + 0xB4E4, 0x7FE0, 0xB4E5, 0x6751, 0xB4E6, 0x5B58, 0xB4E7, 0x5BF8, + 0xB4E8, 0x78CB, 0xB4E9, 0x64AE, 0xB4EA, 0x6413, 0xB4EB, 0x63AA, + 0xB4EC, 0x632B, 0xB4ED, 0x9519, 0xB4EE, 0x642D, 0xB4EF, 0x8FBE, + 0xB4F0, 0x7B54, 0xB4F1, 0x7629, 0xB4F2, 0x6253, 0xB4F3, 0x5927, + 0xB4F4, 0x5446, 0xB4F5, 0x6B79, 0xB4F6, 0x50A3, 0xB4F7, 0x6234, + 0xB4F8, 0x5E26, 0xB4F9, 0x6B86, 0xB4FA, 0x4EE3, 0xB4FB, 0x8D37, + 0xB4FC, 0x888B, 0xB4FD, 0x5F85, 0xB4FE, 0x902E, 0xB540, 0x790D, + 0xB541, 0x790E, 0xB542, 0x790F, 0xB543, 0x7910, 0xB544, 0x7911, + 0xB545, 0x7912, 0xB546, 0x7914, 0xB547, 0x7915, 0xB548, 0x7916, + 0xB549, 0x7917, 0xB54A, 0x7918, 0xB54B, 0x7919, 0xB54C, 0x791A, + 0xB54D, 0x791B, 0xB54E, 0x791C, 0xB54F, 0x791D, 0xB550, 0x791F, + 0xB551, 0x7920, 0xB552, 0x7921, 0xB553, 0x7922, 0xB554, 0x7923, + 0xB555, 0x7925, 0xB556, 0x7926, 0xB557, 0x7927, 0xB558, 0x7928, + 0xB559, 0x7929, 0xB55A, 0x792A, 0xB55B, 0x792B, 0xB55C, 0x792C, + 0xB55D, 0x792D, 0xB55E, 0x792E, 0xB55F, 0x792F, 0xB560, 0x7930, + 0xB561, 0x7931, 0xB562, 0x7932, 0xB563, 0x7933, 0xB564, 0x7935, + 0xB565, 0x7936, 0xB566, 0x7937, 0xB567, 0x7938, 0xB568, 0x7939, + 0xB569, 0x793D, 0xB56A, 0x793F, 0xB56B, 0x7942, 0xB56C, 0x7943, + 0xB56D, 0x7944, 0xB56E, 0x7945, 0xB56F, 0x7947, 0xB570, 0x794A, + 0xB571, 0x794B, 0xB572, 0x794C, 0xB573, 0x794D, 0xB574, 0x794E, + 0xB575, 0x794F, 0xB576, 0x7950, 0xB577, 0x7951, 0xB578, 0x7952, + 0xB579, 0x7954, 0xB57A, 0x7955, 0xB57B, 0x7958, 0xB57C, 0x7959, + 0xB57D, 0x7961, 0xB57E, 0x7963, 0xB580, 0x7964, 0xB581, 0x7966, + 0xB582, 0x7969, 0xB583, 0x796A, 0xB584, 0x796B, 0xB585, 0x796C, + 0xB586, 0x796E, 0xB587, 0x7970, 0xB588, 0x7971, 0xB589, 0x7972, + 0xB58A, 0x7973, 0xB58B, 0x7974, 0xB58C, 0x7975, 0xB58D, 0x7976, + 0xB58E, 0x7979, 0xB58F, 0x797B, 0xB590, 0x797C, 0xB591, 0x797D, + 0xB592, 0x797E, 0xB593, 0x797F, 0xB594, 0x7982, 0xB595, 0x7983, + 0xB596, 0x7986, 0xB597, 0x7987, 0xB598, 0x7988, 0xB599, 0x7989, + 0xB59A, 0x798B, 0xB59B, 0x798C, 0xB59C, 0x798D, 0xB59D, 0x798E, + 0xB59E, 0x7990, 0xB59F, 0x7991, 0xB5A0, 0x7992, 0xB5A1, 0x6020, + 0xB5A2, 0x803D, 0xB5A3, 0x62C5, 0xB5A4, 0x4E39, 0xB5A5, 0x5355, + 0xB5A6, 0x90F8, 0xB5A7, 0x63B8, 0xB5A8, 0x80C6, 0xB5A9, 0x65E6, + 0xB5AA, 0x6C2E, 0xB5AB, 0x4F46, 0xB5AC, 0x60EE, 0xB5AD, 0x6DE1, + 0xB5AE, 0x8BDE, 0xB5AF, 0x5F39, 0xB5B0, 0x86CB, 0xB5B1, 0x5F53, + 0xB5B2, 0x6321, 0xB5B3, 0x515A, 0xB5B4, 0x8361, 0xB5B5, 0x6863, + 0xB5B6, 0x5200, 0xB5B7, 0x6363, 0xB5B8, 0x8E48, 0xB5B9, 0x5012, + 0xB5BA, 0x5C9B, 0xB5BB, 0x7977, 0xB5BC, 0x5BFC, 0xB5BD, 0x5230, + 0xB5BE, 0x7A3B, 0xB5BF, 0x60BC, 0xB5C0, 0x9053, 0xB5C1, 0x76D7, + 0xB5C2, 0x5FB7, 0xB5C3, 0x5F97, 0xB5C4, 0x7684, 0xB5C5, 0x8E6C, + 0xB5C6, 0x706F, 0xB5C7, 0x767B, 0xB5C8, 0x7B49, 0xB5C9, 0x77AA, + 0xB5CA, 0x51F3, 0xB5CB, 0x9093, 0xB5CC, 0x5824, 0xB5CD, 0x4F4E, + 0xB5CE, 0x6EF4, 0xB5CF, 0x8FEA, 0xB5D0, 0x654C, 0xB5D1, 0x7B1B, + 0xB5D2, 0x72C4, 0xB5D3, 0x6DA4, 0xB5D4, 0x7FDF, 0xB5D5, 0x5AE1, + 0xB5D6, 0x62B5, 0xB5D7, 0x5E95, 0xB5D8, 0x5730, 0xB5D9, 0x8482, + 0xB5DA, 0x7B2C, 0xB5DB, 0x5E1D, 0xB5DC, 0x5F1F, 0xB5DD, 0x9012, + 0xB5DE, 0x7F14, 0xB5DF, 0x98A0, 0xB5E0, 0x6382, 0xB5E1, 0x6EC7, + 0xB5E2, 0x7898, 0xB5E3, 0x70B9, 0xB5E4, 0x5178, 0xB5E5, 0x975B, + 0xB5E6, 0x57AB, 0xB5E7, 0x7535, 0xB5E8, 0x4F43, 0xB5E9, 0x7538, + 0xB5EA, 0x5E97, 0xB5EB, 0x60E6, 0xB5EC, 0x5960, 0xB5ED, 0x6DC0, + 0xB5EE, 0x6BBF, 0xB5EF, 0x7889, 0xB5F0, 0x53FC, 0xB5F1, 0x96D5, + 0xB5F2, 0x51CB, 0xB5F3, 0x5201, 0xB5F4, 0x6389, 0xB5F5, 0x540A, + 0xB5F6, 0x9493, 0xB5F7, 0x8C03, 0xB5F8, 0x8DCC, 0xB5F9, 0x7239, + 0xB5FA, 0x789F, 0xB5FB, 0x8776, 0xB5FC, 0x8FED, 0xB5FD, 0x8C0D, + 0xB5FE, 0x53E0, 0xB640, 0x7993, 0xB641, 0x7994, 0xB642, 0x7995, + 0xB643, 0x7996, 0xB644, 0x7997, 0xB645, 0x7998, 0xB646, 0x7999, + 0xB647, 0x799B, 0xB648, 0x799C, 0xB649, 0x799D, 0xB64A, 0x799E, + 0xB64B, 0x799F, 0xB64C, 0x79A0, 0xB64D, 0x79A1, 0xB64E, 0x79A2, + 0xB64F, 0x79A3, 0xB650, 0x79A4, 0xB651, 0x79A5, 0xB652, 0x79A6, + 0xB653, 0x79A8, 0xB654, 0x79A9, 0xB655, 0x79AA, 0xB656, 0x79AB, + 0xB657, 0x79AC, 0xB658, 0x79AD, 0xB659, 0x79AE, 0xB65A, 0x79AF, + 0xB65B, 0x79B0, 0xB65C, 0x79B1, 0xB65D, 0x79B2, 0xB65E, 0x79B4, + 0xB65F, 0x79B5, 0xB660, 0x79B6, 0xB661, 0x79B7, 0xB662, 0x79B8, + 0xB663, 0x79BC, 0xB664, 0x79BF, 0xB665, 0x79C2, 0xB666, 0x79C4, + 0xB667, 0x79C5, 0xB668, 0x79C7, 0xB669, 0x79C8, 0xB66A, 0x79CA, + 0xB66B, 0x79CC, 0xB66C, 0x79CE, 0xB66D, 0x79CF, 0xB66E, 0x79D0, + 0xB66F, 0x79D3, 0xB670, 0x79D4, 0xB671, 0x79D6, 0xB672, 0x79D7, + 0xB673, 0x79D9, 0xB674, 0x79DA, 0xB675, 0x79DB, 0xB676, 0x79DC, + 0xB677, 0x79DD, 0xB678, 0x79DE, 0xB679, 0x79E0, 0xB67A, 0x79E1, + 0xB67B, 0x79E2, 0xB67C, 0x79E5, 0xB67D, 0x79E8, 0xB67E, 0x79EA, + 0xB680, 0x79EC, 0xB681, 0x79EE, 0xB682, 0x79F1, 0xB683, 0x79F2, + 0xB684, 0x79F3, 0xB685, 0x79F4, 0xB686, 0x79F5, 0xB687, 0x79F6, + 0xB688, 0x79F7, 0xB689, 0x79F9, 0xB68A, 0x79FA, 0xB68B, 0x79FC, + 0xB68C, 0x79FE, 0xB68D, 0x79FF, 0xB68E, 0x7A01, 0xB68F, 0x7A04, + 0xB690, 0x7A05, 0xB691, 0x7A07, 0xB692, 0x7A08, 0xB693, 0x7A09, + 0xB694, 0x7A0A, 0xB695, 0x7A0C, 0xB696, 0x7A0F, 0xB697, 0x7A10, + 0xB698, 0x7A11, 0xB699, 0x7A12, 0xB69A, 0x7A13, 0xB69B, 0x7A15, + 0xB69C, 0x7A16, 0xB69D, 0x7A18, 0xB69E, 0x7A19, 0xB69F, 0x7A1B, + 0xB6A0, 0x7A1C, 0xB6A1, 0x4E01, 0xB6A2, 0x76EF, 0xB6A3, 0x53EE, + 0xB6A4, 0x9489, 0xB6A5, 0x9876, 0xB6A6, 0x9F0E, 0xB6A7, 0x952D, + 0xB6A8, 0x5B9A, 0xB6A9, 0x8BA2, 0xB6AA, 0x4E22, 0xB6AB, 0x4E1C, + 0xB6AC, 0x51AC, 0xB6AD, 0x8463, 0xB6AE, 0x61C2, 0xB6AF, 0x52A8, + 0xB6B0, 0x680B, 0xB6B1, 0x4F97, 0xB6B2, 0x606B, 0xB6B3, 0x51BB, + 0xB6B4, 0x6D1E, 0xB6B5, 0x515C, 0xB6B6, 0x6296, 0xB6B7, 0x6597, + 0xB6B8, 0x9661, 0xB6B9, 0x8C46, 0xB6BA, 0x9017, 0xB6BB, 0x75D8, + 0xB6BC, 0x90FD, 0xB6BD, 0x7763, 0xB6BE, 0x6BD2, 0xB6BF, 0x728A, + 0xB6C0, 0x72EC, 0xB6C1, 0x8BFB, 0xB6C2, 0x5835, 0xB6C3, 0x7779, + 0xB6C4, 0x8D4C, 0xB6C5, 0x675C, 0xB6C6, 0x9540, 0xB6C7, 0x809A, + 0xB6C8, 0x5EA6, 0xB6C9, 0x6E21, 0xB6CA, 0x5992, 0xB6CB, 0x7AEF, + 0xB6CC, 0x77ED, 0xB6CD, 0x953B, 0xB6CE, 0x6BB5, 0xB6CF, 0x65AD, + 0xB6D0, 0x7F0E, 0xB6D1, 0x5806, 0xB6D2, 0x5151, 0xB6D3, 0x961F, + 0xB6D4, 0x5BF9, 0xB6D5, 0x58A9, 0xB6D6, 0x5428, 0xB6D7, 0x8E72, + 0xB6D8, 0x6566, 0xB6D9, 0x987F, 0xB6DA, 0x56E4, 0xB6DB, 0x949D, + 0xB6DC, 0x76FE, 0xB6DD, 0x9041, 0xB6DE, 0x6387, 0xB6DF, 0x54C6, + 0xB6E0, 0x591A, 0xB6E1, 0x593A, 0xB6E2, 0x579B, 0xB6E3, 0x8EB2, + 0xB6E4, 0x6735, 0xB6E5, 0x8DFA, 0xB6E6, 0x8235, 0xB6E7, 0x5241, + 0xB6E8, 0x60F0, 0xB6E9, 0x5815, 0xB6EA, 0x86FE, 0xB6EB, 0x5CE8, + 0xB6EC, 0x9E45, 0xB6ED, 0x4FC4, 0xB6EE, 0x989D, 0xB6EF, 0x8BB9, + 0xB6F0, 0x5A25, 0xB6F1, 0x6076, 0xB6F2, 0x5384, 0xB6F3, 0x627C, + 0xB6F4, 0x904F, 0xB6F5, 0x9102, 0xB6F6, 0x997F, 0xB6F7, 0x6069, + 0xB6F8, 0x800C, 0xB6F9, 0x513F, 0xB6FA, 0x8033, 0xB6FB, 0x5C14, + 0xB6FC, 0x9975, 0xB6FD, 0x6D31, 0xB6FE, 0x4E8C, 0xB740, 0x7A1D, + 0xB741, 0x7A1F, 0xB742, 0x7A21, 0xB743, 0x7A22, 0xB744, 0x7A24, + 0xB745, 0x7A25, 0xB746, 0x7A26, 0xB747, 0x7A27, 0xB748, 0x7A28, + 0xB749, 0x7A29, 0xB74A, 0x7A2A, 0xB74B, 0x7A2B, 0xB74C, 0x7A2C, + 0xB74D, 0x7A2D, 0xB74E, 0x7A2E, 0xB74F, 0x7A2F, 0xB750, 0x7A30, + 0xB751, 0x7A31, 0xB752, 0x7A32, 0xB753, 0x7A34, 0xB754, 0x7A35, + 0xB755, 0x7A36, 0xB756, 0x7A38, 0xB757, 0x7A3A, 0xB758, 0x7A3E, + 0xB759, 0x7A40, 0xB75A, 0x7A41, 0xB75B, 0x7A42, 0xB75C, 0x7A43, + 0xB75D, 0x7A44, 0xB75E, 0x7A45, 0xB75F, 0x7A47, 0xB760, 0x7A48, + 0xB761, 0x7A49, 0xB762, 0x7A4A, 0xB763, 0x7A4B, 0xB764, 0x7A4C, + 0xB765, 0x7A4D, 0xB766, 0x7A4E, 0xB767, 0x7A4F, 0xB768, 0x7A50, + 0xB769, 0x7A52, 0xB76A, 0x7A53, 0xB76B, 0x7A54, 0xB76C, 0x7A55, + 0xB76D, 0x7A56, 0xB76E, 0x7A58, 0xB76F, 0x7A59, 0xB770, 0x7A5A, + 0xB771, 0x7A5B, 0xB772, 0x7A5C, 0xB773, 0x7A5D, 0xB774, 0x7A5E, + 0xB775, 0x7A5F, 0xB776, 0x7A60, 0xB777, 0x7A61, 0xB778, 0x7A62, + 0xB779, 0x7A63, 0xB77A, 0x7A64, 0xB77B, 0x7A65, 0xB77C, 0x7A66, + 0xB77D, 0x7A67, 0xB77E, 0x7A68, 0xB780, 0x7A69, 0xB781, 0x7A6A, + 0xB782, 0x7A6B, 0xB783, 0x7A6C, 0xB784, 0x7A6D, 0xB785, 0x7A6E, + 0xB786, 0x7A6F, 0xB787, 0x7A71, 0xB788, 0x7A72, 0xB789, 0x7A73, + 0xB78A, 0x7A75, 0xB78B, 0x7A7B, 0xB78C, 0x7A7C, 0xB78D, 0x7A7D, + 0xB78E, 0x7A7E, 0xB78F, 0x7A82, 0xB790, 0x7A85, 0xB791, 0x7A87, + 0xB792, 0x7A89, 0xB793, 0x7A8A, 0xB794, 0x7A8B, 0xB795, 0x7A8C, + 0xB796, 0x7A8E, 0xB797, 0x7A8F, 0xB798, 0x7A90, 0xB799, 0x7A93, + 0xB79A, 0x7A94, 0xB79B, 0x7A99, 0xB79C, 0x7A9A, 0xB79D, 0x7A9B, + 0xB79E, 0x7A9E, 0xB79F, 0x7AA1, 0xB7A0, 0x7AA2, 0xB7A1, 0x8D30, + 0xB7A2, 0x53D1, 0xB7A3, 0x7F5A, 0xB7A4, 0x7B4F, 0xB7A5, 0x4F10, + 0xB7A6, 0x4E4F, 0xB7A7, 0x9600, 0xB7A8, 0x6CD5, 0xB7A9, 0x73D0, + 0xB7AA, 0x85E9, 0xB7AB, 0x5E06, 0xB7AC, 0x756A, 0xB7AD, 0x7FFB, + 0xB7AE, 0x6A0A, 0xB7AF, 0x77FE, 0xB7B0, 0x9492, 0xB7B1, 0x7E41, + 0xB7B2, 0x51E1, 0xB7B3, 0x70E6, 0xB7B4, 0x53CD, 0xB7B5, 0x8FD4, + 0xB7B6, 0x8303, 0xB7B7, 0x8D29, 0xB7B8, 0x72AF, 0xB7B9, 0x996D, + 0xB7BA, 0x6CDB, 0xB7BB, 0x574A, 0xB7BC, 0x82B3, 0xB7BD, 0x65B9, + 0xB7BE, 0x80AA, 0xB7BF, 0x623F, 0xB7C0, 0x9632, 0xB7C1, 0x59A8, + 0xB7C2, 0x4EFF, 0xB7C3, 0x8BBF, 0xB7C4, 0x7EBA, 0xB7C5, 0x653E, + 0xB7C6, 0x83F2, 0xB7C7, 0x975E, 0xB7C8, 0x5561, 0xB7C9, 0x98DE, + 0xB7CA, 0x80A5, 0xB7CB, 0x532A, 0xB7CC, 0x8BFD, 0xB7CD, 0x5420, + 0xB7CE, 0x80BA, 0xB7CF, 0x5E9F, 0xB7D0, 0x6CB8, 0xB7D1, 0x8D39, + 0xB7D2, 0x82AC, 0xB7D3, 0x915A, 0xB7D4, 0x5429, 0xB7D5, 0x6C1B, + 0xB7D6, 0x5206, 0xB7D7, 0x7EB7, 0xB7D8, 0x575F, 0xB7D9, 0x711A, + 0xB7DA, 0x6C7E, 0xB7DB, 0x7C89, 0xB7DC, 0x594B, 0xB7DD, 0x4EFD, + 0xB7DE, 0x5FFF, 0xB7DF, 0x6124, 0xB7E0, 0x7CAA, 0xB7E1, 0x4E30, + 0xB7E2, 0x5C01, 0xB7E3, 0x67AB, 0xB7E4, 0x8702, 0xB7E5, 0x5CF0, + 0xB7E6, 0x950B, 0xB7E7, 0x98CE, 0xB7E8, 0x75AF, 0xB7E9, 0x70FD, + 0xB7EA, 0x9022, 0xB7EB, 0x51AF, 0xB7EC, 0x7F1D, 0xB7ED, 0x8BBD, + 0xB7EE, 0x5949, 0xB7EF, 0x51E4, 0xB7F0, 0x4F5B, 0xB7F1, 0x5426, + 0xB7F2, 0x592B, 0xB7F3, 0x6577, 0xB7F4, 0x80A4, 0xB7F5, 0x5B75, + 0xB7F6, 0x6276, 0xB7F7, 0x62C2, 0xB7F8, 0x8F90, 0xB7F9, 0x5E45, + 0xB7FA, 0x6C1F, 0xB7FB, 0x7B26, 0xB7FC, 0x4F0F, 0xB7FD, 0x4FD8, + 0xB7FE, 0x670D, 0xB840, 0x7AA3, 0xB841, 0x7AA4, 0xB842, 0x7AA7, + 0xB843, 0x7AA9, 0xB844, 0x7AAA, 0xB845, 0x7AAB, 0xB846, 0x7AAE, + 0xB847, 0x7AAF, 0xB848, 0x7AB0, 0xB849, 0x7AB1, 0xB84A, 0x7AB2, + 0xB84B, 0x7AB4, 0xB84C, 0x7AB5, 0xB84D, 0x7AB6, 0xB84E, 0x7AB7, + 0xB84F, 0x7AB8, 0xB850, 0x7AB9, 0xB851, 0x7ABA, 0xB852, 0x7ABB, + 0xB853, 0x7ABC, 0xB854, 0x7ABD, 0xB855, 0x7ABE, 0xB856, 0x7AC0, + 0xB857, 0x7AC1, 0xB858, 0x7AC2, 0xB859, 0x7AC3, 0xB85A, 0x7AC4, + 0xB85B, 0x7AC5, 0xB85C, 0x7AC6, 0xB85D, 0x7AC7, 0xB85E, 0x7AC8, + 0xB85F, 0x7AC9, 0xB860, 0x7ACA, 0xB861, 0x7ACC, 0xB862, 0x7ACD, + 0xB863, 0x7ACE, 0xB864, 0x7ACF, 0xB865, 0x7AD0, 0xB866, 0x7AD1, + 0xB867, 0x7AD2, 0xB868, 0x7AD3, 0xB869, 0x7AD4, 0xB86A, 0x7AD5, + 0xB86B, 0x7AD7, 0xB86C, 0x7AD8, 0xB86D, 0x7ADA, 0xB86E, 0x7ADB, + 0xB86F, 0x7ADC, 0xB870, 0x7ADD, 0xB871, 0x7AE1, 0xB872, 0x7AE2, + 0xB873, 0x7AE4, 0xB874, 0x7AE7, 0xB875, 0x7AE8, 0xB876, 0x7AE9, + 0xB877, 0x7AEA, 0xB878, 0x7AEB, 0xB879, 0x7AEC, 0xB87A, 0x7AEE, + 0xB87B, 0x7AF0, 0xB87C, 0x7AF1, 0xB87D, 0x7AF2, 0xB87E, 0x7AF3, + 0xB880, 0x7AF4, 0xB881, 0x7AF5, 0xB882, 0x7AF6, 0xB883, 0x7AF7, + 0xB884, 0x7AF8, 0xB885, 0x7AFB, 0xB886, 0x7AFC, 0xB887, 0x7AFE, + 0xB888, 0x7B00, 0xB889, 0x7B01, 0xB88A, 0x7B02, 0xB88B, 0x7B05, + 0xB88C, 0x7B07, 0xB88D, 0x7B09, 0xB88E, 0x7B0C, 0xB88F, 0x7B0D, + 0xB890, 0x7B0E, 0xB891, 0x7B10, 0xB892, 0x7B12, 0xB893, 0x7B13, + 0xB894, 0x7B16, 0xB895, 0x7B17, 0xB896, 0x7B18, 0xB897, 0x7B1A, + 0xB898, 0x7B1C, 0xB899, 0x7B1D, 0xB89A, 0x7B1F, 0xB89B, 0x7B21, + 0xB89C, 0x7B22, 0xB89D, 0x7B23, 0xB89E, 0x7B27, 0xB89F, 0x7B29, + 0xB8A0, 0x7B2D, 0xB8A1, 0x6D6E, 0xB8A2, 0x6DAA, 0xB8A3, 0x798F, + 0xB8A4, 0x88B1, 0xB8A5, 0x5F17, 0xB8A6, 0x752B, 0xB8A7, 0x629A, + 0xB8A8, 0x8F85, 0xB8A9, 0x4FEF, 0xB8AA, 0x91DC, 0xB8AB, 0x65A7, + 0xB8AC, 0x812F, 0xB8AD, 0x8151, 0xB8AE, 0x5E9C, 0xB8AF, 0x8150, + 0xB8B0, 0x8D74, 0xB8B1, 0x526F, 0xB8B2, 0x8986, 0xB8B3, 0x8D4B, + 0xB8B4, 0x590D, 0xB8B5, 0x5085, 0xB8B6, 0x4ED8, 0xB8B7, 0x961C, + 0xB8B8, 0x7236, 0xB8B9, 0x8179, 0xB8BA, 0x8D1F, 0xB8BB, 0x5BCC, + 0xB8BC, 0x8BA3, 0xB8BD, 0x9644, 0xB8BE, 0x5987, 0xB8BF, 0x7F1A, + 0xB8C0, 0x5490, 0xB8C1, 0x5676, 0xB8C2, 0x560E, 0xB8C3, 0x8BE5, + 0xB8C4, 0x6539, 0xB8C5, 0x6982, 0xB8C6, 0x9499, 0xB8C7, 0x76D6, + 0xB8C8, 0x6E89, 0xB8C9, 0x5E72, 0xB8CA, 0x7518, 0xB8CB, 0x6746, + 0xB8CC, 0x67D1, 0xB8CD, 0x7AFF, 0xB8CE, 0x809D, 0xB8CF, 0x8D76, + 0xB8D0, 0x611F, 0xB8D1, 0x79C6, 0xB8D2, 0x6562, 0xB8D3, 0x8D63, + 0xB8D4, 0x5188, 0xB8D5, 0x521A, 0xB8D6, 0x94A2, 0xB8D7, 0x7F38, + 0xB8D8, 0x809B, 0xB8D9, 0x7EB2, 0xB8DA, 0x5C97, 0xB8DB, 0x6E2F, + 0xB8DC, 0x6760, 0xB8DD, 0x7BD9, 0xB8DE, 0x768B, 0xB8DF, 0x9AD8, + 0xB8E0, 0x818F, 0xB8E1, 0x7F94, 0xB8E2, 0x7CD5, 0xB8E3, 0x641E, + 0xB8E4, 0x9550, 0xB8E5, 0x7A3F, 0xB8E6, 0x544A, 0xB8E7, 0x54E5, + 0xB8E8, 0x6B4C, 0xB8E9, 0x6401, 0xB8EA, 0x6208, 0xB8EB, 0x9E3D, + 0xB8EC, 0x80F3, 0xB8ED, 0x7599, 0xB8EE, 0x5272, 0xB8EF, 0x9769, + 0xB8F0, 0x845B, 0xB8F1, 0x683C, 0xB8F2, 0x86E4, 0xB8F3, 0x9601, + 0xB8F4, 0x9694, 0xB8F5, 0x94EC, 0xB8F6, 0x4E2A, 0xB8F7, 0x5404, + 0xB8F8, 0x7ED9, 0xB8F9, 0x6839, 0xB8FA, 0x8DDF, 0xB8FB, 0x8015, + 0xB8FC, 0x66F4, 0xB8FD, 0x5E9A, 0xB8FE, 0x7FB9, 0xB940, 0x7B2F, + 0xB941, 0x7B30, 0xB942, 0x7B32, 0xB943, 0x7B34, 0xB944, 0x7B35, + 0xB945, 0x7B36, 0xB946, 0x7B37, 0xB947, 0x7B39, 0xB948, 0x7B3B, + 0xB949, 0x7B3D, 0xB94A, 0x7B3F, 0xB94B, 0x7B40, 0xB94C, 0x7B41, + 0xB94D, 0x7B42, 0xB94E, 0x7B43, 0xB94F, 0x7B44, 0xB950, 0x7B46, + 0xB951, 0x7B48, 0xB952, 0x7B4A, 0xB953, 0x7B4D, 0xB954, 0x7B4E, + 0xB955, 0x7B53, 0xB956, 0x7B55, 0xB957, 0x7B57, 0xB958, 0x7B59, + 0xB959, 0x7B5C, 0xB95A, 0x7B5E, 0xB95B, 0x7B5F, 0xB95C, 0x7B61, + 0xB95D, 0x7B63, 0xB95E, 0x7B64, 0xB95F, 0x7B65, 0xB960, 0x7B66, + 0xB961, 0x7B67, 0xB962, 0x7B68, 0xB963, 0x7B69, 0xB964, 0x7B6A, + 0xB965, 0x7B6B, 0xB966, 0x7B6C, 0xB967, 0x7B6D, 0xB968, 0x7B6F, + 0xB969, 0x7B70, 0xB96A, 0x7B73, 0xB96B, 0x7B74, 0xB96C, 0x7B76, + 0xB96D, 0x7B78, 0xB96E, 0x7B7A, 0xB96F, 0x7B7C, 0xB970, 0x7B7D, + 0xB971, 0x7B7F, 0xB972, 0x7B81, 0xB973, 0x7B82, 0xB974, 0x7B83, + 0xB975, 0x7B84, 0xB976, 0x7B86, 0xB977, 0x7B87, 0xB978, 0x7B88, + 0xB979, 0x7B89, 0xB97A, 0x7B8A, 0xB97B, 0x7B8B, 0xB97C, 0x7B8C, + 0xB97D, 0x7B8E, 0xB97E, 0x7B8F, 0xB980, 0x7B91, 0xB981, 0x7B92, + 0xB982, 0x7B93, 0xB983, 0x7B96, 0xB984, 0x7B98, 0xB985, 0x7B99, + 0xB986, 0x7B9A, 0xB987, 0x7B9B, 0xB988, 0x7B9E, 0xB989, 0x7B9F, + 0xB98A, 0x7BA0, 0xB98B, 0x7BA3, 0xB98C, 0x7BA4, 0xB98D, 0x7BA5, + 0xB98E, 0x7BAE, 0xB98F, 0x7BAF, 0xB990, 0x7BB0, 0xB991, 0x7BB2, + 0xB992, 0x7BB3, 0xB993, 0x7BB5, 0xB994, 0x7BB6, 0xB995, 0x7BB7, + 0xB996, 0x7BB9, 0xB997, 0x7BBA, 0xB998, 0x7BBB, 0xB999, 0x7BBC, + 0xB99A, 0x7BBD, 0xB99B, 0x7BBE, 0xB99C, 0x7BBF, 0xB99D, 0x7BC0, + 0xB99E, 0x7BC2, 0xB99F, 0x7BC3, 0xB9A0, 0x7BC4, 0xB9A1, 0x57C2, + 0xB9A2, 0x803F, 0xB9A3, 0x6897, 0xB9A4, 0x5DE5, 0xB9A5, 0x653B, + 0xB9A6, 0x529F, 0xB9A7, 0x606D, 0xB9A8, 0x9F9A, 0xB9A9, 0x4F9B, + 0xB9AA, 0x8EAC, 0xB9AB, 0x516C, 0xB9AC, 0x5BAB, 0xB9AD, 0x5F13, + 0xB9AE, 0x5DE9, 0xB9AF, 0x6C5E, 0xB9B0, 0x62F1, 0xB9B1, 0x8D21, + 0xB9B2, 0x5171, 0xB9B3, 0x94A9, 0xB9B4, 0x52FE, 0xB9B5, 0x6C9F, + 0xB9B6, 0x82DF, 0xB9B7, 0x72D7, 0xB9B8, 0x57A2, 0xB9B9, 0x6784, + 0xB9BA, 0x8D2D, 0xB9BB, 0x591F, 0xB9BC, 0x8F9C, 0xB9BD, 0x83C7, + 0xB9BE, 0x5495, 0xB9BF, 0x7B8D, 0xB9C0, 0x4F30, 0xB9C1, 0x6CBD, + 0xB9C2, 0x5B64, 0xB9C3, 0x59D1, 0xB9C4, 0x9F13, 0xB9C5, 0x53E4, + 0xB9C6, 0x86CA, 0xB9C7, 0x9AA8, 0xB9C8, 0x8C37, 0xB9C9, 0x80A1, + 0xB9CA, 0x6545, 0xB9CB, 0x987E, 0xB9CC, 0x56FA, 0xB9CD, 0x96C7, + 0xB9CE, 0x522E, 0xB9CF, 0x74DC, 0xB9D0, 0x5250, 0xB9D1, 0x5BE1, + 0xB9D2, 0x6302, 0xB9D3, 0x8902, 0xB9D4, 0x4E56, 0xB9D5, 0x62D0, + 0xB9D6, 0x602A, 0xB9D7, 0x68FA, 0xB9D8, 0x5173, 0xB9D9, 0x5B98, + 0xB9DA, 0x51A0, 0xB9DB, 0x89C2, 0xB9DC, 0x7BA1, 0xB9DD, 0x9986, + 0xB9DE, 0x7F50, 0xB9DF, 0x60EF, 0xB9E0, 0x704C, 0xB9E1, 0x8D2F, + 0xB9E2, 0x5149, 0xB9E3, 0x5E7F, 0xB9E4, 0x901B, 0xB9E5, 0x7470, + 0xB9E6, 0x89C4, 0xB9E7, 0x572D, 0xB9E8, 0x7845, 0xB9E9, 0x5F52, + 0xB9EA, 0x9F9F, 0xB9EB, 0x95FA, 0xB9EC, 0x8F68, 0xB9ED, 0x9B3C, + 0xB9EE, 0x8BE1, 0xB9EF, 0x7678, 0xB9F0, 0x6842, 0xB9F1, 0x67DC, + 0xB9F2, 0x8DEA, 0xB9F3, 0x8D35, 0xB9F4, 0x523D, 0xB9F5, 0x8F8A, + 0xB9F6, 0x6EDA, 0xB9F7, 0x68CD, 0xB9F8, 0x9505, 0xB9F9, 0x90ED, + 0xB9FA, 0x56FD, 0xB9FB, 0x679C, 0xB9FC, 0x88F9, 0xB9FD, 0x8FC7, + 0xB9FE, 0x54C8, 0xBA40, 0x7BC5, 0xBA41, 0x7BC8, 0xBA42, 0x7BC9, + 0xBA43, 0x7BCA, 0xBA44, 0x7BCB, 0xBA45, 0x7BCD, 0xBA46, 0x7BCE, + 0xBA47, 0x7BCF, 0xBA48, 0x7BD0, 0xBA49, 0x7BD2, 0xBA4A, 0x7BD4, + 0xBA4B, 0x7BD5, 0xBA4C, 0x7BD6, 0xBA4D, 0x7BD7, 0xBA4E, 0x7BD8, + 0xBA4F, 0x7BDB, 0xBA50, 0x7BDC, 0xBA51, 0x7BDE, 0xBA52, 0x7BDF, + 0xBA53, 0x7BE0, 0xBA54, 0x7BE2, 0xBA55, 0x7BE3, 0xBA56, 0x7BE4, + 0xBA57, 0x7BE7, 0xBA58, 0x7BE8, 0xBA59, 0x7BE9, 0xBA5A, 0x7BEB, + 0xBA5B, 0x7BEC, 0xBA5C, 0x7BED, 0xBA5D, 0x7BEF, 0xBA5E, 0x7BF0, + 0xBA5F, 0x7BF2, 0xBA60, 0x7BF3, 0xBA61, 0x7BF4, 0xBA62, 0x7BF5, + 0xBA63, 0x7BF6, 0xBA64, 0x7BF8, 0xBA65, 0x7BF9, 0xBA66, 0x7BFA, + 0xBA67, 0x7BFB, 0xBA68, 0x7BFD, 0xBA69, 0x7BFF, 0xBA6A, 0x7C00, + 0xBA6B, 0x7C01, 0xBA6C, 0x7C02, 0xBA6D, 0x7C03, 0xBA6E, 0x7C04, + 0xBA6F, 0x7C05, 0xBA70, 0x7C06, 0xBA71, 0x7C08, 0xBA72, 0x7C09, + 0xBA73, 0x7C0A, 0xBA74, 0x7C0D, 0xBA75, 0x7C0E, 0xBA76, 0x7C10, + 0xBA77, 0x7C11, 0xBA78, 0x7C12, 0xBA79, 0x7C13, 0xBA7A, 0x7C14, + 0xBA7B, 0x7C15, 0xBA7C, 0x7C17, 0xBA7D, 0x7C18, 0xBA7E, 0x7C19, + 0xBA80, 0x7C1A, 0xBA81, 0x7C1B, 0xBA82, 0x7C1C, 0xBA83, 0x7C1D, + 0xBA84, 0x7C1E, 0xBA85, 0x7C20, 0xBA86, 0x7C21, 0xBA87, 0x7C22, + 0xBA88, 0x7C23, 0xBA89, 0x7C24, 0xBA8A, 0x7C25, 0xBA8B, 0x7C28, + 0xBA8C, 0x7C29, 0xBA8D, 0x7C2B, 0xBA8E, 0x7C2C, 0xBA8F, 0x7C2D, + 0xBA90, 0x7C2E, 0xBA91, 0x7C2F, 0xBA92, 0x7C30, 0xBA93, 0x7C31, + 0xBA94, 0x7C32, 0xBA95, 0x7C33, 0xBA96, 0x7C34, 0xBA97, 0x7C35, + 0xBA98, 0x7C36, 0xBA99, 0x7C37, 0xBA9A, 0x7C39, 0xBA9B, 0x7C3A, + 0xBA9C, 0x7C3B, 0xBA9D, 0x7C3C, 0xBA9E, 0x7C3D, 0xBA9F, 0x7C3E, + 0xBAA0, 0x7C42, 0xBAA1, 0x9AB8, 0xBAA2, 0x5B69, 0xBAA3, 0x6D77, + 0xBAA4, 0x6C26, 0xBAA5, 0x4EA5, 0xBAA6, 0x5BB3, 0xBAA7, 0x9A87, + 0xBAA8, 0x9163, 0xBAA9, 0x61A8, 0xBAAA, 0x90AF, 0xBAAB, 0x97E9, + 0xBAAC, 0x542B, 0xBAAD, 0x6DB5, 0xBAAE, 0x5BD2, 0xBAAF, 0x51FD, + 0xBAB0, 0x558A, 0xBAB1, 0x7F55, 0xBAB2, 0x7FF0, 0xBAB3, 0x64BC, + 0xBAB4, 0x634D, 0xBAB5, 0x65F1, 0xBAB6, 0x61BE, 0xBAB7, 0x608D, + 0xBAB8, 0x710A, 0xBAB9, 0x6C57, 0xBABA, 0x6C49, 0xBABB, 0x592F, + 0xBABC, 0x676D, 0xBABD, 0x822A, 0xBABE, 0x58D5, 0xBABF, 0x568E, + 0xBAC0, 0x8C6A, 0xBAC1, 0x6BEB, 0xBAC2, 0x90DD, 0xBAC3, 0x597D, + 0xBAC4, 0x8017, 0xBAC5, 0x53F7, 0xBAC6, 0x6D69, 0xBAC7, 0x5475, + 0xBAC8, 0x559D, 0xBAC9, 0x8377, 0xBACA, 0x83CF, 0xBACB, 0x6838, + 0xBACC, 0x79BE, 0xBACD, 0x548C, 0xBACE, 0x4F55, 0xBACF, 0x5408, + 0xBAD0, 0x76D2, 0xBAD1, 0x8C89, 0xBAD2, 0x9602, 0xBAD3, 0x6CB3, + 0xBAD4, 0x6DB8, 0xBAD5, 0x8D6B, 0xBAD6, 0x8910, 0xBAD7, 0x9E64, + 0xBAD8, 0x8D3A, 0xBAD9, 0x563F, 0xBADA, 0x9ED1, 0xBADB, 0x75D5, + 0xBADC, 0x5F88, 0xBADD, 0x72E0, 0xBADE, 0x6068, 0xBADF, 0x54FC, + 0xBAE0, 0x4EA8, 0xBAE1, 0x6A2A, 0xBAE2, 0x8861, 0xBAE3, 0x6052, + 0xBAE4, 0x8F70, 0xBAE5, 0x54C4, 0xBAE6, 0x70D8, 0xBAE7, 0x8679, + 0xBAE8, 0x9E3F, 0xBAE9, 0x6D2A, 0xBAEA, 0x5B8F, 0xBAEB, 0x5F18, + 0xBAEC, 0x7EA2, 0xBAED, 0x5589, 0xBAEE, 0x4FAF, 0xBAEF, 0x7334, + 0xBAF0, 0x543C, 0xBAF1, 0x539A, 0xBAF2, 0x5019, 0xBAF3, 0x540E, + 0xBAF4, 0x547C, 0xBAF5, 0x4E4E, 0xBAF6, 0x5FFD, 0xBAF7, 0x745A, + 0xBAF8, 0x58F6, 0xBAF9, 0x846B, 0xBAFA, 0x80E1, 0xBAFB, 0x8774, + 0xBAFC, 0x72D0, 0xBAFD, 0x7CCA, 0xBAFE, 0x6E56, 0xBB40, 0x7C43, + 0xBB41, 0x7C44, 0xBB42, 0x7C45, 0xBB43, 0x7C46, 0xBB44, 0x7C47, + 0xBB45, 0x7C48, 0xBB46, 0x7C49, 0xBB47, 0x7C4A, 0xBB48, 0x7C4B, + 0xBB49, 0x7C4C, 0xBB4A, 0x7C4E, 0xBB4B, 0x7C4F, 0xBB4C, 0x7C50, + 0xBB4D, 0x7C51, 0xBB4E, 0x7C52, 0xBB4F, 0x7C53, 0xBB50, 0x7C54, + 0xBB51, 0x7C55, 0xBB52, 0x7C56, 0xBB53, 0x7C57, 0xBB54, 0x7C58, + 0xBB55, 0x7C59, 0xBB56, 0x7C5A, 0xBB57, 0x7C5B, 0xBB58, 0x7C5C, + 0xBB59, 0x7C5D, 0xBB5A, 0x7C5E, 0xBB5B, 0x7C5F, 0xBB5C, 0x7C60, + 0xBB5D, 0x7C61, 0xBB5E, 0x7C62, 0xBB5F, 0x7C63, 0xBB60, 0x7C64, + 0xBB61, 0x7C65, 0xBB62, 0x7C66, 0xBB63, 0x7C67, 0xBB64, 0x7C68, + 0xBB65, 0x7C69, 0xBB66, 0x7C6A, 0xBB67, 0x7C6B, 0xBB68, 0x7C6C, + 0xBB69, 0x7C6D, 0xBB6A, 0x7C6E, 0xBB6B, 0x7C6F, 0xBB6C, 0x7C70, + 0xBB6D, 0x7C71, 0xBB6E, 0x7C72, 0xBB6F, 0x7C75, 0xBB70, 0x7C76, + 0xBB71, 0x7C77, 0xBB72, 0x7C78, 0xBB73, 0x7C79, 0xBB74, 0x7C7A, + 0xBB75, 0x7C7E, 0xBB76, 0x7C7F, 0xBB77, 0x7C80, 0xBB78, 0x7C81, + 0xBB79, 0x7C82, 0xBB7A, 0x7C83, 0xBB7B, 0x7C84, 0xBB7C, 0x7C85, + 0xBB7D, 0x7C86, 0xBB7E, 0x7C87, 0xBB80, 0x7C88, 0xBB81, 0x7C8A, + 0xBB82, 0x7C8B, 0xBB83, 0x7C8C, 0xBB84, 0x7C8D, 0xBB85, 0x7C8E, + 0xBB86, 0x7C8F, 0xBB87, 0x7C90, 0xBB88, 0x7C93, 0xBB89, 0x7C94, + 0xBB8A, 0x7C96, 0xBB8B, 0x7C99, 0xBB8C, 0x7C9A, 0xBB8D, 0x7C9B, + 0xBB8E, 0x7CA0, 0xBB8F, 0x7CA1, 0xBB90, 0x7CA3, 0xBB91, 0x7CA6, + 0xBB92, 0x7CA7, 0xBB93, 0x7CA8, 0xBB94, 0x7CA9, 0xBB95, 0x7CAB, + 0xBB96, 0x7CAC, 0xBB97, 0x7CAD, 0xBB98, 0x7CAF, 0xBB99, 0x7CB0, + 0xBB9A, 0x7CB4, 0xBB9B, 0x7CB5, 0xBB9C, 0x7CB6, 0xBB9D, 0x7CB7, + 0xBB9E, 0x7CB8, 0xBB9F, 0x7CBA, 0xBBA0, 0x7CBB, 0xBBA1, 0x5F27, + 0xBBA2, 0x864E, 0xBBA3, 0x552C, 0xBBA4, 0x62A4, 0xBBA5, 0x4E92, + 0xBBA6, 0x6CAA, 0xBBA7, 0x6237, 0xBBA8, 0x82B1, 0xBBA9, 0x54D7, + 0xBBAA, 0x534E, 0xBBAB, 0x733E, 0xBBAC, 0x6ED1, 0xBBAD, 0x753B, + 0xBBAE, 0x5212, 0xBBAF, 0x5316, 0xBBB0, 0x8BDD, 0xBBB1, 0x69D0, + 0xBBB2, 0x5F8A, 0xBBB3, 0x6000, 0xBBB4, 0x6DEE, 0xBBB5, 0x574F, + 0xBBB6, 0x6B22, 0xBBB7, 0x73AF, 0xBBB8, 0x6853, 0xBBB9, 0x8FD8, + 0xBBBA, 0x7F13, 0xBBBB, 0x6362, 0xBBBC, 0x60A3, 0xBBBD, 0x5524, + 0xBBBE, 0x75EA, 0xBBBF, 0x8C62, 0xBBC0, 0x7115, 0xBBC1, 0x6DA3, + 0xBBC2, 0x5BA6, 0xBBC3, 0x5E7B, 0xBBC4, 0x8352, 0xBBC5, 0x614C, + 0xBBC6, 0x9EC4, 0xBBC7, 0x78FA, 0xBBC8, 0x8757, 0xBBC9, 0x7C27, + 0xBBCA, 0x7687, 0xBBCB, 0x51F0, 0xBBCC, 0x60F6, 0xBBCD, 0x714C, + 0xBBCE, 0x6643, 0xBBCF, 0x5E4C, 0xBBD0, 0x604D, 0xBBD1, 0x8C0E, + 0xBBD2, 0x7070, 0xBBD3, 0x6325, 0xBBD4, 0x8F89, 0xBBD5, 0x5FBD, + 0xBBD6, 0x6062, 0xBBD7, 0x86D4, 0xBBD8, 0x56DE, 0xBBD9, 0x6BC1, + 0xBBDA, 0x6094, 0xBBDB, 0x6167, 0xBBDC, 0x5349, 0xBBDD, 0x60E0, + 0xBBDE, 0x6666, 0xBBDF, 0x8D3F, 0xBBE0, 0x79FD, 0xBBE1, 0x4F1A, + 0xBBE2, 0x70E9, 0xBBE3, 0x6C47, 0xBBE4, 0x8BB3, 0xBBE5, 0x8BF2, + 0xBBE6, 0x7ED8, 0xBBE7, 0x8364, 0xBBE8, 0x660F, 0xBBE9, 0x5A5A, + 0xBBEA, 0x9B42, 0xBBEB, 0x6D51, 0xBBEC, 0x6DF7, 0xBBED, 0x8C41, + 0xBBEE, 0x6D3B, 0xBBEF, 0x4F19, 0xBBF0, 0x706B, 0xBBF1, 0x83B7, + 0xBBF2, 0x6216, 0xBBF3, 0x60D1, 0xBBF4, 0x970D, 0xBBF5, 0x8D27, + 0xBBF6, 0x7978, 0xBBF7, 0x51FB, 0xBBF8, 0x573E, 0xBBF9, 0x57FA, + 0xBBFA, 0x673A, 0xBBFB, 0x7578, 0xBBFC, 0x7A3D, 0xBBFD, 0x79EF, + 0xBBFE, 0x7B95, 0xBC40, 0x7CBF, 0xBC41, 0x7CC0, 0xBC42, 0x7CC2, + 0xBC43, 0x7CC3, 0xBC44, 0x7CC4, 0xBC45, 0x7CC6, 0xBC46, 0x7CC9, + 0xBC47, 0x7CCB, 0xBC48, 0x7CCE, 0xBC49, 0x7CCF, 0xBC4A, 0x7CD0, + 0xBC4B, 0x7CD1, 0xBC4C, 0x7CD2, 0xBC4D, 0x7CD3, 0xBC4E, 0x7CD4, + 0xBC4F, 0x7CD8, 0xBC50, 0x7CDA, 0xBC51, 0x7CDB, 0xBC52, 0x7CDD, + 0xBC53, 0x7CDE, 0xBC54, 0x7CE1, 0xBC55, 0x7CE2, 0xBC56, 0x7CE3, + 0xBC57, 0x7CE4, 0xBC58, 0x7CE5, 0xBC59, 0x7CE6, 0xBC5A, 0x7CE7, + 0xBC5B, 0x7CE9, 0xBC5C, 0x7CEA, 0xBC5D, 0x7CEB, 0xBC5E, 0x7CEC, + 0xBC5F, 0x7CED, 0xBC60, 0x7CEE, 0xBC61, 0x7CF0, 0xBC62, 0x7CF1, + 0xBC63, 0x7CF2, 0xBC64, 0x7CF3, 0xBC65, 0x7CF4, 0xBC66, 0x7CF5, + 0xBC67, 0x7CF6, 0xBC68, 0x7CF7, 0xBC69, 0x7CF9, 0xBC6A, 0x7CFA, + 0xBC6B, 0x7CFC, 0xBC6C, 0x7CFD, 0xBC6D, 0x7CFE, 0xBC6E, 0x7CFF, + 0xBC6F, 0x7D00, 0xBC70, 0x7D01, 0xBC71, 0x7D02, 0xBC72, 0x7D03, + 0xBC73, 0x7D04, 0xBC74, 0x7D05, 0xBC75, 0x7D06, 0xBC76, 0x7D07, + 0xBC77, 0x7D08, 0xBC78, 0x7D09, 0xBC79, 0x7D0B, 0xBC7A, 0x7D0C, + 0xBC7B, 0x7D0D, 0xBC7C, 0x7D0E, 0xBC7D, 0x7D0F, 0xBC7E, 0x7D10, + 0xBC80, 0x7D11, 0xBC81, 0x7D12, 0xBC82, 0x7D13, 0xBC83, 0x7D14, + 0xBC84, 0x7D15, 0xBC85, 0x7D16, 0xBC86, 0x7D17, 0xBC87, 0x7D18, + 0xBC88, 0x7D19, 0xBC89, 0x7D1A, 0xBC8A, 0x7D1B, 0xBC8B, 0x7D1C, + 0xBC8C, 0x7D1D, 0xBC8D, 0x7D1E, 0xBC8E, 0x7D1F, 0xBC8F, 0x7D21, + 0xBC90, 0x7D23, 0xBC91, 0x7D24, 0xBC92, 0x7D25, 0xBC93, 0x7D26, + 0xBC94, 0x7D28, 0xBC95, 0x7D29, 0xBC96, 0x7D2A, 0xBC97, 0x7D2C, + 0xBC98, 0x7D2D, 0xBC99, 0x7D2E, 0xBC9A, 0x7D30, 0xBC9B, 0x7D31, + 0xBC9C, 0x7D32, 0xBC9D, 0x7D33, 0xBC9E, 0x7D34, 0xBC9F, 0x7D35, + 0xBCA0, 0x7D36, 0xBCA1, 0x808C, 0xBCA2, 0x9965, 0xBCA3, 0x8FF9, + 0xBCA4, 0x6FC0, 0xBCA5, 0x8BA5, 0xBCA6, 0x9E21, 0xBCA7, 0x59EC, + 0xBCA8, 0x7EE9, 0xBCA9, 0x7F09, 0xBCAA, 0x5409, 0xBCAB, 0x6781, + 0xBCAC, 0x68D8, 0xBCAD, 0x8F91, 0xBCAE, 0x7C4D, 0xBCAF, 0x96C6, + 0xBCB0, 0x53CA, 0xBCB1, 0x6025, 0xBCB2, 0x75BE, 0xBCB3, 0x6C72, + 0xBCB4, 0x5373, 0xBCB5, 0x5AC9, 0xBCB6, 0x7EA7, 0xBCB7, 0x6324, + 0xBCB8, 0x51E0, 0xBCB9, 0x810A, 0xBCBA, 0x5DF1, 0xBCBB, 0x84DF, + 0xBCBC, 0x6280, 0xBCBD, 0x5180, 0xBCBE, 0x5B63, 0xBCBF, 0x4F0E, + 0xBCC0, 0x796D, 0xBCC1, 0x5242, 0xBCC2, 0x60B8, 0xBCC3, 0x6D4E, + 0xBCC4, 0x5BC4, 0xBCC5, 0x5BC2, 0xBCC6, 0x8BA1, 0xBCC7, 0x8BB0, + 0xBCC8, 0x65E2, 0xBCC9, 0x5FCC, 0xBCCA, 0x9645, 0xBCCB, 0x5993, + 0xBCCC, 0x7EE7, 0xBCCD, 0x7EAA, 0xBCCE, 0x5609, 0xBCCF, 0x67B7, + 0xBCD0, 0x5939, 0xBCD1, 0x4F73, 0xBCD2, 0x5BB6, 0xBCD3, 0x52A0, + 0xBCD4, 0x835A, 0xBCD5, 0x988A, 0xBCD6, 0x8D3E, 0xBCD7, 0x7532, + 0xBCD8, 0x94BE, 0xBCD9, 0x5047, 0xBCDA, 0x7A3C, 0xBCDB, 0x4EF7, + 0xBCDC, 0x67B6, 0xBCDD, 0x9A7E, 0xBCDE, 0x5AC1, 0xBCDF, 0x6B7C, + 0xBCE0, 0x76D1, 0xBCE1, 0x575A, 0xBCE2, 0x5C16, 0xBCE3, 0x7B3A, + 0xBCE4, 0x95F4, 0xBCE5, 0x714E, 0xBCE6, 0x517C, 0xBCE7, 0x80A9, + 0xBCE8, 0x8270, 0xBCE9, 0x5978, 0xBCEA, 0x7F04, 0xBCEB, 0x8327, + 0xBCEC, 0x68C0, 0xBCED, 0x67EC, 0xBCEE, 0x78B1, 0xBCEF, 0x7877, + 0xBCF0, 0x62E3, 0xBCF1, 0x6361, 0xBCF2, 0x7B80, 0xBCF3, 0x4FED, + 0xBCF4, 0x526A, 0xBCF5, 0x51CF, 0xBCF6, 0x8350, 0xBCF7, 0x69DB, + 0xBCF8, 0x9274, 0xBCF9, 0x8DF5, 0xBCFA, 0x8D31, 0xBCFB, 0x89C1, + 0xBCFC, 0x952E, 0xBCFD, 0x7BAD, 0xBCFE, 0x4EF6, 0xBD40, 0x7D37, + 0xBD41, 0x7D38, 0xBD42, 0x7D39, 0xBD43, 0x7D3A, 0xBD44, 0x7D3B, + 0xBD45, 0x7D3C, 0xBD46, 0x7D3D, 0xBD47, 0x7D3E, 0xBD48, 0x7D3F, + 0xBD49, 0x7D40, 0xBD4A, 0x7D41, 0xBD4B, 0x7D42, 0xBD4C, 0x7D43, + 0xBD4D, 0x7D44, 0xBD4E, 0x7D45, 0xBD4F, 0x7D46, 0xBD50, 0x7D47, + 0xBD51, 0x7D48, 0xBD52, 0x7D49, 0xBD53, 0x7D4A, 0xBD54, 0x7D4B, + 0xBD55, 0x7D4C, 0xBD56, 0x7D4D, 0xBD57, 0x7D4E, 0xBD58, 0x7D4F, + 0xBD59, 0x7D50, 0xBD5A, 0x7D51, 0xBD5B, 0x7D52, 0xBD5C, 0x7D53, + 0xBD5D, 0x7D54, 0xBD5E, 0x7D55, 0xBD5F, 0x7D56, 0xBD60, 0x7D57, + 0xBD61, 0x7D58, 0xBD62, 0x7D59, 0xBD63, 0x7D5A, 0xBD64, 0x7D5B, + 0xBD65, 0x7D5C, 0xBD66, 0x7D5D, 0xBD67, 0x7D5E, 0xBD68, 0x7D5F, + 0xBD69, 0x7D60, 0xBD6A, 0x7D61, 0xBD6B, 0x7D62, 0xBD6C, 0x7D63, + 0xBD6D, 0x7D64, 0xBD6E, 0x7D65, 0xBD6F, 0x7D66, 0xBD70, 0x7D67, + 0xBD71, 0x7D68, 0xBD72, 0x7D69, 0xBD73, 0x7D6A, 0xBD74, 0x7D6B, + 0xBD75, 0x7D6C, 0xBD76, 0x7D6D, 0xBD77, 0x7D6F, 0xBD78, 0x7D70, + 0xBD79, 0x7D71, 0xBD7A, 0x7D72, 0xBD7B, 0x7D73, 0xBD7C, 0x7D74, + 0xBD7D, 0x7D75, 0xBD7E, 0x7D76, 0xBD80, 0x7D78, 0xBD81, 0x7D79, + 0xBD82, 0x7D7A, 0xBD83, 0x7D7B, 0xBD84, 0x7D7C, 0xBD85, 0x7D7D, + 0xBD86, 0x7D7E, 0xBD87, 0x7D7F, 0xBD88, 0x7D80, 0xBD89, 0x7D81, + 0xBD8A, 0x7D82, 0xBD8B, 0x7D83, 0xBD8C, 0x7D84, 0xBD8D, 0x7D85, + 0xBD8E, 0x7D86, 0xBD8F, 0x7D87, 0xBD90, 0x7D88, 0xBD91, 0x7D89, + 0xBD92, 0x7D8A, 0xBD93, 0x7D8B, 0xBD94, 0x7D8C, 0xBD95, 0x7D8D, + 0xBD96, 0x7D8E, 0xBD97, 0x7D8F, 0xBD98, 0x7D90, 0xBD99, 0x7D91, + 0xBD9A, 0x7D92, 0xBD9B, 0x7D93, 0xBD9C, 0x7D94, 0xBD9D, 0x7D95, + 0xBD9E, 0x7D96, 0xBD9F, 0x7D97, 0xBDA0, 0x7D98, 0xBDA1, 0x5065, + 0xBDA2, 0x8230, 0xBDA3, 0x5251, 0xBDA4, 0x996F, 0xBDA5, 0x6E10, + 0xBDA6, 0x6E85, 0xBDA7, 0x6DA7, 0xBDA8, 0x5EFA, 0xBDA9, 0x50F5, + 0xBDAA, 0x59DC, 0xBDAB, 0x5C06, 0xBDAC, 0x6D46, 0xBDAD, 0x6C5F, + 0xBDAE, 0x7586, 0xBDAF, 0x848B, 0xBDB0, 0x6868, 0xBDB1, 0x5956, + 0xBDB2, 0x8BB2, 0xBDB3, 0x5320, 0xBDB4, 0x9171, 0xBDB5, 0x964D, + 0xBDB6, 0x8549, 0xBDB7, 0x6912, 0xBDB8, 0x7901, 0xBDB9, 0x7126, + 0xBDBA, 0x80F6, 0xBDBB, 0x4EA4, 0xBDBC, 0x90CA, 0xBDBD, 0x6D47, + 0xBDBE, 0x9A84, 0xBDBF, 0x5A07, 0xBDC0, 0x56BC, 0xBDC1, 0x6405, + 0xBDC2, 0x94F0, 0xBDC3, 0x77EB, 0xBDC4, 0x4FA5, 0xBDC5, 0x811A, + 0xBDC6, 0x72E1, 0xBDC7, 0x89D2, 0xBDC8, 0x997A, 0xBDC9, 0x7F34, + 0xBDCA, 0x7EDE, 0xBDCB, 0x527F, 0xBDCC, 0x6559, 0xBDCD, 0x9175, + 0xBDCE, 0x8F7F, 0xBDCF, 0x8F83, 0xBDD0, 0x53EB, 0xBDD1, 0x7A96, + 0xBDD2, 0x63ED, 0xBDD3, 0x63A5, 0xBDD4, 0x7686, 0xBDD5, 0x79F8, + 0xBDD6, 0x8857, 0xBDD7, 0x9636, 0xBDD8, 0x622A, 0xBDD9, 0x52AB, + 0xBDDA, 0x8282, 0xBDDB, 0x6854, 0xBDDC, 0x6770, 0xBDDD, 0x6377, + 0xBDDE, 0x776B, 0xBDDF, 0x7AED, 0xBDE0, 0x6D01, 0xBDE1, 0x7ED3, + 0xBDE2, 0x89E3, 0xBDE3, 0x59D0, 0xBDE4, 0x6212, 0xBDE5, 0x85C9, + 0xBDE6, 0x82A5, 0xBDE7, 0x754C, 0xBDE8, 0x501F, 0xBDE9, 0x4ECB, + 0xBDEA, 0x75A5, 0xBDEB, 0x8BEB, 0xBDEC, 0x5C4A, 0xBDED, 0x5DFE, + 0xBDEE, 0x7B4B, 0xBDEF, 0x65A4, 0xBDF0, 0x91D1, 0xBDF1, 0x4ECA, + 0xBDF2, 0x6D25, 0xBDF3, 0x895F, 0xBDF4, 0x7D27, 0xBDF5, 0x9526, + 0xBDF6, 0x4EC5, 0xBDF7, 0x8C28, 0xBDF8, 0x8FDB, 0xBDF9, 0x9773, + 0xBDFA, 0x664B, 0xBDFB, 0x7981, 0xBDFC, 0x8FD1, 0xBDFD, 0x70EC, + 0xBDFE, 0x6D78, 0xBE40, 0x7D99, 0xBE41, 0x7D9A, 0xBE42, 0x7D9B, + 0xBE43, 0x7D9C, 0xBE44, 0x7D9D, 0xBE45, 0x7D9E, 0xBE46, 0x7D9F, + 0xBE47, 0x7DA0, 0xBE48, 0x7DA1, 0xBE49, 0x7DA2, 0xBE4A, 0x7DA3, + 0xBE4B, 0x7DA4, 0xBE4C, 0x7DA5, 0xBE4D, 0x7DA7, 0xBE4E, 0x7DA8, + 0xBE4F, 0x7DA9, 0xBE50, 0x7DAA, 0xBE51, 0x7DAB, 0xBE52, 0x7DAC, + 0xBE53, 0x7DAD, 0xBE54, 0x7DAF, 0xBE55, 0x7DB0, 0xBE56, 0x7DB1, + 0xBE57, 0x7DB2, 0xBE58, 0x7DB3, 0xBE59, 0x7DB4, 0xBE5A, 0x7DB5, + 0xBE5B, 0x7DB6, 0xBE5C, 0x7DB7, 0xBE5D, 0x7DB8, 0xBE5E, 0x7DB9, + 0xBE5F, 0x7DBA, 0xBE60, 0x7DBB, 0xBE61, 0x7DBC, 0xBE62, 0x7DBD, + 0xBE63, 0x7DBE, 0xBE64, 0x7DBF, 0xBE65, 0x7DC0, 0xBE66, 0x7DC1, + 0xBE67, 0x7DC2, 0xBE68, 0x7DC3, 0xBE69, 0x7DC4, 0xBE6A, 0x7DC5, + 0xBE6B, 0x7DC6, 0xBE6C, 0x7DC7, 0xBE6D, 0x7DC8, 0xBE6E, 0x7DC9, + 0xBE6F, 0x7DCA, 0xBE70, 0x7DCB, 0xBE71, 0x7DCC, 0xBE72, 0x7DCD, + 0xBE73, 0x7DCE, 0xBE74, 0x7DCF, 0xBE75, 0x7DD0, 0xBE76, 0x7DD1, + 0xBE77, 0x7DD2, 0xBE78, 0x7DD3, 0xBE79, 0x7DD4, 0xBE7A, 0x7DD5, + 0xBE7B, 0x7DD6, 0xBE7C, 0x7DD7, 0xBE7D, 0x7DD8, 0xBE7E, 0x7DD9, + 0xBE80, 0x7DDA, 0xBE81, 0x7DDB, 0xBE82, 0x7DDC, 0xBE83, 0x7DDD, + 0xBE84, 0x7DDE, 0xBE85, 0x7DDF, 0xBE86, 0x7DE0, 0xBE87, 0x7DE1, + 0xBE88, 0x7DE2, 0xBE89, 0x7DE3, 0xBE8A, 0x7DE4, 0xBE8B, 0x7DE5, + 0xBE8C, 0x7DE6, 0xBE8D, 0x7DE7, 0xBE8E, 0x7DE8, 0xBE8F, 0x7DE9, + 0xBE90, 0x7DEA, 0xBE91, 0x7DEB, 0xBE92, 0x7DEC, 0xBE93, 0x7DED, + 0xBE94, 0x7DEE, 0xBE95, 0x7DEF, 0xBE96, 0x7DF0, 0xBE97, 0x7DF1, + 0xBE98, 0x7DF2, 0xBE99, 0x7DF3, 0xBE9A, 0x7DF4, 0xBE9B, 0x7DF5, + 0xBE9C, 0x7DF6, 0xBE9D, 0x7DF7, 0xBE9E, 0x7DF8, 0xBE9F, 0x7DF9, + 0xBEA0, 0x7DFA, 0xBEA1, 0x5C3D, 0xBEA2, 0x52B2, 0xBEA3, 0x8346, + 0xBEA4, 0x5162, 0xBEA5, 0x830E, 0xBEA6, 0x775B, 0xBEA7, 0x6676, + 0xBEA8, 0x9CB8, 0xBEA9, 0x4EAC, 0xBEAA, 0x60CA, 0xBEAB, 0x7CBE, + 0xBEAC, 0x7CB3, 0xBEAD, 0x7ECF, 0xBEAE, 0x4E95, 0xBEAF, 0x8B66, + 0xBEB0, 0x666F, 0xBEB1, 0x9888, 0xBEB2, 0x9759, 0xBEB3, 0x5883, + 0xBEB4, 0x656C, 0xBEB5, 0x955C, 0xBEB6, 0x5F84, 0xBEB7, 0x75C9, + 0xBEB8, 0x9756, 0xBEB9, 0x7ADF, 0xBEBA, 0x7ADE, 0xBEBB, 0x51C0, + 0xBEBC, 0x70AF, 0xBEBD, 0x7A98, 0xBEBE, 0x63EA, 0xBEBF, 0x7A76, + 0xBEC0, 0x7EA0, 0xBEC1, 0x7396, 0xBEC2, 0x97ED, 0xBEC3, 0x4E45, + 0xBEC4, 0x7078, 0xBEC5, 0x4E5D, 0xBEC6, 0x9152, 0xBEC7, 0x53A9, + 0xBEC8, 0x6551, 0xBEC9, 0x65E7, 0xBECA, 0x81FC, 0xBECB, 0x8205, + 0xBECC, 0x548E, 0xBECD, 0x5C31, 0xBECE, 0x759A, 0xBECF, 0x97A0, + 0xBED0, 0x62D8, 0xBED1, 0x72D9, 0xBED2, 0x75BD, 0xBED3, 0x5C45, + 0xBED4, 0x9A79, 0xBED5, 0x83CA, 0xBED6, 0x5C40, 0xBED7, 0x5480, + 0xBED8, 0x77E9, 0xBED9, 0x4E3E, 0xBEDA, 0x6CAE, 0xBEDB, 0x805A, + 0xBEDC, 0x62D2, 0xBEDD, 0x636E, 0xBEDE, 0x5DE8, 0xBEDF, 0x5177, + 0xBEE0, 0x8DDD, 0xBEE1, 0x8E1E, 0xBEE2, 0x952F, 0xBEE3, 0x4FF1, + 0xBEE4, 0x53E5, 0xBEE5, 0x60E7, 0xBEE6, 0x70AC, 0xBEE7, 0x5267, + 0xBEE8, 0x6350, 0xBEE9, 0x9E43, 0xBEEA, 0x5A1F, 0xBEEB, 0x5026, + 0xBEEC, 0x7737, 0xBEED, 0x5377, 0xBEEE, 0x7EE2, 0xBEEF, 0x6485, + 0xBEF0, 0x652B, 0xBEF1, 0x6289, 0xBEF2, 0x6398, 0xBEF3, 0x5014, + 0xBEF4, 0x7235, 0xBEF5, 0x89C9, 0xBEF6, 0x51B3, 0xBEF7, 0x8BC0, + 0xBEF8, 0x7EDD, 0xBEF9, 0x5747, 0xBEFA, 0x83CC, 0xBEFB, 0x94A7, + 0xBEFC, 0x519B, 0xBEFD, 0x541B, 0xBEFE, 0x5CFB, 0xBF40, 0x7DFB, + 0xBF41, 0x7DFC, 0xBF42, 0x7DFD, 0xBF43, 0x7DFE, 0xBF44, 0x7DFF, + 0xBF45, 0x7E00, 0xBF46, 0x7E01, 0xBF47, 0x7E02, 0xBF48, 0x7E03, + 0xBF49, 0x7E04, 0xBF4A, 0x7E05, 0xBF4B, 0x7E06, 0xBF4C, 0x7E07, + 0xBF4D, 0x7E08, 0xBF4E, 0x7E09, 0xBF4F, 0x7E0A, 0xBF50, 0x7E0B, + 0xBF51, 0x7E0C, 0xBF52, 0x7E0D, 0xBF53, 0x7E0E, 0xBF54, 0x7E0F, + 0xBF55, 0x7E10, 0xBF56, 0x7E11, 0xBF57, 0x7E12, 0xBF58, 0x7E13, + 0xBF59, 0x7E14, 0xBF5A, 0x7E15, 0xBF5B, 0x7E16, 0xBF5C, 0x7E17, + 0xBF5D, 0x7E18, 0xBF5E, 0x7E19, 0xBF5F, 0x7E1A, 0xBF60, 0x7E1B, + 0xBF61, 0x7E1C, 0xBF62, 0x7E1D, 0xBF63, 0x7E1E, 0xBF64, 0x7E1F, + 0xBF65, 0x7E20, 0xBF66, 0x7E21, 0xBF67, 0x7E22, 0xBF68, 0x7E23, + 0xBF69, 0x7E24, 0xBF6A, 0x7E25, 0xBF6B, 0x7E26, 0xBF6C, 0x7E27, + 0xBF6D, 0x7E28, 0xBF6E, 0x7E29, 0xBF6F, 0x7E2A, 0xBF70, 0x7E2B, + 0xBF71, 0x7E2C, 0xBF72, 0x7E2D, 0xBF73, 0x7E2E, 0xBF74, 0x7E2F, + 0xBF75, 0x7E30, 0xBF76, 0x7E31, 0xBF77, 0x7E32, 0xBF78, 0x7E33, + 0xBF79, 0x7E34, 0xBF7A, 0x7E35, 0xBF7B, 0x7E36, 0xBF7C, 0x7E37, + 0xBF7D, 0x7E38, 0xBF7E, 0x7E39, 0xBF80, 0x7E3A, 0xBF81, 0x7E3C, + 0xBF82, 0x7E3D, 0xBF83, 0x7E3E, 0xBF84, 0x7E3F, 0xBF85, 0x7E40, + 0xBF86, 0x7E42, 0xBF87, 0x7E43, 0xBF88, 0x7E44, 0xBF89, 0x7E45, + 0xBF8A, 0x7E46, 0xBF8B, 0x7E48, 0xBF8C, 0x7E49, 0xBF8D, 0x7E4A, + 0xBF8E, 0x7E4B, 0xBF8F, 0x7E4C, 0xBF90, 0x7E4D, 0xBF91, 0x7E4E, + 0xBF92, 0x7E4F, 0xBF93, 0x7E50, 0xBF94, 0x7E51, 0xBF95, 0x7E52, + 0xBF96, 0x7E53, 0xBF97, 0x7E54, 0xBF98, 0x7E55, 0xBF99, 0x7E56, + 0xBF9A, 0x7E57, 0xBF9B, 0x7E58, 0xBF9C, 0x7E59, 0xBF9D, 0x7E5A, + 0xBF9E, 0x7E5B, 0xBF9F, 0x7E5C, 0xBFA0, 0x7E5D, 0xBFA1, 0x4FCA, + 0xBFA2, 0x7AE3, 0xBFA3, 0x6D5A, 0xBFA4, 0x90E1, 0xBFA5, 0x9A8F, + 0xBFA6, 0x5580, 0xBFA7, 0x5496, 0xBFA8, 0x5361, 0xBFA9, 0x54AF, + 0xBFAA, 0x5F00, 0xBFAB, 0x63E9, 0xBFAC, 0x6977, 0xBFAD, 0x51EF, + 0xBFAE, 0x6168, 0xBFAF, 0x520A, 0xBFB0, 0x582A, 0xBFB1, 0x52D8, + 0xBFB2, 0x574E, 0xBFB3, 0x780D, 0xBFB4, 0x770B, 0xBFB5, 0x5EB7, + 0xBFB6, 0x6177, 0xBFB7, 0x7CE0, 0xBFB8, 0x625B, 0xBFB9, 0x6297, + 0xBFBA, 0x4EA2, 0xBFBB, 0x7095, 0xBFBC, 0x8003, 0xBFBD, 0x62F7, + 0xBFBE, 0x70E4, 0xBFBF, 0x9760, 0xBFC0, 0x5777, 0xBFC1, 0x82DB, + 0xBFC2, 0x67EF, 0xBFC3, 0x68F5, 0xBFC4, 0x78D5, 0xBFC5, 0x9897, + 0xBFC6, 0x79D1, 0xBFC7, 0x58F3, 0xBFC8, 0x54B3, 0xBFC9, 0x53EF, + 0xBFCA, 0x6E34, 0xBFCB, 0x514B, 0xBFCC, 0x523B, 0xBFCD, 0x5BA2, + 0xBFCE, 0x8BFE, 0xBFCF, 0x80AF, 0xBFD0, 0x5543, 0xBFD1, 0x57A6, + 0xBFD2, 0x6073, 0xBFD3, 0x5751, 0xBFD4, 0x542D, 0xBFD5, 0x7A7A, + 0xBFD6, 0x6050, 0xBFD7, 0x5B54, 0xBFD8, 0x63A7, 0xBFD9, 0x62A0, + 0xBFDA, 0x53E3, 0xBFDB, 0x6263, 0xBFDC, 0x5BC7, 0xBFDD, 0x67AF, + 0xBFDE, 0x54ED, 0xBFDF, 0x7A9F, 0xBFE0, 0x82E6, 0xBFE1, 0x9177, + 0xBFE2, 0x5E93, 0xBFE3, 0x88E4, 0xBFE4, 0x5938, 0xBFE5, 0x57AE, + 0xBFE6, 0x630E, 0xBFE7, 0x8DE8, 0xBFE8, 0x80EF, 0xBFE9, 0x5757, + 0xBFEA, 0x7B77, 0xBFEB, 0x4FA9, 0xBFEC, 0x5FEB, 0xBFED, 0x5BBD, + 0xBFEE, 0x6B3E, 0xBFEF, 0x5321, 0xBFF0, 0x7B50, 0xBFF1, 0x72C2, + 0xBFF2, 0x6846, 0xBFF3, 0x77FF, 0xBFF4, 0x7736, 0xBFF5, 0x65F7, + 0xBFF6, 0x51B5, 0xBFF7, 0x4E8F, 0xBFF8, 0x76D4, 0xBFF9, 0x5CBF, + 0xBFFA, 0x7AA5, 0xBFFB, 0x8475, 0xBFFC, 0x594E, 0xBFFD, 0x9B41, + 0xBFFE, 0x5080, 0xC040, 0x7E5E, 0xC041, 0x7E5F, 0xC042, 0x7E60, + 0xC043, 0x7E61, 0xC044, 0x7E62, 0xC045, 0x7E63, 0xC046, 0x7E64, + 0xC047, 0x7E65, 0xC048, 0x7E66, 0xC049, 0x7E67, 0xC04A, 0x7E68, + 0xC04B, 0x7E69, 0xC04C, 0x7E6A, 0xC04D, 0x7E6B, 0xC04E, 0x7E6C, + 0xC04F, 0x7E6D, 0xC050, 0x7E6E, 0xC051, 0x7E6F, 0xC052, 0x7E70, + 0xC053, 0x7E71, 0xC054, 0x7E72, 0xC055, 0x7E73, 0xC056, 0x7E74, + 0xC057, 0x7E75, 0xC058, 0x7E76, 0xC059, 0x7E77, 0xC05A, 0x7E78, + 0xC05B, 0x7E79, 0xC05C, 0x7E7A, 0xC05D, 0x7E7B, 0xC05E, 0x7E7C, + 0xC05F, 0x7E7D, 0xC060, 0x7E7E, 0xC061, 0x7E7F, 0xC062, 0x7E80, + 0xC063, 0x7E81, 0xC064, 0x7E83, 0xC065, 0x7E84, 0xC066, 0x7E85, + 0xC067, 0x7E86, 0xC068, 0x7E87, 0xC069, 0x7E88, 0xC06A, 0x7E89, + 0xC06B, 0x7E8A, 0xC06C, 0x7E8B, 0xC06D, 0x7E8C, 0xC06E, 0x7E8D, + 0xC06F, 0x7E8E, 0xC070, 0x7E8F, 0xC071, 0x7E90, 0xC072, 0x7E91, + 0xC073, 0x7E92, 0xC074, 0x7E93, 0xC075, 0x7E94, 0xC076, 0x7E95, + 0xC077, 0x7E96, 0xC078, 0x7E97, 0xC079, 0x7E98, 0xC07A, 0x7E99, + 0xC07B, 0x7E9A, 0xC07C, 0x7E9C, 0xC07D, 0x7E9D, 0xC07E, 0x7E9E, + 0xC080, 0x7EAE, 0xC081, 0x7EB4, 0xC082, 0x7EBB, 0xC083, 0x7EBC, + 0xC084, 0x7ED6, 0xC085, 0x7EE4, 0xC086, 0x7EEC, 0xC087, 0x7EF9, + 0xC088, 0x7F0A, 0xC089, 0x7F10, 0xC08A, 0x7F1E, 0xC08B, 0x7F37, + 0xC08C, 0x7F39, 0xC08D, 0x7F3B, 0xC08E, 0x7F3C, 0xC08F, 0x7F3D, + 0xC090, 0x7F3E, 0xC091, 0x7F3F, 0xC092, 0x7F40, 0xC093, 0x7F41, + 0xC094, 0x7F43, 0xC095, 0x7F46, 0xC096, 0x7F47, 0xC097, 0x7F48, + 0xC098, 0x7F49, 0xC099, 0x7F4A, 0xC09A, 0x7F4B, 0xC09B, 0x7F4C, + 0xC09C, 0x7F4D, 0xC09D, 0x7F4E, 0xC09E, 0x7F4F, 0xC09F, 0x7F52, + 0xC0A0, 0x7F53, 0xC0A1, 0x9988, 0xC0A2, 0x6127, 0xC0A3, 0x6E83, + 0xC0A4, 0x5764, 0xC0A5, 0x6606, 0xC0A6, 0x6346, 0xC0A7, 0x56F0, + 0xC0A8, 0x62EC, 0xC0A9, 0x6269, 0xC0AA, 0x5ED3, 0xC0AB, 0x9614, + 0xC0AC, 0x5783, 0xC0AD, 0x62C9, 0xC0AE, 0x5587, 0xC0AF, 0x8721, + 0xC0B0, 0x814A, 0xC0B1, 0x8FA3, 0xC0B2, 0x5566, 0xC0B3, 0x83B1, + 0xC0B4, 0x6765, 0xC0B5, 0x8D56, 0xC0B6, 0x84DD, 0xC0B7, 0x5A6A, + 0xC0B8, 0x680F, 0xC0B9, 0x62E6, 0xC0BA, 0x7BEE, 0xC0BB, 0x9611, + 0xC0BC, 0x5170, 0xC0BD, 0x6F9C, 0xC0BE, 0x8C30, 0xC0BF, 0x63FD, + 0xC0C0, 0x89C8, 0xC0C1, 0x61D2, 0xC0C2, 0x7F06, 0xC0C3, 0x70C2, + 0xC0C4, 0x6EE5, 0xC0C5, 0x7405, 0xC0C6, 0x6994, 0xC0C7, 0x72FC, + 0xC0C8, 0x5ECA, 0xC0C9, 0x90CE, 0xC0CA, 0x6717, 0xC0CB, 0x6D6A, + 0xC0CC, 0x635E, 0xC0CD, 0x52B3, 0xC0CE, 0x7262, 0xC0CF, 0x8001, + 0xC0D0, 0x4F6C, 0xC0D1, 0x59E5, 0xC0D2, 0x916A, 0xC0D3, 0x70D9, + 0xC0D4, 0x6D9D, 0xC0D5, 0x52D2, 0xC0D6, 0x4E50, 0xC0D7, 0x96F7, + 0xC0D8, 0x956D, 0xC0D9, 0x857E, 0xC0DA, 0x78CA, 0xC0DB, 0x7D2F, + 0xC0DC, 0x5121, 0xC0DD, 0x5792, 0xC0DE, 0x64C2, 0xC0DF, 0x808B, + 0xC0E0, 0x7C7B, 0xC0E1, 0x6CEA, 0xC0E2, 0x68F1, 0xC0E3, 0x695E, + 0xC0E4, 0x51B7, 0xC0E5, 0x5398, 0xC0E6, 0x68A8, 0xC0E7, 0x7281, + 0xC0E8, 0x9ECE, 0xC0E9, 0x7BF1, 0xC0EA, 0x72F8, 0xC0EB, 0x79BB, + 0xC0EC, 0x6F13, 0xC0ED, 0x7406, 0xC0EE, 0x674E, 0xC0EF, 0x91CC, + 0xC0F0, 0x9CA4, 0xC0F1, 0x793C, 0xC0F2, 0x8389, 0xC0F3, 0x8354, + 0xC0F4, 0x540F, 0xC0F5, 0x6817, 0xC0F6, 0x4E3D, 0xC0F7, 0x5389, + 0xC0F8, 0x52B1, 0xC0F9, 0x783E, 0xC0FA, 0x5386, 0xC0FB, 0x5229, + 0xC0FC, 0x5088, 0xC0FD, 0x4F8B, 0xC0FE, 0x4FD0, 0xC140, 0x7F56, + 0xC141, 0x7F59, 0xC142, 0x7F5B, 0xC143, 0x7F5C, 0xC144, 0x7F5D, + 0xC145, 0x7F5E, 0xC146, 0x7F60, 0xC147, 0x7F63, 0xC148, 0x7F64, + 0xC149, 0x7F65, 0xC14A, 0x7F66, 0xC14B, 0x7F67, 0xC14C, 0x7F6B, + 0xC14D, 0x7F6C, 0xC14E, 0x7F6D, 0xC14F, 0x7F6F, 0xC150, 0x7F70, + 0xC151, 0x7F73, 0xC152, 0x7F75, 0xC153, 0x7F76, 0xC154, 0x7F77, + 0xC155, 0x7F78, 0xC156, 0x7F7A, 0xC157, 0x7F7B, 0xC158, 0x7F7C, + 0xC159, 0x7F7D, 0xC15A, 0x7F7F, 0xC15B, 0x7F80, 0xC15C, 0x7F82, + 0xC15D, 0x7F83, 0xC15E, 0x7F84, 0xC15F, 0x7F85, 0xC160, 0x7F86, + 0xC161, 0x7F87, 0xC162, 0x7F88, 0xC163, 0x7F89, 0xC164, 0x7F8B, + 0xC165, 0x7F8D, 0xC166, 0x7F8F, 0xC167, 0x7F90, 0xC168, 0x7F91, + 0xC169, 0x7F92, 0xC16A, 0x7F93, 0xC16B, 0x7F95, 0xC16C, 0x7F96, + 0xC16D, 0x7F97, 0xC16E, 0x7F98, 0xC16F, 0x7F99, 0xC170, 0x7F9B, + 0xC171, 0x7F9C, 0xC172, 0x7FA0, 0xC173, 0x7FA2, 0xC174, 0x7FA3, + 0xC175, 0x7FA5, 0xC176, 0x7FA6, 0xC177, 0x7FA8, 0xC178, 0x7FA9, + 0xC179, 0x7FAA, 0xC17A, 0x7FAB, 0xC17B, 0x7FAC, 0xC17C, 0x7FAD, + 0xC17D, 0x7FAE, 0xC17E, 0x7FB1, 0xC180, 0x7FB3, 0xC181, 0x7FB4, + 0xC182, 0x7FB5, 0xC183, 0x7FB6, 0xC184, 0x7FB7, 0xC185, 0x7FBA, + 0xC186, 0x7FBB, 0xC187, 0x7FBE, 0xC188, 0x7FC0, 0xC189, 0x7FC2, + 0xC18A, 0x7FC3, 0xC18B, 0x7FC4, 0xC18C, 0x7FC6, 0xC18D, 0x7FC7, + 0xC18E, 0x7FC8, 0xC18F, 0x7FC9, 0xC190, 0x7FCB, 0xC191, 0x7FCD, + 0xC192, 0x7FCF, 0xC193, 0x7FD0, 0xC194, 0x7FD1, 0xC195, 0x7FD2, + 0xC196, 0x7FD3, 0xC197, 0x7FD6, 0xC198, 0x7FD7, 0xC199, 0x7FD9, + 0xC19A, 0x7FDA, 0xC19B, 0x7FDB, 0xC19C, 0x7FDC, 0xC19D, 0x7FDD, + 0xC19E, 0x7FDE, 0xC19F, 0x7FE2, 0xC1A0, 0x7FE3, 0xC1A1, 0x75E2, + 0xC1A2, 0x7ACB, 0xC1A3, 0x7C92, 0xC1A4, 0x6CA5, 0xC1A5, 0x96B6, + 0xC1A6, 0x529B, 0xC1A7, 0x7483, 0xC1A8, 0x54E9, 0xC1A9, 0x4FE9, + 0xC1AA, 0x8054, 0xC1AB, 0x83B2, 0xC1AC, 0x8FDE, 0xC1AD, 0x9570, + 0xC1AE, 0x5EC9, 0xC1AF, 0x601C, 0xC1B0, 0x6D9F, 0xC1B1, 0x5E18, + 0xC1B2, 0x655B, 0xC1B3, 0x8138, 0xC1B4, 0x94FE, 0xC1B5, 0x604B, + 0xC1B6, 0x70BC, 0xC1B7, 0x7EC3, 0xC1B8, 0x7CAE, 0xC1B9, 0x51C9, + 0xC1BA, 0x6881, 0xC1BB, 0x7CB1, 0xC1BC, 0x826F, 0xC1BD, 0x4E24, + 0xC1BE, 0x8F86, 0xC1BF, 0x91CF, 0xC1C0, 0x667E, 0xC1C1, 0x4EAE, + 0xC1C2, 0x8C05, 0xC1C3, 0x64A9, 0xC1C4, 0x804A, 0xC1C5, 0x50DA, + 0xC1C6, 0x7597, 0xC1C7, 0x71CE, 0xC1C8, 0x5BE5, 0xC1C9, 0x8FBD, + 0xC1CA, 0x6F66, 0xC1CB, 0x4E86, 0xC1CC, 0x6482, 0xC1CD, 0x9563, + 0xC1CE, 0x5ED6, 0xC1CF, 0x6599, 0xC1D0, 0x5217, 0xC1D1, 0x88C2, + 0xC1D2, 0x70C8, 0xC1D3, 0x52A3, 0xC1D4, 0x730E, 0xC1D5, 0x7433, + 0xC1D6, 0x6797, 0xC1D7, 0x78F7, 0xC1D8, 0x9716, 0xC1D9, 0x4E34, + 0xC1DA, 0x90BB, 0xC1DB, 0x9CDE, 0xC1DC, 0x6DCB, 0xC1DD, 0x51DB, + 0xC1DE, 0x8D41, 0xC1DF, 0x541D, 0xC1E0, 0x62CE, 0xC1E1, 0x73B2, + 0xC1E2, 0x83F1, 0xC1E3, 0x96F6, 0xC1E4, 0x9F84, 0xC1E5, 0x94C3, + 0xC1E6, 0x4F36, 0xC1E7, 0x7F9A, 0xC1E8, 0x51CC, 0xC1E9, 0x7075, + 0xC1EA, 0x9675, 0xC1EB, 0x5CAD, 0xC1EC, 0x9886, 0xC1ED, 0x53E6, + 0xC1EE, 0x4EE4, 0xC1EF, 0x6E9C, 0xC1F0, 0x7409, 0xC1F1, 0x69B4, + 0xC1F2, 0x786B, 0xC1F3, 0x998F, 0xC1F4, 0x7559, 0xC1F5, 0x5218, + 0xC1F6, 0x7624, 0xC1F7, 0x6D41, 0xC1F8, 0x67F3, 0xC1F9, 0x516D, + 0xC1FA, 0x9F99, 0xC1FB, 0x804B, 0xC1FC, 0x5499, 0xC1FD, 0x7B3C, + 0xC1FE, 0x7ABF, 0xC240, 0x7FE4, 0xC241, 0x7FE7, 0xC242, 0x7FE8, + 0xC243, 0x7FEA, 0xC244, 0x7FEB, 0xC245, 0x7FEC, 0xC246, 0x7FED, + 0xC247, 0x7FEF, 0xC248, 0x7FF2, 0xC249, 0x7FF4, 0xC24A, 0x7FF5, + 0xC24B, 0x7FF6, 0xC24C, 0x7FF7, 0xC24D, 0x7FF8, 0xC24E, 0x7FF9, + 0xC24F, 0x7FFA, 0xC250, 0x7FFD, 0xC251, 0x7FFE, 0xC252, 0x7FFF, + 0xC253, 0x8002, 0xC254, 0x8007, 0xC255, 0x8008, 0xC256, 0x8009, + 0xC257, 0x800A, 0xC258, 0x800E, 0xC259, 0x800F, 0xC25A, 0x8011, + 0xC25B, 0x8013, 0xC25C, 0x801A, 0xC25D, 0x801B, 0xC25E, 0x801D, + 0xC25F, 0x801E, 0xC260, 0x801F, 0xC261, 0x8021, 0xC262, 0x8023, + 0xC263, 0x8024, 0xC264, 0x802B, 0xC265, 0x802C, 0xC266, 0x802D, + 0xC267, 0x802E, 0xC268, 0x802F, 0xC269, 0x8030, 0xC26A, 0x8032, + 0xC26B, 0x8034, 0xC26C, 0x8039, 0xC26D, 0x803A, 0xC26E, 0x803C, + 0xC26F, 0x803E, 0xC270, 0x8040, 0xC271, 0x8041, 0xC272, 0x8044, + 0xC273, 0x8045, 0xC274, 0x8047, 0xC275, 0x8048, 0xC276, 0x8049, + 0xC277, 0x804E, 0xC278, 0x804F, 0xC279, 0x8050, 0xC27A, 0x8051, + 0xC27B, 0x8053, 0xC27C, 0x8055, 0xC27D, 0x8056, 0xC27E, 0x8057, + 0xC280, 0x8059, 0xC281, 0x805B, 0xC282, 0x805C, 0xC283, 0x805D, + 0xC284, 0x805E, 0xC285, 0x805F, 0xC286, 0x8060, 0xC287, 0x8061, + 0xC288, 0x8062, 0xC289, 0x8063, 0xC28A, 0x8064, 0xC28B, 0x8065, + 0xC28C, 0x8066, 0xC28D, 0x8067, 0xC28E, 0x8068, 0xC28F, 0x806B, + 0xC290, 0x806C, 0xC291, 0x806D, 0xC292, 0x806E, 0xC293, 0x806F, + 0xC294, 0x8070, 0xC295, 0x8072, 0xC296, 0x8073, 0xC297, 0x8074, + 0xC298, 0x8075, 0xC299, 0x8076, 0xC29A, 0x8077, 0xC29B, 0x8078, + 0xC29C, 0x8079, 0xC29D, 0x807A, 0xC29E, 0x807B, 0xC29F, 0x807C, + 0xC2A0, 0x807D, 0xC2A1, 0x9686, 0xC2A2, 0x5784, 0xC2A3, 0x62E2, + 0xC2A4, 0x9647, 0xC2A5, 0x697C, 0xC2A6, 0x5A04, 0xC2A7, 0x6402, + 0xC2A8, 0x7BD3, 0xC2A9, 0x6F0F, 0xC2AA, 0x964B, 0xC2AB, 0x82A6, + 0xC2AC, 0x5362, 0xC2AD, 0x9885, 0xC2AE, 0x5E90, 0xC2AF, 0x7089, + 0xC2B0, 0x63B3, 0xC2B1, 0x5364, 0xC2B2, 0x864F, 0xC2B3, 0x9C81, + 0xC2B4, 0x9E93, 0xC2B5, 0x788C, 0xC2B6, 0x9732, 0xC2B7, 0x8DEF, + 0xC2B8, 0x8D42, 0xC2B9, 0x9E7F, 0xC2BA, 0x6F5E, 0xC2BB, 0x7984, + 0xC2BC, 0x5F55, 0xC2BD, 0x9646, 0xC2BE, 0x622E, 0xC2BF, 0x9A74, + 0xC2C0, 0x5415, 0xC2C1, 0x94DD, 0xC2C2, 0x4FA3, 0xC2C3, 0x65C5, + 0xC2C4, 0x5C65, 0xC2C5, 0x5C61, 0xC2C6, 0x7F15, 0xC2C7, 0x8651, + 0xC2C8, 0x6C2F, 0xC2C9, 0x5F8B, 0xC2CA, 0x7387, 0xC2CB, 0x6EE4, + 0xC2CC, 0x7EFF, 0xC2CD, 0x5CE6, 0xC2CE, 0x631B, 0xC2CF, 0x5B6A, + 0xC2D0, 0x6EE6, 0xC2D1, 0x5375, 0xC2D2, 0x4E71, 0xC2D3, 0x63A0, + 0xC2D4, 0x7565, 0xC2D5, 0x62A1, 0xC2D6, 0x8F6E, 0xC2D7, 0x4F26, + 0xC2D8, 0x4ED1, 0xC2D9, 0x6CA6, 0xC2DA, 0x7EB6, 0xC2DB, 0x8BBA, + 0xC2DC, 0x841D, 0xC2DD, 0x87BA, 0xC2DE, 0x7F57, 0xC2DF, 0x903B, + 0xC2E0, 0x9523, 0xC2E1, 0x7BA9, 0xC2E2, 0x9AA1, 0xC2E3, 0x88F8, + 0xC2E4, 0x843D, 0xC2E5, 0x6D1B, 0xC2E6, 0x9A86, 0xC2E7, 0x7EDC, + 0xC2E8, 0x5988, 0xC2E9, 0x9EBB, 0xC2EA, 0x739B, 0xC2EB, 0x7801, + 0xC2EC, 0x8682, 0xC2ED, 0x9A6C, 0xC2EE, 0x9A82, 0xC2EF, 0x561B, + 0xC2F0, 0x5417, 0xC2F1, 0x57CB, 0xC2F2, 0x4E70, 0xC2F3, 0x9EA6, + 0xC2F4, 0x5356, 0xC2F5, 0x8FC8, 0xC2F6, 0x8109, 0xC2F7, 0x7792, + 0xC2F8, 0x9992, 0xC2F9, 0x86EE, 0xC2FA, 0x6EE1, 0xC2FB, 0x8513, + 0xC2FC, 0x66FC, 0xC2FD, 0x6162, 0xC2FE, 0x6F2B, 0xC340, 0x807E, + 0xC341, 0x8081, 0xC342, 0x8082, 0xC343, 0x8085, 0xC344, 0x8088, + 0xC345, 0x808A, 0xC346, 0x808D, 0xC347, 0x808E, 0xC348, 0x808F, + 0xC349, 0x8090, 0xC34A, 0x8091, 0xC34B, 0x8092, 0xC34C, 0x8094, + 0xC34D, 0x8095, 0xC34E, 0x8097, 0xC34F, 0x8099, 0xC350, 0x809E, + 0xC351, 0x80A3, 0xC352, 0x80A6, 0xC353, 0x80A7, 0xC354, 0x80A8, + 0xC355, 0x80AC, 0xC356, 0x80B0, 0xC357, 0x80B3, 0xC358, 0x80B5, + 0xC359, 0x80B6, 0xC35A, 0x80B8, 0xC35B, 0x80B9, 0xC35C, 0x80BB, + 0xC35D, 0x80C5, 0xC35E, 0x80C7, 0xC35F, 0x80C8, 0xC360, 0x80C9, + 0xC361, 0x80CA, 0xC362, 0x80CB, 0xC363, 0x80CF, 0xC364, 0x80D0, + 0xC365, 0x80D1, 0xC366, 0x80D2, 0xC367, 0x80D3, 0xC368, 0x80D4, + 0xC369, 0x80D5, 0xC36A, 0x80D8, 0xC36B, 0x80DF, 0xC36C, 0x80E0, + 0xC36D, 0x80E2, 0xC36E, 0x80E3, 0xC36F, 0x80E6, 0xC370, 0x80EE, + 0xC371, 0x80F5, 0xC372, 0x80F7, 0xC373, 0x80F9, 0xC374, 0x80FB, + 0xC375, 0x80FE, 0xC376, 0x80FF, 0xC377, 0x8100, 0xC378, 0x8101, + 0xC379, 0x8103, 0xC37A, 0x8104, 0xC37B, 0x8105, 0xC37C, 0x8107, + 0xC37D, 0x8108, 0xC37E, 0x810B, 0xC380, 0x810C, 0xC381, 0x8115, + 0xC382, 0x8117, 0xC383, 0x8119, 0xC384, 0x811B, 0xC385, 0x811C, + 0xC386, 0x811D, 0xC387, 0x811F, 0xC388, 0x8120, 0xC389, 0x8121, + 0xC38A, 0x8122, 0xC38B, 0x8123, 0xC38C, 0x8124, 0xC38D, 0x8125, + 0xC38E, 0x8126, 0xC38F, 0x8127, 0xC390, 0x8128, 0xC391, 0x8129, + 0xC392, 0x812A, 0xC393, 0x812B, 0xC394, 0x812D, 0xC395, 0x812E, + 0xC396, 0x8130, 0xC397, 0x8133, 0xC398, 0x8134, 0xC399, 0x8135, + 0xC39A, 0x8137, 0xC39B, 0x8139, 0xC39C, 0x813A, 0xC39D, 0x813B, + 0xC39E, 0x813C, 0xC39F, 0x813D, 0xC3A0, 0x813F, 0xC3A1, 0x8C29, + 0xC3A2, 0x8292, 0xC3A3, 0x832B, 0xC3A4, 0x76F2, 0xC3A5, 0x6C13, + 0xC3A6, 0x5FD9, 0xC3A7, 0x83BD, 0xC3A8, 0x732B, 0xC3A9, 0x8305, + 0xC3AA, 0x951A, 0xC3AB, 0x6BDB, 0xC3AC, 0x77DB, 0xC3AD, 0x94C6, + 0xC3AE, 0x536F, 0xC3AF, 0x8302, 0xC3B0, 0x5192, 0xC3B1, 0x5E3D, + 0xC3B2, 0x8C8C, 0xC3B3, 0x8D38, 0xC3B4, 0x4E48, 0xC3B5, 0x73AB, + 0xC3B6, 0x679A, 0xC3B7, 0x6885, 0xC3B8, 0x9176, 0xC3B9, 0x9709, + 0xC3BA, 0x7164, 0xC3BB, 0x6CA1, 0xC3BC, 0x7709, 0xC3BD, 0x5A92, + 0xC3BE, 0x9541, 0xC3BF, 0x6BCF, 0xC3C0, 0x7F8E, 0xC3C1, 0x6627, + 0xC3C2, 0x5BD0, 0xC3C3, 0x59B9, 0xC3C4, 0x5A9A, 0xC3C5, 0x95E8, + 0xC3C6, 0x95F7, 0xC3C7, 0x4EEC, 0xC3C8, 0x840C, 0xC3C9, 0x8499, + 0xC3CA, 0x6AAC, 0xC3CB, 0x76DF, 0xC3CC, 0x9530, 0xC3CD, 0x731B, + 0xC3CE, 0x68A6, 0xC3CF, 0x5B5F, 0xC3D0, 0x772F, 0xC3D1, 0x919A, + 0xC3D2, 0x9761, 0xC3D3, 0x7CDC, 0xC3D4, 0x8FF7, 0xC3D5, 0x8C1C, + 0xC3D6, 0x5F25, 0xC3D7, 0x7C73, 0xC3D8, 0x79D8, 0xC3D9, 0x89C5, + 0xC3DA, 0x6CCC, 0xC3DB, 0x871C, 0xC3DC, 0x5BC6, 0xC3DD, 0x5E42, + 0xC3DE, 0x68C9, 0xC3DF, 0x7720, 0xC3E0, 0x7EF5, 0xC3E1, 0x5195, + 0xC3E2, 0x514D, 0xC3E3, 0x52C9, 0xC3E4, 0x5A29, 0xC3E5, 0x7F05, + 0xC3E6, 0x9762, 0xC3E7, 0x82D7, 0xC3E8, 0x63CF, 0xC3E9, 0x7784, + 0xC3EA, 0x85D0, 0xC3EB, 0x79D2, 0xC3EC, 0x6E3A, 0xC3ED, 0x5E99, + 0xC3EE, 0x5999, 0xC3EF, 0x8511, 0xC3F0, 0x706D, 0xC3F1, 0x6C11, + 0xC3F2, 0x62BF, 0xC3F3, 0x76BF, 0xC3F4, 0x654F, 0xC3F5, 0x60AF, + 0xC3F6, 0x95FD, 0xC3F7, 0x660E, 0xC3F8, 0x879F, 0xC3F9, 0x9E23, + 0xC3FA, 0x94ED, 0xC3FB, 0x540D, 0xC3FC, 0x547D, 0xC3FD, 0x8C2C, + 0xC3FE, 0x6478, 0xC440, 0x8140, 0xC441, 0x8141, 0xC442, 0x8142, + 0xC443, 0x8143, 0xC444, 0x8144, 0xC445, 0x8145, 0xC446, 0x8147, + 0xC447, 0x8149, 0xC448, 0x814D, 0xC449, 0x814E, 0xC44A, 0x814F, + 0xC44B, 0x8152, 0xC44C, 0x8156, 0xC44D, 0x8157, 0xC44E, 0x8158, + 0xC44F, 0x815B, 0xC450, 0x815C, 0xC451, 0x815D, 0xC452, 0x815E, + 0xC453, 0x815F, 0xC454, 0x8161, 0xC455, 0x8162, 0xC456, 0x8163, + 0xC457, 0x8164, 0xC458, 0x8166, 0xC459, 0x8168, 0xC45A, 0x816A, + 0xC45B, 0x816B, 0xC45C, 0x816C, 0xC45D, 0x816F, 0xC45E, 0x8172, + 0xC45F, 0x8173, 0xC460, 0x8175, 0xC461, 0x8176, 0xC462, 0x8177, + 0xC463, 0x8178, 0xC464, 0x8181, 0xC465, 0x8183, 0xC466, 0x8184, + 0xC467, 0x8185, 0xC468, 0x8186, 0xC469, 0x8187, 0xC46A, 0x8189, + 0xC46B, 0x818B, 0xC46C, 0x818C, 0xC46D, 0x818D, 0xC46E, 0x818E, + 0xC46F, 0x8190, 0xC470, 0x8192, 0xC471, 0x8193, 0xC472, 0x8194, + 0xC473, 0x8195, 0xC474, 0x8196, 0xC475, 0x8197, 0xC476, 0x8199, + 0xC477, 0x819A, 0xC478, 0x819E, 0xC479, 0x819F, 0xC47A, 0x81A0, + 0xC47B, 0x81A1, 0xC47C, 0x81A2, 0xC47D, 0x81A4, 0xC47E, 0x81A5, + 0xC480, 0x81A7, 0xC481, 0x81A9, 0xC482, 0x81AB, 0xC483, 0x81AC, + 0xC484, 0x81AD, 0xC485, 0x81AE, 0xC486, 0x81AF, 0xC487, 0x81B0, + 0xC488, 0x81B1, 0xC489, 0x81B2, 0xC48A, 0x81B4, 0xC48B, 0x81B5, + 0xC48C, 0x81B6, 0xC48D, 0x81B7, 0xC48E, 0x81B8, 0xC48F, 0x81B9, + 0xC490, 0x81BC, 0xC491, 0x81BD, 0xC492, 0x81BE, 0xC493, 0x81BF, + 0xC494, 0x81C4, 0xC495, 0x81C5, 0xC496, 0x81C7, 0xC497, 0x81C8, + 0xC498, 0x81C9, 0xC499, 0x81CB, 0xC49A, 0x81CD, 0xC49B, 0x81CE, + 0xC49C, 0x81CF, 0xC49D, 0x81D0, 0xC49E, 0x81D1, 0xC49F, 0x81D2, + 0xC4A0, 0x81D3, 0xC4A1, 0x6479, 0xC4A2, 0x8611, 0xC4A3, 0x6A21, + 0xC4A4, 0x819C, 0xC4A5, 0x78E8, 0xC4A6, 0x6469, 0xC4A7, 0x9B54, + 0xC4A8, 0x62B9, 0xC4A9, 0x672B, 0xC4AA, 0x83AB, 0xC4AB, 0x58A8, + 0xC4AC, 0x9ED8, 0xC4AD, 0x6CAB, 0xC4AE, 0x6F20, 0xC4AF, 0x5BDE, + 0xC4B0, 0x964C, 0xC4B1, 0x8C0B, 0xC4B2, 0x725F, 0xC4B3, 0x67D0, + 0xC4B4, 0x62C7, 0xC4B5, 0x7261, 0xC4B6, 0x4EA9, 0xC4B7, 0x59C6, + 0xC4B8, 0x6BCD, 0xC4B9, 0x5893, 0xC4BA, 0x66AE, 0xC4BB, 0x5E55, + 0xC4BC, 0x52DF, 0xC4BD, 0x6155, 0xC4BE, 0x6728, 0xC4BF, 0x76EE, + 0xC4C0, 0x7766, 0xC4C1, 0x7267, 0xC4C2, 0x7A46, 0xC4C3, 0x62FF, + 0xC4C4, 0x54EA, 0xC4C5, 0x5450, 0xC4C6, 0x94A0, 0xC4C7, 0x90A3, + 0xC4C8, 0x5A1C, 0xC4C9, 0x7EB3, 0xC4CA, 0x6C16, 0xC4CB, 0x4E43, + 0xC4CC, 0x5976, 0xC4CD, 0x8010, 0xC4CE, 0x5948, 0xC4CF, 0x5357, + 0xC4D0, 0x7537, 0xC4D1, 0x96BE, 0xC4D2, 0x56CA, 0xC4D3, 0x6320, + 0xC4D4, 0x8111, 0xC4D5, 0x607C, 0xC4D6, 0x95F9, 0xC4D7, 0x6DD6, + 0xC4D8, 0x5462, 0xC4D9, 0x9981, 0xC4DA, 0x5185, 0xC4DB, 0x5AE9, + 0xC4DC, 0x80FD, 0xC4DD, 0x59AE, 0xC4DE, 0x9713, 0xC4DF, 0x502A, + 0xC4E0, 0x6CE5, 0xC4E1, 0x5C3C, 0xC4E2, 0x62DF, 0xC4E3, 0x4F60, + 0xC4E4, 0x533F, 0xC4E5, 0x817B, 0xC4E6, 0x9006, 0xC4E7, 0x6EBA, + 0xC4E8, 0x852B, 0xC4E9, 0x62C8, 0xC4EA, 0x5E74, 0xC4EB, 0x78BE, + 0xC4EC, 0x64B5, 0xC4ED, 0x637B, 0xC4EE, 0x5FF5, 0xC4EF, 0x5A18, + 0xC4F0, 0x917F, 0xC4F1, 0x9E1F, 0xC4F2, 0x5C3F, 0xC4F3, 0x634F, + 0xC4F4, 0x8042, 0xC4F5, 0x5B7D, 0xC4F6, 0x556E, 0xC4F7, 0x954A, + 0xC4F8, 0x954D, 0xC4F9, 0x6D85, 0xC4FA, 0x60A8, 0xC4FB, 0x67E0, + 0xC4FC, 0x72DE, 0xC4FD, 0x51DD, 0xC4FE, 0x5B81, 0xC540, 0x81D4, + 0xC541, 0x81D5, 0xC542, 0x81D6, 0xC543, 0x81D7, 0xC544, 0x81D8, + 0xC545, 0x81D9, 0xC546, 0x81DA, 0xC547, 0x81DB, 0xC548, 0x81DC, + 0xC549, 0x81DD, 0xC54A, 0x81DE, 0xC54B, 0x81DF, 0xC54C, 0x81E0, + 0xC54D, 0x81E1, 0xC54E, 0x81E2, 0xC54F, 0x81E4, 0xC550, 0x81E5, + 0xC551, 0x81E6, 0xC552, 0x81E8, 0xC553, 0x81E9, 0xC554, 0x81EB, + 0xC555, 0x81EE, 0xC556, 0x81EF, 0xC557, 0x81F0, 0xC558, 0x81F1, + 0xC559, 0x81F2, 0xC55A, 0x81F5, 0xC55B, 0x81F6, 0xC55C, 0x81F7, + 0xC55D, 0x81F8, 0xC55E, 0x81F9, 0xC55F, 0x81FA, 0xC560, 0x81FD, + 0xC561, 0x81FF, 0xC562, 0x8203, 0xC563, 0x8207, 0xC564, 0x8208, + 0xC565, 0x8209, 0xC566, 0x820A, 0xC567, 0x820B, 0xC568, 0x820E, + 0xC569, 0x820F, 0xC56A, 0x8211, 0xC56B, 0x8213, 0xC56C, 0x8215, + 0xC56D, 0x8216, 0xC56E, 0x8217, 0xC56F, 0x8218, 0xC570, 0x8219, + 0xC571, 0x821A, 0xC572, 0x821D, 0xC573, 0x8220, 0xC574, 0x8224, + 0xC575, 0x8225, 0xC576, 0x8226, 0xC577, 0x8227, 0xC578, 0x8229, + 0xC579, 0x822E, 0xC57A, 0x8232, 0xC57B, 0x823A, 0xC57C, 0x823C, + 0xC57D, 0x823D, 0xC57E, 0x823F, 0xC580, 0x8240, 0xC581, 0x8241, + 0xC582, 0x8242, 0xC583, 0x8243, 0xC584, 0x8245, 0xC585, 0x8246, + 0xC586, 0x8248, 0xC587, 0x824A, 0xC588, 0x824C, 0xC589, 0x824D, + 0xC58A, 0x824E, 0xC58B, 0x8250, 0xC58C, 0x8251, 0xC58D, 0x8252, + 0xC58E, 0x8253, 0xC58F, 0x8254, 0xC590, 0x8255, 0xC591, 0x8256, + 0xC592, 0x8257, 0xC593, 0x8259, 0xC594, 0x825B, 0xC595, 0x825C, + 0xC596, 0x825D, 0xC597, 0x825E, 0xC598, 0x8260, 0xC599, 0x8261, + 0xC59A, 0x8262, 0xC59B, 0x8263, 0xC59C, 0x8264, 0xC59D, 0x8265, + 0xC59E, 0x8266, 0xC59F, 0x8267, 0xC5A0, 0x8269, 0xC5A1, 0x62E7, + 0xC5A2, 0x6CDE, 0xC5A3, 0x725B, 0xC5A4, 0x626D, 0xC5A5, 0x94AE, + 0xC5A6, 0x7EBD, 0xC5A7, 0x8113, 0xC5A8, 0x6D53, 0xC5A9, 0x519C, + 0xC5AA, 0x5F04, 0xC5AB, 0x5974, 0xC5AC, 0x52AA, 0xC5AD, 0x6012, + 0xC5AE, 0x5973, 0xC5AF, 0x6696, 0xC5B0, 0x8650, 0xC5B1, 0x759F, + 0xC5B2, 0x632A, 0xC5B3, 0x61E6, 0xC5B4, 0x7CEF, 0xC5B5, 0x8BFA, + 0xC5B6, 0x54E6, 0xC5B7, 0x6B27, 0xC5B8, 0x9E25, 0xC5B9, 0x6BB4, + 0xC5BA, 0x85D5, 0xC5BB, 0x5455, 0xC5BC, 0x5076, 0xC5BD, 0x6CA4, + 0xC5BE, 0x556A, 0xC5BF, 0x8DB4, 0xC5C0, 0x722C, 0xC5C1, 0x5E15, + 0xC5C2, 0x6015, 0xC5C3, 0x7436, 0xC5C4, 0x62CD, 0xC5C5, 0x6392, + 0xC5C6, 0x724C, 0xC5C7, 0x5F98, 0xC5C8, 0x6E43, 0xC5C9, 0x6D3E, + 0xC5CA, 0x6500, 0xC5CB, 0x6F58, 0xC5CC, 0x76D8, 0xC5CD, 0x78D0, + 0xC5CE, 0x76FC, 0xC5CF, 0x7554, 0xC5D0, 0x5224, 0xC5D1, 0x53DB, + 0xC5D2, 0x4E53, 0xC5D3, 0x5E9E, 0xC5D4, 0x65C1, 0xC5D5, 0x802A, + 0xC5D6, 0x80D6, 0xC5D7, 0x629B, 0xC5D8, 0x5486, 0xC5D9, 0x5228, + 0xC5DA, 0x70AE, 0xC5DB, 0x888D, 0xC5DC, 0x8DD1, 0xC5DD, 0x6CE1, + 0xC5DE, 0x5478, 0xC5DF, 0x80DA, 0xC5E0, 0x57F9, 0xC5E1, 0x88F4, + 0xC5E2, 0x8D54, 0xC5E3, 0x966A, 0xC5E4, 0x914D, 0xC5E5, 0x4F69, + 0xC5E6, 0x6C9B, 0xC5E7, 0x55B7, 0xC5E8, 0x76C6, 0xC5E9, 0x7830, + 0xC5EA, 0x62A8, 0xC5EB, 0x70F9, 0xC5EC, 0x6F8E, 0xC5ED, 0x5F6D, + 0xC5EE, 0x84EC, 0xC5EF, 0x68DA, 0xC5F0, 0x787C, 0xC5F1, 0x7BF7, + 0xC5F2, 0x81A8, 0xC5F3, 0x670B, 0xC5F4, 0x9E4F, 0xC5F5, 0x6367, + 0xC5F6, 0x78B0, 0xC5F7, 0x576F, 0xC5F8, 0x7812, 0xC5F9, 0x9739, + 0xC5FA, 0x6279, 0xC5FB, 0x62AB, 0xC5FC, 0x5288, 0xC5FD, 0x7435, + 0xC5FE, 0x6BD7, 0xC640, 0x826A, 0xC641, 0x826B, 0xC642, 0x826C, + 0xC643, 0x826D, 0xC644, 0x8271, 0xC645, 0x8275, 0xC646, 0x8276, + 0xC647, 0x8277, 0xC648, 0x8278, 0xC649, 0x827B, 0xC64A, 0x827C, + 0xC64B, 0x8280, 0xC64C, 0x8281, 0xC64D, 0x8283, 0xC64E, 0x8285, + 0xC64F, 0x8286, 0xC650, 0x8287, 0xC651, 0x8289, 0xC652, 0x828C, + 0xC653, 0x8290, 0xC654, 0x8293, 0xC655, 0x8294, 0xC656, 0x8295, + 0xC657, 0x8296, 0xC658, 0x829A, 0xC659, 0x829B, 0xC65A, 0x829E, + 0xC65B, 0x82A0, 0xC65C, 0x82A2, 0xC65D, 0x82A3, 0xC65E, 0x82A7, + 0xC65F, 0x82B2, 0xC660, 0x82B5, 0xC661, 0x82B6, 0xC662, 0x82BA, + 0xC663, 0x82BB, 0xC664, 0x82BC, 0xC665, 0x82BF, 0xC666, 0x82C0, + 0xC667, 0x82C2, 0xC668, 0x82C3, 0xC669, 0x82C5, 0xC66A, 0x82C6, + 0xC66B, 0x82C9, 0xC66C, 0x82D0, 0xC66D, 0x82D6, 0xC66E, 0x82D9, + 0xC66F, 0x82DA, 0xC670, 0x82DD, 0xC671, 0x82E2, 0xC672, 0x82E7, + 0xC673, 0x82E8, 0xC674, 0x82E9, 0xC675, 0x82EA, 0xC676, 0x82EC, + 0xC677, 0x82ED, 0xC678, 0x82EE, 0xC679, 0x82F0, 0xC67A, 0x82F2, + 0xC67B, 0x82F3, 0xC67C, 0x82F5, 0xC67D, 0x82F6, 0xC67E, 0x82F8, + 0xC680, 0x82FA, 0xC681, 0x82FC, 0xC682, 0x82FD, 0xC683, 0x82FE, + 0xC684, 0x82FF, 0xC685, 0x8300, 0xC686, 0x830A, 0xC687, 0x830B, + 0xC688, 0x830D, 0xC689, 0x8310, 0xC68A, 0x8312, 0xC68B, 0x8313, + 0xC68C, 0x8316, 0xC68D, 0x8318, 0xC68E, 0x8319, 0xC68F, 0x831D, + 0xC690, 0x831E, 0xC691, 0x831F, 0xC692, 0x8320, 0xC693, 0x8321, + 0xC694, 0x8322, 0xC695, 0x8323, 0xC696, 0x8324, 0xC697, 0x8325, + 0xC698, 0x8326, 0xC699, 0x8329, 0xC69A, 0x832A, 0xC69B, 0x832E, + 0xC69C, 0x8330, 0xC69D, 0x8332, 0xC69E, 0x8337, 0xC69F, 0x833B, + 0xC6A0, 0x833D, 0xC6A1, 0x5564, 0xC6A2, 0x813E, 0xC6A3, 0x75B2, + 0xC6A4, 0x76AE, 0xC6A5, 0x5339, 0xC6A6, 0x75DE, 0xC6A7, 0x50FB, + 0xC6A8, 0x5C41, 0xC6A9, 0x8B6C, 0xC6AA, 0x7BC7, 0xC6AB, 0x504F, + 0xC6AC, 0x7247, 0xC6AD, 0x9A97, 0xC6AE, 0x98D8, 0xC6AF, 0x6F02, + 0xC6B0, 0x74E2, 0xC6B1, 0x7968, 0xC6B2, 0x6487, 0xC6B3, 0x77A5, + 0xC6B4, 0x62FC, 0xC6B5, 0x9891, 0xC6B6, 0x8D2B, 0xC6B7, 0x54C1, + 0xC6B8, 0x8058, 0xC6B9, 0x4E52, 0xC6BA, 0x576A, 0xC6BB, 0x82F9, + 0xC6BC, 0x840D, 0xC6BD, 0x5E73, 0xC6BE, 0x51ED, 0xC6BF, 0x74F6, + 0xC6C0, 0x8BC4, 0xC6C1, 0x5C4F, 0xC6C2, 0x5761, 0xC6C3, 0x6CFC, + 0xC6C4, 0x9887, 0xC6C5, 0x5A46, 0xC6C6, 0x7834, 0xC6C7, 0x9B44, + 0xC6C8, 0x8FEB, 0xC6C9, 0x7C95, 0xC6CA, 0x5256, 0xC6CB, 0x6251, + 0xC6CC, 0x94FA, 0xC6CD, 0x4EC6, 0xC6CE, 0x8386, 0xC6CF, 0x8461, + 0xC6D0, 0x83E9, 0xC6D1, 0x84B2, 0xC6D2, 0x57D4, 0xC6D3, 0x6734, + 0xC6D4, 0x5703, 0xC6D5, 0x666E, 0xC6D6, 0x6D66, 0xC6D7, 0x8C31, + 0xC6D8, 0x66DD, 0xC6D9, 0x7011, 0xC6DA, 0x671F, 0xC6DB, 0x6B3A, + 0xC6DC, 0x6816, 0xC6DD, 0x621A, 0xC6DE, 0x59BB, 0xC6DF, 0x4E03, + 0xC6E0, 0x51C4, 0xC6E1, 0x6F06, 0xC6E2, 0x67D2, 0xC6E3, 0x6C8F, + 0xC6E4, 0x5176, 0xC6E5, 0x68CB, 0xC6E6, 0x5947, 0xC6E7, 0x6B67, + 0xC6E8, 0x7566, 0xC6E9, 0x5D0E, 0xC6EA, 0x8110, 0xC6EB, 0x9F50, + 0xC6EC, 0x65D7, 0xC6ED, 0x7948, 0xC6EE, 0x7941, 0xC6EF, 0x9A91, + 0xC6F0, 0x8D77, 0xC6F1, 0x5C82, 0xC6F2, 0x4E5E, 0xC6F3, 0x4F01, + 0xC6F4, 0x542F, 0xC6F5, 0x5951, 0xC6F6, 0x780C, 0xC6F7, 0x5668, + 0xC6F8, 0x6C14, 0xC6F9, 0x8FC4, 0xC6FA, 0x5F03, 0xC6FB, 0x6C7D, + 0xC6FC, 0x6CE3, 0xC6FD, 0x8BAB, 0xC6FE, 0x6390, 0xC740, 0x833E, + 0xC741, 0x833F, 0xC742, 0x8341, 0xC743, 0x8342, 0xC744, 0x8344, + 0xC745, 0x8345, 0xC746, 0x8348, 0xC747, 0x834A, 0xC748, 0x834B, + 0xC749, 0x834C, 0xC74A, 0x834D, 0xC74B, 0x834E, 0xC74C, 0x8353, + 0xC74D, 0x8355, 0xC74E, 0x8356, 0xC74F, 0x8357, 0xC750, 0x8358, + 0xC751, 0x8359, 0xC752, 0x835D, 0xC753, 0x8362, 0xC754, 0x8370, + 0xC755, 0x8371, 0xC756, 0x8372, 0xC757, 0x8373, 0xC758, 0x8374, + 0xC759, 0x8375, 0xC75A, 0x8376, 0xC75B, 0x8379, 0xC75C, 0x837A, + 0xC75D, 0x837E, 0xC75E, 0x837F, 0xC75F, 0x8380, 0xC760, 0x8381, + 0xC761, 0x8382, 0xC762, 0x8383, 0xC763, 0x8384, 0xC764, 0x8387, + 0xC765, 0x8388, 0xC766, 0x838A, 0xC767, 0x838B, 0xC768, 0x838C, + 0xC769, 0x838D, 0xC76A, 0x838F, 0xC76B, 0x8390, 0xC76C, 0x8391, + 0xC76D, 0x8394, 0xC76E, 0x8395, 0xC76F, 0x8396, 0xC770, 0x8397, + 0xC771, 0x8399, 0xC772, 0x839A, 0xC773, 0x839D, 0xC774, 0x839F, + 0xC775, 0x83A1, 0xC776, 0x83A2, 0xC777, 0x83A3, 0xC778, 0x83A4, + 0xC779, 0x83A5, 0xC77A, 0x83A6, 0xC77B, 0x83A7, 0xC77C, 0x83AC, + 0xC77D, 0x83AD, 0xC77E, 0x83AE, 0xC780, 0x83AF, 0xC781, 0x83B5, + 0xC782, 0x83BB, 0xC783, 0x83BE, 0xC784, 0x83BF, 0xC785, 0x83C2, + 0xC786, 0x83C3, 0xC787, 0x83C4, 0xC788, 0x83C6, 0xC789, 0x83C8, + 0xC78A, 0x83C9, 0xC78B, 0x83CB, 0xC78C, 0x83CD, 0xC78D, 0x83CE, + 0xC78E, 0x83D0, 0xC78F, 0x83D1, 0xC790, 0x83D2, 0xC791, 0x83D3, + 0xC792, 0x83D5, 0xC793, 0x83D7, 0xC794, 0x83D9, 0xC795, 0x83DA, + 0xC796, 0x83DB, 0xC797, 0x83DE, 0xC798, 0x83E2, 0xC799, 0x83E3, + 0xC79A, 0x83E4, 0xC79B, 0x83E6, 0xC79C, 0x83E7, 0xC79D, 0x83E8, + 0xC79E, 0x83EB, 0xC79F, 0x83EC, 0xC7A0, 0x83ED, 0xC7A1, 0x6070, + 0xC7A2, 0x6D3D, 0xC7A3, 0x7275, 0xC7A4, 0x6266, 0xC7A5, 0x948E, + 0xC7A6, 0x94C5, 0xC7A7, 0x5343, 0xC7A8, 0x8FC1, 0xC7A9, 0x7B7E, + 0xC7AA, 0x4EDF, 0xC7AB, 0x8C26, 0xC7AC, 0x4E7E, 0xC7AD, 0x9ED4, + 0xC7AE, 0x94B1, 0xC7AF, 0x94B3, 0xC7B0, 0x524D, 0xC7B1, 0x6F5C, + 0xC7B2, 0x9063, 0xC7B3, 0x6D45, 0xC7B4, 0x8C34, 0xC7B5, 0x5811, + 0xC7B6, 0x5D4C, 0xC7B7, 0x6B20, 0xC7B8, 0x6B49, 0xC7B9, 0x67AA, + 0xC7BA, 0x545B, 0xC7BB, 0x8154, 0xC7BC, 0x7F8C, 0xC7BD, 0x5899, + 0xC7BE, 0x8537, 0xC7BF, 0x5F3A, 0xC7C0, 0x62A2, 0xC7C1, 0x6A47, + 0xC7C2, 0x9539, 0xC7C3, 0x6572, 0xC7C4, 0x6084, 0xC7C5, 0x6865, + 0xC7C6, 0x77A7, 0xC7C7, 0x4E54, 0xC7C8, 0x4FA8, 0xC7C9, 0x5DE7, + 0xC7CA, 0x9798, 0xC7CB, 0x64AC, 0xC7CC, 0x7FD8, 0xC7CD, 0x5CED, + 0xC7CE, 0x4FCF, 0xC7CF, 0x7A8D, 0xC7D0, 0x5207, 0xC7D1, 0x8304, + 0xC7D2, 0x4E14, 0xC7D3, 0x602F, 0xC7D4, 0x7A83, 0xC7D5, 0x94A6, + 0xC7D6, 0x4FB5, 0xC7D7, 0x4EB2, 0xC7D8, 0x79E6, 0xC7D9, 0x7434, + 0xC7DA, 0x52E4, 0xC7DB, 0x82B9, 0xC7DC, 0x64D2, 0xC7DD, 0x79BD, + 0xC7DE, 0x5BDD, 0xC7DF, 0x6C81, 0xC7E0, 0x9752, 0xC7E1, 0x8F7B, + 0xC7E2, 0x6C22, 0xC7E3, 0x503E, 0xC7E4, 0x537F, 0xC7E5, 0x6E05, + 0xC7E6, 0x64CE, 0xC7E7, 0x6674, 0xC7E8, 0x6C30, 0xC7E9, 0x60C5, + 0xC7EA, 0x9877, 0xC7EB, 0x8BF7, 0xC7EC, 0x5E86, 0xC7ED, 0x743C, + 0xC7EE, 0x7A77, 0xC7EF, 0x79CB, 0xC7F0, 0x4E18, 0xC7F1, 0x90B1, + 0xC7F2, 0x7403, 0xC7F3, 0x6C42, 0xC7F4, 0x56DA, 0xC7F5, 0x914B, + 0xC7F6, 0x6CC5, 0xC7F7, 0x8D8B, 0xC7F8, 0x533A, 0xC7F9, 0x86C6, + 0xC7FA, 0x66F2, 0xC7FB, 0x8EAF, 0xC7FC, 0x5C48, 0xC7FD, 0x9A71, + 0xC7FE, 0x6E20, 0xC840, 0x83EE, 0xC841, 0x83EF, 0xC842, 0x83F3, + 0xC843, 0x83F4, 0xC844, 0x83F5, 0xC845, 0x83F6, 0xC846, 0x83F7, + 0xC847, 0x83FA, 0xC848, 0x83FB, 0xC849, 0x83FC, 0xC84A, 0x83FE, + 0xC84B, 0x83FF, 0xC84C, 0x8400, 0xC84D, 0x8402, 0xC84E, 0x8405, + 0xC84F, 0x8407, 0xC850, 0x8408, 0xC851, 0x8409, 0xC852, 0x840A, + 0xC853, 0x8410, 0xC854, 0x8412, 0xC855, 0x8413, 0xC856, 0x8414, + 0xC857, 0x8415, 0xC858, 0x8416, 0xC859, 0x8417, 0xC85A, 0x8419, + 0xC85B, 0x841A, 0xC85C, 0x841B, 0xC85D, 0x841E, 0xC85E, 0x841F, + 0xC85F, 0x8420, 0xC860, 0x8421, 0xC861, 0x8422, 0xC862, 0x8423, + 0xC863, 0x8429, 0xC864, 0x842A, 0xC865, 0x842B, 0xC866, 0x842C, + 0xC867, 0x842D, 0xC868, 0x842E, 0xC869, 0x842F, 0xC86A, 0x8430, + 0xC86B, 0x8432, 0xC86C, 0x8433, 0xC86D, 0x8434, 0xC86E, 0x8435, + 0xC86F, 0x8436, 0xC870, 0x8437, 0xC871, 0x8439, 0xC872, 0x843A, + 0xC873, 0x843B, 0xC874, 0x843E, 0xC875, 0x843F, 0xC876, 0x8440, + 0xC877, 0x8441, 0xC878, 0x8442, 0xC879, 0x8443, 0xC87A, 0x8444, + 0xC87B, 0x8445, 0xC87C, 0x8447, 0xC87D, 0x8448, 0xC87E, 0x8449, + 0xC880, 0x844A, 0xC881, 0x844B, 0xC882, 0x844C, 0xC883, 0x844D, + 0xC884, 0x844E, 0xC885, 0x844F, 0xC886, 0x8450, 0xC887, 0x8452, + 0xC888, 0x8453, 0xC889, 0x8454, 0xC88A, 0x8455, 0xC88B, 0x8456, + 0xC88C, 0x8458, 0xC88D, 0x845D, 0xC88E, 0x845E, 0xC88F, 0x845F, + 0xC890, 0x8460, 0xC891, 0x8462, 0xC892, 0x8464, 0xC893, 0x8465, + 0xC894, 0x8466, 0xC895, 0x8467, 0xC896, 0x8468, 0xC897, 0x846A, + 0xC898, 0x846E, 0xC899, 0x846F, 0xC89A, 0x8470, 0xC89B, 0x8472, + 0xC89C, 0x8474, 0xC89D, 0x8477, 0xC89E, 0x8479, 0xC89F, 0x847B, + 0xC8A0, 0x847C, 0xC8A1, 0x53D6, 0xC8A2, 0x5A36, 0xC8A3, 0x9F8B, + 0xC8A4, 0x8DA3, 0xC8A5, 0x53BB, 0xC8A6, 0x5708, 0xC8A7, 0x98A7, + 0xC8A8, 0x6743, 0xC8A9, 0x919B, 0xC8AA, 0x6CC9, 0xC8AB, 0x5168, + 0xC8AC, 0x75CA, 0xC8AD, 0x62F3, 0xC8AE, 0x72AC, 0xC8AF, 0x5238, + 0xC8B0, 0x529D, 0xC8B1, 0x7F3A, 0xC8B2, 0x7094, 0xC8B3, 0x7638, + 0xC8B4, 0x5374, 0xC8B5, 0x9E4A, 0xC8B6, 0x69B7, 0xC8B7, 0x786E, + 0xC8B8, 0x96C0, 0xC8B9, 0x88D9, 0xC8BA, 0x7FA4, 0xC8BB, 0x7136, + 0xC8BC, 0x71C3, 0xC8BD, 0x5189, 0xC8BE, 0x67D3, 0xC8BF, 0x74E4, + 0xC8C0, 0x58E4, 0xC8C1, 0x6518, 0xC8C2, 0x56B7, 0xC8C3, 0x8BA9, + 0xC8C4, 0x9976, 0xC8C5, 0x6270, 0xC8C6, 0x7ED5, 0xC8C7, 0x60F9, + 0xC8C8, 0x70ED, 0xC8C9, 0x58EC, 0xC8CA, 0x4EC1, 0xC8CB, 0x4EBA, + 0xC8CC, 0x5FCD, 0xC8CD, 0x97E7, 0xC8CE, 0x4EFB, 0xC8CF, 0x8BA4, + 0xC8D0, 0x5203, 0xC8D1, 0x598A, 0xC8D2, 0x7EAB, 0xC8D3, 0x6254, + 0xC8D4, 0x4ECD, 0xC8D5, 0x65E5, 0xC8D6, 0x620E, 0xC8D7, 0x8338, + 0xC8D8, 0x84C9, 0xC8D9, 0x8363, 0xC8DA, 0x878D, 0xC8DB, 0x7194, + 0xC8DC, 0x6EB6, 0xC8DD, 0x5BB9, 0xC8DE, 0x7ED2, 0xC8DF, 0x5197, + 0xC8E0, 0x63C9, 0xC8E1, 0x67D4, 0xC8E2, 0x8089, 0xC8E3, 0x8339, + 0xC8E4, 0x8815, 0xC8E5, 0x5112, 0xC8E6, 0x5B7A, 0xC8E7, 0x5982, + 0xC8E8, 0x8FB1, 0xC8E9, 0x4E73, 0xC8EA, 0x6C5D, 0xC8EB, 0x5165, + 0xC8EC, 0x8925, 0xC8ED, 0x8F6F, 0xC8EE, 0x962E, 0xC8EF, 0x854A, + 0xC8F0, 0x745E, 0xC8F1, 0x9510, 0xC8F2, 0x95F0, 0xC8F3, 0x6DA6, + 0xC8F4, 0x82E5, 0xC8F5, 0x5F31, 0xC8F6, 0x6492, 0xC8F7, 0x6D12, + 0xC8F8, 0x8428, 0xC8F9, 0x816E, 0xC8FA, 0x9CC3, 0xC8FB, 0x585E, + 0xC8FC, 0x8D5B, 0xC8FD, 0x4E09, 0xC8FE, 0x53C1, 0xC940, 0x847D, + 0xC941, 0x847E, 0xC942, 0x847F, 0xC943, 0x8480, 0xC944, 0x8481, + 0xC945, 0x8483, 0xC946, 0x8484, 0xC947, 0x8485, 0xC948, 0x8486, + 0xC949, 0x848A, 0xC94A, 0x848D, 0xC94B, 0x848F, 0xC94C, 0x8490, + 0xC94D, 0x8491, 0xC94E, 0x8492, 0xC94F, 0x8493, 0xC950, 0x8494, + 0xC951, 0x8495, 0xC952, 0x8496, 0xC953, 0x8498, 0xC954, 0x849A, + 0xC955, 0x849B, 0xC956, 0x849D, 0xC957, 0x849E, 0xC958, 0x849F, + 0xC959, 0x84A0, 0xC95A, 0x84A2, 0xC95B, 0x84A3, 0xC95C, 0x84A4, + 0xC95D, 0x84A5, 0xC95E, 0x84A6, 0xC95F, 0x84A7, 0xC960, 0x84A8, + 0xC961, 0x84A9, 0xC962, 0x84AA, 0xC963, 0x84AB, 0xC964, 0x84AC, + 0xC965, 0x84AD, 0xC966, 0x84AE, 0xC967, 0x84B0, 0xC968, 0x84B1, + 0xC969, 0x84B3, 0xC96A, 0x84B5, 0xC96B, 0x84B6, 0xC96C, 0x84B7, + 0xC96D, 0x84BB, 0xC96E, 0x84BC, 0xC96F, 0x84BE, 0xC970, 0x84C0, + 0xC971, 0x84C2, 0xC972, 0x84C3, 0xC973, 0x84C5, 0xC974, 0x84C6, + 0xC975, 0x84C7, 0xC976, 0x84C8, 0xC977, 0x84CB, 0xC978, 0x84CC, + 0xC979, 0x84CE, 0xC97A, 0x84CF, 0xC97B, 0x84D2, 0xC97C, 0x84D4, + 0xC97D, 0x84D5, 0xC97E, 0x84D7, 0xC980, 0x84D8, 0xC981, 0x84D9, + 0xC982, 0x84DA, 0xC983, 0x84DB, 0xC984, 0x84DC, 0xC985, 0x84DE, + 0xC986, 0x84E1, 0xC987, 0x84E2, 0xC988, 0x84E4, 0xC989, 0x84E7, + 0xC98A, 0x84E8, 0xC98B, 0x84E9, 0xC98C, 0x84EA, 0xC98D, 0x84EB, + 0xC98E, 0x84ED, 0xC98F, 0x84EE, 0xC990, 0x84EF, 0xC991, 0x84F1, + 0xC992, 0x84F2, 0xC993, 0x84F3, 0xC994, 0x84F4, 0xC995, 0x84F5, + 0xC996, 0x84F6, 0xC997, 0x84F7, 0xC998, 0x84F8, 0xC999, 0x84F9, + 0xC99A, 0x84FA, 0xC99B, 0x84FB, 0xC99C, 0x84FD, 0xC99D, 0x84FE, + 0xC99E, 0x8500, 0xC99F, 0x8501, 0xC9A0, 0x8502, 0xC9A1, 0x4F1E, + 0xC9A2, 0x6563, 0xC9A3, 0x6851, 0xC9A4, 0x55D3, 0xC9A5, 0x4E27, + 0xC9A6, 0x6414, 0xC9A7, 0x9A9A, 0xC9A8, 0x626B, 0xC9A9, 0x5AC2, + 0xC9AA, 0x745F, 0xC9AB, 0x8272, 0xC9AC, 0x6DA9, 0xC9AD, 0x68EE, + 0xC9AE, 0x50E7, 0xC9AF, 0x838E, 0xC9B0, 0x7802, 0xC9B1, 0x6740, + 0xC9B2, 0x5239, 0xC9B3, 0x6C99, 0xC9B4, 0x7EB1, 0xC9B5, 0x50BB, + 0xC9B6, 0x5565, 0xC9B7, 0x715E, 0xC9B8, 0x7B5B, 0xC9B9, 0x6652, + 0xC9BA, 0x73CA, 0xC9BB, 0x82EB, 0xC9BC, 0x6749, 0xC9BD, 0x5C71, + 0xC9BE, 0x5220, 0xC9BF, 0x717D, 0xC9C0, 0x886B, 0xC9C1, 0x95EA, + 0xC9C2, 0x9655, 0xC9C3, 0x64C5, 0xC9C4, 0x8D61, 0xC9C5, 0x81B3, + 0xC9C6, 0x5584, 0xC9C7, 0x6C55, 0xC9C8, 0x6247, 0xC9C9, 0x7F2E, + 0xC9CA, 0x5892, 0xC9CB, 0x4F24, 0xC9CC, 0x5546, 0xC9CD, 0x8D4F, + 0xC9CE, 0x664C, 0xC9CF, 0x4E0A, 0xC9D0, 0x5C1A, 0xC9D1, 0x88F3, + 0xC9D2, 0x68A2, 0xC9D3, 0x634E, 0xC9D4, 0x7A0D, 0xC9D5, 0x70E7, + 0xC9D6, 0x828D, 0xC9D7, 0x52FA, 0xC9D8, 0x97F6, 0xC9D9, 0x5C11, + 0xC9DA, 0x54E8, 0xC9DB, 0x90B5, 0xC9DC, 0x7ECD, 0xC9DD, 0x5962, + 0xC9DE, 0x8D4A, 0xC9DF, 0x86C7, 0xC9E0, 0x820C, 0xC9E1, 0x820D, + 0xC9E2, 0x8D66, 0xC9E3, 0x6444, 0xC9E4, 0x5C04, 0xC9E5, 0x6151, + 0xC9E6, 0x6D89, 0xC9E7, 0x793E, 0xC9E8, 0x8BBE, 0xC9E9, 0x7837, + 0xC9EA, 0x7533, 0xC9EB, 0x547B, 0xC9EC, 0x4F38, 0xC9ED, 0x8EAB, + 0xC9EE, 0x6DF1, 0xC9EF, 0x5A20, 0xC9F0, 0x7EC5, 0xC9F1, 0x795E, + 0xC9F2, 0x6C88, 0xC9F3, 0x5BA1, 0xC9F4, 0x5A76, 0xC9F5, 0x751A, + 0xC9F6, 0x80BE, 0xC9F7, 0x614E, 0xC9F8, 0x6E17, 0xC9F9, 0x58F0, + 0xC9FA, 0x751F, 0xC9FB, 0x7525, 0xC9FC, 0x7272, 0xC9FD, 0x5347, + 0xC9FE, 0x7EF3, 0xCA40, 0x8503, 0xCA41, 0x8504, 0xCA42, 0x8505, + 0xCA43, 0x8506, 0xCA44, 0x8507, 0xCA45, 0x8508, 0xCA46, 0x8509, + 0xCA47, 0x850A, 0xCA48, 0x850B, 0xCA49, 0x850D, 0xCA4A, 0x850E, + 0xCA4B, 0x850F, 0xCA4C, 0x8510, 0xCA4D, 0x8512, 0xCA4E, 0x8514, + 0xCA4F, 0x8515, 0xCA50, 0x8516, 0xCA51, 0x8518, 0xCA52, 0x8519, + 0xCA53, 0x851B, 0xCA54, 0x851C, 0xCA55, 0x851D, 0xCA56, 0x851E, + 0xCA57, 0x8520, 0xCA58, 0x8522, 0xCA59, 0x8523, 0xCA5A, 0x8524, + 0xCA5B, 0x8525, 0xCA5C, 0x8526, 0xCA5D, 0x8527, 0xCA5E, 0x8528, + 0xCA5F, 0x8529, 0xCA60, 0x852A, 0xCA61, 0x852D, 0xCA62, 0x852E, + 0xCA63, 0x852F, 0xCA64, 0x8530, 0xCA65, 0x8531, 0xCA66, 0x8532, + 0xCA67, 0x8533, 0xCA68, 0x8534, 0xCA69, 0x8535, 0xCA6A, 0x8536, + 0xCA6B, 0x853E, 0xCA6C, 0x853F, 0xCA6D, 0x8540, 0xCA6E, 0x8541, + 0xCA6F, 0x8542, 0xCA70, 0x8544, 0xCA71, 0x8545, 0xCA72, 0x8546, + 0xCA73, 0x8547, 0xCA74, 0x854B, 0xCA75, 0x854C, 0xCA76, 0x854D, + 0xCA77, 0x854E, 0xCA78, 0x854F, 0xCA79, 0x8550, 0xCA7A, 0x8551, + 0xCA7B, 0x8552, 0xCA7C, 0x8553, 0xCA7D, 0x8554, 0xCA7E, 0x8555, + 0xCA80, 0x8557, 0xCA81, 0x8558, 0xCA82, 0x855A, 0xCA83, 0x855B, + 0xCA84, 0x855C, 0xCA85, 0x855D, 0xCA86, 0x855F, 0xCA87, 0x8560, + 0xCA88, 0x8561, 0xCA89, 0x8562, 0xCA8A, 0x8563, 0xCA8B, 0x8565, + 0xCA8C, 0x8566, 0xCA8D, 0x8567, 0xCA8E, 0x8569, 0xCA8F, 0x856A, + 0xCA90, 0x856B, 0xCA91, 0x856C, 0xCA92, 0x856D, 0xCA93, 0x856E, + 0xCA94, 0x856F, 0xCA95, 0x8570, 0xCA96, 0x8571, 0xCA97, 0x8573, + 0xCA98, 0x8575, 0xCA99, 0x8576, 0xCA9A, 0x8577, 0xCA9B, 0x8578, + 0xCA9C, 0x857C, 0xCA9D, 0x857D, 0xCA9E, 0x857F, 0xCA9F, 0x8580, + 0xCAA0, 0x8581, 0xCAA1, 0x7701, 0xCAA2, 0x76DB, 0xCAA3, 0x5269, + 0xCAA4, 0x80DC, 0xCAA5, 0x5723, 0xCAA6, 0x5E08, 0xCAA7, 0x5931, + 0xCAA8, 0x72EE, 0xCAA9, 0x65BD, 0xCAAA, 0x6E7F, 0xCAAB, 0x8BD7, + 0xCAAC, 0x5C38, 0xCAAD, 0x8671, 0xCAAE, 0x5341, 0xCAAF, 0x77F3, + 0xCAB0, 0x62FE, 0xCAB1, 0x65F6, 0xCAB2, 0x4EC0, 0xCAB3, 0x98DF, + 0xCAB4, 0x8680, 0xCAB5, 0x5B9E, 0xCAB6, 0x8BC6, 0xCAB7, 0x53F2, + 0xCAB8, 0x77E2, 0xCAB9, 0x4F7F, 0xCABA, 0x5C4E, 0xCABB, 0x9A76, + 0xCABC, 0x59CB, 0xCABD, 0x5F0F, 0xCABE, 0x793A, 0xCABF, 0x58EB, + 0xCAC0, 0x4E16, 0xCAC1, 0x67FF, 0xCAC2, 0x4E8B, 0xCAC3, 0x62ED, + 0xCAC4, 0x8A93, 0xCAC5, 0x901D, 0xCAC6, 0x52BF, 0xCAC7, 0x662F, + 0xCAC8, 0x55DC, 0xCAC9, 0x566C, 0xCACA, 0x9002, 0xCACB, 0x4ED5, + 0xCACC, 0x4F8D, 0xCACD, 0x91CA, 0xCACE, 0x9970, 0xCACF, 0x6C0F, + 0xCAD0, 0x5E02, 0xCAD1, 0x6043, 0xCAD2, 0x5BA4, 0xCAD3, 0x89C6, + 0xCAD4, 0x8BD5, 0xCAD5, 0x6536, 0xCAD6, 0x624B, 0xCAD7, 0x9996, + 0xCAD8, 0x5B88, 0xCAD9, 0x5BFF, 0xCADA, 0x6388, 0xCADB, 0x552E, + 0xCADC, 0x53D7, 0xCADD, 0x7626, 0xCADE, 0x517D, 0xCADF, 0x852C, + 0xCAE0, 0x67A2, 0xCAE1, 0x68B3, 0xCAE2, 0x6B8A, 0xCAE3, 0x6292, + 0xCAE4, 0x8F93, 0xCAE5, 0x53D4, 0xCAE6, 0x8212, 0xCAE7, 0x6DD1, + 0xCAE8, 0x758F, 0xCAE9, 0x4E66, 0xCAEA, 0x8D4E, 0xCAEB, 0x5B70, + 0xCAEC, 0x719F, 0xCAED, 0x85AF, 0xCAEE, 0x6691, 0xCAEF, 0x66D9, + 0xCAF0, 0x7F72, 0xCAF1, 0x8700, 0xCAF2, 0x9ECD, 0xCAF3, 0x9F20, + 0xCAF4, 0x5C5E, 0xCAF5, 0x672F, 0xCAF6, 0x8FF0, 0xCAF7, 0x6811, + 0xCAF8, 0x675F, 0xCAF9, 0x620D, 0xCAFA, 0x7AD6, 0xCAFB, 0x5885, + 0xCAFC, 0x5EB6, 0xCAFD, 0x6570, 0xCAFE, 0x6F31, 0xCB40, 0x8582, + 0xCB41, 0x8583, 0xCB42, 0x8586, 0xCB43, 0x8588, 0xCB44, 0x8589, + 0xCB45, 0x858A, 0xCB46, 0x858B, 0xCB47, 0x858C, 0xCB48, 0x858D, + 0xCB49, 0x858E, 0xCB4A, 0x8590, 0xCB4B, 0x8591, 0xCB4C, 0x8592, + 0xCB4D, 0x8593, 0xCB4E, 0x8594, 0xCB4F, 0x8595, 0xCB50, 0x8596, + 0xCB51, 0x8597, 0xCB52, 0x8598, 0xCB53, 0x8599, 0xCB54, 0x859A, + 0xCB55, 0x859D, 0xCB56, 0x859E, 0xCB57, 0x859F, 0xCB58, 0x85A0, + 0xCB59, 0x85A1, 0xCB5A, 0x85A2, 0xCB5B, 0x85A3, 0xCB5C, 0x85A5, + 0xCB5D, 0x85A6, 0xCB5E, 0x85A7, 0xCB5F, 0x85A9, 0xCB60, 0x85AB, + 0xCB61, 0x85AC, 0xCB62, 0x85AD, 0xCB63, 0x85B1, 0xCB64, 0x85B2, + 0xCB65, 0x85B3, 0xCB66, 0x85B4, 0xCB67, 0x85B5, 0xCB68, 0x85B6, + 0xCB69, 0x85B8, 0xCB6A, 0x85BA, 0xCB6B, 0x85BB, 0xCB6C, 0x85BC, + 0xCB6D, 0x85BD, 0xCB6E, 0x85BE, 0xCB6F, 0x85BF, 0xCB70, 0x85C0, + 0xCB71, 0x85C2, 0xCB72, 0x85C3, 0xCB73, 0x85C4, 0xCB74, 0x85C5, + 0xCB75, 0x85C6, 0xCB76, 0x85C7, 0xCB77, 0x85C8, 0xCB78, 0x85CA, + 0xCB79, 0x85CB, 0xCB7A, 0x85CC, 0xCB7B, 0x85CD, 0xCB7C, 0x85CE, + 0xCB7D, 0x85D1, 0xCB7E, 0x85D2, 0xCB80, 0x85D4, 0xCB81, 0x85D6, + 0xCB82, 0x85D7, 0xCB83, 0x85D8, 0xCB84, 0x85D9, 0xCB85, 0x85DA, + 0xCB86, 0x85DB, 0xCB87, 0x85DD, 0xCB88, 0x85DE, 0xCB89, 0x85DF, + 0xCB8A, 0x85E0, 0xCB8B, 0x85E1, 0xCB8C, 0x85E2, 0xCB8D, 0x85E3, + 0xCB8E, 0x85E5, 0xCB8F, 0x85E6, 0xCB90, 0x85E7, 0xCB91, 0x85E8, + 0xCB92, 0x85EA, 0xCB93, 0x85EB, 0xCB94, 0x85EC, 0xCB95, 0x85ED, + 0xCB96, 0x85EE, 0xCB97, 0x85EF, 0xCB98, 0x85F0, 0xCB99, 0x85F1, + 0xCB9A, 0x85F2, 0xCB9B, 0x85F3, 0xCB9C, 0x85F4, 0xCB9D, 0x85F5, + 0xCB9E, 0x85F6, 0xCB9F, 0x85F7, 0xCBA0, 0x85F8, 0xCBA1, 0x6055, + 0xCBA2, 0x5237, 0xCBA3, 0x800D, 0xCBA4, 0x6454, 0xCBA5, 0x8870, + 0xCBA6, 0x7529, 0xCBA7, 0x5E05, 0xCBA8, 0x6813, 0xCBA9, 0x62F4, + 0xCBAA, 0x971C, 0xCBAB, 0x53CC, 0xCBAC, 0x723D, 0xCBAD, 0x8C01, + 0xCBAE, 0x6C34, 0xCBAF, 0x7761, 0xCBB0, 0x7A0E, 0xCBB1, 0x542E, + 0xCBB2, 0x77AC, 0xCBB3, 0x987A, 0xCBB4, 0x821C, 0xCBB5, 0x8BF4, + 0xCBB6, 0x7855, 0xCBB7, 0x6714, 0xCBB8, 0x70C1, 0xCBB9, 0x65AF, + 0xCBBA, 0x6495, 0xCBBB, 0x5636, 0xCBBC, 0x601D, 0xCBBD, 0x79C1, + 0xCBBE, 0x53F8, 0xCBBF, 0x4E1D, 0xCBC0, 0x6B7B, 0xCBC1, 0x8086, + 0xCBC2, 0x5BFA, 0xCBC3, 0x55E3, 0xCBC4, 0x56DB, 0xCBC5, 0x4F3A, + 0xCBC6, 0x4F3C, 0xCBC7, 0x9972, 0xCBC8, 0x5DF3, 0xCBC9, 0x677E, + 0xCBCA, 0x8038, 0xCBCB, 0x6002, 0xCBCC, 0x9882, 0xCBCD, 0x9001, + 0xCBCE, 0x5B8B, 0xCBCF, 0x8BBC, 0xCBD0, 0x8BF5, 0xCBD1, 0x641C, + 0xCBD2, 0x8258, 0xCBD3, 0x64DE, 0xCBD4, 0x55FD, 0xCBD5, 0x82CF, + 0xCBD6, 0x9165, 0xCBD7, 0x4FD7, 0xCBD8, 0x7D20, 0xCBD9, 0x901F, + 0xCBDA, 0x7C9F, 0xCBDB, 0x50F3, 0xCBDC, 0x5851, 0xCBDD, 0x6EAF, + 0xCBDE, 0x5BBF, 0xCBDF, 0x8BC9, 0xCBE0, 0x8083, 0xCBE1, 0x9178, + 0xCBE2, 0x849C, 0xCBE3, 0x7B97, 0xCBE4, 0x867D, 0xCBE5, 0x968B, + 0xCBE6, 0x968F, 0xCBE7, 0x7EE5, 0xCBE8, 0x9AD3, 0xCBE9, 0x788E, + 0xCBEA, 0x5C81, 0xCBEB, 0x7A57, 0xCBEC, 0x9042, 0xCBED, 0x96A7, + 0xCBEE, 0x795F, 0xCBEF, 0x5B59, 0xCBF0, 0x635F, 0xCBF1, 0x7B0B, + 0xCBF2, 0x84D1, 0xCBF3, 0x68AD, 0xCBF4, 0x5506, 0xCBF5, 0x7F29, + 0xCBF6, 0x7410, 0xCBF7, 0x7D22, 0xCBF8, 0x9501, 0xCBF9, 0x6240, + 0xCBFA, 0x584C, 0xCBFB, 0x4ED6, 0xCBFC, 0x5B83, 0xCBFD, 0x5979, + 0xCBFE, 0x5854, 0xCC40, 0x85F9, 0xCC41, 0x85FA, 0xCC42, 0x85FC, + 0xCC43, 0x85FD, 0xCC44, 0x85FE, 0xCC45, 0x8600, 0xCC46, 0x8601, + 0xCC47, 0x8602, 0xCC48, 0x8603, 0xCC49, 0x8604, 0xCC4A, 0x8606, + 0xCC4B, 0x8607, 0xCC4C, 0x8608, 0xCC4D, 0x8609, 0xCC4E, 0x860A, + 0xCC4F, 0x860B, 0xCC50, 0x860C, 0xCC51, 0x860D, 0xCC52, 0x860E, + 0xCC53, 0x860F, 0xCC54, 0x8610, 0xCC55, 0x8612, 0xCC56, 0x8613, + 0xCC57, 0x8614, 0xCC58, 0x8615, 0xCC59, 0x8617, 0xCC5A, 0x8618, + 0xCC5B, 0x8619, 0xCC5C, 0x861A, 0xCC5D, 0x861B, 0xCC5E, 0x861C, + 0xCC5F, 0x861D, 0xCC60, 0x861E, 0xCC61, 0x861F, 0xCC62, 0x8620, + 0xCC63, 0x8621, 0xCC64, 0x8622, 0xCC65, 0x8623, 0xCC66, 0x8624, + 0xCC67, 0x8625, 0xCC68, 0x8626, 0xCC69, 0x8628, 0xCC6A, 0x862A, + 0xCC6B, 0x862B, 0xCC6C, 0x862C, 0xCC6D, 0x862D, 0xCC6E, 0x862E, + 0xCC6F, 0x862F, 0xCC70, 0x8630, 0xCC71, 0x8631, 0xCC72, 0x8632, + 0xCC73, 0x8633, 0xCC74, 0x8634, 0xCC75, 0x8635, 0xCC76, 0x8636, + 0xCC77, 0x8637, 0xCC78, 0x8639, 0xCC79, 0x863A, 0xCC7A, 0x863B, + 0xCC7B, 0x863D, 0xCC7C, 0x863E, 0xCC7D, 0x863F, 0xCC7E, 0x8640, + 0xCC80, 0x8641, 0xCC81, 0x8642, 0xCC82, 0x8643, 0xCC83, 0x8644, + 0xCC84, 0x8645, 0xCC85, 0x8646, 0xCC86, 0x8647, 0xCC87, 0x8648, + 0xCC88, 0x8649, 0xCC89, 0x864A, 0xCC8A, 0x864B, 0xCC8B, 0x864C, + 0xCC8C, 0x8652, 0xCC8D, 0x8653, 0xCC8E, 0x8655, 0xCC8F, 0x8656, + 0xCC90, 0x8657, 0xCC91, 0x8658, 0xCC92, 0x8659, 0xCC93, 0x865B, + 0xCC94, 0x865C, 0xCC95, 0x865D, 0xCC96, 0x865F, 0xCC97, 0x8660, + 0xCC98, 0x8661, 0xCC99, 0x8663, 0xCC9A, 0x8664, 0xCC9B, 0x8665, + 0xCC9C, 0x8666, 0xCC9D, 0x8667, 0xCC9E, 0x8668, 0xCC9F, 0x8669, + 0xCCA0, 0x866A, 0xCCA1, 0x736D, 0xCCA2, 0x631E, 0xCCA3, 0x8E4B, + 0xCCA4, 0x8E0F, 0xCCA5, 0x80CE, 0xCCA6, 0x82D4, 0xCCA7, 0x62AC, + 0xCCA8, 0x53F0, 0xCCA9, 0x6CF0, 0xCCAA, 0x915E, 0xCCAB, 0x592A, + 0xCCAC, 0x6001, 0xCCAD, 0x6C70, 0xCCAE, 0x574D, 0xCCAF, 0x644A, + 0xCCB0, 0x8D2A, 0xCCB1, 0x762B, 0xCCB2, 0x6EE9, 0xCCB3, 0x575B, + 0xCCB4, 0x6A80, 0xCCB5, 0x75F0, 0xCCB6, 0x6F6D, 0xCCB7, 0x8C2D, + 0xCCB8, 0x8C08, 0xCCB9, 0x5766, 0xCCBA, 0x6BEF, 0xCCBB, 0x8892, + 0xCCBC, 0x78B3, 0xCCBD, 0x63A2, 0xCCBE, 0x53F9, 0xCCBF, 0x70AD, + 0xCCC0, 0x6C64, 0xCCC1, 0x5858, 0xCCC2, 0x642A, 0xCCC3, 0x5802, + 0xCCC4, 0x68E0, 0xCCC5, 0x819B, 0xCCC6, 0x5510, 0xCCC7, 0x7CD6, + 0xCCC8, 0x5018, 0xCCC9, 0x8EBA, 0xCCCA, 0x6DCC, 0xCCCB, 0x8D9F, + 0xCCCC, 0x70EB, 0xCCCD, 0x638F, 0xCCCE, 0x6D9B, 0xCCCF, 0x6ED4, + 0xCCD0, 0x7EE6, 0xCCD1, 0x8404, 0xCCD2, 0x6843, 0xCCD3, 0x9003, + 0xCCD4, 0x6DD8, 0xCCD5, 0x9676, 0xCCD6, 0x8BA8, 0xCCD7, 0x5957, + 0xCCD8, 0x7279, 0xCCD9, 0x85E4, 0xCCDA, 0x817E, 0xCCDB, 0x75BC, + 0xCCDC, 0x8A8A, 0xCCDD, 0x68AF, 0xCCDE, 0x5254, 0xCCDF, 0x8E22, + 0xCCE0, 0x9511, 0xCCE1, 0x63D0, 0xCCE2, 0x9898, 0xCCE3, 0x8E44, + 0xCCE4, 0x557C, 0xCCE5, 0x4F53, 0xCCE6, 0x66FF, 0xCCE7, 0x568F, + 0xCCE8, 0x60D5, 0xCCE9, 0x6D95, 0xCCEA, 0x5243, 0xCCEB, 0x5C49, + 0xCCEC, 0x5929, 0xCCED, 0x6DFB, 0xCCEE, 0x586B, 0xCCEF, 0x7530, + 0xCCF0, 0x751C, 0xCCF1, 0x606C, 0xCCF2, 0x8214, 0xCCF3, 0x8146, + 0xCCF4, 0x6311, 0xCCF5, 0x6761, 0xCCF6, 0x8FE2, 0xCCF7, 0x773A, + 0xCCF8, 0x8DF3, 0xCCF9, 0x8D34, 0xCCFA, 0x94C1, 0xCCFB, 0x5E16, + 0xCCFC, 0x5385, 0xCCFD, 0x542C, 0xCCFE, 0x70C3, 0xCD40, 0x866D, + 0xCD41, 0x866F, 0xCD42, 0x8670, 0xCD43, 0x8672, 0xCD44, 0x8673, + 0xCD45, 0x8674, 0xCD46, 0x8675, 0xCD47, 0x8676, 0xCD48, 0x8677, + 0xCD49, 0x8678, 0xCD4A, 0x8683, 0xCD4B, 0x8684, 0xCD4C, 0x8685, + 0xCD4D, 0x8686, 0xCD4E, 0x8687, 0xCD4F, 0x8688, 0xCD50, 0x8689, + 0xCD51, 0x868E, 0xCD52, 0x868F, 0xCD53, 0x8690, 0xCD54, 0x8691, + 0xCD55, 0x8692, 0xCD56, 0x8694, 0xCD57, 0x8696, 0xCD58, 0x8697, + 0xCD59, 0x8698, 0xCD5A, 0x8699, 0xCD5B, 0x869A, 0xCD5C, 0x869B, + 0xCD5D, 0x869E, 0xCD5E, 0x869F, 0xCD5F, 0x86A0, 0xCD60, 0x86A1, + 0xCD61, 0x86A2, 0xCD62, 0x86A5, 0xCD63, 0x86A6, 0xCD64, 0x86AB, + 0xCD65, 0x86AD, 0xCD66, 0x86AE, 0xCD67, 0x86B2, 0xCD68, 0x86B3, + 0xCD69, 0x86B7, 0xCD6A, 0x86B8, 0xCD6B, 0x86B9, 0xCD6C, 0x86BB, + 0xCD6D, 0x86BC, 0xCD6E, 0x86BD, 0xCD6F, 0x86BE, 0xCD70, 0x86BF, + 0xCD71, 0x86C1, 0xCD72, 0x86C2, 0xCD73, 0x86C3, 0xCD74, 0x86C5, + 0xCD75, 0x86C8, 0xCD76, 0x86CC, 0xCD77, 0x86CD, 0xCD78, 0x86D2, + 0xCD79, 0x86D3, 0xCD7A, 0x86D5, 0xCD7B, 0x86D6, 0xCD7C, 0x86D7, + 0xCD7D, 0x86DA, 0xCD7E, 0x86DC, 0xCD80, 0x86DD, 0xCD81, 0x86E0, + 0xCD82, 0x86E1, 0xCD83, 0x86E2, 0xCD84, 0x86E3, 0xCD85, 0x86E5, + 0xCD86, 0x86E6, 0xCD87, 0x86E7, 0xCD88, 0x86E8, 0xCD89, 0x86EA, + 0xCD8A, 0x86EB, 0xCD8B, 0x86EC, 0xCD8C, 0x86EF, 0xCD8D, 0x86F5, + 0xCD8E, 0x86F6, 0xCD8F, 0x86F7, 0xCD90, 0x86FA, 0xCD91, 0x86FB, + 0xCD92, 0x86FC, 0xCD93, 0x86FD, 0xCD94, 0x86FF, 0xCD95, 0x8701, + 0xCD96, 0x8704, 0xCD97, 0x8705, 0xCD98, 0x8706, 0xCD99, 0x870B, + 0xCD9A, 0x870C, 0xCD9B, 0x870E, 0xCD9C, 0x870F, 0xCD9D, 0x8710, + 0xCD9E, 0x8711, 0xCD9F, 0x8714, 0xCDA0, 0x8716, 0xCDA1, 0x6C40, + 0xCDA2, 0x5EF7, 0xCDA3, 0x505C, 0xCDA4, 0x4EAD, 0xCDA5, 0x5EAD, + 0xCDA6, 0x633A, 0xCDA7, 0x8247, 0xCDA8, 0x901A, 0xCDA9, 0x6850, + 0xCDAA, 0x916E, 0xCDAB, 0x77B3, 0xCDAC, 0x540C, 0xCDAD, 0x94DC, + 0xCDAE, 0x5F64, 0xCDAF, 0x7AE5, 0xCDB0, 0x6876, 0xCDB1, 0x6345, + 0xCDB2, 0x7B52, 0xCDB3, 0x7EDF, 0xCDB4, 0x75DB, 0xCDB5, 0x5077, + 0xCDB6, 0x6295, 0xCDB7, 0x5934, 0xCDB8, 0x900F, 0xCDB9, 0x51F8, + 0xCDBA, 0x79C3, 0xCDBB, 0x7A81, 0xCDBC, 0x56FE, 0xCDBD, 0x5F92, + 0xCDBE, 0x9014, 0xCDBF, 0x6D82, 0xCDC0, 0x5C60, 0xCDC1, 0x571F, + 0xCDC2, 0x5410, 0xCDC3, 0x5154, 0xCDC4, 0x6E4D, 0xCDC5, 0x56E2, + 0xCDC6, 0x63A8, 0xCDC7, 0x9893, 0xCDC8, 0x817F, 0xCDC9, 0x8715, + 0xCDCA, 0x892A, 0xCDCB, 0x9000, 0xCDCC, 0x541E, 0xCDCD, 0x5C6F, + 0xCDCE, 0x81C0, 0xCDCF, 0x62D6, 0xCDD0, 0x6258, 0xCDD1, 0x8131, + 0xCDD2, 0x9E35, 0xCDD3, 0x9640, 0xCDD4, 0x9A6E, 0xCDD5, 0x9A7C, + 0xCDD6, 0x692D, 0xCDD7, 0x59A5, 0xCDD8, 0x62D3, 0xCDD9, 0x553E, + 0xCDDA, 0x6316, 0xCDDB, 0x54C7, 0xCDDC, 0x86D9, 0xCDDD, 0x6D3C, + 0xCDDE, 0x5A03, 0xCDDF, 0x74E6, 0xCDE0, 0x889C, 0xCDE1, 0x6B6A, + 0xCDE2, 0x5916, 0xCDE3, 0x8C4C, 0xCDE4, 0x5F2F, 0xCDE5, 0x6E7E, + 0xCDE6, 0x73A9, 0xCDE7, 0x987D, 0xCDE8, 0x4E38, 0xCDE9, 0x70F7, + 0xCDEA, 0x5B8C, 0xCDEB, 0x7897, 0xCDEC, 0x633D, 0xCDED, 0x665A, + 0xCDEE, 0x7696, 0xCDEF, 0x60CB, 0xCDF0, 0x5B9B, 0xCDF1, 0x5A49, + 0xCDF2, 0x4E07, 0xCDF3, 0x8155, 0xCDF4, 0x6C6A, 0xCDF5, 0x738B, + 0xCDF6, 0x4EA1, 0xCDF7, 0x6789, 0xCDF8, 0x7F51, 0xCDF9, 0x5F80, + 0xCDFA, 0x65FA, 0xCDFB, 0x671B, 0xCDFC, 0x5FD8, 0xCDFD, 0x5984, + 0xCDFE, 0x5A01, 0xCE40, 0x8719, 0xCE41, 0x871B, 0xCE42, 0x871D, + 0xCE43, 0x871F, 0xCE44, 0x8720, 0xCE45, 0x8724, 0xCE46, 0x8726, + 0xCE47, 0x8727, 0xCE48, 0x8728, 0xCE49, 0x872A, 0xCE4A, 0x872B, + 0xCE4B, 0x872C, 0xCE4C, 0x872D, 0xCE4D, 0x872F, 0xCE4E, 0x8730, + 0xCE4F, 0x8732, 0xCE50, 0x8733, 0xCE51, 0x8735, 0xCE52, 0x8736, + 0xCE53, 0x8738, 0xCE54, 0x8739, 0xCE55, 0x873A, 0xCE56, 0x873C, + 0xCE57, 0x873D, 0xCE58, 0x8740, 0xCE59, 0x8741, 0xCE5A, 0x8742, + 0xCE5B, 0x8743, 0xCE5C, 0x8744, 0xCE5D, 0x8745, 0xCE5E, 0x8746, + 0xCE5F, 0x874A, 0xCE60, 0x874B, 0xCE61, 0x874D, 0xCE62, 0x874F, + 0xCE63, 0x8750, 0xCE64, 0x8751, 0xCE65, 0x8752, 0xCE66, 0x8754, + 0xCE67, 0x8755, 0xCE68, 0x8756, 0xCE69, 0x8758, 0xCE6A, 0x875A, + 0xCE6B, 0x875B, 0xCE6C, 0x875C, 0xCE6D, 0x875D, 0xCE6E, 0x875E, + 0xCE6F, 0x875F, 0xCE70, 0x8761, 0xCE71, 0x8762, 0xCE72, 0x8766, + 0xCE73, 0x8767, 0xCE74, 0x8768, 0xCE75, 0x8769, 0xCE76, 0x876A, + 0xCE77, 0x876B, 0xCE78, 0x876C, 0xCE79, 0x876D, 0xCE7A, 0x876F, + 0xCE7B, 0x8771, 0xCE7C, 0x8772, 0xCE7D, 0x8773, 0xCE7E, 0x8775, + 0xCE80, 0x8777, 0xCE81, 0x8778, 0xCE82, 0x8779, 0xCE83, 0x877A, + 0xCE84, 0x877F, 0xCE85, 0x8780, 0xCE86, 0x8781, 0xCE87, 0x8784, + 0xCE88, 0x8786, 0xCE89, 0x8787, 0xCE8A, 0x8789, 0xCE8B, 0x878A, + 0xCE8C, 0x878C, 0xCE8D, 0x878E, 0xCE8E, 0x878F, 0xCE8F, 0x8790, + 0xCE90, 0x8791, 0xCE91, 0x8792, 0xCE92, 0x8794, 0xCE93, 0x8795, + 0xCE94, 0x8796, 0xCE95, 0x8798, 0xCE96, 0x8799, 0xCE97, 0x879A, + 0xCE98, 0x879B, 0xCE99, 0x879C, 0xCE9A, 0x879D, 0xCE9B, 0x879E, + 0xCE9C, 0x87A0, 0xCE9D, 0x87A1, 0xCE9E, 0x87A2, 0xCE9F, 0x87A3, + 0xCEA0, 0x87A4, 0xCEA1, 0x5DCD, 0xCEA2, 0x5FAE, 0xCEA3, 0x5371, + 0xCEA4, 0x97E6, 0xCEA5, 0x8FDD, 0xCEA6, 0x6845, 0xCEA7, 0x56F4, + 0xCEA8, 0x552F, 0xCEA9, 0x60DF, 0xCEAA, 0x4E3A, 0xCEAB, 0x6F4D, + 0xCEAC, 0x7EF4, 0xCEAD, 0x82C7, 0xCEAE, 0x840E, 0xCEAF, 0x59D4, + 0xCEB0, 0x4F1F, 0xCEB1, 0x4F2A, 0xCEB2, 0x5C3E, 0xCEB3, 0x7EAC, + 0xCEB4, 0x672A, 0xCEB5, 0x851A, 0xCEB6, 0x5473, 0xCEB7, 0x754F, + 0xCEB8, 0x80C3, 0xCEB9, 0x5582, 0xCEBA, 0x9B4F, 0xCEBB, 0x4F4D, + 0xCEBC, 0x6E2D, 0xCEBD, 0x8C13, 0xCEBE, 0x5C09, 0xCEBF, 0x6170, + 0xCEC0, 0x536B, 0xCEC1, 0x761F, 0xCEC2, 0x6E29, 0xCEC3, 0x868A, + 0xCEC4, 0x6587, 0xCEC5, 0x95FB, 0xCEC6, 0x7EB9, 0xCEC7, 0x543B, + 0xCEC8, 0x7A33, 0xCEC9, 0x7D0A, 0xCECA, 0x95EE, 0xCECB, 0x55E1, + 0xCECC, 0x7FC1, 0xCECD, 0x74EE, 0xCECE, 0x631D, 0xCECF, 0x8717, + 0xCED0, 0x6DA1, 0xCED1, 0x7A9D, 0xCED2, 0x6211, 0xCED3, 0x65A1, + 0xCED4, 0x5367, 0xCED5, 0x63E1, 0xCED6, 0x6C83, 0xCED7, 0x5DEB, + 0xCED8, 0x545C, 0xCED9, 0x94A8, 0xCEDA, 0x4E4C, 0xCEDB, 0x6C61, + 0xCEDC, 0x8BEC, 0xCEDD, 0x5C4B, 0xCEDE, 0x65E0, 0xCEDF, 0x829C, + 0xCEE0, 0x68A7, 0xCEE1, 0x543E, 0xCEE2, 0x5434, 0xCEE3, 0x6BCB, + 0xCEE4, 0x6B66, 0xCEE5, 0x4E94, 0xCEE6, 0x6342, 0xCEE7, 0x5348, + 0xCEE8, 0x821E, 0xCEE9, 0x4F0D, 0xCEEA, 0x4FAE, 0xCEEB, 0x575E, + 0xCEEC, 0x620A, 0xCEED, 0x96FE, 0xCEEE, 0x6664, 0xCEEF, 0x7269, + 0xCEF0, 0x52FF, 0xCEF1, 0x52A1, 0xCEF2, 0x609F, 0xCEF3, 0x8BEF, + 0xCEF4, 0x6614, 0xCEF5, 0x7199, 0xCEF6, 0x6790, 0xCEF7, 0x897F, + 0xCEF8, 0x7852, 0xCEF9, 0x77FD, 0xCEFA, 0x6670, 0xCEFB, 0x563B, + 0xCEFC, 0x5438, 0xCEFD, 0x9521, 0xCEFE, 0x727A, 0xCF40, 0x87A5, + 0xCF41, 0x87A6, 0xCF42, 0x87A7, 0xCF43, 0x87A9, 0xCF44, 0x87AA, + 0xCF45, 0x87AE, 0xCF46, 0x87B0, 0xCF47, 0x87B1, 0xCF48, 0x87B2, + 0xCF49, 0x87B4, 0xCF4A, 0x87B6, 0xCF4B, 0x87B7, 0xCF4C, 0x87B8, + 0xCF4D, 0x87B9, 0xCF4E, 0x87BB, 0xCF4F, 0x87BC, 0xCF50, 0x87BE, + 0xCF51, 0x87BF, 0xCF52, 0x87C1, 0xCF53, 0x87C2, 0xCF54, 0x87C3, + 0xCF55, 0x87C4, 0xCF56, 0x87C5, 0xCF57, 0x87C7, 0xCF58, 0x87C8, + 0xCF59, 0x87C9, 0xCF5A, 0x87CC, 0xCF5B, 0x87CD, 0xCF5C, 0x87CE, + 0xCF5D, 0x87CF, 0xCF5E, 0x87D0, 0xCF5F, 0x87D4, 0xCF60, 0x87D5, + 0xCF61, 0x87D6, 0xCF62, 0x87D7, 0xCF63, 0x87D8, 0xCF64, 0x87D9, + 0xCF65, 0x87DA, 0xCF66, 0x87DC, 0xCF67, 0x87DD, 0xCF68, 0x87DE, + 0xCF69, 0x87DF, 0xCF6A, 0x87E1, 0xCF6B, 0x87E2, 0xCF6C, 0x87E3, + 0xCF6D, 0x87E4, 0xCF6E, 0x87E6, 0xCF6F, 0x87E7, 0xCF70, 0x87E8, + 0xCF71, 0x87E9, 0xCF72, 0x87EB, 0xCF73, 0x87EC, 0xCF74, 0x87ED, + 0xCF75, 0x87EF, 0xCF76, 0x87F0, 0xCF77, 0x87F1, 0xCF78, 0x87F2, + 0xCF79, 0x87F3, 0xCF7A, 0x87F4, 0xCF7B, 0x87F5, 0xCF7C, 0x87F6, + 0xCF7D, 0x87F7, 0xCF7E, 0x87F8, 0xCF80, 0x87FA, 0xCF81, 0x87FB, + 0xCF82, 0x87FC, 0xCF83, 0x87FD, 0xCF84, 0x87FF, 0xCF85, 0x8800, + 0xCF86, 0x8801, 0xCF87, 0x8802, 0xCF88, 0x8804, 0xCF89, 0x8805, + 0xCF8A, 0x8806, 0xCF8B, 0x8807, 0xCF8C, 0x8808, 0xCF8D, 0x8809, + 0xCF8E, 0x880B, 0xCF8F, 0x880C, 0xCF90, 0x880D, 0xCF91, 0x880E, + 0xCF92, 0x880F, 0xCF93, 0x8810, 0xCF94, 0x8811, 0xCF95, 0x8812, + 0xCF96, 0x8814, 0xCF97, 0x8817, 0xCF98, 0x8818, 0xCF99, 0x8819, + 0xCF9A, 0x881A, 0xCF9B, 0x881C, 0xCF9C, 0x881D, 0xCF9D, 0x881E, + 0xCF9E, 0x881F, 0xCF9F, 0x8820, 0xCFA0, 0x8823, 0xCFA1, 0x7A00, + 0xCFA2, 0x606F, 0xCFA3, 0x5E0C, 0xCFA4, 0x6089, 0xCFA5, 0x819D, + 0xCFA6, 0x5915, 0xCFA7, 0x60DC, 0xCFA8, 0x7184, 0xCFA9, 0x70EF, + 0xCFAA, 0x6EAA, 0xCFAB, 0x6C50, 0xCFAC, 0x7280, 0xCFAD, 0x6A84, + 0xCFAE, 0x88AD, 0xCFAF, 0x5E2D, 0xCFB0, 0x4E60, 0xCFB1, 0x5AB3, + 0xCFB2, 0x559C, 0xCFB3, 0x94E3, 0xCFB4, 0x6D17, 0xCFB5, 0x7CFB, + 0xCFB6, 0x9699, 0xCFB7, 0x620F, 0xCFB8, 0x7EC6, 0xCFB9, 0x778E, + 0xCFBA, 0x867E, 0xCFBB, 0x5323, 0xCFBC, 0x971E, 0xCFBD, 0x8F96, + 0xCFBE, 0x6687, 0xCFBF, 0x5CE1, 0xCFC0, 0x4FA0, 0xCFC1, 0x72ED, + 0xCFC2, 0x4E0B, 0xCFC3, 0x53A6, 0xCFC4, 0x590F, 0xCFC5, 0x5413, + 0xCFC6, 0x6380, 0xCFC7, 0x9528, 0xCFC8, 0x5148, 0xCFC9, 0x4ED9, + 0xCFCA, 0x9C9C, 0xCFCB, 0x7EA4, 0xCFCC, 0x54B8, 0xCFCD, 0x8D24, + 0xCFCE, 0x8854, 0xCFCF, 0x8237, 0xCFD0, 0x95F2, 0xCFD1, 0x6D8E, + 0xCFD2, 0x5F26, 0xCFD3, 0x5ACC, 0xCFD4, 0x663E, 0xCFD5, 0x9669, + 0xCFD6, 0x73B0, 0xCFD7, 0x732E, 0xCFD8, 0x53BF, 0xCFD9, 0x817A, + 0xCFDA, 0x9985, 0xCFDB, 0x7FA1, 0xCFDC, 0x5BAA, 0xCFDD, 0x9677, + 0xCFDE, 0x9650, 0xCFDF, 0x7EBF, 0xCFE0, 0x76F8, 0xCFE1, 0x53A2, + 0xCFE2, 0x9576, 0xCFE3, 0x9999, 0xCFE4, 0x7BB1, 0xCFE5, 0x8944, + 0xCFE6, 0x6E58, 0xCFE7, 0x4E61, 0xCFE8, 0x7FD4, 0xCFE9, 0x7965, + 0xCFEA, 0x8BE6, 0xCFEB, 0x60F3, 0xCFEC, 0x54CD, 0xCFED, 0x4EAB, + 0xCFEE, 0x9879, 0xCFEF, 0x5DF7, 0xCFF0, 0x6A61, 0xCFF1, 0x50CF, + 0xCFF2, 0x5411, 0xCFF3, 0x8C61, 0xCFF4, 0x8427, 0xCFF5, 0x785D, + 0xCFF6, 0x9704, 0xCFF7, 0x524A, 0xCFF8, 0x54EE, 0xCFF9, 0x56A3, + 0xCFFA, 0x9500, 0xCFFB, 0x6D88, 0xCFFC, 0x5BB5, 0xCFFD, 0x6DC6, + 0xCFFE, 0x6653, 0xD040, 0x8824, 0xD041, 0x8825, 0xD042, 0x8826, + 0xD043, 0x8827, 0xD044, 0x8828, 0xD045, 0x8829, 0xD046, 0x882A, + 0xD047, 0x882B, 0xD048, 0x882C, 0xD049, 0x882D, 0xD04A, 0x882E, + 0xD04B, 0x882F, 0xD04C, 0x8830, 0xD04D, 0x8831, 0xD04E, 0x8833, + 0xD04F, 0x8834, 0xD050, 0x8835, 0xD051, 0x8836, 0xD052, 0x8837, + 0xD053, 0x8838, 0xD054, 0x883A, 0xD055, 0x883B, 0xD056, 0x883D, + 0xD057, 0x883E, 0xD058, 0x883F, 0xD059, 0x8841, 0xD05A, 0x8842, + 0xD05B, 0x8843, 0xD05C, 0x8846, 0xD05D, 0x8847, 0xD05E, 0x8848, + 0xD05F, 0x8849, 0xD060, 0x884A, 0xD061, 0x884B, 0xD062, 0x884E, + 0xD063, 0x884F, 0xD064, 0x8850, 0xD065, 0x8851, 0xD066, 0x8852, + 0xD067, 0x8853, 0xD068, 0x8855, 0xD069, 0x8856, 0xD06A, 0x8858, + 0xD06B, 0x885A, 0xD06C, 0x885B, 0xD06D, 0x885C, 0xD06E, 0x885D, + 0xD06F, 0x885E, 0xD070, 0x885F, 0xD071, 0x8860, 0xD072, 0x8866, + 0xD073, 0x8867, 0xD074, 0x886A, 0xD075, 0x886D, 0xD076, 0x886F, + 0xD077, 0x8871, 0xD078, 0x8873, 0xD079, 0x8874, 0xD07A, 0x8875, + 0xD07B, 0x8876, 0xD07C, 0x8878, 0xD07D, 0x8879, 0xD07E, 0x887A, + 0xD080, 0x887B, 0xD081, 0x887C, 0xD082, 0x8880, 0xD083, 0x8883, + 0xD084, 0x8886, 0xD085, 0x8887, 0xD086, 0x8889, 0xD087, 0x888A, + 0xD088, 0x888C, 0xD089, 0x888E, 0xD08A, 0x888F, 0xD08B, 0x8890, + 0xD08C, 0x8891, 0xD08D, 0x8893, 0xD08E, 0x8894, 0xD08F, 0x8895, + 0xD090, 0x8897, 0xD091, 0x8898, 0xD092, 0x8899, 0xD093, 0x889A, + 0xD094, 0x889B, 0xD095, 0x889D, 0xD096, 0x889E, 0xD097, 0x889F, + 0xD098, 0x88A0, 0xD099, 0x88A1, 0xD09A, 0x88A3, 0xD09B, 0x88A5, + 0xD09C, 0x88A6, 0xD09D, 0x88A7, 0xD09E, 0x88A8, 0xD09F, 0x88A9, + 0xD0A0, 0x88AA, 0xD0A1, 0x5C0F, 0xD0A2, 0x5B5D, 0xD0A3, 0x6821, + 0xD0A4, 0x8096, 0xD0A5, 0x5578, 0xD0A6, 0x7B11, 0xD0A7, 0x6548, + 0xD0A8, 0x6954, 0xD0A9, 0x4E9B, 0xD0AA, 0x6B47, 0xD0AB, 0x874E, + 0xD0AC, 0x978B, 0xD0AD, 0x534F, 0xD0AE, 0x631F, 0xD0AF, 0x643A, + 0xD0B0, 0x90AA, 0xD0B1, 0x659C, 0xD0B2, 0x80C1, 0xD0B3, 0x8C10, + 0xD0B4, 0x5199, 0xD0B5, 0x68B0, 0xD0B6, 0x5378, 0xD0B7, 0x87F9, + 0xD0B8, 0x61C8, 0xD0B9, 0x6CC4, 0xD0BA, 0x6CFB, 0xD0BB, 0x8C22, + 0xD0BC, 0x5C51, 0xD0BD, 0x85AA, 0xD0BE, 0x82AF, 0xD0BF, 0x950C, + 0xD0C0, 0x6B23, 0xD0C1, 0x8F9B, 0xD0C2, 0x65B0, 0xD0C3, 0x5FFB, + 0xD0C4, 0x5FC3, 0xD0C5, 0x4FE1, 0xD0C6, 0x8845, 0xD0C7, 0x661F, + 0xD0C8, 0x8165, 0xD0C9, 0x7329, 0xD0CA, 0x60FA, 0xD0CB, 0x5174, + 0xD0CC, 0x5211, 0xD0CD, 0x578B, 0xD0CE, 0x5F62, 0xD0CF, 0x90A2, + 0xD0D0, 0x884C, 0xD0D1, 0x9192, 0xD0D2, 0x5E78, 0xD0D3, 0x674F, + 0xD0D4, 0x6027, 0xD0D5, 0x59D3, 0xD0D6, 0x5144, 0xD0D7, 0x51F6, + 0xD0D8, 0x80F8, 0xD0D9, 0x5308, 0xD0DA, 0x6C79, 0xD0DB, 0x96C4, + 0xD0DC, 0x718A, 0xD0DD, 0x4F11, 0xD0DE, 0x4FEE, 0xD0DF, 0x7F9E, + 0xD0E0, 0x673D, 0xD0E1, 0x55C5, 0xD0E2, 0x9508, 0xD0E3, 0x79C0, + 0xD0E4, 0x8896, 0xD0E5, 0x7EE3, 0xD0E6, 0x589F, 0xD0E7, 0x620C, + 0xD0E8, 0x9700, 0xD0E9, 0x865A, 0xD0EA, 0x5618, 0xD0EB, 0x987B, + 0xD0EC, 0x5F90, 0xD0ED, 0x8BB8, 0xD0EE, 0x84C4, 0xD0EF, 0x9157, + 0xD0F0, 0x53D9, 0xD0F1, 0x65ED, 0xD0F2, 0x5E8F, 0xD0F3, 0x755C, + 0xD0F4, 0x6064, 0xD0F5, 0x7D6E, 0xD0F6, 0x5A7F, 0xD0F7, 0x7EEA, + 0xD0F8, 0x7EED, 0xD0F9, 0x8F69, 0xD0FA, 0x55A7, 0xD0FB, 0x5BA3, + 0xD0FC, 0x60AC, 0xD0FD, 0x65CB, 0xD0FE, 0x7384, 0xD140, 0x88AC, + 0xD141, 0x88AE, 0xD142, 0x88AF, 0xD143, 0x88B0, 0xD144, 0x88B2, + 0xD145, 0x88B3, 0xD146, 0x88B4, 0xD147, 0x88B5, 0xD148, 0x88B6, + 0xD149, 0x88B8, 0xD14A, 0x88B9, 0xD14B, 0x88BA, 0xD14C, 0x88BB, + 0xD14D, 0x88BD, 0xD14E, 0x88BE, 0xD14F, 0x88BF, 0xD150, 0x88C0, + 0xD151, 0x88C3, 0xD152, 0x88C4, 0xD153, 0x88C7, 0xD154, 0x88C8, + 0xD155, 0x88CA, 0xD156, 0x88CB, 0xD157, 0x88CC, 0xD158, 0x88CD, + 0xD159, 0x88CF, 0xD15A, 0x88D0, 0xD15B, 0x88D1, 0xD15C, 0x88D3, + 0xD15D, 0x88D6, 0xD15E, 0x88D7, 0xD15F, 0x88DA, 0xD160, 0x88DB, + 0xD161, 0x88DC, 0xD162, 0x88DD, 0xD163, 0x88DE, 0xD164, 0x88E0, + 0xD165, 0x88E1, 0xD166, 0x88E6, 0xD167, 0x88E7, 0xD168, 0x88E9, + 0xD169, 0x88EA, 0xD16A, 0x88EB, 0xD16B, 0x88EC, 0xD16C, 0x88ED, + 0xD16D, 0x88EE, 0xD16E, 0x88EF, 0xD16F, 0x88F2, 0xD170, 0x88F5, + 0xD171, 0x88F6, 0xD172, 0x88F7, 0xD173, 0x88FA, 0xD174, 0x88FB, + 0xD175, 0x88FD, 0xD176, 0x88FF, 0xD177, 0x8900, 0xD178, 0x8901, + 0xD179, 0x8903, 0xD17A, 0x8904, 0xD17B, 0x8905, 0xD17C, 0x8906, + 0xD17D, 0x8907, 0xD17E, 0x8908, 0xD180, 0x8909, 0xD181, 0x890B, + 0xD182, 0x890C, 0xD183, 0x890D, 0xD184, 0x890E, 0xD185, 0x890F, + 0xD186, 0x8911, 0xD187, 0x8914, 0xD188, 0x8915, 0xD189, 0x8916, + 0xD18A, 0x8917, 0xD18B, 0x8918, 0xD18C, 0x891C, 0xD18D, 0x891D, + 0xD18E, 0x891E, 0xD18F, 0x891F, 0xD190, 0x8920, 0xD191, 0x8922, + 0xD192, 0x8923, 0xD193, 0x8924, 0xD194, 0x8926, 0xD195, 0x8927, + 0xD196, 0x8928, 0xD197, 0x8929, 0xD198, 0x892C, 0xD199, 0x892D, + 0xD19A, 0x892E, 0xD19B, 0x892F, 0xD19C, 0x8931, 0xD19D, 0x8932, + 0xD19E, 0x8933, 0xD19F, 0x8935, 0xD1A0, 0x8937, 0xD1A1, 0x9009, + 0xD1A2, 0x7663, 0xD1A3, 0x7729, 0xD1A4, 0x7EDA, 0xD1A5, 0x9774, + 0xD1A6, 0x859B, 0xD1A7, 0x5B66, 0xD1A8, 0x7A74, 0xD1A9, 0x96EA, + 0xD1AA, 0x8840, 0xD1AB, 0x52CB, 0xD1AC, 0x718F, 0xD1AD, 0x5FAA, + 0xD1AE, 0x65EC, 0xD1AF, 0x8BE2, 0xD1B0, 0x5BFB, 0xD1B1, 0x9A6F, + 0xD1B2, 0x5DE1, 0xD1B3, 0x6B89, 0xD1B4, 0x6C5B, 0xD1B5, 0x8BAD, + 0xD1B6, 0x8BAF, 0xD1B7, 0x900A, 0xD1B8, 0x8FC5, 0xD1B9, 0x538B, + 0xD1BA, 0x62BC, 0xD1BB, 0x9E26, 0xD1BC, 0x9E2D, 0xD1BD, 0x5440, + 0xD1BE, 0x4E2B, 0xD1BF, 0x82BD, 0xD1C0, 0x7259, 0xD1C1, 0x869C, + 0xD1C2, 0x5D16, 0xD1C3, 0x8859, 0xD1C4, 0x6DAF, 0xD1C5, 0x96C5, + 0xD1C6, 0x54D1, 0xD1C7, 0x4E9A, 0xD1C8, 0x8BB6, 0xD1C9, 0x7109, + 0xD1CA, 0x54BD, 0xD1CB, 0x9609, 0xD1CC, 0x70DF, 0xD1CD, 0x6DF9, + 0xD1CE, 0x76D0, 0xD1CF, 0x4E25, 0xD1D0, 0x7814, 0xD1D1, 0x8712, + 0xD1D2, 0x5CA9, 0xD1D3, 0x5EF6, 0xD1D4, 0x8A00, 0xD1D5, 0x989C, + 0xD1D6, 0x960E, 0xD1D7, 0x708E, 0xD1D8, 0x6CBF, 0xD1D9, 0x5944, + 0xD1DA, 0x63A9, 0xD1DB, 0x773C, 0xD1DC, 0x884D, 0xD1DD, 0x6F14, + 0xD1DE, 0x8273, 0xD1DF, 0x5830, 0xD1E0, 0x71D5, 0xD1E1, 0x538C, + 0xD1E2, 0x781A, 0xD1E3, 0x96C1, 0xD1E4, 0x5501, 0xD1E5, 0x5F66, + 0xD1E6, 0x7130, 0xD1E7, 0x5BB4, 0xD1E8, 0x8C1A, 0xD1E9, 0x9A8C, + 0xD1EA, 0x6B83, 0xD1EB, 0x592E, 0xD1EC, 0x9E2F, 0xD1ED, 0x79E7, + 0xD1EE, 0x6768, 0xD1EF, 0x626C, 0xD1F0, 0x4F6F, 0xD1F1, 0x75A1, + 0xD1F2, 0x7F8A, 0xD1F3, 0x6D0B, 0xD1F4, 0x9633, 0xD1F5, 0x6C27, + 0xD1F6, 0x4EF0, 0xD1F7, 0x75D2, 0xD1F8, 0x517B, 0xD1F9, 0x6837, + 0xD1FA, 0x6F3E, 0xD1FB, 0x9080, 0xD1FC, 0x8170, 0xD1FD, 0x5996, + 0xD1FE, 0x7476, 0xD240, 0x8938, 0xD241, 0x8939, 0xD242, 0x893A, + 0xD243, 0x893B, 0xD244, 0x893C, 0xD245, 0x893D, 0xD246, 0x893E, + 0xD247, 0x893F, 0xD248, 0x8940, 0xD249, 0x8942, 0xD24A, 0x8943, + 0xD24B, 0x8945, 0xD24C, 0x8946, 0xD24D, 0x8947, 0xD24E, 0x8948, + 0xD24F, 0x8949, 0xD250, 0x894A, 0xD251, 0x894B, 0xD252, 0x894C, + 0xD253, 0x894D, 0xD254, 0x894E, 0xD255, 0x894F, 0xD256, 0x8950, + 0xD257, 0x8951, 0xD258, 0x8952, 0xD259, 0x8953, 0xD25A, 0x8954, + 0xD25B, 0x8955, 0xD25C, 0x8956, 0xD25D, 0x8957, 0xD25E, 0x8958, + 0xD25F, 0x8959, 0xD260, 0x895A, 0xD261, 0x895B, 0xD262, 0x895C, + 0xD263, 0x895D, 0xD264, 0x8960, 0xD265, 0x8961, 0xD266, 0x8962, + 0xD267, 0x8963, 0xD268, 0x8964, 0xD269, 0x8965, 0xD26A, 0x8967, + 0xD26B, 0x8968, 0xD26C, 0x8969, 0xD26D, 0x896A, 0xD26E, 0x896B, + 0xD26F, 0x896C, 0xD270, 0x896D, 0xD271, 0x896E, 0xD272, 0x896F, + 0xD273, 0x8970, 0xD274, 0x8971, 0xD275, 0x8972, 0xD276, 0x8973, + 0xD277, 0x8974, 0xD278, 0x8975, 0xD279, 0x8976, 0xD27A, 0x8977, + 0xD27B, 0x8978, 0xD27C, 0x8979, 0xD27D, 0x897A, 0xD27E, 0x897C, + 0xD280, 0x897D, 0xD281, 0x897E, 0xD282, 0x8980, 0xD283, 0x8982, + 0xD284, 0x8984, 0xD285, 0x8985, 0xD286, 0x8987, 0xD287, 0x8988, + 0xD288, 0x8989, 0xD289, 0x898A, 0xD28A, 0x898B, 0xD28B, 0x898C, + 0xD28C, 0x898D, 0xD28D, 0x898E, 0xD28E, 0x898F, 0xD28F, 0x8990, + 0xD290, 0x8991, 0xD291, 0x8992, 0xD292, 0x8993, 0xD293, 0x8994, + 0xD294, 0x8995, 0xD295, 0x8996, 0xD296, 0x8997, 0xD297, 0x8998, + 0xD298, 0x8999, 0xD299, 0x899A, 0xD29A, 0x899B, 0xD29B, 0x899C, + 0xD29C, 0x899D, 0xD29D, 0x899E, 0xD29E, 0x899F, 0xD29F, 0x89A0, + 0xD2A0, 0x89A1, 0xD2A1, 0x6447, 0xD2A2, 0x5C27, 0xD2A3, 0x9065, + 0xD2A4, 0x7A91, 0xD2A5, 0x8C23, 0xD2A6, 0x59DA, 0xD2A7, 0x54AC, + 0xD2A8, 0x8200, 0xD2A9, 0x836F, 0xD2AA, 0x8981, 0xD2AB, 0x8000, + 0xD2AC, 0x6930, 0xD2AD, 0x564E, 0xD2AE, 0x8036, 0xD2AF, 0x7237, + 0xD2B0, 0x91CE, 0xD2B1, 0x51B6, 0xD2B2, 0x4E5F, 0xD2B3, 0x9875, + 0xD2B4, 0x6396, 0xD2B5, 0x4E1A, 0xD2B6, 0x53F6, 0xD2B7, 0x66F3, + 0xD2B8, 0x814B, 0xD2B9, 0x591C, 0xD2BA, 0x6DB2, 0xD2BB, 0x4E00, + 0xD2BC, 0x58F9, 0xD2BD, 0x533B, 0xD2BE, 0x63D6, 0xD2BF, 0x94F1, + 0xD2C0, 0x4F9D, 0xD2C1, 0x4F0A, 0xD2C2, 0x8863, 0xD2C3, 0x9890, + 0xD2C4, 0x5937, 0xD2C5, 0x9057, 0xD2C6, 0x79FB, 0xD2C7, 0x4EEA, + 0xD2C8, 0x80F0, 0xD2C9, 0x7591, 0xD2CA, 0x6C82, 0xD2CB, 0x5B9C, + 0xD2CC, 0x59E8, 0xD2CD, 0x5F5D, 0xD2CE, 0x6905, 0xD2CF, 0x8681, + 0xD2D0, 0x501A, 0xD2D1, 0x5DF2, 0xD2D2, 0x4E59, 0xD2D3, 0x77E3, + 0xD2D4, 0x4EE5, 0xD2D5, 0x827A, 0xD2D6, 0x6291, 0xD2D7, 0x6613, + 0xD2D8, 0x9091, 0xD2D9, 0x5C79, 0xD2DA, 0x4EBF, 0xD2DB, 0x5F79, + 0xD2DC, 0x81C6, 0xD2DD, 0x9038, 0xD2DE, 0x8084, 0xD2DF, 0x75AB, + 0xD2E0, 0x4EA6, 0xD2E1, 0x88D4, 0xD2E2, 0x610F, 0xD2E3, 0x6BC5, + 0xD2E4, 0x5FC6, 0xD2E5, 0x4E49, 0xD2E6, 0x76CA, 0xD2E7, 0x6EA2, + 0xD2E8, 0x8BE3, 0xD2E9, 0x8BAE, 0xD2EA, 0x8C0A, 0xD2EB, 0x8BD1, + 0xD2EC, 0x5F02, 0xD2ED, 0x7FFC, 0xD2EE, 0x7FCC, 0xD2EF, 0x7ECE, + 0xD2F0, 0x8335, 0xD2F1, 0x836B, 0xD2F2, 0x56E0, 0xD2F3, 0x6BB7, + 0xD2F4, 0x97F3, 0xD2F5, 0x9634, 0xD2F6, 0x59FB, 0xD2F7, 0x541F, + 0xD2F8, 0x94F6, 0xD2F9, 0x6DEB, 0xD2FA, 0x5BC5, 0xD2FB, 0x996E, + 0xD2FC, 0x5C39, 0xD2FD, 0x5F15, 0xD2FE, 0x9690, 0xD340, 0x89A2, + 0xD341, 0x89A3, 0xD342, 0x89A4, 0xD343, 0x89A5, 0xD344, 0x89A6, + 0xD345, 0x89A7, 0xD346, 0x89A8, 0xD347, 0x89A9, 0xD348, 0x89AA, + 0xD349, 0x89AB, 0xD34A, 0x89AC, 0xD34B, 0x89AD, 0xD34C, 0x89AE, + 0xD34D, 0x89AF, 0xD34E, 0x89B0, 0xD34F, 0x89B1, 0xD350, 0x89B2, + 0xD351, 0x89B3, 0xD352, 0x89B4, 0xD353, 0x89B5, 0xD354, 0x89B6, + 0xD355, 0x89B7, 0xD356, 0x89B8, 0xD357, 0x89B9, 0xD358, 0x89BA, + 0xD359, 0x89BB, 0xD35A, 0x89BC, 0xD35B, 0x89BD, 0xD35C, 0x89BE, + 0xD35D, 0x89BF, 0xD35E, 0x89C0, 0xD35F, 0x89C3, 0xD360, 0x89CD, + 0xD361, 0x89D3, 0xD362, 0x89D4, 0xD363, 0x89D5, 0xD364, 0x89D7, + 0xD365, 0x89D8, 0xD366, 0x89D9, 0xD367, 0x89DB, 0xD368, 0x89DD, + 0xD369, 0x89DF, 0xD36A, 0x89E0, 0xD36B, 0x89E1, 0xD36C, 0x89E2, + 0xD36D, 0x89E4, 0xD36E, 0x89E7, 0xD36F, 0x89E8, 0xD370, 0x89E9, + 0xD371, 0x89EA, 0xD372, 0x89EC, 0xD373, 0x89ED, 0xD374, 0x89EE, + 0xD375, 0x89F0, 0xD376, 0x89F1, 0xD377, 0x89F2, 0xD378, 0x89F4, + 0xD379, 0x89F5, 0xD37A, 0x89F6, 0xD37B, 0x89F7, 0xD37C, 0x89F8, + 0xD37D, 0x89F9, 0xD37E, 0x89FA, 0xD380, 0x89FB, 0xD381, 0x89FC, + 0xD382, 0x89FD, 0xD383, 0x89FE, 0xD384, 0x89FF, 0xD385, 0x8A01, + 0xD386, 0x8A02, 0xD387, 0x8A03, 0xD388, 0x8A04, 0xD389, 0x8A05, + 0xD38A, 0x8A06, 0xD38B, 0x8A08, 0xD38C, 0x8A09, 0xD38D, 0x8A0A, + 0xD38E, 0x8A0B, 0xD38F, 0x8A0C, 0xD390, 0x8A0D, 0xD391, 0x8A0E, + 0xD392, 0x8A0F, 0xD393, 0x8A10, 0xD394, 0x8A11, 0xD395, 0x8A12, + 0xD396, 0x8A13, 0xD397, 0x8A14, 0xD398, 0x8A15, 0xD399, 0x8A16, + 0xD39A, 0x8A17, 0xD39B, 0x8A18, 0xD39C, 0x8A19, 0xD39D, 0x8A1A, + 0xD39E, 0x8A1B, 0xD39F, 0x8A1C, 0xD3A0, 0x8A1D, 0xD3A1, 0x5370, + 0xD3A2, 0x82F1, 0xD3A3, 0x6A31, 0xD3A4, 0x5A74, 0xD3A5, 0x9E70, + 0xD3A6, 0x5E94, 0xD3A7, 0x7F28, 0xD3A8, 0x83B9, 0xD3A9, 0x8424, + 0xD3AA, 0x8425, 0xD3AB, 0x8367, 0xD3AC, 0x8747, 0xD3AD, 0x8FCE, + 0xD3AE, 0x8D62, 0xD3AF, 0x76C8, 0xD3B0, 0x5F71, 0xD3B1, 0x9896, + 0xD3B2, 0x786C, 0xD3B3, 0x6620, 0xD3B4, 0x54DF, 0xD3B5, 0x62E5, + 0xD3B6, 0x4F63, 0xD3B7, 0x81C3, 0xD3B8, 0x75C8, 0xD3B9, 0x5EB8, + 0xD3BA, 0x96CD, 0xD3BB, 0x8E0A, 0xD3BC, 0x86F9, 0xD3BD, 0x548F, + 0xD3BE, 0x6CF3, 0xD3BF, 0x6D8C, 0xD3C0, 0x6C38, 0xD3C1, 0x607F, + 0xD3C2, 0x52C7, 0xD3C3, 0x7528, 0xD3C4, 0x5E7D, 0xD3C5, 0x4F18, + 0xD3C6, 0x60A0, 0xD3C7, 0x5FE7, 0xD3C8, 0x5C24, 0xD3C9, 0x7531, + 0xD3CA, 0x90AE, 0xD3CB, 0x94C0, 0xD3CC, 0x72B9, 0xD3CD, 0x6CB9, + 0xD3CE, 0x6E38, 0xD3CF, 0x9149, 0xD3D0, 0x6709, 0xD3D1, 0x53CB, + 0xD3D2, 0x53F3, 0xD3D3, 0x4F51, 0xD3D4, 0x91C9, 0xD3D5, 0x8BF1, + 0xD3D6, 0x53C8, 0xD3D7, 0x5E7C, 0xD3D8, 0x8FC2, 0xD3D9, 0x6DE4, + 0xD3DA, 0x4E8E, 0xD3DB, 0x76C2, 0xD3DC, 0x6986, 0xD3DD, 0x865E, + 0xD3DE, 0x611A, 0xD3DF, 0x8206, 0xD3E0, 0x4F59, 0xD3E1, 0x4FDE, + 0xD3E2, 0x903E, 0xD3E3, 0x9C7C, 0xD3E4, 0x6109, 0xD3E5, 0x6E1D, + 0xD3E6, 0x6E14, 0xD3E7, 0x9685, 0xD3E8, 0x4E88, 0xD3E9, 0x5A31, + 0xD3EA, 0x96E8, 0xD3EB, 0x4E0E, 0xD3EC, 0x5C7F, 0xD3ED, 0x79B9, + 0xD3EE, 0x5B87, 0xD3EF, 0x8BED, 0xD3F0, 0x7FBD, 0xD3F1, 0x7389, + 0xD3F2, 0x57DF, 0xD3F3, 0x828B, 0xD3F4, 0x90C1, 0xD3F5, 0x5401, + 0xD3F6, 0x9047, 0xD3F7, 0x55BB, 0xD3F8, 0x5CEA, 0xD3F9, 0x5FA1, + 0xD3FA, 0x6108, 0xD3FB, 0x6B32, 0xD3FC, 0x72F1, 0xD3FD, 0x80B2, + 0xD3FE, 0x8A89, 0xD440, 0x8A1E, 0xD441, 0x8A1F, 0xD442, 0x8A20, + 0xD443, 0x8A21, 0xD444, 0x8A22, 0xD445, 0x8A23, 0xD446, 0x8A24, + 0xD447, 0x8A25, 0xD448, 0x8A26, 0xD449, 0x8A27, 0xD44A, 0x8A28, + 0xD44B, 0x8A29, 0xD44C, 0x8A2A, 0xD44D, 0x8A2B, 0xD44E, 0x8A2C, + 0xD44F, 0x8A2D, 0xD450, 0x8A2E, 0xD451, 0x8A2F, 0xD452, 0x8A30, + 0xD453, 0x8A31, 0xD454, 0x8A32, 0xD455, 0x8A33, 0xD456, 0x8A34, + 0xD457, 0x8A35, 0xD458, 0x8A36, 0xD459, 0x8A37, 0xD45A, 0x8A38, + 0xD45B, 0x8A39, 0xD45C, 0x8A3A, 0xD45D, 0x8A3B, 0xD45E, 0x8A3C, + 0xD45F, 0x8A3D, 0xD460, 0x8A3F, 0xD461, 0x8A40, 0xD462, 0x8A41, + 0xD463, 0x8A42, 0xD464, 0x8A43, 0xD465, 0x8A44, 0xD466, 0x8A45, + 0xD467, 0x8A46, 0xD468, 0x8A47, 0xD469, 0x8A49, 0xD46A, 0x8A4A, + 0xD46B, 0x8A4B, 0xD46C, 0x8A4C, 0xD46D, 0x8A4D, 0xD46E, 0x8A4E, + 0xD46F, 0x8A4F, 0xD470, 0x8A50, 0xD471, 0x8A51, 0xD472, 0x8A52, + 0xD473, 0x8A53, 0xD474, 0x8A54, 0xD475, 0x8A55, 0xD476, 0x8A56, + 0xD477, 0x8A57, 0xD478, 0x8A58, 0xD479, 0x8A59, 0xD47A, 0x8A5A, + 0xD47B, 0x8A5B, 0xD47C, 0x8A5C, 0xD47D, 0x8A5D, 0xD47E, 0x8A5E, + 0xD480, 0x8A5F, 0xD481, 0x8A60, 0xD482, 0x8A61, 0xD483, 0x8A62, + 0xD484, 0x8A63, 0xD485, 0x8A64, 0xD486, 0x8A65, 0xD487, 0x8A66, + 0xD488, 0x8A67, 0xD489, 0x8A68, 0xD48A, 0x8A69, 0xD48B, 0x8A6A, + 0xD48C, 0x8A6B, 0xD48D, 0x8A6C, 0xD48E, 0x8A6D, 0xD48F, 0x8A6E, + 0xD490, 0x8A6F, 0xD491, 0x8A70, 0xD492, 0x8A71, 0xD493, 0x8A72, + 0xD494, 0x8A73, 0xD495, 0x8A74, 0xD496, 0x8A75, 0xD497, 0x8A76, + 0xD498, 0x8A77, 0xD499, 0x8A78, 0xD49A, 0x8A7A, 0xD49B, 0x8A7B, + 0xD49C, 0x8A7C, 0xD49D, 0x8A7D, 0xD49E, 0x8A7E, 0xD49F, 0x8A7F, + 0xD4A0, 0x8A80, 0xD4A1, 0x6D74, 0xD4A2, 0x5BD3, 0xD4A3, 0x88D5, + 0xD4A4, 0x9884, 0xD4A5, 0x8C6B, 0xD4A6, 0x9A6D, 0xD4A7, 0x9E33, + 0xD4A8, 0x6E0A, 0xD4A9, 0x51A4, 0xD4AA, 0x5143, 0xD4AB, 0x57A3, + 0xD4AC, 0x8881, 0xD4AD, 0x539F, 0xD4AE, 0x63F4, 0xD4AF, 0x8F95, + 0xD4B0, 0x56ED, 0xD4B1, 0x5458, 0xD4B2, 0x5706, 0xD4B3, 0x733F, + 0xD4B4, 0x6E90, 0xD4B5, 0x7F18, 0xD4B6, 0x8FDC, 0xD4B7, 0x82D1, + 0xD4B8, 0x613F, 0xD4B9, 0x6028, 0xD4BA, 0x9662, 0xD4BB, 0x66F0, + 0xD4BC, 0x7EA6, 0xD4BD, 0x8D8A, 0xD4BE, 0x8DC3, 0xD4BF, 0x94A5, + 0xD4C0, 0x5CB3, 0xD4C1, 0x7CA4, 0xD4C2, 0x6708, 0xD4C3, 0x60A6, + 0xD4C4, 0x9605, 0xD4C5, 0x8018, 0xD4C6, 0x4E91, 0xD4C7, 0x90E7, + 0xD4C8, 0x5300, 0xD4C9, 0x9668, 0xD4CA, 0x5141, 0xD4CB, 0x8FD0, + 0xD4CC, 0x8574, 0xD4CD, 0x915D, 0xD4CE, 0x6655, 0xD4CF, 0x97F5, + 0xD4D0, 0x5B55, 0xD4D1, 0x531D, 0xD4D2, 0x7838, 0xD4D3, 0x6742, + 0xD4D4, 0x683D, 0xD4D5, 0x54C9, 0xD4D6, 0x707E, 0xD4D7, 0x5BB0, + 0xD4D8, 0x8F7D, 0xD4D9, 0x518D, 0xD4DA, 0x5728, 0xD4DB, 0x54B1, + 0xD4DC, 0x6512, 0xD4DD, 0x6682, 0xD4DE, 0x8D5E, 0xD4DF, 0x8D43, + 0xD4E0, 0x810F, 0xD4E1, 0x846C, 0xD4E2, 0x906D, 0xD4E3, 0x7CDF, + 0xD4E4, 0x51FF, 0xD4E5, 0x85FB, 0xD4E6, 0x67A3, 0xD4E7, 0x65E9, + 0xD4E8, 0x6FA1, 0xD4E9, 0x86A4, 0xD4EA, 0x8E81, 0xD4EB, 0x566A, + 0xD4EC, 0x9020, 0xD4ED, 0x7682, 0xD4EE, 0x7076, 0xD4EF, 0x71E5, + 0xD4F0, 0x8D23, 0xD4F1, 0x62E9, 0xD4F2, 0x5219, 0xD4F3, 0x6CFD, + 0xD4F4, 0x8D3C, 0xD4F5, 0x600E, 0xD4F6, 0x589E, 0xD4F7, 0x618E, + 0xD4F8, 0x66FE, 0xD4F9, 0x8D60, 0xD4FA, 0x624E, 0xD4FB, 0x55B3, + 0xD4FC, 0x6E23, 0xD4FD, 0x672D, 0xD4FE, 0x8F67, 0xD540, 0x8A81, + 0xD541, 0x8A82, 0xD542, 0x8A83, 0xD543, 0x8A84, 0xD544, 0x8A85, + 0xD545, 0x8A86, 0xD546, 0x8A87, 0xD547, 0x8A88, 0xD548, 0x8A8B, + 0xD549, 0x8A8C, 0xD54A, 0x8A8D, 0xD54B, 0x8A8E, 0xD54C, 0x8A8F, + 0xD54D, 0x8A90, 0xD54E, 0x8A91, 0xD54F, 0x8A92, 0xD550, 0x8A94, + 0xD551, 0x8A95, 0xD552, 0x8A96, 0xD553, 0x8A97, 0xD554, 0x8A98, + 0xD555, 0x8A99, 0xD556, 0x8A9A, 0xD557, 0x8A9B, 0xD558, 0x8A9C, + 0xD559, 0x8A9D, 0xD55A, 0x8A9E, 0xD55B, 0x8A9F, 0xD55C, 0x8AA0, + 0xD55D, 0x8AA1, 0xD55E, 0x8AA2, 0xD55F, 0x8AA3, 0xD560, 0x8AA4, + 0xD561, 0x8AA5, 0xD562, 0x8AA6, 0xD563, 0x8AA7, 0xD564, 0x8AA8, + 0xD565, 0x8AA9, 0xD566, 0x8AAA, 0xD567, 0x8AAB, 0xD568, 0x8AAC, + 0xD569, 0x8AAD, 0xD56A, 0x8AAE, 0xD56B, 0x8AAF, 0xD56C, 0x8AB0, + 0xD56D, 0x8AB1, 0xD56E, 0x8AB2, 0xD56F, 0x8AB3, 0xD570, 0x8AB4, + 0xD571, 0x8AB5, 0xD572, 0x8AB6, 0xD573, 0x8AB7, 0xD574, 0x8AB8, + 0xD575, 0x8AB9, 0xD576, 0x8ABA, 0xD577, 0x8ABB, 0xD578, 0x8ABC, + 0xD579, 0x8ABD, 0xD57A, 0x8ABE, 0xD57B, 0x8ABF, 0xD57C, 0x8AC0, + 0xD57D, 0x8AC1, 0xD57E, 0x8AC2, 0xD580, 0x8AC3, 0xD581, 0x8AC4, + 0xD582, 0x8AC5, 0xD583, 0x8AC6, 0xD584, 0x8AC7, 0xD585, 0x8AC8, + 0xD586, 0x8AC9, 0xD587, 0x8ACA, 0xD588, 0x8ACB, 0xD589, 0x8ACC, + 0xD58A, 0x8ACD, 0xD58B, 0x8ACE, 0xD58C, 0x8ACF, 0xD58D, 0x8AD0, + 0xD58E, 0x8AD1, 0xD58F, 0x8AD2, 0xD590, 0x8AD3, 0xD591, 0x8AD4, + 0xD592, 0x8AD5, 0xD593, 0x8AD6, 0xD594, 0x8AD7, 0xD595, 0x8AD8, + 0xD596, 0x8AD9, 0xD597, 0x8ADA, 0xD598, 0x8ADB, 0xD599, 0x8ADC, + 0xD59A, 0x8ADD, 0xD59B, 0x8ADE, 0xD59C, 0x8ADF, 0xD59D, 0x8AE0, + 0xD59E, 0x8AE1, 0xD59F, 0x8AE2, 0xD5A0, 0x8AE3, 0xD5A1, 0x94E1, + 0xD5A2, 0x95F8, 0xD5A3, 0x7728, 0xD5A4, 0x6805, 0xD5A5, 0x69A8, + 0xD5A6, 0x548B, 0xD5A7, 0x4E4D, 0xD5A8, 0x70B8, 0xD5A9, 0x8BC8, + 0xD5AA, 0x6458, 0xD5AB, 0x658B, 0xD5AC, 0x5B85, 0xD5AD, 0x7A84, + 0xD5AE, 0x503A, 0xD5AF, 0x5BE8, 0xD5B0, 0x77BB, 0xD5B1, 0x6BE1, + 0xD5B2, 0x8A79, 0xD5B3, 0x7C98, 0xD5B4, 0x6CBE, 0xD5B5, 0x76CF, + 0xD5B6, 0x65A9, 0xD5B7, 0x8F97, 0xD5B8, 0x5D2D, 0xD5B9, 0x5C55, + 0xD5BA, 0x8638, 0xD5BB, 0x6808, 0xD5BC, 0x5360, 0xD5BD, 0x6218, + 0xD5BE, 0x7AD9, 0xD5BF, 0x6E5B, 0xD5C0, 0x7EFD, 0xD5C1, 0x6A1F, + 0xD5C2, 0x7AE0, 0xD5C3, 0x5F70, 0xD5C4, 0x6F33, 0xD5C5, 0x5F20, + 0xD5C6, 0x638C, 0xD5C7, 0x6DA8, 0xD5C8, 0x6756, 0xD5C9, 0x4E08, + 0xD5CA, 0x5E10, 0xD5CB, 0x8D26, 0xD5CC, 0x4ED7, 0xD5CD, 0x80C0, + 0xD5CE, 0x7634, 0xD5CF, 0x969C, 0xD5D0, 0x62DB, 0xD5D1, 0x662D, + 0xD5D2, 0x627E, 0xD5D3, 0x6CBC, 0xD5D4, 0x8D75, 0xD5D5, 0x7167, + 0xD5D6, 0x7F69, 0xD5D7, 0x5146, 0xD5D8, 0x8087, 0xD5D9, 0x53EC, + 0xD5DA, 0x906E, 0xD5DB, 0x6298, 0xD5DC, 0x54F2, 0xD5DD, 0x86F0, + 0xD5DE, 0x8F99, 0xD5DF, 0x8005, 0xD5E0, 0x9517, 0xD5E1, 0x8517, + 0xD5E2, 0x8FD9, 0xD5E3, 0x6D59, 0xD5E4, 0x73CD, 0xD5E5, 0x659F, + 0xD5E6, 0x771F, 0xD5E7, 0x7504, 0xD5E8, 0x7827, 0xD5E9, 0x81FB, + 0xD5EA, 0x8D1E, 0xD5EB, 0x9488, 0xD5EC, 0x4FA6, 0xD5ED, 0x6795, + 0xD5EE, 0x75B9, 0xD5EF, 0x8BCA, 0xD5F0, 0x9707, 0xD5F1, 0x632F, + 0xD5F2, 0x9547, 0xD5F3, 0x9635, 0xD5F4, 0x84B8, 0xD5F5, 0x6323, + 0xD5F6, 0x7741, 0xD5F7, 0x5F81, 0xD5F8, 0x72F0, 0xD5F9, 0x4E89, + 0xD5FA, 0x6014, 0xD5FB, 0x6574, 0xD5FC, 0x62EF, 0xD5FD, 0x6B63, + 0xD5FE, 0x653F, 0xD640, 0x8AE4, 0xD641, 0x8AE5, 0xD642, 0x8AE6, + 0xD643, 0x8AE7, 0xD644, 0x8AE8, 0xD645, 0x8AE9, 0xD646, 0x8AEA, + 0xD647, 0x8AEB, 0xD648, 0x8AEC, 0xD649, 0x8AED, 0xD64A, 0x8AEE, + 0xD64B, 0x8AEF, 0xD64C, 0x8AF0, 0xD64D, 0x8AF1, 0xD64E, 0x8AF2, + 0xD64F, 0x8AF3, 0xD650, 0x8AF4, 0xD651, 0x8AF5, 0xD652, 0x8AF6, + 0xD653, 0x8AF7, 0xD654, 0x8AF8, 0xD655, 0x8AF9, 0xD656, 0x8AFA, + 0xD657, 0x8AFB, 0xD658, 0x8AFC, 0xD659, 0x8AFD, 0xD65A, 0x8AFE, + 0xD65B, 0x8AFF, 0xD65C, 0x8B00, 0xD65D, 0x8B01, 0xD65E, 0x8B02, + 0xD65F, 0x8B03, 0xD660, 0x8B04, 0xD661, 0x8B05, 0xD662, 0x8B06, + 0xD663, 0x8B08, 0xD664, 0x8B09, 0xD665, 0x8B0A, 0xD666, 0x8B0B, + 0xD667, 0x8B0C, 0xD668, 0x8B0D, 0xD669, 0x8B0E, 0xD66A, 0x8B0F, + 0xD66B, 0x8B10, 0xD66C, 0x8B11, 0xD66D, 0x8B12, 0xD66E, 0x8B13, + 0xD66F, 0x8B14, 0xD670, 0x8B15, 0xD671, 0x8B16, 0xD672, 0x8B17, + 0xD673, 0x8B18, 0xD674, 0x8B19, 0xD675, 0x8B1A, 0xD676, 0x8B1B, + 0xD677, 0x8B1C, 0xD678, 0x8B1D, 0xD679, 0x8B1E, 0xD67A, 0x8B1F, + 0xD67B, 0x8B20, 0xD67C, 0x8B21, 0xD67D, 0x8B22, 0xD67E, 0x8B23, + 0xD680, 0x8B24, 0xD681, 0x8B25, 0xD682, 0x8B27, 0xD683, 0x8B28, + 0xD684, 0x8B29, 0xD685, 0x8B2A, 0xD686, 0x8B2B, 0xD687, 0x8B2C, + 0xD688, 0x8B2D, 0xD689, 0x8B2E, 0xD68A, 0x8B2F, 0xD68B, 0x8B30, + 0xD68C, 0x8B31, 0xD68D, 0x8B32, 0xD68E, 0x8B33, 0xD68F, 0x8B34, + 0xD690, 0x8B35, 0xD691, 0x8B36, 0xD692, 0x8B37, 0xD693, 0x8B38, + 0xD694, 0x8B39, 0xD695, 0x8B3A, 0xD696, 0x8B3B, 0xD697, 0x8B3C, + 0xD698, 0x8B3D, 0xD699, 0x8B3E, 0xD69A, 0x8B3F, 0xD69B, 0x8B40, + 0xD69C, 0x8B41, 0xD69D, 0x8B42, 0xD69E, 0x8B43, 0xD69F, 0x8B44, + 0xD6A0, 0x8B45, 0xD6A1, 0x5E27, 0xD6A2, 0x75C7, 0xD6A3, 0x90D1, + 0xD6A4, 0x8BC1, 0xD6A5, 0x829D, 0xD6A6, 0x679D, 0xD6A7, 0x652F, + 0xD6A8, 0x5431, 0xD6A9, 0x8718, 0xD6AA, 0x77E5, 0xD6AB, 0x80A2, + 0xD6AC, 0x8102, 0xD6AD, 0x6C41, 0xD6AE, 0x4E4B, 0xD6AF, 0x7EC7, + 0xD6B0, 0x804C, 0xD6B1, 0x76F4, 0xD6B2, 0x690D, 0xD6B3, 0x6B96, + 0xD6B4, 0x6267, 0xD6B5, 0x503C, 0xD6B6, 0x4F84, 0xD6B7, 0x5740, + 0xD6B8, 0x6307, 0xD6B9, 0x6B62, 0xD6BA, 0x8DBE, 0xD6BB, 0x53EA, + 0xD6BC, 0x65E8, 0xD6BD, 0x7EB8, 0xD6BE, 0x5FD7, 0xD6BF, 0x631A, + 0xD6C0, 0x63B7, 0xD6C1, 0x81F3, 0xD6C2, 0x81F4, 0xD6C3, 0x7F6E, + 0xD6C4, 0x5E1C, 0xD6C5, 0x5CD9, 0xD6C6, 0x5236, 0xD6C7, 0x667A, + 0xD6C8, 0x79E9, 0xD6C9, 0x7A1A, 0xD6CA, 0x8D28, 0xD6CB, 0x7099, + 0xD6CC, 0x75D4, 0xD6CD, 0x6EDE, 0xD6CE, 0x6CBB, 0xD6CF, 0x7A92, + 0xD6D0, 0x4E2D, 0xD6D1, 0x76C5, 0xD6D2, 0x5FE0, 0xD6D3, 0x949F, + 0xD6D4, 0x8877, 0xD6D5, 0x7EC8, 0xD6D6, 0x79CD, 0xD6D7, 0x80BF, + 0xD6D8, 0x91CD, 0xD6D9, 0x4EF2, 0xD6DA, 0x4F17, 0xD6DB, 0x821F, + 0xD6DC, 0x5468, 0xD6DD, 0x5DDE, 0xD6DE, 0x6D32, 0xD6DF, 0x8BCC, + 0xD6E0, 0x7CA5, 0xD6E1, 0x8F74, 0xD6E2, 0x8098, 0xD6E3, 0x5E1A, + 0xD6E4, 0x5492, 0xD6E5, 0x76B1, 0xD6E6, 0x5B99, 0xD6E7, 0x663C, + 0xD6E8, 0x9AA4, 0xD6E9, 0x73E0, 0xD6EA, 0x682A, 0xD6EB, 0x86DB, + 0xD6EC, 0x6731, 0xD6ED, 0x732A, 0xD6EE, 0x8BF8, 0xD6EF, 0x8BDB, + 0xD6F0, 0x9010, 0xD6F1, 0x7AF9, 0xD6F2, 0x70DB, 0xD6F3, 0x716E, + 0xD6F4, 0x62C4, 0xD6F5, 0x77A9, 0xD6F6, 0x5631, 0xD6F7, 0x4E3B, + 0xD6F8, 0x8457, 0xD6F9, 0x67F1, 0xD6FA, 0x52A9, 0xD6FB, 0x86C0, + 0xD6FC, 0x8D2E, 0xD6FD, 0x94F8, 0xD6FE, 0x7B51, 0xD740, 0x8B46, + 0xD741, 0x8B47, 0xD742, 0x8B48, 0xD743, 0x8B49, 0xD744, 0x8B4A, + 0xD745, 0x8B4B, 0xD746, 0x8B4C, 0xD747, 0x8B4D, 0xD748, 0x8B4E, + 0xD749, 0x8B4F, 0xD74A, 0x8B50, 0xD74B, 0x8B51, 0xD74C, 0x8B52, + 0xD74D, 0x8B53, 0xD74E, 0x8B54, 0xD74F, 0x8B55, 0xD750, 0x8B56, + 0xD751, 0x8B57, 0xD752, 0x8B58, 0xD753, 0x8B59, 0xD754, 0x8B5A, + 0xD755, 0x8B5B, 0xD756, 0x8B5C, 0xD757, 0x8B5D, 0xD758, 0x8B5E, + 0xD759, 0x8B5F, 0xD75A, 0x8B60, 0xD75B, 0x8B61, 0xD75C, 0x8B62, + 0xD75D, 0x8B63, 0xD75E, 0x8B64, 0xD75F, 0x8B65, 0xD760, 0x8B67, + 0xD761, 0x8B68, 0xD762, 0x8B69, 0xD763, 0x8B6A, 0xD764, 0x8B6B, + 0xD765, 0x8B6D, 0xD766, 0x8B6E, 0xD767, 0x8B6F, 0xD768, 0x8B70, + 0xD769, 0x8B71, 0xD76A, 0x8B72, 0xD76B, 0x8B73, 0xD76C, 0x8B74, + 0xD76D, 0x8B75, 0xD76E, 0x8B76, 0xD76F, 0x8B77, 0xD770, 0x8B78, + 0xD771, 0x8B79, 0xD772, 0x8B7A, 0xD773, 0x8B7B, 0xD774, 0x8B7C, + 0xD775, 0x8B7D, 0xD776, 0x8B7E, 0xD777, 0x8B7F, 0xD778, 0x8B80, + 0xD779, 0x8B81, 0xD77A, 0x8B82, 0xD77B, 0x8B83, 0xD77C, 0x8B84, + 0xD77D, 0x8B85, 0xD77E, 0x8B86, 0xD780, 0x8B87, 0xD781, 0x8B88, + 0xD782, 0x8B89, 0xD783, 0x8B8A, 0xD784, 0x8B8B, 0xD785, 0x8B8C, + 0xD786, 0x8B8D, 0xD787, 0x8B8E, 0xD788, 0x8B8F, 0xD789, 0x8B90, + 0xD78A, 0x8B91, 0xD78B, 0x8B92, 0xD78C, 0x8B93, 0xD78D, 0x8B94, + 0xD78E, 0x8B95, 0xD78F, 0x8B96, 0xD790, 0x8B97, 0xD791, 0x8B98, + 0xD792, 0x8B99, 0xD793, 0x8B9A, 0xD794, 0x8B9B, 0xD795, 0x8B9C, + 0xD796, 0x8B9D, 0xD797, 0x8B9E, 0xD798, 0x8B9F, 0xD799, 0x8BAC, + 0xD79A, 0x8BB1, 0xD79B, 0x8BBB, 0xD79C, 0x8BC7, 0xD79D, 0x8BD0, + 0xD79E, 0x8BEA, 0xD79F, 0x8C09, 0xD7A0, 0x8C1E, 0xD7A1, 0x4F4F, + 0xD7A2, 0x6CE8, 0xD7A3, 0x795D, 0xD7A4, 0x9A7B, 0xD7A5, 0x6293, + 0xD7A6, 0x722A, 0xD7A7, 0x62FD, 0xD7A8, 0x4E13, 0xD7A9, 0x7816, + 0xD7AA, 0x8F6C, 0xD7AB, 0x64B0, 0xD7AC, 0x8D5A, 0xD7AD, 0x7BC6, + 0xD7AE, 0x6869, 0xD7AF, 0x5E84, 0xD7B0, 0x88C5, 0xD7B1, 0x5986, + 0xD7B2, 0x649E, 0xD7B3, 0x58EE, 0xD7B4, 0x72B6, 0xD7B5, 0x690E, + 0xD7B6, 0x9525, 0xD7B7, 0x8FFD, 0xD7B8, 0x8D58, 0xD7B9, 0x5760, + 0xD7BA, 0x7F00, 0xD7BB, 0x8C06, 0xD7BC, 0x51C6, 0xD7BD, 0x6349, + 0xD7BE, 0x62D9, 0xD7BF, 0x5353, 0xD7C0, 0x684C, 0xD7C1, 0x7422, + 0xD7C2, 0x8301, 0xD7C3, 0x914C, 0xD7C4, 0x5544, 0xD7C5, 0x7740, + 0xD7C6, 0x707C, 0xD7C7, 0x6D4A, 0xD7C8, 0x5179, 0xD7C9, 0x54A8, + 0xD7CA, 0x8D44, 0xD7CB, 0x59FF, 0xD7CC, 0x6ECB, 0xD7CD, 0x6DC4, + 0xD7CE, 0x5B5C, 0xD7CF, 0x7D2B, 0xD7D0, 0x4ED4, 0xD7D1, 0x7C7D, + 0xD7D2, 0x6ED3, 0xD7D3, 0x5B50, 0xD7D4, 0x81EA, 0xD7D5, 0x6E0D, + 0xD7D6, 0x5B57, 0xD7D7, 0x9B03, 0xD7D8, 0x68D5, 0xD7D9, 0x8E2A, + 0xD7DA, 0x5B97, 0xD7DB, 0x7EFC, 0xD7DC, 0x603B, 0xD7DD, 0x7EB5, + 0xD7DE, 0x90B9, 0xD7DF, 0x8D70, 0xD7E0, 0x594F, 0xD7E1, 0x63CD, + 0xD7E2, 0x79DF, 0xD7E3, 0x8DB3, 0xD7E4, 0x5352, 0xD7E5, 0x65CF, + 0xD7E6, 0x7956, 0xD7E7, 0x8BC5, 0xD7E8, 0x963B, 0xD7E9, 0x7EC4, + 0xD7EA, 0x94BB, 0xD7EB, 0x7E82, 0xD7EC, 0x5634, 0xD7ED, 0x9189, + 0xD7EE, 0x6700, 0xD7EF, 0x7F6A, 0xD7F0, 0x5C0A, 0xD7F1, 0x9075, + 0xD7F2, 0x6628, 0xD7F3, 0x5DE6, 0xD7F4, 0x4F50, 0xD7F5, 0x67DE, + 0xD7F6, 0x505A, 0xD7F7, 0x4F5C, 0xD7F8, 0x5750, 0xD7F9, 0x5EA7, + 0xD840, 0x8C38, 0xD841, 0x8C39, 0xD842, 0x8C3A, 0xD843, 0x8C3B, + 0xD844, 0x8C3C, 0xD845, 0x8C3D, 0xD846, 0x8C3E, 0xD847, 0x8C3F, + 0xD848, 0x8C40, 0xD849, 0x8C42, 0xD84A, 0x8C43, 0xD84B, 0x8C44, + 0xD84C, 0x8C45, 0xD84D, 0x8C48, 0xD84E, 0x8C4A, 0xD84F, 0x8C4B, + 0xD850, 0x8C4D, 0xD851, 0x8C4E, 0xD852, 0x8C4F, 0xD853, 0x8C50, + 0xD854, 0x8C51, 0xD855, 0x8C52, 0xD856, 0x8C53, 0xD857, 0x8C54, + 0xD858, 0x8C56, 0xD859, 0x8C57, 0xD85A, 0x8C58, 0xD85B, 0x8C59, + 0xD85C, 0x8C5B, 0xD85D, 0x8C5C, 0xD85E, 0x8C5D, 0xD85F, 0x8C5E, + 0xD860, 0x8C5F, 0xD861, 0x8C60, 0xD862, 0x8C63, 0xD863, 0x8C64, + 0xD864, 0x8C65, 0xD865, 0x8C66, 0xD866, 0x8C67, 0xD867, 0x8C68, + 0xD868, 0x8C69, 0xD869, 0x8C6C, 0xD86A, 0x8C6D, 0xD86B, 0x8C6E, + 0xD86C, 0x8C6F, 0xD86D, 0x8C70, 0xD86E, 0x8C71, 0xD86F, 0x8C72, + 0xD870, 0x8C74, 0xD871, 0x8C75, 0xD872, 0x8C76, 0xD873, 0x8C77, + 0xD874, 0x8C7B, 0xD875, 0x8C7C, 0xD876, 0x8C7D, 0xD877, 0x8C7E, + 0xD878, 0x8C7F, 0xD879, 0x8C80, 0xD87A, 0x8C81, 0xD87B, 0x8C83, + 0xD87C, 0x8C84, 0xD87D, 0x8C86, 0xD87E, 0x8C87, 0xD880, 0x8C88, + 0xD881, 0x8C8B, 0xD882, 0x8C8D, 0xD883, 0x8C8E, 0xD884, 0x8C8F, + 0xD885, 0x8C90, 0xD886, 0x8C91, 0xD887, 0x8C92, 0xD888, 0x8C93, + 0xD889, 0x8C95, 0xD88A, 0x8C96, 0xD88B, 0x8C97, 0xD88C, 0x8C99, + 0xD88D, 0x8C9A, 0xD88E, 0x8C9B, 0xD88F, 0x8C9C, 0xD890, 0x8C9D, + 0xD891, 0x8C9E, 0xD892, 0x8C9F, 0xD893, 0x8CA0, 0xD894, 0x8CA1, + 0xD895, 0x8CA2, 0xD896, 0x8CA3, 0xD897, 0x8CA4, 0xD898, 0x8CA5, + 0xD899, 0x8CA6, 0xD89A, 0x8CA7, 0xD89B, 0x8CA8, 0xD89C, 0x8CA9, + 0xD89D, 0x8CAA, 0xD89E, 0x8CAB, 0xD89F, 0x8CAC, 0xD8A0, 0x8CAD, + 0xD8A1, 0x4E8D, 0xD8A2, 0x4E0C, 0xD8A3, 0x5140, 0xD8A4, 0x4E10, + 0xD8A5, 0x5EFF, 0xD8A6, 0x5345, 0xD8A7, 0x4E15, 0xD8A8, 0x4E98, + 0xD8A9, 0x4E1E, 0xD8AA, 0x9B32, 0xD8AB, 0x5B6C, 0xD8AC, 0x5669, + 0xD8AD, 0x4E28, 0xD8AE, 0x79BA, 0xD8AF, 0x4E3F, 0xD8B0, 0x5315, + 0xD8B1, 0x4E47, 0xD8B2, 0x592D, 0xD8B3, 0x723B, 0xD8B4, 0x536E, + 0xD8B5, 0x6C10, 0xD8B6, 0x56DF, 0xD8B7, 0x80E4, 0xD8B8, 0x9997, + 0xD8B9, 0x6BD3, 0xD8BA, 0x777E, 0xD8BB, 0x9F17, 0xD8BC, 0x4E36, + 0xD8BD, 0x4E9F, 0xD8BE, 0x9F10, 0xD8BF, 0x4E5C, 0xD8C0, 0x4E69, + 0xD8C1, 0x4E93, 0xD8C2, 0x8288, 0xD8C3, 0x5B5B, 0xD8C4, 0x556C, + 0xD8C5, 0x560F, 0xD8C6, 0x4EC4, 0xD8C7, 0x538D, 0xD8C8, 0x539D, + 0xD8C9, 0x53A3, 0xD8CA, 0x53A5, 0xD8CB, 0x53AE, 0xD8CC, 0x9765, + 0xD8CD, 0x8D5D, 0xD8CE, 0x531A, 0xD8CF, 0x53F5, 0xD8D0, 0x5326, + 0xD8D1, 0x532E, 0xD8D2, 0x533E, 0xD8D3, 0x8D5C, 0xD8D4, 0x5366, + 0xD8D5, 0x5363, 0xD8D6, 0x5202, 0xD8D7, 0x5208, 0xD8D8, 0x520E, + 0xD8D9, 0x522D, 0xD8DA, 0x5233, 0xD8DB, 0x523F, 0xD8DC, 0x5240, + 0xD8DD, 0x524C, 0xD8DE, 0x525E, 0xD8DF, 0x5261, 0xD8E0, 0x525C, + 0xD8E1, 0x84AF, 0xD8E2, 0x527D, 0xD8E3, 0x5282, 0xD8E4, 0x5281, + 0xD8E5, 0x5290, 0xD8E6, 0x5293, 0xD8E7, 0x5182, 0xD8E8, 0x7F54, + 0xD8E9, 0x4EBB, 0xD8EA, 0x4EC3, 0xD8EB, 0x4EC9, 0xD8EC, 0x4EC2, + 0xD8ED, 0x4EE8, 0xD8EE, 0x4EE1, 0xD8EF, 0x4EEB, 0xD8F0, 0x4EDE, + 0xD8F1, 0x4F1B, 0xD8F2, 0x4EF3, 0xD8F3, 0x4F22, 0xD8F4, 0x4F64, + 0xD8F5, 0x4EF5, 0xD8F6, 0x4F25, 0xD8F7, 0x4F27, 0xD8F8, 0x4F09, + 0xD8F9, 0x4F2B, 0xD8FA, 0x4F5E, 0xD8FB, 0x4F67, 0xD8FC, 0x6538, + 0xD8FD, 0x4F5A, 0xD8FE, 0x4F5D, 0xD940, 0x8CAE, 0xD941, 0x8CAF, + 0xD942, 0x8CB0, 0xD943, 0x8CB1, 0xD944, 0x8CB2, 0xD945, 0x8CB3, + 0xD946, 0x8CB4, 0xD947, 0x8CB5, 0xD948, 0x8CB6, 0xD949, 0x8CB7, + 0xD94A, 0x8CB8, 0xD94B, 0x8CB9, 0xD94C, 0x8CBA, 0xD94D, 0x8CBB, + 0xD94E, 0x8CBC, 0xD94F, 0x8CBD, 0xD950, 0x8CBE, 0xD951, 0x8CBF, + 0xD952, 0x8CC0, 0xD953, 0x8CC1, 0xD954, 0x8CC2, 0xD955, 0x8CC3, + 0xD956, 0x8CC4, 0xD957, 0x8CC5, 0xD958, 0x8CC6, 0xD959, 0x8CC7, + 0xD95A, 0x8CC8, 0xD95B, 0x8CC9, 0xD95C, 0x8CCA, 0xD95D, 0x8CCB, + 0xD95E, 0x8CCC, 0xD95F, 0x8CCD, 0xD960, 0x8CCE, 0xD961, 0x8CCF, + 0xD962, 0x8CD0, 0xD963, 0x8CD1, 0xD964, 0x8CD2, 0xD965, 0x8CD3, + 0xD966, 0x8CD4, 0xD967, 0x8CD5, 0xD968, 0x8CD6, 0xD969, 0x8CD7, + 0xD96A, 0x8CD8, 0xD96B, 0x8CD9, 0xD96C, 0x8CDA, 0xD96D, 0x8CDB, + 0xD96E, 0x8CDC, 0xD96F, 0x8CDD, 0xD970, 0x8CDE, 0xD971, 0x8CDF, + 0xD972, 0x8CE0, 0xD973, 0x8CE1, 0xD974, 0x8CE2, 0xD975, 0x8CE3, + 0xD976, 0x8CE4, 0xD977, 0x8CE5, 0xD978, 0x8CE6, 0xD979, 0x8CE7, + 0xD97A, 0x8CE8, 0xD97B, 0x8CE9, 0xD97C, 0x8CEA, 0xD97D, 0x8CEB, + 0xD97E, 0x8CEC, 0xD980, 0x8CED, 0xD981, 0x8CEE, 0xD982, 0x8CEF, + 0xD983, 0x8CF0, 0xD984, 0x8CF1, 0xD985, 0x8CF2, 0xD986, 0x8CF3, + 0xD987, 0x8CF4, 0xD988, 0x8CF5, 0xD989, 0x8CF6, 0xD98A, 0x8CF7, + 0xD98B, 0x8CF8, 0xD98C, 0x8CF9, 0xD98D, 0x8CFA, 0xD98E, 0x8CFB, + 0xD98F, 0x8CFC, 0xD990, 0x8CFD, 0xD991, 0x8CFE, 0xD992, 0x8CFF, + 0xD993, 0x8D00, 0xD994, 0x8D01, 0xD995, 0x8D02, 0xD996, 0x8D03, + 0xD997, 0x8D04, 0xD998, 0x8D05, 0xD999, 0x8D06, 0xD99A, 0x8D07, + 0xD99B, 0x8D08, 0xD99C, 0x8D09, 0xD99D, 0x8D0A, 0xD99E, 0x8D0B, + 0xD99F, 0x8D0C, 0xD9A0, 0x8D0D, 0xD9A1, 0x4F5F, 0xD9A2, 0x4F57, + 0xD9A3, 0x4F32, 0xD9A4, 0x4F3D, 0xD9A5, 0x4F76, 0xD9A6, 0x4F74, + 0xD9A7, 0x4F91, 0xD9A8, 0x4F89, 0xD9A9, 0x4F83, 0xD9AA, 0x4F8F, + 0xD9AB, 0x4F7E, 0xD9AC, 0x4F7B, 0xD9AD, 0x4FAA, 0xD9AE, 0x4F7C, + 0xD9AF, 0x4FAC, 0xD9B0, 0x4F94, 0xD9B1, 0x4FE6, 0xD9B2, 0x4FE8, + 0xD9B3, 0x4FEA, 0xD9B4, 0x4FC5, 0xD9B5, 0x4FDA, 0xD9B6, 0x4FE3, + 0xD9B7, 0x4FDC, 0xD9B8, 0x4FD1, 0xD9B9, 0x4FDF, 0xD9BA, 0x4FF8, + 0xD9BB, 0x5029, 0xD9BC, 0x504C, 0xD9BD, 0x4FF3, 0xD9BE, 0x502C, + 0xD9BF, 0x500F, 0xD9C0, 0x502E, 0xD9C1, 0x502D, 0xD9C2, 0x4FFE, + 0xD9C3, 0x501C, 0xD9C4, 0x500C, 0xD9C5, 0x5025, 0xD9C6, 0x5028, + 0xD9C7, 0x507E, 0xD9C8, 0x5043, 0xD9C9, 0x5055, 0xD9CA, 0x5048, + 0xD9CB, 0x504E, 0xD9CC, 0x506C, 0xD9CD, 0x507B, 0xD9CE, 0x50A5, + 0xD9CF, 0x50A7, 0xD9D0, 0x50A9, 0xD9D1, 0x50BA, 0xD9D2, 0x50D6, + 0xD9D3, 0x5106, 0xD9D4, 0x50ED, 0xD9D5, 0x50EC, 0xD9D6, 0x50E6, + 0xD9D7, 0x50EE, 0xD9D8, 0x5107, 0xD9D9, 0x510B, 0xD9DA, 0x4EDD, + 0xD9DB, 0x6C3D, 0xD9DC, 0x4F58, 0xD9DD, 0x4F65, 0xD9DE, 0x4FCE, + 0xD9DF, 0x9FA0, 0xD9E0, 0x6C46, 0xD9E1, 0x7C74, 0xD9E2, 0x516E, + 0xD9E3, 0x5DFD, 0xD9E4, 0x9EC9, 0xD9E5, 0x9998, 0xD9E6, 0x5181, + 0xD9E7, 0x5914, 0xD9E8, 0x52F9, 0xD9E9, 0x530D, 0xD9EA, 0x8A07, + 0xD9EB, 0x5310, 0xD9EC, 0x51EB, 0xD9ED, 0x5919, 0xD9EE, 0x5155, + 0xD9EF, 0x4EA0, 0xD9F0, 0x5156, 0xD9F1, 0x4EB3, 0xD9F2, 0x886E, + 0xD9F3, 0x88A4, 0xD9F4, 0x4EB5, 0xD9F5, 0x8114, 0xD9F6, 0x88D2, + 0xD9F7, 0x7980, 0xD9F8, 0x5B34, 0xD9F9, 0x8803, 0xD9FA, 0x7FB8, + 0xD9FB, 0x51AB, 0xD9FC, 0x51B1, 0xD9FD, 0x51BD, 0xD9FE, 0x51BC, + 0xDA40, 0x8D0E, 0xDA41, 0x8D0F, 0xDA42, 0x8D10, 0xDA43, 0x8D11, + 0xDA44, 0x8D12, 0xDA45, 0x8D13, 0xDA46, 0x8D14, 0xDA47, 0x8D15, + 0xDA48, 0x8D16, 0xDA49, 0x8D17, 0xDA4A, 0x8D18, 0xDA4B, 0x8D19, + 0xDA4C, 0x8D1A, 0xDA4D, 0x8D1B, 0xDA4E, 0x8D1C, 0xDA4F, 0x8D20, + 0xDA50, 0x8D51, 0xDA51, 0x8D52, 0xDA52, 0x8D57, 0xDA53, 0x8D5F, + 0xDA54, 0x8D65, 0xDA55, 0x8D68, 0xDA56, 0x8D69, 0xDA57, 0x8D6A, + 0xDA58, 0x8D6C, 0xDA59, 0x8D6E, 0xDA5A, 0x8D6F, 0xDA5B, 0x8D71, + 0xDA5C, 0x8D72, 0xDA5D, 0x8D78, 0xDA5E, 0x8D79, 0xDA5F, 0x8D7A, + 0xDA60, 0x8D7B, 0xDA61, 0x8D7C, 0xDA62, 0x8D7D, 0xDA63, 0x8D7E, + 0xDA64, 0x8D7F, 0xDA65, 0x8D80, 0xDA66, 0x8D82, 0xDA67, 0x8D83, + 0xDA68, 0x8D86, 0xDA69, 0x8D87, 0xDA6A, 0x8D88, 0xDA6B, 0x8D89, + 0xDA6C, 0x8D8C, 0xDA6D, 0x8D8D, 0xDA6E, 0x8D8E, 0xDA6F, 0x8D8F, + 0xDA70, 0x8D90, 0xDA71, 0x8D92, 0xDA72, 0x8D93, 0xDA73, 0x8D95, + 0xDA74, 0x8D96, 0xDA75, 0x8D97, 0xDA76, 0x8D98, 0xDA77, 0x8D99, + 0xDA78, 0x8D9A, 0xDA79, 0x8D9B, 0xDA7A, 0x8D9C, 0xDA7B, 0x8D9D, + 0xDA7C, 0x8D9E, 0xDA7D, 0x8DA0, 0xDA7E, 0x8DA1, 0xDA80, 0x8DA2, + 0xDA81, 0x8DA4, 0xDA82, 0x8DA5, 0xDA83, 0x8DA6, 0xDA84, 0x8DA7, + 0xDA85, 0x8DA8, 0xDA86, 0x8DA9, 0xDA87, 0x8DAA, 0xDA88, 0x8DAB, + 0xDA89, 0x8DAC, 0xDA8A, 0x8DAD, 0xDA8B, 0x8DAE, 0xDA8C, 0x8DAF, + 0xDA8D, 0x8DB0, 0xDA8E, 0x8DB2, 0xDA8F, 0x8DB6, 0xDA90, 0x8DB7, + 0xDA91, 0x8DB9, 0xDA92, 0x8DBB, 0xDA93, 0x8DBD, 0xDA94, 0x8DC0, + 0xDA95, 0x8DC1, 0xDA96, 0x8DC2, 0xDA97, 0x8DC5, 0xDA98, 0x8DC7, + 0xDA99, 0x8DC8, 0xDA9A, 0x8DC9, 0xDA9B, 0x8DCA, 0xDA9C, 0x8DCD, + 0xDA9D, 0x8DD0, 0xDA9E, 0x8DD2, 0xDA9F, 0x8DD3, 0xDAA0, 0x8DD4, + 0xDAA1, 0x51C7, 0xDAA2, 0x5196, 0xDAA3, 0x51A2, 0xDAA4, 0x51A5, + 0xDAA5, 0x8BA0, 0xDAA6, 0x8BA6, 0xDAA7, 0x8BA7, 0xDAA8, 0x8BAA, + 0xDAA9, 0x8BB4, 0xDAAA, 0x8BB5, 0xDAAB, 0x8BB7, 0xDAAC, 0x8BC2, + 0xDAAD, 0x8BC3, 0xDAAE, 0x8BCB, 0xDAAF, 0x8BCF, 0xDAB0, 0x8BCE, + 0xDAB1, 0x8BD2, 0xDAB2, 0x8BD3, 0xDAB3, 0x8BD4, 0xDAB4, 0x8BD6, + 0xDAB5, 0x8BD8, 0xDAB6, 0x8BD9, 0xDAB7, 0x8BDC, 0xDAB8, 0x8BDF, + 0xDAB9, 0x8BE0, 0xDABA, 0x8BE4, 0xDABB, 0x8BE8, 0xDABC, 0x8BE9, + 0xDABD, 0x8BEE, 0xDABE, 0x8BF0, 0xDABF, 0x8BF3, 0xDAC0, 0x8BF6, + 0xDAC1, 0x8BF9, 0xDAC2, 0x8BFC, 0xDAC3, 0x8BFF, 0xDAC4, 0x8C00, + 0xDAC5, 0x8C02, 0xDAC6, 0x8C04, 0xDAC7, 0x8C07, 0xDAC8, 0x8C0C, + 0xDAC9, 0x8C0F, 0xDACA, 0x8C11, 0xDACB, 0x8C12, 0xDACC, 0x8C14, + 0xDACD, 0x8C15, 0xDACE, 0x8C16, 0xDACF, 0x8C19, 0xDAD0, 0x8C1B, + 0xDAD1, 0x8C18, 0xDAD2, 0x8C1D, 0xDAD3, 0x8C1F, 0xDAD4, 0x8C20, + 0xDAD5, 0x8C21, 0xDAD6, 0x8C25, 0xDAD7, 0x8C27, 0xDAD8, 0x8C2A, + 0xDAD9, 0x8C2B, 0xDADA, 0x8C2E, 0xDADB, 0x8C2F, 0xDADC, 0x8C32, + 0xDADD, 0x8C33, 0xDADE, 0x8C35, 0xDADF, 0x8C36, 0xDAE0, 0x5369, + 0xDAE1, 0x537A, 0xDAE2, 0x961D, 0xDAE3, 0x9622, 0xDAE4, 0x9621, + 0xDAE5, 0x9631, 0xDAE6, 0x962A, 0xDAE7, 0x963D, 0xDAE8, 0x963C, + 0xDAE9, 0x9642, 0xDAEA, 0x9649, 0xDAEB, 0x9654, 0xDAEC, 0x965F, + 0xDAED, 0x9667, 0xDAEE, 0x966C, 0xDAEF, 0x9672, 0xDAF0, 0x9674, + 0xDAF1, 0x9688, 0xDAF2, 0x968D, 0xDAF3, 0x9697, 0xDAF4, 0x96B0, + 0xDAF5, 0x9097, 0xDAF6, 0x909B, 0xDAF7, 0x909D, 0xDAF8, 0x9099, + 0xDAF9, 0x90AC, 0xDAFA, 0x90A1, 0xDAFB, 0x90B4, 0xDAFC, 0x90B3, + 0xDAFD, 0x90B6, 0xDAFE, 0x90BA, 0xDB40, 0x8DD5, 0xDB41, 0x8DD8, + 0xDB42, 0x8DD9, 0xDB43, 0x8DDC, 0xDB44, 0x8DE0, 0xDB45, 0x8DE1, + 0xDB46, 0x8DE2, 0xDB47, 0x8DE5, 0xDB48, 0x8DE6, 0xDB49, 0x8DE7, + 0xDB4A, 0x8DE9, 0xDB4B, 0x8DED, 0xDB4C, 0x8DEE, 0xDB4D, 0x8DF0, + 0xDB4E, 0x8DF1, 0xDB4F, 0x8DF2, 0xDB50, 0x8DF4, 0xDB51, 0x8DF6, + 0xDB52, 0x8DFC, 0xDB53, 0x8DFE, 0xDB54, 0x8DFF, 0xDB55, 0x8E00, + 0xDB56, 0x8E01, 0xDB57, 0x8E02, 0xDB58, 0x8E03, 0xDB59, 0x8E04, + 0xDB5A, 0x8E06, 0xDB5B, 0x8E07, 0xDB5C, 0x8E08, 0xDB5D, 0x8E0B, + 0xDB5E, 0x8E0D, 0xDB5F, 0x8E0E, 0xDB60, 0x8E10, 0xDB61, 0x8E11, + 0xDB62, 0x8E12, 0xDB63, 0x8E13, 0xDB64, 0x8E15, 0xDB65, 0x8E16, + 0xDB66, 0x8E17, 0xDB67, 0x8E18, 0xDB68, 0x8E19, 0xDB69, 0x8E1A, + 0xDB6A, 0x8E1B, 0xDB6B, 0x8E1C, 0xDB6C, 0x8E20, 0xDB6D, 0x8E21, + 0xDB6E, 0x8E24, 0xDB6F, 0x8E25, 0xDB70, 0x8E26, 0xDB71, 0x8E27, + 0xDB72, 0x8E28, 0xDB73, 0x8E2B, 0xDB74, 0x8E2D, 0xDB75, 0x8E30, + 0xDB76, 0x8E32, 0xDB77, 0x8E33, 0xDB78, 0x8E34, 0xDB79, 0x8E36, + 0xDB7A, 0x8E37, 0xDB7B, 0x8E38, 0xDB7C, 0x8E3B, 0xDB7D, 0x8E3C, + 0xDB7E, 0x8E3E, 0xDB80, 0x8E3F, 0xDB81, 0x8E43, 0xDB82, 0x8E45, + 0xDB83, 0x8E46, 0xDB84, 0x8E4C, 0xDB85, 0x8E4D, 0xDB86, 0x8E4E, + 0xDB87, 0x8E4F, 0xDB88, 0x8E50, 0xDB89, 0x8E53, 0xDB8A, 0x8E54, + 0xDB8B, 0x8E55, 0xDB8C, 0x8E56, 0xDB8D, 0x8E57, 0xDB8E, 0x8E58, + 0xDB8F, 0x8E5A, 0xDB90, 0x8E5B, 0xDB91, 0x8E5C, 0xDB92, 0x8E5D, + 0xDB93, 0x8E5E, 0xDB94, 0x8E5F, 0xDB95, 0x8E60, 0xDB96, 0x8E61, + 0xDB97, 0x8E62, 0xDB98, 0x8E63, 0xDB99, 0x8E64, 0xDB9A, 0x8E65, + 0xDB9B, 0x8E67, 0xDB9C, 0x8E68, 0xDB9D, 0x8E6A, 0xDB9E, 0x8E6B, + 0xDB9F, 0x8E6E, 0xDBA0, 0x8E71, 0xDBA1, 0x90B8, 0xDBA2, 0x90B0, + 0xDBA3, 0x90CF, 0xDBA4, 0x90C5, 0xDBA5, 0x90BE, 0xDBA6, 0x90D0, + 0xDBA7, 0x90C4, 0xDBA8, 0x90C7, 0xDBA9, 0x90D3, 0xDBAA, 0x90E6, + 0xDBAB, 0x90E2, 0xDBAC, 0x90DC, 0xDBAD, 0x90D7, 0xDBAE, 0x90DB, + 0xDBAF, 0x90EB, 0xDBB0, 0x90EF, 0xDBB1, 0x90FE, 0xDBB2, 0x9104, + 0xDBB3, 0x9122, 0xDBB4, 0x911E, 0xDBB5, 0x9123, 0xDBB6, 0x9131, + 0xDBB7, 0x912F, 0xDBB8, 0x9139, 0xDBB9, 0x9143, 0xDBBA, 0x9146, + 0xDBBB, 0x520D, 0xDBBC, 0x5942, 0xDBBD, 0x52A2, 0xDBBE, 0x52AC, + 0xDBBF, 0x52AD, 0xDBC0, 0x52BE, 0xDBC1, 0x54FF, 0xDBC2, 0x52D0, + 0xDBC3, 0x52D6, 0xDBC4, 0x52F0, 0xDBC5, 0x53DF, 0xDBC6, 0x71EE, + 0xDBC7, 0x77CD, 0xDBC8, 0x5EF4, 0xDBC9, 0x51F5, 0xDBCA, 0x51FC, + 0xDBCB, 0x9B2F, 0xDBCC, 0x53B6, 0xDBCD, 0x5F01, 0xDBCE, 0x755A, + 0xDBCF, 0x5DEF, 0xDBD0, 0x574C, 0xDBD1, 0x57A9, 0xDBD2, 0x57A1, + 0xDBD3, 0x587E, 0xDBD4, 0x58BC, 0xDBD5, 0x58C5, 0xDBD6, 0x58D1, + 0xDBD7, 0x5729, 0xDBD8, 0x572C, 0xDBD9, 0x572A, 0xDBDA, 0x5733, + 0xDBDB, 0x5739, 0xDBDC, 0x572E, 0xDBDD, 0x572F, 0xDBDE, 0x575C, + 0xDBDF, 0x573B, 0xDBE0, 0x5742, 0xDBE1, 0x5769, 0xDBE2, 0x5785, + 0xDBE3, 0x576B, 0xDBE4, 0x5786, 0xDBE5, 0x577C, 0xDBE6, 0x577B, + 0xDBE7, 0x5768, 0xDBE8, 0x576D, 0xDBE9, 0x5776, 0xDBEA, 0x5773, + 0xDBEB, 0x57AD, 0xDBEC, 0x57A4, 0xDBED, 0x578C, 0xDBEE, 0x57B2, + 0xDBEF, 0x57CF, 0xDBF0, 0x57A7, 0xDBF1, 0x57B4, 0xDBF2, 0x5793, + 0xDBF3, 0x57A0, 0xDBF4, 0x57D5, 0xDBF5, 0x57D8, 0xDBF6, 0x57DA, + 0xDBF7, 0x57D9, 0xDBF8, 0x57D2, 0xDBF9, 0x57B8, 0xDBFA, 0x57F4, + 0xDBFB, 0x57EF, 0xDBFC, 0x57F8, 0xDBFD, 0x57E4, 0xDBFE, 0x57DD, + 0xDC40, 0x8E73, 0xDC41, 0x8E75, 0xDC42, 0x8E77, 0xDC43, 0x8E78, + 0xDC44, 0x8E79, 0xDC45, 0x8E7A, 0xDC46, 0x8E7B, 0xDC47, 0x8E7D, + 0xDC48, 0x8E7E, 0xDC49, 0x8E80, 0xDC4A, 0x8E82, 0xDC4B, 0x8E83, + 0xDC4C, 0x8E84, 0xDC4D, 0x8E86, 0xDC4E, 0x8E88, 0xDC4F, 0x8E89, + 0xDC50, 0x8E8A, 0xDC51, 0x8E8B, 0xDC52, 0x8E8C, 0xDC53, 0x8E8D, + 0xDC54, 0x8E8E, 0xDC55, 0x8E91, 0xDC56, 0x8E92, 0xDC57, 0x8E93, + 0xDC58, 0x8E95, 0xDC59, 0x8E96, 0xDC5A, 0x8E97, 0xDC5B, 0x8E98, + 0xDC5C, 0x8E99, 0xDC5D, 0x8E9A, 0xDC5E, 0x8E9B, 0xDC5F, 0x8E9D, + 0xDC60, 0x8E9F, 0xDC61, 0x8EA0, 0xDC62, 0x8EA1, 0xDC63, 0x8EA2, + 0xDC64, 0x8EA3, 0xDC65, 0x8EA4, 0xDC66, 0x8EA5, 0xDC67, 0x8EA6, + 0xDC68, 0x8EA7, 0xDC69, 0x8EA8, 0xDC6A, 0x8EA9, 0xDC6B, 0x8EAA, + 0xDC6C, 0x8EAD, 0xDC6D, 0x8EAE, 0xDC6E, 0x8EB0, 0xDC6F, 0x8EB1, + 0xDC70, 0x8EB3, 0xDC71, 0x8EB4, 0xDC72, 0x8EB5, 0xDC73, 0x8EB6, + 0xDC74, 0x8EB7, 0xDC75, 0x8EB8, 0xDC76, 0x8EB9, 0xDC77, 0x8EBB, + 0xDC78, 0x8EBC, 0xDC79, 0x8EBD, 0xDC7A, 0x8EBE, 0xDC7B, 0x8EBF, + 0xDC7C, 0x8EC0, 0xDC7D, 0x8EC1, 0xDC7E, 0x8EC2, 0xDC80, 0x8EC3, + 0xDC81, 0x8EC4, 0xDC82, 0x8EC5, 0xDC83, 0x8EC6, 0xDC84, 0x8EC7, + 0xDC85, 0x8EC8, 0xDC86, 0x8EC9, 0xDC87, 0x8ECA, 0xDC88, 0x8ECB, + 0xDC89, 0x8ECC, 0xDC8A, 0x8ECD, 0xDC8B, 0x8ECF, 0xDC8C, 0x8ED0, + 0xDC8D, 0x8ED1, 0xDC8E, 0x8ED2, 0xDC8F, 0x8ED3, 0xDC90, 0x8ED4, + 0xDC91, 0x8ED5, 0xDC92, 0x8ED6, 0xDC93, 0x8ED7, 0xDC94, 0x8ED8, + 0xDC95, 0x8ED9, 0xDC96, 0x8EDA, 0xDC97, 0x8EDB, 0xDC98, 0x8EDC, + 0xDC99, 0x8EDD, 0xDC9A, 0x8EDE, 0xDC9B, 0x8EDF, 0xDC9C, 0x8EE0, + 0xDC9D, 0x8EE1, 0xDC9E, 0x8EE2, 0xDC9F, 0x8EE3, 0xDCA0, 0x8EE4, + 0xDCA1, 0x580B, 0xDCA2, 0x580D, 0xDCA3, 0x57FD, 0xDCA4, 0x57ED, + 0xDCA5, 0x5800, 0xDCA6, 0x581E, 0xDCA7, 0x5819, 0xDCA8, 0x5844, + 0xDCA9, 0x5820, 0xDCAA, 0x5865, 0xDCAB, 0x586C, 0xDCAC, 0x5881, + 0xDCAD, 0x5889, 0xDCAE, 0x589A, 0xDCAF, 0x5880, 0xDCB0, 0x99A8, + 0xDCB1, 0x9F19, 0xDCB2, 0x61FF, 0xDCB3, 0x8279, 0xDCB4, 0x827D, + 0xDCB5, 0x827F, 0xDCB6, 0x828F, 0xDCB7, 0x828A, 0xDCB8, 0x82A8, + 0xDCB9, 0x8284, 0xDCBA, 0x828E, 0xDCBB, 0x8291, 0xDCBC, 0x8297, + 0xDCBD, 0x8299, 0xDCBE, 0x82AB, 0xDCBF, 0x82B8, 0xDCC0, 0x82BE, + 0xDCC1, 0x82B0, 0xDCC2, 0x82C8, 0xDCC3, 0x82CA, 0xDCC4, 0x82E3, + 0xDCC5, 0x8298, 0xDCC6, 0x82B7, 0xDCC7, 0x82AE, 0xDCC8, 0x82CB, + 0xDCC9, 0x82CC, 0xDCCA, 0x82C1, 0xDCCB, 0x82A9, 0xDCCC, 0x82B4, + 0xDCCD, 0x82A1, 0xDCCE, 0x82AA, 0xDCCF, 0x829F, 0xDCD0, 0x82C4, + 0xDCD1, 0x82CE, 0xDCD2, 0x82A4, 0xDCD3, 0x82E1, 0xDCD4, 0x8309, + 0xDCD5, 0x82F7, 0xDCD6, 0x82E4, 0xDCD7, 0x830F, 0xDCD8, 0x8307, + 0xDCD9, 0x82DC, 0xDCDA, 0x82F4, 0xDCDB, 0x82D2, 0xDCDC, 0x82D8, + 0xDCDD, 0x830C, 0xDCDE, 0x82FB, 0xDCDF, 0x82D3, 0xDCE0, 0x8311, + 0xDCE1, 0x831A, 0xDCE2, 0x8306, 0xDCE3, 0x8314, 0xDCE4, 0x8315, + 0xDCE5, 0x82E0, 0xDCE6, 0x82D5, 0xDCE7, 0x831C, 0xDCE8, 0x8351, + 0xDCE9, 0x835B, 0xDCEA, 0x835C, 0xDCEB, 0x8308, 0xDCEC, 0x8392, + 0xDCED, 0x833C, 0xDCEE, 0x8334, 0xDCEF, 0x8331, 0xDCF0, 0x839B, + 0xDCF1, 0x835E, 0xDCF2, 0x832F, 0xDCF3, 0x834F, 0xDCF4, 0x8347, + 0xDCF5, 0x8343, 0xDCF6, 0x835F, 0xDCF7, 0x8340, 0xDCF8, 0x8317, + 0xDCF9, 0x8360, 0xDCFA, 0x832D, 0xDCFB, 0x833A, 0xDCFC, 0x8333, + 0xDCFD, 0x8366, 0xDCFE, 0x8365, 0xDD40, 0x8EE5, 0xDD41, 0x8EE6, + 0xDD42, 0x8EE7, 0xDD43, 0x8EE8, 0xDD44, 0x8EE9, 0xDD45, 0x8EEA, + 0xDD46, 0x8EEB, 0xDD47, 0x8EEC, 0xDD48, 0x8EED, 0xDD49, 0x8EEE, + 0xDD4A, 0x8EEF, 0xDD4B, 0x8EF0, 0xDD4C, 0x8EF1, 0xDD4D, 0x8EF2, + 0xDD4E, 0x8EF3, 0xDD4F, 0x8EF4, 0xDD50, 0x8EF5, 0xDD51, 0x8EF6, + 0xDD52, 0x8EF7, 0xDD53, 0x8EF8, 0xDD54, 0x8EF9, 0xDD55, 0x8EFA, + 0xDD56, 0x8EFB, 0xDD57, 0x8EFC, 0xDD58, 0x8EFD, 0xDD59, 0x8EFE, + 0xDD5A, 0x8EFF, 0xDD5B, 0x8F00, 0xDD5C, 0x8F01, 0xDD5D, 0x8F02, + 0xDD5E, 0x8F03, 0xDD5F, 0x8F04, 0xDD60, 0x8F05, 0xDD61, 0x8F06, + 0xDD62, 0x8F07, 0xDD63, 0x8F08, 0xDD64, 0x8F09, 0xDD65, 0x8F0A, + 0xDD66, 0x8F0B, 0xDD67, 0x8F0C, 0xDD68, 0x8F0D, 0xDD69, 0x8F0E, + 0xDD6A, 0x8F0F, 0xDD6B, 0x8F10, 0xDD6C, 0x8F11, 0xDD6D, 0x8F12, + 0xDD6E, 0x8F13, 0xDD6F, 0x8F14, 0xDD70, 0x8F15, 0xDD71, 0x8F16, + 0xDD72, 0x8F17, 0xDD73, 0x8F18, 0xDD74, 0x8F19, 0xDD75, 0x8F1A, + 0xDD76, 0x8F1B, 0xDD77, 0x8F1C, 0xDD78, 0x8F1D, 0xDD79, 0x8F1E, + 0xDD7A, 0x8F1F, 0xDD7B, 0x8F20, 0xDD7C, 0x8F21, 0xDD7D, 0x8F22, + 0xDD7E, 0x8F23, 0xDD80, 0x8F24, 0xDD81, 0x8F25, 0xDD82, 0x8F26, + 0xDD83, 0x8F27, 0xDD84, 0x8F28, 0xDD85, 0x8F29, 0xDD86, 0x8F2A, + 0xDD87, 0x8F2B, 0xDD88, 0x8F2C, 0xDD89, 0x8F2D, 0xDD8A, 0x8F2E, + 0xDD8B, 0x8F2F, 0xDD8C, 0x8F30, 0xDD8D, 0x8F31, 0xDD8E, 0x8F32, + 0xDD8F, 0x8F33, 0xDD90, 0x8F34, 0xDD91, 0x8F35, 0xDD92, 0x8F36, + 0xDD93, 0x8F37, 0xDD94, 0x8F38, 0xDD95, 0x8F39, 0xDD96, 0x8F3A, + 0xDD97, 0x8F3B, 0xDD98, 0x8F3C, 0xDD99, 0x8F3D, 0xDD9A, 0x8F3E, + 0xDD9B, 0x8F3F, 0xDD9C, 0x8F40, 0xDD9D, 0x8F41, 0xDD9E, 0x8F42, + 0xDD9F, 0x8F43, 0xDDA0, 0x8F44, 0xDDA1, 0x8368, 0xDDA2, 0x831B, + 0xDDA3, 0x8369, 0xDDA4, 0x836C, 0xDDA5, 0x836A, 0xDDA6, 0x836D, + 0xDDA7, 0x836E, 0xDDA8, 0x83B0, 0xDDA9, 0x8378, 0xDDAA, 0x83B3, + 0xDDAB, 0x83B4, 0xDDAC, 0x83A0, 0xDDAD, 0x83AA, 0xDDAE, 0x8393, + 0xDDAF, 0x839C, 0xDDB0, 0x8385, 0xDDB1, 0x837C, 0xDDB2, 0x83B6, + 0xDDB3, 0x83A9, 0xDDB4, 0x837D, 0xDDB5, 0x83B8, 0xDDB6, 0x837B, + 0xDDB7, 0x8398, 0xDDB8, 0x839E, 0xDDB9, 0x83A8, 0xDDBA, 0x83BA, + 0xDDBB, 0x83BC, 0xDDBC, 0x83C1, 0xDDBD, 0x8401, 0xDDBE, 0x83E5, + 0xDDBF, 0x83D8, 0xDDC0, 0x5807, 0xDDC1, 0x8418, 0xDDC2, 0x840B, + 0xDDC3, 0x83DD, 0xDDC4, 0x83FD, 0xDDC5, 0x83D6, 0xDDC6, 0x841C, + 0xDDC7, 0x8438, 0xDDC8, 0x8411, 0xDDC9, 0x8406, 0xDDCA, 0x83D4, + 0xDDCB, 0x83DF, 0xDDCC, 0x840F, 0xDDCD, 0x8403, 0xDDCE, 0x83F8, + 0xDDCF, 0x83F9, 0xDDD0, 0x83EA, 0xDDD1, 0x83C5, 0xDDD2, 0x83C0, + 0xDDD3, 0x8426, 0xDDD4, 0x83F0, 0xDDD5, 0x83E1, 0xDDD6, 0x845C, + 0xDDD7, 0x8451, 0xDDD8, 0x845A, 0xDDD9, 0x8459, 0xDDDA, 0x8473, + 0xDDDB, 0x8487, 0xDDDC, 0x8488, 0xDDDD, 0x847A, 0xDDDE, 0x8489, + 0xDDDF, 0x8478, 0xDDE0, 0x843C, 0xDDE1, 0x8446, 0xDDE2, 0x8469, + 0xDDE3, 0x8476, 0xDDE4, 0x848C, 0xDDE5, 0x848E, 0xDDE6, 0x8431, + 0xDDE7, 0x846D, 0xDDE8, 0x84C1, 0xDDE9, 0x84CD, 0xDDEA, 0x84D0, + 0xDDEB, 0x84E6, 0xDDEC, 0x84BD, 0xDDED, 0x84D3, 0xDDEE, 0x84CA, + 0xDDEF, 0x84BF, 0xDDF0, 0x84BA, 0xDDF1, 0x84E0, 0xDDF2, 0x84A1, + 0xDDF3, 0x84B9, 0xDDF4, 0x84B4, 0xDDF5, 0x8497, 0xDDF6, 0x84E5, + 0xDDF7, 0x84E3, 0xDDF8, 0x850C, 0xDDF9, 0x750D, 0xDDFA, 0x8538, + 0xDDFB, 0x84F0, 0xDDFC, 0x8539, 0xDDFD, 0x851F, 0xDDFE, 0x853A, + 0xDE40, 0x8F45, 0xDE41, 0x8F46, 0xDE42, 0x8F47, 0xDE43, 0x8F48, + 0xDE44, 0x8F49, 0xDE45, 0x8F4A, 0xDE46, 0x8F4B, 0xDE47, 0x8F4C, + 0xDE48, 0x8F4D, 0xDE49, 0x8F4E, 0xDE4A, 0x8F4F, 0xDE4B, 0x8F50, + 0xDE4C, 0x8F51, 0xDE4D, 0x8F52, 0xDE4E, 0x8F53, 0xDE4F, 0x8F54, + 0xDE50, 0x8F55, 0xDE51, 0x8F56, 0xDE52, 0x8F57, 0xDE53, 0x8F58, + 0xDE54, 0x8F59, 0xDE55, 0x8F5A, 0xDE56, 0x8F5B, 0xDE57, 0x8F5C, + 0xDE58, 0x8F5D, 0xDE59, 0x8F5E, 0xDE5A, 0x8F5F, 0xDE5B, 0x8F60, + 0xDE5C, 0x8F61, 0xDE5D, 0x8F62, 0xDE5E, 0x8F63, 0xDE5F, 0x8F64, + 0xDE60, 0x8F65, 0xDE61, 0x8F6A, 0xDE62, 0x8F80, 0xDE63, 0x8F8C, + 0xDE64, 0x8F92, 0xDE65, 0x8F9D, 0xDE66, 0x8FA0, 0xDE67, 0x8FA1, + 0xDE68, 0x8FA2, 0xDE69, 0x8FA4, 0xDE6A, 0x8FA5, 0xDE6B, 0x8FA6, + 0xDE6C, 0x8FA7, 0xDE6D, 0x8FAA, 0xDE6E, 0x8FAC, 0xDE6F, 0x8FAD, + 0xDE70, 0x8FAE, 0xDE71, 0x8FAF, 0xDE72, 0x8FB2, 0xDE73, 0x8FB3, + 0xDE74, 0x8FB4, 0xDE75, 0x8FB5, 0xDE76, 0x8FB7, 0xDE77, 0x8FB8, + 0xDE78, 0x8FBA, 0xDE79, 0x8FBB, 0xDE7A, 0x8FBC, 0xDE7B, 0x8FBF, + 0xDE7C, 0x8FC0, 0xDE7D, 0x8FC3, 0xDE7E, 0x8FC6, 0xDE80, 0x8FC9, + 0xDE81, 0x8FCA, 0xDE82, 0x8FCB, 0xDE83, 0x8FCC, 0xDE84, 0x8FCD, + 0xDE85, 0x8FCF, 0xDE86, 0x8FD2, 0xDE87, 0x8FD6, 0xDE88, 0x8FD7, + 0xDE89, 0x8FDA, 0xDE8A, 0x8FE0, 0xDE8B, 0x8FE1, 0xDE8C, 0x8FE3, + 0xDE8D, 0x8FE7, 0xDE8E, 0x8FEC, 0xDE8F, 0x8FEF, 0xDE90, 0x8FF1, + 0xDE91, 0x8FF2, 0xDE92, 0x8FF4, 0xDE93, 0x8FF5, 0xDE94, 0x8FF6, + 0xDE95, 0x8FFA, 0xDE96, 0x8FFB, 0xDE97, 0x8FFC, 0xDE98, 0x8FFE, + 0xDE99, 0x8FFF, 0xDE9A, 0x9007, 0xDE9B, 0x9008, 0xDE9C, 0x900C, + 0xDE9D, 0x900E, 0xDE9E, 0x9013, 0xDE9F, 0x9015, 0xDEA0, 0x9018, + 0xDEA1, 0x8556, 0xDEA2, 0x853B, 0xDEA3, 0x84FF, 0xDEA4, 0x84FC, + 0xDEA5, 0x8559, 0xDEA6, 0x8548, 0xDEA7, 0x8568, 0xDEA8, 0x8564, + 0xDEA9, 0x855E, 0xDEAA, 0x857A, 0xDEAB, 0x77A2, 0xDEAC, 0x8543, + 0xDEAD, 0x8572, 0xDEAE, 0x857B, 0xDEAF, 0x85A4, 0xDEB0, 0x85A8, + 0xDEB1, 0x8587, 0xDEB2, 0x858F, 0xDEB3, 0x8579, 0xDEB4, 0x85AE, + 0xDEB5, 0x859C, 0xDEB6, 0x8585, 0xDEB7, 0x85B9, 0xDEB8, 0x85B7, + 0xDEB9, 0x85B0, 0xDEBA, 0x85D3, 0xDEBB, 0x85C1, 0xDEBC, 0x85DC, + 0xDEBD, 0x85FF, 0xDEBE, 0x8627, 0xDEBF, 0x8605, 0xDEC0, 0x8629, + 0xDEC1, 0x8616, 0xDEC2, 0x863C, 0xDEC3, 0x5EFE, 0xDEC4, 0x5F08, + 0xDEC5, 0x593C, 0xDEC6, 0x5941, 0xDEC7, 0x8037, 0xDEC8, 0x5955, + 0xDEC9, 0x595A, 0xDECA, 0x5958, 0xDECB, 0x530F, 0xDECC, 0x5C22, + 0xDECD, 0x5C25, 0xDECE, 0x5C2C, 0xDECF, 0x5C34, 0xDED0, 0x624C, + 0xDED1, 0x626A, 0xDED2, 0x629F, 0xDED3, 0x62BB, 0xDED4, 0x62CA, + 0xDED5, 0x62DA, 0xDED6, 0x62D7, 0xDED7, 0x62EE, 0xDED8, 0x6322, + 0xDED9, 0x62F6, 0xDEDA, 0x6339, 0xDEDB, 0x634B, 0xDEDC, 0x6343, + 0xDEDD, 0x63AD, 0xDEDE, 0x63F6, 0xDEDF, 0x6371, 0xDEE0, 0x637A, + 0xDEE1, 0x638E, 0xDEE2, 0x63B4, 0xDEE3, 0x636D, 0xDEE4, 0x63AC, + 0xDEE5, 0x638A, 0xDEE6, 0x6369, 0xDEE7, 0x63AE, 0xDEE8, 0x63BC, + 0xDEE9, 0x63F2, 0xDEEA, 0x63F8, 0xDEEB, 0x63E0, 0xDEEC, 0x63FF, + 0xDEED, 0x63C4, 0xDEEE, 0x63DE, 0xDEEF, 0x63CE, 0xDEF0, 0x6452, + 0xDEF1, 0x63C6, 0xDEF2, 0x63BE, 0xDEF3, 0x6445, 0xDEF4, 0x6441, + 0xDEF5, 0x640B, 0xDEF6, 0x641B, 0xDEF7, 0x6420, 0xDEF8, 0x640C, + 0xDEF9, 0x6426, 0xDEFA, 0x6421, 0xDEFB, 0x645E, 0xDEFC, 0x6484, + 0xDEFD, 0x646D, 0xDEFE, 0x6496, 0xDF40, 0x9019, 0xDF41, 0x901C, + 0xDF42, 0x9023, 0xDF43, 0x9024, 0xDF44, 0x9025, 0xDF45, 0x9027, + 0xDF46, 0x9028, 0xDF47, 0x9029, 0xDF48, 0x902A, 0xDF49, 0x902B, + 0xDF4A, 0x902C, 0xDF4B, 0x9030, 0xDF4C, 0x9031, 0xDF4D, 0x9032, + 0xDF4E, 0x9033, 0xDF4F, 0x9034, 0xDF50, 0x9037, 0xDF51, 0x9039, + 0xDF52, 0x903A, 0xDF53, 0x903D, 0xDF54, 0x903F, 0xDF55, 0x9040, + 0xDF56, 0x9043, 0xDF57, 0x9045, 0xDF58, 0x9046, 0xDF59, 0x9048, + 0xDF5A, 0x9049, 0xDF5B, 0x904A, 0xDF5C, 0x904B, 0xDF5D, 0x904C, + 0xDF5E, 0x904E, 0xDF5F, 0x9054, 0xDF60, 0x9055, 0xDF61, 0x9056, + 0xDF62, 0x9059, 0xDF63, 0x905A, 0xDF64, 0x905C, 0xDF65, 0x905D, + 0xDF66, 0x905E, 0xDF67, 0x905F, 0xDF68, 0x9060, 0xDF69, 0x9061, + 0xDF6A, 0x9064, 0xDF6B, 0x9066, 0xDF6C, 0x9067, 0xDF6D, 0x9069, + 0xDF6E, 0x906A, 0xDF6F, 0x906B, 0xDF70, 0x906C, 0xDF71, 0x906F, + 0xDF72, 0x9070, 0xDF73, 0x9071, 0xDF74, 0x9072, 0xDF75, 0x9073, + 0xDF76, 0x9076, 0xDF77, 0x9077, 0xDF78, 0x9078, 0xDF79, 0x9079, + 0xDF7A, 0x907A, 0xDF7B, 0x907B, 0xDF7C, 0x907C, 0xDF7D, 0x907E, + 0xDF7E, 0x9081, 0xDF80, 0x9084, 0xDF81, 0x9085, 0xDF82, 0x9086, + 0xDF83, 0x9087, 0xDF84, 0x9089, 0xDF85, 0x908A, 0xDF86, 0x908C, + 0xDF87, 0x908D, 0xDF88, 0x908E, 0xDF89, 0x908F, 0xDF8A, 0x9090, + 0xDF8B, 0x9092, 0xDF8C, 0x9094, 0xDF8D, 0x9096, 0xDF8E, 0x9098, + 0xDF8F, 0x909A, 0xDF90, 0x909C, 0xDF91, 0x909E, 0xDF92, 0x909F, + 0xDF93, 0x90A0, 0xDF94, 0x90A4, 0xDF95, 0x90A5, 0xDF96, 0x90A7, + 0xDF97, 0x90A8, 0xDF98, 0x90A9, 0xDF99, 0x90AB, 0xDF9A, 0x90AD, + 0xDF9B, 0x90B2, 0xDF9C, 0x90B7, 0xDF9D, 0x90BC, 0xDF9E, 0x90BD, + 0xDF9F, 0x90BF, 0xDFA0, 0x90C0, 0xDFA1, 0x647A, 0xDFA2, 0x64B7, + 0xDFA3, 0x64B8, 0xDFA4, 0x6499, 0xDFA5, 0x64BA, 0xDFA6, 0x64C0, + 0xDFA7, 0x64D0, 0xDFA8, 0x64D7, 0xDFA9, 0x64E4, 0xDFAA, 0x64E2, + 0xDFAB, 0x6509, 0xDFAC, 0x6525, 0xDFAD, 0x652E, 0xDFAE, 0x5F0B, + 0xDFAF, 0x5FD2, 0xDFB0, 0x7519, 0xDFB1, 0x5F11, 0xDFB2, 0x535F, + 0xDFB3, 0x53F1, 0xDFB4, 0x53FD, 0xDFB5, 0x53E9, 0xDFB6, 0x53E8, + 0xDFB7, 0x53FB, 0xDFB8, 0x5412, 0xDFB9, 0x5416, 0xDFBA, 0x5406, + 0xDFBB, 0x544B, 0xDFBC, 0x5452, 0xDFBD, 0x5453, 0xDFBE, 0x5454, + 0xDFBF, 0x5456, 0xDFC0, 0x5443, 0xDFC1, 0x5421, 0xDFC2, 0x5457, + 0xDFC3, 0x5459, 0xDFC4, 0x5423, 0xDFC5, 0x5432, 0xDFC6, 0x5482, + 0xDFC7, 0x5494, 0xDFC8, 0x5477, 0xDFC9, 0x5471, 0xDFCA, 0x5464, + 0xDFCB, 0x549A, 0xDFCC, 0x549B, 0xDFCD, 0x5484, 0xDFCE, 0x5476, + 0xDFCF, 0x5466, 0xDFD0, 0x549D, 0xDFD1, 0x54D0, 0xDFD2, 0x54AD, + 0xDFD3, 0x54C2, 0xDFD4, 0x54B4, 0xDFD5, 0x54D2, 0xDFD6, 0x54A7, + 0xDFD7, 0x54A6, 0xDFD8, 0x54D3, 0xDFD9, 0x54D4, 0xDFDA, 0x5472, + 0xDFDB, 0x54A3, 0xDFDC, 0x54D5, 0xDFDD, 0x54BB, 0xDFDE, 0x54BF, + 0xDFDF, 0x54CC, 0xDFE0, 0x54D9, 0xDFE1, 0x54DA, 0xDFE2, 0x54DC, + 0xDFE3, 0x54A9, 0xDFE4, 0x54AA, 0xDFE5, 0x54A4, 0xDFE6, 0x54DD, + 0xDFE7, 0x54CF, 0xDFE8, 0x54DE, 0xDFE9, 0x551B, 0xDFEA, 0x54E7, + 0xDFEB, 0x5520, 0xDFEC, 0x54FD, 0xDFED, 0x5514, 0xDFEE, 0x54F3, + 0xDFEF, 0x5522, 0xDFF0, 0x5523, 0xDFF1, 0x550F, 0xDFF2, 0x5511, + 0xDFF3, 0x5527, 0xDFF4, 0x552A, 0xDFF5, 0x5567, 0xDFF6, 0x558F, + 0xDFF7, 0x55B5, 0xDFF8, 0x5549, 0xDFF9, 0x556D, 0xDFFA, 0x5541, + 0xDFFB, 0x5555, 0xDFFC, 0x553F, 0xDFFD, 0x5550, 0xDFFE, 0x553C, + 0xE040, 0x90C2, 0xE041, 0x90C3, 0xE042, 0x90C6, 0xE043, 0x90C8, + 0xE044, 0x90C9, 0xE045, 0x90CB, 0xE046, 0x90CC, 0xE047, 0x90CD, + 0xE048, 0x90D2, 0xE049, 0x90D4, 0xE04A, 0x90D5, 0xE04B, 0x90D6, + 0xE04C, 0x90D8, 0xE04D, 0x90D9, 0xE04E, 0x90DA, 0xE04F, 0x90DE, + 0xE050, 0x90DF, 0xE051, 0x90E0, 0xE052, 0x90E3, 0xE053, 0x90E4, + 0xE054, 0x90E5, 0xE055, 0x90E9, 0xE056, 0x90EA, 0xE057, 0x90EC, + 0xE058, 0x90EE, 0xE059, 0x90F0, 0xE05A, 0x90F1, 0xE05B, 0x90F2, + 0xE05C, 0x90F3, 0xE05D, 0x90F5, 0xE05E, 0x90F6, 0xE05F, 0x90F7, + 0xE060, 0x90F9, 0xE061, 0x90FA, 0xE062, 0x90FB, 0xE063, 0x90FC, + 0xE064, 0x90FF, 0xE065, 0x9100, 0xE066, 0x9101, 0xE067, 0x9103, + 0xE068, 0x9105, 0xE069, 0x9106, 0xE06A, 0x9107, 0xE06B, 0x9108, + 0xE06C, 0x9109, 0xE06D, 0x910A, 0xE06E, 0x910B, 0xE06F, 0x910C, + 0xE070, 0x910D, 0xE071, 0x910E, 0xE072, 0x910F, 0xE073, 0x9110, + 0xE074, 0x9111, 0xE075, 0x9112, 0xE076, 0x9113, 0xE077, 0x9114, + 0xE078, 0x9115, 0xE079, 0x9116, 0xE07A, 0x9117, 0xE07B, 0x9118, + 0xE07C, 0x911A, 0xE07D, 0x911B, 0xE07E, 0x911C, 0xE080, 0x911D, + 0xE081, 0x911F, 0xE082, 0x9120, 0xE083, 0x9121, 0xE084, 0x9124, + 0xE085, 0x9125, 0xE086, 0x9126, 0xE087, 0x9127, 0xE088, 0x9128, + 0xE089, 0x9129, 0xE08A, 0x912A, 0xE08B, 0x912B, 0xE08C, 0x912C, + 0xE08D, 0x912D, 0xE08E, 0x912E, 0xE08F, 0x9130, 0xE090, 0x9132, + 0xE091, 0x9133, 0xE092, 0x9134, 0xE093, 0x9135, 0xE094, 0x9136, + 0xE095, 0x9137, 0xE096, 0x9138, 0xE097, 0x913A, 0xE098, 0x913B, + 0xE099, 0x913C, 0xE09A, 0x913D, 0xE09B, 0x913E, 0xE09C, 0x913F, + 0xE09D, 0x9140, 0xE09E, 0x9141, 0xE09F, 0x9142, 0xE0A0, 0x9144, + 0xE0A1, 0x5537, 0xE0A2, 0x5556, 0xE0A3, 0x5575, 0xE0A4, 0x5576, + 0xE0A5, 0x5577, 0xE0A6, 0x5533, 0xE0A7, 0x5530, 0xE0A8, 0x555C, + 0xE0A9, 0x558B, 0xE0AA, 0x55D2, 0xE0AB, 0x5583, 0xE0AC, 0x55B1, + 0xE0AD, 0x55B9, 0xE0AE, 0x5588, 0xE0AF, 0x5581, 0xE0B0, 0x559F, + 0xE0B1, 0x557E, 0xE0B2, 0x55D6, 0xE0B3, 0x5591, 0xE0B4, 0x557B, + 0xE0B5, 0x55DF, 0xE0B6, 0x55BD, 0xE0B7, 0x55BE, 0xE0B8, 0x5594, + 0xE0B9, 0x5599, 0xE0BA, 0x55EA, 0xE0BB, 0x55F7, 0xE0BC, 0x55C9, + 0xE0BD, 0x561F, 0xE0BE, 0x55D1, 0xE0BF, 0x55EB, 0xE0C0, 0x55EC, + 0xE0C1, 0x55D4, 0xE0C2, 0x55E6, 0xE0C3, 0x55DD, 0xE0C4, 0x55C4, + 0xE0C5, 0x55EF, 0xE0C6, 0x55E5, 0xE0C7, 0x55F2, 0xE0C8, 0x55F3, + 0xE0C9, 0x55CC, 0xE0CA, 0x55CD, 0xE0CB, 0x55E8, 0xE0CC, 0x55F5, + 0xE0CD, 0x55E4, 0xE0CE, 0x8F94, 0xE0CF, 0x561E, 0xE0D0, 0x5608, + 0xE0D1, 0x560C, 0xE0D2, 0x5601, 0xE0D3, 0x5624, 0xE0D4, 0x5623, + 0xE0D5, 0x55FE, 0xE0D6, 0x5600, 0xE0D7, 0x5627, 0xE0D8, 0x562D, + 0xE0D9, 0x5658, 0xE0DA, 0x5639, 0xE0DB, 0x5657, 0xE0DC, 0x562C, + 0xE0DD, 0x564D, 0xE0DE, 0x5662, 0xE0DF, 0x5659, 0xE0E0, 0x565C, + 0xE0E1, 0x564C, 0xE0E2, 0x5654, 0xE0E3, 0x5686, 0xE0E4, 0x5664, + 0xE0E5, 0x5671, 0xE0E6, 0x566B, 0xE0E7, 0x567B, 0xE0E8, 0x567C, + 0xE0E9, 0x5685, 0xE0EA, 0x5693, 0xE0EB, 0x56AF, 0xE0EC, 0x56D4, + 0xE0ED, 0x56D7, 0xE0EE, 0x56DD, 0xE0EF, 0x56E1, 0xE0F0, 0x56F5, + 0xE0F1, 0x56EB, 0xE0F2, 0x56F9, 0xE0F3, 0x56FF, 0xE0F4, 0x5704, + 0xE0F5, 0x570A, 0xE0F6, 0x5709, 0xE0F7, 0x571C, 0xE0F8, 0x5E0F, + 0xE0F9, 0x5E19, 0xE0FA, 0x5E14, 0xE0FB, 0x5E11, 0xE0FC, 0x5E31, + 0xE0FD, 0x5E3B, 0xE0FE, 0x5E3C, 0xE140, 0x9145, 0xE141, 0x9147, + 0xE142, 0x9148, 0xE143, 0x9151, 0xE144, 0x9153, 0xE145, 0x9154, + 0xE146, 0x9155, 0xE147, 0x9156, 0xE148, 0x9158, 0xE149, 0x9159, + 0xE14A, 0x915B, 0xE14B, 0x915C, 0xE14C, 0x915F, 0xE14D, 0x9160, + 0xE14E, 0x9166, 0xE14F, 0x9167, 0xE150, 0x9168, 0xE151, 0x916B, + 0xE152, 0x916D, 0xE153, 0x9173, 0xE154, 0x917A, 0xE155, 0x917B, + 0xE156, 0x917C, 0xE157, 0x9180, 0xE158, 0x9181, 0xE159, 0x9182, + 0xE15A, 0x9183, 0xE15B, 0x9184, 0xE15C, 0x9186, 0xE15D, 0x9188, + 0xE15E, 0x918A, 0xE15F, 0x918E, 0xE160, 0x918F, 0xE161, 0x9193, + 0xE162, 0x9194, 0xE163, 0x9195, 0xE164, 0x9196, 0xE165, 0x9197, + 0xE166, 0x9198, 0xE167, 0x9199, 0xE168, 0x919C, 0xE169, 0x919D, + 0xE16A, 0x919E, 0xE16B, 0x919F, 0xE16C, 0x91A0, 0xE16D, 0x91A1, + 0xE16E, 0x91A4, 0xE16F, 0x91A5, 0xE170, 0x91A6, 0xE171, 0x91A7, + 0xE172, 0x91A8, 0xE173, 0x91A9, 0xE174, 0x91AB, 0xE175, 0x91AC, + 0xE176, 0x91B0, 0xE177, 0x91B1, 0xE178, 0x91B2, 0xE179, 0x91B3, + 0xE17A, 0x91B6, 0xE17B, 0x91B7, 0xE17C, 0x91B8, 0xE17D, 0x91B9, + 0xE17E, 0x91BB, 0xE180, 0x91BC, 0xE181, 0x91BD, 0xE182, 0x91BE, + 0xE183, 0x91BF, 0xE184, 0x91C0, 0xE185, 0x91C1, 0xE186, 0x91C2, + 0xE187, 0x91C3, 0xE188, 0x91C4, 0xE189, 0x91C5, 0xE18A, 0x91C6, + 0xE18B, 0x91C8, 0xE18C, 0x91CB, 0xE18D, 0x91D0, 0xE18E, 0x91D2, + 0xE18F, 0x91D3, 0xE190, 0x91D4, 0xE191, 0x91D5, 0xE192, 0x91D6, + 0xE193, 0x91D7, 0xE194, 0x91D8, 0xE195, 0x91D9, 0xE196, 0x91DA, + 0xE197, 0x91DB, 0xE198, 0x91DD, 0xE199, 0x91DE, 0xE19A, 0x91DF, + 0xE19B, 0x91E0, 0xE19C, 0x91E1, 0xE19D, 0x91E2, 0xE19E, 0x91E3, + 0xE19F, 0x91E4, 0xE1A0, 0x91E5, 0xE1A1, 0x5E37, 0xE1A2, 0x5E44, + 0xE1A3, 0x5E54, 0xE1A4, 0x5E5B, 0xE1A5, 0x5E5E, 0xE1A6, 0x5E61, + 0xE1A7, 0x5C8C, 0xE1A8, 0x5C7A, 0xE1A9, 0x5C8D, 0xE1AA, 0x5C90, + 0xE1AB, 0x5C96, 0xE1AC, 0x5C88, 0xE1AD, 0x5C98, 0xE1AE, 0x5C99, + 0xE1AF, 0x5C91, 0xE1B0, 0x5C9A, 0xE1B1, 0x5C9C, 0xE1B2, 0x5CB5, + 0xE1B3, 0x5CA2, 0xE1B4, 0x5CBD, 0xE1B5, 0x5CAC, 0xE1B6, 0x5CAB, + 0xE1B7, 0x5CB1, 0xE1B8, 0x5CA3, 0xE1B9, 0x5CC1, 0xE1BA, 0x5CB7, + 0xE1BB, 0x5CC4, 0xE1BC, 0x5CD2, 0xE1BD, 0x5CE4, 0xE1BE, 0x5CCB, + 0xE1BF, 0x5CE5, 0xE1C0, 0x5D02, 0xE1C1, 0x5D03, 0xE1C2, 0x5D27, + 0xE1C3, 0x5D26, 0xE1C4, 0x5D2E, 0xE1C5, 0x5D24, 0xE1C6, 0x5D1E, + 0xE1C7, 0x5D06, 0xE1C8, 0x5D1B, 0xE1C9, 0x5D58, 0xE1CA, 0x5D3E, + 0xE1CB, 0x5D34, 0xE1CC, 0x5D3D, 0xE1CD, 0x5D6C, 0xE1CE, 0x5D5B, + 0xE1CF, 0x5D6F, 0xE1D0, 0x5D5D, 0xE1D1, 0x5D6B, 0xE1D2, 0x5D4B, + 0xE1D3, 0x5D4A, 0xE1D4, 0x5D69, 0xE1D5, 0x5D74, 0xE1D6, 0x5D82, + 0xE1D7, 0x5D99, 0xE1D8, 0x5D9D, 0xE1D9, 0x8C73, 0xE1DA, 0x5DB7, + 0xE1DB, 0x5DC5, 0xE1DC, 0x5F73, 0xE1DD, 0x5F77, 0xE1DE, 0x5F82, + 0xE1DF, 0x5F87, 0xE1E0, 0x5F89, 0xE1E1, 0x5F8C, 0xE1E2, 0x5F95, + 0xE1E3, 0x5F99, 0xE1E4, 0x5F9C, 0xE1E5, 0x5FA8, 0xE1E6, 0x5FAD, + 0xE1E7, 0x5FB5, 0xE1E8, 0x5FBC, 0xE1E9, 0x8862, 0xE1EA, 0x5F61, + 0xE1EB, 0x72AD, 0xE1EC, 0x72B0, 0xE1ED, 0x72B4, 0xE1EE, 0x72B7, + 0xE1EF, 0x72B8, 0xE1F0, 0x72C3, 0xE1F1, 0x72C1, 0xE1F2, 0x72CE, + 0xE1F3, 0x72CD, 0xE1F4, 0x72D2, 0xE1F5, 0x72E8, 0xE1F6, 0x72EF, + 0xE1F7, 0x72E9, 0xE1F8, 0x72F2, 0xE1F9, 0x72F4, 0xE1FA, 0x72F7, + 0xE1FB, 0x7301, 0xE1FC, 0x72F3, 0xE1FD, 0x7303, 0xE1FE, 0x72FA, + 0xE240, 0x91E6, 0xE241, 0x91E7, 0xE242, 0x91E8, 0xE243, 0x91E9, + 0xE244, 0x91EA, 0xE245, 0x91EB, 0xE246, 0x91EC, 0xE247, 0x91ED, + 0xE248, 0x91EE, 0xE249, 0x91EF, 0xE24A, 0x91F0, 0xE24B, 0x91F1, + 0xE24C, 0x91F2, 0xE24D, 0x91F3, 0xE24E, 0x91F4, 0xE24F, 0x91F5, + 0xE250, 0x91F6, 0xE251, 0x91F7, 0xE252, 0x91F8, 0xE253, 0x91F9, + 0xE254, 0x91FA, 0xE255, 0x91FB, 0xE256, 0x91FC, 0xE257, 0x91FD, + 0xE258, 0x91FE, 0xE259, 0x91FF, 0xE25A, 0x9200, 0xE25B, 0x9201, + 0xE25C, 0x9202, 0xE25D, 0x9203, 0xE25E, 0x9204, 0xE25F, 0x9205, + 0xE260, 0x9206, 0xE261, 0x9207, 0xE262, 0x9208, 0xE263, 0x9209, + 0xE264, 0x920A, 0xE265, 0x920B, 0xE266, 0x920C, 0xE267, 0x920D, + 0xE268, 0x920E, 0xE269, 0x920F, 0xE26A, 0x9210, 0xE26B, 0x9211, + 0xE26C, 0x9212, 0xE26D, 0x9213, 0xE26E, 0x9214, 0xE26F, 0x9215, + 0xE270, 0x9216, 0xE271, 0x9217, 0xE272, 0x9218, 0xE273, 0x9219, + 0xE274, 0x921A, 0xE275, 0x921B, 0xE276, 0x921C, 0xE277, 0x921D, + 0xE278, 0x921E, 0xE279, 0x921F, 0xE27A, 0x9220, 0xE27B, 0x9221, + 0xE27C, 0x9222, 0xE27D, 0x9223, 0xE27E, 0x9224, 0xE280, 0x9225, + 0xE281, 0x9226, 0xE282, 0x9227, 0xE283, 0x9228, 0xE284, 0x9229, + 0xE285, 0x922A, 0xE286, 0x922B, 0xE287, 0x922C, 0xE288, 0x922D, + 0xE289, 0x922E, 0xE28A, 0x922F, 0xE28B, 0x9230, 0xE28C, 0x9231, + 0xE28D, 0x9232, 0xE28E, 0x9233, 0xE28F, 0x9234, 0xE290, 0x9235, + 0xE291, 0x9236, 0xE292, 0x9237, 0xE293, 0x9238, 0xE294, 0x9239, + 0xE295, 0x923A, 0xE296, 0x923B, 0xE297, 0x923C, 0xE298, 0x923D, + 0xE299, 0x923E, 0xE29A, 0x923F, 0xE29B, 0x9240, 0xE29C, 0x9241, + 0xE29D, 0x9242, 0xE29E, 0x9243, 0xE29F, 0x9244, 0xE2A0, 0x9245, + 0xE2A1, 0x72FB, 0xE2A2, 0x7317, 0xE2A3, 0x7313, 0xE2A4, 0x7321, + 0xE2A5, 0x730A, 0xE2A6, 0x731E, 0xE2A7, 0x731D, 0xE2A8, 0x7315, + 0xE2A9, 0x7322, 0xE2AA, 0x7339, 0xE2AB, 0x7325, 0xE2AC, 0x732C, + 0xE2AD, 0x7338, 0xE2AE, 0x7331, 0xE2AF, 0x7350, 0xE2B0, 0x734D, + 0xE2B1, 0x7357, 0xE2B2, 0x7360, 0xE2B3, 0x736C, 0xE2B4, 0x736F, + 0xE2B5, 0x737E, 0xE2B6, 0x821B, 0xE2B7, 0x5925, 0xE2B8, 0x98E7, + 0xE2B9, 0x5924, 0xE2BA, 0x5902, 0xE2BB, 0x9963, 0xE2BC, 0x9967, + 0xE2BD, 0x9968, 0xE2BE, 0x9969, 0xE2BF, 0x996A, 0xE2C0, 0x996B, + 0xE2C1, 0x996C, 0xE2C2, 0x9974, 0xE2C3, 0x9977, 0xE2C4, 0x997D, + 0xE2C5, 0x9980, 0xE2C6, 0x9984, 0xE2C7, 0x9987, 0xE2C8, 0x998A, + 0xE2C9, 0x998D, 0xE2CA, 0x9990, 0xE2CB, 0x9991, 0xE2CC, 0x9993, + 0xE2CD, 0x9994, 0xE2CE, 0x9995, 0xE2CF, 0x5E80, 0xE2D0, 0x5E91, + 0xE2D1, 0x5E8B, 0xE2D2, 0x5E96, 0xE2D3, 0x5EA5, 0xE2D4, 0x5EA0, + 0xE2D5, 0x5EB9, 0xE2D6, 0x5EB5, 0xE2D7, 0x5EBE, 0xE2D8, 0x5EB3, + 0xE2D9, 0x8D53, 0xE2DA, 0x5ED2, 0xE2DB, 0x5ED1, 0xE2DC, 0x5EDB, + 0xE2DD, 0x5EE8, 0xE2DE, 0x5EEA, 0xE2DF, 0x81BA, 0xE2E0, 0x5FC4, + 0xE2E1, 0x5FC9, 0xE2E2, 0x5FD6, 0xE2E3, 0x5FCF, 0xE2E4, 0x6003, + 0xE2E5, 0x5FEE, 0xE2E6, 0x6004, 0xE2E7, 0x5FE1, 0xE2E8, 0x5FE4, + 0xE2E9, 0x5FFE, 0xE2EA, 0x6005, 0xE2EB, 0x6006, 0xE2EC, 0x5FEA, + 0xE2ED, 0x5FED, 0xE2EE, 0x5FF8, 0xE2EF, 0x6019, 0xE2F0, 0x6035, + 0xE2F1, 0x6026, 0xE2F2, 0x601B, 0xE2F3, 0x600F, 0xE2F4, 0x600D, + 0xE2F5, 0x6029, 0xE2F6, 0x602B, 0xE2F7, 0x600A, 0xE2F8, 0x603F, + 0xE2F9, 0x6021, 0xE2FA, 0x6078, 0xE2FB, 0x6079, 0xE2FC, 0x607B, + 0xE2FD, 0x607A, 0xE2FE, 0x6042, 0xE340, 0x9246, 0xE341, 0x9247, + 0xE342, 0x9248, 0xE343, 0x9249, 0xE344, 0x924A, 0xE345, 0x924B, + 0xE346, 0x924C, 0xE347, 0x924D, 0xE348, 0x924E, 0xE349, 0x924F, + 0xE34A, 0x9250, 0xE34B, 0x9251, 0xE34C, 0x9252, 0xE34D, 0x9253, + 0xE34E, 0x9254, 0xE34F, 0x9255, 0xE350, 0x9256, 0xE351, 0x9257, + 0xE352, 0x9258, 0xE353, 0x9259, 0xE354, 0x925A, 0xE355, 0x925B, + 0xE356, 0x925C, 0xE357, 0x925D, 0xE358, 0x925E, 0xE359, 0x925F, + 0xE35A, 0x9260, 0xE35B, 0x9261, 0xE35C, 0x9262, 0xE35D, 0x9263, + 0xE35E, 0x9264, 0xE35F, 0x9265, 0xE360, 0x9266, 0xE361, 0x9267, + 0xE362, 0x9268, 0xE363, 0x9269, 0xE364, 0x926A, 0xE365, 0x926B, + 0xE366, 0x926C, 0xE367, 0x926D, 0xE368, 0x926E, 0xE369, 0x926F, + 0xE36A, 0x9270, 0xE36B, 0x9271, 0xE36C, 0x9272, 0xE36D, 0x9273, + 0xE36E, 0x9275, 0xE36F, 0x9276, 0xE370, 0x9277, 0xE371, 0x9278, + 0xE372, 0x9279, 0xE373, 0x927A, 0xE374, 0x927B, 0xE375, 0x927C, + 0xE376, 0x927D, 0xE377, 0x927E, 0xE378, 0x927F, 0xE379, 0x9280, + 0xE37A, 0x9281, 0xE37B, 0x9282, 0xE37C, 0x9283, 0xE37D, 0x9284, + 0xE37E, 0x9285, 0xE380, 0x9286, 0xE381, 0x9287, 0xE382, 0x9288, + 0xE383, 0x9289, 0xE384, 0x928A, 0xE385, 0x928B, 0xE386, 0x928C, + 0xE387, 0x928D, 0xE388, 0x928F, 0xE389, 0x9290, 0xE38A, 0x9291, + 0xE38B, 0x9292, 0xE38C, 0x9293, 0xE38D, 0x9294, 0xE38E, 0x9295, + 0xE38F, 0x9296, 0xE390, 0x9297, 0xE391, 0x9298, 0xE392, 0x9299, + 0xE393, 0x929A, 0xE394, 0x929B, 0xE395, 0x929C, 0xE396, 0x929D, + 0xE397, 0x929E, 0xE398, 0x929F, 0xE399, 0x92A0, 0xE39A, 0x92A1, + 0xE39B, 0x92A2, 0xE39C, 0x92A3, 0xE39D, 0x92A4, 0xE39E, 0x92A5, + 0xE39F, 0x92A6, 0xE3A0, 0x92A7, 0xE3A1, 0x606A, 0xE3A2, 0x607D, + 0xE3A3, 0x6096, 0xE3A4, 0x609A, 0xE3A5, 0x60AD, 0xE3A6, 0x609D, + 0xE3A7, 0x6083, 0xE3A8, 0x6092, 0xE3A9, 0x608C, 0xE3AA, 0x609B, + 0xE3AB, 0x60EC, 0xE3AC, 0x60BB, 0xE3AD, 0x60B1, 0xE3AE, 0x60DD, + 0xE3AF, 0x60D8, 0xE3B0, 0x60C6, 0xE3B1, 0x60DA, 0xE3B2, 0x60B4, + 0xE3B3, 0x6120, 0xE3B4, 0x6126, 0xE3B5, 0x6115, 0xE3B6, 0x6123, + 0xE3B7, 0x60F4, 0xE3B8, 0x6100, 0xE3B9, 0x610E, 0xE3BA, 0x612B, + 0xE3BB, 0x614A, 0xE3BC, 0x6175, 0xE3BD, 0x61AC, 0xE3BE, 0x6194, + 0xE3BF, 0x61A7, 0xE3C0, 0x61B7, 0xE3C1, 0x61D4, 0xE3C2, 0x61F5, + 0xE3C3, 0x5FDD, 0xE3C4, 0x96B3, 0xE3C5, 0x95E9, 0xE3C6, 0x95EB, + 0xE3C7, 0x95F1, 0xE3C8, 0x95F3, 0xE3C9, 0x95F5, 0xE3CA, 0x95F6, + 0xE3CB, 0x95FC, 0xE3CC, 0x95FE, 0xE3CD, 0x9603, 0xE3CE, 0x9604, + 0xE3CF, 0x9606, 0xE3D0, 0x9608, 0xE3D1, 0x960A, 0xE3D2, 0x960B, + 0xE3D3, 0x960C, 0xE3D4, 0x960D, 0xE3D5, 0x960F, 0xE3D6, 0x9612, + 0xE3D7, 0x9615, 0xE3D8, 0x9616, 0xE3D9, 0x9617, 0xE3DA, 0x9619, + 0xE3DB, 0x961A, 0xE3DC, 0x4E2C, 0xE3DD, 0x723F, 0xE3DE, 0x6215, + 0xE3DF, 0x6C35, 0xE3E0, 0x6C54, 0xE3E1, 0x6C5C, 0xE3E2, 0x6C4A, + 0xE3E3, 0x6CA3, 0xE3E4, 0x6C85, 0xE3E5, 0x6C90, 0xE3E6, 0x6C94, + 0xE3E7, 0x6C8C, 0xE3E8, 0x6C68, 0xE3E9, 0x6C69, 0xE3EA, 0x6C74, + 0xE3EB, 0x6C76, 0xE3EC, 0x6C86, 0xE3ED, 0x6CA9, 0xE3EE, 0x6CD0, + 0xE3EF, 0x6CD4, 0xE3F0, 0x6CAD, 0xE3F1, 0x6CF7, 0xE3F2, 0x6CF8, + 0xE3F3, 0x6CF1, 0xE3F4, 0x6CD7, 0xE3F5, 0x6CB2, 0xE3F6, 0x6CE0, + 0xE3F7, 0x6CD6, 0xE3F8, 0x6CFA, 0xE3F9, 0x6CEB, 0xE3FA, 0x6CEE, + 0xE3FB, 0x6CB1, 0xE3FC, 0x6CD3, 0xE3FD, 0x6CEF, 0xE3FE, 0x6CFE, + 0xE440, 0x92A8, 0xE441, 0x92A9, 0xE442, 0x92AA, 0xE443, 0x92AB, + 0xE444, 0x92AC, 0xE445, 0x92AD, 0xE446, 0x92AF, 0xE447, 0x92B0, + 0xE448, 0x92B1, 0xE449, 0x92B2, 0xE44A, 0x92B3, 0xE44B, 0x92B4, + 0xE44C, 0x92B5, 0xE44D, 0x92B6, 0xE44E, 0x92B7, 0xE44F, 0x92B8, + 0xE450, 0x92B9, 0xE451, 0x92BA, 0xE452, 0x92BB, 0xE453, 0x92BC, + 0xE454, 0x92BD, 0xE455, 0x92BE, 0xE456, 0x92BF, 0xE457, 0x92C0, + 0xE458, 0x92C1, 0xE459, 0x92C2, 0xE45A, 0x92C3, 0xE45B, 0x92C4, + 0xE45C, 0x92C5, 0xE45D, 0x92C6, 0xE45E, 0x92C7, 0xE45F, 0x92C9, + 0xE460, 0x92CA, 0xE461, 0x92CB, 0xE462, 0x92CC, 0xE463, 0x92CD, + 0xE464, 0x92CE, 0xE465, 0x92CF, 0xE466, 0x92D0, 0xE467, 0x92D1, + 0xE468, 0x92D2, 0xE469, 0x92D3, 0xE46A, 0x92D4, 0xE46B, 0x92D5, + 0xE46C, 0x92D6, 0xE46D, 0x92D7, 0xE46E, 0x92D8, 0xE46F, 0x92D9, + 0xE470, 0x92DA, 0xE471, 0x92DB, 0xE472, 0x92DC, 0xE473, 0x92DD, + 0xE474, 0x92DE, 0xE475, 0x92DF, 0xE476, 0x92E0, 0xE477, 0x92E1, + 0xE478, 0x92E2, 0xE479, 0x92E3, 0xE47A, 0x92E4, 0xE47B, 0x92E5, + 0xE47C, 0x92E6, 0xE47D, 0x92E7, 0xE47E, 0x92E8, 0xE480, 0x92E9, + 0xE481, 0x92EA, 0xE482, 0x92EB, 0xE483, 0x92EC, 0xE484, 0x92ED, + 0xE485, 0x92EE, 0xE486, 0x92EF, 0xE487, 0x92F0, 0xE488, 0x92F1, + 0xE489, 0x92F2, 0xE48A, 0x92F3, 0xE48B, 0x92F4, 0xE48C, 0x92F5, + 0xE48D, 0x92F6, 0xE48E, 0x92F7, 0xE48F, 0x92F8, 0xE490, 0x92F9, + 0xE491, 0x92FA, 0xE492, 0x92FB, 0xE493, 0x92FC, 0xE494, 0x92FD, + 0xE495, 0x92FE, 0xE496, 0x92FF, 0xE497, 0x9300, 0xE498, 0x9301, + 0xE499, 0x9302, 0xE49A, 0x9303, 0xE49B, 0x9304, 0xE49C, 0x9305, + 0xE49D, 0x9306, 0xE49E, 0x9307, 0xE49F, 0x9308, 0xE4A0, 0x9309, + 0xE4A1, 0x6D39, 0xE4A2, 0x6D27, 0xE4A3, 0x6D0C, 0xE4A4, 0x6D43, + 0xE4A5, 0x6D48, 0xE4A6, 0x6D07, 0xE4A7, 0x6D04, 0xE4A8, 0x6D19, + 0xE4A9, 0x6D0E, 0xE4AA, 0x6D2B, 0xE4AB, 0x6D4D, 0xE4AC, 0x6D2E, + 0xE4AD, 0x6D35, 0xE4AE, 0x6D1A, 0xE4AF, 0x6D4F, 0xE4B0, 0x6D52, + 0xE4B1, 0x6D54, 0xE4B2, 0x6D33, 0xE4B3, 0x6D91, 0xE4B4, 0x6D6F, + 0xE4B5, 0x6D9E, 0xE4B6, 0x6DA0, 0xE4B7, 0x6D5E, 0xE4B8, 0x6D93, + 0xE4B9, 0x6D94, 0xE4BA, 0x6D5C, 0xE4BB, 0x6D60, 0xE4BC, 0x6D7C, + 0xE4BD, 0x6D63, 0xE4BE, 0x6E1A, 0xE4BF, 0x6DC7, 0xE4C0, 0x6DC5, + 0xE4C1, 0x6DDE, 0xE4C2, 0x6E0E, 0xE4C3, 0x6DBF, 0xE4C4, 0x6DE0, + 0xE4C5, 0x6E11, 0xE4C6, 0x6DE6, 0xE4C7, 0x6DDD, 0xE4C8, 0x6DD9, + 0xE4C9, 0x6E16, 0xE4CA, 0x6DAB, 0xE4CB, 0x6E0C, 0xE4CC, 0x6DAE, + 0xE4CD, 0x6E2B, 0xE4CE, 0x6E6E, 0xE4CF, 0x6E4E, 0xE4D0, 0x6E6B, + 0xE4D1, 0x6EB2, 0xE4D2, 0x6E5F, 0xE4D3, 0x6E86, 0xE4D4, 0x6E53, + 0xE4D5, 0x6E54, 0xE4D6, 0x6E32, 0xE4D7, 0x6E25, 0xE4D8, 0x6E44, + 0xE4D9, 0x6EDF, 0xE4DA, 0x6EB1, 0xE4DB, 0x6E98, 0xE4DC, 0x6EE0, + 0xE4DD, 0x6F2D, 0xE4DE, 0x6EE2, 0xE4DF, 0x6EA5, 0xE4E0, 0x6EA7, + 0xE4E1, 0x6EBD, 0xE4E2, 0x6EBB, 0xE4E3, 0x6EB7, 0xE4E4, 0x6ED7, + 0xE4E5, 0x6EB4, 0xE4E6, 0x6ECF, 0xE4E7, 0x6E8F, 0xE4E8, 0x6EC2, + 0xE4E9, 0x6E9F, 0xE4EA, 0x6F62, 0xE4EB, 0x6F46, 0xE4EC, 0x6F47, + 0xE4ED, 0x6F24, 0xE4EE, 0x6F15, 0xE4EF, 0x6EF9, 0xE4F0, 0x6F2F, + 0xE4F1, 0x6F36, 0xE4F2, 0x6F4B, 0xE4F3, 0x6F74, 0xE4F4, 0x6F2A, + 0xE4F5, 0x6F09, 0xE4F6, 0x6F29, 0xE4F7, 0x6F89, 0xE4F8, 0x6F8D, + 0xE4F9, 0x6F8C, 0xE4FA, 0x6F78, 0xE4FB, 0x6F72, 0xE4FC, 0x6F7C, + 0xE4FD, 0x6F7A, 0xE4FE, 0x6FD1, 0xE540, 0x930A, 0xE541, 0x930B, + 0xE542, 0x930C, 0xE543, 0x930D, 0xE544, 0x930E, 0xE545, 0x930F, + 0xE546, 0x9310, 0xE547, 0x9311, 0xE548, 0x9312, 0xE549, 0x9313, + 0xE54A, 0x9314, 0xE54B, 0x9315, 0xE54C, 0x9316, 0xE54D, 0x9317, + 0xE54E, 0x9318, 0xE54F, 0x9319, 0xE550, 0x931A, 0xE551, 0x931B, + 0xE552, 0x931C, 0xE553, 0x931D, 0xE554, 0x931E, 0xE555, 0x931F, + 0xE556, 0x9320, 0xE557, 0x9321, 0xE558, 0x9322, 0xE559, 0x9323, + 0xE55A, 0x9324, 0xE55B, 0x9325, 0xE55C, 0x9326, 0xE55D, 0x9327, + 0xE55E, 0x9328, 0xE55F, 0x9329, 0xE560, 0x932A, 0xE561, 0x932B, + 0xE562, 0x932C, 0xE563, 0x932D, 0xE564, 0x932E, 0xE565, 0x932F, + 0xE566, 0x9330, 0xE567, 0x9331, 0xE568, 0x9332, 0xE569, 0x9333, + 0xE56A, 0x9334, 0xE56B, 0x9335, 0xE56C, 0x9336, 0xE56D, 0x9337, + 0xE56E, 0x9338, 0xE56F, 0x9339, 0xE570, 0x933A, 0xE571, 0x933B, + 0xE572, 0x933C, 0xE573, 0x933D, 0xE574, 0x933F, 0xE575, 0x9340, + 0xE576, 0x9341, 0xE577, 0x9342, 0xE578, 0x9343, 0xE579, 0x9344, + 0xE57A, 0x9345, 0xE57B, 0x9346, 0xE57C, 0x9347, 0xE57D, 0x9348, + 0xE57E, 0x9349, 0xE580, 0x934A, 0xE581, 0x934B, 0xE582, 0x934C, + 0xE583, 0x934D, 0xE584, 0x934E, 0xE585, 0x934F, 0xE586, 0x9350, + 0xE587, 0x9351, 0xE588, 0x9352, 0xE589, 0x9353, 0xE58A, 0x9354, + 0xE58B, 0x9355, 0xE58C, 0x9356, 0xE58D, 0x9357, 0xE58E, 0x9358, + 0xE58F, 0x9359, 0xE590, 0x935A, 0xE591, 0x935B, 0xE592, 0x935C, + 0xE593, 0x935D, 0xE594, 0x935E, 0xE595, 0x935F, 0xE596, 0x9360, + 0xE597, 0x9361, 0xE598, 0x9362, 0xE599, 0x9363, 0xE59A, 0x9364, + 0xE59B, 0x9365, 0xE59C, 0x9366, 0xE59D, 0x9367, 0xE59E, 0x9368, + 0xE59F, 0x9369, 0xE5A0, 0x936B, 0xE5A1, 0x6FC9, 0xE5A2, 0x6FA7, + 0xE5A3, 0x6FB9, 0xE5A4, 0x6FB6, 0xE5A5, 0x6FC2, 0xE5A6, 0x6FE1, + 0xE5A7, 0x6FEE, 0xE5A8, 0x6FDE, 0xE5A9, 0x6FE0, 0xE5AA, 0x6FEF, + 0xE5AB, 0x701A, 0xE5AC, 0x7023, 0xE5AD, 0x701B, 0xE5AE, 0x7039, + 0xE5AF, 0x7035, 0xE5B0, 0x704F, 0xE5B1, 0x705E, 0xE5B2, 0x5B80, + 0xE5B3, 0x5B84, 0xE5B4, 0x5B95, 0xE5B5, 0x5B93, 0xE5B6, 0x5BA5, + 0xE5B7, 0x5BB8, 0xE5B8, 0x752F, 0xE5B9, 0x9A9E, 0xE5BA, 0x6434, + 0xE5BB, 0x5BE4, 0xE5BC, 0x5BEE, 0xE5BD, 0x8930, 0xE5BE, 0x5BF0, + 0xE5BF, 0x8E47, 0xE5C0, 0x8B07, 0xE5C1, 0x8FB6, 0xE5C2, 0x8FD3, + 0xE5C3, 0x8FD5, 0xE5C4, 0x8FE5, 0xE5C5, 0x8FEE, 0xE5C6, 0x8FE4, + 0xE5C7, 0x8FE9, 0xE5C8, 0x8FE6, 0xE5C9, 0x8FF3, 0xE5CA, 0x8FE8, + 0xE5CB, 0x9005, 0xE5CC, 0x9004, 0xE5CD, 0x900B, 0xE5CE, 0x9026, + 0xE5CF, 0x9011, 0xE5D0, 0x900D, 0xE5D1, 0x9016, 0xE5D2, 0x9021, + 0xE5D3, 0x9035, 0xE5D4, 0x9036, 0xE5D5, 0x902D, 0xE5D6, 0x902F, + 0xE5D7, 0x9044, 0xE5D8, 0x9051, 0xE5D9, 0x9052, 0xE5DA, 0x9050, + 0xE5DB, 0x9068, 0xE5DC, 0x9058, 0xE5DD, 0x9062, 0xE5DE, 0x905B, + 0xE5DF, 0x66B9, 0xE5E0, 0x9074, 0xE5E1, 0x907D, 0xE5E2, 0x9082, + 0xE5E3, 0x9088, 0xE5E4, 0x9083, 0xE5E5, 0x908B, 0xE5E6, 0x5F50, + 0xE5E7, 0x5F57, 0xE5E8, 0x5F56, 0xE5E9, 0x5F58, 0xE5EA, 0x5C3B, + 0xE5EB, 0x54AB, 0xE5EC, 0x5C50, 0xE5ED, 0x5C59, 0xE5EE, 0x5B71, + 0xE5EF, 0x5C63, 0xE5F0, 0x5C66, 0xE5F1, 0x7FBC, 0xE5F2, 0x5F2A, + 0xE5F3, 0x5F29, 0xE5F4, 0x5F2D, 0xE5F5, 0x8274, 0xE5F6, 0x5F3C, + 0xE5F7, 0x9B3B, 0xE5F8, 0x5C6E, 0xE5F9, 0x5981, 0xE5FA, 0x5983, + 0xE5FB, 0x598D, 0xE5FC, 0x59A9, 0xE5FD, 0x59AA, 0xE5FE, 0x59A3, + 0xE640, 0x936C, 0xE641, 0x936D, 0xE642, 0x936E, 0xE643, 0x936F, + 0xE644, 0x9370, 0xE645, 0x9371, 0xE646, 0x9372, 0xE647, 0x9373, + 0xE648, 0x9374, 0xE649, 0x9375, 0xE64A, 0x9376, 0xE64B, 0x9377, + 0xE64C, 0x9378, 0xE64D, 0x9379, 0xE64E, 0x937A, 0xE64F, 0x937B, + 0xE650, 0x937C, 0xE651, 0x937D, 0xE652, 0x937E, 0xE653, 0x937F, + 0xE654, 0x9380, 0xE655, 0x9381, 0xE656, 0x9382, 0xE657, 0x9383, + 0xE658, 0x9384, 0xE659, 0x9385, 0xE65A, 0x9386, 0xE65B, 0x9387, + 0xE65C, 0x9388, 0xE65D, 0x9389, 0xE65E, 0x938A, 0xE65F, 0x938B, + 0xE660, 0x938C, 0xE661, 0x938D, 0xE662, 0x938E, 0xE663, 0x9390, + 0xE664, 0x9391, 0xE665, 0x9392, 0xE666, 0x9393, 0xE667, 0x9394, + 0xE668, 0x9395, 0xE669, 0x9396, 0xE66A, 0x9397, 0xE66B, 0x9398, + 0xE66C, 0x9399, 0xE66D, 0x939A, 0xE66E, 0x939B, 0xE66F, 0x939C, + 0xE670, 0x939D, 0xE671, 0x939E, 0xE672, 0x939F, 0xE673, 0x93A0, + 0xE674, 0x93A1, 0xE675, 0x93A2, 0xE676, 0x93A3, 0xE677, 0x93A4, + 0xE678, 0x93A5, 0xE679, 0x93A6, 0xE67A, 0x93A7, 0xE67B, 0x93A8, + 0xE67C, 0x93A9, 0xE67D, 0x93AA, 0xE67E, 0x93AB, 0xE680, 0x93AC, + 0xE681, 0x93AD, 0xE682, 0x93AE, 0xE683, 0x93AF, 0xE684, 0x93B0, + 0xE685, 0x93B1, 0xE686, 0x93B2, 0xE687, 0x93B3, 0xE688, 0x93B4, + 0xE689, 0x93B5, 0xE68A, 0x93B6, 0xE68B, 0x93B7, 0xE68C, 0x93B8, + 0xE68D, 0x93B9, 0xE68E, 0x93BA, 0xE68F, 0x93BB, 0xE690, 0x93BC, + 0xE691, 0x93BD, 0xE692, 0x93BE, 0xE693, 0x93BF, 0xE694, 0x93C0, + 0xE695, 0x93C1, 0xE696, 0x93C2, 0xE697, 0x93C3, 0xE698, 0x93C4, + 0xE699, 0x93C5, 0xE69A, 0x93C6, 0xE69B, 0x93C7, 0xE69C, 0x93C8, + 0xE69D, 0x93C9, 0xE69E, 0x93CB, 0xE69F, 0x93CC, 0xE6A0, 0x93CD, + 0xE6A1, 0x5997, 0xE6A2, 0x59CA, 0xE6A3, 0x59AB, 0xE6A4, 0x599E, + 0xE6A5, 0x59A4, 0xE6A6, 0x59D2, 0xE6A7, 0x59B2, 0xE6A8, 0x59AF, + 0xE6A9, 0x59D7, 0xE6AA, 0x59BE, 0xE6AB, 0x5A05, 0xE6AC, 0x5A06, + 0xE6AD, 0x59DD, 0xE6AE, 0x5A08, 0xE6AF, 0x59E3, 0xE6B0, 0x59D8, + 0xE6B1, 0x59F9, 0xE6B2, 0x5A0C, 0xE6B3, 0x5A09, 0xE6B4, 0x5A32, + 0xE6B5, 0x5A34, 0xE6B6, 0x5A11, 0xE6B7, 0x5A23, 0xE6B8, 0x5A13, + 0xE6B9, 0x5A40, 0xE6BA, 0x5A67, 0xE6BB, 0x5A4A, 0xE6BC, 0x5A55, + 0xE6BD, 0x5A3C, 0xE6BE, 0x5A62, 0xE6BF, 0x5A75, 0xE6C0, 0x80EC, + 0xE6C1, 0x5AAA, 0xE6C2, 0x5A9B, 0xE6C3, 0x5A77, 0xE6C4, 0x5A7A, + 0xE6C5, 0x5ABE, 0xE6C6, 0x5AEB, 0xE6C7, 0x5AB2, 0xE6C8, 0x5AD2, + 0xE6C9, 0x5AD4, 0xE6CA, 0x5AB8, 0xE6CB, 0x5AE0, 0xE6CC, 0x5AE3, + 0xE6CD, 0x5AF1, 0xE6CE, 0x5AD6, 0xE6CF, 0x5AE6, 0xE6D0, 0x5AD8, + 0xE6D1, 0x5ADC, 0xE6D2, 0x5B09, 0xE6D3, 0x5B17, 0xE6D4, 0x5B16, + 0xE6D5, 0x5B32, 0xE6D6, 0x5B37, 0xE6D7, 0x5B40, 0xE6D8, 0x5C15, + 0xE6D9, 0x5C1C, 0xE6DA, 0x5B5A, 0xE6DB, 0x5B65, 0xE6DC, 0x5B73, + 0xE6DD, 0x5B51, 0xE6DE, 0x5B53, 0xE6DF, 0x5B62, 0xE6E0, 0x9A75, + 0xE6E1, 0x9A77, 0xE6E2, 0x9A78, 0xE6E3, 0x9A7A, 0xE6E4, 0x9A7F, + 0xE6E5, 0x9A7D, 0xE6E6, 0x9A80, 0xE6E7, 0x9A81, 0xE6E8, 0x9A85, + 0xE6E9, 0x9A88, 0xE6EA, 0x9A8A, 0xE6EB, 0x9A90, 0xE6EC, 0x9A92, + 0xE6ED, 0x9A93, 0xE6EE, 0x9A96, 0xE6EF, 0x9A98, 0xE6F0, 0x9A9B, + 0xE6F1, 0x9A9C, 0xE6F2, 0x9A9D, 0xE6F3, 0x9A9F, 0xE6F4, 0x9AA0, + 0xE6F5, 0x9AA2, 0xE6F6, 0x9AA3, 0xE6F7, 0x9AA5, 0xE6F8, 0x9AA7, + 0xE6F9, 0x7E9F, 0xE6FA, 0x7EA1, 0xE6FB, 0x7EA3, 0xE6FC, 0x7EA5, + 0xE6FD, 0x7EA8, 0xE6FE, 0x7EA9, 0xE740, 0x93CE, 0xE741, 0x93CF, + 0xE742, 0x93D0, 0xE743, 0x93D1, 0xE744, 0x93D2, 0xE745, 0x93D3, + 0xE746, 0x93D4, 0xE747, 0x93D5, 0xE748, 0x93D7, 0xE749, 0x93D8, + 0xE74A, 0x93D9, 0xE74B, 0x93DA, 0xE74C, 0x93DB, 0xE74D, 0x93DC, + 0xE74E, 0x93DD, 0xE74F, 0x93DE, 0xE750, 0x93DF, 0xE751, 0x93E0, + 0xE752, 0x93E1, 0xE753, 0x93E2, 0xE754, 0x93E3, 0xE755, 0x93E4, + 0xE756, 0x93E5, 0xE757, 0x93E6, 0xE758, 0x93E7, 0xE759, 0x93E8, + 0xE75A, 0x93E9, 0xE75B, 0x93EA, 0xE75C, 0x93EB, 0xE75D, 0x93EC, + 0xE75E, 0x93ED, 0xE75F, 0x93EE, 0xE760, 0x93EF, 0xE761, 0x93F0, + 0xE762, 0x93F1, 0xE763, 0x93F2, 0xE764, 0x93F3, 0xE765, 0x93F4, + 0xE766, 0x93F5, 0xE767, 0x93F6, 0xE768, 0x93F7, 0xE769, 0x93F8, + 0xE76A, 0x93F9, 0xE76B, 0x93FA, 0xE76C, 0x93FB, 0xE76D, 0x93FC, + 0xE76E, 0x93FD, 0xE76F, 0x93FE, 0xE770, 0x93FF, 0xE771, 0x9400, + 0xE772, 0x9401, 0xE773, 0x9402, 0xE774, 0x9403, 0xE775, 0x9404, + 0xE776, 0x9405, 0xE777, 0x9406, 0xE778, 0x9407, 0xE779, 0x9408, + 0xE77A, 0x9409, 0xE77B, 0x940A, 0xE77C, 0x940B, 0xE77D, 0x940C, + 0xE77E, 0x940D, 0xE780, 0x940E, 0xE781, 0x940F, 0xE782, 0x9410, + 0xE783, 0x9411, 0xE784, 0x9412, 0xE785, 0x9413, 0xE786, 0x9414, + 0xE787, 0x9415, 0xE788, 0x9416, 0xE789, 0x9417, 0xE78A, 0x9418, + 0xE78B, 0x9419, 0xE78C, 0x941A, 0xE78D, 0x941B, 0xE78E, 0x941C, + 0xE78F, 0x941D, 0xE790, 0x941E, 0xE791, 0x941F, 0xE792, 0x9420, + 0xE793, 0x9421, 0xE794, 0x9422, 0xE795, 0x9423, 0xE796, 0x9424, + 0xE797, 0x9425, 0xE798, 0x9426, 0xE799, 0x9427, 0xE79A, 0x9428, + 0xE79B, 0x9429, 0xE79C, 0x942A, 0xE79D, 0x942B, 0xE79E, 0x942C, + 0xE79F, 0x942D, 0xE7A0, 0x942E, 0xE7A1, 0x7EAD, 0xE7A2, 0x7EB0, + 0xE7A3, 0x7EBE, 0xE7A4, 0x7EC0, 0xE7A5, 0x7EC1, 0xE7A6, 0x7EC2, + 0xE7A7, 0x7EC9, 0xE7A8, 0x7ECB, 0xE7A9, 0x7ECC, 0xE7AA, 0x7ED0, + 0xE7AB, 0x7ED4, 0xE7AC, 0x7ED7, 0xE7AD, 0x7EDB, 0xE7AE, 0x7EE0, + 0xE7AF, 0x7EE1, 0xE7B0, 0x7EE8, 0xE7B1, 0x7EEB, 0xE7B2, 0x7EEE, + 0xE7B3, 0x7EEF, 0xE7B4, 0x7EF1, 0xE7B5, 0x7EF2, 0xE7B6, 0x7F0D, + 0xE7B7, 0x7EF6, 0xE7B8, 0x7EFA, 0xE7B9, 0x7EFB, 0xE7BA, 0x7EFE, + 0xE7BB, 0x7F01, 0xE7BC, 0x7F02, 0xE7BD, 0x7F03, 0xE7BE, 0x7F07, + 0xE7BF, 0x7F08, 0xE7C0, 0x7F0B, 0xE7C1, 0x7F0C, 0xE7C2, 0x7F0F, + 0xE7C3, 0x7F11, 0xE7C4, 0x7F12, 0xE7C5, 0x7F17, 0xE7C6, 0x7F19, + 0xE7C7, 0x7F1C, 0xE7C8, 0x7F1B, 0xE7C9, 0x7F1F, 0xE7CA, 0x7F21, + 0xE7CB, 0x7F22, 0xE7CC, 0x7F23, 0xE7CD, 0x7F24, 0xE7CE, 0x7F25, + 0xE7CF, 0x7F26, 0xE7D0, 0x7F27, 0xE7D1, 0x7F2A, 0xE7D2, 0x7F2B, + 0xE7D3, 0x7F2C, 0xE7D4, 0x7F2D, 0xE7D5, 0x7F2F, 0xE7D6, 0x7F30, + 0xE7D7, 0x7F31, 0xE7D8, 0x7F32, 0xE7D9, 0x7F33, 0xE7DA, 0x7F35, + 0xE7DB, 0x5E7A, 0xE7DC, 0x757F, 0xE7DD, 0x5DDB, 0xE7DE, 0x753E, + 0xE7DF, 0x9095, 0xE7E0, 0x738E, 0xE7E1, 0x7391, 0xE7E2, 0x73AE, + 0xE7E3, 0x73A2, 0xE7E4, 0x739F, 0xE7E5, 0x73CF, 0xE7E6, 0x73C2, + 0xE7E7, 0x73D1, 0xE7E8, 0x73B7, 0xE7E9, 0x73B3, 0xE7EA, 0x73C0, + 0xE7EB, 0x73C9, 0xE7EC, 0x73C8, 0xE7ED, 0x73E5, 0xE7EE, 0x73D9, + 0xE7EF, 0x987C, 0xE7F0, 0x740A, 0xE7F1, 0x73E9, 0xE7F2, 0x73E7, + 0xE7F3, 0x73DE, 0xE7F4, 0x73BA, 0xE7F5, 0x73F2, 0xE7F6, 0x740F, + 0xE7F7, 0x742A, 0xE7F8, 0x745B, 0xE7F9, 0x7426, 0xE7FA, 0x7425, + 0xE7FB, 0x7428, 0xE7FC, 0x7430, 0xE7FD, 0x742E, 0xE7FE, 0x742C, + 0xE840, 0x942F, 0xE841, 0x9430, 0xE842, 0x9431, 0xE843, 0x9432, + 0xE844, 0x9433, 0xE845, 0x9434, 0xE846, 0x9435, 0xE847, 0x9436, + 0xE848, 0x9437, 0xE849, 0x9438, 0xE84A, 0x9439, 0xE84B, 0x943A, + 0xE84C, 0x943B, 0xE84D, 0x943C, 0xE84E, 0x943D, 0xE84F, 0x943F, + 0xE850, 0x9440, 0xE851, 0x9441, 0xE852, 0x9442, 0xE853, 0x9443, + 0xE854, 0x9444, 0xE855, 0x9445, 0xE856, 0x9446, 0xE857, 0x9447, + 0xE858, 0x9448, 0xE859, 0x9449, 0xE85A, 0x944A, 0xE85B, 0x944B, + 0xE85C, 0x944C, 0xE85D, 0x944D, 0xE85E, 0x944E, 0xE85F, 0x944F, + 0xE860, 0x9450, 0xE861, 0x9451, 0xE862, 0x9452, 0xE863, 0x9453, + 0xE864, 0x9454, 0xE865, 0x9455, 0xE866, 0x9456, 0xE867, 0x9457, + 0xE868, 0x9458, 0xE869, 0x9459, 0xE86A, 0x945A, 0xE86B, 0x945B, + 0xE86C, 0x945C, 0xE86D, 0x945D, 0xE86E, 0x945E, 0xE86F, 0x945F, + 0xE870, 0x9460, 0xE871, 0x9461, 0xE872, 0x9462, 0xE873, 0x9463, + 0xE874, 0x9464, 0xE875, 0x9465, 0xE876, 0x9466, 0xE877, 0x9467, + 0xE878, 0x9468, 0xE879, 0x9469, 0xE87A, 0x946A, 0xE87B, 0x946C, + 0xE87C, 0x946D, 0xE87D, 0x946E, 0xE87E, 0x946F, 0xE880, 0x9470, + 0xE881, 0x9471, 0xE882, 0x9472, 0xE883, 0x9473, 0xE884, 0x9474, + 0xE885, 0x9475, 0xE886, 0x9476, 0xE887, 0x9477, 0xE888, 0x9478, + 0xE889, 0x9479, 0xE88A, 0x947A, 0xE88B, 0x947B, 0xE88C, 0x947C, + 0xE88D, 0x947D, 0xE88E, 0x947E, 0xE88F, 0x947F, 0xE890, 0x9480, + 0xE891, 0x9481, 0xE892, 0x9482, 0xE893, 0x9483, 0xE894, 0x9484, + 0xE895, 0x9491, 0xE896, 0x9496, 0xE897, 0x9498, 0xE898, 0x94C7, + 0xE899, 0x94CF, 0xE89A, 0x94D3, 0xE89B, 0x94D4, 0xE89C, 0x94DA, + 0xE89D, 0x94E6, 0xE89E, 0x94FB, 0xE89F, 0x951C, 0xE8A0, 0x9520, + 0xE8A1, 0x741B, 0xE8A2, 0x741A, 0xE8A3, 0x7441, 0xE8A4, 0x745C, + 0xE8A5, 0x7457, 0xE8A6, 0x7455, 0xE8A7, 0x7459, 0xE8A8, 0x7477, + 0xE8A9, 0x746D, 0xE8AA, 0x747E, 0xE8AB, 0x749C, 0xE8AC, 0x748E, + 0xE8AD, 0x7480, 0xE8AE, 0x7481, 0xE8AF, 0x7487, 0xE8B0, 0x748B, + 0xE8B1, 0x749E, 0xE8B2, 0x74A8, 0xE8B3, 0x74A9, 0xE8B4, 0x7490, + 0xE8B5, 0x74A7, 0xE8B6, 0x74D2, 0xE8B7, 0x74BA, 0xE8B8, 0x97EA, + 0xE8B9, 0x97EB, 0xE8BA, 0x97EC, 0xE8BB, 0x674C, 0xE8BC, 0x6753, + 0xE8BD, 0x675E, 0xE8BE, 0x6748, 0xE8BF, 0x6769, 0xE8C0, 0x67A5, + 0xE8C1, 0x6787, 0xE8C2, 0x676A, 0xE8C3, 0x6773, 0xE8C4, 0x6798, + 0xE8C5, 0x67A7, 0xE8C6, 0x6775, 0xE8C7, 0x67A8, 0xE8C8, 0x679E, + 0xE8C9, 0x67AD, 0xE8CA, 0x678B, 0xE8CB, 0x6777, 0xE8CC, 0x677C, + 0xE8CD, 0x67F0, 0xE8CE, 0x6809, 0xE8CF, 0x67D8, 0xE8D0, 0x680A, + 0xE8D1, 0x67E9, 0xE8D2, 0x67B0, 0xE8D3, 0x680C, 0xE8D4, 0x67D9, + 0xE8D5, 0x67B5, 0xE8D6, 0x67DA, 0xE8D7, 0x67B3, 0xE8D8, 0x67DD, + 0xE8D9, 0x6800, 0xE8DA, 0x67C3, 0xE8DB, 0x67B8, 0xE8DC, 0x67E2, + 0xE8DD, 0x680E, 0xE8DE, 0x67C1, 0xE8DF, 0x67FD, 0xE8E0, 0x6832, + 0xE8E1, 0x6833, 0xE8E2, 0x6860, 0xE8E3, 0x6861, 0xE8E4, 0x684E, + 0xE8E5, 0x6862, 0xE8E6, 0x6844, 0xE8E7, 0x6864, 0xE8E8, 0x6883, + 0xE8E9, 0x681D, 0xE8EA, 0x6855, 0xE8EB, 0x6866, 0xE8EC, 0x6841, + 0xE8ED, 0x6867, 0xE8EE, 0x6840, 0xE8EF, 0x683E, 0xE8F0, 0x684A, + 0xE8F1, 0x6849, 0xE8F2, 0x6829, 0xE8F3, 0x68B5, 0xE8F4, 0x688F, + 0xE8F5, 0x6874, 0xE8F6, 0x6877, 0xE8F7, 0x6893, 0xE8F8, 0x686B, + 0xE8F9, 0x68C2, 0xE8FA, 0x696E, 0xE8FB, 0x68FC, 0xE8FC, 0x691F, + 0xE8FD, 0x6920, 0xE8FE, 0x68F9, 0xE940, 0x9527, 0xE941, 0x9533, + 0xE942, 0x953D, 0xE943, 0x9543, 0xE944, 0x9548, 0xE945, 0x954B, + 0xE946, 0x9555, 0xE947, 0x955A, 0xE948, 0x9560, 0xE949, 0x956E, + 0xE94A, 0x9574, 0xE94B, 0x9575, 0xE94C, 0x9577, 0xE94D, 0x9578, + 0xE94E, 0x9579, 0xE94F, 0x957A, 0xE950, 0x957B, 0xE951, 0x957C, + 0xE952, 0x957D, 0xE953, 0x957E, 0xE954, 0x9580, 0xE955, 0x9581, + 0xE956, 0x9582, 0xE957, 0x9583, 0xE958, 0x9584, 0xE959, 0x9585, + 0xE95A, 0x9586, 0xE95B, 0x9587, 0xE95C, 0x9588, 0xE95D, 0x9589, + 0xE95E, 0x958A, 0xE95F, 0x958B, 0xE960, 0x958C, 0xE961, 0x958D, + 0xE962, 0x958E, 0xE963, 0x958F, 0xE964, 0x9590, 0xE965, 0x9591, + 0xE966, 0x9592, 0xE967, 0x9593, 0xE968, 0x9594, 0xE969, 0x9595, + 0xE96A, 0x9596, 0xE96B, 0x9597, 0xE96C, 0x9598, 0xE96D, 0x9599, + 0xE96E, 0x959A, 0xE96F, 0x959B, 0xE970, 0x959C, 0xE971, 0x959D, + 0xE972, 0x959E, 0xE973, 0x959F, 0xE974, 0x95A0, 0xE975, 0x95A1, + 0xE976, 0x95A2, 0xE977, 0x95A3, 0xE978, 0x95A4, 0xE979, 0x95A5, + 0xE97A, 0x95A6, 0xE97B, 0x95A7, 0xE97C, 0x95A8, 0xE97D, 0x95A9, + 0xE97E, 0x95AA, 0xE980, 0x95AB, 0xE981, 0x95AC, 0xE982, 0x95AD, + 0xE983, 0x95AE, 0xE984, 0x95AF, 0xE985, 0x95B0, 0xE986, 0x95B1, + 0xE987, 0x95B2, 0xE988, 0x95B3, 0xE989, 0x95B4, 0xE98A, 0x95B5, + 0xE98B, 0x95B6, 0xE98C, 0x95B7, 0xE98D, 0x95B8, 0xE98E, 0x95B9, + 0xE98F, 0x95BA, 0xE990, 0x95BB, 0xE991, 0x95BC, 0xE992, 0x95BD, + 0xE993, 0x95BE, 0xE994, 0x95BF, 0xE995, 0x95C0, 0xE996, 0x95C1, + 0xE997, 0x95C2, 0xE998, 0x95C3, 0xE999, 0x95C4, 0xE99A, 0x95C5, + 0xE99B, 0x95C6, 0xE99C, 0x95C7, 0xE99D, 0x95C8, 0xE99E, 0x95C9, + 0xE99F, 0x95CA, 0xE9A0, 0x95CB, 0xE9A1, 0x6924, 0xE9A2, 0x68F0, + 0xE9A3, 0x690B, 0xE9A4, 0x6901, 0xE9A5, 0x6957, 0xE9A6, 0x68E3, + 0xE9A7, 0x6910, 0xE9A8, 0x6971, 0xE9A9, 0x6939, 0xE9AA, 0x6960, + 0xE9AB, 0x6942, 0xE9AC, 0x695D, 0xE9AD, 0x6984, 0xE9AE, 0x696B, + 0xE9AF, 0x6980, 0xE9B0, 0x6998, 0xE9B1, 0x6978, 0xE9B2, 0x6934, + 0xE9B3, 0x69CC, 0xE9B4, 0x6987, 0xE9B5, 0x6988, 0xE9B6, 0x69CE, + 0xE9B7, 0x6989, 0xE9B8, 0x6966, 0xE9B9, 0x6963, 0xE9BA, 0x6979, + 0xE9BB, 0x699B, 0xE9BC, 0x69A7, 0xE9BD, 0x69BB, 0xE9BE, 0x69AB, + 0xE9BF, 0x69AD, 0xE9C0, 0x69D4, 0xE9C1, 0x69B1, 0xE9C2, 0x69C1, + 0xE9C3, 0x69CA, 0xE9C4, 0x69DF, 0xE9C5, 0x6995, 0xE9C6, 0x69E0, + 0xE9C7, 0x698D, 0xE9C8, 0x69FF, 0xE9C9, 0x6A2F, 0xE9CA, 0x69ED, + 0xE9CB, 0x6A17, 0xE9CC, 0x6A18, 0xE9CD, 0x6A65, 0xE9CE, 0x69F2, + 0xE9CF, 0x6A44, 0xE9D0, 0x6A3E, 0xE9D1, 0x6AA0, 0xE9D2, 0x6A50, + 0xE9D3, 0x6A5B, 0xE9D4, 0x6A35, 0xE9D5, 0x6A8E, 0xE9D6, 0x6A79, + 0xE9D7, 0x6A3D, 0xE9D8, 0x6A28, 0xE9D9, 0x6A58, 0xE9DA, 0x6A7C, + 0xE9DB, 0x6A91, 0xE9DC, 0x6A90, 0xE9DD, 0x6AA9, 0xE9DE, 0x6A97, + 0xE9DF, 0x6AAB, 0xE9E0, 0x7337, 0xE9E1, 0x7352, 0xE9E2, 0x6B81, + 0xE9E3, 0x6B82, 0xE9E4, 0x6B87, 0xE9E5, 0x6B84, 0xE9E6, 0x6B92, + 0xE9E7, 0x6B93, 0xE9E8, 0x6B8D, 0xE9E9, 0x6B9A, 0xE9EA, 0x6B9B, + 0xE9EB, 0x6BA1, 0xE9EC, 0x6BAA, 0xE9ED, 0x8F6B, 0xE9EE, 0x8F6D, + 0xE9EF, 0x8F71, 0xE9F0, 0x8F72, 0xE9F1, 0x8F73, 0xE9F2, 0x8F75, + 0xE9F3, 0x8F76, 0xE9F4, 0x8F78, 0xE9F5, 0x8F77, 0xE9F6, 0x8F79, + 0xE9F7, 0x8F7A, 0xE9F8, 0x8F7C, 0xE9F9, 0x8F7E, 0xE9FA, 0x8F81, + 0xE9FB, 0x8F82, 0xE9FC, 0x8F84, 0xE9FD, 0x8F87, 0xE9FE, 0x8F8B, + 0xEA40, 0x95CC, 0xEA41, 0x95CD, 0xEA42, 0x95CE, 0xEA43, 0x95CF, + 0xEA44, 0x95D0, 0xEA45, 0x95D1, 0xEA46, 0x95D2, 0xEA47, 0x95D3, + 0xEA48, 0x95D4, 0xEA49, 0x95D5, 0xEA4A, 0x95D6, 0xEA4B, 0x95D7, + 0xEA4C, 0x95D8, 0xEA4D, 0x95D9, 0xEA4E, 0x95DA, 0xEA4F, 0x95DB, + 0xEA50, 0x95DC, 0xEA51, 0x95DD, 0xEA52, 0x95DE, 0xEA53, 0x95DF, + 0xEA54, 0x95E0, 0xEA55, 0x95E1, 0xEA56, 0x95E2, 0xEA57, 0x95E3, + 0xEA58, 0x95E4, 0xEA59, 0x95E5, 0xEA5A, 0x95E6, 0xEA5B, 0x95E7, + 0xEA5C, 0x95EC, 0xEA5D, 0x95FF, 0xEA5E, 0x9607, 0xEA5F, 0x9613, + 0xEA60, 0x9618, 0xEA61, 0x961B, 0xEA62, 0x961E, 0xEA63, 0x9620, + 0xEA64, 0x9623, 0xEA65, 0x9624, 0xEA66, 0x9625, 0xEA67, 0x9626, + 0xEA68, 0x9627, 0xEA69, 0x9628, 0xEA6A, 0x9629, 0xEA6B, 0x962B, + 0xEA6C, 0x962C, 0xEA6D, 0x962D, 0xEA6E, 0x962F, 0xEA6F, 0x9630, + 0xEA70, 0x9637, 0xEA71, 0x9638, 0xEA72, 0x9639, 0xEA73, 0x963A, + 0xEA74, 0x963E, 0xEA75, 0x9641, 0xEA76, 0x9643, 0xEA77, 0x964A, + 0xEA78, 0x964E, 0xEA79, 0x964F, 0xEA7A, 0x9651, 0xEA7B, 0x9652, + 0xEA7C, 0x9653, 0xEA7D, 0x9656, 0xEA7E, 0x9657, 0xEA80, 0x9658, + 0xEA81, 0x9659, 0xEA82, 0x965A, 0xEA83, 0x965C, 0xEA84, 0x965D, + 0xEA85, 0x965E, 0xEA86, 0x9660, 0xEA87, 0x9663, 0xEA88, 0x9665, + 0xEA89, 0x9666, 0xEA8A, 0x966B, 0xEA8B, 0x966D, 0xEA8C, 0x966E, + 0xEA8D, 0x966F, 0xEA8E, 0x9670, 0xEA8F, 0x9671, 0xEA90, 0x9673, + 0xEA91, 0x9678, 0xEA92, 0x9679, 0xEA93, 0x967A, 0xEA94, 0x967B, + 0xEA95, 0x967C, 0xEA96, 0x967D, 0xEA97, 0x967E, 0xEA98, 0x967F, + 0xEA99, 0x9680, 0xEA9A, 0x9681, 0xEA9B, 0x9682, 0xEA9C, 0x9683, + 0xEA9D, 0x9684, 0xEA9E, 0x9687, 0xEA9F, 0x9689, 0xEAA0, 0x968A, + 0xEAA1, 0x8F8D, 0xEAA2, 0x8F8E, 0xEAA3, 0x8F8F, 0xEAA4, 0x8F98, + 0xEAA5, 0x8F9A, 0xEAA6, 0x8ECE, 0xEAA7, 0x620B, 0xEAA8, 0x6217, + 0xEAA9, 0x621B, 0xEAAA, 0x621F, 0xEAAB, 0x6222, 0xEAAC, 0x6221, + 0xEAAD, 0x6225, 0xEAAE, 0x6224, 0xEAAF, 0x622C, 0xEAB0, 0x81E7, + 0xEAB1, 0x74EF, 0xEAB2, 0x74F4, 0xEAB3, 0x74FF, 0xEAB4, 0x750F, + 0xEAB5, 0x7511, 0xEAB6, 0x7513, 0xEAB7, 0x6534, 0xEAB8, 0x65EE, + 0xEAB9, 0x65EF, 0xEABA, 0x65F0, 0xEABB, 0x660A, 0xEABC, 0x6619, + 0xEABD, 0x6772, 0xEABE, 0x6603, 0xEABF, 0x6615, 0xEAC0, 0x6600, + 0xEAC1, 0x7085, 0xEAC2, 0x66F7, 0xEAC3, 0x661D, 0xEAC4, 0x6634, + 0xEAC5, 0x6631, 0xEAC6, 0x6636, 0xEAC7, 0x6635, 0xEAC8, 0x8006, + 0xEAC9, 0x665F, 0xEACA, 0x6654, 0xEACB, 0x6641, 0xEACC, 0x664F, + 0xEACD, 0x6656, 0xEACE, 0x6661, 0xEACF, 0x6657, 0xEAD0, 0x6677, + 0xEAD1, 0x6684, 0xEAD2, 0x668C, 0xEAD3, 0x66A7, 0xEAD4, 0x669D, + 0xEAD5, 0x66BE, 0xEAD6, 0x66DB, 0xEAD7, 0x66DC, 0xEAD8, 0x66E6, + 0xEAD9, 0x66E9, 0xEADA, 0x8D32, 0xEADB, 0x8D33, 0xEADC, 0x8D36, + 0xEADD, 0x8D3B, 0xEADE, 0x8D3D, 0xEADF, 0x8D40, 0xEAE0, 0x8D45, + 0xEAE1, 0x8D46, 0xEAE2, 0x8D48, 0xEAE3, 0x8D49, 0xEAE4, 0x8D47, + 0xEAE5, 0x8D4D, 0xEAE6, 0x8D55, 0xEAE7, 0x8D59, 0xEAE8, 0x89C7, + 0xEAE9, 0x89CA, 0xEAEA, 0x89CB, 0xEAEB, 0x89CC, 0xEAEC, 0x89CE, + 0xEAED, 0x89CF, 0xEAEE, 0x89D0, 0xEAEF, 0x89D1, 0xEAF0, 0x726E, + 0xEAF1, 0x729F, 0xEAF2, 0x725D, 0xEAF3, 0x7266, 0xEAF4, 0x726F, + 0xEAF5, 0x727E, 0xEAF6, 0x727F, 0xEAF7, 0x7284, 0xEAF8, 0x728B, + 0xEAF9, 0x728D, 0xEAFA, 0x728F, 0xEAFB, 0x7292, 0xEAFC, 0x6308, + 0xEAFD, 0x6332, 0xEAFE, 0x63B0, 0xEB40, 0x968C, 0xEB41, 0x968E, + 0xEB42, 0x9691, 0xEB43, 0x9692, 0xEB44, 0x9693, 0xEB45, 0x9695, + 0xEB46, 0x9696, 0xEB47, 0x969A, 0xEB48, 0x969B, 0xEB49, 0x969D, + 0xEB4A, 0x969E, 0xEB4B, 0x969F, 0xEB4C, 0x96A0, 0xEB4D, 0x96A1, + 0xEB4E, 0x96A2, 0xEB4F, 0x96A3, 0xEB50, 0x96A4, 0xEB51, 0x96A5, + 0xEB52, 0x96A6, 0xEB53, 0x96A8, 0xEB54, 0x96A9, 0xEB55, 0x96AA, + 0xEB56, 0x96AB, 0xEB57, 0x96AC, 0xEB58, 0x96AD, 0xEB59, 0x96AE, + 0xEB5A, 0x96AF, 0xEB5B, 0x96B1, 0xEB5C, 0x96B2, 0xEB5D, 0x96B4, + 0xEB5E, 0x96B5, 0xEB5F, 0x96B7, 0xEB60, 0x96B8, 0xEB61, 0x96BA, + 0xEB62, 0x96BB, 0xEB63, 0x96BF, 0xEB64, 0x96C2, 0xEB65, 0x96C3, + 0xEB66, 0x96C8, 0xEB67, 0x96CA, 0xEB68, 0x96CB, 0xEB69, 0x96D0, + 0xEB6A, 0x96D1, 0xEB6B, 0x96D3, 0xEB6C, 0x96D4, 0xEB6D, 0x96D6, + 0xEB6E, 0x96D7, 0xEB6F, 0x96D8, 0xEB70, 0x96D9, 0xEB71, 0x96DA, + 0xEB72, 0x96DB, 0xEB73, 0x96DC, 0xEB74, 0x96DD, 0xEB75, 0x96DE, + 0xEB76, 0x96DF, 0xEB77, 0x96E1, 0xEB78, 0x96E2, 0xEB79, 0x96E3, + 0xEB7A, 0x96E4, 0xEB7B, 0x96E5, 0xEB7C, 0x96E6, 0xEB7D, 0x96E7, + 0xEB7E, 0x96EB, 0xEB80, 0x96EC, 0xEB81, 0x96ED, 0xEB82, 0x96EE, + 0xEB83, 0x96F0, 0xEB84, 0x96F1, 0xEB85, 0x96F2, 0xEB86, 0x96F4, + 0xEB87, 0x96F5, 0xEB88, 0x96F8, 0xEB89, 0x96FA, 0xEB8A, 0x96FB, + 0xEB8B, 0x96FC, 0xEB8C, 0x96FD, 0xEB8D, 0x96FF, 0xEB8E, 0x9702, + 0xEB8F, 0x9703, 0xEB90, 0x9705, 0xEB91, 0x970A, 0xEB92, 0x970B, + 0xEB93, 0x970C, 0xEB94, 0x9710, 0xEB95, 0x9711, 0xEB96, 0x9712, + 0xEB97, 0x9714, 0xEB98, 0x9715, 0xEB99, 0x9717, 0xEB9A, 0x9718, + 0xEB9B, 0x9719, 0xEB9C, 0x971A, 0xEB9D, 0x971B, 0xEB9E, 0x971D, + 0xEB9F, 0x971F, 0xEBA0, 0x9720, 0xEBA1, 0x643F, 0xEBA2, 0x64D8, + 0xEBA3, 0x8004, 0xEBA4, 0x6BEA, 0xEBA5, 0x6BF3, 0xEBA6, 0x6BFD, + 0xEBA7, 0x6BF5, 0xEBA8, 0x6BF9, 0xEBA9, 0x6C05, 0xEBAA, 0x6C07, + 0xEBAB, 0x6C06, 0xEBAC, 0x6C0D, 0xEBAD, 0x6C15, 0xEBAE, 0x6C18, + 0xEBAF, 0x6C19, 0xEBB0, 0x6C1A, 0xEBB1, 0x6C21, 0xEBB2, 0x6C29, + 0xEBB3, 0x6C24, 0xEBB4, 0x6C2A, 0xEBB5, 0x6C32, 0xEBB6, 0x6535, + 0xEBB7, 0x6555, 0xEBB8, 0x656B, 0xEBB9, 0x724D, 0xEBBA, 0x7252, + 0xEBBB, 0x7256, 0xEBBC, 0x7230, 0xEBBD, 0x8662, 0xEBBE, 0x5216, + 0xEBBF, 0x809F, 0xEBC0, 0x809C, 0xEBC1, 0x8093, 0xEBC2, 0x80BC, + 0xEBC3, 0x670A, 0xEBC4, 0x80BD, 0xEBC5, 0x80B1, 0xEBC6, 0x80AB, + 0xEBC7, 0x80AD, 0xEBC8, 0x80B4, 0xEBC9, 0x80B7, 0xEBCA, 0x80E7, + 0xEBCB, 0x80E8, 0xEBCC, 0x80E9, 0xEBCD, 0x80EA, 0xEBCE, 0x80DB, + 0xEBCF, 0x80C2, 0xEBD0, 0x80C4, 0xEBD1, 0x80D9, 0xEBD2, 0x80CD, + 0xEBD3, 0x80D7, 0xEBD4, 0x6710, 0xEBD5, 0x80DD, 0xEBD6, 0x80EB, + 0xEBD7, 0x80F1, 0xEBD8, 0x80F4, 0xEBD9, 0x80ED, 0xEBDA, 0x810D, + 0xEBDB, 0x810E, 0xEBDC, 0x80F2, 0xEBDD, 0x80FC, 0xEBDE, 0x6715, + 0xEBDF, 0x8112, 0xEBE0, 0x8C5A, 0xEBE1, 0x8136, 0xEBE2, 0x811E, + 0xEBE3, 0x812C, 0xEBE4, 0x8118, 0xEBE5, 0x8132, 0xEBE6, 0x8148, + 0xEBE7, 0x814C, 0xEBE8, 0x8153, 0xEBE9, 0x8174, 0xEBEA, 0x8159, + 0xEBEB, 0x815A, 0xEBEC, 0x8171, 0xEBED, 0x8160, 0xEBEE, 0x8169, + 0xEBEF, 0x817C, 0xEBF0, 0x817D, 0xEBF1, 0x816D, 0xEBF2, 0x8167, + 0xEBF3, 0x584D, 0xEBF4, 0x5AB5, 0xEBF5, 0x8188, 0xEBF6, 0x8182, + 0xEBF7, 0x8191, 0xEBF8, 0x6ED5, 0xEBF9, 0x81A3, 0xEBFA, 0x81AA, + 0xEBFB, 0x81CC, 0xEBFC, 0x6726, 0xEBFD, 0x81CA, 0xEBFE, 0x81BB, + 0xEC40, 0x9721, 0xEC41, 0x9722, 0xEC42, 0x9723, 0xEC43, 0x9724, + 0xEC44, 0x9725, 0xEC45, 0x9726, 0xEC46, 0x9727, 0xEC47, 0x9728, + 0xEC48, 0x9729, 0xEC49, 0x972B, 0xEC4A, 0x972C, 0xEC4B, 0x972E, + 0xEC4C, 0x972F, 0xEC4D, 0x9731, 0xEC4E, 0x9733, 0xEC4F, 0x9734, + 0xEC50, 0x9735, 0xEC51, 0x9736, 0xEC52, 0x9737, 0xEC53, 0x973A, + 0xEC54, 0x973B, 0xEC55, 0x973C, 0xEC56, 0x973D, 0xEC57, 0x973F, + 0xEC58, 0x9740, 0xEC59, 0x9741, 0xEC5A, 0x9742, 0xEC5B, 0x9743, + 0xEC5C, 0x9744, 0xEC5D, 0x9745, 0xEC5E, 0x9746, 0xEC5F, 0x9747, + 0xEC60, 0x9748, 0xEC61, 0x9749, 0xEC62, 0x974A, 0xEC63, 0x974B, + 0xEC64, 0x974C, 0xEC65, 0x974D, 0xEC66, 0x974E, 0xEC67, 0x974F, + 0xEC68, 0x9750, 0xEC69, 0x9751, 0xEC6A, 0x9754, 0xEC6B, 0x9755, + 0xEC6C, 0x9757, 0xEC6D, 0x9758, 0xEC6E, 0x975A, 0xEC6F, 0x975C, + 0xEC70, 0x975D, 0xEC71, 0x975F, 0xEC72, 0x9763, 0xEC73, 0x9764, + 0xEC74, 0x9766, 0xEC75, 0x9767, 0xEC76, 0x9768, 0xEC77, 0x976A, + 0xEC78, 0x976B, 0xEC79, 0x976C, 0xEC7A, 0x976D, 0xEC7B, 0x976E, + 0xEC7C, 0x976F, 0xEC7D, 0x9770, 0xEC7E, 0x9771, 0xEC80, 0x9772, + 0xEC81, 0x9775, 0xEC82, 0x9777, 0xEC83, 0x9778, 0xEC84, 0x9779, + 0xEC85, 0x977A, 0xEC86, 0x977B, 0xEC87, 0x977D, 0xEC88, 0x977E, + 0xEC89, 0x977F, 0xEC8A, 0x9780, 0xEC8B, 0x9781, 0xEC8C, 0x9782, + 0xEC8D, 0x9783, 0xEC8E, 0x9784, 0xEC8F, 0x9786, 0xEC90, 0x9787, + 0xEC91, 0x9788, 0xEC92, 0x9789, 0xEC93, 0x978A, 0xEC94, 0x978C, + 0xEC95, 0x978E, 0xEC96, 0x978F, 0xEC97, 0x9790, 0xEC98, 0x9793, + 0xEC99, 0x9795, 0xEC9A, 0x9796, 0xEC9B, 0x9797, 0xEC9C, 0x9799, + 0xEC9D, 0x979A, 0xEC9E, 0x979B, 0xEC9F, 0x979C, 0xECA0, 0x979D, + 0xECA1, 0x81C1, 0xECA2, 0x81A6, 0xECA3, 0x6B24, 0xECA4, 0x6B37, + 0xECA5, 0x6B39, 0xECA6, 0x6B43, 0xECA7, 0x6B46, 0xECA8, 0x6B59, + 0xECA9, 0x98D1, 0xECAA, 0x98D2, 0xECAB, 0x98D3, 0xECAC, 0x98D5, + 0xECAD, 0x98D9, 0xECAE, 0x98DA, 0xECAF, 0x6BB3, 0xECB0, 0x5F40, + 0xECB1, 0x6BC2, 0xECB2, 0x89F3, 0xECB3, 0x6590, 0xECB4, 0x9F51, + 0xECB5, 0x6593, 0xECB6, 0x65BC, 0xECB7, 0x65C6, 0xECB8, 0x65C4, + 0xECB9, 0x65C3, 0xECBA, 0x65CC, 0xECBB, 0x65CE, 0xECBC, 0x65D2, + 0xECBD, 0x65D6, 0xECBE, 0x7080, 0xECBF, 0x709C, 0xECC0, 0x7096, + 0xECC1, 0x709D, 0xECC2, 0x70BB, 0xECC3, 0x70C0, 0xECC4, 0x70B7, + 0xECC5, 0x70AB, 0xECC6, 0x70B1, 0xECC7, 0x70E8, 0xECC8, 0x70CA, + 0xECC9, 0x7110, 0xECCA, 0x7113, 0xECCB, 0x7116, 0xECCC, 0x712F, + 0xECCD, 0x7131, 0xECCE, 0x7173, 0xECCF, 0x715C, 0xECD0, 0x7168, + 0xECD1, 0x7145, 0xECD2, 0x7172, 0xECD3, 0x714A, 0xECD4, 0x7178, + 0xECD5, 0x717A, 0xECD6, 0x7198, 0xECD7, 0x71B3, 0xECD8, 0x71B5, + 0xECD9, 0x71A8, 0xECDA, 0x71A0, 0xECDB, 0x71E0, 0xECDC, 0x71D4, + 0xECDD, 0x71E7, 0xECDE, 0x71F9, 0xECDF, 0x721D, 0xECE0, 0x7228, + 0xECE1, 0x706C, 0xECE2, 0x7118, 0xECE3, 0x7166, 0xECE4, 0x71B9, + 0xECE5, 0x623E, 0xECE6, 0x623D, 0xECE7, 0x6243, 0xECE8, 0x6248, + 0xECE9, 0x6249, 0xECEA, 0x793B, 0xECEB, 0x7940, 0xECEC, 0x7946, + 0xECED, 0x7949, 0xECEE, 0x795B, 0xECEF, 0x795C, 0xECF0, 0x7953, + 0xECF1, 0x795A, 0xECF2, 0x7962, 0xECF3, 0x7957, 0xECF4, 0x7960, + 0xECF5, 0x796F, 0xECF6, 0x7967, 0xECF7, 0x797A, 0xECF8, 0x7985, + 0xECF9, 0x798A, 0xECFA, 0x799A, 0xECFB, 0x79A7, 0xECFC, 0x79B3, + 0xECFD, 0x5FD1, 0xECFE, 0x5FD0, 0xED40, 0x979E, 0xED41, 0x979F, + 0xED42, 0x97A1, 0xED43, 0x97A2, 0xED44, 0x97A4, 0xED45, 0x97A5, + 0xED46, 0x97A6, 0xED47, 0x97A7, 0xED48, 0x97A8, 0xED49, 0x97A9, + 0xED4A, 0x97AA, 0xED4B, 0x97AC, 0xED4C, 0x97AE, 0xED4D, 0x97B0, + 0xED4E, 0x97B1, 0xED4F, 0x97B3, 0xED50, 0x97B5, 0xED51, 0x97B6, + 0xED52, 0x97B7, 0xED53, 0x97B8, 0xED54, 0x97B9, 0xED55, 0x97BA, + 0xED56, 0x97BB, 0xED57, 0x97BC, 0xED58, 0x97BD, 0xED59, 0x97BE, + 0xED5A, 0x97BF, 0xED5B, 0x97C0, 0xED5C, 0x97C1, 0xED5D, 0x97C2, + 0xED5E, 0x97C3, 0xED5F, 0x97C4, 0xED60, 0x97C5, 0xED61, 0x97C6, + 0xED62, 0x97C7, 0xED63, 0x97C8, 0xED64, 0x97C9, 0xED65, 0x97CA, + 0xED66, 0x97CB, 0xED67, 0x97CC, 0xED68, 0x97CD, 0xED69, 0x97CE, + 0xED6A, 0x97CF, 0xED6B, 0x97D0, 0xED6C, 0x97D1, 0xED6D, 0x97D2, + 0xED6E, 0x97D3, 0xED6F, 0x97D4, 0xED70, 0x97D5, 0xED71, 0x97D6, + 0xED72, 0x97D7, 0xED73, 0x97D8, 0xED74, 0x97D9, 0xED75, 0x97DA, + 0xED76, 0x97DB, 0xED77, 0x97DC, 0xED78, 0x97DD, 0xED79, 0x97DE, + 0xED7A, 0x97DF, 0xED7B, 0x97E0, 0xED7C, 0x97E1, 0xED7D, 0x97E2, + 0xED7E, 0x97E3, 0xED80, 0x97E4, 0xED81, 0x97E5, 0xED82, 0x97E8, + 0xED83, 0x97EE, 0xED84, 0x97EF, 0xED85, 0x97F0, 0xED86, 0x97F1, + 0xED87, 0x97F2, 0xED88, 0x97F4, 0xED89, 0x97F7, 0xED8A, 0x97F8, + 0xED8B, 0x97F9, 0xED8C, 0x97FA, 0xED8D, 0x97FB, 0xED8E, 0x97FC, + 0xED8F, 0x97FD, 0xED90, 0x97FE, 0xED91, 0x97FF, 0xED92, 0x9800, + 0xED93, 0x9801, 0xED94, 0x9802, 0xED95, 0x9803, 0xED96, 0x9804, + 0xED97, 0x9805, 0xED98, 0x9806, 0xED99, 0x9807, 0xED9A, 0x9808, + 0xED9B, 0x9809, 0xED9C, 0x980A, 0xED9D, 0x980B, 0xED9E, 0x980C, + 0xED9F, 0x980D, 0xEDA0, 0x980E, 0xEDA1, 0x603C, 0xEDA2, 0x605D, + 0xEDA3, 0x605A, 0xEDA4, 0x6067, 0xEDA5, 0x6041, 0xEDA6, 0x6059, + 0xEDA7, 0x6063, 0xEDA8, 0x60AB, 0xEDA9, 0x6106, 0xEDAA, 0x610D, + 0xEDAB, 0x615D, 0xEDAC, 0x61A9, 0xEDAD, 0x619D, 0xEDAE, 0x61CB, + 0xEDAF, 0x61D1, 0xEDB0, 0x6206, 0xEDB1, 0x8080, 0xEDB2, 0x807F, + 0xEDB3, 0x6C93, 0xEDB4, 0x6CF6, 0xEDB5, 0x6DFC, 0xEDB6, 0x77F6, + 0xEDB7, 0x77F8, 0xEDB8, 0x7800, 0xEDB9, 0x7809, 0xEDBA, 0x7817, + 0xEDBB, 0x7818, 0xEDBC, 0x7811, 0xEDBD, 0x65AB, 0xEDBE, 0x782D, + 0xEDBF, 0x781C, 0xEDC0, 0x781D, 0xEDC1, 0x7839, 0xEDC2, 0x783A, + 0xEDC3, 0x783B, 0xEDC4, 0x781F, 0xEDC5, 0x783C, 0xEDC6, 0x7825, + 0xEDC7, 0x782C, 0xEDC8, 0x7823, 0xEDC9, 0x7829, 0xEDCA, 0x784E, + 0xEDCB, 0x786D, 0xEDCC, 0x7856, 0xEDCD, 0x7857, 0xEDCE, 0x7826, + 0xEDCF, 0x7850, 0xEDD0, 0x7847, 0xEDD1, 0x784C, 0xEDD2, 0x786A, + 0xEDD3, 0x789B, 0xEDD4, 0x7893, 0xEDD5, 0x789A, 0xEDD6, 0x7887, + 0xEDD7, 0x789C, 0xEDD8, 0x78A1, 0xEDD9, 0x78A3, 0xEDDA, 0x78B2, + 0xEDDB, 0x78B9, 0xEDDC, 0x78A5, 0xEDDD, 0x78D4, 0xEDDE, 0x78D9, + 0xEDDF, 0x78C9, 0xEDE0, 0x78EC, 0xEDE1, 0x78F2, 0xEDE2, 0x7905, + 0xEDE3, 0x78F4, 0xEDE4, 0x7913, 0xEDE5, 0x7924, 0xEDE6, 0x791E, + 0xEDE7, 0x7934, 0xEDE8, 0x9F9B, 0xEDE9, 0x9EF9, 0xEDEA, 0x9EFB, + 0xEDEB, 0x9EFC, 0xEDEC, 0x76F1, 0xEDED, 0x7704, 0xEDEE, 0x770D, + 0xEDEF, 0x76F9, 0xEDF0, 0x7707, 0xEDF1, 0x7708, 0xEDF2, 0x771A, + 0xEDF3, 0x7722, 0xEDF4, 0x7719, 0xEDF5, 0x772D, 0xEDF6, 0x7726, + 0xEDF7, 0x7735, 0xEDF8, 0x7738, 0xEDF9, 0x7750, 0xEDFA, 0x7751, + 0xEDFB, 0x7747, 0xEDFC, 0x7743, 0xEDFD, 0x775A, 0xEDFE, 0x7768, + 0xEE40, 0x980F, 0xEE41, 0x9810, 0xEE42, 0x9811, 0xEE43, 0x9812, + 0xEE44, 0x9813, 0xEE45, 0x9814, 0xEE46, 0x9815, 0xEE47, 0x9816, + 0xEE48, 0x9817, 0xEE49, 0x9818, 0xEE4A, 0x9819, 0xEE4B, 0x981A, + 0xEE4C, 0x981B, 0xEE4D, 0x981C, 0xEE4E, 0x981D, 0xEE4F, 0x981E, + 0xEE50, 0x981F, 0xEE51, 0x9820, 0xEE52, 0x9821, 0xEE53, 0x9822, + 0xEE54, 0x9823, 0xEE55, 0x9824, 0xEE56, 0x9825, 0xEE57, 0x9826, + 0xEE58, 0x9827, 0xEE59, 0x9828, 0xEE5A, 0x9829, 0xEE5B, 0x982A, + 0xEE5C, 0x982B, 0xEE5D, 0x982C, 0xEE5E, 0x982D, 0xEE5F, 0x982E, + 0xEE60, 0x982F, 0xEE61, 0x9830, 0xEE62, 0x9831, 0xEE63, 0x9832, + 0xEE64, 0x9833, 0xEE65, 0x9834, 0xEE66, 0x9835, 0xEE67, 0x9836, + 0xEE68, 0x9837, 0xEE69, 0x9838, 0xEE6A, 0x9839, 0xEE6B, 0x983A, + 0xEE6C, 0x983B, 0xEE6D, 0x983C, 0xEE6E, 0x983D, 0xEE6F, 0x983E, + 0xEE70, 0x983F, 0xEE71, 0x9840, 0xEE72, 0x9841, 0xEE73, 0x9842, + 0xEE74, 0x9843, 0xEE75, 0x9844, 0xEE76, 0x9845, 0xEE77, 0x9846, + 0xEE78, 0x9847, 0xEE79, 0x9848, 0xEE7A, 0x9849, 0xEE7B, 0x984A, + 0xEE7C, 0x984B, 0xEE7D, 0x984C, 0xEE7E, 0x984D, 0xEE80, 0x984E, + 0xEE81, 0x984F, 0xEE82, 0x9850, 0xEE83, 0x9851, 0xEE84, 0x9852, + 0xEE85, 0x9853, 0xEE86, 0x9854, 0xEE87, 0x9855, 0xEE88, 0x9856, + 0xEE89, 0x9857, 0xEE8A, 0x9858, 0xEE8B, 0x9859, 0xEE8C, 0x985A, + 0xEE8D, 0x985B, 0xEE8E, 0x985C, 0xEE8F, 0x985D, 0xEE90, 0x985E, + 0xEE91, 0x985F, 0xEE92, 0x9860, 0xEE93, 0x9861, 0xEE94, 0x9862, + 0xEE95, 0x9863, 0xEE96, 0x9864, 0xEE97, 0x9865, 0xEE98, 0x9866, + 0xEE99, 0x9867, 0xEE9A, 0x9868, 0xEE9B, 0x9869, 0xEE9C, 0x986A, + 0xEE9D, 0x986B, 0xEE9E, 0x986C, 0xEE9F, 0x986D, 0xEEA0, 0x986E, + 0xEEA1, 0x7762, 0xEEA2, 0x7765, 0xEEA3, 0x777F, 0xEEA4, 0x778D, + 0xEEA5, 0x777D, 0xEEA6, 0x7780, 0xEEA7, 0x778C, 0xEEA8, 0x7791, + 0xEEA9, 0x779F, 0xEEAA, 0x77A0, 0xEEAB, 0x77B0, 0xEEAC, 0x77B5, + 0xEEAD, 0x77BD, 0xEEAE, 0x753A, 0xEEAF, 0x7540, 0xEEB0, 0x754E, + 0xEEB1, 0x754B, 0xEEB2, 0x7548, 0xEEB3, 0x755B, 0xEEB4, 0x7572, + 0xEEB5, 0x7579, 0xEEB6, 0x7583, 0xEEB7, 0x7F58, 0xEEB8, 0x7F61, + 0xEEB9, 0x7F5F, 0xEEBA, 0x8A48, 0xEEBB, 0x7F68, 0xEEBC, 0x7F74, + 0xEEBD, 0x7F71, 0xEEBE, 0x7F79, 0xEEBF, 0x7F81, 0xEEC0, 0x7F7E, + 0xEEC1, 0x76CD, 0xEEC2, 0x76E5, 0xEEC3, 0x8832, 0xEEC4, 0x9485, + 0xEEC5, 0x9486, 0xEEC6, 0x9487, 0xEEC7, 0x948B, 0xEEC8, 0x948A, + 0xEEC9, 0x948C, 0xEECA, 0x948D, 0xEECB, 0x948F, 0xEECC, 0x9490, + 0xEECD, 0x9494, 0xEECE, 0x9497, 0xEECF, 0x9495, 0xEED0, 0x949A, + 0xEED1, 0x949B, 0xEED2, 0x949C, 0xEED3, 0x94A3, 0xEED4, 0x94A4, + 0xEED5, 0x94AB, 0xEED6, 0x94AA, 0xEED7, 0x94AD, 0xEED8, 0x94AC, + 0xEED9, 0x94AF, 0xEEDA, 0x94B0, 0xEEDB, 0x94B2, 0xEEDC, 0x94B4, + 0xEEDD, 0x94B6, 0xEEDE, 0x94B7, 0xEEDF, 0x94B8, 0xEEE0, 0x94B9, + 0xEEE1, 0x94BA, 0xEEE2, 0x94BC, 0xEEE3, 0x94BD, 0xEEE4, 0x94BF, + 0xEEE5, 0x94C4, 0xEEE6, 0x94C8, 0xEEE7, 0x94C9, 0xEEE8, 0x94CA, + 0xEEE9, 0x94CB, 0xEEEA, 0x94CC, 0xEEEB, 0x94CD, 0xEEEC, 0x94CE, + 0xEEED, 0x94D0, 0xEEEE, 0x94D1, 0xEEEF, 0x94D2, 0xEEF0, 0x94D5, + 0xEEF1, 0x94D6, 0xEEF2, 0x94D7, 0xEEF3, 0x94D9, 0xEEF4, 0x94D8, + 0xEEF5, 0x94DB, 0xEEF6, 0x94DE, 0xEEF7, 0x94DF, 0xEEF8, 0x94E0, + 0xEEF9, 0x94E2, 0xEEFA, 0x94E4, 0xEEFB, 0x94E5, 0xEEFC, 0x94E7, + 0xEEFD, 0x94E8, 0xEEFE, 0x94EA, 0xEF40, 0x986F, 0xEF41, 0x9870, + 0xEF42, 0x9871, 0xEF43, 0x9872, 0xEF44, 0x9873, 0xEF45, 0x9874, + 0xEF46, 0x988B, 0xEF47, 0x988E, 0xEF48, 0x9892, 0xEF49, 0x9895, + 0xEF4A, 0x9899, 0xEF4B, 0x98A3, 0xEF4C, 0x98A8, 0xEF4D, 0x98A9, + 0xEF4E, 0x98AA, 0xEF4F, 0x98AB, 0xEF50, 0x98AC, 0xEF51, 0x98AD, + 0xEF52, 0x98AE, 0xEF53, 0x98AF, 0xEF54, 0x98B0, 0xEF55, 0x98B1, + 0xEF56, 0x98B2, 0xEF57, 0x98B3, 0xEF58, 0x98B4, 0xEF59, 0x98B5, + 0xEF5A, 0x98B6, 0xEF5B, 0x98B7, 0xEF5C, 0x98B8, 0xEF5D, 0x98B9, + 0xEF5E, 0x98BA, 0xEF5F, 0x98BB, 0xEF60, 0x98BC, 0xEF61, 0x98BD, + 0xEF62, 0x98BE, 0xEF63, 0x98BF, 0xEF64, 0x98C0, 0xEF65, 0x98C1, + 0xEF66, 0x98C2, 0xEF67, 0x98C3, 0xEF68, 0x98C4, 0xEF69, 0x98C5, + 0xEF6A, 0x98C6, 0xEF6B, 0x98C7, 0xEF6C, 0x98C8, 0xEF6D, 0x98C9, + 0xEF6E, 0x98CA, 0xEF6F, 0x98CB, 0xEF70, 0x98CC, 0xEF71, 0x98CD, + 0xEF72, 0x98CF, 0xEF73, 0x98D0, 0xEF74, 0x98D4, 0xEF75, 0x98D6, + 0xEF76, 0x98D7, 0xEF77, 0x98DB, 0xEF78, 0x98DC, 0xEF79, 0x98DD, + 0xEF7A, 0x98E0, 0xEF7B, 0x98E1, 0xEF7C, 0x98E2, 0xEF7D, 0x98E3, + 0xEF7E, 0x98E4, 0xEF80, 0x98E5, 0xEF81, 0x98E6, 0xEF82, 0x98E9, + 0xEF83, 0x98EA, 0xEF84, 0x98EB, 0xEF85, 0x98EC, 0xEF86, 0x98ED, + 0xEF87, 0x98EE, 0xEF88, 0x98EF, 0xEF89, 0x98F0, 0xEF8A, 0x98F1, + 0xEF8B, 0x98F2, 0xEF8C, 0x98F3, 0xEF8D, 0x98F4, 0xEF8E, 0x98F5, + 0xEF8F, 0x98F6, 0xEF90, 0x98F7, 0xEF91, 0x98F8, 0xEF92, 0x98F9, + 0xEF93, 0x98FA, 0xEF94, 0x98FB, 0xEF95, 0x98FC, 0xEF96, 0x98FD, + 0xEF97, 0x98FE, 0xEF98, 0x98FF, 0xEF99, 0x9900, 0xEF9A, 0x9901, + 0xEF9B, 0x9902, 0xEF9C, 0x9903, 0xEF9D, 0x9904, 0xEF9E, 0x9905, + 0xEF9F, 0x9906, 0xEFA0, 0x9907, 0xEFA1, 0x94E9, 0xEFA2, 0x94EB, + 0xEFA3, 0x94EE, 0xEFA4, 0x94EF, 0xEFA5, 0x94F3, 0xEFA6, 0x94F4, + 0xEFA7, 0x94F5, 0xEFA8, 0x94F7, 0xEFA9, 0x94F9, 0xEFAA, 0x94FC, + 0xEFAB, 0x94FD, 0xEFAC, 0x94FF, 0xEFAD, 0x9503, 0xEFAE, 0x9502, + 0xEFAF, 0x9506, 0xEFB0, 0x9507, 0xEFB1, 0x9509, 0xEFB2, 0x950A, + 0xEFB3, 0x950D, 0xEFB4, 0x950E, 0xEFB5, 0x950F, 0xEFB6, 0x9512, + 0xEFB7, 0x9513, 0xEFB8, 0x9514, 0xEFB9, 0x9515, 0xEFBA, 0x9516, + 0xEFBB, 0x9518, 0xEFBC, 0x951B, 0xEFBD, 0x951D, 0xEFBE, 0x951E, + 0xEFBF, 0x951F, 0xEFC0, 0x9522, 0xEFC1, 0x952A, 0xEFC2, 0x952B, + 0xEFC3, 0x9529, 0xEFC4, 0x952C, 0xEFC5, 0x9531, 0xEFC6, 0x9532, + 0xEFC7, 0x9534, 0xEFC8, 0x9536, 0xEFC9, 0x9537, 0xEFCA, 0x9538, + 0xEFCB, 0x953C, 0xEFCC, 0x953E, 0xEFCD, 0x953F, 0xEFCE, 0x9542, + 0xEFCF, 0x9535, 0xEFD0, 0x9544, 0xEFD1, 0x9545, 0xEFD2, 0x9546, + 0xEFD3, 0x9549, 0xEFD4, 0x954C, 0xEFD5, 0x954E, 0xEFD6, 0x954F, + 0xEFD7, 0x9552, 0xEFD8, 0x9553, 0xEFD9, 0x9554, 0xEFDA, 0x9556, + 0xEFDB, 0x9557, 0xEFDC, 0x9558, 0xEFDD, 0x9559, 0xEFDE, 0x955B, + 0xEFDF, 0x955E, 0xEFE0, 0x955F, 0xEFE1, 0x955D, 0xEFE2, 0x9561, + 0xEFE3, 0x9562, 0xEFE4, 0x9564, 0xEFE5, 0x9565, 0xEFE6, 0x9566, + 0xEFE7, 0x9567, 0xEFE8, 0x9568, 0xEFE9, 0x9569, 0xEFEA, 0x956A, + 0xEFEB, 0x956B, 0xEFEC, 0x956C, 0xEFED, 0x956F, 0xEFEE, 0x9571, + 0xEFEF, 0x9572, 0xEFF0, 0x9573, 0xEFF1, 0x953A, 0xEFF2, 0x77E7, + 0xEFF3, 0x77EC, 0xEFF4, 0x96C9, 0xEFF5, 0x79D5, 0xEFF6, 0x79ED, + 0xEFF7, 0x79E3, 0xEFF8, 0x79EB, 0xEFF9, 0x7A06, 0xEFFA, 0x5D47, + 0xEFFB, 0x7A03, 0xEFFC, 0x7A02, 0xEFFD, 0x7A1E, 0xEFFE, 0x7A14, + 0xF040, 0x9908, 0xF041, 0x9909, 0xF042, 0x990A, 0xF043, 0x990B, + 0xF044, 0x990C, 0xF045, 0x990E, 0xF046, 0x990F, 0xF047, 0x9911, + 0xF048, 0x9912, 0xF049, 0x9913, 0xF04A, 0x9914, 0xF04B, 0x9915, + 0xF04C, 0x9916, 0xF04D, 0x9917, 0xF04E, 0x9918, 0xF04F, 0x9919, + 0xF050, 0x991A, 0xF051, 0x991B, 0xF052, 0x991C, 0xF053, 0x991D, + 0xF054, 0x991E, 0xF055, 0x991F, 0xF056, 0x9920, 0xF057, 0x9921, + 0xF058, 0x9922, 0xF059, 0x9923, 0xF05A, 0x9924, 0xF05B, 0x9925, + 0xF05C, 0x9926, 0xF05D, 0x9927, 0xF05E, 0x9928, 0xF05F, 0x9929, + 0xF060, 0x992A, 0xF061, 0x992B, 0xF062, 0x992C, 0xF063, 0x992D, + 0xF064, 0x992F, 0xF065, 0x9930, 0xF066, 0x9931, 0xF067, 0x9932, + 0xF068, 0x9933, 0xF069, 0x9934, 0xF06A, 0x9935, 0xF06B, 0x9936, + 0xF06C, 0x9937, 0xF06D, 0x9938, 0xF06E, 0x9939, 0xF06F, 0x993A, + 0xF070, 0x993B, 0xF071, 0x993C, 0xF072, 0x993D, 0xF073, 0x993E, + 0xF074, 0x993F, 0xF075, 0x9940, 0xF076, 0x9941, 0xF077, 0x9942, + 0xF078, 0x9943, 0xF079, 0x9944, 0xF07A, 0x9945, 0xF07B, 0x9946, + 0xF07C, 0x9947, 0xF07D, 0x9948, 0xF07E, 0x9949, 0xF080, 0x994A, + 0xF081, 0x994B, 0xF082, 0x994C, 0xF083, 0x994D, 0xF084, 0x994E, + 0xF085, 0x994F, 0xF086, 0x9950, 0xF087, 0x9951, 0xF088, 0x9952, + 0xF089, 0x9953, 0xF08A, 0x9956, 0xF08B, 0x9957, 0xF08C, 0x9958, + 0xF08D, 0x9959, 0xF08E, 0x995A, 0xF08F, 0x995B, 0xF090, 0x995C, + 0xF091, 0x995D, 0xF092, 0x995E, 0xF093, 0x995F, 0xF094, 0x9960, + 0xF095, 0x9961, 0xF096, 0x9962, 0xF097, 0x9964, 0xF098, 0x9966, + 0xF099, 0x9973, 0xF09A, 0x9978, 0xF09B, 0x9979, 0xF09C, 0x997B, + 0xF09D, 0x997E, 0xF09E, 0x9982, 0xF09F, 0x9983, 0xF0A0, 0x9989, + 0xF0A1, 0x7A39, 0xF0A2, 0x7A37, 0xF0A3, 0x7A51, 0xF0A4, 0x9ECF, + 0xF0A5, 0x99A5, 0xF0A6, 0x7A70, 0xF0A7, 0x7688, 0xF0A8, 0x768E, + 0xF0A9, 0x7693, 0xF0AA, 0x7699, 0xF0AB, 0x76A4, 0xF0AC, 0x74DE, + 0xF0AD, 0x74E0, 0xF0AE, 0x752C, 0xF0AF, 0x9E20, 0xF0B0, 0x9E22, + 0xF0B1, 0x9E28, 0xF0B2, 0x9E29, 0xF0B3, 0x9E2A, 0xF0B4, 0x9E2B, + 0xF0B5, 0x9E2C, 0xF0B6, 0x9E32, 0xF0B7, 0x9E31, 0xF0B8, 0x9E36, + 0xF0B9, 0x9E38, 0xF0BA, 0x9E37, 0xF0BB, 0x9E39, 0xF0BC, 0x9E3A, + 0xF0BD, 0x9E3E, 0xF0BE, 0x9E41, 0xF0BF, 0x9E42, 0xF0C0, 0x9E44, + 0xF0C1, 0x9E46, 0xF0C2, 0x9E47, 0xF0C3, 0x9E48, 0xF0C4, 0x9E49, + 0xF0C5, 0x9E4B, 0xF0C6, 0x9E4C, 0xF0C7, 0x9E4E, 0xF0C8, 0x9E51, + 0xF0C9, 0x9E55, 0xF0CA, 0x9E57, 0xF0CB, 0x9E5A, 0xF0CC, 0x9E5B, + 0xF0CD, 0x9E5C, 0xF0CE, 0x9E5E, 0xF0CF, 0x9E63, 0xF0D0, 0x9E66, + 0xF0D1, 0x9E67, 0xF0D2, 0x9E68, 0xF0D3, 0x9E69, 0xF0D4, 0x9E6A, + 0xF0D5, 0x9E6B, 0xF0D6, 0x9E6C, 0xF0D7, 0x9E71, 0xF0D8, 0x9E6D, + 0xF0D9, 0x9E73, 0xF0DA, 0x7592, 0xF0DB, 0x7594, 0xF0DC, 0x7596, + 0xF0DD, 0x75A0, 0xF0DE, 0x759D, 0xF0DF, 0x75AC, 0xF0E0, 0x75A3, + 0xF0E1, 0x75B3, 0xF0E2, 0x75B4, 0xF0E3, 0x75B8, 0xF0E4, 0x75C4, + 0xF0E5, 0x75B1, 0xF0E6, 0x75B0, 0xF0E7, 0x75C3, 0xF0E8, 0x75C2, + 0xF0E9, 0x75D6, 0xF0EA, 0x75CD, 0xF0EB, 0x75E3, 0xF0EC, 0x75E8, + 0xF0ED, 0x75E6, 0xF0EE, 0x75E4, 0xF0EF, 0x75EB, 0xF0F0, 0x75E7, + 0xF0F1, 0x7603, 0xF0F2, 0x75F1, 0xF0F3, 0x75FC, 0xF0F4, 0x75FF, + 0xF0F5, 0x7610, 0xF0F6, 0x7600, 0xF0F7, 0x7605, 0xF0F8, 0x760C, + 0xF0F9, 0x7617, 0xF0FA, 0x760A, 0xF0FB, 0x7625, 0xF0FC, 0x7618, + 0xF0FD, 0x7615, 0xF0FE, 0x7619, 0xF140, 0x998C, 0xF141, 0x998E, + 0xF142, 0x999A, 0xF143, 0x999B, 0xF144, 0x999C, 0xF145, 0x999D, + 0xF146, 0x999E, 0xF147, 0x999F, 0xF148, 0x99A0, 0xF149, 0x99A1, + 0xF14A, 0x99A2, 0xF14B, 0x99A3, 0xF14C, 0x99A4, 0xF14D, 0x99A6, + 0xF14E, 0x99A7, 0xF14F, 0x99A9, 0xF150, 0x99AA, 0xF151, 0x99AB, + 0xF152, 0x99AC, 0xF153, 0x99AD, 0xF154, 0x99AE, 0xF155, 0x99AF, + 0xF156, 0x99B0, 0xF157, 0x99B1, 0xF158, 0x99B2, 0xF159, 0x99B3, + 0xF15A, 0x99B4, 0xF15B, 0x99B5, 0xF15C, 0x99B6, 0xF15D, 0x99B7, + 0xF15E, 0x99B8, 0xF15F, 0x99B9, 0xF160, 0x99BA, 0xF161, 0x99BB, + 0xF162, 0x99BC, 0xF163, 0x99BD, 0xF164, 0x99BE, 0xF165, 0x99BF, + 0xF166, 0x99C0, 0xF167, 0x99C1, 0xF168, 0x99C2, 0xF169, 0x99C3, + 0xF16A, 0x99C4, 0xF16B, 0x99C5, 0xF16C, 0x99C6, 0xF16D, 0x99C7, + 0xF16E, 0x99C8, 0xF16F, 0x99C9, 0xF170, 0x99CA, 0xF171, 0x99CB, + 0xF172, 0x99CC, 0xF173, 0x99CD, 0xF174, 0x99CE, 0xF175, 0x99CF, + 0xF176, 0x99D0, 0xF177, 0x99D1, 0xF178, 0x99D2, 0xF179, 0x99D3, + 0xF17A, 0x99D4, 0xF17B, 0x99D5, 0xF17C, 0x99D6, 0xF17D, 0x99D7, + 0xF17E, 0x99D8, 0xF180, 0x99D9, 0xF181, 0x99DA, 0xF182, 0x99DB, + 0xF183, 0x99DC, 0xF184, 0x99DD, 0xF185, 0x99DE, 0xF186, 0x99DF, + 0xF187, 0x99E0, 0xF188, 0x99E1, 0xF189, 0x99E2, 0xF18A, 0x99E3, + 0xF18B, 0x99E4, 0xF18C, 0x99E5, 0xF18D, 0x99E6, 0xF18E, 0x99E7, + 0xF18F, 0x99E8, 0xF190, 0x99E9, 0xF191, 0x99EA, 0xF192, 0x99EB, + 0xF193, 0x99EC, 0xF194, 0x99ED, 0xF195, 0x99EE, 0xF196, 0x99EF, + 0xF197, 0x99F0, 0xF198, 0x99F1, 0xF199, 0x99F2, 0xF19A, 0x99F3, + 0xF19B, 0x99F4, 0xF19C, 0x99F5, 0xF19D, 0x99F6, 0xF19E, 0x99F7, + 0xF19F, 0x99F8, 0xF1A0, 0x99F9, 0xF1A1, 0x761B, 0xF1A2, 0x763C, + 0xF1A3, 0x7622, 0xF1A4, 0x7620, 0xF1A5, 0x7640, 0xF1A6, 0x762D, + 0xF1A7, 0x7630, 0xF1A8, 0x763F, 0xF1A9, 0x7635, 0xF1AA, 0x7643, + 0xF1AB, 0x763E, 0xF1AC, 0x7633, 0xF1AD, 0x764D, 0xF1AE, 0x765E, + 0xF1AF, 0x7654, 0xF1B0, 0x765C, 0xF1B1, 0x7656, 0xF1B2, 0x766B, + 0xF1B3, 0x766F, 0xF1B4, 0x7FCA, 0xF1B5, 0x7AE6, 0xF1B6, 0x7A78, + 0xF1B7, 0x7A79, 0xF1B8, 0x7A80, 0xF1B9, 0x7A86, 0xF1BA, 0x7A88, + 0xF1BB, 0x7A95, 0xF1BC, 0x7AA6, 0xF1BD, 0x7AA0, 0xF1BE, 0x7AAC, + 0xF1BF, 0x7AA8, 0xF1C0, 0x7AAD, 0xF1C1, 0x7AB3, 0xF1C2, 0x8864, + 0xF1C3, 0x8869, 0xF1C4, 0x8872, 0xF1C5, 0x887D, 0xF1C6, 0x887F, + 0xF1C7, 0x8882, 0xF1C8, 0x88A2, 0xF1C9, 0x88C6, 0xF1CA, 0x88B7, + 0xF1CB, 0x88BC, 0xF1CC, 0x88C9, 0xF1CD, 0x88E2, 0xF1CE, 0x88CE, + 0xF1CF, 0x88E3, 0xF1D0, 0x88E5, 0xF1D1, 0x88F1, 0xF1D2, 0x891A, + 0xF1D3, 0x88FC, 0xF1D4, 0x88E8, 0xF1D5, 0x88FE, 0xF1D6, 0x88F0, + 0xF1D7, 0x8921, 0xF1D8, 0x8919, 0xF1D9, 0x8913, 0xF1DA, 0x891B, + 0xF1DB, 0x890A, 0xF1DC, 0x8934, 0xF1DD, 0x892B, 0xF1DE, 0x8936, + 0xF1DF, 0x8941, 0xF1E0, 0x8966, 0xF1E1, 0x897B, 0xF1E2, 0x758B, + 0xF1E3, 0x80E5, 0xF1E4, 0x76B2, 0xF1E5, 0x76B4, 0xF1E6, 0x77DC, + 0xF1E7, 0x8012, 0xF1E8, 0x8014, 0xF1E9, 0x8016, 0xF1EA, 0x801C, + 0xF1EB, 0x8020, 0xF1EC, 0x8022, 0xF1ED, 0x8025, 0xF1EE, 0x8026, + 0xF1EF, 0x8027, 0xF1F0, 0x8029, 0xF1F1, 0x8028, 0xF1F2, 0x8031, + 0xF1F3, 0x800B, 0xF1F4, 0x8035, 0xF1F5, 0x8043, 0xF1F6, 0x8046, + 0xF1F7, 0x804D, 0xF1F8, 0x8052, 0xF1F9, 0x8069, 0xF1FA, 0x8071, + 0xF1FB, 0x8983, 0xF1FC, 0x9878, 0xF1FD, 0x9880, 0xF1FE, 0x9883, + 0xF240, 0x99FA, 0xF241, 0x99FB, 0xF242, 0x99FC, 0xF243, 0x99FD, + 0xF244, 0x99FE, 0xF245, 0x99FF, 0xF246, 0x9A00, 0xF247, 0x9A01, + 0xF248, 0x9A02, 0xF249, 0x9A03, 0xF24A, 0x9A04, 0xF24B, 0x9A05, + 0xF24C, 0x9A06, 0xF24D, 0x9A07, 0xF24E, 0x9A08, 0xF24F, 0x9A09, + 0xF250, 0x9A0A, 0xF251, 0x9A0B, 0xF252, 0x9A0C, 0xF253, 0x9A0D, + 0xF254, 0x9A0E, 0xF255, 0x9A0F, 0xF256, 0x9A10, 0xF257, 0x9A11, + 0xF258, 0x9A12, 0xF259, 0x9A13, 0xF25A, 0x9A14, 0xF25B, 0x9A15, + 0xF25C, 0x9A16, 0xF25D, 0x9A17, 0xF25E, 0x9A18, 0xF25F, 0x9A19, + 0xF260, 0x9A1A, 0xF261, 0x9A1B, 0xF262, 0x9A1C, 0xF263, 0x9A1D, + 0xF264, 0x9A1E, 0xF265, 0x9A1F, 0xF266, 0x9A20, 0xF267, 0x9A21, + 0xF268, 0x9A22, 0xF269, 0x9A23, 0xF26A, 0x9A24, 0xF26B, 0x9A25, + 0xF26C, 0x9A26, 0xF26D, 0x9A27, 0xF26E, 0x9A28, 0xF26F, 0x9A29, + 0xF270, 0x9A2A, 0xF271, 0x9A2B, 0xF272, 0x9A2C, 0xF273, 0x9A2D, + 0xF274, 0x9A2E, 0xF275, 0x9A2F, 0xF276, 0x9A30, 0xF277, 0x9A31, + 0xF278, 0x9A32, 0xF279, 0x9A33, 0xF27A, 0x9A34, 0xF27B, 0x9A35, + 0xF27C, 0x9A36, 0xF27D, 0x9A37, 0xF27E, 0x9A38, 0xF280, 0x9A39, + 0xF281, 0x9A3A, 0xF282, 0x9A3B, 0xF283, 0x9A3C, 0xF284, 0x9A3D, + 0xF285, 0x9A3E, 0xF286, 0x9A3F, 0xF287, 0x9A40, 0xF288, 0x9A41, + 0xF289, 0x9A42, 0xF28A, 0x9A43, 0xF28B, 0x9A44, 0xF28C, 0x9A45, + 0xF28D, 0x9A46, 0xF28E, 0x9A47, 0xF28F, 0x9A48, 0xF290, 0x9A49, + 0xF291, 0x9A4A, 0xF292, 0x9A4B, 0xF293, 0x9A4C, 0xF294, 0x9A4D, + 0xF295, 0x9A4E, 0xF296, 0x9A4F, 0xF297, 0x9A50, 0xF298, 0x9A51, + 0xF299, 0x9A52, 0xF29A, 0x9A53, 0xF29B, 0x9A54, 0xF29C, 0x9A55, + 0xF29D, 0x9A56, 0xF29E, 0x9A57, 0xF29F, 0x9A58, 0xF2A0, 0x9A59, + 0xF2A1, 0x9889, 0xF2A2, 0x988C, 0xF2A3, 0x988D, 0xF2A4, 0x988F, + 0xF2A5, 0x9894, 0xF2A6, 0x989A, 0xF2A7, 0x989B, 0xF2A8, 0x989E, + 0xF2A9, 0x989F, 0xF2AA, 0x98A1, 0xF2AB, 0x98A2, 0xF2AC, 0x98A5, + 0xF2AD, 0x98A6, 0xF2AE, 0x864D, 0xF2AF, 0x8654, 0xF2B0, 0x866C, + 0xF2B1, 0x866E, 0xF2B2, 0x867F, 0xF2B3, 0x867A, 0xF2B4, 0x867C, + 0xF2B5, 0x867B, 0xF2B6, 0x86A8, 0xF2B7, 0x868D, 0xF2B8, 0x868B, + 0xF2B9, 0x86AC, 0xF2BA, 0x869D, 0xF2BB, 0x86A7, 0xF2BC, 0x86A3, + 0xF2BD, 0x86AA, 0xF2BE, 0x8693, 0xF2BF, 0x86A9, 0xF2C0, 0x86B6, + 0xF2C1, 0x86C4, 0xF2C2, 0x86B5, 0xF2C3, 0x86CE, 0xF2C4, 0x86B0, + 0xF2C5, 0x86BA, 0xF2C6, 0x86B1, 0xF2C7, 0x86AF, 0xF2C8, 0x86C9, + 0xF2C9, 0x86CF, 0xF2CA, 0x86B4, 0xF2CB, 0x86E9, 0xF2CC, 0x86F1, + 0xF2CD, 0x86F2, 0xF2CE, 0x86ED, 0xF2CF, 0x86F3, 0xF2D0, 0x86D0, + 0xF2D1, 0x8713, 0xF2D2, 0x86DE, 0xF2D3, 0x86F4, 0xF2D4, 0x86DF, + 0xF2D5, 0x86D8, 0xF2D6, 0x86D1, 0xF2D7, 0x8703, 0xF2D8, 0x8707, + 0xF2D9, 0x86F8, 0xF2DA, 0x8708, 0xF2DB, 0x870A, 0xF2DC, 0x870D, + 0xF2DD, 0x8709, 0xF2DE, 0x8723, 0xF2DF, 0x873B, 0xF2E0, 0x871E, + 0xF2E1, 0x8725, 0xF2E2, 0x872E, 0xF2E3, 0x871A, 0xF2E4, 0x873E, + 0xF2E5, 0x8748, 0xF2E6, 0x8734, 0xF2E7, 0x8731, 0xF2E8, 0x8729, + 0xF2E9, 0x8737, 0xF2EA, 0x873F, 0xF2EB, 0x8782, 0xF2EC, 0x8722, + 0xF2ED, 0x877D, 0xF2EE, 0x877E, 0xF2EF, 0x877B, 0xF2F0, 0x8760, + 0xF2F1, 0x8770, 0xF2F2, 0x874C, 0xF2F3, 0x876E, 0xF2F4, 0x878B, + 0xF2F5, 0x8753, 0xF2F6, 0x8763, 0xF2F7, 0x877C, 0xF2F8, 0x8764, + 0xF2F9, 0x8759, 0xF2FA, 0x8765, 0xF2FB, 0x8793, 0xF2FC, 0x87AF, + 0xF2FD, 0x87A8, 0xF2FE, 0x87D2, 0xF340, 0x9A5A, 0xF341, 0x9A5B, + 0xF342, 0x9A5C, 0xF343, 0x9A5D, 0xF344, 0x9A5E, 0xF345, 0x9A5F, + 0xF346, 0x9A60, 0xF347, 0x9A61, 0xF348, 0x9A62, 0xF349, 0x9A63, + 0xF34A, 0x9A64, 0xF34B, 0x9A65, 0xF34C, 0x9A66, 0xF34D, 0x9A67, + 0xF34E, 0x9A68, 0xF34F, 0x9A69, 0xF350, 0x9A6A, 0xF351, 0x9A6B, + 0xF352, 0x9A72, 0xF353, 0x9A83, 0xF354, 0x9A89, 0xF355, 0x9A8D, + 0xF356, 0x9A8E, 0xF357, 0x9A94, 0xF358, 0x9A95, 0xF359, 0x9A99, + 0xF35A, 0x9AA6, 0xF35B, 0x9AA9, 0xF35C, 0x9AAA, 0xF35D, 0x9AAB, + 0xF35E, 0x9AAC, 0xF35F, 0x9AAD, 0xF360, 0x9AAE, 0xF361, 0x9AAF, + 0xF362, 0x9AB2, 0xF363, 0x9AB3, 0xF364, 0x9AB4, 0xF365, 0x9AB5, + 0xF366, 0x9AB9, 0xF367, 0x9ABB, 0xF368, 0x9ABD, 0xF369, 0x9ABE, + 0xF36A, 0x9ABF, 0xF36B, 0x9AC3, 0xF36C, 0x9AC4, 0xF36D, 0x9AC6, + 0xF36E, 0x9AC7, 0xF36F, 0x9AC8, 0xF370, 0x9AC9, 0xF371, 0x9ACA, + 0xF372, 0x9ACD, 0xF373, 0x9ACE, 0xF374, 0x9ACF, 0xF375, 0x9AD0, + 0xF376, 0x9AD2, 0xF377, 0x9AD4, 0xF378, 0x9AD5, 0xF379, 0x9AD6, + 0xF37A, 0x9AD7, 0xF37B, 0x9AD9, 0xF37C, 0x9ADA, 0xF37D, 0x9ADB, + 0xF37E, 0x9ADC, 0xF380, 0x9ADD, 0xF381, 0x9ADE, 0xF382, 0x9AE0, + 0xF383, 0x9AE2, 0xF384, 0x9AE3, 0xF385, 0x9AE4, 0xF386, 0x9AE5, + 0xF387, 0x9AE7, 0xF388, 0x9AE8, 0xF389, 0x9AE9, 0xF38A, 0x9AEA, + 0xF38B, 0x9AEC, 0xF38C, 0x9AEE, 0xF38D, 0x9AF0, 0xF38E, 0x9AF1, + 0xF38F, 0x9AF2, 0xF390, 0x9AF3, 0xF391, 0x9AF4, 0xF392, 0x9AF5, + 0xF393, 0x9AF6, 0xF394, 0x9AF7, 0xF395, 0x9AF8, 0xF396, 0x9AFA, + 0xF397, 0x9AFC, 0xF398, 0x9AFD, 0xF399, 0x9AFE, 0xF39A, 0x9AFF, + 0xF39B, 0x9B00, 0xF39C, 0x9B01, 0xF39D, 0x9B02, 0xF39E, 0x9B04, + 0xF39F, 0x9B05, 0xF3A0, 0x9B06, 0xF3A1, 0x87C6, 0xF3A2, 0x8788, + 0xF3A3, 0x8785, 0xF3A4, 0x87AD, 0xF3A5, 0x8797, 0xF3A6, 0x8783, + 0xF3A7, 0x87AB, 0xF3A8, 0x87E5, 0xF3A9, 0x87AC, 0xF3AA, 0x87B5, + 0xF3AB, 0x87B3, 0xF3AC, 0x87CB, 0xF3AD, 0x87D3, 0xF3AE, 0x87BD, + 0xF3AF, 0x87D1, 0xF3B0, 0x87C0, 0xF3B1, 0x87CA, 0xF3B2, 0x87DB, + 0xF3B3, 0x87EA, 0xF3B4, 0x87E0, 0xF3B5, 0x87EE, 0xF3B6, 0x8816, + 0xF3B7, 0x8813, 0xF3B8, 0x87FE, 0xF3B9, 0x880A, 0xF3BA, 0x881B, + 0xF3BB, 0x8821, 0xF3BC, 0x8839, 0xF3BD, 0x883C, 0xF3BE, 0x7F36, + 0xF3BF, 0x7F42, 0xF3C0, 0x7F44, 0xF3C1, 0x7F45, 0xF3C2, 0x8210, + 0xF3C3, 0x7AFA, 0xF3C4, 0x7AFD, 0xF3C5, 0x7B08, 0xF3C6, 0x7B03, + 0xF3C7, 0x7B04, 0xF3C8, 0x7B15, 0xF3C9, 0x7B0A, 0xF3CA, 0x7B2B, + 0xF3CB, 0x7B0F, 0xF3CC, 0x7B47, 0xF3CD, 0x7B38, 0xF3CE, 0x7B2A, + 0xF3CF, 0x7B19, 0xF3D0, 0x7B2E, 0xF3D1, 0x7B31, 0xF3D2, 0x7B20, + 0xF3D3, 0x7B25, 0xF3D4, 0x7B24, 0xF3D5, 0x7B33, 0xF3D6, 0x7B3E, + 0xF3D7, 0x7B1E, 0xF3D8, 0x7B58, 0xF3D9, 0x7B5A, 0xF3DA, 0x7B45, + 0xF3DB, 0x7B75, 0xF3DC, 0x7B4C, 0xF3DD, 0x7B5D, 0xF3DE, 0x7B60, + 0xF3DF, 0x7B6E, 0xF3E0, 0x7B7B, 0xF3E1, 0x7B62, 0xF3E2, 0x7B72, + 0xF3E3, 0x7B71, 0xF3E4, 0x7B90, 0xF3E5, 0x7BA6, 0xF3E6, 0x7BA7, + 0xF3E7, 0x7BB8, 0xF3E8, 0x7BAC, 0xF3E9, 0x7B9D, 0xF3EA, 0x7BA8, + 0xF3EB, 0x7B85, 0xF3EC, 0x7BAA, 0xF3ED, 0x7B9C, 0xF3EE, 0x7BA2, + 0xF3EF, 0x7BAB, 0xF3F0, 0x7BB4, 0xF3F1, 0x7BD1, 0xF3F2, 0x7BC1, + 0xF3F3, 0x7BCC, 0xF3F4, 0x7BDD, 0xF3F5, 0x7BDA, 0xF3F6, 0x7BE5, + 0xF3F7, 0x7BE6, 0xF3F8, 0x7BEA, 0xF3F9, 0x7C0C, 0xF3FA, 0x7BFE, + 0xF3FB, 0x7BFC, 0xF3FC, 0x7C0F, 0xF3FD, 0x7C16, 0xF3FE, 0x7C0B, + 0xF440, 0x9B07, 0xF441, 0x9B09, 0xF442, 0x9B0A, 0xF443, 0x9B0B, + 0xF444, 0x9B0C, 0xF445, 0x9B0D, 0xF446, 0x9B0E, 0xF447, 0x9B10, + 0xF448, 0x9B11, 0xF449, 0x9B12, 0xF44A, 0x9B14, 0xF44B, 0x9B15, + 0xF44C, 0x9B16, 0xF44D, 0x9B17, 0xF44E, 0x9B18, 0xF44F, 0x9B19, + 0xF450, 0x9B1A, 0xF451, 0x9B1B, 0xF452, 0x9B1C, 0xF453, 0x9B1D, + 0xF454, 0x9B1E, 0xF455, 0x9B20, 0xF456, 0x9B21, 0xF457, 0x9B22, + 0xF458, 0x9B24, 0xF459, 0x9B25, 0xF45A, 0x9B26, 0xF45B, 0x9B27, + 0xF45C, 0x9B28, 0xF45D, 0x9B29, 0xF45E, 0x9B2A, 0xF45F, 0x9B2B, + 0xF460, 0x9B2C, 0xF461, 0x9B2D, 0xF462, 0x9B2E, 0xF463, 0x9B30, + 0xF464, 0x9B31, 0xF465, 0x9B33, 0xF466, 0x9B34, 0xF467, 0x9B35, + 0xF468, 0x9B36, 0xF469, 0x9B37, 0xF46A, 0x9B38, 0xF46B, 0x9B39, + 0xF46C, 0x9B3A, 0xF46D, 0x9B3D, 0xF46E, 0x9B3E, 0xF46F, 0x9B3F, + 0xF470, 0x9B40, 0xF471, 0x9B46, 0xF472, 0x9B4A, 0xF473, 0x9B4B, + 0xF474, 0x9B4C, 0xF475, 0x9B4E, 0xF476, 0x9B50, 0xF477, 0x9B52, + 0xF478, 0x9B53, 0xF479, 0x9B55, 0xF47A, 0x9B56, 0xF47B, 0x9B57, + 0xF47C, 0x9B58, 0xF47D, 0x9B59, 0xF47E, 0x9B5A, 0xF480, 0x9B5B, + 0xF481, 0x9B5C, 0xF482, 0x9B5D, 0xF483, 0x9B5E, 0xF484, 0x9B5F, + 0xF485, 0x9B60, 0xF486, 0x9B61, 0xF487, 0x9B62, 0xF488, 0x9B63, + 0xF489, 0x9B64, 0xF48A, 0x9B65, 0xF48B, 0x9B66, 0xF48C, 0x9B67, + 0xF48D, 0x9B68, 0xF48E, 0x9B69, 0xF48F, 0x9B6A, 0xF490, 0x9B6B, + 0xF491, 0x9B6C, 0xF492, 0x9B6D, 0xF493, 0x9B6E, 0xF494, 0x9B6F, + 0xF495, 0x9B70, 0xF496, 0x9B71, 0xF497, 0x9B72, 0xF498, 0x9B73, + 0xF499, 0x9B74, 0xF49A, 0x9B75, 0xF49B, 0x9B76, 0xF49C, 0x9B77, + 0xF49D, 0x9B78, 0xF49E, 0x9B79, 0xF49F, 0x9B7A, 0xF4A0, 0x9B7B, + 0xF4A1, 0x7C1F, 0xF4A2, 0x7C2A, 0xF4A3, 0x7C26, 0xF4A4, 0x7C38, + 0xF4A5, 0x7C41, 0xF4A6, 0x7C40, 0xF4A7, 0x81FE, 0xF4A8, 0x8201, + 0xF4A9, 0x8202, 0xF4AA, 0x8204, 0xF4AB, 0x81EC, 0xF4AC, 0x8844, + 0xF4AD, 0x8221, 0xF4AE, 0x8222, 0xF4AF, 0x8223, 0xF4B0, 0x822D, + 0xF4B1, 0x822F, 0xF4B2, 0x8228, 0xF4B3, 0x822B, 0xF4B4, 0x8238, + 0xF4B5, 0x823B, 0xF4B6, 0x8233, 0xF4B7, 0x8234, 0xF4B8, 0x823E, + 0xF4B9, 0x8244, 0xF4BA, 0x8249, 0xF4BB, 0x824B, 0xF4BC, 0x824F, + 0xF4BD, 0x825A, 0xF4BE, 0x825F, 0xF4BF, 0x8268, 0xF4C0, 0x887E, + 0xF4C1, 0x8885, 0xF4C2, 0x8888, 0xF4C3, 0x88D8, 0xF4C4, 0x88DF, + 0xF4C5, 0x895E, 0xF4C6, 0x7F9D, 0xF4C7, 0x7F9F, 0xF4C8, 0x7FA7, + 0xF4C9, 0x7FAF, 0xF4CA, 0x7FB0, 0xF4CB, 0x7FB2, 0xF4CC, 0x7C7C, + 0xF4CD, 0x6549, 0xF4CE, 0x7C91, 0xF4CF, 0x7C9D, 0xF4D0, 0x7C9C, + 0xF4D1, 0x7C9E, 0xF4D2, 0x7CA2, 0xF4D3, 0x7CB2, 0xF4D4, 0x7CBC, + 0xF4D5, 0x7CBD, 0xF4D6, 0x7CC1, 0xF4D7, 0x7CC7, 0xF4D8, 0x7CCC, + 0xF4D9, 0x7CCD, 0xF4DA, 0x7CC8, 0xF4DB, 0x7CC5, 0xF4DC, 0x7CD7, + 0xF4DD, 0x7CE8, 0xF4DE, 0x826E, 0xF4DF, 0x66A8, 0xF4E0, 0x7FBF, + 0xF4E1, 0x7FCE, 0xF4E2, 0x7FD5, 0xF4E3, 0x7FE5, 0xF4E4, 0x7FE1, + 0xF4E5, 0x7FE6, 0xF4E6, 0x7FE9, 0xF4E7, 0x7FEE, 0xF4E8, 0x7FF3, + 0xF4E9, 0x7CF8, 0xF4EA, 0x7D77, 0xF4EB, 0x7DA6, 0xF4EC, 0x7DAE, + 0xF4ED, 0x7E47, 0xF4EE, 0x7E9B, 0xF4EF, 0x9EB8, 0xF4F0, 0x9EB4, + 0xF4F1, 0x8D73, 0xF4F2, 0x8D84, 0xF4F3, 0x8D94, 0xF4F4, 0x8D91, + 0xF4F5, 0x8DB1, 0xF4F6, 0x8D67, 0xF4F7, 0x8D6D, 0xF4F8, 0x8C47, + 0xF4F9, 0x8C49, 0xF4FA, 0x914A, 0xF4FB, 0x9150, 0xF4FC, 0x914E, + 0xF4FD, 0x914F, 0xF4FE, 0x9164, 0xF540, 0x9B7C, 0xF541, 0x9B7D, + 0xF542, 0x9B7E, 0xF543, 0x9B7F, 0xF544, 0x9B80, 0xF545, 0x9B81, + 0xF546, 0x9B82, 0xF547, 0x9B83, 0xF548, 0x9B84, 0xF549, 0x9B85, + 0xF54A, 0x9B86, 0xF54B, 0x9B87, 0xF54C, 0x9B88, 0xF54D, 0x9B89, + 0xF54E, 0x9B8A, 0xF54F, 0x9B8B, 0xF550, 0x9B8C, 0xF551, 0x9B8D, + 0xF552, 0x9B8E, 0xF553, 0x9B8F, 0xF554, 0x9B90, 0xF555, 0x9B91, + 0xF556, 0x9B92, 0xF557, 0x9B93, 0xF558, 0x9B94, 0xF559, 0x9B95, + 0xF55A, 0x9B96, 0xF55B, 0x9B97, 0xF55C, 0x9B98, 0xF55D, 0x9B99, + 0xF55E, 0x9B9A, 0xF55F, 0x9B9B, 0xF560, 0x9B9C, 0xF561, 0x9B9D, + 0xF562, 0x9B9E, 0xF563, 0x9B9F, 0xF564, 0x9BA0, 0xF565, 0x9BA1, + 0xF566, 0x9BA2, 0xF567, 0x9BA3, 0xF568, 0x9BA4, 0xF569, 0x9BA5, + 0xF56A, 0x9BA6, 0xF56B, 0x9BA7, 0xF56C, 0x9BA8, 0xF56D, 0x9BA9, + 0xF56E, 0x9BAA, 0xF56F, 0x9BAB, 0xF570, 0x9BAC, 0xF571, 0x9BAD, + 0xF572, 0x9BAE, 0xF573, 0x9BAF, 0xF574, 0x9BB0, 0xF575, 0x9BB1, + 0xF576, 0x9BB2, 0xF577, 0x9BB3, 0xF578, 0x9BB4, 0xF579, 0x9BB5, + 0xF57A, 0x9BB6, 0xF57B, 0x9BB7, 0xF57C, 0x9BB8, 0xF57D, 0x9BB9, + 0xF57E, 0x9BBA, 0xF580, 0x9BBB, 0xF581, 0x9BBC, 0xF582, 0x9BBD, + 0xF583, 0x9BBE, 0xF584, 0x9BBF, 0xF585, 0x9BC0, 0xF586, 0x9BC1, + 0xF587, 0x9BC2, 0xF588, 0x9BC3, 0xF589, 0x9BC4, 0xF58A, 0x9BC5, + 0xF58B, 0x9BC6, 0xF58C, 0x9BC7, 0xF58D, 0x9BC8, 0xF58E, 0x9BC9, + 0xF58F, 0x9BCA, 0xF590, 0x9BCB, 0xF591, 0x9BCC, 0xF592, 0x9BCD, + 0xF593, 0x9BCE, 0xF594, 0x9BCF, 0xF595, 0x9BD0, 0xF596, 0x9BD1, + 0xF597, 0x9BD2, 0xF598, 0x9BD3, 0xF599, 0x9BD4, 0xF59A, 0x9BD5, + 0xF59B, 0x9BD6, 0xF59C, 0x9BD7, 0xF59D, 0x9BD8, 0xF59E, 0x9BD9, + 0xF59F, 0x9BDA, 0xF5A0, 0x9BDB, 0xF5A1, 0x9162, 0xF5A2, 0x9161, + 0xF5A3, 0x9170, 0xF5A4, 0x9169, 0xF5A5, 0x916F, 0xF5A6, 0x917D, + 0xF5A7, 0x917E, 0xF5A8, 0x9172, 0xF5A9, 0x9174, 0xF5AA, 0x9179, + 0xF5AB, 0x918C, 0xF5AC, 0x9185, 0xF5AD, 0x9190, 0xF5AE, 0x918D, + 0xF5AF, 0x9191, 0xF5B0, 0x91A2, 0xF5B1, 0x91A3, 0xF5B2, 0x91AA, + 0xF5B3, 0x91AD, 0xF5B4, 0x91AE, 0xF5B5, 0x91AF, 0xF5B6, 0x91B5, + 0xF5B7, 0x91B4, 0xF5B8, 0x91BA, 0xF5B9, 0x8C55, 0xF5BA, 0x9E7E, + 0xF5BB, 0x8DB8, 0xF5BC, 0x8DEB, 0xF5BD, 0x8E05, 0xF5BE, 0x8E59, + 0xF5BF, 0x8E69, 0xF5C0, 0x8DB5, 0xF5C1, 0x8DBF, 0xF5C2, 0x8DBC, + 0xF5C3, 0x8DBA, 0xF5C4, 0x8DC4, 0xF5C5, 0x8DD6, 0xF5C6, 0x8DD7, + 0xF5C7, 0x8DDA, 0xF5C8, 0x8DDE, 0xF5C9, 0x8DCE, 0xF5CA, 0x8DCF, + 0xF5CB, 0x8DDB, 0xF5CC, 0x8DC6, 0xF5CD, 0x8DEC, 0xF5CE, 0x8DF7, + 0xF5CF, 0x8DF8, 0xF5D0, 0x8DE3, 0xF5D1, 0x8DF9, 0xF5D2, 0x8DFB, + 0xF5D3, 0x8DE4, 0xF5D4, 0x8E09, 0xF5D5, 0x8DFD, 0xF5D6, 0x8E14, + 0xF5D7, 0x8E1D, 0xF5D8, 0x8E1F, 0xF5D9, 0x8E2C, 0xF5DA, 0x8E2E, + 0xF5DB, 0x8E23, 0xF5DC, 0x8E2F, 0xF5DD, 0x8E3A, 0xF5DE, 0x8E40, + 0xF5DF, 0x8E39, 0xF5E0, 0x8E35, 0xF5E1, 0x8E3D, 0xF5E2, 0x8E31, + 0xF5E3, 0x8E49, 0xF5E4, 0x8E41, 0xF5E5, 0x8E42, 0xF5E6, 0x8E51, + 0xF5E7, 0x8E52, 0xF5E8, 0x8E4A, 0xF5E9, 0x8E70, 0xF5EA, 0x8E76, + 0xF5EB, 0x8E7C, 0xF5EC, 0x8E6F, 0xF5ED, 0x8E74, 0xF5EE, 0x8E85, + 0xF5EF, 0x8E8F, 0xF5F0, 0x8E94, 0xF5F1, 0x8E90, 0xF5F2, 0x8E9C, + 0xF5F3, 0x8E9E, 0xF5F4, 0x8C78, 0xF5F5, 0x8C82, 0xF5F6, 0x8C8A, + 0xF5F7, 0x8C85, 0xF5F8, 0x8C98, 0xF5F9, 0x8C94, 0xF5FA, 0x659B, + 0xF5FB, 0x89D6, 0xF5FC, 0x89DE, 0xF5FD, 0x89DA, 0xF5FE, 0x89DC, + 0xF640, 0x9BDC, 0xF641, 0x9BDD, 0xF642, 0x9BDE, 0xF643, 0x9BDF, + 0xF644, 0x9BE0, 0xF645, 0x9BE1, 0xF646, 0x9BE2, 0xF647, 0x9BE3, + 0xF648, 0x9BE4, 0xF649, 0x9BE5, 0xF64A, 0x9BE6, 0xF64B, 0x9BE7, + 0xF64C, 0x9BE8, 0xF64D, 0x9BE9, 0xF64E, 0x9BEA, 0xF64F, 0x9BEB, + 0xF650, 0x9BEC, 0xF651, 0x9BED, 0xF652, 0x9BEE, 0xF653, 0x9BEF, + 0xF654, 0x9BF0, 0xF655, 0x9BF1, 0xF656, 0x9BF2, 0xF657, 0x9BF3, + 0xF658, 0x9BF4, 0xF659, 0x9BF5, 0xF65A, 0x9BF6, 0xF65B, 0x9BF7, + 0xF65C, 0x9BF8, 0xF65D, 0x9BF9, 0xF65E, 0x9BFA, 0xF65F, 0x9BFB, + 0xF660, 0x9BFC, 0xF661, 0x9BFD, 0xF662, 0x9BFE, 0xF663, 0x9BFF, + 0xF664, 0x9C00, 0xF665, 0x9C01, 0xF666, 0x9C02, 0xF667, 0x9C03, + 0xF668, 0x9C04, 0xF669, 0x9C05, 0xF66A, 0x9C06, 0xF66B, 0x9C07, + 0xF66C, 0x9C08, 0xF66D, 0x9C09, 0xF66E, 0x9C0A, 0xF66F, 0x9C0B, + 0xF670, 0x9C0C, 0xF671, 0x9C0D, 0xF672, 0x9C0E, 0xF673, 0x9C0F, + 0xF674, 0x9C10, 0xF675, 0x9C11, 0xF676, 0x9C12, 0xF677, 0x9C13, + 0xF678, 0x9C14, 0xF679, 0x9C15, 0xF67A, 0x9C16, 0xF67B, 0x9C17, + 0xF67C, 0x9C18, 0xF67D, 0x9C19, 0xF67E, 0x9C1A, 0xF680, 0x9C1B, + 0xF681, 0x9C1C, 0xF682, 0x9C1D, 0xF683, 0x9C1E, 0xF684, 0x9C1F, + 0xF685, 0x9C20, 0xF686, 0x9C21, 0xF687, 0x9C22, 0xF688, 0x9C23, + 0xF689, 0x9C24, 0xF68A, 0x9C25, 0xF68B, 0x9C26, 0xF68C, 0x9C27, + 0xF68D, 0x9C28, 0xF68E, 0x9C29, 0xF68F, 0x9C2A, 0xF690, 0x9C2B, + 0xF691, 0x9C2C, 0xF692, 0x9C2D, 0xF693, 0x9C2E, 0xF694, 0x9C2F, + 0xF695, 0x9C30, 0xF696, 0x9C31, 0xF697, 0x9C32, 0xF698, 0x9C33, + 0xF699, 0x9C34, 0xF69A, 0x9C35, 0xF69B, 0x9C36, 0xF69C, 0x9C37, + 0xF69D, 0x9C38, 0xF69E, 0x9C39, 0xF69F, 0x9C3A, 0xF6A0, 0x9C3B, + 0xF6A1, 0x89E5, 0xF6A2, 0x89EB, 0xF6A3, 0x89EF, 0xF6A4, 0x8A3E, + 0xF6A5, 0x8B26, 0xF6A6, 0x9753, 0xF6A7, 0x96E9, 0xF6A8, 0x96F3, + 0xF6A9, 0x96EF, 0xF6AA, 0x9706, 0xF6AB, 0x9701, 0xF6AC, 0x9708, + 0xF6AD, 0x970F, 0xF6AE, 0x970E, 0xF6AF, 0x972A, 0xF6B0, 0x972D, + 0xF6B1, 0x9730, 0xF6B2, 0x973E, 0xF6B3, 0x9F80, 0xF6B4, 0x9F83, + 0xF6B5, 0x9F85, 0xF6B6, 0x9F86, 0xF6B7, 0x9F87, 0xF6B8, 0x9F88, + 0xF6B9, 0x9F89, 0xF6BA, 0x9F8A, 0xF6BB, 0x9F8C, 0xF6BC, 0x9EFE, + 0xF6BD, 0x9F0B, 0xF6BE, 0x9F0D, 0xF6BF, 0x96B9, 0xF6C0, 0x96BC, + 0xF6C1, 0x96BD, 0xF6C2, 0x96CE, 0xF6C3, 0x96D2, 0xF6C4, 0x77BF, + 0xF6C5, 0x96E0, 0xF6C6, 0x928E, 0xF6C7, 0x92AE, 0xF6C8, 0x92C8, + 0xF6C9, 0x933E, 0xF6CA, 0x936A, 0xF6CB, 0x93CA, 0xF6CC, 0x938F, + 0xF6CD, 0x943E, 0xF6CE, 0x946B, 0xF6CF, 0x9C7F, 0xF6D0, 0x9C82, + 0xF6D1, 0x9C85, 0xF6D2, 0x9C86, 0xF6D3, 0x9C87, 0xF6D4, 0x9C88, + 0xF6D5, 0x7A23, 0xF6D6, 0x9C8B, 0xF6D7, 0x9C8E, 0xF6D8, 0x9C90, + 0xF6D9, 0x9C91, 0xF6DA, 0x9C92, 0xF6DB, 0x9C94, 0xF6DC, 0x9C95, + 0xF6DD, 0x9C9A, 0xF6DE, 0x9C9B, 0xF6DF, 0x9C9E, 0xF6E0, 0x9C9F, + 0xF6E1, 0x9CA0, 0xF6E2, 0x9CA1, 0xF6E3, 0x9CA2, 0xF6E4, 0x9CA3, + 0xF6E5, 0x9CA5, 0xF6E6, 0x9CA6, 0xF6E7, 0x9CA7, 0xF6E8, 0x9CA8, + 0xF6E9, 0x9CA9, 0xF6EA, 0x9CAB, 0xF6EB, 0x9CAD, 0xF6EC, 0x9CAE, + 0xF6ED, 0x9CB0, 0xF6EE, 0x9CB1, 0xF6EF, 0x9CB2, 0xF6F0, 0x9CB3, + 0xF6F1, 0x9CB4, 0xF6F2, 0x9CB5, 0xF6F3, 0x9CB6, 0xF6F4, 0x9CB7, + 0xF6F5, 0x9CBA, 0xF6F6, 0x9CBB, 0xF6F7, 0x9CBC, 0xF6F8, 0x9CBD, + 0xF6F9, 0x9CC4, 0xF6FA, 0x9CC5, 0xF6FB, 0x9CC6, 0xF6FC, 0x9CC7, + 0xF6FD, 0x9CCA, 0xF6FE, 0x9CCB, 0xF740, 0x9C3C, 0xF741, 0x9C3D, + 0xF742, 0x9C3E, 0xF743, 0x9C3F, 0xF744, 0x9C40, 0xF745, 0x9C41, + 0xF746, 0x9C42, 0xF747, 0x9C43, 0xF748, 0x9C44, 0xF749, 0x9C45, + 0xF74A, 0x9C46, 0xF74B, 0x9C47, 0xF74C, 0x9C48, 0xF74D, 0x9C49, + 0xF74E, 0x9C4A, 0xF74F, 0x9C4B, 0xF750, 0x9C4C, 0xF751, 0x9C4D, + 0xF752, 0x9C4E, 0xF753, 0x9C4F, 0xF754, 0x9C50, 0xF755, 0x9C51, + 0xF756, 0x9C52, 0xF757, 0x9C53, 0xF758, 0x9C54, 0xF759, 0x9C55, + 0xF75A, 0x9C56, 0xF75B, 0x9C57, 0xF75C, 0x9C58, 0xF75D, 0x9C59, + 0xF75E, 0x9C5A, 0xF75F, 0x9C5B, 0xF760, 0x9C5C, 0xF761, 0x9C5D, + 0xF762, 0x9C5E, 0xF763, 0x9C5F, 0xF764, 0x9C60, 0xF765, 0x9C61, + 0xF766, 0x9C62, 0xF767, 0x9C63, 0xF768, 0x9C64, 0xF769, 0x9C65, + 0xF76A, 0x9C66, 0xF76B, 0x9C67, 0xF76C, 0x9C68, 0xF76D, 0x9C69, + 0xF76E, 0x9C6A, 0xF76F, 0x9C6B, 0xF770, 0x9C6C, 0xF771, 0x9C6D, + 0xF772, 0x9C6E, 0xF773, 0x9C6F, 0xF774, 0x9C70, 0xF775, 0x9C71, + 0xF776, 0x9C72, 0xF777, 0x9C73, 0xF778, 0x9C74, 0xF779, 0x9C75, + 0xF77A, 0x9C76, 0xF77B, 0x9C77, 0xF77C, 0x9C78, 0xF77D, 0x9C79, + 0xF77E, 0x9C7A, 0xF780, 0x9C7B, 0xF781, 0x9C7D, 0xF782, 0x9C7E, + 0xF783, 0x9C80, 0xF784, 0x9C83, 0xF785, 0x9C84, 0xF786, 0x9C89, + 0xF787, 0x9C8A, 0xF788, 0x9C8C, 0xF789, 0x9C8F, 0xF78A, 0x9C93, + 0xF78B, 0x9C96, 0xF78C, 0x9C97, 0xF78D, 0x9C98, 0xF78E, 0x9C99, + 0xF78F, 0x9C9D, 0xF790, 0x9CAA, 0xF791, 0x9CAC, 0xF792, 0x9CAF, + 0xF793, 0x9CB9, 0xF794, 0x9CBE, 0xF795, 0x9CBF, 0xF796, 0x9CC0, + 0xF797, 0x9CC1, 0xF798, 0x9CC2, 0xF799, 0x9CC8, 0xF79A, 0x9CC9, + 0xF79B, 0x9CD1, 0xF79C, 0x9CD2, 0xF79D, 0x9CDA, 0xF79E, 0x9CDB, + 0xF79F, 0x9CE0, 0xF7A0, 0x9CE1, 0xF7A1, 0x9CCC, 0xF7A2, 0x9CCD, + 0xF7A3, 0x9CCE, 0xF7A4, 0x9CCF, 0xF7A5, 0x9CD0, 0xF7A6, 0x9CD3, + 0xF7A7, 0x9CD4, 0xF7A8, 0x9CD5, 0xF7A9, 0x9CD7, 0xF7AA, 0x9CD8, + 0xF7AB, 0x9CD9, 0xF7AC, 0x9CDC, 0xF7AD, 0x9CDD, 0xF7AE, 0x9CDF, + 0xF7AF, 0x9CE2, 0xF7B0, 0x977C, 0xF7B1, 0x9785, 0xF7B2, 0x9791, + 0xF7B3, 0x9792, 0xF7B4, 0x9794, 0xF7B5, 0x97AF, 0xF7B6, 0x97AB, + 0xF7B7, 0x97A3, 0xF7B8, 0x97B2, 0xF7B9, 0x97B4, 0xF7BA, 0x9AB1, + 0xF7BB, 0x9AB0, 0xF7BC, 0x9AB7, 0xF7BD, 0x9E58, 0xF7BE, 0x9AB6, + 0xF7BF, 0x9ABA, 0xF7C0, 0x9ABC, 0xF7C1, 0x9AC1, 0xF7C2, 0x9AC0, + 0xF7C3, 0x9AC5, 0xF7C4, 0x9AC2, 0xF7C5, 0x9ACB, 0xF7C6, 0x9ACC, + 0xF7C7, 0x9AD1, 0xF7C8, 0x9B45, 0xF7C9, 0x9B43, 0xF7CA, 0x9B47, + 0xF7CB, 0x9B49, 0xF7CC, 0x9B48, 0xF7CD, 0x9B4D, 0xF7CE, 0x9B51, + 0xF7CF, 0x98E8, 0xF7D0, 0x990D, 0xF7D1, 0x992E, 0xF7D2, 0x9955, + 0xF7D3, 0x9954, 0xF7D4, 0x9ADF, 0xF7D5, 0x9AE1, 0xF7D6, 0x9AE6, + 0xF7D7, 0x9AEF, 0xF7D8, 0x9AEB, 0xF7D9, 0x9AFB, 0xF7DA, 0x9AED, + 0xF7DB, 0x9AF9, 0xF7DC, 0x9B08, 0xF7DD, 0x9B0F, 0xF7DE, 0x9B13, + 0xF7DF, 0x9B1F, 0xF7E0, 0x9B23, 0xF7E1, 0x9EBD, 0xF7E2, 0x9EBE, + 0xF7E3, 0x7E3B, 0xF7E4, 0x9E82, 0xF7E5, 0x9E87, 0xF7E6, 0x9E88, + 0xF7E7, 0x9E8B, 0xF7E8, 0x9E92, 0xF7E9, 0x93D6, 0xF7EA, 0x9E9D, + 0xF7EB, 0x9E9F, 0xF7EC, 0x9EDB, 0xF7ED, 0x9EDC, 0xF7EE, 0x9EDD, + 0xF7EF, 0x9EE0, 0xF7F0, 0x9EDF, 0xF7F1, 0x9EE2, 0xF7F2, 0x9EE9, + 0xF7F3, 0x9EE7, 0xF7F4, 0x9EE5, 0xF7F5, 0x9EEA, 0xF7F6, 0x9EEF, + 0xF7F7, 0x9F22, 0xF7F8, 0x9F2C, 0xF7F9, 0x9F2F, 0xF7FA, 0x9F39, + 0xF7FB, 0x9F37, 0xF7FC, 0x9F3D, 0xF7FD, 0x9F3E, 0xF7FE, 0x9F44, + 0xF840, 0x9CE3, 0xF841, 0x9CE4, 0xF842, 0x9CE5, 0xF843, 0x9CE6, + 0xF844, 0x9CE7, 0xF845, 0x9CE8, 0xF846, 0x9CE9, 0xF847, 0x9CEA, + 0xF848, 0x9CEB, 0xF849, 0x9CEC, 0xF84A, 0x9CED, 0xF84B, 0x9CEE, + 0xF84C, 0x9CEF, 0xF84D, 0x9CF0, 0xF84E, 0x9CF1, 0xF84F, 0x9CF2, + 0xF850, 0x9CF3, 0xF851, 0x9CF4, 0xF852, 0x9CF5, 0xF853, 0x9CF6, + 0xF854, 0x9CF7, 0xF855, 0x9CF8, 0xF856, 0x9CF9, 0xF857, 0x9CFA, + 0xF858, 0x9CFB, 0xF859, 0x9CFC, 0xF85A, 0x9CFD, 0xF85B, 0x9CFE, + 0xF85C, 0x9CFF, 0xF85D, 0x9D00, 0xF85E, 0x9D01, 0xF85F, 0x9D02, + 0xF860, 0x9D03, 0xF861, 0x9D04, 0xF862, 0x9D05, 0xF863, 0x9D06, + 0xF864, 0x9D07, 0xF865, 0x9D08, 0xF866, 0x9D09, 0xF867, 0x9D0A, + 0xF868, 0x9D0B, 0xF869, 0x9D0C, 0xF86A, 0x9D0D, 0xF86B, 0x9D0E, + 0xF86C, 0x9D0F, 0xF86D, 0x9D10, 0xF86E, 0x9D11, 0xF86F, 0x9D12, + 0xF870, 0x9D13, 0xF871, 0x9D14, 0xF872, 0x9D15, 0xF873, 0x9D16, + 0xF874, 0x9D17, 0xF875, 0x9D18, 0xF876, 0x9D19, 0xF877, 0x9D1A, + 0xF878, 0x9D1B, 0xF879, 0x9D1C, 0xF87A, 0x9D1D, 0xF87B, 0x9D1E, + 0xF87C, 0x9D1F, 0xF87D, 0x9D20, 0xF87E, 0x9D21, 0xF880, 0x9D22, + 0xF881, 0x9D23, 0xF882, 0x9D24, 0xF883, 0x9D25, 0xF884, 0x9D26, + 0xF885, 0x9D27, 0xF886, 0x9D28, 0xF887, 0x9D29, 0xF888, 0x9D2A, + 0xF889, 0x9D2B, 0xF88A, 0x9D2C, 0xF88B, 0x9D2D, 0xF88C, 0x9D2E, + 0xF88D, 0x9D2F, 0xF88E, 0x9D30, 0xF88F, 0x9D31, 0xF890, 0x9D32, + 0xF891, 0x9D33, 0xF892, 0x9D34, 0xF893, 0x9D35, 0xF894, 0x9D36, + 0xF895, 0x9D37, 0xF896, 0x9D38, 0xF897, 0x9D39, 0xF898, 0x9D3A, + 0xF899, 0x9D3B, 0xF89A, 0x9D3C, 0xF89B, 0x9D3D, 0xF89C, 0x9D3E, + 0xF89D, 0x9D3F, 0xF89E, 0x9D40, 0xF89F, 0x9D41, 0xF8A0, 0x9D42, + 0xF940, 0x9D43, 0xF941, 0x9D44, 0xF942, 0x9D45, 0xF943, 0x9D46, + 0xF944, 0x9D47, 0xF945, 0x9D48, 0xF946, 0x9D49, 0xF947, 0x9D4A, + 0xF948, 0x9D4B, 0xF949, 0x9D4C, 0xF94A, 0x9D4D, 0xF94B, 0x9D4E, + 0xF94C, 0x9D4F, 0xF94D, 0x9D50, 0xF94E, 0x9D51, 0xF94F, 0x9D52, + 0xF950, 0x9D53, 0xF951, 0x9D54, 0xF952, 0x9D55, 0xF953, 0x9D56, + 0xF954, 0x9D57, 0xF955, 0x9D58, 0xF956, 0x9D59, 0xF957, 0x9D5A, + 0xF958, 0x9D5B, 0xF959, 0x9D5C, 0xF95A, 0x9D5D, 0xF95B, 0x9D5E, + 0xF95C, 0x9D5F, 0xF95D, 0x9D60, 0xF95E, 0x9D61, 0xF95F, 0x9D62, + 0xF960, 0x9D63, 0xF961, 0x9D64, 0xF962, 0x9D65, 0xF963, 0x9D66, + 0xF964, 0x9D67, 0xF965, 0x9D68, 0xF966, 0x9D69, 0xF967, 0x9D6A, + 0xF968, 0x9D6B, 0xF969, 0x9D6C, 0xF96A, 0x9D6D, 0xF96B, 0x9D6E, + 0xF96C, 0x9D6F, 0xF96D, 0x9D70, 0xF96E, 0x9D71, 0xF96F, 0x9D72, + 0xF970, 0x9D73, 0xF971, 0x9D74, 0xF972, 0x9D75, 0xF973, 0x9D76, + 0xF974, 0x9D77, 0xF975, 0x9D78, 0xF976, 0x9D79, 0xF977, 0x9D7A, + 0xF978, 0x9D7B, 0xF979, 0x9D7C, 0xF97A, 0x9D7D, 0xF97B, 0x9D7E, + 0xF97C, 0x9D7F, 0xF97D, 0x9D80, 0xF97E, 0x9D81, 0xF980, 0x9D82, + 0xF981, 0x9D83, 0xF982, 0x9D84, 0xF983, 0x9D85, 0xF984, 0x9D86, + 0xF985, 0x9D87, 0xF986, 0x9D88, 0xF987, 0x9D89, 0xF988, 0x9D8A, + 0xF989, 0x9D8B, 0xF98A, 0x9D8C, 0xF98B, 0x9D8D, 0xF98C, 0x9D8E, + 0xF98D, 0x9D8F, 0xF98E, 0x9D90, 0xF98F, 0x9D91, 0xF990, 0x9D92, + 0xF991, 0x9D93, 0xF992, 0x9D94, 0xF993, 0x9D95, 0xF994, 0x9D96, + 0xF995, 0x9D97, 0xF996, 0x9D98, 0xF997, 0x9D99, 0xF998, 0x9D9A, + 0xF999, 0x9D9B, 0xF99A, 0x9D9C, 0xF99B, 0x9D9D, 0xF99C, 0x9D9E, + 0xF99D, 0x9D9F, 0xF99E, 0x9DA0, 0xF99F, 0x9DA1, 0xF9A0, 0x9DA2, + 0xFA40, 0x9DA3, 0xFA41, 0x9DA4, 0xFA42, 0x9DA5, 0xFA43, 0x9DA6, + 0xFA44, 0x9DA7, 0xFA45, 0x9DA8, 0xFA46, 0x9DA9, 0xFA47, 0x9DAA, + 0xFA48, 0x9DAB, 0xFA49, 0x9DAC, 0xFA4A, 0x9DAD, 0xFA4B, 0x9DAE, + 0xFA4C, 0x9DAF, 0xFA4D, 0x9DB0, 0xFA4E, 0x9DB1, 0xFA4F, 0x9DB2, + 0xFA50, 0x9DB3, 0xFA51, 0x9DB4, 0xFA52, 0x9DB5, 0xFA53, 0x9DB6, + 0xFA54, 0x9DB7, 0xFA55, 0x9DB8, 0xFA56, 0x9DB9, 0xFA57, 0x9DBA, + 0xFA58, 0x9DBB, 0xFA59, 0x9DBC, 0xFA5A, 0x9DBD, 0xFA5B, 0x9DBE, + 0xFA5C, 0x9DBF, 0xFA5D, 0x9DC0, 0xFA5E, 0x9DC1, 0xFA5F, 0x9DC2, + 0xFA60, 0x9DC3, 0xFA61, 0x9DC4, 0xFA62, 0x9DC5, 0xFA63, 0x9DC6, + 0xFA64, 0x9DC7, 0xFA65, 0x9DC8, 0xFA66, 0x9DC9, 0xFA67, 0x9DCA, + 0xFA68, 0x9DCB, 0xFA69, 0x9DCC, 0xFA6A, 0x9DCD, 0xFA6B, 0x9DCE, + 0xFA6C, 0x9DCF, 0xFA6D, 0x9DD0, 0xFA6E, 0x9DD1, 0xFA6F, 0x9DD2, + 0xFA70, 0x9DD3, 0xFA71, 0x9DD4, 0xFA72, 0x9DD5, 0xFA73, 0x9DD6, + 0xFA74, 0x9DD7, 0xFA75, 0x9DD8, 0xFA76, 0x9DD9, 0xFA77, 0x9DDA, + 0xFA78, 0x9DDB, 0xFA79, 0x9DDC, 0xFA7A, 0x9DDD, 0xFA7B, 0x9DDE, + 0xFA7C, 0x9DDF, 0xFA7D, 0x9DE0, 0xFA7E, 0x9DE1, 0xFA80, 0x9DE2, + 0xFA81, 0x9DE3, 0xFA82, 0x9DE4, 0xFA83, 0x9DE5, 0xFA84, 0x9DE6, + 0xFA85, 0x9DE7, 0xFA86, 0x9DE8, 0xFA87, 0x9DE9, 0xFA88, 0x9DEA, + 0xFA89, 0x9DEB, 0xFA8A, 0x9DEC, 0xFA8B, 0x9DED, 0xFA8C, 0x9DEE, + 0xFA8D, 0x9DEF, 0xFA8E, 0x9DF0, 0xFA8F, 0x9DF1, 0xFA90, 0x9DF2, + 0xFA91, 0x9DF3, 0xFA92, 0x9DF4, 0xFA93, 0x9DF5, 0xFA94, 0x9DF6, + 0xFA95, 0x9DF7, 0xFA96, 0x9DF8, 0xFA97, 0x9DF9, 0xFA98, 0x9DFA, + 0xFA99, 0x9DFB, 0xFA9A, 0x9DFC, 0xFA9B, 0x9DFD, 0xFA9C, 0x9DFE, + 0xFA9D, 0x9DFF, 0xFA9E, 0x9E00, 0xFA9F, 0x9E01, 0xFAA0, 0x9E02, + 0xFB40, 0x9E03, 0xFB41, 0x9E04, 0xFB42, 0x9E05, 0xFB43, 0x9E06, + 0xFB44, 0x9E07, 0xFB45, 0x9E08, 0xFB46, 0x9E09, 0xFB47, 0x9E0A, + 0xFB48, 0x9E0B, 0xFB49, 0x9E0C, 0xFB4A, 0x9E0D, 0xFB4B, 0x9E0E, + 0xFB4C, 0x9E0F, 0xFB4D, 0x9E10, 0xFB4E, 0x9E11, 0xFB4F, 0x9E12, + 0xFB50, 0x9E13, 0xFB51, 0x9E14, 0xFB52, 0x9E15, 0xFB53, 0x9E16, + 0xFB54, 0x9E17, 0xFB55, 0x9E18, 0xFB56, 0x9E19, 0xFB57, 0x9E1A, + 0xFB58, 0x9E1B, 0xFB59, 0x9E1C, 0xFB5A, 0x9E1D, 0xFB5B, 0x9E1E, + 0xFB5C, 0x9E24, 0xFB5D, 0x9E27, 0xFB5E, 0x9E2E, 0xFB5F, 0x9E30, + 0xFB60, 0x9E34, 0xFB61, 0x9E3B, 0xFB62, 0x9E3C, 0xFB63, 0x9E40, + 0xFB64, 0x9E4D, 0xFB65, 0x9E50, 0xFB66, 0x9E52, 0xFB67, 0x9E53, + 0xFB68, 0x9E54, 0xFB69, 0x9E56, 0xFB6A, 0x9E59, 0xFB6B, 0x9E5D, + 0xFB6C, 0x9E5F, 0xFB6D, 0x9E60, 0xFB6E, 0x9E61, 0xFB6F, 0x9E62, + 0xFB70, 0x9E65, 0xFB71, 0x9E6E, 0xFB72, 0x9E6F, 0xFB73, 0x9E72, + 0xFB74, 0x9E74, 0xFB75, 0x9E75, 0xFB76, 0x9E76, 0xFB77, 0x9E77, + 0xFB78, 0x9E78, 0xFB79, 0x9E79, 0xFB7A, 0x9E7A, 0xFB7B, 0x9E7B, + 0xFB7C, 0x9E7C, 0xFB7D, 0x9E7D, 0xFB7E, 0x9E80, 0xFB80, 0x9E81, + 0xFB81, 0x9E83, 0xFB82, 0x9E84, 0xFB83, 0x9E85, 0xFB84, 0x9E86, + 0xFB85, 0x9E89, 0xFB86, 0x9E8A, 0xFB87, 0x9E8C, 0xFB88, 0x9E8D, + 0xFB89, 0x9E8E, 0xFB8A, 0x9E8F, 0xFB8B, 0x9E90, 0xFB8C, 0x9E91, + 0xFB8D, 0x9E94, 0xFB8E, 0x9E95, 0xFB8F, 0x9E96, 0xFB90, 0x9E97, + 0xFB91, 0x9E98, 0xFB92, 0x9E99, 0xFB93, 0x9E9A, 0xFB94, 0x9E9B, + 0xFB95, 0x9E9C, 0xFB96, 0x9E9E, 0xFB97, 0x9EA0, 0xFB98, 0x9EA1, + 0xFB99, 0x9EA2, 0xFB9A, 0x9EA3, 0xFB9B, 0x9EA4, 0xFB9C, 0x9EA5, + 0xFB9D, 0x9EA7, 0xFB9E, 0x9EA8, 0xFB9F, 0x9EA9, 0xFBA0, 0x9EAA, + 0xFC40, 0x9EAB, 0xFC41, 0x9EAC, 0xFC42, 0x9EAD, 0xFC43, 0x9EAE, + 0xFC44, 0x9EAF, 0xFC45, 0x9EB0, 0xFC46, 0x9EB1, 0xFC47, 0x9EB2, + 0xFC48, 0x9EB3, 0xFC49, 0x9EB5, 0xFC4A, 0x9EB6, 0xFC4B, 0x9EB7, + 0xFC4C, 0x9EB9, 0xFC4D, 0x9EBA, 0xFC4E, 0x9EBC, 0xFC4F, 0x9EBF, + 0xFC50, 0x9EC0, 0xFC51, 0x9EC1, 0xFC52, 0x9EC2, 0xFC53, 0x9EC3, + 0xFC54, 0x9EC5, 0xFC55, 0x9EC6, 0xFC56, 0x9EC7, 0xFC57, 0x9EC8, + 0xFC58, 0x9ECA, 0xFC59, 0x9ECB, 0xFC5A, 0x9ECC, 0xFC5B, 0x9ED0, + 0xFC5C, 0x9ED2, 0xFC5D, 0x9ED3, 0xFC5E, 0x9ED5, 0xFC5F, 0x9ED6, + 0xFC60, 0x9ED7, 0xFC61, 0x9ED9, 0xFC62, 0x9EDA, 0xFC63, 0x9EDE, + 0xFC64, 0x9EE1, 0xFC65, 0x9EE3, 0xFC66, 0x9EE4, 0xFC67, 0x9EE6, + 0xFC68, 0x9EE8, 0xFC69, 0x9EEB, 0xFC6A, 0x9EEC, 0xFC6B, 0x9EED, + 0xFC6C, 0x9EEE, 0xFC6D, 0x9EF0, 0xFC6E, 0x9EF1, 0xFC6F, 0x9EF2, + 0xFC70, 0x9EF3, 0xFC71, 0x9EF4, 0xFC72, 0x9EF5, 0xFC73, 0x9EF6, + 0xFC74, 0x9EF7, 0xFC75, 0x9EF8, 0xFC76, 0x9EFA, 0xFC77, 0x9EFD, + 0xFC78, 0x9EFF, 0xFC79, 0x9F00, 0xFC7A, 0x9F01, 0xFC7B, 0x9F02, + 0xFC7C, 0x9F03, 0xFC7D, 0x9F04, 0xFC7E, 0x9F05, 0xFC80, 0x9F06, + 0xFC81, 0x9F07, 0xFC82, 0x9F08, 0xFC83, 0x9F09, 0xFC84, 0x9F0A, + 0xFC85, 0x9F0C, 0xFC86, 0x9F0F, 0xFC87, 0x9F11, 0xFC88, 0x9F12, + 0xFC89, 0x9F14, 0xFC8A, 0x9F15, 0xFC8B, 0x9F16, 0xFC8C, 0x9F18, + 0xFC8D, 0x9F1A, 0xFC8E, 0x9F1B, 0xFC8F, 0x9F1C, 0xFC90, 0x9F1D, + 0xFC91, 0x9F1E, 0xFC92, 0x9F1F, 0xFC93, 0x9F21, 0xFC94, 0x9F23, + 0xFC95, 0x9F24, 0xFC96, 0x9F25, 0xFC97, 0x9F26, 0xFC98, 0x9F27, + 0xFC99, 0x9F28, 0xFC9A, 0x9F29, 0xFC9B, 0x9F2A, 0xFC9C, 0x9F2B, + 0xFC9D, 0x9F2D, 0xFC9E, 0x9F2E, 0xFC9F, 0x9F30, 0xFCA0, 0x9F31, + 0xFD40, 0x9F32, 0xFD41, 0x9F33, 0xFD42, 0x9F34, 0xFD43, 0x9F35, + 0xFD44, 0x9F36, 0xFD45, 0x9F38, 0xFD46, 0x9F3A, 0xFD47, 0x9F3C, + 0xFD48, 0x9F3F, 0xFD49, 0x9F40, 0xFD4A, 0x9F41, 0xFD4B, 0x9F42, + 0xFD4C, 0x9F43, 0xFD4D, 0x9F45, 0xFD4E, 0x9F46, 0xFD4F, 0x9F47, + 0xFD50, 0x9F48, 0xFD51, 0x9F49, 0xFD52, 0x9F4A, 0xFD53, 0x9F4B, + 0xFD54, 0x9F4C, 0xFD55, 0x9F4D, 0xFD56, 0x9F4E, 0xFD57, 0x9F4F, + 0xFD58, 0x9F52, 0xFD59, 0x9F53, 0xFD5A, 0x9F54, 0xFD5B, 0x9F55, + 0xFD5C, 0x9F56, 0xFD5D, 0x9F57, 0xFD5E, 0x9F58, 0xFD5F, 0x9F59, + 0xFD60, 0x9F5A, 0xFD61, 0x9F5B, 0xFD62, 0x9F5C, 0xFD63, 0x9F5D, + 0xFD64, 0x9F5E, 0xFD65, 0x9F5F, 0xFD66, 0x9F60, 0xFD67, 0x9F61, + 0xFD68, 0x9F62, 0xFD69, 0x9F63, 0xFD6A, 0x9F64, 0xFD6B, 0x9F65, + 0xFD6C, 0x9F66, 0xFD6D, 0x9F67, 0xFD6E, 0x9F68, 0xFD6F, 0x9F69, + 0xFD70, 0x9F6A, 0xFD71, 0x9F6B, 0xFD72, 0x9F6C, 0xFD73, 0x9F6D, + 0xFD74, 0x9F6E, 0xFD75, 0x9F6F, 0xFD76, 0x9F70, 0xFD77, 0x9F71, + 0xFD78, 0x9F72, 0xFD79, 0x9F73, 0xFD7A, 0x9F74, 0xFD7B, 0x9F75, + 0xFD7C, 0x9F76, 0xFD7D, 0x9F77, 0xFD7E, 0x9F78, 0xFD80, 0x9F79, + 0xFD81, 0x9F7A, 0xFD82, 0x9F7B, 0xFD83, 0x9F7C, 0xFD84, 0x9F7D, + 0xFD85, 0x9F7E, 0xFD86, 0x9F81, 0xFD87, 0x9F82, 0xFD88, 0x9F8D, + 0xFD89, 0x9F8E, 0xFD8A, 0x9F8F, 0xFD8B, 0x9F90, 0xFD8C, 0x9F91, + 0xFD8D, 0x9F92, 0xFD8E, 0x9F93, 0xFD8F, 0x9F94, 0xFD90, 0x9F95, + 0xFD91, 0x9F96, 0xFD92, 0x9F97, 0xFD93, 0x9F98, 0xFD94, 0x9F9C, + 0xFD95, 0x9F9D, 0xFD96, 0x9F9E, 0xFD97, 0x9FA1, 0xFD98, 0x9FA2, + 0xFD99, 0x9FA3, 0xFD9A, 0x9FA4, 0xFD9B, 0x9FA5, 0xFD9C, 0xF92C, + 0xFD9D, 0xF979, 0xFD9E, 0xF995, 0xFD9F, 0xF9E7, 0xFDA0, 0xF9F1, + 0xFE40, 0xFA0C, 0xFE41, 0xFA0D, 0xFE42, 0xFA0E, 0xFE43, 0xFA0F, + 0xFE44, 0xFA11, 0xFE45, 0xFA13, 0xFE46, 0xFA14, 0xFE47, 0xFA18, + 0xFE48, 0xFA1F, 0xFE49, 0xFA20, 0xFE4A, 0xFA21, 0xFE4B, 0xFA23, + 0xFE4C, 0xFA24, 0xFE4D, 0xFA27, 0xFE4E, 0xFA28, 0xFE4F, 0xFA29, + 0, 0 +}; + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR src, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (src < 0x80) { /* ASCII */ + c = src; + } else { + if (dir) { /* OEMCP to unicode */ + p = oem2uni; + hi = sizeof(oem2uni) / 4 - 1; + } else { /* Unicode to OEMCP */ + p = uni2oem; + hi = sizeof(uni2oem) / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (src == p[i * 2]) break; + if (src > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; + } + + return c; +} + + + +WCHAR ff_wtoupper ( /* Upper converted character */ + WCHAR chr /* Input character */ +) +{ + static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; + static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; + int i; + + + for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + + return tbl_lower[i] ? tbl_upper[i] : chr; +} diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc949.c b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc949.c new file mode 100644 index 0000000..5dcb0a8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc949.c @@ -0,0 +1,8603 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ +/* */ +/* CP949 (Korean) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + + +#if !_USE_LFN || _CODE_PAGE != 949 +#error This file is not needed in current configuration. +#endif + + +static +const WCHAR uni2oem[] = { +/* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ + 0x00A1, 0xA2AE, 0x00A4, 0xA2B4, 0x00A7, 0xA1D7, 0x00A8, 0xA1A7, + 0x00AA, 0xA8A3, 0x00AD, 0xA1A9, 0x00AE, 0xA2E7, 0x00B0, 0xA1C6, + 0x00B1, 0xA1BE, 0x00B2, 0xA9F7, 0x00B3, 0xA9F8, 0x00B4, 0xA2A5, + 0x00B6, 0xA2D2, 0x00B7, 0xA1A4, 0x00B8, 0xA2AC, 0x00B9, 0xA9F6, + 0x00BA, 0xA8AC, 0x00BC, 0xA8F9, 0x00BD, 0xA8F6, 0x00BE, 0xA8FA, + 0x00BF, 0xA2AF, 0x00C6, 0xA8A1, 0x00D0, 0xA8A2, 0x00D7, 0xA1BF, + 0x00D8, 0xA8AA, 0x00DE, 0xA8AD, 0x00DF, 0xA9AC, 0x00E6, 0xA9A1, + 0x00F0, 0xA9A3, 0x00F7, 0xA1C0, 0x00F8, 0xA9AA, 0x00FE, 0xA9AD, + 0x0111, 0xA9A2, 0x0126, 0xA8A4, 0x0127, 0xA9A4, 0x0131, 0xA9A5, + 0x0132, 0xA8A6, 0x0133, 0xA9A6, 0x0138, 0xA9A7, 0x013F, 0xA8A8, + 0x0140, 0xA9A8, 0x0141, 0xA8A9, 0x0142, 0xA9A9, 0x0149, 0xA9B0, + 0x014A, 0xA8AF, 0x014B, 0xA9AF, 0x0152, 0xA8AB, 0x0153, 0xA9AB, + 0x0166, 0xA8AE, 0x0167, 0xA9AE, 0x02C7, 0xA2A7, 0x02D0, 0xA2B0, + 0x02D8, 0xA2A8, 0x02D9, 0xA2AB, 0x02DA, 0xA2AA, 0x02DB, 0xA2AD, + 0x02DD, 0xA2A9, 0x0391, 0xA5C1, 0x0392, 0xA5C2, 0x0393, 0xA5C3, + 0x0394, 0xA5C4, 0x0395, 0xA5C5, 0x0396, 0xA5C6, 0x0397, 0xA5C7, + 0x0398, 0xA5C8, 0x0399, 0xA5C9, 0x039A, 0xA5CA, 0x039B, 0xA5CB, + 0x039C, 0xA5CC, 0x039D, 0xA5CD, 0x039E, 0xA5CE, 0x039F, 0xA5CF, + 0x03A0, 0xA5D0, 0x03A1, 0xA5D1, 0x03A3, 0xA5D2, 0x03A4, 0xA5D3, + 0x03A5, 0xA5D4, 0x03A6, 0xA5D5, 0x03A7, 0xA5D6, 0x03A8, 0xA5D7, + 0x03A9, 0xA5D8, 0x03B1, 0xA5E1, 0x03B2, 0xA5E2, 0x03B3, 0xA5E3, + 0x03B4, 0xA5E4, 0x03B5, 0xA5E5, 0x03B6, 0xA5E6, 0x03B7, 0xA5E7, + 0x03B8, 0xA5E8, 0x03B9, 0xA5E9, 0x03BA, 0xA5EA, 0x03BB, 0xA5EB, + 0x03BC, 0xA5EC, 0x03BD, 0xA5ED, 0x03BE, 0xA5EE, 0x03BF, 0xA5EF, + 0x03C0, 0xA5F0, 0x03C1, 0xA5F1, 0x03C3, 0xA5F2, 0x03C4, 0xA5F3, + 0x03C5, 0xA5F4, 0x03C6, 0xA5F5, 0x03C7, 0xA5F6, 0x03C8, 0xA5F7, + 0x03C9, 0xA5F8, 0x0401, 0xACA7, 0x0410, 0xACA1, 0x0411, 0xACA2, + 0x0412, 0xACA3, 0x0413, 0xACA4, 0x0414, 0xACA5, 0x0415, 0xACA6, + 0x0416, 0xACA8, 0x0417, 0xACA9, 0x0418, 0xACAA, 0x0419, 0xACAB, + 0x041A, 0xACAC, 0x041B, 0xACAD, 0x041C, 0xACAE, 0x041D, 0xACAF, + 0x041E, 0xACB0, 0x041F, 0xACB1, 0x0420, 0xACB2, 0x0421, 0xACB3, + 0x0422, 0xACB4, 0x0423, 0xACB5, 0x0424, 0xACB6, 0x0425, 0xACB7, + 0x0426, 0xACB8, 0x0427, 0xACB9, 0x0428, 0xACBA, 0x0429, 0xACBB, + 0x042A, 0xACBC, 0x042B, 0xACBD, 0x042C, 0xACBE, 0x042D, 0xACBF, + 0x042E, 0xACC0, 0x042F, 0xACC1, 0x0430, 0xACD1, 0x0431, 0xACD2, + 0x0432, 0xACD3, 0x0433, 0xACD4, 0x0434, 0xACD5, 0x0435, 0xACD6, + 0x0436, 0xACD8, 0x0437, 0xACD9, 0x0438, 0xACDA, 0x0439, 0xACDB, + 0x043A, 0xACDC, 0x043B, 0xACDD, 0x043C, 0xACDE, 0x043D, 0xACDF, + 0x043E, 0xACE0, 0x043F, 0xACE1, 0x0440, 0xACE2, 0x0441, 0xACE3, + 0x0442, 0xACE4, 0x0443, 0xACE5, 0x0444, 0xACE6, 0x0445, 0xACE7, + 0x0446, 0xACE8, 0x0447, 0xACE9, 0x0448, 0xACEA, 0x0449, 0xACEB, + 0x044A, 0xACEC, 0x044B, 0xACED, 0x044C, 0xACEE, 0x044D, 0xACEF, + 0x044E, 0xACF0, 0x044F, 0xACF1, 0x0451, 0xACD7, 0x2015, 0xA1AA, + 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1, + 0x2020, 0xA2D3, 0x2021, 0xA2D4, 0x2025, 0xA1A5, 0x2026, 0xA1A6, + 0x2030, 0xA2B6, 0x2032, 0xA1C7, 0x2033, 0xA1C8, 0x203B, 0xA1D8, + 0x2074, 0xA9F9, 0x207F, 0xA9FA, 0x2081, 0xA9FB, 0x2082, 0xA9FC, + 0x2083, 0xA9FD, 0x2084, 0xA9FE, 0x20AC, 0xA2E6, 0x2103, 0xA1C9, + 0x2109, 0xA2B5, 0x2113, 0xA7A4, 0x2116, 0xA2E0, 0x2121, 0xA2E5, + 0x2122, 0xA2E2, 0x2126, 0xA7D9, 0x212B, 0xA1CA, 0x2153, 0xA8F7, + 0x2154, 0xA8F8, 0x215B, 0xA8FB, 0x215C, 0xA8FC, 0x215D, 0xA8FD, + 0x215E, 0xA8FE, 0x2160, 0xA5B0, 0x2161, 0xA5B1, 0x2162, 0xA5B2, + 0x2163, 0xA5B3, 0x2164, 0xA5B4, 0x2165, 0xA5B5, 0x2166, 0xA5B6, + 0x2167, 0xA5B7, 0x2168, 0xA5B8, 0x2169, 0xA5B9, 0x2170, 0xA5A1, + 0x2171, 0xA5A2, 0x2172, 0xA5A3, 0x2173, 0xA5A4, 0x2174, 0xA5A5, + 0x2175, 0xA5A6, 0x2176, 0xA5A7, 0x2177, 0xA5A8, 0x2178, 0xA5A9, + 0x2179, 0xA5AA, 0x2190, 0xA1E7, 0x2191, 0xA1E8, 0x2192, 0xA1E6, + 0x2193, 0xA1E9, 0x2194, 0xA1EA, 0x2195, 0xA2D5, 0x2196, 0xA2D8, + 0x2197, 0xA2D6, 0x2198, 0xA2D9, 0x2199, 0xA2D7, 0x21D2, 0xA2A1, + 0x21D4, 0xA2A2, 0x2200, 0xA2A3, 0x2202, 0xA1D3, 0x2203, 0xA2A4, + 0x2207, 0xA1D4, 0x2208, 0xA1F4, 0x220B, 0xA1F5, 0x220F, 0xA2B3, + 0x2211, 0xA2B2, 0x221A, 0xA1EE, 0x221D, 0xA1F0, 0x221E, 0xA1C4, + 0x2220, 0xA1D0, 0x2225, 0xA1AB, 0x2227, 0xA1FC, 0x2228, 0xA1FD, + 0x2229, 0xA1FB, 0x222A, 0xA1FA, 0x222B, 0xA1F2, 0x222C, 0xA1F3, + 0x222E, 0xA2B1, 0x2234, 0xA1C5, 0x2235, 0xA1F1, 0x223C, 0xA1AD, + 0x223D, 0xA1EF, 0x2252, 0xA1D6, 0x2260, 0xA1C1, 0x2261, 0xA1D5, + 0x2264, 0xA1C2, 0x2265, 0xA1C3, 0x226A, 0xA1EC, 0x226B, 0xA1ED, + 0x2282, 0xA1F8, 0x2283, 0xA1F9, 0x2286, 0xA1F6, 0x2287, 0xA1F7, + 0x2299, 0xA2C1, 0x22A5, 0xA1D1, 0x2312, 0xA1D2, 0x2460, 0xA8E7, + 0x2461, 0xA8E8, 0x2462, 0xA8E9, 0x2463, 0xA8EA, 0x2464, 0xA8EB, + 0x2465, 0xA8EC, 0x2466, 0xA8ED, 0x2467, 0xA8EE, 0x2468, 0xA8EF, + 0x2469, 0xA8F0, 0x246A, 0xA8F1, 0x246B, 0xA8F2, 0x246C, 0xA8F3, + 0x246D, 0xA8F4, 0x246E, 0xA8F5, 0x2474, 0xA9E7, 0x2475, 0xA9E8, + 0x2476, 0xA9E9, 0x2477, 0xA9EA, 0x2478, 0xA9EB, 0x2479, 0xA9EC, + 0x247A, 0xA9ED, 0x247B, 0xA9EE, 0x247C, 0xA9EF, 0x247D, 0xA9F0, + 0x247E, 0xA9F1, 0x247F, 0xA9F2, 0x2480, 0xA9F3, 0x2481, 0xA9F4, + 0x2482, 0xA9F5, 0x249C, 0xA9CD, 0x249D, 0xA9CE, 0x249E, 0xA9CF, + 0x249F, 0xA9D0, 0x24A0, 0xA9D1, 0x24A1, 0xA9D2, 0x24A2, 0xA9D3, + 0x24A3, 0xA9D4, 0x24A4, 0xA9D5, 0x24A5, 0xA9D6, 0x24A6, 0xA9D7, + 0x24A7, 0xA9D8, 0x24A8, 0xA9D9, 0x24A9, 0xA9DA, 0x24AA, 0xA9DB, + 0x24AB, 0xA9DC, 0x24AC, 0xA9DD, 0x24AD, 0xA9DE, 0x24AE, 0xA9DF, + 0x24AF, 0xA9E0, 0x24B0, 0xA9E1, 0x24B1, 0xA9E2, 0x24B2, 0xA9E3, + 0x24B3, 0xA9E4, 0x24B4, 0xA9E5, 0x24B5, 0xA9E6, 0x24D0, 0xA8CD, + 0x24D1, 0xA8CE, 0x24D2, 0xA8CF, 0x24D3, 0xA8D0, 0x24D4, 0xA8D1, + 0x24D5, 0xA8D2, 0x24D6, 0xA8D3, 0x24D7, 0xA8D4, 0x24D8, 0xA8D5, + 0x24D9, 0xA8D6, 0x24DA, 0xA8D7, 0x24DB, 0xA8D8, 0x24DC, 0xA8D9, + 0x24DD, 0xA8DA, 0x24DE, 0xA8DB, 0x24DF, 0xA8DC, 0x24E0, 0xA8DD, + 0x24E1, 0xA8DE, 0x24E2, 0xA8DF, 0x24E3, 0xA8E0, 0x24E4, 0xA8E1, + 0x24E5, 0xA8E2, 0x24E6, 0xA8E3, 0x24E7, 0xA8E4, 0x24E8, 0xA8E5, + 0x24E9, 0xA8E6, 0x2500, 0xA6A1, 0x2501, 0xA6AC, 0x2502, 0xA6A2, + 0x2503, 0xA6AD, 0x250C, 0xA6A3, 0x250D, 0xA6C8, 0x250E, 0xA6C7, + 0x250F, 0xA6AE, 0x2510, 0xA6A4, 0x2511, 0xA6C2, 0x2512, 0xA6C1, + 0x2513, 0xA6AF, 0x2514, 0xA6A6, 0x2515, 0xA6C6, 0x2516, 0xA6C5, + 0x2517, 0xA6B1, 0x2518, 0xA6A5, 0x2519, 0xA6C4, 0x251A, 0xA6C3, + 0x251B, 0xA6B0, 0x251C, 0xA6A7, 0x251D, 0xA6BC, 0x251E, 0xA6C9, + 0x251F, 0xA6CA, 0x2520, 0xA6B7, 0x2521, 0xA6CB, 0x2522, 0xA6CC, + 0x2523, 0xA6B2, 0x2524, 0xA6A9, 0x2525, 0xA6BE, 0x2526, 0xA6CD, + 0x2527, 0xA6CE, 0x2528, 0xA6B9, 0x2529, 0xA6CF, 0x252A, 0xA6D0, + 0x252B, 0xA6B4, 0x252C, 0xA6A8, 0x252D, 0xA6D1, 0x252E, 0xA6D2, + 0x252F, 0xA6B8, 0x2530, 0xA6BD, 0x2531, 0xA6D3, 0x2532, 0xA6D4, + 0x2533, 0xA6B3, 0x2534, 0xA6AA, 0x2535, 0xA6D5, 0x2536, 0xA6D6, + 0x2537, 0xA6BA, 0x2538, 0xA6BF, 0x2539, 0xA6D7, 0x253A, 0xA6D8, + 0x253B, 0xA6B5, 0x253C, 0xA6AB, 0x253D, 0xA6D9, 0x253E, 0xA6DA, + 0x253F, 0xA6BB, 0x2540, 0xA6DB, 0x2541, 0xA6DC, 0x2542, 0xA6C0, + 0x2543, 0xA6DD, 0x2544, 0xA6DE, 0x2545, 0xA6DF, 0x2546, 0xA6E0, + 0x2547, 0xA6E1, 0x2548, 0xA6E2, 0x2549, 0xA6E3, 0x254A, 0xA6E4, + 0x254B, 0xA6B6, 0x2592, 0xA2C6, 0x25A0, 0xA1E1, 0x25A1, 0xA1E0, + 0x25A3, 0xA2C3, 0x25A4, 0xA2C7, 0x25A5, 0xA2C8, 0x25A6, 0xA2CB, + 0x25A7, 0xA2CA, 0x25A8, 0xA2C9, 0x25A9, 0xA2CC, 0x25B2, 0xA1E3, + 0x25B3, 0xA1E2, 0x25B6, 0xA2BA, 0x25B7, 0xA2B9, 0x25BC, 0xA1E5, + 0x25BD, 0xA1E4, 0x25C0, 0xA2B8, 0x25C1, 0xA2B7, 0x25C6, 0xA1DF, + 0x25C7, 0xA1DE, 0x25C8, 0xA2C2, 0x25CB, 0xA1DB, 0x25CE, 0xA1DD, + 0x25CF, 0xA1DC, 0x25D0, 0xA2C4, 0x25D1, 0xA2C5, 0x2605, 0xA1DA, + 0x2606, 0xA1D9, 0x260E, 0xA2CF, 0x260F, 0xA2CE, 0x261C, 0xA2D0, + 0x261E, 0xA2D1, 0x2640, 0xA1CF, 0x2642, 0xA1CE, 0x2660, 0xA2BC, + 0x2661, 0xA2BD, 0x2663, 0xA2C0, 0x2664, 0xA2BB, 0x2665, 0xA2BE, + 0x2667, 0xA2BF, 0x2668, 0xA2CD, 0x2669, 0xA2DB, 0x266A, 0xA2DC, + 0x266C, 0xA2DD, 0x266D, 0xA2DA, 0x3000, 0xA1A1, 0x3001, 0xA1A2, + 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3008, 0xA1B4, 0x3009, 0xA1B5, + 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, + 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BC, 0x3011, 0xA1BD, + 0x3013, 0xA1EB, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3041, 0xAAA1, + 0x3042, 0xAAA2, 0x3043, 0xAAA3, 0x3044, 0xAAA4, 0x3045, 0xAAA5, + 0x3046, 0xAAA6, 0x3047, 0xAAA7, 0x3048, 0xAAA8, 0x3049, 0xAAA9, + 0x304A, 0xAAAA, 0x304B, 0xAAAB, 0x304C, 0xAAAC, 0x304D, 0xAAAD, + 0x304E, 0xAAAE, 0x304F, 0xAAAF, 0x3050, 0xAAB0, 0x3051, 0xAAB1, + 0x3052, 0xAAB2, 0x3053, 0xAAB3, 0x3054, 0xAAB4, 0x3055, 0xAAB5, + 0x3056, 0xAAB6, 0x3057, 0xAAB7, 0x3058, 0xAAB8, 0x3059, 0xAAB9, + 0x305A, 0xAABA, 0x305B, 0xAABB, 0x305C, 0xAABC, 0x305D, 0xAABD, + 0x305E, 0xAABE, 0x305F, 0xAABF, 0x3060, 0xAAC0, 0x3061, 0xAAC1, + 0x3062, 0xAAC2, 0x3063, 0xAAC3, 0x3064, 0xAAC4, 0x3065, 0xAAC5, + 0x3066, 0xAAC6, 0x3067, 0xAAC7, 0x3068, 0xAAC8, 0x3069, 0xAAC9, + 0x306A, 0xAACA, 0x306B, 0xAACB, 0x306C, 0xAACC, 0x306D, 0xAACD, + 0x306E, 0xAACE, 0x306F, 0xAACF, 0x3070, 0xAAD0, 0x3071, 0xAAD1, + 0x3072, 0xAAD2, 0x3073, 0xAAD3, 0x3074, 0xAAD4, 0x3075, 0xAAD5, + 0x3076, 0xAAD6, 0x3077, 0xAAD7, 0x3078, 0xAAD8, 0x3079, 0xAAD9, + 0x307A, 0xAADA, 0x307B, 0xAADB, 0x307C, 0xAADC, 0x307D, 0xAADD, + 0x307E, 0xAADE, 0x307F, 0xAADF, 0x3080, 0xAAE0, 0x3081, 0xAAE1, + 0x3082, 0xAAE2, 0x3083, 0xAAE3, 0x3084, 0xAAE4, 0x3085, 0xAAE5, + 0x3086, 0xAAE6, 0x3087, 0xAAE7, 0x3088, 0xAAE8, 0x3089, 0xAAE9, + 0x308A, 0xAAEA, 0x308B, 0xAAEB, 0x308C, 0xAAEC, 0x308D, 0xAAED, + 0x308E, 0xAAEE, 0x308F, 0xAAEF, 0x3090, 0xAAF0, 0x3091, 0xAAF1, + 0x3092, 0xAAF2, 0x3093, 0xAAF3, 0x30A1, 0xABA1, 0x30A2, 0xABA2, + 0x30A3, 0xABA3, 0x30A4, 0xABA4, 0x30A5, 0xABA5, 0x30A6, 0xABA6, + 0x30A7, 0xABA7, 0x30A8, 0xABA8, 0x30A9, 0xABA9, 0x30AA, 0xABAA, + 0x30AB, 0xABAB, 0x30AC, 0xABAC, 0x30AD, 0xABAD, 0x30AE, 0xABAE, + 0x30AF, 0xABAF, 0x30B0, 0xABB0, 0x30B1, 0xABB1, 0x30B2, 0xABB2, + 0x30B3, 0xABB3, 0x30B4, 0xABB4, 0x30B5, 0xABB5, 0x30B6, 0xABB6, + 0x30B7, 0xABB7, 0x30B8, 0xABB8, 0x30B9, 0xABB9, 0x30BA, 0xABBA, + 0x30BB, 0xABBB, 0x30BC, 0xABBC, 0x30BD, 0xABBD, 0x30BE, 0xABBE, + 0x30BF, 0xABBF, 0x30C0, 0xABC0, 0x30C1, 0xABC1, 0x30C2, 0xABC2, + 0x30C3, 0xABC3, 0x30C4, 0xABC4, 0x30C5, 0xABC5, 0x30C6, 0xABC6, + 0x30C7, 0xABC7, 0x30C8, 0xABC8, 0x30C9, 0xABC9, 0x30CA, 0xABCA, + 0x30CB, 0xABCB, 0x30CC, 0xABCC, 0x30CD, 0xABCD, 0x30CE, 0xABCE, + 0x30CF, 0xABCF, 0x30D0, 0xABD0, 0x30D1, 0xABD1, 0x30D2, 0xABD2, + 0x30D3, 0xABD3, 0x30D4, 0xABD4, 0x30D5, 0xABD5, 0x30D6, 0xABD6, + 0x30D7, 0xABD7, 0x30D8, 0xABD8, 0x30D9, 0xABD9, 0x30DA, 0xABDA, + 0x30DB, 0xABDB, 0x30DC, 0xABDC, 0x30DD, 0xABDD, 0x30DE, 0xABDE, + 0x30DF, 0xABDF, 0x30E0, 0xABE0, 0x30E1, 0xABE1, 0x30E2, 0xABE2, + 0x30E3, 0xABE3, 0x30E4, 0xABE4, 0x30E5, 0xABE5, 0x30E6, 0xABE6, + 0x30E7, 0xABE7, 0x30E8, 0xABE8, 0x30E9, 0xABE9, 0x30EA, 0xABEA, + 0x30EB, 0xABEB, 0x30EC, 0xABEC, 0x30ED, 0xABED, 0x30EE, 0xABEE, + 0x30EF, 0xABEF, 0x30F0, 0xABF0, 0x30F1, 0xABF1, 0x30F2, 0xABF2, + 0x30F3, 0xABF3, 0x30F4, 0xABF4, 0x30F5, 0xABF5, 0x30F6, 0xABF6, + 0x3131, 0xA4A1, 0x3132, 0xA4A2, 0x3133, 0xA4A3, 0x3134, 0xA4A4, + 0x3135, 0xA4A5, 0x3136, 0xA4A6, 0x3137, 0xA4A7, 0x3138, 0xA4A8, + 0x3139, 0xA4A9, 0x313A, 0xA4AA, 0x313B, 0xA4AB, 0x313C, 0xA4AC, + 0x313D, 0xA4AD, 0x313E, 0xA4AE, 0x313F, 0xA4AF, 0x3140, 0xA4B0, + 0x3141, 0xA4B1, 0x3142, 0xA4B2, 0x3143, 0xA4B3, 0x3144, 0xA4B4, + 0x3145, 0xA4B5, 0x3146, 0xA4B6, 0x3147, 0xA4B7, 0x3148, 0xA4B8, + 0x3149, 0xA4B9, 0x314A, 0xA4BA, 0x314B, 0xA4BB, 0x314C, 0xA4BC, + 0x314D, 0xA4BD, 0x314E, 0xA4BE, 0x314F, 0xA4BF, 0x3150, 0xA4C0, + 0x3151, 0xA4C1, 0x3152, 0xA4C2, 0x3153, 0xA4C3, 0x3154, 0xA4C4, + 0x3155, 0xA4C5, 0x3156, 0xA4C6, 0x3157, 0xA4C7, 0x3158, 0xA4C8, + 0x3159, 0xA4C9, 0x315A, 0xA4CA, 0x315B, 0xA4CB, 0x315C, 0xA4CC, + 0x315D, 0xA4CD, 0x315E, 0xA4CE, 0x315F, 0xA4CF, 0x3160, 0xA4D0, + 0x3161, 0xA4D1, 0x3162, 0xA4D2, 0x3163, 0xA4D3, 0x3164, 0xA4D4, + 0x3165, 0xA4D5, 0x3166, 0xA4D6, 0x3167, 0xA4D7, 0x3168, 0xA4D8, + 0x3169, 0xA4D9, 0x316A, 0xA4DA, 0x316B, 0xA4DB, 0x316C, 0xA4DC, + 0x316D, 0xA4DD, 0x316E, 0xA4DE, 0x316F, 0xA4DF, 0x3170, 0xA4E0, + 0x3171, 0xA4E1, 0x3172, 0xA4E2, 0x3173, 0xA4E3, 0x3174, 0xA4E4, + 0x3175, 0xA4E5, 0x3176, 0xA4E6, 0x3177, 0xA4E7, 0x3178, 0xA4E8, + 0x3179, 0xA4E9, 0x317A, 0xA4EA, 0x317B, 0xA4EB, 0x317C, 0xA4EC, + 0x317D, 0xA4ED, 0x317E, 0xA4EE, 0x317F, 0xA4EF, 0x3180, 0xA4F0, + 0x3181, 0xA4F1, 0x3182, 0xA4F2, 0x3183, 0xA4F3, 0x3184, 0xA4F4, + 0x3185, 0xA4F5, 0x3186, 0xA4F6, 0x3187, 0xA4F7, 0x3188, 0xA4F8, + 0x3189, 0xA4F9, 0x318A, 0xA4FA, 0x318B, 0xA4FB, 0x318C, 0xA4FC, + 0x318D, 0xA4FD, 0x318E, 0xA4FE, 0x3200, 0xA9B1, 0x3201, 0xA9B2, + 0x3202, 0xA9B3, 0x3203, 0xA9B4, 0x3204, 0xA9B5, 0x3205, 0xA9B6, + 0x3206, 0xA9B7, 0x3207, 0xA9B8, 0x3208, 0xA9B9, 0x3209, 0xA9BA, + 0x320A, 0xA9BB, 0x320B, 0xA9BC, 0x320C, 0xA9BD, 0x320D, 0xA9BE, + 0x320E, 0xA9BF, 0x320F, 0xA9C0, 0x3210, 0xA9C1, 0x3211, 0xA9C2, + 0x3212, 0xA9C3, 0x3213, 0xA9C4, 0x3214, 0xA9C5, 0x3215, 0xA9C6, + 0x3216, 0xA9C7, 0x3217, 0xA9C8, 0x3218, 0xA9C9, 0x3219, 0xA9CA, + 0x321A, 0xA9CB, 0x321B, 0xA9CC, 0x321C, 0xA2DF, 0x3260, 0xA8B1, + 0x3261, 0xA8B2, 0x3262, 0xA8B3, 0x3263, 0xA8B4, 0x3264, 0xA8B5, + 0x3265, 0xA8B6, 0x3266, 0xA8B7, 0x3267, 0xA8B8, 0x3268, 0xA8B9, + 0x3269, 0xA8BA, 0x326A, 0xA8BB, 0x326B, 0xA8BC, 0x326C, 0xA8BD, + 0x326D, 0xA8BE, 0x326E, 0xA8BF, 0x326F, 0xA8C0, 0x3270, 0xA8C1, + 0x3271, 0xA8C2, 0x3272, 0xA8C3, 0x3273, 0xA8C4, 0x3274, 0xA8C5, + 0x3275, 0xA8C6, 0x3276, 0xA8C7, 0x3277, 0xA8C8, 0x3278, 0xA8C9, + 0x3279, 0xA8CA, 0x327A, 0xA8CB, 0x327B, 0xA8CC, 0x327F, 0xA2DE, + 0x3380, 0xA7C9, 0x3381, 0xA7CA, 0x3382, 0xA7CB, 0x3383, 0xA7CC, + 0x3384, 0xA7CD, 0x3388, 0xA7BA, 0x3389, 0xA7BB, 0x338A, 0xA7DC, + 0x338B, 0xA7DD, 0x338C, 0xA7DE, 0x338D, 0xA7B6, 0x338E, 0xA7B7, + 0x338F, 0xA7B8, 0x3390, 0xA7D4, 0x3391, 0xA7D5, 0x3392, 0xA7D6, + 0x3393, 0xA7D7, 0x3394, 0xA7D8, 0x3395, 0xA7A1, 0x3396, 0xA7A2, + 0x3397, 0xA7A3, 0x3398, 0xA7A5, 0x3399, 0xA7AB, 0x339A, 0xA7AC, + 0x339B, 0xA7AD, 0x339C, 0xA7AE, 0x339D, 0xA7AF, 0x339E, 0xA7B0, + 0x339F, 0xA7B1, 0x33A0, 0xA7B2, 0x33A1, 0xA7B3, 0x33A2, 0xA7B4, + 0x33A3, 0xA7A7, 0x33A4, 0xA7A8, 0x33A5, 0xA7A9, 0x33A6, 0xA7AA, + 0x33A7, 0xA7BD, 0x33A8, 0xA7BE, 0x33A9, 0xA7E5, 0x33AA, 0xA7E6, + 0x33AB, 0xA7E7, 0x33AC, 0xA7E8, 0x33AD, 0xA7E1, 0x33AE, 0xA7E2, + 0x33AF, 0xA7E3, 0x33B0, 0xA7BF, 0x33B1, 0xA7C0, 0x33B2, 0xA7C1, + 0x33B3, 0xA7C2, 0x33B4, 0xA7C3, 0x33B5, 0xA7C4, 0x33B6, 0xA7C5, + 0x33B7, 0xA7C6, 0x33B8, 0xA7C7, 0x33B9, 0xA7C8, 0x33BA, 0xA7CE, + 0x33BB, 0xA7CF, 0x33BC, 0xA7D0, 0x33BD, 0xA7D1, 0x33BE, 0xA7D2, + 0x33BF, 0xA7D3, 0x33C0, 0xA7DA, 0x33C1, 0xA7DB, 0x33C2, 0xA2E3, + 0x33C3, 0xA7EC, 0x33C4, 0xA7A6, 0x33C5, 0xA7E0, 0x33C6, 0xA7EF, + 0x33C7, 0xA2E1, 0x33C8, 0xA7BC, 0x33C9, 0xA7ED, 0x33CA, 0xA7B5, + 0x33CF, 0xA7B9, 0x33D0, 0xA7EA, 0x33D3, 0xA7EB, 0x33D6, 0xA7DF, + 0x33D8, 0xA2E4, 0x33DB, 0xA7E4, 0x33DC, 0xA7EE, 0x33DD, 0xA7E9, + 0x4E00, 0xECE9, 0x4E01, 0xEFCB, 0x4E03, 0xF6D2, 0x4E07, 0xD8B2, + 0x4E08, 0xEDDB, 0x4E09, 0xDFB2, 0x4E0A, 0xDFBE, 0x4E0B, 0xF9BB, + 0x4E0D, 0xDCF4, 0x4E11, 0xF5E4, 0x4E14, 0xF3A6, 0x4E15, 0xDDE0, + 0x4E16, 0xE1A6, 0x4E18, 0xCEF8, 0x4E19, 0xDCB0, 0x4E1E, 0xE3AA, + 0x4E2D, 0xF1E9, 0x4E32, 0xCDFA, 0x4E38, 0xFCAF, 0x4E39, 0xD3A1, + 0x4E3B, 0xF1AB, 0x4E42, 0xE7D1, 0x4E43, 0xD2AC, 0x4E45, 0xCEF9, + 0x4E4B, 0xF1FD, 0x4E4D, 0xDEBF, 0x4E4E, 0xFBBA, 0x4E4F, 0xF9B9, + 0x4E56, 0xCED2, 0x4E58, 0xE3AB, 0x4E59, 0xEBE0, 0x4E5D, 0xCEFA, + 0x4E5E, 0xCBF7, 0x4E5F, 0xE5A5, 0x4E6B, 0xCAE1, 0x4E6D, 0xD4CC, + 0x4E73, 0xEAE1, 0x4E76, 0xDCE3, 0x4E77, 0xDFAD, 0x4E7E, 0xCBEB, + 0x4E82, 0xD5AF, 0x4E86, 0xD6F5, 0x4E88, 0xE5F8, 0x4E8B, 0xDEC0, + 0x4E8C, 0xECA3, 0x4E8E, 0xE9CD, 0x4E90, 0xEAA7, 0x4E91, 0xE9F6, + 0x4E92, 0xFBBB, 0x4E94, 0xE7E9, 0x4E95, 0xEFCC, 0x4E98, 0xD0E6, + 0x4E9B, 0xDEC1, 0x4E9E, 0xE4AC, 0x4EA1, 0xD8CC, 0x4EA2, 0xF9F1, + 0x4EA4, 0xCEDF, 0x4EA5, 0xFAA4, 0x4EA6, 0xE6B2, 0x4EA8, 0xFAFB, + 0x4EAB, 0xFABD, 0x4EAC, 0xCCC8, 0x4EAD, 0xEFCD, 0x4EAE, 0xD5D5, + 0x4EB6, 0xD3A2, 0x4EBA, 0xECD1, 0x4EC0, 0xE4A7, 0x4EC1, 0xECD2, + 0x4EC4, 0xF6B1, 0x4EC7, 0xCEFB, 0x4ECA, 0xD0D1, 0x4ECB, 0xCBBF, + 0x4ECD, 0xEDA4, 0x4ED4, 0xEDA8, 0x4ED5, 0xDEC2, 0x4ED6, 0xF6E2, + 0x4ED7, 0xEDDC, 0x4ED8, 0xDCF5, 0x4ED9, 0xE0B9, 0x4EDD, 0xD4CE, + 0x4EDF, 0xF4B5, 0x4EE3, 0xD3DB, 0x4EE4, 0xD6B5, 0x4EE5, 0xECA4, + 0x4EF0, 0xE4E6, 0x4EF2, 0xF1EA, 0x4EF6, 0xCBEC, 0x4EF7, 0xCBC0, + 0x4EFB, 0xECF2, 0x4F01, 0xD0EA, 0x4F09, 0xF9F2, 0x4F0A, 0xECA5, + 0x4F0B, 0xD0DF, 0x4F0D, 0xE7EA, 0x4F0E, 0xD0EB, 0x4F0F, 0xDCD1, + 0x4F10, 0xDBE9, 0x4F11, 0xFDCC, 0x4F2F, 0xDBD7, 0x4F34, 0xDAE1, + 0x4F36, 0xD6B6, 0x4F38, 0xE3DF, 0x4F3A, 0xDEC3, 0x4F3C, 0xDEC4, + 0x4F3D, 0xCAA1, 0x4F43, 0xEEEC, 0x4F46, 0xD3A3, 0x4F47, 0xEEB7, + 0x4F48, 0xF8CF, 0x4F4D, 0xEAC8, 0x4F4E, 0xEEB8, 0x4F4F, 0xF1AC, + 0x4F50, 0xF1A5, 0x4F51, 0xE9CE, 0x4F55, 0xF9BC, 0x4F59, 0xE5F9, + 0x4F5A, 0xECEA, 0x4F5B, 0xDDD6, 0x4F5C, 0xEDC2, 0x4F69, 0xF8A5, + 0x4F6F, 0xE5BA, 0x4F70, 0xDBD8, 0x4F73, 0xCAA2, 0x4F76, 0xD1CD, + 0x4F7A, 0xEEED, 0x4F7E, 0xECEB, 0x4F7F, 0xDEC5, 0x4F81, 0xE3E0, + 0x4F83, 0xCAC9, 0x4F84, 0xF2E9, 0x4F86, 0xD5CE, 0x4F88, 0xF6B6, + 0x4F8A, 0xCEC2, 0x4F8B, 0xD6C7, 0x4F8D, 0xE3B4, 0x4F8F, 0xF1AD, + 0x4F91, 0xEAE2, 0x4F96, 0xD7C2, 0x4F98, 0xF3A7, 0x4F9B, 0xCDEA, + 0x4F9D, 0xEBEE, 0x4FAE, 0xD9B2, 0x4FAF, 0xFDA5, 0x4FB5, 0xF6D5, + 0x4FB6, 0xD5E2, 0x4FBF, 0xF8B5, 0x4FC2, 0xCCF5, 0x4FC3, 0xF5B5, + 0x4FC4, 0xE4AD, 0x4FC9, 0xE7EB, 0x4FCA, 0xF1D5, 0x4FCE, 0xF0BB, + 0x4FD1, 0xE9B5, 0x4FD3, 0xCCC9, 0x4FD4, 0xFAD5, 0x4FD7, 0xE1D4, + 0x4FDA, 0xD7D6, 0x4FDD, 0xDCC1, 0x4FDF, 0xDEC6, 0x4FE0, 0xFAEF, + 0x4FE1, 0xE3E1, 0x4FEE, 0xE1F3, 0x4FEF, 0xDCF6, 0x4FF1, 0xCEFC, + 0x4FF3, 0xDBC4, 0x4FF5, 0xF8F1, 0x4FF8, 0xDCE4, 0x4FFA, 0xE5EF, + 0x5002, 0xDCB1, 0x5006, 0xD5D6, 0x5009, 0xF3DA, 0x500B, 0xCBC1, + 0x500D, 0xDBC3, 0x5011, 0xD9FA, 0x5012, 0xD3EE, 0x5016, 0xFAB8, + 0x5019, 0xFDA6, 0x501A, 0xEBEF, 0x501C, 0xF4A6, 0x501E, 0xCCCA, + 0x501F, 0xF3A8, 0x5021, 0xF3DB, 0x5023, 0xDBA7, 0x5024, 0xF6B7, + 0x5026, 0xCFE6, 0x5027, 0xF0F2, 0x5028, 0xCBDA, 0x502A, 0xE7D2, + 0x502B, 0xD7C3, 0x502C, 0xF6F0, 0x502D, 0xE8DE, 0x503B, 0xE5A6, + 0x5043, 0xE5E7, 0x5047, 0xCAA3, 0x5048, 0xCCA7, 0x5049, 0xEAC9, + 0x504F, 0xF8B6, 0x5055, 0xFAA5, 0x505A, 0xF1AE, 0x505C, 0xEFCE, + 0x5065, 0xCBED, 0x5074, 0xF6B0, 0x5075, 0xEFCF, 0x5076, 0xE9CF, + 0x5078, 0xF7DE, 0x5080, 0xCED3, 0x5085, 0xDCF7, 0x508D, 0xDBA8, + 0x5091, 0xCBF8, 0x5098, 0xDFA1, 0x5099, 0xDDE1, 0x50AC, 0xF5CA, + 0x50AD, 0xE9B6, 0x50B2, 0xE7EC, 0x50B3, 0xEEEE, 0x50B5, 0xF3F0, + 0x50B7, 0xDFBF, 0x50BE, 0xCCCB, 0x50C5, 0xD0C1, 0x50C9, 0xF4D2, + 0x50CA, 0xE0BA, 0x50CF, 0xDFC0, 0x50D1, 0xCEE0, 0x50D5, 0xDCD2, + 0x50D6, 0xFDEA, 0x50DA, 0xD6F6, 0x50DE, 0xEACA, 0x50E5, 0xE8E9, + 0x50E7, 0xE3AC, 0x50ED, 0xF3D0, 0x50F9, 0xCAA4, 0x50FB, 0xDBF8, + 0x50FF, 0xDEC7, 0x5100, 0xEBF0, 0x5101, 0xF1D6, 0x5104, 0xE5E2, + 0x5106, 0xCCCC, 0x5109, 0xCBFB, 0x5112, 0xEAE3, 0x511F, 0xDFC1, + 0x5121, 0xD6ED, 0x512A, 0xE9D0, 0x5132, 0xEEB9, 0x5137, 0xD5E3, + 0x513A, 0xD1D3, 0x513C, 0xE5F0, 0x5140, 0xE8B4, 0x5141, 0xEBC3, + 0x5143, 0xEAAA, 0x5144, 0xFAFC, 0x5145, 0xF5F6, 0x5146, 0xF0BC, + 0x5147, 0xFDD4, 0x5148, 0xE0BB, 0x5149, 0xCEC3, 0x514B, 0xD0BA, + 0x514C, 0xF7BA, 0x514D, 0xD8F3, 0x514E, 0xF7CD, 0x5152, 0xE4AE, + 0x515C, 0xD4DF, 0x5162, 0xD0E7, 0x5165, 0xECFD, 0x5167, 0xD2AE, + 0x5168, 0xEEEF, 0x5169, 0xD5D7, 0x516A, 0xEAE4, 0x516B, 0xF8A2, + 0x516C, 0xCDEB, 0x516D, 0xD7BF, 0x516E, 0xFBB1, 0x5171, 0xCDEC, + 0x5175, 0xDCB2, 0x5176, 0xD0EC, 0x5177, 0xCEFD, 0x5178, 0xEEF0, + 0x517C, 0xCCC2, 0x5180, 0xD0ED, 0x5186, 0xE5F7, 0x518A, 0xF3FC, + 0x518D, 0xEEA2, 0x5192, 0xD9B3, 0x5195, 0xD8F4, 0x5197, 0xE9B7, + 0x51A0, 0xCEAE, 0x51A5, 0xD9A2, 0x51AA, 0xD8F1, 0x51AC, 0xD4CF, + 0x51B6, 0xE5A7, 0x51B7, 0xD5D2, 0x51BD, 0xD6A9, 0x51C4, 0xF4A2, + 0x51C6, 0xF1D7, 0x51C9, 0xD5D8, 0x51CB, 0xF0BD, 0x51CC, 0xD7D0, + 0x51CD, 0xD4D0, 0x51DC, 0xD7CF, 0x51DD, 0xEBEA, 0x51DE, 0xFDEB, + 0x51E1, 0xDBED, 0x51F0, 0xFCC5, 0x51F1, 0xCBC2, 0x51F6, 0xFDD5, + 0x51F8, 0xF4C8, 0x51F9, 0xE8EA, 0x51FA, 0xF5F3, 0x51FD, 0xF9DE, + 0x5200, 0xD3EF, 0x5203, 0xECD3, 0x5206, 0xDDC2, 0x5207, 0xEFB7, + 0x5208, 0xE7D4, 0x520A, 0xCACA, 0x520E, 0xD9FB, 0x5211, 0xFAFD, + 0x5217, 0xD6AA, 0x521D, 0xF4F8, 0x5224, 0xF7F7, 0x5225, 0xDCAC, + 0x5229, 0xD7D7, 0x522A, 0xDFA2, 0x522E, 0xCEBE, 0x5230, 0xD3F0, + 0x5236, 0xF0A4, 0x5237, 0xE1EC, 0x5238, 0xCFE7, 0x5239, 0xF3CB, + 0x523A, 0xEDA9, 0x523B, 0xCABE, 0x5243, 0xF4EF, 0x5247, 0xF6CE, + 0x524A, 0xDEFB, 0x524B, 0xD0BB, 0x524C, 0xD5B7, 0x524D, 0xEEF1, + 0x5254, 0xF4A8, 0x5256, 0xDCF8, 0x525B, 0xCBA7, 0x525D, 0xDACE, + 0x5261, 0xE0E6, 0x5269, 0xEDA5, 0x526A, 0xEEF2, 0x526F, 0xDCF9, + 0x5272, 0xF9DC, 0x5275, 0xF3DC, 0x527D, 0xF8F2, 0x527F, 0xF4F9, + 0x5283, 0xFCF1, 0x5287, 0xD0BC, 0x5288, 0xDBF9, 0x5289, 0xD7B1, + 0x528D, 0xCBFC, 0x5291, 0xF0A5, 0x5292, 0xCBFD, 0x529B, 0xD5F4, + 0x529F, 0xCDED, 0x52A0, 0xCAA5, 0x52A3, 0xD6AB, 0x52A4, 0xD0C2, + 0x52A9, 0xF0BE, 0x52AA, 0xD2BD, 0x52AB, 0xCCA4, 0x52BE, 0xFAB6, + 0x52C1, 0xCCCD, 0x52C3, 0xDAFA, 0x52C5, 0xF6CF, 0x52C7, 0xE9B8, + 0x52C9, 0xD8F5, 0x52CD, 0xCCCE, 0x52D2, 0xD7CD, 0x52D5, 0xD4D1, + 0x52D6, 0xE9ED, 0x52D8, 0xCAEB, 0x52D9, 0xD9E2, 0x52DB, 0xFDB2, + 0x52DD, 0xE3AD, 0x52DE, 0xD6CC, 0x52DF, 0xD9B4, 0x52E2, 0xE1A7, + 0x52E3, 0xEED3, 0x52E4, 0xD0C3, 0x52F3, 0xFDB3, 0x52F5, 0xD5E4, + 0x52F8, 0xCFE8, 0x52FA, 0xEDC3, 0x52FB, 0xD0B2, 0x52FE, 0xCEFE, + 0x52FF, 0xDAA8, 0x5305, 0xF8D0, 0x5308, 0xFDD6, 0x530D, 0xF8D1, + 0x530F, 0xF8D2, 0x5310, 0xDCD3, 0x5315, 0xDDE2, 0x5316, 0xFBF9, + 0x5317, 0xDDC1, 0x5319, 0xE3B5, 0x5320, 0xEDDD, 0x5321, 0xCEC4, + 0x5323, 0xCBA1, 0x532A, 0xDDE3, 0x532F, 0xFCDD, 0x5339, 0xF9AF, + 0x533F, 0xD2FB, 0x5340, 0xCFA1, 0x5341, 0xE4A8, 0x5343, 0xF4B6, + 0x5344, 0xECFE, 0x5347, 0xE3AE, 0x5348, 0xE7ED, 0x5349, 0xFDC1, + 0x534A, 0xDAE2, 0x534D, 0xD8B3, 0x5351, 0xDDE4, 0x5352, 0xF0EF, + 0x5353, 0xF6F1, 0x5354, 0xFAF0, 0x5357, 0xD1F5, 0x535A, 0xDACF, + 0x535C, 0xDCD4, 0x535E, 0xDCA6, 0x5360, 0xEFBF, 0x5366, 0xCECF, + 0x5368, 0xE0D9, 0x536F, 0xD9D6, 0x5370, 0xECD4, 0x5371, 0xEACB, + 0x5374, 0xCABF, 0x5375, 0xD5B0, 0x5377, 0xCFE9, 0x537D, 0xF1ED, + 0x537F, 0xCCCF, 0x5384, 0xE4F8, 0x5393, 0xE4ED, 0x5398, 0xD7D8, + 0x539A, 0xFDA7, 0x539F, 0xEAAB, 0x53A0, 0xF6B2, 0x53A5, 0xCFF0, + 0x53A6, 0xF9BD, 0x53AD, 0xE6F4, 0x53BB, 0xCBDB, 0x53C3, 0xF3D1, + 0x53C8, 0xE9D1, 0x53C9, 0xF3A9, 0x53CA, 0xD0E0, 0x53CB, 0xE9D2, + 0x53CD, 0xDAE3, 0x53D4, 0xE2D2, 0x53D6, 0xF6A2, 0x53D7, 0xE1F4, + 0x53DB, 0xDAE4, 0x53E1, 0xE7D5, 0x53E2, 0xF5BF, 0x53E3, 0xCFA2, + 0x53E4, 0xCDAF, 0x53E5, 0xCFA3, 0x53E9, 0xCDB0, 0x53EA, 0xF1FE, + 0x53EB, 0xD0A3, 0x53EC, 0xE1AF, 0x53ED, 0xF8A3, 0x53EF, 0xCAA6, + 0x53F0, 0xF7BB, 0x53F1, 0xF2EA, 0x53F2, 0xDEC8, 0x53F3, 0xE9D3, + 0x53F8, 0xDEC9, 0x5403, 0xFDDE, 0x5404, 0xCAC0, 0x5408, 0xF9EA, + 0x5409, 0xD1CE, 0x540A, 0xEED4, 0x540C, 0xD4D2, 0x540D, 0xD9A3, + 0x540E, 0xFDA8, 0x540F, 0xD7D9, 0x5410, 0xF7CE, 0x5411, 0xFABE, + 0x541B, 0xCFD6, 0x541D, 0xD7F0, 0x541F, 0xEBE1, 0x5420, 0xF8C5, + 0x5426, 0xDCFA, 0x5429, 0xDDC3, 0x542B, 0xF9DF, 0x5433, 0xE7EF, + 0x5438, 0xFDE5, 0x5439, 0xF6A3, 0x543B, 0xD9FC, 0x543C, 0xFDA9, + 0x543E, 0xE7EE, 0x5442, 0xD5E5, 0x5448, 0xEFD0, 0x544A, 0xCDB1, + 0x5451, 0xF7A2, 0x5468, 0xF1B2, 0x546A, 0xF1B1, 0x5471, 0xCDB2, + 0x5473, 0xDAAB, 0x5475, 0xCAA7, 0x547B, 0xE3E2, 0x547C, 0xFBBC, + 0x547D, 0xD9A4, 0x5480, 0xEEBA, 0x5486, 0xF8D3, 0x548C, 0xFBFA, + 0x548E, 0xCFA4, 0x5490, 0xDCFB, 0x54A4, 0xF6E3, 0x54A8, 0xEDAA, + 0x54AB, 0xF2A1, 0x54AC, 0xCEE1, 0x54B3, 0xFAA6, 0x54B8, 0xF9E0, + 0x54BD, 0xECD6, 0x54C0, 0xE4EE, 0x54C1, 0xF9A1, 0x54C4, 0xFBEF, + 0x54C8, 0xF9EB, 0x54C9, 0xEEA3, 0x54E1, 0xEAAC, 0x54E5, 0xCAA8, + 0x54E8, 0xF4FA, 0x54ED, 0xCDD6, 0x54EE, 0xFCF6, 0x54F2, 0xF4C9, + 0x54FA, 0xF8D4, 0x5504, 0xF8A6, 0x5506, 0xDECA, 0x5507, 0xF2C6, + 0x550E, 0xD7DA, 0x5510, 0xD3D0, 0x551C, 0xD8C5, 0x552F, 0xEAE6, + 0x5531, 0xF3DD, 0x5535, 0xE4DA, 0x553E, 0xF6E4, 0x5544, 0xF6F2, + 0x5546, 0xDFC2, 0x554F, 0xD9FD, 0x5553, 0xCCF6, 0x5556, 0xD3BA, + 0x555E, 0xE4AF, 0x5563, 0xF9E1, 0x557C, 0xF0A6, 0x5580, 0xCBD3, + 0x5584, 0xE0BC, 0x5586, 0xF4CA, 0x5587, 0xD4FA, 0x5589, 0xFDAA, + 0x558A, 0xF9E2, 0x5598, 0xF4B7, 0x5599, 0xFDC2, 0x559A, 0xFCB0, + 0x559C, 0xFDEC, 0x559D, 0xCAE2, 0x55A7, 0xFDBD, 0x55A9, 0xEAE7, + 0x55AA, 0xDFC3, 0x55AB, 0xD1D2, 0x55AC, 0xCEE2, 0x55AE, 0xD3A4, + 0x55C5, 0xFDAB, 0x55C7, 0xDFE0, 0x55D4, 0xF2C7, 0x55DA, 0xE7F0, + 0x55DC, 0xD0EE, 0x55DF, 0xF3AA, 0x55E3, 0xDECB, 0x55E4, 0xF6B8, + 0x55FD, 0xE1F5, 0x55FE, 0xF1B3, 0x5606, 0xF7A3, 0x5609, 0xCAA9, + 0x5614, 0xCFA5, 0x5617, 0xDFC4, 0x562F, 0xE1B0, 0x5632, 0xF0BF, + 0x5634, 0xF6A4, 0x5636, 0xE3B6, 0x5653, 0xFAC6, 0x5668, 0xD0EF, + 0x566B, 0xFDED, 0x5674, 0xDDC4, 0x5686, 0xFCF7, 0x56A5, 0xE6BF, + 0x56AC, 0xDEAD, 0x56AE, 0xFABF, 0x56B4, 0xE5F1, 0x56BC, 0xEDC4, + 0x56CA, 0xD2A5, 0x56CD, 0xFDEE, 0x56D1, 0xF5B6, 0x56DA, 0xE1F6, + 0x56DB, 0xDECC, 0x56DE, 0xFCDE, 0x56E0, 0xECD7, 0x56F0, 0xCDDD, + 0x56F9, 0xD6B7, 0x56FA, 0xCDB3, 0x5703, 0xF8D5, 0x5704, 0xE5D8, + 0x5708, 0xCFEA, 0x570B, 0xCFD0, 0x570D, 0xEACC, 0x5712, 0xEAAE, + 0x5713, 0xEAAD, 0x5716, 0xD3F1, 0x5718, 0xD3A5, 0x571F, 0xF7CF, + 0x5728, 0xEEA4, 0x572D, 0xD0A4, 0x5730, 0xF2A2, 0x573B, 0xD0F0, + 0x5740, 0xF2A3, 0x5742, 0xF7F8, 0x5747, 0xD0B3, 0x574A, 0xDBA9, + 0x574D, 0xD3BB, 0x574E, 0xCAEC, 0x5750, 0xF1A6, 0x5751, 0xCBD5, + 0x5761, 0xF7E7, 0x5764, 0xCDDE, 0x5766, 0xF7A4, 0x576A, 0xF8C0, + 0x576E, 0xD3DD, 0x5770, 0xCCD0, 0x5775, 0xCFA6, 0x577C, 0xF6F3, + 0x5782, 0xE1F7, 0x5788, 0xD3DC, 0x578B, 0xFAFE, 0x5793, 0xFAA7, + 0x57A0, 0xEBD9, 0x57A2, 0xCFA7, 0x57A3, 0xEAAF, 0x57C3, 0xE4EF, + 0x57C7, 0xE9B9, 0x57C8, 0xF1D8, 0x57CB, 0xD8D8, 0x57CE, 0xE0F2, + 0x57DF, 0xE6B4, 0x57E0, 0xDCFC, 0x57F0, 0xF3F1, 0x57F4, 0xE3D0, + 0x57F7, 0xF2FB, 0x57F9, 0xDBC6, 0x57FA, 0xD0F1, 0x57FC, 0xD0F2, + 0x5800, 0xCFDC, 0x5802, 0xD3D1, 0x5805, 0xCCB1, 0x5806, 0xF7D8, + 0x5808, 0xCBA8, 0x5809, 0xEBBC, 0x580A, 0xE4BE, 0x581E, 0xF4DC, + 0x5821, 0xDCC2, 0x5824, 0xF0A7, 0x5827, 0xE6C0, 0x582A, 0xCAED, + 0x582F, 0xE8EB, 0x5830, 0xE5E8, 0x5831, 0xDCC3, 0x5834, 0xEDDE, + 0x5835, 0xD3F2, 0x583A, 0xCCF7, 0x584A, 0xCED4, 0x584B, 0xE7AB, + 0x584F, 0xCBC3, 0x5851, 0xE1B1, 0x5854, 0xF7B2, 0x5857, 0xD3F3, + 0x5858, 0xD3D2, 0x585A, 0xF5C0, 0x585E, 0xDFDD, 0x5861, 0xEEF3, + 0x5862, 0xE7F1, 0x5864, 0xFDB4, 0x5875, 0xF2C8, 0x5879, 0xF3D2, + 0x587C, 0xEEF4, 0x587E, 0xE2D3, 0x5883, 0xCCD1, 0x5885, 0xDFEA, + 0x5889, 0xE9BA, 0x5893, 0xD9D7, 0x589C, 0xF5CD, 0x589E, 0xF1F2, + 0x589F, 0xFAC7, 0x58A8, 0xD9F8, 0x58A9, 0xD4C2, 0x58AE, 0xF6E5, + 0x58B3, 0xDDC5, 0x58BA, 0xE7F2, 0x58BB, 0xEDDF, 0x58BE, 0xCACB, + 0x58C1, 0xDBFA, 0x58C5, 0xE8B5, 0x58C7, 0xD3A6, 0x58CE, 0xFDB5, + 0x58D1, 0xF9C9, 0x58D3, 0xE4E2, 0x58D5, 0xFBBD, 0x58D8, 0xD7A4, + 0x58D9, 0xCEC5, 0x58DE, 0xCED5, 0x58DF, 0xD6E6, 0x58E4, 0xE5BD, + 0x58EB, 0xDECD, 0x58EC, 0xECF3, 0x58EF, 0xEDE0, 0x58F9, 0xECEC, + 0x58FA, 0xFBBE, 0x58FB, 0xDFEB, 0x58FD, 0xE1F8, 0x590F, 0xF9BE, + 0x5914, 0xD0F3, 0x5915, 0xE0AA, 0x5916, 0xE8E2, 0x5919, 0xE2D4, + 0x591A, 0xD2FD, 0x591C, 0xE5A8, 0x5922, 0xD9D3, 0x5927, 0xD3DE, + 0x5929, 0xF4B8, 0x592A, 0xF7BC, 0x592B, 0xDCFD, 0x592D, 0xE8EC, + 0x592E, 0xE4E7, 0x5931, 0xE3F7, 0x5937, 0xECA8, 0x593E, 0xFAF1, + 0x5944, 0xE5F2, 0x5947, 0xD0F4, 0x5948, 0xD2AF, 0x5949, 0xDCE5, + 0x594E, 0xD0A5, 0x594F, 0xF1B4, 0x5950, 0xFCB1, 0x5951, 0xCCF8, + 0x5954, 0xDDC6, 0x5955, 0xFAD1, 0x5957, 0xF7DF, 0x595A, 0xFAA8, + 0x5960, 0xEEF5, 0x5962, 0xDECE, 0x5967, 0xE7F3, 0x596A, 0xF7AC, + 0x596B, 0xEBC4, 0x596C, 0xEDE1, 0x596D, 0xE0AB, 0x596E, 0xDDC7, + 0x5973, 0xD2B3, 0x5974, 0xD2BF, 0x5978, 0xCACC, 0x597D, 0xFBBF, + 0x5982, 0xE5FD, 0x5983, 0xDDE5, 0x5984, 0xD8CD, 0x598A, 0xECF4, + 0x5993, 0xD0F5, 0x5996, 0xE8ED, 0x5997, 0xD0D2, 0x5999, 0xD9D8, + 0x59A5, 0xF6E6, 0x59A8, 0xDBAA, 0x59AC, 0xF7E0, 0x59B9, 0xD8D9, + 0x59BB, 0xF4A3, 0x59BE, 0xF4DD, 0x59C3, 0xEFD1, 0x59C6, 0xD9B5, + 0x59C9, 0xEDAB, 0x59CB, 0xE3B7, 0x59D0, 0xEEBB, 0x59D1, 0xCDB4, + 0x59D3, 0xE0F3, 0x59D4, 0xEACD, 0x59D9, 0xECF5, 0x59DA, 0xE8EE, + 0x59DC, 0xCBA9, 0x59DD, 0xF1AF, 0x59E6, 0xCACD, 0x59E8, 0xECA9, + 0x59EA, 0xF2EB, 0x59EC, 0xFDEF, 0x59EE, 0xF9F3, 0x59F8, 0xE6C1, + 0x59FB, 0xECD8, 0x59FF, 0xEDAC, 0x5A01, 0xEACE, 0x5A03, 0xE8DF, + 0x5A11, 0xDECF, 0x5A18, 0xD2A6, 0x5A1B, 0xE7F4, 0x5A1C, 0xD1D6, + 0x5A1F, 0xE6C2, 0x5A20, 0xE3E3, 0x5A25, 0xE4B0, 0x5A29, 0xD8B4, + 0x5A36, 0xF6A5, 0x5A3C, 0xF3DE, 0x5A41, 0xD7A5, 0x5A46, 0xF7E8, + 0x5A49, 0xE8C6, 0x5A5A, 0xFBE6, 0x5A62, 0xDDE6, 0x5A66, 0xDCFE, + 0x5A92, 0xD8DA, 0x5A9A, 0xDAAC, 0x5A9B, 0xEAB0, 0x5AA4, 0xE3B8, + 0x5AC1, 0xCAAA, 0x5AC2, 0xE1F9, 0x5AC4, 0xEAB1, 0x5AC9, 0xF2EC, + 0x5ACC, 0xFAEE, 0x5AE1, 0xEED5, 0x5AE6, 0xF9F4, 0x5AE9, 0xD2EC, + 0x5B05, 0xFBFB, 0x5B09, 0xFDF0, 0x5B0B, 0xE0BD, 0x5B0C, 0xCEE3, + 0x5B16, 0xF8C6, 0x5B2A, 0xDEAE, 0x5B40, 0xDFC5, 0x5B43, 0xE5BE, + 0x5B50, 0xEDAD, 0x5B51, 0xFAEA, 0x5B54, 0xCDEE, 0x5B55, 0xEDA6, + 0x5B57, 0xEDAE, 0x5B58, 0xF0ED, 0x5B5A, 0xDDA1, 0x5B5C, 0xEDAF, + 0x5B5D, 0xFCF8, 0x5B5F, 0xD8EB, 0x5B63, 0xCCF9, 0x5B64, 0xCDB5, + 0x5B69, 0xFAA9, 0x5B6B, 0xE1DD, 0x5B70, 0xE2D5, 0x5B71, 0xEDCF, + 0x5B75, 0xDDA2, 0x5B78, 0xF9CA, 0x5B7A, 0xEAE8, 0x5B7C, 0xE5ED, + 0x5B85, 0xD3EB, 0x5B87, 0xE9D4, 0x5B88, 0xE1FA, 0x5B89, 0xE4CC, + 0x5B8B, 0xE1E4, 0x5B8C, 0xE8C7, 0x5B8F, 0xCEDB, 0x5B93, 0xDCD5, + 0x5B95, 0xF7B5, 0x5B96, 0xFCF3, 0x5B97, 0xF0F3, 0x5B98, 0xCEAF, + 0x5B99, 0xF1B5, 0x5B9A, 0xEFD2, 0x5B9B, 0xE8C8, 0x5B9C, 0xEBF1, + 0x5BA2, 0xCBD4, 0x5BA3, 0xE0BE, 0x5BA4, 0xE3F8, 0x5BA5, 0xEAE9, + 0x5BA6, 0xFCB2, 0x5BAC, 0xE0F4, 0x5BAE, 0xCFE0, 0x5BB0, 0xEEA5, + 0x5BB3, 0xFAAA, 0x5BB4, 0xE6C3, 0x5BB5, 0xE1B2, 0x5BB6, 0xCAAB, + 0x5BB8, 0xE3E4, 0x5BB9, 0xE9BB, 0x5BBF, 0xE2D6, 0x5BC0, 0xF3F2, + 0x5BC2, 0xEED6, 0x5BC3, 0xEAB2, 0x5BC4, 0xD0F6, 0x5BC5, 0xECD9, + 0x5BC6, 0xDACB, 0x5BC7, 0xCFA8, 0x5BCC, 0xDDA3, 0x5BD0, 0xD8DB, + 0x5BD2, 0xF9CE, 0x5BD3, 0xE9D5, 0x5BD4, 0xE3D1, 0x5BD7, 0xD2BC, + 0x5BDE, 0xD8AC, 0x5BDF, 0xF3CC, 0x5BE1, 0xCDFB, 0x5BE2, 0xF6D6, + 0x5BE4, 0xE7F5, 0x5BE5, 0xE8EF, 0x5BE6, 0xE3F9, 0x5BE7, 0xD2BB, + 0x5BE8, 0xF3F3, 0x5BE9, 0xE3FB, 0x5BEB, 0xDED0, 0x5BEC, 0xCEB0, + 0x5BEE, 0xD6F7, 0x5BEF, 0xF1D9, 0x5BF5, 0xF5C1, 0x5BF6, 0xDCC4, + 0x5BF8, 0xF5BB, 0x5BFA, 0xDED1, 0x5C01, 0xDCE6, 0x5C04, 0xDED2, + 0x5C07, 0xEDE2, 0x5C08, 0xEEF6, 0x5C09, 0xEACF, 0x5C0A, 0xF0EE, + 0x5C0B, 0xE3FC, 0x5C0D, 0xD3DF, 0x5C0E, 0xD3F4, 0x5C0F, 0xE1B3, + 0x5C11, 0xE1B4, 0x5C16, 0xF4D3, 0x5C19, 0xDFC6, 0x5C24, 0xE9D6, + 0x5C28, 0xDBAB, 0x5C31, 0xF6A6, 0x5C38, 0xE3B9, 0x5C39, 0xEBC5, + 0x5C3A, 0xF4A9, 0x5C3B, 0xCDB6, 0x5C3C, 0xD2F9, 0x5C3E, 0xDAAD, + 0x5C3F, 0xD2E3, 0x5C40, 0xCFD1, 0x5C45, 0xCBDC, 0x5C46, 0xCCFA, + 0x5C48, 0xCFDD, 0x5C4B, 0xE8A9, 0x5C4D, 0xE3BB, 0x5C4E, 0xE3BA, + 0x5C51, 0xE0DA, 0x5C55, 0xEEF7, 0x5C5B, 0xDCB3, 0x5C60, 0xD3F5, + 0x5C62, 0xD7A6, 0x5C64, 0xF6B5, 0x5C65, 0xD7DB, 0x5C6C, 0xE1D5, + 0x5C6F, 0xD4EA, 0x5C71, 0xDFA3, 0x5C79, 0xFDDF, 0x5C90, 0xD0F7, + 0x5C91, 0xEDD4, 0x5CA1, 0xCBAA, 0x5CA9, 0xE4DB, 0x5CAB, 0xE1FB, + 0x5CAC, 0xCBA2, 0x5CB1, 0xD3E0, 0x5CB3, 0xE4BF, 0x5CB5, 0xFBC0, + 0x5CB7, 0xDABE, 0x5CB8, 0xE4CD, 0x5CBA, 0xD6B9, 0x5CBE, 0xEFC0, + 0x5CC0, 0xE1FC, 0x5CD9, 0xF6B9, 0x5CE0, 0xDFC7, 0x5CE8, 0xE4B1, + 0x5CEF, 0xDCE7, 0x5CF0, 0xDCE8, 0x5CF4, 0xFAD6, 0x5CF6, 0xD3F6, + 0x5CFB, 0xF1DA, 0x5CFD, 0xFAF2, 0x5D07, 0xE2FD, 0x5D0D, 0xD5CF, + 0x5D0E, 0xD0F8, 0x5D11, 0xCDDF, 0x5D14, 0xF5CB, 0x5D16, 0xE4F0, + 0x5D17, 0xCBAB, 0x5D19, 0xD7C4, 0x5D27, 0xE2FE, 0x5D29, 0xDDDA, + 0x5D4B, 0xDAAE, 0x5D4C, 0xCAEE, 0x5D50, 0xD5B9, 0x5D69, 0xE3A1, + 0x5D6C, 0xE8E3, 0x5D6F, 0xF3AB, 0x5D87, 0xCFA9, 0x5D8B, 0xD3F7, + 0x5D9D, 0xD4F1, 0x5DA0, 0xCEE4, 0x5DA2, 0xE8F2, 0x5DAA, 0xE5F5, + 0x5DB8, 0xE7AE, 0x5DBA, 0xD6BA, 0x5DBC, 0xDFEC, 0x5DBD, 0xE4C0, + 0x5DCD, 0xE8E4, 0x5DD2, 0xD8B5, 0x5DD6, 0xE4DC, 0x5DDD, 0xF4B9, + 0x5DDE, 0xF1B6, 0x5DE1, 0xE2DE, 0x5DE2, 0xE1B5, 0x5DE5, 0xCDEF, + 0x5DE6, 0xF1A7, 0x5DE7, 0xCEE5, 0x5DE8, 0xCBDD, 0x5DEB, 0xD9E3, + 0x5DEE, 0xF3AC, 0x5DF1, 0xD0F9, 0x5DF2, 0xECAB, 0x5DF3, 0xDED3, + 0x5DF4, 0xF7E9, 0x5DF7, 0xF9F5, 0x5DFD, 0xE1DE, 0x5DFE, 0xCBEE, + 0x5E02, 0xE3BC, 0x5E03, 0xF8D6, 0x5E06, 0xDBEE, 0x5E0C, 0xFDF1, + 0x5E11, 0xF7B6, 0x5E16, 0xF4DE, 0x5E19, 0xF2ED, 0x5E1B, 0xDBD9, + 0x5E1D, 0xF0A8, 0x5E25, 0xE1FD, 0x5E2B, 0xDED4, 0x5E2D, 0xE0AC, + 0x5E33, 0xEDE3, 0x5E36, 0xD3E1, 0x5E38, 0xDFC8, 0x5E3D, 0xD9B6, + 0x5E3F, 0xFDAC, 0x5E40, 0xEFD3, 0x5E44, 0xE4C1, 0x5E45, 0xF8EB, + 0x5E47, 0xDBAC, 0x5E4C, 0xFCC6, 0x5E55, 0xD8AD, 0x5E5F, 0xF6BA, + 0x5E61, 0xDBDF, 0x5E62, 0xD3D3, 0x5E63, 0xF8C7, 0x5E72, 0xCACE, + 0x5E73, 0xF8C1, 0x5E74, 0xD2B4, 0x5E77, 0xDCB4, 0x5E78, 0xFAB9, + 0x5E79, 0xCACF, 0x5E7B, 0xFCB3, 0x5E7C, 0xEAEA, 0x5E7D, 0xEAEB, + 0x5E7E, 0xD0FA, 0x5E84, 0xEDE4, 0x5E87, 0xDDE7, 0x5E8A, 0xDFC9, + 0x5E8F, 0xDFED, 0x5E95, 0xEEBC, 0x5E97, 0xEFC1, 0x5E9A, 0xCCD2, + 0x5E9C, 0xDDA4, 0x5EA0, 0xDFCA, 0x5EA6, 0xD3F8, 0x5EA7, 0xF1A8, + 0x5EAB, 0xCDB7, 0x5EAD, 0xEFD4, 0x5EB5, 0xE4DD, 0x5EB6, 0xDFEE, + 0x5EB7, 0xCBAC, 0x5EB8, 0xE9BC, 0x5EBE, 0xEAEC, 0x5EC2, 0xDFCB, + 0x5EC8, 0xF9BF, 0x5EC9, 0xD6AF, 0x5ECA, 0xD5C6, 0x5ED0, 0xCFAA, + 0x5ED3, 0xCEA9, 0x5ED6, 0xD6F8, 0x5EDA, 0xF1B7, 0x5EDB, 0xEEF8, + 0x5EDF, 0xD9D9, 0x5EE0, 0xF3DF, 0x5EE2, 0xF8C8, 0x5EE3, 0xCEC6, + 0x5EEC, 0xD5E6, 0x5EF3, 0xF4E6, 0x5EF6, 0xE6C5, 0x5EF7, 0xEFD5, + 0x5EFA, 0xCBEF, 0x5EFB, 0xFCDF, 0x5F01, 0xDCA7, 0x5F04, 0xD6E7, + 0x5F0A, 0xF8C9, 0x5F0F, 0xE3D2, 0x5F11, 0xE3BD, 0x5F13, 0xCFE1, + 0x5F14, 0xF0C0, 0x5F15, 0xECDA, 0x5F17, 0xDDD7, 0x5F18, 0xFBF0, + 0x5F1B, 0xECAC, 0x5F1F, 0xF0A9, 0x5F26, 0xFAD7, 0x5F27, 0xFBC1, + 0x5F29, 0xD2C0, 0x5F31, 0xE5B0, 0x5F35, 0xEDE5, 0x5F3A, 0xCBAD, + 0x5F3C, 0xF9B0, 0x5F48, 0xF7A5, 0x5F4A, 0xCBAE, 0x5F4C, 0xDAAF, + 0x5F4E, 0xD8B6, 0x5F56, 0xD3A7, 0x5F57, 0xFBB2, 0x5F59, 0xFDC4, + 0x5F5B, 0xECAD, 0x5F62, 0xFBA1, 0x5F66, 0xE5E9, 0x5F67, 0xE9EE, + 0x5F69, 0xF3F4, 0x5F6A, 0xF8F3, 0x5F6B, 0xF0C1, 0x5F6C, 0xDEAF, + 0x5F6D, 0xF8B0, 0x5F70, 0xF3E0, 0x5F71, 0xE7AF, 0x5F77, 0xDBAD, + 0x5F79, 0xE6B5, 0x5F7C, 0xF9A8, 0x5F7F, 0xDDD8, 0x5F80, 0xE8D9, + 0x5F81, 0xEFD6, 0x5F85, 0xD3E2, 0x5F87, 0xE2DF, 0x5F8A, 0xFCE0, + 0x5F8B, 0xD7C8, 0x5F8C, 0xFDAD, 0x5F90, 0xDFEF, 0x5F91, 0xCCD3, + 0x5F92, 0xD3F9, 0x5F97, 0xD4F0, 0x5F98, 0xDBC7, 0x5F99, 0xDED5, + 0x5F9E, 0xF0F4, 0x5FA0, 0xD5D0, 0x5FA1, 0xE5D9, 0x5FA8, 0xFCC7, + 0x5FA9, 0xDCD6, 0x5FAA, 0xE2E0, 0x5FAE, 0xDAB0, 0x5FB5, 0xF3A3, + 0x5FB7, 0xD3EC, 0x5FB9, 0xF4CB, 0x5FBD, 0xFDC5, 0x5FC3, 0xE3FD, + 0x5FC5, 0xF9B1, 0x5FCC, 0xD0FB, 0x5FCD, 0xECDB, 0x5FD6, 0xF5BC, + 0x5FD7, 0xF2A4, 0x5FD8, 0xD8CE, 0x5FD9, 0xD8CF, 0x5FE0, 0xF5F7, + 0x5FEB, 0xF6E1, 0x5FF5, 0xD2B7, 0x5FFD, 0xFBEC, 0x5FFF, 0xDDC8, + 0x600F, 0xE4E8, 0x6012, 0xD2C1, 0x6016, 0xF8D7, 0x601C, 0xD6BB, + 0x601D, 0xDED6, 0x6020, 0xF7BD, 0x6021, 0xECAE, 0x6025, 0xD0E1, + 0x6027, 0xE0F5, 0x6028, 0xEAB3, 0x602A, 0xCED6, 0x602F, 0xCCA5, + 0x6041, 0xECF6, 0x6042, 0xE2E1, 0x6043, 0xE3BE, 0x604D, 0xFCC8, + 0x6050, 0xCDF0, 0x6052, 0xF9F6, 0x6055, 0xDFF0, 0x6059, 0xE5BF, + 0x605D, 0xCEBF, 0x6062, 0xFCE1, 0x6063, 0xEDB0, 0x6064, 0xFDD1, + 0x6065, 0xF6BB, 0x6068, 0xF9CF, 0x6069, 0xEBDA, 0x606A, 0xCAC1, + 0x606C, 0xD2B8, 0x606D, 0xCDF1, 0x606F, 0xE3D3, 0x6070, 0xFDE6, + 0x6085, 0xE6ED, 0x6089, 0xE3FA, 0x608C, 0xF0AA, 0x608D, 0xF9D0, + 0x6094, 0xFCE2, 0x6096, 0xF8A7, 0x609A, 0xE1E5, 0x609B, 0xEEF9, + 0x609F, 0xE7F6, 0x60A0, 0xEAED, 0x60A3, 0xFCB4, 0x60A4, 0xF5C2, + 0x60A7, 0xD7DC, 0x60B0, 0xF0F5, 0x60B2, 0xDDE8, 0x60B3, 0xD3ED, + 0x60B4, 0xF5FC, 0x60B6, 0xDABF, 0x60B8, 0xCCFB, 0x60BC, 0xD3FA, + 0x60BD, 0xF4A4, 0x60C5, 0xEFD7, 0x60C7, 0xD4C3, 0x60D1, 0xFBE3, + 0x60DA, 0xFBED, 0x60DC, 0xE0AD, 0x60DF, 0xEAEE, 0x60E0, 0xFBB3, + 0x60E1, 0xE4C2, 0x60F0, 0xF6E7, 0x60F1, 0xD2DD, 0x60F3, 0xDFCC, + 0x60F6, 0xFCC9, 0x60F9, 0xE5A9, 0x60FA, 0xE0F6, 0x60FB, 0xF6B3, + 0x6101, 0xE1FE, 0x6106, 0xCBF0, 0x6108, 0xEAEF, 0x6109, 0xEAF0, + 0x610D, 0xDAC0, 0x610E, 0xF8B4, 0x610F, 0xEBF2, 0x6115, 0xE4C3, + 0x611A, 0xE9D7, 0x611B, 0xE4F1, 0x611F, 0xCAEF, 0x6127, 0xCED7, + 0x6130, 0xFCCA, 0x6134, 0xF3E1, 0x6137, 0xCBC4, 0x613C, 0xE3E5, + 0x613E, 0xCBC5, 0x613F, 0xEAB4, 0x6142, 0xE9BD, 0x6144, 0xD7C9, + 0x6147, 0xEBDB, 0x6148, 0xEDB1, 0x614A, 0xCCC3, 0x614B, 0xF7BE, + 0x614C, 0xFCCB, 0x6153, 0xF8F4, 0x6155, 0xD9B7, 0x6158, 0xF3D3, + 0x6159, 0xF3D4, 0x615D, 0xF7E4, 0x615F, 0xF7D1, 0x6162, 0xD8B7, + 0x6163, 0xCEB1, 0x6164, 0xCAC2, 0x6167, 0xFBB4, 0x6168, 0xCBC6, + 0x616B, 0xF0F6, 0x616E, 0xD5E7, 0x6170, 0xEAD0, 0x6176, 0xCCD4, + 0x6177, 0xCBAF, 0x617D, 0xF4AA, 0x617E, 0xE9AF, 0x6181, 0xF5C3, + 0x6182, 0xE9D8, 0x618A, 0xDDE9, 0x618E, 0xF1F3, 0x6190, 0xD5FB, + 0x6191, 0xDEBB, 0x6194, 0xF4FB, 0x6198, 0xFDF3, 0x6199, 0xFDF2, + 0x619A, 0xF7A6, 0x61A4, 0xDDC9, 0x61A7, 0xD4D3, 0x61A9, 0xCCA8, + 0x61AB, 0xDAC1, 0x61AC, 0xCCD5, 0x61AE, 0xD9E4, 0x61B2, 0xFACA, + 0x61B6, 0xE5E3, 0x61BA, 0xD3BC, 0x61BE, 0xCAF0, 0x61C3, 0xD0C4, + 0x61C7, 0xCAD0, 0x61C8, 0xFAAB, 0x61C9, 0xEBEB, 0x61CA, 0xE7F8, + 0x61CB, 0xD9E5, 0x61E6, 0xD1D7, 0x61F2, 0xF3A4, 0x61F6, 0xD4FB, + 0x61F7, 0xFCE3, 0x61F8, 0xFAD8, 0x61FA, 0xF3D5, 0x61FC, 0xCFAB, + 0x61FF, 0xEBF3, 0x6200, 0xD5FC, 0x6207, 0xD3D4, 0x6208, 0xCDFC, + 0x620A, 0xD9E6, 0x620C, 0xE2F9, 0x620D, 0xE2A1, 0x620E, 0xEBD4, + 0x6210, 0xE0F7, 0x6211, 0xE4B2, 0x6212, 0xCCFC, 0x6216, 0xFBE4, + 0x621A, 0xF4AB, 0x621F, 0xD0BD, 0x6221, 0xCAF1, 0x622A, 0xEFB8, + 0x622E, 0xD7C0, 0x6230, 0xEEFA, 0x6231, 0xFDF4, 0x6234, 0xD3E3, + 0x6236, 0xFBC2, 0x623E, 0xD5E8, 0x623F, 0xDBAE, 0x6240, 0xE1B6, + 0x6241, 0xF8B7, 0x6247, 0xE0BF, 0x6248, 0xFBC3, 0x6249, 0xDDEA, + 0x624B, 0xE2A2, 0x624D, 0xEEA6, 0x6253, 0xF6E8, 0x6258, 0xF6F5, + 0x626E, 0xDDCA, 0x6271, 0xD0E2, 0x6276, 0xDDA6, 0x6279, 0xDDEB, + 0x627C, 0xE4F9, 0x627F, 0xE3AF, 0x6280, 0xD0FC, 0x6284, 0xF4FC, + 0x6289, 0xCCBC, 0x628A, 0xF7EA, 0x6291, 0xE5E4, 0x6292, 0xDFF1, + 0x6295, 0xF7E1, 0x6297, 0xF9F7, 0x6298, 0xEFB9, 0x629B, 0xF8D8, + 0x62AB, 0xF9A9, 0x62B1, 0xF8D9, 0x62B5, 0xEEBD, 0x62B9, 0xD8C6, + 0x62BC, 0xE4E3, 0x62BD, 0xF5CE, 0x62C2, 0xDDD9, 0x62C7, 0xD9E7, + 0x62C8, 0xD2B9, 0x62C9, 0xD5C3, 0x62CC, 0xDAE5, 0x62CD, 0xDAD0, + 0x62CF, 0xD1D9, 0x62D0, 0xCED8, 0x62D2, 0xCBDE, 0x62D3, 0xF4AC, + 0x62D4, 0xDAFB, 0x62D6, 0xF6E9, 0x62D7, 0xE8F3, 0x62D8, 0xCFAC, + 0x62D9, 0xF0F0, 0x62DB, 0xF4FD, 0x62DC, 0xDBC8, 0x62EC, 0xCEC0, + 0x62ED, 0xE3D4, 0x62EE, 0xD1CF, 0x62EF, 0xF1F5, 0x62F1, 0xCDF2, + 0x62F3, 0xCFEB, 0x62F7, 0xCDB8, 0x62FE, 0xE3A6, 0x62FF, 0xD1DA, + 0x6301, 0xF2A5, 0x6307, 0xF2A6, 0x6309, 0xE4CE, 0x6311, 0xD3FB, + 0x632B, 0xF1A9, 0x632F, 0xF2C9, 0x633A, 0xEFD8, 0x633B, 0xE6C9, + 0x633D, 0xD8B8, 0x633E, 0xFAF3, 0x6349, 0xF3B5, 0x634C, 0xF8A4, + 0x634F, 0xD1F3, 0x6350, 0xE6C8, 0x6355, 0xF8DA, 0x6367, 0xDCE9, + 0x6368, 0xDED7, 0x636E, 0xCBDF, 0x6372, 0xCFEC, 0x6377, 0xF4DF, + 0x637A, 0xD1F4, 0x637B, 0xD2BA, 0x637F, 0xDFF2, 0x6383, 0xE1B7, + 0x6388, 0xE2A3, 0x6389, 0xD3FC, 0x638C, 0xEDE6, 0x6392, 0xDBC9, + 0x6396, 0xE4FA, 0x6398, 0xCFDE, 0x639B, 0xCED0, 0x63A0, 0xD5D3, + 0x63A1, 0xF3F5, 0x63A2, 0xF7AE, 0x63A5, 0xEFC8, 0x63A7, 0xCDF3, + 0x63A8, 0xF5CF, 0x63A9, 0xE5F3, 0x63AA, 0xF0C2, 0x63C0, 0xCAD1, + 0x63C4, 0xEAF1, 0x63C6, 0xD0A6, 0x63CF, 0xD9DA, 0x63D0, 0xF0AB, + 0x63D6, 0xEBE7, 0x63DA, 0xE5C0, 0x63DB, 0xFCB5, 0x63E1, 0xE4C4, + 0x63ED, 0xCCA9, 0x63EE, 0xFDC6, 0x63F4, 0xEAB5, 0x63F6, 0xE5AA, + 0x63F7, 0xDFBA, 0x640D, 0xE1DF, 0x640F, 0xDAD1, 0x6414, 0xE1B8, + 0x6416, 0xE8F4, 0x6417, 0xD3FD, 0x641C, 0xE2A4, 0x6422, 0xF2CA, + 0x642C, 0xDAE6, 0x642D, 0xF7B3, 0x643A, 0xFDCD, 0x643E, 0xF3B6, + 0x6458, 0xEED7, 0x6460, 0xF5C4, 0x6469, 0xD8A4, 0x646F, 0xF2A7, + 0x6478, 0xD9B8, 0x6479, 0xD9B9, 0x647A, 0xEFC9, 0x6488, 0xD6CE, + 0x6491, 0xF7CB, 0x6492, 0xDFAE, 0x6493, 0xE8F5, 0x649A, 0xD2B5, + 0x649E, 0xD3D5, 0x64A4, 0xF4CC, 0x64A5, 0xDAFC, 0x64AB, 0xD9E8, + 0x64AD, 0xF7EB, 0x64AE, 0xF5C9, 0x64B0, 0xF3BC, 0x64B2, 0xDAD2, + 0x64BB, 0xD3B5, 0x64C1, 0xE8B6, 0x64C4, 0xD6CF, 0x64C5, 0xF4BA, + 0x64C7, 0xF7C9, 0x64CA, 0xCCAA, 0x64CD, 0xF0C3, 0x64CE, 0xCCD6, + 0x64D2, 0xD0D3, 0x64D4, 0xD3BD, 0x64D8, 0xDBFB, 0x64DA, 0xCBE0, + 0x64E1, 0xD3E4, 0x64E2, 0xF6F7, 0x64E5, 0xD5BA, 0x64E6, 0xF3CD, + 0x64E7, 0xCBE1, 0x64EC, 0xEBF4, 0x64F2, 0xF4AD, 0x64F4, 0xFCAA, + 0x64FA, 0xF7EC, 0x64FE, 0xE8F6, 0x6500, 0xDAE7, 0x6504, 0xF7CC, + 0x6518, 0xE5C1, 0x651D, 0xE0EE, 0x6523, 0xD5FD, 0x652A, 0xCEE6, + 0x652B, 0xFCAB, 0x652C, 0xD5BB, 0x652F, 0xF2A8, 0x6536, 0xE2A5, + 0x6537, 0xCDB9, 0x6538, 0xEAF2, 0x6539, 0xCBC7, 0x653B, 0xCDF4, + 0x653E, 0xDBAF, 0x653F, 0xEFD9, 0x6545, 0xCDBA, 0x6548, 0xFCF9, + 0x654D, 0xDFF3, 0x654E, 0xCEE7, 0x654F, 0xDAC2, 0x6551, 0xCFAD, + 0x6556, 0xE7F9, 0x6557, 0xF8A8, 0x655E, 0xF3E2, 0x6562, 0xCAF2, + 0x6563, 0xDFA4, 0x6566, 0xD4C4, 0x656C, 0xCCD7, 0x656D, 0xE5C2, + 0x6572, 0xCDBB, 0x6574, 0xEFDA, 0x6575, 0xEED8, 0x6577, 0xDDA7, + 0x6578, 0xE2A6, 0x657E, 0xE0C0, 0x6582, 0xD6B0, 0x6583, 0xF8CA, + 0x6585, 0xFCFA, 0x6587, 0xD9FE, 0x658C, 0xDEB0, 0x6590, 0xDDEC, + 0x6591, 0xDAE8, 0x6597, 0xD4E0, 0x6599, 0xD6F9, 0x659B, 0xCDD7, + 0x659C, 0xDED8, 0x659F, 0xF2F8, 0x65A1, 0xE4D6, 0x65A4, 0xD0C5, + 0x65A5, 0xF4AE, 0x65A7, 0xDDA8, 0x65AB, 0xEDC5, 0x65AC, 0xF3D6, + 0x65AF, 0xDED9, 0x65B0, 0xE3E6, 0x65B7, 0xD3A8, 0x65B9, 0xDBB0, + 0x65BC, 0xE5DA, 0x65BD, 0xE3BF, 0x65C1, 0xDBB1, 0x65C5, 0xD5E9, + 0x65CB, 0xE0C1, 0x65CC, 0xEFDB, 0x65CF, 0xF0E9, 0x65D2, 0xD7B2, + 0x65D7, 0xD0FD, 0x65E0, 0xD9E9, 0x65E3, 0xD0FE, 0x65E5, 0xECED, + 0x65E6, 0xD3A9, 0x65E8, 0xF2A9, 0x65E9, 0xF0C4, 0x65EC, 0xE2E2, + 0x65ED, 0xE9EF, 0x65F1, 0xF9D1, 0x65F4, 0xE9D9, 0x65FA, 0xE8DA, + 0x65FB, 0xDAC3, 0x65FC, 0xDAC4, 0x65FD, 0xD4C5, 0x65FF, 0xE7FA, + 0x6606, 0xCDE0, 0x6607, 0xE3B0, 0x6609, 0xDBB2, 0x660A, 0xFBC4, + 0x660C, 0xF3E3, 0x660E, 0xD9A5, 0x660F, 0xFBE7, 0x6610, 0xDDCB, + 0x6611, 0xD0D4, 0x6613, 0xE6B6, 0x6614, 0xE0AE, 0x6615, 0xFDDA, + 0x661E, 0xDCB5, 0x661F, 0xE0F8, 0x6620, 0xE7B1, 0x6625, 0xF5F0, + 0x6627, 0xD8DC, 0x6628, 0xEDC6, 0x662D, 0xE1B9, 0x662F, 0xE3C0, + 0x6630, 0xF9C0, 0x6631, 0xE9F0, 0x6634, 0xD9DB, 0x6636, 0xF3E4, + 0x663A, 0xDCB6, 0x663B, 0xE4E9, 0x6641, 0xF0C5, 0x6642, 0xE3C1, + 0x6643, 0xFCCC, 0x6644, 0xFCCD, 0x6649, 0xF2CB, 0x664B, 0xF2CC, + 0x664F, 0xE4CF, 0x6659, 0xF1DB, 0x665B, 0xFAD9, 0x665D, 0xF1B8, + 0x665E, 0xFDF5, 0x665F, 0xE0F9, 0x6664, 0xE7FB, 0x6665, 0xFCB7, + 0x6666, 0xFCE4, 0x6667, 0xFBC5, 0x6668, 0xE3E7, 0x6669, 0xD8B9, + 0x666B, 0xF6F8, 0x666E, 0xDCC5, 0x666F, 0xCCD8, 0x6673, 0xE0AF, + 0x6674, 0xF4E7, 0x6676, 0xEFDC, 0x6677, 0xCFFC, 0x6678, 0xEFDD, + 0x667A, 0xF2AA, 0x6684, 0xFDBE, 0x6687, 0xCAAC, 0x6688, 0xFDBB, + 0x6689, 0xFDC7, 0x668E, 0xE7B2, 0x6690, 0xEAD1, 0x6691, 0xDFF4, + 0x6696, 0xD1EC, 0x6697, 0xE4DE, 0x6698, 0xE5C3, 0x669D, 0xD9A6, + 0x66A0, 0xCDBC, 0x66A2, 0xF3E5, 0x66AB, 0xEDD5, 0x66AE, 0xD9BA, + 0x66B2, 0xEDE7, 0x66B3, 0xFBB5, 0x66B4, 0xF8EC, 0x66B9, 0xE0E7, + 0x66BB, 0xCCD9, 0x66BE, 0xD4C6, 0x66C4, 0xE7A5, 0x66C6, 0xD5F5, + 0x66C7, 0xD3BE, 0x66C9, 0xFCFB, 0x66D6, 0xE4F2, 0x66D9, 0xDFF5, + 0x66DC, 0xE8F8, 0x66DD, 0xF8ED, 0x66E0, 0xCEC7, 0x66E6, 0xFDF6, + 0x66F0, 0xE8D8, 0x66F2, 0xCDD8, 0x66F3, 0xE7D6, 0x66F4, 0xCCDA, + 0x66F7, 0xCAE3, 0x66F8, 0xDFF6, 0x66F9, 0xF0C7, 0x66FA, 0xF0C6, + 0x66FC, 0xD8BA, 0x66FE, 0xF1F4, 0x66FF, 0xF4F0, 0x6700, 0xF5CC, + 0x6703, 0xFCE5, 0x6708, 0xEAC5, 0x6709, 0xEAF3, 0x670B, 0xDDDB, + 0x670D, 0xDCD7, 0x6714, 0xDEFD, 0x6715, 0xF2F9, 0x6717, 0xD5C7, + 0x671B, 0xD8D0, 0x671D, 0xF0C8, 0x671E, 0xD1A1, 0x671F, 0xD1A2, + 0x6726, 0xD9D4, 0x6727, 0xD6E8, 0x6728, 0xD9CA, 0x672A, 0xDAB1, + 0x672B, 0xD8C7, 0x672C, 0xDCE2, 0x672D, 0xF3CE, 0x672E, 0xF5F4, + 0x6731, 0xF1B9, 0x6734, 0xDAD3, 0x6736, 0xF6EA, 0x673A, 0xCFF5, + 0x673D, 0xFDAE, 0x6746, 0xCAD2, 0x6749, 0xDFB4, 0x674E, 0xD7DD, + 0x674F, 0xFABA, 0x6750, 0xEEA7, 0x6751, 0xF5BD, 0x6753, 0xF8F5, + 0x6756, 0xEDE8, 0x675C, 0xD4E1, 0x675E, 0xD1A3, 0x675F, 0xE1D6, + 0x676D, 0xF9F8, 0x676F, 0xDBCA, 0x6770, 0xCBF9, 0x6771, 0xD4D4, + 0x6773, 0xD9DC, 0x6775, 0xEEBE, 0x6777, 0xF7ED, 0x677B, 0xD2EE, + 0x677E, 0xE1E6, 0x677F, 0xF7F9, 0x6787, 0xDDED, 0x6789, 0xE8DB, + 0x678B, 0xDBB3, 0x678F, 0xD1F7, 0x6790, 0xE0B0, 0x6793, 0xD4E2, + 0x6795, 0xF6D7, 0x6797, 0xD7F9, 0x679A, 0xD8DD, 0x679C, 0xCDFD, + 0x679D, 0xF2AB, 0x67AF, 0xCDBD, 0x67B0, 0xF8C2, 0x67B3, 0xF2AC, + 0x67B6, 0xCAAD, 0x67B7, 0xCAAE, 0x67B8, 0xCFAE, 0x67BE, 0xE3C2, + 0x67C4, 0xDCB7, 0x67CF, 0xDBDA, 0x67D0, 0xD9BB, 0x67D1, 0xCAF3, + 0x67D2, 0xF6D3, 0x67D3, 0xE6F8, 0x67D4, 0xEAF5, 0x67DA, 0xEAF6, + 0x67DD, 0xF6F9, 0x67E9, 0xCFAF, 0x67EC, 0xCAD3, 0x67EF, 0xCAAF, + 0x67F0, 0xD2B0, 0x67F1, 0xF1BA, 0x67F3, 0xD7B3, 0x67F4, 0xE3C3, + 0x67F5, 0xF3FD, 0x67F6, 0xDEDA, 0x67FB, 0xDEDB, 0x67FE, 0xEFDE, + 0x6812, 0xE2E3, 0x6813, 0xEEFB, 0x6816, 0xDFF7, 0x6817, 0xD7CA, + 0x6821, 0xCEE8, 0x6822, 0xDBDB, 0x682A, 0xF1BB, 0x682F, 0xE9F1, + 0x6838, 0xFAB7, 0x6839, 0xD0C6, 0x683C, 0xCCAB, 0x683D, 0xEEA8, + 0x6840, 0xCBFA, 0x6841, 0xF9F9, 0x6842, 0xCCFD, 0x6843, 0xD3FE, + 0x6848, 0xE4D0, 0x684E, 0xF2EE, 0x6850, 0xD4D5, 0x6851, 0xDFCD, + 0x6853, 0xFCB8, 0x6854, 0xD1D0, 0x686D, 0xF2CD, 0x6876, 0xF7D2, + 0x687F, 0xCAD4, 0x6881, 0xD5D9, 0x6885, 0xD8DE, 0x688F, 0xCDD9, + 0x6893, 0xEEA9, 0x6894, 0xF6BC, 0x6897, 0xCCDB, 0x689D, 0xF0C9, + 0x689F, 0xFCFC, 0x68A1, 0xE8C9, 0x68A2, 0xF4FE, 0x68A7, 0xE7FC, + 0x68A8, 0xD7DE, 0x68AD, 0xDEDC, 0x68AF, 0xF0AC, 0x68B0, 0xCCFE, + 0x68B1, 0xCDE1, 0x68B3, 0xE1BA, 0x68B5, 0xDBEF, 0x68B6, 0xDAB2, + 0x68C4, 0xD1A5, 0x68C5, 0xDCB8, 0x68C9, 0xD8F6, 0x68CB, 0xD1A4, + 0x68CD, 0xCDE2, 0x68D2, 0xDCEA, 0x68D5, 0xF0F7, 0x68D7, 0xF0CA, + 0x68D8, 0xD0BE, 0x68DA, 0xDDDC, 0x68DF, 0xD4D6, 0x68E0, 0xD3D6, + 0x68E7, 0xEDD0, 0x68E8, 0xCDA1, 0x68EE, 0xDFB5, 0x68F2, 0xDFF8, + 0x68F9, 0xD4A1, 0x68FA, 0xCEB2, 0x6900, 0xE8CA, 0x6905, 0xEBF5, + 0x690D, 0xE3D5, 0x690E, 0xF5D0, 0x6912, 0xF5A1, 0x6927, 0xD9A7, + 0x6930, 0xE5AB, 0x693D, 0xE6CB, 0x693F, 0xF5F1, 0x694A, 0xE5C5, + 0x6953, 0xF9A3, 0x6954, 0xE0DB, 0x6955, 0xF6EB, 0x6957, 0xCBF1, + 0x6959, 0xD9EA, 0x695A, 0xF5A2, 0x695E, 0xD7D1, 0x6960, 0xD1F8, + 0x6961, 0xEAF8, 0x6962, 0xEAF9, 0x6963, 0xDAB3, 0x6968, 0xEFDF, + 0x696B, 0xF1EF, 0x696D, 0xE5F6, 0x696E, 0xEEBF, 0x696F, 0xE2E4, + 0x6975, 0xD0BF, 0x6977, 0xFAAC, 0x6978, 0xF5D1, 0x6979, 0xE7B3, + 0x6995, 0xE9BE, 0x699B, 0xF2CE, 0x699C, 0xDBB4, 0x69A5, 0xFCCE, + 0x69A7, 0xDDEE, 0x69AE, 0xE7B4, 0x69B4, 0xD7B4, 0x69BB, 0xF7B4, + 0x69C1, 0xCDBE, 0x69C3, 0xDAE9, 0x69CB, 0xCFB0, 0x69CC, 0xF7D9, + 0x69CD, 0xF3E6, 0x69D0, 0xCED9, 0x69E8, 0xCEAA, 0x69EA, 0xCBC8, + 0x69FB, 0xD0A7, 0x69FD, 0xF0CB, 0x69FF, 0xD0C7, 0x6A02, 0xE4C5, + 0x6A0A, 0xDBE0, 0x6A11, 0xD5DA, 0x6A13, 0xD7A7, 0x6A17, 0xEEC0, + 0x6A19, 0xF8F6, 0x6A1E, 0xF5D2, 0x6A1F, 0xEDE9, 0x6A21, 0xD9BC, + 0x6A23, 0xE5C6, 0x6A35, 0xF5A3, 0x6A38, 0xDAD4, 0x6A39, 0xE2A7, + 0x6A3A, 0xFBFC, 0x6A3D, 0xF1DC, 0x6A44, 0xCAF4, 0x6A48, 0xE8FA, + 0x6A4B, 0xCEE9, 0x6A52, 0xE9F8, 0x6A53, 0xE2E5, 0x6A58, 0xD0B9, + 0x6A59, 0xD4F2, 0x6A5F, 0xD1A6, 0x6A61, 0xDFCE, 0x6A6B, 0xFCF4, + 0x6A80, 0xD3AA, 0x6A84, 0xCCAC, 0x6A89, 0xEFE0, 0x6A8D, 0xE5E5, + 0x6A8E, 0xD0D5, 0x6A97, 0xDBFC, 0x6A9C, 0xFCE6, 0x6AA2, 0xCBFE, + 0x6AA3, 0xEDEA, 0x6AB3, 0xDEB1, 0x6ABB, 0xF9E3, 0x6AC2, 0xD4A2, + 0x6AC3, 0xCFF6, 0x6AD3, 0xD6D0, 0x6ADA, 0xD5EA, 0x6ADB, 0xF1EE, + 0x6AF6, 0xFACB, 0x6AFB, 0xE5A1, 0x6B04, 0xD5B1, 0x6B0A, 0xCFED, + 0x6B0C, 0xEDEB, 0x6B12, 0xD5B2, 0x6B16, 0xD5BC, 0x6B20, 0xFDE2, + 0x6B21, 0xF3AD, 0x6B23, 0xFDDB, 0x6B32, 0xE9B0, 0x6B3A, 0xD1A7, + 0x6B3D, 0xFDE3, 0x6B3E, 0xCEB3, 0x6B46, 0xFDE4, 0x6B47, 0xFACE, + 0x6B4C, 0xCAB0, 0x6B4E, 0xF7A7, 0x6B50, 0xCFB1, 0x6B5F, 0xE6A2, + 0x6B61, 0xFCB6, 0x6B62, 0xF2AD, 0x6B63, 0xEFE1, 0x6B64, 0xF3AE, + 0x6B65, 0xDCC6, 0x6B66, 0xD9EB, 0x6B6A, 0xE8E0, 0x6B72, 0xE1A8, + 0x6B77, 0xD5F6, 0x6B78, 0xCFFD, 0x6B7B, 0xDEDD, 0x6B7F, 0xD9D1, + 0x6B83, 0xE4EA, 0x6B84, 0xF2CF, 0x6B86, 0xF7BF, 0x6B89, 0xE2E6, + 0x6B8A, 0xE2A8, 0x6B96, 0xE3D6, 0x6B98, 0xEDD1, 0x6B9E, 0xE9F9, + 0x6BAE, 0xD6B1, 0x6BAF, 0xDEB2, 0x6BB2, 0xE0E8, 0x6BB5, 0xD3AB, + 0x6BB7, 0xEBDC, 0x6BBA, 0xDFAF, 0x6BBC, 0xCAC3, 0x6BBF, 0xEEFC, + 0x6BC1, 0xFDC3, 0x6BC5, 0xEBF6, 0x6BC6, 0xCFB2, 0x6BCB, 0xD9EC, + 0x6BCD, 0xD9BD, 0x6BCF, 0xD8DF, 0x6BD2, 0xD4B8, 0x6BD3, 0xEBBE, + 0x6BD4, 0xDDEF, 0x6BD6, 0xDDF0, 0x6BD7, 0xDDF1, 0x6BD8, 0xDDF2, + 0x6BDB, 0xD9BE, 0x6BEB, 0xFBC6, 0x6BEC, 0xCFB3, 0x6C08, 0xEEFD, + 0x6C0F, 0xE4AB, 0x6C11, 0xDAC5, 0x6C13, 0xD8EC, 0x6C23, 0xD1A8, + 0x6C34, 0xE2A9, 0x6C37, 0xDEBC, 0x6C38, 0xE7B5, 0x6C3E, 0xDBF0, + 0x6C40, 0xEFE2, 0x6C41, 0xF1F0, 0x6C42, 0xCFB4, 0x6C4E, 0xDBF1, + 0x6C50, 0xE0B1, 0x6C55, 0xDFA5, 0x6C57, 0xF9D2, 0x6C5A, 0xE7FD, + 0x6C5D, 0xE6A3, 0x6C5E, 0xFBF1, 0x6C5F, 0xCBB0, 0x6C60, 0xF2AE, + 0x6C68, 0xCDE7, 0x6C6A, 0xE8DC, 0x6C6D, 0xE7D7, 0x6C70, 0xF7C0, + 0x6C72, 0xD0E3, 0x6C76, 0xDAA1, 0x6C7A, 0xCCBD, 0x6C7D, 0xD1A9, + 0x6C7E, 0xDDCC, 0x6C81, 0xE3FE, 0x6C82, 0xD1AA, 0x6C83, 0xE8AA, + 0x6C85, 0xEAB6, 0x6C86, 0xF9FA, 0x6C87, 0xE6CC, 0x6C88, 0xF6D8, + 0x6C8C, 0xD4C7, 0x6C90, 0xD9CB, 0x6C92, 0xD9D2, 0x6C93, 0xD3CB, + 0x6C94, 0xD8F7, 0x6C95, 0xDAA9, 0x6C96, 0xF5F8, 0x6C99, 0xDEDE, + 0x6C9A, 0xF2AF, 0x6C9B, 0xF8A9, 0x6CAB, 0xD8C8, 0x6CAE, 0xEEC1, + 0x6CB3, 0xF9C1, 0x6CB8, 0xDDF3, 0x6CB9, 0xEAFA, 0x6CBB, 0xF6BD, + 0x6CBC, 0xE1BB, 0x6CBD, 0xCDBF, 0x6CBE, 0xF4D4, 0x6CBF, 0xE6CD, + 0x6CC1, 0xFCCF, 0x6CC2, 0xFBA2, 0x6CC4, 0xE0DC, 0x6CC9, 0xF4BB, + 0x6CCA, 0xDAD5, 0x6CCC, 0xF9B2, 0x6CD3, 0xFBF2, 0x6CD5, 0xDBF6, + 0x6CD7, 0xDEDF, 0x6CDB, 0xDBF2, 0x6CE1, 0xF8DC, 0x6CE2, 0xF7EE, + 0x6CE3, 0xEBE8, 0x6CE5, 0xD2FA, 0x6CE8, 0xF1BC, 0x6CEB, 0xFADA, + 0x6CEE, 0xDAEA, 0x6CEF, 0xDAC6, 0x6CF0, 0xF7C1, 0x6CF3, 0xE7B6, + 0x6D0B, 0xE5C7, 0x6D0C, 0xD6AC, 0x6D11, 0xDCC7, 0x6D17, 0xE1A9, + 0x6D19, 0xE2AA, 0x6D1B, 0xD5A6, 0x6D1E, 0xD4D7, 0x6D25, 0xF2D0, + 0x6D27, 0xEAFB, 0x6D29, 0xE0DD, 0x6D2A, 0xFBF3, 0x6D32, 0xF1BD, + 0x6D35, 0xE2E7, 0x6D36, 0xFDD7, 0x6D38, 0xCEC8, 0x6D39, 0xEAB7, + 0x6D3B, 0xFCC0, 0x6D3D, 0xFDE7, 0x6D3E, 0xF7EF, 0x6D41, 0xD7B5, + 0x6D59, 0xEFBA, 0x6D5A, 0xF1DD, 0x6D5C, 0xDEB3, 0x6D63, 0xE8CB, + 0x6D66, 0xF8DD, 0x6D69, 0xFBC7, 0x6D6A, 0xD5C8, 0x6D6C, 0xD7DF, + 0x6D6E, 0xDDA9, 0x6D74, 0xE9B1, 0x6D77, 0xFAAD, 0x6D78, 0xF6D9, + 0x6D79, 0xFAF4, 0x6D7F, 0xF8AA, 0x6D85, 0xE6EE, 0x6D87, 0xCCDC, + 0x6D88, 0xE1BC, 0x6D89, 0xE0EF, 0x6D8C, 0xE9BF, 0x6D8D, 0xFCFD, + 0x6D8E, 0xE6CE, 0x6D91, 0xE1D7, 0x6D93, 0xE6CF, 0x6D95, 0xF4F1, + 0x6DAF, 0xE4F3, 0x6DB2, 0xE4FB, 0x6DB5, 0xF9E4, 0x6DC0, 0xEFE3, + 0x6DC3, 0xCFEE, 0x6DC4, 0xF6BE, 0x6DC5, 0xE0B2, 0x6DC6, 0xFCFE, + 0x6DC7, 0xD1AB, 0x6DCB, 0xD7FA, 0x6DCF, 0xFBC8, 0x6DD1, 0xE2D7, + 0x6DD8, 0xD4A3, 0x6DD9, 0xF0F8, 0x6DDA, 0xD7A8, 0x6DDE, 0xE1E7, + 0x6DE1, 0xD3BF, 0x6DE8, 0xEFE4, 0x6DEA, 0xD7C5, 0x6DEB, 0xEBE2, + 0x6DEE, 0xFCE7, 0x6DF1, 0xE4A2, 0x6DF3, 0xE2E8, 0x6DF5, 0xE6D0, + 0x6DF7, 0xFBE8, 0x6DF8, 0xF4E8, 0x6DF9, 0xE5F4, 0x6DFA, 0xF4BC, + 0x6DFB, 0xF4D5, 0x6E17, 0xDFB6, 0x6E19, 0xFCB9, 0x6E1A, 0xEEC2, + 0x6E1B, 0xCAF5, 0x6E1F, 0xEFE5, 0x6E20, 0xCBE2, 0x6E21, 0xD4A4, + 0x6E23, 0xDEE0, 0x6E24, 0xDAFD, 0x6E25, 0xE4C6, 0x6E26, 0xE8BE, + 0x6E2B, 0xE0DE, 0x6E2C, 0xF6B4, 0x6E2D, 0xEAD2, 0x6E2F, 0xF9FB, + 0x6E32, 0xE0C2, 0x6E34, 0xCAE4, 0x6E36, 0xE7B7, 0x6E38, 0xEAFD, + 0x6E3A, 0xD9DD, 0x6E3C, 0xDAB4, 0x6E3D, 0xEEAA, 0x6E3E, 0xFBE9, + 0x6E43, 0xDBCB, 0x6E44, 0xDAB5, 0x6E4A, 0xF1BE, 0x6E4D, 0xD3AC, + 0x6E56, 0xFBC9, 0x6E58, 0xDFCF, 0x6E5B, 0xD3C0, 0x6E5C, 0xE3D7, + 0x6E5E, 0xEFE6, 0x6E5F, 0xFCD0, 0x6E67, 0xE9C0, 0x6E6B, 0xF5D3, + 0x6E6E, 0xECDC, 0x6E6F, 0xF7B7, 0x6E72, 0xEAB8, 0x6E73, 0xD1F9, + 0x6E7A, 0xDCC8, 0x6E90, 0xEAB9, 0x6E96, 0xF1DE, 0x6E9C, 0xD7B6, + 0x6E9D, 0xCFB5, 0x6E9F, 0xD9A8, 0x6EA2, 0xECEE, 0x6EA5, 0xDDAA, + 0x6EAA, 0xCDA2, 0x6EAB, 0xE8AE, 0x6EAF, 0xE1BD, 0x6EB1, 0xF2D1, + 0x6EB6, 0xE9C1, 0x6EBA, 0xD2FC, 0x6EC2, 0xDBB5, 0x6EC4, 0xF3E7, + 0x6EC5, 0xD8FE, 0x6EC9, 0xFCD1, 0x6ECB, 0xEDB2, 0x6ECC, 0xF4AF, + 0x6ECE, 0xFBA3, 0x6ED1, 0xFCC1, 0x6ED3, 0xEEAB, 0x6ED4, 0xD4A5, + 0x6EEF, 0xF4F2, 0x6EF4, 0xEED9, 0x6EF8, 0xFBCA, 0x6EFE, 0xCDE3, + 0x6EFF, 0xD8BB, 0x6F01, 0xE5DB, 0x6F02, 0xF8F7, 0x6F06, 0xF6D4, + 0x6F0F, 0xD7A9, 0x6F11, 0xCBC9, 0x6F14, 0xE6D1, 0x6F15, 0xF0CC, + 0x6F20, 0xD8AE, 0x6F22, 0xF9D3, 0x6F23, 0xD5FE, 0x6F2B, 0xD8BC, + 0x6F2C, 0xF2B0, 0x6F31, 0xE2AB, 0x6F32, 0xF3E8, 0x6F38, 0xEFC2, + 0x6F3F, 0xEDEC, 0x6F41, 0xE7B8, 0x6F51, 0xDAFE, 0x6F54, 0xCCBE, + 0x6F57, 0xF2FC, 0x6F58, 0xDAEB, 0x6F5A, 0xE2D8, 0x6F5B, 0xEDD6, + 0x6F5E, 0xD6D1, 0x6F5F, 0xE0B3, 0x6F62, 0xFCD2, 0x6F64, 0xEBC8, + 0x6F6D, 0xD3C1, 0x6F6E, 0xF0CD, 0x6F70, 0xCFF7, 0x6F7A, 0xEDD2, + 0x6F7C, 0xD4D8, 0x6F7D, 0xDCC9, 0x6F7E, 0xD7F1, 0x6F81, 0xDFBB, + 0x6F84, 0xF3A5, 0x6F88, 0xF4CD, 0x6F8D, 0xF1BF, 0x6F8E, 0xF8B1, + 0x6F90, 0xE9FA, 0x6F94, 0xFBCB, 0x6F97, 0xCAD5, 0x6FA3, 0xF9D4, + 0x6FA4, 0xF7CA, 0x6FA7, 0xD6C8, 0x6FAE, 0xFCE8, 0x6FAF, 0xF3BD, + 0x6FB1, 0xEEFE, 0x6FB3, 0xE7FE, 0x6FB9, 0xD3C2, 0x6FBE, 0xD3B6, + 0x6FC0, 0xCCAD, 0x6FC1, 0xF6FA, 0x6FC2, 0xD6B2, 0x6FC3, 0xD2D8, + 0x6FCA, 0xE7D8, 0x6FD5, 0xE3A5, 0x6FDA, 0xE7B9, 0x6FDF, 0xF0AD, + 0x6FE0, 0xFBCC, 0x6FE1, 0xEBA1, 0x6FE4, 0xD4A6, 0x6FE9, 0xFBCD, + 0x6FEB, 0xD5BD, 0x6FEC, 0xF1DF, 0x6FEF, 0xF6FB, 0x6FF1, 0xDEB4, + 0x6FFE, 0xD5EB, 0x7001, 0xE5C8, 0x7005, 0xFBA4, 0x7006, 0xD4B9, + 0x7009, 0xDEE1, 0x700B, 0xE4A3, 0x700F, 0xD7B7, 0x7011, 0xF8EE, + 0x7015, 0xDEB5, 0x7018, 0xD6D2, 0x701A, 0xF9D5, 0x701B, 0xE7BA, + 0x701C, 0xEBD5, 0x701D, 0xD5F7, 0x701E, 0xEFE7, 0x701F, 0xE1BE, + 0x7023, 0xFAAE, 0x7027, 0xD6E9, 0x7028, 0xD6EE, 0x702F, 0xE7BB, + 0x7037, 0xECCB, 0x703E, 0xD5B3, 0x704C, 0xCEB4, 0x7050, 0xFBA5, + 0x7051, 0xE1EE, 0x7058, 0xF7A8, 0x705D, 0xFBCE, 0x7063, 0xD8BD, + 0x706B, 0xFBFD, 0x7070, 0xFCE9, 0x7078, 0xCFB6, 0x707C, 0xEDC7, + 0x707D, 0xEEAC, 0x7085, 0xCCDD, 0x708A, 0xF6A7, 0x708E, 0xE6FA, + 0x7092, 0xF5A4, 0x7098, 0xFDDC, 0x7099, 0xEDB3, 0x709A, 0xCEC9, + 0x70A1, 0xEFE8, 0x70A4, 0xE1BF, 0x70AB, 0xFADB, 0x70AC, 0xCBE3, + 0x70AD, 0xF7A9, 0x70AF, 0xFBA6, 0x70B3, 0xDCB9, 0x70B7, 0xF1C0, + 0x70B8, 0xEDC8, 0x70B9, 0xEFC3, 0x70C8, 0xD6AD, 0x70CB, 0xFDCE, + 0x70CF, 0xE8A1, 0x70D8, 0xFBF4, 0x70D9, 0xD5A7, 0x70DD, 0xF1F6, + 0x70DF, 0xE6D3, 0x70F1, 0xCCDE, 0x70F9, 0xF8B2, 0x70FD, 0xDCEB, + 0x7104, 0xFDB6, 0x7109, 0xE5EA, 0x710C, 0xF1E0, 0x7119, 0xDBCC, + 0x711A, 0xDDCD, 0x711E, 0xD4C8, 0x7121, 0xD9ED, 0x7126, 0xF5A5, + 0x7130, 0xE6FB, 0x7136, 0xE6D4, 0x7147, 0xFDC8, 0x7149, 0xD6A1, + 0x714A, 0xFDBF, 0x714C, 0xFCD3, 0x714E, 0xEFA1, 0x7150, 0xE7BC, + 0x7156, 0xD1EE, 0x7159, 0xE6D5, 0x715C, 0xE9F2, 0x715E, 0xDFB0, + 0x7164, 0xD8E0, 0x7165, 0xFCBA, 0x7166, 0xFDAF, 0x7167, 0xF0CE, + 0x7169, 0xDBE1, 0x716C, 0xE5C9, 0x716E, 0xEDB4, 0x717D, 0xE0C3, + 0x7184, 0xE3D8, 0x7189, 0xE9FB, 0x718A, 0xEAA8, 0x718F, 0xFDB7, + 0x7192, 0xFBA7, 0x7194, 0xE9C2, 0x7199, 0xFDF7, 0x719F, 0xE2D9, + 0x71A2, 0xDCEC, 0x71AC, 0xE8A2, 0x71B1, 0xE6F0, 0x71B9, 0xFDF8, + 0x71BA, 0xFDF9, 0x71BE, 0xF6BF, 0x71C1, 0xE7A7, 0x71C3, 0xE6D7, + 0x71C8, 0xD4F3, 0x71C9, 0xD4C9, 0x71CE, 0xD6FA, 0x71D0, 0xD7F2, + 0x71D2, 0xE1C0, 0x71D4, 0xDBE2, 0x71D5, 0xE6D8, 0x71DF, 0xE7BD, + 0x71E5, 0xF0CF, 0x71E6, 0xF3BE, 0x71E7, 0xE2AC, 0x71ED, 0xF5B7, + 0x71EE, 0xE0F0, 0x71FB, 0xFDB8, 0x71FC, 0xE3E8, 0x71FE, 0xD4A7, + 0x71FF, 0xE8FC, 0x7200, 0xFAD2, 0x7206, 0xF8EF, 0x7210, 0xD6D3, + 0x721B, 0xD5B4, 0x722A, 0xF0D0, 0x722C, 0xF7F0, 0x722D, 0xEEB3, + 0x7230, 0xEABA, 0x7232, 0xEAD3, 0x7235, 0xEDC9, 0x7236, 0xDDAB, + 0x723A, 0xE5AC, 0x723B, 0xFDA1, 0x723D, 0xDFD0, 0x723E, 0xECB3, + 0x7240, 0xDFD1, 0x7246, 0xEDED, 0x7247, 0xF8B8, 0x7248, 0xF7FA, + 0x724C, 0xF8AB, 0x7252, 0xF4E0, 0x7258, 0xD4BA, 0x7259, 0xE4B3, + 0x725B, 0xE9DA, 0x725D, 0xDEB6, 0x725F, 0xD9BF, 0x7261, 0xD9C0, + 0x7262, 0xD6EF, 0x7267, 0xD9CC, 0x7269, 0xDAAA, 0x7272, 0xDFE5, + 0x7279, 0xF7E5, 0x727D, 0xCCB2, 0x7280, 0xDFF9, 0x7281, 0xD7E0, + 0x72A2, 0xD4BB, 0x72A7, 0xFDFA, 0x72AC, 0xCCB3, 0x72AF, 0xDBF3, + 0x72C0, 0xDFD2, 0x72C2, 0xCECA, 0x72C4, 0xEEDA, 0x72CE, 0xE4E4, + 0x72D0, 0xFBCF, 0x72D7, 0xCFB7, 0x72D9, 0xEEC3, 0x72E1, 0xCEEA, + 0x72E9, 0xE2AD, 0x72F8, 0xD7E1, 0x72F9, 0xFAF5, 0x72FC, 0xD5C9, + 0x72FD, 0xF8AC, 0x730A, 0xE7D9, 0x7316, 0xF3E9, 0x731B, 0xD8ED, + 0x731C, 0xE3C4, 0x731D, 0xF0F1, 0x7325, 0xE8E5, 0x7329, 0xE0FA, + 0x732A, 0xEEC4, 0x732B, 0xD9DE, 0x7336, 0xEBA2, 0x7337, 0xEBA3, + 0x733E, 0xFCC2, 0x733F, 0xEABB, 0x7344, 0xE8AB, 0x7345, 0xDEE2, + 0x7350, 0xEDEF, 0x7352, 0xE8A3, 0x7357, 0xCFF1, 0x7368, 0xD4BC, + 0x736A, 0xFCEA, 0x7370, 0xE7BE, 0x7372, 0xFCF2, 0x7375, 0xD6B4, + 0x7378, 0xE2AE, 0x737A, 0xD3B7, 0x737B, 0xFACC, 0x7384, 0xFADC, + 0x7386, 0xEDB5, 0x7387, 0xE1E3, 0x7389, 0xE8AC, 0x738B, 0xE8DD, + 0x738E, 0xEFE9, 0x7394, 0xF4BD, 0x7396, 0xCFB8, 0x7397, 0xE9DB, + 0x7398, 0xD1AC, 0x739F, 0xDAC7, 0x73A7, 0xEBC9, 0x73A9, 0xE8CC, + 0x73AD, 0xDEB7, 0x73B2, 0xD6BC, 0x73B3, 0xD3E5, 0x73B9, 0xFADD, + 0x73C0, 0xDAD6, 0x73C2, 0xCAB1, 0x73C9, 0xDAC8, 0x73CA, 0xDFA6, + 0x73CC, 0xF9B3, 0x73CD, 0xF2D2, 0x73CF, 0xCAC4, 0x73D6, 0xCECB, + 0x73D9, 0xCDF5, 0x73DD, 0xFDB0, 0x73DE, 0xD5A8, 0x73E0, 0xF1C1, + 0x73E3, 0xE2E9, 0x73E4, 0xDCCA, 0x73E5, 0xECB4, 0x73E6, 0xFAC0, + 0x73E9, 0xFBA8, 0x73EA, 0xD0A8, 0x73ED, 0xDAEC, 0x73F7, 0xD9EE, + 0x73F9, 0xE0FB, 0x73FD, 0xEFEA, 0x73FE, 0xFADE, 0x7401, 0xE0C4, + 0x7403, 0xCFB9, 0x7405, 0xD5CA, 0x7406, 0xD7E2, 0x7407, 0xE2AF, + 0x7409, 0xD7B8, 0x7413, 0xE8CD, 0x741B, 0xF6DA, 0x7420, 0xEFA2, + 0x7421, 0xE2DA, 0x7422, 0xF6FC, 0x7425, 0xFBD0, 0x7426, 0xD1AD, + 0x7428, 0xCDE4, 0x742A, 0xD1AE, 0x742B, 0xDCED, 0x742C, 0xE8CE, + 0x742E, 0xF0F9, 0x742F, 0xCEB5, 0x7430, 0xE6FC, 0x7433, 0xD7FB, + 0x7434, 0xD0D6, 0x7435, 0xDDF5, 0x7436, 0xF7F1, 0x7438, 0xF6FD, + 0x743A, 0xDBF7, 0x743F, 0xFBEA, 0x7440, 0xE9DC, 0x7441, 0xD9C1, + 0x7443, 0xF5F2, 0x7444, 0xE0C5, 0x744B, 0xEAD4, 0x7455, 0xF9C2, + 0x7457, 0xEABC, 0x7459, 0xD2C5, 0x745A, 0xFBD1, 0x745B, 0xE7C0, + 0x745C, 0xEBA5, 0x745E, 0xDFFA, 0x745F, 0xE3A2, 0x7460, 0xD7B9, + 0x7462, 0xE9C3, 0x7464, 0xE8FD, 0x7465, 0xE8AF, 0x7468, 0xF2D3, + 0x7469, 0xFBA9, 0x746A, 0xD8A5, 0x746F, 0xD5CB, 0x747E, 0xD0C8, + 0x7482, 0xD1AF, 0x7483, 0xD7E3, 0x7487, 0xE0C6, 0x7489, 0xD6A2, + 0x748B, 0xEDF0, 0x7498, 0xD7F3, 0x749C, 0xFCD4, 0x749E, 0xDAD7, + 0x749F, 0xCCDF, 0x74A1, 0xF2D4, 0x74A3, 0xD1B0, 0x74A5, 0xCCE0, + 0x74A7, 0xDBFD, 0x74A8, 0xF3BF, 0x74AA, 0xF0D1, 0x74B0, 0xFCBB, + 0x74B2, 0xE2B0, 0x74B5, 0xE6A5, 0x74B9, 0xE2DB, 0x74BD, 0xDFDE, + 0x74BF, 0xE0C7, 0x74C6, 0xF2EF, 0x74CA, 0xCCE1, 0x74CF, 0xD6EA, + 0x74D4, 0xE7C2, 0x74D8, 0xCEB6, 0x74DA, 0xF3C0, 0x74DC, 0xCDFE, + 0x74E0, 0xFBD2, 0x74E2, 0xF8F8, 0x74E3, 0xF7FB, 0x74E6, 0xE8BF, + 0x74EE, 0xE8B7, 0x74F7, 0xEDB6, 0x7501, 0xDCBA, 0x7504, 0xCCB4, + 0x7511, 0xF1F7, 0x7515, 0xE8B8, 0x7518, 0xCAF6, 0x751A, 0xE4A4, + 0x751B, 0xF4D6, 0x751F, 0xDFE6, 0x7523, 0xDFA7, 0x7525, 0xDFE7, + 0x7526, 0xE1C1, 0x7528, 0xE9C4, 0x752B, 0xDCCB, 0x752C, 0xE9C5, + 0x7530, 0xEFA3, 0x7531, 0xEBA6, 0x7532, 0xCBA3, 0x7533, 0xE3E9, + 0x7537, 0xD1FB, 0x7538, 0xEFA4, 0x753A, 0xEFEB, 0x7547, 0xD0B4, + 0x754C, 0xCDA3, 0x754F, 0xE8E6, 0x7551, 0xEFA5, 0x7553, 0xD3CC, + 0x7554, 0xDAED, 0x7559, 0xD7BA, 0x755B, 0xF2D5, 0x755C, 0xF5E5, + 0x755D, 0xD9EF, 0x7562, 0xF9B4, 0x7565, 0xD5D4, 0x7566, 0xFDCF, + 0x756A, 0xDBE3, 0x756F, 0xF1E1, 0x7570, 0xECB6, 0x7575, 0xFBFE, + 0x7576, 0xD3D7, 0x7578, 0xD1B1, 0x757A, 0xCBB1, 0x757F, 0xD1B2, + 0x7586, 0xCBB2, 0x7587, 0xF1C2, 0x758A, 0xF4E1, 0x758B, 0xF9B5, + 0x758E, 0xE1C3, 0x758F, 0xE1C2, 0x7591, 0xEBF7, 0x759D, 0xDFA8, + 0x75A5, 0xCBCA, 0x75AB, 0xE6B9, 0x75B1, 0xF8DE, 0x75B2, 0xF9AA, + 0x75B3, 0xCAF7, 0x75B5, 0xEDB7, 0x75B8, 0xD3B8, 0x75B9, 0xF2D6, + 0x75BC, 0xD4D9, 0x75BD, 0xEEC5, 0x75BE, 0xF2F0, 0x75C2, 0xCAB2, + 0x75C5, 0xDCBB, 0x75C7, 0xF1F8, 0x75CD, 0xECB7, 0x75D2, 0xE5CA, + 0x75D4, 0xF6C0, 0x75D5, 0xFDDD, 0x75D8, 0xD4E3, 0x75D9, 0xCCE2, + 0x75DB, 0xF7D4, 0x75E2, 0xD7E5, 0x75F0, 0xD3C3, 0x75F2, 0xD8A6, + 0x75F4, 0xF6C1, 0x75FA, 0xDDF6, 0x75FC, 0xCDC0, 0x7600, 0xE5DC, + 0x760D, 0xE5CB, 0x7619, 0xE1C4, 0x761F, 0xE8B0, 0x7620, 0xF4B0, + 0x7621, 0xF3EA, 0x7622, 0xDAEE, 0x7624, 0xD7BB, 0x7626, 0xE2B1, + 0x763B, 0xD7AA, 0x7642, 0xD6FB, 0x764C, 0xE4DF, 0x764E, 0xCAD6, + 0x7652, 0xEBA8, 0x7656, 0xDBFE, 0x7661, 0xF6C2, 0x7664, 0xEFBB, + 0x7669, 0xD4FD, 0x766C, 0xE0C8, 0x7670, 0xE8B9, 0x7672, 0xEFA6, + 0x7678, 0xCDA4, 0x767B, 0xD4F4, 0x767C, 0xDBA1, 0x767D, 0xDBDC, + 0x767E, 0xDBDD, 0x7684, 0xEEDC, 0x7686, 0xCBCB, 0x7687, 0xFCD5, + 0x768E, 0xCEEB, 0x7690, 0xCDC1, 0x7693, 0xFBD3, 0x76AE, 0xF9AB, + 0x76BA, 0xF5D4, 0x76BF, 0xD9A9, 0x76C2, 0xE9DD, 0x76C3, 0xDBCD, + 0x76C6, 0xDDCE, 0x76C8, 0xE7C3, 0x76CA, 0xECCC, 0x76D2, 0xF9EC, + 0x76D6, 0xCBCC, 0x76DB, 0xE0FC, 0x76DC, 0xD4A8, 0x76DE, 0xEDD3, + 0x76DF, 0xD8EF, 0x76E1, 0xF2D7, 0x76E3, 0xCAF8, 0x76E4, 0xDAEF, + 0x76E7, 0xD6D4, 0x76EE, 0xD9CD, 0x76F2, 0xD8EE, 0x76F4, 0xF2C1, + 0x76F8, 0xDFD3, 0x76FC, 0xDAF0, 0x76FE, 0xE2EA, 0x7701, 0xE0FD, + 0x7704, 0xD8F8, 0x7708, 0xF7AF, 0x7709, 0xDAB6, 0x770B, 0xCAD7, + 0x771E, 0xF2D8, 0x7720, 0xD8F9, 0x7729, 0xFADF, 0x7737, 0xCFEF, + 0x7738, 0xD9C2, 0x773A, 0xF0D2, 0x773C, 0xE4D1, 0x7740, 0xF3B7, + 0x774D, 0xFAE0, 0x775B, 0xEFEC, 0x7761, 0xE2B2, 0x7763, 0xD4BD, + 0x7766, 0xD9CE, 0x776B, 0xF4E2, 0x7779, 0xD4A9, 0x777E, 0xCDC2, + 0x777F, 0xE7DA, 0x778B, 0xF2D9, 0x7791, 0xD9AA, 0x779E, 0xD8BE, + 0x77A5, 0xDCAD, 0x77AC, 0xE2EB, 0x77AD, 0xD6FC, 0x77B0, 0xCAF9, + 0x77B3, 0xD4DA, 0x77BB, 0xF4D7, 0x77BC, 0xCCA1, 0x77BF, 0xCFBA, + 0x77D7, 0xF5B8, 0x77DB, 0xD9C3, 0x77DC, 0xD0E8, 0x77E2, 0xE3C5, + 0x77E3, 0xEBF8, 0x77E5, 0xF2B1, 0x77E9, 0xCFBB, 0x77ED, 0xD3AD, + 0x77EE, 0xE8E1, 0x77EF, 0xCEEC, 0x77F3, 0xE0B4, 0x7802, 0xDEE3, + 0x7812, 0xDDF7, 0x7825, 0xF2B2, 0x7826, 0xF3F6, 0x7827, 0xF6DB, + 0x782C, 0xD7FE, 0x7832, 0xF8DF, 0x7834, 0xF7F2, 0x7845, 0xD0A9, + 0x784F, 0xE6DA, 0x785D, 0xF5A6, 0x786B, 0xD7BC, 0x786C, 0xCCE3, + 0x786F, 0xE6DB, 0x787C, 0xDDDD, 0x7881, 0xD1B3, 0x7887, 0xEFED, + 0x788C, 0xD6DE, 0x788D, 0xE4F4, 0x788E, 0xE1EF, 0x7891, 0xDDF8, + 0x7897, 0xE8CF, 0x78A3, 0xCAE5, 0x78A7, 0xDCA1, 0x78A9, 0xE0B5, + 0x78BA, 0xFCAC, 0x78BB, 0xFCAD, 0x78BC, 0xD8A7, 0x78C1, 0xEDB8, + 0x78C5, 0xDBB6, 0x78CA, 0xD6F0, 0x78CB, 0xF3AF, 0x78CE, 0xCDA5, + 0x78D0, 0xDAF1, 0x78E8, 0xD8A8, 0x78EC, 0xCCE4, 0x78EF, 0xD1B4, + 0x78F5, 0xCAD8, 0x78FB, 0xDAF2, 0x7901, 0xF5A7, 0x790E, 0xF5A8, + 0x7916, 0xE6A6, 0x792A, 0xD5EC, 0x792B, 0xD5F8, 0x792C, 0xDAF3, + 0x793A, 0xE3C6, 0x793E, 0xDEE4, 0x7940, 0xDEE5, 0x7941, 0xD1B5, + 0x7947, 0xD1B6, 0x7948, 0xD1B7, 0x7949, 0xF2B3, 0x7950, 0xE9DE, + 0x7956, 0xF0D3, 0x7957, 0xF2B4, 0x795A, 0xF0D4, 0x795B, 0xCBE4, + 0x795C, 0xFBD4, 0x795D, 0xF5E6, 0x795E, 0xE3EA, 0x7960, 0xDEE6, + 0x7965, 0xDFD4, 0x7968, 0xF8F9, 0x796D, 0xF0AE, 0x797A, 0xD1B8, + 0x797F, 0xD6DF, 0x7981, 0xD0D7, 0x798D, 0xFCA1, 0x798E, 0xEFEE, + 0x798F, 0xDCD8, 0x7991, 0xE9DF, 0x79A6, 0xE5DD, 0x79A7, 0xFDFB, + 0x79AA, 0xE0C9, 0x79AE, 0xD6C9, 0x79B1, 0xD4AA, 0x79B3, 0xE5CC, + 0x79B9, 0xE9E0, 0x79BD, 0xD0D8, 0x79BE, 0xFCA2, 0x79BF, 0xD4BE, + 0x79C0, 0xE2B3, 0x79C1, 0xDEE7, 0x79C9, 0xDCBC, 0x79CA, 0xD2B6, + 0x79CB, 0xF5D5, 0x79D1, 0xCEA1, 0x79D2, 0xF5A9, 0x79D5, 0xDDF9, + 0x79D8, 0xDDFA, 0x79DF, 0xF0D5, 0x79E4, 0xF6DF, 0x79E6, 0xF2DA, + 0x79E7, 0xE4EB, 0x79E9, 0xF2F1, 0x79FB, 0xECB9, 0x7A00, 0xFDFC, + 0x7A05, 0xE1AA, 0x7A08, 0xCAD9, 0x7A0B, 0xEFEF, 0x7A0D, 0xF5AA, + 0x7A14, 0xECF9, 0x7A17, 0xF8AD, 0x7A19, 0xF2C2, 0x7A1A, 0xF6C3, + 0x7A1C, 0xD7D2, 0x7A1F, 0xF9A2, 0x7A20, 0xF0D6, 0x7A2E, 0xF0FA, + 0x7A31, 0xF6E0, 0x7A36, 0xE9F3, 0x7A37, 0xF2C3, 0x7A3B, 0xD4AB, + 0x7A3C, 0xCAB3, 0x7A3D, 0xCDA6, 0x7A3F, 0xCDC3, 0x7A40, 0xCDDA, + 0x7A46, 0xD9CF, 0x7A49, 0xF6C4, 0x7A4D, 0xEEDD, 0x7A4E, 0xE7C4, + 0x7A57, 0xE2B4, 0x7A61, 0xDFE2, 0x7A62, 0xE7DB, 0x7A69, 0xE8B1, + 0x7A6B, 0xFCAE, 0x7A70, 0xE5CD, 0x7A74, 0xFAEB, 0x7A76, 0xCFBC, + 0x7A79, 0xCFE2, 0x7A7A, 0xCDF6, 0x7A7D, 0xEFF0, 0x7A7F, 0xF4BE, + 0x7A81, 0xD4CD, 0x7A84, 0xF3B8, 0x7A88, 0xE9A1, 0x7A92, 0xF2F2, + 0x7A93, 0xF3EB, 0x7A95, 0xF0D7, 0x7A98, 0xCFD7, 0x7A9F, 0xCFDF, + 0x7AA9, 0xE8C0, 0x7AAA, 0xE8C1, 0x7AAE, 0xCFE3, 0x7AAF, 0xE9A2, + 0x7ABA, 0xD0AA, 0x7AC4, 0xF3C1, 0x7AC5, 0xD0AB, 0x7AC7, 0xD4E4, + 0x7ACA, 0xEFBC, 0x7ACB, 0xD8A1, 0x7AD7, 0xD9DF, 0x7AD9, 0xF3D7, + 0x7ADD, 0xDCBD, 0x7ADF, 0xCCE5, 0x7AE0, 0xEDF1, 0x7AE3, 0xF1E2, + 0x7AE5, 0xD4DB, 0x7AEA, 0xE2B5, 0x7AED, 0xCAE6, 0x7AEF, 0xD3AE, + 0x7AF6, 0xCCE6, 0x7AF9, 0xF1D3, 0x7AFA, 0xF5E7, 0x7AFF, 0xCADA, + 0x7B0F, 0xFBEE, 0x7B11, 0xE1C5, 0x7B19, 0xDFE9, 0x7B1B, 0xEEDE, + 0x7B1E, 0xF7C2, 0x7B20, 0xD8A2, 0x7B26, 0xDDAC, 0x7B2C, 0xF0AF, + 0x7B2D, 0xD6BD, 0x7B39, 0xE1AB, 0x7B46, 0xF9B6, 0x7B49, 0xD4F5, + 0x7B4B, 0xD0C9, 0x7B4C, 0xEFA7, 0x7B4D, 0xE2EC, 0x7B4F, 0xDBEA, + 0x7B50, 0xCECC, 0x7B51, 0xF5E8, 0x7B52, 0xF7D5, 0x7B54, 0xD3CD, + 0x7B56, 0xF3FE, 0x7B60, 0xD0B5, 0x7B6C, 0xE0FE, 0x7B6E, 0xDFFB, + 0x7B75, 0xE6DD, 0x7B7D, 0xE8A4, 0x7B87, 0xCBCD, 0x7B8B, 0xEFA8, + 0x7B8F, 0xEEB4, 0x7B94, 0xDAD8, 0x7B95, 0xD1B9, 0x7B97, 0xDFA9, + 0x7B9A, 0xF3B0, 0x7B9D, 0xCCC4, 0x7BA1, 0xCEB7, 0x7BAD, 0xEFA9, + 0x7BB1, 0xDFD5, 0x7BB4, 0xEDD7, 0x7BB8, 0xEEC6, 0x7BC0, 0xEFBD, + 0x7BC1, 0xFCD6, 0x7BC4, 0xDBF4, 0x7BC6, 0xEFAA, 0x7BC7, 0xF8B9, + 0x7BC9, 0xF5E9, 0x7BD2, 0xE3D9, 0x7BE0, 0xE1C6, 0x7BE4, 0xD4BF, + 0x7BE9, 0xDEE8, 0x7C07, 0xF0EA, 0x7C12, 0xF3C2, 0x7C1E, 0xD3AF, + 0x7C21, 0xCADB, 0x7C27, 0xFCD7, 0x7C2A, 0xEDD8, 0x7C2B, 0xE1C7, + 0x7C3D, 0xF4D8, 0x7C3E, 0xD6B3, 0x7C3F, 0xDDAD, 0x7C43, 0xD5BE, + 0x7C4C, 0xF1C3, 0x7C4D, 0xEEDF, 0x7C60, 0xD6EB, 0x7C64, 0xF4D9, + 0x7C6C, 0xD7E6, 0x7C73, 0xDAB7, 0x7C83, 0xDDFB, 0x7C89, 0xDDCF, + 0x7C92, 0xD8A3, 0x7C95, 0xDAD9, 0x7C97, 0xF0D8, 0x7C98, 0xEFC4, + 0x7C9F, 0xE1D8, 0x7CA5, 0xF1D4, 0x7CA7, 0xEDF2, 0x7CAE, 0xD5DB, + 0x7CB1, 0xD5DC, 0x7CB2, 0xF3C4, 0x7CB3, 0xCBD7, 0x7CB9, 0xE2B6, + 0x7CBE, 0xEFF1, 0x7CCA, 0xFBD5, 0x7CD6, 0xD3D8, 0x7CDE, 0xDDD0, + 0x7CDF, 0xF0D9, 0x7CE0, 0xCBB3, 0x7CE7, 0xD5DD, 0x7CFB, 0xCDA7, + 0x7CFE, 0xD0AC, 0x7D00, 0xD1BA, 0x7D02, 0xF1C4, 0x7D04, 0xE5B3, + 0x7D05, 0xFBF5, 0x7D06, 0xE9E1, 0x7D07, 0xFDE0, 0x7D08, 0xFCBC, + 0x7D0A, 0xDAA2, 0x7D0B, 0xDAA3, 0x7D0D, 0xD2A1, 0x7D10, 0xD2EF, + 0x7D14, 0xE2ED, 0x7D17, 0xDEE9, 0x7D18, 0xCEDC, 0x7D19, 0xF2B5, + 0x7D1A, 0xD0E4, 0x7D1B, 0xDDD1, 0x7D20, 0xE1C8, 0x7D21, 0xDBB7, + 0x7D22, 0xDFE3, 0x7D2B, 0xEDB9, 0x7D2C, 0xF1C5, 0x7D2E, 0xF3CF, + 0x7D2F, 0xD7AB, 0x7D30, 0xE1AC, 0x7D33, 0xE3EB, 0x7D35, 0xEEC7, + 0x7D39, 0xE1C9, 0x7D3A, 0xCAFA, 0x7D42, 0xF0FB, 0x7D43, 0xFAE1, + 0x7D44, 0xF0DA, 0x7D45, 0xCCE7, 0x7D46, 0xDAF4, 0x7D50, 0xCCBF, + 0x7D5E, 0xCEED, 0x7D61, 0xD5A9, 0x7D62, 0xFAE2, 0x7D66, 0xD0E5, + 0x7D68, 0xEBD6, 0x7D6A, 0xECDF, 0x7D6E, 0xDFFC, 0x7D71, 0xF7D6, + 0x7D72, 0xDEEA, 0x7D73, 0xCBB4, 0x7D76, 0xEFBE, 0x7D79, 0xCCB5, + 0x7D7F, 0xCFBD, 0x7D8E, 0xEFF2, 0x7D8F, 0xE2B7, 0x7D93, 0xCCE8, + 0x7D9C, 0xF0FC, 0x7DA0, 0xD6E0, 0x7DA2, 0xF1C6, 0x7DAC, 0xE2B8, + 0x7DAD, 0xEBAB, 0x7DB1, 0xCBB5, 0x7DB2, 0xD8D1, 0x7DB4, 0xF4CE, + 0x7DB5, 0xF3F7, 0x7DB8, 0xD7C6, 0x7DBA, 0xD1BB, 0x7DBB, 0xF7AA, + 0x7DBD, 0xEDCA, 0x7DBE, 0xD7D3, 0x7DBF, 0xD8FA, 0x7DC7, 0xF6C5, + 0x7DCA, 0xD1CC, 0x7DCB, 0xDDFC, 0x7DD6, 0xDFFD, 0x7DD8, 0xF9E5, + 0x7DDA, 0xE0CA, 0x7DDD, 0xF2FD, 0x7DDE, 0xD3B0, 0x7DE0, 0xF4F3, + 0x7DE1, 0xDAC9, 0x7DE3, 0xE6DE, 0x7DE8, 0xF8BA, 0x7DE9, 0xE8D0, + 0x7DEC, 0xD8FB, 0x7DEF, 0xEAD5, 0x7DF4, 0xD6A3, 0x7DFB, 0xF6C6, + 0x7E09, 0xF2DB, 0x7E0A, 0xE4FC, 0x7E15, 0xE8B2, 0x7E1B, 0xDADA, + 0x7E1D, 0xF2DC, 0x7E1E, 0xFBD6, 0x7E1F, 0xE9B2, 0x7E21, 0xEEAD, + 0x7E23, 0xFAE3, 0x7E2B, 0xDCEE, 0x7E2E, 0xF5EA, 0x7E2F, 0xE6E0, + 0x7E31, 0xF0FD, 0x7E37, 0xD7AC, 0x7E3D, 0xF5C5, 0x7E3E, 0xEEE0, + 0x7E41, 0xDBE5, 0x7E43, 0xDDDE, 0x7E46, 0xD9F0, 0x7E47, 0xE9A3, + 0x7E52, 0xF1F9, 0x7E54, 0xF2C4, 0x7E55, 0xE0CB, 0x7E5E, 0xE9A4, + 0x7E61, 0xE2B9, 0x7E69, 0xE3B1, 0x7E6A, 0xFCEB, 0x7E6B, 0xCDA8, + 0x7E6D, 0xCCB6, 0x7E70, 0xF0DB, 0x7E79, 0xE6BA, 0x7E7C, 0xCDA9, + 0x7E82, 0xF3C3, 0x7E8C, 0xE1D9, 0x7E8F, 0xEFAB, 0x7E93, 0xE7C5, + 0x7E96, 0xE0E9, 0x7E98, 0xF3C5, 0x7E9B, 0xD4C0, 0x7E9C, 0xD5BF, + 0x7F36, 0xDDAE, 0x7F38, 0xF9FC, 0x7F3A, 0xCCC0, 0x7F4C, 0xE5A2, + 0x7F50, 0xCEB8, 0x7F54, 0xD8D2, 0x7F55, 0xF9D6, 0x7F6A, 0xF1AA, + 0x7F6B, 0xCED1, 0x7F6E, 0xF6C7, 0x7F70, 0xDBEB, 0x7F72, 0xDFFE, + 0x7F75, 0xD8E1, 0x7F77, 0xF7F3, 0x7F79, 0xD7E7, 0x7F85, 0xD4FE, + 0x7F88, 0xD1BC, 0x7F8A, 0xE5CF, 0x7F8C, 0xCBB6, 0x7F8E, 0xDAB8, + 0x7F94, 0xCDC4, 0x7F9A, 0xD6BE, 0x7F9E, 0xE2BA, 0x7FA4, 0xCFD8, + 0x7FA8, 0xE0CC, 0x7FA9, 0xEBF9, 0x7FB2, 0xFDFD, 0x7FB8, 0xD7E8, + 0x7FB9, 0xCBD8, 0x7FBD, 0xE9E2, 0x7FC1, 0xE8BA, 0x7FC5, 0xE3C7, + 0x7FCA, 0xECCD, 0x7FCC, 0xECCE, 0x7FCE, 0xD6BF, 0x7FD2, 0xE3A7, + 0x7FD4, 0xDFD6, 0x7FD5, 0xFDE8, 0x7FDF, 0xEEE1, 0x7FE0, 0xF6A8, + 0x7FE1, 0xDDFD, 0x7FE9, 0xF8BB, 0x7FEB, 0xE8D1, 0x7FF0, 0xF9D7, + 0x7FF9, 0xCEEE, 0x7FFC, 0xECCF, 0x8000, 0xE9A5, 0x8001, 0xD6D5, + 0x8003, 0xCDC5, 0x8005, 0xEDBA, 0x8006, 0xD1BD, 0x8009, 0xCFBE, + 0x800C, 0xECBB, 0x8010, 0xD2B1, 0x8015, 0xCCE9, 0x8017, 0xD9C4, + 0x8018, 0xE9FC, 0x802D, 0xD1BE, 0x8033, 0xECBC, 0x8036, 0xE5AD, + 0x803D, 0xF7B0, 0x803F, 0xCCEA, 0x8043, 0xD3C4, 0x8046, 0xD6C0, + 0x804A, 0xD6FD, 0x8056, 0xE1A1, 0x8058, 0xDEBD, 0x805A, 0xF6A9, + 0x805E, 0xDAA4, 0x806F, 0xD6A4, 0x8070, 0xF5C6, 0x8072, 0xE1A2, + 0x8073, 0xE9C6, 0x8077, 0xF2C5, 0x807D, 0xF4E9, 0x807E, 0xD6EC, + 0x807F, 0xEBD3, 0x8084, 0xECBD, 0x8085, 0xE2DC, 0x8086, 0xDEEB, + 0x8087, 0xF0DC, 0x8089, 0xEBBF, 0x808B, 0xD7CE, 0x808C, 0xD1BF, + 0x8096, 0xF5AB, 0x809B, 0xF9FD, 0x809D, 0xCADC, 0x80A1, 0xCDC6, + 0x80A2, 0xF2B6, 0x80A5, 0xDDFE, 0x80A9, 0xCCB7, 0x80AA, 0xDBB8, + 0x80AF, 0xD0E9, 0x80B1, 0xCEDD, 0x80B2, 0xEBC0, 0x80B4, 0xFDA2, + 0x80BA, 0xF8CB, 0x80C3, 0xEAD6, 0x80C4, 0xF1B0, 0x80CC, 0xDBCE, + 0x80CE, 0xF7C3, 0x80DA, 0xDBCF, 0x80DB, 0xCBA4, 0x80DE, 0xF8E0, + 0x80E1, 0xFBD7, 0x80E4, 0xEBCA, 0x80E5, 0xE0A1, 0x80F1, 0xCECD, + 0x80F4, 0xD4DC, 0x80F8, 0xFDD8, 0x80FD, 0xD2F6, 0x8102, 0xF2B7, + 0x8105, 0xFAF6, 0x8106, 0xF6AA, 0x8107, 0xFAF7, 0x8108, 0xD8E6, + 0x810A, 0xF4B1, 0x8118, 0xE8D2, 0x811A, 0xCAC5, 0x811B, 0xCCEB, + 0x8123, 0xE2EE, 0x8129, 0xE2BB, 0x812B, 0xF7AD, 0x812F, 0xF8E1, + 0x8139, 0xF3EC, 0x813E, 0xDEA1, 0x814B, 0xE4FD, 0x814E, 0xE3EC, + 0x8150, 0xDDAF, 0x8151, 0xDDB0, 0x8154, 0xCBB7, 0x8155, 0xE8D3, + 0x8165, 0xE1A3, 0x8166, 0xD2E0, 0x816B, 0xF0FE, 0x8170, 0xE9A6, + 0x8171, 0xCBF2, 0x8178, 0xEDF3, 0x8179, 0xDCD9, 0x817A, 0xE0CD, + 0x817F, 0xF7DA, 0x8180, 0xDBB9, 0x8188, 0xCCAE, 0x818A, 0xDADB, + 0x818F, 0xCDC7, 0x819A, 0xDDB1, 0x819C, 0xD8AF, 0x819D, 0xE3A3, + 0x81A0, 0xCEEF, 0x81A3, 0xF2F3, 0x81A8, 0xF8B3, 0x81B3, 0xE0CE, + 0x81B5, 0xF5FD, 0x81BA, 0xEBEC, 0x81BD, 0xD3C5, 0x81BE, 0xFCEC, + 0x81BF, 0xD2DB, 0x81C0, 0xD4EB, 0x81C2, 0xDEA2, 0x81C6, 0xE5E6, + 0x81CD, 0xF0B0, 0x81D8, 0xD5C4, 0x81DF, 0xEDF4, 0x81E3, 0xE3ED, + 0x81E5, 0xE8C2, 0x81E7, 0xEDF5, 0x81E8, 0xD7FC, 0x81EA, 0xEDBB, + 0x81ED, 0xF6AB, 0x81F3, 0xF2B8, 0x81F4, 0xF6C8, 0x81FA, 0xD3E6, + 0x81FB, 0xF2DD, 0x81FC, 0xCFBF, 0x81FE, 0xEBAC, 0x8205, 0xCFC0, + 0x8207, 0xE6A8, 0x8208, 0xFDE9, 0x820A, 0xCFC1, 0x820C, 0xE0DF, + 0x820D, 0xDEEC, 0x8212, 0xE0A2, 0x821B, 0xF4BF, 0x821C, 0xE2EF, + 0x821E, 0xD9F1, 0x821F, 0xF1C7, 0x8221, 0xCBB8, 0x822A, 0xF9FE, + 0x822B, 0xDBBA, 0x822C, 0xDAF5, 0x8235, 0xF6EC, 0x8236, 0xDADC, + 0x8237, 0xFAE4, 0x8239, 0xE0CF, 0x8240, 0xDDB2, 0x8245, 0xE6A9, + 0x8247, 0xEFF3, 0x8259, 0xF3ED, 0x8264, 0xEBFA, 0x8266, 0xF9E6, + 0x826E, 0xCADD, 0x826F, 0xD5DE, 0x8271, 0xCADE, 0x8272, 0xDFE4, + 0x8276, 0xE6FD, 0x8278, 0xF5AC, 0x827E, 0xE4F5, 0x828B, 0xE9E3, + 0x828D, 0xEDCB, 0x828E, 0xCFE4, 0x8292, 0xD8D3, 0x8299, 0xDDB3, + 0x829A, 0xD4EC, 0x829D, 0xF2B9, 0x829F, 0xDFB7, 0x82A5, 0xCBCE, + 0x82A6, 0xFBD8, 0x82A9, 0xD0D9, 0x82AC, 0xDDD2, 0x82AD, 0xF7F4, + 0x82AE, 0xE7DC, 0x82AF, 0xE4A5, 0x82B1, 0xFCA3, 0x82B3, 0xDBBB, + 0x82B7, 0xF2BA, 0x82B8, 0xE9FD, 0x82B9, 0xD0CA, 0x82BB, 0xF5D6, + 0x82BC, 0xD9C5, 0x82BD, 0xE4B4, 0x82BF, 0xEDA7, 0x82D1, 0xEABD, + 0x82D2, 0xE6FE, 0x82D4, 0xF7C4, 0x82D5, 0xF5AD, 0x82D7, 0xD9E0, + 0x82DB, 0xCAB4, 0x82DE, 0xF8E2, 0x82DF, 0xCFC2, 0x82E1, 0xECBE, + 0x82E5, 0xE5B4, 0x82E6, 0xCDC8, 0x82E7, 0xEEC8, 0x82F1, 0xE7C8, + 0x82FD, 0xCDC9, 0x82FE, 0xF9B7, 0x8301, 0xF1E8, 0x8302, 0xD9F2, + 0x8303, 0xDBF5, 0x8304, 0xCAB5, 0x8305, 0xD9C6, 0x8309, 0xD8C9, + 0x8317, 0xD9AB, 0x8328, 0xEDBC, 0x832B, 0xD8D4, 0x832F, 0xDCDA, + 0x8331, 0xE2BC, 0x8334, 0xFCED, 0x8335, 0xECE0, 0x8336, 0xD2FE, + 0x8338, 0xE9C7, 0x8339, 0xE6AA, 0x8340, 0xE2F0, 0x8347, 0xFABB, + 0x8349, 0xF5AE, 0x834A, 0xFBAA, 0x834F, 0xECFB, 0x8351, 0xECBF, + 0x8352, 0xFCD8, 0x8373, 0xD4E5, 0x8377, 0xF9C3, 0x837B, 0xEEE2, + 0x8389, 0xD7E9, 0x838A, 0xEDF6, 0x838E, 0xDEED, 0x8396, 0xCCEC, + 0x8398, 0xE3EE, 0x839E, 0xE8D4, 0x83A2, 0xFAF8, 0x83A9, 0xDDB4, + 0x83AA, 0xE4B5, 0x83AB, 0xD8B0, 0x83BD, 0xD8D5, 0x83C1, 0xF4EA, + 0x83C5, 0xCEB9, 0x83C9, 0xD6E1, 0x83CA, 0xCFD2, 0x83CC, 0xD0B6, + 0x83D3, 0xCEA2, 0x83D6, 0xF3EE, 0x83DC, 0xF3F8, 0x83E9, 0xDCCC, + 0x83EB, 0xD0CB, 0x83EF, 0xFCA4, 0x83F0, 0xCDCA, 0x83F1, 0xD7D4, + 0x83F2, 0xDEA3, 0x83F4, 0xE4E0, 0x83F9, 0xEEC9, 0x83FD, 0xE2DD, + 0x8403, 0xF5FE, 0x8404, 0xD4AC, 0x840A, 0xD5D1, 0x840C, 0xD8F0, + 0x840D, 0xF8C3, 0x840E, 0xEAD7, 0x8429, 0xF5D7, 0x842C, 0xD8BF, + 0x8431, 0xFDC0, 0x8438, 0xEBAD, 0x843D, 0xD5AA, 0x8449, 0xE7A8, + 0x8457, 0xEECA, 0x845B, 0xCAE7, 0x8461, 0xF8E3, 0x8463, 0xD4DD, + 0x8466, 0xEAD8, 0x846B, 0xFBD9, 0x846C, 0xEDF7, 0x846F, 0xE5B5, + 0x8475, 0xD0AD, 0x847A, 0xF1F1, 0x8490, 0xE2BD, 0x8494, 0xE3C8, + 0x8499, 0xD9D5, 0x849C, 0xDFAA, 0x84A1, 0xDBBC, 0x84B2, 0xF8E4, + 0x84B8, 0xF1FA, 0x84BB, 0xE5B6, 0x84BC, 0xF3EF, 0x84BF, 0xFBDA, + 0x84C0, 0xE1E0, 0x84C2, 0xD9AC, 0x84C4, 0xF5EB, 0x84C6, 0xE0B6, + 0x84C9, 0xE9C8, 0x84CB, 0xCBCF, 0x84CD, 0xE3C9, 0x84D1, 0xDEEE, + 0x84DA, 0xE2BE, 0x84EC, 0xDCEF, 0x84EE, 0xD6A5, 0x84F4, 0xE2F1, + 0x84FC, 0xD6FE, 0x8511, 0xD9A1, 0x8513, 0xD8C0, 0x8514, 0xDCDB, + 0x8517, 0xEDBD, 0x8518, 0xDFB8, 0x851A, 0xEAA5, 0x851E, 0xD7AD, + 0x8521, 0xF3F9, 0x8523, 0xEDF8, 0x8525, 0xF5C7, 0x852C, 0xE1CA, + 0x852D, 0xEBE3, 0x852F, 0xF2DE, 0x853D, 0xF8CC, 0x853F, 0xEAD9, + 0x8541, 0xD3C6, 0x8543, 0xDBE6, 0x8549, 0xF5AF, 0x854E, 0xCEF0, + 0x8553, 0xE9FE, 0x8559, 0xFBB6, 0x8563, 0xE2F2, 0x8568, 0xCFF2, + 0x8569, 0xF7B9, 0x856A, 0xD9F3, 0x856D, 0xE1CB, 0x8584, 0xDADD, + 0x8587, 0xDAB9, 0x858F, 0xEBFB, 0x8591, 0xCBB9, 0x8594, 0xEDF9, + 0x859B, 0xE0E0, 0x85A6, 0xF4C0, 0x85A8, 0xFDBC, 0x85A9, 0xDFB1, + 0x85AA, 0xE3EF, 0x85AF, 0xE0A3, 0x85B0, 0xFDB9, 0x85BA, 0xF0B1, + 0x85C1, 0xCDCB, 0x85C9, 0xEDBE, 0x85CD, 0xD5C0, 0x85CE, 0xE3F0, + 0x85CF, 0xEDFA, 0x85D5, 0xE9E4, 0x85DC, 0xD5ED, 0x85DD, 0xE7DD, + 0x85E4, 0xD4F6, 0x85E5, 0xE5B7, 0x85E9, 0xDBE7, 0x85EA, 0xE2BF, + 0x85F7, 0xEECB, 0x85FA, 0xD7F4, 0x85FB, 0xF0DD, 0x85FF, 0xCEAB, + 0x8602, 0xE7DE, 0x8606, 0xD6D6, 0x8607, 0xE1CC, 0x860A, 0xE8B3, + 0x8616, 0xE5EE, 0x8617, 0xDCA2, 0x861A, 0xE0D0, 0x862D, 0xD5B5, + 0x863F, 0xD5A1, 0x864E, 0xFBDB, 0x8650, 0xF9CB, 0x8654, 0xCBF3, + 0x8655, 0xF4A5, 0x865B, 0xFAC8, 0x865C, 0xD6D7, 0x865E, 0xE9E5, + 0x865F, 0xFBDC, 0x8667, 0xFDD0, 0x8679, 0xFBF6, 0x868A, 0xDAA5, + 0x868C, 0xDBBD, 0x8693, 0xECE2, 0x86A3, 0xCDF7, 0x86A4, 0xF0DE, + 0x86A9, 0xF6C9, 0x86C7, 0xDEEF, 0x86CB, 0xD3B1, 0x86D4, 0xFCEE, + 0x86D9, 0xE8C3, 0x86DB, 0xF1C8, 0x86DF, 0xCEF1, 0x86E4, 0xF9ED, + 0x86ED, 0xF2F4, 0x86FE, 0xE4B6, 0x8700, 0xF5B9, 0x8702, 0xDCF0, + 0x8703, 0xE3F1, 0x8708, 0xE8A5, 0x8718, 0xF2BB, 0x871A, 0xDEA4, + 0x871C, 0xDACC, 0x874E, 0xCAE9, 0x8755, 0xE3DA, 0x8757, 0xFCD9, + 0x875F, 0xEADA, 0x8766, 0xF9C4, 0x8768, 0xE3A4, 0x8774, 0xFBDD, + 0x8776, 0xEFCA, 0x8778, 0xE8C4, 0x8782, 0xD5CC, 0x878D, 0xEBD7, + 0x879F, 0xD9AD, 0x87A2, 0xFBAB, 0x87B3, 0xD3D9, 0x87BA, 0xD5A2, + 0x87C4, 0xF6DE, 0x87E0, 0xDAF6, 0x87EC, 0xE0D1, 0x87EF, 0xE9A8, + 0x87F2, 0xF5F9, 0x87F9, 0xFAAF, 0x87FB, 0xEBFC, 0x87FE, 0xE0EA, + 0x8805, 0xE3B2, 0x881F, 0xD5C5, 0x8822, 0xF1E3, 0x8823, 0xD5EE, + 0x8831, 0xCDCC, 0x8836, 0xEDD9, 0x883B, 0xD8C1, 0x8840, 0xFAEC, + 0x8846, 0xF1EB, 0x884C, 0xFABC, 0x884D, 0xE6E2, 0x8852, 0xFAE5, + 0x8853, 0xE2FA, 0x8857, 0xCAB6, 0x8859, 0xE4B7, 0x885B, 0xEADB, + 0x885D, 0xF5FA, 0x8861, 0xFBAC, 0x8862, 0xCFC3, 0x8863, 0xEBFD, + 0x8868, 0xF8FA, 0x886B, 0xDFB9, 0x8870, 0xE1F1, 0x8872, 0xD2A4, + 0x8877, 0xF5FB, 0x887E, 0xD0DA, 0x887F, 0xD0DB, 0x8881, 0xEABE, + 0x8882, 0xD9B1, 0x8888, 0xCAB7, 0x888B, 0xD3E7, 0x888D, 0xF8E5, + 0x8892, 0xD3B2, 0x8896, 0xE2C0, 0x8897, 0xF2DF, 0x889E, 0xCDE5, + 0x88AB, 0xF9AC, 0x88B4, 0xCDCD, 0x88C1, 0xEEAE, 0x88C2, 0xD6AE, + 0x88CF, 0xD7EA, 0x88D4, 0xE7E0, 0x88D5, 0xEBAE, 0x88D9, 0xCFD9, + 0x88DC, 0xDCCD, 0x88DD, 0xEDFB, 0x88DF, 0xDEF0, 0x88E1, 0xD7EB, + 0x88E8, 0xDEA5, 0x88F3, 0xDFD7, 0x88F4, 0xDBD0, 0x88F5, 0xDBD1, + 0x88F8, 0xD5A3, 0x88FD, 0xF0B2, 0x8907, 0xDCDC, 0x8910, 0xCAE8, + 0x8912, 0xF8E6, 0x8913, 0xDCCE, 0x8918, 0xEADC, 0x8919, 0xDBD2, + 0x8925, 0xE9B3, 0x892A, 0xF7DB, 0x8936, 0xE3A8, 0x8938, 0xD7AE, + 0x893B, 0xE0E1, 0x8941, 0xCBBA, 0x8944, 0xE5D1, 0x895F, 0xD0DC, + 0x8964, 0xD5C1, 0x896A, 0xD8CA, 0x8972, 0xE3A9, 0x897F, 0xE0A4, + 0x8981, 0xE9A9, 0x8983, 0xD3C7, 0x8986, 0xDCDD, 0x8987, 0xF8AE, + 0x898B, 0xCCB8, 0x898F, 0xD0AE, 0x8993, 0xD8F2, 0x8996, 0xE3CA, + 0x89A1, 0xCCAF, 0x89A9, 0xD4AD, 0x89AA, 0xF6D1, 0x89B2, 0xD0CC, + 0x89BA, 0xCAC6, 0x89BD, 0xD5C2, 0x89C0, 0xCEBA, 0x89D2, 0xCAC7, + 0x89E3, 0xFAB0, 0x89F4, 0xDFD8, 0x89F8, 0xF5BA, 0x8A00, 0xE5EB, + 0x8A02, 0xEFF4, 0x8A03, 0xDDB5, 0x8A08, 0xCDAA, 0x8A0A, 0xE3F2, + 0x8A0C, 0xFBF7, 0x8A0E, 0xF7D0, 0x8A13, 0xFDBA, 0x8A16, 0xFDE1, + 0x8A17, 0xF6FE, 0x8A18, 0xD1C0, 0x8A1B, 0xE8C5, 0x8A1D, 0xE4B8, + 0x8A1F, 0xE1E8, 0x8A23, 0xCCC1, 0x8A25, 0xD2ED, 0x8A2A, 0xDBBE, + 0x8A2D, 0xE0E2, 0x8A31, 0xFAC9, 0x8A34, 0xE1CD, 0x8A36, 0xCAB8, + 0x8A3A, 0xF2E0, 0x8A3B, 0xF1C9, 0x8A50, 0xDEF1, 0x8A54, 0xF0DF, + 0x8A55, 0xF8C4, 0x8A5B, 0xEECC, 0x8A5E, 0xDEF2, 0x8A60, 0xE7C9, + 0x8A62, 0xE2F3, 0x8A63, 0xE7E1, 0x8A66, 0xE3CB, 0x8A69, 0xE3CC, + 0x8A6D, 0xCFF8, 0x8A6E, 0xEFAC, 0x8A70, 0xFDFE, 0x8A71, 0xFCA5, + 0x8A72, 0xFAB1, 0x8A73, 0xDFD9, 0x8A75, 0xE0D2, 0x8A79, 0xF4DA, + 0x8A85, 0xF1CA, 0x8A87, 0xCEA3, 0x8A8C, 0xF2BC, 0x8A8D, 0xECE3, + 0x8A93, 0xE0A5, 0x8A95, 0xF7AB, 0x8A98, 0xEBAF, 0x8A9E, 0xE5DE, + 0x8AA0, 0xE1A4, 0x8AA1, 0xCDAB, 0x8AA3, 0xD9F4, 0x8AA4, 0xE8A6, + 0x8AA5, 0xCDCE, 0x8AA6, 0xE1E9, 0x8AA8, 0xFCEF, 0x8AAA, 0xE0E3, + 0x8AB0, 0xE2C1, 0x8AB2, 0xCEA4, 0x8AB9, 0xDEA6, 0x8ABC, 0xEBFE, + 0x8ABE, 0xEBDD, 0x8ABF, 0xF0E0, 0x8AC2, 0xF4DB, 0x8AC4, 0xE2F4, + 0x8AC7, 0xD3C8, 0x8ACB, 0xF4EB, 0x8ACD, 0xEEB5, 0x8ACF, 0xF5D8, + 0x8AD2, 0xD5DF, 0x8AD6, 0xD6E5, 0x8ADB, 0xEBB0, 0x8ADC, 0xF4E3, + 0x8AE1, 0xE3CD, 0x8AE6, 0xF4F4, 0x8AE7, 0xFAB2, 0x8AEA, 0xEFF5, + 0x8AEB, 0xCADF, 0x8AED, 0xEBB1, 0x8AEE, 0xEDBF, 0x8AF1, 0xFDC9, + 0x8AF6, 0xE4A6, 0x8AF7, 0xF9A4, 0x8AF8, 0xF0B3, 0x8AFA, 0xE5EC, + 0x8AFE, 0xD1E7, 0x8B00, 0xD9C7, 0x8B01, 0xE4D7, 0x8B02, 0xEADD, + 0x8B04, 0xD4F7, 0x8B0E, 0xDABA, 0x8B10, 0xDACD, 0x8B14, 0xF9CC, + 0x8B16, 0xE1DA, 0x8B17, 0xDBBF, 0x8B19, 0xCCC5, 0x8B1A, 0xECD0, + 0x8B1B, 0xCBBB, 0x8B1D, 0xDEF3, 0x8B20, 0xE9AA, 0x8B28, 0xD9C8, + 0x8B2B, 0xEEE3, 0x8B2C, 0xD7BD, 0x8B33, 0xCFC4, 0x8B39, 0xD0CD, + 0x8B41, 0xFCA6, 0x8B49, 0xF1FB, 0x8B4E, 0xFDD2, 0x8B4F, 0xD1C1, + 0x8B58, 0xE3DB, 0x8B5A, 0xD3C9, 0x8B5C, 0xDCCF, 0x8B66, 0xCCED, + 0x8B6C, 0xDEA7, 0x8B6F, 0xE6BB, 0x8B70, 0xECA1, 0x8B74, 0xCCB9, + 0x8B77, 0xFBDE, 0x8B7D, 0xE7E2, 0x8B80, 0xD4C1, 0x8B8A, 0xDCA8, + 0x8B90, 0xE2C2, 0x8B92, 0xF3D8, 0x8B93, 0xE5D3, 0x8B96, 0xF3D9, + 0x8B9A, 0xF3C6, 0x8C37, 0xCDDB, 0x8C3F, 0xCDAC, 0x8C41, 0xFCC3, + 0x8C46, 0xD4E7, 0x8C48, 0xD1C2, 0x8C4A, 0xF9A5, 0x8C4C, 0xE8D5, + 0x8C55, 0xE3CE, 0x8C5A, 0xD4CA, 0x8C61, 0xDFDA, 0x8C6A, 0xFBDF, + 0x8C6B, 0xE7E3, 0x8C79, 0xF8FB, 0x8C7A, 0xE3CF, 0x8C82, 0xF5B0, + 0x8C8A, 0xD8E7, 0x8C8C, 0xD9C9, 0x8C9D, 0xF8AF, 0x8C9E, 0xEFF6, + 0x8CA0, 0xDDB6, 0x8CA1, 0xEEAF, 0x8CA2, 0xCDF8, 0x8CA7, 0xDEB8, + 0x8CA8, 0xFCA7, 0x8CA9, 0xF7FC, 0x8CAA, 0xF7B1, 0x8CAB, 0xCEBB, + 0x8CAC, 0xF4A1, 0x8CAF, 0xEECD, 0x8CB0, 0xE1AE, 0x8CB3, 0xECC3, + 0x8CB4, 0xCFFE, 0x8CB6, 0xF8BF, 0x8CB7, 0xD8E2, 0x8CB8, 0xD3E8, + 0x8CBB, 0xDEA8, 0x8CBC, 0xF4E4, 0x8CBD, 0xECC2, 0x8CBF, 0xD9F5, + 0x8CC0, 0xF9C5, 0x8CC1, 0xDDD3, 0x8CC2, 0xD6F1, 0x8CC3, 0xECFC, + 0x8CC4, 0xFCF0, 0x8CC7, 0xEDC0, 0x8CC8, 0xCAB9, 0x8CCA, 0xEEE4, + 0x8CD1, 0xF2E1, 0x8CD3, 0xDEB9, 0x8CDA, 0xD6F2, 0x8CDC, 0xDEF4, + 0x8CDE, 0xDFDB, 0x8CE0, 0xDBD3, 0x8CE2, 0xFAE7, 0x8CE3, 0xD8E3, + 0x8CE4, 0xF4C1, 0x8CE6, 0xDDB7, 0x8CEA, 0xF2F5, 0x8CED, 0xD4AE, + 0x8CF4, 0xD6F3, 0x8CFB, 0xDDB8, 0x8CFC, 0xCFC5, 0x8CFD, 0xDFDF, + 0x8D04, 0xF2BE, 0x8D05, 0xF6A1, 0x8D07, 0xEBCB, 0x8D08, 0xF1FC, + 0x8D0A, 0xF3C7, 0x8D0D, 0xE0EB, 0x8D13, 0xEDFC, 0x8D16, 0xE1DB, + 0x8D64, 0xEEE5, 0x8D66, 0xDEF5, 0x8D6B, 0xFAD3, 0x8D70, 0xF1CB, + 0x8D73, 0xD0AF, 0x8D74, 0xDDB9, 0x8D77, 0xD1C3, 0x8D85, 0xF5B1, + 0x8D8A, 0xEAC6, 0x8D99, 0xF0E1, 0x8DA3, 0xF6AC, 0x8DA8, 0xF5D9, + 0x8DB3, 0xF0EB, 0x8DBA, 0xDDBA, 0x8DBE, 0xF2BF, 0x8DC6, 0xF7C5, + 0x8DCB, 0xDBA2, 0x8DCC, 0xF2F6, 0x8DCF, 0xCABA, 0x8DDB, 0xF7F5, + 0x8DDD, 0xCBE5, 0x8DE1, 0xEEE6, 0x8DE3, 0xE0D3, 0x8DE8, 0xCEA5, + 0x8DEF, 0xD6D8, 0x8DF3, 0xD4AF, 0x8E0A, 0xE9C9, 0x8E0F, 0xD3CE, + 0x8E10, 0xF4C2, 0x8E1E, 0xCBE6, 0x8E2A, 0xF1A1, 0x8E30, 0xEBB2, + 0x8E35, 0xF1A2, 0x8E42, 0xEBB3, 0x8E44, 0xF0B4, 0x8E47, 0xCBF4, + 0x8E48, 0xD4B0, 0x8E49, 0xF3B2, 0x8E4A, 0xFBB7, 0x8E59, 0xF5EC, + 0x8E5F, 0xEEE7, 0x8E60, 0xF4B2, 0x8E74, 0xF5ED, 0x8E76, 0xCFF3, + 0x8E81, 0xF0E2, 0x8E87, 0xEECE, 0x8E8A, 0xF1CC, 0x8E8D, 0xE5B8, + 0x8EAA, 0xD7F5, 0x8EAB, 0xE3F3, 0x8EAC, 0xCFE5, 0x8EC0, 0xCFC6, + 0x8ECA, 0xF3B3, 0x8ECB, 0xE4D8, 0x8ECC, 0xCFF9, 0x8ECD, 0xCFDA, + 0x8ED2, 0xFACD, 0x8EDF, 0xE6E3, 0x8EEB, 0xF2E2, 0x8EF8, 0xF5EE, + 0x8EFB, 0xCABB, 0x8EFE, 0xE3DC, 0x8F03, 0xCEF2, 0x8F05, 0xD6D9, + 0x8F09, 0xEEB0, 0x8F12, 0xF4E5, 0x8F13, 0xD8C2, 0x8F14, 0xDCD0, + 0x8F15, 0xCCEE, 0x8F1B, 0xD5E0, 0x8F1C, 0xF6CA, 0x8F1D, 0xFDCA, + 0x8F1E, 0xD8D6, 0x8F1F, 0xF4CF, 0x8F26, 0xD6A6, 0x8F27, 0xDCBE, + 0x8F29, 0xDBD4, 0x8F2A, 0xD7C7, 0x8F2F, 0xF2FE, 0x8F33, 0xF1CD, + 0x8F38, 0xE2C3, 0x8F39, 0xDCDE, 0x8F3B, 0xDCDF, 0x8F3E, 0xEFAD, + 0x8F3F, 0xE6AB, 0x8F44, 0xF9DD, 0x8F45, 0xEABF, 0x8F49, 0xEFAE, + 0x8F4D, 0xF4D0, 0x8F4E, 0xCEF3, 0x8F5D, 0xE6AC, 0x8F5F, 0xCEDE, + 0x8F62, 0xD5F9, 0x8F9B, 0xE3F4, 0x8F9C, 0xCDD0, 0x8FA3, 0xD5B8, + 0x8FA6, 0xF7FD, 0x8FA8, 0xDCA9, 0x8FAD, 0xDEF6, 0x8FAF, 0xDCAA, + 0x8FB0, 0xF2E3, 0x8FB1, 0xE9B4, 0x8FB2, 0xD2DC, 0x8FC2, 0xE9E6, + 0x8FC5, 0xE3F6, 0x8FCE, 0xE7CA, 0x8FD1, 0xD0CE, 0x8FD4, 0xDAF7, + 0x8FE6, 0xCABC, 0x8FEA, 0xEEE8, 0x8FEB, 0xDADE, 0x8FED, 0xF2F7, + 0x8FF0, 0xE2FB, 0x8FF2, 0xCCA6, 0x8FF7, 0xDABB, 0x8FF9, 0xEEE9, + 0x8FFD, 0xF5DA, 0x9000, 0xF7DC, 0x9001, 0xE1EA, 0x9002, 0xCEC1, + 0x9003, 0xD4B1, 0x9005, 0xFDB1, 0x9006, 0xE6BD, 0x9008, 0xFBAD, + 0x900B, 0xF8E7, 0x900D, 0xE1CE, 0x900F, 0xF7E2, 0x9010, 0xF5EF, + 0x9011, 0xCFC7, 0x9014, 0xD4B2, 0x9015, 0xCCEF, 0x9017, 0xD4E8, + 0x9019, 0xEECF, 0x901A, 0xF7D7, 0x901D, 0xE0A6, 0x901E, 0xD6C1, + 0x901F, 0xE1DC, 0x9020, 0xF0E3, 0x9021, 0xF1E4, 0x9022, 0xDCF1, + 0x9023, 0xD6A7, 0x902E, 0xF4F5, 0x9031, 0xF1CE, 0x9032, 0xF2E4, + 0x9035, 0xD0B0, 0x9038, 0xECEF, 0x903C, 0xF9BA, 0x903E, 0xEBB5, + 0x9041, 0xD4ED, 0x9042, 0xE2C4, 0x9047, 0xE9E7, 0x904A, 0xEBB4, + 0x904B, 0xEAA1, 0x904D, 0xF8BC, 0x904E, 0xCEA6, 0x9050, 0xF9C6, + 0x9051, 0xFCDA, 0x9053, 0xD4B3, 0x9054, 0xD3B9, 0x9055, 0xEADE, + 0x9059, 0xE9AB, 0x905C, 0xE1E1, 0x905D, 0xD3CF, 0x905E, 0xF4F6, + 0x9060, 0xEAC0, 0x9061, 0xE1CF, 0x9063, 0xCCBA, 0x9069, 0xEEEA, + 0x906D, 0xF0E4, 0x906E, 0xF3B4, 0x906F, 0xD4EE, 0x9072, 0xF2C0, + 0x9075, 0xF1E5, 0x9077, 0xF4C3, 0x9078, 0xE0D4, 0x907A, 0xEBB6, + 0x907C, 0xD7A1, 0x907D, 0xCBE8, 0x907F, 0xF9AD, 0x9080, 0xE9AD, + 0x9081, 0xD8E4, 0x9082, 0xFAB3, 0x9083, 0xE2C5, 0x9084, 0xFCBD, + 0x9087, 0xECC4, 0x9088, 0xD8B1, 0x908A, 0xDCAB, 0x908F, 0xD5A4, + 0x9091, 0xEBE9, 0x9095, 0xE8BB, 0x9099, 0xD8D7, 0x90A2, 0xFBAE, + 0x90A3, 0xD1E1, 0x90A6, 0xDBC0, 0x90A8, 0xF5BE, 0x90AA, 0xDEF7, + 0x90AF, 0xCAFB, 0x90B0, 0xF7C6, 0x90B1, 0xCFC8, 0x90B5, 0xE1D0, + 0x90B8, 0xEED0, 0x90C1, 0xE9F4, 0x90CA, 0xCEF4, 0x90DE, 0xD5CD, + 0x90E1, 0xCFDB, 0x90E8, 0xDDBB, 0x90ED, 0xCEAC, 0x90F5, 0xE9E8, + 0x90FD, 0xD4B4, 0x9102, 0xE4C7, 0x9112, 0xF5DB, 0x9115, 0xFAC1, + 0x9119, 0xDEA9, 0x9127, 0xD4F8, 0x912D, 0xEFF7, 0x9132, 0xD3B3, + 0x9149, 0xEBB7, 0x914A, 0xEFF8, 0x914B, 0xF5DC, 0x914C, 0xEDCC, + 0x914D, 0xDBD5, 0x914E, 0xF1CF, 0x9152, 0xF1D0, 0x9162, 0xF5B2, + 0x9169, 0xD9AE, 0x916A, 0xD5AC, 0x916C, 0xE2C6, 0x9175, 0xFDA3, + 0x9177, 0xFBE5, 0x9178, 0xDFAB, 0x9187, 0xE2F5, 0x9189, 0xF6AD, + 0x918B, 0xF5B3, 0x918D, 0xF0B5, 0x9192, 0xE1A5, 0x919C, 0xF5DD, + 0x91AB, 0xECA2, 0x91AC, 0xEDFD, 0x91AE, 0xF5B4, 0x91AF, 0xFBB8, + 0x91B1, 0xDBA3, 0x91B4, 0xD6CA, 0x91B5, 0xCBD9, 0x91C0, 0xE5D4, + 0x91C7, 0xF3FA, 0x91C9, 0xEBB8, 0x91CB, 0xE0B7, 0x91CC, 0xD7EC, + 0x91CD, 0xF1EC, 0x91CE, 0xE5AF, 0x91CF, 0xD5E1, 0x91D0, 0xD7ED, + 0x91D1, 0xD1D1, 0x91D7, 0xE1F2, 0x91D8, 0xEFF9, 0x91DC, 0xDDBC, + 0x91DD, 0xF6DC, 0x91E3, 0xF0E5, 0x91E7, 0xF4C4, 0x91EA, 0xE9E9, + 0x91F5, 0xF3FB, 0x920D, 0xD4EF, 0x9210, 0xCCA2, 0x9211, 0xF7FE, + 0x9212, 0xDFBC, 0x9217, 0xEBCD, 0x921E, 0xD0B7, 0x9234, 0xD6C2, + 0x923A, 0xE8AD, 0x923F, 0xEFAF, 0x9240, 0xCBA5, 0x9245, 0xCBE9, + 0x9249, 0xFAE8, 0x9257, 0xCCC6, 0x925B, 0xE6E7, 0x925E, 0xEAC7, + 0x9262, 0xDBA4, 0x9264, 0xCFC9, 0x9265, 0xE2FC, 0x9266, 0xEFFA, + 0x9280, 0xEBDE, 0x9283, 0xF5C8, 0x9285, 0xD4DE, 0x9291, 0xE0D5, + 0x9293, 0xEFB0, 0x9296, 0xE2C7, 0x9298, 0xD9AF, 0x929C, 0xF9E7, + 0x92B3, 0xE7E5, 0x92B6, 0xCFCA, 0x92B7, 0xE1D1, 0x92B9, 0xE2C8, + 0x92CC, 0xEFFB, 0x92CF, 0xFAF9, 0x92D2, 0xDCF2, 0x92E4, 0xE0A7, + 0x92EA, 0xF8E8, 0x92F8, 0xCBEA, 0x92FC, 0xCBBC, 0x9304, 0xD6E2, + 0x9310, 0xF5DE, 0x9318, 0xF5DF, 0x931A, 0xEEB6, 0x931E, 0xE2F6, + 0x931F, 0xD3CA, 0x9320, 0xEFFC, 0x9321, 0xD1C4, 0x9322, 0xEFB1, + 0x9324, 0xD1C5, 0x9326, 0xD0DE, 0x9328, 0xD9E1, 0x932B, 0xE0B8, + 0x932E, 0xCDD1, 0x932F, 0xF3B9, 0x9348, 0xE7CC, 0x934A, 0xD6A8, + 0x934B, 0xCEA7, 0x934D, 0xD4B5, 0x9354, 0xE4C8, 0x935B, 0xD3B4, + 0x936E, 0xEBB9, 0x9375, 0xCBF5, 0x937C, 0xF6DD, 0x937E, 0xF1A3, + 0x938C, 0xCCC7, 0x9394, 0xE9CA, 0x9396, 0xE1F0, 0x939A, 0xF5E0, + 0x93A3, 0xFBAF, 0x93A7, 0xCBD1, 0x93AC, 0xFBE0, 0x93AD, 0xF2E5, + 0x93B0, 0xECF0, 0x93C3, 0xF0EC, 0x93D1, 0xEEEB, 0x93DE, 0xE9CB, + 0x93E1, 0xCCF0, 0x93E4, 0xD7AF, 0x93F6, 0xF3A1, 0x9404, 0xFCF5, + 0x9418, 0xF1A4, 0x9425, 0xE0D6, 0x942B, 0xEFB2, 0x9435, 0xF4D1, + 0x9438, 0xF7A1, 0x9444, 0xF1D1, 0x9451, 0xCAFC, 0x9452, 0xCAFD, + 0x945B, 0xCECE, 0x947D, 0xF3C8, 0x947F, 0xF3BA, 0x9577, 0xEDFE, + 0x9580, 0xDAA6, 0x9583, 0xE0EC, 0x9589, 0xF8CD, 0x958B, 0xCBD2, + 0x958F, 0xEBCE, 0x9591, 0xF9D8, 0x9592, 0xF9D9, 0x9593, 0xCAE0, + 0x9594, 0xDACA, 0x9598, 0xCBA6, 0x95A3, 0xCAC8, 0x95A4, 0xF9EE, + 0x95A5, 0xDBEC, 0x95A8, 0xD0B1, 0x95AD, 0xD5EF, 0x95B1, 0xE6F3, + 0x95BB, 0xE7A2, 0x95BC, 0xE4D9, 0x95C7, 0xE4E1, 0x95CA, 0xFCC4, + 0x95D4, 0xF9EF, 0x95D5, 0xCFF4, 0x95D6, 0xF7E6, 0x95DC, 0xCEBC, + 0x95E1, 0xF4C5, 0x95E2, 0xDCA3, 0x961C, 0xDDBD, 0x9621, 0xF4C6, + 0x962A, 0xF8A1, 0x962E, 0xE8D6, 0x9632, 0xDBC1, 0x963B, 0xF0E6, + 0x963F, 0xE4B9, 0x9640, 0xF6ED, 0x9642, 0xF9AE, 0x9644, 0xDDBE, + 0x964B, 0xD7B0, 0x964C, 0xD8E8, 0x964D, 0xCBBD, 0x9650, 0xF9DA, + 0x965B, 0xF8CE, 0x965C, 0xF9F0, 0x965D, 0xE0ED, 0x965E, 0xE3B3, + 0x965F, 0xF4B3, 0x9662, 0xEAC2, 0x9663, 0xF2E6, 0x9664, 0xF0B6, + 0x966A, 0xDBD6, 0x9670, 0xEBE4, 0x9673, 0xF2E7, 0x9675, 0xD7D5, + 0x9676, 0xD4B6, 0x9677, 0xF9E8, 0x9678, 0xD7C1, 0x967D, 0xE5D5, + 0x9685, 0xE9EA, 0x9686, 0xD7CC, 0x968A, 0xD3E9, 0x968B, 0xE2C9, + 0x968D, 0xFCDB, 0x968E, 0xCDAD, 0x9694, 0xCCB0, 0x9695, 0xEAA2, + 0x9698, 0xE4F6, 0x9699, 0xD0C0, 0x969B, 0xF0B7, 0x969C, 0xEEA1, + 0x96A3, 0xD7F6, 0x96A7, 0xE2CA, 0x96A8, 0xE2CB, 0x96AA, 0xFACF, + 0x96B1, 0xEBDF, 0x96B7, 0xD6CB, 0x96BB, 0xF4B4, 0x96C0, 0xEDCD, + 0x96C1, 0xE4D2, 0x96C4, 0xEAA9, 0x96C5, 0xE4BA, 0x96C6, 0xF3A2, + 0x96C7, 0xCDD2, 0x96C9, 0xF6CB, 0x96CB, 0xF1E6, 0x96CC, 0xEDC1, + 0x96CD, 0xE8BC, 0x96CE, 0xEED1, 0x96D5, 0xF0E7, 0x96D6, 0xE2CC, + 0x96D9, 0xE4AA, 0x96DB, 0xF5E1, 0x96DC, 0xEDDA, 0x96E2, 0xD7EE, + 0x96E3, 0xD1F1, 0x96E8, 0xE9EB, 0x96E9, 0xE9EC, 0x96EA, 0xE0E4, + 0x96EF, 0xDAA7, 0x96F0, 0xDDD4, 0x96F2, 0xEAA3, 0x96F6, 0xD6C3, + 0x96F7, 0xD6F4, 0x96F9, 0xDADF, 0x96FB, 0xEFB3, 0x9700, 0xE2CD, + 0x9706, 0xEFFD, 0x9707, 0xF2E8, 0x9711, 0xEFC5, 0x9713, 0xE7E7, + 0x9716, 0xD7FD, 0x9719, 0xE7CE, 0x971C, 0xDFDC, 0x971E, 0xF9C7, + 0x9727, 0xD9F6, 0x9730, 0xDFAC, 0x9732, 0xD6DA, 0x9739, 0xDCA4, + 0x973D, 0xF0B8, 0x9742, 0xD5FA, 0x9744, 0xE4F7, 0x9748, 0xD6C4, + 0x9751, 0xF4EC, 0x9756, 0xEFFE, 0x975C, 0xF0A1, 0x975E, 0xDEAA, + 0x9761, 0xDABC, 0x9762, 0xD8FC, 0x9769, 0xFAD4, 0x976D, 0xECE5, + 0x9774, 0xFCA8, 0x9777, 0xECE6, 0x977A, 0xD8CB, 0x978B, 0xFBB9, + 0x978D, 0xE4D3, 0x978F, 0xCDF9, 0x97A0, 0xCFD3, 0x97A8, 0xCAEA, + 0x97AB, 0xCFD4, 0x97AD, 0xF8BD, 0x97C6, 0xF4C7, 0x97CB, 0xEADF, + 0x97D3, 0xF9DB, 0x97DC, 0xD4B7, 0x97F3, 0xEBE5, 0x97F6, 0xE1D2, + 0x97FB, 0xEAA4, 0x97FF, 0xFAC2, 0x9800, 0xFBE1, 0x9801, 0xFAED, + 0x9802, 0xF0A2, 0x9803, 0xCCF1, 0x9805, 0xFAA3, 0x9806, 0xE2F7, + 0x9808, 0xE2CE, 0x980A, 0xE9F5, 0x980C, 0xE1EB, 0x9810, 0xE7E8, + 0x9811, 0xE8D7, 0x9812, 0xDAF8, 0x9813, 0xD4CB, 0x9817, 0xF7F6, + 0x9818, 0xD6C5, 0x982D, 0xD4E9, 0x9830, 0xFAFA, 0x9838, 0xCCF2, + 0x9839, 0xF7DD, 0x983B, 0xDEBA, 0x9846, 0xCEA8, 0x984C, 0xF0B9, + 0x984D, 0xE4FE, 0x984E, 0xE4C9, 0x9854, 0xE4D4, 0x9858, 0xEAC3, + 0x985A, 0xEFB4, 0x985E, 0xD7BE, 0x9865, 0xFBE2, 0x9867, 0xCDD3, + 0x986B, 0xEFB5, 0x986F, 0xFAE9, 0x98A8, 0xF9A6, 0x98AF, 0xDFBD, + 0x98B1, 0xF7C7, 0x98C4, 0xF8FD, 0x98C7, 0xF8FC, 0x98DB, 0xDEAB, + 0x98DC, 0xDBE8, 0x98DF, 0xE3DD, 0x98E1, 0xE1E2, 0x98E2, 0xD1C6, + 0x98ED, 0xF6D0, 0x98EE, 0xEBE6, 0x98EF, 0xDAF9, 0x98F4, 0xECC7, + 0x98FC, 0xDEF8, 0x98FD, 0xF8E9, 0x98FE, 0xE3DE, 0x9903, 0xCEF5, + 0x9909, 0xFAC3, 0x990A, 0xE5D7, 0x990C, 0xECC8, 0x9910, 0xF3C9, + 0x9913, 0xE4BB, 0x9918, 0xE6AE, 0x991E, 0xEFB6, 0x9920, 0xDCBF, + 0x9928, 0xCEBD, 0x9945, 0xD8C3, 0x9949, 0xD0CF, 0x994B, 0xCFFA, + 0x994C, 0xF3CA, 0x994D, 0xE0D7, 0x9951, 0xD1C7, 0x9952, 0xE9AE, + 0x9954, 0xE8BD, 0x9957, 0xFAC4, 0x9996, 0xE2CF, 0x9999, 0xFAC5, + 0x999D, 0xF9B8, 0x99A5, 0xDCE0, 0x99A8, 0xFBB0, 0x99AC, 0xD8A9, + 0x99AD, 0xE5DF, 0x99AE, 0xF9A7, 0x99B1, 0xF6EE, 0x99B3, 0xF6CC, + 0x99B4, 0xE2F8, 0x99B9, 0xECF1, 0x99C1, 0xDAE0, 0x99D0, 0xF1D2, + 0x99D1, 0xD2CC, 0x99D2, 0xCFCB, 0x99D5, 0xCABD, 0x99D9, 0xDDBF, + 0x99DD, 0xF6EF, 0x99DF, 0xDEF9, 0x99ED, 0xFAB4, 0x99F1, 0xD5AD, + 0x99FF, 0xF1E7, 0x9A01, 0xDEBE, 0x9A08, 0xDCC0, 0x9A0E, 0xD1C8, + 0x9A0F, 0xD1C9, 0x9A19, 0xF8BE, 0x9A2B, 0xCBF6, 0x9A30, 0xD4F9, + 0x9A36, 0xF5E2, 0x9A37, 0xE1D3, 0x9A40, 0xD8E9, 0x9A43, 0xF8FE, + 0x9A45, 0xCFCC, 0x9A4D, 0xFDA4, 0x9A55, 0xCEF6, 0x9A57, 0xFAD0, + 0x9A5A, 0xCCF3, 0x9A5B, 0xE6BE, 0x9A5F, 0xF6AE, 0x9A62, 0xD5F0, + 0x9A65, 0xD1CA, 0x9A69, 0xFCBE, 0x9A6A, 0xD5F1, 0x9AA8, 0xCDE9, + 0x9AB8, 0xFAB5, 0x9AD3, 0xE2D0, 0x9AD4, 0xF4F7, 0x9AD8, 0xCDD4, + 0x9AE5, 0xE7A3, 0x9AEE, 0xDBA5, 0x9B1A, 0xE2D1, 0x9B27, 0xD7A2, + 0x9B2A, 0xF7E3, 0x9B31, 0xEAA6, 0x9B3C, 0xD0A1, 0x9B41, 0xCEDA, + 0x9B42, 0xFBEB, 0x9B43, 0xDBA6, 0x9B44, 0xDBDE, 0x9B45, 0xD8E5, + 0x9B4F, 0xEAE0, 0x9B54, 0xD8AA, 0x9B5A, 0xE5E0, 0x9B6F, 0xD6DB, + 0x9B8E, 0xEFC6, 0x9B91, 0xF8EA, 0x9B9F, 0xE4D5, 0x9BAB, 0xCEF7, + 0x9BAE, 0xE0D8, 0x9BC9, 0xD7EF, 0x9BD6, 0xF4ED, 0x9BE4, 0xCDE6, + 0x9BE8, 0xCCF4, 0x9C0D, 0xF5E3, 0x9C10, 0xE4CA, 0x9C12, 0xDCE1, + 0x9C15, 0xF9C8, 0x9C25, 0xFCBF, 0x9C32, 0xE8A7, 0x9C3B, 0xD8C4, + 0x9C47, 0xCBBE, 0x9C49, 0xDCAE, 0x9C57, 0xD7F7, 0x9CE5, 0xF0E8, + 0x9CE7, 0xDDC0, 0x9CE9, 0xCFCD, 0x9CF3, 0xDCF3, 0x9CF4, 0xD9B0, + 0x9CF6, 0xE6E9, 0x9D09, 0xE4BC, 0x9D1B, 0xEAC4, 0x9D26, 0xE4EC, + 0x9D28, 0xE4E5, 0x9D3B, 0xFBF8, 0x9D51, 0xCCBB, 0x9D5D, 0xE4BD, + 0x9D60, 0xCDDC, 0x9D61, 0xD9F7, 0x9D6C, 0xDDDF, 0x9D72, 0xEDCE, + 0x9DA9, 0xD9D0, 0x9DAF, 0xE5A3, 0x9DB4, 0xF9CD, 0x9DC4, 0xCDAE, + 0x9DD7, 0xCFCE, 0x9DF2, 0xF6AF, 0x9DF8, 0xFDD3, 0x9DF9, 0xEBED, + 0x9DFA, 0xD6DC, 0x9E1A, 0xE5A4, 0x9E1E, 0xD5B6, 0x9E75, 0xD6DD, + 0x9E79, 0xF9E9, 0x9E7D, 0xE7A4, 0x9E7F, 0xD6E3, 0x9E92, 0xD1CB, + 0x9E93, 0xD6E4, 0x9E97, 0xD5F2, 0x9E9D, 0xDEFA, 0x9E9F, 0xD7F8, + 0x9EA5, 0xD8EA, 0x9EB4, 0xCFD5, 0x9EB5, 0xD8FD, 0x9EBB, 0xD8AB, + 0x9EBE, 0xFDCB, 0x9EC3, 0xFCDC, 0x9ECD, 0xE0A8, 0x9ECE, 0xD5F3, + 0x9ED1, 0xFDD9, 0x9ED4, 0xCCA3, 0x9ED8, 0xD9F9, 0x9EDB, 0xD3EA, + 0x9EDC, 0xF5F5, 0x9EDE, 0xEFC7, 0x9EE8, 0xD3DA, 0x9EF4, 0xDABD, + 0x9F07, 0xE8A8, 0x9F08, 0xDCAF, 0x9F0E, 0xF0A3, 0x9F13, 0xCDD5, + 0x9F20, 0xE0A9, 0x9F3B, 0xDEAC, 0x9F4A, 0xF0BA, 0x9F4B, 0xEEB1, + 0x9F4E, 0xEEB2, 0x9F52, 0xF6CD, 0x9F5F, 0xEED2, 0x9F61, 0xD6C6, + 0x9F67, 0xE0E5, 0x9F6A, 0xF3BB, 0x9F6C, 0xE5E1, 0x9F77, 0xE4CB, + 0x9F8D, 0xD7A3, 0x9F90, 0xDBC2, 0x9F95, 0xCAFE, 0x9F9C, 0xCFCF, + 0xAC00, 0xB0A1, 0xAC01, 0xB0A2, 0xAC02, 0x8141, 0xAC03, 0x8142, + 0xAC04, 0xB0A3, 0xAC05, 0x8143, 0xAC06, 0x8144, 0xAC07, 0xB0A4, + 0xAC08, 0xB0A5, 0xAC09, 0xB0A6, 0xAC0A, 0xB0A7, 0xAC0B, 0x8145, + 0xAC0C, 0x8146, 0xAC0D, 0x8147, 0xAC0E, 0x8148, 0xAC0F, 0x8149, + 0xAC10, 0xB0A8, 0xAC11, 0xB0A9, 0xAC12, 0xB0AA, 0xAC13, 0xB0AB, + 0xAC14, 0xB0AC, 0xAC15, 0xB0AD, 0xAC16, 0xB0AE, 0xAC17, 0xB0AF, + 0xAC18, 0x814A, 0xAC19, 0xB0B0, 0xAC1A, 0xB0B1, 0xAC1B, 0xB0B2, + 0xAC1C, 0xB0B3, 0xAC1D, 0xB0B4, 0xAC1E, 0x814B, 0xAC1F, 0x814C, + 0xAC20, 0xB0B5, 0xAC21, 0x814D, 0xAC22, 0x814E, 0xAC23, 0x814F, + 0xAC24, 0xB0B6, 0xAC25, 0x8150, 0xAC26, 0x8151, 0xAC27, 0x8152, + 0xAC28, 0x8153, 0xAC29, 0x8154, 0xAC2A, 0x8155, 0xAC2B, 0x8156, + 0xAC2C, 0xB0B7, 0xAC2D, 0xB0B8, 0xAC2E, 0x8157, 0xAC2F, 0xB0B9, + 0xAC30, 0xB0BA, 0xAC31, 0xB0BB, 0xAC32, 0x8158, 0xAC33, 0x8159, + 0xAC34, 0x815A, 0xAC35, 0x8161, 0xAC36, 0x8162, 0xAC37, 0x8163, + 0xAC38, 0xB0BC, 0xAC39, 0xB0BD, 0xAC3A, 0x8164, 0xAC3B, 0x8165, + 0xAC3C, 0xB0BE, 0xAC3D, 0x8166, 0xAC3E, 0x8167, 0xAC3F, 0x8168, + 0xAC40, 0xB0BF, 0xAC41, 0x8169, 0xAC42, 0x816A, 0xAC43, 0x816B, + 0xAC44, 0x816C, 0xAC45, 0x816D, 0xAC46, 0x816E, 0xAC47, 0x816F, + 0xAC48, 0x8170, 0xAC49, 0x8171, 0xAC4A, 0x8172, 0xAC4B, 0xB0C0, + 0xAC4C, 0x8173, 0xAC4D, 0xB0C1, 0xAC4E, 0x8174, 0xAC4F, 0x8175, + 0xAC50, 0x8176, 0xAC51, 0x8177, 0xAC52, 0x8178, 0xAC53, 0x8179, + 0xAC54, 0xB0C2, 0xAC55, 0x817A, 0xAC56, 0x8181, 0xAC57, 0x8182, + 0xAC58, 0xB0C3, 0xAC59, 0x8183, 0xAC5A, 0x8184, 0xAC5B, 0x8185, + 0xAC5C, 0xB0C4, 0xAC5D, 0x8186, 0xAC5E, 0x8187, 0xAC5F, 0x8188, + 0xAC60, 0x8189, 0xAC61, 0x818A, 0xAC62, 0x818B, 0xAC63, 0x818C, + 0xAC64, 0x818D, 0xAC65, 0x818E, 0xAC66, 0x818F, 0xAC67, 0x8190, + 0xAC68, 0x8191, 0xAC69, 0x8192, 0xAC6A, 0x8193, 0xAC6B, 0x8194, + 0xAC6C, 0x8195, 0xAC6D, 0x8196, 0xAC6E, 0x8197, 0xAC6F, 0x8198, + 0xAC70, 0xB0C5, 0xAC71, 0xB0C6, 0xAC72, 0x8199, 0xAC73, 0x819A, + 0xAC74, 0xB0C7, 0xAC75, 0x819B, 0xAC76, 0x819C, 0xAC77, 0xB0C8, + 0xAC78, 0xB0C9, 0xAC79, 0x819D, 0xAC7A, 0xB0CA, 0xAC7B, 0x819E, + 0xAC7C, 0x819F, 0xAC7D, 0x81A0, 0xAC7E, 0x81A1, 0xAC7F, 0x81A2, + 0xAC80, 0xB0CB, 0xAC81, 0xB0CC, 0xAC82, 0x81A3, 0xAC83, 0xB0CD, + 0xAC84, 0xB0CE, 0xAC85, 0xB0CF, 0xAC86, 0xB0D0, 0xAC87, 0x81A4, + 0xAC88, 0x81A5, 0xAC89, 0xB0D1, 0xAC8A, 0xB0D2, 0xAC8B, 0xB0D3, + 0xAC8C, 0xB0D4, 0xAC8D, 0x81A6, 0xAC8E, 0x81A7, 0xAC8F, 0x81A8, + 0xAC90, 0xB0D5, 0xAC91, 0x81A9, 0xAC92, 0x81AA, 0xAC93, 0x81AB, + 0xAC94, 0xB0D6, 0xAC95, 0x81AC, 0xAC96, 0x81AD, 0xAC97, 0x81AE, + 0xAC98, 0x81AF, 0xAC99, 0x81B0, 0xAC9A, 0x81B1, 0xAC9B, 0x81B2, + 0xAC9C, 0xB0D7, 0xAC9D, 0xB0D8, 0xAC9E, 0x81B3, 0xAC9F, 0xB0D9, + 0xACA0, 0xB0DA, 0xACA1, 0xB0DB, 0xACA2, 0x81B4, 0xACA3, 0x81B5, + 0xACA4, 0x81B6, 0xACA5, 0x81B7, 0xACA6, 0x81B8, 0xACA7, 0x81B9, + 0xACA8, 0xB0DC, 0xACA9, 0xB0DD, 0xACAA, 0xB0DE, 0xACAB, 0x81BA, + 0xACAC, 0xB0DF, 0xACAD, 0x81BB, 0xACAE, 0x81BC, 0xACAF, 0xB0E0, + 0xACB0, 0xB0E1, 0xACB1, 0x81BD, 0xACB2, 0x81BE, 0xACB3, 0x81BF, + 0xACB4, 0x81C0, 0xACB5, 0x81C1, 0xACB6, 0x81C2, 0xACB7, 0x81C3, + 0xACB8, 0xB0E2, 0xACB9, 0xB0E3, 0xACBA, 0x81C4, 0xACBB, 0xB0E4, + 0xACBC, 0xB0E5, 0xACBD, 0xB0E6, 0xACBE, 0x81C5, 0xACBF, 0x81C6, + 0xACC0, 0x81C7, 0xACC1, 0xB0E7, 0xACC2, 0x81C8, 0xACC3, 0x81C9, + 0xACC4, 0xB0E8, 0xACC5, 0x81CA, 0xACC6, 0x81CB, 0xACC7, 0x81CC, + 0xACC8, 0xB0E9, 0xACC9, 0x81CD, 0xACCA, 0x81CE, 0xACCB, 0x81CF, + 0xACCC, 0xB0EA, 0xACCD, 0x81D0, 0xACCE, 0x81D1, 0xACCF, 0x81D2, + 0xACD0, 0x81D3, 0xACD1, 0x81D4, 0xACD2, 0x81D5, 0xACD3, 0x81D6, + 0xACD4, 0x81D7, 0xACD5, 0xB0EB, 0xACD6, 0x81D8, 0xACD7, 0xB0EC, + 0xACD8, 0x81D9, 0xACD9, 0x81DA, 0xACDA, 0x81DB, 0xACDB, 0x81DC, + 0xACDC, 0x81DD, 0xACDD, 0x81DE, 0xACDE, 0x81DF, 0xACDF, 0x81E0, + 0xACE0, 0xB0ED, 0xACE1, 0xB0EE, 0xACE2, 0x81E1, 0xACE3, 0x81E2, + 0xACE4, 0xB0EF, 0xACE5, 0x81E3, 0xACE6, 0x81E4, 0xACE7, 0xB0F0, + 0xACE8, 0xB0F1, 0xACE9, 0x81E5, 0xACEA, 0xB0F2, 0xACEB, 0x81E6, + 0xACEC, 0xB0F3, 0xACED, 0x81E7, 0xACEE, 0x81E8, 0xACEF, 0xB0F4, + 0xACF0, 0xB0F5, 0xACF1, 0xB0F6, 0xACF2, 0x81E9, 0xACF3, 0xB0F7, + 0xACF4, 0x81EA, 0xACF5, 0xB0F8, 0xACF6, 0xB0F9, 0xACF7, 0x81EB, + 0xACF8, 0x81EC, 0xACF9, 0x81ED, 0xACFA, 0x81EE, 0xACFB, 0x81EF, + 0xACFC, 0xB0FA, 0xACFD, 0xB0FB, 0xACFE, 0x81F0, 0xACFF, 0x81F1, + 0xAD00, 0xB0FC, 0xAD01, 0x81F2, 0xAD02, 0x81F3, 0xAD03, 0x81F4, + 0xAD04, 0xB0FD, 0xAD05, 0x81F5, 0xAD06, 0xB0FE, 0xAD07, 0x81F6, + 0xAD08, 0x81F7, 0xAD09, 0x81F8, 0xAD0A, 0x81F9, 0xAD0B, 0x81FA, + 0xAD0C, 0xB1A1, 0xAD0D, 0xB1A2, 0xAD0E, 0x81FB, 0xAD0F, 0xB1A3, + 0xAD10, 0x81FC, 0xAD11, 0xB1A4, 0xAD12, 0x81FD, 0xAD13, 0x81FE, + 0xAD14, 0x8241, 0xAD15, 0x8242, 0xAD16, 0x8243, 0xAD17, 0x8244, + 0xAD18, 0xB1A5, 0xAD19, 0x8245, 0xAD1A, 0x8246, 0xAD1B, 0x8247, + 0xAD1C, 0xB1A6, 0xAD1D, 0x8248, 0xAD1E, 0x8249, 0xAD1F, 0x824A, + 0xAD20, 0xB1A7, 0xAD21, 0x824B, 0xAD22, 0x824C, 0xAD23, 0x824D, + 0xAD24, 0x824E, 0xAD25, 0x824F, 0xAD26, 0x8250, 0xAD27, 0x8251, + 0xAD28, 0x8252, 0xAD29, 0xB1A8, 0xAD2A, 0x8253, 0xAD2B, 0x8254, + 0xAD2C, 0xB1A9, 0xAD2D, 0xB1AA, 0xAD2E, 0x8255, 0xAD2F, 0x8256, + 0xAD30, 0x8257, 0xAD31, 0x8258, 0xAD32, 0x8259, 0xAD33, 0x825A, + 0xAD34, 0xB1AB, 0xAD35, 0xB1AC, 0xAD36, 0x8261, 0xAD37, 0x8262, + 0xAD38, 0xB1AD, 0xAD39, 0x8263, 0xAD3A, 0x8264, 0xAD3B, 0x8265, + 0xAD3C, 0xB1AE, 0xAD3D, 0x8266, 0xAD3E, 0x8267, 0xAD3F, 0x8268, + 0xAD40, 0x8269, 0xAD41, 0x826A, 0xAD42, 0x826B, 0xAD43, 0x826C, + 0xAD44, 0xB1AF, 0xAD45, 0xB1B0, 0xAD46, 0x826D, 0xAD47, 0xB1B1, + 0xAD48, 0x826E, 0xAD49, 0xB1B2, 0xAD4A, 0x826F, 0xAD4B, 0x8270, + 0xAD4C, 0x8271, 0xAD4D, 0x8272, 0xAD4E, 0x8273, 0xAD4F, 0x8274, + 0xAD50, 0xB1B3, 0xAD51, 0x8275, 0xAD52, 0x8276, 0xAD53, 0x8277, + 0xAD54, 0xB1B4, 0xAD55, 0x8278, 0xAD56, 0x8279, 0xAD57, 0x827A, + 0xAD58, 0xB1B5, 0xAD59, 0x8281, 0xAD5A, 0x8282, 0xAD5B, 0x8283, + 0xAD5C, 0x8284, 0xAD5D, 0x8285, 0xAD5E, 0x8286, 0xAD5F, 0x8287, + 0xAD60, 0x8288, 0xAD61, 0xB1B6, 0xAD62, 0x8289, 0xAD63, 0xB1B7, + 0xAD64, 0x828A, 0xAD65, 0x828B, 0xAD66, 0x828C, 0xAD67, 0x828D, + 0xAD68, 0x828E, 0xAD69, 0x828F, 0xAD6A, 0x8290, 0xAD6B, 0x8291, + 0xAD6C, 0xB1B8, 0xAD6D, 0xB1B9, 0xAD6E, 0x8292, 0xAD6F, 0x8293, + 0xAD70, 0xB1BA, 0xAD71, 0x8294, 0xAD72, 0x8295, 0xAD73, 0xB1BB, + 0xAD74, 0xB1BC, 0xAD75, 0xB1BD, 0xAD76, 0xB1BE, 0xAD77, 0x8296, + 0xAD78, 0x8297, 0xAD79, 0x8298, 0xAD7A, 0x8299, 0xAD7B, 0xB1BF, + 0xAD7C, 0xB1C0, 0xAD7D, 0xB1C1, 0xAD7E, 0x829A, 0xAD7F, 0xB1C2, + 0xAD80, 0x829B, 0xAD81, 0xB1C3, 0xAD82, 0xB1C4, 0xAD83, 0x829C, + 0xAD84, 0x829D, 0xAD85, 0x829E, 0xAD86, 0x829F, 0xAD87, 0x82A0, + 0xAD88, 0xB1C5, 0xAD89, 0xB1C6, 0xAD8A, 0x82A1, 0xAD8B, 0x82A2, + 0xAD8C, 0xB1C7, 0xAD8D, 0x82A3, 0xAD8E, 0x82A4, 0xAD8F, 0x82A5, + 0xAD90, 0xB1C8, 0xAD91, 0x82A6, 0xAD92, 0x82A7, 0xAD93, 0x82A8, + 0xAD94, 0x82A9, 0xAD95, 0x82AA, 0xAD96, 0x82AB, 0xAD97, 0x82AC, + 0xAD98, 0x82AD, 0xAD99, 0x82AE, 0xAD9A, 0x82AF, 0xAD9B, 0x82B0, + 0xAD9C, 0xB1C9, 0xAD9D, 0xB1CA, 0xAD9E, 0x82B1, 0xAD9F, 0x82B2, + 0xADA0, 0x82B3, 0xADA1, 0x82B4, 0xADA2, 0x82B5, 0xADA3, 0x82B6, + 0xADA4, 0xB1CB, 0xADA5, 0x82B7, 0xADA6, 0x82B8, 0xADA7, 0x82B9, + 0xADA8, 0x82BA, 0xADA9, 0x82BB, 0xADAA, 0x82BC, 0xADAB, 0x82BD, + 0xADAC, 0x82BE, 0xADAD, 0x82BF, 0xADAE, 0x82C0, 0xADAF, 0x82C1, + 0xADB0, 0x82C2, 0xADB1, 0x82C3, 0xADB2, 0x82C4, 0xADB3, 0x82C5, + 0xADB4, 0x82C6, 0xADB5, 0x82C7, 0xADB6, 0x82C8, 0xADB7, 0xB1CC, + 0xADB8, 0x82C9, 0xADB9, 0x82CA, 0xADBA, 0x82CB, 0xADBB, 0x82CC, + 0xADBC, 0x82CD, 0xADBD, 0x82CE, 0xADBE, 0x82CF, 0xADBF, 0x82D0, + 0xADC0, 0xB1CD, 0xADC1, 0xB1CE, 0xADC2, 0x82D1, 0xADC3, 0x82D2, + 0xADC4, 0xB1CF, 0xADC5, 0x82D3, 0xADC6, 0x82D4, 0xADC7, 0x82D5, + 0xADC8, 0xB1D0, 0xADC9, 0x82D6, 0xADCA, 0x82D7, 0xADCB, 0x82D8, + 0xADCC, 0x82D9, 0xADCD, 0x82DA, 0xADCE, 0x82DB, 0xADCF, 0x82DC, + 0xADD0, 0xB1D1, 0xADD1, 0xB1D2, 0xADD2, 0x82DD, 0xADD3, 0xB1D3, + 0xADD4, 0x82DE, 0xADD5, 0x82DF, 0xADD6, 0x82E0, 0xADD7, 0x82E1, + 0xADD8, 0x82E2, 0xADD9, 0x82E3, 0xADDA, 0x82E4, 0xADDB, 0x82E5, + 0xADDC, 0xB1D4, 0xADDD, 0x82E6, 0xADDE, 0x82E7, 0xADDF, 0x82E8, + 0xADE0, 0xB1D5, 0xADE1, 0x82E9, 0xADE2, 0x82EA, 0xADE3, 0x82EB, + 0xADE4, 0xB1D6, 0xADE5, 0x82EC, 0xADE6, 0x82ED, 0xADE7, 0x82EE, + 0xADE8, 0x82EF, 0xADE9, 0x82F0, 0xADEA, 0x82F1, 0xADEB, 0x82F2, + 0xADEC, 0x82F3, 0xADED, 0x82F4, 0xADEE, 0x82F5, 0xADEF, 0x82F6, + 0xADF0, 0x82F7, 0xADF1, 0x82F8, 0xADF2, 0x82F9, 0xADF3, 0x82FA, + 0xADF4, 0x82FB, 0xADF5, 0x82FC, 0xADF6, 0x82FD, 0xADF7, 0x82FE, + 0xADF8, 0xB1D7, 0xADF9, 0xB1D8, 0xADFA, 0x8341, 0xADFB, 0x8342, + 0xADFC, 0xB1D9, 0xADFD, 0x8343, 0xADFE, 0x8344, 0xADFF, 0xB1DA, + 0xAE00, 0xB1DB, 0xAE01, 0xB1DC, 0xAE02, 0x8345, 0xAE03, 0x8346, + 0xAE04, 0x8347, 0xAE05, 0x8348, 0xAE06, 0x8349, 0xAE07, 0x834A, + 0xAE08, 0xB1DD, 0xAE09, 0xB1DE, 0xAE0A, 0x834B, 0xAE0B, 0xB1DF, + 0xAE0C, 0x834C, 0xAE0D, 0xB1E0, 0xAE0E, 0x834D, 0xAE0F, 0x834E, + 0xAE10, 0x834F, 0xAE11, 0x8350, 0xAE12, 0x8351, 0xAE13, 0x8352, + 0xAE14, 0xB1E1, 0xAE15, 0x8353, 0xAE16, 0x8354, 0xAE17, 0x8355, + 0xAE18, 0x8356, 0xAE19, 0x8357, 0xAE1A, 0x8358, 0xAE1B, 0x8359, + 0xAE1C, 0x835A, 0xAE1D, 0x8361, 0xAE1E, 0x8362, 0xAE1F, 0x8363, + 0xAE20, 0x8364, 0xAE21, 0x8365, 0xAE22, 0x8366, 0xAE23, 0x8367, + 0xAE24, 0x8368, 0xAE25, 0x8369, 0xAE26, 0x836A, 0xAE27, 0x836B, + 0xAE28, 0x836C, 0xAE29, 0x836D, 0xAE2A, 0x836E, 0xAE2B, 0x836F, + 0xAE2C, 0x8370, 0xAE2D, 0x8371, 0xAE2E, 0x8372, 0xAE2F, 0x8373, + 0xAE30, 0xB1E2, 0xAE31, 0xB1E3, 0xAE32, 0x8374, 0xAE33, 0x8375, + 0xAE34, 0xB1E4, 0xAE35, 0x8376, 0xAE36, 0x8377, 0xAE37, 0xB1E5, + 0xAE38, 0xB1E6, 0xAE39, 0x8378, 0xAE3A, 0xB1E7, 0xAE3B, 0x8379, + 0xAE3C, 0x837A, 0xAE3D, 0x8381, 0xAE3E, 0x8382, 0xAE3F, 0x8383, + 0xAE40, 0xB1E8, 0xAE41, 0xB1E9, 0xAE42, 0x8384, 0xAE43, 0xB1EA, + 0xAE44, 0x8385, 0xAE45, 0xB1EB, 0xAE46, 0xB1EC, 0xAE47, 0x8386, + 0xAE48, 0x8387, 0xAE49, 0x8388, 0xAE4A, 0xB1ED, 0xAE4B, 0x8389, + 0xAE4C, 0xB1EE, 0xAE4D, 0xB1EF, 0xAE4E, 0xB1F0, 0xAE4F, 0x838A, + 0xAE50, 0xB1F1, 0xAE51, 0x838B, 0xAE52, 0x838C, 0xAE53, 0x838D, + 0xAE54, 0xB1F2, 0xAE55, 0x838E, 0xAE56, 0xB1F3, 0xAE57, 0x838F, + 0xAE58, 0x8390, 0xAE59, 0x8391, 0xAE5A, 0x8392, 0xAE5B, 0x8393, + 0xAE5C, 0xB1F4, 0xAE5D, 0xB1F5, 0xAE5E, 0x8394, 0xAE5F, 0xB1F6, + 0xAE60, 0xB1F7, 0xAE61, 0xB1F8, 0xAE62, 0x8395, 0xAE63, 0x8396, + 0xAE64, 0x8397, 0xAE65, 0xB1F9, 0xAE66, 0x8398, 0xAE67, 0x8399, + 0xAE68, 0xB1FA, 0xAE69, 0xB1FB, 0xAE6A, 0x839A, 0xAE6B, 0x839B, + 0xAE6C, 0xB1FC, 0xAE6D, 0x839C, 0xAE6E, 0x839D, 0xAE6F, 0x839E, + 0xAE70, 0xB1FD, 0xAE71, 0x839F, 0xAE72, 0x83A0, 0xAE73, 0x83A1, + 0xAE74, 0x83A2, 0xAE75, 0x83A3, 0xAE76, 0x83A4, 0xAE77, 0x83A5, + 0xAE78, 0xB1FE, 0xAE79, 0xB2A1, 0xAE7A, 0x83A6, 0xAE7B, 0xB2A2, + 0xAE7C, 0xB2A3, 0xAE7D, 0xB2A4, 0xAE7E, 0x83A7, 0xAE7F, 0x83A8, + 0xAE80, 0x83A9, 0xAE81, 0x83AA, 0xAE82, 0x83AB, 0xAE83, 0x83AC, + 0xAE84, 0xB2A5, 0xAE85, 0xB2A6, 0xAE86, 0x83AD, 0xAE87, 0x83AE, + 0xAE88, 0x83AF, 0xAE89, 0x83B0, 0xAE8A, 0x83B1, 0xAE8B, 0x83B2, + 0xAE8C, 0xB2A7, 0xAE8D, 0x83B3, 0xAE8E, 0x83B4, 0xAE8F, 0x83B5, + 0xAE90, 0x83B6, 0xAE91, 0x83B7, 0xAE92, 0x83B8, 0xAE93, 0x83B9, + 0xAE94, 0x83BA, 0xAE95, 0x83BB, 0xAE96, 0x83BC, 0xAE97, 0x83BD, + 0xAE98, 0x83BE, 0xAE99, 0x83BF, 0xAE9A, 0x83C0, 0xAE9B, 0x83C1, + 0xAE9C, 0x83C2, 0xAE9D, 0x83C3, 0xAE9E, 0x83C4, 0xAE9F, 0x83C5, + 0xAEA0, 0x83C6, 0xAEA1, 0x83C7, 0xAEA2, 0x83C8, 0xAEA3, 0x83C9, + 0xAEA4, 0x83CA, 0xAEA5, 0x83CB, 0xAEA6, 0x83CC, 0xAEA7, 0x83CD, + 0xAEA8, 0x83CE, 0xAEA9, 0x83CF, 0xAEAA, 0x83D0, 0xAEAB, 0x83D1, + 0xAEAC, 0x83D2, 0xAEAD, 0x83D3, 0xAEAE, 0x83D4, 0xAEAF, 0x83D5, + 0xAEB0, 0x83D6, 0xAEB1, 0x83D7, 0xAEB2, 0x83D8, 0xAEB3, 0x83D9, + 0xAEB4, 0x83DA, 0xAEB5, 0x83DB, 0xAEB6, 0x83DC, 0xAEB7, 0x83DD, + 0xAEB8, 0x83DE, 0xAEB9, 0x83DF, 0xAEBA, 0x83E0, 0xAEBB, 0x83E1, + 0xAEBC, 0xB2A8, 0xAEBD, 0xB2A9, 0xAEBE, 0xB2AA, 0xAEBF, 0x83E2, + 0xAEC0, 0xB2AB, 0xAEC1, 0x83E3, 0xAEC2, 0x83E4, 0xAEC3, 0x83E5, + 0xAEC4, 0xB2AC, 0xAEC5, 0x83E6, 0xAEC6, 0x83E7, 0xAEC7, 0x83E8, + 0xAEC8, 0x83E9, 0xAEC9, 0x83EA, 0xAECA, 0x83EB, 0xAECB, 0x83EC, + 0xAECC, 0xB2AD, 0xAECD, 0xB2AE, 0xAECE, 0x83ED, 0xAECF, 0xB2AF, + 0xAED0, 0xB2B0, 0xAED1, 0xB2B1, 0xAED2, 0x83EE, 0xAED3, 0x83EF, + 0xAED4, 0x83F0, 0xAED5, 0x83F1, 0xAED6, 0x83F2, 0xAED7, 0x83F3, + 0xAED8, 0xB2B2, 0xAED9, 0xB2B3, 0xAEDA, 0x83F4, 0xAEDB, 0x83F5, + 0xAEDC, 0xB2B4, 0xAEDD, 0x83F6, 0xAEDE, 0x83F7, 0xAEDF, 0x83F8, + 0xAEE0, 0x83F9, 0xAEE1, 0x83FA, 0xAEE2, 0x83FB, 0xAEE3, 0x83FC, + 0xAEE4, 0x83FD, 0xAEE5, 0x83FE, 0xAEE6, 0x8441, 0xAEE7, 0x8442, + 0xAEE8, 0xB2B5, 0xAEE9, 0x8443, 0xAEEA, 0x8444, 0xAEEB, 0xB2B6, + 0xAEEC, 0x8445, 0xAEED, 0xB2B7, 0xAEEE, 0x8446, 0xAEEF, 0x8447, + 0xAEF0, 0x8448, 0xAEF1, 0x8449, 0xAEF2, 0x844A, 0xAEF3, 0x844B, + 0xAEF4, 0xB2B8, 0xAEF5, 0x844C, 0xAEF6, 0x844D, 0xAEF7, 0x844E, + 0xAEF8, 0xB2B9, 0xAEF9, 0x844F, 0xAEFA, 0x8450, 0xAEFB, 0x8451, + 0xAEFC, 0xB2BA, 0xAEFD, 0x8452, 0xAEFE, 0x8453, 0xAEFF, 0x8454, + 0xAF00, 0x8455, 0xAF01, 0x8456, 0xAF02, 0x8457, 0xAF03, 0x8458, + 0xAF04, 0x8459, 0xAF05, 0x845A, 0xAF06, 0x8461, 0xAF07, 0xB2BB, + 0xAF08, 0xB2BC, 0xAF09, 0x8462, 0xAF0A, 0x8463, 0xAF0B, 0x8464, + 0xAF0C, 0x8465, 0xAF0D, 0xB2BD, 0xAF0E, 0x8466, 0xAF0F, 0x8467, + 0xAF10, 0xB2BE, 0xAF11, 0x8468, 0xAF12, 0x8469, 0xAF13, 0x846A, + 0xAF14, 0x846B, 0xAF15, 0x846C, 0xAF16, 0x846D, 0xAF17, 0x846E, + 0xAF18, 0x846F, 0xAF19, 0x8470, 0xAF1A, 0x8471, 0xAF1B, 0x8472, + 0xAF1C, 0x8473, 0xAF1D, 0x8474, 0xAF1E, 0x8475, 0xAF1F, 0x8476, + 0xAF20, 0x8477, 0xAF21, 0x8478, 0xAF22, 0x8479, 0xAF23, 0x847A, + 0xAF24, 0x8481, 0xAF25, 0x8482, 0xAF26, 0x8483, 0xAF27, 0x8484, + 0xAF28, 0x8485, 0xAF29, 0x8486, 0xAF2A, 0x8487, 0xAF2B, 0x8488, + 0xAF2C, 0xB2BF, 0xAF2D, 0xB2C0, 0xAF2E, 0x8489, 0xAF2F, 0x848A, + 0xAF30, 0xB2C1, 0xAF31, 0x848B, 0xAF32, 0xB2C2, 0xAF33, 0x848C, + 0xAF34, 0xB2C3, 0xAF35, 0x848D, 0xAF36, 0x848E, 0xAF37, 0x848F, + 0xAF38, 0x8490, 0xAF39, 0x8491, 0xAF3A, 0x8492, 0xAF3B, 0x8493, + 0xAF3C, 0xB2C4, 0xAF3D, 0xB2C5, 0xAF3E, 0x8494, 0xAF3F, 0xB2C6, + 0xAF40, 0x8495, 0xAF41, 0xB2C7, 0xAF42, 0xB2C8, 0xAF43, 0xB2C9, + 0xAF44, 0x8496, 0xAF45, 0x8497, 0xAF46, 0x8498, 0xAF47, 0x8499, + 0xAF48, 0xB2CA, 0xAF49, 0xB2CB, 0xAF4A, 0x849A, 0xAF4B, 0x849B, + 0xAF4C, 0x849C, 0xAF4D, 0x849D, 0xAF4E, 0x849E, 0xAF4F, 0x849F, + 0xAF50, 0xB2CC, 0xAF51, 0x84A0, 0xAF52, 0x84A1, 0xAF53, 0x84A2, + 0xAF54, 0x84A3, 0xAF55, 0x84A4, 0xAF56, 0x84A5, 0xAF57, 0x84A6, + 0xAF58, 0x84A7, 0xAF59, 0x84A8, 0xAF5A, 0x84A9, 0xAF5B, 0x84AA, + 0xAF5C, 0xB2CD, 0xAF5D, 0xB2CE, 0xAF5E, 0x84AB, 0xAF5F, 0x84AC, + 0xAF60, 0x84AD, 0xAF61, 0x84AE, 0xAF62, 0x84AF, 0xAF63, 0x84B0, + 0xAF64, 0xB2CF, 0xAF65, 0xB2D0, 0xAF66, 0x84B1, 0xAF67, 0x84B2, + 0xAF68, 0x84B3, 0xAF69, 0x84B4, 0xAF6A, 0x84B5, 0xAF6B, 0x84B6, + 0xAF6C, 0x84B7, 0xAF6D, 0x84B8, 0xAF6E, 0x84B9, 0xAF6F, 0x84BA, + 0xAF70, 0x84BB, 0xAF71, 0x84BC, 0xAF72, 0x84BD, 0xAF73, 0x84BE, + 0xAF74, 0x84BF, 0xAF75, 0x84C0, 0xAF76, 0x84C1, 0xAF77, 0x84C2, + 0xAF78, 0x84C3, 0xAF79, 0xB2D1, 0xAF7A, 0x84C4, 0xAF7B, 0x84C5, + 0xAF7C, 0x84C6, 0xAF7D, 0x84C7, 0xAF7E, 0x84C8, 0xAF7F, 0x84C9, + 0xAF80, 0xB2D2, 0xAF81, 0x84CA, 0xAF82, 0x84CB, 0xAF83, 0x84CC, + 0xAF84, 0xB2D3, 0xAF85, 0x84CD, 0xAF86, 0x84CE, 0xAF87, 0x84CF, + 0xAF88, 0xB2D4, 0xAF89, 0x84D0, 0xAF8A, 0x84D1, 0xAF8B, 0x84D2, + 0xAF8C, 0x84D3, 0xAF8D, 0x84D4, 0xAF8E, 0x84D5, 0xAF8F, 0x84D6, + 0xAF90, 0xB2D5, 0xAF91, 0xB2D6, 0xAF92, 0x84D7, 0xAF93, 0x84D8, + 0xAF94, 0x84D9, 0xAF95, 0xB2D7, 0xAF96, 0x84DA, 0xAF97, 0x84DB, + 0xAF98, 0x84DC, 0xAF99, 0x84DD, 0xAF9A, 0x84DE, 0xAF9B, 0x84DF, + 0xAF9C, 0xB2D8, 0xAF9D, 0x84E0, 0xAF9E, 0x84E1, 0xAF9F, 0x84E2, + 0xAFA0, 0x84E3, 0xAFA1, 0x84E4, 0xAFA2, 0x84E5, 0xAFA3, 0x84E6, + 0xAFA4, 0x84E7, 0xAFA5, 0x84E8, 0xAFA6, 0x84E9, 0xAFA7, 0x84EA, + 0xAFA8, 0x84EB, 0xAFA9, 0x84EC, 0xAFAA, 0x84ED, 0xAFAB, 0x84EE, + 0xAFAC, 0x84EF, 0xAFAD, 0x84F0, 0xAFAE, 0x84F1, 0xAFAF, 0x84F2, + 0xAFB0, 0x84F3, 0xAFB1, 0x84F4, 0xAFB2, 0x84F5, 0xAFB3, 0x84F6, + 0xAFB4, 0x84F7, 0xAFB5, 0x84F8, 0xAFB6, 0x84F9, 0xAFB7, 0x84FA, + 0xAFB8, 0xB2D9, 0xAFB9, 0xB2DA, 0xAFBA, 0x84FB, 0xAFBB, 0x84FC, + 0xAFBC, 0xB2DB, 0xAFBD, 0x84FD, 0xAFBE, 0x84FE, 0xAFBF, 0x8541, + 0xAFC0, 0xB2DC, 0xAFC1, 0x8542, 0xAFC2, 0x8543, 0xAFC3, 0x8544, + 0xAFC4, 0x8545, 0xAFC5, 0x8546, 0xAFC6, 0x8547, 0xAFC7, 0xB2DD, + 0xAFC8, 0xB2DE, 0xAFC9, 0xB2DF, 0xAFCA, 0x8548, 0xAFCB, 0xB2E0, + 0xAFCC, 0x8549, 0xAFCD, 0xB2E1, 0xAFCE, 0xB2E2, 0xAFCF, 0x854A, + 0xAFD0, 0x854B, 0xAFD1, 0x854C, 0xAFD2, 0x854D, 0xAFD3, 0x854E, + 0xAFD4, 0xB2E3, 0xAFD5, 0x854F, 0xAFD6, 0x8550, 0xAFD7, 0x8551, + 0xAFD8, 0x8552, 0xAFD9, 0x8553, 0xAFDA, 0x8554, 0xAFDB, 0x8555, + 0xAFDC, 0xB2E4, 0xAFDD, 0x8556, 0xAFDE, 0x8557, 0xAFDF, 0x8558, + 0xAFE0, 0x8559, 0xAFE1, 0x855A, 0xAFE2, 0x8561, 0xAFE3, 0x8562, + 0xAFE4, 0x8563, 0xAFE5, 0x8564, 0xAFE6, 0x8565, 0xAFE7, 0x8566, + 0xAFE8, 0xB2E5, 0xAFE9, 0xB2E6, 0xAFEA, 0x8567, 0xAFEB, 0x8568, + 0xAFEC, 0x8569, 0xAFED, 0x856A, 0xAFEE, 0x856B, 0xAFEF, 0x856C, + 0xAFF0, 0xB2E7, 0xAFF1, 0xB2E8, 0xAFF2, 0x856D, 0xAFF3, 0x856E, + 0xAFF4, 0xB2E9, 0xAFF5, 0x856F, 0xAFF6, 0x8570, 0xAFF7, 0x8571, + 0xAFF8, 0xB2EA, 0xAFF9, 0x8572, 0xAFFA, 0x8573, 0xAFFB, 0x8574, + 0xAFFC, 0x8575, 0xAFFD, 0x8576, 0xAFFE, 0x8577, 0xAFFF, 0x8578, + 0xB000, 0xB2EB, 0xB001, 0xB2EC, 0xB002, 0x8579, 0xB003, 0x857A, + 0xB004, 0xB2ED, 0xB005, 0x8581, 0xB006, 0x8582, 0xB007, 0x8583, + 0xB008, 0x8584, 0xB009, 0x8585, 0xB00A, 0x8586, 0xB00B, 0x8587, + 0xB00C, 0xB2EE, 0xB00D, 0x8588, 0xB00E, 0x8589, 0xB00F, 0x858A, + 0xB010, 0xB2EF, 0xB011, 0x858B, 0xB012, 0x858C, 0xB013, 0x858D, + 0xB014, 0xB2F0, 0xB015, 0x858E, 0xB016, 0x858F, 0xB017, 0x8590, + 0xB018, 0x8591, 0xB019, 0x8592, 0xB01A, 0x8593, 0xB01B, 0x8594, + 0xB01C, 0xB2F1, 0xB01D, 0xB2F2, 0xB01E, 0x8595, 0xB01F, 0x8596, + 0xB020, 0x8597, 0xB021, 0x8598, 0xB022, 0x8599, 0xB023, 0x859A, + 0xB024, 0x859B, 0xB025, 0x859C, 0xB026, 0x859D, 0xB027, 0x859E, + 0xB028, 0xB2F3, 0xB029, 0x859F, 0xB02A, 0x85A0, 0xB02B, 0x85A1, + 0xB02C, 0x85A2, 0xB02D, 0x85A3, 0xB02E, 0x85A4, 0xB02F, 0x85A5, + 0xB030, 0x85A6, 0xB031, 0x85A7, 0xB032, 0x85A8, 0xB033, 0x85A9, + 0xB034, 0x85AA, 0xB035, 0x85AB, 0xB036, 0x85AC, 0xB037, 0x85AD, + 0xB038, 0x85AE, 0xB039, 0x85AF, 0xB03A, 0x85B0, 0xB03B, 0x85B1, + 0xB03C, 0x85B2, 0xB03D, 0x85B3, 0xB03E, 0x85B4, 0xB03F, 0x85B5, + 0xB040, 0x85B6, 0xB041, 0x85B7, 0xB042, 0x85B8, 0xB043, 0x85B9, + 0xB044, 0xB2F4, 0xB045, 0xB2F5, 0xB046, 0x85BA, 0xB047, 0x85BB, + 0xB048, 0xB2F6, 0xB049, 0x85BC, 0xB04A, 0xB2F7, 0xB04B, 0x85BD, + 0xB04C, 0xB2F8, 0xB04D, 0x85BE, 0xB04E, 0xB2F9, 0xB04F, 0x85BF, + 0xB050, 0x85C0, 0xB051, 0x85C1, 0xB052, 0x85C2, 0xB053, 0xB2FA, + 0xB054, 0xB2FB, 0xB055, 0xB2FC, 0xB056, 0x85C3, 0xB057, 0xB2FD, + 0xB058, 0x85C4, 0xB059, 0xB2FE, 0xB05A, 0x85C5, 0xB05B, 0x85C6, + 0xB05C, 0x85C7, 0xB05D, 0xB3A1, 0xB05E, 0x85C8, 0xB05F, 0x85C9, + 0xB060, 0x85CA, 0xB061, 0x85CB, 0xB062, 0x85CC, 0xB063, 0x85CD, + 0xB064, 0x85CE, 0xB065, 0x85CF, 0xB066, 0x85D0, 0xB067, 0x85D1, + 0xB068, 0x85D2, 0xB069, 0x85D3, 0xB06A, 0x85D4, 0xB06B, 0x85D5, + 0xB06C, 0x85D6, 0xB06D, 0x85D7, 0xB06E, 0x85D8, 0xB06F, 0x85D9, + 0xB070, 0x85DA, 0xB071, 0x85DB, 0xB072, 0x85DC, 0xB073, 0x85DD, + 0xB074, 0x85DE, 0xB075, 0x85DF, 0xB076, 0x85E0, 0xB077, 0x85E1, + 0xB078, 0x85E2, 0xB079, 0x85E3, 0xB07A, 0x85E4, 0xB07B, 0x85E5, + 0xB07C, 0xB3A2, 0xB07D, 0xB3A3, 0xB07E, 0x85E6, 0xB07F, 0x85E7, + 0xB080, 0xB3A4, 0xB081, 0x85E8, 0xB082, 0x85E9, 0xB083, 0x85EA, + 0xB084, 0xB3A5, 0xB085, 0x85EB, 0xB086, 0x85EC, 0xB087, 0x85ED, + 0xB088, 0x85EE, 0xB089, 0x85EF, 0xB08A, 0x85F0, 0xB08B, 0x85F1, + 0xB08C, 0xB3A6, 0xB08D, 0xB3A7, 0xB08E, 0x85F2, 0xB08F, 0xB3A8, + 0xB090, 0x85F3, 0xB091, 0xB3A9, 0xB092, 0x85F4, 0xB093, 0x85F5, + 0xB094, 0x85F6, 0xB095, 0x85F7, 0xB096, 0x85F8, 0xB097, 0x85F9, + 0xB098, 0xB3AA, 0xB099, 0xB3AB, 0xB09A, 0xB3AC, 0xB09B, 0x85FA, + 0xB09C, 0xB3AD, 0xB09D, 0x85FB, 0xB09E, 0x85FC, 0xB09F, 0xB3AE, + 0xB0A0, 0xB3AF, 0xB0A1, 0xB3B0, 0xB0A2, 0xB3B1, 0xB0A3, 0x85FD, + 0xB0A4, 0x85FE, 0xB0A5, 0x8641, 0xB0A6, 0x8642, 0xB0A7, 0x8643, + 0xB0A8, 0xB3B2, 0xB0A9, 0xB3B3, 0xB0AA, 0x8644, 0xB0AB, 0xB3B4, + 0xB0AC, 0xB3B5, 0xB0AD, 0xB3B6, 0xB0AE, 0xB3B7, 0xB0AF, 0xB3B8, + 0xB0B0, 0x8645, 0xB0B1, 0xB3B9, 0xB0B2, 0x8646, 0xB0B3, 0xB3BA, + 0xB0B4, 0xB3BB, 0xB0B5, 0xB3BC, 0xB0B6, 0x8647, 0xB0B7, 0x8648, + 0xB0B8, 0xB3BD, 0xB0B9, 0x8649, 0xB0BA, 0x864A, 0xB0BB, 0x864B, + 0xB0BC, 0xB3BE, 0xB0BD, 0x864C, 0xB0BE, 0x864D, 0xB0BF, 0x864E, + 0xB0C0, 0x864F, 0xB0C1, 0x8650, 0xB0C2, 0x8651, 0xB0C3, 0x8652, + 0xB0C4, 0xB3BF, 0xB0C5, 0xB3C0, 0xB0C6, 0x8653, 0xB0C7, 0xB3C1, + 0xB0C8, 0xB3C2, 0xB0C9, 0xB3C3, 0xB0CA, 0x8654, 0xB0CB, 0x8655, + 0xB0CC, 0x8656, 0xB0CD, 0x8657, 0xB0CE, 0x8658, 0xB0CF, 0x8659, + 0xB0D0, 0xB3C4, 0xB0D1, 0xB3C5, 0xB0D2, 0x865A, 0xB0D3, 0x8661, + 0xB0D4, 0xB3C6, 0xB0D5, 0x8662, 0xB0D6, 0x8663, 0xB0D7, 0x8664, + 0xB0D8, 0xB3C7, 0xB0D9, 0x8665, 0xB0DA, 0x8666, 0xB0DB, 0x8667, + 0xB0DC, 0x8668, 0xB0DD, 0x8669, 0xB0DE, 0x866A, 0xB0DF, 0x866B, + 0xB0E0, 0xB3C8, 0xB0E1, 0x866C, 0xB0E2, 0x866D, 0xB0E3, 0x866E, + 0xB0E4, 0x866F, 0xB0E5, 0xB3C9, 0xB0E6, 0x8670, 0xB0E7, 0x8671, + 0xB0E8, 0x8672, 0xB0E9, 0x8673, 0xB0EA, 0x8674, 0xB0EB, 0x8675, + 0xB0EC, 0x8676, 0xB0ED, 0x8677, 0xB0EE, 0x8678, 0xB0EF, 0x8679, + 0xB0F0, 0x867A, 0xB0F1, 0x8681, 0xB0F2, 0x8682, 0xB0F3, 0x8683, + 0xB0F4, 0x8684, 0xB0F5, 0x8685, 0xB0F6, 0x8686, 0xB0F7, 0x8687, + 0xB0F8, 0x8688, 0xB0F9, 0x8689, 0xB0FA, 0x868A, 0xB0FB, 0x868B, + 0xB0FC, 0x868C, 0xB0FD, 0x868D, 0xB0FE, 0x868E, 0xB0FF, 0x868F, + 0xB100, 0x8690, 0xB101, 0x8691, 0xB102, 0x8692, 0xB103, 0x8693, + 0xB104, 0x8694, 0xB105, 0x8695, 0xB106, 0x8696, 0xB107, 0x8697, + 0xB108, 0xB3CA, 0xB109, 0xB3CB, 0xB10A, 0x8698, 0xB10B, 0xB3CC, + 0xB10C, 0xB3CD, 0xB10D, 0x8699, 0xB10E, 0x869A, 0xB10F, 0x869B, + 0xB110, 0xB3CE, 0xB111, 0x869C, 0xB112, 0xB3CF, 0xB113, 0xB3D0, + 0xB114, 0x869D, 0xB115, 0x869E, 0xB116, 0x869F, 0xB117, 0x86A0, + 0xB118, 0xB3D1, 0xB119, 0xB3D2, 0xB11A, 0x86A1, 0xB11B, 0xB3D3, + 0xB11C, 0xB3D4, 0xB11D, 0xB3D5, 0xB11E, 0x86A2, 0xB11F, 0x86A3, + 0xB120, 0x86A4, 0xB121, 0x86A5, 0xB122, 0x86A6, 0xB123, 0xB3D6, + 0xB124, 0xB3D7, 0xB125, 0xB3D8, 0xB126, 0x86A7, 0xB127, 0x86A8, + 0xB128, 0xB3D9, 0xB129, 0x86A9, 0xB12A, 0x86AA, 0xB12B, 0x86AB, + 0xB12C, 0xB3DA, 0xB12D, 0x86AC, 0xB12E, 0x86AD, 0xB12F, 0x86AE, + 0xB130, 0x86AF, 0xB131, 0x86B0, 0xB132, 0x86B1, 0xB133, 0x86B2, + 0xB134, 0xB3DB, 0xB135, 0xB3DC, 0xB136, 0x86B3, 0xB137, 0xB3DD, + 0xB138, 0xB3DE, 0xB139, 0xB3DF, 0xB13A, 0x86B4, 0xB13B, 0x86B5, + 0xB13C, 0x86B6, 0xB13D, 0x86B7, 0xB13E, 0x86B8, 0xB13F, 0x86B9, + 0xB140, 0xB3E0, 0xB141, 0xB3E1, 0xB142, 0x86BA, 0xB143, 0x86BB, + 0xB144, 0xB3E2, 0xB145, 0x86BC, 0xB146, 0x86BD, 0xB147, 0x86BE, + 0xB148, 0xB3E3, 0xB149, 0x86BF, 0xB14A, 0x86C0, 0xB14B, 0x86C1, + 0xB14C, 0x86C2, 0xB14D, 0x86C3, 0xB14E, 0x86C4, 0xB14F, 0x86C5, + 0xB150, 0xB3E4, 0xB151, 0xB3E5, 0xB152, 0x86C6, 0xB153, 0x86C7, + 0xB154, 0xB3E6, 0xB155, 0xB3E7, 0xB156, 0x86C8, 0xB157, 0x86C9, + 0xB158, 0xB3E8, 0xB159, 0x86CA, 0xB15A, 0x86CB, 0xB15B, 0x86CC, + 0xB15C, 0xB3E9, 0xB15D, 0x86CD, 0xB15E, 0x86CE, 0xB15F, 0x86CF, + 0xB160, 0xB3EA, 0xB161, 0x86D0, 0xB162, 0x86D1, 0xB163, 0x86D2, + 0xB164, 0x86D3, 0xB165, 0x86D4, 0xB166, 0x86D5, 0xB167, 0x86D6, + 0xB168, 0x86D7, 0xB169, 0x86D8, 0xB16A, 0x86D9, 0xB16B, 0x86DA, + 0xB16C, 0x86DB, 0xB16D, 0x86DC, 0xB16E, 0x86DD, 0xB16F, 0x86DE, + 0xB170, 0x86DF, 0xB171, 0x86E0, 0xB172, 0x86E1, 0xB173, 0x86E2, + 0xB174, 0x86E3, 0xB175, 0x86E4, 0xB176, 0x86E5, 0xB177, 0x86E6, + 0xB178, 0xB3EB, 0xB179, 0xB3EC, 0xB17A, 0x86E7, 0xB17B, 0x86E8, + 0xB17C, 0xB3ED, 0xB17D, 0x86E9, 0xB17E, 0x86EA, 0xB17F, 0x86EB, + 0xB180, 0xB3EE, 0xB181, 0x86EC, 0xB182, 0xB3EF, 0xB183, 0x86ED, + 0xB184, 0x86EE, 0xB185, 0x86EF, 0xB186, 0x86F0, 0xB187, 0x86F1, + 0xB188, 0xB3F0, 0xB189, 0xB3F1, 0xB18A, 0x86F2, 0xB18B, 0xB3F2, + 0xB18C, 0x86F3, 0xB18D, 0xB3F3, 0xB18E, 0x86F4, 0xB18F, 0x86F5, + 0xB190, 0x86F6, 0xB191, 0x86F7, 0xB192, 0xB3F4, 0xB193, 0xB3F5, + 0xB194, 0xB3F6, 0xB195, 0x86F8, 0xB196, 0x86F9, 0xB197, 0x86FA, + 0xB198, 0xB3F7, 0xB199, 0x86FB, 0xB19A, 0x86FC, 0xB19B, 0x86FD, + 0xB19C, 0xB3F8, 0xB19D, 0x86FE, 0xB19E, 0x8741, 0xB19F, 0x8742, + 0xB1A0, 0x8743, 0xB1A1, 0x8744, 0xB1A2, 0x8745, 0xB1A3, 0x8746, + 0xB1A4, 0x8747, 0xB1A5, 0x8748, 0xB1A6, 0x8749, 0xB1A7, 0x874A, + 0xB1A8, 0xB3F9, 0xB1A9, 0x874B, 0xB1AA, 0x874C, 0xB1AB, 0x874D, + 0xB1AC, 0x874E, 0xB1AD, 0x874F, 0xB1AE, 0x8750, 0xB1AF, 0x8751, + 0xB1B0, 0x8752, 0xB1B1, 0x8753, 0xB1B2, 0x8754, 0xB1B3, 0x8755, + 0xB1B4, 0x8756, 0xB1B5, 0x8757, 0xB1B6, 0x8758, 0xB1B7, 0x8759, + 0xB1B8, 0x875A, 0xB1B9, 0x8761, 0xB1BA, 0x8762, 0xB1BB, 0x8763, + 0xB1BC, 0x8764, 0xB1BD, 0x8765, 0xB1BE, 0x8766, 0xB1BF, 0x8767, + 0xB1C0, 0x8768, 0xB1C1, 0x8769, 0xB1C2, 0x876A, 0xB1C3, 0x876B, + 0xB1C4, 0x876C, 0xB1C5, 0x876D, 0xB1C6, 0x876E, 0xB1C7, 0x876F, + 0xB1C8, 0x8770, 0xB1C9, 0x8771, 0xB1CA, 0x8772, 0xB1CB, 0x8773, + 0xB1CC, 0xB3FA, 0xB1CD, 0x8774, 0xB1CE, 0x8775, 0xB1CF, 0x8776, + 0xB1D0, 0xB3FB, 0xB1D1, 0x8777, 0xB1D2, 0x8778, 0xB1D3, 0x8779, + 0xB1D4, 0xB3FC, 0xB1D5, 0x877A, 0xB1D6, 0x8781, 0xB1D7, 0x8782, + 0xB1D8, 0x8783, 0xB1D9, 0x8784, 0xB1DA, 0x8785, 0xB1DB, 0x8786, + 0xB1DC, 0xB3FD, 0xB1DD, 0xB3FE, 0xB1DE, 0x8787, 0xB1DF, 0xB4A1, + 0xB1E0, 0x8788, 0xB1E1, 0x8789, 0xB1E2, 0x878A, 0xB1E3, 0x878B, + 0xB1E4, 0x878C, 0xB1E5, 0x878D, 0xB1E6, 0x878E, 0xB1E7, 0x878F, + 0xB1E8, 0xB4A2, 0xB1E9, 0xB4A3, 0xB1EA, 0x8790, 0xB1EB, 0x8791, + 0xB1EC, 0xB4A4, 0xB1ED, 0x8792, 0xB1EE, 0x8793, 0xB1EF, 0x8794, + 0xB1F0, 0xB4A5, 0xB1F1, 0x8795, 0xB1F2, 0x8796, 0xB1F3, 0x8797, + 0xB1F4, 0x8798, 0xB1F5, 0x8799, 0xB1F6, 0x879A, 0xB1F7, 0x879B, + 0xB1F8, 0x879C, 0xB1F9, 0xB4A6, 0xB1FA, 0x879D, 0xB1FB, 0xB4A7, + 0xB1FC, 0x879E, 0xB1FD, 0xB4A8, 0xB1FE, 0x879F, 0xB1FF, 0x87A0, + 0xB200, 0x87A1, 0xB201, 0x87A2, 0xB202, 0x87A3, 0xB203, 0x87A4, + 0xB204, 0xB4A9, 0xB205, 0xB4AA, 0xB206, 0x87A5, 0xB207, 0x87A6, + 0xB208, 0xB4AB, 0xB209, 0x87A7, 0xB20A, 0x87A8, 0xB20B, 0xB4AC, + 0xB20C, 0xB4AD, 0xB20D, 0x87A9, 0xB20E, 0x87AA, 0xB20F, 0x87AB, + 0xB210, 0x87AC, 0xB211, 0x87AD, 0xB212, 0x87AE, 0xB213, 0x87AF, + 0xB214, 0xB4AE, 0xB215, 0xB4AF, 0xB216, 0x87B0, 0xB217, 0xB4B0, + 0xB218, 0x87B1, 0xB219, 0xB4B1, 0xB21A, 0x87B2, 0xB21B, 0x87B3, + 0xB21C, 0x87B4, 0xB21D, 0x87B5, 0xB21E, 0x87B6, 0xB21F, 0x87B7, + 0xB220, 0xB4B2, 0xB221, 0x87B8, 0xB222, 0x87B9, 0xB223, 0x87BA, + 0xB224, 0x87BB, 0xB225, 0x87BC, 0xB226, 0x87BD, 0xB227, 0x87BE, + 0xB228, 0x87BF, 0xB229, 0x87C0, 0xB22A, 0x87C1, 0xB22B, 0x87C2, + 0xB22C, 0x87C3, 0xB22D, 0x87C4, 0xB22E, 0x87C5, 0xB22F, 0x87C6, + 0xB230, 0x87C7, 0xB231, 0x87C8, 0xB232, 0x87C9, 0xB233, 0x87CA, + 0xB234, 0xB4B3, 0xB235, 0x87CB, 0xB236, 0x87CC, 0xB237, 0x87CD, + 0xB238, 0x87CE, 0xB239, 0x87CF, 0xB23A, 0x87D0, 0xB23B, 0x87D1, + 0xB23C, 0xB4B4, 0xB23D, 0x87D2, 0xB23E, 0x87D3, 0xB23F, 0x87D4, + 0xB240, 0x87D5, 0xB241, 0x87D6, 0xB242, 0x87D7, 0xB243, 0x87D8, + 0xB244, 0x87D9, 0xB245, 0x87DA, 0xB246, 0x87DB, 0xB247, 0x87DC, + 0xB248, 0x87DD, 0xB249, 0x87DE, 0xB24A, 0x87DF, 0xB24B, 0x87E0, + 0xB24C, 0x87E1, 0xB24D, 0x87E2, 0xB24E, 0x87E3, 0xB24F, 0x87E4, + 0xB250, 0x87E5, 0xB251, 0x87E6, 0xB252, 0x87E7, 0xB253, 0x87E8, + 0xB254, 0x87E9, 0xB255, 0x87EA, 0xB256, 0x87EB, 0xB257, 0x87EC, + 0xB258, 0xB4B5, 0xB259, 0x87ED, 0xB25A, 0x87EE, 0xB25B, 0x87EF, + 0xB25C, 0xB4B6, 0xB25D, 0x87F0, 0xB25E, 0x87F1, 0xB25F, 0x87F2, + 0xB260, 0xB4B7, 0xB261, 0x87F3, 0xB262, 0x87F4, 0xB263, 0x87F5, + 0xB264, 0x87F6, 0xB265, 0x87F7, 0xB266, 0x87F8, 0xB267, 0x87F9, + 0xB268, 0xB4B8, 0xB269, 0xB4B9, 0xB26A, 0x87FA, 0xB26B, 0x87FB, + 0xB26C, 0x87FC, 0xB26D, 0x87FD, 0xB26E, 0x87FE, 0xB26F, 0x8841, + 0xB270, 0x8842, 0xB271, 0x8843, 0xB272, 0x8844, 0xB273, 0x8845, + 0xB274, 0xB4BA, 0xB275, 0xB4BB, 0xB276, 0x8846, 0xB277, 0x8847, + 0xB278, 0x8848, 0xB279, 0x8849, 0xB27A, 0x884A, 0xB27B, 0x884B, + 0xB27C, 0xB4BC, 0xB27D, 0x884C, 0xB27E, 0x884D, 0xB27F, 0x884E, + 0xB280, 0x884F, 0xB281, 0x8850, 0xB282, 0x8851, 0xB283, 0x8852, + 0xB284, 0xB4BD, 0xB285, 0xB4BE, 0xB286, 0x8853, 0xB287, 0x8854, + 0xB288, 0x8855, 0xB289, 0xB4BF, 0xB28A, 0x8856, 0xB28B, 0x8857, + 0xB28C, 0x8858, 0xB28D, 0x8859, 0xB28E, 0x885A, 0xB28F, 0x8861, + 0xB290, 0xB4C0, 0xB291, 0xB4C1, 0xB292, 0x8862, 0xB293, 0x8863, + 0xB294, 0xB4C2, 0xB295, 0x8864, 0xB296, 0x8865, 0xB297, 0x8866, + 0xB298, 0xB4C3, 0xB299, 0xB4C4, 0xB29A, 0xB4C5, 0xB29B, 0x8867, + 0xB29C, 0x8868, 0xB29D, 0x8869, 0xB29E, 0x886A, 0xB29F, 0x886B, + 0xB2A0, 0xB4C6, 0xB2A1, 0xB4C7, 0xB2A2, 0x886C, 0xB2A3, 0xB4C8, + 0xB2A4, 0x886D, 0xB2A5, 0xB4C9, 0xB2A6, 0xB4CA, 0xB2A7, 0x886E, + 0xB2A8, 0x886F, 0xB2A9, 0x8870, 0xB2AA, 0xB4CB, 0xB2AB, 0x8871, + 0xB2AC, 0xB4CC, 0xB2AD, 0x8872, 0xB2AE, 0x8873, 0xB2AF, 0x8874, + 0xB2B0, 0xB4CD, 0xB2B1, 0x8875, 0xB2B2, 0x8876, 0xB2B3, 0x8877, + 0xB2B4, 0xB4CE, 0xB2B5, 0x8878, 0xB2B6, 0x8879, 0xB2B7, 0x887A, + 0xB2B8, 0x8881, 0xB2B9, 0x8882, 0xB2BA, 0x8883, 0xB2BB, 0x8884, + 0xB2BC, 0x8885, 0xB2BD, 0x8886, 0xB2BE, 0x8887, 0xB2BF, 0x8888, + 0xB2C0, 0x8889, 0xB2C1, 0x888A, 0xB2C2, 0x888B, 0xB2C3, 0x888C, + 0xB2C4, 0x888D, 0xB2C5, 0x888E, 0xB2C6, 0x888F, 0xB2C7, 0x8890, + 0xB2C8, 0xB4CF, 0xB2C9, 0xB4D0, 0xB2CA, 0x8891, 0xB2CB, 0x8892, + 0xB2CC, 0xB4D1, 0xB2CD, 0x8893, 0xB2CE, 0x8894, 0xB2CF, 0x8895, + 0xB2D0, 0xB4D2, 0xB2D1, 0x8896, 0xB2D2, 0xB4D3, 0xB2D3, 0x8897, + 0xB2D4, 0x8898, 0xB2D5, 0x8899, 0xB2D6, 0x889A, 0xB2D7, 0x889B, + 0xB2D8, 0xB4D4, 0xB2D9, 0xB4D5, 0xB2DA, 0x889C, 0xB2DB, 0xB4D6, + 0xB2DC, 0x889D, 0xB2DD, 0xB4D7, 0xB2DE, 0x889E, 0xB2DF, 0x889F, + 0xB2E0, 0x88A0, 0xB2E1, 0x88A1, 0xB2E2, 0xB4D8, 0xB2E3, 0x88A2, + 0xB2E4, 0xB4D9, 0xB2E5, 0xB4DA, 0xB2E6, 0xB4DB, 0xB2E7, 0x88A3, + 0xB2E8, 0xB4DC, 0xB2E9, 0x88A4, 0xB2EA, 0x88A5, 0xB2EB, 0xB4DD, + 0xB2EC, 0xB4DE, 0xB2ED, 0xB4DF, 0xB2EE, 0xB4E0, 0xB2EF, 0xB4E1, + 0xB2F0, 0x88A6, 0xB2F1, 0x88A7, 0xB2F2, 0x88A8, 0xB2F3, 0xB4E2, + 0xB2F4, 0xB4E3, 0xB2F5, 0xB4E4, 0xB2F6, 0x88A9, 0xB2F7, 0xB4E5, + 0xB2F8, 0xB4E6, 0xB2F9, 0xB4E7, 0xB2FA, 0xB4E8, 0xB2FB, 0xB4E9, + 0xB2FC, 0x88AA, 0xB2FD, 0x88AB, 0xB2FE, 0x88AC, 0xB2FF, 0xB4EA, + 0xB300, 0xB4EB, 0xB301, 0xB4EC, 0xB302, 0x88AD, 0xB303, 0x88AE, + 0xB304, 0xB4ED, 0xB305, 0x88AF, 0xB306, 0x88B0, 0xB307, 0x88B1, + 0xB308, 0xB4EE, 0xB309, 0x88B2, 0xB30A, 0x88B3, 0xB30B, 0x88B4, + 0xB30C, 0x88B5, 0xB30D, 0x88B6, 0xB30E, 0x88B7, 0xB30F, 0x88B8, + 0xB310, 0xB4EF, 0xB311, 0xB4F0, 0xB312, 0x88B9, 0xB313, 0xB4F1, + 0xB314, 0xB4F2, 0xB315, 0xB4F3, 0xB316, 0x88BA, 0xB317, 0x88BB, + 0xB318, 0x88BC, 0xB319, 0x88BD, 0xB31A, 0x88BE, 0xB31B, 0x88BF, + 0xB31C, 0xB4F4, 0xB31D, 0x88C0, 0xB31E, 0x88C1, 0xB31F, 0x88C2, + 0xB320, 0x88C3, 0xB321, 0x88C4, 0xB322, 0x88C5, 0xB323, 0x88C6, + 0xB324, 0x88C7, 0xB325, 0x88C8, 0xB326, 0x88C9, 0xB327, 0x88CA, + 0xB328, 0x88CB, 0xB329, 0x88CC, 0xB32A, 0x88CD, 0xB32B, 0x88CE, + 0xB32C, 0x88CF, 0xB32D, 0x88D0, 0xB32E, 0x88D1, 0xB32F, 0x88D2, + 0xB330, 0x88D3, 0xB331, 0x88D4, 0xB332, 0x88D5, 0xB333, 0x88D6, + 0xB334, 0x88D7, 0xB335, 0x88D8, 0xB336, 0x88D9, 0xB337, 0x88DA, + 0xB338, 0x88DB, 0xB339, 0x88DC, 0xB33A, 0x88DD, 0xB33B, 0x88DE, + 0xB33C, 0x88DF, 0xB33D, 0x88E0, 0xB33E, 0x88E1, 0xB33F, 0x88E2, + 0xB340, 0x88E3, 0xB341, 0x88E4, 0xB342, 0x88E5, 0xB343, 0x88E6, + 0xB344, 0x88E7, 0xB345, 0x88E8, 0xB346, 0x88E9, 0xB347, 0x88EA, + 0xB348, 0x88EB, 0xB349, 0x88EC, 0xB34A, 0x88ED, 0xB34B, 0x88EE, + 0xB34C, 0x88EF, 0xB34D, 0x88F0, 0xB34E, 0x88F1, 0xB34F, 0x88F2, + 0xB350, 0x88F3, 0xB351, 0x88F4, 0xB352, 0x88F5, 0xB353, 0x88F6, + 0xB354, 0xB4F5, 0xB355, 0xB4F6, 0xB356, 0xB4F7, 0xB357, 0x88F7, + 0xB358, 0xB4F8, 0xB359, 0x88F8, 0xB35A, 0x88F9, 0xB35B, 0xB4F9, + 0xB35C, 0xB4FA, 0xB35D, 0x88FA, 0xB35E, 0xB4FB, 0xB35F, 0xB4FC, + 0xB360, 0x88FB, 0xB361, 0x88FC, 0xB362, 0x88FD, 0xB363, 0x88FE, + 0xB364, 0xB4FD, 0xB365, 0xB4FE, 0xB366, 0x8941, 0xB367, 0xB5A1, + 0xB368, 0x8942, 0xB369, 0xB5A2, 0xB36A, 0x8943, 0xB36B, 0xB5A3, + 0xB36C, 0x8944, 0xB36D, 0x8945, 0xB36E, 0xB5A4, 0xB36F, 0x8946, + 0xB370, 0xB5A5, 0xB371, 0xB5A6, 0xB372, 0x8947, 0xB373, 0x8948, + 0xB374, 0xB5A7, 0xB375, 0x8949, 0xB376, 0x894A, 0xB377, 0x894B, + 0xB378, 0xB5A8, 0xB379, 0x894C, 0xB37A, 0x894D, 0xB37B, 0x894E, + 0xB37C, 0x894F, 0xB37D, 0x8950, 0xB37E, 0x8951, 0xB37F, 0x8952, + 0xB380, 0xB5A9, 0xB381, 0xB5AA, 0xB382, 0x8953, 0xB383, 0xB5AB, + 0xB384, 0xB5AC, 0xB385, 0xB5AD, 0xB386, 0x8954, 0xB387, 0x8955, + 0xB388, 0x8956, 0xB389, 0x8957, 0xB38A, 0x8958, 0xB38B, 0x8959, + 0xB38C, 0xB5AE, 0xB38D, 0x895A, 0xB38E, 0x8961, 0xB38F, 0x8962, + 0xB390, 0xB5AF, 0xB391, 0x8963, 0xB392, 0x8964, 0xB393, 0x8965, + 0xB394, 0xB5B0, 0xB395, 0x8966, 0xB396, 0x8967, 0xB397, 0x8968, + 0xB398, 0x8969, 0xB399, 0x896A, 0xB39A, 0x896B, 0xB39B, 0x896C, + 0xB39C, 0x896D, 0xB39D, 0x896E, 0xB39E, 0x896F, 0xB39F, 0x8970, + 0xB3A0, 0xB5B1, 0xB3A1, 0xB5B2, 0xB3A2, 0x8971, 0xB3A3, 0x8972, + 0xB3A4, 0x8973, 0xB3A5, 0x8974, 0xB3A6, 0x8975, 0xB3A7, 0x8976, + 0xB3A8, 0xB5B3, 0xB3A9, 0x8977, 0xB3AA, 0x8978, 0xB3AB, 0x8979, + 0xB3AC, 0xB5B4, 0xB3AD, 0x897A, 0xB3AE, 0x8981, 0xB3AF, 0x8982, + 0xB3B0, 0x8983, 0xB3B1, 0x8984, 0xB3B2, 0x8985, 0xB3B3, 0x8986, + 0xB3B4, 0x8987, 0xB3B5, 0x8988, 0xB3B6, 0x8989, 0xB3B7, 0x898A, + 0xB3B8, 0x898B, 0xB3B9, 0x898C, 0xB3BA, 0x898D, 0xB3BB, 0x898E, + 0xB3BC, 0x898F, 0xB3BD, 0x8990, 0xB3BE, 0x8991, 0xB3BF, 0x8992, + 0xB3C0, 0x8993, 0xB3C1, 0x8994, 0xB3C2, 0x8995, 0xB3C3, 0x8996, + 0xB3C4, 0xB5B5, 0xB3C5, 0xB5B6, 0xB3C6, 0x8997, 0xB3C7, 0x8998, + 0xB3C8, 0xB5B7, 0xB3C9, 0x8999, 0xB3CA, 0x899A, 0xB3CB, 0xB5B8, + 0xB3CC, 0xB5B9, 0xB3CD, 0x899B, 0xB3CE, 0xB5BA, 0xB3CF, 0x899C, + 0xB3D0, 0xB5BB, 0xB3D1, 0x899D, 0xB3D2, 0x899E, 0xB3D3, 0x899F, + 0xB3D4, 0xB5BC, 0xB3D5, 0xB5BD, 0xB3D6, 0x89A0, 0xB3D7, 0xB5BE, + 0xB3D8, 0x89A1, 0xB3D9, 0xB5BF, 0xB3DA, 0x89A2, 0xB3DB, 0xB5C0, + 0xB3DC, 0x89A3, 0xB3DD, 0xB5C1, 0xB3DE, 0x89A4, 0xB3DF, 0x89A5, + 0xB3E0, 0xB5C2, 0xB3E1, 0x89A6, 0xB3E2, 0x89A7, 0xB3E3, 0x89A8, + 0xB3E4, 0xB5C3, 0xB3E5, 0x89A9, 0xB3E6, 0x89AA, 0xB3E7, 0x89AB, + 0xB3E8, 0xB5C4, 0xB3E9, 0x89AC, 0xB3EA, 0x89AD, 0xB3EB, 0x89AE, + 0xB3EC, 0x89AF, 0xB3ED, 0x89B0, 0xB3EE, 0x89B1, 0xB3EF, 0x89B2, + 0xB3F0, 0x89B3, 0xB3F1, 0x89B4, 0xB3F2, 0x89B5, 0xB3F3, 0x89B6, + 0xB3F4, 0x89B7, 0xB3F5, 0x89B8, 0xB3F6, 0x89B9, 0xB3F7, 0x89BA, + 0xB3F8, 0x89BB, 0xB3F9, 0x89BC, 0xB3FA, 0x89BD, 0xB3FB, 0x89BE, + 0xB3FC, 0xB5C5, 0xB3FD, 0x89BF, 0xB3FE, 0x89C0, 0xB3FF, 0x89C1, + 0xB400, 0x89C2, 0xB401, 0x89C3, 0xB402, 0x89C4, 0xB403, 0x89C5, + 0xB404, 0x89C6, 0xB405, 0x89C7, 0xB406, 0x89C8, 0xB407, 0x89C9, + 0xB408, 0x89CA, 0xB409, 0x89CB, 0xB40A, 0x89CC, 0xB40B, 0x89CD, + 0xB40C, 0x89CE, 0xB40D, 0x89CF, 0xB40E, 0x89D0, 0xB40F, 0x89D1, + 0xB410, 0xB5C6, 0xB411, 0x89D2, 0xB412, 0x89D3, 0xB413, 0x89D4, + 0xB414, 0x89D5, 0xB415, 0x89D6, 0xB416, 0x89D7, 0xB417, 0x89D8, + 0xB418, 0xB5C7, 0xB419, 0x89D9, 0xB41A, 0x89DA, 0xB41B, 0x89DB, + 0xB41C, 0xB5C8, 0xB41D, 0x89DC, 0xB41E, 0x89DD, 0xB41F, 0x89DE, + 0xB420, 0xB5C9, 0xB421, 0x89DF, 0xB422, 0x89E0, 0xB423, 0x89E1, + 0xB424, 0x89E2, 0xB425, 0x89E3, 0xB426, 0x89E4, 0xB427, 0x89E5, + 0xB428, 0xB5CA, 0xB429, 0xB5CB, 0xB42A, 0x89E6, 0xB42B, 0xB5CC, + 0xB42C, 0x89E7, 0xB42D, 0x89E8, 0xB42E, 0x89E9, 0xB42F, 0x89EA, + 0xB430, 0x89EB, 0xB431, 0x89EC, 0xB432, 0x89ED, 0xB433, 0x89EE, + 0xB434, 0xB5CD, 0xB435, 0x89EF, 0xB436, 0x89F0, 0xB437, 0x89F1, + 0xB438, 0x89F2, 0xB439, 0x89F3, 0xB43A, 0x89F4, 0xB43B, 0x89F5, + 0xB43C, 0x89F6, 0xB43D, 0x89F7, 0xB43E, 0x89F8, 0xB43F, 0x89F9, + 0xB440, 0x89FA, 0xB441, 0x89FB, 0xB442, 0x89FC, 0xB443, 0x89FD, + 0xB444, 0x89FE, 0xB445, 0x8A41, 0xB446, 0x8A42, 0xB447, 0x8A43, + 0xB448, 0x8A44, 0xB449, 0x8A45, 0xB44A, 0x8A46, 0xB44B, 0x8A47, + 0xB44C, 0x8A48, 0xB44D, 0x8A49, 0xB44E, 0x8A4A, 0xB44F, 0x8A4B, + 0xB450, 0xB5CE, 0xB451, 0xB5CF, 0xB452, 0x8A4C, 0xB453, 0x8A4D, + 0xB454, 0xB5D0, 0xB455, 0x8A4E, 0xB456, 0x8A4F, 0xB457, 0x8A50, + 0xB458, 0xB5D1, 0xB459, 0x8A51, 0xB45A, 0x8A52, 0xB45B, 0x8A53, + 0xB45C, 0x8A54, 0xB45D, 0x8A55, 0xB45E, 0x8A56, 0xB45F, 0x8A57, + 0xB460, 0xB5D2, 0xB461, 0xB5D3, 0xB462, 0x8A58, 0xB463, 0xB5D4, + 0xB464, 0x8A59, 0xB465, 0xB5D5, 0xB466, 0x8A5A, 0xB467, 0x8A61, + 0xB468, 0x8A62, 0xB469, 0x8A63, 0xB46A, 0x8A64, 0xB46B, 0x8A65, + 0xB46C, 0xB5D6, 0xB46D, 0x8A66, 0xB46E, 0x8A67, 0xB46F, 0x8A68, + 0xB470, 0x8A69, 0xB471, 0x8A6A, 0xB472, 0x8A6B, 0xB473, 0x8A6C, + 0xB474, 0x8A6D, 0xB475, 0x8A6E, 0xB476, 0x8A6F, 0xB477, 0x8A70, + 0xB478, 0x8A71, 0xB479, 0x8A72, 0xB47A, 0x8A73, 0xB47B, 0x8A74, + 0xB47C, 0x8A75, 0xB47D, 0x8A76, 0xB47E, 0x8A77, 0xB47F, 0x8A78, + 0xB480, 0xB5D7, 0xB481, 0x8A79, 0xB482, 0x8A7A, 0xB483, 0x8A81, + 0xB484, 0x8A82, 0xB485, 0x8A83, 0xB486, 0x8A84, 0xB487, 0x8A85, + 0xB488, 0xB5D8, 0xB489, 0x8A86, 0xB48A, 0x8A87, 0xB48B, 0x8A88, + 0xB48C, 0x8A89, 0xB48D, 0x8A8A, 0xB48E, 0x8A8B, 0xB48F, 0x8A8C, + 0xB490, 0x8A8D, 0xB491, 0x8A8E, 0xB492, 0x8A8F, 0xB493, 0x8A90, + 0xB494, 0x8A91, 0xB495, 0x8A92, 0xB496, 0x8A93, 0xB497, 0x8A94, + 0xB498, 0x8A95, 0xB499, 0x8A96, 0xB49A, 0x8A97, 0xB49B, 0x8A98, + 0xB49C, 0x8A99, 0xB49D, 0xB5D9, 0xB49E, 0x8A9A, 0xB49F, 0x8A9B, + 0xB4A0, 0x8A9C, 0xB4A1, 0x8A9D, 0xB4A2, 0x8A9E, 0xB4A3, 0x8A9F, + 0xB4A4, 0xB5DA, 0xB4A5, 0x8AA0, 0xB4A6, 0x8AA1, 0xB4A7, 0x8AA2, + 0xB4A8, 0xB5DB, 0xB4A9, 0x8AA3, 0xB4AA, 0x8AA4, 0xB4AB, 0x8AA5, + 0xB4AC, 0xB5DC, 0xB4AD, 0x8AA6, 0xB4AE, 0x8AA7, 0xB4AF, 0x8AA8, + 0xB4B0, 0x8AA9, 0xB4B1, 0x8AAA, 0xB4B2, 0x8AAB, 0xB4B3, 0x8AAC, + 0xB4B4, 0x8AAD, 0xB4B5, 0xB5DD, 0xB4B6, 0x8AAE, 0xB4B7, 0xB5DE, + 0xB4B8, 0x8AAF, 0xB4B9, 0xB5DF, 0xB4BA, 0x8AB0, 0xB4BB, 0x8AB1, + 0xB4BC, 0x8AB2, 0xB4BD, 0x8AB3, 0xB4BE, 0x8AB4, 0xB4BF, 0x8AB5, + 0xB4C0, 0xB5E0, 0xB4C1, 0x8AB6, 0xB4C2, 0x8AB7, 0xB4C3, 0x8AB8, + 0xB4C4, 0xB5E1, 0xB4C5, 0x8AB9, 0xB4C6, 0x8ABA, 0xB4C7, 0x8ABB, + 0xB4C8, 0xB5E2, 0xB4C9, 0x8ABC, 0xB4CA, 0x8ABD, 0xB4CB, 0x8ABE, + 0xB4CC, 0x8ABF, 0xB4CD, 0x8AC0, 0xB4CE, 0x8AC1, 0xB4CF, 0x8AC2, + 0xB4D0, 0xB5E3, 0xB4D1, 0x8AC3, 0xB4D2, 0x8AC4, 0xB4D3, 0x8AC5, + 0xB4D4, 0x8AC6, 0xB4D5, 0xB5E4, 0xB4D6, 0x8AC7, 0xB4D7, 0x8AC8, + 0xB4D8, 0x8AC9, 0xB4D9, 0x8ACA, 0xB4DA, 0x8ACB, 0xB4DB, 0x8ACC, + 0xB4DC, 0xB5E5, 0xB4DD, 0xB5E6, 0xB4DE, 0x8ACD, 0xB4DF, 0x8ACE, + 0xB4E0, 0xB5E7, 0xB4E1, 0x8ACF, 0xB4E2, 0x8AD0, 0xB4E3, 0xB5E8, + 0xB4E4, 0xB5E9, 0xB4E5, 0x8AD1, 0xB4E6, 0xB5EA, 0xB4E7, 0x8AD2, + 0xB4E8, 0x8AD3, 0xB4E9, 0x8AD4, 0xB4EA, 0x8AD5, 0xB4EB, 0x8AD6, + 0xB4EC, 0xB5EB, 0xB4ED, 0xB5EC, 0xB4EE, 0x8AD7, 0xB4EF, 0xB5ED, + 0xB4F0, 0x8AD8, 0xB4F1, 0xB5EE, 0xB4F2, 0x8AD9, 0xB4F3, 0x8ADA, + 0xB4F4, 0x8ADB, 0xB4F5, 0x8ADC, 0xB4F6, 0x8ADD, 0xB4F7, 0x8ADE, + 0xB4F8, 0xB5EF, 0xB4F9, 0x8ADF, 0xB4FA, 0x8AE0, 0xB4FB, 0x8AE1, + 0xB4FC, 0x8AE2, 0xB4FD, 0x8AE3, 0xB4FE, 0x8AE4, 0xB4FF, 0x8AE5, + 0xB500, 0x8AE6, 0xB501, 0x8AE7, 0xB502, 0x8AE8, 0xB503, 0x8AE9, + 0xB504, 0x8AEA, 0xB505, 0x8AEB, 0xB506, 0x8AEC, 0xB507, 0x8AED, + 0xB508, 0x8AEE, 0xB509, 0x8AEF, 0xB50A, 0x8AF0, 0xB50B, 0x8AF1, + 0xB50C, 0x8AF2, 0xB50D, 0x8AF3, 0xB50E, 0x8AF4, 0xB50F, 0x8AF5, + 0xB510, 0x8AF6, 0xB511, 0x8AF7, 0xB512, 0x8AF8, 0xB513, 0x8AF9, + 0xB514, 0xB5F0, 0xB515, 0xB5F1, 0xB516, 0x8AFA, 0xB517, 0x8AFB, + 0xB518, 0xB5F2, 0xB519, 0x8AFC, 0xB51A, 0x8AFD, 0xB51B, 0xB5F3, + 0xB51C, 0xB5F4, 0xB51D, 0x8AFE, 0xB51E, 0x8B41, 0xB51F, 0x8B42, + 0xB520, 0x8B43, 0xB521, 0x8B44, 0xB522, 0x8B45, 0xB523, 0x8B46, + 0xB524, 0xB5F5, 0xB525, 0xB5F6, 0xB526, 0x8B47, 0xB527, 0xB5F7, + 0xB528, 0xB5F8, 0xB529, 0xB5F9, 0xB52A, 0xB5FA, 0xB52B, 0x8B48, + 0xB52C, 0x8B49, 0xB52D, 0x8B4A, 0xB52E, 0x8B4B, 0xB52F, 0x8B4C, + 0xB530, 0xB5FB, 0xB531, 0xB5FC, 0xB532, 0x8B4D, 0xB533, 0x8B4E, + 0xB534, 0xB5FD, 0xB535, 0x8B4F, 0xB536, 0x8B50, 0xB537, 0x8B51, + 0xB538, 0xB5FE, 0xB539, 0x8B52, 0xB53A, 0x8B53, 0xB53B, 0x8B54, + 0xB53C, 0x8B55, 0xB53D, 0x8B56, 0xB53E, 0x8B57, 0xB53F, 0x8B58, + 0xB540, 0xB6A1, 0xB541, 0xB6A2, 0xB542, 0x8B59, 0xB543, 0xB6A3, + 0xB544, 0xB6A4, 0xB545, 0xB6A5, 0xB546, 0x8B5A, 0xB547, 0x8B61, + 0xB548, 0x8B62, 0xB549, 0x8B63, 0xB54A, 0x8B64, 0xB54B, 0xB6A6, + 0xB54C, 0xB6A7, 0xB54D, 0xB6A8, 0xB54E, 0x8B65, 0xB54F, 0x8B66, + 0xB550, 0xB6A9, 0xB551, 0x8B67, 0xB552, 0x8B68, 0xB553, 0x8B69, + 0xB554, 0xB6AA, 0xB555, 0x8B6A, 0xB556, 0x8B6B, 0xB557, 0x8B6C, + 0xB558, 0x8B6D, 0xB559, 0x8B6E, 0xB55A, 0x8B6F, 0xB55B, 0x8B70, + 0xB55C, 0xB6AB, 0xB55D, 0xB6AC, 0xB55E, 0x8B71, 0xB55F, 0xB6AD, + 0xB560, 0xB6AE, 0xB561, 0xB6AF, 0xB562, 0x8B72, 0xB563, 0x8B73, + 0xB564, 0x8B74, 0xB565, 0x8B75, 0xB566, 0x8B76, 0xB567, 0x8B77, + 0xB568, 0x8B78, 0xB569, 0x8B79, 0xB56A, 0x8B7A, 0xB56B, 0x8B81, + 0xB56C, 0x8B82, 0xB56D, 0x8B83, 0xB56E, 0x8B84, 0xB56F, 0x8B85, + 0xB570, 0x8B86, 0xB571, 0x8B87, 0xB572, 0x8B88, 0xB573, 0x8B89, + 0xB574, 0x8B8A, 0xB575, 0x8B8B, 0xB576, 0x8B8C, 0xB577, 0x8B8D, + 0xB578, 0x8B8E, 0xB579, 0x8B8F, 0xB57A, 0x8B90, 0xB57B, 0x8B91, + 0xB57C, 0x8B92, 0xB57D, 0x8B93, 0xB57E, 0x8B94, 0xB57F, 0x8B95, + 0xB580, 0x8B96, 0xB581, 0x8B97, 0xB582, 0x8B98, 0xB583, 0x8B99, + 0xB584, 0x8B9A, 0xB585, 0x8B9B, 0xB586, 0x8B9C, 0xB587, 0x8B9D, + 0xB588, 0x8B9E, 0xB589, 0x8B9F, 0xB58A, 0x8BA0, 0xB58B, 0x8BA1, + 0xB58C, 0x8BA2, 0xB58D, 0x8BA3, 0xB58E, 0x8BA4, 0xB58F, 0x8BA5, + 0xB590, 0x8BA6, 0xB591, 0x8BA7, 0xB592, 0x8BA8, 0xB593, 0x8BA9, + 0xB594, 0x8BAA, 0xB595, 0x8BAB, 0xB596, 0x8BAC, 0xB597, 0x8BAD, + 0xB598, 0x8BAE, 0xB599, 0x8BAF, 0xB59A, 0x8BB0, 0xB59B, 0x8BB1, + 0xB59C, 0x8BB2, 0xB59D, 0x8BB3, 0xB59E, 0x8BB4, 0xB59F, 0x8BB5, + 0xB5A0, 0xB6B0, 0xB5A1, 0xB6B1, 0xB5A2, 0x8BB6, 0xB5A3, 0x8BB7, + 0xB5A4, 0xB6B2, 0xB5A5, 0x8BB8, 0xB5A6, 0x8BB9, 0xB5A7, 0x8BBA, + 0xB5A8, 0xB6B3, 0xB5A9, 0x8BBB, 0xB5AA, 0xB6B4, 0xB5AB, 0xB6B5, + 0xB5AC, 0x8BBC, 0xB5AD, 0x8BBD, 0xB5AE, 0x8BBE, 0xB5AF, 0x8BBF, + 0xB5B0, 0xB6B6, 0xB5B1, 0xB6B7, 0xB5B2, 0x8BC0, 0xB5B3, 0xB6B8, + 0xB5B4, 0xB6B9, 0xB5B5, 0xB6BA, 0xB5B6, 0x8BC1, 0xB5B7, 0x8BC2, + 0xB5B8, 0x8BC3, 0xB5B9, 0x8BC4, 0xB5BA, 0x8BC5, 0xB5BB, 0xB6BB, + 0xB5BC, 0xB6BC, 0xB5BD, 0xB6BD, 0xB5BE, 0x8BC6, 0xB5BF, 0x8BC7, + 0xB5C0, 0xB6BE, 0xB5C1, 0x8BC8, 0xB5C2, 0x8BC9, 0xB5C3, 0x8BCA, + 0xB5C4, 0xB6BF, 0xB5C5, 0x8BCB, 0xB5C6, 0x8BCC, 0xB5C7, 0x8BCD, + 0xB5C8, 0x8BCE, 0xB5C9, 0x8BCF, 0xB5CA, 0x8BD0, 0xB5CB, 0x8BD1, + 0xB5CC, 0xB6C0, 0xB5CD, 0xB6C1, 0xB5CE, 0x8BD2, 0xB5CF, 0xB6C2, + 0xB5D0, 0xB6C3, 0xB5D1, 0xB6C4, 0xB5D2, 0x8BD3, 0xB5D3, 0x8BD4, + 0xB5D4, 0x8BD5, 0xB5D5, 0x8BD6, 0xB5D6, 0x8BD7, 0xB5D7, 0x8BD8, + 0xB5D8, 0xB6C5, 0xB5D9, 0x8BD9, 0xB5DA, 0x8BDA, 0xB5DB, 0x8BDB, + 0xB5DC, 0x8BDC, 0xB5DD, 0x8BDD, 0xB5DE, 0x8BDE, 0xB5DF, 0x8BDF, + 0xB5E0, 0x8BE0, 0xB5E1, 0x8BE1, 0xB5E2, 0x8BE2, 0xB5E3, 0x8BE3, + 0xB5E4, 0x8BE4, 0xB5E5, 0x8BE5, 0xB5E6, 0x8BE6, 0xB5E7, 0x8BE7, + 0xB5E8, 0x8BE8, 0xB5E9, 0x8BE9, 0xB5EA, 0x8BEA, 0xB5EB, 0x8BEB, + 0xB5EC, 0xB6C6, 0xB5ED, 0x8BEC, 0xB5EE, 0x8BED, 0xB5EF, 0x8BEE, + 0xB5F0, 0x8BEF, 0xB5F1, 0x8BF0, 0xB5F2, 0x8BF1, 0xB5F3, 0x8BF2, + 0xB5F4, 0x8BF3, 0xB5F5, 0x8BF4, 0xB5F6, 0x8BF5, 0xB5F7, 0x8BF6, + 0xB5F8, 0x8BF7, 0xB5F9, 0x8BF8, 0xB5FA, 0x8BF9, 0xB5FB, 0x8BFA, + 0xB5FC, 0x8BFB, 0xB5FD, 0x8BFC, 0xB5FE, 0x8BFD, 0xB5FF, 0x8BFE, + 0xB600, 0x8C41, 0xB601, 0x8C42, 0xB602, 0x8C43, 0xB603, 0x8C44, + 0xB604, 0x8C45, 0xB605, 0x8C46, 0xB606, 0x8C47, 0xB607, 0x8C48, + 0xB608, 0x8C49, 0xB609, 0x8C4A, 0xB60A, 0x8C4B, 0xB60B, 0x8C4C, + 0xB60C, 0x8C4D, 0xB60D, 0x8C4E, 0xB60E, 0x8C4F, 0xB60F, 0x8C50, + 0xB610, 0xB6C7, 0xB611, 0xB6C8, 0xB612, 0x8C51, 0xB613, 0x8C52, + 0xB614, 0xB6C9, 0xB615, 0x8C53, 0xB616, 0x8C54, 0xB617, 0x8C55, + 0xB618, 0xB6CA, 0xB619, 0x8C56, 0xB61A, 0x8C57, 0xB61B, 0x8C58, + 0xB61C, 0x8C59, 0xB61D, 0x8C5A, 0xB61E, 0x8C61, 0xB61F, 0x8C62, + 0xB620, 0x8C63, 0xB621, 0x8C64, 0xB622, 0x8C65, 0xB623, 0x8C66, + 0xB624, 0x8C67, 0xB625, 0xB6CB, 0xB626, 0x8C68, 0xB627, 0x8C69, + 0xB628, 0x8C6A, 0xB629, 0x8C6B, 0xB62A, 0x8C6C, 0xB62B, 0x8C6D, + 0xB62C, 0xB6CC, 0xB62D, 0x8C6E, 0xB62E, 0x8C6F, 0xB62F, 0x8C70, + 0xB630, 0x8C71, 0xB631, 0x8C72, 0xB632, 0x8C73, 0xB633, 0x8C74, + 0xB634, 0xB6CD, 0xB635, 0x8C75, 0xB636, 0x8C76, 0xB637, 0x8C77, + 0xB638, 0x8C78, 0xB639, 0x8C79, 0xB63A, 0x8C7A, 0xB63B, 0x8C81, + 0xB63C, 0x8C82, 0xB63D, 0x8C83, 0xB63E, 0x8C84, 0xB63F, 0x8C85, + 0xB640, 0x8C86, 0xB641, 0x8C87, 0xB642, 0x8C88, 0xB643, 0x8C89, + 0xB644, 0x8C8A, 0xB645, 0x8C8B, 0xB646, 0x8C8C, 0xB647, 0x8C8D, + 0xB648, 0xB6CE, 0xB649, 0x8C8E, 0xB64A, 0x8C8F, 0xB64B, 0x8C90, + 0xB64C, 0x8C91, 0xB64D, 0x8C92, 0xB64E, 0x8C93, 0xB64F, 0x8C94, + 0xB650, 0x8C95, 0xB651, 0x8C96, 0xB652, 0x8C97, 0xB653, 0x8C98, + 0xB654, 0x8C99, 0xB655, 0x8C9A, 0xB656, 0x8C9B, 0xB657, 0x8C9C, + 0xB658, 0x8C9D, 0xB659, 0x8C9E, 0xB65A, 0x8C9F, 0xB65B, 0x8CA0, + 0xB65C, 0x8CA1, 0xB65D, 0x8CA2, 0xB65E, 0x8CA3, 0xB65F, 0x8CA4, + 0xB660, 0x8CA5, 0xB661, 0x8CA6, 0xB662, 0x8CA7, 0xB663, 0x8CA8, + 0xB664, 0xB6CF, 0xB665, 0x8CA9, 0xB666, 0x8CAA, 0xB667, 0x8CAB, + 0xB668, 0xB6D0, 0xB669, 0x8CAC, 0xB66A, 0x8CAD, 0xB66B, 0x8CAE, + 0xB66C, 0x8CAF, 0xB66D, 0x8CB0, 0xB66E, 0x8CB1, 0xB66F, 0x8CB2, + 0xB670, 0x8CB3, 0xB671, 0x8CB4, 0xB672, 0x8CB5, 0xB673, 0x8CB6, + 0xB674, 0x8CB7, 0xB675, 0x8CB8, 0xB676, 0x8CB9, 0xB677, 0x8CBA, + 0xB678, 0x8CBB, 0xB679, 0x8CBC, 0xB67A, 0x8CBD, 0xB67B, 0x8CBE, + 0xB67C, 0x8CBF, 0xB67D, 0x8CC0, 0xB67E, 0x8CC1, 0xB67F, 0x8CC2, + 0xB680, 0x8CC3, 0xB681, 0x8CC4, 0xB682, 0x8CC5, 0xB683, 0x8CC6, + 0xB684, 0x8CC7, 0xB685, 0x8CC8, 0xB686, 0x8CC9, 0xB687, 0x8CCA, + 0xB688, 0x8CCB, 0xB689, 0x8CCC, 0xB68A, 0x8CCD, 0xB68B, 0x8CCE, + 0xB68C, 0x8CCF, 0xB68D, 0x8CD0, 0xB68E, 0x8CD1, 0xB68F, 0x8CD2, + 0xB690, 0x8CD3, 0xB691, 0x8CD4, 0xB692, 0x8CD5, 0xB693, 0x8CD6, + 0xB694, 0x8CD7, 0xB695, 0x8CD8, 0xB696, 0x8CD9, 0xB697, 0x8CDA, + 0xB698, 0x8CDB, 0xB699, 0x8CDC, 0xB69A, 0x8CDD, 0xB69B, 0x8CDE, + 0xB69C, 0xB6D1, 0xB69D, 0xB6D2, 0xB69E, 0x8CDF, 0xB69F, 0x8CE0, + 0xB6A0, 0xB6D3, 0xB6A1, 0x8CE1, 0xB6A2, 0x8CE2, 0xB6A3, 0x8CE3, + 0xB6A4, 0xB6D4, 0xB6A5, 0x8CE4, 0xB6A6, 0x8CE5, 0xB6A7, 0x8CE6, + 0xB6A8, 0x8CE7, 0xB6A9, 0x8CE8, 0xB6AA, 0x8CE9, 0xB6AB, 0xB6D5, + 0xB6AC, 0xB6D6, 0xB6AD, 0x8CEA, 0xB6AE, 0x8CEB, 0xB6AF, 0x8CEC, + 0xB6B0, 0x8CED, 0xB6B1, 0xB6D7, 0xB6B2, 0x8CEE, 0xB6B3, 0x8CEF, + 0xB6B4, 0x8CF0, 0xB6B5, 0x8CF1, 0xB6B6, 0x8CF2, 0xB6B7, 0x8CF3, + 0xB6B8, 0x8CF4, 0xB6B9, 0x8CF5, 0xB6BA, 0x8CF6, 0xB6BB, 0x8CF7, + 0xB6BC, 0x8CF8, 0xB6BD, 0x8CF9, 0xB6BE, 0x8CFA, 0xB6BF, 0x8CFB, + 0xB6C0, 0x8CFC, 0xB6C1, 0x8CFD, 0xB6C2, 0x8CFE, 0xB6C3, 0x8D41, + 0xB6C4, 0x8D42, 0xB6C5, 0x8D43, 0xB6C6, 0x8D44, 0xB6C7, 0x8D45, + 0xB6C8, 0x8D46, 0xB6C9, 0x8D47, 0xB6CA, 0x8D48, 0xB6CB, 0x8D49, + 0xB6CC, 0x8D4A, 0xB6CD, 0x8D4B, 0xB6CE, 0x8D4C, 0xB6CF, 0x8D4D, + 0xB6D0, 0x8D4E, 0xB6D1, 0x8D4F, 0xB6D2, 0x8D50, 0xB6D3, 0x8D51, + 0xB6D4, 0xB6D8, 0xB6D5, 0x8D52, 0xB6D6, 0x8D53, 0xB6D7, 0x8D54, + 0xB6D8, 0x8D55, 0xB6D9, 0x8D56, 0xB6DA, 0x8D57, 0xB6DB, 0x8D58, + 0xB6DC, 0x8D59, 0xB6DD, 0x8D5A, 0xB6DE, 0x8D61, 0xB6DF, 0x8D62, + 0xB6E0, 0x8D63, 0xB6E1, 0x8D64, 0xB6E2, 0x8D65, 0xB6E3, 0x8D66, + 0xB6E4, 0x8D67, 0xB6E5, 0x8D68, 0xB6E6, 0x8D69, 0xB6E7, 0x8D6A, + 0xB6E8, 0x8D6B, 0xB6E9, 0x8D6C, 0xB6EA, 0x8D6D, 0xB6EB, 0x8D6E, + 0xB6EC, 0x8D6F, 0xB6ED, 0x8D70, 0xB6EE, 0x8D71, 0xB6EF, 0x8D72, + 0xB6F0, 0xB6D9, 0xB6F1, 0x8D73, 0xB6F2, 0x8D74, 0xB6F3, 0x8D75, + 0xB6F4, 0xB6DA, 0xB6F5, 0x8D76, 0xB6F6, 0x8D77, 0xB6F7, 0x8D78, + 0xB6F8, 0xB6DB, 0xB6F9, 0x8D79, 0xB6FA, 0x8D7A, 0xB6FB, 0x8D81, + 0xB6FC, 0x8D82, 0xB6FD, 0x8D83, 0xB6FE, 0x8D84, 0xB6FF, 0x8D85, + 0xB700, 0xB6DC, 0xB701, 0xB6DD, 0xB702, 0x8D86, 0xB703, 0x8D87, + 0xB704, 0x8D88, 0xB705, 0xB6DE, 0xB706, 0x8D89, 0xB707, 0x8D8A, + 0xB708, 0x8D8B, 0xB709, 0x8D8C, 0xB70A, 0x8D8D, 0xB70B, 0x8D8E, + 0xB70C, 0x8D8F, 0xB70D, 0x8D90, 0xB70E, 0x8D91, 0xB70F, 0x8D92, + 0xB710, 0x8D93, 0xB711, 0x8D94, 0xB712, 0x8D95, 0xB713, 0x8D96, + 0xB714, 0x8D97, 0xB715, 0x8D98, 0xB716, 0x8D99, 0xB717, 0x8D9A, + 0xB718, 0x8D9B, 0xB719, 0x8D9C, 0xB71A, 0x8D9D, 0xB71B, 0x8D9E, + 0xB71C, 0x8D9F, 0xB71D, 0x8DA0, 0xB71E, 0x8DA1, 0xB71F, 0x8DA2, + 0xB720, 0x8DA3, 0xB721, 0x8DA4, 0xB722, 0x8DA5, 0xB723, 0x8DA6, + 0xB724, 0x8DA7, 0xB725, 0x8DA8, 0xB726, 0x8DA9, 0xB727, 0x8DAA, + 0xB728, 0xB6DF, 0xB729, 0xB6E0, 0xB72A, 0x8DAB, 0xB72B, 0x8DAC, + 0xB72C, 0xB6E1, 0xB72D, 0x8DAD, 0xB72E, 0x8DAE, 0xB72F, 0xB6E2, + 0xB730, 0xB6E3, 0xB731, 0x8DAF, 0xB732, 0x8DB0, 0xB733, 0x8DB1, + 0xB734, 0x8DB2, 0xB735, 0x8DB3, 0xB736, 0x8DB4, 0xB737, 0x8DB5, + 0xB738, 0xB6E4, 0xB739, 0xB6E5, 0xB73A, 0x8DB6, 0xB73B, 0xB6E6, + 0xB73C, 0x8DB7, 0xB73D, 0x8DB8, 0xB73E, 0x8DB9, 0xB73F, 0x8DBA, + 0xB740, 0x8DBB, 0xB741, 0x8DBC, 0xB742, 0x8DBD, 0xB743, 0x8DBE, + 0xB744, 0xB6E7, 0xB745, 0x8DBF, 0xB746, 0x8DC0, 0xB747, 0x8DC1, + 0xB748, 0xB6E8, 0xB749, 0x8DC2, 0xB74A, 0x8DC3, 0xB74B, 0x8DC4, + 0xB74C, 0xB6E9, 0xB74D, 0x8DC5, 0xB74E, 0x8DC6, 0xB74F, 0x8DC7, + 0xB750, 0x8DC8, 0xB751, 0x8DC9, 0xB752, 0x8DCA, 0xB753, 0x8DCB, + 0xB754, 0xB6EA, 0xB755, 0xB6EB, 0xB756, 0x8DCC, 0xB757, 0x8DCD, + 0xB758, 0x8DCE, 0xB759, 0x8DCF, 0xB75A, 0x8DD0, 0xB75B, 0x8DD1, + 0xB75C, 0x8DD2, 0xB75D, 0x8DD3, 0xB75E, 0x8DD4, 0xB75F, 0x8DD5, + 0xB760, 0xB6EC, 0xB761, 0x8DD6, 0xB762, 0x8DD7, 0xB763, 0x8DD8, + 0xB764, 0xB6ED, 0xB765, 0x8DD9, 0xB766, 0x8DDA, 0xB767, 0x8DDB, + 0xB768, 0xB6EE, 0xB769, 0x8DDC, 0xB76A, 0x8DDD, 0xB76B, 0x8DDE, + 0xB76C, 0x8DDF, 0xB76D, 0x8DE0, 0xB76E, 0x8DE1, 0xB76F, 0x8DE2, + 0xB770, 0xB6EF, 0xB771, 0xB6F0, 0xB772, 0x8DE3, 0xB773, 0xB6F1, + 0xB774, 0x8DE4, 0xB775, 0xB6F2, 0xB776, 0x8DE5, 0xB777, 0x8DE6, + 0xB778, 0x8DE7, 0xB779, 0x8DE8, 0xB77A, 0x8DE9, 0xB77B, 0x8DEA, + 0xB77C, 0xB6F3, 0xB77D, 0xB6F4, 0xB77E, 0x8DEB, 0xB77F, 0x8DEC, + 0xB780, 0xB6F5, 0xB781, 0x8DED, 0xB782, 0x8DEE, 0xB783, 0x8DEF, + 0xB784, 0xB6F6, 0xB785, 0x8DF0, 0xB786, 0x8DF1, 0xB787, 0x8DF2, + 0xB788, 0x8DF3, 0xB789, 0x8DF4, 0xB78A, 0x8DF5, 0xB78B, 0x8DF6, + 0xB78C, 0xB6F7, 0xB78D, 0xB6F8, 0xB78E, 0x8DF7, 0xB78F, 0xB6F9, + 0xB790, 0xB6FA, 0xB791, 0xB6FB, 0xB792, 0xB6FC, 0xB793, 0x8DF8, + 0xB794, 0x8DF9, 0xB795, 0x8DFA, 0xB796, 0xB6FD, 0xB797, 0xB6FE, + 0xB798, 0xB7A1, 0xB799, 0xB7A2, 0xB79A, 0x8DFB, 0xB79B, 0x8DFC, + 0xB79C, 0xB7A3, 0xB79D, 0x8DFD, 0xB79E, 0x8DFE, 0xB79F, 0x8E41, + 0xB7A0, 0xB7A4, 0xB7A1, 0x8E42, 0xB7A2, 0x8E43, 0xB7A3, 0x8E44, + 0xB7A4, 0x8E45, 0xB7A5, 0x8E46, 0xB7A6, 0x8E47, 0xB7A7, 0x8E48, + 0xB7A8, 0xB7A5, 0xB7A9, 0xB7A6, 0xB7AA, 0x8E49, 0xB7AB, 0xB7A7, + 0xB7AC, 0xB7A8, 0xB7AD, 0xB7A9, 0xB7AE, 0x8E4A, 0xB7AF, 0x8E4B, + 0xB7B0, 0x8E4C, 0xB7B1, 0x8E4D, 0xB7B2, 0x8E4E, 0xB7B3, 0x8E4F, + 0xB7B4, 0xB7AA, 0xB7B5, 0xB7AB, 0xB7B6, 0x8E50, 0xB7B7, 0x8E51, + 0xB7B8, 0xB7AC, 0xB7B9, 0x8E52, 0xB7BA, 0x8E53, 0xB7BB, 0x8E54, + 0xB7BC, 0x8E55, 0xB7BD, 0x8E56, 0xB7BE, 0x8E57, 0xB7BF, 0x8E58, + 0xB7C0, 0x8E59, 0xB7C1, 0x8E5A, 0xB7C2, 0x8E61, 0xB7C3, 0x8E62, + 0xB7C4, 0x8E63, 0xB7C5, 0x8E64, 0xB7C6, 0x8E65, 0xB7C7, 0xB7AD, + 0xB7C8, 0x8E66, 0xB7C9, 0xB7AE, 0xB7CA, 0x8E67, 0xB7CB, 0x8E68, + 0xB7CC, 0x8E69, 0xB7CD, 0x8E6A, 0xB7CE, 0x8E6B, 0xB7CF, 0x8E6C, + 0xB7D0, 0x8E6D, 0xB7D1, 0x8E6E, 0xB7D2, 0x8E6F, 0xB7D3, 0x8E70, + 0xB7D4, 0x8E71, 0xB7D5, 0x8E72, 0xB7D6, 0x8E73, 0xB7D7, 0x8E74, + 0xB7D8, 0x8E75, 0xB7D9, 0x8E76, 0xB7DA, 0x8E77, 0xB7DB, 0x8E78, + 0xB7DC, 0x8E79, 0xB7DD, 0x8E7A, 0xB7DE, 0x8E81, 0xB7DF, 0x8E82, + 0xB7E0, 0x8E83, 0xB7E1, 0x8E84, 0xB7E2, 0x8E85, 0xB7E3, 0x8E86, + 0xB7E4, 0x8E87, 0xB7E5, 0x8E88, 0xB7E6, 0x8E89, 0xB7E7, 0x8E8A, + 0xB7E8, 0x8E8B, 0xB7E9, 0x8E8C, 0xB7EA, 0x8E8D, 0xB7EB, 0x8E8E, + 0xB7EC, 0xB7AF, 0xB7ED, 0xB7B0, 0xB7EE, 0x8E8F, 0xB7EF, 0x8E90, + 0xB7F0, 0xB7B1, 0xB7F1, 0x8E91, 0xB7F2, 0x8E92, 0xB7F3, 0x8E93, + 0xB7F4, 0xB7B2, 0xB7F5, 0x8E94, 0xB7F6, 0x8E95, 0xB7F7, 0x8E96, + 0xB7F8, 0x8E97, 0xB7F9, 0x8E98, 0xB7FA, 0x8E99, 0xB7FB, 0x8E9A, + 0xB7FC, 0xB7B3, 0xB7FD, 0xB7B4, 0xB7FE, 0x8E9B, 0xB7FF, 0xB7B5, + 0xB800, 0xB7B6, 0xB801, 0xB7B7, 0xB802, 0x8E9C, 0xB803, 0x8E9D, + 0xB804, 0x8E9E, 0xB805, 0x8E9F, 0xB806, 0x8EA0, 0xB807, 0xB7B8, + 0xB808, 0xB7B9, 0xB809, 0xB7BA, 0xB80A, 0x8EA1, 0xB80B, 0x8EA2, + 0xB80C, 0xB7BB, 0xB80D, 0x8EA3, 0xB80E, 0x8EA4, 0xB80F, 0x8EA5, + 0xB810, 0xB7BC, 0xB811, 0x8EA6, 0xB812, 0x8EA7, 0xB813, 0x8EA8, + 0xB814, 0x8EA9, 0xB815, 0x8EAA, 0xB816, 0x8EAB, 0xB817, 0x8EAC, + 0xB818, 0xB7BD, 0xB819, 0xB7BE, 0xB81A, 0x8EAD, 0xB81B, 0xB7BF, + 0xB81C, 0x8EAE, 0xB81D, 0xB7C0, 0xB81E, 0x8EAF, 0xB81F, 0x8EB0, + 0xB820, 0x8EB1, 0xB821, 0x8EB2, 0xB822, 0x8EB3, 0xB823, 0x8EB4, + 0xB824, 0xB7C1, 0xB825, 0xB7C2, 0xB826, 0x8EB5, 0xB827, 0x8EB6, + 0xB828, 0xB7C3, 0xB829, 0x8EB7, 0xB82A, 0x8EB8, 0xB82B, 0x8EB9, + 0xB82C, 0xB7C4, 0xB82D, 0x8EBA, 0xB82E, 0x8EBB, 0xB82F, 0x8EBC, + 0xB830, 0x8EBD, 0xB831, 0x8EBE, 0xB832, 0x8EBF, 0xB833, 0x8EC0, + 0xB834, 0xB7C5, 0xB835, 0xB7C6, 0xB836, 0x8EC1, 0xB837, 0xB7C7, + 0xB838, 0xB7C8, 0xB839, 0xB7C9, 0xB83A, 0x8EC2, 0xB83B, 0x8EC3, + 0xB83C, 0x8EC4, 0xB83D, 0x8EC5, 0xB83E, 0x8EC6, 0xB83F, 0x8EC7, + 0xB840, 0xB7CA, 0xB841, 0x8EC8, 0xB842, 0x8EC9, 0xB843, 0x8ECA, + 0xB844, 0xB7CB, 0xB845, 0x8ECB, 0xB846, 0x8ECC, 0xB847, 0x8ECD, + 0xB848, 0x8ECE, 0xB849, 0x8ECF, 0xB84A, 0x8ED0, 0xB84B, 0x8ED1, + 0xB84C, 0x8ED2, 0xB84D, 0x8ED3, 0xB84E, 0x8ED4, 0xB84F, 0x8ED5, + 0xB850, 0x8ED6, 0xB851, 0xB7CC, 0xB852, 0x8ED7, 0xB853, 0xB7CD, + 0xB854, 0x8ED8, 0xB855, 0x8ED9, 0xB856, 0x8EDA, 0xB857, 0x8EDB, + 0xB858, 0x8EDC, 0xB859, 0x8EDD, 0xB85A, 0x8EDE, 0xB85B, 0x8EDF, + 0xB85C, 0xB7CE, 0xB85D, 0xB7CF, 0xB85E, 0x8EE0, 0xB85F, 0x8EE1, + 0xB860, 0xB7D0, 0xB861, 0x8EE2, 0xB862, 0x8EE3, 0xB863, 0x8EE4, + 0xB864, 0xB7D1, 0xB865, 0x8EE5, 0xB866, 0x8EE6, 0xB867, 0x8EE7, + 0xB868, 0x8EE8, 0xB869, 0x8EE9, 0xB86A, 0x8EEA, 0xB86B, 0x8EEB, + 0xB86C, 0xB7D2, 0xB86D, 0xB7D3, 0xB86E, 0x8EEC, 0xB86F, 0xB7D4, + 0xB870, 0x8EED, 0xB871, 0xB7D5, 0xB872, 0x8EEE, 0xB873, 0x8EEF, + 0xB874, 0x8EF0, 0xB875, 0x8EF1, 0xB876, 0x8EF2, 0xB877, 0x8EF3, + 0xB878, 0xB7D6, 0xB879, 0x8EF4, 0xB87A, 0x8EF5, 0xB87B, 0x8EF6, + 0xB87C, 0xB7D7, 0xB87D, 0x8EF7, 0xB87E, 0x8EF8, 0xB87F, 0x8EF9, + 0xB880, 0x8EFA, 0xB881, 0x8EFB, 0xB882, 0x8EFC, 0xB883, 0x8EFD, + 0xB884, 0x8EFE, 0xB885, 0x8F41, 0xB886, 0x8F42, 0xB887, 0x8F43, + 0xB888, 0x8F44, 0xB889, 0x8F45, 0xB88A, 0x8F46, 0xB88B, 0x8F47, + 0xB88C, 0x8F48, 0xB88D, 0xB7D8, 0xB88E, 0x8F49, 0xB88F, 0x8F4A, + 0xB890, 0x8F4B, 0xB891, 0x8F4C, 0xB892, 0x8F4D, 0xB893, 0x8F4E, + 0xB894, 0x8F4F, 0xB895, 0x8F50, 0xB896, 0x8F51, 0xB897, 0x8F52, + 0xB898, 0x8F53, 0xB899, 0x8F54, 0xB89A, 0x8F55, 0xB89B, 0x8F56, + 0xB89C, 0x8F57, 0xB89D, 0x8F58, 0xB89E, 0x8F59, 0xB89F, 0x8F5A, + 0xB8A0, 0x8F61, 0xB8A1, 0x8F62, 0xB8A2, 0x8F63, 0xB8A3, 0x8F64, + 0xB8A4, 0x8F65, 0xB8A5, 0x8F66, 0xB8A6, 0x8F67, 0xB8A7, 0x8F68, + 0xB8A8, 0xB7D9, 0xB8A9, 0x8F69, 0xB8AA, 0x8F6A, 0xB8AB, 0x8F6B, + 0xB8AC, 0x8F6C, 0xB8AD, 0x8F6D, 0xB8AE, 0x8F6E, 0xB8AF, 0x8F6F, + 0xB8B0, 0xB7DA, 0xB8B1, 0x8F70, 0xB8B2, 0x8F71, 0xB8B3, 0x8F72, + 0xB8B4, 0xB7DB, 0xB8B5, 0x8F73, 0xB8B6, 0x8F74, 0xB8B7, 0x8F75, + 0xB8B8, 0xB7DC, 0xB8B9, 0x8F76, 0xB8BA, 0x8F77, 0xB8BB, 0x8F78, + 0xB8BC, 0x8F79, 0xB8BD, 0x8F7A, 0xB8BE, 0x8F81, 0xB8BF, 0x8F82, + 0xB8C0, 0xB7DD, 0xB8C1, 0xB7DE, 0xB8C2, 0x8F83, 0xB8C3, 0xB7DF, + 0xB8C4, 0x8F84, 0xB8C5, 0xB7E0, 0xB8C6, 0x8F85, 0xB8C7, 0x8F86, + 0xB8C8, 0x8F87, 0xB8C9, 0x8F88, 0xB8CA, 0x8F89, 0xB8CB, 0x8F8A, + 0xB8CC, 0xB7E1, 0xB8CD, 0x8F8B, 0xB8CE, 0x8F8C, 0xB8CF, 0x8F8D, + 0xB8D0, 0xB7E2, 0xB8D1, 0x8F8E, 0xB8D2, 0x8F8F, 0xB8D3, 0x8F90, + 0xB8D4, 0xB7E3, 0xB8D5, 0x8F91, 0xB8D6, 0x8F92, 0xB8D7, 0x8F93, + 0xB8D8, 0x8F94, 0xB8D9, 0x8F95, 0xB8DA, 0x8F96, 0xB8DB, 0x8F97, + 0xB8DC, 0x8F98, 0xB8DD, 0xB7E4, 0xB8DE, 0x8F99, 0xB8DF, 0xB7E5, + 0xB8E0, 0x8F9A, 0xB8E1, 0xB7E6, 0xB8E2, 0x8F9B, 0xB8E3, 0x8F9C, + 0xB8E4, 0x8F9D, 0xB8E5, 0x8F9E, 0xB8E6, 0x8F9F, 0xB8E7, 0x8FA0, + 0xB8E8, 0xB7E7, 0xB8E9, 0xB7E8, 0xB8EA, 0x8FA1, 0xB8EB, 0x8FA2, + 0xB8EC, 0xB7E9, 0xB8ED, 0x8FA3, 0xB8EE, 0x8FA4, 0xB8EF, 0x8FA5, + 0xB8F0, 0xB7EA, 0xB8F1, 0x8FA6, 0xB8F2, 0x8FA7, 0xB8F3, 0x8FA8, + 0xB8F4, 0x8FA9, 0xB8F5, 0x8FAA, 0xB8F6, 0x8FAB, 0xB8F7, 0x8FAC, + 0xB8F8, 0xB7EB, 0xB8F9, 0xB7EC, 0xB8FA, 0x8FAD, 0xB8FB, 0xB7ED, + 0xB8FC, 0x8FAE, 0xB8FD, 0xB7EE, 0xB8FE, 0x8FAF, 0xB8FF, 0x8FB0, + 0xB900, 0x8FB1, 0xB901, 0x8FB2, 0xB902, 0x8FB3, 0xB903, 0x8FB4, + 0xB904, 0xB7EF, 0xB905, 0x8FB5, 0xB906, 0x8FB6, 0xB907, 0x8FB7, + 0xB908, 0x8FB8, 0xB909, 0x8FB9, 0xB90A, 0x8FBA, 0xB90B, 0x8FBB, + 0xB90C, 0x8FBC, 0xB90D, 0x8FBD, 0xB90E, 0x8FBE, 0xB90F, 0x8FBF, + 0xB910, 0x8FC0, 0xB911, 0x8FC1, 0xB912, 0x8FC2, 0xB913, 0x8FC3, + 0xB914, 0x8FC4, 0xB915, 0x8FC5, 0xB916, 0x8FC6, 0xB917, 0x8FC7, + 0xB918, 0xB7F0, 0xB919, 0x8FC8, 0xB91A, 0x8FC9, 0xB91B, 0x8FCA, + 0xB91C, 0x8FCB, 0xB91D, 0x8FCC, 0xB91E, 0x8FCD, 0xB91F, 0x8FCE, + 0xB920, 0xB7F1, 0xB921, 0x8FCF, 0xB922, 0x8FD0, 0xB923, 0x8FD1, + 0xB924, 0x8FD2, 0xB925, 0x8FD3, 0xB926, 0x8FD4, 0xB927, 0x8FD5, + 0xB928, 0x8FD6, 0xB929, 0x8FD7, 0xB92A, 0x8FD8, 0xB92B, 0x8FD9, + 0xB92C, 0x8FDA, 0xB92D, 0x8FDB, 0xB92E, 0x8FDC, 0xB92F, 0x8FDD, + 0xB930, 0x8FDE, 0xB931, 0x8FDF, 0xB932, 0x8FE0, 0xB933, 0x8FE1, + 0xB934, 0x8FE2, 0xB935, 0x8FE3, 0xB936, 0x8FE4, 0xB937, 0x8FE5, + 0xB938, 0x8FE6, 0xB939, 0x8FE7, 0xB93A, 0x8FE8, 0xB93B, 0x8FE9, + 0xB93C, 0xB7F2, 0xB93D, 0xB7F3, 0xB93E, 0x8FEA, 0xB93F, 0x8FEB, + 0xB940, 0xB7F4, 0xB941, 0x8FEC, 0xB942, 0x8FED, 0xB943, 0x8FEE, + 0xB944, 0xB7F5, 0xB945, 0x8FEF, 0xB946, 0x8FF0, 0xB947, 0x8FF1, + 0xB948, 0x8FF2, 0xB949, 0x8FF3, 0xB94A, 0x8FF4, 0xB94B, 0x8FF5, + 0xB94C, 0xB7F6, 0xB94D, 0x8FF6, 0xB94E, 0x8FF7, 0xB94F, 0xB7F7, + 0xB950, 0x8FF8, 0xB951, 0xB7F8, 0xB952, 0x8FF9, 0xB953, 0x8FFA, + 0xB954, 0x8FFB, 0xB955, 0x8FFC, 0xB956, 0x8FFD, 0xB957, 0x8FFE, + 0xB958, 0xB7F9, 0xB959, 0xB7FA, 0xB95A, 0x9041, 0xB95B, 0x9042, + 0xB95C, 0xB7FB, 0xB95D, 0x9043, 0xB95E, 0x9044, 0xB95F, 0x9045, + 0xB960, 0xB7FC, 0xB961, 0x9046, 0xB962, 0x9047, 0xB963, 0x9048, + 0xB964, 0x9049, 0xB965, 0x904A, 0xB966, 0x904B, 0xB967, 0x904C, + 0xB968, 0xB7FD, 0xB969, 0xB7FE, 0xB96A, 0x904D, 0xB96B, 0xB8A1, + 0xB96C, 0x904E, 0xB96D, 0xB8A2, 0xB96E, 0x904F, 0xB96F, 0x9050, + 0xB970, 0x9051, 0xB971, 0x9052, 0xB972, 0x9053, 0xB973, 0x9054, + 0xB974, 0xB8A3, 0xB975, 0xB8A4, 0xB976, 0x9055, 0xB977, 0x9056, + 0xB978, 0xB8A5, 0xB979, 0x9057, 0xB97A, 0x9058, 0xB97B, 0x9059, + 0xB97C, 0xB8A6, 0xB97D, 0x905A, 0xB97E, 0x9061, 0xB97F, 0x9062, + 0xB980, 0x9063, 0xB981, 0x9064, 0xB982, 0x9065, 0xB983, 0x9066, + 0xB984, 0xB8A7, 0xB985, 0xB8A8, 0xB986, 0x9067, 0xB987, 0xB8A9, + 0xB988, 0x9068, 0xB989, 0xB8AA, 0xB98A, 0xB8AB, 0xB98B, 0x9069, + 0xB98C, 0x906A, 0xB98D, 0xB8AC, 0xB98E, 0xB8AD, 0xB98F, 0x906B, + 0xB990, 0x906C, 0xB991, 0x906D, 0xB992, 0x906E, 0xB993, 0x906F, + 0xB994, 0x9070, 0xB995, 0x9071, 0xB996, 0x9072, 0xB997, 0x9073, + 0xB998, 0x9074, 0xB999, 0x9075, 0xB99A, 0x9076, 0xB99B, 0x9077, + 0xB99C, 0x9078, 0xB99D, 0x9079, 0xB99E, 0x907A, 0xB99F, 0x9081, + 0xB9A0, 0x9082, 0xB9A1, 0x9083, 0xB9A2, 0x9084, 0xB9A3, 0x9085, + 0xB9A4, 0x9086, 0xB9A5, 0x9087, 0xB9A6, 0x9088, 0xB9A7, 0x9089, + 0xB9A8, 0x908A, 0xB9A9, 0x908B, 0xB9AA, 0x908C, 0xB9AB, 0x908D, + 0xB9AC, 0xB8AE, 0xB9AD, 0xB8AF, 0xB9AE, 0x908E, 0xB9AF, 0x908F, + 0xB9B0, 0xB8B0, 0xB9B1, 0x9090, 0xB9B2, 0x9091, 0xB9B3, 0x9092, + 0xB9B4, 0xB8B1, 0xB9B5, 0x9093, 0xB9B6, 0x9094, 0xB9B7, 0x9095, + 0xB9B8, 0x9096, 0xB9B9, 0x9097, 0xB9BA, 0x9098, 0xB9BB, 0x9099, + 0xB9BC, 0xB8B2, 0xB9BD, 0xB8B3, 0xB9BE, 0x909A, 0xB9BF, 0xB8B4, + 0xB9C0, 0x909B, 0xB9C1, 0xB8B5, 0xB9C2, 0x909C, 0xB9C3, 0x909D, + 0xB9C4, 0x909E, 0xB9C5, 0x909F, 0xB9C6, 0x90A0, 0xB9C7, 0x90A1, + 0xB9C8, 0xB8B6, 0xB9C9, 0xB8B7, 0xB9CA, 0x90A2, 0xB9CB, 0x90A3, + 0xB9CC, 0xB8B8, 0xB9CD, 0x90A4, 0xB9CE, 0xB8B9, 0xB9CF, 0xB8BA, + 0xB9D0, 0xB8BB, 0xB9D1, 0xB8BC, 0xB9D2, 0xB8BD, 0xB9D3, 0x90A5, + 0xB9D4, 0x90A6, 0xB9D5, 0x90A7, 0xB9D6, 0x90A8, 0xB9D7, 0x90A9, + 0xB9D8, 0xB8BE, 0xB9D9, 0xB8BF, 0xB9DA, 0x90AA, 0xB9DB, 0xB8C0, + 0xB9DC, 0x90AB, 0xB9DD, 0xB8C1, 0xB9DE, 0xB8C2, 0xB9DF, 0x90AC, + 0xB9E0, 0x90AD, 0xB9E1, 0xB8C3, 0xB9E2, 0x90AE, 0xB9E3, 0xB8C4, + 0xB9E4, 0xB8C5, 0xB9E5, 0xB8C6, 0xB9E6, 0x90AF, 0xB9E7, 0x90B0, + 0xB9E8, 0xB8C7, 0xB9E9, 0x90B1, 0xB9EA, 0x90B2, 0xB9EB, 0x90B3, + 0xB9EC, 0xB8C8, 0xB9ED, 0x90B4, 0xB9EE, 0x90B5, 0xB9EF, 0x90B6, + 0xB9F0, 0x90B7, 0xB9F1, 0x90B8, 0xB9F2, 0x90B9, 0xB9F3, 0x90BA, + 0xB9F4, 0xB8C9, 0xB9F5, 0xB8CA, 0xB9F6, 0x90BB, 0xB9F7, 0xB8CB, + 0xB9F8, 0xB8CC, 0xB9F9, 0xB8CD, 0xB9FA, 0xB8CE, 0xB9FB, 0x90BC, + 0xB9FC, 0x90BD, 0xB9FD, 0x90BE, 0xB9FE, 0x90BF, 0xB9FF, 0x90C0, + 0xBA00, 0xB8CF, 0xBA01, 0xB8D0, 0xBA02, 0x90C1, 0xBA03, 0x90C2, + 0xBA04, 0x90C3, 0xBA05, 0x90C4, 0xBA06, 0x90C5, 0xBA07, 0x90C6, + 0xBA08, 0xB8D1, 0xBA09, 0x90C7, 0xBA0A, 0x90C8, 0xBA0B, 0x90C9, + 0xBA0C, 0x90CA, 0xBA0D, 0x90CB, 0xBA0E, 0x90CC, 0xBA0F, 0x90CD, + 0xBA10, 0x90CE, 0xBA11, 0x90CF, 0xBA12, 0x90D0, 0xBA13, 0x90D1, + 0xBA14, 0x90D2, 0xBA15, 0xB8D2, 0xBA16, 0x90D3, 0xBA17, 0x90D4, + 0xBA18, 0x90D5, 0xBA19, 0x90D6, 0xBA1A, 0x90D7, 0xBA1B, 0x90D8, + 0xBA1C, 0x90D9, 0xBA1D, 0x90DA, 0xBA1E, 0x90DB, 0xBA1F, 0x90DC, + 0xBA20, 0x90DD, 0xBA21, 0x90DE, 0xBA22, 0x90DF, 0xBA23, 0x90E0, + 0xBA24, 0x90E1, 0xBA25, 0x90E2, 0xBA26, 0x90E3, 0xBA27, 0x90E4, + 0xBA28, 0x90E5, 0xBA29, 0x90E6, 0xBA2A, 0x90E7, 0xBA2B, 0x90E8, + 0xBA2C, 0x90E9, 0xBA2D, 0x90EA, 0xBA2E, 0x90EB, 0xBA2F, 0x90EC, + 0xBA30, 0x90ED, 0xBA31, 0x90EE, 0xBA32, 0x90EF, 0xBA33, 0x90F0, + 0xBA34, 0x90F1, 0xBA35, 0x90F2, 0xBA36, 0x90F3, 0xBA37, 0x90F4, + 0xBA38, 0xB8D3, 0xBA39, 0xB8D4, 0xBA3A, 0x90F5, 0xBA3B, 0x90F6, + 0xBA3C, 0xB8D5, 0xBA3D, 0x90F7, 0xBA3E, 0x90F8, 0xBA3F, 0x90F9, + 0xBA40, 0xB8D6, 0xBA41, 0x90FA, 0xBA42, 0xB8D7, 0xBA43, 0x90FB, + 0xBA44, 0x90FC, 0xBA45, 0x90FD, 0xBA46, 0x90FE, 0xBA47, 0x9141, + 0xBA48, 0xB8D8, 0xBA49, 0xB8D9, 0xBA4A, 0x9142, 0xBA4B, 0xB8DA, + 0xBA4C, 0x9143, 0xBA4D, 0xB8DB, 0xBA4E, 0xB8DC, 0xBA4F, 0x9144, + 0xBA50, 0x9145, 0xBA51, 0x9146, 0xBA52, 0x9147, 0xBA53, 0xB8DD, + 0xBA54, 0xB8DE, 0xBA55, 0xB8DF, 0xBA56, 0x9148, 0xBA57, 0x9149, + 0xBA58, 0xB8E0, 0xBA59, 0x914A, 0xBA5A, 0x914B, 0xBA5B, 0x914C, + 0xBA5C, 0xB8E1, 0xBA5D, 0x914D, 0xBA5E, 0x914E, 0xBA5F, 0x914F, + 0xBA60, 0x9150, 0xBA61, 0x9151, 0xBA62, 0x9152, 0xBA63, 0x9153, + 0xBA64, 0xB8E2, 0xBA65, 0xB8E3, 0xBA66, 0x9154, 0xBA67, 0xB8E4, + 0xBA68, 0xB8E5, 0xBA69, 0xB8E6, 0xBA6A, 0x9155, 0xBA6B, 0x9156, + 0xBA6C, 0x9157, 0xBA6D, 0x9158, 0xBA6E, 0x9159, 0xBA6F, 0x915A, + 0xBA70, 0xB8E7, 0xBA71, 0xB8E8, 0xBA72, 0x9161, 0xBA73, 0x9162, + 0xBA74, 0xB8E9, 0xBA75, 0x9163, 0xBA76, 0x9164, 0xBA77, 0x9165, + 0xBA78, 0xB8EA, 0xBA79, 0x9166, 0xBA7A, 0x9167, 0xBA7B, 0x9168, + 0xBA7C, 0x9169, 0xBA7D, 0x916A, 0xBA7E, 0x916B, 0xBA7F, 0x916C, + 0xBA80, 0x916D, 0xBA81, 0x916E, 0xBA82, 0x916F, 0xBA83, 0xB8EB, + 0xBA84, 0xB8EC, 0xBA85, 0xB8ED, 0xBA86, 0x9170, 0xBA87, 0xB8EE, + 0xBA88, 0x9171, 0xBA89, 0x9172, 0xBA8A, 0x9173, 0xBA8B, 0x9174, + 0xBA8C, 0xB8EF, 0xBA8D, 0x9175, 0xBA8E, 0x9176, 0xBA8F, 0x9177, + 0xBA90, 0x9178, 0xBA91, 0x9179, 0xBA92, 0x917A, 0xBA93, 0x9181, + 0xBA94, 0x9182, 0xBA95, 0x9183, 0xBA96, 0x9184, 0xBA97, 0x9185, + 0xBA98, 0x9186, 0xBA99, 0x9187, 0xBA9A, 0x9188, 0xBA9B, 0x9189, + 0xBA9C, 0x918A, 0xBA9D, 0x918B, 0xBA9E, 0x918C, 0xBA9F, 0x918D, + 0xBAA0, 0x918E, 0xBAA1, 0x918F, 0xBAA2, 0x9190, 0xBAA3, 0x9191, + 0xBAA4, 0x9192, 0xBAA5, 0x9193, 0xBAA6, 0x9194, 0xBAA7, 0x9195, + 0xBAA8, 0xB8F0, 0xBAA9, 0xB8F1, 0xBAAA, 0x9196, 0xBAAB, 0xB8F2, + 0xBAAC, 0xB8F3, 0xBAAD, 0x9197, 0xBAAE, 0x9198, 0xBAAF, 0x9199, + 0xBAB0, 0xB8F4, 0xBAB1, 0x919A, 0xBAB2, 0xB8F5, 0xBAB3, 0x919B, + 0xBAB4, 0x919C, 0xBAB5, 0x919D, 0xBAB6, 0x919E, 0xBAB7, 0x919F, + 0xBAB8, 0xB8F6, 0xBAB9, 0xB8F7, 0xBABA, 0x91A0, 0xBABB, 0xB8F8, + 0xBABC, 0x91A1, 0xBABD, 0xB8F9, 0xBABE, 0x91A2, 0xBABF, 0x91A3, + 0xBAC0, 0x91A4, 0xBAC1, 0x91A5, 0xBAC2, 0x91A6, 0xBAC3, 0x91A7, + 0xBAC4, 0xB8FA, 0xBAC5, 0x91A8, 0xBAC6, 0x91A9, 0xBAC7, 0x91AA, + 0xBAC8, 0xB8FB, 0xBAC9, 0x91AB, 0xBACA, 0x91AC, 0xBACB, 0x91AD, + 0xBACC, 0x91AE, 0xBACD, 0x91AF, 0xBACE, 0x91B0, 0xBACF, 0x91B1, + 0xBAD0, 0x91B2, 0xBAD1, 0x91B3, 0xBAD2, 0x91B4, 0xBAD3, 0x91B5, + 0xBAD4, 0x91B6, 0xBAD5, 0x91B7, 0xBAD6, 0x91B8, 0xBAD7, 0x91B9, + 0xBAD8, 0xB8FC, 0xBAD9, 0xB8FD, 0xBADA, 0x91BA, 0xBADB, 0x91BB, + 0xBADC, 0x91BC, 0xBADD, 0x91BD, 0xBADE, 0x91BE, 0xBADF, 0x91BF, + 0xBAE0, 0x91C0, 0xBAE1, 0x91C1, 0xBAE2, 0x91C2, 0xBAE3, 0x91C3, + 0xBAE4, 0x91C4, 0xBAE5, 0x91C5, 0xBAE6, 0x91C6, 0xBAE7, 0x91C7, + 0xBAE8, 0x91C8, 0xBAE9, 0x91C9, 0xBAEA, 0x91CA, 0xBAEB, 0x91CB, + 0xBAEC, 0x91CC, 0xBAED, 0x91CD, 0xBAEE, 0x91CE, 0xBAEF, 0x91CF, + 0xBAF0, 0x91D0, 0xBAF1, 0x91D1, 0xBAF2, 0x91D2, 0xBAF3, 0x91D3, + 0xBAF4, 0x91D4, 0xBAF5, 0x91D5, 0xBAF6, 0x91D6, 0xBAF7, 0x91D7, + 0xBAF8, 0x91D8, 0xBAF9, 0x91D9, 0xBAFA, 0x91DA, 0xBAFB, 0x91DB, + 0xBAFC, 0xB8FE, 0xBAFD, 0x91DC, 0xBAFE, 0x91DD, 0xBAFF, 0x91DE, + 0xBB00, 0xB9A1, 0xBB01, 0x91DF, 0xBB02, 0x91E0, 0xBB03, 0x91E1, + 0xBB04, 0xB9A2, 0xBB05, 0x91E2, 0xBB06, 0x91E3, 0xBB07, 0x91E4, + 0xBB08, 0x91E5, 0xBB09, 0x91E6, 0xBB0A, 0x91E7, 0xBB0B, 0x91E8, + 0xBB0C, 0x91E9, 0xBB0D, 0xB9A3, 0xBB0E, 0x91EA, 0xBB0F, 0xB9A4, + 0xBB10, 0x91EB, 0xBB11, 0xB9A5, 0xBB12, 0x91EC, 0xBB13, 0x91ED, + 0xBB14, 0x91EE, 0xBB15, 0x91EF, 0xBB16, 0x91F0, 0xBB17, 0x91F1, + 0xBB18, 0xB9A6, 0xBB19, 0x91F2, 0xBB1A, 0x91F3, 0xBB1B, 0x91F4, + 0xBB1C, 0xB9A7, 0xBB1D, 0x91F5, 0xBB1E, 0x91F6, 0xBB1F, 0x91F7, + 0xBB20, 0xB9A8, 0xBB21, 0x91F8, 0xBB22, 0x91F9, 0xBB23, 0x91FA, + 0xBB24, 0x91FB, 0xBB25, 0x91FC, 0xBB26, 0x91FD, 0xBB27, 0x91FE, + 0xBB28, 0x9241, 0xBB29, 0xB9A9, 0xBB2A, 0x9242, 0xBB2B, 0xB9AA, + 0xBB2C, 0x9243, 0xBB2D, 0x9244, 0xBB2E, 0x9245, 0xBB2F, 0x9246, + 0xBB30, 0x9247, 0xBB31, 0x9248, 0xBB32, 0x9249, 0xBB33, 0x924A, + 0xBB34, 0xB9AB, 0xBB35, 0xB9AC, 0xBB36, 0xB9AD, 0xBB37, 0x924B, + 0xBB38, 0xB9AE, 0xBB39, 0x924C, 0xBB3A, 0x924D, 0xBB3B, 0xB9AF, + 0xBB3C, 0xB9B0, 0xBB3D, 0xB9B1, 0xBB3E, 0xB9B2, 0xBB3F, 0x924E, + 0xBB40, 0x924F, 0xBB41, 0x9250, 0xBB42, 0x9251, 0xBB43, 0x9252, + 0xBB44, 0xB9B3, 0xBB45, 0xB9B4, 0xBB46, 0x9253, 0xBB47, 0xB9B5, + 0xBB48, 0x9254, 0xBB49, 0xB9B6, 0xBB4A, 0x9255, 0xBB4B, 0x9256, + 0xBB4C, 0x9257, 0xBB4D, 0xB9B7, 0xBB4E, 0x9258, 0xBB4F, 0xB9B8, + 0xBB50, 0xB9B9, 0xBB51, 0x9259, 0xBB52, 0x925A, 0xBB53, 0x9261, + 0xBB54, 0xB9BA, 0xBB55, 0x9262, 0xBB56, 0x9263, 0xBB57, 0x9264, + 0xBB58, 0xB9BB, 0xBB59, 0x9265, 0xBB5A, 0x9266, 0xBB5B, 0x9267, + 0xBB5C, 0x9268, 0xBB5D, 0x9269, 0xBB5E, 0x926A, 0xBB5F, 0x926B, + 0xBB60, 0x926C, 0xBB61, 0xB9BC, 0xBB62, 0x926D, 0xBB63, 0xB9BD, + 0xBB64, 0x926E, 0xBB65, 0x926F, 0xBB66, 0x9270, 0xBB67, 0x9271, + 0xBB68, 0x9272, 0xBB69, 0x9273, 0xBB6A, 0x9274, 0xBB6B, 0x9275, + 0xBB6C, 0xB9BE, 0xBB6D, 0x9276, 0xBB6E, 0x9277, 0xBB6F, 0x9278, + 0xBB70, 0x9279, 0xBB71, 0x927A, 0xBB72, 0x9281, 0xBB73, 0x9282, + 0xBB74, 0x9283, 0xBB75, 0x9284, 0xBB76, 0x9285, 0xBB77, 0x9286, + 0xBB78, 0x9287, 0xBB79, 0x9288, 0xBB7A, 0x9289, 0xBB7B, 0x928A, + 0xBB7C, 0x928B, 0xBB7D, 0x928C, 0xBB7E, 0x928D, 0xBB7F, 0x928E, + 0xBB80, 0x928F, 0xBB81, 0x9290, 0xBB82, 0x9291, 0xBB83, 0x9292, + 0xBB84, 0x9293, 0xBB85, 0x9294, 0xBB86, 0x9295, 0xBB87, 0x9296, + 0xBB88, 0xB9BF, 0xBB89, 0x9297, 0xBB8A, 0x9298, 0xBB8B, 0x9299, + 0xBB8C, 0xB9C0, 0xBB8D, 0x929A, 0xBB8E, 0x929B, 0xBB8F, 0x929C, + 0xBB90, 0xB9C1, 0xBB91, 0x929D, 0xBB92, 0x929E, 0xBB93, 0x929F, + 0xBB94, 0x92A0, 0xBB95, 0x92A1, 0xBB96, 0x92A2, 0xBB97, 0x92A3, + 0xBB98, 0x92A4, 0xBB99, 0x92A5, 0xBB9A, 0x92A6, 0xBB9B, 0x92A7, + 0xBB9C, 0x92A8, 0xBB9D, 0x92A9, 0xBB9E, 0x92AA, 0xBB9F, 0x92AB, + 0xBBA0, 0x92AC, 0xBBA1, 0x92AD, 0xBBA2, 0x92AE, 0xBBA3, 0x92AF, + 0xBBA4, 0xB9C2, 0xBBA5, 0x92B0, 0xBBA6, 0x92B1, 0xBBA7, 0x92B2, + 0xBBA8, 0xB9C3, 0xBBA9, 0x92B3, 0xBBAA, 0x92B4, 0xBBAB, 0x92B5, + 0xBBAC, 0xB9C4, 0xBBAD, 0x92B6, 0xBBAE, 0x92B7, 0xBBAF, 0x92B8, + 0xBBB0, 0x92B9, 0xBBB1, 0x92BA, 0xBBB2, 0x92BB, 0xBBB3, 0x92BC, + 0xBBB4, 0xB9C5, 0xBBB5, 0x92BD, 0xBBB6, 0x92BE, 0xBBB7, 0xB9C6, + 0xBBB8, 0x92BF, 0xBBB9, 0x92C0, 0xBBBA, 0x92C1, 0xBBBB, 0x92C2, + 0xBBBC, 0x92C3, 0xBBBD, 0x92C4, 0xBBBE, 0x92C5, 0xBBBF, 0x92C6, + 0xBBC0, 0xB9C7, 0xBBC1, 0x92C7, 0xBBC2, 0x92C8, 0xBBC3, 0x92C9, + 0xBBC4, 0xB9C8, 0xBBC5, 0x92CA, 0xBBC6, 0x92CB, 0xBBC7, 0x92CC, + 0xBBC8, 0xB9C9, 0xBBC9, 0x92CD, 0xBBCA, 0x92CE, 0xBBCB, 0x92CF, + 0xBBCC, 0x92D0, 0xBBCD, 0x92D1, 0xBBCE, 0x92D2, 0xBBCF, 0x92D3, + 0xBBD0, 0xB9CA, 0xBBD1, 0x92D4, 0xBBD2, 0x92D5, 0xBBD3, 0xB9CB, + 0xBBD4, 0x92D6, 0xBBD5, 0x92D7, 0xBBD6, 0x92D8, 0xBBD7, 0x92D9, + 0xBBD8, 0x92DA, 0xBBD9, 0x92DB, 0xBBDA, 0x92DC, 0xBBDB, 0x92DD, + 0xBBDC, 0x92DE, 0xBBDD, 0x92DF, 0xBBDE, 0x92E0, 0xBBDF, 0x92E1, + 0xBBE0, 0x92E2, 0xBBE1, 0x92E3, 0xBBE2, 0x92E4, 0xBBE3, 0x92E5, + 0xBBE4, 0x92E6, 0xBBE5, 0x92E7, 0xBBE6, 0x92E8, 0xBBE7, 0x92E9, + 0xBBE8, 0x92EA, 0xBBE9, 0x92EB, 0xBBEA, 0x92EC, 0xBBEB, 0x92ED, + 0xBBEC, 0x92EE, 0xBBED, 0x92EF, 0xBBEE, 0x92F0, 0xBBEF, 0x92F1, + 0xBBF0, 0x92F2, 0xBBF1, 0x92F3, 0xBBF2, 0x92F4, 0xBBF3, 0x92F5, + 0xBBF4, 0x92F6, 0xBBF5, 0x92F7, 0xBBF6, 0x92F8, 0xBBF7, 0x92F9, + 0xBBF8, 0xB9CC, 0xBBF9, 0xB9CD, 0xBBFA, 0x92FA, 0xBBFB, 0x92FB, + 0xBBFC, 0xB9CE, 0xBBFD, 0x92FC, 0xBBFE, 0x92FD, 0xBBFF, 0xB9CF, + 0xBC00, 0xB9D0, 0xBC01, 0x92FE, 0xBC02, 0xB9D1, 0xBC03, 0x9341, + 0xBC04, 0x9342, 0xBC05, 0x9343, 0xBC06, 0x9344, 0xBC07, 0x9345, + 0xBC08, 0xB9D2, 0xBC09, 0xB9D3, 0xBC0A, 0x9346, 0xBC0B, 0xB9D4, + 0xBC0C, 0xB9D5, 0xBC0D, 0xB9D6, 0xBC0E, 0x9347, 0xBC0F, 0xB9D7, + 0xBC10, 0x9348, 0xBC11, 0xB9D8, 0xBC12, 0x9349, 0xBC13, 0x934A, + 0xBC14, 0xB9D9, 0xBC15, 0xB9DA, 0xBC16, 0xB9DB, 0xBC17, 0xB9DC, + 0xBC18, 0xB9DD, 0xBC19, 0x934B, 0xBC1A, 0x934C, 0xBC1B, 0xB9DE, + 0xBC1C, 0xB9DF, 0xBC1D, 0xB9E0, 0xBC1E, 0xB9E1, 0xBC1F, 0xB9E2, + 0xBC20, 0x934D, 0xBC21, 0x934E, 0xBC22, 0x934F, 0xBC23, 0x9350, + 0xBC24, 0xB9E3, 0xBC25, 0xB9E4, 0xBC26, 0x9351, 0xBC27, 0xB9E5, + 0xBC28, 0x9352, 0xBC29, 0xB9E6, 0xBC2A, 0x9353, 0xBC2B, 0x9354, + 0xBC2C, 0x9355, 0xBC2D, 0xB9E7, 0xBC2E, 0x9356, 0xBC2F, 0x9357, + 0xBC30, 0xB9E8, 0xBC31, 0xB9E9, 0xBC32, 0x9358, 0xBC33, 0x9359, + 0xBC34, 0xB9EA, 0xBC35, 0x935A, 0xBC36, 0x9361, 0xBC37, 0x9362, + 0xBC38, 0xB9EB, 0xBC39, 0x9363, 0xBC3A, 0x9364, 0xBC3B, 0x9365, + 0xBC3C, 0x9366, 0xBC3D, 0x9367, 0xBC3E, 0x9368, 0xBC3F, 0x9369, + 0xBC40, 0xB9EC, 0xBC41, 0xB9ED, 0xBC42, 0x936A, 0xBC43, 0xB9EE, + 0xBC44, 0xB9EF, 0xBC45, 0xB9F0, 0xBC46, 0x936B, 0xBC47, 0x936C, + 0xBC48, 0x936D, 0xBC49, 0xB9F1, 0xBC4A, 0x936E, 0xBC4B, 0x936F, + 0xBC4C, 0xB9F2, 0xBC4D, 0xB9F3, 0xBC4E, 0x9370, 0xBC4F, 0x9371, + 0xBC50, 0xB9F4, 0xBC51, 0x9372, 0xBC52, 0x9373, 0xBC53, 0x9374, + 0xBC54, 0x9375, 0xBC55, 0x9376, 0xBC56, 0x9377, 0xBC57, 0x9378, + 0xBC58, 0x9379, 0xBC59, 0x937A, 0xBC5A, 0x9381, 0xBC5B, 0x9382, + 0xBC5C, 0x9383, 0xBC5D, 0xB9F5, 0xBC5E, 0x9384, 0xBC5F, 0x9385, + 0xBC60, 0x9386, 0xBC61, 0x9387, 0xBC62, 0x9388, 0xBC63, 0x9389, + 0xBC64, 0x938A, 0xBC65, 0x938B, 0xBC66, 0x938C, 0xBC67, 0x938D, + 0xBC68, 0x938E, 0xBC69, 0x938F, 0xBC6A, 0x9390, 0xBC6B, 0x9391, + 0xBC6C, 0x9392, 0xBC6D, 0x9393, 0xBC6E, 0x9394, 0xBC6F, 0x9395, + 0xBC70, 0x9396, 0xBC71, 0x9397, 0xBC72, 0x9398, 0xBC73, 0x9399, + 0xBC74, 0x939A, 0xBC75, 0x939B, 0xBC76, 0x939C, 0xBC77, 0x939D, + 0xBC78, 0x939E, 0xBC79, 0x939F, 0xBC7A, 0x93A0, 0xBC7B, 0x93A1, + 0xBC7C, 0x93A2, 0xBC7D, 0x93A3, 0xBC7E, 0x93A4, 0xBC7F, 0x93A5, + 0xBC80, 0x93A6, 0xBC81, 0x93A7, 0xBC82, 0x93A8, 0xBC83, 0x93A9, + 0xBC84, 0xB9F6, 0xBC85, 0xB9F7, 0xBC86, 0x93AA, 0xBC87, 0x93AB, + 0xBC88, 0xB9F8, 0xBC89, 0x93AC, 0xBC8A, 0x93AD, 0xBC8B, 0xB9F9, + 0xBC8C, 0xB9FA, 0xBC8D, 0x93AE, 0xBC8E, 0xB9FB, 0xBC8F, 0x93AF, + 0xBC90, 0x93B0, 0xBC91, 0x93B1, 0xBC92, 0x93B2, 0xBC93, 0x93B3, + 0xBC94, 0xB9FC, 0xBC95, 0xB9FD, 0xBC96, 0x93B4, 0xBC97, 0xB9FE, + 0xBC98, 0x93B5, 0xBC99, 0xBAA1, 0xBC9A, 0xBAA2, 0xBC9B, 0x93B6, + 0xBC9C, 0x93B7, 0xBC9D, 0x93B8, 0xBC9E, 0x93B9, 0xBC9F, 0x93BA, + 0xBCA0, 0xBAA3, 0xBCA1, 0xBAA4, 0xBCA2, 0x93BB, 0xBCA3, 0x93BC, + 0xBCA4, 0xBAA5, 0xBCA5, 0x93BD, 0xBCA6, 0x93BE, 0xBCA7, 0xBAA6, + 0xBCA8, 0xBAA7, 0xBCA9, 0x93BF, 0xBCAA, 0x93C0, 0xBCAB, 0x93C1, + 0xBCAC, 0x93C2, 0xBCAD, 0x93C3, 0xBCAE, 0x93C4, 0xBCAF, 0x93C5, + 0xBCB0, 0xBAA8, 0xBCB1, 0xBAA9, 0xBCB2, 0x93C6, 0xBCB3, 0xBAAA, + 0xBCB4, 0xBAAB, 0xBCB5, 0xBAAC, 0xBCB6, 0x93C7, 0xBCB7, 0x93C8, + 0xBCB8, 0x93C9, 0xBCB9, 0x93CA, 0xBCBA, 0x93CB, 0xBCBB, 0x93CC, + 0xBCBC, 0xBAAD, 0xBCBD, 0xBAAE, 0xBCBE, 0x93CD, 0xBCBF, 0x93CE, + 0xBCC0, 0xBAAF, 0xBCC1, 0x93CF, 0xBCC2, 0x93D0, 0xBCC3, 0x93D1, + 0xBCC4, 0xBAB0, 0xBCC5, 0x93D2, 0xBCC6, 0x93D3, 0xBCC7, 0x93D4, + 0xBCC8, 0x93D5, 0xBCC9, 0x93D6, 0xBCCA, 0x93D7, 0xBCCB, 0x93D8, + 0xBCCC, 0x93D9, 0xBCCD, 0xBAB1, 0xBCCE, 0x93DA, 0xBCCF, 0xBAB2, + 0xBCD0, 0xBAB3, 0xBCD1, 0xBAB4, 0xBCD2, 0x93DB, 0xBCD3, 0x93DC, + 0xBCD4, 0x93DD, 0xBCD5, 0xBAB5, 0xBCD6, 0x93DE, 0xBCD7, 0x93DF, + 0xBCD8, 0xBAB6, 0xBCD9, 0x93E0, 0xBCDA, 0x93E1, 0xBCDB, 0x93E2, + 0xBCDC, 0xBAB7, 0xBCDD, 0x93E3, 0xBCDE, 0x93E4, 0xBCDF, 0x93E5, + 0xBCE0, 0x93E6, 0xBCE1, 0x93E7, 0xBCE2, 0x93E8, 0xBCE3, 0x93E9, + 0xBCE4, 0x93EA, 0xBCE5, 0x93EB, 0xBCE6, 0x93EC, 0xBCE7, 0x93ED, + 0xBCE8, 0x93EE, 0xBCE9, 0x93EF, 0xBCEA, 0x93F0, 0xBCEB, 0x93F1, + 0xBCEC, 0x93F2, 0xBCED, 0x93F3, 0xBCEE, 0x93F4, 0xBCEF, 0x93F5, + 0xBCF0, 0x93F6, 0xBCF1, 0x93F7, 0xBCF2, 0x93F8, 0xBCF3, 0x93F9, + 0xBCF4, 0xBAB8, 0xBCF5, 0xBAB9, 0xBCF6, 0xBABA, 0xBCF7, 0x93FA, + 0xBCF8, 0xBABB, 0xBCF9, 0x93FB, 0xBCFA, 0x93FC, 0xBCFB, 0x93FD, + 0xBCFC, 0xBABC, 0xBCFD, 0x93FE, 0xBCFE, 0x9441, 0xBCFF, 0x9442, + 0xBD00, 0x9443, 0xBD01, 0x9444, 0xBD02, 0x9445, 0xBD03, 0x9446, + 0xBD04, 0xBABD, 0xBD05, 0xBABE, 0xBD06, 0x9447, 0xBD07, 0xBABF, + 0xBD08, 0x9448, 0xBD09, 0xBAC0, 0xBD0A, 0x9449, 0xBD0B, 0x944A, + 0xBD0C, 0x944B, 0xBD0D, 0x944C, 0xBD0E, 0x944D, 0xBD0F, 0x944E, + 0xBD10, 0xBAC1, 0xBD11, 0x944F, 0xBD12, 0x9450, 0xBD13, 0x9451, + 0xBD14, 0xBAC2, 0xBD15, 0x9452, 0xBD16, 0x9453, 0xBD17, 0x9454, + 0xBD18, 0x9455, 0xBD19, 0x9456, 0xBD1A, 0x9457, 0xBD1B, 0x9458, + 0xBD1C, 0x9459, 0xBD1D, 0x945A, 0xBD1E, 0x9461, 0xBD1F, 0x9462, + 0xBD20, 0x9463, 0xBD21, 0x9464, 0xBD22, 0x9465, 0xBD23, 0x9466, + 0xBD24, 0xBAC3, 0xBD25, 0x9467, 0xBD26, 0x9468, 0xBD27, 0x9469, + 0xBD28, 0x946A, 0xBD29, 0x946B, 0xBD2A, 0x946C, 0xBD2B, 0x946D, + 0xBD2C, 0xBAC4, 0xBD2D, 0x946E, 0xBD2E, 0x946F, 0xBD2F, 0x9470, + 0xBD30, 0x9471, 0xBD31, 0x9472, 0xBD32, 0x9473, 0xBD33, 0x9474, + 0xBD34, 0x9475, 0xBD35, 0x9476, 0xBD36, 0x9477, 0xBD37, 0x9478, + 0xBD38, 0x9479, 0xBD39, 0x947A, 0xBD3A, 0x9481, 0xBD3B, 0x9482, + 0xBD3C, 0x9483, 0xBD3D, 0x9484, 0xBD3E, 0x9485, 0xBD3F, 0x9486, + 0xBD40, 0xBAC5, 0xBD41, 0x9487, 0xBD42, 0x9488, 0xBD43, 0x9489, + 0xBD44, 0x948A, 0xBD45, 0x948B, 0xBD46, 0x948C, 0xBD47, 0x948D, + 0xBD48, 0xBAC6, 0xBD49, 0xBAC7, 0xBD4A, 0x948E, 0xBD4B, 0x948F, + 0xBD4C, 0xBAC8, 0xBD4D, 0x9490, 0xBD4E, 0x9491, 0xBD4F, 0x9492, + 0xBD50, 0xBAC9, 0xBD51, 0x9493, 0xBD52, 0x9494, 0xBD53, 0x9495, + 0xBD54, 0x9496, 0xBD55, 0x9497, 0xBD56, 0x9498, 0xBD57, 0x9499, + 0xBD58, 0xBACA, 0xBD59, 0xBACB, 0xBD5A, 0x949A, 0xBD5B, 0x949B, + 0xBD5C, 0x949C, 0xBD5D, 0x949D, 0xBD5E, 0x949E, 0xBD5F, 0x949F, + 0xBD60, 0x94A0, 0xBD61, 0x94A1, 0xBD62, 0x94A2, 0xBD63, 0x94A3, + 0xBD64, 0xBACC, 0xBD65, 0x94A4, 0xBD66, 0x94A5, 0xBD67, 0x94A6, + 0xBD68, 0xBACD, 0xBD69, 0x94A7, 0xBD6A, 0x94A8, 0xBD6B, 0x94A9, + 0xBD6C, 0x94AA, 0xBD6D, 0x94AB, 0xBD6E, 0x94AC, 0xBD6F, 0x94AD, + 0xBD70, 0x94AE, 0xBD71, 0x94AF, 0xBD72, 0x94B0, 0xBD73, 0x94B1, + 0xBD74, 0x94B2, 0xBD75, 0x94B3, 0xBD76, 0x94B4, 0xBD77, 0x94B5, + 0xBD78, 0x94B6, 0xBD79, 0x94B7, 0xBD7A, 0x94B8, 0xBD7B, 0x94B9, + 0xBD7C, 0x94BA, 0xBD7D, 0x94BB, 0xBD7E, 0x94BC, 0xBD7F, 0x94BD, + 0xBD80, 0xBACE, 0xBD81, 0xBACF, 0xBD82, 0x94BE, 0xBD83, 0x94BF, + 0xBD84, 0xBAD0, 0xBD85, 0x94C0, 0xBD86, 0x94C1, 0xBD87, 0xBAD1, + 0xBD88, 0xBAD2, 0xBD89, 0xBAD3, 0xBD8A, 0xBAD4, 0xBD8B, 0x94C2, + 0xBD8C, 0x94C3, 0xBD8D, 0x94C4, 0xBD8E, 0x94C5, 0xBD8F, 0x94C6, + 0xBD90, 0xBAD5, 0xBD91, 0xBAD6, 0xBD92, 0x94C7, 0xBD93, 0xBAD7, + 0xBD94, 0x94C8, 0xBD95, 0xBAD8, 0xBD96, 0x94C9, 0xBD97, 0x94CA, + 0xBD98, 0x94CB, 0xBD99, 0xBAD9, 0xBD9A, 0xBADA, 0xBD9B, 0x94CC, + 0xBD9C, 0xBADB, 0xBD9D, 0x94CD, 0xBD9E, 0x94CE, 0xBD9F, 0x94CF, + 0xBDA0, 0x94D0, 0xBDA1, 0x94D1, 0xBDA2, 0x94D2, 0xBDA3, 0x94D3, + 0xBDA4, 0xBADC, 0xBDA5, 0x94D4, 0xBDA6, 0x94D5, 0xBDA7, 0x94D6, + 0xBDA8, 0x94D7, 0xBDA9, 0x94D8, 0xBDAA, 0x94D9, 0xBDAB, 0x94DA, + 0xBDAC, 0x94DB, 0xBDAD, 0x94DC, 0xBDAE, 0x94DD, 0xBDAF, 0x94DE, + 0xBDB0, 0xBADD, 0xBDB1, 0x94DF, 0xBDB2, 0x94E0, 0xBDB3, 0x94E1, + 0xBDB4, 0x94E2, 0xBDB5, 0x94E3, 0xBDB6, 0x94E4, 0xBDB7, 0x94E5, + 0xBDB8, 0xBADE, 0xBDB9, 0x94E6, 0xBDBA, 0x94E7, 0xBDBB, 0x94E8, + 0xBDBC, 0x94E9, 0xBDBD, 0x94EA, 0xBDBE, 0x94EB, 0xBDBF, 0x94EC, + 0xBDC0, 0x94ED, 0xBDC1, 0x94EE, 0xBDC2, 0x94EF, 0xBDC3, 0x94F0, + 0xBDC4, 0x94F1, 0xBDC5, 0x94F2, 0xBDC6, 0x94F3, 0xBDC7, 0x94F4, + 0xBDC8, 0x94F5, 0xBDC9, 0x94F6, 0xBDCA, 0x94F7, 0xBDCB, 0x94F8, + 0xBDCC, 0x94F9, 0xBDCD, 0x94FA, 0xBDCE, 0x94FB, 0xBDCF, 0x94FC, + 0xBDD0, 0x94FD, 0xBDD1, 0x94FE, 0xBDD2, 0x9541, 0xBDD3, 0x9542, + 0xBDD4, 0xBADF, 0xBDD5, 0xBAE0, 0xBDD6, 0x9543, 0xBDD7, 0x9544, + 0xBDD8, 0xBAE1, 0xBDD9, 0x9545, 0xBDDA, 0x9546, 0xBDDB, 0x9547, + 0xBDDC, 0xBAE2, 0xBDDD, 0x9548, 0xBDDE, 0x9549, 0xBDDF, 0x954A, + 0xBDE0, 0x954B, 0xBDE1, 0x954C, 0xBDE2, 0x954D, 0xBDE3, 0x954E, + 0xBDE4, 0x954F, 0xBDE5, 0x9550, 0xBDE6, 0x9551, 0xBDE7, 0x9552, + 0xBDE8, 0x9553, 0xBDE9, 0xBAE3, 0xBDEA, 0x9554, 0xBDEB, 0x9555, + 0xBDEC, 0x9556, 0xBDED, 0x9557, 0xBDEE, 0x9558, 0xBDEF, 0x9559, + 0xBDF0, 0xBAE4, 0xBDF1, 0x955A, 0xBDF2, 0x9561, 0xBDF3, 0x9562, + 0xBDF4, 0xBAE5, 0xBDF5, 0x9563, 0xBDF6, 0x9564, 0xBDF7, 0x9565, + 0xBDF8, 0xBAE6, 0xBDF9, 0x9566, 0xBDFA, 0x9567, 0xBDFB, 0x9568, + 0xBDFC, 0x9569, 0xBDFD, 0x956A, 0xBDFE, 0x956B, 0xBDFF, 0x956C, + 0xBE00, 0xBAE7, 0xBE01, 0x956D, 0xBE02, 0x956E, 0xBE03, 0xBAE8, + 0xBE04, 0x956F, 0xBE05, 0xBAE9, 0xBE06, 0x9570, 0xBE07, 0x9571, + 0xBE08, 0x9572, 0xBE09, 0x9573, 0xBE0A, 0x9574, 0xBE0B, 0x9575, + 0xBE0C, 0xBAEA, 0xBE0D, 0xBAEB, 0xBE0E, 0x9576, 0xBE0F, 0x9577, + 0xBE10, 0xBAEC, 0xBE11, 0x9578, 0xBE12, 0x9579, 0xBE13, 0x957A, + 0xBE14, 0xBAED, 0xBE15, 0x9581, 0xBE16, 0x9582, 0xBE17, 0x9583, + 0xBE18, 0x9584, 0xBE19, 0x9585, 0xBE1A, 0x9586, 0xBE1B, 0x9587, + 0xBE1C, 0xBAEE, 0xBE1D, 0xBAEF, 0xBE1E, 0x9588, 0xBE1F, 0xBAF0, + 0xBE20, 0x9589, 0xBE21, 0x958A, 0xBE22, 0x958B, 0xBE23, 0x958C, + 0xBE24, 0x958D, 0xBE25, 0x958E, 0xBE26, 0x958F, 0xBE27, 0x9590, + 0xBE28, 0x9591, 0xBE29, 0x9592, 0xBE2A, 0x9593, 0xBE2B, 0x9594, + 0xBE2C, 0x9595, 0xBE2D, 0x9596, 0xBE2E, 0x9597, 0xBE2F, 0x9598, + 0xBE30, 0x9599, 0xBE31, 0x959A, 0xBE32, 0x959B, 0xBE33, 0x959C, + 0xBE34, 0x959D, 0xBE35, 0x959E, 0xBE36, 0x959F, 0xBE37, 0x95A0, + 0xBE38, 0x95A1, 0xBE39, 0x95A2, 0xBE3A, 0x95A3, 0xBE3B, 0x95A4, + 0xBE3C, 0x95A5, 0xBE3D, 0x95A6, 0xBE3E, 0x95A7, 0xBE3F, 0x95A8, + 0xBE40, 0x95A9, 0xBE41, 0x95AA, 0xBE42, 0x95AB, 0xBE43, 0x95AC, + 0xBE44, 0xBAF1, 0xBE45, 0xBAF2, 0xBE46, 0x95AD, 0xBE47, 0x95AE, + 0xBE48, 0xBAF3, 0xBE49, 0x95AF, 0xBE4A, 0x95B0, 0xBE4B, 0x95B1, + 0xBE4C, 0xBAF4, 0xBE4D, 0x95B2, 0xBE4E, 0xBAF5, 0xBE4F, 0x95B3, + 0xBE50, 0x95B4, 0xBE51, 0x95B5, 0xBE52, 0x95B6, 0xBE53, 0x95B7, + 0xBE54, 0xBAF6, 0xBE55, 0xBAF7, 0xBE56, 0x95B8, 0xBE57, 0xBAF8, + 0xBE58, 0x95B9, 0xBE59, 0xBAF9, 0xBE5A, 0xBAFA, 0xBE5B, 0xBAFB, + 0xBE5C, 0x95BA, 0xBE5D, 0x95BB, 0xBE5E, 0x95BC, 0xBE5F, 0x95BD, + 0xBE60, 0xBAFC, 0xBE61, 0xBAFD, 0xBE62, 0x95BE, 0xBE63, 0x95BF, + 0xBE64, 0xBAFE, 0xBE65, 0x95C0, 0xBE66, 0x95C1, 0xBE67, 0x95C2, + 0xBE68, 0xBBA1, 0xBE69, 0x95C3, 0xBE6A, 0xBBA2, 0xBE6B, 0x95C4, + 0xBE6C, 0x95C5, 0xBE6D, 0x95C6, 0xBE6E, 0x95C7, 0xBE6F, 0x95C8, + 0xBE70, 0xBBA3, 0xBE71, 0xBBA4, 0xBE72, 0x95C9, 0xBE73, 0xBBA5, + 0xBE74, 0xBBA6, 0xBE75, 0xBBA7, 0xBE76, 0x95CA, 0xBE77, 0x95CB, + 0xBE78, 0x95CC, 0xBE79, 0x95CD, 0xBE7A, 0x95CE, 0xBE7B, 0xBBA8, + 0xBE7C, 0xBBA9, 0xBE7D, 0xBBAA, 0xBE7E, 0x95CF, 0xBE7F, 0x95D0, + 0xBE80, 0xBBAB, 0xBE81, 0x95D1, 0xBE82, 0x95D2, 0xBE83, 0x95D3, + 0xBE84, 0xBBAC, 0xBE85, 0x95D4, 0xBE86, 0x95D5, 0xBE87, 0x95D6, + 0xBE88, 0x95D7, 0xBE89, 0x95D8, 0xBE8A, 0x95D9, 0xBE8B, 0x95DA, + 0xBE8C, 0xBBAD, 0xBE8D, 0xBBAE, 0xBE8E, 0x95DB, 0xBE8F, 0xBBAF, + 0xBE90, 0xBBB0, 0xBE91, 0xBBB1, 0xBE92, 0x95DC, 0xBE93, 0x95DD, + 0xBE94, 0x95DE, 0xBE95, 0x95DF, 0xBE96, 0x95E0, 0xBE97, 0x95E1, + 0xBE98, 0xBBB2, 0xBE99, 0xBBB3, 0xBE9A, 0x95E2, 0xBE9B, 0x95E3, + 0xBE9C, 0x95E4, 0xBE9D, 0x95E5, 0xBE9E, 0x95E6, 0xBE9F, 0x95E7, + 0xBEA0, 0x95E8, 0xBEA1, 0x95E9, 0xBEA2, 0x95EA, 0xBEA3, 0x95EB, + 0xBEA4, 0x95EC, 0xBEA5, 0x95ED, 0xBEA6, 0x95EE, 0xBEA7, 0x95EF, + 0xBEA8, 0xBBB4, 0xBEA9, 0x95F0, 0xBEAA, 0x95F1, 0xBEAB, 0x95F2, + 0xBEAC, 0x95F3, 0xBEAD, 0x95F4, 0xBEAE, 0x95F5, 0xBEAF, 0x95F6, + 0xBEB0, 0x95F7, 0xBEB1, 0x95F8, 0xBEB2, 0x95F9, 0xBEB3, 0x95FA, + 0xBEB4, 0x95FB, 0xBEB5, 0x95FC, 0xBEB6, 0x95FD, 0xBEB7, 0x95FE, + 0xBEB8, 0x9641, 0xBEB9, 0x9642, 0xBEBA, 0x9643, 0xBEBB, 0x9644, + 0xBEBC, 0x9645, 0xBEBD, 0x9646, 0xBEBE, 0x9647, 0xBEBF, 0x9648, + 0xBEC0, 0x9649, 0xBEC1, 0x964A, 0xBEC2, 0x964B, 0xBEC3, 0x964C, + 0xBEC4, 0x964D, 0xBEC5, 0x964E, 0xBEC6, 0x964F, 0xBEC7, 0x9650, + 0xBEC8, 0x9651, 0xBEC9, 0x9652, 0xBECA, 0x9653, 0xBECB, 0x9654, + 0xBECC, 0x9655, 0xBECD, 0x9656, 0xBECE, 0x9657, 0xBECF, 0x9658, + 0xBED0, 0xBBB5, 0xBED1, 0xBBB6, 0xBED2, 0x9659, 0xBED3, 0x965A, + 0xBED4, 0xBBB7, 0xBED5, 0x9661, 0xBED6, 0x9662, 0xBED7, 0xBBB8, + 0xBED8, 0xBBB9, 0xBED9, 0x9663, 0xBEDA, 0x9664, 0xBEDB, 0x9665, + 0xBEDC, 0x9666, 0xBEDD, 0x9667, 0xBEDE, 0x9668, 0xBEDF, 0x9669, + 0xBEE0, 0xBBBA, 0xBEE1, 0x966A, 0xBEE2, 0x966B, 0xBEE3, 0xBBBB, + 0xBEE4, 0xBBBC, 0xBEE5, 0xBBBD, 0xBEE6, 0x966C, 0xBEE7, 0x966D, + 0xBEE8, 0x966E, 0xBEE9, 0x966F, 0xBEEA, 0x9670, 0xBEEB, 0x9671, + 0xBEEC, 0xBBBE, 0xBEED, 0x9672, 0xBEEE, 0x9673, 0xBEEF, 0x9674, + 0xBEF0, 0x9675, 0xBEF1, 0x9676, 0xBEF2, 0x9677, 0xBEF3, 0x9678, + 0xBEF4, 0x9679, 0xBEF5, 0x967A, 0xBEF6, 0x9681, 0xBEF7, 0x9682, + 0xBEF8, 0x9683, 0xBEF9, 0x9684, 0xBEFA, 0x9685, 0xBEFB, 0x9686, + 0xBEFC, 0x9687, 0xBEFD, 0x9688, 0xBEFE, 0x9689, 0xBEFF, 0x968A, + 0xBF00, 0x968B, 0xBF01, 0xBBBF, 0xBF02, 0x968C, 0xBF03, 0x968D, + 0xBF04, 0x968E, 0xBF05, 0x968F, 0xBF06, 0x9690, 0xBF07, 0x9691, + 0xBF08, 0xBBC0, 0xBF09, 0xBBC1, 0xBF0A, 0x9692, 0xBF0B, 0x9693, + 0xBF0C, 0x9694, 0xBF0D, 0x9695, 0xBF0E, 0x9696, 0xBF0F, 0x9697, + 0xBF10, 0x9698, 0xBF11, 0x9699, 0xBF12, 0x969A, 0xBF13, 0x969B, + 0xBF14, 0x969C, 0xBF15, 0x969D, 0xBF16, 0x969E, 0xBF17, 0x969F, + 0xBF18, 0xBBC2, 0xBF19, 0xBBC3, 0xBF1A, 0x96A0, 0xBF1B, 0xBBC4, + 0xBF1C, 0xBBC5, 0xBF1D, 0xBBC6, 0xBF1E, 0x96A1, 0xBF1F, 0x96A2, + 0xBF20, 0x96A3, 0xBF21, 0x96A4, 0xBF22, 0x96A5, 0xBF23, 0x96A6, + 0xBF24, 0x96A7, 0xBF25, 0x96A8, 0xBF26, 0x96A9, 0xBF27, 0x96AA, + 0xBF28, 0x96AB, 0xBF29, 0x96AC, 0xBF2A, 0x96AD, 0xBF2B, 0x96AE, + 0xBF2C, 0x96AF, 0xBF2D, 0x96B0, 0xBF2E, 0x96B1, 0xBF2F, 0x96B2, + 0xBF30, 0x96B3, 0xBF31, 0x96B4, 0xBF32, 0x96B5, 0xBF33, 0x96B6, + 0xBF34, 0x96B7, 0xBF35, 0x96B8, 0xBF36, 0x96B9, 0xBF37, 0x96BA, + 0xBF38, 0x96BB, 0xBF39, 0x96BC, 0xBF3A, 0x96BD, 0xBF3B, 0x96BE, + 0xBF3C, 0x96BF, 0xBF3D, 0x96C0, 0xBF3E, 0x96C1, 0xBF3F, 0x96C2, + 0xBF40, 0xBBC7, 0xBF41, 0xBBC8, 0xBF42, 0x96C3, 0xBF43, 0x96C4, + 0xBF44, 0xBBC9, 0xBF45, 0x96C5, 0xBF46, 0x96C6, 0xBF47, 0x96C7, + 0xBF48, 0xBBCA, 0xBF49, 0x96C8, 0xBF4A, 0x96C9, 0xBF4B, 0x96CA, + 0xBF4C, 0x96CB, 0xBF4D, 0x96CC, 0xBF4E, 0x96CD, 0xBF4F, 0x96CE, + 0xBF50, 0xBBCB, 0xBF51, 0xBBCC, 0xBF52, 0x96CF, 0xBF53, 0x96D0, + 0xBF54, 0x96D1, 0xBF55, 0xBBCD, 0xBF56, 0x96D2, 0xBF57, 0x96D3, + 0xBF58, 0x96D4, 0xBF59, 0x96D5, 0xBF5A, 0x96D6, 0xBF5B, 0x96D7, + 0xBF5C, 0x96D8, 0xBF5D, 0x96D9, 0xBF5E, 0x96DA, 0xBF5F, 0x96DB, + 0xBF60, 0x96DC, 0xBF61, 0x96DD, 0xBF62, 0x96DE, 0xBF63, 0x96DF, + 0xBF64, 0x96E0, 0xBF65, 0x96E1, 0xBF66, 0x96E2, 0xBF67, 0x96E3, + 0xBF68, 0x96E4, 0xBF69, 0x96E5, 0xBF6A, 0x96E6, 0xBF6B, 0x96E7, + 0xBF6C, 0x96E8, 0xBF6D, 0x96E9, 0xBF6E, 0x96EA, 0xBF6F, 0x96EB, + 0xBF70, 0x96EC, 0xBF71, 0x96ED, 0xBF72, 0x96EE, 0xBF73, 0x96EF, + 0xBF74, 0x96F0, 0xBF75, 0x96F1, 0xBF76, 0x96F2, 0xBF77, 0x96F3, + 0xBF78, 0x96F4, 0xBF79, 0x96F5, 0xBF7A, 0x96F6, 0xBF7B, 0x96F7, + 0xBF7C, 0x96F8, 0xBF7D, 0x96F9, 0xBF7E, 0x96FA, 0xBF7F, 0x96FB, + 0xBF80, 0x96FC, 0xBF81, 0x96FD, 0xBF82, 0x96FE, 0xBF83, 0x9741, + 0xBF84, 0x9742, 0xBF85, 0x9743, 0xBF86, 0x9744, 0xBF87, 0x9745, + 0xBF88, 0x9746, 0xBF89, 0x9747, 0xBF8A, 0x9748, 0xBF8B, 0x9749, + 0xBF8C, 0x974A, 0xBF8D, 0x974B, 0xBF8E, 0x974C, 0xBF8F, 0x974D, + 0xBF90, 0x974E, 0xBF91, 0x974F, 0xBF92, 0x9750, 0xBF93, 0x9751, + 0xBF94, 0xBBCE, 0xBF95, 0x9752, 0xBF96, 0x9753, 0xBF97, 0x9754, + 0xBF98, 0x9755, 0xBF99, 0x9756, 0xBF9A, 0x9757, 0xBF9B, 0x9758, + 0xBF9C, 0x9759, 0xBF9D, 0x975A, 0xBF9E, 0x9761, 0xBF9F, 0x9762, + 0xBFA0, 0x9763, 0xBFA1, 0x9764, 0xBFA2, 0x9765, 0xBFA3, 0x9766, + 0xBFA4, 0x9767, 0xBFA5, 0x9768, 0xBFA6, 0x9769, 0xBFA7, 0x976A, + 0xBFA8, 0x976B, 0xBFA9, 0x976C, 0xBFAA, 0x976D, 0xBFAB, 0x976E, + 0xBFAC, 0x976F, 0xBFAD, 0x9770, 0xBFAE, 0x9771, 0xBFAF, 0x9772, + 0xBFB0, 0xBBCF, 0xBFB1, 0x9773, 0xBFB2, 0x9774, 0xBFB3, 0x9775, + 0xBFB4, 0x9776, 0xBFB5, 0x9777, 0xBFB6, 0x9778, 0xBFB7, 0x9779, + 0xBFB8, 0x977A, 0xBFB9, 0x9781, 0xBFBA, 0x9782, 0xBFBB, 0x9783, + 0xBFBC, 0x9784, 0xBFBD, 0x9785, 0xBFBE, 0x9786, 0xBFBF, 0x9787, + 0xBFC0, 0x9788, 0xBFC1, 0x9789, 0xBFC2, 0x978A, 0xBFC3, 0x978B, + 0xBFC4, 0x978C, 0xBFC5, 0xBBD0, 0xBFC6, 0x978D, 0xBFC7, 0x978E, + 0xBFC8, 0x978F, 0xBFC9, 0x9790, 0xBFCA, 0x9791, 0xBFCB, 0x9792, + 0xBFCC, 0xBBD1, 0xBFCD, 0xBBD2, 0xBFCE, 0x9793, 0xBFCF, 0x9794, + 0xBFD0, 0xBBD3, 0xBFD1, 0x9795, 0xBFD2, 0x9796, 0xBFD3, 0x9797, + 0xBFD4, 0xBBD4, 0xBFD5, 0x9798, 0xBFD6, 0x9799, 0xBFD7, 0x979A, + 0xBFD8, 0x979B, 0xBFD9, 0x979C, 0xBFDA, 0x979D, 0xBFDB, 0x979E, + 0xBFDC, 0xBBD5, 0xBFDD, 0x979F, 0xBFDE, 0x97A0, 0xBFDF, 0xBBD6, + 0xBFE0, 0x97A1, 0xBFE1, 0xBBD7, 0xBFE2, 0x97A2, 0xBFE3, 0x97A3, + 0xBFE4, 0x97A4, 0xBFE5, 0x97A5, 0xBFE6, 0x97A6, 0xBFE7, 0x97A7, + 0xBFE8, 0x97A8, 0xBFE9, 0x97A9, 0xBFEA, 0x97AA, 0xBFEB, 0x97AB, + 0xBFEC, 0x97AC, 0xBFED, 0x97AD, 0xBFEE, 0x97AE, 0xBFEF, 0x97AF, + 0xBFF0, 0x97B0, 0xBFF1, 0x97B1, 0xBFF2, 0x97B2, 0xBFF3, 0x97B3, + 0xBFF4, 0x97B4, 0xBFF5, 0x97B5, 0xBFF6, 0x97B6, 0xBFF7, 0x97B7, + 0xBFF8, 0x97B8, 0xBFF9, 0x97B9, 0xBFFA, 0x97BA, 0xBFFB, 0x97BB, + 0xBFFC, 0x97BC, 0xBFFD, 0x97BD, 0xBFFE, 0x97BE, 0xBFFF, 0x97BF, + 0xC000, 0x97C0, 0xC001, 0x97C1, 0xC002, 0x97C2, 0xC003, 0x97C3, + 0xC004, 0x97C4, 0xC005, 0x97C5, 0xC006, 0x97C6, 0xC007, 0x97C7, + 0xC008, 0x97C8, 0xC009, 0x97C9, 0xC00A, 0x97CA, 0xC00B, 0x97CB, + 0xC00C, 0x97CC, 0xC00D, 0x97CD, 0xC00E, 0x97CE, 0xC00F, 0x97CF, + 0xC010, 0x97D0, 0xC011, 0x97D1, 0xC012, 0x97D2, 0xC013, 0x97D3, + 0xC014, 0x97D4, 0xC015, 0x97D5, 0xC016, 0x97D6, 0xC017, 0x97D7, + 0xC018, 0x97D8, 0xC019, 0x97D9, 0xC01A, 0x97DA, 0xC01B, 0x97DB, + 0xC01C, 0x97DC, 0xC01D, 0x97DD, 0xC01E, 0x97DE, 0xC01F, 0x97DF, + 0xC020, 0x97E0, 0xC021, 0x97E1, 0xC022, 0x97E2, 0xC023, 0x97E3, + 0xC024, 0x97E4, 0xC025, 0x97E5, 0xC026, 0x97E6, 0xC027, 0x97E7, + 0xC028, 0x97E8, 0xC029, 0x97E9, 0xC02A, 0x97EA, 0xC02B, 0x97EB, + 0xC02C, 0x97EC, 0xC02D, 0x97ED, 0xC02E, 0x97EE, 0xC02F, 0x97EF, + 0xC030, 0x97F0, 0xC031, 0x97F1, 0xC032, 0x97F2, 0xC033, 0x97F3, + 0xC034, 0x97F4, 0xC035, 0x97F5, 0xC036, 0x97F6, 0xC037, 0x97F7, + 0xC038, 0x97F8, 0xC039, 0x97F9, 0xC03A, 0x97FA, 0xC03B, 0x97FB, + 0xC03C, 0xBBD8, 0xC03D, 0x97FC, 0xC03E, 0x97FD, 0xC03F, 0x97FE, + 0xC040, 0x9841, 0xC041, 0x9842, 0xC042, 0x9843, 0xC043, 0x9844, + 0xC044, 0x9845, 0xC045, 0x9846, 0xC046, 0x9847, 0xC047, 0x9848, + 0xC048, 0x9849, 0xC049, 0x984A, 0xC04A, 0x984B, 0xC04B, 0x984C, + 0xC04C, 0x984D, 0xC04D, 0x984E, 0xC04E, 0x984F, 0xC04F, 0x9850, + 0xC050, 0x9851, 0xC051, 0xBBD9, 0xC052, 0x9852, 0xC053, 0x9853, + 0xC054, 0x9854, 0xC055, 0x9855, 0xC056, 0x9856, 0xC057, 0x9857, + 0xC058, 0xBBDA, 0xC059, 0x9858, 0xC05A, 0x9859, 0xC05B, 0x985A, + 0xC05C, 0xBBDB, 0xC05D, 0x9861, 0xC05E, 0x9862, 0xC05F, 0x9863, + 0xC060, 0xBBDC, 0xC061, 0x9864, 0xC062, 0x9865, 0xC063, 0x9866, + 0xC064, 0x9867, 0xC065, 0x9868, 0xC066, 0x9869, 0xC067, 0x986A, + 0xC068, 0xBBDD, 0xC069, 0xBBDE, 0xC06A, 0x986B, 0xC06B, 0x986C, + 0xC06C, 0x986D, 0xC06D, 0x986E, 0xC06E, 0x986F, 0xC06F, 0x9870, + 0xC070, 0x9871, 0xC071, 0x9872, 0xC072, 0x9873, 0xC073, 0x9874, + 0xC074, 0x9875, 0xC075, 0x9876, 0xC076, 0x9877, 0xC077, 0x9878, + 0xC078, 0x9879, 0xC079, 0x987A, 0xC07A, 0x9881, 0xC07B, 0x9882, + 0xC07C, 0x9883, 0xC07D, 0x9884, 0xC07E, 0x9885, 0xC07F, 0x9886, + 0xC080, 0x9887, 0xC081, 0x9888, 0xC082, 0x9889, 0xC083, 0x988A, + 0xC084, 0x988B, 0xC085, 0x988C, 0xC086, 0x988D, 0xC087, 0x988E, + 0xC088, 0x988F, 0xC089, 0x9890, 0xC08A, 0x9891, 0xC08B, 0x9892, + 0xC08C, 0x9893, 0xC08D, 0x9894, 0xC08E, 0x9895, 0xC08F, 0x9896, + 0xC090, 0xBBDF, 0xC091, 0xBBE0, 0xC092, 0x9897, 0xC093, 0x9898, + 0xC094, 0xBBE1, 0xC095, 0x9899, 0xC096, 0x989A, 0xC097, 0x989B, + 0xC098, 0xBBE2, 0xC099, 0x989C, 0xC09A, 0x989D, 0xC09B, 0x989E, + 0xC09C, 0x989F, 0xC09D, 0x98A0, 0xC09E, 0x98A1, 0xC09F, 0x98A2, + 0xC0A0, 0xBBE3, 0xC0A1, 0xBBE4, 0xC0A2, 0x98A3, 0xC0A3, 0xBBE5, + 0xC0A4, 0x98A4, 0xC0A5, 0xBBE6, 0xC0A6, 0x98A5, 0xC0A7, 0x98A6, + 0xC0A8, 0x98A7, 0xC0A9, 0x98A8, 0xC0AA, 0x98A9, 0xC0AB, 0x98AA, + 0xC0AC, 0xBBE7, 0xC0AD, 0xBBE8, 0xC0AE, 0x98AB, 0xC0AF, 0xBBE9, + 0xC0B0, 0xBBEA, 0xC0B1, 0x98AC, 0xC0B2, 0x98AD, 0xC0B3, 0xBBEB, + 0xC0B4, 0xBBEC, 0xC0B5, 0xBBED, 0xC0B6, 0xBBEE, 0xC0B7, 0x98AE, + 0xC0B8, 0x98AF, 0xC0B9, 0x98B0, 0xC0BA, 0x98B1, 0xC0BB, 0x98B2, + 0xC0BC, 0xBBEF, 0xC0BD, 0xBBF0, 0xC0BE, 0x98B3, 0xC0BF, 0xBBF1, + 0xC0C0, 0xBBF2, 0xC0C1, 0xBBF3, 0xC0C2, 0x98B4, 0xC0C3, 0x98B5, + 0xC0C4, 0x98B6, 0xC0C5, 0xBBF4, 0xC0C6, 0x98B7, 0xC0C7, 0x98B8, + 0xC0C8, 0xBBF5, 0xC0C9, 0xBBF6, 0xC0CA, 0x98B9, 0xC0CB, 0x98BA, + 0xC0CC, 0xBBF7, 0xC0CD, 0x98BB, 0xC0CE, 0x98BC, 0xC0CF, 0x98BD, + 0xC0D0, 0xBBF8, 0xC0D1, 0x98BE, 0xC0D2, 0x98BF, 0xC0D3, 0x98C0, + 0xC0D4, 0x98C1, 0xC0D5, 0x98C2, 0xC0D6, 0x98C3, 0xC0D7, 0x98C4, + 0xC0D8, 0xBBF9, 0xC0D9, 0xBBFA, 0xC0DA, 0x98C5, 0xC0DB, 0xBBFB, + 0xC0DC, 0xBBFC, 0xC0DD, 0xBBFD, 0xC0DE, 0x98C6, 0xC0DF, 0x98C7, + 0xC0E0, 0x98C8, 0xC0E1, 0x98C9, 0xC0E2, 0x98CA, 0xC0E3, 0x98CB, + 0xC0E4, 0xBBFE, 0xC0E5, 0xBCA1, 0xC0E6, 0x98CC, 0xC0E7, 0x98CD, + 0xC0E8, 0xBCA2, 0xC0E9, 0x98CE, 0xC0EA, 0x98CF, 0xC0EB, 0x98D0, + 0xC0EC, 0xBCA3, 0xC0ED, 0x98D1, 0xC0EE, 0x98D2, 0xC0EF, 0x98D3, + 0xC0F0, 0x98D4, 0xC0F1, 0x98D5, 0xC0F2, 0x98D6, 0xC0F3, 0x98D7, + 0xC0F4, 0xBCA4, 0xC0F5, 0xBCA5, 0xC0F6, 0x98D8, 0xC0F7, 0xBCA6, + 0xC0F8, 0x98D9, 0xC0F9, 0xBCA7, 0xC0FA, 0x98DA, 0xC0FB, 0x98DB, + 0xC0FC, 0x98DC, 0xC0FD, 0x98DD, 0xC0FE, 0x98DE, 0xC0FF, 0x98DF, + 0xC100, 0xBCA8, 0xC101, 0x98E0, 0xC102, 0x98E1, 0xC103, 0x98E2, + 0xC104, 0xBCA9, 0xC105, 0x98E3, 0xC106, 0x98E4, 0xC107, 0x98E5, + 0xC108, 0xBCAA, 0xC109, 0x98E6, 0xC10A, 0x98E7, 0xC10B, 0x98E8, + 0xC10C, 0x98E9, 0xC10D, 0x98EA, 0xC10E, 0x98EB, 0xC10F, 0x98EC, + 0xC110, 0xBCAB, 0xC111, 0x98ED, 0xC112, 0x98EE, 0xC113, 0x98EF, + 0xC114, 0x98F0, 0xC115, 0xBCAC, 0xC116, 0x98F1, 0xC117, 0x98F2, + 0xC118, 0x98F3, 0xC119, 0x98F4, 0xC11A, 0x98F5, 0xC11B, 0x98F6, + 0xC11C, 0xBCAD, 0xC11D, 0xBCAE, 0xC11E, 0xBCAF, 0xC11F, 0xBCB0, + 0xC120, 0xBCB1, 0xC121, 0x98F7, 0xC122, 0x98F8, 0xC123, 0xBCB2, + 0xC124, 0xBCB3, 0xC125, 0x98F9, 0xC126, 0xBCB4, 0xC127, 0xBCB5, + 0xC128, 0x98FA, 0xC129, 0x98FB, 0xC12A, 0x98FC, 0xC12B, 0x98FD, + 0xC12C, 0xBCB6, 0xC12D, 0xBCB7, 0xC12E, 0x98FE, 0xC12F, 0xBCB8, + 0xC130, 0xBCB9, 0xC131, 0xBCBA, 0xC132, 0x9941, 0xC133, 0x9942, + 0xC134, 0x9943, 0xC135, 0x9944, 0xC136, 0xBCBB, 0xC137, 0x9945, + 0xC138, 0xBCBC, 0xC139, 0xBCBD, 0xC13A, 0x9946, 0xC13B, 0x9947, + 0xC13C, 0xBCBE, 0xC13D, 0x9948, 0xC13E, 0x9949, 0xC13F, 0x994A, + 0xC140, 0xBCBF, 0xC141, 0x994B, 0xC142, 0x994C, 0xC143, 0x994D, + 0xC144, 0x994E, 0xC145, 0x994F, 0xC146, 0x9950, 0xC147, 0x9951, + 0xC148, 0xBCC0, 0xC149, 0xBCC1, 0xC14A, 0x9952, 0xC14B, 0xBCC2, + 0xC14C, 0xBCC3, 0xC14D, 0xBCC4, 0xC14E, 0x9953, 0xC14F, 0x9954, + 0xC150, 0x9955, 0xC151, 0x9956, 0xC152, 0x9957, 0xC153, 0x9958, + 0xC154, 0xBCC5, 0xC155, 0xBCC6, 0xC156, 0x9959, 0xC157, 0x995A, + 0xC158, 0xBCC7, 0xC159, 0x9961, 0xC15A, 0x9962, 0xC15B, 0x9963, + 0xC15C, 0xBCC8, 0xC15D, 0x9964, 0xC15E, 0x9965, 0xC15F, 0x9966, + 0xC160, 0x9967, 0xC161, 0x9968, 0xC162, 0x9969, 0xC163, 0x996A, + 0xC164, 0xBCC9, 0xC165, 0xBCCA, 0xC166, 0x996B, 0xC167, 0xBCCB, + 0xC168, 0xBCCC, 0xC169, 0xBCCD, 0xC16A, 0x996C, 0xC16B, 0x996D, + 0xC16C, 0x996E, 0xC16D, 0x996F, 0xC16E, 0x9970, 0xC16F, 0x9971, + 0xC170, 0xBCCE, 0xC171, 0x9972, 0xC172, 0x9973, 0xC173, 0x9974, + 0xC174, 0xBCCF, 0xC175, 0x9975, 0xC176, 0x9976, 0xC177, 0x9977, + 0xC178, 0xBCD0, 0xC179, 0x9978, 0xC17A, 0x9979, 0xC17B, 0x997A, + 0xC17C, 0x9981, 0xC17D, 0x9982, 0xC17E, 0x9983, 0xC17F, 0x9984, + 0xC180, 0x9985, 0xC181, 0x9986, 0xC182, 0x9987, 0xC183, 0x9988, + 0xC184, 0x9989, 0xC185, 0xBCD1, 0xC186, 0x998A, 0xC187, 0x998B, + 0xC188, 0x998C, 0xC189, 0x998D, 0xC18A, 0x998E, 0xC18B, 0x998F, + 0xC18C, 0xBCD2, 0xC18D, 0xBCD3, 0xC18E, 0xBCD4, 0xC18F, 0x9990, + 0xC190, 0xBCD5, 0xC191, 0x9991, 0xC192, 0x9992, 0xC193, 0x9993, + 0xC194, 0xBCD6, 0xC195, 0x9994, 0xC196, 0xBCD7, 0xC197, 0x9995, + 0xC198, 0x9996, 0xC199, 0x9997, 0xC19A, 0x9998, 0xC19B, 0x9999, + 0xC19C, 0xBCD8, 0xC19D, 0xBCD9, 0xC19E, 0x999A, 0xC19F, 0xBCDA, + 0xC1A0, 0x999B, 0xC1A1, 0xBCDB, 0xC1A2, 0x999C, 0xC1A3, 0x999D, + 0xC1A4, 0x999E, 0xC1A5, 0xBCDC, 0xC1A6, 0x999F, 0xC1A7, 0x99A0, + 0xC1A8, 0xBCDD, 0xC1A9, 0xBCDE, 0xC1AA, 0x99A1, 0xC1AB, 0x99A2, + 0xC1AC, 0xBCDF, 0xC1AD, 0x99A3, 0xC1AE, 0x99A4, 0xC1AF, 0x99A5, + 0xC1B0, 0xBCE0, 0xC1B1, 0x99A6, 0xC1B2, 0x99A7, 0xC1B3, 0x99A8, + 0xC1B4, 0x99A9, 0xC1B5, 0x99AA, 0xC1B6, 0x99AB, 0xC1B7, 0x99AC, + 0xC1B8, 0x99AD, 0xC1B9, 0x99AE, 0xC1BA, 0x99AF, 0xC1BB, 0x99B0, + 0xC1BC, 0x99B1, 0xC1BD, 0xBCE1, 0xC1BE, 0x99B2, 0xC1BF, 0x99B3, + 0xC1C0, 0x99B4, 0xC1C1, 0x99B5, 0xC1C2, 0x99B6, 0xC1C3, 0x99B7, + 0xC1C4, 0xBCE2, 0xC1C5, 0x99B8, 0xC1C6, 0x99B9, 0xC1C7, 0x99BA, + 0xC1C8, 0xBCE3, 0xC1C9, 0x99BB, 0xC1CA, 0x99BC, 0xC1CB, 0x99BD, + 0xC1CC, 0xBCE4, 0xC1CD, 0x99BE, 0xC1CE, 0x99BF, 0xC1CF, 0x99C0, + 0xC1D0, 0x99C1, 0xC1D1, 0x99C2, 0xC1D2, 0x99C3, 0xC1D3, 0x99C4, + 0xC1D4, 0xBCE5, 0xC1D5, 0x99C5, 0xC1D6, 0x99C6, 0xC1D7, 0xBCE6, + 0xC1D8, 0xBCE7, 0xC1D9, 0x99C7, 0xC1DA, 0x99C8, 0xC1DB, 0x99C9, + 0xC1DC, 0x99CA, 0xC1DD, 0x99CB, 0xC1DE, 0x99CC, 0xC1DF, 0x99CD, + 0xC1E0, 0xBCE8, 0xC1E1, 0x99CE, 0xC1E2, 0x99CF, 0xC1E3, 0x99D0, + 0xC1E4, 0xBCE9, 0xC1E5, 0x99D1, 0xC1E6, 0x99D2, 0xC1E7, 0x99D3, + 0xC1E8, 0xBCEA, 0xC1E9, 0x99D4, 0xC1EA, 0x99D5, 0xC1EB, 0x99D6, + 0xC1EC, 0x99D7, 0xC1ED, 0x99D8, 0xC1EE, 0x99D9, 0xC1EF, 0x99DA, + 0xC1F0, 0xBCEB, 0xC1F1, 0xBCEC, 0xC1F2, 0x99DB, 0xC1F3, 0xBCED, + 0xC1F4, 0x99DC, 0xC1F5, 0x99DD, 0xC1F6, 0x99DE, 0xC1F7, 0x99DF, + 0xC1F8, 0x99E0, 0xC1F9, 0x99E1, 0xC1FA, 0x99E2, 0xC1FB, 0x99E3, + 0xC1FC, 0xBCEE, 0xC1FD, 0xBCEF, 0xC1FE, 0x99E4, 0xC1FF, 0x99E5, + 0xC200, 0xBCF0, 0xC201, 0x99E6, 0xC202, 0x99E7, 0xC203, 0x99E8, + 0xC204, 0xBCF1, 0xC205, 0x99E9, 0xC206, 0x99EA, 0xC207, 0x99EB, + 0xC208, 0x99EC, 0xC209, 0x99ED, 0xC20A, 0x99EE, 0xC20B, 0x99EF, + 0xC20C, 0xBCF2, 0xC20D, 0xBCF3, 0xC20E, 0x99F0, 0xC20F, 0xBCF4, + 0xC210, 0x99F1, 0xC211, 0xBCF5, 0xC212, 0x99F2, 0xC213, 0x99F3, + 0xC214, 0x99F4, 0xC215, 0x99F5, 0xC216, 0x99F6, 0xC217, 0x99F7, + 0xC218, 0xBCF6, 0xC219, 0xBCF7, 0xC21A, 0x99F8, 0xC21B, 0x99F9, + 0xC21C, 0xBCF8, 0xC21D, 0x99FA, 0xC21E, 0x99FB, 0xC21F, 0xBCF9, + 0xC220, 0xBCFA, 0xC221, 0x99FC, 0xC222, 0x99FD, 0xC223, 0x99FE, + 0xC224, 0x9A41, 0xC225, 0x9A42, 0xC226, 0x9A43, 0xC227, 0x9A44, + 0xC228, 0xBCFB, 0xC229, 0xBCFC, 0xC22A, 0x9A45, 0xC22B, 0xBCFD, + 0xC22C, 0x9A46, 0xC22D, 0xBCFE, 0xC22E, 0x9A47, 0xC22F, 0xBDA1, + 0xC230, 0x9A48, 0xC231, 0xBDA2, 0xC232, 0xBDA3, 0xC233, 0x9A49, + 0xC234, 0xBDA4, 0xC235, 0x9A4A, 0xC236, 0x9A4B, 0xC237, 0x9A4C, + 0xC238, 0x9A4D, 0xC239, 0x9A4E, 0xC23A, 0x9A4F, 0xC23B, 0x9A50, + 0xC23C, 0x9A51, 0xC23D, 0x9A52, 0xC23E, 0x9A53, 0xC23F, 0x9A54, + 0xC240, 0x9A55, 0xC241, 0x9A56, 0xC242, 0x9A57, 0xC243, 0x9A58, + 0xC244, 0x9A59, 0xC245, 0x9A5A, 0xC246, 0x9A61, 0xC247, 0x9A62, + 0xC248, 0xBDA5, 0xC249, 0x9A63, 0xC24A, 0x9A64, 0xC24B, 0x9A65, + 0xC24C, 0x9A66, 0xC24D, 0x9A67, 0xC24E, 0x9A68, 0xC24F, 0x9A69, + 0xC250, 0xBDA6, 0xC251, 0xBDA7, 0xC252, 0x9A6A, 0xC253, 0x9A6B, + 0xC254, 0xBDA8, 0xC255, 0x9A6C, 0xC256, 0x9A6D, 0xC257, 0x9A6E, + 0xC258, 0xBDA9, 0xC259, 0x9A6F, 0xC25A, 0x9A70, 0xC25B, 0x9A71, + 0xC25C, 0x9A72, 0xC25D, 0x9A73, 0xC25E, 0x9A74, 0xC25F, 0x9A75, + 0xC260, 0xBDAA, 0xC261, 0x9A76, 0xC262, 0x9A77, 0xC263, 0x9A78, + 0xC264, 0x9A79, 0xC265, 0xBDAB, 0xC266, 0x9A7A, 0xC267, 0x9A81, + 0xC268, 0x9A82, 0xC269, 0x9A83, 0xC26A, 0x9A84, 0xC26B, 0x9A85, + 0xC26C, 0xBDAC, 0xC26D, 0xBDAD, 0xC26E, 0x9A86, 0xC26F, 0x9A87, + 0xC270, 0xBDAE, 0xC271, 0x9A88, 0xC272, 0x9A89, 0xC273, 0x9A8A, + 0xC274, 0xBDAF, 0xC275, 0x9A8B, 0xC276, 0x9A8C, 0xC277, 0x9A8D, + 0xC278, 0x9A8E, 0xC279, 0x9A8F, 0xC27A, 0x9A90, 0xC27B, 0x9A91, + 0xC27C, 0xBDB0, 0xC27D, 0xBDB1, 0xC27E, 0x9A92, 0xC27F, 0xBDB2, + 0xC280, 0x9A93, 0xC281, 0xBDB3, 0xC282, 0x9A94, 0xC283, 0x9A95, + 0xC284, 0x9A96, 0xC285, 0x9A97, 0xC286, 0x9A98, 0xC287, 0x9A99, + 0xC288, 0xBDB4, 0xC289, 0xBDB5, 0xC28A, 0x9A9A, 0xC28B, 0x9A9B, + 0xC28C, 0x9A9C, 0xC28D, 0x9A9D, 0xC28E, 0x9A9E, 0xC28F, 0x9A9F, + 0xC290, 0xBDB6, 0xC291, 0x9AA0, 0xC292, 0x9AA1, 0xC293, 0x9AA2, + 0xC294, 0x9AA3, 0xC295, 0x9AA4, 0xC296, 0x9AA5, 0xC297, 0x9AA6, + 0xC298, 0xBDB7, 0xC299, 0x9AA7, 0xC29A, 0x9AA8, 0xC29B, 0xBDB8, + 0xC29C, 0x9AA9, 0xC29D, 0xBDB9, 0xC29E, 0x9AAA, 0xC29F, 0x9AAB, + 0xC2A0, 0x9AAC, 0xC2A1, 0x9AAD, 0xC2A2, 0x9AAE, 0xC2A3, 0x9AAF, + 0xC2A4, 0xBDBA, 0xC2A5, 0xBDBB, 0xC2A6, 0x9AB0, 0xC2A7, 0x9AB1, + 0xC2A8, 0xBDBC, 0xC2A9, 0x9AB2, 0xC2AA, 0x9AB3, 0xC2AB, 0x9AB4, + 0xC2AC, 0xBDBD, 0xC2AD, 0xBDBE, 0xC2AE, 0x9AB5, 0xC2AF, 0x9AB6, + 0xC2B0, 0x9AB7, 0xC2B1, 0x9AB8, 0xC2B2, 0x9AB9, 0xC2B3, 0x9ABA, + 0xC2B4, 0xBDBF, 0xC2B5, 0xBDC0, 0xC2B6, 0x9ABB, 0xC2B7, 0xBDC1, + 0xC2B8, 0x9ABC, 0xC2B9, 0xBDC2, 0xC2BA, 0x9ABD, 0xC2BB, 0x9ABE, + 0xC2BC, 0x9ABF, 0xC2BD, 0x9AC0, 0xC2BE, 0x9AC1, 0xC2BF, 0x9AC2, + 0xC2C0, 0x9AC3, 0xC2C1, 0x9AC4, 0xC2C2, 0x9AC5, 0xC2C3, 0x9AC6, + 0xC2C4, 0x9AC7, 0xC2C5, 0x9AC8, 0xC2C6, 0x9AC9, 0xC2C7, 0x9ACA, + 0xC2C8, 0x9ACB, 0xC2C9, 0x9ACC, 0xC2CA, 0x9ACD, 0xC2CB, 0x9ACE, + 0xC2CC, 0x9ACF, 0xC2CD, 0x9AD0, 0xC2CE, 0x9AD1, 0xC2CF, 0x9AD2, + 0xC2D0, 0x9AD3, 0xC2D1, 0x9AD4, 0xC2D2, 0x9AD5, 0xC2D3, 0x9AD6, + 0xC2D4, 0x9AD7, 0xC2D5, 0x9AD8, 0xC2D6, 0x9AD9, 0xC2D7, 0x9ADA, + 0xC2D8, 0x9ADB, 0xC2D9, 0x9ADC, 0xC2DA, 0x9ADD, 0xC2DB, 0x9ADE, + 0xC2DC, 0xBDC3, 0xC2DD, 0xBDC4, 0xC2DE, 0x9ADF, 0xC2DF, 0x9AE0, + 0xC2E0, 0xBDC5, 0xC2E1, 0x9AE1, 0xC2E2, 0x9AE2, 0xC2E3, 0xBDC6, + 0xC2E4, 0xBDC7, 0xC2E5, 0x9AE3, 0xC2E6, 0x9AE4, 0xC2E7, 0x9AE5, + 0xC2E8, 0x9AE6, 0xC2E9, 0x9AE7, 0xC2EA, 0x9AE8, 0xC2EB, 0xBDC8, + 0xC2EC, 0xBDC9, 0xC2ED, 0xBDCA, 0xC2EE, 0x9AE9, 0xC2EF, 0xBDCB, + 0xC2F0, 0x9AEA, 0xC2F1, 0xBDCC, 0xC2F2, 0x9AEB, 0xC2F3, 0x9AEC, + 0xC2F4, 0x9AED, 0xC2F5, 0x9AEE, 0xC2F6, 0xBDCD, 0xC2F7, 0x9AEF, + 0xC2F8, 0xBDCE, 0xC2F9, 0xBDCF, 0xC2FA, 0x9AF0, 0xC2FB, 0xBDD0, + 0xC2FC, 0xBDD1, 0xC2FD, 0x9AF1, 0xC2FE, 0x9AF2, 0xC2FF, 0x9AF3, + 0xC300, 0xBDD2, 0xC301, 0x9AF4, 0xC302, 0x9AF5, 0xC303, 0x9AF6, + 0xC304, 0x9AF7, 0xC305, 0x9AF8, 0xC306, 0x9AF9, 0xC307, 0x9AFA, + 0xC308, 0xBDD3, 0xC309, 0xBDD4, 0xC30A, 0x9AFB, 0xC30B, 0x9AFC, + 0xC30C, 0xBDD5, 0xC30D, 0xBDD6, 0xC30E, 0x9AFD, 0xC30F, 0x9AFE, + 0xC310, 0x9B41, 0xC311, 0x9B42, 0xC312, 0x9B43, 0xC313, 0xBDD7, + 0xC314, 0xBDD8, 0xC315, 0xBDD9, 0xC316, 0x9B44, 0xC317, 0x9B45, + 0xC318, 0xBDDA, 0xC319, 0x9B46, 0xC31A, 0x9B47, 0xC31B, 0x9B48, + 0xC31C, 0xBDDB, 0xC31D, 0x9B49, 0xC31E, 0x9B4A, 0xC31F, 0x9B4B, + 0xC320, 0x9B4C, 0xC321, 0x9B4D, 0xC322, 0x9B4E, 0xC323, 0x9B4F, + 0xC324, 0xBDDC, 0xC325, 0xBDDD, 0xC326, 0x9B50, 0xC327, 0x9B51, + 0xC328, 0xBDDE, 0xC329, 0xBDDF, 0xC32A, 0x9B52, 0xC32B, 0x9B53, + 0xC32C, 0x9B54, 0xC32D, 0x9B55, 0xC32E, 0x9B56, 0xC32F, 0x9B57, + 0xC330, 0x9B58, 0xC331, 0x9B59, 0xC332, 0x9B5A, 0xC333, 0x9B61, + 0xC334, 0x9B62, 0xC335, 0x9B63, 0xC336, 0x9B64, 0xC337, 0x9B65, + 0xC338, 0x9B66, 0xC339, 0x9B67, 0xC33A, 0x9B68, 0xC33B, 0x9B69, + 0xC33C, 0x9B6A, 0xC33D, 0x9B6B, 0xC33E, 0x9B6C, 0xC33F, 0x9B6D, + 0xC340, 0x9B6E, 0xC341, 0x9B6F, 0xC342, 0x9B70, 0xC343, 0x9B71, + 0xC344, 0x9B72, 0xC345, 0xBDE0, 0xC346, 0x9B73, 0xC347, 0x9B74, + 0xC348, 0x9B75, 0xC349, 0x9B76, 0xC34A, 0x9B77, 0xC34B, 0x9B78, + 0xC34C, 0x9B79, 0xC34D, 0x9B7A, 0xC34E, 0x9B81, 0xC34F, 0x9B82, + 0xC350, 0x9B83, 0xC351, 0x9B84, 0xC352, 0x9B85, 0xC353, 0x9B86, + 0xC354, 0x9B87, 0xC355, 0x9B88, 0xC356, 0x9B89, 0xC357, 0x9B8A, + 0xC358, 0x9B8B, 0xC359, 0x9B8C, 0xC35A, 0x9B8D, 0xC35B, 0x9B8E, + 0xC35C, 0x9B8F, 0xC35D, 0x9B90, 0xC35E, 0x9B91, 0xC35F, 0x9B92, + 0xC360, 0x9B93, 0xC361, 0x9B94, 0xC362, 0x9B95, 0xC363, 0x9B96, + 0xC364, 0x9B97, 0xC365, 0x9B98, 0xC366, 0x9B99, 0xC367, 0x9B9A, + 0xC368, 0xBDE1, 0xC369, 0xBDE2, 0xC36A, 0x9B9B, 0xC36B, 0x9B9C, + 0xC36C, 0xBDE3, 0xC36D, 0x9B9D, 0xC36E, 0x9B9E, 0xC36F, 0x9B9F, + 0xC370, 0xBDE4, 0xC371, 0x9BA0, 0xC372, 0xBDE5, 0xC373, 0x9BA1, + 0xC374, 0x9BA2, 0xC375, 0x9BA3, 0xC376, 0x9BA4, 0xC377, 0x9BA5, + 0xC378, 0xBDE6, 0xC379, 0xBDE7, 0xC37A, 0x9BA6, 0xC37B, 0x9BA7, + 0xC37C, 0xBDE8, 0xC37D, 0xBDE9, 0xC37E, 0x9BA8, 0xC37F, 0x9BA9, + 0xC380, 0x9BAA, 0xC381, 0x9BAB, 0xC382, 0x9BAC, 0xC383, 0x9BAD, + 0xC384, 0xBDEA, 0xC385, 0x9BAE, 0xC386, 0x9BAF, 0xC387, 0x9BB0, + 0xC388, 0xBDEB, 0xC389, 0x9BB1, 0xC38A, 0x9BB2, 0xC38B, 0x9BB3, + 0xC38C, 0xBDEC, 0xC38D, 0x9BB4, 0xC38E, 0x9BB5, 0xC38F, 0x9BB6, + 0xC390, 0x9BB7, 0xC391, 0x9BB8, 0xC392, 0x9BB9, 0xC393, 0x9BBA, + 0xC394, 0x9BBB, 0xC395, 0x9BBC, 0xC396, 0x9BBD, 0xC397, 0x9BBE, + 0xC398, 0x9BBF, 0xC399, 0x9BC0, 0xC39A, 0x9BC1, 0xC39B, 0x9BC2, + 0xC39C, 0x9BC3, 0xC39D, 0x9BC4, 0xC39E, 0x9BC5, 0xC39F, 0x9BC6, + 0xC3A0, 0x9BC7, 0xC3A1, 0x9BC8, 0xC3A2, 0x9BC9, 0xC3A3, 0x9BCA, + 0xC3A4, 0x9BCB, 0xC3A5, 0x9BCC, 0xC3A6, 0x9BCD, 0xC3A7, 0x9BCE, + 0xC3A8, 0x9BCF, 0xC3A9, 0x9BD0, 0xC3AA, 0x9BD1, 0xC3AB, 0x9BD2, + 0xC3AC, 0x9BD3, 0xC3AD, 0x9BD4, 0xC3AE, 0x9BD5, 0xC3AF, 0x9BD6, + 0xC3B0, 0x9BD7, 0xC3B1, 0x9BD8, 0xC3B2, 0x9BD9, 0xC3B3, 0x9BDA, + 0xC3B4, 0x9BDB, 0xC3B5, 0x9BDC, 0xC3B6, 0x9BDD, 0xC3B7, 0x9BDE, + 0xC3B8, 0x9BDF, 0xC3B9, 0x9BE0, 0xC3BA, 0x9BE1, 0xC3BB, 0x9BE2, + 0xC3BC, 0x9BE3, 0xC3BD, 0x9BE4, 0xC3BE, 0x9BE5, 0xC3BF, 0x9BE6, + 0xC3C0, 0xBDED, 0xC3C1, 0x9BE7, 0xC3C2, 0x9BE8, 0xC3C3, 0x9BE9, + 0xC3C4, 0x9BEA, 0xC3C5, 0x9BEB, 0xC3C6, 0x9BEC, 0xC3C7, 0x9BED, + 0xC3C8, 0x9BEE, 0xC3C9, 0x9BEF, 0xC3CA, 0x9BF0, 0xC3CB, 0x9BF1, + 0xC3CC, 0x9BF2, 0xC3CD, 0x9BF3, 0xC3CE, 0x9BF4, 0xC3CF, 0x9BF5, + 0xC3D0, 0x9BF6, 0xC3D1, 0x9BF7, 0xC3D2, 0x9BF8, 0xC3D3, 0x9BF9, + 0xC3D4, 0x9BFA, 0xC3D5, 0x9BFB, 0xC3D6, 0x9BFC, 0xC3D7, 0x9BFD, + 0xC3D8, 0xBDEE, 0xC3D9, 0xBDEF, 0xC3DA, 0x9BFE, 0xC3DB, 0x9C41, + 0xC3DC, 0xBDF0, 0xC3DD, 0x9C42, 0xC3DE, 0x9C43, 0xC3DF, 0xBDF1, + 0xC3E0, 0xBDF2, 0xC3E1, 0x9C44, 0xC3E2, 0xBDF3, 0xC3E3, 0x9C45, + 0xC3E4, 0x9C46, 0xC3E5, 0x9C47, 0xC3E6, 0x9C48, 0xC3E7, 0x9C49, + 0xC3E8, 0xBDF4, 0xC3E9, 0xBDF5, 0xC3EA, 0x9C4A, 0xC3EB, 0x9C4B, + 0xC3EC, 0x9C4C, 0xC3ED, 0xBDF6, 0xC3EE, 0x9C4D, 0xC3EF, 0x9C4E, + 0xC3F0, 0x9C4F, 0xC3F1, 0x9C50, 0xC3F2, 0x9C51, 0xC3F3, 0x9C52, + 0xC3F4, 0xBDF7, 0xC3F5, 0xBDF8, 0xC3F6, 0x9C53, 0xC3F7, 0x9C54, + 0xC3F8, 0xBDF9, 0xC3F9, 0x9C55, 0xC3FA, 0x9C56, 0xC3FB, 0x9C57, + 0xC3FC, 0x9C58, 0xC3FD, 0x9C59, 0xC3FE, 0x9C5A, 0xC3FF, 0x9C61, + 0xC400, 0x9C62, 0xC401, 0x9C63, 0xC402, 0x9C64, 0xC403, 0x9C65, + 0xC404, 0x9C66, 0xC405, 0x9C67, 0xC406, 0x9C68, 0xC407, 0x9C69, + 0xC408, 0xBDFA, 0xC409, 0x9C6A, 0xC40A, 0x9C6B, 0xC40B, 0x9C6C, + 0xC40C, 0x9C6D, 0xC40D, 0x9C6E, 0xC40E, 0x9C6F, 0xC40F, 0x9C70, + 0xC410, 0xBDFB, 0xC411, 0x9C71, 0xC412, 0x9C72, 0xC413, 0x9C73, + 0xC414, 0x9C74, 0xC415, 0x9C75, 0xC416, 0x9C76, 0xC417, 0x9C77, + 0xC418, 0x9C78, 0xC419, 0x9C79, 0xC41A, 0x9C7A, 0xC41B, 0x9C81, + 0xC41C, 0x9C82, 0xC41D, 0x9C83, 0xC41E, 0x9C84, 0xC41F, 0x9C85, + 0xC420, 0x9C86, 0xC421, 0x9C87, 0xC422, 0x9C88, 0xC423, 0x9C89, + 0xC424, 0xBDFC, 0xC425, 0x9C8A, 0xC426, 0x9C8B, 0xC427, 0x9C8C, + 0xC428, 0x9C8D, 0xC429, 0x9C8E, 0xC42A, 0x9C8F, 0xC42B, 0x9C90, + 0xC42C, 0xBDFD, 0xC42D, 0x9C91, 0xC42E, 0x9C92, 0xC42F, 0x9C93, + 0xC430, 0xBDFE, 0xC431, 0x9C94, 0xC432, 0x9C95, 0xC433, 0x9C96, + 0xC434, 0xBEA1, 0xC435, 0x9C97, 0xC436, 0x9C98, 0xC437, 0x9C99, + 0xC438, 0x9C9A, 0xC439, 0x9C9B, 0xC43A, 0x9C9C, 0xC43B, 0x9C9D, + 0xC43C, 0xBEA2, 0xC43D, 0xBEA3, 0xC43E, 0x9C9E, 0xC43F, 0x9C9F, + 0xC440, 0x9CA0, 0xC441, 0x9CA1, 0xC442, 0x9CA2, 0xC443, 0x9CA3, + 0xC444, 0x9CA4, 0xC445, 0x9CA5, 0xC446, 0x9CA6, 0xC447, 0x9CA7, + 0xC448, 0xBEA4, 0xC449, 0x9CA8, 0xC44A, 0x9CA9, 0xC44B, 0x9CAA, + 0xC44C, 0x9CAB, 0xC44D, 0x9CAC, 0xC44E, 0x9CAD, 0xC44F, 0x9CAE, + 0xC450, 0x9CAF, 0xC451, 0x9CB0, 0xC452, 0x9CB1, 0xC453, 0x9CB2, + 0xC454, 0x9CB3, 0xC455, 0x9CB4, 0xC456, 0x9CB5, 0xC457, 0x9CB6, + 0xC458, 0x9CB7, 0xC459, 0x9CB8, 0xC45A, 0x9CB9, 0xC45B, 0x9CBA, + 0xC45C, 0x9CBB, 0xC45D, 0x9CBC, 0xC45E, 0x9CBD, 0xC45F, 0x9CBE, + 0xC460, 0x9CBF, 0xC461, 0x9CC0, 0xC462, 0x9CC1, 0xC463, 0x9CC2, + 0xC464, 0xBEA5, 0xC465, 0xBEA6, 0xC466, 0x9CC3, 0xC467, 0x9CC4, + 0xC468, 0xBEA7, 0xC469, 0x9CC5, 0xC46A, 0x9CC6, 0xC46B, 0x9CC7, + 0xC46C, 0xBEA8, 0xC46D, 0x9CC8, 0xC46E, 0x9CC9, 0xC46F, 0x9CCA, + 0xC470, 0x9CCB, 0xC471, 0x9CCC, 0xC472, 0x9CCD, 0xC473, 0x9CCE, + 0xC474, 0xBEA9, 0xC475, 0xBEAA, 0xC476, 0x9CCF, 0xC477, 0x9CD0, + 0xC478, 0x9CD1, 0xC479, 0xBEAB, 0xC47A, 0x9CD2, 0xC47B, 0x9CD3, + 0xC47C, 0x9CD4, 0xC47D, 0x9CD5, 0xC47E, 0x9CD6, 0xC47F, 0x9CD7, + 0xC480, 0xBEAC, 0xC481, 0x9CD8, 0xC482, 0x9CD9, 0xC483, 0x9CDA, + 0xC484, 0x9CDB, 0xC485, 0x9CDC, 0xC486, 0x9CDD, 0xC487, 0x9CDE, + 0xC488, 0x9CDF, 0xC489, 0x9CE0, 0xC48A, 0x9CE1, 0xC48B, 0x9CE2, + 0xC48C, 0x9CE3, 0xC48D, 0x9CE4, 0xC48E, 0x9CE5, 0xC48F, 0x9CE6, + 0xC490, 0x9CE7, 0xC491, 0x9CE8, 0xC492, 0x9CE9, 0xC493, 0x9CEA, + 0xC494, 0xBEAD, 0xC495, 0x9CEB, 0xC496, 0x9CEC, 0xC497, 0x9CED, + 0xC498, 0x9CEE, 0xC499, 0x9CEF, 0xC49A, 0x9CF0, 0xC49B, 0x9CF1, + 0xC49C, 0xBEAE, 0xC49D, 0x9CF2, 0xC49E, 0x9CF3, 0xC49F, 0x9CF4, + 0xC4A0, 0x9CF5, 0xC4A1, 0x9CF6, 0xC4A2, 0x9CF7, 0xC4A3, 0x9CF8, + 0xC4A4, 0x9CF9, 0xC4A5, 0x9CFA, 0xC4A6, 0x9CFB, 0xC4A7, 0x9CFC, + 0xC4A8, 0x9CFD, 0xC4A9, 0x9CFE, 0xC4AA, 0x9D41, 0xC4AB, 0x9D42, + 0xC4AC, 0x9D43, 0xC4AD, 0x9D44, 0xC4AE, 0x9D45, 0xC4AF, 0x9D46, + 0xC4B0, 0x9D47, 0xC4B1, 0x9D48, 0xC4B2, 0x9D49, 0xC4B3, 0x9D4A, + 0xC4B4, 0x9D4B, 0xC4B5, 0x9D4C, 0xC4B6, 0x9D4D, 0xC4B7, 0x9D4E, + 0xC4B8, 0xBEAF, 0xC4B9, 0x9D4F, 0xC4BA, 0x9D50, 0xC4BB, 0x9D51, + 0xC4BC, 0xBEB0, 0xC4BD, 0x9D52, 0xC4BE, 0x9D53, 0xC4BF, 0x9D54, + 0xC4C0, 0x9D55, 0xC4C1, 0x9D56, 0xC4C2, 0x9D57, 0xC4C3, 0x9D58, + 0xC4C4, 0x9D59, 0xC4C5, 0x9D5A, 0xC4C6, 0x9D61, 0xC4C7, 0x9D62, + 0xC4C8, 0x9D63, 0xC4C9, 0x9D64, 0xC4CA, 0x9D65, 0xC4CB, 0x9D66, + 0xC4CC, 0x9D67, 0xC4CD, 0x9D68, 0xC4CE, 0x9D69, 0xC4CF, 0x9D6A, + 0xC4D0, 0x9D6B, 0xC4D1, 0x9D6C, 0xC4D2, 0x9D6D, 0xC4D3, 0x9D6E, + 0xC4D4, 0x9D6F, 0xC4D5, 0x9D70, 0xC4D6, 0x9D71, 0xC4D7, 0x9D72, + 0xC4D8, 0x9D73, 0xC4D9, 0x9D74, 0xC4DA, 0x9D75, 0xC4DB, 0x9D76, + 0xC4DC, 0x9D77, 0xC4DD, 0x9D78, 0xC4DE, 0x9D79, 0xC4DF, 0x9D7A, + 0xC4E0, 0x9D81, 0xC4E1, 0x9D82, 0xC4E2, 0x9D83, 0xC4E3, 0x9D84, + 0xC4E4, 0x9D85, 0xC4E5, 0x9D86, 0xC4E6, 0x9D87, 0xC4E7, 0x9D88, + 0xC4E8, 0x9D89, 0xC4E9, 0xBEB1, 0xC4EA, 0x9D8A, 0xC4EB, 0x9D8B, + 0xC4EC, 0x9D8C, 0xC4ED, 0x9D8D, 0xC4EE, 0x9D8E, 0xC4EF, 0x9D8F, + 0xC4F0, 0xBEB2, 0xC4F1, 0xBEB3, 0xC4F2, 0x9D90, 0xC4F3, 0x9D91, + 0xC4F4, 0xBEB4, 0xC4F5, 0x9D92, 0xC4F6, 0x9D93, 0xC4F7, 0x9D94, + 0xC4F8, 0xBEB5, 0xC4F9, 0x9D95, 0xC4FA, 0xBEB6, 0xC4FB, 0x9D96, + 0xC4FC, 0x9D97, 0xC4FD, 0x9D98, 0xC4FE, 0x9D99, 0xC4FF, 0xBEB7, + 0xC500, 0xBEB8, 0xC501, 0xBEB9, 0xC502, 0x9D9A, 0xC503, 0x9D9B, + 0xC504, 0x9D9C, 0xC505, 0x9D9D, 0xC506, 0x9D9E, 0xC507, 0x9D9F, + 0xC508, 0x9DA0, 0xC509, 0x9DA1, 0xC50A, 0x9DA2, 0xC50B, 0x9DA3, + 0xC50C, 0xBEBA, 0xC50D, 0x9DA4, 0xC50E, 0x9DA5, 0xC50F, 0x9DA6, + 0xC510, 0xBEBB, 0xC511, 0x9DA7, 0xC512, 0x9DA8, 0xC513, 0x9DA9, + 0xC514, 0xBEBC, 0xC515, 0x9DAA, 0xC516, 0x9DAB, 0xC517, 0x9DAC, + 0xC518, 0x9DAD, 0xC519, 0x9DAE, 0xC51A, 0x9DAF, 0xC51B, 0x9DB0, + 0xC51C, 0xBEBD, 0xC51D, 0x9DB1, 0xC51E, 0x9DB2, 0xC51F, 0x9DB3, + 0xC520, 0x9DB4, 0xC521, 0x9DB5, 0xC522, 0x9DB6, 0xC523, 0x9DB7, + 0xC524, 0x9DB8, 0xC525, 0x9DB9, 0xC526, 0x9DBA, 0xC527, 0x9DBB, + 0xC528, 0xBEBE, 0xC529, 0xBEBF, 0xC52A, 0x9DBC, 0xC52B, 0x9DBD, + 0xC52C, 0xBEC0, 0xC52D, 0x9DBE, 0xC52E, 0x9DBF, 0xC52F, 0x9DC0, + 0xC530, 0xBEC1, 0xC531, 0x9DC1, 0xC532, 0x9DC2, 0xC533, 0x9DC3, + 0xC534, 0x9DC4, 0xC535, 0x9DC5, 0xC536, 0x9DC6, 0xC537, 0x9DC7, + 0xC538, 0xBEC2, 0xC539, 0xBEC3, 0xC53A, 0x9DC8, 0xC53B, 0xBEC4, + 0xC53C, 0x9DC9, 0xC53D, 0xBEC5, 0xC53E, 0x9DCA, 0xC53F, 0x9DCB, + 0xC540, 0x9DCC, 0xC541, 0x9DCD, 0xC542, 0x9DCE, 0xC543, 0x9DCF, + 0xC544, 0xBEC6, 0xC545, 0xBEC7, 0xC546, 0x9DD0, 0xC547, 0x9DD1, + 0xC548, 0xBEC8, 0xC549, 0xBEC9, 0xC54A, 0xBECA, 0xC54B, 0x9DD2, + 0xC54C, 0xBECB, 0xC54D, 0xBECC, 0xC54E, 0xBECD, 0xC54F, 0x9DD3, + 0xC550, 0x9DD4, 0xC551, 0x9DD5, 0xC552, 0x9DD6, 0xC553, 0xBECE, + 0xC554, 0xBECF, 0xC555, 0xBED0, 0xC556, 0x9DD7, 0xC557, 0xBED1, + 0xC558, 0xBED2, 0xC559, 0xBED3, 0xC55A, 0x9DD8, 0xC55B, 0x9DD9, + 0xC55C, 0x9DDA, 0xC55D, 0xBED4, 0xC55E, 0xBED5, 0xC55F, 0x9DDB, + 0xC560, 0xBED6, 0xC561, 0xBED7, 0xC562, 0x9DDC, 0xC563, 0x9DDD, + 0xC564, 0xBED8, 0xC565, 0x9DDE, 0xC566, 0x9DDF, 0xC567, 0x9DE0, + 0xC568, 0xBED9, 0xC569, 0x9DE1, 0xC56A, 0x9DE2, 0xC56B, 0x9DE3, + 0xC56C, 0x9DE4, 0xC56D, 0x9DE5, 0xC56E, 0x9DE6, 0xC56F, 0x9DE7, + 0xC570, 0xBEDA, 0xC571, 0xBEDB, 0xC572, 0x9DE8, 0xC573, 0xBEDC, + 0xC574, 0xBEDD, 0xC575, 0xBEDE, 0xC576, 0x9DE9, 0xC577, 0x9DEA, + 0xC578, 0x9DEB, 0xC579, 0x9DEC, 0xC57A, 0x9DED, 0xC57B, 0x9DEE, + 0xC57C, 0xBEDF, 0xC57D, 0xBEE0, 0xC57E, 0x9DEF, 0xC57F, 0x9DF0, + 0xC580, 0xBEE1, 0xC581, 0x9DF1, 0xC582, 0x9DF2, 0xC583, 0x9DF3, + 0xC584, 0xBEE2, 0xC585, 0x9DF4, 0xC586, 0x9DF5, 0xC587, 0xBEE3, + 0xC588, 0x9DF6, 0xC589, 0x9DF7, 0xC58A, 0x9DF8, 0xC58B, 0x9DF9, + 0xC58C, 0xBEE4, 0xC58D, 0xBEE5, 0xC58E, 0x9DFA, 0xC58F, 0xBEE6, + 0xC590, 0x9DFB, 0xC591, 0xBEE7, 0xC592, 0x9DFC, 0xC593, 0x9DFD, + 0xC594, 0x9DFE, 0xC595, 0xBEE8, 0xC596, 0x9E41, 0xC597, 0xBEE9, + 0xC598, 0xBEEA, 0xC599, 0x9E42, 0xC59A, 0x9E43, 0xC59B, 0x9E44, + 0xC59C, 0xBEEB, 0xC59D, 0x9E45, 0xC59E, 0x9E46, 0xC59F, 0x9E47, + 0xC5A0, 0xBEEC, 0xC5A1, 0x9E48, 0xC5A2, 0x9E49, 0xC5A3, 0x9E4A, + 0xC5A4, 0x9E4B, 0xC5A5, 0x9E4C, 0xC5A6, 0x9E4D, 0xC5A7, 0x9E4E, + 0xC5A8, 0x9E4F, 0xC5A9, 0xBEED, 0xC5AA, 0x9E50, 0xC5AB, 0x9E51, + 0xC5AC, 0x9E52, 0xC5AD, 0x9E53, 0xC5AE, 0x9E54, 0xC5AF, 0x9E55, + 0xC5B0, 0x9E56, 0xC5B1, 0x9E57, 0xC5B2, 0x9E58, 0xC5B3, 0x9E59, + 0xC5B4, 0xBEEE, 0xC5B5, 0xBEEF, 0xC5B6, 0x9E5A, 0xC5B7, 0x9E61, + 0xC5B8, 0xBEF0, 0xC5B9, 0xBEF1, 0xC5BA, 0x9E62, 0xC5BB, 0xBEF2, + 0xC5BC, 0xBEF3, 0xC5BD, 0xBEF4, 0xC5BE, 0xBEF5, 0xC5BF, 0x9E63, + 0xC5C0, 0x9E64, 0xC5C1, 0x9E65, 0xC5C2, 0x9E66, 0xC5C3, 0x9E67, + 0xC5C4, 0xBEF6, 0xC5C5, 0xBEF7, 0xC5C6, 0xBEF8, 0xC5C7, 0xBEF9, + 0xC5C8, 0xBEFA, 0xC5C9, 0xBEFB, 0xC5CA, 0xBEFC, 0xC5CB, 0x9E68, + 0xC5CC, 0xBEFD, 0xC5CD, 0x9E69, 0xC5CE, 0xBEFE, 0xC5CF, 0x9E6A, + 0xC5D0, 0xBFA1, 0xC5D1, 0xBFA2, 0xC5D2, 0x9E6B, 0xC5D3, 0x9E6C, + 0xC5D4, 0xBFA3, 0xC5D5, 0x9E6D, 0xC5D6, 0x9E6E, 0xC5D7, 0x9E6F, + 0xC5D8, 0xBFA4, 0xC5D9, 0x9E70, 0xC5DA, 0x9E71, 0xC5DB, 0x9E72, + 0xC5DC, 0x9E73, 0xC5DD, 0x9E74, 0xC5DE, 0x9E75, 0xC5DF, 0x9E76, + 0xC5E0, 0xBFA5, 0xC5E1, 0xBFA6, 0xC5E2, 0x9E77, 0xC5E3, 0xBFA7, + 0xC5E4, 0x9E78, 0xC5E5, 0xBFA8, 0xC5E6, 0x9E79, 0xC5E7, 0x9E7A, + 0xC5E8, 0x9E81, 0xC5E9, 0x9E82, 0xC5EA, 0x9E83, 0xC5EB, 0x9E84, + 0xC5EC, 0xBFA9, 0xC5ED, 0xBFAA, 0xC5EE, 0xBFAB, 0xC5EF, 0x9E85, + 0xC5F0, 0xBFAC, 0xC5F1, 0x9E86, 0xC5F2, 0x9E87, 0xC5F3, 0x9E88, + 0xC5F4, 0xBFAD, 0xC5F5, 0x9E89, 0xC5F6, 0xBFAE, 0xC5F7, 0xBFAF, + 0xC5F8, 0x9E8A, 0xC5F9, 0x9E8B, 0xC5FA, 0x9E8C, 0xC5FB, 0x9E8D, + 0xC5FC, 0xBFB0, 0xC5FD, 0xBFB1, 0xC5FE, 0xBFB2, 0xC5FF, 0xBFB3, + 0xC600, 0xBFB4, 0xC601, 0xBFB5, 0xC602, 0x9E8E, 0xC603, 0x9E8F, + 0xC604, 0x9E90, 0xC605, 0xBFB6, 0xC606, 0xBFB7, 0xC607, 0xBFB8, + 0xC608, 0xBFB9, 0xC609, 0x9E91, 0xC60A, 0x9E92, 0xC60B, 0x9E93, + 0xC60C, 0xBFBA, 0xC60D, 0x9E94, 0xC60E, 0x9E95, 0xC60F, 0x9E96, + 0xC610, 0xBFBB, 0xC611, 0x9E97, 0xC612, 0x9E98, 0xC613, 0x9E99, + 0xC614, 0x9E9A, 0xC615, 0x9E9B, 0xC616, 0x9E9C, 0xC617, 0x9E9D, + 0xC618, 0xBFBC, 0xC619, 0xBFBD, 0xC61A, 0x9E9E, 0xC61B, 0xBFBE, + 0xC61C, 0xBFBF, 0xC61D, 0x9E9F, 0xC61E, 0x9EA0, 0xC61F, 0x9EA1, + 0xC620, 0x9EA2, 0xC621, 0x9EA3, 0xC622, 0x9EA4, 0xC623, 0x9EA5, + 0xC624, 0xBFC0, 0xC625, 0xBFC1, 0xC626, 0x9EA6, 0xC627, 0x9EA7, + 0xC628, 0xBFC2, 0xC629, 0x9EA8, 0xC62A, 0x9EA9, 0xC62B, 0x9EAA, + 0xC62C, 0xBFC3, 0xC62D, 0xBFC4, 0xC62E, 0xBFC5, 0xC62F, 0x9EAB, + 0xC630, 0xBFC6, 0xC631, 0x9EAC, 0xC632, 0x9EAD, 0xC633, 0xBFC7, + 0xC634, 0xBFC8, 0xC635, 0xBFC9, 0xC636, 0x9EAE, 0xC637, 0xBFCA, + 0xC638, 0x9EAF, 0xC639, 0xBFCB, 0xC63A, 0x9EB0, 0xC63B, 0xBFCC, + 0xC63C, 0x9EB1, 0xC63D, 0x9EB2, 0xC63E, 0x9EB3, 0xC63F, 0x9EB4, + 0xC640, 0xBFCD, 0xC641, 0xBFCE, 0xC642, 0x9EB5, 0xC643, 0x9EB6, + 0xC644, 0xBFCF, 0xC645, 0x9EB7, 0xC646, 0x9EB8, 0xC647, 0x9EB9, + 0xC648, 0xBFD0, 0xC649, 0x9EBA, 0xC64A, 0x9EBB, 0xC64B, 0x9EBC, + 0xC64C, 0x9EBD, 0xC64D, 0x9EBE, 0xC64E, 0x9EBF, 0xC64F, 0x9EC0, + 0xC650, 0xBFD1, 0xC651, 0xBFD2, 0xC652, 0x9EC1, 0xC653, 0xBFD3, + 0xC654, 0xBFD4, 0xC655, 0xBFD5, 0xC656, 0x9EC2, 0xC657, 0x9EC3, + 0xC658, 0x9EC4, 0xC659, 0x9EC5, 0xC65A, 0x9EC6, 0xC65B, 0x9EC7, + 0xC65C, 0xBFD6, 0xC65D, 0xBFD7, 0xC65E, 0x9EC8, 0xC65F, 0x9EC9, + 0xC660, 0xBFD8, 0xC661, 0x9ECA, 0xC662, 0x9ECB, 0xC663, 0x9ECC, + 0xC664, 0x9ECD, 0xC665, 0x9ECE, 0xC666, 0x9ECF, 0xC667, 0x9ED0, + 0xC668, 0x9ED1, 0xC669, 0x9ED2, 0xC66A, 0x9ED3, 0xC66B, 0x9ED4, + 0xC66C, 0xBFD9, 0xC66D, 0x9ED5, 0xC66E, 0x9ED6, 0xC66F, 0xBFDA, + 0xC670, 0x9ED7, 0xC671, 0xBFDB, 0xC672, 0x9ED8, 0xC673, 0x9ED9, + 0xC674, 0x9EDA, 0xC675, 0x9EDB, 0xC676, 0x9EDC, 0xC677, 0x9EDD, + 0xC678, 0xBFDC, 0xC679, 0xBFDD, 0xC67A, 0x9EDE, 0xC67B, 0x9EDF, + 0xC67C, 0xBFDE, 0xC67D, 0x9EE0, 0xC67E, 0x9EE1, 0xC67F, 0x9EE2, + 0xC680, 0xBFDF, 0xC681, 0x9EE3, 0xC682, 0x9EE4, 0xC683, 0x9EE5, + 0xC684, 0x9EE6, 0xC685, 0x9EE7, 0xC686, 0x9EE8, 0xC687, 0x9EE9, + 0xC688, 0xBFE0, 0xC689, 0xBFE1, 0xC68A, 0x9EEA, 0xC68B, 0xBFE2, + 0xC68C, 0x9EEB, 0xC68D, 0xBFE3, 0xC68E, 0x9EEC, 0xC68F, 0x9EED, + 0xC690, 0x9EEE, 0xC691, 0x9EEF, 0xC692, 0x9EF0, 0xC693, 0x9EF1, + 0xC694, 0xBFE4, 0xC695, 0xBFE5, 0xC696, 0x9EF2, 0xC697, 0x9EF3, + 0xC698, 0xBFE6, 0xC699, 0x9EF4, 0xC69A, 0x9EF5, 0xC69B, 0x9EF6, + 0xC69C, 0xBFE7, 0xC69D, 0x9EF7, 0xC69E, 0x9EF8, 0xC69F, 0x9EF9, + 0xC6A0, 0x9EFA, 0xC6A1, 0x9EFB, 0xC6A2, 0x9EFC, 0xC6A3, 0x9EFD, + 0xC6A4, 0xBFE8, 0xC6A5, 0xBFE9, 0xC6A6, 0x9EFE, 0xC6A7, 0xBFEA, + 0xC6A8, 0x9F41, 0xC6A9, 0xBFEB, 0xC6AA, 0x9F42, 0xC6AB, 0x9F43, + 0xC6AC, 0x9F44, 0xC6AD, 0x9F45, 0xC6AE, 0x9F46, 0xC6AF, 0x9F47, + 0xC6B0, 0xBFEC, 0xC6B1, 0xBFED, 0xC6B2, 0x9F48, 0xC6B3, 0x9F49, + 0xC6B4, 0xBFEE, 0xC6B5, 0x9F4A, 0xC6B6, 0x9F4B, 0xC6B7, 0x9F4C, + 0xC6B8, 0xBFEF, 0xC6B9, 0xBFF0, 0xC6BA, 0xBFF1, 0xC6BB, 0x9F4D, + 0xC6BC, 0x9F4E, 0xC6BD, 0x9F4F, 0xC6BE, 0x9F50, 0xC6BF, 0x9F51, + 0xC6C0, 0xBFF2, 0xC6C1, 0xBFF3, 0xC6C2, 0x9F52, 0xC6C3, 0xBFF4, + 0xC6C4, 0x9F53, 0xC6C5, 0xBFF5, 0xC6C6, 0x9F54, 0xC6C7, 0x9F55, + 0xC6C8, 0x9F56, 0xC6C9, 0x9F57, 0xC6CA, 0x9F58, 0xC6CB, 0x9F59, + 0xC6CC, 0xBFF6, 0xC6CD, 0xBFF7, 0xC6CE, 0x9F5A, 0xC6CF, 0x9F61, + 0xC6D0, 0xBFF8, 0xC6D1, 0x9F62, 0xC6D2, 0x9F63, 0xC6D3, 0x9F64, + 0xC6D4, 0xBFF9, 0xC6D5, 0x9F65, 0xC6D6, 0x9F66, 0xC6D7, 0x9F67, + 0xC6D8, 0x9F68, 0xC6D9, 0x9F69, 0xC6DA, 0x9F6A, 0xC6DB, 0x9F6B, + 0xC6DC, 0xBFFA, 0xC6DD, 0xBFFB, 0xC6DE, 0x9F6C, 0xC6DF, 0x9F6D, + 0xC6E0, 0xBFFC, 0xC6E1, 0xBFFD, 0xC6E2, 0x9F6E, 0xC6E3, 0x9F6F, + 0xC6E4, 0x9F70, 0xC6E5, 0x9F71, 0xC6E6, 0x9F72, 0xC6E7, 0x9F73, + 0xC6E8, 0xBFFE, 0xC6E9, 0xC0A1, 0xC6EA, 0x9F74, 0xC6EB, 0x9F75, + 0xC6EC, 0xC0A2, 0xC6ED, 0x9F76, 0xC6EE, 0x9F77, 0xC6EF, 0x9F78, + 0xC6F0, 0xC0A3, 0xC6F1, 0x9F79, 0xC6F2, 0x9F7A, 0xC6F3, 0x9F81, + 0xC6F4, 0x9F82, 0xC6F5, 0x9F83, 0xC6F6, 0x9F84, 0xC6F7, 0x9F85, + 0xC6F8, 0xC0A4, 0xC6F9, 0xC0A5, 0xC6FA, 0x9F86, 0xC6FB, 0x9F87, + 0xC6FC, 0x9F88, 0xC6FD, 0xC0A6, 0xC6FE, 0x9F89, 0xC6FF, 0x9F8A, + 0xC700, 0x9F8B, 0xC701, 0x9F8C, 0xC702, 0x9F8D, 0xC703, 0x9F8E, + 0xC704, 0xC0A7, 0xC705, 0xC0A8, 0xC706, 0x9F8F, 0xC707, 0x9F90, + 0xC708, 0xC0A9, 0xC709, 0x9F91, 0xC70A, 0x9F92, 0xC70B, 0x9F93, + 0xC70C, 0xC0AA, 0xC70D, 0x9F94, 0xC70E, 0x9F95, 0xC70F, 0x9F96, + 0xC710, 0x9F97, 0xC711, 0x9F98, 0xC712, 0x9F99, 0xC713, 0x9F9A, + 0xC714, 0xC0AB, 0xC715, 0xC0AC, 0xC716, 0x9F9B, 0xC717, 0xC0AD, + 0xC718, 0x9F9C, 0xC719, 0xC0AE, 0xC71A, 0x9F9D, 0xC71B, 0x9F9E, + 0xC71C, 0x9F9F, 0xC71D, 0x9FA0, 0xC71E, 0x9FA1, 0xC71F, 0x9FA2, + 0xC720, 0xC0AF, 0xC721, 0xC0B0, 0xC722, 0x9FA3, 0xC723, 0x9FA4, + 0xC724, 0xC0B1, 0xC725, 0x9FA5, 0xC726, 0x9FA6, 0xC727, 0x9FA7, + 0xC728, 0xC0B2, 0xC729, 0x9FA8, 0xC72A, 0x9FA9, 0xC72B, 0x9FAA, + 0xC72C, 0x9FAB, 0xC72D, 0x9FAC, 0xC72E, 0x9FAD, 0xC72F, 0x9FAE, + 0xC730, 0xC0B3, 0xC731, 0xC0B4, 0xC732, 0x9FAF, 0xC733, 0xC0B5, + 0xC734, 0x9FB0, 0xC735, 0xC0B6, 0xC736, 0x9FB1, 0xC737, 0xC0B7, + 0xC738, 0x9FB2, 0xC739, 0x9FB3, 0xC73A, 0x9FB4, 0xC73B, 0x9FB5, + 0xC73C, 0xC0B8, 0xC73D, 0xC0B9, 0xC73E, 0x9FB6, 0xC73F, 0x9FB7, + 0xC740, 0xC0BA, 0xC741, 0x9FB8, 0xC742, 0x9FB9, 0xC743, 0x9FBA, + 0xC744, 0xC0BB, 0xC745, 0x9FBB, 0xC746, 0x9FBC, 0xC747, 0x9FBD, + 0xC748, 0x9FBE, 0xC749, 0x9FBF, 0xC74A, 0xC0BC, 0xC74B, 0x9FC0, + 0xC74C, 0xC0BD, 0xC74D, 0xC0BE, 0xC74E, 0x9FC1, 0xC74F, 0xC0BF, + 0xC750, 0x9FC2, 0xC751, 0xC0C0, 0xC752, 0xC0C1, 0xC753, 0xC0C2, + 0xC754, 0xC0C3, 0xC755, 0xC0C4, 0xC756, 0xC0C5, 0xC757, 0xC0C6, + 0xC758, 0xC0C7, 0xC759, 0x9FC3, 0xC75A, 0x9FC4, 0xC75B, 0x9FC5, + 0xC75C, 0xC0C8, 0xC75D, 0x9FC6, 0xC75E, 0x9FC7, 0xC75F, 0x9FC8, + 0xC760, 0xC0C9, 0xC761, 0x9FC9, 0xC762, 0x9FCA, 0xC763, 0x9FCB, + 0xC764, 0x9FCC, 0xC765, 0x9FCD, 0xC766, 0x9FCE, 0xC767, 0x9FCF, + 0xC768, 0xC0CA, 0xC769, 0x9FD0, 0xC76A, 0x9FD1, 0xC76B, 0xC0CB, + 0xC76C, 0x9FD2, 0xC76D, 0x9FD3, 0xC76E, 0x9FD4, 0xC76F, 0x9FD5, + 0xC770, 0x9FD6, 0xC771, 0x9FD7, 0xC772, 0x9FD8, 0xC773, 0x9FD9, + 0xC774, 0xC0CC, 0xC775, 0xC0CD, 0xC776, 0x9FDA, 0xC777, 0x9FDB, + 0xC778, 0xC0CE, 0xC779, 0x9FDC, 0xC77A, 0x9FDD, 0xC77B, 0x9FDE, + 0xC77C, 0xC0CF, 0xC77D, 0xC0D0, 0xC77E, 0xC0D1, 0xC77F, 0x9FDF, + 0xC780, 0x9FE0, 0xC781, 0x9FE1, 0xC782, 0x9FE2, 0xC783, 0xC0D2, + 0xC784, 0xC0D3, 0xC785, 0xC0D4, 0xC786, 0x9FE3, 0xC787, 0xC0D5, + 0xC788, 0xC0D6, 0xC789, 0xC0D7, 0xC78A, 0xC0D8, 0xC78B, 0x9FE4, + 0xC78C, 0x9FE5, 0xC78D, 0x9FE6, 0xC78E, 0xC0D9, 0xC78F, 0x9FE7, + 0xC790, 0xC0DA, 0xC791, 0xC0DB, 0xC792, 0x9FE8, 0xC793, 0x9FE9, + 0xC794, 0xC0DC, 0xC795, 0x9FEA, 0xC796, 0xC0DD, 0xC797, 0xC0DE, + 0xC798, 0xC0DF, 0xC799, 0x9FEB, 0xC79A, 0xC0E0, 0xC79B, 0x9FEC, + 0xC79C, 0x9FED, 0xC79D, 0x9FEE, 0xC79E, 0x9FEF, 0xC79F, 0x9FF0, + 0xC7A0, 0xC0E1, 0xC7A1, 0xC0E2, 0xC7A2, 0x9FF1, 0xC7A3, 0xC0E3, + 0xC7A4, 0xC0E4, 0xC7A5, 0xC0E5, 0xC7A6, 0xC0E6, 0xC7A7, 0x9FF2, + 0xC7A8, 0x9FF3, 0xC7A9, 0x9FF4, 0xC7AA, 0x9FF5, 0xC7AB, 0x9FF6, + 0xC7AC, 0xC0E7, 0xC7AD, 0xC0E8, 0xC7AE, 0x9FF7, 0xC7AF, 0x9FF8, + 0xC7B0, 0xC0E9, 0xC7B1, 0x9FF9, 0xC7B2, 0x9FFA, 0xC7B3, 0x9FFB, + 0xC7B4, 0xC0EA, 0xC7B5, 0x9FFC, 0xC7B6, 0x9FFD, 0xC7B7, 0x9FFE, + 0xC7B8, 0xA041, 0xC7B9, 0xA042, 0xC7BA, 0xA043, 0xC7BB, 0xA044, + 0xC7BC, 0xC0EB, 0xC7BD, 0xC0EC, 0xC7BE, 0xA045, 0xC7BF, 0xC0ED, + 0xC7C0, 0xC0EE, 0xC7C1, 0xC0EF, 0xC7C2, 0xA046, 0xC7C3, 0xA047, + 0xC7C4, 0xA048, 0xC7C5, 0xA049, 0xC7C6, 0xA04A, 0xC7C7, 0xA04B, + 0xC7C8, 0xC0F0, 0xC7C9, 0xC0F1, 0xC7CA, 0xA04C, 0xC7CB, 0xA04D, + 0xC7CC, 0xC0F2, 0xC7CD, 0xA04E, 0xC7CE, 0xC0F3, 0xC7CF, 0xA04F, + 0xC7D0, 0xC0F4, 0xC7D1, 0xA050, 0xC7D2, 0xA051, 0xC7D3, 0xA052, + 0xC7D4, 0xA053, 0xC7D5, 0xA054, 0xC7D6, 0xA055, 0xC7D7, 0xA056, + 0xC7D8, 0xC0F5, 0xC7D9, 0xA057, 0xC7DA, 0xA058, 0xC7DB, 0xA059, + 0xC7DC, 0xA05A, 0xC7DD, 0xC0F6, 0xC7DE, 0xA061, 0xC7DF, 0xA062, + 0xC7E0, 0xA063, 0xC7E1, 0xA064, 0xC7E2, 0xA065, 0xC7E3, 0xA066, + 0xC7E4, 0xC0F7, 0xC7E5, 0xA067, 0xC7E6, 0xA068, 0xC7E7, 0xA069, + 0xC7E8, 0xC0F8, 0xC7E9, 0xA06A, 0xC7EA, 0xA06B, 0xC7EB, 0xA06C, + 0xC7EC, 0xC0F9, 0xC7ED, 0xA06D, 0xC7EE, 0xA06E, 0xC7EF, 0xA06F, + 0xC7F0, 0xA070, 0xC7F1, 0xA071, 0xC7F2, 0xA072, 0xC7F3, 0xA073, + 0xC7F4, 0xA074, 0xC7F5, 0xA075, 0xC7F6, 0xA076, 0xC7F7, 0xA077, + 0xC7F8, 0xA078, 0xC7F9, 0xA079, 0xC7FA, 0xA07A, 0xC7FB, 0xA081, + 0xC7FC, 0xA082, 0xC7FD, 0xA083, 0xC7FE, 0xA084, 0xC7FF, 0xA085, + 0xC800, 0xC0FA, 0xC801, 0xC0FB, 0xC802, 0xA086, 0xC803, 0xA087, + 0xC804, 0xC0FC, 0xC805, 0xA088, 0xC806, 0xA089, 0xC807, 0xA08A, + 0xC808, 0xC0FD, 0xC809, 0xA08B, 0xC80A, 0xC0FE, 0xC80B, 0xA08C, + 0xC80C, 0xA08D, 0xC80D, 0xA08E, 0xC80E, 0xA08F, 0xC80F, 0xA090, + 0xC810, 0xC1A1, 0xC811, 0xC1A2, 0xC812, 0xA091, 0xC813, 0xC1A3, + 0xC814, 0xA092, 0xC815, 0xC1A4, 0xC816, 0xC1A5, 0xC817, 0xA093, + 0xC818, 0xA094, 0xC819, 0xA095, 0xC81A, 0xA096, 0xC81B, 0xA097, + 0xC81C, 0xC1A6, 0xC81D, 0xC1A7, 0xC81E, 0xA098, 0xC81F, 0xA099, + 0xC820, 0xC1A8, 0xC821, 0xA09A, 0xC822, 0xA09B, 0xC823, 0xA09C, + 0xC824, 0xC1A9, 0xC825, 0xA09D, 0xC826, 0xA09E, 0xC827, 0xA09F, + 0xC828, 0xA0A0, 0xC829, 0xA0A1, 0xC82A, 0xA0A2, 0xC82B, 0xA0A3, + 0xC82C, 0xC1AA, 0xC82D, 0xC1AB, 0xC82E, 0xA0A4, 0xC82F, 0xC1AC, + 0xC830, 0xA0A5, 0xC831, 0xC1AD, 0xC832, 0xA0A6, 0xC833, 0xA0A7, + 0xC834, 0xA0A8, 0xC835, 0xA0A9, 0xC836, 0xA0AA, 0xC837, 0xA0AB, + 0xC838, 0xC1AE, 0xC839, 0xA0AC, 0xC83A, 0xA0AD, 0xC83B, 0xA0AE, + 0xC83C, 0xC1AF, 0xC83D, 0xA0AF, 0xC83E, 0xA0B0, 0xC83F, 0xA0B1, + 0xC840, 0xC1B0, 0xC841, 0xA0B2, 0xC842, 0xA0B3, 0xC843, 0xA0B4, + 0xC844, 0xA0B5, 0xC845, 0xA0B6, 0xC846, 0xA0B7, 0xC847, 0xA0B8, + 0xC848, 0xC1B1, 0xC849, 0xC1B2, 0xC84A, 0xA0B9, 0xC84B, 0xA0BA, + 0xC84C, 0xC1B3, 0xC84D, 0xC1B4, 0xC84E, 0xA0BB, 0xC84F, 0xA0BC, + 0xC850, 0xA0BD, 0xC851, 0xA0BE, 0xC852, 0xA0BF, 0xC853, 0xA0C0, + 0xC854, 0xC1B5, 0xC855, 0xA0C1, 0xC856, 0xA0C2, 0xC857, 0xA0C3, + 0xC858, 0xA0C4, 0xC859, 0xA0C5, 0xC85A, 0xA0C6, 0xC85B, 0xA0C7, + 0xC85C, 0xA0C8, 0xC85D, 0xA0C9, 0xC85E, 0xA0CA, 0xC85F, 0xA0CB, + 0xC860, 0xA0CC, 0xC861, 0xA0CD, 0xC862, 0xA0CE, 0xC863, 0xA0CF, + 0xC864, 0xA0D0, 0xC865, 0xA0D1, 0xC866, 0xA0D2, 0xC867, 0xA0D3, + 0xC868, 0xA0D4, 0xC869, 0xA0D5, 0xC86A, 0xA0D6, 0xC86B, 0xA0D7, + 0xC86C, 0xA0D8, 0xC86D, 0xA0D9, 0xC86E, 0xA0DA, 0xC86F, 0xA0DB, + 0xC870, 0xC1B6, 0xC871, 0xC1B7, 0xC872, 0xA0DC, 0xC873, 0xA0DD, + 0xC874, 0xC1B8, 0xC875, 0xA0DE, 0xC876, 0xA0DF, 0xC877, 0xA0E0, + 0xC878, 0xC1B9, 0xC879, 0xA0E1, 0xC87A, 0xC1BA, 0xC87B, 0xA0E2, + 0xC87C, 0xA0E3, 0xC87D, 0xA0E4, 0xC87E, 0xA0E5, 0xC87F, 0xA0E6, + 0xC880, 0xC1BB, 0xC881, 0xC1BC, 0xC882, 0xA0E7, 0xC883, 0xC1BD, + 0xC884, 0xA0E8, 0xC885, 0xC1BE, 0xC886, 0xC1BF, 0xC887, 0xC1C0, + 0xC888, 0xA0E9, 0xC889, 0xA0EA, 0xC88A, 0xA0EB, 0xC88B, 0xC1C1, + 0xC88C, 0xC1C2, 0xC88D, 0xC1C3, 0xC88E, 0xA0EC, 0xC88F, 0xA0ED, + 0xC890, 0xA0EE, 0xC891, 0xA0EF, 0xC892, 0xA0F0, 0xC893, 0xA0F1, + 0xC894, 0xC1C4, 0xC895, 0xA0F2, 0xC896, 0xA0F3, 0xC897, 0xA0F4, + 0xC898, 0xA0F5, 0xC899, 0xA0F6, 0xC89A, 0xA0F7, 0xC89B, 0xA0F8, + 0xC89C, 0xA0F9, 0xC89D, 0xC1C5, 0xC89E, 0xA0FA, 0xC89F, 0xC1C6, + 0xC8A0, 0xA0FB, 0xC8A1, 0xC1C7, 0xC8A2, 0xA0FC, 0xC8A3, 0xA0FD, + 0xC8A4, 0xA0FE, 0xC8A5, 0xA141, 0xC8A6, 0xA142, 0xC8A7, 0xA143, + 0xC8A8, 0xC1C8, 0xC8A9, 0xA144, 0xC8AA, 0xA145, 0xC8AB, 0xA146, + 0xC8AC, 0xA147, 0xC8AD, 0xA148, 0xC8AE, 0xA149, 0xC8AF, 0xA14A, + 0xC8B0, 0xA14B, 0xC8B1, 0xA14C, 0xC8B2, 0xA14D, 0xC8B3, 0xA14E, + 0xC8B4, 0xA14F, 0xC8B5, 0xA150, 0xC8B6, 0xA151, 0xC8B7, 0xA152, + 0xC8B8, 0xA153, 0xC8B9, 0xA154, 0xC8BA, 0xA155, 0xC8BB, 0xA156, + 0xC8BC, 0xC1C9, 0xC8BD, 0xC1CA, 0xC8BE, 0xA157, 0xC8BF, 0xA158, + 0xC8C0, 0xA159, 0xC8C1, 0xA15A, 0xC8C2, 0xA161, 0xC8C3, 0xA162, + 0xC8C4, 0xC1CB, 0xC8C5, 0xA163, 0xC8C6, 0xA164, 0xC8C7, 0xA165, + 0xC8C8, 0xC1CC, 0xC8C9, 0xA166, 0xC8CA, 0xA167, 0xC8CB, 0xA168, + 0xC8CC, 0xC1CD, 0xC8CD, 0xA169, 0xC8CE, 0xA16A, 0xC8CF, 0xA16B, + 0xC8D0, 0xA16C, 0xC8D1, 0xA16D, 0xC8D2, 0xA16E, 0xC8D3, 0xA16F, + 0xC8D4, 0xC1CE, 0xC8D5, 0xC1CF, 0xC8D6, 0xA170, 0xC8D7, 0xC1D0, + 0xC8D8, 0xA171, 0xC8D9, 0xC1D1, 0xC8DA, 0xA172, 0xC8DB, 0xA173, + 0xC8DC, 0xA174, 0xC8DD, 0xA175, 0xC8DE, 0xA176, 0xC8DF, 0xA177, + 0xC8E0, 0xC1D2, 0xC8E1, 0xC1D3, 0xC8E2, 0xA178, 0xC8E3, 0xA179, + 0xC8E4, 0xC1D4, 0xC8E5, 0xA17A, 0xC8E6, 0xA181, 0xC8E7, 0xA182, + 0xC8E8, 0xA183, 0xC8E9, 0xA184, 0xC8EA, 0xA185, 0xC8EB, 0xA186, + 0xC8EC, 0xA187, 0xC8ED, 0xA188, 0xC8EE, 0xA189, 0xC8EF, 0xA18A, + 0xC8F0, 0xA18B, 0xC8F1, 0xA18C, 0xC8F2, 0xA18D, 0xC8F3, 0xA18E, + 0xC8F4, 0xA18F, 0xC8F5, 0xC1D5, 0xC8F6, 0xA190, 0xC8F7, 0xA191, + 0xC8F8, 0xA192, 0xC8F9, 0xA193, 0xC8FA, 0xA194, 0xC8FB, 0xA195, + 0xC8FC, 0xC1D6, 0xC8FD, 0xC1D7, 0xC8FE, 0xA196, 0xC8FF, 0xA197, + 0xC900, 0xC1D8, 0xC901, 0xA198, 0xC902, 0xA199, 0xC903, 0xA19A, + 0xC904, 0xC1D9, 0xC905, 0xC1DA, 0xC906, 0xC1DB, 0xC907, 0xA19B, + 0xC908, 0xA19C, 0xC909, 0xA19D, 0xC90A, 0xA19E, 0xC90B, 0xA19F, + 0xC90C, 0xC1DC, 0xC90D, 0xC1DD, 0xC90E, 0xA1A0, 0xC90F, 0xC1DE, + 0xC910, 0xA241, 0xC911, 0xC1DF, 0xC912, 0xA242, 0xC913, 0xA243, + 0xC914, 0xA244, 0xC915, 0xA245, 0xC916, 0xA246, 0xC917, 0xA247, + 0xC918, 0xC1E0, 0xC919, 0xA248, 0xC91A, 0xA249, 0xC91B, 0xA24A, + 0xC91C, 0xA24B, 0xC91D, 0xA24C, 0xC91E, 0xA24D, 0xC91F, 0xA24E, + 0xC920, 0xA24F, 0xC921, 0xA250, 0xC922, 0xA251, 0xC923, 0xA252, + 0xC924, 0xA253, 0xC925, 0xA254, 0xC926, 0xA255, 0xC927, 0xA256, + 0xC928, 0xA257, 0xC929, 0xA258, 0xC92A, 0xA259, 0xC92B, 0xA25A, + 0xC92C, 0xC1E1, 0xC92D, 0xA261, 0xC92E, 0xA262, 0xC92F, 0xA263, + 0xC930, 0xA264, 0xC931, 0xA265, 0xC932, 0xA266, 0xC933, 0xA267, + 0xC934, 0xC1E2, 0xC935, 0xA268, 0xC936, 0xA269, 0xC937, 0xA26A, + 0xC938, 0xA26B, 0xC939, 0xA26C, 0xC93A, 0xA26D, 0xC93B, 0xA26E, + 0xC93C, 0xA26F, 0xC93D, 0xA270, 0xC93E, 0xA271, 0xC93F, 0xA272, + 0xC940, 0xA273, 0xC941, 0xA274, 0xC942, 0xA275, 0xC943, 0xA276, + 0xC944, 0xA277, 0xC945, 0xA278, 0xC946, 0xA279, 0xC947, 0xA27A, + 0xC948, 0xA281, 0xC949, 0xA282, 0xC94A, 0xA283, 0xC94B, 0xA284, + 0xC94C, 0xA285, 0xC94D, 0xA286, 0xC94E, 0xA287, 0xC94F, 0xA288, + 0xC950, 0xC1E3, 0xC951, 0xC1E4, 0xC952, 0xA289, 0xC953, 0xA28A, + 0xC954, 0xC1E5, 0xC955, 0xA28B, 0xC956, 0xA28C, 0xC957, 0xA28D, + 0xC958, 0xC1E6, 0xC959, 0xA28E, 0xC95A, 0xA28F, 0xC95B, 0xA290, + 0xC95C, 0xA291, 0xC95D, 0xA292, 0xC95E, 0xA293, 0xC95F, 0xA294, + 0xC960, 0xC1E7, 0xC961, 0xC1E8, 0xC962, 0xA295, 0xC963, 0xC1E9, + 0xC964, 0xA296, 0xC965, 0xA297, 0xC966, 0xA298, 0xC967, 0xA299, + 0xC968, 0xA29A, 0xC969, 0xA29B, 0xC96A, 0xA29C, 0xC96B, 0xA29D, + 0xC96C, 0xC1EA, 0xC96D, 0xA29E, 0xC96E, 0xA29F, 0xC96F, 0xA2A0, + 0xC970, 0xC1EB, 0xC971, 0xA341, 0xC972, 0xA342, 0xC973, 0xA343, + 0xC974, 0xC1EC, 0xC975, 0xA344, 0xC976, 0xA345, 0xC977, 0xA346, + 0xC978, 0xA347, 0xC979, 0xA348, 0xC97A, 0xA349, 0xC97B, 0xA34A, + 0xC97C, 0xC1ED, 0xC97D, 0xA34B, 0xC97E, 0xA34C, 0xC97F, 0xA34D, + 0xC980, 0xA34E, 0xC981, 0xA34F, 0xC982, 0xA350, 0xC983, 0xA351, + 0xC984, 0xA352, 0xC985, 0xA353, 0xC986, 0xA354, 0xC987, 0xA355, + 0xC988, 0xC1EE, 0xC989, 0xC1EF, 0xC98A, 0xA356, 0xC98B, 0xA357, + 0xC98C, 0xC1F0, 0xC98D, 0xA358, 0xC98E, 0xA359, 0xC98F, 0xA35A, + 0xC990, 0xC1F1, 0xC991, 0xA361, 0xC992, 0xA362, 0xC993, 0xA363, + 0xC994, 0xA364, 0xC995, 0xA365, 0xC996, 0xA366, 0xC997, 0xA367, + 0xC998, 0xC1F2, 0xC999, 0xC1F3, 0xC99A, 0xA368, 0xC99B, 0xC1F4, + 0xC99C, 0xA369, 0xC99D, 0xC1F5, 0xC99E, 0xA36A, 0xC99F, 0xA36B, + 0xC9A0, 0xA36C, 0xC9A1, 0xA36D, 0xC9A2, 0xA36E, 0xC9A3, 0xA36F, + 0xC9A4, 0xA370, 0xC9A5, 0xA371, 0xC9A6, 0xA372, 0xC9A7, 0xA373, + 0xC9A8, 0xA374, 0xC9A9, 0xA375, 0xC9AA, 0xA376, 0xC9AB, 0xA377, + 0xC9AC, 0xA378, 0xC9AD, 0xA379, 0xC9AE, 0xA37A, 0xC9AF, 0xA381, + 0xC9B0, 0xA382, 0xC9B1, 0xA383, 0xC9B2, 0xA384, 0xC9B3, 0xA385, + 0xC9B4, 0xA386, 0xC9B5, 0xA387, 0xC9B6, 0xA388, 0xC9B7, 0xA389, + 0xC9B8, 0xA38A, 0xC9B9, 0xA38B, 0xC9BA, 0xA38C, 0xC9BB, 0xA38D, + 0xC9BC, 0xA38E, 0xC9BD, 0xA38F, 0xC9BE, 0xA390, 0xC9BF, 0xA391, + 0xC9C0, 0xC1F6, 0xC9C1, 0xC1F7, 0xC9C2, 0xA392, 0xC9C3, 0xA393, + 0xC9C4, 0xC1F8, 0xC9C5, 0xA394, 0xC9C6, 0xA395, 0xC9C7, 0xC1F9, + 0xC9C8, 0xC1FA, 0xC9C9, 0xA396, 0xC9CA, 0xC1FB, 0xC9CB, 0xA397, + 0xC9CC, 0xA398, 0xC9CD, 0xA399, 0xC9CE, 0xA39A, 0xC9CF, 0xA39B, + 0xC9D0, 0xC1FC, 0xC9D1, 0xC1FD, 0xC9D2, 0xA39C, 0xC9D3, 0xC1FE, + 0xC9D4, 0xA39D, 0xC9D5, 0xC2A1, 0xC9D6, 0xC2A2, 0xC9D7, 0xA39E, + 0xC9D8, 0xA39F, 0xC9D9, 0xC2A3, 0xC9DA, 0xC2A4, 0xC9DB, 0xA3A0, + 0xC9DC, 0xC2A5, 0xC9DD, 0xC2A6, 0xC9DE, 0xA441, 0xC9DF, 0xA442, + 0xC9E0, 0xC2A7, 0xC9E1, 0xA443, 0xC9E2, 0xC2A8, 0xC9E3, 0xA444, + 0xC9E4, 0xC2A9, 0xC9E5, 0xA445, 0xC9E6, 0xA446, 0xC9E7, 0xC2AA, + 0xC9E8, 0xA447, 0xC9E9, 0xA448, 0xC9EA, 0xA449, 0xC9EB, 0xA44A, + 0xC9EC, 0xC2AB, 0xC9ED, 0xC2AC, 0xC9EE, 0xA44B, 0xC9EF, 0xC2AD, + 0xC9F0, 0xC2AE, 0xC9F1, 0xC2AF, 0xC9F2, 0xA44C, 0xC9F3, 0xA44D, + 0xC9F4, 0xA44E, 0xC9F5, 0xA44F, 0xC9F6, 0xA450, 0xC9F7, 0xA451, + 0xC9F8, 0xC2B0, 0xC9F9, 0xC2B1, 0xC9FA, 0xA452, 0xC9FB, 0xA453, + 0xC9FC, 0xC2B2, 0xC9FD, 0xA454, 0xC9FE, 0xA455, 0xC9FF, 0xA456, + 0xCA00, 0xC2B3, 0xCA01, 0xA457, 0xCA02, 0xA458, 0xCA03, 0xA459, + 0xCA04, 0xA45A, 0xCA05, 0xA461, 0xCA06, 0xA462, 0xCA07, 0xA463, + 0xCA08, 0xC2B4, 0xCA09, 0xC2B5, 0xCA0A, 0xA464, 0xCA0B, 0xC2B6, + 0xCA0C, 0xC2B7, 0xCA0D, 0xC2B8, 0xCA0E, 0xA465, 0xCA0F, 0xA466, + 0xCA10, 0xA467, 0xCA11, 0xA468, 0xCA12, 0xA469, 0xCA13, 0xA46A, + 0xCA14, 0xC2B9, 0xCA15, 0xA46B, 0xCA16, 0xA46C, 0xCA17, 0xA46D, + 0xCA18, 0xC2BA, 0xCA19, 0xA46E, 0xCA1A, 0xA46F, 0xCA1B, 0xA470, + 0xCA1C, 0xA471, 0xCA1D, 0xA472, 0xCA1E, 0xA473, 0xCA1F, 0xA474, + 0xCA20, 0xA475, 0xCA21, 0xA476, 0xCA22, 0xA477, 0xCA23, 0xA478, + 0xCA24, 0xA479, 0xCA25, 0xA47A, 0xCA26, 0xA481, 0xCA27, 0xA482, + 0xCA28, 0xA483, 0xCA29, 0xC2BB, 0xCA2A, 0xA484, 0xCA2B, 0xA485, + 0xCA2C, 0xA486, 0xCA2D, 0xA487, 0xCA2E, 0xA488, 0xCA2F, 0xA489, + 0xCA30, 0xA48A, 0xCA31, 0xA48B, 0xCA32, 0xA48C, 0xCA33, 0xA48D, + 0xCA34, 0xA48E, 0xCA35, 0xA48F, 0xCA36, 0xA490, 0xCA37, 0xA491, + 0xCA38, 0xA492, 0xCA39, 0xA493, 0xCA3A, 0xA494, 0xCA3B, 0xA495, + 0xCA3C, 0xA496, 0xCA3D, 0xA497, 0xCA3E, 0xA498, 0xCA3F, 0xA499, + 0xCA40, 0xA49A, 0xCA41, 0xA49B, 0xCA42, 0xA49C, 0xCA43, 0xA49D, + 0xCA44, 0xA49E, 0xCA45, 0xA49F, 0xCA46, 0xA4A0, 0xCA47, 0xA541, + 0xCA48, 0xA542, 0xCA49, 0xA543, 0xCA4A, 0xA544, 0xCA4B, 0xA545, + 0xCA4C, 0xC2BC, 0xCA4D, 0xC2BD, 0xCA4E, 0xA546, 0xCA4F, 0xA547, + 0xCA50, 0xC2BE, 0xCA51, 0xA548, 0xCA52, 0xA549, 0xCA53, 0xA54A, + 0xCA54, 0xC2BF, 0xCA55, 0xA54B, 0xCA56, 0xA54C, 0xCA57, 0xA54D, + 0xCA58, 0xA54E, 0xCA59, 0xA54F, 0xCA5A, 0xA550, 0xCA5B, 0xA551, + 0xCA5C, 0xC2C0, 0xCA5D, 0xC2C1, 0xCA5E, 0xA552, 0xCA5F, 0xC2C2, + 0xCA60, 0xC2C3, 0xCA61, 0xC2C4, 0xCA62, 0xA553, 0xCA63, 0xA554, + 0xCA64, 0xA555, 0xCA65, 0xA556, 0xCA66, 0xA557, 0xCA67, 0xA558, + 0xCA68, 0xC2C5, 0xCA69, 0xA559, 0xCA6A, 0xA55A, 0xCA6B, 0xA561, + 0xCA6C, 0xA562, 0xCA6D, 0xA563, 0xCA6E, 0xA564, 0xCA6F, 0xA565, + 0xCA70, 0xA566, 0xCA71, 0xA567, 0xCA72, 0xA568, 0xCA73, 0xA569, + 0xCA74, 0xA56A, 0xCA75, 0xA56B, 0xCA76, 0xA56C, 0xCA77, 0xA56D, + 0xCA78, 0xA56E, 0xCA79, 0xA56F, 0xCA7A, 0xA570, 0xCA7B, 0xA571, + 0xCA7C, 0xA572, 0xCA7D, 0xC2C6, 0xCA7E, 0xA573, 0xCA7F, 0xA574, + 0xCA80, 0xA575, 0xCA81, 0xA576, 0xCA82, 0xA577, 0xCA83, 0xA578, + 0xCA84, 0xC2C7, 0xCA85, 0xA579, 0xCA86, 0xA57A, 0xCA87, 0xA581, + 0xCA88, 0xA582, 0xCA89, 0xA583, 0xCA8A, 0xA584, 0xCA8B, 0xA585, + 0xCA8C, 0xA586, 0xCA8D, 0xA587, 0xCA8E, 0xA588, 0xCA8F, 0xA589, + 0xCA90, 0xA58A, 0xCA91, 0xA58B, 0xCA92, 0xA58C, 0xCA93, 0xA58D, + 0xCA94, 0xA58E, 0xCA95, 0xA58F, 0xCA96, 0xA590, 0xCA97, 0xA591, + 0xCA98, 0xC2C8, 0xCA99, 0xA592, 0xCA9A, 0xA593, 0xCA9B, 0xA594, + 0xCA9C, 0xA595, 0xCA9D, 0xA596, 0xCA9E, 0xA597, 0xCA9F, 0xA598, + 0xCAA0, 0xA599, 0xCAA1, 0xA59A, 0xCAA2, 0xA59B, 0xCAA3, 0xA59C, + 0xCAA4, 0xA59D, 0xCAA5, 0xA59E, 0xCAA6, 0xA59F, 0xCAA7, 0xA5A0, + 0xCAA8, 0xA641, 0xCAA9, 0xA642, 0xCAAA, 0xA643, 0xCAAB, 0xA644, + 0xCAAC, 0xA645, 0xCAAD, 0xA646, 0xCAAE, 0xA647, 0xCAAF, 0xA648, + 0xCAB0, 0xA649, 0xCAB1, 0xA64A, 0xCAB2, 0xA64B, 0xCAB3, 0xA64C, + 0xCAB4, 0xA64D, 0xCAB5, 0xA64E, 0xCAB6, 0xA64F, 0xCAB7, 0xA650, + 0xCAB8, 0xA651, 0xCAB9, 0xA652, 0xCABA, 0xA653, 0xCABB, 0xA654, + 0xCABC, 0xC2C9, 0xCABD, 0xC2CA, 0xCABE, 0xA655, 0xCABF, 0xA656, + 0xCAC0, 0xC2CB, 0xCAC1, 0xA657, 0xCAC2, 0xA658, 0xCAC3, 0xA659, + 0xCAC4, 0xC2CC, 0xCAC5, 0xA65A, 0xCAC6, 0xA661, 0xCAC7, 0xA662, + 0xCAC8, 0xA663, 0xCAC9, 0xA664, 0xCACA, 0xA665, 0xCACB, 0xA666, + 0xCACC, 0xC2CD, 0xCACD, 0xC2CE, 0xCACE, 0xA667, 0xCACF, 0xC2CF, + 0xCAD0, 0xA668, 0xCAD1, 0xC2D0, 0xCAD2, 0xA669, 0xCAD3, 0xC2D1, + 0xCAD4, 0xA66A, 0xCAD5, 0xA66B, 0xCAD6, 0xA66C, 0xCAD7, 0xA66D, + 0xCAD8, 0xC2D2, 0xCAD9, 0xC2D3, 0xCADA, 0xA66E, 0xCADB, 0xA66F, + 0xCADC, 0xA670, 0xCADD, 0xA671, 0xCADE, 0xA672, 0xCADF, 0xA673, + 0xCAE0, 0xC2D4, 0xCAE1, 0xA674, 0xCAE2, 0xA675, 0xCAE3, 0xA676, + 0xCAE4, 0xA677, 0xCAE5, 0xA678, 0xCAE6, 0xA679, 0xCAE7, 0xA67A, + 0xCAE8, 0xA681, 0xCAE9, 0xA682, 0xCAEA, 0xA683, 0xCAEB, 0xA684, + 0xCAEC, 0xC2D5, 0xCAED, 0xA685, 0xCAEE, 0xA686, 0xCAEF, 0xA687, + 0xCAF0, 0xA688, 0xCAF1, 0xA689, 0xCAF2, 0xA68A, 0xCAF3, 0xA68B, + 0xCAF4, 0xC2D6, 0xCAF5, 0xA68C, 0xCAF6, 0xA68D, 0xCAF7, 0xA68E, + 0xCAF8, 0xA68F, 0xCAF9, 0xA690, 0xCAFA, 0xA691, 0xCAFB, 0xA692, + 0xCAFC, 0xA693, 0xCAFD, 0xA694, 0xCAFE, 0xA695, 0xCAFF, 0xA696, + 0xCB00, 0xA697, 0xCB01, 0xA698, 0xCB02, 0xA699, 0xCB03, 0xA69A, + 0xCB04, 0xA69B, 0xCB05, 0xA69C, 0xCB06, 0xA69D, 0xCB07, 0xA69E, + 0xCB08, 0xC2D7, 0xCB09, 0xA69F, 0xCB0A, 0xA6A0, 0xCB0B, 0xA741, + 0xCB0C, 0xA742, 0xCB0D, 0xA743, 0xCB0E, 0xA744, 0xCB0F, 0xA745, + 0xCB10, 0xC2D8, 0xCB11, 0xA746, 0xCB12, 0xA747, 0xCB13, 0xA748, + 0xCB14, 0xC2D9, 0xCB15, 0xA749, 0xCB16, 0xA74A, 0xCB17, 0xA74B, + 0xCB18, 0xC2DA, 0xCB19, 0xA74C, 0xCB1A, 0xA74D, 0xCB1B, 0xA74E, + 0xCB1C, 0xA74F, 0xCB1D, 0xA750, 0xCB1E, 0xA751, 0xCB1F, 0xA752, + 0xCB20, 0xC2DB, 0xCB21, 0xC2DC, 0xCB22, 0xA753, 0xCB23, 0xA754, + 0xCB24, 0xA755, 0xCB25, 0xA756, 0xCB26, 0xA757, 0xCB27, 0xA758, + 0xCB28, 0xA759, 0xCB29, 0xA75A, 0xCB2A, 0xA761, 0xCB2B, 0xA762, + 0xCB2C, 0xA763, 0xCB2D, 0xA764, 0xCB2E, 0xA765, 0xCB2F, 0xA766, + 0xCB30, 0xA767, 0xCB31, 0xA768, 0xCB32, 0xA769, 0xCB33, 0xA76A, + 0xCB34, 0xA76B, 0xCB35, 0xA76C, 0xCB36, 0xA76D, 0xCB37, 0xA76E, + 0xCB38, 0xA76F, 0xCB39, 0xA770, 0xCB3A, 0xA771, 0xCB3B, 0xA772, + 0xCB3C, 0xA773, 0xCB3D, 0xA774, 0xCB3E, 0xA775, 0xCB3F, 0xA776, + 0xCB40, 0xA777, 0xCB41, 0xC2DD, 0xCB42, 0xA778, 0xCB43, 0xA779, + 0xCB44, 0xA77A, 0xCB45, 0xA781, 0xCB46, 0xA782, 0xCB47, 0xA783, + 0xCB48, 0xC2DE, 0xCB49, 0xC2DF, 0xCB4A, 0xA784, 0xCB4B, 0xA785, + 0xCB4C, 0xC2E0, 0xCB4D, 0xA786, 0xCB4E, 0xA787, 0xCB4F, 0xA788, + 0xCB50, 0xC2E1, 0xCB51, 0xA789, 0xCB52, 0xA78A, 0xCB53, 0xA78B, + 0xCB54, 0xA78C, 0xCB55, 0xA78D, 0xCB56, 0xA78E, 0xCB57, 0xA78F, + 0xCB58, 0xC2E2, 0xCB59, 0xC2E3, 0xCB5A, 0xA790, 0xCB5B, 0xA791, + 0xCB5C, 0xA792, 0xCB5D, 0xC2E4, 0xCB5E, 0xA793, 0xCB5F, 0xA794, + 0xCB60, 0xA795, 0xCB61, 0xA796, 0xCB62, 0xA797, 0xCB63, 0xA798, + 0xCB64, 0xC2E5, 0xCB65, 0xA799, 0xCB66, 0xA79A, 0xCB67, 0xA79B, + 0xCB68, 0xA79C, 0xCB69, 0xA79D, 0xCB6A, 0xA79E, 0xCB6B, 0xA79F, + 0xCB6C, 0xA7A0, 0xCB6D, 0xA841, 0xCB6E, 0xA842, 0xCB6F, 0xA843, + 0xCB70, 0xA844, 0xCB71, 0xA845, 0xCB72, 0xA846, 0xCB73, 0xA847, + 0xCB74, 0xA848, 0xCB75, 0xA849, 0xCB76, 0xA84A, 0xCB77, 0xA84B, + 0xCB78, 0xC2E6, 0xCB79, 0xC2E7, 0xCB7A, 0xA84C, 0xCB7B, 0xA84D, + 0xCB7C, 0xA84E, 0xCB7D, 0xA84F, 0xCB7E, 0xA850, 0xCB7F, 0xA851, + 0xCB80, 0xA852, 0xCB81, 0xA853, 0xCB82, 0xA854, 0xCB83, 0xA855, + 0xCB84, 0xA856, 0xCB85, 0xA857, 0xCB86, 0xA858, 0xCB87, 0xA859, + 0xCB88, 0xA85A, 0xCB89, 0xA861, 0xCB8A, 0xA862, 0xCB8B, 0xA863, + 0xCB8C, 0xA864, 0xCB8D, 0xA865, 0xCB8E, 0xA866, 0xCB8F, 0xA867, + 0xCB90, 0xA868, 0xCB91, 0xA869, 0xCB92, 0xA86A, 0xCB93, 0xA86B, + 0xCB94, 0xA86C, 0xCB95, 0xA86D, 0xCB96, 0xA86E, 0xCB97, 0xA86F, + 0xCB98, 0xA870, 0xCB99, 0xA871, 0xCB9A, 0xA872, 0xCB9B, 0xA873, + 0xCB9C, 0xC2E8, 0xCB9D, 0xA874, 0xCB9E, 0xA875, 0xCB9F, 0xA876, + 0xCBA0, 0xA877, 0xCBA1, 0xA878, 0xCBA2, 0xA879, 0xCBA3, 0xA87A, + 0xCBA4, 0xA881, 0xCBA5, 0xA882, 0xCBA6, 0xA883, 0xCBA7, 0xA884, + 0xCBA8, 0xA885, 0xCBA9, 0xA886, 0xCBAA, 0xA887, 0xCBAB, 0xA888, + 0xCBAC, 0xA889, 0xCBAD, 0xA88A, 0xCBAE, 0xA88B, 0xCBAF, 0xA88C, + 0xCBB0, 0xA88D, 0xCBB1, 0xA88E, 0xCBB2, 0xA88F, 0xCBB3, 0xA890, + 0xCBB4, 0xA891, 0xCBB5, 0xA892, 0xCBB6, 0xA893, 0xCBB7, 0xA894, + 0xCBB8, 0xC2E9, 0xCBB9, 0xA895, 0xCBBA, 0xA896, 0xCBBB, 0xA897, + 0xCBBC, 0xA898, 0xCBBD, 0xA899, 0xCBBE, 0xA89A, 0xCBBF, 0xA89B, + 0xCBC0, 0xA89C, 0xCBC1, 0xA89D, 0xCBC2, 0xA89E, 0xCBC3, 0xA89F, + 0xCBC4, 0xA8A0, 0xCBC5, 0xA941, 0xCBC6, 0xA942, 0xCBC7, 0xA943, + 0xCBC8, 0xA944, 0xCBC9, 0xA945, 0xCBCA, 0xA946, 0xCBCB, 0xA947, + 0xCBCC, 0xA948, 0xCBCD, 0xA949, 0xCBCE, 0xA94A, 0xCBCF, 0xA94B, + 0xCBD0, 0xA94C, 0xCBD1, 0xA94D, 0xCBD2, 0xA94E, 0xCBD3, 0xA94F, + 0xCBD4, 0xC2EA, 0xCBD5, 0xA950, 0xCBD6, 0xA951, 0xCBD7, 0xA952, + 0xCBD8, 0xA953, 0xCBD9, 0xA954, 0xCBDA, 0xA955, 0xCBDB, 0xA956, + 0xCBDC, 0xA957, 0xCBDD, 0xA958, 0xCBDE, 0xA959, 0xCBDF, 0xA95A, + 0xCBE0, 0xA961, 0xCBE1, 0xA962, 0xCBE2, 0xA963, 0xCBE3, 0xA964, + 0xCBE4, 0xC2EB, 0xCBE5, 0xA965, 0xCBE6, 0xA966, 0xCBE7, 0xC2EC, + 0xCBE8, 0xA967, 0xCBE9, 0xC2ED, 0xCBEA, 0xA968, 0xCBEB, 0xA969, + 0xCBEC, 0xA96A, 0xCBED, 0xA96B, 0xCBEE, 0xA96C, 0xCBEF, 0xA96D, + 0xCBF0, 0xA96E, 0xCBF1, 0xA96F, 0xCBF2, 0xA970, 0xCBF3, 0xA971, + 0xCBF4, 0xA972, 0xCBF5, 0xA973, 0xCBF6, 0xA974, 0xCBF7, 0xA975, + 0xCBF8, 0xA976, 0xCBF9, 0xA977, 0xCBFA, 0xA978, 0xCBFB, 0xA979, + 0xCBFC, 0xA97A, 0xCBFD, 0xA981, 0xCBFE, 0xA982, 0xCBFF, 0xA983, + 0xCC00, 0xA984, 0xCC01, 0xA985, 0xCC02, 0xA986, 0xCC03, 0xA987, + 0xCC04, 0xA988, 0xCC05, 0xA989, 0xCC06, 0xA98A, 0xCC07, 0xA98B, + 0xCC08, 0xA98C, 0xCC09, 0xA98D, 0xCC0A, 0xA98E, 0xCC0B, 0xA98F, + 0xCC0C, 0xC2EE, 0xCC0D, 0xC2EF, 0xCC0E, 0xA990, 0xCC0F, 0xA991, + 0xCC10, 0xC2F0, 0xCC11, 0xA992, 0xCC12, 0xA993, 0xCC13, 0xA994, + 0xCC14, 0xC2F1, 0xCC15, 0xA995, 0xCC16, 0xA996, 0xCC17, 0xA997, + 0xCC18, 0xA998, 0xCC19, 0xA999, 0xCC1A, 0xA99A, 0xCC1B, 0xA99B, + 0xCC1C, 0xC2F2, 0xCC1D, 0xC2F3, 0xCC1E, 0xA99C, 0xCC1F, 0xA99D, + 0xCC20, 0xA99E, 0xCC21, 0xC2F4, 0xCC22, 0xC2F5, 0xCC23, 0xA99F, + 0xCC24, 0xA9A0, 0xCC25, 0xAA41, 0xCC26, 0xAA42, 0xCC27, 0xC2F6, + 0xCC28, 0xC2F7, 0xCC29, 0xC2F8, 0xCC2A, 0xAA43, 0xCC2B, 0xAA44, + 0xCC2C, 0xC2F9, 0xCC2D, 0xAA45, 0xCC2E, 0xC2FA, 0xCC2F, 0xAA46, + 0xCC30, 0xC2FB, 0xCC31, 0xAA47, 0xCC32, 0xAA48, 0xCC33, 0xAA49, + 0xCC34, 0xAA4A, 0xCC35, 0xAA4B, 0xCC36, 0xAA4C, 0xCC37, 0xAA4D, + 0xCC38, 0xC2FC, 0xCC39, 0xC2FD, 0xCC3A, 0xAA4E, 0xCC3B, 0xC2FE, + 0xCC3C, 0xC3A1, 0xCC3D, 0xC3A2, 0xCC3E, 0xC3A3, 0xCC3F, 0xAA4F, + 0xCC40, 0xAA50, 0xCC41, 0xAA51, 0xCC42, 0xAA52, 0xCC43, 0xAA53, + 0xCC44, 0xC3A4, 0xCC45, 0xC3A5, 0xCC46, 0xAA54, 0xCC47, 0xAA55, + 0xCC48, 0xC3A6, 0xCC49, 0xAA56, 0xCC4A, 0xAA57, 0xCC4B, 0xAA58, + 0xCC4C, 0xC3A7, 0xCC4D, 0xAA59, 0xCC4E, 0xAA5A, 0xCC4F, 0xAA61, + 0xCC50, 0xAA62, 0xCC51, 0xAA63, 0xCC52, 0xAA64, 0xCC53, 0xAA65, + 0xCC54, 0xC3A8, 0xCC55, 0xC3A9, 0xCC56, 0xAA66, 0xCC57, 0xC3AA, + 0xCC58, 0xC3AB, 0xCC59, 0xC3AC, 0xCC5A, 0xAA67, 0xCC5B, 0xAA68, + 0xCC5C, 0xAA69, 0xCC5D, 0xAA6A, 0xCC5E, 0xAA6B, 0xCC5F, 0xAA6C, + 0xCC60, 0xC3AD, 0xCC61, 0xAA6D, 0xCC62, 0xAA6E, 0xCC63, 0xAA6F, + 0xCC64, 0xC3AE, 0xCC65, 0xAA70, 0xCC66, 0xC3AF, 0xCC67, 0xAA71, + 0xCC68, 0xC3B0, 0xCC69, 0xAA72, 0xCC6A, 0xAA73, 0xCC6B, 0xAA74, + 0xCC6C, 0xAA75, 0xCC6D, 0xAA76, 0xCC6E, 0xAA77, 0xCC6F, 0xAA78, + 0xCC70, 0xC3B1, 0xCC71, 0xAA79, 0xCC72, 0xAA7A, 0xCC73, 0xAA81, + 0xCC74, 0xAA82, 0xCC75, 0xC3B2, 0xCC76, 0xAA83, 0xCC77, 0xAA84, + 0xCC78, 0xAA85, 0xCC79, 0xAA86, 0xCC7A, 0xAA87, 0xCC7B, 0xAA88, + 0xCC7C, 0xAA89, 0xCC7D, 0xAA8A, 0xCC7E, 0xAA8B, 0xCC7F, 0xAA8C, + 0xCC80, 0xAA8D, 0xCC81, 0xAA8E, 0xCC82, 0xAA8F, 0xCC83, 0xAA90, + 0xCC84, 0xAA91, 0xCC85, 0xAA92, 0xCC86, 0xAA93, 0xCC87, 0xAA94, + 0xCC88, 0xAA95, 0xCC89, 0xAA96, 0xCC8A, 0xAA97, 0xCC8B, 0xAA98, + 0xCC8C, 0xAA99, 0xCC8D, 0xAA9A, 0xCC8E, 0xAA9B, 0xCC8F, 0xAA9C, + 0xCC90, 0xAA9D, 0xCC91, 0xAA9E, 0xCC92, 0xAA9F, 0xCC93, 0xAAA0, + 0xCC94, 0xAB41, 0xCC95, 0xAB42, 0xCC96, 0xAB43, 0xCC97, 0xAB44, + 0xCC98, 0xC3B3, 0xCC99, 0xC3B4, 0xCC9A, 0xAB45, 0xCC9B, 0xAB46, + 0xCC9C, 0xC3B5, 0xCC9D, 0xAB47, 0xCC9E, 0xAB48, 0xCC9F, 0xAB49, + 0xCCA0, 0xC3B6, 0xCCA1, 0xAB4A, 0xCCA2, 0xAB4B, 0xCCA3, 0xAB4C, + 0xCCA4, 0xAB4D, 0xCCA5, 0xAB4E, 0xCCA6, 0xAB4F, 0xCCA7, 0xAB50, + 0xCCA8, 0xC3B7, 0xCCA9, 0xC3B8, 0xCCAA, 0xAB51, 0xCCAB, 0xC3B9, + 0xCCAC, 0xC3BA, 0xCCAD, 0xC3BB, 0xCCAE, 0xAB52, 0xCCAF, 0xAB53, + 0xCCB0, 0xAB54, 0xCCB1, 0xAB55, 0xCCB2, 0xAB56, 0xCCB3, 0xAB57, + 0xCCB4, 0xC3BC, 0xCCB5, 0xC3BD, 0xCCB6, 0xAB58, 0xCCB7, 0xAB59, + 0xCCB8, 0xC3BE, 0xCCB9, 0xAB5A, 0xCCBA, 0xAB61, 0xCCBB, 0xAB62, + 0xCCBC, 0xC3BF, 0xCCBD, 0xAB63, 0xCCBE, 0xAB64, 0xCCBF, 0xAB65, + 0xCCC0, 0xAB66, 0xCCC1, 0xAB67, 0xCCC2, 0xAB68, 0xCCC3, 0xAB69, + 0xCCC4, 0xC3C0, 0xCCC5, 0xC3C1, 0xCCC6, 0xAB6A, 0xCCC7, 0xC3C2, + 0xCCC8, 0xAB6B, 0xCCC9, 0xC3C3, 0xCCCA, 0xAB6C, 0xCCCB, 0xAB6D, + 0xCCCC, 0xAB6E, 0xCCCD, 0xAB6F, 0xCCCE, 0xAB70, 0xCCCF, 0xAB71, + 0xCCD0, 0xC3C4, 0xCCD1, 0xAB72, 0xCCD2, 0xAB73, 0xCCD3, 0xAB74, + 0xCCD4, 0xC3C5, 0xCCD5, 0xAB75, 0xCCD6, 0xAB76, 0xCCD7, 0xAB77, + 0xCCD8, 0xAB78, 0xCCD9, 0xAB79, 0xCCDA, 0xAB7A, 0xCCDB, 0xAB81, + 0xCCDC, 0xAB82, 0xCCDD, 0xAB83, 0xCCDE, 0xAB84, 0xCCDF, 0xAB85, + 0xCCE0, 0xAB86, 0xCCE1, 0xAB87, 0xCCE2, 0xAB88, 0xCCE3, 0xAB89, + 0xCCE4, 0xC3C6, 0xCCE5, 0xAB8A, 0xCCE6, 0xAB8B, 0xCCE7, 0xAB8C, + 0xCCE8, 0xAB8D, 0xCCE9, 0xAB8E, 0xCCEA, 0xAB8F, 0xCCEB, 0xAB90, + 0xCCEC, 0xC3C7, 0xCCED, 0xAB91, 0xCCEE, 0xAB92, 0xCCEF, 0xAB93, + 0xCCF0, 0xC3C8, 0xCCF1, 0xAB94, 0xCCF2, 0xAB95, 0xCCF3, 0xAB96, + 0xCCF4, 0xAB97, 0xCCF5, 0xAB98, 0xCCF6, 0xAB99, 0xCCF7, 0xAB9A, + 0xCCF8, 0xAB9B, 0xCCF9, 0xAB9C, 0xCCFA, 0xAB9D, 0xCCFB, 0xAB9E, + 0xCCFC, 0xAB9F, 0xCCFD, 0xABA0, 0xCCFE, 0xAC41, 0xCCFF, 0xAC42, + 0xCD00, 0xAC43, 0xCD01, 0xC3C9, 0xCD02, 0xAC44, 0xCD03, 0xAC45, + 0xCD04, 0xAC46, 0xCD05, 0xAC47, 0xCD06, 0xAC48, 0xCD07, 0xAC49, + 0xCD08, 0xC3CA, 0xCD09, 0xC3CB, 0xCD0A, 0xAC4A, 0xCD0B, 0xAC4B, + 0xCD0C, 0xC3CC, 0xCD0D, 0xAC4C, 0xCD0E, 0xAC4D, 0xCD0F, 0xAC4E, + 0xCD10, 0xC3CD, 0xCD11, 0xAC4F, 0xCD12, 0xAC50, 0xCD13, 0xAC51, + 0xCD14, 0xAC52, 0xCD15, 0xAC53, 0xCD16, 0xAC54, 0xCD17, 0xAC55, + 0xCD18, 0xC3CE, 0xCD19, 0xC3CF, 0xCD1A, 0xAC56, 0xCD1B, 0xC3D0, + 0xCD1C, 0xAC57, 0xCD1D, 0xC3D1, 0xCD1E, 0xAC58, 0xCD1F, 0xAC59, + 0xCD20, 0xAC5A, 0xCD21, 0xAC61, 0xCD22, 0xAC62, 0xCD23, 0xAC63, + 0xCD24, 0xC3D2, 0xCD25, 0xAC64, 0xCD26, 0xAC65, 0xCD27, 0xAC66, + 0xCD28, 0xC3D3, 0xCD29, 0xAC67, 0xCD2A, 0xAC68, 0xCD2B, 0xAC69, + 0xCD2C, 0xC3D4, 0xCD2D, 0xAC6A, 0xCD2E, 0xAC6B, 0xCD2F, 0xAC6C, + 0xCD30, 0xAC6D, 0xCD31, 0xAC6E, 0xCD32, 0xAC6F, 0xCD33, 0xAC70, + 0xCD34, 0xAC71, 0xCD35, 0xAC72, 0xCD36, 0xAC73, 0xCD37, 0xAC74, + 0xCD38, 0xAC75, 0xCD39, 0xC3D5, 0xCD3A, 0xAC76, 0xCD3B, 0xAC77, + 0xCD3C, 0xAC78, 0xCD3D, 0xAC79, 0xCD3E, 0xAC7A, 0xCD3F, 0xAC81, + 0xCD40, 0xAC82, 0xCD41, 0xAC83, 0xCD42, 0xAC84, 0xCD43, 0xAC85, + 0xCD44, 0xAC86, 0xCD45, 0xAC87, 0xCD46, 0xAC88, 0xCD47, 0xAC89, + 0xCD48, 0xAC8A, 0xCD49, 0xAC8B, 0xCD4A, 0xAC8C, 0xCD4B, 0xAC8D, + 0xCD4C, 0xAC8E, 0xCD4D, 0xAC8F, 0xCD4E, 0xAC90, 0xCD4F, 0xAC91, + 0xCD50, 0xAC92, 0xCD51, 0xAC93, 0xCD52, 0xAC94, 0xCD53, 0xAC95, + 0xCD54, 0xAC96, 0xCD55, 0xAC97, 0xCD56, 0xAC98, 0xCD57, 0xAC99, + 0xCD58, 0xAC9A, 0xCD59, 0xAC9B, 0xCD5A, 0xAC9C, 0xCD5B, 0xAC9D, + 0xCD5C, 0xC3D6, 0xCD5D, 0xAC9E, 0xCD5E, 0xAC9F, 0xCD5F, 0xACA0, + 0xCD60, 0xC3D7, 0xCD61, 0xAD41, 0xCD62, 0xAD42, 0xCD63, 0xAD43, + 0xCD64, 0xC3D8, 0xCD65, 0xAD44, 0xCD66, 0xAD45, 0xCD67, 0xAD46, + 0xCD68, 0xAD47, 0xCD69, 0xAD48, 0xCD6A, 0xAD49, 0xCD6B, 0xAD4A, + 0xCD6C, 0xC3D9, 0xCD6D, 0xC3DA, 0xCD6E, 0xAD4B, 0xCD6F, 0xC3DB, + 0xCD70, 0xAD4C, 0xCD71, 0xC3DC, 0xCD72, 0xAD4D, 0xCD73, 0xAD4E, + 0xCD74, 0xAD4F, 0xCD75, 0xAD50, 0xCD76, 0xAD51, 0xCD77, 0xAD52, + 0xCD78, 0xC3DD, 0xCD79, 0xAD53, 0xCD7A, 0xAD54, 0xCD7B, 0xAD55, + 0xCD7C, 0xAD56, 0xCD7D, 0xAD57, 0xCD7E, 0xAD58, 0xCD7F, 0xAD59, + 0xCD80, 0xAD5A, 0xCD81, 0xAD61, 0xCD82, 0xAD62, 0xCD83, 0xAD63, + 0xCD84, 0xAD64, 0xCD85, 0xAD65, 0xCD86, 0xAD66, 0xCD87, 0xAD67, + 0xCD88, 0xC3DE, 0xCD89, 0xAD68, 0xCD8A, 0xAD69, 0xCD8B, 0xAD6A, + 0xCD8C, 0xAD6B, 0xCD8D, 0xAD6C, 0xCD8E, 0xAD6D, 0xCD8F, 0xAD6E, + 0xCD90, 0xAD6F, 0xCD91, 0xAD70, 0xCD92, 0xAD71, 0xCD93, 0xAD72, + 0xCD94, 0xC3DF, 0xCD95, 0xC3E0, 0xCD96, 0xAD73, 0xCD97, 0xAD74, + 0xCD98, 0xC3E1, 0xCD99, 0xAD75, 0xCD9A, 0xAD76, 0xCD9B, 0xAD77, + 0xCD9C, 0xC3E2, 0xCD9D, 0xAD78, 0xCD9E, 0xAD79, 0xCD9F, 0xAD7A, + 0xCDA0, 0xAD81, 0xCDA1, 0xAD82, 0xCDA2, 0xAD83, 0xCDA3, 0xAD84, + 0xCDA4, 0xC3E3, 0xCDA5, 0xC3E4, 0xCDA6, 0xAD85, 0xCDA7, 0xC3E5, + 0xCDA8, 0xAD86, 0xCDA9, 0xC3E6, 0xCDAA, 0xAD87, 0xCDAB, 0xAD88, + 0xCDAC, 0xAD89, 0xCDAD, 0xAD8A, 0xCDAE, 0xAD8B, 0xCDAF, 0xAD8C, + 0xCDB0, 0xC3E7, 0xCDB1, 0xAD8D, 0xCDB2, 0xAD8E, 0xCDB3, 0xAD8F, + 0xCDB4, 0xAD90, 0xCDB5, 0xAD91, 0xCDB6, 0xAD92, 0xCDB7, 0xAD93, + 0xCDB8, 0xAD94, 0xCDB9, 0xAD95, 0xCDBA, 0xAD96, 0xCDBB, 0xAD97, + 0xCDBC, 0xAD98, 0xCDBD, 0xAD99, 0xCDBE, 0xAD9A, 0xCDBF, 0xAD9B, + 0xCDC0, 0xAD9C, 0xCDC1, 0xAD9D, 0xCDC2, 0xAD9E, 0xCDC3, 0xAD9F, + 0xCDC4, 0xC3E8, 0xCDC5, 0xADA0, 0xCDC6, 0xAE41, 0xCDC7, 0xAE42, + 0xCDC8, 0xAE43, 0xCDC9, 0xAE44, 0xCDCA, 0xAE45, 0xCDCB, 0xAE46, + 0xCDCC, 0xC3E9, 0xCDCD, 0xAE47, 0xCDCE, 0xAE48, 0xCDCF, 0xAE49, + 0xCDD0, 0xC3EA, 0xCDD1, 0xAE4A, 0xCDD2, 0xAE4B, 0xCDD3, 0xAE4C, + 0xCDD4, 0xAE4D, 0xCDD5, 0xAE4E, 0xCDD6, 0xAE4F, 0xCDD7, 0xAE50, + 0xCDD8, 0xAE51, 0xCDD9, 0xAE52, 0xCDDA, 0xAE53, 0xCDDB, 0xAE54, + 0xCDDC, 0xAE55, 0xCDDD, 0xAE56, 0xCDDE, 0xAE57, 0xCDDF, 0xAE58, + 0xCDE0, 0xAE59, 0xCDE1, 0xAE5A, 0xCDE2, 0xAE61, 0xCDE3, 0xAE62, + 0xCDE4, 0xAE63, 0xCDE5, 0xAE64, 0xCDE6, 0xAE65, 0xCDE7, 0xAE66, + 0xCDE8, 0xC3EB, 0xCDE9, 0xAE67, 0xCDEA, 0xAE68, 0xCDEB, 0xAE69, + 0xCDEC, 0xC3EC, 0xCDED, 0xAE6A, 0xCDEE, 0xAE6B, 0xCDEF, 0xAE6C, + 0xCDF0, 0xC3ED, 0xCDF1, 0xAE6D, 0xCDF2, 0xAE6E, 0xCDF3, 0xAE6F, + 0xCDF4, 0xAE70, 0xCDF5, 0xAE71, 0xCDF6, 0xAE72, 0xCDF7, 0xAE73, + 0xCDF8, 0xC3EE, 0xCDF9, 0xC3EF, 0xCDFA, 0xAE74, 0xCDFB, 0xC3F0, + 0xCDFC, 0xAE75, 0xCDFD, 0xC3F1, 0xCDFE, 0xAE76, 0xCDFF, 0xAE77, + 0xCE00, 0xAE78, 0xCE01, 0xAE79, 0xCE02, 0xAE7A, 0xCE03, 0xAE81, + 0xCE04, 0xC3F2, 0xCE05, 0xAE82, 0xCE06, 0xAE83, 0xCE07, 0xAE84, + 0xCE08, 0xC3F3, 0xCE09, 0xAE85, 0xCE0A, 0xAE86, 0xCE0B, 0xAE87, + 0xCE0C, 0xC3F4, 0xCE0D, 0xAE88, 0xCE0E, 0xAE89, 0xCE0F, 0xAE8A, + 0xCE10, 0xAE8B, 0xCE11, 0xAE8C, 0xCE12, 0xAE8D, 0xCE13, 0xAE8E, + 0xCE14, 0xC3F5, 0xCE15, 0xAE8F, 0xCE16, 0xAE90, 0xCE17, 0xAE91, + 0xCE18, 0xAE92, 0xCE19, 0xC3F6, 0xCE1A, 0xAE93, 0xCE1B, 0xAE94, + 0xCE1C, 0xAE95, 0xCE1D, 0xAE96, 0xCE1E, 0xAE97, 0xCE1F, 0xAE98, + 0xCE20, 0xC3F7, 0xCE21, 0xC3F8, 0xCE22, 0xAE99, 0xCE23, 0xAE9A, + 0xCE24, 0xC3F9, 0xCE25, 0xAE9B, 0xCE26, 0xAE9C, 0xCE27, 0xAE9D, + 0xCE28, 0xC3FA, 0xCE29, 0xAE9E, 0xCE2A, 0xAE9F, 0xCE2B, 0xAEA0, + 0xCE2C, 0xAF41, 0xCE2D, 0xAF42, 0xCE2E, 0xAF43, 0xCE2F, 0xAF44, + 0xCE30, 0xC3FB, 0xCE31, 0xC3FC, 0xCE32, 0xAF45, 0xCE33, 0xC3FD, + 0xCE34, 0xAF46, 0xCE35, 0xC3FE, 0xCE36, 0xAF47, 0xCE37, 0xAF48, + 0xCE38, 0xAF49, 0xCE39, 0xAF4A, 0xCE3A, 0xAF4B, 0xCE3B, 0xAF4C, + 0xCE3C, 0xAF4D, 0xCE3D, 0xAF4E, 0xCE3E, 0xAF4F, 0xCE3F, 0xAF50, + 0xCE40, 0xAF51, 0xCE41, 0xAF52, 0xCE42, 0xAF53, 0xCE43, 0xAF54, + 0xCE44, 0xAF55, 0xCE45, 0xAF56, 0xCE46, 0xAF57, 0xCE47, 0xAF58, + 0xCE48, 0xAF59, 0xCE49, 0xAF5A, 0xCE4A, 0xAF61, 0xCE4B, 0xAF62, + 0xCE4C, 0xAF63, 0xCE4D, 0xAF64, 0xCE4E, 0xAF65, 0xCE4F, 0xAF66, + 0xCE50, 0xAF67, 0xCE51, 0xAF68, 0xCE52, 0xAF69, 0xCE53, 0xAF6A, + 0xCE54, 0xAF6B, 0xCE55, 0xAF6C, 0xCE56, 0xAF6D, 0xCE57, 0xAF6E, + 0xCE58, 0xC4A1, 0xCE59, 0xC4A2, 0xCE5A, 0xAF6F, 0xCE5B, 0xAF70, + 0xCE5C, 0xC4A3, 0xCE5D, 0xAF71, 0xCE5E, 0xAF72, 0xCE5F, 0xC4A4, + 0xCE60, 0xC4A5, 0xCE61, 0xC4A6, 0xCE62, 0xAF73, 0xCE63, 0xAF74, + 0xCE64, 0xAF75, 0xCE65, 0xAF76, 0xCE66, 0xAF77, 0xCE67, 0xAF78, + 0xCE68, 0xC4A7, 0xCE69, 0xC4A8, 0xCE6A, 0xAF79, 0xCE6B, 0xC4A9, + 0xCE6C, 0xAF7A, 0xCE6D, 0xC4AA, 0xCE6E, 0xAF81, 0xCE6F, 0xAF82, + 0xCE70, 0xAF83, 0xCE71, 0xAF84, 0xCE72, 0xAF85, 0xCE73, 0xAF86, + 0xCE74, 0xC4AB, 0xCE75, 0xC4AC, 0xCE76, 0xAF87, 0xCE77, 0xAF88, + 0xCE78, 0xC4AD, 0xCE79, 0xAF89, 0xCE7A, 0xAF8A, 0xCE7B, 0xAF8B, + 0xCE7C, 0xC4AE, 0xCE7D, 0xAF8C, 0xCE7E, 0xAF8D, 0xCE7F, 0xAF8E, + 0xCE80, 0xAF8F, 0xCE81, 0xAF90, 0xCE82, 0xAF91, 0xCE83, 0xAF92, + 0xCE84, 0xC4AF, 0xCE85, 0xC4B0, 0xCE86, 0xAF93, 0xCE87, 0xC4B1, + 0xCE88, 0xAF94, 0xCE89, 0xC4B2, 0xCE8A, 0xAF95, 0xCE8B, 0xAF96, + 0xCE8C, 0xAF97, 0xCE8D, 0xAF98, 0xCE8E, 0xAF99, 0xCE8F, 0xAF9A, + 0xCE90, 0xC4B3, 0xCE91, 0xC4B4, 0xCE92, 0xAF9B, 0xCE93, 0xAF9C, + 0xCE94, 0xC4B5, 0xCE95, 0xAF9D, 0xCE96, 0xAF9E, 0xCE97, 0xAF9F, + 0xCE98, 0xC4B6, 0xCE99, 0xAFA0, 0xCE9A, 0xB041, 0xCE9B, 0xB042, + 0xCE9C, 0xB043, 0xCE9D, 0xB044, 0xCE9E, 0xB045, 0xCE9F, 0xB046, + 0xCEA0, 0xC4B7, 0xCEA1, 0xC4B8, 0xCEA2, 0xB047, 0xCEA3, 0xC4B9, + 0xCEA4, 0xC4BA, 0xCEA5, 0xC4BB, 0xCEA6, 0xB048, 0xCEA7, 0xB049, + 0xCEA8, 0xB04A, 0xCEA9, 0xB04B, 0xCEAA, 0xB04C, 0xCEAB, 0xB04D, + 0xCEAC, 0xC4BC, 0xCEAD, 0xC4BD, 0xCEAE, 0xB04E, 0xCEAF, 0xB04F, + 0xCEB0, 0xB050, 0xCEB1, 0xB051, 0xCEB2, 0xB052, 0xCEB3, 0xB053, + 0xCEB4, 0xB054, 0xCEB5, 0xB055, 0xCEB6, 0xB056, 0xCEB7, 0xB057, + 0xCEB8, 0xB058, 0xCEB9, 0xB059, 0xCEBA, 0xB05A, 0xCEBB, 0xB061, + 0xCEBC, 0xB062, 0xCEBD, 0xB063, 0xCEBE, 0xB064, 0xCEBF, 0xB065, + 0xCEC0, 0xB066, 0xCEC1, 0xC4BE, 0xCEC2, 0xB067, 0xCEC3, 0xB068, + 0xCEC4, 0xB069, 0xCEC5, 0xB06A, 0xCEC6, 0xB06B, 0xCEC7, 0xB06C, + 0xCEC8, 0xB06D, 0xCEC9, 0xB06E, 0xCECA, 0xB06F, 0xCECB, 0xB070, + 0xCECC, 0xB071, 0xCECD, 0xB072, 0xCECE, 0xB073, 0xCECF, 0xB074, + 0xCED0, 0xB075, 0xCED1, 0xB076, 0xCED2, 0xB077, 0xCED3, 0xB078, + 0xCED4, 0xB079, 0xCED5, 0xB07A, 0xCED6, 0xB081, 0xCED7, 0xB082, + 0xCED8, 0xB083, 0xCED9, 0xB084, 0xCEDA, 0xB085, 0xCEDB, 0xB086, + 0xCEDC, 0xB087, 0xCEDD, 0xB088, 0xCEDE, 0xB089, 0xCEDF, 0xB08A, + 0xCEE0, 0xB08B, 0xCEE1, 0xB08C, 0xCEE2, 0xB08D, 0xCEE3, 0xB08E, + 0xCEE4, 0xC4BF, 0xCEE5, 0xC4C0, 0xCEE6, 0xB08F, 0xCEE7, 0xB090, + 0xCEE8, 0xC4C1, 0xCEE9, 0xB091, 0xCEEA, 0xB092, 0xCEEB, 0xC4C2, + 0xCEEC, 0xC4C3, 0xCEED, 0xB093, 0xCEEE, 0xB094, 0xCEEF, 0xB095, + 0xCEF0, 0xB096, 0xCEF1, 0xB097, 0xCEF2, 0xB098, 0xCEF3, 0xB099, + 0xCEF4, 0xC4C4, 0xCEF5, 0xC4C5, 0xCEF6, 0xB09A, 0xCEF7, 0xC4C6, + 0xCEF8, 0xC4C7, 0xCEF9, 0xC4C8, 0xCEFA, 0xB09B, 0xCEFB, 0xB09C, + 0xCEFC, 0xB09D, 0xCEFD, 0xB09E, 0xCEFE, 0xB09F, 0xCEFF, 0xB0A0, + 0xCF00, 0xC4C9, 0xCF01, 0xC4CA, 0xCF02, 0xB141, 0xCF03, 0xB142, + 0xCF04, 0xC4CB, 0xCF05, 0xB143, 0xCF06, 0xB144, 0xCF07, 0xB145, + 0xCF08, 0xC4CC, 0xCF09, 0xB146, 0xCF0A, 0xB147, 0xCF0B, 0xB148, + 0xCF0C, 0xB149, 0xCF0D, 0xB14A, 0xCF0E, 0xB14B, 0xCF0F, 0xB14C, + 0xCF10, 0xC4CD, 0xCF11, 0xC4CE, 0xCF12, 0xB14D, 0xCF13, 0xC4CF, + 0xCF14, 0xB14E, 0xCF15, 0xC4D0, 0xCF16, 0xB14F, 0xCF17, 0xB150, + 0xCF18, 0xB151, 0xCF19, 0xB152, 0xCF1A, 0xB153, 0xCF1B, 0xB154, + 0xCF1C, 0xC4D1, 0xCF1D, 0xB155, 0xCF1E, 0xB156, 0xCF1F, 0xB157, + 0xCF20, 0xC4D2, 0xCF21, 0xB158, 0xCF22, 0xB159, 0xCF23, 0xB15A, + 0xCF24, 0xC4D3, 0xCF25, 0xB161, 0xCF26, 0xB162, 0xCF27, 0xB163, + 0xCF28, 0xB164, 0xCF29, 0xB165, 0xCF2A, 0xB166, 0xCF2B, 0xB167, + 0xCF2C, 0xC4D4, 0xCF2D, 0xC4D5, 0xCF2E, 0xB168, 0xCF2F, 0xC4D6, + 0xCF30, 0xC4D7, 0xCF31, 0xC4D8, 0xCF32, 0xB169, 0xCF33, 0xB16A, + 0xCF34, 0xB16B, 0xCF35, 0xB16C, 0xCF36, 0xB16D, 0xCF37, 0xB16E, + 0xCF38, 0xC4D9, 0xCF39, 0xB16F, 0xCF3A, 0xB170, 0xCF3B, 0xB171, + 0xCF3C, 0xB172, 0xCF3D, 0xB173, 0xCF3E, 0xB174, 0xCF3F, 0xB175, + 0xCF40, 0xB176, 0xCF41, 0xB177, 0xCF42, 0xB178, 0xCF43, 0xB179, + 0xCF44, 0xB17A, 0xCF45, 0xB181, 0xCF46, 0xB182, 0xCF47, 0xB183, + 0xCF48, 0xB184, 0xCF49, 0xB185, 0xCF4A, 0xB186, 0xCF4B, 0xB187, + 0xCF4C, 0xB188, 0xCF4D, 0xB189, 0xCF4E, 0xB18A, 0xCF4F, 0xB18B, + 0xCF50, 0xB18C, 0xCF51, 0xB18D, 0xCF52, 0xB18E, 0xCF53, 0xB18F, + 0xCF54, 0xC4DA, 0xCF55, 0xC4DB, 0xCF56, 0xB190, 0xCF57, 0xB191, + 0xCF58, 0xC4DC, 0xCF59, 0xB192, 0xCF5A, 0xB193, 0xCF5B, 0xB194, + 0xCF5C, 0xC4DD, 0xCF5D, 0xB195, 0xCF5E, 0xB196, 0xCF5F, 0xB197, + 0xCF60, 0xB198, 0xCF61, 0xB199, 0xCF62, 0xB19A, 0xCF63, 0xB19B, + 0xCF64, 0xC4DE, 0xCF65, 0xC4DF, 0xCF66, 0xB19C, 0xCF67, 0xC4E0, + 0xCF68, 0xB19D, 0xCF69, 0xC4E1, 0xCF6A, 0xB19E, 0xCF6B, 0xB19F, + 0xCF6C, 0xB1A0, 0xCF6D, 0xB241, 0xCF6E, 0xB242, 0xCF6F, 0xB243, + 0xCF70, 0xC4E2, 0xCF71, 0xC4E3, 0xCF72, 0xB244, 0xCF73, 0xB245, + 0xCF74, 0xC4E4, 0xCF75, 0xB246, 0xCF76, 0xB247, 0xCF77, 0xB248, + 0xCF78, 0xC4E5, 0xCF79, 0xB249, 0xCF7A, 0xB24A, 0xCF7B, 0xB24B, + 0xCF7C, 0xB24C, 0xCF7D, 0xB24D, 0xCF7E, 0xB24E, 0xCF7F, 0xB24F, + 0xCF80, 0xC4E6, 0xCF81, 0xB250, 0xCF82, 0xB251, 0xCF83, 0xB252, + 0xCF84, 0xB253, 0xCF85, 0xC4E7, 0xCF86, 0xB254, 0xCF87, 0xB255, + 0xCF88, 0xB256, 0xCF89, 0xB257, 0xCF8A, 0xB258, 0xCF8B, 0xB259, + 0xCF8C, 0xC4E8, 0xCF8D, 0xB25A, 0xCF8E, 0xB261, 0xCF8F, 0xB262, + 0xCF90, 0xB263, 0xCF91, 0xB264, 0xCF92, 0xB265, 0xCF93, 0xB266, + 0xCF94, 0xB267, 0xCF95, 0xB268, 0xCF96, 0xB269, 0xCF97, 0xB26A, + 0xCF98, 0xB26B, 0xCF99, 0xB26C, 0xCF9A, 0xB26D, 0xCF9B, 0xB26E, + 0xCF9C, 0xB26F, 0xCF9D, 0xB270, 0xCF9E, 0xB271, 0xCF9F, 0xB272, + 0xCFA0, 0xB273, 0xCFA1, 0xC4E9, 0xCFA2, 0xB274, 0xCFA3, 0xB275, + 0xCFA4, 0xB276, 0xCFA5, 0xB277, 0xCFA6, 0xB278, 0xCFA7, 0xB279, + 0xCFA8, 0xC4EA, 0xCFA9, 0xB27A, 0xCFAA, 0xB281, 0xCFAB, 0xB282, + 0xCFAC, 0xB283, 0xCFAD, 0xB284, 0xCFAE, 0xB285, 0xCFAF, 0xB286, + 0xCFB0, 0xC4EB, 0xCFB1, 0xB287, 0xCFB2, 0xB288, 0xCFB3, 0xB289, + 0xCFB4, 0xB28A, 0xCFB5, 0xB28B, 0xCFB6, 0xB28C, 0xCFB7, 0xB28D, + 0xCFB8, 0xB28E, 0xCFB9, 0xB28F, 0xCFBA, 0xB290, 0xCFBB, 0xB291, + 0xCFBC, 0xB292, 0xCFBD, 0xB293, 0xCFBE, 0xB294, 0xCFBF, 0xB295, + 0xCFC0, 0xB296, 0xCFC1, 0xB297, 0xCFC2, 0xB298, 0xCFC3, 0xB299, + 0xCFC4, 0xC4EC, 0xCFC5, 0xB29A, 0xCFC6, 0xB29B, 0xCFC7, 0xB29C, + 0xCFC8, 0xB29D, 0xCFC9, 0xB29E, 0xCFCA, 0xB29F, 0xCFCB, 0xB2A0, + 0xCFCC, 0xB341, 0xCFCD, 0xB342, 0xCFCE, 0xB343, 0xCFCF, 0xB344, + 0xCFD0, 0xB345, 0xCFD1, 0xB346, 0xCFD2, 0xB347, 0xCFD3, 0xB348, + 0xCFD4, 0xB349, 0xCFD5, 0xB34A, 0xCFD6, 0xB34B, 0xCFD7, 0xB34C, + 0xCFD8, 0xB34D, 0xCFD9, 0xB34E, 0xCFDA, 0xB34F, 0xCFDB, 0xB350, + 0xCFDC, 0xB351, 0xCFDD, 0xB352, 0xCFDE, 0xB353, 0xCFDF, 0xB354, + 0xCFE0, 0xC4ED, 0xCFE1, 0xC4EE, 0xCFE2, 0xB355, 0xCFE3, 0xB356, + 0xCFE4, 0xC4EF, 0xCFE5, 0xB357, 0xCFE6, 0xB358, 0xCFE7, 0xB359, + 0xCFE8, 0xC4F0, 0xCFE9, 0xB35A, 0xCFEA, 0xB361, 0xCFEB, 0xB362, + 0xCFEC, 0xB363, 0xCFED, 0xB364, 0xCFEE, 0xB365, 0xCFEF, 0xB366, + 0xCFF0, 0xC4F1, 0xCFF1, 0xC4F2, 0xCFF2, 0xB367, 0xCFF3, 0xC4F3, + 0xCFF4, 0xB368, 0xCFF5, 0xC4F4, 0xCFF6, 0xB369, 0xCFF7, 0xB36A, + 0xCFF8, 0xB36B, 0xCFF9, 0xB36C, 0xCFFA, 0xB36D, 0xCFFB, 0xB36E, + 0xCFFC, 0xC4F5, 0xCFFD, 0xB36F, 0xCFFE, 0xB370, 0xCFFF, 0xB371, + 0xD000, 0xC4F6, 0xD001, 0xB372, 0xD002, 0xB373, 0xD003, 0xB374, + 0xD004, 0xC4F7, 0xD005, 0xB375, 0xD006, 0xB376, 0xD007, 0xB377, + 0xD008, 0xB378, 0xD009, 0xB379, 0xD00A, 0xB37A, 0xD00B, 0xB381, + 0xD00C, 0xB382, 0xD00D, 0xB383, 0xD00E, 0xB384, 0xD00F, 0xB385, + 0xD010, 0xB386, 0xD011, 0xC4F8, 0xD012, 0xB387, 0xD013, 0xB388, + 0xD014, 0xB389, 0xD015, 0xB38A, 0xD016, 0xB38B, 0xD017, 0xB38C, + 0xD018, 0xC4F9, 0xD019, 0xB38D, 0xD01A, 0xB38E, 0xD01B, 0xB38F, + 0xD01C, 0xB390, 0xD01D, 0xB391, 0xD01E, 0xB392, 0xD01F, 0xB393, + 0xD020, 0xB394, 0xD021, 0xB395, 0xD022, 0xB396, 0xD023, 0xB397, + 0xD024, 0xB398, 0xD025, 0xB399, 0xD026, 0xB39A, 0xD027, 0xB39B, + 0xD028, 0xB39C, 0xD029, 0xB39D, 0xD02A, 0xB39E, 0xD02B, 0xB39F, + 0xD02C, 0xB3A0, 0xD02D, 0xC4FA, 0xD02E, 0xB441, 0xD02F, 0xB442, + 0xD030, 0xB443, 0xD031, 0xB444, 0xD032, 0xB445, 0xD033, 0xB446, + 0xD034, 0xC4FB, 0xD035, 0xC4FC, 0xD036, 0xB447, 0xD037, 0xB448, + 0xD038, 0xC4FD, 0xD039, 0xB449, 0xD03A, 0xB44A, 0xD03B, 0xB44B, + 0xD03C, 0xC4FE, 0xD03D, 0xB44C, 0xD03E, 0xB44D, 0xD03F, 0xB44E, + 0xD040, 0xB44F, 0xD041, 0xB450, 0xD042, 0xB451, 0xD043, 0xB452, + 0xD044, 0xC5A1, 0xD045, 0xC5A2, 0xD046, 0xB453, 0xD047, 0xC5A3, + 0xD048, 0xB454, 0xD049, 0xC5A4, 0xD04A, 0xB455, 0xD04B, 0xB456, + 0xD04C, 0xB457, 0xD04D, 0xB458, 0xD04E, 0xB459, 0xD04F, 0xB45A, + 0xD050, 0xC5A5, 0xD051, 0xB461, 0xD052, 0xB462, 0xD053, 0xB463, + 0xD054, 0xC5A6, 0xD055, 0xB464, 0xD056, 0xB465, 0xD057, 0xB466, + 0xD058, 0xC5A7, 0xD059, 0xB467, 0xD05A, 0xB468, 0xD05B, 0xB469, + 0xD05C, 0xB46A, 0xD05D, 0xB46B, 0xD05E, 0xB46C, 0xD05F, 0xB46D, + 0xD060, 0xC5A8, 0xD061, 0xB46E, 0xD062, 0xB46F, 0xD063, 0xB470, + 0xD064, 0xB471, 0xD065, 0xB472, 0xD066, 0xB473, 0xD067, 0xB474, + 0xD068, 0xB475, 0xD069, 0xB476, 0xD06A, 0xB477, 0xD06B, 0xB478, + 0xD06C, 0xC5A9, 0xD06D, 0xC5AA, 0xD06E, 0xB479, 0xD06F, 0xB47A, + 0xD070, 0xC5AB, 0xD071, 0xB481, 0xD072, 0xB482, 0xD073, 0xB483, + 0xD074, 0xC5AC, 0xD075, 0xB484, 0xD076, 0xB485, 0xD077, 0xB486, + 0xD078, 0xB487, 0xD079, 0xB488, 0xD07A, 0xB489, 0xD07B, 0xB48A, + 0xD07C, 0xC5AD, 0xD07D, 0xC5AE, 0xD07E, 0xB48B, 0xD07F, 0xB48C, + 0xD080, 0xB48D, 0xD081, 0xC5AF, 0xD082, 0xB48E, 0xD083, 0xB48F, + 0xD084, 0xB490, 0xD085, 0xB491, 0xD086, 0xB492, 0xD087, 0xB493, + 0xD088, 0xB494, 0xD089, 0xB495, 0xD08A, 0xB496, 0xD08B, 0xB497, + 0xD08C, 0xB498, 0xD08D, 0xB499, 0xD08E, 0xB49A, 0xD08F, 0xB49B, + 0xD090, 0xB49C, 0xD091, 0xB49D, 0xD092, 0xB49E, 0xD093, 0xB49F, + 0xD094, 0xB4A0, 0xD095, 0xB541, 0xD096, 0xB542, 0xD097, 0xB543, + 0xD098, 0xB544, 0xD099, 0xB545, 0xD09A, 0xB546, 0xD09B, 0xB547, + 0xD09C, 0xB548, 0xD09D, 0xB549, 0xD09E, 0xB54A, 0xD09F, 0xB54B, + 0xD0A0, 0xB54C, 0xD0A1, 0xB54D, 0xD0A2, 0xB54E, 0xD0A3, 0xB54F, + 0xD0A4, 0xC5B0, 0xD0A5, 0xC5B1, 0xD0A6, 0xB550, 0xD0A7, 0xB551, + 0xD0A8, 0xC5B2, 0xD0A9, 0xB552, 0xD0AA, 0xB553, 0xD0AB, 0xB554, + 0xD0AC, 0xC5B3, 0xD0AD, 0xB555, 0xD0AE, 0xB556, 0xD0AF, 0xB557, + 0xD0B0, 0xB558, 0xD0B1, 0xB559, 0xD0B2, 0xB55A, 0xD0B3, 0xB561, + 0xD0B4, 0xC5B4, 0xD0B5, 0xC5B5, 0xD0B6, 0xB562, 0xD0B7, 0xC5B6, + 0xD0B8, 0xB563, 0xD0B9, 0xC5B7, 0xD0BA, 0xB564, 0xD0BB, 0xB565, + 0xD0BC, 0xB566, 0xD0BD, 0xB567, 0xD0BE, 0xB568, 0xD0BF, 0xB569, + 0xD0C0, 0xC5B8, 0xD0C1, 0xC5B9, 0xD0C2, 0xB56A, 0xD0C3, 0xB56B, + 0xD0C4, 0xC5BA, 0xD0C5, 0xB56C, 0xD0C6, 0xB56D, 0xD0C7, 0xB56E, + 0xD0C8, 0xC5BB, 0xD0C9, 0xC5BC, 0xD0CA, 0xB56F, 0xD0CB, 0xB570, + 0xD0CC, 0xB571, 0xD0CD, 0xB572, 0xD0CE, 0xB573, 0xD0CF, 0xB574, + 0xD0D0, 0xC5BD, 0xD0D1, 0xC5BE, 0xD0D2, 0xB575, 0xD0D3, 0xC5BF, + 0xD0D4, 0xC5C0, 0xD0D5, 0xC5C1, 0xD0D6, 0xB576, 0xD0D7, 0xB577, + 0xD0D8, 0xB578, 0xD0D9, 0xB579, 0xD0DA, 0xB57A, 0xD0DB, 0xB581, + 0xD0DC, 0xC5C2, 0xD0DD, 0xC5C3, 0xD0DE, 0xB582, 0xD0DF, 0xB583, + 0xD0E0, 0xC5C4, 0xD0E1, 0xB584, 0xD0E2, 0xB585, 0xD0E3, 0xB586, + 0xD0E4, 0xC5C5, 0xD0E5, 0xB587, 0xD0E6, 0xB588, 0xD0E7, 0xB589, + 0xD0E8, 0xB58A, 0xD0E9, 0xB58B, 0xD0EA, 0xB58C, 0xD0EB, 0xB58D, + 0xD0EC, 0xC5C6, 0xD0ED, 0xC5C7, 0xD0EE, 0xB58E, 0xD0EF, 0xC5C8, + 0xD0F0, 0xC5C9, 0xD0F1, 0xC5CA, 0xD0F2, 0xB58F, 0xD0F3, 0xB590, + 0xD0F4, 0xB591, 0xD0F5, 0xB592, 0xD0F6, 0xB593, 0xD0F7, 0xB594, + 0xD0F8, 0xC5CB, 0xD0F9, 0xB595, 0xD0FA, 0xB596, 0xD0FB, 0xB597, + 0xD0FC, 0xB598, 0xD0FD, 0xB599, 0xD0FE, 0xB59A, 0xD0FF, 0xB59B, + 0xD100, 0xB59C, 0xD101, 0xB59D, 0xD102, 0xB59E, 0xD103, 0xB59F, + 0xD104, 0xB5A0, 0xD105, 0xB641, 0xD106, 0xB642, 0xD107, 0xB643, + 0xD108, 0xB644, 0xD109, 0xB645, 0xD10A, 0xB646, 0xD10B, 0xB647, + 0xD10C, 0xB648, 0xD10D, 0xC5CC, 0xD10E, 0xB649, 0xD10F, 0xB64A, + 0xD110, 0xB64B, 0xD111, 0xB64C, 0xD112, 0xB64D, 0xD113, 0xB64E, + 0xD114, 0xB64F, 0xD115, 0xB650, 0xD116, 0xB651, 0xD117, 0xB652, + 0xD118, 0xB653, 0xD119, 0xB654, 0xD11A, 0xB655, 0xD11B, 0xB656, + 0xD11C, 0xB657, 0xD11D, 0xB658, 0xD11E, 0xB659, 0xD11F, 0xB65A, + 0xD120, 0xB661, 0xD121, 0xB662, 0xD122, 0xB663, 0xD123, 0xB664, + 0xD124, 0xB665, 0xD125, 0xB666, 0xD126, 0xB667, 0xD127, 0xB668, + 0xD128, 0xB669, 0xD129, 0xB66A, 0xD12A, 0xB66B, 0xD12B, 0xB66C, + 0xD12C, 0xB66D, 0xD12D, 0xB66E, 0xD12E, 0xB66F, 0xD12F, 0xB670, + 0xD130, 0xC5CD, 0xD131, 0xC5CE, 0xD132, 0xB671, 0xD133, 0xB672, + 0xD134, 0xC5CF, 0xD135, 0xB673, 0xD136, 0xB674, 0xD137, 0xB675, + 0xD138, 0xC5D0, 0xD139, 0xB676, 0xD13A, 0xC5D1, 0xD13B, 0xB677, + 0xD13C, 0xB678, 0xD13D, 0xB679, 0xD13E, 0xB67A, 0xD13F, 0xB681, + 0xD140, 0xC5D2, 0xD141, 0xC5D3, 0xD142, 0xB682, 0xD143, 0xC5D4, + 0xD144, 0xC5D5, 0xD145, 0xC5D6, 0xD146, 0xB683, 0xD147, 0xB684, + 0xD148, 0xB685, 0xD149, 0xB686, 0xD14A, 0xB687, 0xD14B, 0xB688, + 0xD14C, 0xC5D7, 0xD14D, 0xC5D8, 0xD14E, 0xB689, 0xD14F, 0xB68A, + 0xD150, 0xC5D9, 0xD151, 0xB68B, 0xD152, 0xB68C, 0xD153, 0xB68D, + 0xD154, 0xC5DA, 0xD155, 0xB68E, 0xD156, 0xB68F, 0xD157, 0xB690, + 0xD158, 0xB691, 0xD159, 0xB692, 0xD15A, 0xB693, 0xD15B, 0xB694, + 0xD15C, 0xC5DB, 0xD15D, 0xC5DC, 0xD15E, 0xB695, 0xD15F, 0xC5DD, + 0xD160, 0xB696, 0xD161, 0xC5DE, 0xD162, 0xB697, 0xD163, 0xB698, + 0xD164, 0xB699, 0xD165, 0xB69A, 0xD166, 0xB69B, 0xD167, 0xB69C, + 0xD168, 0xC5DF, 0xD169, 0xB69D, 0xD16A, 0xB69E, 0xD16B, 0xB69F, + 0xD16C, 0xC5E0, 0xD16D, 0xB6A0, 0xD16E, 0xB741, 0xD16F, 0xB742, + 0xD170, 0xB743, 0xD171, 0xB744, 0xD172, 0xB745, 0xD173, 0xB746, + 0xD174, 0xB747, 0xD175, 0xB748, 0xD176, 0xB749, 0xD177, 0xB74A, + 0xD178, 0xB74B, 0xD179, 0xB74C, 0xD17A, 0xB74D, 0xD17B, 0xB74E, + 0xD17C, 0xC5E1, 0xD17D, 0xB74F, 0xD17E, 0xB750, 0xD17F, 0xB751, + 0xD180, 0xB752, 0xD181, 0xB753, 0xD182, 0xB754, 0xD183, 0xB755, + 0xD184, 0xC5E2, 0xD185, 0xB756, 0xD186, 0xB757, 0xD187, 0xB758, + 0xD188, 0xC5E3, 0xD189, 0xB759, 0xD18A, 0xB75A, 0xD18B, 0xB761, + 0xD18C, 0xB762, 0xD18D, 0xB763, 0xD18E, 0xB764, 0xD18F, 0xB765, + 0xD190, 0xB766, 0xD191, 0xB767, 0xD192, 0xB768, 0xD193, 0xB769, + 0xD194, 0xB76A, 0xD195, 0xB76B, 0xD196, 0xB76C, 0xD197, 0xB76D, + 0xD198, 0xB76E, 0xD199, 0xB76F, 0xD19A, 0xB770, 0xD19B, 0xB771, + 0xD19C, 0xB772, 0xD19D, 0xB773, 0xD19E, 0xB774, 0xD19F, 0xB775, + 0xD1A0, 0xC5E4, 0xD1A1, 0xC5E5, 0xD1A2, 0xB776, 0xD1A3, 0xB777, + 0xD1A4, 0xC5E6, 0xD1A5, 0xB778, 0xD1A6, 0xB779, 0xD1A7, 0xB77A, + 0xD1A8, 0xC5E7, 0xD1A9, 0xB781, 0xD1AA, 0xB782, 0xD1AB, 0xB783, + 0xD1AC, 0xB784, 0xD1AD, 0xB785, 0xD1AE, 0xB786, 0xD1AF, 0xB787, + 0xD1B0, 0xC5E8, 0xD1B1, 0xC5E9, 0xD1B2, 0xB788, 0xD1B3, 0xC5EA, + 0xD1B4, 0xB789, 0xD1B5, 0xC5EB, 0xD1B6, 0xB78A, 0xD1B7, 0xB78B, + 0xD1B8, 0xB78C, 0xD1B9, 0xB78D, 0xD1BA, 0xC5EC, 0xD1BB, 0xB78E, + 0xD1BC, 0xC5ED, 0xD1BD, 0xB78F, 0xD1BE, 0xB790, 0xD1BF, 0xB791, + 0xD1C0, 0xC5EE, 0xD1C1, 0xB792, 0xD1C2, 0xB793, 0xD1C3, 0xB794, + 0xD1C4, 0xB795, 0xD1C5, 0xB796, 0xD1C6, 0xB797, 0xD1C7, 0xB798, + 0xD1C8, 0xB799, 0xD1C9, 0xB79A, 0xD1CA, 0xB79B, 0xD1CB, 0xB79C, + 0xD1CC, 0xB79D, 0xD1CD, 0xB79E, 0xD1CE, 0xB79F, 0xD1CF, 0xB7A0, + 0xD1D0, 0xB841, 0xD1D1, 0xB842, 0xD1D2, 0xB843, 0xD1D3, 0xB844, + 0xD1D4, 0xB845, 0xD1D5, 0xB846, 0xD1D6, 0xB847, 0xD1D7, 0xB848, + 0xD1D8, 0xC5EF, 0xD1D9, 0xB849, 0xD1DA, 0xB84A, 0xD1DB, 0xB84B, + 0xD1DC, 0xB84C, 0xD1DD, 0xB84D, 0xD1DE, 0xB84E, 0xD1DF, 0xB84F, + 0xD1E0, 0xB850, 0xD1E1, 0xB851, 0xD1E2, 0xB852, 0xD1E3, 0xB853, + 0xD1E4, 0xB854, 0xD1E5, 0xB855, 0xD1E6, 0xB856, 0xD1E7, 0xB857, + 0xD1E8, 0xB858, 0xD1E9, 0xB859, 0xD1EA, 0xB85A, 0xD1EB, 0xB861, + 0xD1EC, 0xB862, 0xD1ED, 0xB863, 0xD1EE, 0xB864, 0xD1EF, 0xB865, + 0xD1F0, 0xB866, 0xD1F1, 0xB867, 0xD1F2, 0xB868, 0xD1F3, 0xB869, + 0xD1F4, 0xC5F0, 0xD1F5, 0xB86A, 0xD1F6, 0xB86B, 0xD1F7, 0xB86C, + 0xD1F8, 0xC5F1, 0xD1F9, 0xB86D, 0xD1FA, 0xB86E, 0xD1FB, 0xB86F, + 0xD1FC, 0xB870, 0xD1FD, 0xB871, 0xD1FE, 0xB872, 0xD1FF, 0xB873, + 0xD200, 0xB874, 0xD201, 0xB875, 0xD202, 0xB876, 0xD203, 0xB877, + 0xD204, 0xB878, 0xD205, 0xB879, 0xD206, 0xB87A, 0xD207, 0xC5F2, + 0xD208, 0xB881, 0xD209, 0xC5F3, 0xD20A, 0xB882, 0xD20B, 0xB883, + 0xD20C, 0xB884, 0xD20D, 0xB885, 0xD20E, 0xB886, 0xD20F, 0xB887, + 0xD210, 0xC5F4, 0xD211, 0xB888, 0xD212, 0xB889, 0xD213, 0xB88A, + 0xD214, 0xB88B, 0xD215, 0xB88C, 0xD216, 0xB88D, 0xD217, 0xB88E, + 0xD218, 0xB88F, 0xD219, 0xB890, 0xD21A, 0xB891, 0xD21B, 0xB892, + 0xD21C, 0xB893, 0xD21D, 0xB894, 0xD21E, 0xB895, 0xD21F, 0xB896, + 0xD220, 0xB897, 0xD221, 0xB898, 0xD222, 0xB899, 0xD223, 0xB89A, + 0xD224, 0xB89B, 0xD225, 0xB89C, 0xD226, 0xB89D, 0xD227, 0xB89E, + 0xD228, 0xB89F, 0xD229, 0xB8A0, 0xD22A, 0xB941, 0xD22B, 0xB942, + 0xD22C, 0xC5F5, 0xD22D, 0xC5F6, 0xD22E, 0xB943, 0xD22F, 0xB944, + 0xD230, 0xC5F7, 0xD231, 0xB945, 0xD232, 0xB946, 0xD233, 0xB947, + 0xD234, 0xC5F8, 0xD235, 0xB948, 0xD236, 0xB949, 0xD237, 0xB94A, + 0xD238, 0xB94B, 0xD239, 0xB94C, 0xD23A, 0xB94D, 0xD23B, 0xB94E, + 0xD23C, 0xC5F9, 0xD23D, 0xC5FA, 0xD23E, 0xB94F, 0xD23F, 0xC5FB, + 0xD240, 0xB950, 0xD241, 0xC5FC, 0xD242, 0xB951, 0xD243, 0xB952, + 0xD244, 0xB953, 0xD245, 0xB954, 0xD246, 0xB955, 0xD247, 0xB956, + 0xD248, 0xC5FD, 0xD249, 0xB957, 0xD24A, 0xB958, 0xD24B, 0xB959, + 0xD24C, 0xB95A, 0xD24D, 0xB961, 0xD24E, 0xB962, 0xD24F, 0xB963, + 0xD250, 0xB964, 0xD251, 0xB965, 0xD252, 0xB966, 0xD253, 0xB967, + 0xD254, 0xB968, 0xD255, 0xB969, 0xD256, 0xB96A, 0xD257, 0xB96B, + 0xD258, 0xB96C, 0xD259, 0xB96D, 0xD25A, 0xB96E, 0xD25B, 0xB96F, + 0xD25C, 0xC5FE, 0xD25D, 0xB970, 0xD25E, 0xB971, 0xD25F, 0xB972, + 0xD260, 0xB973, 0xD261, 0xB974, 0xD262, 0xB975, 0xD263, 0xB976, + 0xD264, 0xC6A1, 0xD265, 0xB977, 0xD266, 0xB978, 0xD267, 0xB979, + 0xD268, 0xB97A, 0xD269, 0xB981, 0xD26A, 0xB982, 0xD26B, 0xB983, + 0xD26C, 0xB984, 0xD26D, 0xB985, 0xD26E, 0xB986, 0xD26F, 0xB987, + 0xD270, 0xB988, 0xD271, 0xB989, 0xD272, 0xB98A, 0xD273, 0xB98B, + 0xD274, 0xB98C, 0xD275, 0xB98D, 0xD276, 0xB98E, 0xD277, 0xB98F, + 0xD278, 0xB990, 0xD279, 0xB991, 0xD27A, 0xB992, 0xD27B, 0xB993, + 0xD27C, 0xB994, 0xD27D, 0xB995, 0xD27E, 0xB996, 0xD27F, 0xB997, + 0xD280, 0xC6A2, 0xD281, 0xC6A3, 0xD282, 0xB998, 0xD283, 0xB999, + 0xD284, 0xC6A4, 0xD285, 0xB99A, 0xD286, 0xB99B, 0xD287, 0xB99C, + 0xD288, 0xC6A5, 0xD289, 0xB99D, 0xD28A, 0xB99E, 0xD28B, 0xB99F, + 0xD28C, 0xB9A0, 0xD28D, 0xBA41, 0xD28E, 0xBA42, 0xD28F, 0xBA43, + 0xD290, 0xC6A6, 0xD291, 0xC6A7, 0xD292, 0xBA44, 0xD293, 0xBA45, + 0xD294, 0xBA46, 0xD295, 0xC6A8, 0xD296, 0xBA47, 0xD297, 0xBA48, + 0xD298, 0xBA49, 0xD299, 0xBA4A, 0xD29A, 0xBA4B, 0xD29B, 0xBA4C, + 0xD29C, 0xC6A9, 0xD29D, 0xBA4D, 0xD29E, 0xBA4E, 0xD29F, 0xBA4F, + 0xD2A0, 0xC6AA, 0xD2A1, 0xBA50, 0xD2A2, 0xBA51, 0xD2A3, 0xBA52, + 0xD2A4, 0xC6AB, 0xD2A5, 0xBA53, 0xD2A6, 0xBA54, 0xD2A7, 0xBA55, + 0xD2A8, 0xBA56, 0xD2A9, 0xBA57, 0xD2AA, 0xBA58, 0xD2AB, 0xBA59, + 0xD2AC, 0xC6AC, 0xD2AD, 0xBA5A, 0xD2AE, 0xBA61, 0xD2AF, 0xBA62, + 0xD2B0, 0xBA63, 0xD2B1, 0xC6AD, 0xD2B2, 0xBA64, 0xD2B3, 0xBA65, + 0xD2B4, 0xBA66, 0xD2B5, 0xBA67, 0xD2B6, 0xBA68, 0xD2B7, 0xBA69, + 0xD2B8, 0xC6AE, 0xD2B9, 0xC6AF, 0xD2BA, 0xBA6A, 0xD2BB, 0xBA6B, + 0xD2BC, 0xC6B0, 0xD2BD, 0xBA6C, 0xD2BE, 0xBA6D, 0xD2BF, 0xC6B1, + 0xD2C0, 0xC6B2, 0xD2C1, 0xBA6E, 0xD2C2, 0xC6B3, 0xD2C3, 0xBA6F, + 0xD2C4, 0xBA70, 0xD2C5, 0xBA71, 0xD2C6, 0xBA72, 0xD2C7, 0xBA73, + 0xD2C8, 0xC6B4, 0xD2C9, 0xC6B5, 0xD2CA, 0xBA74, 0xD2CB, 0xC6B6, + 0xD2CC, 0xBA75, 0xD2CD, 0xBA76, 0xD2CE, 0xBA77, 0xD2CF, 0xBA78, + 0xD2D0, 0xBA79, 0xD2D1, 0xBA7A, 0xD2D2, 0xBA81, 0xD2D3, 0xBA82, + 0xD2D4, 0xC6B7, 0xD2D5, 0xBA83, 0xD2D6, 0xBA84, 0xD2D7, 0xBA85, + 0xD2D8, 0xC6B8, 0xD2D9, 0xBA86, 0xD2DA, 0xBA87, 0xD2DB, 0xBA88, + 0xD2DC, 0xC6B9, 0xD2DD, 0xBA89, 0xD2DE, 0xBA8A, 0xD2DF, 0xBA8B, + 0xD2E0, 0xBA8C, 0xD2E1, 0xBA8D, 0xD2E2, 0xBA8E, 0xD2E3, 0xBA8F, + 0xD2E4, 0xC6BA, 0xD2E5, 0xC6BB, 0xD2E6, 0xBA90, 0xD2E7, 0xBA91, + 0xD2E8, 0xBA92, 0xD2E9, 0xBA93, 0xD2EA, 0xBA94, 0xD2EB, 0xBA95, + 0xD2EC, 0xBA96, 0xD2ED, 0xBA97, 0xD2EE, 0xBA98, 0xD2EF, 0xBA99, + 0xD2F0, 0xC6BC, 0xD2F1, 0xC6BD, 0xD2F2, 0xBA9A, 0xD2F3, 0xBA9B, + 0xD2F4, 0xC6BE, 0xD2F5, 0xBA9C, 0xD2F6, 0xBA9D, 0xD2F7, 0xBA9E, + 0xD2F8, 0xC6BF, 0xD2F9, 0xBA9F, 0xD2FA, 0xBAA0, 0xD2FB, 0xBB41, + 0xD2FC, 0xBB42, 0xD2FD, 0xBB43, 0xD2FE, 0xBB44, 0xD2FF, 0xBB45, + 0xD300, 0xC6C0, 0xD301, 0xC6C1, 0xD302, 0xBB46, 0xD303, 0xC6C2, + 0xD304, 0xBB47, 0xD305, 0xC6C3, 0xD306, 0xBB48, 0xD307, 0xBB49, + 0xD308, 0xBB4A, 0xD309, 0xBB4B, 0xD30A, 0xBB4C, 0xD30B, 0xBB4D, + 0xD30C, 0xC6C4, 0xD30D, 0xC6C5, 0xD30E, 0xC6C6, 0xD30F, 0xBB4E, + 0xD310, 0xC6C7, 0xD311, 0xBB4F, 0xD312, 0xBB50, 0xD313, 0xBB51, + 0xD314, 0xC6C8, 0xD315, 0xBB52, 0xD316, 0xC6C9, 0xD317, 0xBB53, + 0xD318, 0xBB54, 0xD319, 0xBB55, 0xD31A, 0xBB56, 0xD31B, 0xBB57, + 0xD31C, 0xC6CA, 0xD31D, 0xC6CB, 0xD31E, 0xBB58, 0xD31F, 0xC6CC, + 0xD320, 0xC6CD, 0xD321, 0xC6CE, 0xD322, 0xBB59, 0xD323, 0xBB5A, + 0xD324, 0xBB61, 0xD325, 0xC6CF, 0xD326, 0xBB62, 0xD327, 0xBB63, + 0xD328, 0xC6D0, 0xD329, 0xC6D1, 0xD32A, 0xBB64, 0xD32B, 0xBB65, + 0xD32C, 0xC6D2, 0xD32D, 0xBB66, 0xD32E, 0xBB67, 0xD32F, 0xBB68, + 0xD330, 0xC6D3, 0xD331, 0xBB69, 0xD332, 0xBB6A, 0xD333, 0xBB6B, + 0xD334, 0xBB6C, 0xD335, 0xBB6D, 0xD336, 0xBB6E, 0xD337, 0xBB6F, + 0xD338, 0xC6D4, 0xD339, 0xC6D5, 0xD33A, 0xBB70, 0xD33B, 0xC6D6, + 0xD33C, 0xC6D7, 0xD33D, 0xC6D8, 0xD33E, 0xBB71, 0xD33F, 0xBB72, + 0xD340, 0xBB73, 0xD341, 0xBB74, 0xD342, 0xBB75, 0xD343, 0xBB76, + 0xD344, 0xC6D9, 0xD345, 0xC6DA, 0xD346, 0xBB77, 0xD347, 0xBB78, + 0xD348, 0xBB79, 0xD349, 0xBB7A, 0xD34A, 0xBB81, 0xD34B, 0xBB82, + 0xD34C, 0xBB83, 0xD34D, 0xBB84, 0xD34E, 0xBB85, 0xD34F, 0xBB86, + 0xD350, 0xBB87, 0xD351, 0xBB88, 0xD352, 0xBB89, 0xD353, 0xBB8A, + 0xD354, 0xBB8B, 0xD355, 0xBB8C, 0xD356, 0xBB8D, 0xD357, 0xBB8E, + 0xD358, 0xBB8F, 0xD359, 0xBB90, 0xD35A, 0xBB91, 0xD35B, 0xBB92, + 0xD35C, 0xBB93, 0xD35D, 0xBB94, 0xD35E, 0xBB95, 0xD35F, 0xBB96, + 0xD360, 0xBB97, 0xD361, 0xBB98, 0xD362, 0xBB99, 0xD363, 0xBB9A, + 0xD364, 0xBB9B, 0xD365, 0xBB9C, 0xD366, 0xBB9D, 0xD367, 0xBB9E, + 0xD368, 0xBB9F, 0xD369, 0xBBA0, 0xD36A, 0xBC41, 0xD36B, 0xBC42, + 0xD36C, 0xBC43, 0xD36D, 0xBC44, 0xD36E, 0xBC45, 0xD36F, 0xBC46, + 0xD370, 0xBC47, 0xD371, 0xBC48, 0xD372, 0xBC49, 0xD373, 0xBC4A, + 0xD374, 0xBC4B, 0xD375, 0xBC4C, 0xD376, 0xBC4D, 0xD377, 0xBC4E, + 0xD378, 0xBC4F, 0xD379, 0xBC50, 0xD37A, 0xBC51, 0xD37B, 0xBC52, + 0xD37C, 0xC6DB, 0xD37D, 0xC6DC, 0xD37E, 0xBC53, 0xD37F, 0xBC54, + 0xD380, 0xC6DD, 0xD381, 0xBC55, 0xD382, 0xBC56, 0xD383, 0xBC57, + 0xD384, 0xC6DE, 0xD385, 0xBC58, 0xD386, 0xBC59, 0xD387, 0xBC5A, + 0xD388, 0xBC61, 0xD389, 0xBC62, 0xD38A, 0xBC63, 0xD38B, 0xBC64, + 0xD38C, 0xC6DF, 0xD38D, 0xC6E0, 0xD38E, 0xBC65, 0xD38F, 0xC6E1, + 0xD390, 0xC6E2, 0xD391, 0xC6E3, 0xD392, 0xBC66, 0xD393, 0xBC67, + 0xD394, 0xBC68, 0xD395, 0xBC69, 0xD396, 0xBC6A, 0xD397, 0xBC6B, + 0xD398, 0xC6E4, 0xD399, 0xC6E5, 0xD39A, 0xBC6C, 0xD39B, 0xBC6D, + 0xD39C, 0xC6E6, 0xD39D, 0xBC6E, 0xD39E, 0xBC6F, 0xD39F, 0xBC70, + 0xD3A0, 0xC6E7, 0xD3A1, 0xBC71, 0xD3A2, 0xBC72, 0xD3A3, 0xBC73, + 0xD3A4, 0xBC74, 0xD3A5, 0xBC75, 0xD3A6, 0xBC76, 0xD3A7, 0xBC77, + 0xD3A8, 0xC6E8, 0xD3A9, 0xC6E9, 0xD3AA, 0xBC78, 0xD3AB, 0xC6EA, + 0xD3AC, 0xBC79, 0xD3AD, 0xC6EB, 0xD3AE, 0xBC7A, 0xD3AF, 0xBC81, + 0xD3B0, 0xBC82, 0xD3B1, 0xBC83, 0xD3B2, 0xBC84, 0xD3B3, 0xBC85, + 0xD3B4, 0xC6EC, 0xD3B5, 0xBC86, 0xD3B6, 0xBC87, 0xD3B7, 0xBC88, + 0xD3B8, 0xC6ED, 0xD3B9, 0xBC89, 0xD3BA, 0xBC8A, 0xD3BB, 0xBC8B, + 0xD3BC, 0xC6EE, 0xD3BD, 0xBC8C, 0xD3BE, 0xBC8D, 0xD3BF, 0xBC8E, + 0xD3C0, 0xBC8F, 0xD3C1, 0xBC90, 0xD3C2, 0xBC91, 0xD3C3, 0xBC92, + 0xD3C4, 0xC6EF, 0xD3C5, 0xC6F0, 0xD3C6, 0xBC93, 0xD3C7, 0xBC94, + 0xD3C8, 0xC6F1, 0xD3C9, 0xC6F2, 0xD3CA, 0xBC95, 0xD3CB, 0xBC96, + 0xD3CC, 0xBC97, 0xD3CD, 0xBC98, 0xD3CE, 0xBC99, 0xD3CF, 0xBC9A, + 0xD3D0, 0xC6F3, 0xD3D1, 0xBC9B, 0xD3D2, 0xBC9C, 0xD3D3, 0xBC9D, + 0xD3D4, 0xBC9E, 0xD3D5, 0xBC9F, 0xD3D6, 0xBCA0, 0xD3D7, 0xBD41, + 0xD3D8, 0xC6F4, 0xD3D9, 0xBD42, 0xD3DA, 0xBD43, 0xD3DB, 0xBD44, + 0xD3DC, 0xBD45, 0xD3DD, 0xBD46, 0xD3DE, 0xBD47, 0xD3DF, 0xBD48, + 0xD3E0, 0xBD49, 0xD3E1, 0xC6F5, 0xD3E2, 0xBD4A, 0xD3E3, 0xC6F6, + 0xD3E4, 0xBD4B, 0xD3E5, 0xBD4C, 0xD3E6, 0xBD4D, 0xD3E7, 0xBD4E, + 0xD3E8, 0xBD4F, 0xD3E9, 0xBD50, 0xD3EA, 0xBD51, 0xD3EB, 0xBD52, + 0xD3EC, 0xC6F7, 0xD3ED, 0xC6F8, 0xD3EE, 0xBD53, 0xD3EF, 0xBD54, + 0xD3F0, 0xC6F9, 0xD3F1, 0xBD55, 0xD3F2, 0xBD56, 0xD3F3, 0xBD57, + 0xD3F4, 0xC6FA, 0xD3F5, 0xBD58, 0xD3F6, 0xBD59, 0xD3F7, 0xBD5A, + 0xD3F8, 0xBD61, 0xD3F9, 0xBD62, 0xD3FA, 0xBD63, 0xD3FB, 0xBD64, + 0xD3FC, 0xC6FB, 0xD3FD, 0xC6FC, 0xD3FE, 0xBD65, 0xD3FF, 0xC6FD, + 0xD400, 0xBD66, 0xD401, 0xC6FE, 0xD402, 0xBD67, 0xD403, 0xBD68, + 0xD404, 0xBD69, 0xD405, 0xBD6A, 0xD406, 0xBD6B, 0xD407, 0xBD6C, + 0xD408, 0xC7A1, 0xD409, 0xBD6D, 0xD40A, 0xBD6E, 0xD40B, 0xBD6F, + 0xD40C, 0xBD70, 0xD40D, 0xBD71, 0xD40E, 0xBD72, 0xD40F, 0xBD73, + 0xD410, 0xBD74, 0xD411, 0xBD75, 0xD412, 0xBD76, 0xD413, 0xBD77, + 0xD414, 0xBD78, 0xD415, 0xBD79, 0xD416, 0xBD7A, 0xD417, 0xBD81, + 0xD418, 0xBD82, 0xD419, 0xBD83, 0xD41A, 0xBD84, 0xD41B, 0xBD85, + 0xD41C, 0xBD86, 0xD41D, 0xC7A2, 0xD41E, 0xBD87, 0xD41F, 0xBD88, + 0xD420, 0xBD89, 0xD421, 0xBD8A, 0xD422, 0xBD8B, 0xD423, 0xBD8C, + 0xD424, 0xBD8D, 0xD425, 0xBD8E, 0xD426, 0xBD8F, 0xD427, 0xBD90, + 0xD428, 0xBD91, 0xD429, 0xBD92, 0xD42A, 0xBD93, 0xD42B, 0xBD94, + 0xD42C, 0xBD95, 0xD42D, 0xBD96, 0xD42E, 0xBD97, 0xD42F, 0xBD98, + 0xD430, 0xBD99, 0xD431, 0xBD9A, 0xD432, 0xBD9B, 0xD433, 0xBD9C, + 0xD434, 0xBD9D, 0xD435, 0xBD9E, 0xD436, 0xBD9F, 0xD437, 0xBDA0, + 0xD438, 0xBE41, 0xD439, 0xBE42, 0xD43A, 0xBE43, 0xD43B, 0xBE44, + 0xD43C, 0xBE45, 0xD43D, 0xBE46, 0xD43E, 0xBE47, 0xD43F, 0xBE48, + 0xD440, 0xC7A3, 0xD441, 0xBE49, 0xD442, 0xBE4A, 0xD443, 0xBE4B, + 0xD444, 0xC7A4, 0xD445, 0xBE4C, 0xD446, 0xBE4D, 0xD447, 0xBE4E, + 0xD448, 0xBE4F, 0xD449, 0xBE50, 0xD44A, 0xBE51, 0xD44B, 0xBE52, + 0xD44C, 0xBE53, 0xD44D, 0xBE54, 0xD44E, 0xBE55, 0xD44F, 0xBE56, + 0xD450, 0xBE57, 0xD451, 0xBE58, 0xD452, 0xBE59, 0xD453, 0xBE5A, + 0xD454, 0xBE61, 0xD455, 0xBE62, 0xD456, 0xBE63, 0xD457, 0xBE64, + 0xD458, 0xBE65, 0xD459, 0xBE66, 0xD45A, 0xBE67, 0xD45B, 0xBE68, + 0xD45C, 0xC7A5, 0xD45D, 0xBE69, 0xD45E, 0xBE6A, 0xD45F, 0xBE6B, + 0xD460, 0xC7A6, 0xD461, 0xBE6C, 0xD462, 0xBE6D, 0xD463, 0xBE6E, + 0xD464, 0xC7A7, 0xD465, 0xBE6F, 0xD466, 0xBE70, 0xD467, 0xBE71, + 0xD468, 0xBE72, 0xD469, 0xBE73, 0xD46A, 0xBE74, 0xD46B, 0xBE75, + 0xD46C, 0xBE76, 0xD46D, 0xC7A8, 0xD46E, 0xBE77, 0xD46F, 0xC7A9, + 0xD470, 0xBE78, 0xD471, 0xBE79, 0xD472, 0xBE7A, 0xD473, 0xBE81, + 0xD474, 0xBE82, 0xD475, 0xBE83, 0xD476, 0xBE84, 0xD477, 0xBE85, + 0xD478, 0xC7AA, 0xD479, 0xC7AB, 0xD47A, 0xBE86, 0xD47B, 0xBE87, + 0xD47C, 0xC7AC, 0xD47D, 0xBE88, 0xD47E, 0xBE89, 0xD47F, 0xC7AD, + 0xD480, 0xC7AE, 0xD481, 0xBE8A, 0xD482, 0xC7AF, 0xD483, 0xBE8B, + 0xD484, 0xBE8C, 0xD485, 0xBE8D, 0xD486, 0xBE8E, 0xD487, 0xBE8F, + 0xD488, 0xC7B0, 0xD489, 0xC7B1, 0xD48A, 0xBE90, 0xD48B, 0xC7B2, + 0xD48C, 0xBE91, 0xD48D, 0xC7B3, 0xD48E, 0xBE92, 0xD48F, 0xBE93, + 0xD490, 0xBE94, 0xD491, 0xBE95, 0xD492, 0xBE96, 0xD493, 0xBE97, + 0xD494, 0xC7B4, 0xD495, 0xBE98, 0xD496, 0xBE99, 0xD497, 0xBE9A, + 0xD498, 0xBE9B, 0xD499, 0xBE9C, 0xD49A, 0xBE9D, 0xD49B, 0xBE9E, + 0xD49C, 0xBE9F, 0xD49D, 0xBEA0, 0xD49E, 0xBF41, 0xD49F, 0xBF42, + 0xD4A0, 0xBF43, 0xD4A1, 0xBF44, 0xD4A2, 0xBF45, 0xD4A3, 0xBF46, + 0xD4A4, 0xBF47, 0xD4A5, 0xBF48, 0xD4A6, 0xBF49, 0xD4A7, 0xBF4A, + 0xD4A8, 0xBF4B, 0xD4A9, 0xC7B5, 0xD4AA, 0xBF4C, 0xD4AB, 0xBF4D, + 0xD4AC, 0xBF4E, 0xD4AD, 0xBF4F, 0xD4AE, 0xBF50, 0xD4AF, 0xBF51, + 0xD4B0, 0xBF52, 0xD4B1, 0xBF53, 0xD4B2, 0xBF54, 0xD4B3, 0xBF55, + 0xD4B4, 0xBF56, 0xD4B5, 0xBF57, 0xD4B6, 0xBF58, 0xD4B7, 0xBF59, + 0xD4B8, 0xBF5A, 0xD4B9, 0xBF61, 0xD4BA, 0xBF62, 0xD4BB, 0xBF63, + 0xD4BC, 0xBF64, 0xD4BD, 0xBF65, 0xD4BE, 0xBF66, 0xD4BF, 0xBF67, + 0xD4C0, 0xBF68, 0xD4C1, 0xBF69, 0xD4C2, 0xBF6A, 0xD4C3, 0xBF6B, + 0xD4C4, 0xBF6C, 0xD4C5, 0xBF6D, 0xD4C6, 0xBF6E, 0xD4C7, 0xBF6F, + 0xD4C8, 0xBF70, 0xD4C9, 0xBF71, 0xD4CA, 0xBF72, 0xD4CB, 0xBF73, + 0xD4CC, 0xC7B6, 0xD4CD, 0xBF74, 0xD4CE, 0xBF75, 0xD4CF, 0xBF76, + 0xD4D0, 0xC7B7, 0xD4D1, 0xBF77, 0xD4D2, 0xBF78, 0xD4D3, 0xBF79, + 0xD4D4, 0xC7B8, 0xD4D5, 0xBF7A, 0xD4D6, 0xBF81, 0xD4D7, 0xBF82, + 0xD4D8, 0xBF83, 0xD4D9, 0xBF84, 0xD4DA, 0xBF85, 0xD4DB, 0xBF86, + 0xD4DC, 0xC7B9, 0xD4DD, 0xBF87, 0xD4DE, 0xBF88, 0xD4DF, 0xC7BA, + 0xD4E0, 0xBF89, 0xD4E1, 0xBF8A, 0xD4E2, 0xBF8B, 0xD4E3, 0xBF8C, + 0xD4E4, 0xBF8D, 0xD4E5, 0xBF8E, 0xD4E6, 0xBF8F, 0xD4E7, 0xBF90, + 0xD4E8, 0xC7BB, 0xD4E9, 0xBF91, 0xD4EA, 0xBF92, 0xD4EB, 0xBF93, + 0xD4EC, 0xC7BC, 0xD4ED, 0xBF94, 0xD4EE, 0xBF95, 0xD4EF, 0xBF96, + 0xD4F0, 0xC7BD, 0xD4F1, 0xBF97, 0xD4F2, 0xBF98, 0xD4F3, 0xBF99, + 0xD4F4, 0xBF9A, 0xD4F5, 0xBF9B, 0xD4F6, 0xBF9C, 0xD4F7, 0xBF9D, + 0xD4F8, 0xC7BE, 0xD4F9, 0xBF9E, 0xD4FA, 0xBF9F, 0xD4FB, 0xC7BF, + 0xD4FC, 0xBFA0, 0xD4FD, 0xC7C0, 0xD4FE, 0xC041, 0xD4FF, 0xC042, + 0xD500, 0xC043, 0xD501, 0xC044, 0xD502, 0xC045, 0xD503, 0xC046, + 0xD504, 0xC7C1, 0xD505, 0xC047, 0xD506, 0xC048, 0xD507, 0xC049, + 0xD508, 0xC7C2, 0xD509, 0xC04A, 0xD50A, 0xC04B, 0xD50B, 0xC04C, + 0xD50C, 0xC7C3, 0xD50D, 0xC04D, 0xD50E, 0xC04E, 0xD50F, 0xC04F, + 0xD510, 0xC050, 0xD511, 0xC051, 0xD512, 0xC052, 0xD513, 0xC053, + 0xD514, 0xC7C4, 0xD515, 0xC7C5, 0xD516, 0xC054, 0xD517, 0xC7C6, + 0xD518, 0xC055, 0xD519, 0xC056, 0xD51A, 0xC057, 0xD51B, 0xC058, + 0xD51C, 0xC059, 0xD51D, 0xC05A, 0xD51E, 0xC061, 0xD51F, 0xC062, + 0xD520, 0xC063, 0xD521, 0xC064, 0xD522, 0xC065, 0xD523, 0xC066, + 0xD524, 0xC067, 0xD525, 0xC068, 0xD526, 0xC069, 0xD527, 0xC06A, + 0xD528, 0xC06B, 0xD529, 0xC06C, 0xD52A, 0xC06D, 0xD52B, 0xC06E, + 0xD52C, 0xC06F, 0xD52D, 0xC070, 0xD52E, 0xC071, 0xD52F, 0xC072, + 0xD530, 0xC073, 0xD531, 0xC074, 0xD532, 0xC075, 0xD533, 0xC076, + 0xD534, 0xC077, 0xD535, 0xC078, 0xD536, 0xC079, 0xD537, 0xC07A, + 0xD538, 0xC081, 0xD539, 0xC082, 0xD53A, 0xC083, 0xD53B, 0xC084, + 0xD53C, 0xC7C7, 0xD53D, 0xC7C8, 0xD53E, 0xC085, 0xD53F, 0xC086, + 0xD540, 0xC7C9, 0xD541, 0xC087, 0xD542, 0xC088, 0xD543, 0xC089, + 0xD544, 0xC7CA, 0xD545, 0xC08A, 0xD546, 0xC08B, 0xD547, 0xC08C, + 0xD548, 0xC08D, 0xD549, 0xC08E, 0xD54A, 0xC08F, 0xD54B, 0xC090, + 0xD54C, 0xC7CB, 0xD54D, 0xC7CC, 0xD54E, 0xC091, 0xD54F, 0xC7CD, + 0xD550, 0xC092, 0xD551, 0xC7CE, 0xD552, 0xC093, 0xD553, 0xC094, + 0xD554, 0xC095, 0xD555, 0xC096, 0xD556, 0xC097, 0xD557, 0xC098, + 0xD558, 0xC7CF, 0xD559, 0xC7D0, 0xD55A, 0xC099, 0xD55B, 0xC09A, + 0xD55C, 0xC7D1, 0xD55D, 0xC09B, 0xD55E, 0xC09C, 0xD55F, 0xC09D, + 0xD560, 0xC7D2, 0xD561, 0xC09E, 0xD562, 0xC09F, 0xD563, 0xC0A0, + 0xD564, 0xC141, 0xD565, 0xC7D3, 0xD566, 0xC142, 0xD567, 0xC143, + 0xD568, 0xC7D4, 0xD569, 0xC7D5, 0xD56A, 0xC144, 0xD56B, 0xC7D6, + 0xD56C, 0xC145, 0xD56D, 0xC7D7, 0xD56E, 0xC146, 0xD56F, 0xC147, + 0xD570, 0xC148, 0xD571, 0xC149, 0xD572, 0xC14A, 0xD573, 0xC14B, + 0xD574, 0xC7D8, 0xD575, 0xC7D9, 0xD576, 0xC14C, 0xD577, 0xC14D, + 0xD578, 0xC7DA, 0xD579, 0xC14E, 0xD57A, 0xC14F, 0xD57B, 0xC150, + 0xD57C, 0xC7DB, 0xD57D, 0xC151, 0xD57E, 0xC152, 0xD57F, 0xC153, + 0xD580, 0xC154, 0xD581, 0xC155, 0xD582, 0xC156, 0xD583, 0xC157, + 0xD584, 0xC7DC, 0xD585, 0xC7DD, 0xD586, 0xC158, 0xD587, 0xC7DE, + 0xD588, 0xC7DF, 0xD589, 0xC7E0, 0xD58A, 0xC159, 0xD58B, 0xC15A, + 0xD58C, 0xC161, 0xD58D, 0xC162, 0xD58E, 0xC163, 0xD58F, 0xC164, + 0xD590, 0xC7E1, 0xD591, 0xC165, 0xD592, 0xC166, 0xD593, 0xC167, + 0xD594, 0xC168, 0xD595, 0xC169, 0xD596, 0xC16A, 0xD597, 0xC16B, + 0xD598, 0xC16C, 0xD599, 0xC16D, 0xD59A, 0xC16E, 0xD59B, 0xC16F, + 0xD59C, 0xC170, 0xD59D, 0xC171, 0xD59E, 0xC172, 0xD59F, 0xC173, + 0xD5A0, 0xC174, 0xD5A1, 0xC175, 0xD5A2, 0xC176, 0xD5A3, 0xC177, + 0xD5A4, 0xC178, 0xD5A5, 0xC7E2, 0xD5A6, 0xC179, 0xD5A7, 0xC17A, + 0xD5A8, 0xC181, 0xD5A9, 0xC182, 0xD5AA, 0xC183, 0xD5AB, 0xC184, + 0xD5AC, 0xC185, 0xD5AD, 0xC186, 0xD5AE, 0xC187, 0xD5AF, 0xC188, + 0xD5B0, 0xC189, 0xD5B1, 0xC18A, 0xD5B2, 0xC18B, 0xD5B3, 0xC18C, + 0xD5B4, 0xC18D, 0xD5B5, 0xC18E, 0xD5B6, 0xC18F, 0xD5B7, 0xC190, + 0xD5B8, 0xC191, 0xD5B9, 0xC192, 0xD5BA, 0xC193, 0xD5BB, 0xC194, + 0xD5BC, 0xC195, 0xD5BD, 0xC196, 0xD5BE, 0xC197, 0xD5BF, 0xC198, + 0xD5C0, 0xC199, 0xD5C1, 0xC19A, 0xD5C2, 0xC19B, 0xD5C3, 0xC19C, + 0xD5C4, 0xC19D, 0xD5C5, 0xC19E, 0xD5C6, 0xC19F, 0xD5C7, 0xC1A0, + 0xD5C8, 0xC7E3, 0xD5C9, 0xC7E4, 0xD5CA, 0xC241, 0xD5CB, 0xC242, + 0xD5CC, 0xC7E5, 0xD5CD, 0xC243, 0xD5CE, 0xC244, 0xD5CF, 0xC245, + 0xD5D0, 0xC7E6, 0xD5D1, 0xC246, 0xD5D2, 0xC7E7, 0xD5D3, 0xC247, + 0xD5D4, 0xC248, 0xD5D5, 0xC249, 0xD5D6, 0xC24A, 0xD5D7, 0xC24B, + 0xD5D8, 0xC7E8, 0xD5D9, 0xC7E9, 0xD5DA, 0xC24C, 0xD5DB, 0xC7EA, + 0xD5DC, 0xC24D, 0xD5DD, 0xC7EB, 0xD5DE, 0xC24E, 0xD5DF, 0xC24F, + 0xD5E0, 0xC250, 0xD5E1, 0xC251, 0xD5E2, 0xC252, 0xD5E3, 0xC253, + 0xD5E4, 0xC7EC, 0xD5E5, 0xC7ED, 0xD5E6, 0xC254, 0xD5E7, 0xC255, + 0xD5E8, 0xC7EE, 0xD5E9, 0xC256, 0xD5EA, 0xC257, 0xD5EB, 0xC258, + 0xD5EC, 0xC7EF, 0xD5ED, 0xC259, 0xD5EE, 0xC25A, 0xD5EF, 0xC261, + 0xD5F0, 0xC262, 0xD5F1, 0xC263, 0xD5F2, 0xC264, 0xD5F3, 0xC265, + 0xD5F4, 0xC7F0, 0xD5F5, 0xC7F1, 0xD5F6, 0xC266, 0xD5F7, 0xC7F2, + 0xD5F8, 0xC267, 0xD5F9, 0xC7F3, 0xD5FA, 0xC268, 0xD5FB, 0xC269, + 0xD5FC, 0xC26A, 0xD5FD, 0xC26B, 0xD5FE, 0xC26C, 0xD5FF, 0xC26D, + 0xD600, 0xC7F4, 0xD601, 0xC7F5, 0xD602, 0xC26E, 0xD603, 0xC26F, + 0xD604, 0xC7F6, 0xD605, 0xC270, 0xD606, 0xC271, 0xD607, 0xC272, + 0xD608, 0xC7F7, 0xD609, 0xC273, 0xD60A, 0xC274, 0xD60B, 0xC275, + 0xD60C, 0xC276, 0xD60D, 0xC277, 0xD60E, 0xC278, 0xD60F, 0xC279, + 0xD610, 0xC7F8, 0xD611, 0xC7F9, 0xD612, 0xC27A, 0xD613, 0xC7FA, + 0xD614, 0xC7FB, 0xD615, 0xC7FC, 0xD616, 0xC281, 0xD617, 0xC282, + 0xD618, 0xC283, 0xD619, 0xC284, 0xD61A, 0xC285, 0xD61B, 0xC286, + 0xD61C, 0xC7FD, 0xD61D, 0xC287, 0xD61E, 0xC288, 0xD61F, 0xC289, + 0xD620, 0xC7FE, 0xD621, 0xC28A, 0xD622, 0xC28B, 0xD623, 0xC28C, + 0xD624, 0xC8A1, 0xD625, 0xC28D, 0xD626, 0xC28E, 0xD627, 0xC28F, + 0xD628, 0xC290, 0xD629, 0xC291, 0xD62A, 0xC292, 0xD62B, 0xC293, + 0xD62C, 0xC294, 0xD62D, 0xC8A2, 0xD62E, 0xC295, 0xD62F, 0xC296, + 0xD630, 0xC297, 0xD631, 0xC298, 0xD632, 0xC299, 0xD633, 0xC29A, + 0xD634, 0xC29B, 0xD635, 0xC29C, 0xD636, 0xC29D, 0xD637, 0xC29E, + 0xD638, 0xC8A3, 0xD639, 0xC8A4, 0xD63A, 0xC29F, 0xD63B, 0xC2A0, + 0xD63C, 0xC8A5, 0xD63D, 0xC341, 0xD63E, 0xC342, 0xD63F, 0xC343, + 0xD640, 0xC8A6, 0xD641, 0xC344, 0xD642, 0xC345, 0xD643, 0xC346, + 0xD644, 0xC347, 0xD645, 0xC8A7, 0xD646, 0xC348, 0xD647, 0xC349, + 0xD648, 0xC8A8, 0xD649, 0xC8A9, 0xD64A, 0xC34A, 0xD64B, 0xC8AA, + 0xD64C, 0xC34B, 0xD64D, 0xC8AB, 0xD64E, 0xC34C, 0xD64F, 0xC34D, + 0xD650, 0xC34E, 0xD651, 0xC8AC, 0xD652, 0xC34F, 0xD653, 0xC350, + 0xD654, 0xC8AD, 0xD655, 0xC8AE, 0xD656, 0xC351, 0xD657, 0xC352, + 0xD658, 0xC8AF, 0xD659, 0xC353, 0xD65A, 0xC354, 0xD65B, 0xC355, + 0xD65C, 0xC8B0, 0xD65D, 0xC356, 0xD65E, 0xC357, 0xD65F, 0xC358, + 0xD660, 0xC359, 0xD661, 0xC35A, 0xD662, 0xC361, 0xD663, 0xC362, + 0xD664, 0xC363, 0xD665, 0xC364, 0xD666, 0xC365, 0xD667, 0xC8B1, + 0xD668, 0xC366, 0xD669, 0xC8B2, 0xD66A, 0xC367, 0xD66B, 0xC368, + 0xD66C, 0xC369, 0xD66D, 0xC36A, 0xD66E, 0xC36B, 0xD66F, 0xC36C, + 0xD670, 0xC8B3, 0xD671, 0xC8B4, 0xD672, 0xC36D, 0xD673, 0xC36E, + 0xD674, 0xC8B5, 0xD675, 0xC36F, 0xD676, 0xC370, 0xD677, 0xC371, + 0xD678, 0xC372, 0xD679, 0xC373, 0xD67A, 0xC374, 0xD67B, 0xC375, + 0xD67C, 0xC376, 0xD67D, 0xC377, 0xD67E, 0xC378, 0xD67F, 0xC379, + 0xD680, 0xC37A, 0xD681, 0xC381, 0xD682, 0xC382, 0xD683, 0xC8B6, + 0xD684, 0xC383, 0xD685, 0xC8B7, 0xD686, 0xC384, 0xD687, 0xC385, + 0xD688, 0xC386, 0xD689, 0xC387, 0xD68A, 0xC388, 0xD68B, 0xC389, + 0xD68C, 0xC8B8, 0xD68D, 0xC8B9, 0xD68E, 0xC38A, 0xD68F, 0xC38B, + 0xD690, 0xC8BA, 0xD691, 0xC38C, 0xD692, 0xC38D, 0xD693, 0xC38E, + 0xD694, 0xC8BB, 0xD695, 0xC38F, 0xD696, 0xC390, 0xD697, 0xC391, + 0xD698, 0xC392, 0xD699, 0xC393, 0xD69A, 0xC394, 0xD69B, 0xC395, + 0xD69C, 0xC396, 0xD69D, 0xC8BC, 0xD69E, 0xC397, 0xD69F, 0xC8BD, + 0xD6A0, 0xC398, 0xD6A1, 0xC8BE, 0xD6A2, 0xC399, 0xD6A3, 0xC39A, + 0xD6A4, 0xC39B, 0xD6A5, 0xC39C, 0xD6A6, 0xC39D, 0xD6A7, 0xC39E, + 0xD6A8, 0xC8BF, 0xD6A9, 0xC39F, 0xD6AA, 0xC3A0, 0xD6AB, 0xC441, + 0xD6AC, 0xC8C0, 0xD6AD, 0xC442, 0xD6AE, 0xC443, 0xD6AF, 0xC444, + 0xD6B0, 0xC8C1, 0xD6B1, 0xC445, 0xD6B2, 0xC446, 0xD6B3, 0xC447, + 0xD6B4, 0xC448, 0xD6B5, 0xC449, 0xD6B6, 0xC44A, 0xD6B7, 0xC44B, + 0xD6B8, 0xC44C, 0xD6B9, 0xC8C2, 0xD6BA, 0xC44D, 0xD6BB, 0xC8C3, + 0xD6BC, 0xC44E, 0xD6BD, 0xC44F, 0xD6BE, 0xC450, 0xD6BF, 0xC451, + 0xD6C0, 0xC452, 0xD6C1, 0xC453, 0xD6C2, 0xC454, 0xD6C3, 0xC455, + 0xD6C4, 0xC8C4, 0xD6C5, 0xC8C5, 0xD6C6, 0xC456, 0xD6C7, 0xC457, + 0xD6C8, 0xC8C6, 0xD6C9, 0xC458, 0xD6CA, 0xC459, 0xD6CB, 0xC45A, + 0xD6CC, 0xC8C7, 0xD6CD, 0xC461, 0xD6CE, 0xC462, 0xD6CF, 0xC463, + 0xD6D0, 0xC464, 0xD6D1, 0xC8C8, 0xD6D2, 0xC465, 0xD6D3, 0xC466, + 0xD6D4, 0xC8C9, 0xD6D5, 0xC467, 0xD6D6, 0xC468, 0xD6D7, 0xC8CA, + 0xD6D8, 0xC469, 0xD6D9, 0xC8CB, 0xD6DA, 0xC46A, 0xD6DB, 0xC46B, + 0xD6DC, 0xC46C, 0xD6DD, 0xC46D, 0xD6DE, 0xC46E, 0xD6DF, 0xC46F, + 0xD6E0, 0xC8CC, 0xD6E1, 0xC470, 0xD6E2, 0xC471, 0xD6E3, 0xC472, + 0xD6E4, 0xC8CD, 0xD6E5, 0xC473, 0xD6E6, 0xC474, 0xD6E7, 0xC475, + 0xD6E8, 0xC8CE, 0xD6E9, 0xC476, 0xD6EA, 0xC477, 0xD6EB, 0xC478, + 0xD6EC, 0xC479, 0xD6ED, 0xC47A, 0xD6EE, 0xC481, 0xD6EF, 0xC482, + 0xD6F0, 0xC8CF, 0xD6F1, 0xC483, 0xD6F2, 0xC484, 0xD6F3, 0xC485, + 0xD6F4, 0xC486, 0xD6F5, 0xC8D0, 0xD6F6, 0xC487, 0xD6F7, 0xC488, + 0xD6F8, 0xC489, 0xD6F9, 0xC48A, 0xD6FA, 0xC48B, 0xD6FB, 0xC48C, + 0xD6FC, 0xC8D1, 0xD6FD, 0xC8D2, 0xD6FE, 0xC48D, 0xD6FF, 0xC48E, + 0xD700, 0xC8D3, 0xD701, 0xC48F, 0xD702, 0xC490, 0xD703, 0xC491, + 0xD704, 0xC8D4, 0xD705, 0xC492, 0xD706, 0xC493, 0xD707, 0xC494, + 0xD708, 0xC495, 0xD709, 0xC496, 0xD70A, 0xC497, 0xD70B, 0xC498, + 0xD70C, 0xC499, 0xD70D, 0xC49A, 0xD70E, 0xC49B, 0xD70F, 0xC49C, + 0xD710, 0xC49D, 0xD711, 0xC8D5, 0xD712, 0xC49E, 0xD713, 0xC49F, + 0xD714, 0xC4A0, 0xD715, 0xC541, 0xD716, 0xC542, 0xD717, 0xC543, + 0xD718, 0xC8D6, 0xD719, 0xC8D7, 0xD71A, 0xC544, 0xD71B, 0xC545, + 0xD71C, 0xC8D8, 0xD71D, 0xC546, 0xD71E, 0xC547, 0xD71F, 0xC548, + 0xD720, 0xC8D9, 0xD721, 0xC549, 0xD722, 0xC54A, 0xD723, 0xC54B, + 0xD724, 0xC54C, 0xD725, 0xC54D, 0xD726, 0xC54E, 0xD727, 0xC54F, + 0xD728, 0xC8DA, 0xD729, 0xC8DB, 0xD72A, 0xC550, 0xD72B, 0xC8DC, + 0xD72C, 0xC551, 0xD72D, 0xC8DD, 0xD72E, 0xC552, 0xD72F, 0xC553, + 0xD730, 0xC554, 0xD731, 0xC555, 0xD732, 0xC556, 0xD733, 0xC557, + 0xD734, 0xC8DE, 0xD735, 0xC8DF, 0xD736, 0xC558, 0xD737, 0xC559, + 0xD738, 0xC8E0, 0xD739, 0xC55A, 0xD73A, 0xC561, 0xD73B, 0xC562, + 0xD73C, 0xC8E1, 0xD73D, 0xC563, 0xD73E, 0xC564, 0xD73F, 0xC565, + 0xD740, 0xC566, 0xD741, 0xC567, 0xD742, 0xC568, 0xD743, 0xC569, + 0xD744, 0xC8E2, 0xD745, 0xC56A, 0xD746, 0xC56B, 0xD747, 0xC8E3, + 0xD748, 0xC56C, 0xD749, 0xC8E4, 0xD74A, 0xC56D, 0xD74B, 0xC56E, + 0xD74C, 0xC56F, 0xD74D, 0xC570, 0xD74E, 0xC571, 0xD74F, 0xC572, + 0xD750, 0xC8E5, 0xD751, 0xC8E6, 0xD752, 0xC573, 0xD753, 0xC574, + 0xD754, 0xC8E7, 0xD755, 0xC575, 0xD756, 0xC8E8, 0xD757, 0xC8E9, + 0xD758, 0xC8EA, 0xD759, 0xC8EB, 0xD75A, 0xC576, 0xD75B, 0xC577, + 0xD75C, 0xC578, 0xD75D, 0xC579, 0xD75E, 0xC57A, 0xD75F, 0xC581, + 0xD760, 0xC8EC, 0xD761, 0xC8ED, 0xD762, 0xC582, 0xD763, 0xC8EE, + 0xD764, 0xC583, 0xD765, 0xC8EF, 0xD766, 0xC584, 0xD767, 0xC585, + 0xD768, 0xC586, 0xD769, 0xC8F0, 0xD76A, 0xC587, 0xD76B, 0xC588, + 0xD76C, 0xC8F1, 0xD76D, 0xC589, 0xD76E, 0xC58A, 0xD76F, 0xC58B, + 0xD770, 0xC8F2, 0xD771, 0xC58C, 0xD772, 0xC58D, 0xD773, 0xC58E, + 0xD774, 0xC8F3, 0xD775, 0xC58F, 0xD776, 0xC590, 0xD777, 0xC591, + 0xD778, 0xC592, 0xD779, 0xC593, 0xD77A, 0xC594, 0xD77B, 0xC595, + 0xD77C, 0xC8F4, 0xD77D, 0xC8F5, 0xD77E, 0xC596, 0xD77F, 0xC597, + 0xD780, 0xC598, 0xD781, 0xC8F6, 0xD782, 0xC599, 0xD783, 0xC59A, + 0xD784, 0xC59B, 0xD785, 0xC59C, 0xD786, 0xC59D, 0xD787, 0xC59E, + 0xD788, 0xC8F7, 0xD789, 0xC8F8, 0xD78A, 0xC59F, 0xD78B, 0xC5A0, + 0xD78C, 0xC8F9, 0xD78D, 0xC641, 0xD78E, 0xC642, 0xD78F, 0xC643, + 0xD790, 0xC8FA, 0xD791, 0xC644, 0xD792, 0xC645, 0xD793, 0xC646, + 0xD794, 0xC647, 0xD795, 0xC648, 0xD796, 0xC649, 0xD797, 0xC64A, + 0xD798, 0xC8FB, 0xD799, 0xC8FC, 0xD79A, 0xC64B, 0xD79B, 0xC8FD, + 0xD79C, 0xC64C, 0xD79D, 0xC8FE, 0xD79E, 0xC64D, 0xD79F, 0xC64E, + 0xD7A0, 0xC64F, 0xD7A1, 0xC650, 0xD7A2, 0xC651, 0xD7A3, 0xC652, + 0xF900, 0xCBD0, 0xF901, 0xCBD6, 0xF902, 0xCBE7, 0xF903, 0xCDCF, + 0xF904, 0xCDE8, 0xF905, 0xCEAD, 0xF906, 0xCFFB, 0xF907, 0xD0A2, + 0xF908, 0xD0B8, 0xF909, 0xD0D0, 0xF90A, 0xD0DD, 0xF90B, 0xD1D4, + 0xF90C, 0xD1D5, 0xF90D, 0xD1D8, 0xF90E, 0xD1DB, 0xF90F, 0xD1DC, + 0xF910, 0xD1DD, 0xF911, 0xD1DE, 0xF912, 0xD1DF, 0xF913, 0xD1E0, + 0xF914, 0xD1E2, 0xF915, 0xD1E3, 0xF916, 0xD1E4, 0xF917, 0xD1E5, + 0xF918, 0xD1E6, 0xF919, 0xD1E8, 0xF91A, 0xD1E9, 0xF91B, 0xD1EA, + 0xF91C, 0xD1EB, 0xF91D, 0xD1ED, 0xF91E, 0xD1EF, 0xF91F, 0xD1F0, + 0xF920, 0xD1F2, 0xF921, 0xD1F6, 0xF922, 0xD1FA, 0xF923, 0xD1FC, + 0xF924, 0xD1FD, 0xF925, 0xD1FE, 0xF926, 0xD2A2, 0xF927, 0xD2A3, + 0xF928, 0xD2A7, 0xF929, 0xD2A8, 0xF92A, 0xD2A9, 0xF92B, 0xD2AA, + 0xF92C, 0xD2AB, 0xF92D, 0xD2AD, 0xF92E, 0xD2B2, 0xF92F, 0xD2BE, + 0xF930, 0xD2C2, 0xF931, 0xD2C3, 0xF932, 0xD2C4, 0xF933, 0xD2C6, + 0xF934, 0xD2C7, 0xF935, 0xD2C8, 0xF936, 0xD2C9, 0xF937, 0xD2CA, + 0xF938, 0xD2CB, 0xF939, 0xD2CD, 0xF93A, 0xD2CE, 0xF93B, 0xD2CF, + 0xF93C, 0xD2D0, 0xF93D, 0xD2D1, 0xF93E, 0xD2D2, 0xF93F, 0xD2D3, + 0xF940, 0xD2D4, 0xF941, 0xD2D5, 0xF942, 0xD2D6, 0xF943, 0xD2D7, + 0xF944, 0xD2D9, 0xF945, 0xD2DA, 0xF946, 0xD2DE, 0xF947, 0xD2DF, + 0xF948, 0xD2E1, 0xF949, 0xD2E2, 0xF94A, 0xD2E4, 0xF94B, 0xD2E5, + 0xF94C, 0xD2E6, 0xF94D, 0xD2E7, 0xF94E, 0xD2E8, 0xF94F, 0xD2E9, + 0xF950, 0xD2EA, 0xF951, 0xD2EB, 0xF952, 0xD2F0, 0xF953, 0xD2F1, + 0xF954, 0xD2F2, 0xF955, 0xD2F3, 0xF956, 0xD2F4, 0xF957, 0xD2F5, + 0xF958, 0xD2F7, 0xF959, 0xD2F8, 0xF95A, 0xD4E6, 0xF95B, 0xD4FC, + 0xF95C, 0xD5A5, 0xF95D, 0xD5AB, 0xF95E, 0xD5AE, 0xF95F, 0xD6B8, + 0xF960, 0xD6CD, 0xF961, 0xD7CB, 0xF962, 0xD7E4, 0xF963, 0xDBC5, + 0xF964, 0xDBE4, 0xF965, 0xDCA5, 0xF966, 0xDDA5, 0xF967, 0xDDD5, + 0xF968, 0xDDF4, 0xF969, 0xDEFC, 0xF96A, 0xDEFE, 0xF96B, 0xDFB3, + 0xF96C, 0xDFE1, 0xF96D, 0xDFE8, 0xF96E, 0xE0F1, 0xF96F, 0xE1AD, + 0xF970, 0xE1ED, 0xF971, 0xE3F5, 0xF972, 0xE4A1, 0xF973, 0xE4A9, + 0xF974, 0xE5AE, 0xF975, 0xE5B1, 0xF976, 0xE5B2, 0xF977, 0xE5B9, + 0xF978, 0xE5BB, 0xF979, 0xE5BC, 0xF97A, 0xE5C4, 0xF97B, 0xE5CE, + 0xF97C, 0xE5D0, 0xF97D, 0xE5D2, 0xF97E, 0xE5D6, 0xF97F, 0xE5FA, + 0xF980, 0xE5FB, 0xF981, 0xE5FC, 0xF982, 0xE5FE, 0xF983, 0xE6A1, + 0xF984, 0xE6A4, 0xF985, 0xE6A7, 0xF986, 0xE6AD, 0xF987, 0xE6AF, + 0xF988, 0xE6B0, 0xF989, 0xE6B1, 0xF98A, 0xE6B3, 0xF98B, 0xE6B7, + 0xF98C, 0xE6B8, 0xF98D, 0xE6BC, 0xF98E, 0xE6C4, 0xF98F, 0xE6C6, + 0xF990, 0xE6C7, 0xF991, 0xE6CA, 0xF992, 0xE6D2, 0xF993, 0xE6D6, + 0xF994, 0xE6D9, 0xF995, 0xE6DC, 0xF996, 0xE6DF, 0xF997, 0xE6E1, + 0xF998, 0xE6E4, 0xF999, 0xE6E5, 0xF99A, 0xE6E6, 0xF99B, 0xE6E8, + 0xF99C, 0xE6EA, 0xF99D, 0xE6EB, 0xF99E, 0xE6EC, 0xF99F, 0xE6EF, + 0xF9A0, 0xE6F1, 0xF9A1, 0xE6F2, 0xF9A2, 0xE6F5, 0xF9A3, 0xE6F6, + 0xF9A4, 0xE6F7, 0xF9A5, 0xE6F9, 0xF9A6, 0xE7A1, 0xF9A7, 0xE7A6, + 0xF9A8, 0xE7A9, 0xF9A9, 0xE7AA, 0xF9AA, 0xE7AC, 0xF9AB, 0xE7AD, + 0xF9AC, 0xE7B0, 0xF9AD, 0xE7BF, 0xF9AE, 0xE7C1, 0xF9AF, 0xE7C6, + 0xF9B0, 0xE7C7, 0xF9B1, 0xE7CB, 0xF9B2, 0xE7CD, 0xF9B3, 0xE7CF, + 0xF9B4, 0xE7D0, 0xF9B5, 0xE7D3, 0xF9B6, 0xE7DF, 0xF9B7, 0xE7E4, + 0xF9B8, 0xE7E6, 0xF9B9, 0xE7F7, 0xF9BA, 0xE8E7, 0xF9BB, 0xE8E8, + 0xF9BC, 0xE8F0, 0xF9BD, 0xE8F1, 0xF9BE, 0xE8F7, 0xF9BF, 0xE8F9, + 0xF9C0, 0xE8FB, 0xF9C1, 0xE8FE, 0xF9C2, 0xE9A7, 0xF9C3, 0xE9AC, + 0xF9C4, 0xE9CC, 0xF9C5, 0xE9F7, 0xF9C6, 0xEAC1, 0xF9C7, 0xEAE5, + 0xF9C8, 0xEAF4, 0xF9C9, 0xEAF7, 0xF9CA, 0xEAFC, 0xF9CB, 0xEAFE, + 0xF9CC, 0xEBA4, 0xF9CD, 0xEBA7, 0xF9CE, 0xEBA9, 0xF9CF, 0xEBAA, + 0xF9D0, 0xEBBA, 0xF9D1, 0xEBBB, 0xF9D2, 0xEBBD, 0xF9D3, 0xEBC1, + 0xF9D4, 0xEBC2, 0xF9D5, 0xEBC6, 0xF9D6, 0xEBC7, 0xF9D7, 0xEBCC, + 0xF9D8, 0xEBCF, 0xF9D9, 0xEBD0, 0xF9DA, 0xEBD1, 0xF9DB, 0xEBD2, + 0xF9DC, 0xEBD8, 0xF9DD, 0xECA6, 0xF9DE, 0xECA7, 0xF9DF, 0xECAA, + 0xF9E0, 0xECAF, 0xF9E1, 0xECB0, 0xF9E2, 0xECB1, 0xF9E3, 0xECB2, + 0xF9E4, 0xECB5, 0xF9E5, 0xECB8, 0xF9E6, 0xECBA, 0xF9E7, 0xECC0, + 0xF9E8, 0xECC1, 0xF9E9, 0xECC5, 0xF9EA, 0xECC6, 0xF9EB, 0xECC9, + 0xF9EC, 0xECCA, 0xF9ED, 0xECD5, 0xF9EE, 0xECDD, 0xF9EF, 0xECDE, + 0xF9F0, 0xECE1, 0xF9F1, 0xECE4, 0xF9F2, 0xECE7, 0xF9F3, 0xECE8, + 0xF9F4, 0xECF7, 0xF9F5, 0xECF8, 0xF9F6, 0xECFA, 0xF9F7, 0xEDA1, + 0xF9F8, 0xEDA2, 0xF9F9, 0xEDA3, 0xF9FA, 0xEDEE, 0xF9FB, 0xEEDB, + 0xF9FC, 0xF2BD, 0xF9FD, 0xF2FA, 0xF9FE, 0xF3B1, 0xF9FF, 0xF4A7, + 0xFA00, 0xF4EE, 0xFA01, 0xF6F4, 0xFA02, 0xF6F6, 0xFA03, 0xF7B8, + 0xFA04, 0xF7C8, 0xFA05, 0xF7D3, 0xFA06, 0xF8DB, 0xFA07, 0xF8F0, + 0xFA08, 0xFAA1, 0xFA09, 0xFAA2, 0xFA0A, 0xFAE6, 0xFA0B, 0xFCA9, + 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA3A4, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, + 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, + 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, + 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, + 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, + 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, + 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, + 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA1AC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, + 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, + 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, + 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, + 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA2A6, 0xFFE0, 0xA1CB, 0xFFE1, 0xA1CC, + 0xFFE2, 0xA1FE, 0xFFE3, 0xA3FE, 0xFFE5, 0xA1CD, 0xFFE6, 0xA3DC, + 0, 0 +}; + +static +const WCHAR oem2uni[] = { +/* OEM - Unicode, OEM - Unicode, OEM - Unicode, OEM - Unicode */ + 0x8141, 0xAC02, 0x8142, 0xAC03, 0x8143, 0xAC05, 0x8144, 0xAC06, + 0x8145, 0xAC0B, 0x8146, 0xAC0C, 0x8147, 0xAC0D, 0x8148, 0xAC0E, + 0x8149, 0xAC0F, 0x814A, 0xAC18, 0x814B, 0xAC1E, 0x814C, 0xAC1F, + 0x814D, 0xAC21, 0x814E, 0xAC22, 0x814F, 0xAC23, 0x8150, 0xAC25, + 0x8151, 0xAC26, 0x8152, 0xAC27, 0x8153, 0xAC28, 0x8154, 0xAC29, + 0x8155, 0xAC2A, 0x8156, 0xAC2B, 0x8157, 0xAC2E, 0x8158, 0xAC32, + 0x8159, 0xAC33, 0x815A, 0xAC34, 0x8161, 0xAC35, 0x8162, 0xAC36, + 0x8163, 0xAC37, 0x8164, 0xAC3A, 0x8165, 0xAC3B, 0x8166, 0xAC3D, + 0x8167, 0xAC3E, 0x8168, 0xAC3F, 0x8169, 0xAC41, 0x816A, 0xAC42, + 0x816B, 0xAC43, 0x816C, 0xAC44, 0x816D, 0xAC45, 0x816E, 0xAC46, + 0x816F, 0xAC47, 0x8170, 0xAC48, 0x8171, 0xAC49, 0x8172, 0xAC4A, + 0x8173, 0xAC4C, 0x8174, 0xAC4E, 0x8175, 0xAC4F, 0x8176, 0xAC50, + 0x8177, 0xAC51, 0x8178, 0xAC52, 0x8179, 0xAC53, 0x817A, 0xAC55, + 0x8181, 0xAC56, 0x8182, 0xAC57, 0x8183, 0xAC59, 0x8184, 0xAC5A, + 0x8185, 0xAC5B, 0x8186, 0xAC5D, 0x8187, 0xAC5E, 0x8188, 0xAC5F, + 0x8189, 0xAC60, 0x818A, 0xAC61, 0x818B, 0xAC62, 0x818C, 0xAC63, + 0x818D, 0xAC64, 0x818E, 0xAC65, 0x818F, 0xAC66, 0x8190, 0xAC67, + 0x8191, 0xAC68, 0x8192, 0xAC69, 0x8193, 0xAC6A, 0x8194, 0xAC6B, + 0x8195, 0xAC6C, 0x8196, 0xAC6D, 0x8197, 0xAC6E, 0x8198, 0xAC6F, + 0x8199, 0xAC72, 0x819A, 0xAC73, 0x819B, 0xAC75, 0x819C, 0xAC76, + 0x819D, 0xAC79, 0x819E, 0xAC7B, 0x819F, 0xAC7C, 0x81A0, 0xAC7D, + 0x81A1, 0xAC7E, 0x81A2, 0xAC7F, 0x81A3, 0xAC82, 0x81A4, 0xAC87, + 0x81A5, 0xAC88, 0x81A6, 0xAC8D, 0x81A7, 0xAC8E, 0x81A8, 0xAC8F, + 0x81A9, 0xAC91, 0x81AA, 0xAC92, 0x81AB, 0xAC93, 0x81AC, 0xAC95, + 0x81AD, 0xAC96, 0x81AE, 0xAC97, 0x81AF, 0xAC98, 0x81B0, 0xAC99, + 0x81B1, 0xAC9A, 0x81B2, 0xAC9B, 0x81B3, 0xAC9E, 0x81B4, 0xACA2, + 0x81B5, 0xACA3, 0x81B6, 0xACA4, 0x81B7, 0xACA5, 0x81B8, 0xACA6, + 0x81B9, 0xACA7, 0x81BA, 0xACAB, 0x81BB, 0xACAD, 0x81BC, 0xACAE, + 0x81BD, 0xACB1, 0x81BE, 0xACB2, 0x81BF, 0xACB3, 0x81C0, 0xACB4, + 0x81C1, 0xACB5, 0x81C2, 0xACB6, 0x81C3, 0xACB7, 0x81C4, 0xACBA, + 0x81C5, 0xACBE, 0x81C6, 0xACBF, 0x81C7, 0xACC0, 0x81C8, 0xACC2, + 0x81C9, 0xACC3, 0x81CA, 0xACC5, 0x81CB, 0xACC6, 0x81CC, 0xACC7, + 0x81CD, 0xACC9, 0x81CE, 0xACCA, 0x81CF, 0xACCB, 0x81D0, 0xACCD, + 0x81D1, 0xACCE, 0x81D2, 0xACCF, 0x81D3, 0xACD0, 0x81D4, 0xACD1, + 0x81D5, 0xACD2, 0x81D6, 0xACD3, 0x81D7, 0xACD4, 0x81D8, 0xACD6, + 0x81D9, 0xACD8, 0x81DA, 0xACD9, 0x81DB, 0xACDA, 0x81DC, 0xACDB, + 0x81DD, 0xACDC, 0x81DE, 0xACDD, 0x81DF, 0xACDE, 0x81E0, 0xACDF, + 0x81E1, 0xACE2, 0x81E2, 0xACE3, 0x81E3, 0xACE5, 0x81E4, 0xACE6, + 0x81E5, 0xACE9, 0x81E6, 0xACEB, 0x81E7, 0xACED, 0x81E8, 0xACEE, + 0x81E9, 0xACF2, 0x81EA, 0xACF4, 0x81EB, 0xACF7, 0x81EC, 0xACF8, + 0x81ED, 0xACF9, 0x81EE, 0xACFA, 0x81EF, 0xACFB, 0x81F0, 0xACFE, + 0x81F1, 0xACFF, 0x81F2, 0xAD01, 0x81F3, 0xAD02, 0x81F4, 0xAD03, + 0x81F5, 0xAD05, 0x81F6, 0xAD07, 0x81F7, 0xAD08, 0x81F8, 0xAD09, + 0x81F9, 0xAD0A, 0x81FA, 0xAD0B, 0x81FB, 0xAD0E, 0x81FC, 0xAD10, + 0x81FD, 0xAD12, 0x81FE, 0xAD13, 0x8241, 0xAD14, 0x8242, 0xAD15, + 0x8243, 0xAD16, 0x8244, 0xAD17, 0x8245, 0xAD19, 0x8246, 0xAD1A, + 0x8247, 0xAD1B, 0x8248, 0xAD1D, 0x8249, 0xAD1E, 0x824A, 0xAD1F, + 0x824B, 0xAD21, 0x824C, 0xAD22, 0x824D, 0xAD23, 0x824E, 0xAD24, + 0x824F, 0xAD25, 0x8250, 0xAD26, 0x8251, 0xAD27, 0x8252, 0xAD28, + 0x8253, 0xAD2A, 0x8254, 0xAD2B, 0x8255, 0xAD2E, 0x8256, 0xAD2F, + 0x8257, 0xAD30, 0x8258, 0xAD31, 0x8259, 0xAD32, 0x825A, 0xAD33, + 0x8261, 0xAD36, 0x8262, 0xAD37, 0x8263, 0xAD39, 0x8264, 0xAD3A, + 0x8265, 0xAD3B, 0x8266, 0xAD3D, 0x8267, 0xAD3E, 0x8268, 0xAD3F, + 0x8269, 0xAD40, 0x826A, 0xAD41, 0x826B, 0xAD42, 0x826C, 0xAD43, + 0x826D, 0xAD46, 0x826E, 0xAD48, 0x826F, 0xAD4A, 0x8270, 0xAD4B, + 0x8271, 0xAD4C, 0x8272, 0xAD4D, 0x8273, 0xAD4E, 0x8274, 0xAD4F, + 0x8275, 0xAD51, 0x8276, 0xAD52, 0x8277, 0xAD53, 0x8278, 0xAD55, + 0x8279, 0xAD56, 0x827A, 0xAD57, 0x8281, 0xAD59, 0x8282, 0xAD5A, + 0x8283, 0xAD5B, 0x8284, 0xAD5C, 0x8285, 0xAD5D, 0x8286, 0xAD5E, + 0x8287, 0xAD5F, 0x8288, 0xAD60, 0x8289, 0xAD62, 0x828A, 0xAD64, + 0x828B, 0xAD65, 0x828C, 0xAD66, 0x828D, 0xAD67, 0x828E, 0xAD68, + 0x828F, 0xAD69, 0x8290, 0xAD6A, 0x8291, 0xAD6B, 0x8292, 0xAD6E, + 0x8293, 0xAD6F, 0x8294, 0xAD71, 0x8295, 0xAD72, 0x8296, 0xAD77, + 0x8297, 0xAD78, 0x8298, 0xAD79, 0x8299, 0xAD7A, 0x829A, 0xAD7E, + 0x829B, 0xAD80, 0x829C, 0xAD83, 0x829D, 0xAD84, 0x829E, 0xAD85, + 0x829F, 0xAD86, 0x82A0, 0xAD87, 0x82A1, 0xAD8A, 0x82A2, 0xAD8B, + 0x82A3, 0xAD8D, 0x82A4, 0xAD8E, 0x82A5, 0xAD8F, 0x82A6, 0xAD91, + 0x82A7, 0xAD92, 0x82A8, 0xAD93, 0x82A9, 0xAD94, 0x82AA, 0xAD95, + 0x82AB, 0xAD96, 0x82AC, 0xAD97, 0x82AD, 0xAD98, 0x82AE, 0xAD99, + 0x82AF, 0xAD9A, 0x82B0, 0xAD9B, 0x82B1, 0xAD9E, 0x82B2, 0xAD9F, + 0x82B3, 0xADA0, 0x82B4, 0xADA1, 0x82B5, 0xADA2, 0x82B6, 0xADA3, + 0x82B7, 0xADA5, 0x82B8, 0xADA6, 0x82B9, 0xADA7, 0x82BA, 0xADA8, + 0x82BB, 0xADA9, 0x82BC, 0xADAA, 0x82BD, 0xADAB, 0x82BE, 0xADAC, + 0x82BF, 0xADAD, 0x82C0, 0xADAE, 0x82C1, 0xADAF, 0x82C2, 0xADB0, + 0x82C3, 0xADB1, 0x82C4, 0xADB2, 0x82C5, 0xADB3, 0x82C6, 0xADB4, + 0x82C7, 0xADB5, 0x82C8, 0xADB6, 0x82C9, 0xADB8, 0x82CA, 0xADB9, + 0x82CB, 0xADBA, 0x82CC, 0xADBB, 0x82CD, 0xADBC, 0x82CE, 0xADBD, + 0x82CF, 0xADBE, 0x82D0, 0xADBF, 0x82D1, 0xADC2, 0x82D2, 0xADC3, + 0x82D3, 0xADC5, 0x82D4, 0xADC6, 0x82D5, 0xADC7, 0x82D6, 0xADC9, + 0x82D7, 0xADCA, 0x82D8, 0xADCB, 0x82D9, 0xADCC, 0x82DA, 0xADCD, + 0x82DB, 0xADCE, 0x82DC, 0xADCF, 0x82DD, 0xADD2, 0x82DE, 0xADD4, + 0x82DF, 0xADD5, 0x82E0, 0xADD6, 0x82E1, 0xADD7, 0x82E2, 0xADD8, + 0x82E3, 0xADD9, 0x82E4, 0xADDA, 0x82E5, 0xADDB, 0x82E6, 0xADDD, + 0x82E7, 0xADDE, 0x82E8, 0xADDF, 0x82E9, 0xADE1, 0x82EA, 0xADE2, + 0x82EB, 0xADE3, 0x82EC, 0xADE5, 0x82ED, 0xADE6, 0x82EE, 0xADE7, + 0x82EF, 0xADE8, 0x82F0, 0xADE9, 0x82F1, 0xADEA, 0x82F2, 0xADEB, + 0x82F3, 0xADEC, 0x82F4, 0xADED, 0x82F5, 0xADEE, 0x82F6, 0xADEF, + 0x82F7, 0xADF0, 0x82F8, 0xADF1, 0x82F9, 0xADF2, 0x82FA, 0xADF3, + 0x82FB, 0xADF4, 0x82FC, 0xADF5, 0x82FD, 0xADF6, 0x82FE, 0xADF7, + 0x8341, 0xADFA, 0x8342, 0xADFB, 0x8343, 0xADFD, 0x8344, 0xADFE, + 0x8345, 0xAE02, 0x8346, 0xAE03, 0x8347, 0xAE04, 0x8348, 0xAE05, + 0x8349, 0xAE06, 0x834A, 0xAE07, 0x834B, 0xAE0A, 0x834C, 0xAE0C, + 0x834D, 0xAE0E, 0x834E, 0xAE0F, 0x834F, 0xAE10, 0x8350, 0xAE11, + 0x8351, 0xAE12, 0x8352, 0xAE13, 0x8353, 0xAE15, 0x8354, 0xAE16, + 0x8355, 0xAE17, 0x8356, 0xAE18, 0x8357, 0xAE19, 0x8358, 0xAE1A, + 0x8359, 0xAE1B, 0x835A, 0xAE1C, 0x8361, 0xAE1D, 0x8362, 0xAE1E, + 0x8363, 0xAE1F, 0x8364, 0xAE20, 0x8365, 0xAE21, 0x8366, 0xAE22, + 0x8367, 0xAE23, 0x8368, 0xAE24, 0x8369, 0xAE25, 0x836A, 0xAE26, + 0x836B, 0xAE27, 0x836C, 0xAE28, 0x836D, 0xAE29, 0x836E, 0xAE2A, + 0x836F, 0xAE2B, 0x8370, 0xAE2C, 0x8371, 0xAE2D, 0x8372, 0xAE2E, + 0x8373, 0xAE2F, 0x8374, 0xAE32, 0x8375, 0xAE33, 0x8376, 0xAE35, + 0x8377, 0xAE36, 0x8378, 0xAE39, 0x8379, 0xAE3B, 0x837A, 0xAE3C, + 0x8381, 0xAE3D, 0x8382, 0xAE3E, 0x8383, 0xAE3F, 0x8384, 0xAE42, + 0x8385, 0xAE44, 0x8386, 0xAE47, 0x8387, 0xAE48, 0x8388, 0xAE49, + 0x8389, 0xAE4B, 0x838A, 0xAE4F, 0x838B, 0xAE51, 0x838C, 0xAE52, + 0x838D, 0xAE53, 0x838E, 0xAE55, 0x838F, 0xAE57, 0x8390, 0xAE58, + 0x8391, 0xAE59, 0x8392, 0xAE5A, 0x8393, 0xAE5B, 0x8394, 0xAE5E, + 0x8395, 0xAE62, 0x8396, 0xAE63, 0x8397, 0xAE64, 0x8398, 0xAE66, + 0x8399, 0xAE67, 0x839A, 0xAE6A, 0x839B, 0xAE6B, 0x839C, 0xAE6D, + 0x839D, 0xAE6E, 0x839E, 0xAE6F, 0x839F, 0xAE71, 0x83A0, 0xAE72, + 0x83A1, 0xAE73, 0x83A2, 0xAE74, 0x83A3, 0xAE75, 0x83A4, 0xAE76, + 0x83A5, 0xAE77, 0x83A6, 0xAE7A, 0x83A7, 0xAE7E, 0x83A8, 0xAE7F, + 0x83A9, 0xAE80, 0x83AA, 0xAE81, 0x83AB, 0xAE82, 0x83AC, 0xAE83, + 0x83AD, 0xAE86, 0x83AE, 0xAE87, 0x83AF, 0xAE88, 0x83B0, 0xAE89, + 0x83B1, 0xAE8A, 0x83B2, 0xAE8B, 0x83B3, 0xAE8D, 0x83B4, 0xAE8E, + 0x83B5, 0xAE8F, 0x83B6, 0xAE90, 0x83B7, 0xAE91, 0x83B8, 0xAE92, + 0x83B9, 0xAE93, 0x83BA, 0xAE94, 0x83BB, 0xAE95, 0x83BC, 0xAE96, + 0x83BD, 0xAE97, 0x83BE, 0xAE98, 0x83BF, 0xAE99, 0x83C0, 0xAE9A, + 0x83C1, 0xAE9B, 0x83C2, 0xAE9C, 0x83C3, 0xAE9D, 0x83C4, 0xAE9E, + 0x83C5, 0xAE9F, 0x83C6, 0xAEA0, 0x83C7, 0xAEA1, 0x83C8, 0xAEA2, + 0x83C9, 0xAEA3, 0x83CA, 0xAEA4, 0x83CB, 0xAEA5, 0x83CC, 0xAEA6, + 0x83CD, 0xAEA7, 0x83CE, 0xAEA8, 0x83CF, 0xAEA9, 0x83D0, 0xAEAA, + 0x83D1, 0xAEAB, 0x83D2, 0xAEAC, 0x83D3, 0xAEAD, 0x83D4, 0xAEAE, + 0x83D5, 0xAEAF, 0x83D6, 0xAEB0, 0x83D7, 0xAEB1, 0x83D8, 0xAEB2, + 0x83D9, 0xAEB3, 0x83DA, 0xAEB4, 0x83DB, 0xAEB5, 0x83DC, 0xAEB6, + 0x83DD, 0xAEB7, 0x83DE, 0xAEB8, 0x83DF, 0xAEB9, 0x83E0, 0xAEBA, + 0x83E1, 0xAEBB, 0x83E2, 0xAEBF, 0x83E3, 0xAEC1, 0x83E4, 0xAEC2, + 0x83E5, 0xAEC3, 0x83E6, 0xAEC5, 0x83E7, 0xAEC6, 0x83E8, 0xAEC7, + 0x83E9, 0xAEC8, 0x83EA, 0xAEC9, 0x83EB, 0xAECA, 0x83EC, 0xAECB, + 0x83ED, 0xAECE, 0x83EE, 0xAED2, 0x83EF, 0xAED3, 0x83F0, 0xAED4, + 0x83F1, 0xAED5, 0x83F2, 0xAED6, 0x83F3, 0xAED7, 0x83F4, 0xAEDA, + 0x83F5, 0xAEDB, 0x83F6, 0xAEDD, 0x83F7, 0xAEDE, 0x83F8, 0xAEDF, + 0x83F9, 0xAEE0, 0x83FA, 0xAEE1, 0x83FB, 0xAEE2, 0x83FC, 0xAEE3, + 0x83FD, 0xAEE4, 0x83FE, 0xAEE5, 0x8441, 0xAEE6, 0x8442, 0xAEE7, + 0x8443, 0xAEE9, 0x8444, 0xAEEA, 0x8445, 0xAEEC, 0x8446, 0xAEEE, + 0x8447, 0xAEEF, 0x8448, 0xAEF0, 0x8449, 0xAEF1, 0x844A, 0xAEF2, + 0x844B, 0xAEF3, 0x844C, 0xAEF5, 0x844D, 0xAEF6, 0x844E, 0xAEF7, + 0x844F, 0xAEF9, 0x8450, 0xAEFA, 0x8451, 0xAEFB, 0x8452, 0xAEFD, + 0x8453, 0xAEFE, 0x8454, 0xAEFF, 0x8455, 0xAF00, 0x8456, 0xAF01, + 0x8457, 0xAF02, 0x8458, 0xAF03, 0x8459, 0xAF04, 0x845A, 0xAF05, + 0x8461, 0xAF06, 0x8462, 0xAF09, 0x8463, 0xAF0A, 0x8464, 0xAF0B, + 0x8465, 0xAF0C, 0x8466, 0xAF0E, 0x8467, 0xAF0F, 0x8468, 0xAF11, + 0x8469, 0xAF12, 0x846A, 0xAF13, 0x846B, 0xAF14, 0x846C, 0xAF15, + 0x846D, 0xAF16, 0x846E, 0xAF17, 0x846F, 0xAF18, 0x8470, 0xAF19, + 0x8471, 0xAF1A, 0x8472, 0xAF1B, 0x8473, 0xAF1C, 0x8474, 0xAF1D, + 0x8475, 0xAF1E, 0x8476, 0xAF1F, 0x8477, 0xAF20, 0x8478, 0xAF21, + 0x8479, 0xAF22, 0x847A, 0xAF23, 0x8481, 0xAF24, 0x8482, 0xAF25, + 0x8483, 0xAF26, 0x8484, 0xAF27, 0x8485, 0xAF28, 0x8486, 0xAF29, + 0x8487, 0xAF2A, 0x8488, 0xAF2B, 0x8489, 0xAF2E, 0x848A, 0xAF2F, + 0x848B, 0xAF31, 0x848C, 0xAF33, 0x848D, 0xAF35, 0x848E, 0xAF36, + 0x848F, 0xAF37, 0x8490, 0xAF38, 0x8491, 0xAF39, 0x8492, 0xAF3A, + 0x8493, 0xAF3B, 0x8494, 0xAF3E, 0x8495, 0xAF40, 0x8496, 0xAF44, + 0x8497, 0xAF45, 0x8498, 0xAF46, 0x8499, 0xAF47, 0x849A, 0xAF4A, + 0x849B, 0xAF4B, 0x849C, 0xAF4C, 0x849D, 0xAF4D, 0x849E, 0xAF4E, + 0x849F, 0xAF4F, 0x84A0, 0xAF51, 0x84A1, 0xAF52, 0x84A2, 0xAF53, + 0x84A3, 0xAF54, 0x84A4, 0xAF55, 0x84A5, 0xAF56, 0x84A6, 0xAF57, + 0x84A7, 0xAF58, 0x84A8, 0xAF59, 0x84A9, 0xAF5A, 0x84AA, 0xAF5B, + 0x84AB, 0xAF5E, 0x84AC, 0xAF5F, 0x84AD, 0xAF60, 0x84AE, 0xAF61, + 0x84AF, 0xAF62, 0x84B0, 0xAF63, 0x84B1, 0xAF66, 0x84B2, 0xAF67, + 0x84B3, 0xAF68, 0x84B4, 0xAF69, 0x84B5, 0xAF6A, 0x84B6, 0xAF6B, + 0x84B7, 0xAF6C, 0x84B8, 0xAF6D, 0x84B9, 0xAF6E, 0x84BA, 0xAF6F, + 0x84BB, 0xAF70, 0x84BC, 0xAF71, 0x84BD, 0xAF72, 0x84BE, 0xAF73, + 0x84BF, 0xAF74, 0x84C0, 0xAF75, 0x84C1, 0xAF76, 0x84C2, 0xAF77, + 0x84C3, 0xAF78, 0x84C4, 0xAF7A, 0x84C5, 0xAF7B, 0x84C6, 0xAF7C, + 0x84C7, 0xAF7D, 0x84C8, 0xAF7E, 0x84C9, 0xAF7F, 0x84CA, 0xAF81, + 0x84CB, 0xAF82, 0x84CC, 0xAF83, 0x84CD, 0xAF85, 0x84CE, 0xAF86, + 0x84CF, 0xAF87, 0x84D0, 0xAF89, 0x84D1, 0xAF8A, 0x84D2, 0xAF8B, + 0x84D3, 0xAF8C, 0x84D4, 0xAF8D, 0x84D5, 0xAF8E, 0x84D6, 0xAF8F, + 0x84D7, 0xAF92, 0x84D8, 0xAF93, 0x84D9, 0xAF94, 0x84DA, 0xAF96, + 0x84DB, 0xAF97, 0x84DC, 0xAF98, 0x84DD, 0xAF99, 0x84DE, 0xAF9A, + 0x84DF, 0xAF9B, 0x84E0, 0xAF9D, 0x84E1, 0xAF9E, 0x84E2, 0xAF9F, + 0x84E3, 0xAFA0, 0x84E4, 0xAFA1, 0x84E5, 0xAFA2, 0x84E6, 0xAFA3, + 0x84E7, 0xAFA4, 0x84E8, 0xAFA5, 0x84E9, 0xAFA6, 0x84EA, 0xAFA7, + 0x84EB, 0xAFA8, 0x84EC, 0xAFA9, 0x84ED, 0xAFAA, 0x84EE, 0xAFAB, + 0x84EF, 0xAFAC, 0x84F0, 0xAFAD, 0x84F1, 0xAFAE, 0x84F2, 0xAFAF, + 0x84F3, 0xAFB0, 0x84F4, 0xAFB1, 0x84F5, 0xAFB2, 0x84F6, 0xAFB3, + 0x84F7, 0xAFB4, 0x84F8, 0xAFB5, 0x84F9, 0xAFB6, 0x84FA, 0xAFB7, + 0x84FB, 0xAFBA, 0x84FC, 0xAFBB, 0x84FD, 0xAFBD, 0x84FE, 0xAFBE, + 0x8541, 0xAFBF, 0x8542, 0xAFC1, 0x8543, 0xAFC2, 0x8544, 0xAFC3, + 0x8545, 0xAFC4, 0x8546, 0xAFC5, 0x8547, 0xAFC6, 0x8548, 0xAFCA, + 0x8549, 0xAFCC, 0x854A, 0xAFCF, 0x854B, 0xAFD0, 0x854C, 0xAFD1, + 0x854D, 0xAFD2, 0x854E, 0xAFD3, 0x854F, 0xAFD5, 0x8550, 0xAFD6, + 0x8551, 0xAFD7, 0x8552, 0xAFD8, 0x8553, 0xAFD9, 0x8554, 0xAFDA, + 0x8555, 0xAFDB, 0x8556, 0xAFDD, 0x8557, 0xAFDE, 0x8558, 0xAFDF, + 0x8559, 0xAFE0, 0x855A, 0xAFE1, 0x8561, 0xAFE2, 0x8562, 0xAFE3, + 0x8563, 0xAFE4, 0x8564, 0xAFE5, 0x8565, 0xAFE6, 0x8566, 0xAFE7, + 0x8567, 0xAFEA, 0x8568, 0xAFEB, 0x8569, 0xAFEC, 0x856A, 0xAFED, + 0x856B, 0xAFEE, 0x856C, 0xAFEF, 0x856D, 0xAFF2, 0x856E, 0xAFF3, + 0x856F, 0xAFF5, 0x8570, 0xAFF6, 0x8571, 0xAFF7, 0x8572, 0xAFF9, + 0x8573, 0xAFFA, 0x8574, 0xAFFB, 0x8575, 0xAFFC, 0x8576, 0xAFFD, + 0x8577, 0xAFFE, 0x8578, 0xAFFF, 0x8579, 0xB002, 0x857A, 0xB003, + 0x8581, 0xB005, 0x8582, 0xB006, 0x8583, 0xB007, 0x8584, 0xB008, + 0x8585, 0xB009, 0x8586, 0xB00A, 0x8587, 0xB00B, 0x8588, 0xB00D, + 0x8589, 0xB00E, 0x858A, 0xB00F, 0x858B, 0xB011, 0x858C, 0xB012, + 0x858D, 0xB013, 0x858E, 0xB015, 0x858F, 0xB016, 0x8590, 0xB017, + 0x8591, 0xB018, 0x8592, 0xB019, 0x8593, 0xB01A, 0x8594, 0xB01B, + 0x8595, 0xB01E, 0x8596, 0xB01F, 0x8597, 0xB020, 0x8598, 0xB021, + 0x8599, 0xB022, 0x859A, 0xB023, 0x859B, 0xB024, 0x859C, 0xB025, + 0x859D, 0xB026, 0x859E, 0xB027, 0x859F, 0xB029, 0x85A0, 0xB02A, + 0x85A1, 0xB02B, 0x85A2, 0xB02C, 0x85A3, 0xB02D, 0x85A4, 0xB02E, + 0x85A5, 0xB02F, 0x85A6, 0xB030, 0x85A7, 0xB031, 0x85A8, 0xB032, + 0x85A9, 0xB033, 0x85AA, 0xB034, 0x85AB, 0xB035, 0x85AC, 0xB036, + 0x85AD, 0xB037, 0x85AE, 0xB038, 0x85AF, 0xB039, 0x85B0, 0xB03A, + 0x85B1, 0xB03B, 0x85B2, 0xB03C, 0x85B3, 0xB03D, 0x85B4, 0xB03E, + 0x85B5, 0xB03F, 0x85B6, 0xB040, 0x85B7, 0xB041, 0x85B8, 0xB042, + 0x85B9, 0xB043, 0x85BA, 0xB046, 0x85BB, 0xB047, 0x85BC, 0xB049, + 0x85BD, 0xB04B, 0x85BE, 0xB04D, 0x85BF, 0xB04F, 0x85C0, 0xB050, + 0x85C1, 0xB051, 0x85C2, 0xB052, 0x85C3, 0xB056, 0x85C4, 0xB058, + 0x85C5, 0xB05A, 0x85C6, 0xB05B, 0x85C7, 0xB05C, 0x85C8, 0xB05E, + 0x85C9, 0xB05F, 0x85CA, 0xB060, 0x85CB, 0xB061, 0x85CC, 0xB062, + 0x85CD, 0xB063, 0x85CE, 0xB064, 0x85CF, 0xB065, 0x85D0, 0xB066, + 0x85D1, 0xB067, 0x85D2, 0xB068, 0x85D3, 0xB069, 0x85D4, 0xB06A, + 0x85D5, 0xB06B, 0x85D6, 0xB06C, 0x85D7, 0xB06D, 0x85D8, 0xB06E, + 0x85D9, 0xB06F, 0x85DA, 0xB070, 0x85DB, 0xB071, 0x85DC, 0xB072, + 0x85DD, 0xB073, 0x85DE, 0xB074, 0x85DF, 0xB075, 0x85E0, 0xB076, + 0x85E1, 0xB077, 0x85E2, 0xB078, 0x85E3, 0xB079, 0x85E4, 0xB07A, + 0x85E5, 0xB07B, 0x85E6, 0xB07E, 0x85E7, 0xB07F, 0x85E8, 0xB081, + 0x85E9, 0xB082, 0x85EA, 0xB083, 0x85EB, 0xB085, 0x85EC, 0xB086, + 0x85ED, 0xB087, 0x85EE, 0xB088, 0x85EF, 0xB089, 0x85F0, 0xB08A, + 0x85F1, 0xB08B, 0x85F2, 0xB08E, 0x85F3, 0xB090, 0x85F4, 0xB092, + 0x85F5, 0xB093, 0x85F6, 0xB094, 0x85F7, 0xB095, 0x85F8, 0xB096, + 0x85F9, 0xB097, 0x85FA, 0xB09B, 0x85FB, 0xB09D, 0x85FC, 0xB09E, + 0x85FD, 0xB0A3, 0x85FE, 0xB0A4, 0x8641, 0xB0A5, 0x8642, 0xB0A6, + 0x8643, 0xB0A7, 0x8644, 0xB0AA, 0x8645, 0xB0B0, 0x8646, 0xB0B2, + 0x8647, 0xB0B6, 0x8648, 0xB0B7, 0x8649, 0xB0B9, 0x864A, 0xB0BA, + 0x864B, 0xB0BB, 0x864C, 0xB0BD, 0x864D, 0xB0BE, 0x864E, 0xB0BF, + 0x864F, 0xB0C0, 0x8650, 0xB0C1, 0x8651, 0xB0C2, 0x8652, 0xB0C3, + 0x8653, 0xB0C6, 0x8654, 0xB0CA, 0x8655, 0xB0CB, 0x8656, 0xB0CC, + 0x8657, 0xB0CD, 0x8658, 0xB0CE, 0x8659, 0xB0CF, 0x865A, 0xB0D2, + 0x8661, 0xB0D3, 0x8662, 0xB0D5, 0x8663, 0xB0D6, 0x8664, 0xB0D7, + 0x8665, 0xB0D9, 0x8666, 0xB0DA, 0x8667, 0xB0DB, 0x8668, 0xB0DC, + 0x8669, 0xB0DD, 0x866A, 0xB0DE, 0x866B, 0xB0DF, 0x866C, 0xB0E1, + 0x866D, 0xB0E2, 0x866E, 0xB0E3, 0x866F, 0xB0E4, 0x8670, 0xB0E6, + 0x8671, 0xB0E7, 0x8672, 0xB0E8, 0x8673, 0xB0E9, 0x8674, 0xB0EA, + 0x8675, 0xB0EB, 0x8676, 0xB0EC, 0x8677, 0xB0ED, 0x8678, 0xB0EE, + 0x8679, 0xB0EF, 0x867A, 0xB0F0, 0x8681, 0xB0F1, 0x8682, 0xB0F2, + 0x8683, 0xB0F3, 0x8684, 0xB0F4, 0x8685, 0xB0F5, 0x8686, 0xB0F6, + 0x8687, 0xB0F7, 0x8688, 0xB0F8, 0x8689, 0xB0F9, 0x868A, 0xB0FA, + 0x868B, 0xB0FB, 0x868C, 0xB0FC, 0x868D, 0xB0FD, 0x868E, 0xB0FE, + 0x868F, 0xB0FF, 0x8690, 0xB100, 0x8691, 0xB101, 0x8692, 0xB102, + 0x8693, 0xB103, 0x8694, 0xB104, 0x8695, 0xB105, 0x8696, 0xB106, + 0x8697, 0xB107, 0x8698, 0xB10A, 0x8699, 0xB10D, 0x869A, 0xB10E, + 0x869B, 0xB10F, 0x869C, 0xB111, 0x869D, 0xB114, 0x869E, 0xB115, + 0x869F, 0xB116, 0x86A0, 0xB117, 0x86A1, 0xB11A, 0x86A2, 0xB11E, + 0x86A3, 0xB11F, 0x86A4, 0xB120, 0x86A5, 0xB121, 0x86A6, 0xB122, + 0x86A7, 0xB126, 0x86A8, 0xB127, 0x86A9, 0xB129, 0x86AA, 0xB12A, + 0x86AB, 0xB12B, 0x86AC, 0xB12D, 0x86AD, 0xB12E, 0x86AE, 0xB12F, + 0x86AF, 0xB130, 0x86B0, 0xB131, 0x86B1, 0xB132, 0x86B2, 0xB133, + 0x86B3, 0xB136, 0x86B4, 0xB13A, 0x86B5, 0xB13B, 0x86B6, 0xB13C, + 0x86B7, 0xB13D, 0x86B8, 0xB13E, 0x86B9, 0xB13F, 0x86BA, 0xB142, + 0x86BB, 0xB143, 0x86BC, 0xB145, 0x86BD, 0xB146, 0x86BE, 0xB147, + 0x86BF, 0xB149, 0x86C0, 0xB14A, 0x86C1, 0xB14B, 0x86C2, 0xB14C, + 0x86C3, 0xB14D, 0x86C4, 0xB14E, 0x86C5, 0xB14F, 0x86C6, 0xB152, + 0x86C7, 0xB153, 0x86C8, 0xB156, 0x86C9, 0xB157, 0x86CA, 0xB159, + 0x86CB, 0xB15A, 0x86CC, 0xB15B, 0x86CD, 0xB15D, 0x86CE, 0xB15E, + 0x86CF, 0xB15F, 0x86D0, 0xB161, 0x86D1, 0xB162, 0x86D2, 0xB163, + 0x86D3, 0xB164, 0x86D4, 0xB165, 0x86D5, 0xB166, 0x86D6, 0xB167, + 0x86D7, 0xB168, 0x86D8, 0xB169, 0x86D9, 0xB16A, 0x86DA, 0xB16B, + 0x86DB, 0xB16C, 0x86DC, 0xB16D, 0x86DD, 0xB16E, 0x86DE, 0xB16F, + 0x86DF, 0xB170, 0x86E0, 0xB171, 0x86E1, 0xB172, 0x86E2, 0xB173, + 0x86E3, 0xB174, 0x86E4, 0xB175, 0x86E5, 0xB176, 0x86E6, 0xB177, + 0x86E7, 0xB17A, 0x86E8, 0xB17B, 0x86E9, 0xB17D, 0x86EA, 0xB17E, + 0x86EB, 0xB17F, 0x86EC, 0xB181, 0x86ED, 0xB183, 0x86EE, 0xB184, + 0x86EF, 0xB185, 0x86F0, 0xB186, 0x86F1, 0xB187, 0x86F2, 0xB18A, + 0x86F3, 0xB18C, 0x86F4, 0xB18E, 0x86F5, 0xB18F, 0x86F6, 0xB190, + 0x86F7, 0xB191, 0x86F8, 0xB195, 0x86F9, 0xB196, 0x86FA, 0xB197, + 0x86FB, 0xB199, 0x86FC, 0xB19A, 0x86FD, 0xB19B, 0x86FE, 0xB19D, + 0x8741, 0xB19E, 0x8742, 0xB19F, 0x8743, 0xB1A0, 0x8744, 0xB1A1, + 0x8745, 0xB1A2, 0x8746, 0xB1A3, 0x8747, 0xB1A4, 0x8748, 0xB1A5, + 0x8749, 0xB1A6, 0x874A, 0xB1A7, 0x874B, 0xB1A9, 0x874C, 0xB1AA, + 0x874D, 0xB1AB, 0x874E, 0xB1AC, 0x874F, 0xB1AD, 0x8750, 0xB1AE, + 0x8751, 0xB1AF, 0x8752, 0xB1B0, 0x8753, 0xB1B1, 0x8754, 0xB1B2, + 0x8755, 0xB1B3, 0x8756, 0xB1B4, 0x8757, 0xB1B5, 0x8758, 0xB1B6, + 0x8759, 0xB1B7, 0x875A, 0xB1B8, 0x8761, 0xB1B9, 0x8762, 0xB1BA, + 0x8763, 0xB1BB, 0x8764, 0xB1BC, 0x8765, 0xB1BD, 0x8766, 0xB1BE, + 0x8767, 0xB1BF, 0x8768, 0xB1C0, 0x8769, 0xB1C1, 0x876A, 0xB1C2, + 0x876B, 0xB1C3, 0x876C, 0xB1C4, 0x876D, 0xB1C5, 0x876E, 0xB1C6, + 0x876F, 0xB1C7, 0x8770, 0xB1C8, 0x8771, 0xB1C9, 0x8772, 0xB1CA, + 0x8773, 0xB1CB, 0x8774, 0xB1CD, 0x8775, 0xB1CE, 0x8776, 0xB1CF, + 0x8777, 0xB1D1, 0x8778, 0xB1D2, 0x8779, 0xB1D3, 0x877A, 0xB1D5, + 0x8781, 0xB1D6, 0x8782, 0xB1D7, 0x8783, 0xB1D8, 0x8784, 0xB1D9, + 0x8785, 0xB1DA, 0x8786, 0xB1DB, 0x8787, 0xB1DE, 0x8788, 0xB1E0, + 0x8789, 0xB1E1, 0x878A, 0xB1E2, 0x878B, 0xB1E3, 0x878C, 0xB1E4, + 0x878D, 0xB1E5, 0x878E, 0xB1E6, 0x878F, 0xB1E7, 0x8790, 0xB1EA, + 0x8791, 0xB1EB, 0x8792, 0xB1ED, 0x8793, 0xB1EE, 0x8794, 0xB1EF, + 0x8795, 0xB1F1, 0x8796, 0xB1F2, 0x8797, 0xB1F3, 0x8798, 0xB1F4, + 0x8799, 0xB1F5, 0x879A, 0xB1F6, 0x879B, 0xB1F7, 0x879C, 0xB1F8, + 0x879D, 0xB1FA, 0x879E, 0xB1FC, 0x879F, 0xB1FE, 0x87A0, 0xB1FF, + 0x87A1, 0xB200, 0x87A2, 0xB201, 0x87A3, 0xB202, 0x87A4, 0xB203, + 0x87A5, 0xB206, 0x87A6, 0xB207, 0x87A7, 0xB209, 0x87A8, 0xB20A, + 0x87A9, 0xB20D, 0x87AA, 0xB20E, 0x87AB, 0xB20F, 0x87AC, 0xB210, + 0x87AD, 0xB211, 0x87AE, 0xB212, 0x87AF, 0xB213, 0x87B0, 0xB216, + 0x87B1, 0xB218, 0x87B2, 0xB21A, 0x87B3, 0xB21B, 0x87B4, 0xB21C, + 0x87B5, 0xB21D, 0x87B6, 0xB21E, 0x87B7, 0xB21F, 0x87B8, 0xB221, + 0x87B9, 0xB222, 0x87BA, 0xB223, 0x87BB, 0xB224, 0x87BC, 0xB225, + 0x87BD, 0xB226, 0x87BE, 0xB227, 0x87BF, 0xB228, 0x87C0, 0xB229, + 0x87C1, 0xB22A, 0x87C2, 0xB22B, 0x87C3, 0xB22C, 0x87C4, 0xB22D, + 0x87C5, 0xB22E, 0x87C6, 0xB22F, 0x87C7, 0xB230, 0x87C8, 0xB231, + 0x87C9, 0xB232, 0x87CA, 0xB233, 0x87CB, 0xB235, 0x87CC, 0xB236, + 0x87CD, 0xB237, 0x87CE, 0xB238, 0x87CF, 0xB239, 0x87D0, 0xB23A, + 0x87D1, 0xB23B, 0x87D2, 0xB23D, 0x87D3, 0xB23E, 0x87D4, 0xB23F, + 0x87D5, 0xB240, 0x87D6, 0xB241, 0x87D7, 0xB242, 0x87D8, 0xB243, + 0x87D9, 0xB244, 0x87DA, 0xB245, 0x87DB, 0xB246, 0x87DC, 0xB247, + 0x87DD, 0xB248, 0x87DE, 0xB249, 0x87DF, 0xB24A, 0x87E0, 0xB24B, + 0x87E1, 0xB24C, 0x87E2, 0xB24D, 0x87E3, 0xB24E, 0x87E4, 0xB24F, + 0x87E5, 0xB250, 0x87E6, 0xB251, 0x87E7, 0xB252, 0x87E8, 0xB253, + 0x87E9, 0xB254, 0x87EA, 0xB255, 0x87EB, 0xB256, 0x87EC, 0xB257, + 0x87ED, 0xB259, 0x87EE, 0xB25A, 0x87EF, 0xB25B, 0x87F0, 0xB25D, + 0x87F1, 0xB25E, 0x87F2, 0xB25F, 0x87F3, 0xB261, 0x87F4, 0xB262, + 0x87F5, 0xB263, 0x87F6, 0xB264, 0x87F7, 0xB265, 0x87F8, 0xB266, + 0x87F9, 0xB267, 0x87FA, 0xB26A, 0x87FB, 0xB26B, 0x87FC, 0xB26C, + 0x87FD, 0xB26D, 0x87FE, 0xB26E, 0x8841, 0xB26F, 0x8842, 0xB270, + 0x8843, 0xB271, 0x8844, 0xB272, 0x8845, 0xB273, 0x8846, 0xB276, + 0x8847, 0xB277, 0x8848, 0xB278, 0x8849, 0xB279, 0x884A, 0xB27A, + 0x884B, 0xB27B, 0x884C, 0xB27D, 0x884D, 0xB27E, 0x884E, 0xB27F, + 0x884F, 0xB280, 0x8850, 0xB281, 0x8851, 0xB282, 0x8852, 0xB283, + 0x8853, 0xB286, 0x8854, 0xB287, 0x8855, 0xB288, 0x8856, 0xB28A, + 0x8857, 0xB28B, 0x8858, 0xB28C, 0x8859, 0xB28D, 0x885A, 0xB28E, + 0x8861, 0xB28F, 0x8862, 0xB292, 0x8863, 0xB293, 0x8864, 0xB295, + 0x8865, 0xB296, 0x8866, 0xB297, 0x8867, 0xB29B, 0x8868, 0xB29C, + 0x8869, 0xB29D, 0x886A, 0xB29E, 0x886B, 0xB29F, 0x886C, 0xB2A2, + 0x886D, 0xB2A4, 0x886E, 0xB2A7, 0x886F, 0xB2A8, 0x8870, 0xB2A9, + 0x8871, 0xB2AB, 0x8872, 0xB2AD, 0x8873, 0xB2AE, 0x8874, 0xB2AF, + 0x8875, 0xB2B1, 0x8876, 0xB2B2, 0x8877, 0xB2B3, 0x8878, 0xB2B5, + 0x8879, 0xB2B6, 0x887A, 0xB2B7, 0x8881, 0xB2B8, 0x8882, 0xB2B9, + 0x8883, 0xB2BA, 0x8884, 0xB2BB, 0x8885, 0xB2BC, 0x8886, 0xB2BD, + 0x8887, 0xB2BE, 0x8888, 0xB2BF, 0x8889, 0xB2C0, 0x888A, 0xB2C1, + 0x888B, 0xB2C2, 0x888C, 0xB2C3, 0x888D, 0xB2C4, 0x888E, 0xB2C5, + 0x888F, 0xB2C6, 0x8890, 0xB2C7, 0x8891, 0xB2CA, 0x8892, 0xB2CB, + 0x8893, 0xB2CD, 0x8894, 0xB2CE, 0x8895, 0xB2CF, 0x8896, 0xB2D1, + 0x8897, 0xB2D3, 0x8898, 0xB2D4, 0x8899, 0xB2D5, 0x889A, 0xB2D6, + 0x889B, 0xB2D7, 0x889C, 0xB2DA, 0x889D, 0xB2DC, 0x889E, 0xB2DE, + 0x889F, 0xB2DF, 0x88A0, 0xB2E0, 0x88A1, 0xB2E1, 0x88A2, 0xB2E3, + 0x88A3, 0xB2E7, 0x88A4, 0xB2E9, 0x88A5, 0xB2EA, 0x88A6, 0xB2F0, + 0x88A7, 0xB2F1, 0x88A8, 0xB2F2, 0x88A9, 0xB2F6, 0x88AA, 0xB2FC, + 0x88AB, 0xB2FD, 0x88AC, 0xB2FE, 0x88AD, 0xB302, 0x88AE, 0xB303, + 0x88AF, 0xB305, 0x88B0, 0xB306, 0x88B1, 0xB307, 0x88B2, 0xB309, + 0x88B3, 0xB30A, 0x88B4, 0xB30B, 0x88B5, 0xB30C, 0x88B6, 0xB30D, + 0x88B7, 0xB30E, 0x88B8, 0xB30F, 0x88B9, 0xB312, 0x88BA, 0xB316, + 0x88BB, 0xB317, 0x88BC, 0xB318, 0x88BD, 0xB319, 0x88BE, 0xB31A, + 0x88BF, 0xB31B, 0x88C0, 0xB31D, 0x88C1, 0xB31E, 0x88C2, 0xB31F, + 0x88C3, 0xB320, 0x88C4, 0xB321, 0x88C5, 0xB322, 0x88C6, 0xB323, + 0x88C7, 0xB324, 0x88C8, 0xB325, 0x88C9, 0xB326, 0x88CA, 0xB327, + 0x88CB, 0xB328, 0x88CC, 0xB329, 0x88CD, 0xB32A, 0x88CE, 0xB32B, + 0x88CF, 0xB32C, 0x88D0, 0xB32D, 0x88D1, 0xB32E, 0x88D2, 0xB32F, + 0x88D3, 0xB330, 0x88D4, 0xB331, 0x88D5, 0xB332, 0x88D6, 0xB333, + 0x88D7, 0xB334, 0x88D8, 0xB335, 0x88D9, 0xB336, 0x88DA, 0xB337, + 0x88DB, 0xB338, 0x88DC, 0xB339, 0x88DD, 0xB33A, 0x88DE, 0xB33B, + 0x88DF, 0xB33C, 0x88E0, 0xB33D, 0x88E1, 0xB33E, 0x88E2, 0xB33F, + 0x88E3, 0xB340, 0x88E4, 0xB341, 0x88E5, 0xB342, 0x88E6, 0xB343, + 0x88E7, 0xB344, 0x88E8, 0xB345, 0x88E9, 0xB346, 0x88EA, 0xB347, + 0x88EB, 0xB348, 0x88EC, 0xB349, 0x88ED, 0xB34A, 0x88EE, 0xB34B, + 0x88EF, 0xB34C, 0x88F0, 0xB34D, 0x88F1, 0xB34E, 0x88F2, 0xB34F, + 0x88F3, 0xB350, 0x88F4, 0xB351, 0x88F5, 0xB352, 0x88F6, 0xB353, + 0x88F7, 0xB357, 0x88F8, 0xB359, 0x88F9, 0xB35A, 0x88FA, 0xB35D, + 0x88FB, 0xB360, 0x88FC, 0xB361, 0x88FD, 0xB362, 0x88FE, 0xB363, + 0x8941, 0xB366, 0x8942, 0xB368, 0x8943, 0xB36A, 0x8944, 0xB36C, + 0x8945, 0xB36D, 0x8946, 0xB36F, 0x8947, 0xB372, 0x8948, 0xB373, + 0x8949, 0xB375, 0x894A, 0xB376, 0x894B, 0xB377, 0x894C, 0xB379, + 0x894D, 0xB37A, 0x894E, 0xB37B, 0x894F, 0xB37C, 0x8950, 0xB37D, + 0x8951, 0xB37E, 0x8952, 0xB37F, 0x8953, 0xB382, 0x8954, 0xB386, + 0x8955, 0xB387, 0x8956, 0xB388, 0x8957, 0xB389, 0x8958, 0xB38A, + 0x8959, 0xB38B, 0x895A, 0xB38D, 0x8961, 0xB38E, 0x8962, 0xB38F, + 0x8963, 0xB391, 0x8964, 0xB392, 0x8965, 0xB393, 0x8966, 0xB395, + 0x8967, 0xB396, 0x8968, 0xB397, 0x8969, 0xB398, 0x896A, 0xB399, + 0x896B, 0xB39A, 0x896C, 0xB39B, 0x896D, 0xB39C, 0x896E, 0xB39D, + 0x896F, 0xB39E, 0x8970, 0xB39F, 0x8971, 0xB3A2, 0x8972, 0xB3A3, + 0x8973, 0xB3A4, 0x8974, 0xB3A5, 0x8975, 0xB3A6, 0x8976, 0xB3A7, + 0x8977, 0xB3A9, 0x8978, 0xB3AA, 0x8979, 0xB3AB, 0x897A, 0xB3AD, + 0x8981, 0xB3AE, 0x8982, 0xB3AF, 0x8983, 0xB3B0, 0x8984, 0xB3B1, + 0x8985, 0xB3B2, 0x8986, 0xB3B3, 0x8987, 0xB3B4, 0x8988, 0xB3B5, + 0x8989, 0xB3B6, 0x898A, 0xB3B7, 0x898B, 0xB3B8, 0x898C, 0xB3B9, + 0x898D, 0xB3BA, 0x898E, 0xB3BB, 0x898F, 0xB3BC, 0x8990, 0xB3BD, + 0x8991, 0xB3BE, 0x8992, 0xB3BF, 0x8993, 0xB3C0, 0x8994, 0xB3C1, + 0x8995, 0xB3C2, 0x8996, 0xB3C3, 0x8997, 0xB3C6, 0x8998, 0xB3C7, + 0x8999, 0xB3C9, 0x899A, 0xB3CA, 0x899B, 0xB3CD, 0x899C, 0xB3CF, + 0x899D, 0xB3D1, 0x899E, 0xB3D2, 0x899F, 0xB3D3, 0x89A0, 0xB3D6, + 0x89A1, 0xB3D8, 0x89A2, 0xB3DA, 0x89A3, 0xB3DC, 0x89A4, 0xB3DE, + 0x89A5, 0xB3DF, 0x89A6, 0xB3E1, 0x89A7, 0xB3E2, 0x89A8, 0xB3E3, + 0x89A9, 0xB3E5, 0x89AA, 0xB3E6, 0x89AB, 0xB3E7, 0x89AC, 0xB3E9, + 0x89AD, 0xB3EA, 0x89AE, 0xB3EB, 0x89AF, 0xB3EC, 0x89B0, 0xB3ED, + 0x89B1, 0xB3EE, 0x89B2, 0xB3EF, 0x89B3, 0xB3F0, 0x89B4, 0xB3F1, + 0x89B5, 0xB3F2, 0x89B6, 0xB3F3, 0x89B7, 0xB3F4, 0x89B8, 0xB3F5, + 0x89B9, 0xB3F6, 0x89BA, 0xB3F7, 0x89BB, 0xB3F8, 0x89BC, 0xB3F9, + 0x89BD, 0xB3FA, 0x89BE, 0xB3FB, 0x89BF, 0xB3FD, 0x89C0, 0xB3FE, + 0x89C1, 0xB3FF, 0x89C2, 0xB400, 0x89C3, 0xB401, 0x89C4, 0xB402, + 0x89C5, 0xB403, 0x89C6, 0xB404, 0x89C7, 0xB405, 0x89C8, 0xB406, + 0x89C9, 0xB407, 0x89CA, 0xB408, 0x89CB, 0xB409, 0x89CC, 0xB40A, + 0x89CD, 0xB40B, 0x89CE, 0xB40C, 0x89CF, 0xB40D, 0x89D0, 0xB40E, + 0x89D1, 0xB40F, 0x89D2, 0xB411, 0x89D3, 0xB412, 0x89D4, 0xB413, + 0x89D5, 0xB414, 0x89D6, 0xB415, 0x89D7, 0xB416, 0x89D8, 0xB417, + 0x89D9, 0xB419, 0x89DA, 0xB41A, 0x89DB, 0xB41B, 0x89DC, 0xB41D, + 0x89DD, 0xB41E, 0x89DE, 0xB41F, 0x89DF, 0xB421, 0x89E0, 0xB422, + 0x89E1, 0xB423, 0x89E2, 0xB424, 0x89E3, 0xB425, 0x89E4, 0xB426, + 0x89E5, 0xB427, 0x89E6, 0xB42A, 0x89E7, 0xB42C, 0x89E8, 0xB42D, + 0x89E9, 0xB42E, 0x89EA, 0xB42F, 0x89EB, 0xB430, 0x89EC, 0xB431, + 0x89ED, 0xB432, 0x89EE, 0xB433, 0x89EF, 0xB435, 0x89F0, 0xB436, + 0x89F1, 0xB437, 0x89F2, 0xB438, 0x89F3, 0xB439, 0x89F4, 0xB43A, + 0x89F5, 0xB43B, 0x89F6, 0xB43C, 0x89F7, 0xB43D, 0x89F8, 0xB43E, + 0x89F9, 0xB43F, 0x89FA, 0xB440, 0x89FB, 0xB441, 0x89FC, 0xB442, + 0x89FD, 0xB443, 0x89FE, 0xB444, 0x8A41, 0xB445, 0x8A42, 0xB446, + 0x8A43, 0xB447, 0x8A44, 0xB448, 0x8A45, 0xB449, 0x8A46, 0xB44A, + 0x8A47, 0xB44B, 0x8A48, 0xB44C, 0x8A49, 0xB44D, 0x8A4A, 0xB44E, + 0x8A4B, 0xB44F, 0x8A4C, 0xB452, 0x8A4D, 0xB453, 0x8A4E, 0xB455, + 0x8A4F, 0xB456, 0x8A50, 0xB457, 0x8A51, 0xB459, 0x8A52, 0xB45A, + 0x8A53, 0xB45B, 0x8A54, 0xB45C, 0x8A55, 0xB45D, 0x8A56, 0xB45E, + 0x8A57, 0xB45F, 0x8A58, 0xB462, 0x8A59, 0xB464, 0x8A5A, 0xB466, + 0x8A61, 0xB467, 0x8A62, 0xB468, 0x8A63, 0xB469, 0x8A64, 0xB46A, + 0x8A65, 0xB46B, 0x8A66, 0xB46D, 0x8A67, 0xB46E, 0x8A68, 0xB46F, + 0x8A69, 0xB470, 0x8A6A, 0xB471, 0x8A6B, 0xB472, 0x8A6C, 0xB473, + 0x8A6D, 0xB474, 0x8A6E, 0xB475, 0x8A6F, 0xB476, 0x8A70, 0xB477, + 0x8A71, 0xB478, 0x8A72, 0xB479, 0x8A73, 0xB47A, 0x8A74, 0xB47B, + 0x8A75, 0xB47C, 0x8A76, 0xB47D, 0x8A77, 0xB47E, 0x8A78, 0xB47F, + 0x8A79, 0xB481, 0x8A7A, 0xB482, 0x8A81, 0xB483, 0x8A82, 0xB484, + 0x8A83, 0xB485, 0x8A84, 0xB486, 0x8A85, 0xB487, 0x8A86, 0xB489, + 0x8A87, 0xB48A, 0x8A88, 0xB48B, 0x8A89, 0xB48C, 0x8A8A, 0xB48D, + 0x8A8B, 0xB48E, 0x8A8C, 0xB48F, 0x8A8D, 0xB490, 0x8A8E, 0xB491, + 0x8A8F, 0xB492, 0x8A90, 0xB493, 0x8A91, 0xB494, 0x8A92, 0xB495, + 0x8A93, 0xB496, 0x8A94, 0xB497, 0x8A95, 0xB498, 0x8A96, 0xB499, + 0x8A97, 0xB49A, 0x8A98, 0xB49B, 0x8A99, 0xB49C, 0x8A9A, 0xB49E, + 0x8A9B, 0xB49F, 0x8A9C, 0xB4A0, 0x8A9D, 0xB4A1, 0x8A9E, 0xB4A2, + 0x8A9F, 0xB4A3, 0x8AA0, 0xB4A5, 0x8AA1, 0xB4A6, 0x8AA2, 0xB4A7, + 0x8AA3, 0xB4A9, 0x8AA4, 0xB4AA, 0x8AA5, 0xB4AB, 0x8AA6, 0xB4AD, + 0x8AA7, 0xB4AE, 0x8AA8, 0xB4AF, 0x8AA9, 0xB4B0, 0x8AAA, 0xB4B1, + 0x8AAB, 0xB4B2, 0x8AAC, 0xB4B3, 0x8AAD, 0xB4B4, 0x8AAE, 0xB4B6, + 0x8AAF, 0xB4B8, 0x8AB0, 0xB4BA, 0x8AB1, 0xB4BB, 0x8AB2, 0xB4BC, + 0x8AB3, 0xB4BD, 0x8AB4, 0xB4BE, 0x8AB5, 0xB4BF, 0x8AB6, 0xB4C1, + 0x8AB7, 0xB4C2, 0x8AB8, 0xB4C3, 0x8AB9, 0xB4C5, 0x8ABA, 0xB4C6, + 0x8ABB, 0xB4C7, 0x8ABC, 0xB4C9, 0x8ABD, 0xB4CA, 0x8ABE, 0xB4CB, + 0x8ABF, 0xB4CC, 0x8AC0, 0xB4CD, 0x8AC1, 0xB4CE, 0x8AC2, 0xB4CF, + 0x8AC3, 0xB4D1, 0x8AC4, 0xB4D2, 0x8AC5, 0xB4D3, 0x8AC6, 0xB4D4, + 0x8AC7, 0xB4D6, 0x8AC8, 0xB4D7, 0x8AC9, 0xB4D8, 0x8ACA, 0xB4D9, + 0x8ACB, 0xB4DA, 0x8ACC, 0xB4DB, 0x8ACD, 0xB4DE, 0x8ACE, 0xB4DF, + 0x8ACF, 0xB4E1, 0x8AD0, 0xB4E2, 0x8AD1, 0xB4E5, 0x8AD2, 0xB4E7, + 0x8AD3, 0xB4E8, 0x8AD4, 0xB4E9, 0x8AD5, 0xB4EA, 0x8AD6, 0xB4EB, + 0x8AD7, 0xB4EE, 0x8AD8, 0xB4F0, 0x8AD9, 0xB4F2, 0x8ADA, 0xB4F3, + 0x8ADB, 0xB4F4, 0x8ADC, 0xB4F5, 0x8ADD, 0xB4F6, 0x8ADE, 0xB4F7, + 0x8ADF, 0xB4F9, 0x8AE0, 0xB4FA, 0x8AE1, 0xB4FB, 0x8AE2, 0xB4FC, + 0x8AE3, 0xB4FD, 0x8AE4, 0xB4FE, 0x8AE5, 0xB4FF, 0x8AE6, 0xB500, + 0x8AE7, 0xB501, 0x8AE8, 0xB502, 0x8AE9, 0xB503, 0x8AEA, 0xB504, + 0x8AEB, 0xB505, 0x8AEC, 0xB506, 0x8AED, 0xB507, 0x8AEE, 0xB508, + 0x8AEF, 0xB509, 0x8AF0, 0xB50A, 0x8AF1, 0xB50B, 0x8AF2, 0xB50C, + 0x8AF3, 0xB50D, 0x8AF4, 0xB50E, 0x8AF5, 0xB50F, 0x8AF6, 0xB510, + 0x8AF7, 0xB511, 0x8AF8, 0xB512, 0x8AF9, 0xB513, 0x8AFA, 0xB516, + 0x8AFB, 0xB517, 0x8AFC, 0xB519, 0x8AFD, 0xB51A, 0x8AFE, 0xB51D, + 0x8B41, 0xB51E, 0x8B42, 0xB51F, 0x8B43, 0xB520, 0x8B44, 0xB521, + 0x8B45, 0xB522, 0x8B46, 0xB523, 0x8B47, 0xB526, 0x8B48, 0xB52B, + 0x8B49, 0xB52C, 0x8B4A, 0xB52D, 0x8B4B, 0xB52E, 0x8B4C, 0xB52F, + 0x8B4D, 0xB532, 0x8B4E, 0xB533, 0x8B4F, 0xB535, 0x8B50, 0xB536, + 0x8B51, 0xB537, 0x8B52, 0xB539, 0x8B53, 0xB53A, 0x8B54, 0xB53B, + 0x8B55, 0xB53C, 0x8B56, 0xB53D, 0x8B57, 0xB53E, 0x8B58, 0xB53F, + 0x8B59, 0xB542, 0x8B5A, 0xB546, 0x8B61, 0xB547, 0x8B62, 0xB548, + 0x8B63, 0xB549, 0x8B64, 0xB54A, 0x8B65, 0xB54E, 0x8B66, 0xB54F, + 0x8B67, 0xB551, 0x8B68, 0xB552, 0x8B69, 0xB553, 0x8B6A, 0xB555, + 0x8B6B, 0xB556, 0x8B6C, 0xB557, 0x8B6D, 0xB558, 0x8B6E, 0xB559, + 0x8B6F, 0xB55A, 0x8B70, 0xB55B, 0x8B71, 0xB55E, 0x8B72, 0xB562, + 0x8B73, 0xB563, 0x8B74, 0xB564, 0x8B75, 0xB565, 0x8B76, 0xB566, + 0x8B77, 0xB567, 0x8B78, 0xB568, 0x8B79, 0xB569, 0x8B7A, 0xB56A, + 0x8B81, 0xB56B, 0x8B82, 0xB56C, 0x8B83, 0xB56D, 0x8B84, 0xB56E, + 0x8B85, 0xB56F, 0x8B86, 0xB570, 0x8B87, 0xB571, 0x8B88, 0xB572, + 0x8B89, 0xB573, 0x8B8A, 0xB574, 0x8B8B, 0xB575, 0x8B8C, 0xB576, + 0x8B8D, 0xB577, 0x8B8E, 0xB578, 0x8B8F, 0xB579, 0x8B90, 0xB57A, + 0x8B91, 0xB57B, 0x8B92, 0xB57C, 0x8B93, 0xB57D, 0x8B94, 0xB57E, + 0x8B95, 0xB57F, 0x8B96, 0xB580, 0x8B97, 0xB581, 0x8B98, 0xB582, + 0x8B99, 0xB583, 0x8B9A, 0xB584, 0x8B9B, 0xB585, 0x8B9C, 0xB586, + 0x8B9D, 0xB587, 0x8B9E, 0xB588, 0x8B9F, 0xB589, 0x8BA0, 0xB58A, + 0x8BA1, 0xB58B, 0x8BA2, 0xB58C, 0x8BA3, 0xB58D, 0x8BA4, 0xB58E, + 0x8BA5, 0xB58F, 0x8BA6, 0xB590, 0x8BA7, 0xB591, 0x8BA8, 0xB592, + 0x8BA9, 0xB593, 0x8BAA, 0xB594, 0x8BAB, 0xB595, 0x8BAC, 0xB596, + 0x8BAD, 0xB597, 0x8BAE, 0xB598, 0x8BAF, 0xB599, 0x8BB0, 0xB59A, + 0x8BB1, 0xB59B, 0x8BB2, 0xB59C, 0x8BB3, 0xB59D, 0x8BB4, 0xB59E, + 0x8BB5, 0xB59F, 0x8BB6, 0xB5A2, 0x8BB7, 0xB5A3, 0x8BB8, 0xB5A5, + 0x8BB9, 0xB5A6, 0x8BBA, 0xB5A7, 0x8BBB, 0xB5A9, 0x8BBC, 0xB5AC, + 0x8BBD, 0xB5AD, 0x8BBE, 0xB5AE, 0x8BBF, 0xB5AF, 0x8BC0, 0xB5B2, + 0x8BC1, 0xB5B6, 0x8BC2, 0xB5B7, 0x8BC3, 0xB5B8, 0x8BC4, 0xB5B9, + 0x8BC5, 0xB5BA, 0x8BC6, 0xB5BE, 0x8BC7, 0xB5BF, 0x8BC8, 0xB5C1, + 0x8BC9, 0xB5C2, 0x8BCA, 0xB5C3, 0x8BCB, 0xB5C5, 0x8BCC, 0xB5C6, + 0x8BCD, 0xB5C7, 0x8BCE, 0xB5C8, 0x8BCF, 0xB5C9, 0x8BD0, 0xB5CA, + 0x8BD1, 0xB5CB, 0x8BD2, 0xB5CE, 0x8BD3, 0xB5D2, 0x8BD4, 0xB5D3, + 0x8BD5, 0xB5D4, 0x8BD6, 0xB5D5, 0x8BD7, 0xB5D6, 0x8BD8, 0xB5D7, + 0x8BD9, 0xB5D9, 0x8BDA, 0xB5DA, 0x8BDB, 0xB5DB, 0x8BDC, 0xB5DC, + 0x8BDD, 0xB5DD, 0x8BDE, 0xB5DE, 0x8BDF, 0xB5DF, 0x8BE0, 0xB5E0, + 0x8BE1, 0xB5E1, 0x8BE2, 0xB5E2, 0x8BE3, 0xB5E3, 0x8BE4, 0xB5E4, + 0x8BE5, 0xB5E5, 0x8BE6, 0xB5E6, 0x8BE7, 0xB5E7, 0x8BE8, 0xB5E8, + 0x8BE9, 0xB5E9, 0x8BEA, 0xB5EA, 0x8BEB, 0xB5EB, 0x8BEC, 0xB5ED, + 0x8BED, 0xB5EE, 0x8BEE, 0xB5EF, 0x8BEF, 0xB5F0, 0x8BF0, 0xB5F1, + 0x8BF1, 0xB5F2, 0x8BF2, 0xB5F3, 0x8BF3, 0xB5F4, 0x8BF4, 0xB5F5, + 0x8BF5, 0xB5F6, 0x8BF6, 0xB5F7, 0x8BF7, 0xB5F8, 0x8BF8, 0xB5F9, + 0x8BF9, 0xB5FA, 0x8BFA, 0xB5FB, 0x8BFB, 0xB5FC, 0x8BFC, 0xB5FD, + 0x8BFD, 0xB5FE, 0x8BFE, 0xB5FF, 0x8C41, 0xB600, 0x8C42, 0xB601, + 0x8C43, 0xB602, 0x8C44, 0xB603, 0x8C45, 0xB604, 0x8C46, 0xB605, + 0x8C47, 0xB606, 0x8C48, 0xB607, 0x8C49, 0xB608, 0x8C4A, 0xB609, + 0x8C4B, 0xB60A, 0x8C4C, 0xB60B, 0x8C4D, 0xB60C, 0x8C4E, 0xB60D, + 0x8C4F, 0xB60E, 0x8C50, 0xB60F, 0x8C51, 0xB612, 0x8C52, 0xB613, + 0x8C53, 0xB615, 0x8C54, 0xB616, 0x8C55, 0xB617, 0x8C56, 0xB619, + 0x8C57, 0xB61A, 0x8C58, 0xB61B, 0x8C59, 0xB61C, 0x8C5A, 0xB61D, + 0x8C61, 0xB61E, 0x8C62, 0xB61F, 0x8C63, 0xB620, 0x8C64, 0xB621, + 0x8C65, 0xB622, 0x8C66, 0xB623, 0x8C67, 0xB624, 0x8C68, 0xB626, + 0x8C69, 0xB627, 0x8C6A, 0xB628, 0x8C6B, 0xB629, 0x8C6C, 0xB62A, + 0x8C6D, 0xB62B, 0x8C6E, 0xB62D, 0x8C6F, 0xB62E, 0x8C70, 0xB62F, + 0x8C71, 0xB630, 0x8C72, 0xB631, 0x8C73, 0xB632, 0x8C74, 0xB633, + 0x8C75, 0xB635, 0x8C76, 0xB636, 0x8C77, 0xB637, 0x8C78, 0xB638, + 0x8C79, 0xB639, 0x8C7A, 0xB63A, 0x8C81, 0xB63B, 0x8C82, 0xB63C, + 0x8C83, 0xB63D, 0x8C84, 0xB63E, 0x8C85, 0xB63F, 0x8C86, 0xB640, + 0x8C87, 0xB641, 0x8C88, 0xB642, 0x8C89, 0xB643, 0x8C8A, 0xB644, + 0x8C8B, 0xB645, 0x8C8C, 0xB646, 0x8C8D, 0xB647, 0x8C8E, 0xB649, + 0x8C8F, 0xB64A, 0x8C90, 0xB64B, 0x8C91, 0xB64C, 0x8C92, 0xB64D, + 0x8C93, 0xB64E, 0x8C94, 0xB64F, 0x8C95, 0xB650, 0x8C96, 0xB651, + 0x8C97, 0xB652, 0x8C98, 0xB653, 0x8C99, 0xB654, 0x8C9A, 0xB655, + 0x8C9B, 0xB656, 0x8C9C, 0xB657, 0x8C9D, 0xB658, 0x8C9E, 0xB659, + 0x8C9F, 0xB65A, 0x8CA0, 0xB65B, 0x8CA1, 0xB65C, 0x8CA2, 0xB65D, + 0x8CA3, 0xB65E, 0x8CA4, 0xB65F, 0x8CA5, 0xB660, 0x8CA6, 0xB661, + 0x8CA7, 0xB662, 0x8CA8, 0xB663, 0x8CA9, 0xB665, 0x8CAA, 0xB666, + 0x8CAB, 0xB667, 0x8CAC, 0xB669, 0x8CAD, 0xB66A, 0x8CAE, 0xB66B, + 0x8CAF, 0xB66C, 0x8CB0, 0xB66D, 0x8CB1, 0xB66E, 0x8CB2, 0xB66F, + 0x8CB3, 0xB670, 0x8CB4, 0xB671, 0x8CB5, 0xB672, 0x8CB6, 0xB673, + 0x8CB7, 0xB674, 0x8CB8, 0xB675, 0x8CB9, 0xB676, 0x8CBA, 0xB677, + 0x8CBB, 0xB678, 0x8CBC, 0xB679, 0x8CBD, 0xB67A, 0x8CBE, 0xB67B, + 0x8CBF, 0xB67C, 0x8CC0, 0xB67D, 0x8CC1, 0xB67E, 0x8CC2, 0xB67F, + 0x8CC3, 0xB680, 0x8CC4, 0xB681, 0x8CC5, 0xB682, 0x8CC6, 0xB683, + 0x8CC7, 0xB684, 0x8CC8, 0xB685, 0x8CC9, 0xB686, 0x8CCA, 0xB687, + 0x8CCB, 0xB688, 0x8CCC, 0xB689, 0x8CCD, 0xB68A, 0x8CCE, 0xB68B, + 0x8CCF, 0xB68C, 0x8CD0, 0xB68D, 0x8CD1, 0xB68E, 0x8CD2, 0xB68F, + 0x8CD3, 0xB690, 0x8CD4, 0xB691, 0x8CD5, 0xB692, 0x8CD6, 0xB693, + 0x8CD7, 0xB694, 0x8CD8, 0xB695, 0x8CD9, 0xB696, 0x8CDA, 0xB697, + 0x8CDB, 0xB698, 0x8CDC, 0xB699, 0x8CDD, 0xB69A, 0x8CDE, 0xB69B, + 0x8CDF, 0xB69E, 0x8CE0, 0xB69F, 0x8CE1, 0xB6A1, 0x8CE2, 0xB6A2, + 0x8CE3, 0xB6A3, 0x8CE4, 0xB6A5, 0x8CE5, 0xB6A6, 0x8CE6, 0xB6A7, + 0x8CE7, 0xB6A8, 0x8CE8, 0xB6A9, 0x8CE9, 0xB6AA, 0x8CEA, 0xB6AD, + 0x8CEB, 0xB6AE, 0x8CEC, 0xB6AF, 0x8CED, 0xB6B0, 0x8CEE, 0xB6B2, + 0x8CEF, 0xB6B3, 0x8CF0, 0xB6B4, 0x8CF1, 0xB6B5, 0x8CF2, 0xB6B6, + 0x8CF3, 0xB6B7, 0x8CF4, 0xB6B8, 0x8CF5, 0xB6B9, 0x8CF6, 0xB6BA, + 0x8CF7, 0xB6BB, 0x8CF8, 0xB6BC, 0x8CF9, 0xB6BD, 0x8CFA, 0xB6BE, + 0x8CFB, 0xB6BF, 0x8CFC, 0xB6C0, 0x8CFD, 0xB6C1, 0x8CFE, 0xB6C2, + 0x8D41, 0xB6C3, 0x8D42, 0xB6C4, 0x8D43, 0xB6C5, 0x8D44, 0xB6C6, + 0x8D45, 0xB6C7, 0x8D46, 0xB6C8, 0x8D47, 0xB6C9, 0x8D48, 0xB6CA, + 0x8D49, 0xB6CB, 0x8D4A, 0xB6CC, 0x8D4B, 0xB6CD, 0x8D4C, 0xB6CE, + 0x8D4D, 0xB6CF, 0x8D4E, 0xB6D0, 0x8D4F, 0xB6D1, 0x8D50, 0xB6D2, + 0x8D51, 0xB6D3, 0x8D52, 0xB6D5, 0x8D53, 0xB6D6, 0x8D54, 0xB6D7, + 0x8D55, 0xB6D8, 0x8D56, 0xB6D9, 0x8D57, 0xB6DA, 0x8D58, 0xB6DB, + 0x8D59, 0xB6DC, 0x8D5A, 0xB6DD, 0x8D61, 0xB6DE, 0x8D62, 0xB6DF, + 0x8D63, 0xB6E0, 0x8D64, 0xB6E1, 0x8D65, 0xB6E2, 0x8D66, 0xB6E3, + 0x8D67, 0xB6E4, 0x8D68, 0xB6E5, 0x8D69, 0xB6E6, 0x8D6A, 0xB6E7, + 0x8D6B, 0xB6E8, 0x8D6C, 0xB6E9, 0x8D6D, 0xB6EA, 0x8D6E, 0xB6EB, + 0x8D6F, 0xB6EC, 0x8D70, 0xB6ED, 0x8D71, 0xB6EE, 0x8D72, 0xB6EF, + 0x8D73, 0xB6F1, 0x8D74, 0xB6F2, 0x8D75, 0xB6F3, 0x8D76, 0xB6F5, + 0x8D77, 0xB6F6, 0x8D78, 0xB6F7, 0x8D79, 0xB6F9, 0x8D7A, 0xB6FA, + 0x8D81, 0xB6FB, 0x8D82, 0xB6FC, 0x8D83, 0xB6FD, 0x8D84, 0xB6FE, + 0x8D85, 0xB6FF, 0x8D86, 0xB702, 0x8D87, 0xB703, 0x8D88, 0xB704, + 0x8D89, 0xB706, 0x8D8A, 0xB707, 0x8D8B, 0xB708, 0x8D8C, 0xB709, + 0x8D8D, 0xB70A, 0x8D8E, 0xB70B, 0x8D8F, 0xB70C, 0x8D90, 0xB70D, + 0x8D91, 0xB70E, 0x8D92, 0xB70F, 0x8D93, 0xB710, 0x8D94, 0xB711, + 0x8D95, 0xB712, 0x8D96, 0xB713, 0x8D97, 0xB714, 0x8D98, 0xB715, + 0x8D99, 0xB716, 0x8D9A, 0xB717, 0x8D9B, 0xB718, 0x8D9C, 0xB719, + 0x8D9D, 0xB71A, 0x8D9E, 0xB71B, 0x8D9F, 0xB71C, 0x8DA0, 0xB71D, + 0x8DA1, 0xB71E, 0x8DA2, 0xB71F, 0x8DA3, 0xB720, 0x8DA4, 0xB721, + 0x8DA5, 0xB722, 0x8DA6, 0xB723, 0x8DA7, 0xB724, 0x8DA8, 0xB725, + 0x8DA9, 0xB726, 0x8DAA, 0xB727, 0x8DAB, 0xB72A, 0x8DAC, 0xB72B, + 0x8DAD, 0xB72D, 0x8DAE, 0xB72E, 0x8DAF, 0xB731, 0x8DB0, 0xB732, + 0x8DB1, 0xB733, 0x8DB2, 0xB734, 0x8DB3, 0xB735, 0x8DB4, 0xB736, + 0x8DB5, 0xB737, 0x8DB6, 0xB73A, 0x8DB7, 0xB73C, 0x8DB8, 0xB73D, + 0x8DB9, 0xB73E, 0x8DBA, 0xB73F, 0x8DBB, 0xB740, 0x8DBC, 0xB741, + 0x8DBD, 0xB742, 0x8DBE, 0xB743, 0x8DBF, 0xB745, 0x8DC0, 0xB746, + 0x8DC1, 0xB747, 0x8DC2, 0xB749, 0x8DC3, 0xB74A, 0x8DC4, 0xB74B, + 0x8DC5, 0xB74D, 0x8DC6, 0xB74E, 0x8DC7, 0xB74F, 0x8DC8, 0xB750, + 0x8DC9, 0xB751, 0x8DCA, 0xB752, 0x8DCB, 0xB753, 0x8DCC, 0xB756, + 0x8DCD, 0xB757, 0x8DCE, 0xB758, 0x8DCF, 0xB759, 0x8DD0, 0xB75A, + 0x8DD1, 0xB75B, 0x8DD2, 0xB75C, 0x8DD3, 0xB75D, 0x8DD4, 0xB75E, + 0x8DD5, 0xB75F, 0x8DD6, 0xB761, 0x8DD7, 0xB762, 0x8DD8, 0xB763, + 0x8DD9, 0xB765, 0x8DDA, 0xB766, 0x8DDB, 0xB767, 0x8DDC, 0xB769, + 0x8DDD, 0xB76A, 0x8DDE, 0xB76B, 0x8DDF, 0xB76C, 0x8DE0, 0xB76D, + 0x8DE1, 0xB76E, 0x8DE2, 0xB76F, 0x8DE3, 0xB772, 0x8DE4, 0xB774, + 0x8DE5, 0xB776, 0x8DE6, 0xB777, 0x8DE7, 0xB778, 0x8DE8, 0xB779, + 0x8DE9, 0xB77A, 0x8DEA, 0xB77B, 0x8DEB, 0xB77E, 0x8DEC, 0xB77F, + 0x8DED, 0xB781, 0x8DEE, 0xB782, 0x8DEF, 0xB783, 0x8DF0, 0xB785, + 0x8DF1, 0xB786, 0x8DF2, 0xB787, 0x8DF3, 0xB788, 0x8DF4, 0xB789, + 0x8DF5, 0xB78A, 0x8DF6, 0xB78B, 0x8DF7, 0xB78E, 0x8DF8, 0xB793, + 0x8DF9, 0xB794, 0x8DFA, 0xB795, 0x8DFB, 0xB79A, 0x8DFC, 0xB79B, + 0x8DFD, 0xB79D, 0x8DFE, 0xB79E, 0x8E41, 0xB79F, 0x8E42, 0xB7A1, + 0x8E43, 0xB7A2, 0x8E44, 0xB7A3, 0x8E45, 0xB7A4, 0x8E46, 0xB7A5, + 0x8E47, 0xB7A6, 0x8E48, 0xB7A7, 0x8E49, 0xB7AA, 0x8E4A, 0xB7AE, + 0x8E4B, 0xB7AF, 0x8E4C, 0xB7B0, 0x8E4D, 0xB7B1, 0x8E4E, 0xB7B2, + 0x8E4F, 0xB7B3, 0x8E50, 0xB7B6, 0x8E51, 0xB7B7, 0x8E52, 0xB7B9, + 0x8E53, 0xB7BA, 0x8E54, 0xB7BB, 0x8E55, 0xB7BC, 0x8E56, 0xB7BD, + 0x8E57, 0xB7BE, 0x8E58, 0xB7BF, 0x8E59, 0xB7C0, 0x8E5A, 0xB7C1, + 0x8E61, 0xB7C2, 0x8E62, 0xB7C3, 0x8E63, 0xB7C4, 0x8E64, 0xB7C5, + 0x8E65, 0xB7C6, 0x8E66, 0xB7C8, 0x8E67, 0xB7CA, 0x8E68, 0xB7CB, + 0x8E69, 0xB7CC, 0x8E6A, 0xB7CD, 0x8E6B, 0xB7CE, 0x8E6C, 0xB7CF, + 0x8E6D, 0xB7D0, 0x8E6E, 0xB7D1, 0x8E6F, 0xB7D2, 0x8E70, 0xB7D3, + 0x8E71, 0xB7D4, 0x8E72, 0xB7D5, 0x8E73, 0xB7D6, 0x8E74, 0xB7D7, + 0x8E75, 0xB7D8, 0x8E76, 0xB7D9, 0x8E77, 0xB7DA, 0x8E78, 0xB7DB, + 0x8E79, 0xB7DC, 0x8E7A, 0xB7DD, 0x8E81, 0xB7DE, 0x8E82, 0xB7DF, + 0x8E83, 0xB7E0, 0x8E84, 0xB7E1, 0x8E85, 0xB7E2, 0x8E86, 0xB7E3, + 0x8E87, 0xB7E4, 0x8E88, 0xB7E5, 0x8E89, 0xB7E6, 0x8E8A, 0xB7E7, + 0x8E8B, 0xB7E8, 0x8E8C, 0xB7E9, 0x8E8D, 0xB7EA, 0x8E8E, 0xB7EB, + 0x8E8F, 0xB7EE, 0x8E90, 0xB7EF, 0x8E91, 0xB7F1, 0x8E92, 0xB7F2, + 0x8E93, 0xB7F3, 0x8E94, 0xB7F5, 0x8E95, 0xB7F6, 0x8E96, 0xB7F7, + 0x8E97, 0xB7F8, 0x8E98, 0xB7F9, 0x8E99, 0xB7FA, 0x8E9A, 0xB7FB, + 0x8E9B, 0xB7FE, 0x8E9C, 0xB802, 0x8E9D, 0xB803, 0x8E9E, 0xB804, + 0x8E9F, 0xB805, 0x8EA0, 0xB806, 0x8EA1, 0xB80A, 0x8EA2, 0xB80B, + 0x8EA3, 0xB80D, 0x8EA4, 0xB80E, 0x8EA5, 0xB80F, 0x8EA6, 0xB811, + 0x8EA7, 0xB812, 0x8EA8, 0xB813, 0x8EA9, 0xB814, 0x8EAA, 0xB815, + 0x8EAB, 0xB816, 0x8EAC, 0xB817, 0x8EAD, 0xB81A, 0x8EAE, 0xB81C, + 0x8EAF, 0xB81E, 0x8EB0, 0xB81F, 0x8EB1, 0xB820, 0x8EB2, 0xB821, + 0x8EB3, 0xB822, 0x8EB4, 0xB823, 0x8EB5, 0xB826, 0x8EB6, 0xB827, + 0x8EB7, 0xB829, 0x8EB8, 0xB82A, 0x8EB9, 0xB82B, 0x8EBA, 0xB82D, + 0x8EBB, 0xB82E, 0x8EBC, 0xB82F, 0x8EBD, 0xB830, 0x8EBE, 0xB831, + 0x8EBF, 0xB832, 0x8EC0, 0xB833, 0x8EC1, 0xB836, 0x8EC2, 0xB83A, + 0x8EC3, 0xB83B, 0x8EC4, 0xB83C, 0x8EC5, 0xB83D, 0x8EC6, 0xB83E, + 0x8EC7, 0xB83F, 0x8EC8, 0xB841, 0x8EC9, 0xB842, 0x8ECA, 0xB843, + 0x8ECB, 0xB845, 0x8ECC, 0xB846, 0x8ECD, 0xB847, 0x8ECE, 0xB848, + 0x8ECF, 0xB849, 0x8ED0, 0xB84A, 0x8ED1, 0xB84B, 0x8ED2, 0xB84C, + 0x8ED3, 0xB84D, 0x8ED4, 0xB84E, 0x8ED5, 0xB84F, 0x8ED6, 0xB850, + 0x8ED7, 0xB852, 0x8ED8, 0xB854, 0x8ED9, 0xB855, 0x8EDA, 0xB856, + 0x8EDB, 0xB857, 0x8EDC, 0xB858, 0x8EDD, 0xB859, 0x8EDE, 0xB85A, + 0x8EDF, 0xB85B, 0x8EE0, 0xB85E, 0x8EE1, 0xB85F, 0x8EE2, 0xB861, + 0x8EE3, 0xB862, 0x8EE4, 0xB863, 0x8EE5, 0xB865, 0x8EE6, 0xB866, + 0x8EE7, 0xB867, 0x8EE8, 0xB868, 0x8EE9, 0xB869, 0x8EEA, 0xB86A, + 0x8EEB, 0xB86B, 0x8EEC, 0xB86E, 0x8EED, 0xB870, 0x8EEE, 0xB872, + 0x8EEF, 0xB873, 0x8EF0, 0xB874, 0x8EF1, 0xB875, 0x8EF2, 0xB876, + 0x8EF3, 0xB877, 0x8EF4, 0xB879, 0x8EF5, 0xB87A, 0x8EF6, 0xB87B, + 0x8EF7, 0xB87D, 0x8EF8, 0xB87E, 0x8EF9, 0xB87F, 0x8EFA, 0xB880, + 0x8EFB, 0xB881, 0x8EFC, 0xB882, 0x8EFD, 0xB883, 0x8EFE, 0xB884, + 0x8F41, 0xB885, 0x8F42, 0xB886, 0x8F43, 0xB887, 0x8F44, 0xB888, + 0x8F45, 0xB889, 0x8F46, 0xB88A, 0x8F47, 0xB88B, 0x8F48, 0xB88C, + 0x8F49, 0xB88E, 0x8F4A, 0xB88F, 0x8F4B, 0xB890, 0x8F4C, 0xB891, + 0x8F4D, 0xB892, 0x8F4E, 0xB893, 0x8F4F, 0xB894, 0x8F50, 0xB895, + 0x8F51, 0xB896, 0x8F52, 0xB897, 0x8F53, 0xB898, 0x8F54, 0xB899, + 0x8F55, 0xB89A, 0x8F56, 0xB89B, 0x8F57, 0xB89C, 0x8F58, 0xB89D, + 0x8F59, 0xB89E, 0x8F5A, 0xB89F, 0x8F61, 0xB8A0, 0x8F62, 0xB8A1, + 0x8F63, 0xB8A2, 0x8F64, 0xB8A3, 0x8F65, 0xB8A4, 0x8F66, 0xB8A5, + 0x8F67, 0xB8A6, 0x8F68, 0xB8A7, 0x8F69, 0xB8A9, 0x8F6A, 0xB8AA, + 0x8F6B, 0xB8AB, 0x8F6C, 0xB8AC, 0x8F6D, 0xB8AD, 0x8F6E, 0xB8AE, + 0x8F6F, 0xB8AF, 0x8F70, 0xB8B1, 0x8F71, 0xB8B2, 0x8F72, 0xB8B3, + 0x8F73, 0xB8B5, 0x8F74, 0xB8B6, 0x8F75, 0xB8B7, 0x8F76, 0xB8B9, + 0x8F77, 0xB8BA, 0x8F78, 0xB8BB, 0x8F79, 0xB8BC, 0x8F7A, 0xB8BD, + 0x8F81, 0xB8BE, 0x8F82, 0xB8BF, 0x8F83, 0xB8C2, 0x8F84, 0xB8C4, + 0x8F85, 0xB8C6, 0x8F86, 0xB8C7, 0x8F87, 0xB8C8, 0x8F88, 0xB8C9, + 0x8F89, 0xB8CA, 0x8F8A, 0xB8CB, 0x8F8B, 0xB8CD, 0x8F8C, 0xB8CE, + 0x8F8D, 0xB8CF, 0x8F8E, 0xB8D1, 0x8F8F, 0xB8D2, 0x8F90, 0xB8D3, + 0x8F91, 0xB8D5, 0x8F92, 0xB8D6, 0x8F93, 0xB8D7, 0x8F94, 0xB8D8, + 0x8F95, 0xB8D9, 0x8F96, 0xB8DA, 0x8F97, 0xB8DB, 0x8F98, 0xB8DC, + 0x8F99, 0xB8DE, 0x8F9A, 0xB8E0, 0x8F9B, 0xB8E2, 0x8F9C, 0xB8E3, + 0x8F9D, 0xB8E4, 0x8F9E, 0xB8E5, 0x8F9F, 0xB8E6, 0x8FA0, 0xB8E7, + 0x8FA1, 0xB8EA, 0x8FA2, 0xB8EB, 0x8FA3, 0xB8ED, 0x8FA4, 0xB8EE, + 0x8FA5, 0xB8EF, 0x8FA6, 0xB8F1, 0x8FA7, 0xB8F2, 0x8FA8, 0xB8F3, + 0x8FA9, 0xB8F4, 0x8FAA, 0xB8F5, 0x8FAB, 0xB8F6, 0x8FAC, 0xB8F7, + 0x8FAD, 0xB8FA, 0x8FAE, 0xB8FC, 0x8FAF, 0xB8FE, 0x8FB0, 0xB8FF, + 0x8FB1, 0xB900, 0x8FB2, 0xB901, 0x8FB3, 0xB902, 0x8FB4, 0xB903, + 0x8FB5, 0xB905, 0x8FB6, 0xB906, 0x8FB7, 0xB907, 0x8FB8, 0xB908, + 0x8FB9, 0xB909, 0x8FBA, 0xB90A, 0x8FBB, 0xB90B, 0x8FBC, 0xB90C, + 0x8FBD, 0xB90D, 0x8FBE, 0xB90E, 0x8FBF, 0xB90F, 0x8FC0, 0xB910, + 0x8FC1, 0xB911, 0x8FC2, 0xB912, 0x8FC3, 0xB913, 0x8FC4, 0xB914, + 0x8FC5, 0xB915, 0x8FC6, 0xB916, 0x8FC7, 0xB917, 0x8FC8, 0xB919, + 0x8FC9, 0xB91A, 0x8FCA, 0xB91B, 0x8FCB, 0xB91C, 0x8FCC, 0xB91D, + 0x8FCD, 0xB91E, 0x8FCE, 0xB91F, 0x8FCF, 0xB921, 0x8FD0, 0xB922, + 0x8FD1, 0xB923, 0x8FD2, 0xB924, 0x8FD3, 0xB925, 0x8FD4, 0xB926, + 0x8FD5, 0xB927, 0x8FD6, 0xB928, 0x8FD7, 0xB929, 0x8FD8, 0xB92A, + 0x8FD9, 0xB92B, 0x8FDA, 0xB92C, 0x8FDB, 0xB92D, 0x8FDC, 0xB92E, + 0x8FDD, 0xB92F, 0x8FDE, 0xB930, 0x8FDF, 0xB931, 0x8FE0, 0xB932, + 0x8FE1, 0xB933, 0x8FE2, 0xB934, 0x8FE3, 0xB935, 0x8FE4, 0xB936, + 0x8FE5, 0xB937, 0x8FE6, 0xB938, 0x8FE7, 0xB939, 0x8FE8, 0xB93A, + 0x8FE9, 0xB93B, 0x8FEA, 0xB93E, 0x8FEB, 0xB93F, 0x8FEC, 0xB941, + 0x8FED, 0xB942, 0x8FEE, 0xB943, 0x8FEF, 0xB945, 0x8FF0, 0xB946, + 0x8FF1, 0xB947, 0x8FF2, 0xB948, 0x8FF3, 0xB949, 0x8FF4, 0xB94A, + 0x8FF5, 0xB94B, 0x8FF6, 0xB94D, 0x8FF7, 0xB94E, 0x8FF8, 0xB950, + 0x8FF9, 0xB952, 0x8FFA, 0xB953, 0x8FFB, 0xB954, 0x8FFC, 0xB955, + 0x8FFD, 0xB956, 0x8FFE, 0xB957, 0x9041, 0xB95A, 0x9042, 0xB95B, + 0x9043, 0xB95D, 0x9044, 0xB95E, 0x9045, 0xB95F, 0x9046, 0xB961, + 0x9047, 0xB962, 0x9048, 0xB963, 0x9049, 0xB964, 0x904A, 0xB965, + 0x904B, 0xB966, 0x904C, 0xB967, 0x904D, 0xB96A, 0x904E, 0xB96C, + 0x904F, 0xB96E, 0x9050, 0xB96F, 0x9051, 0xB970, 0x9052, 0xB971, + 0x9053, 0xB972, 0x9054, 0xB973, 0x9055, 0xB976, 0x9056, 0xB977, + 0x9057, 0xB979, 0x9058, 0xB97A, 0x9059, 0xB97B, 0x905A, 0xB97D, + 0x9061, 0xB97E, 0x9062, 0xB97F, 0x9063, 0xB980, 0x9064, 0xB981, + 0x9065, 0xB982, 0x9066, 0xB983, 0x9067, 0xB986, 0x9068, 0xB988, + 0x9069, 0xB98B, 0x906A, 0xB98C, 0x906B, 0xB98F, 0x906C, 0xB990, + 0x906D, 0xB991, 0x906E, 0xB992, 0x906F, 0xB993, 0x9070, 0xB994, + 0x9071, 0xB995, 0x9072, 0xB996, 0x9073, 0xB997, 0x9074, 0xB998, + 0x9075, 0xB999, 0x9076, 0xB99A, 0x9077, 0xB99B, 0x9078, 0xB99C, + 0x9079, 0xB99D, 0x907A, 0xB99E, 0x9081, 0xB99F, 0x9082, 0xB9A0, + 0x9083, 0xB9A1, 0x9084, 0xB9A2, 0x9085, 0xB9A3, 0x9086, 0xB9A4, + 0x9087, 0xB9A5, 0x9088, 0xB9A6, 0x9089, 0xB9A7, 0x908A, 0xB9A8, + 0x908B, 0xB9A9, 0x908C, 0xB9AA, 0x908D, 0xB9AB, 0x908E, 0xB9AE, + 0x908F, 0xB9AF, 0x9090, 0xB9B1, 0x9091, 0xB9B2, 0x9092, 0xB9B3, + 0x9093, 0xB9B5, 0x9094, 0xB9B6, 0x9095, 0xB9B7, 0x9096, 0xB9B8, + 0x9097, 0xB9B9, 0x9098, 0xB9BA, 0x9099, 0xB9BB, 0x909A, 0xB9BE, + 0x909B, 0xB9C0, 0x909C, 0xB9C2, 0x909D, 0xB9C3, 0x909E, 0xB9C4, + 0x909F, 0xB9C5, 0x90A0, 0xB9C6, 0x90A1, 0xB9C7, 0x90A2, 0xB9CA, + 0x90A3, 0xB9CB, 0x90A4, 0xB9CD, 0x90A5, 0xB9D3, 0x90A6, 0xB9D4, + 0x90A7, 0xB9D5, 0x90A8, 0xB9D6, 0x90A9, 0xB9D7, 0x90AA, 0xB9DA, + 0x90AB, 0xB9DC, 0x90AC, 0xB9DF, 0x90AD, 0xB9E0, 0x90AE, 0xB9E2, + 0x90AF, 0xB9E6, 0x90B0, 0xB9E7, 0x90B1, 0xB9E9, 0x90B2, 0xB9EA, + 0x90B3, 0xB9EB, 0x90B4, 0xB9ED, 0x90B5, 0xB9EE, 0x90B6, 0xB9EF, + 0x90B7, 0xB9F0, 0x90B8, 0xB9F1, 0x90B9, 0xB9F2, 0x90BA, 0xB9F3, + 0x90BB, 0xB9F6, 0x90BC, 0xB9FB, 0x90BD, 0xB9FC, 0x90BE, 0xB9FD, + 0x90BF, 0xB9FE, 0x90C0, 0xB9FF, 0x90C1, 0xBA02, 0x90C2, 0xBA03, + 0x90C3, 0xBA04, 0x90C4, 0xBA05, 0x90C5, 0xBA06, 0x90C6, 0xBA07, + 0x90C7, 0xBA09, 0x90C8, 0xBA0A, 0x90C9, 0xBA0B, 0x90CA, 0xBA0C, + 0x90CB, 0xBA0D, 0x90CC, 0xBA0E, 0x90CD, 0xBA0F, 0x90CE, 0xBA10, + 0x90CF, 0xBA11, 0x90D0, 0xBA12, 0x90D1, 0xBA13, 0x90D2, 0xBA14, + 0x90D3, 0xBA16, 0x90D4, 0xBA17, 0x90D5, 0xBA18, 0x90D6, 0xBA19, + 0x90D7, 0xBA1A, 0x90D8, 0xBA1B, 0x90D9, 0xBA1C, 0x90DA, 0xBA1D, + 0x90DB, 0xBA1E, 0x90DC, 0xBA1F, 0x90DD, 0xBA20, 0x90DE, 0xBA21, + 0x90DF, 0xBA22, 0x90E0, 0xBA23, 0x90E1, 0xBA24, 0x90E2, 0xBA25, + 0x90E3, 0xBA26, 0x90E4, 0xBA27, 0x90E5, 0xBA28, 0x90E6, 0xBA29, + 0x90E7, 0xBA2A, 0x90E8, 0xBA2B, 0x90E9, 0xBA2C, 0x90EA, 0xBA2D, + 0x90EB, 0xBA2E, 0x90EC, 0xBA2F, 0x90ED, 0xBA30, 0x90EE, 0xBA31, + 0x90EF, 0xBA32, 0x90F0, 0xBA33, 0x90F1, 0xBA34, 0x90F2, 0xBA35, + 0x90F3, 0xBA36, 0x90F4, 0xBA37, 0x90F5, 0xBA3A, 0x90F6, 0xBA3B, + 0x90F7, 0xBA3D, 0x90F8, 0xBA3E, 0x90F9, 0xBA3F, 0x90FA, 0xBA41, + 0x90FB, 0xBA43, 0x90FC, 0xBA44, 0x90FD, 0xBA45, 0x90FE, 0xBA46, + 0x9141, 0xBA47, 0x9142, 0xBA4A, 0x9143, 0xBA4C, 0x9144, 0xBA4F, + 0x9145, 0xBA50, 0x9146, 0xBA51, 0x9147, 0xBA52, 0x9148, 0xBA56, + 0x9149, 0xBA57, 0x914A, 0xBA59, 0x914B, 0xBA5A, 0x914C, 0xBA5B, + 0x914D, 0xBA5D, 0x914E, 0xBA5E, 0x914F, 0xBA5F, 0x9150, 0xBA60, + 0x9151, 0xBA61, 0x9152, 0xBA62, 0x9153, 0xBA63, 0x9154, 0xBA66, + 0x9155, 0xBA6A, 0x9156, 0xBA6B, 0x9157, 0xBA6C, 0x9158, 0xBA6D, + 0x9159, 0xBA6E, 0x915A, 0xBA6F, 0x9161, 0xBA72, 0x9162, 0xBA73, + 0x9163, 0xBA75, 0x9164, 0xBA76, 0x9165, 0xBA77, 0x9166, 0xBA79, + 0x9167, 0xBA7A, 0x9168, 0xBA7B, 0x9169, 0xBA7C, 0x916A, 0xBA7D, + 0x916B, 0xBA7E, 0x916C, 0xBA7F, 0x916D, 0xBA80, 0x916E, 0xBA81, + 0x916F, 0xBA82, 0x9170, 0xBA86, 0x9171, 0xBA88, 0x9172, 0xBA89, + 0x9173, 0xBA8A, 0x9174, 0xBA8B, 0x9175, 0xBA8D, 0x9176, 0xBA8E, + 0x9177, 0xBA8F, 0x9178, 0xBA90, 0x9179, 0xBA91, 0x917A, 0xBA92, + 0x9181, 0xBA93, 0x9182, 0xBA94, 0x9183, 0xBA95, 0x9184, 0xBA96, + 0x9185, 0xBA97, 0x9186, 0xBA98, 0x9187, 0xBA99, 0x9188, 0xBA9A, + 0x9189, 0xBA9B, 0x918A, 0xBA9C, 0x918B, 0xBA9D, 0x918C, 0xBA9E, + 0x918D, 0xBA9F, 0x918E, 0xBAA0, 0x918F, 0xBAA1, 0x9190, 0xBAA2, + 0x9191, 0xBAA3, 0x9192, 0xBAA4, 0x9193, 0xBAA5, 0x9194, 0xBAA6, + 0x9195, 0xBAA7, 0x9196, 0xBAAA, 0x9197, 0xBAAD, 0x9198, 0xBAAE, + 0x9199, 0xBAAF, 0x919A, 0xBAB1, 0x919B, 0xBAB3, 0x919C, 0xBAB4, + 0x919D, 0xBAB5, 0x919E, 0xBAB6, 0x919F, 0xBAB7, 0x91A0, 0xBABA, + 0x91A1, 0xBABC, 0x91A2, 0xBABE, 0x91A3, 0xBABF, 0x91A4, 0xBAC0, + 0x91A5, 0xBAC1, 0x91A6, 0xBAC2, 0x91A7, 0xBAC3, 0x91A8, 0xBAC5, + 0x91A9, 0xBAC6, 0x91AA, 0xBAC7, 0x91AB, 0xBAC9, 0x91AC, 0xBACA, + 0x91AD, 0xBACB, 0x91AE, 0xBACC, 0x91AF, 0xBACD, 0x91B0, 0xBACE, + 0x91B1, 0xBACF, 0x91B2, 0xBAD0, 0x91B3, 0xBAD1, 0x91B4, 0xBAD2, + 0x91B5, 0xBAD3, 0x91B6, 0xBAD4, 0x91B7, 0xBAD5, 0x91B8, 0xBAD6, + 0x91B9, 0xBAD7, 0x91BA, 0xBADA, 0x91BB, 0xBADB, 0x91BC, 0xBADC, + 0x91BD, 0xBADD, 0x91BE, 0xBADE, 0x91BF, 0xBADF, 0x91C0, 0xBAE0, + 0x91C1, 0xBAE1, 0x91C2, 0xBAE2, 0x91C3, 0xBAE3, 0x91C4, 0xBAE4, + 0x91C5, 0xBAE5, 0x91C6, 0xBAE6, 0x91C7, 0xBAE7, 0x91C8, 0xBAE8, + 0x91C9, 0xBAE9, 0x91CA, 0xBAEA, 0x91CB, 0xBAEB, 0x91CC, 0xBAEC, + 0x91CD, 0xBAED, 0x91CE, 0xBAEE, 0x91CF, 0xBAEF, 0x91D0, 0xBAF0, + 0x91D1, 0xBAF1, 0x91D2, 0xBAF2, 0x91D3, 0xBAF3, 0x91D4, 0xBAF4, + 0x91D5, 0xBAF5, 0x91D6, 0xBAF6, 0x91D7, 0xBAF7, 0x91D8, 0xBAF8, + 0x91D9, 0xBAF9, 0x91DA, 0xBAFA, 0x91DB, 0xBAFB, 0x91DC, 0xBAFD, + 0x91DD, 0xBAFE, 0x91DE, 0xBAFF, 0x91DF, 0xBB01, 0x91E0, 0xBB02, + 0x91E1, 0xBB03, 0x91E2, 0xBB05, 0x91E3, 0xBB06, 0x91E4, 0xBB07, + 0x91E5, 0xBB08, 0x91E6, 0xBB09, 0x91E7, 0xBB0A, 0x91E8, 0xBB0B, + 0x91E9, 0xBB0C, 0x91EA, 0xBB0E, 0x91EB, 0xBB10, 0x91EC, 0xBB12, + 0x91ED, 0xBB13, 0x91EE, 0xBB14, 0x91EF, 0xBB15, 0x91F0, 0xBB16, + 0x91F1, 0xBB17, 0x91F2, 0xBB19, 0x91F3, 0xBB1A, 0x91F4, 0xBB1B, + 0x91F5, 0xBB1D, 0x91F6, 0xBB1E, 0x91F7, 0xBB1F, 0x91F8, 0xBB21, + 0x91F9, 0xBB22, 0x91FA, 0xBB23, 0x91FB, 0xBB24, 0x91FC, 0xBB25, + 0x91FD, 0xBB26, 0x91FE, 0xBB27, 0x9241, 0xBB28, 0x9242, 0xBB2A, + 0x9243, 0xBB2C, 0x9244, 0xBB2D, 0x9245, 0xBB2E, 0x9246, 0xBB2F, + 0x9247, 0xBB30, 0x9248, 0xBB31, 0x9249, 0xBB32, 0x924A, 0xBB33, + 0x924B, 0xBB37, 0x924C, 0xBB39, 0x924D, 0xBB3A, 0x924E, 0xBB3F, + 0x924F, 0xBB40, 0x9250, 0xBB41, 0x9251, 0xBB42, 0x9252, 0xBB43, + 0x9253, 0xBB46, 0x9254, 0xBB48, 0x9255, 0xBB4A, 0x9256, 0xBB4B, + 0x9257, 0xBB4C, 0x9258, 0xBB4E, 0x9259, 0xBB51, 0x925A, 0xBB52, + 0x9261, 0xBB53, 0x9262, 0xBB55, 0x9263, 0xBB56, 0x9264, 0xBB57, + 0x9265, 0xBB59, 0x9266, 0xBB5A, 0x9267, 0xBB5B, 0x9268, 0xBB5C, + 0x9269, 0xBB5D, 0x926A, 0xBB5E, 0x926B, 0xBB5F, 0x926C, 0xBB60, + 0x926D, 0xBB62, 0x926E, 0xBB64, 0x926F, 0xBB65, 0x9270, 0xBB66, + 0x9271, 0xBB67, 0x9272, 0xBB68, 0x9273, 0xBB69, 0x9274, 0xBB6A, + 0x9275, 0xBB6B, 0x9276, 0xBB6D, 0x9277, 0xBB6E, 0x9278, 0xBB6F, + 0x9279, 0xBB70, 0x927A, 0xBB71, 0x9281, 0xBB72, 0x9282, 0xBB73, + 0x9283, 0xBB74, 0x9284, 0xBB75, 0x9285, 0xBB76, 0x9286, 0xBB77, + 0x9287, 0xBB78, 0x9288, 0xBB79, 0x9289, 0xBB7A, 0x928A, 0xBB7B, + 0x928B, 0xBB7C, 0x928C, 0xBB7D, 0x928D, 0xBB7E, 0x928E, 0xBB7F, + 0x928F, 0xBB80, 0x9290, 0xBB81, 0x9291, 0xBB82, 0x9292, 0xBB83, + 0x9293, 0xBB84, 0x9294, 0xBB85, 0x9295, 0xBB86, 0x9296, 0xBB87, + 0x9297, 0xBB89, 0x9298, 0xBB8A, 0x9299, 0xBB8B, 0x929A, 0xBB8D, + 0x929B, 0xBB8E, 0x929C, 0xBB8F, 0x929D, 0xBB91, 0x929E, 0xBB92, + 0x929F, 0xBB93, 0x92A0, 0xBB94, 0x92A1, 0xBB95, 0x92A2, 0xBB96, + 0x92A3, 0xBB97, 0x92A4, 0xBB98, 0x92A5, 0xBB99, 0x92A6, 0xBB9A, + 0x92A7, 0xBB9B, 0x92A8, 0xBB9C, 0x92A9, 0xBB9D, 0x92AA, 0xBB9E, + 0x92AB, 0xBB9F, 0x92AC, 0xBBA0, 0x92AD, 0xBBA1, 0x92AE, 0xBBA2, + 0x92AF, 0xBBA3, 0x92B0, 0xBBA5, 0x92B1, 0xBBA6, 0x92B2, 0xBBA7, + 0x92B3, 0xBBA9, 0x92B4, 0xBBAA, 0x92B5, 0xBBAB, 0x92B6, 0xBBAD, + 0x92B7, 0xBBAE, 0x92B8, 0xBBAF, 0x92B9, 0xBBB0, 0x92BA, 0xBBB1, + 0x92BB, 0xBBB2, 0x92BC, 0xBBB3, 0x92BD, 0xBBB5, 0x92BE, 0xBBB6, + 0x92BF, 0xBBB8, 0x92C0, 0xBBB9, 0x92C1, 0xBBBA, 0x92C2, 0xBBBB, + 0x92C3, 0xBBBC, 0x92C4, 0xBBBD, 0x92C5, 0xBBBE, 0x92C6, 0xBBBF, + 0x92C7, 0xBBC1, 0x92C8, 0xBBC2, 0x92C9, 0xBBC3, 0x92CA, 0xBBC5, + 0x92CB, 0xBBC6, 0x92CC, 0xBBC7, 0x92CD, 0xBBC9, 0x92CE, 0xBBCA, + 0x92CF, 0xBBCB, 0x92D0, 0xBBCC, 0x92D1, 0xBBCD, 0x92D2, 0xBBCE, + 0x92D3, 0xBBCF, 0x92D4, 0xBBD1, 0x92D5, 0xBBD2, 0x92D6, 0xBBD4, + 0x92D7, 0xBBD5, 0x92D8, 0xBBD6, 0x92D9, 0xBBD7, 0x92DA, 0xBBD8, + 0x92DB, 0xBBD9, 0x92DC, 0xBBDA, 0x92DD, 0xBBDB, 0x92DE, 0xBBDC, + 0x92DF, 0xBBDD, 0x92E0, 0xBBDE, 0x92E1, 0xBBDF, 0x92E2, 0xBBE0, + 0x92E3, 0xBBE1, 0x92E4, 0xBBE2, 0x92E5, 0xBBE3, 0x92E6, 0xBBE4, + 0x92E7, 0xBBE5, 0x92E8, 0xBBE6, 0x92E9, 0xBBE7, 0x92EA, 0xBBE8, + 0x92EB, 0xBBE9, 0x92EC, 0xBBEA, 0x92ED, 0xBBEB, 0x92EE, 0xBBEC, + 0x92EF, 0xBBED, 0x92F0, 0xBBEE, 0x92F1, 0xBBEF, 0x92F2, 0xBBF0, + 0x92F3, 0xBBF1, 0x92F4, 0xBBF2, 0x92F5, 0xBBF3, 0x92F6, 0xBBF4, + 0x92F7, 0xBBF5, 0x92F8, 0xBBF6, 0x92F9, 0xBBF7, 0x92FA, 0xBBFA, + 0x92FB, 0xBBFB, 0x92FC, 0xBBFD, 0x92FD, 0xBBFE, 0x92FE, 0xBC01, + 0x9341, 0xBC03, 0x9342, 0xBC04, 0x9343, 0xBC05, 0x9344, 0xBC06, + 0x9345, 0xBC07, 0x9346, 0xBC0A, 0x9347, 0xBC0E, 0x9348, 0xBC10, + 0x9349, 0xBC12, 0x934A, 0xBC13, 0x934B, 0xBC19, 0x934C, 0xBC1A, + 0x934D, 0xBC20, 0x934E, 0xBC21, 0x934F, 0xBC22, 0x9350, 0xBC23, + 0x9351, 0xBC26, 0x9352, 0xBC28, 0x9353, 0xBC2A, 0x9354, 0xBC2B, + 0x9355, 0xBC2C, 0x9356, 0xBC2E, 0x9357, 0xBC2F, 0x9358, 0xBC32, + 0x9359, 0xBC33, 0x935A, 0xBC35, 0x9361, 0xBC36, 0x9362, 0xBC37, + 0x9363, 0xBC39, 0x9364, 0xBC3A, 0x9365, 0xBC3B, 0x9366, 0xBC3C, + 0x9367, 0xBC3D, 0x9368, 0xBC3E, 0x9369, 0xBC3F, 0x936A, 0xBC42, + 0x936B, 0xBC46, 0x936C, 0xBC47, 0x936D, 0xBC48, 0x936E, 0xBC4A, + 0x936F, 0xBC4B, 0x9370, 0xBC4E, 0x9371, 0xBC4F, 0x9372, 0xBC51, + 0x9373, 0xBC52, 0x9374, 0xBC53, 0x9375, 0xBC54, 0x9376, 0xBC55, + 0x9377, 0xBC56, 0x9378, 0xBC57, 0x9379, 0xBC58, 0x937A, 0xBC59, + 0x9381, 0xBC5A, 0x9382, 0xBC5B, 0x9383, 0xBC5C, 0x9384, 0xBC5E, + 0x9385, 0xBC5F, 0x9386, 0xBC60, 0x9387, 0xBC61, 0x9388, 0xBC62, + 0x9389, 0xBC63, 0x938A, 0xBC64, 0x938B, 0xBC65, 0x938C, 0xBC66, + 0x938D, 0xBC67, 0x938E, 0xBC68, 0x938F, 0xBC69, 0x9390, 0xBC6A, + 0x9391, 0xBC6B, 0x9392, 0xBC6C, 0x9393, 0xBC6D, 0x9394, 0xBC6E, + 0x9395, 0xBC6F, 0x9396, 0xBC70, 0x9397, 0xBC71, 0x9398, 0xBC72, + 0x9399, 0xBC73, 0x939A, 0xBC74, 0x939B, 0xBC75, 0x939C, 0xBC76, + 0x939D, 0xBC77, 0x939E, 0xBC78, 0x939F, 0xBC79, 0x93A0, 0xBC7A, + 0x93A1, 0xBC7B, 0x93A2, 0xBC7C, 0x93A3, 0xBC7D, 0x93A4, 0xBC7E, + 0x93A5, 0xBC7F, 0x93A6, 0xBC80, 0x93A7, 0xBC81, 0x93A8, 0xBC82, + 0x93A9, 0xBC83, 0x93AA, 0xBC86, 0x93AB, 0xBC87, 0x93AC, 0xBC89, + 0x93AD, 0xBC8A, 0x93AE, 0xBC8D, 0x93AF, 0xBC8F, 0x93B0, 0xBC90, + 0x93B1, 0xBC91, 0x93B2, 0xBC92, 0x93B3, 0xBC93, 0x93B4, 0xBC96, + 0x93B5, 0xBC98, 0x93B6, 0xBC9B, 0x93B7, 0xBC9C, 0x93B8, 0xBC9D, + 0x93B9, 0xBC9E, 0x93BA, 0xBC9F, 0x93BB, 0xBCA2, 0x93BC, 0xBCA3, + 0x93BD, 0xBCA5, 0x93BE, 0xBCA6, 0x93BF, 0xBCA9, 0x93C0, 0xBCAA, + 0x93C1, 0xBCAB, 0x93C2, 0xBCAC, 0x93C3, 0xBCAD, 0x93C4, 0xBCAE, + 0x93C5, 0xBCAF, 0x93C6, 0xBCB2, 0x93C7, 0xBCB6, 0x93C8, 0xBCB7, + 0x93C9, 0xBCB8, 0x93CA, 0xBCB9, 0x93CB, 0xBCBA, 0x93CC, 0xBCBB, + 0x93CD, 0xBCBE, 0x93CE, 0xBCBF, 0x93CF, 0xBCC1, 0x93D0, 0xBCC2, + 0x93D1, 0xBCC3, 0x93D2, 0xBCC5, 0x93D3, 0xBCC6, 0x93D4, 0xBCC7, + 0x93D5, 0xBCC8, 0x93D6, 0xBCC9, 0x93D7, 0xBCCA, 0x93D8, 0xBCCB, + 0x93D9, 0xBCCC, 0x93DA, 0xBCCE, 0x93DB, 0xBCD2, 0x93DC, 0xBCD3, + 0x93DD, 0xBCD4, 0x93DE, 0xBCD6, 0x93DF, 0xBCD7, 0x93E0, 0xBCD9, + 0x93E1, 0xBCDA, 0x93E2, 0xBCDB, 0x93E3, 0xBCDD, 0x93E4, 0xBCDE, + 0x93E5, 0xBCDF, 0x93E6, 0xBCE0, 0x93E7, 0xBCE1, 0x93E8, 0xBCE2, + 0x93E9, 0xBCE3, 0x93EA, 0xBCE4, 0x93EB, 0xBCE5, 0x93EC, 0xBCE6, + 0x93ED, 0xBCE7, 0x93EE, 0xBCE8, 0x93EF, 0xBCE9, 0x93F0, 0xBCEA, + 0x93F1, 0xBCEB, 0x93F2, 0xBCEC, 0x93F3, 0xBCED, 0x93F4, 0xBCEE, + 0x93F5, 0xBCEF, 0x93F6, 0xBCF0, 0x93F7, 0xBCF1, 0x93F8, 0xBCF2, + 0x93F9, 0xBCF3, 0x93FA, 0xBCF7, 0x93FB, 0xBCF9, 0x93FC, 0xBCFA, + 0x93FD, 0xBCFB, 0x93FE, 0xBCFD, 0x9441, 0xBCFE, 0x9442, 0xBCFF, + 0x9443, 0xBD00, 0x9444, 0xBD01, 0x9445, 0xBD02, 0x9446, 0xBD03, + 0x9447, 0xBD06, 0x9448, 0xBD08, 0x9449, 0xBD0A, 0x944A, 0xBD0B, + 0x944B, 0xBD0C, 0x944C, 0xBD0D, 0x944D, 0xBD0E, 0x944E, 0xBD0F, + 0x944F, 0xBD11, 0x9450, 0xBD12, 0x9451, 0xBD13, 0x9452, 0xBD15, + 0x9453, 0xBD16, 0x9454, 0xBD17, 0x9455, 0xBD18, 0x9456, 0xBD19, + 0x9457, 0xBD1A, 0x9458, 0xBD1B, 0x9459, 0xBD1C, 0x945A, 0xBD1D, + 0x9461, 0xBD1E, 0x9462, 0xBD1F, 0x9463, 0xBD20, 0x9464, 0xBD21, + 0x9465, 0xBD22, 0x9466, 0xBD23, 0x9467, 0xBD25, 0x9468, 0xBD26, + 0x9469, 0xBD27, 0x946A, 0xBD28, 0x946B, 0xBD29, 0x946C, 0xBD2A, + 0x946D, 0xBD2B, 0x946E, 0xBD2D, 0x946F, 0xBD2E, 0x9470, 0xBD2F, + 0x9471, 0xBD30, 0x9472, 0xBD31, 0x9473, 0xBD32, 0x9474, 0xBD33, + 0x9475, 0xBD34, 0x9476, 0xBD35, 0x9477, 0xBD36, 0x9478, 0xBD37, + 0x9479, 0xBD38, 0x947A, 0xBD39, 0x9481, 0xBD3A, 0x9482, 0xBD3B, + 0x9483, 0xBD3C, 0x9484, 0xBD3D, 0x9485, 0xBD3E, 0x9486, 0xBD3F, + 0x9487, 0xBD41, 0x9488, 0xBD42, 0x9489, 0xBD43, 0x948A, 0xBD44, + 0x948B, 0xBD45, 0x948C, 0xBD46, 0x948D, 0xBD47, 0x948E, 0xBD4A, + 0x948F, 0xBD4B, 0x9490, 0xBD4D, 0x9491, 0xBD4E, 0x9492, 0xBD4F, + 0x9493, 0xBD51, 0x9494, 0xBD52, 0x9495, 0xBD53, 0x9496, 0xBD54, + 0x9497, 0xBD55, 0x9498, 0xBD56, 0x9499, 0xBD57, 0x949A, 0xBD5A, + 0x949B, 0xBD5B, 0x949C, 0xBD5C, 0x949D, 0xBD5D, 0x949E, 0xBD5E, + 0x949F, 0xBD5F, 0x94A0, 0xBD60, 0x94A1, 0xBD61, 0x94A2, 0xBD62, + 0x94A3, 0xBD63, 0x94A4, 0xBD65, 0x94A5, 0xBD66, 0x94A6, 0xBD67, + 0x94A7, 0xBD69, 0x94A8, 0xBD6A, 0x94A9, 0xBD6B, 0x94AA, 0xBD6C, + 0x94AB, 0xBD6D, 0x94AC, 0xBD6E, 0x94AD, 0xBD6F, 0x94AE, 0xBD70, + 0x94AF, 0xBD71, 0x94B0, 0xBD72, 0x94B1, 0xBD73, 0x94B2, 0xBD74, + 0x94B3, 0xBD75, 0x94B4, 0xBD76, 0x94B5, 0xBD77, 0x94B6, 0xBD78, + 0x94B7, 0xBD79, 0x94B8, 0xBD7A, 0x94B9, 0xBD7B, 0x94BA, 0xBD7C, + 0x94BB, 0xBD7D, 0x94BC, 0xBD7E, 0x94BD, 0xBD7F, 0x94BE, 0xBD82, + 0x94BF, 0xBD83, 0x94C0, 0xBD85, 0x94C1, 0xBD86, 0x94C2, 0xBD8B, + 0x94C3, 0xBD8C, 0x94C4, 0xBD8D, 0x94C5, 0xBD8E, 0x94C6, 0xBD8F, + 0x94C7, 0xBD92, 0x94C8, 0xBD94, 0x94C9, 0xBD96, 0x94CA, 0xBD97, + 0x94CB, 0xBD98, 0x94CC, 0xBD9B, 0x94CD, 0xBD9D, 0x94CE, 0xBD9E, + 0x94CF, 0xBD9F, 0x94D0, 0xBDA0, 0x94D1, 0xBDA1, 0x94D2, 0xBDA2, + 0x94D3, 0xBDA3, 0x94D4, 0xBDA5, 0x94D5, 0xBDA6, 0x94D6, 0xBDA7, + 0x94D7, 0xBDA8, 0x94D8, 0xBDA9, 0x94D9, 0xBDAA, 0x94DA, 0xBDAB, + 0x94DB, 0xBDAC, 0x94DC, 0xBDAD, 0x94DD, 0xBDAE, 0x94DE, 0xBDAF, + 0x94DF, 0xBDB1, 0x94E0, 0xBDB2, 0x94E1, 0xBDB3, 0x94E2, 0xBDB4, + 0x94E3, 0xBDB5, 0x94E4, 0xBDB6, 0x94E5, 0xBDB7, 0x94E6, 0xBDB9, + 0x94E7, 0xBDBA, 0x94E8, 0xBDBB, 0x94E9, 0xBDBC, 0x94EA, 0xBDBD, + 0x94EB, 0xBDBE, 0x94EC, 0xBDBF, 0x94ED, 0xBDC0, 0x94EE, 0xBDC1, + 0x94EF, 0xBDC2, 0x94F0, 0xBDC3, 0x94F1, 0xBDC4, 0x94F2, 0xBDC5, + 0x94F3, 0xBDC6, 0x94F4, 0xBDC7, 0x94F5, 0xBDC8, 0x94F6, 0xBDC9, + 0x94F7, 0xBDCA, 0x94F8, 0xBDCB, 0x94F9, 0xBDCC, 0x94FA, 0xBDCD, + 0x94FB, 0xBDCE, 0x94FC, 0xBDCF, 0x94FD, 0xBDD0, 0x94FE, 0xBDD1, + 0x9541, 0xBDD2, 0x9542, 0xBDD3, 0x9543, 0xBDD6, 0x9544, 0xBDD7, + 0x9545, 0xBDD9, 0x9546, 0xBDDA, 0x9547, 0xBDDB, 0x9548, 0xBDDD, + 0x9549, 0xBDDE, 0x954A, 0xBDDF, 0x954B, 0xBDE0, 0x954C, 0xBDE1, + 0x954D, 0xBDE2, 0x954E, 0xBDE3, 0x954F, 0xBDE4, 0x9550, 0xBDE5, + 0x9551, 0xBDE6, 0x9552, 0xBDE7, 0x9553, 0xBDE8, 0x9554, 0xBDEA, + 0x9555, 0xBDEB, 0x9556, 0xBDEC, 0x9557, 0xBDED, 0x9558, 0xBDEE, + 0x9559, 0xBDEF, 0x955A, 0xBDF1, 0x9561, 0xBDF2, 0x9562, 0xBDF3, + 0x9563, 0xBDF5, 0x9564, 0xBDF6, 0x9565, 0xBDF7, 0x9566, 0xBDF9, + 0x9567, 0xBDFA, 0x9568, 0xBDFB, 0x9569, 0xBDFC, 0x956A, 0xBDFD, + 0x956B, 0xBDFE, 0x956C, 0xBDFF, 0x956D, 0xBE01, 0x956E, 0xBE02, + 0x956F, 0xBE04, 0x9570, 0xBE06, 0x9571, 0xBE07, 0x9572, 0xBE08, + 0x9573, 0xBE09, 0x9574, 0xBE0A, 0x9575, 0xBE0B, 0x9576, 0xBE0E, + 0x9577, 0xBE0F, 0x9578, 0xBE11, 0x9579, 0xBE12, 0x957A, 0xBE13, + 0x9581, 0xBE15, 0x9582, 0xBE16, 0x9583, 0xBE17, 0x9584, 0xBE18, + 0x9585, 0xBE19, 0x9586, 0xBE1A, 0x9587, 0xBE1B, 0x9588, 0xBE1E, + 0x9589, 0xBE20, 0x958A, 0xBE21, 0x958B, 0xBE22, 0x958C, 0xBE23, + 0x958D, 0xBE24, 0x958E, 0xBE25, 0x958F, 0xBE26, 0x9590, 0xBE27, + 0x9591, 0xBE28, 0x9592, 0xBE29, 0x9593, 0xBE2A, 0x9594, 0xBE2B, + 0x9595, 0xBE2C, 0x9596, 0xBE2D, 0x9597, 0xBE2E, 0x9598, 0xBE2F, + 0x9599, 0xBE30, 0x959A, 0xBE31, 0x959B, 0xBE32, 0x959C, 0xBE33, + 0x959D, 0xBE34, 0x959E, 0xBE35, 0x959F, 0xBE36, 0x95A0, 0xBE37, + 0x95A1, 0xBE38, 0x95A2, 0xBE39, 0x95A3, 0xBE3A, 0x95A4, 0xBE3B, + 0x95A5, 0xBE3C, 0x95A6, 0xBE3D, 0x95A7, 0xBE3E, 0x95A8, 0xBE3F, + 0x95A9, 0xBE40, 0x95AA, 0xBE41, 0x95AB, 0xBE42, 0x95AC, 0xBE43, + 0x95AD, 0xBE46, 0x95AE, 0xBE47, 0x95AF, 0xBE49, 0x95B0, 0xBE4A, + 0x95B1, 0xBE4B, 0x95B2, 0xBE4D, 0x95B3, 0xBE4F, 0x95B4, 0xBE50, + 0x95B5, 0xBE51, 0x95B6, 0xBE52, 0x95B7, 0xBE53, 0x95B8, 0xBE56, + 0x95B9, 0xBE58, 0x95BA, 0xBE5C, 0x95BB, 0xBE5D, 0x95BC, 0xBE5E, + 0x95BD, 0xBE5F, 0x95BE, 0xBE62, 0x95BF, 0xBE63, 0x95C0, 0xBE65, + 0x95C1, 0xBE66, 0x95C2, 0xBE67, 0x95C3, 0xBE69, 0x95C4, 0xBE6B, + 0x95C5, 0xBE6C, 0x95C6, 0xBE6D, 0x95C7, 0xBE6E, 0x95C8, 0xBE6F, + 0x95C9, 0xBE72, 0x95CA, 0xBE76, 0x95CB, 0xBE77, 0x95CC, 0xBE78, + 0x95CD, 0xBE79, 0x95CE, 0xBE7A, 0x95CF, 0xBE7E, 0x95D0, 0xBE7F, + 0x95D1, 0xBE81, 0x95D2, 0xBE82, 0x95D3, 0xBE83, 0x95D4, 0xBE85, + 0x95D5, 0xBE86, 0x95D6, 0xBE87, 0x95D7, 0xBE88, 0x95D8, 0xBE89, + 0x95D9, 0xBE8A, 0x95DA, 0xBE8B, 0x95DB, 0xBE8E, 0x95DC, 0xBE92, + 0x95DD, 0xBE93, 0x95DE, 0xBE94, 0x95DF, 0xBE95, 0x95E0, 0xBE96, + 0x95E1, 0xBE97, 0x95E2, 0xBE9A, 0x95E3, 0xBE9B, 0x95E4, 0xBE9C, + 0x95E5, 0xBE9D, 0x95E6, 0xBE9E, 0x95E7, 0xBE9F, 0x95E8, 0xBEA0, + 0x95E9, 0xBEA1, 0x95EA, 0xBEA2, 0x95EB, 0xBEA3, 0x95EC, 0xBEA4, + 0x95ED, 0xBEA5, 0x95EE, 0xBEA6, 0x95EF, 0xBEA7, 0x95F0, 0xBEA9, + 0x95F1, 0xBEAA, 0x95F2, 0xBEAB, 0x95F3, 0xBEAC, 0x95F4, 0xBEAD, + 0x95F5, 0xBEAE, 0x95F6, 0xBEAF, 0x95F7, 0xBEB0, 0x95F8, 0xBEB1, + 0x95F9, 0xBEB2, 0x95FA, 0xBEB3, 0x95FB, 0xBEB4, 0x95FC, 0xBEB5, + 0x95FD, 0xBEB6, 0x95FE, 0xBEB7, 0x9641, 0xBEB8, 0x9642, 0xBEB9, + 0x9643, 0xBEBA, 0x9644, 0xBEBB, 0x9645, 0xBEBC, 0x9646, 0xBEBD, + 0x9647, 0xBEBE, 0x9648, 0xBEBF, 0x9649, 0xBEC0, 0x964A, 0xBEC1, + 0x964B, 0xBEC2, 0x964C, 0xBEC3, 0x964D, 0xBEC4, 0x964E, 0xBEC5, + 0x964F, 0xBEC6, 0x9650, 0xBEC7, 0x9651, 0xBEC8, 0x9652, 0xBEC9, + 0x9653, 0xBECA, 0x9654, 0xBECB, 0x9655, 0xBECC, 0x9656, 0xBECD, + 0x9657, 0xBECE, 0x9658, 0xBECF, 0x9659, 0xBED2, 0x965A, 0xBED3, + 0x9661, 0xBED5, 0x9662, 0xBED6, 0x9663, 0xBED9, 0x9664, 0xBEDA, + 0x9665, 0xBEDB, 0x9666, 0xBEDC, 0x9667, 0xBEDD, 0x9668, 0xBEDE, + 0x9669, 0xBEDF, 0x966A, 0xBEE1, 0x966B, 0xBEE2, 0x966C, 0xBEE6, + 0x966D, 0xBEE7, 0x966E, 0xBEE8, 0x966F, 0xBEE9, 0x9670, 0xBEEA, + 0x9671, 0xBEEB, 0x9672, 0xBEED, 0x9673, 0xBEEE, 0x9674, 0xBEEF, + 0x9675, 0xBEF0, 0x9676, 0xBEF1, 0x9677, 0xBEF2, 0x9678, 0xBEF3, + 0x9679, 0xBEF4, 0x967A, 0xBEF5, 0x9681, 0xBEF6, 0x9682, 0xBEF7, + 0x9683, 0xBEF8, 0x9684, 0xBEF9, 0x9685, 0xBEFA, 0x9686, 0xBEFB, + 0x9687, 0xBEFC, 0x9688, 0xBEFD, 0x9689, 0xBEFE, 0x968A, 0xBEFF, + 0x968B, 0xBF00, 0x968C, 0xBF02, 0x968D, 0xBF03, 0x968E, 0xBF04, + 0x968F, 0xBF05, 0x9690, 0xBF06, 0x9691, 0xBF07, 0x9692, 0xBF0A, + 0x9693, 0xBF0B, 0x9694, 0xBF0C, 0x9695, 0xBF0D, 0x9696, 0xBF0E, + 0x9697, 0xBF0F, 0x9698, 0xBF10, 0x9699, 0xBF11, 0x969A, 0xBF12, + 0x969B, 0xBF13, 0x969C, 0xBF14, 0x969D, 0xBF15, 0x969E, 0xBF16, + 0x969F, 0xBF17, 0x96A0, 0xBF1A, 0x96A1, 0xBF1E, 0x96A2, 0xBF1F, + 0x96A3, 0xBF20, 0x96A4, 0xBF21, 0x96A5, 0xBF22, 0x96A6, 0xBF23, + 0x96A7, 0xBF24, 0x96A8, 0xBF25, 0x96A9, 0xBF26, 0x96AA, 0xBF27, + 0x96AB, 0xBF28, 0x96AC, 0xBF29, 0x96AD, 0xBF2A, 0x96AE, 0xBF2B, + 0x96AF, 0xBF2C, 0x96B0, 0xBF2D, 0x96B1, 0xBF2E, 0x96B2, 0xBF2F, + 0x96B3, 0xBF30, 0x96B4, 0xBF31, 0x96B5, 0xBF32, 0x96B6, 0xBF33, + 0x96B7, 0xBF34, 0x96B8, 0xBF35, 0x96B9, 0xBF36, 0x96BA, 0xBF37, + 0x96BB, 0xBF38, 0x96BC, 0xBF39, 0x96BD, 0xBF3A, 0x96BE, 0xBF3B, + 0x96BF, 0xBF3C, 0x96C0, 0xBF3D, 0x96C1, 0xBF3E, 0x96C2, 0xBF3F, + 0x96C3, 0xBF42, 0x96C4, 0xBF43, 0x96C5, 0xBF45, 0x96C6, 0xBF46, + 0x96C7, 0xBF47, 0x96C8, 0xBF49, 0x96C9, 0xBF4A, 0x96CA, 0xBF4B, + 0x96CB, 0xBF4C, 0x96CC, 0xBF4D, 0x96CD, 0xBF4E, 0x96CE, 0xBF4F, + 0x96CF, 0xBF52, 0x96D0, 0xBF53, 0x96D1, 0xBF54, 0x96D2, 0xBF56, + 0x96D3, 0xBF57, 0x96D4, 0xBF58, 0x96D5, 0xBF59, 0x96D6, 0xBF5A, + 0x96D7, 0xBF5B, 0x96D8, 0xBF5C, 0x96D9, 0xBF5D, 0x96DA, 0xBF5E, + 0x96DB, 0xBF5F, 0x96DC, 0xBF60, 0x96DD, 0xBF61, 0x96DE, 0xBF62, + 0x96DF, 0xBF63, 0x96E0, 0xBF64, 0x96E1, 0xBF65, 0x96E2, 0xBF66, + 0x96E3, 0xBF67, 0x96E4, 0xBF68, 0x96E5, 0xBF69, 0x96E6, 0xBF6A, + 0x96E7, 0xBF6B, 0x96E8, 0xBF6C, 0x96E9, 0xBF6D, 0x96EA, 0xBF6E, + 0x96EB, 0xBF6F, 0x96EC, 0xBF70, 0x96ED, 0xBF71, 0x96EE, 0xBF72, + 0x96EF, 0xBF73, 0x96F0, 0xBF74, 0x96F1, 0xBF75, 0x96F2, 0xBF76, + 0x96F3, 0xBF77, 0x96F4, 0xBF78, 0x96F5, 0xBF79, 0x96F6, 0xBF7A, + 0x96F7, 0xBF7B, 0x96F8, 0xBF7C, 0x96F9, 0xBF7D, 0x96FA, 0xBF7E, + 0x96FB, 0xBF7F, 0x96FC, 0xBF80, 0x96FD, 0xBF81, 0x96FE, 0xBF82, + 0x9741, 0xBF83, 0x9742, 0xBF84, 0x9743, 0xBF85, 0x9744, 0xBF86, + 0x9745, 0xBF87, 0x9746, 0xBF88, 0x9747, 0xBF89, 0x9748, 0xBF8A, + 0x9749, 0xBF8B, 0x974A, 0xBF8C, 0x974B, 0xBF8D, 0x974C, 0xBF8E, + 0x974D, 0xBF8F, 0x974E, 0xBF90, 0x974F, 0xBF91, 0x9750, 0xBF92, + 0x9751, 0xBF93, 0x9752, 0xBF95, 0x9753, 0xBF96, 0x9754, 0xBF97, + 0x9755, 0xBF98, 0x9756, 0xBF99, 0x9757, 0xBF9A, 0x9758, 0xBF9B, + 0x9759, 0xBF9C, 0x975A, 0xBF9D, 0x9761, 0xBF9E, 0x9762, 0xBF9F, + 0x9763, 0xBFA0, 0x9764, 0xBFA1, 0x9765, 0xBFA2, 0x9766, 0xBFA3, + 0x9767, 0xBFA4, 0x9768, 0xBFA5, 0x9769, 0xBFA6, 0x976A, 0xBFA7, + 0x976B, 0xBFA8, 0x976C, 0xBFA9, 0x976D, 0xBFAA, 0x976E, 0xBFAB, + 0x976F, 0xBFAC, 0x9770, 0xBFAD, 0x9771, 0xBFAE, 0x9772, 0xBFAF, + 0x9773, 0xBFB1, 0x9774, 0xBFB2, 0x9775, 0xBFB3, 0x9776, 0xBFB4, + 0x9777, 0xBFB5, 0x9778, 0xBFB6, 0x9779, 0xBFB7, 0x977A, 0xBFB8, + 0x9781, 0xBFB9, 0x9782, 0xBFBA, 0x9783, 0xBFBB, 0x9784, 0xBFBC, + 0x9785, 0xBFBD, 0x9786, 0xBFBE, 0x9787, 0xBFBF, 0x9788, 0xBFC0, + 0x9789, 0xBFC1, 0x978A, 0xBFC2, 0x978B, 0xBFC3, 0x978C, 0xBFC4, + 0x978D, 0xBFC6, 0x978E, 0xBFC7, 0x978F, 0xBFC8, 0x9790, 0xBFC9, + 0x9791, 0xBFCA, 0x9792, 0xBFCB, 0x9793, 0xBFCE, 0x9794, 0xBFCF, + 0x9795, 0xBFD1, 0x9796, 0xBFD2, 0x9797, 0xBFD3, 0x9798, 0xBFD5, + 0x9799, 0xBFD6, 0x979A, 0xBFD7, 0x979B, 0xBFD8, 0x979C, 0xBFD9, + 0x979D, 0xBFDA, 0x979E, 0xBFDB, 0x979F, 0xBFDD, 0x97A0, 0xBFDE, + 0x97A1, 0xBFE0, 0x97A2, 0xBFE2, 0x97A3, 0xBFE3, 0x97A4, 0xBFE4, + 0x97A5, 0xBFE5, 0x97A6, 0xBFE6, 0x97A7, 0xBFE7, 0x97A8, 0xBFE8, + 0x97A9, 0xBFE9, 0x97AA, 0xBFEA, 0x97AB, 0xBFEB, 0x97AC, 0xBFEC, + 0x97AD, 0xBFED, 0x97AE, 0xBFEE, 0x97AF, 0xBFEF, 0x97B0, 0xBFF0, + 0x97B1, 0xBFF1, 0x97B2, 0xBFF2, 0x97B3, 0xBFF3, 0x97B4, 0xBFF4, + 0x97B5, 0xBFF5, 0x97B6, 0xBFF6, 0x97B7, 0xBFF7, 0x97B8, 0xBFF8, + 0x97B9, 0xBFF9, 0x97BA, 0xBFFA, 0x97BB, 0xBFFB, 0x97BC, 0xBFFC, + 0x97BD, 0xBFFD, 0x97BE, 0xBFFE, 0x97BF, 0xBFFF, 0x97C0, 0xC000, + 0x97C1, 0xC001, 0x97C2, 0xC002, 0x97C3, 0xC003, 0x97C4, 0xC004, + 0x97C5, 0xC005, 0x97C6, 0xC006, 0x97C7, 0xC007, 0x97C8, 0xC008, + 0x97C9, 0xC009, 0x97CA, 0xC00A, 0x97CB, 0xC00B, 0x97CC, 0xC00C, + 0x97CD, 0xC00D, 0x97CE, 0xC00E, 0x97CF, 0xC00F, 0x97D0, 0xC010, + 0x97D1, 0xC011, 0x97D2, 0xC012, 0x97D3, 0xC013, 0x97D4, 0xC014, + 0x97D5, 0xC015, 0x97D6, 0xC016, 0x97D7, 0xC017, 0x97D8, 0xC018, + 0x97D9, 0xC019, 0x97DA, 0xC01A, 0x97DB, 0xC01B, 0x97DC, 0xC01C, + 0x97DD, 0xC01D, 0x97DE, 0xC01E, 0x97DF, 0xC01F, 0x97E0, 0xC020, + 0x97E1, 0xC021, 0x97E2, 0xC022, 0x97E3, 0xC023, 0x97E4, 0xC024, + 0x97E5, 0xC025, 0x97E6, 0xC026, 0x97E7, 0xC027, 0x97E8, 0xC028, + 0x97E9, 0xC029, 0x97EA, 0xC02A, 0x97EB, 0xC02B, 0x97EC, 0xC02C, + 0x97ED, 0xC02D, 0x97EE, 0xC02E, 0x97EF, 0xC02F, 0x97F0, 0xC030, + 0x97F1, 0xC031, 0x97F2, 0xC032, 0x97F3, 0xC033, 0x97F4, 0xC034, + 0x97F5, 0xC035, 0x97F6, 0xC036, 0x97F7, 0xC037, 0x97F8, 0xC038, + 0x97F9, 0xC039, 0x97FA, 0xC03A, 0x97FB, 0xC03B, 0x97FC, 0xC03D, + 0x97FD, 0xC03E, 0x97FE, 0xC03F, 0x9841, 0xC040, 0x9842, 0xC041, + 0x9843, 0xC042, 0x9844, 0xC043, 0x9845, 0xC044, 0x9846, 0xC045, + 0x9847, 0xC046, 0x9848, 0xC047, 0x9849, 0xC048, 0x984A, 0xC049, + 0x984B, 0xC04A, 0x984C, 0xC04B, 0x984D, 0xC04C, 0x984E, 0xC04D, + 0x984F, 0xC04E, 0x9850, 0xC04F, 0x9851, 0xC050, 0x9852, 0xC052, + 0x9853, 0xC053, 0x9854, 0xC054, 0x9855, 0xC055, 0x9856, 0xC056, + 0x9857, 0xC057, 0x9858, 0xC059, 0x9859, 0xC05A, 0x985A, 0xC05B, + 0x9861, 0xC05D, 0x9862, 0xC05E, 0x9863, 0xC05F, 0x9864, 0xC061, + 0x9865, 0xC062, 0x9866, 0xC063, 0x9867, 0xC064, 0x9868, 0xC065, + 0x9869, 0xC066, 0x986A, 0xC067, 0x986B, 0xC06A, 0x986C, 0xC06B, + 0x986D, 0xC06C, 0x986E, 0xC06D, 0x986F, 0xC06E, 0x9870, 0xC06F, + 0x9871, 0xC070, 0x9872, 0xC071, 0x9873, 0xC072, 0x9874, 0xC073, + 0x9875, 0xC074, 0x9876, 0xC075, 0x9877, 0xC076, 0x9878, 0xC077, + 0x9879, 0xC078, 0x987A, 0xC079, 0x9881, 0xC07A, 0x9882, 0xC07B, + 0x9883, 0xC07C, 0x9884, 0xC07D, 0x9885, 0xC07E, 0x9886, 0xC07F, + 0x9887, 0xC080, 0x9888, 0xC081, 0x9889, 0xC082, 0x988A, 0xC083, + 0x988B, 0xC084, 0x988C, 0xC085, 0x988D, 0xC086, 0x988E, 0xC087, + 0x988F, 0xC088, 0x9890, 0xC089, 0x9891, 0xC08A, 0x9892, 0xC08B, + 0x9893, 0xC08C, 0x9894, 0xC08D, 0x9895, 0xC08E, 0x9896, 0xC08F, + 0x9897, 0xC092, 0x9898, 0xC093, 0x9899, 0xC095, 0x989A, 0xC096, + 0x989B, 0xC097, 0x989C, 0xC099, 0x989D, 0xC09A, 0x989E, 0xC09B, + 0x989F, 0xC09C, 0x98A0, 0xC09D, 0x98A1, 0xC09E, 0x98A2, 0xC09F, + 0x98A3, 0xC0A2, 0x98A4, 0xC0A4, 0x98A5, 0xC0A6, 0x98A6, 0xC0A7, + 0x98A7, 0xC0A8, 0x98A8, 0xC0A9, 0x98A9, 0xC0AA, 0x98AA, 0xC0AB, + 0x98AB, 0xC0AE, 0x98AC, 0xC0B1, 0x98AD, 0xC0B2, 0x98AE, 0xC0B7, + 0x98AF, 0xC0B8, 0x98B0, 0xC0B9, 0x98B1, 0xC0BA, 0x98B2, 0xC0BB, + 0x98B3, 0xC0BE, 0x98B4, 0xC0C2, 0x98B5, 0xC0C3, 0x98B6, 0xC0C4, + 0x98B7, 0xC0C6, 0x98B8, 0xC0C7, 0x98B9, 0xC0CA, 0x98BA, 0xC0CB, + 0x98BB, 0xC0CD, 0x98BC, 0xC0CE, 0x98BD, 0xC0CF, 0x98BE, 0xC0D1, + 0x98BF, 0xC0D2, 0x98C0, 0xC0D3, 0x98C1, 0xC0D4, 0x98C2, 0xC0D5, + 0x98C3, 0xC0D6, 0x98C4, 0xC0D7, 0x98C5, 0xC0DA, 0x98C6, 0xC0DE, + 0x98C7, 0xC0DF, 0x98C8, 0xC0E0, 0x98C9, 0xC0E1, 0x98CA, 0xC0E2, + 0x98CB, 0xC0E3, 0x98CC, 0xC0E6, 0x98CD, 0xC0E7, 0x98CE, 0xC0E9, + 0x98CF, 0xC0EA, 0x98D0, 0xC0EB, 0x98D1, 0xC0ED, 0x98D2, 0xC0EE, + 0x98D3, 0xC0EF, 0x98D4, 0xC0F0, 0x98D5, 0xC0F1, 0x98D6, 0xC0F2, + 0x98D7, 0xC0F3, 0x98D8, 0xC0F6, 0x98D9, 0xC0F8, 0x98DA, 0xC0FA, + 0x98DB, 0xC0FB, 0x98DC, 0xC0FC, 0x98DD, 0xC0FD, 0x98DE, 0xC0FE, + 0x98DF, 0xC0FF, 0x98E0, 0xC101, 0x98E1, 0xC102, 0x98E2, 0xC103, + 0x98E3, 0xC105, 0x98E4, 0xC106, 0x98E5, 0xC107, 0x98E6, 0xC109, + 0x98E7, 0xC10A, 0x98E8, 0xC10B, 0x98E9, 0xC10C, 0x98EA, 0xC10D, + 0x98EB, 0xC10E, 0x98EC, 0xC10F, 0x98ED, 0xC111, 0x98EE, 0xC112, + 0x98EF, 0xC113, 0x98F0, 0xC114, 0x98F1, 0xC116, 0x98F2, 0xC117, + 0x98F3, 0xC118, 0x98F4, 0xC119, 0x98F5, 0xC11A, 0x98F6, 0xC11B, + 0x98F7, 0xC121, 0x98F8, 0xC122, 0x98F9, 0xC125, 0x98FA, 0xC128, + 0x98FB, 0xC129, 0x98FC, 0xC12A, 0x98FD, 0xC12B, 0x98FE, 0xC12E, + 0x9941, 0xC132, 0x9942, 0xC133, 0x9943, 0xC134, 0x9944, 0xC135, + 0x9945, 0xC137, 0x9946, 0xC13A, 0x9947, 0xC13B, 0x9948, 0xC13D, + 0x9949, 0xC13E, 0x994A, 0xC13F, 0x994B, 0xC141, 0x994C, 0xC142, + 0x994D, 0xC143, 0x994E, 0xC144, 0x994F, 0xC145, 0x9950, 0xC146, + 0x9951, 0xC147, 0x9952, 0xC14A, 0x9953, 0xC14E, 0x9954, 0xC14F, + 0x9955, 0xC150, 0x9956, 0xC151, 0x9957, 0xC152, 0x9958, 0xC153, + 0x9959, 0xC156, 0x995A, 0xC157, 0x9961, 0xC159, 0x9962, 0xC15A, + 0x9963, 0xC15B, 0x9964, 0xC15D, 0x9965, 0xC15E, 0x9966, 0xC15F, + 0x9967, 0xC160, 0x9968, 0xC161, 0x9969, 0xC162, 0x996A, 0xC163, + 0x996B, 0xC166, 0x996C, 0xC16A, 0x996D, 0xC16B, 0x996E, 0xC16C, + 0x996F, 0xC16D, 0x9970, 0xC16E, 0x9971, 0xC16F, 0x9972, 0xC171, + 0x9973, 0xC172, 0x9974, 0xC173, 0x9975, 0xC175, 0x9976, 0xC176, + 0x9977, 0xC177, 0x9978, 0xC179, 0x9979, 0xC17A, 0x997A, 0xC17B, + 0x9981, 0xC17C, 0x9982, 0xC17D, 0x9983, 0xC17E, 0x9984, 0xC17F, + 0x9985, 0xC180, 0x9986, 0xC181, 0x9987, 0xC182, 0x9988, 0xC183, + 0x9989, 0xC184, 0x998A, 0xC186, 0x998B, 0xC187, 0x998C, 0xC188, + 0x998D, 0xC189, 0x998E, 0xC18A, 0x998F, 0xC18B, 0x9990, 0xC18F, + 0x9991, 0xC191, 0x9992, 0xC192, 0x9993, 0xC193, 0x9994, 0xC195, + 0x9995, 0xC197, 0x9996, 0xC198, 0x9997, 0xC199, 0x9998, 0xC19A, + 0x9999, 0xC19B, 0x999A, 0xC19E, 0x999B, 0xC1A0, 0x999C, 0xC1A2, + 0x999D, 0xC1A3, 0x999E, 0xC1A4, 0x999F, 0xC1A6, 0x99A0, 0xC1A7, + 0x99A1, 0xC1AA, 0x99A2, 0xC1AB, 0x99A3, 0xC1AD, 0x99A4, 0xC1AE, + 0x99A5, 0xC1AF, 0x99A6, 0xC1B1, 0x99A7, 0xC1B2, 0x99A8, 0xC1B3, + 0x99A9, 0xC1B4, 0x99AA, 0xC1B5, 0x99AB, 0xC1B6, 0x99AC, 0xC1B7, + 0x99AD, 0xC1B8, 0x99AE, 0xC1B9, 0x99AF, 0xC1BA, 0x99B0, 0xC1BB, + 0x99B1, 0xC1BC, 0x99B2, 0xC1BE, 0x99B3, 0xC1BF, 0x99B4, 0xC1C0, + 0x99B5, 0xC1C1, 0x99B6, 0xC1C2, 0x99B7, 0xC1C3, 0x99B8, 0xC1C5, + 0x99B9, 0xC1C6, 0x99BA, 0xC1C7, 0x99BB, 0xC1C9, 0x99BC, 0xC1CA, + 0x99BD, 0xC1CB, 0x99BE, 0xC1CD, 0x99BF, 0xC1CE, 0x99C0, 0xC1CF, + 0x99C1, 0xC1D0, 0x99C2, 0xC1D1, 0x99C3, 0xC1D2, 0x99C4, 0xC1D3, + 0x99C5, 0xC1D5, 0x99C6, 0xC1D6, 0x99C7, 0xC1D9, 0x99C8, 0xC1DA, + 0x99C9, 0xC1DB, 0x99CA, 0xC1DC, 0x99CB, 0xC1DD, 0x99CC, 0xC1DE, + 0x99CD, 0xC1DF, 0x99CE, 0xC1E1, 0x99CF, 0xC1E2, 0x99D0, 0xC1E3, + 0x99D1, 0xC1E5, 0x99D2, 0xC1E6, 0x99D3, 0xC1E7, 0x99D4, 0xC1E9, + 0x99D5, 0xC1EA, 0x99D6, 0xC1EB, 0x99D7, 0xC1EC, 0x99D8, 0xC1ED, + 0x99D9, 0xC1EE, 0x99DA, 0xC1EF, 0x99DB, 0xC1F2, 0x99DC, 0xC1F4, + 0x99DD, 0xC1F5, 0x99DE, 0xC1F6, 0x99DF, 0xC1F7, 0x99E0, 0xC1F8, + 0x99E1, 0xC1F9, 0x99E2, 0xC1FA, 0x99E3, 0xC1FB, 0x99E4, 0xC1FE, + 0x99E5, 0xC1FF, 0x99E6, 0xC201, 0x99E7, 0xC202, 0x99E8, 0xC203, + 0x99E9, 0xC205, 0x99EA, 0xC206, 0x99EB, 0xC207, 0x99EC, 0xC208, + 0x99ED, 0xC209, 0x99EE, 0xC20A, 0x99EF, 0xC20B, 0x99F0, 0xC20E, + 0x99F1, 0xC210, 0x99F2, 0xC212, 0x99F3, 0xC213, 0x99F4, 0xC214, + 0x99F5, 0xC215, 0x99F6, 0xC216, 0x99F7, 0xC217, 0x99F8, 0xC21A, + 0x99F9, 0xC21B, 0x99FA, 0xC21D, 0x99FB, 0xC21E, 0x99FC, 0xC221, + 0x99FD, 0xC222, 0x99FE, 0xC223, 0x9A41, 0xC224, 0x9A42, 0xC225, + 0x9A43, 0xC226, 0x9A44, 0xC227, 0x9A45, 0xC22A, 0x9A46, 0xC22C, + 0x9A47, 0xC22E, 0x9A48, 0xC230, 0x9A49, 0xC233, 0x9A4A, 0xC235, + 0x9A4B, 0xC236, 0x9A4C, 0xC237, 0x9A4D, 0xC238, 0x9A4E, 0xC239, + 0x9A4F, 0xC23A, 0x9A50, 0xC23B, 0x9A51, 0xC23C, 0x9A52, 0xC23D, + 0x9A53, 0xC23E, 0x9A54, 0xC23F, 0x9A55, 0xC240, 0x9A56, 0xC241, + 0x9A57, 0xC242, 0x9A58, 0xC243, 0x9A59, 0xC244, 0x9A5A, 0xC245, + 0x9A61, 0xC246, 0x9A62, 0xC247, 0x9A63, 0xC249, 0x9A64, 0xC24A, + 0x9A65, 0xC24B, 0x9A66, 0xC24C, 0x9A67, 0xC24D, 0x9A68, 0xC24E, + 0x9A69, 0xC24F, 0x9A6A, 0xC252, 0x9A6B, 0xC253, 0x9A6C, 0xC255, + 0x9A6D, 0xC256, 0x9A6E, 0xC257, 0x9A6F, 0xC259, 0x9A70, 0xC25A, + 0x9A71, 0xC25B, 0x9A72, 0xC25C, 0x9A73, 0xC25D, 0x9A74, 0xC25E, + 0x9A75, 0xC25F, 0x9A76, 0xC261, 0x9A77, 0xC262, 0x9A78, 0xC263, + 0x9A79, 0xC264, 0x9A7A, 0xC266, 0x9A81, 0xC267, 0x9A82, 0xC268, + 0x9A83, 0xC269, 0x9A84, 0xC26A, 0x9A85, 0xC26B, 0x9A86, 0xC26E, + 0x9A87, 0xC26F, 0x9A88, 0xC271, 0x9A89, 0xC272, 0x9A8A, 0xC273, + 0x9A8B, 0xC275, 0x9A8C, 0xC276, 0x9A8D, 0xC277, 0x9A8E, 0xC278, + 0x9A8F, 0xC279, 0x9A90, 0xC27A, 0x9A91, 0xC27B, 0x9A92, 0xC27E, + 0x9A93, 0xC280, 0x9A94, 0xC282, 0x9A95, 0xC283, 0x9A96, 0xC284, + 0x9A97, 0xC285, 0x9A98, 0xC286, 0x9A99, 0xC287, 0x9A9A, 0xC28A, + 0x9A9B, 0xC28B, 0x9A9C, 0xC28C, 0x9A9D, 0xC28D, 0x9A9E, 0xC28E, + 0x9A9F, 0xC28F, 0x9AA0, 0xC291, 0x9AA1, 0xC292, 0x9AA2, 0xC293, + 0x9AA3, 0xC294, 0x9AA4, 0xC295, 0x9AA5, 0xC296, 0x9AA6, 0xC297, + 0x9AA7, 0xC299, 0x9AA8, 0xC29A, 0x9AA9, 0xC29C, 0x9AAA, 0xC29E, + 0x9AAB, 0xC29F, 0x9AAC, 0xC2A0, 0x9AAD, 0xC2A1, 0x9AAE, 0xC2A2, + 0x9AAF, 0xC2A3, 0x9AB0, 0xC2A6, 0x9AB1, 0xC2A7, 0x9AB2, 0xC2A9, + 0x9AB3, 0xC2AA, 0x9AB4, 0xC2AB, 0x9AB5, 0xC2AE, 0x9AB6, 0xC2AF, + 0x9AB7, 0xC2B0, 0x9AB8, 0xC2B1, 0x9AB9, 0xC2B2, 0x9ABA, 0xC2B3, + 0x9ABB, 0xC2B6, 0x9ABC, 0xC2B8, 0x9ABD, 0xC2BA, 0x9ABE, 0xC2BB, + 0x9ABF, 0xC2BC, 0x9AC0, 0xC2BD, 0x9AC1, 0xC2BE, 0x9AC2, 0xC2BF, + 0x9AC3, 0xC2C0, 0x9AC4, 0xC2C1, 0x9AC5, 0xC2C2, 0x9AC6, 0xC2C3, + 0x9AC7, 0xC2C4, 0x9AC8, 0xC2C5, 0x9AC9, 0xC2C6, 0x9ACA, 0xC2C7, + 0x9ACB, 0xC2C8, 0x9ACC, 0xC2C9, 0x9ACD, 0xC2CA, 0x9ACE, 0xC2CB, + 0x9ACF, 0xC2CC, 0x9AD0, 0xC2CD, 0x9AD1, 0xC2CE, 0x9AD2, 0xC2CF, + 0x9AD3, 0xC2D0, 0x9AD4, 0xC2D1, 0x9AD5, 0xC2D2, 0x9AD6, 0xC2D3, + 0x9AD7, 0xC2D4, 0x9AD8, 0xC2D5, 0x9AD9, 0xC2D6, 0x9ADA, 0xC2D7, + 0x9ADB, 0xC2D8, 0x9ADC, 0xC2D9, 0x9ADD, 0xC2DA, 0x9ADE, 0xC2DB, + 0x9ADF, 0xC2DE, 0x9AE0, 0xC2DF, 0x9AE1, 0xC2E1, 0x9AE2, 0xC2E2, + 0x9AE3, 0xC2E5, 0x9AE4, 0xC2E6, 0x9AE5, 0xC2E7, 0x9AE6, 0xC2E8, + 0x9AE7, 0xC2E9, 0x9AE8, 0xC2EA, 0x9AE9, 0xC2EE, 0x9AEA, 0xC2F0, + 0x9AEB, 0xC2F2, 0x9AEC, 0xC2F3, 0x9AED, 0xC2F4, 0x9AEE, 0xC2F5, + 0x9AEF, 0xC2F7, 0x9AF0, 0xC2FA, 0x9AF1, 0xC2FD, 0x9AF2, 0xC2FE, + 0x9AF3, 0xC2FF, 0x9AF4, 0xC301, 0x9AF5, 0xC302, 0x9AF6, 0xC303, + 0x9AF7, 0xC304, 0x9AF8, 0xC305, 0x9AF9, 0xC306, 0x9AFA, 0xC307, + 0x9AFB, 0xC30A, 0x9AFC, 0xC30B, 0x9AFD, 0xC30E, 0x9AFE, 0xC30F, + 0x9B41, 0xC310, 0x9B42, 0xC311, 0x9B43, 0xC312, 0x9B44, 0xC316, + 0x9B45, 0xC317, 0x9B46, 0xC319, 0x9B47, 0xC31A, 0x9B48, 0xC31B, + 0x9B49, 0xC31D, 0x9B4A, 0xC31E, 0x9B4B, 0xC31F, 0x9B4C, 0xC320, + 0x9B4D, 0xC321, 0x9B4E, 0xC322, 0x9B4F, 0xC323, 0x9B50, 0xC326, + 0x9B51, 0xC327, 0x9B52, 0xC32A, 0x9B53, 0xC32B, 0x9B54, 0xC32C, + 0x9B55, 0xC32D, 0x9B56, 0xC32E, 0x9B57, 0xC32F, 0x9B58, 0xC330, + 0x9B59, 0xC331, 0x9B5A, 0xC332, 0x9B61, 0xC333, 0x9B62, 0xC334, + 0x9B63, 0xC335, 0x9B64, 0xC336, 0x9B65, 0xC337, 0x9B66, 0xC338, + 0x9B67, 0xC339, 0x9B68, 0xC33A, 0x9B69, 0xC33B, 0x9B6A, 0xC33C, + 0x9B6B, 0xC33D, 0x9B6C, 0xC33E, 0x9B6D, 0xC33F, 0x9B6E, 0xC340, + 0x9B6F, 0xC341, 0x9B70, 0xC342, 0x9B71, 0xC343, 0x9B72, 0xC344, + 0x9B73, 0xC346, 0x9B74, 0xC347, 0x9B75, 0xC348, 0x9B76, 0xC349, + 0x9B77, 0xC34A, 0x9B78, 0xC34B, 0x9B79, 0xC34C, 0x9B7A, 0xC34D, + 0x9B81, 0xC34E, 0x9B82, 0xC34F, 0x9B83, 0xC350, 0x9B84, 0xC351, + 0x9B85, 0xC352, 0x9B86, 0xC353, 0x9B87, 0xC354, 0x9B88, 0xC355, + 0x9B89, 0xC356, 0x9B8A, 0xC357, 0x9B8B, 0xC358, 0x9B8C, 0xC359, + 0x9B8D, 0xC35A, 0x9B8E, 0xC35B, 0x9B8F, 0xC35C, 0x9B90, 0xC35D, + 0x9B91, 0xC35E, 0x9B92, 0xC35F, 0x9B93, 0xC360, 0x9B94, 0xC361, + 0x9B95, 0xC362, 0x9B96, 0xC363, 0x9B97, 0xC364, 0x9B98, 0xC365, + 0x9B99, 0xC366, 0x9B9A, 0xC367, 0x9B9B, 0xC36A, 0x9B9C, 0xC36B, + 0x9B9D, 0xC36D, 0x9B9E, 0xC36E, 0x9B9F, 0xC36F, 0x9BA0, 0xC371, + 0x9BA1, 0xC373, 0x9BA2, 0xC374, 0x9BA3, 0xC375, 0x9BA4, 0xC376, + 0x9BA5, 0xC377, 0x9BA6, 0xC37A, 0x9BA7, 0xC37B, 0x9BA8, 0xC37E, + 0x9BA9, 0xC37F, 0x9BAA, 0xC380, 0x9BAB, 0xC381, 0x9BAC, 0xC382, + 0x9BAD, 0xC383, 0x9BAE, 0xC385, 0x9BAF, 0xC386, 0x9BB0, 0xC387, + 0x9BB1, 0xC389, 0x9BB2, 0xC38A, 0x9BB3, 0xC38B, 0x9BB4, 0xC38D, + 0x9BB5, 0xC38E, 0x9BB6, 0xC38F, 0x9BB7, 0xC390, 0x9BB8, 0xC391, + 0x9BB9, 0xC392, 0x9BBA, 0xC393, 0x9BBB, 0xC394, 0x9BBC, 0xC395, + 0x9BBD, 0xC396, 0x9BBE, 0xC397, 0x9BBF, 0xC398, 0x9BC0, 0xC399, + 0x9BC1, 0xC39A, 0x9BC2, 0xC39B, 0x9BC3, 0xC39C, 0x9BC4, 0xC39D, + 0x9BC5, 0xC39E, 0x9BC6, 0xC39F, 0x9BC7, 0xC3A0, 0x9BC8, 0xC3A1, + 0x9BC9, 0xC3A2, 0x9BCA, 0xC3A3, 0x9BCB, 0xC3A4, 0x9BCC, 0xC3A5, + 0x9BCD, 0xC3A6, 0x9BCE, 0xC3A7, 0x9BCF, 0xC3A8, 0x9BD0, 0xC3A9, + 0x9BD1, 0xC3AA, 0x9BD2, 0xC3AB, 0x9BD3, 0xC3AC, 0x9BD4, 0xC3AD, + 0x9BD5, 0xC3AE, 0x9BD6, 0xC3AF, 0x9BD7, 0xC3B0, 0x9BD8, 0xC3B1, + 0x9BD9, 0xC3B2, 0x9BDA, 0xC3B3, 0x9BDB, 0xC3B4, 0x9BDC, 0xC3B5, + 0x9BDD, 0xC3B6, 0x9BDE, 0xC3B7, 0x9BDF, 0xC3B8, 0x9BE0, 0xC3B9, + 0x9BE1, 0xC3BA, 0x9BE2, 0xC3BB, 0x9BE3, 0xC3BC, 0x9BE4, 0xC3BD, + 0x9BE5, 0xC3BE, 0x9BE6, 0xC3BF, 0x9BE7, 0xC3C1, 0x9BE8, 0xC3C2, + 0x9BE9, 0xC3C3, 0x9BEA, 0xC3C4, 0x9BEB, 0xC3C5, 0x9BEC, 0xC3C6, + 0x9BED, 0xC3C7, 0x9BEE, 0xC3C8, 0x9BEF, 0xC3C9, 0x9BF0, 0xC3CA, + 0x9BF1, 0xC3CB, 0x9BF2, 0xC3CC, 0x9BF3, 0xC3CD, 0x9BF4, 0xC3CE, + 0x9BF5, 0xC3CF, 0x9BF6, 0xC3D0, 0x9BF7, 0xC3D1, 0x9BF8, 0xC3D2, + 0x9BF9, 0xC3D3, 0x9BFA, 0xC3D4, 0x9BFB, 0xC3D5, 0x9BFC, 0xC3D6, + 0x9BFD, 0xC3D7, 0x9BFE, 0xC3DA, 0x9C41, 0xC3DB, 0x9C42, 0xC3DD, + 0x9C43, 0xC3DE, 0x9C44, 0xC3E1, 0x9C45, 0xC3E3, 0x9C46, 0xC3E4, + 0x9C47, 0xC3E5, 0x9C48, 0xC3E6, 0x9C49, 0xC3E7, 0x9C4A, 0xC3EA, + 0x9C4B, 0xC3EB, 0x9C4C, 0xC3EC, 0x9C4D, 0xC3EE, 0x9C4E, 0xC3EF, + 0x9C4F, 0xC3F0, 0x9C50, 0xC3F1, 0x9C51, 0xC3F2, 0x9C52, 0xC3F3, + 0x9C53, 0xC3F6, 0x9C54, 0xC3F7, 0x9C55, 0xC3F9, 0x9C56, 0xC3FA, + 0x9C57, 0xC3FB, 0x9C58, 0xC3FC, 0x9C59, 0xC3FD, 0x9C5A, 0xC3FE, + 0x9C61, 0xC3FF, 0x9C62, 0xC400, 0x9C63, 0xC401, 0x9C64, 0xC402, + 0x9C65, 0xC403, 0x9C66, 0xC404, 0x9C67, 0xC405, 0x9C68, 0xC406, + 0x9C69, 0xC407, 0x9C6A, 0xC409, 0x9C6B, 0xC40A, 0x9C6C, 0xC40B, + 0x9C6D, 0xC40C, 0x9C6E, 0xC40D, 0x9C6F, 0xC40E, 0x9C70, 0xC40F, + 0x9C71, 0xC411, 0x9C72, 0xC412, 0x9C73, 0xC413, 0x9C74, 0xC414, + 0x9C75, 0xC415, 0x9C76, 0xC416, 0x9C77, 0xC417, 0x9C78, 0xC418, + 0x9C79, 0xC419, 0x9C7A, 0xC41A, 0x9C81, 0xC41B, 0x9C82, 0xC41C, + 0x9C83, 0xC41D, 0x9C84, 0xC41E, 0x9C85, 0xC41F, 0x9C86, 0xC420, + 0x9C87, 0xC421, 0x9C88, 0xC422, 0x9C89, 0xC423, 0x9C8A, 0xC425, + 0x9C8B, 0xC426, 0x9C8C, 0xC427, 0x9C8D, 0xC428, 0x9C8E, 0xC429, + 0x9C8F, 0xC42A, 0x9C90, 0xC42B, 0x9C91, 0xC42D, 0x9C92, 0xC42E, + 0x9C93, 0xC42F, 0x9C94, 0xC431, 0x9C95, 0xC432, 0x9C96, 0xC433, + 0x9C97, 0xC435, 0x9C98, 0xC436, 0x9C99, 0xC437, 0x9C9A, 0xC438, + 0x9C9B, 0xC439, 0x9C9C, 0xC43A, 0x9C9D, 0xC43B, 0x9C9E, 0xC43E, + 0x9C9F, 0xC43F, 0x9CA0, 0xC440, 0x9CA1, 0xC441, 0x9CA2, 0xC442, + 0x9CA3, 0xC443, 0x9CA4, 0xC444, 0x9CA5, 0xC445, 0x9CA6, 0xC446, + 0x9CA7, 0xC447, 0x9CA8, 0xC449, 0x9CA9, 0xC44A, 0x9CAA, 0xC44B, + 0x9CAB, 0xC44C, 0x9CAC, 0xC44D, 0x9CAD, 0xC44E, 0x9CAE, 0xC44F, + 0x9CAF, 0xC450, 0x9CB0, 0xC451, 0x9CB1, 0xC452, 0x9CB2, 0xC453, + 0x9CB3, 0xC454, 0x9CB4, 0xC455, 0x9CB5, 0xC456, 0x9CB6, 0xC457, + 0x9CB7, 0xC458, 0x9CB8, 0xC459, 0x9CB9, 0xC45A, 0x9CBA, 0xC45B, + 0x9CBB, 0xC45C, 0x9CBC, 0xC45D, 0x9CBD, 0xC45E, 0x9CBE, 0xC45F, + 0x9CBF, 0xC460, 0x9CC0, 0xC461, 0x9CC1, 0xC462, 0x9CC2, 0xC463, + 0x9CC3, 0xC466, 0x9CC4, 0xC467, 0x9CC5, 0xC469, 0x9CC6, 0xC46A, + 0x9CC7, 0xC46B, 0x9CC8, 0xC46D, 0x9CC9, 0xC46E, 0x9CCA, 0xC46F, + 0x9CCB, 0xC470, 0x9CCC, 0xC471, 0x9CCD, 0xC472, 0x9CCE, 0xC473, + 0x9CCF, 0xC476, 0x9CD0, 0xC477, 0x9CD1, 0xC478, 0x9CD2, 0xC47A, + 0x9CD3, 0xC47B, 0x9CD4, 0xC47C, 0x9CD5, 0xC47D, 0x9CD6, 0xC47E, + 0x9CD7, 0xC47F, 0x9CD8, 0xC481, 0x9CD9, 0xC482, 0x9CDA, 0xC483, + 0x9CDB, 0xC484, 0x9CDC, 0xC485, 0x9CDD, 0xC486, 0x9CDE, 0xC487, + 0x9CDF, 0xC488, 0x9CE0, 0xC489, 0x9CE1, 0xC48A, 0x9CE2, 0xC48B, + 0x9CE3, 0xC48C, 0x9CE4, 0xC48D, 0x9CE5, 0xC48E, 0x9CE6, 0xC48F, + 0x9CE7, 0xC490, 0x9CE8, 0xC491, 0x9CE9, 0xC492, 0x9CEA, 0xC493, + 0x9CEB, 0xC495, 0x9CEC, 0xC496, 0x9CED, 0xC497, 0x9CEE, 0xC498, + 0x9CEF, 0xC499, 0x9CF0, 0xC49A, 0x9CF1, 0xC49B, 0x9CF2, 0xC49D, + 0x9CF3, 0xC49E, 0x9CF4, 0xC49F, 0x9CF5, 0xC4A0, 0x9CF6, 0xC4A1, + 0x9CF7, 0xC4A2, 0x9CF8, 0xC4A3, 0x9CF9, 0xC4A4, 0x9CFA, 0xC4A5, + 0x9CFB, 0xC4A6, 0x9CFC, 0xC4A7, 0x9CFD, 0xC4A8, 0x9CFE, 0xC4A9, + 0x9D41, 0xC4AA, 0x9D42, 0xC4AB, 0x9D43, 0xC4AC, 0x9D44, 0xC4AD, + 0x9D45, 0xC4AE, 0x9D46, 0xC4AF, 0x9D47, 0xC4B0, 0x9D48, 0xC4B1, + 0x9D49, 0xC4B2, 0x9D4A, 0xC4B3, 0x9D4B, 0xC4B4, 0x9D4C, 0xC4B5, + 0x9D4D, 0xC4B6, 0x9D4E, 0xC4B7, 0x9D4F, 0xC4B9, 0x9D50, 0xC4BA, + 0x9D51, 0xC4BB, 0x9D52, 0xC4BD, 0x9D53, 0xC4BE, 0x9D54, 0xC4BF, + 0x9D55, 0xC4C0, 0x9D56, 0xC4C1, 0x9D57, 0xC4C2, 0x9D58, 0xC4C3, + 0x9D59, 0xC4C4, 0x9D5A, 0xC4C5, 0x9D61, 0xC4C6, 0x9D62, 0xC4C7, + 0x9D63, 0xC4C8, 0x9D64, 0xC4C9, 0x9D65, 0xC4CA, 0x9D66, 0xC4CB, + 0x9D67, 0xC4CC, 0x9D68, 0xC4CD, 0x9D69, 0xC4CE, 0x9D6A, 0xC4CF, + 0x9D6B, 0xC4D0, 0x9D6C, 0xC4D1, 0x9D6D, 0xC4D2, 0x9D6E, 0xC4D3, + 0x9D6F, 0xC4D4, 0x9D70, 0xC4D5, 0x9D71, 0xC4D6, 0x9D72, 0xC4D7, + 0x9D73, 0xC4D8, 0x9D74, 0xC4D9, 0x9D75, 0xC4DA, 0x9D76, 0xC4DB, + 0x9D77, 0xC4DC, 0x9D78, 0xC4DD, 0x9D79, 0xC4DE, 0x9D7A, 0xC4DF, + 0x9D81, 0xC4E0, 0x9D82, 0xC4E1, 0x9D83, 0xC4E2, 0x9D84, 0xC4E3, + 0x9D85, 0xC4E4, 0x9D86, 0xC4E5, 0x9D87, 0xC4E6, 0x9D88, 0xC4E7, + 0x9D89, 0xC4E8, 0x9D8A, 0xC4EA, 0x9D8B, 0xC4EB, 0x9D8C, 0xC4EC, + 0x9D8D, 0xC4ED, 0x9D8E, 0xC4EE, 0x9D8F, 0xC4EF, 0x9D90, 0xC4F2, + 0x9D91, 0xC4F3, 0x9D92, 0xC4F5, 0x9D93, 0xC4F6, 0x9D94, 0xC4F7, + 0x9D95, 0xC4F9, 0x9D96, 0xC4FB, 0x9D97, 0xC4FC, 0x9D98, 0xC4FD, + 0x9D99, 0xC4FE, 0x9D9A, 0xC502, 0x9D9B, 0xC503, 0x9D9C, 0xC504, + 0x9D9D, 0xC505, 0x9D9E, 0xC506, 0x9D9F, 0xC507, 0x9DA0, 0xC508, + 0x9DA1, 0xC509, 0x9DA2, 0xC50A, 0x9DA3, 0xC50B, 0x9DA4, 0xC50D, + 0x9DA5, 0xC50E, 0x9DA6, 0xC50F, 0x9DA7, 0xC511, 0x9DA8, 0xC512, + 0x9DA9, 0xC513, 0x9DAA, 0xC515, 0x9DAB, 0xC516, 0x9DAC, 0xC517, + 0x9DAD, 0xC518, 0x9DAE, 0xC519, 0x9DAF, 0xC51A, 0x9DB0, 0xC51B, + 0x9DB1, 0xC51D, 0x9DB2, 0xC51E, 0x9DB3, 0xC51F, 0x9DB4, 0xC520, + 0x9DB5, 0xC521, 0x9DB6, 0xC522, 0x9DB7, 0xC523, 0x9DB8, 0xC524, + 0x9DB9, 0xC525, 0x9DBA, 0xC526, 0x9DBB, 0xC527, 0x9DBC, 0xC52A, + 0x9DBD, 0xC52B, 0x9DBE, 0xC52D, 0x9DBF, 0xC52E, 0x9DC0, 0xC52F, + 0x9DC1, 0xC531, 0x9DC2, 0xC532, 0x9DC3, 0xC533, 0x9DC4, 0xC534, + 0x9DC5, 0xC535, 0x9DC6, 0xC536, 0x9DC7, 0xC537, 0x9DC8, 0xC53A, + 0x9DC9, 0xC53C, 0x9DCA, 0xC53E, 0x9DCB, 0xC53F, 0x9DCC, 0xC540, + 0x9DCD, 0xC541, 0x9DCE, 0xC542, 0x9DCF, 0xC543, 0x9DD0, 0xC546, + 0x9DD1, 0xC547, 0x9DD2, 0xC54B, 0x9DD3, 0xC54F, 0x9DD4, 0xC550, + 0x9DD5, 0xC551, 0x9DD6, 0xC552, 0x9DD7, 0xC556, 0x9DD8, 0xC55A, + 0x9DD9, 0xC55B, 0x9DDA, 0xC55C, 0x9DDB, 0xC55F, 0x9DDC, 0xC562, + 0x9DDD, 0xC563, 0x9DDE, 0xC565, 0x9DDF, 0xC566, 0x9DE0, 0xC567, + 0x9DE1, 0xC569, 0x9DE2, 0xC56A, 0x9DE3, 0xC56B, 0x9DE4, 0xC56C, + 0x9DE5, 0xC56D, 0x9DE6, 0xC56E, 0x9DE7, 0xC56F, 0x9DE8, 0xC572, + 0x9DE9, 0xC576, 0x9DEA, 0xC577, 0x9DEB, 0xC578, 0x9DEC, 0xC579, + 0x9DED, 0xC57A, 0x9DEE, 0xC57B, 0x9DEF, 0xC57E, 0x9DF0, 0xC57F, + 0x9DF1, 0xC581, 0x9DF2, 0xC582, 0x9DF3, 0xC583, 0x9DF4, 0xC585, + 0x9DF5, 0xC586, 0x9DF6, 0xC588, 0x9DF7, 0xC589, 0x9DF8, 0xC58A, + 0x9DF9, 0xC58B, 0x9DFA, 0xC58E, 0x9DFB, 0xC590, 0x9DFC, 0xC592, + 0x9DFD, 0xC593, 0x9DFE, 0xC594, 0x9E41, 0xC596, 0x9E42, 0xC599, + 0x9E43, 0xC59A, 0x9E44, 0xC59B, 0x9E45, 0xC59D, 0x9E46, 0xC59E, + 0x9E47, 0xC59F, 0x9E48, 0xC5A1, 0x9E49, 0xC5A2, 0x9E4A, 0xC5A3, + 0x9E4B, 0xC5A4, 0x9E4C, 0xC5A5, 0x9E4D, 0xC5A6, 0x9E4E, 0xC5A7, + 0x9E4F, 0xC5A8, 0x9E50, 0xC5AA, 0x9E51, 0xC5AB, 0x9E52, 0xC5AC, + 0x9E53, 0xC5AD, 0x9E54, 0xC5AE, 0x9E55, 0xC5AF, 0x9E56, 0xC5B0, + 0x9E57, 0xC5B1, 0x9E58, 0xC5B2, 0x9E59, 0xC5B3, 0x9E5A, 0xC5B6, + 0x9E61, 0xC5B7, 0x9E62, 0xC5BA, 0x9E63, 0xC5BF, 0x9E64, 0xC5C0, + 0x9E65, 0xC5C1, 0x9E66, 0xC5C2, 0x9E67, 0xC5C3, 0x9E68, 0xC5CB, + 0x9E69, 0xC5CD, 0x9E6A, 0xC5CF, 0x9E6B, 0xC5D2, 0x9E6C, 0xC5D3, + 0x9E6D, 0xC5D5, 0x9E6E, 0xC5D6, 0x9E6F, 0xC5D7, 0x9E70, 0xC5D9, + 0x9E71, 0xC5DA, 0x9E72, 0xC5DB, 0x9E73, 0xC5DC, 0x9E74, 0xC5DD, + 0x9E75, 0xC5DE, 0x9E76, 0xC5DF, 0x9E77, 0xC5E2, 0x9E78, 0xC5E4, + 0x9E79, 0xC5E6, 0x9E7A, 0xC5E7, 0x9E81, 0xC5E8, 0x9E82, 0xC5E9, + 0x9E83, 0xC5EA, 0x9E84, 0xC5EB, 0x9E85, 0xC5EF, 0x9E86, 0xC5F1, + 0x9E87, 0xC5F2, 0x9E88, 0xC5F3, 0x9E89, 0xC5F5, 0x9E8A, 0xC5F8, + 0x9E8B, 0xC5F9, 0x9E8C, 0xC5FA, 0x9E8D, 0xC5FB, 0x9E8E, 0xC602, + 0x9E8F, 0xC603, 0x9E90, 0xC604, 0x9E91, 0xC609, 0x9E92, 0xC60A, + 0x9E93, 0xC60B, 0x9E94, 0xC60D, 0x9E95, 0xC60E, 0x9E96, 0xC60F, + 0x9E97, 0xC611, 0x9E98, 0xC612, 0x9E99, 0xC613, 0x9E9A, 0xC614, + 0x9E9B, 0xC615, 0x9E9C, 0xC616, 0x9E9D, 0xC617, 0x9E9E, 0xC61A, + 0x9E9F, 0xC61D, 0x9EA0, 0xC61E, 0x9EA1, 0xC61F, 0x9EA2, 0xC620, + 0x9EA3, 0xC621, 0x9EA4, 0xC622, 0x9EA5, 0xC623, 0x9EA6, 0xC626, + 0x9EA7, 0xC627, 0x9EA8, 0xC629, 0x9EA9, 0xC62A, 0x9EAA, 0xC62B, + 0x9EAB, 0xC62F, 0x9EAC, 0xC631, 0x9EAD, 0xC632, 0x9EAE, 0xC636, + 0x9EAF, 0xC638, 0x9EB0, 0xC63A, 0x9EB1, 0xC63C, 0x9EB2, 0xC63D, + 0x9EB3, 0xC63E, 0x9EB4, 0xC63F, 0x9EB5, 0xC642, 0x9EB6, 0xC643, + 0x9EB7, 0xC645, 0x9EB8, 0xC646, 0x9EB9, 0xC647, 0x9EBA, 0xC649, + 0x9EBB, 0xC64A, 0x9EBC, 0xC64B, 0x9EBD, 0xC64C, 0x9EBE, 0xC64D, + 0x9EBF, 0xC64E, 0x9EC0, 0xC64F, 0x9EC1, 0xC652, 0x9EC2, 0xC656, + 0x9EC3, 0xC657, 0x9EC4, 0xC658, 0x9EC5, 0xC659, 0x9EC6, 0xC65A, + 0x9EC7, 0xC65B, 0x9EC8, 0xC65E, 0x9EC9, 0xC65F, 0x9ECA, 0xC661, + 0x9ECB, 0xC662, 0x9ECC, 0xC663, 0x9ECD, 0xC664, 0x9ECE, 0xC665, + 0x9ECF, 0xC666, 0x9ED0, 0xC667, 0x9ED1, 0xC668, 0x9ED2, 0xC669, + 0x9ED3, 0xC66A, 0x9ED4, 0xC66B, 0x9ED5, 0xC66D, 0x9ED6, 0xC66E, + 0x9ED7, 0xC670, 0x9ED8, 0xC672, 0x9ED9, 0xC673, 0x9EDA, 0xC674, + 0x9EDB, 0xC675, 0x9EDC, 0xC676, 0x9EDD, 0xC677, 0x9EDE, 0xC67A, + 0x9EDF, 0xC67B, 0x9EE0, 0xC67D, 0x9EE1, 0xC67E, 0x9EE2, 0xC67F, + 0x9EE3, 0xC681, 0x9EE4, 0xC682, 0x9EE5, 0xC683, 0x9EE6, 0xC684, + 0x9EE7, 0xC685, 0x9EE8, 0xC686, 0x9EE9, 0xC687, 0x9EEA, 0xC68A, + 0x9EEB, 0xC68C, 0x9EEC, 0xC68E, 0x9EED, 0xC68F, 0x9EEE, 0xC690, + 0x9EEF, 0xC691, 0x9EF0, 0xC692, 0x9EF1, 0xC693, 0x9EF2, 0xC696, + 0x9EF3, 0xC697, 0x9EF4, 0xC699, 0x9EF5, 0xC69A, 0x9EF6, 0xC69B, + 0x9EF7, 0xC69D, 0x9EF8, 0xC69E, 0x9EF9, 0xC69F, 0x9EFA, 0xC6A0, + 0x9EFB, 0xC6A1, 0x9EFC, 0xC6A2, 0x9EFD, 0xC6A3, 0x9EFE, 0xC6A6, + 0x9F41, 0xC6A8, 0x9F42, 0xC6AA, 0x9F43, 0xC6AB, 0x9F44, 0xC6AC, + 0x9F45, 0xC6AD, 0x9F46, 0xC6AE, 0x9F47, 0xC6AF, 0x9F48, 0xC6B2, + 0x9F49, 0xC6B3, 0x9F4A, 0xC6B5, 0x9F4B, 0xC6B6, 0x9F4C, 0xC6B7, + 0x9F4D, 0xC6BB, 0x9F4E, 0xC6BC, 0x9F4F, 0xC6BD, 0x9F50, 0xC6BE, + 0x9F51, 0xC6BF, 0x9F52, 0xC6C2, 0x9F53, 0xC6C4, 0x9F54, 0xC6C6, + 0x9F55, 0xC6C7, 0x9F56, 0xC6C8, 0x9F57, 0xC6C9, 0x9F58, 0xC6CA, + 0x9F59, 0xC6CB, 0x9F5A, 0xC6CE, 0x9F61, 0xC6CF, 0x9F62, 0xC6D1, + 0x9F63, 0xC6D2, 0x9F64, 0xC6D3, 0x9F65, 0xC6D5, 0x9F66, 0xC6D6, + 0x9F67, 0xC6D7, 0x9F68, 0xC6D8, 0x9F69, 0xC6D9, 0x9F6A, 0xC6DA, + 0x9F6B, 0xC6DB, 0x9F6C, 0xC6DE, 0x9F6D, 0xC6DF, 0x9F6E, 0xC6E2, + 0x9F6F, 0xC6E3, 0x9F70, 0xC6E4, 0x9F71, 0xC6E5, 0x9F72, 0xC6E6, + 0x9F73, 0xC6E7, 0x9F74, 0xC6EA, 0x9F75, 0xC6EB, 0x9F76, 0xC6ED, + 0x9F77, 0xC6EE, 0x9F78, 0xC6EF, 0x9F79, 0xC6F1, 0x9F7A, 0xC6F2, + 0x9F81, 0xC6F3, 0x9F82, 0xC6F4, 0x9F83, 0xC6F5, 0x9F84, 0xC6F6, + 0x9F85, 0xC6F7, 0x9F86, 0xC6FA, 0x9F87, 0xC6FB, 0x9F88, 0xC6FC, + 0x9F89, 0xC6FE, 0x9F8A, 0xC6FF, 0x9F8B, 0xC700, 0x9F8C, 0xC701, + 0x9F8D, 0xC702, 0x9F8E, 0xC703, 0x9F8F, 0xC706, 0x9F90, 0xC707, + 0x9F91, 0xC709, 0x9F92, 0xC70A, 0x9F93, 0xC70B, 0x9F94, 0xC70D, + 0x9F95, 0xC70E, 0x9F96, 0xC70F, 0x9F97, 0xC710, 0x9F98, 0xC711, + 0x9F99, 0xC712, 0x9F9A, 0xC713, 0x9F9B, 0xC716, 0x9F9C, 0xC718, + 0x9F9D, 0xC71A, 0x9F9E, 0xC71B, 0x9F9F, 0xC71C, 0x9FA0, 0xC71D, + 0x9FA1, 0xC71E, 0x9FA2, 0xC71F, 0x9FA3, 0xC722, 0x9FA4, 0xC723, + 0x9FA5, 0xC725, 0x9FA6, 0xC726, 0x9FA7, 0xC727, 0x9FA8, 0xC729, + 0x9FA9, 0xC72A, 0x9FAA, 0xC72B, 0x9FAB, 0xC72C, 0x9FAC, 0xC72D, + 0x9FAD, 0xC72E, 0x9FAE, 0xC72F, 0x9FAF, 0xC732, 0x9FB0, 0xC734, + 0x9FB1, 0xC736, 0x9FB2, 0xC738, 0x9FB3, 0xC739, 0x9FB4, 0xC73A, + 0x9FB5, 0xC73B, 0x9FB6, 0xC73E, 0x9FB7, 0xC73F, 0x9FB8, 0xC741, + 0x9FB9, 0xC742, 0x9FBA, 0xC743, 0x9FBB, 0xC745, 0x9FBC, 0xC746, + 0x9FBD, 0xC747, 0x9FBE, 0xC748, 0x9FBF, 0xC749, 0x9FC0, 0xC74B, + 0x9FC1, 0xC74E, 0x9FC2, 0xC750, 0x9FC3, 0xC759, 0x9FC4, 0xC75A, + 0x9FC5, 0xC75B, 0x9FC6, 0xC75D, 0x9FC7, 0xC75E, 0x9FC8, 0xC75F, + 0x9FC9, 0xC761, 0x9FCA, 0xC762, 0x9FCB, 0xC763, 0x9FCC, 0xC764, + 0x9FCD, 0xC765, 0x9FCE, 0xC766, 0x9FCF, 0xC767, 0x9FD0, 0xC769, + 0x9FD1, 0xC76A, 0x9FD2, 0xC76C, 0x9FD3, 0xC76D, 0x9FD4, 0xC76E, + 0x9FD5, 0xC76F, 0x9FD6, 0xC770, 0x9FD7, 0xC771, 0x9FD8, 0xC772, + 0x9FD9, 0xC773, 0x9FDA, 0xC776, 0x9FDB, 0xC777, 0x9FDC, 0xC779, + 0x9FDD, 0xC77A, 0x9FDE, 0xC77B, 0x9FDF, 0xC77F, 0x9FE0, 0xC780, + 0x9FE1, 0xC781, 0x9FE2, 0xC782, 0x9FE3, 0xC786, 0x9FE4, 0xC78B, + 0x9FE5, 0xC78C, 0x9FE6, 0xC78D, 0x9FE7, 0xC78F, 0x9FE8, 0xC792, + 0x9FE9, 0xC793, 0x9FEA, 0xC795, 0x9FEB, 0xC799, 0x9FEC, 0xC79B, + 0x9FED, 0xC79C, 0x9FEE, 0xC79D, 0x9FEF, 0xC79E, 0x9FF0, 0xC79F, + 0x9FF1, 0xC7A2, 0x9FF2, 0xC7A7, 0x9FF3, 0xC7A8, 0x9FF4, 0xC7A9, + 0x9FF5, 0xC7AA, 0x9FF6, 0xC7AB, 0x9FF7, 0xC7AE, 0x9FF8, 0xC7AF, + 0x9FF9, 0xC7B1, 0x9FFA, 0xC7B2, 0x9FFB, 0xC7B3, 0x9FFC, 0xC7B5, + 0x9FFD, 0xC7B6, 0x9FFE, 0xC7B7, 0xA041, 0xC7B8, 0xA042, 0xC7B9, + 0xA043, 0xC7BA, 0xA044, 0xC7BB, 0xA045, 0xC7BE, 0xA046, 0xC7C2, + 0xA047, 0xC7C3, 0xA048, 0xC7C4, 0xA049, 0xC7C5, 0xA04A, 0xC7C6, + 0xA04B, 0xC7C7, 0xA04C, 0xC7CA, 0xA04D, 0xC7CB, 0xA04E, 0xC7CD, + 0xA04F, 0xC7CF, 0xA050, 0xC7D1, 0xA051, 0xC7D2, 0xA052, 0xC7D3, + 0xA053, 0xC7D4, 0xA054, 0xC7D5, 0xA055, 0xC7D6, 0xA056, 0xC7D7, + 0xA057, 0xC7D9, 0xA058, 0xC7DA, 0xA059, 0xC7DB, 0xA05A, 0xC7DC, + 0xA061, 0xC7DE, 0xA062, 0xC7DF, 0xA063, 0xC7E0, 0xA064, 0xC7E1, + 0xA065, 0xC7E2, 0xA066, 0xC7E3, 0xA067, 0xC7E5, 0xA068, 0xC7E6, + 0xA069, 0xC7E7, 0xA06A, 0xC7E9, 0xA06B, 0xC7EA, 0xA06C, 0xC7EB, + 0xA06D, 0xC7ED, 0xA06E, 0xC7EE, 0xA06F, 0xC7EF, 0xA070, 0xC7F0, + 0xA071, 0xC7F1, 0xA072, 0xC7F2, 0xA073, 0xC7F3, 0xA074, 0xC7F4, + 0xA075, 0xC7F5, 0xA076, 0xC7F6, 0xA077, 0xC7F7, 0xA078, 0xC7F8, + 0xA079, 0xC7F9, 0xA07A, 0xC7FA, 0xA081, 0xC7FB, 0xA082, 0xC7FC, + 0xA083, 0xC7FD, 0xA084, 0xC7FE, 0xA085, 0xC7FF, 0xA086, 0xC802, + 0xA087, 0xC803, 0xA088, 0xC805, 0xA089, 0xC806, 0xA08A, 0xC807, + 0xA08B, 0xC809, 0xA08C, 0xC80B, 0xA08D, 0xC80C, 0xA08E, 0xC80D, + 0xA08F, 0xC80E, 0xA090, 0xC80F, 0xA091, 0xC812, 0xA092, 0xC814, + 0xA093, 0xC817, 0xA094, 0xC818, 0xA095, 0xC819, 0xA096, 0xC81A, + 0xA097, 0xC81B, 0xA098, 0xC81E, 0xA099, 0xC81F, 0xA09A, 0xC821, + 0xA09B, 0xC822, 0xA09C, 0xC823, 0xA09D, 0xC825, 0xA09E, 0xC826, + 0xA09F, 0xC827, 0xA0A0, 0xC828, 0xA0A1, 0xC829, 0xA0A2, 0xC82A, + 0xA0A3, 0xC82B, 0xA0A4, 0xC82E, 0xA0A5, 0xC830, 0xA0A6, 0xC832, + 0xA0A7, 0xC833, 0xA0A8, 0xC834, 0xA0A9, 0xC835, 0xA0AA, 0xC836, + 0xA0AB, 0xC837, 0xA0AC, 0xC839, 0xA0AD, 0xC83A, 0xA0AE, 0xC83B, + 0xA0AF, 0xC83D, 0xA0B0, 0xC83E, 0xA0B1, 0xC83F, 0xA0B2, 0xC841, + 0xA0B3, 0xC842, 0xA0B4, 0xC843, 0xA0B5, 0xC844, 0xA0B6, 0xC845, + 0xA0B7, 0xC846, 0xA0B8, 0xC847, 0xA0B9, 0xC84A, 0xA0BA, 0xC84B, + 0xA0BB, 0xC84E, 0xA0BC, 0xC84F, 0xA0BD, 0xC850, 0xA0BE, 0xC851, + 0xA0BF, 0xC852, 0xA0C0, 0xC853, 0xA0C1, 0xC855, 0xA0C2, 0xC856, + 0xA0C3, 0xC857, 0xA0C4, 0xC858, 0xA0C5, 0xC859, 0xA0C6, 0xC85A, + 0xA0C7, 0xC85B, 0xA0C8, 0xC85C, 0xA0C9, 0xC85D, 0xA0CA, 0xC85E, + 0xA0CB, 0xC85F, 0xA0CC, 0xC860, 0xA0CD, 0xC861, 0xA0CE, 0xC862, + 0xA0CF, 0xC863, 0xA0D0, 0xC864, 0xA0D1, 0xC865, 0xA0D2, 0xC866, + 0xA0D3, 0xC867, 0xA0D4, 0xC868, 0xA0D5, 0xC869, 0xA0D6, 0xC86A, + 0xA0D7, 0xC86B, 0xA0D8, 0xC86C, 0xA0D9, 0xC86D, 0xA0DA, 0xC86E, + 0xA0DB, 0xC86F, 0xA0DC, 0xC872, 0xA0DD, 0xC873, 0xA0DE, 0xC875, + 0xA0DF, 0xC876, 0xA0E0, 0xC877, 0xA0E1, 0xC879, 0xA0E2, 0xC87B, + 0xA0E3, 0xC87C, 0xA0E4, 0xC87D, 0xA0E5, 0xC87E, 0xA0E6, 0xC87F, + 0xA0E7, 0xC882, 0xA0E8, 0xC884, 0xA0E9, 0xC888, 0xA0EA, 0xC889, + 0xA0EB, 0xC88A, 0xA0EC, 0xC88E, 0xA0ED, 0xC88F, 0xA0EE, 0xC890, + 0xA0EF, 0xC891, 0xA0F0, 0xC892, 0xA0F1, 0xC893, 0xA0F2, 0xC895, + 0xA0F3, 0xC896, 0xA0F4, 0xC897, 0xA0F5, 0xC898, 0xA0F6, 0xC899, + 0xA0F7, 0xC89A, 0xA0F8, 0xC89B, 0xA0F9, 0xC89C, 0xA0FA, 0xC89E, + 0xA0FB, 0xC8A0, 0xA0FC, 0xC8A2, 0xA0FD, 0xC8A3, 0xA0FE, 0xC8A4, + 0xA141, 0xC8A5, 0xA142, 0xC8A6, 0xA143, 0xC8A7, 0xA144, 0xC8A9, + 0xA145, 0xC8AA, 0xA146, 0xC8AB, 0xA147, 0xC8AC, 0xA148, 0xC8AD, + 0xA149, 0xC8AE, 0xA14A, 0xC8AF, 0xA14B, 0xC8B0, 0xA14C, 0xC8B1, + 0xA14D, 0xC8B2, 0xA14E, 0xC8B3, 0xA14F, 0xC8B4, 0xA150, 0xC8B5, + 0xA151, 0xC8B6, 0xA152, 0xC8B7, 0xA153, 0xC8B8, 0xA154, 0xC8B9, + 0xA155, 0xC8BA, 0xA156, 0xC8BB, 0xA157, 0xC8BE, 0xA158, 0xC8BF, + 0xA159, 0xC8C0, 0xA15A, 0xC8C1, 0xA161, 0xC8C2, 0xA162, 0xC8C3, + 0xA163, 0xC8C5, 0xA164, 0xC8C6, 0xA165, 0xC8C7, 0xA166, 0xC8C9, + 0xA167, 0xC8CA, 0xA168, 0xC8CB, 0xA169, 0xC8CD, 0xA16A, 0xC8CE, + 0xA16B, 0xC8CF, 0xA16C, 0xC8D0, 0xA16D, 0xC8D1, 0xA16E, 0xC8D2, + 0xA16F, 0xC8D3, 0xA170, 0xC8D6, 0xA171, 0xC8D8, 0xA172, 0xC8DA, + 0xA173, 0xC8DB, 0xA174, 0xC8DC, 0xA175, 0xC8DD, 0xA176, 0xC8DE, + 0xA177, 0xC8DF, 0xA178, 0xC8E2, 0xA179, 0xC8E3, 0xA17A, 0xC8E5, + 0xA181, 0xC8E6, 0xA182, 0xC8E7, 0xA183, 0xC8E8, 0xA184, 0xC8E9, + 0xA185, 0xC8EA, 0xA186, 0xC8EB, 0xA187, 0xC8EC, 0xA188, 0xC8ED, + 0xA189, 0xC8EE, 0xA18A, 0xC8EF, 0xA18B, 0xC8F0, 0xA18C, 0xC8F1, + 0xA18D, 0xC8F2, 0xA18E, 0xC8F3, 0xA18F, 0xC8F4, 0xA190, 0xC8F6, + 0xA191, 0xC8F7, 0xA192, 0xC8F8, 0xA193, 0xC8F9, 0xA194, 0xC8FA, + 0xA195, 0xC8FB, 0xA196, 0xC8FE, 0xA197, 0xC8FF, 0xA198, 0xC901, + 0xA199, 0xC902, 0xA19A, 0xC903, 0xA19B, 0xC907, 0xA19C, 0xC908, + 0xA19D, 0xC909, 0xA19E, 0xC90A, 0xA19F, 0xC90B, 0xA1A0, 0xC90E, + 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7, + 0xA1A5, 0x2025, 0xA1A6, 0x2026, 0xA1A7, 0x00A8, 0xA1A8, 0x3003, + 0xA1A9, 0x00AD, 0xA1AA, 0x2015, 0xA1AB, 0x2225, 0xA1AC, 0xFF3C, + 0xA1AD, 0x223C, 0xA1AE, 0x2018, 0xA1AF, 0x2019, 0xA1B0, 0x201C, + 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, + 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, 0xA1B8, 0x300C, + 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3010, + 0xA1BD, 0x3011, 0xA1BE, 0x00B1, 0xA1BF, 0x00D7, 0xA1C0, 0x00F7, + 0xA1C1, 0x2260, 0xA1C2, 0x2264, 0xA1C3, 0x2265, 0xA1C4, 0x221E, + 0xA1C5, 0x2234, 0xA1C6, 0x00B0, 0xA1C7, 0x2032, 0xA1C8, 0x2033, + 0xA1C9, 0x2103, 0xA1CA, 0x212B, 0xA1CB, 0xFFE0, 0xA1CC, 0xFFE1, + 0xA1CD, 0xFFE5, 0xA1CE, 0x2642, 0xA1CF, 0x2640, 0xA1D0, 0x2220, + 0xA1D1, 0x22A5, 0xA1D2, 0x2312, 0xA1D3, 0x2202, 0xA1D4, 0x2207, + 0xA1D5, 0x2261, 0xA1D6, 0x2252, 0xA1D7, 0x00A7, 0xA1D8, 0x203B, + 0xA1D9, 0x2606, 0xA1DA, 0x2605, 0xA1DB, 0x25CB, 0xA1DC, 0x25CF, + 0xA1DD, 0x25CE, 0xA1DE, 0x25C7, 0xA1DF, 0x25C6, 0xA1E0, 0x25A1, + 0xA1E1, 0x25A0, 0xA1E2, 0x25B3, 0xA1E3, 0x25B2, 0xA1E4, 0x25BD, + 0xA1E5, 0x25BC, 0xA1E6, 0x2192, 0xA1E7, 0x2190, 0xA1E8, 0x2191, + 0xA1E9, 0x2193, 0xA1EA, 0x2194, 0xA1EB, 0x3013, 0xA1EC, 0x226A, + 0xA1ED, 0x226B, 0xA1EE, 0x221A, 0xA1EF, 0x223D, 0xA1F0, 0x221D, + 0xA1F1, 0x2235, 0xA1F2, 0x222B, 0xA1F3, 0x222C, 0xA1F4, 0x2208, + 0xA1F5, 0x220B, 0xA1F6, 0x2286, 0xA1F7, 0x2287, 0xA1F8, 0x2282, + 0xA1F9, 0x2283, 0xA1FA, 0x222A, 0xA1FB, 0x2229, 0xA1FC, 0x2227, + 0xA1FD, 0x2228, 0xA1FE, 0xFFE2, 0xA241, 0xC910, 0xA242, 0xC912, + 0xA243, 0xC913, 0xA244, 0xC914, 0xA245, 0xC915, 0xA246, 0xC916, + 0xA247, 0xC917, 0xA248, 0xC919, 0xA249, 0xC91A, 0xA24A, 0xC91B, + 0xA24B, 0xC91C, 0xA24C, 0xC91D, 0xA24D, 0xC91E, 0xA24E, 0xC91F, + 0xA24F, 0xC920, 0xA250, 0xC921, 0xA251, 0xC922, 0xA252, 0xC923, + 0xA253, 0xC924, 0xA254, 0xC925, 0xA255, 0xC926, 0xA256, 0xC927, + 0xA257, 0xC928, 0xA258, 0xC929, 0xA259, 0xC92A, 0xA25A, 0xC92B, + 0xA261, 0xC92D, 0xA262, 0xC92E, 0xA263, 0xC92F, 0xA264, 0xC930, + 0xA265, 0xC931, 0xA266, 0xC932, 0xA267, 0xC933, 0xA268, 0xC935, + 0xA269, 0xC936, 0xA26A, 0xC937, 0xA26B, 0xC938, 0xA26C, 0xC939, + 0xA26D, 0xC93A, 0xA26E, 0xC93B, 0xA26F, 0xC93C, 0xA270, 0xC93D, + 0xA271, 0xC93E, 0xA272, 0xC93F, 0xA273, 0xC940, 0xA274, 0xC941, + 0xA275, 0xC942, 0xA276, 0xC943, 0xA277, 0xC944, 0xA278, 0xC945, + 0xA279, 0xC946, 0xA27A, 0xC947, 0xA281, 0xC948, 0xA282, 0xC949, + 0xA283, 0xC94A, 0xA284, 0xC94B, 0xA285, 0xC94C, 0xA286, 0xC94D, + 0xA287, 0xC94E, 0xA288, 0xC94F, 0xA289, 0xC952, 0xA28A, 0xC953, + 0xA28B, 0xC955, 0xA28C, 0xC956, 0xA28D, 0xC957, 0xA28E, 0xC959, + 0xA28F, 0xC95A, 0xA290, 0xC95B, 0xA291, 0xC95C, 0xA292, 0xC95D, + 0xA293, 0xC95E, 0xA294, 0xC95F, 0xA295, 0xC962, 0xA296, 0xC964, + 0xA297, 0xC965, 0xA298, 0xC966, 0xA299, 0xC967, 0xA29A, 0xC968, + 0xA29B, 0xC969, 0xA29C, 0xC96A, 0xA29D, 0xC96B, 0xA29E, 0xC96D, + 0xA29F, 0xC96E, 0xA2A0, 0xC96F, 0xA2A1, 0x21D2, 0xA2A2, 0x21D4, + 0xA2A3, 0x2200, 0xA2A4, 0x2203, 0xA2A5, 0x00B4, 0xA2A6, 0xFF5E, + 0xA2A7, 0x02C7, 0xA2A8, 0x02D8, 0xA2A9, 0x02DD, 0xA2AA, 0x02DA, + 0xA2AB, 0x02D9, 0xA2AC, 0x00B8, 0xA2AD, 0x02DB, 0xA2AE, 0x00A1, + 0xA2AF, 0x00BF, 0xA2B0, 0x02D0, 0xA2B1, 0x222E, 0xA2B2, 0x2211, + 0xA2B3, 0x220F, 0xA2B4, 0x00A4, 0xA2B5, 0x2109, 0xA2B6, 0x2030, + 0xA2B7, 0x25C1, 0xA2B8, 0x25C0, 0xA2B9, 0x25B7, 0xA2BA, 0x25B6, + 0xA2BB, 0x2664, 0xA2BC, 0x2660, 0xA2BD, 0x2661, 0xA2BE, 0x2665, + 0xA2BF, 0x2667, 0xA2C0, 0x2663, 0xA2C1, 0x2299, 0xA2C2, 0x25C8, + 0xA2C3, 0x25A3, 0xA2C4, 0x25D0, 0xA2C5, 0x25D1, 0xA2C6, 0x2592, + 0xA2C7, 0x25A4, 0xA2C8, 0x25A5, 0xA2C9, 0x25A8, 0xA2CA, 0x25A7, + 0xA2CB, 0x25A6, 0xA2CC, 0x25A9, 0xA2CD, 0x2668, 0xA2CE, 0x260F, + 0xA2CF, 0x260E, 0xA2D0, 0x261C, 0xA2D1, 0x261E, 0xA2D2, 0x00B6, + 0xA2D3, 0x2020, 0xA2D4, 0x2021, 0xA2D5, 0x2195, 0xA2D6, 0x2197, + 0xA2D7, 0x2199, 0xA2D8, 0x2196, 0xA2D9, 0x2198, 0xA2DA, 0x266D, + 0xA2DB, 0x2669, 0xA2DC, 0x266A, 0xA2DD, 0x266C, 0xA2DE, 0x327F, + 0xA2DF, 0x321C, 0xA2E0, 0x2116, 0xA2E1, 0x33C7, 0xA2E2, 0x2122, + 0xA2E3, 0x33C2, 0xA2E4, 0x33D8, 0xA2E5, 0x2121, 0xA2E6, 0x20AC, + 0xA2E7, 0x00AE, 0xA341, 0xC971, 0xA342, 0xC972, 0xA343, 0xC973, + 0xA344, 0xC975, 0xA345, 0xC976, 0xA346, 0xC977, 0xA347, 0xC978, + 0xA348, 0xC979, 0xA349, 0xC97A, 0xA34A, 0xC97B, 0xA34B, 0xC97D, + 0xA34C, 0xC97E, 0xA34D, 0xC97F, 0xA34E, 0xC980, 0xA34F, 0xC981, + 0xA350, 0xC982, 0xA351, 0xC983, 0xA352, 0xC984, 0xA353, 0xC985, + 0xA354, 0xC986, 0xA355, 0xC987, 0xA356, 0xC98A, 0xA357, 0xC98B, + 0xA358, 0xC98D, 0xA359, 0xC98E, 0xA35A, 0xC98F, 0xA361, 0xC991, + 0xA362, 0xC992, 0xA363, 0xC993, 0xA364, 0xC994, 0xA365, 0xC995, + 0xA366, 0xC996, 0xA367, 0xC997, 0xA368, 0xC99A, 0xA369, 0xC99C, + 0xA36A, 0xC99E, 0xA36B, 0xC99F, 0xA36C, 0xC9A0, 0xA36D, 0xC9A1, + 0xA36E, 0xC9A2, 0xA36F, 0xC9A3, 0xA370, 0xC9A4, 0xA371, 0xC9A5, + 0xA372, 0xC9A6, 0xA373, 0xC9A7, 0xA374, 0xC9A8, 0xA375, 0xC9A9, + 0xA376, 0xC9AA, 0xA377, 0xC9AB, 0xA378, 0xC9AC, 0xA379, 0xC9AD, + 0xA37A, 0xC9AE, 0xA381, 0xC9AF, 0xA382, 0xC9B0, 0xA383, 0xC9B1, + 0xA384, 0xC9B2, 0xA385, 0xC9B3, 0xA386, 0xC9B4, 0xA387, 0xC9B5, + 0xA388, 0xC9B6, 0xA389, 0xC9B7, 0xA38A, 0xC9B8, 0xA38B, 0xC9B9, + 0xA38C, 0xC9BA, 0xA38D, 0xC9BB, 0xA38E, 0xC9BC, 0xA38F, 0xC9BD, + 0xA390, 0xC9BE, 0xA391, 0xC9BF, 0xA392, 0xC9C2, 0xA393, 0xC9C3, + 0xA394, 0xC9C5, 0xA395, 0xC9C6, 0xA396, 0xC9C9, 0xA397, 0xC9CB, + 0xA398, 0xC9CC, 0xA399, 0xC9CD, 0xA39A, 0xC9CE, 0xA39B, 0xC9CF, + 0xA39C, 0xC9D2, 0xA39D, 0xC9D4, 0xA39E, 0xC9D7, 0xA39F, 0xC9D8, + 0xA3A0, 0xC9DB, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, + 0xA3A4, 0xFF04, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, + 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, + 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, + 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, + 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, + 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, + 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, + 0xA3DC, 0xFFE6, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, + 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, + 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, + 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, + 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA441, 0xC9DE, + 0xA442, 0xC9DF, 0xA443, 0xC9E1, 0xA444, 0xC9E3, 0xA445, 0xC9E5, + 0xA446, 0xC9E6, 0xA447, 0xC9E8, 0xA448, 0xC9E9, 0xA449, 0xC9EA, + 0xA44A, 0xC9EB, 0xA44B, 0xC9EE, 0xA44C, 0xC9F2, 0xA44D, 0xC9F3, + 0xA44E, 0xC9F4, 0xA44F, 0xC9F5, 0xA450, 0xC9F6, 0xA451, 0xC9F7, + 0xA452, 0xC9FA, 0xA453, 0xC9FB, 0xA454, 0xC9FD, 0xA455, 0xC9FE, + 0xA456, 0xC9FF, 0xA457, 0xCA01, 0xA458, 0xCA02, 0xA459, 0xCA03, + 0xA45A, 0xCA04, 0xA461, 0xCA05, 0xA462, 0xCA06, 0xA463, 0xCA07, + 0xA464, 0xCA0A, 0xA465, 0xCA0E, 0xA466, 0xCA0F, 0xA467, 0xCA10, + 0xA468, 0xCA11, 0xA469, 0xCA12, 0xA46A, 0xCA13, 0xA46B, 0xCA15, + 0xA46C, 0xCA16, 0xA46D, 0xCA17, 0xA46E, 0xCA19, 0xA46F, 0xCA1A, + 0xA470, 0xCA1B, 0xA471, 0xCA1C, 0xA472, 0xCA1D, 0xA473, 0xCA1E, + 0xA474, 0xCA1F, 0xA475, 0xCA20, 0xA476, 0xCA21, 0xA477, 0xCA22, + 0xA478, 0xCA23, 0xA479, 0xCA24, 0xA47A, 0xCA25, 0xA481, 0xCA26, + 0xA482, 0xCA27, 0xA483, 0xCA28, 0xA484, 0xCA2A, 0xA485, 0xCA2B, + 0xA486, 0xCA2C, 0xA487, 0xCA2D, 0xA488, 0xCA2E, 0xA489, 0xCA2F, + 0xA48A, 0xCA30, 0xA48B, 0xCA31, 0xA48C, 0xCA32, 0xA48D, 0xCA33, + 0xA48E, 0xCA34, 0xA48F, 0xCA35, 0xA490, 0xCA36, 0xA491, 0xCA37, + 0xA492, 0xCA38, 0xA493, 0xCA39, 0xA494, 0xCA3A, 0xA495, 0xCA3B, + 0xA496, 0xCA3C, 0xA497, 0xCA3D, 0xA498, 0xCA3E, 0xA499, 0xCA3F, + 0xA49A, 0xCA40, 0xA49B, 0xCA41, 0xA49C, 0xCA42, 0xA49D, 0xCA43, + 0xA49E, 0xCA44, 0xA49F, 0xCA45, 0xA4A0, 0xCA46, 0xA4A1, 0x3131, + 0xA4A2, 0x3132, 0xA4A3, 0x3133, 0xA4A4, 0x3134, 0xA4A5, 0x3135, + 0xA4A6, 0x3136, 0xA4A7, 0x3137, 0xA4A8, 0x3138, 0xA4A9, 0x3139, + 0xA4AA, 0x313A, 0xA4AB, 0x313B, 0xA4AC, 0x313C, 0xA4AD, 0x313D, + 0xA4AE, 0x313E, 0xA4AF, 0x313F, 0xA4B0, 0x3140, 0xA4B1, 0x3141, + 0xA4B2, 0x3142, 0xA4B3, 0x3143, 0xA4B4, 0x3144, 0xA4B5, 0x3145, + 0xA4B6, 0x3146, 0xA4B7, 0x3147, 0xA4B8, 0x3148, 0xA4B9, 0x3149, + 0xA4BA, 0x314A, 0xA4BB, 0x314B, 0xA4BC, 0x314C, 0xA4BD, 0x314D, + 0xA4BE, 0x314E, 0xA4BF, 0x314F, 0xA4C0, 0x3150, 0xA4C1, 0x3151, + 0xA4C2, 0x3152, 0xA4C3, 0x3153, 0xA4C4, 0x3154, 0xA4C5, 0x3155, + 0xA4C6, 0x3156, 0xA4C7, 0x3157, 0xA4C8, 0x3158, 0xA4C9, 0x3159, + 0xA4CA, 0x315A, 0xA4CB, 0x315B, 0xA4CC, 0x315C, 0xA4CD, 0x315D, + 0xA4CE, 0x315E, 0xA4CF, 0x315F, 0xA4D0, 0x3160, 0xA4D1, 0x3161, + 0xA4D2, 0x3162, 0xA4D3, 0x3163, 0xA4D4, 0x3164, 0xA4D5, 0x3165, + 0xA4D6, 0x3166, 0xA4D7, 0x3167, 0xA4D8, 0x3168, 0xA4D9, 0x3169, + 0xA4DA, 0x316A, 0xA4DB, 0x316B, 0xA4DC, 0x316C, 0xA4DD, 0x316D, + 0xA4DE, 0x316E, 0xA4DF, 0x316F, 0xA4E0, 0x3170, 0xA4E1, 0x3171, + 0xA4E2, 0x3172, 0xA4E3, 0x3173, 0xA4E4, 0x3174, 0xA4E5, 0x3175, + 0xA4E6, 0x3176, 0xA4E7, 0x3177, 0xA4E8, 0x3178, 0xA4E9, 0x3179, + 0xA4EA, 0x317A, 0xA4EB, 0x317B, 0xA4EC, 0x317C, 0xA4ED, 0x317D, + 0xA4EE, 0x317E, 0xA4EF, 0x317F, 0xA4F0, 0x3180, 0xA4F1, 0x3181, + 0xA4F2, 0x3182, 0xA4F3, 0x3183, 0xA4F4, 0x3184, 0xA4F5, 0x3185, + 0xA4F6, 0x3186, 0xA4F7, 0x3187, 0xA4F8, 0x3188, 0xA4F9, 0x3189, + 0xA4FA, 0x318A, 0xA4FB, 0x318B, 0xA4FC, 0x318C, 0xA4FD, 0x318D, + 0xA4FE, 0x318E, 0xA541, 0xCA47, 0xA542, 0xCA48, 0xA543, 0xCA49, + 0xA544, 0xCA4A, 0xA545, 0xCA4B, 0xA546, 0xCA4E, 0xA547, 0xCA4F, + 0xA548, 0xCA51, 0xA549, 0xCA52, 0xA54A, 0xCA53, 0xA54B, 0xCA55, + 0xA54C, 0xCA56, 0xA54D, 0xCA57, 0xA54E, 0xCA58, 0xA54F, 0xCA59, + 0xA550, 0xCA5A, 0xA551, 0xCA5B, 0xA552, 0xCA5E, 0xA553, 0xCA62, + 0xA554, 0xCA63, 0xA555, 0xCA64, 0xA556, 0xCA65, 0xA557, 0xCA66, + 0xA558, 0xCA67, 0xA559, 0xCA69, 0xA55A, 0xCA6A, 0xA561, 0xCA6B, + 0xA562, 0xCA6C, 0xA563, 0xCA6D, 0xA564, 0xCA6E, 0xA565, 0xCA6F, + 0xA566, 0xCA70, 0xA567, 0xCA71, 0xA568, 0xCA72, 0xA569, 0xCA73, + 0xA56A, 0xCA74, 0xA56B, 0xCA75, 0xA56C, 0xCA76, 0xA56D, 0xCA77, + 0xA56E, 0xCA78, 0xA56F, 0xCA79, 0xA570, 0xCA7A, 0xA571, 0xCA7B, + 0xA572, 0xCA7C, 0xA573, 0xCA7E, 0xA574, 0xCA7F, 0xA575, 0xCA80, + 0xA576, 0xCA81, 0xA577, 0xCA82, 0xA578, 0xCA83, 0xA579, 0xCA85, + 0xA57A, 0xCA86, 0xA581, 0xCA87, 0xA582, 0xCA88, 0xA583, 0xCA89, + 0xA584, 0xCA8A, 0xA585, 0xCA8B, 0xA586, 0xCA8C, 0xA587, 0xCA8D, + 0xA588, 0xCA8E, 0xA589, 0xCA8F, 0xA58A, 0xCA90, 0xA58B, 0xCA91, + 0xA58C, 0xCA92, 0xA58D, 0xCA93, 0xA58E, 0xCA94, 0xA58F, 0xCA95, + 0xA590, 0xCA96, 0xA591, 0xCA97, 0xA592, 0xCA99, 0xA593, 0xCA9A, + 0xA594, 0xCA9B, 0xA595, 0xCA9C, 0xA596, 0xCA9D, 0xA597, 0xCA9E, + 0xA598, 0xCA9F, 0xA599, 0xCAA0, 0xA59A, 0xCAA1, 0xA59B, 0xCAA2, + 0xA59C, 0xCAA3, 0xA59D, 0xCAA4, 0xA59E, 0xCAA5, 0xA59F, 0xCAA6, + 0xA5A0, 0xCAA7, 0xA5A1, 0x2170, 0xA5A2, 0x2171, 0xA5A3, 0x2172, + 0xA5A4, 0x2173, 0xA5A5, 0x2174, 0xA5A6, 0x2175, 0xA5A7, 0x2176, + 0xA5A8, 0x2177, 0xA5A9, 0x2178, 0xA5AA, 0x2179, 0xA5B0, 0x2160, + 0xA5B1, 0x2161, 0xA5B2, 0x2162, 0xA5B3, 0x2163, 0xA5B4, 0x2164, + 0xA5B5, 0x2165, 0xA5B6, 0x2166, 0xA5B7, 0x2167, 0xA5B8, 0x2168, + 0xA5B9, 0x2169, 0xA5C1, 0x0391, 0xA5C2, 0x0392, 0xA5C3, 0x0393, + 0xA5C4, 0x0394, 0xA5C5, 0x0395, 0xA5C6, 0x0396, 0xA5C7, 0x0397, + 0xA5C8, 0x0398, 0xA5C9, 0x0399, 0xA5CA, 0x039A, 0xA5CB, 0x039B, + 0xA5CC, 0x039C, 0xA5CD, 0x039D, 0xA5CE, 0x039E, 0xA5CF, 0x039F, + 0xA5D0, 0x03A0, 0xA5D1, 0x03A1, 0xA5D2, 0x03A3, 0xA5D3, 0x03A4, + 0xA5D4, 0x03A5, 0xA5D5, 0x03A6, 0xA5D6, 0x03A7, 0xA5D7, 0x03A8, + 0xA5D8, 0x03A9, 0xA5E1, 0x03B1, 0xA5E2, 0x03B2, 0xA5E3, 0x03B3, + 0xA5E4, 0x03B4, 0xA5E5, 0x03B5, 0xA5E6, 0x03B6, 0xA5E7, 0x03B7, + 0xA5E8, 0x03B8, 0xA5E9, 0x03B9, 0xA5EA, 0x03BA, 0xA5EB, 0x03BB, + 0xA5EC, 0x03BC, 0xA5ED, 0x03BD, 0xA5EE, 0x03BE, 0xA5EF, 0x03BF, + 0xA5F0, 0x03C0, 0xA5F1, 0x03C1, 0xA5F2, 0x03C3, 0xA5F3, 0x03C4, + 0xA5F4, 0x03C5, 0xA5F5, 0x03C6, 0xA5F6, 0x03C7, 0xA5F7, 0x03C8, + 0xA5F8, 0x03C9, 0xA641, 0xCAA8, 0xA642, 0xCAA9, 0xA643, 0xCAAA, + 0xA644, 0xCAAB, 0xA645, 0xCAAC, 0xA646, 0xCAAD, 0xA647, 0xCAAE, + 0xA648, 0xCAAF, 0xA649, 0xCAB0, 0xA64A, 0xCAB1, 0xA64B, 0xCAB2, + 0xA64C, 0xCAB3, 0xA64D, 0xCAB4, 0xA64E, 0xCAB5, 0xA64F, 0xCAB6, + 0xA650, 0xCAB7, 0xA651, 0xCAB8, 0xA652, 0xCAB9, 0xA653, 0xCABA, + 0xA654, 0xCABB, 0xA655, 0xCABE, 0xA656, 0xCABF, 0xA657, 0xCAC1, + 0xA658, 0xCAC2, 0xA659, 0xCAC3, 0xA65A, 0xCAC5, 0xA661, 0xCAC6, + 0xA662, 0xCAC7, 0xA663, 0xCAC8, 0xA664, 0xCAC9, 0xA665, 0xCACA, + 0xA666, 0xCACB, 0xA667, 0xCACE, 0xA668, 0xCAD0, 0xA669, 0xCAD2, + 0xA66A, 0xCAD4, 0xA66B, 0xCAD5, 0xA66C, 0xCAD6, 0xA66D, 0xCAD7, + 0xA66E, 0xCADA, 0xA66F, 0xCADB, 0xA670, 0xCADC, 0xA671, 0xCADD, + 0xA672, 0xCADE, 0xA673, 0xCADF, 0xA674, 0xCAE1, 0xA675, 0xCAE2, + 0xA676, 0xCAE3, 0xA677, 0xCAE4, 0xA678, 0xCAE5, 0xA679, 0xCAE6, + 0xA67A, 0xCAE7, 0xA681, 0xCAE8, 0xA682, 0xCAE9, 0xA683, 0xCAEA, + 0xA684, 0xCAEB, 0xA685, 0xCAED, 0xA686, 0xCAEE, 0xA687, 0xCAEF, + 0xA688, 0xCAF0, 0xA689, 0xCAF1, 0xA68A, 0xCAF2, 0xA68B, 0xCAF3, + 0xA68C, 0xCAF5, 0xA68D, 0xCAF6, 0xA68E, 0xCAF7, 0xA68F, 0xCAF8, + 0xA690, 0xCAF9, 0xA691, 0xCAFA, 0xA692, 0xCAFB, 0xA693, 0xCAFC, + 0xA694, 0xCAFD, 0xA695, 0xCAFE, 0xA696, 0xCAFF, 0xA697, 0xCB00, + 0xA698, 0xCB01, 0xA699, 0xCB02, 0xA69A, 0xCB03, 0xA69B, 0xCB04, + 0xA69C, 0xCB05, 0xA69D, 0xCB06, 0xA69E, 0xCB07, 0xA69F, 0xCB09, + 0xA6A0, 0xCB0A, 0xA6A1, 0x2500, 0xA6A2, 0x2502, 0xA6A3, 0x250C, + 0xA6A4, 0x2510, 0xA6A5, 0x2518, 0xA6A6, 0x2514, 0xA6A7, 0x251C, + 0xA6A8, 0x252C, 0xA6A9, 0x2524, 0xA6AA, 0x2534, 0xA6AB, 0x253C, + 0xA6AC, 0x2501, 0xA6AD, 0x2503, 0xA6AE, 0x250F, 0xA6AF, 0x2513, + 0xA6B0, 0x251B, 0xA6B1, 0x2517, 0xA6B2, 0x2523, 0xA6B3, 0x2533, + 0xA6B4, 0x252B, 0xA6B5, 0x253B, 0xA6B6, 0x254B, 0xA6B7, 0x2520, + 0xA6B8, 0x252F, 0xA6B9, 0x2528, 0xA6BA, 0x2537, 0xA6BB, 0x253F, + 0xA6BC, 0x251D, 0xA6BD, 0x2530, 0xA6BE, 0x2525, 0xA6BF, 0x2538, + 0xA6C0, 0x2542, 0xA6C1, 0x2512, 0xA6C2, 0x2511, 0xA6C3, 0x251A, + 0xA6C4, 0x2519, 0xA6C5, 0x2516, 0xA6C6, 0x2515, 0xA6C7, 0x250E, + 0xA6C8, 0x250D, 0xA6C9, 0x251E, 0xA6CA, 0x251F, 0xA6CB, 0x2521, + 0xA6CC, 0x2522, 0xA6CD, 0x2526, 0xA6CE, 0x2527, 0xA6CF, 0x2529, + 0xA6D0, 0x252A, 0xA6D1, 0x252D, 0xA6D2, 0x252E, 0xA6D3, 0x2531, + 0xA6D4, 0x2532, 0xA6D5, 0x2535, 0xA6D6, 0x2536, 0xA6D7, 0x2539, + 0xA6D8, 0x253A, 0xA6D9, 0x253D, 0xA6DA, 0x253E, 0xA6DB, 0x2540, + 0xA6DC, 0x2541, 0xA6DD, 0x2543, 0xA6DE, 0x2544, 0xA6DF, 0x2545, + 0xA6E0, 0x2546, 0xA6E1, 0x2547, 0xA6E2, 0x2548, 0xA6E3, 0x2549, + 0xA6E4, 0x254A, 0xA741, 0xCB0B, 0xA742, 0xCB0C, 0xA743, 0xCB0D, + 0xA744, 0xCB0E, 0xA745, 0xCB0F, 0xA746, 0xCB11, 0xA747, 0xCB12, + 0xA748, 0xCB13, 0xA749, 0xCB15, 0xA74A, 0xCB16, 0xA74B, 0xCB17, + 0xA74C, 0xCB19, 0xA74D, 0xCB1A, 0xA74E, 0xCB1B, 0xA74F, 0xCB1C, + 0xA750, 0xCB1D, 0xA751, 0xCB1E, 0xA752, 0xCB1F, 0xA753, 0xCB22, + 0xA754, 0xCB23, 0xA755, 0xCB24, 0xA756, 0xCB25, 0xA757, 0xCB26, + 0xA758, 0xCB27, 0xA759, 0xCB28, 0xA75A, 0xCB29, 0xA761, 0xCB2A, + 0xA762, 0xCB2B, 0xA763, 0xCB2C, 0xA764, 0xCB2D, 0xA765, 0xCB2E, + 0xA766, 0xCB2F, 0xA767, 0xCB30, 0xA768, 0xCB31, 0xA769, 0xCB32, + 0xA76A, 0xCB33, 0xA76B, 0xCB34, 0xA76C, 0xCB35, 0xA76D, 0xCB36, + 0xA76E, 0xCB37, 0xA76F, 0xCB38, 0xA770, 0xCB39, 0xA771, 0xCB3A, + 0xA772, 0xCB3B, 0xA773, 0xCB3C, 0xA774, 0xCB3D, 0xA775, 0xCB3E, + 0xA776, 0xCB3F, 0xA777, 0xCB40, 0xA778, 0xCB42, 0xA779, 0xCB43, + 0xA77A, 0xCB44, 0xA781, 0xCB45, 0xA782, 0xCB46, 0xA783, 0xCB47, + 0xA784, 0xCB4A, 0xA785, 0xCB4B, 0xA786, 0xCB4D, 0xA787, 0xCB4E, + 0xA788, 0xCB4F, 0xA789, 0xCB51, 0xA78A, 0xCB52, 0xA78B, 0xCB53, + 0xA78C, 0xCB54, 0xA78D, 0xCB55, 0xA78E, 0xCB56, 0xA78F, 0xCB57, + 0xA790, 0xCB5A, 0xA791, 0xCB5B, 0xA792, 0xCB5C, 0xA793, 0xCB5E, + 0xA794, 0xCB5F, 0xA795, 0xCB60, 0xA796, 0xCB61, 0xA797, 0xCB62, + 0xA798, 0xCB63, 0xA799, 0xCB65, 0xA79A, 0xCB66, 0xA79B, 0xCB67, + 0xA79C, 0xCB68, 0xA79D, 0xCB69, 0xA79E, 0xCB6A, 0xA79F, 0xCB6B, + 0xA7A0, 0xCB6C, 0xA7A1, 0x3395, 0xA7A2, 0x3396, 0xA7A3, 0x3397, + 0xA7A4, 0x2113, 0xA7A5, 0x3398, 0xA7A6, 0x33C4, 0xA7A7, 0x33A3, + 0xA7A8, 0x33A4, 0xA7A9, 0x33A5, 0xA7AA, 0x33A6, 0xA7AB, 0x3399, + 0xA7AC, 0x339A, 0xA7AD, 0x339B, 0xA7AE, 0x339C, 0xA7AF, 0x339D, + 0xA7B0, 0x339E, 0xA7B1, 0x339F, 0xA7B2, 0x33A0, 0xA7B3, 0x33A1, + 0xA7B4, 0x33A2, 0xA7B5, 0x33CA, 0xA7B6, 0x338D, 0xA7B7, 0x338E, + 0xA7B8, 0x338F, 0xA7B9, 0x33CF, 0xA7BA, 0x3388, 0xA7BB, 0x3389, + 0xA7BC, 0x33C8, 0xA7BD, 0x33A7, 0xA7BE, 0x33A8, 0xA7BF, 0x33B0, + 0xA7C0, 0x33B1, 0xA7C1, 0x33B2, 0xA7C2, 0x33B3, 0xA7C3, 0x33B4, + 0xA7C4, 0x33B5, 0xA7C5, 0x33B6, 0xA7C6, 0x33B7, 0xA7C7, 0x33B8, + 0xA7C8, 0x33B9, 0xA7C9, 0x3380, 0xA7CA, 0x3381, 0xA7CB, 0x3382, + 0xA7CC, 0x3383, 0xA7CD, 0x3384, 0xA7CE, 0x33BA, 0xA7CF, 0x33BB, + 0xA7D0, 0x33BC, 0xA7D1, 0x33BD, 0xA7D2, 0x33BE, 0xA7D3, 0x33BF, + 0xA7D4, 0x3390, 0xA7D5, 0x3391, 0xA7D6, 0x3392, 0xA7D7, 0x3393, + 0xA7D8, 0x3394, 0xA7D9, 0x2126, 0xA7DA, 0x33C0, 0xA7DB, 0x33C1, + 0xA7DC, 0x338A, 0xA7DD, 0x338B, 0xA7DE, 0x338C, 0xA7DF, 0x33D6, + 0xA7E0, 0x33C5, 0xA7E1, 0x33AD, 0xA7E2, 0x33AE, 0xA7E3, 0x33AF, + 0xA7E4, 0x33DB, 0xA7E5, 0x33A9, 0xA7E6, 0x33AA, 0xA7E7, 0x33AB, + 0xA7E8, 0x33AC, 0xA7E9, 0x33DD, 0xA7EA, 0x33D0, 0xA7EB, 0x33D3, + 0xA7EC, 0x33C3, 0xA7ED, 0x33C9, 0xA7EE, 0x33DC, 0xA7EF, 0x33C6, + 0xA841, 0xCB6D, 0xA842, 0xCB6E, 0xA843, 0xCB6F, 0xA844, 0xCB70, + 0xA845, 0xCB71, 0xA846, 0xCB72, 0xA847, 0xCB73, 0xA848, 0xCB74, + 0xA849, 0xCB75, 0xA84A, 0xCB76, 0xA84B, 0xCB77, 0xA84C, 0xCB7A, + 0xA84D, 0xCB7B, 0xA84E, 0xCB7C, 0xA84F, 0xCB7D, 0xA850, 0xCB7E, + 0xA851, 0xCB7F, 0xA852, 0xCB80, 0xA853, 0xCB81, 0xA854, 0xCB82, + 0xA855, 0xCB83, 0xA856, 0xCB84, 0xA857, 0xCB85, 0xA858, 0xCB86, + 0xA859, 0xCB87, 0xA85A, 0xCB88, 0xA861, 0xCB89, 0xA862, 0xCB8A, + 0xA863, 0xCB8B, 0xA864, 0xCB8C, 0xA865, 0xCB8D, 0xA866, 0xCB8E, + 0xA867, 0xCB8F, 0xA868, 0xCB90, 0xA869, 0xCB91, 0xA86A, 0xCB92, + 0xA86B, 0xCB93, 0xA86C, 0xCB94, 0xA86D, 0xCB95, 0xA86E, 0xCB96, + 0xA86F, 0xCB97, 0xA870, 0xCB98, 0xA871, 0xCB99, 0xA872, 0xCB9A, + 0xA873, 0xCB9B, 0xA874, 0xCB9D, 0xA875, 0xCB9E, 0xA876, 0xCB9F, + 0xA877, 0xCBA0, 0xA878, 0xCBA1, 0xA879, 0xCBA2, 0xA87A, 0xCBA3, + 0xA881, 0xCBA4, 0xA882, 0xCBA5, 0xA883, 0xCBA6, 0xA884, 0xCBA7, + 0xA885, 0xCBA8, 0xA886, 0xCBA9, 0xA887, 0xCBAA, 0xA888, 0xCBAB, + 0xA889, 0xCBAC, 0xA88A, 0xCBAD, 0xA88B, 0xCBAE, 0xA88C, 0xCBAF, + 0xA88D, 0xCBB0, 0xA88E, 0xCBB1, 0xA88F, 0xCBB2, 0xA890, 0xCBB3, + 0xA891, 0xCBB4, 0xA892, 0xCBB5, 0xA893, 0xCBB6, 0xA894, 0xCBB7, + 0xA895, 0xCBB9, 0xA896, 0xCBBA, 0xA897, 0xCBBB, 0xA898, 0xCBBC, + 0xA899, 0xCBBD, 0xA89A, 0xCBBE, 0xA89B, 0xCBBF, 0xA89C, 0xCBC0, + 0xA89D, 0xCBC1, 0xA89E, 0xCBC2, 0xA89F, 0xCBC3, 0xA8A0, 0xCBC4, + 0xA8A1, 0x00C6, 0xA8A2, 0x00D0, 0xA8A3, 0x00AA, 0xA8A4, 0x0126, + 0xA8A6, 0x0132, 0xA8A8, 0x013F, 0xA8A9, 0x0141, 0xA8AA, 0x00D8, + 0xA8AB, 0x0152, 0xA8AC, 0x00BA, 0xA8AD, 0x00DE, 0xA8AE, 0x0166, + 0xA8AF, 0x014A, 0xA8B1, 0x3260, 0xA8B2, 0x3261, 0xA8B3, 0x3262, + 0xA8B4, 0x3263, 0xA8B5, 0x3264, 0xA8B6, 0x3265, 0xA8B7, 0x3266, + 0xA8B8, 0x3267, 0xA8B9, 0x3268, 0xA8BA, 0x3269, 0xA8BB, 0x326A, + 0xA8BC, 0x326B, 0xA8BD, 0x326C, 0xA8BE, 0x326D, 0xA8BF, 0x326E, + 0xA8C0, 0x326F, 0xA8C1, 0x3270, 0xA8C2, 0x3271, 0xA8C3, 0x3272, + 0xA8C4, 0x3273, 0xA8C5, 0x3274, 0xA8C6, 0x3275, 0xA8C7, 0x3276, + 0xA8C8, 0x3277, 0xA8C9, 0x3278, 0xA8CA, 0x3279, 0xA8CB, 0x327A, + 0xA8CC, 0x327B, 0xA8CD, 0x24D0, 0xA8CE, 0x24D1, 0xA8CF, 0x24D2, + 0xA8D0, 0x24D3, 0xA8D1, 0x24D4, 0xA8D2, 0x24D5, 0xA8D3, 0x24D6, + 0xA8D4, 0x24D7, 0xA8D5, 0x24D8, 0xA8D6, 0x24D9, 0xA8D7, 0x24DA, + 0xA8D8, 0x24DB, 0xA8D9, 0x24DC, 0xA8DA, 0x24DD, 0xA8DB, 0x24DE, + 0xA8DC, 0x24DF, 0xA8DD, 0x24E0, 0xA8DE, 0x24E1, 0xA8DF, 0x24E2, + 0xA8E0, 0x24E3, 0xA8E1, 0x24E4, 0xA8E2, 0x24E5, 0xA8E3, 0x24E6, + 0xA8E4, 0x24E7, 0xA8E5, 0x24E8, 0xA8E6, 0x24E9, 0xA8E7, 0x2460, + 0xA8E8, 0x2461, 0xA8E9, 0x2462, 0xA8EA, 0x2463, 0xA8EB, 0x2464, + 0xA8EC, 0x2465, 0xA8ED, 0x2466, 0xA8EE, 0x2467, 0xA8EF, 0x2468, + 0xA8F0, 0x2469, 0xA8F1, 0x246A, 0xA8F2, 0x246B, 0xA8F3, 0x246C, + 0xA8F4, 0x246D, 0xA8F5, 0x246E, 0xA8F6, 0x00BD, 0xA8F7, 0x2153, + 0xA8F8, 0x2154, 0xA8F9, 0x00BC, 0xA8FA, 0x00BE, 0xA8FB, 0x215B, + 0xA8FC, 0x215C, 0xA8FD, 0x215D, 0xA8FE, 0x215E, 0xA941, 0xCBC5, + 0xA942, 0xCBC6, 0xA943, 0xCBC7, 0xA944, 0xCBC8, 0xA945, 0xCBC9, + 0xA946, 0xCBCA, 0xA947, 0xCBCB, 0xA948, 0xCBCC, 0xA949, 0xCBCD, + 0xA94A, 0xCBCE, 0xA94B, 0xCBCF, 0xA94C, 0xCBD0, 0xA94D, 0xCBD1, + 0xA94E, 0xCBD2, 0xA94F, 0xCBD3, 0xA950, 0xCBD5, 0xA951, 0xCBD6, + 0xA952, 0xCBD7, 0xA953, 0xCBD8, 0xA954, 0xCBD9, 0xA955, 0xCBDA, + 0xA956, 0xCBDB, 0xA957, 0xCBDC, 0xA958, 0xCBDD, 0xA959, 0xCBDE, + 0xA95A, 0xCBDF, 0xA961, 0xCBE0, 0xA962, 0xCBE1, 0xA963, 0xCBE2, + 0xA964, 0xCBE3, 0xA965, 0xCBE5, 0xA966, 0xCBE6, 0xA967, 0xCBE8, + 0xA968, 0xCBEA, 0xA969, 0xCBEB, 0xA96A, 0xCBEC, 0xA96B, 0xCBED, + 0xA96C, 0xCBEE, 0xA96D, 0xCBEF, 0xA96E, 0xCBF0, 0xA96F, 0xCBF1, + 0xA970, 0xCBF2, 0xA971, 0xCBF3, 0xA972, 0xCBF4, 0xA973, 0xCBF5, + 0xA974, 0xCBF6, 0xA975, 0xCBF7, 0xA976, 0xCBF8, 0xA977, 0xCBF9, + 0xA978, 0xCBFA, 0xA979, 0xCBFB, 0xA97A, 0xCBFC, 0xA981, 0xCBFD, + 0xA982, 0xCBFE, 0xA983, 0xCBFF, 0xA984, 0xCC00, 0xA985, 0xCC01, + 0xA986, 0xCC02, 0xA987, 0xCC03, 0xA988, 0xCC04, 0xA989, 0xCC05, + 0xA98A, 0xCC06, 0xA98B, 0xCC07, 0xA98C, 0xCC08, 0xA98D, 0xCC09, + 0xA98E, 0xCC0A, 0xA98F, 0xCC0B, 0xA990, 0xCC0E, 0xA991, 0xCC0F, + 0xA992, 0xCC11, 0xA993, 0xCC12, 0xA994, 0xCC13, 0xA995, 0xCC15, + 0xA996, 0xCC16, 0xA997, 0xCC17, 0xA998, 0xCC18, 0xA999, 0xCC19, + 0xA99A, 0xCC1A, 0xA99B, 0xCC1B, 0xA99C, 0xCC1E, 0xA99D, 0xCC1F, + 0xA99E, 0xCC20, 0xA99F, 0xCC23, 0xA9A0, 0xCC24, 0xA9A1, 0x00E6, + 0xA9A2, 0x0111, 0xA9A3, 0x00F0, 0xA9A4, 0x0127, 0xA9A5, 0x0131, + 0xA9A6, 0x0133, 0xA9A7, 0x0138, 0xA9A8, 0x0140, 0xA9A9, 0x0142, + 0xA9AA, 0x00F8, 0xA9AB, 0x0153, 0xA9AC, 0x00DF, 0xA9AD, 0x00FE, + 0xA9AE, 0x0167, 0xA9AF, 0x014B, 0xA9B0, 0x0149, 0xA9B1, 0x3200, + 0xA9B2, 0x3201, 0xA9B3, 0x3202, 0xA9B4, 0x3203, 0xA9B5, 0x3204, + 0xA9B6, 0x3205, 0xA9B7, 0x3206, 0xA9B8, 0x3207, 0xA9B9, 0x3208, + 0xA9BA, 0x3209, 0xA9BB, 0x320A, 0xA9BC, 0x320B, 0xA9BD, 0x320C, + 0xA9BE, 0x320D, 0xA9BF, 0x320E, 0xA9C0, 0x320F, 0xA9C1, 0x3210, + 0xA9C2, 0x3211, 0xA9C3, 0x3212, 0xA9C4, 0x3213, 0xA9C5, 0x3214, + 0xA9C6, 0x3215, 0xA9C7, 0x3216, 0xA9C8, 0x3217, 0xA9C9, 0x3218, + 0xA9CA, 0x3219, 0xA9CB, 0x321A, 0xA9CC, 0x321B, 0xA9CD, 0x249C, + 0xA9CE, 0x249D, 0xA9CF, 0x249E, 0xA9D0, 0x249F, 0xA9D1, 0x24A0, + 0xA9D2, 0x24A1, 0xA9D3, 0x24A2, 0xA9D4, 0x24A3, 0xA9D5, 0x24A4, + 0xA9D6, 0x24A5, 0xA9D7, 0x24A6, 0xA9D8, 0x24A7, 0xA9D9, 0x24A8, + 0xA9DA, 0x24A9, 0xA9DB, 0x24AA, 0xA9DC, 0x24AB, 0xA9DD, 0x24AC, + 0xA9DE, 0x24AD, 0xA9DF, 0x24AE, 0xA9E0, 0x24AF, 0xA9E1, 0x24B0, + 0xA9E2, 0x24B1, 0xA9E3, 0x24B2, 0xA9E4, 0x24B3, 0xA9E5, 0x24B4, + 0xA9E6, 0x24B5, 0xA9E7, 0x2474, 0xA9E8, 0x2475, 0xA9E9, 0x2476, + 0xA9EA, 0x2477, 0xA9EB, 0x2478, 0xA9EC, 0x2479, 0xA9ED, 0x247A, + 0xA9EE, 0x247B, 0xA9EF, 0x247C, 0xA9F0, 0x247D, 0xA9F1, 0x247E, + 0xA9F2, 0x247F, 0xA9F3, 0x2480, 0xA9F4, 0x2481, 0xA9F5, 0x2482, + 0xA9F6, 0x00B9, 0xA9F7, 0x00B2, 0xA9F8, 0x00B3, 0xA9F9, 0x2074, + 0xA9FA, 0x207F, 0xA9FB, 0x2081, 0xA9FC, 0x2082, 0xA9FD, 0x2083, + 0xA9FE, 0x2084, 0xAA41, 0xCC25, 0xAA42, 0xCC26, 0xAA43, 0xCC2A, + 0xAA44, 0xCC2B, 0xAA45, 0xCC2D, 0xAA46, 0xCC2F, 0xAA47, 0xCC31, + 0xAA48, 0xCC32, 0xAA49, 0xCC33, 0xAA4A, 0xCC34, 0xAA4B, 0xCC35, + 0xAA4C, 0xCC36, 0xAA4D, 0xCC37, 0xAA4E, 0xCC3A, 0xAA4F, 0xCC3F, + 0xAA50, 0xCC40, 0xAA51, 0xCC41, 0xAA52, 0xCC42, 0xAA53, 0xCC43, + 0xAA54, 0xCC46, 0xAA55, 0xCC47, 0xAA56, 0xCC49, 0xAA57, 0xCC4A, + 0xAA58, 0xCC4B, 0xAA59, 0xCC4D, 0xAA5A, 0xCC4E, 0xAA61, 0xCC4F, + 0xAA62, 0xCC50, 0xAA63, 0xCC51, 0xAA64, 0xCC52, 0xAA65, 0xCC53, + 0xAA66, 0xCC56, 0xAA67, 0xCC5A, 0xAA68, 0xCC5B, 0xAA69, 0xCC5C, + 0xAA6A, 0xCC5D, 0xAA6B, 0xCC5E, 0xAA6C, 0xCC5F, 0xAA6D, 0xCC61, + 0xAA6E, 0xCC62, 0xAA6F, 0xCC63, 0xAA70, 0xCC65, 0xAA71, 0xCC67, + 0xAA72, 0xCC69, 0xAA73, 0xCC6A, 0xAA74, 0xCC6B, 0xAA75, 0xCC6C, + 0xAA76, 0xCC6D, 0xAA77, 0xCC6E, 0xAA78, 0xCC6F, 0xAA79, 0xCC71, + 0xAA7A, 0xCC72, 0xAA81, 0xCC73, 0xAA82, 0xCC74, 0xAA83, 0xCC76, + 0xAA84, 0xCC77, 0xAA85, 0xCC78, 0xAA86, 0xCC79, 0xAA87, 0xCC7A, + 0xAA88, 0xCC7B, 0xAA89, 0xCC7C, 0xAA8A, 0xCC7D, 0xAA8B, 0xCC7E, + 0xAA8C, 0xCC7F, 0xAA8D, 0xCC80, 0xAA8E, 0xCC81, 0xAA8F, 0xCC82, + 0xAA90, 0xCC83, 0xAA91, 0xCC84, 0xAA92, 0xCC85, 0xAA93, 0xCC86, + 0xAA94, 0xCC87, 0xAA95, 0xCC88, 0xAA96, 0xCC89, 0xAA97, 0xCC8A, + 0xAA98, 0xCC8B, 0xAA99, 0xCC8C, 0xAA9A, 0xCC8D, 0xAA9B, 0xCC8E, + 0xAA9C, 0xCC8F, 0xAA9D, 0xCC90, 0xAA9E, 0xCC91, 0xAA9F, 0xCC92, + 0xAAA0, 0xCC93, 0xAAA1, 0x3041, 0xAAA2, 0x3042, 0xAAA3, 0x3043, + 0xAAA4, 0x3044, 0xAAA5, 0x3045, 0xAAA6, 0x3046, 0xAAA7, 0x3047, + 0xAAA8, 0x3048, 0xAAA9, 0x3049, 0xAAAA, 0x304A, 0xAAAB, 0x304B, + 0xAAAC, 0x304C, 0xAAAD, 0x304D, 0xAAAE, 0x304E, 0xAAAF, 0x304F, + 0xAAB0, 0x3050, 0xAAB1, 0x3051, 0xAAB2, 0x3052, 0xAAB3, 0x3053, + 0xAAB4, 0x3054, 0xAAB5, 0x3055, 0xAAB6, 0x3056, 0xAAB7, 0x3057, + 0xAAB8, 0x3058, 0xAAB9, 0x3059, 0xAABA, 0x305A, 0xAABB, 0x305B, + 0xAABC, 0x305C, 0xAABD, 0x305D, 0xAABE, 0x305E, 0xAABF, 0x305F, + 0xAAC0, 0x3060, 0xAAC1, 0x3061, 0xAAC2, 0x3062, 0xAAC3, 0x3063, + 0xAAC4, 0x3064, 0xAAC5, 0x3065, 0xAAC6, 0x3066, 0xAAC7, 0x3067, + 0xAAC8, 0x3068, 0xAAC9, 0x3069, 0xAACA, 0x306A, 0xAACB, 0x306B, + 0xAACC, 0x306C, 0xAACD, 0x306D, 0xAACE, 0x306E, 0xAACF, 0x306F, + 0xAAD0, 0x3070, 0xAAD1, 0x3071, 0xAAD2, 0x3072, 0xAAD3, 0x3073, + 0xAAD4, 0x3074, 0xAAD5, 0x3075, 0xAAD6, 0x3076, 0xAAD7, 0x3077, + 0xAAD8, 0x3078, 0xAAD9, 0x3079, 0xAADA, 0x307A, 0xAADB, 0x307B, + 0xAADC, 0x307C, 0xAADD, 0x307D, 0xAADE, 0x307E, 0xAADF, 0x307F, + 0xAAE0, 0x3080, 0xAAE1, 0x3081, 0xAAE2, 0x3082, 0xAAE3, 0x3083, + 0xAAE4, 0x3084, 0xAAE5, 0x3085, 0xAAE6, 0x3086, 0xAAE7, 0x3087, + 0xAAE8, 0x3088, 0xAAE9, 0x3089, 0xAAEA, 0x308A, 0xAAEB, 0x308B, + 0xAAEC, 0x308C, 0xAAED, 0x308D, 0xAAEE, 0x308E, 0xAAEF, 0x308F, + 0xAAF0, 0x3090, 0xAAF1, 0x3091, 0xAAF2, 0x3092, 0xAAF3, 0x3093, + 0xAB41, 0xCC94, 0xAB42, 0xCC95, 0xAB43, 0xCC96, 0xAB44, 0xCC97, + 0xAB45, 0xCC9A, 0xAB46, 0xCC9B, 0xAB47, 0xCC9D, 0xAB48, 0xCC9E, + 0xAB49, 0xCC9F, 0xAB4A, 0xCCA1, 0xAB4B, 0xCCA2, 0xAB4C, 0xCCA3, + 0xAB4D, 0xCCA4, 0xAB4E, 0xCCA5, 0xAB4F, 0xCCA6, 0xAB50, 0xCCA7, + 0xAB51, 0xCCAA, 0xAB52, 0xCCAE, 0xAB53, 0xCCAF, 0xAB54, 0xCCB0, + 0xAB55, 0xCCB1, 0xAB56, 0xCCB2, 0xAB57, 0xCCB3, 0xAB58, 0xCCB6, + 0xAB59, 0xCCB7, 0xAB5A, 0xCCB9, 0xAB61, 0xCCBA, 0xAB62, 0xCCBB, + 0xAB63, 0xCCBD, 0xAB64, 0xCCBE, 0xAB65, 0xCCBF, 0xAB66, 0xCCC0, + 0xAB67, 0xCCC1, 0xAB68, 0xCCC2, 0xAB69, 0xCCC3, 0xAB6A, 0xCCC6, + 0xAB6B, 0xCCC8, 0xAB6C, 0xCCCA, 0xAB6D, 0xCCCB, 0xAB6E, 0xCCCC, + 0xAB6F, 0xCCCD, 0xAB70, 0xCCCE, 0xAB71, 0xCCCF, 0xAB72, 0xCCD1, + 0xAB73, 0xCCD2, 0xAB74, 0xCCD3, 0xAB75, 0xCCD5, 0xAB76, 0xCCD6, + 0xAB77, 0xCCD7, 0xAB78, 0xCCD8, 0xAB79, 0xCCD9, 0xAB7A, 0xCCDA, + 0xAB81, 0xCCDB, 0xAB82, 0xCCDC, 0xAB83, 0xCCDD, 0xAB84, 0xCCDE, + 0xAB85, 0xCCDF, 0xAB86, 0xCCE0, 0xAB87, 0xCCE1, 0xAB88, 0xCCE2, + 0xAB89, 0xCCE3, 0xAB8A, 0xCCE5, 0xAB8B, 0xCCE6, 0xAB8C, 0xCCE7, + 0xAB8D, 0xCCE8, 0xAB8E, 0xCCE9, 0xAB8F, 0xCCEA, 0xAB90, 0xCCEB, + 0xAB91, 0xCCED, 0xAB92, 0xCCEE, 0xAB93, 0xCCEF, 0xAB94, 0xCCF1, + 0xAB95, 0xCCF2, 0xAB96, 0xCCF3, 0xAB97, 0xCCF4, 0xAB98, 0xCCF5, + 0xAB99, 0xCCF6, 0xAB9A, 0xCCF7, 0xAB9B, 0xCCF8, 0xAB9C, 0xCCF9, + 0xAB9D, 0xCCFA, 0xAB9E, 0xCCFB, 0xAB9F, 0xCCFC, 0xABA0, 0xCCFD, + 0xABA1, 0x30A1, 0xABA2, 0x30A2, 0xABA3, 0x30A3, 0xABA4, 0x30A4, + 0xABA5, 0x30A5, 0xABA6, 0x30A6, 0xABA7, 0x30A7, 0xABA8, 0x30A8, + 0xABA9, 0x30A9, 0xABAA, 0x30AA, 0xABAB, 0x30AB, 0xABAC, 0x30AC, + 0xABAD, 0x30AD, 0xABAE, 0x30AE, 0xABAF, 0x30AF, 0xABB0, 0x30B0, + 0xABB1, 0x30B1, 0xABB2, 0x30B2, 0xABB3, 0x30B3, 0xABB4, 0x30B4, + 0xABB5, 0x30B5, 0xABB6, 0x30B6, 0xABB7, 0x30B7, 0xABB8, 0x30B8, + 0xABB9, 0x30B9, 0xABBA, 0x30BA, 0xABBB, 0x30BB, 0xABBC, 0x30BC, + 0xABBD, 0x30BD, 0xABBE, 0x30BE, 0xABBF, 0x30BF, 0xABC0, 0x30C0, + 0xABC1, 0x30C1, 0xABC2, 0x30C2, 0xABC3, 0x30C3, 0xABC4, 0x30C4, + 0xABC5, 0x30C5, 0xABC6, 0x30C6, 0xABC7, 0x30C7, 0xABC8, 0x30C8, + 0xABC9, 0x30C9, 0xABCA, 0x30CA, 0xABCB, 0x30CB, 0xABCC, 0x30CC, + 0xABCD, 0x30CD, 0xABCE, 0x30CE, 0xABCF, 0x30CF, 0xABD0, 0x30D0, + 0xABD1, 0x30D1, 0xABD2, 0x30D2, 0xABD3, 0x30D3, 0xABD4, 0x30D4, + 0xABD5, 0x30D5, 0xABD6, 0x30D6, 0xABD7, 0x30D7, 0xABD8, 0x30D8, + 0xABD9, 0x30D9, 0xABDA, 0x30DA, 0xABDB, 0x30DB, 0xABDC, 0x30DC, + 0xABDD, 0x30DD, 0xABDE, 0x30DE, 0xABDF, 0x30DF, 0xABE0, 0x30E0, + 0xABE1, 0x30E1, 0xABE2, 0x30E2, 0xABE3, 0x30E3, 0xABE4, 0x30E4, + 0xABE5, 0x30E5, 0xABE6, 0x30E6, 0xABE7, 0x30E7, 0xABE8, 0x30E8, + 0xABE9, 0x30E9, 0xABEA, 0x30EA, 0xABEB, 0x30EB, 0xABEC, 0x30EC, + 0xABED, 0x30ED, 0xABEE, 0x30EE, 0xABEF, 0x30EF, 0xABF0, 0x30F0, + 0xABF1, 0x30F1, 0xABF2, 0x30F2, 0xABF3, 0x30F3, 0xABF4, 0x30F4, + 0xABF5, 0x30F5, 0xABF6, 0x30F6, 0xAC41, 0xCCFE, 0xAC42, 0xCCFF, + 0xAC43, 0xCD00, 0xAC44, 0xCD02, 0xAC45, 0xCD03, 0xAC46, 0xCD04, + 0xAC47, 0xCD05, 0xAC48, 0xCD06, 0xAC49, 0xCD07, 0xAC4A, 0xCD0A, + 0xAC4B, 0xCD0B, 0xAC4C, 0xCD0D, 0xAC4D, 0xCD0E, 0xAC4E, 0xCD0F, + 0xAC4F, 0xCD11, 0xAC50, 0xCD12, 0xAC51, 0xCD13, 0xAC52, 0xCD14, + 0xAC53, 0xCD15, 0xAC54, 0xCD16, 0xAC55, 0xCD17, 0xAC56, 0xCD1A, + 0xAC57, 0xCD1C, 0xAC58, 0xCD1E, 0xAC59, 0xCD1F, 0xAC5A, 0xCD20, + 0xAC61, 0xCD21, 0xAC62, 0xCD22, 0xAC63, 0xCD23, 0xAC64, 0xCD25, + 0xAC65, 0xCD26, 0xAC66, 0xCD27, 0xAC67, 0xCD29, 0xAC68, 0xCD2A, + 0xAC69, 0xCD2B, 0xAC6A, 0xCD2D, 0xAC6B, 0xCD2E, 0xAC6C, 0xCD2F, + 0xAC6D, 0xCD30, 0xAC6E, 0xCD31, 0xAC6F, 0xCD32, 0xAC70, 0xCD33, + 0xAC71, 0xCD34, 0xAC72, 0xCD35, 0xAC73, 0xCD36, 0xAC74, 0xCD37, + 0xAC75, 0xCD38, 0xAC76, 0xCD3A, 0xAC77, 0xCD3B, 0xAC78, 0xCD3C, + 0xAC79, 0xCD3D, 0xAC7A, 0xCD3E, 0xAC81, 0xCD3F, 0xAC82, 0xCD40, + 0xAC83, 0xCD41, 0xAC84, 0xCD42, 0xAC85, 0xCD43, 0xAC86, 0xCD44, + 0xAC87, 0xCD45, 0xAC88, 0xCD46, 0xAC89, 0xCD47, 0xAC8A, 0xCD48, + 0xAC8B, 0xCD49, 0xAC8C, 0xCD4A, 0xAC8D, 0xCD4B, 0xAC8E, 0xCD4C, + 0xAC8F, 0xCD4D, 0xAC90, 0xCD4E, 0xAC91, 0xCD4F, 0xAC92, 0xCD50, + 0xAC93, 0xCD51, 0xAC94, 0xCD52, 0xAC95, 0xCD53, 0xAC96, 0xCD54, + 0xAC97, 0xCD55, 0xAC98, 0xCD56, 0xAC99, 0xCD57, 0xAC9A, 0xCD58, + 0xAC9B, 0xCD59, 0xAC9C, 0xCD5A, 0xAC9D, 0xCD5B, 0xAC9E, 0xCD5D, + 0xAC9F, 0xCD5E, 0xACA0, 0xCD5F, 0xACA1, 0x0410, 0xACA2, 0x0411, + 0xACA3, 0x0412, 0xACA4, 0x0413, 0xACA5, 0x0414, 0xACA6, 0x0415, + 0xACA7, 0x0401, 0xACA8, 0x0416, 0xACA9, 0x0417, 0xACAA, 0x0418, + 0xACAB, 0x0419, 0xACAC, 0x041A, 0xACAD, 0x041B, 0xACAE, 0x041C, + 0xACAF, 0x041D, 0xACB0, 0x041E, 0xACB1, 0x041F, 0xACB2, 0x0420, + 0xACB3, 0x0421, 0xACB4, 0x0422, 0xACB5, 0x0423, 0xACB6, 0x0424, + 0xACB7, 0x0425, 0xACB8, 0x0426, 0xACB9, 0x0427, 0xACBA, 0x0428, + 0xACBB, 0x0429, 0xACBC, 0x042A, 0xACBD, 0x042B, 0xACBE, 0x042C, + 0xACBF, 0x042D, 0xACC0, 0x042E, 0xACC1, 0x042F, 0xACD1, 0x0430, + 0xACD2, 0x0431, 0xACD3, 0x0432, 0xACD4, 0x0433, 0xACD5, 0x0434, + 0xACD6, 0x0435, 0xACD7, 0x0451, 0xACD8, 0x0436, 0xACD9, 0x0437, + 0xACDA, 0x0438, 0xACDB, 0x0439, 0xACDC, 0x043A, 0xACDD, 0x043B, + 0xACDE, 0x043C, 0xACDF, 0x043D, 0xACE0, 0x043E, 0xACE1, 0x043F, + 0xACE2, 0x0440, 0xACE3, 0x0441, 0xACE4, 0x0442, 0xACE5, 0x0443, + 0xACE6, 0x0444, 0xACE7, 0x0445, 0xACE8, 0x0446, 0xACE9, 0x0447, + 0xACEA, 0x0448, 0xACEB, 0x0449, 0xACEC, 0x044A, 0xACED, 0x044B, + 0xACEE, 0x044C, 0xACEF, 0x044D, 0xACF0, 0x044E, 0xACF1, 0x044F, + 0xAD41, 0xCD61, 0xAD42, 0xCD62, 0xAD43, 0xCD63, 0xAD44, 0xCD65, + 0xAD45, 0xCD66, 0xAD46, 0xCD67, 0xAD47, 0xCD68, 0xAD48, 0xCD69, + 0xAD49, 0xCD6A, 0xAD4A, 0xCD6B, 0xAD4B, 0xCD6E, 0xAD4C, 0xCD70, + 0xAD4D, 0xCD72, 0xAD4E, 0xCD73, 0xAD4F, 0xCD74, 0xAD50, 0xCD75, + 0xAD51, 0xCD76, 0xAD52, 0xCD77, 0xAD53, 0xCD79, 0xAD54, 0xCD7A, + 0xAD55, 0xCD7B, 0xAD56, 0xCD7C, 0xAD57, 0xCD7D, 0xAD58, 0xCD7E, + 0xAD59, 0xCD7F, 0xAD5A, 0xCD80, 0xAD61, 0xCD81, 0xAD62, 0xCD82, + 0xAD63, 0xCD83, 0xAD64, 0xCD84, 0xAD65, 0xCD85, 0xAD66, 0xCD86, + 0xAD67, 0xCD87, 0xAD68, 0xCD89, 0xAD69, 0xCD8A, 0xAD6A, 0xCD8B, + 0xAD6B, 0xCD8C, 0xAD6C, 0xCD8D, 0xAD6D, 0xCD8E, 0xAD6E, 0xCD8F, + 0xAD6F, 0xCD90, 0xAD70, 0xCD91, 0xAD71, 0xCD92, 0xAD72, 0xCD93, + 0xAD73, 0xCD96, 0xAD74, 0xCD97, 0xAD75, 0xCD99, 0xAD76, 0xCD9A, + 0xAD77, 0xCD9B, 0xAD78, 0xCD9D, 0xAD79, 0xCD9E, 0xAD7A, 0xCD9F, + 0xAD81, 0xCDA0, 0xAD82, 0xCDA1, 0xAD83, 0xCDA2, 0xAD84, 0xCDA3, + 0xAD85, 0xCDA6, 0xAD86, 0xCDA8, 0xAD87, 0xCDAA, 0xAD88, 0xCDAB, + 0xAD89, 0xCDAC, 0xAD8A, 0xCDAD, 0xAD8B, 0xCDAE, 0xAD8C, 0xCDAF, + 0xAD8D, 0xCDB1, 0xAD8E, 0xCDB2, 0xAD8F, 0xCDB3, 0xAD90, 0xCDB4, + 0xAD91, 0xCDB5, 0xAD92, 0xCDB6, 0xAD93, 0xCDB7, 0xAD94, 0xCDB8, + 0xAD95, 0xCDB9, 0xAD96, 0xCDBA, 0xAD97, 0xCDBB, 0xAD98, 0xCDBC, + 0xAD99, 0xCDBD, 0xAD9A, 0xCDBE, 0xAD9B, 0xCDBF, 0xAD9C, 0xCDC0, + 0xAD9D, 0xCDC1, 0xAD9E, 0xCDC2, 0xAD9F, 0xCDC3, 0xADA0, 0xCDC5, + 0xAE41, 0xCDC6, 0xAE42, 0xCDC7, 0xAE43, 0xCDC8, 0xAE44, 0xCDC9, + 0xAE45, 0xCDCA, 0xAE46, 0xCDCB, 0xAE47, 0xCDCD, 0xAE48, 0xCDCE, + 0xAE49, 0xCDCF, 0xAE4A, 0xCDD1, 0xAE4B, 0xCDD2, 0xAE4C, 0xCDD3, + 0xAE4D, 0xCDD4, 0xAE4E, 0xCDD5, 0xAE4F, 0xCDD6, 0xAE50, 0xCDD7, + 0xAE51, 0xCDD8, 0xAE52, 0xCDD9, 0xAE53, 0xCDDA, 0xAE54, 0xCDDB, + 0xAE55, 0xCDDC, 0xAE56, 0xCDDD, 0xAE57, 0xCDDE, 0xAE58, 0xCDDF, + 0xAE59, 0xCDE0, 0xAE5A, 0xCDE1, 0xAE61, 0xCDE2, 0xAE62, 0xCDE3, + 0xAE63, 0xCDE4, 0xAE64, 0xCDE5, 0xAE65, 0xCDE6, 0xAE66, 0xCDE7, + 0xAE67, 0xCDE9, 0xAE68, 0xCDEA, 0xAE69, 0xCDEB, 0xAE6A, 0xCDED, + 0xAE6B, 0xCDEE, 0xAE6C, 0xCDEF, 0xAE6D, 0xCDF1, 0xAE6E, 0xCDF2, + 0xAE6F, 0xCDF3, 0xAE70, 0xCDF4, 0xAE71, 0xCDF5, 0xAE72, 0xCDF6, + 0xAE73, 0xCDF7, 0xAE74, 0xCDFA, 0xAE75, 0xCDFC, 0xAE76, 0xCDFE, + 0xAE77, 0xCDFF, 0xAE78, 0xCE00, 0xAE79, 0xCE01, 0xAE7A, 0xCE02, + 0xAE81, 0xCE03, 0xAE82, 0xCE05, 0xAE83, 0xCE06, 0xAE84, 0xCE07, + 0xAE85, 0xCE09, 0xAE86, 0xCE0A, 0xAE87, 0xCE0B, 0xAE88, 0xCE0D, + 0xAE89, 0xCE0E, 0xAE8A, 0xCE0F, 0xAE8B, 0xCE10, 0xAE8C, 0xCE11, + 0xAE8D, 0xCE12, 0xAE8E, 0xCE13, 0xAE8F, 0xCE15, 0xAE90, 0xCE16, + 0xAE91, 0xCE17, 0xAE92, 0xCE18, 0xAE93, 0xCE1A, 0xAE94, 0xCE1B, + 0xAE95, 0xCE1C, 0xAE96, 0xCE1D, 0xAE97, 0xCE1E, 0xAE98, 0xCE1F, + 0xAE99, 0xCE22, 0xAE9A, 0xCE23, 0xAE9B, 0xCE25, 0xAE9C, 0xCE26, + 0xAE9D, 0xCE27, 0xAE9E, 0xCE29, 0xAE9F, 0xCE2A, 0xAEA0, 0xCE2B, + 0xAF41, 0xCE2C, 0xAF42, 0xCE2D, 0xAF43, 0xCE2E, 0xAF44, 0xCE2F, + 0xAF45, 0xCE32, 0xAF46, 0xCE34, 0xAF47, 0xCE36, 0xAF48, 0xCE37, + 0xAF49, 0xCE38, 0xAF4A, 0xCE39, 0xAF4B, 0xCE3A, 0xAF4C, 0xCE3B, + 0xAF4D, 0xCE3C, 0xAF4E, 0xCE3D, 0xAF4F, 0xCE3E, 0xAF50, 0xCE3F, + 0xAF51, 0xCE40, 0xAF52, 0xCE41, 0xAF53, 0xCE42, 0xAF54, 0xCE43, + 0xAF55, 0xCE44, 0xAF56, 0xCE45, 0xAF57, 0xCE46, 0xAF58, 0xCE47, + 0xAF59, 0xCE48, 0xAF5A, 0xCE49, 0xAF61, 0xCE4A, 0xAF62, 0xCE4B, + 0xAF63, 0xCE4C, 0xAF64, 0xCE4D, 0xAF65, 0xCE4E, 0xAF66, 0xCE4F, + 0xAF67, 0xCE50, 0xAF68, 0xCE51, 0xAF69, 0xCE52, 0xAF6A, 0xCE53, + 0xAF6B, 0xCE54, 0xAF6C, 0xCE55, 0xAF6D, 0xCE56, 0xAF6E, 0xCE57, + 0xAF6F, 0xCE5A, 0xAF70, 0xCE5B, 0xAF71, 0xCE5D, 0xAF72, 0xCE5E, + 0xAF73, 0xCE62, 0xAF74, 0xCE63, 0xAF75, 0xCE64, 0xAF76, 0xCE65, + 0xAF77, 0xCE66, 0xAF78, 0xCE67, 0xAF79, 0xCE6A, 0xAF7A, 0xCE6C, + 0xAF81, 0xCE6E, 0xAF82, 0xCE6F, 0xAF83, 0xCE70, 0xAF84, 0xCE71, + 0xAF85, 0xCE72, 0xAF86, 0xCE73, 0xAF87, 0xCE76, 0xAF88, 0xCE77, + 0xAF89, 0xCE79, 0xAF8A, 0xCE7A, 0xAF8B, 0xCE7B, 0xAF8C, 0xCE7D, + 0xAF8D, 0xCE7E, 0xAF8E, 0xCE7F, 0xAF8F, 0xCE80, 0xAF90, 0xCE81, + 0xAF91, 0xCE82, 0xAF92, 0xCE83, 0xAF93, 0xCE86, 0xAF94, 0xCE88, + 0xAF95, 0xCE8A, 0xAF96, 0xCE8B, 0xAF97, 0xCE8C, 0xAF98, 0xCE8D, + 0xAF99, 0xCE8E, 0xAF9A, 0xCE8F, 0xAF9B, 0xCE92, 0xAF9C, 0xCE93, + 0xAF9D, 0xCE95, 0xAF9E, 0xCE96, 0xAF9F, 0xCE97, 0xAFA0, 0xCE99, + 0xB041, 0xCE9A, 0xB042, 0xCE9B, 0xB043, 0xCE9C, 0xB044, 0xCE9D, + 0xB045, 0xCE9E, 0xB046, 0xCE9F, 0xB047, 0xCEA2, 0xB048, 0xCEA6, + 0xB049, 0xCEA7, 0xB04A, 0xCEA8, 0xB04B, 0xCEA9, 0xB04C, 0xCEAA, + 0xB04D, 0xCEAB, 0xB04E, 0xCEAE, 0xB04F, 0xCEAF, 0xB050, 0xCEB0, + 0xB051, 0xCEB1, 0xB052, 0xCEB2, 0xB053, 0xCEB3, 0xB054, 0xCEB4, + 0xB055, 0xCEB5, 0xB056, 0xCEB6, 0xB057, 0xCEB7, 0xB058, 0xCEB8, + 0xB059, 0xCEB9, 0xB05A, 0xCEBA, 0xB061, 0xCEBB, 0xB062, 0xCEBC, + 0xB063, 0xCEBD, 0xB064, 0xCEBE, 0xB065, 0xCEBF, 0xB066, 0xCEC0, + 0xB067, 0xCEC2, 0xB068, 0xCEC3, 0xB069, 0xCEC4, 0xB06A, 0xCEC5, + 0xB06B, 0xCEC6, 0xB06C, 0xCEC7, 0xB06D, 0xCEC8, 0xB06E, 0xCEC9, + 0xB06F, 0xCECA, 0xB070, 0xCECB, 0xB071, 0xCECC, 0xB072, 0xCECD, + 0xB073, 0xCECE, 0xB074, 0xCECF, 0xB075, 0xCED0, 0xB076, 0xCED1, + 0xB077, 0xCED2, 0xB078, 0xCED3, 0xB079, 0xCED4, 0xB07A, 0xCED5, + 0xB081, 0xCED6, 0xB082, 0xCED7, 0xB083, 0xCED8, 0xB084, 0xCED9, + 0xB085, 0xCEDA, 0xB086, 0xCEDB, 0xB087, 0xCEDC, 0xB088, 0xCEDD, + 0xB089, 0xCEDE, 0xB08A, 0xCEDF, 0xB08B, 0xCEE0, 0xB08C, 0xCEE1, + 0xB08D, 0xCEE2, 0xB08E, 0xCEE3, 0xB08F, 0xCEE6, 0xB090, 0xCEE7, + 0xB091, 0xCEE9, 0xB092, 0xCEEA, 0xB093, 0xCEED, 0xB094, 0xCEEE, + 0xB095, 0xCEEF, 0xB096, 0xCEF0, 0xB097, 0xCEF1, 0xB098, 0xCEF2, + 0xB099, 0xCEF3, 0xB09A, 0xCEF6, 0xB09B, 0xCEFA, 0xB09C, 0xCEFB, + 0xB09D, 0xCEFC, 0xB09E, 0xCEFD, 0xB09F, 0xCEFE, 0xB0A0, 0xCEFF, + 0xB0A1, 0xAC00, 0xB0A2, 0xAC01, 0xB0A3, 0xAC04, 0xB0A4, 0xAC07, + 0xB0A5, 0xAC08, 0xB0A6, 0xAC09, 0xB0A7, 0xAC0A, 0xB0A8, 0xAC10, + 0xB0A9, 0xAC11, 0xB0AA, 0xAC12, 0xB0AB, 0xAC13, 0xB0AC, 0xAC14, + 0xB0AD, 0xAC15, 0xB0AE, 0xAC16, 0xB0AF, 0xAC17, 0xB0B0, 0xAC19, + 0xB0B1, 0xAC1A, 0xB0B2, 0xAC1B, 0xB0B3, 0xAC1C, 0xB0B4, 0xAC1D, + 0xB0B5, 0xAC20, 0xB0B6, 0xAC24, 0xB0B7, 0xAC2C, 0xB0B8, 0xAC2D, + 0xB0B9, 0xAC2F, 0xB0BA, 0xAC30, 0xB0BB, 0xAC31, 0xB0BC, 0xAC38, + 0xB0BD, 0xAC39, 0xB0BE, 0xAC3C, 0xB0BF, 0xAC40, 0xB0C0, 0xAC4B, + 0xB0C1, 0xAC4D, 0xB0C2, 0xAC54, 0xB0C3, 0xAC58, 0xB0C4, 0xAC5C, + 0xB0C5, 0xAC70, 0xB0C6, 0xAC71, 0xB0C7, 0xAC74, 0xB0C8, 0xAC77, + 0xB0C9, 0xAC78, 0xB0CA, 0xAC7A, 0xB0CB, 0xAC80, 0xB0CC, 0xAC81, + 0xB0CD, 0xAC83, 0xB0CE, 0xAC84, 0xB0CF, 0xAC85, 0xB0D0, 0xAC86, + 0xB0D1, 0xAC89, 0xB0D2, 0xAC8A, 0xB0D3, 0xAC8B, 0xB0D4, 0xAC8C, + 0xB0D5, 0xAC90, 0xB0D6, 0xAC94, 0xB0D7, 0xAC9C, 0xB0D8, 0xAC9D, + 0xB0D9, 0xAC9F, 0xB0DA, 0xACA0, 0xB0DB, 0xACA1, 0xB0DC, 0xACA8, + 0xB0DD, 0xACA9, 0xB0DE, 0xACAA, 0xB0DF, 0xACAC, 0xB0E0, 0xACAF, + 0xB0E1, 0xACB0, 0xB0E2, 0xACB8, 0xB0E3, 0xACB9, 0xB0E4, 0xACBB, + 0xB0E5, 0xACBC, 0xB0E6, 0xACBD, 0xB0E7, 0xACC1, 0xB0E8, 0xACC4, + 0xB0E9, 0xACC8, 0xB0EA, 0xACCC, 0xB0EB, 0xACD5, 0xB0EC, 0xACD7, + 0xB0ED, 0xACE0, 0xB0EE, 0xACE1, 0xB0EF, 0xACE4, 0xB0F0, 0xACE7, + 0xB0F1, 0xACE8, 0xB0F2, 0xACEA, 0xB0F3, 0xACEC, 0xB0F4, 0xACEF, + 0xB0F5, 0xACF0, 0xB0F6, 0xACF1, 0xB0F7, 0xACF3, 0xB0F8, 0xACF5, + 0xB0F9, 0xACF6, 0xB0FA, 0xACFC, 0xB0FB, 0xACFD, 0xB0FC, 0xAD00, + 0xB0FD, 0xAD04, 0xB0FE, 0xAD06, 0xB141, 0xCF02, 0xB142, 0xCF03, + 0xB143, 0xCF05, 0xB144, 0xCF06, 0xB145, 0xCF07, 0xB146, 0xCF09, + 0xB147, 0xCF0A, 0xB148, 0xCF0B, 0xB149, 0xCF0C, 0xB14A, 0xCF0D, + 0xB14B, 0xCF0E, 0xB14C, 0xCF0F, 0xB14D, 0xCF12, 0xB14E, 0xCF14, + 0xB14F, 0xCF16, 0xB150, 0xCF17, 0xB151, 0xCF18, 0xB152, 0xCF19, + 0xB153, 0xCF1A, 0xB154, 0xCF1B, 0xB155, 0xCF1D, 0xB156, 0xCF1E, + 0xB157, 0xCF1F, 0xB158, 0xCF21, 0xB159, 0xCF22, 0xB15A, 0xCF23, + 0xB161, 0xCF25, 0xB162, 0xCF26, 0xB163, 0xCF27, 0xB164, 0xCF28, + 0xB165, 0xCF29, 0xB166, 0xCF2A, 0xB167, 0xCF2B, 0xB168, 0xCF2E, + 0xB169, 0xCF32, 0xB16A, 0xCF33, 0xB16B, 0xCF34, 0xB16C, 0xCF35, + 0xB16D, 0xCF36, 0xB16E, 0xCF37, 0xB16F, 0xCF39, 0xB170, 0xCF3A, + 0xB171, 0xCF3B, 0xB172, 0xCF3C, 0xB173, 0xCF3D, 0xB174, 0xCF3E, + 0xB175, 0xCF3F, 0xB176, 0xCF40, 0xB177, 0xCF41, 0xB178, 0xCF42, + 0xB179, 0xCF43, 0xB17A, 0xCF44, 0xB181, 0xCF45, 0xB182, 0xCF46, + 0xB183, 0xCF47, 0xB184, 0xCF48, 0xB185, 0xCF49, 0xB186, 0xCF4A, + 0xB187, 0xCF4B, 0xB188, 0xCF4C, 0xB189, 0xCF4D, 0xB18A, 0xCF4E, + 0xB18B, 0xCF4F, 0xB18C, 0xCF50, 0xB18D, 0xCF51, 0xB18E, 0xCF52, + 0xB18F, 0xCF53, 0xB190, 0xCF56, 0xB191, 0xCF57, 0xB192, 0xCF59, + 0xB193, 0xCF5A, 0xB194, 0xCF5B, 0xB195, 0xCF5D, 0xB196, 0xCF5E, + 0xB197, 0xCF5F, 0xB198, 0xCF60, 0xB199, 0xCF61, 0xB19A, 0xCF62, + 0xB19B, 0xCF63, 0xB19C, 0xCF66, 0xB19D, 0xCF68, 0xB19E, 0xCF6A, + 0xB19F, 0xCF6B, 0xB1A0, 0xCF6C, 0xB1A1, 0xAD0C, 0xB1A2, 0xAD0D, + 0xB1A3, 0xAD0F, 0xB1A4, 0xAD11, 0xB1A5, 0xAD18, 0xB1A6, 0xAD1C, + 0xB1A7, 0xAD20, 0xB1A8, 0xAD29, 0xB1A9, 0xAD2C, 0xB1AA, 0xAD2D, + 0xB1AB, 0xAD34, 0xB1AC, 0xAD35, 0xB1AD, 0xAD38, 0xB1AE, 0xAD3C, + 0xB1AF, 0xAD44, 0xB1B0, 0xAD45, 0xB1B1, 0xAD47, 0xB1B2, 0xAD49, + 0xB1B3, 0xAD50, 0xB1B4, 0xAD54, 0xB1B5, 0xAD58, 0xB1B6, 0xAD61, + 0xB1B7, 0xAD63, 0xB1B8, 0xAD6C, 0xB1B9, 0xAD6D, 0xB1BA, 0xAD70, + 0xB1BB, 0xAD73, 0xB1BC, 0xAD74, 0xB1BD, 0xAD75, 0xB1BE, 0xAD76, + 0xB1BF, 0xAD7B, 0xB1C0, 0xAD7C, 0xB1C1, 0xAD7D, 0xB1C2, 0xAD7F, + 0xB1C3, 0xAD81, 0xB1C4, 0xAD82, 0xB1C5, 0xAD88, 0xB1C6, 0xAD89, + 0xB1C7, 0xAD8C, 0xB1C8, 0xAD90, 0xB1C9, 0xAD9C, 0xB1CA, 0xAD9D, + 0xB1CB, 0xADA4, 0xB1CC, 0xADB7, 0xB1CD, 0xADC0, 0xB1CE, 0xADC1, + 0xB1CF, 0xADC4, 0xB1D0, 0xADC8, 0xB1D1, 0xADD0, 0xB1D2, 0xADD1, + 0xB1D3, 0xADD3, 0xB1D4, 0xADDC, 0xB1D5, 0xADE0, 0xB1D6, 0xADE4, + 0xB1D7, 0xADF8, 0xB1D8, 0xADF9, 0xB1D9, 0xADFC, 0xB1DA, 0xADFF, + 0xB1DB, 0xAE00, 0xB1DC, 0xAE01, 0xB1DD, 0xAE08, 0xB1DE, 0xAE09, + 0xB1DF, 0xAE0B, 0xB1E0, 0xAE0D, 0xB1E1, 0xAE14, 0xB1E2, 0xAE30, + 0xB1E3, 0xAE31, 0xB1E4, 0xAE34, 0xB1E5, 0xAE37, 0xB1E6, 0xAE38, + 0xB1E7, 0xAE3A, 0xB1E8, 0xAE40, 0xB1E9, 0xAE41, 0xB1EA, 0xAE43, + 0xB1EB, 0xAE45, 0xB1EC, 0xAE46, 0xB1ED, 0xAE4A, 0xB1EE, 0xAE4C, + 0xB1EF, 0xAE4D, 0xB1F0, 0xAE4E, 0xB1F1, 0xAE50, 0xB1F2, 0xAE54, + 0xB1F3, 0xAE56, 0xB1F4, 0xAE5C, 0xB1F5, 0xAE5D, 0xB1F6, 0xAE5F, + 0xB1F7, 0xAE60, 0xB1F8, 0xAE61, 0xB1F9, 0xAE65, 0xB1FA, 0xAE68, + 0xB1FB, 0xAE69, 0xB1FC, 0xAE6C, 0xB1FD, 0xAE70, 0xB1FE, 0xAE78, + 0xB241, 0xCF6D, 0xB242, 0xCF6E, 0xB243, 0xCF6F, 0xB244, 0xCF72, + 0xB245, 0xCF73, 0xB246, 0xCF75, 0xB247, 0xCF76, 0xB248, 0xCF77, + 0xB249, 0xCF79, 0xB24A, 0xCF7A, 0xB24B, 0xCF7B, 0xB24C, 0xCF7C, + 0xB24D, 0xCF7D, 0xB24E, 0xCF7E, 0xB24F, 0xCF7F, 0xB250, 0xCF81, + 0xB251, 0xCF82, 0xB252, 0xCF83, 0xB253, 0xCF84, 0xB254, 0xCF86, + 0xB255, 0xCF87, 0xB256, 0xCF88, 0xB257, 0xCF89, 0xB258, 0xCF8A, + 0xB259, 0xCF8B, 0xB25A, 0xCF8D, 0xB261, 0xCF8E, 0xB262, 0xCF8F, + 0xB263, 0xCF90, 0xB264, 0xCF91, 0xB265, 0xCF92, 0xB266, 0xCF93, + 0xB267, 0xCF94, 0xB268, 0xCF95, 0xB269, 0xCF96, 0xB26A, 0xCF97, + 0xB26B, 0xCF98, 0xB26C, 0xCF99, 0xB26D, 0xCF9A, 0xB26E, 0xCF9B, + 0xB26F, 0xCF9C, 0xB270, 0xCF9D, 0xB271, 0xCF9E, 0xB272, 0xCF9F, + 0xB273, 0xCFA0, 0xB274, 0xCFA2, 0xB275, 0xCFA3, 0xB276, 0xCFA4, + 0xB277, 0xCFA5, 0xB278, 0xCFA6, 0xB279, 0xCFA7, 0xB27A, 0xCFA9, + 0xB281, 0xCFAA, 0xB282, 0xCFAB, 0xB283, 0xCFAC, 0xB284, 0xCFAD, + 0xB285, 0xCFAE, 0xB286, 0xCFAF, 0xB287, 0xCFB1, 0xB288, 0xCFB2, + 0xB289, 0xCFB3, 0xB28A, 0xCFB4, 0xB28B, 0xCFB5, 0xB28C, 0xCFB6, + 0xB28D, 0xCFB7, 0xB28E, 0xCFB8, 0xB28F, 0xCFB9, 0xB290, 0xCFBA, + 0xB291, 0xCFBB, 0xB292, 0xCFBC, 0xB293, 0xCFBD, 0xB294, 0xCFBE, + 0xB295, 0xCFBF, 0xB296, 0xCFC0, 0xB297, 0xCFC1, 0xB298, 0xCFC2, + 0xB299, 0xCFC3, 0xB29A, 0xCFC5, 0xB29B, 0xCFC6, 0xB29C, 0xCFC7, + 0xB29D, 0xCFC8, 0xB29E, 0xCFC9, 0xB29F, 0xCFCA, 0xB2A0, 0xCFCB, + 0xB2A1, 0xAE79, 0xB2A2, 0xAE7B, 0xB2A3, 0xAE7C, 0xB2A4, 0xAE7D, + 0xB2A5, 0xAE84, 0xB2A6, 0xAE85, 0xB2A7, 0xAE8C, 0xB2A8, 0xAEBC, + 0xB2A9, 0xAEBD, 0xB2AA, 0xAEBE, 0xB2AB, 0xAEC0, 0xB2AC, 0xAEC4, + 0xB2AD, 0xAECC, 0xB2AE, 0xAECD, 0xB2AF, 0xAECF, 0xB2B0, 0xAED0, + 0xB2B1, 0xAED1, 0xB2B2, 0xAED8, 0xB2B3, 0xAED9, 0xB2B4, 0xAEDC, + 0xB2B5, 0xAEE8, 0xB2B6, 0xAEEB, 0xB2B7, 0xAEED, 0xB2B8, 0xAEF4, + 0xB2B9, 0xAEF8, 0xB2BA, 0xAEFC, 0xB2BB, 0xAF07, 0xB2BC, 0xAF08, + 0xB2BD, 0xAF0D, 0xB2BE, 0xAF10, 0xB2BF, 0xAF2C, 0xB2C0, 0xAF2D, + 0xB2C1, 0xAF30, 0xB2C2, 0xAF32, 0xB2C3, 0xAF34, 0xB2C4, 0xAF3C, + 0xB2C5, 0xAF3D, 0xB2C6, 0xAF3F, 0xB2C7, 0xAF41, 0xB2C8, 0xAF42, + 0xB2C9, 0xAF43, 0xB2CA, 0xAF48, 0xB2CB, 0xAF49, 0xB2CC, 0xAF50, + 0xB2CD, 0xAF5C, 0xB2CE, 0xAF5D, 0xB2CF, 0xAF64, 0xB2D0, 0xAF65, + 0xB2D1, 0xAF79, 0xB2D2, 0xAF80, 0xB2D3, 0xAF84, 0xB2D4, 0xAF88, + 0xB2D5, 0xAF90, 0xB2D6, 0xAF91, 0xB2D7, 0xAF95, 0xB2D8, 0xAF9C, + 0xB2D9, 0xAFB8, 0xB2DA, 0xAFB9, 0xB2DB, 0xAFBC, 0xB2DC, 0xAFC0, + 0xB2DD, 0xAFC7, 0xB2DE, 0xAFC8, 0xB2DF, 0xAFC9, 0xB2E0, 0xAFCB, + 0xB2E1, 0xAFCD, 0xB2E2, 0xAFCE, 0xB2E3, 0xAFD4, 0xB2E4, 0xAFDC, + 0xB2E5, 0xAFE8, 0xB2E6, 0xAFE9, 0xB2E7, 0xAFF0, 0xB2E8, 0xAFF1, + 0xB2E9, 0xAFF4, 0xB2EA, 0xAFF8, 0xB2EB, 0xB000, 0xB2EC, 0xB001, + 0xB2ED, 0xB004, 0xB2EE, 0xB00C, 0xB2EF, 0xB010, 0xB2F0, 0xB014, + 0xB2F1, 0xB01C, 0xB2F2, 0xB01D, 0xB2F3, 0xB028, 0xB2F4, 0xB044, + 0xB2F5, 0xB045, 0xB2F6, 0xB048, 0xB2F7, 0xB04A, 0xB2F8, 0xB04C, + 0xB2F9, 0xB04E, 0xB2FA, 0xB053, 0xB2FB, 0xB054, 0xB2FC, 0xB055, + 0xB2FD, 0xB057, 0xB2FE, 0xB059, 0xB341, 0xCFCC, 0xB342, 0xCFCD, + 0xB343, 0xCFCE, 0xB344, 0xCFCF, 0xB345, 0xCFD0, 0xB346, 0xCFD1, + 0xB347, 0xCFD2, 0xB348, 0xCFD3, 0xB349, 0xCFD4, 0xB34A, 0xCFD5, + 0xB34B, 0xCFD6, 0xB34C, 0xCFD7, 0xB34D, 0xCFD8, 0xB34E, 0xCFD9, + 0xB34F, 0xCFDA, 0xB350, 0xCFDB, 0xB351, 0xCFDC, 0xB352, 0xCFDD, + 0xB353, 0xCFDE, 0xB354, 0xCFDF, 0xB355, 0xCFE2, 0xB356, 0xCFE3, + 0xB357, 0xCFE5, 0xB358, 0xCFE6, 0xB359, 0xCFE7, 0xB35A, 0xCFE9, + 0xB361, 0xCFEA, 0xB362, 0xCFEB, 0xB363, 0xCFEC, 0xB364, 0xCFED, + 0xB365, 0xCFEE, 0xB366, 0xCFEF, 0xB367, 0xCFF2, 0xB368, 0xCFF4, + 0xB369, 0xCFF6, 0xB36A, 0xCFF7, 0xB36B, 0xCFF8, 0xB36C, 0xCFF9, + 0xB36D, 0xCFFA, 0xB36E, 0xCFFB, 0xB36F, 0xCFFD, 0xB370, 0xCFFE, + 0xB371, 0xCFFF, 0xB372, 0xD001, 0xB373, 0xD002, 0xB374, 0xD003, + 0xB375, 0xD005, 0xB376, 0xD006, 0xB377, 0xD007, 0xB378, 0xD008, + 0xB379, 0xD009, 0xB37A, 0xD00A, 0xB381, 0xD00B, 0xB382, 0xD00C, + 0xB383, 0xD00D, 0xB384, 0xD00E, 0xB385, 0xD00F, 0xB386, 0xD010, + 0xB387, 0xD012, 0xB388, 0xD013, 0xB389, 0xD014, 0xB38A, 0xD015, + 0xB38B, 0xD016, 0xB38C, 0xD017, 0xB38D, 0xD019, 0xB38E, 0xD01A, + 0xB38F, 0xD01B, 0xB390, 0xD01C, 0xB391, 0xD01D, 0xB392, 0xD01E, + 0xB393, 0xD01F, 0xB394, 0xD020, 0xB395, 0xD021, 0xB396, 0xD022, + 0xB397, 0xD023, 0xB398, 0xD024, 0xB399, 0xD025, 0xB39A, 0xD026, + 0xB39B, 0xD027, 0xB39C, 0xD028, 0xB39D, 0xD029, 0xB39E, 0xD02A, + 0xB39F, 0xD02B, 0xB3A0, 0xD02C, 0xB3A1, 0xB05D, 0xB3A2, 0xB07C, + 0xB3A3, 0xB07D, 0xB3A4, 0xB080, 0xB3A5, 0xB084, 0xB3A6, 0xB08C, + 0xB3A7, 0xB08D, 0xB3A8, 0xB08F, 0xB3A9, 0xB091, 0xB3AA, 0xB098, + 0xB3AB, 0xB099, 0xB3AC, 0xB09A, 0xB3AD, 0xB09C, 0xB3AE, 0xB09F, + 0xB3AF, 0xB0A0, 0xB3B0, 0xB0A1, 0xB3B1, 0xB0A2, 0xB3B2, 0xB0A8, + 0xB3B3, 0xB0A9, 0xB3B4, 0xB0AB, 0xB3B5, 0xB0AC, 0xB3B6, 0xB0AD, + 0xB3B7, 0xB0AE, 0xB3B8, 0xB0AF, 0xB3B9, 0xB0B1, 0xB3BA, 0xB0B3, + 0xB3BB, 0xB0B4, 0xB3BC, 0xB0B5, 0xB3BD, 0xB0B8, 0xB3BE, 0xB0BC, + 0xB3BF, 0xB0C4, 0xB3C0, 0xB0C5, 0xB3C1, 0xB0C7, 0xB3C2, 0xB0C8, + 0xB3C3, 0xB0C9, 0xB3C4, 0xB0D0, 0xB3C5, 0xB0D1, 0xB3C6, 0xB0D4, + 0xB3C7, 0xB0D8, 0xB3C8, 0xB0E0, 0xB3C9, 0xB0E5, 0xB3CA, 0xB108, + 0xB3CB, 0xB109, 0xB3CC, 0xB10B, 0xB3CD, 0xB10C, 0xB3CE, 0xB110, + 0xB3CF, 0xB112, 0xB3D0, 0xB113, 0xB3D1, 0xB118, 0xB3D2, 0xB119, + 0xB3D3, 0xB11B, 0xB3D4, 0xB11C, 0xB3D5, 0xB11D, 0xB3D6, 0xB123, + 0xB3D7, 0xB124, 0xB3D8, 0xB125, 0xB3D9, 0xB128, 0xB3DA, 0xB12C, + 0xB3DB, 0xB134, 0xB3DC, 0xB135, 0xB3DD, 0xB137, 0xB3DE, 0xB138, + 0xB3DF, 0xB139, 0xB3E0, 0xB140, 0xB3E1, 0xB141, 0xB3E2, 0xB144, + 0xB3E3, 0xB148, 0xB3E4, 0xB150, 0xB3E5, 0xB151, 0xB3E6, 0xB154, + 0xB3E7, 0xB155, 0xB3E8, 0xB158, 0xB3E9, 0xB15C, 0xB3EA, 0xB160, + 0xB3EB, 0xB178, 0xB3EC, 0xB179, 0xB3ED, 0xB17C, 0xB3EE, 0xB180, + 0xB3EF, 0xB182, 0xB3F0, 0xB188, 0xB3F1, 0xB189, 0xB3F2, 0xB18B, + 0xB3F3, 0xB18D, 0xB3F4, 0xB192, 0xB3F5, 0xB193, 0xB3F6, 0xB194, + 0xB3F7, 0xB198, 0xB3F8, 0xB19C, 0xB3F9, 0xB1A8, 0xB3FA, 0xB1CC, + 0xB3FB, 0xB1D0, 0xB3FC, 0xB1D4, 0xB3FD, 0xB1DC, 0xB3FE, 0xB1DD, + 0xB441, 0xD02E, 0xB442, 0xD02F, 0xB443, 0xD030, 0xB444, 0xD031, + 0xB445, 0xD032, 0xB446, 0xD033, 0xB447, 0xD036, 0xB448, 0xD037, + 0xB449, 0xD039, 0xB44A, 0xD03A, 0xB44B, 0xD03B, 0xB44C, 0xD03D, + 0xB44D, 0xD03E, 0xB44E, 0xD03F, 0xB44F, 0xD040, 0xB450, 0xD041, + 0xB451, 0xD042, 0xB452, 0xD043, 0xB453, 0xD046, 0xB454, 0xD048, + 0xB455, 0xD04A, 0xB456, 0xD04B, 0xB457, 0xD04C, 0xB458, 0xD04D, + 0xB459, 0xD04E, 0xB45A, 0xD04F, 0xB461, 0xD051, 0xB462, 0xD052, + 0xB463, 0xD053, 0xB464, 0xD055, 0xB465, 0xD056, 0xB466, 0xD057, + 0xB467, 0xD059, 0xB468, 0xD05A, 0xB469, 0xD05B, 0xB46A, 0xD05C, + 0xB46B, 0xD05D, 0xB46C, 0xD05E, 0xB46D, 0xD05F, 0xB46E, 0xD061, + 0xB46F, 0xD062, 0xB470, 0xD063, 0xB471, 0xD064, 0xB472, 0xD065, + 0xB473, 0xD066, 0xB474, 0xD067, 0xB475, 0xD068, 0xB476, 0xD069, + 0xB477, 0xD06A, 0xB478, 0xD06B, 0xB479, 0xD06E, 0xB47A, 0xD06F, + 0xB481, 0xD071, 0xB482, 0xD072, 0xB483, 0xD073, 0xB484, 0xD075, + 0xB485, 0xD076, 0xB486, 0xD077, 0xB487, 0xD078, 0xB488, 0xD079, + 0xB489, 0xD07A, 0xB48A, 0xD07B, 0xB48B, 0xD07E, 0xB48C, 0xD07F, + 0xB48D, 0xD080, 0xB48E, 0xD082, 0xB48F, 0xD083, 0xB490, 0xD084, + 0xB491, 0xD085, 0xB492, 0xD086, 0xB493, 0xD087, 0xB494, 0xD088, + 0xB495, 0xD089, 0xB496, 0xD08A, 0xB497, 0xD08B, 0xB498, 0xD08C, + 0xB499, 0xD08D, 0xB49A, 0xD08E, 0xB49B, 0xD08F, 0xB49C, 0xD090, + 0xB49D, 0xD091, 0xB49E, 0xD092, 0xB49F, 0xD093, 0xB4A0, 0xD094, + 0xB4A1, 0xB1DF, 0xB4A2, 0xB1E8, 0xB4A3, 0xB1E9, 0xB4A4, 0xB1EC, + 0xB4A5, 0xB1F0, 0xB4A6, 0xB1F9, 0xB4A7, 0xB1FB, 0xB4A8, 0xB1FD, + 0xB4A9, 0xB204, 0xB4AA, 0xB205, 0xB4AB, 0xB208, 0xB4AC, 0xB20B, + 0xB4AD, 0xB20C, 0xB4AE, 0xB214, 0xB4AF, 0xB215, 0xB4B0, 0xB217, + 0xB4B1, 0xB219, 0xB4B2, 0xB220, 0xB4B3, 0xB234, 0xB4B4, 0xB23C, + 0xB4B5, 0xB258, 0xB4B6, 0xB25C, 0xB4B7, 0xB260, 0xB4B8, 0xB268, + 0xB4B9, 0xB269, 0xB4BA, 0xB274, 0xB4BB, 0xB275, 0xB4BC, 0xB27C, + 0xB4BD, 0xB284, 0xB4BE, 0xB285, 0xB4BF, 0xB289, 0xB4C0, 0xB290, + 0xB4C1, 0xB291, 0xB4C2, 0xB294, 0xB4C3, 0xB298, 0xB4C4, 0xB299, + 0xB4C5, 0xB29A, 0xB4C6, 0xB2A0, 0xB4C7, 0xB2A1, 0xB4C8, 0xB2A3, + 0xB4C9, 0xB2A5, 0xB4CA, 0xB2A6, 0xB4CB, 0xB2AA, 0xB4CC, 0xB2AC, + 0xB4CD, 0xB2B0, 0xB4CE, 0xB2B4, 0xB4CF, 0xB2C8, 0xB4D0, 0xB2C9, + 0xB4D1, 0xB2CC, 0xB4D2, 0xB2D0, 0xB4D3, 0xB2D2, 0xB4D4, 0xB2D8, + 0xB4D5, 0xB2D9, 0xB4D6, 0xB2DB, 0xB4D7, 0xB2DD, 0xB4D8, 0xB2E2, + 0xB4D9, 0xB2E4, 0xB4DA, 0xB2E5, 0xB4DB, 0xB2E6, 0xB4DC, 0xB2E8, + 0xB4DD, 0xB2EB, 0xB4DE, 0xB2EC, 0xB4DF, 0xB2ED, 0xB4E0, 0xB2EE, + 0xB4E1, 0xB2EF, 0xB4E2, 0xB2F3, 0xB4E3, 0xB2F4, 0xB4E4, 0xB2F5, + 0xB4E5, 0xB2F7, 0xB4E6, 0xB2F8, 0xB4E7, 0xB2F9, 0xB4E8, 0xB2FA, + 0xB4E9, 0xB2FB, 0xB4EA, 0xB2FF, 0xB4EB, 0xB300, 0xB4EC, 0xB301, + 0xB4ED, 0xB304, 0xB4EE, 0xB308, 0xB4EF, 0xB310, 0xB4F0, 0xB311, + 0xB4F1, 0xB313, 0xB4F2, 0xB314, 0xB4F3, 0xB315, 0xB4F4, 0xB31C, + 0xB4F5, 0xB354, 0xB4F6, 0xB355, 0xB4F7, 0xB356, 0xB4F8, 0xB358, + 0xB4F9, 0xB35B, 0xB4FA, 0xB35C, 0xB4FB, 0xB35E, 0xB4FC, 0xB35F, + 0xB4FD, 0xB364, 0xB4FE, 0xB365, 0xB541, 0xD095, 0xB542, 0xD096, + 0xB543, 0xD097, 0xB544, 0xD098, 0xB545, 0xD099, 0xB546, 0xD09A, + 0xB547, 0xD09B, 0xB548, 0xD09C, 0xB549, 0xD09D, 0xB54A, 0xD09E, + 0xB54B, 0xD09F, 0xB54C, 0xD0A0, 0xB54D, 0xD0A1, 0xB54E, 0xD0A2, + 0xB54F, 0xD0A3, 0xB550, 0xD0A6, 0xB551, 0xD0A7, 0xB552, 0xD0A9, + 0xB553, 0xD0AA, 0xB554, 0xD0AB, 0xB555, 0xD0AD, 0xB556, 0xD0AE, + 0xB557, 0xD0AF, 0xB558, 0xD0B0, 0xB559, 0xD0B1, 0xB55A, 0xD0B2, + 0xB561, 0xD0B3, 0xB562, 0xD0B6, 0xB563, 0xD0B8, 0xB564, 0xD0BA, + 0xB565, 0xD0BB, 0xB566, 0xD0BC, 0xB567, 0xD0BD, 0xB568, 0xD0BE, + 0xB569, 0xD0BF, 0xB56A, 0xD0C2, 0xB56B, 0xD0C3, 0xB56C, 0xD0C5, + 0xB56D, 0xD0C6, 0xB56E, 0xD0C7, 0xB56F, 0xD0CA, 0xB570, 0xD0CB, + 0xB571, 0xD0CC, 0xB572, 0xD0CD, 0xB573, 0xD0CE, 0xB574, 0xD0CF, + 0xB575, 0xD0D2, 0xB576, 0xD0D6, 0xB577, 0xD0D7, 0xB578, 0xD0D8, + 0xB579, 0xD0D9, 0xB57A, 0xD0DA, 0xB581, 0xD0DB, 0xB582, 0xD0DE, + 0xB583, 0xD0DF, 0xB584, 0xD0E1, 0xB585, 0xD0E2, 0xB586, 0xD0E3, + 0xB587, 0xD0E5, 0xB588, 0xD0E6, 0xB589, 0xD0E7, 0xB58A, 0xD0E8, + 0xB58B, 0xD0E9, 0xB58C, 0xD0EA, 0xB58D, 0xD0EB, 0xB58E, 0xD0EE, + 0xB58F, 0xD0F2, 0xB590, 0xD0F3, 0xB591, 0xD0F4, 0xB592, 0xD0F5, + 0xB593, 0xD0F6, 0xB594, 0xD0F7, 0xB595, 0xD0F9, 0xB596, 0xD0FA, + 0xB597, 0xD0FB, 0xB598, 0xD0FC, 0xB599, 0xD0FD, 0xB59A, 0xD0FE, + 0xB59B, 0xD0FF, 0xB59C, 0xD100, 0xB59D, 0xD101, 0xB59E, 0xD102, + 0xB59F, 0xD103, 0xB5A0, 0xD104, 0xB5A1, 0xB367, 0xB5A2, 0xB369, + 0xB5A3, 0xB36B, 0xB5A4, 0xB36E, 0xB5A5, 0xB370, 0xB5A6, 0xB371, + 0xB5A7, 0xB374, 0xB5A8, 0xB378, 0xB5A9, 0xB380, 0xB5AA, 0xB381, + 0xB5AB, 0xB383, 0xB5AC, 0xB384, 0xB5AD, 0xB385, 0xB5AE, 0xB38C, + 0xB5AF, 0xB390, 0xB5B0, 0xB394, 0xB5B1, 0xB3A0, 0xB5B2, 0xB3A1, + 0xB5B3, 0xB3A8, 0xB5B4, 0xB3AC, 0xB5B5, 0xB3C4, 0xB5B6, 0xB3C5, + 0xB5B7, 0xB3C8, 0xB5B8, 0xB3CB, 0xB5B9, 0xB3CC, 0xB5BA, 0xB3CE, + 0xB5BB, 0xB3D0, 0xB5BC, 0xB3D4, 0xB5BD, 0xB3D5, 0xB5BE, 0xB3D7, + 0xB5BF, 0xB3D9, 0xB5C0, 0xB3DB, 0xB5C1, 0xB3DD, 0xB5C2, 0xB3E0, + 0xB5C3, 0xB3E4, 0xB5C4, 0xB3E8, 0xB5C5, 0xB3FC, 0xB5C6, 0xB410, + 0xB5C7, 0xB418, 0xB5C8, 0xB41C, 0xB5C9, 0xB420, 0xB5CA, 0xB428, + 0xB5CB, 0xB429, 0xB5CC, 0xB42B, 0xB5CD, 0xB434, 0xB5CE, 0xB450, + 0xB5CF, 0xB451, 0xB5D0, 0xB454, 0xB5D1, 0xB458, 0xB5D2, 0xB460, + 0xB5D3, 0xB461, 0xB5D4, 0xB463, 0xB5D5, 0xB465, 0xB5D6, 0xB46C, + 0xB5D7, 0xB480, 0xB5D8, 0xB488, 0xB5D9, 0xB49D, 0xB5DA, 0xB4A4, + 0xB5DB, 0xB4A8, 0xB5DC, 0xB4AC, 0xB5DD, 0xB4B5, 0xB5DE, 0xB4B7, + 0xB5DF, 0xB4B9, 0xB5E0, 0xB4C0, 0xB5E1, 0xB4C4, 0xB5E2, 0xB4C8, + 0xB5E3, 0xB4D0, 0xB5E4, 0xB4D5, 0xB5E5, 0xB4DC, 0xB5E6, 0xB4DD, + 0xB5E7, 0xB4E0, 0xB5E8, 0xB4E3, 0xB5E9, 0xB4E4, 0xB5EA, 0xB4E6, + 0xB5EB, 0xB4EC, 0xB5EC, 0xB4ED, 0xB5ED, 0xB4EF, 0xB5EE, 0xB4F1, + 0xB5EF, 0xB4F8, 0xB5F0, 0xB514, 0xB5F1, 0xB515, 0xB5F2, 0xB518, + 0xB5F3, 0xB51B, 0xB5F4, 0xB51C, 0xB5F5, 0xB524, 0xB5F6, 0xB525, + 0xB5F7, 0xB527, 0xB5F8, 0xB528, 0xB5F9, 0xB529, 0xB5FA, 0xB52A, + 0xB5FB, 0xB530, 0xB5FC, 0xB531, 0xB5FD, 0xB534, 0xB5FE, 0xB538, + 0xB641, 0xD105, 0xB642, 0xD106, 0xB643, 0xD107, 0xB644, 0xD108, + 0xB645, 0xD109, 0xB646, 0xD10A, 0xB647, 0xD10B, 0xB648, 0xD10C, + 0xB649, 0xD10E, 0xB64A, 0xD10F, 0xB64B, 0xD110, 0xB64C, 0xD111, + 0xB64D, 0xD112, 0xB64E, 0xD113, 0xB64F, 0xD114, 0xB650, 0xD115, + 0xB651, 0xD116, 0xB652, 0xD117, 0xB653, 0xD118, 0xB654, 0xD119, + 0xB655, 0xD11A, 0xB656, 0xD11B, 0xB657, 0xD11C, 0xB658, 0xD11D, + 0xB659, 0xD11E, 0xB65A, 0xD11F, 0xB661, 0xD120, 0xB662, 0xD121, + 0xB663, 0xD122, 0xB664, 0xD123, 0xB665, 0xD124, 0xB666, 0xD125, + 0xB667, 0xD126, 0xB668, 0xD127, 0xB669, 0xD128, 0xB66A, 0xD129, + 0xB66B, 0xD12A, 0xB66C, 0xD12B, 0xB66D, 0xD12C, 0xB66E, 0xD12D, + 0xB66F, 0xD12E, 0xB670, 0xD12F, 0xB671, 0xD132, 0xB672, 0xD133, + 0xB673, 0xD135, 0xB674, 0xD136, 0xB675, 0xD137, 0xB676, 0xD139, + 0xB677, 0xD13B, 0xB678, 0xD13C, 0xB679, 0xD13D, 0xB67A, 0xD13E, + 0xB681, 0xD13F, 0xB682, 0xD142, 0xB683, 0xD146, 0xB684, 0xD147, + 0xB685, 0xD148, 0xB686, 0xD149, 0xB687, 0xD14A, 0xB688, 0xD14B, + 0xB689, 0xD14E, 0xB68A, 0xD14F, 0xB68B, 0xD151, 0xB68C, 0xD152, + 0xB68D, 0xD153, 0xB68E, 0xD155, 0xB68F, 0xD156, 0xB690, 0xD157, + 0xB691, 0xD158, 0xB692, 0xD159, 0xB693, 0xD15A, 0xB694, 0xD15B, + 0xB695, 0xD15E, 0xB696, 0xD160, 0xB697, 0xD162, 0xB698, 0xD163, + 0xB699, 0xD164, 0xB69A, 0xD165, 0xB69B, 0xD166, 0xB69C, 0xD167, + 0xB69D, 0xD169, 0xB69E, 0xD16A, 0xB69F, 0xD16B, 0xB6A0, 0xD16D, + 0xB6A1, 0xB540, 0xB6A2, 0xB541, 0xB6A3, 0xB543, 0xB6A4, 0xB544, + 0xB6A5, 0xB545, 0xB6A6, 0xB54B, 0xB6A7, 0xB54C, 0xB6A8, 0xB54D, + 0xB6A9, 0xB550, 0xB6AA, 0xB554, 0xB6AB, 0xB55C, 0xB6AC, 0xB55D, + 0xB6AD, 0xB55F, 0xB6AE, 0xB560, 0xB6AF, 0xB561, 0xB6B0, 0xB5A0, + 0xB6B1, 0xB5A1, 0xB6B2, 0xB5A4, 0xB6B3, 0xB5A8, 0xB6B4, 0xB5AA, + 0xB6B5, 0xB5AB, 0xB6B6, 0xB5B0, 0xB6B7, 0xB5B1, 0xB6B8, 0xB5B3, + 0xB6B9, 0xB5B4, 0xB6BA, 0xB5B5, 0xB6BB, 0xB5BB, 0xB6BC, 0xB5BC, + 0xB6BD, 0xB5BD, 0xB6BE, 0xB5C0, 0xB6BF, 0xB5C4, 0xB6C0, 0xB5CC, + 0xB6C1, 0xB5CD, 0xB6C2, 0xB5CF, 0xB6C3, 0xB5D0, 0xB6C4, 0xB5D1, + 0xB6C5, 0xB5D8, 0xB6C6, 0xB5EC, 0xB6C7, 0xB610, 0xB6C8, 0xB611, + 0xB6C9, 0xB614, 0xB6CA, 0xB618, 0xB6CB, 0xB625, 0xB6CC, 0xB62C, + 0xB6CD, 0xB634, 0xB6CE, 0xB648, 0xB6CF, 0xB664, 0xB6D0, 0xB668, + 0xB6D1, 0xB69C, 0xB6D2, 0xB69D, 0xB6D3, 0xB6A0, 0xB6D4, 0xB6A4, + 0xB6D5, 0xB6AB, 0xB6D6, 0xB6AC, 0xB6D7, 0xB6B1, 0xB6D8, 0xB6D4, + 0xB6D9, 0xB6F0, 0xB6DA, 0xB6F4, 0xB6DB, 0xB6F8, 0xB6DC, 0xB700, + 0xB6DD, 0xB701, 0xB6DE, 0xB705, 0xB6DF, 0xB728, 0xB6E0, 0xB729, + 0xB6E1, 0xB72C, 0xB6E2, 0xB72F, 0xB6E3, 0xB730, 0xB6E4, 0xB738, + 0xB6E5, 0xB739, 0xB6E6, 0xB73B, 0xB6E7, 0xB744, 0xB6E8, 0xB748, + 0xB6E9, 0xB74C, 0xB6EA, 0xB754, 0xB6EB, 0xB755, 0xB6EC, 0xB760, + 0xB6ED, 0xB764, 0xB6EE, 0xB768, 0xB6EF, 0xB770, 0xB6F0, 0xB771, + 0xB6F1, 0xB773, 0xB6F2, 0xB775, 0xB6F3, 0xB77C, 0xB6F4, 0xB77D, + 0xB6F5, 0xB780, 0xB6F6, 0xB784, 0xB6F7, 0xB78C, 0xB6F8, 0xB78D, + 0xB6F9, 0xB78F, 0xB6FA, 0xB790, 0xB6FB, 0xB791, 0xB6FC, 0xB792, + 0xB6FD, 0xB796, 0xB6FE, 0xB797, 0xB741, 0xD16E, 0xB742, 0xD16F, + 0xB743, 0xD170, 0xB744, 0xD171, 0xB745, 0xD172, 0xB746, 0xD173, + 0xB747, 0xD174, 0xB748, 0xD175, 0xB749, 0xD176, 0xB74A, 0xD177, + 0xB74B, 0xD178, 0xB74C, 0xD179, 0xB74D, 0xD17A, 0xB74E, 0xD17B, + 0xB74F, 0xD17D, 0xB750, 0xD17E, 0xB751, 0xD17F, 0xB752, 0xD180, + 0xB753, 0xD181, 0xB754, 0xD182, 0xB755, 0xD183, 0xB756, 0xD185, + 0xB757, 0xD186, 0xB758, 0xD187, 0xB759, 0xD189, 0xB75A, 0xD18A, + 0xB761, 0xD18B, 0xB762, 0xD18C, 0xB763, 0xD18D, 0xB764, 0xD18E, + 0xB765, 0xD18F, 0xB766, 0xD190, 0xB767, 0xD191, 0xB768, 0xD192, + 0xB769, 0xD193, 0xB76A, 0xD194, 0xB76B, 0xD195, 0xB76C, 0xD196, + 0xB76D, 0xD197, 0xB76E, 0xD198, 0xB76F, 0xD199, 0xB770, 0xD19A, + 0xB771, 0xD19B, 0xB772, 0xD19C, 0xB773, 0xD19D, 0xB774, 0xD19E, + 0xB775, 0xD19F, 0xB776, 0xD1A2, 0xB777, 0xD1A3, 0xB778, 0xD1A5, + 0xB779, 0xD1A6, 0xB77A, 0xD1A7, 0xB781, 0xD1A9, 0xB782, 0xD1AA, + 0xB783, 0xD1AB, 0xB784, 0xD1AC, 0xB785, 0xD1AD, 0xB786, 0xD1AE, + 0xB787, 0xD1AF, 0xB788, 0xD1B2, 0xB789, 0xD1B4, 0xB78A, 0xD1B6, + 0xB78B, 0xD1B7, 0xB78C, 0xD1B8, 0xB78D, 0xD1B9, 0xB78E, 0xD1BB, + 0xB78F, 0xD1BD, 0xB790, 0xD1BE, 0xB791, 0xD1BF, 0xB792, 0xD1C1, + 0xB793, 0xD1C2, 0xB794, 0xD1C3, 0xB795, 0xD1C4, 0xB796, 0xD1C5, + 0xB797, 0xD1C6, 0xB798, 0xD1C7, 0xB799, 0xD1C8, 0xB79A, 0xD1C9, + 0xB79B, 0xD1CA, 0xB79C, 0xD1CB, 0xB79D, 0xD1CC, 0xB79E, 0xD1CD, + 0xB79F, 0xD1CE, 0xB7A0, 0xD1CF, 0xB7A1, 0xB798, 0xB7A2, 0xB799, + 0xB7A3, 0xB79C, 0xB7A4, 0xB7A0, 0xB7A5, 0xB7A8, 0xB7A6, 0xB7A9, + 0xB7A7, 0xB7AB, 0xB7A8, 0xB7AC, 0xB7A9, 0xB7AD, 0xB7AA, 0xB7B4, + 0xB7AB, 0xB7B5, 0xB7AC, 0xB7B8, 0xB7AD, 0xB7C7, 0xB7AE, 0xB7C9, + 0xB7AF, 0xB7EC, 0xB7B0, 0xB7ED, 0xB7B1, 0xB7F0, 0xB7B2, 0xB7F4, + 0xB7B3, 0xB7FC, 0xB7B4, 0xB7FD, 0xB7B5, 0xB7FF, 0xB7B6, 0xB800, + 0xB7B7, 0xB801, 0xB7B8, 0xB807, 0xB7B9, 0xB808, 0xB7BA, 0xB809, + 0xB7BB, 0xB80C, 0xB7BC, 0xB810, 0xB7BD, 0xB818, 0xB7BE, 0xB819, + 0xB7BF, 0xB81B, 0xB7C0, 0xB81D, 0xB7C1, 0xB824, 0xB7C2, 0xB825, + 0xB7C3, 0xB828, 0xB7C4, 0xB82C, 0xB7C5, 0xB834, 0xB7C6, 0xB835, + 0xB7C7, 0xB837, 0xB7C8, 0xB838, 0xB7C9, 0xB839, 0xB7CA, 0xB840, + 0xB7CB, 0xB844, 0xB7CC, 0xB851, 0xB7CD, 0xB853, 0xB7CE, 0xB85C, + 0xB7CF, 0xB85D, 0xB7D0, 0xB860, 0xB7D1, 0xB864, 0xB7D2, 0xB86C, + 0xB7D3, 0xB86D, 0xB7D4, 0xB86F, 0xB7D5, 0xB871, 0xB7D6, 0xB878, + 0xB7D7, 0xB87C, 0xB7D8, 0xB88D, 0xB7D9, 0xB8A8, 0xB7DA, 0xB8B0, + 0xB7DB, 0xB8B4, 0xB7DC, 0xB8B8, 0xB7DD, 0xB8C0, 0xB7DE, 0xB8C1, + 0xB7DF, 0xB8C3, 0xB7E0, 0xB8C5, 0xB7E1, 0xB8CC, 0xB7E2, 0xB8D0, + 0xB7E3, 0xB8D4, 0xB7E4, 0xB8DD, 0xB7E5, 0xB8DF, 0xB7E6, 0xB8E1, + 0xB7E7, 0xB8E8, 0xB7E8, 0xB8E9, 0xB7E9, 0xB8EC, 0xB7EA, 0xB8F0, + 0xB7EB, 0xB8F8, 0xB7EC, 0xB8F9, 0xB7ED, 0xB8FB, 0xB7EE, 0xB8FD, + 0xB7EF, 0xB904, 0xB7F0, 0xB918, 0xB7F1, 0xB920, 0xB7F2, 0xB93C, + 0xB7F3, 0xB93D, 0xB7F4, 0xB940, 0xB7F5, 0xB944, 0xB7F6, 0xB94C, + 0xB7F7, 0xB94F, 0xB7F8, 0xB951, 0xB7F9, 0xB958, 0xB7FA, 0xB959, + 0xB7FB, 0xB95C, 0xB7FC, 0xB960, 0xB7FD, 0xB968, 0xB7FE, 0xB969, + 0xB841, 0xD1D0, 0xB842, 0xD1D1, 0xB843, 0xD1D2, 0xB844, 0xD1D3, + 0xB845, 0xD1D4, 0xB846, 0xD1D5, 0xB847, 0xD1D6, 0xB848, 0xD1D7, + 0xB849, 0xD1D9, 0xB84A, 0xD1DA, 0xB84B, 0xD1DB, 0xB84C, 0xD1DC, + 0xB84D, 0xD1DD, 0xB84E, 0xD1DE, 0xB84F, 0xD1DF, 0xB850, 0xD1E0, + 0xB851, 0xD1E1, 0xB852, 0xD1E2, 0xB853, 0xD1E3, 0xB854, 0xD1E4, + 0xB855, 0xD1E5, 0xB856, 0xD1E6, 0xB857, 0xD1E7, 0xB858, 0xD1E8, + 0xB859, 0xD1E9, 0xB85A, 0xD1EA, 0xB861, 0xD1EB, 0xB862, 0xD1EC, + 0xB863, 0xD1ED, 0xB864, 0xD1EE, 0xB865, 0xD1EF, 0xB866, 0xD1F0, + 0xB867, 0xD1F1, 0xB868, 0xD1F2, 0xB869, 0xD1F3, 0xB86A, 0xD1F5, + 0xB86B, 0xD1F6, 0xB86C, 0xD1F7, 0xB86D, 0xD1F9, 0xB86E, 0xD1FA, + 0xB86F, 0xD1FB, 0xB870, 0xD1FC, 0xB871, 0xD1FD, 0xB872, 0xD1FE, + 0xB873, 0xD1FF, 0xB874, 0xD200, 0xB875, 0xD201, 0xB876, 0xD202, + 0xB877, 0xD203, 0xB878, 0xD204, 0xB879, 0xD205, 0xB87A, 0xD206, + 0xB881, 0xD208, 0xB882, 0xD20A, 0xB883, 0xD20B, 0xB884, 0xD20C, + 0xB885, 0xD20D, 0xB886, 0xD20E, 0xB887, 0xD20F, 0xB888, 0xD211, + 0xB889, 0xD212, 0xB88A, 0xD213, 0xB88B, 0xD214, 0xB88C, 0xD215, + 0xB88D, 0xD216, 0xB88E, 0xD217, 0xB88F, 0xD218, 0xB890, 0xD219, + 0xB891, 0xD21A, 0xB892, 0xD21B, 0xB893, 0xD21C, 0xB894, 0xD21D, + 0xB895, 0xD21E, 0xB896, 0xD21F, 0xB897, 0xD220, 0xB898, 0xD221, + 0xB899, 0xD222, 0xB89A, 0xD223, 0xB89B, 0xD224, 0xB89C, 0xD225, + 0xB89D, 0xD226, 0xB89E, 0xD227, 0xB89F, 0xD228, 0xB8A0, 0xD229, + 0xB8A1, 0xB96B, 0xB8A2, 0xB96D, 0xB8A3, 0xB974, 0xB8A4, 0xB975, + 0xB8A5, 0xB978, 0xB8A6, 0xB97C, 0xB8A7, 0xB984, 0xB8A8, 0xB985, + 0xB8A9, 0xB987, 0xB8AA, 0xB989, 0xB8AB, 0xB98A, 0xB8AC, 0xB98D, + 0xB8AD, 0xB98E, 0xB8AE, 0xB9AC, 0xB8AF, 0xB9AD, 0xB8B0, 0xB9B0, + 0xB8B1, 0xB9B4, 0xB8B2, 0xB9BC, 0xB8B3, 0xB9BD, 0xB8B4, 0xB9BF, + 0xB8B5, 0xB9C1, 0xB8B6, 0xB9C8, 0xB8B7, 0xB9C9, 0xB8B8, 0xB9CC, + 0xB8B9, 0xB9CE, 0xB8BA, 0xB9CF, 0xB8BB, 0xB9D0, 0xB8BC, 0xB9D1, + 0xB8BD, 0xB9D2, 0xB8BE, 0xB9D8, 0xB8BF, 0xB9D9, 0xB8C0, 0xB9DB, + 0xB8C1, 0xB9DD, 0xB8C2, 0xB9DE, 0xB8C3, 0xB9E1, 0xB8C4, 0xB9E3, + 0xB8C5, 0xB9E4, 0xB8C6, 0xB9E5, 0xB8C7, 0xB9E8, 0xB8C8, 0xB9EC, + 0xB8C9, 0xB9F4, 0xB8CA, 0xB9F5, 0xB8CB, 0xB9F7, 0xB8CC, 0xB9F8, + 0xB8CD, 0xB9F9, 0xB8CE, 0xB9FA, 0xB8CF, 0xBA00, 0xB8D0, 0xBA01, + 0xB8D1, 0xBA08, 0xB8D2, 0xBA15, 0xB8D3, 0xBA38, 0xB8D4, 0xBA39, + 0xB8D5, 0xBA3C, 0xB8D6, 0xBA40, 0xB8D7, 0xBA42, 0xB8D8, 0xBA48, + 0xB8D9, 0xBA49, 0xB8DA, 0xBA4B, 0xB8DB, 0xBA4D, 0xB8DC, 0xBA4E, + 0xB8DD, 0xBA53, 0xB8DE, 0xBA54, 0xB8DF, 0xBA55, 0xB8E0, 0xBA58, + 0xB8E1, 0xBA5C, 0xB8E2, 0xBA64, 0xB8E3, 0xBA65, 0xB8E4, 0xBA67, + 0xB8E5, 0xBA68, 0xB8E6, 0xBA69, 0xB8E7, 0xBA70, 0xB8E8, 0xBA71, + 0xB8E9, 0xBA74, 0xB8EA, 0xBA78, 0xB8EB, 0xBA83, 0xB8EC, 0xBA84, + 0xB8ED, 0xBA85, 0xB8EE, 0xBA87, 0xB8EF, 0xBA8C, 0xB8F0, 0xBAA8, + 0xB8F1, 0xBAA9, 0xB8F2, 0xBAAB, 0xB8F3, 0xBAAC, 0xB8F4, 0xBAB0, + 0xB8F5, 0xBAB2, 0xB8F6, 0xBAB8, 0xB8F7, 0xBAB9, 0xB8F8, 0xBABB, + 0xB8F9, 0xBABD, 0xB8FA, 0xBAC4, 0xB8FB, 0xBAC8, 0xB8FC, 0xBAD8, + 0xB8FD, 0xBAD9, 0xB8FE, 0xBAFC, 0xB941, 0xD22A, 0xB942, 0xD22B, + 0xB943, 0xD22E, 0xB944, 0xD22F, 0xB945, 0xD231, 0xB946, 0xD232, + 0xB947, 0xD233, 0xB948, 0xD235, 0xB949, 0xD236, 0xB94A, 0xD237, + 0xB94B, 0xD238, 0xB94C, 0xD239, 0xB94D, 0xD23A, 0xB94E, 0xD23B, + 0xB94F, 0xD23E, 0xB950, 0xD240, 0xB951, 0xD242, 0xB952, 0xD243, + 0xB953, 0xD244, 0xB954, 0xD245, 0xB955, 0xD246, 0xB956, 0xD247, + 0xB957, 0xD249, 0xB958, 0xD24A, 0xB959, 0xD24B, 0xB95A, 0xD24C, + 0xB961, 0xD24D, 0xB962, 0xD24E, 0xB963, 0xD24F, 0xB964, 0xD250, + 0xB965, 0xD251, 0xB966, 0xD252, 0xB967, 0xD253, 0xB968, 0xD254, + 0xB969, 0xD255, 0xB96A, 0xD256, 0xB96B, 0xD257, 0xB96C, 0xD258, + 0xB96D, 0xD259, 0xB96E, 0xD25A, 0xB96F, 0xD25B, 0xB970, 0xD25D, + 0xB971, 0xD25E, 0xB972, 0xD25F, 0xB973, 0xD260, 0xB974, 0xD261, + 0xB975, 0xD262, 0xB976, 0xD263, 0xB977, 0xD265, 0xB978, 0xD266, + 0xB979, 0xD267, 0xB97A, 0xD268, 0xB981, 0xD269, 0xB982, 0xD26A, + 0xB983, 0xD26B, 0xB984, 0xD26C, 0xB985, 0xD26D, 0xB986, 0xD26E, + 0xB987, 0xD26F, 0xB988, 0xD270, 0xB989, 0xD271, 0xB98A, 0xD272, + 0xB98B, 0xD273, 0xB98C, 0xD274, 0xB98D, 0xD275, 0xB98E, 0xD276, + 0xB98F, 0xD277, 0xB990, 0xD278, 0xB991, 0xD279, 0xB992, 0xD27A, + 0xB993, 0xD27B, 0xB994, 0xD27C, 0xB995, 0xD27D, 0xB996, 0xD27E, + 0xB997, 0xD27F, 0xB998, 0xD282, 0xB999, 0xD283, 0xB99A, 0xD285, + 0xB99B, 0xD286, 0xB99C, 0xD287, 0xB99D, 0xD289, 0xB99E, 0xD28A, + 0xB99F, 0xD28B, 0xB9A0, 0xD28C, 0xB9A1, 0xBB00, 0xB9A2, 0xBB04, + 0xB9A3, 0xBB0D, 0xB9A4, 0xBB0F, 0xB9A5, 0xBB11, 0xB9A6, 0xBB18, + 0xB9A7, 0xBB1C, 0xB9A8, 0xBB20, 0xB9A9, 0xBB29, 0xB9AA, 0xBB2B, + 0xB9AB, 0xBB34, 0xB9AC, 0xBB35, 0xB9AD, 0xBB36, 0xB9AE, 0xBB38, + 0xB9AF, 0xBB3B, 0xB9B0, 0xBB3C, 0xB9B1, 0xBB3D, 0xB9B2, 0xBB3E, + 0xB9B3, 0xBB44, 0xB9B4, 0xBB45, 0xB9B5, 0xBB47, 0xB9B6, 0xBB49, + 0xB9B7, 0xBB4D, 0xB9B8, 0xBB4F, 0xB9B9, 0xBB50, 0xB9BA, 0xBB54, + 0xB9BB, 0xBB58, 0xB9BC, 0xBB61, 0xB9BD, 0xBB63, 0xB9BE, 0xBB6C, + 0xB9BF, 0xBB88, 0xB9C0, 0xBB8C, 0xB9C1, 0xBB90, 0xB9C2, 0xBBA4, + 0xB9C3, 0xBBA8, 0xB9C4, 0xBBAC, 0xB9C5, 0xBBB4, 0xB9C6, 0xBBB7, + 0xB9C7, 0xBBC0, 0xB9C8, 0xBBC4, 0xB9C9, 0xBBC8, 0xB9CA, 0xBBD0, + 0xB9CB, 0xBBD3, 0xB9CC, 0xBBF8, 0xB9CD, 0xBBF9, 0xB9CE, 0xBBFC, + 0xB9CF, 0xBBFF, 0xB9D0, 0xBC00, 0xB9D1, 0xBC02, 0xB9D2, 0xBC08, + 0xB9D3, 0xBC09, 0xB9D4, 0xBC0B, 0xB9D5, 0xBC0C, 0xB9D6, 0xBC0D, + 0xB9D7, 0xBC0F, 0xB9D8, 0xBC11, 0xB9D9, 0xBC14, 0xB9DA, 0xBC15, + 0xB9DB, 0xBC16, 0xB9DC, 0xBC17, 0xB9DD, 0xBC18, 0xB9DE, 0xBC1B, + 0xB9DF, 0xBC1C, 0xB9E0, 0xBC1D, 0xB9E1, 0xBC1E, 0xB9E2, 0xBC1F, + 0xB9E3, 0xBC24, 0xB9E4, 0xBC25, 0xB9E5, 0xBC27, 0xB9E6, 0xBC29, + 0xB9E7, 0xBC2D, 0xB9E8, 0xBC30, 0xB9E9, 0xBC31, 0xB9EA, 0xBC34, + 0xB9EB, 0xBC38, 0xB9EC, 0xBC40, 0xB9ED, 0xBC41, 0xB9EE, 0xBC43, + 0xB9EF, 0xBC44, 0xB9F0, 0xBC45, 0xB9F1, 0xBC49, 0xB9F2, 0xBC4C, + 0xB9F3, 0xBC4D, 0xB9F4, 0xBC50, 0xB9F5, 0xBC5D, 0xB9F6, 0xBC84, + 0xB9F7, 0xBC85, 0xB9F8, 0xBC88, 0xB9F9, 0xBC8B, 0xB9FA, 0xBC8C, + 0xB9FB, 0xBC8E, 0xB9FC, 0xBC94, 0xB9FD, 0xBC95, 0xB9FE, 0xBC97, + 0xBA41, 0xD28D, 0xBA42, 0xD28E, 0xBA43, 0xD28F, 0xBA44, 0xD292, + 0xBA45, 0xD293, 0xBA46, 0xD294, 0xBA47, 0xD296, 0xBA48, 0xD297, + 0xBA49, 0xD298, 0xBA4A, 0xD299, 0xBA4B, 0xD29A, 0xBA4C, 0xD29B, + 0xBA4D, 0xD29D, 0xBA4E, 0xD29E, 0xBA4F, 0xD29F, 0xBA50, 0xD2A1, + 0xBA51, 0xD2A2, 0xBA52, 0xD2A3, 0xBA53, 0xD2A5, 0xBA54, 0xD2A6, + 0xBA55, 0xD2A7, 0xBA56, 0xD2A8, 0xBA57, 0xD2A9, 0xBA58, 0xD2AA, + 0xBA59, 0xD2AB, 0xBA5A, 0xD2AD, 0xBA61, 0xD2AE, 0xBA62, 0xD2AF, + 0xBA63, 0xD2B0, 0xBA64, 0xD2B2, 0xBA65, 0xD2B3, 0xBA66, 0xD2B4, + 0xBA67, 0xD2B5, 0xBA68, 0xD2B6, 0xBA69, 0xD2B7, 0xBA6A, 0xD2BA, + 0xBA6B, 0xD2BB, 0xBA6C, 0xD2BD, 0xBA6D, 0xD2BE, 0xBA6E, 0xD2C1, + 0xBA6F, 0xD2C3, 0xBA70, 0xD2C4, 0xBA71, 0xD2C5, 0xBA72, 0xD2C6, + 0xBA73, 0xD2C7, 0xBA74, 0xD2CA, 0xBA75, 0xD2CC, 0xBA76, 0xD2CD, + 0xBA77, 0xD2CE, 0xBA78, 0xD2CF, 0xBA79, 0xD2D0, 0xBA7A, 0xD2D1, + 0xBA81, 0xD2D2, 0xBA82, 0xD2D3, 0xBA83, 0xD2D5, 0xBA84, 0xD2D6, + 0xBA85, 0xD2D7, 0xBA86, 0xD2D9, 0xBA87, 0xD2DA, 0xBA88, 0xD2DB, + 0xBA89, 0xD2DD, 0xBA8A, 0xD2DE, 0xBA8B, 0xD2DF, 0xBA8C, 0xD2E0, + 0xBA8D, 0xD2E1, 0xBA8E, 0xD2E2, 0xBA8F, 0xD2E3, 0xBA90, 0xD2E6, + 0xBA91, 0xD2E7, 0xBA92, 0xD2E8, 0xBA93, 0xD2E9, 0xBA94, 0xD2EA, + 0xBA95, 0xD2EB, 0xBA96, 0xD2EC, 0xBA97, 0xD2ED, 0xBA98, 0xD2EE, + 0xBA99, 0xD2EF, 0xBA9A, 0xD2F2, 0xBA9B, 0xD2F3, 0xBA9C, 0xD2F5, + 0xBA9D, 0xD2F6, 0xBA9E, 0xD2F7, 0xBA9F, 0xD2F9, 0xBAA0, 0xD2FA, + 0xBAA1, 0xBC99, 0xBAA2, 0xBC9A, 0xBAA3, 0xBCA0, 0xBAA4, 0xBCA1, + 0xBAA5, 0xBCA4, 0xBAA6, 0xBCA7, 0xBAA7, 0xBCA8, 0xBAA8, 0xBCB0, + 0xBAA9, 0xBCB1, 0xBAAA, 0xBCB3, 0xBAAB, 0xBCB4, 0xBAAC, 0xBCB5, + 0xBAAD, 0xBCBC, 0xBAAE, 0xBCBD, 0xBAAF, 0xBCC0, 0xBAB0, 0xBCC4, + 0xBAB1, 0xBCCD, 0xBAB2, 0xBCCF, 0xBAB3, 0xBCD0, 0xBAB4, 0xBCD1, + 0xBAB5, 0xBCD5, 0xBAB6, 0xBCD8, 0xBAB7, 0xBCDC, 0xBAB8, 0xBCF4, + 0xBAB9, 0xBCF5, 0xBABA, 0xBCF6, 0xBABB, 0xBCF8, 0xBABC, 0xBCFC, + 0xBABD, 0xBD04, 0xBABE, 0xBD05, 0xBABF, 0xBD07, 0xBAC0, 0xBD09, + 0xBAC1, 0xBD10, 0xBAC2, 0xBD14, 0xBAC3, 0xBD24, 0xBAC4, 0xBD2C, + 0xBAC5, 0xBD40, 0xBAC6, 0xBD48, 0xBAC7, 0xBD49, 0xBAC8, 0xBD4C, + 0xBAC9, 0xBD50, 0xBACA, 0xBD58, 0xBACB, 0xBD59, 0xBACC, 0xBD64, + 0xBACD, 0xBD68, 0xBACE, 0xBD80, 0xBACF, 0xBD81, 0xBAD0, 0xBD84, + 0xBAD1, 0xBD87, 0xBAD2, 0xBD88, 0xBAD3, 0xBD89, 0xBAD4, 0xBD8A, + 0xBAD5, 0xBD90, 0xBAD6, 0xBD91, 0xBAD7, 0xBD93, 0xBAD8, 0xBD95, + 0xBAD9, 0xBD99, 0xBADA, 0xBD9A, 0xBADB, 0xBD9C, 0xBADC, 0xBDA4, + 0xBADD, 0xBDB0, 0xBADE, 0xBDB8, 0xBADF, 0xBDD4, 0xBAE0, 0xBDD5, + 0xBAE1, 0xBDD8, 0xBAE2, 0xBDDC, 0xBAE3, 0xBDE9, 0xBAE4, 0xBDF0, + 0xBAE5, 0xBDF4, 0xBAE6, 0xBDF8, 0xBAE7, 0xBE00, 0xBAE8, 0xBE03, + 0xBAE9, 0xBE05, 0xBAEA, 0xBE0C, 0xBAEB, 0xBE0D, 0xBAEC, 0xBE10, + 0xBAED, 0xBE14, 0xBAEE, 0xBE1C, 0xBAEF, 0xBE1D, 0xBAF0, 0xBE1F, + 0xBAF1, 0xBE44, 0xBAF2, 0xBE45, 0xBAF3, 0xBE48, 0xBAF4, 0xBE4C, + 0xBAF5, 0xBE4E, 0xBAF6, 0xBE54, 0xBAF7, 0xBE55, 0xBAF8, 0xBE57, + 0xBAF9, 0xBE59, 0xBAFA, 0xBE5A, 0xBAFB, 0xBE5B, 0xBAFC, 0xBE60, + 0xBAFD, 0xBE61, 0xBAFE, 0xBE64, 0xBB41, 0xD2FB, 0xBB42, 0xD2FC, + 0xBB43, 0xD2FD, 0xBB44, 0xD2FE, 0xBB45, 0xD2FF, 0xBB46, 0xD302, + 0xBB47, 0xD304, 0xBB48, 0xD306, 0xBB49, 0xD307, 0xBB4A, 0xD308, + 0xBB4B, 0xD309, 0xBB4C, 0xD30A, 0xBB4D, 0xD30B, 0xBB4E, 0xD30F, + 0xBB4F, 0xD311, 0xBB50, 0xD312, 0xBB51, 0xD313, 0xBB52, 0xD315, + 0xBB53, 0xD317, 0xBB54, 0xD318, 0xBB55, 0xD319, 0xBB56, 0xD31A, + 0xBB57, 0xD31B, 0xBB58, 0xD31E, 0xBB59, 0xD322, 0xBB5A, 0xD323, + 0xBB61, 0xD324, 0xBB62, 0xD326, 0xBB63, 0xD327, 0xBB64, 0xD32A, + 0xBB65, 0xD32B, 0xBB66, 0xD32D, 0xBB67, 0xD32E, 0xBB68, 0xD32F, + 0xBB69, 0xD331, 0xBB6A, 0xD332, 0xBB6B, 0xD333, 0xBB6C, 0xD334, + 0xBB6D, 0xD335, 0xBB6E, 0xD336, 0xBB6F, 0xD337, 0xBB70, 0xD33A, + 0xBB71, 0xD33E, 0xBB72, 0xD33F, 0xBB73, 0xD340, 0xBB74, 0xD341, + 0xBB75, 0xD342, 0xBB76, 0xD343, 0xBB77, 0xD346, 0xBB78, 0xD347, + 0xBB79, 0xD348, 0xBB7A, 0xD349, 0xBB81, 0xD34A, 0xBB82, 0xD34B, + 0xBB83, 0xD34C, 0xBB84, 0xD34D, 0xBB85, 0xD34E, 0xBB86, 0xD34F, + 0xBB87, 0xD350, 0xBB88, 0xD351, 0xBB89, 0xD352, 0xBB8A, 0xD353, + 0xBB8B, 0xD354, 0xBB8C, 0xD355, 0xBB8D, 0xD356, 0xBB8E, 0xD357, + 0xBB8F, 0xD358, 0xBB90, 0xD359, 0xBB91, 0xD35A, 0xBB92, 0xD35B, + 0xBB93, 0xD35C, 0xBB94, 0xD35D, 0xBB95, 0xD35E, 0xBB96, 0xD35F, + 0xBB97, 0xD360, 0xBB98, 0xD361, 0xBB99, 0xD362, 0xBB9A, 0xD363, + 0xBB9B, 0xD364, 0xBB9C, 0xD365, 0xBB9D, 0xD366, 0xBB9E, 0xD367, + 0xBB9F, 0xD368, 0xBBA0, 0xD369, 0xBBA1, 0xBE68, 0xBBA2, 0xBE6A, + 0xBBA3, 0xBE70, 0xBBA4, 0xBE71, 0xBBA5, 0xBE73, 0xBBA6, 0xBE74, + 0xBBA7, 0xBE75, 0xBBA8, 0xBE7B, 0xBBA9, 0xBE7C, 0xBBAA, 0xBE7D, + 0xBBAB, 0xBE80, 0xBBAC, 0xBE84, 0xBBAD, 0xBE8C, 0xBBAE, 0xBE8D, + 0xBBAF, 0xBE8F, 0xBBB0, 0xBE90, 0xBBB1, 0xBE91, 0xBBB2, 0xBE98, + 0xBBB3, 0xBE99, 0xBBB4, 0xBEA8, 0xBBB5, 0xBED0, 0xBBB6, 0xBED1, + 0xBBB7, 0xBED4, 0xBBB8, 0xBED7, 0xBBB9, 0xBED8, 0xBBBA, 0xBEE0, + 0xBBBB, 0xBEE3, 0xBBBC, 0xBEE4, 0xBBBD, 0xBEE5, 0xBBBE, 0xBEEC, + 0xBBBF, 0xBF01, 0xBBC0, 0xBF08, 0xBBC1, 0xBF09, 0xBBC2, 0xBF18, + 0xBBC3, 0xBF19, 0xBBC4, 0xBF1B, 0xBBC5, 0xBF1C, 0xBBC6, 0xBF1D, + 0xBBC7, 0xBF40, 0xBBC8, 0xBF41, 0xBBC9, 0xBF44, 0xBBCA, 0xBF48, + 0xBBCB, 0xBF50, 0xBBCC, 0xBF51, 0xBBCD, 0xBF55, 0xBBCE, 0xBF94, + 0xBBCF, 0xBFB0, 0xBBD0, 0xBFC5, 0xBBD1, 0xBFCC, 0xBBD2, 0xBFCD, + 0xBBD3, 0xBFD0, 0xBBD4, 0xBFD4, 0xBBD5, 0xBFDC, 0xBBD6, 0xBFDF, + 0xBBD7, 0xBFE1, 0xBBD8, 0xC03C, 0xBBD9, 0xC051, 0xBBDA, 0xC058, + 0xBBDB, 0xC05C, 0xBBDC, 0xC060, 0xBBDD, 0xC068, 0xBBDE, 0xC069, + 0xBBDF, 0xC090, 0xBBE0, 0xC091, 0xBBE1, 0xC094, 0xBBE2, 0xC098, + 0xBBE3, 0xC0A0, 0xBBE4, 0xC0A1, 0xBBE5, 0xC0A3, 0xBBE6, 0xC0A5, + 0xBBE7, 0xC0AC, 0xBBE8, 0xC0AD, 0xBBE9, 0xC0AF, 0xBBEA, 0xC0B0, + 0xBBEB, 0xC0B3, 0xBBEC, 0xC0B4, 0xBBED, 0xC0B5, 0xBBEE, 0xC0B6, + 0xBBEF, 0xC0BC, 0xBBF0, 0xC0BD, 0xBBF1, 0xC0BF, 0xBBF2, 0xC0C0, + 0xBBF3, 0xC0C1, 0xBBF4, 0xC0C5, 0xBBF5, 0xC0C8, 0xBBF6, 0xC0C9, + 0xBBF7, 0xC0CC, 0xBBF8, 0xC0D0, 0xBBF9, 0xC0D8, 0xBBFA, 0xC0D9, + 0xBBFB, 0xC0DB, 0xBBFC, 0xC0DC, 0xBBFD, 0xC0DD, 0xBBFE, 0xC0E4, + 0xBC41, 0xD36A, 0xBC42, 0xD36B, 0xBC43, 0xD36C, 0xBC44, 0xD36D, + 0xBC45, 0xD36E, 0xBC46, 0xD36F, 0xBC47, 0xD370, 0xBC48, 0xD371, + 0xBC49, 0xD372, 0xBC4A, 0xD373, 0xBC4B, 0xD374, 0xBC4C, 0xD375, + 0xBC4D, 0xD376, 0xBC4E, 0xD377, 0xBC4F, 0xD378, 0xBC50, 0xD379, + 0xBC51, 0xD37A, 0xBC52, 0xD37B, 0xBC53, 0xD37E, 0xBC54, 0xD37F, + 0xBC55, 0xD381, 0xBC56, 0xD382, 0xBC57, 0xD383, 0xBC58, 0xD385, + 0xBC59, 0xD386, 0xBC5A, 0xD387, 0xBC61, 0xD388, 0xBC62, 0xD389, + 0xBC63, 0xD38A, 0xBC64, 0xD38B, 0xBC65, 0xD38E, 0xBC66, 0xD392, + 0xBC67, 0xD393, 0xBC68, 0xD394, 0xBC69, 0xD395, 0xBC6A, 0xD396, + 0xBC6B, 0xD397, 0xBC6C, 0xD39A, 0xBC6D, 0xD39B, 0xBC6E, 0xD39D, + 0xBC6F, 0xD39E, 0xBC70, 0xD39F, 0xBC71, 0xD3A1, 0xBC72, 0xD3A2, + 0xBC73, 0xD3A3, 0xBC74, 0xD3A4, 0xBC75, 0xD3A5, 0xBC76, 0xD3A6, + 0xBC77, 0xD3A7, 0xBC78, 0xD3AA, 0xBC79, 0xD3AC, 0xBC7A, 0xD3AE, + 0xBC81, 0xD3AF, 0xBC82, 0xD3B0, 0xBC83, 0xD3B1, 0xBC84, 0xD3B2, + 0xBC85, 0xD3B3, 0xBC86, 0xD3B5, 0xBC87, 0xD3B6, 0xBC88, 0xD3B7, + 0xBC89, 0xD3B9, 0xBC8A, 0xD3BA, 0xBC8B, 0xD3BB, 0xBC8C, 0xD3BD, + 0xBC8D, 0xD3BE, 0xBC8E, 0xD3BF, 0xBC8F, 0xD3C0, 0xBC90, 0xD3C1, + 0xBC91, 0xD3C2, 0xBC92, 0xD3C3, 0xBC93, 0xD3C6, 0xBC94, 0xD3C7, + 0xBC95, 0xD3CA, 0xBC96, 0xD3CB, 0xBC97, 0xD3CC, 0xBC98, 0xD3CD, + 0xBC99, 0xD3CE, 0xBC9A, 0xD3CF, 0xBC9B, 0xD3D1, 0xBC9C, 0xD3D2, + 0xBC9D, 0xD3D3, 0xBC9E, 0xD3D4, 0xBC9F, 0xD3D5, 0xBCA0, 0xD3D6, + 0xBCA1, 0xC0E5, 0xBCA2, 0xC0E8, 0xBCA3, 0xC0EC, 0xBCA4, 0xC0F4, + 0xBCA5, 0xC0F5, 0xBCA6, 0xC0F7, 0xBCA7, 0xC0F9, 0xBCA8, 0xC100, + 0xBCA9, 0xC104, 0xBCAA, 0xC108, 0xBCAB, 0xC110, 0xBCAC, 0xC115, + 0xBCAD, 0xC11C, 0xBCAE, 0xC11D, 0xBCAF, 0xC11E, 0xBCB0, 0xC11F, + 0xBCB1, 0xC120, 0xBCB2, 0xC123, 0xBCB3, 0xC124, 0xBCB4, 0xC126, + 0xBCB5, 0xC127, 0xBCB6, 0xC12C, 0xBCB7, 0xC12D, 0xBCB8, 0xC12F, + 0xBCB9, 0xC130, 0xBCBA, 0xC131, 0xBCBB, 0xC136, 0xBCBC, 0xC138, + 0xBCBD, 0xC139, 0xBCBE, 0xC13C, 0xBCBF, 0xC140, 0xBCC0, 0xC148, + 0xBCC1, 0xC149, 0xBCC2, 0xC14B, 0xBCC3, 0xC14C, 0xBCC4, 0xC14D, + 0xBCC5, 0xC154, 0xBCC6, 0xC155, 0xBCC7, 0xC158, 0xBCC8, 0xC15C, + 0xBCC9, 0xC164, 0xBCCA, 0xC165, 0xBCCB, 0xC167, 0xBCCC, 0xC168, + 0xBCCD, 0xC169, 0xBCCE, 0xC170, 0xBCCF, 0xC174, 0xBCD0, 0xC178, + 0xBCD1, 0xC185, 0xBCD2, 0xC18C, 0xBCD3, 0xC18D, 0xBCD4, 0xC18E, + 0xBCD5, 0xC190, 0xBCD6, 0xC194, 0xBCD7, 0xC196, 0xBCD8, 0xC19C, + 0xBCD9, 0xC19D, 0xBCDA, 0xC19F, 0xBCDB, 0xC1A1, 0xBCDC, 0xC1A5, + 0xBCDD, 0xC1A8, 0xBCDE, 0xC1A9, 0xBCDF, 0xC1AC, 0xBCE0, 0xC1B0, + 0xBCE1, 0xC1BD, 0xBCE2, 0xC1C4, 0xBCE3, 0xC1C8, 0xBCE4, 0xC1CC, + 0xBCE5, 0xC1D4, 0xBCE6, 0xC1D7, 0xBCE7, 0xC1D8, 0xBCE8, 0xC1E0, + 0xBCE9, 0xC1E4, 0xBCEA, 0xC1E8, 0xBCEB, 0xC1F0, 0xBCEC, 0xC1F1, + 0xBCED, 0xC1F3, 0xBCEE, 0xC1FC, 0xBCEF, 0xC1FD, 0xBCF0, 0xC200, + 0xBCF1, 0xC204, 0xBCF2, 0xC20C, 0xBCF3, 0xC20D, 0xBCF4, 0xC20F, + 0xBCF5, 0xC211, 0xBCF6, 0xC218, 0xBCF7, 0xC219, 0xBCF8, 0xC21C, + 0xBCF9, 0xC21F, 0xBCFA, 0xC220, 0xBCFB, 0xC228, 0xBCFC, 0xC229, + 0xBCFD, 0xC22B, 0xBCFE, 0xC22D, 0xBD41, 0xD3D7, 0xBD42, 0xD3D9, + 0xBD43, 0xD3DA, 0xBD44, 0xD3DB, 0xBD45, 0xD3DC, 0xBD46, 0xD3DD, + 0xBD47, 0xD3DE, 0xBD48, 0xD3DF, 0xBD49, 0xD3E0, 0xBD4A, 0xD3E2, + 0xBD4B, 0xD3E4, 0xBD4C, 0xD3E5, 0xBD4D, 0xD3E6, 0xBD4E, 0xD3E7, + 0xBD4F, 0xD3E8, 0xBD50, 0xD3E9, 0xBD51, 0xD3EA, 0xBD52, 0xD3EB, + 0xBD53, 0xD3EE, 0xBD54, 0xD3EF, 0xBD55, 0xD3F1, 0xBD56, 0xD3F2, + 0xBD57, 0xD3F3, 0xBD58, 0xD3F5, 0xBD59, 0xD3F6, 0xBD5A, 0xD3F7, + 0xBD61, 0xD3F8, 0xBD62, 0xD3F9, 0xBD63, 0xD3FA, 0xBD64, 0xD3FB, + 0xBD65, 0xD3FE, 0xBD66, 0xD400, 0xBD67, 0xD402, 0xBD68, 0xD403, + 0xBD69, 0xD404, 0xBD6A, 0xD405, 0xBD6B, 0xD406, 0xBD6C, 0xD407, + 0xBD6D, 0xD409, 0xBD6E, 0xD40A, 0xBD6F, 0xD40B, 0xBD70, 0xD40C, + 0xBD71, 0xD40D, 0xBD72, 0xD40E, 0xBD73, 0xD40F, 0xBD74, 0xD410, + 0xBD75, 0xD411, 0xBD76, 0xD412, 0xBD77, 0xD413, 0xBD78, 0xD414, + 0xBD79, 0xD415, 0xBD7A, 0xD416, 0xBD81, 0xD417, 0xBD82, 0xD418, + 0xBD83, 0xD419, 0xBD84, 0xD41A, 0xBD85, 0xD41B, 0xBD86, 0xD41C, + 0xBD87, 0xD41E, 0xBD88, 0xD41F, 0xBD89, 0xD420, 0xBD8A, 0xD421, + 0xBD8B, 0xD422, 0xBD8C, 0xD423, 0xBD8D, 0xD424, 0xBD8E, 0xD425, + 0xBD8F, 0xD426, 0xBD90, 0xD427, 0xBD91, 0xD428, 0xBD92, 0xD429, + 0xBD93, 0xD42A, 0xBD94, 0xD42B, 0xBD95, 0xD42C, 0xBD96, 0xD42D, + 0xBD97, 0xD42E, 0xBD98, 0xD42F, 0xBD99, 0xD430, 0xBD9A, 0xD431, + 0xBD9B, 0xD432, 0xBD9C, 0xD433, 0xBD9D, 0xD434, 0xBD9E, 0xD435, + 0xBD9F, 0xD436, 0xBDA0, 0xD437, 0xBDA1, 0xC22F, 0xBDA2, 0xC231, + 0xBDA3, 0xC232, 0xBDA4, 0xC234, 0xBDA5, 0xC248, 0xBDA6, 0xC250, + 0xBDA7, 0xC251, 0xBDA8, 0xC254, 0xBDA9, 0xC258, 0xBDAA, 0xC260, + 0xBDAB, 0xC265, 0xBDAC, 0xC26C, 0xBDAD, 0xC26D, 0xBDAE, 0xC270, + 0xBDAF, 0xC274, 0xBDB0, 0xC27C, 0xBDB1, 0xC27D, 0xBDB2, 0xC27F, + 0xBDB3, 0xC281, 0xBDB4, 0xC288, 0xBDB5, 0xC289, 0xBDB6, 0xC290, + 0xBDB7, 0xC298, 0xBDB8, 0xC29B, 0xBDB9, 0xC29D, 0xBDBA, 0xC2A4, + 0xBDBB, 0xC2A5, 0xBDBC, 0xC2A8, 0xBDBD, 0xC2AC, 0xBDBE, 0xC2AD, + 0xBDBF, 0xC2B4, 0xBDC0, 0xC2B5, 0xBDC1, 0xC2B7, 0xBDC2, 0xC2B9, + 0xBDC3, 0xC2DC, 0xBDC4, 0xC2DD, 0xBDC5, 0xC2E0, 0xBDC6, 0xC2E3, + 0xBDC7, 0xC2E4, 0xBDC8, 0xC2EB, 0xBDC9, 0xC2EC, 0xBDCA, 0xC2ED, + 0xBDCB, 0xC2EF, 0xBDCC, 0xC2F1, 0xBDCD, 0xC2F6, 0xBDCE, 0xC2F8, + 0xBDCF, 0xC2F9, 0xBDD0, 0xC2FB, 0xBDD1, 0xC2FC, 0xBDD2, 0xC300, + 0xBDD3, 0xC308, 0xBDD4, 0xC309, 0xBDD5, 0xC30C, 0xBDD6, 0xC30D, + 0xBDD7, 0xC313, 0xBDD8, 0xC314, 0xBDD9, 0xC315, 0xBDDA, 0xC318, + 0xBDDB, 0xC31C, 0xBDDC, 0xC324, 0xBDDD, 0xC325, 0xBDDE, 0xC328, + 0xBDDF, 0xC329, 0xBDE0, 0xC345, 0xBDE1, 0xC368, 0xBDE2, 0xC369, + 0xBDE3, 0xC36C, 0xBDE4, 0xC370, 0xBDE5, 0xC372, 0xBDE6, 0xC378, + 0xBDE7, 0xC379, 0xBDE8, 0xC37C, 0xBDE9, 0xC37D, 0xBDEA, 0xC384, + 0xBDEB, 0xC388, 0xBDEC, 0xC38C, 0xBDED, 0xC3C0, 0xBDEE, 0xC3D8, + 0xBDEF, 0xC3D9, 0xBDF0, 0xC3DC, 0xBDF1, 0xC3DF, 0xBDF2, 0xC3E0, + 0xBDF3, 0xC3E2, 0xBDF4, 0xC3E8, 0xBDF5, 0xC3E9, 0xBDF6, 0xC3ED, + 0xBDF7, 0xC3F4, 0xBDF8, 0xC3F5, 0xBDF9, 0xC3F8, 0xBDFA, 0xC408, + 0xBDFB, 0xC410, 0xBDFC, 0xC424, 0xBDFD, 0xC42C, 0xBDFE, 0xC430, + 0xBE41, 0xD438, 0xBE42, 0xD439, 0xBE43, 0xD43A, 0xBE44, 0xD43B, + 0xBE45, 0xD43C, 0xBE46, 0xD43D, 0xBE47, 0xD43E, 0xBE48, 0xD43F, + 0xBE49, 0xD441, 0xBE4A, 0xD442, 0xBE4B, 0xD443, 0xBE4C, 0xD445, + 0xBE4D, 0xD446, 0xBE4E, 0xD447, 0xBE4F, 0xD448, 0xBE50, 0xD449, + 0xBE51, 0xD44A, 0xBE52, 0xD44B, 0xBE53, 0xD44C, 0xBE54, 0xD44D, + 0xBE55, 0xD44E, 0xBE56, 0xD44F, 0xBE57, 0xD450, 0xBE58, 0xD451, + 0xBE59, 0xD452, 0xBE5A, 0xD453, 0xBE61, 0xD454, 0xBE62, 0xD455, + 0xBE63, 0xD456, 0xBE64, 0xD457, 0xBE65, 0xD458, 0xBE66, 0xD459, + 0xBE67, 0xD45A, 0xBE68, 0xD45B, 0xBE69, 0xD45D, 0xBE6A, 0xD45E, + 0xBE6B, 0xD45F, 0xBE6C, 0xD461, 0xBE6D, 0xD462, 0xBE6E, 0xD463, + 0xBE6F, 0xD465, 0xBE70, 0xD466, 0xBE71, 0xD467, 0xBE72, 0xD468, + 0xBE73, 0xD469, 0xBE74, 0xD46A, 0xBE75, 0xD46B, 0xBE76, 0xD46C, + 0xBE77, 0xD46E, 0xBE78, 0xD470, 0xBE79, 0xD471, 0xBE7A, 0xD472, + 0xBE81, 0xD473, 0xBE82, 0xD474, 0xBE83, 0xD475, 0xBE84, 0xD476, + 0xBE85, 0xD477, 0xBE86, 0xD47A, 0xBE87, 0xD47B, 0xBE88, 0xD47D, + 0xBE89, 0xD47E, 0xBE8A, 0xD481, 0xBE8B, 0xD483, 0xBE8C, 0xD484, + 0xBE8D, 0xD485, 0xBE8E, 0xD486, 0xBE8F, 0xD487, 0xBE90, 0xD48A, + 0xBE91, 0xD48C, 0xBE92, 0xD48E, 0xBE93, 0xD48F, 0xBE94, 0xD490, + 0xBE95, 0xD491, 0xBE96, 0xD492, 0xBE97, 0xD493, 0xBE98, 0xD495, + 0xBE99, 0xD496, 0xBE9A, 0xD497, 0xBE9B, 0xD498, 0xBE9C, 0xD499, + 0xBE9D, 0xD49A, 0xBE9E, 0xD49B, 0xBE9F, 0xD49C, 0xBEA0, 0xD49D, + 0xBEA1, 0xC434, 0xBEA2, 0xC43C, 0xBEA3, 0xC43D, 0xBEA4, 0xC448, + 0xBEA5, 0xC464, 0xBEA6, 0xC465, 0xBEA7, 0xC468, 0xBEA8, 0xC46C, + 0xBEA9, 0xC474, 0xBEAA, 0xC475, 0xBEAB, 0xC479, 0xBEAC, 0xC480, + 0xBEAD, 0xC494, 0xBEAE, 0xC49C, 0xBEAF, 0xC4B8, 0xBEB0, 0xC4BC, + 0xBEB1, 0xC4E9, 0xBEB2, 0xC4F0, 0xBEB3, 0xC4F1, 0xBEB4, 0xC4F4, + 0xBEB5, 0xC4F8, 0xBEB6, 0xC4FA, 0xBEB7, 0xC4FF, 0xBEB8, 0xC500, + 0xBEB9, 0xC501, 0xBEBA, 0xC50C, 0xBEBB, 0xC510, 0xBEBC, 0xC514, + 0xBEBD, 0xC51C, 0xBEBE, 0xC528, 0xBEBF, 0xC529, 0xBEC0, 0xC52C, + 0xBEC1, 0xC530, 0xBEC2, 0xC538, 0xBEC3, 0xC539, 0xBEC4, 0xC53B, + 0xBEC5, 0xC53D, 0xBEC6, 0xC544, 0xBEC7, 0xC545, 0xBEC8, 0xC548, + 0xBEC9, 0xC549, 0xBECA, 0xC54A, 0xBECB, 0xC54C, 0xBECC, 0xC54D, + 0xBECD, 0xC54E, 0xBECE, 0xC553, 0xBECF, 0xC554, 0xBED0, 0xC555, + 0xBED1, 0xC557, 0xBED2, 0xC558, 0xBED3, 0xC559, 0xBED4, 0xC55D, + 0xBED5, 0xC55E, 0xBED6, 0xC560, 0xBED7, 0xC561, 0xBED8, 0xC564, + 0xBED9, 0xC568, 0xBEDA, 0xC570, 0xBEDB, 0xC571, 0xBEDC, 0xC573, + 0xBEDD, 0xC574, 0xBEDE, 0xC575, 0xBEDF, 0xC57C, 0xBEE0, 0xC57D, + 0xBEE1, 0xC580, 0xBEE2, 0xC584, 0xBEE3, 0xC587, 0xBEE4, 0xC58C, + 0xBEE5, 0xC58D, 0xBEE6, 0xC58F, 0xBEE7, 0xC591, 0xBEE8, 0xC595, + 0xBEE9, 0xC597, 0xBEEA, 0xC598, 0xBEEB, 0xC59C, 0xBEEC, 0xC5A0, + 0xBEED, 0xC5A9, 0xBEEE, 0xC5B4, 0xBEEF, 0xC5B5, 0xBEF0, 0xC5B8, + 0xBEF1, 0xC5B9, 0xBEF2, 0xC5BB, 0xBEF3, 0xC5BC, 0xBEF4, 0xC5BD, + 0xBEF5, 0xC5BE, 0xBEF6, 0xC5C4, 0xBEF7, 0xC5C5, 0xBEF8, 0xC5C6, + 0xBEF9, 0xC5C7, 0xBEFA, 0xC5C8, 0xBEFB, 0xC5C9, 0xBEFC, 0xC5CA, + 0xBEFD, 0xC5CC, 0xBEFE, 0xC5CE, 0xBF41, 0xD49E, 0xBF42, 0xD49F, + 0xBF43, 0xD4A0, 0xBF44, 0xD4A1, 0xBF45, 0xD4A2, 0xBF46, 0xD4A3, + 0xBF47, 0xD4A4, 0xBF48, 0xD4A5, 0xBF49, 0xD4A6, 0xBF4A, 0xD4A7, + 0xBF4B, 0xD4A8, 0xBF4C, 0xD4AA, 0xBF4D, 0xD4AB, 0xBF4E, 0xD4AC, + 0xBF4F, 0xD4AD, 0xBF50, 0xD4AE, 0xBF51, 0xD4AF, 0xBF52, 0xD4B0, + 0xBF53, 0xD4B1, 0xBF54, 0xD4B2, 0xBF55, 0xD4B3, 0xBF56, 0xD4B4, + 0xBF57, 0xD4B5, 0xBF58, 0xD4B6, 0xBF59, 0xD4B7, 0xBF5A, 0xD4B8, + 0xBF61, 0xD4B9, 0xBF62, 0xD4BA, 0xBF63, 0xD4BB, 0xBF64, 0xD4BC, + 0xBF65, 0xD4BD, 0xBF66, 0xD4BE, 0xBF67, 0xD4BF, 0xBF68, 0xD4C0, + 0xBF69, 0xD4C1, 0xBF6A, 0xD4C2, 0xBF6B, 0xD4C3, 0xBF6C, 0xD4C4, + 0xBF6D, 0xD4C5, 0xBF6E, 0xD4C6, 0xBF6F, 0xD4C7, 0xBF70, 0xD4C8, + 0xBF71, 0xD4C9, 0xBF72, 0xD4CA, 0xBF73, 0xD4CB, 0xBF74, 0xD4CD, + 0xBF75, 0xD4CE, 0xBF76, 0xD4CF, 0xBF77, 0xD4D1, 0xBF78, 0xD4D2, + 0xBF79, 0xD4D3, 0xBF7A, 0xD4D5, 0xBF81, 0xD4D6, 0xBF82, 0xD4D7, + 0xBF83, 0xD4D8, 0xBF84, 0xD4D9, 0xBF85, 0xD4DA, 0xBF86, 0xD4DB, + 0xBF87, 0xD4DD, 0xBF88, 0xD4DE, 0xBF89, 0xD4E0, 0xBF8A, 0xD4E1, + 0xBF8B, 0xD4E2, 0xBF8C, 0xD4E3, 0xBF8D, 0xD4E4, 0xBF8E, 0xD4E5, + 0xBF8F, 0xD4E6, 0xBF90, 0xD4E7, 0xBF91, 0xD4E9, 0xBF92, 0xD4EA, + 0xBF93, 0xD4EB, 0xBF94, 0xD4ED, 0xBF95, 0xD4EE, 0xBF96, 0xD4EF, + 0xBF97, 0xD4F1, 0xBF98, 0xD4F2, 0xBF99, 0xD4F3, 0xBF9A, 0xD4F4, + 0xBF9B, 0xD4F5, 0xBF9C, 0xD4F6, 0xBF9D, 0xD4F7, 0xBF9E, 0xD4F9, + 0xBF9F, 0xD4FA, 0xBFA0, 0xD4FC, 0xBFA1, 0xC5D0, 0xBFA2, 0xC5D1, + 0xBFA3, 0xC5D4, 0xBFA4, 0xC5D8, 0xBFA5, 0xC5E0, 0xBFA6, 0xC5E1, + 0xBFA7, 0xC5E3, 0xBFA8, 0xC5E5, 0xBFA9, 0xC5EC, 0xBFAA, 0xC5ED, + 0xBFAB, 0xC5EE, 0xBFAC, 0xC5F0, 0xBFAD, 0xC5F4, 0xBFAE, 0xC5F6, + 0xBFAF, 0xC5F7, 0xBFB0, 0xC5FC, 0xBFB1, 0xC5FD, 0xBFB2, 0xC5FE, + 0xBFB3, 0xC5FF, 0xBFB4, 0xC600, 0xBFB5, 0xC601, 0xBFB6, 0xC605, + 0xBFB7, 0xC606, 0xBFB8, 0xC607, 0xBFB9, 0xC608, 0xBFBA, 0xC60C, + 0xBFBB, 0xC610, 0xBFBC, 0xC618, 0xBFBD, 0xC619, 0xBFBE, 0xC61B, + 0xBFBF, 0xC61C, 0xBFC0, 0xC624, 0xBFC1, 0xC625, 0xBFC2, 0xC628, + 0xBFC3, 0xC62C, 0xBFC4, 0xC62D, 0xBFC5, 0xC62E, 0xBFC6, 0xC630, + 0xBFC7, 0xC633, 0xBFC8, 0xC634, 0xBFC9, 0xC635, 0xBFCA, 0xC637, + 0xBFCB, 0xC639, 0xBFCC, 0xC63B, 0xBFCD, 0xC640, 0xBFCE, 0xC641, + 0xBFCF, 0xC644, 0xBFD0, 0xC648, 0xBFD1, 0xC650, 0xBFD2, 0xC651, + 0xBFD3, 0xC653, 0xBFD4, 0xC654, 0xBFD5, 0xC655, 0xBFD6, 0xC65C, + 0xBFD7, 0xC65D, 0xBFD8, 0xC660, 0xBFD9, 0xC66C, 0xBFDA, 0xC66F, + 0xBFDB, 0xC671, 0xBFDC, 0xC678, 0xBFDD, 0xC679, 0xBFDE, 0xC67C, + 0xBFDF, 0xC680, 0xBFE0, 0xC688, 0xBFE1, 0xC689, 0xBFE2, 0xC68B, + 0xBFE3, 0xC68D, 0xBFE4, 0xC694, 0xBFE5, 0xC695, 0xBFE6, 0xC698, + 0xBFE7, 0xC69C, 0xBFE8, 0xC6A4, 0xBFE9, 0xC6A5, 0xBFEA, 0xC6A7, + 0xBFEB, 0xC6A9, 0xBFEC, 0xC6B0, 0xBFED, 0xC6B1, 0xBFEE, 0xC6B4, + 0xBFEF, 0xC6B8, 0xBFF0, 0xC6B9, 0xBFF1, 0xC6BA, 0xBFF2, 0xC6C0, + 0xBFF3, 0xC6C1, 0xBFF4, 0xC6C3, 0xBFF5, 0xC6C5, 0xBFF6, 0xC6CC, + 0xBFF7, 0xC6CD, 0xBFF8, 0xC6D0, 0xBFF9, 0xC6D4, 0xBFFA, 0xC6DC, + 0xBFFB, 0xC6DD, 0xBFFC, 0xC6E0, 0xBFFD, 0xC6E1, 0xBFFE, 0xC6E8, + 0xC041, 0xD4FE, 0xC042, 0xD4FF, 0xC043, 0xD500, 0xC044, 0xD501, + 0xC045, 0xD502, 0xC046, 0xD503, 0xC047, 0xD505, 0xC048, 0xD506, + 0xC049, 0xD507, 0xC04A, 0xD509, 0xC04B, 0xD50A, 0xC04C, 0xD50B, + 0xC04D, 0xD50D, 0xC04E, 0xD50E, 0xC04F, 0xD50F, 0xC050, 0xD510, + 0xC051, 0xD511, 0xC052, 0xD512, 0xC053, 0xD513, 0xC054, 0xD516, + 0xC055, 0xD518, 0xC056, 0xD519, 0xC057, 0xD51A, 0xC058, 0xD51B, + 0xC059, 0xD51C, 0xC05A, 0xD51D, 0xC061, 0xD51E, 0xC062, 0xD51F, + 0xC063, 0xD520, 0xC064, 0xD521, 0xC065, 0xD522, 0xC066, 0xD523, + 0xC067, 0xD524, 0xC068, 0xD525, 0xC069, 0xD526, 0xC06A, 0xD527, + 0xC06B, 0xD528, 0xC06C, 0xD529, 0xC06D, 0xD52A, 0xC06E, 0xD52B, + 0xC06F, 0xD52C, 0xC070, 0xD52D, 0xC071, 0xD52E, 0xC072, 0xD52F, + 0xC073, 0xD530, 0xC074, 0xD531, 0xC075, 0xD532, 0xC076, 0xD533, + 0xC077, 0xD534, 0xC078, 0xD535, 0xC079, 0xD536, 0xC07A, 0xD537, + 0xC081, 0xD538, 0xC082, 0xD539, 0xC083, 0xD53A, 0xC084, 0xD53B, + 0xC085, 0xD53E, 0xC086, 0xD53F, 0xC087, 0xD541, 0xC088, 0xD542, + 0xC089, 0xD543, 0xC08A, 0xD545, 0xC08B, 0xD546, 0xC08C, 0xD547, + 0xC08D, 0xD548, 0xC08E, 0xD549, 0xC08F, 0xD54A, 0xC090, 0xD54B, + 0xC091, 0xD54E, 0xC092, 0xD550, 0xC093, 0xD552, 0xC094, 0xD553, + 0xC095, 0xD554, 0xC096, 0xD555, 0xC097, 0xD556, 0xC098, 0xD557, + 0xC099, 0xD55A, 0xC09A, 0xD55B, 0xC09B, 0xD55D, 0xC09C, 0xD55E, + 0xC09D, 0xD55F, 0xC09E, 0xD561, 0xC09F, 0xD562, 0xC0A0, 0xD563, + 0xC0A1, 0xC6E9, 0xC0A2, 0xC6EC, 0xC0A3, 0xC6F0, 0xC0A4, 0xC6F8, + 0xC0A5, 0xC6F9, 0xC0A6, 0xC6FD, 0xC0A7, 0xC704, 0xC0A8, 0xC705, + 0xC0A9, 0xC708, 0xC0AA, 0xC70C, 0xC0AB, 0xC714, 0xC0AC, 0xC715, + 0xC0AD, 0xC717, 0xC0AE, 0xC719, 0xC0AF, 0xC720, 0xC0B0, 0xC721, + 0xC0B1, 0xC724, 0xC0B2, 0xC728, 0xC0B3, 0xC730, 0xC0B4, 0xC731, + 0xC0B5, 0xC733, 0xC0B6, 0xC735, 0xC0B7, 0xC737, 0xC0B8, 0xC73C, + 0xC0B9, 0xC73D, 0xC0BA, 0xC740, 0xC0BB, 0xC744, 0xC0BC, 0xC74A, + 0xC0BD, 0xC74C, 0xC0BE, 0xC74D, 0xC0BF, 0xC74F, 0xC0C0, 0xC751, + 0xC0C1, 0xC752, 0xC0C2, 0xC753, 0xC0C3, 0xC754, 0xC0C4, 0xC755, + 0xC0C5, 0xC756, 0xC0C6, 0xC757, 0xC0C7, 0xC758, 0xC0C8, 0xC75C, + 0xC0C9, 0xC760, 0xC0CA, 0xC768, 0xC0CB, 0xC76B, 0xC0CC, 0xC774, + 0xC0CD, 0xC775, 0xC0CE, 0xC778, 0xC0CF, 0xC77C, 0xC0D0, 0xC77D, + 0xC0D1, 0xC77E, 0xC0D2, 0xC783, 0xC0D3, 0xC784, 0xC0D4, 0xC785, + 0xC0D5, 0xC787, 0xC0D6, 0xC788, 0xC0D7, 0xC789, 0xC0D8, 0xC78A, + 0xC0D9, 0xC78E, 0xC0DA, 0xC790, 0xC0DB, 0xC791, 0xC0DC, 0xC794, + 0xC0DD, 0xC796, 0xC0DE, 0xC797, 0xC0DF, 0xC798, 0xC0E0, 0xC79A, + 0xC0E1, 0xC7A0, 0xC0E2, 0xC7A1, 0xC0E3, 0xC7A3, 0xC0E4, 0xC7A4, + 0xC0E5, 0xC7A5, 0xC0E6, 0xC7A6, 0xC0E7, 0xC7AC, 0xC0E8, 0xC7AD, + 0xC0E9, 0xC7B0, 0xC0EA, 0xC7B4, 0xC0EB, 0xC7BC, 0xC0EC, 0xC7BD, + 0xC0ED, 0xC7BF, 0xC0EE, 0xC7C0, 0xC0EF, 0xC7C1, 0xC0F0, 0xC7C8, + 0xC0F1, 0xC7C9, 0xC0F2, 0xC7CC, 0xC0F3, 0xC7CE, 0xC0F4, 0xC7D0, + 0xC0F5, 0xC7D8, 0xC0F6, 0xC7DD, 0xC0F7, 0xC7E4, 0xC0F8, 0xC7E8, + 0xC0F9, 0xC7EC, 0xC0FA, 0xC800, 0xC0FB, 0xC801, 0xC0FC, 0xC804, + 0xC0FD, 0xC808, 0xC0FE, 0xC80A, 0xC141, 0xD564, 0xC142, 0xD566, + 0xC143, 0xD567, 0xC144, 0xD56A, 0xC145, 0xD56C, 0xC146, 0xD56E, + 0xC147, 0xD56F, 0xC148, 0xD570, 0xC149, 0xD571, 0xC14A, 0xD572, + 0xC14B, 0xD573, 0xC14C, 0xD576, 0xC14D, 0xD577, 0xC14E, 0xD579, + 0xC14F, 0xD57A, 0xC150, 0xD57B, 0xC151, 0xD57D, 0xC152, 0xD57E, + 0xC153, 0xD57F, 0xC154, 0xD580, 0xC155, 0xD581, 0xC156, 0xD582, + 0xC157, 0xD583, 0xC158, 0xD586, 0xC159, 0xD58A, 0xC15A, 0xD58B, + 0xC161, 0xD58C, 0xC162, 0xD58D, 0xC163, 0xD58E, 0xC164, 0xD58F, + 0xC165, 0xD591, 0xC166, 0xD592, 0xC167, 0xD593, 0xC168, 0xD594, + 0xC169, 0xD595, 0xC16A, 0xD596, 0xC16B, 0xD597, 0xC16C, 0xD598, + 0xC16D, 0xD599, 0xC16E, 0xD59A, 0xC16F, 0xD59B, 0xC170, 0xD59C, + 0xC171, 0xD59D, 0xC172, 0xD59E, 0xC173, 0xD59F, 0xC174, 0xD5A0, + 0xC175, 0xD5A1, 0xC176, 0xD5A2, 0xC177, 0xD5A3, 0xC178, 0xD5A4, + 0xC179, 0xD5A6, 0xC17A, 0xD5A7, 0xC181, 0xD5A8, 0xC182, 0xD5A9, + 0xC183, 0xD5AA, 0xC184, 0xD5AB, 0xC185, 0xD5AC, 0xC186, 0xD5AD, + 0xC187, 0xD5AE, 0xC188, 0xD5AF, 0xC189, 0xD5B0, 0xC18A, 0xD5B1, + 0xC18B, 0xD5B2, 0xC18C, 0xD5B3, 0xC18D, 0xD5B4, 0xC18E, 0xD5B5, + 0xC18F, 0xD5B6, 0xC190, 0xD5B7, 0xC191, 0xD5B8, 0xC192, 0xD5B9, + 0xC193, 0xD5BA, 0xC194, 0xD5BB, 0xC195, 0xD5BC, 0xC196, 0xD5BD, + 0xC197, 0xD5BE, 0xC198, 0xD5BF, 0xC199, 0xD5C0, 0xC19A, 0xD5C1, + 0xC19B, 0xD5C2, 0xC19C, 0xD5C3, 0xC19D, 0xD5C4, 0xC19E, 0xD5C5, + 0xC19F, 0xD5C6, 0xC1A0, 0xD5C7, 0xC1A1, 0xC810, 0xC1A2, 0xC811, + 0xC1A3, 0xC813, 0xC1A4, 0xC815, 0xC1A5, 0xC816, 0xC1A6, 0xC81C, + 0xC1A7, 0xC81D, 0xC1A8, 0xC820, 0xC1A9, 0xC824, 0xC1AA, 0xC82C, + 0xC1AB, 0xC82D, 0xC1AC, 0xC82F, 0xC1AD, 0xC831, 0xC1AE, 0xC838, + 0xC1AF, 0xC83C, 0xC1B0, 0xC840, 0xC1B1, 0xC848, 0xC1B2, 0xC849, + 0xC1B3, 0xC84C, 0xC1B4, 0xC84D, 0xC1B5, 0xC854, 0xC1B6, 0xC870, + 0xC1B7, 0xC871, 0xC1B8, 0xC874, 0xC1B9, 0xC878, 0xC1BA, 0xC87A, + 0xC1BB, 0xC880, 0xC1BC, 0xC881, 0xC1BD, 0xC883, 0xC1BE, 0xC885, + 0xC1BF, 0xC886, 0xC1C0, 0xC887, 0xC1C1, 0xC88B, 0xC1C2, 0xC88C, + 0xC1C3, 0xC88D, 0xC1C4, 0xC894, 0xC1C5, 0xC89D, 0xC1C6, 0xC89F, + 0xC1C7, 0xC8A1, 0xC1C8, 0xC8A8, 0xC1C9, 0xC8BC, 0xC1CA, 0xC8BD, + 0xC1CB, 0xC8C4, 0xC1CC, 0xC8C8, 0xC1CD, 0xC8CC, 0xC1CE, 0xC8D4, + 0xC1CF, 0xC8D5, 0xC1D0, 0xC8D7, 0xC1D1, 0xC8D9, 0xC1D2, 0xC8E0, + 0xC1D3, 0xC8E1, 0xC1D4, 0xC8E4, 0xC1D5, 0xC8F5, 0xC1D6, 0xC8FC, + 0xC1D7, 0xC8FD, 0xC1D8, 0xC900, 0xC1D9, 0xC904, 0xC1DA, 0xC905, + 0xC1DB, 0xC906, 0xC1DC, 0xC90C, 0xC1DD, 0xC90D, 0xC1DE, 0xC90F, + 0xC1DF, 0xC911, 0xC1E0, 0xC918, 0xC1E1, 0xC92C, 0xC1E2, 0xC934, + 0xC1E3, 0xC950, 0xC1E4, 0xC951, 0xC1E5, 0xC954, 0xC1E6, 0xC958, + 0xC1E7, 0xC960, 0xC1E8, 0xC961, 0xC1E9, 0xC963, 0xC1EA, 0xC96C, + 0xC1EB, 0xC970, 0xC1EC, 0xC974, 0xC1ED, 0xC97C, 0xC1EE, 0xC988, + 0xC1EF, 0xC989, 0xC1F0, 0xC98C, 0xC1F1, 0xC990, 0xC1F2, 0xC998, + 0xC1F3, 0xC999, 0xC1F4, 0xC99B, 0xC1F5, 0xC99D, 0xC1F6, 0xC9C0, + 0xC1F7, 0xC9C1, 0xC1F8, 0xC9C4, 0xC1F9, 0xC9C7, 0xC1FA, 0xC9C8, + 0xC1FB, 0xC9CA, 0xC1FC, 0xC9D0, 0xC1FD, 0xC9D1, 0xC1FE, 0xC9D3, + 0xC241, 0xD5CA, 0xC242, 0xD5CB, 0xC243, 0xD5CD, 0xC244, 0xD5CE, + 0xC245, 0xD5CF, 0xC246, 0xD5D1, 0xC247, 0xD5D3, 0xC248, 0xD5D4, + 0xC249, 0xD5D5, 0xC24A, 0xD5D6, 0xC24B, 0xD5D7, 0xC24C, 0xD5DA, + 0xC24D, 0xD5DC, 0xC24E, 0xD5DE, 0xC24F, 0xD5DF, 0xC250, 0xD5E0, + 0xC251, 0xD5E1, 0xC252, 0xD5E2, 0xC253, 0xD5E3, 0xC254, 0xD5E6, + 0xC255, 0xD5E7, 0xC256, 0xD5E9, 0xC257, 0xD5EA, 0xC258, 0xD5EB, + 0xC259, 0xD5ED, 0xC25A, 0xD5EE, 0xC261, 0xD5EF, 0xC262, 0xD5F0, + 0xC263, 0xD5F1, 0xC264, 0xD5F2, 0xC265, 0xD5F3, 0xC266, 0xD5F6, + 0xC267, 0xD5F8, 0xC268, 0xD5FA, 0xC269, 0xD5FB, 0xC26A, 0xD5FC, + 0xC26B, 0xD5FD, 0xC26C, 0xD5FE, 0xC26D, 0xD5FF, 0xC26E, 0xD602, + 0xC26F, 0xD603, 0xC270, 0xD605, 0xC271, 0xD606, 0xC272, 0xD607, + 0xC273, 0xD609, 0xC274, 0xD60A, 0xC275, 0xD60B, 0xC276, 0xD60C, + 0xC277, 0xD60D, 0xC278, 0xD60E, 0xC279, 0xD60F, 0xC27A, 0xD612, + 0xC281, 0xD616, 0xC282, 0xD617, 0xC283, 0xD618, 0xC284, 0xD619, + 0xC285, 0xD61A, 0xC286, 0xD61B, 0xC287, 0xD61D, 0xC288, 0xD61E, + 0xC289, 0xD61F, 0xC28A, 0xD621, 0xC28B, 0xD622, 0xC28C, 0xD623, + 0xC28D, 0xD625, 0xC28E, 0xD626, 0xC28F, 0xD627, 0xC290, 0xD628, + 0xC291, 0xD629, 0xC292, 0xD62A, 0xC293, 0xD62B, 0xC294, 0xD62C, + 0xC295, 0xD62E, 0xC296, 0xD62F, 0xC297, 0xD630, 0xC298, 0xD631, + 0xC299, 0xD632, 0xC29A, 0xD633, 0xC29B, 0xD634, 0xC29C, 0xD635, + 0xC29D, 0xD636, 0xC29E, 0xD637, 0xC29F, 0xD63A, 0xC2A0, 0xD63B, + 0xC2A1, 0xC9D5, 0xC2A2, 0xC9D6, 0xC2A3, 0xC9D9, 0xC2A4, 0xC9DA, + 0xC2A5, 0xC9DC, 0xC2A6, 0xC9DD, 0xC2A7, 0xC9E0, 0xC2A8, 0xC9E2, + 0xC2A9, 0xC9E4, 0xC2AA, 0xC9E7, 0xC2AB, 0xC9EC, 0xC2AC, 0xC9ED, + 0xC2AD, 0xC9EF, 0xC2AE, 0xC9F0, 0xC2AF, 0xC9F1, 0xC2B0, 0xC9F8, + 0xC2B1, 0xC9F9, 0xC2B2, 0xC9FC, 0xC2B3, 0xCA00, 0xC2B4, 0xCA08, + 0xC2B5, 0xCA09, 0xC2B6, 0xCA0B, 0xC2B7, 0xCA0C, 0xC2B8, 0xCA0D, + 0xC2B9, 0xCA14, 0xC2BA, 0xCA18, 0xC2BB, 0xCA29, 0xC2BC, 0xCA4C, + 0xC2BD, 0xCA4D, 0xC2BE, 0xCA50, 0xC2BF, 0xCA54, 0xC2C0, 0xCA5C, + 0xC2C1, 0xCA5D, 0xC2C2, 0xCA5F, 0xC2C3, 0xCA60, 0xC2C4, 0xCA61, + 0xC2C5, 0xCA68, 0xC2C6, 0xCA7D, 0xC2C7, 0xCA84, 0xC2C8, 0xCA98, + 0xC2C9, 0xCABC, 0xC2CA, 0xCABD, 0xC2CB, 0xCAC0, 0xC2CC, 0xCAC4, + 0xC2CD, 0xCACC, 0xC2CE, 0xCACD, 0xC2CF, 0xCACF, 0xC2D0, 0xCAD1, + 0xC2D1, 0xCAD3, 0xC2D2, 0xCAD8, 0xC2D3, 0xCAD9, 0xC2D4, 0xCAE0, + 0xC2D5, 0xCAEC, 0xC2D6, 0xCAF4, 0xC2D7, 0xCB08, 0xC2D8, 0xCB10, + 0xC2D9, 0xCB14, 0xC2DA, 0xCB18, 0xC2DB, 0xCB20, 0xC2DC, 0xCB21, + 0xC2DD, 0xCB41, 0xC2DE, 0xCB48, 0xC2DF, 0xCB49, 0xC2E0, 0xCB4C, + 0xC2E1, 0xCB50, 0xC2E2, 0xCB58, 0xC2E3, 0xCB59, 0xC2E4, 0xCB5D, + 0xC2E5, 0xCB64, 0xC2E6, 0xCB78, 0xC2E7, 0xCB79, 0xC2E8, 0xCB9C, + 0xC2E9, 0xCBB8, 0xC2EA, 0xCBD4, 0xC2EB, 0xCBE4, 0xC2EC, 0xCBE7, + 0xC2ED, 0xCBE9, 0xC2EE, 0xCC0C, 0xC2EF, 0xCC0D, 0xC2F0, 0xCC10, + 0xC2F1, 0xCC14, 0xC2F2, 0xCC1C, 0xC2F3, 0xCC1D, 0xC2F4, 0xCC21, + 0xC2F5, 0xCC22, 0xC2F6, 0xCC27, 0xC2F7, 0xCC28, 0xC2F8, 0xCC29, + 0xC2F9, 0xCC2C, 0xC2FA, 0xCC2E, 0xC2FB, 0xCC30, 0xC2FC, 0xCC38, + 0xC2FD, 0xCC39, 0xC2FE, 0xCC3B, 0xC341, 0xD63D, 0xC342, 0xD63E, + 0xC343, 0xD63F, 0xC344, 0xD641, 0xC345, 0xD642, 0xC346, 0xD643, + 0xC347, 0xD644, 0xC348, 0xD646, 0xC349, 0xD647, 0xC34A, 0xD64A, + 0xC34B, 0xD64C, 0xC34C, 0xD64E, 0xC34D, 0xD64F, 0xC34E, 0xD650, + 0xC34F, 0xD652, 0xC350, 0xD653, 0xC351, 0xD656, 0xC352, 0xD657, + 0xC353, 0xD659, 0xC354, 0xD65A, 0xC355, 0xD65B, 0xC356, 0xD65D, + 0xC357, 0xD65E, 0xC358, 0xD65F, 0xC359, 0xD660, 0xC35A, 0xD661, + 0xC361, 0xD662, 0xC362, 0xD663, 0xC363, 0xD664, 0xC364, 0xD665, + 0xC365, 0xD666, 0xC366, 0xD668, 0xC367, 0xD66A, 0xC368, 0xD66B, + 0xC369, 0xD66C, 0xC36A, 0xD66D, 0xC36B, 0xD66E, 0xC36C, 0xD66F, + 0xC36D, 0xD672, 0xC36E, 0xD673, 0xC36F, 0xD675, 0xC370, 0xD676, + 0xC371, 0xD677, 0xC372, 0xD678, 0xC373, 0xD679, 0xC374, 0xD67A, + 0xC375, 0xD67B, 0xC376, 0xD67C, 0xC377, 0xD67D, 0xC378, 0xD67E, + 0xC379, 0xD67F, 0xC37A, 0xD680, 0xC381, 0xD681, 0xC382, 0xD682, + 0xC383, 0xD684, 0xC384, 0xD686, 0xC385, 0xD687, 0xC386, 0xD688, + 0xC387, 0xD689, 0xC388, 0xD68A, 0xC389, 0xD68B, 0xC38A, 0xD68E, + 0xC38B, 0xD68F, 0xC38C, 0xD691, 0xC38D, 0xD692, 0xC38E, 0xD693, + 0xC38F, 0xD695, 0xC390, 0xD696, 0xC391, 0xD697, 0xC392, 0xD698, + 0xC393, 0xD699, 0xC394, 0xD69A, 0xC395, 0xD69B, 0xC396, 0xD69C, + 0xC397, 0xD69E, 0xC398, 0xD6A0, 0xC399, 0xD6A2, 0xC39A, 0xD6A3, + 0xC39B, 0xD6A4, 0xC39C, 0xD6A5, 0xC39D, 0xD6A6, 0xC39E, 0xD6A7, + 0xC39F, 0xD6A9, 0xC3A0, 0xD6AA, 0xC3A1, 0xCC3C, 0xC3A2, 0xCC3D, + 0xC3A3, 0xCC3E, 0xC3A4, 0xCC44, 0xC3A5, 0xCC45, 0xC3A6, 0xCC48, + 0xC3A7, 0xCC4C, 0xC3A8, 0xCC54, 0xC3A9, 0xCC55, 0xC3AA, 0xCC57, + 0xC3AB, 0xCC58, 0xC3AC, 0xCC59, 0xC3AD, 0xCC60, 0xC3AE, 0xCC64, + 0xC3AF, 0xCC66, 0xC3B0, 0xCC68, 0xC3B1, 0xCC70, 0xC3B2, 0xCC75, + 0xC3B3, 0xCC98, 0xC3B4, 0xCC99, 0xC3B5, 0xCC9C, 0xC3B6, 0xCCA0, + 0xC3B7, 0xCCA8, 0xC3B8, 0xCCA9, 0xC3B9, 0xCCAB, 0xC3BA, 0xCCAC, + 0xC3BB, 0xCCAD, 0xC3BC, 0xCCB4, 0xC3BD, 0xCCB5, 0xC3BE, 0xCCB8, + 0xC3BF, 0xCCBC, 0xC3C0, 0xCCC4, 0xC3C1, 0xCCC5, 0xC3C2, 0xCCC7, + 0xC3C3, 0xCCC9, 0xC3C4, 0xCCD0, 0xC3C5, 0xCCD4, 0xC3C6, 0xCCE4, + 0xC3C7, 0xCCEC, 0xC3C8, 0xCCF0, 0xC3C9, 0xCD01, 0xC3CA, 0xCD08, + 0xC3CB, 0xCD09, 0xC3CC, 0xCD0C, 0xC3CD, 0xCD10, 0xC3CE, 0xCD18, + 0xC3CF, 0xCD19, 0xC3D0, 0xCD1B, 0xC3D1, 0xCD1D, 0xC3D2, 0xCD24, + 0xC3D3, 0xCD28, 0xC3D4, 0xCD2C, 0xC3D5, 0xCD39, 0xC3D6, 0xCD5C, + 0xC3D7, 0xCD60, 0xC3D8, 0xCD64, 0xC3D9, 0xCD6C, 0xC3DA, 0xCD6D, + 0xC3DB, 0xCD6F, 0xC3DC, 0xCD71, 0xC3DD, 0xCD78, 0xC3DE, 0xCD88, + 0xC3DF, 0xCD94, 0xC3E0, 0xCD95, 0xC3E1, 0xCD98, 0xC3E2, 0xCD9C, + 0xC3E3, 0xCDA4, 0xC3E4, 0xCDA5, 0xC3E5, 0xCDA7, 0xC3E6, 0xCDA9, + 0xC3E7, 0xCDB0, 0xC3E8, 0xCDC4, 0xC3E9, 0xCDCC, 0xC3EA, 0xCDD0, + 0xC3EB, 0xCDE8, 0xC3EC, 0xCDEC, 0xC3ED, 0xCDF0, 0xC3EE, 0xCDF8, + 0xC3EF, 0xCDF9, 0xC3F0, 0xCDFB, 0xC3F1, 0xCDFD, 0xC3F2, 0xCE04, + 0xC3F3, 0xCE08, 0xC3F4, 0xCE0C, 0xC3F5, 0xCE14, 0xC3F6, 0xCE19, + 0xC3F7, 0xCE20, 0xC3F8, 0xCE21, 0xC3F9, 0xCE24, 0xC3FA, 0xCE28, + 0xC3FB, 0xCE30, 0xC3FC, 0xCE31, 0xC3FD, 0xCE33, 0xC3FE, 0xCE35, + 0xC441, 0xD6AB, 0xC442, 0xD6AD, 0xC443, 0xD6AE, 0xC444, 0xD6AF, + 0xC445, 0xD6B1, 0xC446, 0xD6B2, 0xC447, 0xD6B3, 0xC448, 0xD6B4, + 0xC449, 0xD6B5, 0xC44A, 0xD6B6, 0xC44B, 0xD6B7, 0xC44C, 0xD6B8, + 0xC44D, 0xD6BA, 0xC44E, 0xD6BC, 0xC44F, 0xD6BD, 0xC450, 0xD6BE, + 0xC451, 0xD6BF, 0xC452, 0xD6C0, 0xC453, 0xD6C1, 0xC454, 0xD6C2, + 0xC455, 0xD6C3, 0xC456, 0xD6C6, 0xC457, 0xD6C7, 0xC458, 0xD6C9, + 0xC459, 0xD6CA, 0xC45A, 0xD6CB, 0xC461, 0xD6CD, 0xC462, 0xD6CE, + 0xC463, 0xD6CF, 0xC464, 0xD6D0, 0xC465, 0xD6D2, 0xC466, 0xD6D3, + 0xC467, 0xD6D5, 0xC468, 0xD6D6, 0xC469, 0xD6D8, 0xC46A, 0xD6DA, + 0xC46B, 0xD6DB, 0xC46C, 0xD6DC, 0xC46D, 0xD6DD, 0xC46E, 0xD6DE, + 0xC46F, 0xD6DF, 0xC470, 0xD6E1, 0xC471, 0xD6E2, 0xC472, 0xD6E3, + 0xC473, 0xD6E5, 0xC474, 0xD6E6, 0xC475, 0xD6E7, 0xC476, 0xD6E9, + 0xC477, 0xD6EA, 0xC478, 0xD6EB, 0xC479, 0xD6EC, 0xC47A, 0xD6ED, + 0xC481, 0xD6EE, 0xC482, 0xD6EF, 0xC483, 0xD6F1, 0xC484, 0xD6F2, + 0xC485, 0xD6F3, 0xC486, 0xD6F4, 0xC487, 0xD6F6, 0xC488, 0xD6F7, + 0xC489, 0xD6F8, 0xC48A, 0xD6F9, 0xC48B, 0xD6FA, 0xC48C, 0xD6FB, + 0xC48D, 0xD6FE, 0xC48E, 0xD6FF, 0xC48F, 0xD701, 0xC490, 0xD702, + 0xC491, 0xD703, 0xC492, 0xD705, 0xC493, 0xD706, 0xC494, 0xD707, + 0xC495, 0xD708, 0xC496, 0xD709, 0xC497, 0xD70A, 0xC498, 0xD70B, + 0xC499, 0xD70C, 0xC49A, 0xD70D, 0xC49B, 0xD70E, 0xC49C, 0xD70F, + 0xC49D, 0xD710, 0xC49E, 0xD712, 0xC49F, 0xD713, 0xC4A0, 0xD714, + 0xC4A1, 0xCE58, 0xC4A2, 0xCE59, 0xC4A3, 0xCE5C, 0xC4A4, 0xCE5F, + 0xC4A5, 0xCE60, 0xC4A6, 0xCE61, 0xC4A7, 0xCE68, 0xC4A8, 0xCE69, + 0xC4A9, 0xCE6B, 0xC4AA, 0xCE6D, 0xC4AB, 0xCE74, 0xC4AC, 0xCE75, + 0xC4AD, 0xCE78, 0xC4AE, 0xCE7C, 0xC4AF, 0xCE84, 0xC4B0, 0xCE85, + 0xC4B1, 0xCE87, 0xC4B2, 0xCE89, 0xC4B3, 0xCE90, 0xC4B4, 0xCE91, + 0xC4B5, 0xCE94, 0xC4B6, 0xCE98, 0xC4B7, 0xCEA0, 0xC4B8, 0xCEA1, + 0xC4B9, 0xCEA3, 0xC4BA, 0xCEA4, 0xC4BB, 0xCEA5, 0xC4BC, 0xCEAC, + 0xC4BD, 0xCEAD, 0xC4BE, 0xCEC1, 0xC4BF, 0xCEE4, 0xC4C0, 0xCEE5, + 0xC4C1, 0xCEE8, 0xC4C2, 0xCEEB, 0xC4C3, 0xCEEC, 0xC4C4, 0xCEF4, + 0xC4C5, 0xCEF5, 0xC4C6, 0xCEF7, 0xC4C7, 0xCEF8, 0xC4C8, 0xCEF9, + 0xC4C9, 0xCF00, 0xC4CA, 0xCF01, 0xC4CB, 0xCF04, 0xC4CC, 0xCF08, + 0xC4CD, 0xCF10, 0xC4CE, 0xCF11, 0xC4CF, 0xCF13, 0xC4D0, 0xCF15, + 0xC4D1, 0xCF1C, 0xC4D2, 0xCF20, 0xC4D3, 0xCF24, 0xC4D4, 0xCF2C, + 0xC4D5, 0xCF2D, 0xC4D6, 0xCF2F, 0xC4D7, 0xCF30, 0xC4D8, 0xCF31, + 0xC4D9, 0xCF38, 0xC4DA, 0xCF54, 0xC4DB, 0xCF55, 0xC4DC, 0xCF58, + 0xC4DD, 0xCF5C, 0xC4DE, 0xCF64, 0xC4DF, 0xCF65, 0xC4E0, 0xCF67, + 0xC4E1, 0xCF69, 0xC4E2, 0xCF70, 0xC4E3, 0xCF71, 0xC4E4, 0xCF74, + 0xC4E5, 0xCF78, 0xC4E6, 0xCF80, 0xC4E7, 0xCF85, 0xC4E8, 0xCF8C, + 0xC4E9, 0xCFA1, 0xC4EA, 0xCFA8, 0xC4EB, 0xCFB0, 0xC4EC, 0xCFC4, + 0xC4ED, 0xCFE0, 0xC4EE, 0xCFE1, 0xC4EF, 0xCFE4, 0xC4F0, 0xCFE8, + 0xC4F1, 0xCFF0, 0xC4F2, 0xCFF1, 0xC4F3, 0xCFF3, 0xC4F4, 0xCFF5, + 0xC4F5, 0xCFFC, 0xC4F6, 0xD000, 0xC4F7, 0xD004, 0xC4F8, 0xD011, + 0xC4F9, 0xD018, 0xC4FA, 0xD02D, 0xC4FB, 0xD034, 0xC4FC, 0xD035, + 0xC4FD, 0xD038, 0xC4FE, 0xD03C, 0xC541, 0xD715, 0xC542, 0xD716, + 0xC543, 0xD717, 0xC544, 0xD71A, 0xC545, 0xD71B, 0xC546, 0xD71D, + 0xC547, 0xD71E, 0xC548, 0xD71F, 0xC549, 0xD721, 0xC54A, 0xD722, + 0xC54B, 0xD723, 0xC54C, 0xD724, 0xC54D, 0xD725, 0xC54E, 0xD726, + 0xC54F, 0xD727, 0xC550, 0xD72A, 0xC551, 0xD72C, 0xC552, 0xD72E, + 0xC553, 0xD72F, 0xC554, 0xD730, 0xC555, 0xD731, 0xC556, 0xD732, + 0xC557, 0xD733, 0xC558, 0xD736, 0xC559, 0xD737, 0xC55A, 0xD739, + 0xC561, 0xD73A, 0xC562, 0xD73B, 0xC563, 0xD73D, 0xC564, 0xD73E, + 0xC565, 0xD73F, 0xC566, 0xD740, 0xC567, 0xD741, 0xC568, 0xD742, + 0xC569, 0xD743, 0xC56A, 0xD745, 0xC56B, 0xD746, 0xC56C, 0xD748, + 0xC56D, 0xD74A, 0xC56E, 0xD74B, 0xC56F, 0xD74C, 0xC570, 0xD74D, + 0xC571, 0xD74E, 0xC572, 0xD74F, 0xC573, 0xD752, 0xC574, 0xD753, + 0xC575, 0xD755, 0xC576, 0xD75A, 0xC577, 0xD75B, 0xC578, 0xD75C, + 0xC579, 0xD75D, 0xC57A, 0xD75E, 0xC581, 0xD75F, 0xC582, 0xD762, + 0xC583, 0xD764, 0xC584, 0xD766, 0xC585, 0xD767, 0xC586, 0xD768, + 0xC587, 0xD76A, 0xC588, 0xD76B, 0xC589, 0xD76D, 0xC58A, 0xD76E, + 0xC58B, 0xD76F, 0xC58C, 0xD771, 0xC58D, 0xD772, 0xC58E, 0xD773, + 0xC58F, 0xD775, 0xC590, 0xD776, 0xC591, 0xD777, 0xC592, 0xD778, + 0xC593, 0xD779, 0xC594, 0xD77A, 0xC595, 0xD77B, 0xC596, 0xD77E, + 0xC597, 0xD77F, 0xC598, 0xD780, 0xC599, 0xD782, 0xC59A, 0xD783, + 0xC59B, 0xD784, 0xC59C, 0xD785, 0xC59D, 0xD786, 0xC59E, 0xD787, + 0xC59F, 0xD78A, 0xC5A0, 0xD78B, 0xC5A1, 0xD044, 0xC5A2, 0xD045, + 0xC5A3, 0xD047, 0xC5A4, 0xD049, 0xC5A5, 0xD050, 0xC5A6, 0xD054, + 0xC5A7, 0xD058, 0xC5A8, 0xD060, 0xC5A9, 0xD06C, 0xC5AA, 0xD06D, + 0xC5AB, 0xD070, 0xC5AC, 0xD074, 0xC5AD, 0xD07C, 0xC5AE, 0xD07D, + 0xC5AF, 0xD081, 0xC5B0, 0xD0A4, 0xC5B1, 0xD0A5, 0xC5B2, 0xD0A8, + 0xC5B3, 0xD0AC, 0xC5B4, 0xD0B4, 0xC5B5, 0xD0B5, 0xC5B6, 0xD0B7, + 0xC5B7, 0xD0B9, 0xC5B8, 0xD0C0, 0xC5B9, 0xD0C1, 0xC5BA, 0xD0C4, + 0xC5BB, 0xD0C8, 0xC5BC, 0xD0C9, 0xC5BD, 0xD0D0, 0xC5BE, 0xD0D1, + 0xC5BF, 0xD0D3, 0xC5C0, 0xD0D4, 0xC5C1, 0xD0D5, 0xC5C2, 0xD0DC, + 0xC5C3, 0xD0DD, 0xC5C4, 0xD0E0, 0xC5C5, 0xD0E4, 0xC5C6, 0xD0EC, + 0xC5C7, 0xD0ED, 0xC5C8, 0xD0EF, 0xC5C9, 0xD0F0, 0xC5CA, 0xD0F1, + 0xC5CB, 0xD0F8, 0xC5CC, 0xD10D, 0xC5CD, 0xD130, 0xC5CE, 0xD131, + 0xC5CF, 0xD134, 0xC5D0, 0xD138, 0xC5D1, 0xD13A, 0xC5D2, 0xD140, + 0xC5D3, 0xD141, 0xC5D4, 0xD143, 0xC5D5, 0xD144, 0xC5D6, 0xD145, + 0xC5D7, 0xD14C, 0xC5D8, 0xD14D, 0xC5D9, 0xD150, 0xC5DA, 0xD154, + 0xC5DB, 0xD15C, 0xC5DC, 0xD15D, 0xC5DD, 0xD15F, 0xC5DE, 0xD161, + 0xC5DF, 0xD168, 0xC5E0, 0xD16C, 0xC5E1, 0xD17C, 0xC5E2, 0xD184, + 0xC5E3, 0xD188, 0xC5E4, 0xD1A0, 0xC5E5, 0xD1A1, 0xC5E6, 0xD1A4, + 0xC5E7, 0xD1A8, 0xC5E8, 0xD1B0, 0xC5E9, 0xD1B1, 0xC5EA, 0xD1B3, + 0xC5EB, 0xD1B5, 0xC5EC, 0xD1BA, 0xC5ED, 0xD1BC, 0xC5EE, 0xD1C0, + 0xC5EF, 0xD1D8, 0xC5F0, 0xD1F4, 0xC5F1, 0xD1F8, 0xC5F2, 0xD207, + 0xC5F3, 0xD209, 0xC5F4, 0xD210, 0xC5F5, 0xD22C, 0xC5F6, 0xD22D, + 0xC5F7, 0xD230, 0xC5F8, 0xD234, 0xC5F9, 0xD23C, 0xC5FA, 0xD23D, + 0xC5FB, 0xD23F, 0xC5FC, 0xD241, 0xC5FD, 0xD248, 0xC5FE, 0xD25C, + 0xC641, 0xD78D, 0xC642, 0xD78E, 0xC643, 0xD78F, 0xC644, 0xD791, + 0xC645, 0xD792, 0xC646, 0xD793, 0xC647, 0xD794, 0xC648, 0xD795, + 0xC649, 0xD796, 0xC64A, 0xD797, 0xC64B, 0xD79A, 0xC64C, 0xD79C, + 0xC64D, 0xD79E, 0xC64E, 0xD79F, 0xC64F, 0xD7A0, 0xC650, 0xD7A1, + 0xC651, 0xD7A2, 0xC652, 0xD7A3, 0xC6A1, 0xD264, 0xC6A2, 0xD280, + 0xC6A3, 0xD281, 0xC6A4, 0xD284, 0xC6A5, 0xD288, 0xC6A6, 0xD290, + 0xC6A7, 0xD291, 0xC6A8, 0xD295, 0xC6A9, 0xD29C, 0xC6AA, 0xD2A0, + 0xC6AB, 0xD2A4, 0xC6AC, 0xD2AC, 0xC6AD, 0xD2B1, 0xC6AE, 0xD2B8, + 0xC6AF, 0xD2B9, 0xC6B0, 0xD2BC, 0xC6B1, 0xD2BF, 0xC6B2, 0xD2C0, + 0xC6B3, 0xD2C2, 0xC6B4, 0xD2C8, 0xC6B5, 0xD2C9, 0xC6B6, 0xD2CB, + 0xC6B7, 0xD2D4, 0xC6B8, 0xD2D8, 0xC6B9, 0xD2DC, 0xC6BA, 0xD2E4, + 0xC6BB, 0xD2E5, 0xC6BC, 0xD2F0, 0xC6BD, 0xD2F1, 0xC6BE, 0xD2F4, + 0xC6BF, 0xD2F8, 0xC6C0, 0xD300, 0xC6C1, 0xD301, 0xC6C2, 0xD303, + 0xC6C3, 0xD305, 0xC6C4, 0xD30C, 0xC6C5, 0xD30D, 0xC6C6, 0xD30E, + 0xC6C7, 0xD310, 0xC6C8, 0xD314, 0xC6C9, 0xD316, 0xC6CA, 0xD31C, + 0xC6CB, 0xD31D, 0xC6CC, 0xD31F, 0xC6CD, 0xD320, 0xC6CE, 0xD321, + 0xC6CF, 0xD325, 0xC6D0, 0xD328, 0xC6D1, 0xD329, 0xC6D2, 0xD32C, + 0xC6D3, 0xD330, 0xC6D4, 0xD338, 0xC6D5, 0xD339, 0xC6D6, 0xD33B, + 0xC6D7, 0xD33C, 0xC6D8, 0xD33D, 0xC6D9, 0xD344, 0xC6DA, 0xD345, + 0xC6DB, 0xD37C, 0xC6DC, 0xD37D, 0xC6DD, 0xD380, 0xC6DE, 0xD384, + 0xC6DF, 0xD38C, 0xC6E0, 0xD38D, 0xC6E1, 0xD38F, 0xC6E2, 0xD390, + 0xC6E3, 0xD391, 0xC6E4, 0xD398, 0xC6E5, 0xD399, 0xC6E6, 0xD39C, + 0xC6E7, 0xD3A0, 0xC6E8, 0xD3A8, 0xC6E9, 0xD3A9, 0xC6EA, 0xD3AB, + 0xC6EB, 0xD3AD, 0xC6EC, 0xD3B4, 0xC6ED, 0xD3B8, 0xC6EE, 0xD3BC, + 0xC6EF, 0xD3C4, 0xC6F0, 0xD3C5, 0xC6F1, 0xD3C8, 0xC6F2, 0xD3C9, + 0xC6F3, 0xD3D0, 0xC6F4, 0xD3D8, 0xC6F5, 0xD3E1, 0xC6F6, 0xD3E3, + 0xC6F7, 0xD3EC, 0xC6F8, 0xD3ED, 0xC6F9, 0xD3F0, 0xC6FA, 0xD3F4, + 0xC6FB, 0xD3FC, 0xC6FC, 0xD3FD, 0xC6FD, 0xD3FF, 0xC6FE, 0xD401, + 0xC7A1, 0xD408, 0xC7A2, 0xD41D, 0xC7A3, 0xD440, 0xC7A4, 0xD444, + 0xC7A5, 0xD45C, 0xC7A6, 0xD460, 0xC7A7, 0xD464, 0xC7A8, 0xD46D, + 0xC7A9, 0xD46F, 0xC7AA, 0xD478, 0xC7AB, 0xD479, 0xC7AC, 0xD47C, + 0xC7AD, 0xD47F, 0xC7AE, 0xD480, 0xC7AF, 0xD482, 0xC7B0, 0xD488, + 0xC7B1, 0xD489, 0xC7B2, 0xD48B, 0xC7B3, 0xD48D, 0xC7B4, 0xD494, + 0xC7B5, 0xD4A9, 0xC7B6, 0xD4CC, 0xC7B7, 0xD4D0, 0xC7B8, 0xD4D4, + 0xC7B9, 0xD4DC, 0xC7BA, 0xD4DF, 0xC7BB, 0xD4E8, 0xC7BC, 0xD4EC, + 0xC7BD, 0xD4F0, 0xC7BE, 0xD4F8, 0xC7BF, 0xD4FB, 0xC7C0, 0xD4FD, + 0xC7C1, 0xD504, 0xC7C2, 0xD508, 0xC7C3, 0xD50C, 0xC7C4, 0xD514, + 0xC7C5, 0xD515, 0xC7C6, 0xD517, 0xC7C7, 0xD53C, 0xC7C8, 0xD53D, + 0xC7C9, 0xD540, 0xC7CA, 0xD544, 0xC7CB, 0xD54C, 0xC7CC, 0xD54D, + 0xC7CD, 0xD54F, 0xC7CE, 0xD551, 0xC7CF, 0xD558, 0xC7D0, 0xD559, + 0xC7D1, 0xD55C, 0xC7D2, 0xD560, 0xC7D3, 0xD565, 0xC7D4, 0xD568, + 0xC7D5, 0xD569, 0xC7D6, 0xD56B, 0xC7D7, 0xD56D, 0xC7D8, 0xD574, + 0xC7D9, 0xD575, 0xC7DA, 0xD578, 0xC7DB, 0xD57C, 0xC7DC, 0xD584, + 0xC7DD, 0xD585, 0xC7DE, 0xD587, 0xC7DF, 0xD588, 0xC7E0, 0xD589, + 0xC7E1, 0xD590, 0xC7E2, 0xD5A5, 0xC7E3, 0xD5C8, 0xC7E4, 0xD5C9, + 0xC7E5, 0xD5CC, 0xC7E6, 0xD5D0, 0xC7E7, 0xD5D2, 0xC7E8, 0xD5D8, + 0xC7E9, 0xD5D9, 0xC7EA, 0xD5DB, 0xC7EB, 0xD5DD, 0xC7EC, 0xD5E4, + 0xC7ED, 0xD5E5, 0xC7EE, 0xD5E8, 0xC7EF, 0xD5EC, 0xC7F0, 0xD5F4, + 0xC7F1, 0xD5F5, 0xC7F2, 0xD5F7, 0xC7F3, 0xD5F9, 0xC7F4, 0xD600, + 0xC7F5, 0xD601, 0xC7F6, 0xD604, 0xC7F7, 0xD608, 0xC7F8, 0xD610, + 0xC7F9, 0xD611, 0xC7FA, 0xD613, 0xC7FB, 0xD614, 0xC7FC, 0xD615, + 0xC7FD, 0xD61C, 0xC7FE, 0xD620, 0xC8A1, 0xD624, 0xC8A2, 0xD62D, + 0xC8A3, 0xD638, 0xC8A4, 0xD639, 0xC8A5, 0xD63C, 0xC8A6, 0xD640, + 0xC8A7, 0xD645, 0xC8A8, 0xD648, 0xC8A9, 0xD649, 0xC8AA, 0xD64B, + 0xC8AB, 0xD64D, 0xC8AC, 0xD651, 0xC8AD, 0xD654, 0xC8AE, 0xD655, + 0xC8AF, 0xD658, 0xC8B0, 0xD65C, 0xC8B1, 0xD667, 0xC8B2, 0xD669, + 0xC8B3, 0xD670, 0xC8B4, 0xD671, 0xC8B5, 0xD674, 0xC8B6, 0xD683, + 0xC8B7, 0xD685, 0xC8B8, 0xD68C, 0xC8B9, 0xD68D, 0xC8BA, 0xD690, + 0xC8BB, 0xD694, 0xC8BC, 0xD69D, 0xC8BD, 0xD69F, 0xC8BE, 0xD6A1, + 0xC8BF, 0xD6A8, 0xC8C0, 0xD6AC, 0xC8C1, 0xD6B0, 0xC8C2, 0xD6B9, + 0xC8C3, 0xD6BB, 0xC8C4, 0xD6C4, 0xC8C5, 0xD6C5, 0xC8C6, 0xD6C8, + 0xC8C7, 0xD6CC, 0xC8C8, 0xD6D1, 0xC8C9, 0xD6D4, 0xC8CA, 0xD6D7, + 0xC8CB, 0xD6D9, 0xC8CC, 0xD6E0, 0xC8CD, 0xD6E4, 0xC8CE, 0xD6E8, + 0xC8CF, 0xD6F0, 0xC8D0, 0xD6F5, 0xC8D1, 0xD6FC, 0xC8D2, 0xD6FD, + 0xC8D3, 0xD700, 0xC8D4, 0xD704, 0xC8D5, 0xD711, 0xC8D6, 0xD718, + 0xC8D7, 0xD719, 0xC8D8, 0xD71C, 0xC8D9, 0xD720, 0xC8DA, 0xD728, + 0xC8DB, 0xD729, 0xC8DC, 0xD72B, 0xC8DD, 0xD72D, 0xC8DE, 0xD734, + 0xC8DF, 0xD735, 0xC8E0, 0xD738, 0xC8E1, 0xD73C, 0xC8E2, 0xD744, + 0xC8E3, 0xD747, 0xC8E4, 0xD749, 0xC8E5, 0xD750, 0xC8E6, 0xD751, + 0xC8E7, 0xD754, 0xC8E8, 0xD756, 0xC8E9, 0xD757, 0xC8EA, 0xD758, + 0xC8EB, 0xD759, 0xC8EC, 0xD760, 0xC8ED, 0xD761, 0xC8EE, 0xD763, + 0xC8EF, 0xD765, 0xC8F0, 0xD769, 0xC8F1, 0xD76C, 0xC8F2, 0xD770, + 0xC8F3, 0xD774, 0xC8F4, 0xD77C, 0xC8F5, 0xD77D, 0xC8F6, 0xD781, + 0xC8F7, 0xD788, 0xC8F8, 0xD789, 0xC8F9, 0xD78C, 0xC8FA, 0xD790, + 0xC8FB, 0xD798, 0xC8FC, 0xD799, 0xC8FD, 0xD79B, 0xC8FE, 0xD79D, + 0xCAA1, 0x4F3D, 0xCAA2, 0x4F73, 0xCAA3, 0x5047, 0xCAA4, 0x50F9, + 0xCAA5, 0x52A0, 0xCAA6, 0x53EF, 0xCAA7, 0x5475, 0xCAA8, 0x54E5, + 0xCAA9, 0x5609, 0xCAAA, 0x5AC1, 0xCAAB, 0x5BB6, 0xCAAC, 0x6687, + 0xCAAD, 0x67B6, 0xCAAE, 0x67B7, 0xCAAF, 0x67EF, 0xCAB0, 0x6B4C, + 0xCAB1, 0x73C2, 0xCAB2, 0x75C2, 0xCAB3, 0x7A3C, 0xCAB4, 0x82DB, + 0xCAB5, 0x8304, 0xCAB6, 0x8857, 0xCAB7, 0x8888, 0xCAB8, 0x8A36, + 0xCAB9, 0x8CC8, 0xCABA, 0x8DCF, 0xCABB, 0x8EFB, 0xCABC, 0x8FE6, + 0xCABD, 0x99D5, 0xCABE, 0x523B, 0xCABF, 0x5374, 0xCAC0, 0x5404, + 0xCAC1, 0x606A, 0xCAC2, 0x6164, 0xCAC3, 0x6BBC, 0xCAC4, 0x73CF, + 0xCAC5, 0x811A, 0xCAC6, 0x89BA, 0xCAC7, 0x89D2, 0xCAC8, 0x95A3, + 0xCAC9, 0x4F83, 0xCACA, 0x520A, 0xCACB, 0x58BE, 0xCACC, 0x5978, + 0xCACD, 0x59E6, 0xCACE, 0x5E72, 0xCACF, 0x5E79, 0xCAD0, 0x61C7, + 0xCAD1, 0x63C0, 0xCAD2, 0x6746, 0xCAD3, 0x67EC, 0xCAD4, 0x687F, + 0xCAD5, 0x6F97, 0xCAD6, 0x764E, 0xCAD7, 0x770B, 0xCAD8, 0x78F5, + 0xCAD9, 0x7A08, 0xCADA, 0x7AFF, 0xCADB, 0x7C21, 0xCADC, 0x809D, + 0xCADD, 0x826E, 0xCADE, 0x8271, 0xCADF, 0x8AEB, 0xCAE0, 0x9593, + 0xCAE1, 0x4E6B, 0xCAE2, 0x559D, 0xCAE3, 0x66F7, 0xCAE4, 0x6E34, + 0xCAE5, 0x78A3, 0xCAE6, 0x7AED, 0xCAE7, 0x845B, 0xCAE8, 0x8910, + 0xCAE9, 0x874E, 0xCAEA, 0x97A8, 0xCAEB, 0x52D8, 0xCAEC, 0x574E, + 0xCAED, 0x582A, 0xCAEE, 0x5D4C, 0xCAEF, 0x611F, 0xCAF0, 0x61BE, + 0xCAF1, 0x6221, 0xCAF2, 0x6562, 0xCAF3, 0x67D1, 0xCAF4, 0x6A44, + 0xCAF5, 0x6E1B, 0xCAF6, 0x7518, 0xCAF7, 0x75B3, 0xCAF8, 0x76E3, + 0xCAF9, 0x77B0, 0xCAFA, 0x7D3A, 0xCAFB, 0x90AF, 0xCAFC, 0x9451, + 0xCAFD, 0x9452, 0xCAFE, 0x9F95, 0xCBA1, 0x5323, 0xCBA2, 0x5CAC, + 0xCBA3, 0x7532, 0xCBA4, 0x80DB, 0xCBA5, 0x9240, 0xCBA6, 0x9598, + 0xCBA7, 0x525B, 0xCBA8, 0x5808, 0xCBA9, 0x59DC, 0xCBAA, 0x5CA1, + 0xCBAB, 0x5D17, 0xCBAC, 0x5EB7, 0xCBAD, 0x5F3A, 0xCBAE, 0x5F4A, + 0xCBAF, 0x6177, 0xCBB0, 0x6C5F, 0xCBB1, 0x757A, 0xCBB2, 0x7586, + 0xCBB3, 0x7CE0, 0xCBB4, 0x7D73, 0xCBB5, 0x7DB1, 0xCBB6, 0x7F8C, + 0xCBB7, 0x8154, 0xCBB8, 0x8221, 0xCBB9, 0x8591, 0xCBBA, 0x8941, + 0xCBBB, 0x8B1B, 0xCBBC, 0x92FC, 0xCBBD, 0x964D, 0xCBBE, 0x9C47, + 0xCBBF, 0x4ECB, 0xCBC0, 0x4EF7, 0xCBC1, 0x500B, 0xCBC2, 0x51F1, + 0xCBC3, 0x584F, 0xCBC4, 0x6137, 0xCBC5, 0x613E, 0xCBC6, 0x6168, + 0xCBC7, 0x6539, 0xCBC8, 0x69EA, 0xCBC9, 0x6F11, 0xCBCA, 0x75A5, + 0xCBCB, 0x7686, 0xCBCC, 0x76D6, 0xCBCD, 0x7B87, 0xCBCE, 0x82A5, + 0xCBCF, 0x84CB, 0xCBD0, 0xF900, 0xCBD1, 0x93A7, 0xCBD2, 0x958B, + 0xCBD3, 0x5580, 0xCBD4, 0x5BA2, 0xCBD5, 0x5751, 0xCBD6, 0xF901, + 0xCBD7, 0x7CB3, 0xCBD8, 0x7FB9, 0xCBD9, 0x91B5, 0xCBDA, 0x5028, + 0xCBDB, 0x53BB, 0xCBDC, 0x5C45, 0xCBDD, 0x5DE8, 0xCBDE, 0x62D2, + 0xCBDF, 0x636E, 0xCBE0, 0x64DA, 0xCBE1, 0x64E7, 0xCBE2, 0x6E20, + 0xCBE3, 0x70AC, 0xCBE4, 0x795B, 0xCBE5, 0x8DDD, 0xCBE6, 0x8E1E, + 0xCBE7, 0xF902, 0xCBE8, 0x907D, 0xCBE9, 0x9245, 0xCBEA, 0x92F8, + 0xCBEB, 0x4E7E, 0xCBEC, 0x4EF6, 0xCBED, 0x5065, 0xCBEE, 0x5DFE, + 0xCBEF, 0x5EFA, 0xCBF0, 0x6106, 0xCBF1, 0x6957, 0xCBF2, 0x8171, + 0xCBF3, 0x8654, 0xCBF4, 0x8E47, 0xCBF5, 0x9375, 0xCBF6, 0x9A2B, + 0xCBF7, 0x4E5E, 0xCBF8, 0x5091, 0xCBF9, 0x6770, 0xCBFA, 0x6840, + 0xCBFB, 0x5109, 0xCBFC, 0x528D, 0xCBFD, 0x5292, 0xCBFE, 0x6AA2, + 0xCCA1, 0x77BC, 0xCCA2, 0x9210, 0xCCA3, 0x9ED4, 0xCCA4, 0x52AB, + 0xCCA5, 0x602F, 0xCCA6, 0x8FF2, 0xCCA7, 0x5048, 0xCCA8, 0x61A9, + 0xCCA9, 0x63ED, 0xCCAA, 0x64CA, 0xCCAB, 0x683C, 0xCCAC, 0x6A84, + 0xCCAD, 0x6FC0, 0xCCAE, 0x8188, 0xCCAF, 0x89A1, 0xCCB0, 0x9694, + 0xCCB1, 0x5805, 0xCCB2, 0x727D, 0xCCB3, 0x72AC, 0xCCB4, 0x7504, + 0xCCB5, 0x7D79, 0xCCB6, 0x7E6D, 0xCCB7, 0x80A9, 0xCCB8, 0x898B, + 0xCCB9, 0x8B74, 0xCCBA, 0x9063, 0xCCBB, 0x9D51, 0xCCBC, 0x6289, + 0xCCBD, 0x6C7A, 0xCCBE, 0x6F54, 0xCCBF, 0x7D50, 0xCCC0, 0x7F3A, + 0xCCC1, 0x8A23, 0xCCC2, 0x517C, 0xCCC3, 0x614A, 0xCCC4, 0x7B9D, + 0xCCC5, 0x8B19, 0xCCC6, 0x9257, 0xCCC7, 0x938C, 0xCCC8, 0x4EAC, + 0xCCC9, 0x4FD3, 0xCCCA, 0x501E, 0xCCCB, 0x50BE, 0xCCCC, 0x5106, + 0xCCCD, 0x52C1, 0xCCCE, 0x52CD, 0xCCCF, 0x537F, 0xCCD0, 0x5770, + 0xCCD1, 0x5883, 0xCCD2, 0x5E9A, 0xCCD3, 0x5F91, 0xCCD4, 0x6176, + 0xCCD5, 0x61AC, 0xCCD6, 0x64CE, 0xCCD7, 0x656C, 0xCCD8, 0x666F, + 0xCCD9, 0x66BB, 0xCCDA, 0x66F4, 0xCCDB, 0x6897, 0xCCDC, 0x6D87, + 0xCCDD, 0x7085, 0xCCDE, 0x70F1, 0xCCDF, 0x749F, 0xCCE0, 0x74A5, + 0xCCE1, 0x74CA, 0xCCE2, 0x75D9, 0xCCE3, 0x786C, 0xCCE4, 0x78EC, + 0xCCE5, 0x7ADF, 0xCCE6, 0x7AF6, 0xCCE7, 0x7D45, 0xCCE8, 0x7D93, + 0xCCE9, 0x8015, 0xCCEA, 0x803F, 0xCCEB, 0x811B, 0xCCEC, 0x8396, + 0xCCED, 0x8B66, 0xCCEE, 0x8F15, 0xCCEF, 0x9015, 0xCCF0, 0x93E1, + 0xCCF1, 0x9803, 0xCCF2, 0x9838, 0xCCF3, 0x9A5A, 0xCCF4, 0x9BE8, + 0xCCF5, 0x4FC2, 0xCCF6, 0x5553, 0xCCF7, 0x583A, 0xCCF8, 0x5951, + 0xCCF9, 0x5B63, 0xCCFA, 0x5C46, 0xCCFB, 0x60B8, 0xCCFC, 0x6212, + 0xCCFD, 0x6842, 0xCCFE, 0x68B0, 0xCDA1, 0x68E8, 0xCDA2, 0x6EAA, + 0xCDA3, 0x754C, 0xCDA4, 0x7678, 0xCDA5, 0x78CE, 0xCDA6, 0x7A3D, + 0xCDA7, 0x7CFB, 0xCDA8, 0x7E6B, 0xCDA9, 0x7E7C, 0xCDAA, 0x8A08, + 0xCDAB, 0x8AA1, 0xCDAC, 0x8C3F, 0xCDAD, 0x968E, 0xCDAE, 0x9DC4, + 0xCDAF, 0x53E4, 0xCDB0, 0x53E9, 0xCDB1, 0x544A, 0xCDB2, 0x5471, + 0xCDB3, 0x56FA, 0xCDB4, 0x59D1, 0xCDB5, 0x5B64, 0xCDB6, 0x5C3B, + 0xCDB7, 0x5EAB, 0xCDB8, 0x62F7, 0xCDB9, 0x6537, 0xCDBA, 0x6545, + 0xCDBB, 0x6572, 0xCDBC, 0x66A0, 0xCDBD, 0x67AF, 0xCDBE, 0x69C1, + 0xCDBF, 0x6CBD, 0xCDC0, 0x75FC, 0xCDC1, 0x7690, 0xCDC2, 0x777E, + 0xCDC3, 0x7A3F, 0xCDC4, 0x7F94, 0xCDC5, 0x8003, 0xCDC6, 0x80A1, + 0xCDC7, 0x818F, 0xCDC8, 0x82E6, 0xCDC9, 0x82FD, 0xCDCA, 0x83F0, + 0xCDCB, 0x85C1, 0xCDCC, 0x8831, 0xCDCD, 0x88B4, 0xCDCE, 0x8AA5, + 0xCDCF, 0xF903, 0xCDD0, 0x8F9C, 0xCDD1, 0x932E, 0xCDD2, 0x96C7, + 0xCDD3, 0x9867, 0xCDD4, 0x9AD8, 0xCDD5, 0x9F13, 0xCDD6, 0x54ED, + 0xCDD7, 0x659B, 0xCDD8, 0x66F2, 0xCDD9, 0x688F, 0xCDDA, 0x7A40, + 0xCDDB, 0x8C37, 0xCDDC, 0x9D60, 0xCDDD, 0x56F0, 0xCDDE, 0x5764, + 0xCDDF, 0x5D11, 0xCDE0, 0x6606, 0xCDE1, 0x68B1, 0xCDE2, 0x68CD, + 0xCDE3, 0x6EFE, 0xCDE4, 0x7428, 0xCDE5, 0x889E, 0xCDE6, 0x9BE4, + 0xCDE7, 0x6C68, 0xCDE8, 0xF904, 0xCDE9, 0x9AA8, 0xCDEA, 0x4F9B, + 0xCDEB, 0x516C, 0xCDEC, 0x5171, 0xCDED, 0x529F, 0xCDEE, 0x5B54, + 0xCDEF, 0x5DE5, 0xCDF0, 0x6050, 0xCDF1, 0x606D, 0xCDF2, 0x62F1, + 0xCDF3, 0x63A7, 0xCDF4, 0x653B, 0xCDF5, 0x73D9, 0xCDF6, 0x7A7A, + 0xCDF7, 0x86A3, 0xCDF8, 0x8CA2, 0xCDF9, 0x978F, 0xCDFA, 0x4E32, + 0xCDFB, 0x5BE1, 0xCDFC, 0x6208, 0xCDFD, 0x679C, 0xCDFE, 0x74DC, + 0xCEA1, 0x79D1, 0xCEA2, 0x83D3, 0xCEA3, 0x8A87, 0xCEA4, 0x8AB2, + 0xCEA5, 0x8DE8, 0xCEA6, 0x904E, 0xCEA7, 0x934B, 0xCEA8, 0x9846, + 0xCEA9, 0x5ED3, 0xCEAA, 0x69E8, 0xCEAB, 0x85FF, 0xCEAC, 0x90ED, + 0xCEAD, 0xF905, 0xCEAE, 0x51A0, 0xCEAF, 0x5B98, 0xCEB0, 0x5BEC, + 0xCEB1, 0x6163, 0xCEB2, 0x68FA, 0xCEB3, 0x6B3E, 0xCEB4, 0x704C, + 0xCEB5, 0x742F, 0xCEB6, 0x74D8, 0xCEB7, 0x7BA1, 0xCEB8, 0x7F50, + 0xCEB9, 0x83C5, 0xCEBA, 0x89C0, 0xCEBB, 0x8CAB, 0xCEBC, 0x95DC, + 0xCEBD, 0x9928, 0xCEBE, 0x522E, 0xCEBF, 0x605D, 0xCEC0, 0x62EC, + 0xCEC1, 0x9002, 0xCEC2, 0x4F8A, 0xCEC3, 0x5149, 0xCEC4, 0x5321, + 0xCEC5, 0x58D9, 0xCEC6, 0x5EE3, 0xCEC7, 0x66E0, 0xCEC8, 0x6D38, + 0xCEC9, 0x709A, 0xCECA, 0x72C2, 0xCECB, 0x73D6, 0xCECC, 0x7B50, + 0xCECD, 0x80F1, 0xCECE, 0x945B, 0xCECF, 0x5366, 0xCED0, 0x639B, + 0xCED1, 0x7F6B, 0xCED2, 0x4E56, 0xCED3, 0x5080, 0xCED4, 0x584A, + 0xCED5, 0x58DE, 0xCED6, 0x602A, 0xCED7, 0x6127, 0xCED8, 0x62D0, + 0xCED9, 0x69D0, 0xCEDA, 0x9B41, 0xCEDB, 0x5B8F, 0xCEDC, 0x7D18, + 0xCEDD, 0x80B1, 0xCEDE, 0x8F5F, 0xCEDF, 0x4EA4, 0xCEE0, 0x50D1, + 0xCEE1, 0x54AC, 0xCEE2, 0x55AC, 0xCEE3, 0x5B0C, 0xCEE4, 0x5DA0, + 0xCEE5, 0x5DE7, 0xCEE6, 0x652A, 0xCEE7, 0x654E, 0xCEE8, 0x6821, + 0xCEE9, 0x6A4B, 0xCEEA, 0x72E1, 0xCEEB, 0x768E, 0xCEEC, 0x77EF, + 0xCEED, 0x7D5E, 0xCEEE, 0x7FF9, 0xCEEF, 0x81A0, 0xCEF0, 0x854E, + 0xCEF1, 0x86DF, 0xCEF2, 0x8F03, 0xCEF3, 0x8F4E, 0xCEF4, 0x90CA, + 0xCEF5, 0x9903, 0xCEF6, 0x9A55, 0xCEF7, 0x9BAB, 0xCEF8, 0x4E18, + 0xCEF9, 0x4E45, 0xCEFA, 0x4E5D, 0xCEFB, 0x4EC7, 0xCEFC, 0x4FF1, + 0xCEFD, 0x5177, 0xCEFE, 0x52FE, 0xCFA1, 0x5340, 0xCFA2, 0x53E3, + 0xCFA3, 0x53E5, 0xCFA4, 0x548E, 0xCFA5, 0x5614, 0xCFA6, 0x5775, + 0xCFA7, 0x57A2, 0xCFA8, 0x5BC7, 0xCFA9, 0x5D87, 0xCFAA, 0x5ED0, + 0xCFAB, 0x61FC, 0xCFAC, 0x62D8, 0xCFAD, 0x6551, 0xCFAE, 0x67B8, + 0xCFAF, 0x67E9, 0xCFB0, 0x69CB, 0xCFB1, 0x6B50, 0xCFB2, 0x6BC6, + 0xCFB3, 0x6BEC, 0xCFB4, 0x6C42, 0xCFB5, 0x6E9D, 0xCFB6, 0x7078, + 0xCFB7, 0x72D7, 0xCFB8, 0x7396, 0xCFB9, 0x7403, 0xCFBA, 0x77BF, + 0xCFBB, 0x77E9, 0xCFBC, 0x7A76, 0xCFBD, 0x7D7F, 0xCFBE, 0x8009, + 0xCFBF, 0x81FC, 0xCFC0, 0x8205, 0xCFC1, 0x820A, 0xCFC2, 0x82DF, + 0xCFC3, 0x8862, 0xCFC4, 0x8B33, 0xCFC5, 0x8CFC, 0xCFC6, 0x8EC0, + 0xCFC7, 0x9011, 0xCFC8, 0x90B1, 0xCFC9, 0x9264, 0xCFCA, 0x92B6, + 0xCFCB, 0x99D2, 0xCFCC, 0x9A45, 0xCFCD, 0x9CE9, 0xCFCE, 0x9DD7, + 0xCFCF, 0x9F9C, 0xCFD0, 0x570B, 0xCFD1, 0x5C40, 0xCFD2, 0x83CA, + 0xCFD3, 0x97A0, 0xCFD4, 0x97AB, 0xCFD5, 0x9EB4, 0xCFD6, 0x541B, + 0xCFD7, 0x7A98, 0xCFD8, 0x7FA4, 0xCFD9, 0x88D9, 0xCFDA, 0x8ECD, + 0xCFDB, 0x90E1, 0xCFDC, 0x5800, 0xCFDD, 0x5C48, 0xCFDE, 0x6398, + 0xCFDF, 0x7A9F, 0xCFE0, 0x5BAE, 0xCFE1, 0x5F13, 0xCFE2, 0x7A79, + 0xCFE3, 0x7AAE, 0xCFE4, 0x828E, 0xCFE5, 0x8EAC, 0xCFE6, 0x5026, + 0xCFE7, 0x5238, 0xCFE8, 0x52F8, 0xCFE9, 0x5377, 0xCFEA, 0x5708, + 0xCFEB, 0x62F3, 0xCFEC, 0x6372, 0xCFED, 0x6B0A, 0xCFEE, 0x6DC3, + 0xCFEF, 0x7737, 0xCFF0, 0x53A5, 0xCFF1, 0x7357, 0xCFF2, 0x8568, + 0xCFF3, 0x8E76, 0xCFF4, 0x95D5, 0xCFF5, 0x673A, 0xCFF6, 0x6AC3, + 0xCFF7, 0x6F70, 0xCFF8, 0x8A6D, 0xCFF9, 0x8ECC, 0xCFFA, 0x994B, + 0xCFFB, 0xF906, 0xCFFC, 0x6677, 0xCFFD, 0x6B78, 0xCFFE, 0x8CB4, + 0xD0A1, 0x9B3C, 0xD0A2, 0xF907, 0xD0A3, 0x53EB, 0xD0A4, 0x572D, + 0xD0A5, 0x594E, 0xD0A6, 0x63C6, 0xD0A7, 0x69FB, 0xD0A8, 0x73EA, + 0xD0A9, 0x7845, 0xD0AA, 0x7ABA, 0xD0AB, 0x7AC5, 0xD0AC, 0x7CFE, + 0xD0AD, 0x8475, 0xD0AE, 0x898F, 0xD0AF, 0x8D73, 0xD0B0, 0x9035, + 0xD0B1, 0x95A8, 0xD0B2, 0x52FB, 0xD0B3, 0x5747, 0xD0B4, 0x7547, + 0xD0B5, 0x7B60, 0xD0B6, 0x83CC, 0xD0B7, 0x921E, 0xD0B8, 0xF908, + 0xD0B9, 0x6A58, 0xD0BA, 0x514B, 0xD0BB, 0x524B, 0xD0BC, 0x5287, + 0xD0BD, 0x621F, 0xD0BE, 0x68D8, 0xD0BF, 0x6975, 0xD0C0, 0x9699, + 0xD0C1, 0x50C5, 0xD0C2, 0x52A4, 0xD0C3, 0x52E4, 0xD0C4, 0x61C3, + 0xD0C5, 0x65A4, 0xD0C6, 0x6839, 0xD0C7, 0x69FF, 0xD0C8, 0x747E, + 0xD0C9, 0x7B4B, 0xD0CA, 0x82B9, 0xD0CB, 0x83EB, 0xD0CC, 0x89B2, + 0xD0CD, 0x8B39, 0xD0CE, 0x8FD1, 0xD0CF, 0x9949, 0xD0D0, 0xF909, + 0xD0D1, 0x4ECA, 0xD0D2, 0x5997, 0xD0D3, 0x64D2, 0xD0D4, 0x6611, + 0xD0D5, 0x6A8E, 0xD0D6, 0x7434, 0xD0D7, 0x7981, 0xD0D8, 0x79BD, + 0xD0D9, 0x82A9, 0xD0DA, 0x887E, 0xD0DB, 0x887F, 0xD0DC, 0x895F, + 0xD0DD, 0xF90A, 0xD0DE, 0x9326, 0xD0DF, 0x4F0B, 0xD0E0, 0x53CA, + 0xD0E1, 0x6025, 0xD0E2, 0x6271, 0xD0E3, 0x6C72, 0xD0E4, 0x7D1A, + 0xD0E5, 0x7D66, 0xD0E6, 0x4E98, 0xD0E7, 0x5162, 0xD0E8, 0x77DC, + 0xD0E9, 0x80AF, 0xD0EA, 0x4F01, 0xD0EB, 0x4F0E, 0xD0EC, 0x5176, + 0xD0ED, 0x5180, 0xD0EE, 0x55DC, 0xD0EF, 0x5668, 0xD0F0, 0x573B, + 0xD0F1, 0x57FA, 0xD0F2, 0x57FC, 0xD0F3, 0x5914, 0xD0F4, 0x5947, + 0xD0F5, 0x5993, 0xD0F6, 0x5BC4, 0xD0F7, 0x5C90, 0xD0F8, 0x5D0E, + 0xD0F9, 0x5DF1, 0xD0FA, 0x5E7E, 0xD0FB, 0x5FCC, 0xD0FC, 0x6280, + 0xD0FD, 0x65D7, 0xD0FE, 0x65E3, 0xD1A1, 0x671E, 0xD1A2, 0x671F, + 0xD1A3, 0x675E, 0xD1A4, 0x68CB, 0xD1A5, 0x68C4, 0xD1A6, 0x6A5F, + 0xD1A7, 0x6B3A, 0xD1A8, 0x6C23, 0xD1A9, 0x6C7D, 0xD1AA, 0x6C82, + 0xD1AB, 0x6DC7, 0xD1AC, 0x7398, 0xD1AD, 0x7426, 0xD1AE, 0x742A, + 0xD1AF, 0x7482, 0xD1B0, 0x74A3, 0xD1B1, 0x7578, 0xD1B2, 0x757F, + 0xD1B3, 0x7881, 0xD1B4, 0x78EF, 0xD1B5, 0x7941, 0xD1B6, 0x7947, + 0xD1B7, 0x7948, 0xD1B8, 0x797A, 0xD1B9, 0x7B95, 0xD1BA, 0x7D00, + 0xD1BB, 0x7DBA, 0xD1BC, 0x7F88, 0xD1BD, 0x8006, 0xD1BE, 0x802D, + 0xD1BF, 0x808C, 0xD1C0, 0x8A18, 0xD1C1, 0x8B4F, 0xD1C2, 0x8C48, + 0xD1C3, 0x8D77, 0xD1C4, 0x9321, 0xD1C5, 0x9324, 0xD1C6, 0x98E2, + 0xD1C7, 0x9951, 0xD1C8, 0x9A0E, 0xD1C9, 0x9A0F, 0xD1CA, 0x9A65, + 0xD1CB, 0x9E92, 0xD1CC, 0x7DCA, 0xD1CD, 0x4F76, 0xD1CE, 0x5409, + 0xD1CF, 0x62EE, 0xD1D0, 0x6854, 0xD1D1, 0x91D1, 0xD1D2, 0x55AB, + 0xD1D3, 0x513A, 0xD1D4, 0xF90B, 0xD1D5, 0xF90C, 0xD1D6, 0x5A1C, + 0xD1D7, 0x61E6, 0xD1D8, 0xF90D, 0xD1D9, 0x62CF, 0xD1DA, 0x62FF, + 0xD1DB, 0xF90E, 0xD1DC, 0xF90F, 0xD1DD, 0xF910, 0xD1DE, 0xF911, + 0xD1DF, 0xF912, 0xD1E0, 0xF913, 0xD1E1, 0x90A3, 0xD1E2, 0xF914, + 0xD1E3, 0xF915, 0xD1E4, 0xF916, 0xD1E5, 0xF917, 0xD1E6, 0xF918, + 0xD1E7, 0x8AFE, 0xD1E8, 0xF919, 0xD1E9, 0xF91A, 0xD1EA, 0xF91B, + 0xD1EB, 0xF91C, 0xD1EC, 0x6696, 0xD1ED, 0xF91D, 0xD1EE, 0x7156, + 0xD1EF, 0xF91E, 0xD1F0, 0xF91F, 0xD1F1, 0x96E3, 0xD1F2, 0xF920, + 0xD1F3, 0x634F, 0xD1F4, 0x637A, 0xD1F5, 0x5357, 0xD1F6, 0xF921, + 0xD1F7, 0x678F, 0xD1F8, 0x6960, 0xD1F9, 0x6E73, 0xD1FA, 0xF922, + 0xD1FB, 0x7537, 0xD1FC, 0xF923, 0xD1FD, 0xF924, 0xD1FE, 0xF925, + 0xD2A1, 0x7D0D, 0xD2A2, 0xF926, 0xD2A3, 0xF927, 0xD2A4, 0x8872, + 0xD2A5, 0x56CA, 0xD2A6, 0x5A18, 0xD2A7, 0xF928, 0xD2A8, 0xF929, + 0xD2A9, 0xF92A, 0xD2AA, 0xF92B, 0xD2AB, 0xF92C, 0xD2AC, 0x4E43, + 0xD2AD, 0xF92D, 0xD2AE, 0x5167, 0xD2AF, 0x5948, 0xD2B0, 0x67F0, + 0xD2B1, 0x8010, 0xD2B2, 0xF92E, 0xD2B3, 0x5973, 0xD2B4, 0x5E74, + 0xD2B5, 0x649A, 0xD2B6, 0x79CA, 0xD2B7, 0x5FF5, 0xD2B8, 0x606C, + 0xD2B9, 0x62C8, 0xD2BA, 0x637B, 0xD2BB, 0x5BE7, 0xD2BC, 0x5BD7, + 0xD2BD, 0x52AA, 0xD2BE, 0xF92F, 0xD2BF, 0x5974, 0xD2C0, 0x5F29, + 0xD2C1, 0x6012, 0xD2C2, 0xF930, 0xD2C3, 0xF931, 0xD2C4, 0xF932, + 0xD2C5, 0x7459, 0xD2C6, 0xF933, 0xD2C7, 0xF934, 0xD2C8, 0xF935, + 0xD2C9, 0xF936, 0xD2CA, 0xF937, 0xD2CB, 0xF938, 0xD2CC, 0x99D1, + 0xD2CD, 0xF939, 0xD2CE, 0xF93A, 0xD2CF, 0xF93B, 0xD2D0, 0xF93C, + 0xD2D1, 0xF93D, 0xD2D2, 0xF93E, 0xD2D3, 0xF93F, 0xD2D4, 0xF940, + 0xD2D5, 0xF941, 0xD2D6, 0xF942, 0xD2D7, 0xF943, 0xD2D8, 0x6FC3, + 0xD2D9, 0xF944, 0xD2DA, 0xF945, 0xD2DB, 0x81BF, 0xD2DC, 0x8FB2, + 0xD2DD, 0x60F1, 0xD2DE, 0xF946, 0xD2DF, 0xF947, 0xD2E0, 0x8166, + 0xD2E1, 0xF948, 0xD2E2, 0xF949, 0xD2E3, 0x5C3F, 0xD2E4, 0xF94A, + 0xD2E5, 0xF94B, 0xD2E6, 0xF94C, 0xD2E7, 0xF94D, 0xD2E8, 0xF94E, + 0xD2E9, 0xF94F, 0xD2EA, 0xF950, 0xD2EB, 0xF951, 0xD2EC, 0x5AE9, + 0xD2ED, 0x8A25, 0xD2EE, 0x677B, 0xD2EF, 0x7D10, 0xD2F0, 0xF952, + 0xD2F1, 0xF953, 0xD2F2, 0xF954, 0xD2F3, 0xF955, 0xD2F4, 0xF956, + 0xD2F5, 0xF957, 0xD2F6, 0x80FD, 0xD2F7, 0xF958, 0xD2F8, 0xF959, + 0xD2F9, 0x5C3C, 0xD2FA, 0x6CE5, 0xD2FB, 0x533F, 0xD2FC, 0x6EBA, + 0xD2FD, 0x591A, 0xD2FE, 0x8336, 0xD3A1, 0x4E39, 0xD3A2, 0x4EB6, + 0xD3A3, 0x4F46, 0xD3A4, 0x55AE, 0xD3A5, 0x5718, 0xD3A6, 0x58C7, + 0xD3A7, 0x5F56, 0xD3A8, 0x65B7, 0xD3A9, 0x65E6, 0xD3AA, 0x6A80, + 0xD3AB, 0x6BB5, 0xD3AC, 0x6E4D, 0xD3AD, 0x77ED, 0xD3AE, 0x7AEF, + 0xD3AF, 0x7C1E, 0xD3B0, 0x7DDE, 0xD3B1, 0x86CB, 0xD3B2, 0x8892, + 0xD3B3, 0x9132, 0xD3B4, 0x935B, 0xD3B5, 0x64BB, 0xD3B6, 0x6FBE, + 0xD3B7, 0x737A, 0xD3B8, 0x75B8, 0xD3B9, 0x9054, 0xD3BA, 0x5556, + 0xD3BB, 0x574D, 0xD3BC, 0x61BA, 0xD3BD, 0x64D4, 0xD3BE, 0x66C7, + 0xD3BF, 0x6DE1, 0xD3C0, 0x6E5B, 0xD3C1, 0x6F6D, 0xD3C2, 0x6FB9, + 0xD3C3, 0x75F0, 0xD3C4, 0x8043, 0xD3C5, 0x81BD, 0xD3C6, 0x8541, + 0xD3C7, 0x8983, 0xD3C8, 0x8AC7, 0xD3C9, 0x8B5A, 0xD3CA, 0x931F, + 0xD3CB, 0x6C93, 0xD3CC, 0x7553, 0xD3CD, 0x7B54, 0xD3CE, 0x8E0F, + 0xD3CF, 0x905D, 0xD3D0, 0x5510, 0xD3D1, 0x5802, 0xD3D2, 0x5858, + 0xD3D3, 0x5E62, 0xD3D4, 0x6207, 0xD3D5, 0x649E, 0xD3D6, 0x68E0, + 0xD3D7, 0x7576, 0xD3D8, 0x7CD6, 0xD3D9, 0x87B3, 0xD3DA, 0x9EE8, + 0xD3DB, 0x4EE3, 0xD3DC, 0x5788, 0xD3DD, 0x576E, 0xD3DE, 0x5927, + 0xD3DF, 0x5C0D, 0xD3E0, 0x5CB1, 0xD3E1, 0x5E36, 0xD3E2, 0x5F85, + 0xD3E3, 0x6234, 0xD3E4, 0x64E1, 0xD3E5, 0x73B3, 0xD3E6, 0x81FA, + 0xD3E7, 0x888B, 0xD3E8, 0x8CB8, 0xD3E9, 0x968A, 0xD3EA, 0x9EDB, + 0xD3EB, 0x5B85, 0xD3EC, 0x5FB7, 0xD3ED, 0x60B3, 0xD3EE, 0x5012, + 0xD3EF, 0x5200, 0xD3F0, 0x5230, 0xD3F1, 0x5716, 0xD3F2, 0x5835, + 0xD3F3, 0x5857, 0xD3F4, 0x5C0E, 0xD3F5, 0x5C60, 0xD3F6, 0x5CF6, + 0xD3F7, 0x5D8B, 0xD3F8, 0x5EA6, 0xD3F9, 0x5F92, 0xD3FA, 0x60BC, + 0xD3FB, 0x6311, 0xD3FC, 0x6389, 0xD3FD, 0x6417, 0xD3FE, 0x6843, + 0xD4A1, 0x68F9, 0xD4A2, 0x6AC2, 0xD4A3, 0x6DD8, 0xD4A4, 0x6E21, + 0xD4A5, 0x6ED4, 0xD4A6, 0x6FE4, 0xD4A7, 0x71FE, 0xD4A8, 0x76DC, + 0xD4A9, 0x7779, 0xD4AA, 0x79B1, 0xD4AB, 0x7A3B, 0xD4AC, 0x8404, + 0xD4AD, 0x89A9, 0xD4AE, 0x8CED, 0xD4AF, 0x8DF3, 0xD4B0, 0x8E48, + 0xD4B1, 0x9003, 0xD4B2, 0x9014, 0xD4B3, 0x9053, 0xD4B4, 0x90FD, + 0xD4B5, 0x934D, 0xD4B6, 0x9676, 0xD4B7, 0x97DC, 0xD4B8, 0x6BD2, + 0xD4B9, 0x7006, 0xD4BA, 0x7258, 0xD4BB, 0x72A2, 0xD4BC, 0x7368, + 0xD4BD, 0x7763, 0xD4BE, 0x79BF, 0xD4BF, 0x7BE4, 0xD4C0, 0x7E9B, + 0xD4C1, 0x8B80, 0xD4C2, 0x58A9, 0xD4C3, 0x60C7, 0xD4C4, 0x6566, + 0xD4C5, 0x65FD, 0xD4C6, 0x66BE, 0xD4C7, 0x6C8C, 0xD4C8, 0x711E, + 0xD4C9, 0x71C9, 0xD4CA, 0x8C5A, 0xD4CB, 0x9813, 0xD4CC, 0x4E6D, + 0xD4CD, 0x7A81, 0xD4CE, 0x4EDD, 0xD4CF, 0x51AC, 0xD4D0, 0x51CD, + 0xD4D1, 0x52D5, 0xD4D2, 0x540C, 0xD4D3, 0x61A7, 0xD4D4, 0x6771, + 0xD4D5, 0x6850, 0xD4D6, 0x68DF, 0xD4D7, 0x6D1E, 0xD4D8, 0x6F7C, + 0xD4D9, 0x75BC, 0xD4DA, 0x77B3, 0xD4DB, 0x7AE5, 0xD4DC, 0x80F4, + 0xD4DD, 0x8463, 0xD4DE, 0x9285, 0xD4DF, 0x515C, 0xD4E0, 0x6597, + 0xD4E1, 0x675C, 0xD4E2, 0x6793, 0xD4E3, 0x75D8, 0xD4E4, 0x7AC7, + 0xD4E5, 0x8373, 0xD4E6, 0xF95A, 0xD4E7, 0x8C46, 0xD4E8, 0x9017, + 0xD4E9, 0x982D, 0xD4EA, 0x5C6F, 0xD4EB, 0x81C0, 0xD4EC, 0x829A, + 0xD4ED, 0x9041, 0xD4EE, 0x906F, 0xD4EF, 0x920D, 0xD4F0, 0x5F97, + 0xD4F1, 0x5D9D, 0xD4F2, 0x6A59, 0xD4F3, 0x71C8, 0xD4F4, 0x767B, + 0xD4F5, 0x7B49, 0xD4F6, 0x85E4, 0xD4F7, 0x8B04, 0xD4F8, 0x9127, + 0xD4F9, 0x9A30, 0xD4FA, 0x5587, 0xD4FB, 0x61F6, 0xD4FC, 0xF95B, + 0xD4FD, 0x7669, 0xD4FE, 0x7F85, 0xD5A1, 0x863F, 0xD5A2, 0x87BA, + 0xD5A3, 0x88F8, 0xD5A4, 0x908F, 0xD5A5, 0xF95C, 0xD5A6, 0x6D1B, + 0xD5A7, 0x70D9, 0xD5A8, 0x73DE, 0xD5A9, 0x7D61, 0xD5AA, 0x843D, + 0xD5AB, 0xF95D, 0xD5AC, 0x916A, 0xD5AD, 0x99F1, 0xD5AE, 0xF95E, + 0xD5AF, 0x4E82, 0xD5B0, 0x5375, 0xD5B1, 0x6B04, 0xD5B2, 0x6B12, + 0xD5B3, 0x703E, 0xD5B4, 0x721B, 0xD5B5, 0x862D, 0xD5B6, 0x9E1E, + 0xD5B7, 0x524C, 0xD5B8, 0x8FA3, 0xD5B9, 0x5D50, 0xD5BA, 0x64E5, + 0xD5BB, 0x652C, 0xD5BC, 0x6B16, 0xD5BD, 0x6FEB, 0xD5BE, 0x7C43, + 0xD5BF, 0x7E9C, 0xD5C0, 0x85CD, 0xD5C1, 0x8964, 0xD5C2, 0x89BD, + 0xD5C3, 0x62C9, 0xD5C4, 0x81D8, 0xD5C5, 0x881F, 0xD5C6, 0x5ECA, + 0xD5C7, 0x6717, 0xD5C8, 0x6D6A, 0xD5C9, 0x72FC, 0xD5CA, 0x7405, + 0xD5CB, 0x746F, 0xD5CC, 0x8782, 0xD5CD, 0x90DE, 0xD5CE, 0x4F86, + 0xD5CF, 0x5D0D, 0xD5D0, 0x5FA0, 0xD5D1, 0x840A, 0xD5D2, 0x51B7, + 0xD5D3, 0x63A0, 0xD5D4, 0x7565, 0xD5D5, 0x4EAE, 0xD5D6, 0x5006, + 0xD5D7, 0x5169, 0xD5D8, 0x51C9, 0xD5D9, 0x6881, 0xD5DA, 0x6A11, + 0xD5DB, 0x7CAE, 0xD5DC, 0x7CB1, 0xD5DD, 0x7CE7, 0xD5DE, 0x826F, + 0xD5DF, 0x8AD2, 0xD5E0, 0x8F1B, 0xD5E1, 0x91CF, 0xD5E2, 0x4FB6, + 0xD5E3, 0x5137, 0xD5E4, 0x52F5, 0xD5E5, 0x5442, 0xD5E6, 0x5EEC, + 0xD5E7, 0x616E, 0xD5E8, 0x623E, 0xD5E9, 0x65C5, 0xD5EA, 0x6ADA, + 0xD5EB, 0x6FFE, 0xD5EC, 0x792A, 0xD5ED, 0x85DC, 0xD5EE, 0x8823, + 0xD5EF, 0x95AD, 0xD5F0, 0x9A62, 0xD5F1, 0x9A6A, 0xD5F2, 0x9E97, + 0xD5F3, 0x9ECE, 0xD5F4, 0x529B, 0xD5F5, 0x66C6, 0xD5F6, 0x6B77, + 0xD5F7, 0x701D, 0xD5F8, 0x792B, 0xD5F9, 0x8F62, 0xD5FA, 0x9742, + 0xD5FB, 0x6190, 0xD5FC, 0x6200, 0xD5FD, 0x6523, 0xD5FE, 0x6F23, + 0xD6A1, 0x7149, 0xD6A2, 0x7489, 0xD6A3, 0x7DF4, 0xD6A4, 0x806F, + 0xD6A5, 0x84EE, 0xD6A6, 0x8F26, 0xD6A7, 0x9023, 0xD6A8, 0x934A, + 0xD6A9, 0x51BD, 0xD6AA, 0x5217, 0xD6AB, 0x52A3, 0xD6AC, 0x6D0C, + 0xD6AD, 0x70C8, 0xD6AE, 0x88C2, 0xD6AF, 0x5EC9, 0xD6B0, 0x6582, + 0xD6B1, 0x6BAE, 0xD6B2, 0x6FC2, 0xD6B3, 0x7C3E, 0xD6B4, 0x7375, + 0xD6B5, 0x4EE4, 0xD6B6, 0x4F36, 0xD6B7, 0x56F9, 0xD6B8, 0xF95F, + 0xD6B9, 0x5CBA, 0xD6BA, 0x5DBA, 0xD6BB, 0x601C, 0xD6BC, 0x73B2, + 0xD6BD, 0x7B2D, 0xD6BE, 0x7F9A, 0xD6BF, 0x7FCE, 0xD6C0, 0x8046, + 0xD6C1, 0x901E, 0xD6C2, 0x9234, 0xD6C3, 0x96F6, 0xD6C4, 0x9748, + 0xD6C5, 0x9818, 0xD6C6, 0x9F61, 0xD6C7, 0x4F8B, 0xD6C8, 0x6FA7, + 0xD6C9, 0x79AE, 0xD6CA, 0x91B4, 0xD6CB, 0x96B7, 0xD6CC, 0x52DE, + 0xD6CD, 0xF960, 0xD6CE, 0x6488, 0xD6CF, 0x64C4, 0xD6D0, 0x6AD3, + 0xD6D1, 0x6F5E, 0xD6D2, 0x7018, 0xD6D3, 0x7210, 0xD6D4, 0x76E7, + 0xD6D5, 0x8001, 0xD6D6, 0x8606, 0xD6D7, 0x865C, 0xD6D8, 0x8DEF, + 0xD6D9, 0x8F05, 0xD6DA, 0x9732, 0xD6DB, 0x9B6F, 0xD6DC, 0x9DFA, + 0xD6DD, 0x9E75, 0xD6DE, 0x788C, 0xD6DF, 0x797F, 0xD6E0, 0x7DA0, + 0xD6E1, 0x83C9, 0xD6E2, 0x9304, 0xD6E3, 0x9E7F, 0xD6E4, 0x9E93, + 0xD6E5, 0x8AD6, 0xD6E6, 0x58DF, 0xD6E7, 0x5F04, 0xD6E8, 0x6727, + 0xD6E9, 0x7027, 0xD6EA, 0x74CF, 0xD6EB, 0x7C60, 0xD6EC, 0x807E, + 0xD6ED, 0x5121, 0xD6EE, 0x7028, 0xD6EF, 0x7262, 0xD6F0, 0x78CA, + 0xD6F1, 0x8CC2, 0xD6F2, 0x8CDA, 0xD6F3, 0x8CF4, 0xD6F4, 0x96F7, + 0xD6F5, 0x4E86, 0xD6F6, 0x50DA, 0xD6F7, 0x5BEE, 0xD6F8, 0x5ED6, + 0xD6F9, 0x6599, 0xD6FA, 0x71CE, 0xD6FB, 0x7642, 0xD6FC, 0x77AD, + 0xD6FD, 0x804A, 0xD6FE, 0x84FC, 0xD7A1, 0x907C, 0xD7A2, 0x9B27, + 0xD7A3, 0x9F8D, 0xD7A4, 0x58D8, 0xD7A5, 0x5A41, 0xD7A6, 0x5C62, + 0xD7A7, 0x6A13, 0xD7A8, 0x6DDA, 0xD7A9, 0x6F0F, 0xD7AA, 0x763B, + 0xD7AB, 0x7D2F, 0xD7AC, 0x7E37, 0xD7AD, 0x851E, 0xD7AE, 0x8938, + 0xD7AF, 0x93E4, 0xD7B0, 0x964B, 0xD7B1, 0x5289, 0xD7B2, 0x65D2, + 0xD7B3, 0x67F3, 0xD7B4, 0x69B4, 0xD7B5, 0x6D41, 0xD7B6, 0x6E9C, + 0xD7B7, 0x700F, 0xD7B8, 0x7409, 0xD7B9, 0x7460, 0xD7BA, 0x7559, + 0xD7BB, 0x7624, 0xD7BC, 0x786B, 0xD7BD, 0x8B2C, 0xD7BE, 0x985E, + 0xD7BF, 0x516D, 0xD7C0, 0x622E, 0xD7C1, 0x9678, 0xD7C2, 0x4F96, + 0xD7C3, 0x502B, 0xD7C4, 0x5D19, 0xD7C5, 0x6DEA, 0xD7C6, 0x7DB8, + 0xD7C7, 0x8F2A, 0xD7C8, 0x5F8B, 0xD7C9, 0x6144, 0xD7CA, 0x6817, + 0xD7CB, 0xF961, 0xD7CC, 0x9686, 0xD7CD, 0x52D2, 0xD7CE, 0x808B, + 0xD7CF, 0x51DC, 0xD7D0, 0x51CC, 0xD7D1, 0x695E, 0xD7D2, 0x7A1C, + 0xD7D3, 0x7DBE, 0xD7D4, 0x83F1, 0xD7D5, 0x9675, 0xD7D6, 0x4FDA, + 0xD7D7, 0x5229, 0xD7D8, 0x5398, 0xD7D9, 0x540F, 0xD7DA, 0x550E, + 0xD7DB, 0x5C65, 0xD7DC, 0x60A7, 0xD7DD, 0x674E, 0xD7DE, 0x68A8, + 0xD7DF, 0x6D6C, 0xD7E0, 0x7281, 0xD7E1, 0x72F8, 0xD7E2, 0x7406, + 0xD7E3, 0x7483, 0xD7E4, 0xF962, 0xD7E5, 0x75E2, 0xD7E6, 0x7C6C, + 0xD7E7, 0x7F79, 0xD7E8, 0x7FB8, 0xD7E9, 0x8389, 0xD7EA, 0x88CF, + 0xD7EB, 0x88E1, 0xD7EC, 0x91CC, 0xD7ED, 0x91D0, 0xD7EE, 0x96E2, + 0xD7EF, 0x9BC9, 0xD7F0, 0x541D, 0xD7F1, 0x6F7E, 0xD7F2, 0x71D0, + 0xD7F3, 0x7498, 0xD7F4, 0x85FA, 0xD7F5, 0x8EAA, 0xD7F6, 0x96A3, + 0xD7F7, 0x9C57, 0xD7F8, 0x9E9F, 0xD7F9, 0x6797, 0xD7FA, 0x6DCB, + 0xD7FB, 0x7433, 0xD7FC, 0x81E8, 0xD7FD, 0x9716, 0xD7FE, 0x782C, + 0xD8A1, 0x7ACB, 0xD8A2, 0x7B20, 0xD8A3, 0x7C92, 0xD8A4, 0x6469, + 0xD8A5, 0x746A, 0xD8A6, 0x75F2, 0xD8A7, 0x78BC, 0xD8A8, 0x78E8, + 0xD8A9, 0x99AC, 0xD8AA, 0x9B54, 0xD8AB, 0x9EBB, 0xD8AC, 0x5BDE, + 0xD8AD, 0x5E55, 0xD8AE, 0x6F20, 0xD8AF, 0x819C, 0xD8B0, 0x83AB, + 0xD8B1, 0x9088, 0xD8B2, 0x4E07, 0xD8B3, 0x534D, 0xD8B4, 0x5A29, + 0xD8B5, 0x5DD2, 0xD8B6, 0x5F4E, 0xD8B7, 0x6162, 0xD8B8, 0x633D, + 0xD8B9, 0x6669, 0xD8BA, 0x66FC, 0xD8BB, 0x6EFF, 0xD8BC, 0x6F2B, + 0xD8BD, 0x7063, 0xD8BE, 0x779E, 0xD8BF, 0x842C, 0xD8C0, 0x8513, + 0xD8C1, 0x883B, 0xD8C2, 0x8F13, 0xD8C3, 0x9945, 0xD8C4, 0x9C3B, + 0xD8C5, 0x551C, 0xD8C6, 0x62B9, 0xD8C7, 0x672B, 0xD8C8, 0x6CAB, + 0xD8C9, 0x8309, 0xD8CA, 0x896A, 0xD8CB, 0x977A, 0xD8CC, 0x4EA1, + 0xD8CD, 0x5984, 0xD8CE, 0x5FD8, 0xD8CF, 0x5FD9, 0xD8D0, 0x671B, + 0xD8D1, 0x7DB2, 0xD8D2, 0x7F54, 0xD8D3, 0x8292, 0xD8D4, 0x832B, + 0xD8D5, 0x83BD, 0xD8D6, 0x8F1E, 0xD8D7, 0x9099, 0xD8D8, 0x57CB, + 0xD8D9, 0x59B9, 0xD8DA, 0x5A92, 0xD8DB, 0x5BD0, 0xD8DC, 0x6627, + 0xD8DD, 0x679A, 0xD8DE, 0x6885, 0xD8DF, 0x6BCF, 0xD8E0, 0x7164, + 0xD8E1, 0x7F75, 0xD8E2, 0x8CB7, 0xD8E3, 0x8CE3, 0xD8E4, 0x9081, + 0xD8E5, 0x9B45, 0xD8E6, 0x8108, 0xD8E7, 0x8C8A, 0xD8E8, 0x964C, + 0xD8E9, 0x9A40, 0xD8EA, 0x9EA5, 0xD8EB, 0x5B5F, 0xD8EC, 0x6C13, + 0xD8ED, 0x731B, 0xD8EE, 0x76F2, 0xD8EF, 0x76DF, 0xD8F0, 0x840C, + 0xD8F1, 0x51AA, 0xD8F2, 0x8993, 0xD8F3, 0x514D, 0xD8F4, 0x5195, + 0xD8F5, 0x52C9, 0xD8F6, 0x68C9, 0xD8F7, 0x6C94, 0xD8F8, 0x7704, + 0xD8F9, 0x7720, 0xD8FA, 0x7DBF, 0xD8FB, 0x7DEC, 0xD8FC, 0x9762, + 0xD8FD, 0x9EB5, 0xD8FE, 0x6EC5, 0xD9A1, 0x8511, 0xD9A2, 0x51A5, + 0xD9A3, 0x540D, 0xD9A4, 0x547D, 0xD9A5, 0x660E, 0xD9A6, 0x669D, + 0xD9A7, 0x6927, 0xD9A8, 0x6E9F, 0xD9A9, 0x76BF, 0xD9AA, 0x7791, + 0xD9AB, 0x8317, 0xD9AC, 0x84C2, 0xD9AD, 0x879F, 0xD9AE, 0x9169, + 0xD9AF, 0x9298, 0xD9B0, 0x9CF4, 0xD9B1, 0x8882, 0xD9B2, 0x4FAE, + 0xD9B3, 0x5192, 0xD9B4, 0x52DF, 0xD9B5, 0x59C6, 0xD9B6, 0x5E3D, + 0xD9B7, 0x6155, 0xD9B8, 0x6478, 0xD9B9, 0x6479, 0xD9BA, 0x66AE, + 0xD9BB, 0x67D0, 0xD9BC, 0x6A21, 0xD9BD, 0x6BCD, 0xD9BE, 0x6BDB, + 0xD9BF, 0x725F, 0xD9C0, 0x7261, 0xD9C1, 0x7441, 0xD9C2, 0x7738, + 0xD9C3, 0x77DB, 0xD9C4, 0x8017, 0xD9C5, 0x82BC, 0xD9C6, 0x8305, + 0xD9C7, 0x8B00, 0xD9C8, 0x8B28, 0xD9C9, 0x8C8C, 0xD9CA, 0x6728, + 0xD9CB, 0x6C90, 0xD9CC, 0x7267, 0xD9CD, 0x76EE, 0xD9CE, 0x7766, + 0xD9CF, 0x7A46, 0xD9D0, 0x9DA9, 0xD9D1, 0x6B7F, 0xD9D2, 0x6C92, + 0xD9D3, 0x5922, 0xD9D4, 0x6726, 0xD9D5, 0x8499, 0xD9D6, 0x536F, + 0xD9D7, 0x5893, 0xD9D8, 0x5999, 0xD9D9, 0x5EDF, 0xD9DA, 0x63CF, + 0xD9DB, 0x6634, 0xD9DC, 0x6773, 0xD9DD, 0x6E3A, 0xD9DE, 0x732B, + 0xD9DF, 0x7AD7, 0xD9E0, 0x82D7, 0xD9E1, 0x9328, 0xD9E2, 0x52D9, + 0xD9E3, 0x5DEB, 0xD9E4, 0x61AE, 0xD9E5, 0x61CB, 0xD9E6, 0x620A, + 0xD9E7, 0x62C7, 0xD9E8, 0x64AB, 0xD9E9, 0x65E0, 0xD9EA, 0x6959, + 0xD9EB, 0x6B66, 0xD9EC, 0x6BCB, 0xD9ED, 0x7121, 0xD9EE, 0x73F7, + 0xD9EF, 0x755D, 0xD9F0, 0x7E46, 0xD9F1, 0x821E, 0xD9F2, 0x8302, + 0xD9F3, 0x856A, 0xD9F4, 0x8AA3, 0xD9F5, 0x8CBF, 0xD9F6, 0x9727, + 0xD9F7, 0x9D61, 0xD9F8, 0x58A8, 0xD9F9, 0x9ED8, 0xD9FA, 0x5011, + 0xD9FB, 0x520E, 0xD9FC, 0x543B, 0xD9FD, 0x554F, 0xD9FE, 0x6587, + 0xDAA1, 0x6C76, 0xDAA2, 0x7D0A, 0xDAA3, 0x7D0B, 0xDAA4, 0x805E, + 0xDAA5, 0x868A, 0xDAA6, 0x9580, 0xDAA7, 0x96EF, 0xDAA8, 0x52FF, + 0xDAA9, 0x6C95, 0xDAAA, 0x7269, 0xDAAB, 0x5473, 0xDAAC, 0x5A9A, + 0xDAAD, 0x5C3E, 0xDAAE, 0x5D4B, 0xDAAF, 0x5F4C, 0xDAB0, 0x5FAE, + 0xDAB1, 0x672A, 0xDAB2, 0x68B6, 0xDAB3, 0x6963, 0xDAB4, 0x6E3C, + 0xDAB5, 0x6E44, 0xDAB6, 0x7709, 0xDAB7, 0x7C73, 0xDAB8, 0x7F8E, + 0xDAB9, 0x8587, 0xDABA, 0x8B0E, 0xDABB, 0x8FF7, 0xDABC, 0x9761, + 0xDABD, 0x9EF4, 0xDABE, 0x5CB7, 0xDABF, 0x60B6, 0xDAC0, 0x610D, + 0xDAC1, 0x61AB, 0xDAC2, 0x654F, 0xDAC3, 0x65FB, 0xDAC4, 0x65FC, + 0xDAC5, 0x6C11, 0xDAC6, 0x6CEF, 0xDAC7, 0x739F, 0xDAC8, 0x73C9, + 0xDAC9, 0x7DE1, 0xDACA, 0x9594, 0xDACB, 0x5BC6, 0xDACC, 0x871C, + 0xDACD, 0x8B10, 0xDACE, 0x525D, 0xDACF, 0x535A, 0xDAD0, 0x62CD, + 0xDAD1, 0x640F, 0xDAD2, 0x64B2, 0xDAD3, 0x6734, 0xDAD4, 0x6A38, + 0xDAD5, 0x6CCA, 0xDAD6, 0x73C0, 0xDAD7, 0x749E, 0xDAD8, 0x7B94, + 0xDAD9, 0x7C95, 0xDADA, 0x7E1B, 0xDADB, 0x818A, 0xDADC, 0x8236, + 0xDADD, 0x8584, 0xDADE, 0x8FEB, 0xDADF, 0x96F9, 0xDAE0, 0x99C1, + 0xDAE1, 0x4F34, 0xDAE2, 0x534A, 0xDAE3, 0x53CD, 0xDAE4, 0x53DB, + 0xDAE5, 0x62CC, 0xDAE6, 0x642C, 0xDAE7, 0x6500, 0xDAE8, 0x6591, + 0xDAE9, 0x69C3, 0xDAEA, 0x6CEE, 0xDAEB, 0x6F58, 0xDAEC, 0x73ED, + 0xDAED, 0x7554, 0xDAEE, 0x7622, 0xDAEF, 0x76E4, 0xDAF0, 0x76FC, + 0xDAF1, 0x78D0, 0xDAF2, 0x78FB, 0xDAF3, 0x792C, 0xDAF4, 0x7D46, + 0xDAF5, 0x822C, 0xDAF6, 0x87E0, 0xDAF7, 0x8FD4, 0xDAF8, 0x9812, + 0xDAF9, 0x98EF, 0xDAFA, 0x52C3, 0xDAFB, 0x62D4, 0xDAFC, 0x64A5, + 0xDAFD, 0x6E24, 0xDAFE, 0x6F51, 0xDBA1, 0x767C, 0xDBA2, 0x8DCB, + 0xDBA3, 0x91B1, 0xDBA4, 0x9262, 0xDBA5, 0x9AEE, 0xDBA6, 0x9B43, + 0xDBA7, 0x5023, 0xDBA8, 0x508D, 0xDBA9, 0x574A, 0xDBAA, 0x59A8, + 0xDBAB, 0x5C28, 0xDBAC, 0x5E47, 0xDBAD, 0x5F77, 0xDBAE, 0x623F, + 0xDBAF, 0x653E, 0xDBB0, 0x65B9, 0xDBB1, 0x65C1, 0xDBB2, 0x6609, + 0xDBB3, 0x678B, 0xDBB4, 0x699C, 0xDBB5, 0x6EC2, 0xDBB6, 0x78C5, + 0xDBB7, 0x7D21, 0xDBB8, 0x80AA, 0xDBB9, 0x8180, 0xDBBA, 0x822B, + 0xDBBB, 0x82B3, 0xDBBC, 0x84A1, 0xDBBD, 0x868C, 0xDBBE, 0x8A2A, + 0xDBBF, 0x8B17, 0xDBC0, 0x90A6, 0xDBC1, 0x9632, 0xDBC2, 0x9F90, + 0xDBC3, 0x500D, 0xDBC4, 0x4FF3, 0xDBC5, 0xF963, 0xDBC6, 0x57F9, + 0xDBC7, 0x5F98, 0xDBC8, 0x62DC, 0xDBC9, 0x6392, 0xDBCA, 0x676F, + 0xDBCB, 0x6E43, 0xDBCC, 0x7119, 0xDBCD, 0x76C3, 0xDBCE, 0x80CC, + 0xDBCF, 0x80DA, 0xDBD0, 0x88F4, 0xDBD1, 0x88F5, 0xDBD2, 0x8919, + 0xDBD3, 0x8CE0, 0xDBD4, 0x8F29, 0xDBD5, 0x914D, 0xDBD6, 0x966A, + 0xDBD7, 0x4F2F, 0xDBD8, 0x4F70, 0xDBD9, 0x5E1B, 0xDBDA, 0x67CF, + 0xDBDB, 0x6822, 0xDBDC, 0x767D, 0xDBDD, 0x767E, 0xDBDE, 0x9B44, + 0xDBDF, 0x5E61, 0xDBE0, 0x6A0A, 0xDBE1, 0x7169, 0xDBE2, 0x71D4, + 0xDBE3, 0x756A, 0xDBE4, 0xF964, 0xDBE5, 0x7E41, 0xDBE6, 0x8543, + 0xDBE7, 0x85E9, 0xDBE8, 0x98DC, 0xDBE9, 0x4F10, 0xDBEA, 0x7B4F, + 0xDBEB, 0x7F70, 0xDBEC, 0x95A5, 0xDBED, 0x51E1, 0xDBEE, 0x5E06, + 0xDBEF, 0x68B5, 0xDBF0, 0x6C3E, 0xDBF1, 0x6C4E, 0xDBF2, 0x6CDB, + 0xDBF3, 0x72AF, 0xDBF4, 0x7BC4, 0xDBF5, 0x8303, 0xDBF6, 0x6CD5, + 0xDBF7, 0x743A, 0xDBF8, 0x50FB, 0xDBF9, 0x5288, 0xDBFA, 0x58C1, + 0xDBFB, 0x64D8, 0xDBFC, 0x6A97, 0xDBFD, 0x74A7, 0xDBFE, 0x7656, + 0xDCA1, 0x78A7, 0xDCA2, 0x8617, 0xDCA3, 0x95E2, 0xDCA4, 0x9739, + 0xDCA5, 0xF965, 0xDCA6, 0x535E, 0xDCA7, 0x5F01, 0xDCA8, 0x8B8A, + 0xDCA9, 0x8FA8, 0xDCAA, 0x8FAF, 0xDCAB, 0x908A, 0xDCAC, 0x5225, + 0xDCAD, 0x77A5, 0xDCAE, 0x9C49, 0xDCAF, 0x9F08, 0xDCB0, 0x4E19, + 0xDCB1, 0x5002, 0xDCB2, 0x5175, 0xDCB3, 0x5C5B, 0xDCB4, 0x5E77, + 0xDCB5, 0x661E, 0xDCB6, 0x663A, 0xDCB7, 0x67C4, 0xDCB8, 0x68C5, + 0xDCB9, 0x70B3, 0xDCBA, 0x7501, 0xDCBB, 0x75C5, 0xDCBC, 0x79C9, + 0xDCBD, 0x7ADD, 0xDCBE, 0x8F27, 0xDCBF, 0x9920, 0xDCC0, 0x9A08, + 0xDCC1, 0x4FDD, 0xDCC2, 0x5821, 0xDCC3, 0x5831, 0xDCC4, 0x5BF6, + 0xDCC5, 0x666E, 0xDCC6, 0x6B65, 0xDCC7, 0x6D11, 0xDCC8, 0x6E7A, + 0xDCC9, 0x6F7D, 0xDCCA, 0x73E4, 0xDCCB, 0x752B, 0xDCCC, 0x83E9, + 0xDCCD, 0x88DC, 0xDCCE, 0x8913, 0xDCCF, 0x8B5C, 0xDCD0, 0x8F14, + 0xDCD1, 0x4F0F, 0xDCD2, 0x50D5, 0xDCD3, 0x5310, 0xDCD4, 0x535C, + 0xDCD5, 0x5B93, 0xDCD6, 0x5FA9, 0xDCD7, 0x670D, 0xDCD8, 0x798F, + 0xDCD9, 0x8179, 0xDCDA, 0x832F, 0xDCDB, 0x8514, 0xDCDC, 0x8907, + 0xDCDD, 0x8986, 0xDCDE, 0x8F39, 0xDCDF, 0x8F3B, 0xDCE0, 0x99A5, + 0xDCE1, 0x9C12, 0xDCE2, 0x672C, 0xDCE3, 0x4E76, 0xDCE4, 0x4FF8, + 0xDCE5, 0x5949, 0xDCE6, 0x5C01, 0xDCE7, 0x5CEF, 0xDCE8, 0x5CF0, + 0xDCE9, 0x6367, 0xDCEA, 0x68D2, 0xDCEB, 0x70FD, 0xDCEC, 0x71A2, + 0xDCED, 0x742B, 0xDCEE, 0x7E2B, 0xDCEF, 0x84EC, 0xDCF0, 0x8702, + 0xDCF1, 0x9022, 0xDCF2, 0x92D2, 0xDCF3, 0x9CF3, 0xDCF4, 0x4E0D, + 0xDCF5, 0x4ED8, 0xDCF6, 0x4FEF, 0xDCF7, 0x5085, 0xDCF8, 0x5256, + 0xDCF9, 0x526F, 0xDCFA, 0x5426, 0xDCFB, 0x5490, 0xDCFC, 0x57E0, + 0xDCFD, 0x592B, 0xDCFE, 0x5A66, 0xDDA1, 0x5B5A, 0xDDA2, 0x5B75, + 0xDDA3, 0x5BCC, 0xDDA4, 0x5E9C, 0xDDA5, 0xF966, 0xDDA6, 0x6276, + 0xDDA7, 0x6577, 0xDDA8, 0x65A7, 0xDDA9, 0x6D6E, 0xDDAA, 0x6EA5, + 0xDDAB, 0x7236, 0xDDAC, 0x7B26, 0xDDAD, 0x7C3F, 0xDDAE, 0x7F36, + 0xDDAF, 0x8150, 0xDDB0, 0x8151, 0xDDB1, 0x819A, 0xDDB2, 0x8240, + 0xDDB3, 0x8299, 0xDDB4, 0x83A9, 0xDDB5, 0x8A03, 0xDDB6, 0x8CA0, + 0xDDB7, 0x8CE6, 0xDDB8, 0x8CFB, 0xDDB9, 0x8D74, 0xDDBA, 0x8DBA, + 0xDDBB, 0x90E8, 0xDDBC, 0x91DC, 0xDDBD, 0x961C, 0xDDBE, 0x9644, + 0xDDBF, 0x99D9, 0xDDC0, 0x9CE7, 0xDDC1, 0x5317, 0xDDC2, 0x5206, + 0xDDC3, 0x5429, 0xDDC4, 0x5674, 0xDDC5, 0x58B3, 0xDDC6, 0x5954, + 0xDDC7, 0x596E, 0xDDC8, 0x5FFF, 0xDDC9, 0x61A4, 0xDDCA, 0x626E, + 0xDDCB, 0x6610, 0xDDCC, 0x6C7E, 0xDDCD, 0x711A, 0xDDCE, 0x76C6, + 0xDDCF, 0x7C89, 0xDDD0, 0x7CDE, 0xDDD1, 0x7D1B, 0xDDD2, 0x82AC, + 0xDDD3, 0x8CC1, 0xDDD4, 0x96F0, 0xDDD5, 0xF967, 0xDDD6, 0x4F5B, + 0xDDD7, 0x5F17, 0xDDD8, 0x5F7F, 0xDDD9, 0x62C2, 0xDDDA, 0x5D29, + 0xDDDB, 0x670B, 0xDDDC, 0x68DA, 0xDDDD, 0x787C, 0xDDDE, 0x7E43, + 0xDDDF, 0x9D6C, 0xDDE0, 0x4E15, 0xDDE1, 0x5099, 0xDDE2, 0x5315, + 0xDDE3, 0x532A, 0xDDE4, 0x5351, 0xDDE5, 0x5983, 0xDDE6, 0x5A62, + 0xDDE7, 0x5E87, 0xDDE8, 0x60B2, 0xDDE9, 0x618A, 0xDDEA, 0x6249, + 0xDDEB, 0x6279, 0xDDEC, 0x6590, 0xDDED, 0x6787, 0xDDEE, 0x69A7, + 0xDDEF, 0x6BD4, 0xDDF0, 0x6BD6, 0xDDF1, 0x6BD7, 0xDDF2, 0x6BD8, + 0xDDF3, 0x6CB8, 0xDDF4, 0xF968, 0xDDF5, 0x7435, 0xDDF6, 0x75FA, + 0xDDF7, 0x7812, 0xDDF8, 0x7891, 0xDDF9, 0x79D5, 0xDDFA, 0x79D8, + 0xDDFB, 0x7C83, 0xDDFC, 0x7DCB, 0xDDFD, 0x7FE1, 0xDDFE, 0x80A5, + 0xDEA1, 0x813E, 0xDEA2, 0x81C2, 0xDEA3, 0x83F2, 0xDEA4, 0x871A, + 0xDEA5, 0x88E8, 0xDEA6, 0x8AB9, 0xDEA7, 0x8B6C, 0xDEA8, 0x8CBB, + 0xDEA9, 0x9119, 0xDEAA, 0x975E, 0xDEAB, 0x98DB, 0xDEAC, 0x9F3B, + 0xDEAD, 0x56AC, 0xDEAE, 0x5B2A, 0xDEAF, 0x5F6C, 0xDEB0, 0x658C, + 0xDEB1, 0x6AB3, 0xDEB2, 0x6BAF, 0xDEB3, 0x6D5C, 0xDEB4, 0x6FF1, + 0xDEB5, 0x7015, 0xDEB6, 0x725D, 0xDEB7, 0x73AD, 0xDEB8, 0x8CA7, + 0xDEB9, 0x8CD3, 0xDEBA, 0x983B, 0xDEBB, 0x6191, 0xDEBC, 0x6C37, + 0xDEBD, 0x8058, 0xDEBE, 0x9A01, 0xDEBF, 0x4E4D, 0xDEC0, 0x4E8B, + 0xDEC1, 0x4E9B, 0xDEC2, 0x4ED5, 0xDEC3, 0x4F3A, 0xDEC4, 0x4F3C, + 0xDEC5, 0x4F7F, 0xDEC6, 0x4FDF, 0xDEC7, 0x50FF, 0xDEC8, 0x53F2, + 0xDEC9, 0x53F8, 0xDECA, 0x5506, 0xDECB, 0x55E3, 0xDECC, 0x56DB, + 0xDECD, 0x58EB, 0xDECE, 0x5962, 0xDECF, 0x5A11, 0xDED0, 0x5BEB, + 0xDED1, 0x5BFA, 0xDED2, 0x5C04, 0xDED3, 0x5DF3, 0xDED4, 0x5E2B, + 0xDED5, 0x5F99, 0xDED6, 0x601D, 0xDED7, 0x6368, 0xDED8, 0x659C, + 0xDED9, 0x65AF, 0xDEDA, 0x67F6, 0xDEDB, 0x67FB, 0xDEDC, 0x68AD, + 0xDEDD, 0x6B7B, 0xDEDE, 0x6C99, 0xDEDF, 0x6CD7, 0xDEE0, 0x6E23, + 0xDEE1, 0x7009, 0xDEE2, 0x7345, 0xDEE3, 0x7802, 0xDEE4, 0x793E, + 0xDEE5, 0x7940, 0xDEE6, 0x7960, 0xDEE7, 0x79C1, 0xDEE8, 0x7BE9, + 0xDEE9, 0x7D17, 0xDEEA, 0x7D72, 0xDEEB, 0x8086, 0xDEEC, 0x820D, + 0xDEED, 0x838E, 0xDEEE, 0x84D1, 0xDEEF, 0x86C7, 0xDEF0, 0x88DF, + 0xDEF1, 0x8A50, 0xDEF2, 0x8A5E, 0xDEF3, 0x8B1D, 0xDEF4, 0x8CDC, + 0xDEF5, 0x8D66, 0xDEF6, 0x8FAD, 0xDEF7, 0x90AA, 0xDEF8, 0x98FC, + 0xDEF9, 0x99DF, 0xDEFA, 0x9E9D, 0xDEFB, 0x524A, 0xDEFC, 0xF969, + 0xDEFD, 0x6714, 0xDEFE, 0xF96A, 0xDFA1, 0x5098, 0xDFA2, 0x522A, + 0xDFA3, 0x5C71, 0xDFA4, 0x6563, 0xDFA5, 0x6C55, 0xDFA6, 0x73CA, + 0xDFA7, 0x7523, 0xDFA8, 0x759D, 0xDFA9, 0x7B97, 0xDFAA, 0x849C, + 0xDFAB, 0x9178, 0xDFAC, 0x9730, 0xDFAD, 0x4E77, 0xDFAE, 0x6492, + 0xDFAF, 0x6BBA, 0xDFB0, 0x715E, 0xDFB1, 0x85A9, 0xDFB2, 0x4E09, + 0xDFB3, 0xF96B, 0xDFB4, 0x6749, 0xDFB5, 0x68EE, 0xDFB6, 0x6E17, + 0xDFB7, 0x829F, 0xDFB8, 0x8518, 0xDFB9, 0x886B, 0xDFBA, 0x63F7, + 0xDFBB, 0x6F81, 0xDFBC, 0x9212, 0xDFBD, 0x98AF, 0xDFBE, 0x4E0A, + 0xDFBF, 0x50B7, 0xDFC0, 0x50CF, 0xDFC1, 0x511F, 0xDFC2, 0x5546, + 0xDFC3, 0x55AA, 0xDFC4, 0x5617, 0xDFC5, 0x5B40, 0xDFC6, 0x5C19, + 0xDFC7, 0x5CE0, 0xDFC8, 0x5E38, 0xDFC9, 0x5E8A, 0xDFCA, 0x5EA0, + 0xDFCB, 0x5EC2, 0xDFCC, 0x60F3, 0xDFCD, 0x6851, 0xDFCE, 0x6A61, + 0xDFCF, 0x6E58, 0xDFD0, 0x723D, 0xDFD1, 0x7240, 0xDFD2, 0x72C0, + 0xDFD3, 0x76F8, 0xDFD4, 0x7965, 0xDFD5, 0x7BB1, 0xDFD6, 0x7FD4, + 0xDFD7, 0x88F3, 0xDFD8, 0x89F4, 0xDFD9, 0x8A73, 0xDFDA, 0x8C61, + 0xDFDB, 0x8CDE, 0xDFDC, 0x971C, 0xDFDD, 0x585E, 0xDFDE, 0x74BD, + 0xDFDF, 0x8CFD, 0xDFE0, 0x55C7, 0xDFE1, 0xF96C, 0xDFE2, 0x7A61, + 0xDFE3, 0x7D22, 0xDFE4, 0x8272, 0xDFE5, 0x7272, 0xDFE6, 0x751F, + 0xDFE7, 0x7525, 0xDFE8, 0xF96D, 0xDFE9, 0x7B19, 0xDFEA, 0x5885, + 0xDFEB, 0x58FB, 0xDFEC, 0x5DBC, 0xDFED, 0x5E8F, 0xDFEE, 0x5EB6, + 0xDFEF, 0x5F90, 0xDFF0, 0x6055, 0xDFF1, 0x6292, 0xDFF2, 0x637F, + 0xDFF3, 0x654D, 0xDFF4, 0x6691, 0xDFF5, 0x66D9, 0xDFF6, 0x66F8, + 0xDFF7, 0x6816, 0xDFF8, 0x68F2, 0xDFF9, 0x7280, 0xDFFA, 0x745E, + 0xDFFB, 0x7B6E, 0xDFFC, 0x7D6E, 0xDFFD, 0x7DD6, 0xDFFE, 0x7F72, + 0xE0A1, 0x80E5, 0xE0A2, 0x8212, 0xE0A3, 0x85AF, 0xE0A4, 0x897F, + 0xE0A5, 0x8A93, 0xE0A6, 0x901D, 0xE0A7, 0x92E4, 0xE0A8, 0x9ECD, + 0xE0A9, 0x9F20, 0xE0AA, 0x5915, 0xE0AB, 0x596D, 0xE0AC, 0x5E2D, + 0xE0AD, 0x60DC, 0xE0AE, 0x6614, 0xE0AF, 0x6673, 0xE0B0, 0x6790, + 0xE0B1, 0x6C50, 0xE0B2, 0x6DC5, 0xE0B3, 0x6F5F, 0xE0B4, 0x77F3, + 0xE0B5, 0x78A9, 0xE0B6, 0x84C6, 0xE0B7, 0x91CB, 0xE0B8, 0x932B, + 0xE0B9, 0x4ED9, 0xE0BA, 0x50CA, 0xE0BB, 0x5148, 0xE0BC, 0x5584, + 0xE0BD, 0x5B0B, 0xE0BE, 0x5BA3, 0xE0BF, 0x6247, 0xE0C0, 0x657E, + 0xE0C1, 0x65CB, 0xE0C2, 0x6E32, 0xE0C3, 0x717D, 0xE0C4, 0x7401, + 0xE0C5, 0x7444, 0xE0C6, 0x7487, 0xE0C7, 0x74BF, 0xE0C8, 0x766C, + 0xE0C9, 0x79AA, 0xE0CA, 0x7DDA, 0xE0CB, 0x7E55, 0xE0CC, 0x7FA8, + 0xE0CD, 0x817A, 0xE0CE, 0x81B3, 0xE0CF, 0x8239, 0xE0D0, 0x861A, + 0xE0D1, 0x87EC, 0xE0D2, 0x8A75, 0xE0D3, 0x8DE3, 0xE0D4, 0x9078, + 0xE0D5, 0x9291, 0xE0D6, 0x9425, 0xE0D7, 0x994D, 0xE0D8, 0x9BAE, + 0xE0D9, 0x5368, 0xE0DA, 0x5C51, 0xE0DB, 0x6954, 0xE0DC, 0x6CC4, + 0xE0DD, 0x6D29, 0xE0DE, 0x6E2B, 0xE0DF, 0x820C, 0xE0E0, 0x859B, + 0xE0E1, 0x893B, 0xE0E2, 0x8A2D, 0xE0E3, 0x8AAA, 0xE0E4, 0x96EA, + 0xE0E5, 0x9F67, 0xE0E6, 0x5261, 0xE0E7, 0x66B9, 0xE0E8, 0x6BB2, + 0xE0E9, 0x7E96, 0xE0EA, 0x87FE, 0xE0EB, 0x8D0D, 0xE0EC, 0x9583, + 0xE0ED, 0x965D, 0xE0EE, 0x651D, 0xE0EF, 0x6D89, 0xE0F0, 0x71EE, + 0xE0F1, 0xF96E, 0xE0F2, 0x57CE, 0xE0F3, 0x59D3, 0xE0F4, 0x5BAC, + 0xE0F5, 0x6027, 0xE0F6, 0x60FA, 0xE0F7, 0x6210, 0xE0F8, 0x661F, + 0xE0F9, 0x665F, 0xE0FA, 0x7329, 0xE0FB, 0x73F9, 0xE0FC, 0x76DB, + 0xE0FD, 0x7701, 0xE0FE, 0x7B6C, 0xE1A1, 0x8056, 0xE1A2, 0x8072, + 0xE1A3, 0x8165, 0xE1A4, 0x8AA0, 0xE1A5, 0x9192, 0xE1A6, 0x4E16, + 0xE1A7, 0x52E2, 0xE1A8, 0x6B72, 0xE1A9, 0x6D17, 0xE1AA, 0x7A05, + 0xE1AB, 0x7B39, 0xE1AC, 0x7D30, 0xE1AD, 0xF96F, 0xE1AE, 0x8CB0, + 0xE1AF, 0x53EC, 0xE1B0, 0x562F, 0xE1B1, 0x5851, 0xE1B2, 0x5BB5, + 0xE1B3, 0x5C0F, 0xE1B4, 0x5C11, 0xE1B5, 0x5DE2, 0xE1B6, 0x6240, + 0xE1B7, 0x6383, 0xE1B8, 0x6414, 0xE1B9, 0x662D, 0xE1BA, 0x68B3, + 0xE1BB, 0x6CBC, 0xE1BC, 0x6D88, 0xE1BD, 0x6EAF, 0xE1BE, 0x701F, + 0xE1BF, 0x70A4, 0xE1C0, 0x71D2, 0xE1C1, 0x7526, 0xE1C2, 0x758F, + 0xE1C3, 0x758E, 0xE1C4, 0x7619, 0xE1C5, 0x7B11, 0xE1C6, 0x7BE0, + 0xE1C7, 0x7C2B, 0xE1C8, 0x7D20, 0xE1C9, 0x7D39, 0xE1CA, 0x852C, + 0xE1CB, 0x856D, 0xE1CC, 0x8607, 0xE1CD, 0x8A34, 0xE1CE, 0x900D, + 0xE1CF, 0x9061, 0xE1D0, 0x90B5, 0xE1D1, 0x92B7, 0xE1D2, 0x97F6, + 0xE1D3, 0x9A37, 0xE1D4, 0x4FD7, 0xE1D5, 0x5C6C, 0xE1D6, 0x675F, + 0xE1D7, 0x6D91, 0xE1D8, 0x7C9F, 0xE1D9, 0x7E8C, 0xE1DA, 0x8B16, + 0xE1DB, 0x8D16, 0xE1DC, 0x901F, 0xE1DD, 0x5B6B, 0xE1DE, 0x5DFD, + 0xE1DF, 0x640D, 0xE1E0, 0x84C0, 0xE1E1, 0x905C, 0xE1E2, 0x98E1, + 0xE1E3, 0x7387, 0xE1E4, 0x5B8B, 0xE1E5, 0x609A, 0xE1E6, 0x677E, + 0xE1E7, 0x6DDE, 0xE1E8, 0x8A1F, 0xE1E9, 0x8AA6, 0xE1EA, 0x9001, + 0xE1EB, 0x980C, 0xE1EC, 0x5237, 0xE1ED, 0xF970, 0xE1EE, 0x7051, + 0xE1EF, 0x788E, 0xE1F0, 0x9396, 0xE1F1, 0x8870, 0xE1F2, 0x91D7, + 0xE1F3, 0x4FEE, 0xE1F4, 0x53D7, 0xE1F5, 0x55FD, 0xE1F6, 0x56DA, + 0xE1F7, 0x5782, 0xE1F8, 0x58FD, 0xE1F9, 0x5AC2, 0xE1FA, 0x5B88, + 0xE1FB, 0x5CAB, 0xE1FC, 0x5CC0, 0xE1FD, 0x5E25, 0xE1FE, 0x6101, + 0xE2A1, 0x620D, 0xE2A2, 0x624B, 0xE2A3, 0x6388, 0xE2A4, 0x641C, + 0xE2A5, 0x6536, 0xE2A6, 0x6578, 0xE2A7, 0x6A39, 0xE2A8, 0x6B8A, + 0xE2A9, 0x6C34, 0xE2AA, 0x6D19, 0xE2AB, 0x6F31, 0xE2AC, 0x71E7, + 0xE2AD, 0x72E9, 0xE2AE, 0x7378, 0xE2AF, 0x7407, 0xE2B0, 0x74B2, + 0xE2B1, 0x7626, 0xE2B2, 0x7761, 0xE2B3, 0x79C0, 0xE2B4, 0x7A57, + 0xE2B5, 0x7AEA, 0xE2B6, 0x7CB9, 0xE2B7, 0x7D8F, 0xE2B8, 0x7DAC, + 0xE2B9, 0x7E61, 0xE2BA, 0x7F9E, 0xE2BB, 0x8129, 0xE2BC, 0x8331, + 0xE2BD, 0x8490, 0xE2BE, 0x84DA, 0xE2BF, 0x85EA, 0xE2C0, 0x8896, + 0xE2C1, 0x8AB0, 0xE2C2, 0x8B90, 0xE2C3, 0x8F38, 0xE2C4, 0x9042, + 0xE2C5, 0x9083, 0xE2C6, 0x916C, 0xE2C7, 0x9296, 0xE2C8, 0x92B9, + 0xE2C9, 0x968B, 0xE2CA, 0x96A7, 0xE2CB, 0x96A8, 0xE2CC, 0x96D6, + 0xE2CD, 0x9700, 0xE2CE, 0x9808, 0xE2CF, 0x9996, 0xE2D0, 0x9AD3, + 0xE2D1, 0x9B1A, 0xE2D2, 0x53D4, 0xE2D3, 0x587E, 0xE2D4, 0x5919, + 0xE2D5, 0x5B70, 0xE2D6, 0x5BBF, 0xE2D7, 0x6DD1, 0xE2D8, 0x6F5A, + 0xE2D9, 0x719F, 0xE2DA, 0x7421, 0xE2DB, 0x74B9, 0xE2DC, 0x8085, + 0xE2DD, 0x83FD, 0xE2DE, 0x5DE1, 0xE2DF, 0x5F87, 0xE2E0, 0x5FAA, + 0xE2E1, 0x6042, 0xE2E2, 0x65EC, 0xE2E3, 0x6812, 0xE2E4, 0x696F, + 0xE2E5, 0x6A53, 0xE2E6, 0x6B89, 0xE2E7, 0x6D35, 0xE2E8, 0x6DF3, + 0xE2E9, 0x73E3, 0xE2EA, 0x76FE, 0xE2EB, 0x77AC, 0xE2EC, 0x7B4D, + 0xE2ED, 0x7D14, 0xE2EE, 0x8123, 0xE2EF, 0x821C, 0xE2F0, 0x8340, + 0xE2F1, 0x84F4, 0xE2F2, 0x8563, 0xE2F3, 0x8A62, 0xE2F4, 0x8AC4, + 0xE2F5, 0x9187, 0xE2F6, 0x931E, 0xE2F7, 0x9806, 0xE2F8, 0x99B4, + 0xE2F9, 0x620C, 0xE2FA, 0x8853, 0xE2FB, 0x8FF0, 0xE2FC, 0x9265, + 0xE2FD, 0x5D07, 0xE2FE, 0x5D27, 0xE3A1, 0x5D69, 0xE3A2, 0x745F, + 0xE3A3, 0x819D, 0xE3A4, 0x8768, 0xE3A5, 0x6FD5, 0xE3A6, 0x62FE, + 0xE3A7, 0x7FD2, 0xE3A8, 0x8936, 0xE3A9, 0x8972, 0xE3AA, 0x4E1E, + 0xE3AB, 0x4E58, 0xE3AC, 0x50E7, 0xE3AD, 0x52DD, 0xE3AE, 0x5347, + 0xE3AF, 0x627F, 0xE3B0, 0x6607, 0xE3B1, 0x7E69, 0xE3B2, 0x8805, + 0xE3B3, 0x965E, 0xE3B4, 0x4F8D, 0xE3B5, 0x5319, 0xE3B6, 0x5636, + 0xE3B7, 0x59CB, 0xE3B8, 0x5AA4, 0xE3B9, 0x5C38, 0xE3BA, 0x5C4E, + 0xE3BB, 0x5C4D, 0xE3BC, 0x5E02, 0xE3BD, 0x5F11, 0xE3BE, 0x6043, + 0xE3BF, 0x65BD, 0xE3C0, 0x662F, 0xE3C1, 0x6642, 0xE3C2, 0x67BE, + 0xE3C3, 0x67F4, 0xE3C4, 0x731C, 0xE3C5, 0x77E2, 0xE3C6, 0x793A, + 0xE3C7, 0x7FC5, 0xE3C8, 0x8494, 0xE3C9, 0x84CD, 0xE3CA, 0x8996, + 0xE3CB, 0x8A66, 0xE3CC, 0x8A69, 0xE3CD, 0x8AE1, 0xE3CE, 0x8C55, + 0xE3CF, 0x8C7A, 0xE3D0, 0x57F4, 0xE3D1, 0x5BD4, 0xE3D2, 0x5F0F, + 0xE3D3, 0x606F, 0xE3D4, 0x62ED, 0xE3D5, 0x690D, 0xE3D6, 0x6B96, + 0xE3D7, 0x6E5C, 0xE3D8, 0x7184, 0xE3D9, 0x7BD2, 0xE3DA, 0x8755, + 0xE3DB, 0x8B58, 0xE3DC, 0x8EFE, 0xE3DD, 0x98DF, 0xE3DE, 0x98FE, + 0xE3DF, 0x4F38, 0xE3E0, 0x4F81, 0xE3E1, 0x4FE1, 0xE3E2, 0x547B, + 0xE3E3, 0x5A20, 0xE3E4, 0x5BB8, 0xE3E5, 0x613C, 0xE3E6, 0x65B0, + 0xE3E7, 0x6668, 0xE3E8, 0x71FC, 0xE3E9, 0x7533, 0xE3EA, 0x795E, + 0xE3EB, 0x7D33, 0xE3EC, 0x814E, 0xE3ED, 0x81E3, 0xE3EE, 0x8398, + 0xE3EF, 0x85AA, 0xE3F0, 0x85CE, 0xE3F1, 0x8703, 0xE3F2, 0x8A0A, + 0xE3F3, 0x8EAB, 0xE3F4, 0x8F9B, 0xE3F5, 0xF971, 0xE3F6, 0x8FC5, + 0xE3F7, 0x5931, 0xE3F8, 0x5BA4, 0xE3F9, 0x5BE6, 0xE3FA, 0x6089, + 0xE3FB, 0x5BE9, 0xE3FC, 0x5C0B, 0xE3FD, 0x5FC3, 0xE3FE, 0x6C81, + 0xE4A1, 0xF972, 0xE4A2, 0x6DF1, 0xE4A3, 0x700B, 0xE4A4, 0x751A, + 0xE4A5, 0x82AF, 0xE4A6, 0x8AF6, 0xE4A7, 0x4EC0, 0xE4A8, 0x5341, + 0xE4A9, 0xF973, 0xE4AA, 0x96D9, 0xE4AB, 0x6C0F, 0xE4AC, 0x4E9E, + 0xE4AD, 0x4FC4, 0xE4AE, 0x5152, 0xE4AF, 0x555E, 0xE4B0, 0x5A25, + 0xE4B1, 0x5CE8, 0xE4B2, 0x6211, 0xE4B3, 0x7259, 0xE4B4, 0x82BD, + 0xE4B5, 0x83AA, 0xE4B6, 0x86FE, 0xE4B7, 0x8859, 0xE4B8, 0x8A1D, + 0xE4B9, 0x963F, 0xE4BA, 0x96C5, 0xE4BB, 0x9913, 0xE4BC, 0x9D09, + 0xE4BD, 0x9D5D, 0xE4BE, 0x580A, 0xE4BF, 0x5CB3, 0xE4C0, 0x5DBD, + 0xE4C1, 0x5E44, 0xE4C2, 0x60E1, 0xE4C3, 0x6115, 0xE4C4, 0x63E1, + 0xE4C5, 0x6A02, 0xE4C6, 0x6E25, 0xE4C7, 0x9102, 0xE4C8, 0x9354, + 0xE4C9, 0x984E, 0xE4CA, 0x9C10, 0xE4CB, 0x9F77, 0xE4CC, 0x5B89, + 0xE4CD, 0x5CB8, 0xE4CE, 0x6309, 0xE4CF, 0x664F, 0xE4D0, 0x6848, + 0xE4D1, 0x773C, 0xE4D2, 0x96C1, 0xE4D3, 0x978D, 0xE4D4, 0x9854, + 0xE4D5, 0x9B9F, 0xE4D6, 0x65A1, 0xE4D7, 0x8B01, 0xE4D8, 0x8ECB, + 0xE4D9, 0x95BC, 0xE4DA, 0x5535, 0xE4DB, 0x5CA9, 0xE4DC, 0x5DD6, + 0xE4DD, 0x5EB5, 0xE4DE, 0x6697, 0xE4DF, 0x764C, 0xE4E0, 0x83F4, + 0xE4E1, 0x95C7, 0xE4E2, 0x58D3, 0xE4E3, 0x62BC, 0xE4E4, 0x72CE, + 0xE4E5, 0x9D28, 0xE4E6, 0x4EF0, 0xE4E7, 0x592E, 0xE4E8, 0x600F, + 0xE4E9, 0x663B, 0xE4EA, 0x6B83, 0xE4EB, 0x79E7, 0xE4EC, 0x9D26, + 0xE4ED, 0x5393, 0xE4EE, 0x54C0, 0xE4EF, 0x57C3, 0xE4F0, 0x5D16, + 0xE4F1, 0x611B, 0xE4F2, 0x66D6, 0xE4F3, 0x6DAF, 0xE4F4, 0x788D, + 0xE4F5, 0x827E, 0xE4F6, 0x9698, 0xE4F7, 0x9744, 0xE4F8, 0x5384, + 0xE4F9, 0x627C, 0xE4FA, 0x6396, 0xE4FB, 0x6DB2, 0xE4FC, 0x7E0A, + 0xE4FD, 0x814B, 0xE4FE, 0x984D, 0xE5A1, 0x6AFB, 0xE5A2, 0x7F4C, + 0xE5A3, 0x9DAF, 0xE5A4, 0x9E1A, 0xE5A5, 0x4E5F, 0xE5A6, 0x503B, + 0xE5A7, 0x51B6, 0xE5A8, 0x591C, 0xE5A9, 0x60F9, 0xE5AA, 0x63F6, + 0xE5AB, 0x6930, 0xE5AC, 0x723A, 0xE5AD, 0x8036, 0xE5AE, 0xF974, + 0xE5AF, 0x91CE, 0xE5B0, 0x5F31, 0xE5B1, 0xF975, 0xE5B2, 0xF976, + 0xE5B3, 0x7D04, 0xE5B4, 0x82E5, 0xE5B5, 0x846F, 0xE5B6, 0x84BB, + 0xE5B7, 0x85E5, 0xE5B8, 0x8E8D, 0xE5B9, 0xF977, 0xE5BA, 0x4F6F, + 0xE5BB, 0xF978, 0xE5BC, 0xF979, 0xE5BD, 0x58E4, 0xE5BE, 0x5B43, + 0xE5BF, 0x6059, 0xE5C0, 0x63DA, 0xE5C1, 0x6518, 0xE5C2, 0x656D, + 0xE5C3, 0x6698, 0xE5C4, 0xF97A, 0xE5C5, 0x694A, 0xE5C6, 0x6A23, + 0xE5C7, 0x6D0B, 0xE5C8, 0x7001, 0xE5C9, 0x716C, 0xE5CA, 0x75D2, + 0xE5CB, 0x760D, 0xE5CC, 0x79B3, 0xE5CD, 0x7A70, 0xE5CE, 0xF97B, + 0xE5CF, 0x7F8A, 0xE5D0, 0xF97C, 0xE5D1, 0x8944, 0xE5D2, 0xF97D, + 0xE5D3, 0x8B93, 0xE5D4, 0x91C0, 0xE5D5, 0x967D, 0xE5D6, 0xF97E, + 0xE5D7, 0x990A, 0xE5D8, 0x5704, 0xE5D9, 0x5FA1, 0xE5DA, 0x65BC, + 0xE5DB, 0x6F01, 0xE5DC, 0x7600, 0xE5DD, 0x79A6, 0xE5DE, 0x8A9E, + 0xE5DF, 0x99AD, 0xE5E0, 0x9B5A, 0xE5E1, 0x9F6C, 0xE5E2, 0x5104, + 0xE5E3, 0x61B6, 0xE5E4, 0x6291, 0xE5E5, 0x6A8D, 0xE5E6, 0x81C6, + 0xE5E7, 0x5043, 0xE5E8, 0x5830, 0xE5E9, 0x5F66, 0xE5EA, 0x7109, + 0xE5EB, 0x8A00, 0xE5EC, 0x8AFA, 0xE5ED, 0x5B7C, 0xE5EE, 0x8616, + 0xE5EF, 0x4FFA, 0xE5F0, 0x513C, 0xE5F1, 0x56B4, 0xE5F2, 0x5944, + 0xE5F3, 0x63A9, 0xE5F4, 0x6DF9, 0xE5F5, 0x5DAA, 0xE5F6, 0x696D, + 0xE5F7, 0x5186, 0xE5F8, 0x4E88, 0xE5F9, 0x4F59, 0xE5FA, 0xF97F, + 0xE5FB, 0xF980, 0xE5FC, 0xF981, 0xE5FD, 0x5982, 0xE5FE, 0xF982, + 0xE6A1, 0xF983, 0xE6A2, 0x6B5F, 0xE6A3, 0x6C5D, 0xE6A4, 0xF984, + 0xE6A5, 0x74B5, 0xE6A6, 0x7916, 0xE6A7, 0xF985, 0xE6A8, 0x8207, + 0xE6A9, 0x8245, 0xE6AA, 0x8339, 0xE6AB, 0x8F3F, 0xE6AC, 0x8F5D, + 0xE6AD, 0xF986, 0xE6AE, 0x9918, 0xE6AF, 0xF987, 0xE6B0, 0xF988, + 0xE6B1, 0xF989, 0xE6B2, 0x4EA6, 0xE6B3, 0xF98A, 0xE6B4, 0x57DF, + 0xE6B5, 0x5F79, 0xE6B6, 0x6613, 0xE6B7, 0xF98B, 0xE6B8, 0xF98C, + 0xE6B9, 0x75AB, 0xE6BA, 0x7E79, 0xE6BB, 0x8B6F, 0xE6BC, 0xF98D, + 0xE6BD, 0x9006, 0xE6BE, 0x9A5B, 0xE6BF, 0x56A5, 0xE6C0, 0x5827, + 0xE6C1, 0x59F8, 0xE6C2, 0x5A1F, 0xE6C3, 0x5BB4, 0xE6C4, 0xF98E, + 0xE6C5, 0x5EF6, 0xE6C6, 0xF98F, 0xE6C7, 0xF990, 0xE6C8, 0x6350, + 0xE6C9, 0x633B, 0xE6CA, 0xF991, 0xE6CB, 0x693D, 0xE6CC, 0x6C87, + 0xE6CD, 0x6CBF, 0xE6CE, 0x6D8E, 0xE6CF, 0x6D93, 0xE6D0, 0x6DF5, + 0xE6D1, 0x6F14, 0xE6D2, 0xF992, 0xE6D3, 0x70DF, 0xE6D4, 0x7136, + 0xE6D5, 0x7159, 0xE6D6, 0xF993, 0xE6D7, 0x71C3, 0xE6D8, 0x71D5, + 0xE6D9, 0xF994, 0xE6DA, 0x784F, 0xE6DB, 0x786F, 0xE6DC, 0xF995, + 0xE6DD, 0x7B75, 0xE6DE, 0x7DE3, 0xE6DF, 0xF996, 0xE6E0, 0x7E2F, + 0xE6E1, 0xF997, 0xE6E2, 0x884D, 0xE6E3, 0x8EDF, 0xE6E4, 0xF998, + 0xE6E5, 0xF999, 0xE6E6, 0xF99A, 0xE6E7, 0x925B, 0xE6E8, 0xF99B, + 0xE6E9, 0x9CF6, 0xE6EA, 0xF99C, 0xE6EB, 0xF99D, 0xE6EC, 0xF99E, + 0xE6ED, 0x6085, 0xE6EE, 0x6D85, 0xE6EF, 0xF99F, 0xE6F0, 0x71B1, + 0xE6F1, 0xF9A0, 0xE6F2, 0xF9A1, 0xE6F3, 0x95B1, 0xE6F4, 0x53AD, + 0xE6F5, 0xF9A2, 0xE6F6, 0xF9A3, 0xE6F7, 0xF9A4, 0xE6F8, 0x67D3, + 0xE6F9, 0xF9A5, 0xE6FA, 0x708E, 0xE6FB, 0x7130, 0xE6FC, 0x7430, + 0xE6FD, 0x8276, 0xE6FE, 0x82D2, 0xE7A1, 0xF9A6, 0xE7A2, 0x95BB, + 0xE7A3, 0x9AE5, 0xE7A4, 0x9E7D, 0xE7A5, 0x66C4, 0xE7A6, 0xF9A7, + 0xE7A7, 0x71C1, 0xE7A8, 0x8449, 0xE7A9, 0xF9A8, 0xE7AA, 0xF9A9, + 0xE7AB, 0x584B, 0xE7AC, 0xF9AA, 0xE7AD, 0xF9AB, 0xE7AE, 0x5DB8, + 0xE7AF, 0x5F71, 0xE7B0, 0xF9AC, 0xE7B1, 0x6620, 0xE7B2, 0x668E, + 0xE7B3, 0x6979, 0xE7B4, 0x69AE, 0xE7B5, 0x6C38, 0xE7B6, 0x6CF3, + 0xE7B7, 0x6E36, 0xE7B8, 0x6F41, 0xE7B9, 0x6FDA, 0xE7BA, 0x701B, + 0xE7BB, 0x702F, 0xE7BC, 0x7150, 0xE7BD, 0x71DF, 0xE7BE, 0x7370, + 0xE7BF, 0xF9AD, 0xE7C0, 0x745B, 0xE7C1, 0xF9AE, 0xE7C2, 0x74D4, + 0xE7C3, 0x76C8, 0xE7C4, 0x7A4E, 0xE7C5, 0x7E93, 0xE7C6, 0xF9AF, + 0xE7C7, 0xF9B0, 0xE7C8, 0x82F1, 0xE7C9, 0x8A60, 0xE7CA, 0x8FCE, + 0xE7CB, 0xF9B1, 0xE7CC, 0x9348, 0xE7CD, 0xF9B2, 0xE7CE, 0x9719, + 0xE7CF, 0xF9B3, 0xE7D0, 0xF9B4, 0xE7D1, 0x4E42, 0xE7D2, 0x502A, + 0xE7D3, 0xF9B5, 0xE7D4, 0x5208, 0xE7D5, 0x53E1, 0xE7D6, 0x66F3, + 0xE7D7, 0x6C6D, 0xE7D8, 0x6FCA, 0xE7D9, 0x730A, 0xE7DA, 0x777F, + 0xE7DB, 0x7A62, 0xE7DC, 0x82AE, 0xE7DD, 0x85DD, 0xE7DE, 0x8602, + 0xE7DF, 0xF9B6, 0xE7E0, 0x88D4, 0xE7E1, 0x8A63, 0xE7E2, 0x8B7D, + 0xE7E3, 0x8C6B, 0xE7E4, 0xF9B7, 0xE7E5, 0x92B3, 0xE7E6, 0xF9B8, + 0xE7E7, 0x9713, 0xE7E8, 0x9810, 0xE7E9, 0x4E94, 0xE7EA, 0x4F0D, + 0xE7EB, 0x4FC9, 0xE7EC, 0x50B2, 0xE7ED, 0x5348, 0xE7EE, 0x543E, + 0xE7EF, 0x5433, 0xE7F0, 0x55DA, 0xE7F1, 0x5862, 0xE7F2, 0x58BA, + 0xE7F3, 0x5967, 0xE7F4, 0x5A1B, 0xE7F5, 0x5BE4, 0xE7F6, 0x609F, + 0xE7F7, 0xF9B9, 0xE7F8, 0x61CA, 0xE7F9, 0x6556, 0xE7FA, 0x65FF, + 0xE7FB, 0x6664, 0xE7FC, 0x68A7, 0xE7FD, 0x6C5A, 0xE7FE, 0x6FB3, + 0xE8A1, 0x70CF, 0xE8A2, 0x71AC, 0xE8A3, 0x7352, 0xE8A4, 0x7B7D, + 0xE8A5, 0x8708, 0xE8A6, 0x8AA4, 0xE8A7, 0x9C32, 0xE8A8, 0x9F07, + 0xE8A9, 0x5C4B, 0xE8AA, 0x6C83, 0xE8AB, 0x7344, 0xE8AC, 0x7389, + 0xE8AD, 0x923A, 0xE8AE, 0x6EAB, 0xE8AF, 0x7465, 0xE8B0, 0x761F, + 0xE8B1, 0x7A69, 0xE8B2, 0x7E15, 0xE8B3, 0x860A, 0xE8B4, 0x5140, + 0xE8B5, 0x58C5, 0xE8B6, 0x64C1, 0xE8B7, 0x74EE, 0xE8B8, 0x7515, + 0xE8B9, 0x7670, 0xE8BA, 0x7FC1, 0xE8BB, 0x9095, 0xE8BC, 0x96CD, + 0xE8BD, 0x9954, 0xE8BE, 0x6E26, 0xE8BF, 0x74E6, 0xE8C0, 0x7AA9, + 0xE8C1, 0x7AAA, 0xE8C2, 0x81E5, 0xE8C3, 0x86D9, 0xE8C4, 0x8778, + 0xE8C5, 0x8A1B, 0xE8C6, 0x5A49, 0xE8C7, 0x5B8C, 0xE8C8, 0x5B9B, + 0xE8C9, 0x68A1, 0xE8CA, 0x6900, 0xE8CB, 0x6D63, 0xE8CC, 0x73A9, + 0xE8CD, 0x7413, 0xE8CE, 0x742C, 0xE8CF, 0x7897, 0xE8D0, 0x7DE9, + 0xE8D1, 0x7FEB, 0xE8D2, 0x8118, 0xE8D3, 0x8155, 0xE8D4, 0x839E, + 0xE8D5, 0x8C4C, 0xE8D6, 0x962E, 0xE8D7, 0x9811, 0xE8D8, 0x66F0, + 0xE8D9, 0x5F80, 0xE8DA, 0x65FA, 0xE8DB, 0x6789, 0xE8DC, 0x6C6A, + 0xE8DD, 0x738B, 0xE8DE, 0x502D, 0xE8DF, 0x5A03, 0xE8E0, 0x6B6A, + 0xE8E1, 0x77EE, 0xE8E2, 0x5916, 0xE8E3, 0x5D6C, 0xE8E4, 0x5DCD, + 0xE8E5, 0x7325, 0xE8E6, 0x754F, 0xE8E7, 0xF9BA, 0xE8E8, 0xF9BB, + 0xE8E9, 0x50E5, 0xE8EA, 0x51F9, 0xE8EB, 0x582F, 0xE8EC, 0x592D, + 0xE8ED, 0x5996, 0xE8EE, 0x59DA, 0xE8EF, 0x5BE5, 0xE8F0, 0xF9BC, + 0xE8F1, 0xF9BD, 0xE8F2, 0x5DA2, 0xE8F3, 0x62D7, 0xE8F4, 0x6416, + 0xE8F5, 0x6493, 0xE8F6, 0x64FE, 0xE8F7, 0xF9BE, 0xE8F8, 0x66DC, + 0xE8F9, 0xF9BF, 0xE8FA, 0x6A48, 0xE8FB, 0xF9C0, 0xE8FC, 0x71FF, + 0xE8FD, 0x7464, 0xE8FE, 0xF9C1, 0xE9A1, 0x7A88, 0xE9A2, 0x7AAF, + 0xE9A3, 0x7E47, 0xE9A4, 0x7E5E, 0xE9A5, 0x8000, 0xE9A6, 0x8170, + 0xE9A7, 0xF9C2, 0xE9A8, 0x87EF, 0xE9A9, 0x8981, 0xE9AA, 0x8B20, + 0xE9AB, 0x9059, 0xE9AC, 0xF9C3, 0xE9AD, 0x9080, 0xE9AE, 0x9952, + 0xE9AF, 0x617E, 0xE9B0, 0x6B32, 0xE9B1, 0x6D74, 0xE9B2, 0x7E1F, + 0xE9B3, 0x8925, 0xE9B4, 0x8FB1, 0xE9B5, 0x4FD1, 0xE9B6, 0x50AD, + 0xE9B7, 0x5197, 0xE9B8, 0x52C7, 0xE9B9, 0x57C7, 0xE9BA, 0x5889, + 0xE9BB, 0x5BB9, 0xE9BC, 0x5EB8, 0xE9BD, 0x6142, 0xE9BE, 0x6995, + 0xE9BF, 0x6D8C, 0xE9C0, 0x6E67, 0xE9C1, 0x6EB6, 0xE9C2, 0x7194, + 0xE9C3, 0x7462, 0xE9C4, 0x7528, 0xE9C5, 0x752C, 0xE9C6, 0x8073, + 0xE9C7, 0x8338, 0xE9C8, 0x84C9, 0xE9C9, 0x8E0A, 0xE9CA, 0x9394, + 0xE9CB, 0x93DE, 0xE9CC, 0xF9C4, 0xE9CD, 0x4E8E, 0xE9CE, 0x4F51, + 0xE9CF, 0x5076, 0xE9D0, 0x512A, 0xE9D1, 0x53C8, 0xE9D2, 0x53CB, + 0xE9D3, 0x53F3, 0xE9D4, 0x5B87, 0xE9D5, 0x5BD3, 0xE9D6, 0x5C24, + 0xE9D7, 0x611A, 0xE9D8, 0x6182, 0xE9D9, 0x65F4, 0xE9DA, 0x725B, + 0xE9DB, 0x7397, 0xE9DC, 0x7440, 0xE9DD, 0x76C2, 0xE9DE, 0x7950, + 0xE9DF, 0x7991, 0xE9E0, 0x79B9, 0xE9E1, 0x7D06, 0xE9E2, 0x7FBD, + 0xE9E3, 0x828B, 0xE9E4, 0x85D5, 0xE9E5, 0x865E, 0xE9E6, 0x8FC2, + 0xE9E7, 0x9047, 0xE9E8, 0x90F5, 0xE9E9, 0x91EA, 0xE9EA, 0x9685, + 0xE9EB, 0x96E8, 0xE9EC, 0x96E9, 0xE9ED, 0x52D6, 0xE9EE, 0x5F67, + 0xE9EF, 0x65ED, 0xE9F0, 0x6631, 0xE9F1, 0x682F, 0xE9F2, 0x715C, + 0xE9F3, 0x7A36, 0xE9F4, 0x90C1, 0xE9F5, 0x980A, 0xE9F6, 0x4E91, + 0xE9F7, 0xF9C5, 0xE9F8, 0x6A52, 0xE9F9, 0x6B9E, 0xE9FA, 0x6F90, + 0xE9FB, 0x7189, 0xE9FC, 0x8018, 0xE9FD, 0x82B8, 0xE9FE, 0x8553, + 0xEAA1, 0x904B, 0xEAA2, 0x9695, 0xEAA3, 0x96F2, 0xEAA4, 0x97FB, + 0xEAA5, 0x851A, 0xEAA6, 0x9B31, 0xEAA7, 0x4E90, 0xEAA8, 0x718A, + 0xEAA9, 0x96C4, 0xEAAA, 0x5143, 0xEAAB, 0x539F, 0xEAAC, 0x54E1, + 0xEAAD, 0x5713, 0xEAAE, 0x5712, 0xEAAF, 0x57A3, 0xEAB0, 0x5A9B, + 0xEAB1, 0x5AC4, 0xEAB2, 0x5BC3, 0xEAB3, 0x6028, 0xEAB4, 0x613F, + 0xEAB5, 0x63F4, 0xEAB6, 0x6C85, 0xEAB7, 0x6D39, 0xEAB8, 0x6E72, + 0xEAB9, 0x6E90, 0xEABA, 0x7230, 0xEABB, 0x733F, 0xEABC, 0x7457, + 0xEABD, 0x82D1, 0xEABE, 0x8881, 0xEABF, 0x8F45, 0xEAC0, 0x9060, + 0xEAC1, 0xF9C6, 0xEAC2, 0x9662, 0xEAC3, 0x9858, 0xEAC4, 0x9D1B, + 0xEAC5, 0x6708, 0xEAC6, 0x8D8A, 0xEAC7, 0x925E, 0xEAC8, 0x4F4D, + 0xEAC9, 0x5049, 0xEACA, 0x50DE, 0xEACB, 0x5371, 0xEACC, 0x570D, + 0xEACD, 0x59D4, 0xEACE, 0x5A01, 0xEACF, 0x5C09, 0xEAD0, 0x6170, + 0xEAD1, 0x6690, 0xEAD2, 0x6E2D, 0xEAD3, 0x7232, 0xEAD4, 0x744B, + 0xEAD5, 0x7DEF, 0xEAD6, 0x80C3, 0xEAD7, 0x840E, 0xEAD8, 0x8466, + 0xEAD9, 0x853F, 0xEADA, 0x875F, 0xEADB, 0x885B, 0xEADC, 0x8918, + 0xEADD, 0x8B02, 0xEADE, 0x9055, 0xEADF, 0x97CB, 0xEAE0, 0x9B4F, + 0xEAE1, 0x4E73, 0xEAE2, 0x4F91, 0xEAE3, 0x5112, 0xEAE4, 0x516A, + 0xEAE5, 0xF9C7, 0xEAE6, 0x552F, 0xEAE7, 0x55A9, 0xEAE8, 0x5B7A, + 0xEAE9, 0x5BA5, 0xEAEA, 0x5E7C, 0xEAEB, 0x5E7D, 0xEAEC, 0x5EBE, + 0xEAED, 0x60A0, 0xEAEE, 0x60DF, 0xEAEF, 0x6108, 0xEAF0, 0x6109, + 0xEAF1, 0x63C4, 0xEAF2, 0x6538, 0xEAF3, 0x6709, 0xEAF4, 0xF9C8, + 0xEAF5, 0x67D4, 0xEAF6, 0x67DA, 0xEAF7, 0xF9C9, 0xEAF8, 0x6961, + 0xEAF9, 0x6962, 0xEAFA, 0x6CB9, 0xEAFB, 0x6D27, 0xEAFC, 0xF9CA, + 0xEAFD, 0x6E38, 0xEAFE, 0xF9CB, 0xEBA1, 0x6FE1, 0xEBA2, 0x7336, + 0xEBA3, 0x7337, 0xEBA4, 0xF9CC, 0xEBA5, 0x745C, 0xEBA6, 0x7531, + 0xEBA7, 0xF9CD, 0xEBA8, 0x7652, 0xEBA9, 0xF9CE, 0xEBAA, 0xF9CF, + 0xEBAB, 0x7DAD, 0xEBAC, 0x81FE, 0xEBAD, 0x8438, 0xEBAE, 0x88D5, + 0xEBAF, 0x8A98, 0xEBB0, 0x8ADB, 0xEBB1, 0x8AED, 0xEBB2, 0x8E30, + 0xEBB3, 0x8E42, 0xEBB4, 0x904A, 0xEBB5, 0x903E, 0xEBB6, 0x907A, + 0xEBB7, 0x9149, 0xEBB8, 0x91C9, 0xEBB9, 0x936E, 0xEBBA, 0xF9D0, + 0xEBBB, 0xF9D1, 0xEBBC, 0x5809, 0xEBBD, 0xF9D2, 0xEBBE, 0x6BD3, + 0xEBBF, 0x8089, 0xEBC0, 0x80B2, 0xEBC1, 0xF9D3, 0xEBC2, 0xF9D4, + 0xEBC3, 0x5141, 0xEBC4, 0x596B, 0xEBC5, 0x5C39, 0xEBC6, 0xF9D5, + 0xEBC7, 0xF9D6, 0xEBC8, 0x6F64, 0xEBC9, 0x73A7, 0xEBCA, 0x80E4, + 0xEBCB, 0x8D07, 0xEBCC, 0xF9D7, 0xEBCD, 0x9217, 0xEBCE, 0x958F, + 0xEBCF, 0xF9D8, 0xEBD0, 0xF9D9, 0xEBD1, 0xF9DA, 0xEBD2, 0xF9DB, + 0xEBD3, 0x807F, 0xEBD4, 0x620E, 0xEBD5, 0x701C, 0xEBD6, 0x7D68, + 0xEBD7, 0x878D, 0xEBD8, 0xF9DC, 0xEBD9, 0x57A0, 0xEBDA, 0x6069, + 0xEBDB, 0x6147, 0xEBDC, 0x6BB7, 0xEBDD, 0x8ABE, 0xEBDE, 0x9280, + 0xEBDF, 0x96B1, 0xEBE0, 0x4E59, 0xEBE1, 0x541F, 0xEBE2, 0x6DEB, + 0xEBE3, 0x852D, 0xEBE4, 0x9670, 0xEBE5, 0x97F3, 0xEBE6, 0x98EE, + 0xEBE7, 0x63D6, 0xEBE8, 0x6CE3, 0xEBE9, 0x9091, 0xEBEA, 0x51DD, + 0xEBEB, 0x61C9, 0xEBEC, 0x81BA, 0xEBED, 0x9DF9, 0xEBEE, 0x4F9D, + 0xEBEF, 0x501A, 0xEBF0, 0x5100, 0xEBF1, 0x5B9C, 0xEBF2, 0x610F, + 0xEBF3, 0x61FF, 0xEBF4, 0x64EC, 0xEBF5, 0x6905, 0xEBF6, 0x6BC5, + 0xEBF7, 0x7591, 0xEBF8, 0x77E3, 0xEBF9, 0x7FA9, 0xEBFA, 0x8264, + 0xEBFB, 0x858F, 0xEBFC, 0x87FB, 0xEBFD, 0x8863, 0xEBFE, 0x8ABC, + 0xECA1, 0x8B70, 0xECA2, 0x91AB, 0xECA3, 0x4E8C, 0xECA4, 0x4EE5, + 0xECA5, 0x4F0A, 0xECA6, 0xF9DD, 0xECA7, 0xF9DE, 0xECA8, 0x5937, + 0xECA9, 0x59E8, 0xECAA, 0xF9DF, 0xECAB, 0x5DF2, 0xECAC, 0x5F1B, + 0xECAD, 0x5F5B, 0xECAE, 0x6021, 0xECAF, 0xF9E0, 0xECB0, 0xF9E1, + 0xECB1, 0xF9E2, 0xECB2, 0xF9E3, 0xECB3, 0x723E, 0xECB4, 0x73E5, + 0xECB5, 0xF9E4, 0xECB6, 0x7570, 0xECB7, 0x75CD, 0xECB8, 0xF9E5, + 0xECB9, 0x79FB, 0xECBA, 0xF9E6, 0xECBB, 0x800C, 0xECBC, 0x8033, + 0xECBD, 0x8084, 0xECBE, 0x82E1, 0xECBF, 0x8351, 0xECC0, 0xF9E7, + 0xECC1, 0xF9E8, 0xECC2, 0x8CBD, 0xECC3, 0x8CB3, 0xECC4, 0x9087, + 0xECC5, 0xF9E9, 0xECC6, 0xF9EA, 0xECC7, 0x98F4, 0xECC8, 0x990C, + 0xECC9, 0xF9EB, 0xECCA, 0xF9EC, 0xECCB, 0x7037, 0xECCC, 0x76CA, + 0xECCD, 0x7FCA, 0xECCE, 0x7FCC, 0xECCF, 0x7FFC, 0xECD0, 0x8B1A, + 0xECD1, 0x4EBA, 0xECD2, 0x4EC1, 0xECD3, 0x5203, 0xECD4, 0x5370, + 0xECD5, 0xF9ED, 0xECD6, 0x54BD, 0xECD7, 0x56E0, 0xECD8, 0x59FB, + 0xECD9, 0x5BC5, 0xECDA, 0x5F15, 0xECDB, 0x5FCD, 0xECDC, 0x6E6E, + 0xECDD, 0xF9EE, 0xECDE, 0xF9EF, 0xECDF, 0x7D6A, 0xECE0, 0x8335, + 0xECE1, 0xF9F0, 0xECE2, 0x8693, 0xECE3, 0x8A8D, 0xECE4, 0xF9F1, + 0xECE5, 0x976D, 0xECE6, 0x9777, 0xECE7, 0xF9F2, 0xECE8, 0xF9F3, + 0xECE9, 0x4E00, 0xECEA, 0x4F5A, 0xECEB, 0x4F7E, 0xECEC, 0x58F9, + 0xECED, 0x65E5, 0xECEE, 0x6EA2, 0xECEF, 0x9038, 0xECF0, 0x93B0, + 0xECF1, 0x99B9, 0xECF2, 0x4EFB, 0xECF3, 0x58EC, 0xECF4, 0x598A, + 0xECF5, 0x59D9, 0xECF6, 0x6041, 0xECF7, 0xF9F4, 0xECF8, 0xF9F5, + 0xECF9, 0x7A14, 0xECFA, 0xF9F6, 0xECFB, 0x834F, 0xECFC, 0x8CC3, + 0xECFD, 0x5165, 0xECFE, 0x5344, 0xEDA1, 0xF9F7, 0xEDA2, 0xF9F8, + 0xEDA3, 0xF9F9, 0xEDA4, 0x4ECD, 0xEDA5, 0x5269, 0xEDA6, 0x5B55, + 0xEDA7, 0x82BF, 0xEDA8, 0x4ED4, 0xEDA9, 0x523A, 0xEDAA, 0x54A8, + 0xEDAB, 0x59C9, 0xEDAC, 0x59FF, 0xEDAD, 0x5B50, 0xEDAE, 0x5B57, + 0xEDAF, 0x5B5C, 0xEDB0, 0x6063, 0xEDB1, 0x6148, 0xEDB2, 0x6ECB, + 0xEDB3, 0x7099, 0xEDB4, 0x716E, 0xEDB5, 0x7386, 0xEDB6, 0x74F7, + 0xEDB7, 0x75B5, 0xEDB8, 0x78C1, 0xEDB9, 0x7D2B, 0xEDBA, 0x8005, + 0xEDBB, 0x81EA, 0xEDBC, 0x8328, 0xEDBD, 0x8517, 0xEDBE, 0x85C9, + 0xEDBF, 0x8AEE, 0xEDC0, 0x8CC7, 0xEDC1, 0x96CC, 0xEDC2, 0x4F5C, + 0xEDC3, 0x52FA, 0xEDC4, 0x56BC, 0xEDC5, 0x65AB, 0xEDC6, 0x6628, + 0xEDC7, 0x707C, 0xEDC8, 0x70B8, 0xEDC9, 0x7235, 0xEDCA, 0x7DBD, + 0xEDCB, 0x828D, 0xEDCC, 0x914C, 0xEDCD, 0x96C0, 0xEDCE, 0x9D72, + 0xEDCF, 0x5B71, 0xEDD0, 0x68E7, 0xEDD1, 0x6B98, 0xEDD2, 0x6F7A, + 0xEDD3, 0x76DE, 0xEDD4, 0x5C91, 0xEDD5, 0x66AB, 0xEDD6, 0x6F5B, + 0xEDD7, 0x7BB4, 0xEDD8, 0x7C2A, 0xEDD9, 0x8836, 0xEDDA, 0x96DC, + 0xEDDB, 0x4E08, 0xEDDC, 0x4ED7, 0xEDDD, 0x5320, 0xEDDE, 0x5834, + 0xEDDF, 0x58BB, 0xEDE0, 0x58EF, 0xEDE1, 0x596C, 0xEDE2, 0x5C07, + 0xEDE3, 0x5E33, 0xEDE4, 0x5E84, 0xEDE5, 0x5F35, 0xEDE6, 0x638C, + 0xEDE7, 0x66B2, 0xEDE8, 0x6756, 0xEDE9, 0x6A1F, 0xEDEA, 0x6AA3, + 0xEDEB, 0x6B0C, 0xEDEC, 0x6F3F, 0xEDED, 0x7246, 0xEDEE, 0xF9FA, + 0xEDEF, 0x7350, 0xEDF0, 0x748B, 0xEDF1, 0x7AE0, 0xEDF2, 0x7CA7, + 0xEDF3, 0x8178, 0xEDF4, 0x81DF, 0xEDF5, 0x81E7, 0xEDF6, 0x838A, + 0xEDF7, 0x846C, 0xEDF8, 0x8523, 0xEDF9, 0x8594, 0xEDFA, 0x85CF, + 0xEDFB, 0x88DD, 0xEDFC, 0x8D13, 0xEDFD, 0x91AC, 0xEDFE, 0x9577, + 0xEEA1, 0x969C, 0xEEA2, 0x518D, 0xEEA3, 0x54C9, 0xEEA4, 0x5728, + 0xEEA5, 0x5BB0, 0xEEA6, 0x624D, 0xEEA7, 0x6750, 0xEEA8, 0x683D, + 0xEEA9, 0x6893, 0xEEAA, 0x6E3D, 0xEEAB, 0x6ED3, 0xEEAC, 0x707D, + 0xEEAD, 0x7E21, 0xEEAE, 0x88C1, 0xEEAF, 0x8CA1, 0xEEB0, 0x8F09, + 0xEEB1, 0x9F4B, 0xEEB2, 0x9F4E, 0xEEB3, 0x722D, 0xEEB4, 0x7B8F, + 0xEEB5, 0x8ACD, 0xEEB6, 0x931A, 0xEEB7, 0x4F47, 0xEEB8, 0x4F4E, + 0xEEB9, 0x5132, 0xEEBA, 0x5480, 0xEEBB, 0x59D0, 0xEEBC, 0x5E95, + 0xEEBD, 0x62B5, 0xEEBE, 0x6775, 0xEEBF, 0x696E, 0xEEC0, 0x6A17, + 0xEEC1, 0x6CAE, 0xEEC2, 0x6E1A, 0xEEC3, 0x72D9, 0xEEC4, 0x732A, + 0xEEC5, 0x75BD, 0xEEC6, 0x7BB8, 0xEEC7, 0x7D35, 0xEEC8, 0x82E7, + 0xEEC9, 0x83F9, 0xEECA, 0x8457, 0xEECB, 0x85F7, 0xEECC, 0x8A5B, + 0xEECD, 0x8CAF, 0xEECE, 0x8E87, 0xEECF, 0x9019, 0xEED0, 0x90B8, + 0xEED1, 0x96CE, 0xEED2, 0x9F5F, 0xEED3, 0x52E3, 0xEED4, 0x540A, + 0xEED5, 0x5AE1, 0xEED6, 0x5BC2, 0xEED7, 0x6458, 0xEED8, 0x6575, + 0xEED9, 0x6EF4, 0xEEDA, 0x72C4, 0xEEDB, 0xF9FB, 0xEEDC, 0x7684, + 0xEEDD, 0x7A4D, 0xEEDE, 0x7B1B, 0xEEDF, 0x7C4D, 0xEEE0, 0x7E3E, + 0xEEE1, 0x7FDF, 0xEEE2, 0x837B, 0xEEE3, 0x8B2B, 0xEEE4, 0x8CCA, + 0xEEE5, 0x8D64, 0xEEE6, 0x8DE1, 0xEEE7, 0x8E5F, 0xEEE8, 0x8FEA, + 0xEEE9, 0x8FF9, 0xEEEA, 0x9069, 0xEEEB, 0x93D1, 0xEEEC, 0x4F43, + 0xEEED, 0x4F7A, 0xEEEE, 0x50B3, 0xEEEF, 0x5168, 0xEEF0, 0x5178, + 0xEEF1, 0x524D, 0xEEF2, 0x526A, 0xEEF3, 0x5861, 0xEEF4, 0x587C, + 0xEEF5, 0x5960, 0xEEF6, 0x5C08, 0xEEF7, 0x5C55, 0xEEF8, 0x5EDB, + 0xEEF9, 0x609B, 0xEEFA, 0x6230, 0xEEFB, 0x6813, 0xEEFC, 0x6BBF, + 0xEEFD, 0x6C08, 0xEEFE, 0x6FB1, 0xEFA1, 0x714E, 0xEFA2, 0x7420, + 0xEFA3, 0x7530, 0xEFA4, 0x7538, 0xEFA5, 0x7551, 0xEFA6, 0x7672, + 0xEFA7, 0x7B4C, 0xEFA8, 0x7B8B, 0xEFA9, 0x7BAD, 0xEFAA, 0x7BC6, + 0xEFAB, 0x7E8F, 0xEFAC, 0x8A6E, 0xEFAD, 0x8F3E, 0xEFAE, 0x8F49, + 0xEFAF, 0x923F, 0xEFB0, 0x9293, 0xEFB1, 0x9322, 0xEFB2, 0x942B, + 0xEFB3, 0x96FB, 0xEFB4, 0x985A, 0xEFB5, 0x986B, 0xEFB6, 0x991E, + 0xEFB7, 0x5207, 0xEFB8, 0x622A, 0xEFB9, 0x6298, 0xEFBA, 0x6D59, + 0xEFBB, 0x7664, 0xEFBC, 0x7ACA, 0xEFBD, 0x7BC0, 0xEFBE, 0x7D76, + 0xEFBF, 0x5360, 0xEFC0, 0x5CBE, 0xEFC1, 0x5E97, 0xEFC2, 0x6F38, + 0xEFC3, 0x70B9, 0xEFC4, 0x7C98, 0xEFC5, 0x9711, 0xEFC6, 0x9B8E, + 0xEFC7, 0x9EDE, 0xEFC8, 0x63A5, 0xEFC9, 0x647A, 0xEFCA, 0x8776, + 0xEFCB, 0x4E01, 0xEFCC, 0x4E95, 0xEFCD, 0x4EAD, 0xEFCE, 0x505C, + 0xEFCF, 0x5075, 0xEFD0, 0x5448, 0xEFD1, 0x59C3, 0xEFD2, 0x5B9A, + 0xEFD3, 0x5E40, 0xEFD4, 0x5EAD, 0xEFD5, 0x5EF7, 0xEFD6, 0x5F81, + 0xEFD7, 0x60C5, 0xEFD8, 0x633A, 0xEFD9, 0x653F, 0xEFDA, 0x6574, + 0xEFDB, 0x65CC, 0xEFDC, 0x6676, 0xEFDD, 0x6678, 0xEFDE, 0x67FE, + 0xEFDF, 0x6968, 0xEFE0, 0x6A89, 0xEFE1, 0x6B63, 0xEFE2, 0x6C40, + 0xEFE3, 0x6DC0, 0xEFE4, 0x6DE8, 0xEFE5, 0x6E1F, 0xEFE6, 0x6E5E, + 0xEFE7, 0x701E, 0xEFE8, 0x70A1, 0xEFE9, 0x738E, 0xEFEA, 0x73FD, + 0xEFEB, 0x753A, 0xEFEC, 0x775B, 0xEFED, 0x7887, 0xEFEE, 0x798E, + 0xEFEF, 0x7A0B, 0xEFF0, 0x7A7D, 0xEFF1, 0x7CBE, 0xEFF2, 0x7D8E, + 0xEFF3, 0x8247, 0xEFF4, 0x8A02, 0xEFF5, 0x8AEA, 0xEFF6, 0x8C9E, + 0xEFF7, 0x912D, 0xEFF8, 0x914A, 0xEFF9, 0x91D8, 0xEFFA, 0x9266, + 0xEFFB, 0x92CC, 0xEFFC, 0x9320, 0xEFFD, 0x9706, 0xEFFE, 0x9756, + 0xF0A1, 0x975C, 0xF0A2, 0x9802, 0xF0A3, 0x9F0E, 0xF0A4, 0x5236, + 0xF0A5, 0x5291, 0xF0A6, 0x557C, 0xF0A7, 0x5824, 0xF0A8, 0x5E1D, + 0xF0A9, 0x5F1F, 0xF0AA, 0x608C, 0xF0AB, 0x63D0, 0xF0AC, 0x68AF, + 0xF0AD, 0x6FDF, 0xF0AE, 0x796D, 0xF0AF, 0x7B2C, 0xF0B0, 0x81CD, + 0xF0B1, 0x85BA, 0xF0B2, 0x88FD, 0xF0B3, 0x8AF8, 0xF0B4, 0x8E44, + 0xF0B5, 0x918D, 0xF0B6, 0x9664, 0xF0B7, 0x969B, 0xF0B8, 0x973D, + 0xF0B9, 0x984C, 0xF0BA, 0x9F4A, 0xF0BB, 0x4FCE, 0xF0BC, 0x5146, + 0xF0BD, 0x51CB, 0xF0BE, 0x52A9, 0xF0BF, 0x5632, 0xF0C0, 0x5F14, + 0xF0C1, 0x5F6B, 0xF0C2, 0x63AA, 0xF0C3, 0x64CD, 0xF0C4, 0x65E9, + 0xF0C5, 0x6641, 0xF0C6, 0x66FA, 0xF0C7, 0x66F9, 0xF0C8, 0x671D, + 0xF0C9, 0x689D, 0xF0CA, 0x68D7, 0xF0CB, 0x69FD, 0xF0CC, 0x6F15, + 0xF0CD, 0x6F6E, 0xF0CE, 0x7167, 0xF0CF, 0x71E5, 0xF0D0, 0x722A, + 0xF0D1, 0x74AA, 0xF0D2, 0x773A, 0xF0D3, 0x7956, 0xF0D4, 0x795A, + 0xF0D5, 0x79DF, 0xF0D6, 0x7A20, 0xF0D7, 0x7A95, 0xF0D8, 0x7C97, + 0xF0D9, 0x7CDF, 0xF0DA, 0x7D44, 0xF0DB, 0x7E70, 0xF0DC, 0x8087, + 0xF0DD, 0x85FB, 0xF0DE, 0x86A4, 0xF0DF, 0x8A54, 0xF0E0, 0x8ABF, + 0xF0E1, 0x8D99, 0xF0E2, 0x8E81, 0xF0E3, 0x9020, 0xF0E4, 0x906D, + 0xF0E5, 0x91E3, 0xF0E6, 0x963B, 0xF0E7, 0x96D5, 0xF0E8, 0x9CE5, + 0xF0E9, 0x65CF, 0xF0EA, 0x7C07, 0xF0EB, 0x8DB3, 0xF0EC, 0x93C3, + 0xF0ED, 0x5B58, 0xF0EE, 0x5C0A, 0xF0EF, 0x5352, 0xF0F0, 0x62D9, + 0xF0F1, 0x731D, 0xF0F2, 0x5027, 0xF0F3, 0x5B97, 0xF0F4, 0x5F9E, + 0xF0F5, 0x60B0, 0xF0F6, 0x616B, 0xF0F7, 0x68D5, 0xF0F8, 0x6DD9, + 0xF0F9, 0x742E, 0xF0FA, 0x7A2E, 0xF0FB, 0x7D42, 0xF0FC, 0x7D9C, + 0xF0FD, 0x7E31, 0xF0FE, 0x816B, 0xF1A1, 0x8E2A, 0xF1A2, 0x8E35, + 0xF1A3, 0x937E, 0xF1A4, 0x9418, 0xF1A5, 0x4F50, 0xF1A6, 0x5750, + 0xF1A7, 0x5DE6, 0xF1A8, 0x5EA7, 0xF1A9, 0x632B, 0xF1AA, 0x7F6A, + 0xF1AB, 0x4E3B, 0xF1AC, 0x4F4F, 0xF1AD, 0x4F8F, 0xF1AE, 0x505A, + 0xF1AF, 0x59DD, 0xF1B0, 0x80C4, 0xF1B1, 0x546A, 0xF1B2, 0x5468, + 0xF1B3, 0x55FE, 0xF1B4, 0x594F, 0xF1B5, 0x5B99, 0xF1B6, 0x5DDE, + 0xF1B7, 0x5EDA, 0xF1B8, 0x665D, 0xF1B9, 0x6731, 0xF1BA, 0x67F1, + 0xF1BB, 0x682A, 0xF1BC, 0x6CE8, 0xF1BD, 0x6D32, 0xF1BE, 0x6E4A, + 0xF1BF, 0x6F8D, 0xF1C0, 0x70B7, 0xF1C1, 0x73E0, 0xF1C2, 0x7587, + 0xF1C3, 0x7C4C, 0xF1C4, 0x7D02, 0xF1C5, 0x7D2C, 0xF1C6, 0x7DA2, + 0xF1C7, 0x821F, 0xF1C8, 0x86DB, 0xF1C9, 0x8A3B, 0xF1CA, 0x8A85, + 0xF1CB, 0x8D70, 0xF1CC, 0x8E8A, 0xF1CD, 0x8F33, 0xF1CE, 0x9031, + 0xF1CF, 0x914E, 0xF1D0, 0x9152, 0xF1D1, 0x9444, 0xF1D2, 0x99D0, + 0xF1D3, 0x7AF9, 0xF1D4, 0x7CA5, 0xF1D5, 0x4FCA, 0xF1D6, 0x5101, + 0xF1D7, 0x51C6, 0xF1D8, 0x57C8, 0xF1D9, 0x5BEF, 0xF1DA, 0x5CFB, + 0xF1DB, 0x6659, 0xF1DC, 0x6A3D, 0xF1DD, 0x6D5A, 0xF1DE, 0x6E96, + 0xF1DF, 0x6FEC, 0xF1E0, 0x710C, 0xF1E1, 0x756F, 0xF1E2, 0x7AE3, + 0xF1E3, 0x8822, 0xF1E4, 0x9021, 0xF1E5, 0x9075, 0xF1E6, 0x96CB, + 0xF1E7, 0x99FF, 0xF1E8, 0x8301, 0xF1E9, 0x4E2D, 0xF1EA, 0x4EF2, + 0xF1EB, 0x8846, 0xF1EC, 0x91CD, 0xF1ED, 0x537D, 0xF1EE, 0x6ADB, + 0xF1EF, 0x696B, 0xF1F0, 0x6C41, 0xF1F1, 0x847A, 0xF1F2, 0x589E, + 0xF1F3, 0x618E, 0xF1F4, 0x66FE, 0xF1F5, 0x62EF, 0xF1F6, 0x70DD, + 0xF1F7, 0x7511, 0xF1F8, 0x75C7, 0xF1F9, 0x7E52, 0xF1FA, 0x84B8, + 0xF1FB, 0x8B49, 0xF1FC, 0x8D08, 0xF1FD, 0x4E4B, 0xF1FE, 0x53EA, + 0xF2A1, 0x54AB, 0xF2A2, 0x5730, 0xF2A3, 0x5740, 0xF2A4, 0x5FD7, + 0xF2A5, 0x6301, 0xF2A6, 0x6307, 0xF2A7, 0x646F, 0xF2A8, 0x652F, + 0xF2A9, 0x65E8, 0xF2AA, 0x667A, 0xF2AB, 0x679D, 0xF2AC, 0x67B3, + 0xF2AD, 0x6B62, 0xF2AE, 0x6C60, 0xF2AF, 0x6C9A, 0xF2B0, 0x6F2C, + 0xF2B1, 0x77E5, 0xF2B2, 0x7825, 0xF2B3, 0x7949, 0xF2B4, 0x7957, + 0xF2B5, 0x7D19, 0xF2B6, 0x80A2, 0xF2B7, 0x8102, 0xF2B8, 0x81F3, + 0xF2B9, 0x829D, 0xF2BA, 0x82B7, 0xF2BB, 0x8718, 0xF2BC, 0x8A8C, + 0xF2BD, 0xF9FC, 0xF2BE, 0x8D04, 0xF2BF, 0x8DBE, 0xF2C0, 0x9072, + 0xF2C1, 0x76F4, 0xF2C2, 0x7A19, 0xF2C3, 0x7A37, 0xF2C4, 0x7E54, + 0xF2C5, 0x8077, 0xF2C6, 0x5507, 0xF2C7, 0x55D4, 0xF2C8, 0x5875, + 0xF2C9, 0x632F, 0xF2CA, 0x6422, 0xF2CB, 0x6649, 0xF2CC, 0x664B, + 0xF2CD, 0x686D, 0xF2CE, 0x699B, 0xF2CF, 0x6B84, 0xF2D0, 0x6D25, + 0xF2D1, 0x6EB1, 0xF2D2, 0x73CD, 0xF2D3, 0x7468, 0xF2D4, 0x74A1, + 0xF2D5, 0x755B, 0xF2D6, 0x75B9, 0xF2D7, 0x76E1, 0xF2D8, 0x771E, + 0xF2D9, 0x778B, 0xF2DA, 0x79E6, 0xF2DB, 0x7E09, 0xF2DC, 0x7E1D, + 0xF2DD, 0x81FB, 0xF2DE, 0x852F, 0xF2DF, 0x8897, 0xF2E0, 0x8A3A, + 0xF2E1, 0x8CD1, 0xF2E2, 0x8EEB, 0xF2E3, 0x8FB0, 0xF2E4, 0x9032, + 0xF2E5, 0x93AD, 0xF2E6, 0x9663, 0xF2E7, 0x9673, 0xF2E8, 0x9707, + 0xF2E9, 0x4F84, 0xF2EA, 0x53F1, 0xF2EB, 0x59EA, 0xF2EC, 0x5AC9, + 0xF2ED, 0x5E19, 0xF2EE, 0x684E, 0xF2EF, 0x74C6, 0xF2F0, 0x75BE, + 0xF2F1, 0x79E9, 0xF2F2, 0x7A92, 0xF2F3, 0x81A3, 0xF2F4, 0x86ED, + 0xF2F5, 0x8CEA, 0xF2F6, 0x8DCC, 0xF2F7, 0x8FED, 0xF2F8, 0x659F, + 0xF2F9, 0x6715, 0xF2FA, 0xF9FD, 0xF2FB, 0x57F7, 0xF2FC, 0x6F57, + 0xF2FD, 0x7DDD, 0xF2FE, 0x8F2F, 0xF3A1, 0x93F6, 0xF3A2, 0x96C6, + 0xF3A3, 0x5FB5, 0xF3A4, 0x61F2, 0xF3A5, 0x6F84, 0xF3A6, 0x4E14, + 0xF3A7, 0x4F98, 0xF3A8, 0x501F, 0xF3A9, 0x53C9, 0xF3AA, 0x55DF, + 0xF3AB, 0x5D6F, 0xF3AC, 0x5DEE, 0xF3AD, 0x6B21, 0xF3AE, 0x6B64, + 0xF3AF, 0x78CB, 0xF3B0, 0x7B9A, 0xF3B1, 0xF9FE, 0xF3B2, 0x8E49, + 0xF3B3, 0x8ECA, 0xF3B4, 0x906E, 0xF3B5, 0x6349, 0xF3B6, 0x643E, + 0xF3B7, 0x7740, 0xF3B8, 0x7A84, 0xF3B9, 0x932F, 0xF3BA, 0x947F, + 0xF3BB, 0x9F6A, 0xF3BC, 0x64B0, 0xF3BD, 0x6FAF, 0xF3BE, 0x71E6, + 0xF3BF, 0x74A8, 0xF3C0, 0x74DA, 0xF3C1, 0x7AC4, 0xF3C2, 0x7C12, + 0xF3C3, 0x7E82, 0xF3C4, 0x7CB2, 0xF3C5, 0x7E98, 0xF3C6, 0x8B9A, + 0xF3C7, 0x8D0A, 0xF3C8, 0x947D, 0xF3C9, 0x9910, 0xF3CA, 0x994C, + 0xF3CB, 0x5239, 0xF3CC, 0x5BDF, 0xF3CD, 0x64E6, 0xF3CE, 0x672D, + 0xF3CF, 0x7D2E, 0xF3D0, 0x50ED, 0xF3D1, 0x53C3, 0xF3D2, 0x5879, + 0xF3D3, 0x6158, 0xF3D4, 0x6159, 0xF3D5, 0x61FA, 0xF3D6, 0x65AC, + 0xF3D7, 0x7AD9, 0xF3D8, 0x8B92, 0xF3D9, 0x8B96, 0xF3DA, 0x5009, + 0xF3DB, 0x5021, 0xF3DC, 0x5275, 0xF3DD, 0x5531, 0xF3DE, 0x5A3C, + 0xF3DF, 0x5EE0, 0xF3E0, 0x5F70, 0xF3E1, 0x6134, 0xF3E2, 0x655E, + 0xF3E3, 0x660C, 0xF3E4, 0x6636, 0xF3E5, 0x66A2, 0xF3E6, 0x69CD, + 0xF3E7, 0x6EC4, 0xF3E8, 0x6F32, 0xF3E9, 0x7316, 0xF3EA, 0x7621, + 0xF3EB, 0x7A93, 0xF3EC, 0x8139, 0xF3ED, 0x8259, 0xF3EE, 0x83D6, + 0xF3EF, 0x84BC, 0xF3F0, 0x50B5, 0xF3F1, 0x57F0, 0xF3F2, 0x5BC0, + 0xF3F3, 0x5BE8, 0xF3F4, 0x5F69, 0xF3F5, 0x63A1, 0xF3F6, 0x7826, + 0xF3F7, 0x7DB5, 0xF3F8, 0x83DC, 0xF3F9, 0x8521, 0xF3FA, 0x91C7, + 0xF3FB, 0x91F5, 0xF3FC, 0x518A, 0xF3FD, 0x67F5, 0xF3FE, 0x7B56, + 0xF4A1, 0x8CAC, 0xF4A2, 0x51C4, 0xF4A3, 0x59BB, 0xF4A4, 0x60BD, + 0xF4A5, 0x8655, 0xF4A6, 0x501C, 0xF4A7, 0xF9FF, 0xF4A8, 0x5254, + 0xF4A9, 0x5C3A, 0xF4AA, 0x617D, 0xF4AB, 0x621A, 0xF4AC, 0x62D3, + 0xF4AD, 0x64F2, 0xF4AE, 0x65A5, 0xF4AF, 0x6ECC, 0xF4B0, 0x7620, + 0xF4B1, 0x810A, 0xF4B2, 0x8E60, 0xF4B3, 0x965F, 0xF4B4, 0x96BB, + 0xF4B5, 0x4EDF, 0xF4B6, 0x5343, 0xF4B7, 0x5598, 0xF4B8, 0x5929, + 0xF4B9, 0x5DDD, 0xF4BA, 0x64C5, 0xF4BB, 0x6CC9, 0xF4BC, 0x6DFA, + 0xF4BD, 0x7394, 0xF4BE, 0x7A7F, 0xF4BF, 0x821B, 0xF4C0, 0x85A6, + 0xF4C1, 0x8CE4, 0xF4C2, 0x8E10, 0xF4C3, 0x9077, 0xF4C4, 0x91E7, + 0xF4C5, 0x95E1, 0xF4C6, 0x9621, 0xF4C7, 0x97C6, 0xF4C8, 0x51F8, + 0xF4C9, 0x54F2, 0xF4CA, 0x5586, 0xF4CB, 0x5FB9, 0xF4CC, 0x64A4, + 0xF4CD, 0x6F88, 0xF4CE, 0x7DB4, 0xF4CF, 0x8F1F, 0xF4D0, 0x8F4D, + 0xF4D1, 0x9435, 0xF4D2, 0x50C9, 0xF4D3, 0x5C16, 0xF4D4, 0x6CBE, + 0xF4D5, 0x6DFB, 0xF4D6, 0x751B, 0xF4D7, 0x77BB, 0xF4D8, 0x7C3D, + 0xF4D9, 0x7C64, 0xF4DA, 0x8A79, 0xF4DB, 0x8AC2, 0xF4DC, 0x581E, + 0xF4DD, 0x59BE, 0xF4DE, 0x5E16, 0xF4DF, 0x6377, 0xF4E0, 0x7252, + 0xF4E1, 0x758A, 0xF4E2, 0x776B, 0xF4E3, 0x8ADC, 0xF4E4, 0x8CBC, + 0xF4E5, 0x8F12, 0xF4E6, 0x5EF3, 0xF4E7, 0x6674, 0xF4E8, 0x6DF8, + 0xF4E9, 0x807D, 0xF4EA, 0x83C1, 0xF4EB, 0x8ACB, 0xF4EC, 0x9751, + 0xF4ED, 0x9BD6, 0xF4EE, 0xFA00, 0xF4EF, 0x5243, 0xF4F0, 0x66FF, + 0xF4F1, 0x6D95, 0xF4F2, 0x6EEF, 0xF4F3, 0x7DE0, 0xF4F4, 0x8AE6, + 0xF4F5, 0x902E, 0xF4F6, 0x905E, 0xF4F7, 0x9AD4, 0xF4F8, 0x521D, + 0xF4F9, 0x527F, 0xF4FA, 0x54E8, 0xF4FB, 0x6194, 0xF4FC, 0x6284, + 0xF4FD, 0x62DB, 0xF4FE, 0x68A2, 0xF5A1, 0x6912, 0xF5A2, 0x695A, + 0xF5A3, 0x6A35, 0xF5A4, 0x7092, 0xF5A5, 0x7126, 0xF5A6, 0x785D, + 0xF5A7, 0x7901, 0xF5A8, 0x790E, 0xF5A9, 0x79D2, 0xF5AA, 0x7A0D, + 0xF5AB, 0x8096, 0xF5AC, 0x8278, 0xF5AD, 0x82D5, 0xF5AE, 0x8349, + 0xF5AF, 0x8549, 0xF5B0, 0x8C82, 0xF5B1, 0x8D85, 0xF5B2, 0x9162, + 0xF5B3, 0x918B, 0xF5B4, 0x91AE, 0xF5B5, 0x4FC3, 0xF5B6, 0x56D1, + 0xF5B7, 0x71ED, 0xF5B8, 0x77D7, 0xF5B9, 0x8700, 0xF5BA, 0x89F8, + 0xF5BB, 0x5BF8, 0xF5BC, 0x5FD6, 0xF5BD, 0x6751, 0xF5BE, 0x90A8, + 0xF5BF, 0x53E2, 0xF5C0, 0x585A, 0xF5C1, 0x5BF5, 0xF5C2, 0x60A4, + 0xF5C3, 0x6181, 0xF5C4, 0x6460, 0xF5C5, 0x7E3D, 0xF5C6, 0x8070, + 0xF5C7, 0x8525, 0xF5C8, 0x9283, 0xF5C9, 0x64AE, 0xF5CA, 0x50AC, + 0xF5CB, 0x5D14, 0xF5CC, 0x6700, 0xF5CD, 0x589C, 0xF5CE, 0x62BD, + 0xF5CF, 0x63A8, 0xF5D0, 0x690E, 0xF5D1, 0x6978, 0xF5D2, 0x6A1E, + 0xF5D3, 0x6E6B, 0xF5D4, 0x76BA, 0xF5D5, 0x79CB, 0xF5D6, 0x82BB, + 0xF5D7, 0x8429, 0xF5D8, 0x8ACF, 0xF5D9, 0x8DA8, 0xF5DA, 0x8FFD, + 0xF5DB, 0x9112, 0xF5DC, 0x914B, 0xF5DD, 0x919C, 0xF5DE, 0x9310, + 0xF5DF, 0x9318, 0xF5E0, 0x939A, 0xF5E1, 0x96DB, 0xF5E2, 0x9A36, + 0xF5E3, 0x9C0D, 0xF5E4, 0x4E11, 0xF5E5, 0x755C, 0xF5E6, 0x795D, + 0xF5E7, 0x7AFA, 0xF5E8, 0x7B51, 0xF5E9, 0x7BC9, 0xF5EA, 0x7E2E, + 0xF5EB, 0x84C4, 0xF5EC, 0x8E59, 0xF5ED, 0x8E74, 0xF5EE, 0x8EF8, + 0xF5EF, 0x9010, 0xF5F0, 0x6625, 0xF5F1, 0x693F, 0xF5F2, 0x7443, + 0xF5F3, 0x51FA, 0xF5F4, 0x672E, 0xF5F5, 0x9EDC, 0xF5F6, 0x5145, + 0xF5F7, 0x5FE0, 0xF5F8, 0x6C96, 0xF5F9, 0x87F2, 0xF5FA, 0x885D, + 0xF5FB, 0x8877, 0xF5FC, 0x60B4, 0xF5FD, 0x81B5, 0xF5FE, 0x8403, + 0xF6A1, 0x8D05, 0xF6A2, 0x53D6, 0xF6A3, 0x5439, 0xF6A4, 0x5634, + 0xF6A5, 0x5A36, 0xF6A6, 0x5C31, 0xF6A7, 0x708A, 0xF6A8, 0x7FE0, + 0xF6A9, 0x805A, 0xF6AA, 0x8106, 0xF6AB, 0x81ED, 0xF6AC, 0x8DA3, + 0xF6AD, 0x9189, 0xF6AE, 0x9A5F, 0xF6AF, 0x9DF2, 0xF6B0, 0x5074, + 0xF6B1, 0x4EC4, 0xF6B2, 0x53A0, 0xF6B3, 0x60FB, 0xF6B4, 0x6E2C, + 0xF6B5, 0x5C64, 0xF6B6, 0x4F88, 0xF6B7, 0x5024, 0xF6B8, 0x55E4, + 0xF6B9, 0x5CD9, 0xF6BA, 0x5E5F, 0xF6BB, 0x6065, 0xF6BC, 0x6894, + 0xF6BD, 0x6CBB, 0xF6BE, 0x6DC4, 0xF6BF, 0x71BE, 0xF6C0, 0x75D4, + 0xF6C1, 0x75F4, 0xF6C2, 0x7661, 0xF6C3, 0x7A1A, 0xF6C4, 0x7A49, + 0xF6C5, 0x7DC7, 0xF6C6, 0x7DFB, 0xF6C7, 0x7F6E, 0xF6C8, 0x81F4, + 0xF6C9, 0x86A9, 0xF6CA, 0x8F1C, 0xF6CB, 0x96C9, 0xF6CC, 0x99B3, + 0xF6CD, 0x9F52, 0xF6CE, 0x5247, 0xF6CF, 0x52C5, 0xF6D0, 0x98ED, + 0xF6D1, 0x89AA, 0xF6D2, 0x4E03, 0xF6D3, 0x67D2, 0xF6D4, 0x6F06, + 0xF6D5, 0x4FB5, 0xF6D6, 0x5BE2, 0xF6D7, 0x6795, 0xF6D8, 0x6C88, + 0xF6D9, 0x6D78, 0xF6DA, 0x741B, 0xF6DB, 0x7827, 0xF6DC, 0x91DD, + 0xF6DD, 0x937C, 0xF6DE, 0x87C4, 0xF6DF, 0x79E4, 0xF6E0, 0x7A31, + 0xF6E1, 0x5FEB, 0xF6E2, 0x4ED6, 0xF6E3, 0x54A4, 0xF6E4, 0x553E, + 0xF6E5, 0x58AE, 0xF6E6, 0x59A5, 0xF6E7, 0x60F0, 0xF6E8, 0x6253, + 0xF6E9, 0x62D6, 0xF6EA, 0x6736, 0xF6EB, 0x6955, 0xF6EC, 0x8235, + 0xF6ED, 0x9640, 0xF6EE, 0x99B1, 0xF6EF, 0x99DD, 0xF6F0, 0x502C, + 0xF6F1, 0x5353, 0xF6F2, 0x5544, 0xF6F3, 0x577C, 0xF6F4, 0xFA01, + 0xF6F5, 0x6258, 0xF6F6, 0xFA02, 0xF6F7, 0x64E2, 0xF6F8, 0x666B, + 0xF6F9, 0x67DD, 0xF6FA, 0x6FC1, 0xF6FB, 0x6FEF, 0xF6FC, 0x7422, + 0xF6FD, 0x7438, 0xF6FE, 0x8A17, 0xF7A1, 0x9438, 0xF7A2, 0x5451, + 0xF7A3, 0x5606, 0xF7A4, 0x5766, 0xF7A5, 0x5F48, 0xF7A6, 0x619A, + 0xF7A7, 0x6B4E, 0xF7A8, 0x7058, 0xF7A9, 0x70AD, 0xF7AA, 0x7DBB, + 0xF7AB, 0x8A95, 0xF7AC, 0x596A, 0xF7AD, 0x812B, 0xF7AE, 0x63A2, + 0xF7AF, 0x7708, 0xF7B0, 0x803D, 0xF7B1, 0x8CAA, 0xF7B2, 0x5854, + 0xF7B3, 0x642D, 0xF7B4, 0x69BB, 0xF7B5, 0x5B95, 0xF7B6, 0x5E11, + 0xF7B7, 0x6E6F, 0xF7B8, 0xFA03, 0xF7B9, 0x8569, 0xF7BA, 0x514C, + 0xF7BB, 0x53F0, 0xF7BC, 0x592A, 0xF7BD, 0x6020, 0xF7BE, 0x614B, + 0xF7BF, 0x6B86, 0xF7C0, 0x6C70, 0xF7C1, 0x6CF0, 0xF7C2, 0x7B1E, + 0xF7C3, 0x80CE, 0xF7C4, 0x82D4, 0xF7C5, 0x8DC6, 0xF7C6, 0x90B0, + 0xF7C7, 0x98B1, 0xF7C8, 0xFA04, 0xF7C9, 0x64C7, 0xF7CA, 0x6FA4, + 0xF7CB, 0x6491, 0xF7CC, 0x6504, 0xF7CD, 0x514E, 0xF7CE, 0x5410, + 0xF7CF, 0x571F, 0xF7D0, 0x8A0E, 0xF7D1, 0x615F, 0xF7D2, 0x6876, + 0xF7D3, 0xFA05, 0xF7D4, 0x75DB, 0xF7D5, 0x7B52, 0xF7D6, 0x7D71, + 0xF7D7, 0x901A, 0xF7D8, 0x5806, 0xF7D9, 0x69CC, 0xF7DA, 0x817F, + 0xF7DB, 0x892A, 0xF7DC, 0x9000, 0xF7DD, 0x9839, 0xF7DE, 0x5078, + 0xF7DF, 0x5957, 0xF7E0, 0x59AC, 0xF7E1, 0x6295, 0xF7E2, 0x900F, + 0xF7E3, 0x9B2A, 0xF7E4, 0x615D, 0xF7E5, 0x7279, 0xF7E6, 0x95D6, + 0xF7E7, 0x5761, 0xF7E8, 0x5A46, 0xF7E9, 0x5DF4, 0xF7EA, 0x628A, + 0xF7EB, 0x64AD, 0xF7EC, 0x64FA, 0xF7ED, 0x6777, 0xF7EE, 0x6CE2, + 0xF7EF, 0x6D3E, 0xF7F0, 0x722C, 0xF7F1, 0x7436, 0xF7F2, 0x7834, + 0xF7F3, 0x7F77, 0xF7F4, 0x82AD, 0xF7F5, 0x8DDB, 0xF7F6, 0x9817, + 0xF7F7, 0x5224, 0xF7F8, 0x5742, 0xF7F9, 0x677F, 0xF7FA, 0x7248, + 0xF7FB, 0x74E3, 0xF7FC, 0x8CA9, 0xF7FD, 0x8FA6, 0xF7FE, 0x9211, + 0xF8A1, 0x962A, 0xF8A2, 0x516B, 0xF8A3, 0x53ED, 0xF8A4, 0x634C, + 0xF8A5, 0x4F69, 0xF8A6, 0x5504, 0xF8A7, 0x6096, 0xF8A8, 0x6557, + 0xF8A9, 0x6C9B, 0xF8AA, 0x6D7F, 0xF8AB, 0x724C, 0xF8AC, 0x72FD, + 0xF8AD, 0x7A17, 0xF8AE, 0x8987, 0xF8AF, 0x8C9D, 0xF8B0, 0x5F6D, + 0xF8B1, 0x6F8E, 0xF8B2, 0x70F9, 0xF8B3, 0x81A8, 0xF8B4, 0x610E, + 0xF8B5, 0x4FBF, 0xF8B6, 0x504F, 0xF8B7, 0x6241, 0xF8B8, 0x7247, + 0xF8B9, 0x7BC7, 0xF8BA, 0x7DE8, 0xF8BB, 0x7FE9, 0xF8BC, 0x904D, + 0xF8BD, 0x97AD, 0xF8BE, 0x9A19, 0xF8BF, 0x8CB6, 0xF8C0, 0x576A, + 0xF8C1, 0x5E73, 0xF8C2, 0x67B0, 0xF8C3, 0x840D, 0xF8C4, 0x8A55, + 0xF8C5, 0x5420, 0xF8C6, 0x5B16, 0xF8C7, 0x5E63, 0xF8C8, 0x5EE2, + 0xF8C9, 0x5F0A, 0xF8CA, 0x6583, 0xF8CB, 0x80BA, 0xF8CC, 0x853D, + 0xF8CD, 0x9589, 0xF8CE, 0x965B, 0xF8CF, 0x4F48, 0xF8D0, 0x5305, + 0xF8D1, 0x530D, 0xF8D2, 0x530F, 0xF8D3, 0x5486, 0xF8D4, 0x54FA, + 0xF8D5, 0x5703, 0xF8D6, 0x5E03, 0xF8D7, 0x6016, 0xF8D8, 0x629B, + 0xF8D9, 0x62B1, 0xF8DA, 0x6355, 0xF8DB, 0xFA06, 0xF8DC, 0x6CE1, + 0xF8DD, 0x6D66, 0xF8DE, 0x75B1, 0xF8DF, 0x7832, 0xF8E0, 0x80DE, + 0xF8E1, 0x812F, 0xF8E2, 0x82DE, 0xF8E3, 0x8461, 0xF8E4, 0x84B2, + 0xF8E5, 0x888D, 0xF8E6, 0x8912, 0xF8E7, 0x900B, 0xF8E8, 0x92EA, + 0xF8E9, 0x98FD, 0xF8EA, 0x9B91, 0xF8EB, 0x5E45, 0xF8EC, 0x66B4, + 0xF8ED, 0x66DD, 0xF8EE, 0x7011, 0xF8EF, 0x7206, 0xF8F0, 0xFA07, + 0xF8F1, 0x4FF5, 0xF8F2, 0x527D, 0xF8F3, 0x5F6A, 0xF8F4, 0x6153, + 0xF8F5, 0x6753, 0xF8F6, 0x6A19, 0xF8F7, 0x6F02, 0xF8F8, 0x74E2, + 0xF8F9, 0x7968, 0xF8FA, 0x8868, 0xF8FB, 0x8C79, 0xF8FC, 0x98C7, + 0xF8FD, 0x98C4, 0xF8FE, 0x9A43, 0xF9A1, 0x54C1, 0xF9A2, 0x7A1F, + 0xF9A3, 0x6953, 0xF9A4, 0x8AF7, 0xF9A5, 0x8C4A, 0xF9A6, 0x98A8, + 0xF9A7, 0x99AE, 0xF9A8, 0x5F7C, 0xF9A9, 0x62AB, 0xF9AA, 0x75B2, + 0xF9AB, 0x76AE, 0xF9AC, 0x88AB, 0xF9AD, 0x907F, 0xF9AE, 0x9642, + 0xF9AF, 0x5339, 0xF9B0, 0x5F3C, 0xF9B1, 0x5FC5, 0xF9B2, 0x6CCC, + 0xF9B3, 0x73CC, 0xF9B4, 0x7562, 0xF9B5, 0x758B, 0xF9B6, 0x7B46, + 0xF9B7, 0x82FE, 0xF9B8, 0x999D, 0xF9B9, 0x4E4F, 0xF9BA, 0x903C, + 0xF9BB, 0x4E0B, 0xF9BC, 0x4F55, 0xF9BD, 0x53A6, 0xF9BE, 0x590F, + 0xF9BF, 0x5EC8, 0xF9C0, 0x6630, 0xF9C1, 0x6CB3, 0xF9C2, 0x7455, + 0xF9C3, 0x8377, 0xF9C4, 0x8766, 0xF9C5, 0x8CC0, 0xF9C6, 0x9050, + 0xF9C7, 0x971E, 0xF9C8, 0x9C15, 0xF9C9, 0x58D1, 0xF9CA, 0x5B78, + 0xF9CB, 0x8650, 0xF9CC, 0x8B14, 0xF9CD, 0x9DB4, 0xF9CE, 0x5BD2, + 0xF9CF, 0x6068, 0xF9D0, 0x608D, 0xF9D1, 0x65F1, 0xF9D2, 0x6C57, + 0xF9D3, 0x6F22, 0xF9D4, 0x6FA3, 0xF9D5, 0x701A, 0xF9D6, 0x7F55, + 0xF9D7, 0x7FF0, 0xF9D8, 0x9591, 0xF9D9, 0x9592, 0xF9DA, 0x9650, + 0xF9DB, 0x97D3, 0xF9DC, 0x5272, 0xF9DD, 0x8F44, 0xF9DE, 0x51FD, + 0xF9DF, 0x542B, 0xF9E0, 0x54B8, 0xF9E1, 0x5563, 0xF9E2, 0x558A, + 0xF9E3, 0x6ABB, 0xF9E4, 0x6DB5, 0xF9E5, 0x7DD8, 0xF9E6, 0x8266, + 0xF9E7, 0x929C, 0xF9E8, 0x9677, 0xF9E9, 0x9E79, 0xF9EA, 0x5408, + 0xF9EB, 0x54C8, 0xF9EC, 0x76D2, 0xF9ED, 0x86E4, 0xF9EE, 0x95A4, + 0xF9EF, 0x95D4, 0xF9F0, 0x965C, 0xF9F1, 0x4EA2, 0xF9F2, 0x4F09, + 0xF9F3, 0x59EE, 0xF9F4, 0x5AE6, 0xF9F5, 0x5DF7, 0xF9F6, 0x6052, + 0xF9F7, 0x6297, 0xF9F8, 0x676D, 0xF9F9, 0x6841, 0xF9FA, 0x6C86, + 0xF9FB, 0x6E2F, 0xF9FC, 0x7F38, 0xF9FD, 0x809B, 0xF9FE, 0x822A, + 0xFAA1, 0xFA08, 0xFAA2, 0xFA09, 0xFAA3, 0x9805, 0xFAA4, 0x4EA5, + 0xFAA5, 0x5055, 0xFAA6, 0x54B3, 0xFAA7, 0x5793, 0xFAA8, 0x595A, + 0xFAA9, 0x5B69, 0xFAAA, 0x5BB3, 0xFAAB, 0x61C8, 0xFAAC, 0x6977, + 0xFAAD, 0x6D77, 0xFAAE, 0x7023, 0xFAAF, 0x87F9, 0xFAB0, 0x89E3, + 0xFAB1, 0x8A72, 0xFAB2, 0x8AE7, 0xFAB3, 0x9082, 0xFAB4, 0x99ED, + 0xFAB5, 0x9AB8, 0xFAB6, 0x52BE, 0xFAB7, 0x6838, 0xFAB8, 0x5016, + 0xFAB9, 0x5E78, 0xFABA, 0x674F, 0xFABB, 0x8347, 0xFABC, 0x884C, + 0xFABD, 0x4EAB, 0xFABE, 0x5411, 0xFABF, 0x56AE, 0xFAC0, 0x73E6, + 0xFAC1, 0x9115, 0xFAC2, 0x97FF, 0xFAC3, 0x9909, 0xFAC4, 0x9957, + 0xFAC5, 0x9999, 0xFAC6, 0x5653, 0xFAC7, 0x589F, 0xFAC8, 0x865B, + 0xFAC9, 0x8A31, 0xFACA, 0x61B2, 0xFACB, 0x6AF6, 0xFACC, 0x737B, + 0xFACD, 0x8ED2, 0xFACE, 0x6B47, 0xFACF, 0x96AA, 0xFAD0, 0x9A57, + 0xFAD1, 0x5955, 0xFAD2, 0x7200, 0xFAD3, 0x8D6B, 0xFAD4, 0x9769, + 0xFAD5, 0x4FD4, 0xFAD6, 0x5CF4, 0xFAD7, 0x5F26, 0xFAD8, 0x61F8, + 0xFAD9, 0x665B, 0xFADA, 0x6CEB, 0xFADB, 0x70AB, 0xFADC, 0x7384, + 0xFADD, 0x73B9, 0xFADE, 0x73FE, 0xFADF, 0x7729, 0xFAE0, 0x774D, + 0xFAE1, 0x7D43, 0xFAE2, 0x7D62, 0xFAE3, 0x7E23, 0xFAE4, 0x8237, + 0xFAE5, 0x8852, 0xFAE6, 0xFA0A, 0xFAE7, 0x8CE2, 0xFAE8, 0x9249, + 0xFAE9, 0x986F, 0xFAEA, 0x5B51, 0xFAEB, 0x7A74, 0xFAEC, 0x8840, + 0xFAED, 0x9801, 0xFAEE, 0x5ACC, 0xFAEF, 0x4FE0, 0xFAF0, 0x5354, + 0xFAF1, 0x593E, 0xFAF2, 0x5CFD, 0xFAF3, 0x633E, 0xFAF4, 0x6D79, + 0xFAF5, 0x72F9, 0xFAF6, 0x8105, 0xFAF7, 0x8107, 0xFAF8, 0x83A2, + 0xFAF9, 0x92CF, 0xFAFA, 0x9830, 0xFAFB, 0x4EA8, 0xFAFC, 0x5144, + 0xFAFD, 0x5211, 0xFAFE, 0x578B, 0xFBA1, 0x5F62, 0xFBA2, 0x6CC2, + 0xFBA3, 0x6ECE, 0xFBA4, 0x7005, 0xFBA5, 0x7050, 0xFBA6, 0x70AF, + 0xFBA7, 0x7192, 0xFBA8, 0x73E9, 0xFBA9, 0x7469, 0xFBAA, 0x834A, + 0xFBAB, 0x87A2, 0xFBAC, 0x8861, 0xFBAD, 0x9008, 0xFBAE, 0x90A2, + 0xFBAF, 0x93A3, 0xFBB0, 0x99A8, 0xFBB1, 0x516E, 0xFBB2, 0x5F57, + 0xFBB3, 0x60E0, 0xFBB4, 0x6167, 0xFBB5, 0x66B3, 0xFBB6, 0x8559, + 0xFBB7, 0x8E4A, 0xFBB8, 0x91AF, 0xFBB9, 0x978B, 0xFBBA, 0x4E4E, + 0xFBBB, 0x4E92, 0xFBBC, 0x547C, 0xFBBD, 0x58D5, 0xFBBE, 0x58FA, + 0xFBBF, 0x597D, 0xFBC0, 0x5CB5, 0xFBC1, 0x5F27, 0xFBC2, 0x6236, + 0xFBC3, 0x6248, 0xFBC4, 0x660A, 0xFBC5, 0x6667, 0xFBC6, 0x6BEB, + 0xFBC7, 0x6D69, 0xFBC8, 0x6DCF, 0xFBC9, 0x6E56, 0xFBCA, 0x6EF8, + 0xFBCB, 0x6F94, 0xFBCC, 0x6FE0, 0xFBCD, 0x6FE9, 0xFBCE, 0x705D, + 0xFBCF, 0x72D0, 0xFBD0, 0x7425, 0xFBD1, 0x745A, 0xFBD2, 0x74E0, + 0xFBD3, 0x7693, 0xFBD4, 0x795C, 0xFBD5, 0x7CCA, 0xFBD6, 0x7E1E, + 0xFBD7, 0x80E1, 0xFBD8, 0x82A6, 0xFBD9, 0x846B, 0xFBDA, 0x84BF, + 0xFBDB, 0x864E, 0xFBDC, 0x865F, 0xFBDD, 0x8774, 0xFBDE, 0x8B77, + 0xFBDF, 0x8C6A, 0xFBE0, 0x93AC, 0xFBE1, 0x9800, 0xFBE2, 0x9865, + 0xFBE3, 0x60D1, 0xFBE4, 0x6216, 0xFBE5, 0x9177, 0xFBE6, 0x5A5A, + 0xFBE7, 0x660F, 0xFBE8, 0x6DF7, 0xFBE9, 0x6E3E, 0xFBEA, 0x743F, + 0xFBEB, 0x9B42, 0xFBEC, 0x5FFD, 0xFBED, 0x60DA, 0xFBEE, 0x7B0F, + 0xFBEF, 0x54C4, 0xFBF0, 0x5F18, 0xFBF1, 0x6C5E, 0xFBF2, 0x6CD3, + 0xFBF3, 0x6D2A, 0xFBF4, 0x70D8, 0xFBF5, 0x7D05, 0xFBF6, 0x8679, + 0xFBF7, 0x8A0C, 0xFBF8, 0x9D3B, 0xFBF9, 0x5316, 0xFBFA, 0x548C, + 0xFBFB, 0x5B05, 0xFBFC, 0x6A3A, 0xFBFD, 0x706B, 0xFBFE, 0x7575, + 0xFCA1, 0x798D, 0xFCA2, 0x79BE, 0xFCA3, 0x82B1, 0xFCA4, 0x83EF, + 0xFCA5, 0x8A71, 0xFCA6, 0x8B41, 0xFCA7, 0x8CA8, 0xFCA8, 0x9774, + 0xFCA9, 0xFA0B, 0xFCAA, 0x64F4, 0xFCAB, 0x652B, 0xFCAC, 0x78BA, + 0xFCAD, 0x78BB, 0xFCAE, 0x7A6B, 0xFCAF, 0x4E38, 0xFCB0, 0x559A, + 0xFCB1, 0x5950, 0xFCB2, 0x5BA6, 0xFCB3, 0x5E7B, 0xFCB4, 0x60A3, + 0xFCB5, 0x63DB, 0xFCB6, 0x6B61, 0xFCB7, 0x6665, 0xFCB8, 0x6853, + 0xFCB9, 0x6E19, 0xFCBA, 0x7165, 0xFCBB, 0x74B0, 0xFCBC, 0x7D08, + 0xFCBD, 0x9084, 0xFCBE, 0x9A69, 0xFCBF, 0x9C25, 0xFCC0, 0x6D3B, + 0xFCC1, 0x6ED1, 0xFCC2, 0x733E, 0xFCC3, 0x8C41, 0xFCC4, 0x95CA, + 0xFCC5, 0x51F0, 0xFCC6, 0x5E4C, 0xFCC7, 0x5FA8, 0xFCC8, 0x604D, + 0xFCC9, 0x60F6, 0xFCCA, 0x6130, 0xFCCB, 0x614C, 0xFCCC, 0x6643, + 0xFCCD, 0x6644, 0xFCCE, 0x69A5, 0xFCCF, 0x6CC1, 0xFCD0, 0x6E5F, + 0xFCD1, 0x6EC9, 0xFCD2, 0x6F62, 0xFCD3, 0x714C, 0xFCD4, 0x749C, + 0xFCD5, 0x7687, 0xFCD6, 0x7BC1, 0xFCD7, 0x7C27, 0xFCD8, 0x8352, + 0xFCD9, 0x8757, 0xFCDA, 0x9051, 0xFCDB, 0x968D, 0xFCDC, 0x9EC3, + 0xFCDD, 0x532F, 0xFCDE, 0x56DE, 0xFCDF, 0x5EFB, 0xFCE0, 0x5F8A, + 0xFCE1, 0x6062, 0xFCE2, 0x6094, 0xFCE3, 0x61F7, 0xFCE4, 0x6666, + 0xFCE5, 0x6703, 0xFCE6, 0x6A9C, 0xFCE7, 0x6DEE, 0xFCE8, 0x6FAE, + 0xFCE9, 0x7070, 0xFCEA, 0x736A, 0xFCEB, 0x7E6A, 0xFCEC, 0x81BE, + 0xFCED, 0x8334, 0xFCEE, 0x86D4, 0xFCEF, 0x8AA8, 0xFCF0, 0x8CC4, + 0xFCF1, 0x5283, 0xFCF2, 0x7372, 0xFCF3, 0x5B96, 0xFCF4, 0x6A6B, + 0xFCF5, 0x9404, 0xFCF6, 0x54EE, 0xFCF7, 0x5686, 0xFCF8, 0x5B5D, + 0xFCF9, 0x6548, 0xFCFA, 0x6585, 0xFCFB, 0x66C9, 0xFCFC, 0x689F, + 0xFCFD, 0x6D8D, 0xFCFE, 0x6DC6, 0xFDA1, 0x723B, 0xFDA2, 0x80B4, + 0xFDA3, 0x9175, 0xFDA4, 0x9A4D, 0xFDA5, 0x4FAF, 0xFDA6, 0x5019, + 0xFDA7, 0x539A, 0xFDA8, 0x540E, 0xFDA9, 0x543C, 0xFDAA, 0x5589, + 0xFDAB, 0x55C5, 0xFDAC, 0x5E3F, 0xFDAD, 0x5F8C, 0xFDAE, 0x673D, + 0xFDAF, 0x7166, 0xFDB0, 0x73DD, 0xFDB1, 0x9005, 0xFDB2, 0x52DB, + 0xFDB3, 0x52F3, 0xFDB4, 0x5864, 0xFDB5, 0x58CE, 0xFDB6, 0x7104, + 0xFDB7, 0x718F, 0xFDB8, 0x71FB, 0xFDB9, 0x85B0, 0xFDBA, 0x8A13, + 0xFDBB, 0x6688, 0xFDBC, 0x85A8, 0xFDBD, 0x55A7, 0xFDBE, 0x6684, + 0xFDBF, 0x714A, 0xFDC0, 0x8431, 0xFDC1, 0x5349, 0xFDC2, 0x5599, + 0xFDC3, 0x6BC1, 0xFDC4, 0x5F59, 0xFDC5, 0x5FBD, 0xFDC6, 0x63EE, + 0xFDC7, 0x6689, 0xFDC8, 0x7147, 0xFDC9, 0x8AF1, 0xFDCA, 0x8F1D, + 0xFDCB, 0x9EBE, 0xFDCC, 0x4F11, 0xFDCD, 0x643A, 0xFDCE, 0x70CB, + 0xFDCF, 0x7566, 0xFDD0, 0x8667, 0xFDD1, 0x6064, 0xFDD2, 0x8B4E, + 0xFDD3, 0x9DF8, 0xFDD4, 0x5147, 0xFDD5, 0x51F6, 0xFDD6, 0x5308, + 0xFDD7, 0x6D36, 0xFDD8, 0x80F8, 0xFDD9, 0x9ED1, 0xFDDA, 0x6615, + 0xFDDB, 0x6B23, 0xFDDC, 0x7098, 0xFDDD, 0x75D5, 0xFDDE, 0x5403, + 0xFDDF, 0x5C79, 0xFDE0, 0x7D07, 0xFDE1, 0x8A16, 0xFDE2, 0x6B20, + 0xFDE3, 0x6B3D, 0xFDE4, 0x6B46, 0xFDE5, 0x5438, 0xFDE6, 0x6070, + 0xFDE7, 0x6D3D, 0xFDE8, 0x7FD5, 0xFDE9, 0x8208, 0xFDEA, 0x50D6, + 0xFDEB, 0x51DE, 0xFDEC, 0x559C, 0xFDED, 0x566B, 0xFDEE, 0x56CD, + 0xFDEF, 0x59EC, 0xFDF0, 0x5B09, 0xFDF1, 0x5E0C, 0xFDF2, 0x6199, + 0xFDF3, 0x6198, 0xFDF4, 0x6231, 0xFDF5, 0x665E, 0xFDF6, 0x66E6, + 0xFDF7, 0x7199, 0xFDF8, 0x71B9, 0xFDF9, 0x71BA, 0xFDFA, 0x72A7, + 0xFDFB, 0x79A7, 0xFDFC, 0x7A00, 0xFDFD, 0x7FB2, 0xFDFE, 0x8A70, + 0, 0 +}; + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR src, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (src < 0x80) { /* ASCII */ + c = src; + } else { + if (dir) { /* OEMCP to unicode */ + p = oem2uni; + hi = sizeof(oem2uni) / 4 - 1; + } else { /* Unicode to OEMCP */ + p = uni2oem; + hi = sizeof(uni2oem) / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (src == p[i * 2]) break; + if (src > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; + } + + return c; +} + + + + +WCHAR ff_wtoupper ( /* Upper converted character */ + WCHAR chr /* Input character */ +) +{ + static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; + static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; + int i; + + + for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + + return tbl_lower[i] ? tbl_upper[i] : chr; +} diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc950.c b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc950.c new file mode 100644 index 0000000..aa02a75 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/cc950.c @@ -0,0 +1,6829 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ +/* */ +/* CP950 (Traditional Chinese Big5) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + + +#if !_USE_LFN || _CODE_PAGE != 950 +#error This file is not needed in current configuration. +#endif + + +static +const WCHAR uni2oem[] = { +/* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ + 0x00A7, 0xA1B1, 0x00AF, 0xA1C2, 0x00B0, 0xA258, 0x00B1, 0xA1D3, + 0x00B7, 0xA150, 0x00D7, 0xA1D1, 0x00F7, 0xA1D2, 0x02C7, 0xA3BE, + 0x02C9, 0xA3BC, 0x02CA, 0xA3BD, 0x02CB, 0xA3BF, 0x02CD, 0xA1C5, + 0x02D9, 0xA3BB, 0x0391, 0xA344, 0x0392, 0xA345, 0x0393, 0xA346, + 0x0394, 0xA347, 0x0395, 0xA348, 0x0396, 0xA349, 0x0397, 0xA34A, + 0x0398, 0xA34B, 0x0399, 0xA34C, 0x039A, 0xA34D, 0x039B, 0xA34E, + 0x039C, 0xA34F, 0x039D, 0xA350, 0x039E, 0xA351, 0x039F, 0xA352, + 0x03A0, 0xA353, 0x03A1, 0xA354, 0x03A3, 0xA355, 0x03A4, 0xA356, + 0x03A5, 0xA357, 0x03A6, 0xA358, 0x03A7, 0xA359, 0x03A8, 0xA35A, + 0x03A9, 0xA35B, 0x03B1, 0xA35C, 0x03B2, 0xA35D, 0x03B3, 0xA35E, + 0x03B4, 0xA35F, 0x03B5, 0xA360, 0x03B6, 0xA361, 0x03B7, 0xA362, + 0x03B8, 0xA363, 0x03B9, 0xA364, 0x03BA, 0xA365, 0x03BB, 0xA366, + 0x03BC, 0xA367, 0x03BD, 0xA368, 0x03BE, 0xA369, 0x03BF, 0xA36A, + 0x03C0, 0xA36B, 0x03C1, 0xA36C, 0x03C3, 0xA36D, 0x03C4, 0xA36E, + 0x03C5, 0xA36F, 0x03C6, 0xA370, 0x03C7, 0xA371, 0x03C8, 0xA372, + 0x03C9, 0xA373, 0x2013, 0xA156, 0x2014, 0xA158, 0x2018, 0xA1A5, + 0x2019, 0xA1A6, 0x201C, 0xA1A7, 0x201D, 0xA1A8, 0x2025, 0xA14C, + 0x2026, 0xA14B, 0x2027, 0xA145, 0x2032, 0xA1AC, 0x2035, 0xA1AB, + 0x203B, 0xA1B0, 0x20AC, 0xA3E1, 0x2103, 0xA24A, 0x2105, 0xA1C1, + 0x2109, 0xA24B, 0x2160, 0xA2B9, 0x2161, 0xA2BA, 0x2162, 0xA2BB, + 0x2163, 0xA2BC, 0x2164, 0xA2BD, 0x2165, 0xA2BE, 0x2166, 0xA2BF, + 0x2167, 0xA2C0, 0x2168, 0xA2C1, 0x2169, 0xA2C2, 0x2190, 0xA1F6, + 0x2191, 0xA1F4, 0x2192, 0xA1F7, 0x2193, 0xA1F5, 0x2196, 0xA1F8, + 0x2197, 0xA1F9, 0x2198, 0xA1FB, 0x2199, 0xA1FA, 0x2215, 0xA241, + 0x221A, 0xA1D4, 0x221E, 0xA1DB, 0x221F, 0xA1E8, 0x2220, 0xA1E7, + 0x2223, 0xA1FD, 0x2225, 0xA1FC, 0x2229, 0xA1E4, 0x222A, 0xA1E5, + 0x222B, 0xA1EC, 0x222E, 0xA1ED, 0x2234, 0xA1EF, 0x2235, 0xA1EE, + 0x2252, 0xA1DC, 0x2260, 0xA1DA, 0x2261, 0xA1DD, 0x2266, 0xA1D8, + 0x2267, 0xA1D9, 0x2295, 0xA1F2, 0x2299, 0xA1F3, 0x22A5, 0xA1E6, + 0x22BF, 0xA1E9, 0x2500, 0xA277, 0x2502, 0xA278, 0x250C, 0xA27A, + 0x2510, 0xA27B, 0x2514, 0xA27C, 0x2518, 0xA27D, 0x251C, 0xA275, + 0x2524, 0xA274, 0x252C, 0xA273, 0x2534, 0xA272, 0x253C, 0xA271, + 0x2550, 0xA2A4, 0x2550, 0xF9F9, 0x2551, 0xF9F8, 0x2552, 0xF9E6, + 0x2553, 0xF9EF, 0x2554, 0xF9DD, 0x2555, 0xF9E8, 0x2556, 0xF9F1, + 0x2557, 0xF9DF, 0x2558, 0xF9EC, 0x2559, 0xF9F5, 0x255A, 0xF9E3, + 0x255B, 0xF9EE, 0x255C, 0xF9F7, 0x255D, 0xF9E5, 0x255E, 0xA2A5, + 0x255E, 0xF9E9, 0x255F, 0xF9F2, 0x2560, 0xF9E0, 0x2561, 0xA2A7, + 0x2561, 0xF9EB, 0x2562, 0xF9F4, 0x2563, 0xF9E2, 0x2564, 0xF9E7, + 0x2565, 0xF9F0, 0x2566, 0xF9DE, 0x2567, 0xF9ED, 0x2568, 0xF9F6, + 0x2569, 0xF9E4, 0x256A, 0xA2A6, 0x256A, 0xF9EA, 0x256B, 0xF9F3, + 0x256C, 0xF9E1, 0x256D, 0xA27E, 0x256D, 0xF9FA, 0x256E, 0xA2A1, + 0x256E, 0xF9FB, 0x256F, 0xA2A3, 0x256F, 0xF9FD, 0x2570, 0xA2A2, + 0x2570, 0xF9FC, 0x2571, 0xA2AC, 0x2572, 0xA2AD, 0x2573, 0xA2AE, + 0x2574, 0xA15A, 0x2581, 0xA262, 0x2582, 0xA263, 0x2583, 0xA264, + 0x2584, 0xA265, 0x2585, 0xA266, 0x2586, 0xA267, 0x2587, 0xA268, + 0x2588, 0xA269, 0x2589, 0xA270, 0x258A, 0xA26F, 0x258B, 0xA26E, + 0x258C, 0xA26D, 0x258D, 0xA26C, 0x258E, 0xA26B, 0x258F, 0xA26A, + 0x2593, 0xF9FE, 0x2594, 0xA276, 0x2595, 0xA279, 0x25A0, 0xA1BD, + 0x25A1, 0xA1BC, 0x25B2, 0xA1B6, 0x25B3, 0xA1B5, 0x25BC, 0xA1BF, + 0x25BD, 0xA1BE, 0x25C6, 0xA1BB, 0x25C7, 0xA1BA, 0x25CB, 0xA1B3, + 0x25CE, 0xA1B7, 0x25CF, 0xA1B4, 0x25E2, 0xA2A8, 0x25E3, 0xA2A9, + 0x25E4, 0xA2AB, 0x25E5, 0xA2AA, 0x2605, 0xA1B9, 0x2606, 0xA1B8, + 0x2640, 0xA1F0, 0x2642, 0xA1F1, 0x3000, 0xA140, 0x3001, 0xA142, + 0x3002, 0xA143, 0x3003, 0xA1B2, 0x3008, 0xA171, 0x3009, 0xA172, + 0x300A, 0xA16D, 0x300B, 0xA16E, 0x300C, 0xA175, 0x300D, 0xA176, + 0x300E, 0xA179, 0x300F, 0xA17A, 0x3010, 0xA169, 0x3011, 0xA16A, + 0x3012, 0xA245, 0x3014, 0xA165, 0x3015, 0xA166, 0x301D, 0xA1A9, + 0x301E, 0xA1AA, 0x3021, 0xA2C3, 0x3022, 0xA2C4, 0x3023, 0xA2C5, + 0x3024, 0xA2C6, 0x3025, 0xA2C7, 0x3026, 0xA2C8, 0x3027, 0xA2C9, + 0x3028, 0xA2CA, 0x3029, 0xA2CB, 0x3105, 0xA374, 0x3106, 0xA375, + 0x3107, 0xA376, 0x3108, 0xA377, 0x3109, 0xA378, 0x310A, 0xA379, + 0x310B, 0xA37A, 0x310C, 0xA37B, 0x310D, 0xA37C, 0x310E, 0xA37D, + 0x310F, 0xA37E, 0x3110, 0xA3A1, 0x3111, 0xA3A2, 0x3112, 0xA3A3, + 0x3113, 0xA3A4, 0x3114, 0xA3A5, 0x3115, 0xA3A6, 0x3116, 0xA3A7, + 0x3117, 0xA3A8, 0x3118, 0xA3A9, 0x3119, 0xA3AA, 0x311A, 0xA3AB, + 0x311B, 0xA3AC, 0x311C, 0xA3AD, 0x311D, 0xA3AE, 0x311E, 0xA3AF, + 0x311F, 0xA3B0, 0x3120, 0xA3B1, 0x3121, 0xA3B2, 0x3122, 0xA3B3, + 0x3123, 0xA3B4, 0x3124, 0xA3B5, 0x3125, 0xA3B6, 0x3126, 0xA3B7, + 0x3127, 0xA3B8, 0x3128, 0xA3B9, 0x3129, 0xA3BA, 0x32A3, 0xA1C0, + 0x338E, 0xA255, 0x338F, 0xA256, 0x339C, 0xA250, 0x339D, 0xA251, + 0x339E, 0xA252, 0x33A1, 0xA254, 0x33C4, 0xA257, 0x33CE, 0xA253, + 0x33D1, 0xA1EB, 0x33D2, 0xA1EA, 0x33D5, 0xA24F, 0x4E00, 0xA440, + 0x4E01, 0xA442, 0x4E03, 0xA443, 0x4E07, 0xC945, 0x4E08, 0xA456, + 0x4E09, 0xA454, 0x4E0A, 0xA457, 0x4E0B, 0xA455, 0x4E0C, 0xC946, + 0x4E0D, 0xA4A3, 0x4E0E, 0xC94F, 0x4E0F, 0xC94D, 0x4E10, 0xA4A2, + 0x4E11, 0xA4A1, 0x4E14, 0xA542, 0x4E15, 0xA541, 0x4E16, 0xA540, + 0x4E18, 0xA543, 0x4E19, 0xA4FE, 0x4E1E, 0xA5E0, 0x4E1F, 0xA5E1, + 0x4E26, 0xA8C3, 0x4E2B, 0xA458, 0x4E2D, 0xA4A4, 0x4E2E, 0xC950, + 0x4E30, 0xA4A5, 0x4E31, 0xC963, 0x4E32, 0xA6EA, 0x4E33, 0xCBB1, + 0x4E38, 0xA459, 0x4E39, 0xA4A6, 0x4E3B, 0xA544, 0x4E3C, 0xC964, + 0x4E42, 0xC940, 0x4E43, 0xA444, 0x4E45, 0xA45B, 0x4E47, 0xC947, + 0x4E48, 0xA45C, 0x4E4B, 0xA4A7, 0x4E4D, 0xA545, 0x4E4E, 0xA547, + 0x4E4F, 0xA546, 0x4E52, 0xA5E2, 0x4E53, 0xA5E3, 0x4E56, 0xA8C4, + 0x4E58, 0xADBC, 0x4E59, 0xA441, 0x4E5C, 0xC941, 0x4E5D, 0xA445, + 0x4E5E, 0xA45E, 0x4E5F, 0xA45D, 0x4E69, 0xA5E4, 0x4E73, 0xA8C5, + 0x4E7E, 0xB0AE, 0x4E7F, 0xD44B, 0x4E82, 0xB6C3, 0x4E83, 0xDCB1, + 0x4E84, 0xDCB2, 0x4E86, 0xA446, 0x4E88, 0xA4A9, 0x4E8B, 0xA8C6, + 0x4E8C, 0xA447, 0x4E8D, 0xC948, 0x4E8E, 0xA45F, 0x4E91, 0xA4AA, + 0x4E92, 0xA4AC, 0x4E93, 0xC951, 0x4E94, 0xA4AD, 0x4E95, 0xA4AB, + 0x4E99, 0xA5E5, 0x4E9B, 0xA8C7, 0x4E9E, 0xA8C8, 0x4E9F, 0xAB45, + 0x4EA1, 0xA460, 0x4EA2, 0xA4AE, 0x4EA4, 0xA5E6, 0x4EA5, 0xA5E8, + 0x4EA6, 0xA5E7, 0x4EA8, 0xA6EB, 0x4EAB, 0xA8C9, 0x4EAC, 0xA8CA, + 0x4EAD, 0xAB46, 0x4EAE, 0xAB47, 0x4EB3, 0xADBD, 0x4EB6, 0xDCB3, + 0x4EB9, 0xF6D6, 0x4EBA, 0xA448, 0x4EC0, 0xA4B0, 0x4EC1, 0xA4AF, + 0x4EC2, 0xC952, 0x4EC3, 0xA4B1, 0x4EC4, 0xA4B7, 0x4EC6, 0xA4B2, + 0x4EC7, 0xA4B3, 0x4EC8, 0xC954, 0x4EC9, 0xC953, 0x4ECA, 0xA4B5, + 0x4ECB, 0xA4B6, 0x4ECD, 0xA4B4, 0x4ED4, 0xA54A, 0x4ED5, 0xA54B, + 0x4ED6, 0xA54C, 0x4ED7, 0xA54D, 0x4ED8, 0xA549, 0x4ED9, 0xA550, + 0x4EDA, 0xC96A, 0x4EDC, 0xC966, 0x4EDD, 0xC969, 0x4EDE, 0xA551, + 0x4EDF, 0xA561, 0x4EE1, 0xC968, 0x4EE3, 0xA54E, 0x4EE4, 0xA54F, + 0x4EE5, 0xA548, 0x4EE8, 0xC965, 0x4EE9, 0xC967, 0x4EF0, 0xA5F5, + 0x4EF1, 0xC9B0, 0x4EF2, 0xA5F2, 0x4EF3, 0xA5F6, 0x4EF4, 0xC9BA, + 0x4EF5, 0xC9AE, 0x4EF6, 0xA5F3, 0x4EF7, 0xC9B2, 0x4EFB, 0xA5F4, + 0x4EFD, 0xA5F7, 0x4EFF, 0xA5E9, 0x4F00, 0xC9B1, 0x4F01, 0xA5F8, + 0x4F02, 0xC9B5, 0x4F04, 0xC9B9, 0x4F05, 0xC9B6, 0x4F08, 0xC9B3, + 0x4F09, 0xA5EA, 0x4F0A, 0xA5EC, 0x4F0B, 0xA5F9, 0x4F0D, 0xA5EE, + 0x4F0E, 0xC9AB, 0x4F0F, 0xA5F1, 0x4F10, 0xA5EF, 0x4F11, 0xA5F0, + 0x4F12, 0xC9BB, 0x4F13, 0xC9B8, 0x4F14, 0xC9AF, 0x4F15, 0xA5ED, + 0x4F18, 0xC9AC, 0x4F19, 0xA5EB, 0x4F1D, 0xC9B4, 0x4F22, 0xC9B7, + 0x4F2C, 0xC9AD, 0x4F2D, 0xCA66, 0x4F2F, 0xA742, 0x4F30, 0xA6F4, + 0x4F33, 0xCA67, 0x4F34, 0xA6F1, 0x4F36, 0xA744, 0x4F38, 0xA6F9, + 0x4F3A, 0xA6F8, 0x4F3B, 0xCA5B, 0x4F3C, 0xA6FC, 0x4F3D, 0xA6F7, + 0x4F3E, 0xCA60, 0x4F3F, 0xCA68, 0x4F41, 0xCA64, 0x4F43, 0xA6FA, + 0x4F46, 0xA6FD, 0x4F47, 0xA6EE, 0x4F48, 0xA747, 0x4F49, 0xCA5D, + 0x4F4C, 0xCBBD, 0x4F4D, 0xA6EC, 0x4F4E, 0xA743, 0x4F4F, 0xA6ED, + 0x4F50, 0xA6F5, 0x4F51, 0xA6F6, 0x4F52, 0xCA62, 0x4F53, 0xCA5E, + 0x4F54, 0xA6FB, 0x4F55, 0xA6F3, 0x4F56, 0xCA5A, 0x4F57, 0xA6EF, + 0x4F58, 0xCA65, 0x4F59, 0xA745, 0x4F5A, 0xA748, 0x4F5B, 0xA6F2, + 0x4F5C, 0xA740, 0x4F5D, 0xA746, 0x4F5E, 0xA6F0, 0x4F5F, 0xCA63, + 0x4F60, 0xA741, 0x4F61, 0xCA69, 0x4F62, 0xCA5C, 0x4F63, 0xA6FE, + 0x4F64, 0xCA5F, 0x4F67, 0xCA61, 0x4F69, 0xA8D8, 0x4F6A, 0xCBBF, + 0x4F6B, 0xCBCB, 0x4F6C, 0xA8D0, 0x4F6E, 0xCBCC, 0x4F6F, 0xA8CB, + 0x4F70, 0xA8D5, 0x4F73, 0xA8CE, 0x4F74, 0xCBB9, 0x4F75, 0xA8D6, + 0x4F76, 0xCBB8, 0x4F77, 0xCBBC, 0x4F78, 0xCBC3, 0x4F79, 0xCBC1, + 0x4F7A, 0xA8DE, 0x4F7B, 0xA8D9, 0x4F7C, 0xCBB3, 0x4F7D, 0xCBB5, + 0x4F7E, 0xA8DB, 0x4F7F, 0xA8CF, 0x4F80, 0xCBB6, 0x4F81, 0xCBC2, + 0x4F82, 0xCBC9, 0x4F83, 0xA8D4, 0x4F84, 0xCBBB, 0x4F85, 0xCBB4, + 0x4F86, 0xA8D3, 0x4F87, 0xCBB7, 0x4F88, 0xA8D7, 0x4F89, 0xCBBA, + 0x4F8B, 0xA8D2, 0x4F8D, 0xA8CD, 0x4F8F, 0xA8DC, 0x4F90, 0xCBC4, + 0x4F91, 0xA8DD, 0x4F92, 0xCBC8, 0x4F94, 0xCBC6, 0x4F95, 0xCBCA, + 0x4F96, 0xA8DA, 0x4F97, 0xCBBE, 0x4F98, 0xCBB2, 0x4F9A, 0xCBC0, + 0x4F9B, 0xA8D1, 0x4F9C, 0xCBC5, 0x4F9D, 0xA8CC, 0x4F9E, 0xCBC7, + 0x4FAE, 0xAB56, 0x4FAF, 0xAB4A, 0x4FB2, 0xCDE0, 0x4FB3, 0xCDE8, + 0x4FB5, 0xAB49, 0x4FB6, 0xAB51, 0x4FB7, 0xAB5D, 0x4FB9, 0xCDEE, + 0x4FBA, 0xCDEC, 0x4FBB, 0xCDE7, 0x4FBF, 0xAB4B, 0x4FC0, 0xCDED, + 0x4FC1, 0xCDE3, 0x4FC2, 0xAB59, 0x4FC3, 0xAB50, 0x4FC4, 0xAB58, + 0x4FC5, 0xCDDE, 0x4FC7, 0xCDEA, 0x4FC9, 0xCDE1, 0x4FCA, 0xAB54, + 0x4FCB, 0xCDE2, 0x4FCD, 0xCDDD, 0x4FCE, 0xAB5B, 0x4FCF, 0xAB4E, + 0x4FD0, 0xAB57, 0x4FD1, 0xAB4D, 0x4FD3, 0xCDDF, 0x4FD4, 0xCDE4, + 0x4FD6, 0xCDEB, 0x4FD7, 0xAB55, 0x4FD8, 0xAB52, 0x4FD9, 0xCDE6, + 0x4FDA, 0xAB5A, 0x4FDB, 0xCDE9, 0x4FDC, 0xCDE5, 0x4FDD, 0xAB4F, + 0x4FDE, 0xAB5C, 0x4FDF, 0xAB53, 0x4FE0, 0xAB4C, 0x4FE1, 0xAB48, + 0x4FEC, 0xCDEF, 0x4FEE, 0xADD7, 0x4FEF, 0xADC1, 0x4FF1, 0xADD1, + 0x4FF3, 0xADD6, 0x4FF4, 0xD0D0, 0x4FF5, 0xD0CF, 0x4FF6, 0xD0D4, + 0x4FF7, 0xD0D5, 0x4FF8, 0xADC4, 0x4FFA, 0xADCD, 0x4FFE, 0xADDA, + 0x5000, 0xADCE, 0x5005, 0xD0C9, 0x5006, 0xADC7, 0x5007, 0xD0CA, + 0x5009, 0xADDC, 0x500B, 0xADD3, 0x500C, 0xADBE, 0x500D, 0xADBF, + 0x500E, 0xD0DD, 0x500F, 0xB0BF, 0x5011, 0xADCC, 0x5012, 0xADCB, + 0x5013, 0xD0CB, 0x5014, 0xADCF, 0x5015, 0xD45B, 0x5016, 0xADC6, + 0x5017, 0xD0D6, 0x5018, 0xADD5, 0x5019, 0xADD4, 0x501A, 0xADCA, + 0x501B, 0xD0CE, 0x501C, 0xD0D7, 0x501E, 0xD0C8, 0x501F, 0xADC9, + 0x5020, 0xD0D8, 0x5021, 0xADD2, 0x5022, 0xD0CC, 0x5023, 0xADC0, + 0x5025, 0xADC3, 0x5026, 0xADC2, 0x5027, 0xD0D9, 0x5028, 0xADD0, + 0x5029, 0xADC5, 0x502A, 0xADD9, 0x502B, 0xADDB, 0x502C, 0xD0D3, + 0x502D, 0xADD8, 0x502F, 0xD0DB, 0x5030, 0xD0CD, 0x5031, 0xD0DC, + 0x5033, 0xD0D1, 0x5035, 0xD0DA, 0x5037, 0xD0D2, 0x503C, 0xADC8, + 0x5040, 0xD463, 0x5041, 0xD457, 0x5043, 0xB0B3, 0x5045, 0xD45C, + 0x5046, 0xD462, 0x5047, 0xB0B2, 0x5048, 0xD455, 0x5049, 0xB0B6, + 0x504A, 0xD459, 0x504B, 0xD452, 0x504C, 0xB0B4, 0x504D, 0xD456, + 0x504E, 0xB0B9, 0x504F, 0xB0BE, 0x5051, 0xD467, 0x5053, 0xD451, + 0x5055, 0xB0BA, 0x5057, 0xD466, 0x505A, 0xB0B5, 0x505B, 0xD458, + 0x505C, 0xB0B1, 0x505D, 0xD453, 0x505E, 0xD44F, 0x505F, 0xD45D, + 0x5060, 0xD450, 0x5061, 0xD44E, 0x5062, 0xD45A, 0x5063, 0xD460, + 0x5064, 0xD461, 0x5065, 0xB0B7, 0x5068, 0xD85B, 0x5069, 0xD45E, + 0x506A, 0xD44D, 0x506B, 0xD45F, 0x506D, 0xB0C1, 0x506E, 0xD464, + 0x506F, 0xB0C0, 0x5070, 0xD44C, 0x5072, 0xD454, 0x5073, 0xD465, + 0x5074, 0xB0BC, 0x5075, 0xB0BB, 0x5076, 0xB0B8, 0x5077, 0xB0BD, + 0x507A, 0xB0AF, 0x507D, 0xB0B0, 0x5080, 0xB3C8, 0x5082, 0xD85E, + 0x5083, 0xD857, 0x5085, 0xB3C5, 0x5087, 0xD85F, 0x508B, 0xD855, + 0x508C, 0xD858, 0x508D, 0xB3C4, 0x508E, 0xD859, 0x5091, 0xB3C7, + 0x5092, 0xD85D, 0x5094, 0xD853, 0x5095, 0xD852, 0x5096, 0xB3C9, + 0x5098, 0xB3CA, 0x5099, 0xB3C6, 0x509A, 0xB3CB, 0x509B, 0xD851, + 0x509C, 0xD85C, 0x509D, 0xD85A, 0x509E, 0xD854, 0x50A2, 0xB3C3, + 0x50A3, 0xD856, 0x50AC, 0xB6CA, 0x50AD, 0xB6C4, 0x50AE, 0xDCB7, + 0x50AF, 0xB6CD, 0x50B0, 0xDCBD, 0x50B1, 0xDCC0, 0x50B2, 0xB6C6, + 0x50B3, 0xB6C7, 0x50B4, 0xDCBA, 0x50B5, 0xB6C5, 0x50B6, 0xDCC3, + 0x50B7, 0xB6CB, 0x50B8, 0xDCC4, 0x50BA, 0xDCBF, 0x50BB, 0xB6CC, + 0x50BD, 0xDCB4, 0x50BE, 0xB6C9, 0x50BF, 0xDCB5, 0x50C1, 0xDCBE, + 0x50C2, 0xDCBC, 0x50C4, 0xDCB8, 0x50C5, 0xB6C8, 0x50C6, 0xDCB6, + 0x50C7, 0xB6CE, 0x50C8, 0xDCBB, 0x50C9, 0xDCC2, 0x50CA, 0xDCB9, + 0x50CB, 0xDCC1, 0x50CE, 0xB9B6, 0x50CF, 0xB9B3, 0x50D1, 0xB9B4, + 0x50D3, 0xE0F9, 0x50D4, 0xE0F1, 0x50D5, 0xB9B2, 0x50D6, 0xB9AF, + 0x50D7, 0xE0F2, 0x50DA, 0xB9B1, 0x50DB, 0xE0F5, 0x50DD, 0xE0F7, + 0x50E0, 0xE0FE, 0x50E3, 0xE0FD, 0x50E4, 0xE0F8, 0x50E5, 0xB9AE, + 0x50E6, 0xE0F0, 0x50E7, 0xB9AC, 0x50E8, 0xE0F3, 0x50E9, 0xB9B7, + 0x50EA, 0xE0F6, 0x50EC, 0xE0FA, 0x50ED, 0xB9B0, 0x50EE, 0xB9AD, + 0x50EF, 0xE0FC, 0x50F0, 0xE0FB, 0x50F1, 0xB9B5, 0x50F3, 0xE0F4, + 0x50F5, 0xBBF8, 0x50F6, 0xE4EC, 0x50F8, 0xE4E9, 0x50F9, 0xBBF9, + 0x50FB, 0xBBF7, 0x50FD, 0xE4F0, 0x50FE, 0xE4ED, 0x50FF, 0xE4E6, + 0x5100, 0xBBF6, 0x5102, 0xBBFA, 0x5103, 0xE4E7, 0x5104, 0xBBF5, + 0x5105, 0xBBFD, 0x5106, 0xE4EA, 0x5107, 0xE4EB, 0x5108, 0xBBFB, + 0x5109, 0xBBFC, 0x510A, 0xE4F1, 0x510B, 0xE4EE, 0x510C, 0xE4EF, + 0x5110, 0xBEAA, 0x5111, 0xE8F8, 0x5112, 0xBEA7, 0x5113, 0xE8F5, + 0x5114, 0xBEA9, 0x5115, 0xBEAB, 0x5117, 0xE8F6, 0x5118, 0xBEA8, + 0x511A, 0xE8F7, 0x511C, 0xE8F4, 0x511F, 0xC076, 0x5120, 0xECBD, + 0x5121, 0xC077, 0x5122, 0xECBB, 0x5124, 0xECBC, 0x5125, 0xECBA, + 0x5126, 0xECB9, 0x5129, 0xECBE, 0x512A, 0xC075, 0x512D, 0xEFB8, + 0x512E, 0xEFB9, 0x5130, 0xE4E8, 0x5131, 0xEFB7, 0x5132, 0xC078, + 0x5133, 0xC35F, 0x5134, 0xF1EB, 0x5135, 0xF1EC, 0x5137, 0xC4D7, + 0x5138, 0xC4D8, 0x5139, 0xF5C1, 0x513A, 0xF5C0, 0x513B, 0xC56C, + 0x513C, 0xC56B, 0x513D, 0xF7D0, 0x513F, 0xA449, 0x5140, 0xA461, + 0x5141, 0xA4B9, 0x5143, 0xA4B8, 0x5144, 0xA553, 0x5145, 0xA552, + 0x5146, 0xA5FC, 0x5147, 0xA5FB, 0x5148, 0xA5FD, 0x5149, 0xA5FA, + 0x514B, 0xA74A, 0x514C, 0xA749, 0x514D, 0xA74B, 0x5152, 0xA8E0, + 0x5154, 0xA8DF, 0x5155, 0xA8E1, 0x5157, 0xAB5E, 0x5159, 0xA259, + 0x515A, 0xD0DE, 0x515B, 0xA25A, 0x515C, 0xB0C2, 0x515D, 0xA25C, + 0x515E, 0xA25B, 0x515F, 0xD860, 0x5161, 0xA25D, 0x5162, 0xB9B8, + 0x5163, 0xA25E, 0x5165, 0xA44A, 0x5167, 0xA4BA, 0x5168, 0xA5FE, + 0x5169, 0xA8E2, 0x516B, 0xA44B, 0x516C, 0xA4BD, 0x516D, 0xA4BB, + 0x516E, 0xA4BC, 0x5171, 0xA640, 0x5175, 0xA74C, 0x5176, 0xA8E4, + 0x5177, 0xA8E3, 0x5178, 0xA8E5, 0x517C, 0xADDD, 0x5180, 0xBEAC, + 0x5187, 0xC94E, 0x5189, 0xA554, 0x518A, 0xA555, 0x518D, 0xA641, + 0x518F, 0xCA6A, 0x5191, 0xAB60, 0x5192, 0xAB5F, 0x5193, 0xD0E0, + 0x5194, 0xD0DF, 0x5195, 0xB0C3, 0x5197, 0xA4BE, 0x5198, 0xC955, + 0x519E, 0xCBCD, 0x51A0, 0xAB61, 0x51A2, 0xADE0, 0x51A4, 0xADDE, + 0x51A5, 0xADDF, 0x51AA, 0xBEAD, 0x51AC, 0xA556, 0x51B0, 0xA642, + 0x51B1, 0xC9BC, 0x51B6, 0xA74D, 0x51B7, 0xA74E, 0x51B9, 0xCA6B, + 0x51BC, 0xCBCE, 0x51BD, 0xA8E6, 0x51BE, 0xCBCF, 0x51C4, 0xD0E2, + 0x51C5, 0xD0E3, 0x51C6, 0xADE3, 0x51C8, 0xD0E4, 0x51CA, 0xD0E1, + 0x51CB, 0xADE4, 0x51CC, 0xADE2, 0x51CD, 0xADE1, 0x51CE, 0xD0E5, + 0x51D0, 0xD468, 0x51D4, 0xD861, 0x51D7, 0xDCC5, 0x51D8, 0xE140, + 0x51DC, 0xBBFE, 0x51DD, 0xBEAE, 0x51DE, 0xE8F9, 0x51E0, 0xA44C, + 0x51E1, 0xA45A, 0x51F0, 0xB0C4, 0x51F1, 0xB3CD, 0x51F3, 0xB9B9, + 0x51F5, 0xC942, 0x51F6, 0xA4BF, 0x51F8, 0xA559, 0x51F9, 0xA557, + 0x51FA, 0xA558, 0x51FD, 0xA8E7, 0x5200, 0xA44D, 0x5201, 0xA44E, + 0x5203, 0xA462, 0x5206, 0xA4C0, 0x5207, 0xA4C1, 0x5208, 0xA4C2, + 0x5209, 0xC9BE, 0x520A, 0xA55A, 0x520C, 0xC96B, 0x520E, 0xA646, + 0x5210, 0xC9BF, 0x5211, 0xA644, 0x5212, 0xA645, 0x5213, 0xC9BD, + 0x5216, 0xA647, 0x5217, 0xA643, 0x521C, 0xCA6C, 0x521D, 0xAAEC, + 0x521E, 0xCA6D, 0x5221, 0xCA6E, 0x5224, 0xA750, 0x5225, 0xA74F, + 0x5228, 0xA753, 0x5229, 0xA751, 0x522A, 0xA752, 0x522E, 0xA8ED, + 0x5230, 0xA8EC, 0x5231, 0xCBD4, 0x5232, 0xCBD1, 0x5233, 0xCBD2, + 0x5235, 0xCBD0, 0x5236, 0xA8EE, 0x5237, 0xA8EA, 0x5238, 0xA8E9, + 0x523A, 0xA8EB, 0x523B, 0xA8E8, 0x5241, 0xA8EF, 0x5243, 0xAB63, + 0x5244, 0xCDF0, 0x5246, 0xCBD3, 0x5247, 0xAB68, 0x5249, 0xCDF1, + 0x524A, 0xAB64, 0x524B, 0xAB67, 0x524C, 0xAB66, 0x524D, 0xAB65, + 0x524E, 0xAB62, 0x5252, 0xD0E8, 0x5254, 0xADE7, 0x5255, 0xD0EB, + 0x5256, 0xADE5, 0x525A, 0xD0E7, 0x525B, 0xADE8, 0x525C, 0xADE6, + 0x525D, 0xADE9, 0x525E, 0xD0E9, 0x525F, 0xD0EA, 0x5261, 0xD0E6, + 0x5262, 0xD0EC, 0x5269, 0xB3D1, 0x526A, 0xB0C5, 0x526B, 0xD469, + 0x526C, 0xD46B, 0x526D, 0xD46A, 0x526E, 0xD46C, 0x526F, 0xB0C6, + 0x5272, 0xB3CE, 0x5274, 0xB3CF, 0x5275, 0xB3D0, 0x5277, 0xB6D0, + 0x5278, 0xDCC7, 0x527A, 0xDCC6, 0x527B, 0xDCC8, 0x527C, 0xDCC9, + 0x527D, 0xB6D1, 0x527F, 0xB6CF, 0x5280, 0xE141, 0x5281, 0xE142, + 0x5282, 0xB9BB, 0x5283, 0xB9BA, 0x5284, 0xE35A, 0x5287, 0xBC40, + 0x5288, 0xBC41, 0x5289, 0xBC42, 0x528A, 0xBC44, 0x528B, 0xE4F2, + 0x528C, 0xE4F3, 0x528D, 0xBC43, 0x5291, 0xBEAF, 0x5293, 0xBEB0, + 0x5296, 0xF1ED, 0x5297, 0xF5C3, 0x5298, 0xF5C2, 0x5299, 0xF7D1, + 0x529B, 0xA44F, 0x529F, 0xA55C, 0x52A0, 0xA55B, 0x52A3, 0xA648, + 0x52A6, 0xC9C0, 0x52A9, 0xA755, 0x52AA, 0xA756, 0x52AB, 0xA754, + 0x52AC, 0xA757, 0x52AD, 0xCA6F, 0x52AE, 0xCA70, 0x52BB, 0xA8F1, + 0x52BC, 0xCBD5, 0x52BE, 0xA8F0, 0x52C0, 0xCDF2, 0x52C1, 0xAB6C, + 0x52C2, 0xCDF3, 0x52C3, 0xAB6B, 0x52C7, 0xAB69, 0x52C9, 0xAB6A, + 0x52CD, 0xD0ED, 0x52D2, 0xB0C7, 0x52D3, 0xD46E, 0x52D5, 0xB0CA, + 0x52D6, 0xD46D, 0x52D7, 0xB1E5, 0x52D8, 0xB0C9, 0x52D9, 0xB0C8, + 0x52DB, 0xB3D4, 0x52DD, 0xB3D3, 0x52DE, 0xB3D2, 0x52DF, 0xB6D2, + 0x52E2, 0xB6D5, 0x52E3, 0xB6D6, 0x52E4, 0xB6D4, 0x52E6, 0xB6D3, + 0x52E9, 0xE143, 0x52EB, 0xE144, 0x52EF, 0xE4F5, 0x52F0, 0xBC45, + 0x52F1, 0xE4F4, 0x52F3, 0xBEB1, 0x52F4, 0xECBF, 0x52F5, 0xC079, + 0x52F7, 0xF1EE, 0x52F8, 0xC455, 0x52FA, 0xA463, 0x52FB, 0xA4C3, + 0x52FC, 0xC956, 0x52FE, 0xA4C4, 0x52FF, 0xA4C5, 0x5305, 0xA55D, + 0x5306, 0xA55E, 0x5308, 0xA649, 0x5309, 0xCA71, 0x530A, 0xCBD6, + 0x530B, 0xCBD7, 0x530D, 0xAB6D, 0x530E, 0xD0EE, 0x530F, 0xB0CC, + 0x5310, 0xB0CB, 0x5311, 0xD863, 0x5312, 0xD862, 0x5315, 0xA450, + 0x5316, 0xA4C6, 0x5317, 0xA55F, 0x5319, 0xB0CD, 0x531A, 0xC943, + 0x531C, 0xC96C, 0x531D, 0xA560, 0x531F, 0xC9C2, 0x5320, 0xA64B, + 0x5321, 0xA64A, 0x5322, 0xC9C1, 0x5323, 0xA758, 0x532A, 0xADEA, + 0x532D, 0xD46F, 0x532F, 0xB6D7, 0x5330, 0xE145, 0x5331, 0xB9BC, + 0x5334, 0xE8FA, 0x5337, 0xF3FD, 0x5339, 0xA4C7, 0x533C, 0xCBD8, + 0x533D, 0xCDF4, 0x533E, 0xB0D0, 0x533F, 0xB0CE, 0x5340, 0xB0CF, + 0x5341, 0xA2CC, 0x5341, 0xA451, 0x5343, 0xA464, 0x5344, 0xA2CD, + 0x5345, 0xA2CE, 0x5345, 0xA4CA, 0x5347, 0xA4C9, 0x5348, 0xA4C8, + 0x5349, 0xA563, 0x534A, 0xA562, 0x534C, 0xC96D, 0x534D, 0xC9C3, + 0x5351, 0xA8F5, 0x5352, 0xA8F2, 0x5353, 0xA8F4, 0x5354, 0xA8F3, + 0x5357, 0xAB6E, 0x535A, 0xB3D5, 0x535C, 0xA452, 0x535E, 0xA4CB, + 0x5360, 0xA565, 0x5361, 0xA564, 0x5363, 0xCA72, 0x5366, 0xA8F6, + 0x536C, 0xC957, 0x536E, 0xA567, 0x536F, 0xA566, 0x5370, 0xA64C, + 0x5371, 0xA64D, 0x5372, 0xCA73, 0x5373, 0xA759, 0x5375, 0xA75A, + 0x5377, 0xA8F7, 0x5378, 0xA8F8, 0x5379, 0xA8F9, 0x537B, 0xAB6F, + 0x537C, 0xCDF5, 0x537F, 0xADEB, 0x5382, 0xC944, 0x5384, 0xA4CC, + 0x538A, 0xC9C4, 0x538E, 0xCA74, 0x538F, 0xCA75, 0x5392, 0xCBD9, + 0x5394, 0xCBDA, 0x5396, 0xCDF7, 0x5397, 0xCDF6, 0x5398, 0xCDF9, + 0x5399, 0xCDF8, 0x539A, 0xAB70, 0x539C, 0xD470, 0x539D, 0xADED, + 0x539E, 0xD0EF, 0x539F, 0xADEC, 0x53A4, 0xD864, 0x53A5, 0xB3D6, + 0x53A7, 0xD865, 0x53AC, 0xE146, 0x53AD, 0xB9BD, 0x53B2, 0xBC46, + 0x53B4, 0xF1EF, 0x53B9, 0xC958, 0x53BB, 0xA568, 0x53C3, 0xB0D1, + 0x53C8, 0xA453, 0x53C9, 0xA465, 0x53CA, 0xA4CE, 0x53CB, 0xA4CD, + 0x53CD, 0xA4CF, 0x53D4, 0xA8FB, 0x53D6, 0xA8FA, 0x53D7, 0xA8FC, + 0x53DB, 0xAB71, 0x53DF, 0xADEE, 0x53E1, 0xE8FB, 0x53E2, 0xC24F, + 0x53E3, 0xA466, 0x53E4, 0xA56A, 0x53E5, 0xA579, 0x53E6, 0xA574, + 0x53E8, 0xA56F, 0x53E9, 0xA56E, 0x53EA, 0xA575, 0x53EB, 0xA573, + 0x53EC, 0xA56C, 0x53ED, 0xA57A, 0x53EE, 0xA56D, 0x53EF, 0xA569, + 0x53F0, 0xA578, 0x53F1, 0xA577, 0x53F2, 0xA576, 0x53F3, 0xA56B, + 0x53F5, 0xA572, 0x53F8, 0xA571, 0x53FB, 0xA57B, 0x53FC, 0xA570, + 0x5401, 0xA653, 0x5403, 0xA659, 0x5404, 0xA655, 0x5406, 0xA65B, + 0x5407, 0xC9C5, 0x5408, 0xA658, 0x5409, 0xA64E, 0x540A, 0xA651, + 0x540B, 0xA654, 0x540C, 0xA650, 0x540D, 0xA657, 0x540E, 0xA65A, + 0x540F, 0xA64F, 0x5410, 0xA652, 0x5411, 0xA656, 0x5412, 0xA65C, + 0x5418, 0xCA7E, 0x5419, 0xCA7B, 0x541B, 0xA767, 0x541C, 0xCA7C, + 0x541D, 0xA75B, 0x541E, 0xA75D, 0x541F, 0xA775, 0x5420, 0xA770, + 0x5424, 0xCAA5, 0x5425, 0xCA7D, 0x5426, 0xA75F, 0x5427, 0xA761, + 0x5428, 0xCAA4, 0x5429, 0xA768, 0x542A, 0xCA78, 0x542B, 0xA774, + 0x542C, 0xA776, 0x542D, 0xA75C, 0x542E, 0xA76D, 0x5430, 0xCA76, + 0x5431, 0xA773, 0x5433, 0xA764, 0x5435, 0xA76E, 0x5436, 0xA76F, + 0x5437, 0xCA77, 0x5438, 0xA76C, 0x5439, 0xA76A, 0x543B, 0xA76B, + 0x543C, 0xA771, 0x543D, 0xCAA1, 0x543E, 0xA75E, 0x5440, 0xA772, + 0x5441, 0xCAA3, 0x5442, 0xA766, 0x5443, 0xA763, 0x5445, 0xCA7A, + 0x5446, 0xA762, 0x5447, 0xCAA6, 0x5448, 0xA765, 0x544A, 0xA769, + 0x544E, 0xA760, 0x544F, 0xCAA2, 0x5454, 0xCA79, 0x5460, 0xCBEB, + 0x5461, 0xCBEA, 0x5462, 0xA94F, 0x5463, 0xCBED, 0x5464, 0xCBEF, + 0x5465, 0xCBE4, 0x5466, 0xCBE7, 0x5467, 0xCBEE, 0x5468, 0xA950, + 0x546B, 0xCBE1, 0x546C, 0xCBE5, 0x546F, 0xCBE9, 0x5470, 0xCE49, + 0x5471, 0xA94B, 0x5472, 0xCE4D, 0x5473, 0xA8FD, 0x5474, 0xCBE6, + 0x5475, 0xA8FE, 0x5476, 0xA94C, 0x5477, 0xA945, 0x5478, 0xA941, + 0x547A, 0xCBE2, 0x547B, 0xA944, 0x547C, 0xA949, 0x547D, 0xA952, + 0x547E, 0xCBE3, 0x547F, 0xCBDC, 0x5480, 0xA943, 0x5481, 0xCBDD, + 0x5482, 0xCBDF, 0x5484, 0xA946, 0x5486, 0xA948, 0x5487, 0xCBDB, + 0x5488, 0xCBE0, 0x548B, 0xA951, 0x548C, 0xA94D, 0x548D, 0xCBE8, + 0x548E, 0xA953, 0x5490, 0xA94A, 0x5491, 0xCBDE, 0x5492, 0xA947, + 0x5495, 0xA942, 0x5496, 0xA940, 0x5498, 0xCBEC, 0x549A, 0xA94E, + 0x54A0, 0xCE48, 0x54A1, 0xCDFB, 0x54A2, 0xCE4B, 0x54A5, 0xCDFD, + 0x54A6, 0xAB78, 0x54A7, 0xABA8, 0x54A8, 0xAB74, 0x54A9, 0xABA7, + 0x54AA, 0xAB7D, 0x54AB, 0xABA4, 0x54AC, 0xAB72, 0x54AD, 0xCDFC, + 0x54AE, 0xCE43, 0x54AF, 0xABA3, 0x54B0, 0xCE4F, 0x54B1, 0xABA5, + 0x54B3, 0xAB79, 0x54B6, 0xCE45, 0x54B7, 0xCE42, 0x54B8, 0xAB77, + 0x54BA, 0xCDFA, 0x54BB, 0xABA6, 0x54BC, 0xCE4A, 0x54BD, 0xAB7C, + 0x54BE, 0xCE4C, 0x54BF, 0xABA9, 0x54C0, 0xAB73, 0x54C1, 0xAB7E, + 0x54C2, 0xAB7B, 0x54C3, 0xCE40, 0x54C4, 0xABA1, 0x54C5, 0xCE46, + 0x54C6, 0xCE47, 0x54C7, 0xAB7A, 0x54C8, 0xABA2, 0x54C9, 0xAB76, + 0x54CE, 0xAB75, 0x54CF, 0xCDFE, 0x54D6, 0xCE44, 0x54DE, 0xCE4E, + 0x54E0, 0xD144, 0x54E1, 0xADFB, 0x54E2, 0xD0F1, 0x54E4, 0xD0F6, + 0x54E5, 0xADF4, 0x54E6, 0xAE40, 0x54E7, 0xD0F4, 0x54E8, 0xADEF, + 0x54E9, 0xADF9, 0x54EA, 0xADFE, 0x54EB, 0xD0FB, 0x54ED, 0xADFA, + 0x54EE, 0xADFD, 0x54F1, 0xD0FE, 0x54F2, 0xADF5, 0x54F3, 0xD0F5, + 0x54F7, 0xD142, 0x54F8, 0xD143, 0x54FA, 0xADF7, 0x54FB, 0xD141, + 0x54FC, 0xADF3, 0x54FD, 0xAE43, 0x54FF, 0xD0F8, 0x5501, 0xADF1, + 0x5503, 0xD146, 0x5504, 0xD0F9, 0x5505, 0xD0FD, 0x5506, 0xADF6, + 0x5507, 0xAE42, 0x5508, 0xD0FA, 0x5509, 0xADFC, 0x550A, 0xD140, + 0x550B, 0xD147, 0x550C, 0xD4A1, 0x550E, 0xD145, 0x550F, 0xAE44, + 0x5510, 0xADF0, 0x5511, 0xD0FC, 0x5512, 0xD0F3, 0x5514, 0xADF8, + 0x5517, 0xD0F2, 0x551A, 0xD0F7, 0x5526, 0xD0F0, 0x5527, 0xAE41, + 0x552A, 0xD477, 0x552C, 0xB0E4, 0x552D, 0xD4A7, 0x552E, 0xB0E2, + 0x552F, 0xB0DF, 0x5530, 0xD47C, 0x5531, 0xB0DB, 0x5532, 0xD4A2, + 0x5533, 0xB0E6, 0x5534, 0xD476, 0x5535, 0xD47B, 0x5536, 0xD47A, + 0x5537, 0xADF2, 0x5538, 0xB0E1, 0x5539, 0xD4A5, 0x553B, 0xD4A8, + 0x553C, 0xD473, 0x553E, 0xB3E8, 0x5540, 0xD4A9, 0x5541, 0xB0E7, + 0x5543, 0xB0D9, 0x5544, 0xB0D6, 0x5545, 0xD47E, 0x5546, 0xB0D3, + 0x5548, 0xD4A6, 0x554A, 0xB0DA, 0x554B, 0xD4AA, 0x554D, 0xD474, + 0x554E, 0xD4A4, 0x554F, 0xB0DD, 0x5550, 0xD475, 0x5551, 0xD478, + 0x5552, 0xD47D, 0x5555, 0xB0DE, 0x5556, 0xB0DC, 0x5557, 0xB0E8, + 0x555C, 0xB0E3, 0x555E, 0xB0D7, 0x555F, 0xB1D2, 0x5561, 0xB0D8, + 0x5562, 0xD479, 0x5563, 0xB0E5, 0x5564, 0xB0E0, 0x5565, 0xD4A3, + 0x5566, 0xB0D5, 0x556A, 0xB0D4, 0x5575, 0xD471, 0x5576, 0xD472, + 0x5577, 0xD86A, 0x557B, 0xB3D7, 0x557C, 0xB3DA, 0x557D, 0xD875, + 0x557E, 0xB3EE, 0x557F, 0xD878, 0x5580, 0xB3D8, 0x5581, 0xD871, + 0x5582, 0xB3DE, 0x5583, 0xB3E4, 0x5584, 0xB5BD, 0x5587, 0xB3E2, + 0x5588, 0xD86E, 0x5589, 0xB3EF, 0x558A, 0xB3DB, 0x558B, 0xB3E3, + 0x558C, 0xD876, 0x558D, 0xDCD7, 0x558E, 0xD87B, 0x558F, 0xD86F, + 0x5591, 0xD866, 0x5592, 0xD873, 0x5593, 0xD86D, 0x5594, 0xB3E1, + 0x5595, 0xD879, 0x5598, 0xB3DD, 0x5599, 0xB3F1, 0x559A, 0xB3EA, + 0x559C, 0xB3DF, 0x559D, 0xB3DC, 0x559F, 0xB3E7, 0x55A1, 0xD87A, + 0x55A2, 0xD86C, 0x55A3, 0xD872, 0x55A4, 0xD874, 0x55A5, 0xD868, + 0x55A6, 0xD877, 0x55A7, 0xB3D9, 0x55A8, 0xD867, 0x55AA, 0xB3E0, + 0x55AB, 0xB3F0, 0x55AC, 0xB3EC, 0x55AD, 0xD869, 0x55AE, 0xB3E6, + 0x55B1, 0xB3ED, 0x55B2, 0xB3E9, 0x55B3, 0xB3E5, 0x55B5, 0xD870, + 0x55BB, 0xB3EB, 0x55BF, 0xDCD5, 0x55C0, 0xDCD1, 0x55C2, 0xDCE0, + 0x55C3, 0xDCCA, 0x55C4, 0xDCD3, 0x55C5, 0xB6E5, 0x55C6, 0xB6E6, + 0x55C7, 0xB6DE, 0x55C8, 0xDCDC, 0x55C9, 0xB6E8, 0x55CA, 0xDCCF, + 0x55CB, 0xDCCE, 0x55CC, 0xDCCC, 0x55CD, 0xDCDE, 0x55CE, 0xB6DC, + 0x55CF, 0xDCD8, 0x55D0, 0xDCCD, 0x55D1, 0xB6DF, 0x55D2, 0xDCD6, + 0x55D3, 0xB6DA, 0x55D4, 0xDCD2, 0x55D5, 0xDCD9, 0x55D6, 0xDCDB, + 0x55D9, 0xDCDF, 0x55DA, 0xB6E3, 0x55DB, 0xDCCB, 0x55DC, 0xB6DD, + 0x55DD, 0xDCD0, 0x55DF, 0xB6D8, 0x55E1, 0xB6E4, 0x55E2, 0xDCDA, + 0x55E3, 0xB6E0, 0x55E4, 0xB6E1, 0x55E5, 0xB6E7, 0x55E6, 0xB6DB, + 0x55E7, 0xA25F, 0x55E8, 0xB6D9, 0x55E9, 0xDCD4, 0x55EF, 0xB6E2, + 0x55F2, 0xDCDD, 0x55F6, 0xB9CD, 0x55F7, 0xB9C8, 0x55F9, 0xE155, + 0x55FA, 0xE151, 0x55FC, 0xE14B, 0x55FD, 0xB9C2, 0x55FE, 0xB9BE, + 0x55FF, 0xE154, 0x5600, 0xB9BF, 0x5601, 0xE14E, 0x5602, 0xE150, + 0x5604, 0xE153, 0x5606, 0xB9C4, 0x5608, 0xB9CB, 0x5609, 0xB9C5, + 0x560C, 0xE149, 0x560D, 0xB9C6, 0x560E, 0xB9C7, 0x560F, 0xE14C, + 0x5610, 0xB9CC, 0x5612, 0xE14A, 0x5613, 0xE14F, 0x5614, 0xB9C3, + 0x5615, 0xE148, 0x5616, 0xB9C9, 0x5617, 0xB9C1, 0x561B, 0xB9C0, + 0x561C, 0xE14D, 0x561D, 0xE152, 0x561F, 0xB9CA, 0x5627, 0xE147, + 0x5629, 0xBC4D, 0x562A, 0xE547, 0x562C, 0xE544, 0x562E, 0xBC47, + 0x562F, 0xBC53, 0x5630, 0xBC54, 0x5632, 0xBC4A, 0x5633, 0xE542, + 0x5634, 0xBC4C, 0x5635, 0xE4F9, 0x5636, 0xBC52, 0x5638, 0xE546, + 0x5639, 0xBC49, 0x563A, 0xE548, 0x563B, 0xBC48, 0x563D, 0xE543, + 0x563E, 0xE545, 0x563F, 0xBC4B, 0x5640, 0xE541, 0x5641, 0xE4FA, + 0x5642, 0xE4F7, 0x5645, 0xD86B, 0x5646, 0xE4FD, 0x5648, 0xE4F6, + 0x5649, 0xE4FC, 0x564A, 0xE4FB, 0x564C, 0xE4F8, 0x564E, 0xBC4F, + 0x5653, 0xBC4E, 0x5657, 0xBC50, 0x5658, 0xE4FE, 0x5659, 0xBEB2, + 0x565A, 0xE540, 0x565E, 0xE945, 0x5660, 0xE8FD, 0x5662, 0xBEBE, + 0x5663, 0xE942, 0x5664, 0xBEB6, 0x5665, 0xBEBA, 0x5666, 0xE941, + 0x5668, 0xBEB9, 0x5669, 0xBEB5, 0x566A, 0xBEB8, 0x566B, 0xBEB3, + 0x566C, 0xBEBD, 0x566D, 0xE943, 0x566E, 0xE8FE, 0x566F, 0xBEBC, + 0x5670, 0xE8FC, 0x5671, 0xBEBB, 0x5672, 0xE944, 0x5673, 0xE940, + 0x5674, 0xBC51, 0x5676, 0xBEBF, 0x5677, 0xE946, 0x5678, 0xBEB7, + 0x5679, 0xBEB4, 0x567E, 0xECC6, 0x567F, 0xECC8, 0x5680, 0xC07B, + 0x5681, 0xECC9, 0x5682, 0xECC7, 0x5683, 0xECC5, 0x5684, 0xECC4, + 0x5685, 0xC07D, 0x5686, 0xECC3, 0x5687, 0xC07E, 0x568C, 0xECC1, + 0x568D, 0xECC2, 0x568E, 0xC07A, 0x568F, 0xC0A1, 0x5690, 0xC07C, + 0x5693, 0xECC0, 0x5695, 0xC250, 0x5697, 0xEFBC, 0x5698, 0xEFBA, + 0x5699, 0xEFBF, 0x569A, 0xEFBD, 0x569C, 0xEFBB, 0x569D, 0xEFBE, + 0x56A5, 0xC360, 0x56A6, 0xF1F2, 0x56A7, 0xF1F3, 0x56A8, 0xC456, + 0x56AA, 0xF1F4, 0x56AB, 0xF1F0, 0x56AC, 0xF1F5, 0x56AD, 0xF1F1, + 0x56AE, 0xC251, 0x56B2, 0xF3FE, 0x56B3, 0xF441, 0x56B4, 0xC459, + 0x56B5, 0xF440, 0x56B6, 0xC458, 0x56B7, 0xC457, 0x56BC, 0xC45A, + 0x56BD, 0xF5C5, 0x56BE, 0xF5C6, 0x56C0, 0xC4DA, 0x56C1, 0xC4D9, + 0x56C2, 0xC4DB, 0x56C3, 0xF5C4, 0x56C5, 0xF6D8, 0x56C6, 0xF6D7, + 0x56C8, 0xC56D, 0x56C9, 0xC56F, 0x56CA, 0xC56E, 0x56CB, 0xF6D9, + 0x56CC, 0xC5C8, 0x56CD, 0xF8A6, 0x56D1, 0xC5F1, 0x56D3, 0xF8A5, + 0x56D4, 0xF8EE, 0x56D7, 0xC949, 0x56DA, 0xA57D, 0x56DB, 0xA57C, + 0x56DD, 0xA65F, 0x56DE, 0xA65E, 0x56DF, 0xC9C7, 0x56E0, 0xA65D, + 0x56E1, 0xC9C6, 0x56E4, 0xA779, 0x56E5, 0xCAA9, 0x56E7, 0xCAA8, + 0x56EA, 0xA777, 0x56EB, 0xA77A, 0x56EE, 0xCAA7, 0x56F0, 0xA778, + 0x56F7, 0xCBF0, 0x56F9, 0xCBF1, 0x56FA, 0xA954, 0x56FF, 0xABAA, + 0x5701, 0xD148, 0x5702, 0xD149, 0x5703, 0xAE45, 0x5704, 0xAE46, + 0x5707, 0xD4AC, 0x5708, 0xB0E9, 0x5709, 0xB0EB, 0x570A, 0xD4AB, + 0x570B, 0xB0EA, 0x570C, 0xD87C, 0x570D, 0xB3F2, 0x5712, 0xB6E9, + 0x5713, 0xB6EA, 0x5714, 0xDCE1, 0x5716, 0xB9CF, 0x5718, 0xB9CE, + 0x571A, 0xE549, 0x571B, 0xE948, 0x571C, 0xE947, 0x571E, 0xF96B, + 0x571F, 0xA467, 0x5720, 0xC959, 0x5722, 0xC96E, 0x5723, 0xC96F, + 0x5728, 0xA662, 0x5729, 0xA666, 0x572A, 0xC9C9, 0x572C, 0xA664, + 0x572D, 0xA663, 0x572E, 0xC9C8, 0x572F, 0xA665, 0x5730, 0xA661, + 0x5733, 0xA660, 0x5734, 0xC9CA, 0x573B, 0xA7A6, 0x573E, 0xA7A3, + 0x5740, 0xA77D, 0x5741, 0xCAAA, 0x5745, 0xCAAB, 0x5747, 0xA7A1, + 0x5749, 0xCAAD, 0x574A, 0xA77B, 0x574B, 0xCAAE, 0x574C, 0xCAAC, + 0x574D, 0xA77E, 0x574E, 0xA7A2, 0x574F, 0xA7A5, 0x5750, 0xA7A4, + 0x5751, 0xA77C, 0x5752, 0xCAAF, 0x5761, 0xA959, 0x5762, 0xCBFE, + 0x5764, 0xA95B, 0x5766, 0xA95A, 0x5768, 0xCC40, 0x5769, 0xA958, + 0x576A, 0xA957, 0x576B, 0xCBF5, 0x576D, 0xCBF4, 0x576F, 0xCBF2, + 0x5770, 0xCBF7, 0x5771, 0xCBF6, 0x5772, 0xCBF3, 0x5773, 0xCBFC, + 0x5774, 0xCBFD, 0x5775, 0xCBFA, 0x5776, 0xCBF8, 0x5777, 0xA956, + 0x577B, 0xCBFB, 0x577C, 0xA95C, 0x577D, 0xCC41, 0x5780, 0xCBF9, + 0x5782, 0xABAB, 0x5783, 0xA955, 0x578B, 0xABAC, 0x578C, 0xCE54, + 0x578F, 0xCE5A, 0x5793, 0xABB2, 0x5794, 0xCE58, 0x5795, 0xCE5E, + 0x5797, 0xCE55, 0x5798, 0xCE59, 0x5799, 0xCE5B, 0x579A, 0xCE5D, + 0x579B, 0xCE57, 0x579D, 0xCE56, 0x579E, 0xCE51, 0x579F, 0xCE52, + 0x57A0, 0xABAD, 0x57A2, 0xABAF, 0x57A3, 0xABAE, 0x57A4, 0xCE53, + 0x57A5, 0xCE5C, 0x57AE, 0xABB1, 0x57B5, 0xCE50, 0x57B6, 0xD153, + 0x57B8, 0xD152, 0x57B9, 0xD157, 0x57BA, 0xD14E, 0x57BC, 0xD151, + 0x57BD, 0xD150, 0x57BF, 0xD154, 0x57C1, 0xD158, 0x57C2, 0xAE47, + 0x57C3, 0xAE4A, 0x57C6, 0xD14F, 0x57C7, 0xD155, 0x57CB, 0xAE49, + 0x57CC, 0xD14A, 0x57CE, 0xABB0, 0x57CF, 0xD4BA, 0x57D0, 0xD156, + 0x57D2, 0xD14D, 0x57D4, 0xAE48, 0x57D5, 0xD14C, 0x57DC, 0xD4B1, + 0x57DF, 0xB0EC, 0x57E0, 0xB0F0, 0x57E1, 0xD4C1, 0x57E2, 0xD4AF, + 0x57E3, 0xD4BD, 0x57E4, 0xB0F1, 0x57E5, 0xD4BF, 0x57E7, 0xD4C5, + 0x57E9, 0xD4C9, 0x57EC, 0xD4C0, 0x57ED, 0xD4B4, 0x57EE, 0xD4BC, + 0x57F0, 0xD4CA, 0x57F1, 0xD4C8, 0x57F2, 0xD4BE, 0x57F3, 0xD4B9, + 0x57F4, 0xD4B2, 0x57F5, 0xD8A6, 0x57F6, 0xD4B0, 0x57F7, 0xB0F5, + 0x57F8, 0xD4B7, 0x57F9, 0xB0F6, 0x57FA, 0xB0F2, 0x57FB, 0xD4AD, + 0x57FC, 0xD4C3, 0x57FD, 0xD4B5, 0x5800, 0xD4B3, 0x5801, 0xD4C6, + 0x5802, 0xB0F3, 0x5804, 0xD4CC, 0x5805, 0xB0ED, 0x5806, 0xB0EF, + 0x5807, 0xD4BB, 0x5808, 0xD4B6, 0x5809, 0xAE4B, 0x580A, 0xB0EE, + 0x580B, 0xD4B8, 0x580C, 0xD4C7, 0x580D, 0xD4CB, 0x580E, 0xD4C2, + 0x5810, 0xD4C4, 0x5814, 0xD4AE, 0x5819, 0xD8A1, 0x581B, 0xD8AA, + 0x581C, 0xD8A9, 0x581D, 0xB3FA, 0x581E, 0xD8A2, 0x5820, 0xB3FB, + 0x5821, 0xB3F9, 0x5823, 0xD8A4, 0x5824, 0xB3F6, 0x5825, 0xD8A8, + 0x5827, 0xD8A3, 0x5828, 0xD8A5, 0x5829, 0xD87D, 0x582A, 0xB3F4, + 0x582C, 0xD8B2, 0x582D, 0xD8B1, 0x582E, 0xD8AE, 0x582F, 0xB3F3, + 0x5830, 0xB3F7, 0x5831, 0xB3F8, 0x5832, 0xD14B, 0x5833, 0xD8AB, + 0x5834, 0xB3F5, 0x5835, 0xB0F4, 0x5836, 0xD8AD, 0x5837, 0xD87E, + 0x5838, 0xD8B0, 0x5839, 0xD8AF, 0x583B, 0xD8B3, 0x583D, 0xDCEF, + 0x583F, 0xD8AC, 0x5848, 0xD8A7, 0x5849, 0xDCE7, 0x584A, 0xB6F4, + 0x584B, 0xB6F7, 0x584C, 0xB6F2, 0x584D, 0xDCE6, 0x584E, 0xDCEA, + 0x584F, 0xDCE5, 0x5851, 0xB6EC, 0x5852, 0xB6F6, 0x5853, 0xDCE2, + 0x5854, 0xB6F0, 0x5855, 0xDCE9, 0x5857, 0xB6EE, 0x5858, 0xB6ED, + 0x5859, 0xDCEC, 0x585A, 0xB6EF, 0x585B, 0xDCEE, 0x585D, 0xDCEB, + 0x585E, 0xB6EB, 0x5862, 0xB6F5, 0x5863, 0xDCF0, 0x5864, 0xDCE4, + 0x5865, 0xDCED, 0x5868, 0xDCE3, 0x586B, 0xB6F1, 0x586D, 0xB6F3, + 0x586F, 0xDCE8, 0x5871, 0xDCF1, 0x5874, 0xE15D, 0x5875, 0xB9D0, + 0x5876, 0xE163, 0x5879, 0xB9D5, 0x587A, 0xE15F, 0x587B, 0xE166, + 0x587C, 0xE157, 0x587D, 0xB9D7, 0x587E, 0xB9D1, 0x587F, 0xE15C, + 0x5880, 0xBC55, 0x5881, 0xE15B, 0x5882, 0xE164, 0x5883, 0xB9D2, + 0x5885, 0xB9D6, 0x5886, 0xE15A, 0x5887, 0xE160, 0x5888, 0xE165, + 0x5889, 0xE156, 0x588A, 0xB9D4, 0x588B, 0xE15E, 0x588E, 0xE162, + 0x588F, 0xE168, 0x5890, 0xE158, 0x5891, 0xE161, 0x5893, 0xB9D3, + 0x5894, 0xE167, 0x5898, 0xE159, 0x589C, 0xBC59, 0x589D, 0xE54B, + 0x589E, 0xBC57, 0x589F, 0xBC56, 0x58A0, 0xE54D, 0x58A1, 0xE552, + 0x58A3, 0xE54E, 0x58A5, 0xE551, 0x58A6, 0xBC5C, 0x58A8, 0xBEA5, + 0x58A9, 0xBC5B, 0x58AB, 0xE54A, 0x58AC, 0xE550, 0x58AE, 0xBC5A, + 0x58AF, 0xE54F, 0x58B1, 0xE54C, 0x58B3, 0xBC58, 0x58BA, 0xE94D, + 0x58BB, 0xF9D9, 0x58BC, 0xE94F, 0x58BD, 0xE94A, 0x58BE, 0xBEC1, + 0x58BF, 0xE94C, 0x58C1, 0xBEC0, 0x58C2, 0xE94E, 0x58C5, 0xBEC3, + 0x58C6, 0xE950, 0x58C7, 0xBEC2, 0x58C8, 0xE949, 0x58C9, 0xE94B, + 0x58CE, 0xC0A5, 0x58CF, 0xECCC, 0x58D1, 0xC0A4, 0x58D2, 0xECCD, + 0x58D3, 0xC0A3, 0x58D4, 0xECCB, 0x58D5, 0xC0A2, 0x58D6, 0xECCA, + 0x58D8, 0xC253, 0x58D9, 0xC252, 0x58DA, 0xF1F6, 0x58DB, 0xF1F8, + 0x58DD, 0xF1F7, 0x58DE, 0xC361, 0x58DF, 0xC362, 0x58E2, 0xC363, + 0x58E3, 0xF442, 0x58E4, 0xC45B, 0x58E7, 0xF7D3, 0x58E8, 0xF7D2, + 0x58E9, 0xC5F2, 0x58EB, 0xA468, 0x58EC, 0xA4D0, 0x58EF, 0xA7A7, + 0x58F4, 0xCE5F, 0x58F9, 0xB3FC, 0x58FA, 0xB3FD, 0x58FC, 0xDCF2, + 0x58FD, 0xB9D8, 0x58FE, 0xE169, 0x58FF, 0xE553, 0x5903, 0xC95A, + 0x5906, 0xCAB0, 0x590C, 0xCC42, 0x590D, 0xCE60, 0x590E, 0xD159, + 0x590F, 0xAE4C, 0x5912, 0xF1F9, 0x5914, 0xC4DC, 0x5915, 0xA469, + 0x5916, 0xA57E, 0x5917, 0xC970, 0x5919, 0xA667, 0x591A, 0xA668, + 0x591C, 0xA95D, 0x5920, 0xB0F7, 0x5922, 0xB9DA, 0x5924, 0xB9DB, + 0x5925, 0xB9D9, 0x5927, 0xA46A, 0x5929, 0xA4D1, 0x592A, 0xA4D3, + 0x592B, 0xA4D2, 0x592C, 0xC95B, 0x592D, 0xA4D4, 0x592E, 0xA5A1, + 0x592F, 0xC971, 0x5931, 0xA5A2, 0x5937, 0xA669, 0x5938, 0xA66A, + 0x593C, 0xC9CB, 0x593E, 0xA7A8, 0x5940, 0xCAB1, 0x5944, 0xA961, + 0x5945, 0xCC43, 0x5947, 0xA95F, 0x5948, 0xA960, 0x5949, 0xA95E, + 0x594A, 0xD15A, 0x594E, 0xABB6, 0x594F, 0xABB5, 0x5950, 0xABB7, + 0x5951, 0xABB4, 0x5953, 0xCE61, 0x5954, 0xA962, 0x5955, 0xABB3, + 0x5957, 0xAE4D, 0x5958, 0xAE4E, 0x595A, 0xAE4F, 0x595C, 0xD4CD, + 0x5960, 0xB3FE, 0x5961, 0xD8B4, 0x5962, 0xB0F8, 0x5967, 0xB6F8, + 0x5969, 0xB9DD, 0x596A, 0xB9DC, 0x596B, 0xE16A, 0x596D, 0xBC5D, + 0x596E, 0xBEC4, 0x5970, 0xEFC0, 0x5971, 0xF6DA, 0x5972, 0xF7D4, + 0x5973, 0xA46B, 0x5974, 0xA5A3, 0x5976, 0xA5A4, 0x5977, 0xC9D1, + 0x5978, 0xA66C, 0x5979, 0xA66F, 0x597B, 0xC9CF, 0x597C, 0xC9CD, + 0x597D, 0xA66E, 0x597E, 0xC9D0, 0x597F, 0xC9D2, 0x5980, 0xC9CC, + 0x5981, 0xA671, 0x5982, 0xA670, 0x5983, 0xA66D, 0x5984, 0xA66B, + 0x5985, 0xC9CE, 0x598A, 0xA7B3, 0x598D, 0xA7B0, 0x598E, 0xCAB6, + 0x598F, 0xCAB9, 0x5990, 0xCAB8, 0x5992, 0xA7AA, 0x5993, 0xA7B2, + 0x5996, 0xA7AF, 0x5997, 0xCAB5, 0x5998, 0xCAB3, 0x5999, 0xA7AE, + 0x599D, 0xA7A9, 0x599E, 0xA7AC, 0x59A0, 0xCAB4, 0x59A1, 0xCABB, + 0x59A2, 0xCAB7, 0x59A3, 0xA7AD, 0x59A4, 0xA7B1, 0x59A5, 0xA7B4, + 0x59A6, 0xCAB2, 0x59A7, 0xCABA, 0x59A8, 0xA7AB, 0x59AE, 0xA967, + 0x59AF, 0xA96F, 0x59B1, 0xCC4F, 0x59B2, 0xCC48, 0x59B3, 0xA970, + 0x59B4, 0xCC53, 0x59B5, 0xCC44, 0x59B6, 0xCC4B, 0x59B9, 0xA966, + 0x59BA, 0xCC45, 0x59BB, 0xA964, 0x59BC, 0xCC4C, 0x59BD, 0xCC50, + 0x59BE, 0xA963, 0x59C0, 0xCC51, 0x59C1, 0xCC4A, 0x59C3, 0xCC4D, + 0x59C5, 0xA972, 0x59C6, 0xA969, 0x59C7, 0xCC54, 0x59C8, 0xCC52, + 0x59CA, 0xA96E, 0x59CB, 0xA96C, 0x59CC, 0xCC49, 0x59CD, 0xA96B, + 0x59CE, 0xCC47, 0x59CF, 0xCC46, 0x59D0, 0xA96A, 0x59D1, 0xA968, + 0x59D2, 0xA971, 0x59D3, 0xA96D, 0x59D4, 0xA965, 0x59D6, 0xCC4E, + 0x59D8, 0xABB9, 0x59DA, 0xABC0, 0x59DB, 0xCE6F, 0x59DC, 0xABB8, + 0x59DD, 0xCE67, 0x59DE, 0xCE63, 0x59E0, 0xCE73, 0x59E1, 0xCE62, + 0x59E3, 0xABBB, 0x59E4, 0xCE6C, 0x59E5, 0xABBE, 0x59E6, 0xABC1, + 0x59E8, 0xABBC, 0x59E9, 0xCE70, 0x59EA, 0xABBF, 0x59EC, 0xAE56, + 0x59ED, 0xCE76, 0x59EE, 0xCE64, 0x59F1, 0xCE66, 0x59F2, 0xCE6D, + 0x59F3, 0xCE71, 0x59F4, 0xCE75, 0x59F5, 0xCE72, 0x59F6, 0xCE6B, + 0x59F7, 0xCE6E, 0x59FA, 0xCE68, 0x59FB, 0xABC3, 0x59FC, 0xCE6A, + 0x59FD, 0xCE69, 0x59FE, 0xCE74, 0x59FF, 0xABBA, 0x5A00, 0xCE65, + 0x5A01, 0xABC2, 0x5A03, 0xABBD, 0x5A09, 0xAE5C, 0x5A0A, 0xD162, + 0x5A0C, 0xAE5B, 0x5A0F, 0xD160, 0x5A11, 0xAE50, 0x5A13, 0xAE55, + 0x5A15, 0xD15F, 0x5A16, 0xD15C, 0x5A17, 0xD161, 0x5A18, 0xAE51, + 0x5A19, 0xD15B, 0x5A1B, 0xAE54, 0x5A1C, 0xAE52, 0x5A1E, 0xD163, + 0x5A1F, 0xAE53, 0x5A20, 0xAE57, 0x5A23, 0xAE58, 0x5A25, 0xAE5A, + 0x5A29, 0xAE59, 0x5A2D, 0xD15D, 0x5A2E, 0xD15E, 0x5A33, 0xD164, + 0x5A35, 0xD4D4, 0x5A36, 0xB0F9, 0x5A37, 0xD8C2, 0x5A38, 0xD4D3, + 0x5A39, 0xD4E6, 0x5A3C, 0xB140, 0x5A3E, 0xD4E4, 0x5A40, 0xB0FE, + 0x5A41, 0xB0FA, 0x5A42, 0xD4ED, 0x5A43, 0xD4DD, 0x5A44, 0xD4E0, + 0x5A46, 0xB143, 0x5A47, 0xD4EA, 0x5A48, 0xD4E2, 0x5A49, 0xB0FB, + 0x5A4A, 0xB144, 0x5A4C, 0xD4E7, 0x5A4D, 0xD4E5, 0x5A50, 0xD4D6, + 0x5A51, 0xD4EB, 0x5A52, 0xD4DF, 0x5A53, 0xD4DA, 0x5A55, 0xD4D0, + 0x5A56, 0xD4EC, 0x5A57, 0xD4DC, 0x5A58, 0xD4CF, 0x5A5A, 0xB142, + 0x5A5B, 0xD4E1, 0x5A5C, 0xD4EE, 0x5A5D, 0xD4DE, 0x5A5E, 0xD4D2, + 0x5A5F, 0xD4D7, 0x5A60, 0xD4CE, 0x5A62, 0xB141, 0x5A64, 0xD4DB, + 0x5A65, 0xD4D8, 0x5A66, 0xB0FC, 0x5A67, 0xD4D1, 0x5A69, 0xD4E9, + 0x5A6A, 0xB0FD, 0x5A6C, 0xD4D9, 0x5A6D, 0xD4D5, 0x5A70, 0xD4E8, + 0x5A77, 0xB440, 0x5A78, 0xD8BB, 0x5A7A, 0xD8B8, 0x5A7B, 0xD8C9, + 0x5A7C, 0xD8BD, 0x5A7D, 0xD8CA, 0x5A7F, 0xB442, 0x5A83, 0xD8C6, + 0x5A84, 0xD8C3, 0x5A8A, 0xD8C4, 0x5A8B, 0xD8C7, 0x5A8C, 0xD8CB, + 0x5A8E, 0xD4E3, 0x5A8F, 0xD8CD, 0x5A90, 0xDD47, 0x5A92, 0xB443, + 0x5A93, 0xD8CE, 0x5A94, 0xD8B6, 0x5A95, 0xD8C0, 0x5A97, 0xD8C5, + 0x5A9A, 0xB441, 0x5A9B, 0xB444, 0x5A9C, 0xD8CC, 0x5A9D, 0xD8CF, + 0x5A9E, 0xD8BA, 0x5A9F, 0xD8B7, 0x5AA2, 0xD8B9, 0x5AA5, 0xD8BE, + 0x5AA6, 0xD8BC, 0x5AA7, 0xB445, 0x5AA9, 0xD8C8, 0x5AAC, 0xD8BF, + 0x5AAE, 0xD8C1, 0x5AAF, 0xD8B5, 0x5AB0, 0xDCFA, 0x5AB1, 0xDCF8, + 0x5AB2, 0xB742, 0x5AB3, 0xB740, 0x5AB4, 0xDD43, 0x5AB5, 0xDCF9, + 0x5AB6, 0xDD44, 0x5AB7, 0xDD40, 0x5AB8, 0xDCF7, 0x5AB9, 0xDD46, + 0x5ABA, 0xDCF6, 0x5ABB, 0xDCFD, 0x5ABC, 0xB6FE, 0x5ABD, 0xB6FD, + 0x5ABE, 0xB6FC, 0x5ABF, 0xDCFB, 0x5AC0, 0xDD41, 0x5AC1, 0xB6F9, + 0x5AC2, 0xB741, 0x5AC4, 0xDCF4, 0x5AC6, 0xDCFE, 0x5AC7, 0xDCF3, + 0x5AC8, 0xDCFC, 0x5AC9, 0xB6FA, 0x5ACA, 0xDD42, 0x5ACB, 0xDCF5, + 0x5ACC, 0xB6FB, 0x5ACD, 0xDD45, 0x5AD5, 0xE16E, 0x5AD6, 0xB9E2, + 0x5AD7, 0xB9E1, 0x5AD8, 0xB9E3, 0x5AD9, 0xE17A, 0x5ADA, 0xE170, + 0x5ADB, 0xE176, 0x5ADC, 0xE16B, 0x5ADD, 0xE179, 0x5ADE, 0xE178, + 0x5ADF, 0xE17C, 0x5AE0, 0xE175, 0x5AE1, 0xB9DE, 0x5AE2, 0xE174, + 0x5AE3, 0xB9E4, 0x5AE5, 0xE16D, 0x5AE6, 0xB9DF, 0x5AE8, 0xE17B, + 0x5AE9, 0xB9E0, 0x5AEA, 0xE16F, 0x5AEB, 0xE172, 0x5AEC, 0xE177, + 0x5AED, 0xE171, 0x5AEE, 0xE16C, 0x5AF3, 0xE173, 0x5AF4, 0xE555, + 0x5AF5, 0xBC61, 0x5AF6, 0xE558, 0x5AF7, 0xE557, 0x5AF8, 0xE55A, + 0x5AF9, 0xE55C, 0x5AFA, 0xF9DC, 0x5AFB, 0xBC5F, 0x5AFD, 0xE556, + 0x5AFF, 0xE554, 0x5B01, 0xE55D, 0x5B02, 0xE55B, 0x5B03, 0xE559, + 0x5B05, 0xE55F, 0x5B07, 0xE55E, 0x5B08, 0xBC63, 0x5B09, 0xBC5E, + 0x5B0B, 0xBC60, 0x5B0C, 0xBC62, 0x5B0F, 0xE560, 0x5B10, 0xE957, + 0x5B13, 0xE956, 0x5B14, 0xE955, 0x5B16, 0xE958, 0x5B17, 0xE951, + 0x5B19, 0xE952, 0x5B1A, 0xE95A, 0x5B1B, 0xE953, 0x5B1D, 0xBEC5, + 0x5B1E, 0xE95C, 0x5B20, 0xE95B, 0x5B21, 0xE954, 0x5B23, 0xECD1, + 0x5B24, 0xC0A8, 0x5B25, 0xECCF, 0x5B26, 0xECD4, 0x5B27, 0xECD3, + 0x5B28, 0xE959, 0x5B2A, 0xC0A7, 0x5B2C, 0xECD2, 0x5B2D, 0xECCE, + 0x5B2E, 0xECD6, 0x5B2F, 0xECD5, 0x5B30, 0xC0A6, 0x5B32, 0xECD0, + 0x5B34, 0xBEC6, 0x5B38, 0xC254, 0x5B3C, 0xEFC1, 0x5B3D, 0xF1FA, + 0x5B3E, 0xF1FB, 0x5B3F, 0xF1FC, 0x5B40, 0xC45C, 0x5B43, 0xC45D, + 0x5B45, 0xF443, 0x5B47, 0xF5C8, 0x5B48, 0xF5C7, 0x5B4B, 0xF6DB, + 0x5B4C, 0xF6DC, 0x5B4D, 0xF7D5, 0x5B4E, 0xF8A7, 0x5B50, 0xA46C, + 0x5B51, 0xA46D, 0x5B53, 0xA46E, 0x5B54, 0xA4D5, 0x5B55, 0xA5A5, + 0x5B56, 0xC9D3, 0x5B57, 0xA672, 0x5B58, 0xA673, 0x5B5A, 0xA7B7, + 0x5B5B, 0xA7B8, 0x5B5C, 0xA7B6, 0x5B5D, 0xA7B5, 0x5B5F, 0xA973, + 0x5B62, 0xCC55, 0x5B63, 0xA975, 0x5B64, 0xA974, 0x5B65, 0xCC56, + 0x5B69, 0xABC4, 0x5B6B, 0xAE5D, 0x5B6C, 0xD165, 0x5B6E, 0xD4F0, + 0x5B70, 0xB145, 0x5B71, 0xB447, 0x5B72, 0xD4EF, 0x5B73, 0xB446, + 0x5B75, 0xB9E5, 0x5B77, 0xE17D, 0x5B78, 0xBEC7, 0x5B7A, 0xC0A9, + 0x5B7B, 0xECD7, 0x5B7D, 0xC45E, 0x5B7F, 0xC570, 0x5B81, 0xC972, + 0x5B83, 0xA5A6, 0x5B84, 0xC973, 0x5B85, 0xA676, 0x5B87, 0xA674, + 0x5B88, 0xA675, 0x5B89, 0xA677, 0x5B8B, 0xA7BA, 0x5B8C, 0xA7B9, + 0x5B8E, 0xCABC, 0x5B8F, 0xA7BB, 0x5B92, 0xCABD, 0x5B93, 0xCC57, + 0x5B95, 0xCC58, 0x5B97, 0xA976, 0x5B98, 0xA978, 0x5B99, 0xA97A, + 0x5B9A, 0xA977, 0x5B9B, 0xA97B, 0x5B9C, 0xA979, 0x5BA2, 0xABC8, + 0x5BA3, 0xABC5, 0x5BA4, 0xABC7, 0x5BA5, 0xABC9, 0x5BA6, 0xABC6, + 0x5BA7, 0xD166, 0x5BA8, 0xCE77, 0x5BAC, 0xD168, 0x5BAD, 0xD167, + 0x5BAE, 0xAE63, 0x5BB0, 0xAE5F, 0x5BB3, 0xAE60, 0x5BB4, 0xAE62, + 0x5BB5, 0xAE64, 0x5BB6, 0xAE61, 0x5BB8, 0xAE66, 0x5BB9, 0xAE65, + 0x5BBF, 0xB14A, 0x5BC0, 0xD4F2, 0x5BC1, 0xD4F1, 0x5BC2, 0xB149, + 0x5BC4, 0xB148, 0x5BC5, 0xB147, 0x5BC6, 0xB14B, 0x5BC7, 0xB146, + 0x5BCA, 0xD8D5, 0x5BCB, 0xD8D2, 0x5BCC, 0xB449, 0x5BCD, 0xD8D1, + 0x5BCE, 0xD8D6, 0x5BD0, 0xB44B, 0x5BD1, 0xD8D4, 0x5BD2, 0xB448, + 0x5BD3, 0xB44A, 0x5BD4, 0xD8D3, 0x5BD6, 0xDD48, 0x5BD8, 0xDD49, + 0x5BD9, 0xDD4A, 0x5BDE, 0xB9E6, 0x5BDF, 0xB9EE, 0x5BE0, 0xE17E, + 0x5BE1, 0xB9E8, 0x5BE2, 0xB9EC, 0x5BE3, 0xE1A1, 0x5BE4, 0xB9ED, + 0x5BE5, 0xB9E9, 0x5BE6, 0xB9EA, 0x5BE7, 0xB9E7, 0x5BE8, 0xB9EB, + 0x5BE9, 0xBC66, 0x5BEA, 0xD8D0, 0x5BEB, 0xBC67, 0x5BEC, 0xBC65, + 0x5BEE, 0xBC64, 0x5BEF, 0xE95D, 0x5BF0, 0xBEC8, 0x5BF1, 0xECD8, + 0x5BF2, 0xECD9, 0x5BF5, 0xC364, 0x5BF6, 0xC45F, 0x5BF8, 0xA46F, + 0x5BFA, 0xA678, 0x5C01, 0xABCA, 0x5C03, 0xD169, 0x5C04, 0xAE67, + 0x5C07, 0xB14E, 0x5C08, 0xB14D, 0x5C09, 0xB14C, 0x5C0A, 0xB44C, + 0x5C0B, 0xB44D, 0x5C0C, 0xD8D7, 0x5C0D, 0xB9EF, 0x5C0E, 0xBEC9, + 0x5C0F, 0xA470, 0x5C10, 0xC95C, 0x5C11, 0xA4D6, 0x5C12, 0xC974, + 0x5C15, 0xC9D4, 0x5C16, 0xA679, 0x5C1A, 0xA97C, 0x5C1F, 0xDD4B, + 0x5C22, 0xA471, 0x5C24, 0xA4D7, 0x5C25, 0xC9D5, 0x5C28, 0xCABE, + 0x5C2A, 0xCABF, 0x5C2C, 0xA7BC, 0x5C30, 0xD8D8, 0x5C31, 0xB44E, + 0x5C33, 0xDD4C, 0x5C37, 0xC0AA, 0x5C38, 0xA472, 0x5C39, 0xA4A8, + 0x5C3A, 0xA4D8, 0x5C3B, 0xC975, 0x5C3C, 0xA5A7, 0x5C3E, 0xA7C0, + 0x5C3F, 0xA7BF, 0x5C40, 0xA7BD, 0x5C41, 0xA7BE, 0x5C44, 0xCC59, + 0x5C45, 0xA97E, 0x5C46, 0xA9A1, 0x5C47, 0xCC5A, 0x5C48, 0xA97D, + 0x5C4B, 0xABCE, 0x5C4C, 0xCE78, 0x5C4D, 0xABCD, 0x5C4E, 0xABCB, + 0x5C4F, 0xABCC, 0x5C50, 0xAE6A, 0x5C51, 0xAE68, 0x5C54, 0xD16B, + 0x5C55, 0xAE69, 0x5C56, 0xD16A, 0x5C58, 0xAE5E, 0x5C59, 0xD4F3, + 0x5C5C, 0xB150, 0x5C5D, 0xB151, 0x5C60, 0xB14F, 0x5C62, 0xB9F0, + 0x5C63, 0xE1A2, 0x5C64, 0xBC68, 0x5C65, 0xBC69, 0x5C67, 0xE561, + 0x5C68, 0xC0AB, 0x5C69, 0xEFC2, 0x5C6A, 0xEFC3, 0x5C6C, 0xC4DD, + 0x5C6D, 0xF8A8, 0x5C6E, 0xC94B, 0x5C6F, 0xA4D9, 0x5C71, 0xA473, + 0x5C73, 0xC977, 0x5C74, 0xC976, 0x5C79, 0xA67A, 0x5C7A, 0xC9D7, + 0x5C7B, 0xC9D8, 0x5C7C, 0xC9D6, 0x5C7E, 0xC9D9, 0x5C86, 0xCAC7, + 0x5C88, 0xCAC2, 0x5C89, 0xCAC4, 0x5C8A, 0xCAC6, 0x5C8B, 0xCAC3, + 0x5C8C, 0xA7C4, 0x5C8D, 0xCAC0, 0x5C8F, 0xCAC1, 0x5C90, 0xA7C1, + 0x5C91, 0xA7C2, 0x5C92, 0xCAC5, 0x5C93, 0xCAC8, 0x5C94, 0xA7C3, + 0x5C95, 0xCAC9, 0x5C9D, 0xCC68, 0x5C9F, 0xCC62, 0x5CA0, 0xCC5D, + 0x5CA1, 0xA9A3, 0x5CA2, 0xCC65, 0x5CA3, 0xCC63, 0x5CA4, 0xCC5C, + 0x5CA5, 0xCC69, 0x5CA6, 0xCC6C, 0x5CA7, 0xCC67, 0x5CA8, 0xCC60, + 0x5CA9, 0xA9A5, 0x5CAA, 0xCC66, 0x5CAB, 0xA9A6, 0x5CAC, 0xCC61, + 0x5CAD, 0xCC64, 0x5CAE, 0xCC5B, 0x5CAF, 0xCC5F, 0x5CB0, 0xCC6B, + 0x5CB1, 0xA9A7, 0x5CB3, 0xA9A8, 0x5CB5, 0xCC5E, 0x5CB6, 0xCC6A, + 0x5CB7, 0xA9A2, 0x5CB8, 0xA9A4, 0x5CC6, 0xCEAB, 0x5CC7, 0xCEA4, + 0x5CC8, 0xCEAA, 0x5CC9, 0xCEA3, 0x5CCA, 0xCEA5, 0x5CCB, 0xCE7D, + 0x5CCC, 0xCE7B, 0x5CCE, 0xCEAC, 0x5CCF, 0xCEA9, 0x5CD0, 0xCE79, + 0x5CD2, 0xABD0, 0x5CD3, 0xCEA7, 0x5CD4, 0xCEA8, 0x5CD6, 0xCEA6, + 0x5CD7, 0xCE7C, 0x5CD8, 0xCE7A, 0x5CD9, 0xABCF, 0x5CDA, 0xCEA2, + 0x5CDB, 0xCE7E, 0x5CDE, 0xCEA1, 0x5CDF, 0xCEAD, 0x5CE8, 0xAE6F, + 0x5CEA, 0xAE6E, 0x5CEC, 0xD16C, 0x5CED, 0xAE6B, 0x5CEE, 0xD16E, + 0x5CF0, 0xAE70, 0x5CF1, 0xD16F, 0x5CF4, 0xAE73, 0x5CF6, 0xAE71, + 0x5CF7, 0xD170, 0x5CF8, 0xCEAE, 0x5CF9, 0xD172, 0x5CFB, 0xAE6D, + 0x5CFD, 0xAE6C, 0x5CFF, 0xD16D, 0x5D00, 0xD171, 0x5D01, 0xAE72, + 0x5D06, 0xB153, 0x5D07, 0xB152, 0x5D0B, 0xD4F5, 0x5D0C, 0xD4F9, + 0x5D0D, 0xD4FB, 0x5D0E, 0xB154, 0x5D0F, 0xD4FE, 0x5D11, 0xB158, + 0x5D12, 0xD541, 0x5D14, 0xB15A, 0x5D16, 0xB156, 0x5D17, 0xB15E, + 0x5D19, 0xB15B, 0x5D1A, 0xD4F7, 0x5D1B, 0xB155, 0x5D1D, 0xD4F6, + 0x5D1E, 0xD4F4, 0x5D1F, 0xD543, 0x5D20, 0xD4F8, 0x5D22, 0xB157, + 0x5D23, 0xD542, 0x5D24, 0xB15C, 0x5D25, 0xD4FD, 0x5D26, 0xD4FC, + 0x5D27, 0xB15D, 0x5D28, 0xD4FA, 0x5D29, 0xB159, 0x5D2E, 0xD544, + 0x5D30, 0xD540, 0x5D31, 0xD8E7, 0x5D32, 0xD8EE, 0x5D33, 0xD8E3, + 0x5D34, 0xB451, 0x5D35, 0xD8DF, 0x5D36, 0xD8EF, 0x5D37, 0xD8D9, + 0x5D38, 0xD8EC, 0x5D39, 0xD8EA, 0x5D3A, 0xD8E4, 0x5D3C, 0xD8ED, + 0x5D3D, 0xD8E6, 0x5D3F, 0xD8DE, 0x5D40, 0xD8F0, 0x5D41, 0xD8DC, + 0x5D42, 0xD8E9, 0x5D43, 0xD8DA, 0x5D45, 0xD8F1, 0x5D47, 0xB452, + 0x5D49, 0xD8EB, 0x5D4A, 0xDD4F, 0x5D4B, 0xD8DD, 0x5D4C, 0xB44F, + 0x5D4E, 0xD8E1, 0x5D50, 0xB450, 0x5D51, 0xD8E0, 0x5D52, 0xD8E5, + 0x5D55, 0xD8E2, 0x5D59, 0xD8E8, 0x5D5E, 0xDD53, 0x5D62, 0xDD56, + 0x5D63, 0xDD4E, 0x5D65, 0xDD50, 0x5D67, 0xDD55, 0x5D68, 0xDD54, + 0x5D69, 0xB743, 0x5D6B, 0xD8DB, 0x5D6C, 0xDD52, 0x5D6F, 0xB744, + 0x5D71, 0xDD4D, 0x5D72, 0xDD51, 0x5D77, 0xE1A9, 0x5D79, 0xE1B0, + 0x5D7A, 0xE1A7, 0x5D7C, 0xE1AE, 0x5D7D, 0xE1A5, 0x5D7E, 0xE1AD, + 0x5D7F, 0xE1B1, 0x5D80, 0xE1A4, 0x5D81, 0xE1A8, 0x5D82, 0xE1A3, + 0x5D84, 0xB9F1, 0x5D86, 0xE1A6, 0x5D87, 0xB9F2, 0x5D88, 0xE1AC, + 0x5D89, 0xE1AB, 0x5D8A, 0xE1AA, 0x5D8D, 0xE1AF, 0x5D92, 0xE565, + 0x5D93, 0xE567, 0x5D94, 0xBC6B, 0x5D95, 0xE568, 0x5D97, 0xE563, + 0x5D99, 0xE562, 0x5D9A, 0xE56C, 0x5D9C, 0xE56A, 0x5D9D, 0xBC6A, + 0x5D9E, 0xE56D, 0x5D9F, 0xE564, 0x5DA0, 0xE569, 0x5DA1, 0xE56B, + 0x5DA2, 0xE566, 0x5DA7, 0xE961, 0x5DA8, 0xE966, 0x5DA9, 0xE960, + 0x5DAA, 0xE965, 0x5DAC, 0xE95E, 0x5DAD, 0xE968, 0x5DAE, 0xE964, + 0x5DAF, 0xE969, 0x5DB0, 0xE963, 0x5DB1, 0xE95F, 0x5DB2, 0xE967, + 0x5DB4, 0xE96A, 0x5DB5, 0xE962, 0x5DB7, 0xECDA, 0x5DB8, 0xC0AF, + 0x5DBA, 0xC0AD, 0x5DBC, 0xC0AC, 0x5DBD, 0xC0AE, 0x5DC0, 0xEFC4, + 0x5DC2, 0xF172, 0x5DC3, 0xF1FD, 0x5DC6, 0xF444, 0x5DC7, 0xF445, + 0x5DC9, 0xC460, 0x5DCB, 0xF5C9, 0x5DCD, 0xC4DE, 0x5DCF, 0xF5CA, + 0x5DD1, 0xF6DE, 0x5DD2, 0xC572, 0x5DD4, 0xC571, 0x5DD5, 0xF6DD, + 0x5DD6, 0xC5C9, 0x5DD8, 0xF7D6, 0x5DDD, 0xA474, 0x5DDE, 0xA67B, + 0x5DDF, 0xC9DA, 0x5DE0, 0xCACA, 0x5DE1, 0xA8B5, 0x5DE2, 0xB15F, + 0x5DE5, 0xA475, 0x5DE6, 0xA5AA, 0x5DE7, 0xA5A9, 0x5DE8, 0xA5A8, + 0x5DEB, 0xA7C5, 0x5DEE, 0xAE74, 0x5DF0, 0xDD57, 0x5DF1, 0xA476, + 0x5DF2, 0xA477, 0x5DF3, 0xA478, 0x5DF4, 0xA4DA, 0x5DF7, 0xABD1, + 0x5DF9, 0xCEAF, 0x5DFD, 0xB453, 0x5DFE, 0xA479, 0x5DFF, 0xC95D, + 0x5E02, 0xA5AB, 0x5E03, 0xA5AC, 0x5E04, 0xC978, 0x5E06, 0xA67C, + 0x5E0A, 0xCACB, 0x5E0C, 0xA7C6, 0x5E0E, 0xCACC, 0x5E11, 0xA9AE, + 0x5E14, 0xCC6E, 0x5E15, 0xA9AC, 0x5E16, 0xA9AB, 0x5E17, 0xCC6D, + 0x5E18, 0xA9A9, 0x5E19, 0xCC6F, 0x5E1A, 0xA9AA, 0x5E1B, 0xA9AD, + 0x5E1D, 0xABD2, 0x5E1F, 0xABD4, 0x5E20, 0xCEB3, 0x5E21, 0xCEB0, + 0x5E22, 0xCEB1, 0x5E23, 0xCEB2, 0x5E24, 0xCEB4, 0x5E25, 0xABD3, + 0x5E28, 0xD174, 0x5E29, 0xD173, 0x5E2B, 0xAE76, 0x5E2D, 0xAE75, + 0x5E33, 0xB162, 0x5E34, 0xD546, 0x5E36, 0xB161, 0x5E37, 0xB163, + 0x5E38, 0xB160, 0x5E3D, 0xB455, 0x5E3E, 0xD545, 0x5E40, 0xB456, + 0x5E41, 0xD8F3, 0x5E43, 0xB457, 0x5E44, 0xD8F2, 0x5E45, 0xB454, + 0x5E4A, 0xDD5A, 0x5E4B, 0xDD5C, 0x5E4C, 0xB745, 0x5E4D, 0xDD5B, + 0x5E4E, 0xDD59, 0x5E4F, 0xDD58, 0x5E53, 0xE1B4, 0x5E54, 0xB9F7, + 0x5E55, 0xB9F5, 0x5E57, 0xB9F6, 0x5E58, 0xE1B2, 0x5E59, 0xE1B3, + 0x5E5B, 0xB9F3, 0x5E5C, 0xE571, 0x5E5D, 0xE56F, 0x5E5F, 0xBC6D, + 0x5E60, 0xE570, 0x5E61, 0xBC6E, 0x5E62, 0xBC6C, 0x5E63, 0xB9F4, + 0x5E66, 0xE96D, 0x5E67, 0xE96B, 0x5E68, 0xE96C, 0x5E69, 0xE56E, + 0x5E6A, 0xECDC, 0x5E6B, 0xC0B0, 0x5E6C, 0xECDB, 0x5E6D, 0xEFC5, + 0x5E6E, 0xEFC6, 0x5E6F, 0xE96E, 0x5E70, 0xF1FE, 0x5E72, 0xA47A, + 0x5E73, 0xA5AD, 0x5E74, 0xA67E, 0x5E75, 0xC9DB, 0x5E76, 0xA67D, + 0x5E78, 0xA9AF, 0x5E79, 0xB746, 0x5E7B, 0xA4DB, 0x5E7C, 0xA5AE, + 0x5E7D, 0xABD5, 0x5E7E, 0xB458, 0x5E80, 0xC979, 0x5E82, 0xC97A, + 0x5E84, 0xC9DC, 0x5E87, 0xA7C8, 0x5E88, 0xCAD0, 0x5E89, 0xCACE, + 0x5E8A, 0xA7C9, 0x5E8B, 0xCACD, 0x5E8C, 0xCACF, 0x5E8D, 0xCAD1, + 0x5E8F, 0xA7C7, 0x5E95, 0xA9B3, 0x5E96, 0xA9B4, 0x5E97, 0xA9B1, + 0x5E9A, 0xA9B0, 0x5E9B, 0xCEB8, 0x5E9C, 0xA9B2, 0x5EA0, 0xABD6, + 0x5EA2, 0xCEB7, 0x5EA3, 0xCEB9, 0x5EA4, 0xCEB6, 0x5EA5, 0xCEBA, + 0x5EA6, 0xABD7, 0x5EA7, 0xAE79, 0x5EA8, 0xD175, 0x5EAA, 0xD177, + 0x5EAB, 0xAE77, 0x5EAC, 0xD178, 0x5EAD, 0xAE78, 0x5EAE, 0xD176, + 0x5EB0, 0xCEB5, 0x5EB1, 0xD547, 0x5EB2, 0xD54A, 0x5EB3, 0xD54B, + 0x5EB4, 0xD548, 0x5EB5, 0xB167, 0x5EB6, 0xB166, 0x5EB7, 0xB164, + 0x5EB8, 0xB165, 0x5EB9, 0xD549, 0x5EBE, 0xB168, 0x5EC1, 0xB45A, + 0x5EC2, 0xB45B, 0x5EC4, 0xB45C, 0x5EC5, 0xDD5D, 0x5EC6, 0xDD5F, + 0x5EC7, 0xDD61, 0x5EC8, 0xB748, 0x5EC9, 0xB747, 0x5ECA, 0xB459, + 0x5ECB, 0xDD60, 0x5ECC, 0xDD5E, 0x5ECE, 0xE1B8, 0x5ED1, 0xE1B6, + 0x5ED2, 0xE1BC, 0x5ED3, 0xB9F8, 0x5ED4, 0xE1BD, 0x5ED5, 0xE1BA, + 0x5ED6, 0xB9F9, 0x5ED7, 0xE1B7, 0x5ED8, 0xE1B5, 0x5ED9, 0xE1BB, + 0x5EDA, 0xBC70, 0x5EDB, 0xE573, 0x5EDC, 0xE1B9, 0x5EDD, 0xBC72, + 0x5EDE, 0xE574, 0x5EDF, 0xBC71, 0x5EE0, 0xBC74, 0x5EE1, 0xE575, + 0x5EE2, 0xBC6F, 0x5EE3, 0xBC73, 0x5EE5, 0xE973, 0x5EE6, 0xE971, + 0x5EE7, 0xE970, 0x5EE8, 0xE972, 0x5EE9, 0xE96F, 0x5EEC, 0xC366, + 0x5EEE, 0xF446, 0x5EEF, 0xF447, 0x5EF1, 0xF5CB, 0x5EF2, 0xF6DF, + 0x5EF3, 0xC655, 0x5EF6, 0xA9B5, 0x5EF7, 0xA7CA, 0x5EFA, 0xABD8, + 0x5EFE, 0xA47B, 0x5EFF, 0xA4DC, 0x5F01, 0xA5AF, 0x5F02, 0xC9DD, + 0x5F04, 0xA7CB, 0x5F05, 0xCAD2, 0x5F07, 0xCEBB, 0x5F08, 0xABD9, + 0x5F0A, 0xB9FA, 0x5F0B, 0xA47C, 0x5F0F, 0xA6A1, 0x5F12, 0xB749, + 0x5F13, 0xA47D, 0x5F14, 0xA4DD, 0x5F15, 0xA4DE, 0x5F17, 0xA5B1, + 0x5F18, 0xA5B0, 0x5F1A, 0xC9DE, 0x5F1B, 0xA6A2, 0x5F1D, 0xCAD3, + 0x5F1F, 0xA7CC, 0x5F22, 0xCC71, 0x5F23, 0xCC72, 0x5F24, 0xCC73, + 0x5F26, 0xA9B6, 0x5F27, 0xA9B7, 0x5F28, 0xCC70, 0x5F29, 0xA9B8, + 0x5F2D, 0xABDA, 0x5F2E, 0xCEBC, 0x5F30, 0xD17A, 0x5F31, 0xAE7A, + 0x5F33, 0xD179, 0x5F35, 0xB169, 0x5F36, 0xD54C, 0x5F37, 0xB16A, + 0x5F38, 0xD54D, 0x5F3C, 0xB45D, 0x5F40, 0xDD62, 0x5F43, 0xE1BF, + 0x5F44, 0xE1BE, 0x5F46, 0xB9FB, 0x5F48, 0xBC75, 0x5F49, 0xE576, + 0x5F4A, 0xBECA, 0x5F4B, 0xE974, 0x5F4C, 0xC0B1, 0x5F4E, 0xC573, + 0x5F4F, 0xF7D8, 0x5F54, 0xCC74, 0x5F56, 0xCEBD, 0x5F57, 0xB16B, + 0x5F58, 0xD8F4, 0x5F59, 0xB74A, 0x5F5D, 0xC255, 0x5F62, 0xA7CE, + 0x5F64, 0xA7CD, 0x5F65, 0xABDB, 0x5F67, 0xD17B, 0x5F69, 0xB16D, + 0x5F6A, 0xB343, 0x5F6B, 0xB16E, 0x5F6C, 0xB16C, 0x5F6D, 0xB45E, + 0x5F6F, 0xE1C0, 0x5F70, 0xB9FC, 0x5F71, 0xBC76, 0x5F73, 0xC94C, + 0x5F74, 0xC9DF, 0x5F76, 0xCAD5, 0x5F77, 0xA7CF, 0x5F78, 0xCAD4, + 0x5F79, 0xA7D0, 0x5F7C, 0xA9BC, 0x5F7D, 0xCC77, 0x5F7E, 0xCC76, + 0x5F7F, 0xA9BB, 0x5F80, 0xA9B9, 0x5F81, 0xA9BA, 0x5F82, 0xCC75, + 0x5F85, 0xABDD, 0x5F86, 0xCEBE, 0x5F87, 0xABE0, 0x5F88, 0xABDC, + 0x5F89, 0xABE2, 0x5F8A, 0xABDE, 0x5F8B, 0xABDF, 0x5F8C, 0xABE1, + 0x5F90, 0xAE7D, 0x5F91, 0xAE7C, 0x5F92, 0xAE7B, 0x5F96, 0xD54F, + 0x5F97, 0xB16F, 0x5F98, 0xB172, 0x5F99, 0xB170, 0x5F9B, 0xD54E, + 0x5F9C, 0xB175, 0x5F9E, 0xB171, 0x5F9F, 0xD550, 0x5FA0, 0xB174, + 0x5FA1, 0xB173, 0x5FA5, 0xD8F6, 0x5FA6, 0xD8F5, 0x5FA8, 0xB461, + 0x5FA9, 0xB45F, 0x5FAA, 0xB460, 0x5FAB, 0xD8F7, 0x5FAC, 0xB74B, + 0x5FAD, 0xDD64, 0x5FAE, 0xB74C, 0x5FAF, 0xDD63, 0x5FB2, 0xE577, + 0x5FB5, 0xBC78, 0x5FB6, 0xE1C1, 0x5FB7, 0xBC77, 0x5FB9, 0xB9FD, + 0x5FBB, 0xECDE, 0x5FBC, 0xE975, 0x5FBD, 0xC0B2, 0x5FBE, 0xECDD, + 0x5FBF, 0xF240, 0x5FC0, 0xF448, 0x5FC1, 0xF449, 0x5FC3, 0xA4DF, + 0x5FC5, 0xA5B2, 0x5FC9, 0xC97B, 0x5FCC, 0xA7D2, 0x5FCD, 0xA7D4, + 0x5FCF, 0xC9E2, 0x5FD0, 0xCAD8, 0x5FD1, 0xCAD7, 0x5FD2, 0xCAD6, + 0x5FD4, 0xC9E1, 0x5FD5, 0xC9E0, 0x5FD6, 0xA6A4, 0x5FD7, 0xA7D3, + 0x5FD8, 0xA7D1, 0x5FD9, 0xA6A3, 0x5FDD, 0xA9BD, 0x5FDE, 0xCC78, + 0x5FE0, 0xA9BE, 0x5FE1, 0xCADD, 0x5FE3, 0xCADF, 0x5FE4, 0xCADE, + 0x5FE5, 0xCC79, 0x5FE8, 0xCADA, 0x5FEA, 0xA7D8, 0x5FEB, 0xA7D6, + 0x5FED, 0xCAD9, 0x5FEE, 0xCADB, 0x5FEF, 0xCAE1, 0x5FF1, 0xA7D5, + 0x5FF3, 0xCADC, 0x5FF4, 0xCAE5, 0x5FF5, 0xA9C0, 0x5FF7, 0xCAE2, + 0x5FF8, 0xA7D7, 0x5FFA, 0xCAE0, 0x5FFB, 0xCAE3, 0x5FFD, 0xA9BF, + 0x5FFF, 0xA9C1, 0x6000, 0xCAE4, 0x6009, 0xCCAF, 0x600A, 0xCCA2, + 0x600B, 0xCC7E, 0x600C, 0xCCAE, 0x600D, 0xCCA9, 0x600E, 0xABE7, + 0x600F, 0xA9C2, 0x6010, 0xCCAA, 0x6011, 0xCCAD, 0x6012, 0xABE3, + 0x6013, 0xCCAC, 0x6014, 0xA9C3, 0x6015, 0xA9C8, 0x6016, 0xA9C6, + 0x6017, 0xCCA3, 0x6019, 0xCC7C, 0x601A, 0xCCA5, 0x601B, 0xA9CD, + 0x601C, 0xCCB0, 0x601D, 0xABE4, 0x601E, 0xCCA6, 0x6020, 0xABE5, + 0x6021, 0xA9C9, 0x6022, 0xCCA8, 0x6024, 0xCECD, 0x6025, 0xABE6, + 0x6026, 0xCC7B, 0x6027, 0xA9CA, 0x6028, 0xABE8, 0x6029, 0xA9CB, + 0x602A, 0xA9C7, 0x602B, 0xA9CC, 0x602C, 0xCCA7, 0x602D, 0xCC7A, + 0x602E, 0xCCAB, 0x602F, 0xA9C4, 0x6032, 0xCC7D, 0x6033, 0xCCA4, + 0x6034, 0xCCA1, 0x6035, 0xA9C5, 0x6037, 0xCEBF, 0x6039, 0xCEC0, + 0x6040, 0xCECA, 0x6041, 0xD1A1, 0x6042, 0xCECB, 0x6043, 0xABEE, + 0x6044, 0xCECE, 0x6045, 0xCEC4, 0x6046, 0xABED, 0x6047, 0xCEC6, + 0x6049, 0xCEC7, 0x604C, 0xCEC9, 0x604D, 0xABE9, 0x6050, 0xAEA3, + 0x6052, 0xF9DA, 0x6053, 0xCEC5, 0x6054, 0xCEC1, 0x6055, 0xAEA4, + 0x6058, 0xCECF, 0x6059, 0xAE7E, 0x605A, 0xD17D, 0x605B, 0xCEC8, + 0x605D, 0xD17C, 0x605E, 0xCEC3, 0x605F, 0xCECC, 0x6062, 0xABEC, + 0x6063, 0xAEA1, 0x6064, 0xABF2, 0x6065, 0xAEA2, 0x6066, 0xCED0, + 0x6067, 0xD17E, 0x6068, 0xABEB, 0x6069, 0xAEA6, 0x606A, 0xABF1, + 0x606B, 0xABF0, 0x606C, 0xABEF, 0x606D, 0xAEA5, 0x606E, 0xCED1, + 0x606F, 0xAEA7, 0x6070, 0xABEA, 0x6072, 0xCEC2, 0x607F, 0xB176, + 0x6080, 0xD1A4, 0x6081, 0xD1A6, 0x6083, 0xD1A8, 0x6084, 0xAEA8, + 0x6085, 0xAEAE, 0x6086, 0xD553, 0x6087, 0xD1AC, 0x6088, 0xD1A3, + 0x6089, 0xB178, 0x608A, 0xD551, 0x608C, 0xAEAD, 0x608D, 0xAEAB, + 0x608E, 0xD1AE, 0x6090, 0xD552, 0x6092, 0xD1A5, 0x6094, 0xAEAC, + 0x6095, 0xD1A9, 0x6096, 0xAEAF, 0x6097, 0xD1AB, 0x609A, 0xAEAA, + 0x609B, 0xD1AA, 0x609C, 0xD1AD, 0x609D, 0xD1A7, 0x609F, 0xAEA9, + 0x60A0, 0xB179, 0x60A2, 0xD1A2, 0x60A3, 0xB177, 0x60A8, 0xB17A, + 0x60B0, 0xD555, 0x60B1, 0xD55E, 0x60B2, 0xB464, 0x60B4, 0xB17C, + 0x60B5, 0xB1A3, 0x60B6, 0xB465, 0x60B7, 0xD560, 0x60B8, 0xB1AA, + 0x60B9, 0xD8F9, 0x60BA, 0xD556, 0x60BB, 0xB1A2, 0x60BC, 0xB1A5, + 0x60BD, 0xB17E, 0x60BE, 0xD554, 0x60BF, 0xD562, 0x60C0, 0xD565, + 0x60C1, 0xD949, 0x60C3, 0xD563, 0x60C4, 0xD8FD, 0x60C5, 0xB1A1, + 0x60C6, 0xB1A8, 0x60C7, 0xB1AC, 0x60C8, 0xD55D, 0x60C9, 0xD8F8, + 0x60CA, 0xD561, 0x60CB, 0xB17B, 0x60CC, 0xD8FA, 0x60CD, 0xD564, + 0x60CE, 0xD8FC, 0x60CF, 0xD559, 0x60D1, 0xB462, 0x60D3, 0xD557, + 0x60D4, 0xD558, 0x60D5, 0xB1A7, 0x60D8, 0xB1A6, 0x60D9, 0xD55B, + 0x60DA, 0xB1AB, 0x60DB, 0xD55F, 0x60DC, 0xB1A4, 0x60DD, 0xD55C, + 0x60DF, 0xB1A9, 0x60E0, 0xB466, 0x60E1, 0xB463, 0x60E2, 0xD8FB, + 0x60E4, 0xD55A, 0x60E6, 0xB17D, 0x60F0, 0xB46B, 0x60F1, 0xB46F, + 0x60F2, 0xD940, 0x60F3, 0xB751, 0x60F4, 0xB46D, 0x60F5, 0xD944, + 0x60F6, 0xB471, 0x60F7, 0xDD65, 0x60F8, 0xD946, 0x60F9, 0xB753, + 0x60FA, 0xB469, 0x60FB, 0xB46C, 0x60FC, 0xD947, 0x60FE, 0xD948, + 0x60FF, 0xD94E, 0x6100, 0xB473, 0x6101, 0xB754, 0x6103, 0xD94A, + 0x6104, 0xD94F, 0x6105, 0xD943, 0x6106, 0xB75E, 0x6108, 0xB755, + 0x6109, 0xB472, 0x610A, 0xD941, 0x610B, 0xD950, 0x610D, 0xB75D, + 0x610E, 0xB470, 0x610F, 0xB74E, 0x6110, 0xD94D, 0x6112, 0xB474, + 0x6113, 0xD945, 0x6114, 0xD8FE, 0x6115, 0xB46A, 0x6116, 0xD942, + 0x6118, 0xD94B, 0x611A, 0xB74D, 0x611B, 0xB752, 0x611C, 0xB467, + 0x611D, 0xD94C, 0x611F, 0xB750, 0x6123, 0xB468, 0x6127, 0xB75C, + 0x6128, 0xE1C3, 0x6129, 0xDD70, 0x612B, 0xDD68, 0x612C, 0xE1C2, + 0x612E, 0xDD6C, 0x612F, 0xDD6E, 0x6132, 0xDD6B, 0x6134, 0xB75B, + 0x6136, 0xDD6A, 0x6137, 0xB75F, 0x613B, 0xE1D2, 0x613E, 0xB75A, + 0x613F, 0xBA40, 0x6140, 0xDD71, 0x6141, 0xE1C4, 0x6144, 0xB758, + 0x6145, 0xDD69, 0x6146, 0xDD6D, 0x6147, 0xB9FE, 0x6148, 0xB74F, + 0x6149, 0xDD66, 0x614A, 0xDD67, 0x614B, 0xBA41, 0x614C, 0xB757, + 0x614D, 0xB759, 0x614E, 0xB756, 0x614F, 0xDD6F, 0x6152, 0xE1C8, + 0x6153, 0xE1C9, 0x6154, 0xE1CE, 0x6155, 0xBC7D, 0x6156, 0xE1D5, + 0x6158, 0xBA47, 0x615A, 0xBA46, 0x615B, 0xE1D0, 0x615D, 0xBC7C, + 0x615E, 0xE1C5, 0x615F, 0xBA45, 0x6161, 0xE1D4, 0x6162, 0xBA43, + 0x6163, 0xBA44, 0x6165, 0xE1D1, 0x6166, 0xE5AA, 0x6167, 0xBC7A, + 0x6168, 0xB46E, 0x616A, 0xE1D3, 0x616B, 0xBCA3, 0x616C, 0xE1CB, + 0x616E, 0xBC7B, 0x6170, 0xBCA2, 0x6171, 0xE1C6, 0x6172, 0xE1CA, + 0x6173, 0xE1C7, 0x6174, 0xE1CD, 0x6175, 0xBA48, 0x6176, 0xBC79, + 0x6177, 0xBA42, 0x6179, 0xE57A, 0x617A, 0xE1CF, 0x617C, 0xBCA1, + 0x617E, 0xBCA4, 0x6180, 0xE1CC, 0x6182, 0xBC7E, 0x6183, 0xE579, + 0x6189, 0xE57E, 0x618A, 0xBECE, 0x618B, 0xE578, 0x618C, 0xE9A3, + 0x618D, 0xE5A9, 0x618E, 0xBCA8, 0x6190, 0xBCA6, 0x6191, 0xBECC, + 0x6192, 0xE5A6, 0x6193, 0xE5A2, 0x6194, 0xBCAC, 0x6196, 0xE978, + 0x619A, 0xBCAA, 0x619B, 0xE5A1, 0x619D, 0xE976, 0x619F, 0xE5A5, + 0x61A1, 0xE5A8, 0x61A2, 0xE57D, 0x61A4, 0xBCAB, 0x61A7, 0xBCA5, + 0x61A8, 0xE977, 0x61A9, 0xBECD, 0x61AA, 0xE5A7, 0x61AB, 0xBCA7, + 0x61AC, 0xBCA9, 0x61AD, 0xE5A4, 0x61AE, 0xBCAD, 0x61AF, 0xE5A3, + 0x61B0, 0xE57C, 0x61B1, 0xE57B, 0x61B2, 0xBECB, 0x61B3, 0xE5AB, + 0x61B4, 0xE97A, 0x61B5, 0xECE0, 0x61B6, 0xBED0, 0x61B8, 0xE9A2, + 0x61BA, 0xE97E, 0x61BC, 0xECE1, 0x61BE, 0xBED1, 0x61BF, 0xE9A1, + 0x61C1, 0xE97C, 0x61C2, 0xC0B4, 0x61C3, 0xECDF, 0x61C5, 0xE979, + 0x61C6, 0xE97B, 0x61C7, 0xC0B5, 0x61C8, 0xBED3, 0x61C9, 0xC0B3, + 0x61CA, 0xBED2, 0x61CB, 0xC0B7, 0x61CC, 0xE97D, 0x61CD, 0xBECF, + 0x61D6, 0xEFCF, 0x61D8, 0xEFC7, 0x61DE, 0xECE7, 0x61DF, 0xEFC8, + 0x61E0, 0xECE3, 0x61E3, 0xC256, 0x61E4, 0xECE5, 0x61E5, 0xECE4, + 0x61E6, 0xC0B6, 0x61E7, 0xECE2, 0x61E8, 0xECE6, 0x61E9, 0xEFD0, + 0x61EA, 0xEFCC, 0x61EB, 0xEFCE, 0x61ED, 0xEFC9, 0x61EE, 0xEFCA, + 0x61F0, 0xEFCD, 0x61F1, 0xEFCB, 0x61F2, 0xC367, 0x61F5, 0xC36A, + 0x61F6, 0xC369, 0x61F7, 0xC368, 0x61F8, 0xC461, 0x61F9, 0xF44A, + 0x61FA, 0xC462, 0x61FB, 0xF241, 0x61FC, 0xC4DF, 0x61FD, 0xF5CC, + 0x61FE, 0xC4E0, 0x61FF, 0xC574, 0x6200, 0xC5CA, 0x6201, 0xF7D9, + 0x6203, 0xF7DA, 0x6204, 0xF7DB, 0x6207, 0xF9BA, 0x6208, 0xA4E0, + 0x6209, 0xC97C, 0x620A, 0xA5B3, 0x620C, 0xA6A6, 0x620D, 0xA6A7, + 0x620E, 0xA6A5, 0x6210, 0xA6A8, 0x6211, 0xA7DA, 0x6212, 0xA7D9, + 0x6214, 0xCCB1, 0x6215, 0xA9CF, 0x6216, 0xA9CE, 0x6219, 0xD1AF, + 0x621A, 0xB1AD, 0x621B, 0xB1AE, 0x621F, 0xB475, 0x6220, 0xDD72, + 0x6221, 0xB760, 0x6222, 0xB761, 0x6223, 0xDD74, 0x6224, 0xDD76, + 0x6225, 0xDD75, 0x6227, 0xE1D7, 0x6229, 0xE1D6, 0x622A, 0xBA49, + 0x622B, 0xE1D8, 0x622D, 0xE5AC, 0x622E, 0xBCAE, 0x6230, 0xBED4, + 0x6232, 0xC0B8, 0x6233, 0xC257, 0x6234, 0xC0B9, 0x6236, 0xA4E1, + 0x623A, 0xCAE6, 0x623D, 0xCCB2, 0x623E, 0xA9D1, 0x623F, 0xA9D0, + 0x6240, 0xA9D2, 0x6241, 0xABF3, 0x6242, 0xCED2, 0x6243, 0xCED3, + 0x6246, 0xD1B0, 0x6247, 0xAEB0, 0x6248, 0xB1AF, 0x6249, 0xB476, + 0x624A, 0xD951, 0x624B, 0xA4E2, 0x624D, 0xA47E, 0x624E, 0xA4E3, + 0x6250, 0xC97D, 0x6251, 0xA5B7, 0x6252, 0xA5B6, 0x6253, 0xA5B4, + 0x6254, 0xA5B5, 0x6258, 0xA6AB, 0x6259, 0xC9E9, 0x625A, 0xC9EB, + 0x625B, 0xA6AA, 0x625C, 0xC9E3, 0x625E, 0xC9E4, 0x6260, 0xC9EA, + 0x6261, 0xC9E6, 0x6262, 0xC9E8, 0x6263, 0xA6A9, 0x6264, 0xC9E5, + 0x6265, 0xC9EC, 0x6266, 0xC9E7, 0x626D, 0xA7E1, 0x626E, 0xA7EA, + 0x626F, 0xA7E8, 0x6270, 0xCAF0, 0x6271, 0xCAED, 0x6272, 0xCAF5, + 0x6273, 0xA7E6, 0x6274, 0xCAF6, 0x6276, 0xA7DF, 0x6277, 0xCAF3, + 0x6279, 0xA7E5, 0x627A, 0xCAEF, 0x627B, 0xCAEE, 0x627C, 0xA7E3, + 0x627D, 0xCAF4, 0x627E, 0xA7E4, 0x627F, 0xA9D3, 0x6280, 0xA7DE, + 0x6281, 0xCAF1, 0x6283, 0xCAE7, 0x6284, 0xA7DB, 0x6286, 0xA7EE, + 0x6287, 0xCAEC, 0x6288, 0xCAF2, 0x6289, 0xA7E0, 0x628A, 0xA7E2, + 0x628C, 0xCAE8, 0x628E, 0xCAE9, 0x628F, 0xCAEA, 0x6291, 0xA7ED, + 0x6292, 0xA7E7, 0x6293, 0xA7EC, 0x6294, 0xCAEB, 0x6295, 0xA7EB, + 0x6296, 0xA7DD, 0x6297, 0xA7DC, 0x6298, 0xA7E9, 0x62A8, 0xA9E1, + 0x62A9, 0xCCBE, 0x62AA, 0xCCB7, 0x62AB, 0xA9DC, 0x62AC, 0xA9EF, + 0x62AD, 0xCCB3, 0x62AE, 0xCCBA, 0x62AF, 0xCCBC, 0x62B0, 0xCCBF, + 0x62B1, 0xA9EA, 0x62B3, 0xCCBB, 0x62B4, 0xCCB4, 0x62B5, 0xA9E8, + 0x62B6, 0xCCB8, 0x62B8, 0xCCC0, 0x62B9, 0xA9D9, 0x62BB, 0xCCBD, + 0x62BC, 0xA9E3, 0x62BD, 0xA9E2, 0x62BE, 0xCCB6, 0x62BF, 0xA9D7, + 0x62C2, 0xA9D8, 0x62C4, 0xA9D6, 0x62C6, 0xA9EE, 0x62C7, 0xA9E6, + 0x62C8, 0xA9E0, 0x62C9, 0xA9D4, 0x62CA, 0xCCB9, 0x62CB, 0xA9DF, + 0x62CC, 0xA9D5, 0x62CD, 0xA9E7, 0x62CE, 0xA9F0, 0x62CF, 0xCED4, + 0x62D0, 0xA9E4, 0x62D1, 0xCCB5, 0x62D2, 0xA9DA, 0x62D3, 0xA9DD, + 0x62D4, 0xA9DE, 0x62D6, 0xA9EC, 0x62D7, 0xA9ED, 0x62D8, 0xA9EB, + 0x62D9, 0xA9E5, 0x62DA, 0xA9E9, 0x62DB, 0xA9DB, 0x62DC, 0xABF4, + 0x62EB, 0xCEDA, 0x62EC, 0xAC41, 0x62ED, 0xABF8, 0x62EE, 0xABFA, + 0x62EF, 0xAC40, 0x62F0, 0xCEE6, 0x62F1, 0xABFD, 0x62F2, 0xD1B1, + 0x62F3, 0xAEB1, 0x62F4, 0xAC43, 0x62F5, 0xCED7, 0x62F6, 0xCEDF, + 0x62F7, 0xABFE, 0x62F8, 0xCEDE, 0x62F9, 0xCEDB, 0x62FA, 0xCEE3, + 0x62FB, 0xCEE5, 0x62FC, 0xABF7, 0x62FD, 0xABFB, 0x62FE, 0xAC42, + 0x62FF, 0xAEB3, 0x6300, 0xCEE0, 0x6301, 0xABF9, 0x6302, 0xAC45, + 0x6303, 0xCED9, 0x6307, 0xABFC, 0x6308, 0xAEB2, 0x6309, 0xABF6, + 0x630B, 0xCED6, 0x630C, 0xCEDD, 0x630D, 0xCED5, 0x630E, 0xCED8, + 0x630F, 0xCEDC, 0x6310, 0xD1B2, 0x6311, 0xAC44, 0x6313, 0xCEE1, + 0x6314, 0xCEE2, 0x6315, 0xCEE4, 0x6316, 0xABF5, 0x6328, 0xAEC1, + 0x6329, 0xD1BE, 0x632A, 0xAEBF, 0x632B, 0xAEC0, 0x632C, 0xD1B4, + 0x632D, 0xD1C4, 0x632F, 0xAEB6, 0x6332, 0xD566, 0x6333, 0xD1C6, + 0x6334, 0xD1C0, 0x6336, 0xD1B7, 0x6338, 0xD1C9, 0x6339, 0xD1BA, + 0x633A, 0xAEBC, 0x633B, 0xD57D, 0x633C, 0xD1BD, 0x633D, 0xAEBE, + 0x633E, 0xAEB5, 0x6340, 0xD1CB, 0x6341, 0xD1BF, 0x6342, 0xAEB8, + 0x6343, 0xD1B8, 0x6344, 0xD1B5, 0x6345, 0xD1B6, 0x6346, 0xAEB9, + 0x6347, 0xD1C5, 0x6348, 0xD1CC, 0x6349, 0xAEBB, 0x634A, 0xD1BC, + 0x634B, 0xD1BB, 0x634C, 0xAEC3, 0x634D, 0xAEC2, 0x634E, 0xAEB4, + 0x634F, 0xAEBA, 0x6350, 0xAEBD, 0x6351, 0xD1C8, 0x6354, 0xD1C2, + 0x6355, 0xAEB7, 0x6356, 0xD1B3, 0x6357, 0xD1CA, 0x6358, 0xD1C1, + 0x6359, 0xD1C3, 0x635A, 0xD1C7, 0x6365, 0xD567, 0x6367, 0xB1B7, + 0x6368, 0xB1CB, 0x6369, 0xB1CA, 0x636B, 0xB1BF, 0x636D, 0xD579, + 0x636E, 0xD575, 0x636F, 0xD572, 0x6370, 0xD5A6, 0x6371, 0xB1BA, + 0x6372, 0xB1B2, 0x6375, 0xD577, 0x6376, 0xB4A8, 0x6377, 0xB1B6, + 0x6378, 0xD5A1, 0x637A, 0xB1CC, 0x637B, 0xB1C9, 0x637C, 0xD57B, + 0x637D, 0xD56A, 0x6380, 0xB1C8, 0x6381, 0xD5A3, 0x6382, 0xD569, + 0x6383, 0xB1BD, 0x6384, 0xB1C1, 0x6385, 0xD5A2, 0x6387, 0xD573, + 0x6388, 0xB1C2, 0x6389, 0xB1BC, 0x638A, 0xD568, 0x638C, 0xB478, + 0x638D, 0xD5A5, 0x638E, 0xD571, 0x638F, 0xB1C7, 0x6390, 0xD574, + 0x6391, 0xD5A4, 0x6392, 0xB1C6, 0x6394, 0xD952, 0x6396, 0xB1B3, + 0x6397, 0xD56F, 0x6398, 0xB1B8, 0x6399, 0xB1C3, 0x639B, 0xB1BE, + 0x639C, 0xD578, 0x639D, 0xD56E, 0x639E, 0xD56C, 0x639F, 0xD57E, + 0x63A0, 0xB1B0, 0x63A1, 0xB1C4, 0x63A2, 0xB1B4, 0x63A3, 0xB477, + 0x63A4, 0xD57C, 0x63A5, 0xB1B5, 0x63A7, 0xB1B1, 0x63A8, 0xB1C0, + 0x63A9, 0xB1BB, 0x63AA, 0xB1B9, 0x63AB, 0xD570, 0x63AC, 0xB1C5, + 0x63AD, 0xD56D, 0x63AE, 0xD57A, 0x63AF, 0xD576, 0x63B0, 0xD954, + 0x63B1, 0xD953, 0x63BD, 0xD56B, 0x63BE, 0xD964, 0x63C0, 0xB47A, + 0x63C2, 0xD96A, 0x63C3, 0xD959, 0x63C4, 0xD967, 0x63C5, 0xDD77, + 0x63C6, 0xB47D, 0x63C7, 0xD96B, 0x63C8, 0xD96E, 0x63C9, 0xB47C, + 0x63CA, 0xD95C, 0x63CB, 0xD96D, 0x63CC, 0xD96C, 0x63CD, 0xB47E, + 0x63CE, 0xD955, 0x63CF, 0xB479, 0x63D0, 0xB4A3, 0x63D2, 0xB4A1, + 0x63D3, 0xD969, 0x63D5, 0xD95F, 0x63D6, 0xB4A5, 0x63D7, 0xD970, + 0x63D8, 0xD968, 0x63D9, 0xD971, 0x63DA, 0xB4AD, 0x63DB, 0xB4AB, + 0x63DC, 0xD966, 0x63DD, 0xD965, 0x63DF, 0xD963, 0x63E0, 0xD95D, + 0x63E1, 0xB4A4, 0x63E3, 0xB4A2, 0x63E4, 0xD1B9, 0x63E5, 0xD956, + 0x63E7, 0xDDB7, 0x63E8, 0xD957, 0x63E9, 0xB47B, 0x63EA, 0xB4AA, + 0x63EB, 0xDD79, 0x63ED, 0xB4A6, 0x63EE, 0xB4A7, 0x63EF, 0xD958, + 0x63F0, 0xD96F, 0x63F1, 0xDD78, 0x63F2, 0xD960, 0x63F3, 0xD95B, + 0x63F4, 0xB4A9, 0x63F5, 0xD961, 0x63F6, 0xD95E, 0x63F9, 0xB4AE, + 0x6406, 0xB770, 0x6409, 0xDD7C, 0x640A, 0xDDB1, 0x640B, 0xDDB6, + 0x640C, 0xDDAA, 0x640D, 0xB76C, 0x640E, 0xDDBB, 0x640F, 0xB769, + 0x6410, 0xDD7A, 0x6412, 0xDD7B, 0x6413, 0xB762, 0x6414, 0xB76B, + 0x6415, 0xDDA4, 0x6416, 0xB76E, 0x6417, 0xB76F, 0x6418, 0xDDA5, + 0x641A, 0xDDB2, 0x641B, 0xDDB8, 0x641C, 0xB76A, 0x641E, 0xB764, + 0x641F, 0xDDA3, 0x6420, 0xDD7D, 0x6421, 0xDDBA, 0x6422, 0xDDA8, + 0x6423, 0xDDA9, 0x6424, 0xDD7E, 0x6425, 0xDDB4, 0x6426, 0xDDAB, + 0x6427, 0xDDB5, 0x6428, 0xDDAD, 0x642A, 0xB765, 0x642B, 0xE1D9, + 0x642C, 0xB768, 0x642D, 0xB766, 0x642E, 0xDDB9, 0x642F, 0xDDB0, + 0x6430, 0xDDAC, 0x6433, 0xDDA1, 0x6434, 0xBA53, 0x6435, 0xDDAF, + 0x6436, 0xB76D, 0x6437, 0xDDA7, 0x6439, 0xDDA6, 0x643D, 0xB767, + 0x643E, 0xB763, 0x643F, 0xE1EE, 0x6440, 0xDDB3, 0x6441, 0xDDAE, + 0x6443, 0xDDA2, 0x644B, 0xE1E9, 0x644D, 0xE1DA, 0x644E, 0xE1E5, + 0x6450, 0xE1EC, 0x6451, 0xBA51, 0x6452, 0xB4AC, 0x6453, 0xE1EA, + 0x6454, 0xBA4C, 0x6458, 0xBA4B, 0x6459, 0xE1F1, 0x645B, 0xE1DB, + 0x645C, 0xE1E8, 0x645D, 0xE1DC, 0x645E, 0xE1E7, 0x645F, 0xBA4F, + 0x6460, 0xE1EB, 0x6461, 0xD962, 0x6465, 0xE1F2, 0x6466, 0xE1E3, + 0x6467, 0xBA52, 0x6468, 0xE5BA, 0x6469, 0xBCAF, 0x646B, 0xE1F0, + 0x646C, 0xE1EF, 0x646D, 0xBA54, 0x646E, 0xE5AD, 0x646F, 0xBCB0, + 0x6470, 0xE5AE, 0x6472, 0xE1DF, 0x6473, 0xE1E0, 0x6474, 0xE1DD, + 0x6475, 0xE1E2, 0x6476, 0xE1DE, 0x6477, 0xE1F3, 0x6478, 0xBA4E, + 0x6479, 0xBCB1, 0x647A, 0xBA50, 0x647B, 0xBA55, 0x647D, 0xE1E1, + 0x647F, 0xE1ED, 0x6482, 0xE1E6, 0x6485, 0xE5B1, 0x6487, 0xBA4A, + 0x6488, 0xBCB4, 0x6489, 0xE9AA, 0x648A, 0xE5B6, 0x648B, 0xE5B5, + 0x648C, 0xE5B7, 0x648F, 0xE5B4, 0x6490, 0xBCB5, 0x6492, 0xBCBB, + 0x6493, 0xBCB8, 0x6495, 0xBCB9, 0x6496, 0xE5AF, 0x6497, 0xE5B2, + 0x6498, 0xE5BC, 0x6499, 0xBCC1, 0x649A, 0xBCBF, 0x649C, 0xE5B3, + 0x649D, 0xD95A, 0x649E, 0xBCB2, 0x649F, 0xE5B9, 0x64A0, 0xE5B0, + 0x64A2, 0xBCC2, 0x64A3, 0xE5B8, 0x64A4, 0xBA4D, 0x64A5, 0xBCB7, + 0x64A6, 0xE1E4, 0x64A9, 0xBCBA, 0x64AB, 0xBCBE, 0x64AC, 0xBCC0, + 0x64AD, 0xBCBD, 0x64AE, 0xBCBC, 0x64B0, 0xBCB6, 0x64B1, 0xE5BB, + 0x64B2, 0xBCB3, 0x64B3, 0xBCC3, 0x64BB, 0xBED8, 0x64BC, 0xBED9, + 0x64BD, 0xE9A9, 0x64BE, 0xBEE2, 0x64BF, 0xBEDF, 0x64C1, 0xBED6, + 0x64C2, 0xBEDD, 0x64C3, 0xE9AB, 0x64C4, 0xBEDB, 0x64C5, 0xBED5, + 0x64C7, 0xBEDC, 0x64C9, 0xE9A8, 0x64CA, 0xC0BB, 0x64CB, 0xBED7, + 0x64CD, 0xBEDE, 0x64CE, 0xC0BA, 0x64CF, 0xE9A7, 0x64D0, 0xE9A6, + 0x64D2, 0xBEE0, 0x64D4, 0xBEE1, 0x64D6, 0xE9A5, 0x64D7, 0xE9A4, + 0x64D8, 0xC0BC, 0x64D9, 0xE9AE, 0x64DA, 0xBEDA, 0x64DB, 0xE9AC, + 0x64E0, 0xC0BD, 0x64E2, 0xC0C2, 0x64E3, 0xECEA, 0x64E4, 0xECEC, + 0x64E6, 0xC0BF, 0x64E8, 0xECED, 0x64E9, 0xECE9, 0x64EB, 0xECEB, + 0x64EC, 0xC0C0, 0x64ED, 0xC0C3, 0x64EF, 0xECE8, 0x64F0, 0xC0BE, + 0x64F1, 0xC0C1, 0x64F2, 0xC259, 0x64F3, 0xE9AD, 0x64F4, 0xC258, + 0x64F7, 0xC25E, 0x64F8, 0xEFD4, 0x64FA, 0xC25C, 0x64FB, 0xC25D, + 0x64FC, 0xEFD7, 0x64FD, 0xEFD3, 0x64FE, 0xC25A, 0x64FF, 0xEFD1, + 0x6500, 0xC36B, 0x6501, 0xEFD5, 0x6503, 0xEFD6, 0x6504, 0xEFD2, + 0x6506, 0xC25B, 0x6507, 0xF242, 0x6509, 0xF245, 0x650C, 0xF246, + 0x650D, 0xF244, 0x650E, 0xF247, 0x650F, 0xC36C, 0x6510, 0xF243, + 0x6513, 0xF44E, 0x6514, 0xC464, 0x6515, 0xF44D, 0x6516, 0xF44C, + 0x6517, 0xF44B, 0x6518, 0xC463, 0x6519, 0xC465, 0x651B, 0xF5CD, + 0x651C, 0xC4E2, 0x651D, 0xC4E1, 0x6520, 0xF6E1, 0x6521, 0xF6E0, + 0x6522, 0xF6E3, 0x6523, 0xC5CB, 0x6524, 0xC575, 0x6525, 0xF7DD, + 0x6526, 0xF6E2, 0x6529, 0xF7DC, 0x652A, 0xC5CD, 0x652B, 0xC5CC, + 0x652C, 0xC5F3, 0x652D, 0xF8A9, 0x652E, 0xF8EF, 0x652F, 0xA4E4, + 0x6532, 0xD972, 0x6533, 0xE9AF, 0x6536, 0xA6AC, 0x6537, 0xCAF7, + 0x6538, 0xA7F1, 0x6539, 0xA7EF, 0x653B, 0xA7F0, 0x653D, 0xCCC1, + 0x653E, 0xA9F1, 0x653F, 0xAC46, 0x6541, 0xCEE7, 0x6543, 0xCEE8, + 0x6545, 0xAC47, 0x6546, 0xD1CE, 0x6548, 0xAEC4, 0x6549, 0xAEC5, + 0x654A, 0xD1CD, 0x654F, 0xB1D3, 0x6551, 0xB1CF, 0x6553, 0xD5A7, + 0x6554, 0xB1D6, 0x6555, 0xB1D5, 0x6556, 0xB1CE, 0x6557, 0xB1D1, + 0x6558, 0xB1D4, 0x6559, 0xB1D0, 0x655C, 0xD976, 0x655D, 0xB1CD, + 0x655E, 0xB4AF, 0x6562, 0xB4B1, 0x6563, 0xB4B2, 0x6564, 0xD975, + 0x6565, 0xD978, 0x6566, 0xB4B0, 0x6567, 0xD973, 0x6568, 0xD977, + 0x656A, 0xD974, 0x656C, 0xB771, 0x656F, 0xDDBC, 0x6572, 0xBA56, + 0x6573, 0xE1F4, 0x6574, 0xBEE3, 0x6575, 0xBCC4, 0x6576, 0xE5BD, + 0x6577, 0xBCC5, 0x6578, 0xBCC6, 0x6579, 0xE5BF, 0x657A, 0xE5BE, + 0x657B, 0xE5C0, 0x657C, 0xE9B1, 0x657F, 0xE9B0, 0x6580, 0xECEF, + 0x6581, 0xECEE, 0x6582, 0xC0C4, 0x6583, 0xC0C5, 0x6584, 0xF248, + 0x6587, 0xA4E5, 0x658C, 0xD979, 0x6590, 0xB4B4, 0x6591, 0xB4B3, + 0x6592, 0xDDBD, 0x6594, 0xEFD8, 0x6595, 0xC4E3, 0x6596, 0xF7DE, + 0x6597, 0xA4E6, 0x6599, 0xAEC6, 0x659B, 0xB1D8, 0x659C, 0xB1D7, + 0x659D, 0xD97A, 0x659E, 0xD97B, 0x659F, 0xB772, 0x65A0, 0xE1F5, + 0x65A1, 0xBA57, 0x65A2, 0xE9B2, 0x65A4, 0xA4E7, 0x65A5, 0xA5B8, + 0x65A7, 0xA9F2, 0x65A8, 0xCCC2, 0x65AA, 0xCEE9, 0x65AB, 0xAC48, + 0x65AC, 0xB1D9, 0x65AE, 0xD97C, 0x65AF, 0xB4B5, 0x65B0, 0xB773, + 0x65B2, 0xE5C1, 0x65B3, 0xE5C2, 0x65B6, 0xECF0, 0x65B7, 0xC25F, + 0x65B8, 0xF8F0, 0x65B9, 0xA4E8, 0x65BB, 0xCCC3, 0x65BC, 0xA9F3, + 0x65BD, 0xAC49, 0x65BF, 0xCEEA, 0x65C1, 0xAEC7, 0x65C2, 0xD1D2, + 0x65C3, 0xD1D0, 0x65C4, 0xD1D1, 0x65C5, 0xAEC8, 0x65C6, 0xD1CF, + 0x65CB, 0xB1DB, 0x65CC, 0xB1DC, 0x65CD, 0xD5A8, 0x65CE, 0xB1DD, + 0x65CF, 0xB1DA, 0x65D0, 0xD97D, 0x65D2, 0xD97E, 0x65D3, 0xDDBE, + 0x65D6, 0xBA59, 0x65D7, 0xBA58, 0x65DA, 0xECF1, 0x65DB, 0xEFD9, + 0x65DD, 0xF24A, 0x65DE, 0xF249, 0x65DF, 0xF44F, 0x65E1, 0xC95E, + 0x65E2, 0xAC4A, 0x65E5, 0xA4E9, 0x65E6, 0xA5B9, 0x65E8, 0xA6AE, + 0x65E9, 0xA6AD, 0x65EC, 0xA6AF, 0x65ED, 0xA6B0, 0x65EE, 0xC9EE, + 0x65EF, 0xC9ED, 0x65F0, 0xCAF8, 0x65F1, 0xA7F2, 0x65F2, 0xCAFB, + 0x65F3, 0xCAFA, 0x65F4, 0xCAF9, 0x65F5, 0xCAFC, 0x65FA, 0xA9F4, + 0x65FB, 0xCCC9, 0x65FC, 0xCCC5, 0x65FD, 0xCCCE, 0x6600, 0xA9FB, + 0x6602, 0xA9F9, 0x6603, 0xCCCA, 0x6604, 0xCCC6, 0x6605, 0xCCCD, + 0x6606, 0xA9F8, 0x6607, 0xAA40, 0x6608, 0xCCC8, 0x6609, 0xCCC4, + 0x660A, 0xA9FE, 0x660B, 0xCCCB, 0x660C, 0xA9F7, 0x660D, 0xCCCC, + 0x660E, 0xA9FA, 0x660F, 0xA9FC, 0x6610, 0xCCD0, 0x6611, 0xCCCF, + 0x6612, 0xCCC7, 0x6613, 0xA9F6, 0x6614, 0xA9F5, 0x6615, 0xA9FD, + 0x661C, 0xCEEF, 0x661D, 0xCEF5, 0x661F, 0xAC50, 0x6620, 0xAC4D, + 0x6621, 0xCEEC, 0x6622, 0xCEF1, 0x6624, 0xAC53, 0x6625, 0xAC4B, + 0x6626, 0xCEF0, 0x6627, 0xAC4E, 0x6628, 0xAC51, 0x662B, 0xCEF3, + 0x662D, 0xAC4C, 0x662E, 0xCEF8, 0x662F, 0xAC4F, 0x6631, 0xAC52, + 0x6632, 0xCEED, 0x6633, 0xCEF2, 0x6634, 0xCEF6, 0x6635, 0xCEEE, + 0x6636, 0xCEEB, 0x6639, 0xCEF7, 0x663A, 0xCEF4, 0x6641, 0xAED0, + 0x6642, 0xAEC9, 0x6643, 0xAECC, 0x6645, 0xAECF, 0x6647, 0xD1D5, + 0x6649, 0xAECA, 0x664A, 0xD1D3, 0x664C, 0xAECE, 0x664F, 0xAECB, + 0x6651, 0xD1D6, 0x6652, 0xAECD, 0x6659, 0xD5AC, 0x665A, 0xB1DF, + 0x665B, 0xD5AB, 0x665C, 0xD5AD, 0x665D, 0xB1DE, 0x665E, 0xB1E3, + 0x665F, 0xD1D4, 0x6661, 0xD5AA, 0x6662, 0xD5AE, 0x6664, 0xB1E0, + 0x6665, 0xD5A9, 0x6666, 0xB1E2, 0x6668, 0xB1E1, 0x666A, 0xD9A7, + 0x666C, 0xD9A2, 0x666E, 0xB4B6, 0x666F, 0xB4BA, 0x6670, 0xB4B7, + 0x6671, 0xD9A5, 0x6672, 0xD9A8, 0x6674, 0xB4B8, 0x6676, 0xB4B9, + 0x6677, 0xB4BE, 0x6678, 0xDDC7, 0x6679, 0xD9A6, 0x667A, 0xB4BC, + 0x667B, 0xD9A3, 0x667C, 0xD9A1, 0x667E, 0xB4BD, 0x6680, 0xD9A4, + 0x6684, 0xB779, 0x6686, 0xDDBF, 0x6687, 0xB776, 0x6688, 0xB777, + 0x6689, 0xB775, 0x668A, 0xDDC4, 0x668B, 0xDDC3, 0x668C, 0xDDC0, + 0x668D, 0xB77B, 0x6690, 0xDDC2, 0x6691, 0xB4BB, 0x6694, 0xDDC6, + 0x6695, 0xDDC1, 0x6696, 0xB778, 0x6697, 0xB774, 0x6698, 0xB77A, + 0x6699, 0xDDC5, 0x669D, 0xBA5C, 0x669F, 0xE1F8, 0x66A0, 0xE1F7, + 0x66A1, 0xE1F6, 0x66A2, 0xBA5A, 0x66A8, 0xBA5B, 0x66A9, 0xE5C5, + 0x66AA, 0xE5C8, 0x66AB, 0xBCC8, 0x66AE, 0xBCC7, 0x66AF, 0xE5C9, + 0x66B0, 0xE5C4, 0x66B1, 0xBCCA, 0x66B2, 0xE5C6, 0x66B4, 0xBCC9, + 0x66B5, 0xE5C3, 0x66B7, 0xE5C7, 0x66B8, 0xBEE9, 0x66B9, 0xBEE6, + 0x66BA, 0xE9BB, 0x66BB, 0xE9BA, 0x66BD, 0xE9B9, 0x66BE, 0xE9B4, + 0x66C0, 0xE9B5, 0x66C4, 0xBEE7, 0x66C6, 0xBEE4, 0x66C7, 0xBEE8, + 0x66C8, 0xE9B3, 0x66C9, 0xBEE5, 0x66CA, 0xE9B6, 0x66CB, 0xE9B7, + 0x66CC, 0xE9BC, 0x66CF, 0xE9B8, 0x66D2, 0xECF2, 0x66D6, 0xC0C7, + 0x66D8, 0xEFDC, 0x66D9, 0xC0C6, 0x66DA, 0xEFDA, 0x66DB, 0xEFDB, + 0x66DC, 0xC260, 0x66DD, 0xC36E, 0x66DE, 0xF24B, 0x66E0, 0xC36D, + 0x66E3, 0xF451, 0x66E4, 0xF452, 0x66E6, 0xC466, 0x66E8, 0xF450, + 0x66E9, 0xC4E4, 0x66EB, 0xF7DF, 0x66EC, 0xC5CE, 0x66ED, 0xF8AA, + 0x66EE, 0xF8AB, 0x66F0, 0xA4EA, 0x66F2, 0xA6B1, 0x66F3, 0xA6B2, + 0x66F4, 0xA7F3, 0x66F6, 0xCCD1, 0x66F7, 0xAC54, 0x66F8, 0xAED1, + 0x66F9, 0xB1E4, 0x66FC, 0xB0D2, 0x66FE, 0xB4BF, 0x66FF, 0xB4C0, + 0x6700, 0xB3CC, 0x6701, 0xD9A9, 0x6703, 0xB77C, 0x6704, 0xE1FA, + 0x6705, 0xE1F9, 0x6708, 0xA4EB, 0x6709, 0xA6B3, 0x670A, 0xCCD2, + 0x670B, 0xAA42, 0x670D, 0xAA41, 0x670F, 0xCEF9, 0x6710, 0xCEFA, + 0x6712, 0xD1D7, 0x6713, 0xD1D8, 0x6714, 0xAED2, 0x6715, 0xAED3, + 0x6717, 0xAED4, 0x6718, 0xD5AF, 0x671B, 0xB1E6, 0x671D, 0xB4C2, + 0x671F, 0xB4C1, 0x6720, 0xDDC8, 0x6721, 0xDF7A, 0x6722, 0xE1FB, + 0x6723, 0xE9BD, 0x6726, 0xC261, 0x6727, 0xC467, 0x6728, 0xA4EC, + 0x672A, 0xA5BC, 0x672B, 0xA5BD, 0x672C, 0xA5BB, 0x672D, 0xA5BE, + 0x672E, 0xA5BA, 0x6731, 0xA6B6, 0x6733, 0xC9F6, 0x6734, 0xA6B5, + 0x6735, 0xA6B7, 0x6738, 0xC9F1, 0x6739, 0xC9F0, 0x673A, 0xC9F3, + 0x673B, 0xC9F2, 0x673C, 0xC9F5, 0x673D, 0xA6B4, 0x673E, 0xC9EF, + 0x673F, 0xC9F4, 0x6745, 0xCAFD, 0x6746, 0xA7FD, 0x6747, 0xCAFE, + 0x6748, 0xCB43, 0x6749, 0xA7FC, 0x674B, 0xCB47, 0x674C, 0xCB42, + 0x674D, 0xCB45, 0x674E, 0xA7F5, 0x674F, 0xA7F6, 0x6750, 0xA7F7, + 0x6751, 0xA7F8, 0x6753, 0xA840, 0x6755, 0xCB41, 0x6756, 0xA7FA, + 0x6757, 0xA841, 0x6759, 0xCB40, 0x675A, 0xCB46, 0x675C, 0xA7F9, + 0x675D, 0xCB44, 0x675E, 0xA7FB, 0x675F, 0xA7F4, 0x6760, 0xA7FE, + 0x676A, 0xAA57, 0x676C, 0xCCD4, 0x676D, 0xAA43, 0x676F, 0xAA4D, + 0x6770, 0xAA4E, 0x6771, 0xAA46, 0x6772, 0xAA58, 0x6773, 0xAA48, + 0x6774, 0xCCDC, 0x6775, 0xAA53, 0x6776, 0xCCD7, 0x6777, 0xAA49, + 0x6778, 0xCCE6, 0x6779, 0xCCE7, 0x677A, 0xCCDF, 0x677B, 0xCCD8, + 0x677C, 0xAA56, 0x677D, 0xCCE4, 0x677E, 0xAA51, 0x677F, 0xAA4F, + 0x6781, 0xCCE5, 0x6783, 0xCCE3, 0x6784, 0xCCDB, 0x6785, 0xCCD3, + 0x6786, 0xCCDA, 0x6787, 0xAA4A, 0x6789, 0xAA50, 0x678B, 0xAA44, + 0x678C, 0xCCDE, 0x678D, 0xCCDD, 0x678E, 0xCCD5, 0x6790, 0xAA52, + 0x6791, 0xCCE1, 0x6792, 0xCCD6, 0x6793, 0xAA55, 0x6794, 0xCCE8, + 0x6795, 0xAA45, 0x6797, 0xAA4C, 0x6798, 0xCCD9, 0x6799, 0xCCE2, + 0x679A, 0xAA54, 0x679C, 0xAA47, 0x679D, 0xAA4B, 0x679F, 0xCCE0, + 0x67AE, 0xCF5B, 0x67AF, 0xAC5C, 0x67B0, 0xAC69, 0x67B2, 0xCF56, + 0x67B3, 0xCF4C, 0x67B4, 0xAC62, 0x67B5, 0xCF4A, 0x67B6, 0xAC5B, + 0x67B7, 0xCF45, 0x67B8, 0xAC65, 0x67B9, 0xCF52, 0x67BA, 0xCEFE, + 0x67BB, 0xCF41, 0x67C0, 0xCF44, 0x67C1, 0xCEFB, 0x67C2, 0xCF51, + 0x67C3, 0xCF61, 0x67C4, 0xAC60, 0x67C5, 0xCF46, 0x67C6, 0xCF58, + 0x67C8, 0xCEFD, 0x67C9, 0xCF5F, 0x67CA, 0xCF60, 0x67CB, 0xCF63, + 0x67CC, 0xCF5A, 0x67CD, 0xCF4B, 0x67CE, 0xCF53, 0x67CF, 0xAC66, + 0x67D0, 0xAC59, 0x67D1, 0xAC61, 0x67D2, 0xAC6D, 0x67D3, 0xAC56, + 0x67D4, 0xAC58, 0x67D8, 0xCF43, 0x67D9, 0xAC6A, 0x67DA, 0xAC63, + 0x67DB, 0xCF5D, 0x67DC, 0xCF40, 0x67DD, 0xAC6C, 0x67DE, 0xAC67, + 0x67DF, 0xCF49, 0x67E2, 0xAC6B, 0x67E3, 0xCF50, 0x67E4, 0xCF48, + 0x67E5, 0xAC64, 0x67E6, 0xCF5C, 0x67E7, 0xCF54, 0x67E9, 0xAC5E, + 0x67EA, 0xCF62, 0x67EB, 0xCF47, 0x67EC, 0xAC5A, 0x67ED, 0xCF59, + 0x67EE, 0xCF4F, 0x67EF, 0xAC5F, 0x67F0, 0xCF55, 0x67F1, 0xAC57, + 0x67F2, 0xCEFC, 0x67F3, 0xAC68, 0x67F4, 0xAEE3, 0x67F5, 0xAC5D, + 0x67F6, 0xCF4E, 0x67F7, 0xCF4D, 0x67F8, 0xCF42, 0x67FA, 0xCF5E, + 0x67FC, 0xCF57, 0x67FF, 0xAC55, 0x6812, 0xD1EC, 0x6813, 0xAEEA, + 0x6814, 0xD1ED, 0x6816, 0xD1E1, 0x6817, 0xAEDF, 0x6818, 0xAEEB, + 0x681A, 0xD1DA, 0x681C, 0xD1E3, 0x681D, 0xD1EB, 0x681F, 0xD1D9, + 0x6820, 0xD1F4, 0x6821, 0xAED5, 0x6825, 0xD1F3, 0x6826, 0xD1EE, + 0x6828, 0xD1EF, 0x6829, 0xAEDD, 0x682A, 0xAEE8, 0x682B, 0xD1E5, + 0x682D, 0xD1E6, 0x682E, 0xD1F0, 0x682F, 0xD1E7, 0x6831, 0xD1E2, + 0x6832, 0xD1DC, 0x6833, 0xD1DD, 0x6834, 0xD1EA, 0x6835, 0xD1E4, + 0x6838, 0xAED6, 0x6839, 0xAEDA, 0x683A, 0xD1F2, 0x683B, 0xD1DE, + 0x683C, 0xAEE6, 0x683D, 0xAEE2, 0x6840, 0xAEE5, 0x6841, 0xAEEC, + 0x6842, 0xAEDB, 0x6843, 0xAEE7, 0x6844, 0xD1E9, 0x6845, 0xAEE9, + 0x6846, 0xAED8, 0x6848, 0xAED7, 0x6849, 0xD1DB, 0x684B, 0xD1DF, + 0x684C, 0xAEE0, 0x684D, 0xD1F1, 0x684E, 0xD1E8, 0x684F, 0xD1E0, + 0x6850, 0xAEE4, 0x6851, 0xAEE1, 0x6853, 0xAED9, 0x6854, 0xAEDC, + 0x686B, 0xD5C4, 0x686D, 0xD5B4, 0x686E, 0xD5B5, 0x686F, 0xD5B9, + 0x6871, 0xD5C8, 0x6872, 0xD5C5, 0x6874, 0xD5BE, 0x6875, 0xD5BD, + 0x6876, 0xB1ED, 0x6877, 0xD5C1, 0x6878, 0xD5D0, 0x6879, 0xD5B0, + 0x687B, 0xD5D1, 0x687C, 0xD5C3, 0x687D, 0xD5D5, 0x687E, 0xD5C9, + 0x687F, 0xB1EC, 0x6880, 0xD5C7, 0x6881, 0xB1E7, 0x6882, 0xB1FC, + 0x6883, 0xB1F2, 0x6885, 0xB1F6, 0x6886, 0xB1F5, 0x6887, 0xD5B1, + 0x6889, 0xD5CE, 0x688A, 0xD5D4, 0x688B, 0xD5CC, 0x688C, 0xD5D3, + 0x688F, 0xD5C0, 0x6890, 0xD5B2, 0x6891, 0xD5D2, 0x6892, 0xD5C2, + 0x6893, 0xB1EA, 0x6894, 0xB1F7, 0x6896, 0xD5CB, 0x6897, 0xB1F0, + 0x689B, 0xD5CA, 0x689C, 0xD5B3, 0x689D, 0xB1F8, 0x689F, 0xB1FA, + 0x68A0, 0xD5CD, 0x68A1, 0xB1FB, 0x68A2, 0xB1E9, 0x68A3, 0xD5BA, + 0x68A4, 0xD5CF, 0x68A7, 0xB1EF, 0x68A8, 0xB1F9, 0x68A9, 0xD5BC, + 0x68AA, 0xD5C6, 0x68AB, 0xD5B7, 0x68AC, 0xD5BB, 0x68AD, 0xB1F4, + 0x68AE, 0xD5B6, 0x68AF, 0xB1E8, 0x68B0, 0xB1F1, 0x68B1, 0xB1EE, + 0x68B2, 0xD5BF, 0x68B3, 0xAEDE, 0x68B4, 0xD9C0, 0x68B5, 0xB1EB, + 0x68C4, 0xB1F3, 0x68C6, 0xD9C3, 0x68C7, 0xD9D9, 0x68C8, 0xD9CE, + 0x68C9, 0xB4D6, 0x68CB, 0xB4D1, 0x68CC, 0xD9BD, 0x68CD, 0xB4D2, + 0x68CE, 0xD9CD, 0x68D0, 0xD9C6, 0x68D1, 0xD9D3, 0x68D2, 0xB4CE, + 0x68D3, 0xD9AB, 0x68D4, 0xD9D5, 0x68D5, 0xB4C4, 0x68D6, 0xD9B3, + 0x68D7, 0xB4C7, 0x68D8, 0xB4C6, 0x68DA, 0xB4D7, 0x68DC, 0xD9AD, + 0x68DD, 0xD9CF, 0x68DE, 0xD9D0, 0x68DF, 0xB4C9, 0x68E0, 0xB4C5, + 0x68E1, 0xD9BB, 0x68E3, 0xB4D0, 0x68E4, 0xD9B6, 0x68E6, 0xD9D1, + 0x68E7, 0xB4CC, 0x68E8, 0xD9C9, 0x68E9, 0xD9D6, 0x68EA, 0xD9B0, + 0x68EB, 0xD9B5, 0x68EC, 0xD9AF, 0x68EE, 0xB4CB, 0x68EF, 0xD9C2, + 0x68F0, 0xDDDE, 0x68F1, 0xD9B1, 0x68F2, 0xB4CF, 0x68F3, 0xD9BA, + 0x68F4, 0xD9D2, 0x68F5, 0xB4CA, 0x68F6, 0xD9B7, 0x68F7, 0xD9B4, + 0x68F8, 0xD9C5, 0x68F9, 0xB4CD, 0x68FA, 0xB4C3, 0x68FB, 0xB4D9, + 0x68FC, 0xD9C8, 0x68FD, 0xD9C7, 0x6904, 0xD9AC, 0x6905, 0xB4C8, + 0x6906, 0xD9D4, 0x6907, 0xD9BC, 0x6908, 0xD9BE, 0x690A, 0xD9CB, + 0x690B, 0xD9CA, 0x690C, 0xD9AA, 0x690D, 0xB4D3, 0x690E, 0xB4D5, + 0x690F, 0xD9B2, 0x6910, 0xD9B9, 0x6911, 0xD9C1, 0x6912, 0xB4D4, + 0x6913, 0xD9B8, 0x6914, 0xD9C4, 0x6915, 0xD9D7, 0x6917, 0xD9CC, + 0x6925, 0xD9D8, 0x692A, 0xD9AE, 0x692F, 0xDDF2, 0x6930, 0xB7A6, + 0x6932, 0xDDF0, 0x6933, 0xDDDB, 0x6934, 0xDDE0, 0x6935, 0xDDD9, + 0x6937, 0xDDEC, 0x6938, 0xDDCB, 0x6939, 0xDDD2, 0x693B, 0xDDEA, + 0x693C, 0xDDF4, 0x693D, 0xDDDC, 0x693F, 0xDDCF, 0x6940, 0xDDE2, + 0x6941, 0xDDE7, 0x6942, 0xDDD3, 0x6944, 0xDDE4, 0x6945, 0xDDD0, + 0x6948, 0xDDD7, 0x6949, 0xDDD8, 0x694A, 0xB7A8, 0x694B, 0xDDEB, + 0x694C, 0xDDE9, 0x694E, 0xDDCC, 0x694F, 0xDDEE, 0x6951, 0xDDEF, + 0x6952, 0xDDF1, 0x6953, 0xB7AC, 0x6954, 0xB7A4, 0x6956, 0xD5B8, + 0x6957, 0xDDD4, 0x6958, 0xDDE6, 0x6959, 0xDDD5, 0x695A, 0xB7A1, + 0x695B, 0xB7B1, 0x695C, 0xDDED, 0x695D, 0xB7AF, 0x695E, 0xB7AB, + 0x695F, 0xDDCA, 0x6960, 0xB7A3, 0x6962, 0xDDCD, 0x6963, 0xB7B0, + 0x6965, 0xDDDD, 0x6966, 0xDDC9, 0x6968, 0xB7A9, 0x6969, 0xDDE1, + 0x696A, 0xDDD1, 0x696B, 0xB7AA, 0x696C, 0xDDDA, 0x696D, 0xB77E, + 0x696E, 0xB4D8, 0x696F, 0xDDE3, 0x6970, 0xD9BF, 0x6971, 0xDDCE, + 0x6974, 0xDDE8, 0x6975, 0xB7A5, 0x6976, 0xDDE5, 0x6977, 0xB7A2, + 0x6978, 0xDDDF, 0x6979, 0xB7AD, 0x697A, 0xDDD6, 0x697B, 0xDDF3, + 0x6982, 0xB7A7, 0x6983, 0xDEC6, 0x6986, 0xB7AE, 0x698D, 0xE24A, + 0x698E, 0xE248, 0x6990, 0xE25E, 0x6991, 0xE246, 0x6993, 0xE258, + 0x6994, 0xB77D, 0x6995, 0xBA5F, 0x6996, 0xE242, 0x6997, 0xE25D, + 0x6999, 0xE247, 0x699A, 0xE255, 0x699B, 0xBA64, 0x699C, 0xBA5D, + 0x699E, 0xE25B, 0x69A0, 0xE240, 0x69A1, 0xE25A, 0x69A3, 0xBA6F, + 0x69A4, 0xE251, 0x69A5, 0xE261, 0x69A6, 0xBA6D, 0x69A7, 0xE249, + 0x69A8, 0xBA5E, 0x69A9, 0xE24B, 0x69AA, 0xE259, 0x69AB, 0xBA67, + 0x69AC, 0xE244, 0x69AD, 0xBA6B, 0x69AE, 0xBA61, 0x69AF, 0xE24D, + 0x69B0, 0xE243, 0x69B1, 0xE1FC, 0x69B3, 0xE257, 0x69B4, 0xBA68, + 0x69B5, 0xE260, 0x69B6, 0xE1FD, 0x69B7, 0xBA65, 0x69B9, 0xE253, + 0x69BB, 0xBA66, 0x69BC, 0xE245, 0x69BD, 0xE250, 0x69BE, 0xE24C, + 0x69BF, 0xE24E, 0x69C1, 0xBA60, 0x69C2, 0xE25F, 0x69C3, 0xBA6E, + 0x69C4, 0xE24F, 0x69C6, 0xE262, 0x69C9, 0xE1FE, 0x69CA, 0xE254, + 0x69CB, 0xBA63, 0x69CC, 0xBA6C, 0x69CD, 0xBA6A, 0x69CE, 0xE241, + 0x69CF, 0xE256, 0x69D0, 0xBA69, 0x69D3, 0xBA62, 0x69D4, 0xE252, + 0x69D9, 0xE25C, 0x69E2, 0xE5D5, 0x69E4, 0xE5D1, 0x69E5, 0xE5CD, + 0x69E6, 0xE5E1, 0x69E7, 0xE5DE, 0x69E8, 0xBCCD, 0x69EB, 0xE5E5, + 0x69EC, 0xE5D4, 0x69ED, 0xBCD8, 0x69EE, 0xE5DB, 0x69F1, 0xE5D0, + 0x69F2, 0xE5DA, 0x69F3, 0xBCD5, 0x69F4, 0xE5EE, 0x69F6, 0xE5EB, + 0x69F7, 0xE5DD, 0x69F8, 0xE5CE, 0x69FB, 0xE5E2, 0x69FC, 0xE5E4, + 0x69FD, 0xBCD1, 0x69FE, 0xE5D8, 0x69FF, 0xE5D3, 0x6A00, 0xE5CA, + 0x6A01, 0xBCCE, 0x6A02, 0xBCD6, 0x6A04, 0xE5E7, 0x6A05, 0xBCD7, + 0x6A06, 0xE5CB, 0x6A07, 0xE5ED, 0x6A08, 0xE5E0, 0x6A09, 0xE5E6, + 0x6A0A, 0xBCD4, 0x6A0D, 0xE5E3, 0x6A0F, 0xE5EA, 0x6A11, 0xBCD9, + 0x6A13, 0xBCD3, 0x6A14, 0xE5DC, 0x6A15, 0xE5CF, 0x6A16, 0xE5EF, + 0x6A17, 0xE5CC, 0x6A18, 0xE5E8, 0x6A19, 0xBCD0, 0x6A1B, 0xE5D6, + 0x6A1D, 0xE5D7, 0x6A1E, 0xBCCF, 0x6A1F, 0xBCCC, 0x6A20, 0xE5D2, + 0x6A21, 0xBCD2, 0x6A23, 0xBCCB, 0x6A25, 0xE5E9, 0x6A26, 0xE5EC, + 0x6A27, 0xE5D9, 0x6A28, 0xE9CA, 0x6A32, 0xE9C2, 0x6A34, 0xE9BE, + 0x6A35, 0xBEF6, 0x6A38, 0xBEEB, 0x6A39, 0xBEF0, 0x6A3A, 0xBEEC, + 0x6A3B, 0xE9CC, 0x6A3C, 0xE9D7, 0x6A3D, 0xBEEA, 0x6A3E, 0xE9C4, + 0x6A3F, 0xE9CD, 0x6A40, 0xE5DF, 0x6A41, 0xE9CE, 0x6A44, 0xBEF1, + 0x6A46, 0xE9DD, 0x6A47, 0xBEF5, 0x6A48, 0xBEF8, 0x6A49, 0xE9C0, + 0x6A4B, 0xBEF4, 0x6A4D, 0xE9DB, 0x6A4E, 0xE9DC, 0x6A4F, 0xE9D2, + 0x6A50, 0xE9D1, 0x6A51, 0xE9C9, 0x6A54, 0xE9D3, 0x6A55, 0xE9DA, + 0x6A56, 0xE9D9, 0x6A58, 0xBEEF, 0x6A59, 0xBEED, 0x6A5A, 0xE9CB, + 0x6A5B, 0xE9C8, 0x6A5D, 0xE9C5, 0x6A5E, 0xE9D8, 0x6A5F, 0xBEF7, + 0x6A60, 0xE9D6, 0x6A61, 0xBEF3, 0x6A62, 0xBEF2, 0x6A64, 0xE9D0, + 0x6A66, 0xE9BF, 0x6A67, 0xE9C1, 0x6A68, 0xE9C3, 0x6A69, 0xE9D5, + 0x6A6A, 0xE9CF, 0x6A6B, 0xBEEE, 0x6A6D, 0xE9C6, 0x6A6F, 0xE9D4, + 0x6A76, 0xE9C7, 0x6A7E, 0xC0CF, 0x6A7F, 0xED45, 0x6A80, 0xC0C8, + 0x6A81, 0xECF5, 0x6A83, 0xED41, 0x6A84, 0xC0CA, 0x6A85, 0xED48, + 0x6A87, 0xECFC, 0x6A89, 0xECF7, 0x6A8C, 0xED49, 0x6A8D, 0xECF3, + 0x6A8E, 0xECFE, 0x6A90, 0xC0D1, 0x6A91, 0xED44, 0x6A92, 0xED4A, + 0x6A93, 0xECFD, 0x6A94, 0xC0C9, 0x6A95, 0xED40, 0x6A96, 0xECF4, + 0x6A97, 0xC0D0, 0x6A9A, 0xED47, 0x6A9B, 0xECF9, 0x6A9C, 0xC0CC, + 0x6A9E, 0xECFB, 0x6A9F, 0xECF8, 0x6AA0, 0xC0D2, 0x6AA1, 0xECFA, + 0x6AA2, 0xC0CB, 0x6AA3, 0xC0CE, 0x6AA4, 0xED43, 0x6AA5, 0xECF6, + 0x6AA6, 0xED46, 0x6AA8, 0xED42, 0x6AAC, 0xC263, 0x6AAD, 0xEFE7, + 0x6AAE, 0xC268, 0x6AAF, 0xC269, 0x6AB3, 0xC262, 0x6AB4, 0xEFE6, + 0x6AB6, 0xEFE3, 0x6AB7, 0xEFE4, 0x6AB8, 0xC266, 0x6AB9, 0xEFDE, + 0x6ABA, 0xEFE2, 0x6ABB, 0xC265, 0x6ABD, 0xEFDF, 0x6AC2, 0xC267, + 0x6AC3, 0xC264, 0x6AC5, 0xEFDD, 0x6AC6, 0xEFE1, 0x6AC7, 0xEFE5, + 0x6ACB, 0xF251, 0x6ACC, 0xF24E, 0x6ACD, 0xF257, 0x6ACF, 0xF256, + 0x6AD0, 0xF254, 0x6AD1, 0xF24F, 0x6AD3, 0xC372, 0x6AD9, 0xF250, + 0x6ADA, 0xC371, 0x6ADB, 0xC0CD, 0x6ADC, 0xF253, 0x6ADD, 0xC370, + 0x6ADE, 0xF258, 0x6ADF, 0xF252, 0x6AE0, 0xF24D, 0x6AE1, 0xEFE0, + 0x6AE5, 0xC36F, 0x6AE7, 0xF24C, 0x6AE8, 0xF456, 0x6AEA, 0xF455, + 0x6AEB, 0xF255, 0x6AEC, 0xC468, 0x6AEE, 0xF459, 0x6AEF, 0xF45A, + 0x6AF0, 0xF454, 0x6AF1, 0xF458, 0x6AF3, 0xF453, 0x6AF8, 0xF5D1, + 0x6AF9, 0xF457, 0x6AFA, 0xC4E7, 0x6AFB, 0xC4E5, 0x6AFC, 0xF5CF, + 0x6B00, 0xF5D2, 0x6B02, 0xF5CE, 0x6B03, 0xF5D0, 0x6B04, 0xC4E6, + 0x6B08, 0xF6E5, 0x6B09, 0xF6E6, 0x6B0A, 0xC576, 0x6B0B, 0xF6E4, + 0x6B0F, 0xF7E2, 0x6B10, 0xC5CF, 0x6B11, 0xF7E0, 0x6B12, 0xF7E1, + 0x6B13, 0xF8AC, 0x6B16, 0xC656, 0x6B17, 0xF8F3, 0x6B18, 0xF8F1, + 0x6B19, 0xF8F2, 0x6B1A, 0xF8F4, 0x6B1E, 0xF9BB, 0x6B20, 0xA4ED, + 0x6B21, 0xA6B8, 0x6B23, 0xAA59, 0x6B25, 0xCCE9, 0x6B28, 0xCF64, + 0x6B2C, 0xD1F5, 0x6B2D, 0xD1F7, 0x6B2F, 0xD1F6, 0x6B31, 0xD1F8, + 0x6B32, 0xB1FD, 0x6B33, 0xD5D7, 0x6B34, 0xD1F9, 0x6B36, 0xD5D6, + 0x6B37, 0xD5D8, 0x6B38, 0xD5D9, 0x6B39, 0xD9DA, 0x6B3A, 0xB4DB, + 0x6B3B, 0xD9DB, 0x6B3C, 0xD9DD, 0x6B3D, 0xB4DC, 0x6B3E, 0xB4DA, + 0x6B3F, 0xD9DC, 0x6B41, 0xDDFA, 0x6B42, 0xDDF8, 0x6B43, 0xDDF7, + 0x6B45, 0xDDF6, 0x6B46, 0xDDF5, 0x6B47, 0xB7B2, 0x6B48, 0xDDF9, + 0x6B49, 0xBA70, 0x6B4A, 0xE263, 0x6B4B, 0xE265, 0x6B4C, 0xBA71, + 0x6B4D, 0xE264, 0x6B4E, 0xBCDB, 0x6B50, 0xBCDA, 0x6B51, 0xE5F0, + 0x6B54, 0xE9DF, 0x6B55, 0xE9DE, 0x6B56, 0xE9E0, 0x6B59, 0xBEF9, + 0x6B5B, 0xED4B, 0x6B5C, 0xC0D3, 0x6B5E, 0xEFE8, 0x6B5F, 0xC26A, + 0x6B60, 0xF259, 0x6B61, 0xC577, 0x6B62, 0xA4EE, 0x6B63, 0xA5BF, + 0x6B64, 0xA6B9, 0x6B65, 0xA842, 0x6B66, 0xAA5A, 0x6B67, 0xAA5B, + 0x6B6A, 0xAC6E, 0x6B6D, 0xD1FA, 0x6B72, 0xB7B3, 0x6B76, 0xE6D1, + 0x6B77, 0xBEFA, 0x6B78, 0xC26B, 0x6B79, 0xA4EF, 0x6B7B, 0xA6BA, + 0x6B7E, 0xCCEB, 0x6B7F, 0xAA5C, 0x6B80, 0xCCEA, 0x6B82, 0xCF65, + 0x6B83, 0xAC6F, 0x6B84, 0xCF66, 0x6B86, 0xAC70, 0x6B88, 0xD1FC, + 0x6B89, 0xAEEE, 0x6B8A, 0xAEED, 0x6B8C, 0xD5DE, 0x6B8D, 0xD5DC, + 0x6B8E, 0xD5DD, 0x6B8F, 0xD5DB, 0x6B91, 0xD5DA, 0x6B94, 0xD9DE, + 0x6B95, 0xD9E1, 0x6B96, 0xB4DE, 0x6B97, 0xD9DF, 0x6B98, 0xB4DD, + 0x6B99, 0xD9E0, 0x6B9B, 0xDDFB, 0x6B9E, 0xE266, 0x6B9F, 0xE267, + 0x6BA0, 0xE268, 0x6BA2, 0xE5F3, 0x6BA3, 0xE5F2, 0x6BA4, 0xBCDC, + 0x6BA5, 0xE5F1, 0x6BA6, 0xE5F4, 0x6BA7, 0xE9E1, 0x6BAA, 0xE9E2, + 0x6BAB, 0xE9E3, 0x6BAD, 0xED4C, 0x6BAE, 0xC0D4, 0x6BAF, 0xC26C, + 0x6BB0, 0xF25A, 0x6BB2, 0xC4E8, 0x6BB3, 0xC95F, 0x6BB5, 0xAC71, + 0x6BB6, 0xCF67, 0x6BB7, 0xAEEF, 0x6BBA, 0xB1FE, 0x6BBC, 0xB4DF, + 0x6BBD, 0xD9E2, 0x6BBF, 0xB7B5, 0x6BC0, 0xB7B4, 0x6BC3, 0xE269, + 0x6BC4, 0xE26A, 0x6BC5, 0xBCDD, 0x6BC6, 0xBCDE, 0x6BC7, 0xE9E5, + 0x6BC8, 0xE9E4, 0x6BC9, 0xEFE9, 0x6BCA, 0xF7E3, 0x6BCB, 0xA4F0, + 0x6BCC, 0xC960, 0x6BCD, 0xA5C0, 0x6BCF, 0xA843, 0x6BD0, 0xCB48, + 0x6BD2, 0xAC72, 0x6BD3, 0xB7B6, 0x6BD4, 0xA4F1, 0x6BD6, 0xCF68, + 0x6BD7, 0xAC73, 0x6BD8, 0xCF69, 0x6BDA, 0xC0D5, 0x6BDB, 0xA4F2, + 0x6BDE, 0xCCEC, 0x6BE0, 0xCF6A, 0x6BE2, 0xD242, 0x6BE3, 0xD241, + 0x6BE4, 0xD1FE, 0x6BE6, 0xD1FD, 0x6BE7, 0xD243, 0x6BE8, 0xD240, + 0x6BEB, 0xB240, 0x6BEC, 0xB241, 0x6BEF, 0xB4E0, 0x6BF0, 0xD9E3, + 0x6BF2, 0xD9E4, 0x6BF3, 0xD9E5, 0x6BF7, 0xDE41, 0x6BF8, 0xDE42, + 0x6BF9, 0xDE40, 0x6BFB, 0xDDFD, 0x6BFC, 0xDDFE, 0x6BFD, 0xB7B7, + 0x6BFE, 0xE26B, 0x6BFF, 0xE5F7, 0x6C00, 0xE5F6, 0x6C01, 0xE5F5, + 0x6C02, 0xE5F8, 0x6C03, 0xE9E7, 0x6C04, 0xE9E6, 0x6C05, 0xBEFB, + 0x6C06, 0xE9E8, 0x6C08, 0xC0D6, 0x6C09, 0xED4D, 0x6C0B, 0xEFEA, + 0x6C0C, 0xF25B, 0x6C0D, 0xF6E7, 0x6C0F, 0xA4F3, 0x6C10, 0xA5C2, + 0x6C11, 0xA5C1, 0x6C13, 0xAA5D, 0x6C14, 0xC961, 0x6C15, 0xC97E, + 0x6C16, 0xA6BB, 0x6C18, 0xC9F7, 0x6C19, 0xCB49, 0x6C1A, 0xCB4A, + 0x6C1B, 0xAA5E, 0x6C1D, 0xCCED, 0x6C1F, 0xAC74, 0x6C20, 0xCF6B, + 0x6C21, 0xCF6C, 0x6C23, 0xAEF0, 0x6C24, 0xAEF4, 0x6C25, 0xD244, + 0x6C26, 0xAEF3, 0x6C27, 0xAEF1, 0x6C28, 0xAEF2, 0x6C2A, 0xD5DF, + 0x6C2B, 0xB242, 0x6C2C, 0xB4E3, 0x6C2E, 0xB4E1, 0x6C2F, 0xB4E2, + 0x6C30, 0xD9E6, 0x6C33, 0xBA72, 0x6C34, 0xA4F4, 0x6C36, 0xC9A1, + 0x6C38, 0xA5C3, 0x6C3B, 0xC9A4, 0x6C3E, 0xA5C6, 0x6C3F, 0xC9A3, + 0x6C40, 0xA5C5, 0x6C41, 0xA5C4, 0x6C42, 0xA844, 0x6C43, 0xC9A2, + 0x6C46, 0xC9F8, 0x6C4A, 0xC9FC, 0x6C4B, 0xC9FE, 0x6C4C, 0xCA40, + 0x6C4D, 0xA6C5, 0x6C4E, 0xA6C6, 0x6C4F, 0xC9FB, 0x6C50, 0xA6C1, + 0x6C52, 0xC9F9, 0x6C54, 0xC9FD, 0x6C55, 0xA6C2, 0x6C57, 0xA6BD, + 0x6C59, 0xA6BE, 0x6C5B, 0xA6C4, 0x6C5C, 0xC9FA, 0x6C5D, 0xA6BC, + 0x6C5E, 0xA845, 0x6C5F, 0xA6BF, 0x6C60, 0xA6C0, 0x6C61, 0xA6C3, + 0x6C65, 0xCB5B, 0x6C66, 0xCB59, 0x6C67, 0xCB4C, 0x6C68, 0xA851, + 0x6C69, 0xCB53, 0x6C6A, 0xA84C, 0x6C6B, 0xCB4D, 0x6C6D, 0xCB55, + 0x6C6F, 0xCB52, 0x6C70, 0xA84F, 0x6C71, 0xCB51, 0x6C72, 0xA856, + 0x6C73, 0xCB5A, 0x6C74, 0xA858, 0x6C76, 0xA85A, 0x6C78, 0xCB4B, + 0x6C7A, 0xA84D, 0x6C7B, 0xCB5C, 0x6C7D, 0xA854, 0x6C7E, 0xA857, + 0x6C80, 0xCD45, 0x6C81, 0xA847, 0x6C82, 0xA85E, 0x6C83, 0xA855, + 0x6C84, 0xCB4E, 0x6C85, 0xA84A, 0x6C86, 0xA859, 0x6C87, 0xCB56, + 0x6C88, 0xA848, 0x6C89, 0xA849, 0x6C8A, 0xCD43, 0x6C8B, 0xCB4F, + 0x6C8C, 0xA850, 0x6C8D, 0xA85B, 0x6C8E, 0xCB5D, 0x6C8F, 0xCB50, + 0x6C90, 0xA84E, 0x6C92, 0xA853, 0x6C93, 0xCCEE, 0x6C94, 0xA85C, + 0x6C95, 0xCB57, 0x6C96, 0xA852, 0x6C98, 0xA85D, 0x6C99, 0xA846, + 0x6C9A, 0xCB54, 0x6C9B, 0xA84B, 0x6C9C, 0xCB58, 0x6C9D, 0xCD44, + 0x6CAB, 0xAA6A, 0x6CAC, 0xAA7A, 0x6CAD, 0xCCF5, 0x6CAE, 0xAA71, + 0x6CB0, 0xCD4B, 0x6CB1, 0xAA62, 0x6CB3, 0xAA65, 0x6CB4, 0xCD42, + 0x6CB6, 0xCCF3, 0x6CB7, 0xCCF7, 0x6CB8, 0xAA6D, 0x6CB9, 0xAA6F, + 0x6CBA, 0xCCFA, 0x6CBB, 0xAA76, 0x6CBC, 0xAA68, 0x6CBD, 0xAA66, + 0x6CBE, 0xAA67, 0x6CBF, 0xAA75, 0x6CC0, 0xCD47, 0x6CC1, 0xAA70, + 0x6CC2, 0xCCF9, 0x6CC3, 0xCCFB, 0x6CC4, 0xAA6E, 0x6CC5, 0xAA73, + 0x6CC6, 0xCCFC, 0x6CC7, 0xCD4A, 0x6CC9, 0xAC75, 0x6CCA, 0xAA79, + 0x6CCC, 0xAA63, 0x6CCD, 0xCD49, 0x6CCF, 0xCD4D, 0x6CD0, 0xCCF8, + 0x6CD1, 0xCD4F, 0x6CD2, 0xCD40, 0x6CD3, 0xAA6C, 0x6CD4, 0xCCF4, + 0x6CD5, 0xAA6B, 0x6CD6, 0xAA7D, 0x6CD7, 0xAA72, 0x6CD9, 0xCCF2, + 0x6CDA, 0xCF75, 0x6CDB, 0xAA78, 0x6CDC, 0xAA7C, 0x6CDD, 0xCD41, + 0x6CDE, 0xCD46, 0x6CE0, 0xAA7E, 0x6CE1, 0xAA77, 0x6CE2, 0xAA69, + 0x6CE3, 0xAA5F, 0x6CE5, 0xAA64, 0x6CE7, 0xCCF6, 0x6CE8, 0xAA60, + 0x6CE9, 0xCD4E, 0x6CEB, 0xCCF0, 0x6CEC, 0xCCEF, 0x6CED, 0xCCFD, + 0x6CEE, 0xCCF1, 0x6CEF, 0xAA7B, 0x6CF0, 0xAEF5, 0x6CF1, 0xAA74, + 0x6CF2, 0xCCFE, 0x6CF3, 0xAA61, 0x6CF5, 0xACA6, 0x6CF9, 0xCD4C, + 0x6D00, 0xCF7C, 0x6D01, 0xCFA1, 0x6D03, 0xCFA4, 0x6D04, 0xCF77, + 0x6D07, 0xCFA7, 0x6D08, 0xCFAA, 0x6D09, 0xCFAC, 0x6D0A, 0xCF74, + 0x6D0B, 0xAC76, 0x6D0C, 0xAC7B, 0x6D0D, 0xD249, 0x6D0E, 0xACAD, + 0x6D0F, 0xCFA5, 0x6D10, 0xCFAD, 0x6D11, 0xCF7B, 0x6D12, 0xCF73, + 0x6D16, 0xD264, 0x6D17, 0xAC7E, 0x6D18, 0xCFA2, 0x6D19, 0xCF78, + 0x6D1A, 0xCF7A, 0x6D1B, 0xACA5, 0x6D1D, 0xCF7D, 0x6D1E, 0xAC7D, + 0x6D1F, 0xCF70, 0x6D20, 0xCFA8, 0x6D22, 0xCFAB, 0x6D25, 0xAC7A, + 0x6D27, 0xACA8, 0x6D28, 0xCF6D, 0x6D29, 0xACAA, 0x6D2A, 0xAC78, + 0x6D2B, 0xACAE, 0x6D2C, 0xCFA9, 0x6D2D, 0xCF6F, 0x6D2E, 0xACAB, + 0x6D2F, 0xD25E, 0x6D30, 0xCD48, 0x6D31, 0xAC7C, 0x6D32, 0xAC77, + 0x6D33, 0xCF76, 0x6D34, 0xCF6E, 0x6D35, 0xACAC, 0x6D36, 0xACA4, + 0x6D37, 0xCFA3, 0x6D38, 0xACA9, 0x6D39, 0xACA7, 0x6D3A, 0xCF79, + 0x6D3B, 0xACA1, 0x6D3C, 0xCF71, 0x6D3D, 0xACA2, 0x6D3E, 0xACA3, + 0x6D3F, 0xCF72, 0x6D40, 0xCFA6, 0x6D41, 0xAC79, 0x6D42, 0xCF7E, + 0x6D58, 0xD24C, 0x6D59, 0xAEFD, 0x6D5A, 0xAF43, 0x6D5E, 0xD255, + 0x6D5F, 0xD25B, 0x6D60, 0xD257, 0x6D61, 0xD24A, 0x6D62, 0xD24D, + 0x6D63, 0xD246, 0x6D64, 0xD247, 0x6D65, 0xAF4A, 0x6D66, 0xAEFA, + 0x6D67, 0xD256, 0x6D68, 0xD25F, 0x6D69, 0xAF45, 0x6D6A, 0xAEF6, + 0x6D6C, 0xAF40, 0x6D6D, 0xD24E, 0x6D6E, 0xAF42, 0x6D6F, 0xD24F, + 0x6D70, 0xD259, 0x6D74, 0xAF44, 0x6D75, 0xD268, 0x6D76, 0xD248, + 0x6D77, 0xAEFC, 0x6D78, 0xAEFB, 0x6D79, 0xAF48, 0x6D7A, 0xD245, + 0x6D7B, 0xD266, 0x6D7C, 0xD25A, 0x6D7D, 0xD267, 0x6D7E, 0xD261, + 0x6D7F, 0xD253, 0x6D80, 0xD262, 0x6D82, 0xD25C, 0x6D83, 0xD265, + 0x6D84, 0xD263, 0x6D85, 0xAF49, 0x6D86, 0xD254, 0x6D87, 0xAEF9, + 0x6D88, 0xAEF8, 0x6D89, 0xAF41, 0x6D8A, 0xAF47, 0x6D8B, 0xD260, + 0x6D8C, 0xAF46, 0x6D8D, 0xD251, 0x6D8E, 0xB243, 0x6D90, 0xD269, + 0x6D91, 0xD250, 0x6D92, 0xD24B, 0x6D93, 0xAEFE, 0x6D94, 0xAF4B, + 0x6D95, 0xAEF7, 0x6D97, 0xD258, 0x6D98, 0xD25D, 0x6DAA, 0xB265, + 0x6DAB, 0xD5E1, 0x6DAC, 0xD5E5, 0x6DAE, 0xB252, 0x6DAF, 0xB250, + 0x6DB2, 0xB247, 0x6DB3, 0xD5E3, 0x6DB4, 0xD5E2, 0x6DB5, 0xB25B, + 0x6DB7, 0xD5E8, 0x6DB8, 0xB255, 0x6DBA, 0xD5FA, 0x6DBB, 0xD647, + 0x6DBC, 0xB244, 0x6DBD, 0xD5F7, 0x6DBE, 0xD5F0, 0x6DBF, 0xB267, + 0x6DC0, 0xD5E0, 0x6DC2, 0xD5FC, 0x6DC4, 0xB264, 0x6DC5, 0xB258, + 0x6DC6, 0xB263, 0x6DC7, 0xB24E, 0x6DC8, 0xD5EC, 0x6DC9, 0xD5FE, + 0x6DCA, 0xD5F6, 0x6DCB, 0xB24F, 0x6DCC, 0xB249, 0x6DCD, 0xD645, + 0x6DCF, 0xD5FD, 0x6DD0, 0xD640, 0x6DD1, 0xB251, 0x6DD2, 0xB259, + 0x6DD3, 0xD642, 0x6DD4, 0xD5EA, 0x6DD5, 0xD5FB, 0x6DD6, 0xD5EF, + 0x6DD7, 0xD644, 0x6DD8, 0xB25E, 0x6DD9, 0xB246, 0x6DDA, 0xB25C, + 0x6DDB, 0xD5F4, 0x6DDC, 0xD5F2, 0x6DDD, 0xD5F3, 0x6DDE, 0xB253, + 0x6DDF, 0xD5EE, 0x6DE0, 0xD5ED, 0x6DE1, 0xB248, 0x6DE2, 0xD5E7, + 0x6DE3, 0xD646, 0x6DE4, 0xB24A, 0x6DE5, 0xD5F1, 0x6DE6, 0xB268, + 0x6DE8, 0xB262, 0x6DE9, 0xD5E6, 0x6DEA, 0xB25F, 0x6DEB, 0xB25D, + 0x6DEC, 0xB266, 0x6DED, 0xD5F8, 0x6DEE, 0xB261, 0x6DEF, 0xD252, + 0x6DF0, 0xD5F9, 0x6DF1, 0xB260, 0x6DF2, 0xD641, 0x6DF3, 0xB245, + 0x6DF4, 0xD5F5, 0x6DF5, 0xB257, 0x6DF6, 0xD5E9, 0x6DF7, 0xB256, + 0x6DF9, 0xB254, 0x6DFA, 0xB24C, 0x6DFB, 0xB24B, 0x6DFC, 0xD9E7, + 0x6DFD, 0xD643, 0x6E00, 0xD5EB, 0x6E03, 0xD9FC, 0x6E05, 0xB24D, + 0x6E19, 0xB541, 0x6E1A, 0xB25A, 0x6E1B, 0xB4EE, 0x6E1C, 0xD9F6, + 0x6E1D, 0xB4FC, 0x6E1F, 0xD9EA, 0x6E20, 0xB4EB, 0x6E21, 0xB4E7, + 0x6E22, 0xDA49, 0x6E23, 0xB4ED, 0x6E24, 0xB4F1, 0x6E25, 0xB4EC, + 0x6E26, 0xB4F5, 0x6E27, 0xDA4D, 0x6E28, 0xDA44, 0x6E2B, 0xD9F1, + 0x6E2C, 0xB4FA, 0x6E2D, 0xB4F4, 0x6E2E, 0xD9FD, 0x6E2F, 0xB4E4, + 0x6E30, 0xDA4A, 0x6E31, 0xDA43, 0x6E32, 0xB4E8, 0x6E33, 0xD9F7, + 0x6E34, 0xB4F7, 0x6E35, 0xDA55, 0x6E36, 0xDA56, 0x6E38, 0xB4E5, + 0x6E39, 0xDA48, 0x6E3A, 0xB4F9, 0x6E3B, 0xD9FB, 0x6E3C, 0xD9ED, + 0x6E3D, 0xD9EE, 0x6E3E, 0xB4FD, 0x6E3F, 0xD9F2, 0x6E40, 0xD9F9, + 0x6E41, 0xD9F3, 0x6E43, 0xB4FB, 0x6E44, 0xB544, 0x6E45, 0xD9EF, + 0x6E46, 0xD9E8, 0x6E47, 0xD9E9, 0x6E49, 0xD9EB, 0x6E4A, 0xB4EA, + 0x6E4B, 0xD9F8, 0x6E4D, 0xB4F8, 0x6E4E, 0xB542, 0x6E51, 0xD9FA, + 0x6E52, 0xDA53, 0x6E53, 0xDA4B, 0x6E54, 0xB4E6, 0x6E55, 0xDA51, + 0x6E56, 0xB4F2, 0x6E58, 0xB4F0, 0x6E5A, 0xDA57, 0x6E5B, 0xB4EF, + 0x6E5C, 0xDA41, 0x6E5D, 0xD9F4, 0x6E5E, 0xD9FE, 0x6E5F, 0xB547, + 0x6E60, 0xDA45, 0x6E61, 0xDA42, 0x6E62, 0xD9F0, 0x6E63, 0xB543, + 0x6E64, 0xDA4F, 0x6E65, 0xDA4C, 0x6E66, 0xDA54, 0x6E67, 0xB4E9, + 0x6E68, 0xDA40, 0x6E69, 0xB546, 0x6E6B, 0xDA47, 0x6E6E, 0xB4F3, + 0x6E6F, 0xB4F6, 0x6E71, 0xDA46, 0x6E72, 0xB545, 0x6E73, 0xD9F5, + 0x6E74, 0xD5E4, 0x6E77, 0xDA50, 0x6E78, 0xDA4E, 0x6E79, 0xDA52, + 0x6E88, 0xD9EC, 0x6E89, 0xB540, 0x6E8D, 0xDE61, 0x6E8E, 0xDE60, + 0x6E8F, 0xDE46, 0x6E90, 0xB7BD, 0x6E92, 0xDE5F, 0x6E93, 0xDE49, + 0x6E94, 0xDE4A, 0x6E96, 0xB7C7, 0x6E97, 0xDE68, 0x6E98, 0xB7C2, + 0x6E99, 0xDE5E, 0x6E9B, 0xDE43, 0x6E9C, 0xB7C8, 0x6E9D, 0xB7BE, + 0x6E9E, 0xDE52, 0x6E9F, 0xDE48, 0x6EA0, 0xDE4B, 0x6EA1, 0xDE63, + 0x6EA2, 0xB7B8, 0x6EA3, 0xDE6A, 0x6EA4, 0xDE62, 0x6EA5, 0xB7C1, + 0x6EA6, 0xDE57, 0x6EA7, 0xB7CC, 0x6EAA, 0xB7CB, 0x6EAB, 0xB7C5, + 0x6EAE, 0xDE69, 0x6EAF, 0xB7B9, 0x6EB0, 0xDE55, 0x6EB1, 0xDE4C, + 0x6EB2, 0xDE59, 0x6EB3, 0xDE65, 0x6EB4, 0xB7CD, 0x6EB6, 0xB7BB, + 0x6EB7, 0xDE54, 0x6EB9, 0xDE4D, 0x6EBA, 0xB7C4, 0x6EBC, 0xB7C3, + 0x6EBD, 0xDE50, 0x6EBE, 0xDE5A, 0x6EBF, 0xDE64, 0x6EC0, 0xDE47, + 0x6EC1, 0xDE51, 0x6EC2, 0xB7BC, 0x6EC3, 0xDE5B, 0x6EC4, 0xB7C9, + 0x6EC5, 0xB7C0, 0x6EC6, 0xDE4E, 0x6EC7, 0xB7BF, 0x6EC8, 0xDE45, + 0x6EC9, 0xDE53, 0x6ECA, 0xDE67, 0x6ECB, 0xB4FE, 0x6ECC, 0xBAB0, + 0x6ECD, 0xDE56, 0x6ECE, 0xE26C, 0x6ECF, 0xDE58, 0x6ED0, 0xDE66, + 0x6ED1, 0xB7C6, 0x6ED2, 0xDE4F, 0x6ED3, 0xB7BA, 0x6ED4, 0xB7CA, + 0x6ED5, 0xBCF0, 0x6ED6, 0xDE44, 0x6ED8, 0xDE5D, 0x6EDC, 0xDE5C, + 0x6EEB, 0xE2AA, 0x6EEC, 0xBAAD, 0x6EED, 0xE27D, 0x6EEE, 0xE2A4, + 0x6EEF, 0xBAA2, 0x6EF1, 0xE26E, 0x6EF2, 0xBAAF, 0x6EF4, 0xBA77, + 0x6EF5, 0xE26D, 0x6EF6, 0xE2B0, 0x6EF7, 0xBAB1, 0x6EF8, 0xE271, + 0x6EF9, 0xE2A3, 0x6EFB, 0xE273, 0x6EFC, 0xE2B3, 0x6EFD, 0xE2AF, + 0x6EFE, 0xBA75, 0x6EFF, 0xBAA1, 0x6F00, 0xE653, 0x6F01, 0xBAAE, + 0x6F02, 0xBA7D, 0x6F03, 0xE26F, 0x6F05, 0xE2AE, 0x6F06, 0xBAA3, + 0x6F07, 0xE2AB, 0x6F08, 0xE2B8, 0x6F09, 0xE275, 0x6F0A, 0xE27E, + 0x6F0D, 0xE2B6, 0x6F0E, 0xE2AC, 0x6F0F, 0xBA7C, 0x6F12, 0xE27C, + 0x6F13, 0xBA76, 0x6F14, 0xBA74, 0x6F15, 0xBAA8, 0x6F18, 0xE27A, + 0x6F19, 0xE277, 0x6F1A, 0xE278, 0x6F1C, 0xE2B2, 0x6F1E, 0xE2B7, + 0x6F1F, 0xE2B5, 0x6F20, 0xBA7A, 0x6F21, 0xE2B9, 0x6F22, 0xBA7E, + 0x6F23, 0xBAA7, 0x6F25, 0xE270, 0x6F26, 0xE5FA, 0x6F27, 0xE279, + 0x6F29, 0xBA78, 0x6F2A, 0xBAAC, 0x6F2B, 0xBAA9, 0x6F2C, 0xBA7B, + 0x6F2D, 0xE2A5, 0x6F2E, 0xE274, 0x6F2F, 0xBAAA, 0x6F30, 0xE2A7, + 0x6F31, 0xBAA4, 0x6F32, 0xBAA6, 0x6F33, 0xBA73, 0x6F35, 0xE2A9, + 0x6F36, 0xE2A1, 0x6F37, 0xE272, 0x6F38, 0xBAA5, 0x6F39, 0xE2B1, + 0x6F3A, 0xE2B4, 0x6F3B, 0xE27B, 0x6F3C, 0xE2A8, 0x6F3E, 0xBA79, + 0x6F3F, 0xBCDF, 0x6F40, 0xE2A6, 0x6F41, 0xE5F9, 0x6F43, 0xE2AD, + 0x6F4E, 0xE276, 0x6F4F, 0xE644, 0x6F50, 0xE64E, 0x6F51, 0xBCE2, + 0x6F52, 0xE64D, 0x6F53, 0xE659, 0x6F54, 0xBCE4, 0x6F55, 0xE64B, + 0x6F57, 0xE64F, 0x6F58, 0xBCEF, 0x6F5A, 0xE646, 0x6F5B, 0xBCE7, + 0x6F5D, 0xE652, 0x6F5E, 0xE9F0, 0x6F5F, 0xBCF3, 0x6F60, 0xBCF2, + 0x6F61, 0xE654, 0x6F62, 0xE643, 0x6F63, 0xE65E, 0x6F64, 0xBCED, + 0x6F66, 0xBCE3, 0x6F67, 0xE657, 0x6F69, 0xE65B, 0x6F6A, 0xE660, + 0x6F6B, 0xE655, 0x6F6C, 0xE649, 0x6F6D, 0xBCE6, 0x6F6E, 0xBCE9, + 0x6F6F, 0xBCF1, 0x6F70, 0xBCEC, 0x6F72, 0xE64C, 0x6F73, 0xE2A2, + 0x6F76, 0xE648, 0x6F77, 0xE65F, 0x6F78, 0xBCE8, 0x6F7A, 0xBCEB, + 0x6F7B, 0xE661, 0x6F7C, 0xBCE0, 0x6F7D, 0xE656, 0x6F7E, 0xE5FB, + 0x6F7F, 0xE65C, 0x6F80, 0xC0DF, 0x6F82, 0xE64A, 0x6F84, 0xBCE1, + 0x6F85, 0xE645, 0x6F86, 0xBCE5, 0x6F87, 0xE5FC, 0x6F88, 0xBAAB, + 0x6F89, 0xE641, 0x6F8B, 0xE65A, 0x6F8C, 0xE642, 0x6F8D, 0xE640, + 0x6F8E, 0xBCEA, 0x6F90, 0xE658, 0x6F92, 0xE5FE, 0x6F93, 0xE651, + 0x6F94, 0xE650, 0x6F95, 0xE65D, 0x6F96, 0xE647, 0x6F97, 0xBCEE, + 0x6F9E, 0xE9F3, 0x6FA0, 0xBF49, 0x6FA1, 0xBEFE, 0x6FA2, 0xEA40, + 0x6FA3, 0xE9EB, 0x6FA4, 0xBF41, 0x6FA5, 0xE9F7, 0x6FA6, 0xBF48, + 0x6FA7, 0xBF43, 0x6FA8, 0xE9F5, 0x6FA9, 0xED4F, 0x6FAA, 0xE9FB, + 0x6FAB, 0xEA42, 0x6FAC, 0xE9FA, 0x6FAD, 0xE9E9, 0x6FAE, 0xE9F8, + 0x6FAF, 0xEA44, 0x6FB0, 0xEA46, 0x6FB1, 0xBEFD, 0x6FB2, 0xEA45, + 0x6FB3, 0xBF44, 0x6FB4, 0xBF4A, 0x6FB6, 0xBF47, 0x6FB8, 0xE9FE, + 0x6FB9, 0xBF46, 0x6FBA, 0xE9F9, 0x6FBC, 0xE9ED, 0x6FBD, 0xE9F2, + 0x6FBF, 0xE9FD, 0x6FC0, 0xBF45, 0x6FC1, 0xBF42, 0x6FC2, 0xBEFC, + 0x6FC3, 0xBF40, 0x6FC4, 0xE9F1, 0x6FC6, 0xE5FD, 0x6FC7, 0xE9EC, + 0x6FC8, 0xE9EF, 0x6FC9, 0xEA41, 0x6FCA, 0xE9F4, 0x6FCB, 0xE9EA, + 0x6FCC, 0xED4E, 0x6FCD, 0xEA43, 0x6FCE, 0xE9EE, 0x6FCF, 0xE9FC, + 0x6FD4, 0xED51, 0x6FD5, 0xC0E3, 0x6FD8, 0xC0D7, 0x6FDB, 0xC0DB, + 0x6FDC, 0xED53, 0x6FDD, 0xED59, 0x6FDE, 0xED57, 0x6FDF, 0xC0D9, + 0x6FE0, 0xC0DA, 0x6FE1, 0xC0E1, 0x6FE2, 0xED5A, 0x6FE3, 0xED52, + 0x6FE4, 0xC0DC, 0x6FE6, 0xED56, 0x6FE7, 0xED55, 0x6FE8, 0xED5B, + 0x6FE9, 0xC0E2, 0x6FEB, 0xC0DD, 0x6FEC, 0xC0E0, 0x6FED, 0xED54, + 0x6FEE, 0xC0E4, 0x6FEF, 0xC0DE, 0x6FF0, 0xC0E5, 0x6FF1, 0xC0D8, + 0x6FF2, 0xED58, 0x6FF4, 0xED50, 0x6FF7, 0xEFF7, 0x6FFA, 0xC271, + 0x6FFB, 0xEFF4, 0x6FFC, 0xEFF6, 0x6FFE, 0xC26F, 0x6FFF, 0xEFF2, + 0x7000, 0xEFF3, 0x7001, 0xEFEE, 0x7004, 0xE9F6, 0x7005, 0xEFEF, + 0x7006, 0xC270, 0x7007, 0xEFEB, 0x7009, 0xC26D, 0x700A, 0xEFF8, + 0x700B, 0xC26E, 0x700C, 0xEFEC, 0x700D, 0xEFED, 0x700E, 0xEFF1, + 0x700F, 0xC273, 0x7011, 0xC272, 0x7014, 0xEFF0, 0x7015, 0xC378, + 0x7016, 0xF25F, 0x7017, 0xF265, 0x7018, 0xC379, 0x7019, 0xF25C, + 0x701A, 0xC376, 0x701B, 0xC373, 0x701C, 0xF267, 0x701D, 0xC377, + 0x701F, 0xC374, 0x7020, 0xF25E, 0x7021, 0xF261, 0x7022, 0xF262, + 0x7023, 0xF263, 0x7024, 0xF266, 0x7026, 0xEFF5, 0x7027, 0xF25D, + 0x7028, 0xC375, 0x7029, 0xF264, 0x702A, 0xF268, 0x702B, 0xF260, + 0x702F, 0xF45D, 0x7030, 0xC46A, 0x7031, 0xF460, 0x7032, 0xC46B, + 0x7033, 0xF468, 0x7034, 0xF45F, 0x7035, 0xF45C, 0x7037, 0xF45E, + 0x7038, 0xF462, 0x7039, 0xF465, 0x703A, 0xF464, 0x703B, 0xF467, + 0x703C, 0xF45B, 0x703E, 0xC469, 0x703F, 0xF463, 0x7040, 0xF466, + 0x7041, 0xF469, 0x7042, 0xF461, 0x7043, 0xF5D3, 0x7044, 0xF5D4, + 0x7045, 0xF5D8, 0x7046, 0xF5D9, 0x7048, 0xF5D6, 0x7049, 0xF5D7, + 0x704A, 0xF5D5, 0x704C, 0xC4E9, 0x7051, 0xC578, 0x7052, 0xF6EB, + 0x7055, 0xF6E8, 0x7056, 0xF6E9, 0x7057, 0xF6EA, 0x7058, 0xC579, + 0x705A, 0xF7E5, 0x705B, 0xF7E4, 0x705D, 0xF8AF, 0x705E, 0xC5F4, + 0x705F, 0xF8AD, 0x7060, 0xF8B0, 0x7061, 0xF8AE, 0x7062, 0xF8F5, + 0x7063, 0xC657, 0x7064, 0xC665, 0x7065, 0xF9A3, 0x7066, 0xF96C, + 0x7068, 0xF9A2, 0x7069, 0xF9D0, 0x706A, 0xF9D1, 0x706B, 0xA4F5, + 0x7070, 0xA6C7, 0x7071, 0xCA41, 0x7074, 0xCB5E, 0x7076, 0xA85F, + 0x7078, 0xA862, 0x707A, 0xCB5F, 0x707C, 0xA860, 0x707D, 0xA861, + 0x7082, 0xCD58, 0x7083, 0xCD5A, 0x7084, 0xCD55, 0x7085, 0xCD52, + 0x7086, 0xCD54, 0x708A, 0xAAA4, 0x708E, 0xAAA2, 0x7091, 0xCD56, + 0x7092, 0xAAA3, 0x7093, 0xCD53, 0x7094, 0xCD50, 0x7095, 0xAAA1, + 0x7096, 0xCD57, 0x7098, 0xCD51, 0x7099, 0xAAA5, 0x709A, 0xCD59, + 0x709F, 0xCFAF, 0x70A1, 0xCFB3, 0x70A4, 0xACB7, 0x70A9, 0xCFB6, + 0x70AB, 0xACAF, 0x70AC, 0xACB2, 0x70AD, 0xACB4, 0x70AE, 0xACB6, + 0x70AF, 0xACB3, 0x70B0, 0xCFB2, 0x70B1, 0xCFB1, 0x70B3, 0xACB1, + 0x70B4, 0xCFB4, 0x70B5, 0xCFB5, 0x70B7, 0xCFAE, 0x70B8, 0xACB5, + 0x70BA, 0xACB0, 0x70BE, 0xCFB0, 0x70C5, 0xD277, 0x70C6, 0xD278, + 0x70C7, 0xD279, 0x70C8, 0xAF50, 0x70CA, 0xAF4C, 0x70CB, 0xD26E, + 0x70CD, 0xD276, 0x70CE, 0xD27B, 0x70CF, 0xAF51, 0x70D1, 0xD26C, + 0x70D2, 0xD272, 0x70D3, 0xD26B, 0x70D4, 0xD275, 0x70D7, 0xD271, + 0x70D8, 0xAF4D, 0x70D9, 0xAF4F, 0x70DA, 0xD27A, 0x70DC, 0xD26A, + 0x70DD, 0xD26D, 0x70DE, 0xD273, 0x70E0, 0xD274, 0x70E1, 0xD27C, + 0x70E2, 0xD270, 0x70E4, 0xAF4E, 0x70EF, 0xB26D, 0x70F0, 0xD64E, + 0x70F3, 0xD650, 0x70F4, 0xD64C, 0x70F6, 0xD658, 0x70F7, 0xD64A, + 0x70F8, 0xD657, 0x70F9, 0xB269, 0x70FA, 0xD648, 0x70FB, 0xDA5B, + 0x70FC, 0xD652, 0x70FD, 0xB26C, 0x70FF, 0xD653, 0x7100, 0xD656, + 0x7102, 0xD65A, 0x7104, 0xD64F, 0x7106, 0xD654, 0x7109, 0xB26A, + 0x710A, 0xB26B, 0x710B, 0xD659, 0x710C, 0xD64D, 0x710D, 0xD649, + 0x710E, 0xD65B, 0x7110, 0xD651, 0x7113, 0xD655, 0x7117, 0xD64B, + 0x7119, 0xB548, 0x711A, 0xB549, 0x711B, 0xDA65, 0x711C, 0xB54F, + 0x711E, 0xDA59, 0x711F, 0xDA62, 0x7120, 0xDA58, 0x7121, 0xB54C, + 0x7122, 0xDA60, 0x7123, 0xDA5E, 0x7125, 0xDA5F, 0x7126, 0xB54A, + 0x7128, 0xDA63, 0x712E, 0xDA5C, 0x712F, 0xDA5A, 0x7130, 0xB54B, + 0x7131, 0xDA5D, 0x7132, 0xDA61, 0x7136, 0xB54D, 0x713A, 0xDA64, + 0x7141, 0xDE70, 0x7142, 0xDE77, 0x7143, 0xDE79, 0x7144, 0xDEA1, + 0x7146, 0xB7DA, 0x7147, 0xDE6B, 0x7149, 0xB7D2, 0x714B, 0xDE7A, + 0x714C, 0xB7D7, 0x714D, 0xDEA2, 0x714E, 0xB7CE, 0x7150, 0xDE7D, + 0x7152, 0xDE6D, 0x7153, 0xDE7E, 0x7154, 0xDE6C, 0x7156, 0xB7DC, + 0x7158, 0xDE78, 0x7159, 0xB7CF, 0x715A, 0xDEA3, 0x715C, 0xB7D4, + 0x715D, 0xDE71, 0x715E, 0xB7D9, 0x715F, 0xDE7C, 0x7160, 0xDE6F, + 0x7161, 0xDE76, 0x7162, 0xDE72, 0x7163, 0xDE6E, 0x7164, 0xB7D1, + 0x7165, 0xB7D8, 0x7166, 0xB7D6, 0x7167, 0xB7D3, 0x7168, 0xB7DB, + 0x7169, 0xB7D0, 0x716A, 0xDE75, 0x716C, 0xB7D5, 0x716E, 0xB54E, + 0x7170, 0xDE7B, 0x7172, 0xDE73, 0x7178, 0xDE74, 0x717B, 0xE2C1, + 0x717D, 0xBAB4, 0x7180, 0xE2BD, 0x7181, 0xE2C3, 0x7182, 0xE2BF, + 0x7184, 0xBAB6, 0x7185, 0xE2BE, 0x7186, 0xE2C2, 0x7187, 0xE2BA, + 0x7189, 0xE2BC, 0x718A, 0xBAB5, 0x718F, 0xE2C0, 0x7190, 0xE2BB, + 0x7192, 0xBAB7, 0x7194, 0xBAB2, 0x7197, 0xE2C4, 0x7199, 0xBAB3, + 0x719A, 0xE667, 0x719B, 0xE664, 0x719C, 0xE670, 0x719D, 0xE66A, + 0x719E, 0xE66C, 0x719F, 0xBCF4, 0x71A0, 0xE666, 0x71A1, 0xE66E, + 0x71A4, 0xE66D, 0x71A5, 0xE66B, 0x71A7, 0xE671, 0x71A8, 0xBCF7, + 0x71A9, 0xE668, 0x71AA, 0xE66F, 0x71AC, 0xBCF5, 0x71AF, 0xE663, + 0x71B0, 0xE665, 0x71B1, 0xBCF6, 0x71B2, 0xE662, 0x71B3, 0xE672, + 0x71B5, 0xE669, 0x71B8, 0xEA4A, 0x71B9, 0xBF51, 0x71BC, 0xEA55, + 0x71BD, 0xEA53, 0x71BE, 0xBF4B, 0x71BF, 0xEA49, 0x71C0, 0xEA4C, + 0x71C1, 0xEA4D, 0x71C2, 0xEA48, 0x71C3, 0xBF55, 0x71C4, 0xBF56, + 0x71C5, 0xEA47, 0x71C6, 0xEA56, 0x71C7, 0xEA51, 0x71C8, 0xBF4F, + 0x71C9, 0xBF4C, 0x71CA, 0xEA50, 0x71CB, 0xEA4E, 0x71CE, 0xBF52, + 0x71CF, 0xEA52, 0x71D0, 0xBF4D, 0x71D2, 0xBF4E, 0x71D4, 0xEA4F, + 0x71D5, 0xBF50, 0x71D6, 0xEA4B, 0x71D8, 0xEA54, 0x71D9, 0xBF53, + 0x71DA, 0xEA57, 0x71DB, 0xEA58, 0x71DC, 0xBF54, 0x71DF, 0xC0E7, + 0x71E0, 0xC0EE, 0x71E1, 0xED5C, 0x71E2, 0xED62, 0x71E4, 0xED60, + 0x71E5, 0xC0EA, 0x71E6, 0xC0E9, 0x71E7, 0xC0E6, 0x71E8, 0xED5E, + 0x71EC, 0xC0EC, 0x71ED, 0xC0EB, 0x71EE, 0xC0E8, 0x71F0, 0xED61, + 0x71F1, 0xED5D, 0x71F2, 0xED5F, 0x71F4, 0xC0ED, 0x71F8, 0xC277, + 0x71F9, 0xEFFB, 0x71FB, 0xC274, 0x71FC, 0xC275, 0x71FD, 0xEFFD, + 0x71FE, 0xC276, 0x71FF, 0xEFFA, 0x7201, 0xEFF9, 0x7202, 0xF26C, + 0x7203, 0xEFFC, 0x7205, 0xF26D, 0x7206, 0xC37A, 0x7207, 0xF26B, + 0x720A, 0xF26A, 0x720C, 0xF269, 0x720D, 0xC37B, 0x7210, 0xC46C, + 0x7213, 0xF46A, 0x7214, 0xF46B, 0x7219, 0xF5DC, 0x721A, 0xF5DB, + 0x721B, 0xC4EA, 0x721D, 0xF5DA, 0x721E, 0xF6EC, 0x721F, 0xF6ED, + 0x7222, 0xF7E6, 0x7223, 0xF8B1, 0x7226, 0xF8F6, 0x7227, 0xF9BC, + 0x7228, 0xC679, 0x7229, 0xF9C6, 0x722A, 0xA4F6, 0x722C, 0xAAA6, + 0x722D, 0xAAA7, 0x7230, 0xACB8, 0x7235, 0xC0EF, 0x7236, 0xA4F7, + 0x7238, 0xAAA8, 0x7239, 0xAF52, 0x723A, 0xB7DD, 0x723B, 0xA4F8, + 0x723D, 0xB26E, 0x723E, 0xBAB8, 0x723F, 0xC962, 0x7241, 0xCFB7, + 0x7242, 0xD27D, 0x7244, 0xE2C5, 0x7246, 0xC0F0, 0x7247, 0xA4F9, + 0x7248, 0xAAA9, 0x7249, 0xCFB8, 0x724A, 0xCFB9, 0x724B, 0xDA66, + 0x724C, 0xB550, 0x724F, 0xDEA4, 0x7252, 0xB7DE, 0x7253, 0xE2C6, + 0x7256, 0xBCF8, 0x7258, 0xC37C, 0x7259, 0xA4FA, 0x725A, 0xDA67, + 0x725B, 0xA4FB, 0x725D, 0xA6C9, 0x725E, 0xCA42, 0x725F, 0xA6C8, + 0x7260, 0xA865, 0x7261, 0xA864, 0x7262, 0xA863, 0x7263, 0xCB60, + 0x7267, 0xAAAA, 0x7269, 0xAAAB, 0x726A, 0xCD5B, 0x726C, 0xCFBA, + 0x726E, 0xCFBD, 0x726F, 0xACBA, 0x7270, 0xCFBB, 0x7272, 0xACB9, + 0x7273, 0xCFBC, 0x7274, 0xACBB, 0x7276, 0xD2A2, 0x7277, 0xD2A1, + 0x7278, 0xD27E, 0x7279, 0xAF53, 0x727B, 0xD65D, 0x727C, 0xD65E, + 0x727D, 0xB26F, 0x727E, 0xD65C, 0x727F, 0xD65F, 0x7280, 0xB552, + 0x7281, 0xB270, 0x7284, 0xB551, 0x7285, 0xDA6B, 0x7286, 0xDA6A, + 0x7288, 0xDA68, 0x7289, 0xDA69, 0x728B, 0xDA6C, 0x728C, 0xDEA6, + 0x728D, 0xDEA5, 0x728E, 0xDEA9, 0x7290, 0xDEA8, 0x7291, 0xDEA7, + 0x7292, 0xBAB9, 0x7293, 0xE2C9, 0x7295, 0xE2C8, 0x7296, 0xBABA, + 0x7297, 0xE2C7, 0x7298, 0xE673, 0x729A, 0xE674, 0x729B, 0xBCF9, + 0x729D, 0xEA59, 0x729E, 0xEA5A, 0x72A1, 0xF272, 0x72A2, 0xC37D, + 0x72A3, 0xF271, 0x72A4, 0xF270, 0x72A5, 0xF26E, 0x72A6, 0xF26F, + 0x72A7, 0xC4EB, 0x72A8, 0xF46C, 0x72A9, 0xF6EE, 0x72AA, 0xF8F7, + 0x72AC, 0xA4FC, 0x72AE, 0xC9A5, 0x72AF, 0xA5C7, 0x72B0, 0xC9A6, + 0x72B4, 0xCA43, 0x72B5, 0xCA44, 0x72BA, 0xCB66, 0x72BD, 0xCB62, + 0x72BF, 0xCB61, 0x72C0, 0xAAAC, 0x72C1, 0xCB65, 0x72C2, 0xA867, + 0x72C3, 0xCB63, 0x72C4, 0xA866, 0x72C5, 0xCB67, 0x72C6, 0xCB64, + 0x72C9, 0xCD5F, 0x72CA, 0xCFBE, 0x72CB, 0xCD5D, 0x72CC, 0xCD64, + 0x72CE, 0xAAAD, 0x72D0, 0xAAB0, 0x72D1, 0xCD65, 0x72D2, 0xCD61, + 0x72D4, 0xCD62, 0x72D6, 0xCD5C, 0x72D7, 0xAAAF, 0x72D8, 0xCD5E, + 0x72D9, 0xAAAE, 0x72DA, 0xCD63, 0x72DC, 0xCD60, 0x72DF, 0xCFC2, + 0x72E0, 0xACBD, 0x72E1, 0xACBE, 0x72E3, 0xCFC5, 0x72E4, 0xCFBF, + 0x72E6, 0xCFC4, 0x72E8, 0xCFC0, 0x72E9, 0xACBC, 0x72EA, 0xCFC3, + 0x72EB, 0xCFC1, 0x72F3, 0xD2A8, 0x72F4, 0xD2A5, 0x72F6, 0xD2A7, + 0x72F7, 0xAF58, 0x72F8, 0xAF57, 0x72F9, 0xAF55, 0x72FA, 0xD2A4, + 0x72FB, 0xD2A9, 0x72FC, 0xAF54, 0x72FD, 0xAF56, 0x72FE, 0xD2A6, + 0x72FF, 0xD667, 0x7300, 0xD2A3, 0x7301, 0xD2AA, 0x7307, 0xD662, + 0x7308, 0xD666, 0x730A, 0xD665, 0x730B, 0xDA6E, 0x730C, 0xDA79, + 0x730F, 0xD668, 0x7311, 0xD663, 0x7312, 0xDA6D, 0x7313, 0xB274, + 0x7316, 0xB273, 0x7317, 0xD661, 0x7318, 0xD664, 0x7319, 0xB275, + 0x731B, 0xB272, 0x731C, 0xB271, 0x731D, 0xD660, 0x731E, 0xD669, + 0x7322, 0xDA70, 0x7323, 0xDA77, 0x7325, 0xB554, 0x7326, 0xDA76, + 0x7327, 0xDA73, 0x7329, 0xB556, 0x732D, 0xDA75, 0x7330, 0xDA6F, + 0x7331, 0xDA71, 0x7332, 0xDA74, 0x7333, 0xDA72, 0x7334, 0xB555, + 0x7335, 0xDA78, 0x7336, 0xB553, 0x7337, 0xB7DF, 0x733A, 0xDEAD, + 0x733B, 0xDEAC, 0x733C, 0xDEAA, 0x733E, 0xB7E2, 0x733F, 0xB7E1, + 0x7340, 0xDEAE, 0x7342, 0xDEAB, 0x7343, 0xE2CA, 0x7344, 0xBABB, + 0x7345, 0xB7E0, 0x7349, 0xDEB0, 0x734A, 0xDEAF, 0x734C, 0xE2CD, + 0x734D, 0xE2CB, 0x734E, 0xBCFA, 0x7350, 0xBABC, 0x7351, 0xE2CC, + 0x7352, 0xE676, 0x7357, 0xBCFB, 0x7358, 0xE675, 0x7359, 0xE67E, + 0x735A, 0xE67D, 0x735B, 0xE67B, 0x735D, 0xE67A, 0x735E, 0xE677, + 0x735F, 0xE678, 0x7360, 0xE679, 0x7361, 0xE67C, 0x7362, 0xE6A1, + 0x7365, 0xEA5F, 0x7366, 0xEA5C, 0x7367, 0xEA5D, 0x7368, 0xBF57, + 0x7369, 0xEA5B, 0x736A, 0xEA61, 0x736B, 0xEA60, 0x736C, 0xEA5E, + 0x736E, 0xED64, 0x736F, 0xED65, 0x7370, 0xC0F1, 0x7372, 0xC0F2, + 0x7373, 0xED63, 0x7375, 0xC279, 0x7376, 0xEFFE, 0x7377, 0xC278, + 0x7378, 0xC37E, 0x737A, 0xC3A1, 0x737B, 0xC46D, 0x737C, 0xF46E, + 0x737D, 0xF46D, 0x737E, 0xF5DD, 0x737F, 0xF6EF, 0x7380, 0xC57A, + 0x7381, 0xF7E8, 0x7382, 0xF7E7, 0x7383, 0xF7E9, 0x7384, 0xA5C8, + 0x7385, 0xCFC6, 0x7386, 0xAF59, 0x7387, 0xB276, 0x7388, 0xD66A, + 0x7389, 0xA5C9, 0x738A, 0xC9A7, 0x738B, 0xA4FD, 0x738E, 0xCA45, + 0x7392, 0xCB6C, 0x7393, 0xCB6A, 0x7394, 0xCB6B, 0x7395, 0xCB68, + 0x7396, 0xA868, 0x7397, 0xCB69, 0x739D, 0xCD6D, 0x739F, 0xAAB3, + 0x73A0, 0xCD6B, 0x73A1, 0xCD67, 0x73A2, 0xCD6A, 0x73A4, 0xCD66, + 0x73A5, 0xAAB5, 0x73A6, 0xCD69, 0x73A8, 0xAAB2, 0x73A9, 0xAAB1, + 0x73AB, 0xAAB4, 0x73AC, 0xCD6C, 0x73AD, 0xCD68, 0x73B2, 0xACC2, + 0x73B3, 0xACC5, 0x73B4, 0xCFCE, 0x73B5, 0xCFCD, 0x73B6, 0xCFCC, + 0x73B7, 0xACBF, 0x73B8, 0xCFD5, 0x73B9, 0xCFCB, 0x73BB, 0xACC1, + 0x73BC, 0xD2AF, 0x73BE, 0xCFD2, 0x73BF, 0xCFD0, 0x73C0, 0xACC4, + 0x73C2, 0xCFC8, 0x73C3, 0xCFD3, 0x73C5, 0xCFCA, 0x73C6, 0xCFD4, + 0x73C7, 0xCFD1, 0x73C8, 0xCFC9, 0x73CA, 0xACC0, 0x73CB, 0xCFD6, + 0x73CC, 0xCFC7, 0x73CD, 0xACC3, 0x73D2, 0xD2B4, 0x73D3, 0xD2AB, + 0x73D4, 0xD2B6, 0x73D6, 0xD2AE, 0x73D7, 0xD2B9, 0x73D8, 0xD2BA, + 0x73D9, 0xD2AC, 0x73DA, 0xD2B8, 0x73DB, 0xD2B5, 0x73DC, 0xD2B3, + 0x73DD, 0xD2B7, 0x73DE, 0xAF5F, 0x73E0, 0xAF5D, 0x73E3, 0xD2B1, + 0x73E5, 0xD2AD, 0x73E7, 0xD2B0, 0x73E8, 0xD2BB, 0x73E9, 0xD2B2, + 0x73EA, 0xAF5E, 0x73EB, 0xCFCF, 0x73ED, 0xAF5A, 0x73EE, 0xAF5C, + 0x73F4, 0xD678, 0x73F5, 0xD66D, 0x73F6, 0xD66B, 0x73F8, 0xD66C, + 0x73FA, 0xD673, 0x73FC, 0xD674, 0x73FD, 0xD670, 0x73FE, 0xB27B, + 0x73FF, 0xD675, 0x7400, 0xD672, 0x7401, 0xD66F, 0x7403, 0xB279, + 0x7404, 0xD66E, 0x7405, 0xB277, 0x7406, 0xB27A, 0x7407, 0xD671, + 0x7408, 0xD679, 0x7409, 0xAF5B, 0x740A, 0xB278, 0x740B, 0xD677, + 0x740C, 0xD676, 0x740D, 0xB27C, 0x7416, 0xDA7E, 0x741A, 0xDAA1, + 0x741B, 0xB560, 0x741D, 0xDAA7, 0x7420, 0xDAA9, 0x7421, 0xDAA2, + 0x7422, 0xB55A, 0x7423, 0xDAA6, 0x7424, 0xDAA5, 0x7425, 0xB55B, + 0x7426, 0xB561, 0x7428, 0xB562, 0x7429, 0xDAA8, 0x742A, 0xB558, + 0x742B, 0xDA7D, 0x742C, 0xDA7B, 0x742D, 0xDAA3, 0x742E, 0xDA7A, + 0x742F, 0xB55F, 0x7430, 0xDA7C, 0x7431, 0xDAA4, 0x7432, 0xDAAA, + 0x7433, 0xB559, 0x7434, 0xB55E, 0x7435, 0xB55C, 0x7436, 0xB55D, + 0x743A, 0xB557, 0x743F, 0xB7E9, 0x7440, 0xDEB7, 0x7441, 0xB7E8, + 0x7442, 0xDEBB, 0x7444, 0xDEB1, 0x7446, 0xDEBC, 0x744A, 0xDEB2, + 0x744B, 0xDEB3, 0x744D, 0xDEBD, 0x744E, 0xDEBA, 0x744F, 0xDEB8, + 0x7450, 0xDEB9, 0x7451, 0xDEB5, 0x7452, 0xDEB4, 0x7454, 0xDEBE, + 0x7455, 0xB7E5, 0x7457, 0xDEB6, 0x7459, 0xB7EA, 0x745A, 0xB7E4, + 0x745B, 0xB7EB, 0x745C, 0xB7EC, 0x745E, 0xB7E7, 0x745F, 0xB7E6, + 0x7462, 0xE2CE, 0x7463, 0xBABE, 0x7464, 0xBABD, 0x7467, 0xE2D3, + 0x7469, 0xBCFC, 0x746A, 0xBABF, 0x746D, 0xBAC1, 0x746E, 0xE2D4, + 0x746F, 0xB7E3, 0x7470, 0xBAC0, 0x7471, 0xE2D0, 0x7472, 0xE2D2, + 0x7473, 0xE2CF, 0x7475, 0xE2D1, 0x7479, 0xE6AB, 0x747C, 0xE6AA, + 0x747D, 0xE6A7, 0x747E, 0xBD40, 0x747F, 0xEA62, 0x7480, 0xBD41, + 0x7481, 0xE6A6, 0x7483, 0xBCFE, 0x7485, 0xE6A8, 0x7486, 0xE6A5, + 0x7487, 0xE6A2, 0x7488, 0xE6A9, 0x7489, 0xE6A3, 0x748A, 0xE6A4, + 0x748B, 0xBCFD, 0x7490, 0xED69, 0x7492, 0xEA66, 0x7494, 0xEA65, + 0x7495, 0xEA67, 0x7497, 0xED66, 0x7498, 0xBF5A, 0x749A, 0xEA63, + 0x749C, 0xBF58, 0x749E, 0xBF5C, 0x749F, 0xBF5B, 0x74A0, 0xEA64, + 0x74A1, 0xEA68, 0x74A3, 0xBF59, 0x74A5, 0xED6D, 0x74A6, 0xC0F5, + 0x74A7, 0xC27A, 0x74A8, 0xC0F6, 0x74A9, 0xC0F3, 0x74AA, 0xED6A, + 0x74AB, 0xED68, 0x74AD, 0xED6B, 0x74AF, 0xED6E, 0x74B0, 0xC0F4, + 0x74B1, 0xED6C, 0x74B2, 0xED67, 0x74B5, 0xF042, 0x74B6, 0xF045, + 0x74B7, 0xF275, 0x74B8, 0xF040, 0x74BA, 0xF46F, 0x74BB, 0xF046, + 0x74BD, 0xC3A2, 0x74BE, 0xF044, 0x74BF, 0xC27B, 0x74C0, 0xF041, + 0x74C1, 0xF043, 0x74C2, 0xF047, 0x74C3, 0xF276, 0x74C5, 0xF274, + 0x74CA, 0xC3A3, 0x74CB, 0xF273, 0x74CF, 0xC46E, 0x74D4, 0xC4ED, + 0x74D5, 0xF6F1, 0x74D6, 0xC4EC, 0x74D7, 0xF6F3, 0x74D8, 0xF6F0, + 0x74D9, 0xF6F2, 0x74DA, 0xC5D0, 0x74DB, 0xF8B2, 0x74DC, 0xA5CA, + 0x74DD, 0xCD6E, 0x74DE, 0xD2BC, 0x74DF, 0xD2BD, 0x74E0, 0xB27D, + 0x74E1, 0xDEBF, 0x74E2, 0xBF5D, 0x74E3, 0xC3A4, 0x74E4, 0xC57B, + 0x74E5, 0xF8B3, 0x74E6, 0xA5CB, 0x74E8, 0xCD6F, 0x74E9, 0xA260, + 0x74EC, 0xCFD7, 0x74EE, 0xCFD8, 0x74F4, 0xD2BE, 0x74F5, 0xD2BF, + 0x74F6, 0xB27E, 0x74F7, 0xB2A1, 0x74FB, 0xDAAB, 0x74FD, 0xDEC2, + 0x74FE, 0xDEC1, 0x74FF, 0xDEC0, 0x7500, 0xE2D5, 0x7502, 0xE2D6, + 0x7503, 0xE2D7, 0x7504, 0xBAC2, 0x7507, 0xE6AD, 0x7508, 0xE6AC, + 0x750B, 0xEA69, 0x750C, 0xBF5E, 0x750D, 0xBF5F, 0x750F, 0xED72, + 0x7510, 0xED6F, 0x7511, 0xED70, 0x7512, 0xED71, 0x7513, 0xF049, + 0x7514, 0xF048, 0x7515, 0xC27C, 0x7516, 0xF277, 0x7517, 0xF5DE, + 0x7518, 0xA5CC, 0x751A, 0xACC6, 0x751C, 0xB2A2, 0x751D, 0xDEC3, + 0x751F, 0xA5CD, 0x7521, 0xD2C0, 0x7522, 0xB2A3, 0x7525, 0xB563, + 0x7526, 0xB564, 0x7528, 0xA5CE, 0x7529, 0xA5CF, 0x752A, 0xCA46, + 0x752B, 0xA86A, 0x752C, 0xA869, 0x752D, 0xACC7, 0x752E, 0xCFD9, + 0x752F, 0xDAAC, 0x7530, 0xA5D0, 0x7531, 0xA5D1, 0x7532, 0xA5D2, + 0x7533, 0xA5D3, 0x7537, 0xA86B, 0x7538, 0xA86C, 0x7539, 0xCB6E, + 0x753A, 0xCB6D, 0x753D, 0xAAB6, 0x753E, 0xCD72, 0x753F, 0xCD70, + 0x7540, 0xCD71, 0x7547, 0xCFDA, 0x7548, 0xCFDB, 0x754B, 0xACCB, + 0x754C, 0xACC9, 0x754E, 0xACCA, 0x754F, 0xACC8, 0x7554, 0xAF60, + 0x7559, 0xAF64, 0x755A, 0xAF63, 0x755B, 0xD2C1, 0x755C, 0xAF62, + 0x755D, 0xAF61, 0x755F, 0xD2C2, 0x7562, 0xB2A6, 0x7563, 0xD67B, + 0x7564, 0xD67A, 0x7565, 0xB2A4, 0x7566, 0xB2A5, 0x756A, 0xB566, + 0x756B, 0xB565, 0x756C, 0xDAAE, 0x756F, 0xDAAD, 0x7570, 0xB2A7, + 0x7576, 0xB7ED, 0x7577, 0xDEC5, 0x7578, 0xB7EE, 0x7579, 0xDEC4, + 0x757D, 0xE2D8, 0x757E, 0xE6AE, 0x757F, 0xBD42, 0x7580, 0xEA6A, + 0x7584, 0xED73, 0x7586, 0xC3A6, 0x7587, 0xC3A5, 0x758A, 0xC57C, + 0x758B, 0xA5D4, 0x758C, 0xCD73, 0x758F, 0xB2A8, 0x7590, 0xE2D9, + 0x7591, 0xBAC3, 0x7594, 0xCB6F, 0x7595, 0xCB70, 0x7598, 0xCD74, + 0x7599, 0xAAB8, 0x759A, 0xAAB9, 0x759D, 0xAAB7, 0x75A2, 0xACCF, + 0x75A3, 0xACD0, 0x75A4, 0xACCD, 0x75A5, 0xACCE, 0x75A7, 0xCFDC, + 0x75AA, 0xCFDD, 0x75AB, 0xACCC, 0x75B0, 0xD2C3, 0x75B2, 0xAF68, + 0x75B3, 0xAF69, 0x75B5, 0xB2AB, 0x75B6, 0xD2C9, 0x75B8, 0xAF6E, + 0x75B9, 0xAF6C, 0x75BA, 0xD2CA, 0x75BB, 0xD2C5, 0x75BC, 0xAF6B, + 0x75BD, 0xAF6A, 0x75BE, 0xAF65, 0x75BF, 0xD2C8, 0x75C0, 0xD2C7, + 0x75C1, 0xD2C4, 0x75C2, 0xAF6D, 0x75C4, 0xD2C6, 0x75C5, 0xAF66, + 0x75C7, 0xAF67, 0x75CA, 0xB2AC, 0x75CB, 0xD6A1, 0x75CC, 0xD6A2, + 0x75CD, 0xB2AD, 0x75CE, 0xD67C, 0x75CF, 0xD67E, 0x75D0, 0xD6A4, + 0x75D1, 0xD6A3, 0x75D2, 0xD67D, 0x75D4, 0xB2A9, 0x75D5, 0xB2AA, + 0x75D7, 0xDAB6, 0x75D8, 0xB56B, 0x75D9, 0xB56A, 0x75DA, 0xDAB0, + 0x75DB, 0xB568, 0x75DD, 0xDAB3, 0x75DE, 0xB56C, 0x75DF, 0xDAB4, + 0x75E0, 0xB56D, 0x75E1, 0xDAB1, 0x75E2, 0xB567, 0x75E3, 0xB569, + 0x75E4, 0xDAB5, 0x75E6, 0xDAB2, 0x75E7, 0xDAAF, 0x75ED, 0xDED2, + 0x75EF, 0xDEC7, 0x75F0, 0xB7F0, 0x75F1, 0xB7F3, 0x75F2, 0xB7F2, + 0x75F3, 0xB7F7, 0x75F4, 0xB7F6, 0x75F5, 0xDED3, 0x75F6, 0xDED1, + 0x75F7, 0xDECA, 0x75F8, 0xDECE, 0x75F9, 0xDECD, 0x75FA, 0xB7F4, + 0x75FB, 0xDED0, 0x75FC, 0xDECC, 0x75FD, 0xDED4, 0x75FE, 0xDECB, + 0x75FF, 0xB7F5, 0x7600, 0xB7EF, 0x7601, 0xB7F1, 0x7603, 0xDEC9, + 0x7608, 0xE2DB, 0x7609, 0xBAC7, 0x760A, 0xE2DF, 0x760B, 0xBAC6, + 0x760C, 0xE2DC, 0x760D, 0xBAC5, 0x760F, 0xDEC8, 0x7610, 0xDECF, + 0x7611, 0xE2DE, 0x7613, 0xBAC8, 0x7614, 0xE2E0, 0x7615, 0xE2DD, + 0x7616, 0xE2DA, 0x7619, 0xE6B1, 0x761A, 0xE6B5, 0x761B, 0xE6B7, + 0x761C, 0xE6B3, 0x761D, 0xE6B2, 0x761E, 0xE6B0, 0x761F, 0xBD45, + 0x7620, 0xBD43, 0x7621, 0xBD48, 0x7622, 0xBD49, 0x7623, 0xE6B4, + 0x7624, 0xBD46, 0x7625, 0xE6AF, 0x7626, 0xBD47, 0x7627, 0xBAC4, + 0x7628, 0xE6B6, 0x7629, 0xBD44, 0x762D, 0xEA6C, 0x762F, 0xEA6B, + 0x7630, 0xEA73, 0x7631, 0xEA6D, 0x7632, 0xEA72, 0x7633, 0xEA6F, + 0x7634, 0xBF60, 0x7635, 0xEA71, 0x7638, 0xBF61, 0x763A, 0xBF62, + 0x763C, 0xEA70, 0x763D, 0xEA6E, 0x7642, 0xC0F8, 0x7643, 0xED74, + 0x7646, 0xC0F7, 0x7647, 0xED77, 0x7648, 0xED75, 0x7649, 0xED76, + 0x764C, 0xC0F9, 0x7650, 0xF04D, 0x7652, 0xC2A1, 0x7653, 0xF04E, + 0x7656, 0xC27D, 0x7657, 0xF04F, 0x7658, 0xC27E, 0x7659, 0xF04C, + 0x765A, 0xF050, 0x765C, 0xF04A, 0x765F, 0xC3A7, 0x7660, 0xF278, + 0x7661, 0xC3A8, 0x7662, 0xC46F, 0x7664, 0xF04B, 0x7665, 0xC470, + 0x7669, 0xC4EE, 0x766A, 0xF5DF, 0x766C, 0xC57E, 0x766D, 0xF6F4, + 0x766E, 0xC57D, 0x7670, 0xF7EA, 0x7671, 0xC5F5, 0x7672, 0xC5F6, + 0x7675, 0xF9CC, 0x7678, 0xACD1, 0x7679, 0xCFDE, 0x767B, 0xB56E, + 0x767C, 0xB56F, 0x767D, 0xA5D5, 0x767E, 0xA6CA, 0x767F, 0xCA47, + 0x7681, 0xCB71, 0x7682, 0xA86D, 0x7684, 0xAABA, 0x7686, 0xACD2, + 0x7687, 0xACD3, 0x7688, 0xACD4, 0x7689, 0xD6A6, 0x768A, 0xD2CB, + 0x768B, 0xAF6F, 0x768E, 0xB2AE, 0x768F, 0xD6A5, 0x7692, 0xDAB8, + 0x7693, 0xB571, 0x7695, 0xDAB7, 0x7696, 0xB570, 0x7699, 0xDED5, + 0x769A, 0xBD4A, 0x769B, 0xE6BB, 0x769C, 0xE6B8, 0x769D, 0xE6B9, + 0x769E, 0xE6BA, 0x76A4, 0xED78, 0x76A6, 0xF051, 0x76AA, 0xF471, + 0x76AB, 0xF470, 0x76AD, 0xF6F5, 0x76AE, 0xA5D6, 0x76AF, 0xCD75, + 0x76B0, 0xAF70, 0x76B4, 0xB572, 0x76B5, 0xDED6, 0x76B8, 0xE2E1, + 0x76BA, 0xBD4B, 0x76BB, 0xEA74, 0x76BD, 0xF052, 0x76BE, 0xF472, + 0x76BF, 0xA5D7, 0x76C2, 0xAABB, 0x76C3, 0xACD7, 0x76C4, 0xCFDF, + 0x76C5, 0xACD8, 0x76C6, 0xACD6, 0x76C8, 0xACD5, 0x76C9, 0xD2CC, + 0x76CA, 0xAF71, 0x76CD, 0xAF72, 0x76CE, 0xAF73, 0x76D2, 0xB2B0, + 0x76D3, 0xD6A7, 0x76D4, 0xB2AF, 0x76DA, 0xDAB9, 0x76DB, 0xB2B1, + 0x76DC, 0xB573, 0x76DD, 0xDED7, 0x76DE, 0xB7F8, 0x76DF, 0xB7F9, + 0x76E1, 0xBAC9, 0x76E3, 0xBACA, 0x76E4, 0xBD4C, 0x76E5, 0xBF64, + 0x76E6, 0xEA75, 0x76E7, 0xBF63, 0x76E9, 0xED79, 0x76EA, 0xC0FA, + 0x76EC, 0xF053, 0x76ED, 0xF473, 0x76EE, 0xA5D8, 0x76EF, 0xA86E, + 0x76F0, 0xCD78, 0x76F1, 0xCD77, 0x76F2, 0xAABC, 0x76F3, 0xCD76, + 0x76F4, 0xAABD, 0x76F5, 0xCD79, 0x76F7, 0xCFE5, 0x76F8, 0xACDB, + 0x76F9, 0xACDA, 0x76FA, 0xCFE7, 0x76FB, 0xCFE6, 0x76FC, 0xACDF, + 0x76FE, 0xACDE, 0x7701, 0xACD9, 0x7703, 0xCFE1, 0x7704, 0xCFE2, + 0x7705, 0xCFE3, 0x7707, 0xACE0, 0x7708, 0xCFE0, 0x7709, 0xACDC, + 0x770A, 0xCFE4, 0x770B, 0xACDD, 0x7710, 0xD2CF, 0x7711, 0xD2D3, + 0x7712, 0xD2D1, 0x7713, 0xD2D0, 0x7715, 0xD2D4, 0x7719, 0xD2D5, + 0x771A, 0xD2D6, 0x771B, 0xD2CE, 0x771D, 0xD2CD, 0x771F, 0xAF75, + 0x7720, 0xAF76, 0x7722, 0xD2D7, 0x7723, 0xD2D2, 0x7725, 0xD6B0, + 0x7727, 0xD2D8, 0x7728, 0xAF77, 0x7729, 0xAF74, 0x772D, 0xD6AA, + 0x772F, 0xD6A9, 0x7731, 0xD6AB, 0x7732, 0xD6AC, 0x7733, 0xD6AE, + 0x7734, 0xD6AD, 0x7735, 0xD6B2, 0x7736, 0xB2B5, 0x7737, 0xB2B2, + 0x7738, 0xB2B6, 0x7739, 0xD6A8, 0x773A, 0xB2B7, 0x773B, 0xD6B1, + 0x773C, 0xB2B4, 0x773D, 0xD6AF, 0x773E, 0xB2B3, 0x7744, 0xDABC, + 0x7745, 0xDABE, 0x7746, 0xDABA, 0x7747, 0xDABB, 0x774A, 0xDABF, + 0x774B, 0xDAC1, 0x774C, 0xDAC2, 0x774D, 0xDABD, 0x774E, 0xDAC0, + 0x774F, 0xB574, 0x7752, 0xDEDB, 0x7754, 0xDEE0, 0x7755, 0xDED8, + 0x7756, 0xDEDC, 0x7759, 0xDEE1, 0x775A, 0xDEDD, 0x775B, 0xB7FA, + 0x775C, 0xB843, 0x775E, 0xB7FD, 0x775F, 0xDED9, 0x7760, 0xDEDA, + 0x7761, 0xBACE, 0x7762, 0xB846, 0x7763, 0xB7FE, 0x7765, 0xB844, + 0x7766, 0xB7FC, 0x7767, 0xDEDF, 0x7768, 0xB845, 0x7769, 0xDEDE, + 0x776A, 0xB841, 0x776B, 0xB7FB, 0x776C, 0xB842, 0x776D, 0xDEE2, + 0x776E, 0xE2E6, 0x776F, 0xE2E8, 0x7779, 0xB840, 0x777C, 0xE2E3, + 0x777D, 0xBACC, 0x777E, 0xE2E9, 0x777F, 0xBACD, 0x7780, 0xE2E7, + 0x7781, 0xE2E2, 0x7782, 0xE2E5, 0x7783, 0xE2EA, 0x7784, 0xBACB, + 0x7785, 0xE2E4, 0x7787, 0xBD4E, 0x7788, 0xE6BF, 0x7789, 0xE6BE, + 0x778B, 0xBD51, 0x778C, 0xBD4F, 0x778D, 0xE6BC, 0x778E, 0xBD4D, + 0x778F, 0xE6BD, 0x7791, 0xBD50, 0x7795, 0xEA7D, 0x7797, 0xEAA1, + 0x7799, 0xEA7E, 0x779A, 0xEA76, 0x779B, 0xEA7A, 0x779C, 0xEA79, + 0x779D, 0xEA77, 0x779E, 0xBF66, 0x779F, 0xBF67, 0x77A0, 0xBF65, + 0x77A1, 0xEA78, 0x77A2, 0xEA7B, 0x77A3, 0xEA7C, 0x77A5, 0xBF68, + 0x77A7, 0xC140, 0x77A8, 0xEDA3, 0x77AA, 0xC0FC, 0x77AB, 0xED7B, + 0x77AC, 0xC0FE, 0x77AD, 0xC141, 0x77B0, 0xC0FD, 0x77B1, 0xEDA2, + 0x77B2, 0xED7C, 0x77B3, 0xC0FB, 0x77B4, 0xEDA1, 0x77B5, 0xED7A, + 0x77B6, 0xED7E, 0x77B7, 0xED7D, 0x77BA, 0xF055, 0x77BB, 0xC2A4, + 0x77BC, 0xC2A5, 0x77BD, 0xC2A2, 0x77BF, 0xC2A3, 0x77C2, 0xF054, + 0x77C4, 0xF27B, 0x77C7, 0xC3A9, 0x77C9, 0xF279, 0x77CA, 0xF27A, + 0x77CC, 0xF474, 0x77CD, 0xF477, 0x77CE, 0xF475, 0x77CF, 0xF476, + 0x77D0, 0xF5E0, 0x77D3, 0xC4EF, 0x77D4, 0xF7EB, 0x77D5, 0xF8B4, + 0x77D7, 0xC5F7, 0x77D8, 0xF8F8, 0x77D9, 0xF8F9, 0x77DA, 0xC666, + 0x77DB, 0xA5D9, 0x77DC, 0xACE1, 0x77DE, 0xDAC3, 0x77E0, 0xDEE3, + 0x77E2, 0xA5DA, 0x77E3, 0xA86F, 0x77E5, 0xAABE, 0x77E7, 0xCFE8, + 0x77E8, 0xCFE9, 0x77E9, 0xAF78, 0x77EC, 0xDAC4, 0x77ED, 0xB575, + 0x77EE, 0xB847, 0x77EF, 0xC142, 0x77F0, 0xEDA4, 0x77F1, 0xF27C, + 0x77F2, 0xF478, 0x77F3, 0xA5DB, 0x77F7, 0xCDA1, 0x77F8, 0xCD7A, + 0x77F9, 0xCD7C, 0x77FA, 0xCD7E, 0x77FB, 0xCD7D, 0x77FC, 0xCD7B, + 0x77FD, 0xAABF, 0x7802, 0xACE2, 0x7803, 0xCFF2, 0x7805, 0xCFED, + 0x7806, 0xCFEA, 0x7809, 0xCFF1, 0x780C, 0xACE4, 0x780D, 0xACE5, + 0x780E, 0xCFF0, 0x780F, 0xCFEF, 0x7810, 0xCFEE, 0x7811, 0xCFEB, + 0x7812, 0xCFEC, 0x7813, 0xCFF3, 0x7814, 0xACE3, 0x781D, 0xAF7C, + 0x781F, 0xAFA4, 0x7820, 0xAFA3, 0x7821, 0xD2E1, 0x7822, 0xD2DB, + 0x7823, 0xD2D9, 0x7825, 0xAFA1, 0x7826, 0xD6B9, 0x7827, 0xAF7A, + 0x7828, 0xD2DE, 0x7829, 0xD2E2, 0x782A, 0xD2E4, 0x782B, 0xD2E0, + 0x782C, 0xD2DA, 0x782D, 0xAFA2, 0x782E, 0xD2DF, 0x782F, 0xD2DD, + 0x7830, 0xAF79, 0x7831, 0xD2E5, 0x7832, 0xAFA5, 0x7833, 0xD2E3, + 0x7834, 0xAF7D, 0x7835, 0xD2DC, 0x7837, 0xAF7E, 0x7838, 0xAF7B, + 0x7843, 0xB2B9, 0x7845, 0xD6BA, 0x7848, 0xD6B3, 0x7849, 0xD6B5, + 0x784A, 0xD6B7, 0x784C, 0xD6B8, 0x784D, 0xD6B6, 0x784E, 0xB2BA, + 0x7850, 0xD6BB, 0x7852, 0xD6B4, 0x785C, 0xDAC8, 0x785D, 0xB576, + 0x785E, 0xDAD0, 0x7860, 0xDAC5, 0x7862, 0xDAD1, 0x7864, 0xDAC6, + 0x7865, 0xDAC7, 0x7868, 0xDACF, 0x7869, 0xDACE, 0x786A, 0xDACB, + 0x786B, 0xB2B8, 0x786C, 0xB577, 0x786D, 0xDAC9, 0x786E, 0xDACC, + 0x786F, 0xB578, 0x7870, 0xDACD, 0x7871, 0xDACA, 0x7879, 0xDEEE, + 0x787B, 0xDEF2, 0x787C, 0xB84E, 0x787E, 0xE2F0, 0x787F, 0xB851, + 0x7880, 0xDEF0, 0x7881, 0xF9D6, 0x7883, 0xDEED, 0x7884, 0xDEE8, + 0x7885, 0xDEEA, 0x7886, 0xDEEB, 0x7887, 0xDEE4, 0x7889, 0xB84D, + 0x788C, 0xB84C, 0x788E, 0xB848, 0x788F, 0xDEE7, 0x7891, 0xB84F, + 0x7893, 0xB850, 0x7894, 0xDEE6, 0x7895, 0xDEE9, 0x7896, 0xDEF1, + 0x7897, 0xB84A, 0x7898, 0xB84B, 0x7899, 0xDEEF, 0x789A, 0xDEE5, + 0x789E, 0xE2F2, 0x789F, 0xBAD0, 0x78A0, 0xE2F4, 0x78A1, 0xDEEC, + 0x78A2, 0xE2F6, 0x78A3, 0xBAD4, 0x78A4, 0xE2F7, 0x78A5, 0xE2F3, + 0x78A7, 0xBAD1, 0x78A8, 0xE2EF, 0x78A9, 0xBAD3, 0x78AA, 0xE2EC, + 0x78AB, 0xE2F1, 0x78AC, 0xE2F5, 0x78AD, 0xE2EE, 0x78B0, 0xB849, + 0x78B2, 0xE2EB, 0x78B3, 0xBAD2, 0x78B4, 0xE2ED, 0x78BA, 0xBD54, + 0x78BB, 0xE6C1, 0x78BC, 0xBD58, 0x78BE, 0xBD56, 0x78C1, 0xBACF, + 0x78C3, 0xE6C8, 0x78C4, 0xE6C9, 0x78C5, 0xBD53, 0x78C8, 0xE6C7, + 0x78C9, 0xE6CA, 0x78CA, 0xBD55, 0x78CB, 0xBD52, 0x78CC, 0xE6C3, + 0x78CD, 0xE6C0, 0x78CE, 0xE6C5, 0x78CF, 0xE6C2, 0x78D0, 0xBD59, + 0x78D1, 0xE6C4, 0x78D4, 0xE6C6, 0x78D5, 0xBD57, 0x78DA, 0xBF6A, + 0x78DB, 0xEAA8, 0x78DD, 0xEAA2, 0x78DE, 0xEAA6, 0x78DF, 0xEAAC, + 0x78E0, 0xEAAD, 0x78E1, 0xEAA9, 0x78E2, 0xEAAA, 0x78E3, 0xEAA7, + 0x78E5, 0xEAA4, 0x78E7, 0xBF6C, 0x78E8, 0xBF69, 0x78E9, 0xEAA3, + 0x78EA, 0xEAA5, 0x78EC, 0xBF6B, 0x78ED, 0xEAAB, 0x78EF, 0xC146, + 0x78F2, 0xEDAA, 0x78F3, 0xEDA5, 0x78F4, 0xC145, 0x78F7, 0xC143, + 0x78F9, 0xEDAC, 0x78FA, 0xC144, 0x78FB, 0xEDA8, 0x78FC, 0xEDA9, + 0x78FD, 0xEDA6, 0x78FE, 0xEDAD, 0x78FF, 0xF056, 0x7901, 0xC147, + 0x7902, 0xEDA7, 0x7904, 0xEDAE, 0x7905, 0xEDAB, 0x7909, 0xF05A, + 0x790C, 0xF057, 0x790E, 0xC2A6, 0x7910, 0xF05B, 0x7911, 0xF05D, + 0x7912, 0xF05C, 0x7913, 0xF058, 0x7914, 0xF059, 0x7917, 0xF2A3, + 0x7919, 0xC3AA, 0x791B, 0xF27E, 0x791C, 0xF2A2, 0x791D, 0xF27D, + 0x791E, 0xF2A4, 0x7921, 0xF2A1, 0x7923, 0xF47A, 0x7924, 0xF47D, + 0x7925, 0xF479, 0x7926, 0xC471, 0x7927, 0xF47B, 0x7928, 0xF47C, + 0x7929, 0xF47E, 0x792A, 0xC472, 0x792B, 0xC474, 0x792C, 0xC473, + 0x792D, 0xF5E1, 0x792F, 0xF5E3, 0x7931, 0xF5E2, 0x7935, 0xF6F6, + 0x7938, 0xF8B5, 0x7939, 0xF8FA, 0x793A, 0xA5DC, 0x793D, 0xCB72, + 0x793E, 0xAAC0, 0x793F, 0xCDA3, 0x7940, 0xAAC1, 0x7941, 0xAAC2, + 0x7942, 0xCDA2, 0x7944, 0xCFF8, 0x7945, 0xCFF7, 0x7946, 0xACE6, + 0x7947, 0xACE9, 0x7948, 0xACE8, 0x7949, 0xACE7, 0x794A, 0xCFF4, + 0x794B, 0xCFF6, 0x794C, 0xCFF5, 0x794F, 0xD2E8, 0x7950, 0xAFA7, + 0x7951, 0xD2EC, 0x7952, 0xD2EB, 0x7953, 0xD2EA, 0x7954, 0xD2E6, + 0x7955, 0xAFA6, 0x7956, 0xAFAA, 0x7957, 0xAFAD, 0x795A, 0xAFAE, + 0x795B, 0xD2E7, 0x795C, 0xD2E9, 0x795D, 0xAFAC, 0x795E, 0xAFAB, + 0x795F, 0xAFA9, 0x7960, 0xAFA8, 0x7961, 0xD6C2, 0x7963, 0xD6C0, + 0x7964, 0xD6BC, 0x7965, 0xB2BB, 0x7967, 0xD6BD, 0x7968, 0xB2BC, + 0x7969, 0xD6BE, 0x796A, 0xD6BF, 0x796B, 0xD6C1, 0x796D, 0xB2BD, + 0x7970, 0xDAD5, 0x7972, 0xDAD4, 0x7973, 0xDAD3, 0x7974, 0xDAD2, + 0x7979, 0xDEF6, 0x797A, 0xB852, 0x797C, 0xDEF3, 0x797D, 0xDEF5, + 0x797F, 0xB853, 0x7981, 0xB854, 0x7982, 0xDEF4, 0x7988, 0xE341, + 0x798A, 0xE2F9, 0x798B, 0xE2FA, 0x798D, 0xBAD7, 0x798E, 0xBAD5, + 0x798F, 0xBAD6, 0x7990, 0xE343, 0x7992, 0xE342, 0x7993, 0xE2FE, + 0x7994, 0xE2FD, 0x7995, 0xE2FC, 0x7996, 0xE2FB, 0x7997, 0xE340, + 0x7998, 0xE2F8, 0x799A, 0xE6CB, 0x799B, 0xE6D0, 0x799C, 0xE6CE, + 0x79A0, 0xE6CD, 0x79A1, 0xE6CC, 0x79A2, 0xE6CF, 0x79A4, 0xEAAE, + 0x79A6, 0xBF6D, 0x79A7, 0xC148, 0x79A8, 0xEDB0, 0x79AA, 0xC149, + 0x79AB, 0xEDAF, 0x79AC, 0xF05F, 0x79AD, 0xF05E, 0x79AE, 0xC2A7, + 0x79B0, 0xF2A5, 0x79B1, 0xC3AB, 0x79B2, 0xF4A1, 0x79B3, 0xC5A1, + 0x79B4, 0xF6F7, 0x79B6, 0xF8B7, 0x79B7, 0xF8B6, 0x79B8, 0xC9A8, + 0x79B9, 0xACEA, 0x79BA, 0xACEB, 0x79BB, 0xD6C3, 0x79BD, 0xB856, + 0x79BE, 0xA5DD, 0x79BF, 0xA872, 0x79C0, 0xA871, 0x79C1, 0xA870, + 0x79C5, 0xCDA4, 0x79C8, 0xAAC4, 0x79C9, 0xAAC3, 0x79CB, 0xACEE, + 0x79CD, 0xCFFA, 0x79CE, 0xCFFD, 0x79CF, 0xCFFB, 0x79D1, 0xACEC, + 0x79D2, 0xACED, 0x79D5, 0xCFF9, 0x79D6, 0xCFFC, 0x79D8, 0xAFB5, + 0x79DC, 0xD2F3, 0x79DD, 0xD2F5, 0x79DE, 0xD2F4, 0x79DF, 0xAFB2, + 0x79E0, 0xD2EF, 0x79E3, 0xAFB0, 0x79E4, 0xAFAF, 0x79E6, 0xAFB3, + 0x79E7, 0xAFB1, 0x79E9, 0xAFB4, 0x79EA, 0xD2F2, 0x79EB, 0xD2ED, + 0x79EC, 0xD2EE, 0x79ED, 0xD2F1, 0x79EE, 0xD2F0, 0x79F6, 0xD6C6, + 0x79F7, 0xD6C7, 0x79F8, 0xD6C5, 0x79FA, 0xD6C4, 0x79FB, 0xB2BE, + 0x7A00, 0xB57D, 0x7A02, 0xDAD6, 0x7A03, 0xDAD8, 0x7A04, 0xDADA, + 0x7A05, 0xB57C, 0x7A08, 0xB57A, 0x7A0A, 0xDAD7, 0x7A0B, 0xB57B, + 0x7A0C, 0xDAD9, 0x7A0D, 0xB579, 0x7A10, 0xDF41, 0x7A11, 0xDEF7, + 0x7A12, 0xDEFA, 0x7A13, 0xDEFE, 0x7A14, 0xB85A, 0x7A15, 0xDEFC, + 0x7A17, 0xDEFB, 0x7A18, 0xDEF8, 0x7A19, 0xDEF9, 0x7A1A, 0xB858, + 0x7A1B, 0xDF40, 0x7A1C, 0xB857, 0x7A1E, 0xB85C, 0x7A1F, 0xB85B, + 0x7A20, 0xB859, 0x7A22, 0xDEFD, 0x7A26, 0xE349, 0x7A28, 0xE348, + 0x7A2B, 0xE344, 0x7A2E, 0xBAD8, 0x7A2F, 0xE347, 0x7A30, 0xE346, + 0x7A31, 0xBAD9, 0x7A37, 0xBD5E, 0x7A39, 0xE6D2, 0x7A3B, 0xBD5F, + 0x7A3C, 0xBD5B, 0x7A3D, 0xBD5D, 0x7A3F, 0xBD5A, 0x7A40, 0xBD5C, + 0x7A44, 0xEAAF, 0x7A46, 0xBF70, 0x7A47, 0xEAB1, 0x7A48, 0xEAB0, + 0x7A4A, 0xE345, 0x7A4B, 0xBF72, 0x7A4C, 0xBF71, 0x7A4D, 0xBF6E, + 0x7A4E, 0xBF6F, 0x7A54, 0xEDB5, 0x7A56, 0xEDB3, 0x7A57, 0xC14A, + 0x7A58, 0xEDB4, 0x7A5A, 0xEDB6, 0x7A5B, 0xEDB2, 0x7A5C, 0xEDB1, + 0x7A5F, 0xF060, 0x7A60, 0xC2AA, 0x7A61, 0xC2A8, 0x7A62, 0xC2A9, + 0x7A67, 0xF2A6, 0x7A68, 0xF2A7, 0x7A69, 0xC3AD, 0x7A6B, 0xC3AC, + 0x7A6C, 0xF4A3, 0x7A6D, 0xF4A4, 0x7A6E, 0xF4A2, 0x7A70, 0xF6F8, + 0x7A71, 0xF6F9, 0x7A74, 0xA5DE, 0x7A75, 0xCA48, 0x7A76, 0xA873, + 0x7A78, 0xCDA5, 0x7A79, 0xAAC6, 0x7A7A, 0xAAC5, 0x7A7B, 0xCDA6, + 0x7A7E, 0xD040, 0x7A7F, 0xACEF, 0x7A80, 0xCFFE, 0x7A81, 0xACF0, + 0x7A84, 0xAFB6, 0x7A85, 0xD2F8, 0x7A86, 0xD2F6, 0x7A87, 0xD2FC, + 0x7A88, 0xAFB7, 0x7A89, 0xD2F7, 0x7A8A, 0xD2FB, 0x7A8B, 0xD2F9, + 0x7A8C, 0xD2FA, 0x7A8F, 0xD6C8, 0x7A90, 0xD6CA, 0x7A92, 0xB2BF, + 0x7A94, 0xD6C9, 0x7A95, 0xB2C0, 0x7A96, 0xB5A2, 0x7A97, 0xB5A1, + 0x7A98, 0xB57E, 0x7A99, 0xDADB, 0x7A9E, 0xDF44, 0x7A9F, 0xB85D, + 0x7AA0, 0xB85E, 0x7AA2, 0xDF43, 0x7AA3, 0xDF42, 0x7AA8, 0xE34A, + 0x7AA9, 0xBADB, 0x7AAA, 0xBADA, 0x7AAB, 0xE34B, 0x7AAC, 0xE34C, + 0x7AAE, 0xBD61, 0x7AAF, 0xBD60, 0x7AB1, 0xEAB5, 0x7AB2, 0xE6D3, + 0x7AB3, 0xE6D5, 0x7AB4, 0xE6D4, 0x7AB5, 0xEAB4, 0x7AB6, 0xEAB2, + 0x7AB7, 0xEAB6, 0x7AB8, 0xEAB3, 0x7ABA, 0xBF73, 0x7ABE, 0xEDB7, + 0x7ABF, 0xC14B, 0x7AC0, 0xEDB8, 0x7AC1, 0xEDB9, 0x7AC4, 0xC2AB, + 0x7AC5, 0xC2AC, 0x7AC7, 0xC475, 0x7ACA, 0xC5D1, 0x7ACB, 0xA5DF, + 0x7AD1, 0xD041, 0x7AD8, 0xD2FD, 0x7AD9, 0xAFB8, 0x7ADF, 0xB3BA, + 0x7AE0, 0xB3B9, 0x7AE3, 0xB5A4, 0x7AE4, 0xDADD, 0x7AE5, 0xB5A3, + 0x7AE6, 0xDADC, 0x7AEB, 0xDF45, 0x7AED, 0xBADC, 0x7AEE, 0xE34D, + 0x7AEF, 0xBADD, 0x7AF6, 0xC476, 0x7AF7, 0xF4A5, 0x7AF9, 0xA6CB, + 0x7AFA, 0xAAC7, 0x7AFB, 0xCDA7, 0x7AFD, 0xACF2, 0x7AFF, 0xACF1, + 0x7B00, 0xD042, 0x7B01, 0xD043, 0x7B04, 0xD340, 0x7B05, 0xD342, + 0x7B06, 0xAFB9, 0x7B08, 0xD344, 0x7B09, 0xD347, 0x7B0A, 0xD345, + 0x7B0E, 0xD346, 0x7B0F, 0xD343, 0x7B10, 0xD2FE, 0x7B11, 0xAFBA, + 0x7B12, 0xD348, 0x7B13, 0xD341, 0x7B18, 0xD6D3, 0x7B19, 0xB2C6, + 0x7B1A, 0xD6DC, 0x7B1B, 0xB2C3, 0x7B1D, 0xD6D5, 0x7B1E, 0xB2C7, + 0x7B20, 0xB2C1, 0x7B22, 0xD6D0, 0x7B23, 0xD6DD, 0x7B24, 0xD6D1, + 0x7B25, 0xD6CE, 0x7B26, 0xB2C5, 0x7B28, 0xB2C2, 0x7B2A, 0xD6D4, + 0x7B2B, 0xD6D7, 0x7B2C, 0xB2C4, 0x7B2D, 0xD6D8, 0x7B2E, 0xB2C8, + 0x7B2F, 0xD6D9, 0x7B30, 0xD6CF, 0x7B31, 0xD6D6, 0x7B32, 0xD6DA, + 0x7B33, 0xD6D2, 0x7B34, 0xD6CD, 0x7B35, 0xD6CB, 0x7B38, 0xD6DB, + 0x7B3B, 0xDADF, 0x7B40, 0xDAE4, 0x7B44, 0xDAE0, 0x7B45, 0xDAE6, + 0x7B46, 0xB5A7, 0x7B47, 0xD6CC, 0x7B48, 0xDAE1, 0x7B49, 0xB5A5, + 0x7B4A, 0xDADE, 0x7B4B, 0xB5AC, 0x7B4C, 0xDAE2, 0x7B4D, 0xB5AB, + 0x7B4E, 0xDAE3, 0x7B4F, 0xB5AD, 0x7B50, 0xB5A8, 0x7B51, 0xB5AE, + 0x7B52, 0xB5A9, 0x7B54, 0xB5AA, 0x7B56, 0xB5A6, 0x7B58, 0xDAE5, + 0x7B60, 0xB861, 0x7B61, 0xDF50, 0x7B63, 0xDF53, 0x7B64, 0xDF47, + 0x7B65, 0xDF4C, 0x7B66, 0xDF46, 0x7B67, 0xB863, 0x7B69, 0xDF4A, + 0x7B6D, 0xDF48, 0x7B6E, 0xB862, 0x7B70, 0xDF4F, 0x7B71, 0xDF4E, + 0x7B72, 0xDF4B, 0x7B73, 0xDF4D, 0x7B74, 0xDF49, 0x7B75, 0xBAE1, + 0x7B76, 0xDF52, 0x7B77, 0xB85F, 0x7B78, 0xDF51, 0x7B82, 0xE35D, + 0x7B84, 0xBAE8, 0x7B85, 0xE358, 0x7B87, 0xBAE7, 0x7B88, 0xE34E, + 0x7B8A, 0xE350, 0x7B8B, 0xBAE0, 0x7B8C, 0xE355, 0x7B8D, 0xE354, + 0x7B8E, 0xE357, 0x7B8F, 0xBAE5, 0x7B90, 0xE352, 0x7B91, 0xE351, + 0x7B94, 0xBAE4, 0x7B95, 0xBADF, 0x7B96, 0xE353, 0x7B97, 0xBAE2, + 0x7B98, 0xE359, 0x7B99, 0xE35B, 0x7B9B, 0xE356, 0x7B9C, 0xE34F, + 0x7B9D, 0xBAE3, 0x7BA0, 0xBD69, 0x7BA1, 0xBADE, 0x7BA4, 0xE35C, + 0x7BAC, 0xE6D9, 0x7BAD, 0xBD62, 0x7BAF, 0xE6DB, 0x7BB1, 0xBD63, + 0x7BB4, 0xBD65, 0x7BB5, 0xE6DE, 0x7BB7, 0xE6D6, 0x7BB8, 0xBAE6, + 0x7BB9, 0xE6DC, 0x7BBE, 0xE6D8, 0x7BC0, 0xB860, 0x7BC1, 0xBD68, + 0x7BC4, 0xBD64, 0x7BC6, 0xBD66, 0x7BC7, 0xBD67, 0x7BC9, 0xBF76, + 0x7BCA, 0xE6DD, 0x7BCB, 0xE6D7, 0x7BCC, 0xBD6A, 0x7BCE, 0xE6DA, + 0x7BD4, 0xEAC0, 0x7BD5, 0xEABB, 0x7BD8, 0xEAC5, 0x7BD9, 0xBF74, + 0x7BDA, 0xEABD, 0x7BDB, 0xBF78, 0x7BDC, 0xEAC3, 0x7BDD, 0xEABA, + 0x7BDE, 0xEAB7, 0x7BDF, 0xEAC6, 0x7BE0, 0xC151, 0x7BE1, 0xBF79, + 0x7BE2, 0xEAC2, 0x7BE3, 0xEAB8, 0x7BE4, 0xBF77, 0x7BE5, 0xEABC, + 0x7BE6, 0xBF7B, 0x7BE7, 0xEAB9, 0x7BE8, 0xEABE, 0x7BE9, 0xBF7A, + 0x7BEA, 0xEAC1, 0x7BEB, 0xEAC4, 0x7BF0, 0xEDCB, 0x7BF1, 0xEDCC, + 0x7BF2, 0xEDBC, 0x7BF3, 0xEDC3, 0x7BF4, 0xEDC1, 0x7BF7, 0xC14F, + 0x7BF8, 0xEDC8, 0x7BF9, 0xEABF, 0x7BFB, 0xEDBF, 0x7BFD, 0xEDC9, + 0x7BFE, 0xC14E, 0x7BFF, 0xEDBE, 0x7C00, 0xEDBD, 0x7C01, 0xEDC7, + 0x7C02, 0xEDC4, 0x7C03, 0xEDC6, 0x7C05, 0xEDBA, 0x7C06, 0xEDCA, + 0x7C07, 0xC14C, 0x7C09, 0xEDC5, 0x7C0A, 0xEDCE, 0x7C0B, 0xEDC2, + 0x7C0C, 0xC150, 0x7C0D, 0xC14D, 0x7C0E, 0xEDC0, 0x7C0F, 0xEDBB, + 0x7C10, 0xEDCD, 0x7C11, 0xBF75, 0x7C19, 0xF063, 0x7C1C, 0xF061, + 0x7C1D, 0xF067, 0x7C1E, 0xC2B0, 0x7C1F, 0xF065, 0x7C20, 0xF064, + 0x7C21, 0xC2B2, 0x7C22, 0xF06A, 0x7C23, 0xC2B1, 0x7C25, 0xF06B, + 0x7C26, 0xF068, 0x7C27, 0xC2AE, 0x7C28, 0xF069, 0x7C29, 0xF062, + 0x7C2A, 0xC2AF, 0x7C2B, 0xC2AD, 0x7C2C, 0xF2AB, 0x7C2D, 0xF066, + 0x7C30, 0xF06C, 0x7C33, 0xF2A8, 0x7C37, 0xC3B2, 0x7C38, 0xC3B0, + 0x7C39, 0xF2AA, 0x7C3B, 0xF2AC, 0x7C3C, 0xF2A9, 0x7C3D, 0xC3B1, + 0x7C3E, 0xC3AE, 0x7C3F, 0xC3AF, 0x7C40, 0xC3B3, 0x7C43, 0xC478, + 0x7C45, 0xF4AA, 0x7C47, 0xF4A9, 0x7C48, 0xF4A7, 0x7C49, 0xF4A6, + 0x7C4A, 0xF4A8, 0x7C4C, 0xC477, 0x7C4D, 0xC479, 0x7C50, 0xC4F0, + 0x7C53, 0xF5E5, 0x7C54, 0xF5E4, 0x7C57, 0xF6FA, 0x7C59, 0xF6FC, + 0x7C5A, 0xF6FE, 0x7C5B, 0xF6FD, 0x7C5C, 0xF6FB, 0x7C5F, 0xC5A3, + 0x7C60, 0xC5A2, 0x7C63, 0xC5D3, 0x7C64, 0xC5D2, 0x7C65, 0xC5D4, + 0x7C66, 0xF7ED, 0x7C67, 0xF7EC, 0x7C69, 0xF8FB, 0x7C6A, 0xF8B8, + 0x7C6B, 0xF8FC, 0x7C6C, 0xC658, 0x7C6E, 0xC659, 0x7C6F, 0xF96D, + 0x7C72, 0xC67E, 0x7C73, 0xA6CC, 0x7C75, 0xCDA8, 0x7C78, 0xD045, + 0x7C79, 0xD046, 0x7C7A, 0xD044, 0x7C7D, 0xACF3, 0x7C7F, 0xD047, + 0x7C80, 0xD048, 0x7C81, 0xD049, 0x7C84, 0xD349, 0x7C85, 0xD34F, + 0x7C88, 0xD34D, 0x7C89, 0xAFBB, 0x7C8A, 0xD34B, 0x7C8C, 0xD34C, + 0x7C8D, 0xD34E, 0x7C91, 0xD34A, 0x7C92, 0xB2C9, 0x7C94, 0xD6DE, + 0x7C95, 0xB2CB, 0x7C96, 0xD6E0, 0x7C97, 0xB2CA, 0x7C98, 0xD6DF, + 0x7C9E, 0xDAE8, 0x7C9F, 0xB5AF, 0x7CA1, 0xDAEA, 0x7CA2, 0xDAE7, + 0x7CA3, 0xD6E1, 0x7CA5, 0xB5B0, 0x7CA7, 0xF9DB, 0x7CA8, 0xDAE9, + 0x7CAF, 0xDF56, 0x7CB1, 0xB864, 0x7CB2, 0xDF54, 0x7CB3, 0xB865, + 0x7CB4, 0xDF55, 0x7CB5, 0xB866, 0x7CB9, 0xBAE9, 0x7CBA, 0xE361, + 0x7CBB, 0xE35E, 0x7CBC, 0xE360, 0x7CBD, 0xBAEA, 0x7CBE, 0xBAEB, + 0x7CBF, 0xE35F, 0x7CC5, 0xE6DF, 0x7CC8, 0xE6E0, 0x7CCA, 0xBD6B, + 0x7CCB, 0xE6E2, 0x7CCC, 0xE6E1, 0x7CCE, 0xA261, 0x7CD0, 0xEACA, + 0x7CD1, 0xEACB, 0x7CD2, 0xEAC7, 0x7CD4, 0xEAC8, 0x7CD5, 0xBF7C, + 0x7CD6, 0xBF7D, 0x7CD7, 0xEAC9, 0x7CD9, 0xC157, 0x7CDC, 0xC153, + 0x7CDD, 0xC158, 0x7CDE, 0xC154, 0x7CDF, 0xC156, 0x7CE0, 0xC152, + 0x7CE2, 0xC155, 0x7CE7, 0xC2B3, 0x7CE8, 0xEDCF, 0x7CEA, 0xF2AE, + 0x7CEC, 0xF2AD, 0x7CEE, 0xF4AB, 0x7CEF, 0xC47A, 0x7CF0, 0xC47B, + 0x7CF1, 0xF741, 0x7CF2, 0xF5E6, 0x7CF4, 0xF740, 0x7CF6, 0xF8FD, + 0x7CF7, 0xF9A4, 0x7CF8, 0xA6CD, 0x7CFB, 0xA874, 0x7CFD, 0xCDA9, + 0x7CFE, 0xAAC8, 0x7D00, 0xACF6, 0x7D01, 0xD04C, 0x7D02, 0xACF4, + 0x7D03, 0xD04A, 0x7D04, 0xACF9, 0x7D05, 0xACF5, 0x7D06, 0xACFA, + 0x7D07, 0xACF8, 0x7D08, 0xD04B, 0x7D09, 0xACF7, 0x7D0A, 0xAFBF, + 0x7D0B, 0xAFBE, 0x7D0C, 0xD35A, 0x7D0D, 0xAFC7, 0x7D0E, 0xD353, + 0x7D0F, 0xD359, 0x7D10, 0xAFC3, 0x7D11, 0xD352, 0x7D12, 0xD358, + 0x7D13, 0xD356, 0x7D14, 0xAFC2, 0x7D15, 0xAFC4, 0x7D16, 0xD355, + 0x7D17, 0xAFBD, 0x7D18, 0xD354, 0x7D19, 0xAFC8, 0x7D1A, 0xAFC5, + 0x7D1B, 0xAFC9, 0x7D1C, 0xAFC6, 0x7D1D, 0xD351, 0x7D1E, 0xD350, + 0x7D1F, 0xD357, 0x7D20, 0xAFC0, 0x7D21, 0xAFBC, 0x7D22, 0xAFC1, + 0x7D28, 0xD6F0, 0x7D29, 0xD6E9, 0x7D2B, 0xB5B5, 0x7D2C, 0xD6E8, + 0x7D2E, 0xB2CF, 0x7D2F, 0xB2D6, 0x7D30, 0xB2D3, 0x7D31, 0xB2D9, + 0x7D32, 0xB2D8, 0x7D33, 0xB2D4, 0x7D35, 0xD6E2, 0x7D36, 0xD6E5, + 0x7D38, 0xD6E4, 0x7D39, 0xB2D0, 0x7D3A, 0xD6E6, 0x7D3B, 0xD6EF, + 0x7D3C, 0xB2D1, 0x7D3D, 0xD6E3, 0x7D3E, 0xD6EC, 0x7D3F, 0xD6ED, + 0x7D40, 0xB2D2, 0x7D41, 0xD6EA, 0x7D42, 0xB2D7, 0x7D43, 0xB2CD, + 0x7D44, 0xB2D5, 0x7D45, 0xD6E7, 0x7D46, 0xB2CC, 0x7D47, 0xD6EB, + 0x7D4A, 0xD6EE, 0x7D4E, 0xDAFB, 0x7D4F, 0xDAF2, 0x7D50, 0xB5B2, + 0x7D51, 0xDAF9, 0x7D52, 0xDAF6, 0x7D53, 0xDAEE, 0x7D54, 0xDAF7, + 0x7D55, 0xB5B4, 0x7D56, 0xDAEF, 0x7D58, 0xDAEB, 0x7D5B, 0xB86C, + 0x7D5C, 0xDAF4, 0x7D5E, 0xB5B1, 0x7D5F, 0xDAFA, 0x7D61, 0xB5B8, + 0x7D62, 0xB5BA, 0x7D63, 0xDAED, 0x7D66, 0xB5B9, 0x7D67, 0xDAF0, + 0x7D68, 0xB5B3, 0x7D69, 0xDAF8, 0x7D6A, 0xDAF1, 0x7D6B, 0xDAF5, + 0x7D6D, 0xDAF3, 0x7D6E, 0xB5B6, 0x7D6F, 0xDAEC, 0x7D70, 0xB5BB, + 0x7D71, 0xB2CE, 0x7D72, 0xB5B7, 0x7D73, 0xB5BC, 0x7D79, 0xB868, + 0x7D7A, 0xDF5D, 0x7D7B, 0xDF5F, 0x7D7C, 0xDF61, 0x7D7D, 0xDF65, + 0x7D7F, 0xDF5B, 0x7D80, 0xDF59, 0x7D81, 0xB86A, 0x7D83, 0xDF60, + 0x7D84, 0xDF64, 0x7D85, 0xDF5C, 0x7D86, 0xDF58, 0x7D88, 0xDF57, + 0x7D8C, 0xDF62, 0x7D8D, 0xDF5A, 0x7D8E, 0xDF5E, 0x7D8F, 0xB86B, + 0x7D91, 0xB869, 0x7D92, 0xDF66, 0x7D93, 0xB867, 0x7D94, 0xDF63, + 0x7D96, 0xE372, 0x7D9C, 0xBAEE, 0x7D9D, 0xE36A, 0x7D9E, 0xBD78, + 0x7D9F, 0xE374, 0x7DA0, 0xBAF1, 0x7DA1, 0xE378, 0x7DA2, 0xBAF7, + 0x7DA3, 0xE365, 0x7DA6, 0xE375, 0x7DA7, 0xE362, 0x7DA9, 0xE377, + 0x7DAA, 0xE366, 0x7DAC, 0xBAFE, 0x7DAD, 0xBAFB, 0x7DAE, 0xE376, + 0x7DAF, 0xE370, 0x7DB0, 0xBAED, 0x7DB1, 0xBAF5, 0x7DB2, 0xBAF4, + 0x7DB4, 0xBAF3, 0x7DB5, 0xBAF9, 0x7DB7, 0xE363, 0x7DB8, 0xBAFA, + 0x7DB9, 0xE371, 0x7DBA, 0xBAF6, 0x7DBB, 0xBAEC, 0x7DBC, 0xE373, + 0x7DBD, 0xBAEF, 0x7DBE, 0xBAF0, 0x7DBF, 0xBAF8, 0x7DC0, 0xE368, + 0x7DC1, 0xE367, 0x7DC2, 0xE364, 0x7DC4, 0xE36C, 0x7DC5, 0xE369, + 0x7DC6, 0xE36D, 0x7DC7, 0xBAFD, 0x7DC9, 0xE379, 0x7DCA, 0xBAF2, + 0x7DCB, 0xE36E, 0x7DCC, 0xE36F, 0x7DCE, 0xE36B, 0x7DD2, 0xBAFC, + 0x7DD7, 0xE6E7, 0x7DD8, 0xBD70, 0x7DD9, 0xBD79, 0x7DDA, 0xBD75, + 0x7DDB, 0xE6E4, 0x7DDD, 0xBD72, 0x7DDE, 0xBD76, 0x7DDF, 0xE6F0, + 0x7DE0, 0xBD6C, 0x7DE1, 0xE6E8, 0x7DE3, 0xBD74, 0x7DE6, 0xE6EB, + 0x7DE7, 0xE6E6, 0x7DE8, 0xBD73, 0x7DE9, 0xBD77, 0x7DEA, 0xE6E5, + 0x7DEC, 0xBD71, 0x7DEE, 0xE6EF, 0x7DEF, 0xBD6E, 0x7DF0, 0xE6EE, + 0x7DF1, 0xE6ED, 0x7DF2, 0xBD7A, 0x7DF3, 0xE572, 0x7DF4, 0xBD6D, + 0x7DF6, 0xE6EC, 0x7DF7, 0xE6E3, 0x7DF9, 0xBD7B, 0x7DFA, 0xE6EA, + 0x7DFB, 0xBD6F, 0x7E03, 0xE6E9, 0x7E08, 0xBFA2, 0x7E09, 0xBFA7, + 0x7E0A, 0xBF7E, 0x7E0B, 0xEAD8, 0x7E0C, 0xEACF, 0x7E0D, 0xEADB, + 0x7E0E, 0xEAD3, 0x7E0F, 0xEAD9, 0x7E10, 0xBFA8, 0x7E11, 0xBFA1, + 0x7E12, 0xEACC, 0x7E13, 0xEAD2, 0x7E14, 0xEADC, 0x7E15, 0xEAD5, + 0x7E16, 0xEADA, 0x7E17, 0xEACE, 0x7E1A, 0xEAD6, 0x7E1B, 0xBFA3, + 0x7E1C, 0xEAD4, 0x7E1D, 0xBFA6, 0x7E1E, 0xBFA5, 0x7E1F, 0xEAD0, + 0x7E20, 0xEAD1, 0x7E21, 0xEACD, 0x7E22, 0xEAD7, 0x7E23, 0xBFA4, + 0x7E24, 0xEADE, 0x7E25, 0xEADD, 0x7E29, 0xEDDA, 0x7E2A, 0xEDD6, + 0x7E2B, 0xC15F, 0x7E2D, 0xEDD0, 0x7E2E, 0xC159, 0x7E2F, 0xC169, + 0x7E30, 0xEDDC, 0x7E31, 0xC161, 0x7E32, 0xC15D, 0x7E33, 0xEDD3, + 0x7E34, 0xC164, 0x7E35, 0xC167, 0x7E36, 0xEDDE, 0x7E37, 0xC15C, + 0x7E38, 0xEDD5, 0x7E39, 0xC165, 0x7E3A, 0xEDE0, 0x7E3B, 0xEDDD, + 0x7E3C, 0xEDD1, 0x7E3D, 0xC160, 0x7E3E, 0xC15A, 0x7E3F, 0xC168, + 0x7E40, 0xEDD8, 0x7E41, 0xC163, 0x7E42, 0xEDD2, 0x7E43, 0xC15E, + 0x7E44, 0xEDDF, 0x7E45, 0xC162, 0x7E46, 0xC15B, 0x7E47, 0xEDD9, + 0x7E48, 0xC166, 0x7E49, 0xEDD7, 0x7E4C, 0xEDDB, 0x7E50, 0xF06E, + 0x7E51, 0xF074, 0x7E52, 0xC2B9, 0x7E53, 0xF077, 0x7E54, 0xC2B4, + 0x7E55, 0xC2B5, 0x7E56, 0xF06F, 0x7E57, 0xF076, 0x7E58, 0xF071, + 0x7E59, 0xC2BA, 0x7E5A, 0xC2B7, 0x7E5C, 0xF06D, 0x7E5E, 0xC2B6, + 0x7E5F, 0xF073, 0x7E60, 0xF075, 0x7E61, 0xC2B8, 0x7E62, 0xF072, + 0x7E63, 0xF070, 0x7E68, 0xF2B8, 0x7E69, 0xC3B7, 0x7E6A, 0xC3B8, + 0x7E6B, 0xC3B4, 0x7E6D, 0xC3B5, 0x7E6F, 0xF2B4, 0x7E70, 0xF2B2, + 0x7E72, 0xF2B6, 0x7E73, 0xC3BA, 0x7E74, 0xF2B7, 0x7E75, 0xF2B0, + 0x7E76, 0xF2AF, 0x7E77, 0xF2B3, 0x7E78, 0xF2B1, 0x7E79, 0xC3B6, + 0x7E7A, 0xF2B5, 0x7E7B, 0xF4AC, 0x7E7C, 0xC47E, 0x7E7D, 0xC47D, + 0x7E7E, 0xF4AD, 0x7E80, 0xF4AF, 0x7E81, 0xF4AE, 0x7E82, 0xC4A1, + 0x7E86, 0xF5EB, 0x7E87, 0xF5E8, 0x7E88, 0xF5E9, 0x7E8A, 0xF5E7, + 0x7E8B, 0xF5EA, 0x7E8C, 0xC4F2, 0x7E8D, 0xF5EC, 0x7E8F, 0xC4F1, + 0x7E91, 0xF742, 0x7E93, 0xC5D5, 0x7E94, 0xC5D7, 0x7E95, 0xF7EE, + 0x7E96, 0xC5D6, 0x7E97, 0xF8B9, 0x7E98, 0xF940, 0x7E99, 0xF942, + 0x7E9A, 0xF8FE, 0x7E9B, 0xF941, 0x7E9C, 0xC66C, 0x7F36, 0xA6CE, + 0x7F38, 0xACFB, 0x7F39, 0xD26F, 0x7F3A, 0xAFCA, 0x7F3D, 0xB2DA, + 0x7F3E, 0xDAFC, 0x7F3F, 0xDAFD, 0x7F43, 0xEADF, 0x7F44, 0xC16A, + 0x7F45, 0xEDE1, 0x7F48, 0xC2BB, 0x7F4A, 0xF2BA, 0x7F4B, 0xF2B9, + 0x7F4C, 0xC4A2, 0x7F4D, 0xF5ED, 0x7F4F, 0xF743, 0x7F50, 0xC5F8, + 0x7F51, 0xCA49, 0x7F54, 0xAAC9, 0x7F55, 0xA875, 0x7F58, 0xD04D, + 0x7F5B, 0xD360, 0x7F5C, 0xD35B, 0x7F5D, 0xD35F, 0x7F5E, 0xD35D, + 0x7F5F, 0xAFCB, 0x7F60, 0xD35E, 0x7F61, 0xD35C, 0x7F63, 0xD6F1, + 0x7F65, 0xDAFE, 0x7F66, 0xDB40, 0x7F67, 0xDF69, 0x7F68, 0xDF6A, + 0x7F69, 0xB86E, 0x7F6A, 0xB86F, 0x7F6B, 0xDF68, 0x7F6C, 0xDF6B, + 0x7F6D, 0xDF67, 0x7F6E, 0xB86D, 0x7F70, 0xBB40, 0x7F72, 0xB870, + 0x7F73, 0xE37A, 0x7F75, 0xBD7C, 0x7F76, 0xE6F1, 0x7F77, 0xBD7D, + 0x7F79, 0xBFA9, 0x7F7A, 0xEAE2, 0x7F7B, 0xEAE0, 0x7F7C, 0xEAE1, + 0x7F7D, 0xEDE4, 0x7F7E, 0xEDE3, 0x7F7F, 0xEDE2, 0x7F83, 0xF2BB, + 0x7F85, 0xC3B9, 0x7F86, 0xF2BC, 0x7F87, 0xF744, 0x7F88, 0xC5F9, + 0x7F89, 0xF8BA, 0x7F8A, 0xA6CF, 0x7F8B, 0xAACB, 0x7F8C, 0xAACA, + 0x7F8D, 0xD04F, 0x7F8E, 0xACFC, 0x7F91, 0xD04E, 0x7F92, 0xD362, + 0x7F94, 0xAFCC, 0x7F95, 0xD6F2, 0x7F96, 0xD361, 0x7F9A, 0xB2DC, + 0x7F9B, 0xD6F5, 0x7F9C, 0xD6F3, 0x7F9D, 0xD6F4, 0x7F9E, 0xB2DB, + 0x7FA0, 0xDB42, 0x7FA1, 0xDB43, 0x7FA2, 0xDB41, 0x7FA4, 0xB873, + 0x7FA5, 0xDF6D, 0x7FA6, 0xDF6C, 0x7FA7, 0xDF6E, 0x7FA8, 0xB872, + 0x7FA9, 0xB871, 0x7FAC, 0xE6F2, 0x7FAD, 0xE6F4, 0x7FAF, 0xBD7E, + 0x7FB0, 0xE6F3, 0x7FB1, 0xEAE3, 0x7FB2, 0xBFAA, 0x7FB3, 0xF079, + 0x7FB5, 0xF078, 0x7FB6, 0xC3BB, 0x7FB7, 0xF2BD, 0x7FB8, 0xC3BD, + 0x7FB9, 0xC3BC, 0x7FBA, 0xF4B0, 0x7FBB, 0xF5EE, 0x7FBC, 0xC4F3, + 0x7FBD, 0xA6D0, 0x7FBE, 0xD050, 0x7FBF, 0xACFD, 0x7FC0, 0xD365, + 0x7FC1, 0xAFCE, 0x7FC2, 0xD364, 0x7FC3, 0xD363, 0x7FC5, 0xAFCD, + 0x7FC7, 0xD6FB, 0x7FC9, 0xD6FD, 0x7FCA, 0xD6F6, 0x7FCB, 0xD6F7, + 0x7FCC, 0xB2DD, 0x7FCD, 0xD6F8, 0x7FCE, 0xB2DE, 0x7FCF, 0xD6FC, + 0x7FD0, 0xD6F9, 0x7FD1, 0xD6FA, 0x7FD2, 0xB2DF, 0x7FD4, 0xB5BE, + 0x7FD5, 0xB5BF, 0x7FD7, 0xDB44, 0x7FDB, 0xDF6F, 0x7FDC, 0xDF70, + 0x7FDE, 0xE37E, 0x7FDF, 0xBB43, 0x7FE0, 0xBB41, 0x7FE1, 0xBB42, + 0x7FE2, 0xE37B, 0x7FE3, 0xE37C, 0x7FE5, 0xE37D, 0x7FE6, 0xE6F9, + 0x7FE8, 0xE6FA, 0x7FE9, 0xBDA1, 0x7FEA, 0xE6F7, 0x7FEB, 0xE6F6, + 0x7FEC, 0xE6F8, 0x7FED, 0xE6F5, 0x7FEE, 0xBFAD, 0x7FEF, 0xEAE4, + 0x7FF0, 0xBFAB, 0x7FF1, 0xBFAC, 0x7FF2, 0xEDE6, 0x7FF3, 0xC16B, + 0x7FF4, 0xEDE5, 0x7FF5, 0xEFA8, 0x7FF7, 0xF07A, 0x7FF8, 0xF07B, + 0x7FF9, 0xC2BC, 0x7FFB, 0xC2BD, 0x7FFC, 0xC16C, 0x7FFD, 0xF2BE, + 0x7FFE, 0xF2BF, 0x7FFF, 0xF4B1, 0x8000, 0xC4A3, 0x8001, 0xA6D1, + 0x8003, 0xA6D2, 0x8004, 0xACFE, 0x8005, 0xAACC, 0x8006, 0xAFCF, + 0x8007, 0xD051, 0x800B, 0xB5C0, 0x800C, 0xA6D3, 0x800D, 0xAD41, + 0x800E, 0xD052, 0x800F, 0xD053, 0x8010, 0xAD40, 0x8011, 0xAD42, + 0x8012, 0xA6D4, 0x8014, 0xD054, 0x8015, 0xAFD1, 0x8016, 0xD366, + 0x8017, 0xAFD3, 0x8018, 0xAFD0, 0x8019, 0xAFD2, 0x801B, 0xD741, + 0x801C, 0xB2E0, 0x801E, 0xD740, 0x801F, 0xD6FE, 0x8021, 0xDF71, + 0x8024, 0xE3A1, 0x8026, 0xBDA2, 0x8028, 0xBFAE, 0x8029, 0xEAE6, + 0x802A, 0xEAE5, 0x802C, 0xEDE7, 0x8030, 0xF5EF, 0x8033, 0xA6D5, + 0x8034, 0xCB73, 0x8035, 0xCDAA, 0x8036, 0xAD43, 0x8037, 0xD055, + 0x8039, 0xD368, 0x803D, 0xAFD4, 0x803E, 0xD367, 0x803F, 0xAFD5, + 0x8043, 0xD743, 0x8046, 0xB2E2, 0x8047, 0xD742, 0x8048, 0xD744, + 0x804A, 0xB2E1, 0x804F, 0xDB46, 0x8050, 0xDB47, 0x8051, 0xDB45, + 0x8052, 0xB5C1, 0x8056, 0xB874, 0x8058, 0xB875, 0x805A, 0xBB45, + 0x805C, 0xE3A3, 0x805D, 0xE3A2, 0x805E, 0xBB44, 0x8064, 0xE6FB, + 0x8067, 0xE6FC, 0x806C, 0xEAE7, 0x806F, 0xC170, 0x8070, 0xC16F, + 0x8071, 0xC16D, 0x8072, 0xC16E, 0x8073, 0xC171, 0x8075, 0xF07C, + 0x8076, 0xC2BF, 0x8077, 0xC2BE, 0x8078, 0xF2C0, 0x8079, 0xF4B2, + 0x807D, 0xC5A5, 0x807E, 0xC5A4, 0x807F, 0xA6D6, 0x8082, 0xD1FB, + 0x8084, 0xB877, 0x8085, 0xB5C2, 0x8086, 0xB876, 0x8087, 0xBB46, + 0x8089, 0xA6D7, 0x808A, 0xC9A9, 0x808B, 0xA6D8, 0x808C, 0xA6D9, + 0x808F, 0xCDAB, 0x8090, 0xCB76, 0x8092, 0xCB77, 0x8093, 0xA877, + 0x8095, 0xCB74, 0x8096, 0xA876, 0x8098, 0xA879, 0x8099, 0xCB75, + 0x809A, 0xA87B, 0x809B, 0xA87A, 0x809C, 0xCB78, 0x809D, 0xA878, + 0x80A1, 0xAAD1, 0x80A2, 0xAACF, 0x80A3, 0xCDAD, 0x80A5, 0xAACE, + 0x80A9, 0xAAD3, 0x80AA, 0xAAD5, 0x80AB, 0xAAD2, 0x80AD, 0xCDB0, + 0x80AE, 0xCDAC, 0x80AF, 0xAAD6, 0x80B1, 0xAAD0, 0x80B2, 0xA87C, + 0x80B4, 0xAAD4, 0x80B5, 0xCDAF, 0x80B8, 0xCDAE, 0x80BA, 0xAACD, + 0x80C2, 0xD05B, 0x80C3, 0xAD47, 0x80C4, 0xAD48, 0x80C5, 0xD05D, + 0x80C7, 0xD057, 0x80C8, 0xD05A, 0x80C9, 0xD063, 0x80CA, 0xD061, + 0x80CC, 0xAD49, 0x80CD, 0xD067, 0x80CE, 0xAD4C, 0x80CF, 0xD064, + 0x80D0, 0xD05C, 0x80D1, 0xD059, 0x80D4, 0xDB49, 0x80D5, 0xD062, + 0x80D6, 0xAD44, 0x80D7, 0xD065, 0x80D8, 0xD056, 0x80D9, 0xD05F, + 0x80DA, 0xAD46, 0x80DB, 0xAD4B, 0x80DC, 0xD060, 0x80DD, 0xAD4F, + 0x80DE, 0xAD4D, 0x80E0, 0xD058, 0x80E1, 0xAD4A, 0x80E3, 0xD05E, + 0x80E4, 0xAD4E, 0x80E5, 0xAD45, 0x80E6, 0xD066, 0x80ED, 0xAFDA, + 0x80EF, 0xAFE3, 0x80F0, 0xAFD8, 0x80F1, 0xAFD6, 0x80F2, 0xD36A, + 0x80F3, 0xAFDE, 0x80F4, 0xAFDB, 0x80F5, 0xD36C, 0x80F8, 0xAFDD, + 0x80F9, 0xD36B, 0x80FA, 0xD369, 0x80FB, 0xD36E, 0x80FC, 0xAFE2, + 0x80FD, 0xAFE0, 0x80FE, 0xDB48, 0x8100, 0xD36F, 0x8101, 0xD36D, + 0x8102, 0xAFD7, 0x8105, 0xAFD9, 0x8106, 0xAFDC, 0x8108, 0xAFDF, + 0x810A, 0xAFE1, 0x8115, 0xD74E, 0x8116, 0xB2E4, 0x8118, 0xD745, + 0x8119, 0xD747, 0x811B, 0xD748, 0x811D, 0xD750, 0x811E, 0xD74C, + 0x811F, 0xD74A, 0x8121, 0xD74D, 0x8122, 0xD751, 0x8123, 0xB2E5, + 0x8124, 0xB2E9, 0x8125, 0xD746, 0x8127, 0xD74F, 0x8129, 0xB2E7, + 0x812B, 0xB2E6, 0x812C, 0xD74B, 0x812D, 0xD749, 0x812F, 0xB2E3, + 0x8130, 0xB2E8, 0x8139, 0xB5C8, 0x813A, 0xDB51, 0x813D, 0xDB4F, + 0x813E, 0xB5CA, 0x8143, 0xDB4A, 0x8144, 0xDFA1, 0x8146, 0xB5C9, + 0x8147, 0xDB4E, 0x814A, 0xDB4B, 0x814B, 0xB5C5, 0x814C, 0xB5CB, + 0x814D, 0xDB50, 0x814E, 0xB5C7, 0x814F, 0xDB4D, 0x8150, 0xBB47, + 0x8151, 0xB5C6, 0x8152, 0xDB4C, 0x8153, 0xB5CC, 0x8154, 0xB5C4, + 0x8155, 0xB5C3, 0x815B, 0xDF77, 0x815C, 0xDF75, 0x815E, 0xDF7B, + 0x8160, 0xDF73, 0x8161, 0xDFA2, 0x8162, 0xDF78, 0x8164, 0xDF72, + 0x8165, 0xB87B, 0x8166, 0xB8A3, 0x8167, 0xDF7D, 0x8169, 0xDF76, + 0x816B, 0xB87E, 0x816E, 0xB87C, 0x816F, 0xDF7E, 0x8170, 0xB879, + 0x8171, 0xB878, 0x8172, 0xDF79, 0x8173, 0xB87D, 0x8174, 0xB5CD, + 0x8176, 0xDF7C, 0x8177, 0xDF74, 0x8178, 0xB87A, 0x8179, 0xB8A1, + 0x817A, 0xB8A2, 0x817F, 0xBB4C, 0x8180, 0xBB48, 0x8182, 0xBB4D, + 0x8183, 0xE3A6, 0x8186, 0xE3A5, 0x8187, 0xE3A7, 0x8188, 0xBB4A, + 0x8189, 0xE3A4, 0x818A, 0xBB4B, 0x818B, 0xE3AA, 0x818C, 0xE3A9, + 0x818D, 0xE3A8, 0x818F, 0xBB49, 0x8195, 0xE741, 0x8197, 0xE744, + 0x8198, 0xBDA8, 0x8199, 0xE743, 0x819A, 0xBDA7, 0x819B, 0xBDA3, + 0x819C, 0xBDA4, 0x819D, 0xBDA5, 0x819E, 0xE740, 0x819F, 0xE6FE, + 0x81A0, 0xBDA6, 0x81A2, 0xE742, 0x81A3, 0xE6FD, 0x81A6, 0xEAE9, + 0x81A7, 0xEAF3, 0x81A8, 0xBFB1, 0x81A9, 0xBFB0, 0x81AB, 0xEAED, + 0x81AC, 0xEAEF, 0x81AE, 0xEAEA, 0x81B0, 0xEAEE, 0x81B1, 0xEAE8, + 0x81B2, 0xEAF1, 0x81B3, 0xBFAF, 0x81B4, 0xEAF0, 0x81B5, 0xEAEC, + 0x81B7, 0xEAF2, 0x81B9, 0xEAEB, 0x81BA, 0xC174, 0x81BB, 0xEDE8, + 0x81BC, 0xEDEE, 0x81BD, 0xC178, 0x81BE, 0xC17A, 0x81BF, 0xC177, + 0x81C0, 0xC176, 0x81C2, 0xC175, 0x81C3, 0xC173, 0x81C4, 0xEDE9, + 0x81C5, 0xEDEC, 0x81C6, 0xC172, 0x81C7, 0xEDED, 0x81C9, 0xC179, + 0x81CA, 0xEDEB, 0x81CC, 0xEDEA, 0x81CD, 0xC2C0, 0x81CF, 0xC2C1, + 0x81D0, 0xF0A1, 0x81D1, 0xF07D, 0x81D2, 0xF07E, 0x81D5, 0xF2C2, + 0x81D7, 0xF2C1, 0x81D8, 0xC3BE, 0x81D9, 0xF4B4, 0x81DA, 0xC4A4, + 0x81DB, 0xF4B3, 0x81DD, 0xF5F0, 0x81DE, 0xF745, 0x81DF, 0xC5A6, + 0x81E0, 0xF943, 0x81E1, 0xF944, 0x81E2, 0xC5D8, 0x81E3, 0xA6DA, + 0x81E5, 0xAAD7, 0x81E6, 0xDB52, 0x81E7, 0xBB4E, 0x81E8, 0xC17B, + 0x81E9, 0xEDEF, 0x81EA, 0xA6DB, 0x81EC, 0xAFE5, 0x81ED, 0xAFE4, + 0x81EE, 0xDB53, 0x81F2, 0xEAF4, 0x81F3, 0xA6DC, 0x81F4, 0xAD50, + 0x81F7, 0xDB54, 0x81F8, 0xDB55, 0x81F9, 0xDB56, 0x81FA, 0xBB4F, + 0x81FB, 0xBFB2, 0x81FC, 0xA6DD, 0x81FE, 0xAAD8, 0x81FF, 0xD068, + 0x8200, 0xAFE6, 0x8201, 0xD370, 0x8202, 0xB2EA, 0x8204, 0xDB57, + 0x8205, 0xB8A4, 0x8207, 0xBB50, 0x8208, 0xBFB3, 0x8209, 0xC17C, + 0x820A, 0xC2C2, 0x820B, 0xF4B5, 0x820C, 0xA6DE, 0x820D, 0xAAD9, + 0x8210, 0xAFE7, 0x8211, 0xD752, 0x8212, 0xB5CE, 0x8214, 0xBB51, + 0x8215, 0xE3AB, 0x8216, 0xE745, 0x821B, 0xA6DF, 0x821C, 0xB5CF, + 0x821D, 0xDFA3, 0x821E, 0xBB52, 0x821F, 0xA6E0, 0x8220, 0xCDB1, + 0x8221, 0xD069, 0x8222, 0xAD51, 0x8225, 0xD372, 0x8228, 0xAFEA, + 0x822A, 0xAFE8, 0x822B, 0xAFE9, 0x822C, 0xAFEB, 0x822F, 0xD371, + 0x8232, 0xD757, 0x8233, 0xD754, 0x8234, 0xD756, 0x8235, 0xB2EB, + 0x8236, 0xB2ED, 0x8237, 0xB2EC, 0x8238, 0xD753, 0x8239, 0xB2EE, + 0x823A, 0xD755, 0x823C, 0xDB58, 0x823D, 0xDB59, 0x823F, 0xDB5A, + 0x8240, 0xDFA6, 0x8242, 0xDFA7, 0x8244, 0xDFA5, 0x8245, 0xDFA8, + 0x8247, 0xB8A5, 0x8249, 0xDFA4, 0x824B, 0xBB53, 0x824E, 0xE74A, + 0x824F, 0xE746, 0x8250, 0xE749, 0x8251, 0xE74B, 0x8252, 0xE748, + 0x8253, 0xE747, 0x8255, 0xEAF5, 0x8256, 0xEAF6, 0x8257, 0xEAF7, + 0x8258, 0xBFB4, 0x8259, 0xBFB5, 0x825A, 0xEDF1, 0x825B, 0xEDF0, + 0x825C, 0xEDF2, 0x825E, 0xF0A3, 0x825F, 0xF0A2, 0x8261, 0xF2C4, + 0x8263, 0xF2C5, 0x8264, 0xF2C3, 0x8266, 0xC4A5, 0x8268, 0xF4B6, + 0x8269, 0xF4B7, 0x826B, 0xF746, 0x826C, 0xF7EF, 0x826D, 0xF8BB, + 0x826E, 0xA6E1, 0x826F, 0xA87D, 0x8271, 0xC17D, 0x8272, 0xA6E2, + 0x8274, 0xD758, 0x8275, 0xDB5B, 0x8277, 0xC641, 0x8278, 0xCA4A, + 0x827C, 0xCA4B, 0x827D, 0xCA4D, 0x827E, 0xA6E3, 0x827F, 0xCA4E, + 0x8280, 0xCA4C, 0x8283, 0xCBA2, 0x8284, 0xCBA3, 0x8285, 0xCB7B, + 0x828A, 0xCBA1, 0x828B, 0xA8A1, 0x828D, 0xA8A2, 0x828E, 0xCB7C, + 0x828F, 0xCB7A, 0x8290, 0xCB79, 0x8291, 0xCB7D, 0x8292, 0xA87E, + 0x8293, 0xCB7E, 0x8294, 0xD06A, 0x8298, 0xCDB6, 0x8299, 0xAADC, + 0x829A, 0xCDB5, 0x829B, 0xCDB7, 0x829D, 0xAADB, 0x829E, 0xCDBC, + 0x829F, 0xAADF, 0x82A0, 0xCDB2, 0x82A1, 0xCDC0, 0x82A2, 0xCDC6, + 0x82A3, 0xAAE6, 0x82A4, 0xCDC3, 0x82A5, 0xAAE3, 0x82A7, 0xCDB9, + 0x82A8, 0xCDBF, 0x82A9, 0xCDC1, 0x82AB, 0xCDB4, 0x82AC, 0xAAE2, + 0x82AD, 0xAADD, 0x82AE, 0xCDBA, 0x82AF, 0xAAE4, 0x82B0, 0xAAE7, + 0x82B1, 0xAAE1, 0x82B3, 0xAADA, 0x82B4, 0xCDBE, 0x82B5, 0xCDB8, + 0x82B6, 0xCDC5, 0x82B7, 0xAAE9, 0x82B8, 0xAAE5, 0x82B9, 0xAAE0, + 0x82BA, 0xCDBD, 0x82BB, 0xAFEC, 0x82BC, 0xCDBB, 0x82BD, 0xAADE, + 0x82BE, 0xAAE8, 0x82C0, 0xCDB3, 0x82C2, 0xCDC2, 0x82C3, 0xCDC4, + 0x82D1, 0xAD62, 0x82D2, 0xAD5C, 0x82D3, 0xAD64, 0x82D4, 0xAD61, + 0x82D5, 0xD071, 0x82D6, 0xD074, 0x82D7, 0xAD5D, 0x82D9, 0xD06B, + 0x82DB, 0xAD56, 0x82DC, 0xAD60, 0x82DE, 0xAD63, 0x82DF, 0xAD65, + 0x82E0, 0xD0A2, 0x82E1, 0xD077, 0x82E3, 0xAD55, 0x82E4, 0xD0A1, + 0x82E5, 0xAD59, 0x82E6, 0xAD57, 0x82E7, 0xAD52, 0x82E8, 0xD06F, + 0x82EA, 0xD07E, 0x82EB, 0xD073, 0x82EC, 0xD076, 0x82ED, 0xD0A5, + 0x82EF, 0xAD66, 0x82F0, 0xD07D, 0x82F1, 0xAD5E, 0x82F2, 0xD078, + 0x82F3, 0xD0A4, 0x82F4, 0xD075, 0x82F5, 0xD079, 0x82F6, 0xD07C, + 0x82F9, 0xD06D, 0x82FA, 0xD0A3, 0x82FB, 0xD07B, 0x82FE, 0xD06C, + 0x8300, 0xD070, 0x8301, 0xAD5F, 0x8302, 0xAD5A, 0x8303, 0xAD53, + 0x8304, 0xAD58, 0x8305, 0xAD54, 0x8306, 0xAD67, 0x8307, 0xD06E, + 0x8308, 0xD3A5, 0x8309, 0xAD5B, 0x830C, 0xD07A, 0x830D, 0xCE41, + 0x8316, 0xD3A8, 0x8317, 0xAFFA, 0x8319, 0xD376, 0x831B, 0xD3A3, + 0x831C, 0xD37D, 0x831E, 0xD3B2, 0x8320, 0xD3AA, 0x8322, 0xD37E, + 0x8324, 0xD3A9, 0x8325, 0xD378, 0x8326, 0xD37C, 0x8327, 0xD3B5, + 0x8328, 0xAFFD, 0x8329, 0xD3AD, 0x832A, 0xD3A4, 0x832B, 0xAFED, + 0x832C, 0xD3B3, 0x832D, 0xD374, 0x832F, 0xD3AC, 0x8331, 0xAFFC, + 0x8332, 0xAFF7, 0x8333, 0xD373, 0x8334, 0xAFF5, 0x8335, 0xAFF4, + 0x8336, 0xAFF9, 0x8337, 0xD3AB, 0x8338, 0xAFF1, 0x8339, 0xAFF8, + 0x833A, 0xD072, 0x833B, 0xDB5C, 0x833C, 0xD3A6, 0x833F, 0xD37A, + 0x8340, 0xAFFB, 0x8341, 0xD37B, 0x8342, 0xD3A1, 0x8343, 0xAFFE, + 0x8344, 0xD375, 0x8345, 0xD3AF, 0x8347, 0xD3AE, 0x8348, 0xD3B6, + 0x8349, 0xAFF3, 0x834A, 0xAFF0, 0x834B, 0xD3B4, 0x834C, 0xD3B0, + 0x834D, 0xD3A7, 0x834E, 0xD3A2, 0x834F, 0xAFF6, 0x8350, 0xAFF2, + 0x8351, 0xD377, 0x8352, 0xAFEE, 0x8353, 0xD3B1, 0x8354, 0xAFEF, + 0x8356, 0xD379, 0x8373, 0xD75E, 0x8374, 0xD760, 0x8375, 0xD765, + 0x8376, 0xD779, 0x8377, 0xB2FC, 0x8378, 0xB2F2, 0x837A, 0xD75D, + 0x837B, 0xB2FD, 0x837C, 0xB2FE, 0x837D, 0xD768, 0x837E, 0xD76F, + 0x837F, 0xD775, 0x8381, 0xD762, 0x8383, 0xD769, 0x8386, 0xB340, + 0x8387, 0xD777, 0x8388, 0xD772, 0x8389, 0xB2FA, 0x838A, 0xB2F8, + 0x838B, 0xD76E, 0x838C, 0xD76A, 0x838D, 0xD75C, 0x838E, 0xB2EF, + 0x838F, 0xD761, 0x8390, 0xD759, 0x8392, 0xB2F7, 0x8393, 0xB2F9, + 0x8394, 0xD766, 0x8395, 0xD763, 0x8396, 0xB2F4, 0x8397, 0xD773, + 0x8398, 0xB2F1, 0x8399, 0xD764, 0x839A, 0xD77A, 0x839B, 0xD76C, + 0x839D, 0xD76B, 0x839E, 0xB2F0, 0x83A0, 0xB2FB, 0x83A2, 0xB2F3, + 0x83A3, 0xD75A, 0x83A4, 0xD75F, 0x83A5, 0xD770, 0x83A6, 0xD776, + 0x83A7, 0xB341, 0x83A8, 0xD75B, 0x83A9, 0xD767, 0x83AA, 0xD76D, + 0x83AB, 0xB2F6, 0x83AE, 0xD778, 0x83AF, 0xD771, 0x83B0, 0xD774, + 0x83BD, 0xB2F5, 0x83BF, 0xDB6C, 0x83C0, 0xDB60, 0x83C1, 0xB5D7, + 0x83C2, 0xDB7D, 0x83C3, 0xDBA7, 0x83C4, 0xDBAA, 0x83C5, 0xB5D5, + 0x83C6, 0xDB68, 0x83C7, 0xDBA3, 0x83C8, 0xDB69, 0x83C9, 0xDB77, + 0x83CA, 0xB5E2, 0x83CB, 0xDB73, 0x83CC, 0xB5DF, 0x83CE, 0xDB74, + 0x83CF, 0xDB5D, 0x83D1, 0xDBA4, 0x83D4, 0xB5E8, 0x83D5, 0xDBA1, + 0x83D6, 0xDB75, 0x83D7, 0xDBAC, 0x83D8, 0xDB70, 0x83D9, 0xDFC8, + 0x83DB, 0xDBAF, 0x83DC, 0xB5E6, 0x83DD, 0xDB6E, 0x83DE, 0xDB7A, + 0x83DF, 0xB5E9, 0x83E0, 0xB5D4, 0x83E1, 0xDB72, 0x83E2, 0xDBAD, + 0x83E3, 0xDB6B, 0x83E4, 0xDB64, 0x83E5, 0xDB6F, 0x83E7, 0xDB63, + 0x83E8, 0xDB61, 0x83E9, 0xB5D0, 0x83EA, 0xDBA5, 0x83EB, 0xDB6A, + 0x83EC, 0xDBA8, 0x83EE, 0xDBA9, 0x83EF, 0xB5D8, 0x83F0, 0xB5DD, + 0x83F1, 0xB5D9, 0x83F2, 0xB5E1, 0x83F3, 0xDB7E, 0x83F4, 0xB5DA, + 0x83F5, 0xDB76, 0x83F6, 0xDB66, 0x83F8, 0xB5D2, 0x83F9, 0xDB5E, + 0x83FA, 0xDBA2, 0x83FB, 0xDBAB, 0x83FC, 0xDB65, 0x83FD, 0xB5E0, + 0x83FE, 0xDBB0, 0x83FF, 0xDB71, 0x8401, 0xDB6D, 0x8403, 0xB5D1, + 0x8404, 0xB5E5, 0x8406, 0xDB7C, 0x8407, 0xB5E7, 0x8409, 0xDB78, + 0x840A, 0xB5DC, 0x840B, 0xB5D6, 0x840C, 0xB5DE, 0x840D, 0xB5D3, + 0x840E, 0xB5E4, 0x840F, 0xDB79, 0x8410, 0xDB67, 0x8411, 0xDB7B, + 0x8412, 0xDB62, 0x8413, 0xDBA6, 0x841B, 0xDBAE, 0x8423, 0xDB5F, + 0x8429, 0xDFC7, 0x842B, 0xDFDD, 0x842C, 0xB855, 0x842D, 0xDFCC, + 0x842F, 0xDFCA, 0x8430, 0xDFB5, 0x8431, 0xB8A9, 0x8432, 0xDFC5, + 0x8433, 0xDFD9, 0x8434, 0xDFC1, 0x8435, 0xB8B1, 0x8436, 0xDFD8, + 0x8437, 0xDFBF, 0x8438, 0xB5E3, 0x8439, 0xDFCF, 0x843A, 0xDFC0, + 0x843B, 0xDFD6, 0x843C, 0xB8B0, 0x843D, 0xB8A8, 0x843F, 0xDFAA, + 0x8440, 0xDFB2, 0x8442, 0xDFCB, 0x8443, 0xDFC3, 0x8444, 0xDFDC, + 0x8445, 0xDFC6, 0x8446, 0xB8B6, 0x8447, 0xDFD7, 0x8449, 0xB8AD, + 0x844B, 0xDFC9, 0x844C, 0xDFD1, 0x844D, 0xDFB6, 0x844E, 0xDFD0, + 0x8450, 0xDFE1, 0x8451, 0xDFB1, 0x8452, 0xDFD2, 0x8454, 0xDFDF, + 0x8456, 0xDFAB, 0x8457, 0xB5DB, 0x8459, 0xDFB9, 0x845A, 0xDFB8, + 0x845B, 0xB8AF, 0x845D, 0xDFBC, 0x845E, 0xDFBE, 0x845F, 0xDFCD, + 0x8460, 0xDFDE, 0x8461, 0xB8B2, 0x8463, 0xB8B3, 0x8465, 0xDFB0, + 0x8466, 0xB8AB, 0x8467, 0xDFB4, 0x8468, 0xDFDA, 0x8469, 0xB8B4, + 0x846B, 0xB8AC, 0x846C, 0xB8AE, 0x846D, 0xB8B5, 0x846E, 0xDFE0, + 0x846F, 0xDFD3, 0x8470, 0xDFCE, 0x8473, 0xDFBB, 0x8474, 0xDFBA, + 0x8475, 0xB8AA, 0x8476, 0xDFAC, 0x8477, 0xB8A7, 0x8478, 0xDFC4, + 0x8479, 0xDFAD, 0x847A, 0xDFC2, 0x847D, 0xDFB7, 0x847E, 0xDFDB, + 0x8482, 0xB8A6, 0x8486, 0xDFB3, 0x848D, 0xDFAF, 0x848E, 0xDFD5, + 0x848F, 0xDFAE, 0x8490, 0xBB60, 0x8491, 0xE3D3, 0x8494, 0xE3C2, + 0x8497, 0xE3AC, 0x8498, 0xE3CA, 0x8499, 0xBB58, 0x849A, 0xE3BB, + 0x849B, 0xE3C5, 0x849C, 0xBB5B, 0x849D, 0xE3BE, 0x849E, 0xBB59, + 0x849F, 0xE3AF, 0x84A0, 0xE3CD, 0x84A1, 0xE3AE, 0x84A2, 0xE3C1, + 0x84A4, 0xE3AD, 0x84A7, 0xE3BF, 0x84A8, 0xE3C8, 0x84A9, 0xE3C6, + 0x84AA, 0xE3BA, 0x84AB, 0xE3B5, 0x84AC, 0xE3B3, 0x84AE, 0xE3B4, + 0x84AF, 0xE3C7, 0x84B0, 0xE3D2, 0x84B1, 0xE3BC, 0x84B2, 0xBB5A, + 0x84B4, 0xE3B7, 0x84B6, 0xE3CB, 0x84B8, 0xBB5D, 0x84B9, 0xE3B6, + 0x84BA, 0xE3B0, 0x84BB, 0xE3C0, 0x84BC, 0xBB61, 0x84BF, 0xBB55, + 0x84C0, 0xBB5E, 0x84C1, 0xE3B8, 0x84C2, 0xE3B2, 0x84C4, 0xBB57, + 0x84C5, 0xDFD4, 0x84C6, 0xBB56, 0x84C7, 0xE3C3, 0x84C9, 0xBB54, + 0x84CA, 0xBB63, 0x84CB, 0xBB5C, 0x84CC, 0xE3C4, 0x84CD, 0xE3B9, + 0x84CE, 0xE3B1, 0x84CF, 0xE3CC, 0x84D0, 0xE3BD, 0x84D1, 0xBB62, + 0x84D2, 0xE3D0, 0x84D3, 0xBB5F, 0x84D4, 0xE3CF, 0x84D6, 0xE3C9, + 0x84D7, 0xE3CE, 0x84DB, 0xE3D1, 0x84E7, 0xE773, 0x84E8, 0xE774, + 0x84E9, 0xE767, 0x84EA, 0xE766, 0x84EB, 0xE762, 0x84EC, 0xBDB4, + 0x84EE, 0xBDAC, 0x84EF, 0xE776, 0x84F0, 0xE775, 0x84F1, 0xDFA9, + 0x84F2, 0xE75F, 0x84F3, 0xE763, 0x84F4, 0xE75D, 0x84F6, 0xE770, + 0x84F7, 0xE761, 0x84F9, 0xE777, 0x84FA, 0xE75A, 0x84FB, 0xE758, + 0x84FC, 0xE764, 0x84FD, 0xE76E, 0x84FE, 0xE769, 0x84FF, 0xBDB6, + 0x8500, 0xE74F, 0x8502, 0xE76D, 0x8506, 0xBDB7, 0x8507, 0xDFBD, + 0x8508, 0xE75B, 0x8509, 0xE752, 0x850A, 0xE755, 0x850B, 0xE77B, + 0x850C, 0xE75C, 0x850D, 0xE753, 0x850E, 0xE751, 0x850F, 0xE74E, + 0x8511, 0xBDB0, 0x8512, 0xE765, 0x8513, 0xBDAF, 0x8514, 0xBDB3, + 0x8515, 0xE760, 0x8516, 0xE768, 0x8517, 0xBDA9, 0x8518, 0xE778, + 0x8519, 0xE77C, 0x851A, 0xBDAB, 0x851C, 0xE757, 0x851D, 0xE76B, + 0x851E, 0xE76F, 0x851F, 0xE754, 0x8520, 0xE779, 0x8521, 0xBDB2, + 0x8523, 0xBDB1, 0x8524, 0xE74C, 0x8525, 0xBDB5, 0x8526, 0xE772, + 0x8527, 0xE756, 0x8528, 0xE76A, 0x8529, 0xE750, 0x852A, 0xE75E, + 0x852B, 0xE759, 0x852C, 0xBDAD, 0x852D, 0xBDAE, 0x852E, 0xE76C, + 0x852F, 0xE77D, 0x8530, 0xE77A, 0x8531, 0xE771, 0x853B, 0xE74D, + 0x853D, 0xBDAA, 0x853E, 0xEB49, 0x8540, 0xEB40, 0x8541, 0xEB43, + 0x8543, 0xBFBB, 0x8544, 0xEB45, 0x8545, 0xEAF9, 0x8546, 0xEB41, + 0x8547, 0xEB47, 0x8548, 0xBFB8, 0x8549, 0xBFBC, 0x854A, 0xBFB6, + 0x854D, 0xEAFB, 0x854E, 0xEB4C, 0x8551, 0xEB46, 0x8553, 0xEAFC, + 0x8554, 0xEB55, 0x8555, 0xEB4F, 0x8556, 0xEAF8, 0x8557, 0xEE46, + 0x8558, 0xEAFE, 0x8559, 0xBFB7, 0x855B, 0xEB4A, 0x855D, 0xEB54, + 0x855E, 0xBFBF, 0x8560, 0xEB51, 0x8561, 0xEAFD, 0x8562, 0xEB44, + 0x8563, 0xEB48, 0x8564, 0xEB42, 0x8565, 0xEB56, 0x8566, 0xEB53, + 0x8567, 0xEB50, 0x8568, 0xBFB9, 0x8569, 0xBFBA, 0x856A, 0xBFBE, + 0x856B, 0xEAFA, 0x856C, 0xEB57, 0x856D, 0xBFBD, 0x856E, 0xEB4D, + 0x8571, 0xEB4B, 0x8575, 0xEB4E, 0x8576, 0xEE53, 0x8577, 0xEE40, + 0x8578, 0xEE45, 0x8579, 0xEE52, 0x857A, 0xEE44, 0x857B, 0xEDFB, + 0x857C, 0xEE41, 0x857E, 0xC1A2, 0x8580, 0xEDF4, 0x8581, 0xEE4D, + 0x8582, 0xEE4F, 0x8583, 0xEDF3, 0x8584, 0xC1A1, 0x8585, 0xEE51, + 0x8586, 0xEE49, 0x8587, 0xC1A8, 0x8588, 0xEE50, 0x8589, 0xEE42, + 0x858A, 0xC1AA, 0x858B, 0xEDF9, 0x858C, 0xEB52, 0x858D, 0xEE4A, + 0x858E, 0xEE47, 0x858F, 0xEDF5, 0x8590, 0xEE55, 0x8591, 0xC1A4, + 0x8594, 0xC1A5, 0x8595, 0xEDF7, 0x8596, 0xEE48, 0x8598, 0xEE54, + 0x8599, 0xEE4B, 0x859A, 0xEDFD, 0x859B, 0xC1A7, 0x859C, 0xC1A3, + 0x859D, 0xEE4C, 0x859E, 0xEDFE, 0x859F, 0xEE56, 0x85A0, 0xEDF8, + 0x85A1, 0xEE43, 0x85A2, 0xEE4E, 0x85A3, 0xEDFA, 0x85A4, 0xEDFC, + 0x85A6, 0xC2CB, 0x85A7, 0xEDF6, 0x85A8, 0xC1A9, 0x85A9, 0xC2C4, + 0x85AA, 0xC17E, 0x85AF, 0xC1A6, 0x85B0, 0xC2C8, 0x85B1, 0xF0B3, + 0x85B3, 0xF0A9, 0x85B4, 0xF0A4, 0x85B5, 0xF0AA, 0x85B6, 0xF0B4, + 0x85B7, 0xF0B8, 0x85B8, 0xF0B7, 0x85B9, 0xC2CA, 0x85BA, 0xC2C9, + 0x85BD, 0xF0AB, 0x85BE, 0xF0B9, 0x85BF, 0xF0AE, 0x85C0, 0xF0A6, + 0x85C2, 0xF0A8, 0x85C3, 0xF0A7, 0x85C4, 0xF0AD, 0x85C5, 0xF0B2, + 0x85C6, 0xF0A5, 0x85C7, 0xF0AC, 0x85C8, 0xF0B1, 0x85C9, 0xC2C7, + 0x85CB, 0xF0AF, 0x85CD, 0xC2C5, 0x85CE, 0xF0B0, 0x85CF, 0xC2C3, + 0x85D0, 0xC2C6, 0x85D1, 0xF2D5, 0x85D2, 0xF0B5, 0x85D5, 0xC3C2, + 0x85D7, 0xF2CD, 0x85D8, 0xF2D1, 0x85D9, 0xF2C9, 0x85DA, 0xF2CC, + 0x85DC, 0xF2D4, 0x85DD, 0xC3C0, 0x85DE, 0xF2D9, 0x85DF, 0xF2D2, + 0x85E1, 0xF2CA, 0x85E2, 0xF2DA, 0x85E3, 0xF2D3, 0x85E4, 0xC3C3, + 0x85E5, 0xC3C4, 0x85E6, 0xF2D7, 0x85E8, 0xF2CB, 0x85E9, 0xC3BF, + 0x85EA, 0xC3C1, 0x85EB, 0xF2C6, 0x85EC, 0xF2CE, 0x85ED, 0xF2C8, + 0x85EF, 0xF2D8, 0x85F0, 0xF2D6, 0x85F1, 0xF2C7, 0x85F2, 0xF2CF, + 0x85F6, 0xF4BE, 0x85F7, 0xC3C5, 0x85F8, 0xF2D0, 0x85F9, 0xC4A7, + 0x85FA, 0xC4A9, 0x85FB, 0xC4A6, 0x85FD, 0xF4C3, 0x85FE, 0xF4BB, + 0x85FF, 0xF4B9, 0x8600, 0xF4BD, 0x8601, 0xF4BA, 0x8604, 0xF4BF, + 0x8605, 0xF4C1, 0x8606, 0xC4AA, 0x8607, 0xC4AC, 0x8609, 0xF4C0, + 0x860A, 0xC4AD, 0x860B, 0xC4AB, 0x860C, 0xF4C2, 0x8611, 0xC4A8, + 0x8617, 0xC4F4, 0x8618, 0xF5F1, 0x8619, 0xF5F7, 0x861A, 0xC4F6, + 0x861B, 0xF4BC, 0x861C, 0xF5F6, 0x861E, 0xF5FD, 0x861F, 0xF5F4, + 0x8620, 0xF5FB, 0x8621, 0xF5FA, 0x8622, 0xF4B8, 0x8623, 0xF5F5, + 0x8624, 0xF0B6, 0x8625, 0xF5FE, 0x8626, 0xF5F3, 0x8627, 0xF5F8, + 0x8629, 0xF5FC, 0x862A, 0xF5F2, 0x862C, 0xF74A, 0x862D, 0xC4F5, + 0x862E, 0xF5F9, 0x8631, 0xF7F4, 0x8632, 0xF74B, 0x8633, 0xF749, + 0x8634, 0xF747, 0x8635, 0xF748, 0x8636, 0xF74C, 0x8638, 0xC5D9, + 0x8639, 0xF7F2, 0x863A, 0xF7F0, 0x863B, 0xF7F5, 0x863C, 0xF7F3, + 0x863E, 0xF7F6, 0x863F, 0xC5DA, 0x8640, 0xF7F1, 0x8643, 0xF8BC, + 0x8646, 0xF945, 0x8647, 0xF946, 0x8648, 0xF947, 0x864B, 0xF9C7, + 0x864C, 0xF9BD, 0x864D, 0xCA4F, 0x864E, 0xAAEA, 0x8650, 0xAD68, + 0x8652, 0xD3B8, 0x8653, 0xD3B7, 0x8654, 0xB040, 0x8655, 0xB342, + 0x8656, 0xD77C, 0x8659, 0xD77B, 0x865B, 0xB5EA, 0x865C, 0xB8B8, + 0x865E, 0xB8B7, 0x865F, 0xB8B9, 0x8661, 0xE3D4, 0x8662, 0xE77E, + 0x8663, 0xEB58, 0x8664, 0xEB5A, 0x8665, 0xEB59, 0x8667, 0xC1AB, + 0x8668, 0xEE57, 0x8669, 0xF0BA, 0x866A, 0xF9A5, 0x866B, 0xA6E4, + 0x866D, 0xCDC9, 0x866E, 0xCDCA, 0x866F, 0xCDC8, 0x8670, 0xCDC7, + 0x8671, 0xAAEB, 0x8673, 0xD0A9, 0x8674, 0xD0A7, 0x8677, 0xD0A6, + 0x8679, 0xAD69, 0x867A, 0xAD6B, 0x867B, 0xAD6A, 0x867C, 0xD0A8, + 0x8685, 0xD3C4, 0x8686, 0xD3C1, 0x8687, 0xD3BF, 0x868A, 0xB041, + 0x868B, 0xD3C2, 0x868C, 0xB046, 0x868D, 0xD3BC, 0x868E, 0xD3CB, + 0x8690, 0xD3CD, 0x8691, 0xD3BD, 0x8693, 0xB043, 0x8694, 0xD3CE, + 0x8695, 0xD3C9, 0x8696, 0xD3BB, 0x8697, 0xD3C0, 0x8698, 0xD3CA, + 0x8699, 0xD3C6, 0x869A, 0xD3C3, 0x869C, 0xB048, 0x869D, 0xD3CC, + 0x869E, 0xD3BE, 0x86A1, 0xD3C7, 0x86A2, 0xD3B9, 0x86A3, 0xB047, + 0x86A4, 0xB044, 0x86A5, 0xD3C5, 0x86A7, 0xD3C8, 0x86A8, 0xD3BA, + 0x86A9, 0xB045, 0x86AA, 0xB042, 0x86AF, 0xB34C, 0x86B0, 0xD7A5, + 0x86B1, 0xB34B, 0x86B3, 0xD7A8, 0x86B4, 0xD7AB, 0x86B5, 0xB348, + 0x86B6, 0xB346, 0x86B7, 0xD77E, 0x86B8, 0xD7A9, 0x86B9, 0xD7A7, + 0x86BA, 0xD7A4, 0x86BB, 0xD7AC, 0x86BC, 0xD7AD, 0x86BD, 0xD7AF, + 0x86BE, 0xD7B0, 0x86BF, 0xD77D, 0x86C0, 0xB345, 0x86C1, 0xD7A2, + 0x86C2, 0xD7A1, 0x86C3, 0xD7AE, 0x86C4, 0xB347, 0x86C5, 0xD7A3, + 0x86C6, 0xB349, 0x86C7, 0xB344, 0x86C8, 0xD7A6, 0x86C9, 0xB34D, + 0x86CB, 0xB34A, 0x86CC, 0xD7AA, 0x86D0, 0xB5F1, 0x86D1, 0xDBBF, + 0x86D3, 0xDBB4, 0x86D4, 0xB5EE, 0x86D6, 0xDFE7, 0x86D7, 0xDBBD, + 0x86D8, 0xDBB1, 0x86D9, 0xB5EC, 0x86DA, 0xDBB6, 0x86DB, 0xB5EF, + 0x86DC, 0xDBBA, 0x86DD, 0xDBB8, 0x86DE, 0xB5F2, 0x86DF, 0xB5EB, + 0x86E2, 0xDBB2, 0x86E3, 0xDBB5, 0x86E4, 0xB5F0, 0x86E6, 0xDBB3, + 0x86E8, 0xDBBE, 0x86E9, 0xDBBC, 0x86EA, 0xDBB7, 0x86EB, 0xDBB9, + 0x86EC, 0xDBBB, 0x86ED, 0xB5ED, 0x86F5, 0xDFE8, 0x86F6, 0xDFEE, + 0x86F7, 0xDFE4, 0x86F8, 0xDFEA, 0x86F9, 0xB8BA, 0x86FA, 0xDFE6, + 0x86FB, 0xB8C0, 0x86FE, 0xB8BF, 0x8700, 0xB8BE, 0x8701, 0xDFED, + 0x8702, 0xB8C1, 0x8703, 0xB8C2, 0x8704, 0xDFE3, 0x8705, 0xDFF0, + 0x8706, 0xB8C3, 0x8707, 0xB8BD, 0x8708, 0xB8BC, 0x8709, 0xDFEC, + 0x870A, 0xB8C4, 0x870B, 0xDFE2, 0x870C, 0xDFE5, 0x870D, 0xDFEF, + 0x870E, 0xDFEB, 0x8711, 0xE3F4, 0x8712, 0xE3E9, 0x8713, 0xB8BB, + 0x8718, 0xBB6A, 0x8719, 0xE3DD, 0x871A, 0xE3F2, 0x871B, 0xE3DE, + 0x871C, 0xBB65, 0x871E, 0xE3DB, 0x8720, 0xE3E4, 0x8721, 0xE3DC, + 0x8722, 0xBB67, 0x8723, 0xE3D6, 0x8724, 0xE3F1, 0x8725, 0xBB68, + 0x8726, 0xE3EE, 0x8727, 0xE3EF, 0x8728, 0xE3D7, 0x8729, 0xBB6D, + 0x872A, 0xE3E6, 0x872C, 0xE3E0, 0x872D, 0xE3E7, 0x872E, 0xE3DA, + 0x8730, 0xE3F3, 0x8731, 0xE3EB, 0x8732, 0xE3E5, 0x8733, 0xE3D5, + 0x8734, 0xBB69, 0x8735, 0xE3EC, 0x8737, 0xBB6C, 0x8738, 0xE3F0, + 0x873A, 0xE3EA, 0x873B, 0xBB66, 0x873C, 0xE3E8, 0x873E, 0xE3E2, + 0x873F, 0xBB64, 0x8740, 0xE3D9, 0x8741, 0xE3E1, 0x8742, 0xE3ED, + 0x8743, 0xE3DF, 0x8746, 0xE3E3, 0x874C, 0xBDC1, 0x874D, 0xDFE9, + 0x874E, 0xE7B2, 0x874F, 0xE7BB, 0x8750, 0xE7B1, 0x8751, 0xE7AD, + 0x8752, 0xE7AA, 0x8753, 0xBDC2, 0x8754, 0xE7A8, 0x8755, 0xBB6B, + 0x8756, 0xE7A1, 0x8757, 0xBDC0, 0x8758, 0xE7A7, 0x8759, 0xBDBF, + 0x875A, 0xE7AC, 0x875B, 0xE7A9, 0x875C, 0xE7B9, 0x875D, 0xE7B4, + 0x875E, 0xE7AE, 0x875F, 0xE7B3, 0x8760, 0xBDBB, 0x8761, 0xE7AB, + 0x8762, 0xE7BE, 0x8763, 0xE7A2, 0x8764, 0xE7A3, 0x8765, 0xE7BA, + 0x8766, 0xBDBC, 0x8767, 0xE7BF, 0x8768, 0xBDBE, 0x8769, 0xE7C0, + 0x876A, 0xE7B0, 0x876B, 0xE3D8, 0x876C, 0xE7B6, 0x876D, 0xE7AF, + 0x876E, 0xE7B8, 0x876F, 0xE7B5, 0x8773, 0xE7A6, 0x8774, 0xBDB9, + 0x8775, 0xE7BD, 0x8776, 0xBDBA, 0x8777, 0xE7A4, 0x8778, 0xBDBD, + 0x8779, 0xEB64, 0x877A, 0xE7B7, 0x877B, 0xE7BC, 0x8781, 0xEB61, + 0x8782, 0xBDB8, 0x8783, 0xBFC0, 0x8784, 0xEB6B, 0x8785, 0xEB67, + 0x8787, 0xEB65, 0x8788, 0xEB60, 0x8789, 0xEB6F, 0x878D, 0xBFC4, + 0x878F, 0xEB5C, 0x8790, 0xEB68, 0x8791, 0xEB69, 0x8792, 0xEB5F, + 0x8793, 0xEB5E, 0x8794, 0xEB6C, 0x8796, 0xEB62, 0x8797, 0xEB5D, + 0x8798, 0xEB63, 0x879A, 0xEB6E, 0x879B, 0xEB5B, 0x879C, 0xEB6D, + 0x879D, 0xEB6A, 0x879E, 0xBFC2, 0x879F, 0xBFC1, 0x87A2, 0xBFC3, + 0x87A3, 0xEB66, 0x87A4, 0xF0CB, 0x87AA, 0xEE59, 0x87AB, 0xC1B1, + 0x87AC, 0xEE5D, 0x87AD, 0xEE5A, 0x87AE, 0xEE61, 0x87AF, 0xEE67, + 0x87B0, 0xEE5C, 0x87B2, 0xEE70, 0x87B3, 0xC1AE, 0x87B4, 0xEE6A, + 0x87B5, 0xEE5F, 0x87B6, 0xEE6B, 0x87B7, 0xEE66, 0x87B8, 0xEE6D, + 0x87B9, 0xEE5E, 0x87BA, 0xC1B3, 0x87BB, 0xC1B2, 0x87BC, 0xEE60, + 0x87BD, 0xEE6E, 0x87BE, 0xEE58, 0x87BF, 0xEE6C, 0x87C0, 0xC1AC, + 0x87C2, 0xEE64, 0x87C3, 0xEE63, 0x87C4, 0xEE68, 0x87C5, 0xEE5B, + 0x87C6, 0xC1B0, 0x87C8, 0xC1B4, 0x87C9, 0xEE62, 0x87CA, 0xEE69, + 0x87CB, 0xC1B5, 0x87CC, 0xEE65, 0x87D1, 0xC1AD, 0x87D2, 0xC1AF, + 0x87D3, 0xF0C7, 0x87D4, 0xF0C5, 0x87D7, 0xF0CC, 0x87D8, 0xF0C9, + 0x87D9, 0xF0CD, 0x87DB, 0xF0BE, 0x87DC, 0xF0C6, 0x87DD, 0xF0D1, + 0x87DE, 0xEE6F, 0x87DF, 0xF0C2, 0x87E0, 0xC2CF, 0x87E1, 0xE7A5, + 0x87E2, 0xF0BD, 0x87E3, 0xF0CA, 0x87E4, 0xF0C4, 0x87E5, 0xF0C1, + 0x87E6, 0xF0BC, 0x87E7, 0xF0BB, 0x87E8, 0xF0D0, 0x87EA, 0xF0C0, + 0x87EB, 0xF0BF, 0x87EC, 0xC2CD, 0x87ED, 0xF0C8, 0x87EF, 0xC2CC, + 0x87F2, 0xC2CE, 0x87F3, 0xF0C3, 0x87F4, 0xF0CF, 0x87F6, 0xF2DE, + 0x87F7, 0xF2DF, 0x87F9, 0xC3C9, 0x87FA, 0xF2DC, 0x87FB, 0xC3C6, + 0x87FC, 0xF2E4, 0x87FE, 0xC3CA, 0x87FF, 0xF2E6, 0x8800, 0xF2DB, + 0x8801, 0xF0CE, 0x8802, 0xF2E8, 0x8803, 0xF2DD, 0x8805, 0xC3C7, + 0x8806, 0xF2E3, 0x8808, 0xF2E5, 0x8809, 0xF2E0, 0x880A, 0xF2E7, + 0x880B, 0xF2E2, 0x880C, 0xF2E1, 0x880D, 0xC3C8, 0x8810, 0xF4C5, + 0x8811, 0xF4C6, 0x8813, 0xF4C8, 0x8814, 0xC4AE, 0x8815, 0xC4AF, + 0x8816, 0xF4C9, 0x8817, 0xF4C7, 0x8819, 0xF4C4, 0x881B, 0xF642, + 0x881C, 0xF645, 0x881D, 0xF641, 0x881F, 0xC4FA, 0x8820, 0xF643, + 0x8821, 0xC4F9, 0x8822, 0xC4F8, 0x8823, 0xC4F7, 0x8824, 0xF644, + 0x8825, 0xF751, 0x8826, 0xF74F, 0x8828, 0xF74E, 0x8829, 0xF640, + 0x882A, 0xF750, 0x882B, 0xF646, 0x882C, 0xF74D, 0x882E, 0xF7F9, + 0x882F, 0xF7D7, 0x8830, 0xF7F7, 0x8831, 0xC5DB, 0x8832, 0xF7F8, + 0x8833, 0xF7FA, 0x8835, 0xF8BF, 0x8836, 0xC5FA, 0x8837, 0xF8BE, + 0x8838, 0xF8BD, 0x8839, 0xC5FB, 0x883B, 0xC65A, 0x883C, 0xF96E, + 0x883D, 0xF9A7, 0x883E, 0xF9A6, 0x883F, 0xF9A8, 0x8840, 0xA6E5, + 0x8841, 0xD0AA, 0x8843, 0xD3CF, 0x8844, 0xD3D0, 0x8848, 0xDBC0, + 0x884A, 0xF647, 0x884B, 0xF8C0, 0x884C, 0xA6E6, 0x884D, 0xAD6C, + 0x884E, 0xD0AB, 0x8852, 0xD7B1, 0x8853, 0xB34E, 0x8855, 0xDBC2, + 0x8856, 0xDBC1, 0x8857, 0xB5F3, 0x8859, 0xB8C5, 0x885A, 0xE7C1, + 0x885B, 0xBDC3, 0x885D, 0xBDC4, 0x8861, 0xBFC5, 0x8862, 0xC5FC, + 0x8863, 0xA6E7, 0x8867, 0xD0AC, 0x8868, 0xAAED, 0x8869, 0xD0AE, + 0x886A, 0xD0AD, 0x886B, 0xAD6D, 0x886D, 0xD3D1, 0x886F, 0xD3D8, + 0x8870, 0xB049, 0x8871, 0xD3D6, 0x8872, 0xD3D4, 0x8874, 0xD3DB, + 0x8875, 0xD3D2, 0x8876, 0xD3D3, 0x8877, 0xB04A, 0x8879, 0xB04E, + 0x887C, 0xD3DC, 0x887D, 0xB04D, 0x887E, 0xD3DA, 0x887F, 0xD3D7, + 0x8880, 0xD3D5, 0x8881, 0xB04B, 0x8882, 0xB04C, 0x8883, 0xD3D9, + 0x8888, 0xB350, 0x8889, 0xD7B2, 0x888B, 0xB355, 0x888C, 0xD7C2, + 0x888D, 0xB354, 0x888E, 0xD7C4, 0x8891, 0xD7B8, 0x8892, 0xB352, + 0x8893, 0xD7C3, 0x8895, 0xD7B3, 0x8896, 0xB353, 0x8897, 0xD7BF, + 0x8898, 0xD7BB, 0x8899, 0xD7BD, 0x889A, 0xD7B7, 0x889B, 0xD7BE, + 0x889E, 0xB34F, 0x889F, 0xD7BA, 0x88A1, 0xD7B9, 0x88A2, 0xD7B5, + 0x88A4, 0xD7C0, 0x88A7, 0xD7BC, 0x88A8, 0xD7B4, 0x88AA, 0xD7B6, + 0x88AB, 0xB351, 0x88AC, 0xD7C1, 0x88B1, 0xB5F6, 0x88B2, 0xDBCD, + 0x88B6, 0xDBC9, 0x88B7, 0xDBCB, 0x88B8, 0xDBC6, 0x88B9, 0xDBC5, + 0x88BA, 0xDBC3, 0x88BC, 0xDBCA, 0x88BD, 0xDBCC, 0x88BE, 0xDBC8, + 0x88C0, 0xDBC7, 0x88C1, 0xB5F4, 0x88C2, 0xB5F5, 0x88C9, 0xDBCF, + 0x88CA, 0xB8CD, 0x88CB, 0xDFF2, 0x88CC, 0xDFF8, 0x88CD, 0xDFF3, + 0x88CE, 0xDFF4, 0x88CF, 0xF9D8, 0x88D0, 0xDFF9, 0x88D2, 0xB8CF, + 0x88D4, 0xB8C7, 0x88D5, 0xB8CE, 0x88D6, 0xDFF1, 0x88D7, 0xDBC4, + 0x88D8, 0xB8CA, 0x88D9, 0xB8C8, 0x88DA, 0xDFF7, 0x88DB, 0xDFF6, + 0x88DC, 0xB8C9, 0x88DD, 0xB8CB, 0x88DE, 0xDFF5, 0x88DF, 0xB8C6, + 0x88E1, 0xB8CC, 0x88E7, 0xE3F6, 0x88E8, 0xBB74, 0x88EB, 0xE442, + 0x88EC, 0xE441, 0x88EE, 0xE3FB, 0x88EF, 0xBB76, 0x88F0, 0xE440, + 0x88F1, 0xE3F7, 0x88F2, 0xE3F8, 0x88F3, 0xBB6E, 0x88F4, 0xBB70, + 0x88F6, 0xE3FD, 0x88F7, 0xE3F5, 0x88F8, 0xBB72, 0x88F9, 0xBB71, + 0x88FA, 0xE3F9, 0x88FB, 0xE3FE, 0x88FC, 0xE3FC, 0x88FD, 0xBB73, + 0x88FE, 0xE3FA, 0x8901, 0xDBCE, 0x8902, 0xBB6F, 0x8905, 0xE7C2, + 0x8906, 0xE7C9, 0x8907, 0xBDC6, 0x8909, 0xE7CD, 0x890A, 0xBDCA, + 0x890B, 0xE7C5, 0x890C, 0xE7C3, 0x890E, 0xE7CC, 0x8910, 0xBDC5, + 0x8911, 0xE7CB, 0x8912, 0xBDC7, 0x8913, 0xBDC8, 0x8914, 0xE7C4, + 0x8915, 0xBDC9, 0x8916, 0xE7CA, 0x8917, 0xE7C6, 0x8918, 0xE7C7, + 0x8919, 0xE7C8, 0x891A, 0xBB75, 0x891E, 0xEB70, 0x891F, 0xEB7C, + 0x8921, 0xBFCA, 0x8922, 0xEB77, 0x8923, 0xEB79, 0x8925, 0xBFC8, + 0x8926, 0xEB71, 0x8927, 0xEB75, 0x8929, 0xEB78, 0x892A, 0xBFC6, + 0x892B, 0xBFC9, 0x892C, 0xEB7B, 0x892D, 0xEB73, 0x892E, 0xEB74, + 0x892F, 0xEB7A, 0x8930, 0xEB72, 0x8931, 0xEB76, 0x8932, 0xBFC7, + 0x8933, 0xEE72, 0x8935, 0xEE71, 0x8936, 0xC1B7, 0x8937, 0xEE77, + 0x8938, 0xC1B9, 0x893B, 0xC1B6, 0x893C, 0xEE73, 0x893D, 0xC1BA, + 0x893E, 0xEE74, 0x8941, 0xEE75, 0x8942, 0xEE78, 0x8944, 0xC1B8, + 0x8946, 0xF0D6, 0x8949, 0xF0D9, 0x894B, 0xF0D3, 0x894C, 0xF0D5, + 0x894F, 0xF0D4, 0x8950, 0xF0D7, 0x8951, 0xF0D8, 0x8952, 0xEE76, + 0x8953, 0xF0D2, 0x8956, 0xC3CD, 0x8957, 0xF2EC, 0x8958, 0xF2EF, + 0x8959, 0xF2F1, 0x895A, 0xF2EA, 0x895B, 0xF2EB, 0x895C, 0xF2EE, + 0x895D, 0xF2F0, 0x895E, 0xC3CE, 0x895F, 0xC3CC, 0x8960, 0xC3CB, + 0x8961, 0xF2ED, 0x8962, 0xF2E9, 0x8963, 0xF4CA, 0x8964, 0xC4B0, + 0x8966, 0xF4CB, 0x8969, 0xF649, 0x896A, 0xC4FB, 0x896B, 0xF64B, + 0x896C, 0xC4FC, 0x896D, 0xF648, 0x896E, 0xF64A, 0x896F, 0xC5A8, + 0x8971, 0xF752, 0x8972, 0xC5A7, 0x8973, 0xF7FD, 0x8974, 0xF7FC, + 0x8976, 0xF7FB, 0x8979, 0xF948, 0x897A, 0xF949, 0x897B, 0xF94B, + 0x897C, 0xF94A, 0x897E, 0xCA50, 0x897F, 0xA6E8, 0x8981, 0xAD6E, + 0x8982, 0xD7C5, 0x8983, 0xB5F7, 0x8985, 0xDFFA, 0x8986, 0xC2D0, + 0x8988, 0xF2F2, 0x898B, 0xA8A3, 0x898F, 0xB357, 0x8993, 0xB356, + 0x8995, 0xDBD0, 0x8996, 0xB5F8, 0x8997, 0xDBD2, 0x8998, 0xDBD1, + 0x899B, 0xDFFB, 0x899C, 0xB8D0, 0x899D, 0xE443, 0x899E, 0xE446, + 0x899F, 0xE445, 0x89A1, 0xE444, 0x89A2, 0xE7CE, 0x89A3, 0xE7D0, + 0x89A4, 0xE7CF, 0x89A6, 0xBFCC, 0x89AA, 0xBFCB, 0x89AC, 0xC1BB, + 0x89AD, 0xEE79, 0x89AE, 0xEE7B, 0x89AF, 0xEE7A, 0x89B2, 0xC2D1, + 0x89B6, 0xF2F4, 0x89B7, 0xF2F3, 0x89B9, 0xF4CC, 0x89BA, 0xC4B1, + 0x89BD, 0xC4FD, 0x89BE, 0xF754, 0x89BF, 0xF753, 0x89C0, 0xC65B, + 0x89D2, 0xA8A4, 0x89D3, 0xD0AF, 0x89D4, 0xAD6F, 0x89D5, 0xD7C8, + 0x89D6, 0xD7C6, 0x89D9, 0xD7C7, 0x89DA, 0xDBD4, 0x89DB, 0xDBD5, + 0x89DC, 0xE043, 0x89DD, 0xDBD3, 0x89DF, 0xDFFC, 0x89E0, 0xE041, + 0x89E1, 0xE040, 0x89E2, 0xE042, 0x89E3, 0xB8D1, 0x89E4, 0xDFFE, + 0x89E5, 0xDFFD, 0x89E6, 0xE044, 0x89E8, 0xE449, 0x89E9, 0xE447, + 0x89EB, 0xE448, 0x89EC, 0xE7D3, 0x89ED, 0xE7D1, 0x89F0, 0xE7D2, + 0x89F1, 0xEB7D, 0x89F2, 0xEE7C, 0x89F3, 0xEE7D, 0x89F4, 0xC2D2, + 0x89F6, 0xF2F5, 0x89F7, 0xF4CD, 0x89F8, 0xC4B2, 0x89FA, 0xF64C, + 0x89FB, 0xF755, 0x89FC, 0xC5A9, 0x89FE, 0xF7FE, 0x89FF, 0xF94C, + 0x8A00, 0xA8A5, 0x8A02, 0xAD71, 0x8A03, 0xAD72, 0x8A04, 0xD0B0, + 0x8A07, 0xD0B1, 0x8A08, 0xAD70, 0x8A0A, 0xB054, 0x8A0C, 0xB052, + 0x8A0E, 0xB051, 0x8A0F, 0xB058, 0x8A10, 0xB050, 0x8A11, 0xB059, + 0x8A12, 0xD3DD, 0x8A13, 0xB056, 0x8A15, 0xB053, 0x8A16, 0xB057, + 0x8A17, 0xB055, 0x8A18, 0xB04F, 0x8A1B, 0xB35F, 0x8A1D, 0xB359, + 0x8A1E, 0xD7CC, 0x8A1F, 0xB35E, 0x8A22, 0xB360, 0x8A23, 0xB35A, + 0x8A25, 0xB35B, 0x8A27, 0xD7CA, 0x8A2A, 0xB358, 0x8A2C, 0xD7CB, + 0x8A2D, 0xB35D, 0x8A30, 0xD7C9, 0x8A31, 0xB35C, 0x8A34, 0xB644, + 0x8A36, 0xB646, 0x8A39, 0xDBD8, 0x8A3A, 0xB645, 0x8A3B, 0xB5F9, + 0x8A3C, 0xB5FD, 0x8A3E, 0xB8E4, 0x8A3F, 0xE049, 0x8A40, 0xDBDA, + 0x8A41, 0xB5FE, 0x8A44, 0xDBDD, 0x8A45, 0xDBDE, 0x8A46, 0xB643, + 0x8A48, 0xDBE0, 0x8A4A, 0xDBE2, 0x8A4C, 0xDBE3, 0x8A4D, 0xDBD7, + 0x8A4E, 0xDBD6, 0x8A4F, 0xDBE4, 0x8A50, 0xB642, 0x8A51, 0xDBE1, + 0x8A52, 0xDBDF, 0x8A54, 0xB640, 0x8A55, 0xB5FB, 0x8A56, 0xB647, + 0x8A57, 0xDBDB, 0x8A58, 0xDBDC, 0x8A59, 0xDBD9, 0x8A5B, 0xB641, + 0x8A5E, 0xB5FC, 0x8A60, 0xB5FA, 0x8A61, 0xE048, 0x8A62, 0xB8DF, + 0x8A63, 0xB8DA, 0x8A66, 0xB8D5, 0x8A68, 0xB8E5, 0x8A69, 0xB8D6, + 0x8A6B, 0xB8D2, 0x8A6C, 0xB8E1, 0x8A6D, 0xB8DE, 0x8A6E, 0xB8E0, + 0x8A70, 0xB8D7, 0x8A71, 0xB8DC, 0x8A72, 0xB8D3, 0x8A73, 0xB8D4, + 0x8A74, 0xE050, 0x8A75, 0xE04D, 0x8A76, 0xE045, 0x8A77, 0xE04A, + 0x8A79, 0xB8E2, 0x8A7A, 0xE051, 0x8A7B, 0xB8E3, 0x8A7C, 0xB8D9, + 0x8A7F, 0xE047, 0x8A81, 0xE04F, 0x8A82, 0xE04B, 0x8A83, 0xE04E, + 0x8A84, 0xE04C, 0x8A85, 0xB8DD, 0x8A86, 0xE046, 0x8A87, 0xB8D8, + 0x8A8B, 0xE44C, 0x8A8C, 0xBB78, 0x8A8D, 0xBB7B, 0x8A8F, 0xE44E, + 0x8A91, 0xBBA5, 0x8A92, 0xE44D, 0x8A93, 0xBB7D, 0x8A95, 0xBDCF, + 0x8A96, 0xE44F, 0x8A98, 0xBBA4, 0x8A99, 0xE44B, 0x8A9A, 0xBBA6, + 0x8A9E, 0xBB79, 0x8AA0, 0xB8DB, 0x8AA1, 0xBB7C, 0x8AA3, 0xBB7A, + 0x8AA4, 0xBB7E, 0x8AA5, 0xBBA2, 0x8AA6, 0xBB77, 0x8AA7, 0xBBA7, + 0x8AA8, 0xBBA3, 0x8AAA, 0xBBA1, 0x8AAB, 0xE44A, 0x8AB0, 0xBDD6, + 0x8AB2, 0xBDD2, 0x8AB6, 0xBDD9, 0x8AB8, 0xE7D6, 0x8AB9, 0xBDDA, + 0x8ABA, 0xE7E2, 0x8ABB, 0xE7DB, 0x8ABC, 0xBDCB, 0x8ABD, 0xE7E3, + 0x8ABE, 0xE7DD, 0x8ABF, 0xBDD5, 0x8AC0, 0xE7DE, 0x8AC2, 0xBDD4, + 0x8AC3, 0xE7E1, 0x8AC4, 0xBDCE, 0x8AC5, 0xE7DF, 0x8AC6, 0xE7D5, + 0x8AC7, 0xBDCD, 0x8AC8, 0xEBAA, 0x8AC9, 0xBDD3, 0x8ACB, 0xBDD0, + 0x8ACD, 0xBDD8, 0x8ACF, 0xE7D4, 0x8AD1, 0xE7D8, 0x8AD2, 0xBDCC, + 0x8AD3, 0xE7D7, 0x8AD4, 0xE7D9, 0x8AD5, 0xE7DA, 0x8AD6, 0xBDD7, + 0x8AD7, 0xE7DC, 0x8AD8, 0xE7E0, 0x8AD9, 0xE7E4, 0x8ADB, 0xBDDB, + 0x8ADC, 0xBFD2, 0x8ADD, 0xEBA5, 0x8ADE, 0xEBAB, 0x8ADF, 0xEBA8, + 0x8AE0, 0xEB7E, 0x8AE1, 0xEBAC, 0x8AE2, 0xEBA1, 0x8AE4, 0xEBA7, + 0x8AE6, 0xBFCD, 0x8AE7, 0xBFD3, 0x8AE8, 0xEBAD, 0x8AEB, 0xBFCF, + 0x8AED, 0xBFD9, 0x8AEE, 0xBFD4, 0x8AEF, 0xEBAF, 0x8AF0, 0xEBA9, + 0x8AF1, 0xBFD0, 0x8AF2, 0xEBA2, 0x8AF3, 0xBFDA, 0x8AF4, 0xEBA3, + 0x8AF5, 0xEBA4, 0x8AF6, 0xBFDB, 0x8AF7, 0xBFD8, 0x8AF8, 0xBDD1, + 0x8AFA, 0xBFCE, 0x8AFB, 0xEBB0, 0x8AFC, 0xBFDC, 0x8AFE, 0xBFD5, + 0x8AFF, 0xEBAE, 0x8B00, 0xBFD1, 0x8B01, 0xBFD6, 0x8B02, 0xBFD7, + 0x8B04, 0xC1C3, 0x8B05, 0xEEA4, 0x8B06, 0xEEAD, 0x8B07, 0xEEAA, + 0x8B08, 0xEEAC, 0x8B0A, 0xC1C0, 0x8B0B, 0xEEA5, 0x8B0D, 0xEEAB, + 0x8B0E, 0xC1BC, 0x8B0F, 0xEEA7, 0x8B10, 0xC1C4, 0x8B11, 0xEEA3, + 0x8B12, 0xEEA8, 0x8B13, 0xEEAF, 0x8B14, 0xEBA6, 0x8B15, 0xEEA9, + 0x8B16, 0xEEA2, 0x8B17, 0xC1BD, 0x8B18, 0xEEA1, 0x8B19, 0xC1BE, + 0x8B1A, 0xEEB0, 0x8B1B, 0xC1BF, 0x8B1C, 0xEEAE, 0x8B1D, 0xC1C2, + 0x8B1E, 0xEE7E, 0x8B20, 0xC1C1, 0x8B22, 0xEEA6, 0x8B23, 0xF0DC, + 0x8B24, 0xF0EA, 0x8B25, 0xF0E5, 0x8B26, 0xF0E7, 0x8B27, 0xF0DB, + 0x8B28, 0xC2D3, 0x8B2A, 0xF0DA, 0x8B2B, 0xC2D6, 0x8B2C, 0xC2D5, + 0x8B2E, 0xF0E9, 0x8B2F, 0xF0E1, 0x8B30, 0xF0DE, 0x8B31, 0xF0E4, + 0x8B33, 0xF0DD, 0x8B35, 0xF0DF, 0x8B36, 0xF0E8, 0x8B37, 0xF0E6, + 0x8B39, 0xC2D4, 0x8B3A, 0xF0ED, 0x8B3B, 0xF0EB, 0x8B3C, 0xF0E2, + 0x8B3D, 0xF0EC, 0x8B3E, 0xF0E3, 0x8B40, 0xF2F9, 0x8B41, 0xC3CF, + 0x8B42, 0xF341, 0x8B45, 0xF64F, 0x8B46, 0xC3D6, 0x8B47, 0xF0E0, + 0x8B48, 0xF2F7, 0x8B49, 0xC3D2, 0x8B4A, 0xF2F8, 0x8B4B, 0xF2FD, + 0x8B4E, 0xC3D4, 0x8B4F, 0xC3D5, 0x8B50, 0xF2F6, 0x8B51, 0xF340, + 0x8B52, 0xF342, 0x8B53, 0xF2FA, 0x8B54, 0xF2FC, 0x8B55, 0xF2FE, + 0x8B56, 0xF2FB, 0x8B57, 0xF343, 0x8B58, 0xC3D1, 0x8B59, 0xC3D7, + 0x8B5A, 0xC3D3, 0x8B5C, 0xC3D0, 0x8B5D, 0xF4D0, 0x8B5F, 0xC4B7, + 0x8B60, 0xF4CE, 0x8B63, 0xF4D2, 0x8B65, 0xF4D3, 0x8B66, 0xC4B5, + 0x8B67, 0xF4D4, 0x8B68, 0xF4D1, 0x8B6A, 0xF4CF, 0x8B6B, 0xC4B8, + 0x8B6C, 0xC4B4, 0x8B6D, 0xF4D5, 0x8B6F, 0xC4B6, 0x8B70, 0xC4B3, + 0x8B74, 0xC4FE, 0x8B77, 0xC540, 0x8B78, 0xF64E, 0x8B79, 0xF64D, + 0x8B7A, 0xF650, 0x8B7B, 0xF651, 0x8B7D, 0xC541, 0x8B7E, 0xF756, + 0x8B7F, 0xF75B, 0x8B80, 0xC5AA, 0x8B82, 0xF758, 0x8B84, 0xF757, + 0x8B85, 0xF75A, 0x8B86, 0xF759, 0x8B88, 0xF843, 0x8B8A, 0xC5DC, + 0x8B8B, 0xF842, 0x8B8C, 0xF840, 0x8B8E, 0xF841, 0x8B92, 0xC5FE, + 0x8B93, 0xC5FD, 0x8B94, 0xF8C1, 0x8B95, 0xF8C2, 0x8B96, 0xC640, + 0x8B98, 0xF94D, 0x8B99, 0xF94E, 0x8B9A, 0xC667, 0x8B9C, 0xC66D, + 0x8B9E, 0xF9A9, 0x8B9F, 0xF9C8, 0x8C37, 0xA8A6, 0x8C39, 0xD7CD, + 0x8C3B, 0xD7CE, 0x8C3C, 0xE052, 0x8C3D, 0xE450, 0x8C3E, 0xE7E5, + 0x8C3F, 0xC1C6, 0x8C41, 0xC1C5, 0x8C42, 0xF0EE, 0x8C43, 0xF344, + 0x8C45, 0xF844, 0x8C46, 0xA8A7, 0x8C47, 0xD3DE, 0x8C48, 0xB05A, + 0x8C49, 0xB361, 0x8C4A, 0xE054, 0x8C4B, 0xE053, 0x8C4C, 0xBDDC, + 0x8C4D, 0xE7E6, 0x8C4E, 0xBDDD, 0x8C4F, 0xEEB1, 0x8C50, 0xC2D7, + 0x8C54, 0xC676, 0x8C55, 0xA8A8, 0x8C56, 0xCDCB, 0x8C57, 0xD3DF, + 0x8C5A, 0xB362, 0x8C5C, 0xD7CF, 0x8C5D, 0xD7D0, 0x8C5F, 0xDBE5, + 0x8C61, 0xB648, 0x8C62, 0xB8E6, 0x8C64, 0xE056, 0x8C65, 0xE055, + 0x8C66, 0xE057, 0x8C68, 0xE451, 0x8C69, 0xE452, 0x8C6A, 0xBBA8, + 0x8C6B, 0xBFDD, 0x8C6C, 0xBDDE, 0x8C6D, 0xBFDE, 0x8C6F, 0xEEB5, + 0x8C70, 0xEEB2, 0x8C71, 0xEEB4, 0x8C72, 0xEEB3, 0x8C73, 0xC1C7, + 0x8C75, 0xF0EF, 0x8C76, 0xF346, 0x8C77, 0xF345, 0x8C78, 0xCBA4, + 0x8C79, 0xB05C, 0x8C7A, 0xB05B, 0x8C7B, 0xD3E0, 0x8C7D, 0xD7D1, + 0x8C80, 0xDBE7, 0x8C81, 0xDBE6, 0x8C82, 0xB649, 0x8C84, 0xE059, + 0x8C85, 0xE05A, 0x8C86, 0xE058, 0x8C89, 0xB8E8, 0x8C8A, 0xB8E7, + 0x8C8C, 0xBBAA, 0x8C8D, 0xBBA9, 0x8C8F, 0xE7E7, 0x8C90, 0xEBB3, + 0x8C91, 0xEBB1, 0x8C92, 0xEBB2, 0x8C93, 0xBFDF, 0x8C94, 0xEEB7, + 0x8C95, 0xEEB6, 0x8C97, 0xF0F2, 0x8C98, 0xF0F1, 0x8C99, 0xF0F0, + 0x8C9A, 0xF347, 0x8C9C, 0xF9AA, 0x8C9D, 0xA8A9, 0x8C9E, 0xAD73, + 0x8CA0, 0xAD74, 0x8CA1, 0xB05D, 0x8CA2, 0xB05E, 0x8CA3, 0xD3E2, + 0x8CA4, 0xD3E1, 0x8CA5, 0xD7D2, 0x8CA7, 0xB368, 0x8CA8, 0xB366, + 0x8CA9, 0xB363, 0x8CAA, 0xB367, 0x8CAB, 0xB365, 0x8CAC, 0xB364, + 0x8CAF, 0xB64A, 0x8CB0, 0xDBEA, 0x8CB2, 0xB8ED, 0x8CB3, 0xB64C, + 0x8CB4, 0xB651, 0x8CB5, 0xDBEC, 0x8CB6, 0xB653, 0x8CB7, 0xB652, + 0x8CB8, 0xB655, 0x8CB9, 0xDBEB, 0x8CBA, 0xDBE8, 0x8CBB, 0xB64F, + 0x8CBC, 0xB64B, 0x8CBD, 0xB64D, 0x8CBE, 0xDBE9, 0x8CBF, 0xB654, + 0x8CC0, 0xB650, 0x8CC1, 0xB64E, 0x8CC2, 0xB8EF, 0x8CC3, 0xB8EE, + 0x8CC4, 0xB8EC, 0x8CC5, 0xB8F0, 0x8CC7, 0xB8EA, 0x8CC8, 0xB8EB, + 0x8CCA, 0xB8E9, 0x8CCC, 0xE05B, 0x8CCF, 0xE454, 0x8CD1, 0xBBAC, + 0x8CD2, 0xBBAD, 0x8CD3, 0xBBAB, 0x8CD5, 0xE453, 0x8CD7, 0xE455, + 0x8CD9, 0xE7EA, 0x8CDA, 0xE7EC, 0x8CDC, 0xBDE7, 0x8CDD, 0xE7ED, + 0x8CDE, 0xBDE0, 0x8CDF, 0xE7E9, 0x8CE0, 0xBDDF, 0x8CE1, 0xBDE9, + 0x8CE2, 0xBDE5, 0x8CE3, 0xBDE6, 0x8CE4, 0xBDE2, 0x8CE5, 0xE7E8, + 0x8CE6, 0xBDE1, 0x8CE7, 0xE7EE, 0x8CE8, 0xE7EB, 0x8CEA, 0xBDE8, + 0x8CEC, 0xBDE3, 0x8CED, 0xBDE4, 0x8CEE, 0xEBB5, 0x8CF0, 0xEBB7, + 0x8CF1, 0xEBB6, 0x8CF3, 0xEBB8, 0x8CF4, 0xBFE0, 0x8CF5, 0xEBB4, + 0x8CF8, 0xC1CB, 0x8CF9, 0xEEB8, 0x8CFA, 0xC1C8, 0x8CFB, 0xC1CC, + 0x8CFC, 0xC1CA, 0x8CFD, 0xC1C9, 0x8CFE, 0xF0F3, 0x8D00, 0xF0F6, + 0x8D02, 0xF0F5, 0x8D04, 0xF0F4, 0x8D05, 0xC2D8, 0x8D06, 0xF348, + 0x8D07, 0xF349, 0x8D08, 0xC3D8, 0x8D09, 0xF34A, 0x8D0A, 0xC3D9, + 0x8D0D, 0xC4BA, 0x8D0F, 0xC4B9, 0x8D10, 0xF652, 0x8D13, 0xC542, + 0x8D14, 0xF653, 0x8D15, 0xF75C, 0x8D16, 0xC5AB, 0x8D17, 0xC5AC, + 0x8D19, 0xF845, 0x8D1B, 0xC642, 0x8D64, 0xA8AA, 0x8D66, 0xB36A, + 0x8D67, 0xB369, 0x8D68, 0xE05C, 0x8D69, 0xE05D, 0x8D6B, 0xBBAE, + 0x8D6C, 0xEBB9, 0x8D6D, 0xBDEA, 0x8D6E, 0xEBBA, 0x8D6F, 0xEEB9, + 0x8D70, 0xA8AB, 0x8D72, 0xD0B2, 0x8D73, 0xAD76, 0x8D74, 0xAD75, + 0x8D76, 0xD3E3, 0x8D77, 0xB05F, 0x8D78, 0xD3E4, 0x8D79, 0xD7D5, + 0x8D7B, 0xD7D4, 0x8D7D, 0xD7D3, 0x8D80, 0xDBEE, 0x8D81, 0xB658, + 0x8D84, 0xDBED, 0x8D85, 0xB657, 0x8D89, 0xDBEF, 0x8D8A, 0xB656, + 0x8D8C, 0xE05F, 0x8D8D, 0xE062, 0x8D8E, 0xE060, 0x8D8F, 0xE061, + 0x8D90, 0xE065, 0x8D91, 0xE05E, 0x8D92, 0xE066, 0x8D93, 0xE063, + 0x8D94, 0xE064, 0x8D95, 0xBBB0, 0x8D96, 0xE456, 0x8D99, 0xBBAF, + 0x8D9B, 0xE7F2, 0x8D9C, 0xE7F0, 0x8D9F, 0xBDEB, 0x8DA0, 0xE7EF, + 0x8DA1, 0xE7F1, 0x8DA3, 0xBDEC, 0x8DA5, 0xEBBB, 0x8DA7, 0xEBBC, + 0x8DA8, 0xC1CD, 0x8DAA, 0xF34C, 0x8DAB, 0xF34E, 0x8DAC, 0xF34B, + 0x8DAD, 0xF34D, 0x8DAE, 0xF4D6, 0x8DAF, 0xF654, 0x8DB2, 0xF96F, + 0x8DB3, 0xA8AC, 0x8DB4, 0xAD77, 0x8DB5, 0xD3E5, 0x8DB6, 0xD3E7, + 0x8DB7, 0xD3E6, 0x8DB9, 0xD7D8, 0x8DBA, 0xB36C, 0x8DBC, 0xD7D6, + 0x8DBE, 0xB36B, 0x8DBF, 0xD7D9, 0x8DC1, 0xD7DA, 0x8DC2, 0xD7D7, + 0x8DC5, 0xDBFB, 0x8DC6, 0xB660, 0x8DC7, 0xDBF3, 0x8DC8, 0xDBF9, + 0x8DCB, 0xB65B, 0x8DCC, 0xB65E, 0x8DCD, 0xDBF2, 0x8DCE, 0xB659, + 0x8DCF, 0xDBF6, 0x8DD0, 0xE06C, 0x8DD1, 0xB65D, 0x8DD3, 0xDBF1, + 0x8DD5, 0xDBF7, 0x8DD6, 0xDBF4, 0x8DD7, 0xDBFA, 0x8DD8, 0xDBF0, + 0x8DD9, 0xDBF8, 0x8DDA, 0xB65C, 0x8DDB, 0xB65F, 0x8DDC, 0xDBF5, + 0x8DDD, 0xB65A, 0x8DDF, 0xB8F2, 0x8DE0, 0xE068, 0x8DE1, 0xB8F1, + 0x8DE2, 0xE06F, 0x8DE3, 0xE06E, 0x8DE4, 0xB8F8, 0x8DE6, 0xB8F9, + 0x8DE7, 0xE070, 0x8DE8, 0xB8F3, 0x8DE9, 0xE06D, 0x8DEA, 0xB8F7, + 0x8DEB, 0xE072, 0x8DEC, 0xE069, 0x8DEE, 0xE06B, 0x8DEF, 0xB8F4, + 0x8DF0, 0xE067, 0x8DF1, 0xE06A, 0x8DF2, 0xE071, 0x8DF3, 0xB8F5, + 0x8DF4, 0xE073, 0x8DFA, 0xB8F6, 0x8DFC, 0xBBB1, 0x8DFD, 0xE45B, + 0x8DFE, 0xE461, 0x8DFF, 0xE459, 0x8E00, 0xE462, 0x8E02, 0xE458, + 0x8E03, 0xE45D, 0x8E04, 0xE463, 0x8E05, 0xE460, 0x8E06, 0xE45F, + 0x8E07, 0xE45E, 0x8E09, 0xE457, 0x8E0A, 0xE45C, 0x8E0D, 0xE45A, + 0x8E0F, 0xBDF1, 0x8E10, 0xBDEE, 0x8E11, 0xE7FB, 0x8E12, 0xE841, + 0x8E13, 0xE843, 0x8E14, 0xE840, 0x8E15, 0xE7F8, 0x8E16, 0xE7FA, + 0x8E17, 0xE845, 0x8E18, 0xE842, 0x8E19, 0xE7FC, 0x8E1A, 0xE846, + 0x8E1B, 0xE7F9, 0x8E1C, 0xE844, 0x8E1D, 0xBDEF, 0x8E1E, 0xBDF5, + 0x8E1F, 0xBDF3, 0x8E20, 0xE7F3, 0x8E21, 0xBDF4, 0x8E22, 0xBDF0, + 0x8E23, 0xE7F4, 0x8E24, 0xE7F6, 0x8E25, 0xE7F5, 0x8E26, 0xE7FD, + 0x8E27, 0xE7FE, 0x8E29, 0xBDF2, 0x8E2B, 0xBDED, 0x8E2E, 0xE7F7, + 0x8E30, 0xEBC6, 0x8E31, 0xBFE2, 0x8E33, 0xEBBD, 0x8E34, 0xBFE3, + 0x8E35, 0xBFE6, 0x8E36, 0xEBC2, 0x8E38, 0xEBBF, 0x8E39, 0xBFE5, + 0x8E3C, 0xEBC3, 0x8E3D, 0xEBC4, 0x8E3E, 0xEBBE, 0x8E3F, 0xEBC7, + 0x8E40, 0xEBC0, 0x8E41, 0xEBC5, 0x8E42, 0xBFE4, 0x8E44, 0xBFE1, + 0x8E45, 0xEBC1, 0x8E47, 0xEEBF, 0x8E48, 0xC1D0, 0x8E49, 0xC1CE, + 0x8E4A, 0xC1D1, 0x8E4B, 0xC1CF, 0x8E4C, 0xEEBE, 0x8E4D, 0xEEBB, + 0x8E4E, 0xEEBA, 0x8E50, 0xEEBD, 0x8E53, 0xEEBC, 0x8E54, 0xF145, + 0x8E55, 0xC2DE, 0x8E56, 0xF0FB, 0x8E57, 0xF0FA, 0x8E59, 0xC2D9, + 0x8E5A, 0xF141, 0x8E5B, 0xF140, 0x8E5C, 0xF0F7, 0x8E5D, 0xF143, + 0x8E5E, 0xF0FC, 0x8E5F, 0xC2DD, 0x8E60, 0xF0F9, 0x8E61, 0xF142, + 0x8E62, 0xF0F8, 0x8E63, 0xC2DA, 0x8E64, 0xC2DC, 0x8E65, 0xF0FD, + 0x8E66, 0xC2DB, 0x8E67, 0xF0FE, 0x8E69, 0xF144, 0x8E6A, 0xF352, + 0x8E6C, 0xC3DE, 0x8E6D, 0xF34F, 0x8E6F, 0xF353, 0x8E72, 0xC3DB, + 0x8E73, 0xF351, 0x8E74, 0xC3E0, 0x8E76, 0xC3DD, 0x8E78, 0xF350, + 0x8E7A, 0xC3DF, 0x8E7B, 0xF354, 0x8E7C, 0xC3DA, 0x8E81, 0xC4BC, + 0x8E82, 0xC4BE, 0x8E84, 0xF4D9, 0x8E85, 0xC4BD, 0x8E86, 0xF4D7, + 0x8E87, 0xC3DC, 0x8E88, 0xF4D8, 0x8E89, 0xC4BB, 0x8E8A, 0xC543, + 0x8E8B, 0xC545, 0x8E8C, 0xF656, 0x8E8D, 0xC544, 0x8E8E, 0xF655, + 0x8E90, 0xF761, 0x8E91, 0xC5AD, 0x8E92, 0xF760, 0x8E93, 0xC5AE, + 0x8E94, 0xF75E, 0x8E95, 0xF75D, 0x8E96, 0xF762, 0x8E97, 0xF763, + 0x8E98, 0xF846, 0x8E9A, 0xF75F, 0x8E9D, 0xF8C6, 0x8E9E, 0xF8C3, + 0x8E9F, 0xF8C4, 0x8EA0, 0xF8C5, 0x8EA1, 0xC65C, 0x8EA3, 0xF951, + 0x8EA4, 0xF950, 0x8EA5, 0xF94F, 0x8EA6, 0xF970, 0x8EA8, 0xF9BE, + 0x8EA9, 0xF9AB, 0x8EAA, 0xC66E, 0x8EAB, 0xA8AD, 0x8EAC, 0xB060, + 0x8EB2, 0xB8FA, 0x8EBA, 0xBDF6, 0x8EBD, 0xEBC8, 0x8EC0, 0xC2DF, + 0x8EC2, 0xF355, 0x8EC9, 0xF9AC, 0x8ECA, 0xA8AE, 0x8ECB, 0xAAEE, + 0x8ECC, 0xAD79, 0x8ECD, 0xAD78, 0x8ECF, 0xB063, 0x8ED1, 0xD3E8, + 0x8ED2, 0xB061, 0x8ED3, 0xD3E9, 0x8ED4, 0xB062, 0x8ED7, 0xD7DF, + 0x8ED8, 0xD7DB, 0x8EDB, 0xB36D, 0x8EDC, 0xD7DE, 0x8EDD, 0xD7DD, + 0x8EDE, 0xD7DC, 0x8EDF, 0xB36E, 0x8EE0, 0xD7E0, 0x8EE1, 0xD7E1, + 0x8EE5, 0xDC43, 0x8EE6, 0xDC41, 0x8EE7, 0xDC45, 0x8EE8, 0xDC46, + 0x8EE9, 0xDC4C, 0x8EEB, 0xDC48, 0x8EEC, 0xDC4A, 0x8EEE, 0xDC42, + 0x8EEF, 0xDBFC, 0x8EF1, 0xDC49, 0x8EF4, 0xDC4B, 0x8EF5, 0xDC44, + 0x8EF6, 0xDC47, 0x8EF7, 0xDBFD, 0x8EF8, 0xB662, 0x8EF9, 0xDC40, + 0x8EFA, 0xDBFE, 0x8EFB, 0xB661, 0x8EFC, 0xB663, 0x8EFE, 0xB8FD, + 0x8EFF, 0xE075, 0x8F00, 0xE077, 0x8F01, 0xE076, 0x8F02, 0xE07B, + 0x8F03, 0xB8FB, 0x8F05, 0xE078, 0x8F06, 0xE074, 0x8F07, 0xE079, + 0x8F08, 0xE07A, 0x8F09, 0xB8FC, 0x8F0A, 0xB8FE, 0x8F0B, 0xE07C, + 0x8F0D, 0xE467, 0x8F0E, 0xE466, 0x8F10, 0xE464, 0x8F11, 0xE465, + 0x8F12, 0xBBB3, 0x8F13, 0xBBB5, 0x8F14, 0xBBB2, 0x8F15, 0xBBB4, + 0x8F16, 0xE84D, 0x8F17, 0xE84E, 0x8F18, 0xE849, 0x8F1A, 0xE84A, + 0x8F1B, 0xBDF8, 0x8F1C, 0xBDFD, 0x8F1D, 0xBDF7, 0x8F1E, 0xBDFE, + 0x8F1F, 0xBDF9, 0x8F20, 0xE84B, 0x8F23, 0xE84C, 0x8F24, 0xE848, + 0x8F25, 0xBE40, 0x8F26, 0xBDFB, 0x8F29, 0xBDFA, 0x8F2A, 0xBDFC, + 0x8F2C, 0xE847, 0x8F2E, 0xEBCA, 0x8F2F, 0xBFE8, 0x8F32, 0xEBCC, + 0x8F33, 0xBFEA, 0x8F34, 0xEBCF, 0x8F35, 0xEBCB, 0x8F36, 0xEBC9, + 0x8F37, 0xEBCE, 0x8F38, 0xBFE9, 0x8F39, 0xEBCD, 0x8F3B, 0xBFE7, + 0x8F3E, 0xC1D3, 0x8F3F, 0xC1D6, 0x8F40, 0xEEC1, 0x8F42, 0xC1D4, + 0x8F43, 0xEEC0, 0x8F44, 0xC1D2, 0x8F45, 0xC1D5, 0x8F46, 0xF146, + 0x8F47, 0xF147, 0x8F48, 0xF148, 0x8F49, 0xC2E0, 0x8F4B, 0xF149, + 0x8F4D, 0xC2E1, 0x8F4E, 0xC3E2, 0x8F4F, 0xF358, 0x8F50, 0xF359, + 0x8F51, 0xF357, 0x8F52, 0xF356, 0x8F53, 0xF35A, 0x8F54, 0xC3E1, + 0x8F55, 0xF4DD, 0x8F56, 0xF4DB, 0x8F57, 0xF4DC, 0x8F58, 0xF4DE, + 0x8F59, 0xF4DA, 0x8F5A, 0xF4DF, 0x8F5B, 0xF658, 0x8F5D, 0xF659, + 0x8F5E, 0xF657, 0x8F5F, 0xC546, 0x8F60, 0xF764, 0x8F61, 0xC5AF, + 0x8F62, 0xF765, 0x8F63, 0xF848, 0x8F64, 0xF847, 0x8F9B, 0xA8AF, + 0x8F9C, 0xB664, 0x8F9F, 0xB940, 0x8FA3, 0xBBB6, 0x8FA6, 0xBFEC, + 0x8FA8, 0xBFEB, 0x8FAD, 0xC3E3, 0x8FAE, 0xC47C, 0x8FAF, 0xC547, + 0x8FB0, 0xA8B0, 0x8FB1, 0xB064, 0x8FB2, 0xB941, 0x8FB4, 0xF35B, + 0x8FBF, 0xCBA6, 0x8FC2, 0xA8B1, 0x8FC4, 0xA8B4, 0x8FC5, 0xA8B3, + 0x8FC6, 0xA8B2, 0x8FC9, 0xCBA5, 0x8FCB, 0xCDCD, 0x8FCD, 0xCDCF, + 0x8FCE, 0xAAEF, 0x8FD1, 0xAAF1, 0x8FD2, 0xCDCC, 0x8FD3, 0xCDCE, + 0x8FD4, 0xAAF0, 0x8FD5, 0xCDD1, 0x8FD6, 0xCDD0, 0x8FD7, 0xCDD2, + 0x8FE0, 0xD0B6, 0x8FE1, 0xD0B4, 0x8FE2, 0xAD7C, 0x8FE3, 0xD0B3, + 0x8FE4, 0xADA3, 0x8FE5, 0xAD7E, 0x8FE6, 0xAD7B, 0x8FE8, 0xADA4, + 0x8FEA, 0xAD7D, 0x8FEB, 0xADA2, 0x8FED, 0xADA1, 0x8FEE, 0xD0B5, + 0x8FF0, 0xAD7A, 0x8FF4, 0xB06A, 0x8FF5, 0xD3EB, 0x8FF6, 0xD3F1, + 0x8FF7, 0xB067, 0x8FF8, 0xB06E, 0x8FFA, 0xB069, 0x8FFB, 0xD3EE, + 0x8FFC, 0xD3F0, 0x8FFD, 0xB06C, 0x8FFE, 0xD3EA, 0x8FFF, 0xD3ED, + 0x9000, 0xB068, 0x9001, 0xB065, 0x9002, 0xD3EC, 0x9003, 0xB06B, + 0x9004, 0xD3EF, 0x9005, 0xB06D, 0x9006, 0xB066, 0x900B, 0xD7E3, + 0x900C, 0xD7E6, 0x900D, 0xB370, 0x900F, 0xB37A, 0x9010, 0xB376, + 0x9011, 0xD7E4, 0x9014, 0xB37E, 0x9015, 0xB377, 0x9016, 0xB37C, + 0x9017, 0xB372, 0x9019, 0xB36F, 0x901A, 0xB371, 0x901B, 0xB37D, + 0x901C, 0xD7E5, 0x901D, 0xB375, 0x901E, 0xB378, 0x901F, 0xB374, + 0x9020, 0xB379, 0x9021, 0xD7E7, 0x9022, 0xB37B, 0x9023, 0xB373, + 0x9024, 0xD7E2, 0x902D, 0xDC4D, 0x902E, 0xB665, 0x902F, 0xDC4F, + 0x9031, 0xB667, 0x9032, 0xB669, 0x9034, 0xDC4E, 0x9035, 0xB666, + 0x9036, 0xB66A, 0x9038, 0xB668, 0x903C, 0xB947, 0x903D, 0xE0A3, + 0x903E, 0xB94F, 0x903F, 0xE07E, 0x9041, 0xB950, 0x9042, 0xB945, + 0x9044, 0xE0A1, 0x9047, 0xB94A, 0x9049, 0xE0A2, 0x904A, 0xB943, + 0x904B, 0xB942, 0x904D, 0xB94D, 0x904E, 0xB94C, 0x904F, 0xB94B, + 0x9050, 0xB949, 0x9051, 0xB94E, 0x9052, 0xE07D, 0x9053, 0xB944, + 0x9054, 0xB946, 0x9055, 0xB948, 0x9058, 0xBBB8, 0x9059, 0xBBBB, + 0x905B, 0xBBBF, 0x905C, 0xBBB9, 0x905D, 0xBBBE, 0x905E, 0xBBBC, + 0x9060, 0xBBB7, 0x9062, 0xBBBD, 0x9063, 0xBBBA, 0x9067, 0xE852, + 0x9068, 0xBE43, 0x9069, 0xBE41, 0x906B, 0xE853, 0x906D, 0xBE44, + 0x906E, 0xBE42, 0x906F, 0xE851, 0x9070, 0xE850, 0x9072, 0xBFF0, + 0x9073, 0xE84F, 0x9074, 0xBFEE, 0x9075, 0xBFED, 0x9076, 0xEBD0, + 0x9077, 0xBE45, 0x9078, 0xBFEF, 0x9079, 0xEBD1, 0x907A, 0xBFF2, + 0x907B, 0xEBD2, 0x907C, 0xBFF1, 0x907D, 0xC1D8, 0x907E, 0xEEC3, + 0x907F, 0xC1D7, 0x9080, 0xC1DC, 0x9081, 0xC1DA, 0x9082, 0xC1DB, + 0x9083, 0xC2E3, 0x9084, 0xC1D9, 0x9085, 0xEEC2, 0x9086, 0xEBD3, + 0x9087, 0xC2E2, 0x9088, 0xC2E4, 0x908A, 0xC3E4, 0x908B, 0xC3E5, + 0x908D, 0xF4E0, 0x908F, 0xC5DE, 0x9090, 0xC5DD, 0x9091, 0xA8B6, + 0x9094, 0xCA55, 0x9095, 0xB06F, 0x9097, 0xCA52, 0x9098, 0xCA53, + 0x9099, 0xCA51, 0x909B, 0xCA54, 0x909E, 0xCBAA, 0x909F, 0xCBA7, + 0x90A0, 0xCBAC, 0x90A1, 0xCBA8, 0x90A2, 0xA8B7, 0x90A3, 0xA8BA, + 0x90A5, 0xCBA9, 0x90A6, 0xA8B9, 0x90A7, 0xCBAB, 0x90AA, 0xA8B8, + 0x90AF, 0xCDD5, 0x90B0, 0xCDD7, 0x90B1, 0xAAF4, 0x90B2, 0xCDD3, + 0x90B3, 0xCDD6, 0x90B4, 0xCDD4, 0x90B5, 0xAAF2, 0x90B6, 0xAAF5, + 0x90B8, 0xAAF3, 0x90BD, 0xD0B8, 0x90BE, 0xD0BC, 0x90BF, 0xD0B9, + 0x90C1, 0xADA7, 0x90C3, 0xADA8, 0x90C5, 0xD0BB, 0x90C7, 0xD0BD, + 0x90C8, 0xD0BF, 0x90CA, 0xADA5, 0x90CB, 0xD0BE, 0x90CE, 0xADA6, + 0x90D4, 0xD7EE, 0x90D5, 0xD0BA, 0x90D6, 0xD3F2, 0x90D7, 0xD3FB, + 0x90D8, 0xD3F9, 0x90D9, 0xD3F4, 0x90DA, 0xD3F5, 0x90DB, 0xD3FA, + 0x90DC, 0xD3FC, 0x90DD, 0xB071, 0x90DF, 0xD3F7, 0x90E0, 0xD3F3, + 0x90E1, 0xB070, 0x90E2, 0xB072, 0x90E3, 0xD3F6, 0x90E4, 0xD3FD, + 0x90E5, 0xD3F8, 0x90E8, 0xB3A1, 0x90E9, 0xD7F1, 0x90EA, 0xD7E9, + 0x90EB, 0xD7EF, 0x90EC, 0xD7F0, 0x90ED, 0xB3A2, 0x90EF, 0xD7E8, + 0x90F0, 0xD7EA, 0x90F1, 0xD0B7, 0x90F2, 0xD7EC, 0x90F3, 0xD7ED, + 0x90F4, 0xD7EB, 0x90F5, 0xB66C, 0x90F9, 0xDC56, 0x90FA, 0xEBD4, + 0x90FB, 0xDC57, 0x90FC, 0xDC54, 0x90FD, 0xB3A3, 0x90FE, 0xB66E, + 0x90FF, 0xDC53, 0x9100, 0xDC59, 0x9101, 0xDC58, 0x9102, 0xB66B, + 0x9103, 0xDC5C, 0x9104, 0xDC52, 0x9105, 0xDC5B, 0x9106, 0xDC50, + 0x9107, 0xDC5A, 0x9108, 0xDC55, 0x9109, 0xB66D, 0x910B, 0xE0AA, + 0x910D, 0xE0A5, 0x910E, 0xE0AB, 0x910F, 0xE0A6, 0x9110, 0xE0A4, + 0x9111, 0xE0A7, 0x9112, 0xB951, 0x9114, 0xE0A9, 0x9116, 0xE0A8, + 0x9117, 0xB952, 0x9118, 0xBBC1, 0x9119, 0xBBC0, 0x911A, 0xE46E, + 0x911B, 0xE471, 0x911C, 0xE469, 0x911D, 0xE46D, 0x911E, 0xBBC2, + 0x911F, 0xE46C, 0x9120, 0xE46A, 0x9121, 0xE470, 0x9122, 0xE46B, + 0x9123, 0xE468, 0x9124, 0xE46F, 0x9126, 0xE859, 0x9127, 0xBE48, + 0x9128, 0xF14A, 0x9129, 0xE856, 0x912A, 0xE857, 0x912B, 0xE855, + 0x912C, 0xDC51, 0x912D, 0xBE47, 0x912E, 0xE85A, 0x912F, 0xE854, + 0x9130, 0xBE46, 0x9131, 0xBE49, 0x9132, 0xE858, 0x9133, 0xEBD5, + 0x9134, 0xBFF3, 0x9135, 0xEBD6, 0x9136, 0xEBD7, 0x9138, 0xEEC4, + 0x9139, 0xC1DD, 0x913A, 0xF14B, 0x913B, 0xF14C, 0x913E, 0xF14D, + 0x913F, 0xF35D, 0x9140, 0xF35C, 0x9141, 0xF4E2, 0x9143, 0xF4E1, + 0x9144, 0xF65B, 0x9145, 0xF65C, 0x9146, 0xF65A, 0x9147, 0xF766, + 0x9148, 0xC5B0, 0x9149, 0xA8BB, 0x914A, 0xADAA, 0x914B, 0xADA9, + 0x914C, 0xB075, 0x914D, 0xB074, 0x914E, 0xD440, 0x914F, 0xD441, + 0x9150, 0xD3FE, 0x9152, 0xB073, 0x9153, 0xD7F5, 0x9155, 0xD7F6, + 0x9156, 0xD7F2, 0x9157, 0xB3A4, 0x9158, 0xD7F3, 0x915A, 0xD7F4, + 0x915F, 0xDC5F, 0x9160, 0xDC61, 0x9161, 0xDC5D, 0x9162, 0xDC60, + 0x9163, 0xB66F, 0x9164, 0xDC5E, 0x9165, 0xB670, 0x9168, 0xDD73, + 0x9169, 0xB955, 0x916A, 0xB954, 0x916C, 0xB953, 0x916E, 0xE0AC, + 0x916F, 0xE0AD, 0x9172, 0xE473, 0x9173, 0xE475, 0x9174, 0xBBC6, + 0x9175, 0xBBC3, 0x9177, 0xBBC5, 0x9178, 0xBBC4, 0x9179, 0xE474, + 0x917A, 0xE472, 0x9180, 0xE861, 0x9181, 0xE85E, 0x9182, 0xE85F, + 0x9183, 0xBE4D, 0x9184, 0xE860, 0x9185, 0xE85B, 0x9186, 0xE85C, + 0x9187, 0xBE4A, 0x9189, 0xBE4B, 0x918A, 0xE85D, 0x918B, 0xBE4C, + 0x918D, 0xEBDB, 0x918F, 0xEBDC, 0x9190, 0xEBD9, 0x9191, 0xEBDA, + 0x9192, 0xBFF4, 0x9193, 0xEBD8, 0x9199, 0xEEC8, 0x919A, 0xEEC5, + 0x919B, 0xEEC7, 0x919C, 0xC1E0, 0x919D, 0xEECB, 0x919E, 0xC1DF, + 0x919F, 0xEEC9, 0x91A0, 0xEECC, 0x91A1, 0xEECA, 0x91A2, 0xEEC6, + 0x91A3, 0xC1DE, 0x91A5, 0xF14F, 0x91A7, 0xF150, 0x91A8, 0xF14E, + 0x91AA, 0xF152, 0x91AB, 0xC2E5, 0x91AC, 0xC2E6, 0x91AD, 0xF35F, + 0x91AE, 0xC3E7, 0x91AF, 0xF151, 0x91B0, 0xF35E, 0x91B1, 0xC3E6, + 0x91B2, 0xF4E5, 0x91B3, 0xF4E6, 0x91B4, 0xC4BF, 0x91B5, 0xF4E4, + 0x91B7, 0xF4E3, 0x91B9, 0xF65D, 0x91BA, 0xC548, 0x91BC, 0xF849, + 0x91BD, 0xF8C8, 0x91BE, 0xF8C7, 0x91C0, 0xC643, 0x91C1, 0xC65D, + 0x91C2, 0xF8C9, 0x91C3, 0xF971, 0x91C5, 0xC66F, 0x91C6, 0xA8BC, + 0x91C7, 0xAAF6, 0x91C9, 0xB956, 0x91CB, 0xC4C0, 0x91CC, 0xA8BD, + 0x91CD, 0xADAB, 0x91CE, 0xB3A5, 0x91CF, 0xB671, 0x91D0, 0xC2E7, + 0x91D1, 0xAAF7, 0x91D3, 0xD0C1, 0x91D4, 0xD0C0, 0x91D5, 0xD442, + 0x91D7, 0xB078, 0x91D8, 0xB076, 0x91D9, 0xB07A, 0x91DA, 0xD444, + 0x91DC, 0xB079, 0x91DD, 0xB077, 0x91E2, 0xD443, 0x91E3, 0xB3A8, + 0x91E4, 0xD7FC, 0x91E6, 0xB3A7, 0x91E7, 0xB3A9, 0x91E8, 0xD842, + 0x91E9, 0xB3AB, 0x91EA, 0xD7FE, 0x91EB, 0xD840, 0x91EC, 0xD7F7, + 0x91ED, 0xB3AA, 0x91EE, 0xD843, 0x91F1, 0xD7F9, 0x91F3, 0xD7FA, + 0x91F4, 0xD7F8, 0x91F5, 0xB3A6, 0x91F7, 0xD841, 0x91F8, 0xD7FB, + 0x91F9, 0xD7FD, 0x91FD, 0xDC6D, 0x91FF, 0xDC6C, 0x9200, 0xDC6A, + 0x9201, 0xDC62, 0x9202, 0xDC71, 0x9203, 0xDC65, 0x9204, 0xDC6F, + 0x9205, 0xDC76, 0x9206, 0xDC6E, 0x9207, 0xB679, 0x9209, 0xB675, + 0x920A, 0xDC63, 0x920C, 0xDC69, 0x920D, 0xB677, 0x920F, 0xDC68, + 0x9210, 0xB678, 0x9211, 0xB67A, 0x9212, 0xDC6B, 0x9214, 0xB672, + 0x9215, 0xB673, 0x9216, 0xDC77, 0x9217, 0xDC75, 0x9219, 0xDC74, + 0x921A, 0xDC66, 0x921C, 0xDC72, 0x921E, 0xB676, 0x9223, 0xB674, + 0x9224, 0xDC73, 0x9225, 0xDC64, 0x9226, 0xDC67, 0x9227, 0xDC70, + 0x922D, 0xE4BA, 0x922E, 0xE0B7, 0x9230, 0xE0B0, 0x9231, 0xE0C3, + 0x9232, 0xE0CC, 0x9233, 0xE0B3, 0x9234, 0xB961, 0x9236, 0xE0C0, + 0x9237, 0xB957, 0x9238, 0xB959, 0x9239, 0xB965, 0x923A, 0xE0B1, + 0x923D, 0xB95A, 0x923E, 0xB95C, 0x923F, 0xB966, 0x9240, 0xB95B, + 0x9245, 0xB964, 0x9246, 0xE0B9, 0x9248, 0xE0AE, 0x9249, 0xB962, + 0x924A, 0xE0B8, 0x924B, 0xB95E, 0x924C, 0xE0CA, 0x924D, 0xB963, + 0x924E, 0xE0C8, 0x924F, 0xE0BC, 0x9250, 0xE0C6, 0x9251, 0xB960, + 0x9252, 0xE0AF, 0x9253, 0xE0C9, 0x9254, 0xE0C4, 0x9256, 0xE0CB, + 0x9257, 0xB958, 0x925A, 0xB967, 0x925B, 0xB95D, 0x925E, 0xE0B5, + 0x9260, 0xE0BD, 0x9261, 0xE0C1, 0x9263, 0xE0C5, 0x9264, 0xB95F, + 0x9265, 0xE0B4, 0x9266, 0xE0B2, 0x9267, 0xE0BE, 0x926C, 0xE0BB, + 0x926D, 0xE0BA, 0x926F, 0xE0BF, 0x9270, 0xE0C2, 0x9272, 0xE0C7, + 0x9276, 0xE478, 0x9278, 0xBBC7, 0x9279, 0xE4A4, 0x927A, 0xE47A, + 0x927B, 0xBBCC, 0x927C, 0xBBD0, 0x927D, 0xE4AD, 0x927E, 0xE4B5, + 0x927F, 0xE4A6, 0x9280, 0xBBC8, 0x9282, 0xE4AA, 0x9283, 0xE0B6, + 0x9285, 0xBBC9, 0x9286, 0xE4B1, 0x9287, 0xE4B6, 0x9288, 0xE4AE, + 0x928A, 0xE4B0, 0x928B, 0xE4B9, 0x928C, 0xE4B2, 0x928D, 0xE47E, + 0x928E, 0xE4A9, 0x9291, 0xBBD1, 0x9293, 0xBBCD, 0x9294, 0xE47C, + 0x9295, 0xE4AB, 0x9296, 0xBBCB, 0x9297, 0xE4A5, 0x9298, 0xBBCA, + 0x9299, 0xE4B3, 0x929A, 0xE4A2, 0x929B, 0xE479, 0x929C, 0xBBCE, + 0x929D, 0xE4B8, 0x92A0, 0xE47B, 0x92A1, 0xE4AF, 0x92A2, 0xE4AC, + 0x92A3, 0xE4A7, 0x92A4, 0xE477, 0x92A5, 0xE476, 0x92A6, 0xE4A1, + 0x92A7, 0xE4B4, 0x92A8, 0xBBCF, 0x92A9, 0xE4B7, 0x92AA, 0xE47D, + 0x92AB, 0xE4A3, 0x92AC, 0xBE52, 0x92B2, 0xBE5A, 0x92B3, 0xBE55, + 0x92B4, 0xE8A4, 0x92B5, 0xE8A1, 0x92B6, 0xE867, 0x92B7, 0xBE50, + 0x92B9, 0xF9D7, 0x92BB, 0xBE4F, 0x92BC, 0xBE56, 0x92C0, 0xE865, + 0x92C1, 0xBE54, 0x92C2, 0xE871, 0x92C3, 0xE863, 0x92C4, 0xE864, + 0x92C5, 0xBE4E, 0x92C6, 0xE8A3, 0x92C7, 0xBE58, 0x92C8, 0xE874, + 0x92C9, 0xE879, 0x92CA, 0xE873, 0x92CB, 0xEBEE, 0x92CC, 0xE86F, + 0x92CD, 0xE877, 0x92CE, 0xE875, 0x92CF, 0xE868, 0x92D0, 0xE862, + 0x92D1, 0xE87D, 0x92D2, 0xBE57, 0x92D3, 0xE87E, 0x92D5, 0xE878, + 0x92D7, 0xE86D, 0x92D8, 0xE86B, 0x92D9, 0xE866, 0x92DD, 0xE86E, + 0x92DE, 0xE87B, 0x92DF, 0xE86A, 0x92E0, 0xE87A, 0x92E1, 0xE8A2, + 0x92E4, 0xBE53, 0x92E6, 0xE876, 0x92E7, 0xE87C, 0x92E8, 0xE872, + 0x92E9, 0xE86C, 0x92EA, 0xBE51, 0x92EE, 0xE4A8, 0x92EF, 0xE870, + 0x92F0, 0xBE59, 0x92F1, 0xE869, 0x92F7, 0xEBF4, 0x92F8, 0xBFF7, + 0x92F9, 0xEBF3, 0x92FA, 0xEBF0, 0x92FB, 0xEC44, 0x92FC, 0xBFFB, + 0x92FE, 0xEC41, 0x92FF, 0xEBF8, 0x9300, 0xEC43, 0x9301, 0xEBE9, + 0x9302, 0xEBF6, 0x9304, 0xBFFD, 0x9306, 0xEBE1, 0x9308, 0xEBDF, + 0x9309, 0xEC42, 0x930B, 0xEC40, 0x930C, 0xEBFE, 0x930D, 0xEBED, + 0x930E, 0xEBEC, 0x930F, 0xEBE2, 0x9310, 0xC040, 0x9312, 0xEBE8, + 0x9313, 0xEBF2, 0x9314, 0xEBFD, 0x9315, 0xC043, 0x9316, 0xEC45, + 0x9318, 0xC1E8, 0x9319, 0xC045, 0x931A, 0xBFFE, 0x931B, 0xEBE6, + 0x931D, 0xEBEF, 0x931E, 0xEBDE, 0x931F, 0xEBE0, 0x9320, 0xBFF5, + 0x9321, 0xC042, 0x9322, 0xBFFA, 0x9323, 0xEBE7, 0x9324, 0xEBF7, + 0x9325, 0xEBF1, 0x9326, 0xC041, 0x9327, 0xEBDD, 0x9328, 0xC1E3, + 0x9329, 0xEBF9, 0x932A, 0xEBFC, 0x932B, 0xBFFC, 0x932D, 0xEBEB, + 0x932E, 0xC044, 0x932F, 0xBFF9, 0x9333, 0xBFF8, 0x9334, 0xEBF5, + 0x9335, 0xEBFB, 0x9336, 0xBFF6, 0x9338, 0xEBE4, 0x9339, 0xEBFA, + 0x933C, 0xEBE5, 0x9346, 0xEBEA, 0x9347, 0xEED2, 0x9349, 0xEED7, + 0x934A, 0xC1E5, 0x934B, 0xC1E7, 0x934C, 0xEEDD, 0x934D, 0xC1E1, + 0x934E, 0xEEEC, 0x934F, 0xEEE3, 0x9350, 0xEED8, 0x9351, 0xEED9, + 0x9352, 0xEEE2, 0x9354, 0xC1EE, 0x9355, 0xEEE1, 0x9356, 0xEED1, + 0x9357, 0xEEE0, 0x9358, 0xEED4, 0x9359, 0xEEED, 0x935A, 0xC1ED, + 0x935B, 0xC1EB, 0x935C, 0xEED5, 0x935E, 0xEEE8, 0x9360, 0xEEDA, + 0x9361, 0xEEE7, 0x9363, 0xEEE9, 0x9364, 0xEED0, 0x9365, 0xC1E6, + 0x9367, 0xEEEA, 0x936A, 0xEEDE, 0x936C, 0xC1EA, 0x936D, 0xEEDB, + 0x9370, 0xC1EC, 0x9371, 0xEEE4, 0x9375, 0xC1E4, 0x9376, 0xEED6, + 0x9377, 0xEEE5, 0x9379, 0xEEDF, 0x937A, 0xEBE3, 0x937B, 0xEEE6, + 0x937C, 0xEED3, 0x937E, 0xC1E9, 0x9380, 0xEEEB, 0x9382, 0xC1E2, + 0x9383, 0xEECE, 0x9388, 0xF160, 0x9389, 0xF159, 0x938A, 0xC2E9, + 0x938C, 0xF154, 0x938D, 0xF163, 0x938E, 0xF15B, 0x938F, 0xEEDC, + 0x9391, 0xF165, 0x9392, 0xF155, 0x9394, 0xC2E8, 0x9395, 0xF15F, + 0x9396, 0xC2EA, 0x9397, 0xC2F2, 0x9398, 0xC2F0, 0x9399, 0xF161, + 0x939A, 0xC2F1, 0x939B, 0xF157, 0x939D, 0xF158, 0x939E, 0xF15D, + 0x939F, 0xF162, 0x93A1, 0xEECD, 0x93A2, 0xC2EB, 0x93A3, 0xF16A, + 0x93A4, 0xF167, 0x93A5, 0xF16B, 0x93A6, 0xF15E, 0x93A7, 0xF15A, + 0x93A8, 0xF168, 0x93A9, 0xF36A, 0x93AA, 0xF15C, 0x93AC, 0xC2EE, + 0x93AE, 0xC2ED, 0x93AF, 0xEECF, 0x93B0, 0xC2EF, 0x93B1, 0xF164, + 0x93B2, 0xF166, 0x93B3, 0xC2EC, 0x93B4, 0xF169, 0x93B5, 0xF153, + 0x93B7, 0xF156, 0x93C0, 0xF373, 0x93C2, 0xF363, 0x93C3, 0xC3EB, + 0x93C4, 0xF371, 0x93C7, 0xF361, 0x93C8, 0xC3EC, 0x93CA, 0xF36C, + 0x93CC, 0xF368, 0x93CD, 0xC3F1, 0x93CE, 0xF372, 0x93CF, 0xF362, + 0x93D0, 0xF365, 0x93D1, 0xC3E9, 0x93D2, 0xF374, 0x93D4, 0xF36D, + 0x93D5, 0xF370, 0x93D6, 0xC3EF, 0x93D7, 0xC3F4, 0x93D8, 0xC3F2, + 0x93D9, 0xF369, 0x93DA, 0xF364, 0x93DC, 0xC3ED, 0x93DD, 0xC3EE, + 0x93DE, 0xF360, 0x93DF, 0xC3EA, 0x93E1, 0xC3E8, 0x93E2, 0xC3F0, + 0x93E3, 0xF36F, 0x93E4, 0xC3F3, 0x93E6, 0xF36B, 0x93E7, 0xF375, + 0x93E8, 0xC3F5, 0x93EC, 0xF367, 0x93EE, 0xF36E, 0x93F5, 0xF4F3, + 0x93F6, 0xF542, 0x93F7, 0xF4F5, 0x93F8, 0xF4FC, 0x93F9, 0xF366, + 0x93FA, 0xF4FA, 0x93FB, 0xF4E9, 0x93FC, 0xF540, 0x93FD, 0xC4C3, + 0x93FE, 0xF4ED, 0x93FF, 0xF4FE, 0x9400, 0xF4F4, 0x9403, 0xC4C2, + 0x9406, 0xF544, 0x9407, 0xF4F6, 0x9409, 0xF4FB, 0x940A, 0xF4FD, + 0x940B, 0xF4E7, 0x940C, 0xF541, 0x940D, 0xF4F2, 0x940E, 0xF4F7, + 0x940F, 0xF4EB, 0x9410, 0xF4EF, 0x9411, 0xF543, 0x9412, 0xF4F9, + 0x9413, 0xF4E8, 0x9414, 0xF4EC, 0x9415, 0xF4EE, 0x9416, 0xF4F8, + 0x9418, 0xC4C1, 0x9419, 0xF4F1, 0x9420, 0xF4EA, 0x9428, 0xF4F0, + 0x9429, 0xF661, 0x942A, 0xF666, 0x942B, 0xC54F, 0x942C, 0xF668, + 0x942E, 0xC549, 0x9430, 0xF664, 0x9431, 0xF66A, 0x9432, 0xC54E, + 0x9433, 0xC54A, 0x9435, 0xC54B, 0x9436, 0xF660, 0x9437, 0xF667, + 0x9438, 0xC54D, 0x9439, 0xF665, 0x943A, 0xC54C, 0x943B, 0xF65F, + 0x943C, 0xF663, 0x943D, 0xF662, 0x943F, 0xF65E, 0x9440, 0xF669, + 0x9444, 0xC5B1, 0x9445, 0xF76D, 0x9446, 0xF770, 0x9447, 0xF76C, + 0x9448, 0xF76E, 0x9449, 0xF76F, 0x944A, 0xF769, 0x944B, 0xF76A, + 0x944C, 0xF767, 0x944F, 0xF76B, 0x9450, 0xF768, 0x9451, 0xC5B2, + 0x9452, 0xC5B3, 0x9455, 0xF84B, 0x9457, 0xF84D, 0x945D, 0xF84C, + 0x945E, 0xF84E, 0x9460, 0xC5E0, 0x9462, 0xF84A, 0x9463, 0xC5DF, + 0x9464, 0xC5E1, 0x9468, 0xF8CB, 0x9469, 0xF8CC, 0x946A, 0xC644, + 0x946B, 0xF8CA, 0x946D, 0xF953, 0x946E, 0xF952, 0x946F, 0xF954, + 0x9470, 0xC65F, 0x9471, 0xF955, 0x9472, 0xC65E, 0x9473, 0xF956, + 0x9474, 0xF972, 0x9475, 0xF975, 0x9476, 0xF974, 0x9477, 0xC668, + 0x9478, 0xF973, 0x947C, 0xC672, 0x947D, 0xC670, 0x947E, 0xC671, + 0x947F, 0xC677, 0x9480, 0xF9C0, 0x9481, 0xF9C1, 0x9482, 0xF9BF, + 0x9483, 0xF9C9, 0x9577, 0xAAF8, 0x957A, 0xD844, 0x957B, 0xDC78, + 0x957C, 0xE8A5, 0x957D, 0xF376, 0x9580, 0xAAF9, 0x9582, 0xADAC, + 0x9583, 0xB07B, 0x9586, 0xD845, 0x9588, 0xD846, 0x9589, 0xB3AC, + 0x958B, 0xB67D, 0x958C, 0xDC7A, 0x958D, 0xDC79, 0x958E, 0xB6A3, + 0x958F, 0xB67C, 0x9590, 0xDC7B, 0x9591, 0xB67E, 0x9592, 0xB6A2, + 0x9593, 0xB6A1, 0x9594, 0xB67B, 0x9598, 0xB968, 0x959B, 0xE0D0, + 0x959C, 0xE0CE, 0x959E, 0xE0CF, 0x959F, 0xE0CD, 0x95A1, 0xBBD2, + 0x95A3, 0xBBD5, 0x95A4, 0xBBD7, 0x95A5, 0xBBD6, 0x95A8, 0xBBD3, + 0x95A9, 0xBBD4, 0x95AB, 0xE8A7, 0x95AC, 0xE8A6, 0x95AD, 0xBE5B, + 0x95AE, 0xE8A8, 0x95B0, 0xE8A9, 0x95B1, 0xBE5C, 0x95B5, 0xEC4D, + 0x95B6, 0xEC4B, 0x95B7, 0xEEF3, 0x95B9, 0xEC49, 0x95BA, 0xEC4A, + 0x95BB, 0xC046, 0x95BC, 0xEC46, 0x95BD, 0xEC4E, 0x95BE, 0xEC48, + 0x95BF, 0xEC4C, 0x95C0, 0xEEEF, 0x95C3, 0xEEF1, 0x95C5, 0xEEF2, + 0x95C6, 0xC1F3, 0x95C7, 0xEEEE, 0x95C8, 0xC1F2, 0x95C9, 0xEEF0, + 0x95CA, 0xC1EF, 0x95CB, 0xC1F0, 0x95CC, 0xC1F1, 0x95CD, 0xEC47, + 0x95D0, 0xC2F5, 0x95D1, 0xF16E, 0x95D2, 0xF16C, 0x95D3, 0xF16D, + 0x95D4, 0xC2F3, 0x95D5, 0xC2F6, 0x95D6, 0xC2F4, 0x95DA, 0xF377, + 0x95DB, 0xF378, 0x95DC, 0xC3F6, 0x95DE, 0xF545, 0x95DF, 0xF547, + 0x95E0, 0xF546, 0x95E1, 0xC4C4, 0x95E2, 0xC550, 0x95E3, 0xF66D, + 0x95E4, 0xF66C, 0x95E5, 0xF66B, 0x961C, 0xAAFA, 0x961E, 0xC9AA, + 0x9620, 0xCA58, 0x9621, 0xA6E9, 0x9622, 0xCA56, 0x9623, 0xCA59, + 0x9624, 0xCA57, 0x9628, 0xCBAE, 0x962A, 0xA8C1, 0x962C, 0xA8C2, + 0x962D, 0xCBB0, 0x962E, 0xA8BF, 0x962F, 0xCBAF, 0x9630, 0xCBAD, + 0x9631, 0xA8C0, 0x9632, 0xA8BE, 0x9639, 0xCDD8, 0x963A, 0xCDDB, + 0x963B, 0xAAFD, 0x963C, 0xCDDA, 0x963D, 0xCDD9, 0x963F, 0xAAFC, + 0x9640, 0xAAFB, 0x9642, 0xAB40, 0x9643, 0xCDDC, 0x9644, 0xAAFE, + 0x964A, 0xD0C6, 0x964B, 0xADAE, 0x964C, 0xADAF, 0x964D, 0xADB0, + 0x964E, 0xD0C7, 0x964F, 0xD0C3, 0x9650, 0xADAD, 0x9651, 0xD0C4, + 0x9653, 0xD0C5, 0x9654, 0xD0C2, 0x9658, 0xB0A4, 0x965B, 0xB0A1, + 0x965C, 0xD445, 0x965D, 0xB0A2, 0x965E, 0xB0A5, 0x965F, 0xD446, + 0x9661, 0xB07E, 0x9662, 0xB07C, 0x9663, 0xB07D, 0x9664, 0xB0A3, + 0x966A, 0xB3AD, 0x966B, 0xD849, 0x966C, 0xB3B5, 0x966D, 0xD848, + 0x966F, 0xD84B, 0x9670, 0xB3B1, 0x9671, 0xD84A, 0x9672, 0xB6AB, + 0x9673, 0xB3AF, 0x9674, 0xB3B2, 0x9675, 0xB3AE, 0x9676, 0xB3B3, + 0x9677, 0xB3B4, 0x9678, 0xB3B0, 0x967C, 0xD847, 0x967D, 0xB6A7, + 0x967E, 0xDC7D, 0x9680, 0xDCA3, 0x9683, 0xDCA2, 0x9684, 0xB6AC, + 0x9685, 0xB6A8, 0x9686, 0xB6A9, 0x9687, 0xDC7C, 0x9688, 0xDC7E, + 0x9689, 0xDCA1, 0x968A, 0xB6A4, 0x968B, 0xB6A6, 0x968D, 0xB6AA, + 0x968E, 0xB6A5, 0x9691, 0xE0D3, 0x9692, 0xE0D1, 0x9693, 0xE0D2, + 0x9694, 0xB96A, 0x9695, 0xB96B, 0x9697, 0xE0D4, 0x9698, 0xB969, + 0x9699, 0xBBD8, 0x969B, 0xBBDA, 0x969C, 0xBBD9, 0x969E, 0xE4BB, + 0x96A1, 0xE4BC, 0x96A2, 0xE8AB, 0x96A4, 0xE8AA, 0x96A7, 0xC047, + 0x96A8, 0xC048, 0x96A9, 0xEC4F, 0x96AA, 0xC049, 0x96AC, 0xEEF6, + 0x96AE, 0xEEF4, 0x96B0, 0xEEF5, 0x96B1, 0xC1F4, 0x96B3, 0xF16F, + 0x96B4, 0xC3F7, 0x96B8, 0xC1F5, 0x96B9, 0xAB41, 0x96BB, 0xB0A6, + 0x96BC, 0xD447, 0x96BF, 0xD84C, 0x96C0, 0xB3B6, 0x96C1, 0xB6AD, + 0x96C2, 0xDCA4, 0x96C3, 0xDCA6, 0x96C4, 0xB6AF, 0x96C5, 0xB6AE, + 0x96C6, 0xB6B0, 0x96C7, 0xB6B1, 0x96C8, 0xDCA5, 0x96C9, 0xB96E, + 0x96CA, 0xB96F, 0x96CB, 0xB96D, 0x96CC, 0xBBDB, 0x96CD, 0xB96C, + 0x96CE, 0xE0D5, 0x96D2, 0xBBDC, 0x96D3, 0xE8AC, 0x96D4, 0xEC50, + 0x96D5, 0xC04A, 0x96D6, 0xC1F6, 0x96D7, 0xF170, 0x96D8, 0xF174, + 0x96D9, 0xC2F9, 0x96DA, 0xF171, 0x96DB, 0xC2FA, 0x96DC, 0xC2F8, + 0x96DD, 0xF175, 0x96DE, 0xC2FB, 0x96DF, 0xF173, 0x96E1, 0xF379, + 0x96E2, 0xC2F7, 0x96E3, 0xC3F8, 0x96E5, 0xF8CD, 0x96E8, 0xAB42, + 0x96E9, 0xB3B8, 0x96EA, 0xB3B7, 0x96EF, 0xB6B2, 0x96F0, 0xDCA8, + 0x96F1, 0xDCA7, 0x96F2, 0xB6B3, 0x96F5, 0xE0D9, 0x96F6, 0xB973, + 0x96F7, 0xB970, 0x96F8, 0xE0D8, 0x96F9, 0xB972, 0x96FA, 0xE0D6, + 0x96FB, 0xB971, 0x96FD, 0xE0D7, 0x96FF, 0xE4BD, 0x9700, 0xBBDD, + 0x9702, 0xE8AF, 0x9704, 0xBE5D, 0x9705, 0xE8AD, 0x9706, 0xBE5E, + 0x9707, 0xBE5F, 0x9708, 0xE8AE, 0x9709, 0xBE60, 0x970B, 0xEC51, + 0x970D, 0xC04E, 0x970E, 0xC04B, 0x970F, 0xC050, 0x9710, 0xEC53, + 0x9711, 0xC04C, 0x9712, 0xEC52, 0x9713, 0xC04F, 0x9716, 0xC04D, + 0x9718, 0xEEF9, 0x9719, 0xEEFB, 0x971C, 0xC1F7, 0x971D, 0xEEFA, + 0x971E, 0xC1F8, 0x971F, 0xEEF8, 0x9720, 0xEEF7, 0x9722, 0xF177, + 0x9723, 0xF176, 0x9724, 0xC2FC, 0x9725, 0xF178, 0x9726, 0xF37E, + 0x9727, 0xC3FA, 0x9728, 0xF37D, 0x9729, 0xF37A, 0x972A, 0xC3F9, + 0x972B, 0xF37B, 0x972C, 0xF37C, 0x972E, 0xF548, 0x972F, 0xF549, + 0x9730, 0xC4C5, 0x9732, 0xC553, 0x9735, 0xF66E, 0x9738, 0xC551, + 0x9739, 0xC552, 0x973A, 0xF66F, 0x973D, 0xC5B4, 0x973E, 0xC5B5, + 0x973F, 0xF771, 0x9742, 0xC645, 0x9743, 0xF8CF, 0x9744, 0xC647, + 0x9746, 0xF8CE, 0x9747, 0xF8D0, 0x9748, 0xC646, 0x9749, 0xF957, + 0x974B, 0xF9AD, 0x9752, 0xAB43, 0x9756, 0xB974, 0x9758, 0xE4BE, + 0x975A, 0xE8B0, 0x975B, 0xC051, 0x975C, 0xC052, 0x975E, 0xAB44, + 0x9760, 0xBE61, 0x9761, 0xC3FB, 0x9762, 0xADB1, 0x9766, 0xC053, + 0x9768, 0xC5E2, 0x9769, 0xADB2, 0x976A, 0xD84D, 0x976C, 0xDCA9, + 0x976E, 0xDCAB, 0x9770, 0xDCAA, 0x9772, 0xE0DD, 0x9773, 0xE0DA, + 0x9774, 0xB975, 0x9776, 0xB976, 0x9777, 0xE0DB, 0x9778, 0xE0DC, + 0x977A, 0xE4C0, 0x977B, 0xE4C5, 0x977C, 0xBBDE, 0x977D, 0xE4BF, + 0x977E, 0xE4C1, 0x977F, 0xE4C8, 0x9780, 0xE4C3, 0x9781, 0xE4C7, + 0x9782, 0xE4C4, 0x9783, 0xE4C2, 0x9784, 0xE4C6, 0x9785, 0xBBDF, + 0x9788, 0xE8B3, 0x978A, 0xE8B1, 0x978B, 0xBE63, 0x978D, 0xBE62, + 0x978E, 0xE8B2, 0x978F, 0xBE64, 0x9794, 0xEC56, 0x9797, 0xEC55, + 0x9798, 0xC054, 0x9799, 0xEC54, 0x979A, 0xEEFC, 0x979C, 0xEEFE, + 0x979D, 0xEF41, 0x979E, 0xEF40, 0x97A0, 0xC1F9, 0x97A1, 0xEEFD, + 0x97A2, 0xF1A1, 0x97A3, 0xC2FD, 0x97A4, 0xF17D, 0x97A5, 0xF1A2, + 0x97A6, 0xC2FE, 0x97A8, 0xF17B, 0x97AA, 0xF17E, 0x97AB, 0xF17C, + 0x97AC, 0xF179, 0x97AD, 0xC340, 0x97AE, 0xF17A, 0x97B3, 0xF3A1, + 0x97B6, 0xF3A3, 0x97B7, 0xF3A2, 0x97B9, 0xF54A, 0x97BB, 0xF54B, + 0x97BF, 0xF670, 0x97C1, 0xC5B7, 0x97C3, 0xC5B6, 0x97C4, 0xF84F, + 0x97C5, 0xF850, 0x97C6, 0xC648, 0x97C7, 0xF8D1, 0x97C9, 0xC669, + 0x97CB, 0xADB3, 0x97CC, 0xB6B4, 0x97CD, 0xE4CA, 0x97CE, 0xE4C9, + 0x97CF, 0xE8B5, 0x97D0, 0xE8B4, 0x97D3, 0xC1FA, 0x97D4, 0xEF43, + 0x97D5, 0xEF42, 0x97D6, 0xF1A5, 0x97D7, 0xF1A3, 0x97D8, 0xF1A6, + 0x97D9, 0xF1A4, 0x97DC, 0xC3FC, 0x97DD, 0xF3A4, 0x97DE, 0xF3A5, + 0x97DF, 0xF3A6, 0x97E1, 0xF671, 0x97E3, 0xF772, 0x97E5, 0xF8D2, + 0x97ED, 0xADB4, 0x97F0, 0xEC57, 0x97F1, 0xEF44, 0x97F3, 0xADB5, + 0x97F6, 0xBBE0, 0x97F8, 0xEC58, 0x97F9, 0xC341, 0x97FA, 0xF1A7, + 0x97FB, 0xC3FD, 0x97FD, 0xF54C, 0x97FE, 0xF54D, 0x97FF, 0xC554, + 0x9800, 0xF851, 0x9801, 0xADB6, 0x9802, 0xB3BB, 0x9803, 0xB3BC, + 0x9804, 0xD84E, 0x9805, 0xB6B5, 0x9806, 0xB6B6, 0x9807, 0xDCAC, + 0x9808, 0xB6B7, 0x980A, 0xB97A, 0x980C, 0xB97C, 0x980D, 0xE0DF, + 0x980E, 0xE0E0, 0x980F, 0xE0DE, 0x9810, 0xB977, 0x9811, 0xB978, + 0x9812, 0xB97B, 0x9813, 0xB979, 0x9816, 0xE4CB, 0x9817, 0xBBE1, + 0x9818, 0xBBE2, 0x981B, 0xE8BC, 0x981C, 0xBE67, 0x981D, 0xE8B7, + 0x981E, 0xE8B6, 0x9820, 0xE8BB, 0x9821, 0xBE65, 0x9824, 0xC05B, + 0x9826, 0xE8B8, 0x9827, 0xE8BD, 0x9828, 0xE8BA, 0x9829, 0xE8B9, + 0x982B, 0xBE66, 0x982D, 0xC059, 0x982F, 0xEC5A, 0x9830, 0xC055, + 0x9832, 0xEC5B, 0x9835, 0xEC59, 0x9837, 0xC058, 0x9838, 0xC056, + 0x9839, 0xC05A, 0x983B, 0xC057, 0x9841, 0xEF45, 0x9843, 0xEF4A, + 0x9844, 0xEF46, 0x9845, 0xEF49, 0x9846, 0xC1FB, 0x9848, 0xEDD4, + 0x9849, 0xEF48, 0x984A, 0xEF47, 0x984C, 0xC344, 0x984D, 0xC342, + 0x984E, 0xC345, 0x984F, 0xC343, 0x9850, 0xF1A8, 0x9851, 0xF1A9, + 0x9852, 0xF1AA, 0x9853, 0xC346, 0x9857, 0xF3AA, 0x9858, 0xC440, + 0x9859, 0xF3A8, 0x985B, 0xC441, 0x985C, 0xF3A7, 0x985D, 0xF3A9, + 0x985E, 0xC3FE, 0x985F, 0xF551, 0x9860, 0xF54E, 0x9862, 0xF54F, + 0x9863, 0xF550, 0x9864, 0xF672, 0x9865, 0xC556, 0x9867, 0xC555, + 0x9869, 0xF774, 0x986A, 0xF773, 0x986B, 0xC5B8, 0x986F, 0xC5E3, + 0x9870, 0xC649, 0x9871, 0xC660, 0x9872, 0xF958, 0x9873, 0xF9AE, + 0x9874, 0xF9AF, 0x98A8, 0xADB7, 0x98A9, 0xDCAD, 0x98AC, 0xE0E1, + 0x98AD, 0xE4CC, 0x98AE, 0xE4CD, 0x98AF, 0xBBE3, 0x98B1, 0xBBE4, + 0x98B2, 0xE8BE, 0x98B3, 0xBE68, 0x98B6, 0xC1FC, 0x98B8, 0xF1AB, + 0x98BA, 0xC347, 0x98BB, 0xF3AD, 0x98BC, 0xC442, 0x98BD, 0xF3AC, + 0x98BE, 0xF3AE, 0x98BF, 0xF3AB, 0x98C0, 0xF675, 0x98C1, 0xF552, + 0x98C2, 0xF553, 0x98C4, 0xC4C6, 0x98C6, 0xF674, 0x98C9, 0xF673, + 0x98CB, 0xF775, 0x98CC, 0xF9B0, 0x98DB, 0xADB8, 0x98DF, 0xADB9, + 0x98E2, 0xB0A7, 0x98E3, 0xD448, 0x98E5, 0xD84F, 0x98E7, 0xB6B8, + 0x98E9, 0xB6BB, 0x98EA, 0xB6B9, 0x98EB, 0xDCAE, 0x98ED, 0xB6BD, + 0x98EF, 0xB6BA, 0x98F2, 0xB6BC, 0x98F4, 0xB97E, 0x98F6, 0xE0E2, + 0x98F9, 0xE0E3, 0x98FA, 0xE8C0, 0x98FC, 0xB97D, 0x98FD, 0xB9A1, + 0x98FE, 0xB9A2, 0x9900, 0xE4CF, 0x9902, 0xE4CE, 0x9903, 0xBBE5, + 0x9905, 0xBBE6, 0x9907, 0xE4D0, 0x9908, 0xE8BF, 0x9909, 0xBBE8, + 0x990A, 0xBE69, 0x990C, 0xBBE7, 0x9910, 0xC05C, 0x9911, 0xE8C1, + 0x9912, 0xBE6B, 0x9913, 0xBE6A, 0x9914, 0xE8C2, 0x9915, 0xE8C5, + 0x9916, 0xE8C3, 0x9917, 0xE8C4, 0x9918, 0xBE6C, 0x991A, 0xC061, + 0x991B, 0xC05F, 0x991E, 0xC05E, 0x991F, 0xEC5D, 0x9921, 0xC060, + 0x9924, 0xEC5C, 0x9925, 0xEF4B, 0x9927, 0xEC5E, 0x9928, 0xC05D, + 0x9929, 0xEC5F, 0x992A, 0xEF4E, 0x992B, 0xEF4C, 0x992C, 0xEF4D, + 0x992D, 0xEF52, 0x992E, 0xC34B, 0x992F, 0xEF51, 0x9930, 0xEF54, + 0x9931, 0xEF53, 0x9932, 0xEF50, 0x9933, 0xEF4F, 0x9935, 0xC1FD, + 0x993A, 0xF1AE, 0x993C, 0xF1AD, 0x993D, 0xC34A, 0x993E, 0xC348, + 0x993F, 0xC349, 0x9941, 0xF1AC, 0x9943, 0xF3B1, 0x9945, 0xC443, + 0x9947, 0xF3B0, 0x9948, 0xF3AF, 0x9949, 0xC444, 0x994B, 0xF558, + 0x994C, 0xF557, 0x994E, 0xF555, 0x9950, 0xF554, 0x9951, 0xC4C8, + 0x9952, 0xC4C7, 0x9953, 0xF559, 0x9954, 0xF776, 0x9955, 0xC5B9, + 0x9956, 0xF677, 0x9957, 0xC557, 0x9958, 0xF676, 0x9959, 0xF556, + 0x995B, 0xF777, 0x995C, 0xC5E4, 0x995E, 0xC661, 0x995F, 0xF959, + 0x9961, 0xF9B1, 0x9996, 0xADBA, 0x9997, 0xD850, 0x9998, 0xEF55, + 0x9999, 0xADBB, 0x999C, 0xE4D2, 0x999D, 0xE4D1, 0x999E, 0xEC60, + 0x99A1, 0xEF57, 0x99A3, 0xEF56, 0x99A5, 0xC34C, 0x99A6, 0xF3B2, + 0x99A7, 0xF3B3, 0x99A8, 0xC4C9, 0x99AB, 0xF9B2, 0x99AC, 0xB0A8, + 0x99AD, 0xB6BF, 0x99AE, 0xB6BE, 0x99AF, 0xE0E4, 0x99B0, 0xE0E6, + 0x99B1, 0xB9A4, 0x99B2, 0xE0E5, 0x99B3, 0xB9A3, 0x99B4, 0xB9A5, + 0x99B5, 0xE0E7, 0x99B9, 0xE4D4, 0x99BA, 0xE4D6, 0x99BB, 0xE4D5, + 0x99BD, 0xE4D8, 0x99C1, 0xBBE9, 0x99C2, 0xE4D7, 0x99C3, 0xE4D3, + 0x99C7, 0xE4D9, 0x99C9, 0xE8CC, 0x99CB, 0xE8CF, 0x99CC, 0xE8D1, + 0x99CD, 0xE8C7, 0x99CE, 0xE8CB, 0x99CF, 0xE8C8, 0x99D0, 0xBE6E, + 0x99D1, 0xBE71, 0x99D2, 0xBE73, 0x99D3, 0xE8C9, 0x99D4, 0xE8CA, + 0x99D5, 0xBE72, 0x99D6, 0xE8CD, 0x99D7, 0xE8D0, 0x99D8, 0xE8CE, + 0x99D9, 0xBE74, 0x99DB, 0xBE70, 0x99DC, 0xE8C6, 0x99DD, 0xBE6D, + 0x99DF, 0xBE6F, 0x99E2, 0xC063, 0x99E3, 0xEC66, 0x99E4, 0xEC64, + 0x99E5, 0xEC63, 0x99E7, 0xEC69, 0x99E9, 0xEC68, 0x99EA, 0xEC67, + 0x99EC, 0xEC62, 0x99ED, 0xC062, 0x99EE, 0xEC61, 0x99F0, 0xEC65, + 0x99F1, 0xC064, 0x99F4, 0xEF5A, 0x99F6, 0xEF5E, 0x99F7, 0xEF5B, + 0x99F8, 0xEF5D, 0x99F9, 0xEF5C, 0x99FA, 0xEF59, 0x99FB, 0xEF5F, + 0x99FC, 0xEF62, 0x99FD, 0xEF60, 0x99FE, 0xEF61, 0x99FF, 0xC240, + 0x9A01, 0xC1FE, 0x9A02, 0xEF58, 0x9A03, 0xEF63, 0x9A04, 0xF1B3, + 0x9A05, 0xF1B6, 0x9A06, 0xF1B8, 0x9A07, 0xF1B7, 0x9A09, 0xF1B1, + 0x9A0A, 0xF1B5, 0x9A0B, 0xF1B0, 0x9A0D, 0xF1B2, 0x9A0E, 0xC34D, + 0x9A0F, 0xF1AF, 0x9A11, 0xF1B4, 0x9A14, 0xF3C0, 0x9A15, 0xF3B5, + 0x9A16, 0xC445, 0x9A19, 0xC446, 0x9A1A, 0xF3B4, 0x9A1B, 0xF3B9, + 0x9A1C, 0xF3BF, 0x9A1D, 0xF3B7, 0x9A1E, 0xF3BE, 0x9A20, 0xF3BB, + 0x9A22, 0xF3BA, 0x9A23, 0xF3BD, 0x9A24, 0xF3B8, 0x9A25, 0xF3B6, + 0x9A27, 0xF3BC, 0x9A29, 0xF560, 0x9A2A, 0xF55E, 0x9A2B, 0xC4CA, + 0x9A2C, 0xF55D, 0x9A2D, 0xF563, 0x9A2E, 0xF561, 0x9A30, 0xC4CB, + 0x9A31, 0xF55C, 0x9A32, 0xF55A, 0x9A34, 0xF55B, 0x9A35, 0xC4CD, + 0x9A36, 0xF55F, 0x9A37, 0xC4CC, 0x9A38, 0xF562, 0x9A39, 0xF678, + 0x9A3A, 0xF67E, 0x9A3D, 0xF679, 0x9A3E, 0xC55B, 0x9A3F, 0xF6A1, + 0x9A40, 0xC55A, 0x9A41, 0xF67D, 0x9A42, 0xF67C, 0x9A43, 0xC559, + 0x9A44, 0xF67B, 0x9A45, 0xC558, 0x9A46, 0xF67A, 0x9A48, 0xF77D, + 0x9A49, 0xF7A1, 0x9A4A, 0xF77E, 0x9A4C, 0xF77B, 0x9A4D, 0xC5BB, + 0x9A4E, 0xF778, 0x9A4F, 0xF77C, 0x9A50, 0xF7A3, 0x9A52, 0xF7A2, + 0x9A53, 0xF779, 0x9A54, 0xF77A, 0x9A55, 0xC5BA, 0x9A56, 0xF852, + 0x9A57, 0xC5E7, 0x9A59, 0xF853, 0x9A5A, 0xC5E5, 0x9A5B, 0xC5E6, + 0x9A5E, 0xF8D3, 0x9A5F, 0xC64A, 0x9A60, 0xF976, 0x9A62, 0xC66A, + 0x9A64, 0xF9B3, 0x9A65, 0xC66B, 0x9A66, 0xF9B4, 0x9A67, 0xF9B5, + 0x9A68, 0xF9C3, 0x9A69, 0xF9C2, 0x9A6A, 0xC67A, 0x9A6B, 0xF9CD, + 0x9AA8, 0xB0A9, 0x9AAB, 0xE0E9, 0x9AAD, 0xE0E8, 0x9AAF, 0xBBEA, + 0x9AB0, 0xBBEB, 0x9AB1, 0xE4DA, 0x9AB3, 0xE8D2, 0x9AB4, 0xEC6C, + 0x9AB7, 0xBE75, 0x9AB8, 0xC065, 0x9AB9, 0xEC6A, 0x9ABB, 0xEC6D, + 0x9ABC, 0xC066, 0x9ABE, 0xEF64, 0x9ABF, 0xEC6B, 0x9AC0, 0xF1B9, + 0x9AC1, 0xC34E, 0x9AC2, 0xF3C1, 0x9AC6, 0xF566, 0x9AC7, 0xF564, + 0x9ACA, 0xF565, 0x9ACD, 0xF6A2, 0x9ACF, 0xC55C, 0x9AD0, 0xF7A4, + 0x9AD1, 0xC5EA, 0x9AD2, 0xC5BC, 0x9AD3, 0xC5E8, 0x9AD4, 0xC5E9, + 0x9AD5, 0xF8D4, 0x9AD6, 0xC662, 0x9AD8, 0xB0AA, 0x9ADC, 0xF1BA, + 0x9ADF, 0xD449, 0x9AE1, 0xB9A6, 0x9AE3, 0xE4DB, 0x9AE6, 0xBBEC, + 0x9AE7, 0xE4DC, 0x9AEB, 0xE8D4, 0x9AEC, 0xE8D3, 0x9AED, 0xC068, + 0x9AEE, 0xBE76, 0x9AEF, 0xBE77, 0x9AF1, 0xE8D7, 0x9AF2, 0xE8D6, + 0x9AF3, 0xE8D5, 0x9AF6, 0xEC6E, 0x9AF7, 0xEC71, 0x9AF9, 0xEC70, + 0x9AFA, 0xEC6F, 0x9AFB, 0xC067, 0x9AFC, 0xEF68, 0x9AFD, 0xEF66, + 0x9AFE, 0xEF65, 0x9B01, 0xEF67, 0x9B03, 0xC34F, 0x9B04, 0xF1BC, + 0x9B05, 0xF1BD, 0x9B06, 0xC350, 0x9B08, 0xF1BB, 0x9B0A, 0xF3C3, + 0x9B0B, 0xF3C2, 0x9B0C, 0xF3C5, 0x9B0D, 0xC447, 0x9B0E, 0xF3C4, + 0x9B10, 0xF567, 0x9B11, 0xF569, 0x9B12, 0xF568, 0x9B15, 0xF6A3, + 0x9B16, 0xF6A6, 0x9B17, 0xF6A4, 0x9B18, 0xF6A5, 0x9B19, 0xF7A5, + 0x9B1A, 0xC5BD, 0x9B1E, 0xF854, 0x9B1F, 0xF855, 0x9B20, 0xF856, + 0x9B22, 0xC64B, 0x9B23, 0xC663, 0x9B24, 0xF9B6, 0x9B25, 0xB0AB, + 0x9B27, 0xBE78, 0x9B28, 0xC069, 0x9B29, 0xF1BE, 0x9B2B, 0xF7A6, + 0x9B2E, 0xF9C4, 0x9B2F, 0xD44A, 0x9B31, 0xC67B, 0x9B32, 0xB0AC, + 0x9B33, 0xEC72, 0x9B35, 0xF1BF, 0x9B37, 0xF3C6, 0x9B3A, 0xF6A7, + 0x9B3B, 0xF7A7, 0x9B3C, 0xB0AD, 0x9B3E, 0xE4DD, 0x9B3F, 0xE4DE, + 0x9B41, 0xBBED, 0x9B42, 0xBBEE, 0x9B43, 0xE8D9, 0x9B44, 0xBE7A, + 0x9B45, 0xBE79, 0x9B46, 0xE8D8, 0x9B48, 0xEF69, 0x9B4A, 0xF1C0, + 0x9B4B, 0xF1C2, 0x9B4C, 0xF1C1, 0x9B4D, 0xC353, 0x9B4E, 0xC352, + 0x9B4F, 0xC351, 0x9B51, 0xC55E, 0x9B52, 0xF6A8, 0x9B54, 0xC55D, + 0x9B55, 0xF7A9, 0x9B56, 0xF7A8, 0x9B58, 0xC64C, 0x9B59, 0xF8D5, + 0x9B5A, 0xB3BD, 0x9B5B, 0xE0EA, 0x9B5F, 0xE4E1, 0x9B60, 0xE4DF, + 0x9B61, 0xE4E0, 0x9B64, 0xE8E2, 0x9B66, 0xE8DD, 0x9B67, 0xE8DA, + 0x9B68, 0xE8E1, 0x9B6C, 0xE8E3, 0x9B6F, 0xBE7C, 0x9B70, 0xE8E0, + 0x9B71, 0xE8DC, 0x9B74, 0xE8DB, 0x9B75, 0xE8DF, 0x9B76, 0xE8DE, + 0x9B77, 0xBE7B, 0x9B7A, 0xEC7D, 0x9B7B, 0xEC78, 0x9B7C, 0xEC76, + 0x9B7D, 0xECA1, 0x9B7E, 0xEC77, 0x9B80, 0xEC73, 0x9B82, 0xEC79, + 0x9B85, 0xEC74, 0x9B86, 0xEF72, 0x9B87, 0xEC75, 0x9B88, 0xECA2, + 0x9B90, 0xEC7C, 0x9B91, 0xC06A, 0x9B92, 0xEC7B, 0x9B93, 0xEC7A, + 0x9B95, 0xEC7E, 0x9B9A, 0xEF6A, 0x9B9B, 0xEF6D, 0x9B9E, 0xEF6C, + 0x9BA0, 0xEF74, 0x9BA1, 0xEF6F, 0x9BA2, 0xEF73, 0x9BA4, 0xEF71, + 0x9BA5, 0xEF70, 0x9BA6, 0xEF6E, 0x9BA8, 0xEF6B, 0x9BAA, 0xC243, + 0x9BAB, 0xC242, 0x9BAD, 0xC244, 0x9BAE, 0xC241, 0x9BAF, 0xEF75, + 0x9BB5, 0xF1C8, 0x9BB6, 0xF1CB, 0x9BB8, 0xF1C9, 0x9BB9, 0xF1CD, + 0x9BBD, 0xF1CE, 0x9BBF, 0xF1C6, 0x9BC0, 0xC358, 0x9BC1, 0xF1C7, + 0x9BC3, 0xF1C5, 0x9BC4, 0xF1CC, 0x9BC6, 0xF1C4, 0x9BC7, 0xF1C3, + 0x9BC8, 0xC357, 0x9BC9, 0xC355, 0x9BCA, 0xC354, 0x9BD3, 0xF1CA, + 0x9BD4, 0xF3CF, 0x9BD5, 0xF3D5, 0x9BD6, 0xC44A, 0x9BD7, 0xF3D0, + 0x9BD9, 0xF3D3, 0x9BDA, 0xF3D7, 0x9BDB, 0xC44B, 0x9BDC, 0xF3D2, + 0x9BDE, 0xF3CA, 0x9BE0, 0xF3C9, 0x9BE1, 0xF3D6, 0x9BE2, 0xF3CD, + 0x9BE4, 0xF3CB, 0x9BE5, 0xF3D4, 0x9BE6, 0xF3CC, 0x9BE7, 0xC449, + 0x9BE8, 0xC448, 0x9BEA, 0xF3C7, 0x9BEB, 0xF3C8, 0x9BEC, 0xF3D1, + 0x9BF0, 0xF3CE, 0x9BF7, 0xF56C, 0x9BF8, 0xF56F, 0x9BFD, 0xC356, + 0x9C05, 0xF56D, 0x9C06, 0xF573, 0x9C07, 0xF571, 0x9C08, 0xF56B, + 0x9C09, 0xF576, 0x9C0B, 0xF56A, 0x9C0D, 0xC4CF, 0x9C0E, 0xF572, + 0x9C12, 0xF56E, 0x9C13, 0xC4CE, 0x9C14, 0xF575, 0x9C17, 0xF574, + 0x9C1C, 0xF6AB, 0x9C1D, 0xF6AA, 0x9C21, 0xF6B1, 0x9C23, 0xF6AD, + 0x9C24, 0xF6B0, 0x9C25, 0xC560, 0x9C28, 0xF6AE, 0x9C29, 0xF6AF, + 0x9C2B, 0xF6A9, 0x9C2C, 0xF6AC, 0x9C2D, 0xC55F, 0x9C31, 0xC5BF, + 0x9C32, 0xF7B4, 0x9C33, 0xF7AF, 0x9C34, 0xF7B3, 0x9C36, 0xF7B6, + 0x9C37, 0xF7B2, 0x9C39, 0xF7AE, 0x9C3B, 0xC5C1, 0x9C3C, 0xF7B1, + 0x9C3D, 0xF7B5, 0x9C3E, 0xC5C0, 0x9C3F, 0xF7AC, 0x9C40, 0xF570, + 0x9C41, 0xF7B0, 0x9C44, 0xF7AD, 0x9C46, 0xF7AA, 0x9C48, 0xF7AB, + 0x9C49, 0xC5BE, 0x9C4A, 0xF85A, 0x9C4B, 0xF85C, 0x9C4C, 0xF85F, + 0x9C4D, 0xF85B, 0x9C4E, 0xF860, 0x9C50, 0xF859, 0x9C52, 0xF857, + 0x9C54, 0xC5EB, 0x9C55, 0xF85D, 0x9C56, 0xC5ED, 0x9C57, 0xC5EC, + 0x9C58, 0xF858, 0x9C59, 0xF85E, 0x9C5E, 0xF8DA, 0x9C5F, 0xC64D, + 0x9C60, 0xF8DB, 0x9C62, 0xF8D9, 0x9C63, 0xF8D6, 0x9C66, 0xF8D8, + 0x9C67, 0xF8D7, 0x9C68, 0xF95A, 0x9C6D, 0xF95C, 0x9C6E, 0xF95B, + 0x9C71, 0xF979, 0x9C73, 0xF978, 0x9C74, 0xF977, 0x9C75, 0xF97A, + 0x9C77, 0xC673, 0x9C78, 0xC674, 0x9C79, 0xF9CA, 0x9C7A, 0xF9CE, + 0x9CE5, 0xB3BE, 0x9CE6, 0xDCAF, 0x9CE7, 0xE0ED, 0x9CE9, 0xB9A7, + 0x9CEA, 0xE0EB, 0x9CED, 0xE0EC, 0x9CF1, 0xE4E2, 0x9CF2, 0xE4E3, + 0x9CF3, 0xBBF1, 0x9CF4, 0xBBEF, 0x9CF5, 0xE4E4, 0x9CF6, 0xBBF0, + 0x9CF7, 0xE8E8, 0x9CF9, 0xE8EB, 0x9CFA, 0xE8E5, 0x9CFB, 0xE8EC, + 0x9CFC, 0xE8E4, 0x9CFD, 0xE8E6, 0x9CFF, 0xE8E7, 0x9D00, 0xE8EA, + 0x9D03, 0xBEA1, 0x9D04, 0xE8EF, 0x9D05, 0xE8EE, 0x9D06, 0xBE7D, + 0x9D07, 0xE8E9, 0x9D08, 0xE8ED, 0x9D09, 0xBE7E, 0x9D10, 0xECAC, + 0x9D12, 0xC06F, 0x9D14, 0xECA7, 0x9D15, 0xC06B, 0x9D17, 0xECA4, + 0x9D18, 0xECAA, 0x9D19, 0xECAD, 0x9D1B, 0xC070, 0x9D1D, 0xECA9, + 0x9D1E, 0xECA6, 0x9D1F, 0xECAE, 0x9D20, 0xECA5, 0x9D22, 0xECAB, + 0x9D23, 0xC06C, 0x9D25, 0xECA3, 0x9D26, 0xC06D, 0x9D28, 0xC06E, + 0x9D29, 0xECA8, 0x9D2D, 0xEFA9, 0x9D2E, 0xEF7A, 0x9D2F, 0xEF7B, + 0x9D30, 0xEF7E, 0x9D31, 0xEF7C, 0x9D33, 0xEF76, 0x9D36, 0xEF79, + 0x9D37, 0xEFA5, 0x9D38, 0xEF7D, 0x9D3B, 0xC245, 0x9D3D, 0xEFA7, + 0x9D3E, 0xEFA4, 0x9D3F, 0xC246, 0x9D40, 0xEFA6, 0x9D41, 0xEF77, + 0x9D42, 0xEFA2, 0x9D43, 0xEFA3, 0x9D45, 0xEFA1, 0x9D4A, 0xF1D2, + 0x9D4B, 0xF1D4, 0x9D4C, 0xF1D7, 0x9D4F, 0xF1D1, 0x9D51, 0xC359, + 0x9D52, 0xF1D9, 0x9D53, 0xF1D0, 0x9D54, 0xF1DA, 0x9D56, 0xF1D6, + 0x9D57, 0xF1D8, 0x9D58, 0xF1DC, 0x9D59, 0xF1D5, 0x9D5A, 0xF1DD, + 0x9D5B, 0xF1D3, 0x9D5C, 0xF1CF, 0x9D5D, 0xC35A, 0x9D5F, 0xF1DB, + 0x9D60, 0xC35B, 0x9D61, 0xC44D, 0x9D67, 0xEF78, 0x9D68, 0xF3F1, + 0x9D69, 0xF3E8, 0x9D6A, 0xC44F, 0x9D6B, 0xF3E4, 0x9D6C, 0xC450, + 0x9D6F, 0xF3ED, 0x9D70, 0xF3E7, 0x9D71, 0xF3DD, 0x9D72, 0xC44E, + 0x9D73, 0xF3EA, 0x9D74, 0xF3E5, 0x9D75, 0xF3E6, 0x9D77, 0xF3D8, + 0x9D78, 0xF3DF, 0x9D79, 0xF3EE, 0x9D7B, 0xF3EB, 0x9D7D, 0xF3E3, + 0x9D7F, 0xF3EF, 0x9D80, 0xF3DE, 0x9D81, 0xF3D9, 0x9D82, 0xF3EC, + 0x9D84, 0xF3DB, 0x9D85, 0xF3E9, 0x9D86, 0xF3E0, 0x9D87, 0xF3F0, + 0x9D88, 0xF3DC, 0x9D89, 0xC44C, 0x9D8A, 0xF3DA, 0x9D8B, 0xF3E1, + 0x9D8C, 0xF3E2, 0x9D90, 0xF57D, 0x9D92, 0xF57B, 0x9D94, 0xF5A2, + 0x9D96, 0xF5AE, 0x9D97, 0xF5A5, 0x9D98, 0xF57C, 0x9D99, 0xF578, + 0x9D9A, 0xF5A7, 0x9D9B, 0xF57E, 0x9D9C, 0xF5A3, 0x9D9D, 0xF57A, + 0x9D9E, 0xF5AA, 0x9D9F, 0xF577, 0x9DA0, 0xF5A1, 0x9DA1, 0xF5A6, + 0x9DA2, 0xF5A8, 0x9DA3, 0xF5AB, 0x9DA4, 0xF579, 0x9DA6, 0xF5AF, + 0x9DA7, 0xF5B0, 0x9DA8, 0xF5A9, 0x9DA9, 0xF5AD, 0x9DAA, 0xF5A4, + 0x9DAC, 0xF6C1, 0x9DAD, 0xF6C4, 0x9DAF, 0xC561, 0x9DB1, 0xF6C3, + 0x9DB2, 0xF6C8, 0x9DB3, 0xF6C6, 0x9DB4, 0xC562, 0x9DB5, 0xF6BD, + 0x9DB6, 0xF6B3, 0x9DB7, 0xF6B2, 0x9DB8, 0xC564, 0x9DB9, 0xF6BF, + 0x9DBA, 0xF6C0, 0x9DBB, 0xF6BC, 0x9DBC, 0xF6B4, 0x9DBE, 0xF6B9, + 0x9DBF, 0xF5AC, 0x9DC1, 0xF6B5, 0x9DC2, 0xC563, 0x9DC3, 0xF6BB, + 0x9DC5, 0xF6BA, 0x9DC7, 0xF6B6, 0x9DC8, 0xF6C2, 0x9DCA, 0xF6B7, + 0x9DCB, 0xF7BB, 0x9DCC, 0xF6C5, 0x9DCD, 0xF6C7, 0x9DCE, 0xF6BE, + 0x9DCF, 0xF6B8, 0x9DD0, 0xF7BC, 0x9DD1, 0xF7BE, 0x9DD2, 0xF7B8, + 0x9DD3, 0xC5C2, 0x9DD5, 0xF7C5, 0x9DD6, 0xF7C3, 0x9DD7, 0xC5C3, + 0x9DD8, 0xF7C2, 0x9DD9, 0xF7C1, 0x9DDA, 0xF7BA, 0x9DDB, 0xF7B7, + 0x9DDC, 0xF7BD, 0x9DDD, 0xF7C6, 0x9DDE, 0xF7B9, 0x9DDF, 0xF7BF, + 0x9DE1, 0xF869, 0x9DE2, 0xF86E, 0x9DE3, 0xF864, 0x9DE4, 0xF867, + 0x9DE5, 0xC5EE, 0x9DE6, 0xF86B, 0x9DE8, 0xF872, 0x9DE9, 0xF7C0, + 0x9DEB, 0xF865, 0x9DEC, 0xF86F, 0x9DED, 0xF873, 0x9DEE, 0xF86A, + 0x9DEF, 0xF863, 0x9DF0, 0xF86D, 0x9DF2, 0xF86C, 0x9DF3, 0xF871, + 0x9DF4, 0xF870, 0x9DF5, 0xF7C4, 0x9DF6, 0xF868, 0x9DF7, 0xF862, + 0x9DF8, 0xF866, 0x9DF9, 0xC64E, 0x9DFA, 0xC64F, 0x9DFB, 0xF861, + 0x9DFD, 0xF8E6, 0x9DFE, 0xF8DD, 0x9DFF, 0xF8E5, 0x9E00, 0xF8E2, + 0x9E01, 0xF8E3, 0x9E02, 0xF8DC, 0x9E03, 0xF8DF, 0x9E04, 0xF8E7, + 0x9E05, 0xF8E1, 0x9E06, 0xF8E0, 0x9E07, 0xF8DE, 0x9E09, 0xF8E4, + 0x9E0B, 0xF95D, 0x9E0D, 0xF95E, 0x9E0F, 0xF960, 0x9E10, 0xF95F, + 0x9E11, 0xF962, 0x9E12, 0xF961, 0x9E13, 0xF97C, 0x9E14, 0xF97B, + 0x9E15, 0xF9B7, 0x9E17, 0xF9B8, 0x9E19, 0xF9C5, 0x9E1A, 0xC678, + 0x9E1B, 0xC67C, 0x9E1D, 0xF9CF, 0x9E1E, 0xC67D, 0x9E75, 0xB3BF, + 0x9E79, 0xC4D0, 0x9E7A, 0xF6C9, 0x9E7C, 0xC650, 0x9E7D, 0xC651, + 0x9E7F, 0xB3C0, 0x9E80, 0xE0EE, 0x9E82, 0xB9A8, 0x9E83, 0xE8F0, + 0x9E86, 0xECB0, 0x9E87, 0xECB1, 0x9E88, 0xECAF, 0x9E89, 0xEFAB, + 0x9E8A, 0xEFAA, 0x9E8B, 0xC247, 0x9E8C, 0xF1DF, 0x9E8D, 0xEFAC, + 0x9E8E, 0xF1DE, 0x9E91, 0xF3F3, 0x9E92, 0xC451, 0x9E93, 0xC453, + 0x9E94, 0xF3F2, 0x9E97, 0xC452, 0x9E99, 0xF5B1, 0x9E9A, 0xF5B3, + 0x9E9B, 0xF5B2, 0x9E9C, 0xF6CA, 0x9E9D, 0xC565, 0x9E9F, 0xC5EF, + 0x9EA0, 0xF8E8, 0x9EA1, 0xF963, 0x9EA4, 0xF9D2, 0x9EA5, 0xB3C1, + 0x9EA7, 0xE4E5, 0x9EA9, 0xBEA2, 0x9EAD, 0xECB3, 0x9EAE, 0xECB2, + 0x9EB0, 0xEFAD, 0x9EB4, 0xC454, 0x9EB5, 0xC4D1, 0x9EB6, 0xF7C7, + 0x9EB7, 0xF9CB, 0x9EBB, 0xB3C2, 0x9EBC, 0xBBF2, 0x9EBE, 0xBEA3, + 0x9EC0, 0xF3F4, 0x9EC2, 0xF874, 0x9EC3, 0xB6C0, 0x9EC8, 0xEFAE, + 0x9ECC, 0xC664, 0x9ECD, 0xB6C1, 0x9ECE, 0xBEA4, 0x9ECF, 0xC248, + 0x9ED0, 0xF875, 0x9ED1, 0xB6C2, 0x9ED3, 0xE8F1, 0x9ED4, 0xC072, + 0x9ED5, 0xECB4, 0x9ED6, 0xECB5, 0x9ED8, 0xC071, 0x9EDA, 0xEFAF, + 0x9EDB, 0xC24C, 0x9EDC, 0xC24A, 0x9EDD, 0xC24B, 0x9EDE, 0xC249, + 0x9EDF, 0xF1E0, 0x9EE0, 0xC35C, 0x9EE4, 0xF5B5, 0x9EE5, 0xF5B4, + 0x9EE6, 0xF5B7, 0x9EE7, 0xF5B6, 0x9EE8, 0xC4D2, 0x9EEB, 0xF6CB, + 0x9EED, 0xF6CD, 0x9EEE, 0xF6CC, 0x9EEF, 0xC566, 0x9EF0, 0xF7C8, + 0x9EF2, 0xF876, 0x9EF3, 0xF877, 0x9EF4, 0xC5F0, 0x9EF5, 0xF964, + 0x9EF6, 0xF97D, 0x9EF7, 0xC675, 0x9EF9, 0xDCB0, 0x9EFA, 0xECB6, + 0x9EFB, 0xEFB0, 0x9EFC, 0xF3F5, 0x9EFD, 0xE0EF, 0x9EFF, 0xEFB1, + 0x9F00, 0xF1E2, 0x9F01, 0xF1E1, 0x9F06, 0xF878, 0x9F07, 0xC652, + 0x9F09, 0xF965, 0x9F0A, 0xF97E, 0x9F0E, 0xB9A9, 0x9F0F, 0xE8F2, + 0x9F10, 0xE8F3, 0x9F12, 0xECB7, 0x9F13, 0xB9AA, 0x9F15, 0xC35D, + 0x9F16, 0xF1E3, 0x9F18, 0xF6CF, 0x9F19, 0xC567, 0x9F1A, 0xF6D0, + 0x9F1B, 0xF6CE, 0x9F1C, 0xF879, 0x9F1E, 0xF8E9, 0x9F20, 0xB9AB, + 0x9F22, 0xEFB4, 0x9F23, 0xEFB3, 0x9F24, 0xEFB2, 0x9F25, 0xF1E4, + 0x9F28, 0xF1E8, 0x9F29, 0xF1E7, 0x9F2A, 0xF1E6, 0x9F2B, 0xF1E5, + 0x9F2C, 0xC35E, 0x9F2D, 0xF3F6, 0x9F2E, 0xF5B9, 0x9F2F, 0xC4D3, + 0x9F30, 0xF5B8, 0x9F31, 0xF6D1, 0x9F32, 0xF7CB, 0x9F33, 0xF7CA, + 0x9F34, 0xC5C4, 0x9F35, 0xF7C9, 0x9F36, 0xF87C, 0x9F37, 0xF87B, + 0x9F38, 0xF87A, 0x9F3B, 0xBBF3, 0x9F3D, 0xECB8, 0x9F3E, 0xC24D, + 0x9F40, 0xF3F7, 0x9F41, 0xF3F8, 0x9F42, 0xF7CC, 0x9F43, 0xF87D, + 0x9F46, 0xF8EA, 0x9F47, 0xF966, 0x9F48, 0xF9B9, 0x9F49, 0xF9D4, + 0x9F4A, 0xBBF4, 0x9F4B, 0xC24E, 0x9F4C, 0xF1E9, 0x9F4D, 0xF3F9, + 0x9F4E, 0xF6D2, 0x9F4F, 0xF87E, 0x9F52, 0xBEA6, 0x9F54, 0xEFB5, + 0x9F55, 0xF1EA, 0x9F56, 0xF3FA, 0x9F57, 0xF3FB, 0x9F58, 0xF3FC, + 0x9F59, 0xF5BE, 0x9F5B, 0xF5BA, 0x9F5C, 0xC568, 0x9F5D, 0xF5BD, + 0x9F5E, 0xF5BC, 0x9F5F, 0xC4D4, 0x9F60, 0xF5BB, 0x9F61, 0xC4D6, + 0x9F63, 0xC4D5, 0x9F64, 0xF6D4, 0x9F65, 0xF6D3, 0x9F66, 0xC569, + 0x9F67, 0xC56A, 0x9F6A, 0xC5C6, 0x9F6B, 0xF7CD, 0x9F6C, 0xC5C5, + 0x9F6E, 0xF8A3, 0x9F6F, 0xF8A4, 0x9F70, 0xF8A2, 0x9F71, 0xF8A1, + 0x9F72, 0xC654, 0x9F74, 0xF8EB, 0x9F75, 0xF8EC, 0x9F76, 0xF8ED, + 0x9F77, 0xC653, 0x9F78, 0xF967, 0x9F79, 0xF96A, 0x9F7A, 0xF969, + 0x9F7B, 0xF968, 0x9F7E, 0xF9D3, 0x9F8D, 0xC073, 0x9F90, 0xC365, + 0x9F91, 0xF5BF, 0x9F92, 0xF6D5, 0x9F94, 0xC5C7, 0x9F95, 0xF7CE, + 0x9F98, 0xF9D5, 0x9F9C, 0xC074, 0x9FA0, 0xEFB6, 0x9FA2, 0xF7CF, + 0x9FA4, 0xF9A1, 0xFA0C, 0xC94A, 0xFA0D, 0xDDFC, 0xFE30, 0xA14A, + 0xFE31, 0xA157, 0xFE33, 0xA159, 0xFE34, 0xA15B, 0xFE35, 0xA15F, + 0xFE36, 0xA160, 0xFE37, 0xA163, 0xFE38, 0xA164, 0xFE39, 0xA167, + 0xFE3A, 0xA168, 0xFE3B, 0xA16B, 0xFE3C, 0xA16C, 0xFE3D, 0xA16F, + 0xFE3E, 0xA170, 0xFE3F, 0xA173, 0xFE40, 0xA174, 0xFE41, 0xA177, + 0xFE42, 0xA178, 0xFE43, 0xA17B, 0xFE44, 0xA17C, 0xFE49, 0xA1C6, + 0xFE4A, 0xA1C7, 0xFE4B, 0xA1CA, 0xFE4C, 0xA1CB, 0xFE4D, 0xA1C8, + 0xFE4E, 0xA1C9, 0xFE4F, 0xA15C, 0xFE50, 0xA14D, 0xFE51, 0xA14E, + 0xFE52, 0xA14F, 0xFE54, 0xA151, 0xFE55, 0xA152, 0xFE56, 0xA153, + 0xFE57, 0xA154, 0xFE59, 0xA17D, 0xFE5A, 0xA17E, 0xFE5B, 0xA1A1, + 0xFE5C, 0xA1A2, 0xFE5D, 0xA1A3, 0xFE5E, 0xA1A4, 0xFE5F, 0xA1CC, + 0xFE60, 0xA1CD, 0xFE61, 0xA1CE, 0xFE62, 0xA1DE, 0xFE63, 0xA1DF, + 0xFE64, 0xA1E0, 0xFE65, 0xA1E1, 0xFE66, 0xA1E2, 0xFE68, 0xA242, + 0xFE69, 0xA24C, 0xFE6A, 0xA24D, 0xFE6B, 0xA24E, 0xFF01, 0xA149, + 0xFF03, 0xA1AD, 0xFF04, 0xA243, 0xFF05, 0xA248, 0xFF06, 0xA1AE, + 0xFF08, 0xA15D, 0xFF09, 0xA15E, 0xFF0A, 0xA1AF, 0xFF0B, 0xA1CF, + 0xFF0C, 0xA141, 0xFF0D, 0xA1D0, 0xFF0E, 0xA144, 0xFF0F, 0xA1FE, + 0xFF10, 0xA2AF, 0xFF11, 0xA2B0, 0xFF12, 0xA2B1, 0xFF13, 0xA2B2, + 0xFF14, 0xA2B3, 0xFF15, 0xA2B4, 0xFF16, 0xA2B5, 0xFF17, 0xA2B6, + 0xFF18, 0xA2B7, 0xFF19, 0xA2B8, 0xFF1A, 0xA147, 0xFF1B, 0xA146, + 0xFF1C, 0xA1D5, 0xFF1D, 0xA1D7, 0xFF1E, 0xA1D6, 0xFF1F, 0xA148, + 0xFF20, 0xA249, 0xFF21, 0xA2CF, 0xFF22, 0xA2D0, 0xFF23, 0xA2D1, + 0xFF24, 0xA2D2, 0xFF25, 0xA2D3, 0xFF26, 0xA2D4, 0xFF27, 0xA2D5, + 0xFF28, 0xA2D6, 0xFF29, 0xA2D7, 0xFF2A, 0xA2D8, 0xFF2B, 0xA2D9, + 0xFF2C, 0xA2DA, 0xFF2D, 0xA2DB, 0xFF2E, 0xA2DC, 0xFF2F, 0xA2DD, + 0xFF30, 0xA2DE, 0xFF31, 0xA2DF, 0xFF32, 0xA2E0, 0xFF33, 0xA2E1, + 0xFF34, 0xA2E2, 0xFF35, 0xA2E3, 0xFF36, 0xA2E4, 0xFF37, 0xA2E5, + 0xFF38, 0xA2E6, 0xFF39, 0xA2E7, 0xFF3A, 0xA2E8, 0xFF3C, 0xA240, + 0xFF3F, 0xA1C4, 0xFF41, 0xA2E9, 0xFF42, 0xA2EA, 0xFF43, 0xA2EB, + 0xFF44, 0xA2EC, 0xFF45, 0xA2ED, 0xFF46, 0xA2EE, 0xFF47, 0xA2EF, + 0xFF48, 0xA2F0, 0xFF49, 0xA2F1, 0xFF4A, 0xA2F2, 0xFF4B, 0xA2F3, + 0xFF4C, 0xA2F4, 0xFF4D, 0xA2F5, 0xFF4E, 0xA2F6, 0xFF4F, 0xA2F7, + 0xFF50, 0xA2F8, 0xFF51, 0xA2F9, 0xFF52, 0xA2FA, 0xFF53, 0xA2FB, + 0xFF54, 0xA2FC, 0xFF55, 0xA2FD, 0xFF56, 0xA2FE, 0xFF57, 0xA340, + 0xFF58, 0xA341, 0xFF59, 0xA342, 0xFF5A, 0xA343, 0xFF5B, 0xA161, + 0xFF5C, 0xA155, 0xFF5D, 0xA162, 0xFF5E, 0xA1E3, 0xFFE0, 0xA246, + 0xFFE1, 0xA247, 0xFFE3, 0xA1C3, 0xFFE5, 0xA244, 0, 0 +}; + +static +const WCHAR oem2uni[] = { +/* OEM - Unicode, OEM - Unicode, OEM - Unicode, OEM - Unicode */ + 0xA140, 0x3000, 0xA141, 0xFF0C, 0xA142, 0x3001, 0xA143, 0x3002, + 0xA144, 0xFF0E, 0xA145, 0x2027, 0xA146, 0xFF1B, 0xA147, 0xFF1A, + 0xA148, 0xFF1F, 0xA149, 0xFF01, 0xA14A, 0xFE30, 0xA14B, 0x2026, + 0xA14C, 0x2025, 0xA14D, 0xFE50, 0xA14E, 0xFE51, 0xA14F, 0xFE52, + 0xA150, 0x00B7, 0xA151, 0xFE54, 0xA152, 0xFE55, 0xA153, 0xFE56, + 0xA154, 0xFE57, 0xA155, 0xFF5C, 0xA156, 0x2013, 0xA157, 0xFE31, + 0xA158, 0x2014, 0xA159, 0xFE33, 0xA15A, 0x2574, 0xA15B, 0xFE34, + 0xA15C, 0xFE4F, 0xA15D, 0xFF08, 0xA15E, 0xFF09, 0xA15F, 0xFE35, + 0xA160, 0xFE36, 0xA161, 0xFF5B, 0xA162, 0xFF5D, 0xA163, 0xFE37, + 0xA164, 0xFE38, 0xA165, 0x3014, 0xA166, 0x3015, 0xA167, 0xFE39, + 0xA168, 0xFE3A, 0xA169, 0x3010, 0xA16A, 0x3011, 0xA16B, 0xFE3B, + 0xA16C, 0xFE3C, 0xA16D, 0x300A, 0xA16E, 0x300B, 0xA16F, 0xFE3D, + 0xA170, 0xFE3E, 0xA171, 0x3008, 0xA172, 0x3009, 0xA173, 0xFE3F, + 0xA174, 0xFE40, 0xA175, 0x300C, 0xA176, 0x300D, 0xA177, 0xFE41, + 0xA178, 0xFE42, 0xA179, 0x300E, 0xA17A, 0x300F, 0xA17B, 0xFE43, + 0xA17C, 0xFE44, 0xA17D, 0xFE59, 0xA17E, 0xFE5A, 0xA1A1, 0xFE5B, + 0xA1A2, 0xFE5C, 0xA1A3, 0xFE5D, 0xA1A4, 0xFE5E, 0xA1A5, 0x2018, + 0xA1A6, 0x2019, 0xA1A7, 0x201C, 0xA1A8, 0x201D, 0xA1A9, 0x301D, + 0xA1AA, 0x301E, 0xA1AB, 0x2035, 0xA1AC, 0x2032, 0xA1AD, 0xFF03, + 0xA1AE, 0xFF06, 0xA1AF, 0xFF0A, 0xA1B0, 0x203B, 0xA1B1, 0x00A7, + 0xA1B2, 0x3003, 0xA1B3, 0x25CB, 0xA1B4, 0x25CF, 0xA1B5, 0x25B3, + 0xA1B6, 0x25B2, 0xA1B7, 0x25CE, 0xA1B8, 0x2606, 0xA1B9, 0x2605, + 0xA1BA, 0x25C7, 0xA1BB, 0x25C6, 0xA1BC, 0x25A1, 0xA1BD, 0x25A0, + 0xA1BE, 0x25BD, 0xA1BF, 0x25BC, 0xA1C0, 0x32A3, 0xA1C1, 0x2105, + 0xA1C2, 0x00AF, 0xA1C3, 0xFFE3, 0xA1C4, 0xFF3F, 0xA1C5, 0x02CD, + 0xA1C6, 0xFE49, 0xA1C7, 0xFE4A, 0xA1C8, 0xFE4D, 0xA1C9, 0xFE4E, + 0xA1CA, 0xFE4B, 0xA1CB, 0xFE4C, 0xA1CC, 0xFE5F, 0xA1CD, 0xFE60, + 0xA1CE, 0xFE61, 0xA1CF, 0xFF0B, 0xA1D0, 0xFF0D, 0xA1D1, 0x00D7, + 0xA1D2, 0x00F7, 0xA1D3, 0x00B1, 0xA1D4, 0x221A, 0xA1D5, 0xFF1C, + 0xA1D6, 0xFF1E, 0xA1D7, 0xFF1D, 0xA1D8, 0x2266, 0xA1D9, 0x2267, + 0xA1DA, 0x2260, 0xA1DB, 0x221E, 0xA1DC, 0x2252, 0xA1DD, 0x2261, + 0xA1DE, 0xFE62, 0xA1DF, 0xFE63, 0xA1E0, 0xFE64, 0xA1E1, 0xFE65, + 0xA1E2, 0xFE66, 0xA1E3, 0xFF5E, 0xA1E4, 0x2229, 0xA1E5, 0x222A, + 0xA1E6, 0x22A5, 0xA1E7, 0x2220, 0xA1E8, 0x221F, 0xA1E9, 0x22BF, + 0xA1EA, 0x33D2, 0xA1EB, 0x33D1, 0xA1EC, 0x222B, 0xA1ED, 0x222E, + 0xA1EE, 0x2235, 0xA1EF, 0x2234, 0xA1F0, 0x2640, 0xA1F1, 0x2642, + 0xA1F2, 0x2295, 0xA1F3, 0x2299, 0xA1F4, 0x2191, 0xA1F5, 0x2193, + 0xA1F6, 0x2190, 0xA1F7, 0x2192, 0xA1F8, 0x2196, 0xA1F9, 0x2197, + 0xA1FA, 0x2199, 0xA1FB, 0x2198, 0xA1FC, 0x2225, 0xA1FD, 0x2223, + 0xA1FE, 0xFF0F, 0xA240, 0xFF3C, 0xA241, 0x2215, 0xA242, 0xFE68, + 0xA243, 0xFF04, 0xA244, 0xFFE5, 0xA245, 0x3012, 0xA246, 0xFFE0, + 0xA247, 0xFFE1, 0xA248, 0xFF05, 0xA249, 0xFF20, 0xA24A, 0x2103, + 0xA24B, 0x2109, 0xA24C, 0xFE69, 0xA24D, 0xFE6A, 0xA24E, 0xFE6B, + 0xA24F, 0x33D5, 0xA250, 0x339C, 0xA251, 0x339D, 0xA252, 0x339E, + 0xA253, 0x33CE, 0xA254, 0x33A1, 0xA255, 0x338E, 0xA256, 0x338F, + 0xA257, 0x33C4, 0xA258, 0x00B0, 0xA259, 0x5159, 0xA25A, 0x515B, + 0xA25B, 0x515E, 0xA25C, 0x515D, 0xA25D, 0x5161, 0xA25E, 0x5163, + 0xA25F, 0x55E7, 0xA260, 0x74E9, 0xA261, 0x7CCE, 0xA262, 0x2581, + 0xA263, 0x2582, 0xA264, 0x2583, 0xA265, 0x2584, 0xA266, 0x2585, + 0xA267, 0x2586, 0xA268, 0x2587, 0xA269, 0x2588, 0xA26A, 0x258F, + 0xA26B, 0x258E, 0xA26C, 0x258D, 0xA26D, 0x258C, 0xA26E, 0x258B, + 0xA26F, 0x258A, 0xA270, 0x2589, 0xA271, 0x253C, 0xA272, 0x2534, + 0xA273, 0x252C, 0xA274, 0x2524, 0xA275, 0x251C, 0xA276, 0x2594, + 0xA277, 0x2500, 0xA278, 0x2502, 0xA279, 0x2595, 0xA27A, 0x250C, + 0xA27B, 0x2510, 0xA27C, 0x2514, 0xA27D, 0x2518, 0xA27E, 0x256D, + 0xA2A1, 0x256E, 0xA2A2, 0x2570, 0xA2A3, 0x256F, 0xA2A4, 0x2550, + 0xA2A5, 0x255E, 0xA2A6, 0x256A, 0xA2A7, 0x2561, 0xA2A8, 0x25E2, + 0xA2A9, 0x25E3, 0xA2AA, 0x25E5, 0xA2AB, 0x25E4, 0xA2AC, 0x2571, + 0xA2AD, 0x2572, 0xA2AE, 0x2573, 0xA2AF, 0xFF10, 0xA2B0, 0xFF11, + 0xA2B1, 0xFF12, 0xA2B2, 0xFF13, 0xA2B3, 0xFF14, 0xA2B4, 0xFF15, + 0xA2B5, 0xFF16, 0xA2B6, 0xFF17, 0xA2B7, 0xFF18, 0xA2B8, 0xFF19, + 0xA2B9, 0x2160, 0xA2BA, 0x2161, 0xA2BB, 0x2162, 0xA2BC, 0x2163, + 0xA2BD, 0x2164, 0xA2BE, 0x2165, 0xA2BF, 0x2166, 0xA2C0, 0x2167, + 0xA2C1, 0x2168, 0xA2C2, 0x2169, 0xA2C3, 0x3021, 0xA2C4, 0x3022, + 0xA2C5, 0x3023, 0xA2C6, 0x3024, 0xA2C7, 0x3025, 0xA2C8, 0x3026, + 0xA2C9, 0x3027, 0xA2CA, 0x3028, 0xA2CB, 0x3029, 0xA2CC, 0x5341, + 0xA2CD, 0x5344, 0xA2CE, 0x5345, 0xA2CF, 0xFF21, 0xA2D0, 0xFF22, + 0xA2D1, 0xFF23, 0xA2D2, 0xFF24, 0xA2D3, 0xFF25, 0xA2D4, 0xFF26, + 0xA2D5, 0xFF27, 0xA2D6, 0xFF28, 0xA2D7, 0xFF29, 0xA2D8, 0xFF2A, + 0xA2D9, 0xFF2B, 0xA2DA, 0xFF2C, 0xA2DB, 0xFF2D, 0xA2DC, 0xFF2E, + 0xA2DD, 0xFF2F, 0xA2DE, 0xFF30, 0xA2DF, 0xFF31, 0xA2E0, 0xFF32, + 0xA2E1, 0xFF33, 0xA2E2, 0xFF34, 0xA2E3, 0xFF35, 0xA2E4, 0xFF36, + 0xA2E5, 0xFF37, 0xA2E6, 0xFF38, 0xA2E7, 0xFF39, 0xA2E8, 0xFF3A, + 0xA2E9, 0xFF41, 0xA2EA, 0xFF42, 0xA2EB, 0xFF43, 0xA2EC, 0xFF44, + 0xA2ED, 0xFF45, 0xA2EE, 0xFF46, 0xA2EF, 0xFF47, 0xA2F0, 0xFF48, + 0xA2F1, 0xFF49, 0xA2F2, 0xFF4A, 0xA2F3, 0xFF4B, 0xA2F4, 0xFF4C, + 0xA2F5, 0xFF4D, 0xA2F6, 0xFF4E, 0xA2F7, 0xFF4F, 0xA2F8, 0xFF50, + 0xA2F9, 0xFF51, 0xA2FA, 0xFF52, 0xA2FB, 0xFF53, 0xA2FC, 0xFF54, + 0xA2FD, 0xFF55, 0xA2FE, 0xFF56, 0xA340, 0xFF57, 0xA341, 0xFF58, + 0xA342, 0xFF59, 0xA343, 0xFF5A, 0xA344, 0x0391, 0xA345, 0x0392, + 0xA346, 0x0393, 0xA347, 0x0394, 0xA348, 0x0395, 0xA349, 0x0396, + 0xA34A, 0x0397, 0xA34B, 0x0398, 0xA34C, 0x0399, 0xA34D, 0x039A, + 0xA34E, 0x039B, 0xA34F, 0x039C, 0xA350, 0x039D, 0xA351, 0x039E, + 0xA352, 0x039F, 0xA353, 0x03A0, 0xA354, 0x03A1, 0xA355, 0x03A3, + 0xA356, 0x03A4, 0xA357, 0x03A5, 0xA358, 0x03A6, 0xA359, 0x03A7, + 0xA35A, 0x03A8, 0xA35B, 0x03A9, 0xA35C, 0x03B1, 0xA35D, 0x03B2, + 0xA35E, 0x03B3, 0xA35F, 0x03B4, 0xA360, 0x03B5, 0xA361, 0x03B6, + 0xA362, 0x03B7, 0xA363, 0x03B8, 0xA364, 0x03B9, 0xA365, 0x03BA, + 0xA366, 0x03BB, 0xA367, 0x03BC, 0xA368, 0x03BD, 0xA369, 0x03BE, + 0xA36A, 0x03BF, 0xA36B, 0x03C0, 0xA36C, 0x03C1, 0xA36D, 0x03C3, + 0xA36E, 0x03C4, 0xA36F, 0x03C5, 0xA370, 0x03C6, 0xA371, 0x03C7, + 0xA372, 0x03C8, 0xA373, 0x03C9, 0xA374, 0x3105, 0xA375, 0x3106, + 0xA376, 0x3107, 0xA377, 0x3108, 0xA378, 0x3109, 0xA379, 0x310A, + 0xA37A, 0x310B, 0xA37B, 0x310C, 0xA37C, 0x310D, 0xA37D, 0x310E, + 0xA37E, 0x310F, 0xA3A1, 0x3110, 0xA3A2, 0x3111, 0xA3A3, 0x3112, + 0xA3A4, 0x3113, 0xA3A5, 0x3114, 0xA3A6, 0x3115, 0xA3A7, 0x3116, + 0xA3A8, 0x3117, 0xA3A9, 0x3118, 0xA3AA, 0x3119, 0xA3AB, 0x311A, + 0xA3AC, 0x311B, 0xA3AD, 0x311C, 0xA3AE, 0x311D, 0xA3AF, 0x311E, + 0xA3B0, 0x311F, 0xA3B1, 0x3120, 0xA3B2, 0x3121, 0xA3B3, 0x3122, + 0xA3B4, 0x3123, 0xA3B5, 0x3124, 0xA3B6, 0x3125, 0xA3B7, 0x3126, + 0xA3B8, 0x3127, 0xA3B9, 0x3128, 0xA3BA, 0x3129, 0xA3BB, 0x02D9, + 0xA3BC, 0x02C9, 0xA3BD, 0x02CA, 0xA3BE, 0x02C7, 0xA3BF, 0x02CB, + 0xA3E1, 0x20AC, 0xA440, 0x4E00, 0xA441, 0x4E59, 0xA442, 0x4E01, + 0xA443, 0x4E03, 0xA444, 0x4E43, 0xA445, 0x4E5D, 0xA446, 0x4E86, + 0xA447, 0x4E8C, 0xA448, 0x4EBA, 0xA449, 0x513F, 0xA44A, 0x5165, + 0xA44B, 0x516B, 0xA44C, 0x51E0, 0xA44D, 0x5200, 0xA44E, 0x5201, + 0xA44F, 0x529B, 0xA450, 0x5315, 0xA451, 0x5341, 0xA452, 0x535C, + 0xA453, 0x53C8, 0xA454, 0x4E09, 0xA455, 0x4E0B, 0xA456, 0x4E08, + 0xA457, 0x4E0A, 0xA458, 0x4E2B, 0xA459, 0x4E38, 0xA45A, 0x51E1, + 0xA45B, 0x4E45, 0xA45C, 0x4E48, 0xA45D, 0x4E5F, 0xA45E, 0x4E5E, + 0xA45F, 0x4E8E, 0xA460, 0x4EA1, 0xA461, 0x5140, 0xA462, 0x5203, + 0xA463, 0x52FA, 0xA464, 0x5343, 0xA465, 0x53C9, 0xA466, 0x53E3, + 0xA467, 0x571F, 0xA468, 0x58EB, 0xA469, 0x5915, 0xA46A, 0x5927, + 0xA46B, 0x5973, 0xA46C, 0x5B50, 0xA46D, 0x5B51, 0xA46E, 0x5B53, + 0xA46F, 0x5BF8, 0xA470, 0x5C0F, 0xA471, 0x5C22, 0xA472, 0x5C38, + 0xA473, 0x5C71, 0xA474, 0x5DDD, 0xA475, 0x5DE5, 0xA476, 0x5DF1, + 0xA477, 0x5DF2, 0xA478, 0x5DF3, 0xA479, 0x5DFE, 0xA47A, 0x5E72, + 0xA47B, 0x5EFE, 0xA47C, 0x5F0B, 0xA47D, 0x5F13, 0xA47E, 0x624D, + 0xA4A1, 0x4E11, 0xA4A2, 0x4E10, 0xA4A3, 0x4E0D, 0xA4A4, 0x4E2D, + 0xA4A5, 0x4E30, 0xA4A6, 0x4E39, 0xA4A7, 0x4E4B, 0xA4A8, 0x5C39, + 0xA4A9, 0x4E88, 0xA4AA, 0x4E91, 0xA4AB, 0x4E95, 0xA4AC, 0x4E92, + 0xA4AD, 0x4E94, 0xA4AE, 0x4EA2, 0xA4AF, 0x4EC1, 0xA4B0, 0x4EC0, + 0xA4B1, 0x4EC3, 0xA4B2, 0x4EC6, 0xA4B3, 0x4EC7, 0xA4B4, 0x4ECD, + 0xA4B5, 0x4ECA, 0xA4B6, 0x4ECB, 0xA4B7, 0x4EC4, 0xA4B8, 0x5143, + 0xA4B9, 0x5141, 0xA4BA, 0x5167, 0xA4BB, 0x516D, 0xA4BC, 0x516E, + 0xA4BD, 0x516C, 0xA4BE, 0x5197, 0xA4BF, 0x51F6, 0xA4C0, 0x5206, + 0xA4C1, 0x5207, 0xA4C2, 0x5208, 0xA4C3, 0x52FB, 0xA4C4, 0x52FE, + 0xA4C5, 0x52FF, 0xA4C6, 0x5316, 0xA4C7, 0x5339, 0xA4C8, 0x5348, + 0xA4C9, 0x5347, 0xA4CA, 0x5345, 0xA4CB, 0x535E, 0xA4CC, 0x5384, + 0xA4CD, 0x53CB, 0xA4CE, 0x53CA, 0xA4CF, 0x53CD, 0xA4D0, 0x58EC, + 0xA4D1, 0x5929, 0xA4D2, 0x592B, 0xA4D3, 0x592A, 0xA4D4, 0x592D, + 0xA4D5, 0x5B54, 0xA4D6, 0x5C11, 0xA4D7, 0x5C24, 0xA4D8, 0x5C3A, + 0xA4D9, 0x5C6F, 0xA4DA, 0x5DF4, 0xA4DB, 0x5E7B, 0xA4DC, 0x5EFF, + 0xA4DD, 0x5F14, 0xA4DE, 0x5F15, 0xA4DF, 0x5FC3, 0xA4E0, 0x6208, + 0xA4E1, 0x6236, 0xA4E2, 0x624B, 0xA4E3, 0x624E, 0xA4E4, 0x652F, + 0xA4E5, 0x6587, 0xA4E6, 0x6597, 0xA4E7, 0x65A4, 0xA4E8, 0x65B9, + 0xA4E9, 0x65E5, 0xA4EA, 0x66F0, 0xA4EB, 0x6708, 0xA4EC, 0x6728, + 0xA4ED, 0x6B20, 0xA4EE, 0x6B62, 0xA4EF, 0x6B79, 0xA4F0, 0x6BCB, + 0xA4F1, 0x6BD4, 0xA4F2, 0x6BDB, 0xA4F3, 0x6C0F, 0xA4F4, 0x6C34, + 0xA4F5, 0x706B, 0xA4F6, 0x722A, 0xA4F7, 0x7236, 0xA4F8, 0x723B, + 0xA4F9, 0x7247, 0xA4FA, 0x7259, 0xA4FB, 0x725B, 0xA4FC, 0x72AC, + 0xA4FD, 0x738B, 0xA4FE, 0x4E19, 0xA540, 0x4E16, 0xA541, 0x4E15, + 0xA542, 0x4E14, 0xA543, 0x4E18, 0xA544, 0x4E3B, 0xA545, 0x4E4D, + 0xA546, 0x4E4F, 0xA547, 0x4E4E, 0xA548, 0x4EE5, 0xA549, 0x4ED8, + 0xA54A, 0x4ED4, 0xA54B, 0x4ED5, 0xA54C, 0x4ED6, 0xA54D, 0x4ED7, + 0xA54E, 0x4EE3, 0xA54F, 0x4EE4, 0xA550, 0x4ED9, 0xA551, 0x4EDE, + 0xA552, 0x5145, 0xA553, 0x5144, 0xA554, 0x5189, 0xA555, 0x518A, + 0xA556, 0x51AC, 0xA557, 0x51F9, 0xA558, 0x51FA, 0xA559, 0x51F8, + 0xA55A, 0x520A, 0xA55B, 0x52A0, 0xA55C, 0x529F, 0xA55D, 0x5305, + 0xA55E, 0x5306, 0xA55F, 0x5317, 0xA560, 0x531D, 0xA561, 0x4EDF, + 0xA562, 0x534A, 0xA563, 0x5349, 0xA564, 0x5361, 0xA565, 0x5360, + 0xA566, 0x536F, 0xA567, 0x536E, 0xA568, 0x53BB, 0xA569, 0x53EF, + 0xA56A, 0x53E4, 0xA56B, 0x53F3, 0xA56C, 0x53EC, 0xA56D, 0x53EE, + 0xA56E, 0x53E9, 0xA56F, 0x53E8, 0xA570, 0x53FC, 0xA571, 0x53F8, + 0xA572, 0x53F5, 0xA573, 0x53EB, 0xA574, 0x53E6, 0xA575, 0x53EA, + 0xA576, 0x53F2, 0xA577, 0x53F1, 0xA578, 0x53F0, 0xA579, 0x53E5, + 0xA57A, 0x53ED, 0xA57B, 0x53FB, 0xA57C, 0x56DB, 0xA57D, 0x56DA, + 0xA57E, 0x5916, 0xA5A1, 0x592E, 0xA5A2, 0x5931, 0xA5A3, 0x5974, + 0xA5A4, 0x5976, 0xA5A5, 0x5B55, 0xA5A6, 0x5B83, 0xA5A7, 0x5C3C, + 0xA5A8, 0x5DE8, 0xA5A9, 0x5DE7, 0xA5AA, 0x5DE6, 0xA5AB, 0x5E02, + 0xA5AC, 0x5E03, 0xA5AD, 0x5E73, 0xA5AE, 0x5E7C, 0xA5AF, 0x5F01, + 0xA5B0, 0x5F18, 0xA5B1, 0x5F17, 0xA5B2, 0x5FC5, 0xA5B3, 0x620A, + 0xA5B4, 0x6253, 0xA5B5, 0x6254, 0xA5B6, 0x6252, 0xA5B7, 0x6251, + 0xA5B8, 0x65A5, 0xA5B9, 0x65E6, 0xA5BA, 0x672E, 0xA5BB, 0x672C, + 0xA5BC, 0x672A, 0xA5BD, 0x672B, 0xA5BE, 0x672D, 0xA5BF, 0x6B63, + 0xA5C0, 0x6BCD, 0xA5C1, 0x6C11, 0xA5C2, 0x6C10, 0xA5C3, 0x6C38, + 0xA5C4, 0x6C41, 0xA5C5, 0x6C40, 0xA5C6, 0x6C3E, 0xA5C7, 0x72AF, + 0xA5C8, 0x7384, 0xA5C9, 0x7389, 0xA5CA, 0x74DC, 0xA5CB, 0x74E6, + 0xA5CC, 0x7518, 0xA5CD, 0x751F, 0xA5CE, 0x7528, 0xA5CF, 0x7529, + 0xA5D0, 0x7530, 0xA5D1, 0x7531, 0xA5D2, 0x7532, 0xA5D3, 0x7533, + 0xA5D4, 0x758B, 0xA5D5, 0x767D, 0xA5D6, 0x76AE, 0xA5D7, 0x76BF, + 0xA5D8, 0x76EE, 0xA5D9, 0x77DB, 0xA5DA, 0x77E2, 0xA5DB, 0x77F3, + 0xA5DC, 0x793A, 0xA5DD, 0x79BE, 0xA5DE, 0x7A74, 0xA5DF, 0x7ACB, + 0xA5E0, 0x4E1E, 0xA5E1, 0x4E1F, 0xA5E2, 0x4E52, 0xA5E3, 0x4E53, + 0xA5E4, 0x4E69, 0xA5E5, 0x4E99, 0xA5E6, 0x4EA4, 0xA5E7, 0x4EA6, + 0xA5E8, 0x4EA5, 0xA5E9, 0x4EFF, 0xA5EA, 0x4F09, 0xA5EB, 0x4F19, + 0xA5EC, 0x4F0A, 0xA5ED, 0x4F15, 0xA5EE, 0x4F0D, 0xA5EF, 0x4F10, + 0xA5F0, 0x4F11, 0xA5F1, 0x4F0F, 0xA5F2, 0x4EF2, 0xA5F3, 0x4EF6, + 0xA5F4, 0x4EFB, 0xA5F5, 0x4EF0, 0xA5F6, 0x4EF3, 0xA5F7, 0x4EFD, + 0xA5F8, 0x4F01, 0xA5F9, 0x4F0B, 0xA5FA, 0x5149, 0xA5FB, 0x5147, + 0xA5FC, 0x5146, 0xA5FD, 0x5148, 0xA5FE, 0x5168, 0xA640, 0x5171, + 0xA641, 0x518D, 0xA642, 0x51B0, 0xA643, 0x5217, 0xA644, 0x5211, + 0xA645, 0x5212, 0xA646, 0x520E, 0xA647, 0x5216, 0xA648, 0x52A3, + 0xA649, 0x5308, 0xA64A, 0x5321, 0xA64B, 0x5320, 0xA64C, 0x5370, + 0xA64D, 0x5371, 0xA64E, 0x5409, 0xA64F, 0x540F, 0xA650, 0x540C, + 0xA651, 0x540A, 0xA652, 0x5410, 0xA653, 0x5401, 0xA654, 0x540B, + 0xA655, 0x5404, 0xA656, 0x5411, 0xA657, 0x540D, 0xA658, 0x5408, + 0xA659, 0x5403, 0xA65A, 0x540E, 0xA65B, 0x5406, 0xA65C, 0x5412, + 0xA65D, 0x56E0, 0xA65E, 0x56DE, 0xA65F, 0x56DD, 0xA660, 0x5733, + 0xA661, 0x5730, 0xA662, 0x5728, 0xA663, 0x572D, 0xA664, 0x572C, + 0xA665, 0x572F, 0xA666, 0x5729, 0xA667, 0x5919, 0xA668, 0x591A, + 0xA669, 0x5937, 0xA66A, 0x5938, 0xA66B, 0x5984, 0xA66C, 0x5978, + 0xA66D, 0x5983, 0xA66E, 0x597D, 0xA66F, 0x5979, 0xA670, 0x5982, + 0xA671, 0x5981, 0xA672, 0x5B57, 0xA673, 0x5B58, 0xA674, 0x5B87, + 0xA675, 0x5B88, 0xA676, 0x5B85, 0xA677, 0x5B89, 0xA678, 0x5BFA, + 0xA679, 0x5C16, 0xA67A, 0x5C79, 0xA67B, 0x5DDE, 0xA67C, 0x5E06, + 0xA67D, 0x5E76, 0xA67E, 0x5E74, 0xA6A1, 0x5F0F, 0xA6A2, 0x5F1B, + 0xA6A3, 0x5FD9, 0xA6A4, 0x5FD6, 0xA6A5, 0x620E, 0xA6A6, 0x620C, + 0xA6A7, 0x620D, 0xA6A8, 0x6210, 0xA6A9, 0x6263, 0xA6AA, 0x625B, + 0xA6AB, 0x6258, 0xA6AC, 0x6536, 0xA6AD, 0x65E9, 0xA6AE, 0x65E8, + 0xA6AF, 0x65EC, 0xA6B0, 0x65ED, 0xA6B1, 0x66F2, 0xA6B2, 0x66F3, + 0xA6B3, 0x6709, 0xA6B4, 0x673D, 0xA6B5, 0x6734, 0xA6B6, 0x6731, + 0xA6B7, 0x6735, 0xA6B8, 0x6B21, 0xA6B9, 0x6B64, 0xA6BA, 0x6B7B, + 0xA6BB, 0x6C16, 0xA6BC, 0x6C5D, 0xA6BD, 0x6C57, 0xA6BE, 0x6C59, + 0xA6BF, 0x6C5F, 0xA6C0, 0x6C60, 0xA6C1, 0x6C50, 0xA6C2, 0x6C55, + 0xA6C3, 0x6C61, 0xA6C4, 0x6C5B, 0xA6C5, 0x6C4D, 0xA6C6, 0x6C4E, + 0xA6C7, 0x7070, 0xA6C8, 0x725F, 0xA6C9, 0x725D, 0xA6CA, 0x767E, + 0xA6CB, 0x7AF9, 0xA6CC, 0x7C73, 0xA6CD, 0x7CF8, 0xA6CE, 0x7F36, + 0xA6CF, 0x7F8A, 0xA6D0, 0x7FBD, 0xA6D1, 0x8001, 0xA6D2, 0x8003, + 0xA6D3, 0x800C, 0xA6D4, 0x8012, 0xA6D5, 0x8033, 0xA6D6, 0x807F, + 0xA6D7, 0x8089, 0xA6D8, 0x808B, 0xA6D9, 0x808C, 0xA6DA, 0x81E3, + 0xA6DB, 0x81EA, 0xA6DC, 0x81F3, 0xA6DD, 0x81FC, 0xA6DE, 0x820C, + 0xA6DF, 0x821B, 0xA6E0, 0x821F, 0xA6E1, 0x826E, 0xA6E2, 0x8272, + 0xA6E3, 0x827E, 0xA6E4, 0x866B, 0xA6E5, 0x8840, 0xA6E6, 0x884C, + 0xA6E7, 0x8863, 0xA6E8, 0x897F, 0xA6E9, 0x9621, 0xA6EA, 0x4E32, + 0xA6EB, 0x4EA8, 0xA6EC, 0x4F4D, 0xA6ED, 0x4F4F, 0xA6EE, 0x4F47, + 0xA6EF, 0x4F57, 0xA6F0, 0x4F5E, 0xA6F1, 0x4F34, 0xA6F2, 0x4F5B, + 0xA6F3, 0x4F55, 0xA6F4, 0x4F30, 0xA6F5, 0x4F50, 0xA6F6, 0x4F51, + 0xA6F7, 0x4F3D, 0xA6F8, 0x4F3A, 0xA6F9, 0x4F38, 0xA6FA, 0x4F43, + 0xA6FB, 0x4F54, 0xA6FC, 0x4F3C, 0xA6FD, 0x4F46, 0xA6FE, 0x4F63, + 0xA740, 0x4F5C, 0xA741, 0x4F60, 0xA742, 0x4F2F, 0xA743, 0x4F4E, + 0xA744, 0x4F36, 0xA745, 0x4F59, 0xA746, 0x4F5D, 0xA747, 0x4F48, + 0xA748, 0x4F5A, 0xA749, 0x514C, 0xA74A, 0x514B, 0xA74B, 0x514D, + 0xA74C, 0x5175, 0xA74D, 0x51B6, 0xA74E, 0x51B7, 0xA74F, 0x5225, + 0xA750, 0x5224, 0xA751, 0x5229, 0xA752, 0x522A, 0xA753, 0x5228, + 0xA754, 0x52AB, 0xA755, 0x52A9, 0xA756, 0x52AA, 0xA757, 0x52AC, + 0xA758, 0x5323, 0xA759, 0x5373, 0xA75A, 0x5375, 0xA75B, 0x541D, + 0xA75C, 0x542D, 0xA75D, 0x541E, 0xA75E, 0x543E, 0xA75F, 0x5426, + 0xA760, 0x544E, 0xA761, 0x5427, 0xA762, 0x5446, 0xA763, 0x5443, + 0xA764, 0x5433, 0xA765, 0x5448, 0xA766, 0x5442, 0xA767, 0x541B, + 0xA768, 0x5429, 0xA769, 0x544A, 0xA76A, 0x5439, 0xA76B, 0x543B, + 0xA76C, 0x5438, 0xA76D, 0x542E, 0xA76E, 0x5435, 0xA76F, 0x5436, + 0xA770, 0x5420, 0xA771, 0x543C, 0xA772, 0x5440, 0xA773, 0x5431, + 0xA774, 0x542B, 0xA775, 0x541F, 0xA776, 0x542C, 0xA777, 0x56EA, + 0xA778, 0x56F0, 0xA779, 0x56E4, 0xA77A, 0x56EB, 0xA77B, 0x574A, + 0xA77C, 0x5751, 0xA77D, 0x5740, 0xA77E, 0x574D, 0xA7A1, 0x5747, + 0xA7A2, 0x574E, 0xA7A3, 0x573E, 0xA7A4, 0x5750, 0xA7A5, 0x574F, + 0xA7A6, 0x573B, 0xA7A7, 0x58EF, 0xA7A8, 0x593E, 0xA7A9, 0x599D, + 0xA7AA, 0x5992, 0xA7AB, 0x59A8, 0xA7AC, 0x599E, 0xA7AD, 0x59A3, + 0xA7AE, 0x5999, 0xA7AF, 0x5996, 0xA7B0, 0x598D, 0xA7B1, 0x59A4, + 0xA7B2, 0x5993, 0xA7B3, 0x598A, 0xA7B4, 0x59A5, 0xA7B5, 0x5B5D, + 0xA7B6, 0x5B5C, 0xA7B7, 0x5B5A, 0xA7B8, 0x5B5B, 0xA7B9, 0x5B8C, + 0xA7BA, 0x5B8B, 0xA7BB, 0x5B8F, 0xA7BC, 0x5C2C, 0xA7BD, 0x5C40, + 0xA7BE, 0x5C41, 0xA7BF, 0x5C3F, 0xA7C0, 0x5C3E, 0xA7C1, 0x5C90, + 0xA7C2, 0x5C91, 0xA7C3, 0x5C94, 0xA7C4, 0x5C8C, 0xA7C5, 0x5DEB, + 0xA7C6, 0x5E0C, 0xA7C7, 0x5E8F, 0xA7C8, 0x5E87, 0xA7C9, 0x5E8A, + 0xA7CA, 0x5EF7, 0xA7CB, 0x5F04, 0xA7CC, 0x5F1F, 0xA7CD, 0x5F64, + 0xA7CE, 0x5F62, 0xA7CF, 0x5F77, 0xA7D0, 0x5F79, 0xA7D1, 0x5FD8, + 0xA7D2, 0x5FCC, 0xA7D3, 0x5FD7, 0xA7D4, 0x5FCD, 0xA7D5, 0x5FF1, + 0xA7D6, 0x5FEB, 0xA7D7, 0x5FF8, 0xA7D8, 0x5FEA, 0xA7D9, 0x6212, + 0xA7DA, 0x6211, 0xA7DB, 0x6284, 0xA7DC, 0x6297, 0xA7DD, 0x6296, + 0xA7DE, 0x6280, 0xA7DF, 0x6276, 0xA7E0, 0x6289, 0xA7E1, 0x626D, + 0xA7E2, 0x628A, 0xA7E3, 0x627C, 0xA7E4, 0x627E, 0xA7E5, 0x6279, + 0xA7E6, 0x6273, 0xA7E7, 0x6292, 0xA7E8, 0x626F, 0xA7E9, 0x6298, + 0xA7EA, 0x626E, 0xA7EB, 0x6295, 0xA7EC, 0x6293, 0xA7ED, 0x6291, + 0xA7EE, 0x6286, 0xA7EF, 0x6539, 0xA7F0, 0x653B, 0xA7F1, 0x6538, + 0xA7F2, 0x65F1, 0xA7F3, 0x66F4, 0xA7F4, 0x675F, 0xA7F5, 0x674E, + 0xA7F6, 0x674F, 0xA7F7, 0x6750, 0xA7F8, 0x6751, 0xA7F9, 0x675C, + 0xA7FA, 0x6756, 0xA7FB, 0x675E, 0xA7FC, 0x6749, 0xA7FD, 0x6746, + 0xA7FE, 0x6760, 0xA840, 0x6753, 0xA841, 0x6757, 0xA842, 0x6B65, + 0xA843, 0x6BCF, 0xA844, 0x6C42, 0xA845, 0x6C5E, 0xA846, 0x6C99, + 0xA847, 0x6C81, 0xA848, 0x6C88, 0xA849, 0x6C89, 0xA84A, 0x6C85, + 0xA84B, 0x6C9B, 0xA84C, 0x6C6A, 0xA84D, 0x6C7A, 0xA84E, 0x6C90, + 0xA84F, 0x6C70, 0xA850, 0x6C8C, 0xA851, 0x6C68, 0xA852, 0x6C96, + 0xA853, 0x6C92, 0xA854, 0x6C7D, 0xA855, 0x6C83, 0xA856, 0x6C72, + 0xA857, 0x6C7E, 0xA858, 0x6C74, 0xA859, 0x6C86, 0xA85A, 0x6C76, + 0xA85B, 0x6C8D, 0xA85C, 0x6C94, 0xA85D, 0x6C98, 0xA85E, 0x6C82, + 0xA85F, 0x7076, 0xA860, 0x707C, 0xA861, 0x707D, 0xA862, 0x7078, + 0xA863, 0x7262, 0xA864, 0x7261, 0xA865, 0x7260, 0xA866, 0x72C4, + 0xA867, 0x72C2, 0xA868, 0x7396, 0xA869, 0x752C, 0xA86A, 0x752B, + 0xA86B, 0x7537, 0xA86C, 0x7538, 0xA86D, 0x7682, 0xA86E, 0x76EF, + 0xA86F, 0x77E3, 0xA870, 0x79C1, 0xA871, 0x79C0, 0xA872, 0x79BF, + 0xA873, 0x7A76, 0xA874, 0x7CFB, 0xA875, 0x7F55, 0xA876, 0x8096, + 0xA877, 0x8093, 0xA878, 0x809D, 0xA879, 0x8098, 0xA87A, 0x809B, + 0xA87B, 0x809A, 0xA87C, 0x80B2, 0xA87D, 0x826F, 0xA87E, 0x8292, + 0xA8A1, 0x828B, 0xA8A2, 0x828D, 0xA8A3, 0x898B, 0xA8A4, 0x89D2, + 0xA8A5, 0x8A00, 0xA8A6, 0x8C37, 0xA8A7, 0x8C46, 0xA8A8, 0x8C55, + 0xA8A9, 0x8C9D, 0xA8AA, 0x8D64, 0xA8AB, 0x8D70, 0xA8AC, 0x8DB3, + 0xA8AD, 0x8EAB, 0xA8AE, 0x8ECA, 0xA8AF, 0x8F9B, 0xA8B0, 0x8FB0, + 0xA8B1, 0x8FC2, 0xA8B2, 0x8FC6, 0xA8B3, 0x8FC5, 0xA8B4, 0x8FC4, + 0xA8B5, 0x5DE1, 0xA8B6, 0x9091, 0xA8B7, 0x90A2, 0xA8B8, 0x90AA, + 0xA8B9, 0x90A6, 0xA8BA, 0x90A3, 0xA8BB, 0x9149, 0xA8BC, 0x91C6, + 0xA8BD, 0x91CC, 0xA8BE, 0x9632, 0xA8BF, 0x962E, 0xA8C0, 0x9631, + 0xA8C1, 0x962A, 0xA8C2, 0x962C, 0xA8C3, 0x4E26, 0xA8C4, 0x4E56, + 0xA8C5, 0x4E73, 0xA8C6, 0x4E8B, 0xA8C7, 0x4E9B, 0xA8C8, 0x4E9E, + 0xA8C9, 0x4EAB, 0xA8CA, 0x4EAC, 0xA8CB, 0x4F6F, 0xA8CC, 0x4F9D, + 0xA8CD, 0x4F8D, 0xA8CE, 0x4F73, 0xA8CF, 0x4F7F, 0xA8D0, 0x4F6C, + 0xA8D1, 0x4F9B, 0xA8D2, 0x4F8B, 0xA8D3, 0x4F86, 0xA8D4, 0x4F83, + 0xA8D5, 0x4F70, 0xA8D6, 0x4F75, 0xA8D7, 0x4F88, 0xA8D8, 0x4F69, + 0xA8D9, 0x4F7B, 0xA8DA, 0x4F96, 0xA8DB, 0x4F7E, 0xA8DC, 0x4F8F, + 0xA8DD, 0x4F91, 0xA8DE, 0x4F7A, 0xA8DF, 0x5154, 0xA8E0, 0x5152, + 0xA8E1, 0x5155, 0xA8E2, 0x5169, 0xA8E3, 0x5177, 0xA8E4, 0x5176, + 0xA8E5, 0x5178, 0xA8E6, 0x51BD, 0xA8E7, 0x51FD, 0xA8E8, 0x523B, + 0xA8E9, 0x5238, 0xA8EA, 0x5237, 0xA8EB, 0x523A, 0xA8EC, 0x5230, + 0xA8ED, 0x522E, 0xA8EE, 0x5236, 0xA8EF, 0x5241, 0xA8F0, 0x52BE, + 0xA8F1, 0x52BB, 0xA8F2, 0x5352, 0xA8F3, 0x5354, 0xA8F4, 0x5353, + 0xA8F5, 0x5351, 0xA8F6, 0x5366, 0xA8F7, 0x5377, 0xA8F8, 0x5378, + 0xA8F9, 0x5379, 0xA8FA, 0x53D6, 0xA8FB, 0x53D4, 0xA8FC, 0x53D7, + 0xA8FD, 0x5473, 0xA8FE, 0x5475, 0xA940, 0x5496, 0xA941, 0x5478, + 0xA942, 0x5495, 0xA943, 0x5480, 0xA944, 0x547B, 0xA945, 0x5477, + 0xA946, 0x5484, 0xA947, 0x5492, 0xA948, 0x5486, 0xA949, 0x547C, + 0xA94A, 0x5490, 0xA94B, 0x5471, 0xA94C, 0x5476, 0xA94D, 0x548C, + 0xA94E, 0x549A, 0xA94F, 0x5462, 0xA950, 0x5468, 0xA951, 0x548B, + 0xA952, 0x547D, 0xA953, 0x548E, 0xA954, 0x56FA, 0xA955, 0x5783, + 0xA956, 0x5777, 0xA957, 0x576A, 0xA958, 0x5769, 0xA959, 0x5761, + 0xA95A, 0x5766, 0xA95B, 0x5764, 0xA95C, 0x577C, 0xA95D, 0x591C, + 0xA95E, 0x5949, 0xA95F, 0x5947, 0xA960, 0x5948, 0xA961, 0x5944, + 0xA962, 0x5954, 0xA963, 0x59BE, 0xA964, 0x59BB, 0xA965, 0x59D4, + 0xA966, 0x59B9, 0xA967, 0x59AE, 0xA968, 0x59D1, 0xA969, 0x59C6, + 0xA96A, 0x59D0, 0xA96B, 0x59CD, 0xA96C, 0x59CB, 0xA96D, 0x59D3, + 0xA96E, 0x59CA, 0xA96F, 0x59AF, 0xA970, 0x59B3, 0xA971, 0x59D2, + 0xA972, 0x59C5, 0xA973, 0x5B5F, 0xA974, 0x5B64, 0xA975, 0x5B63, + 0xA976, 0x5B97, 0xA977, 0x5B9A, 0xA978, 0x5B98, 0xA979, 0x5B9C, + 0xA97A, 0x5B99, 0xA97B, 0x5B9B, 0xA97C, 0x5C1A, 0xA97D, 0x5C48, + 0xA97E, 0x5C45, 0xA9A1, 0x5C46, 0xA9A2, 0x5CB7, 0xA9A3, 0x5CA1, + 0xA9A4, 0x5CB8, 0xA9A5, 0x5CA9, 0xA9A6, 0x5CAB, 0xA9A7, 0x5CB1, + 0xA9A8, 0x5CB3, 0xA9A9, 0x5E18, 0xA9AA, 0x5E1A, 0xA9AB, 0x5E16, + 0xA9AC, 0x5E15, 0xA9AD, 0x5E1B, 0xA9AE, 0x5E11, 0xA9AF, 0x5E78, + 0xA9B0, 0x5E9A, 0xA9B1, 0x5E97, 0xA9B2, 0x5E9C, 0xA9B3, 0x5E95, + 0xA9B4, 0x5E96, 0xA9B5, 0x5EF6, 0xA9B6, 0x5F26, 0xA9B7, 0x5F27, + 0xA9B8, 0x5F29, 0xA9B9, 0x5F80, 0xA9BA, 0x5F81, 0xA9BB, 0x5F7F, + 0xA9BC, 0x5F7C, 0xA9BD, 0x5FDD, 0xA9BE, 0x5FE0, 0xA9BF, 0x5FFD, + 0xA9C0, 0x5FF5, 0xA9C1, 0x5FFF, 0xA9C2, 0x600F, 0xA9C3, 0x6014, + 0xA9C4, 0x602F, 0xA9C5, 0x6035, 0xA9C6, 0x6016, 0xA9C7, 0x602A, + 0xA9C8, 0x6015, 0xA9C9, 0x6021, 0xA9CA, 0x6027, 0xA9CB, 0x6029, + 0xA9CC, 0x602B, 0xA9CD, 0x601B, 0xA9CE, 0x6216, 0xA9CF, 0x6215, + 0xA9D0, 0x623F, 0xA9D1, 0x623E, 0xA9D2, 0x6240, 0xA9D3, 0x627F, + 0xA9D4, 0x62C9, 0xA9D5, 0x62CC, 0xA9D6, 0x62C4, 0xA9D7, 0x62BF, + 0xA9D8, 0x62C2, 0xA9D9, 0x62B9, 0xA9DA, 0x62D2, 0xA9DB, 0x62DB, + 0xA9DC, 0x62AB, 0xA9DD, 0x62D3, 0xA9DE, 0x62D4, 0xA9DF, 0x62CB, + 0xA9E0, 0x62C8, 0xA9E1, 0x62A8, 0xA9E2, 0x62BD, 0xA9E3, 0x62BC, + 0xA9E4, 0x62D0, 0xA9E5, 0x62D9, 0xA9E6, 0x62C7, 0xA9E7, 0x62CD, + 0xA9E8, 0x62B5, 0xA9E9, 0x62DA, 0xA9EA, 0x62B1, 0xA9EB, 0x62D8, + 0xA9EC, 0x62D6, 0xA9ED, 0x62D7, 0xA9EE, 0x62C6, 0xA9EF, 0x62AC, + 0xA9F0, 0x62CE, 0xA9F1, 0x653E, 0xA9F2, 0x65A7, 0xA9F3, 0x65BC, + 0xA9F4, 0x65FA, 0xA9F5, 0x6614, 0xA9F6, 0x6613, 0xA9F7, 0x660C, + 0xA9F8, 0x6606, 0xA9F9, 0x6602, 0xA9FA, 0x660E, 0xA9FB, 0x6600, + 0xA9FC, 0x660F, 0xA9FD, 0x6615, 0xA9FE, 0x660A, 0xAA40, 0x6607, + 0xAA41, 0x670D, 0xAA42, 0x670B, 0xAA43, 0x676D, 0xAA44, 0x678B, + 0xAA45, 0x6795, 0xAA46, 0x6771, 0xAA47, 0x679C, 0xAA48, 0x6773, + 0xAA49, 0x6777, 0xAA4A, 0x6787, 0xAA4B, 0x679D, 0xAA4C, 0x6797, + 0xAA4D, 0x676F, 0xAA4E, 0x6770, 0xAA4F, 0x677F, 0xAA50, 0x6789, + 0xAA51, 0x677E, 0xAA52, 0x6790, 0xAA53, 0x6775, 0xAA54, 0x679A, + 0xAA55, 0x6793, 0xAA56, 0x677C, 0xAA57, 0x676A, 0xAA58, 0x6772, + 0xAA59, 0x6B23, 0xAA5A, 0x6B66, 0xAA5B, 0x6B67, 0xAA5C, 0x6B7F, + 0xAA5D, 0x6C13, 0xAA5E, 0x6C1B, 0xAA5F, 0x6CE3, 0xAA60, 0x6CE8, + 0xAA61, 0x6CF3, 0xAA62, 0x6CB1, 0xAA63, 0x6CCC, 0xAA64, 0x6CE5, + 0xAA65, 0x6CB3, 0xAA66, 0x6CBD, 0xAA67, 0x6CBE, 0xAA68, 0x6CBC, + 0xAA69, 0x6CE2, 0xAA6A, 0x6CAB, 0xAA6B, 0x6CD5, 0xAA6C, 0x6CD3, + 0xAA6D, 0x6CB8, 0xAA6E, 0x6CC4, 0xAA6F, 0x6CB9, 0xAA70, 0x6CC1, + 0xAA71, 0x6CAE, 0xAA72, 0x6CD7, 0xAA73, 0x6CC5, 0xAA74, 0x6CF1, + 0xAA75, 0x6CBF, 0xAA76, 0x6CBB, 0xAA77, 0x6CE1, 0xAA78, 0x6CDB, + 0xAA79, 0x6CCA, 0xAA7A, 0x6CAC, 0xAA7B, 0x6CEF, 0xAA7C, 0x6CDC, + 0xAA7D, 0x6CD6, 0xAA7E, 0x6CE0, 0xAAA1, 0x7095, 0xAAA2, 0x708E, + 0xAAA3, 0x7092, 0xAAA4, 0x708A, 0xAAA5, 0x7099, 0xAAA6, 0x722C, + 0xAAA7, 0x722D, 0xAAA8, 0x7238, 0xAAA9, 0x7248, 0xAAAA, 0x7267, + 0xAAAB, 0x7269, 0xAAAC, 0x72C0, 0xAAAD, 0x72CE, 0xAAAE, 0x72D9, + 0xAAAF, 0x72D7, 0xAAB0, 0x72D0, 0xAAB1, 0x73A9, 0xAAB2, 0x73A8, + 0xAAB3, 0x739F, 0xAAB4, 0x73AB, 0xAAB5, 0x73A5, 0xAAB6, 0x753D, + 0xAAB7, 0x759D, 0xAAB8, 0x7599, 0xAAB9, 0x759A, 0xAABA, 0x7684, + 0xAABB, 0x76C2, 0xAABC, 0x76F2, 0xAABD, 0x76F4, 0xAABE, 0x77E5, + 0xAABF, 0x77FD, 0xAAC0, 0x793E, 0xAAC1, 0x7940, 0xAAC2, 0x7941, + 0xAAC3, 0x79C9, 0xAAC4, 0x79C8, 0xAAC5, 0x7A7A, 0xAAC6, 0x7A79, + 0xAAC7, 0x7AFA, 0xAAC8, 0x7CFE, 0xAAC9, 0x7F54, 0xAACA, 0x7F8C, + 0xAACB, 0x7F8B, 0xAACC, 0x8005, 0xAACD, 0x80BA, 0xAACE, 0x80A5, + 0xAACF, 0x80A2, 0xAAD0, 0x80B1, 0xAAD1, 0x80A1, 0xAAD2, 0x80AB, + 0xAAD3, 0x80A9, 0xAAD4, 0x80B4, 0xAAD5, 0x80AA, 0xAAD6, 0x80AF, + 0xAAD7, 0x81E5, 0xAAD8, 0x81FE, 0xAAD9, 0x820D, 0xAADA, 0x82B3, + 0xAADB, 0x829D, 0xAADC, 0x8299, 0xAADD, 0x82AD, 0xAADE, 0x82BD, + 0xAADF, 0x829F, 0xAAE0, 0x82B9, 0xAAE1, 0x82B1, 0xAAE2, 0x82AC, + 0xAAE3, 0x82A5, 0xAAE4, 0x82AF, 0xAAE5, 0x82B8, 0xAAE6, 0x82A3, + 0xAAE7, 0x82B0, 0xAAE8, 0x82BE, 0xAAE9, 0x82B7, 0xAAEA, 0x864E, + 0xAAEB, 0x8671, 0xAAEC, 0x521D, 0xAAED, 0x8868, 0xAAEE, 0x8ECB, + 0xAAEF, 0x8FCE, 0xAAF0, 0x8FD4, 0xAAF1, 0x8FD1, 0xAAF2, 0x90B5, + 0xAAF3, 0x90B8, 0xAAF4, 0x90B1, 0xAAF5, 0x90B6, 0xAAF6, 0x91C7, + 0xAAF7, 0x91D1, 0xAAF8, 0x9577, 0xAAF9, 0x9580, 0xAAFA, 0x961C, + 0xAAFB, 0x9640, 0xAAFC, 0x963F, 0xAAFD, 0x963B, 0xAAFE, 0x9644, + 0xAB40, 0x9642, 0xAB41, 0x96B9, 0xAB42, 0x96E8, 0xAB43, 0x9752, + 0xAB44, 0x975E, 0xAB45, 0x4E9F, 0xAB46, 0x4EAD, 0xAB47, 0x4EAE, + 0xAB48, 0x4FE1, 0xAB49, 0x4FB5, 0xAB4A, 0x4FAF, 0xAB4B, 0x4FBF, + 0xAB4C, 0x4FE0, 0xAB4D, 0x4FD1, 0xAB4E, 0x4FCF, 0xAB4F, 0x4FDD, + 0xAB50, 0x4FC3, 0xAB51, 0x4FB6, 0xAB52, 0x4FD8, 0xAB53, 0x4FDF, + 0xAB54, 0x4FCA, 0xAB55, 0x4FD7, 0xAB56, 0x4FAE, 0xAB57, 0x4FD0, + 0xAB58, 0x4FC4, 0xAB59, 0x4FC2, 0xAB5A, 0x4FDA, 0xAB5B, 0x4FCE, + 0xAB5C, 0x4FDE, 0xAB5D, 0x4FB7, 0xAB5E, 0x5157, 0xAB5F, 0x5192, + 0xAB60, 0x5191, 0xAB61, 0x51A0, 0xAB62, 0x524E, 0xAB63, 0x5243, + 0xAB64, 0x524A, 0xAB65, 0x524D, 0xAB66, 0x524C, 0xAB67, 0x524B, + 0xAB68, 0x5247, 0xAB69, 0x52C7, 0xAB6A, 0x52C9, 0xAB6B, 0x52C3, + 0xAB6C, 0x52C1, 0xAB6D, 0x530D, 0xAB6E, 0x5357, 0xAB6F, 0x537B, + 0xAB70, 0x539A, 0xAB71, 0x53DB, 0xAB72, 0x54AC, 0xAB73, 0x54C0, + 0xAB74, 0x54A8, 0xAB75, 0x54CE, 0xAB76, 0x54C9, 0xAB77, 0x54B8, + 0xAB78, 0x54A6, 0xAB79, 0x54B3, 0xAB7A, 0x54C7, 0xAB7B, 0x54C2, + 0xAB7C, 0x54BD, 0xAB7D, 0x54AA, 0xAB7E, 0x54C1, 0xABA1, 0x54C4, + 0xABA2, 0x54C8, 0xABA3, 0x54AF, 0xABA4, 0x54AB, 0xABA5, 0x54B1, + 0xABA6, 0x54BB, 0xABA7, 0x54A9, 0xABA8, 0x54A7, 0xABA9, 0x54BF, + 0xABAA, 0x56FF, 0xABAB, 0x5782, 0xABAC, 0x578B, 0xABAD, 0x57A0, + 0xABAE, 0x57A3, 0xABAF, 0x57A2, 0xABB0, 0x57CE, 0xABB1, 0x57AE, + 0xABB2, 0x5793, 0xABB3, 0x5955, 0xABB4, 0x5951, 0xABB5, 0x594F, + 0xABB6, 0x594E, 0xABB7, 0x5950, 0xABB8, 0x59DC, 0xABB9, 0x59D8, + 0xABBA, 0x59FF, 0xABBB, 0x59E3, 0xABBC, 0x59E8, 0xABBD, 0x5A03, + 0xABBE, 0x59E5, 0xABBF, 0x59EA, 0xABC0, 0x59DA, 0xABC1, 0x59E6, + 0xABC2, 0x5A01, 0xABC3, 0x59FB, 0xABC4, 0x5B69, 0xABC5, 0x5BA3, + 0xABC6, 0x5BA6, 0xABC7, 0x5BA4, 0xABC8, 0x5BA2, 0xABC9, 0x5BA5, + 0xABCA, 0x5C01, 0xABCB, 0x5C4E, 0xABCC, 0x5C4F, 0xABCD, 0x5C4D, + 0xABCE, 0x5C4B, 0xABCF, 0x5CD9, 0xABD0, 0x5CD2, 0xABD1, 0x5DF7, + 0xABD2, 0x5E1D, 0xABD3, 0x5E25, 0xABD4, 0x5E1F, 0xABD5, 0x5E7D, + 0xABD6, 0x5EA0, 0xABD7, 0x5EA6, 0xABD8, 0x5EFA, 0xABD9, 0x5F08, + 0xABDA, 0x5F2D, 0xABDB, 0x5F65, 0xABDC, 0x5F88, 0xABDD, 0x5F85, + 0xABDE, 0x5F8A, 0xABDF, 0x5F8B, 0xABE0, 0x5F87, 0xABE1, 0x5F8C, + 0xABE2, 0x5F89, 0xABE3, 0x6012, 0xABE4, 0x601D, 0xABE5, 0x6020, + 0xABE6, 0x6025, 0xABE7, 0x600E, 0xABE8, 0x6028, 0xABE9, 0x604D, + 0xABEA, 0x6070, 0xABEB, 0x6068, 0xABEC, 0x6062, 0xABED, 0x6046, + 0xABEE, 0x6043, 0xABEF, 0x606C, 0xABF0, 0x606B, 0xABF1, 0x606A, + 0xABF2, 0x6064, 0xABF3, 0x6241, 0xABF4, 0x62DC, 0xABF5, 0x6316, + 0xABF6, 0x6309, 0xABF7, 0x62FC, 0xABF8, 0x62ED, 0xABF9, 0x6301, + 0xABFA, 0x62EE, 0xABFB, 0x62FD, 0xABFC, 0x6307, 0xABFD, 0x62F1, + 0xABFE, 0x62F7, 0xAC40, 0x62EF, 0xAC41, 0x62EC, 0xAC42, 0x62FE, + 0xAC43, 0x62F4, 0xAC44, 0x6311, 0xAC45, 0x6302, 0xAC46, 0x653F, + 0xAC47, 0x6545, 0xAC48, 0x65AB, 0xAC49, 0x65BD, 0xAC4A, 0x65E2, + 0xAC4B, 0x6625, 0xAC4C, 0x662D, 0xAC4D, 0x6620, 0xAC4E, 0x6627, + 0xAC4F, 0x662F, 0xAC50, 0x661F, 0xAC51, 0x6628, 0xAC52, 0x6631, + 0xAC53, 0x6624, 0xAC54, 0x66F7, 0xAC55, 0x67FF, 0xAC56, 0x67D3, + 0xAC57, 0x67F1, 0xAC58, 0x67D4, 0xAC59, 0x67D0, 0xAC5A, 0x67EC, + 0xAC5B, 0x67B6, 0xAC5C, 0x67AF, 0xAC5D, 0x67F5, 0xAC5E, 0x67E9, + 0xAC5F, 0x67EF, 0xAC60, 0x67C4, 0xAC61, 0x67D1, 0xAC62, 0x67B4, + 0xAC63, 0x67DA, 0xAC64, 0x67E5, 0xAC65, 0x67B8, 0xAC66, 0x67CF, + 0xAC67, 0x67DE, 0xAC68, 0x67F3, 0xAC69, 0x67B0, 0xAC6A, 0x67D9, + 0xAC6B, 0x67E2, 0xAC6C, 0x67DD, 0xAC6D, 0x67D2, 0xAC6E, 0x6B6A, + 0xAC6F, 0x6B83, 0xAC70, 0x6B86, 0xAC71, 0x6BB5, 0xAC72, 0x6BD2, + 0xAC73, 0x6BD7, 0xAC74, 0x6C1F, 0xAC75, 0x6CC9, 0xAC76, 0x6D0B, + 0xAC77, 0x6D32, 0xAC78, 0x6D2A, 0xAC79, 0x6D41, 0xAC7A, 0x6D25, + 0xAC7B, 0x6D0C, 0xAC7C, 0x6D31, 0xAC7D, 0x6D1E, 0xAC7E, 0x6D17, + 0xACA1, 0x6D3B, 0xACA2, 0x6D3D, 0xACA3, 0x6D3E, 0xACA4, 0x6D36, + 0xACA5, 0x6D1B, 0xACA6, 0x6CF5, 0xACA7, 0x6D39, 0xACA8, 0x6D27, + 0xACA9, 0x6D38, 0xACAA, 0x6D29, 0xACAB, 0x6D2E, 0xACAC, 0x6D35, + 0xACAD, 0x6D0E, 0xACAE, 0x6D2B, 0xACAF, 0x70AB, 0xACB0, 0x70BA, + 0xACB1, 0x70B3, 0xACB2, 0x70AC, 0xACB3, 0x70AF, 0xACB4, 0x70AD, + 0xACB5, 0x70B8, 0xACB6, 0x70AE, 0xACB7, 0x70A4, 0xACB8, 0x7230, + 0xACB9, 0x7272, 0xACBA, 0x726F, 0xACBB, 0x7274, 0xACBC, 0x72E9, + 0xACBD, 0x72E0, 0xACBE, 0x72E1, 0xACBF, 0x73B7, 0xACC0, 0x73CA, + 0xACC1, 0x73BB, 0xACC2, 0x73B2, 0xACC3, 0x73CD, 0xACC4, 0x73C0, + 0xACC5, 0x73B3, 0xACC6, 0x751A, 0xACC7, 0x752D, 0xACC8, 0x754F, + 0xACC9, 0x754C, 0xACCA, 0x754E, 0xACCB, 0x754B, 0xACCC, 0x75AB, + 0xACCD, 0x75A4, 0xACCE, 0x75A5, 0xACCF, 0x75A2, 0xACD0, 0x75A3, + 0xACD1, 0x7678, 0xACD2, 0x7686, 0xACD3, 0x7687, 0xACD4, 0x7688, + 0xACD5, 0x76C8, 0xACD6, 0x76C6, 0xACD7, 0x76C3, 0xACD8, 0x76C5, + 0xACD9, 0x7701, 0xACDA, 0x76F9, 0xACDB, 0x76F8, 0xACDC, 0x7709, + 0xACDD, 0x770B, 0xACDE, 0x76FE, 0xACDF, 0x76FC, 0xACE0, 0x7707, + 0xACE1, 0x77DC, 0xACE2, 0x7802, 0xACE3, 0x7814, 0xACE4, 0x780C, + 0xACE5, 0x780D, 0xACE6, 0x7946, 0xACE7, 0x7949, 0xACE8, 0x7948, + 0xACE9, 0x7947, 0xACEA, 0x79B9, 0xACEB, 0x79BA, 0xACEC, 0x79D1, + 0xACED, 0x79D2, 0xACEE, 0x79CB, 0xACEF, 0x7A7F, 0xACF0, 0x7A81, + 0xACF1, 0x7AFF, 0xACF2, 0x7AFD, 0xACF3, 0x7C7D, 0xACF4, 0x7D02, + 0xACF5, 0x7D05, 0xACF6, 0x7D00, 0xACF7, 0x7D09, 0xACF8, 0x7D07, + 0xACF9, 0x7D04, 0xACFA, 0x7D06, 0xACFB, 0x7F38, 0xACFC, 0x7F8E, + 0xACFD, 0x7FBF, 0xACFE, 0x8004, 0xAD40, 0x8010, 0xAD41, 0x800D, + 0xAD42, 0x8011, 0xAD43, 0x8036, 0xAD44, 0x80D6, 0xAD45, 0x80E5, + 0xAD46, 0x80DA, 0xAD47, 0x80C3, 0xAD48, 0x80C4, 0xAD49, 0x80CC, + 0xAD4A, 0x80E1, 0xAD4B, 0x80DB, 0xAD4C, 0x80CE, 0xAD4D, 0x80DE, + 0xAD4E, 0x80E4, 0xAD4F, 0x80DD, 0xAD50, 0x81F4, 0xAD51, 0x8222, + 0xAD52, 0x82E7, 0xAD53, 0x8303, 0xAD54, 0x8305, 0xAD55, 0x82E3, + 0xAD56, 0x82DB, 0xAD57, 0x82E6, 0xAD58, 0x8304, 0xAD59, 0x82E5, + 0xAD5A, 0x8302, 0xAD5B, 0x8309, 0xAD5C, 0x82D2, 0xAD5D, 0x82D7, + 0xAD5E, 0x82F1, 0xAD5F, 0x8301, 0xAD60, 0x82DC, 0xAD61, 0x82D4, + 0xAD62, 0x82D1, 0xAD63, 0x82DE, 0xAD64, 0x82D3, 0xAD65, 0x82DF, + 0xAD66, 0x82EF, 0xAD67, 0x8306, 0xAD68, 0x8650, 0xAD69, 0x8679, + 0xAD6A, 0x867B, 0xAD6B, 0x867A, 0xAD6C, 0x884D, 0xAD6D, 0x886B, + 0xAD6E, 0x8981, 0xAD6F, 0x89D4, 0xAD70, 0x8A08, 0xAD71, 0x8A02, + 0xAD72, 0x8A03, 0xAD73, 0x8C9E, 0xAD74, 0x8CA0, 0xAD75, 0x8D74, + 0xAD76, 0x8D73, 0xAD77, 0x8DB4, 0xAD78, 0x8ECD, 0xAD79, 0x8ECC, + 0xAD7A, 0x8FF0, 0xAD7B, 0x8FE6, 0xAD7C, 0x8FE2, 0xAD7D, 0x8FEA, + 0xAD7E, 0x8FE5, 0xADA1, 0x8FED, 0xADA2, 0x8FEB, 0xADA3, 0x8FE4, + 0xADA4, 0x8FE8, 0xADA5, 0x90CA, 0xADA6, 0x90CE, 0xADA7, 0x90C1, + 0xADA8, 0x90C3, 0xADA9, 0x914B, 0xADAA, 0x914A, 0xADAB, 0x91CD, + 0xADAC, 0x9582, 0xADAD, 0x9650, 0xADAE, 0x964B, 0xADAF, 0x964C, + 0xADB0, 0x964D, 0xADB1, 0x9762, 0xADB2, 0x9769, 0xADB3, 0x97CB, + 0xADB4, 0x97ED, 0xADB5, 0x97F3, 0xADB6, 0x9801, 0xADB7, 0x98A8, + 0xADB8, 0x98DB, 0xADB9, 0x98DF, 0xADBA, 0x9996, 0xADBB, 0x9999, + 0xADBC, 0x4E58, 0xADBD, 0x4EB3, 0xADBE, 0x500C, 0xADBF, 0x500D, + 0xADC0, 0x5023, 0xADC1, 0x4FEF, 0xADC2, 0x5026, 0xADC3, 0x5025, + 0xADC4, 0x4FF8, 0xADC5, 0x5029, 0xADC6, 0x5016, 0xADC7, 0x5006, + 0xADC8, 0x503C, 0xADC9, 0x501F, 0xADCA, 0x501A, 0xADCB, 0x5012, + 0xADCC, 0x5011, 0xADCD, 0x4FFA, 0xADCE, 0x5000, 0xADCF, 0x5014, + 0xADD0, 0x5028, 0xADD1, 0x4FF1, 0xADD2, 0x5021, 0xADD3, 0x500B, + 0xADD4, 0x5019, 0xADD5, 0x5018, 0xADD6, 0x4FF3, 0xADD7, 0x4FEE, + 0xADD8, 0x502D, 0xADD9, 0x502A, 0xADDA, 0x4FFE, 0xADDB, 0x502B, + 0xADDC, 0x5009, 0xADDD, 0x517C, 0xADDE, 0x51A4, 0xADDF, 0x51A5, + 0xADE0, 0x51A2, 0xADE1, 0x51CD, 0xADE2, 0x51CC, 0xADE3, 0x51C6, + 0xADE4, 0x51CB, 0xADE5, 0x5256, 0xADE6, 0x525C, 0xADE7, 0x5254, + 0xADE8, 0x525B, 0xADE9, 0x525D, 0xADEA, 0x532A, 0xADEB, 0x537F, + 0xADEC, 0x539F, 0xADED, 0x539D, 0xADEE, 0x53DF, 0xADEF, 0x54E8, + 0xADF0, 0x5510, 0xADF1, 0x5501, 0xADF2, 0x5537, 0xADF3, 0x54FC, + 0xADF4, 0x54E5, 0xADF5, 0x54F2, 0xADF6, 0x5506, 0xADF7, 0x54FA, + 0xADF8, 0x5514, 0xADF9, 0x54E9, 0xADFA, 0x54ED, 0xADFB, 0x54E1, + 0xADFC, 0x5509, 0xADFD, 0x54EE, 0xADFE, 0x54EA, 0xAE40, 0x54E6, + 0xAE41, 0x5527, 0xAE42, 0x5507, 0xAE43, 0x54FD, 0xAE44, 0x550F, + 0xAE45, 0x5703, 0xAE46, 0x5704, 0xAE47, 0x57C2, 0xAE48, 0x57D4, + 0xAE49, 0x57CB, 0xAE4A, 0x57C3, 0xAE4B, 0x5809, 0xAE4C, 0x590F, + 0xAE4D, 0x5957, 0xAE4E, 0x5958, 0xAE4F, 0x595A, 0xAE50, 0x5A11, + 0xAE51, 0x5A18, 0xAE52, 0x5A1C, 0xAE53, 0x5A1F, 0xAE54, 0x5A1B, + 0xAE55, 0x5A13, 0xAE56, 0x59EC, 0xAE57, 0x5A20, 0xAE58, 0x5A23, + 0xAE59, 0x5A29, 0xAE5A, 0x5A25, 0xAE5B, 0x5A0C, 0xAE5C, 0x5A09, + 0xAE5D, 0x5B6B, 0xAE5E, 0x5C58, 0xAE5F, 0x5BB0, 0xAE60, 0x5BB3, + 0xAE61, 0x5BB6, 0xAE62, 0x5BB4, 0xAE63, 0x5BAE, 0xAE64, 0x5BB5, + 0xAE65, 0x5BB9, 0xAE66, 0x5BB8, 0xAE67, 0x5C04, 0xAE68, 0x5C51, + 0xAE69, 0x5C55, 0xAE6A, 0x5C50, 0xAE6B, 0x5CED, 0xAE6C, 0x5CFD, + 0xAE6D, 0x5CFB, 0xAE6E, 0x5CEA, 0xAE6F, 0x5CE8, 0xAE70, 0x5CF0, + 0xAE71, 0x5CF6, 0xAE72, 0x5D01, 0xAE73, 0x5CF4, 0xAE74, 0x5DEE, + 0xAE75, 0x5E2D, 0xAE76, 0x5E2B, 0xAE77, 0x5EAB, 0xAE78, 0x5EAD, + 0xAE79, 0x5EA7, 0xAE7A, 0x5F31, 0xAE7B, 0x5F92, 0xAE7C, 0x5F91, + 0xAE7D, 0x5F90, 0xAE7E, 0x6059, 0xAEA1, 0x6063, 0xAEA2, 0x6065, + 0xAEA3, 0x6050, 0xAEA4, 0x6055, 0xAEA5, 0x606D, 0xAEA6, 0x6069, + 0xAEA7, 0x606F, 0xAEA8, 0x6084, 0xAEA9, 0x609F, 0xAEAA, 0x609A, + 0xAEAB, 0x608D, 0xAEAC, 0x6094, 0xAEAD, 0x608C, 0xAEAE, 0x6085, + 0xAEAF, 0x6096, 0xAEB0, 0x6247, 0xAEB1, 0x62F3, 0xAEB2, 0x6308, + 0xAEB3, 0x62FF, 0xAEB4, 0x634E, 0xAEB5, 0x633E, 0xAEB6, 0x632F, + 0xAEB7, 0x6355, 0xAEB8, 0x6342, 0xAEB9, 0x6346, 0xAEBA, 0x634F, + 0xAEBB, 0x6349, 0xAEBC, 0x633A, 0xAEBD, 0x6350, 0xAEBE, 0x633D, + 0xAEBF, 0x632A, 0xAEC0, 0x632B, 0xAEC1, 0x6328, 0xAEC2, 0x634D, + 0xAEC3, 0x634C, 0xAEC4, 0x6548, 0xAEC5, 0x6549, 0xAEC6, 0x6599, + 0xAEC7, 0x65C1, 0xAEC8, 0x65C5, 0xAEC9, 0x6642, 0xAECA, 0x6649, + 0xAECB, 0x664F, 0xAECC, 0x6643, 0xAECD, 0x6652, 0xAECE, 0x664C, + 0xAECF, 0x6645, 0xAED0, 0x6641, 0xAED1, 0x66F8, 0xAED2, 0x6714, + 0xAED3, 0x6715, 0xAED4, 0x6717, 0xAED5, 0x6821, 0xAED6, 0x6838, + 0xAED7, 0x6848, 0xAED8, 0x6846, 0xAED9, 0x6853, 0xAEDA, 0x6839, + 0xAEDB, 0x6842, 0xAEDC, 0x6854, 0xAEDD, 0x6829, 0xAEDE, 0x68B3, + 0xAEDF, 0x6817, 0xAEE0, 0x684C, 0xAEE1, 0x6851, 0xAEE2, 0x683D, + 0xAEE3, 0x67F4, 0xAEE4, 0x6850, 0xAEE5, 0x6840, 0xAEE6, 0x683C, + 0xAEE7, 0x6843, 0xAEE8, 0x682A, 0xAEE9, 0x6845, 0xAEEA, 0x6813, + 0xAEEB, 0x6818, 0xAEEC, 0x6841, 0xAEED, 0x6B8A, 0xAEEE, 0x6B89, + 0xAEEF, 0x6BB7, 0xAEF0, 0x6C23, 0xAEF1, 0x6C27, 0xAEF2, 0x6C28, + 0xAEF3, 0x6C26, 0xAEF4, 0x6C24, 0xAEF5, 0x6CF0, 0xAEF6, 0x6D6A, + 0xAEF7, 0x6D95, 0xAEF8, 0x6D88, 0xAEF9, 0x6D87, 0xAEFA, 0x6D66, + 0xAEFB, 0x6D78, 0xAEFC, 0x6D77, 0xAEFD, 0x6D59, 0xAEFE, 0x6D93, + 0xAF40, 0x6D6C, 0xAF41, 0x6D89, 0xAF42, 0x6D6E, 0xAF43, 0x6D5A, + 0xAF44, 0x6D74, 0xAF45, 0x6D69, 0xAF46, 0x6D8C, 0xAF47, 0x6D8A, + 0xAF48, 0x6D79, 0xAF49, 0x6D85, 0xAF4A, 0x6D65, 0xAF4B, 0x6D94, + 0xAF4C, 0x70CA, 0xAF4D, 0x70D8, 0xAF4E, 0x70E4, 0xAF4F, 0x70D9, + 0xAF50, 0x70C8, 0xAF51, 0x70CF, 0xAF52, 0x7239, 0xAF53, 0x7279, + 0xAF54, 0x72FC, 0xAF55, 0x72F9, 0xAF56, 0x72FD, 0xAF57, 0x72F8, + 0xAF58, 0x72F7, 0xAF59, 0x7386, 0xAF5A, 0x73ED, 0xAF5B, 0x7409, + 0xAF5C, 0x73EE, 0xAF5D, 0x73E0, 0xAF5E, 0x73EA, 0xAF5F, 0x73DE, + 0xAF60, 0x7554, 0xAF61, 0x755D, 0xAF62, 0x755C, 0xAF63, 0x755A, + 0xAF64, 0x7559, 0xAF65, 0x75BE, 0xAF66, 0x75C5, 0xAF67, 0x75C7, + 0xAF68, 0x75B2, 0xAF69, 0x75B3, 0xAF6A, 0x75BD, 0xAF6B, 0x75BC, + 0xAF6C, 0x75B9, 0xAF6D, 0x75C2, 0xAF6E, 0x75B8, 0xAF6F, 0x768B, + 0xAF70, 0x76B0, 0xAF71, 0x76CA, 0xAF72, 0x76CD, 0xAF73, 0x76CE, + 0xAF74, 0x7729, 0xAF75, 0x771F, 0xAF76, 0x7720, 0xAF77, 0x7728, + 0xAF78, 0x77E9, 0xAF79, 0x7830, 0xAF7A, 0x7827, 0xAF7B, 0x7838, + 0xAF7C, 0x781D, 0xAF7D, 0x7834, 0xAF7E, 0x7837, 0xAFA1, 0x7825, + 0xAFA2, 0x782D, 0xAFA3, 0x7820, 0xAFA4, 0x781F, 0xAFA5, 0x7832, + 0xAFA6, 0x7955, 0xAFA7, 0x7950, 0xAFA8, 0x7960, 0xAFA9, 0x795F, + 0xAFAA, 0x7956, 0xAFAB, 0x795E, 0xAFAC, 0x795D, 0xAFAD, 0x7957, + 0xAFAE, 0x795A, 0xAFAF, 0x79E4, 0xAFB0, 0x79E3, 0xAFB1, 0x79E7, + 0xAFB2, 0x79DF, 0xAFB3, 0x79E6, 0xAFB4, 0x79E9, 0xAFB5, 0x79D8, + 0xAFB6, 0x7A84, 0xAFB7, 0x7A88, 0xAFB8, 0x7AD9, 0xAFB9, 0x7B06, + 0xAFBA, 0x7B11, 0xAFBB, 0x7C89, 0xAFBC, 0x7D21, 0xAFBD, 0x7D17, + 0xAFBE, 0x7D0B, 0xAFBF, 0x7D0A, 0xAFC0, 0x7D20, 0xAFC1, 0x7D22, + 0xAFC2, 0x7D14, 0xAFC3, 0x7D10, 0xAFC4, 0x7D15, 0xAFC5, 0x7D1A, + 0xAFC6, 0x7D1C, 0xAFC7, 0x7D0D, 0xAFC8, 0x7D19, 0xAFC9, 0x7D1B, + 0xAFCA, 0x7F3A, 0xAFCB, 0x7F5F, 0xAFCC, 0x7F94, 0xAFCD, 0x7FC5, + 0xAFCE, 0x7FC1, 0xAFCF, 0x8006, 0xAFD0, 0x8018, 0xAFD1, 0x8015, + 0xAFD2, 0x8019, 0xAFD3, 0x8017, 0xAFD4, 0x803D, 0xAFD5, 0x803F, + 0xAFD6, 0x80F1, 0xAFD7, 0x8102, 0xAFD8, 0x80F0, 0xAFD9, 0x8105, + 0xAFDA, 0x80ED, 0xAFDB, 0x80F4, 0xAFDC, 0x8106, 0xAFDD, 0x80F8, + 0xAFDE, 0x80F3, 0xAFDF, 0x8108, 0xAFE0, 0x80FD, 0xAFE1, 0x810A, + 0xAFE2, 0x80FC, 0xAFE3, 0x80EF, 0xAFE4, 0x81ED, 0xAFE5, 0x81EC, + 0xAFE6, 0x8200, 0xAFE7, 0x8210, 0xAFE8, 0x822A, 0xAFE9, 0x822B, + 0xAFEA, 0x8228, 0xAFEB, 0x822C, 0xAFEC, 0x82BB, 0xAFED, 0x832B, + 0xAFEE, 0x8352, 0xAFEF, 0x8354, 0xAFF0, 0x834A, 0xAFF1, 0x8338, + 0xAFF2, 0x8350, 0xAFF3, 0x8349, 0xAFF4, 0x8335, 0xAFF5, 0x8334, + 0xAFF6, 0x834F, 0xAFF7, 0x8332, 0xAFF8, 0x8339, 0xAFF9, 0x8336, + 0xAFFA, 0x8317, 0xAFFB, 0x8340, 0xAFFC, 0x8331, 0xAFFD, 0x8328, + 0xAFFE, 0x8343, 0xB040, 0x8654, 0xB041, 0x868A, 0xB042, 0x86AA, + 0xB043, 0x8693, 0xB044, 0x86A4, 0xB045, 0x86A9, 0xB046, 0x868C, + 0xB047, 0x86A3, 0xB048, 0x869C, 0xB049, 0x8870, 0xB04A, 0x8877, + 0xB04B, 0x8881, 0xB04C, 0x8882, 0xB04D, 0x887D, 0xB04E, 0x8879, + 0xB04F, 0x8A18, 0xB050, 0x8A10, 0xB051, 0x8A0E, 0xB052, 0x8A0C, + 0xB053, 0x8A15, 0xB054, 0x8A0A, 0xB055, 0x8A17, 0xB056, 0x8A13, + 0xB057, 0x8A16, 0xB058, 0x8A0F, 0xB059, 0x8A11, 0xB05A, 0x8C48, + 0xB05B, 0x8C7A, 0xB05C, 0x8C79, 0xB05D, 0x8CA1, 0xB05E, 0x8CA2, + 0xB05F, 0x8D77, 0xB060, 0x8EAC, 0xB061, 0x8ED2, 0xB062, 0x8ED4, + 0xB063, 0x8ECF, 0xB064, 0x8FB1, 0xB065, 0x9001, 0xB066, 0x9006, + 0xB067, 0x8FF7, 0xB068, 0x9000, 0xB069, 0x8FFA, 0xB06A, 0x8FF4, + 0xB06B, 0x9003, 0xB06C, 0x8FFD, 0xB06D, 0x9005, 0xB06E, 0x8FF8, + 0xB06F, 0x9095, 0xB070, 0x90E1, 0xB071, 0x90DD, 0xB072, 0x90E2, + 0xB073, 0x9152, 0xB074, 0x914D, 0xB075, 0x914C, 0xB076, 0x91D8, + 0xB077, 0x91DD, 0xB078, 0x91D7, 0xB079, 0x91DC, 0xB07A, 0x91D9, + 0xB07B, 0x9583, 0xB07C, 0x9662, 0xB07D, 0x9663, 0xB07E, 0x9661, + 0xB0A1, 0x965B, 0xB0A2, 0x965D, 0xB0A3, 0x9664, 0xB0A4, 0x9658, + 0xB0A5, 0x965E, 0xB0A6, 0x96BB, 0xB0A7, 0x98E2, 0xB0A8, 0x99AC, + 0xB0A9, 0x9AA8, 0xB0AA, 0x9AD8, 0xB0AB, 0x9B25, 0xB0AC, 0x9B32, + 0xB0AD, 0x9B3C, 0xB0AE, 0x4E7E, 0xB0AF, 0x507A, 0xB0B0, 0x507D, + 0xB0B1, 0x505C, 0xB0B2, 0x5047, 0xB0B3, 0x5043, 0xB0B4, 0x504C, + 0xB0B5, 0x505A, 0xB0B6, 0x5049, 0xB0B7, 0x5065, 0xB0B8, 0x5076, + 0xB0B9, 0x504E, 0xB0BA, 0x5055, 0xB0BB, 0x5075, 0xB0BC, 0x5074, + 0xB0BD, 0x5077, 0xB0BE, 0x504F, 0xB0BF, 0x500F, 0xB0C0, 0x506F, + 0xB0C1, 0x506D, 0xB0C2, 0x515C, 0xB0C3, 0x5195, 0xB0C4, 0x51F0, + 0xB0C5, 0x526A, 0xB0C6, 0x526F, 0xB0C7, 0x52D2, 0xB0C8, 0x52D9, + 0xB0C9, 0x52D8, 0xB0CA, 0x52D5, 0xB0CB, 0x5310, 0xB0CC, 0x530F, + 0xB0CD, 0x5319, 0xB0CE, 0x533F, 0xB0CF, 0x5340, 0xB0D0, 0x533E, + 0xB0D1, 0x53C3, 0xB0D2, 0x66FC, 0xB0D3, 0x5546, 0xB0D4, 0x556A, + 0xB0D5, 0x5566, 0xB0D6, 0x5544, 0xB0D7, 0x555E, 0xB0D8, 0x5561, + 0xB0D9, 0x5543, 0xB0DA, 0x554A, 0xB0DB, 0x5531, 0xB0DC, 0x5556, + 0xB0DD, 0x554F, 0xB0DE, 0x5555, 0xB0DF, 0x552F, 0xB0E0, 0x5564, + 0xB0E1, 0x5538, 0xB0E2, 0x552E, 0xB0E3, 0x555C, 0xB0E4, 0x552C, + 0xB0E5, 0x5563, 0xB0E6, 0x5533, 0xB0E7, 0x5541, 0xB0E8, 0x5557, + 0xB0E9, 0x5708, 0xB0EA, 0x570B, 0xB0EB, 0x5709, 0xB0EC, 0x57DF, + 0xB0ED, 0x5805, 0xB0EE, 0x580A, 0xB0EF, 0x5806, 0xB0F0, 0x57E0, + 0xB0F1, 0x57E4, 0xB0F2, 0x57FA, 0xB0F3, 0x5802, 0xB0F4, 0x5835, + 0xB0F5, 0x57F7, 0xB0F6, 0x57F9, 0xB0F7, 0x5920, 0xB0F8, 0x5962, + 0xB0F9, 0x5A36, 0xB0FA, 0x5A41, 0xB0FB, 0x5A49, 0xB0FC, 0x5A66, + 0xB0FD, 0x5A6A, 0xB0FE, 0x5A40, 0xB140, 0x5A3C, 0xB141, 0x5A62, + 0xB142, 0x5A5A, 0xB143, 0x5A46, 0xB144, 0x5A4A, 0xB145, 0x5B70, + 0xB146, 0x5BC7, 0xB147, 0x5BC5, 0xB148, 0x5BC4, 0xB149, 0x5BC2, + 0xB14A, 0x5BBF, 0xB14B, 0x5BC6, 0xB14C, 0x5C09, 0xB14D, 0x5C08, + 0xB14E, 0x5C07, 0xB14F, 0x5C60, 0xB150, 0x5C5C, 0xB151, 0x5C5D, + 0xB152, 0x5D07, 0xB153, 0x5D06, 0xB154, 0x5D0E, 0xB155, 0x5D1B, + 0xB156, 0x5D16, 0xB157, 0x5D22, 0xB158, 0x5D11, 0xB159, 0x5D29, + 0xB15A, 0x5D14, 0xB15B, 0x5D19, 0xB15C, 0x5D24, 0xB15D, 0x5D27, + 0xB15E, 0x5D17, 0xB15F, 0x5DE2, 0xB160, 0x5E38, 0xB161, 0x5E36, + 0xB162, 0x5E33, 0xB163, 0x5E37, 0xB164, 0x5EB7, 0xB165, 0x5EB8, + 0xB166, 0x5EB6, 0xB167, 0x5EB5, 0xB168, 0x5EBE, 0xB169, 0x5F35, + 0xB16A, 0x5F37, 0xB16B, 0x5F57, 0xB16C, 0x5F6C, 0xB16D, 0x5F69, + 0xB16E, 0x5F6B, 0xB16F, 0x5F97, 0xB170, 0x5F99, 0xB171, 0x5F9E, + 0xB172, 0x5F98, 0xB173, 0x5FA1, 0xB174, 0x5FA0, 0xB175, 0x5F9C, + 0xB176, 0x607F, 0xB177, 0x60A3, 0xB178, 0x6089, 0xB179, 0x60A0, + 0xB17A, 0x60A8, 0xB17B, 0x60CB, 0xB17C, 0x60B4, 0xB17D, 0x60E6, + 0xB17E, 0x60BD, 0xB1A1, 0x60C5, 0xB1A2, 0x60BB, 0xB1A3, 0x60B5, + 0xB1A4, 0x60DC, 0xB1A5, 0x60BC, 0xB1A6, 0x60D8, 0xB1A7, 0x60D5, + 0xB1A8, 0x60C6, 0xB1A9, 0x60DF, 0xB1AA, 0x60B8, 0xB1AB, 0x60DA, + 0xB1AC, 0x60C7, 0xB1AD, 0x621A, 0xB1AE, 0x621B, 0xB1AF, 0x6248, + 0xB1B0, 0x63A0, 0xB1B1, 0x63A7, 0xB1B2, 0x6372, 0xB1B3, 0x6396, + 0xB1B4, 0x63A2, 0xB1B5, 0x63A5, 0xB1B6, 0x6377, 0xB1B7, 0x6367, + 0xB1B8, 0x6398, 0xB1B9, 0x63AA, 0xB1BA, 0x6371, 0xB1BB, 0x63A9, + 0xB1BC, 0x6389, 0xB1BD, 0x6383, 0xB1BE, 0x639B, 0xB1BF, 0x636B, + 0xB1C0, 0x63A8, 0xB1C1, 0x6384, 0xB1C2, 0x6388, 0xB1C3, 0x6399, + 0xB1C4, 0x63A1, 0xB1C5, 0x63AC, 0xB1C6, 0x6392, 0xB1C7, 0x638F, + 0xB1C8, 0x6380, 0xB1C9, 0x637B, 0xB1CA, 0x6369, 0xB1CB, 0x6368, + 0xB1CC, 0x637A, 0xB1CD, 0x655D, 0xB1CE, 0x6556, 0xB1CF, 0x6551, + 0xB1D0, 0x6559, 0xB1D1, 0x6557, 0xB1D2, 0x555F, 0xB1D3, 0x654F, + 0xB1D4, 0x6558, 0xB1D5, 0x6555, 0xB1D6, 0x6554, 0xB1D7, 0x659C, + 0xB1D8, 0x659B, 0xB1D9, 0x65AC, 0xB1DA, 0x65CF, 0xB1DB, 0x65CB, + 0xB1DC, 0x65CC, 0xB1DD, 0x65CE, 0xB1DE, 0x665D, 0xB1DF, 0x665A, + 0xB1E0, 0x6664, 0xB1E1, 0x6668, 0xB1E2, 0x6666, 0xB1E3, 0x665E, + 0xB1E4, 0x66F9, 0xB1E5, 0x52D7, 0xB1E6, 0x671B, 0xB1E7, 0x6881, + 0xB1E8, 0x68AF, 0xB1E9, 0x68A2, 0xB1EA, 0x6893, 0xB1EB, 0x68B5, + 0xB1EC, 0x687F, 0xB1ED, 0x6876, 0xB1EE, 0x68B1, 0xB1EF, 0x68A7, + 0xB1F0, 0x6897, 0xB1F1, 0x68B0, 0xB1F2, 0x6883, 0xB1F3, 0x68C4, + 0xB1F4, 0x68AD, 0xB1F5, 0x6886, 0xB1F6, 0x6885, 0xB1F7, 0x6894, + 0xB1F8, 0x689D, 0xB1F9, 0x68A8, 0xB1FA, 0x689F, 0xB1FB, 0x68A1, + 0xB1FC, 0x6882, 0xB1FD, 0x6B32, 0xB1FE, 0x6BBA, 0xB240, 0x6BEB, + 0xB241, 0x6BEC, 0xB242, 0x6C2B, 0xB243, 0x6D8E, 0xB244, 0x6DBC, + 0xB245, 0x6DF3, 0xB246, 0x6DD9, 0xB247, 0x6DB2, 0xB248, 0x6DE1, + 0xB249, 0x6DCC, 0xB24A, 0x6DE4, 0xB24B, 0x6DFB, 0xB24C, 0x6DFA, + 0xB24D, 0x6E05, 0xB24E, 0x6DC7, 0xB24F, 0x6DCB, 0xB250, 0x6DAF, + 0xB251, 0x6DD1, 0xB252, 0x6DAE, 0xB253, 0x6DDE, 0xB254, 0x6DF9, + 0xB255, 0x6DB8, 0xB256, 0x6DF7, 0xB257, 0x6DF5, 0xB258, 0x6DC5, + 0xB259, 0x6DD2, 0xB25A, 0x6E1A, 0xB25B, 0x6DB5, 0xB25C, 0x6DDA, + 0xB25D, 0x6DEB, 0xB25E, 0x6DD8, 0xB25F, 0x6DEA, 0xB260, 0x6DF1, + 0xB261, 0x6DEE, 0xB262, 0x6DE8, 0xB263, 0x6DC6, 0xB264, 0x6DC4, + 0xB265, 0x6DAA, 0xB266, 0x6DEC, 0xB267, 0x6DBF, 0xB268, 0x6DE6, + 0xB269, 0x70F9, 0xB26A, 0x7109, 0xB26B, 0x710A, 0xB26C, 0x70FD, + 0xB26D, 0x70EF, 0xB26E, 0x723D, 0xB26F, 0x727D, 0xB270, 0x7281, + 0xB271, 0x731C, 0xB272, 0x731B, 0xB273, 0x7316, 0xB274, 0x7313, + 0xB275, 0x7319, 0xB276, 0x7387, 0xB277, 0x7405, 0xB278, 0x740A, + 0xB279, 0x7403, 0xB27A, 0x7406, 0xB27B, 0x73FE, 0xB27C, 0x740D, + 0xB27D, 0x74E0, 0xB27E, 0x74F6, 0xB2A1, 0x74F7, 0xB2A2, 0x751C, + 0xB2A3, 0x7522, 0xB2A4, 0x7565, 0xB2A5, 0x7566, 0xB2A6, 0x7562, + 0xB2A7, 0x7570, 0xB2A8, 0x758F, 0xB2A9, 0x75D4, 0xB2AA, 0x75D5, + 0xB2AB, 0x75B5, 0xB2AC, 0x75CA, 0xB2AD, 0x75CD, 0xB2AE, 0x768E, + 0xB2AF, 0x76D4, 0xB2B0, 0x76D2, 0xB2B1, 0x76DB, 0xB2B2, 0x7737, + 0xB2B3, 0x773E, 0xB2B4, 0x773C, 0xB2B5, 0x7736, 0xB2B6, 0x7738, + 0xB2B7, 0x773A, 0xB2B8, 0x786B, 0xB2B9, 0x7843, 0xB2BA, 0x784E, + 0xB2BB, 0x7965, 0xB2BC, 0x7968, 0xB2BD, 0x796D, 0xB2BE, 0x79FB, + 0xB2BF, 0x7A92, 0xB2C0, 0x7A95, 0xB2C1, 0x7B20, 0xB2C2, 0x7B28, + 0xB2C3, 0x7B1B, 0xB2C4, 0x7B2C, 0xB2C5, 0x7B26, 0xB2C6, 0x7B19, + 0xB2C7, 0x7B1E, 0xB2C8, 0x7B2E, 0xB2C9, 0x7C92, 0xB2CA, 0x7C97, + 0xB2CB, 0x7C95, 0xB2CC, 0x7D46, 0xB2CD, 0x7D43, 0xB2CE, 0x7D71, + 0xB2CF, 0x7D2E, 0xB2D0, 0x7D39, 0xB2D1, 0x7D3C, 0xB2D2, 0x7D40, + 0xB2D3, 0x7D30, 0xB2D4, 0x7D33, 0xB2D5, 0x7D44, 0xB2D6, 0x7D2F, + 0xB2D7, 0x7D42, 0xB2D8, 0x7D32, 0xB2D9, 0x7D31, 0xB2DA, 0x7F3D, + 0xB2DB, 0x7F9E, 0xB2DC, 0x7F9A, 0xB2DD, 0x7FCC, 0xB2DE, 0x7FCE, + 0xB2DF, 0x7FD2, 0xB2E0, 0x801C, 0xB2E1, 0x804A, 0xB2E2, 0x8046, + 0xB2E3, 0x812F, 0xB2E4, 0x8116, 0xB2E5, 0x8123, 0xB2E6, 0x812B, + 0xB2E7, 0x8129, 0xB2E8, 0x8130, 0xB2E9, 0x8124, 0xB2EA, 0x8202, + 0xB2EB, 0x8235, 0xB2EC, 0x8237, 0xB2ED, 0x8236, 0xB2EE, 0x8239, + 0xB2EF, 0x838E, 0xB2F0, 0x839E, 0xB2F1, 0x8398, 0xB2F2, 0x8378, + 0xB2F3, 0x83A2, 0xB2F4, 0x8396, 0xB2F5, 0x83BD, 0xB2F6, 0x83AB, + 0xB2F7, 0x8392, 0xB2F8, 0x838A, 0xB2F9, 0x8393, 0xB2FA, 0x8389, + 0xB2FB, 0x83A0, 0xB2FC, 0x8377, 0xB2FD, 0x837B, 0xB2FE, 0x837C, + 0xB340, 0x8386, 0xB341, 0x83A7, 0xB342, 0x8655, 0xB343, 0x5F6A, + 0xB344, 0x86C7, 0xB345, 0x86C0, 0xB346, 0x86B6, 0xB347, 0x86C4, + 0xB348, 0x86B5, 0xB349, 0x86C6, 0xB34A, 0x86CB, 0xB34B, 0x86B1, + 0xB34C, 0x86AF, 0xB34D, 0x86C9, 0xB34E, 0x8853, 0xB34F, 0x889E, + 0xB350, 0x8888, 0xB351, 0x88AB, 0xB352, 0x8892, 0xB353, 0x8896, + 0xB354, 0x888D, 0xB355, 0x888B, 0xB356, 0x8993, 0xB357, 0x898F, + 0xB358, 0x8A2A, 0xB359, 0x8A1D, 0xB35A, 0x8A23, 0xB35B, 0x8A25, + 0xB35C, 0x8A31, 0xB35D, 0x8A2D, 0xB35E, 0x8A1F, 0xB35F, 0x8A1B, + 0xB360, 0x8A22, 0xB361, 0x8C49, 0xB362, 0x8C5A, 0xB363, 0x8CA9, + 0xB364, 0x8CAC, 0xB365, 0x8CAB, 0xB366, 0x8CA8, 0xB367, 0x8CAA, + 0xB368, 0x8CA7, 0xB369, 0x8D67, 0xB36A, 0x8D66, 0xB36B, 0x8DBE, + 0xB36C, 0x8DBA, 0xB36D, 0x8EDB, 0xB36E, 0x8EDF, 0xB36F, 0x9019, + 0xB370, 0x900D, 0xB371, 0x901A, 0xB372, 0x9017, 0xB373, 0x9023, + 0xB374, 0x901F, 0xB375, 0x901D, 0xB376, 0x9010, 0xB377, 0x9015, + 0xB378, 0x901E, 0xB379, 0x9020, 0xB37A, 0x900F, 0xB37B, 0x9022, + 0xB37C, 0x9016, 0xB37D, 0x901B, 0xB37E, 0x9014, 0xB3A1, 0x90E8, + 0xB3A2, 0x90ED, 0xB3A3, 0x90FD, 0xB3A4, 0x9157, 0xB3A5, 0x91CE, + 0xB3A6, 0x91F5, 0xB3A7, 0x91E6, 0xB3A8, 0x91E3, 0xB3A9, 0x91E7, + 0xB3AA, 0x91ED, 0xB3AB, 0x91E9, 0xB3AC, 0x9589, 0xB3AD, 0x966A, + 0xB3AE, 0x9675, 0xB3AF, 0x9673, 0xB3B0, 0x9678, 0xB3B1, 0x9670, + 0xB3B2, 0x9674, 0xB3B3, 0x9676, 0xB3B4, 0x9677, 0xB3B5, 0x966C, + 0xB3B6, 0x96C0, 0xB3B7, 0x96EA, 0xB3B8, 0x96E9, 0xB3B9, 0x7AE0, + 0xB3BA, 0x7ADF, 0xB3BB, 0x9802, 0xB3BC, 0x9803, 0xB3BD, 0x9B5A, + 0xB3BE, 0x9CE5, 0xB3BF, 0x9E75, 0xB3C0, 0x9E7F, 0xB3C1, 0x9EA5, + 0xB3C2, 0x9EBB, 0xB3C3, 0x50A2, 0xB3C4, 0x508D, 0xB3C5, 0x5085, + 0xB3C6, 0x5099, 0xB3C7, 0x5091, 0xB3C8, 0x5080, 0xB3C9, 0x5096, + 0xB3CA, 0x5098, 0xB3CB, 0x509A, 0xB3CC, 0x6700, 0xB3CD, 0x51F1, + 0xB3CE, 0x5272, 0xB3CF, 0x5274, 0xB3D0, 0x5275, 0xB3D1, 0x5269, + 0xB3D2, 0x52DE, 0xB3D3, 0x52DD, 0xB3D4, 0x52DB, 0xB3D5, 0x535A, + 0xB3D6, 0x53A5, 0xB3D7, 0x557B, 0xB3D8, 0x5580, 0xB3D9, 0x55A7, + 0xB3DA, 0x557C, 0xB3DB, 0x558A, 0xB3DC, 0x559D, 0xB3DD, 0x5598, + 0xB3DE, 0x5582, 0xB3DF, 0x559C, 0xB3E0, 0x55AA, 0xB3E1, 0x5594, + 0xB3E2, 0x5587, 0xB3E3, 0x558B, 0xB3E4, 0x5583, 0xB3E5, 0x55B3, + 0xB3E6, 0x55AE, 0xB3E7, 0x559F, 0xB3E8, 0x553E, 0xB3E9, 0x55B2, + 0xB3EA, 0x559A, 0xB3EB, 0x55BB, 0xB3EC, 0x55AC, 0xB3ED, 0x55B1, + 0xB3EE, 0x557E, 0xB3EF, 0x5589, 0xB3F0, 0x55AB, 0xB3F1, 0x5599, + 0xB3F2, 0x570D, 0xB3F3, 0x582F, 0xB3F4, 0x582A, 0xB3F5, 0x5834, + 0xB3F6, 0x5824, 0xB3F7, 0x5830, 0xB3F8, 0x5831, 0xB3F9, 0x5821, + 0xB3FA, 0x581D, 0xB3FB, 0x5820, 0xB3FC, 0x58F9, 0xB3FD, 0x58FA, + 0xB3FE, 0x5960, 0xB440, 0x5A77, 0xB441, 0x5A9A, 0xB442, 0x5A7F, + 0xB443, 0x5A92, 0xB444, 0x5A9B, 0xB445, 0x5AA7, 0xB446, 0x5B73, + 0xB447, 0x5B71, 0xB448, 0x5BD2, 0xB449, 0x5BCC, 0xB44A, 0x5BD3, + 0xB44B, 0x5BD0, 0xB44C, 0x5C0A, 0xB44D, 0x5C0B, 0xB44E, 0x5C31, + 0xB44F, 0x5D4C, 0xB450, 0x5D50, 0xB451, 0x5D34, 0xB452, 0x5D47, + 0xB453, 0x5DFD, 0xB454, 0x5E45, 0xB455, 0x5E3D, 0xB456, 0x5E40, + 0xB457, 0x5E43, 0xB458, 0x5E7E, 0xB459, 0x5ECA, 0xB45A, 0x5EC1, + 0xB45B, 0x5EC2, 0xB45C, 0x5EC4, 0xB45D, 0x5F3C, 0xB45E, 0x5F6D, + 0xB45F, 0x5FA9, 0xB460, 0x5FAA, 0xB461, 0x5FA8, 0xB462, 0x60D1, + 0xB463, 0x60E1, 0xB464, 0x60B2, 0xB465, 0x60B6, 0xB466, 0x60E0, + 0xB467, 0x611C, 0xB468, 0x6123, 0xB469, 0x60FA, 0xB46A, 0x6115, + 0xB46B, 0x60F0, 0xB46C, 0x60FB, 0xB46D, 0x60F4, 0xB46E, 0x6168, + 0xB46F, 0x60F1, 0xB470, 0x610E, 0xB471, 0x60F6, 0xB472, 0x6109, + 0xB473, 0x6100, 0xB474, 0x6112, 0xB475, 0x621F, 0xB476, 0x6249, + 0xB477, 0x63A3, 0xB478, 0x638C, 0xB479, 0x63CF, 0xB47A, 0x63C0, + 0xB47B, 0x63E9, 0xB47C, 0x63C9, 0xB47D, 0x63C6, 0xB47E, 0x63CD, + 0xB4A1, 0x63D2, 0xB4A2, 0x63E3, 0xB4A3, 0x63D0, 0xB4A4, 0x63E1, + 0xB4A5, 0x63D6, 0xB4A6, 0x63ED, 0xB4A7, 0x63EE, 0xB4A8, 0x6376, + 0xB4A9, 0x63F4, 0xB4AA, 0x63EA, 0xB4AB, 0x63DB, 0xB4AC, 0x6452, + 0xB4AD, 0x63DA, 0xB4AE, 0x63F9, 0xB4AF, 0x655E, 0xB4B0, 0x6566, + 0xB4B1, 0x6562, 0xB4B2, 0x6563, 0xB4B3, 0x6591, 0xB4B4, 0x6590, + 0xB4B5, 0x65AF, 0xB4B6, 0x666E, 0xB4B7, 0x6670, 0xB4B8, 0x6674, + 0xB4B9, 0x6676, 0xB4BA, 0x666F, 0xB4BB, 0x6691, 0xB4BC, 0x667A, + 0xB4BD, 0x667E, 0xB4BE, 0x6677, 0xB4BF, 0x66FE, 0xB4C0, 0x66FF, + 0xB4C1, 0x671F, 0xB4C2, 0x671D, 0xB4C3, 0x68FA, 0xB4C4, 0x68D5, + 0xB4C5, 0x68E0, 0xB4C6, 0x68D8, 0xB4C7, 0x68D7, 0xB4C8, 0x6905, + 0xB4C9, 0x68DF, 0xB4CA, 0x68F5, 0xB4CB, 0x68EE, 0xB4CC, 0x68E7, + 0xB4CD, 0x68F9, 0xB4CE, 0x68D2, 0xB4CF, 0x68F2, 0xB4D0, 0x68E3, + 0xB4D1, 0x68CB, 0xB4D2, 0x68CD, 0xB4D3, 0x690D, 0xB4D4, 0x6912, + 0xB4D5, 0x690E, 0xB4D6, 0x68C9, 0xB4D7, 0x68DA, 0xB4D8, 0x696E, + 0xB4D9, 0x68FB, 0xB4DA, 0x6B3E, 0xB4DB, 0x6B3A, 0xB4DC, 0x6B3D, + 0xB4DD, 0x6B98, 0xB4DE, 0x6B96, 0xB4DF, 0x6BBC, 0xB4E0, 0x6BEF, + 0xB4E1, 0x6C2E, 0xB4E2, 0x6C2F, 0xB4E3, 0x6C2C, 0xB4E4, 0x6E2F, + 0xB4E5, 0x6E38, 0xB4E6, 0x6E54, 0xB4E7, 0x6E21, 0xB4E8, 0x6E32, + 0xB4E9, 0x6E67, 0xB4EA, 0x6E4A, 0xB4EB, 0x6E20, 0xB4EC, 0x6E25, + 0xB4ED, 0x6E23, 0xB4EE, 0x6E1B, 0xB4EF, 0x6E5B, 0xB4F0, 0x6E58, + 0xB4F1, 0x6E24, 0xB4F2, 0x6E56, 0xB4F3, 0x6E6E, 0xB4F4, 0x6E2D, + 0xB4F5, 0x6E26, 0xB4F6, 0x6E6F, 0xB4F7, 0x6E34, 0xB4F8, 0x6E4D, + 0xB4F9, 0x6E3A, 0xB4FA, 0x6E2C, 0xB4FB, 0x6E43, 0xB4FC, 0x6E1D, + 0xB4FD, 0x6E3E, 0xB4FE, 0x6ECB, 0xB540, 0x6E89, 0xB541, 0x6E19, + 0xB542, 0x6E4E, 0xB543, 0x6E63, 0xB544, 0x6E44, 0xB545, 0x6E72, + 0xB546, 0x6E69, 0xB547, 0x6E5F, 0xB548, 0x7119, 0xB549, 0x711A, + 0xB54A, 0x7126, 0xB54B, 0x7130, 0xB54C, 0x7121, 0xB54D, 0x7136, + 0xB54E, 0x716E, 0xB54F, 0x711C, 0xB550, 0x724C, 0xB551, 0x7284, + 0xB552, 0x7280, 0xB553, 0x7336, 0xB554, 0x7325, 0xB555, 0x7334, + 0xB556, 0x7329, 0xB557, 0x743A, 0xB558, 0x742A, 0xB559, 0x7433, + 0xB55A, 0x7422, 0xB55B, 0x7425, 0xB55C, 0x7435, 0xB55D, 0x7436, + 0xB55E, 0x7434, 0xB55F, 0x742F, 0xB560, 0x741B, 0xB561, 0x7426, + 0xB562, 0x7428, 0xB563, 0x7525, 0xB564, 0x7526, 0xB565, 0x756B, + 0xB566, 0x756A, 0xB567, 0x75E2, 0xB568, 0x75DB, 0xB569, 0x75E3, + 0xB56A, 0x75D9, 0xB56B, 0x75D8, 0xB56C, 0x75DE, 0xB56D, 0x75E0, + 0xB56E, 0x767B, 0xB56F, 0x767C, 0xB570, 0x7696, 0xB571, 0x7693, + 0xB572, 0x76B4, 0xB573, 0x76DC, 0xB574, 0x774F, 0xB575, 0x77ED, + 0xB576, 0x785D, 0xB577, 0x786C, 0xB578, 0x786F, 0xB579, 0x7A0D, + 0xB57A, 0x7A08, 0xB57B, 0x7A0B, 0xB57C, 0x7A05, 0xB57D, 0x7A00, + 0xB57E, 0x7A98, 0xB5A1, 0x7A97, 0xB5A2, 0x7A96, 0xB5A3, 0x7AE5, + 0xB5A4, 0x7AE3, 0xB5A5, 0x7B49, 0xB5A6, 0x7B56, 0xB5A7, 0x7B46, + 0xB5A8, 0x7B50, 0xB5A9, 0x7B52, 0xB5AA, 0x7B54, 0xB5AB, 0x7B4D, + 0xB5AC, 0x7B4B, 0xB5AD, 0x7B4F, 0xB5AE, 0x7B51, 0xB5AF, 0x7C9F, + 0xB5B0, 0x7CA5, 0xB5B1, 0x7D5E, 0xB5B2, 0x7D50, 0xB5B3, 0x7D68, + 0xB5B4, 0x7D55, 0xB5B5, 0x7D2B, 0xB5B6, 0x7D6E, 0xB5B7, 0x7D72, + 0xB5B8, 0x7D61, 0xB5B9, 0x7D66, 0xB5BA, 0x7D62, 0xB5BB, 0x7D70, + 0xB5BC, 0x7D73, 0xB5BD, 0x5584, 0xB5BE, 0x7FD4, 0xB5BF, 0x7FD5, + 0xB5C0, 0x800B, 0xB5C1, 0x8052, 0xB5C2, 0x8085, 0xB5C3, 0x8155, + 0xB5C4, 0x8154, 0xB5C5, 0x814B, 0xB5C6, 0x8151, 0xB5C7, 0x814E, + 0xB5C8, 0x8139, 0xB5C9, 0x8146, 0xB5CA, 0x813E, 0xB5CB, 0x814C, + 0xB5CC, 0x8153, 0xB5CD, 0x8174, 0xB5CE, 0x8212, 0xB5CF, 0x821C, + 0xB5D0, 0x83E9, 0xB5D1, 0x8403, 0xB5D2, 0x83F8, 0xB5D3, 0x840D, + 0xB5D4, 0x83E0, 0xB5D5, 0x83C5, 0xB5D6, 0x840B, 0xB5D7, 0x83C1, + 0xB5D8, 0x83EF, 0xB5D9, 0x83F1, 0xB5DA, 0x83F4, 0xB5DB, 0x8457, + 0xB5DC, 0x840A, 0xB5DD, 0x83F0, 0xB5DE, 0x840C, 0xB5DF, 0x83CC, + 0xB5E0, 0x83FD, 0xB5E1, 0x83F2, 0xB5E2, 0x83CA, 0xB5E3, 0x8438, + 0xB5E4, 0x840E, 0xB5E5, 0x8404, 0xB5E6, 0x83DC, 0xB5E7, 0x8407, + 0xB5E8, 0x83D4, 0xB5E9, 0x83DF, 0xB5EA, 0x865B, 0xB5EB, 0x86DF, + 0xB5EC, 0x86D9, 0xB5ED, 0x86ED, 0xB5EE, 0x86D4, 0xB5EF, 0x86DB, + 0xB5F0, 0x86E4, 0xB5F1, 0x86D0, 0xB5F2, 0x86DE, 0xB5F3, 0x8857, + 0xB5F4, 0x88C1, 0xB5F5, 0x88C2, 0xB5F6, 0x88B1, 0xB5F7, 0x8983, + 0xB5F8, 0x8996, 0xB5F9, 0x8A3B, 0xB5FA, 0x8A60, 0xB5FB, 0x8A55, + 0xB5FC, 0x8A5E, 0xB5FD, 0x8A3C, 0xB5FE, 0x8A41, 0xB640, 0x8A54, + 0xB641, 0x8A5B, 0xB642, 0x8A50, 0xB643, 0x8A46, 0xB644, 0x8A34, + 0xB645, 0x8A3A, 0xB646, 0x8A36, 0xB647, 0x8A56, 0xB648, 0x8C61, + 0xB649, 0x8C82, 0xB64A, 0x8CAF, 0xB64B, 0x8CBC, 0xB64C, 0x8CB3, + 0xB64D, 0x8CBD, 0xB64E, 0x8CC1, 0xB64F, 0x8CBB, 0xB650, 0x8CC0, + 0xB651, 0x8CB4, 0xB652, 0x8CB7, 0xB653, 0x8CB6, 0xB654, 0x8CBF, + 0xB655, 0x8CB8, 0xB656, 0x8D8A, 0xB657, 0x8D85, 0xB658, 0x8D81, + 0xB659, 0x8DCE, 0xB65A, 0x8DDD, 0xB65B, 0x8DCB, 0xB65C, 0x8DDA, + 0xB65D, 0x8DD1, 0xB65E, 0x8DCC, 0xB65F, 0x8DDB, 0xB660, 0x8DC6, + 0xB661, 0x8EFB, 0xB662, 0x8EF8, 0xB663, 0x8EFC, 0xB664, 0x8F9C, + 0xB665, 0x902E, 0xB666, 0x9035, 0xB667, 0x9031, 0xB668, 0x9038, + 0xB669, 0x9032, 0xB66A, 0x9036, 0xB66B, 0x9102, 0xB66C, 0x90F5, + 0xB66D, 0x9109, 0xB66E, 0x90FE, 0xB66F, 0x9163, 0xB670, 0x9165, + 0xB671, 0x91CF, 0xB672, 0x9214, 0xB673, 0x9215, 0xB674, 0x9223, + 0xB675, 0x9209, 0xB676, 0x921E, 0xB677, 0x920D, 0xB678, 0x9210, + 0xB679, 0x9207, 0xB67A, 0x9211, 0xB67B, 0x9594, 0xB67C, 0x958F, + 0xB67D, 0x958B, 0xB67E, 0x9591, 0xB6A1, 0x9593, 0xB6A2, 0x9592, + 0xB6A3, 0x958E, 0xB6A4, 0x968A, 0xB6A5, 0x968E, 0xB6A6, 0x968B, + 0xB6A7, 0x967D, 0xB6A8, 0x9685, 0xB6A9, 0x9686, 0xB6AA, 0x968D, + 0xB6AB, 0x9672, 0xB6AC, 0x9684, 0xB6AD, 0x96C1, 0xB6AE, 0x96C5, + 0xB6AF, 0x96C4, 0xB6B0, 0x96C6, 0xB6B1, 0x96C7, 0xB6B2, 0x96EF, + 0xB6B3, 0x96F2, 0xB6B4, 0x97CC, 0xB6B5, 0x9805, 0xB6B6, 0x9806, + 0xB6B7, 0x9808, 0xB6B8, 0x98E7, 0xB6B9, 0x98EA, 0xB6BA, 0x98EF, + 0xB6BB, 0x98E9, 0xB6BC, 0x98F2, 0xB6BD, 0x98ED, 0xB6BE, 0x99AE, + 0xB6BF, 0x99AD, 0xB6C0, 0x9EC3, 0xB6C1, 0x9ECD, 0xB6C2, 0x9ED1, + 0xB6C3, 0x4E82, 0xB6C4, 0x50AD, 0xB6C5, 0x50B5, 0xB6C6, 0x50B2, + 0xB6C7, 0x50B3, 0xB6C8, 0x50C5, 0xB6C9, 0x50BE, 0xB6CA, 0x50AC, + 0xB6CB, 0x50B7, 0xB6CC, 0x50BB, 0xB6CD, 0x50AF, 0xB6CE, 0x50C7, + 0xB6CF, 0x527F, 0xB6D0, 0x5277, 0xB6D1, 0x527D, 0xB6D2, 0x52DF, + 0xB6D3, 0x52E6, 0xB6D4, 0x52E4, 0xB6D5, 0x52E2, 0xB6D6, 0x52E3, + 0xB6D7, 0x532F, 0xB6D8, 0x55DF, 0xB6D9, 0x55E8, 0xB6DA, 0x55D3, + 0xB6DB, 0x55E6, 0xB6DC, 0x55CE, 0xB6DD, 0x55DC, 0xB6DE, 0x55C7, + 0xB6DF, 0x55D1, 0xB6E0, 0x55E3, 0xB6E1, 0x55E4, 0xB6E2, 0x55EF, + 0xB6E3, 0x55DA, 0xB6E4, 0x55E1, 0xB6E5, 0x55C5, 0xB6E6, 0x55C6, + 0xB6E7, 0x55E5, 0xB6E8, 0x55C9, 0xB6E9, 0x5712, 0xB6EA, 0x5713, + 0xB6EB, 0x585E, 0xB6EC, 0x5851, 0xB6ED, 0x5858, 0xB6EE, 0x5857, + 0xB6EF, 0x585A, 0xB6F0, 0x5854, 0xB6F1, 0x586B, 0xB6F2, 0x584C, + 0xB6F3, 0x586D, 0xB6F4, 0x584A, 0xB6F5, 0x5862, 0xB6F6, 0x5852, + 0xB6F7, 0x584B, 0xB6F8, 0x5967, 0xB6F9, 0x5AC1, 0xB6FA, 0x5AC9, + 0xB6FB, 0x5ACC, 0xB6FC, 0x5ABE, 0xB6FD, 0x5ABD, 0xB6FE, 0x5ABC, + 0xB740, 0x5AB3, 0xB741, 0x5AC2, 0xB742, 0x5AB2, 0xB743, 0x5D69, + 0xB744, 0x5D6F, 0xB745, 0x5E4C, 0xB746, 0x5E79, 0xB747, 0x5EC9, + 0xB748, 0x5EC8, 0xB749, 0x5F12, 0xB74A, 0x5F59, 0xB74B, 0x5FAC, + 0xB74C, 0x5FAE, 0xB74D, 0x611A, 0xB74E, 0x610F, 0xB74F, 0x6148, + 0xB750, 0x611F, 0xB751, 0x60F3, 0xB752, 0x611B, 0xB753, 0x60F9, + 0xB754, 0x6101, 0xB755, 0x6108, 0xB756, 0x614E, 0xB757, 0x614C, + 0xB758, 0x6144, 0xB759, 0x614D, 0xB75A, 0x613E, 0xB75B, 0x6134, + 0xB75C, 0x6127, 0xB75D, 0x610D, 0xB75E, 0x6106, 0xB75F, 0x6137, + 0xB760, 0x6221, 0xB761, 0x6222, 0xB762, 0x6413, 0xB763, 0x643E, + 0xB764, 0x641E, 0xB765, 0x642A, 0xB766, 0x642D, 0xB767, 0x643D, + 0xB768, 0x642C, 0xB769, 0x640F, 0xB76A, 0x641C, 0xB76B, 0x6414, + 0xB76C, 0x640D, 0xB76D, 0x6436, 0xB76E, 0x6416, 0xB76F, 0x6417, + 0xB770, 0x6406, 0xB771, 0x656C, 0xB772, 0x659F, 0xB773, 0x65B0, + 0xB774, 0x6697, 0xB775, 0x6689, 0xB776, 0x6687, 0xB777, 0x6688, + 0xB778, 0x6696, 0xB779, 0x6684, 0xB77A, 0x6698, 0xB77B, 0x668D, + 0xB77C, 0x6703, 0xB77D, 0x6994, 0xB77E, 0x696D, 0xB7A1, 0x695A, + 0xB7A2, 0x6977, 0xB7A3, 0x6960, 0xB7A4, 0x6954, 0xB7A5, 0x6975, + 0xB7A6, 0x6930, 0xB7A7, 0x6982, 0xB7A8, 0x694A, 0xB7A9, 0x6968, + 0xB7AA, 0x696B, 0xB7AB, 0x695E, 0xB7AC, 0x6953, 0xB7AD, 0x6979, + 0xB7AE, 0x6986, 0xB7AF, 0x695D, 0xB7B0, 0x6963, 0xB7B1, 0x695B, + 0xB7B2, 0x6B47, 0xB7B3, 0x6B72, 0xB7B4, 0x6BC0, 0xB7B5, 0x6BBF, + 0xB7B6, 0x6BD3, 0xB7B7, 0x6BFD, 0xB7B8, 0x6EA2, 0xB7B9, 0x6EAF, + 0xB7BA, 0x6ED3, 0xB7BB, 0x6EB6, 0xB7BC, 0x6EC2, 0xB7BD, 0x6E90, + 0xB7BE, 0x6E9D, 0xB7BF, 0x6EC7, 0xB7C0, 0x6EC5, 0xB7C1, 0x6EA5, + 0xB7C2, 0x6E98, 0xB7C3, 0x6EBC, 0xB7C4, 0x6EBA, 0xB7C5, 0x6EAB, + 0xB7C6, 0x6ED1, 0xB7C7, 0x6E96, 0xB7C8, 0x6E9C, 0xB7C9, 0x6EC4, + 0xB7CA, 0x6ED4, 0xB7CB, 0x6EAA, 0xB7CC, 0x6EA7, 0xB7CD, 0x6EB4, + 0xB7CE, 0x714E, 0xB7CF, 0x7159, 0xB7D0, 0x7169, 0xB7D1, 0x7164, + 0xB7D2, 0x7149, 0xB7D3, 0x7167, 0xB7D4, 0x715C, 0xB7D5, 0x716C, + 0xB7D6, 0x7166, 0xB7D7, 0x714C, 0xB7D8, 0x7165, 0xB7D9, 0x715E, + 0xB7DA, 0x7146, 0xB7DB, 0x7168, 0xB7DC, 0x7156, 0xB7DD, 0x723A, + 0xB7DE, 0x7252, 0xB7DF, 0x7337, 0xB7E0, 0x7345, 0xB7E1, 0x733F, + 0xB7E2, 0x733E, 0xB7E3, 0x746F, 0xB7E4, 0x745A, 0xB7E5, 0x7455, + 0xB7E6, 0x745F, 0xB7E7, 0x745E, 0xB7E8, 0x7441, 0xB7E9, 0x743F, + 0xB7EA, 0x7459, 0xB7EB, 0x745B, 0xB7EC, 0x745C, 0xB7ED, 0x7576, + 0xB7EE, 0x7578, 0xB7EF, 0x7600, 0xB7F0, 0x75F0, 0xB7F1, 0x7601, + 0xB7F2, 0x75F2, 0xB7F3, 0x75F1, 0xB7F4, 0x75FA, 0xB7F5, 0x75FF, + 0xB7F6, 0x75F4, 0xB7F7, 0x75F3, 0xB7F8, 0x76DE, 0xB7F9, 0x76DF, + 0xB7FA, 0x775B, 0xB7FB, 0x776B, 0xB7FC, 0x7766, 0xB7FD, 0x775E, + 0xB7FE, 0x7763, 0xB840, 0x7779, 0xB841, 0x776A, 0xB842, 0x776C, + 0xB843, 0x775C, 0xB844, 0x7765, 0xB845, 0x7768, 0xB846, 0x7762, + 0xB847, 0x77EE, 0xB848, 0x788E, 0xB849, 0x78B0, 0xB84A, 0x7897, + 0xB84B, 0x7898, 0xB84C, 0x788C, 0xB84D, 0x7889, 0xB84E, 0x787C, + 0xB84F, 0x7891, 0xB850, 0x7893, 0xB851, 0x787F, 0xB852, 0x797A, + 0xB853, 0x797F, 0xB854, 0x7981, 0xB855, 0x842C, 0xB856, 0x79BD, + 0xB857, 0x7A1C, 0xB858, 0x7A1A, 0xB859, 0x7A20, 0xB85A, 0x7A14, + 0xB85B, 0x7A1F, 0xB85C, 0x7A1E, 0xB85D, 0x7A9F, 0xB85E, 0x7AA0, + 0xB85F, 0x7B77, 0xB860, 0x7BC0, 0xB861, 0x7B60, 0xB862, 0x7B6E, + 0xB863, 0x7B67, 0xB864, 0x7CB1, 0xB865, 0x7CB3, 0xB866, 0x7CB5, + 0xB867, 0x7D93, 0xB868, 0x7D79, 0xB869, 0x7D91, 0xB86A, 0x7D81, + 0xB86B, 0x7D8F, 0xB86C, 0x7D5B, 0xB86D, 0x7F6E, 0xB86E, 0x7F69, + 0xB86F, 0x7F6A, 0xB870, 0x7F72, 0xB871, 0x7FA9, 0xB872, 0x7FA8, + 0xB873, 0x7FA4, 0xB874, 0x8056, 0xB875, 0x8058, 0xB876, 0x8086, + 0xB877, 0x8084, 0xB878, 0x8171, 0xB879, 0x8170, 0xB87A, 0x8178, + 0xB87B, 0x8165, 0xB87C, 0x816E, 0xB87D, 0x8173, 0xB87E, 0x816B, + 0xB8A1, 0x8179, 0xB8A2, 0x817A, 0xB8A3, 0x8166, 0xB8A4, 0x8205, + 0xB8A5, 0x8247, 0xB8A6, 0x8482, 0xB8A7, 0x8477, 0xB8A8, 0x843D, + 0xB8A9, 0x8431, 0xB8AA, 0x8475, 0xB8AB, 0x8466, 0xB8AC, 0x846B, + 0xB8AD, 0x8449, 0xB8AE, 0x846C, 0xB8AF, 0x845B, 0xB8B0, 0x843C, + 0xB8B1, 0x8435, 0xB8B2, 0x8461, 0xB8B3, 0x8463, 0xB8B4, 0x8469, + 0xB8B5, 0x846D, 0xB8B6, 0x8446, 0xB8B7, 0x865E, 0xB8B8, 0x865C, + 0xB8B9, 0x865F, 0xB8BA, 0x86F9, 0xB8BB, 0x8713, 0xB8BC, 0x8708, + 0xB8BD, 0x8707, 0xB8BE, 0x8700, 0xB8BF, 0x86FE, 0xB8C0, 0x86FB, + 0xB8C1, 0x8702, 0xB8C2, 0x8703, 0xB8C3, 0x8706, 0xB8C4, 0x870A, + 0xB8C5, 0x8859, 0xB8C6, 0x88DF, 0xB8C7, 0x88D4, 0xB8C8, 0x88D9, + 0xB8C9, 0x88DC, 0xB8CA, 0x88D8, 0xB8CB, 0x88DD, 0xB8CC, 0x88E1, + 0xB8CD, 0x88CA, 0xB8CE, 0x88D5, 0xB8CF, 0x88D2, 0xB8D0, 0x899C, + 0xB8D1, 0x89E3, 0xB8D2, 0x8A6B, 0xB8D3, 0x8A72, 0xB8D4, 0x8A73, + 0xB8D5, 0x8A66, 0xB8D6, 0x8A69, 0xB8D7, 0x8A70, 0xB8D8, 0x8A87, + 0xB8D9, 0x8A7C, 0xB8DA, 0x8A63, 0xB8DB, 0x8AA0, 0xB8DC, 0x8A71, + 0xB8DD, 0x8A85, 0xB8DE, 0x8A6D, 0xB8DF, 0x8A62, 0xB8E0, 0x8A6E, + 0xB8E1, 0x8A6C, 0xB8E2, 0x8A79, 0xB8E3, 0x8A7B, 0xB8E4, 0x8A3E, + 0xB8E5, 0x8A68, 0xB8E6, 0x8C62, 0xB8E7, 0x8C8A, 0xB8E8, 0x8C89, + 0xB8E9, 0x8CCA, 0xB8EA, 0x8CC7, 0xB8EB, 0x8CC8, 0xB8EC, 0x8CC4, + 0xB8ED, 0x8CB2, 0xB8EE, 0x8CC3, 0xB8EF, 0x8CC2, 0xB8F0, 0x8CC5, + 0xB8F1, 0x8DE1, 0xB8F2, 0x8DDF, 0xB8F3, 0x8DE8, 0xB8F4, 0x8DEF, + 0xB8F5, 0x8DF3, 0xB8F6, 0x8DFA, 0xB8F7, 0x8DEA, 0xB8F8, 0x8DE4, + 0xB8F9, 0x8DE6, 0xB8FA, 0x8EB2, 0xB8FB, 0x8F03, 0xB8FC, 0x8F09, + 0xB8FD, 0x8EFE, 0xB8FE, 0x8F0A, 0xB940, 0x8F9F, 0xB941, 0x8FB2, + 0xB942, 0x904B, 0xB943, 0x904A, 0xB944, 0x9053, 0xB945, 0x9042, + 0xB946, 0x9054, 0xB947, 0x903C, 0xB948, 0x9055, 0xB949, 0x9050, + 0xB94A, 0x9047, 0xB94B, 0x904F, 0xB94C, 0x904E, 0xB94D, 0x904D, + 0xB94E, 0x9051, 0xB94F, 0x903E, 0xB950, 0x9041, 0xB951, 0x9112, + 0xB952, 0x9117, 0xB953, 0x916C, 0xB954, 0x916A, 0xB955, 0x9169, + 0xB956, 0x91C9, 0xB957, 0x9237, 0xB958, 0x9257, 0xB959, 0x9238, + 0xB95A, 0x923D, 0xB95B, 0x9240, 0xB95C, 0x923E, 0xB95D, 0x925B, + 0xB95E, 0x924B, 0xB95F, 0x9264, 0xB960, 0x9251, 0xB961, 0x9234, + 0xB962, 0x9249, 0xB963, 0x924D, 0xB964, 0x9245, 0xB965, 0x9239, + 0xB966, 0x923F, 0xB967, 0x925A, 0xB968, 0x9598, 0xB969, 0x9698, + 0xB96A, 0x9694, 0xB96B, 0x9695, 0xB96C, 0x96CD, 0xB96D, 0x96CB, + 0xB96E, 0x96C9, 0xB96F, 0x96CA, 0xB970, 0x96F7, 0xB971, 0x96FB, + 0xB972, 0x96F9, 0xB973, 0x96F6, 0xB974, 0x9756, 0xB975, 0x9774, + 0xB976, 0x9776, 0xB977, 0x9810, 0xB978, 0x9811, 0xB979, 0x9813, + 0xB97A, 0x980A, 0xB97B, 0x9812, 0xB97C, 0x980C, 0xB97D, 0x98FC, + 0xB97E, 0x98F4, 0xB9A1, 0x98FD, 0xB9A2, 0x98FE, 0xB9A3, 0x99B3, + 0xB9A4, 0x99B1, 0xB9A5, 0x99B4, 0xB9A6, 0x9AE1, 0xB9A7, 0x9CE9, + 0xB9A8, 0x9E82, 0xB9A9, 0x9F0E, 0xB9AA, 0x9F13, 0xB9AB, 0x9F20, + 0xB9AC, 0x50E7, 0xB9AD, 0x50EE, 0xB9AE, 0x50E5, 0xB9AF, 0x50D6, + 0xB9B0, 0x50ED, 0xB9B1, 0x50DA, 0xB9B2, 0x50D5, 0xB9B3, 0x50CF, + 0xB9B4, 0x50D1, 0xB9B5, 0x50F1, 0xB9B6, 0x50CE, 0xB9B7, 0x50E9, + 0xB9B8, 0x5162, 0xB9B9, 0x51F3, 0xB9BA, 0x5283, 0xB9BB, 0x5282, + 0xB9BC, 0x5331, 0xB9BD, 0x53AD, 0xB9BE, 0x55FE, 0xB9BF, 0x5600, + 0xB9C0, 0x561B, 0xB9C1, 0x5617, 0xB9C2, 0x55FD, 0xB9C3, 0x5614, + 0xB9C4, 0x5606, 0xB9C5, 0x5609, 0xB9C6, 0x560D, 0xB9C7, 0x560E, + 0xB9C8, 0x55F7, 0xB9C9, 0x5616, 0xB9CA, 0x561F, 0xB9CB, 0x5608, + 0xB9CC, 0x5610, 0xB9CD, 0x55F6, 0xB9CE, 0x5718, 0xB9CF, 0x5716, + 0xB9D0, 0x5875, 0xB9D1, 0x587E, 0xB9D2, 0x5883, 0xB9D3, 0x5893, + 0xB9D4, 0x588A, 0xB9D5, 0x5879, 0xB9D6, 0x5885, 0xB9D7, 0x587D, + 0xB9D8, 0x58FD, 0xB9D9, 0x5925, 0xB9DA, 0x5922, 0xB9DB, 0x5924, + 0xB9DC, 0x596A, 0xB9DD, 0x5969, 0xB9DE, 0x5AE1, 0xB9DF, 0x5AE6, + 0xB9E0, 0x5AE9, 0xB9E1, 0x5AD7, 0xB9E2, 0x5AD6, 0xB9E3, 0x5AD8, + 0xB9E4, 0x5AE3, 0xB9E5, 0x5B75, 0xB9E6, 0x5BDE, 0xB9E7, 0x5BE7, + 0xB9E8, 0x5BE1, 0xB9E9, 0x5BE5, 0xB9EA, 0x5BE6, 0xB9EB, 0x5BE8, + 0xB9EC, 0x5BE2, 0xB9ED, 0x5BE4, 0xB9EE, 0x5BDF, 0xB9EF, 0x5C0D, + 0xB9F0, 0x5C62, 0xB9F1, 0x5D84, 0xB9F2, 0x5D87, 0xB9F3, 0x5E5B, + 0xB9F4, 0x5E63, 0xB9F5, 0x5E55, 0xB9F6, 0x5E57, 0xB9F7, 0x5E54, + 0xB9F8, 0x5ED3, 0xB9F9, 0x5ED6, 0xB9FA, 0x5F0A, 0xB9FB, 0x5F46, + 0xB9FC, 0x5F70, 0xB9FD, 0x5FB9, 0xB9FE, 0x6147, 0xBA40, 0x613F, + 0xBA41, 0x614B, 0xBA42, 0x6177, 0xBA43, 0x6162, 0xBA44, 0x6163, + 0xBA45, 0x615F, 0xBA46, 0x615A, 0xBA47, 0x6158, 0xBA48, 0x6175, + 0xBA49, 0x622A, 0xBA4A, 0x6487, 0xBA4B, 0x6458, 0xBA4C, 0x6454, + 0xBA4D, 0x64A4, 0xBA4E, 0x6478, 0xBA4F, 0x645F, 0xBA50, 0x647A, + 0xBA51, 0x6451, 0xBA52, 0x6467, 0xBA53, 0x6434, 0xBA54, 0x646D, + 0xBA55, 0x647B, 0xBA56, 0x6572, 0xBA57, 0x65A1, 0xBA58, 0x65D7, + 0xBA59, 0x65D6, 0xBA5A, 0x66A2, 0xBA5B, 0x66A8, 0xBA5C, 0x669D, + 0xBA5D, 0x699C, 0xBA5E, 0x69A8, 0xBA5F, 0x6995, 0xBA60, 0x69C1, + 0xBA61, 0x69AE, 0xBA62, 0x69D3, 0xBA63, 0x69CB, 0xBA64, 0x699B, + 0xBA65, 0x69B7, 0xBA66, 0x69BB, 0xBA67, 0x69AB, 0xBA68, 0x69B4, + 0xBA69, 0x69D0, 0xBA6A, 0x69CD, 0xBA6B, 0x69AD, 0xBA6C, 0x69CC, + 0xBA6D, 0x69A6, 0xBA6E, 0x69C3, 0xBA6F, 0x69A3, 0xBA70, 0x6B49, + 0xBA71, 0x6B4C, 0xBA72, 0x6C33, 0xBA73, 0x6F33, 0xBA74, 0x6F14, + 0xBA75, 0x6EFE, 0xBA76, 0x6F13, 0xBA77, 0x6EF4, 0xBA78, 0x6F29, + 0xBA79, 0x6F3E, 0xBA7A, 0x6F20, 0xBA7B, 0x6F2C, 0xBA7C, 0x6F0F, + 0xBA7D, 0x6F02, 0xBA7E, 0x6F22, 0xBAA1, 0x6EFF, 0xBAA2, 0x6EEF, + 0xBAA3, 0x6F06, 0xBAA4, 0x6F31, 0xBAA5, 0x6F38, 0xBAA6, 0x6F32, + 0xBAA7, 0x6F23, 0xBAA8, 0x6F15, 0xBAA9, 0x6F2B, 0xBAAA, 0x6F2F, + 0xBAAB, 0x6F88, 0xBAAC, 0x6F2A, 0xBAAD, 0x6EEC, 0xBAAE, 0x6F01, + 0xBAAF, 0x6EF2, 0xBAB0, 0x6ECC, 0xBAB1, 0x6EF7, 0xBAB2, 0x7194, + 0xBAB3, 0x7199, 0xBAB4, 0x717D, 0xBAB5, 0x718A, 0xBAB6, 0x7184, + 0xBAB7, 0x7192, 0xBAB8, 0x723E, 0xBAB9, 0x7292, 0xBABA, 0x7296, + 0xBABB, 0x7344, 0xBABC, 0x7350, 0xBABD, 0x7464, 0xBABE, 0x7463, + 0xBABF, 0x746A, 0xBAC0, 0x7470, 0xBAC1, 0x746D, 0xBAC2, 0x7504, + 0xBAC3, 0x7591, 0xBAC4, 0x7627, 0xBAC5, 0x760D, 0xBAC6, 0x760B, + 0xBAC7, 0x7609, 0xBAC8, 0x7613, 0xBAC9, 0x76E1, 0xBACA, 0x76E3, + 0xBACB, 0x7784, 0xBACC, 0x777D, 0xBACD, 0x777F, 0xBACE, 0x7761, + 0xBACF, 0x78C1, 0xBAD0, 0x789F, 0xBAD1, 0x78A7, 0xBAD2, 0x78B3, + 0xBAD3, 0x78A9, 0xBAD4, 0x78A3, 0xBAD5, 0x798E, 0xBAD6, 0x798F, + 0xBAD7, 0x798D, 0xBAD8, 0x7A2E, 0xBAD9, 0x7A31, 0xBADA, 0x7AAA, + 0xBADB, 0x7AA9, 0xBADC, 0x7AED, 0xBADD, 0x7AEF, 0xBADE, 0x7BA1, + 0xBADF, 0x7B95, 0xBAE0, 0x7B8B, 0xBAE1, 0x7B75, 0xBAE2, 0x7B97, + 0xBAE3, 0x7B9D, 0xBAE4, 0x7B94, 0xBAE5, 0x7B8F, 0xBAE6, 0x7BB8, + 0xBAE7, 0x7B87, 0xBAE8, 0x7B84, 0xBAE9, 0x7CB9, 0xBAEA, 0x7CBD, + 0xBAEB, 0x7CBE, 0xBAEC, 0x7DBB, 0xBAED, 0x7DB0, 0xBAEE, 0x7D9C, + 0xBAEF, 0x7DBD, 0xBAF0, 0x7DBE, 0xBAF1, 0x7DA0, 0xBAF2, 0x7DCA, + 0xBAF3, 0x7DB4, 0xBAF4, 0x7DB2, 0xBAF5, 0x7DB1, 0xBAF6, 0x7DBA, + 0xBAF7, 0x7DA2, 0xBAF8, 0x7DBF, 0xBAF9, 0x7DB5, 0xBAFA, 0x7DB8, + 0xBAFB, 0x7DAD, 0xBAFC, 0x7DD2, 0xBAFD, 0x7DC7, 0xBAFE, 0x7DAC, + 0xBB40, 0x7F70, 0xBB41, 0x7FE0, 0xBB42, 0x7FE1, 0xBB43, 0x7FDF, + 0xBB44, 0x805E, 0xBB45, 0x805A, 0xBB46, 0x8087, 0xBB47, 0x8150, + 0xBB48, 0x8180, 0xBB49, 0x818F, 0xBB4A, 0x8188, 0xBB4B, 0x818A, + 0xBB4C, 0x817F, 0xBB4D, 0x8182, 0xBB4E, 0x81E7, 0xBB4F, 0x81FA, + 0xBB50, 0x8207, 0xBB51, 0x8214, 0xBB52, 0x821E, 0xBB53, 0x824B, + 0xBB54, 0x84C9, 0xBB55, 0x84BF, 0xBB56, 0x84C6, 0xBB57, 0x84C4, + 0xBB58, 0x8499, 0xBB59, 0x849E, 0xBB5A, 0x84B2, 0xBB5B, 0x849C, + 0xBB5C, 0x84CB, 0xBB5D, 0x84B8, 0xBB5E, 0x84C0, 0xBB5F, 0x84D3, + 0xBB60, 0x8490, 0xBB61, 0x84BC, 0xBB62, 0x84D1, 0xBB63, 0x84CA, + 0xBB64, 0x873F, 0xBB65, 0x871C, 0xBB66, 0x873B, 0xBB67, 0x8722, + 0xBB68, 0x8725, 0xBB69, 0x8734, 0xBB6A, 0x8718, 0xBB6B, 0x8755, + 0xBB6C, 0x8737, 0xBB6D, 0x8729, 0xBB6E, 0x88F3, 0xBB6F, 0x8902, + 0xBB70, 0x88F4, 0xBB71, 0x88F9, 0xBB72, 0x88F8, 0xBB73, 0x88FD, + 0xBB74, 0x88E8, 0xBB75, 0x891A, 0xBB76, 0x88EF, 0xBB77, 0x8AA6, + 0xBB78, 0x8A8C, 0xBB79, 0x8A9E, 0xBB7A, 0x8AA3, 0xBB7B, 0x8A8D, + 0xBB7C, 0x8AA1, 0xBB7D, 0x8A93, 0xBB7E, 0x8AA4, 0xBBA1, 0x8AAA, + 0xBBA2, 0x8AA5, 0xBBA3, 0x8AA8, 0xBBA4, 0x8A98, 0xBBA5, 0x8A91, + 0xBBA6, 0x8A9A, 0xBBA7, 0x8AA7, 0xBBA8, 0x8C6A, 0xBBA9, 0x8C8D, + 0xBBAA, 0x8C8C, 0xBBAB, 0x8CD3, 0xBBAC, 0x8CD1, 0xBBAD, 0x8CD2, + 0xBBAE, 0x8D6B, 0xBBAF, 0x8D99, 0xBBB0, 0x8D95, 0xBBB1, 0x8DFC, + 0xBBB2, 0x8F14, 0xBBB3, 0x8F12, 0xBBB4, 0x8F15, 0xBBB5, 0x8F13, + 0xBBB6, 0x8FA3, 0xBBB7, 0x9060, 0xBBB8, 0x9058, 0xBBB9, 0x905C, + 0xBBBA, 0x9063, 0xBBBB, 0x9059, 0xBBBC, 0x905E, 0xBBBD, 0x9062, + 0xBBBE, 0x905D, 0xBBBF, 0x905B, 0xBBC0, 0x9119, 0xBBC1, 0x9118, + 0xBBC2, 0x911E, 0xBBC3, 0x9175, 0xBBC4, 0x9178, 0xBBC5, 0x9177, + 0xBBC6, 0x9174, 0xBBC7, 0x9278, 0xBBC8, 0x9280, 0xBBC9, 0x9285, + 0xBBCA, 0x9298, 0xBBCB, 0x9296, 0xBBCC, 0x927B, 0xBBCD, 0x9293, + 0xBBCE, 0x929C, 0xBBCF, 0x92A8, 0xBBD0, 0x927C, 0xBBD1, 0x9291, + 0xBBD2, 0x95A1, 0xBBD3, 0x95A8, 0xBBD4, 0x95A9, 0xBBD5, 0x95A3, + 0xBBD6, 0x95A5, 0xBBD7, 0x95A4, 0xBBD8, 0x9699, 0xBBD9, 0x969C, + 0xBBDA, 0x969B, 0xBBDB, 0x96CC, 0xBBDC, 0x96D2, 0xBBDD, 0x9700, + 0xBBDE, 0x977C, 0xBBDF, 0x9785, 0xBBE0, 0x97F6, 0xBBE1, 0x9817, + 0xBBE2, 0x9818, 0xBBE3, 0x98AF, 0xBBE4, 0x98B1, 0xBBE5, 0x9903, + 0xBBE6, 0x9905, 0xBBE7, 0x990C, 0xBBE8, 0x9909, 0xBBE9, 0x99C1, + 0xBBEA, 0x9AAF, 0xBBEB, 0x9AB0, 0xBBEC, 0x9AE6, 0xBBED, 0x9B41, + 0xBBEE, 0x9B42, 0xBBEF, 0x9CF4, 0xBBF0, 0x9CF6, 0xBBF1, 0x9CF3, + 0xBBF2, 0x9EBC, 0xBBF3, 0x9F3B, 0xBBF4, 0x9F4A, 0xBBF5, 0x5104, + 0xBBF6, 0x5100, 0xBBF7, 0x50FB, 0xBBF8, 0x50F5, 0xBBF9, 0x50F9, + 0xBBFA, 0x5102, 0xBBFB, 0x5108, 0xBBFC, 0x5109, 0xBBFD, 0x5105, + 0xBBFE, 0x51DC, 0xBC40, 0x5287, 0xBC41, 0x5288, 0xBC42, 0x5289, + 0xBC43, 0x528D, 0xBC44, 0x528A, 0xBC45, 0x52F0, 0xBC46, 0x53B2, + 0xBC47, 0x562E, 0xBC48, 0x563B, 0xBC49, 0x5639, 0xBC4A, 0x5632, + 0xBC4B, 0x563F, 0xBC4C, 0x5634, 0xBC4D, 0x5629, 0xBC4E, 0x5653, + 0xBC4F, 0x564E, 0xBC50, 0x5657, 0xBC51, 0x5674, 0xBC52, 0x5636, + 0xBC53, 0x562F, 0xBC54, 0x5630, 0xBC55, 0x5880, 0xBC56, 0x589F, + 0xBC57, 0x589E, 0xBC58, 0x58B3, 0xBC59, 0x589C, 0xBC5A, 0x58AE, + 0xBC5B, 0x58A9, 0xBC5C, 0x58A6, 0xBC5D, 0x596D, 0xBC5E, 0x5B09, + 0xBC5F, 0x5AFB, 0xBC60, 0x5B0B, 0xBC61, 0x5AF5, 0xBC62, 0x5B0C, + 0xBC63, 0x5B08, 0xBC64, 0x5BEE, 0xBC65, 0x5BEC, 0xBC66, 0x5BE9, + 0xBC67, 0x5BEB, 0xBC68, 0x5C64, 0xBC69, 0x5C65, 0xBC6A, 0x5D9D, + 0xBC6B, 0x5D94, 0xBC6C, 0x5E62, 0xBC6D, 0x5E5F, 0xBC6E, 0x5E61, + 0xBC6F, 0x5EE2, 0xBC70, 0x5EDA, 0xBC71, 0x5EDF, 0xBC72, 0x5EDD, + 0xBC73, 0x5EE3, 0xBC74, 0x5EE0, 0xBC75, 0x5F48, 0xBC76, 0x5F71, + 0xBC77, 0x5FB7, 0xBC78, 0x5FB5, 0xBC79, 0x6176, 0xBC7A, 0x6167, + 0xBC7B, 0x616E, 0xBC7C, 0x615D, 0xBC7D, 0x6155, 0xBC7E, 0x6182, + 0xBCA1, 0x617C, 0xBCA2, 0x6170, 0xBCA3, 0x616B, 0xBCA4, 0x617E, + 0xBCA5, 0x61A7, 0xBCA6, 0x6190, 0xBCA7, 0x61AB, 0xBCA8, 0x618E, + 0xBCA9, 0x61AC, 0xBCAA, 0x619A, 0xBCAB, 0x61A4, 0xBCAC, 0x6194, + 0xBCAD, 0x61AE, 0xBCAE, 0x622E, 0xBCAF, 0x6469, 0xBCB0, 0x646F, + 0xBCB1, 0x6479, 0xBCB2, 0x649E, 0xBCB3, 0x64B2, 0xBCB4, 0x6488, + 0xBCB5, 0x6490, 0xBCB6, 0x64B0, 0xBCB7, 0x64A5, 0xBCB8, 0x6493, + 0xBCB9, 0x6495, 0xBCBA, 0x64A9, 0xBCBB, 0x6492, 0xBCBC, 0x64AE, + 0xBCBD, 0x64AD, 0xBCBE, 0x64AB, 0xBCBF, 0x649A, 0xBCC0, 0x64AC, + 0xBCC1, 0x6499, 0xBCC2, 0x64A2, 0xBCC3, 0x64B3, 0xBCC4, 0x6575, + 0xBCC5, 0x6577, 0xBCC6, 0x6578, 0xBCC7, 0x66AE, 0xBCC8, 0x66AB, + 0xBCC9, 0x66B4, 0xBCCA, 0x66B1, 0xBCCB, 0x6A23, 0xBCCC, 0x6A1F, + 0xBCCD, 0x69E8, 0xBCCE, 0x6A01, 0xBCCF, 0x6A1E, 0xBCD0, 0x6A19, + 0xBCD1, 0x69FD, 0xBCD2, 0x6A21, 0xBCD3, 0x6A13, 0xBCD4, 0x6A0A, + 0xBCD5, 0x69F3, 0xBCD6, 0x6A02, 0xBCD7, 0x6A05, 0xBCD8, 0x69ED, + 0xBCD9, 0x6A11, 0xBCDA, 0x6B50, 0xBCDB, 0x6B4E, 0xBCDC, 0x6BA4, + 0xBCDD, 0x6BC5, 0xBCDE, 0x6BC6, 0xBCDF, 0x6F3F, 0xBCE0, 0x6F7C, + 0xBCE1, 0x6F84, 0xBCE2, 0x6F51, 0xBCE3, 0x6F66, 0xBCE4, 0x6F54, + 0xBCE5, 0x6F86, 0xBCE6, 0x6F6D, 0xBCE7, 0x6F5B, 0xBCE8, 0x6F78, + 0xBCE9, 0x6F6E, 0xBCEA, 0x6F8E, 0xBCEB, 0x6F7A, 0xBCEC, 0x6F70, + 0xBCED, 0x6F64, 0xBCEE, 0x6F97, 0xBCEF, 0x6F58, 0xBCF0, 0x6ED5, + 0xBCF1, 0x6F6F, 0xBCF2, 0x6F60, 0xBCF3, 0x6F5F, 0xBCF4, 0x719F, + 0xBCF5, 0x71AC, 0xBCF6, 0x71B1, 0xBCF7, 0x71A8, 0xBCF8, 0x7256, + 0xBCF9, 0x729B, 0xBCFA, 0x734E, 0xBCFB, 0x7357, 0xBCFC, 0x7469, + 0xBCFD, 0x748B, 0xBCFE, 0x7483, 0xBD40, 0x747E, 0xBD41, 0x7480, + 0xBD42, 0x757F, 0xBD43, 0x7620, 0xBD44, 0x7629, 0xBD45, 0x761F, + 0xBD46, 0x7624, 0xBD47, 0x7626, 0xBD48, 0x7621, 0xBD49, 0x7622, + 0xBD4A, 0x769A, 0xBD4B, 0x76BA, 0xBD4C, 0x76E4, 0xBD4D, 0x778E, + 0xBD4E, 0x7787, 0xBD4F, 0x778C, 0xBD50, 0x7791, 0xBD51, 0x778B, + 0xBD52, 0x78CB, 0xBD53, 0x78C5, 0xBD54, 0x78BA, 0xBD55, 0x78CA, + 0xBD56, 0x78BE, 0xBD57, 0x78D5, 0xBD58, 0x78BC, 0xBD59, 0x78D0, + 0xBD5A, 0x7A3F, 0xBD5B, 0x7A3C, 0xBD5C, 0x7A40, 0xBD5D, 0x7A3D, + 0xBD5E, 0x7A37, 0xBD5F, 0x7A3B, 0xBD60, 0x7AAF, 0xBD61, 0x7AAE, + 0xBD62, 0x7BAD, 0xBD63, 0x7BB1, 0xBD64, 0x7BC4, 0xBD65, 0x7BB4, + 0xBD66, 0x7BC6, 0xBD67, 0x7BC7, 0xBD68, 0x7BC1, 0xBD69, 0x7BA0, + 0xBD6A, 0x7BCC, 0xBD6B, 0x7CCA, 0xBD6C, 0x7DE0, 0xBD6D, 0x7DF4, + 0xBD6E, 0x7DEF, 0xBD6F, 0x7DFB, 0xBD70, 0x7DD8, 0xBD71, 0x7DEC, + 0xBD72, 0x7DDD, 0xBD73, 0x7DE8, 0xBD74, 0x7DE3, 0xBD75, 0x7DDA, + 0xBD76, 0x7DDE, 0xBD77, 0x7DE9, 0xBD78, 0x7D9E, 0xBD79, 0x7DD9, + 0xBD7A, 0x7DF2, 0xBD7B, 0x7DF9, 0xBD7C, 0x7F75, 0xBD7D, 0x7F77, + 0xBD7E, 0x7FAF, 0xBDA1, 0x7FE9, 0xBDA2, 0x8026, 0xBDA3, 0x819B, + 0xBDA4, 0x819C, 0xBDA5, 0x819D, 0xBDA6, 0x81A0, 0xBDA7, 0x819A, + 0xBDA8, 0x8198, 0xBDA9, 0x8517, 0xBDAA, 0x853D, 0xBDAB, 0x851A, + 0xBDAC, 0x84EE, 0xBDAD, 0x852C, 0xBDAE, 0x852D, 0xBDAF, 0x8513, + 0xBDB0, 0x8511, 0xBDB1, 0x8523, 0xBDB2, 0x8521, 0xBDB3, 0x8514, + 0xBDB4, 0x84EC, 0xBDB5, 0x8525, 0xBDB6, 0x84FF, 0xBDB7, 0x8506, + 0xBDB8, 0x8782, 0xBDB9, 0x8774, 0xBDBA, 0x8776, 0xBDBB, 0x8760, + 0xBDBC, 0x8766, 0xBDBD, 0x8778, 0xBDBE, 0x8768, 0xBDBF, 0x8759, + 0xBDC0, 0x8757, 0xBDC1, 0x874C, 0xBDC2, 0x8753, 0xBDC3, 0x885B, + 0xBDC4, 0x885D, 0xBDC5, 0x8910, 0xBDC6, 0x8907, 0xBDC7, 0x8912, + 0xBDC8, 0x8913, 0xBDC9, 0x8915, 0xBDCA, 0x890A, 0xBDCB, 0x8ABC, + 0xBDCC, 0x8AD2, 0xBDCD, 0x8AC7, 0xBDCE, 0x8AC4, 0xBDCF, 0x8A95, + 0xBDD0, 0x8ACB, 0xBDD1, 0x8AF8, 0xBDD2, 0x8AB2, 0xBDD3, 0x8AC9, + 0xBDD4, 0x8AC2, 0xBDD5, 0x8ABF, 0xBDD6, 0x8AB0, 0xBDD7, 0x8AD6, + 0xBDD8, 0x8ACD, 0xBDD9, 0x8AB6, 0xBDDA, 0x8AB9, 0xBDDB, 0x8ADB, + 0xBDDC, 0x8C4C, 0xBDDD, 0x8C4E, 0xBDDE, 0x8C6C, 0xBDDF, 0x8CE0, + 0xBDE0, 0x8CDE, 0xBDE1, 0x8CE6, 0xBDE2, 0x8CE4, 0xBDE3, 0x8CEC, + 0xBDE4, 0x8CED, 0xBDE5, 0x8CE2, 0xBDE6, 0x8CE3, 0xBDE7, 0x8CDC, + 0xBDE8, 0x8CEA, 0xBDE9, 0x8CE1, 0xBDEA, 0x8D6D, 0xBDEB, 0x8D9F, + 0xBDEC, 0x8DA3, 0xBDED, 0x8E2B, 0xBDEE, 0x8E10, 0xBDEF, 0x8E1D, + 0xBDF0, 0x8E22, 0xBDF1, 0x8E0F, 0xBDF2, 0x8E29, 0xBDF3, 0x8E1F, + 0xBDF4, 0x8E21, 0xBDF5, 0x8E1E, 0xBDF6, 0x8EBA, 0xBDF7, 0x8F1D, + 0xBDF8, 0x8F1B, 0xBDF9, 0x8F1F, 0xBDFA, 0x8F29, 0xBDFB, 0x8F26, + 0xBDFC, 0x8F2A, 0xBDFD, 0x8F1C, 0xBDFE, 0x8F1E, 0xBE40, 0x8F25, + 0xBE41, 0x9069, 0xBE42, 0x906E, 0xBE43, 0x9068, 0xBE44, 0x906D, + 0xBE45, 0x9077, 0xBE46, 0x9130, 0xBE47, 0x912D, 0xBE48, 0x9127, + 0xBE49, 0x9131, 0xBE4A, 0x9187, 0xBE4B, 0x9189, 0xBE4C, 0x918B, + 0xBE4D, 0x9183, 0xBE4E, 0x92C5, 0xBE4F, 0x92BB, 0xBE50, 0x92B7, + 0xBE51, 0x92EA, 0xBE52, 0x92AC, 0xBE53, 0x92E4, 0xBE54, 0x92C1, + 0xBE55, 0x92B3, 0xBE56, 0x92BC, 0xBE57, 0x92D2, 0xBE58, 0x92C7, + 0xBE59, 0x92F0, 0xBE5A, 0x92B2, 0xBE5B, 0x95AD, 0xBE5C, 0x95B1, + 0xBE5D, 0x9704, 0xBE5E, 0x9706, 0xBE5F, 0x9707, 0xBE60, 0x9709, + 0xBE61, 0x9760, 0xBE62, 0x978D, 0xBE63, 0x978B, 0xBE64, 0x978F, + 0xBE65, 0x9821, 0xBE66, 0x982B, 0xBE67, 0x981C, 0xBE68, 0x98B3, + 0xBE69, 0x990A, 0xBE6A, 0x9913, 0xBE6B, 0x9912, 0xBE6C, 0x9918, + 0xBE6D, 0x99DD, 0xBE6E, 0x99D0, 0xBE6F, 0x99DF, 0xBE70, 0x99DB, + 0xBE71, 0x99D1, 0xBE72, 0x99D5, 0xBE73, 0x99D2, 0xBE74, 0x99D9, + 0xBE75, 0x9AB7, 0xBE76, 0x9AEE, 0xBE77, 0x9AEF, 0xBE78, 0x9B27, + 0xBE79, 0x9B45, 0xBE7A, 0x9B44, 0xBE7B, 0x9B77, 0xBE7C, 0x9B6F, + 0xBE7D, 0x9D06, 0xBE7E, 0x9D09, 0xBEA1, 0x9D03, 0xBEA2, 0x9EA9, + 0xBEA3, 0x9EBE, 0xBEA4, 0x9ECE, 0xBEA5, 0x58A8, 0xBEA6, 0x9F52, + 0xBEA7, 0x5112, 0xBEA8, 0x5118, 0xBEA9, 0x5114, 0xBEAA, 0x5110, + 0xBEAB, 0x5115, 0xBEAC, 0x5180, 0xBEAD, 0x51AA, 0xBEAE, 0x51DD, + 0xBEAF, 0x5291, 0xBEB0, 0x5293, 0xBEB1, 0x52F3, 0xBEB2, 0x5659, + 0xBEB3, 0x566B, 0xBEB4, 0x5679, 0xBEB5, 0x5669, 0xBEB6, 0x5664, + 0xBEB7, 0x5678, 0xBEB8, 0x566A, 0xBEB9, 0x5668, 0xBEBA, 0x5665, + 0xBEBB, 0x5671, 0xBEBC, 0x566F, 0xBEBD, 0x566C, 0xBEBE, 0x5662, + 0xBEBF, 0x5676, 0xBEC0, 0x58C1, 0xBEC1, 0x58BE, 0xBEC2, 0x58C7, + 0xBEC3, 0x58C5, 0xBEC4, 0x596E, 0xBEC5, 0x5B1D, 0xBEC6, 0x5B34, + 0xBEC7, 0x5B78, 0xBEC8, 0x5BF0, 0xBEC9, 0x5C0E, 0xBECA, 0x5F4A, + 0xBECB, 0x61B2, 0xBECC, 0x6191, 0xBECD, 0x61A9, 0xBECE, 0x618A, + 0xBECF, 0x61CD, 0xBED0, 0x61B6, 0xBED1, 0x61BE, 0xBED2, 0x61CA, + 0xBED3, 0x61C8, 0xBED4, 0x6230, 0xBED5, 0x64C5, 0xBED6, 0x64C1, + 0xBED7, 0x64CB, 0xBED8, 0x64BB, 0xBED9, 0x64BC, 0xBEDA, 0x64DA, + 0xBEDB, 0x64C4, 0xBEDC, 0x64C7, 0xBEDD, 0x64C2, 0xBEDE, 0x64CD, + 0xBEDF, 0x64BF, 0xBEE0, 0x64D2, 0xBEE1, 0x64D4, 0xBEE2, 0x64BE, + 0xBEE3, 0x6574, 0xBEE4, 0x66C6, 0xBEE5, 0x66C9, 0xBEE6, 0x66B9, + 0xBEE7, 0x66C4, 0xBEE8, 0x66C7, 0xBEE9, 0x66B8, 0xBEEA, 0x6A3D, + 0xBEEB, 0x6A38, 0xBEEC, 0x6A3A, 0xBEED, 0x6A59, 0xBEEE, 0x6A6B, + 0xBEEF, 0x6A58, 0xBEF0, 0x6A39, 0xBEF1, 0x6A44, 0xBEF2, 0x6A62, + 0xBEF3, 0x6A61, 0xBEF4, 0x6A4B, 0xBEF5, 0x6A47, 0xBEF6, 0x6A35, + 0xBEF7, 0x6A5F, 0xBEF8, 0x6A48, 0xBEF9, 0x6B59, 0xBEFA, 0x6B77, + 0xBEFB, 0x6C05, 0xBEFC, 0x6FC2, 0xBEFD, 0x6FB1, 0xBEFE, 0x6FA1, + 0xBF40, 0x6FC3, 0xBF41, 0x6FA4, 0xBF42, 0x6FC1, 0xBF43, 0x6FA7, + 0xBF44, 0x6FB3, 0xBF45, 0x6FC0, 0xBF46, 0x6FB9, 0xBF47, 0x6FB6, + 0xBF48, 0x6FA6, 0xBF49, 0x6FA0, 0xBF4A, 0x6FB4, 0xBF4B, 0x71BE, + 0xBF4C, 0x71C9, 0xBF4D, 0x71D0, 0xBF4E, 0x71D2, 0xBF4F, 0x71C8, + 0xBF50, 0x71D5, 0xBF51, 0x71B9, 0xBF52, 0x71CE, 0xBF53, 0x71D9, + 0xBF54, 0x71DC, 0xBF55, 0x71C3, 0xBF56, 0x71C4, 0xBF57, 0x7368, + 0xBF58, 0x749C, 0xBF59, 0x74A3, 0xBF5A, 0x7498, 0xBF5B, 0x749F, + 0xBF5C, 0x749E, 0xBF5D, 0x74E2, 0xBF5E, 0x750C, 0xBF5F, 0x750D, + 0xBF60, 0x7634, 0xBF61, 0x7638, 0xBF62, 0x763A, 0xBF63, 0x76E7, + 0xBF64, 0x76E5, 0xBF65, 0x77A0, 0xBF66, 0x779E, 0xBF67, 0x779F, + 0xBF68, 0x77A5, 0xBF69, 0x78E8, 0xBF6A, 0x78DA, 0xBF6B, 0x78EC, + 0xBF6C, 0x78E7, 0xBF6D, 0x79A6, 0xBF6E, 0x7A4D, 0xBF6F, 0x7A4E, + 0xBF70, 0x7A46, 0xBF71, 0x7A4C, 0xBF72, 0x7A4B, 0xBF73, 0x7ABA, + 0xBF74, 0x7BD9, 0xBF75, 0x7C11, 0xBF76, 0x7BC9, 0xBF77, 0x7BE4, + 0xBF78, 0x7BDB, 0xBF79, 0x7BE1, 0xBF7A, 0x7BE9, 0xBF7B, 0x7BE6, + 0xBF7C, 0x7CD5, 0xBF7D, 0x7CD6, 0xBF7E, 0x7E0A, 0xBFA1, 0x7E11, + 0xBFA2, 0x7E08, 0xBFA3, 0x7E1B, 0xBFA4, 0x7E23, 0xBFA5, 0x7E1E, + 0xBFA6, 0x7E1D, 0xBFA7, 0x7E09, 0xBFA8, 0x7E10, 0xBFA9, 0x7F79, + 0xBFAA, 0x7FB2, 0xBFAB, 0x7FF0, 0xBFAC, 0x7FF1, 0xBFAD, 0x7FEE, + 0xBFAE, 0x8028, 0xBFAF, 0x81B3, 0xBFB0, 0x81A9, 0xBFB1, 0x81A8, + 0xBFB2, 0x81FB, 0xBFB3, 0x8208, 0xBFB4, 0x8258, 0xBFB5, 0x8259, + 0xBFB6, 0x854A, 0xBFB7, 0x8559, 0xBFB8, 0x8548, 0xBFB9, 0x8568, + 0xBFBA, 0x8569, 0xBFBB, 0x8543, 0xBFBC, 0x8549, 0xBFBD, 0x856D, + 0xBFBE, 0x856A, 0xBFBF, 0x855E, 0xBFC0, 0x8783, 0xBFC1, 0x879F, + 0xBFC2, 0x879E, 0xBFC3, 0x87A2, 0xBFC4, 0x878D, 0xBFC5, 0x8861, + 0xBFC6, 0x892A, 0xBFC7, 0x8932, 0xBFC8, 0x8925, 0xBFC9, 0x892B, + 0xBFCA, 0x8921, 0xBFCB, 0x89AA, 0xBFCC, 0x89A6, 0xBFCD, 0x8AE6, + 0xBFCE, 0x8AFA, 0xBFCF, 0x8AEB, 0xBFD0, 0x8AF1, 0xBFD1, 0x8B00, + 0xBFD2, 0x8ADC, 0xBFD3, 0x8AE7, 0xBFD4, 0x8AEE, 0xBFD5, 0x8AFE, + 0xBFD6, 0x8B01, 0xBFD7, 0x8B02, 0xBFD8, 0x8AF7, 0xBFD9, 0x8AED, + 0xBFDA, 0x8AF3, 0xBFDB, 0x8AF6, 0xBFDC, 0x8AFC, 0xBFDD, 0x8C6B, + 0xBFDE, 0x8C6D, 0xBFDF, 0x8C93, 0xBFE0, 0x8CF4, 0xBFE1, 0x8E44, + 0xBFE2, 0x8E31, 0xBFE3, 0x8E34, 0xBFE4, 0x8E42, 0xBFE5, 0x8E39, + 0xBFE6, 0x8E35, 0xBFE7, 0x8F3B, 0xBFE8, 0x8F2F, 0xBFE9, 0x8F38, + 0xBFEA, 0x8F33, 0xBFEB, 0x8FA8, 0xBFEC, 0x8FA6, 0xBFED, 0x9075, + 0xBFEE, 0x9074, 0xBFEF, 0x9078, 0xBFF0, 0x9072, 0xBFF1, 0x907C, + 0xBFF2, 0x907A, 0xBFF3, 0x9134, 0xBFF4, 0x9192, 0xBFF5, 0x9320, + 0xBFF6, 0x9336, 0xBFF7, 0x92F8, 0xBFF8, 0x9333, 0xBFF9, 0x932F, + 0xBFFA, 0x9322, 0xBFFB, 0x92FC, 0xBFFC, 0x932B, 0xBFFD, 0x9304, + 0xBFFE, 0x931A, 0xC040, 0x9310, 0xC041, 0x9326, 0xC042, 0x9321, + 0xC043, 0x9315, 0xC044, 0x932E, 0xC045, 0x9319, 0xC046, 0x95BB, + 0xC047, 0x96A7, 0xC048, 0x96A8, 0xC049, 0x96AA, 0xC04A, 0x96D5, + 0xC04B, 0x970E, 0xC04C, 0x9711, 0xC04D, 0x9716, 0xC04E, 0x970D, + 0xC04F, 0x9713, 0xC050, 0x970F, 0xC051, 0x975B, 0xC052, 0x975C, + 0xC053, 0x9766, 0xC054, 0x9798, 0xC055, 0x9830, 0xC056, 0x9838, + 0xC057, 0x983B, 0xC058, 0x9837, 0xC059, 0x982D, 0xC05A, 0x9839, + 0xC05B, 0x9824, 0xC05C, 0x9910, 0xC05D, 0x9928, 0xC05E, 0x991E, + 0xC05F, 0x991B, 0xC060, 0x9921, 0xC061, 0x991A, 0xC062, 0x99ED, + 0xC063, 0x99E2, 0xC064, 0x99F1, 0xC065, 0x9AB8, 0xC066, 0x9ABC, + 0xC067, 0x9AFB, 0xC068, 0x9AED, 0xC069, 0x9B28, 0xC06A, 0x9B91, + 0xC06B, 0x9D15, 0xC06C, 0x9D23, 0xC06D, 0x9D26, 0xC06E, 0x9D28, + 0xC06F, 0x9D12, 0xC070, 0x9D1B, 0xC071, 0x9ED8, 0xC072, 0x9ED4, + 0xC073, 0x9F8D, 0xC074, 0x9F9C, 0xC075, 0x512A, 0xC076, 0x511F, + 0xC077, 0x5121, 0xC078, 0x5132, 0xC079, 0x52F5, 0xC07A, 0x568E, + 0xC07B, 0x5680, 0xC07C, 0x5690, 0xC07D, 0x5685, 0xC07E, 0x5687, + 0xC0A1, 0x568F, 0xC0A2, 0x58D5, 0xC0A3, 0x58D3, 0xC0A4, 0x58D1, + 0xC0A5, 0x58CE, 0xC0A6, 0x5B30, 0xC0A7, 0x5B2A, 0xC0A8, 0x5B24, + 0xC0A9, 0x5B7A, 0xC0AA, 0x5C37, 0xC0AB, 0x5C68, 0xC0AC, 0x5DBC, + 0xC0AD, 0x5DBA, 0xC0AE, 0x5DBD, 0xC0AF, 0x5DB8, 0xC0B0, 0x5E6B, + 0xC0B1, 0x5F4C, 0xC0B2, 0x5FBD, 0xC0B3, 0x61C9, 0xC0B4, 0x61C2, + 0xC0B5, 0x61C7, 0xC0B6, 0x61E6, 0xC0B7, 0x61CB, 0xC0B8, 0x6232, + 0xC0B9, 0x6234, 0xC0BA, 0x64CE, 0xC0BB, 0x64CA, 0xC0BC, 0x64D8, + 0xC0BD, 0x64E0, 0xC0BE, 0x64F0, 0xC0BF, 0x64E6, 0xC0C0, 0x64EC, + 0xC0C1, 0x64F1, 0xC0C2, 0x64E2, 0xC0C3, 0x64ED, 0xC0C4, 0x6582, + 0xC0C5, 0x6583, 0xC0C6, 0x66D9, 0xC0C7, 0x66D6, 0xC0C8, 0x6A80, + 0xC0C9, 0x6A94, 0xC0CA, 0x6A84, 0xC0CB, 0x6AA2, 0xC0CC, 0x6A9C, + 0xC0CD, 0x6ADB, 0xC0CE, 0x6AA3, 0xC0CF, 0x6A7E, 0xC0D0, 0x6A97, + 0xC0D1, 0x6A90, 0xC0D2, 0x6AA0, 0xC0D3, 0x6B5C, 0xC0D4, 0x6BAE, + 0xC0D5, 0x6BDA, 0xC0D6, 0x6C08, 0xC0D7, 0x6FD8, 0xC0D8, 0x6FF1, + 0xC0D9, 0x6FDF, 0xC0DA, 0x6FE0, 0xC0DB, 0x6FDB, 0xC0DC, 0x6FE4, + 0xC0DD, 0x6FEB, 0xC0DE, 0x6FEF, 0xC0DF, 0x6F80, 0xC0E0, 0x6FEC, + 0xC0E1, 0x6FE1, 0xC0E2, 0x6FE9, 0xC0E3, 0x6FD5, 0xC0E4, 0x6FEE, + 0xC0E5, 0x6FF0, 0xC0E6, 0x71E7, 0xC0E7, 0x71DF, 0xC0E8, 0x71EE, + 0xC0E9, 0x71E6, 0xC0EA, 0x71E5, 0xC0EB, 0x71ED, 0xC0EC, 0x71EC, + 0xC0ED, 0x71F4, 0xC0EE, 0x71E0, 0xC0EF, 0x7235, 0xC0F0, 0x7246, + 0xC0F1, 0x7370, 0xC0F2, 0x7372, 0xC0F3, 0x74A9, 0xC0F4, 0x74B0, + 0xC0F5, 0x74A6, 0xC0F6, 0x74A8, 0xC0F7, 0x7646, 0xC0F8, 0x7642, + 0xC0F9, 0x764C, 0xC0FA, 0x76EA, 0xC0FB, 0x77B3, 0xC0FC, 0x77AA, + 0xC0FD, 0x77B0, 0xC0FE, 0x77AC, 0xC140, 0x77A7, 0xC141, 0x77AD, + 0xC142, 0x77EF, 0xC143, 0x78F7, 0xC144, 0x78FA, 0xC145, 0x78F4, + 0xC146, 0x78EF, 0xC147, 0x7901, 0xC148, 0x79A7, 0xC149, 0x79AA, + 0xC14A, 0x7A57, 0xC14B, 0x7ABF, 0xC14C, 0x7C07, 0xC14D, 0x7C0D, + 0xC14E, 0x7BFE, 0xC14F, 0x7BF7, 0xC150, 0x7C0C, 0xC151, 0x7BE0, + 0xC152, 0x7CE0, 0xC153, 0x7CDC, 0xC154, 0x7CDE, 0xC155, 0x7CE2, + 0xC156, 0x7CDF, 0xC157, 0x7CD9, 0xC158, 0x7CDD, 0xC159, 0x7E2E, + 0xC15A, 0x7E3E, 0xC15B, 0x7E46, 0xC15C, 0x7E37, 0xC15D, 0x7E32, + 0xC15E, 0x7E43, 0xC15F, 0x7E2B, 0xC160, 0x7E3D, 0xC161, 0x7E31, + 0xC162, 0x7E45, 0xC163, 0x7E41, 0xC164, 0x7E34, 0xC165, 0x7E39, + 0xC166, 0x7E48, 0xC167, 0x7E35, 0xC168, 0x7E3F, 0xC169, 0x7E2F, + 0xC16A, 0x7F44, 0xC16B, 0x7FF3, 0xC16C, 0x7FFC, 0xC16D, 0x8071, + 0xC16E, 0x8072, 0xC16F, 0x8070, 0xC170, 0x806F, 0xC171, 0x8073, + 0xC172, 0x81C6, 0xC173, 0x81C3, 0xC174, 0x81BA, 0xC175, 0x81C2, + 0xC176, 0x81C0, 0xC177, 0x81BF, 0xC178, 0x81BD, 0xC179, 0x81C9, + 0xC17A, 0x81BE, 0xC17B, 0x81E8, 0xC17C, 0x8209, 0xC17D, 0x8271, + 0xC17E, 0x85AA, 0xC1A1, 0x8584, 0xC1A2, 0x857E, 0xC1A3, 0x859C, + 0xC1A4, 0x8591, 0xC1A5, 0x8594, 0xC1A6, 0x85AF, 0xC1A7, 0x859B, + 0xC1A8, 0x8587, 0xC1A9, 0x85A8, 0xC1AA, 0x858A, 0xC1AB, 0x8667, + 0xC1AC, 0x87C0, 0xC1AD, 0x87D1, 0xC1AE, 0x87B3, 0xC1AF, 0x87D2, + 0xC1B0, 0x87C6, 0xC1B1, 0x87AB, 0xC1B2, 0x87BB, 0xC1B3, 0x87BA, + 0xC1B4, 0x87C8, 0xC1B5, 0x87CB, 0xC1B6, 0x893B, 0xC1B7, 0x8936, + 0xC1B8, 0x8944, 0xC1B9, 0x8938, 0xC1BA, 0x893D, 0xC1BB, 0x89AC, + 0xC1BC, 0x8B0E, 0xC1BD, 0x8B17, 0xC1BE, 0x8B19, 0xC1BF, 0x8B1B, + 0xC1C0, 0x8B0A, 0xC1C1, 0x8B20, 0xC1C2, 0x8B1D, 0xC1C3, 0x8B04, + 0xC1C4, 0x8B10, 0xC1C5, 0x8C41, 0xC1C6, 0x8C3F, 0xC1C7, 0x8C73, + 0xC1C8, 0x8CFA, 0xC1C9, 0x8CFD, 0xC1CA, 0x8CFC, 0xC1CB, 0x8CF8, + 0xC1CC, 0x8CFB, 0xC1CD, 0x8DA8, 0xC1CE, 0x8E49, 0xC1CF, 0x8E4B, + 0xC1D0, 0x8E48, 0xC1D1, 0x8E4A, 0xC1D2, 0x8F44, 0xC1D3, 0x8F3E, + 0xC1D4, 0x8F42, 0xC1D5, 0x8F45, 0xC1D6, 0x8F3F, 0xC1D7, 0x907F, + 0xC1D8, 0x907D, 0xC1D9, 0x9084, 0xC1DA, 0x9081, 0xC1DB, 0x9082, + 0xC1DC, 0x9080, 0xC1DD, 0x9139, 0xC1DE, 0x91A3, 0xC1DF, 0x919E, + 0xC1E0, 0x919C, 0xC1E1, 0x934D, 0xC1E2, 0x9382, 0xC1E3, 0x9328, + 0xC1E4, 0x9375, 0xC1E5, 0x934A, 0xC1E6, 0x9365, 0xC1E7, 0x934B, + 0xC1E8, 0x9318, 0xC1E9, 0x937E, 0xC1EA, 0x936C, 0xC1EB, 0x935B, + 0xC1EC, 0x9370, 0xC1ED, 0x935A, 0xC1EE, 0x9354, 0xC1EF, 0x95CA, + 0xC1F0, 0x95CB, 0xC1F1, 0x95CC, 0xC1F2, 0x95C8, 0xC1F3, 0x95C6, + 0xC1F4, 0x96B1, 0xC1F5, 0x96B8, 0xC1F6, 0x96D6, 0xC1F7, 0x971C, + 0xC1F8, 0x971E, 0xC1F9, 0x97A0, 0xC1FA, 0x97D3, 0xC1FB, 0x9846, + 0xC1FC, 0x98B6, 0xC1FD, 0x9935, 0xC1FE, 0x9A01, 0xC240, 0x99FF, + 0xC241, 0x9BAE, 0xC242, 0x9BAB, 0xC243, 0x9BAA, 0xC244, 0x9BAD, + 0xC245, 0x9D3B, 0xC246, 0x9D3F, 0xC247, 0x9E8B, 0xC248, 0x9ECF, + 0xC249, 0x9EDE, 0xC24A, 0x9EDC, 0xC24B, 0x9EDD, 0xC24C, 0x9EDB, + 0xC24D, 0x9F3E, 0xC24E, 0x9F4B, 0xC24F, 0x53E2, 0xC250, 0x5695, + 0xC251, 0x56AE, 0xC252, 0x58D9, 0xC253, 0x58D8, 0xC254, 0x5B38, + 0xC255, 0x5F5D, 0xC256, 0x61E3, 0xC257, 0x6233, 0xC258, 0x64F4, + 0xC259, 0x64F2, 0xC25A, 0x64FE, 0xC25B, 0x6506, 0xC25C, 0x64FA, + 0xC25D, 0x64FB, 0xC25E, 0x64F7, 0xC25F, 0x65B7, 0xC260, 0x66DC, + 0xC261, 0x6726, 0xC262, 0x6AB3, 0xC263, 0x6AAC, 0xC264, 0x6AC3, + 0xC265, 0x6ABB, 0xC266, 0x6AB8, 0xC267, 0x6AC2, 0xC268, 0x6AAE, + 0xC269, 0x6AAF, 0xC26A, 0x6B5F, 0xC26B, 0x6B78, 0xC26C, 0x6BAF, + 0xC26D, 0x7009, 0xC26E, 0x700B, 0xC26F, 0x6FFE, 0xC270, 0x7006, + 0xC271, 0x6FFA, 0xC272, 0x7011, 0xC273, 0x700F, 0xC274, 0x71FB, + 0xC275, 0x71FC, 0xC276, 0x71FE, 0xC277, 0x71F8, 0xC278, 0x7377, + 0xC279, 0x7375, 0xC27A, 0x74A7, 0xC27B, 0x74BF, 0xC27C, 0x7515, + 0xC27D, 0x7656, 0xC27E, 0x7658, 0xC2A1, 0x7652, 0xC2A2, 0x77BD, + 0xC2A3, 0x77BF, 0xC2A4, 0x77BB, 0xC2A5, 0x77BC, 0xC2A6, 0x790E, + 0xC2A7, 0x79AE, 0xC2A8, 0x7A61, 0xC2A9, 0x7A62, 0xC2AA, 0x7A60, + 0xC2AB, 0x7AC4, 0xC2AC, 0x7AC5, 0xC2AD, 0x7C2B, 0xC2AE, 0x7C27, + 0xC2AF, 0x7C2A, 0xC2B0, 0x7C1E, 0xC2B1, 0x7C23, 0xC2B2, 0x7C21, + 0xC2B3, 0x7CE7, 0xC2B4, 0x7E54, 0xC2B5, 0x7E55, 0xC2B6, 0x7E5E, + 0xC2B7, 0x7E5A, 0xC2B8, 0x7E61, 0xC2B9, 0x7E52, 0xC2BA, 0x7E59, + 0xC2BB, 0x7F48, 0xC2BC, 0x7FF9, 0xC2BD, 0x7FFB, 0xC2BE, 0x8077, + 0xC2BF, 0x8076, 0xC2C0, 0x81CD, 0xC2C1, 0x81CF, 0xC2C2, 0x820A, + 0xC2C3, 0x85CF, 0xC2C4, 0x85A9, 0xC2C5, 0x85CD, 0xC2C6, 0x85D0, + 0xC2C7, 0x85C9, 0xC2C8, 0x85B0, 0xC2C9, 0x85BA, 0xC2CA, 0x85B9, + 0xC2CB, 0x85A6, 0xC2CC, 0x87EF, 0xC2CD, 0x87EC, 0xC2CE, 0x87F2, + 0xC2CF, 0x87E0, 0xC2D0, 0x8986, 0xC2D1, 0x89B2, 0xC2D2, 0x89F4, + 0xC2D3, 0x8B28, 0xC2D4, 0x8B39, 0xC2D5, 0x8B2C, 0xC2D6, 0x8B2B, + 0xC2D7, 0x8C50, 0xC2D8, 0x8D05, 0xC2D9, 0x8E59, 0xC2DA, 0x8E63, + 0xC2DB, 0x8E66, 0xC2DC, 0x8E64, 0xC2DD, 0x8E5F, 0xC2DE, 0x8E55, + 0xC2DF, 0x8EC0, 0xC2E0, 0x8F49, 0xC2E1, 0x8F4D, 0xC2E2, 0x9087, + 0xC2E3, 0x9083, 0xC2E4, 0x9088, 0xC2E5, 0x91AB, 0xC2E6, 0x91AC, + 0xC2E7, 0x91D0, 0xC2E8, 0x9394, 0xC2E9, 0x938A, 0xC2EA, 0x9396, + 0xC2EB, 0x93A2, 0xC2EC, 0x93B3, 0xC2ED, 0x93AE, 0xC2EE, 0x93AC, + 0xC2EF, 0x93B0, 0xC2F0, 0x9398, 0xC2F1, 0x939A, 0xC2F2, 0x9397, + 0xC2F3, 0x95D4, 0xC2F4, 0x95D6, 0xC2F5, 0x95D0, 0xC2F6, 0x95D5, + 0xC2F7, 0x96E2, 0xC2F8, 0x96DC, 0xC2F9, 0x96D9, 0xC2FA, 0x96DB, + 0xC2FB, 0x96DE, 0xC2FC, 0x9724, 0xC2FD, 0x97A3, 0xC2FE, 0x97A6, + 0xC340, 0x97AD, 0xC341, 0x97F9, 0xC342, 0x984D, 0xC343, 0x984F, + 0xC344, 0x984C, 0xC345, 0x984E, 0xC346, 0x9853, 0xC347, 0x98BA, + 0xC348, 0x993E, 0xC349, 0x993F, 0xC34A, 0x993D, 0xC34B, 0x992E, + 0xC34C, 0x99A5, 0xC34D, 0x9A0E, 0xC34E, 0x9AC1, 0xC34F, 0x9B03, + 0xC350, 0x9B06, 0xC351, 0x9B4F, 0xC352, 0x9B4E, 0xC353, 0x9B4D, + 0xC354, 0x9BCA, 0xC355, 0x9BC9, 0xC356, 0x9BFD, 0xC357, 0x9BC8, + 0xC358, 0x9BC0, 0xC359, 0x9D51, 0xC35A, 0x9D5D, 0xC35B, 0x9D60, + 0xC35C, 0x9EE0, 0xC35D, 0x9F15, 0xC35E, 0x9F2C, 0xC35F, 0x5133, + 0xC360, 0x56A5, 0xC361, 0x58DE, 0xC362, 0x58DF, 0xC363, 0x58E2, + 0xC364, 0x5BF5, 0xC365, 0x9F90, 0xC366, 0x5EEC, 0xC367, 0x61F2, + 0xC368, 0x61F7, 0xC369, 0x61F6, 0xC36A, 0x61F5, 0xC36B, 0x6500, + 0xC36C, 0x650F, 0xC36D, 0x66E0, 0xC36E, 0x66DD, 0xC36F, 0x6AE5, + 0xC370, 0x6ADD, 0xC371, 0x6ADA, 0xC372, 0x6AD3, 0xC373, 0x701B, + 0xC374, 0x701F, 0xC375, 0x7028, 0xC376, 0x701A, 0xC377, 0x701D, + 0xC378, 0x7015, 0xC379, 0x7018, 0xC37A, 0x7206, 0xC37B, 0x720D, + 0xC37C, 0x7258, 0xC37D, 0x72A2, 0xC37E, 0x7378, 0xC3A1, 0x737A, + 0xC3A2, 0x74BD, 0xC3A3, 0x74CA, 0xC3A4, 0x74E3, 0xC3A5, 0x7587, + 0xC3A6, 0x7586, 0xC3A7, 0x765F, 0xC3A8, 0x7661, 0xC3A9, 0x77C7, + 0xC3AA, 0x7919, 0xC3AB, 0x79B1, 0xC3AC, 0x7A6B, 0xC3AD, 0x7A69, + 0xC3AE, 0x7C3E, 0xC3AF, 0x7C3F, 0xC3B0, 0x7C38, 0xC3B1, 0x7C3D, + 0xC3B2, 0x7C37, 0xC3B3, 0x7C40, 0xC3B4, 0x7E6B, 0xC3B5, 0x7E6D, + 0xC3B6, 0x7E79, 0xC3B7, 0x7E69, 0xC3B8, 0x7E6A, 0xC3B9, 0x7F85, + 0xC3BA, 0x7E73, 0xC3BB, 0x7FB6, 0xC3BC, 0x7FB9, 0xC3BD, 0x7FB8, + 0xC3BE, 0x81D8, 0xC3BF, 0x85E9, 0xC3C0, 0x85DD, 0xC3C1, 0x85EA, + 0xC3C2, 0x85D5, 0xC3C3, 0x85E4, 0xC3C4, 0x85E5, 0xC3C5, 0x85F7, + 0xC3C6, 0x87FB, 0xC3C7, 0x8805, 0xC3C8, 0x880D, 0xC3C9, 0x87F9, + 0xC3CA, 0x87FE, 0xC3CB, 0x8960, 0xC3CC, 0x895F, 0xC3CD, 0x8956, + 0xC3CE, 0x895E, 0xC3CF, 0x8B41, 0xC3D0, 0x8B5C, 0xC3D1, 0x8B58, + 0xC3D2, 0x8B49, 0xC3D3, 0x8B5A, 0xC3D4, 0x8B4E, 0xC3D5, 0x8B4F, + 0xC3D6, 0x8B46, 0xC3D7, 0x8B59, 0xC3D8, 0x8D08, 0xC3D9, 0x8D0A, + 0xC3DA, 0x8E7C, 0xC3DB, 0x8E72, 0xC3DC, 0x8E87, 0xC3DD, 0x8E76, + 0xC3DE, 0x8E6C, 0xC3DF, 0x8E7A, 0xC3E0, 0x8E74, 0xC3E1, 0x8F54, + 0xC3E2, 0x8F4E, 0xC3E3, 0x8FAD, 0xC3E4, 0x908A, 0xC3E5, 0x908B, + 0xC3E6, 0x91B1, 0xC3E7, 0x91AE, 0xC3E8, 0x93E1, 0xC3E9, 0x93D1, + 0xC3EA, 0x93DF, 0xC3EB, 0x93C3, 0xC3EC, 0x93C8, 0xC3ED, 0x93DC, + 0xC3EE, 0x93DD, 0xC3EF, 0x93D6, 0xC3F0, 0x93E2, 0xC3F1, 0x93CD, + 0xC3F2, 0x93D8, 0xC3F3, 0x93E4, 0xC3F4, 0x93D7, 0xC3F5, 0x93E8, + 0xC3F6, 0x95DC, 0xC3F7, 0x96B4, 0xC3F8, 0x96E3, 0xC3F9, 0x972A, + 0xC3FA, 0x9727, 0xC3FB, 0x9761, 0xC3FC, 0x97DC, 0xC3FD, 0x97FB, + 0xC3FE, 0x985E, 0xC440, 0x9858, 0xC441, 0x985B, 0xC442, 0x98BC, + 0xC443, 0x9945, 0xC444, 0x9949, 0xC445, 0x9A16, 0xC446, 0x9A19, + 0xC447, 0x9B0D, 0xC448, 0x9BE8, 0xC449, 0x9BE7, 0xC44A, 0x9BD6, + 0xC44B, 0x9BDB, 0xC44C, 0x9D89, 0xC44D, 0x9D61, 0xC44E, 0x9D72, + 0xC44F, 0x9D6A, 0xC450, 0x9D6C, 0xC451, 0x9E92, 0xC452, 0x9E97, + 0xC453, 0x9E93, 0xC454, 0x9EB4, 0xC455, 0x52F8, 0xC456, 0x56A8, + 0xC457, 0x56B7, 0xC458, 0x56B6, 0xC459, 0x56B4, 0xC45A, 0x56BC, + 0xC45B, 0x58E4, 0xC45C, 0x5B40, 0xC45D, 0x5B43, 0xC45E, 0x5B7D, + 0xC45F, 0x5BF6, 0xC460, 0x5DC9, 0xC461, 0x61F8, 0xC462, 0x61FA, + 0xC463, 0x6518, 0xC464, 0x6514, 0xC465, 0x6519, 0xC466, 0x66E6, + 0xC467, 0x6727, 0xC468, 0x6AEC, 0xC469, 0x703E, 0xC46A, 0x7030, + 0xC46B, 0x7032, 0xC46C, 0x7210, 0xC46D, 0x737B, 0xC46E, 0x74CF, + 0xC46F, 0x7662, 0xC470, 0x7665, 0xC471, 0x7926, 0xC472, 0x792A, + 0xC473, 0x792C, 0xC474, 0x792B, 0xC475, 0x7AC7, 0xC476, 0x7AF6, + 0xC477, 0x7C4C, 0xC478, 0x7C43, 0xC479, 0x7C4D, 0xC47A, 0x7CEF, + 0xC47B, 0x7CF0, 0xC47C, 0x8FAE, 0xC47D, 0x7E7D, 0xC47E, 0x7E7C, + 0xC4A1, 0x7E82, 0xC4A2, 0x7F4C, 0xC4A3, 0x8000, 0xC4A4, 0x81DA, + 0xC4A5, 0x8266, 0xC4A6, 0x85FB, 0xC4A7, 0x85F9, 0xC4A8, 0x8611, + 0xC4A9, 0x85FA, 0xC4AA, 0x8606, 0xC4AB, 0x860B, 0xC4AC, 0x8607, + 0xC4AD, 0x860A, 0xC4AE, 0x8814, 0xC4AF, 0x8815, 0xC4B0, 0x8964, + 0xC4B1, 0x89BA, 0xC4B2, 0x89F8, 0xC4B3, 0x8B70, 0xC4B4, 0x8B6C, + 0xC4B5, 0x8B66, 0xC4B6, 0x8B6F, 0xC4B7, 0x8B5F, 0xC4B8, 0x8B6B, + 0xC4B9, 0x8D0F, 0xC4BA, 0x8D0D, 0xC4BB, 0x8E89, 0xC4BC, 0x8E81, + 0xC4BD, 0x8E85, 0xC4BE, 0x8E82, 0xC4BF, 0x91B4, 0xC4C0, 0x91CB, + 0xC4C1, 0x9418, 0xC4C2, 0x9403, 0xC4C3, 0x93FD, 0xC4C4, 0x95E1, + 0xC4C5, 0x9730, 0xC4C6, 0x98C4, 0xC4C7, 0x9952, 0xC4C8, 0x9951, + 0xC4C9, 0x99A8, 0xC4CA, 0x9A2B, 0xC4CB, 0x9A30, 0xC4CC, 0x9A37, + 0xC4CD, 0x9A35, 0xC4CE, 0x9C13, 0xC4CF, 0x9C0D, 0xC4D0, 0x9E79, + 0xC4D1, 0x9EB5, 0xC4D2, 0x9EE8, 0xC4D3, 0x9F2F, 0xC4D4, 0x9F5F, + 0xC4D5, 0x9F63, 0xC4D6, 0x9F61, 0xC4D7, 0x5137, 0xC4D8, 0x5138, + 0xC4D9, 0x56C1, 0xC4DA, 0x56C0, 0xC4DB, 0x56C2, 0xC4DC, 0x5914, + 0xC4DD, 0x5C6C, 0xC4DE, 0x5DCD, 0xC4DF, 0x61FC, 0xC4E0, 0x61FE, + 0xC4E1, 0x651D, 0xC4E2, 0x651C, 0xC4E3, 0x6595, 0xC4E4, 0x66E9, + 0xC4E5, 0x6AFB, 0xC4E6, 0x6B04, 0xC4E7, 0x6AFA, 0xC4E8, 0x6BB2, + 0xC4E9, 0x704C, 0xC4EA, 0x721B, 0xC4EB, 0x72A7, 0xC4EC, 0x74D6, + 0xC4ED, 0x74D4, 0xC4EE, 0x7669, 0xC4EF, 0x77D3, 0xC4F0, 0x7C50, + 0xC4F1, 0x7E8F, 0xC4F2, 0x7E8C, 0xC4F3, 0x7FBC, 0xC4F4, 0x8617, + 0xC4F5, 0x862D, 0xC4F6, 0x861A, 0xC4F7, 0x8823, 0xC4F8, 0x8822, + 0xC4F9, 0x8821, 0xC4FA, 0x881F, 0xC4FB, 0x896A, 0xC4FC, 0x896C, + 0xC4FD, 0x89BD, 0xC4FE, 0x8B74, 0xC540, 0x8B77, 0xC541, 0x8B7D, + 0xC542, 0x8D13, 0xC543, 0x8E8A, 0xC544, 0x8E8D, 0xC545, 0x8E8B, + 0xC546, 0x8F5F, 0xC547, 0x8FAF, 0xC548, 0x91BA, 0xC549, 0x942E, + 0xC54A, 0x9433, 0xC54B, 0x9435, 0xC54C, 0x943A, 0xC54D, 0x9438, + 0xC54E, 0x9432, 0xC54F, 0x942B, 0xC550, 0x95E2, 0xC551, 0x9738, + 0xC552, 0x9739, 0xC553, 0x9732, 0xC554, 0x97FF, 0xC555, 0x9867, + 0xC556, 0x9865, 0xC557, 0x9957, 0xC558, 0x9A45, 0xC559, 0x9A43, + 0xC55A, 0x9A40, 0xC55B, 0x9A3E, 0xC55C, 0x9ACF, 0xC55D, 0x9B54, + 0xC55E, 0x9B51, 0xC55F, 0x9C2D, 0xC560, 0x9C25, 0xC561, 0x9DAF, + 0xC562, 0x9DB4, 0xC563, 0x9DC2, 0xC564, 0x9DB8, 0xC565, 0x9E9D, + 0xC566, 0x9EEF, 0xC567, 0x9F19, 0xC568, 0x9F5C, 0xC569, 0x9F66, + 0xC56A, 0x9F67, 0xC56B, 0x513C, 0xC56C, 0x513B, 0xC56D, 0x56C8, + 0xC56E, 0x56CA, 0xC56F, 0x56C9, 0xC570, 0x5B7F, 0xC571, 0x5DD4, + 0xC572, 0x5DD2, 0xC573, 0x5F4E, 0xC574, 0x61FF, 0xC575, 0x6524, + 0xC576, 0x6B0A, 0xC577, 0x6B61, 0xC578, 0x7051, 0xC579, 0x7058, + 0xC57A, 0x7380, 0xC57B, 0x74E4, 0xC57C, 0x758A, 0xC57D, 0x766E, + 0xC57E, 0x766C, 0xC5A1, 0x79B3, 0xC5A2, 0x7C60, 0xC5A3, 0x7C5F, + 0xC5A4, 0x807E, 0xC5A5, 0x807D, 0xC5A6, 0x81DF, 0xC5A7, 0x8972, + 0xC5A8, 0x896F, 0xC5A9, 0x89FC, 0xC5AA, 0x8B80, 0xC5AB, 0x8D16, + 0xC5AC, 0x8D17, 0xC5AD, 0x8E91, 0xC5AE, 0x8E93, 0xC5AF, 0x8F61, + 0xC5B0, 0x9148, 0xC5B1, 0x9444, 0xC5B2, 0x9451, 0xC5B3, 0x9452, + 0xC5B4, 0x973D, 0xC5B5, 0x973E, 0xC5B6, 0x97C3, 0xC5B7, 0x97C1, + 0xC5B8, 0x986B, 0xC5B9, 0x9955, 0xC5BA, 0x9A55, 0xC5BB, 0x9A4D, + 0xC5BC, 0x9AD2, 0xC5BD, 0x9B1A, 0xC5BE, 0x9C49, 0xC5BF, 0x9C31, + 0xC5C0, 0x9C3E, 0xC5C1, 0x9C3B, 0xC5C2, 0x9DD3, 0xC5C3, 0x9DD7, + 0xC5C4, 0x9F34, 0xC5C5, 0x9F6C, 0xC5C6, 0x9F6A, 0xC5C7, 0x9F94, + 0xC5C8, 0x56CC, 0xC5C9, 0x5DD6, 0xC5CA, 0x6200, 0xC5CB, 0x6523, + 0xC5CC, 0x652B, 0xC5CD, 0x652A, 0xC5CE, 0x66EC, 0xC5CF, 0x6B10, + 0xC5D0, 0x74DA, 0xC5D1, 0x7ACA, 0xC5D2, 0x7C64, 0xC5D3, 0x7C63, + 0xC5D4, 0x7C65, 0xC5D5, 0x7E93, 0xC5D6, 0x7E96, 0xC5D7, 0x7E94, + 0xC5D8, 0x81E2, 0xC5D9, 0x8638, 0xC5DA, 0x863F, 0xC5DB, 0x8831, + 0xC5DC, 0x8B8A, 0xC5DD, 0x9090, 0xC5DE, 0x908F, 0xC5DF, 0x9463, + 0xC5E0, 0x9460, 0xC5E1, 0x9464, 0xC5E2, 0x9768, 0xC5E3, 0x986F, + 0xC5E4, 0x995C, 0xC5E5, 0x9A5A, 0xC5E6, 0x9A5B, 0xC5E7, 0x9A57, + 0xC5E8, 0x9AD3, 0xC5E9, 0x9AD4, 0xC5EA, 0x9AD1, 0xC5EB, 0x9C54, + 0xC5EC, 0x9C57, 0xC5ED, 0x9C56, 0xC5EE, 0x9DE5, 0xC5EF, 0x9E9F, + 0xC5F0, 0x9EF4, 0xC5F1, 0x56D1, 0xC5F2, 0x58E9, 0xC5F3, 0x652C, + 0xC5F4, 0x705E, 0xC5F5, 0x7671, 0xC5F6, 0x7672, 0xC5F7, 0x77D7, + 0xC5F8, 0x7F50, 0xC5F9, 0x7F88, 0xC5FA, 0x8836, 0xC5FB, 0x8839, + 0xC5FC, 0x8862, 0xC5FD, 0x8B93, 0xC5FE, 0x8B92, 0xC640, 0x8B96, + 0xC641, 0x8277, 0xC642, 0x8D1B, 0xC643, 0x91C0, 0xC644, 0x946A, + 0xC645, 0x9742, 0xC646, 0x9748, 0xC647, 0x9744, 0xC648, 0x97C6, + 0xC649, 0x9870, 0xC64A, 0x9A5F, 0xC64B, 0x9B22, 0xC64C, 0x9B58, + 0xC64D, 0x9C5F, 0xC64E, 0x9DF9, 0xC64F, 0x9DFA, 0xC650, 0x9E7C, + 0xC651, 0x9E7D, 0xC652, 0x9F07, 0xC653, 0x9F77, 0xC654, 0x9F72, + 0xC655, 0x5EF3, 0xC656, 0x6B16, 0xC657, 0x7063, 0xC658, 0x7C6C, + 0xC659, 0x7C6E, 0xC65A, 0x883B, 0xC65B, 0x89C0, 0xC65C, 0x8EA1, + 0xC65D, 0x91C1, 0xC65E, 0x9472, 0xC65F, 0x9470, 0xC660, 0x9871, + 0xC661, 0x995E, 0xC662, 0x9AD6, 0xC663, 0x9B23, 0xC664, 0x9ECC, + 0xC665, 0x7064, 0xC666, 0x77DA, 0xC667, 0x8B9A, 0xC668, 0x9477, + 0xC669, 0x97C9, 0xC66A, 0x9A62, 0xC66B, 0x9A65, 0xC66C, 0x7E9C, + 0xC66D, 0x8B9C, 0xC66E, 0x8EAA, 0xC66F, 0x91C5, 0xC670, 0x947D, + 0xC671, 0x947E, 0xC672, 0x947C, 0xC673, 0x9C77, 0xC674, 0x9C78, + 0xC675, 0x9EF7, 0xC676, 0x8C54, 0xC677, 0x947F, 0xC678, 0x9E1A, + 0xC679, 0x7228, 0xC67A, 0x9A6A, 0xC67B, 0x9B31, 0xC67C, 0x9E1B, + 0xC67D, 0x9E1E, 0xC67E, 0x7C72, 0xC940, 0x4E42, 0xC941, 0x4E5C, + 0xC942, 0x51F5, 0xC943, 0x531A, 0xC944, 0x5382, 0xC945, 0x4E07, + 0xC946, 0x4E0C, 0xC947, 0x4E47, 0xC948, 0x4E8D, 0xC949, 0x56D7, + 0xC94A, 0xFA0C, 0xC94B, 0x5C6E, 0xC94C, 0x5F73, 0xC94D, 0x4E0F, + 0xC94E, 0x5187, 0xC94F, 0x4E0E, 0xC950, 0x4E2E, 0xC951, 0x4E93, + 0xC952, 0x4EC2, 0xC953, 0x4EC9, 0xC954, 0x4EC8, 0xC955, 0x5198, + 0xC956, 0x52FC, 0xC957, 0x536C, 0xC958, 0x53B9, 0xC959, 0x5720, + 0xC95A, 0x5903, 0xC95B, 0x592C, 0xC95C, 0x5C10, 0xC95D, 0x5DFF, + 0xC95E, 0x65E1, 0xC95F, 0x6BB3, 0xC960, 0x6BCC, 0xC961, 0x6C14, + 0xC962, 0x723F, 0xC963, 0x4E31, 0xC964, 0x4E3C, 0xC965, 0x4EE8, + 0xC966, 0x4EDC, 0xC967, 0x4EE9, 0xC968, 0x4EE1, 0xC969, 0x4EDD, + 0xC96A, 0x4EDA, 0xC96B, 0x520C, 0xC96C, 0x531C, 0xC96D, 0x534C, + 0xC96E, 0x5722, 0xC96F, 0x5723, 0xC970, 0x5917, 0xC971, 0x592F, + 0xC972, 0x5B81, 0xC973, 0x5B84, 0xC974, 0x5C12, 0xC975, 0x5C3B, + 0xC976, 0x5C74, 0xC977, 0x5C73, 0xC978, 0x5E04, 0xC979, 0x5E80, + 0xC97A, 0x5E82, 0xC97B, 0x5FC9, 0xC97C, 0x6209, 0xC97D, 0x6250, + 0xC97E, 0x6C15, 0xC9A1, 0x6C36, 0xC9A2, 0x6C43, 0xC9A3, 0x6C3F, + 0xC9A4, 0x6C3B, 0xC9A5, 0x72AE, 0xC9A6, 0x72B0, 0xC9A7, 0x738A, + 0xC9A8, 0x79B8, 0xC9A9, 0x808A, 0xC9AA, 0x961E, 0xC9AB, 0x4F0E, + 0xC9AC, 0x4F18, 0xC9AD, 0x4F2C, 0xC9AE, 0x4EF5, 0xC9AF, 0x4F14, + 0xC9B0, 0x4EF1, 0xC9B1, 0x4F00, 0xC9B2, 0x4EF7, 0xC9B3, 0x4F08, + 0xC9B4, 0x4F1D, 0xC9B5, 0x4F02, 0xC9B6, 0x4F05, 0xC9B7, 0x4F22, + 0xC9B8, 0x4F13, 0xC9B9, 0x4F04, 0xC9BA, 0x4EF4, 0xC9BB, 0x4F12, + 0xC9BC, 0x51B1, 0xC9BD, 0x5213, 0xC9BE, 0x5209, 0xC9BF, 0x5210, + 0xC9C0, 0x52A6, 0xC9C1, 0x5322, 0xC9C2, 0x531F, 0xC9C3, 0x534D, + 0xC9C4, 0x538A, 0xC9C5, 0x5407, 0xC9C6, 0x56E1, 0xC9C7, 0x56DF, + 0xC9C8, 0x572E, 0xC9C9, 0x572A, 0xC9CA, 0x5734, 0xC9CB, 0x593C, + 0xC9CC, 0x5980, 0xC9CD, 0x597C, 0xC9CE, 0x5985, 0xC9CF, 0x597B, + 0xC9D0, 0x597E, 0xC9D1, 0x5977, 0xC9D2, 0x597F, 0xC9D3, 0x5B56, + 0xC9D4, 0x5C15, 0xC9D5, 0x5C25, 0xC9D6, 0x5C7C, 0xC9D7, 0x5C7A, + 0xC9D8, 0x5C7B, 0xC9D9, 0x5C7E, 0xC9DA, 0x5DDF, 0xC9DB, 0x5E75, + 0xC9DC, 0x5E84, 0xC9DD, 0x5F02, 0xC9DE, 0x5F1A, 0xC9DF, 0x5F74, + 0xC9E0, 0x5FD5, 0xC9E1, 0x5FD4, 0xC9E2, 0x5FCF, 0xC9E3, 0x625C, + 0xC9E4, 0x625E, 0xC9E5, 0x6264, 0xC9E6, 0x6261, 0xC9E7, 0x6266, + 0xC9E8, 0x6262, 0xC9E9, 0x6259, 0xC9EA, 0x6260, 0xC9EB, 0x625A, + 0xC9EC, 0x6265, 0xC9ED, 0x65EF, 0xC9EE, 0x65EE, 0xC9EF, 0x673E, + 0xC9F0, 0x6739, 0xC9F1, 0x6738, 0xC9F2, 0x673B, 0xC9F3, 0x673A, + 0xC9F4, 0x673F, 0xC9F5, 0x673C, 0xC9F6, 0x6733, 0xC9F7, 0x6C18, + 0xC9F8, 0x6C46, 0xC9F9, 0x6C52, 0xC9FA, 0x6C5C, 0xC9FB, 0x6C4F, + 0xC9FC, 0x6C4A, 0xC9FD, 0x6C54, 0xC9FE, 0x6C4B, 0xCA40, 0x6C4C, + 0xCA41, 0x7071, 0xCA42, 0x725E, 0xCA43, 0x72B4, 0xCA44, 0x72B5, + 0xCA45, 0x738E, 0xCA46, 0x752A, 0xCA47, 0x767F, 0xCA48, 0x7A75, + 0xCA49, 0x7F51, 0xCA4A, 0x8278, 0xCA4B, 0x827C, 0xCA4C, 0x8280, + 0xCA4D, 0x827D, 0xCA4E, 0x827F, 0xCA4F, 0x864D, 0xCA50, 0x897E, + 0xCA51, 0x9099, 0xCA52, 0x9097, 0xCA53, 0x9098, 0xCA54, 0x909B, + 0xCA55, 0x9094, 0xCA56, 0x9622, 0xCA57, 0x9624, 0xCA58, 0x9620, + 0xCA59, 0x9623, 0xCA5A, 0x4F56, 0xCA5B, 0x4F3B, 0xCA5C, 0x4F62, + 0xCA5D, 0x4F49, 0xCA5E, 0x4F53, 0xCA5F, 0x4F64, 0xCA60, 0x4F3E, + 0xCA61, 0x4F67, 0xCA62, 0x4F52, 0xCA63, 0x4F5F, 0xCA64, 0x4F41, + 0xCA65, 0x4F58, 0xCA66, 0x4F2D, 0xCA67, 0x4F33, 0xCA68, 0x4F3F, + 0xCA69, 0x4F61, 0xCA6A, 0x518F, 0xCA6B, 0x51B9, 0xCA6C, 0x521C, + 0xCA6D, 0x521E, 0xCA6E, 0x5221, 0xCA6F, 0x52AD, 0xCA70, 0x52AE, + 0xCA71, 0x5309, 0xCA72, 0x5363, 0xCA73, 0x5372, 0xCA74, 0x538E, + 0xCA75, 0x538F, 0xCA76, 0x5430, 0xCA77, 0x5437, 0xCA78, 0x542A, + 0xCA79, 0x5454, 0xCA7A, 0x5445, 0xCA7B, 0x5419, 0xCA7C, 0x541C, + 0xCA7D, 0x5425, 0xCA7E, 0x5418, 0xCAA1, 0x543D, 0xCAA2, 0x544F, + 0xCAA3, 0x5441, 0xCAA4, 0x5428, 0xCAA5, 0x5424, 0xCAA6, 0x5447, + 0xCAA7, 0x56EE, 0xCAA8, 0x56E7, 0xCAA9, 0x56E5, 0xCAAA, 0x5741, + 0xCAAB, 0x5745, 0xCAAC, 0x574C, 0xCAAD, 0x5749, 0xCAAE, 0x574B, + 0xCAAF, 0x5752, 0xCAB0, 0x5906, 0xCAB1, 0x5940, 0xCAB2, 0x59A6, + 0xCAB3, 0x5998, 0xCAB4, 0x59A0, 0xCAB5, 0x5997, 0xCAB6, 0x598E, + 0xCAB7, 0x59A2, 0xCAB8, 0x5990, 0xCAB9, 0x598F, 0xCABA, 0x59A7, + 0xCABB, 0x59A1, 0xCABC, 0x5B8E, 0xCABD, 0x5B92, 0xCABE, 0x5C28, + 0xCABF, 0x5C2A, 0xCAC0, 0x5C8D, 0xCAC1, 0x5C8F, 0xCAC2, 0x5C88, + 0xCAC3, 0x5C8B, 0xCAC4, 0x5C89, 0xCAC5, 0x5C92, 0xCAC6, 0x5C8A, + 0xCAC7, 0x5C86, 0xCAC8, 0x5C93, 0xCAC9, 0x5C95, 0xCACA, 0x5DE0, + 0xCACB, 0x5E0A, 0xCACC, 0x5E0E, 0xCACD, 0x5E8B, 0xCACE, 0x5E89, + 0xCACF, 0x5E8C, 0xCAD0, 0x5E88, 0xCAD1, 0x5E8D, 0xCAD2, 0x5F05, + 0xCAD3, 0x5F1D, 0xCAD4, 0x5F78, 0xCAD5, 0x5F76, 0xCAD6, 0x5FD2, + 0xCAD7, 0x5FD1, 0xCAD8, 0x5FD0, 0xCAD9, 0x5FED, 0xCADA, 0x5FE8, + 0xCADB, 0x5FEE, 0xCADC, 0x5FF3, 0xCADD, 0x5FE1, 0xCADE, 0x5FE4, + 0xCADF, 0x5FE3, 0xCAE0, 0x5FFA, 0xCAE1, 0x5FEF, 0xCAE2, 0x5FF7, + 0xCAE3, 0x5FFB, 0xCAE4, 0x6000, 0xCAE5, 0x5FF4, 0xCAE6, 0x623A, + 0xCAE7, 0x6283, 0xCAE8, 0x628C, 0xCAE9, 0x628E, 0xCAEA, 0x628F, + 0xCAEB, 0x6294, 0xCAEC, 0x6287, 0xCAED, 0x6271, 0xCAEE, 0x627B, + 0xCAEF, 0x627A, 0xCAF0, 0x6270, 0xCAF1, 0x6281, 0xCAF2, 0x6288, + 0xCAF3, 0x6277, 0xCAF4, 0x627D, 0xCAF5, 0x6272, 0xCAF6, 0x6274, + 0xCAF7, 0x6537, 0xCAF8, 0x65F0, 0xCAF9, 0x65F4, 0xCAFA, 0x65F3, + 0xCAFB, 0x65F2, 0xCAFC, 0x65F5, 0xCAFD, 0x6745, 0xCAFE, 0x6747, + 0xCB40, 0x6759, 0xCB41, 0x6755, 0xCB42, 0x674C, 0xCB43, 0x6748, + 0xCB44, 0x675D, 0xCB45, 0x674D, 0xCB46, 0x675A, 0xCB47, 0x674B, + 0xCB48, 0x6BD0, 0xCB49, 0x6C19, 0xCB4A, 0x6C1A, 0xCB4B, 0x6C78, + 0xCB4C, 0x6C67, 0xCB4D, 0x6C6B, 0xCB4E, 0x6C84, 0xCB4F, 0x6C8B, + 0xCB50, 0x6C8F, 0xCB51, 0x6C71, 0xCB52, 0x6C6F, 0xCB53, 0x6C69, + 0xCB54, 0x6C9A, 0xCB55, 0x6C6D, 0xCB56, 0x6C87, 0xCB57, 0x6C95, + 0xCB58, 0x6C9C, 0xCB59, 0x6C66, 0xCB5A, 0x6C73, 0xCB5B, 0x6C65, + 0xCB5C, 0x6C7B, 0xCB5D, 0x6C8E, 0xCB5E, 0x7074, 0xCB5F, 0x707A, + 0xCB60, 0x7263, 0xCB61, 0x72BF, 0xCB62, 0x72BD, 0xCB63, 0x72C3, + 0xCB64, 0x72C6, 0xCB65, 0x72C1, 0xCB66, 0x72BA, 0xCB67, 0x72C5, + 0xCB68, 0x7395, 0xCB69, 0x7397, 0xCB6A, 0x7393, 0xCB6B, 0x7394, + 0xCB6C, 0x7392, 0xCB6D, 0x753A, 0xCB6E, 0x7539, 0xCB6F, 0x7594, + 0xCB70, 0x7595, 0xCB71, 0x7681, 0xCB72, 0x793D, 0xCB73, 0x8034, + 0xCB74, 0x8095, 0xCB75, 0x8099, 0xCB76, 0x8090, 0xCB77, 0x8092, + 0xCB78, 0x809C, 0xCB79, 0x8290, 0xCB7A, 0x828F, 0xCB7B, 0x8285, + 0xCB7C, 0x828E, 0xCB7D, 0x8291, 0xCB7E, 0x8293, 0xCBA1, 0x828A, + 0xCBA2, 0x8283, 0xCBA3, 0x8284, 0xCBA4, 0x8C78, 0xCBA5, 0x8FC9, + 0xCBA6, 0x8FBF, 0xCBA7, 0x909F, 0xCBA8, 0x90A1, 0xCBA9, 0x90A5, + 0xCBAA, 0x909E, 0xCBAB, 0x90A7, 0xCBAC, 0x90A0, 0xCBAD, 0x9630, + 0xCBAE, 0x9628, 0xCBAF, 0x962F, 0xCBB0, 0x962D, 0xCBB1, 0x4E33, + 0xCBB2, 0x4F98, 0xCBB3, 0x4F7C, 0xCBB4, 0x4F85, 0xCBB5, 0x4F7D, + 0xCBB6, 0x4F80, 0xCBB7, 0x4F87, 0xCBB8, 0x4F76, 0xCBB9, 0x4F74, + 0xCBBA, 0x4F89, 0xCBBB, 0x4F84, 0xCBBC, 0x4F77, 0xCBBD, 0x4F4C, + 0xCBBE, 0x4F97, 0xCBBF, 0x4F6A, 0xCBC0, 0x4F9A, 0xCBC1, 0x4F79, + 0xCBC2, 0x4F81, 0xCBC3, 0x4F78, 0xCBC4, 0x4F90, 0xCBC5, 0x4F9C, + 0xCBC6, 0x4F94, 0xCBC7, 0x4F9E, 0xCBC8, 0x4F92, 0xCBC9, 0x4F82, + 0xCBCA, 0x4F95, 0xCBCB, 0x4F6B, 0xCBCC, 0x4F6E, 0xCBCD, 0x519E, + 0xCBCE, 0x51BC, 0xCBCF, 0x51BE, 0xCBD0, 0x5235, 0xCBD1, 0x5232, + 0xCBD2, 0x5233, 0xCBD3, 0x5246, 0xCBD4, 0x5231, 0xCBD5, 0x52BC, + 0xCBD6, 0x530A, 0xCBD7, 0x530B, 0xCBD8, 0x533C, 0xCBD9, 0x5392, + 0xCBDA, 0x5394, 0xCBDB, 0x5487, 0xCBDC, 0x547F, 0xCBDD, 0x5481, + 0xCBDE, 0x5491, 0xCBDF, 0x5482, 0xCBE0, 0x5488, 0xCBE1, 0x546B, + 0xCBE2, 0x547A, 0xCBE3, 0x547E, 0xCBE4, 0x5465, 0xCBE5, 0x546C, + 0xCBE6, 0x5474, 0xCBE7, 0x5466, 0xCBE8, 0x548D, 0xCBE9, 0x546F, + 0xCBEA, 0x5461, 0xCBEB, 0x5460, 0xCBEC, 0x5498, 0xCBED, 0x5463, + 0xCBEE, 0x5467, 0xCBEF, 0x5464, 0xCBF0, 0x56F7, 0xCBF1, 0x56F9, + 0xCBF2, 0x576F, 0xCBF3, 0x5772, 0xCBF4, 0x576D, 0xCBF5, 0x576B, + 0xCBF6, 0x5771, 0xCBF7, 0x5770, 0xCBF8, 0x5776, 0xCBF9, 0x5780, + 0xCBFA, 0x5775, 0xCBFB, 0x577B, 0xCBFC, 0x5773, 0xCBFD, 0x5774, + 0xCBFE, 0x5762, 0xCC40, 0x5768, 0xCC41, 0x577D, 0xCC42, 0x590C, + 0xCC43, 0x5945, 0xCC44, 0x59B5, 0xCC45, 0x59BA, 0xCC46, 0x59CF, + 0xCC47, 0x59CE, 0xCC48, 0x59B2, 0xCC49, 0x59CC, 0xCC4A, 0x59C1, + 0xCC4B, 0x59B6, 0xCC4C, 0x59BC, 0xCC4D, 0x59C3, 0xCC4E, 0x59D6, + 0xCC4F, 0x59B1, 0xCC50, 0x59BD, 0xCC51, 0x59C0, 0xCC52, 0x59C8, + 0xCC53, 0x59B4, 0xCC54, 0x59C7, 0xCC55, 0x5B62, 0xCC56, 0x5B65, + 0xCC57, 0x5B93, 0xCC58, 0x5B95, 0xCC59, 0x5C44, 0xCC5A, 0x5C47, + 0xCC5B, 0x5CAE, 0xCC5C, 0x5CA4, 0xCC5D, 0x5CA0, 0xCC5E, 0x5CB5, + 0xCC5F, 0x5CAF, 0xCC60, 0x5CA8, 0xCC61, 0x5CAC, 0xCC62, 0x5C9F, + 0xCC63, 0x5CA3, 0xCC64, 0x5CAD, 0xCC65, 0x5CA2, 0xCC66, 0x5CAA, + 0xCC67, 0x5CA7, 0xCC68, 0x5C9D, 0xCC69, 0x5CA5, 0xCC6A, 0x5CB6, + 0xCC6B, 0x5CB0, 0xCC6C, 0x5CA6, 0xCC6D, 0x5E17, 0xCC6E, 0x5E14, + 0xCC6F, 0x5E19, 0xCC70, 0x5F28, 0xCC71, 0x5F22, 0xCC72, 0x5F23, + 0xCC73, 0x5F24, 0xCC74, 0x5F54, 0xCC75, 0x5F82, 0xCC76, 0x5F7E, + 0xCC77, 0x5F7D, 0xCC78, 0x5FDE, 0xCC79, 0x5FE5, 0xCC7A, 0x602D, + 0xCC7B, 0x6026, 0xCC7C, 0x6019, 0xCC7D, 0x6032, 0xCC7E, 0x600B, + 0xCCA1, 0x6034, 0xCCA2, 0x600A, 0xCCA3, 0x6017, 0xCCA4, 0x6033, + 0xCCA5, 0x601A, 0xCCA6, 0x601E, 0xCCA7, 0x602C, 0xCCA8, 0x6022, + 0xCCA9, 0x600D, 0xCCAA, 0x6010, 0xCCAB, 0x602E, 0xCCAC, 0x6013, + 0xCCAD, 0x6011, 0xCCAE, 0x600C, 0xCCAF, 0x6009, 0xCCB0, 0x601C, + 0xCCB1, 0x6214, 0xCCB2, 0x623D, 0xCCB3, 0x62AD, 0xCCB4, 0x62B4, + 0xCCB5, 0x62D1, 0xCCB6, 0x62BE, 0xCCB7, 0x62AA, 0xCCB8, 0x62B6, + 0xCCB9, 0x62CA, 0xCCBA, 0x62AE, 0xCCBB, 0x62B3, 0xCCBC, 0x62AF, + 0xCCBD, 0x62BB, 0xCCBE, 0x62A9, 0xCCBF, 0x62B0, 0xCCC0, 0x62B8, + 0xCCC1, 0x653D, 0xCCC2, 0x65A8, 0xCCC3, 0x65BB, 0xCCC4, 0x6609, + 0xCCC5, 0x65FC, 0xCCC6, 0x6604, 0xCCC7, 0x6612, 0xCCC8, 0x6608, + 0xCCC9, 0x65FB, 0xCCCA, 0x6603, 0xCCCB, 0x660B, 0xCCCC, 0x660D, + 0xCCCD, 0x6605, 0xCCCE, 0x65FD, 0xCCCF, 0x6611, 0xCCD0, 0x6610, + 0xCCD1, 0x66F6, 0xCCD2, 0x670A, 0xCCD3, 0x6785, 0xCCD4, 0x676C, + 0xCCD5, 0x678E, 0xCCD6, 0x6792, 0xCCD7, 0x6776, 0xCCD8, 0x677B, + 0xCCD9, 0x6798, 0xCCDA, 0x6786, 0xCCDB, 0x6784, 0xCCDC, 0x6774, + 0xCCDD, 0x678D, 0xCCDE, 0x678C, 0xCCDF, 0x677A, 0xCCE0, 0x679F, + 0xCCE1, 0x6791, 0xCCE2, 0x6799, 0xCCE3, 0x6783, 0xCCE4, 0x677D, + 0xCCE5, 0x6781, 0xCCE6, 0x6778, 0xCCE7, 0x6779, 0xCCE8, 0x6794, + 0xCCE9, 0x6B25, 0xCCEA, 0x6B80, 0xCCEB, 0x6B7E, 0xCCEC, 0x6BDE, + 0xCCED, 0x6C1D, 0xCCEE, 0x6C93, 0xCCEF, 0x6CEC, 0xCCF0, 0x6CEB, + 0xCCF1, 0x6CEE, 0xCCF2, 0x6CD9, 0xCCF3, 0x6CB6, 0xCCF4, 0x6CD4, + 0xCCF5, 0x6CAD, 0xCCF6, 0x6CE7, 0xCCF7, 0x6CB7, 0xCCF8, 0x6CD0, + 0xCCF9, 0x6CC2, 0xCCFA, 0x6CBA, 0xCCFB, 0x6CC3, 0xCCFC, 0x6CC6, + 0xCCFD, 0x6CED, 0xCCFE, 0x6CF2, 0xCD40, 0x6CD2, 0xCD41, 0x6CDD, + 0xCD42, 0x6CB4, 0xCD43, 0x6C8A, 0xCD44, 0x6C9D, 0xCD45, 0x6C80, + 0xCD46, 0x6CDE, 0xCD47, 0x6CC0, 0xCD48, 0x6D30, 0xCD49, 0x6CCD, + 0xCD4A, 0x6CC7, 0xCD4B, 0x6CB0, 0xCD4C, 0x6CF9, 0xCD4D, 0x6CCF, + 0xCD4E, 0x6CE9, 0xCD4F, 0x6CD1, 0xCD50, 0x7094, 0xCD51, 0x7098, + 0xCD52, 0x7085, 0xCD53, 0x7093, 0xCD54, 0x7086, 0xCD55, 0x7084, + 0xCD56, 0x7091, 0xCD57, 0x7096, 0xCD58, 0x7082, 0xCD59, 0x709A, + 0xCD5A, 0x7083, 0xCD5B, 0x726A, 0xCD5C, 0x72D6, 0xCD5D, 0x72CB, + 0xCD5E, 0x72D8, 0xCD5F, 0x72C9, 0xCD60, 0x72DC, 0xCD61, 0x72D2, + 0xCD62, 0x72D4, 0xCD63, 0x72DA, 0xCD64, 0x72CC, 0xCD65, 0x72D1, + 0xCD66, 0x73A4, 0xCD67, 0x73A1, 0xCD68, 0x73AD, 0xCD69, 0x73A6, + 0xCD6A, 0x73A2, 0xCD6B, 0x73A0, 0xCD6C, 0x73AC, 0xCD6D, 0x739D, + 0xCD6E, 0x74DD, 0xCD6F, 0x74E8, 0xCD70, 0x753F, 0xCD71, 0x7540, + 0xCD72, 0x753E, 0xCD73, 0x758C, 0xCD74, 0x7598, 0xCD75, 0x76AF, + 0xCD76, 0x76F3, 0xCD77, 0x76F1, 0xCD78, 0x76F0, 0xCD79, 0x76F5, + 0xCD7A, 0x77F8, 0xCD7B, 0x77FC, 0xCD7C, 0x77F9, 0xCD7D, 0x77FB, + 0xCD7E, 0x77FA, 0xCDA1, 0x77F7, 0xCDA2, 0x7942, 0xCDA3, 0x793F, + 0xCDA4, 0x79C5, 0xCDA5, 0x7A78, 0xCDA6, 0x7A7B, 0xCDA7, 0x7AFB, + 0xCDA8, 0x7C75, 0xCDA9, 0x7CFD, 0xCDAA, 0x8035, 0xCDAB, 0x808F, + 0xCDAC, 0x80AE, 0xCDAD, 0x80A3, 0xCDAE, 0x80B8, 0xCDAF, 0x80B5, + 0xCDB0, 0x80AD, 0xCDB1, 0x8220, 0xCDB2, 0x82A0, 0xCDB3, 0x82C0, + 0xCDB4, 0x82AB, 0xCDB5, 0x829A, 0xCDB6, 0x8298, 0xCDB7, 0x829B, + 0xCDB8, 0x82B5, 0xCDB9, 0x82A7, 0xCDBA, 0x82AE, 0xCDBB, 0x82BC, + 0xCDBC, 0x829E, 0xCDBD, 0x82BA, 0xCDBE, 0x82B4, 0xCDBF, 0x82A8, + 0xCDC0, 0x82A1, 0xCDC1, 0x82A9, 0xCDC2, 0x82C2, 0xCDC3, 0x82A4, + 0xCDC4, 0x82C3, 0xCDC5, 0x82B6, 0xCDC6, 0x82A2, 0xCDC7, 0x8670, + 0xCDC8, 0x866F, 0xCDC9, 0x866D, 0xCDCA, 0x866E, 0xCDCB, 0x8C56, + 0xCDCC, 0x8FD2, 0xCDCD, 0x8FCB, 0xCDCE, 0x8FD3, 0xCDCF, 0x8FCD, + 0xCDD0, 0x8FD6, 0xCDD1, 0x8FD5, 0xCDD2, 0x8FD7, 0xCDD3, 0x90B2, + 0xCDD4, 0x90B4, 0xCDD5, 0x90AF, 0xCDD6, 0x90B3, 0xCDD7, 0x90B0, + 0xCDD8, 0x9639, 0xCDD9, 0x963D, 0xCDDA, 0x963C, 0xCDDB, 0x963A, + 0xCDDC, 0x9643, 0xCDDD, 0x4FCD, 0xCDDE, 0x4FC5, 0xCDDF, 0x4FD3, + 0xCDE0, 0x4FB2, 0xCDE1, 0x4FC9, 0xCDE2, 0x4FCB, 0xCDE3, 0x4FC1, + 0xCDE4, 0x4FD4, 0xCDE5, 0x4FDC, 0xCDE6, 0x4FD9, 0xCDE7, 0x4FBB, + 0xCDE8, 0x4FB3, 0xCDE9, 0x4FDB, 0xCDEA, 0x4FC7, 0xCDEB, 0x4FD6, + 0xCDEC, 0x4FBA, 0xCDED, 0x4FC0, 0xCDEE, 0x4FB9, 0xCDEF, 0x4FEC, + 0xCDF0, 0x5244, 0xCDF1, 0x5249, 0xCDF2, 0x52C0, 0xCDF3, 0x52C2, + 0xCDF4, 0x533D, 0xCDF5, 0x537C, 0xCDF6, 0x5397, 0xCDF7, 0x5396, + 0xCDF8, 0x5399, 0xCDF9, 0x5398, 0xCDFA, 0x54BA, 0xCDFB, 0x54A1, + 0xCDFC, 0x54AD, 0xCDFD, 0x54A5, 0xCDFE, 0x54CF, 0xCE40, 0x54C3, + 0xCE41, 0x830D, 0xCE42, 0x54B7, 0xCE43, 0x54AE, 0xCE44, 0x54D6, + 0xCE45, 0x54B6, 0xCE46, 0x54C5, 0xCE47, 0x54C6, 0xCE48, 0x54A0, + 0xCE49, 0x5470, 0xCE4A, 0x54BC, 0xCE4B, 0x54A2, 0xCE4C, 0x54BE, + 0xCE4D, 0x5472, 0xCE4E, 0x54DE, 0xCE4F, 0x54B0, 0xCE50, 0x57B5, + 0xCE51, 0x579E, 0xCE52, 0x579F, 0xCE53, 0x57A4, 0xCE54, 0x578C, + 0xCE55, 0x5797, 0xCE56, 0x579D, 0xCE57, 0x579B, 0xCE58, 0x5794, + 0xCE59, 0x5798, 0xCE5A, 0x578F, 0xCE5B, 0x5799, 0xCE5C, 0x57A5, + 0xCE5D, 0x579A, 0xCE5E, 0x5795, 0xCE5F, 0x58F4, 0xCE60, 0x590D, + 0xCE61, 0x5953, 0xCE62, 0x59E1, 0xCE63, 0x59DE, 0xCE64, 0x59EE, + 0xCE65, 0x5A00, 0xCE66, 0x59F1, 0xCE67, 0x59DD, 0xCE68, 0x59FA, + 0xCE69, 0x59FD, 0xCE6A, 0x59FC, 0xCE6B, 0x59F6, 0xCE6C, 0x59E4, + 0xCE6D, 0x59F2, 0xCE6E, 0x59F7, 0xCE6F, 0x59DB, 0xCE70, 0x59E9, + 0xCE71, 0x59F3, 0xCE72, 0x59F5, 0xCE73, 0x59E0, 0xCE74, 0x59FE, + 0xCE75, 0x59F4, 0xCE76, 0x59ED, 0xCE77, 0x5BA8, 0xCE78, 0x5C4C, + 0xCE79, 0x5CD0, 0xCE7A, 0x5CD8, 0xCE7B, 0x5CCC, 0xCE7C, 0x5CD7, + 0xCE7D, 0x5CCB, 0xCE7E, 0x5CDB, 0xCEA1, 0x5CDE, 0xCEA2, 0x5CDA, + 0xCEA3, 0x5CC9, 0xCEA4, 0x5CC7, 0xCEA5, 0x5CCA, 0xCEA6, 0x5CD6, + 0xCEA7, 0x5CD3, 0xCEA8, 0x5CD4, 0xCEA9, 0x5CCF, 0xCEAA, 0x5CC8, + 0xCEAB, 0x5CC6, 0xCEAC, 0x5CCE, 0xCEAD, 0x5CDF, 0xCEAE, 0x5CF8, + 0xCEAF, 0x5DF9, 0xCEB0, 0x5E21, 0xCEB1, 0x5E22, 0xCEB2, 0x5E23, + 0xCEB3, 0x5E20, 0xCEB4, 0x5E24, 0xCEB5, 0x5EB0, 0xCEB6, 0x5EA4, + 0xCEB7, 0x5EA2, 0xCEB8, 0x5E9B, 0xCEB9, 0x5EA3, 0xCEBA, 0x5EA5, + 0xCEBB, 0x5F07, 0xCEBC, 0x5F2E, 0xCEBD, 0x5F56, 0xCEBE, 0x5F86, + 0xCEBF, 0x6037, 0xCEC0, 0x6039, 0xCEC1, 0x6054, 0xCEC2, 0x6072, + 0xCEC3, 0x605E, 0xCEC4, 0x6045, 0xCEC5, 0x6053, 0xCEC6, 0x6047, + 0xCEC7, 0x6049, 0xCEC8, 0x605B, 0xCEC9, 0x604C, 0xCECA, 0x6040, + 0xCECB, 0x6042, 0xCECC, 0x605F, 0xCECD, 0x6024, 0xCECE, 0x6044, + 0xCECF, 0x6058, 0xCED0, 0x6066, 0xCED1, 0x606E, 0xCED2, 0x6242, + 0xCED3, 0x6243, 0xCED4, 0x62CF, 0xCED5, 0x630D, 0xCED6, 0x630B, + 0xCED7, 0x62F5, 0xCED8, 0x630E, 0xCED9, 0x6303, 0xCEDA, 0x62EB, + 0xCEDB, 0x62F9, 0xCEDC, 0x630F, 0xCEDD, 0x630C, 0xCEDE, 0x62F8, + 0xCEDF, 0x62F6, 0xCEE0, 0x6300, 0xCEE1, 0x6313, 0xCEE2, 0x6314, + 0xCEE3, 0x62FA, 0xCEE4, 0x6315, 0xCEE5, 0x62FB, 0xCEE6, 0x62F0, + 0xCEE7, 0x6541, 0xCEE8, 0x6543, 0xCEE9, 0x65AA, 0xCEEA, 0x65BF, + 0xCEEB, 0x6636, 0xCEEC, 0x6621, 0xCEED, 0x6632, 0xCEEE, 0x6635, + 0xCEEF, 0x661C, 0xCEF0, 0x6626, 0xCEF1, 0x6622, 0xCEF2, 0x6633, + 0xCEF3, 0x662B, 0xCEF4, 0x663A, 0xCEF5, 0x661D, 0xCEF6, 0x6634, + 0xCEF7, 0x6639, 0xCEF8, 0x662E, 0xCEF9, 0x670F, 0xCEFA, 0x6710, + 0xCEFB, 0x67C1, 0xCEFC, 0x67F2, 0xCEFD, 0x67C8, 0xCEFE, 0x67BA, + 0xCF40, 0x67DC, 0xCF41, 0x67BB, 0xCF42, 0x67F8, 0xCF43, 0x67D8, + 0xCF44, 0x67C0, 0xCF45, 0x67B7, 0xCF46, 0x67C5, 0xCF47, 0x67EB, + 0xCF48, 0x67E4, 0xCF49, 0x67DF, 0xCF4A, 0x67B5, 0xCF4B, 0x67CD, + 0xCF4C, 0x67B3, 0xCF4D, 0x67F7, 0xCF4E, 0x67F6, 0xCF4F, 0x67EE, + 0xCF50, 0x67E3, 0xCF51, 0x67C2, 0xCF52, 0x67B9, 0xCF53, 0x67CE, + 0xCF54, 0x67E7, 0xCF55, 0x67F0, 0xCF56, 0x67B2, 0xCF57, 0x67FC, + 0xCF58, 0x67C6, 0xCF59, 0x67ED, 0xCF5A, 0x67CC, 0xCF5B, 0x67AE, + 0xCF5C, 0x67E6, 0xCF5D, 0x67DB, 0xCF5E, 0x67FA, 0xCF5F, 0x67C9, + 0xCF60, 0x67CA, 0xCF61, 0x67C3, 0xCF62, 0x67EA, 0xCF63, 0x67CB, + 0xCF64, 0x6B28, 0xCF65, 0x6B82, 0xCF66, 0x6B84, 0xCF67, 0x6BB6, + 0xCF68, 0x6BD6, 0xCF69, 0x6BD8, 0xCF6A, 0x6BE0, 0xCF6B, 0x6C20, + 0xCF6C, 0x6C21, 0xCF6D, 0x6D28, 0xCF6E, 0x6D34, 0xCF6F, 0x6D2D, + 0xCF70, 0x6D1F, 0xCF71, 0x6D3C, 0xCF72, 0x6D3F, 0xCF73, 0x6D12, + 0xCF74, 0x6D0A, 0xCF75, 0x6CDA, 0xCF76, 0x6D33, 0xCF77, 0x6D04, + 0xCF78, 0x6D19, 0xCF79, 0x6D3A, 0xCF7A, 0x6D1A, 0xCF7B, 0x6D11, + 0xCF7C, 0x6D00, 0xCF7D, 0x6D1D, 0xCF7E, 0x6D42, 0xCFA1, 0x6D01, + 0xCFA2, 0x6D18, 0xCFA3, 0x6D37, 0xCFA4, 0x6D03, 0xCFA5, 0x6D0F, + 0xCFA6, 0x6D40, 0xCFA7, 0x6D07, 0xCFA8, 0x6D20, 0xCFA9, 0x6D2C, + 0xCFAA, 0x6D08, 0xCFAB, 0x6D22, 0xCFAC, 0x6D09, 0xCFAD, 0x6D10, + 0xCFAE, 0x70B7, 0xCFAF, 0x709F, 0xCFB0, 0x70BE, 0xCFB1, 0x70B1, + 0xCFB2, 0x70B0, 0xCFB3, 0x70A1, 0xCFB4, 0x70B4, 0xCFB5, 0x70B5, + 0xCFB6, 0x70A9, 0xCFB7, 0x7241, 0xCFB8, 0x7249, 0xCFB9, 0x724A, + 0xCFBA, 0x726C, 0xCFBB, 0x7270, 0xCFBC, 0x7273, 0xCFBD, 0x726E, + 0xCFBE, 0x72CA, 0xCFBF, 0x72E4, 0xCFC0, 0x72E8, 0xCFC1, 0x72EB, + 0xCFC2, 0x72DF, 0xCFC3, 0x72EA, 0xCFC4, 0x72E6, 0xCFC5, 0x72E3, + 0xCFC6, 0x7385, 0xCFC7, 0x73CC, 0xCFC8, 0x73C2, 0xCFC9, 0x73C8, + 0xCFCA, 0x73C5, 0xCFCB, 0x73B9, 0xCFCC, 0x73B6, 0xCFCD, 0x73B5, + 0xCFCE, 0x73B4, 0xCFCF, 0x73EB, 0xCFD0, 0x73BF, 0xCFD1, 0x73C7, + 0xCFD2, 0x73BE, 0xCFD3, 0x73C3, 0xCFD4, 0x73C6, 0xCFD5, 0x73B8, + 0xCFD6, 0x73CB, 0xCFD7, 0x74EC, 0xCFD8, 0x74EE, 0xCFD9, 0x752E, + 0xCFDA, 0x7547, 0xCFDB, 0x7548, 0xCFDC, 0x75A7, 0xCFDD, 0x75AA, + 0xCFDE, 0x7679, 0xCFDF, 0x76C4, 0xCFE0, 0x7708, 0xCFE1, 0x7703, + 0xCFE2, 0x7704, 0xCFE3, 0x7705, 0xCFE4, 0x770A, 0xCFE5, 0x76F7, + 0xCFE6, 0x76FB, 0xCFE7, 0x76FA, 0xCFE8, 0x77E7, 0xCFE9, 0x77E8, + 0xCFEA, 0x7806, 0xCFEB, 0x7811, 0xCFEC, 0x7812, 0xCFED, 0x7805, + 0xCFEE, 0x7810, 0xCFEF, 0x780F, 0xCFF0, 0x780E, 0xCFF1, 0x7809, + 0xCFF2, 0x7803, 0xCFF3, 0x7813, 0xCFF4, 0x794A, 0xCFF5, 0x794C, + 0xCFF6, 0x794B, 0xCFF7, 0x7945, 0xCFF8, 0x7944, 0xCFF9, 0x79D5, + 0xCFFA, 0x79CD, 0xCFFB, 0x79CF, 0xCFFC, 0x79D6, 0xCFFD, 0x79CE, + 0xCFFE, 0x7A80, 0xD040, 0x7A7E, 0xD041, 0x7AD1, 0xD042, 0x7B00, + 0xD043, 0x7B01, 0xD044, 0x7C7A, 0xD045, 0x7C78, 0xD046, 0x7C79, + 0xD047, 0x7C7F, 0xD048, 0x7C80, 0xD049, 0x7C81, 0xD04A, 0x7D03, + 0xD04B, 0x7D08, 0xD04C, 0x7D01, 0xD04D, 0x7F58, 0xD04E, 0x7F91, + 0xD04F, 0x7F8D, 0xD050, 0x7FBE, 0xD051, 0x8007, 0xD052, 0x800E, + 0xD053, 0x800F, 0xD054, 0x8014, 0xD055, 0x8037, 0xD056, 0x80D8, + 0xD057, 0x80C7, 0xD058, 0x80E0, 0xD059, 0x80D1, 0xD05A, 0x80C8, + 0xD05B, 0x80C2, 0xD05C, 0x80D0, 0xD05D, 0x80C5, 0xD05E, 0x80E3, + 0xD05F, 0x80D9, 0xD060, 0x80DC, 0xD061, 0x80CA, 0xD062, 0x80D5, + 0xD063, 0x80C9, 0xD064, 0x80CF, 0xD065, 0x80D7, 0xD066, 0x80E6, + 0xD067, 0x80CD, 0xD068, 0x81FF, 0xD069, 0x8221, 0xD06A, 0x8294, + 0xD06B, 0x82D9, 0xD06C, 0x82FE, 0xD06D, 0x82F9, 0xD06E, 0x8307, + 0xD06F, 0x82E8, 0xD070, 0x8300, 0xD071, 0x82D5, 0xD072, 0x833A, + 0xD073, 0x82EB, 0xD074, 0x82D6, 0xD075, 0x82F4, 0xD076, 0x82EC, + 0xD077, 0x82E1, 0xD078, 0x82F2, 0xD079, 0x82F5, 0xD07A, 0x830C, + 0xD07B, 0x82FB, 0xD07C, 0x82F6, 0xD07D, 0x82F0, 0xD07E, 0x82EA, + 0xD0A1, 0x82E4, 0xD0A2, 0x82E0, 0xD0A3, 0x82FA, 0xD0A4, 0x82F3, + 0xD0A5, 0x82ED, 0xD0A6, 0x8677, 0xD0A7, 0x8674, 0xD0A8, 0x867C, + 0xD0A9, 0x8673, 0xD0AA, 0x8841, 0xD0AB, 0x884E, 0xD0AC, 0x8867, + 0xD0AD, 0x886A, 0xD0AE, 0x8869, 0xD0AF, 0x89D3, 0xD0B0, 0x8A04, + 0xD0B1, 0x8A07, 0xD0B2, 0x8D72, 0xD0B3, 0x8FE3, 0xD0B4, 0x8FE1, + 0xD0B5, 0x8FEE, 0xD0B6, 0x8FE0, 0xD0B7, 0x90F1, 0xD0B8, 0x90BD, + 0xD0B9, 0x90BF, 0xD0BA, 0x90D5, 0xD0BB, 0x90C5, 0xD0BC, 0x90BE, + 0xD0BD, 0x90C7, 0xD0BE, 0x90CB, 0xD0BF, 0x90C8, 0xD0C0, 0x91D4, + 0xD0C1, 0x91D3, 0xD0C2, 0x9654, 0xD0C3, 0x964F, 0xD0C4, 0x9651, + 0xD0C5, 0x9653, 0xD0C6, 0x964A, 0xD0C7, 0x964E, 0xD0C8, 0x501E, + 0xD0C9, 0x5005, 0xD0CA, 0x5007, 0xD0CB, 0x5013, 0xD0CC, 0x5022, + 0xD0CD, 0x5030, 0xD0CE, 0x501B, 0xD0CF, 0x4FF5, 0xD0D0, 0x4FF4, + 0xD0D1, 0x5033, 0xD0D2, 0x5037, 0xD0D3, 0x502C, 0xD0D4, 0x4FF6, + 0xD0D5, 0x4FF7, 0xD0D6, 0x5017, 0xD0D7, 0x501C, 0xD0D8, 0x5020, + 0xD0D9, 0x5027, 0xD0DA, 0x5035, 0xD0DB, 0x502F, 0xD0DC, 0x5031, + 0xD0DD, 0x500E, 0xD0DE, 0x515A, 0xD0DF, 0x5194, 0xD0E0, 0x5193, + 0xD0E1, 0x51CA, 0xD0E2, 0x51C4, 0xD0E3, 0x51C5, 0xD0E4, 0x51C8, + 0xD0E5, 0x51CE, 0xD0E6, 0x5261, 0xD0E7, 0x525A, 0xD0E8, 0x5252, + 0xD0E9, 0x525E, 0xD0EA, 0x525F, 0xD0EB, 0x5255, 0xD0EC, 0x5262, + 0xD0ED, 0x52CD, 0xD0EE, 0x530E, 0xD0EF, 0x539E, 0xD0F0, 0x5526, + 0xD0F1, 0x54E2, 0xD0F2, 0x5517, 0xD0F3, 0x5512, 0xD0F4, 0x54E7, + 0xD0F5, 0x54F3, 0xD0F6, 0x54E4, 0xD0F7, 0x551A, 0xD0F8, 0x54FF, + 0xD0F9, 0x5504, 0xD0FA, 0x5508, 0xD0FB, 0x54EB, 0xD0FC, 0x5511, + 0xD0FD, 0x5505, 0xD0FE, 0x54F1, 0xD140, 0x550A, 0xD141, 0x54FB, + 0xD142, 0x54F7, 0xD143, 0x54F8, 0xD144, 0x54E0, 0xD145, 0x550E, + 0xD146, 0x5503, 0xD147, 0x550B, 0xD148, 0x5701, 0xD149, 0x5702, + 0xD14A, 0x57CC, 0xD14B, 0x5832, 0xD14C, 0x57D5, 0xD14D, 0x57D2, + 0xD14E, 0x57BA, 0xD14F, 0x57C6, 0xD150, 0x57BD, 0xD151, 0x57BC, + 0xD152, 0x57B8, 0xD153, 0x57B6, 0xD154, 0x57BF, 0xD155, 0x57C7, + 0xD156, 0x57D0, 0xD157, 0x57B9, 0xD158, 0x57C1, 0xD159, 0x590E, + 0xD15A, 0x594A, 0xD15B, 0x5A19, 0xD15C, 0x5A16, 0xD15D, 0x5A2D, + 0xD15E, 0x5A2E, 0xD15F, 0x5A15, 0xD160, 0x5A0F, 0xD161, 0x5A17, + 0xD162, 0x5A0A, 0xD163, 0x5A1E, 0xD164, 0x5A33, 0xD165, 0x5B6C, + 0xD166, 0x5BA7, 0xD167, 0x5BAD, 0xD168, 0x5BAC, 0xD169, 0x5C03, + 0xD16A, 0x5C56, 0xD16B, 0x5C54, 0xD16C, 0x5CEC, 0xD16D, 0x5CFF, + 0xD16E, 0x5CEE, 0xD16F, 0x5CF1, 0xD170, 0x5CF7, 0xD171, 0x5D00, + 0xD172, 0x5CF9, 0xD173, 0x5E29, 0xD174, 0x5E28, 0xD175, 0x5EA8, + 0xD176, 0x5EAE, 0xD177, 0x5EAA, 0xD178, 0x5EAC, 0xD179, 0x5F33, + 0xD17A, 0x5F30, 0xD17B, 0x5F67, 0xD17C, 0x605D, 0xD17D, 0x605A, + 0xD17E, 0x6067, 0xD1A1, 0x6041, 0xD1A2, 0x60A2, 0xD1A3, 0x6088, + 0xD1A4, 0x6080, 0xD1A5, 0x6092, 0xD1A6, 0x6081, 0xD1A7, 0x609D, + 0xD1A8, 0x6083, 0xD1A9, 0x6095, 0xD1AA, 0x609B, 0xD1AB, 0x6097, + 0xD1AC, 0x6087, 0xD1AD, 0x609C, 0xD1AE, 0x608E, 0xD1AF, 0x6219, + 0xD1B0, 0x6246, 0xD1B1, 0x62F2, 0xD1B2, 0x6310, 0xD1B3, 0x6356, + 0xD1B4, 0x632C, 0xD1B5, 0x6344, 0xD1B6, 0x6345, 0xD1B7, 0x6336, + 0xD1B8, 0x6343, 0xD1B9, 0x63E4, 0xD1BA, 0x6339, 0xD1BB, 0x634B, + 0xD1BC, 0x634A, 0xD1BD, 0x633C, 0xD1BE, 0x6329, 0xD1BF, 0x6341, + 0xD1C0, 0x6334, 0xD1C1, 0x6358, 0xD1C2, 0x6354, 0xD1C3, 0x6359, + 0xD1C4, 0x632D, 0xD1C5, 0x6347, 0xD1C6, 0x6333, 0xD1C7, 0x635A, + 0xD1C8, 0x6351, 0xD1C9, 0x6338, 0xD1CA, 0x6357, 0xD1CB, 0x6340, + 0xD1CC, 0x6348, 0xD1CD, 0x654A, 0xD1CE, 0x6546, 0xD1CF, 0x65C6, + 0xD1D0, 0x65C3, 0xD1D1, 0x65C4, 0xD1D2, 0x65C2, 0xD1D3, 0x664A, + 0xD1D4, 0x665F, 0xD1D5, 0x6647, 0xD1D6, 0x6651, 0xD1D7, 0x6712, + 0xD1D8, 0x6713, 0xD1D9, 0x681F, 0xD1DA, 0x681A, 0xD1DB, 0x6849, + 0xD1DC, 0x6832, 0xD1DD, 0x6833, 0xD1DE, 0x683B, 0xD1DF, 0x684B, + 0xD1E0, 0x684F, 0xD1E1, 0x6816, 0xD1E2, 0x6831, 0xD1E3, 0x681C, + 0xD1E4, 0x6835, 0xD1E5, 0x682B, 0xD1E6, 0x682D, 0xD1E7, 0x682F, + 0xD1E8, 0x684E, 0xD1E9, 0x6844, 0xD1EA, 0x6834, 0xD1EB, 0x681D, + 0xD1EC, 0x6812, 0xD1ED, 0x6814, 0xD1EE, 0x6826, 0xD1EF, 0x6828, + 0xD1F0, 0x682E, 0xD1F1, 0x684D, 0xD1F2, 0x683A, 0xD1F3, 0x6825, + 0xD1F4, 0x6820, 0xD1F5, 0x6B2C, 0xD1F6, 0x6B2F, 0xD1F7, 0x6B2D, + 0xD1F8, 0x6B31, 0xD1F9, 0x6B34, 0xD1FA, 0x6B6D, 0xD1FB, 0x8082, + 0xD1FC, 0x6B88, 0xD1FD, 0x6BE6, 0xD1FE, 0x6BE4, 0xD240, 0x6BE8, + 0xD241, 0x6BE3, 0xD242, 0x6BE2, 0xD243, 0x6BE7, 0xD244, 0x6C25, + 0xD245, 0x6D7A, 0xD246, 0x6D63, 0xD247, 0x6D64, 0xD248, 0x6D76, + 0xD249, 0x6D0D, 0xD24A, 0x6D61, 0xD24B, 0x6D92, 0xD24C, 0x6D58, + 0xD24D, 0x6D62, 0xD24E, 0x6D6D, 0xD24F, 0x6D6F, 0xD250, 0x6D91, + 0xD251, 0x6D8D, 0xD252, 0x6DEF, 0xD253, 0x6D7F, 0xD254, 0x6D86, + 0xD255, 0x6D5E, 0xD256, 0x6D67, 0xD257, 0x6D60, 0xD258, 0x6D97, + 0xD259, 0x6D70, 0xD25A, 0x6D7C, 0xD25B, 0x6D5F, 0xD25C, 0x6D82, + 0xD25D, 0x6D98, 0xD25E, 0x6D2F, 0xD25F, 0x6D68, 0xD260, 0x6D8B, + 0xD261, 0x6D7E, 0xD262, 0x6D80, 0xD263, 0x6D84, 0xD264, 0x6D16, + 0xD265, 0x6D83, 0xD266, 0x6D7B, 0xD267, 0x6D7D, 0xD268, 0x6D75, + 0xD269, 0x6D90, 0xD26A, 0x70DC, 0xD26B, 0x70D3, 0xD26C, 0x70D1, + 0xD26D, 0x70DD, 0xD26E, 0x70CB, 0xD26F, 0x7F39, 0xD270, 0x70E2, + 0xD271, 0x70D7, 0xD272, 0x70D2, 0xD273, 0x70DE, 0xD274, 0x70E0, + 0xD275, 0x70D4, 0xD276, 0x70CD, 0xD277, 0x70C5, 0xD278, 0x70C6, + 0xD279, 0x70C7, 0xD27A, 0x70DA, 0xD27B, 0x70CE, 0xD27C, 0x70E1, + 0xD27D, 0x7242, 0xD27E, 0x7278, 0xD2A1, 0x7277, 0xD2A2, 0x7276, + 0xD2A3, 0x7300, 0xD2A4, 0x72FA, 0xD2A5, 0x72F4, 0xD2A6, 0x72FE, + 0xD2A7, 0x72F6, 0xD2A8, 0x72F3, 0xD2A9, 0x72FB, 0xD2AA, 0x7301, + 0xD2AB, 0x73D3, 0xD2AC, 0x73D9, 0xD2AD, 0x73E5, 0xD2AE, 0x73D6, + 0xD2AF, 0x73BC, 0xD2B0, 0x73E7, 0xD2B1, 0x73E3, 0xD2B2, 0x73E9, + 0xD2B3, 0x73DC, 0xD2B4, 0x73D2, 0xD2B5, 0x73DB, 0xD2B6, 0x73D4, + 0xD2B7, 0x73DD, 0xD2B8, 0x73DA, 0xD2B9, 0x73D7, 0xD2BA, 0x73D8, + 0xD2BB, 0x73E8, 0xD2BC, 0x74DE, 0xD2BD, 0x74DF, 0xD2BE, 0x74F4, + 0xD2BF, 0x74F5, 0xD2C0, 0x7521, 0xD2C1, 0x755B, 0xD2C2, 0x755F, + 0xD2C3, 0x75B0, 0xD2C4, 0x75C1, 0xD2C5, 0x75BB, 0xD2C6, 0x75C4, + 0xD2C7, 0x75C0, 0xD2C8, 0x75BF, 0xD2C9, 0x75B6, 0xD2CA, 0x75BA, + 0xD2CB, 0x768A, 0xD2CC, 0x76C9, 0xD2CD, 0x771D, 0xD2CE, 0x771B, + 0xD2CF, 0x7710, 0xD2D0, 0x7713, 0xD2D1, 0x7712, 0xD2D2, 0x7723, + 0xD2D3, 0x7711, 0xD2D4, 0x7715, 0xD2D5, 0x7719, 0xD2D6, 0x771A, + 0xD2D7, 0x7722, 0xD2D8, 0x7727, 0xD2D9, 0x7823, 0xD2DA, 0x782C, + 0xD2DB, 0x7822, 0xD2DC, 0x7835, 0xD2DD, 0x782F, 0xD2DE, 0x7828, + 0xD2DF, 0x782E, 0xD2E0, 0x782B, 0xD2E1, 0x7821, 0xD2E2, 0x7829, + 0xD2E3, 0x7833, 0xD2E4, 0x782A, 0xD2E5, 0x7831, 0xD2E6, 0x7954, + 0xD2E7, 0x795B, 0xD2E8, 0x794F, 0xD2E9, 0x795C, 0xD2EA, 0x7953, + 0xD2EB, 0x7952, 0xD2EC, 0x7951, 0xD2ED, 0x79EB, 0xD2EE, 0x79EC, + 0xD2EF, 0x79E0, 0xD2F0, 0x79EE, 0xD2F1, 0x79ED, 0xD2F2, 0x79EA, + 0xD2F3, 0x79DC, 0xD2F4, 0x79DE, 0xD2F5, 0x79DD, 0xD2F6, 0x7A86, + 0xD2F7, 0x7A89, 0xD2F8, 0x7A85, 0xD2F9, 0x7A8B, 0xD2FA, 0x7A8C, + 0xD2FB, 0x7A8A, 0xD2FC, 0x7A87, 0xD2FD, 0x7AD8, 0xD2FE, 0x7B10, + 0xD340, 0x7B04, 0xD341, 0x7B13, 0xD342, 0x7B05, 0xD343, 0x7B0F, + 0xD344, 0x7B08, 0xD345, 0x7B0A, 0xD346, 0x7B0E, 0xD347, 0x7B09, + 0xD348, 0x7B12, 0xD349, 0x7C84, 0xD34A, 0x7C91, 0xD34B, 0x7C8A, + 0xD34C, 0x7C8C, 0xD34D, 0x7C88, 0xD34E, 0x7C8D, 0xD34F, 0x7C85, + 0xD350, 0x7D1E, 0xD351, 0x7D1D, 0xD352, 0x7D11, 0xD353, 0x7D0E, + 0xD354, 0x7D18, 0xD355, 0x7D16, 0xD356, 0x7D13, 0xD357, 0x7D1F, + 0xD358, 0x7D12, 0xD359, 0x7D0F, 0xD35A, 0x7D0C, 0xD35B, 0x7F5C, + 0xD35C, 0x7F61, 0xD35D, 0x7F5E, 0xD35E, 0x7F60, 0xD35F, 0x7F5D, + 0xD360, 0x7F5B, 0xD361, 0x7F96, 0xD362, 0x7F92, 0xD363, 0x7FC3, + 0xD364, 0x7FC2, 0xD365, 0x7FC0, 0xD366, 0x8016, 0xD367, 0x803E, + 0xD368, 0x8039, 0xD369, 0x80FA, 0xD36A, 0x80F2, 0xD36B, 0x80F9, + 0xD36C, 0x80F5, 0xD36D, 0x8101, 0xD36E, 0x80FB, 0xD36F, 0x8100, + 0xD370, 0x8201, 0xD371, 0x822F, 0xD372, 0x8225, 0xD373, 0x8333, + 0xD374, 0x832D, 0xD375, 0x8344, 0xD376, 0x8319, 0xD377, 0x8351, + 0xD378, 0x8325, 0xD379, 0x8356, 0xD37A, 0x833F, 0xD37B, 0x8341, + 0xD37C, 0x8326, 0xD37D, 0x831C, 0xD37E, 0x8322, 0xD3A1, 0x8342, + 0xD3A2, 0x834E, 0xD3A3, 0x831B, 0xD3A4, 0x832A, 0xD3A5, 0x8308, + 0xD3A6, 0x833C, 0xD3A7, 0x834D, 0xD3A8, 0x8316, 0xD3A9, 0x8324, + 0xD3AA, 0x8320, 0xD3AB, 0x8337, 0xD3AC, 0x832F, 0xD3AD, 0x8329, + 0xD3AE, 0x8347, 0xD3AF, 0x8345, 0xD3B0, 0x834C, 0xD3B1, 0x8353, + 0xD3B2, 0x831E, 0xD3B3, 0x832C, 0xD3B4, 0x834B, 0xD3B5, 0x8327, + 0xD3B6, 0x8348, 0xD3B7, 0x8653, 0xD3B8, 0x8652, 0xD3B9, 0x86A2, + 0xD3BA, 0x86A8, 0xD3BB, 0x8696, 0xD3BC, 0x868D, 0xD3BD, 0x8691, + 0xD3BE, 0x869E, 0xD3BF, 0x8687, 0xD3C0, 0x8697, 0xD3C1, 0x8686, + 0xD3C2, 0x868B, 0xD3C3, 0x869A, 0xD3C4, 0x8685, 0xD3C5, 0x86A5, + 0xD3C6, 0x8699, 0xD3C7, 0x86A1, 0xD3C8, 0x86A7, 0xD3C9, 0x8695, + 0xD3CA, 0x8698, 0xD3CB, 0x868E, 0xD3CC, 0x869D, 0xD3CD, 0x8690, + 0xD3CE, 0x8694, 0xD3CF, 0x8843, 0xD3D0, 0x8844, 0xD3D1, 0x886D, + 0xD3D2, 0x8875, 0xD3D3, 0x8876, 0xD3D4, 0x8872, 0xD3D5, 0x8880, + 0xD3D6, 0x8871, 0xD3D7, 0x887F, 0xD3D8, 0x886F, 0xD3D9, 0x8883, + 0xD3DA, 0x887E, 0xD3DB, 0x8874, 0xD3DC, 0x887C, 0xD3DD, 0x8A12, + 0xD3DE, 0x8C47, 0xD3DF, 0x8C57, 0xD3E0, 0x8C7B, 0xD3E1, 0x8CA4, + 0xD3E2, 0x8CA3, 0xD3E3, 0x8D76, 0xD3E4, 0x8D78, 0xD3E5, 0x8DB5, + 0xD3E6, 0x8DB7, 0xD3E7, 0x8DB6, 0xD3E8, 0x8ED1, 0xD3E9, 0x8ED3, + 0xD3EA, 0x8FFE, 0xD3EB, 0x8FF5, 0xD3EC, 0x9002, 0xD3ED, 0x8FFF, + 0xD3EE, 0x8FFB, 0xD3EF, 0x9004, 0xD3F0, 0x8FFC, 0xD3F1, 0x8FF6, + 0xD3F2, 0x90D6, 0xD3F3, 0x90E0, 0xD3F4, 0x90D9, 0xD3F5, 0x90DA, + 0xD3F6, 0x90E3, 0xD3F7, 0x90DF, 0xD3F8, 0x90E5, 0xD3F9, 0x90D8, + 0xD3FA, 0x90DB, 0xD3FB, 0x90D7, 0xD3FC, 0x90DC, 0xD3FD, 0x90E4, + 0xD3FE, 0x9150, 0xD440, 0x914E, 0xD441, 0x914F, 0xD442, 0x91D5, + 0xD443, 0x91E2, 0xD444, 0x91DA, 0xD445, 0x965C, 0xD446, 0x965F, + 0xD447, 0x96BC, 0xD448, 0x98E3, 0xD449, 0x9ADF, 0xD44A, 0x9B2F, + 0xD44B, 0x4E7F, 0xD44C, 0x5070, 0xD44D, 0x506A, 0xD44E, 0x5061, + 0xD44F, 0x505E, 0xD450, 0x5060, 0xD451, 0x5053, 0xD452, 0x504B, + 0xD453, 0x505D, 0xD454, 0x5072, 0xD455, 0x5048, 0xD456, 0x504D, + 0xD457, 0x5041, 0xD458, 0x505B, 0xD459, 0x504A, 0xD45A, 0x5062, + 0xD45B, 0x5015, 0xD45C, 0x5045, 0xD45D, 0x505F, 0xD45E, 0x5069, + 0xD45F, 0x506B, 0xD460, 0x5063, 0xD461, 0x5064, 0xD462, 0x5046, + 0xD463, 0x5040, 0xD464, 0x506E, 0xD465, 0x5073, 0xD466, 0x5057, + 0xD467, 0x5051, 0xD468, 0x51D0, 0xD469, 0x526B, 0xD46A, 0x526D, + 0xD46B, 0x526C, 0xD46C, 0x526E, 0xD46D, 0x52D6, 0xD46E, 0x52D3, + 0xD46F, 0x532D, 0xD470, 0x539C, 0xD471, 0x5575, 0xD472, 0x5576, + 0xD473, 0x553C, 0xD474, 0x554D, 0xD475, 0x5550, 0xD476, 0x5534, + 0xD477, 0x552A, 0xD478, 0x5551, 0xD479, 0x5562, 0xD47A, 0x5536, + 0xD47B, 0x5535, 0xD47C, 0x5530, 0xD47D, 0x5552, 0xD47E, 0x5545, + 0xD4A1, 0x550C, 0xD4A2, 0x5532, 0xD4A3, 0x5565, 0xD4A4, 0x554E, + 0xD4A5, 0x5539, 0xD4A6, 0x5548, 0xD4A7, 0x552D, 0xD4A8, 0x553B, + 0xD4A9, 0x5540, 0xD4AA, 0x554B, 0xD4AB, 0x570A, 0xD4AC, 0x5707, + 0xD4AD, 0x57FB, 0xD4AE, 0x5814, 0xD4AF, 0x57E2, 0xD4B0, 0x57F6, + 0xD4B1, 0x57DC, 0xD4B2, 0x57F4, 0xD4B3, 0x5800, 0xD4B4, 0x57ED, + 0xD4B5, 0x57FD, 0xD4B6, 0x5808, 0xD4B7, 0x57F8, 0xD4B8, 0x580B, + 0xD4B9, 0x57F3, 0xD4BA, 0x57CF, 0xD4BB, 0x5807, 0xD4BC, 0x57EE, + 0xD4BD, 0x57E3, 0xD4BE, 0x57F2, 0xD4BF, 0x57E5, 0xD4C0, 0x57EC, + 0xD4C1, 0x57E1, 0xD4C2, 0x580E, 0xD4C3, 0x57FC, 0xD4C4, 0x5810, + 0xD4C5, 0x57E7, 0xD4C6, 0x5801, 0xD4C7, 0x580C, 0xD4C8, 0x57F1, + 0xD4C9, 0x57E9, 0xD4CA, 0x57F0, 0xD4CB, 0x580D, 0xD4CC, 0x5804, + 0xD4CD, 0x595C, 0xD4CE, 0x5A60, 0xD4CF, 0x5A58, 0xD4D0, 0x5A55, + 0xD4D1, 0x5A67, 0xD4D2, 0x5A5E, 0xD4D3, 0x5A38, 0xD4D4, 0x5A35, + 0xD4D5, 0x5A6D, 0xD4D6, 0x5A50, 0xD4D7, 0x5A5F, 0xD4D8, 0x5A65, + 0xD4D9, 0x5A6C, 0xD4DA, 0x5A53, 0xD4DB, 0x5A64, 0xD4DC, 0x5A57, + 0xD4DD, 0x5A43, 0xD4DE, 0x5A5D, 0xD4DF, 0x5A52, 0xD4E0, 0x5A44, + 0xD4E1, 0x5A5B, 0xD4E2, 0x5A48, 0xD4E3, 0x5A8E, 0xD4E4, 0x5A3E, + 0xD4E5, 0x5A4D, 0xD4E6, 0x5A39, 0xD4E7, 0x5A4C, 0xD4E8, 0x5A70, + 0xD4E9, 0x5A69, 0xD4EA, 0x5A47, 0xD4EB, 0x5A51, 0xD4EC, 0x5A56, + 0xD4ED, 0x5A42, 0xD4EE, 0x5A5C, 0xD4EF, 0x5B72, 0xD4F0, 0x5B6E, + 0xD4F1, 0x5BC1, 0xD4F2, 0x5BC0, 0xD4F3, 0x5C59, 0xD4F4, 0x5D1E, + 0xD4F5, 0x5D0B, 0xD4F6, 0x5D1D, 0xD4F7, 0x5D1A, 0xD4F8, 0x5D20, + 0xD4F9, 0x5D0C, 0xD4FA, 0x5D28, 0xD4FB, 0x5D0D, 0xD4FC, 0x5D26, + 0xD4FD, 0x5D25, 0xD4FE, 0x5D0F, 0xD540, 0x5D30, 0xD541, 0x5D12, + 0xD542, 0x5D23, 0xD543, 0x5D1F, 0xD544, 0x5D2E, 0xD545, 0x5E3E, + 0xD546, 0x5E34, 0xD547, 0x5EB1, 0xD548, 0x5EB4, 0xD549, 0x5EB9, + 0xD54A, 0x5EB2, 0xD54B, 0x5EB3, 0xD54C, 0x5F36, 0xD54D, 0x5F38, + 0xD54E, 0x5F9B, 0xD54F, 0x5F96, 0xD550, 0x5F9F, 0xD551, 0x608A, + 0xD552, 0x6090, 0xD553, 0x6086, 0xD554, 0x60BE, 0xD555, 0x60B0, + 0xD556, 0x60BA, 0xD557, 0x60D3, 0xD558, 0x60D4, 0xD559, 0x60CF, + 0xD55A, 0x60E4, 0xD55B, 0x60D9, 0xD55C, 0x60DD, 0xD55D, 0x60C8, + 0xD55E, 0x60B1, 0xD55F, 0x60DB, 0xD560, 0x60B7, 0xD561, 0x60CA, + 0xD562, 0x60BF, 0xD563, 0x60C3, 0xD564, 0x60CD, 0xD565, 0x60C0, + 0xD566, 0x6332, 0xD567, 0x6365, 0xD568, 0x638A, 0xD569, 0x6382, + 0xD56A, 0x637D, 0xD56B, 0x63BD, 0xD56C, 0x639E, 0xD56D, 0x63AD, + 0xD56E, 0x639D, 0xD56F, 0x6397, 0xD570, 0x63AB, 0xD571, 0x638E, + 0xD572, 0x636F, 0xD573, 0x6387, 0xD574, 0x6390, 0xD575, 0x636E, + 0xD576, 0x63AF, 0xD577, 0x6375, 0xD578, 0x639C, 0xD579, 0x636D, + 0xD57A, 0x63AE, 0xD57B, 0x637C, 0xD57C, 0x63A4, 0xD57D, 0x633B, + 0xD57E, 0x639F, 0xD5A1, 0x6378, 0xD5A2, 0x6385, 0xD5A3, 0x6381, + 0xD5A4, 0x6391, 0xD5A5, 0x638D, 0xD5A6, 0x6370, 0xD5A7, 0x6553, + 0xD5A8, 0x65CD, 0xD5A9, 0x6665, 0xD5AA, 0x6661, 0xD5AB, 0x665B, + 0xD5AC, 0x6659, 0xD5AD, 0x665C, 0xD5AE, 0x6662, 0xD5AF, 0x6718, + 0xD5B0, 0x6879, 0xD5B1, 0x6887, 0xD5B2, 0x6890, 0xD5B3, 0x689C, + 0xD5B4, 0x686D, 0xD5B5, 0x686E, 0xD5B6, 0x68AE, 0xD5B7, 0x68AB, + 0xD5B8, 0x6956, 0xD5B9, 0x686F, 0xD5BA, 0x68A3, 0xD5BB, 0x68AC, + 0xD5BC, 0x68A9, 0xD5BD, 0x6875, 0xD5BE, 0x6874, 0xD5BF, 0x68B2, + 0xD5C0, 0x688F, 0xD5C1, 0x6877, 0xD5C2, 0x6892, 0xD5C3, 0x687C, + 0xD5C4, 0x686B, 0xD5C5, 0x6872, 0xD5C6, 0x68AA, 0xD5C7, 0x6880, + 0xD5C8, 0x6871, 0xD5C9, 0x687E, 0xD5CA, 0x689B, 0xD5CB, 0x6896, + 0xD5CC, 0x688B, 0xD5CD, 0x68A0, 0xD5CE, 0x6889, 0xD5CF, 0x68A4, + 0xD5D0, 0x6878, 0xD5D1, 0x687B, 0xD5D2, 0x6891, 0xD5D3, 0x688C, + 0xD5D4, 0x688A, 0xD5D5, 0x687D, 0xD5D6, 0x6B36, 0xD5D7, 0x6B33, + 0xD5D8, 0x6B37, 0xD5D9, 0x6B38, 0xD5DA, 0x6B91, 0xD5DB, 0x6B8F, + 0xD5DC, 0x6B8D, 0xD5DD, 0x6B8E, 0xD5DE, 0x6B8C, 0xD5DF, 0x6C2A, + 0xD5E0, 0x6DC0, 0xD5E1, 0x6DAB, 0xD5E2, 0x6DB4, 0xD5E3, 0x6DB3, + 0xD5E4, 0x6E74, 0xD5E5, 0x6DAC, 0xD5E6, 0x6DE9, 0xD5E7, 0x6DE2, + 0xD5E8, 0x6DB7, 0xD5E9, 0x6DF6, 0xD5EA, 0x6DD4, 0xD5EB, 0x6E00, + 0xD5EC, 0x6DC8, 0xD5ED, 0x6DE0, 0xD5EE, 0x6DDF, 0xD5EF, 0x6DD6, + 0xD5F0, 0x6DBE, 0xD5F1, 0x6DE5, 0xD5F2, 0x6DDC, 0xD5F3, 0x6DDD, + 0xD5F4, 0x6DDB, 0xD5F5, 0x6DF4, 0xD5F6, 0x6DCA, 0xD5F7, 0x6DBD, + 0xD5F8, 0x6DED, 0xD5F9, 0x6DF0, 0xD5FA, 0x6DBA, 0xD5FB, 0x6DD5, + 0xD5FC, 0x6DC2, 0xD5FD, 0x6DCF, 0xD5FE, 0x6DC9, 0xD640, 0x6DD0, + 0xD641, 0x6DF2, 0xD642, 0x6DD3, 0xD643, 0x6DFD, 0xD644, 0x6DD7, + 0xD645, 0x6DCD, 0xD646, 0x6DE3, 0xD647, 0x6DBB, 0xD648, 0x70FA, + 0xD649, 0x710D, 0xD64A, 0x70F7, 0xD64B, 0x7117, 0xD64C, 0x70F4, + 0xD64D, 0x710C, 0xD64E, 0x70F0, 0xD64F, 0x7104, 0xD650, 0x70F3, + 0xD651, 0x7110, 0xD652, 0x70FC, 0xD653, 0x70FF, 0xD654, 0x7106, + 0xD655, 0x7113, 0xD656, 0x7100, 0xD657, 0x70F8, 0xD658, 0x70F6, + 0xD659, 0x710B, 0xD65A, 0x7102, 0xD65B, 0x710E, 0xD65C, 0x727E, + 0xD65D, 0x727B, 0xD65E, 0x727C, 0xD65F, 0x727F, 0xD660, 0x731D, + 0xD661, 0x7317, 0xD662, 0x7307, 0xD663, 0x7311, 0xD664, 0x7318, + 0xD665, 0x730A, 0xD666, 0x7308, 0xD667, 0x72FF, 0xD668, 0x730F, + 0xD669, 0x731E, 0xD66A, 0x7388, 0xD66B, 0x73F6, 0xD66C, 0x73F8, + 0xD66D, 0x73F5, 0xD66E, 0x7404, 0xD66F, 0x7401, 0xD670, 0x73FD, + 0xD671, 0x7407, 0xD672, 0x7400, 0xD673, 0x73FA, 0xD674, 0x73FC, + 0xD675, 0x73FF, 0xD676, 0x740C, 0xD677, 0x740B, 0xD678, 0x73F4, + 0xD679, 0x7408, 0xD67A, 0x7564, 0xD67B, 0x7563, 0xD67C, 0x75CE, + 0xD67D, 0x75D2, 0xD67E, 0x75CF, 0xD6A1, 0x75CB, 0xD6A2, 0x75CC, + 0xD6A3, 0x75D1, 0xD6A4, 0x75D0, 0xD6A5, 0x768F, 0xD6A6, 0x7689, + 0xD6A7, 0x76D3, 0xD6A8, 0x7739, 0xD6A9, 0x772F, 0xD6AA, 0x772D, + 0xD6AB, 0x7731, 0xD6AC, 0x7732, 0xD6AD, 0x7734, 0xD6AE, 0x7733, + 0xD6AF, 0x773D, 0xD6B0, 0x7725, 0xD6B1, 0x773B, 0xD6B2, 0x7735, + 0xD6B3, 0x7848, 0xD6B4, 0x7852, 0xD6B5, 0x7849, 0xD6B6, 0x784D, + 0xD6B7, 0x784A, 0xD6B8, 0x784C, 0xD6B9, 0x7826, 0xD6BA, 0x7845, + 0xD6BB, 0x7850, 0xD6BC, 0x7964, 0xD6BD, 0x7967, 0xD6BE, 0x7969, + 0xD6BF, 0x796A, 0xD6C0, 0x7963, 0xD6C1, 0x796B, 0xD6C2, 0x7961, + 0xD6C3, 0x79BB, 0xD6C4, 0x79FA, 0xD6C5, 0x79F8, 0xD6C6, 0x79F6, + 0xD6C7, 0x79F7, 0xD6C8, 0x7A8F, 0xD6C9, 0x7A94, 0xD6CA, 0x7A90, + 0xD6CB, 0x7B35, 0xD6CC, 0x7B47, 0xD6CD, 0x7B34, 0xD6CE, 0x7B25, + 0xD6CF, 0x7B30, 0xD6D0, 0x7B22, 0xD6D1, 0x7B24, 0xD6D2, 0x7B33, + 0xD6D3, 0x7B18, 0xD6D4, 0x7B2A, 0xD6D5, 0x7B1D, 0xD6D6, 0x7B31, + 0xD6D7, 0x7B2B, 0xD6D8, 0x7B2D, 0xD6D9, 0x7B2F, 0xD6DA, 0x7B32, + 0xD6DB, 0x7B38, 0xD6DC, 0x7B1A, 0xD6DD, 0x7B23, 0xD6DE, 0x7C94, + 0xD6DF, 0x7C98, 0xD6E0, 0x7C96, 0xD6E1, 0x7CA3, 0xD6E2, 0x7D35, + 0xD6E3, 0x7D3D, 0xD6E4, 0x7D38, 0xD6E5, 0x7D36, 0xD6E6, 0x7D3A, + 0xD6E7, 0x7D45, 0xD6E8, 0x7D2C, 0xD6E9, 0x7D29, 0xD6EA, 0x7D41, + 0xD6EB, 0x7D47, 0xD6EC, 0x7D3E, 0xD6ED, 0x7D3F, 0xD6EE, 0x7D4A, + 0xD6EF, 0x7D3B, 0xD6F0, 0x7D28, 0xD6F1, 0x7F63, 0xD6F2, 0x7F95, + 0xD6F3, 0x7F9C, 0xD6F4, 0x7F9D, 0xD6F5, 0x7F9B, 0xD6F6, 0x7FCA, + 0xD6F7, 0x7FCB, 0xD6F8, 0x7FCD, 0xD6F9, 0x7FD0, 0xD6FA, 0x7FD1, + 0xD6FB, 0x7FC7, 0xD6FC, 0x7FCF, 0xD6FD, 0x7FC9, 0xD6FE, 0x801F, + 0xD740, 0x801E, 0xD741, 0x801B, 0xD742, 0x8047, 0xD743, 0x8043, + 0xD744, 0x8048, 0xD745, 0x8118, 0xD746, 0x8125, 0xD747, 0x8119, + 0xD748, 0x811B, 0xD749, 0x812D, 0xD74A, 0x811F, 0xD74B, 0x812C, + 0xD74C, 0x811E, 0xD74D, 0x8121, 0xD74E, 0x8115, 0xD74F, 0x8127, + 0xD750, 0x811D, 0xD751, 0x8122, 0xD752, 0x8211, 0xD753, 0x8238, + 0xD754, 0x8233, 0xD755, 0x823A, 0xD756, 0x8234, 0xD757, 0x8232, + 0xD758, 0x8274, 0xD759, 0x8390, 0xD75A, 0x83A3, 0xD75B, 0x83A8, + 0xD75C, 0x838D, 0xD75D, 0x837A, 0xD75E, 0x8373, 0xD75F, 0x83A4, + 0xD760, 0x8374, 0xD761, 0x838F, 0xD762, 0x8381, 0xD763, 0x8395, + 0xD764, 0x8399, 0xD765, 0x8375, 0xD766, 0x8394, 0xD767, 0x83A9, + 0xD768, 0x837D, 0xD769, 0x8383, 0xD76A, 0x838C, 0xD76B, 0x839D, + 0xD76C, 0x839B, 0xD76D, 0x83AA, 0xD76E, 0x838B, 0xD76F, 0x837E, + 0xD770, 0x83A5, 0xD771, 0x83AF, 0xD772, 0x8388, 0xD773, 0x8397, + 0xD774, 0x83B0, 0xD775, 0x837F, 0xD776, 0x83A6, 0xD777, 0x8387, + 0xD778, 0x83AE, 0xD779, 0x8376, 0xD77A, 0x839A, 0xD77B, 0x8659, + 0xD77C, 0x8656, 0xD77D, 0x86BF, 0xD77E, 0x86B7, 0xD7A1, 0x86C2, + 0xD7A2, 0x86C1, 0xD7A3, 0x86C5, 0xD7A4, 0x86BA, 0xD7A5, 0x86B0, + 0xD7A6, 0x86C8, 0xD7A7, 0x86B9, 0xD7A8, 0x86B3, 0xD7A9, 0x86B8, + 0xD7AA, 0x86CC, 0xD7AB, 0x86B4, 0xD7AC, 0x86BB, 0xD7AD, 0x86BC, + 0xD7AE, 0x86C3, 0xD7AF, 0x86BD, 0xD7B0, 0x86BE, 0xD7B1, 0x8852, + 0xD7B2, 0x8889, 0xD7B3, 0x8895, 0xD7B4, 0x88A8, 0xD7B5, 0x88A2, + 0xD7B6, 0x88AA, 0xD7B7, 0x889A, 0xD7B8, 0x8891, 0xD7B9, 0x88A1, + 0xD7BA, 0x889F, 0xD7BB, 0x8898, 0xD7BC, 0x88A7, 0xD7BD, 0x8899, + 0xD7BE, 0x889B, 0xD7BF, 0x8897, 0xD7C0, 0x88A4, 0xD7C1, 0x88AC, + 0xD7C2, 0x888C, 0xD7C3, 0x8893, 0xD7C4, 0x888E, 0xD7C5, 0x8982, + 0xD7C6, 0x89D6, 0xD7C7, 0x89D9, 0xD7C8, 0x89D5, 0xD7C9, 0x8A30, + 0xD7CA, 0x8A27, 0xD7CB, 0x8A2C, 0xD7CC, 0x8A1E, 0xD7CD, 0x8C39, + 0xD7CE, 0x8C3B, 0xD7CF, 0x8C5C, 0xD7D0, 0x8C5D, 0xD7D1, 0x8C7D, + 0xD7D2, 0x8CA5, 0xD7D3, 0x8D7D, 0xD7D4, 0x8D7B, 0xD7D5, 0x8D79, + 0xD7D6, 0x8DBC, 0xD7D7, 0x8DC2, 0xD7D8, 0x8DB9, 0xD7D9, 0x8DBF, + 0xD7DA, 0x8DC1, 0xD7DB, 0x8ED8, 0xD7DC, 0x8EDE, 0xD7DD, 0x8EDD, + 0xD7DE, 0x8EDC, 0xD7DF, 0x8ED7, 0xD7E0, 0x8EE0, 0xD7E1, 0x8EE1, + 0xD7E2, 0x9024, 0xD7E3, 0x900B, 0xD7E4, 0x9011, 0xD7E5, 0x901C, + 0xD7E6, 0x900C, 0xD7E7, 0x9021, 0xD7E8, 0x90EF, 0xD7E9, 0x90EA, + 0xD7EA, 0x90F0, 0xD7EB, 0x90F4, 0xD7EC, 0x90F2, 0xD7ED, 0x90F3, + 0xD7EE, 0x90D4, 0xD7EF, 0x90EB, 0xD7F0, 0x90EC, 0xD7F1, 0x90E9, + 0xD7F2, 0x9156, 0xD7F3, 0x9158, 0xD7F4, 0x915A, 0xD7F5, 0x9153, + 0xD7F6, 0x9155, 0xD7F7, 0x91EC, 0xD7F8, 0x91F4, 0xD7F9, 0x91F1, + 0xD7FA, 0x91F3, 0xD7FB, 0x91F8, 0xD7FC, 0x91E4, 0xD7FD, 0x91F9, + 0xD7FE, 0x91EA, 0xD840, 0x91EB, 0xD841, 0x91F7, 0xD842, 0x91E8, + 0xD843, 0x91EE, 0xD844, 0x957A, 0xD845, 0x9586, 0xD846, 0x9588, + 0xD847, 0x967C, 0xD848, 0x966D, 0xD849, 0x966B, 0xD84A, 0x9671, + 0xD84B, 0x966F, 0xD84C, 0x96BF, 0xD84D, 0x976A, 0xD84E, 0x9804, + 0xD84F, 0x98E5, 0xD850, 0x9997, 0xD851, 0x509B, 0xD852, 0x5095, + 0xD853, 0x5094, 0xD854, 0x509E, 0xD855, 0x508B, 0xD856, 0x50A3, + 0xD857, 0x5083, 0xD858, 0x508C, 0xD859, 0x508E, 0xD85A, 0x509D, + 0xD85B, 0x5068, 0xD85C, 0x509C, 0xD85D, 0x5092, 0xD85E, 0x5082, + 0xD85F, 0x5087, 0xD860, 0x515F, 0xD861, 0x51D4, 0xD862, 0x5312, + 0xD863, 0x5311, 0xD864, 0x53A4, 0xD865, 0x53A7, 0xD866, 0x5591, + 0xD867, 0x55A8, 0xD868, 0x55A5, 0xD869, 0x55AD, 0xD86A, 0x5577, + 0xD86B, 0x5645, 0xD86C, 0x55A2, 0xD86D, 0x5593, 0xD86E, 0x5588, + 0xD86F, 0x558F, 0xD870, 0x55B5, 0xD871, 0x5581, 0xD872, 0x55A3, + 0xD873, 0x5592, 0xD874, 0x55A4, 0xD875, 0x557D, 0xD876, 0x558C, + 0xD877, 0x55A6, 0xD878, 0x557F, 0xD879, 0x5595, 0xD87A, 0x55A1, + 0xD87B, 0x558E, 0xD87C, 0x570C, 0xD87D, 0x5829, 0xD87E, 0x5837, + 0xD8A1, 0x5819, 0xD8A2, 0x581E, 0xD8A3, 0x5827, 0xD8A4, 0x5823, + 0xD8A5, 0x5828, 0xD8A6, 0x57F5, 0xD8A7, 0x5848, 0xD8A8, 0x5825, + 0xD8A9, 0x581C, 0xD8AA, 0x581B, 0xD8AB, 0x5833, 0xD8AC, 0x583F, + 0xD8AD, 0x5836, 0xD8AE, 0x582E, 0xD8AF, 0x5839, 0xD8B0, 0x5838, + 0xD8B1, 0x582D, 0xD8B2, 0x582C, 0xD8B3, 0x583B, 0xD8B4, 0x5961, + 0xD8B5, 0x5AAF, 0xD8B6, 0x5A94, 0xD8B7, 0x5A9F, 0xD8B8, 0x5A7A, + 0xD8B9, 0x5AA2, 0xD8BA, 0x5A9E, 0xD8BB, 0x5A78, 0xD8BC, 0x5AA6, + 0xD8BD, 0x5A7C, 0xD8BE, 0x5AA5, 0xD8BF, 0x5AAC, 0xD8C0, 0x5A95, + 0xD8C1, 0x5AAE, 0xD8C2, 0x5A37, 0xD8C3, 0x5A84, 0xD8C4, 0x5A8A, + 0xD8C5, 0x5A97, 0xD8C6, 0x5A83, 0xD8C7, 0x5A8B, 0xD8C8, 0x5AA9, + 0xD8C9, 0x5A7B, 0xD8CA, 0x5A7D, 0xD8CB, 0x5A8C, 0xD8CC, 0x5A9C, + 0xD8CD, 0x5A8F, 0xD8CE, 0x5A93, 0xD8CF, 0x5A9D, 0xD8D0, 0x5BEA, + 0xD8D1, 0x5BCD, 0xD8D2, 0x5BCB, 0xD8D3, 0x5BD4, 0xD8D4, 0x5BD1, + 0xD8D5, 0x5BCA, 0xD8D6, 0x5BCE, 0xD8D7, 0x5C0C, 0xD8D8, 0x5C30, + 0xD8D9, 0x5D37, 0xD8DA, 0x5D43, 0xD8DB, 0x5D6B, 0xD8DC, 0x5D41, + 0xD8DD, 0x5D4B, 0xD8DE, 0x5D3F, 0xD8DF, 0x5D35, 0xD8E0, 0x5D51, + 0xD8E1, 0x5D4E, 0xD8E2, 0x5D55, 0xD8E3, 0x5D33, 0xD8E4, 0x5D3A, + 0xD8E5, 0x5D52, 0xD8E6, 0x5D3D, 0xD8E7, 0x5D31, 0xD8E8, 0x5D59, + 0xD8E9, 0x5D42, 0xD8EA, 0x5D39, 0xD8EB, 0x5D49, 0xD8EC, 0x5D38, + 0xD8ED, 0x5D3C, 0xD8EE, 0x5D32, 0xD8EF, 0x5D36, 0xD8F0, 0x5D40, + 0xD8F1, 0x5D45, 0xD8F2, 0x5E44, 0xD8F3, 0x5E41, 0xD8F4, 0x5F58, + 0xD8F5, 0x5FA6, 0xD8F6, 0x5FA5, 0xD8F7, 0x5FAB, 0xD8F8, 0x60C9, + 0xD8F9, 0x60B9, 0xD8FA, 0x60CC, 0xD8FB, 0x60E2, 0xD8FC, 0x60CE, + 0xD8FD, 0x60C4, 0xD8FE, 0x6114, 0xD940, 0x60F2, 0xD941, 0x610A, + 0xD942, 0x6116, 0xD943, 0x6105, 0xD944, 0x60F5, 0xD945, 0x6113, + 0xD946, 0x60F8, 0xD947, 0x60FC, 0xD948, 0x60FE, 0xD949, 0x60C1, + 0xD94A, 0x6103, 0xD94B, 0x6118, 0xD94C, 0x611D, 0xD94D, 0x6110, + 0xD94E, 0x60FF, 0xD94F, 0x6104, 0xD950, 0x610B, 0xD951, 0x624A, + 0xD952, 0x6394, 0xD953, 0x63B1, 0xD954, 0x63B0, 0xD955, 0x63CE, + 0xD956, 0x63E5, 0xD957, 0x63E8, 0xD958, 0x63EF, 0xD959, 0x63C3, + 0xD95A, 0x649D, 0xD95B, 0x63F3, 0xD95C, 0x63CA, 0xD95D, 0x63E0, + 0xD95E, 0x63F6, 0xD95F, 0x63D5, 0xD960, 0x63F2, 0xD961, 0x63F5, + 0xD962, 0x6461, 0xD963, 0x63DF, 0xD964, 0x63BE, 0xD965, 0x63DD, + 0xD966, 0x63DC, 0xD967, 0x63C4, 0xD968, 0x63D8, 0xD969, 0x63D3, + 0xD96A, 0x63C2, 0xD96B, 0x63C7, 0xD96C, 0x63CC, 0xD96D, 0x63CB, + 0xD96E, 0x63C8, 0xD96F, 0x63F0, 0xD970, 0x63D7, 0xD971, 0x63D9, + 0xD972, 0x6532, 0xD973, 0x6567, 0xD974, 0x656A, 0xD975, 0x6564, + 0xD976, 0x655C, 0xD977, 0x6568, 0xD978, 0x6565, 0xD979, 0x658C, + 0xD97A, 0x659D, 0xD97B, 0x659E, 0xD97C, 0x65AE, 0xD97D, 0x65D0, + 0xD97E, 0x65D2, 0xD9A1, 0x667C, 0xD9A2, 0x666C, 0xD9A3, 0x667B, + 0xD9A4, 0x6680, 0xD9A5, 0x6671, 0xD9A6, 0x6679, 0xD9A7, 0x666A, + 0xD9A8, 0x6672, 0xD9A9, 0x6701, 0xD9AA, 0x690C, 0xD9AB, 0x68D3, + 0xD9AC, 0x6904, 0xD9AD, 0x68DC, 0xD9AE, 0x692A, 0xD9AF, 0x68EC, + 0xD9B0, 0x68EA, 0xD9B1, 0x68F1, 0xD9B2, 0x690F, 0xD9B3, 0x68D6, + 0xD9B4, 0x68F7, 0xD9B5, 0x68EB, 0xD9B6, 0x68E4, 0xD9B7, 0x68F6, + 0xD9B8, 0x6913, 0xD9B9, 0x6910, 0xD9BA, 0x68F3, 0xD9BB, 0x68E1, + 0xD9BC, 0x6907, 0xD9BD, 0x68CC, 0xD9BE, 0x6908, 0xD9BF, 0x6970, + 0xD9C0, 0x68B4, 0xD9C1, 0x6911, 0xD9C2, 0x68EF, 0xD9C3, 0x68C6, + 0xD9C4, 0x6914, 0xD9C5, 0x68F8, 0xD9C6, 0x68D0, 0xD9C7, 0x68FD, + 0xD9C8, 0x68FC, 0xD9C9, 0x68E8, 0xD9CA, 0x690B, 0xD9CB, 0x690A, + 0xD9CC, 0x6917, 0xD9CD, 0x68CE, 0xD9CE, 0x68C8, 0xD9CF, 0x68DD, + 0xD9D0, 0x68DE, 0xD9D1, 0x68E6, 0xD9D2, 0x68F4, 0xD9D3, 0x68D1, + 0xD9D4, 0x6906, 0xD9D5, 0x68D4, 0xD9D6, 0x68E9, 0xD9D7, 0x6915, + 0xD9D8, 0x6925, 0xD9D9, 0x68C7, 0xD9DA, 0x6B39, 0xD9DB, 0x6B3B, + 0xD9DC, 0x6B3F, 0xD9DD, 0x6B3C, 0xD9DE, 0x6B94, 0xD9DF, 0x6B97, + 0xD9E0, 0x6B99, 0xD9E1, 0x6B95, 0xD9E2, 0x6BBD, 0xD9E3, 0x6BF0, + 0xD9E4, 0x6BF2, 0xD9E5, 0x6BF3, 0xD9E6, 0x6C30, 0xD9E7, 0x6DFC, + 0xD9E8, 0x6E46, 0xD9E9, 0x6E47, 0xD9EA, 0x6E1F, 0xD9EB, 0x6E49, + 0xD9EC, 0x6E88, 0xD9ED, 0x6E3C, 0xD9EE, 0x6E3D, 0xD9EF, 0x6E45, + 0xD9F0, 0x6E62, 0xD9F1, 0x6E2B, 0xD9F2, 0x6E3F, 0xD9F3, 0x6E41, + 0xD9F4, 0x6E5D, 0xD9F5, 0x6E73, 0xD9F6, 0x6E1C, 0xD9F7, 0x6E33, + 0xD9F8, 0x6E4B, 0xD9F9, 0x6E40, 0xD9FA, 0x6E51, 0xD9FB, 0x6E3B, + 0xD9FC, 0x6E03, 0xD9FD, 0x6E2E, 0xD9FE, 0x6E5E, 0xDA40, 0x6E68, + 0xDA41, 0x6E5C, 0xDA42, 0x6E61, 0xDA43, 0x6E31, 0xDA44, 0x6E28, + 0xDA45, 0x6E60, 0xDA46, 0x6E71, 0xDA47, 0x6E6B, 0xDA48, 0x6E39, + 0xDA49, 0x6E22, 0xDA4A, 0x6E30, 0xDA4B, 0x6E53, 0xDA4C, 0x6E65, + 0xDA4D, 0x6E27, 0xDA4E, 0x6E78, 0xDA4F, 0x6E64, 0xDA50, 0x6E77, + 0xDA51, 0x6E55, 0xDA52, 0x6E79, 0xDA53, 0x6E52, 0xDA54, 0x6E66, + 0xDA55, 0x6E35, 0xDA56, 0x6E36, 0xDA57, 0x6E5A, 0xDA58, 0x7120, + 0xDA59, 0x711E, 0xDA5A, 0x712F, 0xDA5B, 0x70FB, 0xDA5C, 0x712E, + 0xDA5D, 0x7131, 0xDA5E, 0x7123, 0xDA5F, 0x7125, 0xDA60, 0x7122, + 0xDA61, 0x7132, 0xDA62, 0x711F, 0xDA63, 0x7128, 0xDA64, 0x713A, + 0xDA65, 0x711B, 0xDA66, 0x724B, 0xDA67, 0x725A, 0xDA68, 0x7288, + 0xDA69, 0x7289, 0xDA6A, 0x7286, 0xDA6B, 0x7285, 0xDA6C, 0x728B, + 0xDA6D, 0x7312, 0xDA6E, 0x730B, 0xDA6F, 0x7330, 0xDA70, 0x7322, + 0xDA71, 0x7331, 0xDA72, 0x7333, 0xDA73, 0x7327, 0xDA74, 0x7332, + 0xDA75, 0x732D, 0xDA76, 0x7326, 0xDA77, 0x7323, 0xDA78, 0x7335, + 0xDA79, 0x730C, 0xDA7A, 0x742E, 0xDA7B, 0x742C, 0xDA7C, 0x7430, + 0xDA7D, 0x742B, 0xDA7E, 0x7416, 0xDAA1, 0x741A, 0xDAA2, 0x7421, + 0xDAA3, 0x742D, 0xDAA4, 0x7431, 0xDAA5, 0x7424, 0xDAA6, 0x7423, + 0xDAA7, 0x741D, 0xDAA8, 0x7429, 0xDAA9, 0x7420, 0xDAAA, 0x7432, + 0xDAAB, 0x74FB, 0xDAAC, 0x752F, 0xDAAD, 0x756F, 0xDAAE, 0x756C, + 0xDAAF, 0x75E7, 0xDAB0, 0x75DA, 0xDAB1, 0x75E1, 0xDAB2, 0x75E6, + 0xDAB3, 0x75DD, 0xDAB4, 0x75DF, 0xDAB5, 0x75E4, 0xDAB6, 0x75D7, + 0xDAB7, 0x7695, 0xDAB8, 0x7692, 0xDAB9, 0x76DA, 0xDABA, 0x7746, + 0xDABB, 0x7747, 0xDABC, 0x7744, 0xDABD, 0x774D, 0xDABE, 0x7745, + 0xDABF, 0x774A, 0xDAC0, 0x774E, 0xDAC1, 0x774B, 0xDAC2, 0x774C, + 0xDAC3, 0x77DE, 0xDAC4, 0x77EC, 0xDAC5, 0x7860, 0xDAC6, 0x7864, + 0xDAC7, 0x7865, 0xDAC8, 0x785C, 0xDAC9, 0x786D, 0xDACA, 0x7871, + 0xDACB, 0x786A, 0xDACC, 0x786E, 0xDACD, 0x7870, 0xDACE, 0x7869, + 0xDACF, 0x7868, 0xDAD0, 0x785E, 0xDAD1, 0x7862, 0xDAD2, 0x7974, + 0xDAD3, 0x7973, 0xDAD4, 0x7972, 0xDAD5, 0x7970, 0xDAD6, 0x7A02, + 0xDAD7, 0x7A0A, 0xDAD8, 0x7A03, 0xDAD9, 0x7A0C, 0xDADA, 0x7A04, + 0xDADB, 0x7A99, 0xDADC, 0x7AE6, 0xDADD, 0x7AE4, 0xDADE, 0x7B4A, + 0xDADF, 0x7B3B, 0xDAE0, 0x7B44, 0xDAE1, 0x7B48, 0xDAE2, 0x7B4C, + 0xDAE3, 0x7B4E, 0xDAE4, 0x7B40, 0xDAE5, 0x7B58, 0xDAE6, 0x7B45, + 0xDAE7, 0x7CA2, 0xDAE8, 0x7C9E, 0xDAE9, 0x7CA8, 0xDAEA, 0x7CA1, + 0xDAEB, 0x7D58, 0xDAEC, 0x7D6F, 0xDAED, 0x7D63, 0xDAEE, 0x7D53, + 0xDAEF, 0x7D56, 0xDAF0, 0x7D67, 0xDAF1, 0x7D6A, 0xDAF2, 0x7D4F, + 0xDAF3, 0x7D6D, 0xDAF4, 0x7D5C, 0xDAF5, 0x7D6B, 0xDAF6, 0x7D52, + 0xDAF7, 0x7D54, 0xDAF8, 0x7D69, 0xDAF9, 0x7D51, 0xDAFA, 0x7D5F, + 0xDAFB, 0x7D4E, 0xDAFC, 0x7F3E, 0xDAFD, 0x7F3F, 0xDAFE, 0x7F65, + 0xDB40, 0x7F66, 0xDB41, 0x7FA2, 0xDB42, 0x7FA0, 0xDB43, 0x7FA1, + 0xDB44, 0x7FD7, 0xDB45, 0x8051, 0xDB46, 0x804F, 0xDB47, 0x8050, + 0xDB48, 0x80FE, 0xDB49, 0x80D4, 0xDB4A, 0x8143, 0xDB4B, 0x814A, + 0xDB4C, 0x8152, 0xDB4D, 0x814F, 0xDB4E, 0x8147, 0xDB4F, 0x813D, + 0xDB50, 0x814D, 0xDB51, 0x813A, 0xDB52, 0x81E6, 0xDB53, 0x81EE, + 0xDB54, 0x81F7, 0xDB55, 0x81F8, 0xDB56, 0x81F9, 0xDB57, 0x8204, + 0xDB58, 0x823C, 0xDB59, 0x823D, 0xDB5A, 0x823F, 0xDB5B, 0x8275, + 0xDB5C, 0x833B, 0xDB5D, 0x83CF, 0xDB5E, 0x83F9, 0xDB5F, 0x8423, + 0xDB60, 0x83C0, 0xDB61, 0x83E8, 0xDB62, 0x8412, 0xDB63, 0x83E7, + 0xDB64, 0x83E4, 0xDB65, 0x83FC, 0xDB66, 0x83F6, 0xDB67, 0x8410, + 0xDB68, 0x83C6, 0xDB69, 0x83C8, 0xDB6A, 0x83EB, 0xDB6B, 0x83E3, + 0xDB6C, 0x83BF, 0xDB6D, 0x8401, 0xDB6E, 0x83DD, 0xDB6F, 0x83E5, + 0xDB70, 0x83D8, 0xDB71, 0x83FF, 0xDB72, 0x83E1, 0xDB73, 0x83CB, + 0xDB74, 0x83CE, 0xDB75, 0x83D6, 0xDB76, 0x83F5, 0xDB77, 0x83C9, + 0xDB78, 0x8409, 0xDB79, 0x840F, 0xDB7A, 0x83DE, 0xDB7B, 0x8411, + 0xDB7C, 0x8406, 0xDB7D, 0x83C2, 0xDB7E, 0x83F3, 0xDBA1, 0x83D5, + 0xDBA2, 0x83FA, 0xDBA3, 0x83C7, 0xDBA4, 0x83D1, 0xDBA5, 0x83EA, + 0xDBA6, 0x8413, 0xDBA7, 0x83C3, 0xDBA8, 0x83EC, 0xDBA9, 0x83EE, + 0xDBAA, 0x83C4, 0xDBAB, 0x83FB, 0xDBAC, 0x83D7, 0xDBAD, 0x83E2, + 0xDBAE, 0x841B, 0xDBAF, 0x83DB, 0xDBB0, 0x83FE, 0xDBB1, 0x86D8, + 0xDBB2, 0x86E2, 0xDBB3, 0x86E6, 0xDBB4, 0x86D3, 0xDBB5, 0x86E3, + 0xDBB6, 0x86DA, 0xDBB7, 0x86EA, 0xDBB8, 0x86DD, 0xDBB9, 0x86EB, + 0xDBBA, 0x86DC, 0xDBBB, 0x86EC, 0xDBBC, 0x86E9, 0xDBBD, 0x86D7, + 0xDBBE, 0x86E8, 0xDBBF, 0x86D1, 0xDBC0, 0x8848, 0xDBC1, 0x8856, + 0xDBC2, 0x8855, 0xDBC3, 0x88BA, 0xDBC4, 0x88D7, 0xDBC5, 0x88B9, + 0xDBC6, 0x88B8, 0xDBC7, 0x88C0, 0xDBC8, 0x88BE, 0xDBC9, 0x88B6, + 0xDBCA, 0x88BC, 0xDBCB, 0x88B7, 0xDBCC, 0x88BD, 0xDBCD, 0x88B2, + 0xDBCE, 0x8901, 0xDBCF, 0x88C9, 0xDBD0, 0x8995, 0xDBD1, 0x8998, + 0xDBD2, 0x8997, 0xDBD3, 0x89DD, 0xDBD4, 0x89DA, 0xDBD5, 0x89DB, + 0xDBD6, 0x8A4E, 0xDBD7, 0x8A4D, 0xDBD8, 0x8A39, 0xDBD9, 0x8A59, + 0xDBDA, 0x8A40, 0xDBDB, 0x8A57, 0xDBDC, 0x8A58, 0xDBDD, 0x8A44, + 0xDBDE, 0x8A45, 0xDBDF, 0x8A52, 0xDBE0, 0x8A48, 0xDBE1, 0x8A51, + 0xDBE2, 0x8A4A, 0xDBE3, 0x8A4C, 0xDBE4, 0x8A4F, 0xDBE5, 0x8C5F, + 0xDBE6, 0x8C81, 0xDBE7, 0x8C80, 0xDBE8, 0x8CBA, 0xDBE9, 0x8CBE, + 0xDBEA, 0x8CB0, 0xDBEB, 0x8CB9, 0xDBEC, 0x8CB5, 0xDBED, 0x8D84, + 0xDBEE, 0x8D80, 0xDBEF, 0x8D89, 0xDBF0, 0x8DD8, 0xDBF1, 0x8DD3, + 0xDBF2, 0x8DCD, 0xDBF3, 0x8DC7, 0xDBF4, 0x8DD6, 0xDBF5, 0x8DDC, + 0xDBF6, 0x8DCF, 0xDBF7, 0x8DD5, 0xDBF8, 0x8DD9, 0xDBF9, 0x8DC8, + 0xDBFA, 0x8DD7, 0xDBFB, 0x8DC5, 0xDBFC, 0x8EEF, 0xDBFD, 0x8EF7, + 0xDBFE, 0x8EFA, 0xDC40, 0x8EF9, 0xDC41, 0x8EE6, 0xDC42, 0x8EEE, + 0xDC43, 0x8EE5, 0xDC44, 0x8EF5, 0xDC45, 0x8EE7, 0xDC46, 0x8EE8, + 0xDC47, 0x8EF6, 0xDC48, 0x8EEB, 0xDC49, 0x8EF1, 0xDC4A, 0x8EEC, + 0xDC4B, 0x8EF4, 0xDC4C, 0x8EE9, 0xDC4D, 0x902D, 0xDC4E, 0x9034, + 0xDC4F, 0x902F, 0xDC50, 0x9106, 0xDC51, 0x912C, 0xDC52, 0x9104, + 0xDC53, 0x90FF, 0xDC54, 0x90FC, 0xDC55, 0x9108, 0xDC56, 0x90F9, + 0xDC57, 0x90FB, 0xDC58, 0x9101, 0xDC59, 0x9100, 0xDC5A, 0x9107, + 0xDC5B, 0x9105, 0xDC5C, 0x9103, 0xDC5D, 0x9161, 0xDC5E, 0x9164, + 0xDC5F, 0x915F, 0xDC60, 0x9162, 0xDC61, 0x9160, 0xDC62, 0x9201, + 0xDC63, 0x920A, 0xDC64, 0x9225, 0xDC65, 0x9203, 0xDC66, 0x921A, + 0xDC67, 0x9226, 0xDC68, 0x920F, 0xDC69, 0x920C, 0xDC6A, 0x9200, + 0xDC6B, 0x9212, 0xDC6C, 0x91FF, 0xDC6D, 0x91FD, 0xDC6E, 0x9206, + 0xDC6F, 0x9204, 0xDC70, 0x9227, 0xDC71, 0x9202, 0xDC72, 0x921C, + 0xDC73, 0x9224, 0xDC74, 0x9219, 0xDC75, 0x9217, 0xDC76, 0x9205, + 0xDC77, 0x9216, 0xDC78, 0x957B, 0xDC79, 0x958D, 0xDC7A, 0x958C, + 0xDC7B, 0x9590, 0xDC7C, 0x9687, 0xDC7D, 0x967E, 0xDC7E, 0x9688, + 0xDCA1, 0x9689, 0xDCA2, 0x9683, 0xDCA3, 0x9680, 0xDCA4, 0x96C2, + 0xDCA5, 0x96C8, 0xDCA6, 0x96C3, 0xDCA7, 0x96F1, 0xDCA8, 0x96F0, + 0xDCA9, 0x976C, 0xDCAA, 0x9770, 0xDCAB, 0x976E, 0xDCAC, 0x9807, + 0xDCAD, 0x98A9, 0xDCAE, 0x98EB, 0xDCAF, 0x9CE6, 0xDCB0, 0x9EF9, + 0xDCB1, 0x4E83, 0xDCB2, 0x4E84, 0xDCB3, 0x4EB6, 0xDCB4, 0x50BD, + 0xDCB5, 0x50BF, 0xDCB6, 0x50C6, 0xDCB7, 0x50AE, 0xDCB8, 0x50C4, + 0xDCB9, 0x50CA, 0xDCBA, 0x50B4, 0xDCBB, 0x50C8, 0xDCBC, 0x50C2, + 0xDCBD, 0x50B0, 0xDCBE, 0x50C1, 0xDCBF, 0x50BA, 0xDCC0, 0x50B1, + 0xDCC1, 0x50CB, 0xDCC2, 0x50C9, 0xDCC3, 0x50B6, 0xDCC4, 0x50B8, + 0xDCC5, 0x51D7, 0xDCC6, 0x527A, 0xDCC7, 0x5278, 0xDCC8, 0x527B, + 0xDCC9, 0x527C, 0xDCCA, 0x55C3, 0xDCCB, 0x55DB, 0xDCCC, 0x55CC, + 0xDCCD, 0x55D0, 0xDCCE, 0x55CB, 0xDCCF, 0x55CA, 0xDCD0, 0x55DD, + 0xDCD1, 0x55C0, 0xDCD2, 0x55D4, 0xDCD3, 0x55C4, 0xDCD4, 0x55E9, + 0xDCD5, 0x55BF, 0xDCD6, 0x55D2, 0xDCD7, 0x558D, 0xDCD8, 0x55CF, + 0xDCD9, 0x55D5, 0xDCDA, 0x55E2, 0xDCDB, 0x55D6, 0xDCDC, 0x55C8, + 0xDCDD, 0x55F2, 0xDCDE, 0x55CD, 0xDCDF, 0x55D9, 0xDCE0, 0x55C2, + 0xDCE1, 0x5714, 0xDCE2, 0x5853, 0xDCE3, 0x5868, 0xDCE4, 0x5864, + 0xDCE5, 0x584F, 0xDCE6, 0x584D, 0xDCE7, 0x5849, 0xDCE8, 0x586F, + 0xDCE9, 0x5855, 0xDCEA, 0x584E, 0xDCEB, 0x585D, 0xDCEC, 0x5859, + 0xDCED, 0x5865, 0xDCEE, 0x585B, 0xDCEF, 0x583D, 0xDCF0, 0x5863, + 0xDCF1, 0x5871, 0xDCF2, 0x58FC, 0xDCF3, 0x5AC7, 0xDCF4, 0x5AC4, + 0xDCF5, 0x5ACB, 0xDCF6, 0x5ABA, 0xDCF7, 0x5AB8, 0xDCF8, 0x5AB1, + 0xDCF9, 0x5AB5, 0xDCFA, 0x5AB0, 0xDCFB, 0x5ABF, 0xDCFC, 0x5AC8, + 0xDCFD, 0x5ABB, 0xDCFE, 0x5AC6, 0xDD40, 0x5AB7, 0xDD41, 0x5AC0, + 0xDD42, 0x5ACA, 0xDD43, 0x5AB4, 0xDD44, 0x5AB6, 0xDD45, 0x5ACD, + 0xDD46, 0x5AB9, 0xDD47, 0x5A90, 0xDD48, 0x5BD6, 0xDD49, 0x5BD8, + 0xDD4A, 0x5BD9, 0xDD4B, 0x5C1F, 0xDD4C, 0x5C33, 0xDD4D, 0x5D71, + 0xDD4E, 0x5D63, 0xDD4F, 0x5D4A, 0xDD50, 0x5D65, 0xDD51, 0x5D72, + 0xDD52, 0x5D6C, 0xDD53, 0x5D5E, 0xDD54, 0x5D68, 0xDD55, 0x5D67, + 0xDD56, 0x5D62, 0xDD57, 0x5DF0, 0xDD58, 0x5E4F, 0xDD59, 0x5E4E, + 0xDD5A, 0x5E4A, 0xDD5B, 0x5E4D, 0xDD5C, 0x5E4B, 0xDD5D, 0x5EC5, + 0xDD5E, 0x5ECC, 0xDD5F, 0x5EC6, 0xDD60, 0x5ECB, 0xDD61, 0x5EC7, + 0xDD62, 0x5F40, 0xDD63, 0x5FAF, 0xDD64, 0x5FAD, 0xDD65, 0x60F7, + 0xDD66, 0x6149, 0xDD67, 0x614A, 0xDD68, 0x612B, 0xDD69, 0x6145, + 0xDD6A, 0x6136, 0xDD6B, 0x6132, 0xDD6C, 0x612E, 0xDD6D, 0x6146, + 0xDD6E, 0x612F, 0xDD6F, 0x614F, 0xDD70, 0x6129, 0xDD71, 0x6140, + 0xDD72, 0x6220, 0xDD73, 0x9168, 0xDD74, 0x6223, 0xDD75, 0x6225, + 0xDD76, 0x6224, 0xDD77, 0x63C5, 0xDD78, 0x63F1, 0xDD79, 0x63EB, + 0xDD7A, 0x6410, 0xDD7B, 0x6412, 0xDD7C, 0x6409, 0xDD7D, 0x6420, + 0xDD7E, 0x6424, 0xDDA1, 0x6433, 0xDDA2, 0x6443, 0xDDA3, 0x641F, + 0xDDA4, 0x6415, 0xDDA5, 0x6418, 0xDDA6, 0x6439, 0xDDA7, 0x6437, + 0xDDA8, 0x6422, 0xDDA9, 0x6423, 0xDDAA, 0x640C, 0xDDAB, 0x6426, + 0xDDAC, 0x6430, 0xDDAD, 0x6428, 0xDDAE, 0x6441, 0xDDAF, 0x6435, + 0xDDB0, 0x642F, 0xDDB1, 0x640A, 0xDDB2, 0x641A, 0xDDB3, 0x6440, + 0xDDB4, 0x6425, 0xDDB5, 0x6427, 0xDDB6, 0x640B, 0xDDB7, 0x63E7, + 0xDDB8, 0x641B, 0xDDB9, 0x642E, 0xDDBA, 0x6421, 0xDDBB, 0x640E, + 0xDDBC, 0x656F, 0xDDBD, 0x6592, 0xDDBE, 0x65D3, 0xDDBF, 0x6686, + 0xDDC0, 0x668C, 0xDDC1, 0x6695, 0xDDC2, 0x6690, 0xDDC3, 0x668B, + 0xDDC4, 0x668A, 0xDDC5, 0x6699, 0xDDC6, 0x6694, 0xDDC7, 0x6678, + 0xDDC8, 0x6720, 0xDDC9, 0x6966, 0xDDCA, 0x695F, 0xDDCB, 0x6938, + 0xDDCC, 0x694E, 0xDDCD, 0x6962, 0xDDCE, 0x6971, 0xDDCF, 0x693F, + 0xDDD0, 0x6945, 0xDDD1, 0x696A, 0xDDD2, 0x6939, 0xDDD3, 0x6942, + 0xDDD4, 0x6957, 0xDDD5, 0x6959, 0xDDD6, 0x697A, 0xDDD7, 0x6948, + 0xDDD8, 0x6949, 0xDDD9, 0x6935, 0xDDDA, 0x696C, 0xDDDB, 0x6933, + 0xDDDC, 0x693D, 0xDDDD, 0x6965, 0xDDDE, 0x68F0, 0xDDDF, 0x6978, + 0xDDE0, 0x6934, 0xDDE1, 0x6969, 0xDDE2, 0x6940, 0xDDE3, 0x696F, + 0xDDE4, 0x6944, 0xDDE5, 0x6976, 0xDDE6, 0x6958, 0xDDE7, 0x6941, + 0xDDE8, 0x6974, 0xDDE9, 0x694C, 0xDDEA, 0x693B, 0xDDEB, 0x694B, + 0xDDEC, 0x6937, 0xDDED, 0x695C, 0xDDEE, 0x694F, 0xDDEF, 0x6951, + 0xDDF0, 0x6932, 0xDDF1, 0x6952, 0xDDF2, 0x692F, 0xDDF3, 0x697B, + 0xDDF4, 0x693C, 0xDDF5, 0x6B46, 0xDDF6, 0x6B45, 0xDDF7, 0x6B43, + 0xDDF8, 0x6B42, 0xDDF9, 0x6B48, 0xDDFA, 0x6B41, 0xDDFB, 0x6B9B, + 0xDDFC, 0xFA0D, 0xDDFD, 0x6BFB, 0xDDFE, 0x6BFC, 0xDE40, 0x6BF9, + 0xDE41, 0x6BF7, 0xDE42, 0x6BF8, 0xDE43, 0x6E9B, 0xDE44, 0x6ED6, + 0xDE45, 0x6EC8, 0xDE46, 0x6E8F, 0xDE47, 0x6EC0, 0xDE48, 0x6E9F, + 0xDE49, 0x6E93, 0xDE4A, 0x6E94, 0xDE4B, 0x6EA0, 0xDE4C, 0x6EB1, + 0xDE4D, 0x6EB9, 0xDE4E, 0x6EC6, 0xDE4F, 0x6ED2, 0xDE50, 0x6EBD, + 0xDE51, 0x6EC1, 0xDE52, 0x6E9E, 0xDE53, 0x6EC9, 0xDE54, 0x6EB7, + 0xDE55, 0x6EB0, 0xDE56, 0x6ECD, 0xDE57, 0x6EA6, 0xDE58, 0x6ECF, + 0xDE59, 0x6EB2, 0xDE5A, 0x6EBE, 0xDE5B, 0x6EC3, 0xDE5C, 0x6EDC, + 0xDE5D, 0x6ED8, 0xDE5E, 0x6E99, 0xDE5F, 0x6E92, 0xDE60, 0x6E8E, + 0xDE61, 0x6E8D, 0xDE62, 0x6EA4, 0xDE63, 0x6EA1, 0xDE64, 0x6EBF, + 0xDE65, 0x6EB3, 0xDE66, 0x6ED0, 0xDE67, 0x6ECA, 0xDE68, 0x6E97, + 0xDE69, 0x6EAE, 0xDE6A, 0x6EA3, 0xDE6B, 0x7147, 0xDE6C, 0x7154, + 0xDE6D, 0x7152, 0xDE6E, 0x7163, 0xDE6F, 0x7160, 0xDE70, 0x7141, + 0xDE71, 0x715D, 0xDE72, 0x7162, 0xDE73, 0x7172, 0xDE74, 0x7178, + 0xDE75, 0x716A, 0xDE76, 0x7161, 0xDE77, 0x7142, 0xDE78, 0x7158, + 0xDE79, 0x7143, 0xDE7A, 0x714B, 0xDE7B, 0x7170, 0xDE7C, 0x715F, + 0xDE7D, 0x7150, 0xDE7E, 0x7153, 0xDEA1, 0x7144, 0xDEA2, 0x714D, + 0xDEA3, 0x715A, 0xDEA4, 0x724F, 0xDEA5, 0x728D, 0xDEA6, 0x728C, + 0xDEA7, 0x7291, 0xDEA8, 0x7290, 0xDEA9, 0x728E, 0xDEAA, 0x733C, + 0xDEAB, 0x7342, 0xDEAC, 0x733B, 0xDEAD, 0x733A, 0xDEAE, 0x7340, + 0xDEAF, 0x734A, 0xDEB0, 0x7349, 0xDEB1, 0x7444, 0xDEB2, 0x744A, + 0xDEB3, 0x744B, 0xDEB4, 0x7452, 0xDEB5, 0x7451, 0xDEB6, 0x7457, + 0xDEB7, 0x7440, 0xDEB8, 0x744F, 0xDEB9, 0x7450, 0xDEBA, 0x744E, + 0xDEBB, 0x7442, 0xDEBC, 0x7446, 0xDEBD, 0x744D, 0xDEBE, 0x7454, + 0xDEBF, 0x74E1, 0xDEC0, 0x74FF, 0xDEC1, 0x74FE, 0xDEC2, 0x74FD, + 0xDEC3, 0x751D, 0xDEC4, 0x7579, 0xDEC5, 0x7577, 0xDEC6, 0x6983, + 0xDEC7, 0x75EF, 0xDEC8, 0x760F, 0xDEC9, 0x7603, 0xDECA, 0x75F7, + 0xDECB, 0x75FE, 0xDECC, 0x75FC, 0xDECD, 0x75F9, 0xDECE, 0x75F8, + 0xDECF, 0x7610, 0xDED0, 0x75FB, 0xDED1, 0x75F6, 0xDED2, 0x75ED, + 0xDED3, 0x75F5, 0xDED4, 0x75FD, 0xDED5, 0x7699, 0xDED6, 0x76B5, + 0xDED7, 0x76DD, 0xDED8, 0x7755, 0xDED9, 0x775F, 0xDEDA, 0x7760, + 0xDEDB, 0x7752, 0xDEDC, 0x7756, 0xDEDD, 0x775A, 0xDEDE, 0x7769, + 0xDEDF, 0x7767, 0xDEE0, 0x7754, 0xDEE1, 0x7759, 0xDEE2, 0x776D, + 0xDEE3, 0x77E0, 0xDEE4, 0x7887, 0xDEE5, 0x789A, 0xDEE6, 0x7894, + 0xDEE7, 0x788F, 0xDEE8, 0x7884, 0xDEE9, 0x7895, 0xDEEA, 0x7885, + 0xDEEB, 0x7886, 0xDEEC, 0x78A1, 0xDEED, 0x7883, 0xDEEE, 0x7879, + 0xDEEF, 0x7899, 0xDEF0, 0x7880, 0xDEF1, 0x7896, 0xDEF2, 0x787B, + 0xDEF3, 0x797C, 0xDEF4, 0x7982, 0xDEF5, 0x797D, 0xDEF6, 0x7979, + 0xDEF7, 0x7A11, 0xDEF8, 0x7A18, 0xDEF9, 0x7A19, 0xDEFA, 0x7A12, + 0xDEFB, 0x7A17, 0xDEFC, 0x7A15, 0xDEFD, 0x7A22, 0xDEFE, 0x7A13, + 0xDF40, 0x7A1B, 0xDF41, 0x7A10, 0xDF42, 0x7AA3, 0xDF43, 0x7AA2, + 0xDF44, 0x7A9E, 0xDF45, 0x7AEB, 0xDF46, 0x7B66, 0xDF47, 0x7B64, + 0xDF48, 0x7B6D, 0xDF49, 0x7B74, 0xDF4A, 0x7B69, 0xDF4B, 0x7B72, + 0xDF4C, 0x7B65, 0xDF4D, 0x7B73, 0xDF4E, 0x7B71, 0xDF4F, 0x7B70, + 0xDF50, 0x7B61, 0xDF51, 0x7B78, 0xDF52, 0x7B76, 0xDF53, 0x7B63, + 0xDF54, 0x7CB2, 0xDF55, 0x7CB4, 0xDF56, 0x7CAF, 0xDF57, 0x7D88, + 0xDF58, 0x7D86, 0xDF59, 0x7D80, 0xDF5A, 0x7D8D, 0xDF5B, 0x7D7F, + 0xDF5C, 0x7D85, 0xDF5D, 0x7D7A, 0xDF5E, 0x7D8E, 0xDF5F, 0x7D7B, + 0xDF60, 0x7D83, 0xDF61, 0x7D7C, 0xDF62, 0x7D8C, 0xDF63, 0x7D94, + 0xDF64, 0x7D84, 0xDF65, 0x7D7D, 0xDF66, 0x7D92, 0xDF67, 0x7F6D, + 0xDF68, 0x7F6B, 0xDF69, 0x7F67, 0xDF6A, 0x7F68, 0xDF6B, 0x7F6C, + 0xDF6C, 0x7FA6, 0xDF6D, 0x7FA5, 0xDF6E, 0x7FA7, 0xDF6F, 0x7FDB, + 0xDF70, 0x7FDC, 0xDF71, 0x8021, 0xDF72, 0x8164, 0xDF73, 0x8160, + 0xDF74, 0x8177, 0xDF75, 0x815C, 0xDF76, 0x8169, 0xDF77, 0x815B, + 0xDF78, 0x8162, 0xDF79, 0x8172, 0xDF7A, 0x6721, 0xDF7B, 0x815E, + 0xDF7C, 0x8176, 0xDF7D, 0x8167, 0xDF7E, 0x816F, 0xDFA1, 0x8144, + 0xDFA2, 0x8161, 0xDFA3, 0x821D, 0xDFA4, 0x8249, 0xDFA5, 0x8244, + 0xDFA6, 0x8240, 0xDFA7, 0x8242, 0xDFA8, 0x8245, 0xDFA9, 0x84F1, + 0xDFAA, 0x843F, 0xDFAB, 0x8456, 0xDFAC, 0x8476, 0xDFAD, 0x8479, + 0xDFAE, 0x848F, 0xDFAF, 0x848D, 0xDFB0, 0x8465, 0xDFB1, 0x8451, + 0xDFB2, 0x8440, 0xDFB3, 0x8486, 0xDFB4, 0x8467, 0xDFB5, 0x8430, + 0xDFB6, 0x844D, 0xDFB7, 0x847D, 0xDFB8, 0x845A, 0xDFB9, 0x8459, + 0xDFBA, 0x8474, 0xDFBB, 0x8473, 0xDFBC, 0x845D, 0xDFBD, 0x8507, + 0xDFBE, 0x845E, 0xDFBF, 0x8437, 0xDFC0, 0x843A, 0xDFC1, 0x8434, + 0xDFC2, 0x847A, 0xDFC3, 0x8443, 0xDFC4, 0x8478, 0xDFC5, 0x8432, + 0xDFC6, 0x8445, 0xDFC7, 0x8429, 0xDFC8, 0x83D9, 0xDFC9, 0x844B, + 0xDFCA, 0x842F, 0xDFCB, 0x8442, 0xDFCC, 0x842D, 0xDFCD, 0x845F, + 0xDFCE, 0x8470, 0xDFCF, 0x8439, 0xDFD0, 0x844E, 0xDFD1, 0x844C, + 0xDFD2, 0x8452, 0xDFD3, 0x846F, 0xDFD4, 0x84C5, 0xDFD5, 0x848E, + 0xDFD6, 0x843B, 0xDFD7, 0x8447, 0xDFD8, 0x8436, 0xDFD9, 0x8433, + 0xDFDA, 0x8468, 0xDFDB, 0x847E, 0xDFDC, 0x8444, 0xDFDD, 0x842B, + 0xDFDE, 0x8460, 0xDFDF, 0x8454, 0xDFE0, 0x846E, 0xDFE1, 0x8450, + 0xDFE2, 0x870B, 0xDFE3, 0x8704, 0xDFE4, 0x86F7, 0xDFE5, 0x870C, + 0xDFE6, 0x86FA, 0xDFE7, 0x86D6, 0xDFE8, 0x86F5, 0xDFE9, 0x874D, + 0xDFEA, 0x86F8, 0xDFEB, 0x870E, 0xDFEC, 0x8709, 0xDFED, 0x8701, + 0xDFEE, 0x86F6, 0xDFEF, 0x870D, 0xDFF0, 0x8705, 0xDFF1, 0x88D6, + 0xDFF2, 0x88CB, 0xDFF3, 0x88CD, 0xDFF4, 0x88CE, 0xDFF5, 0x88DE, + 0xDFF6, 0x88DB, 0xDFF7, 0x88DA, 0xDFF8, 0x88CC, 0xDFF9, 0x88D0, + 0xDFFA, 0x8985, 0xDFFB, 0x899B, 0xDFFC, 0x89DF, 0xDFFD, 0x89E5, + 0xDFFE, 0x89E4, 0xE040, 0x89E1, 0xE041, 0x89E0, 0xE042, 0x89E2, + 0xE043, 0x89DC, 0xE044, 0x89E6, 0xE045, 0x8A76, 0xE046, 0x8A86, + 0xE047, 0x8A7F, 0xE048, 0x8A61, 0xE049, 0x8A3F, 0xE04A, 0x8A77, + 0xE04B, 0x8A82, 0xE04C, 0x8A84, 0xE04D, 0x8A75, 0xE04E, 0x8A83, + 0xE04F, 0x8A81, 0xE050, 0x8A74, 0xE051, 0x8A7A, 0xE052, 0x8C3C, + 0xE053, 0x8C4B, 0xE054, 0x8C4A, 0xE055, 0x8C65, 0xE056, 0x8C64, + 0xE057, 0x8C66, 0xE058, 0x8C86, 0xE059, 0x8C84, 0xE05A, 0x8C85, + 0xE05B, 0x8CCC, 0xE05C, 0x8D68, 0xE05D, 0x8D69, 0xE05E, 0x8D91, + 0xE05F, 0x8D8C, 0xE060, 0x8D8E, 0xE061, 0x8D8F, 0xE062, 0x8D8D, + 0xE063, 0x8D93, 0xE064, 0x8D94, 0xE065, 0x8D90, 0xE066, 0x8D92, + 0xE067, 0x8DF0, 0xE068, 0x8DE0, 0xE069, 0x8DEC, 0xE06A, 0x8DF1, + 0xE06B, 0x8DEE, 0xE06C, 0x8DD0, 0xE06D, 0x8DE9, 0xE06E, 0x8DE3, + 0xE06F, 0x8DE2, 0xE070, 0x8DE7, 0xE071, 0x8DF2, 0xE072, 0x8DEB, + 0xE073, 0x8DF4, 0xE074, 0x8F06, 0xE075, 0x8EFF, 0xE076, 0x8F01, + 0xE077, 0x8F00, 0xE078, 0x8F05, 0xE079, 0x8F07, 0xE07A, 0x8F08, + 0xE07B, 0x8F02, 0xE07C, 0x8F0B, 0xE07D, 0x9052, 0xE07E, 0x903F, + 0xE0A1, 0x9044, 0xE0A2, 0x9049, 0xE0A3, 0x903D, 0xE0A4, 0x9110, + 0xE0A5, 0x910D, 0xE0A6, 0x910F, 0xE0A7, 0x9111, 0xE0A8, 0x9116, + 0xE0A9, 0x9114, 0xE0AA, 0x910B, 0xE0AB, 0x910E, 0xE0AC, 0x916E, + 0xE0AD, 0x916F, 0xE0AE, 0x9248, 0xE0AF, 0x9252, 0xE0B0, 0x9230, + 0xE0B1, 0x923A, 0xE0B2, 0x9266, 0xE0B3, 0x9233, 0xE0B4, 0x9265, + 0xE0B5, 0x925E, 0xE0B6, 0x9283, 0xE0B7, 0x922E, 0xE0B8, 0x924A, + 0xE0B9, 0x9246, 0xE0BA, 0x926D, 0xE0BB, 0x926C, 0xE0BC, 0x924F, + 0xE0BD, 0x9260, 0xE0BE, 0x9267, 0xE0BF, 0x926F, 0xE0C0, 0x9236, + 0xE0C1, 0x9261, 0xE0C2, 0x9270, 0xE0C3, 0x9231, 0xE0C4, 0x9254, + 0xE0C5, 0x9263, 0xE0C6, 0x9250, 0xE0C7, 0x9272, 0xE0C8, 0x924E, + 0xE0C9, 0x9253, 0xE0CA, 0x924C, 0xE0CB, 0x9256, 0xE0CC, 0x9232, + 0xE0CD, 0x959F, 0xE0CE, 0x959C, 0xE0CF, 0x959E, 0xE0D0, 0x959B, + 0xE0D1, 0x9692, 0xE0D2, 0x9693, 0xE0D3, 0x9691, 0xE0D4, 0x9697, + 0xE0D5, 0x96CE, 0xE0D6, 0x96FA, 0xE0D7, 0x96FD, 0xE0D8, 0x96F8, + 0xE0D9, 0x96F5, 0xE0DA, 0x9773, 0xE0DB, 0x9777, 0xE0DC, 0x9778, + 0xE0DD, 0x9772, 0xE0DE, 0x980F, 0xE0DF, 0x980D, 0xE0E0, 0x980E, + 0xE0E1, 0x98AC, 0xE0E2, 0x98F6, 0xE0E3, 0x98F9, 0xE0E4, 0x99AF, + 0xE0E5, 0x99B2, 0xE0E6, 0x99B0, 0xE0E7, 0x99B5, 0xE0E8, 0x9AAD, + 0xE0E9, 0x9AAB, 0xE0EA, 0x9B5B, 0xE0EB, 0x9CEA, 0xE0EC, 0x9CED, + 0xE0ED, 0x9CE7, 0xE0EE, 0x9E80, 0xE0EF, 0x9EFD, 0xE0F0, 0x50E6, + 0xE0F1, 0x50D4, 0xE0F2, 0x50D7, 0xE0F3, 0x50E8, 0xE0F4, 0x50F3, + 0xE0F5, 0x50DB, 0xE0F6, 0x50EA, 0xE0F7, 0x50DD, 0xE0F8, 0x50E4, + 0xE0F9, 0x50D3, 0xE0FA, 0x50EC, 0xE0FB, 0x50F0, 0xE0FC, 0x50EF, + 0xE0FD, 0x50E3, 0xE0FE, 0x50E0, 0xE140, 0x51D8, 0xE141, 0x5280, + 0xE142, 0x5281, 0xE143, 0x52E9, 0xE144, 0x52EB, 0xE145, 0x5330, + 0xE146, 0x53AC, 0xE147, 0x5627, 0xE148, 0x5615, 0xE149, 0x560C, + 0xE14A, 0x5612, 0xE14B, 0x55FC, 0xE14C, 0x560F, 0xE14D, 0x561C, + 0xE14E, 0x5601, 0xE14F, 0x5613, 0xE150, 0x5602, 0xE151, 0x55FA, + 0xE152, 0x561D, 0xE153, 0x5604, 0xE154, 0x55FF, 0xE155, 0x55F9, + 0xE156, 0x5889, 0xE157, 0x587C, 0xE158, 0x5890, 0xE159, 0x5898, + 0xE15A, 0x5886, 0xE15B, 0x5881, 0xE15C, 0x587F, 0xE15D, 0x5874, + 0xE15E, 0x588B, 0xE15F, 0x587A, 0xE160, 0x5887, 0xE161, 0x5891, + 0xE162, 0x588E, 0xE163, 0x5876, 0xE164, 0x5882, 0xE165, 0x5888, + 0xE166, 0x587B, 0xE167, 0x5894, 0xE168, 0x588F, 0xE169, 0x58FE, + 0xE16A, 0x596B, 0xE16B, 0x5ADC, 0xE16C, 0x5AEE, 0xE16D, 0x5AE5, + 0xE16E, 0x5AD5, 0xE16F, 0x5AEA, 0xE170, 0x5ADA, 0xE171, 0x5AED, + 0xE172, 0x5AEB, 0xE173, 0x5AF3, 0xE174, 0x5AE2, 0xE175, 0x5AE0, + 0xE176, 0x5ADB, 0xE177, 0x5AEC, 0xE178, 0x5ADE, 0xE179, 0x5ADD, + 0xE17A, 0x5AD9, 0xE17B, 0x5AE8, 0xE17C, 0x5ADF, 0xE17D, 0x5B77, + 0xE17E, 0x5BE0, 0xE1A1, 0x5BE3, 0xE1A2, 0x5C63, 0xE1A3, 0x5D82, + 0xE1A4, 0x5D80, 0xE1A5, 0x5D7D, 0xE1A6, 0x5D86, 0xE1A7, 0x5D7A, + 0xE1A8, 0x5D81, 0xE1A9, 0x5D77, 0xE1AA, 0x5D8A, 0xE1AB, 0x5D89, + 0xE1AC, 0x5D88, 0xE1AD, 0x5D7E, 0xE1AE, 0x5D7C, 0xE1AF, 0x5D8D, + 0xE1B0, 0x5D79, 0xE1B1, 0x5D7F, 0xE1B2, 0x5E58, 0xE1B3, 0x5E59, + 0xE1B4, 0x5E53, 0xE1B5, 0x5ED8, 0xE1B6, 0x5ED1, 0xE1B7, 0x5ED7, + 0xE1B8, 0x5ECE, 0xE1B9, 0x5EDC, 0xE1BA, 0x5ED5, 0xE1BB, 0x5ED9, + 0xE1BC, 0x5ED2, 0xE1BD, 0x5ED4, 0xE1BE, 0x5F44, 0xE1BF, 0x5F43, + 0xE1C0, 0x5F6F, 0xE1C1, 0x5FB6, 0xE1C2, 0x612C, 0xE1C3, 0x6128, + 0xE1C4, 0x6141, 0xE1C5, 0x615E, 0xE1C6, 0x6171, 0xE1C7, 0x6173, + 0xE1C8, 0x6152, 0xE1C9, 0x6153, 0xE1CA, 0x6172, 0xE1CB, 0x616C, + 0xE1CC, 0x6180, 0xE1CD, 0x6174, 0xE1CE, 0x6154, 0xE1CF, 0x617A, + 0xE1D0, 0x615B, 0xE1D1, 0x6165, 0xE1D2, 0x613B, 0xE1D3, 0x616A, + 0xE1D4, 0x6161, 0xE1D5, 0x6156, 0xE1D6, 0x6229, 0xE1D7, 0x6227, + 0xE1D8, 0x622B, 0xE1D9, 0x642B, 0xE1DA, 0x644D, 0xE1DB, 0x645B, + 0xE1DC, 0x645D, 0xE1DD, 0x6474, 0xE1DE, 0x6476, 0xE1DF, 0x6472, + 0xE1E0, 0x6473, 0xE1E1, 0x647D, 0xE1E2, 0x6475, 0xE1E3, 0x6466, + 0xE1E4, 0x64A6, 0xE1E5, 0x644E, 0xE1E6, 0x6482, 0xE1E7, 0x645E, + 0xE1E8, 0x645C, 0xE1E9, 0x644B, 0xE1EA, 0x6453, 0xE1EB, 0x6460, + 0xE1EC, 0x6450, 0xE1ED, 0x647F, 0xE1EE, 0x643F, 0xE1EF, 0x646C, + 0xE1F0, 0x646B, 0xE1F1, 0x6459, 0xE1F2, 0x6465, 0xE1F3, 0x6477, + 0xE1F4, 0x6573, 0xE1F5, 0x65A0, 0xE1F6, 0x66A1, 0xE1F7, 0x66A0, + 0xE1F8, 0x669F, 0xE1F9, 0x6705, 0xE1FA, 0x6704, 0xE1FB, 0x6722, + 0xE1FC, 0x69B1, 0xE1FD, 0x69B6, 0xE1FE, 0x69C9, 0xE240, 0x69A0, + 0xE241, 0x69CE, 0xE242, 0x6996, 0xE243, 0x69B0, 0xE244, 0x69AC, + 0xE245, 0x69BC, 0xE246, 0x6991, 0xE247, 0x6999, 0xE248, 0x698E, + 0xE249, 0x69A7, 0xE24A, 0x698D, 0xE24B, 0x69A9, 0xE24C, 0x69BE, + 0xE24D, 0x69AF, 0xE24E, 0x69BF, 0xE24F, 0x69C4, 0xE250, 0x69BD, + 0xE251, 0x69A4, 0xE252, 0x69D4, 0xE253, 0x69B9, 0xE254, 0x69CA, + 0xE255, 0x699A, 0xE256, 0x69CF, 0xE257, 0x69B3, 0xE258, 0x6993, + 0xE259, 0x69AA, 0xE25A, 0x69A1, 0xE25B, 0x699E, 0xE25C, 0x69D9, + 0xE25D, 0x6997, 0xE25E, 0x6990, 0xE25F, 0x69C2, 0xE260, 0x69B5, + 0xE261, 0x69A5, 0xE262, 0x69C6, 0xE263, 0x6B4A, 0xE264, 0x6B4D, + 0xE265, 0x6B4B, 0xE266, 0x6B9E, 0xE267, 0x6B9F, 0xE268, 0x6BA0, + 0xE269, 0x6BC3, 0xE26A, 0x6BC4, 0xE26B, 0x6BFE, 0xE26C, 0x6ECE, + 0xE26D, 0x6EF5, 0xE26E, 0x6EF1, 0xE26F, 0x6F03, 0xE270, 0x6F25, + 0xE271, 0x6EF8, 0xE272, 0x6F37, 0xE273, 0x6EFB, 0xE274, 0x6F2E, + 0xE275, 0x6F09, 0xE276, 0x6F4E, 0xE277, 0x6F19, 0xE278, 0x6F1A, + 0xE279, 0x6F27, 0xE27A, 0x6F18, 0xE27B, 0x6F3B, 0xE27C, 0x6F12, + 0xE27D, 0x6EED, 0xE27E, 0x6F0A, 0xE2A1, 0x6F36, 0xE2A2, 0x6F73, + 0xE2A3, 0x6EF9, 0xE2A4, 0x6EEE, 0xE2A5, 0x6F2D, 0xE2A6, 0x6F40, + 0xE2A7, 0x6F30, 0xE2A8, 0x6F3C, 0xE2A9, 0x6F35, 0xE2AA, 0x6EEB, + 0xE2AB, 0x6F07, 0xE2AC, 0x6F0E, 0xE2AD, 0x6F43, 0xE2AE, 0x6F05, + 0xE2AF, 0x6EFD, 0xE2B0, 0x6EF6, 0xE2B1, 0x6F39, 0xE2B2, 0x6F1C, + 0xE2B3, 0x6EFC, 0xE2B4, 0x6F3A, 0xE2B5, 0x6F1F, 0xE2B6, 0x6F0D, + 0xE2B7, 0x6F1E, 0xE2B8, 0x6F08, 0xE2B9, 0x6F21, 0xE2BA, 0x7187, + 0xE2BB, 0x7190, 0xE2BC, 0x7189, 0xE2BD, 0x7180, 0xE2BE, 0x7185, + 0xE2BF, 0x7182, 0xE2C0, 0x718F, 0xE2C1, 0x717B, 0xE2C2, 0x7186, + 0xE2C3, 0x7181, 0xE2C4, 0x7197, 0xE2C5, 0x7244, 0xE2C6, 0x7253, + 0xE2C7, 0x7297, 0xE2C8, 0x7295, 0xE2C9, 0x7293, 0xE2CA, 0x7343, + 0xE2CB, 0x734D, 0xE2CC, 0x7351, 0xE2CD, 0x734C, 0xE2CE, 0x7462, + 0xE2CF, 0x7473, 0xE2D0, 0x7471, 0xE2D1, 0x7475, 0xE2D2, 0x7472, + 0xE2D3, 0x7467, 0xE2D4, 0x746E, 0xE2D5, 0x7500, 0xE2D6, 0x7502, + 0xE2D7, 0x7503, 0xE2D8, 0x757D, 0xE2D9, 0x7590, 0xE2DA, 0x7616, + 0xE2DB, 0x7608, 0xE2DC, 0x760C, 0xE2DD, 0x7615, 0xE2DE, 0x7611, + 0xE2DF, 0x760A, 0xE2E0, 0x7614, 0xE2E1, 0x76B8, 0xE2E2, 0x7781, + 0xE2E3, 0x777C, 0xE2E4, 0x7785, 0xE2E5, 0x7782, 0xE2E6, 0x776E, + 0xE2E7, 0x7780, 0xE2E8, 0x776F, 0xE2E9, 0x777E, 0xE2EA, 0x7783, + 0xE2EB, 0x78B2, 0xE2EC, 0x78AA, 0xE2ED, 0x78B4, 0xE2EE, 0x78AD, + 0xE2EF, 0x78A8, 0xE2F0, 0x787E, 0xE2F1, 0x78AB, 0xE2F2, 0x789E, + 0xE2F3, 0x78A5, 0xE2F4, 0x78A0, 0xE2F5, 0x78AC, 0xE2F6, 0x78A2, + 0xE2F7, 0x78A4, 0xE2F8, 0x7998, 0xE2F9, 0x798A, 0xE2FA, 0x798B, + 0xE2FB, 0x7996, 0xE2FC, 0x7995, 0xE2FD, 0x7994, 0xE2FE, 0x7993, + 0xE340, 0x7997, 0xE341, 0x7988, 0xE342, 0x7992, 0xE343, 0x7990, + 0xE344, 0x7A2B, 0xE345, 0x7A4A, 0xE346, 0x7A30, 0xE347, 0x7A2F, + 0xE348, 0x7A28, 0xE349, 0x7A26, 0xE34A, 0x7AA8, 0xE34B, 0x7AAB, + 0xE34C, 0x7AAC, 0xE34D, 0x7AEE, 0xE34E, 0x7B88, 0xE34F, 0x7B9C, + 0xE350, 0x7B8A, 0xE351, 0x7B91, 0xE352, 0x7B90, 0xE353, 0x7B96, + 0xE354, 0x7B8D, 0xE355, 0x7B8C, 0xE356, 0x7B9B, 0xE357, 0x7B8E, + 0xE358, 0x7B85, 0xE359, 0x7B98, 0xE35A, 0x5284, 0xE35B, 0x7B99, + 0xE35C, 0x7BA4, 0xE35D, 0x7B82, 0xE35E, 0x7CBB, 0xE35F, 0x7CBF, + 0xE360, 0x7CBC, 0xE361, 0x7CBA, 0xE362, 0x7DA7, 0xE363, 0x7DB7, + 0xE364, 0x7DC2, 0xE365, 0x7DA3, 0xE366, 0x7DAA, 0xE367, 0x7DC1, + 0xE368, 0x7DC0, 0xE369, 0x7DC5, 0xE36A, 0x7D9D, 0xE36B, 0x7DCE, + 0xE36C, 0x7DC4, 0xE36D, 0x7DC6, 0xE36E, 0x7DCB, 0xE36F, 0x7DCC, + 0xE370, 0x7DAF, 0xE371, 0x7DB9, 0xE372, 0x7D96, 0xE373, 0x7DBC, + 0xE374, 0x7D9F, 0xE375, 0x7DA6, 0xE376, 0x7DAE, 0xE377, 0x7DA9, + 0xE378, 0x7DA1, 0xE379, 0x7DC9, 0xE37A, 0x7F73, 0xE37B, 0x7FE2, + 0xE37C, 0x7FE3, 0xE37D, 0x7FE5, 0xE37E, 0x7FDE, 0xE3A1, 0x8024, + 0xE3A2, 0x805D, 0xE3A3, 0x805C, 0xE3A4, 0x8189, 0xE3A5, 0x8186, + 0xE3A6, 0x8183, 0xE3A7, 0x8187, 0xE3A8, 0x818D, 0xE3A9, 0x818C, + 0xE3AA, 0x818B, 0xE3AB, 0x8215, 0xE3AC, 0x8497, 0xE3AD, 0x84A4, + 0xE3AE, 0x84A1, 0xE3AF, 0x849F, 0xE3B0, 0x84BA, 0xE3B1, 0x84CE, + 0xE3B2, 0x84C2, 0xE3B3, 0x84AC, 0xE3B4, 0x84AE, 0xE3B5, 0x84AB, + 0xE3B6, 0x84B9, 0xE3B7, 0x84B4, 0xE3B8, 0x84C1, 0xE3B9, 0x84CD, + 0xE3BA, 0x84AA, 0xE3BB, 0x849A, 0xE3BC, 0x84B1, 0xE3BD, 0x84D0, + 0xE3BE, 0x849D, 0xE3BF, 0x84A7, 0xE3C0, 0x84BB, 0xE3C1, 0x84A2, + 0xE3C2, 0x8494, 0xE3C3, 0x84C7, 0xE3C4, 0x84CC, 0xE3C5, 0x849B, + 0xE3C6, 0x84A9, 0xE3C7, 0x84AF, 0xE3C8, 0x84A8, 0xE3C9, 0x84D6, + 0xE3CA, 0x8498, 0xE3CB, 0x84B6, 0xE3CC, 0x84CF, 0xE3CD, 0x84A0, + 0xE3CE, 0x84D7, 0xE3CF, 0x84D4, 0xE3D0, 0x84D2, 0xE3D1, 0x84DB, + 0xE3D2, 0x84B0, 0xE3D3, 0x8491, 0xE3D4, 0x8661, 0xE3D5, 0x8733, + 0xE3D6, 0x8723, 0xE3D7, 0x8728, 0xE3D8, 0x876B, 0xE3D9, 0x8740, + 0xE3DA, 0x872E, 0xE3DB, 0x871E, 0xE3DC, 0x8721, 0xE3DD, 0x8719, + 0xE3DE, 0x871B, 0xE3DF, 0x8743, 0xE3E0, 0x872C, 0xE3E1, 0x8741, + 0xE3E2, 0x873E, 0xE3E3, 0x8746, 0xE3E4, 0x8720, 0xE3E5, 0x8732, + 0xE3E6, 0x872A, 0xE3E7, 0x872D, 0xE3E8, 0x873C, 0xE3E9, 0x8712, + 0xE3EA, 0x873A, 0xE3EB, 0x8731, 0xE3EC, 0x8735, 0xE3ED, 0x8742, + 0xE3EE, 0x8726, 0xE3EF, 0x8727, 0xE3F0, 0x8738, 0xE3F1, 0x8724, + 0xE3F2, 0x871A, 0xE3F3, 0x8730, 0xE3F4, 0x8711, 0xE3F5, 0x88F7, + 0xE3F6, 0x88E7, 0xE3F7, 0x88F1, 0xE3F8, 0x88F2, 0xE3F9, 0x88FA, + 0xE3FA, 0x88FE, 0xE3FB, 0x88EE, 0xE3FC, 0x88FC, 0xE3FD, 0x88F6, + 0xE3FE, 0x88FB, 0xE440, 0x88F0, 0xE441, 0x88EC, 0xE442, 0x88EB, + 0xE443, 0x899D, 0xE444, 0x89A1, 0xE445, 0x899F, 0xE446, 0x899E, + 0xE447, 0x89E9, 0xE448, 0x89EB, 0xE449, 0x89E8, 0xE44A, 0x8AAB, + 0xE44B, 0x8A99, 0xE44C, 0x8A8B, 0xE44D, 0x8A92, 0xE44E, 0x8A8F, + 0xE44F, 0x8A96, 0xE450, 0x8C3D, 0xE451, 0x8C68, 0xE452, 0x8C69, + 0xE453, 0x8CD5, 0xE454, 0x8CCF, 0xE455, 0x8CD7, 0xE456, 0x8D96, + 0xE457, 0x8E09, 0xE458, 0x8E02, 0xE459, 0x8DFF, 0xE45A, 0x8E0D, + 0xE45B, 0x8DFD, 0xE45C, 0x8E0A, 0xE45D, 0x8E03, 0xE45E, 0x8E07, + 0xE45F, 0x8E06, 0xE460, 0x8E05, 0xE461, 0x8DFE, 0xE462, 0x8E00, + 0xE463, 0x8E04, 0xE464, 0x8F10, 0xE465, 0x8F11, 0xE466, 0x8F0E, + 0xE467, 0x8F0D, 0xE468, 0x9123, 0xE469, 0x911C, 0xE46A, 0x9120, + 0xE46B, 0x9122, 0xE46C, 0x911F, 0xE46D, 0x911D, 0xE46E, 0x911A, + 0xE46F, 0x9124, 0xE470, 0x9121, 0xE471, 0x911B, 0xE472, 0x917A, + 0xE473, 0x9172, 0xE474, 0x9179, 0xE475, 0x9173, 0xE476, 0x92A5, + 0xE477, 0x92A4, 0xE478, 0x9276, 0xE479, 0x929B, 0xE47A, 0x927A, + 0xE47B, 0x92A0, 0xE47C, 0x9294, 0xE47D, 0x92AA, 0xE47E, 0x928D, + 0xE4A1, 0x92A6, 0xE4A2, 0x929A, 0xE4A3, 0x92AB, 0xE4A4, 0x9279, + 0xE4A5, 0x9297, 0xE4A6, 0x927F, 0xE4A7, 0x92A3, 0xE4A8, 0x92EE, + 0xE4A9, 0x928E, 0xE4AA, 0x9282, 0xE4AB, 0x9295, 0xE4AC, 0x92A2, + 0xE4AD, 0x927D, 0xE4AE, 0x9288, 0xE4AF, 0x92A1, 0xE4B0, 0x928A, + 0xE4B1, 0x9286, 0xE4B2, 0x928C, 0xE4B3, 0x9299, 0xE4B4, 0x92A7, + 0xE4B5, 0x927E, 0xE4B6, 0x9287, 0xE4B7, 0x92A9, 0xE4B8, 0x929D, + 0xE4B9, 0x928B, 0xE4BA, 0x922D, 0xE4BB, 0x969E, 0xE4BC, 0x96A1, + 0xE4BD, 0x96FF, 0xE4BE, 0x9758, 0xE4BF, 0x977D, 0xE4C0, 0x977A, + 0xE4C1, 0x977E, 0xE4C2, 0x9783, 0xE4C3, 0x9780, 0xE4C4, 0x9782, + 0xE4C5, 0x977B, 0xE4C6, 0x9784, 0xE4C7, 0x9781, 0xE4C8, 0x977F, + 0xE4C9, 0x97CE, 0xE4CA, 0x97CD, 0xE4CB, 0x9816, 0xE4CC, 0x98AD, + 0xE4CD, 0x98AE, 0xE4CE, 0x9902, 0xE4CF, 0x9900, 0xE4D0, 0x9907, + 0xE4D1, 0x999D, 0xE4D2, 0x999C, 0xE4D3, 0x99C3, 0xE4D4, 0x99B9, + 0xE4D5, 0x99BB, 0xE4D6, 0x99BA, 0xE4D7, 0x99C2, 0xE4D8, 0x99BD, + 0xE4D9, 0x99C7, 0xE4DA, 0x9AB1, 0xE4DB, 0x9AE3, 0xE4DC, 0x9AE7, + 0xE4DD, 0x9B3E, 0xE4DE, 0x9B3F, 0xE4DF, 0x9B60, 0xE4E0, 0x9B61, + 0xE4E1, 0x9B5F, 0xE4E2, 0x9CF1, 0xE4E3, 0x9CF2, 0xE4E4, 0x9CF5, + 0xE4E5, 0x9EA7, 0xE4E6, 0x50FF, 0xE4E7, 0x5103, 0xE4E8, 0x5130, + 0xE4E9, 0x50F8, 0xE4EA, 0x5106, 0xE4EB, 0x5107, 0xE4EC, 0x50F6, + 0xE4ED, 0x50FE, 0xE4EE, 0x510B, 0xE4EF, 0x510C, 0xE4F0, 0x50FD, + 0xE4F1, 0x510A, 0xE4F2, 0x528B, 0xE4F3, 0x528C, 0xE4F4, 0x52F1, + 0xE4F5, 0x52EF, 0xE4F6, 0x5648, 0xE4F7, 0x5642, 0xE4F8, 0x564C, + 0xE4F9, 0x5635, 0xE4FA, 0x5641, 0xE4FB, 0x564A, 0xE4FC, 0x5649, + 0xE4FD, 0x5646, 0xE4FE, 0x5658, 0xE540, 0x565A, 0xE541, 0x5640, + 0xE542, 0x5633, 0xE543, 0x563D, 0xE544, 0x562C, 0xE545, 0x563E, + 0xE546, 0x5638, 0xE547, 0x562A, 0xE548, 0x563A, 0xE549, 0x571A, + 0xE54A, 0x58AB, 0xE54B, 0x589D, 0xE54C, 0x58B1, 0xE54D, 0x58A0, + 0xE54E, 0x58A3, 0xE54F, 0x58AF, 0xE550, 0x58AC, 0xE551, 0x58A5, + 0xE552, 0x58A1, 0xE553, 0x58FF, 0xE554, 0x5AFF, 0xE555, 0x5AF4, + 0xE556, 0x5AFD, 0xE557, 0x5AF7, 0xE558, 0x5AF6, 0xE559, 0x5B03, + 0xE55A, 0x5AF8, 0xE55B, 0x5B02, 0xE55C, 0x5AF9, 0xE55D, 0x5B01, + 0xE55E, 0x5B07, 0xE55F, 0x5B05, 0xE560, 0x5B0F, 0xE561, 0x5C67, + 0xE562, 0x5D99, 0xE563, 0x5D97, 0xE564, 0x5D9F, 0xE565, 0x5D92, + 0xE566, 0x5DA2, 0xE567, 0x5D93, 0xE568, 0x5D95, 0xE569, 0x5DA0, + 0xE56A, 0x5D9C, 0xE56B, 0x5DA1, 0xE56C, 0x5D9A, 0xE56D, 0x5D9E, + 0xE56E, 0x5E69, 0xE56F, 0x5E5D, 0xE570, 0x5E60, 0xE571, 0x5E5C, + 0xE572, 0x7DF3, 0xE573, 0x5EDB, 0xE574, 0x5EDE, 0xE575, 0x5EE1, + 0xE576, 0x5F49, 0xE577, 0x5FB2, 0xE578, 0x618B, 0xE579, 0x6183, + 0xE57A, 0x6179, 0xE57B, 0x61B1, 0xE57C, 0x61B0, 0xE57D, 0x61A2, + 0xE57E, 0x6189, 0xE5A1, 0x619B, 0xE5A2, 0x6193, 0xE5A3, 0x61AF, + 0xE5A4, 0x61AD, 0xE5A5, 0x619F, 0xE5A6, 0x6192, 0xE5A7, 0x61AA, + 0xE5A8, 0x61A1, 0xE5A9, 0x618D, 0xE5AA, 0x6166, 0xE5AB, 0x61B3, + 0xE5AC, 0x622D, 0xE5AD, 0x646E, 0xE5AE, 0x6470, 0xE5AF, 0x6496, + 0xE5B0, 0x64A0, 0xE5B1, 0x6485, 0xE5B2, 0x6497, 0xE5B3, 0x649C, + 0xE5B4, 0x648F, 0xE5B5, 0x648B, 0xE5B6, 0x648A, 0xE5B7, 0x648C, + 0xE5B8, 0x64A3, 0xE5B9, 0x649F, 0xE5BA, 0x6468, 0xE5BB, 0x64B1, + 0xE5BC, 0x6498, 0xE5BD, 0x6576, 0xE5BE, 0x657A, 0xE5BF, 0x6579, + 0xE5C0, 0x657B, 0xE5C1, 0x65B2, 0xE5C2, 0x65B3, 0xE5C3, 0x66B5, + 0xE5C4, 0x66B0, 0xE5C5, 0x66A9, 0xE5C6, 0x66B2, 0xE5C7, 0x66B7, + 0xE5C8, 0x66AA, 0xE5C9, 0x66AF, 0xE5CA, 0x6A00, 0xE5CB, 0x6A06, + 0xE5CC, 0x6A17, 0xE5CD, 0x69E5, 0xE5CE, 0x69F8, 0xE5CF, 0x6A15, + 0xE5D0, 0x69F1, 0xE5D1, 0x69E4, 0xE5D2, 0x6A20, 0xE5D3, 0x69FF, + 0xE5D4, 0x69EC, 0xE5D5, 0x69E2, 0xE5D6, 0x6A1B, 0xE5D7, 0x6A1D, + 0xE5D8, 0x69FE, 0xE5D9, 0x6A27, 0xE5DA, 0x69F2, 0xE5DB, 0x69EE, + 0xE5DC, 0x6A14, 0xE5DD, 0x69F7, 0xE5DE, 0x69E7, 0xE5DF, 0x6A40, + 0xE5E0, 0x6A08, 0xE5E1, 0x69E6, 0xE5E2, 0x69FB, 0xE5E3, 0x6A0D, + 0xE5E4, 0x69FC, 0xE5E5, 0x69EB, 0xE5E6, 0x6A09, 0xE5E7, 0x6A04, + 0xE5E8, 0x6A18, 0xE5E9, 0x6A25, 0xE5EA, 0x6A0F, 0xE5EB, 0x69F6, + 0xE5EC, 0x6A26, 0xE5ED, 0x6A07, 0xE5EE, 0x69F4, 0xE5EF, 0x6A16, + 0xE5F0, 0x6B51, 0xE5F1, 0x6BA5, 0xE5F2, 0x6BA3, 0xE5F3, 0x6BA2, + 0xE5F4, 0x6BA6, 0xE5F5, 0x6C01, 0xE5F6, 0x6C00, 0xE5F7, 0x6BFF, + 0xE5F8, 0x6C02, 0xE5F9, 0x6F41, 0xE5FA, 0x6F26, 0xE5FB, 0x6F7E, + 0xE5FC, 0x6F87, 0xE5FD, 0x6FC6, 0xE5FE, 0x6F92, 0xE640, 0x6F8D, + 0xE641, 0x6F89, 0xE642, 0x6F8C, 0xE643, 0x6F62, 0xE644, 0x6F4F, + 0xE645, 0x6F85, 0xE646, 0x6F5A, 0xE647, 0x6F96, 0xE648, 0x6F76, + 0xE649, 0x6F6C, 0xE64A, 0x6F82, 0xE64B, 0x6F55, 0xE64C, 0x6F72, + 0xE64D, 0x6F52, 0xE64E, 0x6F50, 0xE64F, 0x6F57, 0xE650, 0x6F94, + 0xE651, 0x6F93, 0xE652, 0x6F5D, 0xE653, 0x6F00, 0xE654, 0x6F61, + 0xE655, 0x6F6B, 0xE656, 0x6F7D, 0xE657, 0x6F67, 0xE658, 0x6F90, + 0xE659, 0x6F53, 0xE65A, 0x6F8B, 0xE65B, 0x6F69, 0xE65C, 0x6F7F, + 0xE65D, 0x6F95, 0xE65E, 0x6F63, 0xE65F, 0x6F77, 0xE660, 0x6F6A, + 0xE661, 0x6F7B, 0xE662, 0x71B2, 0xE663, 0x71AF, 0xE664, 0x719B, + 0xE665, 0x71B0, 0xE666, 0x71A0, 0xE667, 0x719A, 0xE668, 0x71A9, + 0xE669, 0x71B5, 0xE66A, 0x719D, 0xE66B, 0x71A5, 0xE66C, 0x719E, + 0xE66D, 0x71A4, 0xE66E, 0x71A1, 0xE66F, 0x71AA, 0xE670, 0x719C, + 0xE671, 0x71A7, 0xE672, 0x71B3, 0xE673, 0x7298, 0xE674, 0x729A, + 0xE675, 0x7358, 0xE676, 0x7352, 0xE677, 0x735E, 0xE678, 0x735F, + 0xE679, 0x7360, 0xE67A, 0x735D, 0xE67B, 0x735B, 0xE67C, 0x7361, + 0xE67D, 0x735A, 0xE67E, 0x7359, 0xE6A1, 0x7362, 0xE6A2, 0x7487, + 0xE6A3, 0x7489, 0xE6A4, 0x748A, 0xE6A5, 0x7486, 0xE6A6, 0x7481, + 0xE6A7, 0x747D, 0xE6A8, 0x7485, 0xE6A9, 0x7488, 0xE6AA, 0x747C, + 0xE6AB, 0x7479, 0xE6AC, 0x7508, 0xE6AD, 0x7507, 0xE6AE, 0x757E, + 0xE6AF, 0x7625, 0xE6B0, 0x761E, 0xE6B1, 0x7619, 0xE6B2, 0x761D, + 0xE6B3, 0x761C, 0xE6B4, 0x7623, 0xE6B5, 0x761A, 0xE6B6, 0x7628, + 0xE6B7, 0x761B, 0xE6B8, 0x769C, 0xE6B9, 0x769D, 0xE6BA, 0x769E, + 0xE6BB, 0x769B, 0xE6BC, 0x778D, 0xE6BD, 0x778F, 0xE6BE, 0x7789, + 0xE6BF, 0x7788, 0xE6C0, 0x78CD, 0xE6C1, 0x78BB, 0xE6C2, 0x78CF, + 0xE6C3, 0x78CC, 0xE6C4, 0x78D1, 0xE6C5, 0x78CE, 0xE6C6, 0x78D4, + 0xE6C7, 0x78C8, 0xE6C8, 0x78C3, 0xE6C9, 0x78C4, 0xE6CA, 0x78C9, + 0xE6CB, 0x799A, 0xE6CC, 0x79A1, 0xE6CD, 0x79A0, 0xE6CE, 0x799C, + 0xE6CF, 0x79A2, 0xE6D0, 0x799B, 0xE6D1, 0x6B76, 0xE6D2, 0x7A39, + 0xE6D3, 0x7AB2, 0xE6D4, 0x7AB4, 0xE6D5, 0x7AB3, 0xE6D6, 0x7BB7, + 0xE6D7, 0x7BCB, 0xE6D8, 0x7BBE, 0xE6D9, 0x7BAC, 0xE6DA, 0x7BCE, + 0xE6DB, 0x7BAF, 0xE6DC, 0x7BB9, 0xE6DD, 0x7BCA, 0xE6DE, 0x7BB5, + 0xE6DF, 0x7CC5, 0xE6E0, 0x7CC8, 0xE6E1, 0x7CCC, 0xE6E2, 0x7CCB, + 0xE6E3, 0x7DF7, 0xE6E4, 0x7DDB, 0xE6E5, 0x7DEA, 0xE6E6, 0x7DE7, + 0xE6E7, 0x7DD7, 0xE6E8, 0x7DE1, 0xE6E9, 0x7E03, 0xE6EA, 0x7DFA, + 0xE6EB, 0x7DE6, 0xE6EC, 0x7DF6, 0xE6ED, 0x7DF1, 0xE6EE, 0x7DF0, + 0xE6EF, 0x7DEE, 0xE6F0, 0x7DDF, 0xE6F1, 0x7F76, 0xE6F2, 0x7FAC, + 0xE6F3, 0x7FB0, 0xE6F4, 0x7FAD, 0xE6F5, 0x7FED, 0xE6F6, 0x7FEB, + 0xE6F7, 0x7FEA, 0xE6F8, 0x7FEC, 0xE6F9, 0x7FE6, 0xE6FA, 0x7FE8, + 0xE6FB, 0x8064, 0xE6FC, 0x8067, 0xE6FD, 0x81A3, 0xE6FE, 0x819F, + 0xE740, 0x819E, 0xE741, 0x8195, 0xE742, 0x81A2, 0xE743, 0x8199, + 0xE744, 0x8197, 0xE745, 0x8216, 0xE746, 0x824F, 0xE747, 0x8253, + 0xE748, 0x8252, 0xE749, 0x8250, 0xE74A, 0x824E, 0xE74B, 0x8251, + 0xE74C, 0x8524, 0xE74D, 0x853B, 0xE74E, 0x850F, 0xE74F, 0x8500, + 0xE750, 0x8529, 0xE751, 0x850E, 0xE752, 0x8509, 0xE753, 0x850D, + 0xE754, 0x851F, 0xE755, 0x850A, 0xE756, 0x8527, 0xE757, 0x851C, + 0xE758, 0x84FB, 0xE759, 0x852B, 0xE75A, 0x84FA, 0xE75B, 0x8508, + 0xE75C, 0x850C, 0xE75D, 0x84F4, 0xE75E, 0x852A, 0xE75F, 0x84F2, + 0xE760, 0x8515, 0xE761, 0x84F7, 0xE762, 0x84EB, 0xE763, 0x84F3, + 0xE764, 0x84FC, 0xE765, 0x8512, 0xE766, 0x84EA, 0xE767, 0x84E9, + 0xE768, 0x8516, 0xE769, 0x84FE, 0xE76A, 0x8528, 0xE76B, 0x851D, + 0xE76C, 0x852E, 0xE76D, 0x8502, 0xE76E, 0x84FD, 0xE76F, 0x851E, + 0xE770, 0x84F6, 0xE771, 0x8531, 0xE772, 0x8526, 0xE773, 0x84E7, + 0xE774, 0x84E8, 0xE775, 0x84F0, 0xE776, 0x84EF, 0xE777, 0x84F9, + 0xE778, 0x8518, 0xE779, 0x8520, 0xE77A, 0x8530, 0xE77B, 0x850B, + 0xE77C, 0x8519, 0xE77D, 0x852F, 0xE77E, 0x8662, 0xE7A1, 0x8756, + 0xE7A2, 0x8763, 0xE7A3, 0x8764, 0xE7A4, 0x8777, 0xE7A5, 0x87E1, + 0xE7A6, 0x8773, 0xE7A7, 0x8758, 0xE7A8, 0x8754, 0xE7A9, 0x875B, + 0xE7AA, 0x8752, 0xE7AB, 0x8761, 0xE7AC, 0x875A, 0xE7AD, 0x8751, + 0xE7AE, 0x875E, 0xE7AF, 0x876D, 0xE7B0, 0x876A, 0xE7B1, 0x8750, + 0xE7B2, 0x874E, 0xE7B3, 0x875F, 0xE7B4, 0x875D, 0xE7B5, 0x876F, + 0xE7B6, 0x876C, 0xE7B7, 0x877A, 0xE7B8, 0x876E, 0xE7B9, 0x875C, + 0xE7BA, 0x8765, 0xE7BB, 0x874F, 0xE7BC, 0x877B, 0xE7BD, 0x8775, + 0xE7BE, 0x8762, 0xE7BF, 0x8767, 0xE7C0, 0x8769, 0xE7C1, 0x885A, + 0xE7C2, 0x8905, 0xE7C3, 0x890C, 0xE7C4, 0x8914, 0xE7C5, 0x890B, + 0xE7C6, 0x8917, 0xE7C7, 0x8918, 0xE7C8, 0x8919, 0xE7C9, 0x8906, + 0xE7CA, 0x8916, 0xE7CB, 0x8911, 0xE7CC, 0x890E, 0xE7CD, 0x8909, + 0xE7CE, 0x89A2, 0xE7CF, 0x89A4, 0xE7D0, 0x89A3, 0xE7D1, 0x89ED, + 0xE7D2, 0x89F0, 0xE7D3, 0x89EC, 0xE7D4, 0x8ACF, 0xE7D5, 0x8AC6, + 0xE7D6, 0x8AB8, 0xE7D7, 0x8AD3, 0xE7D8, 0x8AD1, 0xE7D9, 0x8AD4, + 0xE7DA, 0x8AD5, 0xE7DB, 0x8ABB, 0xE7DC, 0x8AD7, 0xE7DD, 0x8ABE, + 0xE7DE, 0x8AC0, 0xE7DF, 0x8AC5, 0xE7E0, 0x8AD8, 0xE7E1, 0x8AC3, + 0xE7E2, 0x8ABA, 0xE7E3, 0x8ABD, 0xE7E4, 0x8AD9, 0xE7E5, 0x8C3E, + 0xE7E6, 0x8C4D, 0xE7E7, 0x8C8F, 0xE7E8, 0x8CE5, 0xE7E9, 0x8CDF, + 0xE7EA, 0x8CD9, 0xE7EB, 0x8CE8, 0xE7EC, 0x8CDA, 0xE7ED, 0x8CDD, + 0xE7EE, 0x8CE7, 0xE7EF, 0x8DA0, 0xE7F0, 0x8D9C, 0xE7F1, 0x8DA1, + 0xE7F2, 0x8D9B, 0xE7F3, 0x8E20, 0xE7F4, 0x8E23, 0xE7F5, 0x8E25, + 0xE7F6, 0x8E24, 0xE7F7, 0x8E2E, 0xE7F8, 0x8E15, 0xE7F9, 0x8E1B, + 0xE7FA, 0x8E16, 0xE7FB, 0x8E11, 0xE7FC, 0x8E19, 0xE7FD, 0x8E26, + 0xE7FE, 0x8E27, 0xE840, 0x8E14, 0xE841, 0x8E12, 0xE842, 0x8E18, + 0xE843, 0x8E13, 0xE844, 0x8E1C, 0xE845, 0x8E17, 0xE846, 0x8E1A, + 0xE847, 0x8F2C, 0xE848, 0x8F24, 0xE849, 0x8F18, 0xE84A, 0x8F1A, + 0xE84B, 0x8F20, 0xE84C, 0x8F23, 0xE84D, 0x8F16, 0xE84E, 0x8F17, + 0xE84F, 0x9073, 0xE850, 0x9070, 0xE851, 0x906F, 0xE852, 0x9067, + 0xE853, 0x906B, 0xE854, 0x912F, 0xE855, 0x912B, 0xE856, 0x9129, + 0xE857, 0x912A, 0xE858, 0x9132, 0xE859, 0x9126, 0xE85A, 0x912E, + 0xE85B, 0x9185, 0xE85C, 0x9186, 0xE85D, 0x918A, 0xE85E, 0x9181, + 0xE85F, 0x9182, 0xE860, 0x9184, 0xE861, 0x9180, 0xE862, 0x92D0, + 0xE863, 0x92C3, 0xE864, 0x92C4, 0xE865, 0x92C0, 0xE866, 0x92D9, + 0xE867, 0x92B6, 0xE868, 0x92CF, 0xE869, 0x92F1, 0xE86A, 0x92DF, + 0xE86B, 0x92D8, 0xE86C, 0x92E9, 0xE86D, 0x92D7, 0xE86E, 0x92DD, + 0xE86F, 0x92CC, 0xE870, 0x92EF, 0xE871, 0x92C2, 0xE872, 0x92E8, + 0xE873, 0x92CA, 0xE874, 0x92C8, 0xE875, 0x92CE, 0xE876, 0x92E6, + 0xE877, 0x92CD, 0xE878, 0x92D5, 0xE879, 0x92C9, 0xE87A, 0x92E0, + 0xE87B, 0x92DE, 0xE87C, 0x92E7, 0xE87D, 0x92D1, 0xE87E, 0x92D3, + 0xE8A1, 0x92B5, 0xE8A2, 0x92E1, 0xE8A3, 0x92C6, 0xE8A4, 0x92B4, + 0xE8A5, 0x957C, 0xE8A6, 0x95AC, 0xE8A7, 0x95AB, 0xE8A8, 0x95AE, + 0xE8A9, 0x95B0, 0xE8AA, 0x96A4, 0xE8AB, 0x96A2, 0xE8AC, 0x96D3, + 0xE8AD, 0x9705, 0xE8AE, 0x9708, 0xE8AF, 0x9702, 0xE8B0, 0x975A, + 0xE8B1, 0x978A, 0xE8B2, 0x978E, 0xE8B3, 0x9788, 0xE8B4, 0x97D0, + 0xE8B5, 0x97CF, 0xE8B6, 0x981E, 0xE8B7, 0x981D, 0xE8B8, 0x9826, + 0xE8B9, 0x9829, 0xE8BA, 0x9828, 0xE8BB, 0x9820, 0xE8BC, 0x981B, + 0xE8BD, 0x9827, 0xE8BE, 0x98B2, 0xE8BF, 0x9908, 0xE8C0, 0x98FA, + 0xE8C1, 0x9911, 0xE8C2, 0x9914, 0xE8C3, 0x9916, 0xE8C4, 0x9917, + 0xE8C5, 0x9915, 0xE8C6, 0x99DC, 0xE8C7, 0x99CD, 0xE8C8, 0x99CF, + 0xE8C9, 0x99D3, 0xE8CA, 0x99D4, 0xE8CB, 0x99CE, 0xE8CC, 0x99C9, + 0xE8CD, 0x99D6, 0xE8CE, 0x99D8, 0xE8CF, 0x99CB, 0xE8D0, 0x99D7, + 0xE8D1, 0x99CC, 0xE8D2, 0x9AB3, 0xE8D3, 0x9AEC, 0xE8D4, 0x9AEB, + 0xE8D5, 0x9AF3, 0xE8D6, 0x9AF2, 0xE8D7, 0x9AF1, 0xE8D8, 0x9B46, + 0xE8D9, 0x9B43, 0xE8DA, 0x9B67, 0xE8DB, 0x9B74, 0xE8DC, 0x9B71, + 0xE8DD, 0x9B66, 0xE8DE, 0x9B76, 0xE8DF, 0x9B75, 0xE8E0, 0x9B70, + 0xE8E1, 0x9B68, 0xE8E2, 0x9B64, 0xE8E3, 0x9B6C, 0xE8E4, 0x9CFC, + 0xE8E5, 0x9CFA, 0xE8E6, 0x9CFD, 0xE8E7, 0x9CFF, 0xE8E8, 0x9CF7, + 0xE8E9, 0x9D07, 0xE8EA, 0x9D00, 0xE8EB, 0x9CF9, 0xE8EC, 0x9CFB, + 0xE8ED, 0x9D08, 0xE8EE, 0x9D05, 0xE8EF, 0x9D04, 0xE8F0, 0x9E83, + 0xE8F1, 0x9ED3, 0xE8F2, 0x9F0F, 0xE8F3, 0x9F10, 0xE8F4, 0x511C, + 0xE8F5, 0x5113, 0xE8F6, 0x5117, 0xE8F7, 0x511A, 0xE8F8, 0x5111, + 0xE8F9, 0x51DE, 0xE8FA, 0x5334, 0xE8FB, 0x53E1, 0xE8FC, 0x5670, + 0xE8FD, 0x5660, 0xE8FE, 0x566E, 0xE940, 0x5673, 0xE941, 0x5666, + 0xE942, 0x5663, 0xE943, 0x566D, 0xE944, 0x5672, 0xE945, 0x565E, + 0xE946, 0x5677, 0xE947, 0x571C, 0xE948, 0x571B, 0xE949, 0x58C8, + 0xE94A, 0x58BD, 0xE94B, 0x58C9, 0xE94C, 0x58BF, 0xE94D, 0x58BA, + 0xE94E, 0x58C2, 0xE94F, 0x58BC, 0xE950, 0x58C6, 0xE951, 0x5B17, + 0xE952, 0x5B19, 0xE953, 0x5B1B, 0xE954, 0x5B21, 0xE955, 0x5B14, + 0xE956, 0x5B13, 0xE957, 0x5B10, 0xE958, 0x5B16, 0xE959, 0x5B28, + 0xE95A, 0x5B1A, 0xE95B, 0x5B20, 0xE95C, 0x5B1E, 0xE95D, 0x5BEF, + 0xE95E, 0x5DAC, 0xE95F, 0x5DB1, 0xE960, 0x5DA9, 0xE961, 0x5DA7, + 0xE962, 0x5DB5, 0xE963, 0x5DB0, 0xE964, 0x5DAE, 0xE965, 0x5DAA, + 0xE966, 0x5DA8, 0xE967, 0x5DB2, 0xE968, 0x5DAD, 0xE969, 0x5DAF, + 0xE96A, 0x5DB4, 0xE96B, 0x5E67, 0xE96C, 0x5E68, 0xE96D, 0x5E66, + 0xE96E, 0x5E6F, 0xE96F, 0x5EE9, 0xE970, 0x5EE7, 0xE971, 0x5EE6, + 0xE972, 0x5EE8, 0xE973, 0x5EE5, 0xE974, 0x5F4B, 0xE975, 0x5FBC, + 0xE976, 0x619D, 0xE977, 0x61A8, 0xE978, 0x6196, 0xE979, 0x61C5, + 0xE97A, 0x61B4, 0xE97B, 0x61C6, 0xE97C, 0x61C1, 0xE97D, 0x61CC, + 0xE97E, 0x61BA, 0xE9A1, 0x61BF, 0xE9A2, 0x61B8, 0xE9A3, 0x618C, + 0xE9A4, 0x64D7, 0xE9A5, 0x64D6, 0xE9A6, 0x64D0, 0xE9A7, 0x64CF, + 0xE9A8, 0x64C9, 0xE9A9, 0x64BD, 0xE9AA, 0x6489, 0xE9AB, 0x64C3, + 0xE9AC, 0x64DB, 0xE9AD, 0x64F3, 0xE9AE, 0x64D9, 0xE9AF, 0x6533, + 0xE9B0, 0x657F, 0xE9B1, 0x657C, 0xE9B2, 0x65A2, 0xE9B3, 0x66C8, + 0xE9B4, 0x66BE, 0xE9B5, 0x66C0, 0xE9B6, 0x66CA, 0xE9B7, 0x66CB, + 0xE9B8, 0x66CF, 0xE9B9, 0x66BD, 0xE9BA, 0x66BB, 0xE9BB, 0x66BA, + 0xE9BC, 0x66CC, 0xE9BD, 0x6723, 0xE9BE, 0x6A34, 0xE9BF, 0x6A66, + 0xE9C0, 0x6A49, 0xE9C1, 0x6A67, 0xE9C2, 0x6A32, 0xE9C3, 0x6A68, + 0xE9C4, 0x6A3E, 0xE9C5, 0x6A5D, 0xE9C6, 0x6A6D, 0xE9C7, 0x6A76, + 0xE9C8, 0x6A5B, 0xE9C9, 0x6A51, 0xE9CA, 0x6A28, 0xE9CB, 0x6A5A, + 0xE9CC, 0x6A3B, 0xE9CD, 0x6A3F, 0xE9CE, 0x6A41, 0xE9CF, 0x6A6A, + 0xE9D0, 0x6A64, 0xE9D1, 0x6A50, 0xE9D2, 0x6A4F, 0xE9D3, 0x6A54, + 0xE9D4, 0x6A6F, 0xE9D5, 0x6A69, 0xE9D6, 0x6A60, 0xE9D7, 0x6A3C, + 0xE9D8, 0x6A5E, 0xE9D9, 0x6A56, 0xE9DA, 0x6A55, 0xE9DB, 0x6A4D, + 0xE9DC, 0x6A4E, 0xE9DD, 0x6A46, 0xE9DE, 0x6B55, 0xE9DF, 0x6B54, + 0xE9E0, 0x6B56, 0xE9E1, 0x6BA7, 0xE9E2, 0x6BAA, 0xE9E3, 0x6BAB, + 0xE9E4, 0x6BC8, 0xE9E5, 0x6BC7, 0xE9E6, 0x6C04, 0xE9E7, 0x6C03, + 0xE9E8, 0x6C06, 0xE9E9, 0x6FAD, 0xE9EA, 0x6FCB, 0xE9EB, 0x6FA3, + 0xE9EC, 0x6FC7, 0xE9ED, 0x6FBC, 0xE9EE, 0x6FCE, 0xE9EF, 0x6FC8, + 0xE9F0, 0x6F5E, 0xE9F1, 0x6FC4, 0xE9F2, 0x6FBD, 0xE9F3, 0x6F9E, + 0xE9F4, 0x6FCA, 0xE9F5, 0x6FA8, 0xE9F6, 0x7004, 0xE9F7, 0x6FA5, + 0xE9F8, 0x6FAE, 0xE9F9, 0x6FBA, 0xE9FA, 0x6FAC, 0xE9FB, 0x6FAA, + 0xE9FC, 0x6FCF, 0xE9FD, 0x6FBF, 0xE9FE, 0x6FB8, 0xEA40, 0x6FA2, + 0xEA41, 0x6FC9, 0xEA42, 0x6FAB, 0xEA43, 0x6FCD, 0xEA44, 0x6FAF, + 0xEA45, 0x6FB2, 0xEA46, 0x6FB0, 0xEA47, 0x71C5, 0xEA48, 0x71C2, + 0xEA49, 0x71BF, 0xEA4A, 0x71B8, 0xEA4B, 0x71D6, 0xEA4C, 0x71C0, + 0xEA4D, 0x71C1, 0xEA4E, 0x71CB, 0xEA4F, 0x71D4, 0xEA50, 0x71CA, + 0xEA51, 0x71C7, 0xEA52, 0x71CF, 0xEA53, 0x71BD, 0xEA54, 0x71D8, + 0xEA55, 0x71BC, 0xEA56, 0x71C6, 0xEA57, 0x71DA, 0xEA58, 0x71DB, + 0xEA59, 0x729D, 0xEA5A, 0x729E, 0xEA5B, 0x7369, 0xEA5C, 0x7366, + 0xEA5D, 0x7367, 0xEA5E, 0x736C, 0xEA5F, 0x7365, 0xEA60, 0x736B, + 0xEA61, 0x736A, 0xEA62, 0x747F, 0xEA63, 0x749A, 0xEA64, 0x74A0, + 0xEA65, 0x7494, 0xEA66, 0x7492, 0xEA67, 0x7495, 0xEA68, 0x74A1, + 0xEA69, 0x750B, 0xEA6A, 0x7580, 0xEA6B, 0x762F, 0xEA6C, 0x762D, + 0xEA6D, 0x7631, 0xEA6E, 0x763D, 0xEA6F, 0x7633, 0xEA70, 0x763C, + 0xEA71, 0x7635, 0xEA72, 0x7632, 0xEA73, 0x7630, 0xEA74, 0x76BB, + 0xEA75, 0x76E6, 0xEA76, 0x779A, 0xEA77, 0x779D, 0xEA78, 0x77A1, + 0xEA79, 0x779C, 0xEA7A, 0x779B, 0xEA7B, 0x77A2, 0xEA7C, 0x77A3, + 0xEA7D, 0x7795, 0xEA7E, 0x7799, 0xEAA1, 0x7797, 0xEAA2, 0x78DD, + 0xEAA3, 0x78E9, 0xEAA4, 0x78E5, 0xEAA5, 0x78EA, 0xEAA6, 0x78DE, + 0xEAA7, 0x78E3, 0xEAA8, 0x78DB, 0xEAA9, 0x78E1, 0xEAAA, 0x78E2, + 0xEAAB, 0x78ED, 0xEAAC, 0x78DF, 0xEAAD, 0x78E0, 0xEAAE, 0x79A4, + 0xEAAF, 0x7A44, 0xEAB0, 0x7A48, 0xEAB1, 0x7A47, 0xEAB2, 0x7AB6, + 0xEAB3, 0x7AB8, 0xEAB4, 0x7AB5, 0xEAB5, 0x7AB1, 0xEAB6, 0x7AB7, + 0xEAB7, 0x7BDE, 0xEAB8, 0x7BE3, 0xEAB9, 0x7BE7, 0xEABA, 0x7BDD, + 0xEABB, 0x7BD5, 0xEABC, 0x7BE5, 0xEABD, 0x7BDA, 0xEABE, 0x7BE8, + 0xEABF, 0x7BF9, 0xEAC0, 0x7BD4, 0xEAC1, 0x7BEA, 0xEAC2, 0x7BE2, + 0xEAC3, 0x7BDC, 0xEAC4, 0x7BEB, 0xEAC5, 0x7BD8, 0xEAC6, 0x7BDF, + 0xEAC7, 0x7CD2, 0xEAC8, 0x7CD4, 0xEAC9, 0x7CD7, 0xEACA, 0x7CD0, + 0xEACB, 0x7CD1, 0xEACC, 0x7E12, 0xEACD, 0x7E21, 0xEACE, 0x7E17, + 0xEACF, 0x7E0C, 0xEAD0, 0x7E1F, 0xEAD1, 0x7E20, 0xEAD2, 0x7E13, + 0xEAD3, 0x7E0E, 0xEAD4, 0x7E1C, 0xEAD5, 0x7E15, 0xEAD6, 0x7E1A, + 0xEAD7, 0x7E22, 0xEAD8, 0x7E0B, 0xEAD9, 0x7E0F, 0xEADA, 0x7E16, + 0xEADB, 0x7E0D, 0xEADC, 0x7E14, 0xEADD, 0x7E25, 0xEADE, 0x7E24, + 0xEADF, 0x7F43, 0xEAE0, 0x7F7B, 0xEAE1, 0x7F7C, 0xEAE2, 0x7F7A, + 0xEAE3, 0x7FB1, 0xEAE4, 0x7FEF, 0xEAE5, 0x802A, 0xEAE6, 0x8029, + 0xEAE7, 0x806C, 0xEAE8, 0x81B1, 0xEAE9, 0x81A6, 0xEAEA, 0x81AE, + 0xEAEB, 0x81B9, 0xEAEC, 0x81B5, 0xEAED, 0x81AB, 0xEAEE, 0x81B0, + 0xEAEF, 0x81AC, 0xEAF0, 0x81B4, 0xEAF1, 0x81B2, 0xEAF2, 0x81B7, + 0xEAF3, 0x81A7, 0xEAF4, 0x81F2, 0xEAF5, 0x8255, 0xEAF6, 0x8256, + 0xEAF7, 0x8257, 0xEAF8, 0x8556, 0xEAF9, 0x8545, 0xEAFA, 0x856B, + 0xEAFB, 0x854D, 0xEAFC, 0x8553, 0xEAFD, 0x8561, 0xEAFE, 0x8558, + 0xEB40, 0x8540, 0xEB41, 0x8546, 0xEB42, 0x8564, 0xEB43, 0x8541, + 0xEB44, 0x8562, 0xEB45, 0x8544, 0xEB46, 0x8551, 0xEB47, 0x8547, + 0xEB48, 0x8563, 0xEB49, 0x853E, 0xEB4A, 0x855B, 0xEB4B, 0x8571, + 0xEB4C, 0x854E, 0xEB4D, 0x856E, 0xEB4E, 0x8575, 0xEB4F, 0x8555, + 0xEB50, 0x8567, 0xEB51, 0x8560, 0xEB52, 0x858C, 0xEB53, 0x8566, + 0xEB54, 0x855D, 0xEB55, 0x8554, 0xEB56, 0x8565, 0xEB57, 0x856C, + 0xEB58, 0x8663, 0xEB59, 0x8665, 0xEB5A, 0x8664, 0xEB5B, 0x879B, + 0xEB5C, 0x878F, 0xEB5D, 0x8797, 0xEB5E, 0x8793, 0xEB5F, 0x8792, + 0xEB60, 0x8788, 0xEB61, 0x8781, 0xEB62, 0x8796, 0xEB63, 0x8798, + 0xEB64, 0x8779, 0xEB65, 0x8787, 0xEB66, 0x87A3, 0xEB67, 0x8785, + 0xEB68, 0x8790, 0xEB69, 0x8791, 0xEB6A, 0x879D, 0xEB6B, 0x8784, + 0xEB6C, 0x8794, 0xEB6D, 0x879C, 0xEB6E, 0x879A, 0xEB6F, 0x8789, + 0xEB70, 0x891E, 0xEB71, 0x8926, 0xEB72, 0x8930, 0xEB73, 0x892D, + 0xEB74, 0x892E, 0xEB75, 0x8927, 0xEB76, 0x8931, 0xEB77, 0x8922, + 0xEB78, 0x8929, 0xEB79, 0x8923, 0xEB7A, 0x892F, 0xEB7B, 0x892C, + 0xEB7C, 0x891F, 0xEB7D, 0x89F1, 0xEB7E, 0x8AE0, 0xEBA1, 0x8AE2, + 0xEBA2, 0x8AF2, 0xEBA3, 0x8AF4, 0xEBA4, 0x8AF5, 0xEBA5, 0x8ADD, + 0xEBA6, 0x8B14, 0xEBA7, 0x8AE4, 0xEBA8, 0x8ADF, 0xEBA9, 0x8AF0, + 0xEBAA, 0x8AC8, 0xEBAB, 0x8ADE, 0xEBAC, 0x8AE1, 0xEBAD, 0x8AE8, + 0xEBAE, 0x8AFF, 0xEBAF, 0x8AEF, 0xEBB0, 0x8AFB, 0xEBB1, 0x8C91, + 0xEBB2, 0x8C92, 0xEBB3, 0x8C90, 0xEBB4, 0x8CF5, 0xEBB5, 0x8CEE, + 0xEBB6, 0x8CF1, 0xEBB7, 0x8CF0, 0xEBB8, 0x8CF3, 0xEBB9, 0x8D6C, + 0xEBBA, 0x8D6E, 0xEBBB, 0x8DA5, 0xEBBC, 0x8DA7, 0xEBBD, 0x8E33, + 0xEBBE, 0x8E3E, 0xEBBF, 0x8E38, 0xEBC0, 0x8E40, 0xEBC1, 0x8E45, + 0xEBC2, 0x8E36, 0xEBC3, 0x8E3C, 0xEBC4, 0x8E3D, 0xEBC5, 0x8E41, + 0xEBC6, 0x8E30, 0xEBC7, 0x8E3F, 0xEBC8, 0x8EBD, 0xEBC9, 0x8F36, + 0xEBCA, 0x8F2E, 0xEBCB, 0x8F35, 0xEBCC, 0x8F32, 0xEBCD, 0x8F39, + 0xEBCE, 0x8F37, 0xEBCF, 0x8F34, 0xEBD0, 0x9076, 0xEBD1, 0x9079, + 0xEBD2, 0x907B, 0xEBD3, 0x9086, 0xEBD4, 0x90FA, 0xEBD5, 0x9133, + 0xEBD6, 0x9135, 0xEBD7, 0x9136, 0xEBD8, 0x9193, 0xEBD9, 0x9190, + 0xEBDA, 0x9191, 0xEBDB, 0x918D, 0xEBDC, 0x918F, 0xEBDD, 0x9327, + 0xEBDE, 0x931E, 0xEBDF, 0x9308, 0xEBE0, 0x931F, 0xEBE1, 0x9306, + 0xEBE2, 0x930F, 0xEBE3, 0x937A, 0xEBE4, 0x9338, 0xEBE5, 0x933C, + 0xEBE6, 0x931B, 0xEBE7, 0x9323, 0xEBE8, 0x9312, 0xEBE9, 0x9301, + 0xEBEA, 0x9346, 0xEBEB, 0x932D, 0xEBEC, 0x930E, 0xEBED, 0x930D, + 0xEBEE, 0x92CB, 0xEBEF, 0x931D, 0xEBF0, 0x92FA, 0xEBF1, 0x9325, + 0xEBF2, 0x9313, 0xEBF3, 0x92F9, 0xEBF4, 0x92F7, 0xEBF5, 0x9334, + 0xEBF6, 0x9302, 0xEBF7, 0x9324, 0xEBF8, 0x92FF, 0xEBF9, 0x9329, + 0xEBFA, 0x9339, 0xEBFB, 0x9335, 0xEBFC, 0x932A, 0xEBFD, 0x9314, + 0xEBFE, 0x930C, 0xEC40, 0x930B, 0xEC41, 0x92FE, 0xEC42, 0x9309, + 0xEC43, 0x9300, 0xEC44, 0x92FB, 0xEC45, 0x9316, 0xEC46, 0x95BC, + 0xEC47, 0x95CD, 0xEC48, 0x95BE, 0xEC49, 0x95B9, 0xEC4A, 0x95BA, + 0xEC4B, 0x95B6, 0xEC4C, 0x95BF, 0xEC4D, 0x95B5, 0xEC4E, 0x95BD, + 0xEC4F, 0x96A9, 0xEC50, 0x96D4, 0xEC51, 0x970B, 0xEC52, 0x9712, + 0xEC53, 0x9710, 0xEC54, 0x9799, 0xEC55, 0x9797, 0xEC56, 0x9794, + 0xEC57, 0x97F0, 0xEC58, 0x97F8, 0xEC59, 0x9835, 0xEC5A, 0x982F, + 0xEC5B, 0x9832, 0xEC5C, 0x9924, 0xEC5D, 0x991F, 0xEC5E, 0x9927, + 0xEC5F, 0x9929, 0xEC60, 0x999E, 0xEC61, 0x99EE, 0xEC62, 0x99EC, + 0xEC63, 0x99E5, 0xEC64, 0x99E4, 0xEC65, 0x99F0, 0xEC66, 0x99E3, + 0xEC67, 0x99EA, 0xEC68, 0x99E9, 0xEC69, 0x99E7, 0xEC6A, 0x9AB9, + 0xEC6B, 0x9ABF, 0xEC6C, 0x9AB4, 0xEC6D, 0x9ABB, 0xEC6E, 0x9AF6, + 0xEC6F, 0x9AFA, 0xEC70, 0x9AF9, 0xEC71, 0x9AF7, 0xEC72, 0x9B33, + 0xEC73, 0x9B80, 0xEC74, 0x9B85, 0xEC75, 0x9B87, 0xEC76, 0x9B7C, + 0xEC77, 0x9B7E, 0xEC78, 0x9B7B, 0xEC79, 0x9B82, 0xEC7A, 0x9B93, + 0xEC7B, 0x9B92, 0xEC7C, 0x9B90, 0xEC7D, 0x9B7A, 0xEC7E, 0x9B95, + 0xECA1, 0x9B7D, 0xECA2, 0x9B88, 0xECA3, 0x9D25, 0xECA4, 0x9D17, + 0xECA5, 0x9D20, 0xECA6, 0x9D1E, 0xECA7, 0x9D14, 0xECA8, 0x9D29, + 0xECA9, 0x9D1D, 0xECAA, 0x9D18, 0xECAB, 0x9D22, 0xECAC, 0x9D10, + 0xECAD, 0x9D19, 0xECAE, 0x9D1F, 0xECAF, 0x9E88, 0xECB0, 0x9E86, + 0xECB1, 0x9E87, 0xECB2, 0x9EAE, 0xECB3, 0x9EAD, 0xECB4, 0x9ED5, + 0xECB5, 0x9ED6, 0xECB6, 0x9EFA, 0xECB7, 0x9F12, 0xECB8, 0x9F3D, + 0xECB9, 0x5126, 0xECBA, 0x5125, 0xECBB, 0x5122, 0xECBC, 0x5124, + 0xECBD, 0x5120, 0xECBE, 0x5129, 0xECBF, 0x52F4, 0xECC0, 0x5693, + 0xECC1, 0x568C, 0xECC2, 0x568D, 0xECC3, 0x5686, 0xECC4, 0x5684, + 0xECC5, 0x5683, 0xECC6, 0x567E, 0xECC7, 0x5682, 0xECC8, 0x567F, + 0xECC9, 0x5681, 0xECCA, 0x58D6, 0xECCB, 0x58D4, 0xECCC, 0x58CF, + 0xECCD, 0x58D2, 0xECCE, 0x5B2D, 0xECCF, 0x5B25, 0xECD0, 0x5B32, + 0xECD1, 0x5B23, 0xECD2, 0x5B2C, 0xECD3, 0x5B27, 0xECD4, 0x5B26, + 0xECD5, 0x5B2F, 0xECD6, 0x5B2E, 0xECD7, 0x5B7B, 0xECD8, 0x5BF1, + 0xECD9, 0x5BF2, 0xECDA, 0x5DB7, 0xECDB, 0x5E6C, 0xECDC, 0x5E6A, + 0xECDD, 0x5FBE, 0xECDE, 0x5FBB, 0xECDF, 0x61C3, 0xECE0, 0x61B5, + 0xECE1, 0x61BC, 0xECE2, 0x61E7, 0xECE3, 0x61E0, 0xECE4, 0x61E5, + 0xECE5, 0x61E4, 0xECE6, 0x61E8, 0xECE7, 0x61DE, 0xECE8, 0x64EF, + 0xECE9, 0x64E9, 0xECEA, 0x64E3, 0xECEB, 0x64EB, 0xECEC, 0x64E4, + 0xECED, 0x64E8, 0xECEE, 0x6581, 0xECEF, 0x6580, 0xECF0, 0x65B6, + 0xECF1, 0x65DA, 0xECF2, 0x66D2, 0xECF3, 0x6A8D, 0xECF4, 0x6A96, + 0xECF5, 0x6A81, 0xECF6, 0x6AA5, 0xECF7, 0x6A89, 0xECF8, 0x6A9F, + 0xECF9, 0x6A9B, 0xECFA, 0x6AA1, 0xECFB, 0x6A9E, 0xECFC, 0x6A87, + 0xECFD, 0x6A93, 0xECFE, 0x6A8E, 0xED40, 0x6A95, 0xED41, 0x6A83, + 0xED42, 0x6AA8, 0xED43, 0x6AA4, 0xED44, 0x6A91, 0xED45, 0x6A7F, + 0xED46, 0x6AA6, 0xED47, 0x6A9A, 0xED48, 0x6A85, 0xED49, 0x6A8C, + 0xED4A, 0x6A92, 0xED4B, 0x6B5B, 0xED4C, 0x6BAD, 0xED4D, 0x6C09, + 0xED4E, 0x6FCC, 0xED4F, 0x6FA9, 0xED50, 0x6FF4, 0xED51, 0x6FD4, + 0xED52, 0x6FE3, 0xED53, 0x6FDC, 0xED54, 0x6FED, 0xED55, 0x6FE7, + 0xED56, 0x6FE6, 0xED57, 0x6FDE, 0xED58, 0x6FF2, 0xED59, 0x6FDD, + 0xED5A, 0x6FE2, 0xED5B, 0x6FE8, 0xED5C, 0x71E1, 0xED5D, 0x71F1, + 0xED5E, 0x71E8, 0xED5F, 0x71F2, 0xED60, 0x71E4, 0xED61, 0x71F0, + 0xED62, 0x71E2, 0xED63, 0x7373, 0xED64, 0x736E, 0xED65, 0x736F, + 0xED66, 0x7497, 0xED67, 0x74B2, 0xED68, 0x74AB, 0xED69, 0x7490, + 0xED6A, 0x74AA, 0xED6B, 0x74AD, 0xED6C, 0x74B1, 0xED6D, 0x74A5, + 0xED6E, 0x74AF, 0xED6F, 0x7510, 0xED70, 0x7511, 0xED71, 0x7512, + 0xED72, 0x750F, 0xED73, 0x7584, 0xED74, 0x7643, 0xED75, 0x7648, + 0xED76, 0x7649, 0xED77, 0x7647, 0xED78, 0x76A4, 0xED79, 0x76E9, + 0xED7A, 0x77B5, 0xED7B, 0x77AB, 0xED7C, 0x77B2, 0xED7D, 0x77B7, + 0xED7E, 0x77B6, 0xEDA1, 0x77B4, 0xEDA2, 0x77B1, 0xEDA3, 0x77A8, + 0xEDA4, 0x77F0, 0xEDA5, 0x78F3, 0xEDA6, 0x78FD, 0xEDA7, 0x7902, + 0xEDA8, 0x78FB, 0xEDA9, 0x78FC, 0xEDAA, 0x78F2, 0xEDAB, 0x7905, + 0xEDAC, 0x78F9, 0xEDAD, 0x78FE, 0xEDAE, 0x7904, 0xEDAF, 0x79AB, + 0xEDB0, 0x79A8, 0xEDB1, 0x7A5C, 0xEDB2, 0x7A5B, 0xEDB3, 0x7A56, + 0xEDB4, 0x7A58, 0xEDB5, 0x7A54, 0xEDB6, 0x7A5A, 0xEDB7, 0x7ABE, + 0xEDB8, 0x7AC0, 0xEDB9, 0x7AC1, 0xEDBA, 0x7C05, 0xEDBB, 0x7C0F, + 0xEDBC, 0x7BF2, 0xEDBD, 0x7C00, 0xEDBE, 0x7BFF, 0xEDBF, 0x7BFB, + 0xEDC0, 0x7C0E, 0xEDC1, 0x7BF4, 0xEDC2, 0x7C0B, 0xEDC3, 0x7BF3, + 0xEDC4, 0x7C02, 0xEDC5, 0x7C09, 0xEDC6, 0x7C03, 0xEDC7, 0x7C01, + 0xEDC8, 0x7BF8, 0xEDC9, 0x7BFD, 0xEDCA, 0x7C06, 0xEDCB, 0x7BF0, + 0xEDCC, 0x7BF1, 0xEDCD, 0x7C10, 0xEDCE, 0x7C0A, 0xEDCF, 0x7CE8, + 0xEDD0, 0x7E2D, 0xEDD1, 0x7E3C, 0xEDD2, 0x7E42, 0xEDD3, 0x7E33, + 0xEDD4, 0x9848, 0xEDD5, 0x7E38, 0xEDD6, 0x7E2A, 0xEDD7, 0x7E49, + 0xEDD8, 0x7E40, 0xEDD9, 0x7E47, 0xEDDA, 0x7E29, 0xEDDB, 0x7E4C, + 0xEDDC, 0x7E30, 0xEDDD, 0x7E3B, 0xEDDE, 0x7E36, 0xEDDF, 0x7E44, + 0xEDE0, 0x7E3A, 0xEDE1, 0x7F45, 0xEDE2, 0x7F7F, 0xEDE3, 0x7F7E, + 0xEDE4, 0x7F7D, 0xEDE5, 0x7FF4, 0xEDE6, 0x7FF2, 0xEDE7, 0x802C, + 0xEDE8, 0x81BB, 0xEDE9, 0x81C4, 0xEDEA, 0x81CC, 0xEDEB, 0x81CA, + 0xEDEC, 0x81C5, 0xEDED, 0x81C7, 0xEDEE, 0x81BC, 0xEDEF, 0x81E9, + 0xEDF0, 0x825B, 0xEDF1, 0x825A, 0xEDF2, 0x825C, 0xEDF3, 0x8583, + 0xEDF4, 0x8580, 0xEDF5, 0x858F, 0xEDF6, 0x85A7, 0xEDF7, 0x8595, + 0xEDF8, 0x85A0, 0xEDF9, 0x858B, 0xEDFA, 0x85A3, 0xEDFB, 0x857B, + 0xEDFC, 0x85A4, 0xEDFD, 0x859A, 0xEDFE, 0x859E, 0xEE40, 0x8577, + 0xEE41, 0x857C, 0xEE42, 0x8589, 0xEE43, 0x85A1, 0xEE44, 0x857A, + 0xEE45, 0x8578, 0xEE46, 0x8557, 0xEE47, 0x858E, 0xEE48, 0x8596, + 0xEE49, 0x8586, 0xEE4A, 0x858D, 0xEE4B, 0x8599, 0xEE4C, 0x859D, + 0xEE4D, 0x8581, 0xEE4E, 0x85A2, 0xEE4F, 0x8582, 0xEE50, 0x8588, + 0xEE51, 0x8585, 0xEE52, 0x8579, 0xEE53, 0x8576, 0xEE54, 0x8598, + 0xEE55, 0x8590, 0xEE56, 0x859F, 0xEE57, 0x8668, 0xEE58, 0x87BE, + 0xEE59, 0x87AA, 0xEE5A, 0x87AD, 0xEE5B, 0x87C5, 0xEE5C, 0x87B0, + 0xEE5D, 0x87AC, 0xEE5E, 0x87B9, 0xEE5F, 0x87B5, 0xEE60, 0x87BC, + 0xEE61, 0x87AE, 0xEE62, 0x87C9, 0xEE63, 0x87C3, 0xEE64, 0x87C2, + 0xEE65, 0x87CC, 0xEE66, 0x87B7, 0xEE67, 0x87AF, 0xEE68, 0x87C4, + 0xEE69, 0x87CA, 0xEE6A, 0x87B4, 0xEE6B, 0x87B6, 0xEE6C, 0x87BF, + 0xEE6D, 0x87B8, 0xEE6E, 0x87BD, 0xEE6F, 0x87DE, 0xEE70, 0x87B2, + 0xEE71, 0x8935, 0xEE72, 0x8933, 0xEE73, 0x893C, 0xEE74, 0x893E, + 0xEE75, 0x8941, 0xEE76, 0x8952, 0xEE77, 0x8937, 0xEE78, 0x8942, + 0xEE79, 0x89AD, 0xEE7A, 0x89AF, 0xEE7B, 0x89AE, 0xEE7C, 0x89F2, + 0xEE7D, 0x89F3, 0xEE7E, 0x8B1E, 0xEEA1, 0x8B18, 0xEEA2, 0x8B16, + 0xEEA3, 0x8B11, 0xEEA4, 0x8B05, 0xEEA5, 0x8B0B, 0xEEA6, 0x8B22, + 0xEEA7, 0x8B0F, 0xEEA8, 0x8B12, 0xEEA9, 0x8B15, 0xEEAA, 0x8B07, + 0xEEAB, 0x8B0D, 0xEEAC, 0x8B08, 0xEEAD, 0x8B06, 0xEEAE, 0x8B1C, + 0xEEAF, 0x8B13, 0xEEB0, 0x8B1A, 0xEEB1, 0x8C4F, 0xEEB2, 0x8C70, + 0xEEB3, 0x8C72, 0xEEB4, 0x8C71, 0xEEB5, 0x8C6F, 0xEEB6, 0x8C95, + 0xEEB7, 0x8C94, 0xEEB8, 0x8CF9, 0xEEB9, 0x8D6F, 0xEEBA, 0x8E4E, + 0xEEBB, 0x8E4D, 0xEEBC, 0x8E53, 0xEEBD, 0x8E50, 0xEEBE, 0x8E4C, + 0xEEBF, 0x8E47, 0xEEC0, 0x8F43, 0xEEC1, 0x8F40, 0xEEC2, 0x9085, + 0xEEC3, 0x907E, 0xEEC4, 0x9138, 0xEEC5, 0x919A, 0xEEC6, 0x91A2, + 0xEEC7, 0x919B, 0xEEC8, 0x9199, 0xEEC9, 0x919F, 0xEECA, 0x91A1, + 0xEECB, 0x919D, 0xEECC, 0x91A0, 0xEECD, 0x93A1, 0xEECE, 0x9383, + 0xEECF, 0x93AF, 0xEED0, 0x9364, 0xEED1, 0x9356, 0xEED2, 0x9347, + 0xEED3, 0x937C, 0xEED4, 0x9358, 0xEED5, 0x935C, 0xEED6, 0x9376, + 0xEED7, 0x9349, 0xEED8, 0x9350, 0xEED9, 0x9351, 0xEEDA, 0x9360, + 0xEEDB, 0x936D, 0xEEDC, 0x938F, 0xEEDD, 0x934C, 0xEEDE, 0x936A, + 0xEEDF, 0x9379, 0xEEE0, 0x9357, 0xEEE1, 0x9355, 0xEEE2, 0x9352, + 0xEEE3, 0x934F, 0xEEE4, 0x9371, 0xEEE5, 0x9377, 0xEEE6, 0x937B, + 0xEEE7, 0x9361, 0xEEE8, 0x935E, 0xEEE9, 0x9363, 0xEEEA, 0x9367, + 0xEEEB, 0x9380, 0xEEEC, 0x934E, 0xEEED, 0x9359, 0xEEEE, 0x95C7, + 0xEEEF, 0x95C0, 0xEEF0, 0x95C9, 0xEEF1, 0x95C3, 0xEEF2, 0x95C5, + 0xEEF3, 0x95B7, 0xEEF4, 0x96AE, 0xEEF5, 0x96B0, 0xEEF6, 0x96AC, + 0xEEF7, 0x9720, 0xEEF8, 0x971F, 0xEEF9, 0x9718, 0xEEFA, 0x971D, + 0xEEFB, 0x9719, 0xEEFC, 0x979A, 0xEEFD, 0x97A1, 0xEEFE, 0x979C, + 0xEF40, 0x979E, 0xEF41, 0x979D, 0xEF42, 0x97D5, 0xEF43, 0x97D4, + 0xEF44, 0x97F1, 0xEF45, 0x9841, 0xEF46, 0x9844, 0xEF47, 0x984A, + 0xEF48, 0x9849, 0xEF49, 0x9845, 0xEF4A, 0x9843, 0xEF4B, 0x9925, + 0xEF4C, 0x992B, 0xEF4D, 0x992C, 0xEF4E, 0x992A, 0xEF4F, 0x9933, + 0xEF50, 0x9932, 0xEF51, 0x992F, 0xEF52, 0x992D, 0xEF53, 0x9931, + 0xEF54, 0x9930, 0xEF55, 0x9998, 0xEF56, 0x99A3, 0xEF57, 0x99A1, + 0xEF58, 0x9A02, 0xEF59, 0x99FA, 0xEF5A, 0x99F4, 0xEF5B, 0x99F7, + 0xEF5C, 0x99F9, 0xEF5D, 0x99F8, 0xEF5E, 0x99F6, 0xEF5F, 0x99FB, + 0xEF60, 0x99FD, 0xEF61, 0x99FE, 0xEF62, 0x99FC, 0xEF63, 0x9A03, + 0xEF64, 0x9ABE, 0xEF65, 0x9AFE, 0xEF66, 0x9AFD, 0xEF67, 0x9B01, + 0xEF68, 0x9AFC, 0xEF69, 0x9B48, 0xEF6A, 0x9B9A, 0xEF6B, 0x9BA8, + 0xEF6C, 0x9B9E, 0xEF6D, 0x9B9B, 0xEF6E, 0x9BA6, 0xEF6F, 0x9BA1, + 0xEF70, 0x9BA5, 0xEF71, 0x9BA4, 0xEF72, 0x9B86, 0xEF73, 0x9BA2, + 0xEF74, 0x9BA0, 0xEF75, 0x9BAF, 0xEF76, 0x9D33, 0xEF77, 0x9D41, + 0xEF78, 0x9D67, 0xEF79, 0x9D36, 0xEF7A, 0x9D2E, 0xEF7B, 0x9D2F, + 0xEF7C, 0x9D31, 0xEF7D, 0x9D38, 0xEF7E, 0x9D30, 0xEFA1, 0x9D45, + 0xEFA2, 0x9D42, 0xEFA3, 0x9D43, 0xEFA4, 0x9D3E, 0xEFA5, 0x9D37, + 0xEFA6, 0x9D40, 0xEFA7, 0x9D3D, 0xEFA8, 0x7FF5, 0xEFA9, 0x9D2D, + 0xEFAA, 0x9E8A, 0xEFAB, 0x9E89, 0xEFAC, 0x9E8D, 0xEFAD, 0x9EB0, + 0xEFAE, 0x9EC8, 0xEFAF, 0x9EDA, 0xEFB0, 0x9EFB, 0xEFB1, 0x9EFF, + 0xEFB2, 0x9F24, 0xEFB3, 0x9F23, 0xEFB4, 0x9F22, 0xEFB5, 0x9F54, + 0xEFB6, 0x9FA0, 0xEFB7, 0x5131, 0xEFB8, 0x512D, 0xEFB9, 0x512E, + 0xEFBA, 0x5698, 0xEFBB, 0x569C, 0xEFBC, 0x5697, 0xEFBD, 0x569A, + 0xEFBE, 0x569D, 0xEFBF, 0x5699, 0xEFC0, 0x5970, 0xEFC1, 0x5B3C, + 0xEFC2, 0x5C69, 0xEFC3, 0x5C6A, 0xEFC4, 0x5DC0, 0xEFC5, 0x5E6D, + 0xEFC6, 0x5E6E, 0xEFC7, 0x61D8, 0xEFC8, 0x61DF, 0xEFC9, 0x61ED, + 0xEFCA, 0x61EE, 0xEFCB, 0x61F1, 0xEFCC, 0x61EA, 0xEFCD, 0x61F0, + 0xEFCE, 0x61EB, 0xEFCF, 0x61D6, 0xEFD0, 0x61E9, 0xEFD1, 0x64FF, + 0xEFD2, 0x6504, 0xEFD3, 0x64FD, 0xEFD4, 0x64F8, 0xEFD5, 0x6501, + 0xEFD6, 0x6503, 0xEFD7, 0x64FC, 0xEFD8, 0x6594, 0xEFD9, 0x65DB, + 0xEFDA, 0x66DA, 0xEFDB, 0x66DB, 0xEFDC, 0x66D8, 0xEFDD, 0x6AC5, + 0xEFDE, 0x6AB9, 0xEFDF, 0x6ABD, 0xEFE0, 0x6AE1, 0xEFE1, 0x6AC6, + 0xEFE2, 0x6ABA, 0xEFE3, 0x6AB6, 0xEFE4, 0x6AB7, 0xEFE5, 0x6AC7, + 0xEFE6, 0x6AB4, 0xEFE7, 0x6AAD, 0xEFE8, 0x6B5E, 0xEFE9, 0x6BC9, + 0xEFEA, 0x6C0B, 0xEFEB, 0x7007, 0xEFEC, 0x700C, 0xEFED, 0x700D, + 0xEFEE, 0x7001, 0xEFEF, 0x7005, 0xEFF0, 0x7014, 0xEFF1, 0x700E, + 0xEFF2, 0x6FFF, 0xEFF3, 0x7000, 0xEFF4, 0x6FFB, 0xEFF5, 0x7026, + 0xEFF6, 0x6FFC, 0xEFF7, 0x6FF7, 0xEFF8, 0x700A, 0xEFF9, 0x7201, + 0xEFFA, 0x71FF, 0xEFFB, 0x71F9, 0xEFFC, 0x7203, 0xEFFD, 0x71FD, + 0xEFFE, 0x7376, 0xF040, 0x74B8, 0xF041, 0x74C0, 0xF042, 0x74B5, + 0xF043, 0x74C1, 0xF044, 0x74BE, 0xF045, 0x74B6, 0xF046, 0x74BB, + 0xF047, 0x74C2, 0xF048, 0x7514, 0xF049, 0x7513, 0xF04A, 0x765C, + 0xF04B, 0x7664, 0xF04C, 0x7659, 0xF04D, 0x7650, 0xF04E, 0x7653, + 0xF04F, 0x7657, 0xF050, 0x765A, 0xF051, 0x76A6, 0xF052, 0x76BD, + 0xF053, 0x76EC, 0xF054, 0x77C2, 0xF055, 0x77BA, 0xF056, 0x78FF, + 0xF057, 0x790C, 0xF058, 0x7913, 0xF059, 0x7914, 0xF05A, 0x7909, + 0xF05B, 0x7910, 0xF05C, 0x7912, 0xF05D, 0x7911, 0xF05E, 0x79AD, + 0xF05F, 0x79AC, 0xF060, 0x7A5F, 0xF061, 0x7C1C, 0xF062, 0x7C29, + 0xF063, 0x7C19, 0xF064, 0x7C20, 0xF065, 0x7C1F, 0xF066, 0x7C2D, + 0xF067, 0x7C1D, 0xF068, 0x7C26, 0xF069, 0x7C28, 0xF06A, 0x7C22, + 0xF06B, 0x7C25, 0xF06C, 0x7C30, 0xF06D, 0x7E5C, 0xF06E, 0x7E50, + 0xF06F, 0x7E56, 0xF070, 0x7E63, 0xF071, 0x7E58, 0xF072, 0x7E62, + 0xF073, 0x7E5F, 0xF074, 0x7E51, 0xF075, 0x7E60, 0xF076, 0x7E57, + 0xF077, 0x7E53, 0xF078, 0x7FB5, 0xF079, 0x7FB3, 0xF07A, 0x7FF7, + 0xF07B, 0x7FF8, 0xF07C, 0x8075, 0xF07D, 0x81D1, 0xF07E, 0x81D2, + 0xF0A1, 0x81D0, 0xF0A2, 0x825F, 0xF0A3, 0x825E, 0xF0A4, 0x85B4, + 0xF0A5, 0x85C6, 0xF0A6, 0x85C0, 0xF0A7, 0x85C3, 0xF0A8, 0x85C2, + 0xF0A9, 0x85B3, 0xF0AA, 0x85B5, 0xF0AB, 0x85BD, 0xF0AC, 0x85C7, + 0xF0AD, 0x85C4, 0xF0AE, 0x85BF, 0xF0AF, 0x85CB, 0xF0B0, 0x85CE, + 0xF0B1, 0x85C8, 0xF0B2, 0x85C5, 0xF0B3, 0x85B1, 0xF0B4, 0x85B6, + 0xF0B5, 0x85D2, 0xF0B6, 0x8624, 0xF0B7, 0x85B8, 0xF0B8, 0x85B7, + 0xF0B9, 0x85BE, 0xF0BA, 0x8669, 0xF0BB, 0x87E7, 0xF0BC, 0x87E6, + 0xF0BD, 0x87E2, 0xF0BE, 0x87DB, 0xF0BF, 0x87EB, 0xF0C0, 0x87EA, + 0xF0C1, 0x87E5, 0xF0C2, 0x87DF, 0xF0C3, 0x87F3, 0xF0C4, 0x87E4, + 0xF0C5, 0x87D4, 0xF0C6, 0x87DC, 0xF0C7, 0x87D3, 0xF0C8, 0x87ED, + 0xF0C9, 0x87D8, 0xF0CA, 0x87E3, 0xF0CB, 0x87A4, 0xF0CC, 0x87D7, + 0xF0CD, 0x87D9, 0xF0CE, 0x8801, 0xF0CF, 0x87F4, 0xF0D0, 0x87E8, + 0xF0D1, 0x87DD, 0xF0D2, 0x8953, 0xF0D3, 0x894B, 0xF0D4, 0x894F, + 0xF0D5, 0x894C, 0xF0D6, 0x8946, 0xF0D7, 0x8950, 0xF0D8, 0x8951, + 0xF0D9, 0x8949, 0xF0DA, 0x8B2A, 0xF0DB, 0x8B27, 0xF0DC, 0x8B23, + 0xF0DD, 0x8B33, 0xF0DE, 0x8B30, 0xF0DF, 0x8B35, 0xF0E0, 0x8B47, + 0xF0E1, 0x8B2F, 0xF0E2, 0x8B3C, 0xF0E3, 0x8B3E, 0xF0E4, 0x8B31, + 0xF0E5, 0x8B25, 0xF0E6, 0x8B37, 0xF0E7, 0x8B26, 0xF0E8, 0x8B36, + 0xF0E9, 0x8B2E, 0xF0EA, 0x8B24, 0xF0EB, 0x8B3B, 0xF0EC, 0x8B3D, + 0xF0ED, 0x8B3A, 0xF0EE, 0x8C42, 0xF0EF, 0x8C75, 0xF0F0, 0x8C99, + 0xF0F1, 0x8C98, 0xF0F2, 0x8C97, 0xF0F3, 0x8CFE, 0xF0F4, 0x8D04, + 0xF0F5, 0x8D02, 0xF0F6, 0x8D00, 0xF0F7, 0x8E5C, 0xF0F8, 0x8E62, + 0xF0F9, 0x8E60, 0xF0FA, 0x8E57, 0xF0FB, 0x8E56, 0xF0FC, 0x8E5E, + 0xF0FD, 0x8E65, 0xF0FE, 0x8E67, 0xF140, 0x8E5B, 0xF141, 0x8E5A, + 0xF142, 0x8E61, 0xF143, 0x8E5D, 0xF144, 0x8E69, 0xF145, 0x8E54, + 0xF146, 0x8F46, 0xF147, 0x8F47, 0xF148, 0x8F48, 0xF149, 0x8F4B, + 0xF14A, 0x9128, 0xF14B, 0x913A, 0xF14C, 0x913B, 0xF14D, 0x913E, + 0xF14E, 0x91A8, 0xF14F, 0x91A5, 0xF150, 0x91A7, 0xF151, 0x91AF, + 0xF152, 0x91AA, 0xF153, 0x93B5, 0xF154, 0x938C, 0xF155, 0x9392, + 0xF156, 0x93B7, 0xF157, 0x939B, 0xF158, 0x939D, 0xF159, 0x9389, + 0xF15A, 0x93A7, 0xF15B, 0x938E, 0xF15C, 0x93AA, 0xF15D, 0x939E, + 0xF15E, 0x93A6, 0xF15F, 0x9395, 0xF160, 0x9388, 0xF161, 0x9399, + 0xF162, 0x939F, 0xF163, 0x938D, 0xF164, 0x93B1, 0xF165, 0x9391, + 0xF166, 0x93B2, 0xF167, 0x93A4, 0xF168, 0x93A8, 0xF169, 0x93B4, + 0xF16A, 0x93A3, 0xF16B, 0x93A5, 0xF16C, 0x95D2, 0xF16D, 0x95D3, + 0xF16E, 0x95D1, 0xF16F, 0x96B3, 0xF170, 0x96D7, 0xF171, 0x96DA, + 0xF172, 0x5DC2, 0xF173, 0x96DF, 0xF174, 0x96D8, 0xF175, 0x96DD, + 0xF176, 0x9723, 0xF177, 0x9722, 0xF178, 0x9725, 0xF179, 0x97AC, + 0xF17A, 0x97AE, 0xF17B, 0x97A8, 0xF17C, 0x97AB, 0xF17D, 0x97A4, + 0xF17E, 0x97AA, 0xF1A1, 0x97A2, 0xF1A2, 0x97A5, 0xF1A3, 0x97D7, + 0xF1A4, 0x97D9, 0xF1A5, 0x97D6, 0xF1A6, 0x97D8, 0xF1A7, 0x97FA, + 0xF1A8, 0x9850, 0xF1A9, 0x9851, 0xF1AA, 0x9852, 0xF1AB, 0x98B8, + 0xF1AC, 0x9941, 0xF1AD, 0x993C, 0xF1AE, 0x993A, 0xF1AF, 0x9A0F, + 0xF1B0, 0x9A0B, 0xF1B1, 0x9A09, 0xF1B2, 0x9A0D, 0xF1B3, 0x9A04, + 0xF1B4, 0x9A11, 0xF1B5, 0x9A0A, 0xF1B6, 0x9A05, 0xF1B7, 0x9A07, + 0xF1B8, 0x9A06, 0xF1B9, 0x9AC0, 0xF1BA, 0x9ADC, 0xF1BB, 0x9B08, + 0xF1BC, 0x9B04, 0xF1BD, 0x9B05, 0xF1BE, 0x9B29, 0xF1BF, 0x9B35, + 0xF1C0, 0x9B4A, 0xF1C1, 0x9B4C, 0xF1C2, 0x9B4B, 0xF1C3, 0x9BC7, + 0xF1C4, 0x9BC6, 0xF1C5, 0x9BC3, 0xF1C6, 0x9BBF, 0xF1C7, 0x9BC1, + 0xF1C8, 0x9BB5, 0xF1C9, 0x9BB8, 0xF1CA, 0x9BD3, 0xF1CB, 0x9BB6, + 0xF1CC, 0x9BC4, 0xF1CD, 0x9BB9, 0xF1CE, 0x9BBD, 0xF1CF, 0x9D5C, + 0xF1D0, 0x9D53, 0xF1D1, 0x9D4F, 0xF1D2, 0x9D4A, 0xF1D3, 0x9D5B, + 0xF1D4, 0x9D4B, 0xF1D5, 0x9D59, 0xF1D6, 0x9D56, 0xF1D7, 0x9D4C, + 0xF1D8, 0x9D57, 0xF1D9, 0x9D52, 0xF1DA, 0x9D54, 0xF1DB, 0x9D5F, + 0xF1DC, 0x9D58, 0xF1DD, 0x9D5A, 0xF1DE, 0x9E8E, 0xF1DF, 0x9E8C, + 0xF1E0, 0x9EDF, 0xF1E1, 0x9F01, 0xF1E2, 0x9F00, 0xF1E3, 0x9F16, + 0xF1E4, 0x9F25, 0xF1E5, 0x9F2B, 0xF1E6, 0x9F2A, 0xF1E7, 0x9F29, + 0xF1E8, 0x9F28, 0xF1E9, 0x9F4C, 0xF1EA, 0x9F55, 0xF1EB, 0x5134, + 0xF1EC, 0x5135, 0xF1ED, 0x5296, 0xF1EE, 0x52F7, 0xF1EF, 0x53B4, + 0xF1F0, 0x56AB, 0xF1F1, 0x56AD, 0xF1F2, 0x56A6, 0xF1F3, 0x56A7, + 0xF1F4, 0x56AA, 0xF1F5, 0x56AC, 0xF1F6, 0x58DA, 0xF1F7, 0x58DD, + 0xF1F8, 0x58DB, 0xF1F9, 0x5912, 0xF1FA, 0x5B3D, 0xF1FB, 0x5B3E, + 0xF1FC, 0x5B3F, 0xF1FD, 0x5DC3, 0xF1FE, 0x5E70, 0xF240, 0x5FBF, + 0xF241, 0x61FB, 0xF242, 0x6507, 0xF243, 0x6510, 0xF244, 0x650D, + 0xF245, 0x6509, 0xF246, 0x650C, 0xF247, 0x650E, 0xF248, 0x6584, + 0xF249, 0x65DE, 0xF24A, 0x65DD, 0xF24B, 0x66DE, 0xF24C, 0x6AE7, + 0xF24D, 0x6AE0, 0xF24E, 0x6ACC, 0xF24F, 0x6AD1, 0xF250, 0x6AD9, + 0xF251, 0x6ACB, 0xF252, 0x6ADF, 0xF253, 0x6ADC, 0xF254, 0x6AD0, + 0xF255, 0x6AEB, 0xF256, 0x6ACF, 0xF257, 0x6ACD, 0xF258, 0x6ADE, + 0xF259, 0x6B60, 0xF25A, 0x6BB0, 0xF25B, 0x6C0C, 0xF25C, 0x7019, + 0xF25D, 0x7027, 0xF25E, 0x7020, 0xF25F, 0x7016, 0xF260, 0x702B, + 0xF261, 0x7021, 0xF262, 0x7022, 0xF263, 0x7023, 0xF264, 0x7029, + 0xF265, 0x7017, 0xF266, 0x7024, 0xF267, 0x701C, 0xF268, 0x702A, + 0xF269, 0x720C, 0xF26A, 0x720A, 0xF26B, 0x7207, 0xF26C, 0x7202, + 0xF26D, 0x7205, 0xF26E, 0x72A5, 0xF26F, 0x72A6, 0xF270, 0x72A4, + 0xF271, 0x72A3, 0xF272, 0x72A1, 0xF273, 0x74CB, 0xF274, 0x74C5, + 0xF275, 0x74B7, 0xF276, 0x74C3, 0xF277, 0x7516, 0xF278, 0x7660, + 0xF279, 0x77C9, 0xF27A, 0x77CA, 0xF27B, 0x77C4, 0xF27C, 0x77F1, + 0xF27D, 0x791D, 0xF27E, 0x791B, 0xF2A1, 0x7921, 0xF2A2, 0x791C, + 0xF2A3, 0x7917, 0xF2A4, 0x791E, 0xF2A5, 0x79B0, 0xF2A6, 0x7A67, + 0xF2A7, 0x7A68, 0xF2A8, 0x7C33, 0xF2A9, 0x7C3C, 0xF2AA, 0x7C39, + 0xF2AB, 0x7C2C, 0xF2AC, 0x7C3B, 0xF2AD, 0x7CEC, 0xF2AE, 0x7CEA, + 0xF2AF, 0x7E76, 0xF2B0, 0x7E75, 0xF2B1, 0x7E78, 0xF2B2, 0x7E70, + 0xF2B3, 0x7E77, 0xF2B4, 0x7E6F, 0xF2B5, 0x7E7A, 0xF2B6, 0x7E72, + 0xF2B7, 0x7E74, 0xF2B8, 0x7E68, 0xF2B9, 0x7F4B, 0xF2BA, 0x7F4A, + 0xF2BB, 0x7F83, 0xF2BC, 0x7F86, 0xF2BD, 0x7FB7, 0xF2BE, 0x7FFD, + 0xF2BF, 0x7FFE, 0xF2C0, 0x8078, 0xF2C1, 0x81D7, 0xF2C2, 0x81D5, + 0xF2C3, 0x8264, 0xF2C4, 0x8261, 0xF2C5, 0x8263, 0xF2C6, 0x85EB, + 0xF2C7, 0x85F1, 0xF2C8, 0x85ED, 0xF2C9, 0x85D9, 0xF2CA, 0x85E1, + 0xF2CB, 0x85E8, 0xF2CC, 0x85DA, 0xF2CD, 0x85D7, 0xF2CE, 0x85EC, + 0xF2CF, 0x85F2, 0xF2D0, 0x85F8, 0xF2D1, 0x85D8, 0xF2D2, 0x85DF, + 0xF2D3, 0x85E3, 0xF2D4, 0x85DC, 0xF2D5, 0x85D1, 0xF2D6, 0x85F0, + 0xF2D7, 0x85E6, 0xF2D8, 0x85EF, 0xF2D9, 0x85DE, 0xF2DA, 0x85E2, + 0xF2DB, 0x8800, 0xF2DC, 0x87FA, 0xF2DD, 0x8803, 0xF2DE, 0x87F6, + 0xF2DF, 0x87F7, 0xF2E0, 0x8809, 0xF2E1, 0x880C, 0xF2E2, 0x880B, + 0xF2E3, 0x8806, 0xF2E4, 0x87FC, 0xF2E5, 0x8808, 0xF2E6, 0x87FF, + 0xF2E7, 0x880A, 0xF2E8, 0x8802, 0xF2E9, 0x8962, 0xF2EA, 0x895A, + 0xF2EB, 0x895B, 0xF2EC, 0x8957, 0xF2ED, 0x8961, 0xF2EE, 0x895C, + 0xF2EF, 0x8958, 0xF2F0, 0x895D, 0xF2F1, 0x8959, 0xF2F2, 0x8988, + 0xF2F3, 0x89B7, 0xF2F4, 0x89B6, 0xF2F5, 0x89F6, 0xF2F6, 0x8B50, + 0xF2F7, 0x8B48, 0xF2F8, 0x8B4A, 0xF2F9, 0x8B40, 0xF2FA, 0x8B53, + 0xF2FB, 0x8B56, 0xF2FC, 0x8B54, 0xF2FD, 0x8B4B, 0xF2FE, 0x8B55, + 0xF340, 0x8B51, 0xF341, 0x8B42, 0xF342, 0x8B52, 0xF343, 0x8B57, + 0xF344, 0x8C43, 0xF345, 0x8C77, 0xF346, 0x8C76, 0xF347, 0x8C9A, + 0xF348, 0x8D06, 0xF349, 0x8D07, 0xF34A, 0x8D09, 0xF34B, 0x8DAC, + 0xF34C, 0x8DAA, 0xF34D, 0x8DAD, 0xF34E, 0x8DAB, 0xF34F, 0x8E6D, + 0xF350, 0x8E78, 0xF351, 0x8E73, 0xF352, 0x8E6A, 0xF353, 0x8E6F, + 0xF354, 0x8E7B, 0xF355, 0x8EC2, 0xF356, 0x8F52, 0xF357, 0x8F51, + 0xF358, 0x8F4F, 0xF359, 0x8F50, 0xF35A, 0x8F53, 0xF35B, 0x8FB4, + 0xF35C, 0x9140, 0xF35D, 0x913F, 0xF35E, 0x91B0, 0xF35F, 0x91AD, + 0xF360, 0x93DE, 0xF361, 0x93C7, 0xF362, 0x93CF, 0xF363, 0x93C2, + 0xF364, 0x93DA, 0xF365, 0x93D0, 0xF366, 0x93F9, 0xF367, 0x93EC, + 0xF368, 0x93CC, 0xF369, 0x93D9, 0xF36A, 0x93A9, 0xF36B, 0x93E6, + 0xF36C, 0x93CA, 0xF36D, 0x93D4, 0xF36E, 0x93EE, 0xF36F, 0x93E3, + 0xF370, 0x93D5, 0xF371, 0x93C4, 0xF372, 0x93CE, 0xF373, 0x93C0, + 0xF374, 0x93D2, 0xF375, 0x93E7, 0xF376, 0x957D, 0xF377, 0x95DA, + 0xF378, 0x95DB, 0xF379, 0x96E1, 0xF37A, 0x9729, 0xF37B, 0x972B, + 0xF37C, 0x972C, 0xF37D, 0x9728, 0xF37E, 0x9726, 0xF3A1, 0x97B3, + 0xF3A2, 0x97B7, 0xF3A3, 0x97B6, 0xF3A4, 0x97DD, 0xF3A5, 0x97DE, + 0xF3A6, 0x97DF, 0xF3A7, 0x985C, 0xF3A8, 0x9859, 0xF3A9, 0x985D, + 0xF3AA, 0x9857, 0xF3AB, 0x98BF, 0xF3AC, 0x98BD, 0xF3AD, 0x98BB, + 0xF3AE, 0x98BE, 0xF3AF, 0x9948, 0xF3B0, 0x9947, 0xF3B1, 0x9943, + 0xF3B2, 0x99A6, 0xF3B3, 0x99A7, 0xF3B4, 0x9A1A, 0xF3B5, 0x9A15, + 0xF3B6, 0x9A25, 0xF3B7, 0x9A1D, 0xF3B8, 0x9A24, 0xF3B9, 0x9A1B, + 0xF3BA, 0x9A22, 0xF3BB, 0x9A20, 0xF3BC, 0x9A27, 0xF3BD, 0x9A23, + 0xF3BE, 0x9A1E, 0xF3BF, 0x9A1C, 0xF3C0, 0x9A14, 0xF3C1, 0x9AC2, + 0xF3C2, 0x9B0B, 0xF3C3, 0x9B0A, 0xF3C4, 0x9B0E, 0xF3C5, 0x9B0C, + 0xF3C6, 0x9B37, 0xF3C7, 0x9BEA, 0xF3C8, 0x9BEB, 0xF3C9, 0x9BE0, + 0xF3CA, 0x9BDE, 0xF3CB, 0x9BE4, 0xF3CC, 0x9BE6, 0xF3CD, 0x9BE2, + 0xF3CE, 0x9BF0, 0xF3CF, 0x9BD4, 0xF3D0, 0x9BD7, 0xF3D1, 0x9BEC, + 0xF3D2, 0x9BDC, 0xF3D3, 0x9BD9, 0xF3D4, 0x9BE5, 0xF3D5, 0x9BD5, + 0xF3D6, 0x9BE1, 0xF3D7, 0x9BDA, 0xF3D8, 0x9D77, 0xF3D9, 0x9D81, + 0xF3DA, 0x9D8A, 0xF3DB, 0x9D84, 0xF3DC, 0x9D88, 0xF3DD, 0x9D71, + 0xF3DE, 0x9D80, 0xF3DF, 0x9D78, 0xF3E0, 0x9D86, 0xF3E1, 0x9D8B, + 0xF3E2, 0x9D8C, 0xF3E3, 0x9D7D, 0xF3E4, 0x9D6B, 0xF3E5, 0x9D74, + 0xF3E6, 0x9D75, 0xF3E7, 0x9D70, 0xF3E8, 0x9D69, 0xF3E9, 0x9D85, + 0xF3EA, 0x9D73, 0xF3EB, 0x9D7B, 0xF3EC, 0x9D82, 0xF3ED, 0x9D6F, + 0xF3EE, 0x9D79, 0xF3EF, 0x9D7F, 0xF3F0, 0x9D87, 0xF3F1, 0x9D68, + 0xF3F2, 0x9E94, 0xF3F3, 0x9E91, 0xF3F4, 0x9EC0, 0xF3F5, 0x9EFC, + 0xF3F6, 0x9F2D, 0xF3F7, 0x9F40, 0xF3F8, 0x9F41, 0xF3F9, 0x9F4D, + 0xF3FA, 0x9F56, 0xF3FB, 0x9F57, 0xF3FC, 0x9F58, 0xF3FD, 0x5337, + 0xF3FE, 0x56B2, 0xF440, 0x56B5, 0xF441, 0x56B3, 0xF442, 0x58E3, + 0xF443, 0x5B45, 0xF444, 0x5DC6, 0xF445, 0x5DC7, 0xF446, 0x5EEE, + 0xF447, 0x5EEF, 0xF448, 0x5FC0, 0xF449, 0x5FC1, 0xF44A, 0x61F9, + 0xF44B, 0x6517, 0xF44C, 0x6516, 0xF44D, 0x6515, 0xF44E, 0x6513, + 0xF44F, 0x65DF, 0xF450, 0x66E8, 0xF451, 0x66E3, 0xF452, 0x66E4, + 0xF453, 0x6AF3, 0xF454, 0x6AF0, 0xF455, 0x6AEA, 0xF456, 0x6AE8, + 0xF457, 0x6AF9, 0xF458, 0x6AF1, 0xF459, 0x6AEE, 0xF45A, 0x6AEF, + 0xF45B, 0x703C, 0xF45C, 0x7035, 0xF45D, 0x702F, 0xF45E, 0x7037, + 0xF45F, 0x7034, 0xF460, 0x7031, 0xF461, 0x7042, 0xF462, 0x7038, + 0xF463, 0x703F, 0xF464, 0x703A, 0xF465, 0x7039, 0xF466, 0x7040, + 0xF467, 0x703B, 0xF468, 0x7033, 0xF469, 0x7041, 0xF46A, 0x7213, + 0xF46B, 0x7214, 0xF46C, 0x72A8, 0xF46D, 0x737D, 0xF46E, 0x737C, + 0xF46F, 0x74BA, 0xF470, 0x76AB, 0xF471, 0x76AA, 0xF472, 0x76BE, + 0xF473, 0x76ED, 0xF474, 0x77CC, 0xF475, 0x77CE, 0xF476, 0x77CF, + 0xF477, 0x77CD, 0xF478, 0x77F2, 0xF479, 0x7925, 0xF47A, 0x7923, + 0xF47B, 0x7927, 0xF47C, 0x7928, 0xF47D, 0x7924, 0xF47E, 0x7929, + 0xF4A1, 0x79B2, 0xF4A2, 0x7A6E, 0xF4A3, 0x7A6C, 0xF4A4, 0x7A6D, + 0xF4A5, 0x7AF7, 0xF4A6, 0x7C49, 0xF4A7, 0x7C48, 0xF4A8, 0x7C4A, + 0xF4A9, 0x7C47, 0xF4AA, 0x7C45, 0xF4AB, 0x7CEE, 0xF4AC, 0x7E7B, + 0xF4AD, 0x7E7E, 0xF4AE, 0x7E81, 0xF4AF, 0x7E80, 0xF4B0, 0x7FBA, + 0xF4B1, 0x7FFF, 0xF4B2, 0x8079, 0xF4B3, 0x81DB, 0xF4B4, 0x81D9, + 0xF4B5, 0x820B, 0xF4B6, 0x8268, 0xF4B7, 0x8269, 0xF4B8, 0x8622, + 0xF4B9, 0x85FF, 0xF4BA, 0x8601, 0xF4BB, 0x85FE, 0xF4BC, 0x861B, + 0xF4BD, 0x8600, 0xF4BE, 0x85F6, 0xF4BF, 0x8604, 0xF4C0, 0x8609, + 0xF4C1, 0x8605, 0xF4C2, 0x860C, 0xF4C3, 0x85FD, 0xF4C4, 0x8819, + 0xF4C5, 0x8810, 0xF4C6, 0x8811, 0xF4C7, 0x8817, 0xF4C8, 0x8813, + 0xF4C9, 0x8816, 0xF4CA, 0x8963, 0xF4CB, 0x8966, 0xF4CC, 0x89B9, + 0xF4CD, 0x89F7, 0xF4CE, 0x8B60, 0xF4CF, 0x8B6A, 0xF4D0, 0x8B5D, + 0xF4D1, 0x8B68, 0xF4D2, 0x8B63, 0xF4D3, 0x8B65, 0xF4D4, 0x8B67, + 0xF4D5, 0x8B6D, 0xF4D6, 0x8DAE, 0xF4D7, 0x8E86, 0xF4D8, 0x8E88, + 0xF4D9, 0x8E84, 0xF4DA, 0x8F59, 0xF4DB, 0x8F56, 0xF4DC, 0x8F57, + 0xF4DD, 0x8F55, 0xF4DE, 0x8F58, 0xF4DF, 0x8F5A, 0xF4E0, 0x908D, + 0xF4E1, 0x9143, 0xF4E2, 0x9141, 0xF4E3, 0x91B7, 0xF4E4, 0x91B5, + 0xF4E5, 0x91B2, 0xF4E6, 0x91B3, 0xF4E7, 0x940B, 0xF4E8, 0x9413, + 0xF4E9, 0x93FB, 0xF4EA, 0x9420, 0xF4EB, 0x940F, 0xF4EC, 0x9414, + 0xF4ED, 0x93FE, 0xF4EE, 0x9415, 0xF4EF, 0x9410, 0xF4F0, 0x9428, + 0xF4F1, 0x9419, 0xF4F2, 0x940D, 0xF4F3, 0x93F5, 0xF4F4, 0x9400, + 0xF4F5, 0x93F7, 0xF4F6, 0x9407, 0xF4F7, 0x940E, 0xF4F8, 0x9416, + 0xF4F9, 0x9412, 0xF4FA, 0x93FA, 0xF4FB, 0x9409, 0xF4FC, 0x93F8, + 0xF4FD, 0x940A, 0xF4FE, 0x93FF, 0xF540, 0x93FC, 0xF541, 0x940C, + 0xF542, 0x93F6, 0xF543, 0x9411, 0xF544, 0x9406, 0xF545, 0x95DE, + 0xF546, 0x95E0, 0xF547, 0x95DF, 0xF548, 0x972E, 0xF549, 0x972F, + 0xF54A, 0x97B9, 0xF54B, 0x97BB, 0xF54C, 0x97FD, 0xF54D, 0x97FE, + 0xF54E, 0x9860, 0xF54F, 0x9862, 0xF550, 0x9863, 0xF551, 0x985F, + 0xF552, 0x98C1, 0xF553, 0x98C2, 0xF554, 0x9950, 0xF555, 0x994E, + 0xF556, 0x9959, 0xF557, 0x994C, 0xF558, 0x994B, 0xF559, 0x9953, + 0xF55A, 0x9A32, 0xF55B, 0x9A34, 0xF55C, 0x9A31, 0xF55D, 0x9A2C, + 0xF55E, 0x9A2A, 0xF55F, 0x9A36, 0xF560, 0x9A29, 0xF561, 0x9A2E, + 0xF562, 0x9A38, 0xF563, 0x9A2D, 0xF564, 0x9AC7, 0xF565, 0x9ACA, + 0xF566, 0x9AC6, 0xF567, 0x9B10, 0xF568, 0x9B12, 0xF569, 0x9B11, + 0xF56A, 0x9C0B, 0xF56B, 0x9C08, 0xF56C, 0x9BF7, 0xF56D, 0x9C05, + 0xF56E, 0x9C12, 0xF56F, 0x9BF8, 0xF570, 0x9C40, 0xF571, 0x9C07, + 0xF572, 0x9C0E, 0xF573, 0x9C06, 0xF574, 0x9C17, 0xF575, 0x9C14, + 0xF576, 0x9C09, 0xF577, 0x9D9F, 0xF578, 0x9D99, 0xF579, 0x9DA4, + 0xF57A, 0x9D9D, 0xF57B, 0x9D92, 0xF57C, 0x9D98, 0xF57D, 0x9D90, + 0xF57E, 0x9D9B, 0xF5A1, 0x9DA0, 0xF5A2, 0x9D94, 0xF5A3, 0x9D9C, + 0xF5A4, 0x9DAA, 0xF5A5, 0x9D97, 0xF5A6, 0x9DA1, 0xF5A7, 0x9D9A, + 0xF5A8, 0x9DA2, 0xF5A9, 0x9DA8, 0xF5AA, 0x9D9E, 0xF5AB, 0x9DA3, + 0xF5AC, 0x9DBF, 0xF5AD, 0x9DA9, 0xF5AE, 0x9D96, 0xF5AF, 0x9DA6, + 0xF5B0, 0x9DA7, 0xF5B1, 0x9E99, 0xF5B2, 0x9E9B, 0xF5B3, 0x9E9A, + 0xF5B4, 0x9EE5, 0xF5B5, 0x9EE4, 0xF5B6, 0x9EE7, 0xF5B7, 0x9EE6, + 0xF5B8, 0x9F30, 0xF5B9, 0x9F2E, 0xF5BA, 0x9F5B, 0xF5BB, 0x9F60, + 0xF5BC, 0x9F5E, 0xF5BD, 0x9F5D, 0xF5BE, 0x9F59, 0xF5BF, 0x9F91, + 0xF5C0, 0x513A, 0xF5C1, 0x5139, 0xF5C2, 0x5298, 0xF5C3, 0x5297, + 0xF5C4, 0x56C3, 0xF5C5, 0x56BD, 0xF5C6, 0x56BE, 0xF5C7, 0x5B48, + 0xF5C8, 0x5B47, 0xF5C9, 0x5DCB, 0xF5CA, 0x5DCF, 0xF5CB, 0x5EF1, + 0xF5CC, 0x61FD, 0xF5CD, 0x651B, 0xF5CE, 0x6B02, 0xF5CF, 0x6AFC, + 0xF5D0, 0x6B03, 0xF5D1, 0x6AF8, 0xF5D2, 0x6B00, 0xF5D3, 0x7043, + 0xF5D4, 0x7044, 0xF5D5, 0x704A, 0xF5D6, 0x7048, 0xF5D7, 0x7049, + 0xF5D8, 0x7045, 0xF5D9, 0x7046, 0xF5DA, 0x721D, 0xF5DB, 0x721A, + 0xF5DC, 0x7219, 0xF5DD, 0x737E, 0xF5DE, 0x7517, 0xF5DF, 0x766A, + 0xF5E0, 0x77D0, 0xF5E1, 0x792D, 0xF5E2, 0x7931, 0xF5E3, 0x792F, + 0xF5E4, 0x7C54, 0xF5E5, 0x7C53, 0xF5E6, 0x7CF2, 0xF5E7, 0x7E8A, + 0xF5E8, 0x7E87, 0xF5E9, 0x7E88, 0xF5EA, 0x7E8B, 0xF5EB, 0x7E86, + 0xF5EC, 0x7E8D, 0xF5ED, 0x7F4D, 0xF5EE, 0x7FBB, 0xF5EF, 0x8030, + 0xF5F0, 0x81DD, 0xF5F1, 0x8618, 0xF5F2, 0x862A, 0xF5F3, 0x8626, + 0xF5F4, 0x861F, 0xF5F5, 0x8623, 0xF5F6, 0x861C, 0xF5F7, 0x8619, + 0xF5F8, 0x8627, 0xF5F9, 0x862E, 0xF5FA, 0x8621, 0xF5FB, 0x8620, + 0xF5FC, 0x8629, 0xF5FD, 0x861E, 0xF5FE, 0x8625, 0xF640, 0x8829, + 0xF641, 0x881D, 0xF642, 0x881B, 0xF643, 0x8820, 0xF644, 0x8824, + 0xF645, 0x881C, 0xF646, 0x882B, 0xF647, 0x884A, 0xF648, 0x896D, + 0xF649, 0x8969, 0xF64A, 0x896E, 0xF64B, 0x896B, 0xF64C, 0x89FA, + 0xF64D, 0x8B79, 0xF64E, 0x8B78, 0xF64F, 0x8B45, 0xF650, 0x8B7A, + 0xF651, 0x8B7B, 0xF652, 0x8D10, 0xF653, 0x8D14, 0xF654, 0x8DAF, + 0xF655, 0x8E8E, 0xF656, 0x8E8C, 0xF657, 0x8F5E, 0xF658, 0x8F5B, + 0xF659, 0x8F5D, 0xF65A, 0x9146, 0xF65B, 0x9144, 0xF65C, 0x9145, + 0xF65D, 0x91B9, 0xF65E, 0x943F, 0xF65F, 0x943B, 0xF660, 0x9436, + 0xF661, 0x9429, 0xF662, 0x943D, 0xF663, 0x943C, 0xF664, 0x9430, + 0xF665, 0x9439, 0xF666, 0x942A, 0xF667, 0x9437, 0xF668, 0x942C, + 0xF669, 0x9440, 0xF66A, 0x9431, 0xF66B, 0x95E5, 0xF66C, 0x95E4, + 0xF66D, 0x95E3, 0xF66E, 0x9735, 0xF66F, 0x973A, 0xF670, 0x97BF, + 0xF671, 0x97E1, 0xF672, 0x9864, 0xF673, 0x98C9, 0xF674, 0x98C6, + 0xF675, 0x98C0, 0xF676, 0x9958, 0xF677, 0x9956, 0xF678, 0x9A39, + 0xF679, 0x9A3D, 0xF67A, 0x9A46, 0xF67B, 0x9A44, 0xF67C, 0x9A42, + 0xF67D, 0x9A41, 0xF67E, 0x9A3A, 0xF6A1, 0x9A3F, 0xF6A2, 0x9ACD, + 0xF6A3, 0x9B15, 0xF6A4, 0x9B17, 0xF6A5, 0x9B18, 0xF6A6, 0x9B16, + 0xF6A7, 0x9B3A, 0xF6A8, 0x9B52, 0xF6A9, 0x9C2B, 0xF6AA, 0x9C1D, + 0xF6AB, 0x9C1C, 0xF6AC, 0x9C2C, 0xF6AD, 0x9C23, 0xF6AE, 0x9C28, + 0xF6AF, 0x9C29, 0xF6B0, 0x9C24, 0xF6B1, 0x9C21, 0xF6B2, 0x9DB7, + 0xF6B3, 0x9DB6, 0xF6B4, 0x9DBC, 0xF6B5, 0x9DC1, 0xF6B6, 0x9DC7, + 0xF6B7, 0x9DCA, 0xF6B8, 0x9DCF, 0xF6B9, 0x9DBE, 0xF6BA, 0x9DC5, + 0xF6BB, 0x9DC3, 0xF6BC, 0x9DBB, 0xF6BD, 0x9DB5, 0xF6BE, 0x9DCE, + 0xF6BF, 0x9DB9, 0xF6C0, 0x9DBA, 0xF6C1, 0x9DAC, 0xF6C2, 0x9DC8, + 0xF6C3, 0x9DB1, 0xF6C4, 0x9DAD, 0xF6C5, 0x9DCC, 0xF6C6, 0x9DB3, + 0xF6C7, 0x9DCD, 0xF6C8, 0x9DB2, 0xF6C9, 0x9E7A, 0xF6CA, 0x9E9C, + 0xF6CB, 0x9EEB, 0xF6CC, 0x9EEE, 0xF6CD, 0x9EED, 0xF6CE, 0x9F1B, + 0xF6CF, 0x9F18, 0xF6D0, 0x9F1A, 0xF6D1, 0x9F31, 0xF6D2, 0x9F4E, + 0xF6D3, 0x9F65, 0xF6D4, 0x9F64, 0xF6D5, 0x9F92, 0xF6D6, 0x4EB9, + 0xF6D7, 0x56C6, 0xF6D8, 0x56C5, 0xF6D9, 0x56CB, 0xF6DA, 0x5971, + 0xF6DB, 0x5B4B, 0xF6DC, 0x5B4C, 0xF6DD, 0x5DD5, 0xF6DE, 0x5DD1, + 0xF6DF, 0x5EF2, 0xF6E0, 0x6521, 0xF6E1, 0x6520, 0xF6E2, 0x6526, + 0xF6E3, 0x6522, 0xF6E4, 0x6B0B, 0xF6E5, 0x6B08, 0xF6E6, 0x6B09, + 0xF6E7, 0x6C0D, 0xF6E8, 0x7055, 0xF6E9, 0x7056, 0xF6EA, 0x7057, + 0xF6EB, 0x7052, 0xF6EC, 0x721E, 0xF6ED, 0x721F, 0xF6EE, 0x72A9, + 0xF6EF, 0x737F, 0xF6F0, 0x74D8, 0xF6F1, 0x74D5, 0xF6F2, 0x74D9, + 0xF6F3, 0x74D7, 0xF6F4, 0x766D, 0xF6F5, 0x76AD, 0xF6F6, 0x7935, + 0xF6F7, 0x79B4, 0xF6F8, 0x7A70, 0xF6F9, 0x7A71, 0xF6FA, 0x7C57, + 0xF6FB, 0x7C5C, 0xF6FC, 0x7C59, 0xF6FD, 0x7C5B, 0xF6FE, 0x7C5A, + 0xF740, 0x7CF4, 0xF741, 0x7CF1, 0xF742, 0x7E91, 0xF743, 0x7F4F, + 0xF744, 0x7F87, 0xF745, 0x81DE, 0xF746, 0x826B, 0xF747, 0x8634, + 0xF748, 0x8635, 0xF749, 0x8633, 0xF74A, 0x862C, 0xF74B, 0x8632, + 0xF74C, 0x8636, 0xF74D, 0x882C, 0xF74E, 0x8828, 0xF74F, 0x8826, + 0xF750, 0x882A, 0xF751, 0x8825, 0xF752, 0x8971, 0xF753, 0x89BF, + 0xF754, 0x89BE, 0xF755, 0x89FB, 0xF756, 0x8B7E, 0xF757, 0x8B84, + 0xF758, 0x8B82, 0xF759, 0x8B86, 0xF75A, 0x8B85, 0xF75B, 0x8B7F, + 0xF75C, 0x8D15, 0xF75D, 0x8E95, 0xF75E, 0x8E94, 0xF75F, 0x8E9A, + 0xF760, 0x8E92, 0xF761, 0x8E90, 0xF762, 0x8E96, 0xF763, 0x8E97, + 0xF764, 0x8F60, 0xF765, 0x8F62, 0xF766, 0x9147, 0xF767, 0x944C, + 0xF768, 0x9450, 0xF769, 0x944A, 0xF76A, 0x944B, 0xF76B, 0x944F, + 0xF76C, 0x9447, 0xF76D, 0x9445, 0xF76E, 0x9448, 0xF76F, 0x9449, + 0xF770, 0x9446, 0xF771, 0x973F, 0xF772, 0x97E3, 0xF773, 0x986A, + 0xF774, 0x9869, 0xF775, 0x98CB, 0xF776, 0x9954, 0xF777, 0x995B, + 0xF778, 0x9A4E, 0xF779, 0x9A53, 0xF77A, 0x9A54, 0xF77B, 0x9A4C, + 0xF77C, 0x9A4F, 0xF77D, 0x9A48, 0xF77E, 0x9A4A, 0xF7A1, 0x9A49, + 0xF7A2, 0x9A52, 0xF7A3, 0x9A50, 0xF7A4, 0x9AD0, 0xF7A5, 0x9B19, + 0xF7A6, 0x9B2B, 0xF7A7, 0x9B3B, 0xF7A8, 0x9B56, 0xF7A9, 0x9B55, + 0xF7AA, 0x9C46, 0xF7AB, 0x9C48, 0xF7AC, 0x9C3F, 0xF7AD, 0x9C44, + 0xF7AE, 0x9C39, 0xF7AF, 0x9C33, 0xF7B0, 0x9C41, 0xF7B1, 0x9C3C, + 0xF7B2, 0x9C37, 0xF7B3, 0x9C34, 0xF7B4, 0x9C32, 0xF7B5, 0x9C3D, + 0xF7B6, 0x9C36, 0xF7B7, 0x9DDB, 0xF7B8, 0x9DD2, 0xF7B9, 0x9DDE, + 0xF7BA, 0x9DDA, 0xF7BB, 0x9DCB, 0xF7BC, 0x9DD0, 0xF7BD, 0x9DDC, + 0xF7BE, 0x9DD1, 0xF7BF, 0x9DDF, 0xF7C0, 0x9DE9, 0xF7C1, 0x9DD9, + 0xF7C2, 0x9DD8, 0xF7C3, 0x9DD6, 0xF7C4, 0x9DF5, 0xF7C5, 0x9DD5, + 0xF7C6, 0x9DDD, 0xF7C7, 0x9EB6, 0xF7C8, 0x9EF0, 0xF7C9, 0x9F35, + 0xF7CA, 0x9F33, 0xF7CB, 0x9F32, 0xF7CC, 0x9F42, 0xF7CD, 0x9F6B, + 0xF7CE, 0x9F95, 0xF7CF, 0x9FA2, 0xF7D0, 0x513D, 0xF7D1, 0x5299, + 0xF7D2, 0x58E8, 0xF7D3, 0x58E7, 0xF7D4, 0x5972, 0xF7D5, 0x5B4D, + 0xF7D6, 0x5DD8, 0xF7D7, 0x882F, 0xF7D8, 0x5F4F, 0xF7D9, 0x6201, + 0xF7DA, 0x6203, 0xF7DB, 0x6204, 0xF7DC, 0x6529, 0xF7DD, 0x6525, + 0xF7DE, 0x6596, 0xF7DF, 0x66EB, 0xF7E0, 0x6B11, 0xF7E1, 0x6B12, + 0xF7E2, 0x6B0F, 0xF7E3, 0x6BCA, 0xF7E4, 0x705B, 0xF7E5, 0x705A, + 0xF7E6, 0x7222, 0xF7E7, 0x7382, 0xF7E8, 0x7381, 0xF7E9, 0x7383, + 0xF7EA, 0x7670, 0xF7EB, 0x77D4, 0xF7EC, 0x7C67, 0xF7ED, 0x7C66, + 0xF7EE, 0x7E95, 0xF7EF, 0x826C, 0xF7F0, 0x863A, 0xF7F1, 0x8640, + 0xF7F2, 0x8639, 0xF7F3, 0x863C, 0xF7F4, 0x8631, 0xF7F5, 0x863B, + 0xF7F6, 0x863E, 0xF7F7, 0x8830, 0xF7F8, 0x8832, 0xF7F9, 0x882E, + 0xF7FA, 0x8833, 0xF7FB, 0x8976, 0xF7FC, 0x8974, 0xF7FD, 0x8973, + 0xF7FE, 0x89FE, 0xF840, 0x8B8C, 0xF841, 0x8B8E, 0xF842, 0x8B8B, + 0xF843, 0x8B88, 0xF844, 0x8C45, 0xF845, 0x8D19, 0xF846, 0x8E98, + 0xF847, 0x8F64, 0xF848, 0x8F63, 0xF849, 0x91BC, 0xF84A, 0x9462, + 0xF84B, 0x9455, 0xF84C, 0x945D, 0xF84D, 0x9457, 0xF84E, 0x945E, + 0xF84F, 0x97C4, 0xF850, 0x97C5, 0xF851, 0x9800, 0xF852, 0x9A56, + 0xF853, 0x9A59, 0xF854, 0x9B1E, 0xF855, 0x9B1F, 0xF856, 0x9B20, + 0xF857, 0x9C52, 0xF858, 0x9C58, 0xF859, 0x9C50, 0xF85A, 0x9C4A, + 0xF85B, 0x9C4D, 0xF85C, 0x9C4B, 0xF85D, 0x9C55, 0xF85E, 0x9C59, + 0xF85F, 0x9C4C, 0xF860, 0x9C4E, 0xF861, 0x9DFB, 0xF862, 0x9DF7, + 0xF863, 0x9DEF, 0xF864, 0x9DE3, 0xF865, 0x9DEB, 0xF866, 0x9DF8, + 0xF867, 0x9DE4, 0xF868, 0x9DF6, 0xF869, 0x9DE1, 0xF86A, 0x9DEE, + 0xF86B, 0x9DE6, 0xF86C, 0x9DF2, 0xF86D, 0x9DF0, 0xF86E, 0x9DE2, + 0xF86F, 0x9DEC, 0xF870, 0x9DF4, 0xF871, 0x9DF3, 0xF872, 0x9DE8, + 0xF873, 0x9DED, 0xF874, 0x9EC2, 0xF875, 0x9ED0, 0xF876, 0x9EF2, + 0xF877, 0x9EF3, 0xF878, 0x9F06, 0xF879, 0x9F1C, 0xF87A, 0x9F38, + 0xF87B, 0x9F37, 0xF87C, 0x9F36, 0xF87D, 0x9F43, 0xF87E, 0x9F4F, + 0xF8A1, 0x9F71, 0xF8A2, 0x9F70, 0xF8A3, 0x9F6E, 0xF8A4, 0x9F6F, + 0xF8A5, 0x56D3, 0xF8A6, 0x56CD, 0xF8A7, 0x5B4E, 0xF8A8, 0x5C6D, + 0xF8A9, 0x652D, 0xF8AA, 0x66ED, 0xF8AB, 0x66EE, 0xF8AC, 0x6B13, + 0xF8AD, 0x705F, 0xF8AE, 0x7061, 0xF8AF, 0x705D, 0xF8B0, 0x7060, + 0xF8B1, 0x7223, 0xF8B2, 0x74DB, 0xF8B3, 0x74E5, 0xF8B4, 0x77D5, + 0xF8B5, 0x7938, 0xF8B6, 0x79B7, 0xF8B7, 0x79B6, 0xF8B8, 0x7C6A, + 0xF8B9, 0x7E97, 0xF8BA, 0x7F89, 0xF8BB, 0x826D, 0xF8BC, 0x8643, + 0xF8BD, 0x8838, 0xF8BE, 0x8837, 0xF8BF, 0x8835, 0xF8C0, 0x884B, + 0xF8C1, 0x8B94, 0xF8C2, 0x8B95, 0xF8C3, 0x8E9E, 0xF8C4, 0x8E9F, + 0xF8C5, 0x8EA0, 0xF8C6, 0x8E9D, 0xF8C7, 0x91BE, 0xF8C8, 0x91BD, + 0xF8C9, 0x91C2, 0xF8CA, 0x946B, 0xF8CB, 0x9468, 0xF8CC, 0x9469, + 0xF8CD, 0x96E5, 0xF8CE, 0x9746, 0xF8CF, 0x9743, 0xF8D0, 0x9747, + 0xF8D1, 0x97C7, 0xF8D2, 0x97E5, 0xF8D3, 0x9A5E, 0xF8D4, 0x9AD5, + 0xF8D5, 0x9B59, 0xF8D6, 0x9C63, 0xF8D7, 0x9C67, 0xF8D8, 0x9C66, + 0xF8D9, 0x9C62, 0xF8DA, 0x9C5E, 0xF8DB, 0x9C60, 0xF8DC, 0x9E02, + 0xF8DD, 0x9DFE, 0xF8DE, 0x9E07, 0xF8DF, 0x9E03, 0xF8E0, 0x9E06, + 0xF8E1, 0x9E05, 0xF8E2, 0x9E00, 0xF8E3, 0x9E01, 0xF8E4, 0x9E09, + 0xF8E5, 0x9DFF, 0xF8E6, 0x9DFD, 0xF8E7, 0x9E04, 0xF8E8, 0x9EA0, + 0xF8E9, 0x9F1E, 0xF8EA, 0x9F46, 0xF8EB, 0x9F74, 0xF8EC, 0x9F75, + 0xF8ED, 0x9F76, 0xF8EE, 0x56D4, 0xF8EF, 0x652E, 0xF8F0, 0x65B8, + 0xF8F1, 0x6B18, 0xF8F2, 0x6B19, 0xF8F3, 0x6B17, 0xF8F4, 0x6B1A, + 0xF8F5, 0x7062, 0xF8F6, 0x7226, 0xF8F7, 0x72AA, 0xF8F8, 0x77D8, + 0xF8F9, 0x77D9, 0xF8FA, 0x7939, 0xF8FB, 0x7C69, 0xF8FC, 0x7C6B, + 0xF8FD, 0x7CF6, 0xF8FE, 0x7E9A, 0xF940, 0x7E98, 0xF941, 0x7E9B, + 0xF942, 0x7E99, 0xF943, 0x81E0, 0xF944, 0x81E1, 0xF945, 0x8646, + 0xF946, 0x8647, 0xF947, 0x8648, 0xF948, 0x8979, 0xF949, 0x897A, + 0xF94A, 0x897C, 0xF94B, 0x897B, 0xF94C, 0x89FF, 0xF94D, 0x8B98, + 0xF94E, 0x8B99, 0xF94F, 0x8EA5, 0xF950, 0x8EA4, 0xF951, 0x8EA3, + 0xF952, 0x946E, 0xF953, 0x946D, 0xF954, 0x946F, 0xF955, 0x9471, + 0xF956, 0x9473, 0xF957, 0x9749, 0xF958, 0x9872, 0xF959, 0x995F, + 0xF95A, 0x9C68, 0xF95B, 0x9C6E, 0xF95C, 0x9C6D, 0xF95D, 0x9E0B, + 0xF95E, 0x9E0D, 0xF95F, 0x9E10, 0xF960, 0x9E0F, 0xF961, 0x9E12, + 0xF962, 0x9E11, 0xF963, 0x9EA1, 0xF964, 0x9EF5, 0xF965, 0x9F09, + 0xF966, 0x9F47, 0xF967, 0x9F78, 0xF968, 0x9F7B, 0xF969, 0x9F7A, + 0xF96A, 0x9F79, 0xF96B, 0x571E, 0xF96C, 0x7066, 0xF96D, 0x7C6F, + 0xF96E, 0x883C, 0xF96F, 0x8DB2, 0xF970, 0x8EA6, 0xF971, 0x91C3, + 0xF972, 0x9474, 0xF973, 0x9478, 0xF974, 0x9476, 0xF975, 0x9475, + 0xF976, 0x9A60, 0xF977, 0x9C74, 0xF978, 0x9C73, 0xF979, 0x9C71, + 0xF97A, 0x9C75, 0xF97B, 0x9E14, 0xF97C, 0x9E13, 0xF97D, 0x9EF6, + 0xF97E, 0x9F0A, 0xF9A1, 0x9FA4, 0xF9A2, 0x7068, 0xF9A3, 0x7065, + 0xF9A4, 0x7CF7, 0xF9A5, 0x866A, 0xF9A6, 0x883E, 0xF9A7, 0x883D, + 0xF9A8, 0x883F, 0xF9A9, 0x8B9E, 0xF9AA, 0x8C9C, 0xF9AB, 0x8EA9, + 0xF9AC, 0x8EC9, 0xF9AD, 0x974B, 0xF9AE, 0x9873, 0xF9AF, 0x9874, + 0xF9B0, 0x98CC, 0xF9B1, 0x9961, 0xF9B2, 0x99AB, 0xF9B3, 0x9A64, + 0xF9B4, 0x9A66, 0xF9B5, 0x9A67, 0xF9B6, 0x9B24, 0xF9B7, 0x9E15, + 0xF9B8, 0x9E17, 0xF9B9, 0x9F48, 0xF9BA, 0x6207, 0xF9BB, 0x6B1E, + 0xF9BC, 0x7227, 0xF9BD, 0x864C, 0xF9BE, 0x8EA8, 0xF9BF, 0x9482, + 0xF9C0, 0x9480, 0xF9C1, 0x9481, 0xF9C2, 0x9A69, 0xF9C3, 0x9A68, + 0xF9C4, 0x9B2E, 0xF9C5, 0x9E19, 0xF9C6, 0x7229, 0xF9C7, 0x864B, + 0xF9C8, 0x8B9F, 0xF9C9, 0x9483, 0xF9CA, 0x9C79, 0xF9CB, 0x9EB7, + 0xF9CC, 0x7675, 0xF9CD, 0x9A6B, 0xF9CE, 0x9C7A, 0xF9CF, 0x9E1D, + 0xF9D0, 0x7069, 0xF9D1, 0x706A, 0xF9D2, 0x9EA4, 0xF9D3, 0x9F7E, + 0xF9D4, 0x9F49, 0xF9D5, 0x9F98, 0xF9D6, 0x7881, 0xF9D7, 0x92B9, + 0xF9D8, 0x88CF, 0xF9D9, 0x58BB, 0xF9DA, 0x6052, 0xF9DB, 0x7CA7, + 0xF9DC, 0x5AFA, 0xF9DD, 0x2554, 0xF9DE, 0x2566, 0xF9DF, 0x2557, + 0xF9E0, 0x2560, 0xF9E1, 0x256C, 0xF9E2, 0x2563, 0xF9E3, 0x255A, + 0xF9E4, 0x2569, 0xF9E5, 0x255D, 0xF9E6, 0x2552, 0xF9E7, 0x2564, + 0xF9E8, 0x2555, 0xF9E9, 0x255E, 0xF9EA, 0x256A, 0xF9EB, 0x2561, + 0xF9EC, 0x2558, 0xF9ED, 0x2567, 0xF9EE, 0x255B, 0xF9EF, 0x2553, + 0xF9F0, 0x2565, 0xF9F1, 0x2556, 0xF9F2, 0x255F, 0xF9F3, 0x256B, + 0xF9F4, 0x2562, 0xF9F5, 0x2559, 0xF9F6, 0x2568, 0xF9F7, 0x255C, + 0xF9F8, 0x2551, 0xF9F9, 0x2550, 0xF9FA, 0x256D, 0xF9FB, 0x256E, + 0xF9FC, 0x2570, 0xF9FD, 0x256F, 0xF9FE, 0x2593, 0, 0 +}; + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR src, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (src < 0x80) { /* ASCII */ + c = src; + } else { + if (dir) { /* OEMCP to unicode */ + p = oem2uni; + hi = sizeof(oem2uni) / 4 - 1; + } else { /* Unicode to OEMCP */ + p = uni2oem; + hi = sizeof(uni2oem) / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (src == p[i * 2]) break; + if (src > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; + } + + return c; +} + + + + +WCHAR ff_wtoupper ( /* Upper converted character */ + WCHAR chr /* Input character */ +) +{ + static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; + static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; + int i; + + + for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + + return tbl_lower[i] ? tbl_upper[i] : chr; +} diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/ccsbcs.c b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/ccsbcs.c new file mode 100644 index 0000000..359755a --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/ccsbcs.c @@ -0,0 +1,540 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - Local code bidirectional converter (C)ChaN, 2009 */ +/* (SBCS code pages) */ +/*------------------------------------------------------------------------*/ +/* 437 U.S. (OEM) +/ 720 Arabic (OEM) +/ 1256 Arabic (Windows) +/ 737 Greek (OEM) +/ 1253 Greek (Windows) +/ 1250 Central Europe (Windows) +/ 775 Baltic (OEM) +/ 1257 Baltic (Windows) +/ 850 Multilingual Latin 1 (OEM) +/ 852 Latin 2 (OEM) +/ 1252 Latin 1 (Windows) +/ 855 Cyrillic (OEM) +/ 1251 Cyrillic (Windows) +/ 866 Russian (OEM) +/ 857 Turkish (OEM) +/ 1254 Turkish (Windows) +/ 858 Multilingual Latin 1 + Euro (OEM) +/ 862 Hebrew (OEM) +/ 1255 Hebrew (Windows) +/ 874 Thai (OEM, Windows) +/ 1258 Vietnam (OEM, Windows) +*/ + +#include "../ff.h" + + +#if _CODE_PAGE == 437 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP437(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, + 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 720 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP720(0x80-0xFF) to Unicode conversion table */ + 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, + 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, + 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, + 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0xO650, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 737 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP737(0x80-0xFF) to Unicode conversion table */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, + 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, + 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, + 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, + 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, + 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 775 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP775(0x80-0xFF) to Unicode conversion table */ + 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, + 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, + 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, + 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, + 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, + 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, + 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, + 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, + 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, + 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, + 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 850 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP850(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, + 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 852 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP852(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, + 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, + 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, + 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, + 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, + 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, + 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, + 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, + 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 855 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP855(0x80-0xFF) to Unicode conversion table */ + 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, + 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, + 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, + 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, + 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, + 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, + 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, + 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, + 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, + 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, + 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, + 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 857 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP857(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, + 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 858 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP858(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x2550, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x20AC, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00C6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, + 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 862 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP862(0x80-0xFF) to Unicode conversion table */ + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, + 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 866 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP866(0x80-0xFF) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 874 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP874(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, + 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, + 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, + 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, + 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, + 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, + 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, + 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F, + 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, + 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, + 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, + 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +#elif _CODE_PAGE == 1250 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1250(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, + 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, + 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, + 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, + 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 +}; + +#elif _CODE_PAGE == 1251 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1251(0x80-0xFF) to Unicode conversion table */ + 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, + 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, + 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2111, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, + 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, + 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, + 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, + 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042D, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F +}; + +#elif _CODE_PAGE == 1252 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1252(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF +}; + +#elif _CODE_PAGE == 1253 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1253(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x000C, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, + 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, + 0x03A8, 0x03A9, 0x03AA, 0x03AD, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000 +}; + +#elif _CODE_PAGE == 1254 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1254(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x210A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x0130, 0x015E, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF +}; + +#elif _CODE_PAGE == 1255 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1255(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, + 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, + 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, + 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000 +}; + +#elif _CODE_PAGE == 1256 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1256(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, + 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, + 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, + 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, + 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0640, 0x0642, 0x0643, + 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, + 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, + 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2 +} + +#elif _CODE_PAGE == 1257 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1257(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000, + 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, + 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, + 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, + 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, + 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, + 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, + 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, + 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, + 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, + 0x0173, 0x014E, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9 +}; + +#elif _CODE_PAGE == 1258 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1258(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, + 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF, + 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF +}; + +#endif + + +#if !_TBLDEF || !_USE_LFN +#error This file is not needed in current configuration +#endif + + +WCHAR ff_convert ( /* Converted character, Returns zero on error */ + WCHAR src, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + WCHAR c; + + + if (src < 0x80) { /* ASCII */ + c = src; + + } else { + if (dir) { /* OEMCP to Unicode */ + c = (src >= 0x100) ? 0 : Tbl[src - 0x80]; + + } else { /* Unicode to OEMCP */ + for (c = 0; c < 0x80; c++) { + if (src == Tbl[c]) break; + } + c = (c + 0x80) & 0xFF; + } + } + + return c; +} + + +WCHAR ff_wtoupper ( /* Upper converted character */ + WCHAR chr /* Input character */ +) +{ + static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; + static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; + int i; + + + for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + + return tbl_lower[i] ? tbl_upper[i] : chr; +} diff --git a/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/syncobj.c b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/syncobj.c new file mode 100644 index 0000000..6d8ad28 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/FileSystem/FatFs-0.7e/src/option/syncobj.c @@ -0,0 +1,111 @@ +/*------------------------------------------------------------------------*/ +/* Sample code of OS dependent synchronization object controls */ +/* for FatFs R0.07d (C)ChaN, 2009 */ +/*------------------------------------------------------------------------*/ + +#include +#include + +#include "../ff.h" + +#if _FS_REENTRANT + +/*------------------------------------------------------------------------*/ +/* Create a Synchronization Object for a Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount function to create a new +/ synchronization object, such as semaphore and mutex. When a FALSE is +/ returned, the f_mount function fails with FR_INT_ERR. +*/ + +BOOL ff_cre_syncobj ( /* TRUE:Function succeeded, FALSE:Could not create due to any error */ + BYTE vol, /* Corresponding logical drive being processed */ + _SYNC_t *sobj /* Pointer to return the created sync object */ +) +{ + BOOL ret; + + *sobj = xSemaphoreCreateMutex(); + + if( *sobj == NULL ) + { + ret = FALSE; + } + else + { + ret = TRUE; + } + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Delete a Synchronization Object */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount function to delete a synchronization +/ object that created with ff_cre_syncobj function. When a FALSE is +/ returned, the f_mount function fails with FR_INT_ERR. +*/ + +BOOL ff_del_syncobj ( /* TRUE:Function succeeded, FALSE:Could not delete due to any error */ + _SYNC_t sobj /* Sync object tied to the logical drive to be deleted */ +) +{ + BOOL ret; + + if( sobj != NULL ) + { + vQueueDelete( sobj ); + ret = TRUE; + } + else + { + ret = FALSE; + } + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Request Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on entering file functions to lock the volume. +/ When a FALSE is returned, the file function fails with FR_TIMEOUT. +*/ + +BOOL ff_req_grant ( /* TRUE:Got a grant to access the volume, FALSE:Could not get a grant */ + _SYNC_t sobj /* Sync object to wait */ +) +{ + BOOL ret; + + ret = xSemaphoreTake( sobj, _FS_TIMEOUT ); + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Release Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on leaving file functions to unlock the volume. +*/ + +void ff_rel_grant ( + _SYNC_t sobj /* Sync object to be signaled */ +) +{ + xSemaphoreGive( sobj ); +} + + +#else + +#error This file is not needed in this configuration. + +#endif diff --git a/third_party/FreeRTOS/Demo/Common/Full/BlockQ.c b/third_party/FreeRTOS/Demo/Common/Full/BlockQ.c new file mode 100644 index 0000000..89119ea --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Full/BlockQ.c @@ -0,0 +1,346 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/** + * Creates six tasks that operate on three queues as follows: + * + * The first two tasks send and receive an incrementing number to/from a queue. + * One task acts as a producer and the other as the consumer. The consumer is a + * higher priority than the producer and is set to block on queue reads. The queue + * only has space for one item - as soon as the producer posts a message on the + * queue the consumer will unblock, pre-empt the producer, and remove the item. + * + * The second two tasks work the other way around. Again the queue used only has + * enough space for one item. This time the consumer has a lower priority than the + * producer. The producer will try to post on the queue blocking when the queue is + * full. When the consumer wakes it will remove the item from the queue, causing + * the producer to unblock, pre-empt the consumer, and immediately re-fill the + * queue. + * + * The last two tasks use the same queue producer and consumer functions. This time the queue has + * enough space for lots of items and the tasks operate at the same priority. The + * producer will execute, placing items into the queue. The consumer will start + * executing when either the queue becomes full (causing the producer to block) or + * a context switch occurs (tasks of the same priority will time slice). + * + * \page BlockQC blockQ.c + * \ingroup DemoFiles + *
+ */ + +/* +Changes from V1.00: + + + Reversed the priority and block times of the second two demo tasks so + they operate as per the description above. + +Changes from V2.0.0 + + + Delay periods are now specified using variables and constants of + portTickType rather than unsigned long. + +Changes from V4.0.2 + + + The second set of tasks were created the wrong way around. This has been + corrected. +*/ + + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +/* Demo program include files. */ +#include "BlockQ.h" +#include "print.h" + +#define blckqSTACK_SIZE ( ( unsigned short ) configMINIMAL_STACK_SIZE ) +#define blckqNUM_TASK_SETS ( 3 ) + +/* Structure used to pass parameters to the blocking queue tasks. */ +typedef struct BLOCKING_QUEUE_PARAMETERS +{ + xQueueHandle xQueue; /*< The queue to be used by the task. */ + portTickType xBlockTime; /*< The block time to use on queue reads/writes. */ + volatile short *psCheckVariable; /*< Incremented on each successful cycle to check the task is still running. */ +} xBlockingQueueParameters; + +/* Task function that creates an incrementing number and posts it on a queue. */ +static void vBlockingQueueProducer( void *pvParameters ); + +/* Task function that removes the incrementing number from a queue and checks that +it is the expected number. */ +static void vBlockingQueueConsumer( void *pvParameters ); + +/* Variables which are incremented each time an item is removed from a queue, and +found to be the expected value. +These are used to check that the tasks are still running. */ +static volatile short sBlockingConsumerCount[ blckqNUM_TASK_SETS ] = { ( short ) 0, ( short ) 0, ( short ) 0 }; + +/* Variable which are incremented each time an item is posted on a queue. These +are used to check that the tasks are still running. */ +static volatile short sBlockingProducerCount[ blckqNUM_TASK_SETS ] = { ( short ) 0, ( short ) 0, ( short ) 0 }; + +/*-----------------------------------------------------------*/ + +void vStartBlockingQueueTasks( unsigned portBASE_TYPE uxPriority ) +{ +xBlockingQueueParameters *pxQueueParameters1, *pxQueueParameters2; +xBlockingQueueParameters *pxQueueParameters3, *pxQueueParameters4; +xBlockingQueueParameters *pxQueueParameters5, *pxQueueParameters6; +const unsigned portBASE_TYPE uxQueueSize1 = 1, uxQueueSize5 = 5; +const portTickType xBlockTime = ( portTickType ) 1000 / portTICK_RATE_MS; +const portTickType xDontBlock = ( portTickType ) 0; + + /* Create the first two tasks as described at the top of the file. */ + + /* First create the structure used to pass parameters to the consumer tasks. */ + pxQueueParameters1 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + + /* Create the queue used by the first two tasks to pass the incrementing number. + Pass a pointer to the queue in the parameter structure. */ + pxQueueParameters1->xQueue = xQueueCreate( uxQueueSize1, ( unsigned portBASE_TYPE ) sizeof( unsigned short ) ); + + /* The consumer is created first so gets a block time as described above. */ + pxQueueParameters1->xBlockTime = xBlockTime; + + /* Pass in the variable that this task is going to increment so we can check it + is still running. */ + pxQueueParameters1->psCheckVariable = &( sBlockingConsumerCount[ 0 ] ); + + /* Create the structure used to pass parameters to the producer task. */ + pxQueueParameters2 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + + /* Pass the queue to this task also, using the parameter structure. */ + pxQueueParameters2->xQueue = pxQueueParameters1->xQueue; + + /* The producer is not going to block - as soon as it posts the consumer will + wake and remove the item so the producer should always have room to post. */ + pxQueueParameters2->xBlockTime = xDontBlock; + + /* Pass in the variable that this task is going to increment so we can check + it is still running. */ + pxQueueParameters2->psCheckVariable = &( sBlockingProducerCount[ 0 ] ); + + + /* Note the producer has a lower priority than the consumer when the tasks are + spawned. */ + xTaskCreate( vBlockingQueueConsumer, "QConsB1", blckqSTACK_SIZE, ( void * ) pxQueueParameters1, uxPriority, NULL ); + xTaskCreate( vBlockingQueueProducer, "QProdB2", blckqSTACK_SIZE, ( void * ) pxQueueParameters2, tskIDLE_PRIORITY, NULL ); + + + + /* Create the second two tasks as described at the top of the file. This uses + the same mechanism but reverses the task priorities. */ + + pxQueueParameters3 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + pxQueueParameters3->xQueue = xQueueCreate( uxQueueSize1, ( unsigned portBASE_TYPE ) sizeof( unsigned short ) ); + pxQueueParameters3->xBlockTime = xDontBlock; + pxQueueParameters3->psCheckVariable = &( sBlockingProducerCount[ 1 ] ); + + pxQueueParameters4 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + pxQueueParameters4->xQueue = pxQueueParameters3->xQueue; + pxQueueParameters4->xBlockTime = xBlockTime; + pxQueueParameters4->psCheckVariable = &( sBlockingConsumerCount[ 1 ] ); + + xTaskCreate( vBlockingQueueProducer, "QProdB3", blckqSTACK_SIZE, ( void * ) pxQueueParameters3, tskIDLE_PRIORITY, NULL ); + xTaskCreate( vBlockingQueueConsumer, "QConsB4", blckqSTACK_SIZE, ( void * ) pxQueueParameters4, uxPriority, NULL ); + + + + /* Create the last two tasks as described above. The mechanism is again just + the same. This time both parameter structures are given a block time. */ + pxQueueParameters5 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + pxQueueParameters5->xQueue = xQueueCreate( uxQueueSize5, ( unsigned portBASE_TYPE ) sizeof( unsigned short ) ); + pxQueueParameters5->xBlockTime = xBlockTime; + pxQueueParameters5->psCheckVariable = &( sBlockingProducerCount[ 2 ] ); + + pxQueueParameters6 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + pxQueueParameters6->xQueue = pxQueueParameters5->xQueue; + pxQueueParameters6->xBlockTime = xBlockTime; + pxQueueParameters6->psCheckVariable = &( sBlockingConsumerCount[ 2 ] ); + + xTaskCreate( vBlockingQueueProducer, "QProdB5", blckqSTACK_SIZE, ( void * ) pxQueueParameters5, tskIDLE_PRIORITY, NULL ); + xTaskCreate( vBlockingQueueConsumer, "QConsB6", blckqSTACK_SIZE, ( void * ) pxQueueParameters6, tskIDLE_PRIORITY, NULL ); +} +/*-----------------------------------------------------------*/ + +static void vBlockingQueueProducer( void *pvParameters ) +{ +unsigned short usValue = 0; +xBlockingQueueParameters *pxQueueParameters; +const char * const pcTaskStartMsg = "Blocking queue producer started.\r\n"; +const char * const pcTaskErrorMsg = "Could not post on blocking queue\r\n"; +short sErrorEverOccurred = pdFALSE; + + pxQueueParameters = ( xBlockingQueueParameters * ) pvParameters; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + for( ;; ) + { + if( xQueueSendToBack( pxQueueParameters->xQueue, ( void * ) &usValue, pxQueueParameters->xBlockTime ) != pdPASS ) + { + vPrintDisplayMessage( &pcTaskErrorMsg ); + sErrorEverOccurred = pdTRUE; + } + else + { + /* We have successfully posted a message, so increment the variable + used to check we are still running. */ + if( sErrorEverOccurred == pdFALSE ) + { + ( *pxQueueParameters->psCheckVariable )++; + } + + /* Increment the variable we are going to post next time round. The + consumer will expect the numbers to follow in numerical order. */ + ++usValue; + } + } +} +/*-----------------------------------------------------------*/ + +static void vBlockingQueueConsumer( void *pvParameters ) +{ +unsigned short usData, usExpectedValue = 0; +xBlockingQueueParameters *pxQueueParameters; +const char * const pcTaskStartMsg = "Blocking queue consumer started.\r\n"; +const char * const pcTaskErrorMsg = "Incorrect value received on blocking queue.\r\n"; +short sErrorEverOccurred = pdFALSE; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + pxQueueParameters = ( xBlockingQueueParameters * ) pvParameters; + + for( ;; ) + { + if( xQueueReceive( pxQueueParameters->xQueue, &usData, pxQueueParameters->xBlockTime ) == pdPASS ) + { + if( usData != usExpectedValue ) + { + vPrintDisplayMessage( &pcTaskErrorMsg ); + + /* Catch-up. */ + usExpectedValue = usData; + + sErrorEverOccurred = pdTRUE; + } + else + { + /* We have successfully received a message, so increment the + variable used to check we are still running. */ + if( sErrorEverOccurred == pdFALSE ) + { + ( *pxQueueParameters->psCheckVariable )++; + } + + /* Increment the value we expect to remove from the queue next time + round. */ + ++usExpectedValue; + } + } + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreBlockingQueuesStillRunning( void ) +{ +static short sLastBlockingConsumerCount[ blckqNUM_TASK_SETS ] = { ( short ) 0, ( short ) 0, ( short ) 0 }; +static short sLastBlockingProducerCount[ blckqNUM_TASK_SETS ] = { ( short ) 0, ( short ) 0, ( short ) 0 }; +portBASE_TYPE xReturn = pdPASS, xTasks; + + /* Not too worried about mutual exclusion on these variables as they are 16 + bits and we are only reading them. We also only care to see if they have + changed or not. + + Loop through each check variable and return pdFALSE if any are found not + to have changed since the last call. */ + + for( xTasks = 0; xTasks < blckqNUM_TASK_SETS; xTasks++ ) + { + if( sBlockingConsumerCount[ xTasks ] == sLastBlockingConsumerCount[ xTasks ] ) + { + xReturn = pdFALSE; + } + sLastBlockingConsumerCount[ xTasks ] = sBlockingConsumerCount[ xTasks ]; + + + if( sBlockingProducerCount[ xTasks ] == sLastBlockingProducerCount[ xTasks ] ) + { + xReturn = pdFALSE; + } + sLastBlockingProducerCount[ xTasks ] = sBlockingProducerCount[ xTasks ]; + } + + return xReturn; +} + diff --git a/third_party/FreeRTOS/Demo/Common/Full/PollQ.c b/third_party/FreeRTOS/Demo/Common/Full/PollQ.c new file mode 100644 index 0000000..47dc140 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Full/PollQ.c @@ -0,0 +1,258 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/** + * This is a very simple queue test. See the BlockQ. c documentation for a more + * comprehensive version. + * + * Creates two tasks that communicate over a single queue. One task acts as a + * producer, the other a consumer. + * + * The producer loops for three iteration, posting an incrementing number onto the + * queue each cycle. It then delays for a fixed period before doing exactly the + * same again. + * + * The consumer loops emptying the queue. Each item removed from the queue is + * checked to ensure it contains the expected value. When the queue is empty it + * blocks for a fixed period, then does the same again. + * + * All queue access is performed without blocking. The consumer completely empties + * the queue each time it runs so the producer should never find the queue full. + * + * An error is flagged if the consumer obtains an unexpected value or the producer + * find the queue is full. + * + * \page PollQC pollQ.c + * \ingroup DemoFiles + *
+ */ + +/* +Changes from V2.0.0 + + + Delay periods are now specified using variables and constants of + portTickType rather than unsigned long. +*/ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "print.h" + +/* Demo program include files. */ +#include "PollQ.h" + +#define pollqSTACK_SIZE ( ( unsigned short ) configMINIMAL_STACK_SIZE ) + +/* The task that posts the incrementing number onto the queue. */ +static void vPolledQueueProducer( void *pvParameters ); + +/* The task that empties the queue. */ +static void vPolledQueueConsumer( void *pvParameters ); + +/* Variables that are used to check that the tasks are still running with no errors. */ +static volatile short sPollingConsumerCount = 0, sPollingProducerCount = 0; +/*-----------------------------------------------------------*/ + +void vStartPolledQueueTasks( unsigned portBASE_TYPE uxPriority ) +{ +static xQueueHandle xPolledQueue; +const unsigned portBASE_TYPE uxQueueSize = 10; + + /* Create the queue used by the producer and consumer. */ + xPolledQueue = xQueueCreate( uxQueueSize, ( unsigned portBASE_TYPE ) sizeof( unsigned short ) ); + + /* Spawn the producer and consumer. */ + xTaskCreate( vPolledQueueConsumer, "QConsNB", pollqSTACK_SIZE, ( void * ) &xPolledQueue, uxPriority, NULL ); + xTaskCreate( vPolledQueueProducer, "QProdNB", pollqSTACK_SIZE, ( void * ) &xPolledQueue, uxPriority, NULL ); +} +/*-----------------------------------------------------------*/ + +static void vPolledQueueProducer( void *pvParameters ) +{ +unsigned short usValue = 0, usLoop; +xQueueHandle *pxQueue; +const portTickType xDelay = ( portTickType ) 200 / portTICK_RATE_MS; +const unsigned short usNumToProduce = 3; +const char * const pcTaskStartMsg = "Polled queue producer started.\r\n"; +const char * const pcTaskErrorMsg = "Could not post on polled queue.\r\n"; +short sError = pdFALSE; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + /* The queue being used is passed in as the parameter. */ + pxQueue = ( xQueueHandle * ) pvParameters; + + for( ;; ) + { + for( usLoop = 0; usLoop < usNumToProduce; ++usLoop ) + { + /* Send an incrementing number on the queue without blocking. */ + if( xQueueSendToBack( *pxQueue, ( void * ) &usValue, ( portTickType ) 0 ) != pdPASS ) + { + /* We should never find the queue full - this is an error. */ + vPrintDisplayMessage( &pcTaskErrorMsg ); + sError = pdTRUE; + } + else + { + if( sError == pdFALSE ) + { + /* If an error has ever been recorded we stop incrementing the + check variable. */ + ++sPollingProducerCount; + } + + /* Update the value we are going to post next time around. */ + ++usValue; + } + } + + /* Wait before we start posting again to ensure the consumer runs and + empties the queue. */ + vTaskDelay( xDelay ); + } +} +/*-----------------------------------------------------------*/ + +static void vPolledQueueConsumer( void *pvParameters ) +{ +unsigned short usData, usExpectedValue = 0; +xQueueHandle *pxQueue; +const portTickType xDelay = ( portTickType ) 200 / portTICK_RATE_MS; +const char * const pcTaskStartMsg = "Polled queue consumer started.\r\n"; +const char * const pcTaskErrorMsg = "Incorrect value received on polled queue.\r\n"; +short sError = pdFALSE; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + /* The queue being used is passed in as the parameter. */ + pxQueue = ( xQueueHandle * ) pvParameters; + + for( ;; ) + { + /* Loop until the queue is empty. */ + while( uxQueueMessagesWaiting( *pxQueue ) ) + { + if( xQueueReceive( *pxQueue, &usData, ( portTickType ) 0 ) == pdPASS ) + { + if( usData != usExpectedValue ) + { + /* This is not what we expected to receive so an error has + occurred. */ + vPrintDisplayMessage( &pcTaskErrorMsg ); + sError = pdTRUE; + /* Catch-up to the value we received so our next expected value + should again be correct. */ + usExpectedValue = usData; + } + else + { + if( sError == pdFALSE ) + { + /* Only increment the check variable if no errors have + occurred. */ + ++sPollingConsumerCount; + } + } + ++usExpectedValue; + } + } + + /* Now the queue is empty we block, allowing the producer to place more + items in the queue. */ + vTaskDelay( xDelay ); + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running with no errors. */ +portBASE_TYPE xArePollingQueuesStillRunning( void ) +{ +static short sLastPollingConsumerCount = 0, sLastPollingProducerCount = 0; +portBASE_TYPE xReturn; + + if( ( sLastPollingConsumerCount == sPollingConsumerCount ) || + ( sLastPollingProducerCount == sPollingProducerCount ) + ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + sLastPollingConsumerCount = sPollingConsumerCount; + sLastPollingProducerCount = sPollingProducerCount; + + return xReturn; +} diff --git a/third_party/FreeRTOS/Demo/Common/Full/comtest.c b/third_party/FreeRTOS/Demo/Common/Full/comtest.c new file mode 100644 index 0000000..dfd3459 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Full/comtest.c @@ -0,0 +1,384 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/** + * Creates two tasks that operate on an interrupt driven serial port. A loopback + * connector should be used so that everything that is transmitted is also received. + * The serial port does not use any flow control. On a standard 9way 'D' connector + * pins two and three should be connected together. + * + * The first task repeatedly sends a string to a queue, character at a time. The + * serial port interrupt will empty the queue and transmit the characters. The + * task blocks for a pseudo random period before resending the string. + * + * The second task blocks on a queue waiting for a character to be received. + * Characters received by the serial port interrupt routine are posted onto the + * queue - unblocking the task making it ready to execute. If this is then the + * highest priority task ready to run it will run immediately - with a context + * switch occurring at the end of the interrupt service routine. The task + * receiving characters is spawned with a higher priority than the task + * transmitting the characters. + * + * With the loop back connector in place, one task will transmit a string and the + * other will immediately receive it. The receiving task knows the string it + * expects to receive so can detect an error. + * + * This also creates a third task. This is used to test semaphore usage from an + * ISR and does nothing interesting. + * + * \page ComTestC comtest.c + * \ingroup DemoFiles + *
+ */ + +/* +Changes from V1.00: + + + The priority of the Rx task has been lowered. Received characters are + now processed (read from the queue) at the idle priority, allowing low + priority tasks to run evenly at times of a high communications overhead. + +Changes from V1.01: + + + The Tx task now waits a pseudo random time between transissions. + Previously a fixed period was used but this was not such a good test as + interrupts fired at regular intervals. + +Changes From V1.2.0: + + + Use vSerialPutString() instead of single character puts. + + Only stop the check variable incrementing after two consecutive errors. + +Changed from V1.2.5 + + + Made the Rx task 2 priorities higher than the Tx task. Previously it was + only 1. This is done to tie in better with the other demo application + tasks. + +Changes from V2.0.0 + + + Delay periods are now specified using variables and constants of + portTickType rather than unsigned long. + + Slight modification to task priorities. + +*/ + + +/* Scheduler include files. */ +#include +#include +#include "FreeRTOS.h" +#include "task.h" + +/* Demo program include files. */ +#include "serial.h" +#include "comtest.h" +#include "print.h" + +/* The Tx task will transmit the sequence of characters at a pseudo random +interval. This is the maximum and minimum block time between sends. */ +#define comTX_MAX_BLOCK_TIME ( ( portTickType ) 0x15e ) +#define comTX_MIN_BLOCK_TIME ( ( portTickType ) 0xc8 ) + +#define comMAX_CONSECUTIVE_ERRORS ( 2 ) + +#define comSTACK_SIZE ( ( unsigned short ) 256 ) + +#define comRX_RELATIVE_PRIORITY ( 1 ) + +/* Handle to the com port used by both tasks. */ +static xComPortHandle xPort; + +/* The transmit function as described at the top of the file. */ +static void vComTxTask( void *pvParameters ); + +/* The receive function as described at the top of the file. */ +static void vComRxTask( void *pvParameters ); + +/* The semaphore test function as described at the top of the file. */ +static void vSemTestTask( void * pvParameters ); + +/* The string that is repeatedly transmitted. */ +const char * const pcMessageToExchange = "Send this message over and over again to check communications interrupts. " + "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n"; + +/* Variables that are incremented on each cycle of each task. These are used to +check that both tasks are still executing. */ +volatile short sTxCount = 0, sRxCount = 0, sSemCount = 0; + +/* The handle to the semaphore test task. */ +static xTaskHandle xSemTestTaskHandle = NULL; + +/*-----------------------------------------------------------*/ + +void vStartComTestTasks( unsigned portBASE_TYPE uxPriority, eCOMPort ePort, eBaud eBaudRate ) +{ +const unsigned portBASE_TYPE uxBufferLength = 255; + + /* Initialise the com port then spawn both tasks. */ + xPort = xSerialPortInit( ePort, eBaudRate, serNO_PARITY, serBITS_8, serSTOP_1, uxBufferLength ); + xTaskCreate( vComTxTask, "COMTx", comSTACK_SIZE, NULL, uxPriority, NULL ); + xTaskCreate( vComRxTask, "COMRx", comSTACK_SIZE, NULL, uxPriority + comRX_RELATIVE_PRIORITY, NULL ); + xTaskCreate( vSemTestTask, "ISRSem", comSTACK_SIZE, NULL, tskIDLE_PRIORITY, &xSemTestTaskHandle ); +} +/*-----------------------------------------------------------*/ + +static void vComTxTask( void *pvParameters ) +{ +const char * const pcTaskStartMsg = "COM Tx task started.\r\n"; +portTickType xTimeToWait; + + /* Stop warnings. */ + ( void ) pvParameters; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + for( ;; ) + { + /* Send the string to the serial port. */ + vSerialPutString( xPort, pcMessageToExchange, strlen( pcMessageToExchange ) ); + + /* We have posted all the characters in the string - increment the variable + used to check that this task is still running, then wait before re-sending + the string. */ + sTxCount++; + + xTimeToWait = xTaskGetTickCount(); + + /* Make sure we don't wait too long... */ + xTimeToWait %= comTX_MAX_BLOCK_TIME; + + /* ...but we do want to wait. */ + if( xTimeToWait < comTX_MIN_BLOCK_TIME ) + { + xTimeToWait = comTX_MIN_BLOCK_TIME; + } + + vTaskDelay( xTimeToWait ); + } +} /*lint !e715 !e818 pvParameters is required for a task function even if it is not referenced. */ +/*-----------------------------------------------------------*/ + +static void vComRxTask( void *pvParameters ) +{ +const char * const pcTaskStartMsg = "COM Rx task started.\r\n"; +const char * const pcTaskErrorMsg = "COM read error\r\n"; +const char * const pcTaskRestartMsg = "COM resynced\r\n"; +const char * const pcTaskTimeoutMsg = "COM Rx timed out\r\n"; +const portTickType xBlockTime = ( portTickType ) 0xffff / portTICK_RATE_MS; +const char *pcExpectedChar; +portBASE_TYPE xGotChar; +char cRxedChar; +short sResyncRequired, sConsecutiveErrors, sLatchedError; + + /* Stop warnings. */ + ( void ) pvParameters; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + /* The first expected character is the first character in the string. */ + pcExpectedChar = pcMessageToExchange; + sResyncRequired = pdFALSE; + sConsecutiveErrors = 0; + sLatchedError = pdFALSE; + + for( ;; ) + { + /* Receive a message from the com port interrupt routine. If a message is + not yet available the call will block the task. */ + xGotChar = xSerialGetChar( xPort, &cRxedChar, xBlockTime ); + if( xGotChar == pdTRUE ) + { + if( sResyncRequired == pdTRUE ) + { + /* We got out of sequence and are waiting for the start of the next + transmission of the string. */ + if( cRxedChar == '\n' ) + { + /* This is the end of the message so we can start again - with + the first character in the string being the next thing we expect + to receive. */ + pcExpectedChar = pcMessageToExchange; + sResyncRequired = pdFALSE; + + /* Queue a message for printing to say that we are going to try + again. */ + vPrintDisplayMessage( &pcTaskRestartMsg ); + + /* Stop incrementing the check variable, if consecutive errors occur. */ + sConsecutiveErrors++; + if( sConsecutiveErrors >= comMAX_CONSECUTIVE_ERRORS ) + { + sLatchedError = pdTRUE; + } + } + } + else + { + /* We have received a character, but is it the expected character? */ + if( cRxedChar != *pcExpectedChar ) + { + /* This was not the expected character so post a message for + printing to say that an error has occurred. We will then wait + to resynchronise. */ + vPrintDisplayMessage( &pcTaskErrorMsg ); + sResyncRequired = pdTRUE; + } + else + { + /* This was the expected character so next time we will expect + the next character in the string. Wrap back to the beginning + of the string when the null terminator has been reached. */ + pcExpectedChar++; + if( *pcExpectedChar == '\0' ) + { + pcExpectedChar = pcMessageToExchange; + + /* We have got through the entire string without error. */ + sConsecutiveErrors = 0; + } + } + } + + /* Increment the count that is used to check that this task is still + running. This is only done if an error has never occurred. */ + if( sLatchedError == pdFALSE ) + { + sRxCount++; + } + } + else + { + vPrintDisplayMessage( &pcTaskTimeoutMsg ); + } + } +} /*lint !e715 !e818 pvParameters is required for a task function even if it is not referenced. */ +/*-----------------------------------------------------------*/ + +static void vSemTestTask( void * pvParameters ) +{ +const char * const pcTaskStartMsg = "ISR Semaphore test started.\r\n"; +portBASE_TYPE xError = pdFALSE; + + /* Stop warnings. */ + ( void ) pvParameters; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + for( ;; ) + { + if( xSerialWaitForSemaphore( xPort ) ) + { + if( xError == pdFALSE ) + { + sSemCount++; + } + } + else + { + xError = pdTRUE; + } + } +} /*lint !e715 !e830 !e818 pvParameters not used but function prototype must be standard for task function. */ +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreComTestTasksStillRunning( void ) +{ +static short sLastTxCount = 0, sLastRxCount = 0, sLastSemCount = 0; +portBASE_TYPE xReturn; + + /* Not too worried about mutual exclusion on these variables as they are 16 + bits and we are only reading them. We also only care to see if they have + changed or not. */ + + if( ( sTxCount == sLastTxCount ) || ( sRxCount == sLastRxCount ) || ( sSemCount == sLastSemCount ) ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + sLastTxCount = sTxCount; + sLastRxCount = sRxCount; + sLastSemCount = sSemCount; + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vComTestUnsuspendTask( void ) +{ + /* The task that is suspended on the semaphore will be referenced from the + Suspended list as it is blocking indefinitely. This call just checks that + the kernel correctly detects this and does not attempt to unsuspend the + task. */ + xTaskResumeFromISR( xSemTestTaskHandle ); +} diff --git a/third_party/FreeRTOS/Demo/Common/Full/death.c b/third_party/FreeRTOS/Demo/Common/Full/death.c new file mode 100644 index 0000000..2142f7a --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Full/death.c @@ -0,0 +1,241 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/** + * Create a single persistent task which periodically dynamically creates another + * four tasks. The original task is called the creator task, the four tasks it + * creates are called suicidal tasks. + * + * Two of the created suicidal tasks kill one other suicidal task before killing + * themselves - leaving just the original task remaining. + * + * The creator task must be spawned after all of the other demo application tasks + * as it keeps a check on the number of tasks under the scheduler control. The + * number of tasks it expects to see running should never be greater than the + * number of tasks that were in existence when the creator task was spawned, plus + * one set of four suicidal tasks. If this number is exceeded an error is flagged. + * + * \page DeathC death.c + * \ingroup DemoFiles + *
+ */ + +/* +Changes from V2.0.0 + + + Delay periods are now specified using variables and constants of + portTickType rather than unsigned long. +*/ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo program include files. */ +#include "death.h" +#include "print.h" + +#define deathSTACK_SIZE ( ( unsigned short ) 512 ) + +/* The task originally created which is responsible for periodically dynamically +creating another four tasks. */ +static void vCreateTasks( void *pvParameters ); + +/* The task function of the dynamically created tasks. */ +static void vSuicidalTask( void *pvParameters ); + +/* A variable which is incremented every time the dynamic tasks are created. This +is used to check that the task is still running. */ +static volatile short sCreationCount = 0; + +/* Used to store the number of tasks that were originally running so the creator +task can tell if any of the suicidal tasks have failed to die. */ +static volatile unsigned portBASE_TYPE uxTasksRunningAtStart = 0; +static const unsigned portBASE_TYPE uxMaxNumberOfExtraTasksRunning = 5; + +/* Used to store a handle to the tasks that should be killed by a suicidal task, +before it kills itself. */ +xTaskHandle xCreatedTask1, xCreatedTask2; + +/*-----------------------------------------------------------*/ + +void vCreateSuicidalTasks( unsigned portBASE_TYPE uxPriority ) +{ +unsigned portBASE_TYPE *puxPriority; + + /* Create the Creator tasks - passing in as a parameter the priority at which + the suicidal tasks should be created. */ + puxPriority = ( unsigned portBASE_TYPE * ) pvPortMalloc( sizeof( unsigned portBASE_TYPE ) ); + *puxPriority = uxPriority; + + xTaskCreate( vCreateTasks, "CREATOR", deathSTACK_SIZE, ( void * ) puxPriority, uxPriority, NULL ); + + /* Record the number of tasks that are running now so we know if any of the + suicidal tasks have failed to be killed. */ + uxTasksRunningAtStart = uxTaskGetNumberOfTasks(); +} +/*-----------------------------------------------------------*/ + +static void vSuicidalTask( void *pvParameters ) +{ +portDOUBLE d1, d2; +xTaskHandle xTaskToKill; +const portTickType xDelay = ( portTickType ) 500 / portTICK_RATE_MS; + + if( pvParameters != NULL ) + { + /* This task is periodically created four times. Tow created tasks are + passed a handle to the other task so it can kill it before killing itself. + The other task is passed in null. */ + xTaskToKill = *( xTaskHandle* )pvParameters; + } + else + { + xTaskToKill = NULL; + } + + for( ;; ) + { + /* Do something random just to use some stack and registers. */ + d1 = 2.4; + d2 = 89.2; + d2 *= d1; + vTaskDelay( xDelay ); + + if( xTaskToKill != NULL ) + { + /* Make sure the other task has a go before we delete it. */ + vTaskDelay( ( portTickType ) 0 ); + /* Kill the other task that was created by vCreateTasks(). */ + vTaskDelete( xTaskToKill ); + /* Kill ourselves. */ + vTaskDelete( NULL ); + } + } +}/*lint !e818 !e550 Function prototype must be as per standard for task functions. */ +/*-----------------------------------------------------------*/ + +static void vCreateTasks( void *pvParameters ) +{ +const portTickType xDelay = ( portTickType ) 1000 / portTICK_RATE_MS; +unsigned portBASE_TYPE uxPriority; +const char * const pcTaskStartMsg = "Create task started.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + uxPriority = *( unsigned portBASE_TYPE * ) pvParameters; + vPortFree( pvParameters ); + + for( ;; ) + { + /* Just loop round, delaying then creating the four suicidal tasks. */ + vTaskDelay( xDelay ); + + xTaskCreate( vSuicidalTask, "SUICIDE1", deathSTACK_SIZE, NULL, uxPriority, &xCreatedTask1 ); + xTaskCreate( vSuicidalTask, "SUICIDE2", deathSTACK_SIZE, &xCreatedTask1, uxPriority, NULL ); + + xTaskCreate( vSuicidalTask, "SUICIDE1", deathSTACK_SIZE, NULL, uxPriority, &xCreatedTask2 ); + xTaskCreate( vSuicidalTask, "SUICIDE2", deathSTACK_SIZE, &xCreatedTask2, uxPriority, NULL ); + + ++sCreationCount; + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that the creator task is still running and that there +are not any more than four extra tasks. */ +portBASE_TYPE xIsCreateTaskStillRunning( void ) +{ +static short sLastCreationCount = 0; +short sReturn = pdTRUE; +unsigned portBASE_TYPE uxTasksRunningNow; + + if( sLastCreationCount == sCreationCount ) + { + sReturn = pdFALSE; + } + + uxTasksRunningNow = uxTaskGetNumberOfTasks(); + + if( uxTasksRunningNow < uxTasksRunningAtStart ) + { + sReturn = pdFALSE; + } + else if( ( uxTasksRunningNow - uxTasksRunningAtStart ) > uxMaxNumberOfExtraTasksRunning ) + { + sReturn = pdFALSE; + } + else + { + /* Everything is okay. */ + } + + return sReturn; +} + + diff --git a/third_party/FreeRTOS/Demo/Common/Full/dynamic.c b/third_party/FreeRTOS/Demo/Common/Full/dynamic.c new file mode 100644 index 0000000..b9c4b18 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Full/dynamic.c @@ -0,0 +1,616 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/** + * The first test creates three tasks - two counter tasks (one continuous count + * and one limited count) and one controller. A "count" variable is shared + * between all three tasks. The two counter tasks should never be in a "ready" + * state at the same time. The controller task runs at the same priority as + * the continuous count task, and at a lower priority than the limited count + * task. + * + * One counter task loops indefinitely, incrementing the shared count variable + * on each iteration. To ensure it has exclusive access to the variable it + * raises it's priority above that of the controller task before each + * increment, lowering it again to it's original priority before starting the + * next iteration. + * + * The other counter task increments the shared count variable on each + * iteration of it's loop until the count has reached a limit of 0xff - at + * which point it suspends itself. It will not start a new loop until the + * controller task has made it "ready" again by calling vTaskResume (). + * This second counter task operates at a higher priority than controller + * task so does not need to worry about mutual exclusion of the counter + * variable. + * + * The controller task is in two sections. The first section controls and + * monitors the continuous count task. When this section is operational the + * limited count task is suspended. Likewise, the second section controls + * and monitors the limited count task. When this section is operational the + * continuous count task is suspended. + * + * In the first section the controller task first takes a copy of the shared + * count variable. To ensure mutual exclusion on the count variable it + * suspends the continuous count task, resuming it again when the copy has been + * taken. The controller task then sleeps for a fixed period - during which + * the continuous count task will execute and increment the shared variable. + * When the controller task wakes it checks that the continuous count task + * has executed by comparing the copy of the shared variable with its current + * value. This time, to ensure mutual exclusion, the scheduler itself is + * suspended with a call to vTaskSuspendAll (). This is for demonstration + * purposes only and is not a recommended technique due to its inefficiency. + * + * After a fixed number of iterations the controller task suspends the + * continuous count task, and moves on to its second section. + * + * At the start of the second section the shared variable is cleared to zero. + * The limited count task is then woken from it's suspension by a call to + * vTaskResume (). As this counter task operates at a higher priority than + * the controller task the controller task should not run again until the + * shared variable has been counted up to the limited value causing the counter + * task to suspend itself. The next line after vTaskResume () is therefore + * a check on the shared variable to ensure everything is as expected. + * + * + * The second test consists of a couple of very simple tasks that post onto a + * queue while the scheduler is suspended. This test was added to test parts + * of the scheduler not exercised by the first test. + * + * + * The final set of two tasks implements a third test. This simply raises the + * priority of a task while the scheduler is suspended. Again this test was + * added to exercise parts of the code not covered by the first test. + * + * \page Priorities dynamic.c + * \ingroup DemoFiles + *
+ */ + +/* +Changes from V2.0.0 + + + Delay periods are now specified using variables and constants of + portTickType rather than unsigned long. + + Added a second, simple test that uses the functions + vQueueReceiveWhenSuspendedTask() and vQueueSendWhenSuspendedTask(). + +Changes from V3.1.1 + + + Added a third simple test that uses the vTaskPrioritySet() function + while the scheduler is suspended. + + Modified the controller task slightly to test the calling of + vTaskResumeAll() while the scheduler is suspended. +*/ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +/* Demo app include files. */ +#include "dynamic.h" +#include "print.h" + +/* Function that implements the "limited count" task as described above. */ +static void vLimitedIncrementTask( void * pvParameters ); + +/* Function that implements the "continuous count" task as described above. */ +static void vContinuousIncrementTask( void * pvParameters ); + +/* Function that implements the controller task as described above. */ +static void vCounterControlTask( void * pvParameters ); + +/* The simple test functions that check sending and receiving while the +scheduler is suspended. */ +static void vQueueReceiveWhenSuspendedTask( void *pvParameters ); +static void vQueueSendWhenSuspendedTask( void *pvParameters ); + +/* The simple test functions that check raising and lowering of task priorities +while the scheduler is suspended. */ +static void prvChangePriorityWhenSuspendedTask( void *pvParameters ); +static void prvChangePriorityHelperTask( void *pvParameters ); + + +/* Demo task specific constants. */ +#define priSTACK_SIZE ( ( unsigned short ) configMINIMAL_STACK_SIZE ) +#define priSLEEP_TIME ( ( portTickType ) 50 ) +#define priLOOPS ( 5 ) +#define priMAX_COUNT ( ( unsigned long ) 0xff ) +#define priNO_BLOCK ( ( portTickType ) 0 ) +#define priSUSPENDED_QUEUE_LENGTH ( 1 ) + +/*-----------------------------------------------------------*/ + +/* Handles to the two counter tasks. These could be passed in as parameters +to the controller task to prevent them having to be file scope. */ +static xTaskHandle xContinuousIncrementHandle, xLimitedIncrementHandle, xChangePriorityWhenSuspendedHandle; + +/* The shared counter variable. This is passed in as a parameter to the two +counter variables for demonstration purposes. */ +static unsigned long ulCounter; + +/* Variable used in a similar way by the test that checks the raising and +lowering of task priorities while the scheduler is suspended. */ +static unsigned long ulPrioritySetCounter; + +/* Variables used to check that the tasks are still operating without error. +Each complete iteration of the controller task increments this variable +provided no errors have been found. The variable maintaining the same value +is therefore indication of an error. */ +static unsigned short usCheckVariable = ( unsigned short ) 0; +static portBASE_TYPE xSuspendedQueueSendError = pdFALSE; +static portBASE_TYPE xSuspendedQueueReceiveError = pdFALSE; +static portBASE_TYPE xPriorityRaiseWhenSuspendedError = pdFALSE; + +/* Queue used by the second test. */ +xQueueHandle xSuspendedTestQueue; + +/*-----------------------------------------------------------*/ +/* + * Start the seven tasks as described at the top of the file. + * Note that the limited count task is given a higher priority. + */ +void vStartDynamicPriorityTasks( void ) +{ + xSuspendedTestQueue = xQueueCreate( priSUSPENDED_QUEUE_LENGTH, sizeof( unsigned long ) ); + xTaskCreate( vContinuousIncrementTask, "CONT_INC", priSTACK_SIZE, ( void * ) &ulCounter, tskIDLE_PRIORITY, &xContinuousIncrementHandle ); + xTaskCreate( vLimitedIncrementTask, "LIM_INC", priSTACK_SIZE, ( void * ) &ulCounter, tskIDLE_PRIORITY + 1, &xLimitedIncrementHandle ); + xTaskCreate( vCounterControlTask, "C_CTRL", priSTACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + xTaskCreate( vQueueSendWhenSuspendedTask, "SUSP_SEND", priSTACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + xTaskCreate( vQueueReceiveWhenSuspendedTask, "SUSP_RECV", priSTACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + xTaskCreate( prvChangePriorityWhenSuspendedTask, "1st_P_CHANGE", priSTACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL ); + xTaskCreate( prvChangePriorityHelperTask, "2nd_P_CHANGE", priSTACK_SIZE, NULL, tskIDLE_PRIORITY, &xChangePriorityWhenSuspendedHandle ); +} +/*-----------------------------------------------------------*/ + +/* + * Just loops around incrementing the shared variable until the limit has been + * reached. Once the limit has been reached it suspends itself. + */ +static void vLimitedIncrementTask( void * pvParameters ) +{ +unsigned long *pulCounter; + + /* Take a pointer to the shared variable from the parameters passed into + the task. */ + pulCounter = ( unsigned long * ) pvParameters; + + /* This will run before the control task, so the first thing it does is + suspend - the control task will resume it when ready. */ + vTaskSuspend( NULL ); + + for( ;; ) + { + /* Just count up to a value then suspend. */ + ( *pulCounter )++; + + if( *pulCounter >= priMAX_COUNT ) + { + vTaskSuspend( NULL ); + } + } +} +/*-----------------------------------------------------------*/ + +/* + * Just keep counting the shared variable up. The control task will suspend + * this task when it wants. + */ +static void vContinuousIncrementTask( void * pvParameters ) +{ +unsigned long *pulCounter; +unsigned portBASE_TYPE uxOurPriority; + + /* Take a pointer to the shared variable from the parameters passed into + the task. */ + pulCounter = ( unsigned long * ) pvParameters; + + /* Query our priority so we can raise it when exclusive access to the + shared variable is required. */ + uxOurPriority = uxTaskPriorityGet( NULL ); + + for( ;; ) + { + /* Raise our priority above the controller task to ensure a context + switch does not occur while we are accessing this variable. */ + vTaskPrioritySet( NULL, uxOurPriority + 1 ); + ( *pulCounter )++; + vTaskPrioritySet( NULL, uxOurPriority ); + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + } +} +/*-----------------------------------------------------------*/ + +/* + * Controller task as described above. + */ +static void vCounterControlTask( void * pvParameters ) +{ +unsigned long ulLastCounter; +short sLoops; +short sError = pdFALSE; +const char * const pcTaskStartMsg = "Priority manipulation tasks started.\r\n"; +const char * const pcTaskFailMsg = "Priority manipulation Task Failed\r\n"; + + /* Just to stop warning messages. */ + ( void ) pvParameters; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + for( ;; ) + { + /* Start with the counter at zero. */ + ulCounter = ( unsigned long ) 0; + + /* First section : */ + + /* Check the continuous count task is running. */ + for( sLoops = 0; sLoops < priLOOPS; sLoops++ ) + { + /* Suspend the continuous count task so we can take a mirror of the + shared variable without risk of corruption. */ + vTaskSuspend( xContinuousIncrementHandle ); + ulLastCounter = ulCounter; + vTaskResume( xContinuousIncrementHandle ); + + /* Now delay to ensure the other task has processor time. */ + vTaskDelay( priSLEEP_TIME ); + + /* Check the shared variable again. This time to ensure mutual + exclusion the whole scheduler will be locked. This is just for + demo purposes! */ + vTaskSuspendAll(); + { + if( ulLastCounter == ulCounter ) + { + /* The shared variable has not changed. There is a problem + with the continuous count task so flag an error. */ + sError = pdTRUE; + xTaskResumeAll(); + vPrintDisplayMessage( &pcTaskFailMsg ); + vTaskSuspendAll(); + } + } + xTaskResumeAll(); + } + + + /* Second section: */ + + /* Suspend the continuous counter task so it stops accessing the shared variable. */ + vTaskSuspend( xContinuousIncrementHandle ); + + /* Reset the variable. */ + ulCounter = ( unsigned long ) 0; + + /* Resume the limited count task which has a higher priority than us. + We should therefore not return from this call until the limited count + task has suspended itself with a known value in the counter variable. + The scheduler suspension is not necessary but is included for test + purposes. */ + vTaskSuspendAll(); + vTaskResume( xLimitedIncrementHandle ); + xTaskResumeAll(); + + /* Does the counter variable have the expected value? */ + if( ulCounter != priMAX_COUNT ) + { + sError = pdTRUE; + vPrintDisplayMessage( &pcTaskFailMsg ); + } + + if( sError == pdFALSE ) + { + /* If no errors have occurred then increment the check variable. */ + portENTER_CRITICAL(); + usCheckVariable++; + portEXIT_CRITICAL(); + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* Resume the continuous count task and do it all again. */ + vTaskResume( xContinuousIncrementHandle ); + } +} +/*-----------------------------------------------------------*/ + +static void vQueueSendWhenSuspendedTask( void *pvParameters ) +{ +static unsigned long ulValueToSend = ( unsigned long ) 0; +const char * const pcTaskStartMsg = "Queue send while suspended task started.\r\n"; +const char * const pcTaskFailMsg = "Queue send while suspended failed.\r\n"; + + /* Just to stop warning messages. */ + ( void ) pvParameters; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + for( ;; ) + { + vTaskSuspendAll(); + { + /* We must not block while the scheduler is suspended! */ + if( xQueueSend( xSuspendedTestQueue, ( void * ) &ulValueToSend, priNO_BLOCK ) != pdTRUE ) + { + if( xSuspendedQueueSendError == pdFALSE ) + { + xTaskResumeAll(); + vPrintDisplayMessage( &pcTaskFailMsg ); + vTaskSuspendAll(); + } + + xSuspendedQueueSendError = pdTRUE; + } + } + xTaskResumeAll(); + + vTaskDelay( priSLEEP_TIME ); + + ++ulValueToSend; + } +} +/*-----------------------------------------------------------*/ + +static void vQueueReceiveWhenSuspendedTask( void *pvParameters ) +{ +static unsigned long ulExpectedValue = ( unsigned long ) 0, ulReceivedValue; +const char * const pcTaskStartMsg = "Queue receive while suspended task started.\r\n"; +const char * const pcTaskFailMsg = "Queue receive while suspended failed.\r\n"; +portBASE_TYPE xGotValue; + + /* Just to stop warning messages. */ + ( void ) pvParameters; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + for( ;; ) + { + do + { + /* Suspending the scheduler here is fairly pointless and + undesirable for a normal application. It is done here purely + to test the scheduler. The inner xTaskResumeAll() should + never return pdTRUE as the scheduler is still locked by the + outer call. */ + vTaskSuspendAll(); + { + vTaskSuspendAll(); + { + xGotValue = xQueueReceive( xSuspendedTestQueue, ( void * ) &ulReceivedValue, priNO_BLOCK ); + } + if( xTaskResumeAll() ) + { + xSuspendedQueueReceiveError = pdTRUE; + } + } + xTaskResumeAll(); + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + } while( xGotValue == pdFALSE ); + + if( ulReceivedValue != ulExpectedValue ) + { + if( xSuspendedQueueReceiveError == pdFALSE ) + { + vPrintDisplayMessage( &pcTaskFailMsg ); + } + xSuspendedQueueReceiveError = pdTRUE; + } + + ++ulExpectedValue; + } +} +/*-----------------------------------------------------------*/ + +static void prvChangePriorityWhenSuspendedTask( void *pvParameters ) +{ +const char * const pcTaskStartMsg = "Priority change when suspended task started.\r\n"; +const char * const pcTaskFailMsg = "Priority change when suspended task failed.\r\n"; + + /* Just to stop warning messages. */ + ( void ) pvParameters; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + for( ;; ) + { + /* Start with the counter at 0 so we know what the counter should be + when we check it next. */ + ulPrioritySetCounter = ( unsigned long ) 0; + + /* Resume the helper task. At this time it has a priority lower than + ours so no context switch should occur. */ + vTaskResume( xChangePriorityWhenSuspendedHandle ); + + /* Check to ensure the task just resumed has not executed. */ + portENTER_CRITICAL(); + { + if( ulPrioritySetCounter != ( unsigned long ) 0 ) + { + xPriorityRaiseWhenSuspendedError = pdTRUE; + vPrintDisplayMessage( &pcTaskFailMsg ); + } + } + portEXIT_CRITICAL(); + + /* Now try raising the priority while the scheduler is suspended. */ + vTaskSuspendAll(); + { + vTaskPrioritySet( xChangePriorityWhenSuspendedHandle, ( configMAX_PRIORITIES - 1 ) ); + + /* Again, even though the helper task has a priority greater than + ours, it should not have executed yet because the scheduler is + suspended. */ + portENTER_CRITICAL(); + { + if( ulPrioritySetCounter != ( unsigned long ) 0 ) + { + xPriorityRaiseWhenSuspendedError = pdTRUE; + vPrintDisplayMessage( &pcTaskFailMsg ); + } + } + portEXIT_CRITICAL(); + } + xTaskResumeAll(); + + /* Now the scheduler has been resumed the helper task should + immediately preempt us and execute. When it executes it will increment + the ulPrioritySetCounter exactly once before suspending itself. + + We should now always find the counter set to 1. */ + portENTER_CRITICAL(); + { + if( ulPrioritySetCounter != ( unsigned long ) 1 ) + { + xPriorityRaiseWhenSuspendedError = pdTRUE; + vPrintDisplayMessage( &pcTaskFailMsg ); + } + } + portEXIT_CRITICAL(); + + /* Delay until we try this again. */ + vTaskDelay( priSLEEP_TIME * 2 ); + + /* Set the priority of the helper task back ready for the next + execution of this task. */ + vTaskSuspendAll(); + vTaskPrioritySet( xChangePriorityWhenSuspendedHandle, tskIDLE_PRIORITY ); + xTaskResumeAll(); + } +} +/*-----------------------------------------------------------*/ + +static void prvChangePriorityHelperTask( void *pvParameters ) +{ + /* Just to stop warning messages. */ + ( void ) pvParameters; + + for( ;; ) + { + /* This is the helper task for prvChangePriorityWhenSuspendedTask(). + It has it's priority raised and lowered. When it runs it simply + increments the counter then suspends itself again. This allows + prvChangePriorityWhenSuspendedTask() to know how many times it has + executed. */ + ulPrioritySetCounter++; + vTaskSuspend( NULL ); + } +} +/*-----------------------------------------------------------*/ + +/* Called to check that all the created tasks are still running without error. */ +portBASE_TYPE xAreDynamicPriorityTasksStillRunning( void ) +{ +/* Keep a history of the check variables so we know if it has been incremented +since the last call. */ +static unsigned short usLastTaskCheck = ( unsigned short ) 0; +portBASE_TYPE xReturn = pdTRUE; + + /* Check the tasks are still running by ensuring the check variable + is still incrementing. */ + + if( usCheckVariable == usLastTaskCheck ) + { + /* The check has not incremented so an error exists. */ + xReturn = pdFALSE; + } + + if( xSuspendedQueueSendError == pdTRUE ) + { + xReturn = pdFALSE; + } + + if( xSuspendedQueueReceiveError == pdTRUE ) + { + xReturn = pdFALSE; + } + + if( xPriorityRaiseWhenSuspendedError == pdTRUE ) + { + xReturn = pdFALSE; + } + + usLastTaskCheck = usCheckVariable; + return xReturn; +} + + + + diff --git a/third_party/FreeRTOS/Demo/Common/Full/events.c b/third_party/FreeRTOS/Demo/Common/Full/events.c new file mode 100644 index 0000000..8ff96a9 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Full/events.c @@ -0,0 +1,406 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/** + * This file exercises the event mechanism whereby more than one task is + * blocked waiting for the same event. + * + * The demo creates five tasks - four 'event' tasks, and a controlling task. + * The event tasks have various different priorities and all block on reading + * the same queue. The controlling task writes data to the queue, then checks + * to see which of the event tasks read the data from the queue. The + * controlling task has the lowest priority of all the tasks so is guaranteed + * to always get preempted immediately upon writing to the queue. + * + * By selectively suspending and resuming the event tasks the controlling task + * can check that the highest priority task that is blocked on the queue is the + * task that reads the posted data from the queue. + * + * Two of the event tasks share the same priority. When neither of these tasks + * are suspended they should alternate - one reading one message from the queue, + * the other the next message, etc. + */ + +/* Standard includes. */ +#include +#include +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +/* Demo program include files. */ +#include "mevents.h" +#include "print.h" + +/* Demo specific constants. */ +#define evtSTACK_SIZE ( ( unsigned portBASE_TYPE ) configMINIMAL_STACK_SIZE ) +#define evtNUM_TASKS ( 4 ) +#define evtQUEUE_LENGTH ( ( unsigned portBASE_TYPE ) 3 ) +#define evtNO_DELAY 0 + +/* Just indexes used to uniquely identify the tasks. Note that two tasks are +'highest' priority. */ +#define evtHIGHEST_PRIORITY_INDEX_2 3 +#define evtHIGHEST_PRIORITY_INDEX_1 2 +#define evtMEDIUM_PRIORITY_INDEX 1 +#define evtLOWEST_PRIORITY_INDEX 0 + +/* Each event task increments one of these counters each time it reads data +from the queue. */ +static volatile portBASE_TYPE xTaskCounters[ evtNUM_TASKS ] = { 0, 0, 0, 0 }; + +/* Each time the controlling task posts onto the queue it increments the +expected count of the task that it expected to read the data from the queue +(i.e. the task with the highest priority that should be blocked on the queue). + +xExpectedTaskCounters are incremented from the controlling task, and +xTaskCounters are incremented from the individual event tasks - therefore +comparing xTaskCounters to xExpectedTaskCounters shows whether or not the +correct task was unblocked by the post. */ +static portBASE_TYPE xExpectedTaskCounters[ evtNUM_TASKS ] = { 0, 0, 0, 0 }; + +/* Handles to the four event tasks. These are required to suspend and resume +the tasks. */ +static xTaskHandle xCreatedTasks[ evtNUM_TASKS ]; + +/* The single queue onto which the controlling task posts, and the four event +tasks block. */ +static xQueueHandle xQueue; + +/* Flag used to indicate whether or not an error has occurred at any time. +An error is either the queue being full when not expected, or an unexpected +task reading data from the queue. */ +static portBASE_TYPE xHealthStatus = pdPASS; + +/*-----------------------------------------------------------*/ + +/* Function that implements the event task. This is created four times. */ +static void prvMultiEventTask( void *pvParameters ); + +/* Function that implements the controlling task. */ +static void prvEventControllerTask( void *pvParameters ); + +/* This is a utility function that posts data to the queue, then compares +xExpectedTaskCounters with xTaskCounters to ensure everything worked as +expected. + +The event tasks all have higher priorities the controlling task. Therefore +the controlling task will always get preempted between writhing to the queue +and checking the task counters. + +@param xExpectedTask The index to the task that the controlling task thinks + should be the highest priority task waiting for data, and + therefore the task that will unblock. + +@param xIncrement The number of items that should be written to the queue. +*/ +static void prvCheckTaskCounters( portBASE_TYPE xExpectedTask, portBASE_TYPE xIncrement ); + +/* This is just incremented each cycle of the controlling tasks function so +the main application can ensure the test is still running. */ +static portBASE_TYPE xCheckVariable = 0; + +/*-----------------------------------------------------------*/ + +void vStartMultiEventTasks( void ) +{ + /* Create the queue to be used for all the communications. */ + xQueue = xQueueCreate( evtQUEUE_LENGTH, ( unsigned portBASE_TYPE ) sizeof( unsigned portBASE_TYPE ) ); + + /* Start the controlling task. This has the idle priority to ensure it is + always preempted by the event tasks. */ + xTaskCreate( prvEventControllerTask, "EvntCTRL", evtSTACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + + /* Start the four event tasks. Note that two have priority 3, one + priority 2 and the other priority 1. */ + xTaskCreate( prvMultiEventTask, "Event0", evtSTACK_SIZE, ( void * ) &( xTaskCounters[ 0 ] ), 1, &( xCreatedTasks[ evtLOWEST_PRIORITY_INDEX ] ) ); + xTaskCreate( prvMultiEventTask, "Event1", evtSTACK_SIZE, ( void * ) &( xTaskCounters[ 1 ] ), 2, &( xCreatedTasks[ evtMEDIUM_PRIORITY_INDEX ] ) ); + xTaskCreate( prvMultiEventTask, "Event2", evtSTACK_SIZE, ( void * ) &( xTaskCounters[ 2 ] ), 3, &( xCreatedTasks[ evtHIGHEST_PRIORITY_INDEX_1 ] ) ); + xTaskCreate( prvMultiEventTask, "Event3", evtSTACK_SIZE, ( void * ) &( xTaskCounters[ 3 ] ), 3, &( xCreatedTasks[ evtHIGHEST_PRIORITY_INDEX_2 ] ) ); +} +/*-----------------------------------------------------------*/ + +static void prvMultiEventTask( void *pvParameters ) +{ +portBASE_TYPE *pxCounter; +unsigned portBASE_TYPE uxDummy; +const char * const pcTaskStartMsg = "Multi event task started.\r\n"; + + /* The variable this task will increment is passed in as a parameter. */ + pxCounter = ( portBASE_TYPE * ) pvParameters; + + vPrintDisplayMessage( &pcTaskStartMsg ); + + for( ;; ) + { + /* Block on the queue. */ + if( xQueueReceive( xQueue, &uxDummy, portMAX_DELAY ) ) + { + /* We unblocked by reading the queue - so simply increment + the counter specific to this task instance. */ + ( *pxCounter )++; + } + else + { + xHealthStatus = pdFAIL; + } + } +} +/*-----------------------------------------------------------*/ + +static void prvEventControllerTask( void *pvParameters ) +{ +const char * const pcTaskStartMsg = "Multi event controller task started.\r\n"; +portBASE_TYPE xDummy = 0; + + /* Just to stop warnings. */ + ( void ) pvParameters; + + vPrintDisplayMessage( &pcTaskStartMsg ); + + for( ;; ) + { + /* All tasks are blocked on the queue. When a message is posted one of + the two tasks that share the highest priority should unblock to read + the queue. The next message written should unblock the other task with + the same high priority, and so on in order. No other task should + unblock to read data as they have lower priorities. */ + + prvCheckTaskCounters( evtHIGHEST_PRIORITY_INDEX_1, 1 ); + prvCheckTaskCounters( evtHIGHEST_PRIORITY_INDEX_2, 1 ); + prvCheckTaskCounters( evtHIGHEST_PRIORITY_INDEX_1, 1 ); + prvCheckTaskCounters( evtHIGHEST_PRIORITY_INDEX_2, 1 ); + prvCheckTaskCounters( evtHIGHEST_PRIORITY_INDEX_1, 1 ); + + /* For the rest of these tests we don't need the second 'highest' + priority task - so it is suspended. */ + vTaskSuspend( xCreatedTasks[ evtHIGHEST_PRIORITY_INDEX_2 ] ); + + + + /* Now suspend the other highest priority task. The medium priority + task will then be the task with the highest priority that remains + blocked on the queue. */ + vTaskSuspend( xCreatedTasks[ evtHIGHEST_PRIORITY_INDEX_1 ] ); + + /* This time, when we post onto the queue we will expect the medium + priority task to unblock and preempt us. */ + prvCheckTaskCounters( evtMEDIUM_PRIORITY_INDEX, 1 ); + + /* Now try resuming the highest priority task while the scheduler is + suspended. The task should start executing as soon as the scheduler + is resumed - therefore when we post to the queue again, the highest + priority task should again preempt us. */ + vTaskSuspendAll(); + vTaskResume( xCreatedTasks[ evtHIGHEST_PRIORITY_INDEX_1 ] ); + xTaskResumeAll(); + prvCheckTaskCounters( evtHIGHEST_PRIORITY_INDEX_1, 1 ); + + /* Now we are going to suspend the high and medium priority tasks. The + low priority task should then preempt us. Again the task suspension is + done with the whole scheduler suspended just for test purposes. */ + vTaskSuspendAll(); + vTaskSuspend( xCreatedTasks[ evtHIGHEST_PRIORITY_INDEX_1 ] ); + vTaskSuspend( xCreatedTasks[ evtMEDIUM_PRIORITY_INDEX ] ); + xTaskResumeAll(); + prvCheckTaskCounters( evtLOWEST_PRIORITY_INDEX, 1 ); + + /* Do the same basic test another few times - selectively suspending + and resuming tasks and each time calling prvCheckTaskCounters() passing + to the function the number of the task we expected to be unblocked by + the post. */ + + vTaskResume( xCreatedTasks[ evtHIGHEST_PRIORITY_INDEX_1 ] ); + prvCheckTaskCounters( evtHIGHEST_PRIORITY_INDEX_1, 1 ); + + vTaskSuspendAll(); /* Just for test. */ + vTaskSuspendAll(); /* Just for test. */ + vTaskSuspendAll(); /* Just for even more test. */ + vTaskSuspend( xCreatedTasks[ evtHIGHEST_PRIORITY_INDEX_1 ] ); + xTaskResumeAll(); + xTaskResumeAll(); + xTaskResumeAll(); + prvCheckTaskCounters( evtLOWEST_PRIORITY_INDEX, 1 ); + + vTaskResume( xCreatedTasks[ evtMEDIUM_PRIORITY_INDEX ] ); + prvCheckTaskCounters( evtMEDIUM_PRIORITY_INDEX, 1 ); + + vTaskResume( xCreatedTasks[ evtHIGHEST_PRIORITY_INDEX_1 ] ); + prvCheckTaskCounters( evtHIGHEST_PRIORITY_INDEX_1, 1 ); + + /* Now a slight change, first suspend all tasks. */ + vTaskSuspend( xCreatedTasks[ evtHIGHEST_PRIORITY_INDEX_1 ] ); + vTaskSuspend( xCreatedTasks[ evtMEDIUM_PRIORITY_INDEX ] ); + vTaskSuspend( xCreatedTasks[ evtLOWEST_PRIORITY_INDEX ] ); + + /* Now when we resume the low priority task and write to the queue 3 + times. We expect the low priority task to service the queue three + times. */ + vTaskResume( xCreatedTasks[ evtLOWEST_PRIORITY_INDEX ] ); + prvCheckTaskCounters( evtLOWEST_PRIORITY_INDEX, evtQUEUE_LENGTH ); + + /* Again suspend all tasks (only the low priority task is not suspended + already). */ + vTaskSuspend( xCreatedTasks[ evtLOWEST_PRIORITY_INDEX ] ); + + /* This time we are going to suspend the scheduler, resume the low + priority task, then resume the high priority task. In this state we + will write to the queue three times. When the scheduler is resumed + we expect the high priority task to service all three messages. */ + vTaskSuspendAll(); + { + vTaskResume( xCreatedTasks[ evtLOWEST_PRIORITY_INDEX ] ); + vTaskResume( xCreatedTasks[ evtHIGHEST_PRIORITY_INDEX_1 ] ); + + for( xDummy = 0; xDummy < evtQUEUE_LENGTH; xDummy++ ) + { + if( xQueueSend( xQueue, &xDummy, evtNO_DELAY ) != pdTRUE ) + { + xHealthStatus = pdFAIL; + } + } + + /* The queue should not have been serviced yet!. The scheduler + is still suspended. */ + if( memcmp( ( void * ) xExpectedTaskCounters, ( void * ) xTaskCounters, sizeof( xExpectedTaskCounters ) ) ) + { + xHealthStatus = pdFAIL; + } + } + xTaskResumeAll(); + + /* We should have been preempted by resuming the scheduler - so by the + time we are running again we expect the high priority task to have + removed three items from the queue. */ + xExpectedTaskCounters[ evtHIGHEST_PRIORITY_INDEX_1 ] += evtQUEUE_LENGTH; + if( memcmp( ( void * ) xExpectedTaskCounters, ( void * ) xTaskCounters, sizeof( xExpectedTaskCounters ) ) ) + { + xHealthStatus = pdFAIL; + } + + /* The medium priority and second high priority tasks are still + suspended. Make sure to resume them before starting again. */ + vTaskResume( xCreatedTasks[ evtMEDIUM_PRIORITY_INDEX ] ); + vTaskResume( xCreatedTasks[ evtHIGHEST_PRIORITY_INDEX_2 ] ); + + /* Just keep incrementing to show the task is still executing. */ + xCheckVariable++; + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckTaskCounters( portBASE_TYPE xExpectedTask, portBASE_TYPE xIncrement ) +{ +portBASE_TYPE xDummy = 0; + + /* Write to the queue the requested number of times. The data written is + not important. */ + for( xDummy = 0; xDummy < xIncrement; xDummy++ ) + { + if( xQueueSend( xQueue, &xDummy, evtNO_DELAY ) != pdTRUE ) + { + /* Did not expect to ever find the queue full. */ + xHealthStatus = pdFAIL; + } + } + + /* All the tasks blocked on the queue have a priority higher than the + controlling task. Writing to the queue will therefore have caused this + task to be preempted. By the time this line executes the event task will + have executed and incremented its counter. Increment the expected counter + to the same value. */ + ( xExpectedTaskCounters[ xExpectedTask ] ) += xIncrement; + + /* Check the actual counts and expected counts really are the same. */ + if( memcmp( ( void * ) xExpectedTaskCounters, ( void * ) xTaskCounters, sizeof( xExpectedTaskCounters ) ) ) + { + /* The counters were not the same. This means a task we did not expect + to unblock actually did unblock. */ + xHealthStatus = pdFAIL; + } +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xAreMultiEventTasksStillRunning( void ) +{ +static portBASE_TYPE xPreviousCheckVariable = 0; + + /* Called externally to periodically check that this test is still + operational. */ + + if( xPreviousCheckVariable == xCheckVariable ) + { + xHealthStatus = pdFAIL; + } + + xPreviousCheckVariable = xCheckVariable; + + return xHealthStatus; +} + + diff --git a/third_party/FreeRTOS/Demo/Common/Full/flash.c b/third_party/FreeRTOS/Demo/Common/Full/flash.c new file mode 100644 index 0000000..05e1e90 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Full/flash.c @@ -0,0 +1,166 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/** + * Creates eight tasks, each of which flash an LED at a different rate. The first + * LED flashes every 125ms, the second every 250ms, the third every 375ms, etc. + * + * The LED flash tasks provide instant visual feedback. They show that the scheduler + * is still operational. + * + * The PC port uses the standard parallel port for outputs, the Flashlite 186 port + * uses IO port F. + * + * \page flashC flash.c + * \ingroup DemoFiles + *
+ */ + +/* +Changes from V2.0.0 + + + Delay periods are now specified using variables and constants of + portTickType rather than unsigned long. + +Changes from V2.1.1 + + + The stack size now uses configMINIMAL_STACK_SIZE. + + String constants made file scope to decrease stack depth on 8051 port. +*/ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo program include files. */ +#include "partest.h" +#include "flash.h" +#include "print.h" + +#define ledSTACK_SIZE configMINIMAL_STACK_SIZE + +/* Structure used to pass parameters to the LED tasks. */ +typedef struct LED_PARAMETERS +{ + unsigned portBASE_TYPE uxLED; /*< The output the task should use. */ + portTickType xFlashRate; /*< The rate at which the LED should flash. */ +} xLEDParameters; + +/* The task that is created eight times - each time with a different xLEDParaemtes +structure passed in as the parameter. */ +static void vLEDFlashTask( void *pvParameters ); + +/* String to print if USE_STDIO is defined. */ +const char * const pcTaskStartMsg = "LED flash task started.\r\n"; + +/*-----------------------------------------------------------*/ + +void vStartLEDFlashTasks( unsigned portBASE_TYPE uxPriority ) +{ +unsigned portBASE_TYPE uxLEDTask; +xLEDParameters *pxLEDParameters; +const unsigned portBASE_TYPE uxNumOfLEDs = 8; +const portTickType xFlashRate = 125; + + /* Create the eight tasks. */ + for( uxLEDTask = 0; uxLEDTask < uxNumOfLEDs; ++uxLEDTask ) + { + /* Create and complete the structure used to pass parameters to the next + created task. */ + pxLEDParameters = ( xLEDParameters * ) pvPortMalloc( sizeof( xLEDParameters ) ); + pxLEDParameters->uxLED = uxLEDTask; + pxLEDParameters->xFlashRate = ( xFlashRate + ( xFlashRate * ( portTickType ) uxLEDTask ) ); + pxLEDParameters->xFlashRate /= portTICK_RATE_MS; + + /* Spawn the task. */ + xTaskCreate( vLEDFlashTask, "LEDx", ledSTACK_SIZE, ( void * ) pxLEDParameters, uxPriority, ( xTaskHandle * ) NULL ); + } +} +/*-----------------------------------------------------------*/ + +static void vLEDFlashTask( void *pvParameters ) +{ +xLEDParameters *pxParameters; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + pxParameters = ( xLEDParameters * ) pvParameters; + + for(;;) + { + /* Delay for half the flash period then turn the LED on. */ + vTaskDelay( pxParameters->xFlashRate / ( portTickType ) 2 ); + vParTestToggleLED( pxParameters->uxLED ); + + /* Delay for half the flash period then turn the LED off. */ + vTaskDelay( pxParameters->xFlashRate / ( portTickType ) 2 ); + vParTestToggleLED( pxParameters->uxLED ); + } +} + diff --git a/third_party/FreeRTOS/Demo/Common/Full/flop.c b/third_party/FreeRTOS/Demo/Common/Full/flop.c new file mode 100644 index 0000000..af15049 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Full/flop.c @@ -0,0 +1,369 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V1.2.3 + + + The created tasks now include calls to tskYIELD(), allowing them to be used + with the cooperative scheduler. +*/ + +/** + * Creates eight tasks, each of which loops continuously performing an (emulated) + * floating point calculation. + * + * All the tasks run at the idle priority and never block or yield. This causes + * all eight tasks to time slice with the idle task. Running at the idle priority + * means that these tasks will get pre-empted any time another task is ready to run + * or a time slice occurs. More often than not the pre-emption will occur mid + * calculation, creating a good test of the schedulers context switch mechanism - a + * calculation producing an unexpected result could be a symptom of a corruption in + * the context of a task. + * + * \page FlopC flop.c + * \ingroup DemoFiles + *
+ */ + +#include +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "print.h" + +/* Demo program include files. */ +#include "flop.h" + +#define mathSTACK_SIZE ( ( unsigned short ) 512 ) +#define mathNUMBER_OF_TASKS ( 8 ) + +/* Four tasks, each of which performs a different floating point calculation. +Each of the four is created twice. */ +static void vCompetingMathTask1( void *pvParameters ); +static void vCompetingMathTask2( void *pvParameters ); +static void vCompetingMathTask3( void *pvParameters ); +static void vCompetingMathTask4( void *pvParameters ); + +/* These variables are used to check that all the tasks are still running. If a +task gets a calculation wrong it will +stop incrementing its check variable. */ +static volatile unsigned short usTaskCheck[ mathNUMBER_OF_TASKS ] = { ( unsigned short ) 0 }; + +/*-----------------------------------------------------------*/ + +void vStartMathTasks( unsigned portBASE_TYPE uxPriority ) +{ + xTaskCreate( vCompetingMathTask1, "Math1", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 0 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask2, "Math2", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 1 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask3, "Math3", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 2 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask4, "Math4", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 3 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask1, "Math5", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 4 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask2, "Math6", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 5 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask3, "Math7", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 6 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask4, "Math8", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 7 ] ), uxPriority, NULL ); +} +/*-----------------------------------------------------------*/ + +static void vCompetingMathTask1( void *pvParameters ) +{ +portDOUBLE d1, d2, d3, d4; +volatile unsigned short *pusTaskCheckVariable; +const portDOUBLE dAnswer = ( 123.4567 + 2345.6789 ) * -918.222; +const char * const pcTaskStartMsg = "Math task 1 started.\r\n"; +const char * const pcTaskFailMsg = "Math task 1 failed.\r\n"; +short sError = pdFALSE; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + /* Keep performing a calculation and checking the result against a constant. */ + for(;;) + { + d1 = 123.4567; + d2 = 2345.6789; + d3 = -918.222; + + d4 = ( d1 + d2 ) * d3; + + taskYIELD(); + + /* If the calculation does not match the expected constant, stop the + increment of the check variable. */ + if( fabs( d4 - dAnswer ) > 0.001 ) + { + vPrintDisplayMessage( &pcTaskFailMsg ); + sError = pdTRUE; + } + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct, increment the check + variable so we know this task is still running okay. */ + ( *pusTaskCheckVariable )++; + } + + taskYIELD(); + } +} +/*-----------------------------------------------------------*/ + +static void vCompetingMathTask2( void *pvParameters ) +{ +portDOUBLE d1, d2, d3, d4; +volatile unsigned short *pusTaskCheckVariable; +const portDOUBLE dAnswer = ( -389.38 / 32498.2 ) * -2.0001; +const char * const pcTaskStartMsg = "Math task 2 started.\r\n"; +const char * const pcTaskFailMsg = "Math task 2 failed.\r\n"; +short sError = pdFALSE; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + /* Keep performing a calculation and checking the result against a constant. */ + for( ;; ) + { + d1 = -389.38; + d2 = 32498.2; + d3 = -2.0001; + + d4 = ( d1 / d2 ) * d3; + + taskYIELD(); + + /* If the calculation does not match the expected constant, stop the + increment of the check variable. */ + if( fabs( d4 - dAnswer ) > 0.001 ) + { + vPrintDisplayMessage( &pcTaskFailMsg ); + sError = pdTRUE; + } + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct, increment the check + variable so we know + this task is still running okay. */ + ( *pusTaskCheckVariable )++; + } + + taskYIELD(); + } +} +/*-----------------------------------------------------------*/ + +static void vCompetingMathTask3( void *pvParameters ) +{ +portDOUBLE *pdArray, dTotal1, dTotal2, dDifference; +volatile unsigned short *pusTaskCheckVariable; +const unsigned short usArraySize = 250; +unsigned short usPosition; +const char * const pcTaskStartMsg = "Math task 3 started.\r\n"; +const char * const pcTaskFailMsg = "Math task 3 failed.\r\n"; +short sError = pdFALSE; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + pdArray = ( portDOUBLE * ) pvPortMalloc( ( size_t ) 250 * sizeof( portDOUBLE ) ); + + /* Keep filling an array, keeping a running total of the values placed in the + array. Then run through the array adding up all the values. If the two totals + do not match, stop the check variable from incrementing. */ + for( ;; ) + { + dTotal1 = 0.0; + dTotal2 = 0.0; + + for( usPosition = 0; usPosition < usArraySize; usPosition++ ) + { + pdArray[ usPosition ] = ( portDOUBLE ) usPosition + 5.5; + dTotal1 += ( portDOUBLE ) usPosition + 5.5; + } + + taskYIELD(); + + for( usPosition = 0; usPosition < usArraySize; usPosition++ ) + { + dTotal2 += pdArray[ usPosition ]; + } + + dDifference = dTotal1 - dTotal2; + if( fabs( dDifference ) > 0.001 ) + { + vPrintDisplayMessage( &pcTaskFailMsg ); + sError = pdTRUE; + } + + taskYIELD(); + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct, increment the check + variable so we know this task is still running okay. */ + ( *pusTaskCheckVariable )++; + } + } +} +/*-----------------------------------------------------------*/ + +static void vCompetingMathTask4( void *pvParameters ) +{ +portDOUBLE *pdArray, dTotal1, dTotal2, dDifference; +volatile unsigned short *pusTaskCheckVariable; +const unsigned short usArraySize = 250; +unsigned short usPosition; +const char * const pcTaskStartMsg = "Math task 4 started.\r\n"; +const char * const pcTaskFailMsg = "Math task 4 failed.\r\n"; +short sError = pdFALSE; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + pdArray = ( portDOUBLE * ) pvPortMalloc( ( size_t ) 250 * sizeof( portDOUBLE ) ); + + /* Keep filling an array, keeping a running total of the values placed in the + array. Then run through the array adding up all the values. If the two totals + do not match, stop the check variable from incrementing. */ + for( ;; ) + { + dTotal1 = 0.0; + dTotal2 = 0.0; + + for( usPosition = 0; usPosition < usArraySize; usPosition++ ) + { + pdArray[ usPosition ] = ( portDOUBLE ) usPosition * 12.123; + dTotal1 += ( portDOUBLE ) usPosition * 12.123; + } + + taskYIELD(); + + for( usPosition = 0; usPosition < usArraySize; usPosition++ ) + { + dTotal2 += pdArray[ usPosition ]; + } + + dDifference = dTotal1 - dTotal2; + if( fabs( dDifference ) > 0.001 ) + { + vPrintDisplayMessage( &pcTaskFailMsg ); + sError = pdTRUE; + } + + taskYIELD(); + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct, increment the check + variable so we know this task is still running okay. */ + ( *pusTaskCheckVariable )++; + } + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreMathsTaskStillRunning( void ) +{ +/* Keep a history of the check variables so we know if they have been incremented +since the last call. */ +static unsigned short usLastTaskCheck[ mathNUMBER_OF_TASKS ] = { ( unsigned short ) 0 }; +portBASE_TYPE xReturn = pdTRUE, xTask; + + /* Check the maths tasks are still running by ensuring their check variables + are still incrementing. */ + for( xTask = 0; xTask < mathNUMBER_OF_TASKS; xTask++ ) + { + if( usTaskCheck[ xTask ] == usLastTaskCheck[ xTask ] ) + { + /* The check has not incremented so an error exists. */ + xReturn = pdFALSE; + } + + usLastTaskCheck[ xTask ] = usTaskCheck[ xTask ]; + } + + return xReturn; +} + + + diff --git a/third_party/FreeRTOS/Demo/Common/Full/integer.c b/third_party/FreeRTOS/Demo/Common/Full/integer.c new file mode 100644 index 0000000..9c69570 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Full/integer.c @@ -0,0 +1,365 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* +Changes from V1.2.3 + + + The created tasks now include calls to tskYIELD(), allowing them to be used + with the cooperative scheduler. +*/ + +/** + * This does the same as flop. c, but uses variables of type long instead of + * type double. + * + * As with flop. c, the tasks created in this file are a good test of the + * scheduler context switch mechanism. The processor has to access 32bit + * variables in two or four chunks (depending on the processor). The low + * priority of these tasks means there is a high probability that a context + * switch will occur mid calculation. See the flop. c documentation for + * more information. + * + * \page IntegerC integer.c + * \ingroup DemoFiles + *
+ */ + +/* +Changes from V1.2.1 + + + The constants used in the calculations are larger to ensure the + optimiser does not truncate them to 16 bits. +*/ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "print.h" + +/* Demo program include files. */ +#include "integer.h" + +#define intgSTACK_SIZE ( ( unsigned short ) 256 ) +#define intgNUMBER_OF_TASKS ( 8 ) + +/* Four tasks, each of which performs a different calculation on four byte +variables. Each of the four is created twice. */ +static void vCompeteingIntMathTask1( void *pvParameters ); +static void vCompeteingIntMathTask2( void *pvParameters ); +static void vCompeteingIntMathTask3( void *pvParameters ); +static void vCompeteingIntMathTask4( void *pvParameters ); + +/* These variables are used to check that all the tasks are still running. If a +task gets a calculation wrong it will stop incrementing its check variable. */ +static volatile unsigned short usTaskCheck[ intgNUMBER_OF_TASKS ] = { ( unsigned short ) 0 }; +/*-----------------------------------------------------------*/ + +void vStartIntegerMathTasks( unsigned portBASE_TYPE uxPriority ) +{ + xTaskCreate( vCompeteingIntMathTask1, "IntMath1", intgSTACK_SIZE, ( void * ) &( usTaskCheck[ 0 ] ), uxPriority, NULL ); + xTaskCreate( vCompeteingIntMathTask2, "IntMath2", intgSTACK_SIZE, ( void * ) &( usTaskCheck[ 1 ] ), uxPriority, NULL ); + xTaskCreate( vCompeteingIntMathTask3, "IntMath3", intgSTACK_SIZE, ( void * ) &( usTaskCheck[ 2 ] ), uxPriority, NULL ); + xTaskCreate( vCompeteingIntMathTask4, "IntMath4", intgSTACK_SIZE, ( void * ) &( usTaskCheck[ 3 ] ), uxPriority, NULL ); + xTaskCreate( vCompeteingIntMathTask1, "IntMath5", intgSTACK_SIZE, ( void * ) &( usTaskCheck[ 4 ] ), uxPriority, NULL ); + xTaskCreate( vCompeteingIntMathTask2, "IntMath6", intgSTACK_SIZE, ( void * ) &( usTaskCheck[ 5 ] ), uxPriority, NULL ); + xTaskCreate( vCompeteingIntMathTask3, "IntMath7", intgSTACK_SIZE, ( void * ) &( usTaskCheck[ 6 ] ), uxPriority, NULL ); + xTaskCreate( vCompeteingIntMathTask4, "IntMath8", intgSTACK_SIZE, ( void * ) &( usTaskCheck[ 7 ] ), uxPriority, NULL ); +} +/*-----------------------------------------------------------*/ + +static void vCompeteingIntMathTask1( void *pvParameters ) +{ +long l1, l2, l3, l4; +short sError = pdFALSE; +volatile unsigned short *pusTaskCheckVariable; +const long lAnswer = ( ( long ) 74565L + ( long ) 1234567L ) * ( long ) -918L; +const char * const pcTaskStartMsg = "Integer math task 1 started.\r\n"; +const char * const pcTaskFailMsg = "Integer math task 1 failed.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + /* Keep performing a calculation and checking the result against a constant. */ + for(;;) + { + l1 = ( long ) 74565L; + l2 = ( long ) 1234567L; + l3 = ( long ) -918L; + + l4 = ( l1 + l2 ) * l3; + + taskYIELD(); + + /* If the calculation does not match the expected constant, stop the + increment of the check variable. */ + if( l4 != lAnswer ) + { + vPrintDisplayMessage( &pcTaskFailMsg ); + sError = pdTRUE; + } + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct, increment the check + variable so we know this task is still running okay. */ + ( *pusTaskCheckVariable )++; + } + } +} +/*-----------------------------------------------------------*/ + +static void vCompeteingIntMathTask2( void *pvParameters ) +{ +long l1, l2, l3, l4; +short sError = pdFALSE; +volatile unsigned short *pusTaskCheckVariable; +const long lAnswer = ( ( long ) -389000L / ( long ) 329999L ) * ( long ) -89L; +const char * const pcTaskStartMsg = "Integer math task 2 started.\r\n"; +const char * const pcTaskFailMsg = "Integer math task 2 failed.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + /* Keep performing a calculation and checking the result against a constant. */ + for( ;; ) + { + l1 = -389000L; + l2 = 329999L; + l3 = -89L; + + l4 = ( l1 / l2 ) * l3; + + taskYIELD(); + + /* If the calculation does not match the expected constant, stop the + increment of the check variable. */ + if( l4 != lAnswer ) + { + vPrintDisplayMessage( &pcTaskFailMsg ); + sError = pdTRUE; + } + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct, increment the check + variable so we know this task is still running okay. */ + ( *pusTaskCheckVariable )++; + } + } +} +/*-----------------------------------------------------------*/ + +static void vCompeteingIntMathTask3( void *pvParameters ) +{ +long *plArray, lTotal1, lTotal2; +short sError = pdFALSE; +volatile unsigned short *pusTaskCheckVariable; +const unsigned short usArraySize = ( unsigned short ) 250; +unsigned short usPosition; +const char * const pcTaskStartMsg = "Integer math task 3 started.\r\n"; +const char * const pcTaskFailMsg = "Integer math task 3 failed.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + /* Create the array we are going to use for our check calculation. */ + plArray = ( long * ) pvPortMalloc( ( size_t ) 250 * sizeof( long ) ); + + /* Keep filling the array, keeping a running total of the values placed in the + array. Then run through the array adding up all the values. If the two totals + do not match, stop the check variable from incrementing. */ + for( ;; ) + { + lTotal1 = ( long ) 0; + lTotal2 = ( long ) 0; + + for( usPosition = 0; usPosition < usArraySize; usPosition++ ) + { + plArray[ usPosition ] = ( long ) usPosition + ( long ) 5; + lTotal1 += ( long ) usPosition + ( long ) 5; + } + + taskYIELD(); + + for( usPosition = 0; usPosition < usArraySize; usPosition++ ) + { + lTotal2 += plArray[ usPosition ]; + } + + if( lTotal1 != lTotal2 ) + { + vPrintDisplayMessage( &pcTaskFailMsg ); + sError = pdTRUE; + } + + taskYIELD(); + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct, increment the check + variable so we know this task is still running okay. */ + ( *pusTaskCheckVariable )++; + } + } +} +/*-----------------------------------------------------------*/ + +static void vCompeteingIntMathTask4( void *pvParameters ) +{ +long *plArray, lTotal1, lTotal2; +short sError = pdFALSE; +volatile unsigned short *pusTaskCheckVariable; +const unsigned short usArraySize = 250; +unsigned short usPosition; +const char * const pcTaskStartMsg = "Integer math task 4 started.\r\n"; +const char * const pcTaskFailMsg = "Integer math task 4 failed.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + /* Create the array we are going to use for our check calculation. */ + plArray = ( long * ) pvPortMalloc( ( size_t ) 250 * sizeof( long ) ); + + /* Keep filling the array, keeping a running total of the values placed in the + array. Then run through the array adding up all the values. If the two totals + do not match, stop the check variable from incrementing. */ + for( ;; ) + { + lTotal1 = ( long ) 0; + lTotal2 = ( long ) 0; + + for( usPosition = 0; usPosition < usArraySize; usPosition++ ) + { + plArray[ usPosition ] = ( long ) usPosition * ( long ) 12; + lTotal1 += ( long ) usPosition * ( long ) 12; + } + + taskYIELD(); + + for( usPosition = 0; usPosition < usArraySize; usPosition++ ) + { + lTotal2 += plArray[ usPosition ]; + } + + + if( lTotal1 != lTotal2 ) + { + vPrintDisplayMessage( &pcTaskFailMsg ); + sError = pdTRUE; + } + + taskYIELD(); + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct, increment the check + variable so we know this task is still running okay. */ + ( *pusTaskCheckVariable )++; + } + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreIntegerMathsTaskStillRunning( void ) +{ +/* Keep a history of the check variables so we know if they have been incremented +since the last call. */ +static unsigned short usLastTaskCheck[ intgNUMBER_OF_TASKS ] = { ( unsigned short ) 0 }; +portBASE_TYPE xReturn = pdTRUE, xTask; + + /* Check the maths tasks are still running by ensuring their check variables + are still incrementing. */ + for( xTask = 0; xTask < intgNUMBER_OF_TASKS; xTask++ ) + { + if( usTaskCheck[ xTask ] == usLastTaskCheck[ xTask ] ) + { + /* The check has not incremented so an error exists. */ + xReturn = pdFALSE; + } + + usLastTaskCheck[ xTask ] = usTaskCheck[ xTask ]; + } + + return xReturn; +} diff --git a/third_party/FreeRTOS/Demo/Common/Full/print.c b/third_party/FreeRTOS/Demo/Common/Full/print.c new file mode 100644 index 0000000..14944d8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Full/print.c @@ -0,0 +1,144 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/** + * Manages a queue of strings that are waiting to be displayed. This is used to + * ensure mutual exclusion of console output. + * + * A task wishing to display a message will call vPrintDisplayMessage (), with a + * pointer to the string as the parameter. The pointer is posted onto the + * xPrintQueue queue. + * + * The task spawned in main. c blocks on xPrintQueue. When a message becomes + * available it calls pcPrintGetNextMessage () to obtain a pointer to the next + * string, then uses the functions defined in the portable layer FileIO. c to + * display the message. + * + * NOTE: + * Using console IO can disrupt real time performance - depending on the port. + * Standard C IO routines are not designed for real time applications. While + * standard IO is useful for demonstration and debugging an alternative method + * should be used if you actually require console IO as part of your application. + * + * \page PrintC print.c + * \ingroup DemoFiles + *
+ */ + +/* +Changes from V2.0.0 + + + Delay periods are now specified using variables and constants of + portTickType rather than unsigned long. +*/ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "queue.h" + +/* Demo program include files. */ +#include "print.h" + +static xQueueHandle xPrintQueue; + +/*-----------------------------------------------------------*/ + +void vPrintInitialise( void ) +{ +const unsigned portBASE_TYPE uxQueueSize = 20; + + /* Create the queue on which errors will be reported. */ + xPrintQueue = xQueueCreate( uxQueueSize, ( unsigned portBASE_TYPE ) sizeof( char * ) ); +} +/*-----------------------------------------------------------*/ + +void vPrintDisplayMessage( const char * const * ppcMessageToSend ) +{ + #ifdef USE_STDIO + xQueueSend( xPrintQueue, ( void * ) ppcMessageToSend, ( portTickType ) 0 ); + #else + /* Stop warnings. */ + ( void ) ppcMessageToSend; + #endif +} +/*-----------------------------------------------------------*/ + +const char *pcPrintGetNextMessage( portTickType xPrintRate ) +{ +char *pcMessage; + + if( xQueueReceive( xPrintQueue, &pcMessage, xPrintRate ) == pdPASS ) + { + return pcMessage; + } + else + { + return NULL; + } +} + + diff --git a/third_party/FreeRTOS/Demo/Common/Full/semtest.c b/third_party/FreeRTOS/Demo/Common/Full/semtest.c new file mode 100644 index 0000000..4d6ee72 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Full/semtest.c @@ -0,0 +1,323 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/** + * Creates two sets of two tasks. The tasks within a set share a variable, access + * to which is guarded by a semaphore. + * + * Each task starts by attempting to obtain the semaphore. On obtaining a + * semaphore a task checks to ensure that the guarded variable has an expected + * value. It then clears the variable to zero before counting it back up to the + * expected value in increments of 1. After each increment the variable is checked + * to ensure it contains the value to which it was just set. When the starting + * value is again reached the task releases the semaphore giving the other task in + * the set a chance to do exactly the same thing. The starting value is high + * enough to ensure that a tick is likely to occur during the incrementing loop. + * + * An error is flagged if at any time during the process a shared variable is + * found to have a value other than that expected. Such an occurrence would + * suggest an error in the mutual exclusion mechanism by which access to the + * variable is restricted. + * + * The first set of two tasks poll their semaphore. The second set use blocking + * calls. + * + * \page SemTestC semtest.c + * \ingroup DemoFiles + *
+ */ + +/* +Changes from V1.2.0: + + + The tasks that operate at the idle priority now use a lower expected + count than those running at a higher priority. This prevents the low + priority tasks from signaling an error because they have not been + scheduled enough time for each of them to count the shared variable to + the high value. + +Changes from V2.0.0 + + + Delay periods are now specified using variables and constants of + portTickType rather than unsigned long. + +Changes from V2.1.1 + + + The stack size now uses configMINIMAL_STACK_SIZE. + + String constants made file scope to decrease stack depth on 8051 port. +*/ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +/* Demo app include files. */ +#include "semtest.h" +#include "print.h" + +/* The value to which the shared variables are counted. */ +#define semtstBLOCKING_EXPECTED_VALUE ( ( unsigned long ) 0xfff ) +#define semtstNON_BLOCKING_EXPECTED_VALUE ( ( unsigned long ) 0xff ) + +#define semtstSTACK_SIZE configMINIMAL_STACK_SIZE + +#define semtstNUM_TASKS ( 4 ) + +#define semtstDELAY_FACTOR ( ( portTickType ) 10 ) + +/* The task function as described at the top of the file. */ +static void prvSemaphoreTest( void *pvParameters ); + +/* Structure used to pass parameters to each task. */ +typedef struct SEMAPHORE_PARAMETERS +{ + xSemaphoreHandle xSemaphore; + volatile unsigned long *pulSharedVariable; + portTickType xBlockTime; +} xSemaphoreParameters; + +/* Variables used to check that all the tasks are still running without errors. */ +static volatile short sCheckVariables[ semtstNUM_TASKS ] = { 0 }; +static volatile short sNextCheckVariable = 0; + +/* Strings to print if USE_STDIO is defined. */ +const char * const pcPollingSemaphoreTaskError = "Guarded shared variable in unexpected state.\r\n"; +const char * const pcSemaphoreTaskStart = "Guarded shared variable task started.\r\n"; + +/*-----------------------------------------------------------*/ + +void vStartSemaphoreTasks( unsigned portBASE_TYPE uxPriority ) +{ +xSemaphoreParameters *pxFirstSemaphoreParameters, *pxSecondSemaphoreParameters; +const portTickType xBlockTime = ( portTickType ) 100; + + /* Create the structure used to pass parameters to the first two tasks. */ + pxFirstSemaphoreParameters = ( xSemaphoreParameters * ) pvPortMalloc( sizeof( xSemaphoreParameters ) ); + + if( pxFirstSemaphoreParameters != NULL ) + { + /* Create the semaphore used by the first two tasks. */ + vSemaphoreCreateBinary( pxFirstSemaphoreParameters->xSemaphore ); + + if( pxFirstSemaphoreParameters->xSemaphore != NULL ) + { + /* Create the variable which is to be shared by the first two tasks. */ + pxFirstSemaphoreParameters->pulSharedVariable = ( unsigned long * ) pvPortMalloc( sizeof( unsigned long ) ); + + /* Initialise the share variable to the value the tasks expect. */ + *( pxFirstSemaphoreParameters->pulSharedVariable ) = semtstNON_BLOCKING_EXPECTED_VALUE; + + /* The first two tasks do not block on semaphore calls. */ + pxFirstSemaphoreParameters->xBlockTime = ( portTickType ) 0; + + /* Spawn the first two tasks. As they poll they operate at the idle priority. */ + xTaskCreate( prvSemaphoreTest, "PolSEM1", semtstSTACK_SIZE, ( void * ) pxFirstSemaphoreParameters, tskIDLE_PRIORITY, ( xTaskHandle * ) NULL ); + xTaskCreate( prvSemaphoreTest, "PolSEM2", semtstSTACK_SIZE, ( void * ) pxFirstSemaphoreParameters, tskIDLE_PRIORITY, ( xTaskHandle * ) NULL ); + } + } + + /* Do exactly the same to create the second set of tasks, only this time + provide a block time for the semaphore calls. */ + pxSecondSemaphoreParameters = ( xSemaphoreParameters * ) pvPortMalloc( sizeof( xSemaphoreParameters ) ); + if( pxSecondSemaphoreParameters != NULL ) + { + vSemaphoreCreateBinary( pxSecondSemaphoreParameters->xSemaphore ); + + if( pxSecondSemaphoreParameters->xSemaphore != NULL ) + { + pxSecondSemaphoreParameters->pulSharedVariable = ( unsigned long * ) pvPortMalloc( sizeof( unsigned long ) ); + *( pxSecondSemaphoreParameters->pulSharedVariable ) = semtstBLOCKING_EXPECTED_VALUE; + pxSecondSemaphoreParameters->xBlockTime = xBlockTime / portTICK_RATE_MS; + + xTaskCreate( prvSemaphoreTest, "BlkSEM1", semtstSTACK_SIZE, ( void * ) pxSecondSemaphoreParameters, uxPriority, ( xTaskHandle * ) NULL ); + xTaskCreate( prvSemaphoreTest, "BlkSEM2", semtstSTACK_SIZE, ( void * ) pxSecondSemaphoreParameters, uxPriority, ( xTaskHandle * ) NULL ); + } + } +} +/*-----------------------------------------------------------*/ + +static void prvSemaphoreTest( void *pvParameters ) +{ +xSemaphoreParameters *pxParameters; +volatile unsigned long *pulSharedVariable, ulExpectedValue; +unsigned long ulCounter; +short sError = pdFALSE, sCheckVariableToUse; + + /* See which check variable to use. sNextCheckVariable is not semaphore + protected! */ + portENTER_CRITICAL(); + sCheckVariableToUse = sNextCheckVariable; + sNextCheckVariable++; + portEXIT_CRITICAL(); + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcSemaphoreTaskStart ); + + /* A structure is passed in as the parameter. This contains the shared + variable being guarded. */ + pxParameters = ( xSemaphoreParameters * ) pvParameters; + pulSharedVariable = pxParameters->pulSharedVariable; + + /* If we are blocking we use a much higher count to ensure loads of context + switches occur during the count. */ + if( pxParameters->xBlockTime > ( portTickType ) 0 ) + { + ulExpectedValue = semtstBLOCKING_EXPECTED_VALUE; + } + else + { + ulExpectedValue = semtstNON_BLOCKING_EXPECTED_VALUE; + } + + for( ;; ) + { + /* Try to obtain the semaphore. */ + if( xSemaphoreTake( pxParameters->xSemaphore, pxParameters->xBlockTime ) == pdPASS ) + { + /* We have the semaphore and so expect any other tasks using the + shared variable to have left it in the state we expect to find + it. */ + if( *pulSharedVariable != ulExpectedValue ) + { + vPrintDisplayMessage( &pcPollingSemaphoreTaskError ); + sError = pdTRUE; + } + + /* Clear the variable, then count it back up to the expected value + before releasing the semaphore. Would expect a context switch or + two during this time. */ + for( ulCounter = ( unsigned long ) 0; ulCounter <= ulExpectedValue; ulCounter++ ) + { + *pulSharedVariable = ulCounter; + if( *pulSharedVariable != ulCounter ) + { + if( sError == pdFALSE ) + { + vPrintDisplayMessage( &pcPollingSemaphoreTaskError ); + } + sError = pdTRUE; + } + } + + /* Release the semaphore, and if no errors have occurred increment the check + variable. */ + if( xSemaphoreGive( pxParameters->xSemaphore ) == pdFALSE ) + { + vPrintDisplayMessage( &pcPollingSemaphoreTaskError ); + sError = pdTRUE; + } + + if( sError == pdFALSE ) + { + if( sCheckVariableToUse < semtstNUM_TASKS ) + { + ( sCheckVariables[ sCheckVariableToUse ] )++; + } + } + + /* If we have a block time then we are running at a priority higher + than the idle priority. This task takes a long time to complete + a cycle (deliberately so to test the guarding) so will be starving + out lower priority tasks. Block for some time to allow give lower + priority tasks some processor time. */ + vTaskDelay( pxParameters->xBlockTime * semtstDELAY_FACTOR ); + } + else + { + if( pxParameters->xBlockTime == ( portTickType ) 0 ) + { + /* We have not got the semaphore yet, so no point using the + processor. We are not blocking when attempting to obtain the + semaphore. */ + taskYIELD(); + } + } + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreSemaphoreTasksStillRunning( void ) +{ +static short sLastCheckVariables[ semtstNUM_TASKS ] = { 0 }; +portBASE_TYPE xTask, xReturn = pdTRUE; + + for( xTask = 0; xTask < semtstNUM_TASKS; xTask++ ) + { + if( sLastCheckVariables[ xTask ] == sCheckVariables[ xTask ] ) + { + xReturn = pdFALSE; + } + + sLastCheckVariables[ xTask ] = sCheckVariables[ xTask ]; + } + + return xReturn; +} + + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/AltBlckQ.c b/third_party/FreeRTOS/Demo/Common/Minimal/AltBlckQ.c new file mode 100644 index 0000000..aff7d32 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/AltBlckQ.c @@ -0,0 +1,332 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This is a version of BlockQ.c that uses the alternative (Alt) API. + * + * Creates six tasks that operate on three queues as follows: + * + * The first two tasks send and receive an incrementing number to/from a queue. + * One task acts as a producer and the other as the consumer. The consumer is a + * higher priority than the producer and is set to block on queue reads. The queue + * only has space for one item - as soon as the producer posts a message on the + * queue the consumer will unblock, pre-empt the producer, and remove the item. + * + * The second two tasks work the other way around. Again the queue used only has + * enough space for one item. This time the consumer has a lower priority than the + * producer. The producer will try to post on the queue blocking when the queue is + * full. When the consumer wakes it will remove the item from the queue, causing + * the producer to unblock, pre-empt the consumer, and immediately re-fill the + * queue. + * + * The last two tasks use the same queue producer and consumer functions. This time the queue has + * enough space for lots of items and the tasks operate at the same priority. The + * producer will execute, placing items into the queue. The consumer will start + * executing when either the queue becomes full (causing the producer to block) or + * a context switch occurs (tasks of the same priority will time slice). + * + */ + + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +/* Demo program include files. */ +#include "AltBlckQ.h" + +#define blckqSTACK_SIZE configMINIMAL_STACK_SIZE +#define blckqNUM_TASK_SETS ( 3 ) + +/* Structure used to pass parameters to the blocking queue tasks. */ +typedef struct BLOCKING_QUEUE_PARAMETERS +{ + xQueueHandle xQueue; /*< The queue to be used by the task. */ + portTickType xBlockTime; /*< The block time to use on queue reads/writes. */ + volatile portSHORT *psCheckVariable; /*< Incremented on each successful cycle to check the task is still running. */ +} xBlockingQueueParameters; + +/* Task function that creates an incrementing number and posts it on a queue. */ +static portTASK_FUNCTION_PROTO( vBlockingQueueProducer, pvParameters ); + +/* Task function that removes the incrementing number from a queue and checks that +it is the expected number. */ +static portTASK_FUNCTION_PROTO( vBlockingQueueConsumer, pvParameters ); + +/* Variables which are incremented each time an item is removed from a queue, and +found to be the expected value. +These are used to check that the tasks are still running. */ +static volatile portSHORT sBlockingConsumerCount[ blckqNUM_TASK_SETS ] = { ( unsigned portSHORT ) 0, ( unsigned portSHORT ) 0, ( unsigned portSHORT ) 0 }; + +/* Variable which are incremented each time an item is posted on a queue. These +are used to check that the tasks are still running. */ +static volatile portSHORT sBlockingProducerCount[ blckqNUM_TASK_SETS ] = { ( unsigned portSHORT ) 0, ( unsigned portSHORT ) 0, ( unsigned portSHORT ) 0 }; + +/*-----------------------------------------------------------*/ + +void vStartAltBlockingQueueTasks( unsigned portBASE_TYPE uxPriority ) +{ +xBlockingQueueParameters *pxQueueParameters1, *pxQueueParameters2; +xBlockingQueueParameters *pxQueueParameters3, *pxQueueParameters4; +xBlockingQueueParameters *pxQueueParameters5, *pxQueueParameters6; +const unsigned portBASE_TYPE uxQueueSize1 = 1, uxQueueSize5 = 5; +const portTickType xBlockTime = ( portTickType ) 1000 / portTICK_RATE_MS; +const portTickType xDontBlock = ( portTickType ) 0; + + /* Create the first two tasks as described at the top of the file. */ + + /* First create the structure used to pass parameters to the consumer tasks. */ + pxQueueParameters1 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + + /* Create the queue used by the first two tasks to pass the incrementing number. + Pass a pointer to the queue in the parameter structure. */ + pxQueueParameters1->xQueue = xQueueCreate( uxQueueSize1, ( unsigned portBASE_TYPE ) sizeof( unsigned portSHORT ) ); + + /* The consumer is created first so gets a block time as described above. */ + pxQueueParameters1->xBlockTime = xBlockTime; + + /* Pass in the variable that this task is going to increment so we can check it + is still running. */ + pxQueueParameters1->psCheckVariable = &( sBlockingConsumerCount[ 0 ] ); + + /* Create the structure used to pass parameters to the producer task. */ + pxQueueParameters2 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + + /* Pass the queue to this task also, using the parameter structure. */ + pxQueueParameters2->xQueue = pxQueueParameters1->xQueue; + + /* The producer is not going to block - as soon as it posts the consumer will + wake and remove the item so the producer should always have room to post. */ + pxQueueParameters2->xBlockTime = xDontBlock; + + /* Pass in the variable that this task is going to increment so we can check + it is still running. */ + pxQueueParameters2->psCheckVariable = &( sBlockingProducerCount[ 0 ] ); + + + /* Note the producer has a lower priority than the consumer when the tasks are + spawned. */ + xTaskCreate( vBlockingQueueConsumer, ( signed portCHAR * ) "QConsB1", blckqSTACK_SIZE, ( void * ) pxQueueParameters1, uxPriority, NULL ); + xTaskCreate( vBlockingQueueProducer, ( signed portCHAR * ) "QProdB2", blckqSTACK_SIZE, ( void * ) pxQueueParameters2, tskIDLE_PRIORITY, NULL ); + + + + /* Create the second two tasks as described at the top of the file. This uses + the same mechanism but reverses the task priorities. */ + + pxQueueParameters3 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + pxQueueParameters3->xQueue = xQueueCreate( uxQueueSize1, ( unsigned portBASE_TYPE ) sizeof( unsigned portSHORT ) ); + pxQueueParameters3->xBlockTime = xDontBlock; + pxQueueParameters3->psCheckVariable = &( sBlockingProducerCount[ 1 ] ); + + pxQueueParameters4 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + pxQueueParameters4->xQueue = pxQueueParameters3->xQueue; + pxQueueParameters4->xBlockTime = xBlockTime; + pxQueueParameters4->psCheckVariable = &( sBlockingConsumerCount[ 1 ] ); + + xTaskCreate( vBlockingQueueConsumer, ( signed portCHAR * ) "QProdB3", blckqSTACK_SIZE, ( void * ) pxQueueParameters3, tskIDLE_PRIORITY, NULL ); + xTaskCreate( vBlockingQueueProducer, ( signed portCHAR * ) "QConsB4", blckqSTACK_SIZE, ( void * ) pxQueueParameters4, uxPriority, NULL ); + + + + /* Create the last two tasks as described above. The mechanism is again just + the same. This time both parameter structures are given a block time. */ + pxQueueParameters5 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + pxQueueParameters5->xQueue = xQueueCreate( uxQueueSize5, ( unsigned portBASE_TYPE ) sizeof( unsigned portSHORT ) ); + pxQueueParameters5->xBlockTime = xBlockTime; + pxQueueParameters5->psCheckVariable = &( sBlockingProducerCount[ 2 ] ); + + pxQueueParameters6 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + pxQueueParameters6->xQueue = pxQueueParameters5->xQueue; + pxQueueParameters6->xBlockTime = xBlockTime; + pxQueueParameters6->psCheckVariable = &( sBlockingConsumerCount[ 2 ] ); + + xTaskCreate( vBlockingQueueProducer, ( signed portCHAR * ) "QProdB5", blckqSTACK_SIZE, ( void * ) pxQueueParameters5, tskIDLE_PRIORITY, NULL ); + xTaskCreate( vBlockingQueueConsumer, ( signed portCHAR * ) "QConsB6", blckqSTACK_SIZE, ( void * ) pxQueueParameters6, tskIDLE_PRIORITY, NULL ); +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vBlockingQueueProducer, pvParameters ) +{ +unsigned portSHORT usValue = 0; +xBlockingQueueParameters *pxQueueParameters; +portSHORT sErrorEverOccurred = pdFALSE; + + #ifdef USE_STDIO + void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend ); + + const portCHAR * const pcTaskStartMsg = "Alt blocking queue producer task started.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + #endif + + pxQueueParameters = ( xBlockingQueueParameters * ) pvParameters; + + for( ;; ) + { + if( xQueueAltSendToBack( pxQueueParameters->xQueue, ( void * ) &usValue, pxQueueParameters->xBlockTime ) != pdPASS ) + { + sErrorEverOccurred = pdTRUE; + } + else + { + /* We have successfully posted a message, so increment the variable + used to check we are still running. */ + if( sErrorEverOccurred == pdFALSE ) + { + ( *pxQueueParameters->psCheckVariable )++; + } + + /* Increment the variable we are going to post next time round. The + consumer will expect the numbers to follow in numerical order. */ + ++usValue; + } + } +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vBlockingQueueConsumer, pvParameters ) +{ +unsigned portSHORT usData, usExpectedValue = 0; +xBlockingQueueParameters *pxQueueParameters; +portSHORT sErrorEverOccurred = pdFALSE; + + #ifdef USE_STDIO + void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend ); + + const portCHAR * const pcTaskStartMsg = "Alt blocking queue consumer task started.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + #endif + + pxQueueParameters = ( xBlockingQueueParameters * ) pvParameters; + + for( ;; ) + { + if( xQueueAltReceive( pxQueueParameters->xQueue, &usData, pxQueueParameters->xBlockTime ) == pdPASS ) + { + if( usData != usExpectedValue ) + { + /* Catch-up. */ + usExpectedValue = usData; + + sErrorEverOccurred = pdTRUE; + } + else + { + /* We have successfully received a message, so increment the + variable used to check we are still running. */ + if( sErrorEverOccurred == pdFALSE ) + { + ( *pxQueueParameters->psCheckVariable )++; + } + + /* Increment the value we expect to remove from the queue next time + round. */ + ++usExpectedValue; + } + } + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreAltBlockingQueuesStillRunning( void ) +{ +static portSHORT sLastBlockingConsumerCount[ blckqNUM_TASK_SETS ] = { ( unsigned portSHORT ) 0, ( unsigned portSHORT ) 0, ( unsigned portSHORT ) 0 }; +static portSHORT sLastBlockingProducerCount[ blckqNUM_TASK_SETS ] = { ( unsigned portSHORT ) 0, ( unsigned portSHORT ) 0, ( unsigned portSHORT ) 0 }; +portBASE_TYPE xReturn = pdPASS, xTasks; + + /* Not too worried about mutual exclusion on these variables as they are 16 + bits and we are only reading them. We also only care to see if they have + changed or not. + + Loop through each check variable to and return pdFALSE if any are found not + to have changed since the last call. */ + + for( xTasks = 0; xTasks < blckqNUM_TASK_SETS; xTasks++ ) + { + if( sBlockingConsumerCount[ xTasks ] == sLastBlockingConsumerCount[ xTasks ] ) + { + xReturn = pdFALSE; + } + sLastBlockingConsumerCount[ xTasks ] = sBlockingConsumerCount[ xTasks ]; + + + if( sBlockingProducerCount[ xTasks ] == sLastBlockingProducerCount[ xTasks ] ) + { + xReturn = pdFALSE; + } + sLastBlockingProducerCount[ xTasks ] = sBlockingProducerCount[ xTasks ]; + } + + return xReturn; +} + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/AltBlock.c b/third_party/FreeRTOS/Demo/Common/Minimal/AltBlock.c new file mode 100644 index 0000000..93c8472 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/AltBlock.c @@ -0,0 +1,549 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This is a version of BlockTim.c that uses the light weight API. + * + * This file contains some test scenarios that ensure tasks do not exit queue + * send or receive functions prematurely. A description of the tests is + * included within the code. + */ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +/* Demo includes. */ +#include "AltBlock.h" + +/* Task priorities. */ +#define bktPRIMARY_PRIORITY ( 3 ) +#define bktSECONDARY_PRIORITY ( 2 ) + +/* Task behaviour. */ +#define bktQUEUE_LENGTH ( 5 ) +#define bktSHORT_WAIT ( ( ( portTickType ) 20 ) / portTICK_RATE_MS ) +#define bktPRIMARY_BLOCK_TIME ( 10 ) +#define bktALLOWABLE_MARGIN ( 12 ) +#define bktTIME_TO_BLOCK ( 175 ) +#define bktDONT_BLOCK ( ( portTickType ) 0 ) +#define bktRUN_INDICATOR ( ( unsigned portBASE_TYPE ) 0x55 ) + +/* The queue on which the tasks block. */ +static xQueueHandle xTestQueue; + +/* Handle to the secondary task is required by the primary task for calls +to vTaskSuspend/Resume(). */ +static xTaskHandle xSecondary; + +/* Used to ensure that tasks are still executing without error. */ +static portBASE_TYPE xPrimaryCycles = 0, xSecondaryCycles = 0; +static portBASE_TYPE xErrorOccurred = pdFALSE; + +/* Provides a simple mechanism for the primary task to know when the +secondary task has executed. */ +static volatile unsigned portBASE_TYPE xRunIndicator; + +/* The two test tasks. Their behaviour is commented within the files. */ +static void vPrimaryBlockTimeTestTask( void *pvParameters ); +static void vSecondaryBlockTimeTestTask( void *pvParameters ); + +/*-----------------------------------------------------------*/ + +void vCreateAltBlockTimeTasks( void ) +{ + /* Create the queue on which the two tasks block. */ + xTestQueue = xQueueCreate( bktQUEUE_LENGTH, sizeof( portBASE_TYPE ) ); + + /* vQueueAddToRegistry() adds the queue to the queue registry, if one is + in use. The queue registry is provided as a means for kernel aware + debuggers to locate queues and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( xTestQueue, ( signed portCHAR * ) "AltBlockQueue" ); + + + /* Create the two test tasks. */ + xTaskCreate( vPrimaryBlockTimeTestTask, ( signed portCHAR * )"FBTest1", configMINIMAL_STACK_SIZE, NULL, bktPRIMARY_PRIORITY, NULL ); + xTaskCreate( vSecondaryBlockTimeTestTask, ( signed portCHAR * )"FBTest2", configMINIMAL_STACK_SIZE, NULL, bktSECONDARY_PRIORITY, &xSecondary ); +} +/*-----------------------------------------------------------*/ + +static void vPrimaryBlockTimeTestTask( void *pvParameters ) +{ +portBASE_TYPE xItem, xData; +portTickType xTimeWhenBlocking; +portTickType xTimeToBlock, xBlockedTime; + + #ifdef USE_STDIO + void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend ); + + const portCHAR * const pcTaskStartMsg = "Alt primary block time test started.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + #endif + + ( void ) pvParameters; + + for( ;; ) + { + /********************************************************************* + Test 1 + + Simple block time wakeup test on queue receives. */ + for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ ) + { + /* The queue is empty. Attempt to read from the queue using a block + time. When we wake, ensure the delta in time is as expected. */ + xTimeToBlock = bktPRIMARY_BLOCK_TIME << xItem; + + /* A critical section is used to minimise the jitter in the time + measurements. */ + portENTER_CRITICAL(); + { + xTimeWhenBlocking = xTaskGetTickCount(); + + /* We should unblock after xTimeToBlock having not received + anything on the queue. */ + if( xQueueAltReceive( xTestQueue, &xData, xTimeToBlock ) != errQUEUE_EMPTY ) + { + xErrorOccurred = pdTRUE; + } + + /* How long were we blocked for? */ + xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking; + } + portEXIT_CRITICAL(); + + if( xBlockedTime < xTimeToBlock ) + { + /* Should not have blocked for less than we requested. */ + xErrorOccurred = pdTRUE; + } + + if( xBlockedTime > ( xTimeToBlock + bktALLOWABLE_MARGIN ) ) + { + /* Should not have blocked for longer than we requested, + although we would not necessarily run as soon as we were + unblocked so a margin is allowed. */ + xErrorOccurred = pdTRUE; + } + } + + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + + /********************************************************************* + Test 2 + + Simple block time wakeup test on queue sends. + + First fill the queue. It should be empty so all sends should pass. */ + for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ ) + { + if( xQueueAltSendToBack( xTestQueue, &xItem, bktDONT_BLOCK ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + } + + for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ ) + { + /* The queue is full. Attempt to write to the queue using a block + time. When we wake, ensure the delta in time is as expected. */ + xTimeToBlock = bktPRIMARY_BLOCK_TIME << xItem; + + portENTER_CRITICAL(); + { + xTimeWhenBlocking = xTaskGetTickCount(); + + /* We should unblock after xTimeToBlock having not received + anything on the queue. */ + if( xQueueAltSendToBack( xTestQueue, &xItem, xTimeToBlock ) != errQUEUE_FULL ) + { + xErrorOccurred = pdTRUE; + } + + /* How long were we blocked for? */ + xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking; + } + portEXIT_CRITICAL(); + + if( xBlockedTime < xTimeToBlock ) + { + /* Should not have blocked for less than we requested. */ + xErrorOccurred = pdTRUE; + } + + if( xBlockedTime > ( xTimeToBlock + bktALLOWABLE_MARGIN ) ) + { + /* Should not have blocked for longer than we requested, + although we would not necessarily run as soon as we were + unblocked so a margin is allowed. */ + xErrorOccurred = pdTRUE; + } + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + + /********************************************************************* + Test 3 + + Wake the other task, it will block attempting to post to the queue. + When we read from the queue the other task will wake, but before it + can run we will post to the queue again. When the other task runs it + will find the queue still full, even though it was woken. It should + recognise that its block time has not expired and return to block for + the remains of its block time. + + Wake the other task so it blocks attempting to post to the already + full queue. */ + xRunIndicator = 0; + vTaskResume( xSecondary ); + + /* We need to wait a little to ensure the other task executes. */ + while( xRunIndicator != bktRUN_INDICATOR ) + { + /* The other task has not yet executed. */ + vTaskDelay( bktSHORT_WAIT ); + } + /* Make sure the other task is blocked on the queue. */ + vTaskDelay( bktSHORT_WAIT ); + xRunIndicator = 0; + + for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ ) + { + /* Now when we make space on the queue the other task should wake + but not execute as this task has higher priority. */ + if( xQueueAltReceive( xTestQueue, &xData, bktDONT_BLOCK ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + /* Now fill the queue again before the other task gets a chance to + execute. If the other task had executed we would find the queue + full ourselves, and the other task have set xRunIndicator. */ + if( xQueueAltSendToBack( xTestQueue, &xItem, bktDONT_BLOCK ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + if( xRunIndicator == bktRUN_INDICATOR ) + { + /* The other task should not have executed. */ + xErrorOccurred = pdTRUE; + } + + /* Raise the priority of the other task so it executes and blocks + on the queue again. */ + vTaskPrioritySet( xSecondary, bktPRIMARY_PRIORITY + 2 ); + + /* The other task should now have re-blocked without exiting the + queue function. */ + if( xRunIndicator == bktRUN_INDICATOR ) + { + /* The other task should not have executed outside of the + queue function. */ + xErrorOccurred = pdTRUE; + } + + /* Set the priority back down. */ + vTaskPrioritySet( xSecondary, bktSECONDARY_PRIORITY ); + } + + /* Let the other task timeout. When it unblockes it will check that it + unblocked at the correct time, then suspend itself. */ + while( xRunIndicator != bktRUN_INDICATOR ) + { + vTaskDelay( bktSHORT_WAIT ); + } + vTaskDelay( bktSHORT_WAIT ); + xRunIndicator = 0; + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /********************************************************************* + Test 4 + + As per test 3 - but with the send and receive the other way around. + The other task blocks attempting to read from the queue. + + Empty the queue. We should find that it is full. */ + for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ ) + { + if( xQueueAltReceive( xTestQueue, &xData, bktDONT_BLOCK ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + } + + /* Wake the other task so it blocks attempting to read from the + already empty queue. */ + vTaskResume( xSecondary ); + + /* We need to wait a little to ensure the other task executes. */ + while( xRunIndicator != bktRUN_INDICATOR ) + { + vTaskDelay( bktSHORT_WAIT ); + } + vTaskDelay( bktSHORT_WAIT ); + xRunIndicator = 0; + + for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ ) + { + /* Now when we place an item on the queue the other task should + wake but not execute as this task has higher priority. */ + if( xQueueAltSendToBack( xTestQueue, &xItem, bktDONT_BLOCK ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + /* Now empty the queue again before the other task gets a chance to + execute. If the other task had executed we would find the queue + empty ourselves, and the other task would be suspended. */ + if( xQueueAltReceive( xTestQueue, &xData, bktDONT_BLOCK ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + if( xRunIndicator == bktRUN_INDICATOR ) + { + /* The other task should not have executed. */ + xErrorOccurred = pdTRUE; + } + + /* Raise the priority of the other task so it executes and blocks + on the queue again. */ + vTaskPrioritySet( xSecondary, bktPRIMARY_PRIORITY + 2 ); + + /* The other task should now have re-blocked without exiting the + queue function. */ + if( xRunIndicator == bktRUN_INDICATOR ) + { + /* The other task should not have executed outside of the + queue function. */ + xErrorOccurred = pdTRUE; + } + vTaskPrioritySet( xSecondary, bktSECONDARY_PRIORITY ); + } + + /* Let the other task timeout. When it unblockes it will check that it + unblocked at the correct time, then suspend itself. */ + while( xRunIndicator != bktRUN_INDICATOR ) + { + vTaskDelay( bktSHORT_WAIT ); + } + vTaskDelay( bktSHORT_WAIT ); + + xPrimaryCycles++; + } +} +/*-----------------------------------------------------------*/ + +static void vSecondaryBlockTimeTestTask( void *pvParameters ) +{ +portTickType xTimeWhenBlocking, xBlockedTime; +portBASE_TYPE xData; + + #ifdef USE_STDIO + void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend ); + + const portCHAR * const pcTaskStartMsg = "Alt secondary block time test started.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + #endif + + ( void ) pvParameters; + + for( ;; ) + { + /********************************************************************* + Test 1 and 2 + + This task does does not participate in these tests. */ + vTaskSuspend( NULL ); + + /********************************************************************* + Test 3 + + The first thing we do is attempt to read from the queue. It should be + full so we block. Note the time before we block so we can check the + wake time is as per that expected. */ + portENTER_CRITICAL(); + { + xTimeWhenBlocking = xTaskGetTickCount(); + + /* We should unblock after bktTIME_TO_BLOCK having not received + anything on the queue. */ + xData = 0; + xRunIndicator = bktRUN_INDICATOR; + if( xQueueAltSendToBack( xTestQueue, &xData, bktTIME_TO_BLOCK ) != errQUEUE_FULL ) + { + xErrorOccurred = pdTRUE; + } + + /* How long were we inside the send function? */ + xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking; + } + portEXIT_CRITICAL(); + + /* We should not have blocked for less time than bktTIME_TO_BLOCK. */ + if( xBlockedTime < bktTIME_TO_BLOCK ) + { + xErrorOccurred = pdTRUE; + } + + /* We should of not blocked for much longer than bktALLOWABLE_MARGIN + either. A margin is permitted as we would not necessarily run as + soon as we unblocked. */ + if( xBlockedTime > ( bktTIME_TO_BLOCK + bktALLOWABLE_MARGIN ) ) + { + xErrorOccurred = pdTRUE; + } + + /* Suspend ready for test 3. */ + xRunIndicator = bktRUN_INDICATOR; + vTaskSuspend( NULL ); + + /********************************************************************* + Test 4 + + As per test three, but with the send and receive reversed. */ + portENTER_CRITICAL(); + { + xTimeWhenBlocking = xTaskGetTickCount(); + + /* We should unblock after bktTIME_TO_BLOCK having not received + anything on the queue. */ + xRunIndicator = bktRUN_INDICATOR; + if( xQueueAltReceive( xTestQueue, &xData, bktTIME_TO_BLOCK ) != errQUEUE_EMPTY ) + { + xErrorOccurred = pdTRUE; + } + + xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking; + } + portEXIT_CRITICAL(); + + /* We should not have blocked for less time than bktTIME_TO_BLOCK. */ + if( xBlockedTime < bktTIME_TO_BLOCK ) + { + xErrorOccurred = pdTRUE; + } + + /* We should of not blocked for much longer than bktALLOWABLE_MARGIN + either. A margin is permitted as we would not necessarily run as soon + as we unblocked. */ + if( xBlockedTime > ( bktTIME_TO_BLOCK + bktALLOWABLE_MARGIN ) ) + { + xErrorOccurred = pdTRUE; + } + + xRunIndicator = bktRUN_INDICATOR; + + xSecondaryCycles++; + } +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xAreAltBlockTimeTestTasksStillRunning( void ) +{ +static portBASE_TYPE xLastPrimaryCycleCount = 0, xLastSecondaryCycleCount = 0; +portBASE_TYPE xReturn = pdPASS; + + /* Have both tasks performed at least one cycle since this function was + last called? */ + if( xPrimaryCycles == xLastPrimaryCycleCount ) + { + xReturn = pdFAIL; + } + + if( xSecondaryCycles == xLastSecondaryCycleCount ) + { + xReturn = pdFAIL; + } + + if( xErrorOccurred == pdTRUE ) + { + xReturn = pdFAIL; + } + + xLastSecondaryCycleCount = xSecondaryCycles; + xLastPrimaryCycleCount = xPrimaryCycles; + + return xReturn; +} diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/AltPollQ.c b/third_party/FreeRTOS/Demo/Common/Minimal/AltPollQ.c new file mode 100644 index 0000000..25949ea --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/AltPollQ.c @@ -0,0 +1,275 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This is a version of PollQ.c that uses the alternative (Alt) API. + * + * Creates two tasks that communicate over a single queue. One task acts as a + * producer, the other a consumer. + * + * The producer loops for three iteration, posting an incrementing number onto the + * queue each cycle. It then delays for a fixed period before doing exactly the + * same again. + * + * The consumer loops emptying the queue. Each item removed from the queue is + * checked to ensure it contains the expected value. When the queue is empty it + * blocks for a fixed period, then does the same again. + * + * All queue access is performed without blocking. The consumer completely empties + * the queue each time it runs so the producer should never find the queue full. + * + * An error is flagged if the consumer obtains an unexpected value or the producer + * find the queue is full. + */ + +/* +Changes from V2.0.0 + + + Delay periods are now specified using variables and constants of + portTickType rather than unsigned portLONG. +*/ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +/* Demo program include files. */ +#include "AltPollQ.h" + +#define pollqSTACK_SIZE configMINIMAL_STACK_SIZE +#define pollqQUEUE_SIZE ( 10 ) +#define pollqPRODUCER_DELAY ( ( portTickType ) 200 / portTICK_RATE_MS ) +#define pollqCONSUMER_DELAY ( pollqPRODUCER_DELAY - ( portTickType ) ( 20 / portTICK_RATE_MS ) ) +#define pollqNO_DELAY ( ( portTickType ) 0 ) +#define pollqVALUES_TO_PRODUCE ( ( signed portBASE_TYPE ) 3 ) +#define pollqINITIAL_VALUE ( ( signed portBASE_TYPE ) 0 ) + +/* The task that posts the incrementing number onto the queue. */ +static portTASK_FUNCTION_PROTO( vPolledQueueProducer, pvParameters ); + +/* The task that empties the queue. */ +static portTASK_FUNCTION_PROTO( vPolledQueueConsumer, pvParameters ); + +/* Variables that are used to check that the tasks are still running with no +errors. */ +static volatile signed portBASE_TYPE xPollingConsumerCount = pollqINITIAL_VALUE, xPollingProducerCount = pollqINITIAL_VALUE; + +/*-----------------------------------------------------------*/ + +void vStartAltPolledQueueTasks( unsigned portBASE_TYPE uxPriority ) +{ +static xQueueHandle xPolledQueue; + + /* Create the queue used by the producer and consumer. */ + xPolledQueue = xQueueCreate( pollqQUEUE_SIZE, ( unsigned portBASE_TYPE ) sizeof( unsigned portSHORT ) ); + + /* vQueueAddToRegistry() adds the queue to the queue registry, if one is + in use. The queue registry is provided as a means for kernel aware + debuggers to locate queues and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( xPolledQueue, ( signed portCHAR * ) "AltPollQueue" ); + + + /* Spawn the producer and consumer. */ + xTaskCreate( vPolledQueueConsumer, ( signed portCHAR * ) "QConsNB", pollqSTACK_SIZE, ( void * ) &xPolledQueue, uxPriority, ( xTaskHandle * ) NULL ); + xTaskCreate( vPolledQueueProducer, ( signed portCHAR * ) "QProdNB", pollqSTACK_SIZE, ( void * ) &xPolledQueue, uxPriority, ( xTaskHandle * ) NULL ); +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vPolledQueueProducer, pvParameters ) +{ +unsigned portSHORT usValue = ( unsigned portSHORT ) 0; +signed portBASE_TYPE xError = pdFALSE, xLoop; + + #ifdef USE_STDIO + void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend ); + + const portCHAR * const pcTaskStartMsg = "Alt polling queue producer task started.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + #endif + + for( ;; ) + { + for( xLoop = 0; xLoop < pollqVALUES_TO_PRODUCE; xLoop++ ) + { + /* Send an incrementing number on the queue without blocking. */ + if( xQueueAltSendToBack( *( ( xQueueHandle * ) pvParameters ), ( void * ) &usValue, pollqNO_DELAY ) != pdPASS ) + { + /* We should never find the queue full so if we get here there + has been an error. */ + xError = pdTRUE; + } + else + { + if( xError == pdFALSE ) + { + /* If an error has ever been recorded we stop incrementing the + check variable. */ + portENTER_CRITICAL(); + xPollingProducerCount++; + portEXIT_CRITICAL(); + } + + /* Update the value we are going to post next time around. */ + usValue++; + } + } + + /* Wait before we start posting again to ensure the consumer runs and + empties the queue. */ + vTaskDelay( pollqPRODUCER_DELAY ); + } +} /*lint !e818 Function prototype must conform to API. */ +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vPolledQueueConsumer, pvParameters ) +{ +unsigned portSHORT usData, usExpectedValue = ( unsigned portSHORT ) 0; +signed portBASE_TYPE xError = pdFALSE; + + #ifdef USE_STDIO + void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend ); + + const portCHAR * const pcTaskStartMsg = "Alt blocking queue consumer task started.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + #endif + + for( ;; ) + { + /* Loop until the queue is empty. */ + while( uxQueueMessagesWaiting( *( ( xQueueHandle * ) pvParameters ) ) ) + { + if( xQueueAltReceive( *( ( xQueueHandle * ) pvParameters ), &usData, pollqNO_DELAY ) == pdPASS ) + { + if( usData != usExpectedValue ) + { + /* This is not what we expected to receive so an error has + occurred. */ + xError = pdTRUE; + + /* Catch-up to the value we received so our next expected + value should again be correct. */ + usExpectedValue = usData; + } + else + { + if( xError == pdFALSE ) + { + /* Only increment the check variable if no errors have + occurred. */ + portENTER_CRITICAL(); + xPollingConsumerCount++; + portEXIT_CRITICAL(); + } + } + + /* Next time round we would expect the number to be one higher. */ + usExpectedValue++; + } + } + + /* Now the queue is empty we block, allowing the producer to place more + items in the queue. */ + vTaskDelay( pollqCONSUMER_DELAY ); + } +} /*lint !e818 Function prototype must conform to API. */ +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running with no errors. */ +portBASE_TYPE xAreAltPollingQueuesStillRunning( void ) +{ +portBASE_TYPE xReturn; + + /* Check both the consumer and producer poll count to check they have both + been changed since out last trip round. We do not need a critical section + around the check variables as this is called from a higher priority than + the other tasks that access the same variables. */ + if( ( xPollingConsumerCount == pollqINITIAL_VALUE ) || + ( xPollingProducerCount == pollqINITIAL_VALUE ) + ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + /* Set the check variables back down so we know if they have been + incremented the next time around. */ + xPollingConsumerCount = pollqINITIAL_VALUE; + xPollingProducerCount = pollqINITIAL_VALUE; + + return xReturn; +} diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/AltQTest.c b/third_party/FreeRTOS/Demo/Common/Minimal/AltQTest.c new file mode 100644 index 0000000..9710336 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/AltQTest.c @@ -0,0 +1,587 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * This file implements the same demo and test as GenQTest.c, but uses the + * light weight API in place of the fully featured API. + * + * See the comments at the top of GenQTest.c for a description. + */ + + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +/* Demo program include files. */ +#include "AltQTest.h" + +#define genqQUEUE_LENGTH ( 5 ) +#define genqNO_BLOCK ( 0 ) + +#define genqMUTEX_LOW_PRIORITY ( tskIDLE_PRIORITY ) +#define genqMUTEX_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define genqMUTEX_MEDIUM_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define genqMUTEX_HIGH_PRIORITY ( tskIDLE_PRIORITY + 3 ) + +/*-----------------------------------------------------------*/ + +/* + * Tests the behaviour of the xQueueAltSendToFront() and xQueueAltSendToBack() + * macros by using both to fill a queue, then reading from the queue to + * check the resultant queue order is as expected. Queue data is also + * peeked. + */ +static void prvSendFrontAndBackTest( void *pvParameters ); + +/* + * The following three tasks are used to demonstrate the mutex behaviour. + * Each task is given a different priority to demonstrate the priority + * inheritance mechanism. + * + * The low priority task obtains a mutex. After this a high priority task + * attempts to obtain the same mutex, causing its priority to be inherited + * by the low priority task. The task with the inherited high priority then + * resumes a medium priority task to ensure it is not blocked by the medium + * priority task while it holds the inherited high priority. Once the mutex + * is returned the task with the inherited priority returns to its original + * low priority, and is therefore immediately preempted by first the high + * priority task and then the medium prioroity task before it can continue. + */ +static void prvLowPriorityMutexTask( void *pvParameters ); +static void prvMediumPriorityMutexTask( void *pvParameters ); +static void prvHighPriorityMutexTask( void *pvParameters ); + +/*-----------------------------------------------------------*/ + +/* Flag that will be latched to pdTRUE should any unexpected behaviour be +detected in any of the tasks. */ +static portBASE_TYPE xErrorDetected = pdFALSE; + +/* Counters that are incremented on each cycle of a test. This is used to +detect a stalled task - a test that is no longer running. */ +static volatile unsigned portLONG ulLoopCounter = 0; +static volatile unsigned portLONG ulLoopCounter2 = 0; + +/* The variable that is guarded by the mutex in the mutex demo tasks. */ +static volatile unsigned portLONG ulGuardedVariable = 0; + +/* Handles used in the mutext test to suspend and resume the high and medium +priority mutex test tasks. */ +static xTaskHandle xHighPriorityMutexTask, xMediumPriorityMutexTask; + +/*-----------------------------------------------------------*/ + +void vStartAltGenericQueueTasks( unsigned portBASE_TYPE uxPriority ) +{ +xQueueHandle xQueue; +xSemaphoreHandle xMutex; + + /* Create the queue that we are going to use for the + prvSendFrontAndBackTest demo. */ + xQueue = xQueueCreate( genqQUEUE_LENGTH, sizeof( unsigned portLONG ) ); + + /* vQueueAddToRegistry() adds the queue to the queue registry, if one is + in use. The queue registry is provided as a means for kernel aware + debuggers to locate queues and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( xQueue, ( signed portCHAR * ) "Alt_Gen_Test_Queue" ); + + /* Create the demo task and pass it the queue just created. We are + passing the queue handle by value so it does not matter that it is + declared on the stack here. */ + xTaskCreate( prvSendFrontAndBackTest, ( signed portCHAR * ) "FGenQ", configMINIMAL_STACK_SIZE, ( void * ) xQueue, uxPriority, NULL ); + + /* Create the mutex used by the prvMutexTest task. */ + xMutex = xSemaphoreCreateMutex(); + + /* vQueueAddToRegistry() adds the mutex to the registry, if one is + in use. The registry is provided as a means for kernel aware + debuggers to locate mutex and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( ( xQueueHandle ) xMutex, ( signed portCHAR * ) "Alt_Q_Mutex" ); + + /* Create the mutex demo tasks and pass it the mutex just created. We are + passing the mutex handle by value so it does not matter that it is declared + on the stack here. */ + xTaskCreate( prvLowPriorityMutexTask, ( signed portCHAR * ) "FMuLow", configMINIMAL_STACK_SIZE, ( void * ) xMutex, genqMUTEX_LOW_PRIORITY, NULL ); + xTaskCreate( prvMediumPriorityMutexTask, ( signed portCHAR * ) "FMuMed", configMINIMAL_STACK_SIZE, NULL, genqMUTEX_MEDIUM_PRIORITY, &xMediumPriorityMutexTask ); + xTaskCreate( prvHighPriorityMutexTask, ( signed portCHAR * ) "FMuHigh", configMINIMAL_STACK_SIZE, ( void * ) xMutex, genqMUTEX_HIGH_PRIORITY, &xHighPriorityMutexTask ); +} +/*-----------------------------------------------------------*/ + +static void prvSendFrontAndBackTest( void *pvParameters ) +{ +unsigned portLONG ulData, ulData2; +xQueueHandle xQueue; + + #ifdef USE_STDIO + void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend ); + + const portCHAR * const pcTaskStartMsg = "Alt queue SendToFront/SendToBack/Peek test started.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + #endif + + xQueue = ( xQueueHandle ) pvParameters; + + for( ;; ) + { + /* The queue is empty, so sending an item to the back of the queue + should have the same efect as sending it to the front of the queue. + + First send to the front and check everything is as expected. */ + xQueueAltSendToFront( xQueue, ( void * ) &ulLoopCounter, genqNO_BLOCK ); + + if( uxQueueMessagesWaiting( xQueue ) != 1 ) + { + xErrorDetected = pdTRUE; + } + + if( xQueueAltReceive( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + /* The data we sent to the queue should equal the data we just received + from the queue. */ + if( ulLoopCounter != ulData ) + { + xErrorDetected = pdTRUE; + } + + /* Then do the same, sending the data to the back, checking everything + is as expected. */ + if( uxQueueMessagesWaiting( xQueue ) != 0 ) + { + xErrorDetected = pdTRUE; + } + + xQueueAltSendToBack( xQueue, ( void * ) &ulLoopCounter, genqNO_BLOCK ); + + if( uxQueueMessagesWaiting( xQueue ) != 1 ) + { + xErrorDetected = pdTRUE; + } + + if( xQueueAltReceive( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + if( uxQueueMessagesWaiting( xQueue ) != 0 ) + { + xErrorDetected = pdTRUE; + } + + /* The data we sent to the queue should equal the data we just received + from the queue. */ + if( ulLoopCounter != ulData ) + { + xErrorDetected = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + + + /* Place 2, 3, 4 into the queue, adding items to the back of the queue. */ + for( ulData = 2; ulData < 5; ulData++ ) + { + xQueueAltSendToBack( xQueue, ( void * ) &ulData, genqNO_BLOCK ); + } + + /* Now the order in the queue should be 2, 3, 4, with 2 being the first + thing to be read out. Now add 1 then 0 to the front of the queue. */ + if( uxQueueMessagesWaiting( xQueue ) != 3 ) + { + xErrorDetected = pdTRUE; + } + ulData = 1; + xQueueAltSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK ); + ulData = 0; + xQueueAltSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK ); + + /* Now the queue should be full, and when we read the data out we + should receive 0, 1, 2, 3, 4. */ + if( uxQueueMessagesWaiting( xQueue ) != 5 ) + { + xErrorDetected = pdTRUE; + } + + if( xQueueAltSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != errQUEUE_FULL ) + { + xErrorDetected = pdTRUE; + } + + if( xQueueAltSendToBack( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != errQUEUE_FULL ) + { + xErrorDetected = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* Check the data we read out is in the expected order. */ + for( ulData = 0; ulData < genqQUEUE_LENGTH; ulData++ ) + { + /* Try peeking the data first. */ + if( xQueueAltPeek( xQueue, &ulData2, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + if( ulData != ulData2 ) + { + xErrorDetected = pdTRUE; + } + + + /* Now try receiving the data for real. The value should be the + same. Clobber the value first so we know we really received it. */ + ulData2 = ~ulData2; + if( xQueueAltReceive( xQueue, &ulData2, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + if( ulData != ulData2 ) + { + xErrorDetected = pdTRUE; + } + } + + /* The queue should now be empty again. */ + if( uxQueueMessagesWaiting( xQueue ) != 0 ) + { + xErrorDetected = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + + /* Our queue is empty once more, add 10, 11 to the back. */ + ulData = 10; + if( xQueueAltSendToBack( xQueue, &ulData, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + ulData = 11; + if( xQueueAltSendToBack( xQueue, &ulData, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + if( uxQueueMessagesWaiting( xQueue ) != 2 ) + { + xErrorDetected = pdTRUE; + } + + /* Now we should have 10, 11 in the queue. Add 7, 8, 9 to the + front. */ + for( ulData = 9; ulData >= 7; ulData-- ) + { + if( xQueueAltSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + } + + /* Now check that the queue is full, and that receiving data provides + the expected sequence of 7, 8, 9, 10, 11. */ + if( uxQueueMessagesWaiting( xQueue ) != 5 ) + { + xErrorDetected = pdTRUE; + } + + if( xQueueAltSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != errQUEUE_FULL ) + { + xErrorDetected = pdTRUE; + } + + if( xQueueAltSendToBack( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != errQUEUE_FULL ) + { + xErrorDetected = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* Check the data we read out is in the expected order. */ + for( ulData = 7; ulData < ( 7 + genqQUEUE_LENGTH ); ulData++ ) + { + if( xQueueAltReceive( xQueue, &ulData2, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + if( ulData != ulData2 ) + { + xErrorDetected = pdTRUE; + } + } + + if( uxQueueMessagesWaiting( xQueue ) != 0 ) + { + xErrorDetected = pdTRUE; + } + + ulLoopCounter++; + } +} +/*-----------------------------------------------------------*/ + +static void prvLowPriorityMutexTask( void *pvParameters ) +{ +xSemaphoreHandle xMutex = ( xSemaphoreHandle ) pvParameters; + + #ifdef USE_STDIO + void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend ); + + const portCHAR * const pcTaskStartMsg = "Fast mutex with priority inheritance test started.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + #endif + + ( void ) pvParameters; + + + for( ;; ) + { + /* Take the mutex. It should be available now. */ + if( xSemaphoreAltTake( xMutex, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + /* Set our guarded variable to a known start value. */ + ulGuardedVariable = 0; + + /* Our priority should be as per that assigned when the task was + created. */ + if( uxTaskPriorityGet( NULL ) != genqMUTEX_LOW_PRIORITY ) + { + xErrorDetected = pdTRUE; + } + + /* Now unsuspend the high priority task. This will attempt to take the + mutex, and block when it finds it cannot obtain it. */ + vTaskResume( xHighPriorityMutexTask ); + + /* We should now have inherited the prioritoy of the high priority task, + as by now it will have attempted to get the mutex. */ + if( uxTaskPriorityGet( NULL ) != genqMUTEX_HIGH_PRIORITY ) + { + xErrorDetected = pdTRUE; + } + + /* We can attempt to set our priority to the test priority - between the + idle priority and the medium/high test priorities, but our actual + prioroity should remain at the high priority. */ + vTaskPrioritySet( NULL, genqMUTEX_TEST_PRIORITY ); + if( uxTaskPriorityGet( NULL ) != genqMUTEX_HIGH_PRIORITY ) + { + xErrorDetected = pdTRUE; + } + + /* Now unsuspend the medium priority task. This should not run as our + inherited priority is above that of the medium priority task. */ + vTaskResume( xMediumPriorityMutexTask ); + + /* If the did run then it will have incremented our guarded variable. */ + if( ulGuardedVariable != 0 ) + { + xErrorDetected = pdTRUE; + } + + /* When we give back the semaphore our priority should be disinherited + back to the priority to which we attempted to set ourselves. This means + that when the high priority task next blocks, the medium priority task + should execute and increment the guarded variable. When we next run + both the high and medium priority tasks will have been suspended again. */ + if( xSemaphoreAltGive( xMutex ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + /* Check that the guarded variable did indeed increment... */ + if( ulGuardedVariable != 1 ) + { + xErrorDetected = pdTRUE; + } + + /* ... and that our priority has been disinherited to + genqMUTEX_TEST_PRIORITY. */ + if( uxTaskPriorityGet( NULL ) != genqMUTEX_TEST_PRIORITY ) + { + xErrorDetected = pdTRUE; + } + + /* Set our priority back to our original priority ready for the next + loop around this test. */ + vTaskPrioritySet( NULL, genqMUTEX_LOW_PRIORITY ); + + /* Just to show we are still running. */ + ulLoopCounter2++; + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + } +} +/*-----------------------------------------------------------*/ + +static void prvMediumPriorityMutexTask( void *pvParameters ) +{ + ( void ) pvParameters; + + for( ;; ) + { + /* The medium priority task starts by suspending itself. The low + priority task will unsuspend this task when required. */ + vTaskSuspend( NULL ); + + /* When this task unsuspends all it does is increment the guarded + variable, this is so the low priority task knows that it has + executed. */ + ulGuardedVariable++; + } +} +/*-----------------------------------------------------------*/ + +static void prvHighPriorityMutexTask( void *pvParameters ) +{ +xSemaphoreHandle xMutex = ( xSemaphoreHandle ) pvParameters; + + ( void ) pvParameters; + + for( ;; ) + { + /* The high priority task starts by suspending itself. The low + priority task will unsuspend this task when required. */ + vTaskSuspend( NULL ); + + /* When this task unsuspends all it does is attempt to obtain + the mutex. It should find the mutex is not available so a + block time is specified. */ + if( xSemaphoreAltTake( xMutex, portMAX_DELAY ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + /* When we eventually obtain the mutex we just give it back then + return to suspend ready for the next test. */ + if( xSemaphoreAltGive( xMutex ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreAltGenericQueueTasksStillRunning( void ) +{ +static unsigned portLONG ulLastLoopCounter = 0, ulLastLoopCounter2 = 0; + + /* If the demo task is still running then we expect the loopcounters to + have incremented since this function was last called. */ + if( ulLastLoopCounter == ulLoopCounter ) + { + xErrorDetected = pdTRUE; + } + + if( ulLastLoopCounter2 == ulLoopCounter2 ) + { + xErrorDetected = pdTRUE; + } + + ulLastLoopCounter = ulLoopCounter; + ulLastLoopCounter2 = ulLoopCounter2; + + /* Errors detected in the task itself will have latched xErrorDetected + to true. */ + + return !xErrorDetected; +} + + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/BlockQ.c b/third_party/FreeRTOS/Demo/Common/Minimal/BlockQ.c new file mode 100644 index 0000000..be19050 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/BlockQ.c @@ -0,0 +1,324 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * Creates six tasks that operate on three queues as follows: + * + * The first two tasks send and receive an incrementing number to/from a queue. + * One task acts as a producer and the other as the consumer. The consumer is a + * higher priority than the producer and is set to block on queue reads. The queue + * only has space for one item - as soon as the producer posts a message on the + * queue the consumer will unblock, pre-empt the producer, and remove the item. + * + * The second two tasks work the other way around. Again the queue used only has + * enough space for one item. This time the consumer has a lower priority than the + * producer. The producer will try to post on the queue blocking when the queue is + * full. When the consumer wakes it will remove the item from the queue, causing + * the producer to unblock, pre-empt the consumer, and immediately re-fill the + * queue. + * + * The last two tasks use the same queue producer and consumer functions. This time the queue has + * enough space for lots of items and the tasks operate at the same priority. The + * producer will execute, placing items into the queue. The consumer will start + * executing when either the queue becomes full (causing the producer to block) or + * a context switch occurs (tasks of the same priority will time slice). + * + */ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +/* Demo program include files. */ +#include "BlockQ.h" + +#define blckqSTACK_SIZE configMINIMAL_STACK_SIZE +#define blckqNUM_TASK_SETS ( 3 ) + +/* Structure used to pass parameters to the blocking queue tasks. */ +typedef struct BLOCKING_QUEUE_PARAMETERS +{ + xQueueHandle xQueue; /*< The queue to be used by the task. */ + portTickType xBlockTime; /*< The block time to use on queue reads/writes. */ + volatile short *psCheckVariable; /*< Incremented on each successful cycle to check the task is still running. */ +} xBlockingQueueParameters; + +/* Task function that creates an incrementing number and posts it on a queue. */ +static portTASK_FUNCTION_PROTO( vBlockingQueueProducer, pvParameters ); + +/* Task function that removes the incrementing number from a queue and checks that +it is the expected number. */ +static portTASK_FUNCTION_PROTO( vBlockingQueueConsumer, pvParameters ); + +/* Variables which are incremented each time an item is removed from a queue, and +found to be the expected value. +These are used to check that the tasks are still running. */ +static volatile short sBlockingConsumerCount[ blckqNUM_TASK_SETS ] = { ( unsigned short ) 0, ( unsigned short ) 0, ( unsigned short ) 0 }; + +/* Variable which are incremented each time an item is posted on a queue. These +are used to check that the tasks are still running. */ +static volatile short sBlockingProducerCount[ blckqNUM_TASK_SETS ] = { ( unsigned short ) 0, ( unsigned short ) 0, ( unsigned short ) 0 }; + +/*-----------------------------------------------------------*/ + +void vStartBlockingQueueTasks( unsigned portBASE_TYPE uxPriority ) +{ +xBlockingQueueParameters *pxQueueParameters1, *pxQueueParameters2; +xBlockingQueueParameters *pxQueueParameters3, *pxQueueParameters4; +xBlockingQueueParameters *pxQueueParameters5, *pxQueueParameters6; +const unsigned portBASE_TYPE uxQueueSize1 = 1, uxQueueSize5 = 5; +const portTickType xBlockTime = ( portTickType ) 1000 / portTICK_RATE_MS; +const portTickType xDontBlock = ( portTickType ) 0; + + /* Create the first two tasks as described at the top of the file. */ + + /* First create the structure used to pass parameters to the consumer tasks. */ + pxQueueParameters1 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + + /* Create the queue used by the first two tasks to pass the incrementing number. + Pass a pointer to the queue in the parameter structure. */ + pxQueueParameters1->xQueue = xQueueCreate( uxQueueSize1, ( unsigned portBASE_TYPE ) sizeof( unsigned short ) ); + + /* The consumer is created first so gets a block time as described above. */ + pxQueueParameters1->xBlockTime = xBlockTime; + + /* Pass in the variable that this task is going to increment so we can check it + is still running. */ + pxQueueParameters1->psCheckVariable = &( sBlockingConsumerCount[ 0 ] ); + + /* Create the structure used to pass parameters to the producer task. */ + pxQueueParameters2 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + + /* Pass the queue to this task also, using the parameter structure. */ + pxQueueParameters2->xQueue = pxQueueParameters1->xQueue; + + /* The producer is not going to block - as soon as it posts the consumer will + wake and remove the item so the producer should always have room to post. */ + pxQueueParameters2->xBlockTime = xDontBlock; + + /* Pass in the variable that this task is going to increment so we can check + it is still running. */ + pxQueueParameters2->psCheckVariable = &( sBlockingProducerCount[ 0 ] ); + + + /* Note the producer has a lower priority than the consumer when the tasks are + spawned. */ + xTaskCreate( vBlockingQueueConsumer, ( signed char * ) "QConsB1", blckqSTACK_SIZE, ( void * ) pxQueueParameters1, uxPriority, NULL ); + xTaskCreate( vBlockingQueueProducer, ( signed char * ) "QProdB2", blckqSTACK_SIZE, ( void * ) pxQueueParameters2, tskIDLE_PRIORITY, NULL ); + + + + /* Create the second two tasks as described at the top of the file. This uses + the same mechanism but reverses the task priorities. */ + + pxQueueParameters3 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + pxQueueParameters3->xQueue = xQueueCreate( uxQueueSize1, ( unsigned portBASE_TYPE ) sizeof( unsigned short ) ); + pxQueueParameters3->xBlockTime = xDontBlock; + pxQueueParameters3->psCheckVariable = &( sBlockingProducerCount[ 1 ] ); + + pxQueueParameters4 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + pxQueueParameters4->xQueue = pxQueueParameters3->xQueue; + pxQueueParameters4->xBlockTime = xBlockTime; + pxQueueParameters4->psCheckVariable = &( sBlockingConsumerCount[ 1 ] ); + + xTaskCreate( vBlockingQueueConsumer, ( signed char * ) "QConsB3", blckqSTACK_SIZE, ( void * ) pxQueueParameters3, tskIDLE_PRIORITY, NULL ); + xTaskCreate( vBlockingQueueProducer, ( signed char * ) "QProdB4", blckqSTACK_SIZE, ( void * ) pxQueueParameters4, uxPriority, NULL ); + + + + /* Create the last two tasks as described above. The mechanism is again just + the same. This time both parameter structures are given a block time. */ + pxQueueParameters5 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + pxQueueParameters5->xQueue = xQueueCreate( uxQueueSize5, ( unsigned portBASE_TYPE ) sizeof( unsigned short ) ); + pxQueueParameters5->xBlockTime = xBlockTime; + pxQueueParameters5->psCheckVariable = &( sBlockingProducerCount[ 2 ] ); + + pxQueueParameters6 = ( xBlockingQueueParameters * ) pvPortMalloc( sizeof( xBlockingQueueParameters ) ); + pxQueueParameters6->xQueue = pxQueueParameters5->xQueue; + pxQueueParameters6->xBlockTime = xBlockTime; + pxQueueParameters6->psCheckVariable = &( sBlockingConsumerCount[ 2 ] ); + + xTaskCreate( vBlockingQueueProducer, ( signed char * ) "QProdB5", blckqSTACK_SIZE, ( void * ) pxQueueParameters5, tskIDLE_PRIORITY, NULL ); + xTaskCreate( vBlockingQueueConsumer, ( signed char * ) "QConsB6", blckqSTACK_SIZE, ( void * ) pxQueueParameters6, tskIDLE_PRIORITY, NULL ); +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vBlockingQueueProducer, pvParameters ) +{ +unsigned short usValue = 0; +xBlockingQueueParameters *pxQueueParameters; +short sErrorEverOccurred = pdFALSE; + + pxQueueParameters = ( xBlockingQueueParameters * ) pvParameters; + + for( ;; ) + { + if( xQueueSend( pxQueueParameters->xQueue, ( void * ) &usValue, pxQueueParameters->xBlockTime ) != pdPASS ) + { + sErrorEverOccurred = pdTRUE; + } + else + { + /* We have successfully posted a message, so increment the variable + used to check we are still running. */ + if( sErrorEverOccurred == pdFALSE ) + { + ( *pxQueueParameters->psCheckVariable )++; + } + + /* Increment the variable we are going to post next time round. The + consumer will expect the numbers to follow in numerical order. */ + ++usValue; + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + } + } +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vBlockingQueueConsumer, pvParameters ) +{ +unsigned short usData, usExpectedValue = 0; +xBlockingQueueParameters *pxQueueParameters; +short sErrorEverOccurred = pdFALSE; + + pxQueueParameters = ( xBlockingQueueParameters * ) pvParameters; + + for( ;; ) + { + if( xQueueReceive( pxQueueParameters->xQueue, &usData, pxQueueParameters->xBlockTime ) == pdPASS ) + { + if( usData != usExpectedValue ) + { + /* Catch-up. */ + usExpectedValue = usData; + + sErrorEverOccurred = pdTRUE; + } + else + { + /* We have successfully received a message, so increment the + variable used to check we are still running. */ + if( sErrorEverOccurred == pdFALSE ) + { + ( *pxQueueParameters->psCheckVariable )++; + } + + /* Increment the value we expect to remove from the queue next time + round. */ + ++usExpectedValue; + } + + #if configUSE_PREEMPTION == 0 + { + if( pxQueueParameters->xBlockTime == 0 ) + { + taskYIELD(); + } + } + #endif + } + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreBlockingQueuesStillRunning( void ) +{ +static short sLastBlockingConsumerCount[ blckqNUM_TASK_SETS ] = { ( unsigned short ) 0, ( unsigned short ) 0, ( unsigned short ) 0 }; +static short sLastBlockingProducerCount[ blckqNUM_TASK_SETS ] = { ( unsigned short ) 0, ( unsigned short ) 0, ( unsigned short ) 0 }; +portBASE_TYPE xReturn = pdPASS, xTasks; + + /* Not too worried about mutual exclusion on these variables as they are 16 + bits and we are only reading them. We also only care to see if they have + changed or not. + + Loop through each check variable to and return pdFALSE if any are found not + to have changed since the last call. */ + + for( xTasks = 0; xTasks < blckqNUM_TASK_SETS; xTasks++ ) + { + if( sBlockingConsumerCount[ xTasks ] == sLastBlockingConsumerCount[ xTasks ] ) + { + xReturn = pdFALSE; + } + sLastBlockingConsumerCount[ xTasks ] = sBlockingConsumerCount[ xTasks ]; + + + if( sBlockingProducerCount[ xTasks ] == sLastBlockingProducerCount[ xTasks ] ) + { + xReturn = pdFALSE; + } + sLastBlockingProducerCount[ xTasks ] = sBlockingProducerCount[ xTasks ]; + } + + return xReturn; +} + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/GenQTest.c b/third_party/FreeRTOS/Demo/Common/Minimal/GenQTest.c new file mode 100644 index 0000000..90dac35 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/GenQTest.c @@ -0,0 +1,600 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * Tests the extra queue functionality introduced in FreeRTOS.org V4.5.0 - + * including xQueueSendToFront(), xQueueSendToBack(), xQueuePeek() and + * mutex behaviour. + * + * See the comments above the prvSendFrontAndBackTest() and + * prvLowPriorityMutexTask() prototypes below for more information. + */ + + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +/* Demo program include files. */ +#include "GenQTest.h" + +#define genqQUEUE_LENGTH ( 5 ) +#define genqNO_BLOCK ( 0 ) + +#define genqMUTEX_LOW_PRIORITY ( tskIDLE_PRIORITY ) +#define genqMUTEX_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define genqMUTEX_MEDIUM_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define genqMUTEX_HIGH_PRIORITY ( tskIDLE_PRIORITY + 3 ) + +/*-----------------------------------------------------------*/ + +/* + * Tests the behaviour of the xQueueSendToFront() and xQueueSendToBack() + * macros by using both to fill a queue, then reading from the queue to + * check the resultant queue order is as expected. Queue data is also + * peeked. + */ +static void prvSendFrontAndBackTest( void *pvParameters ); + +/* + * The following three tasks are used to demonstrate the mutex behaviour. + * Each task is given a different priority to demonstrate the priority + * inheritance mechanism. + * + * The low priority task obtains a mutex. After this a high priority task + * attempts to obtain the same mutex, causing its priority to be inherited + * by the low priority task. The task with the inherited high priority then + * resumes a medium priority task to ensure it is not blocked by the medium + * priority task while it holds the inherited high priority. Once the mutex + * is returned the task with the inherited priority returns to its original + * low priority, and is therefore immediately preempted by first the high + * priority task and then the medium prioroity task before it can continue. + */ +static void prvLowPriorityMutexTask( void *pvParameters ); +static void prvMediumPriorityMutexTask( void *pvParameters ); +static void prvHighPriorityMutexTask( void *pvParameters ); + +/*-----------------------------------------------------------*/ + +/* Flag that will be latched to pdTRUE should any unexpected behaviour be +detected in any of the tasks. */ +static volatile portBASE_TYPE xErrorDetected = pdFALSE; + +/* Counters that are incremented on each cycle of a test. This is used to +detect a stalled task - a test that is no longer running. */ +static volatile unsigned portLONG ulLoopCounter = 0; +static volatile unsigned portLONG ulLoopCounter2 = 0; + +/* The variable that is guarded by the mutex in the mutex demo tasks. */ +static volatile unsigned portLONG ulGuardedVariable = 0; + +/* Handles used in the mutext test to suspend and resume the high and medium +priority mutex test tasks. */ +static xTaskHandle xHighPriorityMutexTask, xMediumPriorityMutexTask; + +/*-----------------------------------------------------------*/ + +void vStartGenericQueueTasks( unsigned portBASE_TYPE uxPriority ) +{ +xQueueHandle xQueue; +xSemaphoreHandle xMutex; + + /* Create the queue that we are going to use for the + prvSendFrontAndBackTest demo. */ + xQueue = xQueueCreate( genqQUEUE_LENGTH, sizeof( unsigned portLONG ) ); + + /* vQueueAddToRegistry() adds the queue to the queue registry, if one is + in use. The queue registry is provided as a means for kernel aware + debuggers to locate queues and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( xQueue, ( signed portCHAR * ) "Gen_Queue_Test" ); + + /* Create the demo task and pass it the queue just created. We are + passing the queue handle by value so it does not matter that it is + declared on the stack here. */ + xTaskCreate( prvSendFrontAndBackTest, ( signed portCHAR * )"GenQ", configMINIMAL_STACK_SIZE, ( void * ) xQueue, uxPriority, NULL ); + + /* Create the mutex used by the prvMutexTest task. */ + xMutex = xSemaphoreCreateMutex(); + + /* vQueueAddToRegistry() adds the mutex to the registry, if one is + in use. The registry is provided as a means for kernel aware + debuggers to locate mutexes and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( ( xQueueHandle ) xMutex, ( signed portCHAR * ) "Gen_Queue_Mutex" ); + + /* Create the mutex demo tasks and pass it the mutex just created. We are + passing the mutex handle by value so it does not matter that it is declared + on the stack here. */ + xTaskCreate( prvLowPriorityMutexTask, ( signed portCHAR * )"MuLow", configMINIMAL_STACK_SIZE, ( void * ) xMutex, genqMUTEX_LOW_PRIORITY, NULL ); + xTaskCreate( prvMediumPriorityMutexTask, ( signed portCHAR * )"MuMed", configMINIMAL_STACK_SIZE, NULL, genqMUTEX_MEDIUM_PRIORITY, &xMediumPriorityMutexTask ); + xTaskCreate( prvHighPriorityMutexTask, ( signed portCHAR * )"MuHigh", configMINIMAL_STACK_SIZE, ( void * ) xMutex, genqMUTEX_HIGH_PRIORITY, &xHighPriorityMutexTask ); +} +/*-----------------------------------------------------------*/ + +static void prvSendFrontAndBackTest( void *pvParameters ) +{ +unsigned portLONG ulData, ulData2; +xQueueHandle xQueue; + + #ifdef USE_STDIO + void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend ); + + const portCHAR * const pcTaskStartMsg = "Queue SendToFront/SendToBack/Peek test started.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + #endif + + xQueue = ( xQueueHandle ) pvParameters; + + for( ;; ) + { + /* The queue is empty, so sending an item to the back of the queue + should have the same efect as sending it to the front of the queue. + + First send to the front and check everything is as expected. */ + xQueueSendToFront( xQueue, ( void * ) &ulLoopCounter, genqNO_BLOCK ); + + if( uxQueueMessagesWaiting( xQueue ) != 1 ) + { + xErrorDetected = pdTRUE; + } + + if( xQueueReceive( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + /* The data we sent to the queue should equal the data we just received + from the queue. */ + if( ulLoopCounter != ulData ) + { + xErrorDetected = pdTRUE; + } + + /* Then do the same, sending the data to the back, checking everything + is as expected. */ + if( uxQueueMessagesWaiting( xQueue ) != 0 ) + { + xErrorDetected = pdTRUE; + } + + xQueueSendToBack( xQueue, ( void * ) &ulLoopCounter, genqNO_BLOCK ); + + if( uxQueueMessagesWaiting( xQueue ) != 1 ) + { + xErrorDetected = pdTRUE; + } + + if( xQueueReceive( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + if( uxQueueMessagesWaiting( xQueue ) != 0 ) + { + xErrorDetected = pdTRUE; + } + + /* The data we sent to the queue should equal the data we just received + from the queue. */ + if( ulLoopCounter != ulData ) + { + xErrorDetected = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + + + /* Place 2, 3, 4 into the queue, adding items to the back of the queue. */ + for( ulData = 2; ulData < 5; ulData++ ) + { + xQueueSendToBack( xQueue, ( void * ) &ulData, genqNO_BLOCK ); + } + + /* Now the order in the queue should be 2, 3, 4, with 2 being the first + thing to be read out. Now add 1 then 0 to the front of the queue. */ + if( uxQueueMessagesWaiting( xQueue ) != 3 ) + { + xErrorDetected = pdTRUE; + } + ulData = 1; + xQueueSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK ); + ulData = 0; + xQueueSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK ); + + /* Now the queue should be full, and when we read the data out we + should receive 0, 1, 2, 3, 4. */ + if( uxQueueMessagesWaiting( xQueue ) != 5 ) + { + xErrorDetected = pdTRUE; + } + + if( xQueueSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != errQUEUE_FULL ) + { + xErrorDetected = pdTRUE; + } + + if( xQueueSendToBack( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != errQUEUE_FULL ) + { + xErrorDetected = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* Check the data we read out is in the expected order. */ + for( ulData = 0; ulData < genqQUEUE_LENGTH; ulData++ ) + { + /* Try peeking the data first. */ + if( xQueuePeek( xQueue, &ulData2, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + if( ulData != ulData2 ) + { + xErrorDetected = pdTRUE; + } + + + /* Now try receiving the data for real. The value should be the + same. Clobber the value first so we know we really received it. */ + ulData2 = ~ulData2; + if( xQueueReceive( xQueue, &ulData2, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + if( ulData != ulData2 ) + { + xErrorDetected = pdTRUE; + } + } + + /* The queue should now be empty again. */ + if( uxQueueMessagesWaiting( xQueue ) != 0 ) + { + xErrorDetected = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + + /* Our queue is empty once more, add 10, 11 to the back. */ + ulData = 10; + if( xQueueSend( xQueue, &ulData, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + ulData = 11; + if( xQueueSend( xQueue, &ulData, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + if( uxQueueMessagesWaiting( xQueue ) != 2 ) + { + xErrorDetected = pdTRUE; + } + + /* Now we should have 10, 11 in the queue. Add 7, 8, 9 to the + front. */ + for( ulData = 9; ulData >= 7; ulData-- ) + { + if( xQueueSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + } + + /* Now check that the queue is full, and that receiving data provides + the expected sequence of 7, 8, 9, 10, 11. */ + if( uxQueueMessagesWaiting( xQueue ) != 5 ) + { + xErrorDetected = pdTRUE; + } + + if( xQueueSendToFront( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != errQUEUE_FULL ) + { + xErrorDetected = pdTRUE; + } + + if( xQueueSendToBack( xQueue, ( void * ) &ulData, genqNO_BLOCK ) != errQUEUE_FULL ) + { + xErrorDetected = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* Check the data we read out is in the expected order. */ + for( ulData = 7; ulData < ( 7 + genqQUEUE_LENGTH ); ulData++ ) + { + if( xQueueReceive( xQueue, &ulData2, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + if( ulData != ulData2 ) + { + xErrorDetected = pdTRUE; + } + } + + if( uxQueueMessagesWaiting( xQueue ) != 0 ) + { + xErrorDetected = pdTRUE; + } + + ulLoopCounter++; + } +} +/*-----------------------------------------------------------*/ + +static void prvLowPriorityMutexTask( void *pvParameters ) +{ +xSemaphoreHandle xMutex = ( xSemaphoreHandle ) pvParameters; + + #ifdef USE_STDIO + void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend ); + + const portCHAR * const pcTaskStartMsg = "Mutex with priority inheritance test started.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + #endif + + for( ;; ) + { + /* Take the mutex. It should be available now. */ + if( xSemaphoreTake( xMutex, genqNO_BLOCK ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + /* Set our guarded variable to a known start value. */ + ulGuardedVariable = 0; + + /* Our priority should be as per that assigned when the task was + created. */ + if( uxTaskPriorityGet( NULL ) != genqMUTEX_LOW_PRIORITY ) + { + xErrorDetected = pdTRUE; + } + + /* Now unsuspend the high priority task. This will attempt to take the + mutex, and block when it finds it cannot obtain it. */ + vTaskResume( xHighPriorityMutexTask ); + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* Ensure the task is reporting it priority as blocked and not + suspended (as it would have done in versions up to V7.5.3). */ + #if( INCLUDE_eTaskGetState == 1 ) + { + configASSERT( eTaskGetState( xHighPriorityMutexTask ) == eBlocked ); + } + #endif /* INCLUDE_eTaskGetState */ + + /* We should now have inherited the prioritoy of the high priority task, + as by now it will have attempted to get the mutex. */ + if( uxTaskPriorityGet( NULL ) != genqMUTEX_HIGH_PRIORITY ) + { + xErrorDetected = pdTRUE; + } + + /* We can attempt to set our priority to the test priority - between the + idle priority and the medium/high test priorities, but our actual + prioroity should remain at the high priority. */ + vTaskPrioritySet( NULL, genqMUTEX_TEST_PRIORITY ); + if( uxTaskPriorityGet( NULL ) != genqMUTEX_HIGH_PRIORITY ) + { + xErrorDetected = pdTRUE; + } + + /* Now unsuspend the medium priority task. This should not run as our + inherited priority is above that of the medium priority task. */ + vTaskResume( xMediumPriorityMutexTask ); + + /* If the did run then it will have incremented our guarded variable. */ + if( ulGuardedVariable != 0 ) + { + xErrorDetected = pdTRUE; + } + + /* When we give back the semaphore our priority should be disinherited + back to the priority to which we attempted to set ourselves. This means + that when the high priority task next blocks, the medium priority task + should execute and increment the guarded variable. When we next run + both the high and medium priority tasks will have been suspended again. */ + if( xSemaphoreGive( xMutex ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* Check that the guarded variable did indeed increment... */ + if( ulGuardedVariable != 1 ) + { + xErrorDetected = pdTRUE; + } + + /* ... and that our priority has been disinherited to + genqMUTEX_TEST_PRIORITY. */ + if( uxTaskPriorityGet( NULL ) != genqMUTEX_TEST_PRIORITY ) + { + xErrorDetected = pdTRUE; + } + + /* Set our priority back to our original priority ready for the next + loop around this test. */ + vTaskPrioritySet( NULL, genqMUTEX_LOW_PRIORITY ); + + /* Just to show we are still running. */ + ulLoopCounter2++; + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + } +} +/*-----------------------------------------------------------*/ + +static void prvMediumPriorityMutexTask( void *pvParameters ) +{ + ( void ) pvParameters; + + for( ;; ) + { + /* The medium priority task starts by suspending itself. The low + priority task will unsuspend this task when required. */ + vTaskSuspend( NULL ); + + /* When this task unsuspends all it does is increment the guarded + variable, this is so the low priority task knows that it has + executed. */ + ulGuardedVariable++; + } +} +/*-----------------------------------------------------------*/ + +static void prvHighPriorityMutexTask( void *pvParameters ) +{ +xSemaphoreHandle xMutex = ( xSemaphoreHandle ) pvParameters; + + for( ;; ) + { + /* The high priority task starts by suspending itself. The low + priority task will unsuspend this task when required. */ + vTaskSuspend( NULL ); + + /* When this task unsuspends all it does is attempt to obtain + the mutex. It should find the mutex is not available so a + block time is specified. */ + if( xSemaphoreTake( xMutex, portMAX_DELAY ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + /* When we eventually obtain the mutex we just give it back then + return to suspend ready for the next test. */ + if( xSemaphoreGive( xMutex ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreGenericQueueTasksStillRunning( void ) +{ +static unsigned portLONG ulLastLoopCounter = 0, ulLastLoopCounter2 = 0; + + /* If the demo task is still running then we expect the loopcounters to + have incremented since this function was last called. */ + if( ulLastLoopCounter == ulLoopCounter ) + { + xErrorDetected = pdTRUE; + } + + if( ulLastLoopCounter2 == ulLoopCounter2 ) + { + xErrorDetected = pdTRUE; + } + + ulLastLoopCounter = ulLoopCounter; + ulLastLoopCounter2 = ulLoopCounter2; + + /* Errors detected in the task itself will have latched xErrorDetected + to true. */ + + return ( portBASE_TYPE ) !xErrorDetected; +} + + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/IntQueue.c b/third_party/FreeRTOS/Demo/Common/Minimal/IntQueue.c new file mode 100644 index 0000000..42d2103 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/IntQueue.c @@ -0,0 +1,756 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This file defines one of the more complex set of demo/test tasks. They are + * designed to stress test the queue implementation though pseudo simultaneous + * multiple reads and multiple writes from both tasks of varying priority and + * interrupts. The interrupts are prioritised such to ensure that nesting + * occurs (for those ports that support it). + * + * The test ensures that, while being accessed from three tasks and two + * interrupts, all the data sent to the queues is also received from + * the same queue, and that no duplicate items are either sent or received. + * The tests also ensure that a low priority task is never able to successfully + * read from or write to a queue when a task of higher priority is attempting + * the same operation. + */ + +/* Standard includes. */ +#include + +/* SafeRTOS includes. */ +#include "FreeRTOS.h" +#include "queue.h" +#include "task.h" + +/* Demo app includes. */ +#include "IntQueue.h" +#include "IntQueueTimer.h" + +/* Priorities used by test tasks. */ +#ifndef intqHIGHER_PRIORITY + #define intqHIGHER_PRIORITY ( configMAX_PRIORITIES - 2 ) +#endif +#define intqLOWER_PRIORITY ( tskIDLE_PRIORITY ) + +/* The number of values to send/receive before checking that all values were +processed as expected. */ +#define intqNUM_VALUES_TO_LOG ( 200 ) +#define intqSHORT_DELAY ( 140 ) + +/* The value by which the value being sent to or received from a queue should +increment past intqNUM_VALUES_TO_LOG before we check that all values have been +sent/received correctly. This is done to ensure that all tasks and interrupts +accessing the queue have completed their accesses with the +intqNUM_VALUES_TO_LOG range. */ +#define intqVALUE_OVERRUN ( 50 ) + +/* The delay used by the polling task. A short delay is used for code +coverage. */ +#define intqONE_TICK_DELAY ( 1 ) + +/* Each task and interrupt is given a unique identifier. This value is used to +identify which task sent or received each value. The identifier is also used +to distinguish between two tasks that are running the same task function. */ +#define intqHIGH_PRIORITY_TASK1 ( ( unsigned portBASE_TYPE ) 1 ) +#define intqHIGH_PRIORITY_TASK2 ( ( unsigned portBASE_TYPE ) 2 ) +#define intqLOW_PRIORITY_TASK ( ( unsigned portBASE_TYPE ) 3 ) +#define intqFIRST_INTERRUPT ( ( unsigned portBASE_TYPE ) 4 ) +#define intqSECOND_INTERRUPT ( ( unsigned portBASE_TYPE ) 5 ) +#define intqQUEUE_LENGTH ( ( unsigned portBASE_TYPE ) 10 ) + +/* At least intqMIN_ACCEPTABLE_TASK_COUNT values should be sent to/received +from each queue by each task, otherwise an error is detected. */ +#define intqMIN_ACCEPTABLE_TASK_COUNT ( 5 ) + +/* Send the next value to the queue that is normally empty. This is called +from within the interrupts. */ +#define timerNORMALLY_EMPTY_TX() \ + if( xQueueIsQueueFullFromISR( xNormallyEmptyQueue ) != pdTRUE ) \ + { \ + unsigned portBASE_TYPE uxSavedInterruptStatus; \ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); \ + { \ + uxValueForNormallyEmptyQueue++; \ + xQueueSendFromISR( xNormallyEmptyQueue, ( void * ) &uxValueForNormallyEmptyQueue, &xHigherPriorityTaskWoken ); \ + } \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ + } \ + +/* Send the next value to the queue that is normally full. This is called +from within the interrupts. */ +#define timerNORMALLY_FULL_TX() \ + if( xQueueIsQueueFullFromISR( xNormallyFullQueue ) != pdTRUE ) \ + { \ + unsigned portBASE_TYPE uxSavedInterruptStatus; \ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); \ + { \ + uxValueForNormallyFullQueue++; \ + xQueueSendFromISR( xNormallyFullQueue, ( void * ) &uxValueForNormallyFullQueue, &xHigherPriorityTaskWoken ); \ + } \ + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \ + } \ + +/* Receive a value from the normally empty queue. This is called from within +an interrupt. */ +#define timerNORMALLY_EMPTY_RX() \ + if( xQueueReceiveFromISR( xNormallyEmptyQueue, &uxRxedValue, &xHigherPriorityTaskWoken ) != pdPASS ) \ + { \ + prvQueueAccessLogError( __LINE__ ); \ + } \ + else \ + { \ + prvRecordValue_NormallyEmpty( uxRxedValue, intqSECOND_INTERRUPT ); \ + } + +/* Receive a value from the normally full queue. This is called from within +an interrupt. */ +#define timerNORMALLY_FULL_RX() \ + if( xQueueReceiveFromISR( xNormallyFullQueue, &uxRxedValue, &xHigherPriorityTaskWoken ) == pdPASS ) \ + { \ + prvRecordValue_NormallyFull( uxRxedValue, intqSECOND_INTERRUPT ); \ + } \ + + +/*-----------------------------------------------------------*/ + +/* The two queues used by the test. */ +static xQueueHandle xNormallyEmptyQueue, xNormallyFullQueue; + +/* Variables used to detect a stall in one of the tasks. */ +static unsigned portBASE_TYPE uxHighPriorityLoops1 = 0, uxHighPriorityLoops2 = 0, uxLowPriorityLoops1 = 0, uxLowPriorityLoops2 = 0; + +/* Any unexpected behaviour sets xErrorStatus to fail and log the line that +caused the error in xErrorLine. */ +static portBASE_TYPE xErrorStatus = pdPASS; +static volatile unsigned portBASE_TYPE xErrorLine = ( unsigned portBASE_TYPE ) 0; + +/* Used for sequencing between tasks. */ +static portBASE_TYPE xWasSuspended = pdFALSE; + +/* The values that are sent to the queues. An incremented value is sent each +time to each queue. */ +volatile unsigned portBASE_TYPE uxValueForNormallyEmptyQueue = 0, uxValueForNormallyFullQueue = 0; + +/* A handle to some of the tasks is required so they can be suspended/resumed. */ +xTaskHandle xHighPriorityNormallyEmptyTask1, xHighPriorityNormallyEmptyTask2, xHighPriorityNormallyFullTask1, xHighPriorityNormallyFullTask2; + +/* When a value is received in a queue the value is ticked off in the array +the array position of the value is set to a the identifier of the task or +interrupt that accessed the queue. This way missing or duplicate values can be +detected. */ +static unsigned portCHAR ucNormallyEmptyReceivedValues[ intqNUM_VALUES_TO_LOG ] = { 0 }; +static unsigned portCHAR ucNormallyFullReceivedValues[ intqNUM_VALUES_TO_LOG ] = { 0 }; + +/* The test tasks themselves. */ +static void prvLowerPriorityNormallyEmptyTask( void *pvParameters ); +static void prvLowerPriorityNormallyFullTask( void *pvParameters ); +static void prvHigherPriorityNormallyEmptyTask( void *pvParameters ); +static void prv1stHigherPriorityNormallyFullTask( void *pvParameters ); +static void prv2ndHigherPriorityNormallyFullTask( void *pvParameters ); + +/* Used to mark the positions within the ucNormallyEmptyReceivedValues and +ucNormallyFullReceivedValues arrays, while checking for duplicates. */ +static void prvRecordValue_NormallyEmpty( unsigned portBASE_TYPE uxValue, unsigned portBASE_TYPE uxSource ); +static void prvRecordValue_NormallyFull( unsigned portBASE_TYPE uxValue, unsigned portBASE_TYPE uxSource ); + +/* Logs the line on which an error occurred. */ +static void prvQueueAccessLogError( unsigned portBASE_TYPE uxLine ); + +/*-----------------------------------------------------------*/ + +void vStartInterruptQueueTasks( void ) +{ + /* Start the test tasks. */ + xTaskCreate( prvHigherPriorityNormallyEmptyTask, ( signed portCHAR * ) "H1QRx", configMINIMAL_STACK_SIZE, ( void * ) intqHIGH_PRIORITY_TASK1, intqHIGHER_PRIORITY, &xHighPriorityNormallyEmptyTask1 ); + xTaskCreate( prvHigherPriorityNormallyEmptyTask, ( signed portCHAR * ) "H2QRx", configMINIMAL_STACK_SIZE, ( void * ) intqHIGH_PRIORITY_TASK2, intqHIGHER_PRIORITY, &xHighPriorityNormallyEmptyTask2 ); + xTaskCreate( prvLowerPriorityNormallyEmptyTask, ( signed portCHAR * ) "L1QRx", configMINIMAL_STACK_SIZE, NULL, intqLOWER_PRIORITY, NULL ); + xTaskCreate( prv1stHigherPriorityNormallyFullTask, ( signed portCHAR * ) "H1QTx", configMINIMAL_STACK_SIZE, ( void * ) intqHIGH_PRIORITY_TASK1, intqHIGHER_PRIORITY, &xHighPriorityNormallyFullTask1 ); + xTaskCreate( prv2ndHigherPriorityNormallyFullTask, ( signed portCHAR * ) "H2QTx", configMINIMAL_STACK_SIZE, ( void * ) intqHIGH_PRIORITY_TASK2, intqHIGHER_PRIORITY, &xHighPriorityNormallyFullTask2 ); + xTaskCreate( prvLowerPriorityNormallyFullTask, ( signed portCHAR * ) "L2QRx", configMINIMAL_STACK_SIZE, NULL, intqLOWER_PRIORITY, NULL ); + + /* Create the queues that are accessed by multiple tasks and multiple + interrupts. */ + xNormallyFullQueue = xQueueCreate( intqQUEUE_LENGTH, ( unsigned portBASE_TYPE ) sizeof( unsigned portBASE_TYPE ) ); + xNormallyEmptyQueue = xQueueCreate( intqQUEUE_LENGTH, ( unsigned portBASE_TYPE ) sizeof( unsigned portBASE_TYPE ) ); + + /* vQueueAddToRegistry() adds the queue to the queue registry, if one is + in use. The queue registry is provided as a means for kernel aware + debuggers to locate queues and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( xNormallyFullQueue, ( signed portCHAR * ) "NormallyFull" ); + vQueueAddToRegistry( xNormallyEmptyQueue, ( signed portCHAR * ) "NormallyEmpty" ); +} +/*-----------------------------------------------------------*/ + +static void prvRecordValue_NormallyFull( unsigned portBASE_TYPE uxValue, unsigned portBASE_TYPE uxSource ) +{ + if( uxValue < intqNUM_VALUES_TO_LOG ) + { + /* We don't expect to receive the same value twice, so if the value + has already been marked as received an error has occurred. */ + if( ucNormallyFullReceivedValues[ uxValue ] != 0x00 ) + { + prvQueueAccessLogError( __LINE__ ); + } + + /* Log that this value has been received. */ + ucNormallyFullReceivedValues[ uxValue ] = uxSource; + } +} +/*-----------------------------------------------------------*/ + +static void prvRecordValue_NormallyEmpty( unsigned portBASE_TYPE uxValue, unsigned portBASE_TYPE uxSource ) +{ + if( uxValue < intqNUM_VALUES_TO_LOG ) + { + /* We don't expect to receive the same value twice, so if the value + has already been marked as received an error has occurred. */ + if( ucNormallyEmptyReceivedValues[ uxValue ] != 0x00 ) + { + prvQueueAccessLogError( __LINE__ ); + } + + /* Log that this value has been received. */ + ucNormallyEmptyReceivedValues[ uxValue ] = uxSource; + } +} +/*-----------------------------------------------------------*/ + +static void prvQueueAccessLogError( unsigned portBASE_TYPE uxLine ) +{ + /* Latch the line number that caused the error. */ + xErrorLine = uxLine; + xErrorStatus = pdFAIL; +} +/*-----------------------------------------------------------*/ + +static void prvHigherPriorityNormallyEmptyTask( void *pvParameters ) +{ +unsigned portBASE_TYPE uxRxed, ux, uxTask1, uxTask2, uxInterrupts, uxErrorCount1 = 0, uxErrorCount2 = 0; + + /* The timer should not be started until after the scheduler has started. + More than one task is running this code so we check the parameter value + to determine which task should start the timer. */ + if( ( unsigned portBASE_TYPE ) pvParameters == intqHIGH_PRIORITY_TASK1 ) + { + vInitialiseTimerForIntQueueTest(); + } + + for( ;; ) + { + /* Block waiting to receive a value from the normally empty queue. + Interrupts will write to the queue so we should receive a value. */ + if( xQueueReceive( xNormallyEmptyQueue, &uxRxed, intqSHORT_DELAY ) != pdPASS ) + { + prvQueueAccessLogError( __LINE__ ); + } + else + { + /* Note which value was received so we can check all expected + values are received and no values are duplicated. */ + prvRecordValue_NormallyEmpty( uxRxed, ( unsigned portBASE_TYPE ) pvParameters ); + } + + /* Ensure the other task running this code gets a chance to execute. */ + taskYIELD(); + + if( ( unsigned portBASE_TYPE ) pvParameters == intqHIGH_PRIORITY_TASK1 ) + { + /* Have we received all the expected values? */ + if( uxValueForNormallyEmptyQueue > ( intqNUM_VALUES_TO_LOG + intqVALUE_OVERRUN ) ) + { + vTaskSuspend( xHighPriorityNormallyEmptyTask2 ); + + uxTask1 = 0; + uxTask2 = 0; + uxInterrupts = 0; + + /* Loop through the array, checking that both tasks have + placed values into the array, and that no values are missing. + Start at 1 as we expect position 0 to be unused. */ + for( ux = 1; ux < intqNUM_VALUES_TO_LOG; ux++ ) + { + if( ucNormallyEmptyReceivedValues[ ux ] == 0 ) + { + /* A value is missing. */ + prvQueueAccessLogError( __LINE__ ); + } + else + { + if( ucNormallyEmptyReceivedValues[ ux ] == intqHIGH_PRIORITY_TASK1 ) + { + /* Value was placed into the array by task 1. */ + uxTask1++; + } + else if( ucNormallyEmptyReceivedValues[ ux ] == intqHIGH_PRIORITY_TASK2 ) + { + /* Value was placed into the array by task 2. */ + uxTask2++; + } + else if( ucNormallyEmptyReceivedValues[ ux ] == intqSECOND_INTERRUPT ) + { + uxInterrupts++; + } + } + } + + if( uxTask1 < intqMIN_ACCEPTABLE_TASK_COUNT ) + { + /* Only task 2 seemed to log any values. */ + uxErrorCount1++; + if( uxErrorCount1 > 2 ) + { + prvQueueAccessLogError( __LINE__ ); + } + } + else + { + uxErrorCount1 = 0; + } + + if( uxTask2 < intqMIN_ACCEPTABLE_TASK_COUNT ) + { + /* Only task 1 seemed to log any values. */ + uxErrorCount2++; + if( uxErrorCount2 > 2 ) + { + prvQueueAccessLogError( __LINE__ ); + } + } + else + { + uxErrorCount2 = 0; + } + + if( uxInterrupts == 0 ) + { + prvQueueAccessLogError( __LINE__ ); + } + + /* Clear the array again, ready to start a new cycle. */ + memset( ucNormallyEmptyReceivedValues, 0x00, sizeof( ucNormallyEmptyReceivedValues ) ); + + uxHighPriorityLoops1++; + uxValueForNormallyEmptyQueue = 0; + + /* Suspend ourselves, allowing the lower priority task to + actually receive something from the queue. Until now it + will have been prevented from doing so by the higher + priority tasks. The lower priority task will resume us + if it receives something. We will then resume the other + higher priority task. */ + vTaskSuspend( NULL ); + vTaskResume( xHighPriorityNormallyEmptyTask2 ); + } + } + } +} +/*-----------------------------------------------------------*/ + +static void prvLowerPriorityNormallyEmptyTask( void *pvParameters ) +{ +unsigned portBASE_TYPE uxValue, uxRxed; + + /* The parameters are not being used so avoid compiler warnings. */ + ( void ) pvParameters; + + for( ;; ) + { + if( xQueueReceive( xNormallyEmptyQueue, &uxRxed, intqONE_TICK_DELAY ) != errQUEUE_EMPTY ) + { + /* We should only obtain a value when the high priority task is + suspended. */ + if( xTaskIsTaskSuspended( xHighPriorityNormallyEmptyTask1 ) == pdFALSE ) + { + prvQueueAccessLogError( __LINE__ ); + } + + prvRecordValue_NormallyEmpty( uxRxed, intqLOW_PRIORITY_TASK ); + + /* Wake the higher priority task again. */ + vTaskResume( xHighPriorityNormallyEmptyTask1 ); + uxLowPriorityLoops1++; + } + else + { + /* Raise our priority while we send so we can preempt the higher + priority task, and ensure we get the Tx value into the queue. */ + vTaskPrioritySet( NULL, intqHIGHER_PRIORITY + 1 ); + + portENTER_CRITICAL(); + { + uxValueForNormallyEmptyQueue++; + uxValue = uxValueForNormallyEmptyQueue; + } + portEXIT_CRITICAL(); + + if( xQueueSend( xNormallyEmptyQueue, &uxValue, portMAX_DELAY ) != pdPASS ) + { + prvQueueAccessLogError( __LINE__ ); + } + + vTaskPrioritySet( NULL, intqLOWER_PRIORITY ); + } + } +} +/*-----------------------------------------------------------*/ + +static void prv1stHigherPriorityNormallyFullTask( void *pvParameters ) +{ +unsigned portBASE_TYPE uxValueToTx, ux, uxInterrupts; + + /* The parameters are not being used so avoid compiler warnings. */ + ( void ) pvParameters; + + /* Make sure the queue starts full or near full. >> 1 as there are two + high priority tasks. */ + for( ux = 0; ux < ( intqQUEUE_LENGTH >> 1 ); ux++ ) + { + portENTER_CRITICAL(); + { + uxValueForNormallyFullQueue++; + uxValueToTx = uxValueForNormallyFullQueue; + } + portEXIT_CRITICAL(); + + xQueueSend( xNormallyFullQueue, &uxValueToTx, intqSHORT_DELAY ); + } + + for( ;; ) + { + portENTER_CRITICAL(); + { + uxValueForNormallyFullQueue++; + uxValueToTx = uxValueForNormallyFullQueue; + } + portEXIT_CRITICAL(); + + if( xQueueSend( xNormallyFullQueue, &uxValueToTx, intqSHORT_DELAY ) != pdPASS ) + { + /* intqHIGH_PRIORITY_TASK2 is never suspended so we would not + expect it to ever time out. */ + prvQueueAccessLogError( __LINE__ ); + } + + /* Allow the other task running this code to run. */ + taskYIELD(); + + /* Have all the expected values been sent to the queue? */ + if( uxValueToTx > ( intqNUM_VALUES_TO_LOG + intqVALUE_OVERRUN ) ) + { + /* Make sure the other high priority task completes its send of + any values below intqNUM_VALUE_TO_LOG. */ + vTaskDelay( intqSHORT_DELAY ); + + vTaskSuspend( xHighPriorityNormallyFullTask2 ); + + if( xWasSuspended == pdTRUE ) + { + /* We would have expected the other high priority task to have + set this back to false by now. */ + prvQueueAccessLogError( __LINE__ ); + } + + /* Set the suspended flag so an error is not logged if the other + task recognises a time out when it is unsuspended. */ + xWasSuspended = pdTRUE; + + /* Check interrupts are also sending. */ + uxInterrupts = 0U; + + /* Start at 1 as we expect position 0 to be unused. */ + for( ux = 1; ux < intqNUM_VALUES_TO_LOG; ux++ ) + { + if( ucNormallyFullReceivedValues[ ux ] == 0 ) + { + /* A value was missing. */ + prvQueueAccessLogError( __LINE__ ); + } + else if( ucNormallyFullReceivedValues[ ux ] == intqSECOND_INTERRUPT ) + { + uxInterrupts++; + } + } + + if( uxInterrupts == 0 ) + { + /* No writes from interrupts were found. Are interrupts + actually running? */ + prvQueueAccessLogError( __LINE__ ); + } + + /* Reset the array ready for the next cycle. */ + memset( ucNormallyFullReceivedValues, 0x00, sizeof( ucNormallyFullReceivedValues ) ); + + uxHighPriorityLoops2++; + uxValueForNormallyFullQueue = 0; + + /* Suspend ourselves, allowing the lower priority task to + actually receive something from the queue. Until now it + will have been prevented from doing so by the higher + priority tasks. The lower priority task will resume us + if it receives something. We will then resume the other + higher priority task. */ + vTaskSuspend( NULL ); + vTaskResume( xHighPriorityNormallyFullTask2 ); + } + } +} +/*-----------------------------------------------------------*/ + +static void prv2ndHigherPriorityNormallyFullTask( void *pvParameters ) +{ +unsigned portBASE_TYPE uxValueToTx, ux; + + /* The parameters are not being used so avoid compiler warnings. */ + ( void ) pvParameters; + + /* Make sure the queue starts full or near full. >> 1 as there are two + high priority tasks. */ + for( ux = 0; ux < ( intqQUEUE_LENGTH >> 1 ); ux++ ) + { + portENTER_CRITICAL(); + { + uxValueForNormallyFullQueue++; + uxValueToTx = uxValueForNormallyFullQueue; + } + portEXIT_CRITICAL(); + + xQueueSend( xNormallyFullQueue, &uxValueToTx, intqSHORT_DELAY ); + } + + for( ;; ) + { + portENTER_CRITICAL(); + { + uxValueForNormallyFullQueue++; + uxValueToTx = uxValueForNormallyFullQueue; + } + portEXIT_CRITICAL(); + + if( xQueueSend( xNormallyFullQueue, &uxValueToTx, intqSHORT_DELAY ) != pdPASS ) + { + if( xWasSuspended != pdTRUE ) + { + /* It is ok to time out if the task has been suspended. */ + prvQueueAccessLogError( __LINE__ ); + } + } + + xWasSuspended = pdFALSE; + + taskYIELD(); + } +} +/*-----------------------------------------------------------*/ + +static void prvLowerPriorityNormallyFullTask( void *pvParameters ) +{ +unsigned portBASE_TYPE uxValue, uxTxed = 9999; + + /* The parameters are not being used so avoid compiler warnings. */ + ( void ) pvParameters; + + for( ;; ) + { + if( xQueueSend( xNormallyFullQueue, &uxTxed, intqONE_TICK_DELAY ) != errQUEUE_FULL ) + { + /* We would only expect to succeed when the higher priority task + is suspended. */ + if( xTaskIsTaskSuspended( xHighPriorityNormallyFullTask1 ) == pdFALSE ) + { + prvQueueAccessLogError( __LINE__ ); + } + + vTaskResume( xHighPriorityNormallyFullTask1 ); + uxLowPriorityLoops2++; + } + else + { + /* Raise our priority while we receive so we can preempt the higher + priority task, and ensure we get the value from the queue. */ + vTaskPrioritySet( NULL, intqHIGHER_PRIORITY + 1 ); + + if( xQueueReceive( xNormallyFullQueue, &uxValue, portMAX_DELAY ) != pdPASS ) + { + prvQueueAccessLogError( __LINE__ ); + } + else + { + prvRecordValue_NormallyFull( uxValue, intqLOW_PRIORITY_TASK ); + } + + vTaskPrioritySet( NULL, intqLOWER_PRIORITY ); + } + } +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xFirstTimerHandler( void ) +{ +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE, uxRxedValue; +static unsigned portBASE_TYPE uxNextOperation = 0; + + /* Called from a timer interrupt. Perform various read and write + accesses on the queues. */ + + uxNextOperation++; + + if( uxNextOperation & ( unsigned portBASE_TYPE ) 0x01 ) + { + timerNORMALLY_EMPTY_TX(); + timerNORMALLY_EMPTY_TX(); + timerNORMALLY_EMPTY_TX(); + } + else + { + timerNORMALLY_FULL_RX(); + timerNORMALLY_FULL_RX(); + timerNORMALLY_FULL_RX(); + } + + return xHigherPriorityTaskWoken; +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xSecondTimerHandler( void ) +{ +unsigned portBASE_TYPE uxRxedValue; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; +static unsigned portBASE_TYPE uxNextOperation = 0; + + /* Called from a timer interrupt. Perform various read and write + accesses on the queues. */ + + uxNextOperation++; + + if( uxNextOperation & ( unsigned portBASE_TYPE ) 0x01 ) + { + timerNORMALLY_EMPTY_TX(); + timerNORMALLY_EMPTY_TX(); + + timerNORMALLY_EMPTY_RX(); + timerNORMALLY_EMPTY_RX(); + } + else + { + timerNORMALLY_FULL_RX(); + timerNORMALLY_FULL_TX(); + timerNORMALLY_FULL_TX(); + timerNORMALLY_FULL_TX(); + timerNORMALLY_FULL_TX(); + } + + return xHigherPriorityTaskWoken; +} +/*-----------------------------------------------------------*/ + + +portBASE_TYPE xAreIntQueueTasksStillRunning( void ) +{ +static unsigned portBASE_TYPE uxLastHighPriorityLoops1 = 0, uxLastHighPriorityLoops2 = 0, uxLastLowPriorityLoops1 = 0, uxLastLowPriorityLoops2 = 0; + + /* xErrorStatus can be set outside of this function. This function just + checks that all the tasks are still cycling. */ + + if( uxHighPriorityLoops1 == uxLastHighPriorityLoops1 ) + { + /* The high priority 1 task has stalled. */ + prvQueueAccessLogError( __LINE__ ); + } + + uxLastHighPriorityLoops1 = uxHighPriorityLoops1; + + if( uxHighPriorityLoops2 == uxLastHighPriorityLoops2 ) + { + /* The high priority 2 task has stalled. */ + prvQueueAccessLogError( __LINE__ ); + } + + uxLastHighPriorityLoops2 = uxHighPriorityLoops2; + + if( uxLowPriorityLoops1 == uxLastLowPriorityLoops1 ) + { + /* The low priority 1 task has stalled. */ + prvQueueAccessLogError( __LINE__ ); + } + + uxLastLowPriorityLoops1 = uxLowPriorityLoops1; + + if( uxLowPriorityLoops2 == uxLastLowPriorityLoops2 ) + { + /* The low priority 2 task has stalled. */ + prvQueueAccessLogError( __LINE__ ); + } + + uxLastLowPriorityLoops2 = uxLowPriorityLoops2; + + return xErrorStatus; +} + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/PollQ.c b/third_party/FreeRTOS/Demo/Common/Minimal/PollQ.c new file mode 100644 index 0000000..e3a3cb3 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/PollQ.c @@ -0,0 +1,258 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This version of PollQ. c is for use on systems that have limited stack + * space and no display facilities. The complete version can be found in + * the Demo/Common/Full directory. + * + * Creates two tasks that communicate over a single queue. One task acts as a + * producer, the other a consumer. + * + * The producer loops for three iteration, posting an incrementing number onto the + * queue each cycle. It then delays for a fixed period before doing exactly the + * same again. + * + * The consumer loops emptying the queue. Each item removed from the queue is + * checked to ensure it contains the expected value. When the queue is empty it + * blocks for a fixed period, then does the same again. + * + * All queue access is performed without blocking. The consumer completely empties + * the queue each time it runs so the producer should never find the queue full. + * + * An error is flagged if the consumer obtains an unexpected value or the producer + * find the queue is full. + */ + +/* +Changes from V2.0.0 + + + Delay periods are now specified using variables and constants of + portTickType rather than unsigned long. +*/ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +/* Demo program include files. */ +#include "PollQ.h" + +#define pollqSTACK_SIZE configMINIMAL_STACK_SIZE +#define pollqQUEUE_SIZE ( 10 ) +#define pollqPRODUCER_DELAY ( ( portTickType ) 200 / portTICK_RATE_MS ) +#define pollqCONSUMER_DELAY ( pollqPRODUCER_DELAY - ( portTickType ) ( 20 / portTICK_RATE_MS ) ) +#define pollqNO_DELAY ( ( portTickType ) 0 ) +#define pollqVALUES_TO_PRODUCE ( ( signed portBASE_TYPE ) 3 ) +#define pollqINITIAL_VALUE ( ( signed portBASE_TYPE ) 0 ) + +/* The task that posts the incrementing number onto the queue. */ +static portTASK_FUNCTION_PROTO( vPolledQueueProducer, pvParameters ); + +/* The task that empties the queue. */ +static portTASK_FUNCTION_PROTO( vPolledQueueConsumer, pvParameters ); + +/* Variables that are used to check that the tasks are still running with no +errors. */ +static volatile signed portBASE_TYPE xPollingConsumerCount = pollqINITIAL_VALUE, xPollingProducerCount = pollqINITIAL_VALUE; + +/*-----------------------------------------------------------*/ + +void vStartPolledQueueTasks( unsigned portBASE_TYPE uxPriority ) +{ +static xQueueHandle xPolledQueue; + + /* Create the queue used by the producer and consumer. */ + xPolledQueue = xQueueCreate( pollqQUEUE_SIZE, ( unsigned portBASE_TYPE ) sizeof( unsigned short ) ); + + /* vQueueAddToRegistry() adds the queue to the queue registry, if one is + in use. The queue registry is provided as a means for kernel aware + debuggers to locate queues and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( xPolledQueue, ( signed char * ) "Poll_Test_Queue" ); + + /* Spawn the producer and consumer. */ + xTaskCreate( vPolledQueueConsumer, ( signed char * ) "QConsNB", pollqSTACK_SIZE, ( void * ) &xPolledQueue, uxPriority, ( xTaskHandle * ) NULL ); + xTaskCreate( vPolledQueueProducer, ( signed char * ) "QProdNB", pollqSTACK_SIZE, ( void * ) &xPolledQueue, uxPriority, ( xTaskHandle * ) NULL ); +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vPolledQueueProducer, pvParameters ) +{ +unsigned short usValue = ( unsigned short ) 0; +signed portBASE_TYPE xError = pdFALSE, xLoop; + + for( ;; ) + { + for( xLoop = 0; xLoop < pollqVALUES_TO_PRODUCE; xLoop++ ) + { + /* Send an incrementing number on the queue without blocking. */ + if( xQueueSend( *( ( xQueueHandle * ) pvParameters ), ( void * ) &usValue, pollqNO_DELAY ) != pdPASS ) + { + /* We should never find the queue full so if we get here there + has been an error. */ + xError = pdTRUE; + } + else + { + if( xError == pdFALSE ) + { + /* If an error has ever been recorded we stop incrementing the + check variable. */ + portENTER_CRITICAL(); + xPollingProducerCount++; + portEXIT_CRITICAL(); + } + + /* Update the value we are going to post next time around. */ + usValue++; + } + } + + /* Wait before we start posting again to ensure the consumer runs and + empties the queue. */ + vTaskDelay( pollqPRODUCER_DELAY ); + } +} /*lint !e818 Function prototype must conform to API. */ +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vPolledQueueConsumer, pvParameters ) +{ +unsigned short usData, usExpectedValue = ( unsigned short ) 0; +signed portBASE_TYPE xError = pdFALSE; + + for( ;; ) + { + /* Loop until the queue is empty. */ + while( uxQueueMessagesWaiting( *( ( xQueueHandle * ) pvParameters ) ) ) + { + if( xQueueReceive( *( ( xQueueHandle * ) pvParameters ), &usData, pollqNO_DELAY ) == pdPASS ) + { + if( usData != usExpectedValue ) + { + /* This is not what we expected to receive so an error has + occurred. */ + xError = pdTRUE; + + /* Catch-up to the value we received so our next expected + value should again be correct. */ + usExpectedValue = usData; + } + else + { + if( xError == pdFALSE ) + { + /* Only increment the check variable if no errors have + occurred. */ + portENTER_CRITICAL(); + xPollingConsumerCount++; + portEXIT_CRITICAL(); + } + } + + /* Next time round we would expect the number to be one higher. */ + usExpectedValue++; + } + } + + /* Now the queue is empty we block, allowing the producer to place more + items in the queue. */ + vTaskDelay( pollqCONSUMER_DELAY ); + } +} /*lint !e818 Function prototype must conform to API. */ +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running with no errors. */ +portBASE_TYPE xArePollingQueuesStillRunning( void ) +{ +portBASE_TYPE xReturn; + + /* Check both the consumer and producer poll count to check they have both + been changed since out last trip round. We do not need a critical section + around the check variables as this is called from a higher priority than + the other tasks that access the same variables. */ + if( ( xPollingConsumerCount == pollqINITIAL_VALUE ) || + ( xPollingProducerCount == pollqINITIAL_VALUE ) + ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + /* Set the check variables back down so we know if they have been + incremented the next time around. */ + xPollingConsumerCount = pollqINITIAL_VALUE; + xPollingProducerCount = pollqINITIAL_VALUE; + + return xReturn; +} diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/QPeek.c b/third_party/FreeRTOS/Demo/Common/Minimal/QPeek.c new file mode 100644 index 0000000..942155c --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/QPeek.c @@ -0,0 +1,474 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * Tests the behaviour when data is peeked from a queue when there are + * multiple tasks blocked on the queue. + */ + + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" + +/* Demo program include files. */ +#include "QPeek.h" + +#define qpeekQUEUE_LENGTH ( 5 ) +#define qpeekNO_BLOCK ( 0 ) +#define qpeekSHORT_DELAY ( 10 ) + +#define qpeekLOW_PRIORITY ( tskIDLE_PRIORITY + 0 ) +#define qpeekMEDIUM_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define qpeekHIGH_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define qpeekHIGHEST_PRIORITY ( tskIDLE_PRIORITY + 3 ) + +/*-----------------------------------------------------------*/ + +/* + * The following three tasks are used to demonstrate the peeking behaviour. + * Each task is given a different priority to demonstrate the order in which + * tasks are woken as data is peeked from a queue. + */ +static void prvLowPriorityPeekTask( void *pvParameters ); +static void prvMediumPriorityPeekTask( void *pvParameters ); +static void prvHighPriorityPeekTask( void *pvParameters ); +static void prvHighestPriorityPeekTask( void *pvParameters ); + +/*-----------------------------------------------------------*/ + +/* Flag that will be latched to pdTRUE should any unexpected behaviour be +detected in any of the tasks. */ +static volatile portBASE_TYPE xErrorDetected = pdFALSE; + +/* Counter that is incremented on each cycle of a test. This is used to +detect a stalled task - a test that is no longer running. */ +static volatile unsigned portLONG ulLoopCounter = 0; + +/* Handles to the test tasks. */ +xTaskHandle xMediumPriorityTask, xHighPriorityTask, xHighestPriorityTask; +/*-----------------------------------------------------------*/ + +void vStartQueuePeekTasks( void ) +{ +xQueueHandle xQueue; + + /* Create the queue that we are going to use for the test/demo. */ + xQueue = xQueueCreate( qpeekQUEUE_LENGTH, sizeof( unsigned portLONG ) ); + + /* vQueueAddToRegistry() adds the queue to the queue registry, if one is + in use. The queue registry is provided as a means for kernel aware + debuggers to locate queues and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( xQueue, ( signed portCHAR * ) "QPeek_Test_Queue" ); + + /* Create the demo tasks and pass it the queue just created. We are + passing the queue handle by value so it does not matter that it is declared + on the stack here. */ + xTaskCreate( prvLowPriorityPeekTask, ( signed portCHAR * )"PeekL", configMINIMAL_STACK_SIZE, ( void * ) xQueue, qpeekLOW_PRIORITY, NULL ); + xTaskCreate( prvMediumPriorityPeekTask, ( signed portCHAR * )"PeekM", configMINIMAL_STACK_SIZE, ( void * ) xQueue, qpeekMEDIUM_PRIORITY, &xMediumPriorityTask ); + xTaskCreate( prvHighPriorityPeekTask, ( signed portCHAR * )"PeekH1", configMINIMAL_STACK_SIZE, ( void * ) xQueue, qpeekHIGH_PRIORITY, &xHighPriorityTask ); + xTaskCreate( prvHighestPriorityPeekTask, ( signed portCHAR * )"PeekH2", configMINIMAL_STACK_SIZE, ( void * ) xQueue, qpeekHIGHEST_PRIORITY, &xHighestPriorityTask ); +} +/*-----------------------------------------------------------*/ + +static void prvHighestPriorityPeekTask( void *pvParameters ) +{ +xQueueHandle xQueue = ( xQueueHandle ) pvParameters; +unsigned portLONG ulValue; + + #ifdef USE_STDIO + { + void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend ); + + const portCHAR * const pcTaskStartMsg = "Queue peek test started.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + } + #endif + + for( ;; ) + { + /* Try peeking from the queue. The queue should be empty so we will + block, allowing the high priority task to execute. */ + if( xQueuePeek( xQueue, &ulValue, portMAX_DELAY ) != pdPASS ) + { + /* We expected to have received something by the time we unblock. */ + xErrorDetected = pdTRUE; + } + + /* When we reach here the high and medium priority tasks should still + be blocked on the queue. We unblocked because the low priority task + wrote a value to the queue, which we should have peeked. Peeking the + data (rather than receiving it) will leave the data on the queue, so + the high priority task should then have also been unblocked, but not + yet executed. */ + if( ulValue != 0x11223344 ) + { + /* We did not receive the expected value. */ + xErrorDetected = pdTRUE; + } + + if( uxQueueMessagesWaiting( xQueue ) != 1 ) + { + /* The message should have been left on the queue. */ + xErrorDetected = pdTRUE; + } + + /* Now we are going to actually receive the data, so when the high + priority task runs it will find the queue empty and return to the + blocked state. */ + ulValue = 0; + if( xQueueReceive( xQueue, &ulValue, qpeekNO_BLOCK ) != pdPASS ) + { + /* We expected to receive the value. */ + xErrorDetected = pdTRUE; + } + + if( ulValue != 0x11223344 ) + { + /* We did not receive the expected value - which should have been + the same value as was peeked. */ + xErrorDetected = pdTRUE; + } + + /* Now we will block again as the queue is once more empty. The low + priority task can then execute again. */ + if( xQueuePeek( xQueue, &ulValue, portMAX_DELAY ) != pdPASS ) + { + /* We expected to have received something by the time we unblock. */ + xErrorDetected = pdTRUE; + } + + /* When we get here the low priority task should have again written to the + queue. */ + if( ulValue != 0x01234567 ) + { + /* We did not receive the expected value. */ + xErrorDetected = pdTRUE; + } + + if( uxQueueMessagesWaiting( xQueue ) != 1 ) + { + /* The message should have been left on the queue. */ + xErrorDetected = pdTRUE; + } + + /* We only peeked the data, so suspending ourselves now should enable + the high priority task to also peek the data. The high priority task + will have been unblocked when we peeked the data as we left the data + in the queue. */ + vTaskSuspend( NULL ); + + + + /* This time we are going to do the same as the above test, but the + high priority task is going to receive the data, rather than peek it. + This means that the medium priority task should never peek the value. */ + if( xQueuePeek( xQueue, &ulValue, portMAX_DELAY ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + if( ulValue != 0xaabbaabb ) + { + xErrorDetected = pdTRUE; + } + + vTaskSuspend( NULL ); + } +} +/*-----------------------------------------------------------*/ + +static void prvHighPriorityPeekTask( void *pvParameters ) +{ +xQueueHandle xQueue = ( xQueueHandle ) pvParameters; +unsigned portLONG ulValue; + + for( ;; ) + { + /* Try peeking from the queue. The queue should be empty so we will + block, allowing the medium priority task to execute. Both the high + and highest priority tasks will then be blocked on the queue. */ + if( xQueuePeek( xQueue, &ulValue, portMAX_DELAY ) != pdPASS ) + { + /* We expected to have received something by the time we unblock. */ + xErrorDetected = pdTRUE; + } + + /* When we get here the highest priority task should have peeked the data + (unblocking this task) then suspended (allowing this task to also peek + the data). */ + if( ulValue != 0x01234567 ) + { + /* We did not receive the expected value. */ + xErrorDetected = pdTRUE; + } + + if( uxQueueMessagesWaiting( xQueue ) != 1 ) + { + /* The message should have been left on the queue. */ + xErrorDetected = pdTRUE; + } + + /* We only peeked the data, so suspending ourselves now should enable + the medium priority task to also peek the data. The medium priority task + will have been unblocked when we peeked the data as we left the data + in the queue. */ + vTaskSuspend( NULL ); + + + /* This time we are going actually receive the value, so the medium + priority task will never peek the data - we removed it from the queue. */ + if( xQueueReceive( xQueue, &ulValue, portMAX_DELAY ) != pdPASS ) + { + xErrorDetected = pdTRUE; + } + + if( ulValue != 0xaabbaabb ) + { + xErrorDetected = pdTRUE; + } + + vTaskSuspend( NULL ); + } +} +/*-----------------------------------------------------------*/ + +static void prvMediumPriorityPeekTask( void *pvParameters ) +{ +xQueueHandle xQueue = ( xQueueHandle ) pvParameters; +unsigned portLONG ulValue; + + for( ;; ) + { + /* Try peeking from the queue. The queue should be empty so we will + block, allowing the low priority task to execute. The highest, high + and medium priority tasks will then all be blocked on the queue. */ + if( xQueuePeek( xQueue, &ulValue, portMAX_DELAY ) != pdPASS ) + { + /* We expected to have received something by the time we unblock. */ + xErrorDetected = pdTRUE; + } + + /* When we get here the high priority task should have peeked the data + (unblocking this task) then suspended (allowing this task to also peek + the data). */ + if( ulValue != 0x01234567 ) + { + /* We did not receive the expected value. */ + xErrorDetected = pdTRUE; + } + + if( uxQueueMessagesWaiting( xQueue ) != 1 ) + { + /* The message should have been left on the queue. */ + xErrorDetected = pdTRUE; + } + + /* Just so we know the test is still running. */ + ulLoopCounter++; + + /* Now we can suspend ourselves so the low priority task can execute + again. */ + vTaskSuspend( NULL ); + } +} +/*-----------------------------------------------------------*/ + +static void prvLowPriorityPeekTask( void *pvParameters ) +{ +xQueueHandle xQueue = ( xQueueHandle ) pvParameters; +unsigned portLONG ulValue; + + for( ;; ) + { + /* Write some data to the queue. This should unblock the highest + priority task that is waiting to peek data from the queue. */ + ulValue = 0x11223344; + if( xQueueSendToBack( xQueue, &ulValue, qpeekNO_BLOCK ) != pdPASS ) + { + /* We were expecting the queue to be empty so we should not of + had a problem writing to the queue. */ + xErrorDetected = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* By the time we get here the data should have been removed from + the queue. */ + if( uxQueueMessagesWaiting( xQueue ) != 0 ) + { + xErrorDetected = pdTRUE; + } + + /* Write another value to the queue, again waking the highest priority + task that is blocked on the queue. */ + ulValue = 0x01234567; + if( xQueueSendToBack( xQueue, &ulValue, qpeekNO_BLOCK ) != pdPASS ) + { + /* We were expecting the queue to be empty so we should not of + had a problem writing to the queue. */ + xErrorDetected = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* All the other tasks should now have successfully peeked the data. + The data is still in the queue so we should be able to receive it. */ + ulValue = 0; + if( xQueueReceive( xQueue, &ulValue, qpeekNO_BLOCK ) != pdPASS ) + { + /* We expected to receive the data. */ + xErrorDetected = pdTRUE; + } + + if( ulValue != 0x01234567 ) + { + /* We did not receive the expected value. */ + } + + /* Lets just delay a while as this is an intensive test as we don't + want to starve other tests of processing time. */ + vTaskDelay( qpeekSHORT_DELAY ); + + /* Unsuspend the other tasks so we can repeat the test - this time + however not all the other tasks will peek the data as the high + priority task is actually going to remove it from the queue. Send + to front is used just to be different. As the queue is empty it + makes no difference to the result. */ + vTaskResume( xMediumPriorityTask ); + vTaskResume( xHighPriorityTask ); + vTaskResume( xHighestPriorityTask ); + + #if( configUSE_PREEMPTION == 0 ) + taskYIELD(); + #endif + + ulValue = 0xaabbaabb; + if( xQueueSendToFront( xQueue, &ulValue, qpeekNO_BLOCK ) != pdPASS ) + { + /* We were expecting the queue to be empty so we should not of + had a problem writing to the queue. */ + xErrorDetected = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* This time we should find that the queue is empty. The high priority + task actually removed the data rather than just peeking it. */ + if( xQueuePeek( xQueue, &ulValue, qpeekNO_BLOCK ) != errQUEUE_EMPTY ) + { + /* We expected to receive the data. */ + xErrorDetected = pdTRUE; + } + + /* Unsuspend the highest and high priority tasks so we can go back + and repeat the whole thing. The medium priority task should not be + suspended as it was not able to peek the data in this last case. */ + vTaskResume( xHighPriorityTask ); + vTaskResume( xHighestPriorityTask ); + + /* Lets just delay a while as this is an intensive test as we don't + want to starve other tests of processing time. */ + vTaskDelay( qpeekSHORT_DELAY ); + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreQueuePeekTasksStillRunning( void ) +{ +static unsigned portLONG ulLastLoopCounter = 0; + + /* If the demo task is still running then we expect the loopcounter to + have incremented since this function was last called. */ + if( ulLastLoopCounter == ulLoopCounter ) + { + xErrorDetected = pdTRUE; + } + + ulLastLoopCounter = ulLoopCounter; + + /* Errors detected in the task itself will have latched xErrorDetected + to true. */ + + return !xErrorDetected; +} + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/TimerDemo.c b/third_party/FreeRTOS/Demo/Common/Minimal/TimerDemo.c new file mode 100644 index 0000000..509c690 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/TimerDemo.c @@ -0,0 +1,1060 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * Tests the behaviour of timers. Some timers are created before the scheduler + * is started, and some after. + */ + +/* Standard includes. */ +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" + +/* Demo program include files. */ +#include "TimerDemo.h" + +#if ( configTIMER_TASK_PRIORITY < 1 ) + #error configTIMER_TASK_PRIORITY must be set to at least 1 for this test/demo to function correctly. +#endif + +#define tmrdemoDONT_BLOCK ( ( portTickType ) 0 ) +#define tmrdemoONE_SHOT_TIMER_PERIOD ( xBasePeriod * ( portTickType ) 3 ) +#define trmdemoNUM_TIMER_RESETS ( ( unsigned char ) 10 ) + +/*-----------------------------------------------------------*/ + +/* The callback functions used by the timers. These each increment a counter +to indicate which timer has expired. The auto-reload timers that are used by +the test task (as opposed to being used from an ISR) all share the same +prvAutoReloadTimerCallback() callback function, and use the ID of the +pxExpiredTimer parameter passed into that function to know which counter to +increment. The other timers all have their own unique callback function and +simply increment their counters without using the callback function parameter. */ +static void prvAutoReloadTimerCallback( xTimerHandle pxExpiredTimer ); +static void prvOneShotTimerCallback( xTimerHandle pxExpiredTimer ); +static void prvTimerTestTask( void *pvParameters ); +static void prvISRAutoReloadTimerCallback( xTimerHandle pxExpiredTimer ); +static void prvISROneShotTimerCallback( xTimerHandle pxExpiredTimer ); + +/* The test functions used by the timer test task. These manipulate the auto +reload and one shot timers in various ways, then delay, then inspect the timers +to ensure they have behaved as expected. */ +static void prvTest1_CreateTimersWithoutSchedulerRunning( void ); +static void prvTest2_CheckTaskAndTimersInitialState( void ); +static void prvTest3_CheckAutoReloadExpireRates( void ); +static void prvTest4_CheckAutoReloadTimersCanBeStopped( void ); +static void prvTest5_CheckBasicOneShotTimerBehaviour( void ); +static void prvTest6_CheckAutoReloadResetBehaviour( void ); +static void prvResetStartConditionsForNextIteration( void ); + +/*-----------------------------------------------------------*/ + +/* Flag that will be latched to pdFAIL should any unexpected behaviour be +detected in any of the demo tests. */ +static volatile portBASE_TYPE xTestStatus = pdPASS; + +/* Counter that is incremented on each cycle of a test. This is used to +detect a stalled task - a test that is no longer running. */ +static volatile unsigned long ulLoopCounter = 0; + +/* A set of auto reload timers - each of which use the same callback function. +The callback function uses the timer ID to index into, and then increment, a +counter in the ucAutoReloadTimerCounters[] array. The auto reload timers +referenced from xAutoReloadTimers[] are used by the prvTimerTestTask task. */ +static xTimerHandle xAutoReloadTimers[ configTIMER_QUEUE_LENGTH + 1 ] = { 0 }; +static unsigned char ucAutoReloadTimerCounters[ configTIMER_QUEUE_LENGTH + 1 ] = { 0 }; + +/* The one shot timer is configured to use a callback function that increments +ucOneShotTimerCounter each time it gets called. */ +static xTimerHandle xOneShotTimer = NULL; +static unsigned char ucOneShotTimerCounter = ( unsigned char ) 0; + +/* The ISR reload timer is controlled from the tick hook to exercise the timer +API functions that can be used from an ISR. It is configured to increment +ucISRReloadTimerCounter each time its callback function is executed. */ +static xTimerHandle xISRAutoReloadTimer = NULL; +static unsigned char ucISRAutoReloadTimerCounter = ( unsigned char ) 0; + +/* The ISR one shot timer is controlled from the tick hook to exercise the timer +API functions that can be used from an ISR. It is configured to increment +ucISRReloadTimerCounter each time its callback function is executed. */ +static xTimerHandle xISROneShotTimer = NULL; +static unsigned char ucISROneShotTimerCounter = ( unsigned char ) 0; + +/* The period of all the timers are a multiple of the base period. The base +period is configured by the parameter to vStartTimerDemoTask(). */ +static portTickType xBasePeriod = 0; + +/*-----------------------------------------------------------*/ + +void vStartTimerDemoTask( portTickType xBasePeriodIn ) +{ + /* Start with the timer and counter arrays clear - this is only necessary + where the compiler does not clear them automatically on start up. */ + memset( ucAutoReloadTimerCounters, 0x00, sizeof( ucAutoReloadTimerCounters ) ); + memset( xAutoReloadTimers, 0x00, sizeof( xAutoReloadTimers ) ); + + /* Store the period from which all the timer periods will be generated from + (multiples of). */ + xBasePeriod = xBasePeriodIn; + + /* Create a set of timers for use by this demo/test. */ + prvTest1_CreateTimersWithoutSchedulerRunning(); + + /* Create the task that will control and monitor the timers. This is + created at a lower priority than the timer service task to ensure, as + far as it is concerned, commands on timers are actioned immediately + (sending a command to the timer service task will unblock the timer service + task, which will then preempt this task). */ + if( xTestStatus != pdFAIL ) + { + xTaskCreate( prvTimerTestTask, ( signed portCHAR * ) "Tmr Tst", configMINIMAL_STACK_SIZE, NULL, configTIMER_TASK_PRIORITY - 1, NULL ); + } +} +/*-----------------------------------------------------------*/ + +static void prvTimerTestTask( void *pvParameters ) +{ + ( void ) pvParameters; + + /* Create a one-shot timer for use later on in this test. */ + xOneShotTimer = xTimerCreate( ( const signed char * ) "Oneshot Timer",/* Text name to facilitate debugging. The kernel does not use this itself. */ + tmrdemoONE_SHOT_TIMER_PERIOD, /* The period for the timer. */ + pdFALSE, /* Don't auto-reload - hence a one shot timer. */ + ( void * ) 0, /* The timer identifier. In this case this is not used as the timer has its own callback. */ + prvOneShotTimerCallback ); /* The callback to be called when the timer expires. */ + + if( xOneShotTimer == NULL ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + + /* Ensure all the timers are in their expected initial state. This + depends on the timer service task having a higher priority than this task. */ + prvTest2_CheckTaskAndTimersInitialState(); + + for( ;; ) + { + /* Check the auto reload timers expire at the expected/correct rates. */ + prvTest3_CheckAutoReloadExpireRates(); + + /* Check the auto reload timers can be stopped correctly, and correctly + report their state. */ + prvTest4_CheckAutoReloadTimersCanBeStopped(); + + /* Check the one shot timer only calls its callback once after it has been + started, and that it reports its state correctly. */ + prvTest5_CheckBasicOneShotTimerBehaviour(); + + /* Check timer reset behaviour. */ + prvTest6_CheckAutoReloadResetBehaviour(); + + /* Start the timers again to restart all the tests over again. */ + prvResetStartConditionsForNextIteration(); + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that the created task is still running and has not +detected any errors. */ +portBASE_TYPE xAreTimerDemoTasksStillRunning( portTickType xCycleFrequency ) +{ +static unsigned long ulLastLoopCounter = 0UL; +portTickType xMaxBlockTimeUsedByTheseTests, xLoopCounterIncrementTimeMax; +static portTickType xIterationsWithoutCounterIncrement = ( portTickType ) 0, xLastCycleFrequency; + + if( xLastCycleFrequency != xCycleFrequency ) + { + /* The cycle frequency has probably become much faster due to an error + elsewhere. Start counting Iterations again. */ + xIterationsWithoutCounterIncrement = ( portTickType ) 0; + xLastCycleFrequency = xCycleFrequency; + } + + /* Calculate the maximum number of times that it is permissible for this + function to be called without ulLoopCounter being incremented. This is + necessary because the tests in this file block for extended periods, and the + block period might be longer than the time between calls to this function. */ + xMaxBlockTimeUsedByTheseTests = ( ( portTickType ) configTIMER_QUEUE_LENGTH ) * xBasePeriod; + xLoopCounterIncrementTimeMax = xMaxBlockTimeUsedByTheseTests / xCycleFrequency; + + /* If the demo task is still running then we expect the loopcounter to + have incremented every xLoopCounterIncrementTimeMax calls. */ + if( ulLastLoopCounter == ulLoopCounter ) + { + xIterationsWithoutCounterIncrement++; + if( xIterationsWithoutCounterIncrement > xLoopCounterIncrementTimeMax ) + { + /* The tests appear to be no longer running (stalled). */ + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + else + { + /* ulLoopCounter changed, so the count of times this function was called + without a change can be reset to zero. */ + xIterationsWithoutCounterIncrement = ( portTickType ) 0; + } + + ulLastLoopCounter = ulLoopCounter; + + /* Errors detected in the task itself will have latched xTestStatus + to pdFAIL. */ + + return xTestStatus; +} +/*-----------------------------------------------------------*/ + +static void prvTest1_CreateTimersWithoutSchedulerRunning( void ) +{ +unsigned portBASE_TYPE xTimer; + + for( xTimer = 0; xTimer < configTIMER_QUEUE_LENGTH; xTimer++ ) + { + /* As the timer queue is not yet full, it should be possible to both create + and start a timer. These timers are being started before the scheduler has + been started, so their block times should get set to zero within the timer + API itself. */ + xAutoReloadTimers[ xTimer ] = xTimerCreate( ( const signed char * )"FR Timer", /* Text name to facilitate debugging. The kernel does not use this itself. */ + ( ( xTimer + ( portTickType ) 1 ) * xBasePeriod ),/* The period for the timer. The plus 1 ensures a period of zero is not specified. */ + pdTRUE, /* Auto-reload is set to true. */ + ( void * ) xTimer, /* An identifier for the timer as all the auto reload timers use the same callback. */ + prvAutoReloadTimerCallback ); /* The callback to be called when the timer expires. */ + + if( xAutoReloadTimers[ xTimer ] == NULL ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + else + { + /* The scheduler has not yet started, so the block period of + portMAX_DELAY should just get set to zero in xTimerStart(). Also, + the timer queue is not yet full so xTimerStart() should return + pdPASS. */ + if( xTimerStart( xAutoReloadTimers[ xTimer ], portMAX_DELAY ) != pdPASS ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + } + + /* The timers queue should now be full, so it should be possible to create + another timer, but not possible to start it (the timer queue will not get + drained until the scheduler has been started. */ + xAutoReloadTimers[ configTIMER_QUEUE_LENGTH ] = xTimerCreate( ( const signed char * ) "FR Timer", /* Text name to facilitate debugging. The kernel does not use this itself. */ + ( configTIMER_QUEUE_LENGTH * xBasePeriod ), /* The period for the timer. */ + pdTRUE, /* Auto-reload is set to true. */ + ( void * ) xTimer, /* An identifier for the timer as all the auto reload timers use the same callback. */ + prvAutoReloadTimerCallback ); /* The callback executed when the timer expires. */ + + if( xAutoReloadTimers[ configTIMER_QUEUE_LENGTH ] == NULL ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + else + { + if( xTimerStart( xAutoReloadTimers[ xTimer ], portMAX_DELAY ) == pdPASS ) + { + /* This time it would not be expected that the timer could be + started at this point. */ + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + + /* Create the timers that are used from the tick interrupt to test the timer + API functions that can be called from an ISR. */ + xISRAutoReloadTimer = xTimerCreate( ( const signed char * ) "ISR AR", /* The text name given to the timer. */ + 0xffff, /* The timer is not given a period yet - this will be done from the tick hook, but a period of 0 is invalid. */ + pdTRUE, /* This is an auto reload timer. */ + ( void * ) NULL, /* The identifier is not required. */ + prvISRAutoReloadTimerCallback ); /* The callback that is executed when the timer expires. */ + + xISROneShotTimer = xTimerCreate( ( const signed char * ) "ISR OS", /* The text name given to the timer. */ + 0xffff, /* The timer is not given a period yet - this will be done from the tick hook, but a period of 0 is invalid. */ + pdFALSE, /* This is a one shot timer. */ + ( void * ) NULL, /* The identifier is not required. */ + prvISROneShotTimerCallback ); /* The callback that is executed when the timer expires. */ + + if( ( xISRAutoReloadTimer == NULL ) || ( xISROneShotTimer == NULL ) ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } +} +/*-----------------------------------------------------------*/ + +static void prvTest2_CheckTaskAndTimersInitialState( void ) +{ +unsigned char ucTimer; + + /* Ensure all the timers are in their expected initial state. This depends + on the timer service task having a higher priority than this task. + + auto reload timers 0 to ( configTIMER_QUEUE_LENGTH - 1 ) should now be active, + and auto reload timer configTIMER_QUEUE_LENGTH should not yet be active (it + could not be started prior to the scheduler being started when it was + created). */ + for( ucTimer = 0; ucTimer < ( unsigned char ) configTIMER_QUEUE_LENGTH; ucTimer++ ) + { + if( xTimerIsTimerActive( xAutoReloadTimers[ ucTimer ] ) == pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + + if( xTimerIsTimerActive( xAutoReloadTimers[ configTIMER_QUEUE_LENGTH ] ) != pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } +} +/*-----------------------------------------------------------*/ + +static void prvTest3_CheckAutoReloadExpireRates( void ) +{ +unsigned char ucMaxAllowableValue, ucMinAllowableValue, ucTimer; +portTickType xBlockPeriod, xTimerPeriod, xExpectedNumber; + + /* Check the auto reload timers expire at the expected rates. */ + + + /* Delaying for configTIMER_QUEUE_LENGTH * xBasePeriod ticks should allow + all the auto reload timers to expire at least once. */ + xBlockPeriod = ( ( portTickType ) configTIMER_QUEUE_LENGTH ) * xBasePeriod; + vTaskDelay( xBlockPeriod ); + + /* Check that all the auto reload timers have called their callback + function the expected number of times. */ + for( ucTimer = 0; ucTimer < ( unsigned char ) configTIMER_QUEUE_LENGTH; ucTimer++ ) + { + /* The expected number of expiries is equal to the block period divided + by the timer period. */ + xTimerPeriod = ( ( ( portTickType ) ucTimer + ( portTickType ) 1 ) * xBasePeriod ); + xExpectedNumber = xBlockPeriod / xTimerPeriod; + + ucMaxAllowableValue = ( ( unsigned char ) xExpectedNumber ) ; + ucMinAllowableValue = ( ( unsigned char ) xExpectedNumber - ( unsigned char ) 1 ); + + if( ( ucAutoReloadTimerCounters[ ucTimer ] < ucMinAllowableValue ) || + ( ucAutoReloadTimerCounters[ ucTimer ] > ucMaxAllowableValue ) + ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + + if( xTestStatus == pdPASS ) + { + /* No errors have been reported so increment the loop counter so the + check task knows this task is still running. */ + ulLoopCounter++; + } +} +/*-----------------------------------------------------------*/ + +static void prvTest4_CheckAutoReloadTimersCanBeStopped( void ) +{ +unsigned char ucTimer; + + /* Check the auto reload timers can be stopped correctly, and correctly + report their state. */ + + /* Stop all the active timers. */ + for( ucTimer = 0; ucTimer < ( unsigned char ) configTIMER_QUEUE_LENGTH; ucTimer++ ) + { + /* The timer has not been stopped yet! */ + if( xTimerIsTimerActive( xAutoReloadTimers[ ucTimer ] ) == pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + /* Now stop the timer. This will appear to happen immediately to + this task because this task is running at a priority below the + timer service task. */ + xTimerStop( xAutoReloadTimers[ ucTimer ], tmrdemoDONT_BLOCK ); + + /* The timer should now be inactive. */ + if( xTimerIsTimerActive( xAutoReloadTimers[ ucTimer ] ) != pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + + taskENTER_CRITICAL(); + { + /* The timer in array position configTIMER_QUEUE_LENGTH should not + be active. The critical section is used to ensure the timer does + not call its callback between the next line running and the array + being cleared back to zero, as that would mask an error condition. */ + if( ucAutoReloadTimerCounters[ configTIMER_QUEUE_LENGTH ] != ( unsigned char ) 0 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + /* Clear the timer callback count. */ + memset( ( void * ) ucAutoReloadTimerCounters, 0, sizeof( ucAutoReloadTimerCounters ) ); + } + taskEXIT_CRITICAL(); + + /* The timers are now all inactive, so this time, after delaying, none + of the callback counters should have incremented. */ + vTaskDelay( ( ( portTickType ) configTIMER_QUEUE_LENGTH ) * xBasePeriod ); + for( ucTimer = 0; ucTimer < ( unsigned char ) configTIMER_QUEUE_LENGTH; ucTimer++ ) + { + if( ucAutoReloadTimerCounters[ ucTimer ] != ( unsigned char ) 0 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + + if( xTestStatus == pdPASS ) + { + /* No errors have been reported so increment the loop counter so + the check task knows this task is still running. */ + ulLoopCounter++; + } +} +/*-----------------------------------------------------------*/ + +static void prvTest5_CheckBasicOneShotTimerBehaviour( void ) +{ + /* Check the one shot timer only calls its callback once after it has been + started, and that it reports its state correctly. */ + + /* The one shot timer should not be active yet. */ + if( xTimerIsTimerActive( xOneShotTimer ) != pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucOneShotTimerCounter != ( unsigned char ) 0 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + /* Start the one shot timer and check that it reports its state correctly. */ + xTimerStart( xOneShotTimer, tmrdemoDONT_BLOCK ); + if( xTimerIsTimerActive( xOneShotTimer ) == pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + /* Delay for three times as long as the one shot timer period, then check + to ensure it has only called its callback once, and is now not in the + active state. */ + vTaskDelay( tmrdemoONE_SHOT_TIMER_PERIOD * ( portTickType ) 3 ); + + if( xTimerIsTimerActive( xOneShotTimer ) != pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucOneShotTimerCounter != ( unsigned char ) 1 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + else + { + /* Reset the one shot timer callback count. */ + ucOneShotTimerCounter = ( unsigned char ) 0; + } + + if( xTestStatus == pdPASS ) + { + /* No errors have been reported so increment the loop counter so the + check task knows this task is still running. */ + ulLoopCounter++; + } +} +/*-----------------------------------------------------------*/ + +static void prvTest6_CheckAutoReloadResetBehaviour( void ) +{ +unsigned char ucTimer; + + /* Check timer reset behaviour. */ + + /* Restart the one shot timer and check it reports its status correctly. */ + xTimerStart( xOneShotTimer, tmrdemoDONT_BLOCK ); + if( xTimerIsTimerActive( xOneShotTimer ) == pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + /* Restart one of the auto reload timers and check that it reports its + status correctly. */ + xTimerStart( xAutoReloadTimers[ configTIMER_QUEUE_LENGTH - 1 ], tmrdemoDONT_BLOCK ); + if( xTimerIsTimerActive( xAutoReloadTimers[ configTIMER_QUEUE_LENGTH - 1 ] ) == pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + for( ucTimer = 0; ucTimer < trmdemoNUM_TIMER_RESETS; ucTimer++ ) + { + /* Delay for half as long as the one shot timer period, then reset it. + It should never expire while this is done, so its callback count should + never increment. */ + vTaskDelay( tmrdemoONE_SHOT_TIMER_PERIOD / 2 ); + + /* Check both running timers are still active, but have not called their + callback functions. */ + if( xTimerIsTimerActive( xOneShotTimer ) == pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucOneShotTimerCounter != ( unsigned char ) 0 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( xTimerIsTimerActive( xAutoReloadTimers[ configTIMER_QUEUE_LENGTH - 1 ] ) == pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucAutoReloadTimerCounters[ configTIMER_QUEUE_LENGTH - 1 ] != ( unsigned char ) 0 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + /* Reset both running timers. */ + xTimerReset( xOneShotTimer, tmrdemoDONT_BLOCK ); + xTimerReset( xAutoReloadTimers[ configTIMER_QUEUE_LENGTH - 1 ], tmrdemoDONT_BLOCK ); + + if( xTestStatus == pdPASS ) + { + /* No errors have been reported so increment the loop counter so + the check task knows this task is still running. */ + ulLoopCounter++; + } + } + + /* Finally delay long enough for both running timers to expire. */ + vTaskDelay( ( ( portTickType ) configTIMER_QUEUE_LENGTH ) * xBasePeriod ); + + /* The timers were not reset during the above delay period so should now + both have called their callback functions. */ + if( ucOneShotTimerCounter != ( unsigned char ) 1 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucAutoReloadTimerCounters[ configTIMER_QUEUE_LENGTH - 1 ] == 0 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + /* The one shot timer should no longer be active, while the auto reload + timer should still be active. */ + if( xTimerIsTimerActive( xAutoReloadTimers[ configTIMER_QUEUE_LENGTH - 1 ] ) == pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( xTimerIsTimerActive( xOneShotTimer ) == pdTRUE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + /* Stop the auto reload timer again. */ + xTimerStop( xAutoReloadTimers[ configTIMER_QUEUE_LENGTH - 1 ], tmrdemoDONT_BLOCK ); + + if( xTimerIsTimerActive( xAutoReloadTimers[ configTIMER_QUEUE_LENGTH - 1 ] ) != pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + /* Clear the timer callback counts, ready for another iteration of these + tests. */ + ucAutoReloadTimerCounters[ configTIMER_QUEUE_LENGTH - 1 ] = ( unsigned char ) 0; + ucOneShotTimerCounter = ( unsigned char ) 0; + + if( xTestStatus == pdPASS ) + { + /* No errors have been reported so increment the loop counter so the check + task knows this task is still running. */ + ulLoopCounter++; + } +} +/*-----------------------------------------------------------*/ + +static void prvResetStartConditionsForNextIteration( void ) +{ +unsigned char ucTimer; + + /* Start the timers again to start all the tests over again. */ + + /* Start the timers again. */ + for( ucTimer = 0; ucTimer < ( unsigned char ) configTIMER_QUEUE_LENGTH; ucTimer++ ) + { + /* The timer has not been started yet! */ + if( xTimerIsTimerActive( xAutoReloadTimers[ ucTimer ] ) != pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + /* Now start the timer. This will appear to happen immediately to + this task because this task is running at a priority below the timer + service task. */ + xTimerStart( xAutoReloadTimers[ ucTimer ], tmrdemoDONT_BLOCK ); + + /* The timer should now be active. */ + if( xTimerIsTimerActive( xAutoReloadTimers[ ucTimer ] ) == pdFALSE ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + + if( xTestStatus == pdPASS ) + { + /* No errors have been reported so increment the loop counter so the + check task knows this task is still running. */ + ulLoopCounter++; + } +} +/*-----------------------------------------------------------*/ + +void vTimerPeriodicISRTests( void ) +{ +static portTickType uxTick = ( portTickType ) -1; + +/* The xHigherPriorityTaskWoken parameter is not used in this case as this +function is called from the tick hook anyway. However the API required it +to be present. */ +signed portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; +portTickType xMargin; + + if( configTIMER_TASK_PRIORITY != ( configMAX_PRIORITIES - 1 ) ) + { + /* The timer service task is not the highest priority task, so it cannot + be assumed that timings will be exact. Timers should never call their + callback before their expiry time, but a margin is permissible for calling + their callback after their expiry time. If exact timing is required then + configTIMER_TASK_PRIORITY must be set to ensure the timer service task + is the highest priority task in the system. */ + xMargin = 5; + } + else + { + xMargin = 1; + } + + /* This test is called from the tick ISR even when the scheduler is suspended. + Therefore, it is possible for the xTickCount to be temporarily less than the + uxTicks count maintained in this function. That can result in calculated + unblock times being too short, as this function is not called as missed ticks + (ticks that occur while the scheduler is suspended) are unwound to re-instate + the real tick value. Therefore, if this happens, just abandon the test + and start again. */ + if( xTaskGetSchedulerState() != taskSCHEDULER_RUNNING ) + { + uxTick = ( portTickType ) -1; + } + else + { + uxTick++; + } + + if( uxTick == 0 ) + { + /* The timers will have been created, but not started. Start them + now by setting their period. */ + ucISRAutoReloadTimerCounter = 0; + ucISROneShotTimerCounter = 0; + xTimerChangePeriodFromISR( xISRAutoReloadTimer, xBasePeriod, &xHigherPriorityTaskWoken ); + xTimerChangePeriodFromISR( xISROneShotTimer, xBasePeriod, &xHigherPriorityTaskWoken ); + } + else if( uxTick == xBasePeriod ) + { + /* Neither timer should have expired yet. */ + if( ( ucISRAutoReloadTimerCounter != 0 ) || ( ucISROneShotTimerCounter != 0 ) ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + else if( uxTick == ( xBasePeriod + xMargin ) ) + { + /* Both timers should now have expired once. The auto reload timer will + still be active, but the one shot timer should now have stopped. */ + if( ( ucISRAutoReloadTimerCounter != 1 ) || ( ucISROneShotTimerCounter != 1 ) ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + else if( uxTick == ( 2 * xBasePeriod ) ) + { + /* The auto reload timer will still be active, but the one shot timer + should now have stopped - however, at this time neither of the timers + should have expired again since the last test. */ + if( ( ucISRAutoReloadTimerCounter != 1 ) || ( ucISROneShotTimerCounter != 1 ) ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + else if( uxTick == ( ( 2 * xBasePeriod ) + xMargin ) ) + { + /* The auto reload timer will still be active, but the one shot timer + should now have stopped. At this time the auto reload timer should have + expired again, but the one shot timer count should not have changed. */ + if( ucISRAutoReloadTimerCounter != 2 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucISROneShotTimerCounter != 1 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + else if( uxTick == ( ( 2 * xBasePeriod ) + ( xBasePeriod >> ( portTickType ) 2U ) ) ) + { + /* The auto reload timer will still be active, but the one shot timer + should now have stopped. Again though, at this time, neither timer call + back should have been called since the last test. */ + if( ucISRAutoReloadTimerCounter != 2 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucISROneShotTimerCounter != 1 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + else if( uxTick == ( 3 * xBasePeriod ) ) + { + /* Start the one shot timer again. */ + xTimerStartFromISR( xISROneShotTimer, &xHigherPriorityTaskWoken ); + } + else if( uxTick == ( ( 3 * xBasePeriod ) + xMargin ) ) + { + /* The auto reload timer and one shot timer will be active. At + this time the auto reload timer should have expired again, but the one + shot timer count should not have changed yet. */ + if( ucISRAutoReloadTimerCounter != 3 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucISROneShotTimerCounter != 1 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + /* Now stop the auto reload timer. The one shot timer was started + a few ticks ago. */ + xTimerStopFromISR( xISRAutoReloadTimer, &xHigherPriorityTaskWoken ); + } + else if( uxTick == ( 4 * xBasePeriod ) ) + { + /* The auto reload timer is now stopped, and the one shot timer is + active, but at this time neither timer should have expired since the + last test. */ + if( ucISRAutoReloadTimerCounter != 3 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucISROneShotTimerCounter != 1 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + else if( uxTick == ( ( 4 * xBasePeriod ) + xMargin ) ) + { + /* The auto reload timer is now stopped, and the one shot timer is + active. The one shot timer should have expired again, but the auto + reload timer should not have executed its callback. */ + if( ucISRAutoReloadTimerCounter != 3 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucISROneShotTimerCounter != 2 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + else if( uxTick == ( ( 8 * xBasePeriod ) + xMargin ) ) + { + /* The auto reload timer is now stopped, and the one shot timer has + already expired and then stopped itself. Both callback counters should + not have incremented since the last test. */ + if( ucISRAutoReloadTimerCounter != 3 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucISROneShotTimerCounter != 2 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + /* Now reset the one shot timer. */ + xTimerResetFromISR( xISROneShotTimer, &xHigherPriorityTaskWoken ); + } + else if( uxTick == ( 9 * xBasePeriod ) ) + { + /* Only the one shot timer should be running, but it should not have + expired since the last test. Check the callback counters have not + incremented, then reset the one shot timer again. */ + if( ucISRAutoReloadTimerCounter != 3 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucISROneShotTimerCounter != 2 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + xTimerResetFromISR( xISROneShotTimer, &xHigherPriorityTaskWoken ); + } + else if( uxTick == ( 10 * xBasePeriod ) ) + { + /* Only the one shot timer should be running, but it should not have + expired since the last test. Check the callback counters have not + incremented, then reset the one shot timer again. */ + if( ucISRAutoReloadTimerCounter != 3 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucISROneShotTimerCounter != 2 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + xTimerResetFromISR( xISROneShotTimer, &xHigherPriorityTaskWoken ); + } + else if( uxTick == ( 11 * xBasePeriod ) ) + { + /* Only the one shot timer should be running, but it should not have + expired since the last test. Check the callback counters have not + incremented, then reset the one shot timer once again. */ + if( ucISRAutoReloadTimerCounter != 3 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucISROneShotTimerCounter != 2 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + xTimerResetFromISR( xISROneShotTimer, &xHigherPriorityTaskWoken ); + } + else if( uxTick == ( ( 12 * xBasePeriod ) + xMargin ) ) + { + /* Only the one shot timer should have been running and this time it + should have expired. Check its callback count has been incremented. + The auto reload timer is still not running so should still have the same + count value. This time the one shot timer is not reset so should not + restart from its expiry period again. */ + if( ucISRAutoReloadTimerCounter != 3 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucISROneShotTimerCounter != 3 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + } + else if( uxTick == ( 15 * xBasePeriod ) ) + { + /* Neither timer should be running now. Check neither callback count + has incremented, then go back to the start to run these tests all + over again. */ + if( ucISRAutoReloadTimerCounter != 3 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + if( ucISROneShotTimerCounter != 3 ) + { + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } + + uxTick = ( portTickType ) -1; + } +} +/*-----------------------------------------------------------*/ + +/*** Timer callback functions are defined below here. ***/ + +static void prvAutoReloadTimerCallback( xTimerHandle pxExpiredTimer ) +{ +unsigned long ulTimerID; + + ulTimerID = ( unsigned long ) pvTimerGetTimerID( pxExpiredTimer ); + if( ulTimerID <= ( configTIMER_QUEUE_LENGTH + 1 ) ) + { + ( ucAutoReloadTimerCounters[ ulTimerID ] )++; + } + else + { + /* The timer ID appears to be unexpected (invalid). */ + xTestStatus = pdFAIL; + configASSERT( xTestStatus ); + } +} +/*-----------------------------------------------------------*/ + +static void prvOneShotTimerCallback( xTimerHandle pxExpiredTimer ) +{ + /* The parameter is not used in this case as only one timer uses this + callback function. */ + ( void ) pxExpiredTimer; + + ucOneShotTimerCounter++; +} +/*-----------------------------------------------------------*/ + +static void prvISRAutoReloadTimerCallback( xTimerHandle pxExpiredTimer ) +{ + /* The parameter is not used in this case as only one timer uses this + callback function. */ + ( void ) pxExpiredTimer; + + ucISRAutoReloadTimerCounter++; +} +/*-----------------------------------------------------------*/ + +static void prvISROneShotTimerCallback( xTimerHandle pxExpiredTimer ) +{ + /* The parameter is not used in this case as only one timer uses this + callback function. */ + ( void ) pxExpiredTimer; + + ucISROneShotTimerCounter++; +} +/*-----------------------------------------------------------*/ + + + + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/blocktim.c b/third_party/FreeRTOS/Demo/Common/Minimal/blocktim.c new file mode 100644 index 0000000..cef2ba6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/blocktim.c @@ -0,0 +1,505 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This file contains some test scenarios that ensure tasks do not exit queue + * send or receive functions prematurely. A description of the tests is + * included within the code. + */ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +/* Demo includes. */ +#include "blocktim.h" + +/* Task priorities. Allow these to be overridden. */ +#ifndef bktPRIMARY_PRIORITY + #define bktPRIMARY_PRIORITY ( configMAX_PRIORITIES - 3 ) +#endif + +#ifndef bktSECONDARY_PRIORITY + #define bktSECONDARY_PRIORITY ( configMAX_PRIORITIES - 4 ) +#endif + +/* Task behaviour. */ +#define bktQUEUE_LENGTH ( 5 ) +#define bktSHORT_WAIT ( ( ( portTickType ) 20 ) / portTICK_RATE_MS ) +#define bktPRIMARY_BLOCK_TIME ( 10 ) +#define bktALLOWABLE_MARGIN ( 15 ) +#define bktTIME_TO_BLOCK ( 175 ) +#define bktDONT_BLOCK ( ( portTickType ) 0 ) +#define bktRUN_INDICATOR ( ( unsigned portBASE_TYPE ) 0x55 ) + +/* The queue on which the tasks block. */ +static xQueueHandle xTestQueue; + +/* Handle to the secondary task is required by the primary task for calls +to vTaskSuspend/Resume(). */ +static xTaskHandle xSecondary; + +/* Used to ensure that tasks are still executing without error. */ +static volatile portBASE_TYPE xPrimaryCycles = 0, xSecondaryCycles = 0; +static volatile portBASE_TYPE xErrorOccurred = pdFALSE; + +/* Provides a simple mechanism for the primary task to know when the +secondary task has executed. */ +static volatile unsigned portBASE_TYPE xRunIndicator; + +/* The two test tasks. Their behaviour is commented within the files. */ +static void vPrimaryBlockTimeTestTask( void *pvParameters ); +static void vSecondaryBlockTimeTestTask( void *pvParameters ); + +/*-----------------------------------------------------------*/ + +void vCreateBlockTimeTasks( void ) +{ + /* Create the queue on which the two tasks block. */ + xTestQueue = xQueueCreate( bktQUEUE_LENGTH, sizeof( portBASE_TYPE ) ); + + /* vQueueAddToRegistry() adds the queue to the queue registry, if one is + in use. The queue registry is provided as a means for kernel aware + debuggers to locate queues and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( xTestQueue, ( signed char * ) "Block_Time_Queue" ); + + /* Create the two test tasks. */ + xTaskCreate( vPrimaryBlockTimeTestTask, ( signed char * )"BTest1", configMINIMAL_STACK_SIZE, NULL, bktPRIMARY_PRIORITY, NULL ); + xTaskCreate( vSecondaryBlockTimeTestTask, ( signed char * )"BTest2", configMINIMAL_STACK_SIZE, NULL, bktSECONDARY_PRIORITY, &xSecondary ); +} +/*-----------------------------------------------------------*/ + +static void vPrimaryBlockTimeTestTask( void *pvParameters ) +{ +portBASE_TYPE xItem, xData; +portTickType xTimeWhenBlocking; +portTickType xTimeToBlock, xBlockedTime; + + ( void ) pvParameters; + + for( ;; ) + { + /********************************************************************* + Test 1 + + Simple block time wakeup test on queue receives. */ + for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ ) + { + /* The queue is empty. Attempt to read from the queue using a block + time. When we wake, ensure the delta in time is as expected. */ + xTimeToBlock = ( portTickType ) ( bktPRIMARY_BLOCK_TIME << xItem ); + + xTimeWhenBlocking = xTaskGetTickCount(); + + /* We should unblock after xTimeToBlock having not received + anything on the queue. */ + if( xQueueReceive( xTestQueue, &xData, xTimeToBlock ) != errQUEUE_EMPTY ) + { + xErrorOccurred = pdTRUE; + } + + /* How long were we blocked for? */ + xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking; + + if( xBlockedTime < xTimeToBlock ) + { + /* Should not have blocked for less than we requested. */ + xErrorOccurred = pdTRUE; + } + + if( xBlockedTime > ( xTimeToBlock + bktALLOWABLE_MARGIN ) ) + { + /* Should not have blocked for longer than we requested, + although we would not necessarily run as soon as we were + unblocked so a margin is allowed. */ + xErrorOccurred = pdTRUE; + } + } + + /********************************************************************* + Test 2 + + Simple block time wakeup test on queue sends. + + First fill the queue. It should be empty so all sends should pass. */ + for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ ) + { + if( xQueueSend( xTestQueue, &xItem, bktDONT_BLOCK ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + } + + for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ ) + { + /* The queue is full. Attempt to write to the queue using a block + time. When we wake, ensure the delta in time is as expected. */ + xTimeToBlock = ( portTickType ) ( bktPRIMARY_BLOCK_TIME << xItem ); + + xTimeWhenBlocking = xTaskGetTickCount(); + + /* We should unblock after xTimeToBlock having not received + anything on the queue. */ + if( xQueueSend( xTestQueue, &xItem, xTimeToBlock ) != errQUEUE_FULL ) + { + xErrorOccurred = pdTRUE; + } + + /* How long were we blocked for? */ + xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking; + + if( xBlockedTime < xTimeToBlock ) + { + /* Should not have blocked for less than we requested. */ + xErrorOccurred = pdTRUE; + } + + if( xBlockedTime > ( xTimeToBlock + bktALLOWABLE_MARGIN ) ) + { + /* Should not have blocked for longer than we requested, + although we would not necessarily run as soon as we were + unblocked so a margin is allowed. */ + xErrorOccurred = pdTRUE; + } + } + + /********************************************************************* + Test 3 + + Wake the other task, it will block attempting to post to the queue. + When we read from the queue the other task will wake, but before it + can run we will post to the queue again. When the other task runs it + will find the queue still full, even though it was woken. It should + recognise that its block time has not expired and return to block for + the remains of its block time. + + Wake the other task so it blocks attempting to post to the already + full queue. */ + xRunIndicator = 0; + vTaskResume( xSecondary ); + + /* We need to wait a little to ensure the other task executes. */ + while( xRunIndicator != bktRUN_INDICATOR ) + { + /* The other task has not yet executed. */ + vTaskDelay( bktSHORT_WAIT ); + } + /* Make sure the other task is blocked on the queue. */ + vTaskDelay( bktSHORT_WAIT ); + xRunIndicator = 0; + + for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ ) + { + /* Now when we make space on the queue the other task should wake + but not execute as this task has higher priority. */ + if( xQueueReceive( xTestQueue, &xData, bktDONT_BLOCK ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + /* Now fill the queue again before the other task gets a chance to + execute. If the other task had executed we would find the queue + full ourselves, and the other task have set xRunIndicator. */ + if( xQueueSend( xTestQueue, &xItem, bktDONT_BLOCK ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + if( xRunIndicator == bktRUN_INDICATOR ) + { + /* The other task should not have executed. */ + xErrorOccurred = pdTRUE; + } + + /* Raise the priority of the other task so it executes and blocks + on the queue again. */ + vTaskPrioritySet( xSecondary, bktPRIMARY_PRIORITY + 2 ); + + /* The other task should now have re-blocked without exiting the + queue function. */ + if( xRunIndicator == bktRUN_INDICATOR ) + { + /* The other task should not have executed outside of the + queue function. */ + xErrorOccurred = pdTRUE; + } + + /* Set the priority back down. */ + vTaskPrioritySet( xSecondary, bktSECONDARY_PRIORITY ); + } + + /* Let the other task timeout. When it unblockes it will check that it + unblocked at the correct time, then suspend itself. */ + while( xRunIndicator != bktRUN_INDICATOR ) + { + vTaskDelay( bktSHORT_WAIT ); + } + vTaskDelay( bktSHORT_WAIT ); + xRunIndicator = 0; + + + /********************************************************************* + Test 4 + + As per test 3 - but with the send and receive the other way around. + The other task blocks attempting to read from the queue. + + Empty the queue. We should find that it is full. */ + for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ ) + { + if( xQueueReceive( xTestQueue, &xData, bktDONT_BLOCK ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + } + + /* Wake the other task so it blocks attempting to read from the + already empty queue. */ + vTaskResume( xSecondary ); + + /* We need to wait a little to ensure the other task executes. */ + while( xRunIndicator != bktRUN_INDICATOR ) + { + vTaskDelay( bktSHORT_WAIT ); + } + vTaskDelay( bktSHORT_WAIT ); + xRunIndicator = 0; + + for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ ) + { + /* Now when we place an item on the queue the other task should + wake but not execute as this task has higher priority. */ + if( xQueueSend( xTestQueue, &xItem, bktDONT_BLOCK ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + /* Now empty the queue again before the other task gets a chance to + execute. If the other task had executed we would find the queue + empty ourselves, and the other task would be suspended. */ + if( xQueueReceive( xTestQueue, &xData, bktDONT_BLOCK ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + if( xRunIndicator == bktRUN_INDICATOR ) + { + /* The other task should not have executed. */ + xErrorOccurred = pdTRUE; + } + + /* Raise the priority of the other task so it executes and blocks + on the queue again. */ + vTaskPrioritySet( xSecondary, bktPRIMARY_PRIORITY + 2 ); + + /* The other task should now have re-blocked without exiting the + queue function. */ + if( xRunIndicator == bktRUN_INDICATOR ) + { + /* The other task should not have executed outside of the + queue function. */ + xErrorOccurred = pdTRUE; + } + vTaskPrioritySet( xSecondary, bktSECONDARY_PRIORITY ); + } + + /* Let the other task timeout. When it unblockes it will check that it + unblocked at the correct time, then suspend itself. */ + while( xRunIndicator != bktRUN_INDICATOR ) + { + vTaskDelay( bktSHORT_WAIT ); + } + vTaskDelay( bktSHORT_WAIT ); + + xPrimaryCycles++; + } +} +/*-----------------------------------------------------------*/ + +static void vSecondaryBlockTimeTestTask( void *pvParameters ) +{ +portTickType xTimeWhenBlocking, xBlockedTime; +portBASE_TYPE xData; + + ( void ) pvParameters; + + for( ;; ) + { + /********************************************************************* + Test 1 and 2 + + This task does does not participate in these tests. */ + vTaskSuspend( NULL ); + + /********************************************************************* + Test 3 + + The first thing we do is attempt to read from the queue. It should be + full so we block. Note the time before we block so we can check the + wake time is as per that expected. */ + xTimeWhenBlocking = xTaskGetTickCount(); + + /* We should unblock after bktTIME_TO_BLOCK having not sent + anything to the queue. */ + xData = 0; + xRunIndicator = bktRUN_INDICATOR; + if( xQueueSend( xTestQueue, &xData, bktTIME_TO_BLOCK ) != errQUEUE_FULL ) + { + xErrorOccurred = pdTRUE; + } + + /* How long were we inside the send function? */ + xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking; + + /* We should not have blocked for less time than bktTIME_TO_BLOCK. */ + if( xBlockedTime < bktTIME_TO_BLOCK ) + { + xErrorOccurred = pdTRUE; + } + + /* We should of not blocked for much longer than bktALLOWABLE_MARGIN + either. A margin is permitted as we would not necessarily run as + soon as we unblocked. */ + if( xBlockedTime > ( bktTIME_TO_BLOCK + bktALLOWABLE_MARGIN ) ) + { + xErrorOccurred = pdTRUE; + } + + /* Suspend ready for test 3. */ + xRunIndicator = bktRUN_INDICATOR; + vTaskSuspend( NULL ); + + /********************************************************************* + Test 4 + + As per test three, but with the send and receive reversed. */ + xTimeWhenBlocking = xTaskGetTickCount(); + + /* We should unblock after bktTIME_TO_BLOCK having not received + anything on the queue. */ + xRunIndicator = bktRUN_INDICATOR; + if( xQueueReceive( xTestQueue, &xData, bktTIME_TO_BLOCK ) != errQUEUE_EMPTY ) + { + xErrorOccurred = pdTRUE; + } + + xBlockedTime = xTaskGetTickCount() - xTimeWhenBlocking; + + /* We should not have blocked for less time than bktTIME_TO_BLOCK. */ + if( xBlockedTime < bktTIME_TO_BLOCK ) + { + xErrorOccurred = pdTRUE; + } + + /* We should of not blocked for much longer than bktALLOWABLE_MARGIN + either. A margin is permitted as we would not necessarily run as soon + as we unblocked. */ + if( xBlockedTime > ( bktTIME_TO_BLOCK + bktALLOWABLE_MARGIN ) ) + { + xErrorOccurred = pdTRUE; + } + + xRunIndicator = bktRUN_INDICATOR; + + xSecondaryCycles++; + } +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xAreBlockTimeTestTasksStillRunning( void ) +{ +static portBASE_TYPE xLastPrimaryCycleCount = 0, xLastSecondaryCycleCount = 0; +portBASE_TYPE xReturn = pdPASS; + + /* Have both tasks performed at least one cycle since this function was + last called? */ + if( xPrimaryCycles == xLastPrimaryCycleCount ) + { + xReturn = pdFAIL; + } + + if( xSecondaryCycles == xLastSecondaryCycleCount ) + { + xReturn = pdFAIL; + } + + if( xErrorOccurred == pdTRUE ) + { + xReturn = pdFAIL; + } + + xLastSecondaryCycleCount = xSecondaryCycles; + xLastPrimaryCycleCount = xPrimaryCycles; + + return xReturn; +} diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/comtest.c b/third_party/FreeRTOS/Demo/Common/Minimal/comtest.c new file mode 100644 index 0000000..3295535 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/comtest.c @@ -0,0 +1,303 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * This version of comtest. c is for use on systems that have limited stack + * space and no display facilities. The complete version can be found in + * the Demo/Common/Full directory. + * + * Creates two tasks that operate on an interrupt driven serial port. A + * loopback connector should be used so that everything that is transmitted is + * also received. The serial port does not use any flow control. On a + * standard 9way 'D' connector pins two and three should be connected together. + * + * The first task posts a sequence of characters to the Tx queue, toggling an + * LED on each successful post. At the end of the sequence it sleeps for a + * pseudo-random period before resending the same sequence. + * + * The UART Tx end interrupt is enabled whenever data is available in the Tx + * queue. The Tx end ISR removes a single character from the Tx queue and + * passes it to the UART for transmission. + * + * The second task blocks on the Rx queue waiting for a character to become + * available. When the UART Rx end interrupt receives a character it places + * it in the Rx queue, waking the second task. The second task checks that the + * characters removed from the Rx queue form the same sequence as those posted + * to the Tx queue, and toggles an LED for each correct character. + * + * The receiving task is spawned with a higher priority than the transmitting + * task. The receiver will therefore wake every time a character is + * transmitted so neither the Tx or Rx queue should ever hold more than a few + * characters. + * + */ + +/* Scheduler include files. */ +#include +#include "FreeRTOS.h" +#include "task.h" + +/* Demo program include files. */ +#include "serial.h" +#include "comtest.h" +#include "partest.h" + +#define comSTACK_SIZE configMINIMAL_STACK_SIZE +#define comTX_LED_OFFSET ( 0 ) +#define comRX_LED_OFFSET ( 1 ) +#define comTOTAL_PERMISSIBLE_ERRORS ( 2 ) + +/* The Tx task will transmit the sequence of characters at a pseudo random +interval. This is the maximum and minimum block time between sends. */ +#define comTX_MAX_BLOCK_TIME ( ( portTickType ) 0x96 ) +#define comTX_MIN_BLOCK_TIME ( ( portTickType ) 0x32 ) +#define comOFFSET_TIME ( ( portTickType ) 3 ) + +/* We should find that each character can be queued for Tx immediately and we +don't have to block to send. */ +#define comNO_BLOCK ( ( portTickType ) 0 ) + +/* The Rx task will block on the Rx queue for a long period. */ +#define comRX_BLOCK_TIME ( ( portTickType ) 0xffff ) + +/* The sequence transmitted is from comFIRST_BYTE to and including comLAST_BYTE. */ +#define comFIRST_BYTE ( 'A' ) +#define comLAST_BYTE ( 'X' ) + +#define comBUFFER_LEN ( ( unsigned portBASE_TYPE ) ( comLAST_BYTE - comFIRST_BYTE ) + ( unsigned portBASE_TYPE ) 1 ) +#define comINITIAL_RX_COUNT_VALUE ( 0 ) + +/* Handle to the com port used by both tasks. */ +static xComPortHandle xPort = NULL; + +/* The transmit task as described at the top of the file. */ +static portTASK_FUNCTION_PROTO( vComTxTask, pvParameters ); + +/* The receive task as described at the top of the file. */ +static portTASK_FUNCTION_PROTO( vComRxTask, pvParameters ); + +/* The LED that should be toggled by the Rx and Tx tasks. The Rx task will +toggle LED ( uxBaseLED + comRX_LED_OFFSET). The Tx task will toggle LED +( uxBaseLED + comTX_LED_OFFSET ). */ +static unsigned portBASE_TYPE uxBaseLED = 0; + +/* Check variable used to ensure no error have occurred. The Rx task will +increment this variable after every successfully received sequence. If at any +time the sequence is incorrect the the variable will stop being incremented. */ +static volatile unsigned portBASE_TYPE uxRxLoops = comINITIAL_RX_COUNT_VALUE; + +/*-----------------------------------------------------------*/ + +void vAltStartComTestTasks( unsigned portBASE_TYPE uxPriority, unsigned long ulBaudRate, unsigned portBASE_TYPE uxLED ) +{ + /* Initialise the com port then spawn the Rx and Tx tasks. */ + uxBaseLED = uxLED; + xSerialPortInitMinimal( ulBaudRate, comBUFFER_LEN ); + + /* The Tx task is spawned with a lower priority than the Rx task. */ + xTaskCreate( vComTxTask, ( signed char * ) "COMTx", comSTACK_SIZE, NULL, uxPriority - 1, ( xTaskHandle * ) NULL ); + xTaskCreate( vComRxTask, ( signed char * ) "COMRx", comSTACK_SIZE, NULL, uxPriority, ( xTaskHandle * ) NULL ); +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vComTxTask, pvParameters ) +{ +signed char cByteToSend; +portTickType xTimeToWait; + + /* Just to stop compiler warnings. */ + ( void ) pvParameters; + + for( ;; ) + { + /* Simply transmit a sequence of characters from comFIRST_BYTE to + comLAST_BYTE. */ + for( cByteToSend = comFIRST_BYTE; cByteToSend <= comLAST_BYTE; cByteToSend++ ) + { + if( xSerialPutChar( xPort, cByteToSend, comNO_BLOCK ) == pdPASS ) + { + vParTestToggleLED( uxBaseLED + comTX_LED_OFFSET ); + } + } + + /* Turn the LED off while we are not doing anything. */ + vParTestSetLED( uxBaseLED + comTX_LED_OFFSET, pdFALSE ); + + /* We have posted all the characters in the string - wait before + re-sending. Wait a pseudo-random time as this will provide a better + test. */ + xTimeToWait = xTaskGetTickCount() + comOFFSET_TIME; + + /* Make sure we don't wait too long... */ + xTimeToWait %= comTX_MAX_BLOCK_TIME; + + /* ...but we do want to wait. */ + if( xTimeToWait < comTX_MIN_BLOCK_TIME ) + { + xTimeToWait = comTX_MIN_BLOCK_TIME; + } + + vTaskDelay( xTimeToWait ); + } +} /*lint !e715 !e818 pvParameters is required for a task function even if it is not referenced. */ +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vComRxTask, pvParameters ) +{ +signed char cExpectedByte, cByteRxed; +portBASE_TYPE xResyncRequired = pdFALSE, xErrorOccurred = pdFALSE; + + /* Just to stop compiler warnings. */ + ( void ) pvParameters; + + for( ;; ) + { + /* We expect to receive the characters from comFIRST_BYTE to + comLAST_BYTE in an incrementing order. Loop to receive each byte. */ + for( cExpectedByte = comFIRST_BYTE; cExpectedByte <= comLAST_BYTE; cExpectedByte++ ) + { + /* Block on the queue that contains received bytes until a byte is + available. */ + if( xSerialGetChar( xPort, &cByteRxed, comRX_BLOCK_TIME ) ) + { + /* Was this the byte we were expecting? If so, toggle the LED, + otherwise we are out on sync and should break out of the loop + until the expected character sequence is about to restart. */ + if( cByteRxed == cExpectedByte ) + { + vParTestToggleLED( uxBaseLED + comRX_LED_OFFSET ); + } + else + { + xResyncRequired = pdTRUE; + break; /*lint !e960 Non-switch break allowed. */ + } + } + } + + /* Turn the LED off while we are not doing anything. */ + vParTestSetLED( uxBaseLED + comRX_LED_OFFSET, pdFALSE ); + + /* Did we break out of the loop because the characters were received in + an unexpected order? If so wait here until the character sequence is + about to restart. */ + if( xResyncRequired == pdTRUE ) + { + while( cByteRxed != comLAST_BYTE ) + { + /* Block until the next char is available. */ + xSerialGetChar( xPort, &cByteRxed, comRX_BLOCK_TIME ); + } + + /* Note that an error occurred which caused us to have to resync. + We use this to stop incrementing the loop counter so + sAreComTestTasksStillRunning() will return false - indicating an + error. */ + xErrorOccurred++; + + /* We have now resynced with the Tx task and can continue. */ + xResyncRequired = pdFALSE; + } + else + { + if( xErrorOccurred < comTOTAL_PERMISSIBLE_ERRORS ) + { + /* Increment the count of successful loops. As error + occurring (i.e. an unexpected character being received) will + prevent this counter being incremented for the rest of the + execution. Don't worry about mutual exclusion on this + variable - it doesn't really matter as we just want it + to change. */ + uxRxLoops++; + } + } + } +} /*lint !e715 !e818 pvParameters is required for a task function even if it is not referenced. */ +/*-----------------------------------------------------------*/ + +portBASE_TYPE xAreComTestTasksStillRunning( void ) +{ +portBASE_TYPE xReturn; + + /* If the count of successful reception loops has not changed than at + some time an error occurred (i.e. a character was received out of sequence) + and we will return false. */ + if( uxRxLoops == comINITIAL_RX_COUNT_VALUE ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + /* Reset the count of successful Rx loops. When this function is called + again we expect this to have been incremented. */ + uxRxLoops = comINITIAL_RX_COUNT_VALUE; + + return xReturn; +} + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/comtest_strings.c b/third_party/FreeRTOS/Demo/Common/Minimal/comtest_strings.c new file mode 100644 index 0000000..11b80c4 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/comtest_strings.c @@ -0,0 +1,349 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * Creates a task and a timer that operate on an interrupt driven serial port. + * This demo assumes that the characters transmitted on a port will also be + * received on the same port. Therefore, the UART must either be connected to + * an echo server, or the uart connector must have a loopback connector fitted. + * See http://www.serialporttool.com/CommEcho.htm for a suitable echo server + * for Windows hosts. + * + * The timer sends a string to the UART, toggles an LED, then resets itself by + * changing its own period. The period is calculated as a pseudo random number + * between comTX_MAX_BLOCK_TIME and comTX_MIN_BLOCK_TIME. + * + * The task blocks on an Rx queue waiting for a character to become available. + * Received characters are checked to ensure they match those transmitted by the + * Tx timer. An error is latched if characters are missing, incorrect, or + * arrive too slowly. + * + * How characters are actually transmitted and received is port specific. Demos + * that include this test/demo file will provide example drivers. The Tx timer + * executes in the context of the timer service (daemon) task, and must + * therefore never attempt to block. + * + */ + +/* Scheduler include files. */ +#include +#include +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" + +#ifndef configUSE_TIMERS + #error This demo uses timers. configUSE_TIMERS must be set to 1 in FreeRTOSConfig.h. +#endif + +#if configUSE_TIMERS != 1 + #error This demo uses timers. configUSE_TIMERS must be set to 1 in FreeRTOSConfig.h. +#endif + + +/* Demo program include files. */ +#include "serial.h" +#include "comtest_strings.h" +#include "partest.h" + +/* The size of the stack given to the Rx task. */ +#define comSTACK_SIZE configMINIMAL_STACK_SIZE + +/* See the comment above the declaraction of the uxBaseLED variable. */ +#define comTX_LED_OFFSET ( 0 ) +#define comRX_LED_OFFSET ( 1 ) + +/* The Tx timer transmits the sequence of characters at a pseudo random +interval that is capped between comTX_MAX_BLOCK_TIME and +comTX_MIN_BLOCK_TIME. */ +#define comTX_MAX_BLOCK_TIME ( ( portTickType ) 0x96 ) +#define comTX_MIN_BLOCK_TIME ( ( portTickType ) 0x32 ) +#define comOFFSET_TIME ( ( portTickType ) 3 ) + +/* States for the simple state machine implemented in the Rx task. */ +#define comtstWAITING_START_OF_STRING 0 +#define comtstWAITING_END_OF_STRING 1 + +/* A short delay in ticks - this delay is used to allow the Rx queue to fill up +a bit so more than one character can be processed at a time. This is relative +to comTX_MIN_BLOCK_TIME to ensure it is never longer than the shortest gap +between transmissions. It could be worked out more scientifically from the +baud rate being used. */ +#define comSHORT_DELAY ( comTX_MIN_BLOCK_TIME >> ( portTickType ) 2 ) + +/* The string that is transmitted and received. */ +#define comTRANSACTED_STRING "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890" + +/* A block time of 0 simply means "don't block". */ +#define comtstDONT_BLOCK ( portTickType ) 0 + +/* Handle to the com port used by both tasks. */ +static xComPortHandle xPort = NULL; + +/* The callback function allocated to the transmit timer, as described in the +comments at the top of this file. */ +static void prvComTxTimerCallback( xTimerHandle xTimer ); + +/* The receive task as described in the comments at the top of this file. */ +static void vComRxTask( void *pvParameters ); + +/* The Rx task will toggle LED ( uxBaseLED + comRX_LED_OFFSET). The Tx task +will toggle LED ( uxBaseLED + comTX_LED_OFFSET ). */ +static unsigned portBASE_TYPE uxBaseLED = 0; + +/* The Rx task toggles uxRxLoops on each successful iteration of its defined +function - provided no errors have ever been latched. If this variable stops +incrementing, then an error has occurred. */ +static volatile unsigned portBASE_TYPE uxRxLoops = 0UL; + +/* The timer used to periodically transmit the string. This is the timer that +has prvComTxTimerCallback allocated to it as its callback function. */ +static xTimerHandle xTxTimer = NULL; + +/* The string length is held at file scope so the Tx timer does not need to +calculate it each time it executes. */ +static size_t xStringLength = 0U; + +/*-----------------------------------------------------------*/ + +void vStartComTestStringsTasks( unsigned portBASE_TYPE uxPriority, unsigned long ulBaudRate, unsigned portBASE_TYPE uxLED ) +{ + /* Store values that are used at run time. */ + uxBaseLED = uxLED; + + /* Calculate the string length here, rather than each time the Tx timer + executes. */ + xStringLength = strlen( comTRANSACTED_STRING ); + + /* Include the null terminator in the string length as this is used to + detect the end of the string in the Rx task. */ + xStringLength++; + + /* Initialise the com port, then spawn the Rx task and create the Tx + timer. */ + xSerialPortInitMinimal( ulBaudRate, ( xStringLength * 2U ) ); + + /* Create the Rx task and the Tx timer. The timer is started from the + Rx task. */ + xTaskCreate( vComRxTask, ( signed char * ) "COMRx", comSTACK_SIZE, NULL, uxPriority, ( xTaskHandle * ) NULL ); + xTxTimer = xTimerCreate( ( const signed char * ) "TxTimer", comTX_MIN_BLOCK_TIME, pdFALSE, NULL, prvComTxTimerCallback ); + configASSERT( xTxTimer ); +} +/*-----------------------------------------------------------*/ + +static void prvComTxTimerCallback( xTimerHandle xTimer ) +{ +portTickType xTimeToWait; + + /* The parameter is not used in this case. */ + ( void ) xTimer; + + /* Send the string. How this is actually performed depends on the + sample driver provided with this demo. However - as this is a timer, + it executes in the context of the timer task and therefore must not + block. */ + vSerialPutString( xPort, ( const signed char * const ) comTRANSACTED_STRING, xStringLength ); + + /* Toggle an LED to give a visible indication that another transmission + has been performed. */ + vParTestToggleLED( uxBaseLED + comTX_LED_OFFSET ); + + /* Wait a pseudo random time before sending the string again. */ + xTimeToWait = xTaskGetTickCount() + comOFFSET_TIME; + + /* Ensure the time to wait is not greater than comTX_MAX_BLOCK_TIME. */ + xTimeToWait %= comTX_MAX_BLOCK_TIME; + + /* Ensure the time to wait is not less than comTX_MIN_BLOCK_TIME. */ + if( xTimeToWait < comTX_MIN_BLOCK_TIME ) + { + xTimeToWait = comTX_MIN_BLOCK_TIME; + } + + /* Reset the timer to run again xTimeToWait ticks from now. This function + is called from the context of the timer task, so the block time must not + be anything other than zero. */ + xTimerChangePeriod( xTxTimer, xTimeToWait, comtstDONT_BLOCK ); +} +/*-----------------------------------------------------------*/ + +static void vComRxTask( void *pvParameters ) +{ +portBASE_TYPE xState = comtstWAITING_START_OF_STRING, xErrorOccurred = pdFALSE; +signed char *pcExpectedByte, cRxedChar; +const xComPortHandle xPort = NULL; + + /* The parameter is not used in this example. */ + ( void ) pvParameters; + + /* Start the Tx timer. This only needs to be started once, as it will + reset itself thereafter. */ + xTimerStart( xTxTimer, portMAX_DELAY ); + + /* The first expected Rx character is the first in the string that is + transmitted. */ + pcExpectedByte = ( signed char * ) comTRANSACTED_STRING; + + for( ;; ) + { + /* Wait for the next character. */ + if( xSerialGetChar( xPort, &cRxedChar, ( comTX_MAX_BLOCK_TIME * 2 ) ) == pdFALSE ) + { + /* A character definitely should have been received by now. As a + character was not received an error must have occurred (which might + just be that the loopback connector is not fitted). */ + xErrorOccurred = pdTRUE; + } + + switch( xState ) + { + case comtstWAITING_START_OF_STRING: + if( cRxedChar == *pcExpectedByte ) + { + /* The received character was the first character of the + string. Move to the next state to check each character + as it comes in until the entire string has been received. */ + xState = comtstWAITING_END_OF_STRING; + pcExpectedByte++; + + /* Block for a short period. This just allows the Rx queue + to contain more than one character, and therefore prevent + thrashing reads to the queue, and repetitive context + switches as each character is received. */ + vTaskDelay( comSHORT_DELAY ); + } + break; + + case comtstWAITING_END_OF_STRING: + if( cRxedChar == *pcExpectedByte ) + { + /* The received character was the expected character. Was + it the last character in the string - i.e. the null + terminator? */ + if( cRxedChar == 0x00 ) + { + /* The entire string has been received. If no errors + have been latched, then increment the loop counter to + show this task is still healthy. */ + if( xErrorOccurred == pdFALSE ) + { + uxRxLoops++; + + /* Toggle an LED to give a visible sign that a + complete string has been received. */ + vParTestToggleLED( uxBaseLED + comRX_LED_OFFSET ); + } + + /* Go back to wait for the start of the next string. */ + pcExpectedByte = ( signed char * ) comTRANSACTED_STRING; + xState = comtstWAITING_START_OF_STRING; + } + else + { + /* Wait for the next character in the string. */ + pcExpectedByte++; + } + } + else + { + /* The character received was not that expected. */ + xErrorOccurred = pdTRUE; + } + break; + + default: + /* Should not get here. Stop the Rx loop counter from + incrementing to latch the error. */ + xErrorOccurred = pdTRUE; + break; + } + } +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xAreComTestTasksStillRunning( void ) +{ +portBASE_TYPE xReturn; + + /* If the count of successful reception loops has not changed than at + some time an error occurred (i.e. a character was received out of sequence) + and false is returned. */ + if( uxRxLoops == 0UL ) + { + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + + /* Reset the count of successful Rx loops. When this function is called + again it should have been incremented again. */ + uxRxLoops = 0UL; + + return xReturn; +} + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/countsem.c b/third_party/FreeRTOS/Demo/Common/Minimal/countsem.c new file mode 100644 index 0000000..d38e4f4 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/countsem.c @@ -0,0 +1,322 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * Simple demonstration of the usage of counting semaphore. + */ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +/* Demo program include files. */ +#include "countsem.h" + +/* The maximum count value that the semaphore used for the demo can hold. */ +#define countMAX_COUNT_VALUE ( 200 ) + +/* Constants used to indicate whether or not the semaphore should have been +created with its maximum count value, or its minimum count value. These +numbers are used to ensure that the pointers passed in as the task parameters +are valid. */ +#define countSTART_AT_MAX_COUNT ( 0xaa ) +#define countSTART_AT_ZERO ( 0x55 ) + +/* Two tasks are created for the test. One uses a semaphore created with its +count value set to the maximum, and one with the count value set to zero. */ +#define countNUM_TEST_TASKS ( 2 ) +#define countDONT_BLOCK ( 0 ) + +/*-----------------------------------------------------------*/ + +/* Flag that will be latched to pdTRUE should any unexpected behaviour be +detected in any of the tasks. */ +static volatile portBASE_TYPE xErrorDetected = pdFALSE; + +/*-----------------------------------------------------------*/ + +/* + * The demo task. This simply counts the semaphore up to its maximum value, + * the counts it back down again. The result of each semaphore 'give' and + * 'take' is inspected, with an error being flagged if it is found not to be + * the expected result. + */ +static void prvCountingSemaphoreTask( void *pvParameters ); + +/* + * Utility function to increment the semaphore count value up from zero to + * countMAX_COUNT_VALUE. + */ +static void prvIncrementSemaphoreCount( xSemaphoreHandle xSemaphore, unsigned portBASE_TYPE *puxLoopCounter ); + +/* + * Utility function to decrement the semaphore count value up from + * countMAX_COUNT_VALUE to zero. + */ +static void prvDecrementSemaphoreCount( xSemaphoreHandle xSemaphore, unsigned portBASE_TYPE *puxLoopCounter ); + +/*-----------------------------------------------------------*/ + +/* The structure that is passed into the task as the task parameter. */ +typedef struct COUNT_SEM_STRUCT +{ + /* The semaphore to be used for the demo. */ + xSemaphoreHandle xSemaphore; + + /* Set to countSTART_AT_MAX_COUNT if the semaphore should be created with + its count value set to its max count value, or countSTART_AT_ZERO if it + should have been created with its count value set to 0. */ + unsigned portBASE_TYPE uxExpectedStartCount; + + /* Incremented on each cycle of the demo task. Used to detect a stalled + task. */ + unsigned portBASE_TYPE uxLoopCounter; +} xCountSemStruct; + +/* Two structures are defined, one is passed to each test task. */ +static volatile xCountSemStruct xParameters[ countNUM_TEST_TASKS ]; + +/*-----------------------------------------------------------*/ + +void vStartCountingSemaphoreTasks( void ) +{ + /* Create the semaphores that we are going to use for the test/demo. The + first should be created such that it starts at its maximum count value, + the second should be created such that it starts with a count value of zero. */ + xParameters[ 0 ].xSemaphore = xSemaphoreCreateCounting( countMAX_COUNT_VALUE, countMAX_COUNT_VALUE ); + xParameters[ 0 ].uxExpectedStartCount = countSTART_AT_MAX_COUNT; + xParameters[ 0 ].uxLoopCounter = 0; + + xParameters[ 1 ].xSemaphore = xSemaphoreCreateCounting( countMAX_COUNT_VALUE, 0 ); + xParameters[ 1 ].uxExpectedStartCount = 0; + xParameters[ 1 ].uxLoopCounter = 0; + + /* vQueueAddToRegistry() adds the semaphore to the registry, if one is + in use. The registry is provided as a means for kernel aware + debuggers to locate semaphores and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( ( xQueueHandle ) xParameters[ 0 ].xSemaphore, ( signed portCHAR * ) "Counting_Sem_1" ); + vQueueAddToRegistry( ( xQueueHandle ) xParameters[ 1 ].xSemaphore, ( signed portCHAR * ) "Counting_Sem_2" ); + + + /* Were the semaphores created? */ + if( ( xParameters[ 0 ].xSemaphore != NULL ) || ( xParameters[ 1 ].xSemaphore != NULL ) ) + { + /* Create the demo tasks, passing in the semaphore to use as the parameter. */ + xTaskCreate( prvCountingSemaphoreTask, ( signed portCHAR * ) "CNT1", configMINIMAL_STACK_SIZE, ( void * ) &( xParameters[ 0 ] ), tskIDLE_PRIORITY, NULL ); + xTaskCreate( prvCountingSemaphoreTask, ( signed portCHAR * ) "CNT2", configMINIMAL_STACK_SIZE, ( void * ) &( xParameters[ 1 ] ), tskIDLE_PRIORITY, NULL ); + } +} +/*-----------------------------------------------------------*/ + +static void prvDecrementSemaphoreCount( xSemaphoreHandle xSemaphore, unsigned portBASE_TYPE *puxLoopCounter ) +{ +unsigned portBASE_TYPE ux; + + /* If the semaphore count is at its maximum then we should not be able to + 'give' the semaphore. */ + if( xSemaphoreGive( xSemaphore ) == pdPASS ) + { + xErrorDetected = pdTRUE; + } + + /* We should be able to 'take' the semaphore countMAX_COUNT_VALUE times. */ + for( ux = 0; ux < countMAX_COUNT_VALUE; ux++ ) + { + if( xSemaphoreTake( xSemaphore, countDONT_BLOCK ) != pdPASS ) + { + /* We expected to be able to take the semaphore. */ + xErrorDetected = pdTRUE; + } + + ( *puxLoopCounter )++; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* If the semaphore count is zero then we should not be able to 'take' + the semaphore. */ + if( xSemaphoreTake( xSemaphore, countDONT_BLOCK ) == pdPASS ) + { + xErrorDetected = pdTRUE; + } +} +/*-----------------------------------------------------------*/ + +static void prvIncrementSemaphoreCount( xSemaphoreHandle xSemaphore, unsigned portBASE_TYPE *puxLoopCounter ) +{ +unsigned portBASE_TYPE ux; + + /* If the semaphore count is zero then we should not be able to 'take' + the semaphore. */ + if( xSemaphoreTake( xSemaphore, countDONT_BLOCK ) == pdPASS ) + { + xErrorDetected = pdTRUE; + } + + /* We should be able to 'give' the semaphore countMAX_COUNT_VALUE times. */ + for( ux = 0; ux < countMAX_COUNT_VALUE; ux++ ) + { + if( xSemaphoreGive( xSemaphore ) != pdPASS ) + { + /* We expected to be able to take the semaphore. */ + xErrorDetected = pdTRUE; + } + + ( *puxLoopCounter )++; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* If the semaphore count is at its maximum then we should not be able to + 'give' the semaphore. */ + if( xSemaphoreGive( xSemaphore ) == pdPASS ) + { + xErrorDetected = pdTRUE; + } +} +/*-----------------------------------------------------------*/ + +static void prvCountingSemaphoreTask( void *pvParameters ) +{ +xCountSemStruct *pxParameter; + + #ifdef USE_STDIO + void vPrintDisplayMessage( const portCHAR * const * ppcMessageToSend ); + + const portCHAR * const pcTaskStartMsg = "Counting semaphore demo started.\r\n"; + + /* Queue a message for printing to say the task has started. */ + vPrintDisplayMessage( &pcTaskStartMsg ); + #endif + + /* The semaphore to be used was passed as the parameter. */ + pxParameter = ( xCountSemStruct * ) pvParameters; + + /* Did we expect to find the semaphore already at its max count value, or + at zero? */ + if( pxParameter->uxExpectedStartCount == countSTART_AT_MAX_COUNT ) + { + prvDecrementSemaphoreCount( pxParameter->xSemaphore, &( pxParameter->uxLoopCounter ) ); + } + + /* Now we expect the semaphore count to be 0, so this time there is an + error if we can take the semaphore. */ + if( xSemaphoreTake( pxParameter->xSemaphore, 0 ) == pdPASS ) + { + xErrorDetected = pdTRUE; + } + + for( ;; ) + { + prvIncrementSemaphoreCount( pxParameter->xSemaphore, &( pxParameter->uxLoopCounter ) ); + prvDecrementSemaphoreCount( pxParameter->xSemaphore, &( pxParameter->uxLoopCounter ) ); + } +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xAreCountingSemaphoreTasksStillRunning( void ) +{ +static unsigned portBASE_TYPE uxLastCount0 = 0, uxLastCount1 = 0; +portBASE_TYPE xReturn = pdPASS; + + /* Return fail if any 'give' or 'take' did not result in the expected + behaviour. */ + if( xErrorDetected != pdFALSE ) + { + xReturn = pdFAIL; + } + + /* Return fail if either task is not still incrementing its loop counter. */ + if( uxLastCount0 == xParameters[ 0 ].uxLoopCounter ) + { + xReturn = pdFAIL; + } + else + { + uxLastCount0 = xParameters[ 0 ].uxLoopCounter; + } + + if( uxLastCount1 == xParameters[ 1 ].uxLoopCounter ) + { + xReturn = pdFAIL; + } + else + { + uxLastCount1 = xParameters[ 1 ].uxLoopCounter; + } + + return xReturn; +} + + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/crflash.c b/third_party/FreeRTOS/Demo/Common/Minimal/crflash.c new file mode 100644 index 0000000..9f0a1a8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/crflash.c @@ -0,0 +1,246 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This demo application file demonstrates the use of queues to pass data + * between co-routines. + * + * N represents the number of 'fixed delay' co-routines that are created and + * is set during initialisation. + * + * N 'fixed delay' co-routines are created that just block for a fixed + * period then post the number of an LED onto a queue. Each such co-routine + * uses a different block period. A single 'flash' co-routine is also created + * that blocks on the same queue, waiting for the number of the next LED it + * should flash. Upon receiving a number it simply toggle the instructed LED + * then blocks on the queue once more. In this manner each LED from LED 0 to + * LED N-1 is caused to flash at a different rate. + * + * The 'fixed delay' co-routines are created with co-routine priority 0. The + * flash co-routine is created with co-routine priority 1. This means that + * the queue should never contain more than a single item. This is because + * posting to the queue will unblock the 'flash' co-routine, and as this has + * a priority greater than the tasks posting to the queue it is guaranteed to + * have emptied the queue and blocked once again before the queue can contain + * any more date. An error is indicated if an attempt to post data to the + * queue fails - indicating that the queue is already full. + * + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "croutine.h" +#include "queue.h" + +/* Demo application includes. */ +#include "partest.h" +#include "crflash.h" + +/* The queue should only need to be of length 1. See the description at the +top of the file. */ +#define crfQUEUE_LENGTH 1 + +#define crfFIXED_DELAY_PRIORITY 0 +#define crfFLASH_PRIORITY 1 + +/* Only one flash co-routine is created so the index is not significant. */ +#define crfFLASH_INDEX 0 + +/* Don't allow more than crfMAX_FLASH_TASKS 'fixed delay' co-routines to be +created. */ +#define crfMAX_FLASH_TASKS 8 + +/* We don't want to block when posting to the queue. */ +#define crfPOSTING_BLOCK_TIME 0 + +/* + * The 'fixed delay' co-routine as described at the top of the file. + */ +static void prvFixedDelayCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* + * The 'flash' co-routine as described at the top of the file. + */ +static void prvFlashCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + +/* The queue used to pass data between the 'fixed delay' co-routines and the +'flash' co-routine. */ +static xQueueHandle xFlashQueue; + +/* This will be set to pdFALSE if we detect an error. */ +static portBASE_TYPE xCoRoutineFlashStatus = pdPASS; + +/*-----------------------------------------------------------*/ + +/* + * See the header file for details. + */ +void vStartFlashCoRoutines( unsigned portBASE_TYPE uxNumberToCreate ) +{ +unsigned portBASE_TYPE uxIndex; + + if( uxNumberToCreate > crfMAX_FLASH_TASKS ) + { + uxNumberToCreate = crfMAX_FLASH_TASKS; + } + + /* Create the queue used to pass data between the co-routines. */ + xFlashQueue = xQueueCreate( crfQUEUE_LENGTH, sizeof( unsigned portBASE_TYPE ) ); + + if( xFlashQueue ) + { + /* Create uxNumberToCreate 'fixed delay' co-routines. */ + for( uxIndex = 0; uxIndex < uxNumberToCreate; uxIndex++ ) + { + xCoRoutineCreate( prvFixedDelayCoRoutine, crfFIXED_DELAY_PRIORITY, uxIndex ); + } + + /* Create the 'flash' co-routine. */ + xCoRoutineCreate( prvFlashCoRoutine, crfFLASH_PRIORITY, crfFLASH_INDEX ); + } +} +/*-----------------------------------------------------------*/ + +static void prvFixedDelayCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +/* Even though this is a co-routine the xResult variable does not need to be +static as we do not need it to maintain its state between blocks. */ +signed portBASE_TYPE xResult; +/* The uxIndex parameter of the co-routine function is used as an index into +the xFlashRates array to obtain the delay period to use. */ +static const portTickType xFlashRates[ crfMAX_FLASH_TASKS ] = { 150 / portTICK_RATE_MS, + 200 / portTICK_RATE_MS, + 250 / portTICK_RATE_MS, + 300 / portTICK_RATE_MS, + 350 / portTICK_RATE_MS, + 400 / portTICK_RATE_MS, + 450 / portTICK_RATE_MS, + 500 / portTICK_RATE_MS }; + + /* Co-routines MUST start with a call to crSTART. */ + crSTART( xHandle ); + + for( ;; ) + { + /* Post our uxIndex value onto the queue. This is used as the LED to + flash. */ + crQUEUE_SEND( xHandle, xFlashQueue, ( void * ) &uxIndex, crfPOSTING_BLOCK_TIME, &xResult ); + + if( xResult != pdPASS ) + { + /* For the reasons stated at the top of the file we should always + find that we can post to the queue. If we could not then an error + has occurred. */ + xCoRoutineFlashStatus = pdFAIL; + } + + crDELAY( xHandle, xFlashRates[ uxIndex ] ); + } + + /* Co-routines MUST end with a call to crEND. */ + crEND(); +} +/*-----------------------------------------------------------*/ + +static void prvFlashCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +/* Even though this is a co-routine the variable do not need to be +static as we do not need it to maintain their state between blocks. */ +signed portBASE_TYPE xResult; +unsigned portBASE_TYPE uxLEDToFlash; + + /* Co-routines MUST start with a call to crSTART. */ + crSTART( xHandle ); + ( void ) uxIndex; + + for( ;; ) + { + /* Block to wait for the number of the LED to flash. */ + crQUEUE_RECEIVE( xHandle, xFlashQueue, &uxLEDToFlash, portMAX_DELAY, &xResult ); + + if( xResult != pdPASS ) + { + /* We would not expect to wake unless we received something. */ + xCoRoutineFlashStatus = pdFAIL; + } + else + { + /* We received the number of an LED to flash - flash it! */ + vParTestToggleLED( uxLEDToFlash ); + } + } + + /* Co-routines MUST end with a call to crEND. */ + crEND(); +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xAreFlashCoRoutinesStillRunning( void ) +{ + /* Return pdPASS or pdFAIL depending on whether an error has been detected + or not. */ + return xCoRoutineFlashStatus; +} + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/crhook.c b/third_party/FreeRTOS/Demo/Common/Minimal/crhook.c new file mode 100644 index 0000000..0eaba7d --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/crhook.c @@ -0,0 +1,270 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This demo file demonstrates how to send data between an ISR and a + * co-routine. A tick hook function is used to periodically pass data between + * the RTOS tick and a set of 'hook' co-routines. + * + * hookNUM_HOOK_CO_ROUTINES co-routines are created. Each co-routine blocks + * to wait for a character to be received on a queue from the tick ISR, checks + * to ensure the character received was that expected, then sends the number + * back to the tick ISR on a different queue. + * + * The tick ISR checks the numbers received back from the 'hook' co-routines + * matches the number previously sent. + * + * If at any time a queue function returns unexpectedly, or an incorrect value + * is received either by the tick hook or a co-routine then an error is + * latched. + * + * This demo relies on each 'hook' co-routine to execute between each + * hookTICK_CALLS_BEFORE_POST tick interrupts. This and the heavy use of + * queues from within an interrupt may result in an error being detected on + * slower targets simply due to timing. + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "croutine.h" +#include "queue.h" + +/* Demo application includes. */ +#include "crhook.h" + +/* The number of 'hook' co-routines that are to be created. */ +#define hookNUM_HOOK_CO_ROUTINES ( 4 ) + +/* The number of times the tick hook should be called before a character is +posted to the 'hook' co-routines. */ +#define hookTICK_CALLS_BEFORE_POST ( 500 ) + +/* There should never be more than one item in any queue at any time. */ +#define hookHOOK_QUEUE_LENGTH ( 1 ) + +/* Don't block when initially posting to the queue. */ +#define hookNO_BLOCK_TIME ( 0 ) + +/* The priority relative to other co-routines (rather than tasks) that the +'hook' co-routines should take. */ +#define mainHOOK_CR_PRIORITY ( 1 ) +/*-----------------------------------------------------------*/ + +/* + * The co-routine function itself. + */ +static void prvHookCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ); + + +/* + * The tick hook function. This receives a number from each 'hook' co-routine + * then sends a number to each co-routine. An error is flagged if a send or + * receive fails, or an unexpected number is received. + */ +void vApplicationTickHook( void ); + +/*-----------------------------------------------------------*/ + +/* Queues used to send data FROM a co-routine TO the tick hook function. +The hook functions received (Rx's) on these queues. One queue per +'hook' co-routine. */ +static xQueueHandle xHookRxQueues[ hookNUM_HOOK_CO_ROUTINES ]; + +/* Queues used to send data FROM the tick hook TO a co-routine function. +The hood function transmits (Tx's) on these queues. One queue per +'hook' co-routine. */ +static xQueueHandle xHookTxQueues[ hookNUM_HOOK_CO_ROUTINES ]; + +/* Set to true if an error is detected at any time. */ +static portBASE_TYPE xCoRoutineErrorDetected = pdFALSE; + +/*-----------------------------------------------------------*/ + +void vStartHookCoRoutines( void ) +{ +unsigned portBASE_TYPE uxIndex, uxValueToPost = 0; + + for( uxIndex = 0; uxIndex < hookNUM_HOOK_CO_ROUTINES; uxIndex++ ) + { + /* Create a queue to transmit to and receive from each 'hook' + co-routine. */ + xHookRxQueues[ uxIndex ] = xQueueCreate( hookHOOK_QUEUE_LENGTH, sizeof( unsigned portBASE_TYPE ) ); + xHookTxQueues[ uxIndex ] = xQueueCreate( hookHOOK_QUEUE_LENGTH, sizeof( unsigned portBASE_TYPE ) ); + + /* To start things off the tick hook function expects the queue it + uses to receive data to contain a value. */ + xQueueSend( xHookRxQueues[ uxIndex ], &uxValueToPost, hookNO_BLOCK_TIME ); + + /* Create the 'hook' co-routine itself. */ + xCoRoutineCreate( prvHookCoRoutine, mainHOOK_CR_PRIORITY, uxIndex ); + } +} +/*-----------------------------------------------------------*/ + +static unsigned portBASE_TYPE uxCallCounter = 0, uxNumberToPost = 0; +void vApplicationTickHook( void ) +{ +unsigned portBASE_TYPE uxReceivedNumber; +signed portBASE_TYPE xIndex, xCoRoutineWoken; + + /* Is it time to talk to the 'hook' co-routines again? */ + uxCallCounter++; + if( uxCallCounter >= hookTICK_CALLS_BEFORE_POST ) + { + uxCallCounter = 0; + + for( xIndex = 0; xIndex < hookNUM_HOOK_CO_ROUTINES; xIndex++ ) + { + xCoRoutineWoken = pdFALSE; + if( crQUEUE_RECEIVE_FROM_ISR( xHookRxQueues[ xIndex ], &uxReceivedNumber, &xCoRoutineWoken ) != pdPASS ) + { + /* There is no reason why we would not expect the queue to + contain a value. */ + xCoRoutineErrorDetected = pdTRUE; + } + else + { + /* Each queue used to receive data from the 'hook' co-routines + should contain the number we last posted to the same co-routine. */ + if( uxReceivedNumber != uxNumberToPost ) + { + xCoRoutineErrorDetected = pdTRUE; + } + + /* Nothing should be blocked waiting to post to the queue. */ + if( xCoRoutineWoken != pdFALSE ) + { + xCoRoutineErrorDetected = pdTRUE; + } + } + } + + /* Start the next cycle by posting the next number onto each Tx queue. */ + uxNumberToPost++; + + for( xIndex = 0; xIndex < hookNUM_HOOK_CO_ROUTINES; xIndex++ ) + { + if( crQUEUE_SEND_FROM_ISR( xHookTxQueues[ xIndex ], &uxNumberToPost, pdFALSE ) != pdTRUE ) + { + /* Posting to the queue should have woken the co-routine that + was blocked on the queue. */ + xCoRoutineErrorDetected = pdTRUE; + } + } + } +} +/*-----------------------------------------------------------*/ + +static void prvHookCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex ) +{ +static unsigned portBASE_TYPE uxReceivedValue[ hookNUM_HOOK_CO_ROUTINES ]; +portBASE_TYPE xResult; + + /* Each co-routine MUST start with a call to crSTART(); */ + crSTART( xHandle ); + + for( ;; ) + { + /* Wait to receive a value from the tick hook. */ + xResult = pdFAIL; + crQUEUE_RECEIVE( xHandle, xHookTxQueues[ uxIndex ], &( uxReceivedValue[ uxIndex ] ), portMAX_DELAY, &xResult ); + + /* There is no reason why we should not have received something on + the queue. */ + if( xResult != pdPASS ) + { + xCoRoutineErrorDetected = pdTRUE; + } + + /* Send the same number back to the idle hook so it can verify it. */ + xResult = pdFAIL; + crQUEUE_SEND( xHandle, xHookRxQueues[ uxIndex ], &( uxReceivedValue[ uxIndex ] ), hookNO_BLOCK_TIME, &xResult ); + if( xResult != pdPASS ) + { + /* There is no reason why we should not have been able to post to + the queue. */ + xCoRoutineErrorDetected = pdTRUE; + } + } + + /* Each co-routine MUST end with a call to crEND(). */ + crEND(); +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xAreHookCoRoutinesStillRunning( void ) +{ + if( xCoRoutineErrorDetected ) + { + return pdFALSE; + } + else + { + return pdTRUE; + } +} + + + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/death.c b/third_party/FreeRTOS/Demo/Common/Minimal/death.c new file mode 100644 index 0000000..d6a9110 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/death.c @@ -0,0 +1,267 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/** + * Create a single persistent task which periodically dynamically creates another + * two tasks. The original task is called the creator task, the two tasks it + * creates are called suicidal tasks. + * + * One of the created suicidal tasks kill one other suicidal task before killing + * itself - leaving just the original task remaining. + * + * The creator task must be spawned after all of the other demo application tasks + * as it keeps a check on the number of tasks under the scheduler control. The + * number of tasks it expects to see running should never be greater than the + * number of tasks that were in existence when the creator task was spawned, plus + * one set of four suicidal tasks. If this number is exceeded an error is flagged. + * + * \page DeathC death.c + * \ingroup DemoFiles + *
+ */ + +/* +Changes from V3.0.0 + + CreationCount sizes changed from unsigned portBASE_TYPE to + unsigned short to minimize the risk of overflowing. + + + Reset of usLastCreationCount added + +Changes from V3.1.0 + + Changed the dummy calculation to use variables of type long, rather than + float. This allows the file to be used with ports that do not support + floating point. + +*/ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo program include files. */ +#include "death.h" + +#define deathSTACK_SIZE ( configMINIMAL_STACK_SIZE + 60 ) + +/* The task originally created which is responsible for periodically dynamically +creating another four tasks. */ +static portTASK_FUNCTION_PROTO( vCreateTasks, pvParameters ); + +/* The task function of the dynamically created tasks. */ +static portTASK_FUNCTION_PROTO( vSuicidalTask, pvParameters ); + +/* A variable which is incremented every time the dynamic tasks are created. This +is used to check that the task is still running. */ +static volatile unsigned short usCreationCount = 0; + +/* Used to store the number of tasks that were originally running so the creator +task can tell if any of the suicidal tasks have failed to die. +*/ +static volatile unsigned portBASE_TYPE uxTasksRunningAtStart = 0; + +/* Tasks are deleted by the idle task. Under heavy load the idle task might +not get much processing time, so it would be legitimate for several tasks to +remain undeleted for a short period. */ +static const unsigned portBASE_TYPE uxMaxNumberOfExtraTasksRunning = 3; + +/* Used to store a handle to the task that should be killed by a suicidal task, +before it kills itself. */ +xTaskHandle xCreatedTask; + +/*-----------------------------------------------------------*/ + +void vCreateSuicidalTasks( unsigned portBASE_TYPE uxPriority ) +{ +unsigned portBASE_TYPE *puxPriority; + + /* Create the Creator tasks - passing in as a parameter the priority at which + the suicidal tasks should be created. */ + puxPriority = ( unsigned portBASE_TYPE * ) pvPortMalloc( sizeof( unsigned portBASE_TYPE ) ); + *puxPriority = uxPriority; + + xTaskCreate( vCreateTasks, ( signed char * ) "CREATOR", deathSTACK_SIZE, ( void * ) puxPriority, uxPriority, NULL ); + + /* Record the number of tasks that are running now so we know if any of the + suicidal tasks have failed to be killed. */ + uxTasksRunningAtStart = ( unsigned portBASE_TYPE ) uxTaskGetNumberOfTasks(); + + /* FreeRTOS.org versions before V3.0 started the idle-task as the very + first task. The idle task was then already included in uxTasksRunningAtStart. + From FreeRTOS V3.0 on, the idle task is started when the scheduler is + started. Therefore the idle task is not yet accounted for. We correct + this by increasing uxTasksRunningAtStart by 1. */ + uxTasksRunningAtStart++; + + /* From FreeRTOS version 7.0.0 can optionally create a timer service task. + If this is done, then uxTasksRunningAtStart needs incrementing again as that + too is created when the scheduler is started. */ + #if configUSE_TIMERS == 1 + uxTasksRunningAtStart++; + #endif +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vSuicidalTask, pvParameters ) +{ +volatile long l1, l2; +xTaskHandle xTaskToKill; +const portTickType xDelay = ( portTickType ) 200 / portTICK_RATE_MS; + + if( pvParameters != NULL ) + { + /* This task is periodically created four times. Two created tasks are + passed a handle to the other task so it can kill it before killing itself. + The other task is passed in null. */ + xTaskToKill = *( xTaskHandle* )pvParameters; + } + else + { + xTaskToKill = NULL; + } + + for( ;; ) + { + /* Do something random just to use some stack and registers. */ + l1 = 2; + l2 = 89; + l2 *= l1; + vTaskDelay( xDelay ); + + if( xTaskToKill != NULL ) + { + /* Make sure the other task has a go before we delete it. */ + vTaskDelay( ( portTickType ) 0 ); + + /* Kill the other task that was created by vCreateTasks(). */ + vTaskDelete( xTaskToKill ); + + /* Kill ourselves. */ + vTaskDelete( NULL ); + } + } +}/*lint !e818 !e550 Function prototype must be as per standard for task functions. */ +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vCreateTasks, pvParameters ) +{ +const portTickType xDelay = ( portTickType ) 1000 / portTICK_RATE_MS; +unsigned portBASE_TYPE uxPriority; + + uxPriority = *( unsigned portBASE_TYPE * ) pvParameters; + vPortFree( pvParameters ); + + for( ;; ) + { + /* Just loop round, delaying then creating the four suicidal tasks. */ + vTaskDelay( xDelay ); + + xCreatedTask = NULL; + + xTaskCreate( vSuicidalTask, ( signed char * ) "SUICID1", configMINIMAL_STACK_SIZE, NULL, uxPriority, &xCreatedTask ); + xTaskCreate( vSuicidalTask, ( signed char * ) "SUICID2", configMINIMAL_STACK_SIZE, &xCreatedTask, uxPriority, NULL ); + + ++usCreationCount; + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that the creator task is still running and that there +are not any more than four extra tasks. */ +portBASE_TYPE xIsCreateTaskStillRunning( void ) +{ +static unsigned short usLastCreationCount = 0xfff; +portBASE_TYPE xReturn = pdTRUE; +static unsigned portBASE_TYPE uxTasksRunningNow; + + if( usLastCreationCount == usCreationCount ) + { + xReturn = pdFALSE; + } + else + { + usLastCreationCount = usCreationCount; + } + + uxTasksRunningNow = ( unsigned portBASE_TYPE ) uxTaskGetNumberOfTasks(); + + if( uxTasksRunningNow < uxTasksRunningAtStart ) + { + xReturn = pdFALSE; + } + else if( ( uxTasksRunningNow - uxTasksRunningAtStart ) > uxMaxNumberOfExtraTasksRunning ) + { + xReturn = pdFALSE; + } + else + { + /* Everything is okay. */ + } + + return xReturn; +} + + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/dynamic.c b/third_party/FreeRTOS/Demo/Common/Minimal/dynamic.c new file mode 100644 index 0000000..2a900af --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/dynamic.c @@ -0,0 +1,511 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * The first test creates three tasks - two counter tasks (one continuous count + * and one limited count) and one controller. A "count" variable is shared + * between all three tasks. The two counter tasks should never be in a "ready" + * state at the same time. The controller task runs at the same priority as + * the continuous count task, and at a lower priority than the limited count + * task. + * + * One counter task loops indefinitely, incrementing the shared count variable + * on each iteration. To ensure it has exclusive access to the variable it + * raises its priority above that of the controller task before each + * increment, lowering it again to its original priority before starting the + * next iteration. + * + * The other counter task increments the shared count variable on each + * iteration of its loop until the count has reached a limit of 0xff - at + * which point it suspends itself. It will not start a new loop until the + * controller task has made it "ready" again by calling vTaskResume(). + * This second counter task operates at a higher priority than controller + * task so does not need to worry about mutual exclusion of the counter + * variable. + * + * The controller task is in two sections. The first section controls and + * monitors the continuous count task. When this section is operational the + * limited count task is suspended. Likewise, the second section controls + * and monitors the limited count task. When this section is operational the + * continuous count task is suspended. + * + * In the first section the controller task first takes a copy of the shared + * count variable. To ensure mutual exclusion on the count variable it + * suspends the continuous count task, resuming it again when the copy has been + * taken. The controller task then sleeps for a fixed period - during which + * the continuous count task will execute and increment the shared variable. + * When the controller task wakes it checks that the continuous count task + * has executed by comparing the copy of the shared variable with its current + * value. This time, to ensure mutual exclusion, the scheduler itself is + * suspended with a call to vTaskSuspendAll (). This is for demonstration + * purposes only and is not a recommended technique due to its inefficiency. + * + * After a fixed number of iterations the controller task suspends the + * continuous count task, and moves on to its second section. + * + * At the start of the second section the shared variable is cleared to zero. + * The limited count task is then woken from its suspension by a call to + * vTaskResume (). As this counter task operates at a higher priority than + * the controller task the controller task should not run again until the + * shared variable has been counted up to the limited value causing the counter + * task to suspend itself. The next line after vTaskResume () is therefore + * a check on the shared variable to ensure everything is as expected. + * + * + * The second test consists of a couple of very simple tasks that post onto a + * queue while the scheduler is suspended. This test was added to test parts + * of the scheduler not exercised by the first test. + * + */ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +/* Demo app include files. */ +#include "dynamic.h" + +/* Function that implements the "limited count" task as described above. */ +static portTASK_FUNCTION_PROTO( vLimitedIncrementTask, pvParameters ); + +/* Function that implements the "continuous count" task as described above. */ +static portTASK_FUNCTION_PROTO( vContinuousIncrementTask, pvParameters ); + +/* Function that implements the controller task as described above. */ +static portTASK_FUNCTION_PROTO( vCounterControlTask, pvParameters ); + +static portTASK_FUNCTION_PROTO( vQueueReceiveWhenSuspendedTask, pvParameters ); +static portTASK_FUNCTION_PROTO( vQueueSendWhenSuspendedTask, pvParameters ); + +/* Demo task specific constants. */ +#define priSTACK_SIZE ( configMINIMAL_STACK_SIZE ) +#define priSLEEP_TIME ( ( portTickType ) 128 / portTICK_RATE_MS ) +#define priLOOPS ( 5 ) +#define priMAX_COUNT ( ( unsigned long ) 0xff ) +#define priNO_BLOCK ( ( portTickType ) 0 ) +#define priSUSPENDED_QUEUE_LENGTH ( 1 ) + +/*-----------------------------------------------------------*/ + +/* Handles to the two counter tasks. These could be passed in as parameters +to the controller task to prevent them having to be file scope. */ +static xTaskHandle xContinuousIncrementHandle, xLimitedIncrementHandle; + +/* The shared counter variable. This is passed in as a parameter to the two +counter variables for demonstration purposes. */ +static volatile unsigned long ulCounter; + +/* Variables used to check that the tasks are still operating without error. +Each complete iteration of the controller task increments this variable +provided no errors have been found. The variable maintaining the same value +is therefore indication of an error. */ +static volatile unsigned short usCheckVariable = ( unsigned short ) 0; +static volatile portBASE_TYPE xSuspendedQueueSendError = pdFALSE; +static volatile portBASE_TYPE xSuspendedQueueReceiveError = pdFALSE; + +/* Queue used by the second test. */ +xQueueHandle xSuspendedTestQueue; + +/* The value the queue receive task expects to receive next. This is file +scope so xAreDynamicPriorityTasksStillRunning() can ensure it is still +incrementing. */ +static unsigned long ulExpectedValue = ( unsigned long ) 0; + +/*-----------------------------------------------------------*/ +/* + * Start the three tasks as described at the top of the file. + * Note that the limited count task is given a higher priority. + */ +void vStartDynamicPriorityTasks( void ) +{ + xSuspendedTestQueue = xQueueCreate( priSUSPENDED_QUEUE_LENGTH, sizeof( unsigned long ) ); + + /* vQueueAddToRegistry() adds the queue to the queue registry, if one is + in use. The queue registry is provided as a means for kernel aware + debuggers to locate queues and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( xSuspendedTestQueue, ( signed char * ) "Suspended_Test_Queue" ); + + xTaskCreate( vContinuousIncrementTask, ( signed char * ) "CNT_INC", priSTACK_SIZE, ( void * ) &ulCounter, tskIDLE_PRIORITY, &xContinuousIncrementHandle ); + xTaskCreate( vLimitedIncrementTask, ( signed char * ) "LIM_INC", priSTACK_SIZE, ( void * ) &ulCounter, tskIDLE_PRIORITY + 1, &xLimitedIncrementHandle ); + xTaskCreate( vCounterControlTask, ( signed char * ) "C_CTRL", priSTACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + xTaskCreate( vQueueSendWhenSuspendedTask, ( signed char * ) "SUSP_TX", priSTACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); + xTaskCreate( vQueueReceiveWhenSuspendedTask, ( signed char * ) "SUSP_RX", priSTACK_SIZE, NULL, tskIDLE_PRIORITY, NULL ); +} +/*-----------------------------------------------------------*/ + +/* + * Just loops around incrementing the shared variable until the limit has been + * reached. Once the limit has been reached it suspends itself. + */ +static portTASK_FUNCTION( vLimitedIncrementTask, pvParameters ) +{ +unsigned long *pulCounter; + + /* Take a pointer to the shared variable from the parameters passed into + the task. */ + pulCounter = ( unsigned long * ) pvParameters; + + /* This will run before the control task, so the first thing it does is + suspend - the control task will resume it when ready. */ + vTaskSuspend( NULL ); + + for( ;; ) + { + /* Just count up to a value then suspend. */ + ( *pulCounter )++; + + if( *pulCounter >= priMAX_COUNT ) + { + vTaskSuspend( NULL ); + } + } +} +/*-----------------------------------------------------------*/ + +/* + * Just keep counting the shared variable up. The control task will suspend + * this task when it wants. + */ +static portTASK_FUNCTION( vContinuousIncrementTask, pvParameters ) +{ +volatile unsigned long *pulCounter; +unsigned portBASE_TYPE uxOurPriority; + + /* Take a pointer to the shared variable from the parameters passed into + the task. */ + pulCounter = ( unsigned long * ) pvParameters; + + /* Query our priority so we can raise it when exclusive access to the + shared variable is required. */ + uxOurPriority = uxTaskPriorityGet( NULL ); + + for( ;; ) + { + /* Raise the priority above the controller task to ensure a context + switch does not occur while the variable is being accessed. */ + vTaskPrioritySet( NULL, uxOurPriority + 1 ); + { + configASSERT( ( uxTaskPriorityGet( NULL ) == ( uxOurPriority + 1 ) ) ); + ( *pulCounter )++; + } + vTaskPrioritySet( NULL, uxOurPriority ); + + #if( configUSE_PREEMPTION == 0 ) + taskYIELD(); + #endif + + configASSERT( ( uxTaskPriorityGet( NULL ) == uxOurPriority ) ); + } +} +/*-----------------------------------------------------------*/ + +/* + * Controller task as described above. + */ +static portTASK_FUNCTION( vCounterControlTask, pvParameters ) +{ +unsigned long ulLastCounter; +short sLoops; +short sError = pdFALSE; + + /* Just to stop warning messages. */ + ( void ) pvParameters; + + for( ;; ) + { + /* Start with the counter at zero. */ + ulCounter = ( unsigned long ) 0; + + /* First section : */ + + /* Check the continuous count task is running. */ + for( sLoops = 0; sLoops < priLOOPS; sLoops++ ) + { + /* Suspend the continuous count task so we can take a mirror of the + shared variable without risk of corruption. This is not really + needed as the other task raises its priority above this task's + priority. */ + vTaskSuspend( xContinuousIncrementHandle ); + { + #if( INCLUDE_eTaskGetState == 1 ) + { + configASSERT( eTaskGetState( xContinuousIncrementHandle ) == eSuspended ); + } + #endif /* INCLUDE_eTaskGetState */ + + ulLastCounter = ulCounter; + } + vTaskResume( xContinuousIncrementHandle ); + + #if( configUSE_PREEMPTION == 0 ) + taskYIELD(); + #endif + + #if( INCLUDE_eTaskGetState == 1 ) + { + configASSERT( eTaskGetState( xContinuousIncrementHandle ) == eReady ); + } + #endif /* INCLUDE_eTaskGetState */ + + /* Now delay to ensure the other task has processor time. */ + vTaskDelay( priSLEEP_TIME ); + + /* Check the shared variable again. This time to ensure mutual + exclusion the whole scheduler will be locked. This is just for + demo purposes! */ + vTaskSuspendAll(); + { + if( ulLastCounter == ulCounter ) + { + /* The shared variable has not changed. There is a problem + with the continuous count task so flag an error. */ + sError = pdTRUE; + } + } + xTaskResumeAll(); + } + + /* Second section: */ + + /* Suspend the continuous counter task so it stops accessing the shared + variable. */ + vTaskSuspend( xContinuousIncrementHandle ); + + /* Reset the variable. */ + ulCounter = ( unsigned long ) 0; + + #if( INCLUDE_eTaskGetState == 1 ) + { + configASSERT( eTaskGetState( xLimitedIncrementHandle ) == eSuspended ); + } + #endif /* INCLUDE_eTaskGetState */ + + /* Resume the limited count task which has a higher priority than us. + We should therefore not return from this call until the limited count + task has suspended itself with a known value in the counter variable. */ + vTaskResume( xLimitedIncrementHandle ); + + #if( configUSE_PREEMPTION == 0 ) + taskYIELD(); + #endif + + /* This task should not run again until xLimitedIncrementHandle has + suspended itself. */ + #if( INCLUDE_eTaskGetState == 1 ) + { + configASSERT( eTaskGetState( xLimitedIncrementHandle ) == eSuspended ); + } + #endif /* INCLUDE_eTaskGetState */ + + /* Does the counter variable have the expected value? */ + if( ulCounter != priMAX_COUNT ) + { + sError = pdTRUE; + } + + if( sError == pdFALSE ) + { + /* If no errors have occurred then increment the check variable. */ + portENTER_CRITICAL(); + usCheckVariable++; + portEXIT_CRITICAL(); + } + + /* Resume the continuous count task and do it all again. */ + vTaskResume( xContinuousIncrementHandle ); + + #if( configUSE_PREEMPTION == 0 ) + taskYIELD(); + #endif + } +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vQueueSendWhenSuspendedTask, pvParameters ) +{ +static unsigned long ulValueToSend = ( unsigned long ) 0; + + /* Just to stop warning messages. */ + ( void ) pvParameters; + + for( ;; ) + { + vTaskSuspendAll(); + { + /* We must not block while the scheduler is suspended! */ + if( xQueueSend( xSuspendedTestQueue, ( void * ) &ulValueToSend, priNO_BLOCK ) != pdTRUE ) + { + xSuspendedQueueSendError = pdTRUE; + } + } + xTaskResumeAll(); + + vTaskDelay( priSLEEP_TIME ); + + ++ulValueToSend; + } +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vQueueReceiveWhenSuspendedTask, pvParameters ) +{ +unsigned long ulReceivedValue; +portBASE_TYPE xGotValue; + + /* Just to stop warning messages. */ + ( void ) pvParameters; + + for( ;; ) + { + do + { + /* Suspending the scheduler here is fairly pointless and + undesirable for a normal application. It is done here purely + to test the scheduler. The inner xTaskResumeAll() should + never return pdTRUE as the scheduler is still locked by the + outer call. */ + vTaskSuspendAll(); + { + vTaskSuspendAll(); + { + xGotValue = xQueueReceive( xSuspendedTestQueue, ( void * ) &ulReceivedValue, priNO_BLOCK ); + } + if( xTaskResumeAll() != pdFALSE ) + { + xSuspendedQueueReceiveError = pdTRUE; + } + } + xTaskResumeAll(); + + #if configUSE_PREEMPTION == 0 + { + taskYIELD(); + } + #endif + + } while( xGotValue == pdFALSE ); + + if( ulReceivedValue != ulExpectedValue ) + { + xSuspendedQueueReceiveError = pdTRUE; + } + + if( xSuspendedQueueReceiveError != pdTRUE ) + { + /* Only increment the variable if an error has not occurred. This + allows xAreDynamicPriorityTasksStillRunning() to check for stalled + tasks as well as explicit errors. */ + ++ulExpectedValue; + } + } +} +/*-----------------------------------------------------------*/ + +/* Called to check that all the created tasks are still running without error. */ +portBASE_TYPE xAreDynamicPriorityTasksStillRunning( void ) +{ +/* Keep a history of the check variables so we know if it has been incremented +since the last call. */ +static unsigned short usLastTaskCheck = ( unsigned short ) 0; +static unsigned long ulLastExpectedValue = ( unsigned long ) 0U; +portBASE_TYPE xReturn = pdTRUE; + + /* Check the tasks are still running by ensuring the check variable + is still incrementing. */ + + if( usCheckVariable == usLastTaskCheck ) + { + /* The check has not incremented so an error exists. */ + xReturn = pdFALSE; + } + + if( ulExpectedValue == ulLastExpectedValue ) + { + /* The value being received by the queue receive task has not + incremented so an error exists. */ + xReturn = pdFALSE; + } + + if( xSuspendedQueueSendError == pdTRUE ) + { + xReturn = pdFALSE; + } + + if( xSuspendedQueueReceiveError == pdTRUE ) + { + xReturn = pdFALSE; + } + + usLastTaskCheck = usCheckVariable; + ulLastExpectedValue = ulExpectedValue; + + return xReturn; +} diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/flash.c b/third_party/FreeRTOS/Demo/Common/Minimal/flash.c new file mode 100644 index 0000000..fda5870 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/flash.c @@ -0,0 +1,157 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/** + * This version of flash .c is for use on systems that have limited stack space + * and no display facilities. The complete version can be found in the + * Demo/Common/Full directory. + * + * Three tasks are created, each of which flash an LED at a different rate. The first + * LED flashes every 200ms, the second every 400ms, the third every 600ms. + * + * The LED flash tasks provide instant visual feedback. They show that the scheduler + * is still operational. + * + */ + + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo program include files. */ +#include "partest.h" +#include "flash.h" + +#define ledSTACK_SIZE configMINIMAL_STACK_SIZE +#define ledNUMBER_OF_LEDS ( 3 ) +#define ledFLASH_RATE_BASE ( ( portTickType ) 333 ) + +/* Variable used by the created tasks to calculate the LED number to use, and +the rate at which they should flash the LED. */ +static volatile unsigned portBASE_TYPE uxFlashTaskNumber = 0; + +/* The task that is created three times. */ +static portTASK_FUNCTION_PROTO( vLEDFlashTask, pvParameters ); + +/*-----------------------------------------------------------*/ + +void vStartLEDFlashTasks( unsigned portBASE_TYPE uxPriority ) +{ +signed portBASE_TYPE xLEDTask; + + /* Create the three tasks. */ + for( xLEDTask = 0; xLEDTask < ledNUMBER_OF_LEDS; ++xLEDTask ) + { + /* Spawn the task. */ + xTaskCreate( vLEDFlashTask, ( signed char * ) "LEDx", ledSTACK_SIZE, NULL, uxPriority, ( xTaskHandle * ) NULL ); + } +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vLEDFlashTask, pvParameters ) +{ +portTickType xFlashRate, xLastFlashTime; +unsigned portBASE_TYPE uxLED; + + /* The parameters are not used. */ + ( void ) pvParameters; + + /* Calculate the LED and flash rate. */ + portENTER_CRITICAL(); + { + /* See which of the eight LED's we should use. */ + uxLED = uxFlashTaskNumber; + + /* Update so the next task uses the next LED. */ + uxFlashTaskNumber++; + } + portEXIT_CRITICAL(); + + xFlashRate = ledFLASH_RATE_BASE + ( ledFLASH_RATE_BASE * ( portTickType ) uxLED ); + xFlashRate /= portTICK_RATE_MS; + + /* We will turn the LED on and off again in the delay period, so each + delay is only half the total period. */ + xFlashRate /= ( portTickType ) 2; + + /* We need to initialise xLastFlashTime prior to the first call to + vTaskDelayUntil(). */ + xLastFlashTime = xTaskGetTickCount(); + + for(;;) + { + /* Delay for half the flash period then turn the LED on. */ + vTaskDelayUntil( &xLastFlashTime, xFlashRate ); + vParTestToggleLED( uxLED ); + + /* Delay for half the flash period then turn the LED off. */ + vTaskDelayUntil( &xLastFlashTime, xFlashRate ); + vParTestToggleLED( uxLED ); + } +} /*lint !e715 !e818 !e830 Function definition must be standard for task creation. */ + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/flash_timer.c b/third_party/FreeRTOS/Demo/Common/Minimal/flash_timer.c new file mode 100644 index 0000000..a5985ff --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/flash_timer.c @@ -0,0 +1,136 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/** + * Repeatedly toggles one or more LEDs using software timers - one timer per + * LED. + */ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "timers.h" + +/* Demo program include files. */ +#include "partest.h" +#include "flash_timer.h" + +/* The toggle rates are all a multple of ledFLASH_RATE_BASE. */ +#define ledFLASH_RATE_BASE ( ( ( portTickType ) 333 ) / portTICK_RATE_MS ) + +/* A block time of zero simple means "don't block". */ +#define ledDONT_BLOCK ( ( portTickType ) 0 ) + +/*-----------------------------------------------------------*/ + +/* + * The callback function used by each LED flashing timer. All the timers use + * this function, and the timer ID is used within the function to determine + * which timer has actually expired. + */ +static void prvLEDTimerCallback( xTimerHandle xTimer ); + +/*-----------------------------------------------------------*/ + +void vStartLEDFlashTimers( unsigned portBASE_TYPE uxNumberOfLEDs ) +{ +unsigned portBASE_TYPE uxLEDTimer; +xTimerHandle xTimer; + + /* Create and start the requested number of timers. */ + for( uxLEDTimer = 0; uxLEDTimer < uxNumberOfLEDs; ++uxLEDTimer ) + { + /* Create the timer. */ + xTimer = xTimerCreate( ( const signed char * const ) "Flasher",/* A text name, purely to help debugging. */ + ledFLASH_RATE_BASE * ( uxLEDTimer + 1 ), /* The timer period, which is a multiple of ledFLASH_RATE_BASE. */ + pdTRUE, /* This is an auto-reload timer, so xAutoReload is set to pdTRUE. */ + ( void * ) uxLEDTimer, /* The ID is used to identify the timer within the timer callback function, as each timer uses the same callback. */ + prvLEDTimerCallback /* Each timer uses the same callback. */ + ); + + /* If the timer was created successfully, attempt to start it. If the + scheduler has not yet been started then the timer command queue must + be long enough to hold each command sent to it until such time that the + scheduler is started. The timer command queue length is set by + configTIMER_QUEUE_LENGTH in FreeRTOSConfig.h. */ + if( xTimer != NULL ) + { + xTimerStart( xTimer, ledDONT_BLOCK ); + } + } +} +/*-----------------------------------------------------------*/ + +static void prvLEDTimerCallback( xTimerHandle xTimer ) +{ +portBASE_TYPE xTimerID; + + /* The timer ID is used to identify the timer that has actually expired as + each timer uses the same callback. The ID is then also used as the number + of the LED that is to be toggled. */ + xTimerID = ( portBASE_TYPE ) pvTimerGetTimerID( xTimer ); + vParTestToggleLED( xTimerID ); +} + + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/flop.c b/third_party/FreeRTOS/Demo/Common/Minimal/flop.c new file mode 100644 index 0000000..e45ec64 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/flop.c @@ -0,0 +1,383 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * Creates eight tasks, each of which loops continuously performing a floating + * point calculation. + * + * All the tasks run at the idle priority and never block or yield. This causes + * all eight tasks to time slice with the idle task. Running at the idle + * priority means that these tasks will get pre-empted any time another task is + * ready to run or a time slice occurs. More often than not the pre-emption + * will occur mid calculation, creating a good test of the schedulers context + * switch mechanism - a calculation producing an unexpected result could be a + * symptom of a corruption in the context of a task. + */ + +#include +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo program include files. */ +#include "flop.h" + +#define mathSTACK_SIZE configMINIMAL_STACK_SIZE +#define mathNUMBER_OF_TASKS ( 4 ) + +/* Four tasks, each of which performs a different floating point calculation. +Each of the four is created twice. */ +static portTASK_FUNCTION_PROTO( vCompetingMathTask1, pvParameters ); +static portTASK_FUNCTION_PROTO( vCompetingMathTask2, pvParameters ); +static portTASK_FUNCTION_PROTO( vCompetingMathTask3, pvParameters ); +static portTASK_FUNCTION_PROTO( vCompetingMathTask4, pvParameters ); + +/* These variables are used to check that all the tasks are still running. If a +task gets a calculation wrong it will stop setting its check variable. */ +static volatile unsigned short usTaskCheck[ mathNUMBER_OF_TASKS ] = { ( unsigned short ) 0 }; + +/*-----------------------------------------------------------*/ + +void vStartMathTasks( unsigned portBASE_TYPE uxPriority ) +{ + xTaskCreate( vCompetingMathTask1, ( signed char * ) "Math1", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 0 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask2, ( signed char * ) "Math2", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 1 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask3, ( signed char * ) "Math3", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 2 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask4, ( signed char * ) "Math4", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 3 ] ), uxPriority, NULL ); +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vCompetingMathTask1, pvParameters ) +{ +volatile portDOUBLE d1, d2, d3, d4; +volatile unsigned short *pusTaskCheckVariable; +volatile portDOUBLE dAnswer; +short sError = pdFALSE; + + /* Some ports require that tasks that use a hardware floating point unit + tell the kernel that they require a floating point context before any + floating point instructions are executed. */ + portTASK_USES_FLOATING_POINT(); + + d1 = 123.4567; + d2 = 2345.6789; + d3 = -918.222; + + dAnswer = ( d1 + d2 ) * d3; + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + /* Keep performing a calculation and checking the result against a constant. */ + for(;;) + { + d1 = 123.4567; + d2 = 2345.6789; + d3 = -918.222; + + d4 = ( d1 + d2 ) * d3; + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* If the calculation does not match the expected constant, stop the + increment of the check variable. */ + if( fabs( d4 - dAnswer ) > 0.001 ) + { + sError = pdTRUE; + } + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct then set set the check + variable. The check variable will get set to pdFALSE each time + xAreMathsTaskStillRunning() is executed. */ + ( *pusTaskCheckVariable ) = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + } +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vCompetingMathTask2, pvParameters ) +{ +volatile portDOUBLE d1, d2, d3, d4; +volatile unsigned short *pusTaskCheckVariable; +volatile portDOUBLE dAnswer; +short sError = pdFALSE; + + /* Some ports require that tasks that use a hardware floating point unit + tell the kernel that they require a floating point context before any + floating point instructions are executed. */ + portTASK_USES_FLOATING_POINT(); + + d1 = -389.38; + d2 = 32498.2; + d3 = -2.0001; + + dAnswer = ( d1 / d2 ) * d3; + + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + /* Keep performing a calculation and checking the result against a constant. */ + for( ;; ) + { + d1 = -389.38; + d2 = 32498.2; + d3 = -2.0001; + + d4 = ( d1 / d2 ) * d3; + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* If the calculation does not match the expected constant, stop the + increment of the check variable. */ + if( fabs( d4 - dAnswer ) > 0.001 ) + { + sError = pdTRUE; + } + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct then set set the check + variable. The check variable will get set to pdFALSE each time + xAreMathsTaskStillRunning() is executed. */ + ( *pusTaskCheckVariable ) = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + } +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vCompetingMathTask3, pvParameters ) +{ +volatile portDOUBLE *pdArray, dTotal1, dTotal2, dDifference; +volatile unsigned short *pusTaskCheckVariable; +const size_t xArraySize = 10; +size_t xPosition; +short sError = pdFALSE; + + /* Some ports require that tasks that use a hardware floating point unit + tell the kernel that they require a floating point context before any + floating point instructions are executed. */ + portTASK_USES_FLOATING_POINT(); + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + pdArray = ( portDOUBLE * ) pvPortMalloc( xArraySize * sizeof( portDOUBLE ) ); + + /* Keep filling an array, keeping a running total of the values placed in the + array. Then run through the array adding up all the values. If the two totals + do not match, stop the check variable from incrementing. */ + for( ;; ) + { + dTotal1 = 0.0; + dTotal2 = 0.0; + + for( xPosition = 0; xPosition < xArraySize; xPosition++ ) + { + pdArray[ xPosition ] = ( portDOUBLE ) xPosition + 5.5; + dTotal1 += ( portDOUBLE ) xPosition + 5.5; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + for( xPosition = 0; xPosition < xArraySize; xPosition++ ) + { + dTotal2 += pdArray[ xPosition ]; + } + + dDifference = dTotal1 - dTotal2; + if( fabs( dDifference ) > 0.001 ) + { + sError = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct then set set the check + variable. The check variable will get set to pdFALSE each time + xAreMathsTaskStillRunning() is executed. */ + ( *pusTaskCheckVariable ) = pdTRUE; + } + } +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vCompetingMathTask4, pvParameters ) +{ +volatile portDOUBLE *pdArray, dTotal1, dTotal2, dDifference; +volatile unsigned short *pusTaskCheckVariable; +const size_t xArraySize = 10; +size_t xPosition; +short sError = pdFALSE; + + /* Some ports require that tasks that use a hardware floating point unit + tell the kernel that they require a floating point context before any + floating point instructions are executed. */ + portTASK_USES_FLOATING_POINT(); + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + pdArray = ( portDOUBLE * ) pvPortMalloc( xArraySize * sizeof( portDOUBLE ) ); + + /* Keep filling an array, keeping a running total of the values placed in the + array. Then run through the array adding up all the values. If the two totals + do not match, stop the check variable from incrementing. */ + for( ;; ) + { + dTotal1 = 0.0; + dTotal2 = 0.0; + + for( xPosition = 0; xPosition < xArraySize; xPosition++ ) + { + pdArray[ xPosition ] = ( portDOUBLE ) xPosition * 12.123; + dTotal1 += ( portDOUBLE ) xPosition * 12.123; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + for( xPosition = 0; xPosition < xArraySize; xPosition++ ) + { + dTotal2 += pdArray[ xPosition ]; + } + + dDifference = dTotal1 - dTotal2; + if( fabs( dDifference ) > 0.001 ) + { + sError = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct then set set the check + variable. The check variable will get set to pdFALSE each time + xAreMathsTaskStillRunning() is executed. */ + ( *pusTaskCheckVariable ) = pdTRUE; + } + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreMathsTaskStillRunning( void ) +{ +portBASE_TYPE xReturn = pdPASS, xTask; + + /* Check the maths tasks are still running by ensuring their check variables + have been set to pdPASS. */ + for( xTask = 0; xTask < mathNUMBER_OF_TASKS; xTask++ ) + { + if( usTaskCheck[ xTask ] != pdTRUE ) + { + /* The check has not been set so the associated task has either + stalled or detected an error. */ + xReturn = pdFAIL; + } + else + { + /* Reset the variable so it can be checked again the next time this + function is executed. */ + usTaskCheck[ xTask ] = pdFALSE; + } + } + + return xReturn; +} + + + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/integer.c b/third_party/FreeRTOS/Demo/Common/Minimal/integer.c new file mode 100644 index 0000000..76ea423 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/integer.c @@ -0,0 +1,201 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * Creates one or more tasks that repeatedly perform a set of integer + * calculations. The result of each run-time calculation is compared to the + * known expected result - with a mismatch being indicative of an error in the + * context switch mechanism. + */ + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo program include files. */ +#include "integer.h" + +/* The constants used in the calculation. */ +#define intgCONST1 ( ( long ) 123 ) +#define intgCONST2 ( ( long ) 234567 ) +#define intgCONST3 ( ( long ) -3 ) +#define intgCONST4 ( ( long ) 7 ) +#define intgEXPECTED_ANSWER ( ( ( intgCONST1 + intgCONST2 ) * intgCONST3 ) / intgCONST4 ) + +#define intgSTACK_SIZE configMINIMAL_STACK_SIZE + +/* As this is the minimal version, we will only create one task. */ +#define intgNUMBER_OF_TASKS ( 1 ) + +/* The task function. Repeatedly performs a 32 bit calculation, checking the +result against the expected result. If the result is incorrect then the +context switch must have caused some corruption. */ +static portTASK_FUNCTION_PROTO( vCompeteingIntMathTask, pvParameters ); + +/* Variables that are set to true within the calculation task to indicate +that the task is still executing. The check task sets the variable back to +false, flagging an error if the variable is still false the next time it +is called. */ +static volatile signed portBASE_TYPE xTaskCheck[ intgNUMBER_OF_TASKS ] = { ( signed portBASE_TYPE ) pdFALSE }; + +/*-----------------------------------------------------------*/ + +void vStartIntegerMathTasks( unsigned portBASE_TYPE uxPriority ) +{ +short sTask; + + for( sTask = 0; sTask < intgNUMBER_OF_TASKS; sTask++ ) + { + xTaskCreate( vCompeteingIntMathTask, ( signed char * ) "IntMath", intgSTACK_SIZE, ( void * ) &( xTaskCheck[ sTask ] ), uxPriority, ( xTaskHandle * ) NULL ); + } +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vCompeteingIntMathTask, pvParameters ) +{ +/* These variables are all effectively set to constants so they are volatile to +ensure the compiler does not just get rid of them. */ +volatile long lValue; +short sError = pdFALSE; +volatile signed portBASE_TYPE *pxTaskHasExecuted; + + /* Set a pointer to the variable we are going to set to true each + iteration. This is also a good test of the parameter passing mechanism + within each port. */ + pxTaskHasExecuted = ( volatile signed portBASE_TYPE * ) pvParameters; + + /* Keep performing a calculation and checking the result against a constant. */ + for( ;; ) + { + /* Perform the calculation. This will store partial value in + registers, resulting in a good test of the context switch mechanism. */ + lValue = intgCONST1; + lValue += intgCONST2; + + /* Yield in case cooperative scheduling is being used. */ + #if configUSE_PREEMPTION == 0 + { + taskYIELD(); + } + #endif + + /* Finish off the calculation. */ + lValue *= intgCONST3; + lValue /= intgCONST4; + + /* If the calculation is found to be incorrect we stop setting the + TaskHasExecuted variable so the check task can see an error has + occurred. */ + if( lValue != intgEXPECTED_ANSWER ) /*lint !e774 volatile used to prevent this being optimised out. */ + { + sError = pdTRUE; + } + + if( sError == pdFALSE ) + { + /* We have not encountered any errors, so set the flag that show + we are still executing. This will be periodically cleared by + the check task. */ + portENTER_CRITICAL(); + *pxTaskHasExecuted = pdTRUE; + portEXIT_CRITICAL(); + } + + /* Yield in case cooperative scheduling is being used. */ + #if configUSE_PREEMPTION == 0 + { + taskYIELD(); + } + #endif + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreIntegerMathsTaskStillRunning( void ) +{ +portBASE_TYPE xReturn = pdTRUE; +short sTask; + + /* Check the maths tasks are still running by ensuring their check variables + are still being set to true. */ + for( sTask = 0; sTask < intgNUMBER_OF_TASKS; sTask++ ) + { + if( xTaskCheck[ sTask ] == pdFALSE ) + { + /* The check has not incremented so an error exists. */ + xReturn = pdFALSE; + } + + /* Reset the check variable so we can tell if it has been set by + the next time around. */ + xTaskCheck[ sTask ] = pdFALSE; + } + + return xReturn; +} + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/recmutex.c b/third_party/FreeRTOS/Demo/Common/Minimal/recmutex.c new file mode 100644 index 0000000..760233c --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/recmutex.c @@ -0,0 +1,440 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + The tasks defined on this page demonstrate the use of recursive mutexes. + + For recursive mutex functionality the created mutex should be created using + xSemaphoreCreateRecursiveMutex(), then be manipulated + using the xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() API + functions. + + This demo creates three tasks all of which access the same recursive mutex: + + prvRecursiveMutexControllingTask() has the highest priority so executes + first and grabs the mutex. It then performs some recursive accesses - + between each of which it sleeps for a short period to let the lower + priority tasks execute. When it has completed its demo functionality + it gives the mutex back before suspending itself. + + prvRecursiveMutexBlockingTask() attempts to access the mutex by performing + a blocking 'take'. The blocking task has a lower priority than the + controlling task so by the time it executes the mutex has already been + taken by the controlling task, causing the blocking task to block. It + does not unblock until the controlling task has given the mutex back, + and it does not actually run until the controlling task has suspended + itself (due to the relative priorities). When it eventually does obtain + the mutex all it does is give the mutex back prior to also suspending + itself. At this point both the controlling task and the blocking task are + suspended. + + prvRecursiveMutexPollingTask() runs at the idle priority. It spins round + a tight loop attempting to obtain the mutex with a non-blocking call. As + the lowest priority task it will not successfully obtain the mutex until + both the controlling and blocking tasks are suspended. Once it eventually + does obtain the mutex it first unsuspends both the controlling task and + blocking task prior to giving the mutex back - resulting in the polling + task temporarily inheriting the controlling tasks priority. +*/ + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +/* Demo app include files. */ +#include "recmutex.h" + +/* Priorities assigned to the three tasks. recmuCONTROLLING_TASK_PRIORITY can +be overridden by a definition in FreeRTOSConfig.h. */ +#ifndef recmuCONTROLLING_TASK_PRIORITY + #define recmuCONTROLLING_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#endif +#define recmuBLOCKING_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define recmuPOLLING_TASK_PRIORITY ( tskIDLE_PRIORITY + 0 ) + +/* The recursive call depth. */ +#define recmuMAX_COUNT ( 10 ) + +/* Misc. */ +#define recmuSHORT_DELAY ( 20 / portTICK_RATE_MS ) +#define recmuNO_DELAY ( ( portTickType ) 0 ) +#define recmuFIVE_TICK_DELAY ( ( portTickType ) 5 ) + +/* The three tasks as described at the top of this file. */ +static void prvRecursiveMutexControllingTask( void *pvParameters ); +static void prvRecursiveMutexBlockingTask( void *pvParameters ); +static void prvRecursiveMutexPollingTask( void *pvParameters ); + +/* The mutex used by the demo. */ +static xSemaphoreHandle xMutex; + +/* Variables used to detect and latch errors. */ +static volatile portBASE_TYPE xErrorOccurred = pdFALSE, xControllingIsSuspended = pdFALSE, xBlockingIsSuspended = pdFALSE; +static volatile unsigned portBASE_TYPE uxControllingCycles = 0, uxBlockingCycles = 0, uxPollingCycles = 0; + +/* Handles of the two higher priority tasks, required so they can be resumed +(unsuspended). */ +static xTaskHandle xControllingTaskHandle, xBlockingTaskHandle; + +/*-----------------------------------------------------------*/ + +void vStartRecursiveMutexTasks( void ) +{ + /* Just creates the mutex and the three tasks. */ + + xMutex = xSemaphoreCreateRecursiveMutex(); + + /* vQueueAddToRegistry() adds the mutex to the registry, if one is + in use. The registry is provided as a means for kernel aware + debuggers to locate mutex and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( ( xQueueHandle ) xMutex, ( signed portCHAR * ) "Recursive_Mutex" ); + + + if( xMutex != NULL ) + { + xTaskCreate( prvRecursiveMutexControllingTask, ( signed portCHAR * ) "Rec1", configMINIMAL_STACK_SIZE, NULL, recmuCONTROLLING_TASK_PRIORITY, &xControllingTaskHandle ); + xTaskCreate( prvRecursiveMutexBlockingTask, ( signed portCHAR * ) "Rec2", configMINIMAL_STACK_SIZE, NULL, recmuBLOCKING_TASK_PRIORITY, &xBlockingTaskHandle ); + xTaskCreate( prvRecursiveMutexPollingTask, ( signed portCHAR * ) "Rec3", configMINIMAL_STACK_SIZE, NULL, recmuPOLLING_TASK_PRIORITY, NULL ); + } +} +/*-----------------------------------------------------------*/ + +static void prvRecursiveMutexControllingTask( void *pvParameters ) +{ +unsigned portBASE_TYPE ux; + + /* Just to remove compiler warning. */ + ( void ) pvParameters; + + for( ;; ) + { + /* Should not be able to 'give' the mutex, as we have not yet 'taken' + it. The first time through, the mutex will not have been used yet, + subsequent times through, at this point the mutex will be held by the + polling task. */ + if( xSemaphoreGiveRecursive( xMutex ) == pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + for( ux = 0; ux < recmuMAX_COUNT; ux++ ) + { + /* We should now be able to take the mutex as many times as + we like. + + The first time through the mutex will be immediately available, on + subsequent times through the mutex will be held by the polling task + at this point and this Take will cause the polling task to inherit + the priority of this task. In this case the block time must be + long enough to ensure the polling task will execute again before the + block time expires. If the block time does expire then the error + flag will be set here. */ + if( xSemaphoreTakeRecursive( xMutex, recmuFIVE_TICK_DELAY ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + /* Ensure the other task attempting to access the mutex (and the + other demo tasks) are able to execute to ensure they either block + (where a block time is specified) or return an error (where no + block time is specified) as the mutex is held by this task. */ + vTaskDelay( recmuSHORT_DELAY ); + } + + /* For each time we took the mutex, give it back. */ + for( ux = 0; ux < recmuMAX_COUNT; ux++ ) + { + /* Ensure the other task attempting to access the mutex (and the + other demo tasks) are able to execute. */ + vTaskDelay( recmuSHORT_DELAY ); + + /* We should now be able to give the mutex as many times as we + took it. When the mutex is available again the Blocking task + should be unblocked but not run because it has a lower priority + than this task. The polling task should also not run at this point + as it too has a lower priority than this task. */ + if( xSemaphoreGiveRecursive( xMutex ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + } + + /* Having given it back the same number of times as it was taken, we + should no longer be the mutex owner, so the next give should fail. */ + if( xSemaphoreGiveRecursive( xMutex ) == pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + /* Keep count of the number of cycles this task has performed so a + stall can be detected. */ + uxControllingCycles++; + + /* Suspend ourselves so the blocking task can execute. */ + xControllingIsSuspended = pdTRUE; + vTaskSuspend( NULL ); + xControllingIsSuspended = pdFALSE; + } +} +/*-----------------------------------------------------------*/ + +static void prvRecursiveMutexBlockingTask( void *pvParameters ) +{ + /* Just to remove compiler warning. */ + ( void ) pvParameters; + + for( ;; ) + { + /* This task will run while the controlling task is blocked, and the + controlling task will block only once it has the mutex - therefore + this call should block until the controlling task has given up the + mutex, and not actually execute past this call until the controlling + task is suspended. portMAX_DELAY - 1 is used instead of portMAX_DELAY + to ensure the task's state is reported as Blocked and not Suspended in + a later call to configASSERT() (within the polling task). */ + if( xSemaphoreTakeRecursive( xMutex, ( portMAX_DELAY - 1 ) ) == pdPASS ) + { + if( xControllingIsSuspended != pdTRUE ) + { + /* Did not expect to execute until the controlling task was + suspended. */ + xErrorOccurred = pdTRUE; + } + else + { + /* Give the mutex back before suspending ourselves to allow + the polling task to obtain the mutex. */ + if( xSemaphoreGiveRecursive( xMutex ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + xBlockingIsSuspended = pdTRUE; + vTaskSuspend( NULL ); + xBlockingIsSuspended = pdFALSE; + } + } + else + { + /* We should not leave the xSemaphoreTakeRecursive() function + until the mutex was obtained. */ + xErrorOccurred = pdTRUE; + } + + /* The controlling and blocking tasks should be in lock step. */ + if( uxControllingCycles != ( uxBlockingCycles + 1 ) ) + { + xErrorOccurred = pdTRUE; + } + + /* Keep count of the number of cycles this task has performed so a + stall can be detected. */ + uxBlockingCycles++; + } +} +/*-----------------------------------------------------------*/ + +static void prvRecursiveMutexPollingTask( void *pvParameters ) +{ + /* Just to remove compiler warning. */ + ( void ) pvParameters; + + for( ;; ) + { + /* Keep attempting to obtain the mutex. We should only obtain it when + the blocking task has suspended itself, which in turn should only + happen when the controlling task is also suspended. */ + if( xSemaphoreTakeRecursive( xMutex, recmuNO_DELAY ) == pdPASS ) + { + #if( INCLUDE_eTaskGetState == 1 ) + { + configASSERT( eTaskGetState( xControllingTaskHandle ) == eSuspended ); + configASSERT( eTaskGetState( xBlockingTaskHandle ) == eSuspended ); + } + #endif /* INCLUDE_eTaskGetState */ + + /* Is the blocking task suspended? */ + if( ( xBlockingIsSuspended != pdTRUE ) || ( xControllingIsSuspended != pdTRUE ) ) + { + xErrorOccurred = pdTRUE; + } + else + { + /* Keep count of the number of cycles this task has performed + so a stall can be detected. */ + uxPollingCycles++; + + /* We can resume the other tasks here even though they have a + higher priority than the polling task. When they execute they + will attempt to obtain the mutex but fail because the polling + task is still the mutex holder. The polling task (this task) + will then inherit the higher priority. The Blocking task will + block indefinitely when it attempts to obtain the mutex, the + Controlling task will only block for a fixed period and an + error will be latched if the polling task has not returned the + mutex by the time this fixed period has expired. */ + vTaskResume( xBlockingTaskHandle ); + vTaskResume( xControllingTaskHandle ); + + /* The other two tasks should now have executed and no longer + be suspended. */ + if( ( xBlockingIsSuspended == pdTRUE ) || ( xControllingIsSuspended == pdTRUE ) ) + { + xErrorOccurred = pdTRUE; + } + + #if( INCLUDE_uxTaskPriorityGet == 1 ) + { + /* Check priority inherited. */ + configASSERT( uxTaskPriorityGet( NULL ) == recmuCONTROLLING_TASK_PRIORITY ); + } + #endif /* INCLUDE_uxTaskPriorityGet */ + + #if( INCLUDE_eTaskGetState == 1 ) + { + configASSERT( eTaskGetState( xControllingTaskHandle ) == eBlocked ); + configASSERT( eTaskGetState( xBlockingTaskHandle ) == eBlocked ); + } + #endif /* INCLUDE_eTaskGetState */ + + /* Release the mutex, disinheriting the higher priority again. */ + if( xSemaphoreGiveRecursive( xMutex ) != pdPASS ) + { + xErrorOccurred = pdTRUE; + } + + #if( INCLUDE_uxTaskPriorityGet == 1 ) + { + /* Check priority disinherited. */ + configASSERT( uxTaskPriorityGet( NULL ) == recmuPOLLING_TASK_PRIORITY ); + } + #endif /* INCLUDE_uxTaskPriorityGet */ + } + } + + #if configUSE_PREEMPTION == 0 + { + taskYIELD(); + } + #endif + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreRecursiveMutexTasksStillRunning( void ) +{ +portBASE_TYPE xReturn; +static unsigned portBASE_TYPE uxLastControllingCycles = 0, uxLastBlockingCycles = 0, uxLastPollingCycles = 0; + + /* Is the controlling task still cycling? */ + if( uxLastControllingCycles == uxControllingCycles ) + { + xErrorOccurred = pdTRUE; + } + else + { + uxLastControllingCycles = uxControllingCycles; + } + + /* Is the blocking task still cycling? */ + if( uxLastBlockingCycles == uxBlockingCycles ) + { + xErrorOccurred = pdTRUE; + } + else + { + uxLastBlockingCycles = uxBlockingCycles; + } + + /* Is the polling task still cycling? */ + if( uxLastPollingCycles == uxPollingCycles ) + { + xErrorOccurred = pdTRUE; + } + else + { + uxLastPollingCycles = uxPollingCycles; + } + + if( xErrorOccurred == pdTRUE ) + { + xReturn = pdFAIL; + } + else + { + xReturn = pdTRUE; + } + + return xReturn; +} + + + + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/semtest.c b/third_party/FreeRTOS/Demo/Common/Minimal/semtest.c new file mode 100644 index 0000000..f25547f --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/semtest.c @@ -0,0 +1,298 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * Creates two sets of two tasks. The tasks within a set share a variable, access + * to which is guarded by a semaphore. + * + * Each task starts by attempting to obtain the semaphore. On obtaining a + * semaphore a task checks to ensure that the guarded variable has an expected + * value. It then clears the variable to zero before counting it back up to the + * expected value in increments of 1. After each increment the variable is checked + * to ensure it contains the value to which it was just set. When the starting + * value is again reached the task releases the semaphore giving the other task in + * the set a chance to do exactly the same thing. The starting value is high + * enough to ensure that a tick is likely to occur during the incrementing loop. + * + * An error is flagged if at any time during the process a shared variable is + * found to have a value other than that expected. Such an occurrence would + * suggest an error in the mutual exclusion mechanism by which access to the + * variable is restricted. + * + * The first set of two tasks poll their semaphore. The second set use blocking + * calls. + * + */ + + +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" +#include "semphr.h" + +/* Demo app include files. */ +#include "semtest.h" + +/* The value to which the shared variables are counted. */ +#define semtstBLOCKING_EXPECTED_VALUE ( ( unsigned long ) 0xfff ) +#define semtstNON_BLOCKING_EXPECTED_VALUE ( ( unsigned long ) 0xff ) + +#define semtstSTACK_SIZE configMINIMAL_STACK_SIZE + +#define semtstNUM_TASKS ( 4 ) + +#define semtstDELAY_FACTOR ( ( portTickType ) 10 ) + +/* The task function as described at the top of the file. */ +static portTASK_FUNCTION_PROTO( prvSemaphoreTest, pvParameters ); + +/* Structure used to pass parameters to each task. */ +typedef struct SEMAPHORE_PARAMETERS +{ + xSemaphoreHandle xSemaphore; + volatile unsigned long *pulSharedVariable; + portTickType xBlockTime; +} xSemaphoreParameters; + +/* Variables used to check that all the tasks are still running without errors. */ +static volatile short sCheckVariables[ semtstNUM_TASKS ] = { 0 }; +static volatile short sNextCheckVariable = 0; + +/*-----------------------------------------------------------*/ + +void vStartSemaphoreTasks( unsigned portBASE_TYPE uxPriority ) +{ +xSemaphoreParameters *pxFirstSemaphoreParameters, *pxSecondSemaphoreParameters; +const portTickType xBlockTime = ( portTickType ) 100; + + /* Create the structure used to pass parameters to the first two tasks. */ + pxFirstSemaphoreParameters = ( xSemaphoreParameters * ) pvPortMalloc( sizeof( xSemaphoreParameters ) ); + + if( pxFirstSemaphoreParameters != NULL ) + { + /* Create the semaphore used by the first two tasks. */ + pxFirstSemaphoreParameters->xSemaphore = xSemaphoreCreateBinary(); + xSemaphoreGive( pxFirstSemaphoreParameters->xSemaphore ); + + if( pxFirstSemaphoreParameters->xSemaphore != NULL ) + { + /* Create the variable which is to be shared by the first two tasks. */ + pxFirstSemaphoreParameters->pulSharedVariable = ( unsigned long * ) pvPortMalloc( sizeof( unsigned long ) ); + + /* Initialise the share variable to the value the tasks expect. */ + *( pxFirstSemaphoreParameters->pulSharedVariable ) = semtstNON_BLOCKING_EXPECTED_VALUE; + + /* The first two tasks do not block on semaphore calls. */ + pxFirstSemaphoreParameters->xBlockTime = ( portTickType ) 0; + + /* Spawn the first two tasks. As they poll they operate at the idle priority. */ + xTaskCreate( prvSemaphoreTest, ( signed char * ) "PolSEM1", semtstSTACK_SIZE, ( void * ) pxFirstSemaphoreParameters, tskIDLE_PRIORITY, ( xTaskHandle * ) NULL ); + xTaskCreate( prvSemaphoreTest, ( signed char * ) "PolSEM2", semtstSTACK_SIZE, ( void * ) pxFirstSemaphoreParameters, tskIDLE_PRIORITY, ( xTaskHandle * ) NULL ); + } + } + + /* Do exactly the same to create the second set of tasks, only this time + provide a block time for the semaphore calls. */ + pxSecondSemaphoreParameters = ( xSemaphoreParameters * ) pvPortMalloc( sizeof( xSemaphoreParameters ) ); + if( pxSecondSemaphoreParameters != NULL ) + { + pxSecondSemaphoreParameters->xSemaphore = xSemaphoreCreateBinary(); + xSemaphoreGive( pxSecondSemaphoreParameters->xSemaphore ); + + if( pxSecondSemaphoreParameters->xSemaphore != NULL ) + { + pxSecondSemaphoreParameters->pulSharedVariable = ( unsigned long * ) pvPortMalloc( sizeof( unsigned long ) ); + *( pxSecondSemaphoreParameters->pulSharedVariable ) = semtstBLOCKING_EXPECTED_VALUE; + pxSecondSemaphoreParameters->xBlockTime = xBlockTime / portTICK_RATE_MS; + + xTaskCreate( prvSemaphoreTest, ( signed char * ) "BlkSEM1", semtstSTACK_SIZE, ( void * ) pxSecondSemaphoreParameters, uxPriority, ( xTaskHandle * ) NULL ); + xTaskCreate( prvSemaphoreTest, ( signed char * ) "BlkSEM2", semtstSTACK_SIZE, ( void * ) pxSecondSemaphoreParameters, uxPriority, ( xTaskHandle * ) NULL ); + } + } + + /* vQueueAddToRegistry() adds the semaphore to the registry, if one is + in use. The registry is provided as a means for kernel aware + debuggers to locate semaphores and has no purpose if a kernel aware debugger + is not being used. The call to vQueueAddToRegistry() will be removed + by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is + defined to be less than 1. */ + vQueueAddToRegistry( ( xQueueHandle ) pxFirstSemaphoreParameters->xSemaphore, ( signed char * ) "Counting_Sem_1" ); + vQueueAddToRegistry( ( xQueueHandle ) pxSecondSemaphoreParameters->xSemaphore, ( signed char * ) "Counting_Sem_2" ); +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( prvSemaphoreTest, pvParameters ) +{ +xSemaphoreParameters *pxParameters; +volatile unsigned long *pulSharedVariable, ulExpectedValue; +unsigned long ulCounter; +short sError = pdFALSE, sCheckVariableToUse; + + /* See which check variable to use. sNextCheckVariable is not semaphore + protected! */ + portENTER_CRITICAL(); + sCheckVariableToUse = sNextCheckVariable; + sNextCheckVariable++; + portEXIT_CRITICAL(); + + /* A structure is passed in as the parameter. This contains the shared + variable being guarded. */ + pxParameters = ( xSemaphoreParameters * ) pvParameters; + pulSharedVariable = pxParameters->pulSharedVariable; + + /* If we are blocking we use a much higher count to ensure loads of context + switches occur during the count. */ + if( pxParameters->xBlockTime > ( portTickType ) 0 ) + { + ulExpectedValue = semtstBLOCKING_EXPECTED_VALUE; + } + else + { + ulExpectedValue = semtstNON_BLOCKING_EXPECTED_VALUE; + } + + for( ;; ) + { + /* Try to obtain the semaphore. */ + if( xSemaphoreTake( pxParameters->xSemaphore, pxParameters->xBlockTime ) == pdPASS ) + { + /* We have the semaphore and so expect any other tasks using the + shared variable to have left it in the state we expect to find + it. */ + if( *pulSharedVariable != ulExpectedValue ) + { + sError = pdTRUE; + } + + /* Clear the variable, then count it back up to the expected value + before releasing the semaphore. Would expect a context switch or + two during this time. */ + for( ulCounter = ( unsigned long ) 0; ulCounter <= ulExpectedValue; ulCounter++ ) + { + *pulSharedVariable = ulCounter; + if( *pulSharedVariable != ulCounter ) + { + sError = pdTRUE; + } + } + + /* Release the semaphore, and if no errors have occurred increment the check + variable. */ + if( xSemaphoreGive( pxParameters->xSemaphore ) == pdFALSE ) + { + sError = pdTRUE; + } + + if( sError == pdFALSE ) + { + if( sCheckVariableToUse < semtstNUM_TASKS ) + { + ( sCheckVariables[ sCheckVariableToUse ] )++; + } + } + + /* If we have a block time then we are running at a priority higher + than the idle priority. This task takes a long time to complete + a cycle (deliberately so to test the guarding) so will be starving + out lower priority tasks. Block for some time to allow give lower + priority tasks some processor time. */ + vTaskDelay( pxParameters->xBlockTime * semtstDELAY_FACTOR ); + } + else + { + if( pxParameters->xBlockTime == ( portTickType ) 0 ) + { + /* We have not got the semaphore yet, so no point using the + processor. We are not blocking when attempting to obtain the + semaphore. */ + taskYIELD(); + } + } + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreSemaphoreTasksStillRunning( void ) +{ +static short sLastCheckVariables[ semtstNUM_TASKS ] = { 0 }; +portBASE_TYPE xTask, xReturn = pdTRUE; + + for( xTask = 0; xTask < semtstNUM_TASKS; xTask++ ) + { + if( sLastCheckVariables[ xTask ] == sCheckVariables[ xTask ] ) + { + xReturn = pdFALSE; + } + + sLastCheckVariables[ xTask ] = sCheckVariables[ xTask ]; + } + + return xReturn; +} + + diff --git a/third_party/FreeRTOS/Demo/Common/Minimal/sp_flop.c b/third_party/FreeRTOS/Demo/Common/Minimal/sp_flop.c new file mode 100644 index 0000000..7545344 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/Minimal/sp_flop.c @@ -0,0 +1,365 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * Creates eight tasks, each of which loops continuously performing a floating + * point calculation - using single precision variables. + * + * All the tasks run at the idle priority and never block or yield. This causes + * all eight tasks to time slice with the idle task. Running at the idle priority + * means that these tasks will get pre-empted any time another task is ready to run + * or a time slice occurs. More often than not the pre-emption will occur mid + * calculation, creating a good test of the schedulers context switch mechanism - a + * calculation producing an unexpected result could be a symptom of a corruption in + * the context of a task. + */ + +#include +#include + +/* Scheduler include files. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Demo program include files. */ +#include "flop.h" + +#define mathSTACK_SIZE configMINIMAL_STACK_SIZE +#define mathNUMBER_OF_TASKS ( 8 ) + +/* Four tasks, each of which performs a different floating point calculation. +Each of the four is created twice. */ +static portTASK_FUNCTION_PROTO( vCompetingMathTask1, pvParameters ); +static portTASK_FUNCTION_PROTO( vCompetingMathTask2, pvParameters ); +static portTASK_FUNCTION_PROTO( vCompetingMathTask3, pvParameters ); +static portTASK_FUNCTION_PROTO( vCompetingMathTask4, pvParameters ); + +/* These variables are used to check that all the tasks are still running. If a +task gets a calculation wrong it will +stop incrementing its check variable. */ +static volatile unsigned short usTaskCheck[ mathNUMBER_OF_TASKS ] = { ( unsigned short ) 0 }; + +/*-----------------------------------------------------------*/ + +void vStartMathTasks( unsigned portBASE_TYPE uxPriority ) +{ + xTaskCreate( vCompetingMathTask1, ( signed char * ) "Math1", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 0 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask2, ( signed char * ) "Math2", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 1 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask3, ( signed char * ) "Math3", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 2 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask4, ( signed char * ) "Math4", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 3 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask1, ( signed char * ) "Math5", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 4 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask2, ( signed char * ) "Math6", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 5 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask3, ( signed char * ) "Math7", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 6 ] ), uxPriority, NULL ); + xTaskCreate( vCompetingMathTask4, ( signed char * ) "Math8", mathSTACK_SIZE, ( void * ) &( usTaskCheck[ 7 ] ), uxPriority, NULL ); +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vCompetingMathTask1, pvParameters ) +{ +volatile float f1, f2, f3, f4; +volatile unsigned short *pusTaskCheckVariable; +volatile float fAnswer; +short sError = pdFALSE; + + f1 = 123.4567F; + f2 = 2345.6789F; + f3 = -918.222F; + + fAnswer = ( f1 + f2 ) * f3; + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + /* Keep performing a calculation and checking the result against a constant. */ + for(;;) + { + f1 = 123.4567F; + f2 = 2345.6789F; + f3 = -918.222F; + + f4 = ( f1 + f2 ) * f3; + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* If the calculation does not match the expected constant, stop the + increment of the check variable. */ + if( fabs( f4 - fAnswer ) > 0.001F ) + { + sError = pdTRUE; + } + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct, increment the check + variable so we know this task is still running okay. */ + ( *pusTaskCheckVariable )++; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + } +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vCompetingMathTask2, pvParameters ) +{ +volatile float f1, f2, f3, f4; +volatile unsigned short *pusTaskCheckVariable; +volatile float fAnswer; +short sError = pdFALSE; + + f1 = -389.38F; + f2 = 32498.2F; + f3 = -2.0001F; + + fAnswer = ( f1 / f2 ) * f3; + + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + /* Keep performing a calculation and checking the result against a constant. */ + for( ;; ) + { + f1 = -389.38F; + f2 = 32498.2F; + f3 = -2.0001F; + + f4 = ( f1 / f2 ) * f3; + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + /* If the calculation does not match the expected constant, stop the + increment of the check variable. */ + if( fabs( f4 - fAnswer ) > 0.001F ) + { + sError = pdTRUE; + } + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct, increment the check + variable so we know + this task is still running okay. */ + ( *pusTaskCheckVariable )++; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + } +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vCompetingMathTask3, pvParameters ) +{ +volatile float *pfArray, fTotal1, fTotal2, fDifference, fPosition; +volatile unsigned short *pusTaskCheckVariable; +const size_t xArraySize = 10; +size_t xPosition; +short sError = pdFALSE; + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + pfArray = ( float * ) pvPortMalloc( xArraySize * sizeof( float ) ); + + /* Keep filling an array, keeping a running total of the values placed in the + array. Then run through the array adding up all the values. If the two totals + do not match, stop the check variable from incrementing. */ + for( ;; ) + { + fTotal1 = 0.0F; + fTotal2 = 0.0F; + fPosition = 0.0F; + + for( xPosition = 0; xPosition < xArraySize; xPosition++ ) + { + pfArray[ xPosition ] = fPosition + 5.5F; + fTotal1 += fPosition + 5.5F; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + for( xPosition = 0; xPosition < xArraySize; xPosition++ ) + { + fTotal2 += pfArray[ xPosition ]; + } + + fDifference = fTotal1 - fTotal2; + if( fabs( fDifference ) > 0.001F ) + { + sError = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct, increment the check + variable so we know this task is still running okay. */ + ( *pusTaskCheckVariable )++; + } + } +} +/*-----------------------------------------------------------*/ + +static portTASK_FUNCTION( vCompetingMathTask4, pvParameters ) +{ +volatile float *pfArray, fTotal1, fTotal2, fDifference, fPosition; +volatile unsigned short *pusTaskCheckVariable; +const size_t xArraySize = 10; +size_t xPosition; +short sError = pdFALSE; + + /* The variable this task increments to show it is still running is passed in + as the parameter. */ + pusTaskCheckVariable = ( unsigned short * ) pvParameters; + + pfArray = ( float * ) pvPortMalloc( xArraySize * sizeof( float ) ); + + /* Keep filling an array, keeping a running total of the values placed in the + array. Then run through the array adding up all the values. If the two totals + do not match, stop the check variable from incrementing. */ + for( ;; ) + { + fTotal1 = 0.0F; + fTotal2 = 0.0F; + fPosition = 0.0F; + + for( xPosition = 0; xPosition < xArraySize; xPosition++ ) + { + pfArray[ xPosition ] = fPosition * 12.123F; + fTotal1 += fPosition * 12.123F; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + for( xPosition = 0; xPosition < xArraySize; xPosition++ ) + { + fTotal2 += pfArray[ xPosition ]; + } + + fDifference = fTotal1 - fTotal2; + if( fabs( fDifference ) > 0.001F ) + { + sError = pdTRUE; + } + + #if configUSE_PREEMPTION == 0 + taskYIELD(); + #endif + + if( sError == pdFALSE ) + { + /* If the calculation has always been correct, increment the check + variable so we know this task is still running okay. */ + ( *pusTaskCheckVariable )++; + } + } +} +/*-----------------------------------------------------------*/ + +/* This is called to check that all the created tasks are still running. */ +portBASE_TYPE xAreMathsTaskStillRunning( void ) +{ +/* Keep a history of the check variables so we know if they have been incremented +since the last call. */ +static unsigned short usLastTaskCheck[ mathNUMBER_OF_TASKS ] = { ( unsigned short ) 0 }; +portBASE_TYPE xReturn = pdTRUE, xTask; + + /* Check the maths tasks are still running by ensuring their check variables + are still incrementing. */ + for( xTask = 0; xTask < mathNUMBER_OF_TASKS; xTask++ ) + { + if( usTaskCheck[ xTask ] == usLastTaskCheck[ xTask ] ) + { + /* The check has not incremented so an error exists. */ + xReturn = pdFALSE; + } + + usLastTaskCheck[ xTask ] = usTaskCheck[ xTask ]; + } + + return xReturn; +} + + + diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/Makefile.include b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/Makefile.include new file mode 100644 index 0000000..43ba247 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/Makefile.include @@ -0,0 +1,47 @@ + + +ifdef APPS + APPDIRS = $(foreach APP, $(APPS), ../apps/$(APP)) + -include $(foreach APP, $(APPS), ../apps/$(APP)/Makefile.$(APP)) + CFLAGS += $(addprefix -I../apps/,$(APPS)) +endif + +ifndef CCDEP + CCDEP = $(CC) +endif +ifndef CCDEPCFLAGS + CCDEPCFLAGS = $(CFLAGS) +endif +ifndef OBJECTDIR + OBJECTDIR = obj +endif + +ifeq (${wildcard $(OBJECTDIR)},) + DUMMY := ${shell mkdir $(OBJECTDIR)} +endif + + +vpath %.c . ../uip ../lib $(APPDIRS) + +$(OBJECTDIR)/%.o: %.c + $(CC) $(CFLAGS) -c $< -o $@ + +$(OBJECTDIR)/%.d: %.c + @set -e; rm -f $@; \ + $(CCDEP) -MM $(CCDEPCFLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,$(OBJECTDIR)/\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$ + +UIP_SOURCES=uip.c uip_arp.c uiplib.c psock.c timer.c uip-neighbor.c + + +ifneq ($(MAKECMDGOALS),clean) +-include $(addprefix $(OBJECTDIR)/,$(UIP_SOURCES:.c=.d) \ + $(APP_SOURCES:.c=.d)) +endif + +uip.a: ${addprefix $(OBJECTDIR)/, $(UIP_SOURCES:.c=.o)} + $(AR) rcf $@ $^ + +apps.a: ${addprefix $(OBJECTDIR)/, $(APP_SOURCES:.c=.o)} + $(AR) rcf $@ $^ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/clock-arch.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/clock-arch.h new file mode 100644 index 0000000..cde657b --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/clock-arch.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +#include "FreeRTOS.h" + +typedef unsigned long clock_time_t; +#define CLOCK_CONF_SECOND configTICK_RATE_HZ + +#endif /* __CLOCK_ARCH_H__ */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/clock.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/clock.h new file mode 100644 index 0000000..dae6874 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/clock.h @@ -0,0 +1,88 @@ +/** + * \defgroup clock Clock interface + * + * The clock interface is the interface between the \ref timer "timer library" + * and the platform specific clock functionality. The clock + * interface must be implemented for each platform that uses the \ref + * timer "timer library". + * + * The clock interface does only one this: it measures time. The clock + * interface provides a macro, CLOCK_SECOND, which corresponds to one + * second of system time. + * + * \sa \ref timer "Timer library" + * + * @{ + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: clock.h,v 1.3 2006/06/11 21:46:39 adam Exp $ + */ +#ifndef __CLOCK_H__ +#define __CLOCK_H__ + +#include "clock-arch.h" + +/** + * Initialize the clock library. + * + * This function initializes the clock library and should be called + * from the main() function of the system. + * + */ +void clock_init(void); + +/** + * Get the current clock time. + * + * This function returns the current system clock time. + * + * \return The current clock time, measured in system ticks. + */ +clock_time_t clock_time(void); + +/** + * A second, measured in system clock time. + * + * \hideinitializer + */ +#ifdef CLOCK_CONF_SECOND +#define CLOCK_SECOND CLOCK_CONF_SECOND +#else +#define CLOCK_SECOND (clock_time_t)32 +#endif + +#endif /* __CLOCK_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/lc-addrlabels.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/lc-addrlabels.h new file mode 100644 index 0000000..9dff03d --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/lc-addrlabels.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2004-2005, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: lc-addrlabels.h,v 1.3 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \addtogroup lc + * @{ + */ + +/** + * \file + * Implementation of local continuations based on the "Labels as + * values" feature of gcc + * \author + * Adam Dunkels + * + * This implementation of local continuations is based on a special + * feature of the GCC C compiler called "labels as values". This + * feature allows assigning pointers with the address of the code + * corresponding to a particular C label. + * + * For more information, see the GCC documentation: + * http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html + * + * Thanks to dividuum for finding the nice local scope label + * implementation. + */ + +#ifndef __LC_ADDRLABELS_H__ +#define __LC_ADDRLABELS_H__ + +/** \hideinitializer */ +typedef void * lc_t; + +#define LC_INIT(s) s = NULL + + +#define LC_RESUME(s) \ + do { \ + if(s != NULL) { \ + goto *s; \ + } \ + } while(0) + +#define LC_SET(s) \ + do { ({ __label__ resume; resume: (s) = &&resume; }); }while(0) + +#define LC_END(s) + +#endif /* __LC_ADDRLABELS_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/lc-switch.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/lc-switch.h new file mode 100644 index 0000000..17c8811 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/lc-switch.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2004-2005, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: lc-switch.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \addtogroup lc + * @{ + */ + +/** + * \file + * Implementation of local continuations based on switch() statment + * \author Adam Dunkels + * + * This implementation of local continuations uses the C switch() + * statement to resume execution of a function somewhere inside the + * function's body. The implementation is based on the fact that + * switch() statements are able to jump directly into the bodies of + * control structures such as if() or while() statmenets. + * + * This implementation borrows heavily from Simon Tatham's coroutines + * implementation in C: + * http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html + */ + +#ifndef __LC_SWITCH_H__ +#define __LC_SWTICH_H__ + +/* WARNING! lc implementation using switch() does not work if an + LC_SET() is done within another switch() statement! */ + +/** \hideinitializer */ +typedef unsigned short lc_t; + +#define LC_INIT(s) s = 0; + +#define LC_RESUME(s) switch(s) { case 0: + +#define LC_SET(s) s = __LINE__; case __LINE__: + +#define LC_END(s) } + +#endif /* __LC_SWITCH_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/lc.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/lc.h new file mode 100644 index 0000000..3ad83cd --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/lc.h @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2004-2005, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: lc.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \addtogroup pt + * @{ + */ + +/** + * \defgroup lc Local continuations + * @{ + * + * Local continuations form the basis for implementing protothreads. A + * local continuation can be set in a specific function to + * capture the state of the function. After a local continuation has + * been set can be resumed in order to restore the state of the + * function at the point where the local continuation was set. + * + * + */ + +/** + * \file lc.h + * Local continuations + * \author + * Adam Dunkels + * + */ + +#ifdef DOXYGEN +/** + * Initialize a local continuation. + * + * This operation initializes the local continuation, thereby + * unsetting any previously set continuation state. + * + * \hideinitializer + */ +#define LC_INIT(lc) + +/** + * Set a local continuation. + * + * The set operation saves the state of the function at the point + * where the operation is executed. As far as the set operation is + * concerned, the state of the function does not include the + * call-stack or local (automatic) variables, but only the program + * counter and such CPU registers that needs to be saved. + * + * \hideinitializer + */ +#define LC_SET(lc) + +/** + * Resume a local continuation. + * + * The resume operation resumes a previously set local continuation, thus + * restoring the state in which the function was when the local + * continuation was set. If the local continuation has not been + * previously set, the resume operation does nothing. + * + * \hideinitializer + */ +#define LC_RESUME(lc) + +/** + * Mark the end of local continuation usage. + * + * The end operation signifies that local continuations should not be + * used any more in the function. This operation is not needed for + * most implementations of local continuation, but is required by a + * few implementations. + * + * \hideinitializer + */ +#define LC_END(lc) + +/** + * \var typedef lc_t; + * + * The local continuation type. + * + * \hideinitializer + */ +#endif /* DOXYGEN */ + +#ifndef __LC_H__ +#define __LC_H__ + +#ifdef LC_CONF_INCLUDE +#include LC_CONF_INCLUDE +#else +#include "lc-switch.h" +#endif /* LC_CONF_INCLUDE */ + +#endif /* __LC_H__ */ + +/** @} */ +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/psock.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/psock.c new file mode 100644 index 0000000..d29ef01 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/psock.c @@ -0,0 +1,374 @@ +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: psock.c,v 1.1 2007/01/04 11:06:40 adamdunkels Exp $ + */ +#include +#include + +#include "uipopt.h" +#include "psock.h" +#include "uip.h" + +#define STATE_NONE 0 +#define STATE_ACKED 1 +#define STATE_READ 2 +#define STATE_BLOCKED_NEWDATA 3 +#define STATE_BLOCKED_CLOSE 4 +#define STATE_BLOCKED_SEND 5 +#define STATE_DATA_SENT 6 + +/* + * Return value of the buffering functions that indicates that a + * buffer was not filled by incoming data. + * + */ +#define BUF_NOT_FULL 0 +#define BUF_NOT_FOUND 0 + +/* + * Return value of the buffering functions that indicates that a + * buffer was completely filled by incoming data. + * + */ +#define BUF_FULL 1 + +/* + * Return value of the buffering functions that indicates that an + * end-marker byte was found. + * + */ +#define BUF_FOUND 2 + +/*---------------------------------------------------------------------------*/ +static void buf_setup( struct psock_buf *buf, u8_t *bufptr, u16_t bufsize ) +{ + buf->ptr = bufptr; + buf->left = bufsize; +} + +/*---------------------------------------------------------------------------*/ +static u8_t buf_bufdata( struct psock_buf *buf, u16_t len, u8_t **dataptr, u16_t *datalen ) +{ + ( void ) len; + + if( *datalen < buf->left ) + { + memcpy( buf->ptr, *dataptr, *datalen ); + buf->ptr += *datalen; + buf->left -= *datalen; + *dataptr += *datalen; + *datalen = 0; + return BUF_NOT_FULL; + } + else if( *datalen == buf->left ) + { + memcpy( buf->ptr, *dataptr, *datalen ); + buf->ptr += *datalen; + buf->left = 0; + *dataptr += *datalen; + *datalen = 0; + return BUF_FULL; + } + else + { + memcpy( buf->ptr, *dataptr, buf->left ); + buf->ptr += buf->left; + *datalen -= buf->left; + *dataptr += buf->left; + buf->left = 0; + return BUF_FULL; + } +} + +/*---------------------------------------------------------------------------*/ +static u8_t buf_bufto( register struct psock_buf *buf, u8_t endmarker, register u8_t **dataptr, register u16_t *datalen ) +{ + u8_t c; + while( buf->left > 0 && *datalen > 0 ) + { + c = *buf->ptr = **dataptr; + ++ *dataptr; + ++buf->ptr; + -- *datalen; + --buf->left; + + if( c == endmarker ) + { + return BUF_FOUND; + } + } + + if( *datalen == 0 ) + { + return BUF_NOT_FOUND; + } + + while( *datalen > 0 ) + { + c = **dataptr; + -- *datalen; + ++ *dataptr; + + if( c == endmarker ) + { + return BUF_FOUND | BUF_FULL; + } + } + + return BUF_FULL; +} + +/*---------------------------------------------------------------------------*/ +static char send_data( register struct psock *s ) +{ + if( s->state != STATE_DATA_SENT || uip_rexmit() ) + { + if( s->sendlen > uip_mss() ) + { + uip_send( s->sendptr, uip_mss() ); + } + else + { + uip_send( s->sendptr, s->sendlen ); + } + + s->state = STATE_DATA_SENT; + return 1; + } + + return 0; +} + +/*---------------------------------------------------------------------------*/ +static char data_acked( register struct psock *s ) +{ + if( s->state == STATE_DATA_SENT && uip_acked() ) + { + if( s->sendlen > uip_mss() ) + { + s->sendlen -= uip_mss(); + s->sendptr += uip_mss(); + } + else + { + s->sendptr += s->sendlen; + s->sendlen = 0; + } + + s->state = STATE_ACKED; + return 1; + } + + return 0; +} + +/*---------------------------------------------------------------------------*/ +PT_THREAD( psock_send ( register struct psock *s, const char *buf, unsigned int len ) ) +{ + PT_BEGIN( &s->psockpt ); + + /* If there is no data to send, we exit immediately. */ + if( len == 0 ) + { + PT_EXIT( &s->psockpt ); + } + + /* Save the length of and a pointer to the data that is to be + sent. */ + s->sendptr = ( u8_t * ) buf; + s->sendlen = len; + + s->state = STATE_NONE; + + /* We loop here until all data is sent. The s->sendlen variable is + updated by the data_sent() function. */ + while( s->sendlen > 0 ) + { + /* + * The condition for this PT_WAIT_UNTIL is a little tricky: the + * protothread will wait here until all data has been acknowledged + * (data_acked() returns true) and until all data has been sent + * (send_data() returns true). The two functions data_acked() and + * send_data() must be called in succession to ensure that all + * data is sent. Therefore the & operator is used instead of the + * && operator, which would cause only the data_acked() function + * to be called when it returns false. + */ + PT_WAIT_UNTIL( &s->psockpt, data_acked(s) & send_data(s) ); + } + + s->state = STATE_NONE; + + PT_END( &s->psockpt ); +} + +/*---------------------------------------------------------------------------*/ +PT_THREAD( psock_generator_send ( register struct psock *s, unsigned short ( *generate ) ( void * ), void *arg ) ) +{ + PT_BEGIN( &s->psockpt ); + + /* Ensure that there is a generator function to call. */ + if( generate == NULL ) + { + PT_EXIT( &s->psockpt ); + } + + /* Call the generator function to generate the data in the + uip_appdata buffer. */ + s->sendlen = generate( arg ); + s->sendptr = uip_appdata; + + s->state = STATE_NONE; + do + { + /* Call the generator function again if we are called to perform a + retransmission. */ + if( uip_rexmit() ) + { + generate( arg ); + } + + /* Wait until all data is sent and acknowledged. */ + PT_WAIT_UNTIL( &s->psockpt, data_acked(s) & send_data(s) ); + } while( s->sendlen > 0 ); + + s->state = STATE_NONE; + + PT_END( &s->psockpt ); +} + +/*---------------------------------------------------------------------------*/ +u16_t psock_datalen( struct psock *psock ) +{ + return psock->bufsize - psock->buf.left; +} + +/*---------------------------------------------------------------------------*/ +char psock_newdata( struct psock *s ) +{ + if( s->readlen > 0 ) + { + /* There is data in the uip_appdata buffer that has not yet been + read with the PSOCK_READ functions. */ + return 1; + } + else if( s->state == STATE_READ ) + { + /* All data in uip_appdata buffer already consumed. */ + s->state = STATE_BLOCKED_NEWDATA; + return 0; + } + else if( uip_newdata() ) + { + /* There is new data that has not been consumed. */ + return 1; + } + else + { + /* There is no new data. */ + return 0; + } +} + +/*---------------------------------------------------------------------------*/ +PT_THREAD( psock_readto ( register struct psock *psock, unsigned char c ) ) +{ + PT_BEGIN( &psock->psockpt ); + + buf_setup( &psock->buf, ( u8_t * ) psock->bufptr, psock->bufsize ); + + /* XXX: Should add buf_checkmarker() before do{} loop, if + incoming data has been handled while waiting for a write. */ + do + { + if( psock->readlen == 0 ) + { + PT_WAIT_UNTIL( &psock->psockpt, psock_newdata(psock) ); + psock->state = STATE_READ; + psock->readptr = ( u8_t * ) uip_appdata; + psock->readlen = uip_datalen(); + } + } while( (buf_bufto(&psock->buf, c, &psock->readptr, &psock->readlen) & BUF_FOUND) == 0 ); + + if( psock_datalen(psock) == 0 ) + { + psock->state = STATE_NONE; + PT_RESTART( &psock->psockpt ); + } + + PT_END( &psock->psockpt ); +} + +/*---------------------------------------------------------------------------*/ +PT_THREAD( psock_readbuf ( register struct psock *psock ) ) +{ + PT_BEGIN( &psock->psockpt ); + + buf_setup( &psock->buf, ( u8_t * ) psock->bufptr, psock->bufsize ); + + /* XXX: Should add buf_checkmarker() before do{} loop, if + incoming data has been handled while waiting for a write. */ + do + { + if( psock->readlen == 0 ) + { + PT_WAIT_UNTIL( &psock->psockpt, psock_newdata(psock) ); + printf( "Waited for newdata\n" ); + psock->state = STATE_READ; + psock->readptr = ( u8_t * ) uip_appdata; + psock->readlen = uip_datalen(); + } + } while( buf_bufdata(&psock->buf, psock->bufsize, &psock->readptr, &psock->readlen) != BUF_FULL ); + + if( psock_datalen(psock) == 0 ) + { + psock->state = STATE_NONE; + PT_RESTART( &psock->psockpt ); + } + + PT_END( &psock->psockpt ); +} + +/*---------------------------------------------------------------------------*/ +void psock_init( register struct psock *psock, char *buffer, unsigned int buffersize ) +{ + psock->state = STATE_NONE; + psock->readlen = 0; + psock->bufptr = buffer; + psock->bufsize = buffersize; + buf_setup( &psock->buf, ( u8_t * ) buffer, buffersize ); + PT_INIT( &psock->pt ); + PT_INIT( &psock->psockpt ); +} + +/*---------------------------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/psock.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/psock.h new file mode 100644 index 0000000..8d41258 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/psock.h @@ -0,0 +1,380 @@ +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: psock.h,v 1.3 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \defgroup psock Protosockets library + * @{ + * + * The protosocket library provides an interface to the uIP stack that is + * similar to the traditional BSD socket interface. Unlike programs + * written for the ordinary uIP event-driven interface, programs + * written with the protosocket library are executed in a sequential + * fashion and does not have to be implemented as explicit state + * machines. + * + * Protosockets only work with TCP connections. + * + * The protosocket library uses \ref pt protothreads to provide + * sequential control flow. This makes the protosockets lightweight in + * terms of memory, but also means that protosockets inherits the + * functional limitations of protothreads. Each protosocket lives only + * within a single function. Automatic variables (stack variables) are + * not retained across a protosocket library function call. + * + * \note Because the protosocket library uses protothreads, local + * variables will not always be saved across a call to a protosocket + * library function. It is therefore advised that local variables are + * used with extreme care. + * + * The protosocket library provides functions for sending data without + * having to deal with retransmissions and acknowledgements, as well + * as functions for reading data without having to deal with data + * being split across more than one TCP segment. + * + * Because each protosocket runs as a protothread, the protosocket has to be + * started with a call to PSOCK_BEGIN() at the start of the function + * in which the protosocket is used. Similarly, the protosocket protothread can + * be terminated by a call to PSOCK_EXIT(). + * + */ + +/** + * \file + * Protosocket library header file + * \author + * Adam Dunkels + * + */ + +#ifndef __PSOCK_H__ +#define __PSOCK_H__ + +#include "uipopt.h" +#include "pt.h" + + /* + * The structure that holds the state of a buffer. + * + * This structure holds the state of a uIP buffer. The structure has + * no user-visible elements, but is used through the functions + * provided by the library. + * + */ +struct psock_buf { + u8_t *ptr; + unsigned short left; +}; + +/** + * The representation of a protosocket. + * + * The protosocket structrure is an opaque structure with no user-visible + * elements. + */ +struct psock { + struct pt pt, psockpt; /* Protothreads - one that's using the psock + functions, and one that runs inside the + psock functions. */ + const u8_t *sendptr; /* Pointer to the next data to be sent. */ + u8_t *readptr; /* Pointer to the next data to be read. */ + + char *bufptr; /* Pointer to the buffer used for buffering + incoming data. */ + + u16_t sendlen; /* The number of bytes left to be sent. */ + u16_t readlen; /* The number of bytes left to be read. */ + + struct psock_buf buf; /* The structure holding the state of the + input buffer. */ + unsigned int bufsize; /* The size of the input buffer. */ + + unsigned char state; /* The state of the protosocket. */ +}; + +void psock_init(struct psock *psock, char *buffer, unsigned int buffersize); +/** + * Initialize a protosocket. + * + * This macro initializes a protosocket and must be called before the + * protosocket is used. The initialization also specifies the input buffer + * for the protosocket. + * + * \param psock (struct psock *) A pointer to the protosocket to be + * initialized + * + * \param buffer (char *) A pointer to the input buffer for the + * protosocket. + * + * \param buffersize (unsigned int) The size of the input buffer. + * + * \hideinitializer + */ +#define PSOCK_INIT(psock, buffer, buffersize) \ + psock_init(psock, buffer, buffersize) + +/** + * Start the protosocket protothread in a function. + * + * This macro starts the protothread associated with the protosocket and + * must come before other protosocket calls in the function it is used. + * + * \param psock (struct psock *) A pointer to the protosocket to be + * started. + * + * \hideinitializer + */ +#define PSOCK_BEGIN(psock) PT_BEGIN(&((psock)->pt)) + +PT_THREAD(psock_send(struct psock *psock, const char *buf, unsigned int len)); +/** + * Send data. + * + * This macro sends data over a protosocket. The protosocket protothread blocks + * until all data has been sent and is known to have been received by + * the remote end of the TCP connection. + * + * \param psock (struct psock *) A pointer to the protosocket over which + * data is to be sent. + * + * \param data (char *) A pointer to the data that is to be sent. + * + * \param datalen (unsigned int) The length of the data that is to be + * sent. + * + * \hideinitializer + */ +#define PSOCK_SEND(psock, data, datalen) \ + PT_WAIT_THREAD(&((psock)->pt), psock_send(psock, data, datalen)) + +/** + * \brief Send a null-terminated string. + * \param psock Pointer to the protosocket. + * \param str The string to be sent. + * + * This function sends a null-terminated string over the + * protosocket. + * + * \hideinitializer + */ +#define PSOCK_SEND_STR(psock, str) \ + PT_WAIT_THREAD(&((psock)->pt), psock_send(psock, str, strlen(str))) + +PT_THREAD(psock_generator_send(struct psock *psock, + unsigned short (*f)(void *), void *arg)); + +/** + * \brief Generate data with a function and send it + * \param psock Pointer to the protosocket. + * \param generator Pointer to the generator function + * \param arg Argument to the generator function + * + * This function generates data and sends it over the + * protosocket. This can be used to dynamically generate + * data for a transmission, instead of generating the data + * in a buffer beforehand. This function reduces the need for + * buffer memory. The generator function is implemented by + * the application, and a pointer to the function is given + * as an argument with the call to PSOCK_GENERATOR_SEND(). + * + * The generator function should place the generated data + * directly in the uip_appdata buffer, and return the + * length of the generated data. The generator function is + * called by the protosocket layer when the data first is + * sent, and once for every retransmission that is needed. + * + * \hideinitializer + */ +#define PSOCK_GENERATOR_SEND(psock, generator, arg) \ + PT_WAIT_THREAD(&((psock)->pt), \ + psock_generator_send(psock, generator, arg)) + + +/** + * Close a protosocket. + * + * This macro closes a protosocket and can only be called from within the + * protothread in which the protosocket lives. + * + * \param psock (struct psock *) A pointer to the protosocket that is to + * be closed. + * + * \hideinitializer + */ +#define PSOCK_CLOSE(psock) uip_close() + +PT_THREAD(psock_readbuf(struct psock *psock)); +/** + * Read data until the buffer is full. + * + * This macro will block waiting for data and read the data into the + * input buffer specified with the call to PSOCK_INIT(). Data is read + * until the buffer is full.. + * + * \param psock (struct psock *) A pointer to the protosocket from which + * data should be read. + * + * \hideinitializer + */ +#define PSOCK_READBUF(psock) \ + PT_WAIT_THREAD(&((psock)->pt), psock_readbuf(psock)) + +PT_THREAD(psock_readto(struct psock *psock, unsigned char c)); +/** + * Read data up to a specified character. + * + * This macro will block waiting for data and read the data into the + * input buffer specified with the call to PSOCK_INIT(). Data is only + * read until the specifieed character appears in the data stream. + * + * \param psock (struct psock *) A pointer to the protosocket from which + * data should be read. + * + * \param c (char) The character at which to stop reading. + * + * \hideinitializer + */ +#define PSOCK_READTO(psock, c) \ + PT_WAIT_THREAD(&((psock)->pt), psock_readto(psock, c)) + +/** + * The length of the data that was previously read. + * + * This macro returns the length of the data that was previously read + * using PSOCK_READTO() or PSOCK_READ(). + * + * \param psock (struct psock *) A pointer to the protosocket holding the data. + * + * \hideinitializer + */ +#define PSOCK_DATALEN(psock) psock_datalen(psock) + +u16_t psock_datalen(struct psock *psock); + +/** + * Exit the protosocket's protothread. + * + * This macro terminates the protothread of the protosocket and should + * almost always be used in conjunction with PSOCK_CLOSE(). + * + * \sa PSOCK_CLOSE_EXIT() + * + * \param psock (struct psock *) A pointer to the protosocket. + * + * \hideinitializer + */ +#define PSOCK_EXIT(psock) PT_EXIT(&((psock)->pt)) + +/** + * Close a protosocket and exit the protosocket's protothread. + * + * This macro closes a protosocket and exits the protosocket's protothread. + * + * \param psock (struct psock *) A pointer to the protosocket. + * + * \hideinitializer + */ +#define PSOCK_CLOSE_EXIT(psock) \ + do { \ + PSOCK_CLOSE(psock); \ + PSOCK_EXIT(psock); \ + } while(0) + +/** + * Declare the end of a protosocket's protothread. + * + * This macro is used for declaring that the protosocket's protothread + * ends. It must always be used together with a matching PSOCK_BEGIN() + * macro. + * + * \param psock (struct psock *) A pointer to the protosocket. + * + * \hideinitializer + */ +#define PSOCK_END(psock) PT_END(&((psock)->pt)) + +char psock_newdata(struct psock *s); + +/** + * Check if new data has arrived on a protosocket. + * + * This macro is used in conjunction with the PSOCK_WAIT_UNTIL() + * macro to check if data has arrived on a protosocket. + * + * \param psock (struct psock *) A pointer to the protosocket. + * + * \hideinitializer + */ +#define PSOCK_NEWDATA(psock) psock_newdata(psock) + +/** + * Wait until a condition is true. + * + * This macro blocks the protothread until the specified condition is + * true. The macro PSOCK_NEWDATA() can be used to check if new data + * arrives when the protosocket is waiting. + * + * Typically, this macro is used as follows: + * + \code + PT_THREAD(thread(struct psock *s, struct timer *t)) + { + PSOCK_BEGIN(s); + + PSOCK_WAIT_UNTIL(s, PSOCK_NEWADATA(s) || timer_expired(t)); + + if(PSOCK_NEWDATA(s)) { + PSOCK_READTO(s, '\n'); + } else { + handle_timed_out(s); + } + + PSOCK_END(s); + } + \endcode + * + * \param psock (struct psock *) A pointer to the protosocket. + * \param condition The condition to wait for. + * + * \hideinitializer + */ +#define PSOCK_WAIT_UNTIL(psock, condition) \ + PT_WAIT_UNTIL(&((psock)->pt), (condition)); + +#define PSOCK_WAIT_THREAD(psock, condition) \ + PT_WAIT_THREAD(&((psock)->pt), (condition)) + +#endif /* __PSOCK_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/pt.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/pt.h new file mode 100644 index 0000000..00ddd44 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/pt.h @@ -0,0 +1,323 @@ +/* + * Copyright (c) 2004-2005, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: pt.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \addtogroup pt + * @{ + */ + +/** + * \file + * Protothreads implementation. + * \author + * Adam Dunkels + * + */ + +#ifndef __PT_H__ +#define __PT_H__ + +#include "lc.h" + +struct pt { + lc_t lc; +}; + +#define PT_WAITING 0 +#define PT_EXITED 1 +#define PT_ENDED 2 +#define PT_YIELDED 3 + +/** + * \name Initialization + * @{ + */ + +/** + * Initialize a protothread. + * + * Initializes a protothread. Initialization must be done prior to + * starting to execute the protothread. + * + * \param pt A pointer to the protothread control structure. + * + * \sa PT_SPAWN() + * + * \hideinitializer + */ +#define PT_INIT(pt) LC_INIT((pt)->lc) + +/** @} */ + +/** + * \name Declaration and definition + * @{ + */ + +/** + * Declaration of a protothread. + * + * This macro is used to declare a protothread. All protothreads must + * be declared with this macro. + * + * \param name_args The name and arguments of the C function + * implementing the protothread. + * + * \hideinitializer + */ +#define PT_THREAD(name_args) char name_args + +/** + * Declare the start of a protothread inside the C function + * implementing the protothread. + * + * This macro is used to declare the starting point of a + * protothread. It should be placed at the start of the function in + * which the protothread runs. All C statements above the PT_BEGIN() + * invokation will be executed each time the protothread is scheduled. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc) + +/** + * Declare the end of a protothread. + * + * This macro is used for declaring that a protothread ends. It must + * always be used together with a matching PT_BEGIN() macro. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \ + PT_INIT(pt); return PT_ENDED; } + +/** @} */ + +/** + * \name Blocked wait + * @{ + */ + +/** + * Block and wait until condition is true. + * + * This macro blocks the protothread until the specified condition is + * true. + * + * \param pt A pointer to the protothread control structure. + * \param condition The condition. + * + * \hideinitializer + */ +#define PT_WAIT_UNTIL(pt, condition) \ + do { \ + LC_SET((pt)->lc); \ + if(!(condition)) { \ + return PT_WAITING; \ + } \ + } while(0) + +/** + * Block and wait while condition is true. + * + * This function blocks and waits while condition is true. See + * PT_WAIT_UNTIL(). + * + * \param pt A pointer to the protothread control structure. + * \param cond The condition. + * + * \hideinitializer + */ +#define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond)) + +/** @} */ + +/** + * \name Hierarchical protothreads + * @{ + */ + +/** + * Block and wait until a child protothread completes. + * + * This macro schedules a child protothread. The current protothread + * will block until the child protothread completes. + * + * \note The child protothread must be manually initialized with the + * PT_INIT() function before this function is used. + * + * \param pt A pointer to the protothread control structure. + * \param thread The child protothread with arguments + * + * \sa PT_SPAWN() + * + * \hideinitializer + */ +#define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread)) + +/** + * Spawn a child protothread and wait until it exits. + * + * This macro spawns a child protothread and waits until it exits. The + * macro can only be used within a protothread. + * + * \param pt A pointer to the protothread control structure. + * \param child A pointer to the child protothread's control structure. + * \param thread The child protothread with arguments + * + * \hideinitializer + */ +#define PT_SPAWN(pt, child, thread) \ + do { \ + PT_INIT((child)); \ + PT_WAIT_THREAD((pt), (thread)); \ + } while(0) + +/** @} */ + +/** + * \name Exiting and restarting + * @{ + */ + +/** + * Restart the protothread. + * + * This macro will block and cause the running protothread to restart + * its execution at the place of the PT_BEGIN() call. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_RESTART(pt) \ + do { \ + PT_INIT(pt); \ + return PT_WAITING; \ + } while(0) + +/** + * Exit the protothread. + * + * This macro causes the protothread to exit. If the protothread was + * spawned by another protothread, the parent protothread will become + * unblocked and can continue to run. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_EXIT(pt) \ + do { \ + PT_INIT(pt); \ + return PT_EXITED; \ + } while(0) + +/** @} */ + +/** + * \name Calling a protothread + * @{ + */ + +/** + * Schedule a protothread. + * + * This function shedules a protothread. The return value of the + * function is non-zero if the protothread is running or zero if the + * protothread has exited. + * + * \param f The call to the C function implementing the protothread to + * be scheduled + * + * \hideinitializer + */ +#define PT_SCHEDULE(f) ((f) == PT_WAITING) + +/** @} */ + +/** + * \name Yielding from a protothread + * @{ + */ + +/** + * Yield from the current protothread. + * + * This function will yield the protothread, thereby allowing other + * processing to take place in the system. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_YIELD(pt) \ + do { \ + PT_YIELD_FLAG = 0; \ + LC_SET((pt)->lc); \ + if(PT_YIELD_FLAG == 0) { \ + return PT_YIELDED; \ + } \ + } while(0) + +/** + * \brief Yield from the protothread until a condition occurs. + * \param pt A pointer to the protothread control structure. + * \param cond The condition. + * + * This function will yield the protothread, until the + * specified condition evaluates to true. + * + * + * \hideinitializer + */ +#define PT_YIELD_UNTIL(pt, cond) \ + do { \ + PT_YIELD_FLAG = 0; \ + LC_SET((pt)->lc); \ + if((PT_YIELD_FLAG == 0) || !(cond)) { \ + return PT_YIELDED; \ + } \ + } while(0) + +/** @} */ + +#endif /* __PT_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/timer.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/timer.c new file mode 100644 index 0000000..9a63653 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/timer.c @@ -0,0 +1,130 @@ +/** + * \addtogroup timer + * @{ + */ + +/** + * \file + * Timer library implementation. + * \author + * Adam Dunkels + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: timer.c,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ +#include "clock.h" +#include "uip_timer.h" + +/*---------------------------------------------------------------------------*/ + +/** + * Set a timer. + * + * This function is used to set a timer for a time sometime in the + * future. The function timer_expired() will evaluate to true after + * the timer has expired. + * + * \param t A pointer to the timer + * \param interval The interval before the timer expires. + * + */ +void timer_set( struct timer *t, clock_time_t interval ) +{ + t->interval = interval; + t->start = clock_time(); +} + +/*---------------------------------------------------------------------------*/ + +/** + * Reset the timer with the same interval. + * + * This function resets the timer with the same interval that was + * given to the timer_set() function. The start point of the interval + * is the exact time that the timer last expired. Therefore, this + * function will cause the timer to be stable over time, unlike the + * timer_rester() function. + * + * \param t A pointer to the timer. + * + * \sa timer_restart() + */ +void timer_reset( struct timer *t ) +{ + t->start += t->interval; +} + +/*---------------------------------------------------------------------------*/ + +/** + * Restart the timer from the current point in time + * + * This function restarts a timer with the same interval that was + * given to the timer_set() function. The timer will start at the + * current time. + * + * \note A periodic timer will drift if this function is used to reset + * it. For preioric timers, use the timer_reset() function instead. + * + * \param t A pointer to the timer. + * + * \sa timer_reset() + */ +void timer_restart( struct timer *t ) +{ + t->start = clock_time(); +} + +/*---------------------------------------------------------------------------*/ + +/** + * Check if a timer has expired. + * + * This function tests if a timer has expired and returns true or + * false depending on its status. + * + * \param t A pointer to the timer + * + * \return Non-zero if the timer has expired, zero otherwise. + * + */ +int timer_expired( struct timer *t ) +{ + return( clock_time_t ) ( clock_time() - t->start ) >= ( clock_time_t ) t->interval; +} + +/*---------------------------------------------------------------------------*/ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/timer.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/timer.h new file mode 100644 index 0000000..e28e3ca --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/timer.h @@ -0,0 +1,86 @@ +/** + * \defgroup timer Timer library + * + * The timer library provides functions for setting, resetting and + * restarting timers, and for checking if a timer has expired. An + * application must "manually" check if its timers have expired; this + * is not done automatically. + * + * A timer is declared as a \c struct \c timer and all access to the + * timer is made by a pointer to the declared timer. + * + * \note The timer library uses the \ref clock "Clock library" to + * measure time. Intervals should be specified in the format used by + * the clock library. + * + * @{ + */ + + +/** + * \file + * Timer library header file. + * \author + * Adam Dunkels + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: timer.h,v 1.3 2006/06/11 21:46:39 adam Exp $ + */ +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#include "clock.h" + +/** + * A timer. + * + * This structure is used for declaring a timer. The timer must be set + * with timer_set() before it can be used. + * + * \hideinitializer + */ +struct timer { + clock_time_t start; + clock_time_t interval; +}; + +void timer_set(struct timer *t, clock_time_t interval); +void timer_reset(struct timer *t); +void timer_restart(struct timer *t); +int timer_expired(struct timer *t); + +#endif /* __TIMER_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-fw.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-fw.h new file mode 100644 index 0000000..e854ece --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-fw.h @@ -0,0 +1,176 @@ +/** + * \addtogroup uipfw + * @{ + */ + +/** + * \file + * uIP packet forwarding header file. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: uip-fw.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ +#ifndef __UIP_FW_H__ +#define __UIP_FW_H__ + +#include "uip.h" + +/** + * Representation of a uIP network interface. + */ +struct uip_fw_netif { + struct uip_fw_netif *next; /**< Pointer to the next interface when + linked in a list. */ + u16_t ipaddr[2]; /**< The IP address of this interface. */ + u16_t netmask[2]; /**< The netmask of the interface. */ + u8_t (* output)(void); + /**< A pointer to the function that + sends a packet. */ +}; + +/** + * Intantiating macro for a uIP network interface. + * + * Example: + \code + struct uip_fw_netif slipnetif = + {UIP_FW_NETIF(192,168,76,1, 255,255,255,0, slip_output)}; + \endcode + * \param ip1,ip2,ip3,ip4 The IP address of the network interface. + * + * \param nm1,nm2,nm3,nm4 The netmask of the network interface. + * + * \param outputfunc A pointer to the output function of the network interface. + * + * \hideinitializer + */ +#define UIP_FW_NETIF(ip1,ip2,ip3,ip4, nm1,nm2,nm3,nm4, outputfunc) \ + NULL, \ + {HTONS((ip1 << 8) | ip2), HTONS((ip3 << 8) | ip4)}, \ + {HTONS((nm1 << 8) | nm2), HTONS((nm3 << 8) | nm4)}, \ + outputfunc + +/** + * Set the IP address of a network interface. + * + * \param netif A pointer to the uip_fw_netif structure for the network interface. + * + * \param addr A pointer to an IP address. + * + * \hideinitializer + */ +#define uip_fw_setipaddr(netif, addr) \ + do { (netif)->ipaddr[0] = ((u16_t *)(addr))[0]; \ + (netif)->ipaddr[1] = ((u16_t *)(addr))[1]; } while(0) +/** + * Set the netmask of a network interface. + * + * \param netif A pointer to the uip_fw_netif structure for the network interface. + * + * \param addr A pointer to an IP address representing the netmask. + * + * \hideinitializer + */ +#define uip_fw_setnetmask(netif, addr) \ + do { (netif)->netmask[0] = ((u16_t *)(addr))[0]; \ + (netif)->netmask[1] = ((u16_t *)(addr))[1]; } while(0) + +void uip_fw_init(void); +u8_t uip_fw_forward(void); +u8_t uip_fw_output(void); +void uip_fw_register(struct uip_fw_netif *netif); +void uip_fw_default(struct uip_fw_netif *netif); +void uip_fw_periodic(void); + + +/** + * A non-error message that indicates that a packet should be + * processed locally. + * + * \hideinitializer + */ +#define UIP_FW_LOCAL 0 + +/** + * A non-error message that indicates that something went OK. + * + * \hideinitializer + */ +#define UIP_FW_OK 0 + +/** + * A non-error message that indicates that a packet was forwarded. + * + * \hideinitializer + */ +#define UIP_FW_FORWARDED 1 + +/** + * A non-error message that indicates that a zero-length packet + * transmission was attempted, and that no packet was sent. + * + * \hideinitializer + */ +#define UIP_FW_ZEROLEN 2 + +/** + * An error message that indicates that a packet that was too large + * for the outbound network interface was detected. + * + * \hideinitializer + */ +#define UIP_FW_TOOLARGE 3 + +/** + * An error message that indicates that no suitable interface could be + * found for an outbound packet. + * + * \hideinitializer + */ +#define UIP_FW_NOROUTE 4 + +/** + * An error message that indicates that a packet that should be + * forwarded or output was dropped. + * + * \hideinitializer + */ +#define UIP_FW_DROPPED 5 + + +#endif /* __UIP_FW_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-neighbor.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-neighbor.h new file mode 100644 index 0000000..aca096f --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-neighbor.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-neighbor.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \file + * Header file for database of link-local neighbors, used by + * IPv6 code and to be used by future ARP code. + * \author + * Adam Dunkels + */ + +#ifndef __UIP_NEIGHBOR_H__ +#define __UIP_NEIGHBOR_H__ + +#include "uip.h" + +struct uip_neighbor_addr { +#if UIP_NEIGHBOR_CONF_ADDRTYPE + UIP_NEIGHBOR_CONF_ADDRTYPE addr; +#else + struct uip_eth_addr addr; +#endif +}; + +void uip_neighbor_init(void); +void uip_neighbor_add(uip_ipaddr_t ipaddr, struct uip_neighbor_addr *addr); +void uip_neighbor_update(uip_ipaddr_t ipaddr); +struct uip_neighbor_addr *uip_neighbor_lookup(uip_ipaddr_t ipaddr); +void uip_neighbor_periodic(void); + +#endif /* __UIP-NEIGHBOR_H__ */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-split.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-split.c new file mode 100644 index 0000000..6828f3c --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-split.c @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: uip-split.c,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ +#include + +#include "uip-split.h" +#include "uip.h" +#include "uip-fw.h" +#include "uip_arch.h" + +#define BUF ( ( struct uip_tcpip_hdr * ) &uip_buf[UIP_LLH_LEN] ) + +/*-----------------------------------------------------------------------------*/ +void uip_split_output( void ) +{ + u16_t tcplen, len1, len2; + + /* We only try to split maximum sized TCP segments. */ + if( BUF->proto == UIP_PROTO_TCP && uip_len == UIP_BUFSIZE - UIP_LLH_LEN ) + { + tcplen = uip_len - UIP_TCPIP_HLEN; + + /* Split the segment in two. If the original packet length was + odd, we make the second packet one byte larger. */ + len1 = len2 = tcplen / 2; + if( len1 + len2 < tcplen ) + { + ++len2; + } + + /* Create the first packet. This is done by altering the length + field of the IP header and updating the checksums. */ + uip_len = len1 + UIP_TCPIP_HLEN; + #if UIP_CONF_IPV6 + + /* For IPv6, the IP length field does not include the IPv6 IP header + length. */ + BUF->len[0] = ( (uip_len - UIP_IPH_LEN) >> 8 ); + BUF->len[1] = ( (uip_len - UIP_IPH_LEN) & 0xff ); + #else /* UIP_CONF_IPV6 */ + BUF->len[0] = uip_len >> 8; + BUF->len[1] = uip_len & 0xff; + #endif /* UIP_CONF_IPV6 */ + + /* Recalculate the TCP checksum. */ + BUF->tcpchksum = 0; + BUF->tcpchksum = ~( uip_tcpchksum() ); + + #if !UIP_CONF_IPV6 + + /* Recalculate the IP checksum. */ + BUF->ipchksum = 0; + BUF->ipchksum = ~( uip_ipchksum() ); + #endif /* UIP_CONF_IPV6 */ + + /* Transmit the first packet. */ + + /* uip_fw_output();*/ + + // tcpip_output(); + + /* Now, create the second packet. To do this, it is not enough to + just alter the length field, but we must also update the TCP + sequence number and point the uip_appdata to a new place in + memory. This place is detemined by the length of the first + packet (len1). */ + uip_len = len2 + UIP_TCPIP_HLEN; + #if UIP_CONF_IPV6 + + /* For IPv6, the IP length field does not include the IPv6 IP header + length. */ + BUF->len[0] = ( (uip_len - UIP_IPH_LEN) >> 8 ); + BUF->len[1] = ( (uip_len - UIP_IPH_LEN) & 0xff ); + #else /* UIP_CONF_IPV6 */ + BUF->len[0] = uip_len >> 8; + BUF->len[1] = uip_len & 0xff; + #endif /* UIP_CONF_IPV6 */ + + /* uip_appdata += len1;*/ + memcpy( uip_appdata, ( u8_t * ) uip_appdata + len1, len2 ); + + uip_add32( BUF->seqno, len1 ); + BUF->seqno[0] = uip_acc32[0]; + BUF->seqno[1] = uip_acc32[1]; + BUF->seqno[2] = uip_acc32[2]; + BUF->seqno[3] = uip_acc32[3]; + + /* Recalculate the TCP checksum. */ + BUF->tcpchksum = 0; + BUF->tcpchksum = ~( uip_tcpchksum() ); + + #if !UIP_CONF_IPV6 + + /* Recalculate the IP checksum. */ + BUF->ipchksum = 0; + BUF->ipchksum = ~( uip_ipchksum() ); + #endif /* UIP_CONF_IPV6 */ + + /* Transmit the second packet. */ + + /* uip_fw_output();*/ + + // tcpip_output(); + } + else + { + /* uip_fw_output();*/ + + // tcpip_output(); + } +} + +/*-----------------------------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-split.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-split.h new file mode 100644 index 0000000..446e192 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip-split.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: uip-split.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ +/** + * \addtogroup uip + * @{ + */ + +/** + * \defgroup uipsplit uIP TCP throughput booster hack + * @{ + * + * The basic uIP TCP implementation only allows each TCP connection to + * have a single TCP segment in flight at any given time. Because of + * the delayed ACK algorithm employed by most TCP receivers, uIP's + * limit on the amount of in-flight TCP segments seriously reduces the + * maximum achievable throughput for sending data from uIP. + * + * The uip-split module is a hack which tries to remedy this + * situation. By splitting maximum sized outgoing TCP segments into + * two, the delayed ACK algorithm is not invoked at TCP + * receivers. This improves the throughput when sending data from uIP + * by orders of magnitude. + * + * The uip-split module uses the uip-fw module (uIP IP packet + * forwarding) for sending packets. Therefore, the uip-fw module must + * be set up with the appropriate network interfaces for this module + * to work. + */ + + +/** + * \file + * Module for splitting outbound TCP segments in two to avoid the + * delayed ACK throughput degradation. + * \author + * Adam Dunkels + * + */ + +#ifndef __UIP_SPLIT_H__ +#define __UIP_SPLIT_H__ + +/** + * Handle outgoing packets. + * + * This function inspects an outgoing packet in the uip_buf buffer and + * sends it out using the uip_fw_output() function. If the packet is a + * full-sized TCP segment it will be split into two segments and + * transmitted separately. This function should be called instead of + * the actual device driver output function, or the uip_fw_output() + * function. + * + * The headers of the outgoing packet is assumed to be in the uip_buf + * buffer and the payload is assumed to be wherever uip_appdata + * points. The length of the outgoing packet is assumed to be in the + * uip_len variable. + * + */ +void uip_split_output(void); + +#endif /* __UIP_SPLIT_H__ */ + +/** @} */ +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip.c new file mode 100644 index 0000000..1c07f35 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip.c @@ -0,0 +1,2233 @@ +#define DEBUG_PRINTF( ... ) /*printf(__VA_ARGS__)*/ + +/** + * \defgroup uip The uIP TCP/IP stack + * @{ + * + * uIP is an implementation of the TCP/IP protocol stack intended for + * small 8-bit and 16-bit microcontrollers. + * + * uIP provides the necessary protocols for Internet communication, + * with a very small code footprint and RAM requirements - the uIP + * code size is on the order of a few kilobytes and RAM usage is on + * the order of a few hundred bytes. + */ + +/** + * \file + * The uIP TCP/IP stack code. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip.c,v 1.65 2006/06/11 21:46:39 adam Exp $ + * + */ + +/* + * uIP is a small implementation of the IP, UDP and TCP protocols (as + * well as some basic ICMP stuff). The implementation couples the IP, + * UDP, TCP and the application layers very tightly. To keep the size + * of the compiled code down, this code frequently uses the goto + * statement. While it would be possible to break the uip_process() + * function into many smaller functions, this would increase the code + * size because of the overhead of parameter passing and the fact that + * the optimier would not be as efficient. + * + * The principle is that we have a small buffer, called the uip_buf, + * in which the device driver puts an incoming packet. The TCP/IP + * stack parses the headers in the packet, and calls the + * application. If the remote host has sent data to the application, + * this data is present in the uip_buf and the application read the + * data from there. It is up to the application to put this data into + * a byte stream if needed. The application will not be fed with data + * that is out of sequence. + * + * If the application whishes to send data to the peer, it should put + * its data into the uip_buf. The uip_appdata pointer points to the + * first available byte. The TCP/IP stack will calculate the + * checksums, and fill in the necessary header fields and finally send + * the packet back to the peer. +*/ +#include "uip.h" +#include "uipopt.h" +#include "uip_arch.h" +#include "uip_arp.h" +#include "FreeRTOS.h" + +#if UIP_CONF_IPV6 + #include "uip-neighbor.h" +#endif /* UIP_CONF_IPV6 */ + +#include + +/*---------------------------------------------------------------------------*/ + +/* Variable definitions. */ + +/* The IP address of this host. If it is defined to be fixed (by + setting UIP_FIXEDADDR to 1 in uipopt.h), the address is set + here. Otherwise, the address */ +#if UIP_FIXEDADDR > 0 +const uip_ipaddr_t uip_hostaddr = { HTONS( (UIP_IPADDR0 << 8) | UIP_IPADDR1 ), HTONS( (UIP_IPADDR2 << 8) | UIP_IPADDR3 ) }; +const uip_ipaddr_t uip_draddr = { HTONS( (UIP_DRIPADDR0 << 8) | UIP_DRIPADDR1 ), HTONS( (UIP_DRIPADDR2 << 8) | UIP_DRIPADDR3 ) }; +const uip_ipaddr_t uip_netmask = { HTONS( (UIP_NETMASK0 << 8) | UIP_NETMASK1 ), HTONS( (UIP_NETMASK2 << 8) | UIP_NETMASK3 ) }; +#else +uip_ipaddr_t uip_hostaddr, uip_draddr, uip_netmask; +#endif /* UIP_FIXEDADDR */ + +static const uip_ipaddr_t all_ones_addr = +#if UIP_CONF_IPV6 +{ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff }; +#else /* UIP_CONF_IPV6 */ +{ + 0xffff, 0xffff +}; +#endif /* UIP_CONF_IPV6 */ +static const uip_ipaddr_t all_zeroes_addr = +#if UIP_CONF_IPV6 +{ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; +#else /* UIP_CONF_IPV6 */ +{ + 0x0000, 0x0000 +}; +#endif /* UIP_CONF_IPV6 */ + +#if UIP_FIXEDETHADDR +const struct uip_eth_addr uip_ethaddr = { { UIP_ETHADDR0, UIP_ETHADDR1, UIP_ETHADDR2, UIP_ETHADDR3, UIP_ETHADDR4, UIP_ETHADDR5 } }; +#else +struct uip_eth_addr uip_ethaddr = { { 0, 0, 0, 0, 0, 0 } }; +#endif +#ifndef UIP_CONF_EXTERNAL_BUFFER + #ifdef __ICCARM__ + #pragma data_alignment = 4 +u8_t uip_buf[UIP_BUFSIZE + 2]; /* The packet buffer that contains incoming packets. */ + #else +u8_t uip_buf[UIP_BUFSIZE + 2] ALIGN_STRUCT_END; /* The packet buffer that contains incoming packets. */ + #endif +#endif /* UIP_CONF_EXTERNAL_BUFFER */ + +void *uip_appdata; /* The uip_appdata pointer points to + application data. */ +void *uip_sappdata; /* The uip_appdata pointer points to + the application data which is to + be sent. */ +#if UIP_URGDATA > 0 +void *uip_urgdata; /* The uip_urgdata pointer points to + urgent data (out-of-band data), if + present. */ +u16_t uip_urglen, uip_surglen; +#endif /* UIP_URGDATA > 0 */ + +u16_t uip_len, uip_slen; + +/* The uip_len is either 8 or 16 bits, + depending on the maximum packet + size. */ +u8_t uip_flags; /* The uip_flags variable is used for + communication between the TCP/IP stack + and the application program. */ +struct uip_conn *uip_conn; /* uip_conn always points to the current + connection. */ + +struct uip_conn uip_conns[UIP_CONNS]; + +/* The uip_conns array holds all TCP + connections. */ +u16_t uip_listenports[UIP_LISTENPORTS]; + +/* The uip_listenports list all currently + listning ports. */ +#if UIP_UDP +struct uip_udp_conn *uip_udp_conn; +struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS]; +#endif /* UIP_UDP */ + +static u16_t ipid; /* Ths ipid variable is an increasing + number that is used for the IP ID + field. */ + +void uip_setipid( u16_t id ) +{ + ipid = id; +} + +static u8_t iss[4]; /* The iss variable is used for the TCP + initial sequence number. */ + +#if UIP_ACTIVE_OPEN +static u16_t lastport; /* Keeps track of the last port used for + a new connection. */ +#endif /* UIP_ACTIVE_OPEN */ + +/* Temporary variables. */ +u8_t uip_acc32[4]; +static u8_t c, opt; +static u16_t tmp16; + +/* Structures and definitions. */ +#define TCP_FIN 0x01 +#define TCP_SYN 0x02 +#define TCP_RST 0x04 +#define TCP_PSH 0x08 +#define TCP_ACK 0x10 +#define TCP_URG 0x20 +#define TCP_CTL 0x3f + +#define TCP_OPT_END 0 /* End of TCP options list */ +#define TCP_OPT_NOOP 1 /* "No-operation" TCP option */ +#define TCP_OPT_MSS 2 /* Maximum segment size TCP option */ + +#define TCP_OPT_MSS_LEN 4 /* Length of TCP MSS option. */ + +#define ICMP_ECHO_REPLY 0 +#define ICMP_ECHO 8 + +#define ICMP6_ECHO_REPLY 129 +#define ICMP6_ECHO 128 +#define ICMP6_NEIGHBOR_SOLICITATION 135 +#define ICMP6_NEIGHBOR_ADVERTISEMENT 136 + +#define ICMP6_FLAG_S ( 1 << 6 ) +#define ICMP6_OPTION_SOURCE_LINK_ADDRESS 1 +#define ICMP6_OPTION_TARGET_LINK_ADDRESS 2 + +/* Macros. */ +#define BUF ( ( struct uip_tcpip_hdr * ) &uip_buf[UIP_LLH_LEN] ) +#define FBUF ( ( struct uip_tcpip_hdr * ) &uip_reassbuf[0] ) +#define ICMPBUF ( ( struct uip_icmpip_hdr * ) &uip_buf[UIP_LLH_LEN] ) +#define UDPBUF ( ( struct uip_udpip_hdr * ) &uip_buf[UIP_LLH_LEN] ) +#if UIP_STATISTICS == 1 +struct uip_stats uip_stat; + #define UIP_STAT( s ) s +#else + #define UIP_STAT( s ) +#endif /* UIP_STATISTICS == 1 */ + +#if UIP_LOGGING == 1 + #include +void uip_log( char *msg ); + #define UIP_LOG( m ) uip_log( m ) +#else + #define UIP_LOG( m ) +#endif /* UIP_LOGGING == 1 */ + +#if !UIP_ARCH_ADD32 +void uip_add32( u8_t *op32, u16_t op16 ) +{ + uip_acc32[3] = op32[3] + ( op16 & 0xff ); + uip_acc32[2] = op32[2] + ( op16 >> 8 ); + uip_acc32[1] = op32[1]; + uip_acc32[0] = op32[0]; + + if( uip_acc32[2] < (op16 >> 8) ) + { + ++uip_acc32[1]; + if( uip_acc32[1] == 0 ) + { + ++uip_acc32[0]; + } + } + + if( uip_acc32[3] < (op16 & 0xff) ) + { + ++uip_acc32[2]; + if( uip_acc32[2] == 0 ) + { + ++uip_acc32[1]; + if( uip_acc32[1] == 0 ) + { + ++uip_acc32[0]; + } + } + } +} + +#endif /* UIP_ARCH_ADD32 */ + +#if !UIP_ARCH_CHKSUM + +/*---------------------------------------------------------------------------*/ +static u16_t chksum( u16_t sum, const u8_t *data, u16_t len ) +{ + u16_t t; + const u8_t *dataptr; + const u8_t *last_byte; + + dataptr = data; + last_byte = data + len - 1; + + while( dataptr < last_byte ) + { /* At least two more bytes */ + t = ( dataptr[0] << 8 ) + dataptr[1]; + sum += t; + if( sum < t ) + { + sum++; /* carry */ + } + + dataptr += 2; + } + + if( dataptr == last_byte ) + { + t = ( dataptr[0] << 8 ) + 0; + sum += t; + if( sum < t ) + { + sum++; /* carry */ + } + } + + /* Return sum in host byte order. */ + return sum; +} + +/*---------------------------------------------------------------------------*/ +u16_t uip_chksum( u16_t *data, u16_t len ) +{ + return htons( chksum(0, ( u8_t * ) data, len) ); +} + +/*---------------------------------------------------------------------------*/ + #ifndef UIP_ARCH_IPCHKSUM +u16_t uip_ipchksum( void ) +{ + u16_t sum; + + sum = chksum( 0, &uip_buf[UIP_LLH_LEN], UIP_IPH_LEN ); + DEBUG_PRINTF( "uip_ipchksum: sum 0x%04x\n", sum ); + return( sum == 0 ) ? 0xffff : htons( sum ); +} + + #endif + +/*---------------------------------------------------------------------------*/ +static u16_t upper_layer_chksum( u8_t proto ) +{ + u16_t upper_layer_len; + u16_t sum; + + #if UIP_CONF_IPV6 + upper_layer_len = ( ((u16_t) (BUF->len[0]) << 8) + BUF->len[1] ); + #else /* UIP_CONF_IPV6 */ + upper_layer_len = ( ((u16_t) (BUF->len[0]) << 8) + BUF->len[1] ) - UIP_IPH_LEN; + #endif /* UIP_CONF_IPV6 */ + + /* First sum pseudoheader. */ + + /* IP protocol and length fields. This addition cannot carry. */ + sum = upper_layer_len + proto; + + /* Sum IP source and destination addresses. */ + sum = chksum( sum, ( u8_t * ) &BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t) ); + + /* Sum TCP header and data. */ + sum = chksum( sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], upper_layer_len ); + + return( sum == 0 ) ? 0xffff : htons( sum ); +} + +/*---------------------------------------------------------------------------*/ + #if UIP_CONF_IPV6 +u16_t uip_icmp6chksum( void ) +{ + return upper_layer_chksum( UIP_PROTO_ICMP6 ); +} + + #endif /* UIP_CONF_IPV6 */ + +/*---------------------------------------------------------------------------*/ +u16_t uip_tcpchksum( void ) +{ + return upper_layer_chksum( UIP_PROTO_TCP ); +} + +/*---------------------------------------------------------------------------*/ + #if UIP_UDP_CHECKSUMS +u16_t uip_udpchksum( void ) +{ + return upper_layer_chksum( UIP_PROTO_UDP ); +} + + #endif /* UIP_UDP_CHECKSUMS */ +#endif /* UIP_ARCH_CHKSUM */ + +/*---------------------------------------------------------------------------*/ +void uip_init( void ) +{ + for( c = 0; c < UIP_LISTENPORTS; ++c ) + { + uip_listenports[c] = 0; + } + + for( c = 0; c < UIP_CONNS; ++c ) + { + uip_conns[c].tcpstateflags = UIP_CLOSED; + } + + #if UIP_ACTIVE_OPEN + lastport = 1024; + #endif /* UIP_ACTIVE_OPEN */ + + #if UIP_UDP + for( c = 0; c < UIP_UDP_CONNS; ++c ) + { + uip_udp_conns[c].lport = 0; + } + + #endif /* UIP_UDP */ + + /* IPv4 initialization. */ + #if UIP_FIXEDADDR == 0 + + /* uip_hostaddr[0] = uip_hostaddr[1] = 0;*/ + #endif /* UIP_FIXEDADDR */ +} + +/*---------------------------------------------------------------------------*/ +#if UIP_ACTIVE_OPEN +struct uip_conn *uip_connect( uip_ipaddr_t *ripaddr, u16_t rport ) +{ + register struct uip_conn *conn, *cconn; + + /* Find an unused local port. */ +again: + ++lastport; + + if( lastport >= 32000 ) + { + lastport = 4096; + } + + /* Check if this port is already in use, and if so try to find + another one. */ + for( c = 0; c < UIP_CONNS; ++c ) + { + conn = &uip_conns[c]; + if( conn->tcpstateflags != UIP_CLOSED && conn->lport == htons(lastport) ) + { + goto again; + } + } + + conn = 0; + for( c = 0; c < UIP_CONNS; ++c ) + { + cconn = &uip_conns[c]; + if( cconn->tcpstateflags == UIP_CLOSED ) + { + conn = cconn; + break; + } + + if( cconn->tcpstateflags == UIP_TIME_WAIT ) + { + if( conn == 0 || cconn->timer > conn->timer ) + { + conn = cconn; + } + } + } + + if( conn == 0 ) + { + return 0; + } + + conn->tcpstateflags = UIP_SYN_SENT; + + conn->snd_nxt[0] = iss[0]; + conn->snd_nxt[1] = iss[1]; + conn->snd_nxt[2] = iss[2]; + conn->snd_nxt[3] = iss[3]; + + conn->initialmss = conn->mss = UIP_TCP_MSS; + + conn->len = 1; /* TCP length of the SYN is one. */ + conn->nrtx = 0; + conn->timer = 1; /* Send the SYN next time around. */ + conn->rto = UIP_RTO; + conn->sa = 0; + conn->sv = 16; /* Initial value of the RTT variance. */ + conn->lport = htons( lastport ); + conn->rport = rport; + uip_ipaddr_copy( &conn->ripaddr, ripaddr ); + + return conn; +} + +#endif /* UIP_ACTIVE_OPEN */ + +/*---------------------------------------------------------------------------*/ +#if UIP_UDP +struct uip_udp_conn *uip_udp_new( uip_ipaddr_t *ripaddr, u16_t rport ) +{ + register struct uip_udp_conn *conn; + + /* Find an unused local port. */ +again: + ++lastport; + + if( lastport >= 32000 ) + { + lastport = 4096; + } + + for( c = 0; c < UIP_UDP_CONNS; ++c ) + { + if( uip_udp_conns[c].lport == htons(lastport) ) + { + goto again; + } + } + + conn = 0; + for( c = 0; c < UIP_UDP_CONNS; ++c ) + { + if( uip_udp_conns[c].lport == 0 ) + { + conn = &uip_udp_conns[c]; + break; + } + } + + if( conn == 0 ) + { + return 0; + } + + conn->lport = HTONS( lastport ); + conn->rport = rport; + if( ripaddr == NULL ) + { + memset( conn->ripaddr, 0, sizeof(uip_ipaddr_t) ); + } + else + { + uip_ipaddr_copy( &conn->ripaddr, ripaddr ); + } + + conn->ttl = UIP_TTL; + + return conn; +} + +#endif /* UIP_UDP */ + +/*---------------------------------------------------------------------------*/ +void uip_unlisten( u16_t port ) +{ + for( c = 0; c < UIP_LISTENPORTS; ++c ) + { + if( uip_listenports[c] == port ) + { + uip_listenports[c] = 0; + return; + } + } +} + +/*---------------------------------------------------------------------------*/ +void uip_listen( u16_t port ) +{ + for( c = 0; c < UIP_LISTENPORTS; ++c ) + { + if( uip_listenports[c] == 0 ) + { + uip_listenports[c] = port; + return; + } + } +} + +/*---------------------------------------------------------------------------*/ + +/* XXX: IP fragment reassembly: not well-tested. */ +#if UIP_REASSEMBLY && !UIP_CONF_IPV6 + #define UIP_REASS_BUFSIZE ( UIP_BUFSIZE - UIP_LLH_LEN ) +static u8_t uip_reassbuf[UIP_REASS_BUFSIZE]; +static u8_t uip_reassbitmap[UIP_REASS_BUFSIZE / ( 8 * 8 )]; +static const u8_t bitmap_bits[8] = { 0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01 }; +static u16_t uip_reasslen; +static u8_t uip_reassflags; + #define UIP_REASS_FLAG_LASTFRAG 0x01 +static u8_t uip_reasstmr; + + #define IP_MF 0x20 + +static u8_t uip_reass( void ) +{ + u16_t offset, len; + u16_t i; + + /* If ip_reasstmr is zero, no packet is present in the buffer, so we + write the IP header of the fragment into the reassembly + buffer. The timer is updated with the maximum age. */ + if( uip_reasstmr == 0 ) + { + memcpy( uip_reassbuf, &BUF->vhl, UIP_IPH_LEN ); + uip_reasstmr = UIP_REASS_MAXAGE; + uip_reassflags = 0; + + /* Clear the bitmap. */ + memset( uip_reassbitmap, 0, sizeof(uip_reassbitmap) ); + } + + /* Check if the incoming fragment matches the one currently present + in the reasembly buffer. If so, we proceed with copying the + fragment into the buffer. */ + if + ( + BUF->srcipaddr[0] == FBUF->srcipaddr[0] && + BUF->srcipaddr[1] == FBUF->srcipaddr[1] && + BUF->destipaddr[0] == FBUF->destipaddr[0] && + BUF->destipaddr[1] == FBUF->destipaddr[1] && + BUF->ipid[0] == FBUF->ipid[0] && + BUF->ipid[1] == FBUF->ipid[1] + ) + { + len = ( BUF->len[0] << 8 ) + BUF->len[1] - ( BUF->vhl & 0x0f ) * 4; + offset = ( ((BUF->ipoffset[0] & 0x3f) << 8) + BUF->ipoffset[1] ) * 8; + + /* If the offset or the offset + fragment length overflows the + reassembly buffer, we discard the entire packet. */ + if( offset > UIP_REASS_BUFSIZE || offset + len > UIP_REASS_BUFSIZE ) + { + uip_reasstmr = 0; + goto nullreturn; + } + + /* Copy the fragment into the reassembly buffer, at the right + offset. */ + memcpy( &uip_reassbuf[UIP_IPH_LEN + offset], ( char * ) BUF + ( int ) ((BUF->vhl & 0x0f) * 4), len ); + + /* Update the bitmap. */ + if( offset / (8 * 8) == (offset + len) / (8 * 8) ) + { + /* If the two endpoints are in the same byte, we only update + that byte. */ + uip_reassbitmap[offset / ( 8 * 8 )] |= bitmap_bits[( offset / 8 ) & 7] &~bitmap_bits[( (offset + len) / 8 ) & 7]; + } + else + { + /* If the two endpoints are in different bytes, we update the + bytes in the endpoints and fill the stuff inbetween with + 0xff. */ + uip_reassbitmap[offset / ( 8 * 8 )] |= bitmap_bits[( offset / 8 ) & 7]; + for( i = 1 + offset / (8 * 8); i < (offset + len) / (8 * 8); ++i ) + { + uip_reassbitmap[i] = 0xff; + } + + uip_reassbitmap[( offset + len ) / ( 8 * 8 )] |= ~bitmap_bits[( (offset + len) / 8 ) & 7]; + } + + /* If this fragment has the More Fragments flag set to zero, we + know that this is the last fragment, so we can calculate the + size of the entire packet. We also set the + IP_REASS_FLAG_LASTFRAG flag to indicate that we have received + the final fragment. */ + if( (BUF->ipoffset[0] & IP_MF) == 0 ) + { + uip_reassflags |= UIP_REASS_FLAG_LASTFRAG; + uip_reasslen = offset + len; + } + + /* Finally, we check if we have a full packet in the buffer. We do + this by checking if we have the last fragment and if all bits + in the bitmap are set. */ + if( uip_reassflags & UIP_REASS_FLAG_LASTFRAG ) + { + /* Check all bytes up to and including all but the last byte in + the bitmap. */ + for( i = 0; i < uip_reasslen / (8 * 8) - 1; ++i ) + { + if( uip_reassbitmap[i] != 0xff ) + { + goto nullreturn; + } + } + + /* Check the last byte in the bitmap. It should contain just the + right amount of bits. */ + if( uip_reassbitmap[uip_reasslen / (8 * 8)] != (u8_t)~bitmap_bits[uip_reasslen / 8 & 7] ) + { + goto nullreturn; + } + + /* If we have come this far, we have a full packet in the + buffer, so we allocate a pbuf and copy the packet into it. We + also reset the timer. */ + uip_reasstmr = 0; + memcpy( BUF, FBUF, uip_reasslen ); + + /* Pretend to be a "normal" (i.e., not fragmented) IP packet + from now on. */ + BUF->ipoffset[0] = BUF->ipoffset[1] = 0; + BUF->len[0] = uip_reasslen >> 8; + BUF->len[1] = uip_reasslen & 0xff; + BUF->ipchksum = 0; + BUF->ipchksum = ~( uip_ipchksum() ); + + return uip_reasslen; + } + } + +nullreturn: + return 0; +} + +#endif /* UIP_REASSEMBLY */ + +/*---------------------------------------------------------------------------*/ +static void uip_add_rcv_nxt( u16_t n ) +{ + uip_add32( uip_conn->rcv_nxt, n ); + uip_conn->rcv_nxt[0] = uip_acc32[0]; + uip_conn->rcv_nxt[1] = uip_acc32[1]; + uip_conn->rcv_nxt[2] = uip_acc32[2]; + uip_conn->rcv_nxt[3] = uip_acc32[3]; +} + +/*---------------------------------------------------------------------------*/ +void uip_process( u8_t flag ) +{ + register struct uip_conn *uip_connr = uip_conn; + + #if UIP_UDP + if( flag == UIP_UDP_SEND_CONN ) + { + goto udp_send; + } + + #endif /* UIP_UDP */ + + uip_sappdata = uip_appdata = &uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN]; + + /* Check if we were invoked because of a poll request for a + particular connection. */ + if( flag == UIP_POLL_REQUEST ) + { + if( (uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED && !uip_outstanding(uip_connr) ) + { + uip_flags = UIP_POLL; + UIP_APPCALL(); + goto appsend; + } + + goto drop; + + /* Check if we were invoked because of the perodic timer fireing. */ + } + else if( flag == UIP_TIMER ) + { + #if UIP_REASSEMBLY + if( uip_reasstmr != 0 ) + { + --uip_reasstmr; + } + + #endif /* UIP_REASSEMBLY */ + + /* Increase the initial sequence number. */ + if( ++iss[3] == 0 ) + { + if( ++iss[2] == 0 ) + { + if( ++iss[1] == 0 ) + { + ++iss[0]; + } + } + } + + /* Reset the length variables. */ + uip_len = 0; + uip_slen = 0; + + /* Check if the connection is in a state in which we simply wait + for the connection to time out. If so, we increase the + connection's timer and remove the connection if it times + out. */ + if( uip_connr->tcpstateflags == UIP_TIME_WAIT || uip_connr->tcpstateflags == UIP_FIN_WAIT_2 ) + { + ++( uip_connr->timer ); + if( uip_connr->timer == UIP_TIME_WAIT_TIMEOUT ) + { + uip_connr->tcpstateflags = UIP_CLOSED; + } + } + else if( uip_connr->tcpstateflags != UIP_CLOSED ) + { + /* If the connection has outstanding data, we increase the + connection's timer and see if it has reached the RTO value + in which case we retransmit. */ + if( uip_outstanding(uip_connr) ) + { + uip_connr->timer = uip_connr->timer - 1; + if( uip_connr->timer == 0 ) + { + if + ( + uip_connr->nrtx == UIP_MAXRTX || + ( + (uip_connr->tcpstateflags == UIP_SYN_SENT || uip_connr->tcpstateflags == UIP_SYN_RCVD) && + uip_connr->nrtx == UIP_MAXSYNRTX + ) + ) + { + uip_connr->tcpstateflags = UIP_CLOSED; + + /* We call UIP_APPCALL() with uip_flags set to + UIP_TIMEDOUT to inform the application that the + connection has timed out. */ + uip_flags = UIP_TIMEDOUT; + UIP_APPCALL(); + + /* We also send a reset packet to the remote host. */ + BUF->flags = TCP_RST | TCP_ACK; + goto tcp_send_nodata; + } + + /* Exponential backoff. */ + uip_connr->timer = UIP_RTO << ( uip_connr->nrtx > 4 ? 4 : uip_connr->nrtx ); + ++( uip_connr->nrtx ); + + /* Ok, so we need to retransmit. We do this differently + depending on which state we are in. In ESTABLISHED, we + call upon the application so that it may prepare the + data for the retransmit. In SYN_RCVD, we resend the + SYNACK that we sent earlier and in LAST_ACK we have to + retransmit our FINACK. */ + UIP_STAT( ++uip_stat.tcp.rexmit ); + switch( uip_connr->tcpstateflags & UIP_TS_MASK ) + { + case UIP_SYN_RCVD: + /* In the SYN_RCVD state, we should retransmit our + SYNACK. */ + goto tcp_send_synack; + + #if UIP_ACTIVE_OPEN + + case UIP_SYN_SENT: + /* In the SYN_SENT state, we retransmit out SYN. */ + BUF->flags = 0; + goto tcp_send_syn; + #endif /* UIP_ACTIVE_OPEN */ + + case UIP_ESTABLISHED: + /* In the ESTABLISHED state, we call upon the application + to do the actual retransmit after which we jump into + the code for sending out the packet (the apprexmit + label). */ + uip_flags = UIP_REXMIT; + UIP_APPCALL(); + goto apprexmit; + + case UIP_FIN_WAIT_1: + case UIP_CLOSING: + case UIP_LAST_ACK: + /* In all these states we should retransmit a FINACK. */ + goto tcp_send_finack; + } + } + } + else if( (uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED ) + { + /* If there was no need for a retransmission, we poll the + application for new data. */ + uip_flags = UIP_POLL; + UIP_APPCALL(); + goto appsend; + } + } + + goto drop; + } + + #if UIP_UDP + if( flag == UIP_UDP_TIMER ) + { + if( uip_udp_conn->lport != 0 ) + { + uip_conn = NULL; + uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; + uip_len = uip_slen = 0; + uip_flags = UIP_POLL; + UIP_UDP_APPCALL(); + goto udp_send; + } + else + { + goto drop; + } + } + + #endif + + /* This is where the input processing starts. */ + UIP_STAT( ++uip_stat.ip.recv ); + + /* Start of IP input header processing code. */ + #if UIP_CONF_IPV6 + + /* Check validity of the IP header. */ + if( (BUF->vtc & 0xf0) != 0x60 ) + { /* IP version and header length. */ + UIP_STAT( ++uip_stat.ip.drop ); + UIP_STAT( ++uip_stat.ip.vhlerr ); + UIP_LOG( "ipv6: invalid version." ); + goto drop; + } + + #else /* UIP_CONF_IPV6 */ + + /* Check validity of the IP header. */ + if( BUF->vhl != 0x45 ) + { /* IP version and header length. */ + UIP_STAT( ++uip_stat.ip.drop ); + UIP_STAT( ++uip_stat.ip.vhlerr ); + UIP_LOG( "ip: invalid version or header length." ); + goto drop; + } + + #endif /* UIP_CONF_IPV6 */ + + /* Check the size of the packet. If the size reported to us in + uip_len is smaller the size reported in the IP header, we assume + that the packet has been corrupted in transit. If the size of + uip_len is larger than the size reported in the IP packet header, + the packet has been padded and we set uip_len to the correct + value.. */ + if( (BUF->len[0] << 8) + BUF->len[1] <= uip_len ) + { + uip_len = ( BUF->len[0] << 8 ) + BUF->len[1]; + #if UIP_CONF_IPV6 + uip_len += 40; /* The length reported in the IPv6 header is the + length of the payload that follows the + header. However, uIP uses the uip_len variable + for holding the size of the entire packet, + including the IP header. For IPv4 this is not a + problem as the length field in the IPv4 header + contains the length of the entire packet. But + for IPv6 we need to add the size of the IPv6 + header (40 bytes). */ + #endif /* UIP_CONF_IPV6 */ + } + else + { + UIP_LOG( "ip: packet shorter than reported in IP header." ); + goto drop; + } + + #if !UIP_CONF_IPV6 + + /* Check the fragment flag. */ + if( (BUF->ipoffset[0] & 0x3f) != 0 || BUF->ipoffset[1] != 0 ) + { + #if UIP_REASSEMBLY + uip_len = uip_reass(); + if( uip_len == 0 ) + { + goto drop; + } + + #else /* UIP_REASSEMBLY */ + UIP_STAT( ++uip_stat.ip.drop ); + UIP_STAT( ++uip_stat.ip.fragerr ); + UIP_LOG( "ip: fragment dropped." ); + goto drop; + #endif /* UIP_REASSEMBLY */ + } + + #endif /* UIP_CONF_IPV6 */ + + if( uip_ipaddr_cmp(uip_hostaddr, all_zeroes_addr) ) + { + /* If we are configured to use ping IP address configuration and + hasn't been assigned an IP address yet, we accept all ICMP + packets. */ + #if UIP_PINGADDRCONF && !UIP_CONF_IPV6 + if( BUF->proto == UIP_PROTO_ICMP ) + { + UIP_LOG( "ip: possible ping config packet received." ); + goto icmp_input; + } + else + { + UIP_LOG( "ip: packet dropped since no address assigned." ); + goto drop; + } + + #endif /* UIP_PINGADDRCONF */ + } + else + { + /* If IP broadcast support is configured, we check for a broadcast + UDP packet, which may be destined to us. */ + #if UIP_BROADCAST + DEBUG_PRINTF( "UDP IP checksum 0x%04x\n", uip_ipchksum() ); + if( BUF->proto == UIP_PROTO_UDP && uip_ipaddr_cmp(BUF->destipaddr, all_ones_addr) /*&& + uip_ipchksum() == 0xffff*/ ) + { + goto udp_input; + } + + #endif /* UIP_BROADCAST */ + + /* Check if the packet is destined for our IP address. */ + #if !UIP_CONF_IPV6 + if( !uip_ipaddr_cmp(BUF->destipaddr, uip_hostaddr) ) + { + UIP_STAT( ++uip_stat.ip.drop ); + goto drop; + } + + #else /* UIP_CONF_IPV6 */ + + /* For IPv6, packet reception is a little trickier as we need to + make sure that we listen to certain multicast addresses (all + hosts multicast address, and the solicited-node multicast + address) as well. However, we will cheat here and accept all + multicast packets that are sent to the ff02::/16 addresses. */ + if( !uip_ipaddr_cmp(BUF->destipaddr, uip_hostaddr) && BUF->destipaddr[0] != HTONS(0xff02) ) + { + UIP_STAT( ++uip_stat.ip.drop ); + goto drop; + } + + #endif /* UIP_CONF_IPV6 */ + } + + #if !UIP_CONF_IPV6 + if( uip_ipchksum() != 0xffff ) + { /* Compute and check the IP header + checksum. */ + UIP_STAT( ++uip_stat.ip.drop ); + UIP_STAT( ++uip_stat.ip.chkerr ); + UIP_LOG( "ip: bad checksum." ); + goto drop; + } + + #endif /* UIP_CONF_IPV6 */ + + if( BUF->proto == UIP_PROTO_TCP ) + { /* Check for TCP packet. If so, + proceed with TCP input + processing. */ + goto tcp_input; + } + + #if UIP_UDP + if( BUF->proto == UIP_PROTO_UDP ) + { + goto udp_input; + } + + #endif /* UIP_UDP */ + + #if !UIP_CONF_IPV6 + + /* ICMPv4 processing code follows. */ + if( BUF->proto != UIP_PROTO_ICMP ) + { /* We only allow ICMP packets from + here. */ + UIP_STAT( ++uip_stat.ip.drop ); + UIP_STAT( ++uip_stat.ip.protoerr ); + UIP_LOG( "ip: neither tcp nor icmp." ); + goto drop; + } + + #if UIP_PINGADDRCONF + icmp_input : + #endif /* UIP_PINGADDRCONF */ + UIP_STAT( ++uip_stat.icmp.recv ); + + /* ICMP echo (i.e., ping) processing. This is simple, we only change + the ICMP type from ECHO to ECHO_REPLY and adjust the ICMP + checksum before we return the packet. */ + if( ICMPBUF->type != ICMP_ECHO ) + { + UIP_STAT( ++uip_stat.icmp.drop ); + UIP_STAT( ++uip_stat.icmp.typeerr ); + UIP_LOG( "icmp: not icmp echo." ); + goto drop; + } + + /* If we are configured to use ping IP address assignment, we use + the destination IP address of this ping packet and assign it to + ourself. */ + #if UIP_PINGADDRCONF + if( (uip_hostaddr[0] | uip_hostaddr[1]) == 0 ) + { + uip_hostaddr[0] = BUF->destipaddr[0]; + uip_hostaddr[1] = BUF->destipaddr[1]; + } + + #endif /* UIP_PINGADDRCONF */ + + ICMPBUF->type = ICMP_ECHO_REPLY; + + if( ICMPBUF->icmpchksum >= HTONS(0xffff - (ICMP_ECHO << 8)) ) + { + ICMPBUF->icmpchksum += HTONS( ICMP_ECHO << 8 ) + 1; + } + else + { + ICMPBUF->icmpchksum += HTONS( ICMP_ECHO << 8 ); + } + + /* Swap IP addresses. */ + uip_ipaddr_copy( BUF->destipaddr, BUF->srcipaddr ); + uip_ipaddr_copy( BUF->srcipaddr, uip_hostaddr ); + + UIP_STAT( ++uip_stat.icmp.sent ); + goto send; + + /* End of IPv4 input header processing code. */ + #else /* !UIP_CONF_IPV6 */ + + /* This is IPv6 ICMPv6 processing code. */ + DEBUG_PRINTF( "icmp6_input: length %d\n", uip_len ); + + if( BUF->proto != UIP_PROTO_ICMP6 ) + { /* We only allow ICMPv6 packets from + here. */ + UIP_STAT( ++uip_stat.ip.drop ); + UIP_STAT( ++uip_stat.ip.protoerr ); + UIP_LOG( "ip: neither tcp nor icmp6." ); + goto drop; + } + + UIP_STAT( ++uip_stat.icmp.recv ); + + /* If we get a neighbor solicitation for our address we should send + a neighbor advertisement message back. */ + if( ICMPBUF->type == ICMP6_NEIGHBOR_SOLICITATION ) + { + if( uip_ipaddr_cmp(ICMPBUF->icmp6data, uip_hostaddr) ) + { + if( ICMPBUF->options[0] == ICMP6_OPTION_SOURCE_LINK_ADDRESS ) + { + /* Save the sender's address in our neighbor list. */ + uip_neighbor_add( ICMPBUF->srcipaddr, &(ICMPBUF->options[2]) ); + } + + /* We should now send a neighbor advertisement back to where the + neighbor solicication came from. */ + ICMPBUF->type = ICMP6_NEIGHBOR_ADVERTISEMENT; + ICMPBUF->flags = ICMP6_FLAG_S; /* Solicited flag. */ + + ICMPBUF->reserved1 = ICMPBUF->reserved2 = ICMPBUF->reserved3 = 0; + + uip_ipaddr_copy( ICMPBUF->destipaddr, ICMPBUF->srcipaddr ); + uip_ipaddr_copy( ICMPBUF->srcipaddr, uip_hostaddr ); + ICMPBUF->options[0] = ICMP6_OPTION_TARGET_LINK_ADDRESS; + ICMPBUF->options[1] = 1; /* Options length, 1 = 8 bytes. */ + memcpy( &(ICMPBUF->options[2]), &uip_ethaddr, sizeof(uip_ethaddr) ); + ICMPBUF->icmpchksum = 0; + ICMPBUF->icmpchksum = ~uip_icmp6chksum(); + goto send; + } + + goto drop; + } + else if( ICMPBUF->type == ICMP6_ECHO ) + { + /* ICMP echo (i.e., ping) processing. This is simple, we only + change the ICMP type from ECHO to ECHO_REPLY and update the + ICMP checksum before we return the packet. */ + ICMPBUF->type = ICMP6_ECHO_REPLY; + + uip_ipaddr_copy( BUF->destipaddr, BUF->srcipaddr ); + uip_ipaddr_copy( BUF->srcipaddr, uip_hostaddr ); + ICMPBUF->icmpchksum = 0; + ICMPBUF->icmpchksum = ~uip_icmp6chksum(); + + UIP_STAT( ++uip_stat.icmp.sent ); + goto send; + } + else + { + DEBUG_PRINTF( "Unknown icmp6 message type %d\n", ICMPBUF->type ); + UIP_STAT( ++uip_stat.icmp.drop ); + UIP_STAT( ++uip_stat.icmp.typeerr ); + UIP_LOG( "icmp: unknown ICMP message." ); + goto drop; + } + + /* End of IPv6 ICMP processing. */ + #endif /* !UIP_CONF_IPV6 */ + + #if UIP_UDP + + /* UDP input processing. */ + udp_input : + /* UDP processing is really just a hack. We don't do anything to the + UDP/IP headers, but let the UDP application do all the hard + work. If the application sets uip_slen, it has a packet to + send. */ + #if UIP_UDP_CHECKSUMS + uip_len = uip_len - UIP_IPUDPH_LEN; + uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; + if( UDPBUF->udpchksum != 0 && uip_udpchksum() != 0xffff ) + { + UIP_STAT( ++uip_stat.udp.drop ); + UIP_STAT( ++uip_stat.udp.chkerr ); + UIP_LOG( "udp: bad checksum." ); + goto drop; + } + + #else /* UIP_UDP_CHECKSUMS */ + uip_len = uip_len - UIP_IPUDPH_LEN; + #endif /* UIP_UDP_CHECKSUMS */ + + /* Demultiplex this UDP packet between the UDP "connections". */ + for( uip_udp_conn = &uip_udp_conns[0]; uip_udp_conn < &uip_udp_conns[UIP_UDP_CONNS]; ++uip_udp_conn ) + { + /* If the local UDP port is non-zero, the connection is considered + to be used. If so, the local port number is checked against the + destination port number in the received packet. If the two port + numbers match, the remote port number is checked if the + connection is bound to a remote port. Finally, if the + connection is bound to a remote IP address, the source IP + address of the packet is checked. */ + if + ( + uip_udp_conn->lport != 0 && + UDPBUF->destport == uip_udp_conn->lport && + (uip_udp_conn->rport == 0 || UDPBUF->srcport == uip_udp_conn->rport) && + ( + uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_zeroes_addr) || + uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_ones_addr) || + uip_ipaddr_cmp(BUF->srcipaddr, uip_udp_conn->ripaddr) + ) + ) + { + goto udp_found; + } + } + + UIP_LOG( "udp: no matching connection found" ); + goto drop; + +udp_found: + UIP_STAT( ++uip_stat.udp.recv ); + uip_conn = NULL; + uip_flags = UIP_NEWDATA; + uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; + uip_slen = 0; + UIP_UDP_APPCALL(); +udp_send: + if( uip_slen == 0 ) + { + goto drop; + } + + uip_len = uip_slen + UIP_IPUDPH_LEN; + + #if UIP_CONF_IPV6 + + /* For IPv6, the IP length field does not include the IPv6 IP header + length. */ + BUF->len[0] = ( (uip_len - UIP_IPH_LEN) >> 8 ); + BUF->len[1] = ( (uip_len - UIP_IPH_LEN) & 0xff ); + #else /* UIP_CONF_IPV6 */ + BUF->len[0] = ( uip_len >> 8 ); + BUF->len[1] = ( uip_len & 0xff ); + #endif /* UIP_CONF_IPV6 */ + + BUF->ttl = uip_udp_conn->ttl; + BUF->proto = UIP_PROTO_UDP; + + UDPBUF->udplen = HTONS( uip_slen + UIP_UDPH_LEN ); + UDPBUF->udpchksum = 0; + + BUF->srcport = uip_udp_conn->lport; + BUF->destport = uip_udp_conn->rport; + + uip_ipaddr_copy( BUF->srcipaddr, uip_hostaddr ); + uip_ipaddr_copy( BUF->destipaddr, uip_udp_conn->ripaddr ); + + uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPTCPH_LEN]; + + #if UIP_UDP_CHECKSUMS + + /* Calculate UDP checksum. */ + UDPBUF->udpchksum = ~( uip_udpchksum() ); + if( UDPBUF->udpchksum == 0 ) + { + UDPBUF->udpchksum = 0xffff; + } + + #endif /* UIP_UDP_CHECKSUMS */ + UIP_STAT( ++uip_stat.udp.sent ); + goto ip_send_nolen; + #endif /* UIP_UDP */ + + /* TCP input processing. */ + tcp_input : UIP_STAT( ++uip_stat.tcp.recv ); + + /* Start of TCP input header processing code. */ + if( uip_tcpchksum() != 0xffff ) + { /* Compute and check the TCP + checksum. */ + UIP_STAT( ++uip_stat.tcp.drop ); + UIP_STAT( ++uip_stat.tcp.chkerr ); + UIP_LOG( "tcp: bad checksum." ); + goto drop; + } + + /* Demultiplex this segment. */ + + /* First check any active connections. */ + for( uip_connr = &uip_conns[0]; uip_connr <= &uip_conns[UIP_CONNS - 1]; ++uip_connr ) + { + if + ( + uip_connr->tcpstateflags != UIP_CLOSED && + BUF->destport == uip_connr->lport && + BUF->srcport == uip_connr->rport && + uip_ipaddr_cmp(BUF->srcipaddr, uip_connr->ripaddr) + ) + { + goto found; + } + } + + /* If we didn't find and active connection that expected the packet, + either this packet is an old duplicate, or this is a SYN packet + destined for a connection in LISTEN. If the SYN flag isn't set, + it is an old packet and we send a RST. */ + if( (BUF->flags & TCP_CTL) != TCP_SYN ) + { + goto reset; + } + + tmp16 = BUF->destport; + + /* Next, check listening connections. */ + for( c = 0; c < UIP_LISTENPORTS; ++c ) + { + if( tmp16 == uip_listenports[c] ) + { + goto found_listen; + } + } + + /* No matching connection found, so we send a RST packet. */ + UIP_STAT( ++uip_stat.tcp.synrst ); +reset: + /* We do not send resets in response to resets. */ + if( BUF->flags & TCP_RST ) + { + goto drop; + } + + UIP_STAT( ++uip_stat.tcp.rst ); + + BUF->flags = TCP_RST | TCP_ACK; + uip_len = UIP_IPTCPH_LEN; + BUF->tcpoffset = 5 << 4; + + /* Flip the seqno and ackno fields in the TCP header. */ + c = BUF->seqno[3]; + BUF->seqno[3] = BUF->ackno[3]; + BUF->ackno[3] = c; + + c = BUF->seqno[2]; + BUF->seqno[2] = BUF->ackno[2]; + BUF->ackno[2] = c; + + c = BUF->seqno[1]; + BUF->seqno[1] = BUF->ackno[1]; + BUF->ackno[1] = c; + + c = BUF->seqno[0]; + BUF->seqno[0] = BUF->ackno[0]; + BUF->ackno[0] = c; + + /* We also have to increase the sequence number we are + acknowledging. If the least significant byte overflowed, we need + to propagate the carry to the other bytes as well. */ + if( ++BUF->ackno[3] == 0 ) + { + if( ++BUF->ackno[2] == 0 ) + { + if( ++BUF->ackno[1] == 0 ) + { + ++BUF->ackno[0]; + } + } + } + + /* Swap port numbers. */ + tmp16 = BUF->srcport; + BUF->srcport = BUF->destport; + BUF->destport = tmp16; + + /* Swap IP addresses. */ + uip_ipaddr_copy( BUF->destipaddr, BUF->srcipaddr ); + uip_ipaddr_copy( BUF->srcipaddr, uip_hostaddr ); + + /* And send out the RST packet! */ + goto tcp_send_noconn; + + /* This label will be jumped to if we matched the incoming packet + with a connection in LISTEN. In that case, we should create a new + connection and send a SYNACK in return. */ +found_listen: + /* First we check if there are any connections avaliable. Unused + connections are kept in the same table as used connections, but + unused ones have the tcpstate set to CLOSED. Also, connections in + TIME_WAIT are kept track of and we'll use the oldest one if no + CLOSED connections are found. Thanks to Eddie C. Dost for a very + nice algorithm for the TIME_WAIT search. */ + uip_connr = 0; + for( c = 0; c < UIP_CONNS; ++c ) + { + if( uip_conns[c].tcpstateflags == UIP_CLOSED ) + { + uip_connr = &uip_conns[c]; + break; + } + + if( uip_conns[c].tcpstateflags == UIP_TIME_WAIT ) + { + if( uip_connr == 0 || uip_conns[c].timer > uip_connr->timer ) + { + uip_connr = &uip_conns[c]; + } + } + } + + if( uip_connr == 0 ) + { + /* All connections are used already, we drop packet and hope that + the remote end will retransmit the packet at a time when we + have more spare connections. */ + UIP_STAT( ++uip_stat.tcp.syndrop ); + UIP_LOG( "tcp: found no unused connections." ); + goto drop; + } + + uip_conn = uip_connr; + + /* Fill in the necessary fields for the new connection. */ + uip_connr->rto = uip_connr->timer = UIP_RTO; + uip_connr->sa = 0; + uip_connr->sv = 4; + uip_connr->nrtx = 0; + uip_connr->lport = BUF->destport; + uip_connr->rport = BUF->srcport; + uip_ipaddr_copy( uip_connr->ripaddr, BUF->srcipaddr ); + uip_connr->tcpstateflags = UIP_SYN_RCVD; + + uip_connr->snd_nxt[0] = iss[0]; + uip_connr->snd_nxt[1] = iss[1]; + uip_connr->snd_nxt[2] = iss[2]; + uip_connr->snd_nxt[3] = iss[3]; + uip_connr->len = 1; + + /* rcv_nxt should be the seqno from the incoming packet + 1. */ + uip_connr->rcv_nxt[3] = BUF->seqno[3]; + uip_connr->rcv_nxt[2] = BUF->seqno[2]; + uip_connr->rcv_nxt[1] = BUF->seqno[1]; + uip_connr->rcv_nxt[0] = BUF->seqno[0]; + uip_add_rcv_nxt( 1 ); + + /* Parse the TCP MSS option, if present. */ + if( (BUF->tcpoffset & 0xf0) > 0x50 ) + { + for( c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2; ) + { + opt = uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + c]; + if( opt == TCP_OPT_END ) + { + /* End of options. */ + break; + } + else if( opt == TCP_OPT_NOOP ) + { + ++c; + + /* NOP option. */ + } + else if( opt == TCP_OPT_MSS && uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN ) + { + /* An MSS option with the right option length. */ + tmp16 = ( (u16_t) uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8 ) | ( u16_t ) uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + 3 + c]; + uip_connr->initialmss = uip_connr->mss = tmp16 > UIP_TCP_MSS ? UIP_TCP_MSS : tmp16; + + /* And we are done processing options. */ + break; + } + else + { + /* All other options have a length field, so that we easily + can skip past them. */ + if( uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0 ) + { + /* If the length field is zero, the options are malformed + and we don't process them further. */ + break; + } + + c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c]; + } + } + } + + /* Our response will be a SYNACK. */ + #if UIP_ACTIVE_OPEN + tcp_send_synack : BUF->flags = TCP_ACK; + +tcp_send_syn: + BUF->flags |= TCP_SYN; + #else /* UIP_ACTIVE_OPEN */ + tcp_send_synack : BUF->flags = TCP_SYN | TCP_ACK; + #endif /* UIP_ACTIVE_OPEN */ + + /* We send out the TCP Maximum Segment Size option with our + SYNACK. */ + BUF->optdata[0] = TCP_OPT_MSS; + BUF->optdata[1] = TCP_OPT_MSS_LEN; + BUF->optdata[2] = ( UIP_TCP_MSS ) / 256; + BUF->optdata[3] = ( UIP_TCP_MSS ) & 255; + uip_len = UIP_IPTCPH_LEN + TCP_OPT_MSS_LEN; + BUF->tcpoffset = ( (UIP_TCPH_LEN + TCP_OPT_MSS_LEN) / 4 ) << 4; + goto tcp_send; + + /* This label will be jumped to if we found an active connection. */ +found: + uip_conn = uip_connr; + uip_flags = 0; + + /* We do a very naive form of TCP reset processing; we just accept + any RST and kill our connection. We should in fact check if the + sequence number of this reset is wihtin our advertised window + before we accept the reset. */ + if( BUF->flags & TCP_RST ) + { + uip_connr->tcpstateflags = UIP_CLOSED; + UIP_LOG( "tcp: got reset, aborting connection." ); + uip_flags = UIP_ABORT; + UIP_APPCALL(); + goto drop; + } + + /* Calculated the length of the data, if the application has sent + any data to us. */ + c = ( BUF->tcpoffset >> 4 ) << 2; + + /* uip_len will contain the length of the actual TCP data. This is + calculated by subtracing the length of the TCP header (in + c) and the length of the IP header (20 bytes). */ + uip_len = uip_len - c - UIP_IPH_LEN; + + /* First, check if the sequence number of the incoming packet is + what we're expecting next. If not, we send out an ACK with the + correct numbers in. */ + if( !(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) && ((BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK))) ) + { + if + ( + (uip_len > 0 || ((BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) && + ( + BUF->seqno[0] != uip_connr->rcv_nxt[0] || + BUF->seqno[1] != uip_connr->rcv_nxt[1] || + BUF->seqno[2] != uip_connr->rcv_nxt[2] || + BUF->seqno[3] != uip_connr->rcv_nxt[3] + ) + ) + { + goto tcp_send_ack; + } + } + + /* Next, check if the incoming segment acknowledges any outstanding + data. If so, we update the sequence number, reset the length of + the outstanding data, calculate RTT estimations, and reset the + retransmission timer. */ + if( (BUF->flags & TCP_ACK) && uip_outstanding(uip_connr) ) + { + uip_add32( uip_connr->snd_nxt, uip_connr->len ); + + if + ( + BUF->ackno[0] == uip_acc32[0] && + BUF->ackno[1] == uip_acc32[1] && + BUF->ackno[2] == uip_acc32[2] && + BUF->ackno[3] == uip_acc32[3] + ) + { + /* Update sequence number. */ + uip_connr->snd_nxt[0] = uip_acc32[0]; + uip_connr->snd_nxt[1] = uip_acc32[1]; + uip_connr->snd_nxt[2] = uip_acc32[2]; + uip_connr->snd_nxt[3] = uip_acc32[3]; + + /* Do RTT estimation, unless we have done retransmissions. */ + if( uip_connr->nrtx == 0 ) + { + signed char m; + m = uip_connr->rto - uip_connr->timer; + + /* This is taken directly from VJs original code in his paper */ + m = m - ( uip_connr->sa >> 3 ); + uip_connr->sa += m; + if( m < 0 ) + { + m = -m; + } + + m = m - ( uip_connr->sv >> 2 ); + uip_connr->sv += m; + uip_connr->rto = ( uip_connr->sa >> 3 ) + uip_connr->sv; + } + + /* Set the acknowledged flag. */ + uip_flags = UIP_ACKDATA; + + /* Reset the retransmission timer. */ + uip_connr->timer = uip_connr->rto; + + /* Reset length of outstanding data. */ + uip_connr->len = 0; + } + } + + /* Do different things depending on in what state the connection is. */ + switch( uip_connr->tcpstateflags & UIP_TS_MASK ) + { + /* CLOSED and LISTEN are not handled here. CLOSE_WAIT is not + implemented, since we force the application to close when the + peer sends a FIN (hence the application goes directly from + ESTABLISHED to LAST_ACK). */ + case UIP_SYN_RCVD: + /* In SYN_RCVD we have sent out a SYNACK in response to a SYN, and + we are waiting for an ACK that acknowledges the data we sent + out the last time. Therefore, we want to have the UIP_ACKDATA + flag set. If so, we enter the ESTABLISHED state. */ + if( uip_flags & UIP_ACKDATA ) + { + uip_connr->tcpstateflags = UIP_ESTABLISHED; + uip_flags = UIP_CONNECTED; + uip_connr->len = 0; + if( uip_len > 0 ) + { + uip_flags |= UIP_NEWDATA; + uip_add_rcv_nxt( uip_len ); + } + + uip_slen = 0; + UIP_APPCALL(); + goto appsend; + } + + goto drop; + #if UIP_ACTIVE_OPEN + + case UIP_SYN_SENT: + /* In SYN_SENT, we wait for a SYNACK that is sent in response to + our SYN. The rcv_nxt is set to sequence number in the SYNACK + plus one, and we send an ACK. We move into the ESTABLISHED + state. */ + if( (uip_flags & UIP_ACKDATA) && (BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK) ) + { + /* Parse the TCP MSS option, if present. */ + if( (BUF->tcpoffset & 0xf0) > 0x50 ) + { + for( c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2; ) + { + opt = uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + c]; + if( opt == TCP_OPT_END ) + { + /* End of options. */ + break; + } + else if( opt == TCP_OPT_NOOP ) + { + ++c; + + /* NOP option. */ + } + else if( opt == TCP_OPT_MSS && uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN ) + { + /* An MSS option with the right option length. */ + tmp16 = ( uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8 ) | uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 3 + c]; + uip_connr->initialmss = uip_connr->mss = tmp16 > UIP_TCP_MSS ? UIP_TCP_MSS : tmp16; + + /* And we are done processing options. */ + break; + } + else + { + /* All other options have a length field, so that we easily + can skip past them. */ + if( uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0 ) + { + /* If the length field is zero, the options are malformed + and we don't process them further. */ + break; + } + + c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c]; + } + } + } + + uip_connr->tcpstateflags = UIP_ESTABLISHED; + uip_connr->rcv_nxt[0] = BUF->seqno[0]; + uip_connr->rcv_nxt[1] = BUF->seqno[1]; + uip_connr->rcv_nxt[2] = BUF->seqno[2]; + uip_connr->rcv_nxt[3] = BUF->seqno[3]; + uip_add_rcv_nxt( 1 ); + uip_flags = UIP_CONNECTED | UIP_NEWDATA; + uip_connr->len = 0; + uip_len = 0; + uip_slen = 0; + UIP_APPCALL(); + goto appsend; + } + + /* Inform the application that the connection failed */ + uip_flags = UIP_ABORT; + UIP_APPCALL(); + + /* The connection is closed after we send the RST */ + uip_conn->tcpstateflags = UIP_CLOSED; + goto reset; + #endif /* UIP_ACTIVE_OPEN */ + + case UIP_ESTABLISHED: + /* In the ESTABLISHED state, we call upon the application to feed + data into the uip_buf. If the UIP_ACKDATA flag is set, the + application should put new data into the buffer, otherwise we are + retransmitting an old segment, and the application should put that + data into the buffer. + + If the incoming packet is a FIN, we should close the connection on + this side as well, and we send out a FIN and enter the LAST_ACK + state. We require that there is no outstanding data; otherwise the + sequence numbers will be screwed up. */ + if( BUF->flags & TCP_FIN && !(uip_connr->tcpstateflags & UIP_STOPPED) ) + { + if( uip_outstanding(uip_connr) ) + { + goto drop; + } + + uip_add_rcv_nxt( 1 + uip_len ); + uip_flags |= UIP_CLOSE; + if( uip_len > 0 ) + { + uip_flags |= UIP_NEWDATA; + } + + UIP_APPCALL(); + uip_connr->len = 1; + uip_connr->tcpstateflags = UIP_LAST_ACK; + uip_connr->nrtx = 0; + tcp_send_finack: + BUF->flags = TCP_FIN | TCP_ACK; + goto tcp_send_nodata; + } + + /* Check the URG flag. If this is set, the segment carries urgent + data that we must pass to the application. */ + if( (BUF->flags & TCP_URG) != 0 ) + { + #if UIP_URGDATA > 0 + uip_urglen = ( BUF->urgp[0] << 8 ) | BUF->urgp[1]; + if( uip_urglen > uip_len ) + { + /* There is more urgent data in the next segment to come. */ + uip_urglen = uip_len; + } + + uip_add_rcv_nxt( uip_urglen ); + uip_len -= uip_urglen; + uip_urgdata = uip_appdata; + uip_appdata += uip_urglen; + } + else + { + uip_urglen = 0; + #else /* UIP_URGDATA > 0 */ + uip_appdata = ( ( char * ) uip_appdata ) + ( (BUF->urgp[0] << 8) | BUF->urgp[1] ); + uip_len -= ( BUF->urgp[0] << 8 ) | BUF->urgp[1]; + #endif /* UIP_URGDATA > 0 */ + } + + /* If uip_len > 0 we have TCP data in the packet, and we flag this + by setting the UIP_NEWDATA flag and update the sequence number + we acknowledge. If the application has stopped the dataflow + using uip_stop(), we must not accept any data packets from the + remote host. */ + if( uip_len > 0 && !(uip_connr->tcpstateflags & UIP_STOPPED) ) + { + uip_flags |= UIP_NEWDATA; + uip_add_rcv_nxt( uip_len ); + } + + /* Check if the available buffer space advertised by the other end + is smaller than the initial MSS for this connection. If so, we + set the current MSS to the window size to ensure that the + application does not send more data than the other end can + handle. + + If the remote host advertises a zero window, we set the MSS to + the initial MSS so that the application will send an entire MSS + of data. This data will not be acknowledged by the receiver, + and the application will retransmit it. This is called the + "persistent timer" and uses the retransmission mechanim. + */ + tmp16 = ( (u16_t) BUF->wnd[0] << 8 ) + ( u16_t ) BUF->wnd[1]; + if( tmp16 > (uip_connr->initialmss * FRAME_MULTIPLE) || tmp16 == 0 ) + { + tmp16 = uip_connr->initialmss * FRAME_MULTIPLE; + } + + uip_connr->mss = tmp16; + + /* If this packet constitutes an ACK for outstanding data (flagged + by the UIP_ACKDATA flag, we should call the application since it + might want to send more data. If the incoming packet had data + from the peer (as flagged by the UIP_NEWDATA flag), the + application must also be notified. + + When the application is called, the global variable uip_len + contains the length of the incoming data. The application can + access the incoming data through the global pointer + uip_appdata, which usually points UIP_IPTCPH_LEN + UIP_LLH_LEN + bytes into the uip_buf array. + + If the application wishes to send any data, this data should be + put into the uip_appdata and the length of the data should be + put into uip_len. If the application don't have any data to + send, uip_len must be set to 0. */ + if( uip_flags & (UIP_NEWDATA | UIP_ACKDATA) ) + { + uip_slen = 0; + UIP_APPCALL(); + + appsend: + if( uip_flags & UIP_ABORT ) + { + uip_slen = 0; + uip_connr->tcpstateflags = UIP_CLOSED; + BUF->flags = TCP_RST | TCP_ACK; + goto tcp_send_nodata; + } + + if( uip_flags & UIP_CLOSE ) + { + uip_slen = 0; + uip_connr->len = 1; + uip_connr->tcpstateflags = UIP_FIN_WAIT_1; + uip_connr->nrtx = 0; + BUF->flags = TCP_FIN | TCP_ACK; + goto tcp_send_nodata; + } + + /* If uip_slen > 0, the application has data to be sent. */ + if( uip_slen > 0 ) + { + /* If the connection has acknowledged data, the contents of + the ->len variable should be discarded. */ + if( (uip_flags & UIP_ACKDATA) != 0 ) + { + uip_connr->len = 0; + } + + /* If the ->len variable is non-zero the connection has + already data in transit and cannot send anymore right + now. */ + if( uip_connr->len == 0 ) + { + /* The application cannot send more than what is allowed by + the mss (the minumum of the MSS and the available + window). */ + if( uip_slen > uip_connr->mss ) + { + uip_slen = uip_connr->mss; + } + + /* Remember how much data we send out now so that we know + when everything has been acknowledged. */ + uip_connr->len = uip_slen; + } + else + { + /* If the application already had unacknowledged data, we + make sure that the application does not send (i.e., + retransmit) out more than it previously sent out. */ + uip_slen = uip_connr->len; + } + } + + uip_connr->nrtx = 0; + apprexmit: + uip_appdata = uip_sappdata; + + /* If the application has data to be sent, or if the incoming + packet had new data in it, we must send out a packet. */ + if( uip_slen > 0 && uip_connr->len > 0 ) + { + /* Add the length of the IP and TCP headers. */ + uip_len = uip_connr->len + UIP_TCPIP_HLEN; + + /* We always set the ACK flag in response packets. */ + BUF->flags = TCP_ACK | TCP_PSH; + + /* Send the packet. */ + goto tcp_send_noopts; + } + + /* If there is no data to send, just send out a pure ACK if + there is newdata. */ + if( uip_flags & UIP_NEWDATA ) + { + uip_len = UIP_TCPIP_HLEN; + BUF->flags = TCP_ACK; + goto tcp_send_noopts; + } + } + + goto drop; + + case UIP_LAST_ACK: + /* We can close this connection if the peer has acknowledged our + FIN. This is indicated by the UIP_ACKDATA flag. */ + if( uip_flags & UIP_ACKDATA ) + { + uip_connr->tcpstateflags = UIP_CLOSED; + uip_flags = UIP_CLOSE; + UIP_APPCALL(); + } + + break; + + case UIP_FIN_WAIT_1: + /* The application has closed the connection, but the remote host + hasn't closed its end yet. Thus we do nothing but wait for a + FIN from the other side. */ + if( uip_len > 0 ) + { + uip_add_rcv_nxt( uip_len ); + } + + if( BUF->flags & TCP_FIN ) + { + if( uip_flags & UIP_ACKDATA ) + { + uip_connr->tcpstateflags = UIP_TIME_WAIT; + uip_connr->timer = 0; + uip_connr->len = 0; + } + else + { + uip_connr->tcpstateflags = UIP_CLOSING; + } + + uip_add_rcv_nxt( 1 ); + uip_flags = UIP_CLOSE; + UIP_APPCALL(); + goto tcp_send_ack; + } + else if( uip_flags & UIP_ACKDATA ) + { + uip_connr->tcpstateflags = UIP_FIN_WAIT_2; + uip_connr->len = 0; + goto drop; + } + + if( uip_len > 0 ) + { + goto tcp_send_ack; + } + + goto drop; + + case UIP_FIN_WAIT_2: + if( uip_len > 0 ) + { + uip_add_rcv_nxt( uip_len ); + } + + if( BUF->flags & TCP_FIN ) + { + uip_connr->tcpstateflags = UIP_TIME_WAIT; + uip_connr->timer = 0; + uip_add_rcv_nxt( 1 ); + uip_flags = UIP_CLOSE; + UIP_APPCALL(); + goto tcp_send_ack; + } + + if( uip_len > 0 ) + { + goto tcp_send_ack; + } + + goto drop; + + case UIP_TIME_WAIT: + goto tcp_send_ack; + + case UIP_CLOSING: + if( uip_flags & UIP_ACKDATA ) + { + uip_connr->tcpstateflags = UIP_TIME_WAIT; + uip_connr->timer = 0; + } + } + + goto drop; + + /* We jump here when we are ready to send the packet, and just want + to set the appropriate TCP sequence numbers in the TCP header. */ +tcp_send_ack: + BUF->flags = TCP_ACK; +tcp_send_nodata: + uip_len = UIP_IPTCPH_LEN; +tcp_send_noopts: + BUF->tcpoffset = ( UIP_TCPH_LEN / 4 ) << 4; +tcp_send: + /* We're done with the input processing. We are now ready to send a + reply. Our job is to fill in all the fields of the TCP and IP + headers before calculating the checksum and finally send the + packet. */ + BUF->ackno[0] = uip_connr->rcv_nxt[0]; + BUF->ackno[1] = uip_connr->rcv_nxt[1]; + BUF->ackno[2] = uip_connr->rcv_nxt[2]; + BUF->ackno[3] = uip_connr->rcv_nxt[3]; + + BUF->seqno[0] = uip_connr->snd_nxt[0]; + BUF->seqno[1] = uip_connr->snd_nxt[1]; + BUF->seqno[2] = uip_connr->snd_nxt[2]; + BUF->seqno[3] = uip_connr->snd_nxt[3]; + + BUF->proto = UIP_PROTO_TCP; + + BUF->srcport = uip_connr->lport; + BUF->destport = uip_connr->rport; + + uip_ipaddr_copy( BUF->srcipaddr, uip_hostaddr ); + uip_ipaddr_copy( BUF->destipaddr, uip_connr->ripaddr ); + + if( uip_connr->tcpstateflags & UIP_STOPPED ) + { + /* If the connection has issued uip_stop(), we advertise a zero + window so that the remote host will stop sending data. */ + BUF->wnd[0] = BUF->wnd[1] = 0; + } + else + { + BUF->wnd[0] = ( (UIP_RECEIVE_WINDOW) >> 8 ); + BUF->wnd[1] = ( (UIP_RECEIVE_WINDOW) & 0xff ); + } + +tcp_send_noconn: + BUF->ttl = UIP_TTL; + #if UIP_CONF_IPV6 + + /* For IPv6, the IP length field does not include the IPv6 IP header + length. */ + BUF->len[0] = ( (uip_len - UIP_IPH_LEN) >> 8 ); + BUF->len[1] = ( (uip_len - UIP_IPH_LEN) & 0xff ); + #else /* UIP_CONF_IPV6 */ + BUF->len[0] = ( uip_len >> 8 ); + BUF->len[1] = ( uip_len & 0xff ); + #endif /* UIP_CONF_IPV6 */ + + BUF->urgp[0] = BUF->urgp[1] = 0; + + /* Calculate TCP checksum. */ + BUF->tcpchksum = 0; + BUF->tcpchksum = ~( uip_tcpchksum() ); + + #if UIP_UDP + ip_send_nolen : + #endif + #if UIP_CONF_IPV6 + BUF->vtc = 0x60; + BUF->tcflow = 0x00; + BUF->flow = 0x00; + #else /* UIP_CONF_IPV6 */ + BUF->vhl = 0x45; + BUF->tos = 0; + BUF->ipoffset[0] = BUF->ipoffset[1] = 0; + ++ipid; + BUF->ipid[0] = ipid >> 8; + BUF->ipid[1] = ipid & 0xff; + + /* Calculate IP checksum. */ + BUF->ipchksum = 0; + BUF->ipchksum = ~( uip_ipchksum() ); + DEBUG_PRINTF( "uip ip_send_nolen: chkecum 0x%04x\n", uip_ipchksum() ); + #endif /* UIP_CONF_IPV6 */ + + UIP_STAT( ++uip_stat.tcp.sent ); +send: + DEBUG_PRINTF( "Sending packet with length %d (%d)\n", uip_len, (BUF->len[0] << 8) | BUF->len[1] ); + + UIP_STAT( ++uip_stat.ip.sent ); + + /* Return and let the caller do the actual transmission. */ + uip_flags = 0; + return; +drop: + uip_len = 0; + uip_flags = 0; + return; +} + +/*---------------------------------------------------------------------------*/ +u16_t htons( u16_t val ) +{ + return HTONS( val ); +} + +/*---------------------------------------------------------------------------*/ +void uip_send( const void *data, int len ) +{ + if( len > 0 ) + { + uip_slen = len; + if( data != uip_sappdata ) + { + memcpy( uip_sappdata, (data), uip_slen ); + } + } +} + +/*---------------------------------------------------------------------------*/ +int uip_fast_send( int xARP ) +{ + ( void ) xARP; + #if NOT_YET_COMPLETE + + u16_t tcplen, len1 = 0, uiAccumulatedLen = 0, len_previous = 0, split_len; + int iSplitNo = 0; + extern int uip_low_level_output( unsigned char *pcBuf, int ilen ); + + if( xARP == pdTRUE ) + { + if( BUF->proto == UIP_PROTO_TCP && uip_slen > 1 ) + { + tcplen = uip_len - UIP_TCPIP_HLEN; + + if( tcplen > UIP_TCP_MSS ) + { + split_len = UIP_TCP_MSS; + } + else + { + split_len = tcplen / 2; + } + + while( tcplen > 0 ) + { + uiAccumulatedLen += len1; + + if( tcplen > split_len ) + { + len1 = split_len; + tcplen -= split_len; + } + else + { + len1 = tcplen; + tcplen = 0; + } + + uip_len = len1 + UIP_TCPIP_HLEN; + BUF->len[0] = uip_len >> 8; + BUF->len[1] = uip_len & 0xff; + if( iSplitNo == 0 ) + { + iSplitNo++; + + /* Create the first packet. This is done by altering the length + field of the IP header and updating the checksums. */ + } + else + { + /* Now, create the second packet. To do this, it is not enough to + just alter the length field, but we must also update the TCP + sequence number and point the uip_appdata to a new place in + memory. This place is determined by the length of the first + packet (len1). */ + + /* uip_appdata += len1;*/ + memcpy( uip_appdata, ( u8_t * ) uip_appdata + uiAccumulatedLen, len1 ); + uip_add32( BUF->seqno, len_previous ); + BUF->seqno[0] = uip_acc32[0]; + BUF->seqno[1] = uip_acc32[1]; + BUF->seqno[2] = uip_acc32[2]; + BUF->seqno[3] = uip_acc32[3]; + } + + /* Recalculate the TCP checksum. */ + BUF->tcpchksum = 0; + BUF->tcpchksum = ~( uip_tcpchksum() ); + + /* Recalculate the IP checksum. */ + BUF->ipchksum = 0; + BUF->ipchksum = ~( uip_ipchksum() ); + + /* Transmit the packet. */ + uip_arp_out(); + uip_low_level_output( uip_buf, uip_len ); + + len_previous = len1; + } + } + else + { + uip_arp_out(); + uip_low_level_output( uip_buf, uip_len ); + } + } + else + { + uip_low_level_output( uip_buf, uip_len ); + } + + #endif + return 1; +} + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip.h new file mode 100644 index 0000000..e8f173a --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip.h @@ -0,0 +1,1642 @@ + +/** + * \addtogroup uip + * @{ + */ + +/** + * \file + * Header file for the uIP TCP/IP stack. + * \author Adam Dunkels + * + * The uIP TCP/IP stack header file contains definitions for a number + * of C macros that are used by uIP programs as well as internal uIP + * structures, TCP/IP header structures and function declarations. + * + */ + + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip.h,v 1.40 2006/06/08 07:12:07 adam Exp $ + * + */ + +#ifndef __UIP_H__ +#define __UIP_H__ + +#include "uipopt.h" + +/** + * Repressentation of an IP address. + * + */ +typedef u16_t uip_ip4addr_t[2]; +typedef u16_t uip_ip6addr_t[8]; +#if UIP_CONF_IPV6 +typedef uip_ip6addr_t uip_ipaddr_t; +#else /* UIP_CONF_IPV6 */ +typedef uip_ip4addr_t uip_ipaddr_t; +#endif /* UIP_CONF_IPV6 */ + +/*---------------------------------------------------------------------------*/ +/* First, the functions that should be called from the + * system. Initialization, the periodic timer and incoming packets are + * handled by the following three functions. + */ + +/** + * \defgroup uipconffunc uIP configuration functions + * @{ + * + * The uIP configuration functions are used for setting run-time + * parameters in uIP such as IP addresses. + */ + +/** + * Set the IP address of this host. + * + * The IP address is represented as a 4-byte array where the first + * octet of the IP address is put in the first member of the 4-byte + * array. + * + * Example: + \code + + uip_ipaddr_t addr; + + uip_ipaddr(&addr, 192,168,1,2); + uip_sethostaddr(&addr); + + \endcode + * \param addr A pointer to an IP address of type uip_ipaddr_t; + * + * \sa uip_ipaddr() + * + * \hideinitializer + */ +#define uip_sethostaddr(addr) uip_ipaddr_copy(uip_hostaddr, (addr)) + +/** + * Get the IP address of this host. + * + * The IP address is represented as a 4-byte array where the first + * octet of the IP address is put in the first member of the 4-byte + * array. + * + * Example: + \code + uip_ipaddr_t hostaddr; + + uip_gethostaddr(&hostaddr); + \endcode + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the currently configured IP address. + * + * \hideinitializer + */ +#define uip_gethostaddr(addr) uip_ipaddr_copy((addr), uip_hostaddr) + +/** + * Set the default router's IP address. + * + * \param addr A pointer to a uip_ipaddr_t variable containing the IP + * address of the default router. + * + * \sa uip_ipaddr() + * + * \hideinitializer + */ +#define uip_setdraddr(addr) uip_ipaddr_copy(uip_draddr, (addr)) + +/** + * Set the netmask. + * + * \param addr A pointer to a uip_ipaddr_t variable containing the IP + * address of the netmask. + * + * \sa uip_ipaddr() + * + * \hideinitializer + */ +#define uip_setnetmask(addr) uip_ipaddr_copy(uip_netmask, (addr)) + + +/** + * Get the default router's IP address. + * + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the IP address of the default router. + * + * \hideinitializer + */ +#define uip_getdraddr(addr) uip_ipaddr_copy((addr), uip_draddr) + +/** + * Get the netmask. + * + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the value of the netmask. + * + * \hideinitializer + */ +#define uip_getnetmask(addr) uip_ipaddr_copy((addr), uip_netmask) + +/** @} */ + +/** + * \defgroup uipinit uIP initialization functions + * @{ + * + * The uIP initialization functions are used for booting uIP. + */ + +/** + * uIP initialization function. + * + * This function should be called at boot up to initilize the uIP + * TCP/IP stack. + */ +void uip_init(void); + +/** + * uIP initialization function. + * + * This function may be used at boot time to set the initial ip_id. + */ +void uip_setipid(u16_t id); + +/** @} */ + +/** + * \defgroup uipdevfunc uIP device driver functions + * @{ + * + * These functions are used by a network device driver for interacting + * with uIP. + */ + +/** + * Process an incoming packet. + * + * This function should be called when the device driver has received + * a packet from the network. The packet from the device driver must + * be present in the uip_buf buffer, and the length of the packet + * should be placed in the uip_len variable. + * + * When the function returns, there may be an outbound packet placed + * in the uip_buf packet buffer. If so, the uip_len variable is set to + * the length of the packet. If no packet is to be sent out, the + * uip_len variable is set to 0. + * + * The usual way of calling the function is presented by the source + * code below. + \code + uip_len = devicedriver_poll(); + if(uip_len > 0) { + uip_input(); + if(uip_len > 0) { + devicedriver_send(); + } + } + \endcode + * + * \note If you are writing a uIP device driver that needs ARP + * (Address Resolution Protocol), e.g., when running uIP over + * Ethernet, you will need to call the uIP ARP code before calling + * this function: + \code + #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) + uip_len = ethernet_devicedrver_poll(); + if(uip_len > 0) { + if(BUF->type == HTONS(UIP_ETHTYPE_IP)) { + uip_arp_ipin(); + uip_input(); + if(uip_len > 0) { + uip_arp_out(); + ethernet_devicedriver_send(); + } + } else if(BUF->type == HTONS(UIP_ETHTYPE_ARP)) { + uip_arp_arpin(); + if(uip_len > 0) { + ethernet_devicedriver_send(); + } + } + \endcode + * + * \hideinitializer + */ +#define uip_input() uip_process(UIP_DATA) + +/** + * Periodic processing for a connection identified by its number. + * + * This function does the necessary periodic processing (timers, + * polling) for a uIP TCP conneciton, and should be called when the + * periodic uIP timer goes off. It should be called for every + * connection, regardless of whether they are open of closed. + * + * When the function returns, it may have an outbound packet waiting + * for service in the uIP packet buffer, and if so the uip_len + * variable is set to a value larger than zero. The device driver + * should be called to send out the packet. + * + * The ususal way of calling the function is through a for() loop like + * this: + \code + for(i = 0; i < UIP_CONNS; ++i) { + uip_periodic(i); + if(uip_len > 0) { + devicedriver_send(); + } + } + \endcode + * + * \note If you are writing a uIP device driver that needs ARP + * (Address Resolution Protocol), e.g., when running uIP over + * Ethernet, you will need to call the uip_arp_out() function before + * calling the device driver: + \code + for(i = 0; i < UIP_CONNS; ++i) { + uip_periodic(i); + if(uip_len > 0) { + uip_arp_out(); + ethernet_devicedriver_send(); + } + } + \endcode + * + * \param conn The number of the connection which is to be periodically polled. + * + * \hideinitializer + */ +#define uip_periodic(conn) do { uip_conn = &uip_conns[conn]; \ + uip_process(UIP_TIMER); } while (0) + +/** + * + * + */ +#define uip_conn_active(conn) (uip_conns[conn].tcpstateflags != UIP_CLOSED) + +/** + * Perform periodic processing for a connection identified by a pointer + * to its structure. + * + * Same as uip_periodic() but takes a pointer to the actual uip_conn + * struct instead of an integer as its argument. This function can be + * used to force periodic processing of a specific connection. + * + * \param conn A pointer to the uip_conn struct for the connection to + * be processed. + * + * \hideinitializer + */ +#define uip_periodic_conn(conn) do { uip_conn = conn; \ + uip_process(UIP_TIMER); } while (0) + +/** + * Reuqest that a particular connection should be polled. + * + * Similar to uip_periodic_conn() but does not perform any timer + * processing. The application is polled for new data. + * + * \param conn A pointer to the uip_conn struct for the connection to + * be processed. + * + * \hideinitializer + */ +#define uip_poll_conn(conn) do { uip_conn = conn; \ + uip_process(UIP_POLL_REQUEST); } while (0) + + +#if UIP_UDP +/** + * Periodic processing for a UDP connection identified by its number. + * + * This function is essentially the same as uip_periodic(), but for + * UDP connections. It is called in a similar fashion as the + * uip_periodic() function: + \code + for(i = 0; i < UIP_UDP_CONNS; i++) { + uip_udp_periodic(i); + if(uip_len > 0) { + devicedriver_send(); + } + } + \endcode + * + * \note As for the uip_periodic() function, special care has to be + * taken when using uIP together with ARP and Ethernet: + \code + for(i = 0; i < UIP_UDP_CONNS; i++) { + uip_udp_periodic(i); + if(uip_len > 0) { + uip_arp_out(); + ethernet_devicedriver_send(); + } + } + \endcode + * + * \param conn The number of the UDP connection to be processed. + * + * \hideinitializer + */ +#define uip_udp_periodic(conn) do { uip_udp_conn = &uip_udp_conns[conn]; \ + uip_process(UIP_UDP_TIMER); } while (0) + +/** + * Periodic processing for a UDP connection identified by a pointer to + * its structure. + * + * Same as uip_udp_periodic() but takes a pointer to the actual + * uip_conn struct instead of an integer as its argument. This + * function can be used to force periodic processing of a specific + * connection. + * + * \param conn A pointer to the uip_udp_conn struct for the connection + * to be processed. + * + * \hideinitializer + */ +#define uip_udp_periodic_conn(conn) do { uip_udp_conn = conn; \ + uip_process(UIP_UDP_TIMER); } while (0) + + +#endif /* UIP_UDP */ + +/** + * The uIP packet buffer. + * + * The uip_buf array is used to hold incoming and outgoing + * packets. The device driver should place incoming data into this + * buffer. When sending data, the device driver should read the link + * level headers and the TCP/IP headers from this buffer. The size of + * the link level headers is configured by the UIP_LLH_LEN define. + * + * \note The application data need not be placed in this buffer, so + * the device driver must read it from the place pointed to by the + * uip_appdata pointer as illustrated by the following example: + \code + void + devicedriver_send(void) + { + hwsend(&uip_buf[0], UIP_LLH_LEN); + if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) { + hwsend(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN); + } else { + hwsend(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN); + hwsend(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN); + } + } + \endcode + */ +#ifndef UIP_CONF_EXTERNAL_BUFFER + extern u8_t uip_buf[UIP_BUFSIZE+2]; +#else + extern unsigned char *uip_buf; +#endif + +/** @} */ + +/*---------------------------------------------------------------------------*/ +/* Functions that are used by the uIP application program. Opening and + * closing connections, sending and receiving data, etc. is all + * handled by the functions below. +*/ +/** + * \defgroup uipappfunc uIP application functions + * @{ + * + * Functions used by an application running of top of uIP. + */ + +/** + * Start listening to the specified port. + * + * \note Since this function expects the port number in network byte + * order, a conversion using HTONS() or htons() is necessary. + * + \code + uip_listen(HTONS(80)); + \endcode + * + * \param port A 16-bit port number in network byte order. + */ +void uip_listen(u16_t port); + +/** + * Stop listening to the specified port. + * + * \note Since this function expects the port number in network byte + * order, a conversion using HTONS() or htons() is necessary. + * + \code + uip_unlisten(HTONS(80)); + \endcode + * + * \param port A 16-bit port number in network byte order. + */ +void uip_unlisten(u16_t port); + +/** + * Connect to a remote host using TCP. + * + * This function is used to start a new connection to the specified + * port on the specied host. It allocates a new connection identifier, + * sets the connection to the SYN_SENT state and sets the + * retransmission timer to 0. This will cause a TCP SYN segment to be + * sent out the next time this connection is periodically processed, + * which usually is done within 0.5 seconds after the call to + * uip_connect(). + * + * \note This function is avaliable only if support for active open + * has been configured by defining UIP_ACTIVE_OPEN to 1 in uipopt.h. + * + * \note Since this function requires the port number to be in network + * byte order, a conversion using HTONS() or htons() is necessary. + * + \code + uip_ipaddr_t ipaddr; + + uip_ipaddr(&ipaddr, 192,168,1,2); + uip_connect(&ipaddr, HTONS(80)); + \endcode + * + * \param ripaddr The IP address of the remote hot. + * + * \param port A 16-bit port number in network byte order. + * + * \return A pointer to the uIP connection identifier for the new connection, + * or NULL if no connection could be allocated. + * + */ +struct uip_conn *uip_connect(uip_ipaddr_t *ripaddr, u16_t port); + + + +/** + * \internal + * + * Check if a connection has outstanding (i.e., unacknowledged) data. + * + * \param conn A pointer to the uip_conn structure for the connection. + * + * \hideinitializer + */ +#define uip_outstanding(conn) ((conn)->len) + +/** + * Send data on the current connection. + * + * This function is used to send out a single segment of TCP + * data. Only applications that have been invoked by uIP for event + * processing can send data. + * + * The amount of data that actually is sent out after a call to this + * funcion is determined by the maximum amount of data TCP allows. uIP + * will automatically crop the data so that only the appropriate + * amount of data is sent. The function uip_mss() can be used to query + * uIP for the amount of data that actually will be sent. + * + * \note This function does not guarantee that the sent data will + * arrive at the destination. If the data is lost in the network, the + * application will be invoked with the uip_rexmit() event being + * set. The application will then have to resend the data using this + * function. + * + * \param data A pointer to the data which is to be sent. + * + * \param len The maximum amount of data bytes to be sent. + * + * \hideinitializer + */ +void uip_send(const void *data, int len); + +/** + * The length of any incoming data that is currently avaliable (if avaliable) + * in the uip_appdata buffer. + * + * The test function uip_data() must first be used to check if there + * is any data available at all. + * + * \hideinitializer + */ +/*void uip_datalen(void);*/ +#define uip_datalen() uip_len + +/** + * The length of any out-of-band data (urgent data) that has arrived + * on the connection. + * + * \note The configuration parameter UIP_URGDATA must be set for this + * function to be enabled. + * + * \hideinitializer + */ +#define uip_urgdatalen() uip_urglen + +/** + * Close the current connection. + * + * This function will close the current connection in a nice way. + * + * \hideinitializer + */ +#define uip_close() (uip_flags = UIP_CLOSE) + +/** + * Abort the current connection. + * + * This function will abort (reset) the current connection, and is + * usually used when an error has occured that prevents using the + * uip_close() function. + * + * \hideinitializer + */ +#define uip_abort() (uip_flags = UIP_ABORT) + +/** + * Tell the sending host to stop sending data. + * + * This function will close our receiver's window so that we stop + * receiving data for the current connection. + * + * \hideinitializer + */ +#define uip_stop() (uip_conn->tcpstateflags |= UIP_STOPPED) + +/** + * Find out if the current connection has been previously stopped with + * uip_stop(). + * + * \hideinitializer + */ +#define uip_stopped(conn) ((conn)->tcpstateflags & UIP_STOPPED) + +/** + * Restart the current connection, if is has previously been stopped + * with uip_stop(). + * + * This function will open the receiver's window again so that we + * start receiving data for the current connection. + * + * \hideinitializer + */ +#define uip_restart() do { uip_flags |= UIP_NEWDATA; \ + uip_conn->tcpstateflags &= ~UIP_STOPPED; \ + } while(0) + + +/* uIP tests that can be made to determine in what state the current + connection is, and what the application function should do. */ + +/** + * Is the current connection a UDP connection? + * + * This function checks whether the current connection is a UDP connection. + * + * \hideinitializer + * + */ +#define uip_udpconnection() (uip_conn == NULL) + +/** + * Is new incoming data available? + * + * Will reduce to non-zero if there is new data for the application + * present at the uip_appdata pointer. The size of the data is + * avaliable through the uip_len variable. + * + * \hideinitializer + */ +#define uip_newdata() (uip_flags & UIP_NEWDATA) + +/** + * Has previously sent data been acknowledged? + * + * Will reduce to non-zero if the previously sent data has been + * acknowledged by the remote host. This means that the application + * can send new data. + * + * \hideinitializer + */ +#define uip_acked() (uip_flags & UIP_ACKDATA) + +/** + * Has the connection just been connected? + * + * Reduces to non-zero if the current connection has been connected to + * a remote host. This will happen both if the connection has been + * actively opened (with uip_connect()) or passively opened (with + * uip_listen()). + * + * \hideinitializer + */ +#define uip_connected() (uip_flags & UIP_CONNECTED) + +/** + * Has the connection been closed by the other end? + * + * Is non-zero if the connection has been closed by the remote + * host. The application may then do the necessary clean-ups. + * + * \hideinitializer + */ +#define uip_closed() (uip_flags & UIP_CLOSE) + +/** + * Has the connection been aborted by the other end? + * + * Non-zero if the current connection has been aborted (reset) by the + * remote host. + * + * \hideinitializer + */ +#define uip_aborted() (uip_flags & UIP_ABORT) + +/** + * Has the connection timed out? + * + * Non-zero if the current connection has been aborted due to too many + * retransmissions. + * + * \hideinitializer + */ +#define uip_timedout() (uip_flags & UIP_TIMEDOUT) + +/** + * Do we need to retransmit previously data? + * + * Reduces to non-zero if the previously sent data has been lost in + * the network, and the application should retransmit it. The + * application should send the exact same data as it did the last + * time, using the uip_send() function. + * + * \hideinitializer + */ +#define uip_rexmit() (uip_flags & UIP_REXMIT) + +/** + * Is the connection being polled by uIP? + * + * Is non-zero if the reason the application is invoked is that the + * current connection has been idle for a while and should be + * polled. + * + * The polling event can be used for sending data without having to + * wait for the remote host to send data. + * + * \hideinitializer + */ +#define uip_poll() (uip_flags & UIP_POLL) + +/** + * Get the initial maxium segment size (MSS) of the current + * connection. + * + * \hideinitializer + */ +#define uip_initialmss() (uip_conn->initialmss) + +/** + * Get the current maxium segment size that can be sent on the current + * connection. + * + * The current maxiumum segment size that can be sent on the + * connection is computed from the receiver's window and the MSS of + * the connection (which also is available by calling + * uip_initialmss()). + * + * \hideinitializer + */ +#define uip_mss() (uip_conn->mss) + +/** + * Set up a new UDP connection. + * + * This function sets up a new UDP connection. The function will + * automatically allocate an unused local port for the new + * connection. However, another port can be chosen by using the + * uip_udp_bind() call, after the uip_udp_new() function has been + * called. + * + * Example: + \code + uip_ipaddr_t addr; + struct uip_udp_conn *c; + + uip_ipaddr(&addr, 192,168,2,1); + c = uip_udp_new(&addr, HTONS(12345)); + if(c != NULL) { + uip_udp_bind(c, HTONS(12344)); + } + \endcode + * \param ripaddr The IP address of the remote host. + * + * \param rport The remote port number in network byte order. + * + * \return The uip_udp_conn structure for the new connection or NULL + * if no connection could be allocated. + */ +struct uip_udp_conn *uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport); + +/** + * Removed a UDP connection. + * + * \param conn A pointer to the uip_udp_conn structure for the connection. + * + * \hideinitializer + */ +#define uip_udp_remove(conn) (conn)->lport = 0 + +/** + * Bind a UDP connection to a local port. + * + * \param conn A pointer to the uip_udp_conn structure for the + * connection. + * + * \param port The local port number, in network byte order. + * + * \hideinitializer + */ +#define uip_udp_bind(conn, port) (conn)->lport = port + +/** + * Send a UDP datagram of length len on the current connection. + * + * This function can only be called in response to a UDP event (poll + * or newdata). The data must be present in the uip_buf buffer, at the + * place pointed to by the uip_appdata pointer. + * + * \param len The length of the data in the uip_buf buffer. + * + * \hideinitializer + */ +#define uip_udp_send(len) uip_send((char *)uip_appdata, len) + +/** @} */ + +/* uIP convenience and converting functions. */ + +/** + * \defgroup uipconvfunc uIP conversion functions + * @{ + * + * These functions can be used for converting between different data + * formats used by uIP. + */ + +/** + * Construct an IP address from four bytes. + * + * This function constructs an IP address of the type that uIP handles + * internally from four bytes. The function is handy for specifying IP + * addresses to use with e.g. the uip_connect() function. + * + * Example: + \code + uip_ipaddr_t ipaddr; + struct uip_conn *c; + + uip_ipaddr(&ipaddr, 192,168,1,2); + c = uip_connect(&ipaddr, HTONS(80)); + \endcode + * + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the IP address. + * + * \param addr0 The first octet of the IP address. + * \param addr1 The second octet of the IP address. + * \param addr2 The third octet of the IP address. + * \param addr3 The forth octet of the IP address. + * + * \hideinitializer + */ +#define uip_ipaddr(addr, addr0,addr1,addr2,addr3) do { \ + ((u16_t *)(addr))[0] = HTONS(((addr0) << 8) | (addr1)); \ + ((u16_t *)(addr))[1] = HTONS(((addr2) << 8) | (addr3)); \ + } while(0) + +/** + * Construct an IPv6 address from eight 16-bit words. + * + * This function constructs an IPv6 address. + * + * \hideinitializer + */ +#define uip_ip6addr(addr, addr0,addr1,addr2,addr3,addr4,addr5,addr6,addr7) do { \ + ((u16_t *)(addr))[0] = HTONS((addr0)); \ + ((u16_t *)(addr))[1] = HTONS((addr1)); \ + ((u16_t *)(addr))[2] = HTONS((addr2)); \ + ((u16_t *)(addr))[3] = HTONS((addr3)); \ + ((u16_t *)(addr))[4] = HTONS((addr4)); \ + ((u16_t *)(addr))[5] = HTONS((addr5)); \ + ((u16_t *)(addr))[6] = HTONS((addr6)); \ + ((u16_t *)(addr))[7] = HTONS((addr7)); \ + } while(0) + +/** + * Copy an IP address to another IP address. + * + * Copies an IP address from one place to another. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2; + + uip_ipaddr(&ipaddr1, 192,16,1,2); + uip_ipaddr_copy(&ipaddr2, &ipaddr1); + \endcode + * + * \param dest The destination for the copy. + * \param src The source from where to copy. + * + * \hideinitializer + */ +#if !UIP_CONF_IPV6 +#define uip_ipaddr_copy(dest, src) do { \ + ((u16_t *)dest)[0] = ((u16_t *)src)[0]; \ + ((u16_t *)dest)[1] = ((u16_t *)src)[1]; \ + } while(0) +#else /* !UIP_CONF_IPV6 */ +#define uip_ipaddr_copy(dest, src) memcpy(dest, src, sizeof(uip_ip6addr_t)) +#endif /* !UIP_CONF_IPV6 */ + +/** + * Compare two IP addresses + * + * Compares two IP addresses. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2; + + uip_ipaddr(&ipaddr1, 192,16,1,2); + if(uip_ipaddr_cmp(&ipaddr2, &ipaddr1)) { + printf("They are the same"); + } + \endcode + * + * \param addr1 The first IP address. + * \param addr2 The second IP address. + * + * \hideinitializer + */ +#if !UIP_CONF_IPV6 +#define uip_ipaddr_cmp(addr1, addr2) (((u16_t *)addr1)[0] == ((u16_t *)addr2)[0] && \ + ((u16_t *)addr1)[1] == ((u16_t *)addr2)[1]) +#else /* !UIP_CONF_IPV6 */ +#define uip_ipaddr_cmp(addr1, addr2) (memcmp(addr1, addr2, sizeof(uip_ip6addr_t)) == 0) +#endif /* !UIP_CONF_IPV6 */ + +/** + * Compare two IP addresses with netmasks + * + * Compares two IP addresses with netmasks. The masks are used to mask + * out the bits that are to be compared. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2, mask; + + uip_ipaddr(&mask, 255,255,255,0); + uip_ipaddr(&ipaddr1, 192,16,1,2); + uip_ipaddr(&ipaddr2, 192,16,1,3); + if(uip_ipaddr_maskcmp(&ipaddr1, &ipaddr2, &mask)) { + printf("They are the same"); + } + \endcode + * + * \param addr1 The first IP address. + * \param addr2 The second IP address. + * \param mask The netmask. + * + * \hideinitializer + */ +#define uip_ipaddr_maskcmp(addr1, addr2, mask) \ + (((((u16_t *)addr1)[0] & ((u16_t *)mask)[0]) == \ + (((u16_t *)addr2)[0] & ((u16_t *)mask)[0])) && \ + ((((u16_t *)addr1)[1] & ((u16_t *)mask)[1]) == \ + (((u16_t *)addr2)[1] & ((u16_t *)mask)[1]))) + + +/** + * Mask out the network part of an IP address. + * + * Masks out the network part of an IP address, given the address and + * the netmask. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2, netmask; + + uip_ipaddr(&ipaddr1, 192,16,1,2); + uip_ipaddr(&netmask, 255,255,255,0); + uip_ipaddr_mask(&ipaddr2, &ipaddr1, &netmask); + \endcode + * + * In the example above, the variable "ipaddr2" will contain the IP + * address 192.168.1.0. + * + * \param dest Where the result is to be placed. + * \param src The IP address. + * \param mask The netmask. + * + * \hideinitializer + */ +#define uip_ipaddr_mask(dest, src, mask) do { \ + ((u16_t *)dest)[0] = ((u16_t *)src)[0] & ((u16_t *)mask)[0]; \ + ((u16_t *)dest)[1] = ((u16_t *)src)[1] & ((u16_t *)mask)[1]; \ + } while(0) + +/** + * Pick the first octet of an IP address. + * + * Picks out the first octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr1(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 1. + * + * \hideinitializer + */ +#define uip_ipaddr1(addr) (htons(((u16_t *)(addr))[0]) >> 8) + +/** + * Pick the second octet of an IP address. + * + * Picks out the second octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr2(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 2. + * + * \hideinitializer + */ +#define uip_ipaddr2(addr) (htons(((u16_t *)(addr))[0]) & 0xff) + +/** + * Pick the third octet of an IP address. + * + * Picks out the third octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr3(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 3. + * + * \hideinitializer + */ +#define uip_ipaddr3(addr) (htons(((u16_t *)(addr))[1]) >> 8) + +/** + * Pick the fourth octet of an IP address. + * + * Picks out the fourth octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr4(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 4. + * + * \hideinitializer + */ +#define uip_ipaddr4(addr) (htons(((u16_t *)(addr))[1]) & 0xff) + +/** + * Convert 16-bit quantity from host byte order to network byte order. + * + * This macro is primarily used for converting constants from host + * byte order to network byte order. For converting variables to + * network byte order, use the htons() function instead. + * + * \hideinitializer + */ +#ifndef HTONS +# if UIP_BYTE_ORDER == UIP_BIG_ENDIAN +# define HTONS(n) (n) +# else /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ +# define HTONS(n) (u16_t)((((u16_t) (n)) << 8) | (((u16_t) (n)) >> 8)) +# endif /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ +#else +#error "HTONS already defined!" +#endif /* HTONS */ + +/** + * Convert 16-bit quantity from host byte order to network byte order. + * + * This function is primarily used for converting variables from host + * byte order to network byte order. For converting constants to + * network byte order, use the HTONS() macro instead. + */ +#ifndef htons +u16_t htons(u16_t val); +#endif /* htons */ +#ifndef ntohs +#define ntohs htons +#endif + +/** @} */ + +/** + * Pointer to the application data in the packet buffer. + * + * This pointer points to the application data when the application is + * called. If the application wishes to send data, the application may + * use this space to write the data into before calling uip_send(). + */ +extern void *uip_appdata; + +#if UIP_URGDATA > 0 +/* u8_t *uip_urgdata: + * + * This pointer points to any urgent data that has been received. Only + * present if compiled with support for urgent data (UIP_URGDATA). + */ +extern void *uip_urgdata; +#endif /* UIP_URGDATA > 0 */ + + +/** + * \defgroup uipdrivervars Variables used in uIP device drivers + * @{ + * + * uIP has a few global variables that are used in device drivers for + * uIP. + */ + +/** + * The length of the packet in the uip_buf buffer. + * + * The global variable uip_len holds the length of the packet in the + * uip_buf buffer. + * + * When the network device driver calls the uIP input function, + * uip_len should be set to the length of the packet in the uip_buf + * buffer. + * + * When sending packets, the device driver should use the contents of + * the uip_len variable to determine the length of the outgoing + * packet. + * + */ +extern u16_t uip_len; + +/** @} */ + +#if UIP_URGDATA > 0 +extern u16_t uip_urglen, uip_surglen; +#endif /* UIP_URGDATA > 0 */ + + +/** + * Representation of a uIP TCP connection. + * + * The uip_conn structure is used for identifying a connection. All + * but one field in the structure are to be considered read-only by an + * application. The only exception is the appstate field whos purpose + * is to let the application store application-specific state (e.g., + * file pointers) for the connection. The type of this field is + * configured in the "uipopt.h" header file. + */ +struct uip_conn { + uip_ipaddr_t ripaddr; /**< The IP address of the remote host. */ + + u16_t lport; /**< The local TCP port, in network byte order. */ + u16_t rport; /**< The local remote TCP port, in network byte + order. */ + + u8_t rcv_nxt[4]; /**< The sequence number that we expect to + receive next. */ + u8_t snd_nxt[4]; /**< The sequence number that was last sent by + us. */ + u16_t len; /**< Length of the data that was previously sent. */ + u16_t mss; /**< Current maximum segment size for the + connection. */ + u16_t initialmss; /**< Initial maximum segment size for the + connection. */ + u8_t sa; /**< Retransmission time-out calculation state + variable. */ + u8_t sv; /**< Retransmission time-out calculation state + variable. */ + u8_t rto; /**< Retransmission time-out. */ + u8_t tcpstateflags; /**< TCP state and flags. */ + u8_t timer; /**< The retransmission timer. */ + u8_t nrtx; /**< The number of retransmissions for the last + segment sent. */ + + /** The application state. */ + uip_tcp_appstate_t appstate; +}; + + +/** + * Pointer to the current TCP connection. + * + * The uip_conn pointer can be used to access the current TCP + * connection. + */ +extern struct uip_conn *uip_conn; +/* The array containing all uIP connections. */ +extern struct uip_conn uip_conns[UIP_CONNS]; +/** + * \addtogroup uiparch + * @{ + */ + +/** + * 4-byte array used for the 32-bit sequence number calculations. + */ +extern u8_t uip_acc32[4]; + +/** @} */ + + +#if UIP_UDP +/** + * Representation of a uIP UDP connection. + */ +struct uip_udp_conn { + uip_ipaddr_t ripaddr; /**< The IP address of the remote peer. */ + u16_t lport; /**< The local port number in network byte order. */ + u16_t rport; /**< The remote port number in network byte order. */ + u8_t ttl; /**< Default time-to-live. */ + + /** The application state. */ + uip_udp_appstate_t appstate; +}; + +/** + * The current UDP connection. + */ +extern struct uip_udp_conn *uip_udp_conn; +extern struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS]; +#endif /* UIP_UDP */ + +/** + * The structure holding the TCP/IP statistics that are gathered if + * UIP_STATISTICS is set to 1. + * + */ +struct uip_stats { + struct { + uip_stats_t drop; /**< Number of dropped packets at the IP + layer. */ + uip_stats_t recv; /**< Number of received packets at the IP + layer. */ + uip_stats_t sent; /**< Number of sent packets at the IP + layer. */ + uip_stats_t vhlerr; /**< Number of packets dropped due to wrong + IP version or header length. */ + uip_stats_t hblenerr; /**< Number of packets dropped due to wrong + IP length, high byte. */ + uip_stats_t lblenerr; /**< Number of packets dropped due to wrong + IP length, low byte. */ + uip_stats_t fragerr; /**< Number of packets dropped since they + were IP fragments. */ + uip_stats_t chkerr; /**< Number of packets dropped due to IP + checksum errors. */ + uip_stats_t protoerr; /**< Number of packets dropped since they + were neither ICMP, UDP nor TCP. */ + } ip; /**< IP statistics. */ + struct { + uip_stats_t drop; /**< Number of dropped ICMP packets. */ + uip_stats_t recv; /**< Number of received ICMP packets. */ + uip_stats_t sent; /**< Number of sent ICMP packets. */ + uip_stats_t typeerr; /**< Number of ICMP packets with a wrong + type. */ + } icmp; /**< ICMP statistics. */ + struct { + uip_stats_t drop; /**< Number of dropped TCP segments. */ + uip_stats_t recv; /**< Number of recived TCP segments. */ + uip_stats_t sent; /**< Number of sent TCP segments. */ + uip_stats_t chkerr; /**< Number of TCP segments with a bad + checksum. */ + uip_stats_t ackerr; /**< Number of TCP segments with a bad ACK + number. */ + uip_stats_t rst; /**< Number of recevied TCP RST (reset) segments. */ + uip_stats_t rexmit; /**< Number of retransmitted TCP segments. */ + uip_stats_t syndrop; /**< Number of dropped SYNs due to too few + connections was avaliable. */ + uip_stats_t synrst; /**< Number of SYNs for closed ports, + triggering a RST. */ + } tcp; /**< TCP statistics. */ +#if UIP_UDP + struct { + uip_stats_t drop; /**< Number of dropped UDP segments. */ + uip_stats_t recv; /**< Number of recived UDP segments. */ + uip_stats_t sent; /**< Number of sent UDP segments. */ + uip_stats_t chkerr; /**< Number of UDP segments with a bad + checksum. */ + } udp; /**< UDP statistics. */ +#endif /* UIP_UDP */ +}; + +/** + * The uIP TCP/IP statistics. + * + * This is the variable in which the uIP TCP/IP statistics are gathered. + */ +extern struct uip_stats uip_stat; + + +/*---------------------------------------------------------------------------*/ +/* All the stuff below this point is internal to uIP and should not be + * used directly by an application or by a device driver. + */ +/*---------------------------------------------------------------------------*/ +/* u8_t uip_flags: + * + * When the application is called, uip_flags will contain the flags + * that are defined in this file. Please read below for more + * infomation. + */ +extern u8_t uip_flags; + +/* The following flags may be set in the global variable uip_flags + before calling the application callback. The UIP_ACKDATA, + UIP_NEWDATA, and UIP_CLOSE flags may both be set at the same time, + whereas the others are mutualy exclusive. Note that these flags + should *NOT* be accessed directly, but only through the uIP + functions/macros. */ + +#define UIP_ACKDATA 1 /* Signifies that the outstanding data was + acked and the application should send + out new data instead of retransmitting + the last data. */ +#define UIP_NEWDATA 2 /* Flags the fact that the peer has sent + us new data. */ +#define UIP_REXMIT 4 /* Tells the application to retransmit the + data that was last sent. */ +#define UIP_POLL 8 /* Used for polling the application, to + check if the application has data that + it wants to send. */ +#define UIP_CLOSE 16 /* The remote host has closed the + connection, thus the connection has + gone away. Or the application signals + that it wants to close the + connection. */ +#define UIP_ABORT 32 /* The remote host has aborted the + connection, thus the connection has + gone away. Or the application signals + that it wants to abort the + connection. */ +#define UIP_CONNECTED 64 /* We have got a connection from a remote + host and have set up a new connection + for it, or an active connection has + been successfully established. */ + +#define UIP_TIMEDOUT 128 /* The connection has been aborted due to + too many retransmissions. */ + +/* uip_process(flag): + * + * The actual uIP function which does all the work. + */ +void uip_process(u8_t flag); + +/* The following flags are passed as an argument to the uip_process() + function. They are used to distinguish between the two cases where + uip_process() is called. It can be called either because we have + incoming data that should be processed, or because the periodic + timer has fired. These values are never used directly, but only in + the macrose defined in this file. */ + +#define UIP_DATA 1 /* Tells uIP that there is incoming + data in the uip_buf buffer. The + length of the data is stored in the + global variable uip_len. */ +#define UIP_TIMER 2 /* Tells uIP that the periodic timer + has fired. */ +#define UIP_POLL_REQUEST 3 /* Tells uIP that a connection should + be polled. */ +#define UIP_UDP_SEND_CONN 4 /* Tells uIP that a UDP datagram + should be constructed in the + uip_buf buffer. */ +#if UIP_UDP +#define UIP_UDP_TIMER 5 +#endif /* UIP_UDP */ + +/* The TCP states used in the uip_conn->tcpstateflags. */ +#define UIP_CLOSED 0 +#define UIP_SYN_RCVD 1 +#define UIP_SYN_SENT 2 +#define UIP_ESTABLISHED 3 +#define UIP_FIN_WAIT_1 4 +#define UIP_FIN_WAIT_2 5 +#define UIP_CLOSING 6 +#define UIP_TIME_WAIT 7 +#define UIP_LAST_ACK 8 +#define UIP_TS_MASK 15 + +#define UIP_STOPPED 16 + +/* The TCP and IP headers. */ + +#ifdef __ICCARM__ + #pragma pack(1) +#endif + +struct uip_tcpip_hdr { +#if UIP_CONF_IPV6 + /* IPv6 header. */ + u8_t vtc, + tcflow; + u16_t flow; + u8_t len[2]; + u8_t proto, ttl; + uip_ip6addr_t srcipaddr, destipaddr; +#else /* UIP_CONF_IPV6 */ + /* IPv4 header. */ + u8_t vhl, + tos, + len[2], + ipid[2], + ipoffset[2], + ttl, + proto; + u16_t ipchksum; + u16_t srcipaddr[2], + destipaddr[2]; +#endif /* UIP_CONF_IPV6 */ + + /* TCP header. */ + u16_t srcport, + destport; + u8_t seqno[4], + ackno[4], + tcpoffset, + flags, + wnd[2]; + u16_t tcpchksum; + u8_t urgp[2]; + u8_t optdata[4]; +} PACK_STRUCT_END; + +#ifdef __ICCARM__ + #pragma pack() +#endif + +/* The ICMP and IP headers. */ +#ifdef __ICCARM__ + #pragma pack(1) +#endif + +struct uip_icmpip_hdr { +#if UIP_CONF_IPV6 + /* IPv6 header. */ + u8_t vtc, + tcf; + u16_t flow; + u8_t len[2]; + u8_t proto, ttl; + uip_ip6addr_t srcipaddr, destipaddr; +#else /* UIP_CONF_IPV6 */ + /* IPv4 header. */ + u8_t vhl, + tos, + len[2], + ipid[2], + ipoffset[2], + ttl, + proto; + u16_t ipchksum; + u16_t srcipaddr[2], + destipaddr[2]; +#endif /* UIP_CONF_IPV6 */ + + /* ICMP (echo) header. */ + u8_t type, icode; + u16_t icmpchksum; +#if !UIP_CONF_IPV6 + u16_t id, seqno; +#else /* !UIP_CONF_IPV6 */ + u8_t flags, reserved1, reserved2, reserved3; + u8_t icmp6data[16]; + u8_t options[1]; +#endif /* !UIP_CONF_IPV6 */ +} PACK_STRUCT_END; + +#ifdef __ICCARM__ + #pragma pack() +#endif + + +/* The UDP and IP headers. */ +#ifdef __ICCARM__ + #pragma pack(1) +#endif + +struct uip_udpip_hdr { +#if UIP_CONF_IPV6 + /* IPv6 header. */ + u8_t vtc, + tcf; + u16_t flow; + u8_t len[2]; + u8_t proto, ttl; + uip_ip6addr_t srcipaddr, destipaddr; +#else /* UIP_CONF_IPV6 */ + /* IP header. */ + u8_t vhl, + tos, + len[2], + ipid[2], + ipoffset[2], + ttl, + proto; + u16_t ipchksum; + u16_t srcipaddr[2], + destipaddr[2]; +#endif /* UIP_CONF_IPV6 */ + + /* UDP header. */ + u16_t srcport, + destport; + u16_t udplen; + u16_t udpchksum; +} PACK_STRUCT_END; + +#ifdef __ICCARM__ + #pragma pack() +#endif + + + +/** + * The buffer size available for user data in the \ref uip_buf buffer. + * + * This macro holds the available size for user data in the \ref + * uip_buf buffer. The macro is intended to be used for checking + * bounds of available user data. + * + * Example: + \code + snprintf(uip_appdata, UIP_APPDATA_SIZE, "%u\n", i); + \endcode + * + * \hideinitializer + */ +#define UIP_APPDATA_SIZE (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN) + + +#define UIP_PROTO_ICMP 1 +#define UIP_PROTO_TCP 6 +#define UIP_PROTO_UDP 17 +#define UIP_PROTO_ICMP6 58 + +/* Header sizes. */ +#if UIP_CONF_IPV6 +#define UIP_IPH_LEN 40 +#else /* UIP_CONF_IPV6 */ +#define UIP_IPH_LEN 20 /* Size of IP header */ +#endif /* UIP_CONF_IPV6 */ +#define UIP_UDPH_LEN 8 /* Size of UDP header */ +#define UIP_TCPH_LEN 20 /* Size of TCP header */ +#define UIP_IPUDPH_LEN (UIP_UDPH_LEN + UIP_IPH_LEN) /* Size of IP + + UDP + header */ +#define UIP_IPTCPH_LEN (UIP_TCPH_LEN + UIP_IPH_LEN) /* Size of IP + + TCP + header */ +#define UIP_TCPIP_HLEN UIP_IPTCPH_LEN + + +#if UIP_FIXEDADDR +extern const uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr; +#else /* UIP_FIXEDADDR */ +extern uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr; +#endif /* UIP_FIXEDADDR */ + + + +/** + * Representation of a 48-bit Ethernet address. + */ +#ifdef __ICCARM__ + #pragma pack(1) +#endif + +struct uip_eth_addr { + u8_t addr[6]; +} PACK_STRUCT_END; + +#ifdef __ICCARM__ + #pragma pack() +#endif + +/** + * Calculate the Internet checksum over a buffer. + * + * The Internet checksum is the one's complement of the one's + * complement sum of all 16-bit words in the buffer. + * + * See RFC1071. + * + * \param buf A pointer to the buffer over which the checksum is to be + * computed. + * + * \param len The length of the buffer over which the checksum is to + * be computed. + * + * \return The Internet checksum of the buffer. + */ +u16_t uip_chksum(u16_t *buf, u16_t len); + +/** + * Calculate the IP header checksum of the packet header in uip_buf. + * + * The IP header checksum is the Internet checksum of the 20 bytes of + * the IP header. + * + * \return The IP header checksum of the IP header in the uip_buf + * buffer. + */ +u16_t uip_ipchksum(void); + +/** + * Calculate the TCP checksum of the packet in uip_buf and uip_appdata. + * + * The TCP checksum is the Internet checksum of data contents of the + * TCP segment, and a pseudo-header as defined in RFC793. + * + * \return The TCP checksum of the TCP segment in uip_buf and pointed + * to by uip_appdata. + */ +u16_t uip_tcpchksum(void); + +/** + * Calculate the UDP checksum of the packet in uip_buf and uip_appdata. + * + * The UDP checksum is the Internet checksum of data contents of the + * UDP segment, and a pseudo-header as defined in RFC768. + * + * \return The UDP checksum of the UDP segment in uip_buf and pointed + * to by uip_appdata. + */ +u16_t uip_udpchksum(void); + +/** + * Work out the fasted way of sending the data to the low level driver. + */ +int uip_fast_send( int xARP ); + +#endif /* __UIP_H__ */ + + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_arch.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_arch.h new file mode 100644 index 0000000..5ea4578 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_arch.h @@ -0,0 +1,138 @@ +/** + * \addtogroup uip + * {@ + */ + +/** + * \defgroup uiparch Architecture specific uIP functions + * @{ + * + * The functions in the architecture specific module implement the IP + * check sum and 32-bit additions. + * + * The IP checksum calculation is the most computationally expensive + * operation in the TCP/IP stack and it therefore pays off to + * implement this in efficient assembler. The purpose of the uip-arch + * module is to let the checksum functions to be implemented in + * architecture specific assembler. + * + */ + +/** + * \file + * Declarations of architecture specific functions. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip_arch.h,v 1.2 2006/06/07 09:15:19 adam Exp $ + * + */ + +#ifndef __UIP_ARCH_H__ +#define __UIP_ARCH_H__ + +#include "uip.h" + +/** + * Carry out a 32-bit addition. + * + * Because not all architectures for which uIP is intended has native + * 32-bit arithmetic, uIP uses an external C function for doing the + * required 32-bit additions in the TCP protocol processing. This + * function should add the two arguments and place the result in the + * global variable uip_acc32. + * + * \note The 32-bit integer pointed to by the op32 parameter and the + * result in the uip_acc32 variable are in network byte order (big + * endian). + * + * \param op32 A pointer to a 4-byte array representing a 32-bit + * integer in network byte order (big endian). + * + * \param op16 A 16-bit integer in host byte order. + */ +void uip_add32(u8_t *op32, u16_t op16); + +/** + * Calculate the Internet checksum over a buffer. + * + * The Internet checksum is the one's complement of the one's + * complement sum of all 16-bit words in the buffer. + * + * See RFC1071. + * + * \note This function is not called in the current version of uIP, + * but future versions might make use of it. + * + * \param buf A pointer to the buffer over which the checksum is to be + * computed. + * + * \param len The length of the buffer over which the checksum is to + * be computed. + * + * \return The Internet checksum of the buffer. + */ +u16_t uip_chksum(u16_t *buf, u16_t len); + +/** + * Calculate the IP header checksum of the packet header in uip_buf. + * + * The IP header checksum is the Internet checksum of the 20 bytes of + * the IP header. + * + * \return The IP header checksum of the IP header in the uip_buf + * buffer. + */ +u16_t uip_ipchksum(void); + +/** + * Calculate the TCP checksum of the packet in uip_buf and uip_appdata. + * + * The TCP checksum is the Internet checksum of data contents of the + * TCP segment, and a pseudo-header as defined in RFC793. + * + * \note The uip_appdata pointer that points to the packet data may + * point anywhere in memory, so it is not possible to simply calculate + * the Internet checksum of the contents of the uip_buf buffer. + * + * \return The TCP checksum of the TCP segment in uip_buf and pointed + * to by uip_appdata. + */ +u16_t uip_tcpchksum(void); + +u16_t uip_udpchksum(void); + +/** @} */ +/** @} */ + +#endif /* __UIP_ARCH_H__ */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_arp.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_arp.c new file mode 100644 index 0000000..d105226 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_arp.c @@ -0,0 +1,466 @@ +/** + * \addtogroup uip + * @{ + */ + +/** + * \defgroup uiparp uIP Address Resolution Protocol + * @{ + * + * The Address Resolution Protocol ARP is used for mapping between IP + * addresses and link level addresses such as the Ethernet MAC + * addresses. ARP uses broadcast queries to ask for the link level + * address of a known IP address and the host which is configured with + * the IP address for which the query was meant, will respond with its + * link level address. + * + * \note This ARP implementation only supports Ethernet. + */ + +/** + * \file + * Implementation of the ARP Address Resolution Protocol. + * \author Adam Dunkels + * + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip_arp.c,v 1.8 2006/06/02 23:36:21 adam Exp $ + * + */ +#include "uip_arp.h" + +#include + +#ifdef __ICCARM__ + #pragma pack( 1 ) +#endif +struct arp_hdr +{ + struct uip_eth_hdr ethhdr; + u16_t hwtype; + u16_t protocol; + u8_t hwlen; + u8_t protolen; + u16_t opcode; + struct uip_eth_addr shwaddr; + u16_t sipaddr[2]; + struct uip_eth_addr dhwaddr; + u16_t dipaddr[2]; +} PACK_STRUCT_END; + +#ifdef __ICCARM__ + #pragma pack() +#endif +#ifdef __ICCARM__ + #pragma pack( 1 ) +#endif +struct ethip_hdr +{ + struct uip_eth_hdr ethhdr; + + /* IP header. */ + u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; + u16_t ipchksum; + u16_t srcipaddr[2], destipaddr[2]; +} PACK_STRUCT_END; + +#ifdef __ICCARM__ + #pragma pack() +#endif +#define ARP_REQUEST 1 +#define ARP_REPLY 2 + +#define ARP_HWTYPE_ETH 1 + +struct arp_entry +{ + u16_t ipaddr[2]; + struct uip_eth_addr ethaddr; + u8_t time; +}; + +static const struct uip_eth_addr broadcast_ethaddr = { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } }; +static const u16_t broadcast_ipaddr[2] = { 0xffff, 0xffff }; + +static struct arp_entry arp_table[UIP_ARPTAB_SIZE]; +static u16_t ipaddr[2]; +static u8_t i, c; + +static u8_t arptime; +static u8_t tmpage; + +#define BUF ( ( struct arp_hdr * ) &uip_buf[0] ) +#define IPBUF ( ( struct ethip_hdr * ) &uip_buf[0] ) + +/*-----------------------------------------------------------------------------------*/ + +/** + * Initialize the ARP module. + * + */ + +/*-----------------------------------------------------------------------------------*/ +void uip_arp_init( void ) +{ + for( i = 0; i < UIP_ARPTAB_SIZE; ++i ) + { + memset( arp_table[i].ipaddr, 0, 4 ); + } +} + +/*-----------------------------------------------------------------------------------*/ + +/** + * Periodic ARP processing function. + * + * This function performs periodic timer processing in the ARP module + * and should be called at regular intervals. The recommended interval + * is 10 seconds between the calls. + * + */ + +/*-----------------------------------------------------------------------------------*/ +void uip_arp_timer( void ) +{ + struct arp_entry *tabptr; + + ++arptime; + for( i = 0; i < UIP_ARPTAB_SIZE; ++i ) + { + tabptr = &arp_table[i]; + if( (tabptr->ipaddr[0] | tabptr->ipaddr[1]) != 0 && arptime - tabptr->time >= UIP_ARP_MAXAGE ) + { + memset( tabptr->ipaddr, 0, 4 ); + } + } +} + +/*-----------------------------------------------------------------------------------*/ +static void uip_arp_update( u16_t *ipaddr, struct uip_eth_addr *ethaddr ) +{ + register struct arp_entry *tabptr; + + /* Walk through the ARP mapping table and try to find an entry to + update. If none is found, the IP -> MAC address mapping is + inserted in the ARP table. */ + for( i = 0; i < UIP_ARPTAB_SIZE; ++i ) + { + tabptr = &arp_table[i]; + + /* Only check those entries that are actually in use. */ + if( tabptr->ipaddr[0] != 0 && tabptr->ipaddr[1] != 0 ) + { + /* Check if the source IP address of the incoming packet matches + the IP address in this ARP table entry. */ + if( ipaddr[0] == tabptr->ipaddr[0] && ipaddr[1] == tabptr->ipaddr[1] ) + { + /* An old entry found, update this and return. */ + memcpy( tabptr->ethaddr.addr, ethaddr->addr, 6 ); + tabptr->time = arptime; + + return; + } + } + } + + /* If we get here, no existing ARP table entry was found, so we + create one. */ + + /* First, we try to find an unused entry in the ARP table. */ + for( i = 0; i < UIP_ARPTAB_SIZE; ++i ) + { + tabptr = &arp_table[i]; + if( tabptr->ipaddr[0] == 0 && tabptr->ipaddr[1] == 0 ) + { + break; + } + } + + /* If no unused entry is found, we try to find the oldest entry and + throw it away. */ + if( i == UIP_ARPTAB_SIZE ) + { + tmpage = 0; + c = 0; + for( i = 0; i < UIP_ARPTAB_SIZE; ++i ) + { + tabptr = &arp_table[i]; + if( arptime - tabptr->time > tmpage ) + { + tmpage = arptime - tabptr->time; + c = i; + } + } + + i = c; + tabptr = &arp_table[i]; + } + + /* Now, i is the ARP table entry which we will fill with the new + information. */ + memcpy( tabptr->ipaddr, ipaddr, 4 ); + memcpy( tabptr->ethaddr.addr, ethaddr->addr, 6 ); + tabptr->time = arptime; +} + +/*-----------------------------------------------------------------------------------*/ + +/** + * ARP processing for incoming IP packets + * + * This function should be called by the device driver when an IP + * packet has been received. The function will check if the address is + * in the ARP cache, and if so the ARP cache entry will be + * refreshed. If no ARP cache entry was found, a new one is created. + * + * This function expects an IP packet with a prepended Ethernet header + * in the uip_buf[] buffer, and the length of the packet in the global + * variable uip_len. + */ + +/*-----------------------------------------------------------------------------------*/ +#if 1 +void uip_arp_ipin( void ) +{ + uip_len -= sizeof( struct uip_eth_hdr ); + + /* Only insert/update an entry if the source IP address of the + incoming IP packet comes from a host on the local network. */ + if( (IPBUF->srcipaddr[0] & uip_netmask[0]) != (uip_hostaddr[0] & uip_netmask[0]) ) + { + return; + } + + if( (IPBUF->srcipaddr[1] & uip_netmask[1]) != (uip_hostaddr[1] & uip_netmask[1]) ) + { + return; + } + + uip_arp_update( IPBUF->srcipaddr, &(IPBUF->ethhdr.src) ); + + return; +} + +#endif /* 0 */ + +/*-----------------------------------------------------------------------------------*/ + +/** + * ARP processing for incoming ARP packets. + * + * This function should be called by the device driver when an ARP + * packet has been received. The function will act differently + * depending on the ARP packet type: if it is a reply for a request + * that we previously sent out, the ARP cache will be filled in with + * the values from the ARP reply. If the incoming ARP packet is an ARP + * request for our IP address, an ARP reply packet is created and put + * into the uip_buf[] buffer. + * + * When the function returns, the value of the global variable uip_len + * indicates whether the device driver should send out a packet or + * not. If uip_len is zero, no packet should be sent. If uip_len is + * non-zero, it contains the length of the outbound packet that is + * present in the uip_buf[] buffer. + * + * This function expects an ARP packet with a prepended Ethernet + * header in the uip_buf[] buffer, and the length of the packet in the + * global variable uip_len. + */ + +/*-----------------------------------------------------------------------------------*/ +void uip_arp_arpin( void ) +{ + if( uip_len < sizeof(struct arp_hdr) ) + { + uip_len = 0; + return; + } + + uip_len = 0; + + switch( BUF->opcode ) + { + case HTONS( ARP_REQUEST ): + /* ARP request. If it asked for our address, we send out a + reply. */ + if( uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr) ) + { + /* First, we register the one who made the request in our ARP + table, since it is likely that we will do more communication + with this host in the future. */ + uip_arp_update( BUF->sipaddr, &BUF->shwaddr ); + + /* The reply opcode is 2. */ + BUF->opcode = HTONS( 2 ); + + memcpy( BUF->dhwaddr.addr, BUF->shwaddr.addr, 6 ); + memcpy( BUF->shwaddr.addr, uip_ethaddr.addr, 6 ); + memcpy( BUF->ethhdr.src.addr, uip_ethaddr.addr, 6 ); + memcpy( BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6 ); + + BUF->dipaddr[0] = BUF->sipaddr[0]; + BUF->dipaddr[1] = BUF->sipaddr[1]; + BUF->sipaddr[0] = uip_hostaddr[0]; + BUF->sipaddr[1] = uip_hostaddr[1]; + + BUF->ethhdr.type = HTONS( UIP_ETHTYPE_ARP ); + uip_len = sizeof( struct arp_hdr ); + } + + break; + + case HTONS( ARP_REPLY ): + /* ARP reply. We insert or update the ARP table if it was meant + for us. */ + if( uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr) ) + { + uip_arp_update( BUF->sipaddr, &BUF->shwaddr ); + } + + break; + } + + return; +} + +/*-----------------------------------------------------------------------------------*/ + +/** + * Prepend Ethernet header to an outbound IP packet and see if we need + * to send out an ARP request. + * + * This function should be called before sending out an IP packet. The + * function checks the destination IP address of the IP packet to see + * what Ethernet MAC address that should be used as a destination MAC + * address on the Ethernet. + * + * If the destination IP address is in the local network (determined + * by logical ANDing of netmask and our IP address), the function + * checks the ARP cache to see if an entry for the destination IP + * address is found. If so, an Ethernet header is prepended and the + * function returns. If no ARP cache entry is found for the + * destination IP address, the packet in the uip_buf[] is replaced by + * an ARP request packet for the IP address. The IP packet is dropped + * and it is assumed that they higher level protocols (e.g., TCP) + * eventually will retransmit the dropped packet. + * + * If the destination IP address is not on the local network, the IP + * address of the default router is used instead. + * + * When the function returns, a packet is present in the uip_buf[] + * buffer, and the length of the packet is in the global variable + * uip_len. + */ + +/*-----------------------------------------------------------------------------------*/ +void uip_arp_out( void ) +{ + struct arp_entry *tabptr; + + /* Find the destination IP address in the ARP table and construct + the Ethernet header. If the destination IP addres isn't on the + local network, we use the default router's IP address instead. + + If not ARP table entry is found, we overwrite the original IP + packet with an ARP request for the IP address. */ + + /* First check if destination is a local broadcast. */ + if( uip_ipaddr_cmp(IPBUF->destipaddr, broadcast_ipaddr) ) + { + memcpy( IPBUF->ethhdr.dest.addr, broadcast_ethaddr.addr, 6 ); + } + else + { + /* Check if the destination address is on the local network. */ + if( !uip_ipaddr_maskcmp(IPBUF->destipaddr, uip_hostaddr, uip_netmask) ) + { + /* Destination address was not on the local network, so we need to + use the default router's IP address instead of the destination + address when determining the MAC address. */ + uip_ipaddr_copy( ipaddr, uip_draddr ); + } + else + { + /* Else, we use the destination IP address. */ + uip_ipaddr_copy( ipaddr, IPBUF->destipaddr ); + } + + for( i = 0; i < UIP_ARPTAB_SIZE; ++i ) + { + tabptr = &arp_table[i]; + if( uip_ipaddr_cmp(ipaddr, tabptr->ipaddr) ) + { + break; + } + } + + if( i == UIP_ARPTAB_SIZE ) + { + /* The destination address was not in our ARP table, so we + overwrite the IP packet with an ARP request. */ + memset( BUF->ethhdr.dest.addr, 0xff, 6 ); + memset( BUF->dhwaddr.addr, 0x00, 6 ); + memcpy( BUF->ethhdr.src.addr, uip_ethaddr.addr, 6 ); + memcpy( BUF->shwaddr.addr, uip_ethaddr.addr, 6 ); + + uip_ipaddr_copy( BUF->dipaddr, ipaddr ); + uip_ipaddr_copy( BUF->sipaddr, uip_hostaddr ); + BUF->opcode = HTONS( ARP_REQUEST ); /* ARP request. */ + BUF->hwtype = HTONS( ARP_HWTYPE_ETH ); + BUF->protocol = HTONS( UIP_ETHTYPE_IP ); + BUF->hwlen = 6; + BUF->protolen = 4; + BUF->ethhdr.type = HTONS( UIP_ETHTYPE_ARP ); + + uip_appdata = &uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN]; + + uip_len = sizeof( struct arp_hdr ); + return; + } + + /* Build an ethernet header. */ + memcpy( IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6 ); + } + + memcpy( IPBUF->ethhdr.src.addr, uip_ethaddr.addr, 6 ); + + IPBUF->ethhdr.type = HTONS( UIP_ETHTYPE_IP ); + + uip_len += sizeof( struct uip_eth_hdr ); +} + +/*-----------------------------------------------------------------------------------*/ + +/** @} */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_arp.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_arp.h new file mode 100644 index 0000000..b6b2b66 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_arp.h @@ -0,0 +1,152 @@ +/** + * \addtogroup uip + * @{ + */ + +/** + * \addtogroup uiparp + * @{ + */ + +/** + * \file + * Macros and definitions for the ARP module. + * \author Adam Dunkels + */ + + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip_arp.h,v 1.5 2006/06/11 21:46:39 adam Exp $ + * + */ + +#ifndef __UIP_ARP_H__ +#define __UIP_ARP_H__ + +#include "uip.h" + + +extern struct uip_eth_addr uip_ethaddr; + +/** + * The Ethernet header. + */ +#ifdef __ICCARM__ + #pragma pack(1) +#endif + +struct uip_eth_hdr { + struct uip_eth_addr dest; + struct uip_eth_addr src; + u16_t type; +}PACK_STRUCT_END; + +#ifdef __ICCARM__ + #pragma pack() +#endif + +#define UIP_ETHTYPE_ARP 0x0806 +#define UIP_ETHTYPE_IP 0x0800 +#define UIP_ETHTYPE_IP6 0x86dd + + +/* The uip_arp_init() function must be called before any of the other + ARP functions. */ +void uip_arp_init(void); + +/* The uip_arp_ipin() function should be called whenever an IP packet + arrives from the Ethernet. This function refreshes the ARP table or + inserts a new mapping if none exists. The function assumes that an + IP packet with an Ethernet header is present in the uip_buf buffer + and that the length of the packet is in the uip_len variable. */ +void uip_arp_ipin(void); +//#define uip_arp_ipin() + +/* The uip_arp_arpin() should be called when an ARP packet is received + by the Ethernet driver. This function also assumes that the + Ethernet frame is present in the uip_buf buffer. When the + uip_arp_arpin() function returns, the contents of the uip_buf + buffer should be sent out on the Ethernet if the uip_len variable + is > 0. */ +void uip_arp_arpin(void); + +/* The uip_arp_out() function should be called when an IP packet + should be sent out on the Ethernet. This function creates an + Ethernet header before the IP header in the uip_buf buffer. The + Ethernet header will have the correct Ethernet MAC destination + address filled in if an ARP table entry for the destination IP + address (or the IP address of the default router) is present. If no + such table entry is found, the IP packet is overwritten with an ARP + request and we rely on TCP to retransmit the packet that was + overwritten. In any case, the uip_len variable holds the length of + the Ethernet frame that should be transmitted. */ +void uip_arp_out(void); + +/* The uip_arp_timer() function should be called every ten seconds. It + is responsible for flushing old entries in the ARP table. */ +void uip_arp_timer(void); + +/** @} */ + +/** + * \addtogroup uipconffunc + * @{ + */ + + +/** + * Specifiy the Ethernet MAC address. + * + * The ARP code needs to know the MAC address of the Ethernet card in + * order to be able to respond to ARP queries and to generate working + * Ethernet headers. + * + * \note This macro only specifies the Ethernet MAC address to the ARP + * code. It cannot be used to change the MAC address of the Ethernet + * card. + * + * \param eaddr A pointer to a struct uip_eth_addr containing the + * Ethernet MAC address of the Ethernet card. + * + * \hideinitializer + */ +#define uip_setethaddr(eaddr) do {uip_ethaddr.addr[0] = eaddr.addr[0]; \ + uip_ethaddr.addr[1] = eaddr.addr[1];\ + uip_ethaddr.addr[2] = eaddr.addr[2];\ + uip_ethaddr.addr[3] = eaddr.addr[3];\ + uip_ethaddr.addr[4] = eaddr.addr[4];\ + uip_ethaddr.addr[5] = eaddr.addr[5];} while(0) + +/** @} */ +/** @} */ + +#endif /* __UIP_ARP_H__ */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_timer.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_timer.h new file mode 100644 index 0000000..e28e3ca --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uip_timer.h @@ -0,0 +1,86 @@ +/** + * \defgroup timer Timer library + * + * The timer library provides functions for setting, resetting and + * restarting timers, and for checking if a timer has expired. An + * application must "manually" check if its timers have expired; this + * is not done automatically. + * + * A timer is declared as a \c struct \c timer and all access to the + * timer is made by a pointer to the declared timer. + * + * \note The timer library uses the \ref clock "Clock library" to + * measure time. Intervals should be specified in the format used by + * the clock library. + * + * @{ + */ + + +/** + * \file + * Timer library header file. + * \author + * Adam Dunkels + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: timer.h,v 1.3 2006/06/11 21:46:39 adam Exp $ + */ +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#include "clock.h" + +/** + * A timer. + * + * This structure is used for declaring a timer. The timer must be set + * with timer_set() before it can be used. + * + * \hideinitializer + */ +struct timer { + clock_time_t start; + clock_time_t interval; +}; + +void timer_set(struct timer *t, clock_time_t interval); +void timer_reset(struct timer *t); +void timer_restart(struct timer *t); +int timer_expired(struct timer *t); + +#endif /* __TIMER_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uiplib.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uiplib.c new file mode 100644 index 0000000..afedc0d --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uiplib.c @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2004, Adam Dunkels and the Swedish Institute of + * Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uiplib.c,v 1.2 2006/06/12 08:00:31 adam Exp $ + * + */ +#include "uip.h" +#include "uiplib.h" + +/*-----------------------------------------------------------------------------------*/ +unsigned char uiplib_ipaddrconv( char *addrstr, unsigned char *ipaddr ) +{ + unsigned char tmp; + char c; + unsigned char i, j; + + tmp = 0; + + for( i = 0; i < 4; ++i ) + { + j = 0; + do + { + c = *addrstr; + ++j; + if( j > 4 ) + { + return 0; + } + + if( c == '.' || c == 0 ) + { + *ipaddr = tmp; + ++ipaddr; + tmp = 0; + } + else if( c >= '0' && c <= '9' ) + { + tmp = ( tmp * 10 ) + ( c - '0' ); + } + else + { + return 0; + } + + ++addrstr; + } while( c != '.' && c != 0 ); + } + + return 1; +} + +/*-----------------------------------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uiplib.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uiplib.h new file mode 100644 index 0000000..6eb0c66 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uiplib.h @@ -0,0 +1,71 @@ +/** + * \file + * Various uIP library functions. + * \author + * Adam Dunkels + * + */ + +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uiplib.h,v 1.1 2006/06/07 09:15:19 adam Exp $ + * + */ +#ifndef __UIPLIB_H__ +#define __UIPLIB_H__ + +/** + * \addtogroup uipconvfunc + * @{ + */ + +/** + * Convert a textual representation of an IP address to a numerical representation. + * + * This function takes a textual representation of an IP address in + * the form a.b.c.d and converts it into a 4-byte array that can be + * used by other uIP functions. + * + * \param addrstr A pointer to a string containing the IP address in + * textual form. + * + * \param addr A pointer to a 4-byte array that will be filled in with + * the numerical representation of the address. + * + * \retval 0 If the IP address could not be parsed. + * \retval Non-zero If the IP address was parsed. + */ +unsigned char uiplib_ipaddrconv(char *addrstr, unsigned char *addr); + +/** @} */ + +#endif /* __UIPLIB_H__ */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uipopt.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uipopt.h new file mode 100644 index 0000000..cc01001 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeRTOS-uIP/uipopt.h @@ -0,0 +1,535 @@ +/** + * \defgroup uipopt Configuration options for uIP + * @{ + * + * uIP is configured using the per-project configuration file + * uipopt.h. This file contains all compile-time options for uIP and + * should be tweaked to match each specific project. The uIP + * distribution contains a documented example "uipopt.h" that can be + * copied and modified for each project. + * + * \note Most of the configuration options in the uipopt.h should not + * be changed, but rather the per-project uip-conf.h file. + */ + +/** + * \file + * Configuration options for uIP. + * \author Adam Dunkels + * + * This file is used for tweaking various configuration options for + * uIP. You should make a copy of this file into one of your project's + * directories instead of editing this example "uipopt.h" file that + * comes with the uIP distribution. + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uipopt.h,v 1.4 2006/06/12 08:00:31 adam Exp $ + * + */ + +#ifndef __UIPOPT_H__ +#define __UIPOPT_H__ + +#ifndef UIP_LITTLE_ENDIAN +#define UIP_LITTLE_ENDIAN 3412 +#endif /* UIP_LITTLE_ENDIAN */ +#ifndef UIP_BIG_ENDIAN +#define UIP_BIG_ENDIAN 1234 +#endif /* UIP_BIG_ENDIAN */ + +#include "uip-conf.h" + +/*------------------------------------------------------------------------------*/ + +/** + * \name Static configuration options + * @{ + * + * These configuration options can be used for setting the IP address + * settings statically, but only if UIP_FIXEDADDR is set to 1. The + * configuration options for a specific node includes IP address, + * netmask and default router as well as the Ethernet address. The + * netmask, default router and Ethernet address are appliciable only + * if uIP should be run over Ethernet. + * + * All of these should be changed to suit your project. +*/ + +/** + * Determines if uIP should use a fixed IP address or not. + * + * If uIP should use a fixed IP address, the settings are set in the + * uipopt.h file. If not, the macros uip_sethostaddr(), + * uip_setdraddr() and uip_setnetmask() should be used instead. + * + * \hideinitializer + */ +#define UIP_FIXEDADDR 0 + +/** + * Ping IP address asignment. + * + * uIP uses a "ping" packets for setting its own IP address if this + * option is set. If so, uIP will start with an empty IP address and + * the destination IP address of the first incoming "ping" (ICMP echo) + * packet will be used for setting the hosts IP address. + * + * \note This works only if UIP_FIXEDADDR is 0. + * + * \hideinitializer + */ +#ifdef UIP_CONF_PINGADDRCONF +#define UIP_PINGADDRCONF UIP_CONF_PINGADDRCONF +#else /* UIP_CONF_PINGADDRCONF */ +#define UIP_PINGADDRCONF 0 +#endif /* UIP_CONF_PINGADDRCONF */ + + +/** + * Specifies if the uIP ARP module should be compiled with a fixed + * Ethernet MAC address or not. + * + * If this configuration option is 0, the macro uip_setethaddr() can + * be used to specify the Ethernet address at run-time. + * + * \hideinitializer + */ +#define UIP_FIXEDETHADDR 0 + +/** @} */ +/*------------------------------------------------------------------------------*/ +/** + * \name IP configuration options + * @{ + * + */ +/** + * The IP TTL (time to live) of IP packets sent by uIP. + * + * This should normally not be changed. + */ +#define UIP_TTL 64 + +/** + * Turn on support for IP packet reassembly. + * + * uIP supports reassembly of fragmented IP packets. This features + * requires an additonal amount of RAM to hold the reassembly buffer + * and the reassembly code size is approximately 700 bytes. The + * reassembly buffer is of the same size as the uip_buf buffer + * (configured by UIP_BUFSIZE). + * + * \note IP packet reassembly is not heavily tested. + * + * \hideinitializer + */ +#define UIP_REASSEMBLY 0 + +/** + * The maximum time an IP fragment should wait in the reassembly + * buffer before it is dropped. + * + */ +#define UIP_REASS_MAXAGE 40 + +/** @} */ + +/*------------------------------------------------------------------------------*/ +/** + * \name UDP configuration options + * @{ + */ + +/** + * Toggles wether UDP support should be compiled in or not. + * + * \hideinitializer + */ +#ifdef UIP_CONF_UDP +#define UIP_UDP UIP_CONF_UDP +#else /* UIP_CONF_UDP */ +#define UIP_UDP 0 +#endif /* UIP_CONF_UDP */ + +/** + * Toggles if UDP checksums should be used or not. + * + * \note Support for UDP checksums is currently not included in uIP, + * so this option has no function. + * + * \hideinitializer + */ +#ifdef UIP_CONF_UDP_CHECKSUMS +#define UIP_UDP_CHECKSUMS UIP_CONF_UDP_CHECKSUMS +#else +#define UIP_UDP_CHECKSUMS 0 +#endif + +/** + * The maximum amount of concurrent UDP connections. + * + * \hideinitializer + */ +#ifdef UIP_CONF_UDP_CONNS +#define UIP_UDP_CONNS UIP_CONF_UDP_CONNS +#else /* UIP_CONF_UDP_CONNS */ +#define UIP_UDP_CONNS 10 +#endif /* UIP_CONF_UDP_CONNS */ + +/** + * The name of the function that should be called when UDP datagrams arrive. + * + * \hideinitializer + */ + + +/** @} */ +/*------------------------------------------------------------------------------*/ +/** + * \name TCP configuration options + * @{ + */ + +/** + * Determines if support for opening connections from uIP should be + * compiled in. + * + * If the applications that are running on top of uIP for this project + * do not need to open outgoing TCP connections, this configration + * option can be turned off to reduce the code size of uIP. + * + * \hideinitializer + */ +#define UIP_ACTIVE_OPEN 1 + +/** + * The maximum number of simultaneously open TCP connections. + * + * Since the TCP connections are statically allocated, turning this + * configuration knob down results in less RAM used. Each TCP + * connection requires approximatly 30 bytes of memory. + * + * \hideinitializer + */ +#ifndef UIP_CONF_MAX_CONNECTIONS +#define UIP_CONNS 10 +#else /* UIP_CONF_MAX_CONNECTIONS */ +#define UIP_CONNS UIP_CONF_MAX_CONNECTIONS +#endif /* UIP_CONF_MAX_CONNECTIONS */ + + +/** + * The maximum number of simultaneously listening TCP ports. + * + * Each listening TCP port requires 2 bytes of memory. + * + * \hideinitializer + */ +#ifndef UIP_CONF_MAX_LISTENPORTS +#define UIP_LISTENPORTS 20 +#else /* UIP_CONF_MAX_LISTENPORTS */ +#define UIP_LISTENPORTS UIP_CONF_MAX_LISTENPORTS +#endif /* UIP_CONF_MAX_LISTENPORTS */ + +/** + * Determines if support for TCP urgent data notification should be + * compiled in. + * + * Urgent data (out-of-band data) is a rarely used TCP feature that + * very seldom would be required. + * + * \hideinitializer + */ +#define UIP_URGDATA 0 + +/** + * The initial retransmission timeout counted in timer pulses. + * + * This should not be changed. + */ +#define UIP_RTO 3 + +/** + * The maximum number of times a segment should be retransmitted + * before the connection should be aborted. + * + * This should not be changed. + */ +#define UIP_MAXRTX 8 + +/** + * The maximum number of times a SYN segment should be retransmitted + * before a connection request should be deemed to have been + * unsuccessful. + * + * This should not need to be changed. + */ +#define UIP_MAXSYNRTX 5 + +/** + * The TCP maximum segment size. + * + * This is should not be to set to more than + * UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN. + */ +#define UIP_TCP_MSS (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN) + +/** + * The size of the advertised receiver's window. + * + * Should be set low (i.e., to the size of the uip_buf buffer) is the + * application is slow to process incoming data, or high (32768 bytes) + * if the application processes data quickly. + * + * \hideinitializer + */ +#ifndef UIP_CONF_RECEIVE_WINDOW +#define UIP_RECEIVE_WINDOW UIP_TCP_MSS +#else +#define UIP_RECEIVE_WINDOW UIP_CONF_RECEIVE_WINDOW +#endif + +/** + * How long a connection should stay in the TIME_WAIT state. + * + * This configiration option has no real implication, and it should be + * left untouched. + */ +#define UIP_TIME_WAIT_TIMEOUT 120 + + +/** @} */ +/*------------------------------------------------------------------------------*/ +/** + * \name ARP configuration options + * @{ + */ + +/** + * The size of the ARP table. + * + * This option should be set to a larger value if this uIP node will + * have many connections from the local network. + * + * \hideinitializer + */ +#ifdef UIP_CONF_ARPTAB_SIZE +#define UIP_ARPTAB_SIZE UIP_CONF_ARPTAB_SIZE +#else +#define UIP_ARPTAB_SIZE 8 +#endif + +/** + * The maxium age of ARP table entries measured in 10ths of seconds. + * + * An UIP_ARP_MAXAGE of 120 corresponds to 20 minutes (BSD + * default). + */ +#define UIP_ARP_MAXAGE 120 + +/** @} */ + +/*------------------------------------------------------------------------------*/ + +/** + * \name General configuration options + * @{ + */ + +/** + * The size of the uIP packet buffer. + * + * The uIP packet buffer should not be smaller than 60 bytes, and does + * not need to be larger than 1500 bytes. Lower size results in lower + * TCP throughput, larger size results in higher TCP throughput. + * + * \hideinitializer + */ +#ifndef UIP_CONF_BUFFER_SIZE +#define UIP_BUFSIZE 1500 +#else /* UIP_CONF_BUFFER_SIZE */ +#define UIP_BUFSIZE UIP_CONF_BUFFER_SIZE +#endif /* UIP_CONF_BUFFER_SIZE */ + + +/** + * Determines if statistics support should be compiled in. + * + * The statistics is useful for debugging and to show the user. + * + * \hideinitializer + */ +#ifndef UIP_CONF_STATISTICS +#define UIP_STATISTICS 0 +#else /* UIP_CONF_STATISTICS */ +#define UIP_STATISTICS UIP_CONF_STATISTICS +#endif /* UIP_CONF_STATISTICS */ + +/** + * Determines if logging of certain events should be compiled in. + * + * This is useful mostly for debugging. The function uip_log() + * must be implemented to suit the architecture of the project, if + * logging is turned on. + * + * \hideinitializer + */ +#ifndef UIP_CONF_LOGGING +#define UIP_LOGGING 0 +#else /* UIP_CONF_LOGGING */ +#define UIP_LOGGING UIP_CONF_LOGGING +#endif /* UIP_CONF_LOGGING */ + +/** + * Broadcast support. + * + * This flag configures IP broadcast support. This is useful only + * together with UDP. + * + * \hideinitializer + * + */ +#ifndef UIP_CONF_BROADCAST +#define UIP_BROADCAST 0 +#else /* UIP_CONF_BROADCAST */ +#define UIP_BROADCAST UIP_CONF_BROADCAST +#endif /* UIP_CONF_BROADCAST */ + +/** + * Print out a uIP log message. + * + * This function must be implemented by the module that uses uIP, and + * is called by uIP whenever a log message is generated. + */ +void uip_log(char *msg); + +/** + * The link level header length. + * + * This is the offset into the uip_buf where the IP header can be + * found. For Ethernet, this should be set to 14. For SLIP, this + * should be set to 0. + * + * \hideinitializer + */ +#ifdef UIP_CONF_LLH_LEN +#define UIP_LLH_LEN UIP_CONF_LLH_LEN +#else /* UIP_CONF_LLH_LEN */ +#define UIP_LLH_LEN 14 +#endif /* UIP_CONF_LLH_LEN */ + +/** @} */ +/*------------------------------------------------------------------------------*/ +/** + * \name CPU architecture configuration + * @{ + * + * The CPU architecture configuration is where the endianess of the + * CPU on which uIP is to be run is specified. Most CPUs today are + * little endian, and the most notable exception are the Motorolas + * which are big endian. The BYTE_ORDER macro should be changed to + * reflect the CPU architecture on which uIP is to be run. + */ + +/** + * The byte order of the CPU architecture on which uIP is to be run. + * + * This option can be either BIG_ENDIAN (Motorola byte order) or + * LITTLE_ENDIAN (Intel byte order). + * + * \hideinitializer + */ +#define UIP_BYTE_ORDER UIP_CONF_BYTE_ORDER + +/** @} */ +/*------------------------------------------------------------------------------*/ + +/** + * \name Appication specific configurations + * @{ + * + * An uIP application is implemented using a single application + * function that is called by uIP whenever a TCP/IP event occurs. The + * name of this function must be registered with uIP at compile time + * using the UIP_APPCALL definition. + * + * uIP applications can store the application state within the + * uip_conn structure by specifying the type of the application + * structure by typedef:ing the type uip_tcp_appstate_t and uip_udp_appstate_t. + * + * The file containing the definitions must be included in the + * uipopt.h file. + * + * The following example illustrates how this can look. + \code + +void httpd_appcall(void); +#define UIP_APPCALL httpd_appcall + +struct httpd_state { + u8_t state; + u16_t count; + char *dataptr; + char *script; +}; +typedef struct httpd_state uip_tcp_appstate_t + \endcode + */ + +/** + * \var #define UIP_APPCALL + * + * The name of the application function that uIP should call in + * response to TCP/IP events. + * + */ + +/** + * \var typedef uip_tcp_appstate_t + * + * The type of the application state that is to be stored in the + * uip_conn structure. This usually is typedef:ed to a struct holding + * application state information. + */ + +/** + * \var typedef uip_udp_appstate_t + * + * The type of the application state that is to be stored in the + * uip_conn structure. This usually is typedef:ed to a struct holding + * application state information. + */ +/** @} */ +/** @} */ + +#endif /* __UIPOPT_H__ */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/http-strings.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/http-strings.c new file mode 100644 index 0000000..a3771dd --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/http-strings.c @@ -0,0 +1,486 @@ +const char http_http[8] = /* "http://" */ { 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, }; +const char http_200[5] = /* "200 " */ { 0x32, 0x30, 0x30, 0x20, }; +const char http_301[5] = /* "301 " */ { 0x33, 0x30, 0x31, 0x20, }; +const char http_302[5] = /* "302 " */ { 0x33, 0x30, 0x32, 0x20, }; +const char http_get[5] = /* "GET " */ { 0x47, 0x45, 0x54, 0x20, }; +const char http_10[9] = /* "HTTP/1.0" */ { 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, }; +const char http_11[9] = /* "HTTP/1.1" */ { 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, }; +const char http_content_type[15] = + +/* "content-type: " */ +{ 0x63, + 0x6f, + 0x6e, + 0x74, + 0x65, + 0x6e, + 0x74, + 0x2d, + 0x74, + 0x79, + 0x70, + 0x65, + 0x3a, + 0x20, +}; +const char http_texthtml[10] = /* "text/html" */ { 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_location[11] = /* "location: " */ { 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, }; +const char http_host[7] = /* "host: " */ { 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x20, }; +const char http_crnl[3] = /* "\r\n" */ { 0xd, 0xa, }; +const char http_index_html[12] = /* "/index.html" */ { 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_404_html[10] = /* "/404.html" */ { 0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_referer[9] = /* "Referer:" */ { 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x3a, }; +const char http_header_200[84] = + +/* "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{ 0x48, + 0x54, + 0x54, + 0x50, + 0x2f, + 0x31, + 0x2e, + 0x30, + 0x20, + 0x32, + 0x30, + 0x30, + 0x20, + 0x4f, + 0x4b, + 0xd, + 0xa, + 0x53, + 0x65, + 0x72, + 0x76, + 0x65, + 0x72, + 0x3a, + 0x20, + 0x75, + 0x49, + 0x50, + 0x2f, + 0x31, + 0x2e, + 0x30, + 0x20, + 0x68, + 0x74, + 0x74, + 0x70, + 0x3a, + 0x2f, + 0x2f, + 0x77, + 0x77, + 0x77, + 0x2e, + 0x73, + 0x69, + 0x63, + 0x73, + 0x2e, + 0x73, + 0x65, + 0x2f, + 0x7e, + 0x61, + 0x64, + 0x61, + 0x6d, + 0x2f, + 0x75, + 0x69, + 0x70, + 0x2f, + 0xd, + 0xa, + 0x43, + 0x6f, + 0x6e, + 0x6e, + 0x65, + 0x63, + 0x74, + 0x69, + 0x6f, + 0x6e, + 0x3a, + 0x20, + 0x63, + 0x6c, + 0x6f, + 0x73, + 0x65, + 0xd, + 0xa, +}; +const char http_header_404[91] = + +/* "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{ 0x48, + 0x54, + 0x54, + 0x50, + 0x2f, + 0x31, + 0x2e, + 0x30, + 0x20, + 0x34, + 0x30, + 0x34, + 0x20, + 0x4e, + 0x6f, + 0x74, + 0x20, + 0x66, + 0x6f, + 0x75, + 0x6e, + 0x64, + 0xd, + 0xa, + 0x53, + 0x65, + 0x72, + 0x76, + 0x65, + 0x72, + 0x3a, + 0x20, + 0x75, + 0x49, + 0x50, + 0x2f, + 0x31, + 0x2e, + 0x30, + 0x20, + 0x68, + 0x74, + 0x74, + 0x70, + 0x3a, + 0x2f, + 0x2f, + 0x77, + 0x77, + 0x77, + 0x2e, + 0x73, + 0x69, + 0x63, + 0x73, + 0x2e, + 0x73, + 0x65, + 0x2f, + 0x7e, + 0x61, + 0x64, + 0x61, + 0x6d, + 0x2f, + 0x75, + 0x69, + 0x70, + 0x2f, + 0xd, + 0xa, + 0x43, + 0x6f, + 0x6e, + 0x6e, + 0x65, + 0x63, + 0x74, + 0x69, + 0x6f, + 0x6e, + 0x3a, + 0x20, + 0x63, + 0x6c, + 0x6f, + 0x73, + 0x65, + 0xd, + 0xa, +}; +const char http_content_type_plain[29] = + +/* "Content-type: text/plain\r\n\r\n" */ +{ 0x43, + 0x6f, + 0x6e, + 0x74, + 0x65, + 0x6e, + 0x74, + 0x2d, + 0x74, + 0x79, + 0x70, + 0x65, + 0x3a, + 0x20, + 0x74, + 0x65, + 0x78, + 0x74, + 0x2f, + 0x70, + 0x6c, + 0x61, + 0x69, + 0x6e, + 0xd, + 0xa, + 0xd, + 0xa, +}; +const char http_content_type_html[28] = + +/* "Content-type: text/html\r\n\r\n" */ +{ 0x43, + 0x6f, + 0x6e, + 0x74, + 0x65, + 0x6e, + 0x74, + 0x2d, + 0x74, + 0x79, + 0x70, + 0x65, + 0x3a, + 0x20, + 0x74, + 0x65, + 0x78, + 0x74, + 0x2f, + 0x68, + 0x74, + 0x6d, + 0x6c, + 0xd, + 0xa, + 0xd, + 0xa, +}; +const char http_content_type_css[27] = + +/* "Content-type: text/css\r\n\r\n" */ +{ 0x43, + 0x6f, + 0x6e, + 0x74, + 0x65, + 0x6e, + 0x74, + 0x2d, + 0x74, + 0x79, + 0x70, + 0x65, + 0x3a, + 0x20, + 0x74, + 0x65, + 0x78, + 0x74, + 0x2f, + 0x63, + 0x73, + 0x73, + 0xd, + 0xa, + 0xd, + 0xa, +}; +const char http_content_type_text[28] = + +/* "Content-type: text/text\r\n\r\n" */ +{ 0x43, + 0x6f, + 0x6e, + 0x74, + 0x65, + 0x6e, + 0x74, + 0x2d, + 0x74, + 0x79, + 0x70, + 0x65, + 0x3a, + 0x20, + 0x74, + 0x65, + 0x78, + 0x74, + 0x2f, + 0x74, + 0x65, + 0x78, + 0x74, + 0xd, + 0xa, + 0xd, + 0xa, +}; +const char http_content_type_png[28] = + +/* "Content-type: image/png\r\n\r\n" */ +{ 0x43, + 0x6f, + 0x6e, + 0x74, + 0x65, + 0x6e, + 0x74, + 0x2d, + 0x74, + 0x79, + 0x70, + 0x65, + 0x3a, + 0x20, + 0x69, + 0x6d, + 0x61, + 0x67, + 0x65, + 0x2f, + 0x70, + 0x6e, + 0x67, + 0xd, + 0xa, + 0xd, + 0xa, +}; +const char http_content_type_gif[28] = + +/* "Content-type: image/gif\r\n\r\n" */ +{ 0x43, + 0x6f, + 0x6e, + 0x74, + 0x65, + 0x6e, + 0x74, + 0x2d, + 0x74, + 0x79, + 0x70, + 0x65, + 0x3a, + 0x20, + 0x69, + 0x6d, + 0x61, + 0x67, + 0x65, + 0x2f, + 0x67, + 0x69, + 0x66, + 0xd, + 0xa, + 0xd, + 0xa, +}; +const char http_content_type_jpg[29] = + +/* "Content-type: image/jpeg\r\n\r\n" */ +{ 0x43, + 0x6f, + 0x6e, + 0x74, + 0x65, + 0x6e, + 0x74, + 0x2d, + 0x74, + 0x79, + 0x70, + 0x65, + 0x3a, + 0x20, + 0x69, + 0x6d, + 0x61, + 0x67, + 0x65, + 0x2f, + 0x6a, + 0x70, + 0x65, + 0x67, + 0xd, + 0xa, + 0xd, + 0xa, +}; +const char http_content_type_binary[43] = + +/* "Content-type: application/octet-stream\r\n\r\n" */ +{ 0x43, + 0x6f, + 0x6e, + 0x74, + 0x65, + 0x6e, + 0x74, + 0x2d, + 0x74, + 0x79, + 0x70, + 0x65, + 0x3a, + 0x20, + 0x61, + 0x70, + 0x70, + 0x6c, + 0x69, + 0x63, + 0x61, + 0x74, + 0x69, + 0x6f, + 0x6e, + 0x2f, + 0x6f, + 0x63, + 0x74, + 0x65, + 0x74, + 0x2d, + 0x73, + 0x74, + 0x72, + 0x65, + 0x61, + 0x6d, + 0xd, + 0xa, + 0xd, + 0xa, +}; +const char http_html[6] = /* ".html" */ { 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_shtml[7] = /* ".shtml" */ { 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_htm[5] = /* ".htm" */ { 0x2e, 0x68, 0x74, 0x6d, }; +const char http_css[5] = /* ".css" */ { 0x2e, 0x63, 0x73, 0x73, }; +const char http_png[5] = /* ".png" */ { 0x2e, 0x70, 0x6e, 0x67, }; +const char http_gif[5] = /* ".gif" */ { 0x2e, 0x67, 0x69, 0x66, }; +const char http_jpg[5] = /* ".jpg" */ { 0x2e, 0x6a, 0x70, 0x67, }; +const char http_text[5] = /* ".txt" */ { 0x2e, 0x74, 0x78, 0x74, }; +const char http_txt[5] = /* ".txt" */ { 0x2e, 0x74, 0x78, 0x74, }; diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/http-strings.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/http-strings.h new file mode 100644 index 0000000..19ad23d --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/http-strings.h @@ -0,0 +1,34 @@ +extern const char http_http[8]; +extern const char http_200[5]; +extern const char http_301[5]; +extern const char http_302[5]; +extern const char http_get[5]; +extern const char http_10[9]; +extern const char http_11[9]; +extern const char http_content_type[15]; +extern const char http_texthtml[10]; +extern const char http_location[11]; +extern const char http_host[7]; +extern const char http_crnl[3]; +extern const char http_index_html[12]; +extern const char http_404_html[10]; +extern const char http_referer[9]; +extern const char http_header_200[84]; +extern const char http_header_404[91]; +extern const char http_content_type_plain[29]; +extern const char http_content_type_html[28]; +extern const char http_content_type_css[27]; +extern const char http_content_type_text[28]; +extern const char http_content_type_png[28]; +extern const char http_content_type_gif[28]; +extern const char http_content_type_jpg[29]; +extern const char http_content_type_binary[43]; +extern const char http_html[6]; +extern const char http_shtml[7]; +extern const char http_htm[5]; +extern const char http_css[5]; +extern const char http_png[5]; +extern const char http_gif[5]; +extern const char http_jpg[5]; +extern const char http_text[5]; +extern const char http_txt[5]; diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-cgi.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-cgi.c new file mode 100644 index 0000000..23851d3 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-cgi.c @@ -0,0 +1,169 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface + * \author + * Adam Dunkels + * + */ + +/* + * Copyright (c) 2001-2006, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $ + * + */ +#include "net/uip.h" +#include "net/psock.h" +#include "httpd.h" +#include "httpd-cgi.h" +#include "httpd-fs.h" + +#include +#include + +HTTPD_CGI_CALL( file, "file-stats", file_stats ); +HTTPD_CGI_CALL( tcp, "tcp-connections", tcp_stats ); +HTTPD_CGI_CALL( net, "net-stats", net_stats ); + +static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, NULL }; + +/*---------------------------------------------------------------------------*/ +static PT_THREAD( nullfunction ( struct httpd_state *s, char *ptr ) ) +{ + PSOCK_BEGIN( &s->sout ); + PSOCK_END( &s->sout ); +} + +/*---------------------------------------------------------------------------*/ +httpd_cgifunction httpd_cgi( char *name ) +{ + const struct httpd_cgi_call **f; + + /* Find the matching name in the table, return the function. */ + for( f = calls; *f != NULL; ++f ) + { + if( strncmp((*f)->name, name, strlen((*f)->name)) == 0 ) + { + return( *f )->function; + } + } + + return nullfunction; +} + +/*---------------------------------------------------------------------------*/ +static unsigned short generate_file_stats( void *arg ) +{ + char *f = ( char * ) arg; + return snprintf( ( char * ) uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f) ); +} + +/*---------------------------------------------------------------------------*/ +static PT_THREAD( file_stats ( struct httpd_state *s, char *ptr ) ) +{ + PSOCK_BEGIN( &s->sout ); + + PSOCK_GENERATOR_SEND( &s->sout, generate_file_stats, strchr(ptr, ' ') + 1 ); + + PSOCK_END( &s->sout ); +} + +/*---------------------------------------------------------------------------*/ +static const char closed[] = /* "CLOSED",*/ { 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0 }; +static const char syn_rcvd[] = /* "SYN-RCVD",*/ { 0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56, 0x44, 0 }; +static const char syn_sent[] = /* "SYN-SENT",*/ { 0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e, 0x54, 0 }; +static const char established[] = /* "ESTABLISHED",*/ { 0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x45, 0x44, 0 }; +static const char fin_wait_1[] = /* "FIN-WAIT-1",*/ { 0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, 0x54, 0x2d, 0x31, 0 }; +static const char fin_wait_2[] = /* "FIN-WAIT-2",*/ { 0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, 0x54, 0x2d, 0x32, 0 }; +static const char closing[] = /* "CLOSING",*/ { 0x43, 0x4c, 0x4f, 0x53, 0x49, 0x4e, 0x47, 0 }; +static const char time_wait[] = /* "TIME-WAIT,"*/ { 0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41, 0x49, 0x54, 0 }; +static const char last_ack[] = /* "LAST-ACK"*/ { 0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43, 0x4b, 0 }; + +static const char *states[] = { closed, syn_rcvd, syn_sent, established, fin_wait_1, fin_wait_2, closing, time_wait, last_ack }; + +static unsigned short generate_tcp_stats( void *arg ) +{ + struct uip_conn *conn; + struct httpd_state *s = ( struct httpd_state * ) arg; + + conn = &uip_conns[s->count]; + return snprintf( ( char * ) uip_appdata, UIP_APPDATA_SIZE, + "%d%u.%u.%u.%u:%u%s%u%u%c %c\r\n", htons(conn->lport), + htons(conn->ripaddr[0]) >> 8, htons(conn->ripaddr[0]) & 0xff, htons(conn->ripaddr[1]) >> 8, + htons(conn->ripaddr[1]) & 0xff, htons(conn->rport), states[conn->tcpstateflags & UIP_TS_MASK], conn->nrtx, conn->timer, + (uip_outstanding(conn)) ? '*' : ' ', (uip_stopped(conn)) ? '!' : ' ' ); +} + +/*---------------------------------------------------------------------------*/ +static PT_THREAD( tcp_stats ( struct httpd_state *s, char *ptr ) ) +{ + PSOCK_BEGIN( &s->sout ); + + for( s->count = 0; s->count < UIP_CONNS; ++s->count ) + { + if( (uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED ) + { + PSOCK_GENERATOR_SEND( &s->sout, generate_tcp_stats, s ); + } + } + + PSOCK_END( &s->sout ); +} + +/*---------------------------------------------------------------------------*/ +static unsigned short generate_net_stats( void *arg ) +{ + struct httpd_state *s = ( struct httpd_state * ) arg; + return snprintf( ( char * ) uip_appdata, UIP_APPDATA_SIZE, "%5u\n", (( uip_stats_t * ) &uip_stat)[s->count] ); +} + +static PT_THREAD( net_stats ( struct httpd_state *s, char *ptr ) ) +{ + PSOCK_BEGIN( &s->sout ); + +#if UIP_STATISTICS + for( s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t); ++s->count ) + { + PSOCK_GENERATOR_SEND( &s->sout, generate_net_stats, s ); + } + +#endif /* UIP_STATISTICS */ + + PSOCK_END( &s->sout ); +} + +/*---------------------------------------------------------------------------*/ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-cgi.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-cgi.h new file mode 100644 index 0000000..99b61fe --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-cgi.h @@ -0,0 +1,85 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface header file + * \author + * Adam Dunkels + * + */ + +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ +#ifndef __HTTPD_CGI_H__ +#define __HTTPD_CGI_H__ + +#include "net/psock.h" +#include "httpd.h" + +typedef PT_THREAD( (*httpd_cgifunction) ( struct httpd_state *, char * ) ); + +httpd_cgifunction httpd_cgi( char *name ); + +struct httpd_cgi_call +{ + const char *name; + const httpd_cgifunction function; +}; + +/** + * \brief HTTPD CGI function declaration + * \param name The C variable name of the function + * \param str The string name of the function, used in the script file + * \param function A pointer to the function that implements it + * + * This macro is used for declaring a HTTPD CGI + * function. This function is then added to the list of + * HTTPD CGI functions with the httpd_cgi_add() function. + * + * \hideinitializer + */ +#define HTTPD_CGI_CALL( name, str, function ) \ + static PT_THREAD( function ( struct httpd_state *, char * ) ); \ + static const struct httpd_cgi_call name = \ + { \ + str, function \ + } + +void httpd_cgi_init( void ); +#endif /* __HTTPD_CGI_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-fs.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-fs.c new file mode 100644 index 0000000..12084ce --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-fs.c @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.c,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-fsdata.h" + +#ifndef NULL +#define NULL 0 +#endif /* NULL */ + +#include "httpd-fsdata.c" + +#if HTTPD_FS_STATISTICS +static u16_t count[HTTPD_FS_NUMFILES]; +#endif /* HTTPD_FS_STATISTICS */ + +/*-----------------------------------------------------------------------------------*/ +static u8_t httpd_fs_strcmp( const char *str1, const char *str2 ) +{ + u8_t i; + i = 0; +loop: + if( str2[i] == 0 || str1[i] == '\r' || str1[i] == '\n' ) + { + return 0; + } + + if( str1[i] != str2[i] ) + { + return 1; + } + + ++i; + goto loop; +} + +/*-----------------------------------------------------------------------------------*/ +int httpd_fs_open( const char *name, struct httpd_fs_file *file ) +{ +#if HTTPD_FS_STATISTICS + u16_t i = 0; +#endif /* HTTPD_FS_STATISTICS */ + struct httpd_fsdata_file_noconst *f; + + for( f = ( struct httpd_fsdata_file_noconst * ) HTTPD_FS_ROOT; f != NULL; f = ( struct httpd_fsdata_file_noconst * ) f->next ) + { + if( httpd_fs_strcmp(name, f->name) == 0 ) + { + file->data = f->data; + file->len = f->len; +#if HTTPD_FS_STATISTICS + ++count[i]; +#endif /* HTTPD_FS_STATISTICS */ + return 1; + } + +#if HTTPD_FS_STATISTICS + ++i; +#endif /* HTTPD_FS_STATISTICS */ + } + + return 0; +} + +/*-----------------------------------------------------------------------------------*/ +void httpd_fs_init( void ) +{ +#if HTTPD_FS_STATISTICS + u16_t i; + for( i = 0; i < HTTPD_FS_NUMFILES; i++ ) + { + count[i] = 0; + } + +#endif /* HTTPD_FS_STATISTICS */ +} + +/*-----------------------------------------------------------------------------------*/ +#if HTTPD_FS_STATISTICS +u16_t httpd_fs_count( char *name ) +{ + struct httpd_fsdata_file_noconst *f; + u16_t i; + + i = 0; + for( f = ( struct httpd_fsdata_file_noconst * ) HTTPD_FS_ROOT; f != NULL; f = ( struct httpd_fsdata_file_noconst * ) f->next ) + { + if( httpd_fs_strcmp(name, f->name) == 0 ) + { + return count[i]; + } + + ++i; + } + + return 0; +} + +#endif /* HTTPD_FS_STATISTICS */ + +/*-----------------------------------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-fs.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-fs.h new file mode 100644 index 0000000..afc6bbc --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-fs.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FS_H__ +#define __HTTPD_FS_H__ + +#define HTTPD_FS_STATISTICS 1 + +struct httpd_fs_file +{ + char *data; + int len; +}; + +/* file must be allocated by caller and will be filled in + by the function. */ +int httpd_fs_open( const char *name, struct httpd_fs_file *file ); + +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 +u16_t httpd_fs_count( char *name ); +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ + +void httpd_fs_init( void ); +#endif /* __HTTPD_FS_H__ */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-fsdata.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-fsdata.h new file mode 100644 index 0000000..a2d2fc9 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd-fsdata.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fsdata.h,v 1.1 2006/06/17 22:41:14 adamdunkels Exp $ + */ +#ifndef __HTTPD_FSDATA_H__ +#define __HTTPD_FSDATA_H__ + +struct httpd_fsdata_file { + const struct httpd_fsdata_file *next; + const char *name; + const char *data; + const int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +struct httpd_fsdata_file_noconst { + struct httpd_fsdata_file *next; + char *name; + char *data; + int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +#endif /* __HTTPD_FSDATA_H__ */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd.c new file mode 100644 index 0000000..99564a9 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd.c @@ -0,0 +1,400 @@ +/** + * \addtogroup apps + * @{ + */ + +/** + * \defgroup httpd Web server + * @{ + * The uIP web server is a very simplistic implementation of an HTTP + * server. It can serve web pages and files from a read-only ROM + * filesystem, and provides a very small scripting language. + + */ + +/** + * \file + * Web server + * \author + * Adam Dunkels + */ + +/* + * Copyright (c) 2004, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd.c,v 1.2 2006/06/11 21:46:38 adam Exp $ + */ +#include "net/uip.h" +#include "apps/httpd/httpd.h" +#include "apps/httpd/httpd-fs.h" +#include "apps/httpd/httpd-cgi.h" +#include "apps/httpd/http-strings.h" + +#include + +#define STATE_WAITING 0 +#define STATE_OUTPUT 1 + +#define ISO_nl 0x0a +#define ISO_space 0x20 +#define ISO_bang 0x21 +#define ISO_percent 0x25 +#define ISO_period 0x2e +#define ISO_slash 0x2f +#define ISO_colon 0x3a + +/*---------------------------------------------------------------------------*/ +static unsigned short generate_part_of_file( void *state ) +{ + struct httpd_state *s = ( struct httpd_state * ) state; + + if( s->file.len > uip_mss() ) + { + s->len = uip_mss(); + } + else + { + s->len = s->file.len; + } + + memcpy( uip_appdata, s->file.data, s->len ); + + return s->len; +} + +/*---------------------------------------------------------------------------*/ +static PT_THREAD( send_file ( struct httpd_state *s ) ) +{ + PSOCK_BEGIN( &s->sout ); + + ( void ) PT_YIELD_FLAG; + + do + { + PSOCK_GENERATOR_SEND( &s->sout, generate_part_of_file, s ); + s->file.len -= s->len; + s->file.data += s->len; + } while( s->file.len > 0 ); + + PSOCK_END( &s->sout ); +} + +/*---------------------------------------------------------------------------*/ +static PT_THREAD( send_part_of_file ( struct httpd_state *s ) ) +{ + PSOCK_BEGIN( &s->sout ); + ( void ) PT_YIELD_FLAG; + + PSOCK_SEND( &s->sout, s->file.data, s->len ); + + PSOCK_END( &s->sout ); +} + +/*---------------------------------------------------------------------------*/ +static void next_scriptstate( struct httpd_state *s ) +{ + char *p; + p = strchr( s->scriptptr, ISO_nl ) + 1; + s->scriptlen -= ( unsigned short ) ( p - s->scriptptr ); + s->scriptptr = p; +} + +/*---------------------------------------------------------------------------*/ +static PT_THREAD( handle_script ( struct httpd_state *s ) ) +{ + char *ptr; + + PT_BEGIN( &s->scriptpt ); + ( void ) PT_YIELD_FLAG; + while( s->file.len > 0 ) + { + /* Check if we should start executing a script. */ + if( *s->file.data == ISO_percent && *(s->file.data + 1) == ISO_bang ) + { + s->scriptptr = s->file.data + 3; + s->scriptlen = s->file.len - 3; + if( *(s->scriptptr - 1) == ISO_colon ) + { + httpd_fs_open( s->scriptptr + 1, &s->file ); + PT_WAIT_THREAD( &s->scriptpt, send_file(s) ); + } + else + { + PT_WAIT_THREAD( &s->scriptpt, httpd_cgi(s->scriptptr) (s, s->scriptptr) ); + } + + next_scriptstate( s ); + + /* The script is over, so we reset the pointers and continue + sending the rest of the file. */ + s->file.data = s->scriptptr; + s->file.len = s->scriptlen; + } + else + { + /* See if we find the start of script marker in the block of HTML + to be sent. */ + if( s->file.len > uip_mss() ) + { + s->len = uip_mss(); + } + else + { + s->len = s->file.len; + } + + if( *s->file.data == ISO_percent ) + { + ptr = strchr( s->file.data + 1, ISO_percent ); + } + else + { + ptr = strchr( s->file.data, ISO_percent ); + } + + if( ptr != NULL && ptr != s->file.data ) + { + s->len = ( int ) ( ptr - s->file.data ); + if( s->len >= uip_mss() ) + { + s->len = uip_mss(); + } + } + + PT_WAIT_THREAD( &s->scriptpt, send_part_of_file(s) ); + s->file.data += s->len; + s->file.len -= s->len; + } + } + + PT_END( &s->scriptpt ); +} + +/*---------------------------------------------------------------------------*/ +static PT_THREAD( send_headers ( struct httpd_state *s, const char *statushdr ) ) +{ + char *ptr; + + PSOCK_BEGIN( &s->sout ); + ( void ) PT_YIELD_FLAG; + PSOCK_SEND_STR( &s->sout, statushdr ); + + ptr = strrchr( s->filename, ISO_period ); + if( ptr == NULL ) + { + PSOCK_SEND_STR( &s->sout, http_content_type_binary ); + } + else if( strncmp(http_html, ptr, 5) == 0 || strncmp(http_shtml, ptr, 6) == 0 ) + { + PSOCK_SEND_STR( &s->sout, http_content_type_html ); + } + else if( strncmp(http_css, ptr, 4) == 0 ) + { + PSOCK_SEND_STR( &s->sout, http_content_type_css ); + } + else if( strncmp(http_png, ptr, 4) == 0 ) + { + PSOCK_SEND_STR( &s->sout, http_content_type_png ); + } + else if( strncmp(http_gif, ptr, 4) == 0 ) + { + PSOCK_SEND_STR( &s->sout, http_content_type_gif ); + } + else if( strncmp(http_jpg, ptr, 4) == 0 ) + { + PSOCK_SEND_STR( &s->sout, http_content_type_jpg ); + } + else + { + PSOCK_SEND_STR( &s->sout, http_content_type_plain ); + } + + PSOCK_END( &s->sout ); +} + +/*---------------------------------------------------------------------------*/ +static PT_THREAD( handle_output ( struct httpd_state *s ) ) +{ + char *ptr; + + PT_BEGIN( &s->outputpt ); + ( void ) PT_YIELD_FLAG; + if( !httpd_fs_open(s->filename, &s->file) ) + { + httpd_fs_open( http_404_html, &s->file ); + strcpy( s->filename, http_404_html ); + PT_WAIT_THREAD( &s->outputpt, send_headers(s, http_header_404) ); + PT_WAIT_THREAD( &s->outputpt, send_file(s) ); + } + else + { + PT_WAIT_THREAD( &s->outputpt, send_headers(s, http_header_200) ); + ptr = strchr( s->filename, ISO_period ); + if( ptr != NULL && strncmp(ptr, http_shtml, 6) == 0 ) + { + PT_INIT( &s->scriptpt ); + PT_WAIT_THREAD( &s->outputpt, handle_script(s) ); + } + else + { + PT_WAIT_THREAD( &s->outputpt, send_file(s) ); + } + } + + PSOCK_CLOSE( &s->sout ); + PT_END( &s->outputpt ); +} + +/*---------------------------------------------------------------------------*/ +static PT_THREAD( handle_input ( struct httpd_state *s ) ) +{ + PSOCK_BEGIN( &s->sin ); + ( void ) PT_YIELD_FLAG; + PSOCK_READTO( &s->sin, ISO_space ); + + if( strncmp(s->inputbuf, http_get, 4) != 0 ) + { + PSOCK_CLOSE_EXIT( &s->sin ); + } + + PSOCK_READTO( &s->sin, ISO_space ); + + if( s->inputbuf[0] != ISO_slash ) + { + PSOCK_CLOSE_EXIT( &s->sin ); + } + + if( s->inputbuf[1] == ISO_space ) + { + strncpy( s->filename, http_index_html, sizeof(s->filename) ); + } + else + { + s->inputbuf[PSOCK_DATALEN( &s->sin ) - 1] = 0; + + /* Process any form input being sent to the server. */ + #if UIP_CONF_PROCESS_HTTPD_FORMS == 1 + { + extern void vApplicationProcessFormInput( char *pcInputString ); + vApplicationProcessFormInput( s->inputbuf ); + } + #endif + + strncpy( s->filename, &s->inputbuf[0], sizeof(s->filename) ); + } + + /* httpd_log_file(uip_conn->ripaddr, s->filename);*/ + s->state = STATE_OUTPUT; + + while( 1 ) + { + PSOCK_READTO( &s->sin, ISO_nl ); + + if( strncmp(s->inputbuf, http_referer, 8) == 0 ) + { + s->inputbuf[PSOCK_DATALEN( &s->sin ) - 2] = 0; + + /* httpd_log(&s->inputbuf[9]);*/ + } + } + + PSOCK_END( &s->sin ); +} + +/*---------------------------------------------------------------------------*/ +static void handle_connection( struct httpd_state *s ) +{ + handle_input( s ); + if( s->state == STATE_OUTPUT ) + { + handle_output( s ); + } +} + +/*---------------------------------------------------------------------------*/ +void httpd_appcall( void ) +{ + struct httpd_state *s = ( struct httpd_state * ) &( uip_conn->appstate ); + + if( uip_closed() || uip_aborted() || uip_timedout() ) + { + } + else if( uip_connected() ) + { + PSOCK_INIT( &s->sin, s->inputbuf, sizeof(s->inputbuf) - 1 ); + PSOCK_INIT( &s->sout, s->inputbuf, sizeof(s->inputbuf) - 1 ); + PT_INIT( &s->outputpt ); + s->state = STATE_WAITING; + + /* timer_set(&s->timer, CLOCK_SECOND * 100);*/ + s->timer = 0; + handle_connection( s ); + } + else if( s != NULL ) + { + if( uip_poll() ) + { + ++s->timer; + if( s->timer >= 20 ) + { + uip_abort(); + } + } + else + { + s->timer = 0; + } + + handle_connection( s ); + } + else + { + uip_abort(); + } +} + +/*---------------------------------------------------------------------------*/ + +/** + * \brief Initialize the web server + * + * This function initializes the web server and should be + * called at system boot-up. + */ +void httpd_init( void ) +{ + uip_listen( HTONS(80) ); +} + +/*---------------------------------------------------------------------------*/ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd.h new file mode 100644 index 0000000..cd2b891 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/httpd.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2001-2005, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ +#ifndef __HTTPD_H__ +#define __HTTPD_H__ + +#include "net/psock.h" +#include "httpd-fs.h" + +struct httpd_state +{ + unsigned char timer; + struct psock sin, sout; + struct pt outputpt, scriptpt; + char inputbuf[50]; + char filename[20]; + char state; + struct httpd_fs_file file; + int len; + char *scriptptr; + int scriptlen; + + unsigned short count; +}; + +void httpd_init( void ); +void httpd_appcall( void ); + +void httpd_log( char *msg ); +void httpd_log_file( u16_t *requester, char *file ); +#endif /* __HTTPD_H__ */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/makefsdata b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/makefsdata new file mode 100644 index 0000000..8d2715a --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/apps/httpd/makefsdata @@ -0,0 +1,78 @@ +#!/usr/bin/perl + +open(OUTPUT, "> httpd-fsdata.c"); + +chdir("httpd-fs"); + +opendir(DIR, "."); +@files = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); +closedir(DIR); + +foreach $file (@files) { + + if(-d $file && $file !~ /^\./) { + print "Processing directory $file\n"; + opendir(DIR, $file); + @newfiles = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); + closedir(DIR); + printf "Adding files @newfiles\n"; + @files = (@files, map { $_ = "$file/$_" } @newfiles); + next; + } +} + +foreach $file (@files) { + if(-f $file) { + + print "Adding file $file\n"; + + open(FILE, $file) || die "Could not open file $file\n"; + + $file =~ s-^-/-; + $fvar = $file; + $fvar =~ s-/-_-g; + $fvar =~ s-\.-_-g; + # for AVR, add PROGMEM here + print(OUTPUT "static const unsigned char data".$fvar."[] = {\n"); + print(OUTPUT "\t/* $file */\n\t"); + for($j = 0; $j < length($file); $j++) { + printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1))); + } + printf(OUTPUT "0,\n"); + + + $i = 0; + while(read(FILE, $data, 1)) { + if($i == 0) { + print(OUTPUT "\t"); + } + printf(OUTPUT "%#02x, ", unpack("C", $data)); + $i++; + if($i == 10) { + print(OUTPUT "\n"); + $i = 0; + } + } + print(OUTPUT "0};\n\n"); + close(FILE); + push(@fvars, $fvar); + push(@pfiles, $file); + } +} + +for($i = 0; $i < @fvars; $i++) { + $file = $pfiles[$i]; + $fvar = $fvars[$i]; + + if($i == 0) { + $prevfile = "NULL"; + } else { + $prevfile = "file" . $fvars[$i - 1]; + } + print(OUTPUT "const struct httpd_fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, "); + print(OUTPUT "data$fvar + ". (length($file) + 1) .", "); + print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n"); +} + +print(OUTPUT "#define HTTPD_FS_ROOT file$fvars[$i - 1]\n\n"); +print(OUTPUT "#define HTTPD_FS_NUMFILES $i\n"); diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/clock-arch.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/clock-arch.h new file mode 100644 index 0000000..73d32e2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/clock-arch.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +#include "FreeRTOS.h" + +typedef portTickType clock_time_t; +#define CLOCK_CONF_SECOND configTICK_RATE_HZ + +#endif /* __CLOCK_ARCH_H__ */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/lc-switch.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/lc-switch.h new file mode 100644 index 0000000..17c8811 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/lc-switch.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2004-2005, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: lc-switch.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \addtogroup lc + * @{ + */ + +/** + * \file + * Implementation of local continuations based on switch() statment + * \author Adam Dunkels + * + * This implementation of local continuations uses the C switch() + * statement to resume execution of a function somewhere inside the + * function's body. The implementation is based on the fact that + * switch() statements are able to jump directly into the bodies of + * control structures such as if() or while() statmenets. + * + * This implementation borrows heavily from Simon Tatham's coroutines + * implementation in C: + * http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html + */ + +#ifndef __LC_SWITCH_H__ +#define __LC_SWTICH_H__ + +/* WARNING! lc implementation using switch() does not work if an + LC_SET() is done within another switch() statement! */ + +/** \hideinitializer */ +typedef unsigned short lc_t; + +#define LC_INIT(s) s = 0; + +#define LC_RESUME(s) switch(s) { case 0: + +#define LC_SET(s) s = __LINE__; case __LINE__: + +#define LC_END(s) } + +#endif /* __LC_SWITCH_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/lc.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/lc.h new file mode 100644 index 0000000..3ad83cd --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/lc.h @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2004-2005, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: lc.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \addtogroup pt + * @{ + */ + +/** + * \defgroup lc Local continuations + * @{ + * + * Local continuations form the basis for implementing protothreads. A + * local continuation can be set in a specific function to + * capture the state of the function. After a local continuation has + * been set can be resumed in order to restore the state of the + * function at the point where the local continuation was set. + * + * + */ + +/** + * \file lc.h + * Local continuations + * \author + * Adam Dunkels + * + */ + +#ifdef DOXYGEN +/** + * Initialize a local continuation. + * + * This operation initializes the local continuation, thereby + * unsetting any previously set continuation state. + * + * \hideinitializer + */ +#define LC_INIT(lc) + +/** + * Set a local continuation. + * + * The set operation saves the state of the function at the point + * where the operation is executed. As far as the set operation is + * concerned, the state of the function does not include the + * call-stack or local (automatic) variables, but only the program + * counter and such CPU registers that needs to be saved. + * + * \hideinitializer + */ +#define LC_SET(lc) + +/** + * Resume a local continuation. + * + * The resume operation resumes a previously set local continuation, thus + * restoring the state in which the function was when the local + * continuation was set. If the local continuation has not been + * previously set, the resume operation does nothing. + * + * \hideinitializer + */ +#define LC_RESUME(lc) + +/** + * Mark the end of local continuation usage. + * + * The end operation signifies that local continuations should not be + * used any more in the function. This operation is not needed for + * most implementations of local continuation, but is required by a + * few implementations. + * + * \hideinitializer + */ +#define LC_END(lc) + +/** + * \var typedef lc_t; + * + * The local continuation type. + * + * \hideinitializer + */ +#endif /* DOXYGEN */ + +#ifndef __LC_H__ +#define __LC_H__ + +#ifdef LC_CONF_INCLUDE +#include LC_CONF_INCLUDE +#else +#include "lc-switch.h" +#endif /* LC_CONF_INCLUDE */ + +#endif /* __LC_H__ */ + +/** @} */ +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/pack_struct_end.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/pack_struct_end.h new file mode 100644 index 0000000..a23febe --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/pack_struct_end.h @@ -0,0 +1,33 @@ +#ifdef __GNUC__ + __attribute__( (packed) ); +#endif + +#ifdef _SH + #ifdef __RENESAS__ + ; + #pragma unpack + #endif +#endif + +#ifdef __RX + #ifdef __RENESAS__ + ; + /* Nothing to do. */ + #endif +#endif + + +#ifdef __ICCRX__ + ; + #pragma pack() +#endif + +#ifdef __ICCARM__ + ; + #pragma pack() +#endif + + +#ifdef __CC_ARM + ; +#endif diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/pack_struct_start.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/pack_struct_start.h new file mode 100644 index 0000000..49a4dc9 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/pack_struct_start.h @@ -0,0 +1,34 @@ +#ifdef __GNUC__ + +/* Nothing to do here. */ +; +#endif + +/* Used by SH2A port. */ +#ifdef _SH + #ifdef __RENESAS__ + #pragma pack 1 + #endif +#endif + + +#ifdef __RX + #ifdef __RENESAS__ + /* Nothing to do. */ + #endif +#endif + + +#ifdef __ICCRX__ + #pragma pack(1) +#endif + + +#ifdef __ICCARM__ + #pragma pack(1) +#endif + +#ifdef __CC_ARM + __packed +#endif + diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/psock.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/psock.h new file mode 100644 index 0000000..8d41258 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/psock.h @@ -0,0 +1,380 @@ +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: psock.h,v 1.3 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \defgroup psock Protosockets library + * @{ + * + * The protosocket library provides an interface to the uIP stack that is + * similar to the traditional BSD socket interface. Unlike programs + * written for the ordinary uIP event-driven interface, programs + * written with the protosocket library are executed in a sequential + * fashion and does not have to be implemented as explicit state + * machines. + * + * Protosockets only work with TCP connections. + * + * The protosocket library uses \ref pt protothreads to provide + * sequential control flow. This makes the protosockets lightweight in + * terms of memory, but also means that protosockets inherits the + * functional limitations of protothreads. Each protosocket lives only + * within a single function. Automatic variables (stack variables) are + * not retained across a protosocket library function call. + * + * \note Because the protosocket library uses protothreads, local + * variables will not always be saved across a call to a protosocket + * library function. It is therefore advised that local variables are + * used with extreme care. + * + * The protosocket library provides functions for sending data without + * having to deal with retransmissions and acknowledgements, as well + * as functions for reading data without having to deal with data + * being split across more than one TCP segment. + * + * Because each protosocket runs as a protothread, the protosocket has to be + * started with a call to PSOCK_BEGIN() at the start of the function + * in which the protosocket is used. Similarly, the protosocket protothread can + * be terminated by a call to PSOCK_EXIT(). + * + */ + +/** + * \file + * Protosocket library header file + * \author + * Adam Dunkels + * + */ + +#ifndef __PSOCK_H__ +#define __PSOCK_H__ + +#include "uipopt.h" +#include "pt.h" + + /* + * The structure that holds the state of a buffer. + * + * This structure holds the state of a uIP buffer. The structure has + * no user-visible elements, but is used through the functions + * provided by the library. + * + */ +struct psock_buf { + u8_t *ptr; + unsigned short left; +}; + +/** + * The representation of a protosocket. + * + * The protosocket structrure is an opaque structure with no user-visible + * elements. + */ +struct psock { + struct pt pt, psockpt; /* Protothreads - one that's using the psock + functions, and one that runs inside the + psock functions. */ + const u8_t *sendptr; /* Pointer to the next data to be sent. */ + u8_t *readptr; /* Pointer to the next data to be read. */ + + char *bufptr; /* Pointer to the buffer used for buffering + incoming data. */ + + u16_t sendlen; /* The number of bytes left to be sent. */ + u16_t readlen; /* The number of bytes left to be read. */ + + struct psock_buf buf; /* The structure holding the state of the + input buffer. */ + unsigned int bufsize; /* The size of the input buffer. */ + + unsigned char state; /* The state of the protosocket. */ +}; + +void psock_init(struct psock *psock, char *buffer, unsigned int buffersize); +/** + * Initialize a protosocket. + * + * This macro initializes a protosocket and must be called before the + * protosocket is used. The initialization also specifies the input buffer + * for the protosocket. + * + * \param psock (struct psock *) A pointer to the protosocket to be + * initialized + * + * \param buffer (char *) A pointer to the input buffer for the + * protosocket. + * + * \param buffersize (unsigned int) The size of the input buffer. + * + * \hideinitializer + */ +#define PSOCK_INIT(psock, buffer, buffersize) \ + psock_init(psock, buffer, buffersize) + +/** + * Start the protosocket protothread in a function. + * + * This macro starts the protothread associated with the protosocket and + * must come before other protosocket calls in the function it is used. + * + * \param psock (struct psock *) A pointer to the protosocket to be + * started. + * + * \hideinitializer + */ +#define PSOCK_BEGIN(psock) PT_BEGIN(&((psock)->pt)) + +PT_THREAD(psock_send(struct psock *psock, const char *buf, unsigned int len)); +/** + * Send data. + * + * This macro sends data over a protosocket. The protosocket protothread blocks + * until all data has been sent and is known to have been received by + * the remote end of the TCP connection. + * + * \param psock (struct psock *) A pointer to the protosocket over which + * data is to be sent. + * + * \param data (char *) A pointer to the data that is to be sent. + * + * \param datalen (unsigned int) The length of the data that is to be + * sent. + * + * \hideinitializer + */ +#define PSOCK_SEND(psock, data, datalen) \ + PT_WAIT_THREAD(&((psock)->pt), psock_send(psock, data, datalen)) + +/** + * \brief Send a null-terminated string. + * \param psock Pointer to the protosocket. + * \param str The string to be sent. + * + * This function sends a null-terminated string over the + * protosocket. + * + * \hideinitializer + */ +#define PSOCK_SEND_STR(psock, str) \ + PT_WAIT_THREAD(&((psock)->pt), psock_send(psock, str, strlen(str))) + +PT_THREAD(psock_generator_send(struct psock *psock, + unsigned short (*f)(void *), void *arg)); + +/** + * \brief Generate data with a function and send it + * \param psock Pointer to the protosocket. + * \param generator Pointer to the generator function + * \param arg Argument to the generator function + * + * This function generates data and sends it over the + * protosocket. This can be used to dynamically generate + * data for a transmission, instead of generating the data + * in a buffer beforehand. This function reduces the need for + * buffer memory. The generator function is implemented by + * the application, and a pointer to the function is given + * as an argument with the call to PSOCK_GENERATOR_SEND(). + * + * The generator function should place the generated data + * directly in the uip_appdata buffer, and return the + * length of the generated data. The generator function is + * called by the protosocket layer when the data first is + * sent, and once for every retransmission that is needed. + * + * \hideinitializer + */ +#define PSOCK_GENERATOR_SEND(psock, generator, arg) \ + PT_WAIT_THREAD(&((psock)->pt), \ + psock_generator_send(psock, generator, arg)) + + +/** + * Close a protosocket. + * + * This macro closes a protosocket and can only be called from within the + * protothread in which the protosocket lives. + * + * \param psock (struct psock *) A pointer to the protosocket that is to + * be closed. + * + * \hideinitializer + */ +#define PSOCK_CLOSE(psock) uip_close() + +PT_THREAD(psock_readbuf(struct psock *psock)); +/** + * Read data until the buffer is full. + * + * This macro will block waiting for data and read the data into the + * input buffer specified with the call to PSOCK_INIT(). Data is read + * until the buffer is full.. + * + * \param psock (struct psock *) A pointer to the protosocket from which + * data should be read. + * + * \hideinitializer + */ +#define PSOCK_READBUF(psock) \ + PT_WAIT_THREAD(&((psock)->pt), psock_readbuf(psock)) + +PT_THREAD(psock_readto(struct psock *psock, unsigned char c)); +/** + * Read data up to a specified character. + * + * This macro will block waiting for data and read the data into the + * input buffer specified with the call to PSOCK_INIT(). Data is only + * read until the specifieed character appears in the data stream. + * + * \param psock (struct psock *) A pointer to the protosocket from which + * data should be read. + * + * \param c (char) The character at which to stop reading. + * + * \hideinitializer + */ +#define PSOCK_READTO(psock, c) \ + PT_WAIT_THREAD(&((psock)->pt), psock_readto(psock, c)) + +/** + * The length of the data that was previously read. + * + * This macro returns the length of the data that was previously read + * using PSOCK_READTO() or PSOCK_READ(). + * + * \param psock (struct psock *) A pointer to the protosocket holding the data. + * + * \hideinitializer + */ +#define PSOCK_DATALEN(psock) psock_datalen(psock) + +u16_t psock_datalen(struct psock *psock); + +/** + * Exit the protosocket's protothread. + * + * This macro terminates the protothread of the protosocket and should + * almost always be used in conjunction with PSOCK_CLOSE(). + * + * \sa PSOCK_CLOSE_EXIT() + * + * \param psock (struct psock *) A pointer to the protosocket. + * + * \hideinitializer + */ +#define PSOCK_EXIT(psock) PT_EXIT(&((psock)->pt)) + +/** + * Close a protosocket and exit the protosocket's protothread. + * + * This macro closes a protosocket and exits the protosocket's protothread. + * + * \param psock (struct psock *) A pointer to the protosocket. + * + * \hideinitializer + */ +#define PSOCK_CLOSE_EXIT(psock) \ + do { \ + PSOCK_CLOSE(psock); \ + PSOCK_EXIT(psock); \ + } while(0) + +/** + * Declare the end of a protosocket's protothread. + * + * This macro is used for declaring that the protosocket's protothread + * ends. It must always be used together with a matching PSOCK_BEGIN() + * macro. + * + * \param psock (struct psock *) A pointer to the protosocket. + * + * \hideinitializer + */ +#define PSOCK_END(psock) PT_END(&((psock)->pt)) + +char psock_newdata(struct psock *s); + +/** + * Check if new data has arrived on a protosocket. + * + * This macro is used in conjunction with the PSOCK_WAIT_UNTIL() + * macro to check if data has arrived on a protosocket. + * + * \param psock (struct psock *) A pointer to the protosocket. + * + * \hideinitializer + */ +#define PSOCK_NEWDATA(psock) psock_newdata(psock) + +/** + * Wait until a condition is true. + * + * This macro blocks the protothread until the specified condition is + * true. The macro PSOCK_NEWDATA() can be used to check if new data + * arrives when the protosocket is waiting. + * + * Typically, this macro is used as follows: + * + \code + PT_THREAD(thread(struct psock *s, struct timer *t)) + { + PSOCK_BEGIN(s); + + PSOCK_WAIT_UNTIL(s, PSOCK_NEWADATA(s) || timer_expired(t)); + + if(PSOCK_NEWDATA(s)) { + PSOCK_READTO(s, '\n'); + } else { + handle_timed_out(s); + } + + PSOCK_END(s); + } + \endcode + * + * \param psock (struct psock *) A pointer to the protosocket. + * \param condition The condition to wait for. + * + * \hideinitializer + */ +#define PSOCK_WAIT_UNTIL(psock, condition) \ + PT_WAIT_UNTIL(&((psock)->pt), (condition)); + +#define PSOCK_WAIT_THREAD(psock, condition) \ + PT_WAIT_THREAD(&((psock)->pt), (condition)) + +#endif /* __PSOCK_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/pt.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/pt.h new file mode 100644 index 0000000..00ddd44 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/pt.h @@ -0,0 +1,323 @@ +/* + * Copyright (c) 2004-2005, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: pt.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \addtogroup pt + * @{ + */ + +/** + * \file + * Protothreads implementation. + * \author + * Adam Dunkels + * + */ + +#ifndef __PT_H__ +#define __PT_H__ + +#include "lc.h" + +struct pt { + lc_t lc; +}; + +#define PT_WAITING 0 +#define PT_EXITED 1 +#define PT_ENDED 2 +#define PT_YIELDED 3 + +/** + * \name Initialization + * @{ + */ + +/** + * Initialize a protothread. + * + * Initializes a protothread. Initialization must be done prior to + * starting to execute the protothread. + * + * \param pt A pointer to the protothread control structure. + * + * \sa PT_SPAWN() + * + * \hideinitializer + */ +#define PT_INIT(pt) LC_INIT((pt)->lc) + +/** @} */ + +/** + * \name Declaration and definition + * @{ + */ + +/** + * Declaration of a protothread. + * + * This macro is used to declare a protothread. All protothreads must + * be declared with this macro. + * + * \param name_args The name and arguments of the C function + * implementing the protothread. + * + * \hideinitializer + */ +#define PT_THREAD(name_args) char name_args + +/** + * Declare the start of a protothread inside the C function + * implementing the protothread. + * + * This macro is used to declare the starting point of a + * protothread. It should be placed at the start of the function in + * which the protothread runs. All C statements above the PT_BEGIN() + * invokation will be executed each time the protothread is scheduled. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc) + +/** + * Declare the end of a protothread. + * + * This macro is used for declaring that a protothread ends. It must + * always be used together with a matching PT_BEGIN() macro. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \ + PT_INIT(pt); return PT_ENDED; } + +/** @} */ + +/** + * \name Blocked wait + * @{ + */ + +/** + * Block and wait until condition is true. + * + * This macro blocks the protothread until the specified condition is + * true. + * + * \param pt A pointer to the protothread control structure. + * \param condition The condition. + * + * \hideinitializer + */ +#define PT_WAIT_UNTIL(pt, condition) \ + do { \ + LC_SET((pt)->lc); \ + if(!(condition)) { \ + return PT_WAITING; \ + } \ + } while(0) + +/** + * Block and wait while condition is true. + * + * This function blocks and waits while condition is true. See + * PT_WAIT_UNTIL(). + * + * \param pt A pointer to the protothread control structure. + * \param cond The condition. + * + * \hideinitializer + */ +#define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond)) + +/** @} */ + +/** + * \name Hierarchical protothreads + * @{ + */ + +/** + * Block and wait until a child protothread completes. + * + * This macro schedules a child protothread. The current protothread + * will block until the child protothread completes. + * + * \note The child protothread must be manually initialized with the + * PT_INIT() function before this function is used. + * + * \param pt A pointer to the protothread control structure. + * \param thread The child protothread with arguments + * + * \sa PT_SPAWN() + * + * \hideinitializer + */ +#define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread)) + +/** + * Spawn a child protothread and wait until it exits. + * + * This macro spawns a child protothread and waits until it exits. The + * macro can only be used within a protothread. + * + * \param pt A pointer to the protothread control structure. + * \param child A pointer to the child protothread's control structure. + * \param thread The child protothread with arguments + * + * \hideinitializer + */ +#define PT_SPAWN(pt, child, thread) \ + do { \ + PT_INIT((child)); \ + PT_WAIT_THREAD((pt), (thread)); \ + } while(0) + +/** @} */ + +/** + * \name Exiting and restarting + * @{ + */ + +/** + * Restart the protothread. + * + * This macro will block and cause the running protothread to restart + * its execution at the place of the PT_BEGIN() call. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_RESTART(pt) \ + do { \ + PT_INIT(pt); \ + return PT_WAITING; \ + } while(0) + +/** + * Exit the protothread. + * + * This macro causes the protothread to exit. If the protothread was + * spawned by another protothread, the parent protothread will become + * unblocked and can continue to run. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_EXIT(pt) \ + do { \ + PT_INIT(pt); \ + return PT_EXITED; \ + } while(0) + +/** @} */ + +/** + * \name Calling a protothread + * @{ + */ + +/** + * Schedule a protothread. + * + * This function shedules a protothread. The return value of the + * function is non-zero if the protothread is running or zero if the + * protothread has exited. + * + * \param f The call to the C function implementing the protothread to + * be scheduled + * + * \hideinitializer + */ +#define PT_SCHEDULE(f) ((f) == PT_WAITING) + +/** @} */ + +/** + * \name Yielding from a protothread + * @{ + */ + +/** + * Yield from the current protothread. + * + * This function will yield the protothread, thereby allowing other + * processing to take place in the system. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_YIELD(pt) \ + do { \ + PT_YIELD_FLAG = 0; \ + LC_SET((pt)->lc); \ + if(PT_YIELD_FLAG == 0) { \ + return PT_YIELDED; \ + } \ + } while(0) + +/** + * \brief Yield from the protothread until a condition occurs. + * \param pt A pointer to the protothread control structure. + * \param cond The condition. + * + * This function will yield the protothread, until the + * specified condition evaluates to true. + * + * + * \hideinitializer + */ +#define PT_YIELD_UNTIL(pt, cond) \ + do { \ + PT_YIELD_FLAG = 0; \ + LC_SET((pt)->lc); \ + if((PT_YIELD_FLAG == 0) || !(cond)) { \ + return PT_YIELDED; \ + } \ + } while(0) + +/** @} */ + +#endif /* __PT_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uip.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uip.h new file mode 100644 index 0000000..3a0ed19 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uip.h @@ -0,0 +1,2184 @@ + + /** + * \addtogroup uip + * @{ + */ + +/** + * \file + * Header file for the uIP TCP/IP stack. + * \author Adam Dunkels + * \author Julien Abeille (IPv6 related code) + * \author Mathilde Durvy (IPv6 related code) + * + * The uIP TCP/IP stack header file contains definitions for a number + * of C macros that are used by uIP programs as well as internal uIP + * structures, TCP/IP header structures and function declarations. + * + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip.h,v 1.24 2009/04/06 13:18:50 nvt-se Exp $ + * + */ +#ifndef __UIP_H__ +#define __UIP_H__ + +#include "net/uipopt.h" +#include "uip-conf.h" + +/** + * Representation of an IP address. + * + */ +#if UIP_CONF_IPV6 != 0 + typedef union uip_ip6addr_t + { + u8_t u8[16]; /* Initializer, must come first!!! */ + u16_t u16[8]; + } uip_ip6addr_t; + + typedef uip_ip6addr_t uip_ipaddr_t; +#else /* UIP_CONF_IPV6 */ + #ifdef __CC_ARM + __packed /* The ARM compiler insists on this being packed, but with other compilers packing it generates a warning as it will be packed anyway. */ + #endif + + typedef union uip_ip4addr_t + { + u8_t u8[4]; /* Initializer, must come first!!! */ + u16_t u16[2]; + } uip_ip4addr_t; + typedef uip_ip4addr_t uip_ipaddr_t; +#endif /* UIP_CONF_IPV6 */ + +/*---------------------------------------------------------------------------*/ + +/** \brief 16 bit 802.15.4 address */ +struct uip_802154_shortaddr +{ + u8_t addr[2]; +}; + +/** \brief 64 bit 802.15.4 address */ +struct uip_802154_longaddr +{ + u8_t addr[8]; +}; + +/** \brief 802.11 address */ +struct uip_80211_addr +{ + u8_t addr[6]; +}; + +/** \brief 802.3 address */ +#include "net/pack_struct_start.h" +struct uip_eth_addr +{ + u8_t addr[6]; +} +#include "net/pack_struct_end.h" + +#ifdef UIP_CONF_LL_802154 + + /** \brief 802.15.4 address */ + typedef struct uip_802154_longaddr uip_lladdr_t; + #define UIP_802154_SHORTADDR_LEN 2 + #define UIP_802154_LONGADDR_LEN 8 + #define UIP_LLADDR_LEN UIP_802154_LONGADDR_LEN +#else /*UIP_CONF_LL_802154*/ + #ifdef UIP_CONF_LL_80211 + /** \brief 802.11 address */ + typedef struct uip_80211_addr uip_lladdr_t; + #define UIP_LLADDR_LEN 6 + #else /*UIP_CONF_LL_80211*/ + + /** \brief Ethernet address */ + typedef struct uip_eth_addr uip_lladdr_t; + + #define UIP_LLADDR_LEN 6 + #endif /*UIP_CONF_LL_80211*/ +#endif /*UIP_CONF_LL_802154*/ + +//_RB_#include "net/tcpip.h" + +/*---------------------------------------------------------------------------*/ + +/* First, the functions that should be called from the + * system. Initialization, the periodic timer, and incoming packets are + * handled by the following three functions. + */ + +/** + * \defgroup uipconffunc uIP configuration functions + * @{ + * + * The uIP configuration functions are used for setting run-time + * parameters in uIP such as IP addresses. + */ + +/** + * Set the IP address of this host. + * + * The IP address is represented as a 4-byte array where the first + * octet of the IP address is put in the first member of the 4-byte + * array. + * + * Example: + \code + + uip_ipaddr_t addr; + + uip_ipaddr(&addr, 192,168,1,2); + uip_sethostaddr(&addr); + + \endcode + * \param addr A pointer to an IP address of type uip_ipaddr_t; + * + * \sa uip_ipaddr() + * + * \hideinitializer + */ +#define uip_sethostaddr( addr ) uip_ipaddr_copy( &uip_hostaddr, (addr) ) + +/** + * Get the IP address of this host. + * + * The IP address is represented as a 4-byte array where the first + * octet of the IP address is put in the first member of the 4-byte + * array. + * + * Example: + \code + uip_ipaddr_t hostaddr; + + uip_gethostaddr(&hostaddr); + \endcode + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the currently configured IP address. + * + * \hideinitializer + */ +#define uip_gethostaddr( addr ) uip_ipaddr_copy( (addr), &uip_hostaddr ) + +/** + * Set the default router's IP address. + * + * \param addr A pointer to a uip_ipaddr_t variable containing the IP + * address of the default router. + * + * \sa uip_ipaddr() + * + * \hideinitializer + */ +#define uip_setdraddr( addr ) uip_ipaddr_copy( &uip_draddr, (addr) ) + +/** + * Set the netmask. + * + * \param addr A pointer to a uip_ipaddr_t variable containing the IP + * address of the netmask. + * + * \sa uip_ipaddr() + * + * \hideinitializer + */ +#define uip_setnetmask( addr ) uip_ipaddr_copy( &uip_netmask, (addr) ) + +/** + * Get the default router's IP address. + * + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the IP address of the default router. + * + * \hideinitializer + */ +#define uip_getdraddr( addr ) uip_ipaddr_copy( (addr), &uip_draddr ) + +/** + * Get the netmask. + * + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the value of the netmask. + * + * \hideinitializer + */ +#define uip_getnetmask( addr ) uip_ipaddr_copy( (addr), &uip_netmask ) + +/** @} */ + +/** + * \defgroup uipinit uIP initialization functions + * @{ + * + * The uIP initialization functions are used for booting uIP. + */ + +/** + * uIP initialization function. + * + * This function should be called at boot up to initilize the uIP + * TCP/IP stack. + */ +void uip_init( void ); + +/** + * uIP initialization function. + * + * This function may be used at boot time to set the initial ip_id. + */ +void uip_setipid( u16_t id ); + +/** @} */ + +/** + * \defgroup uipdevfunc uIP device driver functions + * @{ + * + * These functions are used by a network device driver for interacting + * with uIP. + */ + +/** + * Process an incoming packet. + * + * This function should be called when the device driver has received + * a packet from the network. The packet from the device driver must + * be present in the uip_buf buffer, and the length of the packet + * should be placed in the uip_len variable. + * + * When the function returns, there may be an outbound packet placed + * in the uip_buf packet buffer. If so, the uip_len variable is set to + * the length of the packet. If no packet is to be sent out, the + * uip_len variable is set to 0. + * + * The usual way of calling the function is presented by the source + * code below. + \code + uip_len = devicedriver_poll(); + if(uip_len > 0) { + uip_input(); + if(uip_len > 0) { + devicedriver_send(); + } + } + \endcode + * + * \note If you are writing a uIP device driver that needs ARP + * (Address Resolution Protocol), e.g., when running uIP over + * Ethernet, you will need to call the uIP ARP code before calling + * this function: + \code + #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) + uip_len = ethernet_devicedrver_poll(); + if(uip_len > 0) { + if(BUF->type == HTONS(UIP_ETHTYPE_IP)) { + uip_arp_ipin(); + uip_input(); + if(uip_len > 0) { + uip_arp_out(); + ethernet_devicedriver_send(); + } + } else if(BUF->type == HTONS(UIP_ETHTYPE_ARP)) { + uip_arp_arpin(); + if(uip_len > 0) { + ethernet_devicedriver_send(); + } + } + \endcode + * + * \hideinitializer + */ +#define uip_input() uip_process( UIP_DATA ) + +/** + * Periodic processing for a connection identified by its number. + * + * This function does the necessary periodic processing (timers, + * polling) for a uIP TCP conneciton, and should be called when the + * periodic uIP timer goes off. It should be called for every + * connection, regardless of whether they are open of closed. + * + * When the function returns, it may have an outbound packet waiting + * for service in the uIP packet buffer, and if so the uip_len + * variable is set to a value larger than zero. The device driver + * should be called to send out the packet. + * + * The usual way of calling the function is through a for() loop like + * this: + \code + for(i = 0; i < UIP_CONNS; ++i) { + uip_periodic(i); + if(uip_len > 0) { + devicedriver_send(); + } + } + \endcode + * + * \note If you are writing a uIP device driver that needs ARP + * (Address Resolution Protocol), e.g., when running uIP over + * Ethernet, you will need to call the uip_arp_out() function before + * calling the device driver: + \code + for(i = 0; i < UIP_CONNS; ++i) { + uip_periodic(i); + if(uip_len > 0) { + uip_arp_out(); + ethernet_devicedriver_send(); + } + } + \endcode + * + * \param conn The number of the connection which is to be periodically polled. + * + * \hideinitializer + */ +#ifdef UIP_TCP +#define uip_periodic( conn ) \ + do \ + { \ + uip_conn = &uip_conns[conn]; \ + uip_process( UIP_TIMER ); \ + } while( 0 ) + +/** + * + * + */ +#define uip_conn_active( conn ) ( uip_conns[conn].tcpstateflags != UIP_CLOSED ) + +/** + * Perform periodic processing for a connection identified by a pointer + * to its structure. + * + * Same as uip_periodic() but takes a pointer to the actual uip_conn + * struct instead of an integer as its argument. This function can be + * used to force periodic processing of a specific connection. + * + * \param conn A pointer to the uip_conn struct for the connection to + * be processed. + * + * \hideinitializer + */ +#define uip_periodic_conn( conn ) \ + do \ + { \ + uip_conn = conn; \ + uip_process( UIP_TIMER ); \ + } while( 0 ) + +/** + * Request that a particular connection should be polled. + * + * Similar to uip_periodic_conn() but does not perform any timer + * processing. The application is polled for new data. + * + * \param conn A pointer to the uip_conn struct for the connection to + * be processed. + * + * \hideinitializer + */ +#define uip_poll_conn( conn ) \ + do \ + { \ + uip_conn = conn; \ + uip_process( UIP_POLL_REQUEST ); \ + } while( 0 ) +#endif /* UIP_TCP */ + +#ifdef UIP_UDP + +/** + * Periodic processing for a UDP connection identified by its number. + * + * This function is essentially the same as uip_periodic(), but for + * UDP connections. It is called in a similar fashion as the + * uip_periodic() function: + \code + for(i = 0; i < UIP_UDP_CONNS; i++) { + uip_udp_periodic(i); + if(uip_len > 0) { + devicedriver_send(); + } + } + \endcode + * + * \note As for the uip_periodic() function, special care has to be + * taken when using uIP together with ARP and Ethernet: + \code + for(i = 0; i < UIP_UDP_CONNS; i++) { + uip_udp_periodic(i); + if(uip_len > 0) { + uip_arp_out(); + ethernet_devicedriver_send(); + } + } + \endcode + * + * \param conn The number of the UDP connection to be processed. + * + * \hideinitializer + */ +#define uip_udp_periodic( conn ) \ + do \ + { \ + uip_udp_conn = &uip_udp_conns[conn]; \ + uip_process( UIP_UDP_TIMER ); \ + } while( 0 ) + +/** + * Periodic processing for a UDP connection identified by a pointer to + * its structure. + * + * Same as uip_udp_periodic() but takes a pointer to the actual + * uip_conn struct instead of an integer as its argument. This + * function can be used to force periodic processing of a specific + * connection. + * + * \param conn A pointer to the uip_udp_conn struct for the connection + * to be processed. + * + * \hideinitializer + */ +#define uip_udp_periodic_conn( conn ) \ + do \ + { \ + uip_udp_conn = conn; \ + uip_process( UIP_UDP_TIMER ); \ + } while( 0 ) +#endif /* UIP_UDP */ + + /** \brief Abandon the reassembly of the current packet */ + void uip_reass_over( void ); + +/** + * The uIP packet buffer. + * + * The uip_buf array is used to hold incoming and outgoing + * packets. The device driver should place incoming data into this + * buffer. When sending data, the device driver should read the link + * level headers and the TCP/IP headers from this buffer. The size of + * the link level headers is configured by the UIP_LLH_LEN define. + * + * \note The application data need not be placed in this buffer, so + * the device driver must read it from the place pointed to by the + * uip_appdata pointer as illustrated by the following example: + \code + void + devicedriver_send(void) + { + hwsend(&uip_buf[0], UIP_LLH_LEN); + if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) { + hwsend(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN); + } else { + hwsend(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN); + hwsend(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN); + } + } + \endcode +*/ +#ifndef UIP_CONF_EXTERNAL_BUFFER +CCIF extern u8_t uip_buf[UIP_BUFSIZE + 2]; +#else +CCIF extern unsigned char *uip_buf; +#endif + +/** @} */ + +/*---------------------------------------------------------------------------*/ + +/* Functions that are used by the uIP application program. Opening and + * closing connections, sending and receiving data, etc. is all + * handled by the functions below. + */ + +/** + * \defgroup uipappfunc uIP application functions + * @{ + * + * Functions used by an application running of top of uIP. + */ + +/** + * Start listening to the specified port. + * + * \note Since this function expects the port number in network byte + * order, a conversion using HTONS() or htons() is necessary. + * + \code + uip_listen(HTONS(80)); + \endcode + * + * \param port A 16-bit port number in network byte order. + */ +void uip_listen( u16_t port ); + +/** + * Stop listening to the specified port. + * + * \note Since this function expects the port number in network byte + * order, a conversion using HTONS() or htons() is necessary. + * + \code + uip_unlisten(HTONS(80)); + \endcode + * + * \param port A 16-bit port number in network byte order. + */ +void uip_unlisten( u16_t port ); + +/** + * Connect to a remote host using TCP. + * + * This function is used to start a new connection to the specified + * port on the specified host. It allocates a new connection identifier, + * sets the connection to the SYN_SENT state and sets the + * retransmission timer to 0. This will cause a TCP SYN segment to be + * sent out the next time this connection is periodically processed, + * which usually is done within 0.5 seconds after the call to + * uip_connect(). + * + * \note This function is available only if support for active open + * has been configured by defining UIP_ACTIVE_OPEN to 1 in uipopt.h. + * + * \note Since this function requires the port number to be in network + * byte order, a conversion using HTONS() or htons() is necessary. + * + \code + uip_ipaddr_t ipaddr; + + uip_ipaddr(&ipaddr, 192,168,1,2); + uip_connect(&ipaddr, HTONS(80)); + \endcode + * + * \param ripaddr The IP address of the remote host. + * + * \param port A 16-bit port number in network byte order. + * + * \return A pointer to the uIP connection identifier for the new connection, + * or NULL if no connection could be allocated. + * + */ +struct uip_conn *uip_connect( uip_ipaddr_t *ripaddr, u16_t port ); + +/** + * \internal + * + * Check if a connection has outstanding (i.e., unacknowledged) data. + * + * \param conn A pointer to the uip_conn structure for the connection. + * + * \hideinitializer + */ +#define uip_outstanding( conn ) ( (conn)->len ) + +/** + * Send data on the current connection. + * + * This function is used to send out a single segment of TCP + * data. Only applications that have been invoked by uIP for event + * processing can send data. + * + * The amount of data that actually is sent out after a call to this + * function is determined by the maximum amount of data TCP allows. uIP + * will automatically crop the data so that only the appropriate + * amount of data is sent. The function uip_mss() can be used to query + * uIP for the amount of data that actually will be sent. + * + * \note This function does not guarantee that the sent data will + * arrive at the destination. If the data is lost in the network, the + * application will be invoked with the uip_rexmit() event being + * set. The application will then have to resend the data using this + * function. + * + * \param data A pointer to the data which is to be sent. + * + * \param len The maximum amount of data bytes to be sent. + * + * \hideinitializer + */ +CCIF void uip_send( const void *data, int len ); + +/** + * The length of any incoming data that is currently available (if available) + * in the uip_appdata buffer. + * + * The test function uip_data() must first be used to check if there + * is any data available at all. + * + * \hideinitializer + */ + +/*void uip_datalen(void);*/ +#define uip_datalen() uip_len + +/** + * The length of any out-of-band data (urgent data) that has arrived + * on the connection. + * + * \note The configuration parameter UIP_URGDATA must be set for this + * function to be enabled. + * + * \hideinitializer + */ +#define uip_urgdatalen() uip_urglen + +/** + * Close the current connection. + * + * This function will close the current connection in a nice way. + * + * \hideinitializer + */ +#define uip_close() ( uip_flags = UIP_CLOSE ) + +/** + * Abort the current connection. + * + * This function will abort (reset) the current connection, and is + * usually used when an error has occurred that prevents using the + * uip_close() function. + * + * \hideinitializer + */ +#define uip_abort() ( uip_flags = UIP_ABORT ) + +/** + * Tell the sending host to stop sending data. + * + * This function will close our receiver's window so that we stop + * receiving data for the current connection. + * + * \hideinitializer + */ +#define uip_stop() ( uip_conn->tcpstateflags |= UIP_STOPPED ) + +/** + * Find out if the current connection has been previously stopped with + * uip_stop(). + * + * \hideinitializer + */ +#define uip_stopped( conn ) ( (conn)->tcpstateflags & UIP_STOPPED ) + +/** + * Restart the current connection, if is has previously been stopped + * with uip_stop(). + * + * This function will open the receiver's window again so that we + * start receiving data for the current connection. + * + * \hideinitializer + */ +#define uip_restart() \ + do \ + { \ + uip_flags |= UIP_NEWDATA; \ + uip_conn->tcpstateflags &= ~UIP_STOPPED; \ + } while( 0 ) + + /* uIP tests that can be made to determine in what state the current + connection is, and what the application function should do. */ + +/** + * Is the current connection a UDP connection? + * + * This function checks whether the current connection is a UDP connection. + * + * \hideinitializer + * + */ +#define uip_udpconnection() ( uip_conn == NULL ) + +/** + * Is new incoming data available? + * + * Will reduce to non-zero if there is new data for the application + * present at the uip_appdata pointer. The size of the data is + * available through the uip_len variable. + * + * \hideinitializer + */ +#define uip_newdata() ( uip_flags & UIP_NEWDATA ) + +/** + * Has previously sent data been acknowledged? + * + * Will reduce to non-zero if the previously sent data has been + * acknowledged by the remote host. This means that the application + * can send new data. + * + * \hideinitializer + */ +#define uip_acked() ( uip_flags & UIP_ACKDATA ) + +/** + * Has the connection just been connected? + * + * Reduces to non-zero if the current connection has been connected to + * a remote host. This will happen both if the connection has been + * actively opened (with uip_connect()) or passively opened (with + * uip_listen()). + * + * \hideinitializer + */ +#define uip_connected() ( uip_flags & UIP_CONNECTED ) + +/** + * Has the connection been closed by the other end? + * + * Is non-zero if the connection has been closed by the remote + * host. The application may then do the necessary clean-ups. + * + * \hideinitializer + */ +#define uip_closed() ( uip_flags & UIP_CLOSE ) + +/** + * Has the connection been aborted by the other end? + * + * Non-zero if the current connection has been aborted (reset) by the + * remote host. + * + * \hideinitializer + */ +#define uip_aborted() ( uip_flags & UIP_ABORT ) + +/** + * Has the connection timed out? + * + * Non-zero if the current connection has been aborted due to too many + * retransmissions. + * + * \hideinitializer + */ +#define uip_timedout() ( uip_flags & UIP_TIMEDOUT ) + +/** + * Do we need to retransmit previously data? + * + * Reduces to non-zero if the previously sent data has been lost in + * the network, and the application should retransmit it. The + * application should send the exact same data as it did the last + * time, using the uip_send() function. + * + * \hideinitializer + */ +#define uip_rexmit() ( uip_flags & UIP_REXMIT ) + +/** + * Is the connection being polled by uIP? + * + * Is non-zero if the reason the application is invoked is that the + * current connection has been idle for a while and should be + * polled. + * + * The polling event can be used for sending data without having to + * wait for the remote host to send data. + * + * \hideinitializer + */ +#define uip_poll() ( uip_flags & UIP_POLL ) + +/** + * Get the initial maximum segment size (MSS) of the current + * connection. + * + * \hideinitializer + */ +#define uip_initialmss() ( uip_conn->initialmss ) + +/** + * Get the current maximum segment size that can be sent on the current + * connection. + * + * The current maximum segment size that can be sent on the + * connection is computed from the receiver's window and the MSS of + * the connection (which also is available by calling + * uip_initialmss()). + * + * \hideinitializer + */ +#define uip_mss() ( uip_conn->mss ) + /** + * Set up a new UDP connection. + * + * This function sets up a new UDP connection. The function will + * automatically allocate an unused local port for the new + * connection. However, another port can be chosen by using the + * uip_udp_bind() call, after the uip_udp_new() function has been + * called. + * + * Example: + \code + uip_ipaddr_t addr; + struct uip_udp_conn *c; + + uip_ipaddr(&addr, 192,168,2,1); + c = uip_udp_new(&addr, HTONS(12345)); + if(c != NULL) { + uip_udp_bind(c, HTONS(12344)); + } + \endcode + * \param ripaddr The IP address of the remote host. + * + * \param rport The remote port number in network byte order. + * + * \return The uip_udp_conn structure for the new connection or NULL + * if no connection could be allocated. + */ + struct uip_udp_conn *uip_udp_new( const uip_ipaddr_t *ripaddr, u16_t rport ); + +/** + * Removed a UDP connection. + * + * \param conn A pointer to the uip_udp_conn structure for the connection. + * + * \hideinitializer + */ +#define uip_udp_remove( conn ) ( conn )->lport = 0 + +/** + * Bind a UDP connection to a local port. + * + * \param conn A pointer to the uip_udp_conn structure for the + * connection. + * + * \param port The local port number, in network byte order. + * + * \hideinitializer + */ +#define uip_udp_bind( conn, port ) ( conn )->lport = port + +/** + * Send a UDP datagram of length len on the current connection. + * + * This function can only be called in response to a UDP event (poll + * or newdata). The data must be present in the uip_buf buffer, at the + * place pointed to by the uip_appdata pointer. + * + * \param len The length of the data in the uip_buf buffer. + * + * \hideinitializer + */ +#define uip_udp_send( len ) uip_send( ( char * ) uip_appdata, len ) + +/** @} */ + +/* uIP convenience and converting functions. */ + +/** + * \defgroup uipconvfunc uIP conversion functions + * @{ + * + * These functions can be used for converting between different data + * formats used by uIP. + */ + +/** + * Convert an IP address to four bytes separated by commas. + * + * Example: + \code + uip_ipaddr_t ipaddr; + printf("ipaddr=%d.%d.%d.%d\n", uip_ipaddr_to_quad(&ipaddr)); + \endcode + * + * \param a A pointer to a uip_ipaddr_t. + * \hideinitializer + */ +#define uip_ipaddr_to_quad( a ) ( a )->u8[0], ( a )->u8[1], ( a )->u8[2], ( a )->u8[3] + +/** + * Construct an IP address from four bytes. + * + * This function constructs an IP address of the type that uIP handles + * internally from four bytes. The function is handy for specifying IP + * addresses to use with e.g. the uip_connect() function. + * + * Example: + \code + uip_ipaddr_t ipaddr; + struct uip_conn *c; + + uip_ipaddr(&ipaddr, 192,168,1,2); + c = uip_connect(&ipaddr, HTONS(80)); + \endcode + * + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the IP address. + * + * \param addr0 The first octet of the IP address. + * \param addr1 The second octet of the IP address. + * \param addr2 The third octet of the IP address. + * \param addr3 The forth octet of the IP address. + * + * \hideinitializer + */ +#define uip_ipaddr( addr, addr0, addr1, addr2, addr3 ) \ + do \ + { \ + ( addr )->u8[0] = addr0; \ + ( addr )->u8[1] = addr1; \ + ( addr )->u8[2] = addr2; \ + ( addr )->u8[3] = addr3; \ + } while( 0 ) + +/** + * Construct an IPv6 address from eight 16-bit words. + * + * This function constructs an IPv6 address. + * + * \hideinitializer + */ +#define uip_ip6addr( addr, addr0, addr1, addr2, addr3, addr4, addr5, addr6, addr7 ) \ + do \ + { \ + ( addr )->u16[0] = HTONS( addr0 ); \ + ( addr )->u16[1] = HTONS( addr1 ); \ + ( addr )->u16[2] = HTONS( addr2 ); \ + ( addr )->u16[3] = HTONS( addr3 ); \ + ( addr )->u16[4] = HTONS( addr4 ); \ + ( addr )->u16[5] = HTONS( addr5 ); \ + ( addr )->u16[6] = HTONS( addr6 ); \ + ( addr )->u16[7] = HTONS( addr7 ); \ + } while( 0 ) /** + * Construct an IPv6 address from eight 8-bit words. + * + * This function constructs an IPv6 address. + * + * \hideinitializer + */ +#define uip_ip6addr_u8 ( addr, addr0, addr1, addr2, addr3, addr4, addr5, addr6, addr7, addr8, addr9, addr10, addr11, addr12, addr13, addr14, \ + addr15 ) do \ + {\ + ( addr )->u8[0] = addr0; \ + ( addr )->u8[1] = addr1; \ + ( addr )->u8[2] = addr2; \ + ( addr )->u8[3] = addr3; \ + ( addr )->u8[4] = addr4; \ + ( addr )->u8[5] = addr5; \ + ( addr )->u8[6] = addr6; \ + ( addr )->u8[7] = addr7; \ + ( addr )->u8[8] = addr8; \ + ( addr )->u8[9] = addr9; \ + ( addr )->u8[10] = addr10; \ + ( addr )->u8[11] = addr11; \ + ( addr )->u8[12] = addr12; \ + ( addr )->u8[13] = addr13; \ + ( addr )->u8[14] = addr14; \ + ( addr )->u8[15] = addr15; \ + } while( 0 ) + /** + * Copy an IP address to another IP address. + * + * Copies an IP address from one place to another. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2; + + uip_ipaddr(&ipaddr1, 192,16,1,2); + uip_ipaddr_copy(&ipaddr2, &ipaddr1); + \endcode + * + * \param dest The destination for the copy. + * \param src The source from where to copy. + * + * \hideinitializer + */ +#ifndef uip_ipaddr_copy + #define uip_ipaddr_copy( dest, src ) \ + do \ + { \ + (dest)->u8[0] = (src)->u8[0]; \ + (dest)->u8[1] = (src)->u8[1]; \ + (dest)->u8[2] = (src)->u8[2]; \ + (dest)->u8[3] = (src)->u8[3]; \ + } while( 0 ) +#endif + + /** + * Compare two IP addresses + * + * Compares two IP addresses. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2; + + uip_ipaddr(&ipaddr1, 192,16,1,2); + if(uip_ipaddr_cmp(&ipaddr2, &ipaddr1)) { + printf("They are the same"); + } + \endcode + * + * \param addr1 The first IP address. + * \param addr2 The second IP address. + * + * \hideinitializer + */ +#if !UIP_CONF_IPV6 +#define uip_ipaddr_cmp( addr1, addr2 ) ( (addr1)->u16[0] == (addr2)->u16[0] && (addr1)->u16[1] == (addr2)->u16[1] ) +#else /* !UIP_CONF_IPV6 */ +#define uip_ipaddr_cmp( addr1, addr2 ) ( memcmp(addr1, addr2, sizeof(uip_ip6addr_t)) == 0 ) +#endif /* !UIP_CONF_IPV6 */ + + /** + * Compare two IP addresses with netmasks + * + * Compares two IP addresses with netmasks. The masks are used to mask + * out the bits that are to be compared. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2, mask; + + uip_ipaddr(&mask, 255,255,255,0); + uip_ipaddr(&ipaddr1, 192,16,1,2); + uip_ipaddr(&ipaddr2, 192,16,1,3); + if(uip_ipaddr_maskcmp(&ipaddr1, &ipaddr2, &mask)) { + printf("They are the same"); + } + \endcode + * + * \param addr1 The first IP address. + * \param addr2 The second IP address. + * \param mask The netmask. + * + * \hideinitializer + */ +#if !UIP_CONF_IPV6 +#define uip_ipaddr_maskcmp( addr1, addr2, mask ) \ + ( \ + (((( u16_t * ) addr1)[0] & (( u16_t * ) mask)[0]) == ((( u16_t * ) addr2)[0] & (( u16_t * ) mask)[0])) && \ + (((( u16_t * ) addr1)[1] & (( u16_t * ) mask)[1]) == ((( u16_t * ) addr2)[1] & (( u16_t * ) mask)[1])) \ + ) +#else +#define uip_ipaddr_prefixcmp( addr1, addr2, length ) ( memcmp(addr1, addr2, length >> 3) == 0 ) +#endif + + /** + * Check if an address is a broadcast address for a network. + * + * Checks if an address is the broadcast address for a network. The + * network is defined by an IP address that is on the network and the + * network's netmask. + * + * \param addr The IP address. + * \param netaddr The network's IP address. + * \param netmask The network's netmask. + * + * \hideinitializer + */ + + /*#define uip_ipaddr_isbroadcast(addr, netaddr, netmask) + ((uip_ipaddr_t *)(addr)).u16 & ((uip_ipaddr_t *)(addr)).u16*/ + +/** + * Mask out the network part of an IP address. + * + * Masks out the network part of an IP address, given the address and + * the netmask. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2, netmask; + + uip_ipaddr(&ipaddr1, 192,16,1,2); + uip_ipaddr(&netmask, 255,255,255,0); + uip_ipaddr_mask(&ipaddr2, &ipaddr1, &netmask); + \endcode + * + * In the example above, the variable "ipaddr2" will contain the IP + * address 192.168.1.0. + * + * \param dest Where the result is to be placed. + * \param src The IP address. + * \param mask The netmask. + * + * \hideinitializer + */ +#define uip_ipaddr_mask( dest, src, mask ) \ + do \ + { \ + ( ( u16_t * ) dest )[0] = ( ( u16_t * ) src )[0] & ( ( u16_t * ) mask )[0]; \ + ( ( u16_t * ) dest )[1] = ( ( u16_t * ) src )[1] & ( ( u16_t * ) mask )[1]; \ + } while( 0 ) + +/** + * Pick the first octet of an IP address. + * + * Picks out the first octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr1(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 1. + * + * \hideinitializer + */ +#define uip_ipaddr1( addr ) ( (addr)->u8[0] ) + +/** + * Pick the second octet of an IP address. + * + * Picks out the second octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr2(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 2. + * + * \hideinitializer + */ +#define uip_ipaddr2( addr ) ( (addr)->u8[1] ) + +/** + * Pick the third octet of an IP address. + * + * Picks out the third octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr3(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 3. + * + * \hideinitializer + */ +#define uip_ipaddr3( addr ) ( (addr)->u8[2] ) + +/** + * Pick the fourth octet of an IP address. + * + * Picks out the fourth octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr4(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 4. + * + * \hideinitializer + */ +#define uip_ipaddr4( addr ) ( (addr)->u8[3] ) + /** + * Convert 16-bit quantity from host byte order to network byte order. + * + * This macro is primarily used for converting constants from host + * byte order to network byte order. For converting variables to + * network byte order, use the htons() function instead. + * + * \hideinitializer + */ +#ifndef HTONS +#if UIP_BYTE_ORDER == UIP_BIG_ENDIAN +#define HTONS( n ) ( n ) +#define HTONL( n ) ( n ) +#else /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ +#define HTONS( n ) ( u16_t ) ( (((u16_t) (n)) << 8) | (((u16_t) (n)) >> 8) ) +#define HTONL( n ) ( ((u32_t) HTONS(n) << 16) | HTONS((u32_t) (n) >> 16) ) +#endif /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ +#else +#error "HTONS already defined!" +#endif /* HTONS */ + + /** + * Convert 16-bit quantity from host byte order to network byte order. + * + * This function is primarily used for converting variables from host + * byte order to network byte order. For converting constants to + * network byte order, use the HTONS() macro instead. + */ +#ifndef htons + CCIF u16_t htons( u16_t val ); +#endif /* htons */ + +#ifndef ntohs + #define ntohs htons +#endif + +#ifndef htonl + CCIF u32_t htonl( u32_t val ); +#endif /* htonl */ + +#ifndef ntohl + #define ntohl htonl +#endif + +/** @} */ + +/** + * Pointer to the application data in the packet buffer. + * + * This pointer points to the application data when the application is + * called. If the application wishes to send data, the application may + * use this space to write the data into before calling uip_send(). + */ +CCIF extern void *uip_appdata; + +#if UIP_URGDATA > 0 + +/* u8_t *uip_urgdata: + * + * This pointer points to any urgent data that has been received. Only + * present if compiled with support for urgent data (UIP_URGDATA). + */ +extern void *uip_urgdata; +#endif /* UIP_URGDATA > 0 */ + +/** + * \defgroup uipdrivervars Variables used in uIP device drivers + * @{ + * + * uIP has a few global variables that are used in device drivers for + * uIP. + */ + +/** + * The length of the packet in the uip_buf buffer. + * + * The global variable uip_len holds the length of the packet in the + * uip_buf buffer. + * + * When the network device driver calls the uIP input function, + * uip_len should be set to the length of the packet in the uip_buf + * buffer. + * + * When sending packets, the device driver should use the contents of + * the uip_len variable to determine the length of the outgoing + * packet. + * + */ +CCIF extern u16_t uip_len; + +/** + * The length of the extension headers + */ +extern u8_t uip_ext_len; + +/** @} */ +#if UIP_URGDATA > 0 +extern u16_t uip_urglen, uip_surglen; +#endif /* UIP_URGDATA > 0 */ + +/** + * Representation of a uIP TCP connection. + * + * The uip_conn structure is used for identifying a connection. All + * but one field in the structure are to be considered read-only by an + * application. The only exception is the appstate field whose purpose + * is to let the application store application-specific state (e.g., + * file pointers) for the connection. The type of this field is + * configured in the "uipopt.h" header file. + */ +struct uip_conn +{ + uip_ipaddr_t ripaddr; /**< The IP address of the remote host. */ + + u16_t lport; /**< The local TCP port, in network byte order. */ + u16_t rport; /**< The local remote TCP port, in network byte + order. */ + + u8_t rcv_nxt[4]; /**< The sequence number that we expect to + receive next. */ + u8_t snd_nxt[4]; /**< The sequence number that was last sent by + us. */ + u16_t len; /**< Length of the data that was previously sent. */ + u16_t mss; /**< Current maximum segment size for the + connection. */ + u16_t initialmss; /**< Initial maximum segment size for the + connection. */ + u8_t sa; /**< Retransmission time-out calculation state + variable. */ + u8_t sv; /**< Retransmission time-out calculation state + variable. */ + u8_t rto; /**< Retransmission time-out. */ + u8_t tcpstateflags; /**< TCP state and flags. */ + u8_t timer; /**< The retransmission timer. */ + u8_t nrtx; /**< The number of retransmissions for the last + segment sent. */ + + /** The application state. */ + uip_tcp_appstate_t appstate; +}; + +/** + * Pointer to the current TCP connection. + * + * The uip_conn pointer can be used to access the current TCP + * connection. + */ +CCIF extern struct uip_conn *uip_conn; +#ifdef UIP_TCP + +/* The array containing all uIP connections. */ +CCIF extern struct uip_conn uip_conns[UIP_CONNS]; +#endif + +/** + * \addtogroup uiparch + * @{ + */ + +/** + * 4-byte array used for the 32-bit sequence number calculations. + */ +extern u8_t uip_acc32[4]; + +/** @} */ +#if UIP_UDP == 1 +/** + * Representation of a uIP UDP connection. + */ +struct uip_udp_conn +{ + uip_ipaddr_t ripaddr; /**< The IP address of the remote peer. */ + u16_t lport; /**< The local port number in network byte order. */ + u16_t rport; /**< The remote port number in network byte order. */ + u8_t ttl; /**< Default time-to-live. */ + + /** The application state. */ + uip_udp_appstate_t appstate; +}; + +/** + * The current UDP connection. + */ +extern struct uip_udp_conn *uip_udp_conn; +extern struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS]; +#endif /* UIP_UDP */ + +struct uip_router +{ + int ( *activate ) ( void ); + int ( *deactivate ) ( void ); + uip_ipaddr_t * ( *lookup ) ( uip_ipaddr_t *destipaddr, uip_ipaddr_t *nexthop ); +}; + +#ifdef UIP_CONF_ROUTER +extern const struct uip_router *uip_router; + +/** + * uIP routing driver registration function. + */ +void uip_router_register( const struct uip_router *router ); +#endif /*UIP_CONF_ROUTER*/ + +#ifdef UIP_CONF_ICMP6 +struct uip_icmp6_conn +{ + uip_icmp6_appstate_t appstate; +}; +extern struct uip_icmp6_conn uip_icmp6_conns; +#endif /*UIP_CONF_ICMP6*/ + +/** + * The uIP TCP/IP statistics. + * + * This is the variable in which the uIP TCP/IP statistics are gathered. + */ +#if UIP_STATISTICS == 1 +extern struct uip_stats uip_stat; +#define UIP_STAT( s ) s +#else +#define UIP_STAT( s ) +#endif /* UIP_STATISTICS == 1 */ + +/** + * The structure holding the TCP/IP statistics that are gathered if + * UIP_STATISTICS is set to 1. + * + */ +struct uip_stats +{ + struct + { + uip_stats_t recv; /**< Number of received packets at the IP + layer. */ + uip_stats_t sent; /**< Number of sent packets at the IP + layer. */ + uip_stats_t forwarded; /**< Number of forwarded packets at the IP + layer. */ + uip_stats_t drop; /**< Number of dropped packets at the IP + layer. */ + uip_stats_t vhlerr; /**< Number of packets dropped due to wrong + IP version or header length. */ + uip_stats_t hblenerr; /**< Number of packets dropped due to wrong + IP length, high byte. */ + uip_stats_t lblenerr; /**< Number of packets dropped due to wrong + IP length, low byte. */ + uip_stats_t fragerr; /**< Number of packets dropped since they + were IP fragments. */ + uip_stats_t chkerr; /**< Number of packets dropped due to IP + checksum errors. */ + uip_stats_t protoerr; /**< Number of packets dropped since they + were neither ICMP, UDP nor TCP. */ + } ip; /**< IP statistics. */ + struct + { + uip_stats_t recv; /**< Number of received ICMP packets. */ + uip_stats_t sent; /**< Number of sent ICMP packets. */ + uip_stats_t drop; /**< Number of dropped ICMP packets. */ + uip_stats_t typeerr; /**< Number of ICMP packets with a wrong + type. */ + uip_stats_t chkerr; /**< Number of ICMP packets with a bad + checksum. */ + } icmp; /**< ICMP statistics. */ +#ifdef UIP_TCP + struct + { + uip_stats_t recv; /**< Number of recived TCP segments. */ + uip_stats_t sent; /**< Number of sent TCP segments. */ + uip_stats_t drop; /**< Number of dropped TCP segments. */ + uip_stats_t chkerr; /**< Number of TCP segments with a bad + checksum. */ + uip_stats_t ackerr; /**< Number of TCP segments with a bad ACK + number. */ + uip_stats_t rst; /**< Number of recevied TCP RST (reset) segments. */ + uip_stats_t rexmit; /**< Number of retransmitted TCP segments. */ + uip_stats_t syndrop; /**< Number of dropped SYNs due to too few + connections was avaliable. */ + uip_stats_t synrst; /**< Number of SYNs for closed ports, + triggering a RST. */ + } tcp; /**< TCP statistics. */ +#endif +#ifdef UIP_UDP + struct + { + uip_stats_t drop; /**< Number of dropped UDP segments. */ + uip_stats_t recv; /**< Number of recived UDP segments. */ + uip_stats_t sent; /**< Number of sent UDP segments. */ + uip_stats_t chkerr; /**< Number of UDP segments with a bad + checksum. */ + } udp; /**< UDP statistics. */ +#endif /* UIP_UDP */ +#if UIP_CONF_IPV6 != 0 + struct + { + uip_stats_t drop; /**< Number of dropped ND6 packets. */ + uip_stats_t recv; /**< Number of recived ND6 packets */ + uip_stats_t sent; /**< Number of sent ND6 packets */ + } nd6; +#endif /*UIP_CONF_IPV6*/ +}; + +/*---------------------------------------------------------------------------*/ + +/* All the stuff below this point is internal to uIP and should not be + * used directly by an application or by a device driver. + */ + +/*---------------------------------------------------------------------------*/ + +/* u8_t uip_flags: + * + * When the application is called, uip_flags will contain the flags + * that are defined in this file. Please read below for more + * information. + */ +CCIF extern u8_t uip_flags; + +/* The following flags may be set in the global variable uip_flags + before calling the application callback. The UIP_ACKDATA, + UIP_NEWDATA, and UIP_CLOSE flags may both be set at the same time, + whereas the others are mutually exclusive. Note that these flags + should *NOT* be accessed directly, but only through the uIP + functions/macros. */ +#define UIP_ACKDATA 1 /* Signifies that the outstanding data was + acked and the application should send + out new data instead of retransmitting + the last data. */ +#define UIP_NEWDATA 2 /* Flags the fact that the peer has sent + us new data. */ +#define UIP_REXMIT 4 /* Tells the application to retransmit the + data that was last sent. */ +#define UIP_POLL 8 /* Used for polling the application, to + check if the application has data that + it wants to send. */ +#define UIP_CLOSE 16 /* The remote host has closed the + connection, thus the connection has + gone away. Or the application signals + that it wants to close the + connection. */ +#define UIP_ABORT 32 /* The remote host has aborted the + connection, thus the connection has + gone away. Or the application signals + that it wants to abort the + connection. */ +#define UIP_CONNECTED 64 /* We have got a connection from a remote + host and have set up a new connection + for it, or an active connection has + been successfully established. */ + +#define UIP_TIMEDOUT 128 /* The connection has been aborted due to + too many retransmissions. */ + +/** + * \brief process the options within a hop by hop or destination option header + * \retval 0: nothing to send, + * \retval 1: drop pkt + * \retval 2: ICMP error message to send +*/ + +/*static u8_t +uip_ext_hdr_options_process(); */ + +/* uip_process(flag): + * + * The actual uIP function which does all the work. + */ +void uip_process( u8_t flag ); + +/* The following flags are passed as an argument to the uip_process() + function. They are used to distinguish between the two cases where + uip_process() is called. It can be called either because we have + incoming data that should be processed, or because the periodic + timer has fired. These values are never used directly, but only in + the macros defined in this file. */ +#define UIP_DATA 1 /* Tells uIP that there is incoming + data in the uip_buf buffer. The + length of the data is stored in the + global variable uip_len. */ +#define UIP_TIMER 2 /* Tells uIP that the periodic timer + has fired. */ +#define UIP_POLL_REQUEST 3 /* Tells uIP that a connection should + be polled. */ +#define UIP_UDP_SEND_CONN 4 /* Tells uIP that a UDP datagram + should be constructed in the + uip_buf buffer. */ +#ifdef UIP_UDP +#define UIP_UDP_TIMER 5 +#endif /* UIP_UDP */ + +/* The TCP states used in the uip_conn->tcpstateflags. */ +#define UIP_CLOSED 0 +#define UIP_SYN_RCVD 1 +#define UIP_SYN_SENT 2 +#define UIP_ESTABLISHED 3 +#define UIP_FIN_WAIT_1 4 +#define UIP_FIN_WAIT_2 5 +#define UIP_CLOSING 6 +#define UIP_TIME_WAIT 7 +#define UIP_LAST_ACK 8 +#define UIP_TS_MASK 15 + +#define UIP_STOPPED 16 + +/* The TCP and IP headers. */ +#include "net/pack_struct_start.h" +struct uip_tcpip_hdr +{ +#if UIP_CONF_IPV6 != 0 + /* IPv6 header. */ + u8_t vtc, tcflow; + u16_t flow; + u8_t len[2]; + u8_t proto, ttl; + uip_ip6addr_t srcipaddr, destipaddr; +#else /* UIP_CONF_IPV6 */ + /* IPv4 header. */ + u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; + u16_t ipchksum; + uip_ipaddr_t srcipaddr, destipaddr; +#endif /* UIP_CONF_IPV6 */ + + /* TCP header. */ + u16_t srcport, destport; + u8_t seqno[4], ackno[4], tcpoffset, flags, wnd[2]; + u16_t tcpchksum; + u8_t urgp[2]; + u8_t optdata[4]; +} +#include "net/pack_struct_end.h" + +/* The ICMP and IP headers. */ +#include "net/pack_struct_start.h" +struct uip_icmpip_hdr +{ +#if UIP_CONF_IPV6 != 0 + /* IPv6 header. */ + u8_t vtc, tcf; + u16_t flow; + u8_t len[2]; + u8_t proto, ttl; + uip_ip6addr_t srcipaddr, destipaddr; +#else /* UIP_CONF_IPV6 */ + /* IPv4 header. */ + u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; + u16_t ipchksum; + uip_ipaddr_t srcipaddr, destipaddr; +#endif /* UIP_CONF_IPV6 */ + + /* ICMP header. */ + u8_t type, icode; + u16_t icmpchksum; +#if !UIP_CONF_IPV6 + u16_t id, seqno; + u8_t payload[1]; +#endif /* !UIP_CONF_IPV6 */ +} + +#include "net/pack_struct_end.h" + +/* The UDP and IP headers. */ +#include "net/pack_struct_start.h" +struct uip_udpip_hdr +{ +#if UIP_CONF_IPV6 != 0 + /* IPv6 header. */ + u8_t vtc, tcf; + u16_t flow; + u8_t len[2]; + u8_t proto, ttl; + uip_ip6addr_t srcipaddr, destipaddr; +#else /* UIP_CONF_IPV6 */ + /* IP header. */ + u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; + u16_t ipchksum; + uip_ipaddr_t srcipaddr, destipaddr; +#endif /* UIP_CONF_IPV6 */ + + /* UDP header. */ + u16_t srcport, destport; + u16_t udplen; + u16_t udpchksum; +} + +#include "net/pack_struct_end.h" + +/* + * In IPv6 the length of the L3 headers before the transport header is + * not fixed, due to the possibility to include extension option headers + * after the IP header. hence we split here L3 and L4 headers + */ + +/* The IP header */ +struct uip_ip_hdr +{ +#if UIP_CONF_IPV6 != 0 + /* IPV6 header */ + u8_t vtc; + u8_t tcflow; + u16_t flow; + u8_t len[2]; + u8_t proto, ttl; + uip_ip6addr_t srcipaddr, destipaddr; +#else /* UIP_CONF_IPV6 */ + /* IPV4 header */ + u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; + u16_t ipchksum; + uip_ipaddr_t srcipaddr, destipaddr; +#endif /* UIP_CONF_IPV6 */ +}; + +/* + * IPv6 extension option headers: we are able to process + * the 4 extension headers defined in RFC2460 (IPv6): + * - Hop by hop option header, destination option header: + * These two are not used by any core IPv6 protocol, hence + * we just read them and go to the next. They convey options, + * the options defined in RFC2460 are Pad1 and PadN, which do + * some padding, and that we do not need to read (the length + * field in the header is enough) + * - Routing header: this one is most notably used by MIPv6, + * which we do not implement, hence we just read it and go + * to the next + * - Fragmentation header: we read this header and are able to + * reassemble packets + * + * We do not offer any means to send packets with extension headers + * + * We do not implement Authentication and ESP headers, which are + * used in IPSec and defined in RFC4302,4303,4305,4385 + */ + +/* common header part */ +struct uip_ext_hdr +{ + u8_t next; + u8_t len; +}; + +/* Hop by Hop option header */ +struct uip_hbho_hdr +{ + u8_t next; + u8_t len; +}; + +/* destination option header */ +struct uip_desto_hdr +{ + u8_t next; + u8_t len; +}; + +/* We do not define structures for PAD1 and PADN options */ + +/* + * routing header + * the routing header as 4 common bytes, then routing header type + * specific data there are several types of routing header. Type 0 was + * deprecated as per RFC5095 most notable other type is 2, used in + * RFC3775 (MIPv6) here we do not implement MIPv6, so we just need to + * parse the 4 first bytes + */ +struct uip_routing_hdr +{ + u8_t next; + u8_t len; + u8_t routing_type; + u8_t seg_left; +}; + +/* fragmentation header */ +struct uip_frag_hdr +{ + u8_t next; + u8_t res; + u16_t offsetresmore; + u32_t id; +}; + +/* + * an option within the destination or hop by hop option headers + * it contains type an length, which is true for all options but PAD1 + */ +struct uip_ext_hdr_opt +{ + u8_t type; + u8_t len; +}; + +/* PADN option */ +struct uip_ext_hdr_opt_padn +{ + u8_t opt_type; + u8_t opt_len; +}; + +/* TCP header */ +struct uip_tcp_hdr +{ + u16_t srcport; + u16_t destport; + u8_t seqno[4]; + u8_t ackno[4]; + u8_t tcpoffset; + u8_t flags; + u8_t wnd[2]; + u16_t tcpchksum; + u8_t urgp[2]; + u8_t optdata[4]; +}; + +/* The ICMP headers. */ +struct uip_icmp_hdr +{ + u8_t type, icode; + u16_t icmpchksum; +#if !UIP_CONF_IPV6 + u16_t id, seqno; +#endif /* !UIP_CONF_IPV6 */ +}; + +/* The UDP headers. */ +struct uip_udp_hdr +{ + u16_t srcport; + u16_t destport; + u16_t udplen; + u16_t udpchksum; +}; + +/** + * The buffer size available for user data in the \ref uip_buf buffer. + * + * This macro holds the available size for user data in the \ref + * uip_buf buffer. The macro is intended to be used for checking + * bounds of available user data. + * + * Example: + \code + snprintf(uip_appdata, UIP_APPDATA_SIZE, "%u\n", i); + \endcode + * + * \hideinitializer + */ +#define UIP_APPDATA_SIZE ( UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN ) +#define UIP_APPDATA_PTR ( void * ) &uip_buf[UIP_LLH_LEN + UIP_TCPIP_HLEN] + +#define UIP_PROTO_ICMP 1 +#define UIP_PROTO_TCP 6 +#define UIP_PROTO_UDP 17 +#define UIP_PROTO_ICMP6 58 + +#if UIP_CONF_IPV6 != 0 + +/** @{ */ + +/** \brief extension headers types */ +#define UIP_PROTO_HBHO 0 +#define UIP_PROTO_DESTO 60 +#define UIP_PROTO_ROUTING 43 +#define UIP_PROTO_FRAG 44 +#define UIP_PROTO_NONE 59 + +/** @} */ + +/** @{ */ + +/** \brief Destination and Hop By Hop extension headers option types */ +#define UIP_EXT_HDR_OPT_PAD1 0 +#define UIP_EXT_HDR_OPT_PADN 1 + +/** @} */ + +/** @{ */ + +/** + * \brief Bitmaps for extension header processing + * + * When processing extension headers, we should record somehow which one we + * see, because you cannot have twice the same header, except for destination + * We store all this in one u8_t bitmap one bit for each header expected. The + * order in the bitmap is the order recommended in RFC2460 + */ +#define UIP_EXT_HDR_BITMAP_HBHO 0x01 +#define UIP_EXT_HDR_BITMAP_DESTO1 0x02 +#define UIP_EXT_HDR_BITMAP_ROUTING 0x04 +#define UIP_EXT_HDR_BITMAP_FRAG 0x08 +#define UIP_EXT_HDR_BITMAP_AH 0x10 +#define UIP_EXT_HDR_BITMAP_ESP 0x20 +#define UIP_EXT_HDR_BITMAP_DESTO2 0x40 + +/** @} */ +#endif /* UIP_CONF_IPV6 */ + +/* Header sizes. */ +#if UIP_CONF_IPV6 != 0 +#define UIP_IPH_LEN 40 +#define UIP_FRAGH_LEN 8 +#else /* UIP_CONF_IPV6 */ +#define UIP_IPH_LEN 20 /* Size of IP header */ +#endif /* UIP_CONF_IPV6 */ + +#define UIP_UDPH_LEN 8 /* Size of UDP header */ +#define UIP_TCPH_LEN 20 /* Size of TCP header */ +#ifdef UIP_IPH_LEN +#define UIP_ICMPH_LEN 4 /* Size of ICMP header */ +#endif +#define UIP_IPUDPH_LEN ( UIP_UDPH_LEN + UIP_IPH_LEN ) /* Size of IP + + * UDP + * header */ +#define UIP_IPTCPH_LEN ( UIP_TCPH_LEN + UIP_IPH_LEN ) /* Size of IP + + * TCP + * header */ +#define UIP_TCPIP_HLEN UIP_IPTCPH_LEN +#define UIP_IPICMPH_LEN ( UIP_IPH_LEN + UIP_ICMPH_LEN ) /* size of ICMP + + IP header */ +#define UIP_LLIPH_LEN ( UIP_LLH_LEN + UIP_IPH_LEN ) /* size of L2 + + IP header */ +#if UIP_CONF_IPV6 != 0 + +/** + * The sums below are quite used in ND. When used for uip_buf, we + * include link layer length when used for uip_len, we do not, hence + * we need values with and without LLH_LEN we do not use capital + * letters as these values are variable + */ +#define uip_l2_l3_hdr_len ( UIP_LLH_LEN + UIP_IPH_LEN + uip_ext_len ) +#define uip_l2_l3_icmp_hdr_len ( UIP_LLH_LEN + UIP_IPH_LEN + uip_ext_len + UIP_ICMPH_LEN ) +#define uip_l3_hdr_len ( UIP_IPH_LEN + uip_ext_len ) +#define uip_l3_icmp_hdr_len ( UIP_IPH_LEN + uip_ext_len + UIP_ICMPH_LEN ) +#endif /*UIP_CONF_IPV6*/ + +#ifdef UIP_FIXEDADDR +CCIF extern const uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr; +#else /* UIP_FIXEDADDR */ +CCIF extern uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr; +#endif /* UIP_FIXEDADDR */ +CCIF extern const uip_ipaddr_t uip_broadcast_addr; +CCIF extern const uip_ipaddr_t uip_all_zeroes_addr; + +#ifdef UIP_FIXEDETHADDR +CCIF extern const uip_lladdr_t uip_lladdr; +#else +CCIF extern uip_lladdr_t uip_lladdr; +#endif +#if UIP_CONF_IPV6 != 0 + +/** + * \brief Is IPv6 address a the unspecified address + * a is of type uip_ipaddr_t + */ +#define uip_is_addr_unspecified( a ) \ + ( \ + (((a)->u16[0]) == 0) && \ + (((a)->u16[1]) == 0) && \ + (((a)->u16[2]) == 0) && \ + (((a)->u16[3]) == 0) && \ + (((a)->u16[4]) == 0) && \ + (((a)->u16[5]) == 0) && \ + (((a)->u16[6]) == 0) && \ + (((a)->u16[7]) == 0) \ + ) + +/** \brief Is IPv6 address a the link local all-nodes multicast address */ +#define uip_is_addr_linklocal_allnodes_mcast( a ) \ + ( \ + (((a)->u8[0]) == 0xff) && \ + (((a)->u8[1]) == 0x02) && \ + (((a)->u16[1]) == 0) && \ + (((a)->u16[2]) == 0) && \ + (((a)->u16[3]) == 0) && \ + (((a)->u16[4]) == 0) && \ + (((a)->u16[5]) == 0) && \ + (((a)->u16[6]) == 0) && \ + (((a)->u8[14]) == 0) && \ + (((a)->u8[15]) == 0x01) \ + ) + +/** \brief set IP address a to unspecified */ +#define uip_create_unspecified( a ) uip_ip6addr( a, 0, 0, 0, 0, 0, 0, 0, 0 ) + +/** \brief set IP address a to the link local all-nodes multicast address */ +#define uip_create_linklocal_allnodes_mcast( a ) uip_ip6addr( a, 0xff02, 0, 0, 0, 0, 0, 0, 0x0001 ) + +/** \brief set IP address a to the link local all-routers multicast address */ +#define uip_create_linklocal_allrouters_mcast( a ) uip_ip6addr( a, 0xff02, 0, 0, 0, 0, 0, 0, 0x0002 ) + +/** + * \brief is addr (a) a solicited node multicast address, see RFC3513 + * a is of type uip_ipaddr_t* + */ +#define uip_is_addr_solicited_node( a ) \ + ( \ + (((a)->u8[0]) == 0xFF) && \ + (((a)->u8[1]) == 0x02) && \ + (((a)->u16[1]) == 0) && \ + (((a)->u16[2]) == 0) && \ + (((a)->u16[3]) == 0) && \ + (((a)->u16[4]) == 0) && \ + (((a)->u16[5]) == 1) && \ + (((a)->u8[12]) == 0xFF) \ + ) + +/** + * \briefput in b the solicited node address corresponding to address a + * both a and b are of type uip_ipaddr_t* + * */ +#define uip_create_solicited_node( a, b ) \ + ( ((b)->u8[0]) = 0xFF ); \ + ( ((b)->u8[1]) = 0x02 ); \ + ( ((b)->u16[1]) = 0 ); \ + ( ((b)->u16[2]) = 0 ); \ + ( ((b)->u16[3]) = 0 ); \ + ( ((b)->u16[4]) = 0 ); \ + ( ((b)->u8[10]) = 0 ); \ + ( ((b)->u8[11]) = 0x01 ); \ + ( ((b)->u8[12]) = 0xFF ); \ + ( ((b)->u8[13]) = ((a)->u8[13]) ); \ + ( ((b)->u16[7]) = ((a)->u16[7]) ) + +/** + * \brief is addr (a) a link local unicast address, see RFC3513 + * i.e. is (a) on prefix FE80::/10 + * a is of type uip_ipaddr_t* + */ +#define uip_is_addr_link_local( a ) ( (((a)->u8[0]) == 0xFE) && (((a)->u8[1]) == 0x80) ) + +/** + * \brief was addr (a) forged based on the mac address m + * a type is uip_ipaddr_t + * m type is uiplladdr_t + */ +#ifdef UIP_CONF_LL_802154 +#define uip_is_addr_mac_addr_based( a, m ) \ + ( \ + (((a)->u8[8]) == (((m)->addr[0]) ^ 0x02)) && \ + (((a)->u8[9]) == (m)->addr[1]) && \ + (((a)->u8[10]) == (m)->addr[2]) && \ + (((a)->u8[11]) == (m)->addr[3]) && \ + (((a)->u8[12]) == (m)->addr[4]) && \ + (((a)->u8[13]) == (m)->addr[5]) && \ + (((a)->u8[14]) == (m)->addr[6]) && \ + (((a)->u8[15]) == (m)->addr[7]) \ + ) +#else +#define uip_is_addr_mac_addr_based( a, m ) \ + ( \ + (((a)->u8[8]) == (((m)->addr[0]) | 0x02)) && \ + (((a)->u8[9]) == (m)->addr[1]) && \ + (((a)->u8[10]) == (m)->addr[2]) && \ + (((a)->u8[11]) == 0xff) && \ + (((a)->u8[12]) == 0xfe) && \ + (((a)->u8[13]) == (m)->addr[3]) && \ + (((a)->u8[14]) == (m)->addr[4]) && \ + (((a)->u8[15]) == (m)->addr[5]) \ + ) +#endif /*UIP_CONF_LL_802154*/ + +/** + * \brief is address a multicast address, see RFC 3513 + * a is of type uip_ipaddr_t* + * */ +#define uip_is_addr_mcast( a ) ( ((a)->u8[0]) == 0xFF ) + +/** + * \brief is group-id of multicast address a + * the all nodes group-id + */ +#define uip_is_mcast_group_id_all_nodes( a ) \ + ( \ + (((a)->u16[1]) == 0) && \ + (((a)->u16[2]) == 0) && \ + (((a)->u16[3]) == 0) && \ + (((a)->u16[4]) == 0) && \ + (((a)->u16[5]) == 0) && \ + (((a)->u16[6]) == 0) && \ + (((a)->u8[14]) == 0) && \ + (((a)->u8[15]) == 1) \ + ) + +/** + * \brief is group-id of multicast address a + * the all routers group-id + */ +#define uip_is_mcast_group_id_all_routers( a ) \ + ( \ + (((a)->u16[1]) == 0) && \ + (((a)->u16[2]) == 0) && \ + (((a)->u16[3]) == 0) && \ + (((a)->u16[4]) == 0) && \ + (((a)->u16[5]) == 0) && \ + (((a)->u16[6]) == 0) && \ + (((a)->u8[14]) == 0) && \ + (((a)->u8[15]) == 2) \ + ) +#endif /*UIP_CONF_IPV6*/ + +/** + * Calculate the Internet checksum over a buffer. + * + * The Internet checksum is the one's complement of the one's + * complement sum of all 16-bit words in the buffer. + * + * See RFC1071. + * + * \param buf A pointer to the buffer over which the checksum is to be + * computed. + * + * \param len The length of the buffer over which the checksum is to + * be computed. + * + * \return The Internet checksum of the buffer. + */ +u16_t uip_chksum( u16_t *buf, u16_t len ); + +/** + * Calculate the IP header checksum of the packet header in uip_buf. + * + * The IP header checksum is the Internet checksum of the 20 bytes of + * the IP header. + * + * \return The IP header checksum of the IP header in the uip_buf + * buffer. + */ +u16_t uip_ipchksum( void ); + +/** + * Calculate the TCP checksum of the packet in uip_buf and uip_appdata. + * + * The TCP checksum is the Internet checksum of data contents of the + * TCP segment, and a pseudo-header as defined in RFC793. + * + * \return The TCP checksum of the TCP segment in uip_buf and pointed + * to by uip_appdata. + */ +u16_t uip_tcpchksum( void ); + +/** + * Calculate the UDP checksum of the packet in uip_buf and uip_appdata. + * + * The UDP checksum is the Internet checksum of data contents of the + * UDP segment, and a pseudo-header as defined in RFC768. + * + * \return The UDP checksum of the UDP segment in uip_buf and pointed + * to by uip_appdata. + */ +u16_t uip_udpchksum( void ); + +/** + * Calculate the ICMP checksum of the packet in uip_buf. + * + * \return The ICMP checksum of the ICMP packet in uip_buf + */ +u16_t uip_icmp6chksum( void ); + +/* Events that can get posted to the uIP event queue. These are events +originating from the Ethernet interface or from a timer. */ +#define uipETHERNET_RX_EVENT 0x01UL +#define uipETHERNET_TX_EVENT 0x02UL +#define uipARP_TIMER_EVENT 0x04UL +#define uipPERIODIC_TIMER_EVENT 0x08UL +#define uipAPPLICATION_SEND_EVENT 0x10UL + + +#endif /* __UIP_H__ */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uip_arch.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uip_arch.h new file mode 100644 index 0000000..b529a73 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uip_arch.h @@ -0,0 +1,138 @@ +/** + * \addtogroup uip + * {@ + */ + +/** + * \defgroup uiparch Architecture specific uIP functions + * @{ + * + * The functions in the architecture specific module implement the IP + * check sum and 32-bit additions. + * + * The IP checksum calculation is the most computationally expensive + * operation in the TCP/IP stack and it therefore pays off to + * implement this in efficient assembler. The purpose of the uip-arch + * module is to let the checksum functions to be implemented in + * architecture specific assembler. + * + */ + +/** + * \file + * Declarations of architecture specific functions. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip_arch.h,v 1.1 2006/06/17 22:41:19 adamdunkels Exp $ + * + */ + +#ifndef __UIP_ARCH_H__ +#define __UIP_ARCH_H__ + +#include "net/uip.h" + +/** + * Carry out a 32-bit addition. + * + * Because not all architectures for which uIP is intended has native + * 32-bit arithmetic, uIP uses an external C function for doing the + * required 32-bit additions in the TCP protocol processing. This + * function should add the two arguments and place the result in the + * global variable uip_acc32. + * + * \note The 32-bit integer pointed to by the op32 parameter and the + * result in the uip_acc32 variable are in network byte order (big + * endian). + * + * \param op32 A pointer to a 4-byte array representing a 32-bit + * integer in network byte order (big endian). + * + * \param op16 A 16-bit integer in host byte order. + */ +void uip_add32(u8_t *op32, u16_t op16); + +/** + * Calculate the Internet checksum over a buffer. + * + * The Internet checksum is the one's complement of the one's + * complement sum of all 16-bit words in the buffer. + * + * See RFC1071. + * + * \note This function is not called in the current version of uIP, + * but future versions might make use of it. + * + * \param buf A pointer to the buffer over which the checksum is to be + * computed. + * + * \param len The length of the buffer over which the checksum is to + * be computed. + * + * \return The Internet checksum of the buffer. + */ +u16_t uip_chksum(u16_t *buf, u16_t len); + +/** + * Calculate the IP header checksum of the packet header in uip_buf. + * + * The IP header checksum is the Internet checksum of the 20 bytes of + * the IP header. + * + * \return The IP header checksum of the IP header in the uip_buf + * buffer. + */ +u16_t uip_ipchksum(void); + +/** + * Calculate the TCP checksum of the packet in uip_buf and uip_appdata. + * + * The TCP checksum is the Internet checksum of data contents of the + * TCP segment, and a pseudo-header as defined in RFC793. + * + * \note The uip_appdata pointer that points to the packet data may + * point anywhere in memory, so it is not possible to simply calculate + * the Internet checksum of the contents of the uip_buf buffer. + * + * \return The TCP checksum of the TCP segment in uip_buf and pointed + * to by uip_appdata. + */ +u16_t uip_tcpchksum(void); + +u16_t uip_udpchksum(void); + +/** @} */ +/** @} */ + +#endif /* __UIP_ARCH_H__ */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uip_arp.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uip_arp.h new file mode 100644 index 0000000..e04d353 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uip_arp.h @@ -0,0 +1,149 @@ +/** + * \addtogroup uip + * @{ + */ + +/** + * \addtogroup uiparp + * @{ + */ + +/** + * \file + * Macros and definitions for the ARP module. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip_arp.h,v 1.2 2006/08/26 23:58:45 oliverschmidt Exp $ + * + */ +#ifndef __UIP_ARP_H__ +#define __UIP_ARP_H__ + +#include "net/uip.h" + +CCIF extern struct uip_eth_addr uip_ethaddr; + +/** + * The Ethernet header. + */ +#include "net/pack_struct_start.h" +struct uip_eth_hdr +{ + struct uip_eth_addr dest; + struct uip_eth_addr src; + u16_t type; +} + +#include "net/pack_struct_end.h" + +#define UIP_ETHTYPE_ARP 0x0806 +#define UIP_ETHTYPE_IP 0x0800 +#define UIP_ETHTYPE_IPV6 0x86dd + +/* The uip_arp_init() function must be called before any of the other + ARP functions. */ +void uip_arp_init( void ); + +/* The uip_arp_ipin() function should be called whenever an IP packet + arrives from the Ethernet. This function refreshes the ARP table or + inserts a new mapping if none exists. The function assumes that an + IP packet with an Ethernet header is present in the uip_buf buffer + and that the length of the packet is in the uip_len variable. */ + +/*void uip_arp_ipin(void);*/ +#define uip_arp_ipin() + +/* The uip_arp_arpin() should be called when an ARP packet is received + by the Ethernet driver. This function also assumes that the + Ethernet frame is present in the uip_buf buffer. When the + uip_arp_arpin() function returns, the contents of the uip_buf + buffer should be sent out on the Ethernet if the uip_len variable + is > 0. */ +void uip_arp_arpin( void ); + +/* The uip_arp_out() function should be called when an IP packet + should be sent out on the Ethernet. This function creates an + Ethernet header before the IP header in the uip_buf buffer. The + Ethernet header will have the correct Ethernet MAC destination + address filled in if an ARP table entry for the destination IP + address (or the IP address of the default router) is present. If no + such table entry is found, the IP packet is overwritten with an ARP + request and we rely on TCP to retransmit the packet that was + overwritten. In any case, the uip_len variable holds the length of + the Ethernet frame that should be transmitted. */ +void uip_arp_out( void ); + +/* The uip_arp_timer() function should be called every ten seconds. It + is responsible for flushing old entries in the ARP table. */ +void uip_arp_timer( void ); + +/** @} */ + +/** + * \addtogroup uipconffunc + * @{ + */ + +/** + * Specifiy the Ethernet MAC address. + * + * The ARP code needs to know the MAC address of the Ethernet card in + * order to be able to respond to ARP queries and to generate working + * Ethernet headers. + * + * \note This macro only specifies the Ethernet MAC address to the ARP + * code. It cannot be used to change the MAC address of the Ethernet + * card. + * + * \param eaddr A pointer to a struct uip_eth_addr containing the + * Ethernet MAC address of the Ethernet card. + * + * \hideinitializer + */ +#define uip_setethaddr( eaddr ) \ + do \ + { \ + uip_ethaddr.addr[0] = eaddr.addr[0]; \ + uip_ethaddr.addr[1] = eaddr.addr[1]; \ + uip_ethaddr.addr[2] = eaddr.addr[2]; \ + uip_ethaddr.addr[3] = eaddr.addr[3]; \ + uip_ethaddr.addr[4] = eaddr.addr[4]; \ + uip_ethaddr.addr[5] = eaddr.addr[5]; \ + } while( 0 ) + + /** @} */ +#endif /* __UIP_ARP_H__ */ + + /** @} */ + diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uipopt.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uipopt.h new file mode 100644 index 0000000..ddf6a24 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/net/uipopt.h @@ -0,0 +1,695 @@ +/** + * \addtogroup uip + * @{ + */ + +/** + * \defgroup uipopt Configuration options for uIP + * @{ + * + * uIP is configured using the per-project configuration file + * "uipopt.h". This file contains all compile-time options for uIP and + * should be tweaked to match each specific project. The uIP + * distribution contains a documented example "uipopt.h" that can be + * copied and modified for each project. + * + * \note Contiki does not use the uipopt.h file to configure uIP, but + * uses a per-port uip-conf.h file that should be edited instead. + */ + +/** + * \file + * Configuration options for uIP. + * \author Adam Dunkels + * + * This file is used for tweaking various configuration options for + * uIP. You should make a copy of this file into one of your project's + * directories instead of editing this example "uipopt.h" file that + * comes with the uIP distribution. + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uipopt.h,v 1.11 2009/04/10 00:37:48 adamdunkels Exp $ + * + */ +#ifndef __UIPOPT_H__ +#define __UIPOPT_H__ + +#ifndef UIP_LITTLE_ENDIAN +#define UIP_LITTLE_ENDIAN 3412 +#endif /* UIP_LITTLE_ENDIAN */ +#ifndef UIP_BIG_ENDIAN +#define UIP_BIG_ENDIAN 1234 +#endif /* UIP_BIG_ENDIAN */ + +#include "uip-conf.h" +//_RB_#include "contiki-conf.h" + +/*------------------------------------------------------------------------------*/ + +/** + * \defgroup uipoptstaticconf Static configuration options + * @{ + * + * These configuration options can be used for setting the IP address + * settings statically, but only if UIP_FIXEDADDR is set to 1. The + * configuration options for a specific node includes IP address, + * netmask and default router as well as the Ethernet address. The + * netmask, default router and Ethernet address are applicable only + * if uIP should be run over Ethernet. + * + * This options are meaningful only for the IPv4 code. + * + * All of these should be changed to suit your project. + */ + +/** + * Determines if uIP should use a fixed IP address or not. + * + * If uIP should use a fixed IP address, the settings are set in the + * uipopt.h file. If not, the macros uip_sethostaddr(), + * uip_setdraddr() and uip_setnetmask() should be used instead. + * + * \hideinitializer + */ +#ifdef UIP_CONF_FIXEDADDR +#define UIP_FIXED_ADDR UIP_CONF_FIXEDADDR +#define UIP_FIXEDADDR 1 +#endif + +/** + * Ping IP address assignment. + * + * uIP uses a "ping" packets for setting its own IP address if this + * option is set. If so, uIP will start with an empty IP address and + * the destination IP address of the first incoming "ping" (ICMP echo) + * packet will be used for setting the hosts IP address. + * + * \note This works only if UIP_FIXEDADDR is 0. + * + * \hideinitializer + */ +#ifdef UIP_CONF_PINGADDRCONF +#define UIP_PINGADDRCONF UIP_CONF_PINGADDRCONF +#else /* UIP_CONF_PINGADDRCONF */ +#define UIP_PINGADDRCONF 0 +#endif /* UIP_CONF_PINGADDRCONF */ + +/** + * Specifies if the uIP ARP module should be compiled with a fixed + * Ethernet MAC address or not. + * + * If this configuration option is 0, the macro uip_setethaddr() can + * be used to specify the Ethernet address at run-time. + * + * \hideinitializer + */ +#define UIP_FIXEDETHADDR 0 + +/** @} */ + +/*------------------------------------------------------------------------------*/ + +/** + * \defgroup uipoptip IP configuration options + * @{ + * + */ + +/** + * The IP TTL (time to live) of IP packets sent by uIP. + * + * This should normally not be changed. + */ +#define UIP_TTL 64 + +/** + * The maximum time an IP fragment should wait in the reassembly + * buffer before it is dropped. + * + */ +#define UIP_REASS_MAXAGE 60 /*60s*/ + +/** + * Turn on support for IP packet reassembly. + * + * uIP supports reassembly of fragmented IP packets. This features + * requires an additional amount of RAM to hold the reassembly buffer + * and the reassembly code size is approximately 700 bytes. The + * reassembly buffer is of the same size as the uip_buf buffer + * (configured by UIP_BUFSIZE). + * + * \note IP packet reassembly is not heavily tested. + * + * \hideinitializer + */ +#ifdef UIP_CONF_REASSEMBLY +#define UIP_REASSEMBLY UIP_CONF_REASSEMBLY +#else /* UIP_CONF_REASSEMBLY */ +#define UIP_REASSEMBLY 0 +#endif /* UIP_CONF_REASSEMBLY */ + +/** @} */ + +/*------------------------------------------------------------------------------*/ + +/** + * \defgroup uipoptipv6 IPv6 configuration options + * @{ + * + */ + +/** The maximum transmission unit at the IP Layer*/ +#define UIP_LINK_MTU 1280 + +#ifndef UIP_CONF_IPV6 + +/** Do we use IPv6 or not (default: no) */ +#define UIP_CONF_IPV6 0 +#endif +#ifndef UIP_CONF_IPV6_QUEUE_PKT + +/** Do we do per %neighbor queuing during address resolution (default: no) */ +#define UIP_CONF_IPV6_QUEUE_PKT 0 +#endif +#ifndef UIP_CONF_IPV6_CHECKS + +/** Do we do IPv6 consistency checks (highly recommended, default: yes) */ +#define UIP_CONF_IPV6_CHECKS 1 +#endif +#ifndef UIP_CONF_IPV6_REASSEMBLY + +/** Do we do IPv6 fragmentation (default: no) */ +#define UIP_CONF_IPV6_REASSEMBLY 0 +#endif +#ifndef UIP_CONF_NETIF_MAX_ADDRESSES + +/** Default number of IPv6 addresses associated to the node's interface */ +#define UIP_CONF_NETIF_MAX_ADDRESSES 3 +#endif +#ifndef UIP_CONF_ND6_MAX_PREFIXES + +/** Default number of IPv6 prefixes associated to the node's interface */ +#define UIP_CONF_ND6_MAX_PREFIXES 3 +#endif +#ifndef UIP_CONF_ND6_MAX_NEIGHBORS + +/** Default number of neighbors that can be stored in the %neighbor cache */ +#define UIP_CONF_ND6_MAX_NEIGHBORS 4 +#endif +#ifndef UIP_CONF_ND6_MAX_DEFROUTERS + +/** Minimum number of default routers */ +#define UIP_CONF_ND6_MAX_DEFROUTERS 2 +#endif + +/** @} */ + +/*------------------------------------------------------------------------------*/ + +/** + * \defgroup uipoptudp UDP configuration options + * @{ + * + * \note The UDP support in uIP is still not entirely complete; there + * is no support for sending or receiving broadcast or multicast + * packets, but it works well enough to support a number of vital + * applications such as DNS queries, though + */ + +/** + * Toggles whether UDP support should be compiled in or not. + * + * \hideinitializer + */ +#ifdef UIP_CONF_UDP +#define UIP_UDP UIP_CONF_UDP +#else /* UIP_CONF_UDP */ +#define UIP_UDP 0 +#endif /* UIP_CONF_UDP */ + +/** + * Toggles if UDP checksums should be used or not. + * + * \note Support for UDP checksums is currently not included in uIP, + * so this option has no function. + * + * \hideinitializer + */ +#ifdef UIP_CONF_UDP_CHECKSUMS +#define UIP_UDP_CHECKSUMS UIP_CONF_UDP_CHECKSUMS +#else +#define UIP_UDP_CHECKSUMS 0 +#endif + +/** + * The maximum amount of concurrent UDP connections. + * + * \hideinitializer + */ +#ifdef UIP_CONF_UDP_CONNS +#define UIP_UDP_CONNS UIP_CONF_UDP_CONNS +#else /* UIP_CONF_UDP_CONNS */ +#define UIP_UDP_CONNS 10 +#endif /* UIP_CONF_UDP_CONNS */ + +/** + * The name of the function that should be called when UDP datagrams arrive. + * + * \hideinitializer + */ + +/** @} */ + +/*------------------------------------------------------------------------------*/ + +/** + * \defgroup uipopttcp TCP configuration options + * @{ + */ + +/** + * Toggles whether UDP support should be compiled in or not. + * + * \hideinitializer + */ +#ifdef UIP_CONF_TCP +#define UIP_TCP UIP_CONF_TCP +#else /* UIP_CONF_UDP */ +#define UIP_TCP 1 +#endif /* UIP_CONF_UDP */ + +/** + * Determines if support for opening connections from uIP should be + * compiled in. + * + * If the applications that are running on top of uIP for this project + * do not need to open outgoing TCP connections, this configuration + * option can be turned off to reduce the code size of uIP. + * + * \hideinitializer + */ +#ifndef UIP_CONF_ACTIVE_OPEN +#define UIP_ACTIVE_OPEN 1 +#else /* UIP_CONF_ACTIVE_OPEN */ +#define UIP_ACTIVE_OPEN UIP_CONF_ACTIVE_OPEN +#endif /* UIP_CONF_ACTIVE_OPEN */ + +/** + * The maximum number of simultaneously open TCP connections. + * + * Since the TCP connections are statically allocated, turning this + * configuration knob down results in less RAM used. Each TCP + * connection requires approximately 30 bytes of memory. + * + * \hideinitializer + */ +#ifndef UIP_CONF_MAX_CONNECTIONS +#define UIP_CONNS 10 +#else /* UIP_CONF_MAX_CONNECTIONS */ +#define UIP_CONNS UIP_CONF_MAX_CONNECTIONS +#endif /* UIP_CONF_MAX_CONNECTIONS */ + +/** + * The maximum number of simultaneously listening TCP ports. + * + * Each listening TCP port requires 2 bytes of memory. + * + * \hideinitializer + */ +#ifndef UIP_CONF_MAX_LISTENPORTS +#define UIP_LISTENPORTS 20 +#else /* UIP_CONF_MAX_LISTENPORTS */ +#define UIP_LISTENPORTS UIP_CONF_MAX_LISTENPORTS +#endif /* UIP_CONF_MAX_LISTENPORTS */ + +/** + * Determines if support for TCP urgent data notification should be + * compiled in. + * + * Urgent data (out-of-band data) is a rarely used TCP feature that + * very seldom would be required. + * + * \hideinitializer + */ +#define UIP_URGDATA 0 + +/** + * The initial retransmission timeout counted in timer pulses. + * + * This should not be changed. + */ +#define UIP_RTO 3 + +/** + * The maximum number of times a segment should be retransmitted + * before the connection should be aborted. + * + * This should not be changed. + */ +#define UIP_MAXRTX 8 + +/** + * The maximum number of times a SYN segment should be retransmitted + * before a connection request should be deemed to have been + * unsuccessful. + * + * This should not need to be changed. + */ +#define UIP_MAXSYNRTX 5 + +/** + * The TCP maximum segment size. + * + * This is should not be to set to more than + * UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN. + */ +#ifdef UIP_CONF_TCP_MSS +#define UIP_TCP_MSS UIP_CONF_TCP_MSS +#else +#define UIP_TCP_MSS ( UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN ) +#endif + +/** + * The size of the advertised receiver's window. + * + * Should be set low (i.e., to the size of the uip_buf buffer) if the + * application is slow to process incoming data, or high (32768 bytes) + * if the application processes data quickly. + * + * \hideinitializer + */ +#ifndef UIP_CONF_RECEIVE_WINDOW +#define UIP_RECEIVE_WINDOW UIP_TCP_MSS +#else +#define UIP_RECEIVE_WINDOW UIP_CONF_RECEIVE_WINDOW +#endif + +/** + * How long a connection should stay in the TIME_WAIT state. + * + * This configuration option has no real implication, and it should be + * left untouched. + */ +#define UIP_TIME_WAIT_TIMEOUT 120 + +/** @} */ + +/*------------------------------------------------------------------------------*/ + +/** + * \defgroup uipoptarp ARP configuration options + * @{ + */ + +/** + * The size of the ARP table. + * + * This option should be set to a larger value if this uIP node will + * have many connections from the local network. + * + * \hideinitializer + */ +#ifdef UIP_CONF_ARPTAB_SIZE +#define UIP_ARPTAB_SIZE UIP_CONF_ARPTAB_SIZE +#else +#define UIP_ARPTAB_SIZE 8 +#endif + +/** + * The maximum age of ARP table entries measured in 10ths of seconds. + * + * An UIP_ARP_MAXAGE of 120 corresponds to 20 minutes (BSD + * default). + */ +#define UIP_ARP_MAXAGE 120 + +/** @} */ + +/*------------------------------------------------------------------------------*/ + +/** + * \defgroup uipoptmac layer 2 options (for ipv6) + * @{ + */ +#define UIP_DEFAULT_PREFIX_LEN 64 + +/** @} */ + +/*------------------------------------------------------------------------------*/ + +/** + * \defgroup uipoptsics 6lowpan options (for ipv6) + * @{ + */ + +/** + * Timeout for packet reassembly at the 6lowpan layer + * (should be < 60s) + */ +#ifdef SICSLOWPAN_CONF_MAXAGE +#define SICSLOWPAN_REASS_MAXAGE SICSLOWPAN_CONF_MAXAGE +#else +#define SICSLOWPAN_REASS_MAXAGE 20 +#endif + +/** + * Do we compress the IP header or not (default: no) + */ +#ifndef SICSLOWPAN_CONF_COMPRESSION +#define SICSLOWPAN_CONF_COMPRESSION 0 +#endif + +/** + * If we use IPHC compression, how many address contexts do we support + */ +#ifndef SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS +#define SICSLOWPAN_CONF_MAX_ADDR_CONTEXTS 1 +#endif + +/** + * Do we support 6lowpan fragmentation + */ +#ifndef SICSLOWPAN_CONF_FRAG +#define SICSLOWPAN_CONF_FRAG 0 +#endif + +/** @} */ + +/*------------------------------------------------------------------------------*/ + +/** + * \defgroup uipoptgeneral General configuration options + * @{ + */ + +/** + * The size of the uIP packet buffer. + * + * The uIP packet buffer should not be smaller than 60 bytes, and does + * not need to be larger than 1514 bytes. Lower size results in lower + * TCP throughput, larger size results in higher TCP throughput. + * + * \hideinitializer + */ +#ifndef UIP_CONF_BUFFER_SIZE +#define UIP_BUFSIZE UIP_LINK_MTU + UIP_LLH_LEN +#else /* UIP_CONF_BUFFER_SIZE */ +#define UIP_BUFSIZE UIP_CONF_BUFFER_SIZE +#endif /* UIP_CONF_BUFFER_SIZE */ + +/** + * Determines if statistics support should be compiled in. + * + * The statistics is useful for debugging and to show the user. + * + * \hideinitializer + */ +#ifndef UIP_CONF_STATISTICS +#define UIP_STATISTICS 0 +#else /* UIP_CONF_STATISTICS */ +#define UIP_STATISTICS UIP_CONF_STATISTICS +#endif /* UIP_CONF_STATISTICS */ + +/** + * Determines if logging of certain events should be compiled in. + * + * This is useful mostly for debugging. The function uip_log() + * must be implemented to suit the architecture of the project, if + * logging is turned on. + * + * \hideinitializer + */ +#ifndef UIP_CONF_LOGGING +#define UIP_LOGGING 0 +#else /* UIP_CONF_LOGGING */ +#define UIP_LOGGING UIP_CONF_LOGGING +#endif /* UIP_CONF_LOGGING */ + +/** + * Broadcast support. + * + * This flag configures IP broadcast support. This is useful only + * together with UDP. + * + * \hideinitializer + * + */ +#ifndef UIP_CONF_BROADCAST +#define UIP_BROADCAST 0 +#else /* UIP_CONF_BROADCAST */ +#define UIP_BROADCAST UIP_CONF_BROADCAST +#endif /* UIP_CONF_BROADCAST */ + +/** + * Print out a uIP log message. + * + * This function must be implemented by the module that uses uIP, and + * is called by uIP whenever a log message is generated. + */ +void uip_log( char *msg ); + +/** + * The link level header length. + * + * This is the offset into the uip_buf where the IP header can be + * found. For Ethernet, this should be set to 14. For SLIP, this + * should be set to 0. + * + * \note we probably won't use this constant for other link layers than + * ethernet as they have variable header length (this is due to variable + * number and type of address fields and to optional security features) + * E.g.: 802.15.4 -> 2 + (1/2*4/8) + 0/5/6/10/14 + * 802.11 -> 4 + (6*3/4) + 2 + * \hideinitializer + */ +#ifdef UIP_CONF_LLH_LEN +#define UIP_LLH_LEN UIP_CONF_LLH_LEN +#else /* UIP_LLH_LEN */ +#define UIP_LLH_LEN 14 +#endif /* UIP_CONF_LLH_LEN */ + +/** @} */ + +/*------------------------------------------------------------------------------*/ + +/** + * \defgroup uipoptcpu CPU architecture configuration + * @{ + * + * The CPU architecture configuration is where the endianess of the + * CPU on which uIP is to be run is specified. Most CPUs today are + * little endian, and the most notable exception are the Motorolas + * which are big endian. The BYTE_ORDER macro should be changed to + * reflect the CPU architecture on which uIP is to be run. + */ + +/** + * The byte order of the CPU architecture on which uIP is to be run. + * + * This option can be either UIP_BIG_ENDIAN (Motorola byte order) or + * UIP_LITTLE_ENDIAN (Intel byte order). + * + * \hideinitializer + */ +#ifdef UIP_CONF_BYTE_ORDER +#define UIP_BYTE_ORDER UIP_CONF_BYTE_ORDER +#else /* UIP_CONF_BYTE_ORDER */ +#define UIP_BYTE_ORDER UIP_LITTLE_ENDIAN +#endif /* UIP_CONF_BYTE_ORDER */ + +/** @} */ + +/*------------------------------------------------------------------------------*/ + +/** + * \defgroup uipoptapp Application specific configurations + * @{ + * + * An uIP application is implemented using a single application + * function that is called by uIP whenever a TCP/IP event occurs. The + * name of this function must be registered with uIP at compile time + * using the UIP_APPCALL definition. + * + * uIP applications can store the application state within the + * uip_conn structure by specifying the type of the application + * structure by typedef:ing the type uip_tcp_appstate_t and uip_udp_appstate_t. + * + * The file containing the definitions must be included in the + * uipopt.h file. + * + * The following example illustrates how this can look. + \code + + void httpd_appcall(void); + #define UIP_APPCALL httpd_appcall + + struct httpd_state { + u8_t state; + u16_t count; + char *dataptr; + char *script; + }; + typedef struct httpd_state uip_tcp_appstate_t + \endcode +*/ + +/** + * \var #define UIP_APPCALL + * + * The name of the application function that uIP should call in + * response to TCP/IP events. + * + */ + +/** + * \var typedef uip_tcp_appstate_t + * + * The type of the application state that is to be stored in the + * uip_conn structure. This usually is typedef:ed to a struct holding + * application state information. + */ + +/** + * \var typedef uip_udp_appstate_t + * + * The type of the application state that is to be stored in the + * uip_conn structure. This usually is typedef:ed to a struct holding + * application state information. + */ + +/** @} */ +#endif /* __UIPOPT_H__ */ + +/** @} */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/psock.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/psock.c new file mode 100644 index 0000000..1f224b6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/psock.c @@ -0,0 +1,338 @@ +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: psock.c,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +#include +#include + +#include "net/uipopt.h" +#include "net/psock.h" +#include "net/uip.h" + +#define STATE_NONE 0 +#define STATE_ACKED 1 +#define STATE_READ 2 +#define STATE_BLOCKED_NEWDATA 3 +#define STATE_BLOCKED_CLOSE 4 +#define STATE_BLOCKED_SEND 5 +#define STATE_DATA_SENT 6 + +/* + * Return value of the buffering functions that indicates that a + * buffer was not filled by incoming data. + * + */ +#define BUF_NOT_FULL 0 +#define BUF_NOT_FOUND 0 + +/* + * Return value of the buffering functions that indicates that a + * buffer was completely filled by incoming data. + * + */ +#define BUF_FULL 1 + +/* + * Return value of the buffering functions that indicates that an + * end-marker byte was found. + * + */ +#define BUF_FOUND 2 + +/*---------------------------------------------------------------------------*/ +static void +buf_setup(struct psock_buf *buf, + u8_t *bufptr, u16_t bufsize) +{ + buf->ptr = bufptr; + buf->left = bufsize; +} +/*---------------------------------------------------------------------------*/ +static u8_t +buf_bufdata(struct psock_buf *buf, u16_t len, + u8_t **dataptr, u16_t *datalen) +{ + ( void ) len; + if(*datalen < buf->left) { + memcpy(buf->ptr, *dataptr, *datalen); + buf->ptr += *datalen; + buf->left -= *datalen; + *dataptr += *datalen; + *datalen = 0; + return BUF_NOT_FULL; + } else if(*datalen == buf->left) { + memcpy(buf->ptr, *dataptr, *datalen); + buf->ptr += *datalen; + buf->left = 0; + *dataptr += *datalen; + *datalen = 0; + return BUF_FULL; + } else { + memcpy(buf->ptr, *dataptr, buf->left); + buf->ptr += buf->left; + *datalen -= buf->left; + *dataptr += buf->left; + buf->left = 0; + return BUF_FULL; + } +} +/*---------------------------------------------------------------------------*/ +static u8_t +buf_bufto(register struct psock_buf *buf, u8_t endmarker, + register u8_t **dataptr, register u16_t *datalen) +{ + u8_t c; + while(buf->left > 0 && *datalen > 0) { + c = *buf->ptr = **dataptr; + ++*dataptr; + ++buf->ptr; + --*datalen; + --buf->left; + + if(c == endmarker) { + return BUF_FOUND; + } + } + + if(*datalen == 0) { + return BUF_NOT_FOUND; + } + + while(*datalen > 0) { + c = **dataptr; + --*datalen; + ++*dataptr; + + if(c == endmarker) { + return BUF_FOUND | BUF_FULL; + } + } + + return BUF_FULL; +} +/*---------------------------------------------------------------------------*/ +static char +send_data(register struct psock *s) +{ + if(s->state != STATE_DATA_SENT || uip_rexmit()) { + if(s->sendlen > uip_mss()) { + uip_send(s->sendptr, uip_mss()); + } else { + uip_send(s->sendptr, s->sendlen); + } + s->state = STATE_DATA_SENT; + return 1; + } + return 0; +} +/*---------------------------------------------------------------------------*/ +static char +data_acked(register struct psock *s) +{ + if(s->state == STATE_DATA_SENT && uip_acked()) { + if(s->sendlen > uip_mss()) { + s->sendlen -= uip_mss(); + s->sendptr += uip_mss(); + } else { + s->sendptr += s->sendlen; + s->sendlen = 0; + } + s->state = STATE_ACKED; + return 1; + } + return 0; +} +/*---------------------------------------------------------------------------*/ +PT_THREAD(psock_send(register struct psock *s, const char *buf, + unsigned int len)) +{ + PT_BEGIN(&s->psockpt); + ( void ) PT_YIELD_FLAG; + /* If there is no data to send, we exit immediately. */ + if(len == 0) { + PT_EXIT(&s->psockpt); + } + + /* Save the length of and a pointer to the data that is to be + sent. */ + s->sendptr = (unsigned char*)buf; + s->sendlen = (unsigned short)len; + + s->state = STATE_NONE; + + /* We loop here until all data is sent. The s->sendlen variable is + updated by the data_sent() function. */ + while(s->sendlen > 0) { + + /* + * The condition for this PT_WAIT_UNTIL is a little tricky: the + * protothread will wait here until all data has been acknowledged + * (data_acked() returns true) and until all data has been sent + * (send_data() returns true). The two functions data_acked() and + * send_data() must be called in succession to ensure that all + * data is sent. Therefore the & operator is used instead of the + * && operator, which would cause only the data_acked() function + * to be called when it returns false. + */ + PT_WAIT_UNTIL(&s->psockpt, data_acked(s) & send_data(s)); + } + + s->state = STATE_NONE; + + PT_END(&s->psockpt); +} +/*---------------------------------------------------------------------------*/ +PT_THREAD(psock_generator_send(register struct psock *s, + unsigned short (*generate)(void *), void *arg)) +{ + PT_BEGIN(&s->psockpt); + ( void ) PT_YIELD_FLAG; + /* Ensure that there is a generator function to call. */ + if(generate == NULL) { + PT_EXIT(&s->psockpt); + } + + /* Call the generator function to generate the data in the + uip_appdata buffer. */ + s->sendlen = generate(arg); + s->sendptr = uip_appdata; + + s->state = STATE_NONE; + do { + /* Call the generator function again if we are called to perform a + retransmission. */ + if(uip_rexmit()) { + generate(arg); + } + /* Wait until all data is sent and acknowledged. */ + PT_WAIT_UNTIL(&s->psockpt, data_acked(s) & send_data(s)); + } while(s->sendlen > 0); + + s->state = STATE_NONE; + + PT_END(&s->psockpt); +} +/*---------------------------------------------------------------------------*/ +u16_t +psock_datalen(struct psock *psock) +{ + return psock->bufsize - psock->buf.left; +} +/*---------------------------------------------------------------------------*/ +char +psock_newdata(struct psock *s) +{ + if(s->readlen > 0) { + /* There is data in the uip_appdata buffer that has not yet been + read with the PSOCK_READ functions. */ + return 1; + } else if(s->state == STATE_READ) { + /* All data in uip_appdata buffer already consumed. */ + s->state = STATE_BLOCKED_NEWDATA; + return 0; + } else if(uip_newdata()) { + /* There is new data that has not been consumed. */ + return 1; + } else { + /* There is no new data. */ + return 0; + } +} +/*---------------------------------------------------------------------------*/ +PT_THREAD(psock_readto(register struct psock *psock, unsigned char c)) +{ + PT_BEGIN(&psock->psockpt); + ( void ) PT_YIELD_FLAG; + buf_setup(&psock->buf, (unsigned char*)psock->bufptr, psock->bufsize); + + /* XXX: Should add buf_checkmarker() before do{} loop, if + incoming data has been handled while waiting for a write. */ + + do { + if(psock->readlen == 0) { + PT_WAIT_UNTIL(&psock->psockpt, psock_newdata(psock)); + psock->state = STATE_READ; + psock->readptr = (u8_t *)uip_appdata; + psock->readlen = uip_datalen(); + } + } while((buf_bufto(&psock->buf, c, + &psock->readptr, + &psock->readlen) & BUF_FOUND) == 0); + + if(psock_datalen(psock) == 0) { + psock->state = STATE_NONE; + PT_RESTART(&psock->psockpt); + } + PT_END(&psock->psockpt); +} +/*---------------------------------------------------------------------------*/ +PT_THREAD(psock_readbuf(register struct psock *psock)) +{ + PT_BEGIN(&psock->psockpt); + ( void ) PT_YIELD_FLAG; + buf_setup(&psock->buf, (unsigned char * ) psock->bufptr, psock->bufsize); + + /* XXX: Should add buf_checkmarker() before do{} loop, if + incoming data has been handled while waiting for a write. */ + + do { + if(psock->readlen == 0) { + PT_WAIT_UNTIL(&psock->psockpt, psock_newdata(psock)); + psock->state = STATE_READ; + psock->readptr = (u8_t *)uip_appdata; + psock->readlen = uip_datalen(); + } + } while(buf_bufdata(&psock->buf, psock->bufsize, + &psock->readptr, + &psock->readlen) != BUF_FULL); + + if(psock_datalen(psock) == 0) { + psock->state = STATE_NONE; + PT_RESTART(&psock->psockpt); + } + PT_END(&psock->psockpt); +} +/*---------------------------------------------------------------------------*/ +void +psock_init(register struct psock *psock, char *buffer, unsigned int buffersize) +{ + psock->state = STATE_NONE; + psock->readlen = 0; + psock->bufptr = buffer; + psock->bufsize = buffersize; + buf_setup(&psock->buf, (unsigned char*) buffer, buffersize); + PT_INIT(&psock->pt); + PT_INIT(&psock->psockpt); +} +/*---------------------------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/sys/clock.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/sys/clock.h new file mode 100644 index 0000000..9f93583 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/sys/clock.h @@ -0,0 +1,115 @@ +/** \addtogroup sys + * @{ + */ + +/** + * \defgroup clock Clock library + * + * The clock library is the interface between Contiki and the platform + * specific clock functionality. The clock library performs a single + * function: measuring time. Additionally, the clock library provides + * a macro, CLOCK_SECOND, which corresponds to one second of system + * time. + * + * \note The clock library need in many cases not be used + * directly. Rather, the \ref timer "timer library" or the \ref etimer + * "event timers" should be used. + * + * \sa \ref timer "Timer library" + * \sa \ref etimer "Event timers" + * + * @{ + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * Author: Adam Dunkels + * + * $Id: clock.h,v 1.11 2009/01/24 15:20:11 adamdunkels Exp $ + */ +#ifndef __CLOCK_H__ +#define __CLOCK_H__ + +#include "net/clock-arch.h" + +//_RB_#include "contiki-conf.h" +#if 0 /* XXX problems with signedness and use in timer_expired(). #if:ed it out for now. */ + +/** + * Check if a clock time value is less than another clock time value. + * + * This macro checks if a clock time value is less than another clock + * time value. This macro is needed to correctly handle wrap-around of + * clock time values. + * + */ +#define CLOCK_LT( a, b ) ( (clock_time_t) ((a) - (b)) < ((clock_time_t) (~((clock_time_t) 0)) >> 1) ) +#endif /* 0 */ + +/** + * Initialize the clock library. + * + * This function initializes the clock library and should be called + * from the main() function of the system. + * + */ +void clock_init( void ); + +/** + * Get the current clock time. + * + * This function returns the current system clock time. + * + * \return The current clock time, measured in system ticks. + */ +CCIF clock_time_t clock_time( void ); + +void clock_delay( unsigned int ); + +/** + * A second, measured in system clock time. + * + * \hideinitializer + */ +#ifdef CLOCK_CONF_SECOND +#define CLOCK_SECOND CLOCK_CONF_SECOND +#else +#define CLOCK_SECOND ( clock_time_t ) 32 +#endif +int clock_fine_max( void ); +unsigned short clock_fine( void ); + +CCIF unsigned long clock_seconds( void ); +#endif /* __CLOCK_H__ */ + +/** @} */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/sys/pt.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/sys/pt.h new file mode 100644 index 0000000..b0b9408 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/sys/pt.h @@ -0,0 +1,335 @@ +/* + * Copyright (c) 2004-2005, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * Author: Adam Dunkels + * + * $Id: pt.h,v 1.3 2008/10/14 12:46:39 nvt-se Exp $ + */ + +/** + * \addtogroup pt + * @{ + */ + +/** + * \file + * Protothreads implementation. + * \author + * Adam Dunkels + * + */ +#ifndef __PT_H__ +#define __PT_H__ + +#include "sys/lc.h" + +struct pt +{ + lc_t lc; +}; + +#define PT_WAITING 0 +#define PT_YIELDED 1 +#define PT_EXITED 2 +#define PT_ENDED 3 + +/** + * \name Initialization + * @{ + */ + +/** + * Initialize a protothread. + * + * Initializes a protothread. Initialization must be done prior to + * starting to execute the protothread. + * + * \param pt A pointer to the protothread control structure. + * + * \sa PT_SPAWN() + * + * \hideinitializer + */ +#define PT_INIT( pt ) LC_INIT( (pt)->lc ) + +/** @} */ + +/** + * \name Declaration and definition + * @{ + */ + +/** + * Declaration of a protothread. + * + * This macro is used to declare a protothread. All protothreads must + * be declared with this macro. + * + * \param name_args The name and arguments of the C function + * implementing the protothread. + * + * \hideinitializer + */ +#define PT_THREAD( name_args ) char name_args + +/** + * Declare the start of a protothread inside the C function + * implementing the protothread. + * + * This macro is used to declare the starting point of a + * protothread. It should be placed at the start of the function in + * which the protothread runs. All C statements above the PT_BEGIN() + * invokation will be executed each time the protothread is scheduled. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_BEGIN( pt ) \ + { \ + char PT_YIELD_FLAG = 1; \ + LC_RESUME( (pt)->lc ) + +/** + * Declare the end of a protothread. + * + * This macro is used for declaring that a protothread ends. It must + * always be used together with a matching PT_BEGIN() macro. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_END( pt ) \ + LC_END( (pt)->lc ); \ + PT_YIELD_FLAG = 0; \ + PT_INIT( pt ); \ + return PT_ENDED; \ +} + +/** @} */ + +/** + * \name Blocked wait + * @{ + */ + +/** + * Block and wait until condition is true. + * + * This macro blocks the protothread until the specified condition is + * true. + * + * \param pt A pointer to the protothread control structure. + * \param condition The condition. + * + * \hideinitializer + */ +#define PT_WAIT_UNTIL( pt, condition ) \ + do \ + { \ + LC_SET( (pt)->lc ); \ + if( !(condition) ) \ + { \ + return PT_WAITING; \ + } \ + } while( 0 ) + +/** + * Block and wait while condition is true. + * + * This function blocks and waits while condition is true. See + * PT_WAIT_UNTIL(). + * + * \param pt A pointer to the protothread control structure. + * \param cond The condition. + * + * \hideinitializer + */ +#define PT_WAIT_WHILE( pt, cond ) PT_WAIT_UNTIL( (pt), !(cond) ) + /** @} */ + + /** + * \name Hierarchical protothreads + * @{ + */ + +/** + * Block and wait until a child protothread completes. + * + * This macro schedules a child protothread. The current protothread + * will block until the child protothread completes. + * + * \note The child protothread must be manually initialized with the + * PT_INIT() function before this function is used. + * + * \param pt A pointer to the protothread control structure. + * \param thread The child protothread with arguments + * + * \sa PT_SPAWN() + * + * \hideinitializer + */ +#define PT_WAIT_THREAD( pt, thread ) PT_WAIT_WHILE( (pt), PT_SCHEDULE(thread) ) + +/** + * Spawn a child protothread and wait until it exits. + * + * This macro spawns a child protothread and waits until it exits. The + * macro can only be used within a protothread. + * + * \param pt A pointer to the protothread control structure. + * \param child A pointer to the child protothread's control structure. + * \param thread The child protothread with arguments + * + * \hideinitializer + */ +#define PT_SPAWN( pt, child, thread ) \ + do \ + { \ + PT_INIT( (child) ); \ + PT_WAIT_THREAD( (pt), (thread) ); \ + } while( 0 ) + + /** @} */ + + /** + * \name Exiting and restarting + * @{ + */ + +/** + * Restart the protothread. + * + * This macro will block and cause the running protothread to restart + * its execution at the place of the PT_BEGIN() call. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_RESTART( pt ) \ + do \ + { \ + PT_INIT( pt ); \ + return PT_WAITING; \ + } while( 0 ) + +/** + * Exit the protothread. + * + * This macro causes the protothread to exit. If the protothread was + * spawned by another protothread, the parent protothread will become + * unblocked and can continue to run. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_EXIT( pt ) \ + do \ + { \ + PT_INIT( pt ); \ + return PT_EXITED; \ + } while( 0 ) + /** @} */ + + /** + * \name Calling a protothread + * @{ + */ + +/** + * Schedule a protothread. + * + * This function schedules a protothread. The return value of the + * function is non-zero if the protothread is running or zero if the + * protothread has exited. + * + * \param f The call to the C function implementing the protothread to + * be scheduled + * + * \hideinitializer + */ +#define PT_SCHEDULE( f ) ( (f) < PT_EXITED ) + /** @} */ + + /** + * \name Yielding from a protothread + * @{ + */ + +/** + * Yield from the current protothread. + * + * This function will yield the protothread, thereby allowing other + * processing to take place in the system. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_YIELD( pt ) \ + do \ + { \ + PT_YIELD_FLAG = 0; \ + LC_SET( (pt)->lc ); \ + if( PT_YIELD_FLAG == 0 ) \ + { \ + return PT_YIELDED; \ + } \ + } while( 0 ) + +/** + * \brief Yield from the protothread until a condition occurs. + * \param pt A pointer to the protothread control structure. + * \param cond The condition. + * + * This function will yield the protothread, until the + * specified condition evaluates to true. + * + * + * \hideinitializer + */ +#define PT_YIELD_UNTIL( pt, cond ) \ + do \ + { \ + PT_YIELD_FLAG = 0; \ + LC_SET( (pt)->lc ); \ + if( (PT_YIELD_FLAG == 0) || !(cond) ) \ + { \ + return PT_YIELDED; \ + } \ + } while( 0 ) + /** @} */ +#endif /* __PT_H__ */ + + /** @} */ + \ No newline at end of file diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/sys/timer.h b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/sys/timer.h new file mode 100644 index 0000000..1d87e7e --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/sys/timer.h @@ -0,0 +1,101 @@ +/** \addtogroup sys + * @{ */ + +/** + * \defgroup timer Timer library + * + * The Contiki kernel does not provide support for timed + * events. Rather, an application that wants to use timers needs to + * explicitly use the timer library. + * + * The timer library provides functions for setting, resetting and + * restarting timers, and for checking if a timer has expired. An + * application must "manually" check if its timers have expired; this + * is not done automatically. + * + * A timer is declared as a \c struct \c timer and all access to the + * timer is made by a pointer to the declared timer. + * + * \note The timer library is not able to post events when a timer + * expires. The \ref etimer "Event timers" should be used for this + * purpose. + * + * \note The timer library uses the \ref clock "Clock library" to + * measure time. Intervals should be specified in the format used by + * the clock library. + * + * \sa \ref etimer "Event timers" + * + * @{ + */ + +/** + * \file + * Timer library header file. + * \author + * Adam Dunkels + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * Author: Adam Dunkels + * + * $Id: timer.h,v 1.2 2008/09/21 08:58:05 adamdunkels Exp $ + */ +#ifndef __TIMER_H__ +#define __TIMER_H__ + +#include "sys/clock.h" + +/** + * A timer. + * + * This structure is used for declaring a timer. The timer must be set + * with timer_set() before it can be used. + * + * \hideinitializer + */ +struct timer +{ + clock_time_t start; + clock_time_t interval; +}; + +void timer_set( struct timer *t, clock_time_t interval ); +void timer_reset( struct timer *t ); +void timer_restart( struct timer *t ); +int timer_expired( struct timer *t ); +clock_time_t timer_remaining( struct timer *t ); +#endif /* __TIMER_H__ */ + +/** @} */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/timer.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/timer.c new file mode 100644 index 0000000..e520391 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/timer.c @@ -0,0 +1,151 @@ +/** + * \addtogroup timer + * @{ + */ + +/** + * \file + * Timer library implementation. + * \author + * Adam Dunkels + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the Contiki operating system. + * + * Author: Adam Dunkels + * + * $Id: timer.c,v 1.5 2009/01/24 15:20:11 adamdunkels Exp $ + */ + +//_RB_#include "contiki-conf.h" +#include "uip-conf.h" +#include "net/clock-arch.h" +#include "sys/clock.h" +#include "sys/timer.h" + +/*---------------------------------------------------------------------------*/ + +/** + * Set a timer. + * + * This function is used to set a timer for a time sometime in the + * future. The function timer_expired() will evaluate to true after + * the timer has expired. + * + * \param t A pointer to the timer + * \param interval The interval before the timer expires. + * + */ +void timer_set( struct timer *t, clock_time_t interval ) +{ + t->interval = interval; + t->start = clock_time(); +} + +/*---------------------------------------------------------------------------*/ + +/** + * Reset the timer with the same interval. + * + * This function resets the timer with the same interval that was + * given to the timer_set() function. The start point of the interval + * is the exact time that the timer last expired. Therefore, this + * function will cause the timer to be stable over time, unlike the + * timer_restart() function. + * + * \param t A pointer to the timer. + * + * \sa timer_restart() + */ +void timer_reset( struct timer *t ) +{ + t->start += t->interval; +} + +/*---------------------------------------------------------------------------*/ + +/** + * Restart the timer from the current point in time + * + * This function restarts a timer with the same interval that was + * given to the timer_set() function. The timer will start at the + * current time. + * + * \note A periodic timer will drift if this function is used to reset + * it. For preioric timers, use the timer_reset() function instead. + * + * \param t A pointer to the timer. + * + * \sa timer_reset() + */ +void timer_restart( struct timer *t ) +{ + t->start = clock_time(); +} + +/*---------------------------------------------------------------------------*/ + +/** + * Check if a timer has expired. + * + * This function tests if a timer has expired and returns true or + * false depending on its status. + * + * \param t A pointer to the timer + * + * \return Non-zero if the timer has expired, zero otherwise. + * + */ +int timer_expired( struct timer *t ) +{ + return( clock_time_t ) ( clock_time() - t->start ) >= ( clock_time_t ) t->interval; +} + +/*---------------------------------------------------------------------------*/ + +/** + * The time until the timer expires + * + * This function returns the time until the timer expires. + * + * \param t A pointer to the timer + * + * \return The time until the timer expires + * + */ +clock_time_t timer_remaining( struct timer *t ) +{ + return t->start + t->interval - clock_time(); +} + +/*---------------------------------------------------------------------------*/ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/uip.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/uip.c new file mode 100644 index 0000000..78c6713 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/uip.c @@ -0,0 +1,2143 @@ +//#define DEBUG_PRINTF( ... ) /*printf(__VA_ARGS__)*/ + +/** + * \addtogroup uip + * @{ + */ + +/** + * \file + * The uIP TCP/IP stack code. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip.c,v 1.15 2008/10/15 08:08:32 adamdunkels Exp $ + * + */ + +/* + * uIP is a small implementation of the IP, UDP and TCP protocols (as + * well as some basic ICMP stuff). The implementation couples the IP, + * UDP, TCP and the application layers very tightly. To keep the size + * of the compiled code down, this code frequently uses the goto + * statement. While it would be possible to break the uip_process() + * function into many smaller functions, this would increase the code + * size because of the overhead of parameter passing and the fact that + * the optimier would not be as efficient. + * + * The principle is that we have a small buffer, called the uip_buf, + * in which the device driver puts an incoming packet. The TCP/IP + * stack parses the headers in the packet, and calls the + * application. If the remote host has sent data to the application, + * this data is present in the uip_buf and the application read the + * data from there. It is up to the application to put this data into + * a byte stream if needed. The application will not be fed with data + * that is out of sequence. + * + * If the application whishes to send data to the peer, it should put + * its data into the uip_buf. The uip_appdata pointer points to the + * first available byte. The TCP/IP stack will calculate the + * checksums, and fill in the necessary header fields and finally send + * the packet back to the peer. +*/ +#include "net/uip.h" +#include "net/uipopt.h" +#include "net/uip_arp.h" +#include "net/uip_arch.h" + +/* If UIP_CONF_IPV6 is defined, we compile the uip6.c file instead of this one. +Therefore this #ifndef removes the entire compilation output of the uip.c file */ +#if !UIP_CONF_IPV6 + +#if UIP_CONF_IPV6 + #include "net/uip-neighbor.h" +#endif /* UIP_CONF_IPV6 */ + +#include + +/*---------------------------------------------------------------------------*/ + +/* Variable definitions. */ + +/* The IP address of this host. If it is defined to be fixed (by setting +UIP_FIXEDADDR to 1 in uipopt.h), the address is set here. Otherwise, the address */ +#if UIP_FIXEDADDR > 0 + const uip_ipaddr_t uip_hostaddr = { UIP_IPADDR0, UIP_IPADDR1, UIP_IPADDR2, UIP_IPADDR3 }; + const uip_ipaddr_t uip_draddr = { UIP_DRIPADDR0, UIP_DRIPADDR1, UIP_DRIPADDR2, UIP_DRIPADDR3 }; + const uip_ipaddr_t uip_netmask = { UIP_NETMASK0, UIP_NETMASK1, UIP_NETMASK2, UIP_NETMASK3 }; +#else + uip_ipaddr_t uip_hostaddr, uip_draddr, uip_netmask; +#endif /* UIP_FIXEDADDR */ + +const uip_ipaddr_t uip_broadcast_addr = +#if UIP_CONF_IPV6 + { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } }; +#else /* UIP_CONF_IPV6 */ + { { 0xff, 0xff, 0xff, 0xff } }; +#endif /* UIP_CONF_IPV6 */ + +const uip_ipaddr_t uip_all_zeroes_addr = { { 0x0, /* rest is 0 */ } }; + +#if UIP_FIXEDETHADDR + const struct uip_eth_addr uip_ethaddr = { { UIP_ETHADDR0, UIP_ETHADDR1, UIP_ETHADDR2, UIP_ETHADDR3, UIP_ETHADDR4, UIP_ETHADDR5 } }; +#else + struct uip_eth_addr uip_ethaddr = { { 0, 0, 0, 0, 0, 0 } }; +#endif + +#ifndef UIP_CONF_EXTERNAL_BUFFER + /* The packet buffer that contains incoming packets. */ + u8_t uip_buf[ UIP_BUFSIZE + 2 ]; +#endif /* UIP_CONF_EXTERNAL_BUFFER */ + +/* The uip_appdata pointer points to application data. */ +void *uip_appdata; + +/* The uip_appdata pointer points to the application data which is to be sent. */ +void *uip_sappdata; + +#if UIP_URGDATA > 0 + /* The uip_urgdata pointer points to urgent data (out-of-band data), if + present. */ + void *uip_urgdata; + u16_t uip_urglen, uip_surglen; +#endif /* UIP_URGDATA > 0 */ + +/* The uip_len is either 8 or 16 bits, depending on the maximum packet size. */ +u16_t uip_len, uip_slen; + +/* The uip_flags variable is used for communication between the TCP/IP stack +and the application program. */ +u8_t uip_flags; + +/* uip_conn always points to the current connection. */ +struct uip_conn *uip_conn; +struct uip_conn uip_conns[ UIP_CONNS ]; + +/* The uip_conns array holds all TCP connections. */ +u16_t uip_listenports[UIP_LISTENPORTS]; + +/* The uip_listenports list all currently listning ports. */ +#if UIP_UDP + struct uip_udp_conn *uip_udp_conn; + struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS]; +#endif /* UIP_UDP */ + +/* Ths ipid variable is an increasing number that is used for the IP ID field. */ +static u16_t ipid; + +void uip_setipid( u16_t id ) +{ + ipid = id; +} + +/* The iss variable is used for the TCP initial sequence number. */ +static u8_t iss[ 4 ]; + +#if UIP_ACTIVE_OPEN + /* Keeps track of the last port used for a new connection. */ + static u16_t lastport; +#endif /* UIP_ACTIVE_OPEN */ + +/* Temporary variables. */ +u8_t uip_acc32[ 4 ]; +static u8_t c, opt; +static u16_t tmp16; + +/* Structures and definitions. */ +#define TCP_FIN 0x01 +#define TCP_SYN 0x02 +#define TCP_RST 0x04 +#define TCP_PSH 0x08 +#define TCP_ACK 0x10 +#define TCP_URG 0x20 +#define TCP_CTL 0x3f + +#define TCP_OPT_END 0 /* End of TCP options list */ +#define TCP_OPT_NOOP 1 /* "No-operation" TCP option */ +#define TCP_OPT_MSS 2 /* Maximum segment size TCP option */ + +#define TCP_OPT_MSS_LEN 4 /* Length of TCP MSS option. */ + +#define ICMP_ECHO_REPLY 0 +#define ICMP_ECHO 8 + +#define ICMP_DEST_UNREACHABLE 3 +#define ICMP_PORT_UNREACHABLE 3 + +#define ICMP6_ECHO_REPLY 129 +#define ICMP6_ECHO 128 +#define ICMP6_NEIGHBOR_SOLICITATION 135 +#define ICMP6_NEIGHBOR_ADVERTISEMENT 136 + +#define ICMP6_FLAG_S ( 1 << 6 ) +#define ICMP6_OPTION_SOURCE_LINK_ADDRESS 1 +#define ICMP6_OPTION_TARGET_LINK_ADDRESS 2 + +/* Macros. */ +#define BUF ( ( struct uip_tcpip_hdr * ) &uip_buf[UIP_LLH_LEN] ) +#define FBUF ( ( struct uip_tcpip_hdr * ) &uip_reassbuf[0] ) +#define ICMPBUF ( ( struct uip_icmpip_hdr * ) &uip_buf[UIP_LLH_LEN] ) +#define UDPBUF ( ( struct uip_udpip_hdr * ) &uip_buf[UIP_LLH_LEN] ) + +#if UIP_STATISTICS == 1 + struct uip_stats uip_stat; + #define UIP_STAT( s ) s +#else + #define UIP_STAT( s ) +#endif /* UIP_STATISTICS == 1 */ + +#if UIP_LOGGING == 1 + #include + void uip_log( char *msg ); + #define UIP_LOG( m ) uip_log( m ) +#else + #define UIP_LOG( m ) +#endif /* UIP_LOGGING == 1 */ + +#if !UIP_ARCH_ADD32 + void uip_add32( u8_t *op32, u16_t op16 ) + { + uip_acc32[3] = op32[3] + ( op16 & 0xff ); + uip_acc32[2] = op32[2] + ( op16 >> 8 ); + uip_acc32[1] = op32[1]; + uip_acc32[0] = op32[0]; + + if( uip_acc32[2] < (op16 >> 8) ) + { + ++uip_acc32[1]; + if( uip_acc32[1] == 0 ) + { + ++uip_acc32[0]; + } + } + + if( uip_acc32[3] < (op16 & 0xff) ) + { + ++uip_acc32[2]; + if( uip_acc32[2] == 0 ) + { + ++uip_acc32[1]; + if( uip_acc32[1] == 0 ) + { + ++uip_acc32[0]; + } + } + } + } +/*---------------------------------------------------------------------------*/ +#endif /* UIP_ARCH_ADD32 */ + +#if !UIP_ARCH_CHKSUM + + static u16_t chksum( u16_t sum, const u8_t *data, u16_t len ) + { + u16_t t; + const u8_t *dataptr; + const u8_t *last_byte; + + dataptr = data; + last_byte = data + len - 1; + + while( dataptr < last_byte ) + { + /* At least two more bytes */ + t = ( dataptr[ 0 ] << 8 ) + dataptr[ 1 ]; + sum += t; + if( sum < t ) + { + sum++; /* carry */ + } + + dataptr += 2; + } + + if( dataptr == last_byte ) + { + t = ( dataptr[ 0 ] << 8 ) + 0; + sum += t; + if( sum < t ) + { + sum++; /* carry */ + } + } + + /* Return sum in host byte order. */ + return sum; + } + /*---------------------------------------------------------------------------*/ + + u16_t uip_chksum( u16_t *data, u16_t len ) + { + return htons( chksum( 0, ( u8_t * ) data, len ) ); + } + /*---------------------------------------------------------------------------*/ + + #ifndef UIP_ARCH_IPCHKSUM + u16_t uip_ipchksum( void ) + { + u16_t sum; + + sum = chksum( 0, &uip_buf[UIP_LLH_LEN], UIP_IPH_LEN ); + + //DEBUG_PRINTF( "uip_ipchksum: sum 0x%04x\n", sum ); + return( sum == 0 ) ? 0xffff : htons( sum ); + } + #endif + /*---------------------------------------------------------------------------*/ + + static u16_t upper_layer_chksum( u8_t proto ) + { + u16_t upper_layer_len; + u16_t sum; + + #if UIP_CONF_IPV6 + upper_layer_len = ( ((u16_t) (BUF->len[ 0 ]) << 8) + BUF->len[ 1 ] ); + #else /* UIP_CONF_IPV6 */ + upper_layer_len = ( ((u16_t) (BUF->len[ 0 ]) << 8) + BUF->len[ 1 ] ) - UIP_IPH_LEN; + #endif /* UIP_CONF_IPV6 */ + + /* First sum pseudoheader. */ + + /* IP protocol and length fields. This addition cannot carry. */ + sum = upper_layer_len + proto; + + /* Sum IP source and destination addresses. */ + sum = chksum( sum, ( u8_t * ) &BUF->srcipaddr, 2 * sizeof(uip_ipaddr_t) ); + + /* Sum TCP header and data. */ + sum = chksum( sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], upper_layer_len ); + + return( sum == 0 ) ? 0xffff : htons( sum ); + } + /*---------------------------------------------------------------------------*/ + + #if UIP_CONF_IPV6 + u16_t uip_icmp6chksum( void ) + { + return upper_layer_chksum( UIP_PROTO_ICMP6 ); + } + #endif /* UIP_CONF_IPV6 */ + /*---------------------------------------------------------------------------*/ + + u16_t uip_tcpchksum( void ) + { + return upper_layer_chksum( UIP_PROTO_TCP ); + } + /*---------------------------------------------------------------------------*/ + + #if UIP_UDP_CHECKSUMS + u16_t uip_udpchksum( void ) + { + return upper_layer_chksum( UIP_PROTO_UDP ); + } + #endif /* UIP_UDP_CHECKSUMS */ + +#endif /* UIP_ARCH_CHKSUM */ +/*---------------------------------------------------------------------------*/ + +void uip_init( void ) +{ + for( c = 0; c < UIP_LISTENPORTS; ++c ) + { + uip_listenports[ c ] = 0; + } + + for( c = 0; c < UIP_CONNS; ++c ) + { + uip_conns[ c ].tcpstateflags = UIP_CLOSED; + } + + #if UIP_ACTIVE_OPEN + lastport = 1024; + #endif /* UIP_ACTIVE_OPEN */ + + #if UIP_UDP + for( c = 0; c < UIP_UDP_CONNS; ++c ) + { + uip_udp_conns[ c ].lport = 0; + } + #endif /* UIP_UDP */ + + /* IPv4 initialization. */ + #if UIP_FIXEDADDR == 0 + /* uip_hostaddr[ 0 ] = uip_hostaddr[ 1 ] = 0;*/ + #endif /* UIP_FIXEDADDR */ +} +/*---------------------------------------------------------------------------*/ + +#if UIP_ACTIVE_OPEN + struct uip_conn *uip_connect( uip_ipaddr_t *ripaddr, u16_t rport ) + { + register struct uip_conn *conn, *cconn; + + /* Find an unused local port. */ + again: + ++lastport; + + if( lastport >= 32000 ) + { + lastport = 4096; + } + + /* Check if this port is already in use, and if so try to find + another one. */ + for( c = 0; c < UIP_CONNS; ++c ) + { + conn = &uip_conns[ c ]; + if( conn->tcpstateflags != UIP_CLOSED && conn->lport == htons(lastport) ) + { + goto again; + } + } + + conn = 0; + for( c = 0; c < UIP_CONNS; ++c ) + { + cconn = &uip_conns[ c ]; + if( cconn->tcpstateflags == UIP_CLOSED ) + { + conn = cconn; + break; + } + + if( cconn->tcpstateflags == UIP_TIME_WAIT ) + { + if( conn == 0 || cconn->timer > conn->timer ) + { + conn = cconn; + } + } + } + + if( conn == 0 ) + { + return 0; + } + + conn->tcpstateflags = UIP_SYN_SENT; + + conn->snd_nxt[ 0 ] = iss[ 0 ]; + conn->snd_nxt[ 1 ] = iss[ 1 ]; + conn->snd_nxt[ 2 ] = iss[ 2 ]; + conn->snd_nxt[ 3 ] = iss[ 3 ]; + + conn->initialmss = conn->mss = UIP_TCP_MSS; + + conn->len = 1; /* TCP length of the SYN is one. */ + conn->nrtx = 0; + conn->timer = 1; /* Send the SYN next time around. */ + conn->rto = UIP_RTO; + conn->sa = 0; + conn->sv = 16; /* Initial value of the RTT variance. */ + conn->lport = htons( lastport ); + conn->rport = rport; + uip_ipaddr_copy( &conn->ripaddr, ripaddr ); + + return conn; + } +/*---------------------------------------------------------------------------*/ +#endif /* UIP_ACTIVE_OPEN */ + +#if UIP_UDP + struct uip_udp_conn *uip_udp_new( const uip_ipaddr_t *ripaddr, u16_t rport ) + { + register struct uip_udp_conn *conn; + + /* Find an unused local port. */ + again: + ++lastport; + + if( lastport >= 32000 ) + { + lastport = 4096; + } + + for( c = 0; c < UIP_UDP_CONNS; ++c ) + { + if( uip_udp_conns[ c ].lport == htons(lastport) ) + { + goto again; + } + } + + conn = 0; + for( c = 0; c < UIP_UDP_CONNS; ++c ) + { + if( uip_udp_conns[ c ].lport == 0 ) + { + conn = &uip_udp_conns[ c ]; + break; + } + } + + if( conn == 0 ) + { + return 0; + } + + conn->lport = HTONS( lastport ); + conn->rport = rport; + if( ripaddr == NULL ) + { + memset( &conn->ripaddr, 0, sizeof(uip_ipaddr_t) ); + } + else + { + uip_ipaddr_copy( &conn->ripaddr, ripaddr ); + } + + conn->ttl = UIP_TTL; + + return conn; + } +/*---------------------------------------------------------------------------*/ +#endif /* UIP_UDP */ + +void uip_unlisten( u16_t port ) +{ + for( c = 0; c < UIP_LISTENPORTS; ++c ) + { + if( uip_listenports[ c ] == port ) + { + uip_listenports[ c ] = 0; + return; + } + } +} +/*---------------------------------------------------------------------------*/ + +void uip_listen( u16_t port ) +{ + for( c = 0; c < UIP_LISTENPORTS; ++c ) + { + if( uip_listenports[ c ] == 0 ) + { + uip_listenports[ c ] = port; + return; + } + } +} +/*---------------------------------------------------------------------------*/ + +/* XXX: IP fragment reassembly: not well-tested. */ +#if UIP_REASSEMBLY && !UIP_CONF_IPV6 + #define UIP_REASS_BUFSIZE ( UIP_BUFSIZE - UIP_LLH_LEN ) + static u8_t uip_reassbuf[UIP_REASS_BUFSIZE]; + static u8_t uip_reassbitmap[UIP_REASS_BUFSIZE / ( 8 * 8 )]; + static const u8_t bitmap_bits[8] = { 0xff, 0x7f, 0x3f, 0x1f, 0x0f, 0x07, 0x03, 0x01 }; + static u16_t uip_reasslen; + static u8_t uip_reassflags; + #define UIP_REASS_FLAG_LASTFRAG 0x01 + static u8_t uip_reasstmr; + + #define IP_MF 0x20 + + static u8_t uip_reass( void ) + { + u16_t offset, len; + u16_t i; + + /* If ip_reasstmr is zero, no packet is present in the buffer, so we + write the IP header of the fragment into the reassembly + buffer. The timer is updated with the maximum age. */ + if( uip_reasstmr == 0 ) + { + memcpy( uip_reassbuf, &BUF->vhl, UIP_IPH_LEN ); + uip_reasstmr = UIP_REASS_MAXAGE; + uip_reassflags = 0; + + /* Clear the bitmap. */ + memset( uip_reassbitmap, 0, sizeof(uip_reassbitmap) ); + } + + /* Check if the incoming fragment matches the one currently present + in the reasembly buffer. If so, we proceed with copying the + fragment into the buffer. */ + if + ( + BUF->srcipaddr[ 0 ] == FBUF->srcipaddr[ 0 ] && + BUF->srcipaddr[ 1 ] == FBUF->srcipaddr[ 1 ] && + BUF->destipaddr[ 0 ] == FBUF->destipaddr[ 0 ] && + BUF->destipaddr[ 1 ] == FBUF->destipaddr[ 1 ] && + BUF->ipid[ 0 ] == FBUF->ipid[ 0 ] && + BUF->ipid[ 1 ] == FBUF->ipid[ 1 ] + ) + { + len = ( BUF->len[ 0 ] << 8 ) + BUF->len[ 1 ] - ( BUF->vhl & 0x0f ) * 4; + offset = ( ((BUF->ipoffset[ 0 ] & 0x3f) << 8) + BUF->ipoffset[ 1 ] ) * 8; + + /* If the offset or the offset + fragment length overflows the + reassembly buffer, we discard the entire packet. */ + if( offset > UIP_REASS_BUFSIZE || offset + len > UIP_REASS_BUFSIZE ) + { + uip_reasstmr = 0; + goto nullreturn; + } + + /* Copy the fragment into the reassembly buffer, at the right + offset. */ + memcpy( &uip_reassbuf[UIP_IPH_LEN + offset], ( char * ) BUF + ( int ) ((BUF->vhl & 0x0f) * 4), len ); + + /* Update the bitmap. */ + if( offset / (8 * 8) == (offset + len) / (8 * 8) ) + { + /* If the two endpoints are in the same byte, we only update + that byte. */ + uip_reassbitmap[offset / ( 8 * 8 )] |= bitmap_bits[( offset / 8 ) & 7] &~bitmap_bits[( (offset + len) / 8 ) & 7]; + } + else + { + /* If the two endpoints are in different bytes, we update the + bytes in the endpoints and fill the stuff inbetween with + 0xff. */ + uip_reassbitmap[offset / ( 8 * 8 )] |= bitmap_bits[( offset / 8 ) & 7]; + for( i = 1 + offset / (8 * 8); i < (offset + len) / (8 * 8); ++i ) + { + uip_reassbitmap[i] = 0xff; + } + + uip_reassbitmap[( offset + len ) / ( 8 * 8 )] |= ~bitmap_bits[( (offset + len) / 8 ) & 7]; + } + + /* If this fragment has the More Fragments flag set to zero, we + know that this is the last fragment, so we can calculate the + size of the entire packet. We also set the + IP_REASS_FLAG_LASTFRAG flag to indicate that we have received + the final fragment. */ + if( (BUF->ipoffset[ 0 ] & IP_MF) == 0 ) + { + uip_reassflags |= UIP_REASS_FLAG_LASTFRAG; + uip_reasslen = offset + len; + } + + /* Finally, we check if we have a full packet in the buffer. We do + this by checking if we have the last fragment and if all bits + in the bitmap are set. */ + if( uip_reassflags & UIP_REASS_FLAG_LASTFRAG ) + { + /* Check all bytes up to and including all but the last byte in + the bitmap. */ + for( i = 0; i < uip_reasslen / (8 * 8) - 1; ++i ) + { + if( uip_reassbitmap[i] != 0xff ) + { + goto nullreturn; + } + } + + /* Check the last byte in the bitmap. It should contain just the + right amount of bits. */ + if( uip_reassbitmap[uip_reasslen / (8 * 8)] != (u8_t)~bitmap_bits[uip_reasslen / 8 & 7] ) + { + goto nullreturn; + } + + /* If we have come this far, we have a full packet in the + buffer, so we allocate a pbuf and copy the packet into it. We + also reset the timer. */ + uip_reasstmr = 0; + memcpy( BUF, FBUF, uip_reasslen ); + + /* Pretend to be a "normal" (i.e., not fragmented) IP packet + from now on. */ + BUF->ipoffset[ 0 ] = BUF->ipoffset[ 1 ] = 0; + BUF->len[ 0 ] = uip_reasslen >> 8; + BUF->len[ 1 ] = uip_reasslen & 0xff; + BUF->ipchksum = 0; + BUF->ipchksum = ~( uip_ipchksum() ); + + return uip_reasslen; + } + } + + nullreturn: + + return 0; + } +/*---------------------------------------------------------------------------*/ +#endif /* UIP_REASSEMBLY */ + + +static void uip_add_rcv_nxt( u16_t n ) +{ + uip_add32( uip_conn->rcv_nxt, n ); + uip_conn->rcv_nxt[ 0 ] = uip_acc32[ 0 ]; + uip_conn->rcv_nxt[ 1 ] = uip_acc32[ 1 ]; + uip_conn->rcv_nxt[ 2 ] = uip_acc32[ 2 ]; + uip_conn->rcv_nxt[ 3 ] = uip_acc32[ 3 ]; +} +/*---------------------------------------------------------------------------*/ + +void uip_process( u8_t flag ) +{ + register struct uip_conn *uip_connr = uip_conn; + + #if UIP_UDP + if( flag == UIP_UDP_SEND_CONN ) + { + goto udp_send; + } + #endif /* UIP_UDP */ + + uip_sappdata = uip_appdata = &uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN]; + + /* Check if we were invoked because of a poll request for a + particular connection. */ + if( flag == UIP_POLL_REQUEST ) + { + if( (uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED && !uip_outstanding(uip_connr) ) + { + uip_flags = UIP_POLL; + UIP_APPCALL(); + goto appsend; + } + + goto drop; + + /* Check if we were invoked because of the perodic timer fireing. */ + } + else if( flag == UIP_TIMER ) + { + #if UIP_REASSEMBLY + if( uip_reasstmr != 0 ) + { + --uip_reasstmr; + } + #endif /* UIP_REASSEMBLY */ + + /* Increase the initial sequence number. */ + if( ++iss[ 3 ] == 0 ) + { + if( ++iss[ 2 ] == 0 ) + { + if( ++iss[ 1 ] == 0 ) + { + ++iss[ 0 ]; + } + } + } + + /* Reset the length variables. */ + uip_len = 0; + uip_slen = 0; + + /* Check if the connection is in a state in which we simply wait + for the connection to time out. If so, we increase the + connection's timer and remove the connection if it times + out. */ + if( uip_connr->tcpstateflags == UIP_TIME_WAIT || uip_connr->tcpstateflags == UIP_FIN_WAIT_2 ) + { + ++( uip_connr->timer ); + if( uip_connr->timer == UIP_TIME_WAIT_TIMEOUT ) + { + uip_connr->tcpstateflags = UIP_CLOSED; + } + } + else if( uip_connr->tcpstateflags != UIP_CLOSED ) + { + /* If the connection has outstanding data, we increase the + connection's timer and see if it has reached the RTO value + in which case we retransmit. */ + if( uip_outstanding(uip_connr) ) + { + if( uip_connr->timer-- == 0 ) + { + if + ( + uip_connr->nrtx == UIP_MAXRTX || + ( + (uip_connr->tcpstateflags == UIP_SYN_SENT || uip_connr->tcpstateflags == UIP_SYN_RCVD) && + uip_connr->nrtx == UIP_MAXSYNRTX + ) + ) + { + uip_connr->tcpstateflags = UIP_CLOSED; + + /* We call UIP_APPCALL() with uip_flags set to + UIP_TIMEDOUT to inform the application that the + connection has timed out. */ + uip_flags = UIP_TIMEDOUT; + UIP_APPCALL(); + + /* We also send a reset packet to the remote host. */ + BUF->flags = TCP_RST | TCP_ACK; + goto tcp_send_nodata; + } + + /* Exponential backoff. */ + uip_connr->timer = UIP_RTO << ( uip_connr->nrtx > 4 ? 4 : uip_connr->nrtx ); + ++( uip_connr->nrtx ); + + /* Ok, so we need to retransmit. We do this differently + depending on which state we are in. In ESTABLISHED, we + call upon the application so that it may prepare the + data for the retransmit. In SYN_RCVD, we resend the + SYNACK that we sent earlier and in LAST_ACK we have to + retransmit our FINACK. */ + UIP_STAT( ++uip_stat.tcp.rexmit ); + switch( uip_connr->tcpstateflags & UIP_TS_MASK ) + { + case UIP_SYN_RCVD: + /* In the SYN_RCVD state, we should retransmit our + SYNACK. */ + goto tcp_send_synack; + + #if UIP_ACTIVE_OPEN + case UIP_SYN_SENT: + /* In the SYN_SENT state, we retransmit out SYN. */ + BUF->flags = 0; + goto tcp_send_syn; + #endif /* UIP_ACTIVE_OPEN */ + + case UIP_ESTABLISHED: + /* In the ESTABLISHED state, we call upon the application + to do the actual retransmit after which we jump into + the code for sending out the packet (the apprexmit + label). */ + uip_flags = UIP_REXMIT; + UIP_APPCALL(); + goto apprexmit; + + case UIP_FIN_WAIT_1: + case UIP_CLOSING: + case UIP_LAST_ACK: + /* In all these states we should retransmit a FINACK. */ + goto tcp_send_finack; + } + } + } + else if( (uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED ) + { + /* If there was no need for a retransmission, we poll the + application for new data. */ + uip_flags = UIP_POLL; + UIP_APPCALL(); + goto appsend; + } + } + + goto drop; + } + + #if UIP_UDP + if( flag == UIP_UDP_TIMER ) + { + if( uip_udp_conn->lport != 0 ) + { + uip_conn = NULL; + uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; + uip_len = uip_slen = 0; + uip_flags = UIP_POLL; + UIP_UDP_APPCALL(); + goto udp_send; + } + else + { + goto drop; + } + } + #endif + + /* This is where the input processing starts. */ + UIP_STAT( ++uip_stat.ip.recv ); + + /* Start of IP input header processing code. */ + #if UIP_CONF_IPV6 + /* Check validity of the IP header. */ + if( (BUF->vtc & 0xf0) != 0x60 ) + { /* IP version and header length. */ + UIP_STAT( ++uip_stat.ip.drop ); + UIP_STAT( ++uip_stat.ip.vhlerr ); + UIP_LOG( "ipv6: invalid version." ); + goto drop; + } + + #else /* UIP_CONF_IPV6 */ + /* Check validity of the IP header. */ + if( BUF->vhl != 0x45 ) + { /* IP version and header length. */ + UIP_STAT( ++uip_stat.ip.drop ); + UIP_STAT( ++uip_stat.ip.vhlerr ); + UIP_LOG( "ip: invalid version or header length." ); + goto drop; + } + + #endif /* UIP_CONF_IPV6 */ + + /* Check the size of the packet. If the size reported to us in + uip_len is smaller the size reported in the IP header, we assume + that the packet has been corrupted in transit. If the size of + uip_len is larger than the size reported in the IP packet header, + the packet has been padded and we set uip_len to the correct + value.. */ + if( (BUF->len[ 0 ] << 8) + BUF->len[ 1 ] <= uip_len ) + { + uip_len = ( BUF->len[ 0 ] << 8 ) + BUF->len[ 1 ]; + #if UIP_CONF_IPV6 + /* The length reported in the IPv6 header is the + length of the payload that follows the + header. However, uIP uses the uip_len variable + for holding the size of the entire packet, + including the IP header. For IPv4 this is not a + problem as the length field in the IPv4 header + contains the length of the entire packet. But + for IPv6 we need to add the size of the IPv6 + header (40 bytes). */ + uip_len += 40; + #endif /* UIP_CONF_IPV6 */ + } + else + { + UIP_LOG( "ip: packet shorter than reported in IP header." ); + goto drop; + } + + #if !UIP_CONF_IPV6 + /* Check the fragment flag. */ + if( (BUF->ipoffset[ 0 ] & 0x3f) != 0 || BUF->ipoffset[ 1 ] != 0 ) + { + #if UIP_REASSEMBLY + uip_len = uip_reass(); + if( uip_len == 0 ) + { + goto drop; + } + #else /* UIP_REASSEMBLY */ + UIP_STAT( ++uip_stat.ip.drop ); + UIP_STAT( ++uip_stat.ip.fragerr ); + UIP_LOG( "ip: fragment dropped." ); + goto drop; + #endif /* UIP_REASSEMBLY */ + } + #endif /* UIP_CONF_IPV6 */ + + if( uip_ipaddr_cmp(&uip_hostaddr, &uip_all_zeroes_addr) ) + { + /* If we are configured to use ping IP address configuration and + hasn't been assigned an IP address yet, we accept all ICMP + packets. */ + #if UIP_PINGADDRCONF && !UIP_CONF_IPV6 + if( BUF->proto == UIP_PROTO_ICMP ) + { + UIP_LOG( "ip: possible ping config packet received." ); + goto icmp_input; + } + else + { + UIP_LOG( "ip: packet dropped since no address assigned." ); + goto drop; + } + #endif /* UIP_PINGADDRCONF */ + } + else + { + /* If IP broadcast support is configured, we check for a broadcast + UDP packet, which may be destined to us. */ + #if UIP_BROADCAST + //DEBUG_PRINTF( "UDP IP checksum 0x%04x\n", uip_ipchksum() ); + if( BUF->proto == UIP_PROTO_UDP && uip_ipaddr_cmp(&BUF->destipaddr, &uip_broadcast_addr) /*&& uip_ipchksum() == 0xffff*/ ) + { + goto udp_input; + } + #endif /* UIP_BROADCAST */ + + /* Check if the packet is destined for our IP address. */ + #if !UIP_CONF_IPV6 + if( !uip_ipaddr_cmp(&BUF->destipaddr, &uip_hostaddr) ) + { + UIP_STAT( ++uip_stat.ip.drop ); + goto drop; + } + #else /* UIP_CONF_IPV6 */ + /* For IPv6, packet reception is a little trickier as we need to + make sure that we listen to certain multicast addresses (all + hosts multicast address, and the solicited-node multicast + address) as well. However, we will cheat here and accept all + multicast packets that are sent to the ff02::/16 addresses. */ + if( !uip_ipaddr_cmp(&BUF->destipaddr, &uip_hostaddr) && BUF->destipaddr.u16[ 0 ] != HTONS(0xff02) ) + { + UIP_STAT( ++uip_stat.ip.drop ); + goto drop; + } + #endif /* UIP_CONF_IPV6 */ + } + + #if !UIP_CONF_IPV6 + if( uip_ipchksum() != 0xffff ) + { + /* Compute and check the IP header checksum. */ + UIP_STAT( ++uip_stat.ip.drop ); + UIP_STAT( ++uip_stat.ip.chkerr ); + UIP_LOG( "ip: bad checksum." ); + goto drop; + } + #endif /* UIP_CONF_IPV6 */ + + if( BUF->proto == UIP_PROTO_TCP ) + { + /* Check for TCP packet. If so, proceed with TCP input processing. */ + goto tcp_input; + } + + #if UIP_UDP + if( BUF->proto == UIP_PROTO_UDP ) + { + goto udp_input; + } + #endif /* UIP_UDP */ + + #if !UIP_CONF_IPV6 + /* ICMPv4 processing code follows. */ + if( BUF->proto != UIP_PROTO_ICMP ) + { + /* We only allow ICMP packets from here. */ + UIP_STAT( ++uip_stat.ip.drop ); + UIP_STAT( ++uip_stat.ip.protoerr ); + UIP_LOG( "ip: neither tcp nor icmp." ); + goto drop; + } + + #if UIP_PINGADDRCONF + icmp_input : + #endif /* UIP_PINGADDRCONF */ + + UIP_STAT( ++uip_stat.icmp.recv ); + + /* ICMP echo (i.e., ping) processing. This is simple, we only change + the ICMP type from ECHO to ECHO_REPLY and adjust the ICMP + checksum before we return the packet. */ + if( ICMPBUF->type != ICMP_ECHO ) + { + UIP_STAT( ++uip_stat.icmp.drop ); + UIP_STAT( ++uip_stat.icmp.typeerr ); + UIP_LOG( "icmp: not icmp echo." ); + goto drop; + } + + /* If we are configured to use ping IP address assignment, we use + the destination IP address of this ping packet and assign it to + ourself. */ + #if UIP_PINGADDRCONF + if( uip_ipaddr_cmp(&uip_hostaddr, &uip_all_zeroes_addr) ) + { + uip_hostaddr = BUF->destipaddr; + } + #endif /* UIP_PINGADDRCONF */ + + ICMPBUF->type = ICMP_ECHO_REPLY; + + if( ICMPBUF->icmpchksum >= HTONS(0xffff - (ICMP_ECHO << 8)) ) + { + ICMPBUF->icmpchksum += HTONS( ICMP_ECHO << 8 ) + 1; + } + else + { + ICMPBUF->icmpchksum += HTONS( ICMP_ECHO << 8 ); + } + + /* Swap IP addresses. */ + uip_ipaddr_copy( &BUF->destipaddr, &BUF->srcipaddr ); + uip_ipaddr_copy( &BUF->srcipaddr, &uip_hostaddr ); + + UIP_STAT( ++uip_stat.icmp.sent ); + BUF->ttl = UIP_TTL; + goto ip_send_nolen; + + /* End of IPv4 input header processing code. */ + + #else /* !UIP_CONF_IPV6 */ + + /* This is IPv6 ICMPv6 processing code. */ + + //DEBUG_PRINTF( "icmp6_input: length %d\n", uip_len ); + if( BUF->proto != UIP_PROTO_ICMP6 ) + { + /* We only allow ICMPv6 packets from here. */ + UIP_STAT( ++uip_stat.ip.drop ); + UIP_STAT( ++uip_stat.ip.protoerr ); + UIP_LOG( "ip: neither tcp nor icmp6." ); + goto drop; + } + + UIP_STAT( ++uip_stat.icmp.recv ); + + /* If we get a neighbor solicitation for our address we should send + a neighbor advertisement message back. */ + if( ICMPBUF->type == ICMP6_NEIGHBOR_SOLICITATION ) + { + if( uip_ipaddr_cmp(&ICMPBUF->icmp6data, &uip_hostaddr) ) + { + if( ICMPBUF->options[ 0 ] == ICMP6_OPTION_SOURCE_LINK_ADDRESS ) + { + /* Save the sender's address in our neighbor list. */ + uip_neighbor_add( &ICMPBUF->srcipaddr, &(ICMPBUF->options[ 2 ]) ); + } + + /* We should now send a neighbor advertisement back to where the + neighbor solicication came from. */ + ICMPBUF->type = ICMP6_NEIGHBOR_ADVERTISEMENT; + ICMPBUF->flags = ICMP6_FLAG_S; /* Solicited flag. */ + + ICMPBUF->reserved1 = ICMPBUF->reserved2 = ICMPBUF->reserved3 = 0; + + uip_ipaddr_copy( &ICMPBUF->destipaddr, &ICMPBUF->srcipaddr ); + uip_ipaddr_copy( &ICMPBUF->srcipaddr, &uip_hostaddr ); + ICMPBUF->options[ 0 ] = ICMP6_OPTION_TARGET_LINK_ADDRESS; + ICMPBUF->options[ 1 ] = 1; /* Options length, 1 = 8 bytes. */ + memcpy( &(ICMPBUF->options[ 2 ]), &uip_ethaddr, sizeof(uip_ethaddr) ); + ICMPBUF->icmpchksum = 0; + ICMPBUF->icmpchksum = ~uip_icmp6chksum(); + + goto send; + } + + goto drop; + } + else if( ICMPBUF->type == ICMP6_ECHO ) + { + /* ICMP echo (i.e., ping) processing. This is simple, we only + change the ICMP type from ECHO to ECHO_REPLY and update the + ICMP checksum before we return the packet. */ + ICMPBUF->type = ICMP6_ECHO_REPLY; + + uip_ipaddr_copy( &BUF->destipaddr, &BUF->srcipaddr ); + uip_ipaddr_copy( &BUF->srcipaddr, &uip_hostaddr ); + ICMPBUF->icmpchksum = 0; + ICMPBUF->icmpchksum = ~uip_icmp6chksum(); + + UIP_STAT( ++uip_stat.icmp.sent ); + goto send; + } + else + { + //DEBUG_PRINTF( "Unknown icmp6 message type %d\n", ICMPBUF->type ); + UIP_STAT( ++uip_stat.icmp.drop ); + UIP_STAT( ++uip_stat.icmp.typeerr ); + UIP_LOG( "icmp: unknown ICMP message." ); + goto drop; + } + + /* End of IPv6 ICMP processing. */ + #endif /* !UIP_CONF_IPV6 */ + + #if UIP_UDP + /* UDP input processing. */ + udp_input : + /* UDP processing is really just a hack. We don't do anything to the + UDP/IP headers, but let the UDP application do all the hard + work. If the application sets uip_slen, it has a packet to + send. */ + #if UIP_UDP_CHECKSUMS + uip_len = uip_len - UIP_IPUDPH_LEN; + uip_appdata = &uip_buf[ UIP_LLH_LEN + UIP_IPUDPH_LEN ]; + if( UDPBUF->udpchksum != 0 && uip_udpchksum() != 0xffff ) + { + UIP_STAT( ++uip_stat.udp.drop ); + UIP_STAT( ++uip_stat.udp.chkerr ); + UIP_LOG( "udp: bad checksum." ); + goto drop; + } + + #else /* UIP_UDP_CHECKSUMS */ + uip_len = uip_len - UIP_IPUDPH_LEN; + #endif /* UIP_UDP_CHECKSUMS */ + + /* Demultiplex this UDP packet between the UDP "connections". */ + for( uip_udp_conn = &uip_udp_conns[ 0 ]; uip_udp_conn < &uip_udp_conns[UIP_UDP_CONNS]; ++uip_udp_conn ) + { + /* If the local UDP port is non-zero, the connection is considered + to be used. If so, the local port number is checked against the + destination port number in the received packet. If the two port + numbers match, the remote port number is checked if the + connection is bound to a remote port. Finally, if the + connection is bound to a remote IP address, the source IP + address of the packet is checked. */ + if + ( + uip_udp_conn->lport != 0 && + UDPBUF->destport == uip_udp_conn->lport && + (uip_udp_conn->rport == 0 || UDPBUF->srcport == uip_udp_conn->rport) && + ( + uip_ipaddr_cmp(&uip_udp_conn->ripaddr, &uip_all_zeroes_addr) || + uip_ipaddr_cmp(&uip_udp_conn->ripaddr, &uip_broadcast_addr) || + uip_ipaddr_cmp(&BUF->srcipaddr, &uip_udp_conn->ripaddr) + ) + ) + { + goto udp_found; + } + } + + UIP_LOG( "udp: no matching connection found" ); + + #if UIP_CONF_ICMP_DEST_UNREACH && !UIP_CONF_IPV6 + + /* Copy fields from packet header into payload of this ICMP packet. */ + memcpy( &(ICMPBUF->payload[ 0 ]), ICMPBUF, UIP_IPH_LEN + 8 ); + + /* Set the ICMP type and code. */ + ICMPBUF->type = ICMP_DEST_UNREACHABLE; + ICMPBUF->icode = ICMP_PORT_UNREACHABLE; + + /* Calculate the ICMP checksum. */ + ICMPBUF->icmpchksum = 0; + ICMPBUF->icmpchksum = ~uip_chksum( ( u16_t * ) &(ICMPBUF->type), 36 ); + + /* Set the IP destination address to be the source address of the + original packet. */ + uip_ipaddr_copy( &BUF->destipaddr, &BUF->srcipaddr ); + + /* Set our IP address as the source address. */ + uip_ipaddr_copy( &BUF->srcipaddr, &uip_hostaddr ); + + /* The size of the ICMP destination unreachable packet is 36 + the + size of the IP header (20) = 56. */ + uip_len = 36 + UIP_IPH_LEN; + ICMPBUF->len[ 0 ] = 0; + ICMPBUF->len[ 1 ] = ( u8_t ) uip_len; + ICMPBUF->ttl = UIP_TTL; + ICMPBUF->proto = UIP_PROTO_ICMP; + + goto ip_send_nolen; + #else /* UIP_CONF_ICMP_DEST_UNREACH */ + goto drop; + #endif /* UIP_CONF_ICMP_DEST_UNREACH */ + + udp_found : uip_conn = NULL; + uip_flags = UIP_NEWDATA; + uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; + uip_slen = 0; + UIP_UDP_APPCALL(); + +udp_send: + if( uip_slen == 0 ) + { + goto drop; + } + + uip_len = uip_slen + UIP_IPUDPH_LEN; + + #if UIP_CONF_IPV6 + /* For IPv6, the IP length field does not include the IPv6 IP header + length. */ + BUF->len[ 0 ] = ( (uip_len - UIP_IPH_LEN) >> 8 ); + BUF->len[ 1 ] = ( (uip_len - UIP_IPH_LEN) & 0xff ); + #else /* UIP_CONF_IPV6 */ + BUF->len[ 0 ] = ( uip_len >> 8 ); + BUF->len[ 1 ] = ( uip_len & 0xff ); + #endif /* UIP_CONF_IPV6 */ + + BUF->ttl = uip_udp_conn->ttl; + BUF->proto = UIP_PROTO_UDP; + + UDPBUF->udplen = HTONS( uip_slen + UIP_UDPH_LEN ); + UDPBUF->udpchksum = 0; + + BUF->srcport = uip_udp_conn->lport; + BUF->destport = uip_udp_conn->rport; + + uip_ipaddr_copy( &BUF->srcipaddr, &uip_hostaddr ); + uip_ipaddr_copy( &BUF->destipaddr, &uip_udp_conn->ripaddr ); + + uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPTCPH_LEN]; + + #if UIP_UDP_CHECKSUMS + /* Calculate UDP checksum. */ + UDPBUF->udpchksum = ~( uip_udpchksum() ); + if( UDPBUF->udpchksum == 0 ) + { + UDPBUF->udpchksum = 0xffff; + } + #endif /* UIP_UDP_CHECKSUMS */ + goto ip_send_nolen; + #endif /* UIP_UDP */ + + /* TCP input processing. */ + tcp_input : UIP_STAT( ++uip_stat.tcp.recv ); + + /* Start of TCP input header processing code. */ + if( uip_tcpchksum() != 0xffff ) + { + /* Compute and check the TCP checksum. */ + UIP_STAT( ++uip_stat.tcp.drop ); + UIP_STAT( ++uip_stat.tcp.chkerr ); + UIP_LOG( "tcp: bad checksum." ); + goto drop; + } + + /* Demultiplex this segment. */ + + /* First check any active connections. */ + for( uip_connr = &uip_conns[ 0 ]; uip_connr <= &uip_conns[UIP_CONNS - 1]; ++uip_connr ) + { + if + ( + uip_connr->tcpstateflags != UIP_CLOSED && + BUF->destport == uip_connr->lport && + BUF->srcport == uip_connr->rport && + uip_ipaddr_cmp(&BUF->srcipaddr, &uip_connr->ripaddr) + ) + { + goto found; + } + } + + /* If we didn't find and active connection that expected the packet, + either this packet is an old duplicate, or this is a SYN packet + destined for a connection in LISTEN. If the SYN flag isn't set, + it is an old packet and we send a RST. */ + if( (BUF->flags & TCP_CTL) != TCP_SYN ) + { + goto reset; + } + + tmp16 = BUF->destport; + + /* Next, check listening connections. */ + for( c = 0; c < UIP_LISTENPORTS; ++c ) + { + if( tmp16 == uip_listenports[ c ] ) + { + goto found_listen; + } + } + + /* No matching connection found, so we send a RST packet. */ + UIP_STAT( ++uip_stat.tcp.synrst ); + +reset: + /* We do not send resets in response to resets. */ + if( BUF->flags & TCP_RST ) + { + goto drop; + } + + UIP_STAT( ++uip_stat.tcp.rst ); + + BUF->flags = TCP_RST | TCP_ACK; + uip_len = UIP_IPTCPH_LEN; + BUF->tcpoffset = 5 << 4; + + /* Flip the seqno and ackno fields in the TCP header. */ + c = BUF->seqno[ 3 ]; + BUF->seqno[ 3 ] = BUF->ackno[ 3 ]; + BUF->ackno[ 3 ] = c; + + c = BUF->seqno[ 2 ]; + BUF->seqno[ 2 ] = BUF->ackno[ 2 ]; + BUF->ackno[ 2 ] = c; + + c = BUF->seqno[ 1 ]; + BUF->seqno[ 1 ] = BUF->ackno[ 1 ]; + BUF->ackno[ 1 ] = c; + + c = BUF->seqno[ 0 ]; + BUF->seqno[ 0 ] = BUF->ackno[ 0 ]; + BUF->ackno[ 0 ] = c; + + /* We also have to increase the sequence number we are + acknowledging. If the least significant byte overflowed, we need + to propagate the carry to the other bytes as well. */ + if( ++BUF->ackno[ 3 ] == 0 ) + { + if( ++BUF->ackno[ 2 ] == 0 ) + { + if( ++BUF->ackno[ 1 ] == 0 ) + { + ++BUF->ackno[ 0 ]; + } + } + } + + /* Swap port numbers. */ + tmp16 = BUF->srcport; + BUF->srcport = BUF->destport; + BUF->destport = tmp16; + + /* Swap IP addresses. */ + uip_ipaddr_copy( &BUF->destipaddr, &BUF->srcipaddr ); + uip_ipaddr_copy( &BUF->srcipaddr, &uip_hostaddr ); + + /* And send out the RST packet! */ + goto tcp_send_noconn; + + /* This label will be jumped to if we matched the incoming packet + with a connection in LISTEN. In that case, we should create a new + connection and send a SYNACK in return. */ +found_listen: + /* First we check if there are any connections avaliable. Unused + connections are kept in the same table as used connections, but + unused ones have the tcpstate set to CLOSED. Also, connections in + TIME_WAIT are kept track of and we'll use the oldest one if no + CLOSED connections are found. Thanks to Eddie C. Dost for a very + nice algorithm for the TIME_WAIT search. */ + uip_connr = 0; + for( c = 0; c < UIP_CONNS; ++c ) + { + if( uip_conns[ c ].tcpstateflags == UIP_CLOSED ) + { + uip_connr = &uip_conns[ c ]; + break; + } + + if( uip_conns[ c ].tcpstateflags == UIP_TIME_WAIT ) + { + if( uip_connr == 0 || uip_conns[ c ].timer > uip_connr->timer ) + { + uip_connr = &uip_conns[ c ]; + } + } + } + + if( uip_connr == 0 ) + { + /* All connections are used already, we drop packet and hope that + the remote end will retransmit the packet at a time when we + have more spare connections. */ + UIP_STAT( ++uip_stat.tcp.syndrop ); + UIP_LOG( "tcp: found no unused connections." ); + goto drop; + } + + uip_conn = uip_connr; + + /* Fill in the necessary fields for the new connection. */ + uip_connr->rto = uip_connr->timer = UIP_RTO; + uip_connr->sa = 0; + uip_connr->sv = 4; + uip_connr->nrtx = 0; + uip_connr->lport = BUF->destport; + uip_connr->rport = BUF->srcport; + uip_ipaddr_copy( &uip_connr->ripaddr, &BUF->srcipaddr ); + uip_connr->tcpstateflags = UIP_SYN_RCVD; + + uip_connr->snd_nxt[ 0 ] = iss[ 0 ]; + uip_connr->snd_nxt[ 1 ] = iss[ 1 ]; + uip_connr->snd_nxt[ 2 ] = iss[ 2 ]; + uip_connr->snd_nxt[ 3 ] = iss[ 3 ]; + uip_connr->len = 1; + + /* rcv_nxt should be the seqno from the incoming packet + 1. */ + uip_connr->rcv_nxt[ 3 ] = BUF->seqno[ 3 ]; + uip_connr->rcv_nxt[ 2 ] = BUF->seqno[ 2 ]; + uip_connr->rcv_nxt[ 1 ] = BUF->seqno[ 1 ]; + uip_connr->rcv_nxt[ 0 ] = BUF->seqno[ 0 ]; + uip_add_rcv_nxt( 1 ); + + /* Parse the TCP MSS option, if present. */ + if( (BUF->tcpoffset & 0xf0) > 0x50 ) + { + for( c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2; ) + { + opt = uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + c]; + if( opt == TCP_OPT_END ) + { + /* End of options. */ + break; + } + else if( opt == TCP_OPT_NOOP ) + { + ++c; + + /* NOP option. */ + } + else if( opt == TCP_OPT_MSS && uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN ) + { + /* An MSS option with the right option length. */ + tmp16 = ( (u16_t) uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8 ) | ( u16_t ) uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + 3 + c]; + uip_connr->initialmss = uip_connr->mss = tmp16 > UIP_TCP_MSS ? UIP_TCP_MSS : tmp16; + + /* And we are done processing options. */ + break; + } + else + { + /* All other options have a length field, so that we easily + can skip past them. */ + if( uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0 ) + { + /* If the length field is zero, the options are malformed + and we don't process them further. */ + break; + } + + c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c]; + } + } + } + + /* Our response will be a SYNACK. */ + #if UIP_ACTIVE_OPEN + tcp_send_synack : BUF->flags = TCP_ACK; +tcp_send_syn: + BUF->flags |= TCP_SYN; + #else /* UIP_ACTIVE_OPEN */ + tcp_send_synack : BUF->flags = TCP_SYN | TCP_ACK; + #endif /* UIP_ACTIVE_OPEN */ + + /* We send out the TCP Maximum Segment Size option with our + SYNACK. */ + BUF->optdata[ 0 ] = TCP_OPT_MSS; + BUF->optdata[ 1 ] = TCP_OPT_MSS_LEN; + BUF->optdata[ 2 ] = ( UIP_TCP_MSS ) / 256; + BUF->optdata[ 3 ] = ( UIP_TCP_MSS ) & 255; + uip_len = UIP_IPTCPH_LEN + TCP_OPT_MSS_LEN; + BUF->tcpoffset = ( (UIP_TCPH_LEN + TCP_OPT_MSS_LEN) / 4 ) << 4; + goto tcp_send; + + /* This label will be jumped to if we found an active connection. */ +found: + uip_conn = uip_connr; + uip_flags = 0; + + /* We do a very naive form of TCP reset processing; we just accept + any RST and kill our connection. We should in fact check if the + sequence number of this reset is wihtin our advertised window + before we accept the reset. */ + if( BUF->flags & TCP_RST ) + { + uip_connr->tcpstateflags = UIP_CLOSED; + UIP_LOG( "tcp: got reset, aborting connection." ); + uip_flags = UIP_ABORT; + UIP_APPCALL(); + goto drop; + } + + /* Calculate the length of the data, if the application has sent + any data to us. */ + c = ( BUF->tcpoffset >> 4 ) << 2; + + /* uip_len will contain the length of the actual TCP data. This is + calculated by subtracing the length of the TCP header (in + c) and the length of the IP header (20 bytes). */ + uip_len = uip_len - c - UIP_IPH_LEN; + + /* First, check if the sequence number of the incoming packet is + what we're expecting next. If not, we send out an ACK with the + correct numbers in. */ + if( !(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) && ((BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK))) ) + { + if + ( + (uip_len > 0 || ((BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) && + ( + BUF->seqno[ 0 ] != uip_connr->rcv_nxt[ 0 ] || + BUF->seqno[ 1 ] != uip_connr->rcv_nxt[ 1 ] || + BUF->seqno[ 2 ] != uip_connr->rcv_nxt[ 2 ] || + BUF->seqno[ 3 ] != uip_connr->rcv_nxt[ 3 ] + ) + ) + { + goto tcp_send_ack; + } + } + + /* Next, check if the incoming segment acknowledges any outstanding + data. If so, we update the sequence number, reset the length of + the outstanding data, calculate RTT estimations, and reset the + retransmission timer. */ + if( (BUF->flags & TCP_ACK) && uip_outstanding(uip_connr) ) + { + uip_add32( uip_connr->snd_nxt, uip_connr->len ); + + if + ( + BUF->ackno[ 0 ] == uip_acc32[ 0 ] && + BUF->ackno[ 1 ] == uip_acc32[ 1 ] && + BUF->ackno[ 2 ] == uip_acc32[ 2 ] && + BUF->ackno[ 3 ] == uip_acc32[ 3 ] + ) + { + /* Update sequence number. */ + uip_connr->snd_nxt[ 0 ] = uip_acc32[ 0 ]; + uip_connr->snd_nxt[ 1 ] = uip_acc32[ 1 ]; + uip_connr->snd_nxt[ 2 ] = uip_acc32[ 2 ]; + uip_connr->snd_nxt[ 3 ] = uip_acc32[ 3 ]; + + /* Do RTT estimation, unless we have done retransmissions. */ + if( uip_connr->nrtx == 0 ) + { + signed char m; + m = uip_connr->rto - uip_connr->timer; + + /* This is taken directly from VJs original code in his paper */ + m = m - ( uip_connr->sa >> 3 ); + uip_connr->sa += m; + if( m < 0 ) + { + m = -m; + } + + m = m - ( uip_connr->sv >> 2 ); + uip_connr->sv += m; + uip_connr->rto = ( uip_connr->sa >> 3 ) + uip_connr->sv; + } + + /* Set the acknowledged flag. */ + uip_flags = UIP_ACKDATA; + + /* Reset the retransmission timer. */ + uip_connr->timer = uip_connr->rto; + + /* Reset length of outstanding data. */ + uip_connr->len = 0; + } + } + + /* Do different things depending on in what state the connection is. */ + switch( uip_connr->tcpstateflags & UIP_TS_MASK ) + { + /* CLOSED and LISTEN are not handled here. CLOSE_WAIT is not + implemented, since we force the application to close when the + peer sends a FIN (hence the application goes directly from + ESTABLISHED to LAST_ACK). */ + case UIP_SYN_RCVD: + /* In SYN_RCVD we have sent out a SYNACK in response to a SYN, and + we are waiting for an ACK that acknowledges the data we sent + out the last time. Therefore, we want to have the UIP_ACKDATA + flag set. If so, we enter the ESTABLISHED state. */ + if( uip_flags & UIP_ACKDATA ) + { + uip_connr->tcpstateflags = UIP_ESTABLISHED; + uip_flags = UIP_CONNECTED; + uip_connr->len = 0; + if( uip_len > 0 ) + { + uip_flags |= UIP_NEWDATA; + uip_add_rcv_nxt( uip_len ); + } + + uip_slen = 0; + UIP_APPCALL(); + goto appsend; + } + + goto drop; + + #if UIP_ACTIVE_OPEN + case UIP_SYN_SENT: + /* In SYN_SENT, we wait for a SYNACK that is sent in response to + our SYN. The rcv_nxt is set to sequence number in the SYNACK + plus one, and we send an ACK. We move into the ESTABLISHED + state. */ + if( (uip_flags & UIP_ACKDATA) && (BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK) ) + { + /* Parse the TCP MSS option, if present. */ + if( (BUF->tcpoffset & 0xf0) > 0x50 ) + { + for( c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2; ) + { + opt = uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + c]; + if( opt == TCP_OPT_END ) + { + /* End of options. */ + break; + } + else if( opt == TCP_OPT_NOOP ) + { + ++c; + + /* NOP option. */ + } + else if( opt == TCP_OPT_MSS && uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN ) + { + /* An MSS option with the right option length. */ + tmp16 = ( uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8 ) | uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 3 + c]; + uip_connr->initialmss = uip_connr->mss = tmp16 > UIP_TCP_MSS ? UIP_TCP_MSS : tmp16; + + /* And we are done processing options. */ + break; + } + else + { + /* All other options have a length field, so that we easily + can skip past them. */ + if( uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0 ) + { + /* If the length field is zero, the options are malformed + and we don't process them further. */ + break; + } + + c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c]; + } + } + } + + uip_connr->tcpstateflags = UIP_ESTABLISHED; + uip_connr->rcv_nxt[ 0 ] = BUF->seqno[ 0 ]; + uip_connr->rcv_nxt[ 1 ] = BUF->seqno[ 1 ]; + uip_connr->rcv_nxt[ 2 ] = BUF->seqno[ 2 ]; + uip_connr->rcv_nxt[ 3 ] = BUF->seqno[ 3 ]; + uip_add_rcv_nxt( 1 ); + uip_flags = UIP_CONNECTED | UIP_NEWDATA; + uip_connr->len = 0; + uip_len = 0; + uip_slen = 0; + UIP_APPCALL(); + goto appsend; + } + + /* Inform the application that the connection failed */ + uip_flags = UIP_ABORT; + UIP_APPCALL(); + + /* The connection is closed after we send the RST */ + uip_conn->tcpstateflags = UIP_CLOSED; + goto reset; + #endif /* UIP_ACTIVE_OPEN */ + + case UIP_ESTABLISHED: + /* In the ESTABLISHED state, we call upon the application to feed + data into the uip_buf. If the UIP_ACKDATA flag is set, the + application should put new data into the buffer, otherwise we are + retransmitting an old segment, and the application should put that + data into the buffer. + + If the incoming packet is a FIN, we should close the connection on + this side as well, and we send out a FIN and enter the LAST_ACK + state. We require that there is no outstanding data; otherwise the + sequence numbers will be screwed up. */ + if( BUF->flags & TCP_FIN && !(uip_connr->tcpstateflags & UIP_STOPPED) ) + { + if( uip_outstanding(uip_connr) ) + { + goto drop; + } + + uip_add_rcv_nxt( 1 + uip_len ); + uip_flags |= UIP_CLOSE; + if( uip_len > 0 ) + { + uip_flags |= UIP_NEWDATA; + } + + UIP_APPCALL(); + uip_connr->len = 1; + uip_connr->tcpstateflags = UIP_LAST_ACK; + uip_connr->nrtx = 0; + tcp_send_finack: + BUF->flags = TCP_FIN | TCP_ACK; + goto tcp_send_nodata; + } + + /* Check the URG flag. If this is set, the segment carries urgent + data that we must pass to the application. */ + if( (BUF->flags & TCP_URG) != 0 ) + { + #if UIP_URGDATA > 0 + uip_urglen = ( BUF->urgp[ 0 ] << 8 ) | BUF->urgp[ 1 ]; + if( uip_urglen > uip_len ) + { + /* There is more urgent data in the next segment to come. */ + uip_urglen = uip_len; + } + + uip_add_rcv_nxt( uip_urglen ); + uip_len -= uip_urglen; + uip_urgdata = uip_appdata; + uip_appdata += uip_urglen; + } + else + { + uip_urglen = 0; + #else /* UIP_URGDATA > 0 */ + uip_appdata = ( ( char * ) uip_appdata ) + ( (BUF->urgp[ 0 ] << 8) | BUF->urgp[ 1 ] ); + uip_len -= ( BUF->urgp[ 0 ] << 8 ) | BUF->urgp[ 1 ]; + #endif /* UIP_URGDATA > 0 */ + } + + /* If uip_len > 0 we have TCP data in the packet, and we flag this + by setting the UIP_NEWDATA flag and update the sequence number + we acknowledge. If the application has stopped the dataflow + using uip_stop(), we must not accept any data packets from the + remote host. */ + if( uip_len > 0 && !(uip_connr->tcpstateflags & UIP_STOPPED) ) + { + uip_flags |= UIP_NEWDATA; + uip_add_rcv_nxt( uip_len ); + } + + /* Check if the available buffer space advertised by the other end + is smaller than the initial MSS for this connection. If so, we + set the current MSS to the window size to ensure that the + application does not send more data than the other end can + handle. + + If the remote host advertises a zero window, we set the MSS to + the initial MSS so that the application will send an entire MSS + of data. This data will not be acknowledged by the receiver, + and the application will retransmit it. This is called the + "persistent timer" and uses the retransmission mechanim. + */ + tmp16 = ( (u16_t) BUF->wnd[ 0 ] << 8 ) + ( u16_t ) BUF->wnd[ 1 ]; + if( tmp16 > uip_connr->initialmss || tmp16 == 0 ) + { + tmp16 = uip_connr->initialmss; + } + + uip_connr->mss = tmp16; + + /* If this packet constitutes an ACK for outstanding data (flagged + by the UIP_ACKDATA flag, we should call the application since it + might want to send more data. If the incoming packet had data + from the peer (as flagged by the UIP_NEWDATA flag), the + application must also be notified. + + When the application is called, the global variable uip_len + contains the length of the incoming data. The application can + access the incoming data through the global pointer + uip_appdata, which usually points UIP_IPTCPH_LEN + UIP_LLH_LEN + bytes into the uip_buf array. + + If the application wishes to send any data, this data should be + put into the uip_appdata and the length of the data should be + put into uip_len. If the application don't have any data to + send, uip_len must be set to 0. */ + if( uip_flags & (UIP_NEWDATA | UIP_ACKDATA) ) + { + uip_slen = 0; + UIP_APPCALL(); + +appsend: + if( uip_flags & UIP_ABORT ) + { + uip_slen = 0; + uip_connr->tcpstateflags = UIP_CLOSED; + BUF->flags = TCP_RST | TCP_ACK; + goto tcp_send_nodata; + } + + if( uip_flags & UIP_CLOSE ) + { + uip_slen = 0; + uip_connr->len = 1; + uip_connr->tcpstateflags = UIP_FIN_WAIT_1; + uip_connr->nrtx = 0; + BUF->flags = TCP_FIN | TCP_ACK; + goto tcp_send_nodata; + } + + /* If uip_slen > 0, the application has data to be sent. */ + if( uip_slen > 0 ) + { + /* If the connection has acknowledged data, the contents of + the ->len variable should be discarded. */ + if( (uip_flags & UIP_ACKDATA) != 0 ) + { + uip_connr->len = 0; + } + + /* If the ->len variable is non-zero the connection has + already data in transit and cannot send anymore right + now. */ + if( uip_connr->len == 0 ) + { + /* The application cannot send more than what is allowed by + the mss (the minumum of the MSS and the available + window). */ + if( uip_slen > uip_connr->mss ) + { + uip_slen = uip_connr->mss; + } + + /* Remember how much data we send out now so that we know + when everything has been acknowledged. */ + uip_connr->len = uip_slen; + } + else + { + /* If the application already had unacknowledged data, we + make sure that the application does not send (i.e., + retransmit) out more than it previously sent out. */ + uip_slen = uip_connr->len; + } + } + + uip_connr->nrtx = 0; +apprexmit: + uip_appdata = uip_sappdata; + + /* If the application has data to be sent, or if the incoming + packet had new data in it, we must send out a packet. */ + if( uip_slen > 0 && uip_connr->len > 0 ) + { + /* Add the length of the IP and TCP headers. */ + uip_len = uip_connr->len + UIP_TCPIP_HLEN; + + /* We always set the ACK flag in response packets. */ + BUF->flags = TCP_ACK | TCP_PSH; + + /* Send the packet. */ + goto tcp_send_noopts; + } + + /* If there is no data to send, just send out a pure ACK if + there is newdata. */ + if( uip_flags & UIP_NEWDATA ) + { + uip_len = UIP_TCPIP_HLEN; + BUF->flags = TCP_ACK; + goto tcp_send_noopts; + } + } + + goto drop; + + case UIP_LAST_ACK: + /* We can close this connection if the peer has acknowledged our + FIN. This is indicated by the UIP_ACKDATA flag. */ + if( uip_flags & UIP_ACKDATA ) + { + uip_connr->tcpstateflags = UIP_CLOSED; + uip_flags = UIP_CLOSE; + UIP_APPCALL(); + } + + break; + + case UIP_FIN_WAIT_1: + /* The application has closed the connection, but the remote host + hasn't closed its end yet. Thus we do nothing but wait for a + FIN from the other side. */ + if( uip_len > 0 ) + { + uip_add_rcv_nxt( uip_len ); + } + + if( BUF->flags & TCP_FIN ) + { + if( uip_flags & UIP_ACKDATA ) + { + uip_connr->tcpstateflags = UIP_TIME_WAIT; + uip_connr->timer = 0; + uip_connr->len = 0; + } + else + { + uip_connr->tcpstateflags = UIP_CLOSING; + } + + uip_add_rcv_nxt( 1 ); + uip_flags = UIP_CLOSE; + UIP_APPCALL(); + goto tcp_send_ack; + } + else if( uip_flags & UIP_ACKDATA ) + { + uip_connr->tcpstateflags = UIP_FIN_WAIT_2; + uip_connr->len = 0; + goto drop; + } + + if( uip_len > 0 ) + { + goto tcp_send_ack; + } + + goto drop; + + case UIP_FIN_WAIT_2: + if( uip_len > 0 ) + { + uip_add_rcv_nxt( uip_len ); + } + + if( BUF->flags & TCP_FIN ) + { + uip_connr->tcpstateflags = UIP_TIME_WAIT; + uip_connr->timer = 0; + uip_add_rcv_nxt( 1 ); + uip_flags = UIP_CLOSE; + UIP_APPCALL(); + goto tcp_send_ack; + } + + if( uip_len > 0 ) + { + goto tcp_send_ack; + } + + goto drop; + + case UIP_TIME_WAIT: + goto tcp_send_ack; + + case UIP_CLOSING: + if( uip_flags & UIP_ACKDATA ) + { + uip_connr->tcpstateflags = UIP_TIME_WAIT; + uip_connr->timer = 0; + } + } + + goto drop; + + /* We jump here when we are ready to send the packet, and just want + to set the appropriate TCP sequence numbers in the TCP header. */ +tcp_send_ack: + BUF->flags = TCP_ACK; + +tcp_send_nodata: + uip_len = UIP_IPTCPH_LEN; + +tcp_send_noopts: + BUF->tcpoffset = ( UIP_TCPH_LEN / 4 ) << 4; + + /* We're done with the input processing. We are now ready to send a + reply. Our job is to fill in all the fields of the TCP and IP + headers before calculating the checksum and finally send the + packet. */ +tcp_send: + BUF->ackno[ 0 ] = uip_connr->rcv_nxt[ 0 ]; + BUF->ackno[ 1 ] = uip_connr->rcv_nxt[ 1 ]; + BUF->ackno[ 2 ] = uip_connr->rcv_nxt[ 2 ]; + BUF->ackno[ 3 ] = uip_connr->rcv_nxt[ 3 ]; + + BUF->seqno[ 0 ] = uip_connr->snd_nxt[ 0 ]; + BUF->seqno[ 1 ] = uip_connr->snd_nxt[ 1 ]; + BUF->seqno[ 2 ] = uip_connr->snd_nxt[ 2 ]; + BUF->seqno[ 3 ] = uip_connr->snd_nxt[ 3 ]; + + BUF->proto = UIP_PROTO_TCP; + + BUF->srcport = uip_connr->lport; + BUF->destport = uip_connr->rport; + + uip_ipaddr_copy( &BUF->srcipaddr, &uip_hostaddr ); + uip_ipaddr_copy( &BUF->destipaddr, &uip_connr->ripaddr ); + + if( uip_connr->tcpstateflags & UIP_STOPPED ) + { + /* If the connection has issued uip_stop(), we advertise a zero + window so that the remote host will stop sending data. */ + BUF->wnd[ 0 ] = BUF->wnd[ 1 ] = 0; + } + else + { + BUF->wnd[ 0 ] = ( (UIP_RECEIVE_WINDOW) >> 8 ); + BUF->wnd[ 1 ] = ( (UIP_RECEIVE_WINDOW) & 0xff ); + } + +tcp_send_noconn: + + BUF->ttl = UIP_TTL; + + #if UIP_CONF_IPV6 + /* For IPv6, the IP length field does not include the IPv6 IP header + length. */ + BUF->len[ 0 ] = ( (uip_len - UIP_IPH_LEN) >> 8 ); + BUF->len[ 1 ] = ( (uip_len - UIP_IPH_LEN) & 0xff ); + #else /* UIP_CONF_IPV6 */ + BUF->len[ 0 ] = ( uip_len >> 8 ); + BUF->len[ 1 ] = ( uip_len & 0xff ); + #endif /* UIP_CONF_IPV6 */ + + BUF->urgp[ 0 ] = BUF->urgp[ 1 ] = 0; + + /* Calculate TCP checksum. */ + BUF->tcpchksum = 0; + BUF->tcpchksum = ~( uip_tcpchksum() ); + +ip_send_nolen: + #if UIP_CONF_IPV6 + BUF->vtc = 0x60; + BUF->tcflow = 0x00; + BUF->flow = 0x00; + #else /* UIP_CONF_IPV6 */ + BUF->vhl = 0x45; + BUF->tos = 0; + BUF->ipoffset[ 0 ] = BUF->ipoffset[ 1 ] = 0; + ++ipid; + BUF->ipid[ 0 ] = ipid >> 8; + BUF->ipid[ 1 ] = ipid & 0xff; + + /* Calculate IP checksum. */ + BUF->ipchksum = 0; + BUF->ipchksum = ~( uip_ipchksum() ); + + //DEBUG_PRINTF( "uip ip_send_nolen: chkecum 0x%04x\n", uip_ipchksum() ); + #endif /* UIP_CONF_IPV6 */ + + UIP_STAT( ++uip_stat.tcp.sent ); + + #if UIP_CONF_IPV6 +send : + #endif /* UIP_CONF_IPV6 */ + + //DEBUG_PRINTF( "Sending packet with length %d (%d)\n", uip_len, (BUF->len[ 0 ] << 8) | BUF->len[ 1 ] ); + UIP_STAT( ++uip_stat.ip.sent ); + + /* Return and let the caller do the actual transmission. */ + uip_flags = 0; + return; + +drop: + uip_len = 0; + uip_flags = 0; + return; +} +/*---------------------------------------------------------------------------*/ + +u16_t htons( u16_t val ) +{ + return HTONS( val ); +} + +u32_t htonl( u32_t val ) +{ + return HTONL( val ); +} +/*---------------------------------------------------------------------------*/ + +void uip_send( const void *data, int len ) +{ + int copylen; + + #define MIN( a, b ) ( (a) < (b) ? (a) : (b) ) + + copylen = MIN( len, UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN - ( int ) + (( char * ) uip_sappdata - ( char * ) &uip_buf[UIP_LLH_LEN + UIP_TCPIP_HLEN]) ); + if( copylen > 0 ) + { + uip_slen = copylen; + if( data != uip_sappdata ) + { + memcpy( uip_sappdata, (data), uip_slen ); + } + } +} +/*---------------------------------------------------------------------------*/ + +/** @} */ +#endif /* UIP_CONF_IPV6 */ diff --git a/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/uip_arp.c b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/uip_arp.c new file mode 100644 index 0000000..ab84419 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/ethernet/FreeTCPIP/uip_arp.c @@ -0,0 +1,475 @@ +/** + * \addtogroup uip + * @{ + */ + +/** + * \defgroup uiparp uIP Address Resolution Protocol + * @{ + * + * The Address Resolution Protocol ARP is used for mapping between IP + * addresses and link level addresses such as the Ethernet MAC + * addresses. ARP uses broadcast queries to ask for the link level + * address of a known IP address and the host which is configured with + * the IP address for which the query was meant, will respond with its + * link level address. + * + * \note This ARP implementation only supports Ethernet. + */ + +/** + * \file + * Implementation of the ARP Address Resolution Protocol. + * \author Adam Dunkels + * + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip_arp.c,v 1.5 2008/02/07 01:35:00 adamdunkels Exp $ + * + */ +#include "net/uip_arp.h" + +#include + +#include "net/pack_struct_start.h" +struct arp_hdr +{ + struct uip_eth_hdr ethhdr; + u16_t hwtype; + u16_t protocol; + u8_t hwlen; + u8_t protolen; + u16_t opcode; + struct uip_eth_addr shwaddr; + uip_ipaddr_t sipaddr; + struct uip_eth_addr dhwaddr; + uip_ipaddr_t dipaddr; +} + +#include "net/pack_struct_end.h" + +#include "net/pack_struct_start.h" + +struct ethip_hdr +{ + struct uip_eth_hdr ethhdr; + + /* IP header. */ + u8_t vhl, tos, len[2], ipid[2], ipoffset[2], ttl, proto; + u16_t ipchksum; + uip_ipaddr_t srcipaddr, destipaddr; +} + +#include "net/pack_struct_end.h" + +#define ARP_REQUEST 1 +#define ARP_REPLY 2 + +#define ARP_HWTYPE_ETH 1 + +struct arp_entry +{ + uip_ipaddr_t ipaddr; + struct uip_eth_addr ethaddr; + u8_t time; +}; + +static const struct uip_eth_addr broadcast_ethaddr = { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } }; + +static struct arp_entry arp_table[UIP_ARPTAB_SIZE]; +static uip_ipaddr_t ipaddr; +static u8_t i, c; + +static u8_t arptime; +static u8_t tmpage; + +#define BUF ( ( struct arp_hdr * ) &uip_buf[0] ) +#define IPBUF ( ( struct ethip_hdr * ) &uip_buf[0] ) + +#ifdef DEBUG + #undef DEBUG +#endif +#define DEBUG 0 +#if DEBUG +#include +#define PRINTF( ... ) printf( __VA_ARGS__ ) +#else + +//#define PRINTF( ... ) +#endif + +/*-----------------------------------------------------------------------------------*/ + +/** + * Initialize the ARP module. + * + */ + +/*-----------------------------------------------------------------------------------*/ +void uip_arp_init( void ) +{ + for( i = 0; i < UIP_ARPTAB_SIZE; ++i ) + { + memset( &arp_table[i].ipaddr, 0, 4 ); + } +} + +/*-----------------------------------------------------------------------------------*/ + +/** + * Periodic ARP processing function. + * + * This function performs periodic timer processing in the ARP module + * and should be called at regular intervals. The recommended interval + * is 10 seconds between the calls. + * + */ + +/*-----------------------------------------------------------------------------------*/ +void uip_arp_timer( void ) +{ + struct arp_entry *tabptr; + + ++arptime; + for( i = 0; i < UIP_ARPTAB_SIZE; ++i ) + { + tabptr = &arp_table[i]; + if( uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr) && arptime - tabptr->time >= UIP_ARP_MAXAGE ) + { + memset( &tabptr->ipaddr, 0, 4 ); + } + } +} + +/*-----------------------------------------------------------------------------------*/ +static void uip_arp_update( uip_ipaddr_t *ipaddr, struct uip_eth_addr *ethaddr ) +{ + register struct arp_entry *tabptr; + + /* Walk through the ARP mapping table and try to find an entry to + update. If none is found, the IP -> MAC address mapping is + inserted in the ARP table. */ + for( i = 0; i < UIP_ARPTAB_SIZE; ++i ) + { + tabptr = &arp_table[i]; + + /* Only check those entries that are actually in use. */ + if( !uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr) ) + { + /* Check if the source IP address of the incoming packet matches + the IP address in this ARP table entry. */ + if( uip_ipaddr_cmp(ipaddr, &tabptr->ipaddr) ) + { + /* An old entry found, update this and return. */ + memcpy( tabptr->ethaddr.addr, ethaddr->addr, 6 ); + tabptr->time = arptime; + + return; + } + } + } + + /* If we get here, no existing ARP table entry was found, so we + create one. */ + + /* First, we try to find an unused entry in the ARP table. */ + for( i = 0; i < UIP_ARPTAB_SIZE; ++i ) + { + tabptr = &arp_table[i]; + if( uip_ipaddr_cmp(&tabptr->ipaddr, &uip_all_zeroes_addr) ) + { + break; + } + } + + /* If no unused entry is found, we try to find the oldest entry and + throw it away. */ + if( i == UIP_ARPTAB_SIZE ) + { + tmpage = 0; + c = 0; + for( i = 0; i < UIP_ARPTAB_SIZE; ++i ) + { + tabptr = &arp_table[i]; + if( arptime - tabptr->time > tmpage ) + { + tmpage = arptime - tabptr->time; + c = i; + } + } + + i = c; + tabptr = &arp_table[i]; + } + + /* Now, i is the ARP table entry which we will fill with the new + information. */ + uip_ipaddr_copy( &tabptr->ipaddr, ipaddr ); + memcpy( tabptr->ethaddr.addr, ethaddr->addr, 6 ); + tabptr->time = arptime; +} + +/*-----------------------------------------------------------------------------------*/ + +/** + * ARP processing for incoming IP packets + * + * This function should be called by the device driver when an IP + * packet has been received. The function will check if the address is + * in the ARP cache, and if so the ARP cache entry will be + * refreshed. If no ARP cache entry was found, a new one is created. + * + * This function expects an IP packet with a prepended Ethernet header + * in the uip_buf[] buffer, and the length of the packet in the global + * variable uip_len. + */ + +/*-----------------------------------------------------------------------------------*/ +#if 0 +void uip_arp_ipin( void ) +{ + uip_len -= sizeof( struct uip_eth_hdr ); + + /* Only insert/update an entry if the source IP address of the + incoming IP packet comes from a host on the local network. */ + if( (IPBUF->srcipaddr[0] & uip_netmask[0]) != (uip_hostaddr[0] & uip_netmask[0]) ) + { + return; + } + + if( (IPBUF->srcipaddr[1] & uip_netmask[1]) != (uip_hostaddr[1] & uip_netmask[1]) ) + { + return; + } + + uip_arp_update( IPBUF->srcipaddr, &(IPBUF->ethhdr.src) ); + + return; +} + +#endif /* 0 */ + +/*-----------------------------------------------------------------------------------*/ + +/** + * ARP processing for incoming ARP packets. + * + * This function should be called by the device driver when an ARP + * packet has been received. The function will act differently + * depending on the ARP packet type: if it is a reply for a request + * that we previously sent out, the ARP cache will be filled in with + * the values from the ARP reply. If the incoming ARP packet is an ARP + * request for our IP address, an ARP reply packet is created and put + * into the uip_buf[] buffer. + * + * When the function returns, the value of the global variable uip_len + * indicates whether the device driver should send out a packet or + * not. If uip_len is zero, no packet should be sent. If uip_len is + * non-zero, it contains the length of the outbound packet that is + * present in the uip_buf[] buffer. + * + * This function expects an ARP packet with a prepended Ethernet + * header in the uip_buf[] buffer, and the length of the packet in the + * global variable uip_len. + */ + +/*-----------------------------------------------------------------------------------*/ +void uip_arp_arpin( void ) +{ + if( uip_len < sizeof(struct arp_hdr) ) + { + uip_len = 0; + return; + } + + uip_len = 0; + + switch( BUF->opcode ) + { + case HTONS( ARP_REQUEST ): + /* ARP request. If it asked for our address, we send out a + reply. */ + + /* if(BUF->dipaddr[0] == uip_hostaddr[0] && + BUF->dipaddr[1] == uip_hostaddr[1]) {*/ + + //PRINTF( "uip_arp_arpin: request for %d.%d.%d.%d (we are %d.%d.%d.%d)\n", BUF->dipaddr.u8[0], BUF->dipaddr.u8[1], BUF->dipaddr.u8[2], + //BUF->dipaddr.u8[3], uip_hostaddr.u8[0], uip_hostaddr.u8[1], uip_hostaddr.u8[2], uip_hostaddr.u8[3] ); + if( uip_ipaddr_cmp(&BUF->dipaddr, &uip_hostaddr) ) + { + /* First, we register the one who made the request in our ARP + table, since it is likely that we will do more communication + with this host in the future. */ + uip_arp_update( &BUF->sipaddr, &BUF->shwaddr ); + + BUF->opcode = HTONS( ARP_REPLY ); + + memcpy( BUF->dhwaddr.addr, BUF->shwaddr.addr, 6 ); + memcpy( BUF->shwaddr.addr, uip_ethaddr.addr, 6 ); + memcpy( BUF->ethhdr.src.addr, uip_ethaddr.addr, 6 ); + memcpy( BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6 ); + + uip_ipaddr_copy( &BUF->dipaddr, &BUF->sipaddr ); + uip_ipaddr_copy( &BUF->sipaddr, &uip_hostaddr ); + + BUF->ethhdr.type = HTONS( UIP_ETHTYPE_ARP ); + uip_len = sizeof( struct arp_hdr ); + } + + break; + + case HTONS( ARP_REPLY ): + /* ARP reply. We insert or update the ARP table if it was meant + for us. */ + if( uip_ipaddr_cmp(&BUF->dipaddr, &uip_hostaddr) ) + { + uip_arp_update( &BUF->sipaddr, &BUF->shwaddr ); + } + + break; + } + + return; +} + +/*-----------------------------------------------------------------------------------*/ + +/** + * Prepend Ethernet header to an outbound IP packet and see if we need + * to send out an ARP request. + * + * This function should be called before sending out an IP packet. The + * function checks the destination IP address of the IP packet to see + * what Ethernet MAC address that should be used as a destination MAC + * address on the Ethernet. + * + * If the destination IP address is in the local network (determined + * by logical ANDing of netmask and our IP address), the function + * checks the ARP cache to see if an entry for the destination IP + * address is found. If so, an Ethernet header is prepended and the + * function returns. If no ARP cache entry is found for the + * destination IP address, the packet in the uip_buf[] is replaced by + * an ARP request packet for the IP address. The IP packet is dropped + * and it is assumed that they higher level protocols (e.g., TCP) + * eventually will retransmit the dropped packet. + * + * If the destination IP address is not on the local network, the IP + * address of the default router is used instead. + * + * When the function returns, a packet is present in the uip_buf[] + * buffer, and the length of the packet is in the global variable + * uip_len. + */ + +/*-----------------------------------------------------------------------------------*/ +void uip_arp_out( void ) +{ + struct arp_entry *tabptr; + + /* Find the destination IP address in the ARP table and construct + the Ethernet header. If the destination IP addres isn't on the + local network, we use the default router's IP address instead. + + If not ARP table entry is found, we overwrite the original IP + packet with an ARP request for the IP address. */ + + /* First check if destination is a local broadcast. */ + if( uip_ipaddr_cmp(&IPBUF->destipaddr, &uip_broadcast_addr) ) + { + memcpy( IPBUF->ethhdr.dest.addr, broadcast_ethaddr.addr, 6 ); + } + else + { + /* Check if the destination address is on the local network. */ + if( !uip_ipaddr_maskcmp(&IPBUF->destipaddr, &uip_hostaddr, &uip_netmask) ) + { + /* Destination address was not on the local network, so we need to + use the default router's IP address instead of the destination + address when determining the MAC address. */ + uip_ipaddr_copy( &ipaddr, &uip_draddr ); + } + else + { + /* Else, we use the destination IP address. */ + uip_ipaddr_copy( &ipaddr, &IPBUF->destipaddr ); + } + + for( i = 0; i < UIP_ARPTAB_SIZE; ++i ) + { + tabptr = &arp_table[i]; + if( uip_ipaddr_cmp(&ipaddr, &tabptr->ipaddr) ) + { + break; + } + } + + if( i == UIP_ARPTAB_SIZE ) + { + /* The destination address was not in our ARP table, so we + overwrite the IP packet with an ARP request. */ + memset( BUF->ethhdr.dest.addr, 0xff, 6 ); + memset( BUF->dhwaddr.addr, 0x00, 6 ); + memcpy( BUF->ethhdr.src.addr, uip_ethaddr.addr, 6 ); + memcpy( BUF->shwaddr.addr, uip_ethaddr.addr, 6 ); + + uip_ipaddr_copy( &BUF->dipaddr, &ipaddr ); + uip_ipaddr_copy( &BUF->sipaddr, &uip_hostaddr ); + BUF->opcode = HTONS( ARP_REQUEST ); /* ARP request. */ + BUF->hwtype = HTONS( ARP_HWTYPE_ETH ); + BUF->protocol = HTONS( UIP_ETHTYPE_IP ); + BUF->hwlen = 6; + BUF->protolen = 4; + BUF->ethhdr.type = HTONS( UIP_ETHTYPE_ARP ); + + uip_appdata = &uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN]; + + uip_len = sizeof( struct arp_hdr ); + return; + } + + /* Build an ethernet header. */ + memcpy( IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6 ); + } + + memcpy( IPBUF->ethhdr.src.addr, uip_ethaddr.addr, 6 ); + + IPBUF->ethhdr.type = HTONS( UIP_ETHTYPE_IP ); + + uip_len += sizeof( struct uip_eth_hdr ); +} + +/*-----------------------------------------------------------------------------------*/ + +/** @} */ + +/** @} */ diff --git a/third_party/FreeRTOS/Demo/Common/include/AltBlckQ.h b/third_party/FreeRTOS/Demo/Common/include/AltBlckQ.h new file mode 100644 index 0000000..490d74b --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/AltBlckQ.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef ALT_BLOCK_Q_H +#define ALT_BLOCK_Q_H + +void vStartAltBlockingQueueTasks( unsigned portBASE_TYPE uxPriority ); +portBASE_TYPE xAreAltBlockingQueuesStillRunning( void ); + +#endif + + diff --git a/third_party/FreeRTOS/Demo/Common/include/AltBlock.h b/third_party/FreeRTOS/Demo/Common/include/AltBlock.h new file mode 100644 index 0000000..e0373a6 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/AltBlock.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FAST_BLOCK_TIME_TEST_H +#define FAST_BLOCK_TIME_TEST_H + +void vCreateAltBlockTimeTasks( void ); +portBASE_TYPE xAreAltBlockTimeTestTasksStillRunning( void ); + +#endif + + diff --git a/third_party/FreeRTOS/Demo/Common/include/AltPollQ.h b/third_party/FreeRTOS/Demo/Common/include/AltPollQ.h new file mode 100644 index 0000000..62e5e0b --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/AltPollQ.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef ALT_POLLED_Q_H +#define ALT_POLLED_Q_H + +void vStartAltPolledQueueTasks( unsigned portBASE_TYPE uxPriority ); +portBASE_TYPE xAreAltPollingQueuesStillRunning( void ); + +#endif + + diff --git a/third_party/FreeRTOS/Demo/Common/include/AltQTest.h b/third_party/FreeRTOS/Demo/Common/include/AltQTest.h new file mode 100644 index 0000000..afa00dc --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/AltQTest.h @@ -0,0 +1,75 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FAST_GEN_Q_TEST_H +#define FAST_GEN_Q_TEST_H + +void vStartAltGenericQueueTasks( unsigned portBASE_TYPE uxPriority ); +portBASE_TYPE xAreAltGenericQueueTasksStillRunning( void ); + +#endif /* GEN_Q_TEST_H */ + + + diff --git a/third_party/FreeRTOS/Demo/Common/include/BlockQ.h b/third_party/FreeRTOS/Demo/Common/include/BlockQ.h new file mode 100644 index 0000000..d82bd93 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/BlockQ.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef BLOCK_Q_H +#define BLOCK_Q_H + +void vStartBlockingQueueTasks( unsigned portBASE_TYPE uxPriority ); +portBASE_TYPE xAreBlockingQueuesStillRunning( void ); + +#endif + + diff --git a/third_party/FreeRTOS/Demo/Common/include/GenQTest.h b/third_party/FreeRTOS/Demo/Common/include/GenQTest.h new file mode 100644 index 0000000..eedbe67 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/GenQTest.h @@ -0,0 +1,75 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef GEN_Q_TEST_H +#define GEN_Q_TEST_H + +void vStartGenericQueueTasks( unsigned portBASE_TYPE uxPriority ); +portBASE_TYPE xAreGenericQueueTasksStillRunning( void ); + +#endif /* GEN_Q_TEST_H */ + + + diff --git a/third_party/FreeRTOS/Demo/Common/include/IntQueue.h b/third_party/FreeRTOS/Demo/Common/include/IntQueue.h new file mode 100644 index 0000000..01ba70a --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/IntQueue.h @@ -0,0 +1,80 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef QUEUE_ACCESS_TEST +#define QUEUE_ACCESS_TEST + +void vStartInterruptQueueTasks( void ); +portBASE_TYPE xAreIntQueueTasksStillRunning( void ); +portBASE_TYPE xFirstTimerHandler( void ); +portBASE_TYPE xSecondTimerHandler( void ); + +#endif /* QUEUE_ACCESS_TEST */ + + + + + + diff --git a/third_party/FreeRTOS/Demo/Common/include/PollQ.h b/third_party/FreeRTOS/Demo/Common/include/PollQ.h new file mode 100644 index 0000000..3cb3636 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/PollQ.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef POLLED_Q_H +#define POLLED_Q_H + +void vStartPolledQueueTasks( unsigned portBASE_TYPE uxPriority ); +portBASE_TYPE xArePollingQueuesStillRunning( void ); + +#endif + + diff --git a/third_party/FreeRTOS/Demo/Common/include/QPeek.h b/third_party/FreeRTOS/Demo/Common/include/QPeek.h new file mode 100644 index 0000000..4a6e55a --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/QPeek.h @@ -0,0 +1,75 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef Q_PEEK_TEST_H +#define Q_PEEK_TEST_H + +void vStartQueuePeekTasks( void ); +portBASE_TYPE xAreQueuePeekTasksStillRunning( void ); + +#endif /* Q_PEEK_TEST_H */ + + + diff --git a/third_party/FreeRTOS/Demo/Common/include/TimerDemo.h b/third_party/FreeRTOS/Demo/Common/include/TimerDemo.h new file mode 100644 index 0000000..21f5b00 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/TimerDemo.h @@ -0,0 +1,76 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef TIMER_DEMO_H +#define TIMER_DEMO_H + +void vStartTimerDemoTask( portTickType xBaseFrequencyIn ); +portBASE_TYPE xAreTimerDemoTasksStillRunning( portTickType xCycleFrequency ); +void vTimerPeriodicISRTests( void ); + +#endif /* TIMER_DEMO_H */ + + + diff --git a/third_party/FreeRTOS/Demo/Common/include/blocktim.h b/third_party/FreeRTOS/Demo/Common/include/blocktim.h new file mode 100644 index 0000000..73ff61b --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/blocktim.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef BLOCK_TIME_TEST_H +#define BLOCK_TIME_TEST_H + +void vCreateBlockTimeTasks( void ); +portBASE_TYPE xAreBlockTimeTestTasksStillRunning( void ); + +#endif + + diff --git a/third_party/FreeRTOS/Demo/Common/include/comtest.h b/third_party/FreeRTOS/Demo/Common/include/comtest.h new file mode 100644 index 0000000..7bb5074 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/comtest.h @@ -0,0 +1,75 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef COMTEST_H +#define COMTEST_H + +void vAltStartComTestTasks( unsigned portBASE_TYPE uxPriority, unsigned long ulBaudRate, unsigned portBASE_TYPE uxLED ); +void vStartComTestTasks( unsigned portBASE_TYPE uxPriority, eCOMPort ePort, eBaud eBaudRate ); +portBASE_TYPE xAreComTestTasksStillRunning( void ); +void vComTestUnsuspendTask( void ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/Common/include/comtest2.h b/third_party/FreeRTOS/Demo/Common/include/comtest2.h new file mode 100644 index 0000000..7392535 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/comtest2.h @@ -0,0 +1,73 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef COMTEST_H +#define COMTEST_H + +void vAltStartComTestTasks( unsigned portBASE_TYPE uxPriority, unsigned long ulBaudRate, unsigned portBASE_TYPE uxLED ); +portBASE_TYPE xAreComTestTasksStillRunning( void ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/Common/include/comtest_strings.h b/third_party/FreeRTOS/Demo/Common/include/comtest_strings.h new file mode 100644 index 0000000..63835aa --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/comtest_strings.h @@ -0,0 +1,73 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef COMTEST_STRINGS_H +#define COMTEST_STRINGS_H + +void vStartComTestStringsTasks( unsigned portBASE_TYPE uxPriority, unsigned long ulBaudRate, unsigned portBASE_TYPE uxLED ); +portBASE_TYPE xAreComTestTasksStillRunning( void ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/Common/include/countsem.h b/third_party/FreeRTOS/Demo/Common/include/countsem.h new file mode 100644 index 0000000..d955f59 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/countsem.h @@ -0,0 +1,73 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef COUNT_SEMAPHORE_TEST_H +#define COUNT_SEMAPHORE_TEST_H + +void vStartCountingSemaphoreTasks( void ); +portBASE_TYPE xAreCountingSemaphoreTasksStillRunning( void ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/Common/include/crflash.h b/third_party/FreeRTOS/Demo/Common/include/crflash.h new file mode 100644 index 0000000..0c2f1f9 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/crflash.h @@ -0,0 +1,85 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef CRFLASH_LED_H +#define CRFLASH_LED_H + +/* + * Create the co-routines used to flash the LED's at different rates. + * + * @param uxPriority The number of 'fixed delay' co-routines to create. This + * also effects the number of LED's that will be utilised. For example, + * passing in 3 will cause LED's 0 to 2 to be utilised. + */ +void vStartFlashCoRoutines( unsigned portBASE_TYPE uxPriority ); + +/* + * Return pdPASS or pdFAIL depending on whether an error has been detected + * or not. + */ +portBASE_TYPE xAreFlashCoRoutinesStillRunning( void ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/Common/include/crhook.h b/third_party/FreeRTOS/Demo/Common/include/crhook.h new file mode 100644 index 0000000..a032d0f --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/crhook.h @@ -0,0 +1,81 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef CRHOOK_H +#define CRHOOK_H + +/* + * Create the co-routines used to communicate wit the tick hook. + */ +void vStartHookCoRoutines( void ); + +/* + * Return pdPASS or pdFAIL depending on whether an error has been detected + * or not. + */ +portBASE_TYPE xAreHookCoRoutinesStillRunning( void ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/Common/include/death.h b/third_party/FreeRTOS/Demo/Common/include/death.h new file mode 100644 index 0000000..6dc6e07 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/death.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef SUICIDE_TASK_H +#define SUICIDE_TASK_H + +void vCreateSuicidalTasks( unsigned portBASE_TYPE uxPriority ); +portBASE_TYPE xIsCreateTaskStillRunning( void ); + +#endif + + diff --git a/third_party/FreeRTOS/Demo/Common/include/dynamic.h b/third_party/FreeRTOS/Demo/Common/include/dynamic.h new file mode 100644 index 0000000..eb3681d --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/dynamic.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef DYNAMIC_MANIPULATION_H +#define DYNAMIC_MANIPULATION_H + +void vStartDynamicPriorityTasks( void ); +portBASE_TYPE xAreDynamicPriorityTasksStillRunning( void ); + +#endif + + diff --git a/third_party/FreeRTOS/Demo/Common/include/fileIO.h b/third_party/FreeRTOS/Demo/Common/include/fileIO.h new file mode 100644 index 0000000..ce2080a --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/fileIO.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FILE_IO_H +#define FILE_OI_H + +void vDisplayMessage( const char * const pcMessageToPrint ); +void vWriteMessageToDisk( const char * const pcMessage ); +void vWriteBufferToDisk( const char * const pcBuffer, unsigned long ulBufferLength ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/Common/include/flash.h b/third_party/FreeRTOS/Demo/Common/include/flash.h new file mode 100644 index 0000000..0d56ee1 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/flash.h @@ -0,0 +1,72 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FLASH_LED_H +#define FLASH_LED_H + +void vStartLEDFlashTasks( unsigned portBASE_TYPE uxPriority ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/Common/include/flash_timer.h b/third_party/FreeRTOS/Demo/Common/include/flash_timer.h new file mode 100644 index 0000000..92be478 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/flash_timer.h @@ -0,0 +1,79 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FLASH_TIMER_H +#define FLASH_TIMER_H + +/* + * Creates the LED flashing timers. xNumberOfLEDs specifies how many timers to + * create, with each timer toggling a different LED. The first LED to be + * toggled is LED 0, with subsequent LEDs following on in numerical order. Each + * timer uses the exact same callback function, with the timer ID being used + * within the callback function to determine which timer has actually expired + * (and therefore which LED to toggle). + */ +void vStartLEDFlashTimers( unsigned portBASE_TYPE uxNumberOfLEDs ); + +#endif /* FLASH_TIMER_H */ diff --git a/third_party/FreeRTOS/Demo/Common/include/flop.h b/third_party/FreeRTOS/Demo/Common/include/flop.h new file mode 100644 index 0000000..de23659 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/flop.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef FLOP_TASKS_H +#define FLOP_TASKS_H + +void vStartMathTasks( unsigned portBASE_TYPE uxPriority ); +portBASE_TYPE xAreMathsTaskStillRunning( void ); + +#endif + + diff --git a/third_party/FreeRTOS/Demo/Common/include/integer.h b/third_party/FreeRTOS/Demo/Common/include/integer.h new file mode 100644 index 0000000..d7d62e5 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/integer.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef INTEGER_TASKS_H +#define INTEGER_TASKS_H + +void vStartIntegerMathTasks( unsigned portBASE_TYPE uxPriority ); +portBASE_TYPE xAreIntegerMathsTaskStillRunning( void ); + +#endif + + diff --git a/third_party/FreeRTOS/Demo/Common/include/mevents.h b/third_party/FreeRTOS/Demo/Common/include/mevents.h new file mode 100644 index 0000000..01f3118 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/mevents.h @@ -0,0 +1,74 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef EVENTS_TEST_H +#define EVENTS_TEST_H + +void vStartMultiEventTasks( void ); +portBASE_TYPE xAreMultiEventTasksStillRunning( void ); + +#endif + + diff --git a/third_party/FreeRTOS/Demo/Common/include/partest.h b/third_party/FreeRTOS/Demo/Common/include/partest.h new file mode 100644 index 0000000..461e7f8 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/partest.h @@ -0,0 +1,76 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PARTEST_H +#define PARTEST_H + +#define partstDEFAULT_PORT_ADDRESS ( ( unsigned short ) 0x378 ) + +void vParTestInitialise( void ); +void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue ); +void vParTestToggleLED( unsigned portBASE_TYPE uxLED ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/Common/include/print.h b/third_party/FreeRTOS/Demo/Common/include/print.h new file mode 100644 index 0000000..0f79fce --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/print.h @@ -0,0 +1,75 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PRINT_H +#define PRINT_H + +void vPrintInitialise( void ); +void vPrintDisplayMessage( const char * const * pcMessageToSend ); +const char *pcPrintGetNextMessage( portTickType xPrintRate ); + +#endif + + diff --git a/third_party/FreeRTOS/Demo/Common/include/recmutex.h b/third_party/FreeRTOS/Demo/Common/include/recmutex.h new file mode 100644 index 0000000..d9745c0 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/recmutex.h @@ -0,0 +1,73 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef RECURSIVE_MUTEX_TEST_H +#define RECURSIVE_MUTEX_TEST_H + +void vStartRecursiveMutexTasks( void ); +portBASE_TYPE xAreRecursiveMutexTasksStillRunning( void ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/Common/include/semtest.h b/third_party/FreeRTOS/Demo/Common/include/semtest.h new file mode 100644 index 0000000..0fbcbb2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/semtest.h @@ -0,0 +1,73 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef SEMAPHORE_TEST_H +#define SEMAPHORE_TEST_H + +void vStartSemaphoreTasks( unsigned portBASE_TYPE uxPriority ); +portBASE_TYPE xAreSemaphoreTasksStillRunning( void ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/Common/include/serial.h b/third_party/FreeRTOS/Demo/Common/include/serial.h new file mode 100644 index 0000000..eccffc2 --- /dev/null +++ b/third_party/FreeRTOS/Demo/Common/include/serial.h @@ -0,0 +1,136 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef SERIAL_COMMS_H +#define SERIAL_COMMS_H + +typedef void * xComPortHandle; + +typedef enum +{ + serCOM1, + serCOM2, + serCOM3, + serCOM4, + serCOM5, + serCOM6, + serCOM7, + serCOM8 +} eCOMPort; + +typedef enum +{ + serNO_PARITY, + serODD_PARITY, + serEVEN_PARITY, + serMARK_PARITY, + serSPACE_PARITY +} eParity; + +typedef enum +{ + serSTOP_1, + serSTOP_2 +} eStopBits; + +typedef enum +{ + serBITS_5, + serBITS_6, + serBITS_7, + serBITS_8 +} eDataBits; + +typedef enum +{ + ser50, + ser75, + ser110, + ser134, + ser150, + ser200, + ser300, + ser600, + ser1200, + ser1800, + ser2400, + ser4800, + ser9600, + ser19200, + ser38400, + ser57600, + ser115200 +} eBaud; + +xComPortHandle xSerialPortInitMinimal( unsigned long ulWantedBaud, unsigned portBASE_TYPE uxQueueLength ); +xComPortHandle xSerialPortInit( eCOMPort ePort, eBaud eWantedBaud, eParity eWantedParity, eDataBits eWantedDataBits, eStopBits eWantedStopBits, unsigned portBASE_TYPE uxBufferLength ); +void vSerialPutString( xComPortHandle pxPort, const signed char * const pcString, unsigned short usStringLength ); +signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed char *pcRxedChar, portTickType xBlockTime ); +signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed char cOutChar, portTickType xBlockTime ); +portBASE_TYPE xSerialWaitForSemaphore( xComPortHandle xPort ); +void vSerialClose( xComPortHandle xPort ); + +#endif + diff --git a/third_party/FreeRTOS/Demo/readme.txt b/third_party/FreeRTOS/Demo/readme.txt new file mode 100644 index 0000000..813c257 --- /dev/null +++ b/third_party/FreeRTOS/Demo/readme.txt @@ -0,0 +1,16 @@ +Each RTOS port has a demo application to demonstrate it's use. + ++ The Demo/Common directory contains the demo application files as described on +the http://www.FreeRTOS.org WEB site. Each file creates one or more tasks. +The files in the Demo/Common directory are used by every demo application for +every port. + ++ All the other directories contain a project or makefile for the demo +application targeted at a particular microcontroller. + + +For example, if you are interested in the ATMega323 demo application for +the WinAVR tools then the AVR_ATMega323_WinAVR directory contains the +relevant makefile. The makefile includes files from the Demo/ATMega323 +and the Demo/Common directories. If this is the only port you are +interested in then all the other directories can be ignored. diff --git a/third_party/FreeRTOS/License/license.txt b/third_party/FreeRTOS/License/license.txt new file mode 100644 index 0000000..5364231 --- /dev/null +++ b/third_party/FreeRTOS/License/license.txt @@ -0,0 +1,394 @@ +The FreeRTOS source code is licensed by a *modified* GNU General Public +License (GPL). The modification is provided in the form of an exception. + +NOTE: The modification to the GPL is included to allow you to distribute a +combined work that includes FreeRTOS without being obliged to provide the source +code for proprietary components outside of the FreeRTOS kernel. + + + +---------------------------------------------------------------------------- + +The FreeRTOS GPL Exception Text: + +Any FreeRTOS source code, whether modified or in it's original release form, +or whether in whole or in part, can only be distributed by you under the terms +of the GNU General Public License plus this exception. An independent module is +a module which is not derived from or based on FreeRTOS. + +Clause 1: + +Linking FreeRTOS statically or dynamically with other modules is making a +combined work based on FreeRTOS. Thus, the terms and conditions of the GNU +General Public License cover the whole combination. + +As a special exception, the copyright holder of FreeRTOS gives you permission +to link FreeRTOS with independent modules that communicate with FreeRTOS +solely through the FreeRTOS API interface, regardless of the license terms of +these independent modules, and to copy and distribute the resulting combined +work under terms of your choice, provided that + + + Every copy of the combined work is accompanied by a written statement that + details to the recipient the version of FreeRTOS used and an offer by yourself + to provide the FreeRTOS source code (including any modifications you may have + made) should the recipient request it. + + + The combined work is not itself an RTOS, scheduler, kernel or related product. + + + The independent modules add significant and primary functionality to FreeRTOS + and do not merely extend the existing functionality already present in FreeRTOS. + +Clause 2: + +FreeRTOS may not be used for any competitive or comparative purpose, including the +publication of any form of run time or compile time metric, without the express +permission of Real Time Engineers Ltd. (this is the norm within the industry and +is intended to ensure information accuracy). + + +-------------------------------------------------------------------- + +The standard GPL exception text: + + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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 Library General +Public License instead of this License. + diff --git a/third_party/FreeRTOS/Source/croutine.c b/third_party/FreeRTOS/Source/croutine.c new file mode 100644 index 0000000..2b135f8 --- /dev/null +++ b/third_party/FreeRTOS/Source/croutine.c @@ -0,0 +1,386 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include "FreeRTOS.h" +#include "task.h" +#include "croutine.h" + +/* + * Some kernel aware debuggers require data to be viewed to be global, rather + * than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + + +/* Lists for ready and blocked co-routines. --------------------*/ +static xList pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */ +static xList xDelayedCoRoutineList1; /*< Delayed co-routines. */ +static xList xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */ +static xList * pxDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used. */ +static xList * pxOverflowDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */ +static xList xPendingReadyCoRoutineList; /*< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */ + +/* Other file private variables. --------------------------------*/ +corCRCB * pxCurrentCoRoutine = NULL; +static unsigned portBASE_TYPE uxTopCoRoutineReadyPriority = 0; +static portTickType xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0; + +/* The initial state of the co-routine when it is created. */ +#define corINITIAL_STATE ( 0 ) + +/* + * Place the co-routine represented by pxCRCB into the appropriate ready queue + * for the priority. It is inserted at the end of the list. + * + * This macro accesses the co-routine ready lists and therefore must not be + * used from within an ISR. + */ +#define prvAddCoRoutineToReadyQueue( pxCRCB ) \ +{ \ + if( pxCRCB->uxPriority > uxTopCoRoutineReadyPriority ) \ + { \ + uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \ + } \ + vListInsertEnd( ( xList * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ +} + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first co-routine. + */ +static void prvInitialiseCoRoutineLists( void ); + +/* + * Co-routines that are readied by an interrupt cannot be placed directly into + * the ready lists (there is no mutual exclusion). Instead they are placed in + * in the pending ready list in order that they can later be moved to the ready + * list by the co-routine scheduler. + */ +static void prvCheckPendingReadyList( void ); + +/* + * Macro that looks at the list of co-routines that are currently delayed to + * see if any require waking. + * + * Co-routines are stored in the queue in the order of their wake time - + * meaning once one co-routine has been found whose timer has not expired + * we need not look any further down the list. + */ +static void prvCheckDelayedList( void ); + +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, unsigned portBASE_TYPE uxPriority, unsigned portBASE_TYPE uxIndex ) +{ +signed portBASE_TYPE xReturn; +corCRCB *pxCoRoutine; + + /* Allocate the memory that will store the co-routine control block. */ + pxCoRoutine = ( corCRCB * ) pvPortMalloc( sizeof( corCRCB ) ); + if( pxCoRoutine ) + { + /* If pxCurrentCoRoutine is NULL then this is the first co-routine to + be created and the co-routine data structures need initialising. */ + if( pxCurrentCoRoutine == NULL ) + { + pxCurrentCoRoutine = pxCoRoutine; + prvInitialiseCoRoutineLists(); + } + + /* Check the priority is within limits. */ + if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES ) + { + uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1; + } + + /* Fill out the co-routine control block from the function parameters. */ + pxCoRoutine->uxState = corINITIAL_STATE; + pxCoRoutine->uxPriority = uxPriority; + pxCoRoutine->uxIndex = uxIndex; + pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode; + + /* Initialise all the other co-routine control block parameters. */ + vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) ); + vListInitialiseItem( &( pxCoRoutine->xEventListItem ) ); + + /* Set the co-routine control block as a link back from the xListItem. + This is so we can get back to the containing CRCB from a generic item + in a list. */ + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine ); + listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) uxPriority ); + + /* Now the co-routine has been initialised it can be added to the ready + list at the correct priority. */ + prvAddCoRoutineToReadyQueue( pxCoRoutine ); + + xReturn = pdPASS; + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vCoRoutineAddToDelayedList( portTickType xTicksToDelay, xList *pxEventList ) +{ +portTickType xTimeToWake; + + /* Calculate the time to wake - this may overflow but this is + not a problem. */ + xTimeToWake = xCoRoutineTickCount + xTicksToDelay; + + /* We must remove ourselves from the ready list before adding + ourselves to the blocked list as the same list item is used for + both lists. */ + ( void ) uxListRemove( ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake ); + + if( xTimeToWake < xCoRoutineTickCount ) + { + /* Wake time has overflowed. Place this item in the + overflow list. */ + vListInsert( ( xList * ) pxOverflowDelayedCoRoutineList, ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + else + { + /* The wake time has not overflowed, so we can use the + current block list. */ + vListInsert( ( xList * ) pxDelayedCoRoutineList, ( xListItem * ) &( pxCurrentCoRoutine->xGenericListItem ) ); + } + + if( pxEventList ) + { + /* Also add the co-routine to an event list. If this is done then the + function must be called with interrupts disabled. */ + vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) ); + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckPendingReadyList( void ) +{ + /* Are there any co-routines waiting to get moved to the ready list? These + are co-routines that have been readied by an ISR. The ISR cannot access + the ready lists itself. */ + while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE ) + { + corCRCB *pxUnblockedCRCB; + + /* The pending ready list can be accessed by an ISR. */ + portDISABLE_INTERRUPTS(); + { + pxUnblockedCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( (&xPendingReadyCoRoutineList) ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + } + portENABLE_INTERRUPTS(); + + ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) ); + prvAddCoRoutineToReadyQueue( pxUnblockedCRCB ); + } +} +/*-----------------------------------------------------------*/ + +static void prvCheckDelayedList( void ) +{ +corCRCB *pxCRCB; + + xPassedTicks = xTaskGetTickCount() - xLastTickCount; + while( xPassedTicks ) + { + xCoRoutineTickCount++; + xPassedTicks--; + + /* If the tick count has overflowed we need to swap the ready lists. */ + if( xCoRoutineTickCount == 0 ) + { + xList * pxTemp; + + /* Tick count has overflowed so we need to swap the delay lists. If there are + any items in pxDelayedCoRoutineList here then there is an error! */ + pxTemp = pxDelayedCoRoutineList; + pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList; + pxOverflowDelayedCoRoutineList = pxTemp; + } + + /* See if this tick has made a timeout expire. */ + while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE ) + { + pxCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList ); + + if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) ) + { + /* Timeout not yet expired. */ + break; + } + + portDISABLE_INTERRUPTS(); + { + /* The event could have occurred just before this critical + section. If this is the case then the generic list item will + have been moved to the pending ready list and the following + line is still valid. Also the pvContainer parameter will have + been set to NULL so the following lines are also valid. */ + uxListRemove( &( pxCRCB->xGenericListItem ) ); + + /* Is the co-routine waiting on an event also? */ + if( pxCRCB->xEventListItem.pvContainer ) + { + ( void ) uxListRemove( &( pxCRCB->xEventListItem ) ); + } + } + portENABLE_INTERRUPTS(); + + prvAddCoRoutineToReadyQueue( pxCRCB ); + } + } + + xLastTickCount = xCoRoutineTickCount; +} +/*-----------------------------------------------------------*/ + +void vCoRoutineSchedule( void ) +{ + /* See if any co-routines readied by events need moving to the ready lists. */ + prvCheckPendingReadyList(); + + /* See if any delayed co-routines have timed out. */ + prvCheckDelayedList(); + + /* Find the highest priority queue that contains ready co-routines. */ + while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) ) + { + if( uxTopCoRoutineReadyPriority == 0 ) + { + /* No more co-routines to check. */ + return; + } + --uxTopCoRoutineReadyPriority; + } + + /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines + of the same priority get an equal share of the processor time. */ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ); + + /* Call the co-routine. */ + ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex ); + + return; +} +/*-----------------------------------------------------------*/ + +static void prvInitialiseCoRoutineLists( void ) +{ +unsigned portBASE_TYPE uxPriority; + + for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ ) + { + vListInitialise( ( xList * ) &( pxReadyCoRoutineLists[ uxPriority ] ) ); + } + + vListInitialise( ( xList * ) &xDelayedCoRoutineList1 ); + vListInitialise( ( xList * ) &xDelayedCoRoutineList2 ); + vListInitialise( ( xList * ) &xPendingReadyCoRoutineList ); + + /* Start with pxDelayedCoRoutineList using list1 and the + pxOverflowDelayedCoRoutineList using list2. */ + pxDelayedCoRoutineList = &xDelayedCoRoutineList1; + pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xCoRoutineRemoveFromEventList( const xList *pxEventList ) +{ +corCRCB *pxUnblockedCRCB; +signed portBASE_TYPE xReturn; + + /* This function is called from within an interrupt. It can only access + event lists and the pending ready list. This function assumes that a + check has already been made to ensure pxEventList is not empty. */ + pxUnblockedCRCB = ( corCRCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) ); + vListInsertEnd( ( xList * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) ); + + if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} + diff --git a/third_party/FreeRTOS/Source/include/FreeRTOS.h b/third_party/FreeRTOS/Source/include/FreeRTOS.h new file mode 100644 index 0000000..5956500 --- /dev/null +++ b/third_party/FreeRTOS/Source/include/FreeRTOS.h @@ -0,0 +1,621 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef INC_FREERTOS_H +#define INC_FREERTOS_H + + +/* + * Include the generic headers required for the FreeRTOS port being used. + */ +#include + +/* Basic FreeRTOS definitions. */ +#include "projdefs.h" + +/* Application specific configuration options. */ +#include "FreeRTOSConfig.h" + +/* configUSE_PORT_OPTIMISED_TASK_SELECTION must be defined before portable.h +is included as it is used by the port layer. */ +#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION + #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#endif + +/* Definitions specific to the port being used. */ +#include "portable.h" + + +/* Defines the prototype to which the application task hook function must +conform. */ +typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * ); + + + + + +/* + * Check all the required application specific macros have been defined. + * These macros are application specific and (as downloaded) are defined + * within FreeRTOSConfig.h. + */ + +#ifndef configUSE_PREEMPTION + #error Missing definition: configUSE_PREEMPTION should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_IDLE_HOOK + #error Missing definition: configUSE_IDLE_HOOK should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_TICK_HOOK + #error Missing definition: configUSE_TICK_HOOK should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_CO_ROUTINES + #error Missing definition: configUSE_CO_ROUTINES should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskPrioritySet + #error Missing definition: INCLUDE_vTaskPrioritySet should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_uxTaskPriorityGet + #error Missing definition: INCLUDE_uxTaskPriorityGet should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskDelete + #error Missing definition: INCLUDE_vTaskDelete should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskSuspend + #error Missing definition: INCLUDE_vTaskSuspend should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskDelayUntil + #error Missing definition: INCLUDE_vTaskDelayUntil should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_vTaskDelay + #error Missing definition: INCLUDE_vTaskDelay should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef configUSE_16_BIT_TICKS + #error Missing definition: configUSE_16_BIT_TICKS should be defined in FreeRTOSConfig.h as either 1 or 0. See the Configuration section of the FreeRTOS API documentation for details. +#endif + +#ifndef INCLUDE_xTaskGetIdleTaskHandle + #define INCLUDE_xTaskGetIdleTaskHandle 0 +#endif + +#ifndef INCLUDE_xTimerGetTimerDaemonTaskHandle + #define INCLUDE_xTimerGetTimerDaemonTaskHandle 0 +#endif + +#ifndef INCLUDE_xQueueGetMutexHolder + #define INCLUDE_xQueueGetMutexHolder 0 +#endif + +#ifndef INCLUDE_xSemaphoreGetMutexHolder + #define INCLUDE_xSemaphoreGetMutexHolder INCLUDE_xQueueGetMutexHolder +#endif + +#ifndef INCLUDE_pcTaskGetTaskName + #define INCLUDE_pcTaskGetTaskName 0 +#endif + +#ifndef configUSE_APPLICATION_TASK_TAG + #define configUSE_APPLICATION_TASK_TAG 0 +#endif + +#ifndef INCLUDE_uxTaskGetStackHighWaterMark + #define INCLUDE_uxTaskGetStackHighWaterMark 0 +#endif + +#ifndef INCLUDE_eTaskGetState + #define INCLUDE_eTaskGetState 0 +#endif + +#ifndef configUSE_RECURSIVE_MUTEXES + #define configUSE_RECURSIVE_MUTEXES 0 +#endif + +#ifndef configUSE_MUTEXES + #define configUSE_MUTEXES 0 +#endif + +#ifndef configUSE_TIMERS + #define configUSE_TIMERS 0 +#endif + +#ifndef configUSE_COUNTING_SEMAPHORES + #define configUSE_COUNTING_SEMAPHORES 0 +#endif + +#ifndef configUSE_ALTERNATIVE_API + #define configUSE_ALTERNATIVE_API 0 +#endif + +#ifndef portCRITICAL_NESTING_IN_TCB + #define portCRITICAL_NESTING_IN_TCB 0 +#endif + +#ifndef configMAX_TASK_NAME_LEN + #define configMAX_TASK_NAME_LEN 16 +#endif + +#ifndef configIDLE_SHOULD_YIELD + #define configIDLE_SHOULD_YIELD 1 +#endif + +#if configMAX_TASK_NAME_LEN < 1 + #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h +#endif + +#ifndef INCLUDE_xTaskResumeFromISR + #define INCLUDE_xTaskResumeFromISR 1 +#endif + +#ifndef configASSERT + #define configASSERT( x ) + #define configASSERT_DEFINED 0 +#else + #define configASSERT_DEFINED 1 +#endif + +/* The timers module relies on xTaskGetSchedulerState(). */ +#if configUSE_TIMERS == 1 + + #ifndef configTIMER_TASK_PRIORITY + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined. + #endif /* configTIMER_TASK_PRIORITY */ + + #ifndef configTIMER_QUEUE_LENGTH + #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined. + #endif /* configTIMER_QUEUE_LENGTH */ + + #ifndef configTIMER_TASK_STACK_DEPTH + #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined. + #endif /* configTIMER_TASK_STACK_DEPTH */ + +#endif /* configUSE_TIMERS */ + +#ifndef INCLUDE_xTaskGetSchedulerState + #define INCLUDE_xTaskGetSchedulerState 0 +#endif + +#ifndef INCLUDE_xTaskGetCurrentTaskHandle + #define INCLUDE_xTaskGetCurrentTaskHandle 0 +#endif + + +#ifndef portSET_INTERRUPT_MASK_FROM_ISR + #define portSET_INTERRUPT_MASK_FROM_ISR() 0 +#endif + +#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR + #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue ) ( void ) uxSavedStatusValue +#endif + +#ifndef portCLEAN_UP_TCB + #define portCLEAN_UP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef portSETUP_TCB + #define portSETUP_TCB( pxTCB ) ( void ) pxTCB +#endif + +#ifndef configQUEUE_REGISTRY_SIZE + #define configQUEUE_REGISTRY_SIZE 0U +#endif + +#if ( configQUEUE_REGISTRY_SIZE < 1 ) + #define vQueueAddToRegistry( xQueue, pcName ) + #define vQueueUnregisterQueue( xQueue ) +#endif + +#ifndef portPOINTER_SIZE_TYPE + #define portPOINTER_SIZE_TYPE unsigned long +#endif + +/* Remove any unused trace macros. */ +#ifndef traceSTART + /* Used to perform any necessary initialisation - for example, open a file + into which trace is to be written. */ + #define traceSTART() +#endif + +#ifndef traceEND + /* Use to close a trace, for example close a file into which trace has been + written. */ + #define traceEND() +#endif + +#ifndef traceTASK_SWITCHED_IN + /* Called after a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the selected task. */ + #define traceTASK_SWITCHED_IN() +#endif + +#ifndef traceINCREASE_TICK_COUNT + /* Called before stepping the tick count after waking from tickless idle + sleep. */ + #define traceINCREASE_TICK_COUNT( x ) +#endif + +#ifndef traceLOW_POWER_IDLE_BEGIN + /* Called immediately before entering tickless idle. */ + #define traceLOW_POWER_IDLE_BEGIN() +#endif + +#ifndef traceLOW_POWER_IDLE_END + /* Called when returning to the Idle task after a tickless idle. */ + #define traceLOW_POWER_IDLE_END() +#endif + +#ifndef traceTASK_SWITCHED_OUT + /* Called before a task has been selected to run. pxCurrentTCB holds a pointer + to the task control block of the task being switched out. */ + #define traceTASK_SWITCHED_OUT() +#endif + +#ifndef traceTASK_PRIORITY_INHERIT + /* Called when a task attempts to take a mutex that is already held by a + lower priority task. pxTCBOfMutexHolder is a pointer to the TCB of the task + that holds the mutex. uxInheritedPriority is the priority the mutex holder + will inherit (the priority of the task that is attempting to obtain the + muted. */ + #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority ) +#endif + +#ifndef traceTASK_PRIORITY_DISINHERIT + /* Called when a task releases a mutex, the holding of which had resulted in + the task inheriting the priority of a higher priority task. + pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the + mutex. uxOriginalPriority is the task's configured (base) priority. */ + #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_RECEIVE + /* Task is about to block because it cannot read from a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the read was attempted. pxCurrentTCB points to the TCB of the + task that attempted the read. */ + #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceBLOCKING_ON_QUEUE_SEND + /* Task is about to block because it cannot write to a + queue/mutex/semaphore. pxQueue is a pointer to the queue/mutex/semaphore + upon which the write was attempted. pxCurrentTCB points to the TCB of the + task that attempted the write. */ + #define traceBLOCKING_ON_QUEUE_SEND( pxQueue ) +#endif + +#ifndef configCHECK_FOR_STACK_OVERFLOW + #define configCHECK_FOR_STACK_OVERFLOW 0 +#endif + +/* The following event macros are embedded in the kernel API calls. */ + +#ifndef traceMOVED_TASK_TO_READY_STATE + #define traceMOVED_TASK_TO_READY_STATE( pxTCB ) +#endif + +#ifndef traceQUEUE_CREATE + #define traceQUEUE_CREATE( pxNewQueue ) +#endif + +#ifndef traceQUEUE_CREATE_FAILED + #define traceQUEUE_CREATE_FAILED( ucQueueType ) +#endif + +#ifndef traceCREATE_MUTEX + #define traceCREATE_MUTEX( pxNewQueue ) +#endif + +#ifndef traceCREATE_MUTEX_FAILED + #define traceCREATE_MUTEX_FAILED() +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE + #define traceGIVE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED + #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE + #define traceTAKE_MUTEX_RECURSIVE( pxMutex ) +#endif + +#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED + #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ) +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE + #define traceCREATE_COUNTING_SEMAPHORE() +#endif + +#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED + #define traceCREATE_COUNTING_SEMAPHORE_FAILED() +#endif + +#ifndef traceQUEUE_SEND + #define traceQUEUE_SEND( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FAILED + #define traceQUEUE_SEND_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE + #define traceQUEUE_RECEIVE( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK + #define traceQUEUE_PEEK( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR + #define traceQUEUE_PEEK_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FAILED + #define traceQUEUE_RECEIVE_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR + #define traceQUEUE_SEND_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_SEND_FROM_ISR_FAILED + #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR + #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue ) +#endif + +#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED + #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED + #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ) +#endif + +#ifndef traceQUEUE_DELETE + #define traceQUEUE_DELETE( pxQueue ) +#endif + +#ifndef traceTASK_CREATE + #define traceTASK_CREATE( pxNewTCB ) +#endif + +#ifndef traceTASK_CREATE_FAILED + #define traceTASK_CREATE_FAILED() +#endif + +#ifndef traceTASK_DELETE + #define traceTASK_DELETE( pxTaskToDelete ) +#endif + +#ifndef traceTASK_DELAY_UNTIL + #define traceTASK_DELAY_UNTIL() +#endif + +#ifndef traceTASK_DELAY + #define traceTASK_DELAY() +#endif + +#ifndef traceTASK_PRIORITY_SET + #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority ) +#endif + +#ifndef traceTASK_SUSPEND + #define traceTASK_SUSPEND( pxTaskToSuspend ) +#endif + +#ifndef traceTASK_RESUME + #define traceTASK_RESUME( pxTaskToResume ) +#endif + +#ifndef traceTASK_RESUME_FROM_ISR + #define traceTASK_RESUME_FROM_ISR( pxTaskToResume ) +#endif + +#ifndef traceTASK_INCREMENT_TICK + #define traceTASK_INCREMENT_TICK( xTickCount ) +#endif + +#ifndef traceTIMER_CREATE + #define traceTIMER_CREATE( pxNewTimer ) +#endif + +#ifndef traceTIMER_CREATE_FAILED + #define traceTIMER_CREATE_FAILED() +#endif + +#ifndef traceTIMER_COMMAND_SEND + #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn ) +#endif + +#ifndef traceTIMER_EXPIRED + #define traceTIMER_EXPIRED( pxTimer ) +#endif + +#ifndef traceTIMER_COMMAND_RECEIVED + #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue ) +#endif + +#ifndef traceMALLOC + #define traceMALLOC( pvAddress, uiSize ) +#endif + +#ifndef traceFREE + #define traceFREE( pvAddress, uiSize ) +#endif + +#ifndef configGENERATE_RUN_TIME_STATS + #define configGENERATE_RUN_TIME_STATS 0 +#endif + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined. portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base. + #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */ + + #ifndef portGET_RUN_TIME_COUNTER_VALUE + #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE + #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined. See the examples provided and the FreeRTOS web site for more information. + #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */ + #endif /* portGET_RUN_TIME_COUNTER_VALUE */ + +#endif /* configGENERATE_RUN_TIME_STATS */ + +#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS + #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() +#endif + +#ifndef configUSE_MALLOC_FAILED_HOOK + #define configUSE_MALLOC_FAILED_HOOK 0 +#endif + +#ifndef portPRIVILEGE_BIT + #define portPRIVILEGE_BIT ( ( unsigned portBASE_TYPE ) 0x00 ) +#endif + +#ifndef portYIELD_WITHIN_API + #define portYIELD_WITHIN_API portYIELD +#endif + +#ifndef pvPortMallocAligned + #define pvPortMallocAligned( x, puxStackBuffer ) ( ( ( puxStackBuffer ) == NULL ) ? ( pvPortMalloc( ( x ) ) ) : ( puxStackBuffer ) ) +#endif + +#ifndef vPortFreeAligned + #define vPortFreeAligned( pvBlockToFree ) vPortFree( pvBlockToFree ) +#endif + +#ifndef portSUPPRESS_TICKS_AND_SLEEP + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) +#endif + +#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP + #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP 2 +#endif + +#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2 + #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2 +#endif + +#ifndef configUSE_TICKLESS_IDLE + #define configUSE_TICKLESS_IDLE 0 +#endif + +#ifndef configPRE_SLEEP_PROCESSING + #define configPRE_SLEEP_PROCESSING( x ) +#endif + +#ifndef configPOST_SLEEP_PROCESSING + #define configPOST_SLEEP_PROCESSING( x ) +#endif + +#ifndef configUSE_QUEUE_SETS + #define configUSE_QUEUE_SETS 0 +#endif + +#ifndef portTASK_USES_FLOATING_POINT + #define portTASK_USES_FLOATING_POINT() +#endif + +#ifndef configUSE_TIME_SLICING + #define configUSE_TIME_SLICING 1 +#endif + +#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS + #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 +#endif + +#ifndef configUSE_NEWLIB_REENTRANT + #define configUSE_NEWLIB_REENTRANT 0 +#endif + +#ifndef configUSE_STATS_FORMATTING_FUNCTIONS + #define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#endif + +#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() +#endif + +/* For backward compatability. */ +#define eTaskStateGet eTaskGetState + +#endif /* INC_FREERTOS_H */ + diff --git a/third_party/FreeRTOS/Source/include/StackMacros.h b/third_party/FreeRTOS/Source/include/StackMacros.h new file mode 100644 index 0000000..2a72dd2 --- /dev/null +++ b/third_party/FreeRTOS/Source/include/StackMacros.h @@ -0,0 +1,180 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef STACK_MACROS_H +#define STACK_MACROS_H + +/* + * Call the stack overflow hook function if the stack of the task being swapped + * out is currently overflowed, or looks like it might have overflowed in the + * past. + * + * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check + * the current stack state only - comparing the current top of stack value to + * the stack limit. Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1 + * will also cause the last few stack bytes to be checked to ensure the value + * to which the bytes were set when the task was created have not been + * overwritten. Note this second test does not guarantee that an overflowed + * stack will always be recognised. + */ + +/*-----------------------------------------------------------*/ + +#if( configCHECK_FOR_STACK_OVERFLOW == 0 ) + + /* FreeRTOSConfig.h is not set to check for stack overflows. */ + #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 0 */ +/*-----------------------------------------------------------*/ + +#if( configCHECK_FOR_STACK_OVERFLOW == 1 ) + + /* FreeRTOSConfig.h is only set to use the first method of + overflow checking. */ + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() + +#endif +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH < 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \ + { \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack ) \ + { \ + vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW > 0 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 0 ) && ( portSTACK_GROWTH > 0 ) ) + + /* Only the current stack state is to be checked. */ + #define taskFIRST_CHECK_FOR_STACK_OVERFLOW() \ + { \ + \ + /* Is the currently saved stack pointer within the stack limit? */ \ + if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack ) \ + { \ + vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) ) + + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() \ + { \ + static const unsigned char ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pxCurrentTCB->pxStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) ) + + #define taskSECOND_CHECK_FOR_STACK_OVERFLOW() \ + { \ + char *pcEndOfStack = ( char * ) pxCurrentTCB->pxEndOfStack; \ + static const unsigned char ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, \ + tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \ + \ + \ + pcEndOfStack -= sizeof( ucExpectedStackBytes ); \ + \ + /* Has the extremity of the task stack ever been written over? */ \ + if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 ) \ + { \ + vApplicationStackOverflowHook( ( xTaskHandle ) pxCurrentTCB, pxCurrentTCB->pcTaskName ); \ + } \ + } + +#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */ +/*-----------------------------------------------------------*/ + +#endif /* STACK_MACROS_H */ + diff --git a/third_party/FreeRTOS/Source/include/croutine.h b/third_party/FreeRTOS/Source/include/croutine.h new file mode 100644 index 0000000..e42ff92 --- /dev/null +++ b/third_party/FreeRTOS/Source/include/croutine.h @@ -0,0 +1,758 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef CO_ROUTINE_H +#define CO_ROUTINE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include croutine.h" +#endif + +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Used to hide the implementation of the co-routine control block. The +control block structure however has to be included in the header due to +the macro implementation of the co-routine functionality. */ +typedef void * xCoRoutineHandle; + +/* Defines the prototype to which co-routine functions must conform. */ +typedef void (*crCOROUTINE_CODE)( xCoRoutineHandle, unsigned portBASE_TYPE ); + +typedef struct corCoRoutineControlBlock +{ + crCOROUTINE_CODE pxCoRoutineFunction; + xListItem xGenericListItem; /*< List item used to place the CRCB in ready and blocked queues. */ + xListItem xEventListItem; /*< List item used to place the CRCB in event lists. */ + unsigned portBASE_TYPE uxPriority; /*< The priority of the co-routine in relation to other co-routines. */ + unsigned portBASE_TYPE uxIndex; /*< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */ + unsigned short uxState; /*< Used internally by the co-routine implementation. */ +} corCRCB; /* Co-routine control block. Note must be identical in size down to uxPriority with tskTCB. */ + +/** + * croutine. h + *
+ portBASE_TYPE xCoRoutineCreate(
+                                 crCOROUTINE_CODE pxCoRoutineCode,
+                                 unsigned portBASE_TYPE uxPriority,
+                                 unsigned portBASE_TYPE uxIndex
+                               );
+ * + * Create a new co-routine and add it to the list of co-routines that are + * ready to run. + * + * @param pxCoRoutineCode Pointer to the co-routine function. Co-routine + * functions require special syntax - see the co-routine section of the WEB + * documentation for more information. + * + * @param uxPriority The priority with respect to other co-routines at which + * the co-routine will run. + * + * @param uxIndex Used to distinguish between different co-routines that + * execute the same function. See the example below and the co-routine section + * of the WEB documentation for further information. + * + * @return pdPASS if the co-routine was successfully created and added to a ready + * list, otherwise an error code defined with ProjDefs.h. + * + * Example usage: +
+ // Co-routine to be created.
+ void vFlashCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+ {
+ // Variables in co-routines must be declared static if they must maintain value across a blocking call.
+ // This may not be necessary for const variables.
+ static const char cLedToFlash[ 2 ] = { 5, 6 };
+ static const portTickType uxFlashRates[ 2 ] = { 200, 400 };
+
+     // Must start every co-routine with a call to crSTART();
+     crSTART( xHandle );
+
+     for( ;; )
+     {
+         // This co-routine just delays for a fixed period, then toggles
+         // an LED.  Two co-routines are created using this function, so
+         // the uxIndex parameter is used to tell the co-routine which
+         // LED to flash and how long to delay.  This assumes xQueue has
+         // already been created.
+         vParTestToggleLED( cLedToFlash[ uxIndex ] );
+         crDELAY( xHandle, uxFlashRates[ uxIndex ] );
+     }
+
+     // Must end every co-routine with a call to crEND();
+     crEND();
+ }
+
+ // Function that creates two co-routines.
+ void vOtherFunction( void )
+ {
+ unsigned char ucParameterToPass;
+ xTaskHandle xHandle;
+		
+     // Create two co-routines at priority 0.  The first is given index 0
+     // so (from the code above) toggles LED 5 every 200 ticks.  The second
+     // is given index 1 so toggles LED 6 every 400 ticks.
+     for( uxIndex = 0; uxIndex < 2; uxIndex++ )
+     {
+         xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex );
+     }
+ }
+   
+ * \defgroup xCoRoutineCreate xCoRoutineCreate + * \ingroup Tasks + */ +signed portBASE_TYPE xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, unsigned portBASE_TYPE uxPriority, unsigned portBASE_TYPE uxIndex ); + + +/** + * croutine. h + *
+ void vCoRoutineSchedule( void );
+ * + * Run a co-routine. + * + * vCoRoutineSchedule() executes the highest priority co-routine that is able + * to run. The co-routine will execute until it either blocks, yields or is + * preempted by a task. Co-routines execute cooperatively so one + * co-routine cannot be preempted by another, but can be preempted by a task. + * + * If an application comprises of both tasks and co-routines then + * vCoRoutineSchedule should be called from the idle task (in an idle task + * hook). + * + * Example usage: +
+ // This idle task hook will schedule a co-routine each time it is called.
+ // The rest of the idle task will execute between co-routine calls.
+ void vApplicationIdleHook( void )
+ {
+	vCoRoutineSchedule();
+ }
+
+ // Alternatively, if you do not require any other part of the idle task to
+ // execute, the idle task hook can call vCoRoutineScheduler() within an
+ // infinite loop.
+ void vApplicationIdleHook( void )
+ {
+    for( ;; )
+    {
+        vCoRoutineSchedule();
+    }
+ }
+ 
+ * \defgroup vCoRoutineSchedule vCoRoutineSchedule + * \ingroup Tasks + */ +void vCoRoutineSchedule( void ); + +/** + * croutine. h + *
+ crSTART( xCoRoutineHandle xHandle );
+ * + * This macro MUST always be called at the start of a co-routine function. + * + * Example usage: +
+ // Co-routine to be created.
+ void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+ {
+ // Variables in co-routines must be declared static if they must maintain value across a blocking call.
+ static long ulAVariable;
+
+     // Must start every co-routine with a call to crSTART();
+     crSTART( xHandle );
+
+     for( ;; )
+     {
+          // Co-routine functionality goes here.
+     }
+
+     // Must end every co-routine with a call to crEND();
+     crEND();
+ }
+ * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crSTART( pxCRCB ) switch( ( ( corCRCB * )( pxCRCB ) )->uxState ) { case 0: + +/** + * croutine. h + *
+ crEND();
+ * + * This macro MUST always be called at the end of a co-routine function. + * + * Example usage: +
+ // Co-routine to be created.
+ void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+ {
+ // Variables in co-routines must be declared static if they must maintain value across a blocking call.
+ static long ulAVariable;
+
+     // Must start every co-routine with a call to crSTART();
+     crSTART( xHandle );
+
+     for( ;; )
+     {
+          // Co-routine functionality goes here.
+     }
+
+     // Must end every co-routine with a call to crEND();
+     crEND();
+ }
+ * \defgroup crSTART crSTART + * \ingroup Tasks + */ +#define crEND() } + +/* + * These macros are intended for internal use by the co-routine implementation + * only. The macros should not be used directly by application writers. + */ +#define crSET_STATE0( xHandle ) ( ( corCRCB * )( xHandle ) )->uxState = (__LINE__ * 2); return; case (__LINE__ * 2): +#define crSET_STATE1( xHandle ) ( ( corCRCB * )( xHandle ) )->uxState = ((__LINE__ * 2)+1); return; case ((__LINE__ * 2)+1): + +/** + * croutine. h + *
+ crDELAY( xCoRoutineHandle xHandle, portTickType xTicksToDelay );
+ * + * Delay a co-routine for a fixed period of time. + * + * crDELAY can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * @param xHandle The handle of the co-routine to delay. This is the xHandle + * parameter of the co-routine function. + * + * @param xTickToDelay The number of ticks that the co-routine should delay + * for. The actual amount of time this equates to is defined by + * configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant portTICK_RATE_MS + * can be used to convert ticks to milliseconds. + * + * Example usage: +
+ // Co-routine to be created.
+ void vACoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+ {
+ // Variables in co-routines must be declared static if they must maintain value across a blocking call.
+ // This may not be necessary for const variables.
+ // We are to delay for 200ms.
+ static const xTickType xDelayTime = 200 / portTICK_RATE_MS;
+
+     // Must start every co-routine with a call to crSTART();
+     crSTART( xHandle );
+
+     for( ;; )
+     {
+        // Delay for 200ms.
+        crDELAY( xHandle, xDelayTime );
+
+        // Do something here.
+     }
+
+     // Must end every co-routine with a call to crEND();
+     crEND();
+ }
+ * \defgroup crDELAY crDELAY + * \ingroup Tasks + */ +#define crDELAY( xHandle, xTicksToDelay ) \ + if( ( xTicksToDelay ) > 0 ) \ + { \ + vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \ + } \ + crSET_STATE0( ( xHandle ) ); + +/** + *
+ crQUEUE_SEND(
+                  xCoRoutineHandle xHandle,
+                  xQueueHandle pxQueue,
+                  void *pvItemToQueue,
+                  portTickType xTicksToWait,
+                  portBASE_TYPE *pxResult
+             )
+ * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_SEND can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue on which the data will be posted. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvItemToQueue A pointer to the data being posted onto the queue. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied from pvItemToQueue into the queue + * itself. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for space to become available on the queue, should space not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_RATE_MS can be used to convert ticks to milliseconds (see example + * below). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully posted onto the queue, otherwise it will be set to an + * error defined within ProjDefs.h. + * + * Example usage: +
+ // Co-routine function that blocks for a fixed period then posts a number onto
+ // a queue.
+ static void prvCoRoutineFlashTask( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+ {
+ // Variables in co-routines must be declared static if they must maintain value across a blocking call.
+ static portBASE_TYPE xNumberToPost = 0;
+ static portBASE_TYPE xResult;
+
+    // Co-routines must begin with a call to crSTART().
+    crSTART( xHandle );
+
+    for( ;; )
+    {
+        // This assumes the queue has already been created.
+        crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult );
+
+        if( xResult != pdPASS )
+        {
+            // The message was not posted!
+        }
+
+        // Increment the number to be posted onto the queue.
+        xNumberToPost++;
+
+        // Delay for 100 ticks.
+        crDELAY( xHandle, 100 );
+    }
+
+    // Co-routines must end with a call to crEND().
+    crEND();
+ }
+ * \defgroup crQUEUE_SEND crQUEUE_SEND + * \ingroup Tasks + */ +#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult ) \ +{ \ + *( pxResult ) = xQueueCRSend( ( pxQueue) , ( pvItemToQueue) , ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 ); \ + } \ + if( *pxResult == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *pxResult = pdPASS; \ + } \ +} + +/** + * croutine. h + *
+  crQUEUE_RECEIVE(
+                     xCoRoutineHandle xHandle,
+                     xQueueHandle pxQueue,
+                     void *pvBuffer,
+                     portTickType xTicksToWait,
+                     portBASE_TYPE *pxResult
+                 )
+ * + * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine + * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks. + * + * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas + * xQueueSend() and xQueueReceive() can only be used from tasks. + * + * crQUEUE_RECEIVE can only be called from the co-routine function itself - not + * from within a function called by the co-routine function. This is because + * co-routines do not maintain their own stack. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xHandle The handle of the calling co-routine. This is the xHandle + * parameter of the co-routine function. + * + * @param pxQueue The handle of the queue from which the data will be received. + * The handle is obtained as the return value when the queue is created using + * the xQueueCreate() API function. + * + * @param pvBuffer The buffer into which the received item is to be copied. + * The number of bytes of each queued item is specified when the queue is + * created. This number of bytes is copied into pvBuffer. + * + * @param xTickToDelay The number of ticks that the co-routine should block + * to wait for data to become available from the queue, should data not be + * available immediately. The actual amount of time this equates to is defined + * by configTICK_RATE_HZ (set in FreeRTOSConfig.h). The constant + * portTICK_RATE_MS can be used to convert ticks to milliseconds (see the + * crQUEUE_SEND example). + * + * @param pxResult The variable pointed to by pxResult will be set to pdPASS if + * data was successfully retrieved from the queue, otherwise it will be set to + * an error code as defined within ProjDefs.h. + * + * Example usage: +
+ // A co-routine receives the number of an LED to flash from a queue.  It
+ // blocks on the queue until the number is received.
+ static void prvCoRoutineFlashWorkTask( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+ {
+ // Variables in co-routines must be declared static if they must maintain value across a blocking call.
+ static portBASE_TYPE xResult;
+ static unsigned portBASE_TYPE uxLEDToFlash;
+
+    // All co-routines must start with a call to crSTART().
+    crSTART( xHandle );
+
+    for( ;; )
+    {
+        // Wait for data to become available on the queue.
+        crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
+
+        if( xResult == pdPASS )
+        {
+            // We received the LED to flash - flash it!
+            vParTestToggleLED( uxLEDToFlash );
+        }
+    }
+
+    crEND();
+ }
+ * \defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult ) \ +{ \ + *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), ( xTicksToWait ) ); \ + if( *( pxResult ) == errQUEUE_BLOCKED ) \ + { \ + crSET_STATE0( ( xHandle ) ); \ + *( pxResult ) = xQueueCRReceive( ( pxQueue) , ( pvBuffer ), 0 ); \ + } \ + if( *( pxResult ) == errQUEUE_YIELD ) \ + { \ + crSET_STATE1( ( xHandle ) ); \ + *( pxResult ) = pdPASS; \ + } \ +} + +/** + * croutine. h + *
+  crQUEUE_SEND_FROM_ISR(
+                            xQueueHandle pxQueue,
+                            void *pvItemToQueue,
+                            portBASE_TYPE xCoRoutinePreviouslyWoken
+                       )
+ * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue + * that is being used from within a co-routine. + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto + * the same queue multiple times from a single interrupt. The first call + * should always pass in pdFALSE. Subsequent calls should pass in + * the value returned from the previous call. + * + * @return pdTRUE if a co-routine was woken by posting onto the queue. This is + * used by the ISR to determine if a context switch may be required following + * the ISR. + * + * Example usage: +
+ // A co-routine that blocks on a queue waiting for characters to be received.
+ static void vReceivingCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+ {
+ char cRxedChar;
+ portBASE_TYPE xResult;
+
+     // All co-routines must start with a call to crSTART().
+     crSTART( xHandle );
+
+     for( ;; )
+     {
+         // Wait for data to become available on the queue.  This assumes the
+         // queue xCommsRxQueue has already been created!
+         crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );
+
+         // Was a character received?
+         if( xResult == pdPASS )
+         {
+             // Process the character here.
+         }
+     }
+
+     // All co-routines must end with a call to crEND().
+     crEND();
+ }
+
+ // An ISR that uses a queue to send characters received on a serial port to
+ // a co-routine.
+ void vUART_ISR( void )
+ {
+ char cRxedChar;
+ portBASE_TYPE xCRWokenByPost = pdFALSE;
+
+     // We loop around reading characters until there are none left in the UART.
+     while( UART_RX_REG_NOT_EMPTY() )
+     {
+         // Obtain the character from the UART.
+         cRxedChar = UART_RX_REG;
+
+         // Post the character onto a queue.  xCRWokenByPost will be pdFALSE
+         // the first time around the loop.  If the post causes a co-routine
+         // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE.
+         // In this manner we can ensure that if more than one co-routine is
+         // blocked on the queue only one is woken by this ISR no matter how
+         // many characters are posted to the queue.
+         xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost );
+     }
+ }
+ * \defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) ) + + +/** + * croutine. h + *
+  crQUEUE_SEND_FROM_ISR(
+                            xQueueHandle pxQueue,
+                            void *pvBuffer,
+                            portBASE_TYPE * pxCoRoutineWoken
+                       )
+ * + * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the + * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR() + * functions used by tasks. + * + * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to + * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and + * xQueueReceiveFromISR() can only be used to pass data between a task and and + * ISR. + * + * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data + * from a queue that is being used from within a co-routine (a co-routine + * posted to the queue). + * + * See the co-routine section of the WEB documentation for information on + * passing data between tasks and co-routines and between ISR's and + * co-routines. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvBuffer A pointer to a buffer into which the received item will be + * placed. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from the queue into + * pvBuffer. + * + * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become + * available on the queue. If crQUEUE_RECEIVE_FROM_ISR causes such a + * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise + * *pxCoRoutineWoken will remain unchanged. + * + * @return pdTRUE an item was successfully received from the queue, otherwise + * pdFALSE. + * + * Example usage: +
+ // A co-routine that posts a character to a queue then blocks for a fixed
+ // period.  The character is incremented each time.
+ static void vSendingCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+ {
+ // cChar holds its value while this co-routine is blocked and must therefore
+ // be declared static.
+ static char cCharToTx = 'a';
+ portBASE_TYPE xResult;
+
+     // All co-routines must start with a call to crSTART().
+     crSTART( xHandle );
+
+     for( ;; )
+     {
+         // Send the next character to the queue.
+         crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult );
+
+         if( xResult == pdPASS )
+         {
+             // The character was successfully posted to the queue.
+         }
+		 else
+		 {
+			// Could not post the character to the queue.
+		 }
+
+         // Enable the UART Tx interrupt to cause an interrupt in this
+		 // hypothetical UART.  The interrupt will obtain the character
+		 // from the queue and send it.
+		 ENABLE_RX_INTERRUPT();
+
+		 // Increment to the next character then block for a fixed period.
+		 // cCharToTx will maintain its value across the delay as it is
+		 // declared static.
+		 cCharToTx++;
+		 if( cCharToTx > 'x' )
+		 {
+			cCharToTx = 'a';
+		 }
+		 crDELAY( 100 );
+     }
+
+     // All co-routines must end with a call to crEND().
+     crEND();
+ }
+
+ // An ISR that uses a queue to receive characters to send on a UART.
+ void vUART_ISR( void )
+ {
+ char cCharToTx;
+ portBASE_TYPE xCRWokenByPost = pdFALSE;
+
+     while( UART_TX_REG_EMPTY() )
+     {
+         // Are there any characters in the queue waiting to be sent?
+		 // xCRWokenByPost will automatically be set to pdTRUE if a co-routine
+		 // is woken by the post - ensuring that only a single co-routine is
+		 // woken no matter how many times we go around this loop.
+         if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) )
+		 {
+			 SEND_CHARACTER( cCharToTx );
+		 }
+     }
+ }
+ * \defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR + * \ingroup Tasks + */ +#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) ) + +/* + * This function is intended for internal use by the co-routine macros only. + * The macro nature of the co-routine implementation requires that the + * prototype appears here. The function should not be used by application + * writers. + * + * Removes the current co-routine from its ready list and places it in the + * appropriate delayed list. + */ +void vCoRoutineAddToDelayedList( portTickType xTicksToDelay, xList *pxEventList ); + +/* + * This function is intended for internal use by the queue implementation only. + * The function should not be used by application writers. + * + * Removes the highest priority co-routine from the event list and places it in + * the pending ready list. + */ +signed portBASE_TYPE xCoRoutineRemoveFromEventList( const xList *pxEventList ); + +#ifdef __cplusplus +} +#endif + +#endif /* CO_ROUTINE_H */ diff --git a/third_party/FreeRTOS/Source/include/list.h b/third_party/FreeRTOS/Source/include/list.h new file mode 100644 index 0000000..cc70e06 --- /dev/null +++ b/third_party/FreeRTOS/Source/include/list.h @@ -0,0 +1,379 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * This is the list implementation used by the scheduler. While it is tailored + * heavily for the schedulers needs, it is also available for use by + * application code. + * + * xLists can only store pointers to xListItems. Each xListItem contains a + * numeric value (xItemValue). Most of the time the lists are sorted in + * descending item value order. + * + * Lists are created already containing one list item. The value of this + * item is the maximum possible that can be stored, it is therefore always at + * the end of the list and acts as a marker. The list member pxHead always + * points to this marker - even though it is at the tail of the list. This + * is because the tail contains a wrap back pointer to the true head of + * the list. + * + * In addition to it's value, each list item contains a pointer to the next + * item in the list (pxNext), a pointer to the list it is in (pxContainer) + * and a pointer to back to the object that contains it. These later two + * pointers are included for efficiency of list manipulation. There is + * effectively a two way link between the object containing the list item and + * the list item itself. + * + * + * \page ListIntroduction List Implementation + * \ingroup FreeRTOSIntro + */ + + +#ifndef LIST_H +#define LIST_H + +/* + * The list structure members are modified from within interrupts, and therefore + * by rights should be declared volatile. However, they are only modified in a + * functionally atomic way (within critical sections of with the scheduler + * suspended) and are either passed by reference into a function or indexed via + * a volatile variable. Therefore, in all use cases tested so far, the volatile + * qualifier can be omitted in order to provide a moderate performance + * improvement without adversely affecting functional behaviour. The assembly + * instructions generated by the IAR, ARM and GCC compilers when the respective + * compiler's options were set for maximum optimisation has been inspected and + * deemed to be as intended. That said, as compiler technology advances, and + * especially if aggressive cross module optimisation is used (a use case that + * has not been exercised to any great extend) then it is feasible that the + * volatile qualifier will be needed for correct optimisation. It is expected + * that a compiler removing essential code because, without the volatile + * qualifier on the list structure members and with aggressive cross module + * optimisation, the compiler deemed the code unnecessary will result in + * complete and obvious failure of the scheduler. If this is ever experienced + * then the volatile qualifier can be inserted in the relevant places within the + * list structures by simply defining configLIST_VOLATILE to volatile in + * FreeRTOSConfig.h (as per the example at the bottom of this comment block). + * If configLIST_VOLATILE is not defined then the preprocessor directives below + * will simply #define configLIST_VOLATILE away completely. + * + * To use volatile list structure members then add the following line to + * FreeRTOSConfig.h (without the quotes): + * "#define configLIST_VOLATILE volatile" + */ +#ifndef configLIST_VOLATILE + #define configLIST_VOLATILE +#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */ + +#ifdef __cplusplus +extern "C" { +#endif +/* + * Definition of the only type of object that a list can contain. + */ +struct xLIST_ITEM +{ + configLIST_VOLATILE portTickType xItemValue; /*< The value being listed. In most cases this is used to sort the list in descending order. */ + struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next xListItem in the list. */ + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;/*< Pointer to the previous xListItem in the list. */ + void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */ + void * configLIST_VOLATILE pvContainer; /*< Pointer to the list in which this list item is placed (if any). */ +}; +typedef struct xLIST_ITEM xListItem; /* For some reason lint wants this as two separate definitions. */ + +struct xMINI_LIST_ITEM +{ + configLIST_VOLATILE portTickType xItemValue; + struct xLIST_ITEM * configLIST_VOLATILE pxNext; + struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; +}; +typedef struct xMINI_LIST_ITEM xMiniListItem; + +/* + * Definition of the type of queue used by the scheduler. + */ +typedef struct xLIST +{ + configLIST_VOLATILE unsigned portBASE_TYPE uxNumberOfItems; + xListItem * configLIST_VOLATILE pxIndex; /*< Used to walk through the list. Points to the last item returned by a call to pvListGetOwnerOfNextEntry (). */ + xMiniListItem xListEnd; /*< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */ +} xList; + +/* + * Access macro to set the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner ) ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) ) + +/* + * Access macro to get the owner of a list item. The owner of a list item + * is the object (usually a TCB) that contains the list item. + * + * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_OWNER( pxListItem ) ( pxListItem )->pvOwner + +/* + * Access macro to set the value of the list item. In most cases the value is + * used to sort the list in descending order. + * + * \page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listSET_LIST_ITEM_VALUE( pxListItem, xValue ) ( ( pxListItem )->xItemValue = ( xValue ) ) + +/* + * Access macro to retrieve the value of the list item. The value can + * represent anything - for example a the priority of a task, or the time at + * which a task should be unblocked. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_LIST_ITEM_VALUE( pxListItem ) ( ( pxListItem )->xItemValue ) + +/* + * Access macro the retrieve the value of the list item at the head of a given + * list. + * + * \page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE + * \ingroup LinkedList + */ +#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->xItemValue ) + +/* + * Access macro to determine if a list contains any items. The macro will + * only have the value true if the list is empty. + * + * \page listLIST_IS_EMPTY listLIST_IS_EMPTY + * \ingroup LinkedList + */ +#define listLIST_IS_EMPTY( pxList ) ( ( portBASE_TYPE ) ( ( pxList )->uxNumberOfItems == ( unsigned portBASE_TYPE ) 0 ) ) + +/* + * Access macro to return the number of items in the list. + */ +#define listCURRENT_LIST_LENGTH( pxList ) ( ( pxList )->uxNumberOfItems ) + +/* + * Access function to obtain the owner of the next entry in a list. + * + * The list member pxIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list + * and returns that entries pxOwner parameter. Using multiple calls to this + * function it is therefore possible to move through every item contained in + * a list. + * + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxList The list from which the next item owner is to be returned. + * + * \page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList ) \ +{ \ +xList * const pxConstList = ( pxList ); \ + /* Increment the index to the next item and return the item, ensuring */ \ + /* we don't return the marker used at the end of the list. */ \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \ + { \ + ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext; \ + } \ + ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner; \ +} + + +/* + * Access function to obtain the owner of the first entry in a list. Lists + * are normally sorted in ascending item value order. + * + * This function returns the pxOwner member of the first item in the list. + * The pxOwner parameter of a list item is a pointer to the object that owns + * the list item. In the scheduler this is normally a task control block. + * The pxOwner parameter effectively creates a two way link between the list + * item and its owner. + * + * @param pxList The list from which the owner of the head item is to be + * returned. + * + * \page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY + * \ingroup LinkedList + */ +#define listGET_OWNER_OF_HEAD_ENTRY( pxList ) ( (&( ( pxList )->xListEnd ))->pxNext->pvOwner ) + +/* + * Check to see if a list item is within a list. The list item maintains a + * "container" pointer that points to the list it is in. All this macro does + * is check to see if the container and the list match. + * + * @param pxList The list we want to know if the list item is within. + * @param pxListItem The list item we want to know if is in the list. + * @return pdTRUE is the list item is in the list, otherwise pdFALSE. + * pointer against + */ +#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( portBASE_TYPE ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) ) ) + +/* + * Return the list a list item is contained within (referenced from). + * + * @param pxListItem The list item being queried. + * @return A pointer to the xList object that references the pxListItem + */ +#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pvContainer ) + +/* + * This provides a crude means of knowing if a list has been initialised, as + * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise() + * function. + */ +#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY ) + +/* + * Must be called before a list is used! This initialises all the members + * of the list structure and inserts the xListEnd item into the list as a + * marker to the back of the list. + * + * @param pxList Pointer to the list being initialised. + * + * \page vListInitialise vListInitialise + * \ingroup LinkedList + */ +void vListInitialise( xList * const pxList ); + +/* + * Must be called before a list item is used. This sets the list container to + * null so the item does not think that it is already contained in a list. + * + * @param pxItem Pointer to the list item being initialised. + * + * \page vListInitialiseItem vListInitialiseItem + * \ingroup LinkedList + */ +void vListInitialiseItem( xListItem * const pxItem ); + +/* + * Insert a list item into a list. The item will be inserted into the list in + * a position determined by its item value (descending item value order). + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The item to that is to be placed in the list. + * + * \page vListInsert vListInsert + * \ingroup LinkedList + */ +void vListInsert( xList * const pxList, xListItem * const pxNewListItem ); + +/* + * Insert a list item into a list. The item will be inserted in a position + * such that it will be the last item within the list returned by multiple + * calls to listGET_OWNER_OF_NEXT_ENTRY. + * + * The list member pvIndex is used to walk through a list. Calling + * listGET_OWNER_OF_NEXT_ENTRY increments pvIndex to the next item in the list. + * Placing an item in a list using vListInsertEnd effectively places the item + * in the list position pointed to by pvIndex. This means that every other + * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before + * the pvIndex parameter again points to the item being inserted. + * + * @param pxList The list into which the item is to be inserted. + * + * @param pxNewListItem The list item to be inserted into the list. + * + * \page vListInsertEnd vListInsertEnd + * \ingroup LinkedList + */ +void vListInsertEnd( xList * const pxList, xListItem * const pxNewListItem ); + +/* + * Remove an item from a list. The list item has a pointer to the list that + * it is in, so only the list item need be passed into the function. + * + * @param uxListRemove The item to be removed. The item will remove itself from + * the list pointed to by it's pxContainer parameter. + * + * @return The number of items that remain in the list after the list item has + * been removed. + * + * \page uxListRemove uxListRemove + * \ingroup LinkedList + */ +unsigned portBASE_TYPE uxListRemove( xListItem * const pxItemToRemove ); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/third_party/FreeRTOS/Source/include/mpu_wrappers.h b/third_party/FreeRTOS/Source/include/mpu_wrappers.h new file mode 100644 index 0000000..813b96a --- /dev/null +++ b/third_party/FreeRTOS/Source/include/mpu_wrappers.h @@ -0,0 +1,153 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef MPU_WRAPPERS_H +#define MPU_WRAPPERS_H + +/* This file redefines API functions to be called through a wrapper macro, but +only for ports that are using the MPU. */ +#ifdef portUSING_MPU_WRAPPERS + + /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is + included from queue.c or task.c to prevent it from having an effect within + those files. */ + #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + + #define xTaskGenericCreate MPU_xTaskGenericCreate + #define vTaskAllocateMPURegions MPU_vTaskAllocateMPURegions + #define vTaskDelete MPU_vTaskDelete + #define vTaskDelayUntil MPU_vTaskDelayUntil + #define vTaskDelay MPU_vTaskDelay + #define uxTaskPriorityGet MPU_uxTaskPriorityGet + #define vTaskPrioritySet MPU_vTaskPrioritySet + #define eTaskGetState MPU_eTaskGetState + #define vTaskSuspend MPU_vTaskSuspend + #define xTaskIsTaskSuspended MPU_xTaskIsTaskSuspended + #define vTaskResume MPU_vTaskResume + #define vTaskSuspendAll MPU_vTaskSuspendAll + #define xTaskResumeAll MPU_xTaskResumeAll + #define xTaskGetTickCount MPU_xTaskGetTickCount + #define uxTaskGetNumberOfTasks MPU_uxTaskGetNumberOfTasks + #define vTaskList MPU_vTaskList + #define vTaskGetRunTimeStats MPU_vTaskGetRunTimeStats + #define vTaskSetApplicationTaskTag MPU_vTaskSetApplicationTaskTag + #define xTaskGetApplicationTaskTag MPU_xTaskGetApplicationTaskTag + #define xTaskCallApplicationTaskHook MPU_xTaskCallApplicationTaskHook + #define uxTaskGetStackHighWaterMark MPU_uxTaskGetStackHighWaterMark + #define xTaskGetCurrentTaskHandle MPU_xTaskGetCurrentTaskHandle + #define xTaskGetSchedulerState MPU_xTaskGetSchedulerState + #define xTaskGetIdleTaskHandle MPU_xTaskGetIdleTaskHandle + #define uxTaskGetSystemState MPU_uxTaskGetSystemState + + #define xQueueGenericCreate MPU_xQueueGenericCreate + #define xQueueCreateMutex MPU_xQueueCreateMutex + #define xQueueGiveMutexRecursive MPU_xQueueGiveMutexRecursive + #define xQueueTakeMutexRecursive MPU_xQueueTakeMutexRecursive + #define xQueueCreateCountingSemaphore MPU_xQueueCreateCountingSemaphore + #define xQueueGenericSend MPU_xQueueGenericSend + #define xQueueAltGenericSend MPU_xQueueAltGenericSend + #define xQueueAltGenericReceive MPU_xQueueAltGenericReceive + #define xQueueGenericReceive MPU_xQueueGenericReceive + #define uxQueueMessagesWaiting MPU_uxQueueMessagesWaiting + #define vQueueDelete MPU_vQueueDelete + #define xQueueGenericReset MPU_xQueueGenericReset + #define xQueueCreateSet MPU_xQueueCreateSet + #define xQueueSelectFromSet MPU_xQueueSelectFromSet + #define xQueueAddToSet MPU_xQueueAddToSet + #define xQueueRemoveFromSet MPU_xQueueRemoveFromSet + #define xQueuePeekFromISR MPU_xQueuePeekFromISR + + #define pvPortMalloc MPU_pvPortMalloc + #define vPortFree MPU_vPortFree + #define xPortGetFreeHeapSize MPU_xPortGetFreeHeapSize + #define vPortInitialiseBlocks MPU_vPortInitialiseBlocks + + #if configQUEUE_REGISTRY_SIZE > 0 + #define vQueueAddToRegistry MPU_vQueueAddToRegistry + #define vQueueUnregisterQueue MPU_vQueueUnregisterQueue + #endif + + /* Remove the privileged function macro. */ + #define PRIVILEGED_FUNCTION + + #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + + /* Ensure API functions go in the privileged execution section. */ + #define PRIVILEGED_FUNCTION __attribute__((section("privileged_functions"))) + #define PRIVILEGED_DATA __attribute__((section("privileged_data"))) + + #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */ + +#else /* portUSING_MPU_WRAPPERS */ + + #define PRIVILEGED_FUNCTION + #define PRIVILEGED_DATA + #define portUSING_MPU_WRAPPERS 0 + +#endif /* portUSING_MPU_WRAPPERS */ + + +#endif /* MPU_WRAPPERS_H */ + diff --git a/third_party/FreeRTOS/Source/include/portable.h b/third_party/FreeRTOS/Source/include/portable.h new file mode 100644 index 0000000..cb3bacb --- /dev/null +++ b/third_party/FreeRTOS/Source/include/portable.h @@ -0,0 +1,402 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Portable layer API. Each function must be defined for each port. + *----------------------------------------------------------*/ + +#ifndef PORTABLE_H +#define PORTABLE_H + +/* Include the macro file relevant to the port being used. */ + +#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT + #include "..\..\Source\portable\owatcom\16bitdos\pc\portmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT + #include "..\..\Source\portable\owatcom\16bitdos\flsh186\portmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef GCC_MEGA_AVR + #include "../portable/GCC/ATMega323/portmacro.h" +#endif + +#ifdef IAR_MEGA_AVR + #include "../portable/IAR/ATMega323/portmacro.h" +#endif + +#ifdef MPLAB_PIC24_PORT + #include "..\..\Source\portable\MPLAB\PIC24_dsPIC\portmacro.h" +#endif + +#ifdef MPLAB_DSPIC_PORT + #include "..\..\Source\portable\MPLAB\PIC24_dsPIC\portmacro.h" +#endif + +#ifdef MPLAB_PIC18F_PORT + #include "..\..\Source\portable\MPLAB\PIC18F\portmacro.h" +#endif + +#ifdef MPLAB_PIC32MX_PORT + #include "../../Source/portable/MPLAB/PIC32MX/portmacro.h" +#endif + +#ifdef _FEDPICC + #include "libFreeRTOS/Include/portmacro.h" +#endif + +#ifdef SDCC_CYGNAL + #include "../../Source/portable/SDCC/Cygnal/portmacro.h" +#endif + +#ifdef GCC_ARM7 + #include "../../Source/portable/GCC/ARM7_LPC2000/portmacro.h" +#endif + +#ifdef GCC_ARM7_ECLIPSE + #include "portmacro.h" +#endif + +#ifdef ROWLEY_LPC23xx + #include "../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h" +#endif + +#ifdef IAR_MSP430 + #include "..\..\Source\portable\IAR\MSP430\portmacro.h" +#endif + +#ifdef GCC_MSP430 + #include "../../Source/portable/GCC/MSP430F449/portmacro.h" +#endif + +#ifdef ROWLEY_MSP430 + #include "../../Source/portable/Rowley/MSP430F449/portmacro.h" +#endif + +#ifdef ARM7_LPC21xx_KEIL_RVDS + #include "..\..\Source\portable\RVDS\ARM7_LPC21xx\portmacro.h" +#endif + +#ifdef SAM7_GCC + #include "../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h" +#endif + +#ifdef SAM7_IAR + #include "..\..\Source\portable\IAR\AtmelSAM7S64\portmacro.h" +#endif + +#ifdef SAM9XE_IAR + #include "..\..\Source\portable\IAR\AtmelSAM9XE\portmacro.h" +#endif + +#ifdef LPC2000_IAR + #include "..\..\Source\portable\IAR\LPC2000\portmacro.h" +#endif + +#ifdef STR71X_IAR + #include "..\..\Source\portable\IAR\STR71x\portmacro.h" +#endif + +#ifdef STR75X_IAR + #include "..\..\Source\portable\IAR\STR75x\portmacro.h" +#endif + +#ifdef STR75X_GCC + #include "..\..\Source\portable\GCC\STR75x\portmacro.h" +#endif + +#ifdef STR91X_IAR + #include "..\..\Source\portable\IAR\STR91x\portmacro.h" +#endif + +#ifdef GCC_H8S + #include "../../Source/portable/GCC/H8S2329/portmacro.h" +#endif + +#ifdef GCC_AT91FR40008 + #include "../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h" +#endif + +#ifdef RVDS_ARMCM3_LM3S102 + #include "../../Source/portable/RVDS/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3_LM3S102 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef GCC_ARMCM3 + #include "../../Source/portable/GCC/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARM_CM3 + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef IAR_ARMCM3_LM + #include "../../Source/portable/IAR/ARM_CM3/portmacro.h" +#endif + +#ifdef HCS12_CODE_WARRIOR + #include "../../Source/portable/CodeWarrior/HCS12/portmacro.h" +#endif + +#ifdef MICROBLAZE_GCC + #include "../../Source/portable/GCC/MicroBlaze/portmacro.h" +#endif + +#ifdef TERN_EE + #include "..\..\Source\portable\Paradigm\Tern_EE\small\portmacro.h" +#endif + +#ifdef GCC_HCS12 + #include "../../Source/portable/GCC/HCS12/portmacro.h" +#endif + +#ifdef GCC_MCF5235 + #include "../../Source/portable/GCC/MCF5235/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_GCC + #include "../../../Source/portable/GCC/ColdFire_V2/portmacro.h" +#endif + +#ifdef COLDFIRE_V2_CODEWARRIOR + #include "../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h" +#endif + +#ifdef GCC_PPC405 + #include "../../Source/portable/GCC/PPC405_Xilinx/portmacro.h" +#endif + +#ifdef GCC_PPC440 + #include "../../Source/portable/GCC/PPC440_Xilinx/portmacro.h" +#endif + +#ifdef _16FX_SOFTUNE + #include "..\..\Source\portable\Softune\MB96340\portmacro.h" +#endif + +#ifdef BCC_INDUSTRIAL_PC_PORT + /* A short file name has to be used in place of the normal + FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\PC\prtmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef BCC_FLASH_LITE_186_PORT + /* A short file name has to be used in place of the normal + FreeRTOSConfig.h when using the Borland compiler. */ + #include "frconfig.h" + #include "..\portable\BCC\16BitDOS\flsh186\prtmacro.h" + typedef void ( __interrupt __far *pxISR )(); +#endif + +#ifdef __GNUC__ + #ifdef __AVR32_AVR32A__ + #include "portmacro.h" + #endif +#endif + +#ifdef __ICCAVR32__ + #ifdef __CORE__ + #if __CORE__ == __AVR32A__ + #include "portmacro.h" + #endif + #endif +#endif + +#ifdef __91467D + #include "portmacro.h" +#endif + +#ifdef __96340 + #include "portmacro.h" +#endif + + +#ifdef __IAR_V850ES_Fx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx3_L__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Jx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_V850ES_Hx2__ + #include "../../Source/portable/IAR/V850ES/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +#ifdef __IAR_78K0R_Kx3L__ + #include "../../Source/portable/IAR/78K0R/portmacro.h" +#endif + +/* Catch all to ensure portmacro.h is included in the build. Newer demos +have the path as part of the project options, rather than as relative from +the project location. If portENTER_CRITICAL() has not been defined then +portmacro.h has not yet been included - as every portmacro.h provides a +portENTER_CRITICAL() definition. Check the demo application for your demo +to find the path to the correct portmacro.h file. */ +#ifndef portENTER_CRITICAL + #include "portmacro.h" +#endif + +#if portBYTE_ALIGNMENT == 8 + #define portBYTE_ALIGNMENT_MASK ( 0x0007 ) +#endif + +#if portBYTE_ALIGNMENT == 4 + #define portBYTE_ALIGNMENT_MASK ( 0x0003 ) +#endif + +#if portBYTE_ALIGNMENT == 2 + #define portBYTE_ALIGNMENT_MASK ( 0x0001 ) +#endif + +#if portBYTE_ALIGNMENT == 1 + #define portBYTE_ALIGNMENT_MASK ( 0x0000 ) +#endif + +#ifndef portBYTE_ALIGNMENT_MASK + #error "Invalid portBYTE_ALIGNMENT definition" +#endif + +#ifndef portNUM_CONFIGURABLE_REGIONS + #define portNUM_CONFIGURABLE_REGIONS 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mpu_wrappers.h" + +/* + * Setup the stack of a new task so it is ready to be placed under the + * scheduler control. The registers have to be placed on the stack in + * the order that the port expects to find them. + * + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters, portBASE_TYPE xRunPrivileged ) PRIVILEGED_FUNCTION; +#else + portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) PRIVILEGED_FUNCTION; +#endif + +/* + * Map to the memory management routines required for the port. + */ +void *pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION; +void vPortFree( void *pv ) PRIVILEGED_FUNCTION; +void vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION; +size_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION; + +/* + * Setup the hardware ready for the scheduler to take control. This generally + * sets up a tick interrupt and sets timers for the correct tick frequency. + */ +portBASE_TYPE xPortStartScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so + * the hardware is left in its original condition after the scheduler stops + * executing. + */ +void vPortEndScheduler( void ) PRIVILEGED_FUNCTION; + +/* + * The structures and methods of manipulating the MPU are contained within the + * port layer. + * + * Fills the xMPUSettings structure with the memory region information + * contained in xRegions. + */ +#if( portUSING_MPU_WRAPPERS == 1 ) + struct xMEMORY_REGION; + void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, portSTACK_TYPE *pxBottomOfStack, unsigned short usStackDepth ) PRIVILEGED_FUNCTION; +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* PORTABLE_H */ + diff --git a/third_party/FreeRTOS/Source/include/projdefs.h b/third_party/FreeRTOS/Source/include/projdefs.h new file mode 100644 index 0000000..f292a08 --- /dev/null +++ b/third_party/FreeRTOS/Source/include/projdefs.h @@ -0,0 +1,89 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef PROJDEFS_H +#define PROJDEFS_H + +/* Defines the prototype to which task functions must conform. */ +typedef void (*pdTASK_CODE)( void * ); + +#define pdFALSE ( ( portBASE_TYPE ) 0 ) +#define pdTRUE ( ( portBASE_TYPE ) 1 ) + +#define pdPASS ( pdTRUE ) +#define pdFAIL ( pdFALSE ) +#define errQUEUE_EMPTY ( ( portBASE_TYPE ) 0 ) +#define errQUEUE_FULL ( ( portBASE_TYPE ) 0 ) + +/* Error definitions. */ +#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY ( -1 ) +#define errNO_TASK_TO_RUN ( -2 ) +#define errQUEUE_BLOCKED ( -4 ) +#define errQUEUE_YIELD ( -5 ) + +#endif /* PROJDEFS_H */ + + + diff --git a/third_party/FreeRTOS/Source/include/queue.h b/third_party/FreeRTOS/Source/include/queue.h new file mode 100644 index 0000000..6873611 --- /dev/null +++ b/third_party/FreeRTOS/Source/include/queue.h @@ -0,0 +1,1685 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef QUEUE_H +#define QUEUE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include queue.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * Type by which queues are referenced. For example, a call to xQueueCreate() + * returns an xQueueHandle variable that can then be used as a parameter to + * xQueueSend(), xQueueReceive(), etc. + */ +typedef void * xQueueHandle; + +/** + * Type by which queue sets are referenced. For example, a call to + * xQueueCreateSet() returns an xQueueSet variable that can then be used as a + * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc. + */ +typedef void * xQueueSetHandle; + +/** + * Queue sets can contain both queues and semaphores, so the + * xQueueSetMemberHandle is defined as a type to be used where a parameter or + * return value can be either an xQueueHandle or an xSemaphoreHandle. + */ +typedef void * xQueueSetMemberHandle; + +/* For internal use only. */ +#define queueSEND_TO_BACK ( ( portBASE_TYPE ) 0 ) +#define queueSEND_TO_FRONT ( ( portBASE_TYPE ) 1 ) +#define queueOVERWRITE ( ( portBASE_TYPE ) 2 ) + +/* For internal use only. These definitions *must* match those in queue.c. */ +#define queueQUEUE_TYPE_BASE ( ( unsigned char ) 0U ) +#define queueQUEUE_TYPE_SET ( ( unsigned char ) 0U ) +#define queueQUEUE_TYPE_MUTEX ( ( unsigned char ) 1U ) +#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( unsigned char ) 2U ) +#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( unsigned char ) 3U ) +#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( unsigned char ) 4U ) + +/** + * queue. h + *
+ xQueueHandle xQueueCreate(
+							  unsigned portBASE_TYPE uxQueueLength,
+							  unsigned portBASE_TYPE uxItemSize
+						  );
+ * 
+ * + * Creates a new queue instance. This allocates the storage required by the + * new queue and returns a handle for the queue. + * + * @param uxQueueLength The maximum number of items that the queue can contain. + * + * @param uxItemSize The number of bytes each item in the queue will require. + * Items are queued by copy, not by reference, so this is the number of bytes + * that will be copied for each posted item. Each item on the queue must be + * the same size. + * + * @return If the queue is successfully create then a handle to the newly + * created queue is returned. If the queue cannot be created then 0 is + * returned. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ };
+
+ void vATask( void *pvParameters )
+ {
+ xQueueHandle xQueue1, xQueue2;
+
+	// Create a queue capable of containing 10 unsigned long values.
+	xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );
+	if( xQueue1 == 0 )
+	{
+		// Queue was not created and must not be used.
+	}
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
+	if( xQueue2 == 0 )
+	{
+		// Queue was not created and must not be used.
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueCreate xQueueCreate + * \ingroup QueueManagement + */ +#define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( uxQueueLength, uxItemSize, queueQUEUE_TYPE_BASE ) + +/** + * queue. h + *
+ portBASE_TYPE xQueueSendToToFront(
+								   xQueueHandle	xQueue,
+								   const void	*	pvItemToQueue,
+								   portTickType	xTicksToWait
+							   );
+ * 
+ * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the front of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ unsigned long ulVar = 10UL;
+
+ void vATask( void *pvParameters )
+ {
+ xQueueHandle xQueue1, xQueue2;
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 unsigned long values.
+	xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
+
+	// ...
+
+	if( xQueue1 != 0 )
+	{
+		// Send an unsigned long.  Wait for 10 ticks for space to become
+		// available if necessary.
+		if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS )
+		{
+			// Failed to post the message, even after 10 ticks.
+		}
+	}
+
+	if( xQueue2 != 0 )
+	{
+		// Send a pointer to a struct AMessage object.  Don't block if the
+		// queue is already full.
+		pxMessage = & xMessage;
+		xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 );
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) + +/** + * queue. h + *
+ portBASE_TYPE xQueueSendToBack(
+								   xQueueHandle	xQueue,
+								   const	void	*	pvItemToQueue,
+								   portTickType	xTicksToWait
+							   );
+ * 
+ * + * This is a macro that calls xQueueGenericSend(). + * + * Post an item to the back of a queue. The item is queued by copy, not by + * reference. This function must not be called from an interrupt service + * routine. See xQueueSendFromISR () for an alternative which may be used + * in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the queue + * is full. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ unsigned long ulVar = 10UL;
+
+ void vATask( void *pvParameters )
+ {
+ xQueueHandle xQueue1, xQueue2;
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 unsigned long values.
+	xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
+
+	// ...
+
+	if( xQueue1 != 0 )
+	{
+		// Send an unsigned long.  Wait for 10 ticks for space to become
+		// available if necessary.
+		if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS )
+		{
+			// Failed to post the message, even after 10 ticks.
+		}
+	}
+
+	if( xQueue2 != 0 )
+	{
+		// Send a pointer to a struct AMessage object.  Don't block if the
+		// queue is already full.
+		pxMessage = & xMessage;
+		xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 );
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + *
+ portBASE_TYPE xQueueSend(
+							  xQueueHandle xQueue,
+							  const void * pvItemToQueue,
+							  portTickType xTicksToWait
+						 );
+ * 
+ * + * This is a macro that calls xQueueGenericSend(). It is included for + * backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToFront() and xQueueSendToBack() macros. It is + * equivalent to xQueueSendToBack(). + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ unsigned long ulVar = 10UL;
+
+ void vATask( void *pvParameters )
+ {
+ xQueueHandle xQueue1, xQueue2;
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 unsigned long values.
+	xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
+
+	// ...
+
+	if( xQueue1 != 0 )
+	{
+		// Send an unsigned long.  Wait for 10 ticks for space to become
+		// available if necessary.
+		if( xQueueSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10 ) != pdPASS )
+		{
+			// Failed to post the message, even after 10 ticks.
+		}
+	}
+
+	if( xQueue2 != 0 )
+	{
+		// Send a pointer to a struct AMessage object.  Don't block if the
+		// queue is already full.
+		pxMessage = & xMessage;
+		xQueueSend( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0 );
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) + +/** + * queue. h + *
+ portBASE_TYPE xQueueOverwrite(
+							  xQueueHandle xQueue,
+							  const void * pvItemToQueue
+						 );
+ * 
+ * + * Only for use with queues that have a length of one - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * This function must not be called from an interrupt service routine. + * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle of the queue to which the data is being sent. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and + * therefore has the same return values as xQueueSendToFront(). However, pdPASS + * is the only value that can be returned because xQueueOverwrite() will write + * to the queue even when the queue is already full. + * + * Example usage: +
+
+ void vFunction( void *pvParameters )
+ {
+ xQueueHandle xQueue;
+ unsigned long ulVarToSend, ulValReceived;
+
+	// Create a queue to hold one unsigned long value.  It is strongly
+	// recommended *not* to use xQueueOverwrite() on queues that can
+	// contain more than one value, and doing so will trigger an assertion
+	// if configASSERT() is defined.
+	xQueue = xQueueCreate( 1, sizeof( unsigned long ) );
+
+	// Write the value 10 to the queue using xQueueOverwrite().
+	ulVarToSend = 10;
+	xQueueOverwrite( xQueue, &ulVarToSend );
+
+	// Peeking the queue should now return 10, but leave the value 10 in
+	// the queue.  A block time of zero is used as it is known that the
+	// queue holds a value.
+	ulValReceived = 0;
+	xQueuePeek( xQueue, &ulValReceived, 0 );
+
+	if( ulValReceived != 10 )
+	{
+		// Error unless the item was removed by a different task.
+	}
+
+	// The queue is still full.  Use xQueueOverwrite() to overwrite the
+	// value held in the queue with 100.
+	ulVarToSend = 100;
+	xQueueOverwrite( xQueue, &ulVarToSend );
+
+	// This time read from the queue, leaving the queue empty once more.
+	// A block time of 0 is used again.
+	xQueueReceive( xQueue, &ulValReceived, 0 );
+
+	// The value read should be the last value written, even though the
+	// queue was already full when the value was written.
+	if( ulValReceived != 100 )
+	{
+		// Error!
+	}
+
+	// ...
+}
+ 
+ * \defgroup xQueueOverwrite xQueueOverwrite + * \ingroup QueueManagement + */ +#define xQueueOverwrite( xQueue, pvItemToQueue ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE ) + + +/** + * queue. h + *
+ portBASE_TYPE xQueueGenericSend(
+									xQueueHandle xQueue,
+									const void * pvItemToQueue,
+									portTickType xTicksToWait
+									portBASE_TYPE xCopyPosition
+								);
+ * 
+ * + * It is preferred that the macros xQueueSend(), xQueueSendToFront() and + * xQueueSendToBack() are used in place of calling this function directly. + * + * Post an item on a queue. The item is queued by copy, not by reference. + * This function must not be called from an interrupt service routine. + * See xQueueSendFromISR () for an alternative which may be used in an ISR. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for space to become available on the queue, should it already + * be full. The call will return immediately if this is set to 0 and the + * queue is full. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ unsigned long ulVar = 10UL;
+
+ void vATask( void *pvParameters )
+ {
+ xQueueHandle xQueue1, xQueue2;
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 unsigned long values.
+	xQueue1 = xQueueCreate( 10, sizeof( unsigned long ) );
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );
+
+	// ...
+
+	if( xQueue1 != 0 )
+	{
+		// Send an unsigned long.  Wait for 10 ticks for space to become
+		// available if necessary.
+		if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( portTickType ) 10, queueSEND_TO_BACK ) != pdPASS )
+		{
+			// Failed to post the message, even after 10 ticks.
+		}
+	}
+
+	if( xQueue2 != 0 )
+	{
+		// Send a pointer to a struct AMessage object.  Don't block if the
+		// queue is already full.
+		pxMessage = & xMessage;
+		xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( portTickType ) 0, queueSEND_TO_BACK );
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueSend xQueueSend + * \ingroup QueueManagement + */ +signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
+ portBASE_TYPE xQueuePeek(
+							 xQueueHandle xQueue,
+							 void *pvBuffer,
+							 portTickType xTicksToWait
+						 );
+ * + * This is a macro that calls the xQueueGenericReceive() function. + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * This macro must not be used in an interrupt service routine. See + * xQueuePeekFromISR() for an alternative that can be called from an interrupt + * service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue + * is empty. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ xQueueHandle xQueue;
+
+ // Task to create a queue and post a value.
+ void vATask( void *pvParameters )
+ {
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
+	if( xQueue == 0 )
+	{
+		// Failed to create the queue.
+	}
+
+	// ...
+
+	// Send a pointer to a struct AMessage object.  Don't block if the
+	// queue is already full.
+	pxMessage = & xMessage;
+	xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 );
+
+	// ... Rest of task code.
+ }
+
+ // Task to peek the data from the queue.
+ void vADifferentTask( void *pvParameters )
+ {
+ struct AMessage *pxRxedMessage;
+
+	if( xQueue != 0 )
+	{
+		// Peek a message on the created queue.  Block for 10 ticks if a
+		// message is not immediately available.
+		if( xQueuePeek( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) )
+		{
+			// pcRxedMessage now points to the struct AMessage variable posted
+			// by vATask, but the item still remains on the queue.
+		}
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +#define xQueuePeek( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE ) + +/** + * queue. h + *
+ portBASE_TYPE xQueuePeekFromISR(
+									xQueueHandle xQueue,
+									void *pvBuffer,
+								);
+ * + * A version of xQueuePeek() that can be called from an interrupt service + * routine (ISR). + * + * Receive an item from a queue without removing the item from the queue. + * The item is received by copy so a buffer of adequate size must be + * provided. The number of bytes copied into the buffer was defined when + * the queue was created. + * + * Successfully received items remain on the queue so will be returned again + * by the next call, or a call to xQueueReceive(). + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * \defgroup xQueuePeekFromISR xQueuePeekFromISR + * \ingroup QueueManagement + */ +signed portBASE_TYPE xQueuePeekFromISR( xQueueHandle xQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
+ portBASE_TYPE xQueueReceive(
+								 xQueueHandle xQueue,
+								 void *pvBuffer,
+								 portTickType xTicksToWait
+							);
+ * + * This is a macro that calls the xQueueGenericReceive() function. + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * Successfully received items are removed from the queue. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. xQueueReceive() will return immediately if xTicksToWait + * is zero and the queue is empty. The time is defined in tick periods so the + * constant portTICK_RATE_MS should be used to convert to real time if this is + * required. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ xQueueHandle xQueue;
+
+ // Task to create a queue and post a value.
+ void vATask( void *pvParameters )
+ {
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
+	if( xQueue == 0 )
+	{
+		// Failed to create the queue.
+	}
+
+	// ...
+
+	// Send a pointer to a struct AMessage object.  Don't block if the
+	// queue is already full.
+	pxMessage = & xMessage;
+	xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 );
+
+	// ... Rest of task code.
+ }
+
+ // Task to receive from the queue.
+ void vADifferentTask( void *pvParameters )
+ {
+ struct AMessage *pxRxedMessage;
+
+	if( xQueue != 0 )
+	{
+		// Receive a message on the created queue.  Block for 10 ticks if a
+		// message is not immediately available.
+		if( xQueueReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) )
+		{
+			// pcRxedMessage now points to the struct AMessage variable posted
+			// by vATask.
+		}
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +#define xQueueReceive( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE ) + + +/** + * queue. h + *
+ portBASE_TYPE xQueueGenericReceive(
+									   xQueueHandle	xQueue,
+									   void	*pvBuffer,
+									   portTickType	xTicksToWait
+									   portBASE_TYPE	xJustPeek
+									);
+ * + * It is preferred that the macro xQueueReceive() be used rather than calling + * this function directly. + * + * Receive an item from a queue. The item is received by copy so a buffer of + * adequate size must be provided. The number of bytes copied into the buffer + * was defined when the queue was created. + * + * This function must not be used in an interrupt service routine. See + * xQueueReceiveFromISR for an alternative that can. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param xTicksToWait The maximum amount of time the task should block + * waiting for an item to receive should the queue be empty at the time + * of the call. The time is defined in tick periods so the constant + * portTICK_RATE_MS should be used to convert to real time if this is required. + * xQueueGenericReceive() will return immediately if the queue is empty and + * xTicksToWait is 0. + * + * @param xJustPeek When set to true, the item received from the queue is not + * actually removed from the queue - meaning a subsequent call to + * xQueueReceive() will return the same item. When set to false, the item + * being received from the queue is also removed from the queue. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
+ struct AMessage
+ {
+	char ucMessageID;
+	char ucData[ 20 ];
+ } xMessage;
+
+ xQueueHandle xQueue;
+
+ // Task to create a queue and post a value.
+ void vATask( void *pvParameters )
+ {
+ struct AMessage *pxMessage;
+
+	// Create a queue capable of containing 10 pointers to AMessage structures.
+	// These should be passed by pointer as they contain a lot of data.
+	xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );
+	if( xQueue == 0 )
+	{
+		// Failed to create the queue.
+	}
+
+	// ...
+
+	// Send a pointer to a struct AMessage object.  Don't block if the
+	// queue is already full.
+	pxMessage = & xMessage;
+	xQueueSend( xQueue, ( void * ) &pxMessage, ( portTickType ) 0 );
+
+	// ... Rest of task code.
+ }
+
+ // Task to receive from the queue.
+ void vADifferentTask( void *pvParameters )
+ {
+ struct AMessage *pxRxedMessage;
+
+	if( xQueue != 0 )
+	{
+		// Receive a message on the created queue.  Block for 10 ticks if a
+		// message is not immediately available.
+		if( xQueueGenericReceive( xQueue, &( pxRxedMessage ), ( portTickType ) 10 ) )
+		{
+			// pcRxedMessage now points to the struct AMessage variable posted
+			// by vATask.
+		}
+	}
+
+	// ... Rest of task code.
+ }
+ 
+ * \defgroup xQueueReceive xQueueReceive + * \ingroup QueueManagement + */ +signed portBASE_TYPE xQueueGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeek ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue );
+ * + * Return the number of messages stored in a queue. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of messages available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
unsigned portBASE_TYPE uxQueueSpacesAvailable( const xQueueHandle xQueue );
+ * + * Return the number of free spaces available in a queue. This is equal to the + * number of items that can be sent to the queue before the queue becomes full + * if no items are removed. + * + * @param xQueue A handle to the queue being queried. + * + * @return The number of spaces available in the queue. + * + * \defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting + * \ingroup QueueManagement + */ +unsigned portBASE_TYPE uxQueueSpacesAvailable( const xQueueHandle xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
void vQueueDelete( xQueueHandle xQueue );
+ * + * Delete a queue - freeing all the memory allocated for storing of items + * placed on the queue. + * + * @param xQueue A handle to the queue to be deleted. + * + * \defgroup vQueueDelete vQueueDelete + * \ingroup QueueManagement + */ +void vQueueDelete( xQueueHandle xQueue ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
+ portBASE_TYPE xQueueSendToFrontFromISR(
+										 xQueueHandle xQueue,
+										 const void *pvItemToQueue,
+										 portBASE_TYPE *pxHigherPriorityTaskWoken
+									  );
+ 
+ * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the front of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToFromFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
+ void vBufferISR( void )
+ {
+ char cIn;
+ portBASE_TYPE xHigherPrioritTaskWoken;
+
+	// We have not woken a task at the start of the ISR.
+	xHigherPriorityTaskWoken = pdFALSE;
+
+	// Loop until the buffer is empty.
+	do
+	{
+		// Obtain a byte from the buffer.
+		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
+
+		// Post the byte.
+		xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
+
+	} while( portINPUT_BYTE( BUFFER_COUNT ) );
+
+	// Now the buffer is empty we can switch context if necessary.
+	if( xHigherPriorityTaskWoken )
+	{
+		taskYIELD ();
+	}
+ }
+ 
+ * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT ) + + +/** + * queue. h + *
+ portBASE_TYPE xQueueSendToBackFromISR(
+										 xQueueHandle xQueue,
+										 const void *pvItemToQueue,
+										 portBASE_TYPE *pxHigherPriorityTaskWoken
+									  );
+ 
+ * + * This is a macro that calls xQueueGenericSendFromISR(). + * + * Post an item to the back of a queue. It is safe to use this macro from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendToBackFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
+ void vBufferISR( void )
+ {
+ char cIn;
+ portBASE_TYPE xHigherPriorityTaskWoken;
+
+	// We have not woken a task at the start of the ISR.
+	xHigherPriorityTaskWoken = pdFALSE;
+
+	// Loop until the buffer is empty.
+	do
+	{
+		// Obtain a byte from the buffer.
+		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
+
+		// Post the byte.
+		xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
+
+	} while( portINPUT_BYTE( BUFFER_COUNT ) );
+
+	// Now the buffer is empty we can switch context if necessary.
+	if( xHigherPriorityTaskWoken )
+	{
+		taskYIELD ();
+	}
+ }
+ 
+ * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + *
+ portBASE_TYPE xQueueOverwriteFromISR(
+							  xQueueHandle xQueue,
+							  const void * pvItemToQueue,
+							  portBASE_TYPE *pxHigherPriorityTaskWoken
+						 );
+ * 
+ * + * A version of xQueueOverwrite() that can be used in an interrupt service + * routine (ISR). + * + * Only for use with queues that can hold a single item - so the queue is either + * empty or full. + * + * Post an item on a queue. If the queue is already full then overwrite the + * value held in the queue. The item is queued by copy, not by reference. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueOverwriteFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueOverwriteFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return xQueueOverwriteFromISR() is a macro that calls + * xQueueGenericSendFromISR(), and therefore has the same return values as + * xQueueSendToFrontFromISR(). However, pdPASS is the only value that can be + * returned because xQueueOverwriteFromISR() will write to the queue even when + * the queue is already full. + * + * Example usage: +
+
+ xQueueHandle xQueue;
+ 
+ void vFunction( void *pvParameters )
+ {
+ 	// Create a queue to hold one unsigned long value.  It is strongly
+	// recommended *not* to use xQueueOverwriteFromISR() on queues that can
+	// contain more than one value, and doing so will trigger an assertion
+	// if configASSERT() is defined.
+	xQueue = xQueueCreate( 1, sizeof( unsigned long ) );
+}
+
+void vAnInterruptHandler( void )
+{
+// xHigherPriorityTaskWoken must be set to pdFALSE before it is used.
+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+unsigned long ulVarToSend, ulValReceived;
+
+	// Write the value 10 to the queue using xQueueOverwriteFromISR().
+	ulVarToSend = 10;
+	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
+
+	// The queue is full, but calling xQueueOverwriteFromISR() again will still
+	// pass because the value held in the queue will be overwritten with the
+	// new value.
+	ulVarToSend = 100;
+	xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );
+
+	// Reading from the queue will now return 100.
+
+	// ...
+	
+	if( xHigherPrioritytaskWoken == pdTRUE )
+	{
+		// Writing to the queue caused a task to unblock and the unblocked task
+		// has a priority higher than or equal to the priority of the currently
+		// executing task (the task this interrupt interrupted).  Perform a context
+		// switch so this interrupt returns directly to the unblocked task.
+		portYIELD_FROM_ISR(); // or portEND_SWITCHING_ISR() depending on the port.
+	}
+}
+ 
+ * \defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR + * \ingroup QueueManagement + */ +#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE ) + +/** + * queue. h + *
+ portBASE_TYPE xQueueSendFromISR(
+									 xQueueHandle xQueue,
+									 const void *pvItemToQueue,
+									 portBASE_TYPE *pxHigherPriorityTaskWoken
+								);
+ 
+ * + * This is a macro that calls xQueueGenericSendFromISR(). It is included + * for backward compatibility with versions of FreeRTOS.org that did not + * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR() + * macros. + * + * Post an item to the back of a queue. It is safe to use this function from + * within an interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
+ void vBufferISR( void )
+ {
+ char cIn;
+ portBASE_TYPE xHigherPriorityTaskWoken;
+
+	// We have not woken a task at the start of the ISR.
+	xHigherPriorityTaskWoken = pdFALSE;
+
+	// Loop until the buffer is empty.
+	do
+	{
+		// Obtain a byte from the buffer.
+		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
+
+		// Post the byte.
+		xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );
+
+	} while( portINPUT_BYTE( BUFFER_COUNT ) );
+
+	// Now the buffer is empty we can switch context if necessary.
+	if( xHigherPriorityTaskWoken )
+	{
+		// Actual macro used here is port specific.
+		portYIELD_FROM_ISR ();
+	}
+ }
+ 
+ * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * queue. h + *
+ portBASE_TYPE xQueueGenericSendFromISR(
+										   xQueueHandle		xQueue,
+										   const	void	*pvItemToQueue,
+										   portBASE_TYPE	*pxHigherPriorityTaskWoken,
+										   portBASE_TYPE	xCopyPosition
+									   );
+ 
+ * + * It is preferred that the macros xQueueSendFromISR(), + * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place + * of calling this function directly. + * + * Post an item on a queue. It is safe to use this function from within an + * interrupt service routine. + * + * Items are queued by copy not reference so it is preferable to only + * queue small items, especially when called from an ISR. In most cases + * it would be preferable to store a pointer to the item being queued. + * + * @param xQueue The handle to the queue on which the item is to be posted. + * + * @param pvItemToQueue A pointer to the item that is to be placed on the + * queue. The size of the items the queue will hold was defined when the + * queue was created, so this many bytes will be copied from pvItemToQueue + * into the queue storage area. + * + * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xQueueGenericSendFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the + * item at the back of the queue, or queueSEND_TO_FRONT to place the item + * at the front of the queue (for high priority messages). + * + * @return pdTRUE if the data was successfully sent to the queue, otherwise + * errQUEUE_FULL. + * + * Example usage for buffered IO (where the ISR can obtain more than one value + * per call): +
+ void vBufferISR( void )
+ {
+ char cIn;
+ portBASE_TYPE xHigherPriorityTaskWokenByPost;
+
+	// We have not woken a task at the start of the ISR.
+	xHigherPriorityTaskWokenByPost = pdFALSE;
+
+	// Loop until the buffer is empty.
+	do
+	{
+		// Obtain a byte from the buffer.
+		cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );
+
+		// Post each byte.
+		xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK );
+
+	} while( portINPUT_BYTE( BUFFER_COUNT ) );
+
+	// Now the buffer is empty we can switch context if necessary.  Note that the
+	// name of the yield function required is port specific.
+	if( xHigherPriorityTaskWokenByPost )
+	{
+		taskYIELD_YIELD_FROM_ISR();
+	}
+ }
+ 
+ * + * \defgroup xQueueSendFromISR xQueueSendFromISR + * \ingroup QueueManagement + */ +signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle xQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION; + +/** + * queue. h + *
+ portBASE_TYPE xQueueReceiveFromISR(
+									   xQueueHandle	xQueue,
+									   void	*pvBuffer,
+									   portBASE_TYPE *pxTaskWoken
+								   );
+ * 
+ * + * Receive an item from a queue. It is safe to use this function from within an + * interrupt service routine. + * + * @param xQueue The handle to the queue from which the item is to be + * received. + * + * @param pvBuffer Pointer to the buffer into which the received item will + * be copied. + * + * @param pxTaskWoken A task may be blocked waiting for space to become + * available on the queue. If xQueueReceiveFromISR causes such a task to + * unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will + * remain unchanged. + * + * @return pdTRUE if an item was successfully received from the queue, + * otherwise pdFALSE. + * + * Example usage: +
+
+ xQueueHandle xQueue;
+
+ // Function to create a queue and post some values.
+ void vAFunction( void *pvParameters )
+ {
+ char cValueToPost;
+ const portTickType xBlockTime = ( portTickType )0xff;
+
+	// Create a queue capable of containing 10 characters.
+	xQueue = xQueueCreate( 10, sizeof( char ) );
+	if( xQueue == 0 )
+	{
+		// Failed to create the queue.
+	}
+
+	// ...
+
+	// Post some characters that will be used within an ISR.  If the queue
+	// is full then this task will block for xBlockTime ticks.
+	cValueToPost = 'a';
+	xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
+	cValueToPost = 'b';
+	xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
+
+	// ... keep posting characters ... this task may block when the queue
+	// becomes full.
+
+	cValueToPost = 'c';
+	xQueueSend( xQueue, ( void * ) &cValueToPost, xBlockTime );
+ }
+
+ // ISR that outputs all the characters received on the queue.
+ void vISR_Routine( void )
+ {
+ portBASE_TYPE xTaskWokenByReceive = pdFALSE;
+ char cRxedChar;
+
+	while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )
+	{
+		// A character was received.  Output the character now.
+		vOutputCharacter( cRxedChar );
+
+		// If removing the character from the queue woke the task that was
+		// posting onto the queue cTaskWokenByReceive will have been set to
+		// pdTRUE.  No matter how many times this loop iterates only one
+		// task will be woken.
+	}
+
+	if( cTaskWokenByPost != ( char ) pdFALSE;
+	{
+		taskYIELD ();
+	}
+ }
+ 
+ * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR + * \ingroup QueueManagement + */ +signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle xQueue, void * const pvBuffer, signed portBASE_TYPE *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION; + +/* + * Utilities to query queues that are safe to use from an ISR. These utilities + * should be used only from witin an ISR, or within a critical section. + */ +signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle xQueue ) PRIVILEGED_FUNCTION; +signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle xQueue ) PRIVILEGED_FUNCTION; +unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle xQueue ) PRIVILEGED_FUNCTION; + + +/* + * xQueueAltGenericSend() is an alternative version of xQueueGenericSend(). + * Likewise xQueueAltGenericReceive() is an alternative version of + * xQueueGenericReceive(). + * + * The source code that implements the alternative (Alt) API is much + * simpler because it executes everything from within a critical section. + * This is the approach taken by many other RTOSes, but FreeRTOS.org has the + * preferred fully featured API too. The fully featured API has more + * complex code that takes longer to execute, but makes much less use of + * critical sections. Therefore the alternative API sacrifices interrupt + * responsiveness to gain execution speed, whereas the fully featured API + * sacrifices execution speed to ensure better interrupt responsiveness. + */ +signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ); +signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ); +#define xQueueAltSendToFront( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT ) +#define xQueueAltSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueAltGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK ) +#define xQueueAltReceive( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdFALSE ) +#define xQueueAltPeek( xQueue, pvBuffer, xTicksToWait ) xQueueAltGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE ) + +/* + * The functions defined above are for passing data to and from tasks. The + * functions below are the equivalents for passing data to and from + * co-routines. + * + * These functions are called from the co-routine macro implementation and + * should not be called directly from application code. Instead use the macro + * wrappers defined within croutine.h. + */ +signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle xQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken ); +signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle xQueue, void *pvBuffer, signed portBASE_TYPE *pxTaskWoken ); +signed portBASE_TYPE xQueueCRSend( xQueueHandle xQueue, const void *pvItemToQueue, portTickType xTicksToWait ); +signed portBASE_TYPE xQueueCRReceive( xQueueHandle xQueue, void *pvBuffer, portTickType xTicksToWait ); + +/* + * For internal use only. Use xSemaphoreCreateMutex(), + * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling + * these functions directly. + */ +xQueueHandle xQueueCreateMutex( unsigned char ucQueueType ) PRIVILEGED_FUNCTION; +xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount ) PRIVILEGED_FUNCTION; +void* xQueueGetMutexHolder( xQueueHandle xSemaphore ) PRIVILEGED_FUNCTION; + +/* + * For internal use only. Use xSemaphoreTakeMutexRecursive() or + * xSemaphoreGiveMutexRecursive() instead of calling these functions directly. + */ +portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime ) PRIVILEGED_FUNCTION; +portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex ) PRIVILEGED_FUNCTION; + +/* + * Reset a queue back to its original empty state. pdPASS is returned if the + * queue is successfully reset. pdFAIL is returned if the queue could not be + * reset because there are tasks blocked on the queue waiting to either + * receive from the queue or send to the queue. + */ +#define xQueueReset( xQueue ) xQueueGenericReset( xQueue, pdFALSE ) + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger. If you are not using a kernel + * aware debugger then this function can be ignored. + * + * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the + * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0 + * within FreeRTOSConfig.h for the registry to be available. Its value + * does not effect the number of queues, semaphores and mutexes that can be + * created - just the number that the registry can hold. + * + * @param xQueue The handle of the queue being added to the registry. This + * is the handle returned by a call to xQueueCreate(). Semaphore and mutex + * handles can also be passed in here. + * + * @param pcName The name to be associated with the handle. This is the + * name that the kernel aware debugger will display. + */ +#if configQUEUE_REGISTRY_SIZE > 0 + void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcName ) PRIVILEGED_FUNCTION; +#endif + +/* + * The registry is provided as a means for kernel aware debuggers to + * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add + * a queue, semaphore or mutex handle to the registry if you want the handle + * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to + * remove the queue, semaphore or mutex from the register. If you are not using + * a kernel aware debugger then this function can be ignored. + * + * @param xQueue The handle of the queue being removed from the registry. + */ +#if configQUEUE_REGISTRY_SIZE > 0 + void vQueueUnregisterQueue( xQueueHandle xQueue ) PRIVILEGED_FUNCTION; +#endif + +/* + * Generic version of the queue creation function, which is in turn called by + * any queue, semaphore or mutex creation function or macro. + */ +xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize, unsigned char ucQueueType ) PRIVILEGED_FUNCTION; + +/* + * Queue sets provide a mechanism to allow a task to block (pend) on a read + * operation from multiple queues or semaphores simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * A queue set must be explicitly created using a call to xQueueCreateSet() + * before it can be used. Once created, standard FreeRTOS queues and semaphores + * can be added to the set using calls to xQueueAddToSet(). + * xQueueSelectFromSet() is then used to determine which, if any, of the queues + * or semaphores contained in the set is in a state where a queue read or + * semaphore take operation would be successful. + * + * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: An additional 4 bytes of RAM is required for each space in a every + * queue added to a queue set. Therefore counting semaphores that have a high + * maximum count value should not be added to a queue set. + * + * Note 4: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param uxEventQueueLength Queue sets store events that occur on + * the queues and semaphores contained in the set. uxEventQueueLength specifies + * the maximum number of events that can be queued at once. To be absolutely + * certain that events are not lost uxEventQueueLength should be set to the + * total sum of the length of the queues added to the set, where binary + * semaphores and mutexes have a length of 1, and counting semaphores have a + * length set by their maximum count value. Examples: + * + If a queue set is to hold a queue of length 5, another queue of length 12, + * and a binary semaphore, then uxEventQueueLength should be set to + * (5 + 12 + 1), or 18. + * + If a queue set is to hold three binary semaphores then uxEventQueueLength + * should be set to (1 + 1 + 1 ), or 3. + * + If a queue set is to hold a counting semaphore that has a maximum count of + * 5, and a counting semaphore that has a maximum count of 3, then + * uxEventQueueLength should be set to (5 + 3), or 8. + * + * @return If the queue set is created successfully then a handle to the created + * queue set is returned. Otherwise NULL is returned. + */ +xQueueSetHandle xQueueCreateSet( unsigned portBASE_TYPE uxEventQueueLength ) PRIVILEGED_FUNCTION; + +/* + * Adds a queue or semaphore to a queue set that was previously created by a + * call to xQueueCreateSet(). + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being added to + * the queue set (cast to an xQueueSetMemberHandle type). + * + * @param xQueueSet The handle of the queue set to which the queue or semaphore + * is being added. + * + * @return If the queue or semaphore was successfully added to the queue set + * then pdPASS is returned. If the queue could not be successfully added to the + * queue set because it is already a member of a different queue set then pdFAIL + * is returned. + */ +portBASE_TYPE xQueueAddToSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet ) PRIVILEGED_FUNCTION; + +/* + * Removes a queue or semaphore from a queue set. A queue or semaphore can only + * be removed from a set if the queue or semaphore is empty. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * @param xQueueOrSemaphore The handle of the queue or semaphore being removed + * from the queue set (cast to an xQueueSetMemberHandle type). + * + * @param xQueueSet The handle of the queue set in which the queue or semaphore + * is included. + * + * @return If the queue or semaphore was successfully removed from the queue set + * then pdPASS is returned. If the queue was not in the queue set, or the + * queue (or semaphore) was not empty, then pdFAIL is returned. + */ +portBASE_TYPE xQueueRemoveFromSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet ) PRIVILEGED_FUNCTION; + +/* + * xQueueSelectFromSet() selects from the members of a queue set a queue or + * semaphore that either contains data (in the case of a queue) or is available + * to take (in the case of a semaphore). xQueueSelectFromSet() effectively + * allows a task to block (pend) on a read operation on all the queues and + * semaphores in a queue set simultaneously. + * + * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this + * function. + * + * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html + * for reasons why queue sets are very rarely needed in practice as there are + * simpler methods of blocking on multiple objects. + * + * Note 2: Blocking on a queue set that contains a mutex will not cause the + * mutex holder to inherit the priority of the blocked task. + * + * Note 3: A receive (in the case of a queue) or take (in the case of a + * semaphore) operation must not be performed on a member of a queue set unless + * a call to xQueueSelectFromSet() has first returned a handle to that set member. + * + * @param xQueueSet The queue set on which the task will (potentially) block. + * + * @param xBlockTimeTicks The maximum time, in ticks, that the calling task will + * remain in the Blocked state (with other tasks executing) to wait for a member + * of the queue set to be ready for a successful queue read or semaphore take + * operation. + * + * @return xQueueSelectFromSet() will return the handle of a queue (cast to + * a xQueueSetMemberHandle type) contained in the queue set that contains data, + * or the handle of a semaphore (cast to a xQueueSetMemberHandle type) contained + * in the queue set that is available, or NULL if no such queue or semaphore + * exists before before the specified block time expires. + */ +xQueueSetMemberHandle xQueueSelectFromSet( xQueueSetHandle xQueueSet, portTickType xBlockTimeTicks ) PRIVILEGED_FUNCTION; + +/* + * A version of xQueueSelectFromSet() that can be used from an ISR. + */ +xQueueSetMemberHandle xQueueSelectFromSetFromISR( xQueueSetHandle xQueueSet ) PRIVILEGED_FUNCTION; + +/* Not public API functions. */ +void vQueueWaitForMessageRestricted( xQueueHandle xQueue, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; +portBASE_TYPE xQueueGenericReset( xQueueHandle xQueue, portBASE_TYPE xNewQueue ) PRIVILEGED_FUNCTION; +void vQueueSetQueueNumber( xQueueHandle xQueue, unsigned char ucQueueNumber ) PRIVILEGED_FUNCTION; +unsigned char ucQueueGetQueueNumber( xQueueHandle xQueue ) PRIVILEGED_FUNCTION; +unsigned char ucQueueGetQueueType( xQueueHandle xQueue ) PRIVILEGED_FUNCTION; + + +#ifdef __cplusplus +} +#endif + +#endif /* QUEUE_H */ + diff --git a/third_party/FreeRTOS/Source/include/semphr.h b/third_party/FreeRTOS/Source/include/semphr.h new file mode 100644 index 0000000..cfa34c4 --- /dev/null +++ b/third_party/FreeRTOS/Source/include/semphr.h @@ -0,0 +1,840 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#ifndef SEMAPHORE_H +#define SEMAPHORE_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h" must appear in source files before "include semphr.h" +#endif + +#include "queue.h" + +typedef xQueueHandle xSemaphoreHandle; + +#define semBINARY_SEMAPHORE_QUEUE_LENGTH ( ( unsigned char ) 1U ) +#define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( unsigned char ) 0U ) +#define semGIVE_BLOCK_TIME ( ( portTickType ) 0U ) + + +/** + * semphr. h + *
vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore )
+ * + * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * Macro that implements a semaphore by using the existing queue mechanism. + * The queue length is 1 as this is a binary semaphore. The data size is 0 + * as we don't want to actually store any data - we just want to know if the + * queue is empty or full. + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @param xSemaphore Handle to the created semaphore. Should be of type xSemaphoreHandle. + * + * Example usage: +
+ xSemaphoreHandle xSemaphore = NULL;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
+    // This is a macro so pass the variable in directly.
+    vSemaphoreCreateBinary( xSemaphore );
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary + * \ingroup Semaphores + */ +#define vSemaphoreCreateBinary( xSemaphore ) \ + { \ + ( xSemaphore ) = xQueueGenericCreate( ( unsigned portBASE_TYPE ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \ + if( ( xSemaphore ) != NULL ) \ + { \ + ( void ) xSemaphoreGive( ( xSemaphore ) ); \ + } \ + } + +/** + * semphr. h + *
xSemaphoreHandle xSemaphoreCreateBinary( void )
+ * + * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this + * xSemaphoreCreateBinary() function. Note that binary semaphores created using + * the vSemaphoreCreateBinary() macro are created in a state such that the + * first call to 'take' the semaphore would pass, whereas binary semaphores + * created using xSemaphoreCreateBinary() are created in a state such that the + * the semaphore must first be 'given' before it can be 'taken'. + * + * Function that creates a semaphore by using the existing queue mechanism. + * The queue length is 1 as this is a binary semaphore. The data size is 0 + * as nothing is actually stored - all that is important is whether the queue is + * empty or full (the binary semaphore is available or not). + * + * This type of semaphore can be used for pure synchronisation between tasks or + * between an interrupt and a task. The semaphore need not be given back once + * obtained, so one task/interrupt can continuously 'give' the semaphore while + * another continuously 'takes' the semaphore. For this reason this type of + * semaphore does not use a priority inheritance mechanism. For an alternative + * that does use priority inheritance see xSemaphoreCreateMutex(). + * + * @return Handle to the created semaphore. + * + * Example usage: +
+ xSemaphoreHandle xSemaphore = NULL;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().
+    // This is a macro so pass the variable in directly.
+    xSemaphore = xSemaphoreCreateBinary();
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary + * \ingroup Semaphores + */ +#define xSemaphoreCreateBinary() xQueueGenericCreate( ( unsigned portBASE_TYPE ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ) + +/** + * semphr. h + *
xSemaphoreTake(
+ *                   xSemaphoreHandle xSemaphore,
+ *                   portTickType xBlockTime
+ *               )
+ * + * Macro to obtain a semaphore. The semaphore must have previously been + * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). + * + * @param xSemaphore A handle to the semaphore being taken - obtained when + * the semaphore was created. + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_RATE_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. A block + * time of portMAX_DELAY can be used to block indefinitely (provided + * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h). + * + * @return pdTRUE if the semaphore was obtained. pdFALSE + * if xBlockTime expired without the semaphore becoming available. + * + * Example usage: +
+ xSemaphoreHandle xSemaphore = NULL;
+
+ // A task that creates a semaphore.
+ void vATask( void * pvParameters )
+ {
+    // Create the semaphore to guard a shared resource.
+    vSemaphoreCreateBinary( xSemaphore );
+ }
+
+ // A task that uses the semaphore.
+ void vAnotherTask( void * pvParameters )
+ {
+    // ... Do other things.
+
+    if( xSemaphore != NULL )
+    {
+        // See if we can obtain the semaphore.  If the semaphore is not available
+        // wait 10 ticks to see if it becomes free.
+        if( xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) == pdTRUE )
+        {
+            // We were able to obtain the semaphore and can now access the
+            // shared resource.
+
+            // ...
+
+            // We have finished accessing the shared resource.  Release the
+            // semaphore.
+            xSemaphoreGive( xSemaphore );
+        }
+        else
+        {
+            // We could not obtain the semaphore and can therefore not access
+            // the shared resource safely.
+        }
+    }
+ }
+ 
+ * \defgroup xSemaphoreTake xSemaphoreTake + * \ingroup Semaphores + */ +#define xSemaphoreTake( xSemaphore, xBlockTime ) xQueueGenericReceive( ( xQueueHandle ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE ) + +/** + * semphr. h + * xSemaphoreTakeRecursive( + * xSemaphoreHandle xMutex, + * portTickType xBlockTime + * ) + * + * Macro to recursively obtain, or 'take', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being obtained. This is the + * handle returned by xSemaphoreCreateRecursiveMutex(); + * + * @param xBlockTime The time in ticks to wait for the semaphore to become + * available. The macro portTICK_RATE_MS can be used to convert this to a + * real time. A block time of zero can be used to poll the semaphore. If + * the task already owns the semaphore then xSemaphoreTakeRecursive() will + * return immediately no matter what the value of xBlockTime. + * + * @return pdTRUE if the semaphore was obtained. pdFALSE if xBlockTime + * expired without the semaphore becoming available. + * + * Example usage: +
+ xSemaphoreHandle xMutex = NULL;
+
+ // A task that creates a mutex.
+ void vATask( void * pvParameters )
+ {
+    // Create the mutex to guard a shared resource.
+    xMutex = xSemaphoreCreateRecursiveMutex();
+ }
+
+ // A task that uses the mutex.
+ void vAnotherTask( void * pvParameters )
+ {
+    // ... Do other things.
+
+    if( xMutex != NULL )
+    {
+        // See if we can obtain the mutex.  If the mutex is not available
+        // wait 10 ticks to see if it becomes free.
+        if( xSemaphoreTakeRecursive( xSemaphore, ( portTickType ) 10 ) == pdTRUE )
+        {
+            // We were able to obtain the mutex and can now access the
+            // shared resource.
+
+            // ...
+            // For some reason due to the nature of the code further calls to
+			// xSemaphoreTakeRecursive() are made on the same mutex.  In real
+			// code these would not be just sequential calls as this would make
+			// no sense.  Instead the calls are likely to be buried inside
+			// a more complex call structure.
+            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
+            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
+
+            // The mutex has now been 'taken' three times, so will not be
+			// available to another task until it has also been given back
+			// three times.  Again it is unlikely that real code would have
+			// these calls sequentially, but instead buried in a more complex
+			// call structure.  This is just for illustrative purposes.
+            xSemaphoreGiveRecursive( xMutex );
+			xSemaphoreGiveRecursive( xMutex );
+			xSemaphoreGiveRecursive( xMutex );
+
+			// Now the mutex can be taken by other tasks.
+        }
+        else
+        {
+            // We could not obtain the mutex and can therefore not access
+            // the shared resource safely.
+        }
+    }
+ }
+ 
+ * \defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive + * \ingroup Semaphores + */ +#define xSemaphoreTakeRecursive( xMutex, xBlockTime ) xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) ) + + +/* + * xSemaphoreAltTake() is an alternative version of xSemaphoreTake(). + * + * The source code that implements the alternative (Alt) API is much + * simpler because it executes everything from within a critical section. + * This is the approach taken by many other RTOSes, but FreeRTOS.org has the + * preferred fully featured API too. The fully featured API has more + * complex code that takes longer to execute, but makes much less use of + * critical sections. Therefore the alternative API sacrifices interrupt + * responsiveness to gain execution speed, whereas the fully featured API + * sacrifices execution speed to ensure better interrupt responsiveness. + */ +#define xSemaphoreAltTake( xSemaphore, xBlockTime ) xQueueAltGenericReceive( ( xQueueHandle ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE ) + +/** + * semphr. h + *
xSemaphoreGive( xSemaphoreHandle xSemaphore )
+ * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to vSemaphoreCreateBinary(), xSemaphoreCreateMutex() or + * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake(). + * + * This macro must not be used from an ISR. See xSemaphoreGiveFromISR () for + * an alternative which can be used from an ISR. + * + * This macro must also not be used on semaphores created using + * xSemaphoreCreateRecursiveMutex(). + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @return pdTRUE if the semaphore was released. pdFALSE if an error occurred. + * Semaphores are implemented using queues. An error can occur if there is + * no space on the queue to post a message - indicating that the + * semaphore was not first obtained correctly. + * + * Example usage: +
+ xSemaphoreHandle xSemaphore = NULL;
+
+ void vATask( void * pvParameters )
+ {
+    // Create the semaphore to guard a shared resource.
+    vSemaphoreCreateBinary( xSemaphore );
+
+    if( xSemaphore != NULL )
+    {
+        if( xSemaphoreGive( xSemaphore ) != pdTRUE )
+        {
+            // We would expect this call to fail because we cannot give
+            // a semaphore without first "taking" it!
+        }
+
+        // Obtain the semaphore - don't block if the semaphore is not
+        // immediately available.
+        if( xSemaphoreTake( xSemaphore, ( portTickType ) 0 ) )
+        {
+            // We now have the semaphore and can access the shared resource.
+
+            // ...
+
+            // We have finished accessing the shared resource so can free the
+            // semaphore.
+            if( xSemaphoreGive( xSemaphore ) != pdTRUE )
+            {
+                // We would not expect this call to fail because we must have
+                // obtained the semaphore to get here.
+            }
+        }
+    }
+ }
+ 
+ * \defgroup xSemaphoreGive xSemaphoreGive + * \ingroup Semaphores + */ +#define xSemaphoreGive( xSemaphore ) xQueueGenericSend( ( xQueueHandle ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * semphr. h + *
xSemaphoreGiveRecursive( xSemaphoreHandle xMutex )
+ * + * Macro to recursively release, or 'give', a mutex type semaphore. + * The mutex must have previously been created using a call to + * xSemaphoreCreateRecursiveMutex(); + * + * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this + * macro to be available. + * + * This macro must not be used on mutexes created using xSemaphoreCreateMutex(). + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * @param xMutex A handle to the mutex being released, or 'given'. This is the + * handle returned by xSemaphoreCreateMutex(); + * + * @return pdTRUE if the semaphore was given. + * + * Example usage: +
+ xSemaphoreHandle xMutex = NULL;
+
+ // A task that creates a mutex.
+ void vATask( void * pvParameters )
+ {
+    // Create the mutex to guard a shared resource.
+    xMutex = xSemaphoreCreateRecursiveMutex();
+ }
+
+ // A task that uses the mutex.
+ void vAnotherTask( void * pvParameters )
+ {
+    // ... Do other things.
+
+    if( xMutex != NULL )
+    {
+        // See if we can obtain the mutex.  If the mutex is not available
+        // wait 10 ticks to see if it becomes free.
+        if( xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ) == pdTRUE )
+        {
+            // We were able to obtain the mutex and can now access the
+            // shared resource.
+
+            // ...
+            // For some reason due to the nature of the code further calls to
+			// xSemaphoreTakeRecursive() are made on the same mutex.  In real
+			// code these would not be just sequential calls as this would make
+			// no sense.  Instead the calls are likely to be buried inside
+			// a more complex call structure.
+            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
+            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );
+
+            // The mutex has now been 'taken' three times, so will not be
+			// available to another task until it has also been given back
+			// three times.  Again it is unlikely that real code would have
+			// these calls sequentially, it would be more likely that the calls
+			// to xSemaphoreGiveRecursive() would be called as a call stack
+			// unwound.  This is just for demonstrative purposes.
+            xSemaphoreGiveRecursive( xMutex );
+			xSemaphoreGiveRecursive( xMutex );
+			xSemaphoreGiveRecursive( xMutex );
+
+			// Now the mutex can be taken by other tasks.
+        }
+        else
+        {
+            // We could not obtain the mutex and can therefore not access
+            // the shared resource safely.
+        }
+    }
+ }
+ 
+ * \defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive + * \ingroup Semaphores + */ +#define xSemaphoreGiveRecursive( xMutex ) xQueueGiveMutexRecursive( ( xMutex ) ) + +/* + * xSemaphoreAltGive() is an alternative version of xSemaphoreGive(). + * + * The source code that implements the alternative (Alt) API is much + * simpler because it executes everything from within a critical section. + * This is the approach taken by many other RTOSes, but FreeRTOS.org has the + * preferred fully featured API too. The fully featured API has more + * complex code that takes longer to execute, but makes much less use of + * critical sections. Therefore the alternative API sacrifices interrupt + * responsiveness to gain execution speed, whereas the fully featured API + * sacrifices execution speed to ensure better interrupt responsiveness. + */ +#define xSemaphoreAltGive( xSemaphore ) xQueueAltGenericSend( ( xQueueHandle ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK ) + +/** + * semphr. h + *
+ xSemaphoreGiveFromISR(
+                          xSemaphoreHandle xSemaphore,
+                          signed portBASE_TYPE *pxHigherPriorityTaskWoken
+                      )
+ * + * Macro to release a semaphore. The semaphore must have previously been + * created with a call to vSemaphoreCreateBinary() or xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR. + * + * @param xSemaphore A handle to the semaphore being released. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreGiveFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL. + * + * Example usage: +
+ \#define LONG_TIME 0xffff
+ \#define TICKS_TO_WAIT	10
+ xSemaphoreHandle xSemaphore = NULL;
+
+ // Repetitive task.
+ void vATask( void * pvParameters )
+ {
+    for( ;; )
+    {
+        // We want this task to run every 10 ticks of a timer.  The semaphore
+        // was created before this task was started.
+
+        // Block waiting for the semaphore to become available.
+        if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )
+        {
+            // It is time to execute.
+
+            // ...
+
+            // We have finished our task.  Return to the top of the loop where
+            // we will block on the semaphore until it is time to execute
+            // again.  Note when using the semaphore for synchronisation with an
+			// ISR in this manner there is no need to 'give' the semaphore back.
+        }
+    }
+ }
+
+ // Timer ISR
+ void vTimerISR( void * pvParameters )
+ {
+ static unsigned char ucLocalTickCount = 0;
+ static signed portBASE_TYPE xHigherPriorityTaskWoken;
+
+    // A timer tick has occurred.
+
+    // ... Do other time functions.
+
+    // Is it time for vATask () to run?
+	xHigherPriorityTaskWoken = pdFALSE;
+    ucLocalTickCount++;
+    if( ucLocalTickCount >= TICKS_TO_WAIT )
+    {
+        // Unblock the task by releasing the semaphore.
+        xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
+
+        // Reset the count so we release the semaphore again in 10 ticks time.
+        ucLocalTickCount = 0;
+    }
+
+    if( xHigherPriorityTaskWoken != pdFALSE )
+    {
+        // We can force a context switch here.  Context switching from an
+        // ISR uses port specific syntax.  Check the demo task for your port
+        // to find the syntax required.
+    }
+ }
+ 
+ * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR + * \ingroup Semaphores + */ +#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueueHandle ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK ) + +/** + * semphr. h + *
+ xSemaphoreTakeFromISR(
+                          xSemaphoreHandle xSemaphore,
+                          signed portBASE_TYPE *pxHigherPriorityTaskWoken
+                      )
+ * + * Macro to take a semaphore from an ISR. The semaphore must have + * previously been created with a call to vSemaphoreCreateBinary() or + * xSemaphoreCreateCounting(). + * + * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex()) + * must not be used with this macro. + * + * This macro can be used from an ISR, however taking a semaphore from an ISR + * is not a common operation. It is likely to only be useful when taking a + * counting semaphore when an interrupt is obtaining an object from a resource + * pool (when the semaphore count indicates the number of resources available). + * + * @param xSemaphore A handle to the semaphore being taken. This is the + * handle returned when the semaphore was created. + * + * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set + * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task + * to unblock, and the unblocked task has a priority higher than the currently + * running task. If xSemaphoreTakeFromISR() sets this value to pdTRUE then + * a context switch should be requested before the interrupt is exited. + * + * @return pdTRUE if the semaphore was successfully taken, otherwise + * pdFALSE + */ +#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken ) xQueueReceiveFromISR( ( xQueueHandle ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) ) + +/** + * semphr. h + *
xSemaphoreHandle xSemaphoreCreateMutex( void )
+ * + * Macro that implements a mutex semaphore by using the existing queue + * mechanism. + * + * Mutexes created using this macro can be accessed using the xSemaphoreTake() + * and xSemaphoreGive() macros. The xSemaphoreTakeRecursive() and + * xSemaphoreGiveRecursive() macros should not be used. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See vSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * xSemaphoreHandle. + * + * Example usage: +
+ xSemaphoreHandle xSemaphore;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
+    // This is a macro so pass the variable in directly.
+    xSemaphore = xSemaphoreCreateMutex();
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex + * \ingroup Semaphores + */ +#define xSemaphoreCreateMutex() xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ) + + +/** + * semphr. h + *
xSemaphoreHandle xSemaphoreCreateRecursiveMutex( void )
+ * + * Macro that implements a recursive mutex by using the existing queue + * mechanism. + * + * Mutexes created using this macro can be accessed using the + * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros. The + * xSemaphoreTake() and xSemaphoreGive() macros should not be used. + * + * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex + * doesn't become available again until the owner has called + * xSemaphoreGiveRecursive() for each successful 'take' request. For example, + * if a task successfully 'takes' the same mutex 5 times then the mutex will + * not be available to any other task until it has also 'given' the mutex back + * exactly five times. + * + * This type of semaphore uses a priority inheritance mechanism so a task + * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the + * semaphore it is no longer required. + * + * Mutex type semaphores cannot be used from within interrupt service routines. + * + * See vSemaphoreCreateBinary() for an alternative implementation that can be + * used for pure synchronisation (where one task or interrupt always 'gives' the + * semaphore and another always 'takes' the semaphore) and from within interrupt + * service routines. + * + * @return xSemaphore Handle to the created mutex semaphore. Should be of type + * xSemaphoreHandle. + * + * Example usage: +
+ xSemaphoreHandle xSemaphore;
+
+ void vATask( void * pvParameters )
+ {
+    // Semaphore cannot be used before a call to xSemaphoreCreateMutex().
+    // This is a macro so pass the variable in directly.
+    xSemaphore = xSemaphoreCreateRecursiveMutex();
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup vSemaphoreCreateMutex vSemaphoreCreateMutex + * \ingroup Semaphores + */ +#define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX ) + +/** + * semphr. h + *
xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount )
+ * + * Macro that creates a counting semaphore by using the existing + * queue mechanism. + * + * Counting semaphores are typically used for two things: + * + * 1) Counting events. + * + * In this usage scenario an event handler will 'give' a semaphore each time + * an event occurs (incrementing the semaphore count value), and a handler + * task will 'take' a semaphore each time it processes an event + * (decrementing the semaphore count value). The count value is therefore + * the difference between the number of events that have occurred and the + * number that have been processed. In this case it is desirable for the + * initial count value to be zero. + * + * 2) Resource management. + * + * In this usage scenario the count value indicates the number of resources + * available. To obtain control of a resource a task must first obtain a + * semaphore - decrementing the semaphore count value. When the count value + * reaches zero there are no free resources. When a task finishes with the + * resource it 'gives' the semaphore back - incrementing the semaphore count + * value. In this case it is desirable for the initial count value to be + * equal to the maximum count value, indicating that all resources are free. + * + * @param uxMaxCount The maximum count value that can be reached. When the + * semaphore reaches this value it can no longer be 'given'. + * + * @param uxInitialCount The count value assigned to the semaphore when it is + * created. + * + * @return Handle to the created semaphore. Null if the semaphore could not be + * created. + * + * Example usage: +
+ xSemaphoreHandle xSemaphore;
+
+ void vATask( void * pvParameters )
+ {
+ xSemaphoreHandle xSemaphore = NULL;
+
+    // Semaphore cannot be used before a call to xSemaphoreCreateCounting().
+    // The max value to which the semaphore can count should be 10, and the
+    // initial value assigned to the count should be 0.
+    xSemaphore = xSemaphoreCreateCounting( 10, 0 );
+
+    if( xSemaphore != NULL )
+    {
+        // The semaphore was created successfully.
+        // The semaphore can now be used.
+    }
+ }
+ 
+ * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting + * \ingroup Semaphores + */ +#define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) ) + +/** + * semphr. h + *
void vSemaphoreDelete( xSemaphoreHandle xSemaphore );
+ * + * Delete a semaphore. This function must be used with care. For example, + * do not delete a mutex type semaphore if the mutex is held by a task. + * + * @param xSemaphore A handle to the semaphore to be deleted. + * + * \defgroup vSemaphoreDelete vSemaphoreDelete + * \ingroup Semaphores + */ +#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( xQueueHandle ) ( xSemaphore ) ) + +/** + * semphr.h + *
xTaskHandle xSemaphoreGetMutexHolder( xSemaphoreHandle xMutex );
+ * + * If xMutex is indeed a mutex type semaphore, return the current mutex holder. + * If xMutex is not a mutex type semaphore, or the mutex is available (not held + * by a task), return NULL. + * + * Note: This Is is a good way of determining if the calling task is the mutex + * holder, but not a good way of determining the identity of the mutex holder as + * the holder may change between the function exiting and the returned value + * being tested. + */ +#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) ) + +#endif /* SEMAPHORE_H */ + + diff --git a/third_party/FreeRTOS/Source/include/task.h b/third_party/FreeRTOS/Source/include/task.h new file mode 100644 index 0000000..ba7b32d --- /dev/null +++ b/third_party/FreeRTOS/Source/include/task.h @@ -0,0 +1,1520 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef INC_TASK_H +#define INC_TASK_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include task.h" +#endif + +#include "list.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * MACROS AND DEFINITIONS + *----------------------------------------------------------*/ + +#define tskKERNEL_VERSION_NUMBER "V7.6.0" + +/** + * task. h + * + * Type by which tasks are referenced. For example, a call to xTaskCreate + * returns (via a pointer parameter) an xTaskHandle variable that can then + * be used as a parameter to vTaskDelete to delete the task. + * + * \defgroup xTaskHandle xTaskHandle + * \ingroup Tasks + */ +typedef void * xTaskHandle; + +/* Task states returned by eTaskGetState. */ +typedef enum +{ + eRunning = 0, /* A task is querying the state of itself, so must be running. */ + eReady, /* The task being queried is in a read or pending ready list. */ + eBlocked, /* The task being queried is in the Blocked state. */ + eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */ + eDeleted /* The task being queried has been deleted, but its TCB has not yet been freed. */ +} eTaskState; + +/* + * Used internally only. + */ +typedef struct xTIME_OUT +{ + portBASE_TYPE xOverflowCount; + portTickType xTimeOnEntering; +} xTimeOutType; + +/* + * Defines the memory ranges allocated to the task when an MPU is used. + */ +typedef struct xMEMORY_REGION +{ + void *pvBaseAddress; + unsigned long ulLengthInBytes; + unsigned long ulParameters; +} xMemoryRegion; + +/* + * Parameters required to create an MPU protected task. + */ +typedef struct xTASK_PARAMTERS +{ + pdTASK_CODE pvTaskCode; + const signed char * const pcName; + unsigned short usStackDepth; + void *pvParameters; + unsigned portBASE_TYPE uxPriority; + portSTACK_TYPE *puxStackBuffer; + xMemoryRegion xRegions[ portNUM_CONFIGURABLE_REGIONS ]; +} xTaskParameters; + +/* Used with the uxTaskGetSystemState() function to return the state of each task +in the system. */ +typedef struct xTASK_STATUS +{ + xTaskHandle xHandle; /* The handle of the task to which the rest of the information in the structure relates. */ + const signed char *pcTaskName; /* A pointer to the task's name. This value will be invalid if the task was deleted since the structure was populated! */ + unsigned portBASE_TYPE xTaskNumber; /* A number unique to the task. */ + eTaskState eCurrentState; /* The state in which the task existed when the structure was populated. */ + unsigned portBASE_TYPE uxCurrentPriority; /* The priority at which the task was running (may be inherited) when the structure was populated. */ + unsigned portBASE_TYPE uxBasePriority; /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex. Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */ + unsigned long ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock. See http://www.freertos.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ + unsigned short usStackHighWaterMark; /* The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ +} xTaskStatusType; + +/* Possible return values for eTaskConfirmSleepModeStatus(). */ +typedef enum +{ + eAbortSleep = 0, /* A task has been made ready or a context switch pended since portSUPPORESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */ + eStandardSleep, /* Enter a sleep mode that will not last any longer than the expected idle time. */ + eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */ +} eSleepModeStatus; + + +/* + * Defines the priority used by the idle task. This must not be modified. + * + * \ingroup TaskUtils + */ +#define tskIDLE_PRIORITY ( ( unsigned portBASE_TYPE ) 0U ) + +/** + * task. h + * + * Macro for forcing a context switch. + * + * \defgroup taskYIELD taskYIELD + * \ingroup SchedulerControl + */ +#define taskYIELD() portYIELD() + +/** + * task. h + * + * Macro to mark the start of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskENTER_CRITICAL taskENTER_CRITICAL + * \ingroup SchedulerControl + */ +#define taskENTER_CRITICAL() portENTER_CRITICAL() + +/** + * task. h + * + * Macro to mark the end of a critical code region. Preemptive context + * switches cannot occur when in a critical region. + * + * NOTE: This may alter the stack (depending on the portable implementation) + * so must be used with care! + * + * \defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL + * \ingroup SchedulerControl + */ +#define taskEXIT_CRITICAL() portEXIT_CRITICAL() + +/** + * task. h + * + * Macro to disable all maskable interrupts. + * + * \defgroup taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskDISABLE_INTERRUPTS() portDISABLE_INTERRUPTS() + +/** + * task. h + * + * Macro to enable microcontroller interrupts. + * + * \defgroup taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS + * \ingroup SchedulerControl + */ +#define taskENABLE_INTERRUPTS() portENABLE_INTERRUPTS() + +/* Definitions returned by xTaskGetSchedulerState(). */ +#define taskSCHEDULER_NOT_STARTED ( ( portBASE_TYPE ) 0 ) +#define taskSCHEDULER_RUNNING ( ( portBASE_TYPE ) 1 ) +#define taskSCHEDULER_SUSPENDED ( ( portBASE_TYPE ) 2 ) + +/*----------------------------------------------------------- + * TASK CREATION API + *----------------------------------------------------------*/ + +/** + * task. h + *
+ portBASE_TYPE xTaskCreate(
+							  pdTASK_CODE pvTaskCode,
+							  const char * const pcName,
+							  unsigned short usStackDepth,
+							  void *pvParameters,
+							  unsigned portBASE_TYPE uxPriority,
+							  xTaskHandle *pvCreatedTask
+						  );
+ * + * Create a new task and add it to the list of tasks that are ready to run. + * + * xTaskCreate() can only be used to create a task that has unrestricted + * access to the entire microcontroller memory map. Systems that include MPU + * support can alternatively create an MPU constrained task using + * xTaskCreateRestricted(). + * + * @param pvTaskCode Pointer to the task entry function. Tasks + * must be implemented to never return (i.e. continuous loop). + * + * @param pcName A descriptive name for the task. This is mainly used to + * facilitate debugging. Max length defined by tskMAX_TASK_NAME_LEN - default + * is 16. + * + * @param usStackDepth The size of the task stack specified as the number of + * variables the stack can hold - not the number of bytes. For example, if + * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes + * will be allocated for stack storage. + * + * @param pvParameters Pointer that will be used as the parameter for the task + * being created. + * + * @param uxPriority The priority at which the task should run. Systems that + * include MPU support can optionally create tasks in a privileged (system) + * mode by setting bit portPRIVILEGE_BIT of the priority parameter. For + * example, to create a privileged task at priority 2 the uxPriority parameter + * should be set to ( 2 | portPRIVILEGE_BIT ). + * + * @param pvCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file errors. h + * + * Example usage: +
+ // Task to be created.
+ void vTaskCode( void * pvParameters )
+ {
+	 for( ;; )
+	 {
+		 // Task code goes here.
+	 }
+ }
+
+ // Function that creates a task.
+ void vOtherFunction( void )
+ {
+ static unsigned char ucParameterToPass;
+ xTaskHandle xHandle;
+
+	 // Create the task, storing the handle.  Note that the passed parameter ucParameterToPass
+	 // must exist for the lifetime of the task, so in this case is declared static.  If it was just an
+	 // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time
+	 // the new task attempts to access it.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
+
+	 // Use the handle to delete the task.
+	 vTaskDelete( xHandle );
+ }
+   
+ * \defgroup xTaskCreate xTaskCreate + * \ingroup Tasks + */ +#define xTaskCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask ) xTaskGenericCreate( ( pvTaskCode ), ( pcName ), ( usStackDepth ), ( pvParameters ), ( uxPriority ), ( pxCreatedTask ), ( NULL ), ( NULL ) ) + +/** + * task. h + *
+ portBASE_TYPE xTaskCreateRestricted( xTaskParameters *pxTaskDefinition, xTaskHandle *pxCreatedTask );
+ * + * xTaskCreateRestricted() should only be used in systems that include an MPU + * implementation. + * + * Create a new task and add it to the list of tasks that are ready to run. + * The function parameters define the memory regions and associated access + * permissions allocated to the task. + * + * @param pxTaskDefinition Pointer to a structure that contains a member + * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API + * documentation) plus an optional stack buffer and the memory region + * definitions. + * + * @param pxCreatedTask Used to pass back a handle by which the created task + * can be referenced. + * + * @return pdPASS if the task was successfully created and added to a ready + * list, otherwise an error code defined in the file errors. h + * + * Example usage: +
+// Create an xTaskParameters structure that defines the task to be created.
+static const xTaskParameters xCheckTaskParameters =
+{
+	vATask,		// pvTaskCode - the function that implements the task.
+	"ATask",	// pcName - just a text name for the task to assist debugging.
+	100,		// usStackDepth	- the stack size DEFINED IN WORDS.
+	NULL,		// pvParameters - passed into the task function as the function parameters.
+	( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state.
+	cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack.
+
+	// xRegions - Allocate up to three separate memory regions for access by
+	// the task, with appropriate access permissions.  Different processors have
+	// different memory alignment requirements - refer to the FreeRTOS documentation
+	// for full information.
+	{
+		// Base address					Length	Parameters
+        { cReadWriteArray,				32,		portMPU_REGION_READ_WRITE },
+        { cReadOnlyArray,				32,		portMPU_REGION_READ_ONLY },
+        { cPrivilegedOnlyAccessArray,	128,	portMPU_REGION_PRIVILEGED_READ_WRITE }
+	}
+};
+
+int main( void )
+{
+xTaskHandle xHandle;
+
+	// Create a task from the const structure defined above.  The task handle
+	// is requested (the second parameter is not NULL) but in this case just for
+	// demonstration purposes as its not actually used.
+	xTaskCreateRestricted( &xRegTest1Parameters, &xHandle );
+
+	// Start the scheduler.
+	vTaskStartScheduler();
+
+	// Will only get here if there was insufficient memory to create the idle
+	// task.
+	for( ;; );
+}
+   
+ * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +#define xTaskCreateRestricted( x, pxCreatedTask ) xTaskGenericCreate( ((x)->pvTaskCode), ((x)->pcName), ((x)->usStackDepth), ((x)->pvParameters), ((x)->uxPriority), (pxCreatedTask), ((x)->puxStackBuffer), ((x)->xRegions) ) + +/** + * task. h + *
+ void vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const pxRegions );
+ * + * Memory regions are assigned to a restricted task when the task is created by + * a call to xTaskCreateRestricted(). These regions can be redefined using + * vTaskAllocateMPURegions(). + * + * @param xTask The handle of the task being updated. + * + * @param xRegions A pointer to an xMemoryRegion structure that contains the + * new memory region definitions. + * + * Example usage: +
+// Define an array of xMemoryRegion structures that configures an MPU region
+// allowing read/write access for 1024 bytes starting at the beginning of the
+// ucOneKByte array.  The other two of the maximum 3 definable regions are
+// unused so set to zero.
+static const xMemoryRegion xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] =
+{
+	// Base address		Length		Parameters
+	{ ucOneKByte,		1024,		portMPU_REGION_READ_WRITE },
+	{ 0,				0,			0 },
+	{ 0,				0,			0 }
+};
+
+void vATask( void *pvParameters )
+{
+	// This task was created such that it has access to certain regions of
+	// memory as defined by the MPU configuration.  At some point it is
+	// desired that these MPU regions are replaced with that defined in the
+	// xAltRegions const struct above.  Use a call to vTaskAllocateMPURegions()
+	// for this purpose.  NULL is used as the task handle to indicate that this
+	// function should modify the MPU regions of the calling task.
+	vTaskAllocateMPURegions( NULL, xAltRegions );
+
+	// Now the task can continue its function, but from this point on can only
+	// access its stack and the ucOneKByte array (unless any other statically
+	// defined or shared regions have been declared elsewhere).
+}
+   
+ * \defgroup xTaskCreateRestricted xTaskCreateRestricted + * \ingroup Tasks + */ +void vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const pxRegions ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskDelete( xTaskHandle xTask );
+ * + * INCLUDE_vTaskDelete must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Remove a task from the RTOS real time kernels management. The task being + * deleted will be removed from all ready, blocked, suspended and event lists. + * + * NOTE: The idle task is responsible for freeing the kernel allocated + * memory from tasks that have been deleted. It is therefore important that + * the idle task is not starved of microcontroller processing time if your + * application makes any calls to vTaskDelete (). Memory allocated by the + * task code is not automatically freed, and should be freed before the task + * is deleted. + * + * See the demo application file death.c for sample code that utilises + * vTaskDelete (). + * + * @param xTask The handle of the task to be deleted. Passing NULL will + * cause the calling task to be deleted. + * + * Example usage: +
+ void vOtherFunction( void )
+ {
+ xTaskHandle xHandle;
+
+	 // Create the task, storing the handle.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
+
+	 // Use the handle to delete the task.
+	 vTaskDelete( xHandle );
+ }
+   
+ * \defgroup vTaskDelete vTaskDelete + * \ingroup Tasks + */ +void vTaskDelete( xTaskHandle xTaskToDelete ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK CONTROL API + *----------------------------------------------------------*/ + +/** + * task. h + *
void vTaskDelay( portTickType xTicksToDelay );
+ * + * Delay a task for a given number of ticks. The actual time that the + * task remains blocked depends on the tick rate. The constant + * portTICK_RATE_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * INCLUDE_vTaskDelay must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * + * vTaskDelay() specifies a time at which the task wishes to unblock relative to + * the time at which vTaskDelay() is called. For example, specifying a block + * period of 100 ticks will cause the task to unblock 100 ticks after + * vTaskDelay() is called. vTaskDelay() does not therefore provide a good method + * of controlling the frequency of a cyclical task as the path taken through the + * code, as well as other task and interrupt activity, will effect the frequency + * at which vTaskDelay() gets called and therefore the time at which the task + * next executes. See vTaskDelayUntil() for an alternative API function designed + * to facilitate fixed frequency execution. It does this by specifying an + * absolute time (rather than a relative time) at which the calling task should + * unblock. + * + * @param xTicksToDelay The amount of time, in tick periods, that + * the calling task should block. + * + * Example usage: + + void vTaskFunction( void * pvParameters ) + { + void vTaskFunction( void * pvParameters ) + { + // Block for 500ms. + const portTickType xDelay = 500 / portTICK_RATE_MS; + + for( ;; ) + { + // Simply toggle the LED every 500ms, blocking between each toggle. + vToggleLED(); + vTaskDelay( xDelay ); + } + } + + * \defgroup vTaskDelay vTaskDelay + * \ingroup TaskCtrl + */ +void vTaskDelay( portTickType xTicksToDelay ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskDelayUntil( portTickType *pxPreviousWakeTime, portTickType xTimeIncrement );
+ * + * INCLUDE_vTaskDelayUntil must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Delay a task until a specified time. This function can be used by cyclical + * tasks to ensure a constant execution frequency. + * + * This function differs from vTaskDelay () in one important aspect: vTaskDelay () will + * cause a task to block for the specified number of ticks from the time vTaskDelay () is + * called. It is therefore difficult to use vTaskDelay () by itself to generate a fixed + * execution frequency as the time between a task starting to execute and that task + * calling vTaskDelay () may not be fixed [the task may take a different path though the + * code between calls, or may get interrupted or preempted a different number of times + * each time it executes]. + * + * Whereas vTaskDelay () specifies a wake time relative to the time at which the function + * is called, vTaskDelayUntil () specifies the absolute (exact) time at which it wishes to + * unblock. + * + * The constant portTICK_RATE_MS can be used to calculate real time from the tick + * rate - with the resolution of one tick period. + * + * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the + * task was last unblocked. The variable must be initialised with the current time + * prior to its first use (see the example below). Following this the variable is + * automatically updated within vTaskDelayUntil (). + * + * @param xTimeIncrement The cycle time period. The task will be unblocked at + * time *pxPreviousWakeTime + xTimeIncrement. Calling vTaskDelayUntil with the + * same xTimeIncrement parameter value will cause the task to execute with + * a fixed interface period. + * + * Example usage: +
+ // Perform an action every 10 ticks.
+ void vTaskFunction( void * pvParameters )
+ {
+ portTickType xLastWakeTime;
+ const portTickType xFrequency = 10;
+
+	 // Initialise the xLastWakeTime variable with the current time.
+	 xLastWakeTime = xTaskGetTickCount ();
+	 for( ;; )
+	 {
+		 // Wait for the next cycle.
+		 vTaskDelayUntil( &xLastWakeTime, xFrequency );
+
+		 // Perform action here.
+	 }
+ }
+   
+ * \defgroup vTaskDelayUntil vTaskDelayUntil + * \ingroup TaskCtrl + */ +void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle xTask );
+ * + * INCLUDE_xTaskPriorityGet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the priority of any task. + * + * @param xTask Handle of the task to be queried. Passing a NULL + * handle results in the priority of the calling task being returned. + * + * @return The priority of xTask. + * + * Example usage: +
+ void vAFunction( void )
+ {
+ xTaskHandle xHandle;
+
+	 // Create a task, storing the handle.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
+
+	 // ...
+
+	 // Use the handle to obtain the priority of the created task.
+	 // It was created with tskIDLE_PRIORITY, but may have changed
+	 // it itself.
+	 if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY )
+	 {
+		 // The task has changed it's priority.
+	 }
+
+	 // ...
+
+	 // Is our priority higher than the created task?
+	 if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) )
+	 {
+		 // Our priority (obtained using NULL handle) is higher.
+	 }
+ }
+   
+ * \defgroup uxTaskPriorityGet uxTaskPriorityGet + * \ingroup TaskCtrl + */ +unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
eTaskState eTaskGetState( xTaskHandle xTask );
+ * + * INCLUDE_eTaskGetState must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Obtain the state of any task. States are encoded by the eTaskState + * enumerated type. + * + * @param xTask Handle of the task to be queried. + * + * @return The state of xTask at the time the function was called. Note the + * state of the task might change between the function being called, and the + * functions return value being tested by the calling task. + */ +eTaskState eTaskGetState( xTaskHandle xTask ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskPrioritySet( xTaskHandle xTask, unsigned portBASE_TYPE uxNewPriority );
+ * + * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Set the priority of any task. + * + * A context switch will occur before the function returns if the priority + * being set is higher than the currently executing task. + * + * @param xTask Handle to the task for which the priority is being set. + * Passing a NULL handle results in the priority of the calling task being set. + * + * @param uxNewPriority The priority to which the task will be set. + * + * Example usage: +
+ void vAFunction( void )
+ {
+ xTaskHandle xHandle;
+
+	 // Create a task, storing the handle.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
+
+	 // ...
+
+	 // Use the handle to raise the priority of the created task.
+	 vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );
+
+	 // ...
+
+	 // Use a NULL handle to raise our priority to the same value.
+	 vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );
+ }
+   
+ * \defgroup vTaskPrioritySet vTaskPrioritySet + * \ingroup TaskCtrl + */ +void vTaskPrioritySet( xTaskHandle xTask, unsigned portBASE_TYPE uxNewPriority ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskSuspend( xTaskHandle xTaskToSuspend );
+ * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Suspend any task. When suspended a task will never get any microcontroller + * processing time, no matter what its priority. + * + * Calls to vTaskSuspend are not accumulative - + * i.e. calling vTaskSuspend () twice on the same task still only requires one + * call to vTaskResume () to ready the suspended task. + * + * @param xTaskToSuspend Handle to the task being suspended. Passing a NULL + * handle will cause the calling task to be suspended. + * + * Example usage: +
+ void vAFunction( void )
+ {
+ xTaskHandle xHandle;
+
+	 // Create a task, storing the handle.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
+
+	 // ...
+
+	 // Use the handle to suspend the created task.
+	 vTaskSuspend( xHandle );
+
+	 // ...
+
+	 // The created task will not run during this period, unless
+	 // another task calls vTaskResume( xHandle ).
+
+	 //...
+
+
+	 // Suspend ourselves.
+	 vTaskSuspend( NULL );
+
+	 // We cannot get here unless another task calls vTaskResume
+	 // with our handle as the parameter.
+ }
+   
+ * \defgroup vTaskSuspend vTaskSuspend + * \ingroup TaskCtrl + */ +void vTaskSuspend( xTaskHandle xTaskToSuspend ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskResume( xTaskHandle xTaskToResume );
+ * + * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available. + * See the configuration section for more information. + * + * Resumes a suspended task. + * + * A task that has been suspended by one of more calls to vTaskSuspend () + * will be made available for running again by a single call to + * vTaskResume (). + * + * @param xTaskToResume Handle to the task being readied. + * + * Example usage: +
+ void vAFunction( void )
+ {
+ xTaskHandle xHandle;
+
+	 // Create a task, storing the handle.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
+
+	 // ...
+
+	 // Use the handle to suspend the created task.
+	 vTaskSuspend( xHandle );
+
+	 // ...
+
+	 // The created task will not run during this period, unless
+	 // another task calls vTaskResume( xHandle ).
+
+	 //...
+
+
+	 // Resume the suspended task ourselves.
+	 vTaskResume( xHandle );
+
+	 // The created task will once again get microcontroller processing
+	 // time in accordance with it priority within the system.
+ }
+   
+ * \defgroup vTaskResume vTaskResume + * \ingroup TaskCtrl + */ +void vTaskResume( xTaskHandle xTaskToResume ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void xTaskResumeFromISR( xTaskHandle xTaskToResume );
+ * + * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be + * available. See the configuration section for more information. + * + * An implementation of vTaskResume() that can be called from within an ISR. + * + * A task that has been suspended by one of more calls to vTaskSuspend () + * will be made available for running again by a single call to + * xTaskResumeFromISR (). + * + * @param xTaskToResume Handle to the task being readied. + * + * \defgroup vTaskResumeFromISR vTaskResumeFromISR + * \ingroup TaskCtrl + */ +portBASE_TYPE xTaskResumeFromISR( xTaskHandle xTaskToResume ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * SCHEDULER CONTROL + *----------------------------------------------------------*/ + +/** + * task. h + *
void vTaskStartScheduler( void );
+ * + * Starts the real time kernel tick processing. After calling the kernel + * has control over which tasks are executed and when. This function + * does not return until an executing task calls vTaskEndScheduler (). + * + * At least one task should be created via a call to xTaskCreate () + * before calling vTaskStartScheduler (). The idle task is created + * automatically when the first application task is created. + * + * See the demo application file main.c for an example of creating + * tasks and starting the kernel. + * + * Example usage: +
+ void vAFunction( void )
+ {
+	 // Create at least one task before starting the kernel.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
+
+	 // Start the real time kernel with preemption.
+	 vTaskStartScheduler ();
+
+	 // Will not get here unless a task calls vTaskEndScheduler ()
+ }
+   
+ * + * \defgroup vTaskStartScheduler vTaskStartScheduler + * \ingroup SchedulerControl + */ +void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskEndScheduler( void );
+ * + * Stops the real time kernel tick. All created tasks will be automatically + * deleted and multitasking (either preemptive or cooperative) will + * stop. Execution then resumes from the point where vTaskStartScheduler () + * was called, as if vTaskStartScheduler () had just returned. + * + * See the demo application file main. c in the demo/PC directory for an + * example that uses vTaskEndScheduler (). + * + * vTaskEndScheduler () requires an exit function to be defined within the + * portable layer (see vPortEndScheduler () in port. c for the PC port). This + * performs hardware specific operations such as stopping the kernel tick. + * + * vTaskEndScheduler () will cause all of the resources allocated by the + * kernel to be freed - but will not free resources allocated by application + * tasks. + * + * Example usage: +
+ void vTaskCode( void * pvParameters )
+ {
+	 for( ;; )
+	 {
+		 // Task code goes here.
+
+		 // At some point we want to end the real time kernel processing
+		 // so call ...
+		 vTaskEndScheduler ();
+	 }
+ }
+
+ void vAFunction( void )
+ {
+	 // Create at least one task before starting the kernel.
+	 xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
+
+	 // Start the real time kernel with preemption.
+	 vTaskStartScheduler ();
+
+	 // Will only get here when the vTaskCode () task has called
+	 // vTaskEndScheduler ().  When we get here we are back to single task
+	 // execution.
+ }
+   
+ * + * \defgroup vTaskEndScheduler vTaskEndScheduler + * \ingroup SchedulerControl + */ +void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskSuspendAll( void );
+ * + * Suspends all real time kernel activity while keeping interrupts (including the + * kernel tick) enabled. + * + * After calling vTaskSuspendAll () the calling task will continue to execute + * without risk of being swapped out until a call to xTaskResumeAll () has been + * made. + * + * API functions that have the potential to cause a context switch (for example, + * vTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler + * is suspended. + * + * Example usage: +
+ void vTask1( void * pvParameters )
+ {
+	 for( ;; )
+	 {
+		 // Task code goes here.
+
+		 // ...
+
+		 // At some point the task wants to perform a long operation during
+		 // which it does not want to get swapped out.  It cannot use
+		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
+		 // operation may cause interrupts to be missed - including the
+		 // ticks.
+
+		 // Prevent the real time kernel swapping out the task.
+		 vTaskSuspendAll ();
+
+		 // Perform the operation here.  There is no need to use critical
+		 // sections as we have all the microcontroller processing time.
+		 // During this time interrupts will still operate and the kernel
+		 // tick count will be maintained.
+
+		 // ...
+
+		 // The operation is complete.  Restart the kernel.
+		 xTaskResumeAll ();
+	 }
+ }
+   
+ * \defgroup vTaskSuspendAll vTaskSuspendAll + * \ingroup SchedulerControl + */ +void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
char xTaskResumeAll( void );
+ * + * Resumes real time kernel activity following a call to vTaskSuspendAll (). + * After a call to vTaskSuspendAll () the kernel will take control of which + * task is executing at any time. + * + * @return If resuming the scheduler caused a context switch then pdTRUE is + * returned, otherwise pdFALSE is returned. + * + * Example usage: +
+ void vTask1( void * pvParameters )
+ {
+	 for( ;; )
+	 {
+		 // Task code goes here.
+
+		 // ...
+
+		 // At some point the task wants to perform a long operation during
+		 // which it does not want to get swapped out.  It cannot use
+		 // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the
+		 // operation may cause interrupts to be missed - including the
+		 // ticks.
+
+		 // Prevent the real time kernel swapping out the task.
+		 vTaskSuspendAll ();
+
+		 // Perform the operation here.  There is no need to use critical
+		 // sections as we have all the microcontroller processing time.
+		 // During this time interrupts will still operate and the real
+		 // time kernel tick count will be maintained.
+
+		 // ...
+
+		 // The operation is complete.  Restart the kernel.  We want to force
+		 // a context switch - but there is no point if resuming the scheduler
+		 // caused a context switch already.
+		 if( !xTaskResumeAll () )
+		 {
+			  taskYIELD ();
+		 }
+	 }
+ }
+   
+ * \defgroup xTaskResumeAll xTaskResumeAll + * \ingroup SchedulerControl + */ +signed portBASE_TYPE xTaskResumeAll( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
signed portBASE_TYPE xTaskIsTaskSuspended( const xTaskHandle xTask );
+ * + * Utility task that simply returns pdTRUE if the task referenced by xTask is + * currently in the Suspended state, or pdFALSE if the task referenced by xTask + * is in any other state. + * + */ +signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * TASK UTILITIES + *----------------------------------------------------------*/ + +/** + * task. h + *
portTickType xTaskGetTickCount( void );
+ * + * @return The count of ticks since vTaskStartScheduler was called. + * + * \defgroup xTaskGetTickCount xTaskGetTickCount + * \ingroup TaskUtils + */ +portTickType xTaskGetTickCount( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
portTickType xTaskGetTickCountFromISR( void );
+ * + * @return The count of ticks since vTaskStartScheduler was called. + * + * This is a version of xTaskGetTickCount() that is safe to be called from an + * ISR - provided that portTickType is the natural word size of the + * microcontroller being used or interrupt nesting is either not supported or + * not being used. + * + * \defgroup xTaskGetTickCount xTaskGetTickCount + * \ingroup TaskUtils + */ +portTickType xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
unsigned short uxTaskGetNumberOfTasks( void );
+ * + * @return The number of tasks that the real time kernel is currently managing. + * This includes all ready, blocked and suspended tasks. A task that + * has been deleted but not yet freed by the idle task will also be + * included in the count. + * + * \defgroup uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks + * \ingroup TaskUtils + */ +unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
signed char *pcTaskGetTaskName( xTaskHandle xTaskToQuery );
+ * + * @return The text (human readable) name of the task referenced by the handle + * xTaskToQueury. A task can query its own name by either passing in its own + * handle, or by setting xTaskToQuery to NULL. INCLUDE_pcTaskGetTaskName must be + * set to 1 in FreeRTOSConfig.h for pcTaskGetTaskName() to be available. + * + * \defgroup pcTaskGetTaskName pcTaskGetTaskName + * \ingroup TaskUtils + */ +signed char *pcTaskGetTaskName( xTaskHandle xTaskToQuery ); + +/** + * task.h + *
unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask );
+ * + * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for + * this function to be available. + * + * Returns the high water mark of the stack associated with xTask. That is, + * the minimum free stack space there has been (in words, so on a 32 bit machine + * a value of 1 means 4 bytes) since the task started. The smaller the returned + * number the closer the task has come to overflowing its stack. + * + * @param xTask Handle of the task associated with the stack to be checked. + * Set xTask to NULL to check the stack of the calling task. + * + * @return The smallest amount of free stack space there has been (in bytes) + * since the task referenced by xTask was created. + */ +unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask ) PRIVILEGED_FUNCTION; + +/* When using trace macros it is sometimes necessary to include tasks.h before +FreeRTOS.h. When this is done pdTASK_HOOK_CODE will not yet have been defined, +so the following two prototypes will cause a compilation error. This can be +fixed by simply guarding against the inclusion of these two prototypes unless +they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration +constant. */ +#ifdef configUSE_APPLICATION_TASK_TAG + #if configUSE_APPLICATION_TASK_TAG == 1 + /** + * task.h + *
void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction );
+ * + * Sets pxHookFunction to be the task hook function used by the task xTask. + * Passing xTask as NULL has the effect of setting the calling tasks hook + * function. + */ + void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction ) PRIVILEGED_FUNCTION; + + /** + * task.h + *
void xTaskGetApplicationTaskTag( xTaskHandle xTask );
+ * + * Returns the pxHookFunction value assigned to the task xTask. + */ + pdTASK_HOOK_CODE xTaskGetApplicationTaskTag( xTaskHandle xTask ) PRIVILEGED_FUNCTION; + #endif /* configUSE_APPLICATION_TASK_TAG ==1 */ +#endif /* ifdef configUSE_APPLICATION_TASK_TAG */ + +/** + * task.h + *
portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction );
+ * + * Calls the hook function associated with xTask. Passing xTask as NULL has + * the effect of calling the Running tasks (the calling task) hook function. + * + * pvParameter is passed to the hook function for the task to interpret as it + * wants. + */ +portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter ) PRIVILEGED_FUNCTION; + +/** + * xTaskGetIdleTaskHandle() is only available if + * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h. + * + * Simply returns the handle of the idle task. It is not valid to call + * xTaskGetIdleTaskHandle() before the scheduler has been started. + */ +xTaskHandle xTaskGetIdleTaskHandle( void ); + +/** + * configUSE_TRACE_FACILITY must bet defined as 1 in FreeRTOSConfig.h for + * uxTaskGetSystemState() to be available. + * + * uxTaskGetSystemState() populates an xTaskStatusType structure for each task in + * the system. xTaskStatusType structures contain, among other things, members + * for the task handle, task name, task priority, task state, and total amount + * of run time consumed by the task. See the xTaskStatusType structure + * definition in this file for the full member list. + * + * NOTE: This function is intended for debugging use only as its use results in + * the scheduler remaining suspended for an extended period. + * + * @param pxTaskStatusArray A pointer to an array of xTaskStatusType structures. + * The array must contain at least one xTaskStatusType structure for each task + * that is under the control of the RTOS. The number of tasks under the control + * of the RTOS can be determined using the uxTaskGetNumberOfTasks() API function. + * + * @param uxArraySize The size of the array pointed to by the pxTaskStatusArray + * parameter. The size is specified as the number of indexes in the array, or + * the number of xTaskStatusType structures contained in the array, not by the + * number of bytes in the array. + * + * @param pulTotalRunTime If configGENERATE_RUN_TIME_STATS is set to 1 in + * FreeRTOSConfig.h then *pulTotalRunTime is set by uxTaskGetSystemState() to the + * total run time (as defined by the run time stats clock, see + * http://www.freertos.org/rtos-run-time-stats.html) since the target booted. + * pulTotalRunTime can be set to NULL to omit the total run time information. + * + * @return The number of xTaskStatusType structures that were populated by + * uxTaskGetSystemState(). This should equal the number returned by the + * uxTaskGetNumberOfTasks() API function, but will be zero if the value passed + * in the uxArraySize parameter was too small. + * + * Example usage: +
+    // This example demonstrates how a human readable table of run time stats
+	// information is generated from raw data provided by uxTaskGetSystemState().
+	// The human readable table is written to pcWriteBuffer
+	void vTaskGetRunTimeStats( signed char *pcWriteBuffer )
+	{
+	xTaskStatusType *pxTaskStatusArray;
+	volatile unsigned portBASE_TYPE uxArraySize, x;
+	unsigned long ulTotalRunTime, ulStatsAsPercentage;
+
+		// Make sure the write buffer does not contain a string.
+		*pcWriteBuffer = 0x00;
+
+		// Take a snapshot of the number of tasks in case it changes while this
+		// function is executing.
+		uxArraySize = uxCurrentNumberOfTasks();
+
+		// Allocate a xTaskStatusType structure for each task.  An array could be
+		// allocated statically at compile time.
+		pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( xTaskStatusType ) );
+
+		if( pxTaskStatusArray != NULL )
+		{
+			// Generate raw status information about each task.
+			uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime );
+
+			// For percentage calculations.
+			ulTotalRunTime /= 100UL;
+
+			// Avoid divide by zero errors.
+			if( ulTotalRunTime > 0 )
+			{
+				// For each populated position in the pxTaskStatusArray array,
+				// format the raw data as human readable ASCII data
+				for( x = 0; x < uxArraySize; x++ )
+				{
+					// What percentage of the total run time has the task used?
+					// This will always be rounded down to the nearest integer.
+					// ulTotalRunTimeDiv100 has already been divided by 100.
+					ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime;
+
+					if( ulStatsAsPercentage > 0UL )
+					{
+						sprintf( ( char * ) pcWriteBuffer, ( char * ) "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage );
+					}
+					else
+					{
+						// If the percentage is zero here then the task has
+						// consumed less than 1% of the total run time.
+						sprintf( ( char * ) pcWriteBuffer, ( char * ) "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter );
+					}
+
+					pcWriteBuffer += strlen( ( char * ) pcWriteBuffer );
+				}
+			}
+
+			// The array is no longer needed, free the memory it consumes.
+			vPortFree( pxTaskStatusArray );
+		}
+	}
+	
+ */ +unsigned portBASE_TYPE uxTaskGetSystemState( xTaskStatusType *pxTaskStatusArray, unsigned portBASE_TYPE uxArraySize, unsigned long *pulTotalRunTime ); + +/** + * task. h + *
void vTaskList( char *pcWriteBuffer );
+ * + * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must + * both be defined as 1 for this function to be available. See the + * configuration section of the FreeRTOS.org website for more information. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Lists all the current tasks, along with their current state and stack + * usage high water mark. + * + * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or + * suspended ('S'). + * + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays task + * names, states and stack usage. + * + * vTaskList() has a dependency on the sprintf() C library function that might + * bloat the code size, use a lot of stack, and provide different results on + * different platforms. An alternative, tiny, third party, and limited + * functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly through a + * call to vTaskList(). + * + * @param pcWriteBuffer A buffer into which the above mentioned details + * will be written, in ascii form. This buffer is assumed to be large + * enough to contain the generated report. Approximately 40 bytes per + * task should be sufficient. + * + * \defgroup vTaskList vTaskList + * \ingroup TaskUtils + */ +void vTaskList( signed char *pcWriteBuffer ) PRIVILEGED_FUNCTION; + +/** + * task. h + *
void vTaskGetRunTimeStats( char *pcWriteBuffer );
+ * + * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS + * must both be defined as 1 for this function to be available. The application + * must also then provide definitions for + * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE + * to configure a peripheral timer/counter and return the timers current count + * value respectively. The counter should be at least 10 times the frequency of + * the tick count. + * + * NOTE 1: This function will disable interrupts for its duration. It is + * not intended for normal application runtime use but as a debug aid. + * + * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total + * accumulated execution time being stored for each task. The resolution + * of the accumulated time value depends on the frequency of the timer + * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro. + * Calling vTaskGetRunTimeStats() writes the total execution time of each + * task into a buffer, both as an absolute count value and as a percentage + * of the total system execution time. + * + * NOTE 2: + * + * This function is provided for convenience only, and is used by many of the + * demo applications. Do not consider it to be part of the scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that displays the + * amount of time each task has spent in the Running state in both absolute and + * percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library function + * that might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, and + * limited functionality implementation of sprintf() is provided in many of the + * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note + * printf-stdarg.c does not provide a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() directly + * to get access to raw stats data, rather than indirectly through a call to + * vTaskGetRunTimeStats(). + * + * @param pcWriteBuffer A buffer into which the execution times will be + * written, in ascii form. This buffer is assumed to be large enough to + * contain the generated report. Approximately 40 bytes per task should + * be sufficient. + * + * \defgroup vTaskGetRunTimeStats vTaskGetRunTimeStats + * \ingroup TaskUtils + */ +void vTaskGetRunTimeStats( signed char *pcWriteBuffer ) PRIVILEGED_FUNCTION; + +/*----------------------------------------------------------- + * SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES + *----------------------------------------------------------*/ + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Called from the real time kernel tick (either preemptive or cooperative), + * this increments the tick count and checks if any tasks that are blocked + * for a finite period required removing from a blocked list and placing on + * a ready list. If a non-zero value is returned then a context switch is + * required because either: + * + A task was removed from a blocked list because its timeout had expired, + * or + * + Time slicing is in use and there is a task of equal priority to the + * currently running task. + */ +portBASE_TYPE xTaskIncrementTick( void ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes the calling task from the ready list and places it both + * on the list of tasks waiting for a particular event, and the + * list of delayed tasks. The task will be removed from both lists + * and replaced on the ready list should either the event occur (and + * there be no higher priority tasks waiting on the same event) or + * the delay period expires. + * + * @param pxEventList The list containing tasks that are blocked waiting + * for the event to occur. + * + * @param xTicksToWait The maximum amount of time that the task should wait + * for the event to occur. This is specified in kernel ticks,the constant + * portTICK_RATE_MS can be used to convert kernel ticks into a real time + * period. + */ +void vTaskPlaceOnEventList( xList * const pxEventList, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * This function performs nearly the same function as vTaskPlaceOnEventList(). + * The difference being that this function does not permit tasks to block + * indefinitely, whereas vTaskPlaceOnEventList() does. + * + * @return pdTRUE if the task being removed has a higher priority than the task + * making the call, otherwise pdFALSE. + */ +void vTaskPlaceOnEventListRestricted( xList * const pxEventList, portTickType xTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS AN + * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED. + * + * Removes a task from both the specified event list and the list of blocked + * tasks, and places it on a ready queue. + * + * xTaskRemoveFromEventList () will be called if either an event occurs to + * unblock a task, or the block timeout period expires. + * + * @return pdTRUE if the task being removed has a higher priority than the task + * making the call, otherwise pdFALSE. + */ +signed portBASE_TYPE xTaskRemoveFromEventList( const xList * const pxEventList ) PRIVILEGED_FUNCTION; + +/* + * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE. IT IS ONLY + * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS + * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER. + * + * Sets the pointer to the current TCB to the TCB of the highest priority task + * that is ready to run. + */ +void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION; + +/* + * Return the handle of the calling task. + */ +xTaskHandle xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION; + +/* + * Capture the current time status for future reference. + */ +void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut ) PRIVILEGED_FUNCTION; + +/* + * Compare the time status now with that previously captured to see if the + * timeout has expired. + */ +portBASE_TYPE xTaskCheckForTimeOut( xTimeOutType * const pxTimeOut, portTickType * const pxTicksToWait ) PRIVILEGED_FUNCTION; + +/* + * Shortcut used by the queue implementation to prevent unnecessary call to + * taskYIELD(); + */ +void vTaskMissedYield( void ) PRIVILEGED_FUNCTION; + +/* + * Returns the scheduler state as taskSCHEDULER_RUNNING, + * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED. + */ +portBASE_TYPE xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION; + +/* + * Raises the priority of the mutex holder to that of the calling task should + * the mutex holder have a priority less than the calling task. + */ +void vTaskPriorityInherit( xTaskHandle const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Set the priority of a task back to its proper priority in the case that it + * inherited a higher priority while it was holding a semaphore. + */ +void vTaskPriorityDisinherit( xTaskHandle const pxMutexHolder ) PRIVILEGED_FUNCTION; + +/* + * Generic version of the task creation function which is in turn called by the + * xTaskCreate() and xTaskCreateRestricted() macros. + */ +signed portBASE_TYPE xTaskGenericCreate( pdTASK_CODE pxTaskCode, const signed char * const pcName, unsigned short usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask, portSTACK_TYPE *puxStackBuffer, const xMemoryRegion * const xRegions ) PRIVILEGED_FUNCTION; + +/* + * Get the uxTCBNumber assigned to the task referenced by the xTask parameter. + */ +unsigned portBASE_TYPE uxTaskGetTaskNumber( xTaskHandle xTask ); + +/* + * Set the uxTCBNumber of the task referenced by the xTask parameter to + * ucHandle. + */ +void vTaskSetTaskNumber( xTaskHandle xTask, unsigned portBASE_TYPE uxHandle ); + +/* + * If tickless mode is being used, or a low power mode is implemented, then + * the tick interrupt will not execute during idle periods. When this is the + * case, the tick count value maintained by the scheduler needs to be kept up + * to date with the actual execution time by being skipped forward by the by + * a time equal to the idle period. + */ +void vTaskStepTick( portTickType xTicksToJump ); + +/* + * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port + * specific sleep function to determine if it is ok to proceed with the sleep, + * and if it is ok to proceed, if it is ok to sleep indefinitely. + * + * This function is necessary because portSUPPRESS_TICKS_AND_SLEEP() is only + * called with the scheduler suspended, not from within a critical section. It + * is therefore possible for an interrupt to request a context switch between + * portSUPPRESS_TICKS_AND_SLEEP() and the low power mode actually being + * entered. eTaskConfirmSleepModeStatus() should be called from a short + * critical section between the timer being stopped and the sleep mode being + * entered to ensure it is ok to proceed into the sleep mode. + */ +eSleepModeStatus eTaskConfirmSleepModeStatus( void ); + +#ifdef __cplusplus +} +#endif +#endif /* INC_TASK_H */ + + + diff --git a/third_party/FreeRTOS/Source/include/timers.h b/third_party/FreeRTOS/Source/include/timers.h new file mode 100644 index 0000000..01a09f3 --- /dev/null +++ b/third_party/FreeRTOS/Source/include/timers.h @@ -0,0 +1,960 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef TIMERS_H +#define TIMERS_H + +#ifndef INC_FREERTOS_H + #error "include FreeRTOS.h must appear in source files before include timers.h" +#endif + +/*lint -e537 This headers are only multiply included if the application code +happens to also be including task.h. */ +#include "task.h" +/*lint +e956 */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* IDs for commands that can be sent/received on the timer queue. These are to +be used solely through the macros that make up the public software timer API, +as defined below. */ +#define tmrCOMMAND_START ( ( portBASE_TYPE ) 0 ) +#define tmrCOMMAND_STOP ( ( portBASE_TYPE ) 1 ) +#define tmrCOMMAND_CHANGE_PERIOD ( ( portBASE_TYPE ) 2 ) +#define tmrCOMMAND_DELETE ( ( portBASE_TYPE ) 3 ) + +/*----------------------------------------------------------- + * MACROS AND DEFINITIONS + *----------------------------------------------------------*/ + + /** + * Type by which software timers are referenced. For example, a call to + * xTimerCreate() returns an xTimerHandle variable that can then be used to + * reference the subject timer in calls to other software timer API functions + * (for example, xTimerStart(), xTimerReset(), etc.). + */ +typedef void * xTimerHandle; + +/* Define the prototype to which timer callback functions must conform. */ +typedef void (*tmrTIMER_CALLBACK)( xTimerHandle xTimer ); + +/** + * xTimerHandle xTimerCreate( const signed char *pcTimerName, + * portTickType xTimerPeriodInTicks, + * unsigned portBASE_TYPE uxAutoReload, + * void * pvTimerID, + * tmrTIMER_CALLBACK pxCallbackFunction ); + * + * Creates a new software timer instance. This allocates the storage required + * by the new timer, initialises the new timers internal state, and returns a + * handle by which the new timer can be referenced. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the + * active state. + * + * @param pcTimerName A text name that is assigned to the timer. This is done + * purely to assist debugging. The kernel itself only ever references a timer by + * its handle, and never by its name. + * + * @param xTimerPeriodInTicks The timer period. The time is defined in tick periods so + * the constant portTICK_RATE_MS can be used to convert a time that has been + * specified in milliseconds. For example, if the timer must expire after 100 + * ticks, then xTimerPeriodInTicks should be set to 100. Alternatively, if the timer + * must expire after 500ms, then xPeriod can be set to ( 500 / portTICK_RATE_MS ) + * provided configTICK_RATE_HZ is less than or equal to 1000. + * + * @param uxAutoReload If uxAutoReload is set to pdTRUE then the timer will + * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter. If + * uxAutoReload is set to pdFALSE then the timer will be a one-shot timer and + * enter the dormant state after it expires. + * + * @param pvTimerID An identifier that is assigned to the timer being created. + * Typically this would be used in the timer callback function to identify which + * timer expired when the same callback function is assigned to more than one + * timer. + * + * @param pxCallbackFunction The function to call when the timer expires. + * Callback functions must have the prototype defined by tmrTIMER_CALLBACK, + * which is "void vCallbackFunction( xTimerHandle xTimer );". + * + * @return If the timer is successfully create then a handle to the newly + * created timer is returned. If the timer cannot be created (because either + * there is insufficient FreeRTOS heap remaining to allocate the timer + * structures, or the timer period was set to 0) then 0 is returned. + * + * Example usage: + * @verbatim + * #define NUM_TIMERS 5 + * + * // An array to hold handles to the created timers. + * xTimerHandle xTimers[ NUM_TIMERS ]; + * + * // An array to hold a count of the number of times each timer expires. + * long lExpireCounters[ NUM_TIMERS ] = { 0 }; + * + * // Define a callback function that will be used by multiple timer instances. + * // The callback function does nothing but count the number of times the + * // associated timer expires, and stop the timer once the timer has expired + * // 10 times. + * void vTimerCallback( xTimerHandle pxTimer ) + * { + * long lArrayIndex; + * const long xMaxExpiryCountBeforeStopping = 10; + * + * // Optionally do something if the pxTimer parameter is NULL. + * configASSERT( pxTimer ); + * + * // Which timer expired? + * lArrayIndex = ( long ) pvTimerGetTimerID( pxTimer ); + * + * // Increment the number of times that pxTimer has expired. + * lExpireCounters[ lArrayIndex ] += 1; + * + * // If the timer has expired 10 times then stop it from running. + * if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping ) + * { + * // Do not use a block time if calling a timer API function from a + * // timer callback function, as doing so could cause a deadlock! + * xTimerStop( pxTimer, 0 ); + * } + * } + * + * void main( void ) + * { + * long x; + * + * // Create then start some timers. Starting the timers before the scheduler + * // has been started means the timers will start running immediately that + * // the scheduler starts. + * for( x = 0; x < NUM_TIMERS; x++ ) + * { + * xTimers[ x ] = xTimerCreate( "Timer", // Just a text name, not used by the kernel. + * ( 100 * x ), // The timer period in ticks. + * pdTRUE, // The timers will auto-reload themselves when they expire. + * ( void * ) x, // Assign each timer a unique id equal to its array index. + * vTimerCallback // Each timer calls the same callback when it expires. + * ); + * + * if( xTimers[ x ] == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xTimers[ x ], 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timers running as they have already + * // been set into the active state. + * xTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +xTimerHandle xTimerCreate( const signed char * const pcTimerName, portTickType xTimerPeriodInTicks, unsigned portBASE_TYPE uxAutoReload, void * pvTimerID, tmrTIMER_CALLBACK pxCallbackFunction ) PRIVILEGED_FUNCTION; + +/** + * void *pvTimerGetTimerID( xTimerHandle xTimer ); + * + * Returns the ID assigned to the timer. + * + * IDs are assigned to timers using the pvTimerID parameter of the call to + * xTimerCreated() that was used to create the timer. + * + * If the same callback function is assigned to multiple timers then the timer + * ID can be used within the callback function to identify which timer actually + * expired. + * + * @param xTimer The timer being queried. + * + * @return The ID assigned to the timer being queried. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + */ +void *pvTimerGetTimerID( xTimerHandle xTimer ) PRIVILEGED_FUNCTION; + +/** + * portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ); + * + * Queries a timer to see if it is active or dormant. + * + * A timer will be dormant if: + * 1) It has been created but not started, or + * 2) It is an expired on-shot timer that has not been restarted. + * + * Timers are created in the dormant state. The xTimerStart(), xTimerReset(), + * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and + * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the + * active state. + * + * @param xTimer The timer being queried. + * + * @return pdFALSE will be returned if the timer is dormant. A value other than + * pdFALSE will be returned if the timer is active. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. + * void vAFunction( xTimerHandle xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is active, do something. + * } + * else + * { + * // xTimer is not active, do something else. + * } + * } + * @endverbatim + */ +portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ) PRIVILEGED_FUNCTION; + +/** + * xTimerGetTimerDaemonTaskHandle() is only available if + * INCLUDE_xTimerGetTimerDaemonTaskHandle is set to 1 in FreeRTOSConfig.h. + * + * Simply returns the handle of the timer service/daemon task. It it not valid + * to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started. + */ +xTaskHandle xTimerGetTimerDaemonTaskHandle( void ); + +/** + * portBASE_TYPE xTimerStart( xTimerHandle xTimer, portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStart() starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerStart() has equivalent functionality + * to the xTimerReset() API function. + * + * Starting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerStart() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerStart() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerStart() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart() + * to be available. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the start command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStart() was called. xBlockTime is ignored if xTimerStart() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue even after xBlockTime ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStart( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerStop( xTimerHandle xTimer, portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerStop() stops a timer that was previously started using either of the + * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(), + * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions. + * + * Stopping a timer ensures the timer is not in the active state. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop() + * to be available. + * + * @param xTimer The handle of the timer being stopped. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the stop command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerStop() was called. xBlockTime is ignored if xTimerStop() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue even after xBlockTime ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerCreate() API function example usage scenario. + * + */ +#define xTimerStop( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerChangePeriod( xTimerHandle xTimer, + * portTickType xNewPeriod, + * portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerChangePeriod() changes the period of a timer that was previously + * created using the xTimerCreate() API function. + * + * xTimerChangePeriod() can be called to change the period of an active or + * dormant state timer. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerChangePeriod() to be available. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_RATE_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_RATE_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the change period command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerChangePeriod() was called. xBlockTime is ignored if + * xTimerChangePeriod() is called before the scheduler is started. + * + * @return pdFAIL will be returned if the change period command could not be + * sent to the timer command queue even after xBlockTime ticks had passed. + * pdPASS will be returned if the command was successfully sent to the timer + * command queue. When the command is actually processed will depend on the + * priority of the timer service/daemon task relative to other tasks in the + * system. The timer service/daemon task priority is set by the + * configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This function assumes xTimer has already been created. If the timer + * // referenced by xTimer is already active when it is called, then the timer + * // is deleted. If the timer referenced by xTimer is not active when it is + * // called, then the period of the timer is set to 500ms and the timer is + * // started. + * void vAFunction( xTimerHandle xTimer ) + * { + * if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently "if( xTimerIsTimerActive( xTimer ) )" + * { + * // xTimer is already active - delete it. + * xTimerDelete( xTimer ); + * } + * else + * { + * // xTimer is not active, change its period to 500ms. This will also + * // cause the timer to start. Block for a maximum of 100 ticks if the + * // change period command cannot immediately be sent to the timer + * // command queue. + * if( xTimerChangePeriod( xTimer, 500 / portTICK_RATE_MS, 100 ) == pdPASS ) + * { + * // The command was successfully sent. + * } + * else + * { + * // The command could not be sent, even after waiting for 100 ticks + * // to pass. Take appropriate action here. + * } + * } + * } + * @endverbatim + */ + #define xTimerChangePeriod( xTimer, xNewPeriod, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerDelete( xTimerHandle xTimer, portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerDelete() deletes a timer that was previously created using the + * xTimerCreate() API function. + * + * The configUSE_TIMERS configuration constant must be set to 1 for + * xTimerDelete() to be available. + * + * @param xTimer The handle of the timer being deleted. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the delete command to be + * successfully sent to the timer command queue, should the queue already be + * full when xTimerDelete() was called. xBlockTime is ignored if xTimerDelete() + * is called before the scheduler is started. + * + * @return pdFAIL will be returned if the delete command could not be sent to + * the timer command queue even after xBlockTime ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system. The timer + * service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * + * See the xTimerChangePeriod() API function example usage scenario. + */ +#define xTimerDelete( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerReset( xTimerHandle xTimer, portTickType xBlockTime ); + * + * Timer functionality is provided by a timer service/daemon task. Many of the + * public FreeRTOS timer API functions send commands to the timer service task + * though a queue called the timer command queue. The timer command queue is + * private to the kernel itself and is not directly accessible to application + * code. The length of the timer command queue is set by the + * configTIMER_QUEUE_LENGTH configuration constant. + * + * xTimerReset() re-starts a timer that was previously created using the + * xTimerCreate() API function. If the timer had already been started and was + * already in the active state, then xTimerReset() will cause the timer to + * re-evaluate its expiry time so that it is relative to when xTimerReset() was + * called. If the timer was in the dormant state then xTimerReset() has + * equivalent functionality to the xTimerStart() API function. + * + * Resetting a timer ensures the timer is in the active state. If the timer + * is not stopped, deleted, or reset in the mean time, the callback function + * associated with the timer will get called 'n' ticks after xTimerReset() was + * called, where 'n' is the timers defined period. + * + * It is valid to call xTimerReset() before the scheduler has been started, but + * when this is done the timer will not actually start until the scheduler is + * started, and the timers expiry time will be relative to when the scheduler is + * started, not relative to when xTimerReset() was called. + * + * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset() + * to be available. + * + * @param xTimer The handle of the timer being reset/started/restarted. + * + * @param xBlockTime Specifies the time, in ticks, that the calling task should + * be held in the Blocked state to wait for the reset command to be successfully + * sent to the timer command queue, should the queue already be full when + * xTimerReset() was called. xBlockTime is ignored if xTimerReset() is called + * before the scheduler is started. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue even after xBlockTime ticks had passed. pdPASS will + * be returned if the command was successfully sent to the timer command queue. + * When the command is actually processed will depend on the priority of the + * timer service/daemon task relative to other tasks in the system, although the + * timers expiry time is relative to when xTimerStart() is actually called. The + * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY + * configuration constant. + * + * Example usage: + * @verbatim + * // When a key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer. + * + * xTimerHandle xBacklightTimer = NULL; + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( xTimerHandle pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press event handler. + * void vKeyPressEventHandler( char cKey ) + * { + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. Wait 10 ticks for the command to be successfully sent + * // if it cannot be sent immediately. + * vSetBacklightState( BACKLIGHT_ON ); + * if( xTimerReset( xBacklightTimer, 100 ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * } + * + * void main( void ) + * { + * long x; + * + * // Create then start the one-shot timer that is responsible for turning + * // the back-light off if no keys are pressed within a 5 second period. + * xBacklightTimer = xTimerCreate( "BacklightTimer", // Just a text name, not used by the kernel. + * ( 5000 / portTICK_RATE_MS), // The timer period in ticks. + * pdFALSE, // The timer is a one-shot timer. + * 0, // The id is not used by the callback so can take any value. + * vBacklightTimerCallback // The callback function that switches the LCD back-light off. + * ); + * + * if( xBacklightTimer == NULL ) + * { + * // The timer was not created. + * } + * else + * { + * // Start the timer. No block time is specified, and even if one was + * // it would be ignored because the scheduler has not yet been + * // started. + * if( xTimerStart( xBacklightTimer, 0 ) != pdPASS ) + * { + * // The timer could not be set into the Active state. + * } + * } + * + * // ... + * // Create tasks here. + * // ... + * + * // Starting the scheduler will start the timer running as it has already + * // been set into the active state. + * xTaskStartScheduler(); + * + * // Should not reach here. + * for( ;; ); + * } + * @endverbatim + */ +#define xTimerReset( xTimer, xBlockTime ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xBlockTime ) ) + +/** + * portBASE_TYPE xTimerStartFromISR( xTimerHandle xTimer, + * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStart() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being started/restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStartFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStartFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStartFromISR() function. If + * xTimerStartFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the start command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerStartFromISR() is actually called. The timer service/daemon + * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( xTimerHandle pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then restart the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The start command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used. + * } + * } + * @endverbatim + */ +#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * portBASE_TYPE xTimerStopFromISR( xTimerHandle xTimer, + * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * + * A version of xTimerStop() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer being stopped. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerStopFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerStopFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerStopFromISR() function. If + * xTimerStopFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the stop command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the timer should be simply stopped. + * + * // The interrupt service routine that stops the timer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - simply stop the timer. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The stop command was not executed successfully. Take appropriate + * // action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used. + * } + * } + * @endverbatim + */ +#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0, ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * portBASE_TYPE xTimerChangePeriodFromISR( xTimerHandle xTimer, + * portTickType xNewPeriod, + * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * + * A version of xTimerChangePeriod() that can be called from an interrupt + * service routine. + * + * @param xTimer The handle of the timer that is having its period changed. + * + * @param xNewPeriod The new period for xTimer. Timer periods are specified in + * tick periods, so the constant portTICK_RATE_MS can be used to convert a time + * that has been specified in milliseconds. For example, if the timer must + * expire after 100 ticks, then xNewPeriod should be set to 100. Alternatively, + * if the timer must expire after 500ms, then xNewPeriod can be set to + * ( 500 / portTICK_RATE_MS ) provided configTICK_RATE_HZ is less than + * or equal to 1000. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerChangePeriodFromISR() writes a message to the + * timer command queue, so has the potential to transition the timer service/ + * daemon task out of the Blocked state. If calling xTimerChangePeriodFromISR() + * causes the timer service/daemon task to leave the Blocked state, and the + * timer service/daemon task has a priority equal to or greater than the + * currently executing task (the task that was interrupted), then + * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the + * xTimerChangePeriodFromISR() function. If xTimerChangePeriodFromISR() sets + * this value to pdTRUE then a context switch should be performed before the + * interrupt exits. + * + * @return pdFAIL will be returned if the command to change the timers period + * could not be sent to the timer command queue. pdPASS will be returned if the + * command was successfully sent to the timer command queue. When the command + * is actually processed will depend on the priority of the timer service/daemon + * task relative to other tasks in the system. The timer service/daemon task + * priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xTimer has already been created and started. When + * // an interrupt occurs, the period of xTimer should be changed to 500ms. + * + * // The interrupt service routine that changes the period of xTimer. + * void vAnExampleInterruptServiceRoutine( void ) + * { + * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * + * // The interrupt has occurred - change the period of xTimer to 500ms. + * // xHigherPriorityTaskWoken was set to pdFALSE where it was defined + * // (within this function). As this is an interrupt service routine, only + * // FreeRTOS API functions that end in "FromISR" can be used. + * if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The command to change the timers period was not executed + * // successfully. Take appropriate action here. + * } + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used. + * } + * } + * @endverbatim + */ +#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U ) + +/** + * portBASE_TYPE xTimerResetFromISR( xTimerHandle xTimer, + * portBASE_TYPE *pxHigherPriorityTaskWoken ); + * + * A version of xTimerReset() that can be called from an interrupt service + * routine. + * + * @param xTimer The handle of the timer that is to be started, reset, or + * restarted. + * + * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most + * of its time in the Blocked state, waiting for messages to arrive on the timer + * command queue. Calling xTimerResetFromISR() writes a message to the timer + * command queue, so has the potential to transition the timer service/daemon + * task out of the Blocked state. If calling xTimerResetFromISR() causes the + * timer service/daemon task to leave the Blocked state, and the timer service/ + * daemon task has a priority equal to or greater than the currently executing + * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will + * get set to pdTRUE internally within the xTimerResetFromISR() function. If + * xTimerResetFromISR() sets this value to pdTRUE then a context switch should + * be performed before the interrupt exits. + * + * @return pdFAIL will be returned if the reset command could not be sent to + * the timer command queue. pdPASS will be returned if the command was + * successfully sent to the timer command queue. When the command is actually + * processed will depend on the priority of the timer service/daemon task + * relative to other tasks in the system, although the timers expiry time is + * relative to when xTimerResetFromISR() is actually called. The timer service/daemon + * task priority is set by the configTIMER_TASK_PRIORITY configuration constant. + * + * Example usage: + * @verbatim + * // This scenario assumes xBacklightTimer has already been created. When a + * // key is pressed, an LCD back-light is switched on. If 5 seconds pass + * // without a key being pressed, then the LCD back-light is switched off. In + * // this case, the timer is a one-shot timer, and unlike the example given for + * // the xTimerReset() function, the key press event handler is an interrupt + * // service routine. + * + * // The callback function assigned to the one-shot timer. In this case the + * // parameter is not used. + * void vBacklightTimerCallback( xTimerHandle pxTimer ) + * { + * // The timer expired, therefore 5 seconds must have passed since a key + * // was pressed. Switch off the LCD back-light. + * vSetBacklightState( BACKLIGHT_OFF ); + * } + * + * // The key press interrupt service routine. + * void vKeyPressEventInterruptHandler( void ) + * { + * portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + * + * // Ensure the LCD back-light is on, then reset the timer that is + * // responsible for turning the back-light off after 5 seconds of + * // key inactivity. This is an interrupt service routine so can only + * // call FreeRTOS API functions that end in "FromISR". + * vSetBacklightState( BACKLIGHT_ON ); + * + * // xTimerStartFromISR() or xTimerResetFromISR() could be called here + * // as both cause the timer to re-calculate its expiry time. + * // xHigherPriorityTaskWoken was initialised to pdFALSE when it was + * // declared (in this function). + * if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS ) + * { + * // The reset command was not executed successfully. Take appropriate + * // action here. + * } + * + * // Perform the rest of the key processing here. + * + * // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch + * // should be performed. The syntax required to perform a context switch + * // from inside an ISR varies from port to port, and from compiler to + * // compiler. Inspect the demos for the port you are using to find the + * // actual syntax required. + * if( xHigherPriorityTaskWoken != pdFALSE ) + * { + * // Call the interrupt safe yield function here (actual function + * // depends on the FreeRTOS port being used. + * } + * } + * @endverbatim + */ +#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U ) + +/* + * Functions beyond this part are not part of the public API and are intended + * for use by the kernel only. + */ +portBASE_TYPE xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION; +portBASE_TYPE xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portTickType xBlockTime ) PRIVILEGED_FUNCTION; + +#ifdef __cplusplus +} +#endif +#endif /* TIMERS_H */ + + + diff --git a/third_party/FreeRTOS/Source/list.c b/third_party/FreeRTOS/Source/list.c new file mode 100644 index 0000000..1421bc6 --- /dev/null +++ b/third_party/FreeRTOS/Source/list.c @@ -0,0 +1,204 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#include +#include "FreeRTOS.h" +#include "list.h" + +/*----------------------------------------------------------- + * PUBLIC LIST API documented in list.h + *----------------------------------------------------------*/ + +void vListInitialise( xList * const pxList ) +{ + /* The list structure contains a list item which is used to mark the + end of the list. To initialise the list the list end is inserted + as the only list entry. */ + pxList->pxIndex = ( xListItem * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + /* The list end value is the highest possible value in the list to + ensure it remains at the end of the list. */ + pxList->xListEnd.xItemValue = portMAX_DELAY; + + /* The list end next and previous pointers point to itself so we know + when the list is empty. */ + pxList->xListEnd.pxNext = ( xListItem * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + pxList->xListEnd.pxPrevious = ( xListItem * ) &( pxList->xListEnd );/*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + + pxList->uxNumberOfItems = ( unsigned portBASE_TYPE ) 0U; +} +/*-----------------------------------------------------------*/ + +void vListInitialiseItem( xListItem * const pxItem ) +{ + /* Make sure the list item is not recorded as being on a list. */ + pxItem->pvContainer = NULL; +} +/*-----------------------------------------------------------*/ + +void vListInsertEnd( xList * const pxList, xListItem * const pxNewListItem ) +{ +xListItem * pxIndex; + + /* Insert a new list item into pxList, but rather than sort the list, + makes the new list item the last item to be removed by a call to + pvListGetOwnerOfNextEntry. */ + pxIndex = pxList->pxIndex; + + pxNewListItem->pxNext = pxIndex; + pxNewListItem->pxPrevious = pxIndex->pxPrevious; + pxIndex->pxPrevious->pxNext = pxNewListItem; + pxIndex->pxPrevious = pxNewListItem; + + /* Remember which list the item is in. */ + pxNewListItem->pvContainer = ( void * ) pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +void vListInsert( xList * const pxList, xListItem * const pxNewListItem ) +{ +xListItem *pxIterator; +portTickType xValueOfInsertion; + + /* Insert the new list item into the list, sorted in ulListItem order. */ + xValueOfInsertion = pxNewListItem->xItemValue; + + /* If the list already contains a list item with the same item value then + the new list item should be placed after it. This ensures that TCB's which + are stored in ready lists (all of which have the same ulListItem value) + get an equal share of the CPU. However, if the xItemValue is the same as + the back marker the iteration loop below will not end. This means we need + to guard against this by checking the value first and modifying the + algorithm slightly if necessary. */ + if( xValueOfInsertion == portMAX_DELAY ) + { + pxIterator = pxList->xListEnd.pxPrevious; + } + else + { + /* *** NOTE *********************************************************** + If you find your application is crashing here then likely causes are: + 1) Stack overflow - + see http://www.freertos.org/Stacks-and-stack-overflow-checking.html + 2) Incorrect interrupt priority assignment, especially on Cortex-M3 + parts where numerically high priority values denote low actual + interrupt priories, which can seem counter intuitive. See + configMAX_SYSCALL_INTERRUPT_PRIORITY on http://www.freertos.org/a00110.html + 3) Calling an API function from within a critical section or when + the scheduler is suspended, or calling an API function that does + not end in "FromISR" from an interrupt. + 4) Using a queue or semaphore before it has been initialised or + before the scheduler has been started (are interrupts firing + before vTaskStartScheduler() has been called?). + See http://www.freertos.org/FAQHelp.html for more tips. + **********************************************************************/ + + for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */ + { + /* There is nothing to do here, we are just iterating to the + wanted insertion position. */ + } + } + + pxNewListItem->pxNext = pxIterator->pxNext; + pxNewListItem->pxNext->pxPrevious = pxNewListItem; + pxNewListItem->pxPrevious = pxIterator; + pxIterator->pxNext = pxNewListItem; + + /* Remember which list the item is in. This allows fast removal of the + item later. */ + pxNewListItem->pvContainer = ( void * ) pxList; + + ( pxList->uxNumberOfItems )++; +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxListRemove( xListItem * const pxItemToRemove ) +{ +xList * pxList; + + pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious; + pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext; + + /* The list item knows which list it is in. Obtain the list from the list + item. */ + pxList = ( xList * ) pxItemToRemove->pvContainer; + + /* Make sure the index is left pointing to a valid item. */ + if( pxList->pxIndex == pxItemToRemove ) + { + pxList->pxIndex = pxItemToRemove->pxPrevious; + } + + pxItemToRemove->pvContainer = NULL; + ( pxList->uxNumberOfItems )--; + + return pxList->uxNumberOfItems; +} +/*-----------------------------------------------------------*/ + diff --git a/third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c b/third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c new file mode 100644 index 0000000..43407b3 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/port.c @@ -0,0 +1,258 @@ +/* + FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong? * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, training, latest information, + license and contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool. + + Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell + the code with commercial support, indemnification, and middleware, under + the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also + provide a safety engineered and independently SIL3 certified version under + the SafeRTOS brand: http://www.SafeRTOS.com. +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if float_support != FPv4SPD16 + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +/* Constants required to manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL ( ( volatile unsigned long * ) 0xe000e010 ) +#define portNVIC_SYSTICK_LOAD ( ( volatile unsigned long * ) 0xe000e014 ) +#define portNVIC_INT_CTRL ( ( volatile unsigned long * ) 0xe000ed04 ) +#define portNVIC_SYSPRI2 ( ( volatile unsigned long * ) 0xe000ed20 ) +#define portNVIC_SYSTICK_CLK 0x00000004 +#define portNVIC_SYSTICK_INT 0x00000002 +#define portNVIC_SYSTICK_ENABLE 0x00000001 +#define portNVIC_PENDSVSET 0x10000000 +#define portNVIC_PENDSV_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 16 ) +#define portNVIC_SYSTICK_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24 ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile unsigned long * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Functions defined in portasm.s to enable the VFP. + */ +extern void vPortEnableVFP( void ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = 0; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portBASE_TYPE xPortStartScheduler( void ) +{ + /* Make PendSV and SysTick the lowest priority interrupts. */ + *(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI; + *(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the CM4F port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortYieldFromISR( void ) +{ + /* Set a PendSV to request a context switch. */ + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; + /* Barriers are normally not required but do ensure the code is completely + within the specified behaviour for the architecture. */ + __asm ( "dsb" ); + __asm ( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ +unsigned long ulDummy; + + /* If using preemption, also force a context switch. */ + #if configUSE_PREEMPTION == 1 + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; + #endif + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + xTaskIncrementTick(); + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +void prvSetupTimerInterrupt( void ) +{ + /* Configure SysTick to interrupt at the requested rate. */ + *(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + *(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + diff --git a/third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm b/third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm new file mode 100644 index 0000000..17e37f9 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/portasm.asm @@ -0,0 +1,193 @@ + +; FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd. + + +; *************************************************************************** +; * * +; * FreeRTOS tutorial books are available in pdf and paperback. * +; * Complete, revised, and edited pdf reference manuals are also * +; * available. * +; * * +; * Purchasing FreeRTOS documentation will not only help you, by * +; * ensuring you get running as quickly as possible and with an * +; * in-depth knowledge of how to use FreeRTOS, it will also help * +; * the FreeRTOS project to continue with its mission of providing * +; * professional grade, cross platform, de facto standard solutions * +; * for microcontrollers - completely free of charge! * +; * * +; * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * +; * * +; * Thank you for using FreeRTOS, and thank you for your support! * +; * * +; *************************************************************************** + + +; This file is part of the FreeRTOS distribution. + +; FreeRTOS is free software; you can redistribute it and/or modify it under +; the terms of the GNU General Public License (version 2) as published by the +; Free Software Foundation AND MODIFIED BY the FreeRTOS exception. +; >>>NOTE<<< The modification to the GPL is included to allow you to +; distribute a combined work that includes FreeRTOS without being obliged to +; provide the source code for proprietary components outside of the FreeRTOS +; kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it +; can be viewed here: http://www.freertos.org/a00114.html and also obtained +; by writing to Richard Barry, contact details for whom are available on the +; FreeRTOS WEB site. + +; 1 tab == 4 spaces! + +; *************************************************************************** +; * * +; * Having a problem? Start by reading the FAQ "My application does * +; * not run, what could be wrong? * +; * * +; * http://www.FreeRTOS.org/FAQHelp.html * +; * * +; *************************************************************************** + + +; http://www.FreeRTOS.org - Documentation, training, latest information, +; license and contact details. + +; http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, +; including FreeRTOS+Trace - an indispensable productivity tool. + +; Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell +; the code with commercial support, indemnification, and middleware, under +; the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also +; provide a safety engineered and independently SIL3 certified version under +; the SafeRTOS brand: http://www.SafeRTOS.com. + + + .cdecls C, NOLIST, WARN, "FreeRTOSConfig.h" + + .thumb + .text + + .global vTaskSwitchContext + .global pxCurrentTCB +pxCurrentTCBvalue .word pxCurrentTCB + + .global xPortPendSVHandler + .global vPortSetInterruptMask + .global vPortClearInterruptMask + .global vPortSVCHandler + .global vPortStartFirstTask + .global vPortEnableVFP + + +;----------------------------------------------------------- + +xPortPendSVHandler: + mrs r0, psp + + ; Get the location of the current TCB. + ldr r3, pxCurrentTCBvalue + ldr r2, [r3] + + ; Is the task using the FPU context? If so, push high vfp registers. + tst r14, #0x10 + it EQ + vstmdbeq r0!, {s16-s31} + + ; Save the core registers. + stmdb r0!, {r4-r11, r14} + + ; Save the new top of stack into the first member of the TCB. + str r0, [r2] + + stmdb sp!, {r3, r14} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3, r14} + + ; The first item in pxCurrentTCB is the task top of stack. + ldr r1, [r3] + ldr r0, [r1] + + ; Pop the core registers. + ldmia r0!, {r4-r11, r14} + + ; Is the task using the FPU context? If so, pop the high vfp registers + ; too. + tst r14, #0x10 + it EQ + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + bx r14 + + +;----------------------------------------------------------- + +vPortSetInterruptMask: + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr BASEPRI, r0 + + bx r14 + +;----------------------------------------------------------- + +vPortClearInterruptMask: + mov r0, #0 + msr BASEPRI, r0 + + bx r14 + +;----------------------------------------------------------- + +vPortSVCHandler: + ; Get the location of the current TCB. + ldr r3, pxCurrentTCBvalue + ldr r1, [r3] + ldr r0, [r1] + ; Pop the core registers. + ldmia r0!, {r4-r11, r14} + msr psp, r0 + mov r0, #0 + msr basepri, r0 + bx r14 + +;----------------------------------------------------------- + +vPortStartFirstTask: +; Vector Table offset. +VTABLE .set 0xE000ED08 + + ; Use the NVIC offset register to locate the stack. + MOVW r0, #VTABLE & 0xFFFF + MOVT r0, #VTABLE >> 16 + ldr r0, [r0] + ldr r0, [r0] + ; Set the msp back to the start of the stack. + msr msp, r0 + ; Call SVC to start the first task. + cpsie i + svc #0 + +;----------------------------------------------------------- + +vPortEnableVFP: +; CAPCR Register address. +CPACR .set 0xE000ED88 + + ; The FPU enable bits are in the CPACR. + MOVW r0, #CPACR & 0xFFFF + MOVT r0, #CPACR >> 16 + ldr r1, [r0] + + ; Enable CP10 and CP11 coprocessors, then save back. + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + + + .end diff --git a/third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/portmacro.h b/third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..7520d59 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/CCS/ARM_CM4F/portmacro.h @@ -0,0 +1,151 @@ +/* + FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd. + + + *************************************************************************** + * * + * FreeRTOS tutorial books are available in pdf and paperback. * + * Complete, revised, and edited pdf reference manuals are also * + * available. * + * * + * Purchasing FreeRTOS documentation will not only help you, by * + * ensuring you get running as quickly as possible and with an * + * in-depth knowledge of how to use FreeRTOS, it will also help * + * the FreeRTOS project to continue with its mission of providing * + * professional grade, cross platform, de facto standard solutions * + * for microcontrollers - completely free of charge! * + * * + * >>> See http://www.FreeRTOS.org/Documentation for details. <<< * + * * + * Thank you for using FreeRTOS, and thank you for your support! * + * * + *************************************************************************** + + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + >>>NOTE<<< The modification to the GPL is included to allow you to + distribute a combined work that includes FreeRTOS without being obliged to + provide the source code for proprietary components outside of the FreeRTOS + kernel. FreeRTOS 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 and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong? * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + + http://www.FreeRTOS.org - Documentation, training, latest information, + license and contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool. + + Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell + the code with commercial support, indemnification, and middleware, under + the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also + provide a safety engineered and independently SIL3 certified version under + the SafeRTOS brand: http://www.SafeRTOS.com. +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned portLONG +#define portBASE_TYPE long + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef unsigned portSHORT portTickType; + #define portMAX_DELAY ( portTickType ) 0xffff +#else + typedef unsigned portLONG portTickType; + #define portMAX_DELAY ( portTickType ) 0xffffffff +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ +extern void vPortYield( void ); +extern void vPortYieldFromISR( void ); + +#define portYIELD() vPortYield() +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) vPortYieldFromISR() +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern void vPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( void ); + +#define portDISABLE_INTERRUPTS() vPortSetInterruptMask() +#define portENABLE_INTERRUPTS() vPortClearInterruptMask() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() 0;vPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask();(void)x + +/* There are an uneven number of items on the initial stack, so +portALIGNMENT_ASSERT_pxCurrentTCB() will trigger false positive asserts. */ +#define portALIGNMENT_ASSERT_pxCurrentTCB ( void ) + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portNOP() + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/third_party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c b/third_party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c new file mode 100644 index 0000000..1a33e73 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/GCC/ARM_CM3/port.c @@ -0,0 +1,718 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM3 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is +defined. The value should also ensure backward compatibility. +FreeRTOS.org versions prior to V4.4.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile unsigned long * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile unsigned long * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile unsigned long * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile unsigned long * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( unsigned char ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( unsigned char ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( unsigned char ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000UL ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case is messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__ (( naked )); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__ (( naked )); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ) __attribute__ (( naked )); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static unsigned char ucMaxSysCallPriority = 0; + static unsigned long ulMaxPRIGROUPValue = 0; + static const volatile unsigned char * const pcInterruptPriorityRegisters = ( const volatile unsigned char * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) portTASK_RETURN_ADDRESS; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ + " ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n" /* Restore the task stack pointer. */ + " mov r0, #0 \n" + " msr basepri, r0 \n" + " orr r14, #0xd \n" + " bx r14 \n" + " \n" + " .align 2 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + __asm volatile( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " cpsie i \n" /* Globally enable interrupts. */ + " svc 0 \n" /* System call to start first task. */ + " nop \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portBASE_TYPE xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile unsigned long ulOriginalPriority; + volatile char * const pcFirstUserPriorityRegister = ( volatile char * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile unsigned char ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pcFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pcFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pcFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( unsigned char ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pcFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the CM3 port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is completely + within the specified behaviour for the architecture. */ + __asm volatile( "dsb" ); + __asm volatile( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __asm volatile( "dsb" ); + __asm volatile( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__attribute__(( naked )) unsigned long ulPortSetInterruptMask( void ) +{ + __asm volatile \ + ( \ + " mrs r0, basepri \n" \ + " mov r1, %0 \n" \ + " msr basepri, r1 \n" \ + " bx lr \n" \ + :: "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "r0", "r1" \ + ); + + /* This return will not be reached but is necessary to prevent compiler + warnings. */ + return 0; +} +/*-----------------------------------------------------------*/ + +__attribute__(( naked )) void vPortClearInterruptMask( unsigned long ulNewMaskValue ) +{ + __asm volatile \ + ( \ + " msr basepri, r0 \n" \ + " bx lr \n" \ + :::"r0" \ + ); + + /* Just to avoid compiler warnings. */ + ( void ) ulNewMaskValue; +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " stmdb r0!, {r4-r11} \n" /* Save the remaining registers. */ + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3, r14} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3, r14} \n" + " \n" /* Restore the context, including the critical nesting count. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11} \n" /* Pop the registers. */ + " msr psp, r0 \n" + " bx r14 \n" + " \n" + " .align 2 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __attribute__((weak)) void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ) + { + unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + portTickType xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __asm volatile( "cpsid i" ); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm volatile( "cpsie i" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __asm volatile( "dsb" ); + __asm volatile( "wfi" ); + __asm volatile( "isb" ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm volatile( "cpsie i" ); + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + unsigned long ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1 ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__(( weak )) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + unsigned long ulCurrentInterrupt; + unsigned char ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/FreeRTOS/Source/portable/GCC/ARM_CM3/portmacro.h b/third_party/FreeRTOS/Source/portable/GCC/ARM_CM3/portmacro.h new file mode 100644 index 0000000..9a164ed --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/GCC/ARM_CM3/portmacro.h @@ -0,0 +1,187 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned portLONG +#define portBASE_TYPE long + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef unsigned portSHORT portTickType; + #define portMAX_DELAY ( portTickType ) 0xffff +#else + typedef unsigned portLONG portTickType; + #define portMAX_DELAY ( portTickType ) 0xffffffff +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ +extern void vPortYield( void ); +#define portNVIC_INT_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portYIELD() vPortYield() +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern unsigned long ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( unsigned long ulNewMaskValue ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) +#define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() +#define portENABLE_INTERRUPTS() vPortClearInterruptMask(0) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline unsigned char ucPortCountLeadingZeros( unsigned long ulBitmap ) + { + unsigned char ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/third_party/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c b/third_party/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c new file mode 100644 index 0000000..8b3d9a4 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/port.c @@ -0,0 +1,1246 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM3 port. + *----------------------------------------------------------*/ + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* Constants required to access and manipulate the NVIC. */ +#define portNVIC_SYSTICK_CTRL ( ( volatile unsigned long * ) 0xe000e010 ) +#define portNVIC_SYSTICK_LOAD ( ( volatile unsigned long * ) 0xe000e014 ) +#define portNVIC_SYSPRI2 ( ( volatile unsigned long * ) 0xe000ed20 ) +#define portNVIC_SYSPRI1 ( ( volatile unsigned long * ) 0xe000ed1c ) +#define portNVIC_SYS_CTRL_STATE ( ( volatile unsigned long * ) 0xe000ed24 ) +#define portNVIC_MEM_FAULT_ENABLE ( 1UL << 16UL ) + +/* Constants required to access and manipulate the MPU. */ +#define portMPU_TYPE ( ( volatile unsigned long * ) 0xe000ed90 ) +#define portMPU_REGION_BASE_ADDRESS ( ( volatile unsigned long * ) 0xe000ed9C ) +#define portMPU_REGION_ATTRIBUTE ( ( volatile unsigned long * ) 0xe000edA0 ) +#define portMPU_CTRL ( ( volatile unsigned long * ) 0xe000ed94 ) +#define portEXPECTED_MPU_TYPE_VALUE ( 8UL << 8UL ) /* 8 regions, unified. */ +#define portMPU_ENABLE ( 0x01UL ) +#define portMPU_BACKGROUND_ENABLE ( 1UL << 2UL ) +#define portPRIVILEGED_EXECUTION_START_ADDRESS ( 0UL ) +#define portMPU_REGION_VALID ( 0x10UL ) +#define portMPU_REGION_ENABLE ( 0x01UL ) +#define portPERIPHERALS_START_ADDRESS 0x40000000UL +#define portPERIPHERALS_END_ADDRESS 0x5FFFFFFFUL + +/* Constants required to access and manipulate the SysTick. */ +#define portNVIC_SYSTICK_CLK ( 0x00000004UL ) +#define portNVIC_SYSTICK_INT ( 0x00000002UL ) +#define portNVIC_SYSTICK_ENABLE ( 0x00000001UL ) +#define portNVIC_PENDSV_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) +#define portNVIC_SVC_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_CONTROL_IF_UNPRIVILEGED ( 0x03 ) +#define portINITIAL_CONTROL_IF_PRIVILEGED ( 0x02 ) + +/* Offsets in the stack to the parameters when inside the SVC handler. */ +#define portOFFSET_TO_PC ( 6 ) + +/* Set the privilege level to user mode if xRunningPrivileged is false. */ +#define portRESET_PRIVILEGE( xRunningPrivileged ) if( xRunningPrivileged != pdTRUE ) __asm volatile ( " mrs r0, control \n orr r0, #1 \n msr control, r0" :::"r0" ) + +/* Each task maintains its own interrupt status in the critical nesting +variable. Note this is not saved as part of the task context as context +switches can only occur when uxCriticalNesting is zero. */ +static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. + */ +static void prvSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION; + +/* + * Configure a number of standard MPU regions that are used by all tasks. + */ +static void prvSetupMPU( void ) PRIVILEGED_FUNCTION; + +/* + * Return the smallest MPU region size that a given number of bytes will fit + * into. The region size is returned as the value that should be programmed + * into the region attribute register for that region. + */ +static unsigned long prvGetMPURegionSizeSetting( unsigned long ulActualSizeInBytes ) PRIVILEGED_FUNCTION; + +/* + * Checks to see if being called from the context of an unprivileged task, and + * if so raises the privilege level and returns false - otherwise does nothing + * other than return true. + */ +static portBASE_TYPE prvRaisePrivilege( void ) __attribute__(( naked )); + +/* + * Standard FreeRTOS exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION; +void xPortSysTickHandler( void ) __attribute__ ((optimize("3"))) PRIVILEGED_FUNCTION; +void vPortSVCHandler( void ) __attribute__ (( naked )) PRIVILEGED_FUNCTION; + +/* + * Starts the scheduler by restoring the context of the first task to run. + */ +static void prvRestoreContextOfFirstTask( void ) __attribute__(( naked )) PRIVILEGED_FUNCTION; + +/* + * C portion of the SVC handler. The SVC handler is split between an asm entry + * and a C wrapper for simplicity of coding and maintenance. + */ +static void prvSVCHandler( unsigned long *pulRegisters ) __attribute__(( noinline )) PRIVILEGED_FUNCTION; + +/* + * Prototypes for all the MPU wrappers. + */ +signed portBASE_TYPE MPU_xTaskGenericCreate( pdTASK_CODE pvTaskCode, const signed char * const pcName, unsigned short usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask, portSTACK_TYPE *puxStackBuffer, const xMemoryRegion * const xRegions ); +void MPU_vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const xRegions ); +void MPU_vTaskDelete( xTaskHandle pxTaskToDelete ); +void MPU_vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement ); +void MPU_vTaskDelay( portTickType xTicksToDelay ); +unsigned portBASE_TYPE MPU_uxTaskPriorityGet( xTaskHandle pxTask ); +void MPU_vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ); +eTaskState MPU_eTaskGetState( xTaskHandle pxTask ); +void MPU_vTaskSuspend( xTaskHandle pxTaskToSuspend ); +signed portBASE_TYPE MPU_xTaskIsTaskSuspended( xTaskHandle xTask ); +void MPU_vTaskResume( xTaskHandle pxTaskToResume ); +void MPU_vTaskSuspendAll( void ); +signed portBASE_TYPE MPU_xTaskResumeAll( void ); +portTickType MPU_xTaskGetTickCount( void ); +unsigned portBASE_TYPE MPU_uxTaskGetNumberOfTasks( void ); +void MPU_vTaskList( signed char *pcWriteBuffer ); +void MPU_vTaskGetRunTimeStats( signed char *pcWriteBuffer ); +void MPU_vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxTagValue ); +pdTASK_HOOK_CODE MPU_xTaskGetApplicationTaskTag( xTaskHandle xTask ); +portBASE_TYPE MPU_xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter ); +unsigned portBASE_TYPE MPU_uxTaskGetStackHighWaterMark( xTaskHandle xTask ); +xTaskHandle MPU_xTaskGetCurrentTaskHandle( void ); +portBASE_TYPE MPU_xTaskGetSchedulerState( void ); +xTaskHandle MPU_xTaskGetIdleTaskHandle( void ); +unsigned portBASE_TYPE MPU_uxTaskGetSystemState( xTaskStatusType *pxTaskStatusArray, unsigned portBASE_TYPE uxArraySize, unsigned long *pulTotalRunTime ); +xQueueHandle MPU_xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize, unsigned char ucQueueType ); +signed portBASE_TYPE MPU_xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ); +portBASE_TYPE MPU_xQueueGenericReset( xQueueHandle pxQueue, portBASE_TYPE xNewQueue ); +unsigned portBASE_TYPE MPU_uxQueueMessagesWaiting( const xQueueHandle pxQueue ); +signed portBASE_TYPE MPU_xQueueGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ); +xQueueHandle MPU_xQueueCreateMutex( void ); +xQueueHandle MPU_xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ); +portBASE_TYPE MPU_xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime ); +portBASE_TYPE MPU_xQueueGiveMutexRecursive( xQueueHandle xMutex ); +signed portBASE_TYPE MPU_xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ); +signed portBASE_TYPE MPU_xQueueAltGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ); +void MPU_vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcName ); +void MPU_vQueueDelete( xQueueHandle xQueue ); +void *MPU_pvPortMalloc( size_t xSize ); +void MPU_vPortFree( void *pv ); +void MPU_vPortInitialiseBlocks( void ); +size_t MPU_xPortGetFreeHeapSize( void ); +xQueueSetHandle MPU_xQueueCreateSet( unsigned portBASE_TYPE uxEventQueueLength ); +xQueueSetMemberHandle MPU_xQueueSelectFromSet( xQueueSetHandle xQueueSet, portTickType xBlockTimeTicks ); +portBASE_TYPE MPU_xQueueAddToSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet ); +portBASE_TYPE MPU_xQueueRemoveFromSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet ); +signed portBASE_TYPE MPU_xQueuePeekFromISR( xQueueHandle xQueue, void * const pvBuffer ); + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters, portBASE_TYPE xRunPrivileged ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = 0; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */ + pxTopOfStack -= 9; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + if( xRunPrivileged == pdTRUE ) + { + *pxTopOfStack = portINITIAL_CONTROL_IF_PRIVILEGED; + } + else + { + *pxTopOfStack = portINITIAL_CONTROL_IF_UNPRIVILEGED; + } + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + /* Assumes psp was in use. */ + __asm volatile + ( + #ifndef USE_PROCESS_STACK /* Code should not be required if a main() is using the process stack. */ + " tst lr, #4 \n" + " ite eq \n" + " mrseq r0, msp \n" + " mrsne r0, psp \n" + #else + " mrs r0, psp \n" + #endif + " b %0 \n" + ::"i"(prvSVCHandler):"r0" + ); +} +/*-----------------------------------------------------------*/ + +static void prvSVCHandler( unsigned long *pulParam ) +{ +unsigned char ucSVCNumber; + + /* The stack contains: r0, r1, r2, r3, r12, r14, the return address and + xPSR. The first argument (r0) is pulParam[ 0 ]. */ + ucSVCNumber = ( ( unsigned char * ) pulParam[ portOFFSET_TO_PC ] )[ -2 ]; + switch( ucSVCNumber ) + { + case portSVC_START_SCHEDULER : *(portNVIC_SYSPRI1) |= portNVIC_SVC_PRI; + prvRestoreContextOfFirstTask(); + break; + + case portSVC_YIELD : *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; + /* Barriers are normally not required + but do ensure the code is completely + within the specified behaviour for the + architecture. */ + __asm volatile( "dsb" ); + __asm volatile( "isb" ); + + break; + + case portSVC_RAISE_PRIVILEGE : __asm volatile + ( + " mrs r1, control \n" /* Obtain current control value. */ + " bic r1, #1 \n" /* Set privilege bit. */ + " msr control, r1 \n" /* Write back new control value. */ + :::"r1" + ); + break; + + default : /* Unknown SVC call. */ + break; + } +} +/*-----------------------------------------------------------*/ + +static void prvRestoreContextOfFirstTask( void ) +{ + __asm volatile + ( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n" /* Move onto the second item in the TCB... */ + " ldr r2, =0xe000ed9c \n" /* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */ + " stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */ + " ldmia r0!, {r3, r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " msr psp, r0 \n" /* Restore the task stack pointer. */ + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldr r14, =0xfffffffd \n" /* Load exec return code. */ + " bx r14 \n" + " \n" + " .align 2 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portBASE_TYPE xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See + http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) ); + + /* Make PendSV and SysTick the same priority as the kernel. */ + *(portNVIC_SYSPRI2) |= portNVIC_PENDSV_PRI; + *(portNVIC_SYSPRI2) |= portNVIC_SYSTICK_PRI; + + /* Configure the regions in the MPU that are common to all tasks. */ + prvSetupMPU(); + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + prvSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + __asm volatile( " svc %0 \n" + :: "i" (portSVC_START_SCHEDULER) ); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the CM3 port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + + portRESET_PRIVILEGE( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } + portRESET_PRIVILEGE( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " mrs r1, control \n" + " stmdb r0!, {r1, r4-r11} \n" /* Save the remaining registers. */ + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3, r14} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3, r14} \n" + " \n" /* Restore the context. */ + " ldr r1, [r3] \n" + " ldr r0, [r1] \n" /* The first item in the TCB is the task top of stack. */ + " add r1, r1, #4 \n" /* Move onto the second item in the TCB... */ + " ldr r2, =0xe000ed9c \n" /* Region Base Address register. */ + " ldmia r1!, {r4-r11} \n" /* Read 4 sets of MPU registers. */ + " stmia r2!, {r4-r11} \n" /* Write 4 sets of MPU registers. */ + " ldmia r0!, {r3, r4-r11} \n" /* Pop the registers that are not automatically saved on exception entry. */ + " msr control, r3 \n" + " \n" + " msr psp, r0 \n" + " bx r14 \n" + " \n" + " .align 2 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ +unsigned long ulDummy; + + ulDummy = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* Pend a context switch. */ + *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( ulDummy ); +} +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +static void prvSetupTimerInterrupt( void ) +{ + /* Configure SysTick to interrupt at the requested rate. */ + *(portNVIC_SYSTICK_LOAD) = ( configCPU_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; + *(portNVIC_SYSTICK_CTRL) = portNVIC_SYSTICK_CLK | portNVIC_SYSTICK_INT | portNVIC_SYSTICK_ENABLE; +} +/*-----------------------------------------------------------*/ + +static void prvSetupMPU( void ) +{ +extern unsigned long __privileged_functions_end__[]; +extern unsigned long __FLASH_segment_start__[]; +extern unsigned long __FLASH_segment_end__[]; +extern unsigned long __privileged_data_start__[]; +extern unsigned long __privileged_data_end__[]; + + /* Check the expected MPU is present. */ + if( *portMPU_TYPE == portEXPECTED_MPU_TYPE_VALUE ) + { + /* First setup the entire flash for unprivileged read only access. */ + *portMPU_REGION_BASE_ADDRESS = ( ( unsigned long ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portUNPRIVILEGED_FLASH_REGION ); + + *portMPU_REGION_ATTRIBUTE = ( portMPU_REGION_READ_ONLY ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( unsigned long ) __FLASH_segment_end__ - ( unsigned long ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the first 16K for privileged only access (even though less + than 10K is actually being used). This is where the kernel code is + placed. */ + *portMPU_REGION_BASE_ADDRESS = ( ( unsigned long ) __FLASH_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_FLASH_REGION ); + + *portMPU_REGION_ATTRIBUTE = ( portMPU_REGION_PRIVILEGED_READ_ONLY ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( unsigned long ) __privileged_functions_end__ - ( unsigned long ) __FLASH_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Setup the privileged data RAM region. This is where the kernel data + is placed. */ + *portMPU_REGION_BASE_ADDRESS = ( ( unsigned long ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portPRIVILEGED_RAM_REGION ); + + *portMPU_REGION_ATTRIBUTE = ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + prvGetMPURegionSizeSetting( ( unsigned long ) __privileged_data_end__ - ( unsigned long ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* By default allow everything to access the general peripherals. The + system peripherals and registers are protected. */ + *portMPU_REGION_BASE_ADDRESS = ( portPERIPHERALS_START_ADDRESS ) | + ( portMPU_REGION_VALID ) | + ( portGENERAL_PERIPHERALS_REGION ); + + *portMPU_REGION_ATTRIBUTE = ( portMPU_REGION_READ_WRITE | portMPU_REGION_EXECUTE_NEVER ) | + ( prvGetMPURegionSizeSetting( portPERIPHERALS_END_ADDRESS - portPERIPHERALS_START_ADDRESS ) ) | + ( portMPU_REGION_ENABLE ); + + /* Enable the memory fault exception. */ + *portNVIC_SYS_CTRL_STATE |= portNVIC_MEM_FAULT_ENABLE; + + /* Enable the MPU with the background region configured. */ + *portMPU_CTRL |= ( portMPU_ENABLE | portMPU_BACKGROUND_ENABLE ); + } +} +/*-----------------------------------------------------------*/ + +static unsigned long prvGetMPURegionSizeSetting( unsigned long ulActualSizeInBytes ) +{ +unsigned long ulRegionSize, ulReturnValue = 4; + + /* 32 is the smallest region size, 31 is the largest valid value for + ulReturnValue. */ + for( ulRegionSize = 32UL; ulReturnValue < 31UL; ( ulRegionSize <<= 1UL ) ) + { + if( ulActualSizeInBytes <= ulRegionSize ) + { + break; + } + else + { + ulReturnValue++; + } + } + + /* Shift the code by one before returning so it can be written directly + into the the correct bit position of the attribute register. */ + return ( ulReturnValue << 1UL ); +} +/*-----------------------------------------------------------*/ + +static portBASE_TYPE prvRaisePrivilege( void ) +{ + __asm volatile + ( + " mrs r0, control \n" + " tst r0, #1 \n" /* Is the task running privileged? */ + " itte ne \n" + " movne r0, #0 \n" /* CONTROL[0]!=0, return false. */ + " svcne %0 \n" /* Switch to privileged. */ + " moveq r0, #1 \n" /* CONTROL[0]==0, return true. */ + " bx lr \n" + :: "i" (portSVC_RAISE_PRIVILEGE) : "r0" + ); + + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortStoreTaskMPUSettings( xMPU_SETTINGS *xMPUSettings, const struct xMEMORY_REGION * const xRegions, portSTACK_TYPE *pxBottomOfStack, unsigned short usStackDepth ) +{ +extern unsigned long __SRAM_segment_start__[]; +extern unsigned long __SRAM_segment_end__[]; +extern unsigned long __privileged_data_start__[]; +extern unsigned long __privileged_data_end__[]; +long lIndex; +unsigned long ul; + + if( xRegions == NULL ) + { + /* No MPU regions are specified so allow access to all RAM. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( unsigned long ) __SRAM_segment_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( prvGetMPURegionSizeSetting( ( unsigned long ) __SRAM_segment_end__ - ( unsigned long ) __SRAM_segment_start__ ) ) | + ( portMPU_REGION_ENABLE ); + + /* Re-instate the privileged only RAM region as xRegion[ 0 ] will have + just removed the privileged only parameters. */ + xMPUSettings->xRegion[ 1 ].ulRegionBaseAddress = + ( ( unsigned long ) __privileged_data_start__ ) | /* Base address. */ + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + 1 ); + + xMPUSettings->xRegion[ 1 ].ulRegionAttribute = + ( portMPU_REGION_PRIVILEGED_READ_WRITE ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + prvGetMPURegionSizeSetting( ( unsigned long ) __privileged_data_end__ - ( unsigned long ) __privileged_data_start__ ) | + ( portMPU_REGION_ENABLE ); + + /* Invalidate all other regions. */ + for( ul = 2; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + } + else + { + /* This function is called automatically when the task is created - in + which case the stack region parameters will be valid. At all other + times the stack parameters will not be valid and it is assumed that the + stack region has already been configured. */ + if( usStackDepth > 0 ) + { + /* Define the region that allows access to the stack. */ + xMPUSettings->xRegion[ 0 ].ulRegionBaseAddress = + ( ( unsigned long ) pxBottomOfStack ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION ); /* Region number. */ + + xMPUSettings->xRegion[ 0 ].ulRegionAttribute = + ( portMPU_REGION_READ_WRITE ) | /* Read and write. */ + ( prvGetMPURegionSizeSetting( ( unsigned long ) usStackDepth * ( unsigned long ) sizeof( portSTACK_TYPE ) ) ) | + ( portMPU_REGION_CACHEABLE_BUFFERABLE ) | + ( portMPU_REGION_ENABLE ); + } + + lIndex = 0; + + for( ul = 1; ul <= portNUM_CONFIGURABLE_REGIONS; ul++ ) + { + if( ( xRegions[ lIndex ] ).ulLengthInBytes > 0UL ) + { + /* Translate the generic region definition contained in + xRegions into the CM3 specific MPU settings that are then + stored in xMPUSettings. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = + ( ( unsigned long ) xRegions[ lIndex ].pvBaseAddress ) | + ( portMPU_REGION_VALID ) | + ( portSTACK_REGION + ul ); /* Region number. */ + + xMPUSettings->xRegion[ ul ].ulRegionAttribute = + ( prvGetMPURegionSizeSetting( xRegions[ lIndex ].ulLengthInBytes ) ) | + ( xRegions[ lIndex ].ulParameters ) | + ( portMPU_REGION_ENABLE ); + } + else + { + /* Invalidate the region. */ + xMPUSettings->xRegion[ ul ].ulRegionBaseAddress = ( portSTACK_REGION + ul ) | portMPU_REGION_VALID; + xMPUSettings->xRegion[ ul ].ulRegionAttribute = 0UL; + } + + lIndex++; + } + } +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE MPU_xTaskGenericCreate( pdTASK_CODE pvTaskCode, const signed char * const pcName, unsigned short usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask, portSTACK_TYPE *puxStackBuffer, const xMemoryRegion * const xRegions ) +{ +signed portBASE_TYPE xReturn; +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xTaskGenericCreate( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask, puxStackBuffer, xRegions ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +void MPU_vTaskAllocateMPURegions( xTaskHandle xTask, const xMemoryRegion * const xRegions ) +{ +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vTaskAllocateMPURegions( xTask, xRegions ); + portRESET_PRIVILEGE( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + void MPU_vTaskDelete( xTaskHandle pxTaskToDelete ) + { + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vTaskDelete( pxTaskToDelete ); + portRESET_PRIVILEGE( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelayUntil == 1 ) + void MPU_vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement ) + { + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement ); + portRESET_PRIVILEGE( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelay == 1 ) + void MPU_vTaskDelay( portTickType xTicksToDelay ) + { + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vTaskDelay( xTicksToDelay ); + portRESET_PRIVILEGE( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + unsigned portBASE_TYPE MPU_uxTaskPriorityGet( xTaskHandle pxTask ) + { + unsigned portBASE_TYPE uxReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + uxReturn = uxTaskPriorityGet( pxTask ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return uxReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskPrioritySet == 1 ) + void MPU_vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority ) + { + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vTaskPrioritySet( pxTask, uxNewPriority ); + portRESET_PRIVILEGE( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_eTaskGetState == 1 ) + eTaskState MPU_eTaskGetState( xTaskHandle pxTask ) + { + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + eTaskState eReturn; + + eReturn = eTaskGetState( pxTask ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return eReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + xTaskHandle MPU_xTaskGetIdleTaskHandle( void ) + { + xTaskHandle xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xTaskGetIdleTaskHandle(); + portRESET_PRIVILEGE( xRunningPrivileged ); + return eReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + void MPU_vTaskSuspend( xTaskHandle pxTaskToSuspend ) + { + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vTaskSuspend( pxTaskToSuspend ); + portRESET_PRIVILEGE( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + signed portBASE_TYPE MPU_xTaskIsTaskSuspended( xTaskHandle xTask ) + { + signed portBASE_TYPE xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xTaskIsTaskSuspended( xTask ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + void MPU_vTaskResume( xTaskHandle pxTaskToResume ) + { + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vTaskResume( pxTaskToResume ); + portRESET_PRIVILEGE( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +void MPU_vTaskSuspendAll( void ) +{ +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vTaskSuspendAll(); + portRESET_PRIVILEGE( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE MPU_xTaskResumeAll( void ) +{ +signed portBASE_TYPE xReturn; +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xTaskResumeAll(); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +portTickType MPU_xTaskGetTickCount( void ) +{ +portTickType xReturn; +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xTaskGetTickCount(); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE MPU_uxTaskGetNumberOfTasks( void ) +{ +unsigned portBASE_TYPE uxReturn; +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + uxReturn = uxTaskGetNumberOfTasks(); + portRESET_PRIVILEGE( xRunningPrivileged ); + return uxReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + void MPU_vTaskList( signed char *pcWriteBuffer ) + { + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vTaskList( pcWriteBuffer ); + portRESET_PRIVILEGE( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + void MPU_vTaskGetRunTimeStats( signed char *pcWriteBuffer ) + { + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vTaskGetRunTimeStats( pcWriteBuffer ); + portRESET_PRIVILEGE( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + void MPU_vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxTagValue ) + { + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vTaskSetApplicationTaskTag( xTask, pxTagValue ); + portRESET_PRIVILEGE( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + pdTASK_HOOK_CODE MPU_xTaskGetApplicationTaskTag( xTaskHandle xTask ) + { + pdTASK_HOOK_CODE xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xTaskGetApplicationTaskTag( xTask ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + portBASE_TYPE MPU_xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter ) + { + portBASE_TYPE xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xTaskCallApplicationTaskHook( xTask, pvParameter ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + unsigned portBASE_TYPE MPU_uxTaskGetSystemState( xTaskStatusType *pxTaskStatusArray, unsigned portBASE_TYPE uxArraySize, unsigned long *pulTotalRunTime ) + { + unsigned portBASE_TYPE uxReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + uxReturn = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, pulTotalRunTime ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + unsigned portBASE_TYPE MPU_uxTaskGetStackHighWaterMark( xTaskHandle xTask ) + { + unsigned portBASE_TYPE uxReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + uxReturn = uxTaskGetStackHighWaterMark( xTask ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return uxReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) + xTaskHandle MPU_xTaskGetCurrentTaskHandle( void ) + { + xTaskHandle xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xTaskGetCurrentTaskHandle(); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetSchedulerState == 1 ) + portBASE_TYPE MPU_xTaskGetSchedulerState( void ) + { + portBASE_TYPE xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xTaskGetSchedulerState(); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +xQueueHandle MPU_xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize, unsigned char ucQueueType ) +{ +xQueueHandle xReturn; +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xQueueGenericCreate( uxQueueLength, uxItemSize, ucQueueType ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE MPU_xQueueGenericReset( xQueueHandle pxQueue, portBASE_TYPE xNewQueue ) +{ +portBASE_TYPE xReturn; +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xQueueGenericReset( pxQueue, xNewQueue ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE MPU_xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) +{ +signed portBASE_TYPE xReturn; +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, xCopyPosition ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE MPU_uxQueueMessagesWaiting( const xQueueHandle pxQueue ) +{ +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); +unsigned portBASE_TYPE uxReturn; + + uxReturn = uxQueueMessagesWaiting( pxQueue ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return uxReturn; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE MPU_xQueueGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) +{ +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); +signed portBASE_TYPE xReturn; + + xReturn = xQueueGenericReceive( pxQueue, pvBuffer, xTicksToWait, xJustPeeking ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE MPU_xQueuePeekFromISR( xQueueHandle pxQueue, void * const pvBuffer ) +{ +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); +signed portBASE_TYPE xReturn; + + xReturn = xQueuePeekFromISR( pxQueue, pvBuffer ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + xQueueHandle MPU_xQueueCreateMutex( void ) + { + xQueueHandle xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xQueueCreateMutex( queueQUEUE_TYPE_MUTEX ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if configUSE_COUNTING_SEMAPHORES == 1 + xQueueHandle MPU_xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ) + { + xQueueHandle xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xQueueCreateCountingSemaphore( uxCountValue, uxInitialCount ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + portBASE_TYPE MPU_xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime ) + { + portBASE_TYPE xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xQueueTakeMutexRecursive( xMutex, xBlockTime ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + portBASE_TYPE MPU_xQueueGiveMutexRecursive( xQueueHandle xMutex ) + { + portBASE_TYPE xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xQueueGiveMutexRecursive( xMutex ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + xQueueSetHandle MPU_xQueueCreateSet( unsigned portBASE_TYPE uxEventQueueLength ) + { + xQueueSetHandle xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xQueueCreateSet( uxEventQueueLength ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + xQueueSetMemberHandle MPU_xQueueSelectFromSet( xQueueSetHandle xQueueSet, portTickType xBlockTimeTicks ) + { + xQueueSetMemberHandle xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xQueueSelectFromSet( xQueueSet, xBlockTimeTicks ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + portBASE_TYPE MPU_xQueueAddToSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet ) + { + portBASE_TYPE xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xQueueAddToSet( xQueueOrSemaphore, xQueueSet ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + portBASE_TYPE MPU_xQueueRemoveFromSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet ) + { + portBASE_TYPE xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xQueueRemoveFromSet( xQueueOrSemaphore, xQueueSet ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if configUSE_ALTERNATIVE_API == 1 + signed portBASE_TYPE MPU_xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) + { + signed portBASE_TYPE xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = signed portBASE_TYPE xQueueAltGenericSend( pxQueue, pvItemToQueue, xTicksToWait, xCopyPosition ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if configUSE_ALTERNATIVE_API == 1 + signed portBASE_TYPE MPU_xQueueAltGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) + { + signed portBASE_TYPE xReturn; + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xQueueAltGenericReceive( pxQueue, pvBuffer, xTicksToWait, xJustPeeking ); + portRESET_PRIVILEGE( xRunningPrivileged ); + return xReturn; + } +#endif +/*-----------------------------------------------------------*/ + +#if configQUEUE_REGISTRY_SIZE > 0 + void MPU_vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcName ) + { + portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vQueueAddToRegistry( xQueue, pcName ); + + portRESET_PRIVILEGE( xRunningPrivileged ); + } +#endif +/*-----------------------------------------------------------*/ + +void MPU_vQueueDelete( xQueueHandle xQueue ) +{ +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vQueueDelete( xQueue ); + + portRESET_PRIVILEGE( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +void *MPU_pvPortMalloc( size_t xSize ) +{ +void *pvReturn; +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + pvReturn = pvPortMalloc( xSize ); + + portRESET_PRIVILEGE( xRunningPrivileged ); + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void MPU_vPortFree( void *pv ) +{ +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vPortFree( pv ); + + portRESET_PRIVILEGE( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +void MPU_vPortInitialiseBlocks( void ) +{ +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + vPortInitialiseBlocks(); + + portRESET_PRIVILEGE( xRunningPrivileged ); +} +/*-----------------------------------------------------------*/ + +size_t MPU_xPortGetFreeHeapSize( void ) +{ +size_t xReturn; +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + xReturn = xPortGetFreeHeapSize(); + + portRESET_PRIVILEGE( xRunningPrivileged ); + + return xReturn; +} + +/* Functions that the application writer wants to execute in privileged mode +can be defined in application_defined_privileged_functions.h. The functions +must take the same format as those above whereby the privilege state on exit +equals the privilege state on entry. For example: + +void MPU_FunctionName( [parameters ] ) +{ +portBASE_TYPE xRunningPrivileged = prvRaisePrivilege(); + + FunctionName( [parameters ] ); + + portRESET_PRIVILEGE( xRunningPrivileged ); +} +*/ + +#if configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS == 1 + #include "application_defined_privileged_functions.h" +#endif + diff --git a/third_party/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/portmacro.h b/third_party/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/portmacro.h new file mode 100644 index 0000000..eb4cafa --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/GCC/ARM_CM3_MPU/portmacro.h @@ -0,0 +1,214 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned portLONG +#define portBASE_TYPE long + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef unsigned portSHORT portTickType; + #define portMAX_DELAY ( portTickType ) 0xffff +#else + typedef unsigned portLONG portTickType; + #define portMAX_DELAY ( portTickType ) 0xffffffff +#endif +/*-----------------------------------------------------------*/ + +/* MPU specific constants. */ +#define portUSING_MPU_WRAPPERS 1 +#define portPRIVILEGE_BIT ( 0x80000000UL ) + +#define portMPU_REGION_READ_WRITE ( 0x03UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_ONLY ( 0x05UL << 24UL ) +#define portMPU_REGION_READ_ONLY ( 0x06UL << 24UL ) +#define portMPU_REGION_PRIVILEGED_READ_WRITE ( 0x01UL << 24UL ) +#define portMPU_REGION_CACHEABLE_BUFFERABLE ( 0x07UL << 16UL ) +#define portMPU_REGION_EXECUTE_NEVER ( 0x01UL << 28UL ) + +#define portUNPRIVILEGED_FLASH_REGION ( 0UL ) +#define portPRIVILEGED_FLASH_REGION ( 1UL ) +#define portPRIVILEGED_RAM_REGION ( 2UL ) +#define portGENERAL_PERIPHERALS_REGION ( 3UL ) +#define portSTACK_REGION ( 4UL ) +#define portFIRST_CONFIGURABLE_REGION ( 5UL ) +#define portLAST_CONFIGURABLE_REGION ( 7UL ) +#define portNUM_CONFIGURABLE_REGIONS ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 ) +#define portTOTAL_NUM_REGIONS ( portNUM_CONFIGURABLE_REGIONS + 1 ) /* Plus one to make space for the stack region. */ + +#define portSWITCH_TO_USER_MODE() __asm volatile ( " mrs r0, control \n orr r0, #1 \n msr control, r0 " :::"r0" ) + +typedef struct MPU_REGION_REGISTERS +{ + unsigned portLONG ulRegionBaseAddress; + unsigned portLONG ulRegionAttribute; +} xMPU_REGION_REGISTERS; + +/* Plus 1 to create space for the stack region. */ +typedef struct MPU_SETTINGS +{ + xMPU_REGION_REGISTERS xRegion[ portTOTAL_NUM_REGIONS ]; +} xMPU_SETTINGS; + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* SVC numbers for various services. */ +#define portSVC_START_SCHEDULER 0 +#define portSVC_YIELD 1 +#define portSVC_RAISE_PRIVILEGE 2 + +/* Scheduler utilities. */ + +#define portYIELD() __asm volatile ( " SVC %0 \n" :: "i" (portSVC_YIELD) ) +#define portYIELD_WITHIN_API() *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET + +#define portNVIC_INT_CTRL ( ( volatile unsigned portLONG *) 0xe000ed04 ) +#define portNVIC_PENDSVSET 0x10000000 +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) *(portNVIC_INT_CTRL) = portNVIC_PENDSVSET +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + + +/* Critical section management. */ + +/* + * Set basepri to portMAX_SYSCALL_INTERRUPT_PRIORITY without effecting other + * registers. r0 is clobbered. + */ +#define portSET_INTERRUPT_MASK() \ + __asm volatile \ + ( \ + " mov r0, %0 \n" \ + " msr basepri, r0 \n" \ + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY):"r0" \ + ) + +/* + * Set basepri back to 0 without effective other registers. + * r0 is clobbered. FAQ: Setting BASEPRI to 0 is not a bug. Please see + * http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html before disagreeing. + */ +#define portCLEAR_INTERRUPT_MASK() \ + __asm volatile \ + ( \ + " mov r0, #0 \n" \ + " msr basepri, r0 \n" \ + :::"r0" \ + ) + +/* FAQ: Setting BASEPRI to 0 is not a bug. Please see +http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html before disagreeing. */ +#define portSET_INTERRUPT_MASK_FROM_ISR() 0;portSET_INTERRUPT_MASK() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) portCLEAR_INTERRUPT_MASK();(void)x + + +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() portSET_INTERRUPT_MASK() +#define portENABLE_INTERRUPTS() portCLEAR_INTERRUPT_MASK() +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#define portNOP() + + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/third_party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c b/third_party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c new file mode 100644 index 0000000..c009b4b --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c @@ -0,0 +1,757 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __VFP_FP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile unsigned long * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile unsigned long * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile unsigned long * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile unsigned long * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( unsigned char ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( unsigned char ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( unsigned char ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile unsigned long * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* Let the user override the pre-loading of the initial LR with the address of +prvTaskExitError() in case is messes up unwinding of the stack in the +debugger. */ +#ifdef configTASK_RETURN_ADDRESS + #define portTASK_RETURN_ADDRESS configTASK_RETURN_ADDRESS +#else + #define portTASK_RETURN_ADDRESS prvTaskExitError +#endif + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ) __attribute__ (( naked )); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ) __attribute__ (( naked )); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvPortStartFirstTask( void ) __attribute__ (( naked )); + +/* + * Function to enable the VFP. + */ + static void vPortEnableVFP( void ) __attribute__ (( naked )); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static unsigned char ucMaxSysCallPriority = 0; + static unsigned long ulMaxPRIGROUPValue = 0; + static const volatile unsigned char * const pcInterruptPriorityRegisters = ( const volatile unsigned char * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) portTASK_RETURN_ADDRESS; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +void vPortSVCHandler( void ) +{ + __asm volatile ( + " ldr r3, pxCurrentTCBConst2 \n" /* Restore the context. */ + " ldr r1, [r3] \n" /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + " ldr r0, [r1] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldmia r0!, {r4-r11, r14} \n" /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + " msr psp, r0 \n" /* Restore the task stack pointer. */ + " mov r0, #0 \n" + " msr basepri, r0 \n" + " bx r14 \n" + " \n" + " .align 2 \n" + "pxCurrentTCBConst2: .word pxCurrentTCB \n" + ); +} +/*-----------------------------------------------------------*/ + +static void prvPortStartFirstTask( void ) +{ + __asm volatile( + " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ + " ldr r0, [r0] \n" + " ldr r0, [r0] \n" + " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ + " cpsie i \n" /* Globally enable interrupts. */ + " svc 0 \n" /* System call to start first task. */ + " nop \n" + ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portBASE_TYPE xPortStartScheduler( void ) +{ + /* configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. + See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */ + configASSERT( configMAX_SYSCALL_INTERRUPT_PRIORITY ); + + #if( configASSERT_DEFINED == 1 ) + { + volatile unsigned long ulOriginalPriority; + volatile char * const pcFirstUserPriorityRegister = ( volatile char * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile unsigned char ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pcFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pcFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pcFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( unsigned char ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pcFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvPortStartFirstTask(); + + /* Should never get here as the tasks will now be executing! Call the task + exit error function to prevent compiler warnings about a static function + not being called in the case that the application writer overrides this + functionality by defining configTASK_RETURN_ADDRESS. */ + prvTaskExitError(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the CM4F port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is completely + within the specified behaviour for the architecture. */ + __asm volatile( "dsb" ); + __asm volatile( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __asm volatile( "dsb" ); + __asm volatile( "isb" ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__attribute__(( naked )) unsigned long ulPortSetInterruptMask( void ) +{ + __asm volatile \ + ( \ + " mrs r0, basepri \n" \ + " mov r1, %0 \n" \ + " msr basepri, r1 \n" \ + " bx lr \n" \ + :: "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "r0", "r1" \ + ); + + /* This return will not be reached but is necessary to prevent compiler + warnings. */ + return 0; +} +/*-----------------------------------------------------------*/ + +__attribute__(( naked )) void vPortClearInterruptMask( unsigned long ulNewMaskValue ) +{ + __asm volatile \ + ( \ + " msr basepri, r0 \n" \ + " bx lr \n" \ + :::"r0" \ + ); + + /* Just to avoid compiler warnings. */ + ( void ) ulNewMaskValue; +} +/*-----------------------------------------------------------*/ + +void xPortPendSVHandler( void ) +{ + /* This is a naked function. */ + + __asm volatile + ( + " mrs r0, psp \n" + " \n" + " ldr r3, pxCurrentTCBConst \n" /* Get the location of the current TCB. */ + " ldr r2, [r3] \n" + " \n" + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, push high vfp registers. */ + " it eq \n" + " vstmdbeq r0!, {s16-s31} \n" + " \n" + " stmdb r0!, {r4-r11, r14} \n" /* Save the core registers. */ + " \n" + " str r0, [r2] \n" /* Save the new top of stack into the first member of the TCB. */ + " \n" + " stmdb sp!, {r3} \n" + " mov r0, %0 \n" + " msr basepri, r0 \n" + " bl vTaskSwitchContext \n" + " mov r0, #0 \n" + " msr basepri, r0 \n" + " ldmia sp!, {r3} \n" + " \n" + " ldr r1, [r3] \n" /* The first item in pxCurrentTCB is the task top of stack. */ + " ldr r0, [r1] \n" + " \n" + " ldmia r0!, {r4-r11, r14} \n" /* Pop the core registers. */ + " \n" + " tst r14, #0x10 \n" /* Is the task using the FPU context? If so, pop the high vfp registers too. */ + " it eq \n" + " vldmiaeq r0!, {s16-s31} \n" + " \n" + " msr psp, r0 \n" + " \n" + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata workaround. */ + #if WORKAROUND_PMU_CM001 == 1 + " push { r14 } \n" + " pop { pc } \n" + #endif + #endif + " \n" + " bx r14 \n" + " \n" + " .align 2 \n" + "pxCurrentTCBConst: .word pxCurrentTCB \n" + ::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY) + ); +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __attribute__((weak)) void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ) + { + unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + portTickType xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __asm volatile( "cpsid i" ); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm volatile( "cpsie i" ); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __asm volatile( "dsb" ); + __asm volatile( "wfi" ); + __asm volatile( "isb" ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + /* Re-enable interrupts - see comments above the cpsid instruction() + above. */ + __asm volatile( "cpsie i" ); + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + unsigned long ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1 ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__attribute__(( weak )) void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +/* This is a naked function. */ +static void vPortEnableVFP( void ) +{ + __asm volatile + ( + " ldr.w r0, =0xE000ED88 \n" /* The FPU enable bits are in the CPACR. */ + " ldr r1, [r0] \n" + " \n" + " orr r1, r1, #( 0xf << 20 ) \n" /* Enable CP10 and CP11 coprocessors, then save back. */ + " str r1, [r0] \n" + " bx r14 " + ); +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + unsigned long ulCurrentInterrupt; + unsigned char ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + diff --git a/third_party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h b/third_party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..e846f66 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/GCC/ARM_CM4F/portmacro.h @@ -0,0 +1,188 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned portLONG +#define portBASE_TYPE long + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef unsigned portSHORT portTickType; + #define portMAX_DELAY ( portTickType ) 0xffff +#else + typedef unsigned portLONG portTickType; + #define portMAX_DELAY ( portTickType ) 0xffffffff +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + + +/* Scheduler utilities. */ +extern void vPortYield( void ); +#define portNVIC_INT_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portYIELD() vPortYield() +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern unsigned long ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( unsigned long ulNewMaskValue ); +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) +#define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() +#define portENABLE_INTERRUPTS() vPortClearInterruptMask(0) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Generic helper function. */ + __attribute__( ( always_inline ) ) static inline unsigned char ucPortCountLeadingZeros( unsigned long ulBitmap ) + { + unsigned char ucReturn; + + __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) ); + return ucReturn; + } + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - ucPortCountLeadingZeros( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/third_party/FreeRTOS/Source/portable/IAR/ARM_CM3/port.c b/third_party/FreeRTOS/Source/portable/IAR/ARM_CM3/port.c new file mode 100644 index 0000000..9451961 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/IAR/ARM_CM3/port.c @@ -0,0 +1,605 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM3 port. + *----------------------------------------------------------*/ + +/* IAR includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile unsigned long * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile unsigned long * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile unsigned long * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile unsigned long * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( unsigned char ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( unsigned char ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( unsigned char ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* For backward compatibility, ensure configKERNEL_INTERRUPT_PRIORITY is +defined. The value 255 should also ensure backward compatibility. +FreeRTOS.org versions prior to V4.3.0 did not include this definition. */ +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static unsigned char ucMaxSysCallPriority = 0; + static unsigned long ulMaxPRIGROUPValue = 0; + static const volatile unsigned char * const pcInterruptPriorityRegisters = ( const volatile unsigned char * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) prvTaskExitError; /* LR */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portBASE_TYPE xPortStartScheduler( void ) +{ + #if( configASSERT_DEFINED == 1 ) + { + volatile unsigned long ulOriginalPriority; + volatile char * const pcFirstUserPriorityRegister = ( volatile char * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile unsigned char ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pcFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pcFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pcFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( unsigned char ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pcFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the CM3 port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is completely + within the specified behaviour for the architecture. */ + __DSB(); + __ISB(); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __DSB(); + __ISB(); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __weak void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ) + { + unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + portTickType xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __disable_interrupt(); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __enable_interrupt(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __DSB(); + __WFI(); + __ISB(); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __enable_interrupt(); + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + unsigned long ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1 ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + unsigned long ulCurrentInterrupt; + unsigned char ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/FreeRTOS/Source/portable/IAR/ARM_CM3/portasm.s b/third_party/FreeRTOS/Source/portable/IAR/ARM_CM3/portasm.s new file mode 100644 index 0000000..5b4af0c --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/IAR/ARM_CM3/portasm.s @@ -0,0 +1,150 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC xPortPendSVHandler + PUBLIC ulPortSetInterruptMask + PUBLIC vPortClearInterruptMask + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + + + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] + + stmdb r0!, {r4-r11} /* Save the remaining registers. */ + str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ + + stmdb sp!, {r3, r14} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3, r14} + + ldr r1, [r3] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + ldmia r0!, {r4-r11} /* Pop the registers. */ + msr psp, r0 + bx r14 + + +/*-----------------------------------------------------------*/ + +ulPortSetInterruptMask: + mrs r0, basepri + mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r1 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortClearInterruptMask: + msr basepri, r0 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortSVCHandler: + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11} + msr psp, r0 + mov r0, #0 + msr basepri, r0 + orr r14, r14, #13 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Call SVC to start the first task. */ + cpsie i + svc 0 + + END + \ No newline at end of file diff --git a/third_party/FreeRTOS/Source/portable/IAR/ARM_CM3/portmacro.h b/third_party/FreeRTOS/Source/portable/IAR/ARM_CM3/portmacro.h new file mode 100644 index 0000000..c3a3115 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/IAR/ARM_CM3/portmacro.h @@ -0,0 +1,184 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned portLONG +#define portBASE_TYPE long + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef unsigned portSHORT portTickType; + #define portMAX_DELAY 0xffff +#else + typedef unsigned portLONG portTickType; + #define portMAX_DELAY 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +extern void vPortYield( void ); +#define portNVIC_INT_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000ed04UL ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portYIELD() vPortYield() +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) ) + + /*-----------------------------------------------------------*/ + + #include + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __CLZ( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern unsigned long ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( unsigned long ulNewMask ); + +#define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() +#define portENABLE_INTERRUPTS() vPortClearInterruptMask( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in +the source code because to do so would cause other compilers to generate +warnings. */ +#pragma diag_suppress=Pe191 +#pragma diag_suppress=Pa082 + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/third_party/FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c b/third_party/FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c new file mode 100644 index 0000000..0b46f09 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/IAR/ARM_CM4F/port.c @@ -0,0 +1,631 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Compiler includes. */ +#include + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __ARMVFP__ + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile unsigned long * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile unsigned long * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile unsigned long * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile unsigned long * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( unsigned char ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( unsigned char ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( unsigned char ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile unsigned long * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortSysTickHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +extern void vPortStartFirstTask( void ); + +/* + * Turn the VFP on. + */ +extern void vPortEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static unsigned char ucMaxSysCallPriority = 0; + static unsigned long ulMaxPRIGROUPValue = 0; + static const volatile unsigned char * const pcInterruptPriorityRegisters = ( const volatile unsigned char * const ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portBASE_TYPE xPortStartScheduler( void ) +{ + #if( configASSERT_DEFINED == 1 ) + { + volatile unsigned long ulOriginalPriority; + volatile char * const pcFirstUserPriorityRegister = ( volatile char * const ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile unsigned char ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pcFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pcFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pcFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( unsigned char ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pcFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + vPortEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + vPortStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the CM4F port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is completely + within the specified behaviour for the architecture. */ + __DSB(); + __ISB(); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __DSB(); + __ISB(); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __weak void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ) + { + unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + portTickType xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __disable_interrupt(); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __enable_interrupt(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __DSB(); + __WFI(); + __ISB(); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + /* Re-enable interrupts - see comments above __disable_interrupt() + call above. */ + __enable_interrupt(); + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + unsigned long ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1 ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +/* + * Setup the systick timer to generate the tick interrupts at the required + * frequency. + */ +__weak void vPortSetupTimerInterrupt( void ) +{ + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + unsigned long ulCurrentInterrupt; + unsigned char ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + __asm volatile( "mrs %0, ipsr" : "=r"( ulCurrentInterrupt ) ); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/FreeRTOS/Source/portable/IAR/ARM_CM4F/portasm.s b/third_party/FreeRTOS/Source/portable/IAR/ARM_CM4F/portasm.s new file mode 100644 index 0000000..72bf98e --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/IAR/ARM_CM4F/portasm.s @@ -0,0 +1,191 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include + + RSEG CODE:CODE(2) + thumb + + EXTERN pxCurrentTCB + EXTERN vTaskSwitchContext + + PUBLIC xPortPendSVHandler + PUBLIC ulPortSetInterruptMask + PUBLIC vPortClearInterruptMask + PUBLIC vPortSVCHandler + PUBLIC vPortStartFirstTask + PUBLIC vPortEnableVFP + + +/*-----------------------------------------------------------*/ + +xPortPendSVHandler: + mrs r0, psp + + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [r3] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + /* Is the task using the FPU context? If so, pop the high vfp registers + too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + #endif + #endif + + bx r14 + + +/*-----------------------------------------------------------*/ + +ulPortSetInterruptMask: + mrs r0, basepri + mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r1 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortClearInterruptMask: + msr basepri, r0 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortSVCHandler: + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + msr psp, r0 + mov r0, #0 + msr basepri, r0 + bx r14 + +/*-----------------------------------------------------------*/ + +vPortStartFirstTask + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Call SVC to start the first task. */ + cpsie i + svc 0 + +/*-----------------------------------------------------------*/ + +vPortEnableVFP: + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + + + + END + diff --git a/third_party/FreeRTOS/Source/portable/IAR/ARM_CM4F/portmacro.h b/third_party/FreeRTOS/Source/portable/IAR/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..8e2c0e2 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/IAR/ARM_CM4F/portmacro.h @@ -0,0 +1,185 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned portLONG +#define portBASE_TYPE long + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef unsigned portSHORT portTickType; + #define portMAX_DELAY ( portTickType ) 0xffff +#else + typedef unsigned portLONG portTickType; + #define portMAX_DELAY ( portTickType ) 0xffffffff +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +extern void vPortYield( void ); +#define portNVIC_INT_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portYIELD() vPortYield() +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Architecture specific optimisations. */ +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #include + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __CLZ( ( uxReadyPriorities ) ) ) + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); +extern unsigned long ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( unsigned long ulNewMask ); + +#define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() +#define portENABLE_INTERRUPTS() vPortClearInterruptMask( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask( x ) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif + +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +/* Suppress warnings that are generated by the IAR tools, but cannot be fixed in +the source code because to do so would cause other compilers to generate +warnings. */ +#pragma diag_suppress=Pe191 +#pragma diag_suppress=Pa082 + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/third_party/FreeRTOS/Source/portable/Keil/See-also-the-RVDS-directory.txt b/third_party/FreeRTOS/Source/portable/Keil/See-also-the-RVDS-directory.txt new file mode 100644 index 0000000..bd7fab7 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/Keil/See-also-the-RVDS-directory.txt @@ -0,0 +1 @@ +Nothing to see here. \ No newline at end of file diff --git a/third_party/FreeRTOS/Source/portable/MemMang/heap_1.c b/third_party/FreeRTOS/Source/portable/MemMang/heap_1.c new file mode 100644 index 0000000..6c4c8c0 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/MemMang/heap_1.c @@ -0,0 +1,170 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * The simplest possible implementation of pvPortMalloc(). Note that this + * implementation does NOT allow allocated memory to be freed again. + * + * See heap_2.c, heap_3.c and heap_4.c for alternative implementations, and the + * memory management pages of http://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* A few bytes might be lost to byte aligning the heap start address. */ +#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) + +/* Allocate the memory for the heap. */ +static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ]; +static size_t xNextFreeByte = ( size_t ) 0; + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +void *pvReturn = NULL; +static unsigned char *pucAlignedHeap = NULL; + + /* Ensure that blocks are always aligned to the required number of bytes. */ + #if portBYTE_ALIGNMENT != 1 + if( xWantedSize & portBYTE_ALIGNMENT_MASK ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + #endif + + vTaskSuspendAll(); + { + if( pucAlignedHeap == NULL ) + { + /* Ensure the heap starts on a correctly aligned boundary. */ + pucAlignedHeap = ( unsigned char * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ( portPOINTER_SIZE_TYPE ) ~portBYTE_ALIGNMENT_MASK ) ); + } + + /* Check there is enough room left for the allocation. */ + if( ( ( xNextFreeByte + xWantedSize ) < configADJUSTED_HEAP_SIZE ) && + ( ( xNextFreeByte + xWantedSize ) > xNextFreeByte ) )/* Check for overflow. */ + { + /* Return the next free byte then increment the index past this + block. */ + pvReturn = pucAlignedHeap + xNextFreeByte; + xNextFreeByte += xWantedSize; + } + + traceMALLOC( pvReturn, xWantedSize ); + } + xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ + /* Memory cannot be freed using this scheme. See heap_2.c, heap_3.c and + heap_4.c for alternative implementations, and the memory management pages of + http://www.FreeRTOS.org for more information. */ + ( void ) pv; + + /* Force an assert as it is invalid to call this function. */ + configASSERT( pv == NULL ); +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* Only required when static memory is not cleared. */ + xNextFreeByte = ( size_t ) 0; +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return ( configADJUSTED_HEAP_SIZE - xNextFreeByte ); +} + + + diff --git a/third_party/FreeRTOS/Source/portable/MemMang/heap_2.c b/third_party/FreeRTOS/Source/portable/MemMang/heap_2.c new file mode 100644 index 0000000..64391be --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/MemMang/heap_2.c @@ -0,0 +1,299 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* + * A sample implementation of pvPortMalloc() and vPortFree() that permits + * allocated blocks to be freed, but does not combine adjacent free blocks + * into a single larger block (and so will fragment memory). See heap_4.c for + * an equivalent that does combine adjacent blocks into single larger blocks. + * + * See heap_1.c, heap_3.c and heap_4.c for alternative implementations, and the + * memory management pages of http://www.FreeRTOS.org for more information. + */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* A few bytes might be lost to byte aligning the heap start address. */ +#define configADJUSTED_HEAP_SIZE ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT ) + +/* + * Initialises the heap structures before their first use. + */ +static void prvHeapInit( void ); + +/* Allocate the memory for the heap. */ +static unsigned char ucHeap[ configTOTAL_HEAP_SIZE ]; + +/* Define the linked list structure. This is used to link free blocks in order +of their size. */ +typedef struct A_BLOCK_LINK +{ + struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */ + size_t xBlockSize; /*<< The size of the free block. */ +} xBlockLink; + + +static const unsigned short heapSTRUCT_SIZE = ( ( sizeof ( xBlockLink ) + ( portBYTE_ALIGNMENT - 1 ) ) & ~portBYTE_ALIGNMENT_MASK ); +#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( heapSTRUCT_SIZE * 2 ) ) + +/* Create a couple of list links to mark the start and end of the list. */ +static xBlockLink xStart, xEnd; + +/* Keeps track of the number of free bytes remaining, but says nothing about +fragmentation. */ +static size_t xFreeBytesRemaining = configADJUSTED_HEAP_SIZE; + +/* STATIC FUNCTIONS ARE DEFINED AS MACROS TO MINIMIZE THE FUNCTION CALL DEPTH. */ + +/* + * Insert a block into the list of free blocks - which is ordered by size of + * the block. Small blocks at the start of the list and large blocks at the end + * of the list. + */ +#define prvInsertBlockIntoFreeList( pxBlockToInsert ) \ +{ \ +xBlockLink *pxIterator; \ +size_t xBlockSize; \ + \ + xBlockSize = pxBlockToInsert->xBlockSize; \ + \ + /* Iterate through the list until a block is found that has a larger size */ \ + /* than the block we are inserting. */ \ + for( pxIterator = &xStart; pxIterator->pxNextFreeBlock->xBlockSize < xBlockSize; pxIterator = pxIterator->pxNextFreeBlock ) \ + { \ + /* There is nothing to do here - just iterate to the correct position. */ \ + } \ + \ + /* Update the list to include the block being inserted in the correct */ \ + /* position. */ \ + pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; \ + pxIterator->pxNextFreeBlock = pxBlockToInsert; \ +} +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +xBlockLink *pxBlock, *pxPreviousBlock, *pxNewBlockLink; +static portBASE_TYPE xHeapHasBeenInitialised = pdFALSE; +void *pvReturn = NULL; + + vTaskSuspendAll(); + { + /* If this is the first call to malloc then the heap will require + initialisation to setup the list of free blocks. */ + if( xHeapHasBeenInitialised == pdFALSE ) + { + prvHeapInit(); + xHeapHasBeenInitialised = pdTRUE; + } + + /* The wanted size is increased so it can contain a xBlockLink + structure in addition to the requested amount of bytes. */ + if( xWantedSize > 0 ) + { + xWantedSize += heapSTRUCT_SIZE; + + /* Ensure that blocks are always aligned to the required number of bytes. */ + if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0 ) + { + /* Byte alignment required. */ + xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) ); + } + } + + if( ( xWantedSize > 0 ) && ( xWantedSize < configADJUSTED_HEAP_SIZE ) ) + { + /* Blocks are stored in byte order - traverse the list from the start + (smallest) block until one of adequate size is found. */ + pxPreviousBlock = &xStart; + pxBlock = xStart.pxNextFreeBlock; + while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != NULL ) ) + { + pxPreviousBlock = pxBlock; + pxBlock = pxBlock->pxNextFreeBlock; + } + + /* If we found the end marker then a block of adequate size was not found. */ + if( pxBlock != &xEnd ) + { + /* Return the memory space - jumping over the xBlockLink structure + at its start. */ + pvReturn = ( void * ) ( ( ( unsigned char * ) pxPreviousBlock->pxNextFreeBlock ) + heapSTRUCT_SIZE ); + + /* This block is being returned for use so must be taken out of the + list of free blocks. */ + pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock; + + /* If the block is larger than required it can be split into two. */ + if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE ) + { + /* This block is to be split into two. Create a new block + following the number of bytes requested. The void cast is + used to prevent byte alignment warnings from the compiler. */ + pxNewBlockLink = ( void * ) ( ( ( unsigned char * ) pxBlock ) + xWantedSize ); + + /* Calculate the sizes of two blocks split from the single + block. */ + pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize; + pxBlock->xBlockSize = xWantedSize; + + /* Insert the new block into the list of free blocks. */ + prvInsertBlockIntoFreeList( ( pxNewBlockLink ) ); + } + + xFreeBytesRemaining -= pxBlock->xBlockSize; + } + } + + traceMALLOC( pvReturn, xWantedSize ); + } + xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ +unsigned char *puc = ( unsigned char * ) pv; +xBlockLink *pxLink; + + if( pv != NULL ) + { + /* The memory being freed will have an xBlockLink structure immediately + before it. */ + puc -= heapSTRUCT_SIZE; + + /* This unexpected casting is to keep some compilers from issuing + byte alignment warnings. */ + pxLink = ( void * ) puc; + + vTaskSuspendAll(); + { + /* Add this block to the list of free blocks. */ + prvInsertBlockIntoFreeList( ( ( xBlockLink * ) pxLink ) ); + xFreeBytesRemaining += pxLink->xBlockSize; + traceFREE( pv, pxLink->xBlockSize ); + } + xTaskResumeAll(); + } +} +/*-----------------------------------------------------------*/ + +size_t xPortGetFreeHeapSize( void ) +{ + return xFreeBytesRemaining; +} +/*-----------------------------------------------------------*/ + +void vPortInitialiseBlocks( void ) +{ + /* This just exists to keep the linker quiet. */ +} +/*-----------------------------------------------------------*/ + +static void prvHeapInit( void ) +{ +xBlockLink *pxFirstFreeBlock; +unsigned char *pucAlignedHeap; + + /* Ensure the heap starts on a correctly aligned boundary. */ + pucAlignedHeap = ( unsigned char * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ( portPOINTER_SIZE_TYPE ) ~portBYTE_ALIGNMENT_MASK ) ); + + /* xStart is used to hold a pointer to the first item in the list of free + blocks. The void cast is used to prevent compiler warnings. */ + xStart.pxNextFreeBlock = ( void * ) pucAlignedHeap; + xStart.xBlockSize = ( size_t ) 0; + + /* xEnd is used to mark the end of the list of free blocks. */ + xEnd.xBlockSize = configADJUSTED_HEAP_SIZE; + xEnd.pxNextFreeBlock = NULL; + + /* To start with there is a single free block that is sized to take up the + entire heap space. */ + pxFirstFreeBlock = ( void * ) pucAlignedHeap; + pxFirstFreeBlock->xBlockSize = configADJUSTED_HEAP_SIZE; + pxFirstFreeBlock->pxNextFreeBlock = &xEnd; +} +/*-----------------------------------------------------------*/ diff --git a/third_party/FreeRTOS/Source/portable/MemMang/heap_3.c b/third_party/FreeRTOS/Source/portable/MemMang/heap_3.c new file mode 100644 index 0000000..bf2cbac --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/MemMang/heap_3.c @@ -0,0 +1,131 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +/* + * Implementation of pvPortMalloc() and vPortFree() that relies on the + * compilers own malloc() and free() implementations. + * + * This file can only be used if the linker is configured to to generate + * a heap memory area. + * + * See heap_1.c, heap_2.c and heap_4.c for alternative implementations, and the + * memory management pages of http://www.FreeRTOS.org for more information. + */ + +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" + +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/*-----------------------------------------------------------*/ + +void *pvPortMalloc( size_t xWantedSize ) +{ +void *pvReturn; + + vTaskSuspendAll(); + { + pvReturn = malloc( xWantedSize ); + traceMALLOC( pvReturn, xWantedSize ); + } + xTaskResumeAll(); + + #if( configUSE_MALLOC_FAILED_HOOK == 1 ) + { + if( pvReturn == NULL ) + { + extern void vApplicationMallocFailedHook( void ); + vApplicationMallocFailedHook(); + } + } + #endif + + return pvReturn; +} +/*-----------------------------------------------------------*/ + +void vPortFree( void *pv ) +{ + if( pv ) + { + vTaskSuspendAll(); + { + free( pv ); + traceFREE( pv, 0 ); + } + xTaskResumeAll(); + } +} + + + diff --git a/third_party/FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c b/third_party/FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c new file mode 100644 index 0000000..6bea4e5 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/RVDS/ARM_CM3/port.c @@ -0,0 +1,696 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM3 port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef configKERNEL_INTERRUPT_PRIORITY + #define configKERNEL_INTERRUPT_PRIORITY 255 +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ +#endif + +/* The __weak attribute does not work as you might expect with the Keil tools +so the configOVERRIDE_DEFAULT_TICK_CONFIGURATION constant must be set to 1 if +the application writer wants to provide their own implementation of +vPortSetupTimerInterrupt(). Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION +is defined. */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile unsigned long * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile unsigned long * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile unsigned long * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile unsigned long * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( unsigned char ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( unsigned char ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( unsigned char ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) + +/* Constants used with memory barrier intrinsics. */ +#define portSY_FULL_READ_WRITE ( 15 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static unsigned char ucMaxSysCallPriority = 0; + static unsigned long ulMaxPRIGROUPValue = 0; + static const volatile unsigned char * const pcInterruptPriorityRegisters = ( unsigned char * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + pxTopOfStack--; /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */ + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) prvTaskExitError; /* LR */ + + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */ + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ + PRESERVE8 + + ldr r3, =pxCurrentTCB /* Restore the context. */ + ldr r1, [r3] /* Use pxCurrentTCBConst to get the pxCurrentTCB address. */ + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + ldmia r0!, {r4-r11} /* Pop the registers that are not automatically saved on exception entry and the critical nesting count. */ + msr psp, r0 /* Restore the task stack pointer. */ + mov r0, #0 + msr basepri, r0 + orr r14, #0xd + bx r14 +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ + PRESERVE8 + + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Globally enable interrupts. */ + cpsie i + /* Call SVC to start the first task. */ + svc 0 + nop +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portBASE_TYPE xPortStartScheduler( void ) +{ + #if( configASSERT_DEFINED == 1 ) + { + volatile unsigned long ulOriginalPriority; + volatile char * const pcFirstUserPriorityRegister = ( char * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile unsigned char ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pcFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pcFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pcFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( unsigned char ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pcFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the CM3 port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is completely + within the specified behaviour for the architecture. */ + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + + PRESERVE8 + + mrs r0, psp + + ldr r3, =pxCurrentTCB /* Get the location of the current TCB. */ + ldr r2, [r3] + + stmdb r0!, {r4-r11} /* Save the remaining registers. */ + str r0, [r2] /* Save the new top of stack into the first member of the TCB. */ + + stmdb sp!, {r3, r14} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3, r14} + + ldr r1, [r3] + ldr r0, [r1] /* The first item in pxCurrentTCB is the task top of stack. */ + ldmia r0!, {r4-r11} /* Pop the registers and the critical nesting count. */ + msr psp, r0 + bx r14 + nop +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __weak void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ) + { + unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + portTickType xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __disable_irq(); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_irq() call + above. */ + __enable_irq(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __dsb( portSY_FULL_READ_WRITE ); + __wfi(); + __isb( portSY_FULL_READ_WRITE ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + /* Re-enable interrupts - see comments above __disable_irq() call + above. */ + __enable_irq(); + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + unsigned long ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1 ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* + * Setup the SysTick timer to generate the tick interrupts at the required + * frequency. + */ +#if configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 + + void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +__asm unsigned long ulPortSetInterruptMask( void ) +{ + PRESERVE8 + + mrs r0, basepri + mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r1 + bx r14 +} +/*-----------------------------------------------------------*/ + +__asm void vPortClearInterruptMask( unsigned long ulNewMask ) +{ + PRESERVE8 + + msr basepri, r0 + bx r14 +} +/*-----------------------------------------------------------*/ + +__asm unsigned long vPortGetIPSR( void ) +{ + PRESERVE8 + + mrs r0, ipsr + bx r14 +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + unsigned long ulCurrentInterrupt; + unsigned char ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = vPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + diff --git a/third_party/FreeRTOS/Source/portable/RVDS/ARM_CM3/portmacro.h b/third_party/FreeRTOS/Source/portable/RVDS/ARM_CM3/portmacro.h new file mode 100644 index 0000000..2f9f4be --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/RVDS/ARM_CM3/portmacro.h @@ -0,0 +1,177 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned portLONG +#define portBASE_TYPE long + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef unsigned portSHORT portTickType; + #define portMAX_DELAY ( portTickType ) 0xffff +#else + typedef unsigned portLONG portTickType; + #define portMAX_DELAY ( portTickType ) 0xffffffff +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +extern void vPortYield( void ); +#define portNVIC_INT_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portYIELD() vPortYield() +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern unsigned long ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( unsigned long ulNewMask ); +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() +#define portENABLE_INTERRUPTS() vPortClearInterruptMask( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Port specific optimisations. */ +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) ) + +#endif /* taskRECORD_READY_PRIORITY */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/third_party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c b/third_party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c new file mode 100644 index 0000000..125edaa --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/port.c @@ -0,0 +1,767 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/*----------------------------------------------------------- + * Implementation of functions defined in portable.h for the ARM CM4F port. + *----------------------------------------------------------*/ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#ifndef __TARGET_FPU_VFP + #error This port can only be used when the project options are configured to enable hardware floating point support. +#endif + +#if configMAX_SYSCALL_INTERRUPT_PRIORITY == 0 + #error configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to 0. See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html +#endif + +#ifndef configSYSTICK_CLOCK_HZ + #define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ +#endif + +/* The __weak attribute does not work as you might expect with the Keil tools +so the configOVERRIDE_DEFAULT_TICK_CONFIGURATION constant must be set to 1 if +the application writer wants to provide their own implementation of +vPortSetupTimerInterrupt(). Ensure configOVERRIDE_DEFAULT_TICK_CONFIGURATION +is defined. */ +#ifndef configOVERRIDE_DEFAULT_TICK_CONFIGURATION + #define configOVERRIDE_DEFAULT_TICK_CONFIGURATION 0 +#endif + +/* Constants required to manipulate the core. Registers first... */ +#define portNVIC_SYSTICK_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000e010 ) ) +#define portNVIC_SYSTICK_LOAD_REG ( * ( ( volatile unsigned long * ) 0xe000e014 ) ) +#define portNVIC_SYSTICK_CURRENT_VALUE_REG ( * ( ( volatile unsigned long * ) 0xe000e018 ) ) +#define portNVIC_SYSPRI2_REG ( * ( ( volatile unsigned long * ) 0xe000ed20 ) ) +/* ...then bits in the registers. */ +#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL ) +#define portNVIC_SYSTICK_INT_BIT ( 1UL << 1UL ) +#define portNVIC_SYSTICK_ENABLE_BIT ( 1UL << 0UL ) +#define portNVIC_SYSTICK_COUNT_FLAG_BIT ( 1UL << 16UL ) +#define portNVIC_PENDSVCLEAR_BIT ( 1UL << 27UL ) +#define portNVIC_PEND_SYSTICK_CLEAR_BIT ( 1UL << 25UL ) + +#define portNVIC_PENDSV_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) +#define portNVIC_SYSTICK_PRI ( ( ( unsigned long ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) + +/* Constants required to check the validity of an interrupt priority. */ +#define portFIRST_USER_INTERRUPT_NUMBER ( 16 ) +#define portNVIC_IP_REGISTERS_OFFSET_16 ( 0xE000E3F0 ) +#define portAIRCR_REG ( * ( ( volatile unsigned long * ) 0xE000ED0C ) ) +#define portMAX_8_BIT_VALUE ( ( unsigned char ) 0xff ) +#define portTOP_BIT_OF_BYTE ( ( unsigned char ) 0x80 ) +#define portMAX_PRIGROUP_BITS ( ( unsigned char ) 7 ) +#define portPRIORITY_GROUP_MASK ( 0x07UL << 8UL ) +#define portPRIGROUP_SHIFT ( 8UL ) + +/* Constants required to manipulate the VFP. */ +#define portFPCCR ( ( volatile unsigned long * ) 0xe000ef34 ) /* Floating point context control register. */ +#define portASPEN_AND_LSPEN_BITS ( 0x3UL << 30UL ) + +/* Constants required to set up the initial stack. */ +#define portINITIAL_XPSR ( 0x01000000 ) +#define portINITIAL_EXEC_RETURN ( 0xfffffffd ) + +/* Constants used with memory barrier intrinsics. */ +#define portSY_FULL_READ_WRITE ( 15 ) + +/* The systick is a 24-bit counter. */ +#define portMAX_24_BIT_NUMBER ( 0xffffffUL ) + +/* A fiddle factor to estimate the number of SysTick counts that would have +occurred while the SysTick counter is stopped during tickless idle +calculations. */ +#define portMISSED_COUNTS_FACTOR ( 45UL ) + +/* Each task maintains its own interrupt status in the critical nesting +variable. */ +static unsigned portBASE_TYPE uxCriticalNesting = 0xaaaaaaaa; + +/* + * Setup the timer to generate the tick interrupts. The implementation in this + * file is weak to allow application writers to change the timer used to + * generate the tick interrupt. + */ +void vPortSetupTimerInterrupt( void ); + +/* + * Exception handlers. + */ +void xPortPendSVHandler( void ); +void xPortSysTickHandler( void ); +void vPortSVCHandler( void ); + +/* + * Start first task is a separate function so it can be tested in isolation. + */ +static void prvStartFirstTask( void ); + +/* + * Functions defined in portasm.s to enable the VFP. + */ +static void prvEnableVFP( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * The number of SysTick increments that make up one tick period. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long ulTimerCountsForOneTick = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * The maximum number of tick periods that can be suppressed is limited by the + * 24 bit resolution of the SysTick timer. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long xMaximumPossibleSuppressedTicks = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Compensate for the CPU cycles that pass while the SysTick is stopped (low + * power functionality only. + */ +#if configUSE_TICKLESS_IDLE == 1 + static unsigned long ulStoppedTimerCompensation = 0; +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure + * FreeRTOS API functions are not called from interrupts that have been assigned + * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY. + */ +#if ( configASSERT_DEFINED == 1 ) + static unsigned char ucMaxSysCallPriority = 0; + static unsigned long ulMaxPRIGROUPValue = 0; + static const volatile unsigned char * const pcInterruptPriorityRegisters = ( unsigned char * ) portNVIC_IP_REGISTERS_OFFSET_16; +#endif /* configASSERT_DEFINED */ + +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portSTACK_TYPE *pxPortInitialiseStack( portSTACK_TYPE *pxTopOfStack, pdTASK_CODE pxCode, void *pvParameters ) +{ + /* Simulate the stack frame as it would be created by a context switch + interrupt. */ + + /* Offset added to account for the way the MCU uses the stack on entry/exit + of interrupts, and to ensure alignment. */ + pxTopOfStack--; + + *pxTopOfStack = portINITIAL_XPSR; /* xPSR */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) pxCode; /* PC */ + pxTopOfStack--; + *pxTopOfStack = ( portSTACK_TYPE ) prvTaskExitError; /* LR */ + + /* Save code space by skipping register initialisation. */ + pxTopOfStack -= 5; /* R12, R3, R2 and R1. */ + *pxTopOfStack = ( portSTACK_TYPE ) pvParameters; /* R0 */ + + /* A save method is being used that requires each task to maintain its + own exec return value. */ + pxTopOfStack--; + *pxTopOfStack = portINITIAL_EXEC_RETURN; + + pxTopOfStack -= 8; /* R11, R10, R9, R8, R7, R6, R5 and R4. */ + + return pxTopOfStack; +} +/*-----------------------------------------------------------*/ + +static void prvTaskExitError( void ) +{ + /* A function that implements a task must not exit or attempt to return to + its caller as there is nothing to return to. If a task wants to exit it + should instead call vTaskDelete( NULL ). + + Artificially force an assert() to be triggered if configASSERT() is + defined, then stop here so application writers can catch the error. */ + configASSERT( uxCriticalNesting == ~0UL ); + portDISABLE_INTERRUPTS(); + for( ;; ); +} +/*-----------------------------------------------------------*/ + +__asm void vPortSVCHandler( void ) +{ + PRESERVE8 + + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r1, [r3] + ldr r0, [r1] + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + msr psp, r0 + mov r0, #0 + msr basepri, r0 + bx r14 +} +/*-----------------------------------------------------------*/ + +__asm void prvStartFirstTask( void ) +{ + PRESERVE8 + + /* Use the NVIC offset register to locate the stack. */ + ldr r0, =0xE000ED08 + ldr r0, [r0] + ldr r0, [r0] + /* Set the msp back to the start of the stack. */ + msr msp, r0 + /* Globally enable interrupts. */ + cpsie i + /* Call SVC to start the first task. */ + svc 0 + nop +} +/*-----------------------------------------------------------*/ + +__asm void prvEnableVFP( void ) +{ + PRESERVE8 + + /* The FPU enable bits are in the CPACR. */ + ldr.w r0, =0xE000ED88 + ldr r1, [r0] + + /* Enable CP10 and CP11 coprocessors, then save back. */ + orr r1, r1, #( 0xf << 20 ) + str r1, [r0] + bx r14 + nop +} +/*-----------------------------------------------------------*/ + +/* + * See header file for description. + */ +portBASE_TYPE xPortStartScheduler( void ) +{ + #if( configASSERT_DEFINED == 1 ) + { + volatile unsigned long ulOriginalPriority; + volatile char * const pcFirstUserPriorityRegister = ( char * ) ( portNVIC_IP_REGISTERS_OFFSET_16 + portFIRST_USER_INTERRUPT_NUMBER ); + volatile unsigned char ucMaxPriorityValue; + + /* Determine the maximum priority from which ISR safe FreeRTOS API + functions can be called. ISR safe functions are those that end in + "FromISR". FreeRTOS maintains separate thread and ISR API functions to + ensure interrupt entry is as fast and simple as possible. + + Save the interrupt priority value that is about to be clobbered. */ + ulOriginalPriority = *pcFirstUserPriorityRegister; + + /* Determine the number of priority bits available. First write to all + possible bits. */ + *pcFirstUserPriorityRegister = portMAX_8_BIT_VALUE; + + /* Read the value back to see how many bits stuck. */ + ucMaxPriorityValue = *pcFirstUserPriorityRegister; + + /* Use the same mask on the maximum system call priority. */ + ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue; + + /* Calculate the maximum acceptable priority group value for the number + of bits read back. */ + ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS; + while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE ) + { + ulMaxPRIGROUPValue--; + ucMaxPriorityValue <<= ( unsigned char ) 0x01; + } + + /* Shift the priority group value back to its position within the AIRCR + register. */ + ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT; + ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK; + + /* Restore the clobbered interrupt priority register to its original + value. */ + *pcFirstUserPriorityRegister = ulOriginalPriority; + } + #endif /* conifgASSERT_DEFINED */ + + /* Make PendSV and SysTick the lowest priority interrupts. */ + portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; + portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI; + + /* Start the timer that generates the tick ISR. Interrupts are disabled + here already. */ + vPortSetupTimerInterrupt(); + + /* Initialise the critical nesting count ready for the first task. */ + uxCriticalNesting = 0; + + /* Ensure the VFP is enabled - it should be anyway. */ + prvEnableVFP(); + + /* Lazy save always. */ + *( portFPCCR ) |= portASPEN_AND_LSPEN_BITS; + + /* Start the first task. */ + prvStartFirstTask(); + + /* Should not get here! */ + return 0; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the CM4F port will require this function as there + is nothing to return to. */ +} +/*-----------------------------------------------------------*/ + +void vPortYield( void ) +{ + /* Set a PendSV to request a context switch. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + + /* Barriers are normally not required but do ensure the code is completely + within the specified behaviour for the architecture. */ + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); +} +/*-----------------------------------------------------------*/ + +void vPortEnterCritical( void ) +{ + portDISABLE_INTERRUPTS(); + uxCriticalNesting++; + __dsb( portSY_FULL_READ_WRITE ); + __isb( portSY_FULL_READ_WRITE ); +} +/*-----------------------------------------------------------*/ + +void vPortExitCritical( void ) +{ + uxCriticalNesting--; + if( uxCriticalNesting == 0 ) + { + portENABLE_INTERRUPTS(); + } +} +/*-----------------------------------------------------------*/ + +__asm void xPortPendSVHandler( void ) +{ + extern uxCriticalNesting; + extern pxCurrentTCB; + extern vTaskSwitchContext; + + PRESERVE8 + + mrs r0, psp + + /* Get the location of the current TCB. */ + ldr r3, =pxCurrentTCB + ldr r2, [r3] + + /* Is the task using the FPU context? If so, push high vfp registers. */ + tst r14, #0x10 + it eq + vstmdbeq r0!, {s16-s31} + + /* Save the core registers. */ + stmdb r0!, {r4-r11, r14} + + /* Save the new top of stack into the first member of the TCB. */ + str r0, [r2] + + stmdb sp!, {r3} + mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r0 + bl vTaskSwitchContext + mov r0, #0 + msr basepri, r0 + ldmia sp!, {r3} + + /* The first item in pxCurrentTCB is the task top of stack. */ + ldr r1, [r3] + ldr r0, [r1] + + /* Pop the core registers. */ + ldmia r0!, {r4-r11, r14} + + /* Is the task using the FPU context? If so, pop the high vfp registers + too. */ + tst r14, #0x10 + it eq + vldmiaeq r0!, {s16-s31} + + msr psp, r0 + + #ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */ + #if WORKAROUND_PMU_CM001 == 1 + push { r14 } + pop { pc } + #endif + #endif + + bx r14 + nop +} +/*-----------------------------------------------------------*/ + +void xPortSysTickHandler( void ) +{ + /* The SysTick runs at the lowest interrupt priority, so when this interrupt + executes all interrupts must be unmasked. There is therefore no need to + save and then restore the interrupt mask value as its value is already + known. */ + ( void ) portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Increment the RTOS tick. */ + if( xTaskIncrementTick() != pdFALSE ) + { + /* A context switch is required. Context switching is performed in + the PendSV interrupt. Pend the PendSV interrupt. */ + portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( 0 ); +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE == 1 + + __weak void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ) + { + unsigned long ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements; + portTickType xModifiableIdleTime; + + /* Make sure the SysTick reload value does not overflow the counter. */ + if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks ) + { + xExpectedIdleTime = xMaximumPossibleSuppressedTicks; + } + + /* Stop the SysTick momentarily. The time the SysTick is stopped for + is accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + /* Calculate the reload value required to wait xExpectedIdleTime + tick periods. -1 is used because this code will execute part way + through one of the tick periods. */ + ulReloadValue = portNVIC_SYSTICK_CURRENT_VALUE_REG + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) ); + if( ulReloadValue > ulStoppedTimerCompensation ) + { + ulReloadValue -= ulStoppedTimerCompensation; + } + + /* Enter a critical section but don't use the taskENTER_CRITICAL() + method as that will mask interrupts that should exit sleep mode. */ + __disable_irq(); + + /* If a context switch is pending or a task is waiting for the scheduler + to be unsuspended then abandon the low power entry. */ + if( eTaskConfirmSleepModeStatus() == eAbortSleep ) + { + /* Restart from whatever is left in the count register to complete + this tick period. */ + portNVIC_SYSTICK_LOAD_REG = portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + + /* Reset the reload register to the value required for normal tick + periods. */ + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + + /* Re-enable interrupts - see comments above __disable_irq() call + above. */ + __enable_irq(); + } + else + { + /* Set the new reload value. */ + portNVIC_SYSTICK_LOAD_REG = ulReloadValue; + + /* Clear the SysTick count flag and set the count value back to + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + + /* Restart SysTick. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + + /* Sleep until something happens. configPRE_SLEEP_PROCESSING() can + set its parameter to 0 to indicate that its implementation contains + its own wait for interrupt or wait for event instruction, and so wfi + should not be executed again. However, the original expected idle + time variable must remain unmodified, so a copy is taken. */ + xModifiableIdleTime = xExpectedIdleTime; + configPRE_SLEEP_PROCESSING( xModifiableIdleTime ); + if( xModifiableIdleTime > 0 ) + { + __dsb( portSY_FULL_READ_WRITE ); + __wfi(); + __isb( portSY_FULL_READ_WRITE ); + } + configPOST_SLEEP_PROCESSING( xExpectedIdleTime ); + + /* Stop SysTick. Again, the time the SysTick is stopped for is + accounted for as best it can be, but using the tickless mode will + inevitably result in some tiny drift of the time maintained by the + kernel with respect to calendar time. */ + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT; + + /* Re-enable interrupts - see comments above __disable_irq() call + above. */ + __enable_irq(); + + if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 ) + { + unsigned long ulCalculatedLoadValue; + + /* The tick interrupt has already executed, and the SysTick + count reloaded with ulReloadValue. Reset the + portNVIC_SYSTICK_LOAD_REG with whatever remains of this tick + period. */ + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG ); + + /* Don't allow a tiny value, or values that have somehow + underflowed because the post sleep hook did something + that took too long. */ + if( ( ulCalculatedLoadValue < ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) ) + { + ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ); + } + + portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue; + + /* The tick interrupt handler will already have pended the tick + processing in the kernel. As the pending tick will be + processed as soon as this function exits, the tick value + maintained by the tick is stepped forward by one less than the + time spent waiting. */ + ulCompleteTickPeriods = xExpectedIdleTime - 1UL; + } + else + { + /* Something other than the tick interrupt ended the sleep. + Work out how long the sleep lasted rounded to complete tick + periods (not the ulReload value which accounted for part + ticks). */ + ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - portNVIC_SYSTICK_CURRENT_VALUE_REG; + + /* How many complete tick periods passed while the processor + was waiting? */ + ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick; + + /* The reload value is set to whatever fraction of a single tick + period remains. */ + portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1 ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements; + } + + /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG + again, then set portNVIC_SYSTICK_LOAD_REG back to its standard + value. The critical section is used to ensure the tick interrupt + can only execute once in the case that the reload register is near + zero. */ + portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL; + portENTER_CRITICAL(); + { + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + vTaskStepTick( ulCompleteTickPeriods ); + portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL; + } + portEXIT_CRITICAL(); + } + } + +#endif /* #if configUSE_TICKLESS_IDLE */ + +/*-----------------------------------------------------------*/ + +/* + * Setup the SysTick timer to generate the tick interrupts at the required + * frequency. + */ +#if configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0 + + void vPortSetupTimerInterrupt( void ) + { + /* Calculate the constants required to configure the tick interrupt. */ + #if configUSE_TICKLESS_IDLE == 1 + { + ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ); + xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick; + ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ ); + } + #endif /* configUSE_TICKLESS_IDLE */ + + /* Configure SysTick to interrupt at the requested rate. */ + portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;; + portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT; + } + +#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */ +/*-----------------------------------------------------------*/ + +__asm unsigned long ulPortSetInterruptMask( void ) +{ + PRESERVE8 + + mrs r0, basepri + mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY + msr basepri, r1 + bx r14 +} +/*-----------------------------------------------------------*/ + +__asm void vPortClearInterruptMask( unsigned long ulNewMask ) +{ + PRESERVE8 + + msr basepri, r0 + bx r14 +} +/*-----------------------------------------------------------*/ + +__asm unsigned long vPortGetIPSR( void ) +{ + PRESERVE8 + + mrs r0, ipsr + bx r14 +} +/*-----------------------------------------------------------*/ + +#if( configASSERT_DEFINED == 1 ) + + void vPortValidateInterruptPriority( void ) + { + unsigned long ulCurrentInterrupt; + unsigned char ucCurrentPriority; + + /* Obtain the number of the currently executing interrupt. */ + ulCurrentInterrupt = vPortGetIPSR(); + + /* Is the interrupt number a user defined interrupt? */ + if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER ) + { + /* Look up the interrupt's priority. */ + ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ]; + + /* The following assertion will fail if a service routine (ISR) for + an interrupt that has been assigned a priority above + configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API + function. ISR safe FreeRTOS API functions must *only* be called + from interrupts that have been assigned a priority at or below + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Numerically low interrupt priority numbers represent logically high + interrupt priorities, therefore the priority of the interrupt must + be set to a value equal to or numerically *higher* than + configMAX_SYSCALL_INTERRUPT_PRIORITY. + + Interrupts that use the FreeRTOS API must not be left at their + default priority of zero as that is the highest possible priority, + which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY, + and therefore also guaranteed to be invalid. + + FreeRTOS maintains separate thread and ISR API functions to ensure + interrupt entry is as fast and simple as possible. + + The following links provide detailed information: + http://www.freertos.org/RTOS-Cortex-M3-M4.html + http://www.freertos.org/FAQHelp.html */ + configASSERT( ucCurrentPriority >= ucMaxSysCallPriority ); + } + + /* Priority grouping: The interrupt controller (NVIC) allows the bits + that define each interrupt's priority to be split between bits that + define the interrupt's pre-emption priority bits and bits that define + the interrupt's sub-priority. For simplicity all bits must be defined + to be pre-emption priority bits. The following assertion will fail if + this is not the case (if some bits represent a sub-priority). + + If the application only uses CMSIS libraries for interrupt + configuration then the correct setting can be achieved on all Cortex-M + devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the + scheduler. Note however that some vendor specific peripheral libraries + assume a non-zero priority group setting, in which cases using a value + of zero will result in unpredicable behaviour. */ + configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue ); + } + +#endif /* configASSERT_DEFINED */ + + diff --git a/third_party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/portmacro.h b/third_party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/portmacro.h new file mode 100644 index 0000000..144db9f --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/RVDS/ARM_CM4F/portmacro.h @@ -0,0 +1,178 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ + +/* Type definitions. */ +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE unsigned portLONG +#define portBASE_TYPE long + +#if( configUSE_16_BIT_TICKS == 1 ) + typedef unsigned portSHORT portTickType; + #define portMAX_DELAY ( portTickType ) 0xffff +#else + typedef unsigned portLONG portTickType; + #define portMAX_DELAY ( portTickType ) 0xffffffff +#endif +/*-----------------------------------------------------------*/ + +/* Architecture specifics. */ +#define portSTACK_GROWTH ( -1 ) +#define portTICK_RATE_MS ( ( portTickType ) 1000 / configTICK_RATE_HZ ) +#define portBYTE_ALIGNMENT 8 +/*-----------------------------------------------------------*/ + +/* Scheduler utilities. */ +extern void vPortYield( void ); +#define portNVIC_INT_CTRL_REG ( * ( ( volatile unsigned long * ) 0xe000ed04 ) ) +#define portNVIC_PENDSVSET_BIT ( 1UL << 28UL ) +#define portYIELD() vPortYield() +#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired ) portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT +#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x ) +/*-----------------------------------------------------------*/ + +/* Critical section management. */ +extern unsigned long ulPortSetInterruptMask( void ); +extern void vPortClearInterruptMask( unsigned long ulNewMask ); +extern void vPortEnterCritical( void ); +extern void vPortExitCritical( void ); + +#define portDISABLE_INTERRUPTS() ulPortSetInterruptMask() +#define portENABLE_INTERRUPTS() vPortClearInterruptMask( 0 ) +#define portENTER_CRITICAL() vPortEnterCritical() +#define portEXIT_CRITICAL() vPortExitCritical() +#define portSET_INTERRUPT_MASK_FROM_ISR() ulPortSetInterruptMask() +#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x) vPortClearInterruptMask(x) + +/*-----------------------------------------------------------*/ + +/* Tickless idle/low power functionality. */ +#ifndef portSUPPRESS_TICKS_AND_SLEEP + extern void vPortSuppressTicksAndSleep( portTickType xExpectedIdleTime ); + #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ) vPortSuppressTicksAndSleep( xExpectedIdleTime ) +#endif +/*-----------------------------------------------------------*/ + +/* Port specific optimisations. */ +#if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 + + /* Check the configuration. */ + #if( configMAX_PRIORITIES > 32 ) + #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 difference priorities as tasks that share a priority will time slice. + #endif + + /* Store/clear the ready priorities in a bit map. */ + #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) ) + #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) ) + + /*-----------------------------------------------------------*/ + + #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __clz( ( uxReadyPriorities ) ) ) + +#endif /* taskRECORD_READY_PRIORITY */ +/*-----------------------------------------------------------*/ + +/* Task function macros as described on the FreeRTOS.org WEB site. These are +not necessary for to use this port. They are defined so the common demo files +(which build with all the ports) will build. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) +/*-----------------------------------------------------------*/ + +#ifdef configASSERT + void vPortValidateInterruptPriority( void ); + #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() vPortValidateInterruptPriority() +#endif + +/* portNOP() is not required by this port. */ +#define portNOP() + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ + diff --git a/third_party/FreeRTOS/Source/portable/readme.txt b/third_party/FreeRTOS/Source/portable/readme.txt new file mode 100644 index 0000000..a20d687 --- /dev/null +++ b/third_party/FreeRTOS/Source/portable/readme.txt @@ -0,0 +1,19 @@ +Each real time kernel port consists of three files that contain the core kernel +components and are common to every port, and one or more files that are +specific to a particular microcontroller and/or compiler. + + ++ The FreeRTOS/Source/Portable/MemMang directory contains the three sample +memory allocators as described on the http://www.FreeRTOS.org WEB site. + ++ The other directories each contain files specific to a particular +microcontroller or compiler. + + + +For example, if you are interested in the GCC port for the ATMega323 +microcontroller then the port specific files are contained in +FreeRTOS/Source/Portable/GCC/ATMega323 directory. If this is the only +port you are interested in then all the other directories can be +ignored. + diff --git a/third_party/FreeRTOS/Source/queue.c b/third_party/FreeRTOS/Source/queue.c new file mode 100644 index 0000000..a94b03e --- /dev/null +++ b/third_party/FreeRTOS/Source/queue.c @@ -0,0 +1,2105 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" + +#if ( configUSE_CO_ROUTINES == 1 ) + #include "croutine.h" +#endif + +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + + +/* Constants used with the cRxLock and xTxLock structure members. */ +#define queueUNLOCKED ( ( signed portBASE_TYPE ) -1 ) +#define queueLOCKED_UNMODIFIED ( ( signed portBASE_TYPE ) 0 ) + +/* When the xQUEUE structure is used to represent a base queue its pcHead and +pcTail members are used as pointers into the queue storage area. When the +xQUEUE structure is used to represent a mutex pcHead and pcTail pointers are +not necessary, and the pcHead pointer is set to NULL to indicate that the +pcTail pointer actually points to the mutex holder (if any). Map alternative +names to the pcHead and pcTail structure members to ensure the readability of +the code is maintained despite this dual use of two structure members. An +alternative implementation would be to use a union, but use of a union is +against the coding standard (although an exception to the standard has been +permitted where the dual use also significantly changes the type of the +structure member). */ +#define pxMutexHolder pcTail +#define uxQueueType pcHead +#define queueQUEUE_IS_MUTEX NULL + +/* Semaphores do not actually store or copy data, so have an item size of +zero. */ +#define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( ( unsigned portBASE_TYPE ) 0 ) +#define queueMUTEX_GIVE_BLOCK_TIME ( ( portTickType ) 0U ) + +#if( configUSE_PREEMPTION == 0 ) + /* If the cooperative scheduler is being used then a yield should not be + performed just because a higher priority task has been woken. */ + #define queueYIELD_IF_USING_PREEMPTION() +#else + #define queueYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif + +/* + * Definition of the queue used by the scheduler. + * Items are queued by copy, not reference. + */ +typedef struct QueueDefinition +{ + signed char *pcHead; /*< Points to the beginning of the queue storage area. */ + signed char *pcTail; /*< Points to the byte at the end of the queue storage area. Once more byte is allocated than necessary to store the queue items, this is used as a marker. */ + + signed char *pcWriteTo; /*< Points to the free next place in the storage area. */ + + union /* Use of a union is an exception to the coding standard to ensure two mutually exclusive structure members don't appear simultaneously (wasting RAM). */ + { + signed char *pcReadFrom; /*< Points to the last place that a queued item was read from when the structure is used as a queue. */ + unsigned portBASE_TYPE uxRecursiveCallCount;/*< Maintains a count of the numebr of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */ + } u; + + xList xTasksWaitingToSend; /*< List of tasks that are blocked waiting to post onto this queue. Stored in priority order. */ + xList xTasksWaitingToReceive; /*< List of tasks that are blocked waiting to read from this queue. Stored in priority order. */ + + volatile unsigned portBASE_TYPE uxMessagesWaiting;/*< The number of items currently in the queue. */ + unsigned portBASE_TYPE uxLength; /*< The length of the queue defined as the number of items it will hold, not the number of bytes. */ + unsigned portBASE_TYPE uxItemSize; /*< The size of each items that the queue will hold. */ + + volatile signed portBASE_TYPE xRxLock; /*< Stores the number of items received from the queue (removed from the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + volatile signed portBASE_TYPE xTxLock; /*< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked. Set to queueUNLOCKED when the queue is not locked. */ + + #if ( configUSE_TRACE_FACILITY == 1 ) + unsigned char ucQueueNumber; + unsigned char ucQueueType; + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + struct QueueDefinition *pxQueueSetContainer; + #endif + +} xQUEUE; +/*-----------------------------------------------------------*/ + +/* + * The queue registry is just a means for kernel aware debuggers to locate + * queue structures. It has no other purpose so is an optional component. + */ +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + /* The type stored within the queue registry array. This allows a name + to be assigned to each queue making kernel aware debugging a little + more user friendly. */ + typedef struct QUEUE_REGISTRY_ITEM + { + signed char *pcQueueName; + xQueueHandle xHandle; + } xQueueRegistryItem; + + /* The queue registry is simply an array of xQueueRegistryItem structures. + The pcQueueName member of a structure being NULL is indicative of the + array position being vacant. */ + xQueueRegistryItem xQueueRegistry[ configQUEUE_REGISTRY_SIZE ]; + +#endif /* configQUEUE_REGISTRY_SIZE */ + +/* + * Unlocks a queue locked by a call to prvLockQueue. Locking a queue does not + * prevent an ISR from adding or removing items to the queue, but does prevent + * an ISR from removing tasks from the queue event lists. If an ISR finds a + * queue is locked it will instead increment the appropriate queue lock count + * to indicate that a task may require unblocking. When the queue in unlocked + * these lock counts are inspected, and the appropriate action taken. + */ +static void prvUnlockQueue( xQUEUE *pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any data in a queue. + * + * @return pdTRUE if the queue contains no items, otherwise pdFALSE. + */ +static signed portBASE_TYPE prvIsQueueEmpty( const xQUEUE *pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Uses a critical section to determine if there is any space in a queue. + * + * @return pdTRUE if there is no space, otherwise pdFALSE; + */ +static signed portBASE_TYPE prvIsQueueFull( const xQUEUE *pxQueue ) PRIVILEGED_FUNCTION; + +/* + * Copies an item into the queue, either at the front of the queue or the + * back of the queue. + */ +static void prvCopyDataToQueue( xQUEUE *pxQueue, const void *pvItemToQueue, portBASE_TYPE xPosition ) PRIVILEGED_FUNCTION; + +/* + * Copies an item out of a queue. + */ +static void prvCopyDataFromQueue( xQUEUE * const pxQueue, void * const pvBuffer ) PRIVILEGED_FUNCTION; + +#if ( configUSE_QUEUE_SETS == 1 ) + /* + * Checks to see if a queue is a member of a queue set, and if so, notifies + * the queue set that the queue contains data. + */ + static portBASE_TYPE prvNotifyQueueSetContainer( const xQUEUE * const pxQueue, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION; +#endif + +/*-----------------------------------------------------------*/ + +/* + * Macro to mark a queue as locked. Locking a queue prevents an ISR from + * accessing the queue event lists. + */ +#define prvLockQueue( pxQueue ) \ + taskENTER_CRITICAL(); \ + { \ + if( ( pxQueue )->xRxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->xRxLock = queueLOCKED_UNMODIFIED; \ + } \ + if( ( pxQueue )->xTxLock == queueUNLOCKED ) \ + { \ + ( pxQueue )->xTxLock = queueLOCKED_UNMODIFIED; \ + } \ + } \ + taskEXIT_CRITICAL() +/*-----------------------------------------------------------*/ + +portBASE_TYPE xQueueGenericReset( xQueueHandle xQueue, portBASE_TYPE xNewQueue ) +{ +xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + { + pxQueue->pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize ); + pxQueue->uxMessagesWaiting = ( unsigned portBASE_TYPE ) 0U; + pxQueue->pcWriteTo = pxQueue->pcHead; + pxQueue->u.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - ( unsigned portBASE_TYPE ) 1U ) * pxQueue->uxItemSize ); + pxQueue->xRxLock = queueUNLOCKED; + pxQueue->xTxLock = queueUNLOCKED; + + if( xNewQueue == pdFALSE ) + { + /* If there are tasks blocked waiting to read from the queue, then + the tasks will remain blocked as after this function exits the queue + will still be empty. If there are tasks blocked waiting to write to + the queue, then one should be unblocked as after this function exits + it will be possible to write to it. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + } + } + else + { + /* Ensure the event queues start in the correct state. */ + vListInitialise( &( pxQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxQueue->xTasksWaitingToReceive ) ); + } + } + taskEXIT_CRITICAL(); + + /* A value is returned for calling semantic consistency with previous + versions. */ + return pdPASS; +} +/*-----------------------------------------------------------*/ + +xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize, unsigned char ucQueueType ) +{ +xQUEUE *pxNewQueue; +size_t xQueueSizeInBytes; +xQueueHandle xReturn = NULL; + + /* Remove compiler warnings about unused parameters should + configUSE_TRACE_FACILITY not be set to 1. */ + ( void ) ucQueueType; + + /* Allocate the new queue structure. */ + if( uxQueueLength > ( unsigned portBASE_TYPE ) 0 ) + { + pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) ); + if( pxNewQueue != NULL ) + { + /* Create the list of pointers to queue items. The queue is one byte + longer than asked for to make wrap checking easier/faster. */ + xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ) + ( size_t ) 1; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + pxNewQueue->pcHead = ( signed char * ) pvPortMalloc( xQueueSizeInBytes ); + if( pxNewQueue->pcHead != NULL ) + { + /* Initialise the queue members as described above where the + queue type is defined. */ + pxNewQueue->uxLength = uxQueueLength; + pxNewQueue->uxItemSize = uxItemSize; + ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxNewQueue->ucQueueType = ucQueueType; + } + #endif /* configUSE_TRACE_FACILITY */ + + #if( configUSE_QUEUE_SETS == 1 ) + { + pxNewQueue->pxQueueSetContainer = NULL; + } + #endif /* configUSE_QUEUE_SETS */ + + traceQUEUE_CREATE( pxNewQueue ); + xReturn = pxNewQueue; + } + else + { + traceQUEUE_CREATE_FAILED( ucQueueType ); + vPortFree( pxNewQueue ); + } + } + } + + configASSERT( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + xQueueHandle xQueueCreateMutex( unsigned char ucQueueType ) + { + xQUEUE *pxNewQueue; + + /* Prevent compiler warnings about unused parameters if + configUSE_TRACE_FACILITY does not equal 1. */ + ( void ) ucQueueType; + + /* Allocate the new queue structure. */ + pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) ); + if( pxNewQueue != NULL ) + { + /* Information required for priority inheritance. */ + pxNewQueue->pxMutexHolder = NULL; + pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX; + + /* Queues used as a mutex no data is actually copied into or out + of the queue. */ + pxNewQueue->pcWriteTo = NULL; + pxNewQueue->u.pcReadFrom = NULL; + + /* Each mutex has a length of 1 (like a binary semaphore) and + an item size of 0 as nothing is actually copied into or out + of the mutex. */ + pxNewQueue->uxMessagesWaiting = ( unsigned portBASE_TYPE ) 0U; + pxNewQueue->uxLength = ( unsigned portBASE_TYPE ) 1U; + pxNewQueue->uxItemSize = ( unsigned portBASE_TYPE ) 0U; + pxNewQueue->xRxLock = queueUNLOCKED; + pxNewQueue->xTxLock = queueUNLOCKED; + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxNewQueue->ucQueueType = ucQueueType; + } + #endif + + #if ( configUSE_QUEUE_SETS == 1 ) + { + pxNewQueue->pxQueueSetContainer = NULL; + } + #endif + + /* Ensure the event queues start with the correct state. */ + vListInitialise( &( pxNewQueue->xTasksWaitingToSend ) ); + vListInitialise( &( pxNewQueue->xTasksWaitingToReceive ) ); + + traceCREATE_MUTEX( pxNewQueue ); + + /* Start with the semaphore in the expected state. */ + ( void ) xQueueGenericSend( pxNewQueue, NULL, ( portTickType ) 0U, queueSEND_TO_BACK ); + } + else + { + traceCREATE_MUTEX_FAILED(); + } + + configASSERT( pxNewQueue ); + return pxNewQueue; + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) + + void* xQueueGetMutexHolder( xQueueHandle xSemaphore ) + { + void *pxReturn; + + /* This function is called by xSemaphoreGetMutexHolder(), and should not + be called directly. Note: This is is a good way of determining if the + calling task is the mutex holder, but not a good way of determining the + identity of the mutex holder, as the holder may change between the + following critical section exiting and the function returning. */ + taskENTER_CRITICAL(); + { + if( ( ( xQUEUE * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX ) + { + pxReturn = ( void * ) ( ( xQUEUE * ) xSemaphore )->pxMutexHolder; + } + else + { + pxReturn = NULL; + } + } + taskEXIT_CRITICAL(); + + return pxReturn; + } + +#endif +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle xMutex ) + { + portBASE_TYPE xReturn; + xQUEUE * const pxMutex = ( xQUEUE * ) xMutex; + + configASSERT( pxMutex ); + + /* If this is the task that holds the mutex then pxMutexHolder will not + change outside of this task. If this task does not hold the mutex then + pxMutexHolder can never coincidentally equal the tasks handle, and as + this is the only condition we are interested in it does not matter if + pxMutexHolder is accessed simultaneously by another task. Therefore no + mutual exclusion is required to test the pxMutexHolder variable. */ + if( pxMutex->pxMutexHolder == ( void * ) xTaskGetCurrentTaskHandle() ) /*lint !e961 Not a redundant cast as xTaskHandle is a typedef. */ + { + traceGIVE_MUTEX_RECURSIVE( pxMutex ); + + /* uxRecursiveCallCount cannot be zero if pxMutexHolder is equal to + the task handle, therefore no underflow check is required. Also, + uxRecursiveCallCount is only modified by the mutex holder, and as + there can only be one, no mutual exclusion is required to modify the + uxRecursiveCallCount member. */ + ( pxMutex->u.uxRecursiveCallCount )--; + + /* Have we unwound the call count? */ + if( pxMutex->u.uxRecursiveCallCount == ( unsigned portBASE_TYPE ) 0 ) + { + /* Return the mutex. This will automatically unblock any other + task that might be waiting to access the mutex. */ + ( void ) xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK ); + } + + xReturn = pdPASS; + } + else + { + /* We cannot give the mutex because we are not the holder. */ + xReturn = pdFAIL; + + traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_RECURSIVE_MUTEXES == 1 ) + + portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime ) + { + portBASE_TYPE xReturn; + xQUEUE * const pxMutex = ( xQUEUE * ) xMutex; + + configASSERT( pxMutex ); + + /* Comments regarding mutual exclusion as per those within + xQueueGiveMutexRecursive(). */ + + traceTAKE_MUTEX_RECURSIVE( pxMutex ); + + if( pxMutex->pxMutexHolder == ( void * ) xTaskGetCurrentTaskHandle() ) /*lint !e961 Cast is not redundant as xTaskHandle is a typedef. */ + { + ( pxMutex->u.uxRecursiveCallCount )++; + xReturn = pdPASS; + } + else + { + xReturn = xQueueGenericReceive( pxMutex, NULL, xBlockTime, pdFALSE ); + + /* pdPASS will only be returned if we successfully obtained the mutex, + we may have blocked to reach here. */ + if( xReturn == pdPASS ) + { + ( pxMutex->u.uxRecursiveCallCount )++; + } + else + { + traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex ); + } + } + + return xReturn; + } + +#endif /* configUSE_RECURSIVE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_COUNTING_SEMAPHORES == 1 ) + + xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount ) + { + xQueueHandle xHandle; + + configASSERT( uxMaxCount != 0 ); + configASSERT( uxInitialCount <= uxMaxCount ); + + xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE ); + + if( xHandle != NULL ) + { + ( ( xQUEUE * ) xHandle )->uxMessagesWaiting = uxInitialCount; + + traceCREATE_COUNTING_SEMAPHORE(); + } + else + { + traceCREATE_COUNTING_SEMAPHORE_FAILED(); + } + + configASSERT( xHandle ); + return xHandle; + } + +#endif /* configUSE_COUNTING_SEMAPHORES */ +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) +{ +signed portBASE_TYPE xEntryTimeSet = pdFALSE; +xTimeOutType xTimeOut; +xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + + /* This function relaxes the coding standard somewhat to allow return + statements within the function itself. This is done in the interest + of execution time efficiency. */ + for( ;; ) + { + taskENTER_CRITICAL(); + { + /* Is there room on the queue now? The running task must be + the highest priority task wanting to access the queue. If + the head item in the queue is to be overwritten then it does + not matter if the queue is full. */ + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + traceQUEUE_SEND( pxQueue ); + prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) == pdTRUE ) + { + /* The queue is a member of a queue set, and posting + to the queue set caused a higher priority task to + unblock. A context switch is required. */ + queueYIELD_IF_USING_PREEMPTION(); + } + } + else + { + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) == pdTRUE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. Yes it is ok to + do this from within the critical section - the + kernel takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) == pdTRUE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. Yes it is ok to do + this from within the critical section - the kernel + takes care of that. */ + queueYIELD_IF_USING_PREEMPTION(); + } + } + } + #endif /* configUSE_QUEUE_SETS */ + + taskEXIT_CRITICAL(); + + /* Return to the original privilege level before exiting the + function. */ + return pdPASS; + } + else + { + if( xTicksToWait == ( portTickType ) 0 ) + { + /* The queue was full and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + + /* Return to the original privilege level before exiting + the function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was full and a block time was specified so + configure the timeout structure. */ + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + + /* Unlocking the queue means queue events can effect the + event list. It is possible that interrupts occurring now + remove this task from the event list again - but as the + scheduler is suspended the task will go onto the pending + ready last instead of the actual ready list. */ + prvUnlockQueue( pxQueue ); + + /* Resuming the scheduler will move tasks from the pending + ready list into the ready list - so it is feasible that this + task is already in a ready list before it yields - in which + case the yield will not cause a context switch unless there + is also a higher priority task in the pending ready list. */ + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + /* The timeout has expired. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + + /* Return to the original privilege level before exiting the + function. */ + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + } +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_ALTERNATIVE_API == 1 ) + + signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) + { + signed portBASE_TYPE xEntryTimeSet = pdFALSE; + xTimeOutType xTimeOut; + xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + for( ;; ) + { + taskENTER_CRITICAL(); + { + /* Is there room on the queue now? To be running we must be + the highest priority task wanting to access the queue. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + traceQUEUE_SEND( pxQueue ); + prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* If there was a task waiting for data to arrive on the + queue then unblock it now. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) == pdTRUE ) + { + /* The unblocked task has a priority higher than + our own so yield immediately. */ + portYIELD_WITHIN_API(); + } + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( portTickType ) 0 ) + { + taskEXIT_CRITICAL(); + return errQUEUE_FULL; + } + else if( xEntryTimeSet == pdFALSE ) + { + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_SEND( pxQueue ); + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait ); + portYIELD_WITHIN_API(); + } + } + else + { + taskEXIT_CRITICAL(); + traceQUEUE_SEND_FAILED( pxQueue ); + return errQUEUE_FULL; + } + } + taskEXIT_CRITICAL(); + } + } + +#endif /* configUSE_ALTERNATIVE_API */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_ALTERNATIVE_API == 1 ) + + signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) + { + signed portBASE_TYPE xEntryTimeSet = pdFALSE; + xTimeOutType xTimeOut; + signed char *pcOriginalReadPosition; + xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + for( ;; ) + { + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + /* Remember our read position in case we are just peeking. */ + pcOriginalReadPosition = pxQueue->u.pcReadFrom; + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + + if( xJustPeeking == pdFALSE ) + { + traceQUEUE_RECEIVE( pxQueue ); + + /* Data is actually being removed (not just peeked). */ + --( pxQueue->uxMessagesWaiting ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* Record the information required to implement + priority inheritance should it become necessary. */ + pxQueue->pxMutexHolder = ( signed char * ) xTaskGetCurrentTaskHandle(); + } + } + #endif + + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE ) + { + portYIELD_WITHIN_API(); + } + } + } + else + { + traceQUEUE_PEEK( pxQueue ); + + /* We are not removing the data, so reset our read + pointer. */ + pxQueue->u.pcReadFrom = pcOriginalReadPosition; + + /* The data is being left in the queue, so see if there are + any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + portYIELD_WITHIN_API(); + } + } + + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( portTickType ) 0 ) + { + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + } + } + taskEXIT_CRITICAL(); + + taskENTER_CRITICAL(); + { + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + portENTER_CRITICAL(); + { + vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder ); + } + portEXIT_CRITICAL(); + } + } + #endif + + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + portYIELD_WITHIN_API(); + } + } + else + { + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + } + taskEXIT_CRITICAL(); + } + } + + +#endif /* configUSE_ALTERNATIVE_API */ +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle xQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition ) +{ +signed portBASE_TYPE xReturn; +unsigned portBASE_TYPE uxSavedInterruptStatus; +xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are keep permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + /* Similar to xQueueGenericSend, except we don't block if there is no room + in the queue. Also we don't directly wake a task that was blocked on a + queue read, instead we return a flag to say whether a context switch is + required or not (i.e. has a task with a higher priority than us been woken + by this post). */ + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) ) + { + traceQUEUE_SEND_FROM_ISR( pxQueue ); + + prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition ); + + /* If the queue is locked we do not alter the event list. This will + be done when the queue is unlocked later. */ + if( pxQueue->xTxLock == queueUNLOCKED ) + { + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, xCopyPosition ) == pdTRUE ) + { + /* The queue is a member of a queue set, and posting + to the queue set caused a higher priority task to + unblock. A context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + } + } + else + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + } + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + } + } + } + #endif /* configUSE_QUEUE_SETS */ + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was posted while it was locked. */ + ++( pxQueue->xTxLock ); + } + + xReturn = pdPASS; + } + else + { + traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue ); + xReturn = errQUEUE_FULL; + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueGenericReceive( xQueueHandle xQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) +{ +signed portBASE_TYPE xEntryTimeSet = pdFALSE; +xTimeOutType xTimeOut; +signed char *pcOriginalReadPosition; +xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + /* This function relaxes the coding standard somewhat to allow return + statements within the function itself. This is done in the interest + of execution time efficiency. */ + + for( ;; ) + { + taskENTER_CRITICAL(); + { + /* Is there data in the queue now? To be running we must be + the highest priority task wanting to access the queue. */ + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + /* Remember the read position in case the queue is only being + peeked. */ + pcOriginalReadPosition = pxQueue->u.pcReadFrom; + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + + if( xJustPeeking == pdFALSE ) + { + traceQUEUE_RECEIVE( pxQueue ); + + /* Actually removing data, not just peeking. */ + --( pxQueue->uxMessagesWaiting ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* Record the information required to implement + priority inheritance should it become necessary. */ + pxQueue->pxMutexHolder = ( signed char * ) xTaskGetCurrentTaskHandle(); /*lint !e961 Cast is not redundant as xTaskHandle is a typedef. */ + } + } + #endif + + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) == pdTRUE ) + { + queueYIELD_IF_USING_PREEMPTION(); + } + } + } + else + { + traceQUEUE_PEEK( pxQueue ); + + /* The data is not being removed, so reset the read + pointer. */ + pxQueue->u.pcReadFrom = pcOriginalReadPosition; + + /* The data is being left in the queue, so see if there are + any other tasks waiting for the data. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than this task. */ + queueYIELD_IF_USING_PREEMPTION(); + } + } + } + + taskEXIT_CRITICAL(); + return pdPASS; + } + else + { + if( xTicksToWait == ( portTickType ) 0 ) + { + /* The queue was empty and no block time is specified (or + the block time has expired) so leave now. */ + taskEXIT_CRITICAL(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + else if( xEntryTimeSet == pdFALSE ) + { + /* The queue was empty and a block time was specified so + configure the timeout structure. */ + vTaskSetTimeOutState( &xTimeOut ); + xEntryTimeSet = pdTRUE; + } + else + { + /* Entry time was already set. */ + } + } + } + taskEXIT_CRITICAL(); + + /* Interrupts and other tasks can send to and receive from the queue + now the critical section has been exited. */ + + vTaskSuspendAll(); + prvLockQueue( pxQueue ); + + /* Update the timeout state to see if it has expired yet. */ + if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ) + { + if( prvIsQueueEmpty( pxQueue ) != pdFALSE ) + { + traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue ); + + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + portENTER_CRITICAL(); + { + vTaskPriorityInherit( ( void * ) pxQueue->pxMutexHolder ); + } + portEXIT_CRITICAL(); + } + } + #endif + + vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + prvUnlockQueue( pxQueue ); + if( xTaskResumeAll() == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + } + else + { + /* Try again. */ + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + } + } + else + { + prvUnlockQueue( pxQueue ); + ( void ) xTaskResumeAll(); + traceQUEUE_RECEIVE_FAILED( pxQueue ); + return errQUEUE_EMPTY; + } + } +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle xQueue, void * const pvBuffer, signed portBASE_TYPE *pxHigherPriorityTaskWoken ) +{ +signed portBASE_TYPE xReturn; +unsigned portBASE_TYPE uxSavedInterruptStatus; +xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are keep permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Cannot block in an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + traceQUEUE_RECEIVE_FROM_ISR( pxQueue ); + + prvCopyDataFromQueue( pxQueue, pvBuffer ); + --( pxQueue->uxMessagesWaiting ); + + /* If the queue is locked the event list will not be modified. + Instead update the lock count so the task that unlocks the queue + will know that an ISR has removed data while the queue was + locked. */ + if( pxQueue->xRxLock == queueUNLOCKED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + /* The task waiting has a higher priority than us so + force a context switch. */ + if( pxHigherPriorityTaskWoken != NULL ) + { + *pxHigherPriorityTaskWoken = pdTRUE; + } + } + } + } + else + { + /* Increment the lock count so the task that unlocks the queue + knows that data was removed while it was locked. */ + ++( pxQueue->xRxLock ); + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueuePeekFromISR( xQueueHandle xQueue, void * const pvBuffer ) +{ +signed portBASE_TYPE xReturn; +unsigned portBASE_TYPE uxSavedInterruptStatus; +signed char *pcOriginalReadPosition; +xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + configASSERT( pxQueue ); + configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) ); + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are keep permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + /* Cannot block in an ISR, so check there is data available. */ + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + traceQUEUE_PEEK_FROM_ISR( pxQueue ); + + /* Remember the read position so it can be reset as nothing is + actually being removed from the queue. */ + pcOriginalReadPosition = pxQueue->u.pcReadFrom; + prvCopyDataFromQueue( pxQueue, pvBuffer ); + pxQueue->u.pcReadFrom = pcOriginalReadPosition; + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue ); + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue ) +{ +unsigned portBASE_TYPE uxReturn; + + configASSERT( xQueue ); + + taskENTER_CRITICAL(); + uxReturn = ( ( xQUEUE * ) xQueue )->uxMessagesWaiting; + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxQueueSpacesAvailable( const xQueueHandle xQueue ) +{ +unsigned portBASE_TYPE uxReturn; +xQUEUE *pxQueue; + + pxQueue = ( xQUEUE * ) xQueue; + configASSERT( pxQueue ); + + taskENTER_CRITICAL(); + uxReturn = pxQueue->uxLength - pxQueue->uxMessagesWaiting; + taskEXIT_CRITICAL(); + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxQueueMessagesWaitingFromISR( const xQueueHandle xQueue ) +{ +unsigned portBASE_TYPE uxReturn; + + configASSERT( xQueue ); + + uxReturn = ( ( xQUEUE * ) xQueue )->uxMessagesWaiting; + + return uxReturn; +} /*lint !e818 Pointer cannot be declared const as xQueue is a typedef not pointer. */ +/*-----------------------------------------------------------*/ + +void vQueueDelete( xQueueHandle xQueue ) +{ +xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + configASSERT( pxQueue ); + + traceQUEUE_DELETE( pxQueue ); + #if ( configQUEUE_REGISTRY_SIZE > 0 ) + { + vQueueUnregisterQueue( pxQueue ); + } + #endif + vPortFree( pxQueue->pcHead ); + vPortFree( pxQueue ); +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + unsigned char ucQueueGetQueueNumber( xQueueHandle xQueue ) + { + return ( ( xQUEUE * ) xQueue )->ucQueueNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vQueueSetQueueNumber( xQueueHandle xQueue, unsigned char ucQueueNumber ) + { + ( ( xQUEUE * ) xQueue )->ucQueueNumber = ucQueueNumber; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + unsigned char ucQueueGetQueueType( xQueueHandle xQueue ) + { + return ( ( xQUEUE * ) xQueue )->ucQueueType; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +static void prvCopyDataToQueue( xQUEUE *pxQueue, const void *pvItemToQueue, portBASE_TYPE xPosition ) +{ + if( pxQueue->uxItemSize == ( unsigned portBASE_TYPE ) 0 ) + { + #if ( configUSE_MUTEXES == 1 ) + { + if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) + { + /* The mutex is no longer being held. */ + vTaskPriorityDisinherit( ( void * ) pxQueue->pxMutexHolder ); + pxQueue->pxMutexHolder = NULL; + } + } + #endif /* configUSE_MUTEXES */ + } + else if( xPosition == queueSEND_TO_BACK ) + { + ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 MISRA exception as the casts are only redundant for some ports, plus previous logic ensures a null pointer can only be passed to memcpy() if the copy size is 0. */ + pxQueue->pcWriteTo += pxQueue->uxItemSize; + if( pxQueue->pcWriteTo >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->pcWriteTo = pxQueue->pcHead; + } + } + else + { + ( void ) memcpy( ( void * ) pxQueue->u.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + pxQueue->u.pcReadFrom -= pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom < pxQueue->pcHead ) /*lint !e946 MISRA exception justified as comparison of pointers is the cleanest solution. */ + { + pxQueue->u.pcReadFrom = ( pxQueue->pcTail - pxQueue->uxItemSize ); + } + + if( xPosition == queueOVERWRITE ) + { + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + /* An item is not being added but overwritten, so subtract + one from the recorded number of items in the queue so when + one is added again below the number of recorded items remains + correct. */ + --( pxQueue->uxMessagesWaiting ); + } + } + } + + ++( pxQueue->uxMessagesWaiting ); +} +/*-----------------------------------------------------------*/ + +static void prvCopyDataFromQueue( xQUEUE * const pxQueue, void * const pvBuffer ) +{ + if( pxQueue->uxQueueType != queueQUEUE_IS_MUTEX ) + { + pxQueue->u.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) /*lint !e946 MISRA exception justified as use of the relational operator is the cleanest solutions. */ + { + pxQueue->u.pcReadFrom = pxQueue->pcHead; + } + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( size_t ) pxQueue->uxItemSize ); /*lint !e961 !e418 MISRA exception as the casts are only redundant for some ports. Also previous logic ensures a null pointer can only be passed to memcpy() when the count is 0. */ + } +} +/*-----------------------------------------------------------*/ + +static void prvUnlockQueue( xQUEUE *pxQueue ) +{ + /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */ + + /* The lock counts contains the number of extra data items placed or + removed from the queue while the queue was locked. When a queue is + locked items can be added or removed, but the event lists cannot be + updated. */ + taskENTER_CRITICAL(); + { + /* See if data was added to the queue while it was locked. */ + while( pxQueue->xTxLock > queueLOCKED_UNMODIFIED ) + { + /* Data was posted while the queue was locked. Are any tasks + blocked waiting for data to become available? */ + #if ( configUSE_QUEUE_SETS == 1 ) + { + if( pxQueue->pxQueueSetContainer != NULL ) + { + if( prvNotifyQueueSetContainer( pxQueue, queueSEND_TO_BACK ) == pdTRUE ) + { + /* The queue is a member of a queue set, and posting to + the queue set caused a higher priority task to unblock. + A context switch is required. */ + vTaskMissedYield(); + } + } + else + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + vTaskMissedYield(); + } + } + else + { + break; + } + } + } + #else /* configUSE_QUEUE_SETS */ + { + /* Tasks that are removed from the event list will get added to + the pending ready list as the scheduler is still suspended. */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority so record that a + context switch is required. */ + vTaskMissedYield(); + } + } + else + { + break; + } + } + #endif /* configUSE_QUEUE_SETS */ + + --( pxQueue->xTxLock ); + } + + pxQueue->xTxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); + + /* Do the same for the Rx lock. */ + taskENTER_CRITICAL(); + { + while( pxQueue->xRxLock > queueLOCKED_UNMODIFIED ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + vTaskMissedYield(); + } + + --( pxQueue->xRxLock ); + } + else + { + break; + } + } + + pxQueue->xRxLock = queueUNLOCKED; + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +static signed portBASE_TYPE prvIsQueueEmpty( const xQUEUE *pxQueue ) +{ +signed portBASE_TYPE xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle xQueue ) +{ +signed portBASE_TYPE xReturn; + + configASSERT( xQueue ); + if( ( ( xQUEUE * ) xQueue )->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ +/*-----------------------------------------------------------*/ + +static signed portBASE_TYPE prvIsQueueFull( const xQUEUE *pxQueue ) +{ +signed portBASE_TYPE xReturn; + + taskENTER_CRITICAL(); + { + if( pxQueue->uxMessagesWaiting == pxQueue->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xQueueIsQueueFullFromISR( const xQueueHandle xQueue ) +{ +signed portBASE_TYPE xReturn; + + configASSERT( xQueue ); + if( ( ( xQUEUE * ) xQueue )->uxMessagesWaiting == ( ( xQUEUE * ) xQueue )->uxLength ) + { + xReturn = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + signed portBASE_TYPE xQueueCRSend( xQueueHandle xQueue, const void *pvItemToQueue, portTickType xTicksToWait ) + { + signed portBASE_TYPE xReturn; + xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + /* If the queue is already full we may have to block. A critical section + is required to prevent an interrupt removing something from the queue + between the check to see if the queue is full and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( prvIsQueueFull( pxQueue ) != pdFALSE ) + { + /* The queue is full - do we want to block or just leave without + posting? */ + if( xTicksToWait > ( portTickType ) 0 ) + { + /* As this is called from a coroutine we cannot block directly, but + return indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + /* There is room in the queue, copy the data into the queue. */ + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + xReturn = pdPASS; + + /* Were any co-routines waiting for data to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + into the ready list as we are within a critical section. + Instead the same pending ready list mechanism is used as if + the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The co-routine waiting has a higher priority so record + that a yield might be appropriate. */ + xReturn = errQUEUE_YIELD; + } + } + } + else + { + xReturn = errQUEUE_FULL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + signed portBASE_TYPE xQueueCRReceive( xQueueHandle xQueue, void *pvBuffer, portTickType xTicksToWait ) + { + signed portBASE_TYPE xReturn; + xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + /* If the queue is already empty we may have to block. A critical section + is required to prevent an interrupt adding something to the queue + between the check to see if the queue is empty and blocking on the queue. */ + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0 ) + { + /* There are no messages in the queue, do we want to block or just + leave with nothing? */ + if( xTicksToWait > ( portTickType ) 0 ) + { + /* As this is a co-routine we cannot block directly, but return + indicating that we need to block. */ + vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) ); + portENABLE_INTERRUPTS(); + return errQUEUE_BLOCKED; + } + else + { + portENABLE_INTERRUPTS(); + return errQUEUE_FULL; + } + } + } + portENABLE_INTERRUPTS(); + + portDISABLE_INTERRUPTS(); + { + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + /* Data is available from the queue. */ + pxQueue->u.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->u.pcReadFrom = pxQueue->pcHead; + } + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + xReturn = pdPASS; + + /* Were any co-routines waiting for space to become available? */ + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + /* In this instance the co-routine could be placed directly + into the ready list as we are within a critical section. + Instead the same pending ready list mechanism is used as if + the event were caused from within an interrupt. */ + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + xReturn = errQUEUE_YIELD; + } + } + } + else + { + xReturn = pdFAIL; + } + } + portENABLE_INTERRUPTS(); + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + signed portBASE_TYPE xQueueCRSendFromISR( xQueueHandle xQueue, const void *pvItemToQueue, signed portBASE_TYPE xCoRoutinePreviouslyWoken ) + { + xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + /* Cannot block within an ISR so if there is no space on the queue then + exit without doing anything. */ + if( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) + { + prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK ); + + /* We only want to wake one co-routine per ISR, so check that a + co-routine has not already been woken. */ + if( xCoRoutinePreviouslyWoken == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) + { + return pdTRUE; + } + } + } + } + + return xCoRoutinePreviouslyWoken; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_CO_ROUTINES == 1 ) + + signed portBASE_TYPE xQueueCRReceiveFromISR( xQueueHandle xQueue, void *pvBuffer, signed portBASE_TYPE *pxCoRoutineWoken ) + { + signed portBASE_TYPE xReturn; + xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + /* We cannot block from an ISR, so check there is data available. If + not then just leave without doing anything. */ + if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 ) + { + /* Copy the data from the queue. */ + pxQueue->u.pcReadFrom += pxQueue->uxItemSize; + if( pxQueue->u.pcReadFrom >= pxQueue->pcTail ) + { + pxQueue->u.pcReadFrom = pxQueue->pcHead; + } + --( pxQueue->uxMessagesWaiting ); + ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.pcReadFrom, ( unsigned ) pxQueue->uxItemSize ); + + if( ( *pxCoRoutineWoken ) == pdFALSE ) + { + if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ) + { + if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ) + { + *pxCoRoutineWoken = pdTRUE; + } + } + } + + xReturn = pdPASS; + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif /* configUSE_CO_ROUTINES */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueAddToRegistry( xQueueHandle xQueue, signed char *pcQueueName ) + { + unsigned portBASE_TYPE ux; + + /* See if there is an empty space in the registry. A NULL name denotes + a free slot. */ + for( ux = ( unsigned portBASE_TYPE ) 0U; ux < ( unsigned portBASE_TYPE ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].pcQueueName == NULL ) + { + /* Store the information on this queue. */ + xQueueRegistry[ ux ].pcQueueName = pcQueueName; + xQueueRegistry[ ux ].xHandle = xQueue; + break; + } + } + } + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configQUEUE_REGISTRY_SIZE > 0 ) + + void vQueueUnregisterQueue( xQueueHandle xQueue ) + { + unsigned portBASE_TYPE ux; + + /* See if the handle of the queue being unregistered in actually in the + registry. */ + for( ux = ( unsigned portBASE_TYPE ) 0U; ux < ( unsigned portBASE_TYPE ) configQUEUE_REGISTRY_SIZE; ux++ ) + { + if( xQueueRegistry[ ux ].xHandle == xQueue ) + { + /* Set the name to NULL to show that this slot if free again. */ + xQueueRegistry[ ux ].pcQueueName = NULL; + break; + } + } + + } /*lint !e818 xQueue could not be pointer to const because it is a typedef. */ + +#endif /* configQUEUE_REGISTRY_SIZE */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TIMERS == 1 ) + + void vQueueWaitForMessageRestricted( xQueueHandle xQueue, portTickType xTicksToWait ) + { + xQUEUE * const pxQueue = ( xQUEUE * ) xQueue; + + /* This function should not be called by application code hence the + 'Restricted' in its name. It is not part of the public API. It is + designed for use by kernel code, and has special calling requirements. + It can result in vListInsert() being called on a list that can only + possibly ever have one item in it, so the list will be fast, but even + so it should be called with the scheduler locked and not from a critical + section. */ + + /* Only do anything if there are no messages in the queue. This function + will not actually cause the task to block, just place it on a blocked + list. It will not block until the scheduler is unlocked - at which + time a yield will be performed. If an item is added to the queue while + the queue is locked, and the calling task blocks on the queue, then the + calling task will be immediately unblocked when the queue is unlocked. */ + prvLockQueue( pxQueue ); + if( pxQueue->uxMessagesWaiting == ( unsigned portBASE_TYPE ) 0U ) + { + /* There is nothing in the queue, block for the specified period. */ + vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait ); + } + prvUnlockQueue( pxQueue ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + xQueueSetHandle xQueueCreateSet( unsigned portBASE_TYPE uxEventQueueLength ) + { + xQueueSetHandle pxQueue; + + pxQueue = xQueueGenericCreate( uxEventQueueLength, sizeof( xQUEUE * ), queueQUEUE_TYPE_SET ); + + return pxQueue; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + portBASE_TYPE xQueueAddToSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet ) + { + portBASE_TYPE xReturn; + + if( ( ( xQUEUE * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL ) + { + /* Cannot add a queue/semaphore to more than one queue set. */ + xReturn = pdFAIL; + } + else if( ( ( xQUEUE * ) xQueueOrSemaphore )->uxMessagesWaiting != ( unsigned portBASE_TYPE ) 0 ) + { + /* Cannot add a queue/semaphore to a queue set if there are already + items in the queue/semaphore. */ + xReturn = pdFAIL; + } + else + { + taskENTER_CRITICAL(); + { + ( ( xQUEUE * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet; + } + taskEXIT_CRITICAL(); + xReturn = pdPASS; + } + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + portBASE_TYPE xQueueRemoveFromSet( xQueueSetMemberHandle xQueueOrSemaphore, xQueueSetHandle xQueueSet ) + { + portBASE_TYPE xReturn; + xQUEUE * const pxQueueOrSemaphore = ( xQUEUE * ) xQueueOrSemaphore; + + if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet ) + { + /* The queue was not a member of the set. */ + xReturn = pdFAIL; + } + else if( pxQueueOrSemaphore->uxMessagesWaiting != ( unsigned portBASE_TYPE ) 0 ) + { + /* It is dangerous to remove a queue from a set when the queue is + not empty because the queue set will still hold pending events for + the queue. */ + xReturn = pdFAIL; + } + else + { + taskENTER_CRITICAL(); + { + /* The queue is no longer contained in the set. */ + pxQueueOrSemaphore->pxQueueSetContainer = NULL; + } + taskEXIT_CRITICAL(); + xReturn = pdPASS; + } + + return xReturn; + } /*lint !e818 xQueueSet could not be declared as pointing to const as it is a typedef. */ + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + xQueueSetMemberHandle xQueueSelectFromSet( xQueueSetHandle xQueueSet, portTickType xBlockTimeTicks ) + { + xQueueSetMemberHandle xReturn = NULL; + + ( void ) xQueueGenericReceive( ( xQueueHandle ) xQueueSet, &xReturn, xBlockTimeTicks, pdFALSE ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + xQueueSetMemberHandle xQueueSelectFromSetFromISR( xQueueSetHandle xQueueSet ) + { + xQueueSetMemberHandle xReturn = NULL; + + ( void ) xQueueReceiveFromISR( ( xQueueHandle ) xQueueSet, &xReturn, NULL ); /*lint !e961 Casting from one typedef to another is not redundant. */ + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_QUEUE_SETS == 1 ) + + static portBASE_TYPE prvNotifyQueueSetContainer( const xQUEUE * const pxQueue, portBASE_TYPE xCopyPosition ) + { + xQUEUE *pxQueueSetContainer = pxQueue->pxQueueSetContainer; + portBASE_TYPE xReturn = pdFALSE; + + configASSERT( pxQueueSetContainer ); + configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ); + + if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength ) + { + traceQUEUE_SEND( pxQueueSetContainer ); + /* The data copies is the handle of the queue that contains data. */ + prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, xCopyPosition ); + if( listLIST_IS_EMPTY( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) == pdFALSE ) + { + if( xTaskRemoveFromEventList( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) != pdFALSE ) + { + /* The task waiting has a higher priority */ + xReturn = pdTRUE; + } + } + } + + return xReturn; + } + +#endif /* configUSE_QUEUE_SETS */ + + + + + + + + + + + + diff --git a/third_party/FreeRTOS/Source/readme.txt b/third_party/FreeRTOS/Source/readme.txt new file mode 100644 index 0000000..81518ec --- /dev/null +++ b/third_party/FreeRTOS/Source/readme.txt @@ -0,0 +1,17 @@ +Each real time kernel port consists of three files that contain the core kernel +components and are common to every port, and one or more files that are +specific to a particular microcontroller and or compiler. + ++ The FreeRTOS/Source directory contains the three files that are common to +every port - list.c, queue.c and tasks.c. The kernel is contained within these +three files. croutine.c implements the optional co-routine functionality - which +is normally only used on very memory limited systems. + ++ The FreeRTOS/Source/Portable directory contains the files that are specific to +a particular microcontroller and or compiler. + ++ The FreeRTOS/Source/include directory contains the real time kernel header +files. + +See the readme file in the FreeRTOS/Source/Portable directory for more +information. \ No newline at end of file diff --git a/third_party/FreeRTOS/Source/tasks.c b/third_party/FreeRTOS/Source/tasks.c new file mode 100644 index 0000000..c0f1519 --- /dev/null +++ b/third_party/FreeRTOS/Source/tasks.c @@ -0,0 +1,2978 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" +#include "timers.h" +#include "StackMacros.h" + +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + +#if ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) + /* At the bottom of this file are two optional functions that can be used + to generate human readable text from the raw data generated by the + uxTaskGetSystemState() function. Note the formatting functions are provided + for convenience only, and are NOT considered part of the kernel. */ + #include +#endif /* configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) */ + +/* Sanity check the configuration. */ +#if configUSE_TICKLESS_IDLE != 0 + #if INCLUDE_vTaskSuspend != 1 + #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0 + #endif /* INCLUDE_vTaskSuspend */ +#endif /* configUSE_TICKLESS_IDLE */ + +/* + * Defines the size, in words, of the stack allocated to the idle task. + */ +#define tskIDLE_STACK_SIZE configMINIMAL_STACK_SIZE + +#if( configUSE_PREEMPTION == 0 ) + /* If the cooperative scheduler is being used then a yield should not be + performed just because a higher priority task has been woken. */ + #define taskYIELD_IF_USING_PREEMPTION() +#else + #define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() +#endif + +/* + * Task control block. A task control block (TCB) is allocated for each task, + * and stores task state information, including a pointer to the task's context + * (the task's run time environment, including register values) + */ +typedef struct tskTaskControlBlock +{ + volatile portSTACK_TYPE *pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + xMPU_SETTINGS xMPUSettings; /*< The MPU settings are defined as part of the port layer. THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */ + #endif + + xListItem xGenericListItem; /*< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */ + xListItem xEventListItem; /*< Used to reference a task from an event list. */ + unsigned portBASE_TYPE uxPriority; /*< The priority of the task. 0 is the lowest priority. */ + portSTACK_TYPE *pxStack; /*< Points to the start of the stack. */ + signed char pcTaskName[ configMAX_TASK_NAME_LEN ];/*< Descriptive name given to the task when created. Facilitates debugging only. */ + + #if ( portSTACK_GROWTH > 0 ) + portSTACK_TYPE *pxEndOfStack; /*< Points to the end of the stack on architectures where the stack grows up from low memory. */ + #endif + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + unsigned portBASE_TYPE uxCriticalNesting; /*< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */ + #endif + + #if ( configUSE_TRACE_FACILITY == 1 ) + unsigned portBASE_TYPE uxTCBNumber; /*< Stores a number that increments each time a TCB is created. It allows debuggers to determine when a task has been deleted and then recreated. */ + unsigned portBASE_TYPE uxTaskNumber; /*< Stores a number specifically for use by third party trace code. */ + #endif + + #if ( configUSE_MUTEXES == 1 ) + unsigned portBASE_TYPE uxBasePriority; /*< The priority last assigned to the task - used by the priority inheritance mechanism. */ + #endif + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + pdTASK_HOOK_CODE pxTaskTag; + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + unsigned long ulRunTimeCounter; /*< Stores the amount of time the task has spent in the Running state. */ + #endif + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + /* Allocate a Newlib reent structure that is specific to this task. + Note Newlib support has been included by popular demand, but is not + used by the FreeRTOS maintainers themselves. FreeRTOS is not + responsible for resulting newlib operation. User must be familiar with + newlib and must provide system-wide implementations of the necessary + stubs. Be warned that (at the time of writing) the current newlib design + implements a system-wide malloc() that must be provided with locks. */ + struct _reent xNewLib_reent; + #endif + +} tskTCB; + + +/* + * Some kernel aware debuggers require the data the debugger needs access to to + * be global, rather than file scope. + */ +#ifdef portREMOVE_STATIC_QUALIFIER + #define static +#endif + +/*lint -e956 A manual analysis and inspection has been used to determine which +static variables must be declared volatile. */ + +PRIVILEGED_DATA tskTCB * volatile pxCurrentTCB = NULL; + +/* Lists for ready and blocked tasks. --------------------*/ +PRIVILEGED_DATA static xList pxReadyTasksLists[ configMAX_PRIORITIES ]; /*< Prioritised ready tasks. */ +PRIVILEGED_DATA static xList xDelayedTaskList1; /*< Delayed tasks. */ +PRIVILEGED_DATA static xList xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */ +PRIVILEGED_DATA static xList * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */ +PRIVILEGED_DATA static xList * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */ +PRIVILEGED_DATA static xList xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */ + +#if ( INCLUDE_vTaskDelete == 1 ) + + PRIVILEGED_DATA static xList xTasksWaitingTermination; /*< Tasks that have been deleted - but the their memory not yet freed. */ + PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxTasksDeleted = ( unsigned portBASE_TYPE ) 0U; + +#endif + +#if ( INCLUDE_vTaskSuspend == 1 ) + + PRIVILEGED_DATA static xList xSuspendedTaskList; /*< Tasks that are currently suspended. */ + +#endif + +#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + + PRIVILEGED_DATA static xTaskHandle xIdleTaskHandle = NULL; /*< Holds the handle of the idle task. The idle task is created automatically when the scheduler is started. */ + +#endif + +/* Other file private variables. --------------------------------*/ +PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxCurrentNumberOfTasks = ( unsigned portBASE_TYPE ) 0U; +PRIVILEGED_DATA static volatile portTickType xTickCount = ( portTickType ) 0U; +PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxTopReadyPriority = tskIDLE_PRIORITY; +PRIVILEGED_DATA static volatile signed portBASE_TYPE xSchedulerRunning = pdFALSE; +PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxSchedulerSuspended = ( unsigned portBASE_TYPE ) pdFALSE; +PRIVILEGED_DATA static volatile unsigned portBASE_TYPE uxPendedTicks = ( unsigned portBASE_TYPE ) 0U; +PRIVILEGED_DATA static volatile portBASE_TYPE xYieldPending = pdFALSE; +PRIVILEGED_DATA static volatile portBASE_TYPE xNumOfOverflows = ( portBASE_TYPE ) 0; +PRIVILEGED_DATA static unsigned portBASE_TYPE uxTaskNumber = ( unsigned portBASE_TYPE ) 0U; +PRIVILEGED_DATA static volatile portTickType xNextTaskUnblockTime = portMAX_DELAY; + +#if ( configGENERATE_RUN_TIME_STATS == 1 ) + + PRIVILEGED_DATA static unsigned long ulTaskSwitchedInTime = 0UL; /*< Holds the value of a timer/counter the last time a task was switched in. */ + PRIVILEGED_DATA static unsigned long ulTotalRunTime = 0UL; /*< Holds the total amount of execution time as defined by the run time counter clock. */ + +#endif + +/*lint +e956 */ + +/* Debugging and trace facilities private variables and macros. ------------*/ + +/* + * The value used to fill the stack of a task when the task is created. This + * is used purely for checking the high water mark for tasks. + */ +#define tskSTACK_FILL_BYTE ( 0xa5U ) + +/* + * Macros used by vListTask to indicate which state a task is in. + */ +#define tskBLOCKED_CHAR ( ( signed char ) 'B' ) +#define tskREADY_CHAR ( ( signed char ) 'R' ) +#define tskDELETED_CHAR ( ( signed char ) 'D' ) +#define tskSUSPENDED_CHAR ( ( signed char ) 'S' ) + +/*-----------------------------------------------------------*/ + +#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) + + /* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 0 then task selection is + performed in a generic way that is not optimised to any particular + microcontroller architecture. */ + + /* uxTopReadyPriority holds the priority of the highest priority ready + state task. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) \ + { \ + if( ( uxPriority ) > uxTopReadyPriority ) \ + { \ + uxTopReadyPriority = ( uxPriority ); \ + } \ + } /* taskRECORD_READY_PRIORITY */ + + /*-----------------------------------------------------------*/ + + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + /* Find the highest priority queue that contains ready tasks. */ \ + while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) ) \ + { \ + configASSERT( uxTopReadyPriority ); \ + --uxTopReadyPriority; \ + } \ + \ + /* listGET_OWNER_OF_NEXT_ENTRY indexes through the list, so the tasks of \ + the same priority get an equal share of the processor time. */ \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopReadyPriority ] ) ); \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK */ + + /*-----------------------------------------------------------*/ + + /* Define away taskRESET_READY_PRIORITY() and portRESET_READY_PRIORITY() as + they are only required when a port optimised method of task selection is + being used. */ + #define taskRESET_READY_PRIORITY( uxPriority ) + #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority ) + +#else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + + /* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 1 then task selection is + performed in a way that is tailored to the particular microcontroller + architecture being used. */ + + /* A port optimised version is provided. Call the port defined macros. */ + #define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority ) + + /*-----------------------------------------------------------*/ + + #define taskSELECT_HIGHEST_PRIORITY_TASK() \ + { \ + unsigned portBASE_TYPE uxTopPriority; \ + \ + /* Find the highest priority queue that contains ready tasks. */ \ + portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \ + configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \ + listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ + } /* taskSELECT_HIGHEST_PRIORITY_TASK() */ + + /*-----------------------------------------------------------*/ + + /* A port optimised version is provided, call it only if the TCB being reset + is being referenced from a ready list. If it is referenced from a delayed + or suspended list then it won't be in a ready list. */ + #define taskRESET_READY_PRIORITY( uxPriority ) \ + { \ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == 0 ) \ + { \ + portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ + } \ + } + +#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */ + +/*-----------------------------------------------------------*/ + +/* pxDelayedTaskList and pxOverflowDelayedTaskList are switched when the tick +count overflows. */ +#define taskSWITCH_DELAYED_LISTS() \ +{ \ + xList *pxTemp; \ + \ + /* The delayed tasks list should be empty when the lists are switched. */ \ + configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); \ + \ + pxTemp = pxDelayedTaskList; \ + pxDelayedTaskList = pxOverflowDelayedTaskList; \ + pxOverflowDelayedTaskList = pxTemp; \ + xNumOfOverflows++; \ + \ + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) \ + { \ + /* The new current delayed list is empty. Set \ + xNextTaskUnblockTime to the maximum possible value so it is \ + extremely unlikely that the \ + if( xTickCount >= xNextTaskUnblockTime ) test will pass until \ + there is an item in the delayed list. */ \ + xNextTaskUnblockTime = portMAX_DELAY; \ + } \ + else \ + { \ + /* The new current delayed list is not empty, get the value of \ + the item at the head of the delayed list. This is the time at \ + which the task at the head of the delayed list should be removed \ + from the Blocked state. */ \ + pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); \ + xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) ); \ + } \ +} + +/*-----------------------------------------------------------*/ + +/* + * Place the task represented by pxTCB into the appropriate ready list for + * the task. It is inserted at the end of the list. + */ +#define prvAddTaskToReadyList( pxTCB ) \ + traceMOVED_TASK_TO_READY_STATE( pxTCB ) \ + taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ + vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xGenericListItem ) ) +/*-----------------------------------------------------------*/ + +/* + * Several functions take an xTaskHandle parameter that can optionally be NULL, + * where NULL is used to indicate that the handle of the currently executing + * task should be used in place of the parameter. This macro simply checks to + * see if the parameter is NULL and returns a pointer to the appropriate TCB. + */ +#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? ( tskTCB * ) pxCurrentTCB : ( tskTCB * ) ( pxHandle ) ) + +/* Callback function prototypes. --------------------------*/ +extern void vApplicationStackOverflowHook( xTaskHandle xTask, signed char *pcTaskName ); +extern void vApplicationTickHook( void ); + +/* File private functions. --------------------------------*/ + +/* + * Utility to ready a TCB for a given task. Mainly just copies the parameters + * into the TCB structure. + */ +static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed char * const pcName, unsigned portBASE_TYPE uxPriority, const xMemoryRegion * const xRegions, unsigned short usStackDepth ) PRIVILEGED_FUNCTION; + +/* + * Utility to ready all the lists used by the scheduler. This is called + * automatically upon the creation of the first task. + */ +static void prvInitialiseTaskLists( void ) PRIVILEGED_FUNCTION; + +/* + * The idle task, which as all tasks is implemented as a never ending loop. + * The idle task is automatically created and added to the ready lists upon + * creation of the first user task. + * + * The portTASK_FUNCTION_PROTO() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ); + +/* + * Utility to free all memory allocated by the scheduler to hold a TCB, + * including the stack pointed to by the TCB. + * + * This does not free memory allocated by the task itself (i.e. memory + * allocated by calls to pvPortMalloc from within the tasks application code). + */ +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( tskTCB *pxTCB ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Used only by the idle task. This checks to see if anything has been placed + * in the list of tasks waiting to be deleted. If so the task is cleaned up + * and its TCB deleted. + */ +static void prvCheckTasksWaitingTermination( void ) PRIVILEGED_FUNCTION; + +/* + * The currently executing task is entering the Blocked state. Add the task to + * either the current or the overflow delayed task list. + */ +static void prvAddCurrentTaskToDelayedList( portTickType xTimeToWake ) PRIVILEGED_FUNCTION; + +/* + * Allocates memory from the heap for a TCB and associated stack. Checks the + * allocation was successful. + */ +static tskTCB *prvAllocateTCBAndStack( unsigned short usStackDepth, portSTACK_TYPE *puxStackBuffer ) PRIVILEGED_FUNCTION; + +/* + * Fills an xTaskStatusType structure with information on each task that is + * referenced from the pxList list (which may be a ready list, a delayed list, + * a suspended list, etc.). + * + * THIS FUNCTION IS INTENDED FOR DEBUGGING ONLY, AND SHOULD NOT BE CALLED FROM + * NORMAL APPLICATION CODE. + */ +#if ( configUSE_TRACE_FACILITY == 1 ) + + static unsigned portBASE_TYPE prvListTaskWithinSingleList( xTaskStatusType *pxTaskStatusArray, xList *pxList, eTaskState eState ) PRIVILEGED_FUNCTION; + +#endif + +/* + * When a task is created, the stack of the task is filled with a known value. + * This function determines the 'high water mark' of the task stack by + * determining how much of the stack remains at the original preset value. + */ +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) + + static unsigned short prvTaskCheckFreeStackSpace( const unsigned char * pucStackByte ) PRIVILEGED_FUNCTION; + +#endif + +/* + * Return the amount of time, in ticks, that will pass before the kernel will + * next move a task from the Blocked state to the Running state. + * + * This conditional compilation should use inequality to 0, not equality to 1. + * This is to ensure portSUPPRESS_TICKS_AND_SLEEP() can be called when user + * defined low power mode implementations require configUSE_TICKLESS_IDLE to be + * set to a value other than 1. + */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static portTickType prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION; + +#endif + +signed portBASE_TYPE xTaskGenericCreate( pdTASK_CODE pxTaskCode, const signed char * const pcName, unsigned short usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask, portSTACK_TYPE *puxStackBuffer, const xMemoryRegion * const xRegions ) +{ +signed portBASE_TYPE xReturn; +tskTCB * pxNewTCB; + + configASSERT( pxTaskCode ); + configASSERT( ( ( uxPriority & ( ~portPRIVILEGE_BIT ) ) < configMAX_PRIORITIES ) ); + + /* Allocate the memory required by the TCB and stack for the new task, + checking that the allocation was successful. */ + pxNewTCB = prvAllocateTCBAndStack( usStackDepth, puxStackBuffer ); + + if( pxNewTCB != NULL ) + { + portSTACK_TYPE *pxTopOfStack; + + #if( portUSING_MPU_WRAPPERS == 1 ) + /* Should the task be created in privileged mode? */ + portBASE_TYPE xRunPrivileged; + if( ( uxPriority & portPRIVILEGE_BIT ) != 0U ) + { + xRunPrivileged = pdTRUE; + } + else + { + xRunPrivileged = pdFALSE; + } + uxPriority &= ~portPRIVILEGE_BIT; + #endif /* portUSING_MPU_WRAPPERS == 1 */ + + /* Calculate the top of stack address. This depends on whether the + stack grows from high memory to low (as per the 80x86) or visa versa. + portSTACK_GROWTH is used to make the result positive or negative as + required by the port. */ + #if( portSTACK_GROWTH < 0 ) + { + pxTopOfStack = pxNewTCB->pxStack + ( usStackDepth - ( unsigned short ) 1 ); + pxTopOfStack = ( portSTACK_TYPE * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ( portPOINTER_SIZE_TYPE ) ~portBYTE_ALIGNMENT_MASK ) ); /*lint !e923 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. */ + + /* Check the alignment of the calculated top of stack is correct. */ + configASSERT( ( ( ( unsigned long ) pxTopOfStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + } + #else /* portSTACK_GROWTH */ + { + pxTopOfStack = pxNewTCB->pxStack; + + /* Check the alignment of the stack buffer is correct. */ + configASSERT( ( ( ( unsigned long ) pxNewTCB->pxStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) ); + + /* If we want to use stack checking on architectures that use + a positive stack growth direction then we also need to store the + other extreme of the stack space. */ + pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( usStackDepth - 1 ); + } + #endif /* portSTACK_GROWTH */ + + /* Setup the newly allocated TCB with the initial state of the task. */ + prvInitialiseTCBVariables( pxNewTCB, pcName, uxPriority, xRegions, usStackDepth ); + + /* Initialize the TCB stack to look as if the task was already running, + but had been interrupted by the scheduler. The return address is set + to the start of the task function. Once the stack has been initialised + the top of stack variable is updated. */ + #if( portUSING_MPU_WRAPPERS == 1 ) + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged ); + } + #else /* portUSING_MPU_WRAPPERS */ + { + pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters ); + } + #endif /* portUSING_MPU_WRAPPERS */ + + if( ( void * ) pxCreatedTask != NULL ) + { + /* Pass the TCB out - in an anonymous way. The calling function/ + task can use this as a handle to delete the task later if + required.*/ + *pxCreatedTask = ( xTaskHandle ) pxNewTCB; + } + + /* Ensure interrupts don't access the task lists while they are being + updated. */ + taskENTER_CRITICAL(); + { + uxCurrentNumberOfTasks++; + if( pxCurrentTCB == NULL ) + { + /* There are no other tasks, or all the other tasks are in + the suspended state - make this the current task. */ + pxCurrentTCB = pxNewTCB; + + if( uxCurrentNumberOfTasks == ( unsigned portBASE_TYPE ) 1 ) + { + /* This is the first task to be created so do the preliminary + initialisation required. We will not recover if this call + fails, but we will report the failure. */ + prvInitialiseTaskLists(); + } + } + else + { + /* If the scheduler is not already running, make this task the + current task if it is the highest priority task to be created + so far. */ + if( xSchedulerRunning == pdFALSE ) + { + if( pxCurrentTCB->uxPriority <= uxPriority ) + { + pxCurrentTCB = pxNewTCB; + } + } + } + + uxTaskNumber++; + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Add a counter into the TCB for tracing only. */ + pxNewTCB->uxTCBNumber = uxTaskNumber; + } + #endif /* configUSE_TRACE_FACILITY */ + traceTASK_CREATE( pxNewTCB ); + + prvAddTaskToReadyList( pxNewTCB ); + + xReturn = pdPASS; + portSETUP_TCB( pxNewTCB ); + } + taskEXIT_CRITICAL(); + } + else + { + xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY; + traceTASK_CREATE_FAILED(); + } + + if( xReturn == pdPASS ) + { + if( xSchedulerRunning != pdFALSE ) + { + /* If the created task is of a higher priority than the current task + then it should run now. */ + if( pxCurrentTCB->uxPriority < uxPriority ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + } + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + void vTaskDelete( xTaskHandle xTaskToDelete ) + { + tskTCB *pxTCB; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then we are deleting ourselves. */ + pxTCB = prvGetTCBFromHandle( xTaskToDelete ); + + /* Remove task from the ready list and place in the termination list. + This will stop the task from be scheduled. The idle task will check + the termination list and free up any memory allocated by the + scheduler for the TCB and stack. */ + if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( unsigned portBASE_TYPE ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + + vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xGenericListItem ) ); + + /* Increment the ucTasksDeleted variable so the idle task knows + there is a task that has been deleted and that it should therefore + check the xTasksWaitingTermination list. */ + ++uxTasksDeleted; + + /* Increment the uxTaskNumberVariable also so kernel aware debuggers + can detect that the task lists need re-generating. */ + uxTaskNumber++; + + traceTASK_DELETE( pxTCB ); + } + taskEXIT_CRITICAL(); + + /* Force a reschedule if we have just deleted the current task. */ + if( xSchedulerRunning != pdFALSE ) + { + if( pxTCB == pxCurrentTCB ) + { + portYIELD_WITHIN_API(); + } + } + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelayUntil == 1 ) + + void vTaskDelayUntil( portTickType * const pxPreviousWakeTime, portTickType xTimeIncrement ) + { + portTickType xTimeToWake; + portBASE_TYPE xAlreadyYielded, xShouldDelay = pdFALSE; + + configASSERT( pxPreviousWakeTime ); + configASSERT( ( xTimeIncrement > 0U ) ); + + vTaskSuspendAll(); + { + /* Minor optimisation. The tick count cannot change in this + block. */ + const portTickType xConstTickCount = xTickCount; + + /* Generate the tick time at which the task wants to wake. */ + xTimeToWake = *pxPreviousWakeTime + xTimeIncrement; + + if( xConstTickCount < *pxPreviousWakeTime ) + { + /* The tick count has overflowed since this function was + lasted called. In this case the only time we should ever + actually delay is if the wake time has also overflowed, + and the wake time is greater than the tick time. When this + is the case it is as if neither time had overflowed. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + } + else + { + /* The tick time has not overflowed. In this case we will + delay if either the wake time has overflowed, and/or the + tick time is less than the wake time. */ + if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) ) + { + xShouldDelay = pdTRUE; + } + } + + /* Update the wake time ready for the next call. */ + *pxPreviousWakeTime = xTimeToWake; + + if( xShouldDelay != pdFALSE ) + { + traceTASK_DELAY_UNTIL(); + + /* We must remove ourselves from the ready list before adding + ourselves to the blocked list as the same list item is used for + both lists. */ + if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( unsigned portBASE_TYPE ) 0 ) + { + /* The current task must be in a ready list, so there is + no need to check, and the port reset macro can be called + directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); + } + + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + } + xAlreadyYielded = xTaskResumeAll(); + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + } + +#endif /* INCLUDE_vTaskDelayUntil */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelay == 1 ) + + void vTaskDelay( portTickType xTicksToDelay ) + { + portTickType xTimeToWake; + signed portBASE_TYPE xAlreadyYielded = pdFALSE; + + /* A delay time of zero just forces a reschedule. */ + if( xTicksToDelay > ( portTickType ) 0U ) + { + vTaskSuspendAll(); + { + traceTASK_DELAY(); + + /* A task that is removed from the event list while the + scheduler is suspended will not get placed in the ready + list or removed from the blocked list until the scheduler + is resumed. + + This task cannot be in an event list as it is the currently + executing task. */ + + /* Calculate the time to wake - this may overflow but this is + not a problem. */ + xTimeToWake = xTickCount + xTicksToDelay; + + /* We must remove ourselves from the ready list before adding + ourselves to the blocked list as the same list item is used for + both lists. */ + if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( unsigned portBASE_TYPE ) 0 ) + { + /* The current task must be in a ready list, so there is + no need to check, and the port reset macro can be called + directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); + } + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + xAlreadyYielded = xTaskResumeAll(); + } + + /* Force a reschedule if xTaskResumeAll has not already done so, we may + have put ourselves to sleep. */ + if( xAlreadyYielded == pdFALSE ) + { + portYIELD_WITHIN_API(); + } + } + +#endif /* INCLUDE_vTaskDelay */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_eTaskGetState == 1 ) + + eTaskState eTaskGetState( xTaskHandle xTask ) + { + eTaskState eReturn; + xList *pxStateList; + const tskTCB * const pxTCB = ( tskTCB * ) xTask; + + if( pxTCB == pxCurrentTCB ) + { + /* The task calling this function is querying its own state. */ + eReturn = eRunning; + } + else + { + taskENTER_CRITICAL(); + { + pxStateList = ( xList * ) listLIST_ITEM_CONTAINER( &( pxTCB->xGenericListItem ) ); + } + taskEXIT_CRITICAL(); + + if( ( pxStateList == pxDelayedTaskList ) || ( pxStateList == pxOverflowDelayedTaskList ) ) + { + /* The task being queried is referenced from one of the Blocked + lists. */ + eReturn = eBlocked; + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + else if( pxStateList == &xSuspendedTaskList ) + { + /* The task being queried is referenced from the suspended + list. Is it genuinely suspended or is it block + indefinitely? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL ) + { + eReturn = eSuspended; + } + else + { + eReturn = eBlocked; + } + } + #endif + + #if ( INCLUDE_vTaskDelete == 1 ) + else if( pxStateList == &xTasksWaitingTermination ) + { + /* The task being queried is referenced from the deleted + tasks list. */ + eReturn = eDeleted; + } + #endif + + else + { + /* If the task is not in any other state, it must be in the + Ready (including pending ready) state. */ + eReturn = eReady; + } + } + + return eReturn; + } + +#endif /* INCLUDE_eTaskGetState */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskPriorityGet == 1 ) + + unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle xTask ) + { + tskTCB *pxTCB; + unsigned portBASE_TYPE uxReturn; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then we are changing the + priority of the calling function. */ + pxTCB = prvGetTCBFromHandle( xTask ); + uxReturn = pxTCB->uxPriority; + } + taskEXIT_CRITICAL(); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskPriorityGet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskPrioritySet == 1 ) + + void vTaskPrioritySet( xTaskHandle xTask, unsigned portBASE_TYPE uxNewPriority ) + { + tskTCB *pxTCB; + unsigned portBASE_TYPE uxCurrentBasePriority, uxPriorityUsedOnEntry; + portBASE_TYPE xYieldRequired = pdFALSE; + + configASSERT( ( uxNewPriority < configMAX_PRIORITIES ) ); + + /* Ensure the new priority is valid. */ + if( uxNewPriority >= ( unsigned portBASE_TYPE ) configMAX_PRIORITIES ) + { + uxNewPriority = ( unsigned portBASE_TYPE ) configMAX_PRIORITIES - ( unsigned portBASE_TYPE ) 1U; + } + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the priority of the calling + task that is being changed. */ + pxTCB = prvGetTCBFromHandle( xTask ); + + traceTASK_PRIORITY_SET( pxTCB, uxNewPriority ); + + #if ( configUSE_MUTEXES == 1 ) + { + uxCurrentBasePriority = pxTCB->uxBasePriority; + } + #else + { + uxCurrentBasePriority = pxTCB->uxPriority; + } + #endif + + if( uxCurrentBasePriority != uxNewPriority ) + { + /* The priority change may have readied a task of higher + priority than the calling task. */ + if( uxNewPriority > uxCurrentBasePriority ) + { + if( pxTCB != pxCurrentTCB ) + { + /* The priority of a task other than the currently + running task is being raised. Is the priority being + raised above that of the running task? */ + if( uxNewPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + } + else + { + /* The priority of the running task is being raised, + but the running task must already be the highest + priority task able to run so no yield is required. */ + } + } + else if( pxTCB == pxCurrentTCB ) + { + /* Setting the priority of the running task down means + there may now be another task of higher priority that + is ready to execute. */ + xYieldRequired = pdTRUE; + } + else + { + /* Setting the priority of any other task down does not + require a yield as the running task must be above the + new priority of the task being modified. */ + } + + /* Remember the ready list the task might be referenced from + before its uxPriority member is changed so the + taskRESET_READY_PRIORITY() macro can function correctly. */ + uxPriorityUsedOnEntry = pxTCB->uxPriority; + + #if ( configUSE_MUTEXES == 1 ) + { + /* Only change the priority being used if the task is not + currently using an inherited priority. */ + if( pxTCB->uxBasePriority == pxTCB->uxPriority ) + { + pxTCB->uxPriority = uxNewPriority; + } + + /* The base priority gets set whatever. */ + pxTCB->uxBasePriority = uxNewPriority; + } + #else + { + pxTCB->uxPriority = uxNewPriority; + } + #endif + + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( ( portTickType ) configMAX_PRIORITIES - ( portTickType ) uxNewPriority ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* If the task is in the blocked or suspended list we need do + nothing more than change it's priority variable. However, if + the task is in a ready list it needs to be removed and placed + in the list appropriate to its new priority. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xGenericListItem ) ) != pdFALSE ) + { + /* The task is currently in its ready list - remove before adding + it to it's new ready list. As we are in a critical section we + can do this even if the scheduler is suspended. */ + if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( unsigned portBASE_TYPE ) 0 ) + { + /* It is known that the task is in its ready list so + there is no need to check again and the port level + reset macro can be called directly. */ + portRESET_READY_PRIORITY( uxPriorityUsedOnEntry, uxTopReadyPriority ); + } + prvAddTaskToReadyList( pxTCB ); + } + + if( xYieldRequired == pdTRUE ) + { + taskYIELD_IF_USING_PREEMPTION(); + } + + /* Remove compiler warning about unused variables when the port + optimised task selection is not being used. */ + ( void ) uxPriorityUsedOnEntry; + } + } + taskEXIT_CRITICAL(); + } + +#endif /* INCLUDE_vTaskPrioritySet */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskSuspend( xTaskHandle xTaskToSuspend ) + { + tskTCB *pxTCB; + + taskENTER_CRITICAL(); + { + /* If null is passed in here then it is the running task that is + being suspended. */ + pxTCB = prvGetTCBFromHandle( xTaskToSuspend ); + + traceTASK_SUSPEND( pxTCB ); + + /* Remove task from the ready/delayed list and place in the suspended list. */ + if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( unsigned portBASE_TYPE ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + + /* Is the task waiting on an event also? */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + + vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xGenericListItem ) ); + } + taskEXIT_CRITICAL(); + + if( pxTCB == pxCurrentTCB ) + { + if( xSchedulerRunning != pdFALSE ) + { + /* The current task has just been suspended. */ + portYIELD_WITHIN_API(); + } + else + { + /* The scheduler is not running, but the task that was pointed + to by pxCurrentTCB has just been suspended and pxCurrentTCB + must be adjusted to point to a different task. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) + { + /* No other tasks are ready, so set pxCurrentTCB back to + NULL so when the next task is created pxCurrentTCB will + be set to point to it no matter what its relative priority + is. */ + pxCurrentTCB = NULL; + } + else + { + vTaskSwitchContext(); + } + } + } + } + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + signed portBASE_TYPE xTaskIsTaskSuspended( xTaskHandle xTask ) + { + portBASE_TYPE xReturn = pdFALSE; + const tskTCB * const pxTCB = ( tskTCB * ) xTask; + + /* It does not make sense to check if the calling task is suspended. */ + configASSERT( xTask ); + + /* Is the task we are attempting to resume actually in the + suspended list? */ + if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xGenericListItem ) ) != pdFALSE ) + { + /* Has the task already been resumed from within an ISR? */ + if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) == pdFALSE ) + { + /* Is it in the suspended list because it is in the + Suspended state? It is possible to be in the suspended + list because it is blocked on a task with no timeout + specified. */ + if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) != pdFALSE ) + { + xReturn = pdTRUE; + } + } + } + + return xReturn; + } /*lint !e818 xTask cannot be a pointer to const because it is a typedef. */ + +#endif /* INCLUDE_vTaskSuspend */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskSuspend == 1 ) + + void vTaskResume( xTaskHandle xTaskToResume ) + { + tskTCB * const pxTCB = ( tskTCB * ) xTaskToResume; + + /* It does not make sense to resume the calling task. */ + configASSERT( xTaskToResume ); + + /* The parameter cannot be NULL as it is impossible to resume the + currently executing task. */ + if( ( pxTCB != NULL ) && ( pxTCB != pxCurrentTCB ) ) + { + taskENTER_CRITICAL(); + { + if( xTaskIsTaskSuspended( pxTCB ) == pdTRUE ) + { + traceTASK_RESUME( pxTCB ); + + /* As we are in a critical section we can access the ready + lists even if the scheduler is suspended. */ + ( void ) uxListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* We may have just resumed a higher priority task. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + /* This yield may not cause the task just resumed to run, + but will leave the lists in the correct state for the + next yield. */ + taskYIELD_IF_USING_PREEMPTION(); + } + } + } + taskEXIT_CRITICAL(); + } + } + +#endif /* INCLUDE_vTaskSuspend */ + +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) + + portBASE_TYPE xTaskResumeFromISR( xTaskHandle xTaskToResume ) + { + portBASE_TYPE xYieldRequired = pdFALSE; + tskTCB * const pxTCB = ( tskTCB * ) xTaskToResume; + unsigned portBASE_TYPE uxSavedInterruptStatus; + + configASSERT( xTaskToResume ); + + /* RTOS ports that support interrupt nesting have the concept of a + maximum system call (or maximum API call) interrupt priority. + Interrupts that are above the maximum system call priority are keep + permanently enabled, even when the RTOS kernel is in a critical section, + but cannot make any calls to FreeRTOS API functions. If configASSERT() + is defined in FreeRTOSConfig.h then + portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has + been assigned a priority above the configured maximum system call + priority. Only FreeRTOS functions that end in FromISR can be called + from interrupts that have been assigned a priority at or (logically) + below the maximum system call interrupt priority. FreeRTOS maintains a + separate interrupt safe API to ensure interrupt entry is as fast and as + simple as possible. More information (albeit Cortex-M specific) is + provided on the following link: + http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + { + if( xTaskIsTaskSuspended( pxTCB ) == pdTRUE ) + { + traceTASK_RESUME_FROM_ISR( pxTCB ); + + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldRequired = pdTRUE; + } + + ( void ) uxListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* We cannot access the delayed or ready lists, so will hold this + task pending until the scheduler is resumed, at which point a + yield will be performed if necessary. */ + vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) ); + } + } + } + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xYieldRequired; + } + +#endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */ +/*-----------------------------------------------------------*/ + +void vTaskStartScheduler( void ) +{ +portBASE_TYPE xReturn; + + /* Add the idle task at the lowest priority. */ + #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + { + /* Create the idle task, storing its handle in xIdleTaskHandle so it can + be returned by the xTaskGetIdleTaskHandle() function. */ + xReturn = xTaskCreate( prvIdleTask, ( signed char * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), &xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + } + #else + { + /* Create the idle task without storing its handle. */ + xReturn = xTaskCreate( prvIdleTask, ( signed char * ) "IDLE", tskIDLE_STACK_SIZE, ( void * ) NULL, ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), NULL ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */ + } + #endif /* INCLUDE_xTaskGetIdleTaskHandle */ + + #if ( configUSE_TIMERS == 1 ) + { + if( xReturn == pdPASS ) + { + xReturn = xTimerCreateTimerTask(); + } + } + #endif /* configUSE_TIMERS */ + + if( xReturn == pdPASS ) + { + /* Interrupts are turned off here, to ensure a tick does not occur + before or during the call to xPortStartScheduler(). The stacks of + the created tasks contain a status word with interrupts switched on + so interrupts will automatically get re-enabled when the first task + starts to run. */ + portDISABLE_INTERRUPTS(); + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Switch Newlib's _impure_ptr variable to point to the _reent + structure specific to the task that will run first. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + + xSchedulerRunning = pdTRUE; + xTickCount = ( portTickType ) 0U; + + /* If configGENERATE_RUN_TIME_STATS is defined then the following + macro must be defined to configure the timer/counter used to generate + the run time counter time base. */ + portCONFIGURE_TIMER_FOR_RUN_TIME_STATS(); + + /* Setting up the timer tick is hardware specific and thus in the + portable interface. */ + if( xPortStartScheduler() != pdFALSE ) + { + /* Should not reach here as if the scheduler is running the + function will not return. */ + } + else + { + /* Should only reach here if a task calls xTaskEndScheduler(). */ + } + } + else + { + /* This line will only be reached if the kernel could not be started, + because there was not enough FreeRTOS heap to create the idle task + or the timer task. */ + configASSERT( xReturn ); + } +} +/*-----------------------------------------------------------*/ + +void vTaskEndScheduler( void ) +{ + /* Stop the scheduler interrupts and call the portable scheduler end + routine so the original ISRs can be restored if necessary. The port + layer must ensure interrupts enable bit is left in the correct state. */ + portDISABLE_INTERRUPTS(); + xSchedulerRunning = pdFALSE; + vPortEndScheduler(); +} +/*----------------------------------------------------------*/ + +void vTaskSuspendAll( void ) +{ + /* A critical section is not required as the variable is of type + portBASE_TYPE. */ + ++uxSchedulerSuspended; +} +/*----------------------------------------------------------*/ + +#if ( configUSE_TICKLESS_IDLE != 0 ) + + static portTickType prvGetExpectedIdleTime( void ) + { + portTickType xReturn; + + if( pxCurrentTCB->uxPriority > tskIDLE_PRIORITY ) + { + xReturn = 0; + } + else if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > 1 ) + { + /* There are other idle priority tasks in the ready state. If + time slicing is used then the very next tick interrupt must be + processed. */ + xReturn = 0; + } + else + { + xReturn = xNextTaskUnblockTime - xTickCount; + } + + return xReturn; + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +signed portBASE_TYPE xTaskResumeAll( void ) +{ +tskTCB *pxTCB; +portBASE_TYPE xAlreadyYielded = pdFALSE; + + /* If uxSchedulerSuspended is zero then this function does not match a + previous call to vTaskSuspendAll(). */ + configASSERT( uxSchedulerSuspended ); + + /* It is possible that an ISR caused a task to be removed from an event + list while the scheduler was suspended. If this was the case then the + removed task will have been added to the xPendingReadyList. Once the + scheduler has been resumed it is safe to move all the pending ready + tasks from this list into their appropriate ready list. */ + taskENTER_CRITICAL(); + { + --uxSchedulerSuspended; + + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + if( uxCurrentNumberOfTasks > ( unsigned portBASE_TYPE ) 0U ) + { + /* Move any readied tasks from the pending list into the + appropriate ready list. */ + while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE ) + { + pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + ( void ) uxListRemove( &( pxTCB->xGenericListItem ) ); + prvAddTaskToReadyList( pxTCB ); + + /* If we have moved a task that has a priority higher than + the current task then we should yield. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xYieldPending = pdTRUE; + } + } + + /* If any ticks occurred while the scheduler was suspended then + they should be processed now. This ensures the tick count does not + slip, and that any delayed tasks are resumed at the correct time. */ + if( uxPendedTicks > ( unsigned portBASE_TYPE ) 0U ) + { + while( uxPendedTicks > ( unsigned portBASE_TYPE ) 0U ) + { + if( xTaskIncrementTick() != pdFALSE ) + { + xYieldPending = pdTRUE; + } + --uxPendedTicks; + } + } + + if( xYieldPending == pdTRUE ) + { + #if( configUSE_PREEMPTION != 0 ) + { + xAlreadyYielded = pdTRUE; + } + #endif + taskYIELD_IF_USING_PREEMPTION(); + } + } + } + } + taskEXIT_CRITICAL(); + + return xAlreadyYielded; +} +/*-----------------------------------------------------------*/ + +portTickType xTaskGetTickCount( void ) +{ +portTickType xTicks; + + /* Critical section required if running on a 16 bit processor. */ + taskENTER_CRITICAL(); + { + xTicks = xTickCount; + } + taskEXIT_CRITICAL(); + + return xTicks; +} +/*-----------------------------------------------------------*/ + +portTickType xTaskGetTickCountFromISR( void ) +{ +portTickType xReturn; +unsigned portBASE_TYPE uxSavedInterruptStatus; + + /* RTOS ports that support interrupt nesting have the concept of a maximum + system call (or maximum API call) interrupt priority. Interrupts that are + above the maximum system call priority are keep permanently enabled, even + when the RTOS kernel is in a critical section, but cannot make any calls to + FreeRTOS API functions. If configASSERT() is defined in FreeRTOSConfig.h + then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion + failure if a FreeRTOS API function is called from an interrupt that has been + assigned a priority above the configured maximum system call priority. + Only FreeRTOS functions that end in FromISR can be called from interrupts + that have been assigned a priority at or (logically) below the maximum + system call interrupt priority. FreeRTOS maintains a separate interrupt + safe API to ensure interrupt entry is as fast and as simple as possible. + More information (albeit Cortex-M specific) is provided on the following + link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */ + portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); + + uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); + xReturn = xTickCount; + portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +unsigned portBASE_TYPE uxTaskGetNumberOfTasks( void ) +{ + /* A critical section is not required because the variables are of type + portBASE_TYPE. */ + return uxCurrentNumberOfTasks; +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_pcTaskGetTaskName == 1 ) + + signed char *pcTaskGetTaskName( xTaskHandle xTaskToQuery ) + { + tskTCB *pxTCB; + + /* If null is passed in here then the name of the calling task is being queried. */ + pxTCB = prvGetTCBFromHandle( xTaskToQuery ); + configASSERT( pxTCB ); + return &( pxTCB->pcTaskName[ 0 ] ); + } + +#endif /* INCLUDE_pcTaskGetTaskName */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + unsigned portBASE_TYPE uxTaskGetSystemState( xTaskStatusType *pxTaskStatusArray, unsigned portBASE_TYPE uxArraySize, unsigned long *pulTotalRunTime ) + { + unsigned portBASE_TYPE uxTask = 0, uxQueue = configMAX_PRIORITIES; + + vTaskSuspendAll(); + { + /* Is there a space in the array for each task in the system? */ + if( uxArraySize >= uxCurrentNumberOfTasks ) + { + /* Fill in an xTaskStatusType structure with information on each + task in the Ready state. */ + do + { + uxQueue--; + uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ), eReady ); + + } while( uxQueue > ( unsigned portBASE_TYPE ) tskIDLE_PRIORITY ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* Fill in an xTaskStatusType structure with information on each + task in the Blocked state. */ + uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( xList * ) pxDelayedTaskList, eBlocked ); + uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( xList * ) pxOverflowDelayedTaskList, eBlocked ); + + #if( INCLUDE_vTaskDelete == 1 ) + { + /* Fill in an xTaskStatusType structure with information on + each task that has been deleted but not yet cleaned up. */ + uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination, eDeleted ); + } + #endif + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + /* Fill in an xTaskStatusType structure with information on + each task in the Suspended state. */ + uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList, eSuspended ); + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1) + { + if( pulTotalRunTime != NULL ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) ); + #else + *pulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + } + } + #else + { + if( pulTotalRunTime != NULL ) + { + *pulTotalRunTime = 0; + } + } + #endif + } + } + ( void ) xTaskResumeAll(); + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*----------------------------------------------------------*/ + +#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) + + xTaskHandle xTaskGetIdleTaskHandle( void ) + { + /* If xTaskGetIdleTaskHandle() is called before the scheduler has been + started, then xIdleTaskHandle will be NULL. */ + configASSERT( ( xIdleTaskHandle != NULL ) ); + return xIdleTaskHandle; + } + +#endif /* INCLUDE_xTaskGetIdleTaskHandle */ +/*----------------------------------------------------------*/ + +/* This conditional compilation should use inequality to 0, not equality to 1. +This is to ensure vTaskStepTick() is available when user defined low power mode +implementations require configUSE_TICKLESS_IDLE to be set to a value other than +1. */ +#if ( configUSE_TICKLESS_IDLE != 0 ) + + void vTaskStepTick( portTickType xTicksToJump ) + { + /* Correct the tick count value after a period during which the tick + was suppressed. Note this does *not* call the tick hook function for + each stepped tick. */ + configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime ); + xTickCount += xTicksToJump; + traceINCREASE_TICK_COUNT( xTicksToJump ); + } + +#endif /* configUSE_TICKLESS_IDLE */ +/*----------------------------------------------------------*/ + +portBASE_TYPE xTaskIncrementTick( void ) +{ +tskTCB * pxTCB; +portTickType xItemValue; +portBASE_TYPE xSwitchRequired = pdFALSE; + + /* Called by the portable layer each time a tick interrupt occurs. + Increments the tick then checks to see if the new tick value will cause any + tasks to be unblocked. */ + traceTASK_INCREMENT_TICK( xTickCount ); + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + /* Increment the RTOS tick, switching the delayed and overflowed + delayed lists if it wraps to 0. */ + ++xTickCount; + + { + /* Minor optimisation. The tick count cannot change in this + block. */ + const portTickType xConstTickCount = xTickCount; + + if( xConstTickCount == ( portTickType ) 0U ) + { + taskSWITCH_DELAYED_LISTS(); + } + + /* See if this tick has made a timeout expire. Tasks are stored in the + queue in the order of their wake time - meaning once one tasks has been + found whose block time has not expired there is no need not look any + further down the list. */ + if( xConstTickCount >= xNextTaskUnblockTime ) + { + for( ;; ) + { + if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) + { + /* The delayed list is empty. Set xNextTaskUnblockTime to + the maximum possible value so it is extremely unlikely that + the if( xTickCount >= xNextTaskUnblockTime ) test will pass + next time through. */ + xNextTaskUnblockTime = portMAX_DELAY; + break; + } + else + { + /* The delayed list is not empty, get the value of the item + at the head of the delayed list. This is the time at which + the task at the head of the delayed list must be removed + from the Blocked state. */ + pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); + xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xGenericListItem ) ); + + if( xConstTickCount < xItemValue ) + { + /* It is not time to unblock this item yet, but the item + value is the time at which the task at the head of the + blocked list must be removed from the Blocked state - + so record the item value in xNextTaskUnblockTime. */ + xNextTaskUnblockTime = xItemValue; + break; + } + + /* It is time to remove the item from the Blocked state. */ + ( void ) uxListRemove( &( pxTCB->xGenericListItem ) ); + + /* Is the task waiting on an event also? If so remove it + from the event list. */ + if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL ) + { + ( void ) uxListRemove( &( pxTCB->xEventListItem ) ); + } + + /* Place the unblocked task into the appropriate ready + list. */ + prvAddTaskToReadyList( pxTCB ); + + /* A task being unblocked cannot cause an immediate context + switch if preemption is turned off. */ + #if ( configUSE_PREEMPTION == 1 ) + { + /* Preemption is on, but a context switch should only + be performed if the unblocked task has a priority that + is equal to or higher than the currently executing + task. */ + if( pxTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + xSwitchRequired = pdTRUE; + } + } + #endif /* configUSE_PREEMPTION */ + } + } + } + } + + /* Tasks of equal priority to the currently running task will share + processing time (time slice) if preemption is on, and the application + writer has not explicitly turned time slicing off. */ + #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) + { + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > ( unsigned portBASE_TYPE ) 1 ) + { + xSwitchRequired = pdTRUE; + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */ + + #if ( configUSE_TICK_HOOK == 1 ) + { + /* Guard against the tick hook being called when the pended tick + count is being unwound (when the scheduler is being unlocked). */ + if( uxPendedTicks == ( unsigned portBASE_TYPE ) 0U ) + { + vApplicationTickHook(); + } + } + #endif /* configUSE_TICK_HOOK */ + } + else + { + ++uxPendedTicks; + + /* The tick hook gets called at regular intervals, even if the + scheduler is locked. */ + #if ( configUSE_TICK_HOOK == 1 ) + { + vApplicationTickHook(); + } + #endif + } + + #if ( configUSE_PREEMPTION == 1 ) + { + if( xYieldPending != pdFALSE ) + { + xSwitchRequired = pdTRUE; + } + } + #endif /* configUSE_PREEMPTION */ + + return xSwitchRequired; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + void vTaskSetApplicationTaskTag( xTaskHandle xTask, pdTASK_HOOK_CODE pxHookFunction ) + { + tskTCB *xTCB; + + /* If xTask is NULL then we are setting our own task hook. */ + if( xTask == NULL ) + { + xTCB = ( tskTCB * ) pxCurrentTCB; + } + else + { + xTCB = ( tskTCB * ) xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + xTCB->pxTaskTag = pxHookFunction; + taskEXIT_CRITICAL(); + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + pdTASK_HOOK_CODE xTaskGetApplicationTaskTag( xTaskHandle xTask ) + { + tskTCB *xTCB; + pdTASK_HOOK_CODE xReturn; + + /* If xTask is NULL then we are setting our own task hook. */ + if( xTask == NULL ) + { + xTCB = ( tskTCB * ) pxCurrentTCB; + } + else + { + xTCB = ( tskTCB * ) xTask; + } + + /* Save the hook function in the TCB. A critical section is required as + the value can be accessed from an interrupt. */ + taskENTER_CRITICAL(); + xReturn = xTCB->pxTaskTag; + taskEXIT_CRITICAL(); + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_APPLICATION_TASK_TAG == 1 ) + + portBASE_TYPE xTaskCallApplicationTaskHook( xTaskHandle xTask, void *pvParameter ) + { + tskTCB *xTCB; + portBASE_TYPE xReturn; + + /* If xTask is NULL then we are calling our own task hook. */ + if( xTask == NULL ) + { + xTCB = ( tskTCB * ) pxCurrentTCB; + } + else + { + xTCB = ( tskTCB * ) xTask; + } + + if( xTCB->pxTaskTag != NULL ) + { + xReturn = xTCB->pxTaskTag( pvParameter ); + } + else + { + xReturn = pdFAIL; + } + + return xReturn; + } + +#endif /* configUSE_APPLICATION_TASK_TAG */ +/*-----------------------------------------------------------*/ + +void vTaskSwitchContext( void ) +{ + if( uxSchedulerSuspended != ( unsigned portBASE_TYPE ) pdFALSE ) + { + /* The scheduler is currently suspended - do not allow a context + switch. */ + xYieldPending = pdTRUE; + } + else + { + xYieldPending = pdFALSE; + traceTASK_SWITCHED_OUT(); + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE + portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime ); + #else + ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE(); + #endif + + /* Add the amount of time the task has been running to the + accumulated time so far. The time the task started running was + stored in ulTaskSwitchedInTime. Note that there is no overflow + protection here so count values are only valid until the timer + overflows. The guard against negative values is to protect + against suspect run time stat counter implementations - which + are provided by the application, not the kernel. */ + if( ulTotalRunTime > ulTaskSwitchedInTime ) + { + pxCurrentTCB->ulRunTimeCounter += ( ulTotalRunTime - ulTaskSwitchedInTime ); + } + ulTaskSwitchedInTime = ulTotalRunTime; + } + #endif /* configGENERATE_RUN_TIME_STATS */ + + taskFIRST_CHECK_FOR_STACK_OVERFLOW(); + taskSECOND_CHECK_FOR_STACK_OVERFLOW(); + + taskSELECT_HIGHEST_PRIORITY_TASK(); + + traceTASK_SWITCHED_IN(); + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Switch Newlib's _impure_ptr variable to point to the _reent + structure specific to this task. */ + _impure_ptr = &( pxCurrentTCB->xNewLib_reent ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ + } +} +/*-----------------------------------------------------------*/ + +void vTaskPlaceOnEventList( xList * const pxEventList, portTickType xTicksToWait ) +{ +portTickType xTimeToWake; + + configASSERT( pxEventList ); + + /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE + SCHEDULER SUSPENDED. */ + + /* Place the event list item of the TCB in the appropriate event list. + This is placed in the list in priority order so the highest priority task + is the first to be woken by the event. */ + vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + /* We must remove ourselves from the ready list before adding ourselves + to the blocked list as the same list item is used for both lists. We have + exclusive access to the ready lists as the scheduler is locked. */ + if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( unsigned portBASE_TYPE ) 0 ) + { + /* The current task must be in a ready list, so there is no need to + check, and the port reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); + } + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + if( xTicksToWait == portMAX_DELAY ) + { + /* Add ourselves to the suspended task list instead of a delayed task + list to ensure we are not woken by a timing event. We will block + indefinitely. */ + vListInsertEnd( &xSuspendedTaskList, &( pxCurrentTCB->xGenericListItem ) ); + } + else + { + /* Calculate the time at which the task should be woken if the event does + not occur. This may overflow but this doesn't matter. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + } + #else /* INCLUDE_vTaskSuspend */ + { + /* Calculate the time at which the task should be woken if the event does + not occur. This may overflow but this doesn't matter. */ + xTimeToWake = xTickCount + xTicksToWait; + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + #endif /* INCLUDE_vTaskSuspend */ +} +/*-----------------------------------------------------------*/ + +#if configUSE_TIMERS == 1 + + void vTaskPlaceOnEventListRestricted( xList * const pxEventList, portTickType xTicksToWait ) + { + portTickType xTimeToWake; + + configASSERT( pxEventList ); + + /* This function should not be called by application code hence the + 'Restricted' in its name. It is not part of the public API. It is + designed for use by kernel code, and has special calling requirements - + it should be called from a critical section. */ + + + /* Place the event list item of the TCB in the appropriate event list. + In this case it is assume that this is the only task that is going to + be waiting on this event list, so the faster vListInsertEnd() function + can be used in place of vListInsert. */ + vListInsertEnd( pxEventList, &( pxCurrentTCB->xEventListItem ) ); + + /* We must remove this task from the ready list before adding it to the + blocked list as the same list item is used for both lists. This + function is called form a critical section. */ + if( uxListRemove( &( pxCurrentTCB->xGenericListItem ) ) == ( unsigned portBASE_TYPE ) 0 ) + { + /* The current task must be in a ready list, so there is no need to + check, and the port reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); + } + + /* Calculate the time at which the task should be woken if the event does + not occur. This may overflow but this doesn't matter. */ + xTimeToWake = xTickCount + xTicksToWait; + + traceTASK_DELAY_UNTIL(); + prvAddCurrentTaskToDelayedList( xTimeToWake ); + } + +#endif /* configUSE_TIMERS */ +/*-----------------------------------------------------------*/ + +signed portBASE_TYPE xTaskRemoveFromEventList( const xList * const pxEventList ) +{ +tskTCB *pxUnblockedTCB; +portBASE_TYPE xReturn; + + /* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED OR THE + SCHEDULER SUSPENDED. It can also be called from within an ISR. */ + + /* The event list is sorted in priority order, so we can remove the + first in the list, remove the TCB from the delayed list, and add + it to the ready list. + + If an event is for a queue that is locked then this function will never + get called - the lock count on the queue will get modified instead. This + means we can always expect exclusive access to the event list here. + + This function assumes that a check has already been made to ensure that + pxEventList is not empty. */ + pxUnblockedTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); + configASSERT( pxUnblockedTCB ); + ( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) ); + + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + ( void ) uxListRemove( &( pxUnblockedTCB->xGenericListItem ) ); + prvAddTaskToReadyList( pxUnblockedTCB ); + } + else + { + /* We cannot access the delayed or ready lists, so will hold this + task pending until the scheduler is resumed. */ + vListInsertEnd( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) ); + } + + if( pxUnblockedTCB->uxPriority >= pxCurrentTCB->uxPriority ) + { + /* Return true if the task removed from the event list has + a higher priority than the calling task. This allows + the calling task to know if it should force a context + switch now. */ + xReturn = pdTRUE; + + /* Mark that a yield is pending in case the user is not using the + "xHigherPriorityTaskWoken" parameter to an ISR safe FreeRTOS function. */ + xYieldPending = pdTRUE; + } + else + { + xReturn = pdFALSE; + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskSetTimeOutState( xTimeOutType * const pxTimeOut ) +{ + configASSERT( pxTimeOut ); + pxTimeOut->xOverflowCount = xNumOfOverflows; + pxTimeOut->xTimeOnEntering = xTickCount; +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xTaskCheckForTimeOut( xTimeOutType * const pxTimeOut, portTickType * const pxTicksToWait ) +{ +portBASE_TYPE xReturn; + + configASSERT( pxTimeOut ); + configASSERT( pxTicksToWait ); + + taskENTER_CRITICAL(); + { + /* Minor optimisation. The tick count cannot change in this block. */ + const portTickType xConstTickCount = xTickCount; + + #if ( INCLUDE_vTaskSuspend == 1 ) + /* If INCLUDE_vTaskSuspend is set to 1 and the block time specified is + the maximum block time then the task should block indefinitely, and + therefore never time out. */ + if( *pxTicksToWait == portMAX_DELAY ) + { + xReturn = pdFALSE; + } + else /* We are not blocking indefinitely, perform the checks below. */ + #endif + + if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) ) /*lint !e525 Indentation preferred as is to make code within pre-processor directives clearer. */ + { + /* The tick count is greater than the time at which vTaskSetTimeout() + was called, but has also overflowed since vTaskSetTimeOut() was called. + It must have wrapped all the way around and gone past us again. This + passed since vTaskSetTimeout() was called. */ + xReturn = pdTRUE; + } + else if( ( xConstTickCount - pxTimeOut->xTimeOnEntering ) < *pxTicksToWait ) + { + /* Not a genuine timeout. Adjust parameters for time remaining. */ + *pxTicksToWait -= ( xConstTickCount - pxTimeOut->xTimeOnEntering ); + vTaskSetTimeOutState( pxTimeOut ); + xReturn = pdFALSE; + } + else + { + xReturn = pdTRUE; + } + } + taskEXIT_CRITICAL(); + + return xReturn; +} +/*-----------------------------------------------------------*/ + +void vTaskMissedYield( void ) +{ + xYieldPending = pdTRUE; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + unsigned portBASE_TYPE uxTaskGetTaskNumber( xTaskHandle xTask ) + { + unsigned portBASE_TYPE uxReturn; + tskTCB *pxTCB; + + if( xTask != NULL ) + { + pxTCB = ( tskTCB * ) xTask; + uxReturn = pxTCB->uxTaskNumber; + } + else + { + uxReturn = 0U; + } + + return uxReturn; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + void vTaskSetTaskNumber( xTaskHandle xTask, unsigned portBASE_TYPE uxHandle ) + { + tskTCB *pxTCB; + + if( xTask != NULL ) + { + pxTCB = ( tskTCB * ) xTask; + pxTCB->uxTaskNumber = uxHandle; + } + } + +#endif /* configUSE_TRACE_FACILITY */ + +/* + * ----------------------------------------------------------- + * The Idle task. + * ---------------------------------------------------------- + * + * The portTASK_FUNCTION() macro is used to allow port/compiler specific + * language extensions. The equivalent prototype for this function is: + * + * void prvIdleTask( void *pvParameters ); + * + */ +static portTASK_FUNCTION( prvIdleTask, pvParameters ) +{ + /* Stop warnings. */ + ( void ) pvParameters; + + for( ;; ) + { + /* See if any tasks have been deleted. */ + prvCheckTasksWaitingTermination(); + + #if ( configUSE_PREEMPTION == 0 ) + { + /* If we are not using preemption we keep forcing a task switch to + see if any other task has become available. If we are using + preemption we don't need to do this as any task becoming available + will automatically get the processor anyway. */ + taskYIELD(); + } + #endif /* configUSE_PREEMPTION */ + + #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) + { + /* When using preemption tasks of equal priority will be + timesliced. If a task that is sharing the idle priority is ready + to run then the idle task should yield before the end of the + timeslice. + + A critical region is not required here as we are just reading from + the list, and an occasional incorrect value will not matter. If + the ready list at the idle priority contains more than one task + then a task other than the idle task is ready to execute. */ + if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( unsigned portBASE_TYPE ) 1 ) + { + taskYIELD(); + } + } + #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */ + + #if ( configUSE_IDLE_HOOK == 1 ) + { + extern void vApplicationIdleHook( void ); + + /* Call the user defined function from within the idle task. This + allows the application designer to add background functionality + without the overhead of a separate task. + NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, + CALL A FUNCTION THAT MIGHT BLOCK. */ + vApplicationIdleHook(); + } + #endif /* configUSE_IDLE_HOOK */ + + /* This conditional compilation should use inequality to 0, not equality + to 1. This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when + user defined low power mode implementations require + configUSE_TICKLESS_IDLE to be set to a value other than 1. */ + #if ( configUSE_TICKLESS_IDLE != 0 ) + { + portTickType xExpectedIdleTime; + + /* It is not desirable to suspend then resume the scheduler on + each iteration of the idle task. Therefore, a preliminary + test of the expected idle time is performed without the + scheduler suspended. The result here is not necessarily + valid. */ + xExpectedIdleTime = prvGetExpectedIdleTime(); + + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + vTaskSuspendAll(); + { + /* Now the scheduler is suspended, the expected idle + time can be sampled again, and this time its value can + be used. */ + configASSERT( xNextTaskUnblockTime >= xTickCount ); + xExpectedIdleTime = prvGetExpectedIdleTime(); + + if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) + { + traceLOW_POWER_IDLE_BEGIN(); + portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ); + traceLOW_POWER_IDLE_END(); + } + } + ( void ) xTaskResumeAll(); + } + } + #endif /* configUSE_TICKLESS_IDLE */ + } +} +/*-----------------------------------------------------------*/ + +#if configUSE_TICKLESS_IDLE != 0 + + eSleepModeStatus eTaskConfirmSleepModeStatus( void ) + { + eSleepModeStatus eReturn = eStandardSleep; + + if( listCURRENT_LIST_LENGTH( &xPendingReadyList ) != 0 ) + { + /* A task was made ready while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else if( xYieldPending != pdFALSE ) + { + /* A yield was pended while the scheduler was suspended. */ + eReturn = eAbortSleep; + } + else + { + #if configUSE_TIMERS == 0 + { + /* The idle task exists in addition to the application tasks. */ + const unsigned portBASE_TYPE uxNonApplicationTasks = 1; + + /* If timers are not being used and all the tasks are in the + suspended list (which might mean they have an infinite block + time rather than actually being suspended) then it is safe to + turn all clocks off and just wait for external interrupts. */ + if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) ) + { + eReturn = eNoTasksWaitingTimeout; + } + } + #endif /* configUSE_TIMERS */ + } + + return eReturn; + } +#endif /* configUSE_TICKLESS_IDLE */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseTCBVariables( tskTCB *pxTCB, const signed char * const pcName, unsigned portBASE_TYPE uxPriority, const xMemoryRegion * const xRegions, unsigned short usStackDepth ) +{ +unsigned portBASE_TYPE x; + + /* Store the task name in the TCB. */ + for( x = ( unsigned portBASE_TYPE ) 0; x < ( unsigned portBASE_TYPE ) configMAX_TASK_NAME_LEN; x++ ) + { + pxTCB->pcTaskName[ x ] = pcName[ x ]; + + /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than + configMAX_TASK_NAME_LEN characters just in case the memory after the + string is not accessible (extremely unlikely). */ + if( pcName[ x ] == 0x00 ) + { + break; + } + } + + /* Ensure the name string is terminated in the case that the string length + was greater or equal to configMAX_TASK_NAME_LEN. */ + pxTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1 ] = ( signed char ) '\0'; + + /* This is used as an array index so must ensure it's not too large. First + remove the privilege bit if one is present. */ + if( uxPriority >= ( unsigned portBASE_TYPE ) configMAX_PRIORITIES ) + { + uxPriority = ( unsigned portBASE_TYPE ) configMAX_PRIORITIES - ( unsigned portBASE_TYPE ) 1U; + } + + pxTCB->uxPriority = uxPriority; + #if ( configUSE_MUTEXES == 1 ) + { + pxTCB->uxBasePriority = uxPriority; + } + #endif /* configUSE_MUTEXES */ + + vListInitialiseItem( &( pxTCB->xGenericListItem ) ); + vListInitialiseItem( &( pxTCB->xEventListItem ) ); + + /* Set the pxTCB as a link back from the xListItem. This is so we can get + back to the containing TCB from a generic item in a list. */ + listSET_LIST_ITEM_OWNER( &( pxTCB->xGenericListItem ), pxTCB ); + + /* Event lists are always in priority order. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( portTickType ) configMAX_PRIORITIES - ( portTickType ) uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + listSET_LIST_ITEM_OWNER( &( pxTCB->xEventListItem ), pxTCB ); + + #if ( portCRITICAL_NESTING_IN_TCB == 1 ) + { + pxTCB->uxCriticalNesting = ( unsigned portBASE_TYPE ) 0U; + } + #endif /* portCRITICAL_NESTING_IN_TCB */ + + #if ( configUSE_APPLICATION_TASK_TAG == 1 ) + { + pxTCB->pxTaskTag = NULL; + } + #endif /* configUSE_APPLICATION_TASK_TAG */ + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxTCB->ulRunTimeCounter = 0UL; + } + #endif /* configGENERATE_RUN_TIME_STATS */ + + #if ( portUSING_MPU_WRAPPERS == 1 ) + { + vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, pxTCB->pxStack, usStackDepth ); + } + #else /* portUSING_MPU_WRAPPERS */ + { + ( void ) xRegions; + ( void ) usStackDepth; + } + #endif /* portUSING_MPU_WRAPPERS */ + + #if ( configUSE_NEWLIB_REENTRANT == 1 ) + { + /* Initialise this task's Newlib reent structure. */ + _REENT_INIT_PTR( ( &( pxTCB->xNewLib_reent ) ) ); + } + #endif /* configUSE_NEWLIB_REENTRANT */ +} +/*-----------------------------------------------------------*/ + +#if ( portUSING_MPU_WRAPPERS == 1 ) + + void vTaskAllocateMPURegions( xTaskHandle xTaskToModify, const xMemoryRegion * const xRegions ) + { + tskTCB *pxTCB; + + /* If null is passed in here then we are deleting ourselves. */ + pxTCB = prvGetTCBFromHandle( xTaskToModify ); + + vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 ); + } + +#endif /* portUSING_MPU_WRAPPERS */ +/*-----------------------------------------------------------*/ + +static void prvInitialiseTaskLists( void ) +{ +unsigned portBASE_TYPE uxPriority; + + for( uxPriority = ( unsigned portBASE_TYPE ) 0U; uxPriority < ( unsigned portBASE_TYPE ) configMAX_PRIORITIES; uxPriority++ ) + { + vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) ); + } + + vListInitialise( &xDelayedTaskList1 ); + vListInitialise( &xDelayedTaskList2 ); + vListInitialise( &xPendingReadyList ); + + #if ( INCLUDE_vTaskDelete == 1 ) + { + vListInitialise( &xTasksWaitingTermination ); + } + #endif /* INCLUDE_vTaskDelete */ + + #if ( INCLUDE_vTaskSuspend == 1 ) + { + vListInitialise( &xSuspendedTaskList ); + } + #endif /* INCLUDE_vTaskSuspend */ + + /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList + using list2. */ + pxDelayedTaskList = &xDelayedTaskList1; + pxOverflowDelayedTaskList = &xDelayedTaskList2; +} +/*-----------------------------------------------------------*/ + +static void prvCheckTasksWaitingTermination( void ) +{ + #if ( INCLUDE_vTaskDelete == 1 ) + { + portBASE_TYPE xListIsEmpty; + + /* ucTasksDeleted is used to prevent vTaskSuspendAll() being called + too often in the idle task. */ + while( uxTasksDeleted > ( unsigned portBASE_TYPE ) 0U ) + { + vTaskSuspendAll(); + xListIsEmpty = listLIST_IS_EMPTY( &xTasksWaitingTermination ); + ( void ) xTaskResumeAll(); + + if( xListIsEmpty == pdFALSE ) + { + tskTCB *pxTCB; + + taskENTER_CRITICAL(); + { + pxTCB = ( tskTCB * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); + ( void ) uxListRemove( &( pxTCB->xGenericListItem ) ); + --uxCurrentNumberOfTasks; + --uxTasksDeleted; + } + taskEXIT_CRITICAL(); + + prvDeleteTCB( pxTCB ); + } + } + } + #endif /* vTaskDelete */ +} +/*-----------------------------------------------------------*/ + +static void prvAddCurrentTaskToDelayedList( portTickType xTimeToWake ) +{ + /* The list item will be inserted in wake time order. */ + listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xGenericListItem ), xTimeToWake ); + + if( xTimeToWake < xTickCount ) + { + /* Wake time has overflowed. Place this item in the overflow list. */ + vListInsert( pxOverflowDelayedTaskList, &( pxCurrentTCB->xGenericListItem ) ); + } + else + { + /* The wake time has not overflowed, so we can use the current block list. */ + vListInsert( pxDelayedTaskList, &( pxCurrentTCB->xGenericListItem ) ); + + /* If the task entering the blocked state was placed at the head of the + list of blocked tasks then xNextTaskUnblockTime needs to be updated + too. */ + if( xTimeToWake < xNextTaskUnblockTime ) + { + xNextTaskUnblockTime = xTimeToWake; + } + } +} +/*-----------------------------------------------------------*/ + +static tskTCB *prvAllocateTCBAndStack( unsigned short usStackDepth, portSTACK_TYPE *puxStackBuffer ) +{ +tskTCB *pxNewTCB; + + /* Allocate space for the TCB. Where the memory comes from depends on + the implementation of the port malloc function. */ + pxNewTCB = ( tskTCB * ) pvPortMalloc( sizeof( tskTCB ) ); + + if( pxNewTCB != NULL ) + { + /* Allocate space for the stack used by the task being created. + The base of the stack memory stored in the TCB so the task can + be deleted later if required. */ + pxNewTCB->pxStack = ( portSTACK_TYPE * ) pvPortMallocAligned( ( ( ( size_t ) usStackDepth ) * sizeof( portSTACK_TYPE ) ), puxStackBuffer ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + if( pxNewTCB->pxStack == NULL ) + { + /* Could not allocate the stack. Delete the allocated TCB. */ + vPortFree( pxNewTCB ); + pxNewTCB = NULL; + } + else + { + /* Just to help debugging. */ + ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) usStackDepth * sizeof( portSTACK_TYPE ) ); + } + } + + return pxNewTCB; +} +/*-----------------------------------------------------------*/ + +#if ( configUSE_TRACE_FACILITY == 1 ) + + static unsigned portBASE_TYPE prvListTaskWithinSingleList( xTaskStatusType *pxTaskStatusArray, xList *pxList, eTaskState eState ) + { + volatile tskTCB *pxNextTCB, *pxFirstTCB; + unsigned portBASE_TYPE uxTask = 0; + + if( listCURRENT_LIST_LENGTH( pxList ) > ( unsigned portBASE_TYPE ) 0 ) + { + listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); + + /* Populate an xTaskStatusType structure within the + pxTaskStatusArray array for each task that is referenced from + pxList. See the definition of xTaskStatusType in task.h for the + meaning of each xTaskStatusType structure member. */ + do + { + listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); + + pxTaskStatusArray[ uxTask ].xHandle = ( xTaskHandle ) pxNextTCB; + pxTaskStatusArray[ uxTask ].pcTaskName = ( const signed char * ) &( pxNextTCB->pcTaskName [ 0 ] ); + pxTaskStatusArray[ uxTask ].xTaskNumber = pxNextTCB->uxTCBNumber; + pxTaskStatusArray[ uxTask ].eCurrentState = eState; + pxTaskStatusArray[ uxTask ].uxCurrentPriority = pxNextTCB->uxPriority; + + #if ( configUSE_MUTEXES == 1 ) + { + pxTaskStatusArray[ uxTask ].uxBasePriority = pxNextTCB->uxBasePriority; + } + #else + { + pxTaskStatusArray[ uxTask ].uxBasePriority = 0; + } + #endif + + #if ( configGENERATE_RUN_TIME_STATS == 1 ) + { + pxTaskStatusArray[ uxTask ].ulRunTimeCounter = pxNextTCB->ulRunTimeCounter; + } + #else + { + pxTaskStatusArray[ uxTask ].ulRunTimeCounter = 0; + } + #endif + + #if ( portSTACK_GROWTH > 0 ) + { + pxTaskStatusArray[ uxTask ].usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( unsigned char * ) pxNextTCB->pxEndOfStack ); + } + #else + { + pxTaskStatusArray[ uxTask ].usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( unsigned char * ) pxNextTCB->pxStack ); + } + #endif + + uxTask++; + + } while( pxNextTCB != pxFirstTCB ); + } + + return uxTask; + } + +#endif /* configUSE_TRACE_FACILITY */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) + + static unsigned short prvTaskCheckFreeStackSpace( const unsigned char * pucStackByte ) + { + unsigned short usCount = 0U; + + while( *pucStackByte == tskSTACK_FILL_BYTE ) + { + pucStackByte -= portSTACK_GROWTH; + usCount++; + } + + usCount /= sizeof( portSTACK_TYPE ); + + return usCount; + } + +#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) + + unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask ) + { + tskTCB *pxTCB; + unsigned char *pcEndOfStack; + unsigned portBASE_TYPE uxReturn; + + pxTCB = prvGetTCBFromHandle( xTask ); + + #if portSTACK_GROWTH < 0 + { + pcEndOfStack = ( unsigned char * ) pxTCB->pxStack; + } + #else + { + pcEndOfStack = ( unsigned char * ) pxTCB->pxEndOfStack; + } + #endif + + uxReturn = ( unsigned portBASE_TYPE ) prvTaskCheckFreeStackSpace( pcEndOfStack ); + + return uxReturn; + } + +#endif /* INCLUDE_uxTaskGetStackHighWaterMark */ +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_vTaskDelete == 1 ) + + static void prvDeleteTCB( tskTCB *pxTCB ) + { + /* This call is required specifically for the TriCore port. It must be + above the vPortFree() calls. The call is also used by ports/demos that + want to allocate and clean RAM statically. */ + portCLEAN_UP_TCB( pxTCB ); + + /* Free up the memory allocated by the scheduler for the task. It is up to + the task to free any memory allocated at the application level. */ + vPortFreeAligned( pxTCB->pxStack ); + vPortFree( pxTCB ); + } + +#endif /* INCLUDE_vTaskDelete */ +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) + + xTaskHandle xTaskGetCurrentTaskHandle( void ) + { + xTaskHandle xReturn; + + /* A critical section is not required as this is not called from + an interrupt and the current TCB will always be the same for any + individual execution thread. */ + xReturn = pxCurrentTCB; + + return xReturn; + } + +#endif /* ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) + + portBASE_TYPE xTaskGetSchedulerState( void ) + { + portBASE_TYPE xReturn; + + if( xSchedulerRunning == pdFALSE ) + { + xReturn = taskSCHEDULER_NOT_STARTED; + } + else + { + if( uxSchedulerSuspended == ( unsigned portBASE_TYPE ) pdFALSE ) + { + xReturn = taskSCHEDULER_RUNNING; + } + else + { + xReturn = taskSCHEDULER_SUSPENDED; + } + } + + return xReturn; + } + +#endif /* ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void vTaskPriorityInherit( xTaskHandle const pxMutexHolder ) + { + tskTCB * const pxTCB = ( tskTCB * ) pxMutexHolder; + + /* If the mutex was given back by an interrupt while the queue was + locked then the mutex holder might now be NULL. */ + if( pxMutexHolder != NULL ) + { + if( pxTCB->uxPriority < pxCurrentTCB->uxPriority ) + { + /* Adjust the mutex holder state to account for its new priority. */ + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( portTickType ) configMAX_PRIORITIES - ( portTickType ) pxCurrentTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + + /* If the task being modified is in the ready state it will need to + be moved into a new list. */ + if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ) != pdFALSE ) + { + if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( unsigned portBASE_TYPE ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + + /* Inherit the priority before being moved into the new list. */ + pxTCB->uxPriority = pxCurrentTCB->uxPriority; + prvAddTaskToReadyList( pxTCB ); + } + else + { + /* Just inherit the priority. */ + pxTCB->uxPriority = pxCurrentTCB->uxPriority; + } + + traceTASK_PRIORITY_INHERIT( pxTCB, pxCurrentTCB->uxPriority ); + } + } + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( configUSE_MUTEXES == 1 ) + + void vTaskPriorityDisinherit( xTaskHandle const pxMutexHolder ) + { + tskTCB * const pxTCB = ( tskTCB * ) pxMutexHolder; + + if( pxMutexHolder != NULL ) + { + if( pxTCB->uxPriority != pxTCB->uxBasePriority ) + { + /* We must be the running task to be able to give the mutex back. + Remove ourselves from the ready list we currently appear in. */ + if( uxListRemove( &( pxTCB->xGenericListItem ) ) == ( unsigned portBASE_TYPE ) 0 ) + { + taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + } + + /* Disinherit the priority before adding the task into the new + ready list. */ + traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority ); + pxTCB->uxPriority = pxTCB->uxBasePriority; + listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( portTickType ) configMAX_PRIORITIES - ( portTickType ) pxTCB->uxPriority ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ + prvAddTaskToReadyList( pxTCB ); + } + } + } + +#endif /* configUSE_MUTEXES */ +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskEnterCritical( void ) + { + portDISABLE_INTERRUPTS(); + + if( xSchedulerRunning != pdFALSE ) + { + ( pxCurrentTCB->uxCriticalNesting )++; + } + } + +#endif /* portCRITICAL_NESTING_IN_TCB */ +/*-----------------------------------------------------------*/ + +#if ( portCRITICAL_NESTING_IN_TCB == 1 ) + + void vTaskExitCritical( void ) + { + if( xSchedulerRunning != pdFALSE ) + { + if( pxCurrentTCB->uxCriticalNesting > 0U ) + { + ( pxCurrentTCB->uxCriticalNesting )--; + + if( pxCurrentTCB->uxCriticalNesting == 0U ) + { + portENABLE_INTERRUPTS(); + } + } + } + } + +#endif /* portCRITICAL_NESTING_IN_TCB */ +/*-----------------------------------------------------------*/ + +#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) ) + + void vTaskList( signed char *pcWriteBuffer ) + { + xTaskStatusType *pxTaskStatusArray; + volatile unsigned portBASE_TYPE uxArraySize, x; + char cStatus; + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskList() calls uxTaskGetSystemState(), then formats part of the + * uxTaskGetSystemState() output into a human readable table that + * displays task names, states and stack usage. + * + * vTaskList() has a dependency on the sprintf() C library function that + * might bloat the code size, use a lot of stack, and provide different + * results on different platforms. An alternative, tiny, third party, + * and limited functionality implementation of sprintf() is provided in + * many of the FreeRTOS/Demo sub-directories in a file called + * printf-stdarg.c (note printf-stdarg.c does not provide a full + * snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskList(). + */ + + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( xTaskStatusType ) ); + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL ); + + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + switch( pxTaskStatusArray[ x ].eCurrentState ) + { + case eReady: cStatus = tskREADY_CHAR; + break; + + case eBlocked: cStatus = tskBLOCKED_CHAR; + break; + + case eSuspended: cStatus = tskSUSPENDED_CHAR; + break; + + case eDeleted: cStatus = tskDELETED_CHAR; + break; + + default: /* Should not get here, but it is included + to prevent static checking errors. */ + cStatus = 0x00; + break; + } + + sprintf( ( char * ) pcWriteBuffer, ( char * ) "%s\t\t%c\t%u\t%u\t%u\r\n", pxTaskStatusArray[ x ].pcTaskName, cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); + pcWriteBuffer += strlen( ( char * ) pcWriteBuffer ); + } + + /* Free the array again. */ + vPortFree( pxTaskStatusArray ); + } + } + +#endif /* configUSE_TRACE_FACILITY */ +/*----------------------------------------------------------*/ + +#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) ) + + void vTaskGetRunTimeStats( signed char *pcWriteBuffer ) + { + xTaskStatusType *pxTaskStatusArray; + volatile unsigned portBASE_TYPE uxArraySize, x; + unsigned long ulTotalTime, ulStatsAsPercentage; + + /* + * PLEASE NOTE: + * + * This function is provided for convenience only, and is used by many + * of the demo applications. Do not consider it to be part of the + * scheduler. + * + * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part + * of the uxTaskGetSystemState() output into a human readable table that + * displays the amount of time each task has spent in the Running state + * in both absolute and percentage terms. + * + * vTaskGetRunTimeStats() has a dependency on the sprintf() C library + * function that might bloat the code size, use a lot of stack, and + * provide different results on different platforms. An alternative, + * tiny, third party, and limited functionality implementation of + * sprintf() is provided in many of the FreeRTOS/Demo sub-directories in + * a file called printf-stdarg.c (note printf-stdarg.c does not provide + * a full snprintf() implementation!). + * + * It is recommended that production systems call uxTaskGetSystemState() + * directly to get access to raw stats data, rather than indirectly + * through a call to vTaskGetRunTimeStats(). + */ + + /* Make sure the write buffer does not contain a string. */ + *pcWriteBuffer = 0x00; + + /* Take a snapshot of the number of tasks in case it changes while this + function is executing. */ + uxArraySize = uxCurrentNumberOfTasks; + + /* Allocate an array index for each task. */ + pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( xTaskStatusType ) ); + + if( pxTaskStatusArray != NULL ) + { + /* Generate the (binary) data. */ + uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalTime ); + + /* For percentage calculations. */ + ulTotalTime /= 100UL; + + /* Avoid divide by zero errors. */ + if( ulTotalTime > 0 ) + { + /* Create a human readable table from the binary data. */ + for( x = 0; x < uxArraySize; x++ ) + { + /* What percentage of the total run time has the task used? + This will always be rounded down to the nearest integer. + ulTotalRunTimeDiv100 has already been divided by 100. */ + ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalTime; + + if( ulStatsAsPercentage > 0UL ) + { + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( ( char * ) pcWriteBuffer, ( char * ) "%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( ( char * ) pcWriteBuffer, ( char * ) "%s\t\t%u\t\t%u%%\r\n", pxTaskStatusArray[ x ].pcTaskName, ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage ); + } + #endif + } + else + { + /* If the percentage is zero here then the task has + consumed less than 1% of the total run time. */ + #ifdef portLU_PRINTF_SPECIFIER_REQUIRED + { + sprintf( ( char * ) pcWriteBuffer, ( char * ) "%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #else + { + /* sizeof( int ) == sizeof( long ) so a smaller + printf() library can be used. */ + sprintf( ( char * ) pcWriteBuffer, ( char * ) "%s\t\t%u\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter ); + } + #endif + } + + pcWriteBuffer += strlen( ( char * ) pcWriteBuffer ); + } + } + + /* Free the array again. */ + vPortFree( pxTaskStatusArray ); + } + } + +#endif /* configGENERATE_RUN_TIME_STATS */ + + + diff --git a/third_party/FreeRTOS/Source/timers.c b/third_party/FreeRTOS/Source/timers.c new file mode 100644 index 0000000..aeaae2f --- /dev/null +++ b/third_party/FreeRTOS/Source/timers.c @@ -0,0 +1,707 @@ +/* + FreeRTOS V7.6.0 - Copyright (C) 2013 Real Time Engineers Ltd. + All rights reserved + + VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION. + + *************************************************************************** + * * + * FreeRTOS provides completely free yet professionally developed, * + * robust, strictly quality controlled, supported, and cross * + * platform software that has become a de facto standard. * + * * + * Help yourself get started quickly and support the FreeRTOS * + * project by purchasing a FreeRTOS tutorial book, reference * + * manual, or both from: http://www.FreeRTOS.org/Documentation * + * * + * Thank you! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception. + + >>! NOTE: The modification to the GPL is included to allow you to distribute + >>! a combined work that includes FreeRTOS without being obliged to provide + >>! the source code for proprietary components outside of the FreeRTOS + >>! kernel. + + FreeRTOS 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. Full license text is available from the following + link: http://www.freertos.org/a00114.html + + 1 tab == 4 spaces! + + *************************************************************************** + * * + * Having a problem? Start by reading the FAQ "My application does * + * not run, what could be wrong?" * + * * + * http://www.FreeRTOS.org/FAQHelp.html * + * * + *************************************************************************** + + http://www.FreeRTOS.org - Documentation, books, training, latest versions, + license and Real Time Engineers Ltd. contact details. + + http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products, + including FreeRTOS+Trace - an indispensable productivity tool, a DOS + compatible FAT file system, and our tiny thread aware UDP/IP stack. + + http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High + Integrity Systems to sell under the OpenRTOS brand. Low cost OpenRTOS + licenses offer ticketed support, indemnification and middleware. + + http://www.SafeRTOS.com - High Integrity Systems also provide a safety + engineered and independently SIL3 certified version for use in safety and + mission critical applications that require provable dependability. + + 1 tab == 4 spaces! +*/ + +/* Standard includes. */ +#include + +/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining +all the API functions to use the MPU wrappers. That should only be done when +task.h is included from an application file. */ +#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "timers.h" + +/* Lint e961 and e750 are suppressed as a MISRA exception justified because the +MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the +header files above, but not in this file, in order to generate the correct +privileged Vs unprivileged linkage and placement. */ +#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */ + + +/* This entire source file will be skipped if the application is not configured +to include software timer functionality. This #if is closed at the very bottom +of this file. If you want to include software timer functionality then ensure +configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#if ( configUSE_TIMERS == 1 ) + +/* Misc definitions. */ +#define tmrNO_DELAY ( portTickType ) 0U + +/* The definition of the timers themselves. */ +typedef struct tmrTimerControl +{ + const signed char *pcTimerName; /*<< Text name. This is not used by the kernel, it is included simply to make debugging easier. */ + xListItem xTimerListItem; /*<< Standard linked list item as used by all kernel features for event management. */ + portTickType xTimerPeriodInTicks;/*<< How quickly and often the timer expires. */ + unsigned portBASE_TYPE uxAutoReload; /*<< Set to pdTRUE if the timer should be automatically restarted once expired. Set to pdFALSE if the timer is, in effect, a one shot timer. */ + void *pvTimerID; /*<< An ID to identify the timer. This allows the timer to be identified when the same callback is used for multiple timers. */ + tmrTIMER_CALLBACK pxCallbackFunction; /*<< The function that will be called when the timer expires. */ +} xTIMER; + +/* The definition of messages that can be sent and received on the timer +queue. */ +typedef struct tmrTimerQueueMessage +{ + portBASE_TYPE xMessageID; /*<< The command being sent to the timer service task. */ + portTickType xMessageValue; /*<< An optional value used by a subset of commands, for example, when changing the period of a timer. */ + xTIMER * pxTimer; /*<< The timer to which the command will be applied. */ +} xTIMER_MESSAGE; + +/*lint -e956 A manual analysis and inspection has been used to determine which +static variables must be declared volatile. */ + +/* The list in which active timers are stored. Timers are referenced in expire +time order, with the nearest expiry time at the front of the list. Only the +timer service task is allowed to access xActiveTimerList. */ +PRIVILEGED_DATA static xList xActiveTimerList1; +PRIVILEGED_DATA static xList xActiveTimerList2; +PRIVILEGED_DATA static xList *pxCurrentTimerList; +PRIVILEGED_DATA static xList *pxOverflowTimerList; + +/* A queue that is used to send commands to the timer service task. */ +PRIVILEGED_DATA static xQueueHandle xTimerQueue = NULL; + +#if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 ) + + PRIVILEGED_DATA static xTaskHandle xTimerTaskHandle = NULL; + +#endif + +/*lint +e956 */ + +/*-----------------------------------------------------------*/ + +/* + * Initialise the infrastructure used by the timer service task if it has not + * been initialised already. + */ +static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION; + +/* + * The timer service task (daemon). Timer functionality is controlled by this + * task. Other tasks communicate with the timer service task using the + * xTimerQueue queue. + */ +static void prvTimerTask( void *pvParameters ) PRIVILEGED_FUNCTION; + +/* + * Called by the timer service task to interpret and process a command it + * received on the timer queue. + */ +static void prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION; + +/* + * Insert the timer into either xActiveTimerList1, or xActiveTimerList2, + * depending on if the expire time causes a timer counter overflow. + */ +static portBASE_TYPE prvInsertTimerInActiveList( xTIMER *pxTimer, portTickType xNextExpiryTime, portTickType xTimeNow, portTickType xCommandTime ) PRIVILEGED_FUNCTION; + +/* + * An active timer has reached its expire time. Reload the timer if it is an + * auto reload timer, then call its callback. + */ +static void prvProcessExpiredTimer( portTickType xNextExpireTime, portTickType xTimeNow ) PRIVILEGED_FUNCTION; + +/* + * The tick count has overflowed. Switch the timer lists after ensuring the + * current timer list does not still reference some timers. + */ +static void prvSwitchTimerLists( portTickType xLastTime ) PRIVILEGED_FUNCTION; + +/* + * Obtain the current tick count, setting *pxTimerListsWereSwitched to pdTRUE + * if a tick count overflow occurred since prvSampleTimeNow() was last called. + */ +static portTickType prvSampleTimeNow( portBASE_TYPE *pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION; + +/* + * If the timer list contains any active timers then return the expire time of + * the timer that will expire first and set *pxListWasEmpty to false. If the + * timer list does not contain any timers then return 0 and set *pxListWasEmpty + * to pdTRUE. + */ +static portTickType prvGetNextExpireTime( portBASE_TYPE *pxListWasEmpty ) PRIVILEGED_FUNCTION; + +/* + * If a timer has expired, process it. Otherwise, block the timer service task + * until either a timer does expire or a command is received. + */ +static void prvProcessTimerOrBlockTask( portTickType xNextExpireTime, portBASE_TYPE xListWasEmpty ) PRIVILEGED_FUNCTION; + +/*-----------------------------------------------------------*/ + +portBASE_TYPE xTimerCreateTimerTask( void ) +{ +portBASE_TYPE xReturn = pdFAIL; + + /* This function is called when the scheduler is started if + configUSE_TIMERS is set to 1. Check that the infrastructure used by the + timer service task has been created/initialised. If timers have already + been created then the initialisation will already have been performed. */ + prvCheckForValidListAndQueue(); + + if( xTimerQueue != NULL ) + { + #if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 ) + { + /* Create the timer task, storing its handle in xTimerTaskHandle so + it can be returned by the xTimerGetTimerDaemonTaskHandle() function. */ + xReturn = xTaskCreate( prvTimerTask, ( const signed char * ) "Tmr Svc", ( unsigned short ) configTIMER_TASK_STACK_DEPTH, NULL, ( ( unsigned portBASE_TYPE ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, &xTimerTaskHandle ); + } + #else + { + /* Create the timer task without storing its handle. */ + xReturn = xTaskCreate( prvTimerTask, ( const signed char * ) "Tmr Svc", ( unsigned short ) configTIMER_TASK_STACK_DEPTH, NULL, ( ( unsigned portBASE_TYPE ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT, NULL); + } + #endif + } + + configASSERT( xReturn ); + return xReturn; +} +/*-----------------------------------------------------------*/ + +xTimerHandle xTimerCreate( const signed char * const pcTimerName, portTickType xTimerPeriodInTicks, unsigned portBASE_TYPE uxAutoReload, void *pvTimerID, tmrTIMER_CALLBACK pxCallbackFunction ) +{ +xTIMER *pxNewTimer; + + /* Allocate the timer structure. */ + if( xTimerPeriodInTicks == ( portTickType ) 0U ) + { + pxNewTimer = NULL; + } + else + { + pxNewTimer = ( xTIMER * ) pvPortMalloc( sizeof( xTIMER ) ); + if( pxNewTimer != NULL ) + { + /* Ensure the infrastructure used by the timer service task has been + created/initialised. */ + prvCheckForValidListAndQueue(); + + /* Initialise the timer structure members using the function parameters. */ + pxNewTimer->pcTimerName = pcTimerName; + pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks; + pxNewTimer->uxAutoReload = uxAutoReload; + pxNewTimer->pvTimerID = pvTimerID; + pxNewTimer->pxCallbackFunction = pxCallbackFunction; + vListInitialiseItem( &( pxNewTimer->xTimerListItem ) ); + + traceTIMER_CREATE( pxNewTimer ); + } + else + { + traceTIMER_CREATE_FAILED(); + } + } + + /* 0 is not a valid value for xTimerPeriodInTicks. */ + configASSERT( ( xTimerPeriodInTicks > 0 ) ); + + return ( xTimerHandle ) pxNewTimer; +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xTimerGenericCommand( xTimerHandle xTimer, portBASE_TYPE xCommandID, portTickType xOptionalValue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portTickType xBlockTime ) +{ +portBASE_TYPE xReturn = pdFAIL; +xTIMER_MESSAGE xMessage; + + /* Send a message to the timer service task to perform a particular action + on a particular timer definition. */ + if( xTimerQueue != NULL ) + { + /* Send a command to the timer service task to start the xTimer timer. */ + xMessage.xMessageID = xCommandID; + xMessage.xMessageValue = xOptionalValue; + xMessage.pxTimer = ( xTIMER * ) xTimer; + + if( pxHigherPriorityTaskWoken == NULL ) + { + if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING ) + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xBlockTime ); + } + else + { + xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY ); + } + } + else + { + xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken ); + } + + traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn ); + } + + return xReturn; +} +/*-----------------------------------------------------------*/ + +#if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 ) + + xTaskHandle xTimerGetTimerDaemonTaskHandle( void ) + { + /* If xTimerGetTimerDaemonTaskHandle() is called before the scheduler has been + started, then xTimerTaskHandle will be NULL. */ + configASSERT( ( xTimerTaskHandle != NULL ) ); + return xTimerTaskHandle; + } + +#endif +/*-----------------------------------------------------------*/ + +static void prvProcessExpiredTimer( portTickType xNextExpireTime, portTickType xTimeNow ) +{ +xTIMER *pxTimer; +portBASE_TYPE xResult; + + /* Remove the timer from the list of active timers. A check has already + been performed to ensure the list is not empty. */ + pxTimer = ( xTIMER * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + traceTIMER_EXPIRED( pxTimer ); + + /* If the timer is an auto reload timer then calculate the next + expiry time and re-insert the timer in the list of active timers. */ + if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE ) + { + /* This is the only time a timer is inserted into a list using + a time relative to anything other than the current time. It + will therefore be inserted into the correct list relative to + the time this task thinks it is now, even if a command to + switch lists due to a tick count overflow is already waiting in + the timer queue. */ + if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) == pdTRUE ) + { + /* The timer expired before it was added to the active timer + list. Reload it now. */ + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + } + + /* Call the timer callback. */ + pxTimer->pxCallbackFunction( ( xTimerHandle ) pxTimer ); +} +/*-----------------------------------------------------------*/ + +static void prvTimerTask( void *pvParameters ) +{ +portTickType xNextExpireTime; +portBASE_TYPE xListWasEmpty; + + /* Just to avoid compiler warnings. */ + ( void ) pvParameters; + + for( ;; ) + { + /* Query the timers list to see if it contains any timers, and if so, + obtain the time at which the next timer will expire. */ + xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty ); + + /* If a timer has expired, process it. Otherwise, block this task + until either a timer does expire, or a command is received. */ + prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty ); + + /* Empty the command queue. */ + prvProcessReceivedCommands(); + } +} +/*-----------------------------------------------------------*/ + +static void prvProcessTimerOrBlockTask( portTickType xNextExpireTime, portBASE_TYPE xListWasEmpty ) +{ +portTickType xTimeNow; +portBASE_TYPE xTimerListsWereSwitched; + + vTaskSuspendAll(); + { + /* Obtain the time now to make an assessment as to whether the timer + has expired or not. If obtaining the time causes the lists to switch + then don't process this timer as any timers that remained in the list + when the lists were switched will have been processed within the + prvSampelTimeNow() function. */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + if( xTimerListsWereSwitched == pdFALSE ) + { + /* The tick count has not overflowed, has the timer expired? */ + if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) ) + { + ( void ) xTaskResumeAll(); + prvProcessExpiredTimer( xNextExpireTime, xTimeNow ); + } + else + { + /* The tick count has not overflowed, and the next expire + time has not been reached yet. This task should therefore + block to wait for the next expire time or a command to be + received - whichever comes first. The following line cannot + be reached unless xNextExpireTime > xTimeNow, except in the + case when the current timer list is empty. */ + vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ) ); + + if( xTaskResumeAll() == pdFALSE ) + { + /* Yield to wait for either a command to arrive, or the block time + to expire. If a command arrived between the critical section being + exited and this yield then the yield will not cause the task + to block. */ + portYIELD_WITHIN_API(); + } + } + } + else + { + ( void ) xTaskResumeAll(); + } + } +} +/*-----------------------------------------------------------*/ + +static portTickType prvGetNextExpireTime( portBASE_TYPE *pxListWasEmpty ) +{ +portTickType xNextExpireTime; + + /* Timers are listed in expiry time order, with the head of the list + referencing the task that will expire first. Obtain the time at which + the timer with the nearest expiry time will expire. If there are no + active timers then just set the next expire time to 0. That will cause + this task to unblock when the tick count overflows, at which point the + timer lists will be switched and the next expiry time can be + re-assessed. */ + *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList ); + if( *pxListWasEmpty == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + } + else + { + /* Ensure the task unblocks when the tick count rolls over. */ + xNextExpireTime = ( portTickType ) 0U; + } + + return xNextExpireTime; +} +/*-----------------------------------------------------------*/ + +static portTickType prvSampleTimeNow( portBASE_TYPE *pxTimerListsWereSwitched ) +{ +portTickType xTimeNow; +PRIVILEGED_DATA static portTickType xLastTime = ( portTickType ) 0U; /*lint !e956 Variable is only accessible to one task. */ + + xTimeNow = xTaskGetTickCount(); + + if( xTimeNow < xLastTime ) + { + prvSwitchTimerLists( xLastTime ); + *pxTimerListsWereSwitched = pdTRUE; + } + else + { + *pxTimerListsWereSwitched = pdFALSE; + } + + xLastTime = xTimeNow; + + return xTimeNow; +} +/*-----------------------------------------------------------*/ + +static portBASE_TYPE prvInsertTimerInActiveList( xTIMER *pxTimer, portTickType xNextExpiryTime, portTickType xTimeNow, portTickType xCommandTime ) +{ +portBASE_TYPE xProcessTimerNow = pdFALSE; + + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + + if( xNextExpiryTime <= xTimeNow ) + { + /* Has the expiry time elapsed between the command to start/reset a + timer was issued, and the time the command was processed? */ + if( ( xTimeNow - xCommandTime ) >= pxTimer->xTimerPeriodInTicks ) + { + /* The time between a command being issued and the command being + processed actually exceeds the timers period. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) ); + } + } + else + { + if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) ) + { + /* If, since the command was issued, the tick count has overflowed + but the expiry time has not, then the timer must have already passed + its expiry time and should be processed immediately. */ + xProcessTimerNow = pdTRUE; + } + else + { + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + } + + return xProcessTimerNow; +} +/*-----------------------------------------------------------*/ + +static void prvProcessReceivedCommands( void ) +{ +xTIMER_MESSAGE xMessage; +xTIMER *pxTimer; +portBASE_TYPE xTimerListsWereSwitched, xResult; +portTickType xTimeNow; + + while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL ) /*lint !e603 xMessage does not have to be initialised as it is passed out, not in, and it is not used unless xQueueReceive() returns pdTRUE. */ + { + pxTimer = xMessage.pxTimer; + + if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE ) + { + /* The timer is in a list, remove it. */ + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + } + + traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.xMessageValue ); + + /* In this case the xTimerListsWereSwitched parameter is not used, but + it must be present in the function call. prvSampleTimeNow() must be + called after the message is received from xTimerQueue so there is no + possibility of a higher priority task adding a message to the message + queue with a time that is ahead of the timer daemon task (because it + pre-empted the timer daemon task after the xTimeNow value was set). */ + xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched ); + + switch( xMessage.xMessageID ) + { + case tmrCOMMAND_START : + /* Start or restart a timer. */ + if( prvInsertTimerInActiveList( pxTimer, xMessage.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.xMessageValue ) == pdTRUE ) + { + /* The timer expired before it was added to the active timer + list. Process it now. */ + pxTimer->pxCallbackFunction( ( xTimerHandle ) pxTimer ); + + if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE ) + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xMessage.xMessageValue + pxTimer->xTimerPeriodInTicks, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + } + break; + + case tmrCOMMAND_STOP : + /* The timer has already been removed from the active list. + There is nothing to do here. */ + break; + + case tmrCOMMAND_CHANGE_PERIOD : + pxTimer->xTimerPeriodInTicks = xMessage.xMessageValue; + configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) ); + + /* The new period does not really have a reference, and can be + longer or shorter than the old one. The command time is + therefore set to the current time, and as the period cannot be + zero the next expiry time can only be in the future, meaning + (unlike for the xTimerStart() case above) there is no fail case + that needs to be handled here. */ + ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow ); + break; + + case tmrCOMMAND_DELETE : + /* The timer has already been removed from the active list, + just free up the memory. */ + vPortFree( pxTimer ); + break; + + default : + /* Don't expect to get here. */ + break; + } + } +} +/*-----------------------------------------------------------*/ + +static void prvSwitchTimerLists( portTickType xLastTime ) +{ +portTickType xNextExpireTime, xReloadTime; +xList *pxTemp; +xTIMER *pxTimer; +portBASE_TYPE xResult; + + /* Remove compiler warnings if configASSERT() is not defined. */ + ( void ) xLastTime; + + /* The tick count has overflowed. The timer lists must be switched. + If there are any timers still referenced from the current timer list + then they must have expired and should be processed before the lists + are switched. */ + while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE ) + { + xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList ); + + /* Remove the timer from the list. */ + pxTimer = ( xTIMER * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList ); + ( void ) uxListRemove( &( pxTimer->xTimerListItem ) ); + + /* Execute its callback, then send a command to restart the timer if + it is an auto-reload timer. It cannot be restarted here as the lists + have not yet been switched. */ + pxTimer->pxCallbackFunction( ( xTimerHandle ) pxTimer ); + + if( pxTimer->uxAutoReload == ( unsigned portBASE_TYPE ) pdTRUE ) + { + /* Calculate the reload value, and if the reload value results in + the timer going into the same timer list then it has already expired + and the timer should be re-inserted into the current list so it is + processed again within this loop. Otherwise a command should be sent + to restart the timer to ensure it is only inserted into a list after + the lists have been swapped. */ + xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ); + if( xReloadTime > xNextExpireTime ) + { + listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xReloadTime ); + listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer ); + vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) ); + } + else + { + xResult = xTimerGenericCommand( pxTimer, tmrCOMMAND_START, xNextExpireTime, NULL, tmrNO_DELAY ); + configASSERT( xResult ); + ( void ) xResult; + } + } + } + + pxTemp = pxCurrentTimerList; + pxCurrentTimerList = pxOverflowTimerList; + pxOverflowTimerList = pxTemp; +} +/*-----------------------------------------------------------*/ + +static void prvCheckForValidListAndQueue( void ) +{ + /* Check that the list from which active timers are referenced, and the + queue used to communicate with the timer service, have been + initialised. */ + taskENTER_CRITICAL(); + { + if( xTimerQueue == NULL ) + { + vListInitialise( &xActiveTimerList1 ); + vListInitialise( &xActiveTimerList2 ); + pxCurrentTimerList = &xActiveTimerList1; + pxOverflowTimerList = &xActiveTimerList2; + xTimerQueue = xQueueCreate( ( unsigned portBASE_TYPE ) configTIMER_QUEUE_LENGTH, sizeof( xTIMER_MESSAGE ) ); + } + } + taskEXIT_CRITICAL(); +} +/*-----------------------------------------------------------*/ + +portBASE_TYPE xTimerIsTimerActive( xTimerHandle xTimer ) +{ +portBASE_TYPE xTimerIsInActiveList; +xTIMER *pxTimer = ( xTIMER * ) xTimer; + + /* Is the timer in the list of active timers? */ + taskENTER_CRITICAL(); + { + /* Checking to see if it is in the NULL list in effect checks to see if + it is referenced from either the current or the overflow timer lists in + one go, but the logic has to be reversed, hence the '!'. */ + xTimerIsInActiveList = !( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) ); + } + taskEXIT_CRITICAL(); + + return xTimerIsInActiveList; +} +/*-----------------------------------------------------------*/ + +void *pvTimerGetTimerID( xTimerHandle xTimer ) +{ +xTIMER *pxTimer = ( xTIMER * ) xTimer; + + return pxTimer->pvTimerID; +} +/*-----------------------------------------------------------*/ + +/* This entire source file will be skipped if the application is not configured +to include software timer functionality. If you want to include software timer +functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */ +#endif /* configUSE_TIMERS == 1 */ + + + diff --git a/third_party/FreeRTOS/TraceCon/readme.txt b/third_party/FreeRTOS/TraceCon/readme.txt new file mode 100644 index 0000000..ae78ac9 --- /dev/null +++ b/third_party/FreeRTOS/TraceCon/readme.txt @@ -0,0 +1,6 @@ +Tracecon.exe is a very simplistic utility for converting the trace data captured by the scheduler into a tab delimited text file. The text file can be opened using a spread sheet program as described on www.FreeRTOS.org. + +Tracecon should be executed from a command prompt. It looks for a file called Trace.bin in the current directory and creates a file called trace.txt. + +Use the big endian version for file captured on big endian targets. + diff --git a/third_party/FreeRTOS/TraceCon/tracecon_big_endian_untested.exe b/third_party/FreeRTOS/TraceCon/tracecon_big_endian_untested.exe new file mode 100755 index 0000000..3b5d0b0 Binary files /dev/null and b/third_party/FreeRTOS/TraceCon/tracecon_big_endian_untested.exe differ diff --git a/third_party/FreeRTOS/TraceCon/tracecon_little_endian.exe b/third_party/FreeRTOS/TraceCon/tracecon_little_endian.exe new file mode 100755 index 0000000..171e0d0 Binary files /dev/null and b/third_party/FreeRTOS/TraceCon/tracecon_little_endian.exe differ diff --git a/third_party/FreeRTOS/readme.txt b/third_party/FreeRTOS/readme.txt new file mode 100644 index 0000000..13ddc51 --- /dev/null +++ b/third_party/FreeRTOS/readme.txt @@ -0,0 +1,21 @@ +Directories: + ++ The FreeRTOS/Source directory contains the FreeRTOS source code, and contains + its own readme file. + ++ The FreeRTOS/Demo directory contains a demo application for every official +FreeRTOS port, and contains its own readme file. + ++ See http://www.freertos.org/a00017.html for full details of the directory + structure and information on locating the files you require. + +The easiest way to use FreeRTOS is to start with one of the pre-configured demo +application projects (found in the FreeRTOS/Demo directory). That way you will +have the correct FreeRTOS source files included, and the correct include paths +configured. Once a demo application is building and executing you can remove +the demo application file, and start to add in your own application source +files. + +See also - +http://www.freertos.org/FreeRTOS-quick-start-guide.html +http://www.freertos.org/FAQHelp.html diff --git a/third_party/bget/bget.c b/third_party/bget/bget.c new file mode 100644 index 0000000..aa88595 --- /dev/null +++ b/third_party/bget/bget.c @@ -0,0 +1,1618 @@ +/* + + B G E T + + Buffer allocator + + Designed and implemented in April of 1972 by John Walker, based on the + Case Algol OPRO$ algorithm implemented in 1966. + + Reimplemented in 1975 by John Walker for the Interdata 70. + Reimplemented in 1977 by John Walker for the Marinchip 9900. + Reimplemented in 1982 by Duff Kurland for the Intel 8080. + + Portable C version implemented in September of 1990 by an older, wiser + instance of the original implementor. + + Souped up and/or weighed down slightly shortly thereafter by Greg + Lutz. + + AMIX edition, including the new compaction call-back option, prepared + by John Walker in July of 1992. + + Bug in built-in test program fixed, ANSI compiler warnings eradicated, + buffer pool validator implemented, and guaranteed repeatable test + added by John Walker in October of 1995. + + This program is in the public domain. + + 1. This is the book of the generations of Adam. In the day that God + created man, in the likeness of God made he him; + 2. Male and female created he them; and blessed them, and called + their name Adam, in the day when they were created. + 3. And Adam lived an hundred and thirty years, and begat a son in + his own likeness, and after his image; and called his name Seth: + 4. And the days of Adam after he had begotten Seth were eight + hundred years: and he begat sons and daughters: + 5. And all the days that Adam lived were nine hundred and thirty + years: and he died. + 6. And Seth lived an hundred and five years, and begat Enos: + 7. And Seth lived after he begat Enos eight hundred and seven years, + and begat sons and daughters: + 8. And all the days of Seth were nine hundred and twelve years: and + he died. + 9. And Enos lived ninety years, and begat Cainan: + 10. And Enos lived after he begat Cainan eight hundred and fifteen + years, and begat sons and daughters: + 11. And all the days of Enos were nine hundred and five years: and + he died. + 12. And Cainan lived seventy years and begat Mahalaleel: + 13. And Cainan lived after he begat Mahalaleel eight hundred and + forty years, and begat sons and daughters: + 14. And all the days of Cainan were nine hundred and ten years: and + he died. + 15. And Mahalaleel lived sixty and five years, and begat Jared: + 16. And Mahalaleel lived after he begat Jared eight hundred and + thirty years, and begat sons and daughters: + 17. And all the days of Mahalaleel were eight hundred ninety and + five years: and he died. + 18. And Jared lived an hundred sixty and two years, and he begat + Enoch: + 19. And Jared lived after he begat Enoch eight hundred years, and + begat sons and daughters: + 20. And all the days of Jared were nine hundred sixty and two years: + and he died. + 21. And Enoch lived sixty and five years, and begat Methuselah: + 22. And Enoch walked with God after he begat Methuselah three + hundred years, and begat sons and daughters: + 23. And all the days of Enoch were three hundred sixty and five + years: + 24. And Enoch walked with God: and he was not; for God took him. + 25. And Methuselah lived an hundred eighty and seven years, and + begat Lamech. + 26. And Methuselah lived after he begat Lamech seven hundred eighty + and two years, and begat sons and daughters: + 27. And all the days of Methuselah were nine hundred sixty and nine + years: and he died. + 28. And Lamech lived an hundred eighty and two years, and begat a + son: + 29. And he called his name Noah, saying, This same shall comfort us + concerning our work and toil of our hands, because of the ground + which the LORD hath cursed. + 30. And Lamech lived after he begat Noah five hundred ninety and + five years, and begat sons and daughters: + 31. And all the days of Lamech were seven hundred seventy and seven + years: and he died. + 32. And Noah was five hundred years old: and Noah begat Shem, Ham, + and Japheth. + + And buffers begat buffers, and links begat links, and buffer pools + begat links to chains of buffer pools containing buffers, and lo the + buffers and links and pools of buffers and pools of links to chains of + pools of buffers were fruitful and they multiplied and the Operating + System looked down upon them and said that it was Good. + + + INTRODUCTION + ============ + + BGET is a comprehensive memory allocation package which is easily + configured to the needs of an application. BGET is efficient in + both the time needed to allocate and release buffers and in the + memory overhead required for buffer pool management. It + automatically consolidates contiguous space to minimise + fragmentation. BGET is configured by compile-time definitions, + Major options include: + + * A built-in test program to exercise BGET and + demonstrate how the various functions are used. + + * Allocation by either the "first fit" or "best fit" + method. + + * Wiping buffers at release time to catch code which + references previously released storage. + + * Built-in routines to dump individual buffers or the + entire buffer pool. + + * Retrieval of allocation and pool size statistics. + + * Quantisation of buffer sizes to a power of two to + satisfy hardware alignment constraints. + + * Automatic pool compaction, growth, and shrinkage by + means of call-backs to user defined functions. + + Applications of BGET can range from storage management in + ROM-based embedded programs to providing the framework upon which + a multitasking system incorporating garbage collection is + constructed. BGET incorporates extensive internal consistency + checking using the an ASSERT mechanism; all these checks can be + turned off by compiling with NDEBUG defined, yielding a version of + BGET with minimal size and maximum speed. + + The basic algorithm underlying BGET has withstood the test of + time; more than 25 years have passed since the first + implementation of this code. And yet, it is substantially more + efficient than the native allocation schemes of many operating + systems: the Macintosh and Microsoft Windows to name two, on which + programs have obtained substantial speed-ups by layering BGET as + an application level memory manager atop the underlying system's. + + BGET has been implemented on the largest mainframes and the lowest + of microprocessors. It has served as the core for multitasking + operating systems, multi-thread applications, embedded software in + data network switching processors, and a host of C programs. And + while it has accreted flexibility and additional options over the + years, it remains fast, memory efficient, portable, and easy to + integrate into your program. + + + BGET IMPLEMENTATION ASSUMPTIONS + =============================== + + BGET is written in as portable a dialect of C as possible. The + only fundamental assumption about the underlying hardware + architecture is that memory is allocated is a linear array which + can be addressed as a vector of C "char" objects. On segmented + address space architectures, this generally means that BGET should + be used to allocate storage within a single segment (although some + compilers simulate linear address spaces on segmented + architectures). On segmented architectures, then, BGET buffer + pools may not be larger than a segment, but since BGET allows any + number of separate buffer pools, there is no limit on the total + storage which can be managed, only on the largest individual + object which can be allocated. Machines with a linear address + architecture, such as the VAX, 680x0, Sparc, MIPS, or the Intel + 80386 and above in native mode, may use BGET without restriction. + + + GETTING STARTED WITH BGET + ========================= + + Although BGET can be configured in a multitude of fashions, there + are three basic ways of working with BGET. The functions + mentioned below are documented in the following section. Please + excuse the forward references which are made in the interest of + providing a roadmap to guide you to the BGET functions you're + likely to need. + + Embedded Applications + --------------------- + + Embedded applications typically have a fixed area of memory + dedicated to buffer allocation (often in a separate RAM address + space distinct from the ROM that contains the executable code). + To use BGET in such an environment, simply call bpool() with the + start address and length of the buffer pool area in RAM, then + allocate buffers with bget() and release them with brel(). + Embedded applications with very limited RAM but abundant CPU speed + may benefit by configuring BGET for BestFit allocation (which is + usually not worth it in other environments). + + Malloc() Emulation + ------------------ + + If the C library malloc() function is too slow, not present in + your development environment (for example, an a native Windows or + Macintosh program), or otherwise unsuitable, you can replace it + with BGET. Initially define a buffer pool of an appropriate size + with bpool()--usually obtained by making a call to the operating + system's low-level memory allocator. Then allocate buffers with + bget(), bgetz(), and bgetr() (the last two permit the allocation + of buffers initialised to zero and [inefficient] re-allocation of + existing buffers for compatibility with C library functions). + Release buffers by calling brel(). If a buffer allocation request + fails, obtain more storage from the underlying operating system, + add it to the buffer pool by another call to bpool(), and continue + execution. + + Automatic Storage Management + ---------------------------- + + You can use BGET as your application's native memory manager and + implement automatic storage pool expansion, contraction, and + optionally application-specific memory compaction by compiling + BGET with the BECtl variable defined, then calling bectl() and + supplying functions for storage compaction, acquisition, and + release, as well as a standard pool expansion increment. All of + these functions are optional (although it doesn't make much sense + to provide a release function without an acquisition function, + does it?). Once the call-back functions have been defined with + bectl(), you simply use bget() and brel() to allocate and release + storage as before. You can supply an initial buffer pool with + bpool() or rely on automatic allocation to acquire the entire + pool. When a call on bget() cannot be satisfied, BGET first + checks if a compaction function has been supplied. If so, it is + called (with the space required to satisfy the allocation request + and a sequence number to allow the compaction routine to be called + successively without looping). If the compaction function is able + to free any storage (it needn't know whether the storage it freed + was adequate) it should return a nonzero value, whereupon BGET + will retry the allocation request and, if it fails again, call the + compaction function again with the next-higher sequence number. + + If the compaction function returns zero, indicating failure to + free space, or no compaction function is defined, BGET next tests + whether a non-NULL allocation function was supplied to bectl(). + If so, that function is called with an argument indicating how + many bytes of additional space are required. This will be the + standard pool expansion increment supplied in the call to bectl() + unless the original bget() call requested a buffer larger than + this; buffers larger than the standard pool block can be managed + "off the books" by BGET in this mode. If the allocation function + succeeds in obtaining the storage, it returns a pointer to the new + block and BGET expands the buffer pool; if it fails, the + allocation request fails and returns NULL to the caller. If a + non-NULL release function is supplied, expansion blocks which + become totally empty are released to the global free pool by + passing their addresses to the release function. + + Equipped with appropriate allocation, release, and compaction + functions, BGET can be used as part of very sophisticated memory + management strategies, including garbage collection. (Note, + however, that BGET is *not* a garbage collector by itself, and + that developing such a system requires much additional logic and + careful design of the application's memory allocation strategy.) + + + BGET FUNCTION DESCRIPTIONS + ========================== + + Functions implemented in this file (some are enabled by certain of + the optional settings below): + + void bpool(void *buffer, bufsize len); + + Create a buffer pool of bytes, using the storage starting at + . You can call bpool() subsequently to contribute + additional storage to the overall buffer pool. + + void *bget(bufsize size); + + Allocate a buffer of bytes. The address of the buffer is + returned, or NULL if insufficient memory was available to allocate + the buffer. + + void *bgetz(bufsize size); + + Allocate a buffer of bytes and clear it to all zeroes. The + address of the buffer is returned, or NULL if insufficient memory + was available to allocate the buffer. + + void *bgetr(void *buffer, bufsize newsize); + + Reallocate a buffer previously allocated by bget(), changing its + size to and preserving all existing data. NULL is + returned if insufficient memory is available to reallocate the + buffer, in which case the original buffer remains intact. + + void brel(void *buf); + + Return the buffer , previously allocated by bget(), to the + free space pool. + + void bectl(int (*compact)(bufsize sizereq, int sequence), + void *(*acquire)(bufsize size), + void (*release)(void *buf), + bufsize pool_incr); + + Expansion control: specify functions through which the package may + compact storage (or take other appropriate action) when an + allocation request fails, and optionally automatically acquire + storage for expansion blocks when necessary, and release such + blocks when they become empty. If is non-NULL, whenever + a buffer allocation request fails, the function will be + called with arguments specifying the number of bytes (total buffer + size, including header overhead) required to satisfy the + allocation request, and a sequence number indicating the number of + consecutive calls on attempting to satisfy this + allocation request. The sequence number is 1 for the first call + on for a given allocation request, and increments on + subsequent calls, permitting the function to take + increasingly dire measures in an attempt to free up storage. If + the function returns a nonzero value, the allocation + attempt is re-tried. If returns 0 (as it must if it + isn't able to release any space or add storage to the buffer + pool), the allocation request fails, which can trigger automatic + pool expansion if the argument is non-NULL. At the time + the function is called, the state of the buffer + allocator is identical to that at the moment the allocation + request was made; consequently, the function may call + brel(), bpool(), bstats(), and/or directly manipulate the buffer + pool in any manner which would be valid were the application in + control. This does not, however, relieve the function + of the need to ensure that whatever actions it takes do not change + things underneath the application that made the allocation + request. For example, a function that released a buffer + in the process of being reallocated with bgetr() would lead to + disaster. Implementing a safe and effective mechanism + requires careful design of an application's memory architecture, + and cannot generally be easily retrofitted into existing code. + + If is non-NULL, that function will be called whenever an + allocation request fails. If the function succeeds in + allocating the requested space and returns a pointer to the new + area, allocation will proceed using the expanded buffer pool. If + cannot obtain the requested space, it should return NULL + and the entire allocation process will fail. + specifies the normal expansion block size. Providing an + function will cause subsequent bget() requests for buffers too + large to be managed in the linked-block scheme (in other words, + larger than minus the buffer overhead) to be satisfied + directly by calls to the function. Automatic release of + empty pool blocks will occur only if all pool blocks in the system + are the size given by . + + void bstats(bufsize *curalloc, bufsize *totfree, + bufsize *maxfree, long *nget, long *nrel); + + The amount of space currently allocated is stored into the + variable pointed to by . The total free space (sum of + all free blocks in the pool) is stored into the variable pointed + to by , and the size of the largest single block in the + free space pool is stored into the variable pointed to by + . The variables pointed to by and are + filled, respectively, with the number of successful (non-NULL + return) bget() calls and the number of brel() calls. + + void bstatse(bufsize *pool_incr, long *npool, + long *npget, long *nprel, + long *ndget, long *ndrel); + + Extended statistics: The expansion block size will be stored into + the variable pointed to by , or the negative thereof if + automatic expansion block releases are disabled. The number of + currently active pool blocks will be stored into the variable + pointed to by . The variables pointed to by and + will be filled with, respectively, the number of expansion + block acquisitions and releases which have occurred. The + variables pointed to by and will be filled with + the number of bget() and brel() calls, respectively, managed + through blocks directly allocated by the acquisition and release + functions. + + void bufdump(void *buf); + + The buffer pointed to by is dumped on standard output. + + void bpoold(void *pool, int dumpalloc, int dumpfree); + + All buffers in the buffer pool , previously initialised by a + call on bpool(), are listed in ascending memory address order. If + is nonzero, the contents of allocated buffers are + dumped; if is nonzero, the contents of free blocks are + dumped. + + int bpoolv(void *pool); + + The named buffer pool, previously initialised by a call on + bpool(), is validated for bad pointers, overwritten data, etc. If + compiled with NDEBUG not defined, any error generates an assertion + failure. Otherwise 1 is returned if the pool is valid, 0 if an + error is found. + + + BGET CONFIGURATION + ================== +*/ + +#define TestProg 20000 /* Generate built-in test program + if defined. The value specifies + how many buffer allocation attempts + the test program should make. */ +#undef TestProg + +#define SizeQuant 4 /* Buffer allocation size quantum: + all buffers allocated are a + multiple of this size. This + MUST be a power of two. */ + +#define BufDump 1 /* Define this symbol to enable the + bpoold() function which dumps the + buffers in a buffer pool. */ +#undef BufDump + +#define BufValid 1 /* Define this symbol to enable the + bpoolv() function for validating + a buffer pool. */ +#undef BufValid + +#define DumpData 1 /* Define this symbol to enable the + bufdump() function which allows + dumping the contents of an allocated + or free buffer. */ +#undef DumpData + +#define BufStats 1 /* Define this symbol to enable the + bstats() function which calculates + the total free space in the buffer + pool, the largest available + buffer, and the total space + currently allocated. */ +#ifndef DEBUG +#ifndef INCLUDE_BGET_STATS +#undef BufStats +#endif +#endif + +#define FreeWipe 1 /* Wipe free buffers to a guaranteed + pattern of garbage to trip up + miscreants who attempt to use + pointers into released buffers. */ +#undef FreeWipe + +#define BestFit 1 /* Use a best fit algorithm when + searching for space for an + allocation request. This uses + memory more efficiently, but + allocation will be much slower. */ + +#define BECtl 1 /* Define this symbol to enable the + bectl() function for automatic + pool space control. */ +#undef BECtl + +//#include + +#ifdef lint +#define NDEBUG /* Exits in asserts confuse lint */ +/* LINTLIBRARY */ /* Don't complain about def, no ref */ +extern char *sprintf(); /* Sun includes don't define sprintf */ +#endif + +#include + +/* Replaced #include with this local definition. This prevents + * calls to the C runtime from assert(). These had caused problems when + * building using the IAR Embedded Workbench toolchain with semihosting + * disabled. + */ +#ifdef DEBUG +extern void __error__(char *, unsigned long); +#define ASSERT(expr) { \ + if(!(expr)) \ + { \ + __error__(__FILE__, __LINE__); \ + } \ + } +#else +#define ASSERT(expr) +#endif + +#ifdef BufDump /* BufDump implies DumpData */ +#ifndef DumpData +#define DumpData 1 +#endif +#endif + +#ifdef DumpData +#include +#endif + +/* Declare the interface, including the requested buffer size type, + bufsize. */ + +#include "bget.h" + +#define MemSize int /* Type for size arguments to memxxx() + functions such as memcmp(). */ + +/* Queue links */ + +struct qlinks { + struct bfhead *flink; /* Forward link */ + struct bfhead *blink; /* Backward link */ +}; + +/* Header in allocated and free buffers */ + +struct bhead { + bufsize prevfree; /* Relative link back to previous + free buffer in memory or 0 if + previous buffer is allocated. */ + bufsize bsize; /* Buffer size: positive if free, + negative if allocated. */ +}; +#define BH(p) ((struct bhead *) (p)) + +/* Header in directly allocated buffers (by acqfcn) */ + +struct bdhead { + bufsize tsize; /* Total size, including overhead */ + struct bhead bh; /* Common header */ +}; +#define BDH(p) ((struct bdhead *) (p)) + +/* Header in free buffers */ + +struct bfhead { + struct bhead bh; /* Common allocated/free header */ + struct qlinks ql; /* Links on free list */ +}; +#define BFH(p) ((struct bfhead *) (p)) + +static struct bfhead freelist = { /* List of free buffers */ + {0, 0}, + {&freelist, &freelist} +}; + + +#ifdef BufStats +static bufsize totalloc = 0; /* Total space currently allocated */ +static long numget = 0, numrel = 0; /* Number of bget() and brel() calls */ +#ifdef BECtl +static long numpblk = 0; /* Number of pool blocks */ +static long numpget = 0, numprel = 0; /* Number of block gets and rels */ +static long numdget = 0, numdrel = 0; /* Number of direct gets and rels */ +#endif /* BECtl */ +#endif /* BufStats */ + +#ifdef BECtl + +/* Automatic expansion block management functions */ + +static int (*compfcn) _((bufsize sizereq, int sequence)) = NULL; +static void *(*acqfcn) _((bufsize size)) = NULL; +static void (*relfcn) _((void *buf)) = NULL; + +static bufsize exp_incr = 0; /* Expansion block size */ +static bufsize pool_len = 0; /* 0: no bpool calls have been made + -1: not all pool blocks are + the same size + >0: (common) block size for all + bpool calls made so far + */ +#endif + +/* Minimum allocation quantum: */ + +#define QLSize (sizeof(struct qlinks)) +#define SizeQ ((SizeQuant > QLSize) ? SizeQuant : QLSize) + +#define V (void) /* To denote unwanted returned values */ + +/* End sentinel: value placed in bsize field of dummy block delimiting + end of pool block. The most negative number which will fit in a + bufsize, defined in a way that the compiler will accept. */ + +#define ESent ((bufsize) (-(((1L << (sizeof(bufsize) * 8 - 2)) - 1) * 2) - 2)) + +/* BGET -- Allocate a buffer. */ + +void *bget( + bufsize requested_size) +{ + bufsize size = requested_size; + struct bfhead *b; +#ifdef BestFit + struct bfhead *best; +#endif + void *buf; +#ifdef BECtl + int compactseq = 0; +#endif + + ASSERT(size > 0); + + if (size < SizeQ) { /* Need at least room for the */ + size = SizeQ; /* queue links. */ + } +#ifdef SizeQuant +#if SizeQuant > 1 + size = (size + (SizeQuant - 1)) & (~(SizeQuant - 1)); +#endif +#endif + + size += sizeof(struct bhead); /* Add overhead in allocated buffer + to size required. */ + +#ifdef BECtl + /* If a compact function was provided in the call to bectl(), wrap + a loop around the allocation process to allow compaction to + intervene in case we don't find a suitable buffer in the chain. */ + + while (1) { +#endif + b = freelist.ql.flink; +#ifdef BestFit + best = &freelist; +#endif + + + /* Scan the free list searching for the first buffer big enough + to hold the requested size buffer. */ + +#ifdef BestFit + while (b != &freelist) { + if (b->bh.bsize >= size) { + if ((best == &freelist) || (b->bh.bsize < best->bh.bsize)) { + best = b; + } + } + b = b->ql.flink; /* Link to next buffer */ + } + b = best; +#endif /* BestFit */ + + while (b != &freelist) { + if ((bufsize) b->bh.bsize >= size) { + + /* Buffer is big enough to satisfy the request. Allocate it + to the caller. We must decide whether the buffer is large + enough to split into the part given to the caller and a + free buffer that remains on the free list, or whether the + entire buffer should be removed from the free list and + given to the caller in its entirety. We only split the + buffer if enough room remains for a header plus the minimum + quantum of allocation. */ + + if ((b->bh.bsize - size) > (SizeQ + (sizeof(struct bhead)))) { + struct bhead *ba, *bn; + + ba = BH(((char *) b) + (b->bh.bsize - size)); + bn = BH(((char *) ba) + size); + ASSERT(bn->prevfree == b->bh.bsize); + /* Subtract size from length of free block. */ + b->bh.bsize -= size; + /* Link allocated buffer to the previous free buffer. */ + ba->prevfree = b->bh.bsize; + /* Plug negative size into user buffer. */ + ba->bsize = -(bufsize) size; + /* Mark buffer after this one not preceded by free block. */ + bn->prevfree = 0; + +#ifdef BufStats + totalloc += size; + numget++; /* Increment number of bget() calls */ +#endif + buf = (void *) ((((char *) ba) + sizeof(struct bhead))); + return buf; + } else { + struct bhead *ba; + + ba = BH(((char *) b) + b->bh.bsize); + ASSERT(ba->prevfree == b->bh.bsize); + + /* The buffer isn't big enough to split. Give the whole + shebang to the caller and remove it from the free list. */ + + ASSERT(b->ql.blink->ql.flink == b); + ASSERT(b->ql.flink->ql.blink == b); + b->ql.blink->ql.flink = b->ql.flink; + b->ql.flink->ql.blink = b->ql.blink; + +#ifdef BufStats + totalloc += b->bh.bsize; + numget++; /* Increment number of bget() calls */ +#endif + /* Negate size to mark buffer allocated. */ + b->bh.bsize = -(b->bh.bsize); + + /* Zero the back pointer in the next buffer in memory + to indicate that this buffer is allocated. */ + ba->prevfree = 0; + + /* Give user buffer starting at queue links. */ + buf = (void *) &(b->ql); + return buf; + } + } + b = b->ql.flink; /* Link to next buffer */ + } +#ifdef BECtl + + /* We failed to find a buffer. If there's a compact function + defined, notify it of the size requested. If it returns + TRUE, try the allocation again. */ + + if ((compfcn == NULL) || (!(*compfcn)(size, ++compactseq))) { + break; + } + } + + /* No buffer available with requested size free. */ + + /* Don't give up yet -- look in the reserve supply. */ + + if (acqfcn != NULL) { + if (size > exp_incr - sizeof(struct bhead)) { + + /* Request is too large to fit in a single expansion + block. Try to satisy it by a direct buffer acquisition. */ + + struct bdhead *bdh; + + size += sizeof(struct bdhead) - sizeof(struct bhead); + if ((bdh = BDH((*acqfcn)((bufsize) size))) != NULL) { + + /* Mark the buffer special by setting the size field + of its header to zero. */ + bdh->bh.bsize = 0; + bdh->bh.prevfree = 0; + bdh->tsize = size; +#ifdef BufStats + totalloc += size; + numget++; /* Increment number of bget() calls */ + numdget++; /* Direct bget() call count */ +#endif + buf = (void *) (bdh + 1); + return buf; + } + + } else { + + /* Try to obtain a new expansion block */ + + void *newpool; + + if ((newpool = (*acqfcn)((bufsize) exp_incr)) != NULL) { + bpool(newpool, exp_incr); + buf = bget(requested_size); /* This can't, I say, can't + get into a loop. */ + return buf; + } + } + } + + /* Still no buffer available */ + +#endif /* BECtl */ + + return NULL; +} + +/* BGETZ -- Allocate a buffer and clear its contents to zero. We clear + the entire contents of the buffer to zero, not just the + region requested by the caller. */ + +void *bgetz( + bufsize size) +{ + char *buf = (char *) bget(size); + + if (buf != NULL) { + struct bhead *b; + bufsize rsize; + + b = BH(buf - sizeof(struct bhead)); + rsize = -(b->bsize); + if (rsize == 0) { + struct bdhead *bd; + + bd = BDH(buf - sizeof(struct bdhead)); + rsize = bd->tsize - sizeof(struct bdhead); + } else { + rsize -= sizeof(struct bhead); + } + ASSERT(rsize >= size); + V memset(buf, 0, (MemSize) rsize); + } + return ((void *) buf); +} + +/* BGETR -- Reallocate a buffer. This is a minimal implementation, + simply in terms of brel() and bget(). It could be + enhanced to allow the buffer to grow into adjacent free + blocks and to avoid moving data unnecessarily. */ + +void *bgetr( + void *buf, + bufsize size) +{ + void *nbuf; + bufsize osize; /* Old size of buffer */ + struct bhead *b; + + if ((nbuf = bget(size)) == NULL) { /* Acquire new buffer */ + return NULL; + } + if (buf == NULL) { + return nbuf; + } + b = BH(((char *) buf) - sizeof(struct bhead)); + osize = -b->bsize; +#ifdef BECtl + if (osize == 0) { + /* Buffer acquired directly through acqfcn. */ + struct bdhead *bd; + + bd = BDH(((char *) buf) - sizeof(struct bdhead)); + osize = bd->tsize - sizeof(struct bdhead); + } else +#endif + osize -= sizeof(struct bhead); + ASSERT(osize > 0); + V memcpy((char *) nbuf, (char *) buf, /* Copy the data */ + (MemSize) ((size < osize) ? size : osize)); + brel(buf); + return nbuf; +} + +/* BREL -- Release a buffer. */ + +void brel( + void *buf) +{ + struct bfhead *b, *bn; + + b = BFH(((char *) buf) - sizeof(struct bhead)); +#ifdef BufStats + numrel++; /* Increment number of brel() calls */ +#endif + ASSERT(buf != NULL); + +#ifdef BECtl + if (b->bh.bsize == 0) { /* Directly-acquired buffer? */ + struct bdhead *bdh; + + bdh = BDH(((char *) buf) - sizeof(struct bdhead)); + ASSERT(b->bh.prevfree == 0); +#ifdef BufStats + totalloc -= bdh->tsize; + ASSERT(totalloc >= 0); + numdrel++; /* Number of direct releases */ +#endif /* BufStats */ +#ifdef FreeWipe + V memset((char *) buf, 0x55, + (MemSize) (bdh->tsize - sizeof(struct bdhead))); +#endif /* FreeWipe */ + ASSERT(relfcn != NULL); + (*relfcn)((void *) bdh); /* Release it directly. */ + return; + } +#endif /* BECtl */ + + /* Buffer size must be negative, indicating that the buffer is + allocated. */ + + if (b->bh.bsize >= 0) { + bn = NULL; + } + ASSERT(b->bh.bsize < 0); + + /* Back pointer in next buffer must be zero, indicating the + same thing: */ + + ASSERT(BH((char *) b - b->bh.bsize)->prevfree == 0); + +#ifdef BufStats + totalloc += b->bh.bsize; + ASSERT(totalloc >= 0); +#endif + + /* If the back link is nonzero, the previous buffer is free. */ + + if (b->bh.prevfree != 0) { + + /* The previous buffer is free. Consolidate this buffer with it + by adding the length of this buffer to the previous free + buffer. Note that we subtract the size in the buffer being + released, since it's negative to indicate that the buffer is + allocated. */ + + register bufsize size = b->bh.bsize; + + /* Make the previous buffer the one we're working on. */ + ASSERT(BH((char *) b - b->bh.prevfree)->bsize == b->bh.prevfree); + b = BFH(((char *) b) - b->bh.prevfree); + b->bh.bsize -= size; + } else { + + /* The previous buffer isn't allocated. Insert this buffer + on the free list as an isolated free block. */ + + ASSERT(freelist.ql.blink->ql.flink == &freelist); + ASSERT(freelist.ql.flink->ql.blink == &freelist); + b->ql.flink = &freelist; + b->ql.blink = freelist.ql.blink; + freelist.ql.blink = b; + b->ql.blink->ql.flink = b; + b->bh.bsize = -b->bh.bsize; + } + + /* Now we look at the next buffer in memory, located by advancing from + the start of this buffer by its size, to see if that buffer is + free. If it is, we combine this buffer with the next one in + memory, dechaining the second buffer from the free list. */ + + bn = BFH(((char *) b) + b->bh.bsize); + if (bn->bh.bsize > 0) { + + /* The buffer is free. Remove it from the free list and add + its size to that of our buffer. */ + + ASSERT(BH((char *) bn + bn->bh.bsize)->prevfree == bn->bh.bsize); + ASSERT(bn->ql.blink->ql.flink == bn); + ASSERT(bn->ql.flink->ql.blink == bn); + bn->ql.blink->ql.flink = bn->ql.flink; + bn->ql.flink->ql.blink = bn->ql.blink; + b->bh.bsize += bn->bh.bsize; + + /* Finally, advance to the buffer that follows the newly + consolidated free block. We must set its backpointer to the + head of the consolidated free block. We know the next block + must be an allocated block because the process of recombination + guarantees that two free blocks will never be contiguous in + memory. */ + + bn = BFH(((char *) b) + b->bh.bsize); + } +#ifdef FreeWipe + V memset(((char *) b) + sizeof(struct bfhead), 0x55, + (MemSize) (b->bh.bsize - sizeof(struct bfhead))); +#endif + ASSERT(bn->bh.bsize < 0); + + /* The next buffer is allocated. Set the backpointer in it to point + to this buffer; the previous free buffer in memory. */ + + bn->bh.prevfree = b->bh.bsize; + +#ifdef BECtl + + /* If a block-release function is defined, and this free buffer + constitutes the entire block, release it. Note that pool_len + is defined in such a way that the test will fail unless all + pool blocks are the same size. */ + + if (relfcn != NULL && + ((bufsize) b->bh.bsize) == (pool_len - sizeof(struct bhead))) { + + ASSERT(b->bh.prevfree == 0); + ASSERT(BH((char *) b + b->bh.bsize)->bsize == ESent); + ASSERT(BH((char *) b + b->bh.bsize)->prevfree == b->bh.bsize); + /* Unlink the buffer from the free list */ + b->ql.blink->ql.flink = b->ql.flink; + b->ql.flink->ql.blink = b->ql.blink; + + (*relfcn)(b); +#ifdef BufStats + numprel++; /* Nr of expansion block releases */ + numpblk--; /* Total number of blocks */ + ASSERT(numpblk == numpget - numprel); +#endif /* BufStats */ + } +#endif /* BECtl */ +} + +#ifdef BECtl + +/* BECTL -- Establish automatic pool expansion control */ + +void bectl( + int (*compact) _((bufsize sizereq, int sequence)), + void *(*acquire) _((bufsize size)), + void (*release) _((void *buf)), + bufsize pool_incr) +{ + compfcn = compact; + acqfcn = acquire; + relfcn = release; + exp_incr = pool_incr; +} +#endif + +/* BPOOL -- Add a region of memory to the buffer pool. */ + +void bpool( + void *buf, + bufsize len) +{ + struct bfhead *b = BFH(buf); + struct bhead *bn; + +#ifdef SizeQuant + len &= ~(SizeQuant - 1); +#endif +#ifdef BECtl + if (pool_len == 0) { + pool_len = len; + } else if (len != pool_len) { + pool_len = -1; + } +#ifdef BufStats + numpget++; /* Number of block acquisitions */ + numpblk++; /* Number of blocks total */ + ASSERT(numpblk == numpget - numprel); +#endif /* BufStats */ +#endif /* BECtl */ + + /* Since the block is initially occupied by a single free buffer, + it had better not be (much) larger than the largest buffer + whose size we can store in bhead.bsize. */ + + ASSERT(len - sizeof(struct bhead) <= -((bufsize) ESent + 1)); + + /* Clear the backpointer at the start of the block to indicate that + there is no free block prior to this one. That blocks + recombination when the first block in memory is released. */ + + b->bh.prevfree = 0; + + /* Chain the new block to the free list. */ + + ASSERT(freelist.ql.blink->ql.flink == &freelist); + ASSERT(freelist.ql.flink->ql.blink == &freelist); + b->ql.flink = &freelist; + b->ql.blink = freelist.ql.blink; + freelist.ql.blink = b; + b->ql.blink->ql.flink = b; + + /* Create a dummy allocated buffer at the end of the pool. This dummy + buffer is seen when a buffer at the end of the pool is released and + blocks recombination of the last buffer with the dummy buffer at + the end. The length in the dummy buffer is set to the largest + negative number to denote the end of the pool for diagnostic + routines (this specific value is not counted on by the actual + allocation and release functions). */ + + len -= sizeof(struct bhead); + b->bh.bsize = (bufsize) len; +#ifdef FreeWipe + V memset(((char *) b) + sizeof(struct bfhead), 0x55, + (MemSize) (len - sizeof(struct bfhead))); +#endif + bn = BH(((char *) b) + len); + bn->prevfree = (bufsize) len; + /* Definition of ESent assumes two's complement! */ + ASSERT((~0) == -1); + bn->bsize = ESent; +} + +#ifdef BufStats + +/* BSTATS -- Return buffer allocation free space statistics. */ + +void bstats( + bufsize *curalloc, bufsize *totfree, bufsize *maxfree, + long *nget, long *nrel) +{ + struct bfhead *b = freelist.ql.flink; + + *nget = numget; + *nrel = numrel; + *curalloc = totalloc; + *totfree = 0; + *maxfree = -1; + while (b != &freelist) { + ASSERT(b->bh.bsize > 0); + *totfree += b->bh.bsize; + if (b->bh.bsize > *maxfree) { + *maxfree = b->bh.bsize; + } + b = b->ql.flink; /* Link to next buffer */ + } +} + +#ifdef BECtl + +/* BSTATSE -- Return extended statistics */ + +void bstatse( + bufsize *pool_incr, + long *npool, long *npget, long *nprel, long *ndget, long *ndrel) +{ + *pool_incr = (pool_len < 0) ? -exp_incr : exp_incr; + *npool = numpblk; + *npget = numpget; + *nprel = numprel; + *ndget = numdget; + *ndrel = numdrel; +} +#endif /* BECtl */ +#endif /* BufStats */ + +#ifdef DumpData + +/* BUFDUMP -- Dump the data in a buffer. This is called with the user + data pointer, and backs up to the buffer header. It will + dump either a free block or an allocated one. */ + +void bufdump( + void *buf) +{ + struct bfhead *b; + unsigned char *bdump; + bufsize bdlen; + + b = BFH(((char *) buf) - sizeof(struct bhead)); + ASSERT(b->bh.bsize != 0); + if (b->bh.bsize < 0) { + bdump = (unsigned char *) buf; + bdlen = (-b->bh.bsize) - sizeof(struct bhead); + } else { + bdump = (unsigned char *) (((char *) b) + sizeof(struct bfhead)); + bdlen = b->bh.bsize - sizeof(struct bfhead); + } + + while (bdlen > 0) { + int i, dupes = 0; + bufsize l = bdlen; + char bhex[50], bascii[20]; + + if (l > 16) { + l = 16; + } + + for (i = 0; i < l; i++) { + V sprintf(bhex + i * 3, "%02X ", bdump[i]); + bascii[i] = isprint(bdump[i]) ? bdump[i] : ' '; + } + bascii[i] = 0; + V printf("%-48s %s\n", bhex, bascii); + bdump += l; + bdlen -= l; + while ((bdlen > 16) && (memcmp((char *) (bdump - 16), + (char *) bdump, 16) == 0)) { + dupes++; + bdump += 16; + bdlen -= 16; + } + if (dupes > 1) { + V printf( + " (%d lines [%d bytes] identical to above line skipped)\n", + dupes, dupes * 16); + } else if (dupes == 1) { + bdump -= 16; + bdlen += 16; + } + } +} +#endif + +#ifdef BufDump + +/* BPOOLD -- Dump a buffer pool. The buffer headers are always listed. + If DUMPALLOC is nonzero, the contents of allocated buffers + are dumped. If DUMPFREE is nonzero, free blocks are + dumped as well. If FreeWipe checking is enabled, free + blocks which have been clobbered will always be dumped. */ + +void bpoold( + void *buf, + int dumpalloc, int dumpfree) +{ + struct bfhead *b = BFH(buf); + + while (b->bh.bsize != ESent) { + bufsize bs = b->bh.bsize; + + if (bs < 0) { + bs = -bs; + V printf("Allocated buffer: size %6ld bytes.\n", (long) bs); + if (dumpalloc) { + bufdump((void *) (((char *) b) + sizeof(struct bhead))); + } + } else { + char *lerr = ""; + + ASSERT(bs > 0); + if ((b->ql.blink->ql.flink != b) || + (b->ql.flink->ql.blink != b)) { + lerr = " (Bad free list links)"; + } + V printf("Free block: size %6ld bytes.%s\n", + (long) bs, lerr); +#ifdef FreeWipe + lerr = ((char *) b) + sizeof(struct bfhead); + if ((bs > sizeof(struct bfhead)) && ((*lerr != 0x55) || + (memcmp(lerr, lerr + 1, + (MemSize) (bs - (sizeof(struct bfhead) + 1))) != 0))) { + V printf( + "(Contents of above free block have been overstored.)\n"); + bufdump((void *) (((char *) b) + sizeof(struct bhead))); + } else +#endif + if (dumpfree) { + bufdump((void *) (((char *) b) + sizeof(struct bhead))); + } + } + b = BFH(((char *) b) + bs); + } +} +#endif /* BufDump */ + +#ifdef BufValid + +/* BPOOLV -- Validate a buffer pool. If NDEBUG isn't defined, + any error generates an assertion failure. */ + +int bpoolv( + void *buf) +{ + struct bfhead *b = BFH(buf); + + while (b->bh.bsize != ESent) { + bufsize bs = b->bh.bsize; + + if (bs < 0) { + bs = -bs; + } else { + char *lerr = ""; + + ASSERT(bs > 0); + if (bs <= 0) { + return 0; + } + if ((b->ql.blink->ql.flink != b) || + (b->ql.flink->ql.blink != b)) { + V printf("Free block: size %6ld bytes. (Bad free list links)\n", + (long) bs); + ASSERT(0); + return 0; + } +#ifdef FreeWipe + lerr = ((char *) b) + sizeof(struct bfhead); + if ((bs > sizeof(struct bfhead)) && ((*lerr != 0x55) || + (memcmp(lerr, lerr + 1, + (MemSize) (bs - (sizeof(struct bfhead) + 1))) != 0))) { + V printf( + "(Contents of above free block have been overstored.)\n"); + bufdump((void *) (((char *) b) + sizeof(struct bhead))); + ASSERT(0); + return 0; + } +#endif + } + b = BFH(((char *) b) + bs); + } + return 1; +} +#endif /* BufValid */ + + /***********************\ + * * + * Built-in test program * + * * + \***********************/ + +#ifdef TestProg + +#define Repeatable 1 /* Repeatable pseudorandom sequence */ + /* If Repeatable is not defined, a + time-seeded pseudorandom sequence + is generated, exercising BGET with + a different pattern of calls on each + run. */ +#define OUR_RAND /* Use our own built-in version of + rand() to guarantee the test is + 100% repeatable. */ + +#ifdef BECtl +#define PoolSize 300000 /* Test buffer pool size */ +#else +#define PoolSize 50000 /* Test buffer pool size */ +#endif +#define ExpIncr 32768 /* Test expansion block size */ +#define CompactTries 10 /* Maximum tries at compacting */ + +#define dumpAlloc 0 /* Dump allocated buffers ? */ +#define dumpFree 0 /* Dump free buffers ? */ + +#ifndef Repeatable +extern long time(); +#endif + +extern char *malloc(); +extern int free _((char *)); + +static char *bchain = NULL; /* Our private buffer chain */ +static char *bp = NULL; /* Our initial buffer pool */ + +#include + +#ifdef OUR_RAND + +static unsigned long int next = 1; + +/* Return next random integer */ + +int rand() +{ + next = next * 1103515245L + 12345; + return (unsigned int) (next / 65536L) % 32768L; +} + +/* Set seed for random generator */ + +void srand(seed) + unsigned int seed; +{ + next = seed; +} +#endif + +/* STATS -- Edit statistics returned by bstats() or bstatse(). */ + +static void stats(when) + char *when; +{ + bufsize cural, totfree, maxfree; + long nget, nfree; +#ifdef BECtl + bufsize pincr; + long totblocks, npget, nprel, ndget, ndrel; +#endif + + bstats(&cural, &totfree, &maxfree, &nget, &nfree); + V printf( + "%s: %ld gets, %ld releases. %ld in use, %ld free, largest = %ld\n", + when, nget, nfree, (long) cural, (long) totfree, (long) maxfree); +#ifdef BECtl + bstatse(&pincr, &totblocks, &npget, &nprel, &ndget, &ndrel); + V printf( + " Blocks: size = %ld, %ld (%ld bytes) in use, %ld gets, %ld frees\n", + (long)pincr, totblocks, pincr * totblocks, npget, nprel); + V printf(" %ld direct gets, %ld direct frees\n", ndget, ndrel); +#endif /* BECtl */ +} + +#ifdef BECtl +static int protect = 0; /* Disable compaction during bgetr() */ + +/* BCOMPACT -- Compaction call-back function. */ + +static int bcompact(bsize, seq) + bufsize bsize; + int seq; +{ +#ifdef CompactTries + char *bc = bchain; + int i = rand() & 0x3; + +#ifdef COMPACTRACE + V printf("Compaction requested. %ld bytes needed, sequence %d.\n", + (long) bsize, seq); +#endif + + if (protect || (seq > CompactTries)) { +#ifdef COMPACTRACE + V printf("Compaction gave up.\n"); +#endif + return 0; + } + + /* Based on a random cast, release a random buffer in the list + of allocated buffers. */ + + while (i > 0 && bc != NULL) { + bc = *((char **) bc); + i--; + } + if (bc != NULL) { + char *fb; + + fb = *((char **) bc); + if (fb != NULL) { + *((char **) bc) = *((char **) fb); + brel((void *) fb); + return 1; + } + } + +#ifdef COMPACTRACE + V printf("Compaction bailed out.\n"); +#endif +#endif /* CompactTries */ + return 0; +} + +/* BEXPAND -- Expand pool call-back function. */ + +static void *bexpand(size) + bufsize size; +{ + void *np = NULL; + bufsize cural, totfree, maxfree; + long nget, nfree; + + /* Don't expand beyond the total allocated size given by PoolSize. */ + + bstats(&cural, &totfree, &maxfree, &nget, &nfree); + + if (cural < PoolSize) { + np = (void *) malloc((unsigned) size); + } +#ifdef EXPTRACE + V printf("Expand pool by %ld -- %s.\n", (long) size, + np == NULL ? "failed" : "succeeded"); +#endif + return np; +} + +/* BSHRINK -- Shrink buffer pool call-back function. */ + +static void bshrink(buf) + void *buf; +{ + if (((char *) buf) == bp) { +#ifdef EXPTRACE + V printf("Initial pool released.\n"); +#endif + bp = NULL; + } +#ifdef EXPTRACE + V printf("Shrink pool.\n"); +#endif + free((char *) buf); +} + +#endif /* BECtl */ + +/* Restrict buffer requests to those large enough to contain our pointer and + small enough for the CPU architecture. */ + +static bufsize blimit(bs) + bufsize bs; +{ + if (bs < sizeof(char *)) { + bs = sizeof(char *); + } + + /* This is written out in this ugly fashion because the + cool expression in sizeof(int) that auto-configured + to any length int befuddled some compilers. */ + + if (sizeof(int) == 2) { + if (bs > 32767) { + bs = 32767; + } + } else { + if (bs > 200000) { + bs = 200000; + } + } + return bs; +} + +int main() +{ + int i; + double x; + + /* Seed the random number generator. If Repeatable is defined, we + always use the same seed. Otherwise, we seed from the clock to + shake things up from run to run. */ + +#ifdef Repeatable + V srand(1234); +#else + V srand((int) time((long *) NULL)); +#endif + + /* Compute x such that pow(x, p) ranges between 1 and 4*ExpIncr as + p ranges from 0 to ExpIncr-1, with a concentration in the lower + numbers. */ + + x = 4.0 * ExpIncr; + x = log(x); + x = exp(log(4.0 * ExpIncr) / (ExpIncr - 1.0)); + +#ifdef BECtl + bectl(bcompact, bexpand, bshrink, (bufsize) ExpIncr); + bp = malloc(ExpIncr); + ASSERT(bp != NULL); + bpool((void *) bp, (bufsize) ExpIncr); +#else + bp = malloc(PoolSize); + ASSERT(bp != NULL); + bpool((void *) bp, (bufsize) PoolSize); +#endif + + stats("Create pool"); + V bpoolv((void *) bp); + bpoold((void *) bp, dumpAlloc, dumpFree); + + for (i = 0; i < TestProg; i++) { + char *cb; + bufsize bs = pow(x, (double) (rand() & (ExpIncr - 1))); + + ASSERT(bs <= (((bufsize) 4) * ExpIncr)); + bs = blimit(bs); + if (rand() & 0x400) { + cb = (char *) bgetz(bs); + } else { + cb = (char *) bget(bs); + } + if (cb == NULL) { +#ifdef EasyOut + break; +#else + char *bc = bchain; + + if (bc != NULL) { + char *fb; + + fb = *((char **) bc); + if (fb != NULL) { + *((char **) bc) = *((char **) fb); + brel((void *) fb); + } + continue; + } +#endif + } + *((char **) cb) = (char *) bchain; + bchain = cb; + + /* Based on a random cast, release a random buffer in the list + of allocated buffers. */ + + if ((rand() & 0x10) == 0) { + char *bc = bchain; + int i = rand() & 0x3; + + while (i > 0 && bc != NULL) { + bc = *((char **) bc); + i--; + } + if (bc != NULL) { + char *fb; + + fb = *((char **) bc); + if (fb != NULL) { + *((char **) bc) = *((char **) fb); + brel((void *) fb); + } + } + } + + /* Based on a random cast, reallocate a random buffer in the list + to a random size */ + + if ((rand() & 0x20) == 0) { + char *bc = bchain; + int i = rand() & 0x3; + + while (i > 0 && bc != NULL) { + bc = *((char **) bc); + i--; + } + if (bc != NULL) { + char *fb; + + fb = *((char **) bc); + if (fb != NULL) { + char *newb; + + bs = pow(x, (double) (rand() & (ExpIncr - 1))); + bs = blimit(bs); +#ifdef BECtl + protect = 1; /* Protect against compaction */ +#endif + newb = (char *) bgetr((void *) fb, bs); +#ifdef BECtl + protect = 0; +#endif + if (newb != NULL) { + *((char **) bc) = newb; + } + } + } + } + } + stats("\nAfter allocation"); + if (bp != NULL) { + V bpoolv((void *) bp); + bpoold((void *) bp, dumpAlloc, dumpFree); + } + + while (bchain != NULL) { + char *buf = bchain; + + bchain = *((char **) buf); + brel((void *) buf); + } + stats("\nAfter release"); +#ifndef BECtl + if (bp != NULL) { + V bpoolv((void *) bp); + bpoold((void *) bp, dumpAlloc, dumpFree); + } +#endif + + return 0; +} +#endif diff --git a/third_party/bget/bget.h b/third_party/bget/bget.h new file mode 100644 index 0000000..0415668 --- /dev/null +++ b/third_party/bget/bget.h @@ -0,0 +1,36 @@ +/* + + Interface definitions for bget.c, the memory management package. + +*/ + +#define PROTOTYPES + +#ifndef _ +#ifdef PROTOTYPES +#define _(x) x /* If compiler knows prototypes */ +#else +#define _(x) () /* It it doesn't */ +#endif /* PROTOTYPES */ +#endif + +#if !defined NULL + #define NULL ((void *) 0) +#endif + +typedef long bufsize; +void bpool _((void *buffer, bufsize len)); +void *bget _((bufsize size)); +void *bgetz _((bufsize size)); +void *bgetr _((void *buffer, bufsize newsize)); +void brel _((void *buf)); +void bectl _((int (*compact)(bufsize sizereq, int sequence), + void *(*acquire)(bufsize size), + void (*release)(void *buf), bufsize pool_incr)); +void bstats _((bufsize *curalloc, bufsize *totfree, bufsize *maxfree, + long *nget, long *nrel)); +void bstatse _((bufsize *pool_incr, long *npool, long *npget, + long *nprel, long *ndget, long *ndrel)); +void bufdump _((void *buf)); +void bpoold _((void *pool, int dumpalloc, int dumpfree)); +int bpoolv _((void *pool)); diff --git a/third_party/exosite/LICENSE b/third_party/exosite/LICENSE new file mode 100644 index 0000000..0b988d7 --- /dev/null +++ b/third_party/exosite/LICENSE @@ -0,0 +1,26 @@ +Copyright (c) 2013, Exosite LLC +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Exosite LLC nor the names of its contributors may + be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/third_party/exosite/exosite.c b/third_party/exosite/exosite.c new file mode 100644 index 0000000..9c0e7a9 --- /dev/null +++ b/third_party/exosite/exosite.c @@ -0,0 +1,839 @@ +/***************************************************************************** +* +* exosite.c - Exosite cloud communications. +* Copyright (c) 2013, Exosite LLC +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* * Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of Exosite LLC nor the names of its contributors may +* be used to endorse or promote products derived from this software +* without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +*****************************************************************************/ + +#include "drivers/exosite_hal_lwip.h" +#include "exosite_meta.h" + +#include +//#include +#include "exosite.h" +//#include + +#include "utils/ustdlib.h" + +// ITOA added by Tiva C group. This C library function may not exist in our standard +// development environment for every toolchain. +#define itoa(number, string, base) \ + do \ + { \ + usprintf(string, "%d", number); \ + } \ + while(0) + + +//local defines +#define EXOSITE_MAX_CONNECT_RETRY_COUNT 5 +#define EXOSITE_LENGTH EXOSITE_SN_MAXLENGTH + EXOSITE_MODEL_MAXLENGTH + EXOSITE_VENDOR_MAXLENGTH +#define RX_SIZE 50 +#define CIK_LENGTH 40 +#define MAC_LEN 6 +char exosite_provision_info[EXOSITE_LENGTH]; + +enum lineTypes +{ + CIK_LINE, + HOST_LINE, + CONTENT_LINE, + ACCEPT_LINE, + LENGTH_LINE, + GETDATA_LINE, + POSTDATA_LINE, + EMPTY_LINE +}; + +#define STR_CIK_HEADER "X-Exosite-CIK: " +#define STR_CONTENT_LENGTH "Content-Length: " +#define STR_GET_URL "GET /onep:v1/stack/alias?" +#define STR_HTTP " HTTP/1.1\r\n" +#define STR_HOST "Host: m2.exosite.com\r\n" +#define STR_ACCEPT "Accept: application/x-www-form-urlencoded; charset=utf-8\r\n" +#define STR_CONTENT "Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n" +#define STR_VENDOR "vendor=" +#define STR_MODEL "model=" +#define STR_SN "sn=" +#define STR_CRLF "\r\n" + +// local functions +int info_assemble(const char * vendor, const char *model, const char *sn); +int init_UUID(unsigned char if_nbr); +void update_m2ip(void); +int get_http_status(long socket); +long connect_to_exosite(); +void sendLine(long socket, unsigned char LINE, const char * payload); + +// global functions +int Exosite_Write(char * pbuf, unsigned int bufsize); +int Exosite_Read(char * palias, char * pbuf, unsigned int buflen); +int Exosite_Init(const char *vendor, const char *model, const unsigned char if_nbr, int reset); +int Exosite_Activate(void); +void Exosite_SetCIK(char * pCIK); +int Exosite_GetCIK(char * pCIK); +int Exosite_StatusCode(void); + +// externs +//extern char *itoa(int n, char *s, int b); + +// global variables +static int status_code = 0; +static int exosite_initialized = 0; + + +/***************************************************************************** +* +* info_assemble +* +* \param char * vendor, custom's vendor name +* char * model, custom's model name +* +* \return string length of assembly customize's vendor information +* +* \brief Initializes the customer's vendor and model name for +* provisioning +* +*****************************************************************************/ +int +info_assemble(const char * vendor, const char *model, const char *sn) +{ + int info_len = 0; + int assemble_len = 0; + char * vendor_info = exosite_provision_info; + + // verify the assembly length + assemble_len = strlen(STR_VENDOR) + strlen(vendor) + + strlen(STR_MODEL) + strlen(model) + + strlen(STR_SN) + 3; + if (assemble_len > 95) + return info_len; + + // vendor= + memcpy(vendor_info, STR_VENDOR, strlen(STR_VENDOR)); + info_len = strlen(STR_VENDOR); + + // vendor="custom's vendor" + memcpy(&vendor_info[info_len], vendor, strlen(vendor)); + info_len += strlen(vendor); + + // vendor="custom's vendor"& + vendor_info[info_len] = '&'; // & + info_len += 1; + + // vendor="custom's vendor"&model= + memcpy(&vendor_info[info_len], STR_MODEL, strlen(STR_MODEL)); + info_len += strlen(STR_MODEL); + + // vendor="custom's vendor"&model="custom's model" + memcpy(&vendor_info[info_len], model, strlen(model)); + info_len += strlen(model); + + // vendor="custom's vendor"&model="custom's model"& + vendor_info[info_len] = '&'; // & + info_len += 1; + + // vendor="custom's vendor"&model="custom's model"&sn= + memcpy(&vendor_info[info_len], STR_SN, strlen(STR_SN)); + info_len += strlen(STR_SN); + + // vendor="custom's vendor"&model="custom's model"&sn="device's sn" + memcpy(&vendor_info[info_len], sn, strlen(sn)); + info_len += strlen(sn); + + vendor_info[info_len] = 0; + + return info_len; +} + +/***************************************************************************** +* +* Exosite_StatusCode +* +* \param None +* +* \return 1 success; 0 failure +* +* \brief Provides feedback from Exosite status codes +* +*****************************************************************************/ +int +Exosite_StatusCode(void) +{ + return status_code; +} + +/***************************************************************************** +* +* Exosite_Init +* +* \param char * vendor - vendor name +* char * model - model name +* char if_nbr - network interface +* int reset - reset the settings to Exosite default +* +* \return 1 success; 0 failure +* +* \brief Initializes the Exosite meta structure, UUID and +* provision information +* +*****************************************************************************/ +int +Exosite_Init(const char *vendor, const char *model, const unsigned char if_nbr, int reset) +{ + char struuid[EXOSITE_SN_MAXLENGTH]; + unsigned char uuid_len = 0; + + exosite_meta_init(reset); //always initialize Exosite meta structure + uuid_len = exoHAL_ReadUUID(if_nbr, (unsigned char *)struuid); + + if (0 == uuid_len) + { + status_code = EXO_STATUS_BAD_UUID; + return 0; + } + if (strlen(vendor) > EXOSITE_VENDOR_MAXLENGTH) + { + status_code = EXO_STATUS_BAD_VENDOR; + return 0; + } + if (strlen(model) > EXOSITE_MODEL_MAXLENGTH) + { + status_code = EXO_STATUS_BAD_MODEL; + return 0; + } + + exosite_meta_write((unsigned char *)struuid, uuid_len, META_UUID); + + // read UUID into 'sn' + info_assemble(vendor, model, struuid); + + exosite_initialized = 1; + + status_code = EXO_STATUS_OK; + + return 1; +} + + +/***************************************************************************** +* +* Exosite_Activate +* +* \param None +* +* \return 1 - activation success +* 0 - activation failure +* +* \brief Called after Init has been run in the past, but maybe comms were +* down and we have to keep trying +* +*****************************************************************************/ +int +Exosite_Activate(void) +{ + int length; + char strLen[5]; + // char cmp_ss[18] = "Content-Length: 40"; + char *cmp_ss = "Content-Length: 40"; + char *cmp = cmp_ss; + int newcik = 0; + int http_status = 0; + + if (!exosite_initialized) { + status_code = EXO_STATUS_INIT; + return newcik; + } + update_m2ip(); //check our IP api to see if the old IP is advertising a new one + + long sock = connect_to_exosite(); + if (sock < 0) { + status_code = EXO_STATUS_BAD_TCP; + return 0; + } + + // Get activation Serial Number + length = strlen(exosite_provision_info); + itoa(length, strLen, 10); //make a string for length + + sendLine(sock, POSTDATA_LINE, "/provision/activate"); + sendLine(sock, HOST_LINE, NULL); + sendLine(sock, CONTENT_LINE, NULL); + sendLine(sock, LENGTH_LINE, strLen); + + exoHAL_SocketSend(sock, exosite_provision_info, length); + + http_status = get_http_status(sock); + + if (200 == http_status) + { + char strBuf[RX_SIZE]; + unsigned char strLen, len; + unsigned char cik_len_valid = 0; + char *p; + unsigned char crlf = 0; + unsigned char ciklen = 0; + char NCIK[CIK_LENGTH + 1]; + + do + { + strLen = exoHAL_SocketRecv(sock, strBuf, RX_SIZE); + len = strLen; + p = strBuf; + + // Find 4 consecutive \r or \n - should be: \r\n\r\n + while (0 < len && 4 > crlf) + { + if ('\r' == *p || '\n' == *p) + { + ++crlf; + } + else + { + crlf = 0; + if (*cmp == *p) + { + // check the cik length from http response + cmp++; + if (cmp > cmp_ss + strlen(cmp_ss) - 1) + cik_len_valid = 1; + } + else + cmp = cmp_ss; + } + ++p; + --len; + } + + // The body is the cik + if (0 < len && 4 == crlf && CIK_LENGTH > ciklen) + { + // TODO, be more robust - match Content-Length header value to CIK_LENGTH + unsigned char need, part; + if (!(cik_len_valid == 1)) // cik length != 40 + { + status_code = EXO_STATUS_CONFLICT; + exoHAL_SocketClose(sock); + return newcik; + } + need = CIK_LENGTH - ciklen; + part = need < len ? need : len; + strncpy(NCIK + ciklen, p, part); + ciklen += part; + } + } while (RX_SIZE == strLen); + + if (CIK_LENGTH == ciklen) + { + NCIK[40] = 0; + Exosite_SetCIK(NCIK); + newcik = 1; + } + } + + exoHAL_SocketClose(sock); + + if (200 == http_status) + status_code = EXO_STATUS_OK; + if (404 == http_status) + status_code = EXO_STATUS_BAD_SN; + if (409 == http_status || 408 == http_status) + { + status_code = EXO_STATUS_CONFLICT; + } + + return newcik; +} + + +/***************************************************************************** +* +* Exosite_SetCIK +* +* \param pointer to CIK +* +* \return None +* +* \brief Programs a new CIK to flash / non volatile +* +*****************************************************************************/ +void +Exosite_SetCIK(char * pCIK) +{ + if (!exosite_initialized) { + status_code = EXO_STATUS_INIT; + return; + } + exosite_meta_write((unsigned char *)pCIK, CIK_LENGTH, META_CIK); + status_code = EXO_STATUS_OK; + return; +} + + +/***************************************************************************** +* +* Exosite_GetCIK +* +* \param pointer to buffer to receive CIK or NULL +* +* \return 1 - CIK was valid, 0 - CIK was invalid. +* +* \brief Retrieves a CIK from flash / non volatile and verifies the CIK +* format is valid +* +*****************************************************************************/ +int +Exosite_GetCIK(char * pCIK) +{ + unsigned char i; + char tempCIK[CIK_LENGTH + 1]; + + exosite_meta_read((unsigned char *)tempCIK, CIK_LENGTH, META_CIK); + tempCIK[CIK_LENGTH] = 0; + + for (i = 0; i < CIK_LENGTH; i++) + { + if (!(tempCIK[i] >= 'a' && tempCIK[i] <= 'f' || tempCIK[i] >= '0' && tempCIK[i] <= '9')) + { + status_code = EXO_STATUS_BAD_CIK; + return 0; + } + } + + if (NULL != pCIK) + memcpy(pCIK ,tempCIK ,CIK_LENGTH + 1); + + return 1; +} + + +/***************************************************************************** +* +* Exosite_Write +* +* \param pbuf - string buffer containing data to be sent +* bufsize - number of bytes to send +* +* \return 1 success; 0 failure +* +* \brief Writes data to Exosite cloud +* +*****************************************************************************/ +int +Exosite_Write(char * pbuf, unsigned int bufsize) +{ + int success = 0; + int http_status = 0; + char bufCIK[41]; + char strBuf[10]; + + if (!exosite_initialized) { + status_code = EXO_STATUS_INIT; + return success; + } + + if (!Exosite_GetCIK(bufCIK)) + { + return success; + } + + + long sock = connect_to_exosite(); + if (sock < 0) { + status_code = EXO_STATUS_BAD_TCP; + return 0; + } + + +// This is an example write POST... +// s.send('POST /onep:v1/stack/alias HTTP/1.1\r\n') +// s.send('Host: m2.exosite.com\r\n') +// s.send('X-Exosite-CIK: 5046454a9a1666c3acfae63bc854ec1367167815\r\n') +// s.send('Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n') +// s.send('Content-Length: 6\r\n\r\n') +// s.send('temp=2') + + itoa((int)bufsize, strBuf, 10); //make a string for length + + sendLine(sock, POSTDATA_LINE, "/onep:v1/stack/alias"); + sendLine(sock, HOST_LINE, NULL); + sendLine(sock, CIK_LINE, bufCIK); + sendLine(sock, CONTENT_LINE, NULL); + sendLine(sock, LENGTH_LINE, strBuf); + exoHAL_SocketSend(sock, pbuf, bufsize); + + http_status = get_http_status(sock); + + exoHAL_SocketClose(sock); + + if (401 == http_status) + { + status_code = EXO_STATUS_NOAUTH; + } + if (204 == http_status) + { + success = 1; + status_code = EXO_STATUS_OK; + } + + return success; +} + + +/***************************************************************************** +* +* Exosite_Read +* +* \param palias - string, name of the datasource alias to read from +* pbuf - read buffer to put the read response into +* buflen - size of the input buffer +* +* \return number of bytes read +* +* \brief Reads data from Exosite cloud +* +*****************************************************************************/ +int +Exosite_Read(char * palias, char * pbuf, unsigned int buflen) +{ + // + // Modified by Texas Instruments, DGT, changed buflen from unsigned char to + // unsigned int. comment out declaration of *pcheck to prevent warnings + // created by CAJ changes below. + // + int success = 0; + int http_status = 0; + char bufCIK[41]; + unsigned char strLen, len, vlen; + char *p; + //char *pcheck; + + if (!exosite_initialized) { + status_code = EXO_STATUS_INIT; + return success; + } + + if (!Exosite_GetCIK(bufCIK)) + { + return success; + } + + + long sock = connect_to_exosite(); + if (sock < 0) { + status_code = EXO_STATUS_BAD_TCP; + return 0; + } + +// This is an example read GET +// s.send('GET /onep:v1/stack/alias?temp HTTP/1.1\r\n') +// s.send('Host: m2.exosite.com\r\n') +// s.send('X-Exosite-CIK: 5046454a9a1666c3acfae63bc854ec1367167815\r\n') +// s.send('Accept: application/x-www-form-urlencoded; charset=utf-8\r\n\r\n') + + sendLine(sock, GETDATA_LINE, palias); + sendLine(sock, HOST_LINE, NULL); + sendLine(sock, CIK_LINE, bufCIK); + sendLine(sock, ACCEPT_LINE, "\r\n"); + + // + // Modified by Texas Instruments DGT comment reference to pcheck no longer + // used. See TI CAJ modification below. + // + //pcheck = palias; + vlen = 0; + + http_status = get_http_status(sock); + if (200 == http_status) + { + char strBuf[RX_SIZE]; + unsigned char crlf = 0; + + do + { + strLen = exoHAL_SocketRecv(sock, strBuf, RX_SIZE); + len = strLen; + p = strBuf; + + // Find 4 consecutive \r or \n - should be: \r\n\r\n + while (0 < len && 4 > crlf) + { + if ('\r' == *p || '\n' == *p) + { + ++crlf; + } + else + { + crlf = 0; + } + ++p; + --len; + } + + // The body is "=" + if (0 < len && 4 == crlf && buflen > vlen) + { + + // Code below removed by CAJ. Removing the key works for a single + // READ request, but doesn't work if multiple values were requested. + // For multiple values, the server is not guaranteed to return every + // value in the same order that they were sent. This means that the + // caller will need the "key" to be able to determine which value + // belongs with which alias. + + // Move past "" +// while (0 < len && 0 != *pcheck) +// { +// if (*pcheck == *p) +// { +// ++pcheck; +// } +// else +// { +// pcheck = palias; +// } +// ++p; +// --len; +// } +// +// // Match '=', we should now have '=' +// if (0 < len && 0 == *pcheck && '=' == *p) +// { +// ++p; +// --len; +// } +// + // read in the rest of the body as the value + while (0 < len && buflen > vlen) + { + pbuf[vlen++] = *p++; + --len; + } + } + } while (RX_SIZE == strLen); + } + + exoHAL_SocketClose(sock); + + if (200 == http_status) + { + status_code = EXO_STATUS_OK; + } + if (204 == http_status) + { + status_code = EXO_STATUS_OK; + } + if (401 == http_status) + { + status_code = EXO_STATUS_NOAUTH; + } + + return vlen; +} + + +/***************************************************************************** +* +* update_m2ip +* +* \param None +* +* \return None +* +* \brief Checks /ip API to see if a new server IP address should be used +* +*****************************************************************************/ +void +update_m2ip(void) +{ + //TODO - stubbed out + return; +} + +/***************************************************************************** +* +* connect_to_exosite +* +* \param None +* +* \return success: socket handle; failure: -1; +* +* \brief Establishes a connection with Exosite API server +* +*****************************************************************************/ +long +connect_to_exosite(void) +{ + unsigned char connectRetries = 0; + unsigned char server[META_SERVER_SIZE]; + long sock = -1; + + exosite_meta_read(server, META_SERVER_SIZE, META_SERVER); + + while (connectRetries++ <= EXOSITE_MAX_CONNECT_RETRY_COUNT) { + + sock = exoHAL_SocketOpenTCP(server); + + if (sock == -1) + { + continue; + } + + if (exoHAL_ServerConnect(sock) < 0) // Try to connect + { + // TODO - the typical reason the connect doesn't work is because + // something was wrong in the way the comms hardware was initialized (timing, bit + // error, etc...). There may be a graceful way to kick the hardware + // back into gear at the right state, but for now, we just + // return and let the caller retry us if they want + continue; + } else { + connectRetries = 0; + break; + } + } + + // Success + return sock; +} + + +/***************************************************************************** +* +* get_http_status +* +* \param socket handle, pointer to expected HTTP response code +* +* \return http response code, 0 tcp failure +* +* \brief Reads first 12 bytes of HTTP response and extracts the 3 byte code +* +*****************************************************************************/ +int +get_http_status(long socket) +{ + char rxBuf[12]; + int rxLen = 0; + int code = 0; + + rxLen = exoHAL_SocketRecv(socket, rxBuf, 12); + + if (12 == rxLen) + { + // exampel '4','0','4' => 404 (as number) + code = (((rxBuf[9] - 0x30) * 100) + + ((rxBuf[10] - 0x30) * 10) + + (rxBuf[11] - 0x30)); + return code; + } + return 0; +} + + +/***************************************************************************** +* +* sendLine +* +* \param Which line type +* +* \return socket handle +* +* \brief Sends data out +* +*****************************************************************************/ +void +sendLine(long socket, unsigned char LINE, const char * payload) +{ + char strBuf[70]; + unsigned char strLen; + + switch(LINE) { + case CIK_LINE: + strLen = strlen(STR_CIK_HEADER); + memcpy(strBuf,STR_CIK_HEADER,strLen); + memcpy(&strBuf[strLen],payload, strlen(payload)); + strLen += strlen(payload); + memcpy(&strBuf[strLen],STR_CRLF, 2); + strLen += strlen(STR_CRLF); + break; + case HOST_LINE: + strLen = strlen(STR_HOST); + memcpy(strBuf,STR_HOST,strLen); + break; + case CONTENT_LINE: + strLen = strlen(STR_CONTENT); + memcpy(strBuf,STR_CONTENT,strLen); + break; + case ACCEPT_LINE: + strLen = strlen(STR_ACCEPT); + memcpy(strBuf,STR_ACCEPT,strLen); + memcpy(&strBuf[strLen],payload, strlen(payload)); + strLen += strlen(payload); + break; + case LENGTH_LINE: // Content-Length: NN + strLen = strlen(STR_CONTENT_LENGTH); + memcpy(strBuf,STR_CONTENT_LENGTH,strLen); + memcpy(&strBuf[strLen],payload, strlen(payload)); + strLen += strlen(payload); + memcpy(&strBuf[strLen],STR_CRLF, 2); + strLen += 2; + memcpy(&strBuf[strLen],STR_CRLF, 2); + strLen += 2; + break; + case GETDATA_LINE: + strLen = strlen(STR_GET_URL); + memcpy(strBuf,STR_GET_URL,strLen); + memcpy(&strBuf[strLen],payload, strlen(payload)); + strLen += strlen(payload); + memcpy(&strBuf[strLen],STR_HTTP, strlen(STR_HTTP)); + strLen += strlen(STR_HTTP); + break; + case POSTDATA_LINE: + strLen = strlen("POST "); + memcpy(strBuf,"POST ", strLen); + memcpy(&strBuf[strLen],payload, strlen(payload)); + strLen += strlen(payload); + memcpy(&strBuf[strLen],STR_HTTP, strlen(STR_HTTP)); + strLen += strlen(STR_HTTP); + break; + case EMPTY_LINE: + strLen = strlen(STR_CRLF); + memcpy(strBuf,STR_CRLF,strLen); + break; + default: + break; + } + + strBuf[strLen] = 0; + exoHAL_SocketSend(socket, strBuf, strLen); + + return; +} + + + diff --git a/third_party/exosite/exosite.h b/third_party/exosite/exosite.h new file mode 100644 index 0000000..fd08278 --- /dev/null +++ b/third_party/exosite/exosite.h @@ -0,0 +1,82 @@ +/***************************************************************************** +* +* exosite.h - Exosite library interface header +* Copyright (c) 2013, Exosite LLC +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* * Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of Exosite LLC nor the names of its contributors may +* be used to endorse or promote products derived from this software +* without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +*****************************************************************************/ + +#ifndef EXOSITE_H +#define EXOSITE_H + +#include + +// defines +enum UUIDInterfaceTypes +{ + IF_WIFI, + IF_ENET, + IF_FILE, + IF_HDD, + IF_I2C, + IF_GPRS, + IF_NONE +}; + +enum ExositeStatusCodes +{ + EXO_STATUS_OK, + EXO_STATUS_INIT, + EXO_STATUS_BAD_UUID, + EXO_STATUS_BAD_VENDOR, + EXO_STATUS_BAD_MODEL, + EXO_STATUS_BAD_INIT, + EXO_STATUS_BAD_TCP, + EXO_STATUS_BAD_SN, + EXO_STATUS_CONFLICT, + EXO_STATUS_BAD_CIK, + EXO_STATUS_NOAUTH, + EXO_STATUS_END +}; + +#define EXOSITE_VENDOR_MAXLENGTH 20 +#define EXOSITE_MODEL_MAXLENGTH 20 +#define EXOSITE_SN_MAXLENGTH EXOSITE_HAL_SN_MAXLENGTH +#define EXOSITE_DEMO_UPDATE_INTERVAL 4000// ms +#define CIK_LENGTH 40 + +// functions for export +int Exosite_Write(char * pbuf, unsigned int bufsize); +int Exosite_Read(char * palias, char * pbuf, unsigned int buflen); +int Exosite_Init(const char *vendor, const char *model, const unsigned char if_nbr, int reset); +int Exosite_Activate(void); +void Exosite_SetCIK(char * pCIK); +int Exosite_GetCIK(char * pCIK); +int Exosite_StatusCode(void); +int Exosite_GetResponse(void); +#endif + diff --git a/third_party/exosite/exosite_meta.c b/third_party/exosite/exosite_meta.c new file mode 100644 index 0000000..91b7755 --- /dev/null +++ b/third_party/exosite/exosite_meta.c @@ -0,0 +1,189 @@ +/***************************************************************************** +* +* exosite_meta.c - Exosite meta information handler. +* Copyright (c) 2013, Exosite LLC +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* * Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of Exosite LLC nor the names of its contributors may +* be used to endorse or promote products derived from this software +* without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +*****************************************************************************/ + +#include "exosite_meta.h" +#include "drivers/exosite_hal_lwip.h" +#include +//#include + +// external functions +// externs +// local functions +// exported functions +// local defines +// globals + +/***************************************************************************** +* +* exosite_meta_init +* +* \param int reset : 1 - reset meta data +* +* \return None +* +* \brief Does whatever we need to do to initialize the NV meta structure +* +*****************************************************************************/ +void exosite_meta_init(int reset) +{ + char strBuf[META_MARK_SIZE]; + + exoHAL_EnableMeta(); //turn on the necessary hardware / peripherals + + //check our meta mark - if it isn't there, we wipe the meta structure + exosite_meta_read((unsigned char *)strBuf, META_MARK_SIZE, META_MARK); + if (strncmp(strBuf, EXOMARK, META_MARK_SIZE) || reset) + exosite_meta_defaults(); + + return; +} + + +/***************************************************************************** +* +* exosite_meta_defaults +* +* \param None +* +* \return None +* +* \brief Writes default meta values to NV memory. Erases existing meta +* information! +* +*****************************************************************************/ +void exosite_meta_defaults(void) +{ + const unsigned char meta_server_ip[6] = {173,255,209,28,0,80}; + + exoHAL_EraseMeta(); //erase the information currently in meta + exosite_meta_write((unsigned char *)meta_server_ip, 6, META_SERVER); //store server IP + exosite_meta_write((unsigned char *)EXOMARK, META_MARK_SIZE, META_MARK); //store exosite mark + + return; +} + + +/***************************************************************************** +* +* exosite_meta_write +* +* \param write_buffer - string buffer containing info to write to meta; +* srcBytes - size of string in bytes; element - item from +* MetaElements enum. +* +* \return None +* +* \brief Writes specific meta information to meta memory +* +*****************************************************************************/ +void exosite_meta_write(unsigned char * write_buffer, unsigned short srcBytes, unsigned char element) +{ + exosite_meta * meta_info = 0; + + //TODO - do not write if the data already there is identical... + + switch (element) { + case META_CIK: + if (srcBytes > META_CIK_SIZE) return; + exoHAL_WriteMetaItem(write_buffer, srcBytes, (int)meta_info->cik); //store CIK + break; + case META_SERVER: + if (srcBytes > META_SERVER_SIZE) return; + exoHAL_WriteMetaItem(write_buffer, srcBytes, (int)meta_info->server); //store server IP + break; + case META_MARK: + if (srcBytes > META_MARK_SIZE) return; + exoHAL_WriteMetaItem(write_buffer, srcBytes, (int)meta_info->mark); //store exosite mark + break; + case META_UUID: + if (srcBytes > META_UUID_SIZE) return; + exoHAL_WriteMetaItem(write_buffer, srcBytes, (int)meta_info->uuid); //store UUID + break; + case META_MFR: + if (srcBytes > META_MFR_SIZE) return; + exoHAL_WriteMetaItem(write_buffer, srcBytes, (int)meta_info->mfr); //store manufacturing info + break; + case META_NONE: + default: + break; + } + + return; +} + + +/***************************************************************************** +* +* exosite_meta_read +* +* \param read_buffer - string buffer to receive element data; destBytes - +* size of buffer in bytes; element - item from MetaElements enum. +* +* \return None +* +* \brief Writes specific meta information to meta memory +* +*****************************************************************************/ +void exosite_meta_read(unsigned char * read_buffer, unsigned short destBytes, unsigned char element) +{ + exosite_meta * meta_info = 0; + + switch (element) { + case META_CIK: + if (destBytes < META_CIK_SIZE) return; + exoHAL_ReadMetaItem(read_buffer, META_CIK_SIZE, (int)meta_info->cik); //read CIK + break; + case META_SERVER: + if (destBytes < META_SERVER_SIZE) return; + exoHAL_ReadMetaItem(read_buffer, META_SERVER_SIZE, (int)meta_info->server); //read server IP + break; + case META_MARK: + if (destBytes < META_MARK_SIZE) return; + exoHAL_ReadMetaItem(read_buffer, META_MARK_SIZE, (int)meta_info->mark); //read exosite mark + break; + case META_UUID: + if (destBytes < META_UUID_SIZE) return; + exoHAL_ReadMetaItem(read_buffer, META_UUID_SIZE, (int)meta_info->uuid); //read provisioning UUID + break; + case META_MFR: + if (destBytes < META_MFR_SIZE) return; + exoHAL_ReadMetaItem(read_buffer, META_MFR_SIZE, (int)meta_info->mfr); //read manufacturing info + break; + case META_NONE: + default: + break; + } + + return; +} + + diff --git a/third_party/exosite/exosite_meta.h b/third_party/exosite/exosite_meta.h new file mode 100644 index 0000000..6aee614 --- /dev/null +++ b/third_party/exosite/exosite_meta.h @@ -0,0 +1,76 @@ +/***************************************************************************** +* +* exosite_meta.h - Meta informatio header +* Copyright (c) 2013, Exosite LLC +* All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* * Redistributions of source code must retain the above copyright notice, +* this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of Exosite LLC nor the names of its contributors may +* be used to endorse or promote products derived from this software +* without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +*****************************************************************************/ + +#ifndef EXOSITE_META_H +#define EXOSITE_META_H + +// defines +#define META_SIZE 256 +#define META_CIK_SIZE 40 +#define META_SERVER_SIZE 6 +#define META_PAD0_SIZE 2 +#define META_MARK_SIZE 8 +#define META_UUID_SIZE 12 +#define META_PAD1_SIZE 4 +#define META_RSVD_SIZE 48 // TODO - flash block size is 128 - either make MFR these 48 RSVD bytes or instrument flash routine to use next block for MFR +#define META_MFR_SIZE 128 +typedef struct { + char cik[META_CIK_SIZE]; // our client interface key + char server[META_SERVER_SIZE]; // ip address of m2.exosite.com (not using DNS at this stage) + char pad0[META_PAD0_SIZE]; // pad 'server' to 8 bytes + char mark[META_MARK_SIZE]; // watermark + char uuid[META_UUID_SIZE]; // UUID in ascii + char pad1[META_PAD1_SIZE]; // pad 'uuid' to 16 bytes + char rsvd[META_RSVD_SIZE]; // reserved space - pad to ensure mfr is at end of RDK_META_SIZE + char mfr[META_MFR_SIZE]; // manufacturer data structure +} exosite_meta; + +#define EXOMARK "exosite!" + +typedef enum +{ + META_CIK, + META_SERVER, + META_MARK, + META_UUID, + META_MFR, + META_NONE +} MetaElements; + +// functions for export +void exosite_meta_defaults(void); +void exosite_meta_init(int reset); +void exosite_meta_write(unsigned char * write_buffer, unsigned short srcBytes, unsigned char element); +void exosite_meta_read(unsigned char * read_buffer, unsigned short destBytes, unsigned char element); + +#endif + diff --git a/third_party/fatfs/doc/00index_e.html b/third_party/fatfs/doc/00index_e.html new file mode 100644 index 0000000..128b58f --- /dev/null +++ b/third_party/fatfs/doc/00index_e.html @@ -0,0 +1,87 @@ + + + + + + + +ELM - Generic FAT File System Module + + + +

FAT File System Module

+
+ +
+layer +

FatFs module is an experimental project to implement a FAT file system to small embdded systems. The FatFs module is written in compliance with ANSI C, therefore it is independent of hardware architecture. It can be incorporated into most 8-bit microcontrollers, such as 8051, PIC, AVR, H8, Z80 and etc..., without any change. I created two modules in different configurations in consideration of various use.

+ +

Features of FatFs Module

+
    +
  1. Separated buffer for FAT structure and each file, suitable for fast multiple file accsess.
  2. +
  3. Supports multiple drives/partitions.
  4. +
  5. Supports FAT12, FAT16(+FAT64) and FAT32. (FAT64: FAT16 in 64KB/cluster)
  6. +
  7. Supports 8.3 format file name and NT lower case flag. (LFN is not supported)
  8. +
  9. Supports two partitioning rules: FDISK and Super-floppy.
  10. +
  11. Optimized for 8/16-bit microcontrollers.
  12. +
+

Features of Tiny-FatFs Module (different to FatFs)

+
    +
  1. Very low memory consumption, suitable for small memory system. (RAM:1KB)
  2. +
  3. Supports only single drive.
  4. +
+
+ + +
+

Application Interface

+

FatFs/Tiny-FatFs module provides following functions.

+ +
+ + +
+

Disk I/O Interface

+

Since the FatFs/Tiny-FatFs module is completely separated from disk I/O layer, it requires following functions to lower layer to read/write physical disk and to get current time. These functions must be provided by user. The low level disk I/O module that have this interace must be provided by user. The sample projects are also available.

+ +
+ + +
+

Resources

+

The FatFs/Tiny-FatFs module is a free software and is opened for education, research and development. You can use, modify and/or republish it for personal, non-profit or profit use without any restriction under your responsibility.

+ +
+ + + diff --git a/third_party/fatfs/doc/00index_j.html b/third_party/fatfs/doc/00index_j.html new file mode 100644 index 0000000..35fb0b5 --- /dev/null +++ b/third_party/fatfs/doc/00index_j.html @@ -0,0 +1,87 @@ + + + + + + + +ELM - ”Ä—pFATƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€Eƒ‚ƒWƒ…[ƒ‹ + + + +

FATƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€Eƒ‚ƒWƒ…[ƒ‹

+
+ +
+layer +

¬‹K–͂ȑg‚Ýž‚݃VƒXƒeƒ€Œü‚¯‚̔ėpFATƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€Eƒ‚ƒWƒ…[ƒ‹‚Å‚·BANSI C€‹’‚Ńn[ƒhƒEƒFƒAEƒA[ƒLƒeƒNƒ`ƒƒ‚ɂ͈ˑ¶‚µ‚È‚¢‚Ì‚ÅA•K—v‚ȃ[ƒNEƒGƒŠƒA‚ªŠm•Û‚Å‚«‚ê‚ÎA8051, PIC, AVR, H8, Z80‚ȂǂقƂñ‚Ç‚Ì8ƒrƒbƒgEƒ}ƒCƒRƒ“‚Å‚»‚̂܂܎g—p‰Â”\‚Å‚·B‚¢‚ë‚¢‚ë‚ÈŽg—pŒ`‘Ô‚ðl—¶‚µ‚ÄA‚‹@”\”ÅiFatFsj‚ÆÈƒƒ‚ƒŠ”ÅiTiny-FatFsj‚Ì2’Ê‚è‚ð쬂µ‚Ă݂܂µ‚½B

+

FatFs‚Ì“Á’¥

+
    +
  1. ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€—p‚ƃtƒ@ƒCƒ‹I/O—pƒoƒbƒtƒ@‚𕪗£‚µA•¡”ƒtƒ@ƒCƒ‹‚Ì‚‘¬ƒAƒNƒZƒX‚É“K‚·‚é
  2. +
  3. •¡”‚̃hƒ‰ƒCƒuEƒp[ƒe[ƒVƒ‡ƒ“‚ðƒTƒ|[ƒg
  4. +
  5. FAT12, FAT16(+FAT64), FAT32‚ɑΉž (FAT64: FAT16 in 64KB/cluster)
  6. +
  7. 8.3Œ`Ž®ƒtƒ@ƒCƒ‹–¼‚ÆNT¬•¶Žšƒtƒ‰ƒO‚ɑΉž(LFN–¢‘Ήž)
  8. +
  9. FDISKƒtƒH[ƒ}ƒbƒg‚¨‚æ‚ÑSFDƒtƒH[ƒ}ƒbƒg‚ɑΉž
  10. +
  11. 8/16ƒrƒbƒgƒ}ƒCƒRƒ“Œü‚¯‚ɃR[ƒh‚ðÅ“K‰»
  12. +
+

Tiny-FatFs‚Ì“Á’¥(FatFs‚Æ‚Ì‘Šˆá)

+
    +
  1. RAM‚ÌŽg—p—Ê‚ð팸‚µA¬ƒƒ‚ƒŠEƒVƒXƒeƒ€(RAM:1KB)‚É‚à‘Ήž
  2. +
  3. ’Pˆêƒhƒ‰ƒCƒu‚̂݃Tƒ|[ƒg
  4. +
+
+ + +
+

ãˆÊƒŒƒCƒ„I/F

+

FatFs/Tiny-FatFsƒ‚ƒWƒ…[ƒ‹‚ÍAŽŸ‚̃tƒ@ƒCƒ‹‘€ìŠÖ”‚ð’ñ‹Ÿ‚µ‚Ä‚¢‚Ü‚·B

+
    +
  • f_mount - ƒ[ƒNƒGƒŠƒA‚Ì“o˜^Eíœ
  • +
  • f_open - ƒtƒ@ƒCƒ‹‚̃I[ƒvƒ“Eì¬
  • +
  • f_close - ƒtƒ@ƒCƒ‹‚̃Nƒ[ƒY
  • +
  • f_read - ƒtƒ@ƒCƒ‹‚̓ǂݞ‚Ý
  • +
  • f_write - ƒtƒ@ƒCƒ‹‚Ì‘‚«ž‚Ý
  • +
  • f_lseek - ƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚̈ړ®
  • +
  • f_sync - ƒLƒƒƒbƒVƒ…‚³‚ꂽƒf[ƒ^‚̃tƒ‰ƒbƒVƒ…
  • +
  • f_opendir - ƒfƒBƒŒƒNƒgƒŠ‚̃I[ƒvƒ“
  • +
  • f_readdir - ƒfƒBƒŒƒNƒgƒŠ‚̓ǂÝo‚µ
  • +
  • f_getfree - ƒfƒBƒXƒN‹ó‚«—̈æ‚̎擾
  • +
  • f_stat - ƒtƒ@ƒCƒ‹EƒXƒe[ƒ^ƒX‚̎擾
  • +
  • f_mkdir - ƒfƒBƒŒƒNƒgƒŠ‚Ìì¬
  • +
  • f_unlink - ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚Ìíœ
  • +
  • f_chmod - ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‘®«‚Ì•ÏX
  • +
  • f_rename - ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚Ì–¼‘O•ÏXEˆÚ“®
  • +
  • f_mkfs - ƒfƒBƒXƒN‚̃tƒH[ƒ}ƒbƒg
  • +
+
+ + +
+

‰ºˆÊƒŒƒCƒ„I/F

+

FatFs/Tiny-FatFsƒ‚ƒWƒ…[ƒ‹‚ÍA•¨—ƒhƒ‰ƒCƒu‚ւ̃AƒNƒZƒX‚⌻ݎž‚𓾂邽‚ßA‰ºˆÊƒŒƒCƒ„‚ÉŽŸ‚̃Cƒ“ƒ^[ƒtƒF[ƒX‚ð—v‹‚µ‚Ü‚·B‚±‚ê‚ç‚̃Cƒ“ƒ^[ƒtƒF[ƒX‚ðŽ‚Â‚»‚ꂼ‚ê‚Ì‹L˜^ƒƒfƒBƒA‚ɑΉž‚µ‚½ƒfƒBƒXƒNI/Oƒ‚ƒWƒ…[ƒ‹‚ÍAƒ†[ƒU‚É‚æ‚è—pˆÓ‚·‚é•K—v‚ª‚ ‚è‚Ü‚·BiƒTƒ“ƒvƒ‹‚à‚ ‚èj

+
    +
  • disk_initialize - ƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚̉Šú‰»
  • +
  • disk_status - ƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚Ìó‘Ԏ擾
  • +
  • disk_read - ƒfƒBƒXƒN‚©‚ç‚̓ǂݞ‚Ý
  • +
  • disk_write - ƒfƒBƒXƒN‚Ö‚Ì‘‚«ž‚Ý
  • +
  • disk_ioctl - ‚»‚Ì‘¼‚̃hƒ‰ƒCƒu§Œä
  • +
  • get_fattime - “ú•tEŽž‚̎擾
  • +
+
+ + +
+

Ž‘—¿

+

FatFs/Tiny-FatFsƒ‚ƒWƒ…[ƒ‹‚̓tƒŠ[Eƒ\ƒtƒgƒEƒFƒA‚Æ‚µ‚Ä‹³ˆçEŒ¤‹†EŠJ”­—p‚ÉŒöŠJ‚µ‚Ä‚¢‚Ü‚·B‚ǂ̂悤‚È—˜—p–Ú“IiŒÂlE”ñ¤—pE¤—pj‚Å‚àŽg—pE‰ü•ÏE”z•z‚ɂ‚¢‚ÄˆêØ‚Ì§ŒÀ‚Í‚ ‚è‚Ü‚¹‚ñ‚ªA‘S‚Ä—˜—pŽÒ‚ÌÓ”C‚̉º‚ł̗˜—p‚Æ‚µ‚Ü‚·B

+ +
+ + + + diff --git a/third_party/fatfs/doc/css_e.css b/third_party/fatfs/doc/css_e.css new file mode 100644 index 0000000..8c5e121 --- /dev/null +++ b/third_party/fatfs/doc/css_e.css @@ -0,0 +1,55 @@ +* {margin: 0; padding: 0; border-width: 0;} +body {margin: 8px; background-color: #e0ffff; font-color: black; line-height: 133%; max-width: 1024px;} +a:link {color: blue;} +a:visited {color: darkmagenta;} +a:hover {background-color: #a0ffff;} +a:active {color: darkmagenta; position: relative; top: 1px; left: 1px;} +abbr {border-width: 1px;} + +p {margin: 0 0 0.3em 1em;} +em {font-style: normal; font-weight: bold; margin: 0 0.1em;} +pre em {font-style: italic; font-weight: normal;} +strong {} +pre {margin: 1em; line-height: 1.2em; background-color: white;} +tt {margin: 0 0.2em;} +ol {margin: 0 2em;} +ul {margin: 0 2em;} +dl {margin: 0 1em;} +dt {font-family: monospace;} +dl.par dt {margin: 0.5em 0 0 0 ; font-style: italic; } +dl.ret dt {margin: 0.5em 0 0 0 ; font-weight: bold;} +dd {margin: 0 2em;} +hr {border-width: 1px; margin: 1em;} +div.abst {font-family: sans-serif;} +div.para {clear: both; font-family: serif;} +.equ {text-indent: 0; margin: 1em 2em 1em;} +.indent {margin-left: 2em;} +.rset {float: right; margin: 0 0 0.5em 0.5em;} +.lset {float: left; margin: 0 0.5em 0.5em 0.5em;} +ul.flat li {list-style-type: none; margin: 0;} +a.imglnk img {border: 1px solid;} +.iequ {white-space: nowrap; font-weight: bold;} +.clr {clear: both;} +.it {font-style: italic;} +.mfd {font-size: 0.7em; padding: 0 1px; border: 1px solid; white-space : nowrap} + +h1 {line-height: 1em; font-size: 2em; font-family: sans-serif; padding: 0.3em 0 0.3em;} +p.hdd {float: right; text-align: right; margin-top: 0.5em;} +hr.hds {clear: both; margin-bottom: 1em;} + +h2 {font-size: 1.5em; font-family: sans-serif; margin: 0 0 0.5em;} +h3 {font-size: 1.5em; font-family: sans-serif; margin: 2em 0 0.5em;} +h4 {font-size: 1.2em; font-family: sans-serif; margin: 1.5em 0 0.2em;} +h5 {font-size: 1em; font-family: sans-serif; margin: 0.5em 0 0em;} +small {font-size: 80%;} +.indent {margin-left: 2em;} + +/* Tables */ +table {margin: 4px; border-collapse: collapse; border-style: solid; border-width: 2px; border-color: black; } +th {background-color: white; border-style: solid; border-width: 1px 1px 2px; border-color: black; padding: 0 3px; vertical-align: top; white-space: nowrap;} +td {background-color: white; border-style: solid; border-width: 1px; border-color: black; padding: 0 3px; vertical-align: top; line-height: 1.3em;} +table.lst td:first-child {font-family: monospace;} +table.lst2 td {font-family: monospace;} +table caption {font-family: sans-serif; font-weight: bold;} + +p.foot {clear: both; text-indent: 0; margin: 1em 0.5em 1em;} diff --git a/third_party/fatfs/doc/css_j.css b/third_party/fatfs/doc/css_j.css new file mode 100644 index 0000000..83c0372 --- /dev/null +++ b/third_party/fatfs/doc/css_j.css @@ -0,0 +1,58 @@ +@charset "Shift_JIS"; +/* Common style sheet for Tech Notes */ + +* {margin: 0; padding: 0; border-width: 0;} +body {margin: 8px; background-color: #e0ffff; font-color: black; line-height: 133%; letter-spacing: 1px; max-width: 1024px;} +a:link {color: blue;} +a:visited {color: darkmagenta;} +a:hover {background-color: #a0ffff;} +a:active {color: darkmagenta; position: relative; top: 1px; left: 1px;} +abbr {border-width: 1px;} + +p {text-indent: 1em; margin: 0 0 0.3em 0.5em;} +em {font-style: normal; font-weight: bold; margin: 0 0.1em;} +pre em {font-style: italic; font-weight: normal;} +strong {} +pre {margin: 1em; line-height: 1.2em; letter-spacing: 0; background-color: white;} +tt {margin: 0 0.2em; letter-spacing: 0;} +ol {margin: 0 2em;} +ul {margin: 0 2em;} +dl {margin: 0 1em;} +dt {font-family: monospace;} +dl.par dt {margin: 0.5em 0 0 0 ; font-style: italic; letter-spacing: 0;} +dl.ret dt {margin: 0.5em 0 0 0 ; font-family: monospace; letter-spacing: 0; font-weight: bold;} +dd {margin: 0 2em;} +hr {border-width: 1px; margin: 1em;} +div.abst {font-family: "‚l‚r ‚oƒSƒVƒbƒN",sans-serif;} +div.para {clear: both; font-family: "‚l‚r ‚o–¾’©",serif;} +.equ {text-indent: 0; margin: 1em 2em 1em;} +.indent {margin-left: 2em;} +.rset {float: right; margin: 0 0 0.5em 0.5em;} +.lset {float: left; margin: 0 0.5em 0.5em 0.5em;} +ul.flat li {list-style-type: none; margin: 0;} +a.imglnk img {border: 1px solid;} +.iequ {white-space: nowrap; font-weight: bold;} +.clr {clear: both;} +.it {font-style: italic;} +.mfd {font-size: 0.7em; padding: 0 1px; border: 1px solid; white-space : nowrap} + +h1 {line-height: 1em; font-size: 2em; font-family: sans-serif; padding: 0.3em 0 0.3em;} +p.hdd {float: right; text-align: right; margin-top: 0.5em;} +hr.hds {clear: both; margin-bottom: 1em;} + +h2 {font-size: 1.5em; font-family: sans-serif; margin: 0 0 0.5em;} +h3 {font-size: 1.5em; font-family: sans-serif; margin: 2em 0 0.5em;} +h4 {font-size: 1.2em; font-family: sans-serif; margin: 1.5em 0 0.2em;} +h5 {font-size: 1em; font-family: sans-serif; margin: 0.5em 0 0em;} +small {font-size: 80%;} +.indent {margin-left: 2em;} + +/* Tables */ +table {margin: 4px; border-collapse: collapse; border-style: solid; border-width: 2px; border-color: black; letter-spacing: 0;} +th {background-color: white; border-style: solid; border-width: 1px 1px 2px; border-color: black; padding: 0 3px; vertical-align: top;} +td {background-color: white; border-style: solid; border-width: 1px; border-color: black; padding: 0 3px; vertical-align: top; line-height: 1.3em;} +table.lst td:first-child {font-family: monospace; white-space: nowrap;} +table.lst2 td {font-family: monospace; white-space: nowrap;} +table caption {font-family: sans-serif; font-weight: bold;} + +p.foot {clear: both; text-indent: 0; margin: 1em 0.5em 1em;} diff --git a/third_party/fatfs/doc/en/appnote.html b/third_party/fatfs/doc/en/appnote.html new file mode 100644 index 0000000..94560f4 --- /dev/null +++ b/third_party/fatfs/doc/en/appnote.html @@ -0,0 +1,124 @@ + + + + + + + +FatFs Module Application Note + + + +

FatFs Module Application Note

+
+ +
+

Considerations on porting to various platform

+

The FatFs module is assuming following terms on portability.

+
    +
  • ANSI C
    +The FatFs module is a middleware that written in ANSI C. There is no platform dependence, so long as the compiler is in compliance with ANSI C. However it handles the system portable FAT structures. You must take the endian into consideration. This setting is defined in ff.h (tff.h). It must be changed for your platform first or the compiler will abort with an error.
  • +
  • Size of char/short/long are 8/16/32 bit and int is 16 bit or grater.
    +These correspondence are defined in integer.h. This will not be a problem on most compilers. When any conflict of the definitions between the integer.h and existing definitions is occured, you must resolve the confrict with care.
  • +
+
+ +
+

Memory Usage (R0.04b)

+

These are the memory usage on some target systems. The memory sizes are in unit of byte, D means number of logical drives and F means number of open files. All samples are optimezed in code size.

+ + + + + + + + + + + + + + + + +
AVRH8/300HMSP430TLCS-870/CV850ESSH2
CompilergccCH38CL430CC870CCA850SHC
_MCU_ENDIAN122112
FatFs Code
(Standard, R/W cfg.)
8722877664027338
FatFs Code
(Minimum, R/W cfg.)
5814572240944906
FatFs Code
(Standard, R/O cfg.)
4248409630103506
FatFs Code
(Minimum, R/O cfg.)
3038311022102698
FatFs Work (Static)D*2 + 2D*4 + 2D*4 + 2D*4 + 2
FatFs Work (Dynamic)D*554 + F*544D*554 + F*550D*554 + F*550D*554 + F*550
Tiny-FatFs Code
(Standard, R/W cfg.)
7264724066348837
Tiny-FatFs Code
(Minimum, R/W cfg.)
4750480643666163
Tiny-FatFs Code
(Standard, R/O cfg.)
3600354832124347
Tiny-FatFs Code
(Minimum, R/O cfg.)
2568270223943322
Tiny-FatFs Wrok (Static)4644
Tiny-FatFs Work (Dynamic)544 + F*28544 + F*32544 + F*28544 + F*28
+
+ +
+

FatFs vs. Tiny-FatFs

+

For most applications, such as portable audio and data logger, Tiny-FatFs is the best choice. However because the Tiny-FatFs does not support FAT32 in default, there is a limitation that can handle only tiny storage upto 2GB(4GB in FAT64). The FAT32 support can be added by _USE_FAT32 option with an additional code size. The FatFs is suitable for fast multiple files access, and for multiple drive system.

+
+ + + + + +
Memory SizeFAT Type
<= 64MBFAT12
128MB - 2GBFAT16
>= 4GBFAT32
+
+

Rignt table shows the correspondence between memory size and FAT type for SD memroy card and they are shipped with this format. The data area is justified to the erase block boundary and the memory card works with the best performance. For that reason, the memory card should not be reformated with PC. When cluster size or FAT type is changed, the write performance can be decreased.

+
+ + +
+

Performance effective file access

+

For good performance on reading/writing files on the small embedded system, application program should consider what process is done in the FatFs module. The file data on the disk is transferred by f_read function in following process.

+

Figure 1. Sector miss-aligned read (short)
+ +

+

Figure 2. Sector miss-aligned read (long)
+ +

+

Figure 3. Sector aligned read
+ +

+

The file I/O buffer means a sector buffer to read/write a partial data on the sector. On the FatFs, member buffer[] in the file object is used. On the Tiny-FatFs, member win[] in the file system object is used.

+

Tiny-FatFs processes all data transfer and access to the FAT/directory with only one sector buffer, so that FAT sector cached into the buffer is lost and it must reloaded at every cluster boundary. FatFs has a FAT/directory buffer separated from file I/O buffer, the frequency of FAT accesses is only 1/341, 1/256 or 1/128 (when cluster is contiguous) compared to Tiny-FatFs. Thus the Tiny-FatFs is sacrificing its performance in compensation for very small memory footprint.

+

Figure 1 shows that partial sector data is transferred via the file I/O buffer. At long data transfer shown in Figure 2, middle of transfer data that aligned to sector boundary is transferred into memory directly. Figure 3 shows that entier transfer data is aligned to the sector boundary. In this case, file I/O buffer is not used. At the unbuffered transfer, maximum extent of sectors are read with disk_read function at a time but it never across cluster boundary even if it is contiguous.

+

Therefore taking effort to sector aligned read/write accesss eliminates memcpy and the read/write performance will be improved. Besides the effect, cached FAT sector is not flushed during read/write access on the Tiny-FatFs, so that it can achieve same performance as FatFs and its small memory footprint simultanesously.

+
+ + +
+

Critical section

+

When write operation to the FAT file system is interrupted due to any accidental failure, such as sudden blackout, incorrect disk removal and unrecoverable data error, the FAT structure can be destroyed. Following images shows the critical section on the FatFs module.

+
+Figure 4. Long critical section
+fig.4 +
+
+Figure 5. Minimized critical section
+fig.5 +
+
+

An interruption in the red section can cause a cross link; as a result, the file/directory being changed will be lost. There is one or more possibility listed below when an interruption in the yellow section is occured.

+
    +
  • File data being rewrited is collapted.
  • +
  • A file being appended returns initial state.
  • +
  • A file created as new is gone.
  • +
  • A file created as new or in overwrite remains with length of zero.
  • +
  • Efficiency of disk use gets worse due to lost chain.
  • +
+

Each case does not affect the files that not in write operation. To minimize risk of data loss, the critical section can be minimized like shown in Figure 5 by minimizing the time that file is opened in write mode and using f_sync function properly.

+
+ + +
+

Problems and Ideas

+
    +
  • Abstraction of file object
    +Currently the file object structure is held by application layer. This is not a problem for Tiny-FatFs, it consumes the task stack only 26 bytes per file. But FatFs requires 550 bytes per file. When managed the file objects in file handle, stack consumption at application module will able to be reduced. In this case, the work area for file objects is managed in FatFs module. This has a disadvantage that direct access to the file object structure cannot be used and additional file functions, such as feof and ftell, will be needed.
  • +
  • Efficient sector buffer management
    +The FatFs module has only one sector buffer per logical drive. There is an ineffciency on random file access with many files simultanesously. When additional memory for the sector buffer is available, the file access performance will able to be improved with an advanced cache mechanism.
  • +
  • Long file name
    +There is an extended feature to handle long file name (LFN) up to 255 characters, in addition to 8.3 format file name, on FAT file system. To support this, 512 byte string buffer for file name and UCS-2 - Shift_JIS mutual conversion table are required. Therefore memory consumption of code and work area will be increased drastically. The FatFs module does not support this feature. The LFN on the FAT file system is a patent of Microsoft. When support it on the commercial products, you have to be licensed.
  • +
  • Porting to RTOS
    +When use FatFs module from only one task, no consideration is needed. However when make access to a logical drive from two or more tasks simultanesously, any exclusion control will be required. The FatFs module is also ported to a free RTOS based on μITRON by TOPPERS Project.
  • +
+
+

These are the problems and ideas on current revision of FatFs module. However the main target of FatFs module is 8 bit microcontrollers. These extensions requires much resource and the FatFs will unable to be ported to the 8 bit system. This may be the most serious problem on future plan.

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/chmod.html b/third_party/fatfs/doc/en/chmod.html new file mode 100644 index 0000000..bdb3c12 --- /dev/null +++ b/third_party/fatfs/doc/en/chmod.html @@ -0,0 +1,89 @@ + + + + + + + +FatFs - f_chmod + + + + +
+

f_chmod

+

The f_chmod function changes the attribute of a file or directory.

+
+FRESULT f_chmod (
+  const char* FileName, /* Pointer to the file or directory */
+  BYTE Attribute,       /* Attribute flags */
+  BYTE AttributeMask    /* Attribute masks */
+);
+
+
+ +
+

Parameter

+
+
FileName
+
Pointer to the null-terminated string that specifies a file or directory to be changed
+
Attribute
+
Attribute flags to be set in one or more combination of the following flags. The specified flags are set and others are cleard.
+ + + + + + +
AttributeDescription
AM_RDORead only
AM_ARCArchive
AM_SYSSystem
AM_HIDHidden
+
+
AttributeMask
+
Attribute mask that specifies which attribute is changed. The specified aattributes are set or cleard.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NO_FILE
+
Could not find the file.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The file name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_WRITE_PROTECTED
+
The medium is write protected.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT partition on the disk.
+
+
+ + +
+

Description

+

The f_chmod function changes the attribute of a file or directory. This function is not supported in read-only configuration and minimization level of >=1.

+
+ + +
+

Example

+
+    // Set read-only flag, clear archive flag and others are retained.
+    f_chmod("file.txt", AR_RDO, AR_RDO | AR_ARC);
+
+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/close.html b/third_party/fatfs/doc/en/close.html new file mode 100644 index 0000000..642dda7 --- /dev/null +++ b/third_party/fatfs/doc/en/close.html @@ -0,0 +1,60 @@ + + + + + + + +FatFs - f_close + + + + +
+

f_close

+

The f_close function closes an open file.

+
+FRESULT f_close (
+  FIL* FileObject     /* Pointer to the file object structure */
+);
+
+
+ +
+

Parameter

+
+
FileObject
+
Pointer to the open file object structure to be closed.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The file object has been closed successfuly.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_INVALID_OBJECT
+
The file object is invalid.
+
+
+ + +
+

Description

+

The f_close function closes an open file object. If any data has been written to the file, the cached information of the file is written back to the disk. After the function succeeded, the file object is no longer valid and it can be discarded. If the file object has been opened in read-only mode, it may be discarded without closing process by this function.

+
+ + +
+

References

+

f_open, f_read, f_write, f_sync, FIL, FATFS

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/dinit.html b/third_party/fatfs/doc/en/dinit.html new file mode 100644 index 0000000..d95aef1 --- /dev/null +++ b/third_party/fatfs/doc/en/dinit.html @@ -0,0 +1,44 @@ + + + + + + + +FatFs - disk_initialize + + + + +
+

disk_initialize

+

The disk_initialize function initializes the disk drive.

+
+DSTATUS disk_initialize (
+  BYTE Drive           /* Physical drive number */
+);
+
+
+ +
+

Parameters

+
+
Drive
+
Specifies the physical drive number to initialize.
+
+
+ + +
+

Return Values

+

This function returns a disk status as the result. For details of the disk status, refer to the disk_status function.

+
+ +
+

Description

+

The disk_initialize function initializes a physical drive. When the function succeeded, STA_NOINIT flag in the return value is cleard.

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/dioctl.html b/third_party/fatfs/doc/en/dioctl.html new file mode 100644 index 0000000..f1797a7 --- /dev/null +++ b/third_party/fatfs/doc/en/dioctl.html @@ -0,0 +1,65 @@ + + + + + + + +FatFs - disk_ioctl + + + + +
+

disk_ioctl

+

The disk_ioctl function cntrols device specified features and miscellaneous functions other than disk read/write.

+
+DRESULT disk_ioctl (
+  BYTE Drive,      /* Drive number */
+  BYTE Command,    /* Control command code */
+  void* Buffer     /* Data transfer buffer */
+);
+
+
+ +
+

Parameters

+
+
Drive
+
Specifies drive number (0-9).
+
Command
+
Specifies the command code.
+
Buffer
+
Pointer to the parameter buffer depends on the command code. When it is not used, specify a NULL pointer.
+
+
+ + +
+

Return Value

+
+
RES_OK (0)
+
The function succeeded.
+
RES_ERROR
+
Any error occured.
+
RES_PARERR
+
Invalid command code.
+
RES_NOTRDY
+
The disk dirve has not been initialized.
+
+
+ + +
+

Description

+

The FatFs module uses only device independent commands described below. Any device dependent function is not used. In read-only configuration, This function is not needed.

+ + + + +
CommandDescription
GET_SECTOR_COUNTReturns total sectors on the drive into the DWORD variable pointed by Buffer.
CTRL_SYNCMake sure that the drive has finished to write data. When the module has a write back cache, write back the dirty sector immediately.
+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/dread.html b/third_party/fatfs/doc/en/dread.html new file mode 100644 index 0000000..15e51d4 --- /dev/null +++ b/third_party/fatfs/doc/en/dread.html @@ -0,0 +1,58 @@ + + + + + + + +FatFs - disk_read + + + + +
+

disk_read

+

The disk_read function reads sector(s) from the disk drive.

+
+DRESULT disk_read (
+  BYTE Drive,          /* Physical drive number */
+  BYTE* Buffer,        /* Pointer to the read buffer */
+  DWORD SectorNumber,  /* Sector number to read from */
+  BYTE SectorCount     /* Number of sectros to read */
+);
+
+
+ +
+

Parameters

+
+
Drive
+
Specifies the physical drive number to read.
+
Buffer
+
Pointer to the read buffer to store the read data. SectorCount * 512 bytes is required for the size of the read buffer.
+
SectorNumber
+
Specifies the start sector number in logical block address.
+
SectorCount
+
Specifies number of sectors to read. The value can be 1 to 255.
+
+
+ + +
+

Return Value

+
+
RES_OK (0)
+
The function succeeded.
+
RES_ERROR
+
Any error occured during the read operation.
+
RES_PARERR
+
Invalid parameter.
+
RES_NOTRDY
+
The disk dirve has not been initialized.
+
+
+ + +

Return

+ + diff --git a/third_party/fatfs/doc/en/dstat.html b/third_party/fatfs/doc/en/dstat.html new file mode 100644 index 0000000..41179af --- /dev/null +++ b/third_party/fatfs/doc/en/dstat.html @@ -0,0 +1,47 @@ + + + + + + + +FatFs - disk_status + + + + +
+

disk_status

+

The disk_status function gets the disk status.

+
+DSTATUS disk_status (
+  BYTE Drive     /* Physical drive number */
+);
+
+
+ +
+

Parameters

+
+
Drive
+
Specifies the physical drive number to be tested.
+
+
+ + +
+

Return Values

+

The disk status is returned in combinatin of following flags.

+
+
STA_NOINIT
+
Indicates that the disk drive has not been initialiezed. This flag is set on: power-on, disk removal and disk_initialize function failed, and cleared on: disk_initialize function succeeded.
+
STA_NODISK
+
Indicates that no medium in the drive. It is always cleared on fixed disk drive.
+
STA_PROTECTED
+
Indicates that the medium is write protected. It is always cleared on the drive that does not support write protect notch.
+
+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/dwrite.html b/third_party/fatfs/doc/en/dwrite.html new file mode 100644 index 0000000..87e3e8f --- /dev/null +++ b/third_party/fatfs/doc/en/dwrite.html @@ -0,0 +1,66 @@ + + + + + + + +FatFs - disk_write + + + + +
+

disk_write

+

The disk_write writes sector(s) to the disk.

+
+DRESULT disk_write (
+  BYTE Drive,          /* Physical drive number */
+  const BYTE* Buffer,  /* Pointer to the read buffer */
+  DWORD SectorNumber,  /* Sector number to write */
+  BYTE SectorCount     /* Number of sectors to write */
+);
+
+
+ +
+

Parameters

+
+
Drive
+
Specifies the physical drive number to write.
+
Buffer
+
Pointer to the data to be written.
+
SectorNumber +
Specifies the start sector number in logical block address.
+
SectorCount
+
Specifies number of sectors to write. The value can be 1 to 255.
+
+
+ + +
+

Return Values

+
+
RES_OK (0)
+
The function succeeded.
+
RES_ERROR
+
Any error occured during the write operation.
+
RES_WRPRT
+
The disk is write protected.
+
RES_PARERR
+
Invalid parameter.
+
RES_NOTRDY
+
The disk dirve has not been initialized.
+
+
+ + +
+

Description

+

This function is not required in read only configuration.

+
+ + +

Return

+ + diff --git a/third_party/fatfs/doc/en/fattime.html b/third_party/fatfs/doc/en/fattime.html new file mode 100644 index 0000000..dbb81a9 --- /dev/null +++ b/third_party/fatfs/doc/en/fattime.html @@ -0,0 +1,50 @@ + + + + + + + +FatFs - get_fattime + + + + +
+

get_fattime

+

The get_fattime function gets current time.

+
+DWORD get_fattime (void);
+
+
+ + +
+

Return Value

+

Currnet time is returned with packed into a DWORD value. The bit field is as follows:

+
+
bit31:25
+
Year from 1980 (0..127)
+
bit24:21
+
Month (1..12)
+
bit20:16
+
Date (1..31)
+
bit15:11
+
Hour (0..23)
+
bit10:5
+
Minute (0..59)
+
bit4:0
+
Second/2 (0..29)
+
+
+ + +
+

Description

+

The get_fattime function must return any valid time even if the system does not support a real time clock. This fucntion is not required in read only configuration.

+
+ + +

Return

+ + diff --git a/third_party/fatfs/doc/en/filename.html b/third_party/fatfs/doc/en/filename.html new file mode 100644 index 0000000..b80e069 --- /dev/null +++ b/third_party/fatfs/doc/en/filename.html @@ -0,0 +1,58 @@ + + + + + + + +FatFs - File and Path name on the FatFs module + + + + +
+

File and Path name on the FatFs module

+

The format of file and path name on the FatFs module is similer to MS-DOS. However it does not have a concept of current directory, all objects on the drive are specified in full path from the roor directory.

+
+
+ "[logical drive#:][/]directory/file"
+
+ "file1.txt"           a file on drive 0
+ "/file1.txt"          (same as above)
+ "dir1/dir2/file1.txt" a file on drive 0
+ "2:dir3/file2.txt"    a file on drive 2
+ "2:/dir5"             a directory on drive 2
+ ""                    the root directory on drive 0
+ "/"                   (same as above)
+ "2:"                  the root directory on drive 2
+
+
+

The FatFs module supports only 8.3 format file name and long file name is currentry not supported. For directory separator, a '/' is used, not a '\'. Heading '/' is ignored and can be omitted.

+

The logical drive number is specified in a numeral with a colon. When drive number is omitted, it means the default drive (0). As for the Tiny-FatFs, it has only one logical drive and always works as drive 0. Any drive number cannot be contained in the path name.

+
+ +


+
+

Correspondence between logical/physical drive

+

In default, the FatFs module has work areas that called file system object for each logical drive. The logical drive is bound simply to the physical drive that has same drive number, and first partition is mounted. When _MULTI_PARTITION is specified in configuration option, each individual logical drive can be bound to any physical drive/partition. In this case, a drive number resolution table must be defined as follows:

+
+Example: Logical drive 0-2 are assigned to three pri-partitions on the physical drive 0 (fixed disk)
+         Logical drive 3 is assigned to physical drive 0 (removable disk)
+
+const PARTITION Drives[] = {
+    {0, 0},     /* Logical drive 0 ==> Physical drive 0, 1st partition */
+    {0, 1},     /* Logical drive 1 ==> Physical drive 0, 2nd partition */
+    {0, 2},     /* Logical drive 2 ==> Physical drive 0, 3rd partition */
+    {1, 0}      /* Logical drive 3 ==> Physical drive 1 */
+};
+
+

There are some consideration when use _MULTI_PARTITION configuration.

+
    +
  • Only pri-partition (0-3) can be mounted.
  • +
  • When the drive have no partition table (super floppy format), partition number is ignored.
  • +
  • The drive that has two or more logical drive must be fixed drive.
  • + +
+ + + diff --git a/third_party/fatfs/doc/en/getfree.html b/third_party/fatfs/doc/en/getfree.html new file mode 100644 index 0000000..e81de0a --- /dev/null +++ b/third_party/fatfs/doc/en/getfree.html @@ -0,0 +1,91 @@ + + + + + + + +FatFs - f_getfree + + + + +
+

f_getfree

+

The f_getfree function gets number of the free clusters.

+
+FRESULT f_getfree (
+  const char* Path,         /* Root directory of the drive */
+  DWORD* Clusters,          /* Pointer to the variable to store number of free clusters */
+  FATFS** FileSystemObject  /* Pointer to pointer to file system object */
+);
+
+
+ +
+

Parameters

+
+
Path
+
Pinter to the null-terminated string that specifies the root directory of the logical drive. Always specify a null-string for Tiny-FatFs.
+
Clusters
+
Pointer to the DWORD variable to store number of free clusters.
+
FileSystemObject
+
Pointer to the pointer that to be stored the pointer to corresponding file system object.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded. The *Clusters havs number of free clusters and *FileSystemObject points the file system object.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT partition on the disk.
+
+
+ + +
+

Descriptions

+

The f_getfree function gets number of free clusters on the drive. The sects_clust member in the file system object refreting number of sectors per cluster, so that the free space in unit of sector can be calcurated with this. When _USE_FSINFO option is enabled, this function can return inaccurate free cluster count on FAT32 volume. When _USE_FSINFO option is disabled, this function will take a time on FAT32 volume.

+

This function is not supported in read-only configuration and minimization level of >= 1.

+
+ + +
+

Samples Code

+
+    FATFS *fs;
+    DWORD clust;
+
+
+    // Get free clusters
+    res = f_getfree("", &clust, &fs);
+    if (res) die(res);
+
+    // Get free space
+    printf("%lu KB total disk space.\n"
+           "%lu KB available on the disk.\n",
+           (DWORD)(fs->max_clust - 2) * fs->sects_clust / 2,
+           clust * fs->sects_clust / 2);
+
+
+ + +
+

References

+

FATFS

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/lseek.html b/third_party/fatfs/doc/en/lseek.html new file mode 100644 index 0000000..a60bfc2 --- /dev/null +++ b/third_party/fatfs/doc/en/lseek.html @@ -0,0 +1,86 @@ + + + + + + + +FatFs - f_lseek + + + + +
+

f_lseek

+

The f_lseek functione moves the file read/write pointer of an open file object.

+
+FRESULT f_lseek (
+  FIL* FileObject,   /* Pointer to the file object structure *
+  DWORD Offset       /* File offset in unit of byte *
+);
+
+
+ +
+

Parameters

+
+
FileObject
+
Pointer to the open file object.
+
Offset
+
Number of bytes where from start of file
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_INVALID_OBJECT
+
The file object is invalid.
+
+
+ + +
+

Description

+

The f_lseek function moves the file R/W pointer of an open file. The offset can be specified in only origin from top of the file. When an offset above the file size is specified in write mode, the file is extended to the offset and the data in the extended area is undefined. After the function succeeded, member fptr in the file object should be checked in order to make sure the R/W pointer has been moved correctry. In case of fptr is less than Offset, any of the followings has been occured.

+
    +
  • In read-only mode, the Offset was clipped in file size.
  • +
  • The drive gets full during the file extending process.
  • +
  • There is any error in the FAT structure.
  • +
+

This function is not supported in minimization level of >= 3.

+ + +
+

Example

+
+    // Move to offset of 5000 from top of the file.
+    res = f_lseek(&file, 5000);
+
+    // Forward 3000 bytes
+    res = f_lseek(&file, file.fptr + 3000);
+
+    // Rewind 2000 bytes (take care on overflow)
+    res = f_lseek(&file, file.fptr - 2000);
+
+    // Move to end of the file
+    res = f_lseek(&file, file.fsize);
+
+
+ + +
+

References

+

f_open, FIL

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/mkdir.html b/third_party/fatfs/doc/en/mkdir.html new file mode 100644 index 0000000..5dcff74 --- /dev/null +++ b/third_party/fatfs/doc/en/mkdir.html @@ -0,0 +1,83 @@ + + + + + + + +FatFs - f_mkdir + + + + +
+

f_mkdir

+

The f_mkdir function creates a new directory.

+
+FRESULT f_mkdir (
+  const char* DirName /* Pointer to the directory name */
+);
+
+
+ +
+

Parameter

+
+
DirName
+
Pointer to the null-terminated string that specifies the directory name to create.
+
+
+ + +
+

Return Value

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The path name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_DENIED
+
The directory cannot be created due to directory table or disk is full.
+
FR_EXIST
+
A file or directory that has same name is already existing.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_WRITE_PROTECTED
+
The medium is write protected.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT partition on the disk.
+
+
+ + +
+

Description

+

The f_mkdir function creates a new directory. This function is not supported in read-only configuration and minimization level of >= 1.

+

+

+
+ + +
+

Example

+
+    res = f_mkdir("sub1");
+    if (res) die(res);
+    res = f_mkdir("sub1/sub2");
+    if (res) die(res);
+    res = f_mkdir("sub1/sub2/sub3");
+    if (res) die(res);
+
+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/mkfs.html b/third_party/fatfs/doc/en/mkfs.html new file mode 100644 index 0000000..35ae3b9 --- /dev/null +++ b/third_party/fatfs/doc/en/mkfs.html @@ -0,0 +1,73 @@ + + + + + + + +FatFs - f_mkfs + + + + +
+

f_mkfs

+

The f_mkfs fucntion creates a file system on the drive.

+
+FRESULT f_mkfs (
+  BYTE  Drive,            /* Logical drive number */
+  BYTE  PartitioningRule, /* Partitioning rule */
+  BYTE  AllocSize         /* Allocation unit size */
+);
+
+
+ +
+

Parameters

+
+
Drive
+
Logical drive number (0-9) to be formatted.
+
PartitioningRule
+
When 0 is given, a partition table is created into first sector on the drive and then the file system is created on the partition. This is called FDISK format. When 1 is given, the file system starts from the first sector without partition table. This is often called super floppy (SFD) format.
+
AllocSize
+
Specifies allocation unit size (number of sectors per cluster). The value must be power of 2 in range of from 1 to 64.
+
+
+ +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The drive cannot work due to any reason.
+
FR_WRITE_PROTECTED
+
The drive is write protected.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_MKFS_ABORTED
+
The function aborted before start in format due to a reason as follows. +
    +
  • The disk size is too small.
  • +
  • Invalid parameter was given to any parameter.
  • +
  • Not allowable cluster size for this drive. This can occure when number of clusters becomes around 0xFF7 and 0xFFF7.
  • +
+
+
+
+ +
+

Description

+

The f_mkfs function creates a FAT file system on the drive. There are two partitioning rules, FDISK and SFD, for removable media. It can be selected with a parameter and FDISK format is recommended for most case. This function currently does not support multiple partition, so that existing partitions on the physical dirve will be deleted and re-created a partition occupies entire disk space.

+

The FAT type, FAT12/FAT16/FAT32, is determined by only how many clusters on the drive and nothing else, according to FAT specification. Thus which FAT type is selected, is depends on the drive size and specified cluster size. The cluster size affects performance of file system and large cluster increases the performance, so that 64 sectors per cluster is recommended except for small drive.

+

This function is supported on only FatFs with _USE_MKFS option.

+

+ + +

Return

+ + diff --git a/third_party/fatfs/doc/en/mount.html b/third_party/fatfs/doc/en/mount.html new file mode 100644 index 0000000..9a14392 --- /dev/null +++ b/third_party/fatfs/doc/en/mount.html @@ -0,0 +1,59 @@ + + + + + + + +FatFs - f_mount + + + + +
+

f_mount

+

The f_mount fucntion registers/unregisters a work area to the FatFs module.

+
+FRESULT f_mount (
+  BYTE  Drive,              /* Logical drive number */
+  FATFS*  FileSystemObject  /* Pointer to the work area */
+);
+
+
+ +
+

Parameters

+
+
Drive
+
Logical drive number (0-9) to register/unregister the work area. Always 0 for Tiny-FatFs.
+
FileSystemObject
+
Pointer to the work area (file system object) to be registered.
+
+
+ +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
+
+ + +
+

Description

+

The f_mount function registers/unregisters a work area to the FatFs module. The work area must be given to the logical drive with this function before using any file function. To unregister a work area, specify a NULL to the FileSystemObject, and then the work area can be discarded.

+

This function only initializes the work area and registers its address to the internal table, any access to the disk I/O layer does not occure. Actual mounting process is performed in any other file funcitons with path name when it is needed.

+

+ + +
+

References

+

FATFS

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/mountdrv.html b/third_party/fatfs/doc/en/mountdrv.html new file mode 100644 index 0000000..7cc6bbf --- /dev/null +++ b/third_party/fatfs/doc/en/mountdrv.html @@ -0,0 +1,57 @@ + + + + + + + +FatFs - f_mountdrv + + + + +
+

f_mountdrv

+

The f_mountdrv forces the partition mounted.

+
+FRESULT f_mountdrv (void);
+
+
+ +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_RW_ERROR
+
Any error occured in low level disk I/O.
+
FR_NOT_ENABLED
+
FatFs module is not enabled.
+
FR_NO_FILESYSTEM
+
There is no valid FAT partition on the disk.
+
+
+ + +
+

Description

+

The f_mountdrv forces the partition mounted (initializes FATFS structure). The file system is initialized automatically in accordance with the necessity when any file function is called. This function should not be used except for recovering FR_INCORRECT_DISK_CHANGE error. Using this function, while any file is opened, can destroy the file system.

+

In this function, following processes are executed.


+
    +
  • Initializes lower level layer (disk I/O module).
  • +
  • Searches a FAT boot record in order of sector 0 (as SFD format) and first primary partition (as FDISK format).
  • +
  • Initializes file system object (FATFS structure).
  • +
+
+ + +
+

References

+

FATFS

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/open.html b/third_party/fatfs/doc/en/open.html new file mode 100644 index 0000000..d8cc7ff --- /dev/null +++ b/third_party/fatfs/doc/en/open.html @@ -0,0 +1,136 @@ + + + + + + + +FatFs - f_open + + + + +
+

f_open

+

The f_open function creates a file object to be used to access the file.

+
+FRESULT f_open (
+  FIL* FileObject,      /* Pointer to the blank file object structure */
+  const char* FileName, /* Pointer to the file neme */
+  BYTE ModeFlags        /* Mode flags */
+);
+
+
+ +
+

Parameters

+
+
FileObject
+
Pointer to the file object structure to be created. After the f_open funciton succeeded, the file can be accessed with the file object structure until it is closed.
+
FileName
+
Pointer to a null-terminated string that specifies the file name to create or open.
+
ModeFlags
+
Specifies the type of access and open method for the file. It is specified by a combination of following flags.
+ + + + + + + + +
ValueDescription
FA_READSpecifies read access to the object. Data can be read from the file.
Combine with FA_WRITE for read-write access.
FA_WRITESpecifies write access to the object. Data can be written to the file.
Combine with FA_READ for read-write access.
FA_OPEN_EXISTINGOpens the file. The function fails if the file is not existing.
FA_OPEN_ALWAYSOpens the file, if it is existing. If not, the function creates the new file.
FA_CREATE_NEWCreates a new file. The function fails if the file is already existing.
FA_CREATE_ALWAYSCreates a new file. If the file is existing, it is truncated and overwritten.
+
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded and the file object is valid.
+
FR_NO_FILE
+
Could not find the file.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The file name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_EXIST
+
The file is already existing.
+
FR_DENIED
+
The required access was denied due to any of following reasons: write mode open of a file that has read-only attribute, file creation under existing a same name directory or read-only file, cannot be created due to the directory table or disk full.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_WRITE_PROTECTED
+
Write mode open or creation under the medium is write protected.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT partition on the disk.
+
+
+ + +
+

Description

+

The created file object is used for subsequent calls to refer to the file. When close an open file object, use f_close function.

+

Before using any file function, work area (file system object) must be given to each logical drive with f_mount function. All file functions can work after this procedure.

+

The mode flags, FA_WRITE, FA_CREATE_ALWAYS, FA_CREATE_NEW, FA_OPEN_ALWAYS, are not supported in read-only configuration.

+
+ + +
+

Example (File Copy)

+
+void main ()
+{
+    FATFS fs;            // Work area (file system object) for logical drive
+    FIL fsrc, fdst;      // file objects
+    BYTE buffer[4096];   // file copy buffer
+    FRESULT res;         // FatFs function common result code
+    WORD br, bw;         // File R/W count
+
+
+    // Register a work area to logical drive 0
+    f_mount(0, &fs);
+
+    // Open source file
+    res = f_open(&fsrc, "srcfile.dat", FA_OPEN_EXISTING | FA_READ);
+    if (res) die(res);
+
+    // Create destination file
+    res = f_open(&fdst, "dstfile.dat", FA_CREATE_ALWAYS | FA_WRITE);
+    if (res) die(res);
+
+    // Copy source to destination
+    for (;;) {
+        res = f_read(&fsrc, buffer, sizeof(buffer), &br);
+        if (res || br == 0) break;      // error or eof
+        res = f_write(&fdst, buffer, br, &bw);
+        if (res || bw < br) break;   // error or disk full
+    }
+
+    // Close all files
+    f_close(&fsrc);
+    f_close(&fdst);
+
+    // Unregister a work area before discard it
+    f_mount(0, NULL);
+}
+
+
+ + +
+

References

+

f_read, f_write, f_close, FIL, FATFS

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/opendir.html b/third_party/fatfs/doc/en/opendir.html new file mode 100644 index 0000000..dfe02cf --- /dev/null +++ b/third_party/fatfs/doc/en/opendir.html @@ -0,0 +1,73 @@ + + + + + + + +FatFs - f_opendir + + + + +
+

f_opendir

+

The f_opendir function opens a directory.

+
+FRESULT f_opendir (
+  DIR* DirObject,      /* Pointer to the blank directory object structure */
+  const char* DirName  /* Pointer to the directory name */
+);
+
+
+ +
+

Parameter

+
+
DirObject
+
Pointer to the blank directory object to be created.
+
DirName
+
Pinter to the null-terminated string that specifies the directory name to be opened.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded and the directory object is created. It is used for subsequent calls to read the directory entries.
+
FR_NO_FILE
+
Could not find the directory.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The path name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT partition on the disk.
+
+
+ + +
+

Description

+

The f_opendir function opens an exsisting directory and creates the directory object for subsequent calls. The directory object structure can be discarded at any time without any procedure. This function is not supported in minimization level of >=2.

+
+ + +
+

References

+

f_readdir, DIR

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/read.html b/third_party/fatfs/doc/en/read.html new file mode 100644 index 0000000..0c03971 --- /dev/null +++ b/third_party/fatfs/doc/en/read.html @@ -0,0 +1,71 @@ + + + + + + + +FatFs - f_read + + + + +
+

f_read

+

The f_read function reads data from a file.

+
+FRESULT f_read (
+  FIL* FileObject,    /* Pointer to the file object structure */
+  void* Buffer,       /* Pointer to the buffer to store read data */
+  WORD ByteToRead,    /* Number of bytes to read */
+  WORD* ByteRead      /* Pointer to the variable to return number of bytes read */
+);
+
+
+ +
+

Parameters

+
+
FileObject
+
Pointer to the open file object.
+
Buffer
+
Pointer to the buffer to store read data
+
ByteToRead
+
Number of bytes to read
+
ByteRead
+
Pointer to the WORD variable to return number of bytes read.
+ +
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_DENIED
+
The function denied due to the file has been opened in write only mode.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_INVALID_OBJECT
+
The file object is invalid.
+
+
+ + +
+

Description

+

The file pointer in the file object increases in number of bytes read. The ByteRead will become less than ByteToRead when the read pointer reached to end of the file or any error occured during the read operation.

+
+ + +
+

References

+

f_open, f_write, f_close, FIL

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/readdir.html b/third_party/fatfs/doc/en/readdir.html new file mode 100644 index 0000000..5bf0004 --- /dev/null +++ b/third_party/fatfs/doc/en/readdir.html @@ -0,0 +1,89 @@ + + + + + + + +FatFs - f_readdir + + + + +
+

f_readdir

+

The f_readdir function reads directory entries.

+
+FRESULT f_readdir (
+  DIR* DirObject,    /* Pointer to the directory object structure */
+  FILINFO* FileInfo  /* Pointer to the file information structure */
+);
+
+
+ +
+

Parameters

+
+
DirObject
+
Pointer to the open directory strcture.
+
FileInfo
+
Pointer to the file information structure to store the read item.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_INVALID_OBJECT
+
The directory object is invalid.
+
+
+ + +
+

Description

+

The f_readdir function reads directory entries in sequence. All items in the directory can be read by calling f_readdir function repeatedly. When all directory items have been read and no item to read, the function returns a null string into f_name[] member without any error. For details of the file informations, refer to the FILINFO. This function is not supported in minimization level of >=2.

+
+ + +
+

Sample Code

+
+void scan_files (char* path)
+{
+    FILINFO finfo;
+    DIR dirs;
+    int i;
+
+    if (f_opendir(&dirs, path) == FR_OK) {
+        i = strlen(path);
+        while ((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0]) {
+            if (finfo.fattrib & AM_DIR) {
+                sprintf(path+i, "/%s", &finfo.fname[0]);
+                scan_files(path);
+                *(path+i) = '\0';
+            } else {
+                printf("%s/%s\n", path, &finfo.fname[0]);
+            }
+        }
+    }
+}
+
+
+ + +
+

References

+

f_opendir, f_stat, FILINFO, DIR

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/rename.html b/third_party/fatfs/doc/en/rename.html new file mode 100644 index 0000000..83bc6a2 --- /dev/null +++ b/third_party/fatfs/doc/en/rename.html @@ -0,0 +1,84 @@ + + + + + + + +FatFs - f_rename + + + + +
+

f_rename

+

Rename file or directory.

+
+FRESULT f_rename (
+  const char* OldName, /* Pointer to old file/directory name */
+  const char* NewName  /* Pointer to new file/directory name */
+);
+
+
+ +
+

Parameter

+
+
OldName
+
Pointer to a null-terminated string specifies the old file/directory name to be renamed.
+
NewName
+
Pointer to a null-terminated string specifies the new file/directory name without drive number. Existing object nannot be specified.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NO_FILE
+
Could not find the file nor directory.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The file name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_DENIED
+
The new name could not be created due to any reason.
+
FR_WRITE_PROTECTED
+
The medium is write protected.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT partition on the disk.
+
+
+ + +
+

Description

+

Rename a file or directory and can move it to other directory. Logical drive number is determined by old name, new name must not contain logical drive number. This function is not supported in read-only configuration or minimization level of >= 1.

+

Note: In this revision, moving any directory to other directory collapses the FAT structure on the disk.

+
+ + +
+

Example

+
+    // Rename file or directory
+    f_rename("oldname.txt", "newname.txt");
+
+    // Rename and move file to other directory simultaneously
+    f_rename("oldname.txt", "dir1/newname.txt");
+
+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/sdir.html b/third_party/fatfs/doc/en/sdir.html new file mode 100644 index 0000000..a60b3c9 --- /dev/null +++ b/third_party/fatfs/doc/en/sdir.html @@ -0,0 +1,42 @@ + + + + + + + +FatFs - DIR + + + + +
+

DIR

+

The DIR structure is used for the work area to read a directory by f_oepndir and f_readdir functions.

+

FatFs

+
+typedef struct _DIR {
+    WORD    id;          /* Owner file system mount ID (inverted) */
+    WORD    index;       /* Current index */
+    FATFS*  fs;          /* Pointer to the owner file system object */
+    DWORD   sclust;      /* Start cluster */
+    DWORD   clust;       /* Current cluster */
+    DWORD   sect;        /* Current sector */
+} DIR;
+
+

Tiny-FatFs

+
+typedef struct _DIR {
+    WORD    id;          /* Owner file system mount ID (inverted) */
+    WORD    index;       /* Current index */
+    FATFS*  fs;          /* Pointer to the owner file system object */
+    CLUST   sclust;      /* Start cluster */
+    CLUST   clust;       /* Current cluster */
+    DWORD   sect;        /* Current sector */
+} DIR;
+
+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/sfatfs.html b/third_party/fatfs/doc/en/sfatfs.html new file mode 100644 index 0000000..0878619 --- /dev/null +++ b/third_party/fatfs/doc/en/sfatfs.html @@ -0,0 +1,63 @@ + + + + + + + +FatFs - FATFS + + + + +
+

FATFS

+

The FATFS structure holds dynamic work area of individual logical drives. It is given by application program and registerd/unregisterd to the FatFs module with f_mount function. Following members are in standard configuration. There is no member that can be changed from the application program.

+

FatFs

+
+typedef struct _FATFS {
+    WORD    id;             /* File system mount ID */
+    WORD    n_rootdir;      /* Number of root directory entries */
+    DWORD   winsect;        /* Current sector appearing in the win[] */
+    DWORD   sects_fat;      /* Sectors per fat */
+    DWORD   max_clust;      /* Maximum cluster# + 1 */
+    DWORD   fatbase;        /* FAT start sector */
+    DWORD   dirbase;        /* Root directory start sector (cluster# for FAT32) */
+    DWORD   database;       /* Data start sector */
+    DWORD   last_clust;     /* Last allocated cluster */
+    DWORD   free_clust;     /* Number of free clusters */
+    BYTE    fs_type;        /* FAT type (0:Not mounted) */
+    BYTE    sects_clust;    /* Sectors per cluster */
+    BYTE    n_fats;         /* Number of FAT copies */
+    BYTE    drive;          /* Physical drive number */
+    BYTE    winflag;        /* win[] dirty flag (1:must be written back) */
+    BYTE    pad1;
+    BYTE    win[512];       /* Disk access window for Directory/FAT */
+} FATFS;
+
+ +

Tiny-FatFs

+
+typedef struct _FATFS {
+    WORD    id;             /* File system mount ID */
+    WORD    n_rootdir;      /* Number of root directory entries */
+    DWORD   winsect;        /* Current sector appearing in the win[] */
+    DWORD   fatbase;        /* FAT start sector */
+    DWORD   dirbase;        /* Root directory start sector */
+    DWORD   database;       /* Data start sector */
+    CLUST   sects_fat;      /* Sectors per fat */
+    CLUST   max_clust;      /* Maximum cluster# + 1 */
+    CLUST   last_clust;     /* Last allocated cluster */
+    CLUST   free_clust;     /* Number of free clusters */
+    BYTE    fs_type;        /* FAT type (0:Not mounted) */
+    BYTE    sects_clust;    /* Sectors per cluster */
+    BYTE    n_fats;         /* Number of FAT copies */
+    BYTE    winflag;        /* win[] dirty flag (1:must be written back) */
+    BYTE    win[512];       /* Disk access window for Directory/FAT/File */
+} FATFS;
+
+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/sfile.html b/third_party/fatfs/doc/en/sfile.html new file mode 100644 index 0000000..cdc2eeb --- /dev/null +++ b/third_party/fatfs/doc/en/sfile.html @@ -0,0 +1,55 @@ + + + + + + + +FatFs - FIL + + + + +
+

FIL

+

The FIL structure (file object) holds state of a file. It is created by f_open function and discarded by f_close function. There is no member that can be changed by the application program.

+ +

FatFs

+
+typedef struct _FIL {
+    WORD    id;             /* Owner file system mount ID (inverted) */
+    BYTE    flag;           /* File status flags */
+    BYTE    sect_clust;     /* Left sectors in cluster */
+    FATFS*  fs;             /* Pointer to the owner file system object */
+    DWORD   fptr;           /* File R/W pointer */
+    DWORD   fsize;          /* File size */
+    DWORD   org_clust;      /* File start cluster */
+    DWORD   curr_clust;     /* Current cluster */
+    DWORD   curr_sect;      /* Current sector */
+    DWORD   dir_sect;       /* Sector containing the directory entry */
+    BYTE*   dir_ptr;        /* Ponter to the directory entry in the window */
+    BYTE    buffer[512];    /* File R/W buffer */
+} FIL;
+
+ +

Tiny-FatFs

+
+typedef struct _FIL {
+    WORD    id;             /* Owner file system mount ID (inverted) */
+    BYTE    flag;           /* File status flags */
+    BYTE    sect_clust;     /* Left sectors in cluster */
+    FATFS*  fs;             /* Pointer to owner file system */
+    DWORD   fptr;           /* File R/W pointer */
+    DWORD   fsize;          /* File size */
+    CLUST   org_clust;      /* File start cluster */
+    CLUST   curr_clust;     /* Current cluster */
+    DWORD   curr_sect;      /* Current sector */
+    DWORD   dir_sect;       /* Sector containing the directory entry */
+    BYTE*   dir_ptr;        /* Ponter to the directory entry in the window */
+} FIL;
+
+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/sfileinfo.html b/third_party/fatfs/doc/en/sfileinfo.html new file mode 100644 index 0000000..f868d2f --- /dev/null +++ b/third_party/fatfs/doc/en/sfileinfo.html @@ -0,0 +1,43 @@ + + + + + + + +FatFs - FILINFO + + + + +
+

FILINFO

+

The FILINFO structure holds a file information returned by f_stat() and f_readdir().

+
+typedef struct _FILINFO {
+    DWORD fsize;            // Size
+    WORD fdate;             // Date
+    WORD ftime;             // Time
+    BYTE fattrib;           // Attribute
+    char fname[8+1+3+1];    // Name
+} FILINFO;
+
+
+ +

Members

+
+
fsize
+
Indicates size of the file in unit of byte. This is always zero when it is a directory.
+
fdate
+
Indicates the date that the file was modified or the directory was created.
+
ftime
+
Indicates the time that the file was modified or the directory was created.
+
fattrib
+
Indicates the file/directory attribute in combination of AM_DIR, AM_RDO, AM_HID, AM_SYS and AM_ARC.
+
fname[]
+
Indicates the file/directory name in 8.3 format null-terminated string.
+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/stat.html b/third_party/fatfs/doc/en/stat.html new file mode 100644 index 0000000..bd14356 --- /dev/null +++ b/third_party/fatfs/doc/en/stat.html @@ -0,0 +1,73 @@ + + + + + + + +FatFs - f_stat + + + + +
+

f_stat

+

The f_stat gets the file status.

+
+FRESULT f_stat (
+  const char* FileName,   /* Pointer to the file or directory name */
+  FILINFO* FileInfo       /* Pointer to the FILINFO structure */
+);
+
+
+ +
+

Parameters

+
+
FileName
+
Pointer to the null-terminated string that specifies the file or directory to get its information.
+
FileInfo
+
Pointer to the blank FILINFO structure to store the information.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NO_FILE
+
Could not find the file or directory.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The file name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT partition on the disk.
+
+
+ + +
+

Description

+

The f_stat gets the information of a file or directory. For details of the infomation, refer to the FILINFO structure. This function is not supported in minimization level of >= 1.

+
+ + +
+

References

+

f_opendir, f_readdir, FILINFO

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/sync.html b/third_party/fatfs/doc/en/sync.html new file mode 100644 index 0000000..2f5afbe --- /dev/null +++ b/third_party/fatfs/doc/en/sync.html @@ -0,0 +1,60 @@ + + + + + + + +FatFs - f_sync + + + + +
+

f_sync

+

The f_sync function flushes the cached information of a wriiting file.

+
+FRESULT f_sync (
+  FIL* FileObject     /* Pointer to the file object */
+);
+
+
+ +
+

Parameters

+
+
FileObject
+
Pointer to the open file object to be flushed.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_INVALID_OBJECT
+
The file object is invalid.
+
+
+ + +
+

Description

+

The f_sync function performs the same process as f_close function but the file is left opened and can continue read/write/seek operations to the file. This is suitable for applications that open files for a long time in writing mode, such as data logger. Performing f_sync of periodic or immediataly after f_write can minimize risk of data loss due to sudden blackout or unintentional disk removal. This function is not supported in read-only configuration.

+
+ + +
+

References

+

f_close

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/en/unlink.html b/third_party/fatfs/doc/en/unlink.html new file mode 100644 index 0000000..d0652b5 --- /dev/null +++ b/third_party/fatfs/doc/en/unlink.html @@ -0,0 +1,69 @@ + + + + + + + +FatFs - f_unlink + + + + +
+

f_unlink

+

The f_unlink removes file or directory.

+
+FRESULT f_unlink (
+  const char* FileName  /* Pointer to the file or directory name */
+);
+
+
+ +
+

Parameters

+
+
FileName
+
Pointer to the null-terminated string that specifies a file or directory to be removed.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_NO_FILE
+
Could not find the file or directory.
+
FR_NO_PATH
+
Could not find the path.
+
FR_INVALID_NAME
+
The path name is invalid.
+
FR_INVALID_DRIVE
+
The drive number is invalid.
+
FR_DENIED
+
The function was denied due to either of following reasons: the file or directory has read-only attribute, the directory is not empty.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_WRITE_PROTECTED
+
The medium is write protected.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_NOT_ENABLED
+
The logical drive has no work area.
+
FR_NO_FILESYSTEM
+
There is no valid FAT partition on the disk.
+
+
+ + +
+

Description

+

The f_unlink function removes a file or directory. In read-only configuration or minimization level is >= 1, this function is not supported.

+
+ + +

Return

+ + diff --git a/third_party/fatfs/doc/en/write.html b/third_party/fatfs/doc/en/write.html new file mode 100644 index 0000000..dcd4e84 --- /dev/null +++ b/third_party/fatfs/doc/en/write.html @@ -0,0 +1,71 @@ + + + + + + + +FatFs - f_write + + + + +
+

f_write

+

The f_write writes data to a file.

+
+FRESULT f_write (
+  FIL* FileObject,     /* Pointer to the file object structure */
+  const void* Buffer,  /* Pointer to the data to be written */
+  WORD ByteToWrite,    /* Number of bytes to write */
+  WORD* ByteWritten    /* Pointer to the variable to return number of bytes written */
+);
+
+
+ +
+

Parameter

+
+
FileObject
+
Pointer to the open file object structure.
+
Buffer
+
Pointer to the data to be written.
+
ByteToWrite
+
Specifies number of bytes to write.
+
ByteWritten
+
Pointer to the WORD variable to return number of bytes written.
+
+
+ + +
+

Return Values

+
+
FR_OK (0)
+
The function succeeded.
+
FR_DENIED
+
The function denied due to the file has been opened in read only mode.
+
FR_RW_ERROR
+
The function failed due to a disk error or an internal error.
+
FR_NOT_READY
+
The disk drive cannot work due to no medium in the drive or any other reason.
+
FR_INVALID_OBJECT
+
The file object is invalid.
+
+
+ + +
+

Description

+

The read/write pointer in the file object is increased in number of bytes written. The ByteWritten will become less than ByteToWrite when disk gets full during write function. This function is not supported in read-only configuration.

+
+ + +
+

References

+

f_open, f_read, f_close, FIL

+
+ +

Return

+ + diff --git a/third_party/fatfs/doc/img/f1.png b/third_party/fatfs/doc/img/f1.png new file mode 100644 index 0000000..42cc271 Binary files /dev/null and b/third_party/fatfs/doc/img/f1.png differ diff --git a/third_party/fatfs/doc/img/f2.png b/third_party/fatfs/doc/img/f2.png new file mode 100644 index 0000000..8ef0ec2 Binary files /dev/null and b/third_party/fatfs/doc/img/f2.png differ diff --git a/third_party/fatfs/doc/img/f3.png b/third_party/fatfs/doc/img/f3.png new file mode 100644 index 0000000..9111bfc Binary files /dev/null and b/third_party/fatfs/doc/img/f3.png differ diff --git a/third_party/fatfs/doc/img/f4.png b/third_party/fatfs/doc/img/f4.png new file mode 100644 index 0000000..35716ff Binary files /dev/null and b/third_party/fatfs/doc/img/f4.png differ diff --git a/third_party/fatfs/doc/img/f5.png b/third_party/fatfs/doc/img/f5.png new file mode 100644 index 0000000..855917a Binary files /dev/null and b/third_party/fatfs/doc/img/f5.png differ diff --git a/third_party/fatfs/doc/img/layers.png b/third_party/fatfs/doc/img/layers.png new file mode 100644 index 0000000..69773ee Binary files /dev/null and b/third_party/fatfs/doc/img/layers.png differ diff --git a/third_party/fatfs/doc/img/rw_ata.jpeg b/third_party/fatfs/doc/img/rw_ata.jpeg new file mode 100644 index 0000000..2b97d93 Binary files /dev/null and b/third_party/fatfs/doc/img/rw_ata.jpeg differ diff --git a/third_party/fatfs/doc/img/rw_cfc.jpeg b/third_party/fatfs/doc/img/rw_cfc.jpeg new file mode 100644 index 0000000..c92d5fe Binary files /dev/null and b/third_party/fatfs/doc/img/rw_cfc.jpeg differ diff --git a/third_party/fatfs/doc/img/rw_mmc.jpeg b/third_party/fatfs/doc/img/rw_mmc.jpeg new file mode 100644 index 0000000..5f8115e Binary files /dev/null and b/third_party/fatfs/doc/img/rw_mmc.jpeg differ diff --git a/third_party/fatfs/doc/img/rwtest.png b/third_party/fatfs/doc/img/rwtest.png new file mode 100644 index 0000000..d2e646f Binary files /dev/null and b/third_party/fatfs/doc/img/rwtest.png differ diff --git a/third_party/fatfs/doc/ja/appnote.html b/third_party/fatfs/doc/ja/appnote.html new file mode 100644 index 0000000..ab82799 --- /dev/null +++ b/third_party/fatfs/doc/ja/appnote.html @@ -0,0 +1,125 @@ + + + + + + + +FatFsƒ‚ƒWƒ…[ƒ‹ ƒAƒvƒŠƒP[ƒVƒ‡ƒ“Eƒm[ƒg + + + +

FatFsƒ‚ƒWƒ…[ƒ‹ ƒAƒvƒŠƒP[ƒVƒ‡ƒ“Eƒm[ƒg

+
+ +
+

ˆÚA‚ÌÛ‚É”z—¶‚·‚ׂ«‚±‚Æ

+

FatFsƒ‚ƒWƒ…[ƒ‹‚͈ÚA«‚ÉŠÖ‚µ‚ÄŽŸ‚Ì“_‚ð‘O’ñ‚Æ‚µ‚Ä‚¢‚Ü‚·B

+
    +
  • ˆ—Œn‚ÍANSI C€‹’‚Å‚ ‚邱‚ÆB
    +FatFsƒ‚ƒWƒ…[ƒ‹‚ÍANSI C€‹’‚Å‹Lq‚³‚ê‚Ä‚¢‚é‚Ì‚ÅAANSI C€‹’‚̃Rƒ“ƒpƒCƒ‰‚È‚ç“Á‚Ɉ—ŒnˆË‘¶‚È“_‚Í‚ ‚è‚Ü‚¹‚ñB‚½‚¾‚µAFAT‚Æ‚¢‚¤ƒVƒXƒeƒ€ŠÔ‚Ń|[ƒ^ƒuƒ‹‚È\‘¢‘Ì‚ð‘€ì‚·‚邽‚ßAƒvƒƒZƒbƒT‚̃Gƒ“ƒfƒBƒAƒ“‚̈Ⴂ‚͈ӎ¯‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B‚±‚ê‚Í ff.h(tff.h) ‚Å’è‹`‚³‚ê‚Ä‚¢‚é‚Ì‚ÅAʼn‚É‚±‚ê‚ð“KØ‚Éݒ肵‚Ü‚·(–Y‚ê‚Ä‚¢‚éꇂ̓Gƒ‰[‚ðo‚·)B
  • +
  • char/short/long ‚̃TƒCƒY‚ÍA‚»‚ꂼ‚ê 8/16/32ƒrƒbƒg ‚ÅAint‚Í 16ƒrƒbƒgˆÈã ‚Å‚ ‚邱‚ÆB
    +‚±‚ê‚Í integer.h “à‚Å typedef ‚³‚ê‚Ä‚¢‚Ü‚·B®”‚ÌŒ^‚ƃTƒCƒY‚ÉŠÖ‚µ‚Ä‚ÍA‚Ü‚Á‚Æ‚¤‚Ȉ—Œn‚È‚ç–â‘è‚È‚¢‚Í‚¸‚Å‚·‚ªAŠù‘¶‚Ì’è‹`‚ÆÕ“Ë‚µ‚½ê‡‚Í–µ‚‚ª‚È‚¢‚悤‚É’ˆÓ‚µ‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB
  • +
+
+ +
+

ƒƒ‚ƒŠŽg—p—Ê (R0.04b)

+

ŠeŽíŠÂ‹«‚ł̃‚ƒWƒ…[ƒ‹‚̃ƒ‚ƒŠŽg—p—ʂ̗á‚ðŽ¦‚µ‚Ü‚·B”’l‚Ì’PˆÊ‚̓oƒCƒg‚ÅAD‚͘_—ƒhƒ‰ƒCƒu”AF‚Í“¯ŽžƒI[ƒvƒ“Eƒtƒ@ƒCƒ‹”‚ðŽ¦‚µ‚Ü‚·BÅ“K‰»ƒIƒvƒVƒ‡ƒ“‚ÍA‘S‚ăR[ƒhEƒTƒCƒY‚Æ‚µ‚Ä‚¢‚Ü‚·B

+ + + + + + + + + + + + + + + + +
AVRH8/300HMSP430TLCS-870/CV850ESSH2
ƒRƒ“ƒpƒCƒ‰gccCH38CL430CC870CCA850SHC
_MCU_ENDIAN122112
FatFs ƒR[ƒh
(•W€, R/W\¬)
8722877664027338
FatFs ƒR[ƒh
(Ŭ, R/W\¬)
5814572240944906
FatFs ƒR[ƒh
(•W€, R/O\¬)
4248409630103506
FatFs ƒR[ƒh
(Ŭ, R/O\¬)
3038311022102698
FatFs ÓIƒ[ƒND*2 + 2D*4 + 2D*4 + 2D*4 + 2
FatFs “®“Iƒ[ƒND*554 + F*544D*554 + F*550D*554 + F*550D*554 + F*550
Tiny-FatFs ƒR[ƒh
(•W€, R/W\¬)
7264724066348837
Tiny-FatFs ƒR[ƒh
(Ŭ, R/W\¬)
4750480643666163
Tiny-FatFs ƒR[ƒh
(•W€, R/O\¬)
3600354832124347
Tiny-FatFs ƒR[ƒh
(Ŭ, R/O\¬)
2568270223943322
Tiny-FatFs ÓIƒ[ƒN4644
Tiny-FatFs “®“Iƒ[ƒN544 + F*28544 + F*32544 + F*28544 + F*28
+
+ +
+

FatFs vs. Tiny-FatFs

+

ƒ|[ƒ^ƒuƒ‹EƒI[ƒfƒBƒI‚âƒf[ƒ^EƒƒK[‚È‚ÇA‚æ‚­‚ ‚é—p“r‚Å‚ÍTiny-FatFs‚Å\•ª‚Å‚·B‚µ‚©‚µATiny-FatFs‚Í•W€\¬‚Å‚ÍFAT32‚ɑΉž‚µ‚Ä‚¢‚È‚¢‚Ì‚ÅAŽg—p‚Å‚«‚éƒfƒBƒXƒN‚Í2GB(FAT64‚Å4GB)‚܂łƂ¢‚¤§–ñ‚ª‚ ‚è‚Ü‚·B_FAT32ƒIƒvƒVƒ‡ƒ“‚ÅFAT32‘Ήž‚ð’ljÁ‚Å‚«‚Ü‚·‚ªA‚»‚Ì•ªƒR[ƒhEƒTƒCƒY‚ª–c‚ç‚݂܂·Bƒtƒ‹‹@”\‚ÌFatFs‚ÍA•¡”ƒtƒ@ƒCƒ‹‚ð‚‘¬ƒAƒNƒZƒX‚·‚éꇂâA•¡”ƒhƒ‰ƒCƒu‚̑Ήž‚ª•K—v‚ÈꇂɗLŒø‚Å‚·B

+
+ + + + + +
ƒƒ‚ƒŠ—e—ÊFATƒ^ƒCƒv
<= 64MBFAT12
128MB`2GBFAT16
>= 4GBFAT32
+
+

2GB‚܂ł̃J[ƒh‚ÉŒÀ‚é‚È‚çAFAT32‚ւ̑Ήž‚Í•s—v‚Å‚·B‰E‚Ì•\‚Ƀƒ‚ƒŠEƒJ[ƒh‚Ì—e—ʂƋK’è‚ÌFATƒ^ƒCƒv(SDƒƒ‚ƒŠ‚Ìê‡)‚ðŽ¦‚µ‚Ü‚·Bƒƒ‚ƒŠEƒJ[ƒh‚Ìo‰×Žž‚ÍAÅ‘å‚̃pƒtƒH[ƒ}ƒ“ƒX‚ªo‚邿‚¤‚Ƀf[ƒ^—̈æ‚Ì‹«ŠE‚ª’²®‚³‚ꂽƒtƒH[ƒ}ƒbƒg‚ɂȂÁ‚Ä‚¢‚Ü‚·B‚µ‚½‚ª‚Á‚ÄAPC‚ŃtƒH[ƒ}ƒbƒg‚·‚é‚Ȃǂµ‚Ä‹K’è‚Æˆá‚¤ƒtƒH[ƒ}ƒbƒg‚É‚È‚é‚ÆA‘‚«ž‚Ý«”\‚ª‘啂ɒቺ‚·‚éꇂª‚ ‚é‚̂ŒˆÓ‚ª•K—v‚Å‚·B

+
+ +
+

Œø—¦‚Ì—Ç‚¢ƒtƒ@ƒCƒ‹EƒAƒNƒZƒX‚Ì•û–@

+

Ž‘Œ¹‚ÌŒÀ‚ç‚ꂽ‘g‚Ýž‚݃VƒXƒeƒ€‚ÅŒø—¦‚æ‚­ƒAƒNƒZƒX‚·‚邽‚߂ɂÍAƒtƒ@ƒCƒ‹EƒAƒNƒZƒX‚ÌŽd‘g‚Ý‚ð‚ ‚é’ö“xˆÓޝ‚µ‚½Žg—p‚ª‹‚ß‚ç‚ê‚Ü‚·BFatFsƒ‚ƒWƒ…[ƒ‹‚Å‚ÍAƒfƒBƒXƒNã‚̃tƒ@ƒCƒ‹Eƒf[ƒ^‚Í f_read()“à‚ÅŽŸ‚̂悤‚Ȏ臂œǂÝo‚³‚ê‚Ü‚·B

+
}1. ƒZƒNƒ^Eƒ~ƒXƒAƒ‰ƒCƒƒ“ƒgEƒŠ[ƒh
+fig.1 +
+
+
}2. ƒZƒNƒ^Eƒ~ƒXƒAƒ‰ƒCƒƒ“ƒgEƒŠ[ƒh
+fig.2 +
+
+
}3. ƒZƒNƒ^EƒAƒ‰ƒCƒƒ“ƒgEƒŠ[ƒh
+fig.3 +
+
+

‚±‚±‚Ńtƒ@ƒCƒ‹I/Oƒoƒbƒtƒ@‚Æ‚ÍAƒf[ƒ^EƒZƒNƒ^‚̈ꕔ‚ð“ǂݑ‚«‚·‚邽‚ß‚Ì1ƒZƒNƒ^’·‚̃oƒbƒtƒ@‚ÅAFatFs‚ł͂»‚̃tƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg“à‚ÌATiny-FatFs‚ł̓[ƒNƒGƒŠƒA“à‚̃oƒbƒtƒ@‚Ì‚±‚Æ‚ðŽw‚µ‚Ä‚¢‚Ü‚·B

+

Tiny-FatFs‚Å‚ÍA‘S‚Ẵf[ƒ^“]‘—‚ÆFAT‚âƒfƒBƒŒƒNƒgƒŠ‚ւ̃AƒNƒZƒX‚ð‚½‚¾ˆê‚‚̃ZƒNƒ^Eƒoƒbƒtƒ@‚Ås‚Á‚Ä‚¢‚邽‚ßAƒf[ƒ^“]‘—‚É‚æ‚èFAT‚̃LƒƒƒbƒVƒ…‚ªŽ¸‚í‚êAƒNƒ‰ƒXƒ^‹«ŠE‚ð’ʉ߂·‚邽‚Ñ‚ÉFATƒZƒNƒ^‚ð“ǂݒ¼‚·•K—v‚ª‚ ‚è‚Ü‚·BFatFs‚ÌꇂÍAƒf[ƒ^—pƒoƒbƒtƒ@‚ÍFAT—p‚Ƃ͕ʂȂ̂ÅAFATƒZƒNƒ^‚ð“ǂޕp“x‚ÍTiny-FatFs‚Ì 1/341, 1/256 ‚Ü‚½‚Í 1/128‚Åς݂܂·(ƒNƒ‰ƒXƒ^‚ª˜A‘±‚µ‚Ä‚¢‚éê‡)B‚‚܂èATiny-FatFs‚Í«”\’ቺ‚̑㞂𕥂Á‚ÄRAMŽg—p—Ê‚ð팸‚µ‚Ä‚¢‚é‚킯‚Å‚·B

+

“]‘——̈æ‚Ì‚¤‚¿ƒZƒNƒ^‘S‘Ì‚ðŠÜ‚Þ•”•ª‚Í(}2)‚̂悤‚Ƀtƒ@ƒCƒ‹I/Oƒoƒbƒtƒ@‚ð‰î‚³‚¸AƒfƒBƒXƒN‚Ƃ̊ԂŒ¼Ú“]‘—‚³‚ê‚Ü‚·BŠ®‘S‚ȃZƒNƒ^EƒAƒ‰ƒCƒƒ“ƒgEƒAƒNƒZƒX‚Ìê‡(}3)‚ÍAƒtƒ@ƒCƒ‹I/Oƒoƒbƒtƒ@‚Í‘S‚­Žg—p‚³‚ê‚Ü‚¹‚ñB’¼Ú“]‘—‚Å‚ÍA‰Â”\‚È‚çdisk_read()‚É•¡”ƒZƒNƒ^‚ðŽw’肵‚ÄÅ‘åŒÀ‚̃}ƒ‹ƒ`EƒZƒNƒ^“]‘—‚ªs‚í‚ê‚Ü‚·B‚½‚¾‚µAƒNƒ‰ƒXƒ^‹«ŠE‚ð‚Ü‚½‚®‚Æ‚«‚̓Nƒ‰ƒXƒ^‚ª—×Ú‚µ‚Ä‚¢‚½‚Æ‚µ‚Ä‚à“]‘—‚Í•ªŠ„‚³‚ê‚Ü‚·B

+

‚±‚̂悤‚ÉA‹É—̓ZƒNƒ^EƒAƒ‰ƒCƒƒ“ƒgEƒAƒNƒZƒX‚É‚È‚é‚æ‚¤‚É”z—¶‚·‚ê‚ÎA–³‘ʂȃƒ‚ƒŠEƒRƒs[‚ªŒ¸‚Á‚Ä«”\‚ªŒüサ‚Ü‚·B‚³‚ç‚ÉATiny-FatFs‚Å‚ÍFAT‚̃LƒƒƒbƒVƒ…‚ª¶‚«‚邿‚¤‚ɂȂèAȃƒ‚ƒŠ“Á«‚ÆFatFs‚Ì«”\‚Æ‚ª“¯Žž‚É“¾‚ç‚ê‚Ü‚·B

+
+ +
+

ƒNƒŠƒ`ƒJƒ‹EƒZƒNƒVƒ‡ƒ“

+

ƒfƒBƒXƒNã‚ÌFAT\‘¢‚ð‘€ì‚µ‚Ä‚¢‚é“r’†‚ÅA’â“dA•s³‚ȃƒfƒBƒA‚ÌŽæ‚èŠO‚µA‰ñ•œ•s”\‚ȃf[ƒ^EƒGƒ‰[“™‚ÌáŠQ‚ª”­¶‚·‚邯Aˆ—‚ª’†“r”¼’[‚Èó‘Ô‚Å’†’f‚³‚êA‚»‚ÌŒ‹‰Ê‚Æ‚µ‚ÄFAT\‘¢‚ª”j‰ó‚³‚ê‚é‰Â”\«‚ª‚ ‚è‚Ü‚·BŽŸ‚ÉFatFsƒ‚ƒWƒ…[ƒ‹‚É‚¨‚¯‚éƒNƒŠƒ`ƒJƒ‹EƒZƒNƒVƒ‡ƒ“‚ÆA‚»‚ÌŠÔ‚ÌáŠQ‚É‚æ‚è‹N‚«‚¤‚éƒGƒ‰[‚Ìó‘Ô‚ðŽ¦‚µ‚Ü‚·B

+
+}4. ’·‚¢ƒNƒŠƒ`ƒJƒ‹EƒZƒNƒVƒ‡ƒ“
+fig.4 +
+
+}5. ’Z‚­‚µ‚½ƒNƒŠƒ`ƒJƒ‹EƒZƒNƒVƒ‡ƒ“
+fig.5 +
+
+

Ô‚ÅŽ¦‚µ‚½ƒZƒNƒVƒ‡ƒ“‚ðŽÀs’†‚ÉáŠQ‚ª”­¶‚µ‚½ê‡AƒNƒƒXEƒŠƒ“ƒN‚ª”­¶‚µ‚Ä‘€ì‘Îۂ̃tƒ@ƒCƒ‹EƒfƒBƒŒƒNƒgƒŠ‚ªŽ¸‚í‚ê‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B‰©F‚ÅŽ¦‚µ‚½ƒZƒNƒVƒ‡ƒ“‚ðŽÀs’†‚ÉáŠQ‚ª”­¶‚µ‚½ê‡A‚‚¬‚Ì‚¤‚¿‚¢‚¸‚ê‚©‚Ü‚½‚Í•¡”‚ÌŒ‹‰Ê‚ª¶‚¶‚é‰Â”\«‚ª‚ ‚è‚Ü‚·B

+
    +
  • ‘‚«Š·‚¦’†‚̃tƒ@ƒCƒ‹‚Ì“à—e‚ª”j‰ó‚³‚ê‚éB
  • +
  • ’Ç‹L’†‚̃tƒ@ƒCƒ‹‚ªƒI[ƒvƒ“‘O‚Ìó‘Ô‚É–ß‚éB
  • +
  • V‹K‚É쬂³‚ꂽƒtƒ@ƒCƒ‹‚ªÁ‚¦‚éB
  • +
  • V‹K‚Ü‚½‚Íã‘‚«‚Å쬂³‚ꂽƒtƒ@ƒCƒ‹‚Ì’·‚³‚ªƒ[ƒ‚ɂȂÁ‚ÄŽc‚éB
  • +
  • ƒƒXƒgƒ`ƒF[ƒ“‚Ì”­¶‚É‚æ‚èƒfƒBƒXƒN‚Ì—˜—pŒø—¦‚ªˆ«‰»‚·‚éB
  • +
+

‚¢‚¸‚ê‚à‘‚«ž‚Ý’†‚â‘€ì‘ÎۂłȂ¢ƒtƒ@ƒCƒ‹‚ɂ͉e‹¿‚Í‚ ‚è‚Ü‚¹‚ñB‚±‚ê‚ç‚̃NƒŠƒ`ƒJƒ‹EƒZƒNƒVƒ‡ƒ“‚ÍAƒtƒ@ƒCƒ‹‚ð‘‚«ž‚݃‚[ƒh‚ÅŠJ‚¢‚Ä‚¢‚鎞ŠÔ‚ðŬŒÀ‚É‚·‚é‚©Af_sync()‚ð“K‹XŽg—p‚·‚邱‚Æ‚Å}5‚̂悤‚ÉƒŠƒXƒN‚ðŬ‰»‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

+
+ + +
+

Œ»ƒŠƒrƒWƒ‡ƒ“‚Ì–â‘è“_‚Æ‚»‚̉ü‘PˆÄ

+
    +
  • ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚Ì’ŠÛ‰»
    +Œ»Ý‚̓tƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ÌŽÀ‘Ì‚ðƒAƒvƒŠƒP[ƒVƒ‡ƒ“‘¤‚ÅŠÇ—‚µ‚Ä‚¢‚é‚Ì‚ÅAƒAƒvƒŠƒP[ƒVƒ‡ƒ“Eƒ‚ƒWƒ…[ƒ‹‚ł̃Xƒ^ƒbƒNÁ”ï—Ê‚ª‘½‚­‚È‚è‚Ü‚·(Tiny-FatFs‚ł͖â‘è‚ɂȂç‚È‚¢)B‚±‚ê‚ðƒnƒ“ƒhƒ‹‚ÅŠÇ—‚·‚é‚Ȃǂæ‚è’ŠÛ‰»‚·‚ê‚΃AƒvƒŠƒP[ƒVƒ‡ƒ“Eƒ‚ƒWƒ…[ƒ‹‚ł̃Xƒ^ƒbƒNÁ”ï—Ê‚ðŒ¸‚ç‚¹‚邵A‘¼‚̃tƒ@ƒCƒ‹EƒVƒXƒeƒ€‚ւ̑Ήž‚à—eˆÕ‚ɂȂè‚Ü‚·B‚±‚Ìê‡AFatFs“à‚Ńtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚̗̈æ‚ðÓI‚ÉŠm•Û‚µ‚Ä‚¨‚­‚©Amalloc()‚·‚邱‚ƂɂȂè‚Ü‚·B‚½‚¾‚µA‚±‚̂悤‚É‚·‚邯ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ð’¼ÚŽQƂł«‚È‚­‚È‚èAfeof‚âftell‚Ȃǃ€ƒ_‚ÈŠÖ”‚ªV‚½‚É•K—v‚ɂȂè‚Ü‚·B
  • +
  • ƒZƒNƒ^Eƒoƒbƒtƒ@ŠÇ—‚̉ü‘P
    +Œ»Ý‚̓ZƒNƒ^Eƒoƒbƒtƒ@‚ðŒÅ’肵‚ÄŽg—p‚µ‚Ä‚¢‚邽‚ßA–³‘ʂȃfƒBƒXƒNƒAƒNƒZƒX‚ª‘½‚­Œø—¦‚ªˆ«‚¢Bƒƒ‚ƒŠ‚Ì‘ò‚ȃVƒXƒeƒ€‚Å‚ÍA•¡”‚̃ZƒNƒ^Eƒoƒbƒtƒ@‚ðŽg—p‚µ‚ăfƒBƒXƒNEƒLƒƒƒbƒVƒ…‚ð\¬‚·‚ê‚Ϋ”\‚ðŒüコ‚¹‚邱‚Æ‚ª‚Å‚«‚Ü‚·B
  • +
  • ’·‚¢ƒtƒ@ƒCƒ‹–¼‚ւ̑Ήž
    +FAT‚ÌŠg’£Žd—l‚Å‚ÍMS-DOS‚Ì8.3Œ`Ž®ƒtƒ@ƒCƒ‹–¼‚ɉÁ‚¦A255•¶Žš‚܂ł̒·‚¢ƒtƒ@ƒCƒ‹–¼(LFN)‚ðˆµ‚¦‚邿‚¤‚ɂȂÁ‚Ä‚¢‚Ü‚·‚ªAŒ»ƒŠƒrƒWƒ‡ƒ“‚ł͖¢‘Ήž‚Å8.3Œ`Ž®‚µ‚©Žg—p‚Å‚«‚Ü‚¹‚ñB‚±‚ê‚ɑΉž‚·‚é‚É‚ÍAƒtƒ@ƒCƒ‹–¼‚¾‚¯‚Å‚à500ƒoƒCƒgˆÈã‚̃oƒbƒtƒ@‚ª•K—v‚ɂȂÁ‚½‚èAUCS-2‚ÆShift_JIS‚Ì‘ŠŒÝ•ÏŠ·(‹‘å‚ȕϊ·ƒe[ƒuƒ‹‚ðŽg‚¤)‚ª•K—v‚ƂȂé‚È‚ÇAƒƒ‚ƒŠ‚ÌÁ””š”­“I‚É‘‚¦‚Ä‚µ‚Ü‚¢‚Ü‚·B‚È‚¨ALFN‚Ì‹@”\‚ÍMicrosoftŽÐ‚Ì“Á‹–‚ɂȂÁ‚Ä‚¢‚邽‚ßA‚±‚ê‚ð»•i‚ÉŽg‚¤‚ɂ̓‰ƒCƒZƒ“ƒXŒ_–ñ‚ª•K—v‚Å‚·B
  • +
  • RTOS‚ւ̑Ήž
    +FatFsƒ‚ƒWƒ…[ƒ‹‚ðŽg—p‚·‚éƒ^ƒXƒN‚ðˆê‚‚ɌÀ‚é‚È‚ç“Á‚Ɉӎ¯‚·‚é•K—v‚Í‚ ‚è‚Ü‚¹‚ñ‚ªA“¯‚¶˜_—ƒhƒ‰ƒCƒu‚É•¡”‚̃^ƒXƒN‚©‚ç“¯ŽžƒAƒNƒZƒX‚·‚é‚É‚ÍA‰½‚ç‚©‚Ì”r‘¼§Œä‚ª•K—v‚ɂȂÁ‚Ä‚«‚Ü‚·BFatFsƒ‚ƒWƒ…[ƒ‹‚ÌRTOS‚ւ̑Ήžì‹Æ‚ÍATOPPERSƒvƒƒWƒFƒNƒg‚Ås‚í‚ê‚Ä‚¢‚Ü‚·B
  • +
+
+

‚»‚µ‚ÄA‚±‚ê‚ç‚Ì‹@”\Šg’£‚ðs‚¤‚Æ‚»‚ꂾ‚¯‘½‚­‚ÌƒŠƒ\[ƒX‚ª—v‹‚³‚ê‚邿‚¤‚ɂȂèA‚±‚̃vƒƒWƒFƒNƒg‚Ì‘ÎÛ‚Æ‚·‚é8/16ƒrƒbƒgEƒ}ƒCƒRƒ“‚̃VƒXƒeƒ€‚ÉÚ‚¹‚ç‚ê‚È‚­‚È‚Á‚Ä‚µ‚Ü‚¤‚Æ‚¢‚¤–â‘è‚à‚ ‚è‚Ü‚·(‚±‚ꂪˆê”Ô‚Ì–â‘è‚©‚à’m‚ê‚Ü‚¹‚ñ)B

+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/chmod.html b/third_party/fatfs/doc/ja/chmod.html new file mode 100644 index 0000000..8c76674 --- /dev/null +++ b/third_party/fatfs/doc/ja/chmod.html @@ -0,0 +1,89 @@ + + + + + + + +FatFs - f_chmod + + + + +
+

f_chmod

+

ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚Ì‘®«‚ð•ÏX‚µ‚Ü‚·B

+
+FRESULT f_chmod (
+  const char* FileName, /* ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ–¼‚ւ̃|ƒCƒ“ƒ^ */
+  BYTE Attribute,       /* Ý’è’l */
+  BYTE AttributeMask    /* •ÏXƒ}ƒXƒN */
+);
+
+
+ +
+

ˆø”

+
+
FileName
+
‘®«•ÏX‘Îۂ̃tƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚̃tƒ‹ƒpƒX–¼‚Ì“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ðŽw’肵‚Ü‚·B
+
Attribute
+
Ý’è‚·‚é‘®«BŽw’è‰Â”\‚È‘®«‚ÍŽŸ‚Ì’Ê‚è‚ÅA‚±‚ê‚ç‚Ì‘g‚݇‚킹‚ÅŽw’肵‚Ü‚·BŽw’肳‚ê‚È‚©‚Á‚½‘®«‚͉𜂳‚ê‚Ü‚·B
+ + + + + + +
’lˆÓ–¡
AM_RDOƒŠ[ƒhEƒIƒ“ƒŠ[
AM_ARCƒA[ƒJƒCƒu
AM_SYSƒVƒXƒeƒ€
AM_HIDƒqƒhƒDƒ“
+
+
AttributeMask
+
•ÏX‚·‚é‘®«‚̃}ƒXƒNBŽw’肵‚½‘®«‚ªÝ’è‚Ü‚½‚͉𜂳‚êAŽw’肳‚ê‚È‚©‚Á‚½‘®«‚Íó‘Ô‚ª•ÛŽ‚³‚ê‚Ü‚·BAttribute‚Æ“¯‚¶’l‚ðŽg‚¢‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_FILE
+
ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_NAME
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘ÔB
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
‚»‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ª—^‚¦‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒp[ƒe[ƒVƒ‡ƒ“‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚Ì‘®«‚ð•ÏX‚µ‚Ü‚·BƒŠ[ƒhEƒIƒ“ƒŠ[\¬‚¨‚æ‚Ñ_FS_MINIMIZE >= 1‚ł͂±‚ÌŠÖ”‚̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+
+ + +
+

Žg—p—á

+
+    // Set read-only flag , clear archive flag and others are left unchanged.
+    f_chmod("file.txt", AM_RDO, AM_RDO | AM_ARC);
+
+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/close.html b/third_party/fatfs/doc/ja/close.html new file mode 100644 index 0000000..2da739a --- /dev/null +++ b/third_party/fatfs/doc/ja/close.html @@ -0,0 +1,60 @@ + + + + + + + +FatFs - f_close + + + + +
+

f_close

+

ƒtƒ@ƒCƒ‹‚ð•‚¶‚Ü‚·B

+
+FRESULT f_close (
+  FIL* FileObject     /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
•‚¶‚悤‚Æ‚·‚éƒtƒ@ƒCƒ‹‚̃tƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_INVALID_OBJECT
+
–³Œø‚ȃtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒgB
+
+
+ + +
+

‰ðà

+

ƒtƒ@ƒCƒ‹‚ð•‚¶‚Ü‚·B‘‚«ž‚Ý‚Ìs‚í‚ꂽƒtƒ@ƒCƒ‹‚Ìê‡AƒLƒƒƒbƒVƒ…‚³‚ꂽó‘ÔiR/Wƒoƒbƒtƒ@ã‚̃f[ƒ^A•ÏX‚³‚ꂽFAT‚âƒfƒBƒŒƒNƒgƒŠ€–Új‚̓fƒBƒXƒN‚É‘‚«–ß‚³‚ê‚Ü‚·BŠÖ”‚ª³íI—¹‚·‚邯A‚»‚̃tƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚Í–³Œø‚ɂȂèA‚»‚̃ƒ‚ƒŠ‚à‰ð•ú‚Å‚«‚Ü‚·B“ǂݞ‚Ýê—pƒ‚[ƒh‚ÅŠJ‚©‚ꂽƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ÍA‚±‚ÌŠÖ”‚É‚æ‚éƒNƒ[ƒYˆ—‚ðŒo‚¸‚É”jŠü‚·‚邱‚Æ‚à‚Å‚«‚Ü‚·B

+
+ + + + +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/dinit.html b/third_party/fatfs/doc/ja/dinit.html new file mode 100644 index 0000000..7a32450 --- /dev/null +++ b/third_party/fatfs/doc/ja/dinit.html @@ -0,0 +1,44 @@ + + + + + + + +FatFs - disk_initialize + + + + +
+

disk_initialize

+

ƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ð‰Šú‰»‚µ‚Ü‚·B

+
+DSTATUS disk_initialize (
+  BYTE Drive      /* •¨—ƒhƒ‰ƒCƒu”Ô† */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
‰Šú‰»‚·‚镨—ƒhƒ‰ƒCƒu”Ô†(0-9)‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+

‚±‚ÌŠÖ”‚Í–ß‚è’l‚Æ‚µ‚ăfƒBƒXƒNEƒXƒe[ƒ^ƒX‚ð•Ô‚µ‚Ü‚·BƒfƒBƒXƒNEƒXƒe[ƒ^ƒX‚ÌÚׂɊւµ‚Ä‚Ídisk_status()‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B

+
+ +
+

‰ðà

+

ƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ð‰Šú‰»‚µ‚Ü‚·BŠÖ”‚ª¬Œ÷‚·‚邯A–ß‚è’l‚ÌSTA_NOINITƒtƒ‰ƒO‚ªƒNƒŠƒA‚³‚ê‚Ü‚·B

+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/dioctl.html b/third_party/fatfs/doc/ja/dioctl.html new file mode 100644 index 0000000..519f7c6 --- /dev/null +++ b/third_party/fatfs/doc/ja/dioctl.html @@ -0,0 +1,65 @@ + + + + + + + +FatFs - disk_ioctl + + + + +
+

disk_ioctl

+

ƒZƒNƒ^‚̓ǂݑ‚«ˆÈŠO‚̃fƒBƒXƒNEƒhƒ‰ƒCƒuŽ©‘̂ɑ΂·‚é—lX‚ȧŒä‚ð‚µ‚Ü‚·B

+
+DRESULT disk_ioctl (
+  BYTE Drive,      /* •¨—ƒhƒ‰ƒCƒu”Ô† */
+  BYTE Command,    /* §ŒäƒRƒ}ƒ“ƒh */
+  void* Buffer     /* ƒf[ƒ^Žó‚¯“n‚µƒoƒbƒtƒ@ */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
•¨—ƒhƒ‰ƒCƒu”Ô†(0-9)‚ðŽw’肵‚Ü‚·B
+
Command
+
§ŒäƒRƒ}ƒ“ƒhEƒR[ƒh‚ðŽw’肵‚Ü‚·B
+
Buffer
+
§ŒäƒRƒ}ƒ“ƒh‚Ɉˑ¶‚µ‚½ƒpƒ‰ƒ[ƒ^‚ðŽöŽó‚·‚éƒoƒbƒtƒ@‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·Bƒoƒbƒtƒ@‚ðŽg—p‚µ‚È‚¢ƒRƒ}ƒ“ƒh‚ÌꇂÍANULL‚ðŽw’肵‚Ü‚·B
+
+
+ +
+

–ß‚è’l

+
+
RES_OK (0)
+
³íI—¹B
+
RES_ERROR
+
‰½‚ç‚©‚̃Gƒ‰[‚ª”­¶‚µ‚½B
+
RES_PARERR
+
ƒRƒ}ƒ“ƒh‚ª•s³B
+
RES_NOTRDY
+
ƒhƒ‰ƒCƒu‚ª“®ì‰Â”\ó‘Ԃł͂Ȃ¢A‚Ü‚½‚͉Šú‰»‚³‚ê‚Ä‚¢‚È‚¢B
+
+
+ +
+

‰ðà

+

•¨—ƒhƒ‰ƒCƒu‚ÌŽí—Þ‚É‚æ‚èƒTƒ|[ƒg‚³‚ê‚éƒRƒ}ƒ“ƒh‚͈قȂè‚Ü‚·‚ªAFatFsƒ‚ƒWƒ…[ƒ‹‚Å‚ÍAƒhƒ‰ƒCƒu‚ÌŽí—ނɈˑ¶‚µ‚½§Œä‚Ís‚¢‚Ü‚¹‚ñBŽŸ‚̃hƒ‰ƒCƒu‹¤’ʃRƒ}ƒ“ƒh‚ðŽg—p‚µ‚Ü‚·B

+

ƒŠ[ƒhEƒIƒ“ƒŠ[\¬‚ł͂±‚ÌŠÖ”‚Í•K—v‚Æ‚³‚ê‚Ü‚¹‚ñB

+ + + + +
ƒRƒ}ƒ“ƒh‰ðà
GET_SECTOR_COUNTBuffer‚ÌŽw‚·DWORD•Ï”‚Ƀhƒ‰ƒCƒuã‚Ì‘ƒZƒNƒ^”‚ð•Ô‚µ‚Ü‚·B
CTRL_SYNCƒhƒ‰ƒCƒu‚ªƒf[ƒ^‚Ì‘‚«ž‚Ý‚ðŠ®—¹‚·‚é‚Ì‚ð‘Ò‚¿‚Ü‚·Bƒ‰ƒCƒgEƒoƒbƒNEƒLƒƒƒbƒVƒ…‚ðŽ‚Á‚Ä‚¢‚éꇂÍA‘‚«ž‚Ü‚ê‚Ä‚¢‚È‚¢ƒf[ƒ^‚𑦎ž‘‚«–ß‚µ‚Ü‚·B
+
+ + +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/dread.html b/third_party/fatfs/doc/ja/dread.html new file mode 100644 index 0000000..f665b04 --- /dev/null +++ b/third_party/fatfs/doc/ja/dread.html @@ -0,0 +1,58 @@ + + + + + + + +FatFs - disk_read + + + + +
+

disk_read

+

ƒfƒBƒXƒN‚©‚çƒZƒNƒ^‚ð“Ç‚Ýo‚µ‚Ü‚·B

+
+DRESULT disk_read (
+  BYTE Drive,          /* •¨—ƒhƒ‰ƒCƒu”Ô† */
+  BYTE* Buffer,        /* “Ç‚Ýo‚µƒoƒbƒtƒ@‚ւ̃|ƒCƒ“ƒ^ */
+  DWORD SectorNumber,  /* “Ç‚Ýo‚µŠJŽnƒZƒNƒ^”Ô† */
+  BYTE SectorCount     /* “Ç‚Ýo‚µƒZƒNƒ^” */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
•¨—ƒhƒ‰ƒCƒu”Ô†(0-9)‚ðŽw’肵‚Ü‚·B
+
Buffer
+
ƒfƒBƒXƒN‚©‚ç“Ç‚Ýo‚µ‚½ƒf[ƒ^‚ðŠi”[‚·‚éƒoƒbƒtƒ@BSectorCount * 512ƒoƒCƒg‚̃TƒCƒY‚ª•K—v‚Å‚·B
+
SectorNumber
+
“Ç‚Ýo‚µ‚ðŠJŽn‚·‚éƒZƒNƒ^”Ô†BLBA‚ÅŽw’肵‚Ü‚·B
+
SectorCount
+
“Ç‚Ýo‚·ƒZƒNƒ^”B 1`255‚Åݒ肵‚Ü‚·
+
+
+ + +
+

–ß‚è’l

+
+
RES_OK (0)
+
³íI—¹B
+
RES_ERROR
+
“ǂݞ‚Ý’†‚ɃGƒ‰[‚ª”­¶‚µ‚½B
+
RES_PARERR
+
ƒpƒ‰ƒ[ƒ^‚ª•s³B
+
RES_NOTRDY
+
ƒhƒ‰ƒCƒu‚ª“®ì‰Â”\ó‘Ԃł͂Ȃ¢i‰Šú‰»‚³‚ê‚Ä‚¢‚È‚¢jB
+
+
+ + +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/dstat.html b/third_party/fatfs/doc/ja/dstat.html new file mode 100644 index 0000000..9e04ccb --- /dev/null +++ b/third_party/fatfs/doc/ja/dstat.html @@ -0,0 +1,47 @@ + + + + + + + +FatFs - disk_status + + + + +
+

disk_status

+

ƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚Ìó‘Ô‚ðŽæ“¾‚µ‚Ü‚·B

+
+DSTATUS disk_status (
+  BYTE Drive           /* •¨—ƒhƒ‰ƒCƒu”Ô† */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
ƒXƒe[ƒ^ƒX‚ðŽæ“¾‚·‚镨—ƒhƒ‰ƒCƒu”Ô†‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+

•¨—ƒhƒ‰ƒCƒu‚Ìó‘Ô‚ªŽŸ‚̃tƒ‰ƒO‚Ì‘g‚݇‚킹‚Ì’l‚ŕԂ³‚ê‚Ü‚·B

+
+
STA_NOINIT
+
ƒhƒ‰ƒCƒu‚ª‰Šú‰»‚³‚ê‚Ä‚¢‚È‚¢‚±‚Æ‚ðŽ¦‚·ƒtƒ‰ƒOBƒVƒXƒeƒ€EƒŠƒZƒbƒg‚⃃fƒBƒA‚ÌŽæ‚èŠO‚µ“™‚ŃZƒbƒg‚³‚êAdisk_initialize() ‚̳íI—¹‚ŃNƒŠƒAAޏ”s‚ŃZƒbƒg‚³‚ê‚Ü‚·B
+
STA_NODISK
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚±‚Æ‚ðŽ¦‚·ƒtƒ‰ƒOBƒƒfƒBƒA‚ªŽæ‚èŠO‚³‚ê‚Ä‚¢‚éŠÔ‚̓Zƒbƒg‚³‚êAƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚éŠÔ‚̓NƒŠƒA‚³‚ê‚Ü‚·BŒÅ’èƒfƒBƒXƒN‚Å‚Íí‚ɃNƒŠƒA‚³‚ê‚Ä‚¢‚Ü‚·B
+
STA_PROTECTED
+
ƒƒfƒBƒA‚ªƒ‰ƒCƒgEƒvƒƒeƒNƒg‚³‚ê‚Ä‚¢‚邱‚Æ‚ðŽ¦‚·ƒtƒ‰ƒOBƒ‰ƒCƒgEƒvƒƒeƒNƒg‹@”\‚ðƒTƒ|[ƒg‚µ‚È‚¢ƒƒfƒBƒA‚Å‚Íí‚ɃNƒŠƒA‚³‚ê‚Ä‚¢‚Ü‚·B
+
+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/dwrite.html b/third_party/fatfs/doc/ja/dwrite.html new file mode 100644 index 0000000..15eb2b2 --- /dev/null +++ b/third_party/fatfs/doc/ja/dwrite.html @@ -0,0 +1,66 @@ + + + + + + + +FatFs - disk_write + + + + +
+

disk_write

+

ƒfƒBƒXƒN‚Ƀf[ƒ^‚ð‘‚«ž‚݂܂·B

+
+DRESULT disk_write (
+  BYTE Drive,          /* •¨—ƒhƒ‰ƒCƒu”Ô† */
+  const BYTE* Buffer,  /* ‘‚«ž‚Þƒf[ƒ^‚ւ̃|ƒCƒ“ƒ^ */
+  DWORD SectorNumber,  /* ‘‚«ž‚ÝŠJŽnƒZƒNƒ^”Ô† */
+  BYTE SectorCount     /* ‘‚«ž‚݃ZƒNƒ^” */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
•¨—ƒhƒ‰ƒCƒu”Ô†(0-9)‚ðŽw’肵‚Ü‚·B
+
Buffer
+
ƒfƒBƒXƒN‚É‘‚«ž‚Þƒf[ƒ^‚ðŽw’肵‚Ü‚·B
+
SectorNumber
+
‘‚«ž‚Ý‚ðŠJŽn‚·‚éƒZƒNƒ^”Ô†BLBA‚ÅŽw’肵‚Ü‚·B
+
SectorCount
+
‘‚«ž‚ÞƒZƒNƒ^”B 1`255‚Åݒ肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
RES_OK (0)
+
³íI—¹B
+
RES_ERROR
+
‘‚«ž‚Ý’†‚ɃGƒ‰[‚ª”­¶‚µ‚½B
+
RES_WRPRT
+
ƒfƒBƒXƒN‚ª‘‚«ž‚݋֎~ó‘ÔB
+
RES_PARERR
+
ƒpƒ‰ƒ[ƒ^‚ª•s³B
+
RES_NOTRDY
+
ƒhƒ‰ƒCƒu‚ª“®ì‰Â”\ó‘Ԃł͂Ȃ¢i‰Šú‰»‚³‚ê‚Ä‚¢‚È‚¢jB
+
+
+ + +
+

‰ðà

+

ƒŠ[ƒhEƒIƒ“ƒŠ[\¬‚ł͂±‚ÌŠÖ”‚Í•K—v‚Æ‚³‚ê‚Ü‚¹‚ñB

+
+ + +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/fattime.html b/third_party/fatfs/doc/ja/fattime.html new file mode 100644 index 0000000..5473557 --- /dev/null +++ b/third_party/fatfs/doc/ja/fattime.html @@ -0,0 +1,50 @@ + + + + + + + +FatFs - get_fattime + + + + +
+

get_fattime

+

Œ»ÝŽž‚ðŽæ“¾‚µ‚Ü‚·B

+
+DWORD get_fattime (void);
+
+
+ + +
+

–ß‚è’l

+

Œ»Ý‚̃[ƒJƒ‹Eƒ^ƒCƒ€‚ªDWORD’l‚ɃpƒbƒN‚³‚ê‚ĕԂ³‚ê‚Ü‚·BƒrƒbƒgEƒtƒB[ƒ‹ƒh‚ÍŽŸ‚ÉŽ¦‚·‚悤‚ɂȂè‚Ü‚·B

+
+
bit31:25
+
1980”N‚ð‹N“_‚Æ‚µ‚½”N‚ª 0..127 ‚Å“ü‚è‚Ü‚·B
+
bit24:21
+
ŒŽ‚ª 1..12 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
bit20:16
+
“ú‚ª 1..31 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
bit15:11
+
Žž‚ª 0..23 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
bit10:5
+
•ª‚ª 0..59 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
bit4:0
+
•b/2‚ª 0..29 ‚Ì’l‚Å“ü‚è‚Ü‚·B
+
+
+ + +
+

‰ðà

+

RTC‚ðƒTƒ|[ƒg‚µ‚È‚¢ƒVƒXƒeƒ€‚Å‚àA‰½‚ç‚©‚Ì“ú•t‚Æ‚µ‚Ä—LŒø‚È’l‚ð•Ô‚³‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñBƒŠ[ƒhEƒIƒ“ƒŠ[\¬‚ł͂±‚ÌŠÖ”‚Í•K—v‚Æ‚³‚ê‚Ü‚¹‚ñB

+
+ + +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/filename.html b/third_party/fatfs/doc/ja/filename.html new file mode 100644 index 0000000..6689b14 --- /dev/null +++ b/third_party/fatfs/doc/ja/filename.html @@ -0,0 +1,56 @@ + + + + + + + +FatFs - ƒtƒ@ƒCƒ‹EƒfƒBƒŒƒNƒgƒŠ‚ÌŽw’è•û–@ + + + +
+

ƒtƒ@ƒCƒ‹EƒfƒBƒŒƒNƒgƒŠ‚ÌŽw’è•û–@

+

FatFsƒ‚ƒWƒ…[ƒ‹‚ł̃tƒ@ƒCƒ‹AƒfƒBƒŒƒNƒgƒŠAƒhƒ‰ƒCƒu‚ÌŽw’è•û–@‚ÍMS-DOS‚Ƃقړ¯‚¶‚Å‚·B‚½‚¾‚µAMS-DOS‚̂悤‚ȃJƒŒƒ“ƒgEƒfƒBƒŒƒNƒgƒŠ‚ÌŠT”O‚Í–³‚¢‚Ì‚ÅAí‚Ƀ‹[ƒgEƒfƒBƒŒƒNƒgƒŠ‚©‚ç’H‚éâ‘΃pƒX‚ł̎w’è‚Æ‚È‚è‚Ü‚·BƒpƒX–¼‚ÌŽw’è•û–@‚Æ—á‚ÍŽŸ‚Ì’Ê‚è‚Å‚·B

+
+
+ "[˜_—ƒhƒ‰ƒCƒu”Ô†:][/]ƒfƒBƒŒƒNƒgƒŠ–¼/ƒtƒ@ƒCƒ‹–¼"
+
+ "file1.txt"           ƒtƒ@ƒCƒ‹(ƒhƒ‰ƒCƒu0)
+ "/file1.txt"          ª‚Æ“¯‚¶
+ "dir1/dir2/file1.txt" ƒtƒ@ƒCƒ‹(ƒhƒ‰ƒCƒu0)
+ "2:dir3/file2.txt"    ƒtƒ@ƒCƒ‹(ƒhƒ‰ƒCƒu2)
+ "2:/dir5"             ƒfƒBƒŒƒNƒgƒŠ(ƒhƒ‰ƒCƒu2)
+ ""                    ƒ‹[ƒgEƒfƒBƒŒƒNƒgƒŠ(ƒhƒ‰ƒCƒu0)
+ "/"                   ª‚Æ“¯‚¶
+ "2:"                  ƒ‹[ƒgEƒfƒBƒŒƒNƒgƒŠ(ƒhƒ‰ƒCƒu2)
+
+
+

FatFsƒ‚ƒWƒ…[ƒ‹‚Í8.3Œ`Ž®ƒtƒ@ƒCƒ‹–¼‚ɂ̂ݑΉž‚µ‚Ä‚¢‚Ü‚·B’·‚¢ƒtƒ@ƒCƒ‹–¼‚ɂ͑Ήž‚µ‚Ä‚¢‚È‚¢‚Ì‚ÅAƒtƒ@ƒCƒ‹–¼‚âƒfƒBƒŒƒNƒgƒŠ–¼‚Í8.3Œ`Ž®‚͈͓̔à‚ÅŽw’肵‚Ü‚·BƒfƒBƒŒƒNƒgƒŠEƒZƒpƒŒ[ƒ^‚É‚Í'/'‚ðŽg—p‚µ‚Ü‚·BƒpƒX–¼æ“ª‚Ì'/'‚ÍA‚ ‚Á‚Ä‚à‚È‚­‚Ä‚à“¯‚¶‚Å‚·B˜_—ƒhƒ‰ƒCƒu”Ô†‚ÍA'0'`'9'‚Ìˆê•¶Žš‚Ì”Žš‚ƃRƒƒ“‚ÅŽw’肵‚Ü‚·BÈ—ª‚µ‚½ê‡‚Í"0:"‚ðŽw’肵‚½‚±‚ƂɂȂè‚Ü‚·BTiny-FatFs‚ł͈ê‚‚̃tƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg‚µ‚©Ž‚Ä‚¸Aí‚ɘ_—ƒhƒ‰ƒCƒu0‚Æ‚µ‚Ä“®ì‚µ‚Ü‚·B‚Ü‚½AƒpƒX–¼’†‚ɘ_—ƒhƒ‰ƒCƒu”Ô†‚ðŽg—p‚Å‚«‚Ü‚¹‚ñB

+
+


+
+

˜_—ƒhƒ‰ƒCƒu‚Æ•¨—ƒhƒ‰ƒCƒu‚̑Ήž

+

•W€\¬‚Å‚ÍA‚»‚ꂼ‚ê‚̘_—ƒhƒ‰ƒCƒu‚Í“¯‚¶”Ô†‚Ì•¨—ƒhƒ‰ƒCƒu‚É1:1‚ÅŒ‹‚т‚¯‚ç‚ê‚Ä‚¢‚ÄA擪‚Ì‹æ‰æ‚ªƒ}ƒEƒ“ƒg‚³‚ê‚Ü‚·B\¬ƒIƒvƒVƒ‡ƒ“‚Å_MULTI_PARTITION‚ðŽw’è‚·‚邯A˜_—ƒhƒ‰ƒCƒu‚ɑ΂µ‚ȕʂɕ¨—ƒhƒ‰ƒCƒu”Ô†E‹æ‰æ‚ðŽw’è‚Å‚«‚邿‚¤‚ɂȂè‚Ü‚·B‚±‚Ì\¬‚Å‚ÍA˜_—ƒhƒ‰ƒCƒu‚Æ‹æ‰æ‚̑Ήž‚ð‰ðŒˆ‚·‚邽‚߂̃e[ƒuƒ‹‚ðŽŸ‚ÉŽ¦‚·‚悤‚É’è‹`‚·‚é•K—v‚ª‚ ‚è‚Ü‚·B

+
+—á:˜_—ƒhƒ‰ƒCƒu0`2‚𕨗ƒhƒ‰ƒCƒu0(ŒÅ’èƒfƒBƒXƒN)‚Ì3‚‚̊î–{‹æ‰æ‚ÉŠ„‚è“–‚ÄA
+   ˜_—ƒhƒ‰ƒCƒu3‚𕨗ƒhƒ‰ƒCƒu1(ƒŠƒ€[ƒoƒuƒ‹EƒfƒBƒXƒN)‚ÉŠ„‚è“–‚Ä‚éê‡B
+
+const PARTITION Drives[] = {
+    {0, 0},     /* Logical drive 0 ==> Physical drive 0, 1st partition */
+    {0, 1},     /* Logical drive 1 ==> Physical drive 0, 2nd partition */
+    {0, 2},     /* Logical drive 2 ==> Physical drive 0, 3rd partition */
+    {1, 0}      /* Logical drive 3 ==> Physical drive 1 */
+};
+
+

•¡”‹æ‰æŽw’è‚ðŽg—p‚·‚éê‡AŽŸ‚Ì“_‚É’ˆÓ‚µ‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB +

    +
  • Žw’è‰Â”\‚È‹æ‰æ‚ÍŠî–{‹æ‰æ(0`3)‚Ì‚ÝB
  • +
  • •¨—ƒhƒ‰ƒCƒu‚ªSFDŒ`Ž®(‹æ‰æƒe[ƒuƒ‹–³‚µ)‚Ìê‡A‹æ‰æŽw’è‚Í–³Ž‹‚³‚ê‚éB
  • +
  • •¡”‚̘_—ƒhƒ‰ƒCƒu‚ðŽ‚Â•¨—ƒhƒ‰ƒCƒu‚ÍAŒÅ’èƒfƒBƒXƒN‚łȂ¯‚ê‚΂Ȃç‚È‚¢B
  • + + +
+ + + diff --git a/third_party/fatfs/doc/ja/getfree.html b/third_party/fatfs/doc/ja/getfree.html new file mode 100644 index 0000000..eb328e7 --- /dev/null +++ b/third_party/fatfs/doc/ja/getfree.html @@ -0,0 +1,91 @@ + + + + + + + +FatFs - f_getfree + + + + +
+

f_getfree

+

˜_—ƒhƒ‰ƒCƒuã‚Ì–¢Žg—pƒNƒ‰ƒXƒ^”‚𓾂܂·B

+
+FRESULT f_getfree (
+  const char* Path,        /* ‘ÎÛƒhƒ‰ƒCƒu‚̃‹[ƒgEƒfƒBƒŒƒNƒgƒŠ */
+  DWORD* Clusters,         /* ‹ó‚«ƒNƒ‰ƒXƒ^”‚ðŠi”[‚·‚é•Ï”‚ւ̃|ƒCƒ“ƒ^ */
+  FATFS** FileSystemObject /* ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
Path
+
‘Îۂ̘_—ƒhƒ‰ƒCƒu‚̃‹[ƒgƒfƒBƒŒƒNƒgƒŠ‚̃pƒX–¼‚ª“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
Clusters
+
‹ó‚«ƒNƒ‰ƒXƒ^”‚ðŠi”[‚·‚éDWORD•Ï”‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
FileSystemObject
+
‘ÎÛƒhƒ‰ƒCƒu‚̃tƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ª•Ô‚³‚ê‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B*Clusters‚ɋ󂫃Nƒ‰ƒXƒ^”‚ª•Ô‚³‚ê‚Ü‚·B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
‚»‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ª—^‚¦‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒp[ƒe[ƒVƒ‡ƒ“‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

˜_—ƒhƒ‰ƒCƒuã‚̋󂫃Nƒ‰ƒXƒ^”‚ðŽæ“¾‚µ‚Ü‚·B•Ô‚³‚ꂽƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg‚Ìsects_clustƒƒ“ƒo‚ªƒNƒ‰ƒXƒ^‚ ‚½‚è‚̃ZƒNƒ^”‚ðŽ¦‚µ‚Ä‚¢‚é‚Ì‚ÅA‚±‚ê‚ðŒ³‚ÉŽÀۂ̋󂫃TƒCƒY‚ªŒvŽZ‚Å‚«‚Ü‚·BFAT32ƒ{ƒŠƒ…[ƒ€‚É‚¨‚¢‚ÄA_USE_FSINFO‚ªŽw’肳‚ê‚Ä‚¢‚éê‡A•s³Šm‚È’l‚ð•Ô‚·ê‡‚ª‚ ‚è‚Ü‚·BŽw’肳‚ê‚Ä‚¢‚È‚¢ê‡Aˆ—‚ÉŽžŠÔ‚ª‚©‚©‚è‚Ü‚·B

+

ƒŠ[ƒhƒIƒ“ƒŠ[\¬‚¨‚æ‚Ñ_FS_MINIMIZE >= 1‚ł͂±‚ÌŠÖ”‚̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+
+ + +
+

Žg—p—á

+
+    FATFS *fs;
+    DWORD clust;
+
+
+    // Get free clusters
+    res = f_getfree("", &clust, &fs);
+    if (res) die(res);
+
+    // Get free space
+    printf("%lu KB total disk space.\n"
+           "%lu KB available on the disk.\n",
+           (DWORD)(fs->max_clust - 2) * fs->sects_clust / 2,
+           clust * fs->sects_clust / 2);
+
+
+ + +
+

ŽQÆ

+FATFS +
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/lseek.html b/third_party/fatfs/doc/ja/lseek.html new file mode 100644 index 0000000..855894f --- /dev/null +++ b/third_party/fatfs/doc/ja/lseek.html @@ -0,0 +1,87 @@ + + + + + + + +FatFs - f_lseek + + + + +
+

f_lseek

+

ƒtƒ@ƒCƒ‹‚ÌR/Wƒ|ƒCƒ“ƒ^‚ðˆÚ“®‚µ‚Ü‚·B

+
+FRESULT f_lseek (
+  FIL* FileObject,   /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^ */
+  DWORD Offset       /* ˆÚ“®æƒIƒtƒZƒbƒg */
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
‘ÎۂƂȂéƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
Offset
+
ˆÚ“®æ‚̃IƒtƒZƒbƒgiR/Wƒ|ƒCƒ“ƒ^j’lBƒtƒ@ƒCƒ‹æ“ª‚©‚ç‚̃IƒtƒZƒbƒg‚ðƒoƒCƒg’PˆÊ‚ÅŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_INVALID_OBJECT
+
–³Œø‚ȃtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒgB
+
+
+ + +
+

‰ðà

+

ƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^(ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg“à‚Ìfptrƒƒ“ƒo‚ÅAŽŸ‚ɓǂÝo‚µE‘‚«ž‚Ý‚³‚ê‚éƒoƒCƒg‚̃IƒtƒZƒbƒg‚ðŽ¦‚·)‚ðˆÚ“®‚µ‚Ü‚·BƒIƒtƒZƒbƒg‚ÌŒ´“_‚̓tƒ@ƒCƒ‹æ“ª‚©‚ç‚Å‚·B‘‚«ž‚݃‚[ƒh‚Ńtƒ@ƒCƒ‹EƒTƒCƒY‚æ‚è‘å‚«‚È’l‚ðŽw’è‚·‚邯A‚»‚±‚܂Ńtƒ@ƒCƒ‹‚ªŠg’£‚³‚êAŠg’£‚³‚ꂽ•”•ª‚̃f[ƒ^‚Í–¢’è‹`‚ƂȂè‚Ü‚·B‘å—e—ʃf[ƒ^‚ð’x‰„–³‚­‚‘¬‚É‘‚«ž‚Ý‚½‚¢‚Æ‚«‚ÍA—\‚ß‚±‚ÌŠÖ”‚Å•K—v‚ȃTƒCƒY‚܂Ńtƒ@ƒCƒ‹‚ðŠg’£‚µ‚Ä‚¨‚­‚Æ—Ç‚¢‚Å‚·Bf_lseekŠÖ”‚ª³íI—¹‚µ‚½‚ ‚Æ‚ÍAƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚ª³‚µ‚­ˆÚ“®‚µ‚½‚©fptr‚ðƒ`ƒFƒbƒN‚·‚é‚ׂ«‚Å‚·Bƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚ªŽw’è‚æ‚謂³‚¢‚Æ‚«‚ÍAŽŸ‚ÌŒ´ˆö‚ªl‚¦‚ç‚ê‚Ü‚·B

+
    +
  • ”ñ‘‚«ž‚݃‚[ƒh‚Ì‚½‚ßAƒtƒ@ƒCƒ‹EƒTƒCƒY‚ŃNƒŠƒbƒv‚³‚ꂽB
  • +
  • ƒtƒ@ƒCƒ‹Šg’£’†‚ɃfƒBƒXƒN‚ª–ž”t‚ɂȂÁ‚½B
  • +
  • FAT\‘¢‚ɃGƒ‰[‚ª‚ ‚éB
  • +
+

_FS_MINIMIZE >= 3‚ł͂±‚ÌŠÖ”‚̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+
+ + +
+

Žg—p—á

+
+    // ƒtƒ@ƒCƒ‹EƒIƒtƒZƒbƒg5000‚ÖˆÚ“®
+    res = f_lseek(&file, 5000);
+
+    // 3000ƒoƒCƒgi‚ß‚é
+    res = f_lseek(&file, file.fptr + 3000);
+
+    // 2000ƒoƒCƒg–ß‚·(ƒI[ƒo[ƒtƒ[‚É’ˆÓ)
+    res = f_lseek(&file, file.fptr - 2000);
+
+    // ƒtƒ@ƒCƒ‹’Ç‹L‚Ì€”õ
+    res = f_lseek(&file, file.fsize);
+
+
+ + +
+

ŽQÆ

+

f_open, FIL

+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/mkdir.html b/third_party/fatfs/doc/ja/mkdir.html new file mode 100644 index 0000000..da2dbc4 --- /dev/null +++ b/third_party/fatfs/doc/ja/mkdir.html @@ -0,0 +1,83 @@ + + + + + + + +FatFs - f_mkdir + + + + +
+

f_mkdir

+

ƒfƒBƒŒƒNƒgƒŠ‚ð쬂µ‚Ü‚·B

+
+FRESULT f_mkdir (
+  const char* DirName /* 쬂·‚éƒfƒBƒŒƒNƒgƒŠ–¼‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
DirName
+
쬂·‚éƒfƒBƒŒƒNƒgƒŠ‚̃tƒ‹ƒpƒX–¼‚ª“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_DENIED
+
ƒfƒBƒXƒN‚âƒfƒBƒŒƒNƒgƒŠEƒGƒ“ƒgƒŠ‚ª–ž”t‚ÌꇂȂÇB
+
FR_EXIST
+
“¯–¼‚̃fƒBƒŒƒNƒgƒŠ‚âƒtƒ@ƒCƒ‹‚ª‘¶Ý‚·‚éB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘ÔB
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
‚»‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ª—^‚¦‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒp[ƒe[ƒVƒ‡ƒ“‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

‹ó‚̃fƒBƒŒƒNƒgƒŠ‚ð쬂µ‚Ü‚·BƒŠ[ƒhEƒIƒ“ƒŠ[\¬‚¨‚æ‚Ñ_FS_MINIMIZE >= 1‚ł͂±‚ÌŠÖ”‚̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+

+

+
+ + +
+

Žg—p—á

+
+    res = f_mkdir("sub1");
+    if (res) die(res);
+    res = f_mkdir("sub1/sub2");
+    if (res) die(res);
+    res = f_mkdir("sub1/sub2/sub3");
+    if (res) die(res);
+
+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/mkfs.html b/third_party/fatfs/doc/ja/mkfs.html new file mode 100644 index 0000000..c6271f0 --- /dev/null +++ b/third_party/fatfs/doc/ja/mkfs.html @@ -0,0 +1,73 @@ + + + + + + + +FatFs - f_mkfs + + + + +
+

f_mkfs

+

ƒhƒ‰ƒCƒuã‚ÉFATƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚ðì¬(ƒtƒH[ƒ}ƒbƒg)‚µ‚Ü‚·B

+
+FRESULT f_mkfs (
+  BYTE  Drive,              /* Logical drive number */
+  BYTE  PartitioningRule,   /* Partitioning rule */
+  BYTE  AllocSize           /* Allocation unit size */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
ƒtƒH[ƒ}ƒbƒg‚·‚é˜_—ƒhƒ‰ƒCƒu(0-9)B
+
PartitioningRule
+
0‚ðŽw’è‚·‚邯A‹æ‰æƒe[ƒuƒ‹‚ð쬂µ‚½‚ ‚Æ‚»‚Ì‹æ‰æ‚Ƀtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚ð쬂µ‚Ü‚·(FDISKƒtƒH[ƒ}ƒbƒg)B1‚ðŽw’è‚·‚邯A擪ƒZƒNƒ^‚©‚ç’¼Úƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚ð\’z‚µ‚Ü‚·(super floppy (SFD) ƒtƒH[ƒ}ƒbƒg)B
+
AllocSize
+
ƒNƒ‰ƒXƒ^EƒTƒCƒY‚ðƒZƒNƒ^’PˆÊ‚ÅŽw’肵‚Ü‚·B2‚Ì—Ýæ‚Å‚©‚ƒNƒ‰ƒXƒ^EƒTƒCƒY‚ª32KƒoƒCƒg‚܂ł͈̔͂łȂ¯‚ê‚΂Ȃè‚Ü‚¹‚ñB
+
+
+ +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª–³ŒøB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘ÔB
+
FR_NOT_ENABLED
+
‚»‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ªŠ„‚è“–‚Ä‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_MKFS_ABORTED
+
ŽŸ‚Ì——R‚ÅŠJŽn‘O‚Ɉ—‚ª’†’f‚³‚ꂽB +
    +
  • ƒfƒBƒXƒNEƒTƒCƒY‚ª¬‚³‚·‚¬‚éB
  • +
  • ‰½‚ç‚©‚̈ø”‚ª•s³B
  • +
  • ‚»‚̃Nƒ‰ƒXƒ^EƒTƒCƒY‚ªŽg‚¦‚È‚¢BƒNƒ‰ƒXƒ^”‚ª0xFF7‚Æ0xFFF7‹ß•Ó‚É‚È‚é‚Æ‚«”­¶‚·‚é‰Â”\«‚ª‚ ‚éB
  • +
+
+
+
+ +
+

à–¾

+

f_mkfsŠÖ”‚ÍFATƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚ðƒhƒ‰ƒCƒuã‚É쬂µ‚Ü‚·BƒŠƒ€[ƒoƒuƒ‹EƒƒfƒBƒA‚̃p[ƒe[ƒVƒ‡ƒjƒ“ƒOEƒ‹[ƒ‹‚Æ‚µ‚Ä‚ÍAFDISKŒ`Ž®‚ÆSFDŒ`Ž®‚ª‚ ‚è‚Ü‚·‚ªAFDISKŒ`Ž®‚ªˆê”Ê“I‚Å‚·B‚±‚ÌŠÖ”‚Í•¡”‹æ‰æ‚ɂ͑Ήž‚µ‚Ä‚¢‚È‚¢‚Ì‚ÅA‚»‚Ì•¨—ƒhƒ‰ƒCƒu‚ÌŠù‘¶‚Ì‹æ‰æ‚Í‘S‚Ä휂³‚êA‘S‘Ì‚ªˆê‚Â‚Ì‹æ‰æ‚ɂȂè‚Ü‚·B

+

FATƒ^ƒCƒv(FAT12/FAT16/FAT32)‚ÍAƒfƒBƒXƒNã‚̃Nƒ‰ƒXƒ^”‚É‚æ‚Á‚Ă̂݌ˆ’肳‚ê‚é[FATŽd—l‘‚æ‚è]Œˆ‚Ü‚è‚ɂȂÁ‚Ä‚¢‚ÄA‚»‚êˆÈŠO‚Ì—vˆö‚Í‚ ‚è‚Ü‚¹‚ñB‚µ‚½‚ª‚Á‚ÄA‚Ç‚ÌFATƒ^ƒCƒv‚ɂȂ邩‚ÍAƒfƒBƒXƒNEƒTƒCƒY‚ƃNƒ‰ƒXƒ^EƒTƒCƒY‚Ɉˑ¶‚µ‚Ü‚·BƒNƒ‰ƒXƒ^EƒTƒCƒY‚͑傫‚¢‚Ù‚Ç«”\‚ªã‚ª‚é‚Ì‚ÅA“Á‚ɬ—e—ʂ̃hƒ‰ƒCƒu‚łȂ¯‚ê‚Î64ƒZƒNƒ^‚ð‘I‘ð‚µ‚Ä‚¨‚¯‚΂悢‚Å‚·B

+

‚±‚ÌŠÖ”‚ÍAFatFs‚Å\¬ƒIƒvƒVƒ‡ƒ“_USE_MKFS‚ð‘I‘ð‚µ‚½‚Æ‚«‚ɃTƒ|[ƒg‚³‚ê‚Ü‚·B‚Ü‚½ATiny-FatFs‚ł̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+

+ + +

Return

+ + diff --git a/third_party/fatfs/doc/ja/mount.html b/third_party/fatfs/doc/ja/mount.html new file mode 100644 index 0000000..e2bbfc3 --- /dev/null +++ b/third_party/fatfs/doc/ja/mount.html @@ -0,0 +1,59 @@ + + + + + + + +FatFs - f_mount + + + + +
+

f_mount

+

˜_—ƒhƒ‰ƒCƒu‚̃[ƒNEƒGƒŠƒA‚ð“o˜^E–•Á‚µ‚Ü‚·B

+
+FRESULT f_mount (
+  BYTE  Drive,               /* ˜_—ƒhƒ‰ƒCƒu”Ô† */
+  FATFS*  FileSystemObject   /* ƒ[ƒNEƒGƒŠƒA‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
Drive
+
˜_—ƒhƒ‰ƒCƒu”Ô†(0-9)BTiny-FatFs‚Å‚Íí‚É0B
+
FileSystemObject
+
“o˜^‚·‚éƒ[ƒNEƒGƒŠƒA(ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg)‚ւ̃|ƒCƒ“ƒ^B
+
+
+ +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª–³ŒøB
+
+
+ + +
+

‰ðà

+

FatFsƒ‚ƒWƒ…[ƒ‹‚ł͂»‚ꂼ‚ê‚̘_—ƒhƒ‰ƒCƒu‚Ƀtƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg‚Æ‚¢‚¤ƒ[ƒNEƒGƒŠƒA‚ª•K—v‚Å‚·B‚±‚ÌŠÖ”‚͘_—ƒhƒ‰ƒCƒu‚É‚»‚̃[ƒNEƒGƒŠƒA‚ð“o˜^‚µ‚½‚è–•Á‚µ‚½‚肵‚Ü‚·B‰½‚ç‚©‚̃tƒ@ƒCƒ‹ŠÖ”‚ðŽg—p‚·‚é‘O‚É‚±‚ÌŠÖ”‚Å‚»‚̘_—ƒhƒ‰ƒCƒu‚̃[ƒNEƒGƒŠƒA‚ð—^‚¦‚Ä‚¨‚©‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñBFileSystemObject‚Ƀkƒ‹Eƒ|ƒCƒ“ƒ^‚ðŽw’è‚·‚邯‚»‚̘_—ƒhƒ‰ƒCƒu‚̃[ƒNEƒGƒŠƒA‚Ì“o˜^‚Í–•Á‚³‚êA“o˜^‚³‚ê‚Ä‚¢‚½ƒ[ƒNEƒGƒŠƒA‚Í”jŠü‚Å‚«‚Ü‚·B

+

‚±‚ÌŠÖ”“à‚ł͕¨—ƒhƒ‰ƒCƒu‚ւ̃AƒNƒZƒX‚Í”­¶‚¹‚¸Aƒ[ƒNEƒGƒŠƒA‚ð‰Šú‰»‚µ‚Ä“à•””z—ñ‚É‚»‚̃AƒhƒŒƒX‚ð“o˜^‚·‚邾‚¯‚Å‚·BŽÀۂ̃}ƒEƒ“ƒg“®ì‚ÍA‘¼‚̃tƒ@ƒCƒ‹ŠÖ”(ƒpƒX–¼‚ðŽw’è‚·‚é‚à‚Ì)‚Ì’†‚Å•K—v‚ɉž‚¶‚Äs‚í‚ê‚Ü‚·B

+
+ + +
+

ŽQÆ

+

FATFS

+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/mountdrv.html b/third_party/fatfs/doc/ja/mountdrv.html new file mode 100644 index 0000000..9411bea --- /dev/null +++ b/third_party/fatfs/doc/ja/mountdrv.html @@ -0,0 +1,58 @@ + + + + + + + +FatFs - f_mountdrv + + + + +
+

f_mountdrv

+

ƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€‚𖾎¦“I‚ɉŠú‰»‚µ‚Ü‚·B

+
+FRESULT f_mountdrv (void);
+
+
+ +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_RW_ERROR
+
ƒfƒBƒXƒNƒAƒNƒZƒX‚ŃGƒ‰[‚ª”­¶‚µ‚½B
+
FR_NOT_ENABLED
+
FatFsƒ‚ƒWƒ…[ƒ‹‚ª’âŽ~ó‘ÔB
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

ƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€‚ð‹­§“I‚ɉŠú‰»iƒ}ƒEƒ“ƒgj‚µ‚Ü‚·BFatFsƒ‚ƒWƒ…[ƒ‹‚ł̓}ƒEƒ“ƒg“®ì‚̓tƒ@ƒCƒ‹ŠÖ”ŒÄ‚Ño‚µŽž‚É•K—v‚ɉž‚¶‚Ä“à•”‚Ås‚í‚ê‚é‚Ì‚ÅA’Êí‚Í‚±‚ÌŠÖ”‚ðŽg—p‚·‚ׂ«‚ł͂ ‚è‚Ü‚¹‚ñBŽ©“®ƒ}ƒEƒ“ƒg“®ì’†‚ɉñ•œ•s”\ƒGƒ‰[i‚½‚Æ‚¦‚ÎFR_INCORRECT_DISK_CHANGEj‚ª”­¶‚µ‚½ê‡A‘S‚Ẵtƒ@ƒCƒ‹ŠÖ”‚ªŽg‚¦‚È‚­‚È‚é‚Ì‚ÅA‚»‚̂Ƃ«‚Í‚±‚ÌŠÖ”‚Åă}ƒEƒ“ƒg‚µ‚ĉñ•œ‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

+

f_mountdrvŠÖ”“à‚ł͎Ÿ‚̈—‚ªs‚í‚ê‚Ü‚·B

+
+
    +
  • ‰ºˆÊƒŒƒCƒ„iƒfƒBƒXƒNI/Oƒ‚ƒWƒ…[ƒ‹j‚̉Šú‰»B
  • +
  • FATƒu[ƒgƒŒƒR[ƒh‚ÌŒŸõB擪ƒZƒNƒ^(SFD)¨‘æˆêŠî–{‹æ‰æ(FDISK)‚̇‚ÉŒŸõ‚µ‚Ü‚·B
  • +
  • ƒtƒ@ƒCƒ‹ƒVƒXƒeƒ€ƒIƒuƒWƒFƒNƒg\‘¢‘̂̉Šú‰»B
  • +
+
+ + +
+

ŽQÆ

+

FATFS

+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/open.html b/third_party/fatfs/doc/ja/open.html new file mode 100644 index 0000000..b6678c8 --- /dev/null +++ b/third_party/fatfs/doc/ja/open.html @@ -0,0 +1,135 @@ + + + + + + + +FatFs - f_open + + + + +
+

f_open

+

ƒtƒ@ƒCƒ‹‚ðƒI[ƒvƒ“‚Ü‚½‚Í쬂µ‚Ü‚·B

+
+FRESULT f_open (
+  FIL* FileObject,      /* ‹ó‚̃tƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^ */
+  const char* FileName, /* ƒtƒ@ƒCƒ‹‚̃tƒ‹ƒpƒX–¼‚ւ̃|ƒCƒ“ƒ^ */
+  BYTE ModeFlags        /* ƒ‚[ƒhƒtƒ‰ƒO */
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
V‚µ‚­ì¬‚·‚éƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·BˆÈ~A‚»‚̃tƒ@ƒCƒ‹‚ð•‚¶‚é‚܂ł±‚̃tƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ðŽg—p‚µ‚ătƒ@ƒCƒ‹‘€ì‚ð‚µ‚Ü‚·B
+
FileName
+
ŠJ‚­(‚Ü‚½‚Í쬂·‚é)ƒtƒ@ƒCƒ‹‚Ì ƒtƒ@ƒCƒ‹–¼‚ª“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
ModeFlags
+
ƒtƒ@ƒCƒ‹‚̃AƒNƒZƒX•û–@‚âƒI[ƒvƒ“•û–@‚ðŒˆ‚ß‚éƒtƒ‰ƒO‚Å‚·B‚±‚̃pƒ‰ƒ[ƒ^‚ɂ͎Ÿ‚Ì‘g‚݇‚킹‚ðŽw’肵‚Ü‚·B
+ + + + + + + + +
’lˆÓ–¡
FA_READ“Ç‚Ýo‚µƒ‚[ƒh‚ÅŠJ‚«‚Ü‚·B“ǂݑ‚«‚·‚éꇂÍFA_WRITE‚Æ‹¤‚ÉŽw’肵‚Ü‚·B
FA_WRITE‘‚«ž‚݃‚[ƒh‚ÅŠJ‚«‚Ü‚·B“ǂݑ‚«‚·‚éꇂÍFA_READ‚Æ‹¤‚ÉŽw’肵‚Ü‚·B
FA_OPEN_EXISTINGŠù‘¶‚̃tƒ@ƒCƒ‹‚ðŠJ‚«‚Ü‚·Bƒtƒ@ƒCƒ‹‚ª–³‚¢‚Æ‚«‚̓Gƒ‰[‚ɂȂè‚Ü‚·B
FA_OPEN_ALWAYSŠù‘¶‚̃tƒ@ƒCƒ‹‚ðŠJ‚«‚Ü‚·Bƒtƒ@ƒCƒ‹‚ª–³‚¢‚Æ‚«‚̓tƒ@ƒCƒ‹‚ð쬂µ‚Ü‚·B
FA_CREATE_NEWƒtƒ@ƒCƒ‹‚ð쬂µ‚Ü‚·B“¯–¼‚̃tƒ@ƒCƒ‹‚ª‚ ‚éꇂÍAƒGƒ‰[‚ɂȂè‚Ü‚·B
FA_CREATE_ALWAYSƒtƒ@ƒCƒ‹‚ð쬂µ‚Ü‚·B“¯–¼‚̃tƒ@ƒCƒ‹‚ª‚ ‚éꇂÍAƒTƒCƒY‚ð0‚É‚µ‚Ä‚©‚çŠJ‚«‚Ü‚·B
+
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹BˆÈ~AFileObject\‘¢‘Ì‚ðŽg‚Á‚Ä‚±‚̃tƒ@ƒCƒ‹‚ð‘€ì‚Å‚«‚Ü‚·B
+
FR_NO_FILE
+
ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒtƒ@ƒCƒ‹–¼‚ª•s³B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_EXIST
+
“¯–¼‚̃tƒ@ƒCƒ‹‚ªŠù‚É‚ ‚éB
+
FR_DENIED
+
ƒAƒNƒZƒX‚ª‹‘”Û‚³‚ꂽBƒŠ[ƒhEƒIƒ“ƒŠ[Eƒtƒ@ƒCƒ‹‚Ì‘‚«ž‚݃‚[ƒhEƒI[ƒvƒ“A“¯–¼‚̃fƒBƒŒƒNƒgƒŠ‚Ü‚½‚̓Š[ƒhEƒIƒ“ƒŠ[Eƒtƒ@ƒCƒ‹‚ª‚ ‚éó‘Ԃł̃tƒ@ƒCƒ‹ì¬AƒfƒBƒXƒN‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠEƒe[ƒuƒ‹‚ª–ž”t‚Ńtƒ@ƒCƒ‹‚ð쬂ł«‚È‚¢‚È‚ÇB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘Ô‚Å‘‚«ž‚ÝŒnƒI[ƒvƒ“‚ð‚µ‚½B
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
‚»‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ªŠ„‚è“–‚Ä‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒp[ƒe[ƒVƒ‡ƒ“‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

쬂³‚ꂽƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ÍAˆÈ~‚»‚̃tƒ@ƒCƒ‹‚ɑ΂·‚éƒAƒNƒZƒX‚ÉŽg—p‚µ‚Ü‚·Bƒtƒ@ƒCƒ‹‚ð•‚¶‚邯‚«‚ÍAf_close()‚ðŽg—p‚µ‚Ü‚·B

+

ƒtƒ@ƒCƒ‹‘€ìŠÖ”‚ðŽg—p‚·‚é‘O‚ɂ܂¸Af_mount()‚ðŽg‚Á‚Ä‚»‚ꂼ‚ê‚̘_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA(ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg)‚ð—^‚¦‚È‚¯‚ê‚΂Ȃè‚Ü‚¹‚ñB‚±‚̉Šú‰»‚ÌŒãA‚»‚̘_—ƒhƒ‰ƒCƒu‚ɑ΂µ‚Ä‘S‚Ẵtƒ@ƒCƒ‹ŠÖ”‚ªŽg‚¦‚邿‚¤‚ɂȂè‚Ü‚·B

+

ƒŠ[ƒhƒIƒ“ƒŠ[\¬‚Å‚ÍAFA_WRITE, FA_CREATE_ALWAYS, FA_CREATE_NEW, FA_OPEN_ALWAYS‚ÌŠeƒtƒ‰ƒO‚̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+
+ + +
+

Žg—p—áiƒtƒ@ƒCƒ‹EƒRƒs[j

+
+void main ()
+{
+    FATFS fs;            // ˜_—ƒhƒ‰ƒCƒu‚̃[ƒNEƒGƒŠƒA(ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€EƒIƒuƒWƒFƒNƒg)
+    FIL fsrc, fdst;      // ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg
+    BYTE buffer[4096];   // file copy buffer
+    FRESULT res;         // FatFs function common result code
+    WORD br, bw;         // File R/W count
+
+    // ƒhƒ‰ƒCƒu0‚Ƀ[ƒNEƒGƒŠƒA‚ð—^‚¦‚é
+    f_mount(0, &fs);
+
+    // ƒ\[ƒXEƒtƒ@ƒCƒ‹‚ðŠJ‚­
+    res = f_open(&fsrc, "srcfile.dat", FA_OPEN_EXISTING | FA_READ);
+    if (res) die(res);
+
+    // ƒfƒXƒeƒBƒl[ƒVƒ‡ƒ“Eƒtƒ@ƒCƒ‹‚ð쬂·‚é
+    res = f_open(&fdst, "dstfile.dat", FA_CREATE_ALWAYS | FA_WRITE);
+    if (res) die(res);
+
+    // ƒ\[ƒX‚©‚çƒfƒXƒeƒBƒl[ƒVƒ‡ƒ“‚ɃRƒs[‚·‚é
+    for (;;) {
+        res = f_read(&fsrc, buffer, sizeof(buffer), &br);
+        if (res || br == 0) break;   // error or eof
+        res = f_write(&fdst, buffer, br, &bw);
+        if (res || bw < br) break;   // error or disk full
+    }
+
+    // ‘S‚Ẵtƒ@ƒCƒ‹‚ð•‚¶‚é
+    f_close(&fsrc);
+    f_close(&fdst);
+
+    // ƒ[ƒNEƒGƒŠƒA‚ðŠJ•ú‚·‚é
+    f_mount(0, NULL);
+}
+
+
+ + +
+

ŽQÆ

+

f_read, f_write, f_close, FIL, FATFS

+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/opendir.html b/third_party/fatfs/doc/ja/opendir.html new file mode 100644 index 0000000..54e50e1 --- /dev/null +++ b/third_party/fatfs/doc/ja/opendir.html @@ -0,0 +1,73 @@ + + + + + + + +FatFs - f_opendir + + + + +
+

f_opendir

+

ƒfƒBƒŒƒNƒgƒŠ‚ðƒI[ƒvƒ“‚µ‚Ü‚·B

+
+FRESULT f_opendir (
+  DIR* DirObject,      /* ƒfƒBƒŒƒNƒgƒŠEƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^ */
+  const char* DirName  /* ƒfƒBƒŒƒNƒgƒŠ–¼‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
DirObject
+
‰Šú‰»‚·‚éƒfƒBƒŒƒNƒgƒŠEƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
DirName
+
ƒI[ƒvƒ“‚·‚éƒfƒBƒŒƒNƒgƒŠ‚̃tƒ‹ƒpƒX–¼‚ª“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_FILE
+
ƒfƒBƒŒƒNƒgƒŠ‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
˜_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ª—^‚¦‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒp[ƒe[ƒVƒ‡ƒ“‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

ƒfƒBƒŒƒNƒgƒŠ‚ðƒI[ƒvƒ“‚µ‚Ü‚·B³íI—¹‚µ‚½‚çADirObject\‘¢‘Ì‚ðŽg‚Á‚Ä‚±‚̃fƒBƒŒƒNƒgƒŠ‚Ì€–Ú‚ð‡ŽŸ“Ç‚Ýo‚¹‚Ü‚·BDirObject\‘¢‘͎̂g—pŒã‚Í”CˆÓ‚ÌŽž“_‚Å”jŠü‚Å‚«‚Ü‚·B_FS_MINIMIZE >= 2‚ł͂±‚ÌŠÖ”‚̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+
+ + +
+

ŽQÆ

+

f_readdir, DIR

+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/read.html b/third_party/fatfs/doc/ja/read.html new file mode 100644 index 0000000..3151f49 --- /dev/null +++ b/third_party/fatfs/doc/ja/read.html @@ -0,0 +1,71 @@ + + + + + + + +FatFs - f_read + + + + +
+

f_read

+

ƒtƒ@ƒCƒ‹‚©‚çƒf[ƒ^‚ð“Ç‚Ýo‚µ‚Ü‚·B

+
+FRESULT f_read (
+  FIL* FileObject,    // ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘Ì
+  void* Buffer,       // “Ç‚Ýo‚µ‚½ƒf[ƒ^‚ðŠi”[‚·‚éƒoƒbƒtƒ@
+  WORD ByteToRead,    // “Ç‚Ýo‚·ƒoƒCƒg”
+  WORD* ByteRead      // “Ç‚Ýo‚³‚ꂽƒoƒCƒg”
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
Buffer
+
“Ç‚Ýo‚µ‚½ƒf[ƒ^‚ðŠi”[‚·‚éƒoƒbƒtƒ@‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
ByteToRead
+
“Ç‚Ýo‚·ƒoƒCƒg”(0`65535)‚ðŽw’肵‚Ü‚·B
+
ByteRead
+
ŽÀۂɓǂÝo‚³‚ꂽƒoƒCƒg”‚ðŠi”[‚·‚é•Ï”‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+ +
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_DENIED
+
”ñ“ǂݞ‚݃‚[ƒh‚ÅŠJ‚¢‚½ƒtƒ@ƒCƒ‹‚©‚ç“ǂݞ‚à‚¤‚Æ‚µ‚½B
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_INVALID_OBJECT
+
–³Œø‚ȃtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒgB
+
+
+ + +
+

‰ðà

+

“ǂݞ‚ÝŠJŽnˆÊ’u‚ÍAŒ»Ý‚̃tƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚©‚ç‚ɂȂè‚Ü‚·Bƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚͓ǂݞ‚܂ꂽƒoƒCƒg”‚¾‚¯i‚݂܂·B“ǂݞ‚Ý’†‚Ƀtƒ@ƒCƒ‹‚ÌI’[‚É’B‚·‚邯A*ByteRead‚ÍByteToRead‚æ‚è‚ଂ³‚­‚È‚è‚Ü‚·B

+
+ + +
+

ŽQÆ

+

f_open, f_write, f_close, FIL

+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/readdir.html b/third_party/fatfs/doc/ja/readdir.html new file mode 100644 index 0000000..f6ad18f --- /dev/null +++ b/third_party/fatfs/doc/ja/readdir.html @@ -0,0 +1,89 @@ + + + + + + + +FatFs - f_readdir + + + + +
+

f_readdir

+

ƒfƒBƒŒƒNƒgƒŠ€–Ú‚ð“Ç‚Ýo‚µ‚Ü‚·

+
+FRESULT f_readdir (
+  DIR* DirObject,    /* ƒfƒBƒŒƒNƒgƒŠEƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^ */
+  FILINFO* FileInfo  /* ƒtƒ@ƒCƒ‹î•ñ\‘¢‘̂ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
DirObject
+
ƒfƒBƒŒƒNƒgƒŠEƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
FileInfo
+
“Ç‚Ýo‚µ‚½ƒfƒBƒŒƒNƒgƒŠ€–Ú‚ðŠi”[‚·‚éƒtƒ@ƒCƒ‹î•ñ\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_INVALID_OBJECT
+
–³Œø‚ȃfƒBƒŒƒNƒgƒŠEƒIƒuƒWƒFƒNƒgB
+
+
+ + +
+

‰ðà

+

ƒfƒBƒŒƒNƒgƒŠ€–Ú‚ð‡ŽŸ“Ç‚Ýo‚µ‚Ü‚·B‚±‚ÌŠÖ”‚ðŒJ‚è•Ô‚µŽÀs‚·‚邱‚Ƃɂæ‚èƒfƒBƒŒƒNƒgƒŠ‚Ì‘S‚Ằ–Ú‚ð“Ç‚Ýo‚·‚±‚Æ‚ª‚Å‚«‚Ü‚·B‘S‚Ằ–Ú‚ð“Ç‚Ýo‚µA“Ç‚Ýo‚·€–Ú‚ª‚à‚¤–³‚¢‚Æ‚«‚ÍAf_name[]ƒƒ“ƒo‚Ƀkƒ‹•¶Žš—ñ‚ª•Ô‚³‚ê‚Ü‚·B“¾‚ç‚ê‚éƒtƒ@ƒCƒ‹î•ñ‚ÌÚׂɂ‚¢‚Ä‚Í FILINFO\‘¢‘Ì‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B_FS_MINIMIZE >= 2‚ł͂±‚ÌŠÖ”‚̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+
+ + +
+

Žg—p—á

+
+void scan_files (char* path)
+{
+    FILINFO finfo;
+    DIR dirs;
+    int i;
+
+    if (f_opendir(&dirs, path) == FR_OK) {
+        i = strlen(path);
+        while ((f_readdir(&dirs, &finfo) == FR_OK) && finfo.fname[0]) {
+            if (finfo._attrib & AM_DIR) {
+                sprintf(path+i, "/%s", &finfo.fname[0]);
+                scan_files(path);
+                *(path+i) = '\0';
+            } else {
+                printf("%s/%s\n", path, &finfo.fname[0]);
+            }
+        }
+    }
+}
+
+
+ + +
+

ŽQÆ

+

f_opendir, f_stat, FILINFO, DIR

+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/rename.html b/third_party/fatfs/doc/ja/rename.html new file mode 100644 index 0000000..1c5ece8 --- /dev/null +++ b/third_party/fatfs/doc/ja/rename.html @@ -0,0 +1,86 @@ + + + + + + + +FatFs - f_rename + + + + +
+

f_rename

+

ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚Ì–¼‘O‚Ì•ÏX‚Ü‚½‚͈ړ®B

+
+FRESULT f_rename (
+  const char* OldName, /* ŒÃ‚¢ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ–¼ */
+  const char* NewName  /* V‚µ‚¢ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ–¼ */
+);
+
+
+ +
+

ˆø”

+
+
OldName
+
•ÏX‘Îۂ̃tƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚̃tƒ‹ƒpƒX–¼‚Ì“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
NewName
+
V‚µ‚¢ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚̃tƒ‹ƒpƒX–¼‚Ì“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·BŠù‚É‘¶Ý‚·‚é‚à‚̂Ɠ¯‚¶–¼‘O‚ÍŽg‚¦‚Ü‚¹‚ñB‚Ü‚½Aƒhƒ‰ƒCƒu”Ô†‚ÍŽw’è‚Å‚«‚¸AOldName‚ÅŽw’肳‚ꂽƒhƒ‰ƒCƒuã‚̃IƒuƒWƒFƒNƒg‚Æ‚µ‚Ĉµ‚í‚ê‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_FILE
+
ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_DENIED
+
V‚µ‚¢–¼‘O‚̃IƒuƒWƒFƒNƒg‚ªì‚ê‚È‚¢B
+
FR_EXIST
+
NewName‚Æ“¯‚¶–¼‘O‚̃IƒuƒWƒFƒNƒg‚ªŠù‚É‚ ‚éB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘ÔB
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
˜_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNƒGƒŠƒA‚ªŠ„‚è“–‚Ä‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒp[ƒe[ƒVƒ‡ƒ“‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚Ì–¼‘O‚ð•ÏX‚µ‚Ü‚·B•ʂ̃fƒBƒŒƒNƒgƒŠ‚ւ̈ړ®(“¯‚¶ƒhƒ‰ƒCƒu“à‚Ì‚Ý)‚à‰Â”\‚Å‚·BƒŠ[ƒhEƒIƒ“ƒŠ[\¬‚¨‚æ‚Ñ_FS_MINIMIZE >= 1‚ł͂±‚ÌŠÖ”‚̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+

¦Œ»ƒŠƒrƒWƒ‡ƒ“‚Å‚ÍAƒfƒBƒŒƒNƒgƒŠ‚ð•ʂ̃fƒBƒŒƒNƒgƒŠ‚Ɉړ®‚·‚邯ƒtƒ@ƒCƒ‹EƒVƒXƒeƒ€‚ª‰ó‚ê‚Ü‚·B

+
+ + +
+

Žg—p—á

+
+    // –¼‘O‚ð•ÏX‚·‚é
+    f_rename("oldname.txt", "newname.txt");
+
+    // –¼‘O‚Ì•ÏX‚Æ“¯Žž‚ɕʂ̃fƒBƒŒƒNƒgƒŠ‚ÖˆÚ“®‚·‚é
+    f_rename("oldname.txt", "dir1/newname.txt");
+
+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/sdir.html b/third_party/fatfs/doc/ja/sdir.html new file mode 100644 index 0000000..350d10c --- /dev/null +++ b/third_party/fatfs/doc/ja/sdir.html @@ -0,0 +1,42 @@ + + + + + + + +FatFs - DIR + + + + +
+

DIR

+

DIR\‘¢‘Ì‚ÍAf_opendir(), f_readdir()‚̃[ƒNEƒGƒŠƒA‚Æ‚µ‚ÄŽg—p‚³‚ê‚Ü‚·B

+

FatFs

+
+typedef struct _DIR {
+    WORD    id;          /* Owner file system mount ID (inverted) */
+    WORD    index;       /* Current index */
+    FATFS*  fs;          /* Pointer to the owner file system object */
+    DWORD   sclust;      /* Start cluster */
+    DWORD   clust;       /* Current cluster */
+    DWORD   sect;        /* Current sector */
+} DIR;
+
+

Tiny-FatFs

+
+typedef struct _DIR {
+    WORD    id;          /* Owner file system mount ID (inverted) */
+    WORD    index;       /* Current index */
+    FATFS*  fs;          /* Pointer to the owner file system object */
+    CLUST   sclust;      /* Start cluster */
+    CLUST   clust;       /* Current cluster */
+    DWORD   sect;        /* Current sector */
+} DIR;
+
+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/sfatfs.html b/third_party/fatfs/doc/ja/sfatfs.html new file mode 100644 index 0000000..999f612 --- /dev/null +++ b/third_party/fatfs/doc/ja/sfatfs.html @@ -0,0 +1,63 @@ + + + + + + + +FatFs - FATFS + + + + +
+

FATFS

+

FATFS\‘¢‘Ì‚ÍAŒÂX‚̘_—ƒhƒ‰ƒCƒu‚̃_ƒCƒiƒ~ƒbƒNEƒ[ƒNEƒGƒŠƒA‚ð•ÛŽ‚µAf_mount()‚ÅFatFsƒ‚ƒWƒ…[ƒ‹‚É“o˜^‚³‚ê‚Ü‚·B•W€ó‘Ԃł͎Ÿ‚̂悤‚ȃƒ“ƒo‚ɂȂÁ‚Ä‚¢‚Ü‚·BƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚©‚ç‘‚«Š·‚¦‰Â”\‚ȃƒ“ƒo‚Í‚ ‚è‚Ü‚¹‚ñB

+

FatFs

+
+typedef struct _FATFS {
+    WORD    id;             /* File system mount ID */
+    WORD    n_rootdir;      /* Number of root directory entries */
+    DWORD   winsect;        /* Current sector appearing in the win[] */
+    DWORD   sects_fat;      /* Sectors per fat */
+    DWORD   max_clust;      /* Maximum cluster# + 1 */
+    DWORD   fatbase;        /* FAT start sector */
+    DWORD   dirbase;        /* Root directory start sector (cluster# for FAT32) */
+    DWORD   database;       /* Data start sector */
+    DWORD   last_clust;     /* Last allocated cluster */
+    DWORD   free_clust;     /* Number of free clusters */
+    BYTE    fs_type;        /* FAT type (0:Not mounted) */
+    BYTE    sects_clust;    /* Sectors per cluster */
+    BYTE    n_fats;         /* Number of FAT copies */
+    BYTE    drive;          /* Physical drive number */
+    BYTE    winflag;        /* win[] dirty flag (1:must be written back) */
+    BYTE    pad1;
+    BYTE    win[512];       /* Disk access window for Directory/FAT */
+} FATFS;
+
+ +

Tiny-FatFs

+
+typedef struct _FATFS {
+    WORD    id;             /* File system mount ID */
+    WORD    n_rootdir;      /* Number of root directory entries */
+    DWORD   winsect;        /* Current sector appearing in the win[] */
+    DWORD   fatbase;        /* FAT start sector */
+    DWORD   dirbase;        /* Root directory start sector */
+    DWORD   database;       /* Data start sector */
+    CLUST   sects_fat;      /* Sectors per fat */
+    CLUST   max_clust;      /* Maximum cluster# + 1 */
+    CLUST   last_clust;     /* Last allocated cluster */
+    CLUST   free_clust;     /* Number of free clusters */
+    BYTE    fs_type;        /* FAT type (0:Not mounted) */
+    BYTE    sects_clust;    /* Sectors per cluster */
+    BYTE    n_fats;         /* Number of FAT copies */
+    BYTE    winflag;        /* win[] dirty flag (1:must be written back) */
+    BYTE    win[512];       /* Disk access window for Directory/FAT/File */
+} FATFS;
+
+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/sfile.html b/third_party/fatfs/doc/ja/sfile.html new file mode 100644 index 0000000..4dea75e --- /dev/null +++ b/third_party/fatfs/doc/ja/sfile.html @@ -0,0 +1,54 @@ + + + + + + + +FatFs - FIL + + + + +
+

FIL

+

FIL\‘¢‘Ì‚ÍAf_open()‚Å쬂³‚êA‚»‚̃tƒ@ƒCƒ‹‚Ìó‘Ô‚ð•ÛŽ‚µ‚Ü‚·BƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚©‚ç‘‚«Š·‚¦‰Â”\‚ȃƒ“ƒo‚Í‚ ‚è‚Ü‚¹‚ñB

+

FatFs

+
+typedef struct _FIL {
+    WORD    id;             /* Owner file system mount ID (inverted) */
+    BYTE    flag;           /* File status flags */
+    BYTE    sect_clust;     /* Left sectors in cluster */
+    FATFS*  fs;             /* Pointer to the owner file system object */
+    DWORD   fptr;           /* File R/W pointer */
+    DWORD   fsize;          /* File size */
+    DWORD   org_clust;      /* File start cluster */
+    DWORD   curr_clust;     /* Current cluster */
+    DWORD   curr_sect;      /* Current sector */
+    DWORD   dir_sect;       /* Sector containing the directory entry */
+    BYTE*   dir_ptr;        /* Ponter to the directory entry in the window */
+    BYTE    buffer[512];    /* File R/W buffer */
+} FIL;
+
+ +

Tiny-FatFs

+
+typedef struct _FIL {
+    WORD    id;             /* Owner file system mount ID (inverted) */
+    BYTE    flag;           /* File status flags */
+    BYTE    sect_clust;     /* Left sectors in cluster */
+    FATFS*  fs;             /* Pointer to owner file system */
+    DWORD   fptr;           /* File R/W pointer */
+    DWORD   fsize;          /* File size */
+    CLUST   org_clust;      /* File start cluster */
+    CLUST   curr_clust;     /* Current cluster */
+    DWORD   curr_sect;      /* Current sector */
+    DWORD   dir_sect;       /* Sector containing the directory entry */
+    BYTE*   dir_ptr;        /* Ponter to the directory entry in the window */
+} FIL;
+
+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/sfileinfo.html b/third_party/fatfs/doc/ja/sfileinfo.html new file mode 100644 index 0000000..dc4aa05 --- /dev/null +++ b/third_party/fatfs/doc/ja/sfileinfo.html @@ -0,0 +1,43 @@ + + + + + + + +FatFs - FILINFO + + + + +
+

FILINFO

+

FILINFO\‘¢‘Ì‚ÍAf_stat(), f_readdir()‚ŕԂ³‚ê‚éƒtƒ@ƒCƒ‹î•ñ‚ð•ÛŽ‚µ‚Ü‚·B

+
+typedef struct _FILINFO {
+    DWORD fsize;            /* Size [bytes] */
+    WORD fdate;             /* Date [15-9]:Year-1980, [8-5]:Month, [4-0]:Mday */
+    WORD ftime;             /* Time [15-11]:Hour, [10-5]:Minute, [4-0]:Sec/2 */
+    BYTE fattrib;           /* Attribute */
+    char fname[8+1+3+1];    /* Name */
+} FILINFO;
+
+
+ +

ƒƒ“ƒo

+
+
fsize
+
ƒtƒ@ƒCƒ‹‚̃oƒCƒg’PˆÊ‚̃TƒCƒY‚ªŠi”[‚³‚ê‚Ü‚·BƒfƒBƒŒƒNƒgƒŠ‚ÌꇂÍí‚É0‚Å‚·B
+
fdate
+
ƒtƒ@ƒCƒ‹‚Ì•ÏX‚³‚ꂽ“ú•tA‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚Ì쬂³‚ꂽ“ú•t‚ªŠi”[‚³‚ê‚Ü‚·B
+
ftime
+
ƒtƒ@ƒCƒ‹‚Ì•ÏX‚³‚ê‚½ŽžA‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚Ì쬂³‚ê‚½Žž‚ªŠi”[‚³‚ê‚Ü‚·B
+
fattrib
+
‘®«ƒtƒ‰ƒO‚ªŠi”[‚³‚ê‚Ü‚·Bƒtƒ‰ƒO‚ÍAM_DIR, AM_RDO, AM_HID, AM_SYS, AM_ARC‚Ì‘g‚݇‚킹‚ƂȂè‚Ü‚·B
+
fname[]
+
8.3Œ`Ž®‚Ì–¼‘O‚ª'\0'‚ÅI‚í‚é•¶Žš—ñ‚Æ‚µ‚ÄŠi”[‚³‚ê‚Ü‚·B
+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/stat.html b/third_party/fatfs/doc/ja/stat.html new file mode 100644 index 0000000..5de8df9 --- /dev/null +++ b/third_party/fatfs/doc/ja/stat.html @@ -0,0 +1,73 @@ + + + + + + + +FatFs - f_stat + + + + +
+

f_stat

+

+
+FRESULT f_stat (
+  const char* FileName,  /* ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ–¼‚ւ̃|ƒCƒ“ƒ^ */
+  FILINFO* FileInfo      /* ƒtƒ@ƒCƒ‹î•ñ\‘¢‘̂ւ̃|ƒCƒ“ƒ^ *
+);
+
+
+ +
+

ˆø”

+
+
FileName
+
î•ñ‚𓾂éƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ–¼‚Ì'\0'‚ÅI‚í‚é•¶Žš—ñ‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
FileInfo
+
“Ç‚Ýo‚µ‚½ƒtƒ@ƒCƒ‹î•ñ‚ðŠi”[‚·‚éƒtƒ@ƒCƒ‹î•ñ\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_FILE
+
ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_NAME
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
˜_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNƒGƒŠƒA‚ªŠ„‚è“–‚Ä‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒp[ƒe[ƒVƒ‡ƒ“‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚ÉŠÖ‚·‚éî•ñ‚𓾂܂·B“¾‚ç‚ê‚éƒtƒ@ƒCƒ‹î•ñ‚ÌÚׂɂ‚¢‚Ä‚Í FILINFO\‘¢‘Ì‚ðŽQÆ‚µ‚Ä‚­‚¾‚³‚¢B_FS_MINIMIZE >= 1‚ł͂±‚ÌŠÖ”‚̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+
+ + + + +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/sync.html b/third_party/fatfs/doc/ja/sync.html new file mode 100644 index 0000000..cfc159c --- /dev/null +++ b/third_party/fatfs/doc/ja/sync.html @@ -0,0 +1,61 @@ + + + + + + + +FatFs - f_sync + + + + +
+

f_sync

+

‘‚«ž‚Ý’†‚̃tƒ@ƒCƒ‹‚̃LƒƒƒbƒVƒ…‚³‚ꂽî•ñ‚ðƒtƒ‰ƒbƒVƒ…‚µ‚Ü‚·B

+
+FRESULT f_sync (
+  FIL* FileObject     /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
sync‚·‚éƒtƒ@ƒCƒ‹‚̃tƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_INVALID_OBJECT
+
ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg‚ª–³ŒøB
+
+
+ + +
+

‰ðà

+

‚±‚ÌŠÖ”‚Íf_close()‚Æ“¯‚¶ˆ—‚ðŽÀs‚µ‚Ü‚·‚ªAƒtƒ@ƒCƒ‹‚͈ø‚«‘±‚«ŠJ‚©‚ꂽ‚܂܂ɂȂèA“ǂݑ‚«‚ð‘±s‚Å‚«‚Ü‚·BƒƒMƒ“ƒO‚È‚ÇA‘‚«ž‚݃‚[ƒh‚Å’·ŽžŠÔƒtƒ@ƒCƒ‹‚ªŠJ‚©‚ê‚Ä‚¢‚éƒAƒvƒŠƒP[ƒVƒ‡ƒ“‚É‚¨‚¢‚ÄA’èŠú“I‚Ü‚½‚Í‹æØ‚è‚Ì—Ç‚¢‚Æ‚±‚ë‚Åsync‚·‚邱‚Ƃɂæ‚èA•sˆÓ‚Ì“dŒ¹’f‚⃃fƒBƒA‚ÌŽæ‚èŠO‚µ‚É‚æ‚莸‚í‚ê‚éƒf[ƒ^‚ðŬ‚É‚·‚邱‚Æ‚ª‚Å‚«‚Ü‚·B

+

ƒŠ[ƒhEƒIƒ“ƒŠ[\¬‚ł͂±‚ÌŠÖ”‚̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+
+ + +
+

ŽQÆ

+

f_close

+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/unlink.html b/third_party/fatfs/doc/ja/unlink.html new file mode 100644 index 0000000..6d7f9cc --- /dev/null +++ b/third_party/fatfs/doc/ja/unlink.html @@ -0,0 +1,68 @@ + + + + + + + +FatFs - f_unlink + + + + +
+

f_unlink

+

ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚ð휂µ‚Ü‚·B

+
+FRESULT f_unlink (
+  const char* FileName  /* ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ–¼‚ւ̃|ƒCƒ“ƒ^ */
+);
+
+
+ +
+

ˆø”

+
+
FileName
+
휑Îۂ̃tƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ–¼‚Ì“ü‚Á‚½'\0'‚ÅI‚í‚é•¶Žš—ñ‚ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_NO_FILE
+
ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_NO_PATH
+
ƒpƒX‚ªŒ©‚‚©‚ç‚È‚¢B
+
FR_INVALID_NAME
+
ƒpƒX–¼‚ª•s³B
+
FR_INVALID_DRIVE
+
ƒhƒ‰ƒCƒu”Ô†‚ª•s³B
+
FR_DENIED
+
‘ÎÛƒtƒ@ƒCƒ‹EƒfƒBƒŒƒNƒgƒŠ‚ªƒŠ[ƒhEƒIƒ“ƒŠ[ó‘ÔA‘ÎÛƒfƒBƒŒƒNƒgƒŠ‚ª‹ó‚łȂ¢ê‡‚È‚ÇB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇA•¨—ƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_WRITE_PROTECTED
+
ƒƒfƒBƒA‚ª‘‚«ž‚݋֎~ó‘ÔB
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_ENABLED
+
˜_—ƒhƒ‰ƒCƒu‚Ƀ[ƒNEƒGƒŠƒA‚ªŠ„‚è“–‚Ä‚ç‚ê‚Ä‚¢‚È‚¢B
+
FR_NO_FILESYSTEM
+
ƒfƒBƒXƒNã‚É—LŒø‚ÈFATƒp[ƒe[ƒVƒ‡ƒ“‚ªŒ©‚‚©‚ç‚È‚¢B
+
+
+ + +
+

‰ðà

+

ƒtƒ@ƒCƒ‹‚Ü‚½‚̓fƒBƒŒƒNƒgƒŠ‚ð휂µ‚Ü‚·BƒŠ[ƒhEƒIƒ“ƒŠ[\¬‚â_FS_MINIMIZE >= 1‚ł͂±‚ÌŠÖ”‚̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/ja/write.html b/third_party/fatfs/doc/ja/write.html new file mode 100644 index 0000000..b7ff34e --- /dev/null +++ b/third_party/fatfs/doc/ja/write.html @@ -0,0 +1,71 @@ + + + + + + + +FatFs - f_write + + + + +
+

f_write

+

ƒtƒ@ƒCƒ‹‚Ƀf[ƒ^‚ð‘‚«ž‚݂܂·B

+
+FRESULT f_write (
+  FIL* FileObject,     /* ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg */
+  const void* Buffer,  /* ‘‚«ž‚݃f[ƒ^ */
+  WORD ByteToWrite,    /* ‘‚«ž‚ÞƒoƒCƒg” */
+  WORD* ByteWritten    /* ‘‚«ž‚܂ꂽƒoƒCƒg” */
+);
+
+
+ +
+

ˆø”

+
+
FileObject
+
ƒtƒ@ƒCƒ‹EƒIƒuƒWƒFƒNƒg\‘¢‘̂ւ̃|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
Buffer
+
‘‚«ž‚Þƒf[ƒ^‚ðŠi”[‚µ‚½ƒoƒbƒtƒ@‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
ByteToWrite
+
‘‚«ž‚ÞƒoƒCƒg”(0`65535)‚ðŽw’肵‚Ü‚·B
+
ByteWritten
+
‘‚«ž‚܂ꂽƒoƒCƒg”‚ðŠi”[‚·‚é•Ï”‚ðŽw‚·ƒ|ƒCƒ“ƒ^‚ðŽw’肵‚Ü‚·B
+
+
+ + +
+

–ß‚è’l

+
+
FR_OK (0)
+
³íI—¹B
+
FR_DENIED
+
”ñ‘‚«ž‚݃‚[ƒh‚ÅŠJ‚¢‚½ƒtƒ@ƒCƒ‹‚É‘‚«ž‚à‚¤‚Æ‚µ‚½B
+
FR_RW_ERROR
+
ƒfƒBƒXƒNEƒGƒ‰[‚Ü‚½‚Í“à•”ƒGƒ‰[‚É‚æ‚鎸”sB
+
FR_NOT_READY
+
ƒƒfƒBƒA‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚È‚¢‚È‚ÇAƒfƒBƒXƒNEƒhƒ‰ƒCƒu‚ª“®ì•s”\ó‘ÔB
+
FR_INVALID_OBJECT
+
–³Œø‚ȃtƒ@ƒCƒ‹ƒIƒuƒWƒFƒNƒgB
+
+
+ + +
+

‰ðà

+

‘‚«ž‚ÝŠJŽnˆÊ’u‚ÍAƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚ÌŒ»ÝˆÊ’u‚©‚ç‚ɂȂè‚Ü‚·Bƒtƒ@ƒCƒ‹R/Wƒ|ƒCƒ“ƒ^‚ÍŽÀÛ‚É‘‚«ž‚܂ꂽƒoƒCƒg”‚¾‚¯i‚݂܂·B‘‚«ž‚Ý’†‚ɃfƒBƒXƒN‚ªˆê”t‚ɂȂÁ‚½‚Æ‚«‚ÍA*ByteWritten‚ÍByteToWrite‚æ‚è‚ଂ³‚­‚È‚è‚Ü‚·BƒŠ[ƒhEƒIƒ“ƒŠ[\¬‚ł͂±‚ÌŠÖ”‚̓Tƒ|[ƒg‚³‚ê‚Ü‚¹‚ñB

+
+ + +
+

ŽQÆ

+

f_open, f_read, f_close, FIL

+
+ +

–ß‚é

+ + diff --git a/third_party/fatfs/doc/updates.txt b/third_party/fatfs/doc/updates.txt new file mode 100644 index 0000000..840d5a8 --- /dev/null +++ b/third_party/fatfs/doc/updates.txt @@ -0,0 +1,42 @@ +R0.04b, May 05, 2007 + Added _USE_NTFLAG option. + Added FSInfo support. + Fixed some problems corresponds to FAT32. (Tiny-FatFs) + Fixed DBCS name can result FR_INVALID_NAME. + Fixed short seek (<= csize) collapses the file object. + +R0.04a, Apr 01, 2007 + Supported multiple partitions on a plysical drive. (FatFs) + Added minimization level 3. + Added a capability of extending file size to f_lseek(). + Fixed an endian sensitive code in f_mkfs(). (FatFs) + Fixed a problem corresponds to FAT32 support. (Tiny-FatFs) + +R0.04, Feb 04, 2007 + Supported multiple drive system. (FatFs) + Changed some APIs for multiple drive system. + Added f_mkfs(). (FatFs) + Added _USE_FAT32 option. (Tiny-FatFs) + +R0.03a, Dec 11, 2006 + Improved cluster scan algolithm to write files fast. + Fixed f_mkdir() creates incorrect directory on FAT32. + +R0.02a, Jun 10, 2006 + Added a configuration option _FS_MINIMUM. + +R0.02, Jun 01, 2006 + Added FAT12. + Removed unbuffered mode. + Fixed a problem on small (<32M) patition. + +R0.03, Sep 22, 2006 + Added f_rename(). + Changed option _FS_MINIMUM to _FS_MINIMIZE. + +R0.01, Apr 29, 2006 + First release + +R0.00, Feb 26, 2006 + Prototype (not released) + diff --git a/third_party/fatfs/port/dual-disk-driver.c b/third_party/fatfs/port/dual-disk-driver.c new file mode 100644 index 0000000..68e0fe8 --- /dev/null +++ b/third_party/fatfs/port/dual-disk-driver.c @@ -0,0 +1,264 @@ +/*-----------------------------------------------------------------------*/ +/* Dual-disk wrapper allowing operating of two different drives */ +/* underneath the FatFs layer without modification of the existing */ +/* single-unit drivers for those drives. */ +/* */ +/* This file was modified from a sample driver available from the FatFs */ +/* web site. */ +/*-----------------------------------------------------------------------*/ + +#include +#include +#include "inc/hw_types.h" +#include "fatfs/src/diskio.h" +#include "fatfs/src/ff.h" + +/*-----------------------------------------------------------------------*/ +/* Configuration */ +/*-----------------------------------------------------------------------*/ +/* This wrapper allows two independent, low level, single drive FatFs */ +/* drivers to be used simultaneously to provide a FatFs implementation */ +/* with two physical drives. Configuration is set using two #define */ +/* labels, one each from the following two groups, to indicate which */ +/* drivers to use for each of the logical drives supported. */ +/* */ +/* DISK0_EK_LM4F232H5QD - Logical disk 0 is an EK-LM4F232H5QD SD Card. */ +/* DISK0_USB_MSC - Logical disk 0 is a USB Mass Storage Class */ +/* device. */ +/* */ +/* DISK1_EK_LM4F232H5QD - Logical disk 1 is an EK-LM4F232H5QD SD Card. */ +/* DISK1_USB_MSC - Logical disk 1 is a USB Mass Storage Class */ +/* device. */ +/* */ +/* The same driver cannot be used to support both logical drives. */ +/* */ +/* Note that the USB MSC driver does not support a timer function so we */ +/* need to undef DRIVEn_TIMERPROC whenever this driver is configured. */ +/*-----------------------------------------------------------------------*/ +#if defined(DISK0_EK_LM4F232H5QD) +#define DRIVE0_DRIVER "mmc-ek-lm4f232.c" +#define DRIVE0_TIMERPROC disk0_timerproc +#elif defined(DISK0_DK_TM4C123G) +#define DRIVE0_DRIVER "mmc-dk-tm4c123g.c" +#define DRIVE0_TIMERPROC disk0_timerproc +#elif defined(DISK0_DK_TM4C129XNCZAD) +#define DRIVE0_DRIVER "mmc-dk-tm4c129x.c" +#define DRIVE0_TIMERPROC disk0_timerproc +#elif defined(DISK0_USB_MSC) +#define DRIVE0_DRIVER "fat_usbmsc.c" +#undef DRIVE0_TIMERPROC +#else +#error "Unrecognized/undefined driver for DISK0!" +#endif + +#if defined(DISK1_EK_LM4F232H5QD) +#define DRIVE1_DRIVER "mmc-ek-lm4f232.c" +#define DRIVE1_TIMERPROC disk1_timerproc +#elif defined(DISK1_DK_TM4C123G) +#define DRIVE1_DRIVER "mmc-dk-tm4c123g.c" +#define DRIVE1_TIMERPROC disk1_timerproc +#elif defined(DISK1_DK_TM4C129XNCZAD) +#define DRIVE1_DRIVER "mmc-dk-tm4c129x.c" +#define DRIVE1_TIMERPROC disk1_timerproc +#elif defined(DISK1_USB_MSC) +#define DRIVE1_DRIVER "fat_usbmsc.c" +#undef DRIVE0_TIMERPROC +#else +#error "Unrecognized/undefined driver for DISK1!" +#endif + +/*-----------------------------------------------------------------------*/ +/* The first low level driver */ +/*-----------------------------------------------------------------------*/ +#define disk_initialize disk0_initialize +#define disk_status disk0_status +#define disk_read disk0_read +#define disk_write disk0_write +#define disk_ioctl disk0_ioctl +#define disk_timerproc disk0_timerproc +#define get_fattime disk0_get_fattime + +#include DRIVE0_DRIVER + +#undef disk_initialize +#undef disk_status +#undef disk_read +#undef disk_write +#undef disk_ioctl +#undef disk_timerproc +#undef get_fattime + +/*-----------------------------------------------------------------------*/ +/* The second low level driver */ +/*-----------------------------------------------------------------------*/ +#define disk_initialize disk1_initialize +#define disk_status disk1_status +#define disk_read disk1_read +#define disk_write disk1_write +#define disk_ioctl disk1_ioctl +#define disk_timerproc disk1_timerproc +#define get_fattime disk1_get_fattime + +#include DRIVE1_DRIVER + +#undef disk_initialize +#undef disk_status +#undef disk_read +#undef disk_write +#undef disk_ioctl +#undef disk_timerproc +#undef get_fattime + +/*-----------------------------------------------------------------------*/ +/* Timer tick function. */ +/*-----------------------------------------------------------------------*/ +/* When using an SD card driver, this function must be called every 10mS */ +/* by the application code. Note that this is not part of the device */ +/* driver interface that is called directly by FatFs. */ +/* */ +void disk_timerproc (void) +{ +#ifdef DRIVE0_TIMERPROC + disk0_timerproc(); +#endif + +#ifdef DRIVE1_TIMERPROC + disk1_timerproc(); +#endif +} + +/*-----------------------------------------------------------------------*/ +/* Initialize Disk Drive */ +/*-----------------------------------------------------------------------*/ +DSTATUS +disk_initialize( + BYTE bValue) /* Physical drive number */ +{ + /* Depending upon the physical drive, call the relevant low level */ + /* driver. Note that we call each with physical drive number 0 since the */ + /* low level drivers typically expect this (they only support a single */ + /* drive). */ + if(bValue == 0) + { + return(disk0_initialize(0)); + } + else + { + return(disk1_initialize(0)); + } +} + +/*-----------------------------------------------------------------------*/ +/* Returns the current status of a drive */ +/*-----------------------------------------------------------------------*/ +DSTATUS disk_status ( + BYTE drv) /* Physical drive number */ +{ + /* Depending upon the physical drive, call the relevant low level */ + /* driver. Note that we call each with physical drive number 0 since the */ + /* low level drivers typically expect this (they only support a single */ + /* drive). */ + if(drv == 0) + { + return(disk0_status(0)); + } + else + { + return(disk1_status(0)); + } + +} + +/*-----------------------------------------------------------------------*/ +/* This function reads sector(s) from the disk drive */ +/*-----------------------------------------------------------------------*/ +DRESULT disk_read ( + BYTE drv, /* Physical drive number */ + BYTE* buff, /* Pointer to the data buffer to store read data */ + DWORD sector, /* Sector number */ + BYTE count) /* Sector count (1..255) */ +{ + /* Depending upon the physical drive, call the relevant low level */ + /* driver. Note that we call each with physical drive number 0 since the */ + /* low level drivers typically expect this (they only support a single */ + /* drive). */ + if(drv == 0) + { + return(disk0_read(0, buff, sector, count)); + } + else + { + return(disk1_read(0, buff, sector, count)); + } +} + + + +/*-----------------------------------------------------------------------*/ +/* This function writes sector(s) to the disk drive */ +/*-----------------------------------------------------------------------*/ +#if _READONLY == 0 +DRESULT disk_write ( + BYTE ucDrive, /* Physical drive number (0) */ + const BYTE* buff, /* Pointer to the data to be written */ + DWORD sector, /* Sector number */ + BYTE count) /* Sector count (1..255) */ +{ + /* Depending upon the physical drive, call the relevant low level */ + /* driver. Note that we call each with physical drive number 0 since the */ + /* low level drivers typically expect this (they only support a single */ + /* drive). */ + if(ucDrive == 0) + { + return(disk0_write(0, buff, sector, count)); + } + else + { + return(disk1_write(0, buff, sector, count)); + } +} +#endif /* _READONLY */ + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ +DRESULT disk_ioctl ( + BYTE drv, /* Physical drive number (0) */ + BYTE ctrl, /* Control code */ + void *buff) /* Buffer to send/receive control data */ +{ + /* Depending upon the physical drive, call the relevant low level */ + /* driver. Note that we call each with physical drive number 0 since the */ + /* low level drivers typically expect this (they only support a single */ + /* drive). */ + if(drv == 0) + { + return(disk0_ioctl(0, ctrl, buff)); + } + else + { + return(disk1_ioctl(0, ctrl, buff)); + } +} + +/*---------------------------------------------------------*/ +/* User Provided Timer Function for FatFs module */ +/*---------------------------------------------------------*/ +/* This is a real time clock service to be called from */ +/* FatFs module. Any valid time must be returned even if */ +/* the system does not support a real time clock. */ +/* */ +/* Note that each driver implements the same function but, */ +/* since the function doesn't take any parameter, we can't */ +/* decide automatically which driver's get_fattime() to */ +/* invoke. Instead, we control this with a #define */ +/* which defaults to calling the first driver. */ +/* */ +DWORD get_fattime (void) +{ +#ifndef DRIVE1_TIME_MASTER + return(disk0_get_fattime()); +#else + return(disk1_get_fattime()); +#endif +} diff --git a/third_party/fatfs/port/fat_usbmsc.c b/third_party/fatfs/port/fat_usbmsc.c new file mode 100644 index 0000000..a49e439 --- /dev/null +++ b/third_party/fatfs/port/fat_usbmsc.c @@ -0,0 +1,151 @@ +/*-----------------------------------------------------------------------*/ +/*-----------------------------------------------------------------------*/ +/* TivaWare USB MSC module */ +/*-----------------------------------------------------------------------*/ +/*-----------------------------------------------------------------------*/ + +/* + * This file was modified from a sample available from the FatFs + * web site. It was modified to work with the TivaWare USB Library. + */ +#include +#include +#include "inc/hw_types.h" +#include "driverlib/sysctl.h" +#include "usblib/usblib.h" +#include "usblib/usbmsc.h" +#include "usblib/host/usbhost.h" +#include "usblib/host/usbhmsc.h" +#include "fatfs/src/diskio.h" +#include "fatfs/src/ff.h" + +extern tUSBHMSCInstance *g_psMSCInstance; + +static volatile +DSTATUS USBStat = STA_NOINIT; /* Disk status */ + +/*-----------------------------------------------------------------------*/ +/* Initialize Disk Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS +disk_initialize( + BYTE bValue) /* Physical drive number (0) */ +{ + /* Set the not initialized flag again. If all goes well and the disk is */ + /* present, this will be cleared at the end of the function. */ + USBStat |= STA_NOINIT; + + /* Find out if drive is ready yet. */ + if (USBHMSCDriveReady(g_psMSCInstance)) return(FR_NOT_READY); + + /* Clear the not init flag. */ + USBStat &= ~STA_NOINIT; + + return 0; +} + + + +/*-----------------------------------------------------------------------*/ +/* Returns the current status of a drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE drv) /* Physical drive number (0) */ +{ + if (drv) return STA_NOINIT; /* Supports only single drive */ + return USBStat; +} + + + +/*-----------------------------------------------------------------------*/ +/* This function reads sector(s) from the disk drive */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE drv, /* Physical drive number (0) */ + BYTE* buff, /* Pointer to the data buffer to store read data */ + DWORD sector, /* Physical drive nmuber (0) */ + BYTE count) /* Sector count (1..255) */ +{ + if(USBStat & STA_NOINIT) + { + return(RES_NOTRDY); + } + + /* READ BLOCK */ + if (USBHMSCBlockRead(g_psMSCInstance, sector, buff, count) == 0) + return RES_OK; + + return RES_ERROR; +} + + + +/*-----------------------------------------------------------------------*/ +/* This function writes sector(s) to the disk drive */ +/*-----------------------------------------------------------------------*/ + +#if _READONLY == 0 +DRESULT disk_write ( + BYTE ucDrive, /* Physical drive number (0) */ + const BYTE* buff, /* Pointer to the data to be written */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count) /* Sector count (1..255) */ +{ + if (ucDrive || !count) return RES_PARERR; + if (USBStat & STA_NOINIT) return RES_NOTRDY; + if (USBStat & STA_PROTECT) return RES_WRPRT; + + /* WRITE BLOCK */ + if(USBHMSCBlockWrite(g_psMSCInstance, sector, (unsigned char *)buff, + count) == 0) + return RES_OK; + + return RES_ERROR; +} +#endif /* _READONLY */ + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_ioctl ( + BYTE drv, /* Physical drive number (0) */ + BYTE ctrl, /* Control code */ + void *buff) /* Buffer to send/receive control data */ +{ + if(USBStat & STA_NOINIT) + { + return(RES_NOTRDY); + } + + switch(ctrl) + { + case CTRL_SYNC: + return(RES_OK); + + default: + return(RES_PARERR); + } +} + +/*---------------------------------------------------------*/ +/* User Provided Timer Function for FatFs module */ +/*---------------------------------------------------------*/ +/* This is a real time clock service to be called from */ +/* FatFs module. Any valid time must be returned even if */ +/* the system does not support a real time clock. */ + +DWORD get_fattime (void) +{ + return ((2007UL-1980) << 25) // Year = 2007 + | (6UL << 21) // Month = June + | (5UL << 16) // Day = 5 + | (11U << 11) // Hour = 11 + | (38U << 5) // Min = 38 + | (0U >> 1) // Sec = 0 + ; +} diff --git a/third_party/fatfs/port/mmc-dk-tm4c123g.c b/third_party/fatfs/port/mmc-dk-tm4c123g.c new file mode 100644 index 0000000..1e9cf5b --- /dev/null +++ b/third_party/fatfs/port/mmc-dk-tm4c123g.c @@ -0,0 +1,725 @@ +/*-----------------------------------------------------------------------*/ +/* MMC/SDC (in SPI mode) control module (C)ChaN, 2007 */ +/*-----------------------------------------------------------------------*/ +/* Only rcvr_spi(), xmit_spi(), disk_timerproc() and some macros */ +/* are platform dependent. */ +/*-----------------------------------------------------------------------*/ + +/* + * This file was modified from a sample available from the FatFs + * web site. It was modified to work with an DK-TM4C123G development + * board. + */ + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/ssi.h" +#include "driverlib/sysctl.h" +#include "fatfs/src/diskio.h" + +/* Definitions for MMC/SDC command */ +#define CMD0 (0x40+0) /* GO_IDLE_STATE */ +#define CMD1 (0x40+1) /* SEND_OP_COND */ +#define CMD8 (0x40+8) /* SEND_IF_COND */ +#define CMD9 (0x40+9) /* SEND_CSD */ +#define CMD10 (0x40+10) /* SEND_CID */ +#define CMD12 (0x40+12) /* STOP_TRANSMISSION */ +#define CMD16 (0x40+16) /* SET_BLOCKLEN */ +#define CMD17 (0x40+17) /* READ_SINGLE_BLOCK */ +#define CMD18 (0x40+18) /* READ_MULTIPLE_BLOCK */ +#define CMD23 (0x40+23) /* SET_BLOCK_COUNT */ +#define CMD24 (0x40+24) /* WRITE_BLOCK */ +#define CMD25 (0x40+25) /* WRITE_MULTIPLE_BLOCK */ +#define CMD41 (0x40+41) /* SEND_OP_COND (ACMD) */ +#define CMD55 (0x40+55) /* APP_CMD */ +#define CMD58 (0x40+58) /* READ_OCR */ + +/* Peripheral definitions for DK-TM4C123G board */ +// SSI port +#define SDC_SSI_BASE SSI0_BASE +#define SDC_SSI_SYSCTL_PERIPH SYSCTL_PERIPH_SSI0 + +// GPIO for SSI pins +#define SDC_GPIO_PORT_BASE GPIO_PORTA_BASE +#define SDC_GPIO_SYSCTL_PERIPH SYSCTL_PERIPH_GPIOA +#define SDC_SSI_CLK GPIO_PIN_2 +#define SDC_SSI_TX GPIO_PIN_5 +#define SDC_SSI_RX GPIO_PIN_4 +#define SDC_SSI_FSS GPIO_PIN_3 +#define SDC_SSI_PINS (SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK | \ + SDC_SSI_FSS) + +// asserts the CS pin to the card +static +void SELECT (void) +{ + ROM_GPIOPinWrite(SDC_GPIO_PORT_BASE, SDC_SSI_FSS, 0); +} + +// de-asserts the CS pin to the card +static +void DESELECT (void) +{ + ROM_GPIOPinWrite(SDC_GPIO_PORT_BASE, SDC_SSI_FSS, SDC_SSI_FSS); +} + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + +static volatile +DSTATUS Stat = STA_NOINIT; /* Disk status */ + +static volatile +BYTE Timer1, Timer2; /* 100Hz decrement timer */ + +static +BYTE CardType; /* b0:MMC, b1:SDC, b2:Block addressing */ + +static +BYTE PowerFlag = 0; /* indicates if "power" is on */ + +/*-----------------------------------------------------------------------*/ +/* Transmit a byte to MMC via SPI (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +static +void xmit_spi(BYTE dat) +{ + uint32_t ui32RcvDat; + + ROM_SSIDataPut(SDC_SSI_BASE, dat); /* Write the data to the tx fifo */ + + ROM_SSIDataGet(SDC_SSI_BASE, &ui32RcvDat); /* flush data read during the write */ +} + + +/*-----------------------------------------------------------------------*/ +/* Receive a byte from MMC via SPI (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +static +BYTE rcvr_spi (void) +{ + uint32_t ui32RcvDat; + + ROM_SSIDataPut(SDC_SSI_BASE, 0xFF); /* write dummy data */ + + ROM_SSIDataGet(SDC_SSI_BASE, &ui32RcvDat); /* read data frm rx fifo */ + + return (BYTE)ui32RcvDat; +} + + +static +void rcvr_spi_m (BYTE *dst) +{ + *dst = rcvr_spi(); +} + +/*-----------------------------------------------------------------------*/ +/* Wait for card ready */ +/*-----------------------------------------------------------------------*/ + +static +BYTE wait_ready (void) +{ + BYTE res; + + + Timer2 = 50; /* Wait for ready in timeout of 500ms */ + rcvr_spi(); + do + res = rcvr_spi(); + while ((res != 0xFF) && Timer2); + + return res; +} + +/*-----------------------------------------------------------------------*/ +/* Send 80 or so clock transitions with CS and DI held high. This is */ +/* required after card power up to get it into SPI mode */ +/*-----------------------------------------------------------------------*/ +static +void send_initial_clock_train(void) +{ + unsigned int i; + uint32_t ui32Dat; + + /* Ensure CS is held high. */ + DESELECT(); + + /* Switch the SSI TX line to a GPIO and drive it high too. */ + ROM_GPIOPinTypeGPIOOutput(SDC_GPIO_PORT_BASE, SDC_SSI_TX); + ROM_GPIOPinWrite(SDC_GPIO_PORT_BASE, SDC_SSI_TX, SDC_SSI_TX); + + /* Send 10 bytes over the SSI. This causes the clock to wiggle the */ + /* required number of times. */ + for(i = 0 ; i < 10 ; i++) + { + /* Write DUMMY data. SSIDataPut() waits until there is room in the */ + /* FIFO. */ + ROM_SSIDataPut(SDC_SSI_BASE, 0xFF); + + /* Flush data read during data write. */ + ROM_SSIDataGet(SDC_SSI_BASE, &ui32Dat); + } + + /* Revert to hardware control of the SSI TX line. */ + ROM_GPIOPinTypeSSI(SDC_GPIO_PORT_BASE, SDC_SSI_TX); +} + +/*-----------------------------------------------------------------------*/ +/* Power Control (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* When the target system does not support socket power control, there */ +/* is nothing to do in these functions and chk_power always returns 1. */ + +static +void power_on (void) +{ + /* + * This doesn't really turn the power on, but initializes the + * SSI port and pins needed to talk to the card. + */ + + /* Enable the peripherals used to drive the SDC on SSI */ + ROM_SysCtlPeripheralEnable(SDC_SSI_SYSCTL_PERIPH); + ROM_SysCtlPeripheralEnable(SDC_GPIO_SYSCTL_PERIPH); + + /* + * Configure the appropriate pins to be SSI instead of GPIO. The FSS (CS) + * signal is directly driven to ensure that we can hold it low through a + * complete transaction with the SD card. + */ + ROM_GPIOPinTypeSSI(SDC_GPIO_PORT_BASE, SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK); + ROM_GPIOPinTypeGPIOOutput(SDC_GPIO_PORT_BASE, SDC_SSI_FSS); + + /* + * Set the SSI output pins to 4MA drive strength and engage the + * pull-up on the receive line. + */ + MAP_GPIOPadConfigSet(SDC_GPIO_PORT_BASE, SDC_SSI_RX, GPIO_STRENGTH_4MA, + GPIO_PIN_TYPE_STD_WPU); + MAP_GPIOPadConfigSet(SDC_GPIO_PORT_BASE, SDC_SSI_CLK | SDC_SSI_TX | SDC_SSI_FSS, + GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD); + + /* Configure the SSI0 port */ + ROM_SSIConfigSetExpClk(SDC_SSI_BASE, ROM_SysCtlClockGet(), + SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 400000, 8); + ROM_SSIEnable(SDC_SSI_BASE); + + /* Set DI and CS high and apply more than 74 pulses to SCLK for the card */ + /* to be able to accept a native command. */ + send_initial_clock_train(); + + PowerFlag = 1; +} + +// set the SSI speed to the max setting +static +void set_max_speed(void) +{ + unsigned long i; + + /* Disable the SSI */ + ROM_SSIDisable(SDC_SSI_BASE); + + /* Set the maximum speed as half the system clock, with a max of 12.5 MHz. */ + i = ROM_SysCtlClockGet() / 2; + if(i > 12500000) + { + i = 12500000; + } + + /* Configure the SSI0 port to run at 12.5MHz */ + ROM_SSIConfigSetExpClk(SDC_SSI_BASE, ROM_SysCtlClockGet(), + SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, i, 8); + + /* Enable the SSI */ + ROM_SSIEnable(SDC_SSI_BASE); +} + +static +void power_off (void) +{ + PowerFlag = 0; +} + +static +int chk_power(void) /* Socket power state: 0=off, 1=on */ +{ + return PowerFlag; +} + + + +/*-----------------------------------------------------------------------*/ +/* Receive a data packet from MMC */ +/*-----------------------------------------------------------------------*/ + +static +BOOL rcvr_datablock ( + BYTE *buff, /* Data buffer to store received data */ + UINT btr /* Byte count (must be even number) */ +) +{ + BYTE token; + + + Timer1 = 100; + do { /* Wait for data packet in timeout of 100ms */ + token = rcvr_spi(); + } while ((token == 0xFF) && Timer1); + if(token != 0xFE) return FALSE; /* If not valid data token, retutn with error */ + + do { /* Receive the data block into buffer */ + rcvr_spi_m(buff++); + rcvr_spi_m(buff++); + } while (btr -= 2); + rcvr_spi(); /* Discard CRC */ + rcvr_spi(); + + return TRUE; /* Return with success */ +} + + + +/*-----------------------------------------------------------------------*/ +/* Send a data packet to MMC */ +/*-----------------------------------------------------------------------*/ + +#if _READONLY == 0 +static +BOOL xmit_datablock ( + const BYTE *buff, /* 512 byte data block to be transmitted */ + BYTE token /* Data/Stop token */ +) +{ + BYTE resp, wc; + + + if (wait_ready() != 0xFF) return FALSE; + + xmit_spi(token); /* Xmit data token */ + if (token != 0xFD) { /* Is data token */ + wc = 0; + do { /* Xmit the 512 byte data block to MMC */ + xmit_spi(*buff++); + xmit_spi(*buff++); + } while (--wc); + xmit_spi(0xFF); /* CRC (Dummy) */ + xmit_spi(0xFF); + resp = rcvr_spi(); /* Reveive data response */ + if ((resp & 0x1F) != 0x05) /* If not accepted, return with error */ + return FALSE; + } + + return TRUE; +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Send a command packet to MMC */ +/*-----------------------------------------------------------------------*/ + +static +BYTE send_cmd ( + BYTE cmd, /* Command byte */ + DWORD arg /* Argument */ +) +{ + BYTE n, res; + + + if (wait_ready() != 0xFF) return 0xFF; + + /* Send command packet */ + xmit_spi(cmd); /* Command */ + xmit_spi((BYTE)(arg >> 24)); /* Argument[31..24] */ + xmit_spi((BYTE)(arg >> 16)); /* Argument[23..16] */ + xmit_spi((BYTE)(arg >> 8)); /* Argument[15..8] */ + xmit_spi((BYTE)arg); /* Argument[7..0] */ + n = 0xff; + if (cmd == CMD0) n = 0x95; /* CRC for CMD0(0) */ + if (cmd == CMD8) n = 0x87; /* CRC for CMD8(0x1AA) */ + xmit_spi(n); + + /* Receive command response */ + if (cmd == CMD12) rcvr_spi(); /* Skip a stuff byte when stop reading */ + n = 10; /* Wait for a valid response in timeout of 10 attempts */ + do + res = rcvr_spi(); + while ((res & 0x80) && --n); + + return res; /* Return with the response value */ +} + +/*-----------------------------------------------------------------------* + * Send the special command used to terminate a multi-sector read. + * + * This is the only command which can be sent while the SDCard is sending + * data. The SDCard spec indicates that the data transfer will stop 2 bytes + * after the 6 byte CMD12 command is sent and that the card will then send + * 0xFF for between 2 and 6 more bytes before the R1 response byte. This + * response will be followed by another 0xFF byte. In testing, however, it + * seems that some cards don't send the 2 to 6 0xFF bytes between the end of + * data transmission and the response code. This function, therefore, merely + * reads 10 bytes and, if the last one read is 0xFF, returns the value of the + * latest non-0xFF byte as the response code. + * + *-----------------------------------------------------------------------*/ + +static +BYTE send_cmd12 (void) +{ + BYTE n, res, val; + + /* For CMD12, we don't wait for the card to be idle before we send + * the new command. + */ + + /* Send command packet - the argument for CMD12 is ignored. */ + xmit_spi(CMD12); + xmit_spi(0); + xmit_spi(0); + xmit_spi(0); + xmit_spi(0); + xmit_spi(0); + + /* Read up to 10 bytes from the card, remembering the value read if it's + not 0xFF */ + for(n = 0; n < 10; n++) + { + val = rcvr_spi(); + if(val != 0xFF) + { + res = val; + } + } + + return res; /* Return with the response value */ +} + +/*-------------------------------------------------------------------------- + + Public Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Initialize Disk Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE drv /* Physical drive nmuber (0) */ +) +{ + BYTE n, ty, ocr[4]; + + + if (drv) return STA_NOINIT; /* Supports only single drive */ + if (Stat & STA_NODISK) return Stat; /* No card in the socket */ + + power_on(); /* Force socket power on */ + send_initial_clock_train(); /* Ensure the card is in SPI mode */ + + SELECT(); /* CS = L */ + ty = 0; + if (send_cmd(CMD0, 0) == 1) { /* Enter Idle state */ + Timer1 = 100; /* Initialization timeout of 1000 msec */ + if (send_cmd(CMD8, 0x1AA) == 1) { /* SDC Ver2+ */ + for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); + if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* The card can work at vdd range of 2.7-3.6V */ + do { + if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 1UL << 30) == 0) break; /* ACMD41 with HCS bit */ + } while (Timer1); + if (Timer1 && send_cmd(CMD58, 0) == 0) { /* Check CCS bit */ + for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); + ty = (ocr[0] & 0x40) ? 6 : 2; + } + } + } else { /* SDC Ver1 or MMC */ + ty = (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) <= 1) ? 2 : 1; /* SDC : MMC */ + do { + if (ty == 2) { + if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) == 0) break; /* ACMD41 */ + } else { + if (send_cmd(CMD1, 0) == 0) break; /* CMD1 */ + } + } while (Timer1); + if (!Timer1 || send_cmd(CMD16, 512) != 0) /* Select R/W block length */ + ty = 0; + } + } + CardType = ty; + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + if (ty) { /* Initialization succeded */ + Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */ + set_max_speed(); + } else { /* Initialization failed */ + power_off(); + } + + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Get Disk Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE drv /* Physical drive nmuber (0) */ +) +{ + if (drv) return STA_NOINIT; /* Supports only single drive */ + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE drv, /* Physical drive nmuber (0) */ + BYTE *buff, /* Pointer to the data buffer to store read data */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count /* Sector count (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + + if (!(CardType & 4)) sector *= 512; /* Convert to byte address if needed */ + + SELECT(); /* CS = L */ + + if (count == 1) { /* Single block read */ + if ((send_cmd(CMD17, sector) == 0) /* READ_SINGLE_BLOCK */ + && rcvr_datablock(buff, 512)) + count = 0; + } + else { /* Multiple block read */ + if (send_cmd(CMD18, sector) == 0) { /* READ_MULTIPLE_BLOCK */ + do { + if (!rcvr_datablock(buff, 512)) break; + buff += 512; + } while (--count); + send_cmd12(); /* STOP_TRANSMISSION */ + } + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + return count ? RES_ERROR : RES_OK; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ +/*-----------------------------------------------------------------------*/ + +#if _READONLY == 0 +DRESULT disk_write ( + BYTE drv, /* Physical drive nmuber (0) */ + const BYTE *buff, /* Pointer to the data to be written */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count /* Sector count (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + if (Stat & STA_PROTECT) return RES_WRPRT; + + if (!(CardType & 4)) sector *= 512; /* Convert to byte address if needed */ + + SELECT(); /* CS = L */ + + if (count == 1) { /* Single block write */ + if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */ + && xmit_datablock(buff, 0xFE)) + count = 0; + } + else { /* Multiple block write */ + if (CardType & 2) { + send_cmd(CMD55, 0); send_cmd(CMD23, count); /* ACMD23 */ + } + if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */ + do { + if (!xmit_datablock(buff, 0xFC)) break; + buff += 512; + } while (--count); + if (!xmit_datablock(0, 0xFD)) /* STOP_TRAN token */ + count = 1; + } + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + return count ? RES_ERROR : RES_OK; +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_ioctl ( + BYTE drv, /* Physical drive nmuber (0) */ + BYTE ctrl, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + DRESULT res; + BYTE n, csd[16], *ptr = buff; + WORD csize; + + + if (drv) return RES_PARERR; + + res = RES_ERROR; + + if (ctrl == CTRL_POWER) { + switch (*ptr) { + case 0: /* Sub control code == 0 (POWER_OFF) */ + if (chk_power()) + power_off(); /* Power off */ + res = RES_OK; + break; + case 1: /* Sub control code == 1 (POWER_ON) */ + power_on(); /* Power on */ + res = RES_OK; + break; + case 2: /* Sub control code == 2 (POWER_GET) */ + *(ptr+1) = (BYTE)chk_power(); + res = RES_OK; + break; + default : + res = RES_PARERR; + } + } + else { + if (Stat & STA_NOINIT) return RES_NOTRDY; + + SELECT(); /* CS = L */ + + switch (ctrl) { + case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */ + if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { + if ((csd[0] >> 6) == 1) { /* SDC ver 2.00 */ + csize = csd[9] + ((WORD)csd[8] << 8) + 1; + *(DWORD*)buff = (DWORD)csize << 10; + } else { /* MMC or SDC ver 1.XX */ + n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2; + csize = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1; + *(DWORD*)buff = (DWORD)csize << (n - 9); + } + res = RES_OK; + } + break; + + case GET_SECTOR_SIZE : /* Get sectors on the disk (WORD) */ + *(WORD*)buff = 512; + res = RES_OK; + break; + + case CTRL_SYNC : /* Make sure that data has been written */ + if (wait_ready() == 0xFF) + res = RES_OK; + break; + + case MMC_GET_CSD : /* Receive CSD as a data block (16 bytes) */ + if (send_cmd(CMD9, 0) == 0 /* READ_CSD */ + && rcvr_datablock(ptr, 16)) + res = RES_OK; + break; + + case MMC_GET_CID : /* Receive CID as a data block (16 bytes) */ + if (send_cmd(CMD10, 0) == 0 /* READ_CID */ + && rcvr_datablock(ptr, 16)) + res = RES_OK; + break; + + case MMC_GET_OCR : /* Receive OCR as an R3 resp (4 bytes) */ + if (send_cmd(CMD58, 0) == 0) { /* READ_OCR */ + for (n = 0; n < 4; n++) + *ptr++ = rcvr_spi(); + res = RES_OK; + } + +// case MMC_GET_TYPE : /* Get card type flags (1 byte) */ +// *ptr = CardType; +// res = RES_OK; +// break; + + default: + res = RES_PARERR; + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + } + + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Device Timer Interrupt Procedure (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* This function must be called in period of 10ms */ + +void disk_timerproc (void) +{ +// BYTE n, s; + BYTE n; + + + n = Timer1; /* 100Hz decrement timer */ + if (n) Timer1 = --n; + n = Timer2; + if (n) Timer2 = --n; + +} + +/*---------------------------------------------------------*/ +/* User Provided Timer Function for FatFs module */ +/*---------------------------------------------------------*/ +/* This is a real time clock service to be called from */ +/* FatFs module. Any valid time must be returned even if */ +/* the system does not support a real time clock. */ + +DWORD get_fattime (void) +{ + + return ((2007UL-1980) << 25) // Year = 2007 + | (6UL << 21) // Month = June + | (5UL << 16) // Day = 5 + | (11U << 11) // Hour = 11 + | (38U << 5) // Min = 38 + | (0U >> 1) // Sec = 0 + ; + +} diff --git a/third_party/fatfs/port/mmc-dk-tm4c129x.c b/third_party/fatfs/port/mmc-dk-tm4c129x.c new file mode 100644 index 0000000..55917c4 --- /dev/null +++ b/third_party/fatfs/port/mmc-dk-tm4c129x.c @@ -0,0 +1,740 @@ +/*-----------------------------------------------------------------------*/ +/* MMC/SDC (in SPI mode) control module (C)ChaN, 2007 */ +/*-----------------------------------------------------------------------*/ +/* Only rcvr_spi(), xmit_spi(), disk_timerproc() and some macros */ +/* are platform dependent. */ +/*-----------------------------------------------------------------------*/ + +/* + * This file was modified from a sample available from the FatFs + * web site. It was modified to work with an DK-TM4C129X development + * board. + */ + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/ssi.h" +#include "driverlib/sysctl.h" +#include "fatfs/src/diskio.h" + +/* Definitions for MMC/SDC command */ +#define CMD0 (0x40+0) /* GO_IDLE_STATE */ +#define CMD1 (0x40+1) /* SEND_OP_COND */ +#define CMD8 (0x40+8) /* SEND_IF_COND */ +#define CMD9 (0x40+9) /* SEND_CSD */ +#define CMD10 (0x40+10) /* SEND_CID */ +#define CMD12 (0x40+12) /* STOP_TRANSMISSION */ +#define CMD16 (0x40+16) /* SET_BLOCKLEN */ +#define CMD17 (0x40+17) /* READ_SINGLE_BLOCK */ +#define CMD18 (0x40+18) /* READ_MULTIPLE_BLOCK */ +#define CMD23 (0x40+23) /* SET_BLOCK_COUNT */ +#define CMD24 (0x40+24) /* WRITE_BLOCK */ +#define CMD25 (0x40+25) /* WRITE_MULTIPLE_BLOCK */ +#define CMD41 (0x40+41) /* SEND_OP_COND (ACMD) */ +#define CMD55 (0x40+55) /* APP_CMD */ +#define CMD58 (0x40+58) /* READ_OCR */ + +/* Peripheral definitions for DK-TM4C129X board */ +/* SSI port */ +#define SDC_SSI_BASE SSI3_BASE +#define SDC_SSI_SYSCTL_PERIPH SYSCTL_PERIPH_SSI3 + +/* GPIO for SSI pins */ +/* CLK pin */ +#define SDC_SSI_CLK_GPIO_PORT_BASE GPIO_PORTQ_BASE +#define SDC_SSI_CLK GPIO_PIN_0 +/* TX pin */ +#define SDC_SSI_TX_GPIO_PORT_BASE GPIO_PORTF_BASE +#define SDC_SSI_TX GPIO_PIN_0 +/* RX pin */ +#define SDC_SSI_RX_GPIO_PORT_BASE GPIO_PORTQ_BASE +#define SDC_SSI_RX GPIO_PIN_2 +/* CS pin */ +#define SDC_SSI_FSS_GPIO_PORT_BASE GPIO_PORTH_BASE +#define SDC_SSI_FSS GPIO_PIN_4 + +/* must be supplied by the application */ +extern uint32_t g_ui32SysClock; + +/* asserts the CS pin to the card */ +static +void SELECT (void) +{ + ROM_GPIOPinWrite(SDC_SSI_FSS_GPIO_PORT_BASE, SDC_SSI_FSS, 0); +} + +/* de-asserts the CS pin to the card */ +static +void DESELECT (void) +{ + ROM_GPIOPinWrite(SDC_SSI_FSS_GPIO_PORT_BASE, SDC_SSI_FSS, SDC_SSI_FSS); +} + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + +static volatile +DSTATUS Stat = STA_NOINIT; /* Disk status */ + +static volatile +BYTE Timer1, Timer2; /* 100Hz decrement timer */ + +static +BYTE CardType; /* b0:MMC, b1:SDC, b2:Block addressing */ + +static +BYTE PowerFlag = 0; /* indicates if "power" is on */ + +/*-----------------------------------------------------------------------*/ +/* Transmit a byte to MMC via SPI (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +static +void xmit_spi(BYTE dat) +{ + uint32_t ui32RcvDat; + + ROM_SSIDataPut(SDC_SSI_BASE, dat); /* Write the data to the tx fifo */ + + ROM_SSIDataGet(SDC_SSI_BASE, &ui32RcvDat); /* flush data read during the write */ +} + + +/*-----------------------------------------------------------------------*/ +/* Receive a byte from MMC via SPI (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +static +BYTE rcvr_spi (void) +{ + uint32_t ui32RcvDat; + + ROM_SSIDataPut(SDC_SSI_BASE, 0xFF); /* write dummy data */ + + ROM_SSIDataGet(SDC_SSI_BASE, &ui32RcvDat); /* read data frm rx fifo */ + + return (BYTE)ui32RcvDat; +} + + +static +void rcvr_spi_m (BYTE *dst) +{ + *dst = rcvr_spi(); +} + +/*-----------------------------------------------------------------------*/ +/* Wait for card ready */ +/*-----------------------------------------------------------------------*/ + +static +BYTE wait_ready (void) +{ + BYTE res; + + + Timer2 = 50; /* Wait for ready in timeout of 500ms */ + rcvr_spi(); + do + res = rcvr_spi(); + while ((res != 0xFF) && Timer2); + + return res; +} + +/*-----------------------------------------------------------------------*/ +/* Send 80 or so clock transitions with CS and DI held high. This is */ +/* required after card power up to get it into SPI mode */ +/*-----------------------------------------------------------------------*/ +static +void send_initial_clock_train(void) +{ + unsigned int i; + uint32_t ui32Dat; + + /* Ensure CS is held high. */ + DESELECT(); + + /* Switch the SSI TX line to a GPIO and drive it high too. */ + ROM_GPIOPinTypeGPIOOutput(SDC_SSI_TX_GPIO_PORT_BASE, SDC_SSI_TX); + ROM_GPIOPinWrite(SDC_SSI_TX_GPIO_PORT_BASE, SDC_SSI_TX, SDC_SSI_TX); + + /* Send 10 bytes over the SSI. This causes the clock to wiggle the */ + /* required number of times. */ + for(i = 0 ; i < 10 ; i++) + { + /* Write DUMMY data. SSIDataPut() waits until there is room in the */ + /* FIFO. */ + ROM_SSIDataPut(SDC_SSI_BASE, 0xFF); + + /* Flush data read during data write. */ + ROM_SSIDataGet(SDC_SSI_BASE, &ui32Dat); + } + + /* Revert to hardware control of the SSI TX line. */ + ROM_GPIOPinTypeSSI(SDC_SSI_TX_GPIO_PORT_BASE, SDC_SSI_TX); +} + +/*-----------------------------------------------------------------------*/ +/* Power Control (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* When the target system does not support socket power control, there */ +/* is nothing to do in these functions and chk_power always returns 1. */ + +static +void power_on (void) +{ + /* + * This doesn't really turn the power on, but initializes the + * SSI port and pins needed to talk to the card. + */ + + /* Enable the peripherals used to drive the SDC on SSI */ + ROM_SysCtlPeripheralEnable(SDC_SSI_SYSCTL_PERIPH); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH); + + /* + * Configure the appropriate pins to be SSI instead of GPIO. The FSS (CS) + * signal is directly driven to ensure that we can hold it low through a + * complete transaction with the SD card. + */ + ROM_GPIOPinTypeSSI(SDC_SSI_TX_GPIO_PORT_BASE, SDC_SSI_TX); + ROM_GPIOPinTypeSSI(SDC_SSI_RX_GPIO_PORT_BASE, SDC_SSI_RX); + ROM_GPIOPinTypeSSI(SDC_SSI_CLK_GPIO_PORT_BASE, SDC_SSI_CLK); + ROM_GPIOPinTypeGPIOOutput(SDC_SSI_FSS_GPIO_PORT_BASE, SDC_SSI_FSS); + + /* + * Set the SSI output pins to 4MA drive strength and engage the + * pull-up on the receive line. + */ + MAP_GPIOPadConfigSet(SDC_SSI_RX_GPIO_PORT_BASE, SDC_SSI_RX, + GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD_WPU); + MAP_GPIOPadConfigSet(SDC_SSI_CLK_GPIO_PORT_BASE, SDC_SSI_CLK, + GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD); + MAP_GPIOPadConfigSet(SDC_SSI_TX_GPIO_PORT_BASE, SDC_SSI_TX, + GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD); + MAP_GPIOPadConfigSet(SDC_SSI_FSS_GPIO_PORT_BASE, SDC_SSI_FSS, + GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD); + + /* Configure the SSI3 port */ + ROM_SSIConfigSetExpClk(SDC_SSI_BASE, g_ui32SysClock, + SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 400000, 8); + ROM_SSIEnable(SDC_SSI_BASE); + + /* Set DI and CS high and apply more than 74 pulses to SCLK for the card */ + /* to be able to accept a native command. */ + send_initial_clock_train(); + + PowerFlag = 1; +} + +// set the SSI speed to the max setting +static +void set_max_speed(void) +{ + unsigned long i; + + /* Disable the SSI */ + ROM_SSIDisable(SDC_SSI_BASE); + + /* Set the maximum speed as half the system clock, with a max of 12.5 MHz. */ + i = g_ui32SysClock / 2; + if(i > 12500000) + { + i = 12500000; + } + + /* Configure the SSI0 port to run at 12.5MHz */ + ROM_SSIConfigSetExpClk(SDC_SSI_BASE, g_ui32SysClock, + SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, i, 8); + + /* Enable the SSI */ + ROM_SSIEnable(SDC_SSI_BASE); +} + +static +void power_off (void) +{ + PowerFlag = 0; +} + +static +int chk_power(void) /* Socket power state: 0=off, 1=on */ +{ + return PowerFlag; +} + + + +/*-----------------------------------------------------------------------*/ +/* Receive a data packet from MMC */ +/*-----------------------------------------------------------------------*/ + +static +BOOL rcvr_datablock ( + BYTE *buff, /* Data buffer to store received data */ + UINT btr /* Byte count (must be even number) */ +) +{ + BYTE token; + + + Timer1 = 100; + do { /* Wait for data packet in timeout of 100ms */ + token = rcvr_spi(); + } while ((token == 0xFF) && Timer1); + if(token != 0xFE) return FALSE; /* If not valid data token, retutn with error */ + + do { /* Receive the data block into buffer */ + rcvr_spi_m(buff++); + rcvr_spi_m(buff++); + } while (btr -= 2); + rcvr_spi(); /* Discard CRC */ + rcvr_spi(); + + return TRUE; /* Return with success */ +} + + + +/*-----------------------------------------------------------------------*/ +/* Send a data packet to MMC */ +/*-----------------------------------------------------------------------*/ + +#if _READONLY == 0 +static +BOOL xmit_datablock ( + const BYTE *buff, /* 512 byte data block to be transmitted */ + BYTE token /* Data/Stop token */ +) +{ + BYTE resp, wc; + + + if (wait_ready() != 0xFF) return FALSE; + + xmit_spi(token); /* Xmit data token */ + if (token != 0xFD) { /* Is data token */ + wc = 0; + do { /* Xmit the 512 byte data block to MMC */ + xmit_spi(*buff++); + xmit_spi(*buff++); + } while (--wc); + xmit_spi(0xFF); /* CRC (Dummy) */ + xmit_spi(0xFF); + resp = rcvr_spi(); /* Reveive data response */ + if ((resp & 0x1F) != 0x05) /* If not accepted, return with error */ + return FALSE; + } + + return TRUE; +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Send a command packet to MMC */ +/*-----------------------------------------------------------------------*/ + +static +BYTE send_cmd ( + BYTE cmd, /* Command byte */ + DWORD arg /* Argument */ +) +{ + BYTE n, res; + + + if (wait_ready() != 0xFF) return 0xFF; + + /* Send command packet */ + xmit_spi(cmd); /* Command */ + xmit_spi((BYTE)(arg >> 24)); /* Argument[31..24] */ + xmit_spi((BYTE)(arg >> 16)); /* Argument[23..16] */ + xmit_spi((BYTE)(arg >> 8)); /* Argument[15..8] */ + xmit_spi((BYTE)arg); /* Argument[7..0] */ + n = 0xff; + if (cmd == CMD0) n = 0x95; /* CRC for CMD0(0) */ + if (cmd == CMD8) n = 0x87; /* CRC for CMD8(0x1AA) */ + xmit_spi(n); + + /* Receive command response */ + if (cmd == CMD12) rcvr_spi(); /* Skip a stuff byte when stop reading */ + n = 10; /* Wait for a valid response in timeout of 10 attempts */ + do + res = rcvr_spi(); + while ((res & 0x80) && --n); + + return res; /* Return with the response value */ +} + +/*-----------------------------------------------------------------------* + * Send the special command used to terminate a multi-sector read. + * + * This is the only command which can be sent while the SDCard is sending + * data. The SDCard spec indicates that the data transfer will stop 2 bytes + * after the 6 byte CMD12 command is sent and that the card will then send + * 0xFF for between 2 and 6 more bytes before the R1 response byte. This + * response will be followed by another 0xFF byte. In testing, however, it + * seems that some cards don't send the 2 to 6 0xFF bytes between the end of + * data transmission and the response code. This function, therefore, merely + * reads 10 bytes and, if the last one read is 0xFF, returns the value of the + * latest non-0xFF byte as the response code. + * + *-----------------------------------------------------------------------*/ + +static +BYTE send_cmd12 (void) +{ + BYTE n, res, val; + + /* For CMD12, we don't wait for the card to be idle before we send + * the new command. + */ + + /* Send command packet - the argument for CMD12 is ignored. */ + xmit_spi(CMD12); + xmit_spi(0); + xmit_spi(0); + xmit_spi(0); + xmit_spi(0); + xmit_spi(0); + + /* Read up to 10 bytes from the card, remembering the value read if it's + not 0xFF */ + for(n = 0; n < 10; n++) + { + val = rcvr_spi(); + if(val != 0xFF) + { + res = val; + } + } + + return res; /* Return with the response value */ +} + +/*-------------------------------------------------------------------------- + + Public Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Initialize Disk Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE drv /* Physical drive nmuber (0) */ +) +{ + BYTE n, ty, ocr[4]; + + + if (drv) return STA_NOINIT; /* Supports only single drive */ + if (Stat & STA_NODISK) return Stat; /* No card in the socket */ + + power_on(); /* Force socket power on */ + send_initial_clock_train(); /* Ensure the card is in SPI mode */ + + SELECT(); /* CS = L */ + ty = 0; + if (send_cmd(CMD0, 0) == 1) { /* Enter Idle state */ + Timer1 = 100; /* Initialization timeout of 1000 msec */ + if (send_cmd(CMD8, 0x1AA) == 1) { /* SDC Ver2+ */ + for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); + if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* The card can work at vdd range of 2.7-3.6V */ + do { + if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 1UL << 30) == 0) break; /* ACMD41 with HCS bit */ + } while (Timer1); + if (Timer1 && send_cmd(CMD58, 0) == 0) { /* Check CCS bit */ + for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); + ty = (ocr[0] & 0x40) ? 6 : 2; + } + } + } else { /* SDC Ver1 or MMC */ + ty = (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) <= 1) ? 2 : 1; /* SDC : MMC */ + do { + if (ty == 2) { + if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) == 0) break; /* ACMD41 */ + } else { + if (send_cmd(CMD1, 0) == 0) break; /* CMD1 */ + } + } while (Timer1); + if (!Timer1 || send_cmd(CMD16, 512) != 0) /* Select R/W block length */ + ty = 0; + } + } + CardType = ty; + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + if (ty) { /* Initialization succeded */ + Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */ + set_max_speed(); + } else { /* Initialization failed */ + power_off(); + } + + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Get Disk Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE drv /* Physical drive nmuber (0) */ +) +{ + if (drv) return STA_NOINIT; /* Supports only single drive */ + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE drv, /* Physical drive nmuber (0) */ + BYTE *buff, /* Pointer to the data buffer to store read data */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count /* Sector count (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + + if (!(CardType & 4)) sector *= 512; /* Convert to byte address if needed */ + + SELECT(); /* CS = L */ + + if (count == 1) { /* Single block read */ + if ((send_cmd(CMD17, sector) == 0) /* READ_SINGLE_BLOCK */ + && rcvr_datablock(buff, 512)) + count = 0; + } + else { /* Multiple block read */ + if (send_cmd(CMD18, sector) == 0) { /* READ_MULTIPLE_BLOCK */ + do { + if (!rcvr_datablock(buff, 512)) break; + buff += 512; + } while (--count); + send_cmd12(); /* STOP_TRANSMISSION */ + } + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + return count ? RES_ERROR : RES_OK; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ +/*-----------------------------------------------------------------------*/ + +#if _READONLY == 0 +DRESULT disk_write ( + BYTE drv, /* Physical drive nmuber (0) */ + const BYTE *buff, /* Pointer to the data to be written */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count /* Sector count (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + if (Stat & STA_PROTECT) return RES_WRPRT; + + if (!(CardType & 4)) sector *= 512; /* Convert to byte address if needed */ + + SELECT(); /* CS = L */ + + if (count == 1) { /* Single block write */ + if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */ + && xmit_datablock(buff, 0xFE)) + count = 0; + } + else { /* Multiple block write */ + if (CardType & 2) { + send_cmd(CMD55, 0); send_cmd(CMD23, count); /* ACMD23 */ + } + if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */ + do { + if (!xmit_datablock(buff, 0xFC)) break; + buff += 512; + } while (--count); + if (!xmit_datablock(0, 0xFD)) /* STOP_TRAN token */ + count = 1; + } + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + return count ? RES_ERROR : RES_OK; +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_ioctl ( + BYTE drv, /* Physical drive nmuber (0) */ + BYTE ctrl, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + DRESULT res; + BYTE n, csd[16], *ptr = buff; + WORD csize; + + + if (drv) return RES_PARERR; + + res = RES_ERROR; + + if (ctrl == CTRL_POWER) { + switch (*ptr) { + case 0: /* Sub control code == 0 (POWER_OFF) */ + if (chk_power()) + power_off(); /* Power off */ + res = RES_OK; + break; + case 1: /* Sub control code == 1 (POWER_ON) */ + power_on(); /* Power on */ + res = RES_OK; + break; + case 2: /* Sub control code == 2 (POWER_GET) */ + *(ptr+1) = (BYTE)chk_power(); + res = RES_OK; + break; + default : + res = RES_PARERR; + } + } + else { + if (Stat & STA_NOINIT) return RES_NOTRDY; + + SELECT(); /* CS = L */ + + switch (ctrl) { + case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */ + if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { + if ((csd[0] >> 6) == 1) { /* SDC ver 2.00 */ + csize = csd[9] + ((WORD)csd[8] << 8) + 1; + *(DWORD*)buff = (DWORD)csize << 10; + } else { /* MMC or SDC ver 1.XX */ + n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2; + csize = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1; + *(DWORD*)buff = (DWORD)csize << (n - 9); + } + res = RES_OK; + } + break; + + case GET_SECTOR_SIZE : /* Get sectors on the disk (WORD) */ + *(WORD*)buff = 512; + res = RES_OK; + break; + + case CTRL_SYNC : /* Make sure that data has been written */ + if (wait_ready() == 0xFF) + res = RES_OK; + break; + + case MMC_GET_CSD : /* Receive CSD as a data block (16 bytes) */ + if (send_cmd(CMD9, 0) == 0 /* READ_CSD */ + && rcvr_datablock(ptr, 16)) + res = RES_OK; + break; + + case MMC_GET_CID : /* Receive CID as a data block (16 bytes) */ + if (send_cmd(CMD10, 0) == 0 /* READ_CID */ + && rcvr_datablock(ptr, 16)) + res = RES_OK; + break; + + case MMC_GET_OCR : /* Receive OCR as an R3 resp (4 bytes) */ + if (send_cmd(CMD58, 0) == 0) { /* READ_OCR */ + for (n = 0; n < 4; n++) + *ptr++ = rcvr_spi(); + res = RES_OK; + } + +// case MMC_GET_TYPE : /* Get card type flags (1 byte) */ +// *ptr = CardType; +// res = RES_OK; +// break; + + default: + res = RES_PARERR; + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + } + + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Device Timer Interrupt Procedure (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* This function must be called in period of 10ms */ + +void disk_timerproc (void) +{ +// BYTE n, s; + BYTE n; + + + n = Timer1; /* 100Hz decrement timer */ + if (n) Timer1 = --n; + n = Timer2; + if (n) Timer2 = --n; + +} + +/*---------------------------------------------------------*/ +/* User Provided Timer Function for FatFs module */ +/*---------------------------------------------------------*/ +/* This is a real time clock service to be called from */ +/* FatFs module. Any valid time must be returned even if */ +/* the system does not support a real time clock. */ + +DWORD get_fattime (void) +{ + + return ((2007UL-1980) << 25) // Year = 2007 + | (6UL << 21) // Month = June + | (5UL << 16) // Day = 5 + | (11U << 11) // Hour = 11 + | (38U << 5) // Min = 38 + | (0U >> 1) // Sec = 0 + ; + +} diff --git a/third_party/fatfs/port/mmc-ek-lm4f232.c b/third_party/fatfs/port/mmc-ek-lm4f232.c new file mode 100644 index 0000000..5f58525 --- /dev/null +++ b/third_party/fatfs/port/mmc-ek-lm4f232.c @@ -0,0 +1,725 @@ +/*-----------------------------------------------------------------------*/ +/* MMC/SDC (in SPI mode) control module (C)ChaN, 2007 */ +/*-----------------------------------------------------------------------*/ +/* Only rcvr_spi(), xmit_spi(), disk_timerproc() and some macros */ +/* are platform dependent. */ +/*-----------------------------------------------------------------------*/ + +/* + * This file was modified from a sample available from the FatFs + * web site. It was modified to work with an EK-LM4F232 evaluation + * board. + */ + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/ssi.h" +#include "driverlib/sysctl.h" +#include "fatfs/src/diskio.h" + +/* Definitions for MMC/SDC command */ +#define CMD0 (0x40+0) /* GO_IDLE_STATE */ +#define CMD1 (0x40+1) /* SEND_OP_COND */ +#define CMD8 (0x40+8) /* SEND_IF_COND */ +#define CMD9 (0x40+9) /* SEND_CSD */ +#define CMD10 (0x40+10) /* SEND_CID */ +#define CMD12 (0x40+12) /* STOP_TRANSMISSION */ +#define CMD16 (0x40+16) /* SET_BLOCKLEN */ +#define CMD17 (0x40+17) /* READ_SINGLE_BLOCK */ +#define CMD18 (0x40+18) /* READ_MULTIPLE_BLOCK */ +#define CMD23 (0x40+23) /* SET_BLOCK_COUNT */ +#define CMD24 (0x40+24) /* WRITE_BLOCK */ +#define CMD25 (0x40+25) /* WRITE_MULTIPLE_BLOCK */ +#define CMD41 (0x40+41) /* SEND_OP_COND (ACMD) */ +#define CMD55 (0x40+55) /* APP_CMD */ +#define CMD58 (0x40+58) /* READ_OCR */ + +/* Peripheral definitions for EK-LM4F232 board */ +// SSI port +#define SDC_SSI_BASE SSI0_BASE +#define SDC_SSI_SYSCTL_PERIPH SYSCTL_PERIPH_SSI0 + +// GPIO for SSI pins +#define SDC_GPIO_PORT_BASE GPIO_PORTA_BASE +#define SDC_GPIO_SYSCTL_PERIPH SYSCTL_PERIPH_GPIOA +#define SDC_SSI_CLK GPIO_PIN_2 +#define SDC_SSI_TX GPIO_PIN_5 +#define SDC_SSI_RX GPIO_PIN_4 +#define SDC_SSI_FSS GPIO_PIN_3 +#define SDC_SSI_PINS (SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK | \ + SDC_SSI_FSS) + +// asserts the CS pin to the card +static +void SELECT (void) +{ + ROM_GPIOPinWrite(SDC_GPIO_PORT_BASE, SDC_SSI_FSS, 0); +} + +// de-asserts the CS pin to the card +static +void DESELECT (void) +{ + ROM_GPIOPinWrite(SDC_GPIO_PORT_BASE, SDC_SSI_FSS, SDC_SSI_FSS); +} + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + +static volatile +DSTATUS Stat = STA_NOINIT; /* Disk status */ + +static volatile +BYTE Timer1, Timer2; /* 100Hz decrement timer */ + +static +BYTE CardType; /* b0:MMC, b1:SDC, b2:Block addressing */ + +static +BYTE PowerFlag = 0; /* indicates if "power" is on */ + +/*-----------------------------------------------------------------------*/ +/* Transmit a byte to MMC via SPI (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +static +void xmit_spi(BYTE dat) +{ + uint32_t ui32RcvDat; + + ROM_SSIDataPut(SDC_SSI_BASE, dat); /* Write the data to the tx fifo */ + + ROM_SSIDataGet(SDC_SSI_BASE, &ui32RcvDat); /* flush data read during the write */ +} + + +/*-----------------------------------------------------------------------*/ +/* Receive a byte from MMC via SPI (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +static +BYTE rcvr_spi (void) +{ + uint32_t ui32RcvDat; + + ROM_SSIDataPut(SDC_SSI_BASE, 0xFF); /* write dummy data */ + + ROM_SSIDataGet(SDC_SSI_BASE, &ui32RcvDat); /* read data frm rx fifo */ + + return (BYTE)ui32RcvDat; +} + + +static +void rcvr_spi_m (BYTE *dst) +{ + *dst = rcvr_spi(); +} + +/*-----------------------------------------------------------------------*/ +/* Wait for card ready */ +/*-----------------------------------------------------------------------*/ + +static +BYTE wait_ready (void) +{ + BYTE res; + + + Timer2 = 50; /* Wait for ready in timeout of 500ms */ + rcvr_spi(); + do + res = rcvr_spi(); + while ((res != 0xFF) && Timer2); + + return res; +} + +/*-----------------------------------------------------------------------*/ +/* Send 80 or so clock transitions with CS and DI held high. This is */ +/* required after card power up to get it into SPI mode */ +/*-----------------------------------------------------------------------*/ +static +void send_initial_clock_train(void) +{ + unsigned int i; + uint32_t ui32Dat; + + /* Ensure CS is held high. */ + DESELECT(); + + /* Switch the SSI TX line to a GPIO and drive it high too. */ + ROM_GPIOPinTypeGPIOOutput(SDC_GPIO_PORT_BASE, SDC_SSI_TX); + ROM_GPIOPinWrite(SDC_GPIO_PORT_BASE, SDC_SSI_TX, SDC_SSI_TX); + + /* Send 10 bytes over the SSI. This causes the clock to wiggle the */ + /* required number of times. */ + for(i = 0 ; i < 10 ; i++) + { + /* Write DUMMY data. SSIDataPut() waits until there is room in the */ + /* FIFO. */ + ROM_SSIDataPut(SDC_SSI_BASE, 0xFF); + + /* Flush data read during data write. */ + ROM_SSIDataGet(SDC_SSI_BASE, &ui32Dat); + } + + /* Revert to hardware control of the SSI TX line. */ + ROM_GPIOPinTypeSSI(SDC_GPIO_PORT_BASE, SDC_SSI_TX); +} + +/*-----------------------------------------------------------------------*/ +/* Power Control (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* When the target system does not support socket power control, there */ +/* is nothing to do in these functions and chk_power always returns 1. */ + +static +void power_on (void) +{ + /* + * This doesn't really turn the power on, but initializes the + * SSI port and pins needed to talk to the card. + */ + + /* Enable the peripherals used to drive the SDC on SSI */ + ROM_SysCtlPeripheralEnable(SDC_SSI_SYSCTL_PERIPH); + ROM_SysCtlPeripheralEnable(SDC_GPIO_SYSCTL_PERIPH); + + /* + * Configure the appropriate pins to be SSI instead of GPIO. The FSS (CS) + * signal is directly driven to ensure that we can hold it low through a + * complete transaction with the SD card. + */ + ROM_GPIOPinTypeSSI(SDC_GPIO_PORT_BASE, SDC_SSI_TX | SDC_SSI_RX | SDC_SSI_CLK); + ROM_GPIOPinTypeGPIOOutput(SDC_GPIO_PORT_BASE, SDC_SSI_FSS); + + /* + * Set the SSI output pins to 4MA drive strength and engage the + * pull-up on the receive line. + */ + MAP_GPIOPadConfigSet(SDC_GPIO_PORT_BASE, SDC_SSI_RX, GPIO_STRENGTH_4MA, + GPIO_PIN_TYPE_STD_WPU); + MAP_GPIOPadConfigSet(SDC_GPIO_PORT_BASE, SDC_SSI_CLK | SDC_SSI_TX | SDC_SSI_FSS, + GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD); + + /* Configure the SSI0 port */ + ROM_SSIConfigSetExpClk(SDC_SSI_BASE, ROM_SysCtlClockGet(), + SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 400000, 8); + ROM_SSIEnable(SDC_SSI_BASE); + + /* Set DI and CS high and apply more than 74 pulses to SCLK for the card */ + /* to be able to accept a native command. */ + send_initial_clock_train(); + + PowerFlag = 1; +} + +// set the SSI speed to the max setting +static +void set_max_speed(void) +{ + unsigned long i; + + /* Disable the SSI */ + ROM_SSIDisable(SDC_SSI_BASE); + + /* Set the maximum speed as half the system clock, with a max of 12.5 MHz. */ + i = ROM_SysCtlClockGet() / 2; + if(i > 12500000) + { + i = 12500000; + } + + /* Configure the SSI0 port to run at 12.5MHz */ + ROM_SSIConfigSetExpClk(SDC_SSI_BASE, ROM_SysCtlClockGet(), + SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, i, 8); + + /* Enable the SSI */ + ROM_SSIEnable(SDC_SSI_BASE); +} + +static +void power_off (void) +{ + PowerFlag = 0; +} + +static +int chk_power(void) /* Socket power state: 0=off, 1=on */ +{ + return PowerFlag; +} + + + +/*-----------------------------------------------------------------------*/ +/* Receive a data packet from MMC */ +/*-----------------------------------------------------------------------*/ + +static +BOOL rcvr_datablock ( + BYTE *buff, /* Data buffer to store received data */ + UINT btr /* Byte count (must be even number) */ +) +{ + BYTE token; + + + Timer1 = 100; + do { /* Wait for data packet in timeout of 100ms */ + token = rcvr_spi(); + } while ((token == 0xFF) && Timer1); + if(token != 0xFE) return FALSE; /* If not valid data token, retutn with error */ + + do { /* Receive the data block into buffer */ + rcvr_spi_m(buff++); + rcvr_spi_m(buff++); + } while (btr -= 2); + rcvr_spi(); /* Discard CRC */ + rcvr_spi(); + + return TRUE; /* Return with success */ +} + + + +/*-----------------------------------------------------------------------*/ +/* Send a data packet to MMC */ +/*-----------------------------------------------------------------------*/ + +#if _READONLY == 0 +static +BOOL xmit_datablock ( + const BYTE *buff, /* 512 byte data block to be transmitted */ + BYTE token /* Data/Stop token */ +) +{ + BYTE resp, wc; + + + if (wait_ready() != 0xFF) return FALSE; + + xmit_spi(token); /* Xmit data token */ + if (token != 0xFD) { /* Is data token */ + wc = 0; + do { /* Xmit the 512 byte data block to MMC */ + xmit_spi(*buff++); + xmit_spi(*buff++); + } while (--wc); + xmit_spi(0xFF); /* CRC (Dummy) */ + xmit_spi(0xFF); + resp = rcvr_spi(); /* Reveive data response */ + if ((resp & 0x1F) != 0x05) /* If not accepted, return with error */ + return FALSE; + } + + return TRUE; +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Send a command packet to MMC */ +/*-----------------------------------------------------------------------*/ + +static +BYTE send_cmd ( + BYTE cmd, /* Command byte */ + DWORD arg /* Argument */ +) +{ + BYTE n, res; + + + if (wait_ready() != 0xFF) return 0xFF; + + /* Send command packet */ + xmit_spi(cmd); /* Command */ + xmit_spi((BYTE)(arg >> 24)); /* Argument[31..24] */ + xmit_spi((BYTE)(arg >> 16)); /* Argument[23..16] */ + xmit_spi((BYTE)(arg >> 8)); /* Argument[15..8] */ + xmit_spi((BYTE)arg); /* Argument[7..0] */ + n = 0xff; + if (cmd == CMD0) n = 0x95; /* CRC for CMD0(0) */ + if (cmd == CMD8) n = 0x87; /* CRC for CMD8(0x1AA) */ + xmit_spi(n); + + /* Receive command response */ + if (cmd == CMD12) rcvr_spi(); /* Skip a stuff byte when stop reading */ + n = 10; /* Wait for a valid response in timeout of 10 attempts */ + do + res = rcvr_spi(); + while ((res & 0x80) && --n); + + return res; /* Return with the response value */ +} + +/*-----------------------------------------------------------------------* + * Send the special command used to terminate a multi-sector read. + * + * This is the only command which can be sent while the SDCard is sending + * data. The SDCard spec indicates that the data transfer will stop 2 bytes + * after the 6 byte CMD12 command is sent and that the card will then send + * 0xFF for between 2 and 6 more bytes before the R1 response byte. This + * response will be followed by another 0xFF byte. In testing, however, it + * seems that some cards don't send the 2 to 6 0xFF bytes between the end of + * data transmission and the response code. This function, therefore, merely + * reads 10 bytes and, if the last one read is 0xFF, returns the value of the + * latest non-0xFF byte as the response code. + * + *-----------------------------------------------------------------------*/ + +static +BYTE send_cmd12 (void) +{ + BYTE n, res, val; + + /* For CMD12, we don't wait for the card to be idle before we send + * the new command. + */ + + /* Send command packet - the argument for CMD12 is ignored. */ + xmit_spi(CMD12); + xmit_spi(0); + xmit_spi(0); + xmit_spi(0); + xmit_spi(0); + xmit_spi(0); + + /* Read up to 10 bytes from the card, remembering the value read if it's + not 0xFF */ + for(n = 0; n < 10; n++) + { + val = rcvr_spi(); + if(val != 0xFF) + { + res = val; + } + } + + return res; /* Return with the response value */ +} + +/*-------------------------------------------------------------------------- + + Public Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Initialize Disk Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE drv /* Physical drive nmuber (0) */ +) +{ + BYTE n, ty, ocr[4]; + + + if (drv) return STA_NOINIT; /* Supports only single drive */ + if (Stat & STA_NODISK) return Stat; /* No card in the socket */ + + power_on(); /* Force socket power on */ + send_initial_clock_train(); /* Ensure the card is in SPI mode */ + + SELECT(); /* CS = L */ + ty = 0; + if (send_cmd(CMD0, 0) == 1) { /* Enter Idle state */ + Timer1 = 100; /* Initialization timeout of 1000 msec */ + if (send_cmd(CMD8, 0x1AA) == 1) { /* SDC Ver2+ */ + for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); + if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* The card can work at vdd range of 2.7-3.6V */ + do { + if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 1UL << 30) == 0) break; /* ACMD41 with HCS bit */ + } while (Timer1); + if (Timer1 && send_cmd(CMD58, 0) == 0) { /* Check CCS bit */ + for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); + ty = (ocr[0] & 0x40) ? 6 : 2; + } + } + } else { /* SDC Ver1 or MMC */ + ty = (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) <= 1) ? 2 : 1; /* SDC : MMC */ + do { + if (ty == 2) { + if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) == 0) break; /* ACMD41 */ + } else { + if (send_cmd(CMD1, 0) == 0) break; /* CMD1 */ + } + } while (Timer1); + if (!Timer1 || send_cmd(CMD16, 512) != 0) /* Select R/W block length */ + ty = 0; + } + } + CardType = ty; + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + if (ty) { /* Initialization succeded */ + Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */ + set_max_speed(); + } else { /* Initialization failed */ + power_off(); + } + + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Get Disk Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE drv /* Physical drive nmuber (0) */ +) +{ + if (drv) return STA_NOINIT; /* Supports only single drive */ + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE drv, /* Physical drive nmuber (0) */ + BYTE *buff, /* Pointer to the data buffer to store read data */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count /* Sector count (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + + if (!(CardType & 4)) sector *= 512; /* Convert to byte address if needed */ + + SELECT(); /* CS = L */ + + if (count == 1) { /* Single block read */ + if ((send_cmd(CMD17, sector) == 0) /* READ_SINGLE_BLOCK */ + && rcvr_datablock(buff, 512)) + count = 0; + } + else { /* Multiple block read */ + if (send_cmd(CMD18, sector) == 0) { /* READ_MULTIPLE_BLOCK */ + do { + if (!rcvr_datablock(buff, 512)) break; + buff += 512; + } while (--count); + send_cmd12(); /* STOP_TRANSMISSION */ + } + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + return count ? RES_ERROR : RES_OK; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ +/*-----------------------------------------------------------------------*/ + +#if _READONLY == 0 +DRESULT disk_write ( + BYTE drv, /* Physical drive nmuber (0) */ + const BYTE *buff, /* Pointer to the data to be written */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count /* Sector count (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + if (Stat & STA_PROTECT) return RES_WRPRT; + + if (!(CardType & 4)) sector *= 512; /* Convert to byte address if needed */ + + SELECT(); /* CS = L */ + + if (count == 1) { /* Single block write */ + if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */ + && xmit_datablock(buff, 0xFE)) + count = 0; + } + else { /* Multiple block write */ + if (CardType & 2) { + send_cmd(CMD55, 0); send_cmd(CMD23, count); /* ACMD23 */ + } + if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */ + do { + if (!xmit_datablock(buff, 0xFC)) break; + buff += 512; + } while (--count); + if (!xmit_datablock(0, 0xFD)) /* STOP_TRAN token */ + count = 1; + } + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + return count ? RES_ERROR : RES_OK; +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_ioctl ( + BYTE drv, /* Physical drive nmuber (0) */ + BYTE ctrl, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + DRESULT res; + BYTE n, csd[16], *ptr = buff; + WORD csize; + + + if (drv) return RES_PARERR; + + res = RES_ERROR; + + if (ctrl == CTRL_POWER) { + switch (*ptr) { + case 0: /* Sub control code == 0 (POWER_OFF) */ + if (chk_power()) + power_off(); /* Power off */ + res = RES_OK; + break; + case 1: /* Sub control code == 1 (POWER_ON) */ + power_on(); /* Power on */ + res = RES_OK; + break; + case 2: /* Sub control code == 2 (POWER_GET) */ + *(ptr+1) = (BYTE)chk_power(); + res = RES_OK; + break; + default : + res = RES_PARERR; + } + } + else { + if (Stat & STA_NOINIT) return RES_NOTRDY; + + SELECT(); /* CS = L */ + + switch (ctrl) { + case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */ + if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { + if ((csd[0] >> 6) == 1) { /* SDC ver 2.00 */ + csize = csd[9] + ((WORD)csd[8] << 8) + 1; + *(DWORD*)buff = (DWORD)csize << 10; + } else { /* MMC or SDC ver 1.XX */ + n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2; + csize = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1; + *(DWORD*)buff = (DWORD)csize << (n - 9); + } + res = RES_OK; + } + break; + + case GET_SECTOR_SIZE : /* Get sectors on the disk (WORD) */ + *(WORD*)buff = 512; + res = RES_OK; + break; + + case CTRL_SYNC : /* Make sure that data has been written */ + if (wait_ready() == 0xFF) + res = RES_OK; + break; + + case MMC_GET_CSD : /* Receive CSD as a data block (16 bytes) */ + if (send_cmd(CMD9, 0) == 0 /* READ_CSD */ + && rcvr_datablock(ptr, 16)) + res = RES_OK; + break; + + case MMC_GET_CID : /* Receive CID as a data block (16 bytes) */ + if (send_cmd(CMD10, 0) == 0 /* READ_CID */ + && rcvr_datablock(ptr, 16)) + res = RES_OK; + break; + + case MMC_GET_OCR : /* Receive OCR as an R3 resp (4 bytes) */ + if (send_cmd(CMD58, 0) == 0) { /* READ_OCR */ + for (n = 0; n < 4; n++) + *ptr++ = rcvr_spi(); + res = RES_OK; + } + +// case MMC_GET_TYPE : /* Get card type flags (1 byte) */ +// *ptr = CardType; +// res = RES_OK; +// break; + + default: + res = RES_PARERR; + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + } + + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Device Timer Interrupt Procedure (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* This function must be called in period of 10ms */ + +void disk_timerproc (void) +{ +// BYTE n, s; + BYTE n; + + + n = Timer1; /* 100Hz decrement timer */ + if (n) Timer1 = --n; + n = Timer2; + if (n) Timer2 = --n; + +} + +/*---------------------------------------------------------*/ +/* User Provided Timer Function for FatFs module */ +/*---------------------------------------------------------*/ +/* This is a real time clock service to be called from */ +/* FatFs module. Any valid time must be returned even if */ +/* the system does not support a real time clock. */ + +DWORD get_fattime (void) +{ + + return ((2007UL-1980) << 25) // Year = 2007 + | (6UL << 21) // Month = June + | (5UL << 16) // Day = 5 + | (11U << 11) // Hour = 11 + | (38U << 5) // Min = 38 + | (0U >> 1) // Sec = 0 + ; + +} diff --git a/third_party/fatfs/port/mmc-ek-tm4c1294xl.c b/third_party/fatfs/port/mmc-ek-tm4c1294xl.c new file mode 100644 index 0000000..ab80e14 --- /dev/null +++ b/third_party/fatfs/port/mmc-ek-tm4c1294xl.c @@ -0,0 +1,740 @@ +/*-----------------------------------------------------------------------*/ +/* MMC/SDC (in SPI mode) control module (C)ChaN, 2007 */ +/*-----------------------------------------------------------------------*/ +/* Only rcvr_spi(), xmit_spi(), disk_timerproc() and some macros */ +/* are platform dependent. */ +/*-----------------------------------------------------------------------*/ + +/* + * This file was modified from a sample available from the FatFs + * web site. It was modified to work with an EK-TM4C129EXL evaluation + * board. + */ + +#include +#include +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/gpio.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" +#include "driverlib/ssi.h" +#include "driverlib/sysctl.h" +#include "fatfs/src/diskio.h" + +/* Definitions for MMC/SDC command */ +#define CMD0 (0x40+0) /* GO_IDLE_STATE */ +#define CMD1 (0x40+1) /* SEND_OP_COND */ +#define CMD8 (0x40+8) /* SEND_IF_COND */ +#define CMD9 (0x40+9) /* SEND_CSD */ +#define CMD10 (0x40+10) /* SEND_CID */ +#define CMD12 (0x40+12) /* STOP_TRANSMISSION */ +#define CMD16 (0x40+16) /* SET_BLOCKLEN */ +#define CMD17 (0x40+17) /* READ_SINGLE_BLOCK */ +#define CMD18 (0x40+18) /* READ_MULTIPLE_BLOCK */ +#define CMD23 (0x40+23) /* SET_BLOCK_COUNT */ +#define CMD24 (0x40+24) /* WRITE_BLOCK */ +#define CMD25 (0x40+25) /* WRITE_MULTIPLE_BLOCK */ +#define CMD41 (0x40+41) /* SEND_OP_COND (ACMD) */ +#define CMD55 (0x40+55) /* APP_CMD */ +#define CMD58 (0x40+58) /* READ_OCR */ + +/* Peripheral definitions for EK-TM4C129EXL board */ +/* SSI port */ +#define SDC_SSI_BASE SSI3_BASE +#define SDC_SSI_SYSCTL_PERIPH SYSCTL_PERIPH_SSI3 + +/* GPIO for SSI pins */ +/* CLK pin */ +#define SDC_SSI_CLK_GPIO_PORT_BASE GPIO_PORTQ_BASE +#define SDC_SSI_CLK GPIO_PIN_0 +/* TX pin */ +#define SDC_SSI_TX_GPIO_PORT_BASE GPIO_PORTF_BASE +#define SDC_SSI_TX GPIO_PIN_0 +/* RX pin */ +#define SDC_SSI_RX_GPIO_PORT_BASE GPIO_PORTQ_BASE +#define SDC_SSI_RX GPIO_PIN_2 +/* CS pin */ +#define SDC_SSI_FSS_GPIO_PORT_BASE GPIO_PORTH_BASE +#define SDC_SSI_FSS GPIO_PIN_4 + +/* must be supplied by the application */ +extern uint32_t g_ui32SysClock; + +/* asserts the CS pin to the card */ +static +void SELECT (void) +{ + ROM_GPIOPinWrite(SDC_SSI_FSS_GPIO_PORT_BASE, SDC_SSI_FSS, 0); +} + +/* de-asserts the CS pin to the card */ +static +void DESELECT (void) +{ + ROM_GPIOPinWrite(SDC_SSI_FSS_GPIO_PORT_BASE, SDC_SSI_FSS, SDC_SSI_FSS); +} + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + +static volatile +DSTATUS Stat = STA_NOINIT; /* Disk status */ + +static volatile +BYTE Timer1, Timer2; /* 100Hz decrement timer */ + +static +BYTE CardType; /* b0:MMC, b1:SDC, b2:Block addressing */ + +static +BYTE PowerFlag = 0; /* indicates if "power" is on */ + +/*-----------------------------------------------------------------------*/ +/* Transmit a byte to MMC via SPI (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +static +void xmit_spi(BYTE dat) +{ + uint32_t ui32RcvDat; + + ROM_SSIDataPut(SDC_SSI_BASE, dat); /* Write the data to the tx fifo */ + + ROM_SSIDataGet(SDC_SSI_BASE, &ui32RcvDat); /* flush data read during the write */ +} + + +/*-----------------------------------------------------------------------*/ +/* Receive a byte from MMC via SPI (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +static +BYTE rcvr_spi (void) +{ + uint32_t ui32RcvDat; + + ROM_SSIDataPut(SDC_SSI_BASE, 0xFF); /* write dummy data */ + + ROM_SSIDataGet(SDC_SSI_BASE, &ui32RcvDat); /* read data frm rx fifo */ + + return (BYTE)ui32RcvDat; +} + + +static +void rcvr_spi_m (BYTE *dst) +{ + *dst = rcvr_spi(); +} + +/*-----------------------------------------------------------------------*/ +/* Wait for card ready */ +/*-----------------------------------------------------------------------*/ + +static +BYTE wait_ready (void) +{ + BYTE res; + + + Timer2 = 50; /* Wait for ready in timeout of 500ms */ + rcvr_spi(); + do + res = rcvr_spi(); + while ((res != 0xFF) && Timer2); + + return res; +} + +/*-----------------------------------------------------------------------*/ +/* Send 80 or so clock transitions with CS and DI held high. This is */ +/* required after card power up to get it into SPI mode */ +/*-----------------------------------------------------------------------*/ +static +void send_initial_clock_train(void) +{ + unsigned int i; + uint32_t ui32Dat; + + /* Ensure CS is held high. */ + DESELECT(); + + /* Switch the SSI TX line to a GPIO and drive it high too. */ + ROM_GPIOPinTypeGPIOOutput(SDC_SSI_TX_GPIO_PORT_BASE, SDC_SSI_TX); + ROM_GPIOPinWrite(SDC_SSI_TX_GPIO_PORT_BASE, SDC_SSI_TX, SDC_SSI_TX); + + /* Send 10 bytes over the SSI. This causes the clock to wiggle the */ + /* required number of times. */ + for(i = 0 ; i < 10 ; i++) + { + /* Write DUMMY data. SSIDataPut() waits until there is room in the */ + /* FIFO. */ + ROM_SSIDataPut(SDC_SSI_BASE, 0xFF); + + /* Flush data read during data write. */ + ROM_SSIDataGet(SDC_SSI_BASE, &ui32Dat); + } + + /* Revert to hardware control of the SSI TX line. */ + ROM_GPIOPinTypeSSI(SDC_SSI_TX_GPIO_PORT_BASE, SDC_SSI_TX); +} + +/*-----------------------------------------------------------------------*/ +/* Power Control (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* When the target system does not support socket power control, there */ +/* is nothing to do in these functions and chk_power always returns 1. */ + +static +void power_on (void) +{ + /* + * This doesn't really turn the power on, but initializes the + * SSI port and pins needed to talk to the card. + */ + + /* Enable the peripherals used to drive the SDC on SSI */ + ROM_SysCtlPeripheralEnable(SDC_SSI_SYSCTL_PERIPH); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); + ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH); + + /* + * Configure the appropriate pins to be SSI instead of GPIO. The FSS (CS) + * signal is directly driven to ensure that we can hold it low through a + * complete transaction with the SD card. + */ + ROM_GPIOPinTypeSSI(SDC_SSI_TX_GPIO_PORT_BASE, SDC_SSI_TX); + ROM_GPIOPinTypeSSI(SDC_SSI_RX_GPIO_PORT_BASE, SDC_SSI_RX); + ROM_GPIOPinTypeSSI(SDC_SSI_CLK_GPIO_PORT_BASE, SDC_SSI_CLK); + ROM_GPIOPinTypeGPIOOutput(SDC_SSI_FSS_GPIO_PORT_BASE, SDC_SSI_FSS); + + /* + * Set the SSI output pins to 4MA drive strength and engage the + * pull-up on the receive line. + */ + MAP_GPIOPadConfigSet(SDC_SSI_RX_GPIO_PORT_BASE, SDC_SSI_RX, + GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD_WPU); + MAP_GPIOPadConfigSet(SDC_SSI_CLK_GPIO_PORT_BASE, SDC_SSI_CLK, + GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD); + MAP_GPIOPadConfigSet(SDC_SSI_TX_GPIO_PORT_BASE, SDC_SSI_TX, + GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD); + MAP_GPIOPadConfigSet(SDC_SSI_FSS_GPIO_PORT_BASE, SDC_SSI_FSS, + GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD); + + /* Configure the SSI3 port */ + ROM_SSIConfigSetExpClk(SDC_SSI_BASE, g_ui32SysClock, + SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 400000, 8); + ROM_SSIEnable(SDC_SSI_BASE); + + /* Set DI and CS high and apply more than 74 pulses to SCLK for the card */ + /* to be able to accept a native command. */ + send_initial_clock_train(); + + PowerFlag = 1; +} + +// set the SSI speed to the max setting +static +void set_max_speed(void) +{ + unsigned long i; + + /* Disable the SSI */ + ROM_SSIDisable(SDC_SSI_BASE); + + /* Set the maximum speed as half the system clock, with a max of 12.5 MHz. */ + i = g_ui32SysClock / 2; + if(i > 12500000) + { + i = 12500000; + } + + /* Configure the SSI0 port to run at 12.5MHz */ + ROM_SSIConfigSetExpClk(SDC_SSI_BASE, g_ui32SysClock, + SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, i, 8); + + /* Enable the SSI */ + ROM_SSIEnable(SDC_SSI_BASE); +} + +static +void power_off (void) +{ + PowerFlag = 0; +} + +static +int chk_power(void) /* Socket power state: 0=off, 1=on */ +{ + return PowerFlag; +} + + + +/*-----------------------------------------------------------------------*/ +/* Receive a data packet from MMC */ +/*-----------------------------------------------------------------------*/ + +static +BOOL rcvr_datablock ( + BYTE *buff, /* Data buffer to store received data */ + UINT btr /* Byte count (must be even number) */ +) +{ + BYTE token; + + + Timer1 = 100; + do { /* Wait for data packet in timeout of 100ms */ + token = rcvr_spi(); + } while ((token == 0xFF) && Timer1); + if(token != 0xFE) return FALSE; /* If not valid data token, retutn with error */ + + do { /* Receive the data block into buffer */ + rcvr_spi_m(buff++); + rcvr_spi_m(buff++); + } while (btr -= 2); + rcvr_spi(); /* Discard CRC */ + rcvr_spi(); + + return TRUE; /* Return with success */ +} + + + +/*-----------------------------------------------------------------------*/ +/* Send a data packet to MMC */ +/*-----------------------------------------------------------------------*/ + +#if _READONLY == 0 +static +BOOL xmit_datablock ( + const BYTE *buff, /* 512 byte data block to be transmitted */ + BYTE token /* Data/Stop token */ +) +{ + BYTE resp, wc; + + + if (wait_ready() != 0xFF) return FALSE; + + xmit_spi(token); /* Xmit data token */ + if (token != 0xFD) { /* Is data token */ + wc = 0; + do { /* Xmit the 512 byte data block to MMC */ + xmit_spi(*buff++); + xmit_spi(*buff++); + } while (--wc); + xmit_spi(0xFF); /* CRC (Dummy) */ + xmit_spi(0xFF); + resp = rcvr_spi(); /* Reveive data response */ + if ((resp & 0x1F) != 0x05) /* If not accepted, return with error */ + return FALSE; + } + + return TRUE; +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Send a command packet to MMC */ +/*-----------------------------------------------------------------------*/ + +static +BYTE send_cmd ( + BYTE cmd, /* Command byte */ + DWORD arg /* Argument */ +) +{ + BYTE n, res; + + + if (wait_ready() != 0xFF) return 0xFF; + + /* Send command packet */ + xmit_spi(cmd); /* Command */ + xmit_spi((BYTE)(arg >> 24)); /* Argument[31..24] */ + xmit_spi((BYTE)(arg >> 16)); /* Argument[23..16] */ + xmit_spi((BYTE)(arg >> 8)); /* Argument[15..8] */ + xmit_spi((BYTE)arg); /* Argument[7..0] */ + n = 0xff; + if (cmd == CMD0) n = 0x95; /* CRC for CMD0(0) */ + if (cmd == CMD8) n = 0x87; /* CRC for CMD8(0x1AA) */ + xmit_spi(n); + + /* Receive command response */ + if (cmd == CMD12) rcvr_spi(); /* Skip a stuff byte when stop reading */ + n = 10; /* Wait for a valid response in timeout of 10 attempts */ + do + res = rcvr_spi(); + while ((res & 0x80) && --n); + + return res; /* Return with the response value */ +} + +/*-----------------------------------------------------------------------* + * Send the special command used to terminate a multi-sector read. + * + * This is the only command which can be sent while the SDCard is sending + * data. The SDCard spec indicates that the data transfer will stop 2 bytes + * after the 6 byte CMD12 command is sent and that the card will then send + * 0xFF for between 2 and 6 more bytes before the R1 response byte. This + * response will be followed by another 0xFF byte. In testing, however, it + * seems that some cards don't send the 2 to 6 0xFF bytes between the end of + * data transmission and the response code. This function, therefore, merely + * reads 10 bytes and, if the last one read is 0xFF, returns the value of the + * latest non-0xFF byte as the response code. + * + *-----------------------------------------------------------------------*/ + +static +BYTE send_cmd12 (void) +{ + BYTE n, res, val; + + /* For CMD12, we don't wait for the card to be idle before we send + * the new command. + */ + + /* Send command packet - the argument for CMD12 is ignored. */ + xmit_spi(CMD12); + xmit_spi(0); + xmit_spi(0); + xmit_spi(0); + xmit_spi(0); + xmit_spi(0); + + /* Read up to 10 bytes from the card, remembering the value read if it's + not 0xFF */ + for(n = 0; n < 10; n++) + { + val = rcvr_spi(); + if(val != 0xFF) + { + res = val; + } + } + + return res; /* Return with the response value */ +} + +/*-------------------------------------------------------------------------- + + Public Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Initialize Disk Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE drv /* Physical drive nmuber (0) */ +) +{ + BYTE n, ty, ocr[4]; + + + if (drv) return STA_NOINIT; /* Supports only single drive */ + if (Stat & STA_NODISK) return Stat; /* No card in the socket */ + + power_on(); /* Force socket power on */ + send_initial_clock_train(); /* Ensure the card is in SPI mode */ + + SELECT(); /* CS = L */ + ty = 0; + if (send_cmd(CMD0, 0) == 1) { /* Enter Idle state */ + Timer1 = 100; /* Initialization timeout of 1000 msec */ + if (send_cmd(CMD8, 0x1AA) == 1) { /* SDC Ver2+ */ + for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); + if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* The card can work at vdd range of 2.7-3.6V */ + do { + if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 1UL << 30) == 0) break; /* ACMD41 with HCS bit */ + } while (Timer1); + if (Timer1 && send_cmd(CMD58, 0) == 0) { /* Check CCS bit */ + for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); + ty = (ocr[0] & 0x40) ? 6 : 2; + } + } + } else { /* SDC Ver1 or MMC */ + ty = (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) <= 1) ? 2 : 1; /* SDC : MMC */ + do { + if (ty == 2) { + if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) == 0) break; /* ACMD41 */ + } else { + if (send_cmd(CMD1, 0) == 0) break; /* CMD1 */ + } + } while (Timer1); + if (!Timer1 || send_cmd(CMD16, 512) != 0) /* Select R/W block length */ + ty = 0; + } + } + CardType = ty; + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + if (ty) { /* Initialization succeded */ + Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */ + set_max_speed(); + } else { /* Initialization failed */ + power_off(); + } + + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Get Disk Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE drv /* Physical drive nmuber (0) */ +) +{ + if (drv) return STA_NOINIT; /* Supports only single drive */ + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE drv, /* Physical drive nmuber (0) */ + BYTE *buff, /* Pointer to the data buffer to store read data */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count /* Sector count (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + + if (!(CardType & 4)) sector *= 512; /* Convert to byte address if needed */ + + SELECT(); /* CS = L */ + + if (count == 1) { /* Single block read */ + if ((send_cmd(CMD17, sector) == 0) /* READ_SINGLE_BLOCK */ + && rcvr_datablock(buff, 512)) + count = 0; + } + else { /* Multiple block read */ + if (send_cmd(CMD18, sector) == 0) { /* READ_MULTIPLE_BLOCK */ + do { + if (!rcvr_datablock(buff, 512)) break; + buff += 512; + } while (--count); + send_cmd12(); /* STOP_TRANSMISSION */ + } + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + return count ? RES_ERROR : RES_OK; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ +/*-----------------------------------------------------------------------*/ + +#if _READONLY == 0 +DRESULT disk_write ( + BYTE drv, /* Physical drive nmuber (0) */ + const BYTE *buff, /* Pointer to the data to be written */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count /* Sector count (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + if (Stat & STA_PROTECT) return RES_WRPRT; + + if (!(CardType & 4)) sector *= 512; /* Convert to byte address if needed */ + + SELECT(); /* CS = L */ + + if (count == 1) { /* Single block write */ + if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */ + && xmit_datablock(buff, 0xFE)) + count = 0; + } + else { /* Multiple block write */ + if (CardType & 2) { + send_cmd(CMD55, 0); send_cmd(CMD23, count); /* ACMD23 */ + } + if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */ + do { + if (!xmit_datablock(buff, 0xFC)) break; + buff += 512; + } while (--count); + if (!xmit_datablock(0, 0xFD)) /* STOP_TRAN token */ + count = 1; + } + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + return count ? RES_ERROR : RES_OK; +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_ioctl ( + BYTE drv, /* Physical drive nmuber (0) */ + BYTE ctrl, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + DRESULT res; + BYTE n, csd[16], *ptr = buff; + WORD csize; + + + if (drv) return RES_PARERR; + + res = RES_ERROR; + + if (ctrl == CTRL_POWER) { + switch (*ptr) { + case 0: /* Sub control code == 0 (POWER_OFF) */ + if (chk_power()) + power_off(); /* Power off */ + res = RES_OK; + break; + case 1: /* Sub control code == 1 (POWER_ON) */ + power_on(); /* Power on */ + res = RES_OK; + break; + case 2: /* Sub control code == 2 (POWER_GET) */ + *(ptr+1) = (BYTE)chk_power(); + res = RES_OK; + break; + default : + res = RES_PARERR; + } + } + else { + if (Stat & STA_NOINIT) return RES_NOTRDY; + + SELECT(); /* CS = L */ + + switch (ctrl) { + case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */ + if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { + if ((csd[0] >> 6) == 1) { /* SDC ver 2.00 */ + csize = csd[9] + ((WORD)csd[8] << 8) + 1; + *(DWORD*)buff = (DWORD)csize << 10; + } else { /* MMC or SDC ver 1.XX */ + n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2; + csize = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1; + *(DWORD*)buff = (DWORD)csize << (n - 9); + } + res = RES_OK; + } + break; + + case GET_SECTOR_SIZE : /* Get sectors on the disk (WORD) */ + *(WORD*)buff = 512; + res = RES_OK; + break; + + case CTRL_SYNC : /* Make sure that data has been written */ + if (wait_ready() == 0xFF) + res = RES_OK; + break; + + case MMC_GET_CSD : /* Receive CSD as a data block (16 bytes) */ + if (send_cmd(CMD9, 0) == 0 /* READ_CSD */ + && rcvr_datablock(ptr, 16)) + res = RES_OK; + break; + + case MMC_GET_CID : /* Receive CID as a data block (16 bytes) */ + if (send_cmd(CMD10, 0) == 0 /* READ_CID */ + && rcvr_datablock(ptr, 16)) + res = RES_OK; + break; + + case MMC_GET_OCR : /* Receive OCR as an R3 resp (4 bytes) */ + if (send_cmd(CMD58, 0) == 0) { /* READ_OCR */ + for (n = 0; n < 4; n++) + *ptr++ = rcvr_spi(); + res = RES_OK; + } + +// case MMC_GET_TYPE : /* Get card type flags (1 byte) */ +// *ptr = CardType; +// res = RES_OK; +// break; + + default: + res = RES_PARERR; + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + } + + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Device Timer Interrupt Procedure (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* This function must be called in period of 10ms */ + +void disk_timerproc (void) +{ +// BYTE n, s; + BYTE n; + + + n = Timer1; /* 100Hz decrement timer */ + if (n) Timer1 = --n; + n = Timer2; + if (n) Timer2 = --n; + +} + +/*---------------------------------------------------------*/ +/* User Provided Timer Function for FatFs module */ +/*---------------------------------------------------------*/ +/* This is a real time clock service to be called from */ +/* FatFs module. Any valid time must be returned even if */ +/* the system does not support a real time clock. */ + +DWORD get_fattime (void) +{ + + return ((2007UL-1980) << 25) // Year = 2007 + | (6UL << 21) // Month = June + | (5UL << 16) // Day = 5 + | (11U << 11) // Hour = 11 + | (38U << 5) // Min = 38 + | (0U >> 1) // Sec = 0 + ; + +} diff --git a/third_party/fatfs/port/sample-mmc.c b/third_party/fatfs/port/sample-mmc.c new file mode 100644 index 0000000..db98971 --- /dev/null +++ b/third_party/fatfs/port/sample-mmc.c @@ -0,0 +1,559 @@ +/*-----------------------------------------------------------------------*/ +/* MMC/SDC (in SPI mode) control module (C)ChaN, 2007 */ +/*-----------------------------------------------------------------------*/ +/* Only rcvr_spi(), xmit_spi(), disk_timerproc() and some macros */ +/* are platform dependent. */ +/*-----------------------------------------------------------------------*/ + + +#include +#include "diskio.h" + + +/* Definitions for MMC/SDC command */ +#define CMD0 (0x40+0) /* GO_IDLE_STATE */ +#define CMD1 (0x40+1) /* SEND_OP_COND */ +#define CMD8 (0x40+8) /* SEND_IF_COND */ +#define CMD9 (0x40+9) /* SEND_CSD */ +#define CMD10 (0x40+10) /* SEND_CID */ +#define CMD12 (0x40+12) /* STOP_TRANSMISSION */ +#define CMD16 (0x40+16) /* SET_BLOCKLEN */ +#define CMD17 (0x40+17) /* READ_SINGLE_BLOCK */ +#define CMD18 (0x40+18) /* READ_MULTIPLE_BLOCK */ +#define CMD23 (0x40+23) /* SET_BLOCK_COUNT */ +#define CMD24 (0x40+24) /* WRITE_BLOCK */ +#define CMD25 (0x40+25) /* WRITE_MULTIPLE_BLOCK */ +#define CMD41 (0x40+41) /* SEND_OP_COND (ACMD) */ +#define CMD55 (0x40+55) /* APP_CMD */ +#define CMD58 (0x40+58) /* READ_OCR */ + + +/* Port Controls (Platform dependent) */ +#define SELECT() PORTB &= ~1 /* MMC CS = L */ +#define DESELECT() PORTB |= 1 /* MMC CS = H */ + +#define SOCKPORT PINB /* Socket contact port */ +#define SOCKWP 0x20 /* Write protect switch (PB5) */ +#define SOCKINS 0x10 /* Card detect switch (PB4) */ + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + +static volatile +DSTATUS Stat = STA_NOINIT; /* Disk status */ + +static volatile +BYTE Timer1, Timer2; /* 100Hz decrement timer */ + +static +BYTE CardType; /* b0:MMC, b1:SDC, b2:Block addressing */ + + + +/*-----------------------------------------------------------------------*/ +/* Transmit a byte to MMC via SPI (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +#define xmit_spi(dat) SPDR=(dat); loop_until_bit_is_set(SPSR,SPIF) + + + +/*-----------------------------------------------------------------------*/ +/* Receive a byte from MMC via SPI (Platform dependent) */ +/*-----------------------------------------------------------------------*/ + +static +BYTE rcvr_spi (void) +{ + SPDR = 0xFF; + loop_until_bit_is_set(SPSR, SPIF); + return SPDR; +} + +/* Alternative macro to receive data fast */ +#define rcvr_spi_m(dst) SPDR=0xFF; loop_until_bit_is_set(SPSR,SPIF); *(dst)=SPDR + + + +/*-----------------------------------------------------------------------*/ +/* Wait for card ready */ +/*-----------------------------------------------------------------------*/ + +static +BYTE wait_ready (void) +{ + BYTE res; + + + Timer2 = 50; /* Wait for ready in timeout of 500ms */ + rcvr_spi(); + do + res = rcvr_spi(); + while ((res != 0xFF) && Timer2); + + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Power Control (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* When the target system does not support socket power control, there */ +/* is nothing to do in these functions and chk_power always returns 1. */ + +static +void power_on (void) +{ + PORTE &= ~0x80; /* Socket power ON */ + for (Timer1 = 3; Timer1; ); /* Wait for 30ms */ + PORTB = 0b10110101; /* Enable drivers */ + DDRB = 0b11000111; + SPCR = 0b01010000; /* Initialize SPI port (Mode 0) */ + SPSR = 0b00000001; +} + +static +void power_off (void) +{ + SELECT(); /* Wait for card ready */ + wait_ready(); + DESELECT(); + rcvr_spi(); + + SPCR = 0; /* Disable SPI function */ + DDRB = 0b11000000; /* Disable drivers */ + PORTB = 0b10110000; + PORTE |= 0x80; /* Socket power OFF */ + Stat |= STA_NOINIT; /* Set STA_NOINIT */ +} + +static +int chk_power(void) /* Socket power state: 0=off, 1=on */ +{ + return (PORTE & 0x80) ? 0 : 1; +} + + + +/*-----------------------------------------------------------------------*/ +/* Receive a data packet from MMC */ +/*-----------------------------------------------------------------------*/ + +static +BOOL rcvr_datablock ( + BYTE *buff, /* Data buffer to store received data */ + UINT btr /* Byte count (must be even number) */ +) +{ + BYTE token; + + + Timer1 = 10; + do { /* Wait for data packet in timeout of 100ms */ + token = rcvr_spi(); + } while ((token == 0xFF) && Timer1); + if(token != 0xFE) return FALSE; /* If not valid data token, retutn with error */ + + do { /* Receive the data block into buffer */ + rcvr_spi_m(buff++); + rcvr_spi_m(buff++); + } while (btr -= 2); + rcvr_spi(); /* Discard CRC */ + rcvr_spi(); + + return TRUE; /* Return with success */ +} + + + +/*-----------------------------------------------------------------------*/ +/* Send a data packet to MMC */ +/*-----------------------------------------------------------------------*/ + +#if _READONLY == 0 +static +BOOL xmit_datablock ( + const BYTE *buff, /* 512 byte data block to be transmitted */ + BYTE token /* Data/Stop token */ +) +{ + BYTE resp, wc; + + + if (wait_ready() != 0xFF) return FALSE; + + xmit_spi(token); /* Xmit data token */ + if (token != 0xFD) { /* Is data token */ + wc = 0; + do { /* Xmit the 512 byte data block to MMC */ + xmit_spi(*buff++); + xmit_spi(*buff++); + } while (--wc); + xmit_spi(0xFF); /* CRC (Dummy) */ + xmit_spi(0xFF); + resp = rcvr_spi(); /* Reveive data response */ + if ((resp & 0x1F) != 0x05) /* If not accepted, return with error */ + return FALSE; + } + + return TRUE; +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Send a command packet to MMC */ +/*-----------------------------------------------------------------------*/ + +static +BYTE send_cmd ( + BYTE cmd, /* Command byte */ + DWORD arg /* Argument */ +) +{ + BYTE n, res; + + + if (wait_ready() != 0xFF) return 0xFF; + + /* Send command packet */ + xmit_spi(cmd); /* Command */ + xmit_spi((BYTE)(arg >> 24)); /* Argument[31..24] */ + xmit_spi((BYTE)(arg >> 16)); /* Argument[23..16] */ + xmit_spi((BYTE)(arg >> 8)); /* Argument[15..8] */ + xmit_spi((BYTE)arg); /* Argument[7..0] */ + n = 0; + if (cmd == CMD0) n = 0x95; /* CRC for CMD0(0) */ + if (cmd == CMD8) n = 0x87; /* CRC for CMD8(0x1AA) */ + xmit_spi(n); + + /* Receive command response */ + if (cmd == CMD12) rcvr_spi(); /* Skip a stuff byte when stop reading */ + n = 10; /* Wait for a valid response in timeout of 10 attempts */ + do + res = rcvr_spi(); + while ((res & 0x80) && --n); + + return res; /* Return with the response value */ +} + + + +/*-------------------------------------------------------------------------- + + Public Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* Initialize Disk Drive */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_initialize ( + BYTE drv /* Physical drive nmuber (0) */ +) +{ + BYTE n, ty, ocr[4]; + + + if (drv) return STA_NOINIT; /* Supports only single drive */ + if (Stat & STA_NODISK) return Stat; /* No card in the socket */ + + power_on(); /* Force socket power on */ + for (n = 10; n; n--) rcvr_spi(); /* 80 dummy clocks */ + + SELECT(); /* CS = L */ + ty = 0; + if (send_cmd(CMD0, 0) == 1) { /* Enter Idle state */ + Timer1 = 100; /* Initialization timeout of 1000 msec */ + if (send_cmd(CMD8, 0x1AA) == 1) { /* SDC Ver2+ */ + for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); + if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* The card can work at vdd range of 2.7-3.6V */ + do { + if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 1UL << 30) == 0) break; /* ACMD41 with HCS bit */ + } while (Timer1); + if (Timer1 && send_cmd(CMD58, 0) == 0) { /* Check CCS bit */ + for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); + ty = (ocr[0] & 0x40) ? 6 : 2; + } + } + } else { /* SDC Ver1 or MMC */ + ty = (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) <= 1) ? 2 : 1; /* SDC : MMC */ + do { + if (ty == 2) { + if (send_cmd(CMD55, 0) <= 1 && send_cmd(CMD41, 0) == 0) break; /* ACMD41 */ + } else { + if (send_cmd(CMD1, 0) == 0) break; /* CMD1 */ + } + } while (Timer1); + if (!Timer1 || send_cmd(CMD16, 512) != 0) /* Select R/W block length */ + ty = 0; + } + } + CardType = ty; + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + if (ty) { /* Initialization succeded */ + Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */ + } else { /* Initialization failed */ + power_off(); + } + + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Get Disk Status */ +/*-----------------------------------------------------------------------*/ + +DSTATUS disk_status ( + BYTE drv /* Physical drive nmuber (0) */ +) +{ + if (drv) return STA_NOINIT; /* Supports only single drive */ + return Stat; +} + + + +/*-----------------------------------------------------------------------*/ +/* Read Sector(s) */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_read ( + BYTE drv, /* Physical drive nmuber (0) */ + BYTE *buff, /* Pointer to the data buffer to store read data */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count /* Sector count (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + + if (!(CardType & 4)) sector *= 512; /* Convert to byte address if needed */ + + SELECT(); /* CS = L */ + + if (count == 1) { /* Single block read */ + if ((send_cmd(CMD17, sector) == 0) /* READ_SINGLE_BLOCK */ + && rcvr_datablock(buff, 512)) + count = 0; + } + else { /* Multiple block read */ + if (send_cmd(CMD18, sector) == 0) { /* READ_MULTIPLE_BLOCK */ + do { + if (!rcvr_datablock(buff, 512)) break; + buff += 512; + } while (--count); + send_cmd(CMD12, 0); /* STOP_TRANSMISSION */ + } + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + return count ? RES_ERROR : RES_OK; +} + + + +/*-----------------------------------------------------------------------*/ +/* Write Sector(s) */ +/*-----------------------------------------------------------------------*/ + +#if _READONLY == 0 +DRESULT disk_write ( + BYTE drv, /* Physical drive nmuber (0) */ + const BYTE *buff, /* Pointer to the data to be written */ + DWORD sector, /* Start sector number (LBA) */ + BYTE count /* Sector count (1..255) */ +) +{ + if (drv || !count) return RES_PARERR; + if (Stat & STA_NOINIT) return RES_NOTRDY; + if (Stat & STA_PROTECT) return RES_WRPRT; + + if (!(CardType & 4)) sector *= 512; /* Convert to byte address if needed */ + + SELECT(); /* CS = L */ + + if (count == 1) { /* Single block write */ + if ((send_cmd(CMD24, sector) == 0) /* WRITE_BLOCK */ + && xmit_datablock(buff, 0xFE)) + count = 0; + } + else { /* Multiple block write */ + if (CardType & 2) { + send_cmd(CMD55, 0); send_cmd(CMD23, count); /* ACMD23 */ + } + if (send_cmd(CMD25, sector) == 0) { /* WRITE_MULTIPLE_BLOCK */ + do { + if (!xmit_datablock(buff, 0xFC)) break; + buff += 512; + } while (--count); + if (!xmit_datablock(0, 0xFD)) /* STOP_TRAN token */ + count = 1; + } + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + + return count ? RES_ERROR : RES_OK; +} +#endif /* _READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +DRESULT disk_ioctl ( + BYTE drv, /* Physical drive nmuber (0) */ + BYTE ctrl, /* Control code */ + void *buff /* Buffer to send/receive control data */ +) +{ + DRESULT res; + BYTE n, csd[16], *ptr = buff; + WORD csize; + + + if (drv) return RES_PARERR; + + res = RES_ERROR; + + if (ctrl == CTRL_POWER) { + switch (*ptr) { + case 0: /* Sub control code == 0 (POWER_OFF) */ + if (chk_power()) + power_off(); /* Power off */ + res = RES_OK; + break; + case 1: /* Sub control code == 1 (POWER_ON) */ + power_on(); /* Power on */ + res = RES_OK; + break; + case 2: /* Sub control code == 2 (POWER_GET) */ + *(ptr+1) = (BYTE)chk_power(); + res = RES_OK; + break; + default : + res = RES_PARERR; + } + } + else { + if (Stat & STA_NOINIT) return RES_NOTRDY; + + SELECT(); /* CS = L */ + + switch (ctrl) { + case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */ + if ((send_cmd(CMD9, 0) == 0) && rcvr_datablock(csd, 16)) { + if ((csd[0] >> 6) == 1) { /* SDC ver 2.00 */ + csize = csd[9] + ((WORD)csd[8] << 8) + 1; + *(DWORD*)buff = (DWORD)csize << 10; + } else { /* MMC or SDC ver 1.XX */ + n = (csd[5] & 15) + ((csd[10] & 128) >> 7) + ((csd[9] & 3) << 1) + 2; + csize = (csd[8] >> 6) + ((WORD)csd[7] << 2) + ((WORD)(csd[6] & 3) << 10) + 1; + *(DWORD*)buff = (DWORD)csize << (n - 9); + } + res = RES_OK; + } + break; + + case GET_SECTOR_SIZE : /* Get sectors on the disk (WORD) */ + *(WORD*)buff = 512; + res = RES_OK; + break; + + case CTRL_SYNC : /* Make sure that data has been written */ + if (wait_ready() == 0xFF) + res = RES_OK; + break; + + case MMC_GET_CSD : /* Receive CSD as a data block (16 bytes) */ + if (send_cmd(CMD9, 0) == 0 /* READ_CSD */ + && rcvr_datablock(ptr, 16)) + res = RES_OK; + break; + + case MMC_GET_CID : /* Receive CID as a data block (16 bytes) */ + if (send_cmd(CMD10, 0) == 0 /* READ_CID */ + && rcvr_datablock(ptr, 16)) + res = RES_OK; + break; + + case MMC_GET_OCR : /* Receive OCR as an R3 resp (4 bytes) */ + if (send_cmd(CMD58, 0) == 0) { /* READ_OCR */ + for (n = 0; n < 4; n++) + *ptr++ = rcvr_spi(); + res = RES_OK; + } + + case MMC_GET_TYPE : /* Get card type flags (1 byte) */ + *ptr = CardType; + res = RES_OK; + break; + + default: + res = RES_PARERR; + } + + DESELECT(); /* CS = H */ + rcvr_spi(); /* Idle (Release DO) */ + } + + return res; +} + + + +/*-----------------------------------------------------------------------*/ +/* Device Timer Interrupt Procedure (Platform dependent) */ +/*-----------------------------------------------------------------------*/ +/* This function must be called in period of 10ms */ + +void disk_timerproc (void) +{ + static BYTE pv; + BYTE n, s; + + + n = Timer1; /* 100Hz decrement timer */ + if (n) Timer1 = --n; + n = Timer2; + if (n) Timer2 = --n; + + n = pv; + pv = SOCKPORT & (SOCKWP | SOCKINS); /* Sample socket switch */ + + if (n == pv) { /* Have contacts stabled? */ + s = Stat; + + if (pv & SOCKWP) /* WP is H (write protected) */ + s |= STA_PROTECT; + else /* WP is L (write enabled) */ + s &= ~STA_PROTECT; + + if (pv & SOCKINS) /* INS = H (Socket empty) */ + s |= (STA_NODISK | STA_NOINIT); + else /* INS = L (Card inserted) */ + s &= ~STA_NODISK; + + Stat = s; + } +} + diff --git a/third_party/fatfs/src/00readme.txt b/third_party/fatfs/src/00readme.txt new file mode 100644 index 0000000..2acbbb8 --- /dev/null +++ b/third_party/fatfs/src/00readme.txt @@ -0,0 +1,138 @@ +FatFs Module Source Files R0.09b (C)ChaN, 2013 + + +FILES + + ffconf.h Configuration file for FatFs module. + ff.h Common include file for FatFs and application module. + ff.c FatFs module. + diskio.h Common include file for FatFs and disk I/O module. + diskio.c An example of glue function to attach existing disk I/O module to FatFs. + integer.h Integer type definitions for FatFs. + option Optional external functions. + + Low level disk I/O module is not included in this archive because the FatFs + module is only a generic file system layer and not depend on any specific + storage device. You have to provide a low level disk I/O module that written + to control your storage device. + + + +AGREEMENTS + + FatFs module is an open source software to implement FAT file system to + small embedded systems. This is a free software and is opened for education, + research and commercial developments under license policy of following trems. + + Copyright (C) 2012, ChaN, all right reserved. + + * The FatFs module is a free software and there is NO WARRANTY. + * No restriction on use. You can use, modify and redistribute it for + personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. + * Redistributions of source code must retain the above copyright notice. + + + +REVISION HISTORY + + Feb 26, 2006 R0.00 Prototype + + Apr 29, 2006 R0.01 First release. + + Jun 01, 2006 R0.02 Added FAT12. + Removed unbuffered mode. + Fixed a problem on small (<32M) patition. + + Jun 10, 2006 R0.02a Added a configuration option _FS_MINIMUM. + + Sep 22, 2006 R0.03 Added f_rename. + Changed option _FS_MINIMUM to _FS_MINIMIZE. + + Dec 11, 2006 R0.03a Improved cluster scan algolithm to write files fast. + Fixed f_mkdir creates incorrect directory on FAT32. + + Feb 04, 2007 R0.04 Supported multiple drive system. (FatFs) + Changed some APIs for multiple drive system. + Added f_mkfs. (FatFs) + Added _USE_FAT32 option. (Tiny-FatFs) + + Apr 01, 2007 R0.04a Supported multiple partitions on a plysical drive. (FatFs) + Fixed an endian sensitive code in f_mkfs. (FatFs) + Added a capability of extending the file size to f_lseek. + Added minimization level 3. + Fixed a problem that can collapse a sector when recreate an + existing file in any sub-directory at non FAT32 cfg. (Tiny-FatFs) + + May 05, 2007 R0.04b Added _USE_NTFLAG option. + Added FSInfo support. + Fixed some problems corresponds to FAT32. (Tiny-FatFs) + Fixed DBCS name can result FR_INVALID_NAME. + Fixed short seek (0 < ofs <= csize) collapses the file object. + + Aug 25, 2007 R0.05 Changed arguments of f_read, f_write. + Changed arguments of f_mkfs. (FatFs) + Fixed f_mkfs on FAT32 creates incorrect FSInfo. (FatFs) + Fixed f_mkdir on FAT32 creates incorrect directory. (FatFs) + + Feb 03, 2008 R0.05a Added f_truncate(). + Added f_utime(). + Fixed off by one error at FAT sub-type determination. + Fixed btr in f_read() can be mistruncated. + Fixed cached sector is not flushed when create and close without write. + + Apr 01, 2008 R0.06 Added f_forward(). (Tiny-FatFs) + Added string functions: fputc(), fputs(), fprintf() and fgets(). + Improved performance of f_lseek() on move to the same or following cluster. + + Apr 01, 2009, R0.07 Merged Tiny-FatFs as a buffer configuration option. + Added long file name support. + Added multiple code page support. + Added re-entrancy for multitask operation. + Added auto cluster size selection to f_mkfs(). + Added rewind option to f_readdir(). + Changed result code of critical errors. + Renamed string functions to avoid name collision. + + Apr 14, 2009, R0.07a Separated out OS dependent code on reentrant cfg. + Added multiple sector size support. + + Jun 21, 2009, R0.07c Fixed f_unlink() may return FR_OK on error. + Fixed wrong cache control in f_lseek(). + Added relative path feature. + Added f_chdir(). + Added f_chdrive(). + Added proper case conversion for extended characters. + + Nov 03, 2009 R0.07e Separated out configuration options from ff.h to ffconf.h. + Added a configuration option, _LFN_UNICODE. + Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. + Fixed name matching error on the 13 char boundary. + Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. + + May 15, 2010, R0.08 Added a memory configuration option. (_USE_LFN) + Added file lock feature. (_FS_SHARE) + Added fast seek feature. (_USE_FASTSEEK) + Changed some types on the API, XCHAR->TCHAR. + Changed fname member in the FILINFO structure on Unicode cfg. + String functions support UTF-8 encoding files on Unicode cfg. + + Aug 16,'10 R0.08a Added f_getcwd(). (_FS_RPATH = 2) + Added sector erase feature. (_USE_ERASE) + Moved file lock semaphore table from fs object to the bss. + Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. + Fixed f_mkfs() creates wrong FAT32 volume. + + Jan 15,'11 R0.08b Fast seek feature is also applied to f_read() and f_write(). + f_lseek() reports required table size on creating CLMP. + Extended format syntax of f_printf function. + Ignores duplicated directory separators in given path names. + + Sep 06,'11 R0.09 f_mkfs() supports multiple partition to finish the multiple partition feature. + Added f_fdisk(). (_MULTI_PARTITION = 2) + + Aug 27,'12 R0.09a Fixed assertion failure due to OS/2 EA on FAT12/16. + Changed f_open() and f_opendir() reject null object pointer to avoid crash. + Changed option name _FS_SHARE to _FS_LOCK. + + Jan 23,'13 R0.09b Added f_getlabel() and f_setlabel(). (_USE_LABEL == 1) + diff --git a/third_party/fatfs/src/diskio.h b/third_party/fatfs/src/diskio.h new file mode 100644 index 0000000..e44eea6 --- /dev/null +++ b/third_party/fatfs/src/diskio.h @@ -0,0 +1,88 @@ +/*----------------------------------------------------------------------- +/ Low level disk interface modlue include file (C)ChaN, 2013 +/-----------------------------------------------------------------------*/ + +#ifndef _DISKIO_DEFINED +#define _DISKIO_DEFINED + +#ifdef __cplusplus +extern "C" { +#endif + +#define _USE_WRITE 1 /* 1: Enable disk_write function */ +#define _USE_IOCTL 1 /* 1: Enable disk_ioctl fucntion */ + +#include "integer.h" + + +/* Status of Disk Functions */ +typedef BYTE DSTATUS; + +/* Results of Disk Functions */ +typedef enum { + RES_OK = 0, /* 0: Successful */ + RES_ERROR, /* 1: R/W Error */ + RES_WRPRT, /* 2: Write Protected */ + RES_NOTRDY, /* 3: Not Ready */ + RES_PARERR /* 4: Invalid Parameter */ +} DRESULT; + + +/*---------------------------------------*/ +/* Prototypes for disk control functions */ + + +DSTATUS disk_initialize (BYTE pdrv); +DSTATUS disk_status (BYTE pdrv); +DRESULT disk_read (BYTE pdrv, BYTE*buff, DWORD sector, BYTE count); +DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, BYTE count); +DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff); +void disk_timerproc (void); + +/* Disk Status Bits (DSTATUS) */ +#define STA_NOINIT 0x01 /* Drive not initialized */ +#define STA_NODISK 0x02 /* No medium in the drive */ +#define STA_PROTECT 0x04 /* Write protected */ + + +/* Command code for disk_ioctrl fucntion */ + +/* Generic command (used by FatFs) */ +#define CTRL_SYNC 0 /* Flush disk cache (for write functions) */ +#define GET_SECTOR_COUNT 1 /* Get media size (for only f_mkfs()) */ +#define GET_SECTOR_SIZE 2 /* Get sector size (for multiple sector size (_MAX_SS >= 1024)) */ +#define GET_BLOCK_SIZE 3 /* Get erase block size (for only f_mkfs()) */ +#define CTRL_ERASE_SECTOR 4 /* Force erased a block of sectors (for only _USE_ERASE) */ + +/* Generic command (not used by FatFs) */ +#define CTRL_POWER 5 /* Get/Set power status */ +#define CTRL_LOCK 6 /* Lock/Unlock media removal */ +#define CTRL_EJECT 7 /* Eject media */ +#define CTRL_FORMAT 8 /* Create physical format on the media */ + +/* MMC/SDC specific ioctl command */ +#define MMC_GET_TYPE 10 /* Get card type */ +#define MMC_GET_CSD 11 /* Get CSD */ +#define MMC_GET_CID 12 /* Get CID */ +#define MMC_GET_OCR 13 /* Get OCR */ +#define MMC_GET_SDSTAT 14 /* Get SD status */ + +/* ATA/CF specific ioctl command */ +#define ATA_GET_REV 20 /* Get F/W revision */ +#define ATA_GET_MODEL 21 /* Get model name */ +#define ATA_GET_SN 22 /* Get serial number */ + + +/* MMC card type flags (MMC_GET_TYPE) */ +#define CT_MMC 0x01 /* MMC ver 3 */ +#define CT_SD1 0x02 /* SD ver 1 */ +#define CT_SD2 0x04 /* SD ver 2 */ +#define CT_SDC (CT_SD1|CT_SD2) /* SD */ +#define CT_BLOCK 0x08 /* Block addressing */ + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/third_party/fatfs/src/ff.c b/third_party/fatfs/src/ff.c new file mode 100644 index 0000000..aa640f8 --- /dev/null +++ b/third_party/fatfs/src/ff.c @@ -0,0 +1,4325 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - FAT file system module R0.09b (C)ChaN, 2013 +/-----------------------------------------------------------------------------/ +/ FatFs module is a generic FAT file system module for small embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following terms. +/ +/ Copyright (C) 2013, ChaN, all right reserved. +/ +/ * The FatFs module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/-----------------------------------------------------------------------------/ +/ Feb 26,'06 R0.00 Prototype. +/ +/ Apr 29,'06 R0.01 First stable version. +/ +/ Jun 01,'06 R0.02 Added FAT12 support. +/ Removed unbuffered mode. +/ Fixed a problem on small (<32M) partition. +/ Jun 10,'06 R0.02a Added a configuration option (_FS_MINIMUM). +/ +/ Sep 22,'06 R0.03 Added f_rename(). +/ Changed option _FS_MINIMUM to _FS_MINIMIZE. +/ Dec 11,'06 R0.03a Improved cluster scan algorithm to write files fast. +/ Fixed f_mkdir() creates incorrect directory on FAT32. +/ +/ Feb 04,'07 R0.04 Supported multiple drive system. +/ Changed some interfaces for multiple drive system. +/ Changed f_mountdrv() to f_mount(). +/ Added f_mkfs(). +/ Apr 01,'07 R0.04a Supported multiple partitions on a physical drive. +/ Added a capability of extending file size to f_lseek(). +/ Added minimization level 3. +/ Fixed an endian sensitive code in f_mkfs(). +/ May 05,'07 R0.04b Added a configuration option _USE_NTFLAG. +/ Added FSInfo support. +/ Fixed DBCS name can result FR_INVALID_NAME. +/ Fixed short seek (<= csize) collapses the file object. +/ +/ Aug 25,'07 R0.05 Changed arguments of f_read(), f_write() and f_mkfs(). +/ Fixed f_mkfs() on FAT32 creates incorrect FSInfo. +/ Fixed f_mkdir() on FAT32 creates incorrect directory. +/ Feb 03,'08 R0.05a Added f_truncate() and f_utime(). +/ Fixed off by one error at FAT sub-type determination. +/ Fixed btr in f_read() can be mistruncated. +/ Fixed cached sector is not flushed when create and close without write. +/ +/ Apr 01,'08 R0.06 Added fputc(), fputs(), fprintf() and fgets(). +/ Improved performance of f_lseek() on moving to the same or following cluster. +/ +/ Apr 01,'09 R0.07 Merged Tiny-FatFs as a configuration option. (_FS_TINY) +/ Added long file name feature. +/ Added multiple code page feature. +/ Added re-entrancy for multitask operation. +/ Added auto cluster size selection to f_mkfs(). +/ Added rewind option to f_readdir(). +/ Changed result code of critical errors. +/ Renamed string functions to avoid name collision. +/ Apr 14,'09 R0.07a Separated out OS dependent code on reentrant cfg. +/ Added multiple sector size feature. +/ Jun 21,'09 R0.07c Fixed f_unlink() can return FR_OK on error. +/ Fixed wrong cache control in f_lseek(). +/ Added relative path feature. +/ Added f_chdir() and f_chdrive(). +/ Added proper case conversion to extended char. +/ Nov 03,'09 R0.07e Separated out configuration options from ff.h to ffconf.h. +/ Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. +/ Fixed name matching error on the 13 char boundary. +/ Added a configuration option, _LFN_UNICODE. +/ Changed f_readdir() to return the SFN with always upper case on non-LFN cfg. +/ +/ May 15,'10 R0.08 Added a memory configuration option. (_USE_LFN = 3) +/ Added file lock feature. (_FS_SHARE) +/ Added fast seek feature. (_USE_FASTSEEK) +/ Changed some types on the API, XCHAR->TCHAR. +/ Changed fname member in the FILINFO structure on Unicode cfg. +/ String functions support UTF-8 encoding files on Unicode cfg. +/ Aug 16,'10 R0.08a Added f_getcwd(). (_FS_RPATH = 2) +/ Added sector erase feature. (_USE_ERASE) +/ Moved file lock semaphore table from fs object to the bss. +/ Fixed a wrong directory entry is created on non-LFN cfg when the given name contains ';'. +/ Fixed f_mkfs() creates wrong FAT32 volume. +/ Jan 15,'11 R0.08b Fast seek feature is also applied to f_read() and f_write(). +/ f_lseek() reports required table size on creating CLMP. +/ Extended format syntax of f_printf function. +/ Ignores duplicated directory separators in given path name. +/ +/ Sep 06,'11 R0.09 f_mkfs() supports multiple partition to finish the multiple partition feature. +/ Added f_fdisk(). (_MULTI_PARTITION = 2) +/ Aug 27,'12 R0.09a Fixed assertion failure due to OS/2 EA on FAT12/16 volume. +/ Changed f_open() and f_opendir reject null object pointer to avoid crash. +/ Changed option name _FS_SHARE to _FS_LOCK. +/ Jan 24,'13 R0.09b Added f_setlabel() and f_getlabel(). (_USE_LABEL = 1) +/---------------------------------------------------------------------------*/ + +#include "ff.h" /* FatFs configurations and declarations */ +#include "diskio.h" /* Declarations of low level disk I/O functions */ + + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if _FATFS != 82786 /* Revision ID */ +#error Wrong include file (ff.h). +#endif + + +/* Definitions on sector size */ +#if _MAX_SS != 512 && _MAX_SS != 1024 && _MAX_SS != 2048 && _MAX_SS != 4096 +#error Wrong sector size. +#endif +#if _MAX_SS != 512 +#define SS(fs) ((fs)->ssize) /* Variable sector size */ +#else +#define SS(fs) 512U /* Fixed sector size */ +#endif + + +/* Reentrancy related */ +#if _FS_REENTRANT +#if _USE_LFN == 1 +#error Static LFN work area must not be used in re-entrant configuration. +#endif +#define ENTER_FF(fs) { if (!lock_fs(fs)) return FR_TIMEOUT; } +#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } +#else +#define ENTER_FF(fs) +#define LEAVE_FF(fs, res) return res +#endif + +#define ABORT(fs, res) { fp->flag |= FA__ERROR; LEAVE_FF(fs, res); } + + +/* File access control feature */ +#if _FS_LOCK +#if _FS_READONLY +#error _FS_LOCK must be 0 on read-only cfg. +#endif +typedef struct { + FATFS *fs; /* File ID 1, volume (NULL:blank entry) */ + DWORD clu; /* File ID 2, directory */ + WORD idx; /* File ID 3, directory index */ + WORD ctr; /* File open counter, 0:none, 0x01..0xFF:read open count, 0x100:write mode */ +} FILESEM; +#endif + + + +/* DBCS code ranges and SBCS extend char conversion table */ + +#if _CODE_PAGE == 932 /* Japanese Shift-JIS */ +#define _DF1S 0x81 /* DBC 1st byte range 1 start */ +#define _DF1E 0x9F /* DBC 1st byte range 1 end */ +#define _DF2S 0xE0 /* DBC 1st byte range 2 start */ +#define _DF2E 0xFC /* DBC 1st byte range 2 end */ +#define _DS1S 0x40 /* DBC 2nd byte range 1 start */ +#define _DS1E 0x7E /* DBC 2nd byte range 1 end */ +#define _DS2S 0x80 /* DBC 2nd byte range 2 start */ +#define _DS2E 0xFC /* DBC 2nd byte range 2 end */ + +#elif _CODE_PAGE == 936 /* Simplified Chinese GBK */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0x80 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 949 /* Korean */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x41 +#define _DS1E 0x5A +#define _DS2S 0x61 +#define _DS2E 0x7A +#define _DS3S 0x81 +#define _DS3E 0xFE + +#elif _CODE_PAGE == 950 /* Traditional Chinese Big5 */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0xA1 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 437 /* U.S. (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F,0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 720 /* Arabic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x45,0x41,0x84,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x49,0x49,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 737 /* Greek (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xE7,0xE8,0xF1,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 775 /* Baltic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 850 /* Multilingual Latin 1 (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 852 /* Latin 2 (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F,0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} + +#elif _CODE_PAGE == 855 /* Cyrillic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F,0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 857 /* Turkish (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x98,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0x59,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 858 /* Multilingual Latin 1 + Euro (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 862 /* Hebrew (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 866 /* Russian (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 874 /* Thai (OEM, Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1250 /* Central Europe (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xA3,0xB4,0xB5,0xB6,0xB7,0xB8,0xA5,0xAA,0xBB,0xBC,0xBD,0xBC,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} + +#elif _CODE_PAGE == 1251 /* Cyrillic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x82,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x80,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ + 0xA0,0xA2,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB2,0xA5,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xA3,0xBD,0xBD,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF} + +#elif _CODE_PAGE == 1252 /* Latin 1 (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xAd,0x9B,0x8C,0x9D,0xAE,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} + +#elif _CODE_PAGE == 1253 /* Greek (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xA2,0xB8,0xB9,0xBA, \ + 0xE0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xFB,0xBC,0xFD,0xBF,0xFF} + +#elif _CODE_PAGE == 1254 /* Turkish (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} + +#elif _CODE_PAGE == 1255 /* Hebrew (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1256 /* Arabic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x8C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x41,0xE1,0x41,0xE3,0xE4,0xE5,0xE6,0x43,0x45,0x45,0x45,0x45,0xEC,0xED,0x49,0x49,0xF0,0xF1,0xF2,0xF3,0x4F,0xF5,0xF6,0xF7,0xF8,0x55,0xFA,0x55,0x55,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1257 /* Baltic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xBC,0xBD,0xBE,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} + +#elif _CODE_PAGE == 1258 /* Vietnam (OEM, Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0xAC,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xEC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xFE,0x9F} + +#elif _CODE_PAGE == 1 /* ASCII (for only non-LFN cfg) */ +#if _USE_LFN +#error Cannot use LFN feature without valid code page. +#endif +#define _DF1S 0 + +#else +#error Unknown code page + +#endif + + +/* Character code support macros */ +#define IsUpper(c) (((c)>='A')&&((c)<='Z')) +#define IsLower(c) (((c)>='a')&&((c)<='z')) +#define IsDigit(c) (((c)>='0')&&((c)<='9')) + +#if _DF1S /* Code page is DBCS */ + +#ifdef _DF2S /* Two 1st byte areas */ +#define IsDBCS1(c) (((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) || ((BYTE)(c) >= _DF2S && (BYTE)(c) <= _DF2E)) +#else /* One 1st byte area */ +#define IsDBCS1(c) ((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) +#endif + +#ifdef _DS3S /* Three 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E) || ((BYTE)(c) >= _DS3S && (BYTE)(c) <= _DS3E)) +#else /* Two 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E)) +#endif + +#else /* Code page is SBCS */ + +#define IsDBCS1(c) 0 +#define IsDBCS2(c) 0 + +#endif /* _DF1S */ + + +/* Name status flags */ +#define NS 11 /* Index of name status byte in fn[] */ +#define NS_LOSS 0x01 /* Out of 8.3 format */ +#define NS_LFN 0x02 /* Force to create LFN entry */ +#define NS_LAST 0x04 /* Last segment */ +#define NS_BODY 0x08 /* Lower case flag (body) */ +#define NS_EXT 0x10 /* Lower case flag (ext) */ +#define NS_DOT 0x20 /* Dot entry */ + + +/* FAT sub-type boundaries */ +/* Note that the FAT spec by Microsoft says 4085 but Windows works with 4087! */ +#define MIN_FAT16 4086 /* Minimum number of clusters for FAT16 */ +#define MIN_FAT32 65526 /* Minimum number of clusters for FAT32 */ + + +/* FatFs refers the members in the FAT structures as byte array instead of +/ structure member because the structure is not binary compatible between +/ different platforms */ + +#define BS_jmpBoot 0 /* Jump instruction (3) */ +#define BS_OEMName 3 /* OEM name (8) */ +#define BPB_BytsPerSec 11 /* Sector size [byte] (2) */ +#define BPB_SecPerClus 13 /* Cluster size [sector] (1) */ +#define BPB_RsvdSecCnt 14 /* Size of reserved area [sector] (2) */ +#define BPB_NumFATs 16 /* Number of FAT copies (1) */ +#define BPB_RootEntCnt 17 /* Number of root dir entries for FAT12/16 (2) */ +#define BPB_TotSec16 19 /* Volume size [sector] (2) */ +#define BPB_Media 21 /* Media descriptor (1) */ +#define BPB_FATSz16 22 /* FAT size [sector] (2) */ +#define BPB_SecPerTrk 24 /* Track size [sector] (2) */ +#define BPB_NumHeads 26 /* Number of heads (2) */ +#define BPB_HiddSec 28 /* Number of special hidden sectors (4) */ +#define BPB_TotSec32 32 /* Volume size [sector] (4) */ +#define BS_DrvNum 36 /* Physical drive number (2) */ +#define BS_BootSig 38 /* Extended boot signature (1) */ +#define BS_VolID 39 /* Volume serial number (4) */ +#define BS_VolLab 43 /* Volume label (8) */ +#define BS_FilSysType 54 /* File system type (1) */ +#define BPB_FATSz32 36 /* FAT size [sector] (4) */ +#define BPB_ExtFlags 40 /* Extended flags (2) */ +#define BPB_FSVer 42 /* File system version (2) */ +#define BPB_RootClus 44 /* Root dir first cluster (4) */ +#define BPB_FSInfo 48 /* Offset of FSInfo sector (2) */ +#define BPB_BkBootSec 50 /* Offset of backup boot sector (2) */ +#define BS_DrvNum32 64 /* Physical drive number (2) */ +#define BS_BootSig32 66 /* Extended boot signature (1) */ +#define BS_VolID32 67 /* Volume serial number (4) */ +#define BS_VolLab32 71 /* Volume label (8) */ +#define BS_FilSysType32 82 /* File system type (1) */ +#define FSI_LeadSig 0 /* FSI: Leading signature (4) */ +#define FSI_StrucSig 484 /* FSI: Structure signature (4) */ +#define FSI_Free_Count 488 /* FSI: Number of free clusters (4) */ +#define FSI_Nxt_Free 492 /* FSI: Last allocated cluster (4) */ +#define MBR_Table 446 /* MBR: Partition table offset (2) */ +#define SZ_PTE 16 /* MBR: Size of a partition table entry */ +#define BS_55AA 510 /* Boot sector signature (2) */ + +#define DIR_Name 0 /* Short file name (11) */ +#define DIR_Attr 11 /* Attribute (1) */ +#define DIR_NTres 12 /* NT flag (1) */ +#define DIR_CrtTimeTenth 13 /* Created time sub-second (1) */ +#define DIR_CrtTime 14 /* Created time (2) */ +#define DIR_CrtDate 16 /* Created date (2) */ +#define DIR_LstAccDate 18 /* Last accessed date (2) */ +#define DIR_FstClusHI 20 /* Higher 16-bit of first cluster (2) */ +#define DIR_WrtTime 22 /* Modified time (2) */ +#define DIR_WrtDate 24 /* Modified date (2) */ +#define DIR_FstClusLO 26 /* Lower 16-bit of first cluster (2) */ +#define DIR_FileSize 28 /* File size (4) */ +#define LDIR_Ord 0 /* LFN entry order and LLE flag (1) */ +#define LDIR_Attr 11 /* LFN attribute (1) */ +#define LDIR_Type 12 /* LFN type (1) */ +#define LDIR_Chksum 13 /* Sum of corresponding SFN entry */ +#define LDIR_FstClusLO 26 /* Filled by zero (0) */ +#define SZ_DIR 32 /* Size of a directory entry */ +#define LLE 0x40 /* Last long entry flag in LDIR_Ord */ +#define DDE 0xE5 /* Deleted directory entry mark in DIR_Name[0] */ +#define NDDE 0x05 /* Replacement of the character collides with DDE */ + + +/*------------------------------------------------------------*/ +/* Module private work area */ +/*------------------------------------------------------------*/ +/* Note that uninitialized variables with static duration are +/ zeroed/nulled at start-up. If not, the compiler or start-up +/ routine is out of ANSI-C standard. +*/ + +#if _VOLUMES +static +FATFS *FatFs[_VOLUMES]; /* Pointer to the file system objects (logical drives) */ +#else +#error Number of volumes must not be 0. +#endif + +static +WORD Fsid; /* File system mount ID */ + +#if _FS_RPATH +static +BYTE CurrVol; /* Current drive */ +#endif + +#if _FS_LOCK +static +FILESEM Files[_FS_LOCK]; /* File lock semaphores */ +#endif + +#if _USE_LFN == 0 /* No LFN feature */ +#define DEF_NAMEBUF BYTE sfn[12] +#define INIT_BUF(dobj) (dobj).fn = sfn +#define FREE_BUF() + +#elif _USE_LFN == 1 /* LFN feature with static working buffer */ +static WCHAR LfnBuf[_MAX_LFN+1]; +#define DEF_NAMEBUF BYTE sfn[12] +#define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = LfnBuf; } +#define FREE_BUF() + +#elif _USE_LFN == 2 /* LFN feature with dynamic working buffer on the stack */ +#define DEF_NAMEBUF BYTE sfn[12]; WCHAR lbuf[_MAX_LFN+1] +#define INIT_BUF(dobj) { (dobj).fn = sfn; (dobj).lfn = lbuf; } +#define FREE_BUF() + +#elif _USE_LFN == 3 /* LFN feature with dynamic working buffer on the heap */ +#define DEF_NAMEBUF BYTE sfn[12]; WCHAR *lfn +#define INIT_BUF(dobj) { lfn = ff_memalloc((_MAX_LFN + 1) * 2); \ + if (!lfn) LEAVE_FF((dobj).fs, FR_NOT_ENOUGH_CORE); \ + (dobj).lfn = lfn; (dobj).fn = sfn; } +#define FREE_BUF() ff_memfree(lfn) + +#else +#error Wrong LFN configuration. +#endif + + +#ifdef _EXCVT +static +const BYTE ExCvt[] = _EXCVT; /* Upper conversion table for extended chars */ +#endif + + + + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/* Copy memory to memory */ +static +void mem_cpy (void* dst, const void* src, UINT cnt) { + BYTE *d = (BYTE*)dst; + const BYTE *s = (const BYTE*)src; + +#if _WORD_ACCESS == 1 + while (cnt >= sizeof (int)) { + *(int*)d = *(int*)s; + d += sizeof (int); s += sizeof (int); + cnt -= sizeof (int); + } +#endif + while (cnt--) + *d++ = *s++; +} + +/* Fill memory */ +static +void mem_set (void* dst, int val, UINT cnt) { + BYTE *d = (BYTE*)dst; + + while (cnt--) + *d++ = (BYTE)val; +} + +/* Compare memory to memory */ +static +int mem_cmp (const void* dst, const void* src, UINT cnt) { + const BYTE *d = (const BYTE *)dst, *s = (const BYTE *)src; + int r = 0; + + while (cnt-- && (r = *d++ - *s++) == 0) ; + return r; +} + +/* Check if chr is contained in the string */ +static +int chk_chr (const char* str, int chr) { + while (*str && *str != chr) str++; + return *str; +} + + + +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ +#if _FS_REENTRANT + +static +int lock_fs ( + FATFS *fs /* File system object */ +) +{ + return ff_req_grant(fs->sobj); +} + + +static +void unlock_fs ( + FATFS *fs, /* File system object */ + FRESULT res /* Result code to be returned */ +) +{ + if (fs && + res != FR_NOT_ENABLED && + res != FR_INVALID_DRIVE && + res != FR_INVALID_OBJECT && + res != FR_TIMEOUT) { + ff_rel_grant(fs->sobj); + } +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* File lock control functions */ +/*-----------------------------------------------------------------------*/ +#if _FS_LOCK + +static +FRESULT chk_lock ( /* Check if the file can be accessed */ + DIR* dj, /* Directory object pointing the file to be checked */ + int acc /* Desired access (0:Read, 1:Write, 2:Delete/Rename) */ +) +{ + UINT i, be; + + /* Search file semaphore table */ + for (i = be = 0; i < _FS_LOCK; i++) { + if (Files[i].fs) { /* Existing entry */ + if (Files[i].fs == dj->fs && /* Check if the file matched with an open file */ + Files[i].clu == dj->sclust && + Files[i].idx == dj->index) break; + } else { /* Blank entry */ + be++; + } + } + if (i == _FS_LOCK) /* The file is not opened */ + return (be || acc == 2) ? FR_OK : FR_TOO_MANY_OPEN_FILES; /* Is there a blank entry for new file? */ + + /* The file has been opened. Reject any open against writing file and all write mode open */ + return (acc || Files[i].ctr == 0x100) ? FR_LOCKED : FR_OK; +} + + +static +int enq_lock (void) /* Check if an entry is available for a new file */ +{ + UINT i; + + for (i = 0; i < _FS_LOCK && Files[i].fs; i++) ; + return (i == _FS_LOCK) ? 0 : 1; +} + + +static +UINT inc_lock ( /* Increment file open counter and returns its index (0:int error) */ + DIR* dj, /* Directory object pointing the file to register or increment */ + int acc /* Desired access mode (0:Read, !0:Write) */ +) +{ + UINT i; + + + for (i = 0; i < _FS_LOCK; i++) { /* Find the file */ + if (Files[i].fs == dj->fs && + Files[i].clu == dj->sclust && + Files[i].idx == dj->index) break; + } + + if (i == _FS_LOCK) { /* Not opened. Register it as new. */ + for (i = 0; i < _FS_LOCK && Files[i].fs; i++) ; + if (i == _FS_LOCK) return 0; /* No space to register (int err) */ + Files[i].fs = dj->fs; + Files[i].clu = dj->sclust; + Files[i].idx = dj->index; + Files[i].ctr = 0; + } + + if (acc && Files[i].ctr) return 0; /* Access violation (int err) */ + + Files[i].ctr = acc ? 0x100 : Files[i].ctr + 1; /* Set semaphore value */ + + return i + 1; +} + + +static +FRESULT dec_lock ( /* Decrement file open counter */ + UINT i /* Semaphore index */ +) +{ + WORD n; + FRESULT res; + + + if (--i < _FS_LOCK) { + n = Files[i].ctr; + if (n == 0x100) n = 0; + if (n) n--; + Files[i].ctr = n; + if (!n) Files[i].fs = 0; + res = FR_OK; + } else { + res = FR_INT_ERR; + } + return res; +} + + +static +void clear_lock ( /* Clear lock entries of the volume */ + FATFS *fs +) +{ + UINT i; + + for (i = 0; i < _FS_LOCK; i++) { + if (Files[i].fs == fs) Files[i].fs = 0; + } +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Move/Flush disk access window */ +/*-----------------------------------------------------------------------*/ + + +#if !_FS_READONLY +static +FRESULT sync_window ( + FATFS *fs /* File system object */ +) +{ + DWORD wsect; + UINT nf; + + + if (fs->wflag) { /* Write back the sector if it is dirty */ + wsect = fs->winsect; /* Current sector number */ + if (disk_write(fs->drv, fs->win, wsect, 1) != RES_OK) + return FR_DISK_ERR; + fs->wflag = 0; + if (wsect >= fs->fatbase && wsect < (fs->fatbase + fs->fsize)) { /* In FAT area? */ + for (nf = fs->n_fats; nf >= 2; nf--) { /* Reflect the change to all FAT copies */ + wsect += fs->fsize; + disk_write(fs->drv, fs->win, wsect, 1); + } + } + } + return FR_OK; +} +#endif + + +static +FRESULT move_window ( + FATFS *fs, /* File system object */ + DWORD sector /* Sector number to make appearance in the fs->win[] */ +) +{ + if (sector != fs->winsect) { /* Changed current window */ +#if !_FS_READONLY + if (sync_window(fs) != FR_OK) + return FR_DISK_ERR; +#endif + if (disk_read(fs->drv, fs->win, sector, 1) != RES_OK) + return FR_DISK_ERR; + fs->winsect = sector; + } + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize file system and strage device */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT sync_fs ( /* FR_OK: successful, FR_DISK_ERR: failed */ + FATFS *fs /* File system object */ +) +{ + FRESULT res; + + + res = sync_window(fs); + if (res == FR_OK) { + /* Update FSInfo sector if needed */ + if (fs->fs_type == FS_FAT32 && fs->fsi_flag) { + fs->winsect = 0; + /* Create FSInfo structure */ + mem_set(fs->win, 0, 512); + ST_WORD(fs->win+BS_55AA, 0xAA55); + ST_DWORD(fs->win+FSI_LeadSig, 0x41615252); + ST_DWORD(fs->win+FSI_StrucSig, 0x61417272); + ST_DWORD(fs->win+FSI_Free_Count, fs->free_clust); + ST_DWORD(fs->win+FSI_Nxt_Free, fs->last_clust); + /* Write it into the FSInfo sector */ + disk_write(fs->drv, fs->win, fs->fsi_sector, 1); + fs->fsi_flag = 0; + } + /* Make sure that no pending write process in the physical drive */ + if (disk_ioctl(fs->drv, CTRL_SYNC, 0) != RES_OK) + res = FR_DISK_ERR; + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Get sector# from cluster# */ +/*-----------------------------------------------------------------------*/ + + +DWORD clust2sect ( /* !=0: Sector number, 0: Failed - invalid cluster# */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; + if (clst >= (fs->n_fatent - 2)) return 0; /* Invalid cluster# */ + return clst * fs->csize + fs->database; +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Read value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + + +DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, Else:Cluster status */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to get the link information */ +) +{ + UINT wc, bc; + BYTE *p; + + + if (clst < 2 || clst >= fs->n_fatent) /* Check range */ + return 1; + + switch (fs->fs_type) { + case FS_FAT12 : + bc = (UINT)clst; bc += bc / 2; + if (move_window(fs, fs->fatbase + (bc / SS(fs)))) break; + wc = fs->win[bc % SS(fs)]; bc++; + if (move_window(fs, fs->fatbase + (bc / SS(fs)))) break; + wc |= fs->win[bc % SS(fs)] << 8; + return (clst & 1) ? (wc >> 4) : (wc & 0xFFF); + + case FS_FAT16 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2)))) break; + p = &fs->win[clst * 2 % SS(fs)]; + return LD_WORD(p); + + case FS_FAT32 : + if (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4)))) break; + p = &fs->win[clst * 4 % SS(fs)]; + return LD_DWORD(p) & 0x0FFFFFFF; + } + + return 0xFFFFFFFF; /* An error occurred at the disk I/O layer */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Change value of a FAT entry */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY + +FRESULT put_fat ( + FATFS *fs, /* File system object */ + DWORD clst, /* Cluster# to be changed in range of 2 to fs->n_fatent - 1 */ + DWORD val /* New value to mark the cluster */ +) +{ + UINT bc; + BYTE *p; + FRESULT res; + + + if (clst < 2 || clst >= fs->n_fatent) { /* Check range */ + res = FR_INT_ERR; + + } else { + switch (fs->fs_type) { + case FS_FAT12 : + bc = (UINT)clst; bc += bc / 2; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc % SS(fs)]; + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; + bc++; + fs->wflag = 1; + res = move_window(fs, fs->fatbase + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc % SS(fs)]; + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); + break; + + case FS_FAT16 : + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + p = &fs->win[clst * 2 % SS(fs)]; + ST_WORD(p, (WORD)val); + break; + + case FS_FAT32 : + res = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + p = &fs->win[clst * 4 % SS(fs)]; + val |= LD_DWORD(p) & 0xF0000000; + ST_DWORD(p, val); + break; + + default : + res = FR_INT_ERR; + } + fs->wflag = 1; + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT remove_chain ( + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to remove a chain from */ +) +{ + FRESULT res; + DWORD nxt; +#if _USE_ERASE + DWORD scl = clst, ecl = clst, rt[2]; +#endif + + if (clst < 2 || clst >= fs->n_fatent) { /* Check range */ + res = FR_INT_ERR; + + } else { + res = FR_OK; + while (clst < fs->n_fatent) { /* Not a last link? */ + nxt = get_fat(fs, clst); /* Get cluster status */ + if (nxt == 0) break; /* Empty cluster? */ + if (nxt == 1) { res = FR_INT_ERR; break; } /* Internal error? */ + if (nxt == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } /* Disk error? */ + res = put_fat(fs, clst, 0); /* Mark the cluster "empty" */ + if (res != FR_OK) break; + if (fs->free_clust != 0xFFFFFFFF) { /* Update FSInfo */ + fs->free_clust++; + fs->fsi_flag = 1; + } +#if _USE_ERASE + if (ecl + 1 == nxt) { /* Is next cluster contiguous? */ + ecl = nxt; + } else { /* End of contiguous clusters */ + rt[0] = clust2sect(fs, scl); /* Start sector */ + rt[1] = clust2sect(fs, ecl) + fs->csize - 1; /* End sector */ + disk_ioctl(fs->drv, CTRL_ERASE_SECTOR, rt); /* Erase the block */ + scl = ecl = nxt; + } +#endif + clst = nxt; /* Next cluster */ + } + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Stretch or Create a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to stretch. 0 means create a new chain. */ +) +{ + DWORD cs, ncl, scl; + FRESULT res; + + + if (clst == 0) { /* Create a new chain */ + scl = fs->last_clust; /* Get suggested start point */ + if (!scl || scl >= fs->n_fatent) scl = 1; + } + else { /* Stretch the current chain */ + cs = get_fat(fs, clst); /* Check the cluster status */ + if (cs < 2) return 1; /* It is an invalid cluster */ + if (cs < fs->n_fatent) return cs; /* It is already followed by next cluster */ + scl = clst; + } + + ncl = scl; /* Start cluster */ + for (;;) { + ncl++; /* Next cluster */ + if (ncl >= fs->n_fatent) { /* Wrap around */ + ncl = 2; + if (ncl > scl) return 0; /* No free cluster */ + } + cs = get_fat(fs, ncl); /* Get the cluster status */ + if (cs == 0) break; /* Found a free cluster */ + if (cs == 0xFFFFFFFF || cs == 1)/* An error occurred */ + return cs; + if (ncl == scl) return 0; /* No free cluster */ + } + + res = put_fat(fs, ncl, 0x0FFFFFFF); /* Mark the new cluster "last link" */ + if (res == FR_OK && clst != 0) { + res = put_fat(fs, clst, ncl); /* Link it to the previous one if needed */ + } + if (res == FR_OK) { + fs->last_clust = ncl; /* Update FSINFO */ + if (fs->free_clust != 0xFFFFFFFF) { + fs->free_clust--; + fs->fsi_flag = 1; + } + } else { + ncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1; + } + + return ncl; /* Return new cluster number or error code */ +} +#endif /* !_FS_READONLY */ + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Convert offset into cluster with link map table */ +/*-----------------------------------------------------------------------*/ + +#if _USE_FASTSEEK +static +DWORD clmt_clust ( /* <2:Error, >=2:Cluster number */ + FIL* fp, /* Pointer to the file object */ + DWORD ofs /* File offset to be converted to cluster# */ +) +{ + DWORD cl, ncl, *tbl; + + + tbl = fp->cltbl + 1; /* Top of CLMT */ + cl = ofs / SS(fp->fs) / fp->fs->csize; /* Cluster order from top of the file */ + for (;;) { + ncl = *tbl++; /* Number of cluters in the fragment */ + if (!ncl) return 0; /* End of table? (error) */ + if (cl < ncl) break; /* In this fragment? */ + cl -= ncl; tbl++; /* Next fragment */ + } + return cl + *tbl; /* Return the cluster number */ +} +#endif /* _USE_FASTSEEK */ + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Set directory index */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_sdi ( + DIR *dj, /* Pointer to directory object */ + WORD idx /* Index of directory table */ +) +{ + DWORD clst; + WORD ic; + + + dj->index = idx; + clst = dj->sclust; + if (clst == 1 || clst >= dj->fs->n_fatent) /* Check start cluster range */ + return FR_INT_ERR; + if (!clst && dj->fs->fs_type == FS_FAT32) /* Replace cluster# 0 with root cluster# if in FAT32 */ + clst = dj->fs->dirbase; + + if (clst == 0) { /* Static table (root-dir in FAT12/16) */ + dj->clust = clst; + if (idx >= dj->fs->n_rootdir) /* Index is out of range */ + return FR_INT_ERR; + dj->sect = dj->fs->dirbase + idx / (SS(dj->fs) / SZ_DIR); /* Sector# */ + } + else { /* Dynamic table (sub-dirs or root-dir in FAT32) */ + ic = SS(dj->fs) / SZ_DIR * dj->fs->csize; /* Entries per cluster */ + while (idx >= ic) { /* Follow cluster chain */ + clst = get_fat(dj->fs, clst); /* Get next cluster */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst < 2 || clst >= dj->fs->n_fatent) /* Reached to end of table or int error */ + return FR_INT_ERR; + idx -= ic; + } + dj->clust = clst; + dj->sect = clust2sect(dj->fs, clst) + idx / (SS(dj->fs) / SZ_DIR); /* Sector# */ + } + + dj->dir = dj->fs->win + (idx % (SS(dj->fs) / SZ_DIR)) * SZ_DIR; /* Ptr to the entry in the sector */ + + return FR_OK; /* Seek succeeded */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Move directory table index next */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */ + DIR *dj, /* Pointer to the directory object */ + int stretch /* 0: Do not stretch table, 1: Stretch table if needed */ +) +{ + DWORD clst; + WORD i; + + + stretch = stretch; /* To suppress warning on read-only cfg. */ + i = dj->index + 1; + if (!i || !dj->sect) /* Report EOT when index has reached 65535 */ + return FR_NO_FILE; + + if (!(i % (SS(dj->fs) / SZ_DIR))) { /* Sector changed? */ + dj->sect++; /* Next sector */ + + if (dj->clust == 0) { /* Static table */ + if (i >= dj->fs->n_rootdir) /* Report EOT when end of table */ + return FR_NO_FILE; + } + else { /* Dynamic table */ + if (((i / (SS(dj->fs) / SZ_DIR)) & (dj->fs->csize - 1)) == 0) { /* Cluster changed? */ + clst = get_fat(dj->fs, dj->clust); /* Get next cluster */ + if (clst <= 1) return FR_INT_ERR; + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; + if (clst >= dj->fs->n_fatent) { /* When it reached end of dynamic table */ +#if !_FS_READONLY + BYTE c; + if (!stretch) return FR_NO_FILE; /* When do not stretch, report EOT */ + clst = create_chain(dj->fs, dj->clust); /* Stretch cluster chain */ + if (clst == 0) return FR_DENIED; /* No free cluster */ + if (clst == 1) return FR_INT_ERR; + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; + /* Clean-up stretched table */ + if (sync_window(dj->fs)) return FR_DISK_ERR; /* Flush active window */ + mem_set(dj->fs->win, 0, SS(dj->fs)); /* Clear window buffer */ + dj->fs->winsect = clust2sect(dj->fs, clst); /* Cluster start sector */ + for (c = 0; c < dj->fs->csize; c++) { /* Fill the new cluster with 0 */ + dj->fs->wflag = 1; + if (sync_window(dj->fs)) return FR_DISK_ERR; + dj->fs->winsect++; + } + dj->fs->winsect -= c; /* Rewind window address */ +#else + return FR_NO_FILE; /* Report EOT */ +#endif + } + dj->clust = clst; /* Initialize data for new cluster */ + dj->sect = clust2sect(dj->fs, clst); + } + } + } + + dj->index = i; + dj->dir = dj->fs->win + (i % (SS(dj->fs) / SZ_DIR)) * SZ_DIR; + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Reserve directory entry */ +/*-----------------------------------------------------------------------*/ + +#if !_FS_READONLY +static +FRESULT dir_alloc ( + DIR* dj, /* Pointer to the directory object */ + UINT nent /* Number of contiguous entries to allocate (1-21) */ +) +{ + FRESULT res; + UINT n; + + + res = dir_sdi(dj, 0); + if (res == FR_OK) { + n = 0; + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + if (dj->dir[0] == DDE || dj->dir[0] == 0) { /* Is it a blank entry? */ + if (++n == nent) break; /* A block of contiguous entry is found */ + } else { + n = 0; /* Not a blank entry. Restart to search */ + } + res = dir_next(dj, 1); /* Next entry with table stretch enabled */ + } while (res == FR_OK); + } + return res; +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Load/Store start cluster number */ +/*-----------------------------------------------------------------------*/ + +static +DWORD ld_clust ( + FATFS *fs, /* Pointer to the fs object */ + BYTE *dir /* Pointer to the directory entry */ +) +{ + DWORD cl; + + cl = LD_WORD(dir+DIR_FstClusLO); + if (fs->fs_type == FS_FAT32) + cl |= (DWORD)LD_WORD(dir+DIR_FstClusHI) << 16; + + return cl; +} + + +#if !_FS_READONLY +static +void st_clust ( + BYTE *dir, /* Pointer to the directory entry */ + DWORD cl /* Value to be set */ +) +{ + ST_WORD(dir+DIR_FstClusLO, cl); + ST_WORD(dir+DIR_FstClusHI, cl >> 16); +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* LFN handling - Test/Pick/Fit an LFN segment from/to directory entry */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static +const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* Offset of LFN chars in the directory entry */ + + +static +int cmp_lfn ( /* 1:Matched, 0:Not matched */ + WCHAR *lfnbuf, /* Pointer to the LFN to be compared */ + BYTE *dir /* Pointer to the directory entry containing a part of LFN */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + i = ((dir[LDIR_Ord] & ~LLE) - 1) * 13; /* Get offset in the LFN buffer */ + s = 0; wc = 1; + do { + uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ + if (wc) { /* Last char has not been processed */ + wc = ff_wtoupper(uc); /* Convert it to upper case */ + if (i >= _MAX_LFN || wc != ff_wtoupper(lfnbuf[i++])) /* Compare it */ + return 0; /* Not matched */ + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } while (++s < 13); /* Repeat until all chars in the entry are checked */ + + if ((dir[LDIR_Ord] & LLE) && wc && lfnbuf[i]) /* Last segment matched but different length */ + return 0; + + return 1; /* The part of LFN matched */ +} + + + +static +int pick_lfn ( /* 1:Succeeded, 0:Buffer overflow */ + WCHAR *lfnbuf, /* Pointer to the Unicode-LFN buffer */ + BYTE *dir /* Pointer to the directory entry */ +) +{ + UINT i, s; + WCHAR wc, uc; + + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + s = 0; wc = 1; + do { + uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ + if (wc) { /* Last char has not been processed */ + if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i++] = wc = uc; /* Store it */ + } else { + if (uc != 0xFFFF) return 0; /* Check filler */ + } + } while (++s < 13); /* Read all character in the entry */ + + if (dir[LDIR_Ord] & LLE) { /* Put terminator if it is the last LFN part */ + if (i >= _MAX_LFN) return 0; /* Buffer overflow? */ + lfnbuf[i] = 0; + } + + return 1; +} + + +#if !_FS_READONLY +static +void fit_lfn ( + const WCHAR *lfnbuf, /* Pointer to the LFN buffer */ + BYTE *dir, /* Pointer to the directory entry */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* SFN sum */ +) +{ + UINT i, s; + WCHAR wc; + + + dir[LDIR_Chksum] = sum; /* Set check sum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + ST_WORD(dir+LDIR_FstClusLO, 0); + + i = (ord - 1) * 13; /* Get offset in the LFN buffer */ + s = wc = 0; + do { + if (wc != 0xFFFF) wc = lfnbuf[i++]; /* Get an effective char */ + ST_WORD(dir+LfnOfs[s], wc); /* Put it */ + if (!wc) wc = 0xFFFF; /* Padding chars following last char */ + } while (++s < 13); + if (wc == 0xFFFF || !lfnbuf[i]) ord |= LLE; /* Bottom LFN part is the start of LFN sequence */ + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + +#endif +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Create numbered name */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +void gen_numname ( + BYTE *dst, /* Pointer to generated SFN */ + const BYTE *src, /* Pointer to source SFN to be modified */ + const WCHAR *lfn, /* Pointer to LFN */ + WORD seq /* Sequence number */ +) +{ + BYTE ns[8], c; + UINT i, j; + + + mem_cpy(dst, src, 11); + + if (seq > 5) { /* On many collisions, generate a hash number instead of sequential number */ + do seq = (seq >> 1) + (seq << 15) + (WORD)*lfn++; while (*lfn); + } + + /* itoa (hexdecimal) */ + i = 7; + do { + c = (seq % 16) + '0'; + if (c > '9') c += 7; + ns[i--] = c; + seq /= 16; + } while (seq); + ns[i] = '~'; + + /* Append the number */ + for (j = 0; j < i && dst[j] != ' '; j++) { + if (IsDBCS1(dst[j])) { + if (j == i - 1) break; + j++; + } + } + do { + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Calculate sum of an SFN */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static +BYTE sum_sfn ( + const BYTE *dir /* Ptr to directory entry */ +) +{ + BYTE sum = 0; + UINT n = 11; + + do sum = (sum >> 1) + (sum << 7) + *dir++; while (--n); + return sum; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_find ( + DIR *dj /* Pointer to the directory object linked to the file name */ +) +{ + FRESULT res; + BYTE c, *dir; +#if _USE_LFN + BYTE a, ord, sum; +#endif + + res = dir_sdi(dj, 0); /* Rewind directory object */ + if (res != FR_OK) return res; + +#if _USE_LFN + ord = sum = 0xFF; +#endif + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if _USE_LFN /* LFN configuration */ + a = dir[DIR_Attr] & AM_MASK; + if (c == DDE || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (dj->lfn) { + if (c & LLE) { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= ~LLE; ord = c; /* LFN start order */ + dj->lfn_idx = dj->index; + } + /* Check validity of the LFN entry and compare it with given name */ + ord = (c == ord && sum == dir[LDIR_Chksum] && cmp_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF; + } + } else { /* An SFN entry is found */ + if (!ord && sum == sum_sfn(dir)) break; /* LFN matched? */ + ord = 0xFF; dj->lfn_idx = 0xFFFF; /* Reset LFN sequence */ + if (!(dj->fn[NS] & NS_LOSS) && !mem_cmp(dir, dj->fn, 11)) break; /* SFN matched? */ + } + } +#else /* Non LFN configuration */ + if (!(dir[DIR_Attr] & AM_VOL) && !mem_cmp(dir, dj->fn, 11)) /* Is it a valid entry? */ + break; +#endif + res = dir_next(dj, 0); /* Next entry */ + } while (res == FR_OK); + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 || _USE_LABEL || _FS_RPATH >= 2 +static +FRESULT dir_read ( + DIR *dj, /* Pointer to the directory object */ + int vol /* Filtered by 0:file/dir or 1:volume label */ +) +{ + FRESULT res; + BYTE a, c, *dir; +#if _USE_LFN + BYTE ord = 0xFF, sum = 0xFF; +#endif + + res = FR_NO_FILE; + while (dj->sect) { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ + a = dir[DIR_Attr] & AM_MASK; +#if _USE_LFN /* LFN configuration */ + if (c == DDE || (!_FS_RPATH && c == '.') || (a == AM_VOL) != vol) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (c & LLE) { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= ~LLE; ord = c; + dj->lfn_idx = dj->index; + } + /* Check LFN validity and capture it */ + ord = (c == ord && sum == dir[LDIR_Chksum] && pick_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF; + } else { /* An SFN entry is found */ + if (ord || sum != sum_sfn(dir)) /* Is there a valid LFN? */ + dj->lfn_idx = 0xFFFF; /* It has no LFN. */ + break; + } + } +#else /* Non LFN configuration */ + if (c != DDE && (_FS_RPATH || c != '.') && a != AM_LFN && (a == AM_VOL) == vol) /* Is it a valid entry? */ + break; +#endif + res = dir_next(dj, 0); /* Next entry */ + if (res != FR_OK) break; + } + + if (res != FR_OK) dj->sect = 0; + + return res; +} +#endif /* _FS_MINIMIZE <= 1 || _USE_LABEL || _FS_RPATH >= 2 */ + + + +/*-----------------------------------------------------------------------*/ +/* Register an object to the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many SFN collision, FR_DISK_ERR:Disk error */ + DIR *dj /* Target directory with object name to be created */ +) +{ + FRESULT res; +#if _USE_LFN /* LFN configuration */ + WORD n, ne; + BYTE sn[12], *fn, sum; + WCHAR *lfn; + + + fn = dj->fn; lfn = dj->lfn; + mem_cpy(sn, fn, 12); + + if (_FS_RPATH && (sn[NS] & NS_DOT)) /* Cannot create dot entry */ + return FR_INVALID_NAME; + + if (sn[NS] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ + fn[NS] = 0; dj->lfn = 0; /* Find only SFN */ + for (n = 1; n < 100; n++) { + gen_numname(fn, sn, lfn, n); /* Generate a numbered name */ + res = dir_find(dj); /* Check if the name collides with existing SFN */ + if (res != FR_OK) break; + } + if (n == 100) return FR_DENIED; /* Abort if too many collisions */ + if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ + fn[NS] = sn[NS]; dj->lfn = lfn; + } + + if (sn[NS] & NS_LFN) { /* When LFN is to be created, allocate entries for an SFN + LFNs. */ + for (n = 0; lfn[n]; n++) ; + ne = (n + 25) / 13; + } else { /* Otherwise allocate an entry for an SFN */ + ne = 1; + } + res = dir_alloc(dj, ne); /* Allocate entries */ + + if (res == FR_OK && --ne) { /* Set LFN entry if needed */ + res = dir_sdi(dj, (WORD)(dj->index - ne)); + if (res == FR_OK) { + sum = sum_sfn(dj->fn); /* Sum value of the SFN tied to the LFN */ + do { /* Store LFN entries in bottom first */ + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + fit_lfn(dj->lfn, dj->dir, (BYTE)ne, sum); + dj->fs->wflag = 1; + res = dir_next(dj, 0); /* Next entry */ + } while (res == FR_OK && --ne); + } + } +#else /* Non LFN configuration */ + res = dir_alloc(dj, 1); /* Allocate an entry for SFN */ +#endif + + if (res == FR_OK) { /* Set SFN entry */ + res = move_window(dj->fs, dj->sect); + if (res == FR_OK) { + mem_set(dj->dir, 0, SZ_DIR); /* Clean the entry */ + mem_cpy(dj->dir, dj->fn, 11); /* Put SFN */ +#if _USE_LFN + dj->dir[DIR_NTres] = *(dj->fn+NS) & (NS_BODY | NS_EXT); /* Put NT flag */ +#endif + dj->fs->wflag = 1; + } + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Remove an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY && !_FS_MINIMIZE +static +FRESULT dir_remove ( /* FR_OK: Successful, FR_DISK_ERR: A disk error */ + DIR *dj /* Directory object pointing the entry to be removed */ +) +{ + FRESULT res; +#if _USE_LFN /* LFN configuration */ + WORD i; + + i = dj->index; /* SFN index */ + res = dir_sdi(dj, (WORD)((dj->lfn_idx == 0xFFFF) ? i : dj->lfn_idx)); /* Goto the SFN or top of the LFN entries */ + if (res == FR_OK) { + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + *dj->dir = DDE; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + if (dj->index >= i) break; /* When reached SFN, all entries of the object has been deleted. */ + res = dir_next(dj, 0); /* Next entry */ + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR; + } + +#else /* Non LFN configuration */ + res = dir_sdi(dj, dj->index); + if (res == FR_OK) { + res = move_window(dj->fs, dj->sect); + if (res == FR_OK) { + *dj->dir = DDE; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + } + } +#endif + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Pick a segment and create the object name in directory form */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT create_name ( + DIR *dj, /* Pointer to the directory object */ + const TCHAR **path /* Pointer to pointer to the segment in the path string */ +) +{ +#if _USE_LFN /* LFN configuration */ + BYTE b, cf; + WCHAR w, *lfn; + UINT i, ni, si, di; + const TCHAR *p; + + /* Create LFN in Unicode */ + for (p = *path; *p == '/' || *p == '\\'; p++) ; /* Strip duplicated separator */ + lfn = dj->lfn; + si = di = 0; + for (;;) { + w = p[si++]; /* Get a character */ + if (w < ' ' || w == '/' || w == '\\') break; /* Break on end of segment */ + if (di >= _MAX_LFN) /* Reject too long name */ + return FR_INVALID_NAME; +#if !_LFN_UNICODE + w &= 0xFF; + if (IsDBCS1(w)) { /* Check if it is a DBC 1st byte (always false on SBCS cfg) */ + b = (BYTE)p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(b)) + return FR_INVALID_NAME; /* Reject invalid sequence */ + w = (w << 8) + b; /* Create a DBC */ + } + w = ff_convert(w, 1); /* Convert ANSI/OEM to Unicode */ + if (!w) return FR_INVALID_NAME; /* Reject invalid code */ +#endif + if (w < 0x80 && chk_chr("\"*:<>\?|\x7F", w)) /* Reject illegal chars for LFN */ + return FR_INVALID_NAME; + lfn[di++] = w; /* Store the Unicode char */ + } + *path = &p[si]; /* Return pointer to the next segment */ + cf = (w < ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ +#if _FS_RPATH + if ((di == 1 && lfn[di-1] == '.') || /* Is this a dot entry? */ + (di == 2 && lfn[di-1] == '.' && lfn[di-2] == '.')) { + lfn[di] = 0; + for (i = 0; i < 11; i++) + dj->fn[i] = (i < di) ? '.' : ' '; + dj->fn[i] = cf | NS_DOT; /* This is a dot entry */ + return FR_OK; + } +#endif + while (di) { /* Strip trailing spaces and dots */ + w = lfn[di-1]; + if (w != ' ' && w != '.') break; + di--; + } + if (!di) return FR_INVALID_NAME; /* Reject nul string */ + + lfn[di] = 0; /* LFN is created */ + + /* Create SFN in directory form */ + mem_set(dj->fn, ' ', 11); + for (si = 0; lfn[si] == ' ' || lfn[si] == '.'; si++) ; /* Strip leading spaces and dots */ + if (si) cf |= NS_LOSS | NS_LFN; + while (di && lfn[di - 1] != '.') di--; /* Find extension (di<=si: no extension) */ + + b = i = 0; ni = 8; + for (;;) { + w = lfn[si++]; /* Get an LFN char */ + if (!w) break; /* Break on end of the LFN */ + if (w == ' ' || (w == '.' && si != di)) { /* Remove spaces and dots */ + cf |= NS_LOSS | NS_LFN; continue; + } + + if (i >= ni || si == di) { /* Extension or end of SFN */ + if (ni == 11) { /* Long extension */ + cf |= NS_LOSS | NS_LFN; break; + } + if (si != di) cf |= NS_LOSS | NS_LFN; /* Out of 8.3 format */ + if (si > di) break; /* No extension */ + si = di; i = 8; ni = 11; /* Enter extension section */ + b <<= 2; continue; + } + + if (w >= 0x80) { /* Non ASCII char */ +#ifdef _EXCVT + w = ff_convert(w, 0); /* Unicode -> OEM code */ + if (w) w = ExCvt[w - 0x80]; /* Convert extended char to upper (SBCS) */ +#else + w = ff_convert(ff_wtoupper(w), 0); /* Upper converted Unicode -> OEM code */ +#endif + cf |= NS_LFN; /* Force create LFN entry */ + } + + if (_DF1S && w >= 0x100) { /* Double byte char (always false on SBCS cfg) */ + if (i >= ni - 1) { + cf |= NS_LOSS | NS_LFN; i = ni; continue; + } + dj->fn[i++] = (BYTE)(w >> 8); + } else { /* Single byte char */ + if (!w || chk_chr("+,;=[]", w)) { /* Replace illegal chars for SFN */ + w = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */ + } else { + if (IsUpper(w)) { /* ASCII large capital */ + b |= 2; + } else { + if (IsLower(w)) { /* ASCII small capital */ + b |= 1; w -= 0x20; + } + } + } + } + dj->fn[i++] = (BYTE)w; + } + + if (dj->fn[0] == DDE) dj->fn[0] = NDDE; /* If the first char collides with deleted mark, replace it with 0x05 */ + + if (ni == 8) b <<= 2; + if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) /* Create LFN entry when there are composite capitals */ + cf |= NS_LFN; + if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended char, NT flags are created */ + if ((b & 0x03) == 0x01) cf |= NS_EXT; /* NT flag (Extension has only small capital) */ + if ((b & 0x0C) == 0x04) cf |= NS_BODY; /* NT flag (Filename has only small capital) */ + } + + dj->fn[NS] = cf; /* SFN is created */ + + return FR_OK; + + +#else /* Non-LFN configuration */ + BYTE b, c, d, *sfn; + UINT ni, si, i; + const char *p; + + /* Create file name in directory form */ + for (p = *path; *p == '/' || *p == '\\'; p++) ; /* Strip duplicated separator */ + sfn = dj->fn; + mem_set(sfn, ' ', 11); + si = i = b = 0; ni = 8; +#if _FS_RPATH + if (p[si] == '.') { /* Is this a dot entry? */ + for (;;) { + c = (BYTE)p[si++]; + if (c != '.' || si >= 3) break; + sfn[i++] = c; + } + if (c != '/' && c != '\\' && c > ' ') return FR_INVALID_NAME; + *path = &p[si]; /* Return pointer to the next segment */ + sfn[NS] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT; /* Set last segment flag if end of path */ + return FR_OK; + } +#endif + for (;;) { + c = (BYTE)p[si++]; + if (c <= ' ' || c == '/' || c == '\\') break; /* Break on end of segment */ + if (c == '.' || i >= ni) { + if (ni != 8 || c != '.') return FR_INVALID_NAME; + i = 8; ni = 11; + b <<= 2; continue; + } + if (c >= 0x80) { /* Extended char? */ + b |= 3; /* Eliminate NT flag */ +#ifdef _EXCVT + c = ExCvt[c - 0x80]; /* To upper extended chars (SBCS cfg) */ +#else +#if !_DF1S + return FR_INVALID_NAME; /* Reject extended chars (ASCII cfg) */ +#endif +#endif + } + if (IsDBCS1(c)) { /* Check if it is a DBC 1st byte (always false on SBCS cfg) */ + d = (BYTE)p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(d) || i >= ni - 1) /* Reject invalid DBC */ + return FR_INVALID_NAME; + sfn[i++] = c; + sfn[i++] = d; + } else { /* Single byte code */ + if (chk_chr("\"*+,:;<=>\?[]|\x7F", c)) /* Reject illegal chrs for SFN */ + return FR_INVALID_NAME; + if (IsUpper(c)) { /* ASCII large capital? */ + b |= 2; + } else { + if (IsLower(c)) { /* ASCII small capital? */ + b |= 1; c -= 0x20; + } + } + sfn[i++] = c; + } + } + *path = &p[si]; /* Return pointer to the next segment */ + c = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ + + if (!i) return FR_INVALID_NAME; /* Reject nul string */ + if (sfn[0] == DDE) sfn[0] = NDDE; /* When first char collides with DDE, replace it with 0x05 */ + + if (ni == 8) b <<= 2; + if ((b & 0x03) == 0x01) c |= NS_EXT; /* NT flag (Name extension has only small capital) */ + if ((b & 0x0C) == 0x04) c |= NS_BODY; /* NT flag (Name body has only small capital) */ + + sfn[NS] = c; /* Store NT flag, File name is created */ + + return FR_OK; +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get file information from directory entry */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 || _FS_RPATH >= 2 +static +void get_fileinfo ( /* No return code */ + DIR *dj, /* Pointer to the directory object */ + FILINFO *fno /* Pointer to the file information to be filled */ +) +{ + UINT i; + BYTE nt, *dir; + TCHAR *p, c; + + + p = fno->fname; + if (dj->sect) { + dir = dj->dir; + nt = dir[DIR_NTres]; /* NT flag */ + for (i = 0; i < 8; i++) { /* Copy name body */ + c = dir[i]; + if (c == ' ') break; + if (c == NDDE) c = (TCHAR)DDE; + if (_USE_LFN && (nt & NS_BODY) && IsUpper(c)) c += 0x20; +#if _LFN_UNICODE + if (IsDBCS1(c) && i < 7 && IsDBCS2(dir[i+1])) + c = (c << 8) | dir[++i]; + c = ff_convert(c, 1); + if (!c) c = '?'; +#endif + *p++ = c; + } + if (dir[8] != ' ') { /* Copy name extension */ + *p++ = '.'; + for (i = 8; i < 11; i++) { + c = dir[i]; + if (c == ' ') break; + if (_USE_LFN && (nt & NS_EXT) && IsUpper(c)) c += 0x20; +#if _LFN_UNICODE + if (IsDBCS1(c) && i < 10 && IsDBCS2(dir[i+1])) + c = (c << 8) | dir[++i]; + c = ff_convert(c, 1); + if (!c) c = '?'; +#endif + *p++ = c; + } + } + fno->fattrib = dir[DIR_Attr]; /* Attribute */ + fno->fsize = LD_DWORD(dir+DIR_FileSize); /* Size */ + fno->fdate = LD_WORD(dir+DIR_WrtDate); /* Date */ + fno->ftime = LD_WORD(dir+DIR_WrtTime); /* Time */ + } + *p = 0; /* Terminate SFN str by a \0 */ + +#if _USE_LFN + if (fno->lfname && fno->lfsize) { + TCHAR *tp = fno->lfname; + WCHAR w, *lfn; + + i = 0; + if (dj->sect && dj->lfn_idx != 0xFFFF) {/* Get LFN if available */ + lfn = dj->lfn; + while ((w = *lfn++) != 0) { /* Get an LFN char */ +#if !_LFN_UNICODE + w = ff_convert(w, 0); /* Unicode -> OEM conversion */ + if (!w) { i = 0; break; } /* Could not convert, no LFN */ + if (_DF1S && w >= 0x100) /* Put 1st byte if it is a DBC (always false on SBCS cfg) */ + tp[i++] = (TCHAR)(w >> 8); +#endif + if (i >= fno->lfsize - 1) { i = 0; break; } /* Buffer overflow, no LFN */ + tp[i++] = (TCHAR)w; + } + } + tp[i] = 0; /* Terminate the LFN str by a \0 */ + } +#endif +} +#endif /* _FS_MINIMIZE <= 1 || _FS_RPATH >= 2*/ + + + + +/*-----------------------------------------------------------------------*/ +/* Follow a file path */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ + DIR *dj, /* Directory object to return last directory and found object */ + const TCHAR *path /* Full-path string to find a file or directory */ +) +{ + FRESULT res; + BYTE *dir, ns; + + +#if _FS_RPATH + if (*path == '/' || *path == '\\') { /* There is a heading separator */ + path++; dj->sclust = 0; /* Strip it and start from the root dir */ + } else { /* No heading separator */ + dj->sclust = dj->fs->cdir; /* Start from the current dir */ + } +#else + if (*path == '/' || *path == '\\') /* Strip heading separator if exist */ + path++; + dj->sclust = 0; /* Start from the root dir */ +#endif + + if ((UINT)*path < ' ') { /* Nul path means the start directory itself */ + res = dir_sdi(dj, 0); + dj->dir = 0; + } else { /* Follow path */ + for (;;) { + res = create_name(dj, &path); /* Get a segment */ + if (res != FR_OK) break; + res = dir_find(dj); /* Find it */ + ns = *(dj->fn+NS); + if (res != FR_OK) { /* Failed to find the object */ + if (res != FR_NO_FILE) break; /* Abort if any hard error occurred */ + /* Object not found */ + if (_FS_RPATH && (ns & NS_DOT)) { /* If dot entry is not exit */ + dj->sclust = 0; dj->dir = 0; /* It is the root dir */ + res = FR_OK; + if (!(ns & NS_LAST)) continue; + } else { /* Could not find the object */ + if (!(ns & NS_LAST)) res = FR_NO_PATH; + } + break; + } + if (ns & NS_LAST) break; /* Last segment match. Function completed. */ + dir = dj->dir; /* There is next segment. Follow the sub directory */ + if (!(dir[DIR_Attr] & AM_DIR)) { /* Cannot follow because it is a file */ + res = FR_NO_PATH; break; + } + dj->sclust = ld_clust(dj->fs, dir); + } + } + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load a sector and check if it is an FAT Volume Boot Record */ +/*-----------------------------------------------------------------------*/ + +static +BYTE check_fs ( /* 0:FAT-VBR, 1:Any BR but not FAT, 2:Not a BR, 3:Disk error */ + FATFS *fs, /* File system object */ + DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */ +) +{ + if (disk_read(fs->drv, fs->win, sect, 1) != RES_OK) /* Load boot record */ + return 3; + if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55) /* Check record signature (always placed at offset 510 even if the sector size is >512) */ + return 2; + + if ((LD_DWORD(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146) /* Check "FAT" string */ + return 0; + if ((LD_DWORD(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146) + return 0; + + return 1; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file system object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occurred */ + const TCHAR **path, /* Pointer to pointer to the path name (drive number) */ + FATFS **rfs, /* Pointer to pointer to the found file system object */ + BYTE wmode /* !=0: Check write protection for write access */ +) +{ + BYTE fmt, b, pi, *tbl; + UINT vol; + DSTATUS stat; + DWORD bsect, fasize, tsect, sysect, nclst, szbfat; + WORD nrsv; + const TCHAR *p = *path; + FATFS *fs; + + + /* Get logical drive number from the path name */ + vol = p[0] - '0'; /* Is there a drive number? */ + if (vol <= 9 && p[1] == ':') { /* Found a drive number, get and strip it */ + p += 2; *path = p; /* Return pointer to the path name */ + } else { /* No drive number, use default drive */ +#if _FS_RPATH + vol = CurrVol; /* Use current drive */ +#else + vol = 0; /* Use drive 0 */ +#endif + } + + /* Check if the file system object is valid or not */ + *rfs = 0; + if (vol >= _VOLUMES) /* Is the drive number valid? */ + return FR_INVALID_DRIVE; + fs = FatFs[vol]; /* Get corresponding file system object */ + if (!fs) return FR_NOT_ENABLED; /* Is the file system object available? */ + + ENTER_FF(fs); /* Lock volume */ + + *rfs = fs; /* Return pointer to the corresponding file system object */ + if (fs->fs_type) { /* If the volume has been mounted */ + stat = disk_status(fs->drv); + if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized (has not been changed), */ + if (!_FS_READONLY && wmode && (stat & STA_PROTECT)) /* Check write protection if needed */ + return FR_WRITE_PROTECTED; + return FR_OK; /* The file system object is valid */ + } + } + + /* The file system object is not valid. */ + /* Following code attempts to mount the volume. (analyze BPB and initialize the fs object) */ + + fs->fs_type = 0; /* Clear the file system object */ + fs->drv = LD2PD(vol); /* Bind the logical drive and a physical drive */ + stat = disk_initialize(fs->drv); /* Initialize the physical drive */ + if (stat & STA_NOINIT) /* Check if the initialization succeeded */ + return FR_NOT_READY; /* Failed to initialize due to no medium or hard error */ + if (!_FS_READONLY && wmode && (stat & STA_PROTECT)) /* Check disk write protection if needed */ + return FR_WRITE_PROTECTED; +#if _MAX_SS != 512 /* Get disk sector size (variable sector size cfg only) */ + if (disk_ioctl(fs->drv, GET_SECTOR_SIZE, &fs->ssize) != RES_OK) + return FR_DISK_ERR; +#endif + /* Search FAT partition on the drive. Supports only generic partitions, FDISK and SFD. */ + fmt = check_fs(fs, bsect = 0); /* Load sector 0 and check if it is an FAT-VBR (in SFD) */ + if (LD2PT(vol) && !fmt) fmt = 1; /* Force non-SFD if the volume is forced partition */ + if (fmt == 1) { /* Not an FAT-VBR, the physical drive can be partitioned */ + /* Check the partition listed in the partition table */ + pi = LD2PT(vol); + if (pi) pi--; + tbl = &fs->win[MBR_Table + pi * SZ_PTE];/* Partition table */ + if (tbl[4]) { /* Is the partition existing? */ + bsect = LD_DWORD(&tbl[8]); /* Partition offset in LBA */ + fmt = check_fs(fs, bsect); /* Check the partition */ + } + } + if (fmt == 3) return FR_DISK_ERR; + if (fmt) return FR_NO_FILESYSTEM; /* No FAT volume is found */ + + /* An FAT volume is found. Following code initializes the file system object */ + + if (LD_WORD(fs->win+BPB_BytsPerSec) != SS(fs)) /* (BPB_BytsPerSec must be equal to the physical sector size) */ + return FR_NO_FILESYSTEM; + + fasize = LD_WORD(fs->win+BPB_FATSz16); /* Number of sectors per FAT */ + if (!fasize) fasize = LD_DWORD(fs->win+BPB_FATSz32); + fs->fsize = fasize; + + fs->n_fats = b = fs->win[BPB_NumFATs]; /* Number of FAT copies */ + if (b != 1 && b != 2) return FR_NO_FILESYSTEM; /* (Must be 1 or 2) */ + fasize *= b; /* Number of sectors for FAT area */ + + fs->csize = b = fs->win[BPB_SecPerClus]; /* Number of sectors per cluster */ + if (!b || (b & (b - 1))) return FR_NO_FILESYSTEM; /* (Must be power of 2) */ + + fs->n_rootdir = LD_WORD(fs->win+BPB_RootEntCnt); /* Number of root directory entries */ + if (fs->n_rootdir % (SS(fs) / SZ_DIR)) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be sector aligned) */ + + tsect = LD_WORD(fs->win+BPB_TotSec16); /* Number of sectors on the volume */ + if (!tsect) tsect = LD_DWORD(fs->win+BPB_TotSec32); + + nrsv = LD_WORD(fs->win+BPB_RsvdSecCnt); /* Number of reserved sectors */ + if (!nrsv) return FR_NO_FILESYSTEM; /* (BPB_RsvdSecCnt must not be 0) */ + + /* Determine the FAT sub type */ + sysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZ_DIR); /* RSV+FAT+DIR */ + if (tsect < sysect) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + nclst = (tsect - sysect) / fs->csize; /* Number of clusters */ + if (!nclst) return FR_NO_FILESYSTEM; /* (Invalid volume size) */ + fmt = FS_FAT12; + if (nclst >= MIN_FAT16) fmt = FS_FAT16; + if (nclst >= MIN_FAT32) fmt = FS_FAT32; + + /* Boundaries and Limits */ + fs->n_fatent = nclst + 2; /* Number of FAT entries */ + fs->volbase = bsect; /* Volume start sector */ + fs->fatbase = bsect + nrsv; /* FAT start sector */ + fs->database = bsect + sysect; /* Data start sector */ + if (fmt == FS_FAT32) { + if (fs->n_rootdir) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must be 0) */ + fs->dirbase = LD_DWORD(fs->win+BPB_RootClus); /* Root directory start cluster */ + szbfat = fs->n_fatent * 4; /* (Required FAT size) */ + } else { + if (!fs->n_rootdir) return FR_NO_FILESYSTEM; /* (BPB_RootEntCnt must not be 0) */ + fs->dirbase = fs->fatbase + fasize; /* Root directory start sector */ + szbfat = (fmt == FS_FAT16) ? /* (Required FAT size) */ + fs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1); + } + if (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) /* (BPB_FATSz must not be less than required) */ + return FR_NO_FILESYSTEM; + +#if !_FS_READONLY + /* Initialize cluster allocation information */ + fs->free_clust = 0xFFFFFFFF; + fs->last_clust = 0; + + /* Get fsinfo if available */ + if (fmt == FS_FAT32) { + fs->fsi_flag = 0; + fs->fsi_sector = bsect + LD_WORD(fs->win+BPB_FSInfo); + if (disk_read(fs->drv, fs->win, fs->fsi_sector, 1) == RES_OK && + LD_WORD(fs->win+BS_55AA) == 0xAA55 && + LD_DWORD(fs->win+FSI_LeadSig) == 0x41615252 && + LD_DWORD(fs->win+FSI_StrucSig) == 0x61417272) { + fs->last_clust = LD_DWORD(fs->win+FSI_Nxt_Free); + fs->free_clust = LD_DWORD(fs->win+FSI_Free_Count); + } + } +#endif + fs->fs_type = fmt; /* FAT sub-type */ + fs->id = ++Fsid; /* File system mount ID */ + fs->winsect = 0; /* Invalidate sector cache */ + fs->wflag = 0; +#if _FS_RPATH + fs->cdir = 0; /* Current directory (root dir) */ +#endif +#if _FS_LOCK /* Clear file lock semaphores */ + clear_lock(fs); +#endif + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file/dir object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT validate ( /* FR_OK(0): The object is valid, !=0: Invalid */ + void* obj /* Pointer to the object FIL/DIR to check validity */ +) +{ + FIL *fil = (FIL*)obj; /* Assuming offset of fs and id in the FIL/DIR is identical */ + + + if (!fil || !fil->fs || !fil->fs->fs_type || fil->fs->id != fil->id) + return FR_INVALID_OBJECT; + + ENTER_FF(fil->fs); /* Lock file system */ + + if (disk_status(fil->fs->drv) & STA_NOINIT) + return FR_NOT_READY; + + return FR_OK; +} + + + + +/*-------------------------------------------------------------------------- + + Public Functions + +--------------------------------------------------------------------------*/ + + + +/*-----------------------------------------------------------------------*/ +/* Mount/Unmount a Logical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mount ( + BYTE vol, /* Logical drive number to be mounted/unmounted */ + FATFS *fs /* Pointer to new file system object (NULL for unmount)*/ +) +{ + FATFS *rfs; + + + if (vol >= _VOLUMES) /* Check if the drive number is valid */ + return FR_INVALID_DRIVE; + rfs = FatFs[vol]; /* Get current fs object */ + + if (rfs) { +#if _FS_LOCK + clear_lock(rfs); +#endif +#if _FS_REENTRANT /* Discard sync object of the current volume */ + if (!ff_del_syncobj(rfs->sobj)) return FR_INT_ERR; +#endif + rfs->fs_type = 0; /* Clear old fs object */ + } + + if (fs) { + fs->fs_type = 0; /* Clear new fs object */ +#if _FS_REENTRANT /* Create sync object for the new volume */ + if (!ff_cre_syncobj(vol, &fs->sobj)) return FR_INT_ERR; +#endif + } + FatFs[vol] = fs; /* Register new fs object */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Open or Create a File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_open ( + FIL *fp, /* Pointer to the blank file object */ + const TCHAR *path, /* Pointer to the file name */ + BYTE mode /* Access mode and file open mode flags */ +) +{ + FRESULT res; + DIR dj; + BYTE *dir; + DEF_NAMEBUF; + + + if (!fp) return FR_INVALID_OBJECT; + fp->fs = 0; /* Clear file object */ + +#if !_FS_READONLY + mode &= FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW; + res = chk_mounted(&path, &dj.fs, (BYTE)(mode & ~FA_READ)); +#else + mode &= FA_READ; + res = chk_mounted(&path, &dj.fs, 0); +#endif + if (res == FR_OK) { + INIT_BUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + dir = dj.dir; +#if !_FS_READONLY /* R/W configuration */ + if (res == FR_OK) { + if (!dir) /* Current dir itself */ + res = FR_INVALID_NAME; +#if _FS_LOCK + else + res = chk_lock(&dj, (mode & ~FA_READ) ? 1 : 0); +#endif + } + /* Create or Open a file */ + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + DWORD dw, cl; + + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) /* There is no file to open, create a new entry */ +#if _FS_LOCK + res = enq_lock() ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES; +#else + res = dir_register(&dj); +#endif + mode |= FA_CREATE_ALWAYS; /* File is created */ + dir = dj.dir; /* New entry */ + } + else { /* Any object is already existing */ + if (dir[DIR_Attr] & (AM_RDO | AM_DIR)) { /* Cannot overwrite it (R/O or DIR) */ + res = FR_DENIED; + } else { + if (mode & FA_CREATE_NEW) /* Cannot create as new file */ + res = FR_EXIST; + } + } + if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) { /* Truncate it if overwrite mode */ + dw = get_fattime(); /* Created time */ + ST_DWORD(dir+DIR_CrtTime, dw); + dir[DIR_Attr] = 0; /* Reset attribute */ + ST_DWORD(dir+DIR_FileSize, 0); /* size = 0 */ + cl = ld_clust(dj.fs, dir); /* Get start cluster */ + st_clust(dir, 0); /* cluster = 0 */ + dj.fs->wflag = 1; + if (cl) { /* Remove the cluster chain if exist */ + dw = dj.fs->winsect; + res = remove_chain(dj.fs, cl); + if (res == FR_OK) { + dj.fs->last_clust = cl - 1; /* Reuse the cluster hole */ + res = move_window(dj.fs, dw); + } + } + } + } + else { /* Open an existing file */ + if (res == FR_OK) { /* Follow succeeded */ + if (dir[DIR_Attr] & AM_DIR) { /* It is a directory */ + res = FR_NO_FILE; + } else { + if ((mode & FA_WRITE) && (dir[DIR_Attr] & AM_RDO)) /* R/O violation */ + res = FR_DENIED; + } + } + } + if (res == FR_OK) { + if (mode & FA_CREATE_ALWAYS) /* Set file change flag if created or overwritten */ + mode |= FA__WRITTEN; + fp->dir_sect = dj.fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dir; +#if _FS_LOCK + fp->lockid = inc_lock(&dj, (mode & ~FA_READ) ? 1 : 0); + if (!fp->lockid) res = FR_INT_ERR; +#endif + } + +#else /* R/O configuration */ + if (res == FR_OK) { /* Follow succeeded */ + dir = dj.dir; + if (!dir) { /* Current dir itself */ + res = FR_INVALID_NAME; + } else { + if (dir[DIR_Attr] & AM_DIR) /* It is a directory */ + res = FR_NO_FILE; + } + } +#endif + FREE_BUF(); + + if (res == FR_OK) { + fp->flag = mode; /* File access mode */ + fp->sclust = ld_clust(dj.fs, dir); /* File start cluster */ + fp->fsize = LD_DWORD(dir+DIR_FileSize); /* File size */ + fp->fptr = 0; /* File pointer */ + fp->dsect = 0; +#if _USE_FASTSEEK + fp->cltbl = 0; /* Normal seek mode */ +#endif + fp->fs = dj.fs; fp->id = dj.fs->id; /* Validate file object */ + } + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_read ( + FIL *fp, /* Pointer to the file object */ + void *buff, /* Pointer to data buffer */ + UINT btr, /* Number of bytes to read */ + UINT *br /* Pointer to number of bytes read */ +) +{ + FRESULT res; + DWORD clst, sect, remain; + UINT rcnt, cc; + BYTE csect, *rbuff = (BYTE*)buff; + + + *br = 0; /* Clear read byte counter */ + + res = validate(fp); /* Check validity */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Aborted file? */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_READ)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + remain = fp->fsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr; /* Repeat until all data read */ + rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + csect = (BYTE)(fp->fptr / SS(fp->fs) & (fp->fs->csize - 1)); /* Sector offset in the cluster */ + if (!csect) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->sclust; /* Follow from the origin */ + } else { /* Middle or end of the file */ +#if _USE_FASTSEEK + if (fp->cltbl) + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + else +#endif + clst = get_fat(fp->fs, fp->clust); /* Follow cluster chain on the FAT */ + } + if (clst < 2) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + sect = clust2sect(fp->fs, fp->clust); /* Get current sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += csect; + cc = btr / SS(fp->fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Read maximum contiguous sectors directly */ + if (csect + cc > fp->fs->csize) /* Clip at cluster boundary */ + cc = fp->fs->csize - csect; + if (disk_read(fp->fs->drv, rbuff, sect, (BYTE)cc) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#if !_FS_READONLY && _FS_MINIMIZE <= 2 /* Replace one of the read sectors with cached data if it contains a dirty sector */ +#if _FS_TINY + if (fp->fs->wflag && fp->fs->winsect - sect < cc) + mem_cpy(rbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), fp->fs->win, SS(fp->fs)); +#else + if ((fp->flag & FA__DIRTY) && fp->dsect - sect < cc) + mem_cpy(rbuff + ((fp->dsect - sect) * SS(fp->fs)), fp->buf, SS(fp->fs)); +#endif +#endif + rcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ + continue; + } +#if !_FS_TINY + if (fp->dsect != sect) { /* Load data sector if not in cache */ +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + if (disk_read(fp->fs->drv, fp->buf, sect, 1) != RES_OK) /* Fill sector cache */ + ABORT(fp->fs, FR_DISK_ERR); + } +#endif + fp->dsect = sect; + } + rcnt = SS(fp->fs) - ((UINT)fp->fptr % SS(fp->fs)); /* Get partial sector data from sector buffer */ + if (rcnt > btr) rcnt = btr; +#if _FS_TINY + if (move_window(fp->fs, fp->dsect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + mem_cpy(rbuff, &fp->fs->win[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ +#else + mem_cpy(rbuff, &fp->buf[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ +#endif + } + + LEAVE_FF(fp->fs, FR_OK); +} + + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Write File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_write ( + FIL *fp, /* Pointer to the file object */ + const void *buff, /* Pointer to the data to be written */ + UINT btw, /* Number of bytes to write */ + UINT *bw /* Pointer to number of bytes written */ +) +{ + FRESULT res; + DWORD clst, sect; + UINT wcnt, cc; + const BYTE *wbuff = (const BYTE*)buff; + BYTE csect; + + + *bw = 0; /* Clear write byte counter */ + + res = validate(fp); /* Check validity */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Aborted file? */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_WRITE)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + if ((DWORD)(fp->fsize + btw) < fp->fsize) btw = 0; /* File size cannot reach 4GB */ + + for ( ; btw; /* Repeat until all data written */ + wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + csect = (BYTE)(fp->fptr / SS(fp->fs) & (fp->fs->csize - 1)); /* Sector offset in the cluster */ + if (!csect) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->sclust; /* Follow from the origin */ + if (clst == 0) /* When no cluster is allocated, */ + fp->sclust = clst = create_chain(fp->fs, 0); /* Create a new cluster chain */ + } else { /* Middle or end of the file */ +#if _USE_FASTSEEK + if (fp->cltbl) + clst = clmt_clust(fp, fp->fptr); /* Get cluster# from the CLMT */ + else +#endif + clst = create_chain(fp->fs, fp->clust); /* Follow or stretch cluster chain on the FAT */ + } + if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ + if (clst == 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } +#if _FS_TINY + if (fp->fs->winsect == fp->dsect && sync_window(fp->fs)) /* Write-back sector cache */ + ABORT(fp->fs, FR_DISK_ERR); +#else + if (fp->flag & FA__DIRTY) { /* Write-back sector cache */ + if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + sect = clust2sect(fp->fs, fp->clust); /* Get current sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += csect; + cc = btw / SS(fp->fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Write maximum contiguous sectors directly */ + if (csect + cc > fp->fs->csize) /* Clip at cluster boundary */ + cc = fp->fs->csize - csect; + if (disk_write(fp->fs->drv, wbuff, sect, (BYTE)cc) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#if _FS_TINY + if (fp->fs->winsect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fp->fs->win, wbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), SS(fp->fs)); + fp->fs->wflag = 0; + } +#else + if (fp->dsect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */ + mem_cpy(fp->buf, wbuff + ((fp->dsect - sect) * SS(fp->fs)), SS(fp->fs)); + fp->flag &= ~FA__DIRTY; + } +#endif + wcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ + continue; + } +#if _FS_TINY + if (fp->fptr >= fp->fsize) { /* Avoid silly cache filling at growing edge */ + if (sync_window(fp->fs)) ABORT(fp->fs, FR_DISK_ERR); + fp->fs->winsect = sect; + } +#else + if (fp->dsect != sect) { /* Fill sector cache with file data */ + if (fp->fptr < fp->fsize && + disk_read(fp->fs->drv, fp->buf, sect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + } +#endif + fp->dsect = sect; + } + wcnt = SS(fp->fs) - ((UINT)fp->fptr % SS(fp->fs));/* Put partial sector into file I/O buffer */ + if (wcnt > btw) wcnt = btw; +#if _FS_TINY + if (move_window(fp->fs, fp->dsect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + mem_cpy(&fp->fs->win[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ + fp->fs->wflag = 1; +#else + mem_cpy(&fp->buf[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ + fp->flag |= FA__DIRTY; +#endif + } + + if (fp->fptr > fp->fsize) fp->fsize = fp->fptr; /* Update file size if needed */ + fp->flag |= FA__WRITTEN; /* Set file change flag */ + + LEAVE_FF(fp->fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize the File Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_sync ( + FIL *fp /* Pointer to the file object */ +) +{ + FRESULT res; + DWORD tm; + BYTE *dir; + + + res = validate(fp); /* Check validity of the object */ + if (res == FR_OK) { + if (fp->flag & FA__WRITTEN) { /* Has the file been written? */ +#if !_FS_TINY /* Write-back dirty buffer */ + if (fp->flag & FA__DIRTY) { + if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) + LEAVE_FF(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + /* Update the directory entry */ + res = move_window(fp->fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ + ST_DWORD(dir+DIR_FileSize, fp->fsize); /* Update file size */ + st_clust(dir, fp->sclust); /* Update start cluster */ + tm = get_fattime(); /* Update updated time */ + ST_DWORD(dir+DIR_WrtTime, tm); + ST_WORD(dir+DIR_LstAccDate, 0); + fp->flag &= ~FA__WRITTEN; + fp->fs->wflag = 1; + res = sync_fs(fp->fs); + } + } + } + + LEAVE_FF(fp->fs, res); +} + +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Close File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_close ( + FIL *fp /* Pointer to the file object to be closed */ +) +{ + FRESULT res; + + +#if _FS_READONLY + res = validate(fp); + { +#if _FS_REENTRANT + FATFS *fs = fp->fs; +#endif + if (res == FR_OK) fp->fs = 0; /* Discard file object */ + LEAVE_FF(fs, res); + } +#else + res = f_sync(fp); /* Flush cached data */ +#if _FS_LOCK + if (res == FR_OK) { /* Decrement open counter */ +#if _FS_REENTRANT + FATFS *fs = fp->fs;; + res = validate(fp); + if (res == FR_OK) { + res = dec_lock(fp->lockid); + unlock_fs(fs, FR_OK); + } +#else + res = dec_lock(fp->lockid); +#endif + } +#endif + if (res == FR_OK) fp->fs = 0; /* Discard file object */ + return res; +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Current Drive/Directory Handlings */ +/*-----------------------------------------------------------------------*/ + +#if _FS_RPATH >= 1 + +FRESULT f_chdrive ( + BYTE drv /* Drive number */ +) +{ + if (drv >= _VOLUMES) return FR_INVALID_DRIVE; + + CurrVol = drv; + + return FR_OK; +} + + + +FRESULT f_chdir ( + const TCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + DEF_NAMEBUF; + + + res = chk_mounted(&path, &dj.fs, 0); + if (res == FR_OK) { + INIT_BUF(dj); + res = follow_path(&dj, path); /* Follow the path */ + FREE_BUF(); + if (res == FR_OK) { /* Follow completed */ + if (!dj.dir) { + dj.fs->cdir = dj.sclust; /* Start directory itself */ + } else { + if (dj.dir[DIR_Attr] & AM_DIR) /* Reached to the directory */ + dj.fs->cdir = ld_clust(dj.fs, dj.dir); + else + res = FR_NO_PATH; /* Reached but a file */ + } + } + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + + LEAVE_FF(dj.fs, res); +} + + +#if _FS_RPATH >= 2 +FRESULT f_getcwd ( + TCHAR *buff, /* Pointer to the directory path */ + UINT len /* Size of path */ +) +{ + FRESULT res; + DIR dj; + UINT i, n; + DWORD ccl; + TCHAR *tp; + FILINFO fno; + DEF_NAMEBUF; + + + *buff = 0; + res = chk_mounted((const TCHAR**)&buff, &dj.fs, 0); /* Get current volume */ + if (res == FR_OK) { + INIT_BUF(dj); + i = len; /* Bottom of buffer (dir stack base) */ + dj.sclust = dj.fs->cdir; /* Start to follow upper dir from current dir */ + while ((ccl = dj.sclust) != 0) { /* Repeat while current dir is a sub-dir */ + res = dir_sdi(&dj, 1); /* Get parent dir */ + if (res != FR_OK) break; + res = dir_read(&dj, 0); + if (res != FR_OK) break; + dj.sclust = ld_clust(dj.fs, dj.dir); /* Goto parent dir */ + res = dir_sdi(&dj, 0); + if (res != FR_OK) break; + do { /* Find the entry links to the child dir */ + res = dir_read(&dj, 0); + if (res != FR_OK) break; + if (ccl == ld_clust(dj.fs, dj.dir)) break; /* Found the entry */ + res = dir_next(&dj, 0); + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR;/* It cannot be 'not found'. */ + if (res != FR_OK) break; +#if _USE_LFN + fno.lfname = buff; + fno.lfsize = i; +#endif + get_fileinfo(&dj, &fno); /* Get the dir name and push it to the buffer */ + tp = fno.fname; + if (_USE_LFN && *buff) tp = buff; + for (n = 0; tp[n]; n++) ; + if (i < n + 3) { + res = FR_NOT_ENOUGH_CORE; break; + } + while (n) buff[--i] = tp[--n]; + buff[--i] = '/'; + } + tp = buff; + if (res == FR_OK) { + *tp++ = '0' + CurrVol; /* Put drive number */ + *tp++ = ':'; + if (i == len) { /* Root-dir */ + *tp++ = '/'; + } else { /* Sub-dir */ + do /* Add stacked path str */ + *tp++ = buff[i++]; + while (i < len); + } + } + *tp = 0; + FREE_BUF(); + } + + LEAVE_FF(dj.fs, res); +} +#endif /* _FS_RPATH >= 2 */ +#endif /* _FS_RPATH >= 1 */ + + + +#if _FS_MINIMIZE <= 2 +/*-----------------------------------------------------------------------*/ +/* Seek File R/W Pointer */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_lseek ( + FIL *fp, /* Pointer to the file object */ + DWORD ofs /* File pointer from top of file */ +) +{ + FRESULT res; + + + res = validate(fp); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + +#if _USE_FASTSEEK + if (fp->cltbl) { /* Fast seek */ + DWORD cl, pcl, ncl, tcl, dsc, tlen, ulen, *tbl; + + if (ofs == CREATE_LINKMAP) { /* Create CLMT */ + tbl = fp->cltbl; + tlen = *tbl++; ulen = 2; /* Given table size and required table size */ + cl = fp->sclust; /* Top of the chain */ + if (cl) { + do { + /* Get a fragment */ + tcl = cl; ncl = 0; ulen += 2; /* Top, length and used items */ + do { + pcl = cl; ncl++; + cl = get_fat(fp->fs, cl); + if (cl <= 1) ABORT(fp->fs, FR_INT_ERR); + if (cl == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + } while (cl == pcl + 1); + if (ulen <= tlen) { /* Store the length and top of the fragment */ + *tbl++ = ncl; *tbl++ = tcl; + } + } while (cl < fp->fs->n_fatent); /* Repeat until end of chain */ + } + *fp->cltbl = ulen; /* Number of items used */ + if (ulen <= tlen) + *tbl = 0; /* Terminate table */ + else + res = FR_NOT_ENOUGH_CORE; /* Given table size is smaller than required */ + + } else { /* Fast seek */ + if (ofs > fp->fsize) /* Clip offset at the file size */ + ofs = fp->fsize; + fp->fptr = ofs; /* Set file pointer */ + if (ofs) { + fp->clust = clmt_clust(fp, ofs - 1); + dsc = clust2sect(fp->fs, fp->clust); + if (!dsc) ABORT(fp->fs, FR_INT_ERR); + dsc += (ofs - 1) / SS(fp->fs) & (fp->fs->csize - 1); + if (fp->fptr % SS(fp->fs) && dsc != fp->dsect) { /* Refill sector cache if needed */ +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + if (disk_read(fp->fs->drv, fp->buf, dsc, 1) != RES_OK) /* Load current sector */ + ABORT(fp->fs, FR_DISK_ERR); +#endif + fp->dsect = dsc; + } + } + } + } else +#endif + + /* Normal Seek */ + { + DWORD clst, bcs, nsect, ifptr; + + if (ofs > fp->fsize /* In read-only mode, clip offset with the file size */ +#if !_FS_READONLY + && !(fp->flag & FA_WRITE) +#endif + ) ofs = fp->fsize; + + ifptr = fp->fptr; + fp->fptr = nsect = 0; + if (ofs) { + bcs = (DWORD)fp->fs->csize * SS(fp->fs); /* Cluster size (byte) */ + if (ifptr > 0 && + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + fp->fptr = (ifptr - 1) & ~(bcs - 1); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->clust; + } else { /* When seek to back cluster, */ + clst = fp->sclust; /* start from the first cluster */ +#if !_FS_READONLY + if (clst == 0) { /* If no cluster chain, create a new chain */ + clst = create_chain(fp->fs, 0); + if (clst == 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->sclust = clst; + } +#endif + fp->clust = clst; + } + if (clst != 0) { + while (ofs > bcs) { /* Cluster following loop */ +#if !_FS_READONLY + if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ + clst = create_chain(fp->fs, clst); /* Force stretch if in write mode */ + if (clst == 0) { /* When disk gets full, clip file size */ + ofs = bcs; break; + } + } else +#endif + clst = get_fat(fp->fs, clst); /* Follow cluster chain if not in write mode */ + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + if (clst <= 1 || clst >= fp->fs->n_fatent) ABORT(fp->fs, FR_INT_ERR); + fp->clust = clst; + fp->fptr += bcs; + ofs -= bcs; + } + fp->fptr += ofs; + if (ofs % SS(fp->fs)) { + nsect = clust2sect(fp->fs, clst); /* Current sector */ + if (!nsect) ABORT(fp->fs, FR_INT_ERR); + nsect += ofs / SS(fp->fs); + } + } + } + if (fp->fptr % SS(fp->fs) && nsect != fp->dsect) { /* Fill sector cache if needed */ +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Write-back dirty sector cache */ + if (disk_write(fp->fs->drv, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + if (disk_read(fp->fs->drv, fp->buf, nsect, 1) != RES_OK) /* Fill sector cache */ + ABORT(fp->fs, FR_DISK_ERR); +#endif + fp->dsect = nsect; + } +#if !_FS_READONLY + if (fp->fptr > fp->fsize) { /* Set file change flag if the file size is extended */ + fp->fsize = fp->fptr; + fp->flag |= FA__WRITTEN; + } +#endif + } + + LEAVE_FF(fp->fs, res); +} + + + +#if _FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Create a Directory Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_opendir ( + DIR *dj, /* Pointer to directory object to create */ + const TCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + FATFS *fs; + DEF_NAMEBUF; + + + if (!dj) return FR_INVALID_OBJECT; + + res = chk_mounted(&path, &dj->fs, 0); + fs = dj->fs; + if (res == FR_OK) { + INIT_BUF(*dj); + res = follow_path(dj, path); /* Follow the path to the directory */ + FREE_BUF(); + if (res == FR_OK) { /* Follow completed */ + if (dj->dir) { /* It is not the root dir */ + if (dj->dir[DIR_Attr] & AM_DIR) { /* The object is a directory */ + dj->sclust = ld_clust(fs, dj->dir); + } else { /* The object is not a directory */ + res = FR_NO_PATH; + } + } + if (res == FR_OK) { + dj->id = fs->id; + res = dir_sdi(dj, 0); /* Rewind dir */ + } + } + if (res == FR_NO_FILE) res = FR_NO_PATH; + if (res != FR_OK) dj->fs = 0; /* Invalidate the dir object if function faild */ + } else { + dj->fs = 0; + } + + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read Directory Entry in Sequence */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_readdir ( + DIR *dj, /* Pointer to the open directory object */ + FILINFO *fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DEF_NAMEBUF; + + + res = validate(dj); /* Check validity of the object */ + if (res == FR_OK) { + if (!fno) { + res = dir_sdi(dj, 0); /* Rewind the directory object */ + } else { + INIT_BUF(*dj); + res = dir_read(dj, 0); /* Read an item */ + if (res == FR_NO_FILE) { /* Reached end of dir */ + dj->sect = 0; + res = FR_OK; + } + if (res == FR_OK) { /* A valid entry is found */ + get_fileinfo(dj, fno); /* Get the object information */ + res = dir_next(dj, 0); /* Increment index for next */ + if (res == FR_NO_FILE) { + dj->sect = 0; + res = FR_OK; + } + } + FREE_BUF(); + } + } + + LEAVE_FF(dj->fs, res); +} + + + +#if _FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Get File Status */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_stat ( + const TCHAR *path, /* Pointer to the file path */ + FILINFO *fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DIR dj; + DEF_NAMEBUF; + + + res = chk_mounted(&path, &dj.fs, 0); + if (res == FR_OK) { + INIT_BUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.dir) /* Found an object */ + get_fileinfo(&dj, fno); + else /* It is root dir */ + res = FR_INVALID_NAME; + } + FREE_BUF(); + } + + LEAVE_FF(dj.fs, res); +} + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Get Number of Free Clusters */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getfree ( + const TCHAR *path, /* Path name of the logical drive number */ + DWORD *nclst, /* Pointer to a variable to return number of free clusters */ + FATFS **fatfs /* Pointer to return pointer to corresponding file system object */ +) +{ + FRESULT res; + FATFS *fs; + DWORD n, clst, sect, stat; + UINT i; + BYTE fat, *p; + + + /* Get drive number */ + res = chk_mounted(&path, fatfs, 0); + fs = *fatfs; + if (res == FR_OK) { + /* If free_clust is valid, return it without full cluster scan */ + if (fs->free_clust <= fs->n_fatent - 2) { + *nclst = fs->free_clust; + } else { + /* Get number of free clusters */ + fat = fs->fs_type; + n = 0; + if (fat == FS_FAT12) { + clst = 2; + do { + stat = get_fat(fs, clst); + if (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } + if (stat == 1) { res = FR_INT_ERR; break; } + if (stat == 0) n++; + } while (++clst < fs->n_fatent); + } else { + clst = fs->n_fatent; + sect = fs->fatbase; + i = 0; p = 0; + do { + if (!i) { + res = move_window(fs, sect++); + if (res != FR_OK) break; + p = fs->win; + i = SS(fs); + } + if (fat == FS_FAT16) { + if (LD_WORD(p) == 0) n++; + p += 2; i -= 2; + } else { + if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) n++; + p += 4; i -= 4; + } + } while (--clst); + } + fs->free_clust = n; + if (fat == FS_FAT32) fs->fsi_flag = 1; + *nclst = n; + } + } + LEAVE_FF(fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Truncate File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_truncate ( + FIL *fp /* Pointer to the file object */ +) +{ + FRESULT res; + DWORD ncl; + + + res = validate(fp); /* Check validity of the object */ + if (res == FR_OK) { + if (fp->flag & FA__ERROR) { /* Check abort flag */ + res = FR_INT_ERR; + } else { + if (!(fp->flag & FA_WRITE)) /* Check access mode */ + res = FR_DENIED; + } + } + if (res == FR_OK) { + if (fp->fsize > fp->fptr) { + fp->fsize = fp->fptr; /* Set file size to current R/W point */ + fp->flag |= FA__WRITTEN; + if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain(fp->fs, fp->sclust); + fp->sclust = 0; + } else { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_fat(fp->fs, fp->clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (ncl == 1) res = FR_INT_ERR; + if (res == FR_OK && ncl < fp->fs->n_fatent) { + res = put_fat(fp->fs, fp->clust, 0x0FFFFFFF); + if (res == FR_OK) res = remove_chain(fp->fs, ncl); + } + } + } + if (res != FR_OK) fp->flag |= FA__ERROR; + } + + LEAVE_FF(fp->fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Delete a File or Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_unlink ( + const TCHAR *path /* Pointer to the file or directory path */ +) +{ + FRESULT res; + DIR dj, sdj; + BYTE *dir; + DWORD dclst; + DEF_NAMEBUF; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INIT_BUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; /* Cannot remove dot entry */ +#if _FS_LOCK + if (res == FR_OK) res = chk_lock(&dj, 2); /* Cannot remove open file */ +#endif + if (res == FR_OK) { /* The object is accessible */ + dir = dj.dir; + if (!dir) { + res = FR_INVALID_NAME; /* Cannot remove the start directory */ + } else { + if (dir[DIR_Attr] & AM_RDO) + res = FR_DENIED; /* Cannot remove R/O object */ + } + dclst = ld_clust(dj.fs, dir); + if (res == FR_OK && (dir[DIR_Attr] & AM_DIR)) { /* Is it a sub-dir? */ + if (dclst < 2) { + res = FR_INT_ERR; + } else { + mem_cpy(&sdj, &dj, sizeof (DIR)); /* Check if the sub-dir is empty or not */ + sdj.sclust = dclst; + res = dir_sdi(&sdj, 2); /* Exclude dot entries */ + if (res == FR_OK) { + res = dir_read(&sdj, 0); /* Read an item */ + if (res == FR_OK /* Not empty dir */ +#if _FS_RPATH + || dclst == dj.fs->cdir /* Current dir */ +#endif + ) res = FR_DENIED; + if (res == FR_NO_FILE) res = FR_OK; /* Empty */ + } + } + } + if (res == FR_OK) { + res = dir_remove(&dj); /* Remove the directory entry */ + if (res == FR_OK) { + if (dclst) /* Remove the cluster chain if exist */ + res = remove_chain(dj.fs, dclst); + if (res == FR_OK) res = sync_fs(dj.fs); + } + } + } + FREE_BUF(); + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create a Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkdir ( + const TCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + BYTE *dir, n; + DWORD dsc, dcl, pcl, tm = get_fattime(); + DEF_NAMEBUF; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INIT_BUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) res = FR_EXIST; /* Any object with same name is already existing */ + if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res == FR_NO_FILE) { /* Can create a new directory */ + dcl = create_chain(dj.fs, 0); /* Allocate a cluster for the new directory table */ + res = FR_OK; + if (dcl == 0) res = FR_DENIED; /* No space to allocate a new cluster */ + if (dcl == 1) res = FR_INT_ERR; + if (dcl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) /* Flush FAT */ + res = sync_window(dj.fs); + if (res == FR_OK) { /* Initialize the new directory table */ + dsc = clust2sect(dj.fs, dcl); + dir = dj.fs->win; + mem_set(dir, 0, SS(dj.fs)); + mem_set(dir+DIR_Name, ' ', 11); /* Create "." entry */ + dir[DIR_Name] = '.'; + dir[DIR_Attr] = AM_DIR; + ST_DWORD(dir+DIR_WrtTime, tm); + st_clust(dir, dcl); + mem_cpy(dir+SZ_DIR, dir, SZ_DIR); /* Create ".." entry */ + dir[33] = '.'; pcl = dj.sclust; + if (dj.fs->fs_type == FS_FAT32 && pcl == dj.fs->dirbase) + pcl = 0; + st_clust(dir+SZ_DIR, pcl); + for (n = dj.fs->csize; n; n--) { /* Write dot entries and clear following sectors */ + dj.fs->winsect = dsc++; + dj.fs->wflag = 1; + res = sync_window(dj.fs); + if (res != FR_OK) break; + mem_set(dir, 0, SS(dj.fs)); + } + } + if (res == FR_OK) res = dir_register(&dj); /* Register the object to the directoy */ + if (res != FR_OK) { + remove_chain(dj.fs, dcl); /* Could not register, remove cluster chain */ + } else { + dir = dj.dir; + dir[DIR_Attr] = AM_DIR; /* Attribute */ + ST_DWORD(dir+DIR_WrtTime, tm); /* Created time */ + st_clust(dir, dcl); /* Table start cluster */ + dj.fs->wflag = 1; + res = sync_fs(dj.fs); + } + } + FREE_BUF(); + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Attribute */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chmod ( + const TCHAR *path, /* Pointer to the file path */ + BYTE value, /* Attribute bits */ + BYTE mask /* Attribute mask to change */ +) +{ + FRESULT res; + DIR dj; + BYTE *dir; + DEF_NAMEBUF; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INIT_BUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + FREE_BUF(); + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res == FR_OK) { + dir = dj.dir; + if (!dir) { /* Is it a root directory? */ + res = FR_INVALID_NAME; + } else { /* File or sub directory */ + mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ + dir[DIR_Attr] = (value & mask) | (dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + dj.fs->wflag = 1; + res = sync_fs(dj.fs); + } + } + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Timestamp */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_utime ( + const TCHAR *path, /* Pointer to the file/directory name */ + const FILINFO *fno /* Pointer to the time stamp to be set */ +) +{ + FRESULT res; + DIR dj; + BYTE *dir; + DEF_NAMEBUF; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INIT_BUF(dj); + res = follow_path(&dj, path); /* Follow the file path */ + FREE_BUF(); + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res == FR_OK) { + dir = dj.dir; + if (!dir) { /* Root directory */ + res = FR_INVALID_NAME; + } else { /* File or sub-directory */ + ST_WORD(dir+DIR_WrtTime, fno->ftime); + ST_WORD(dir+DIR_WrtDate, fno->fdate); + dj.fs->wflag = 1; + res = sync_fs(dj.fs); + } + } + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Rename File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_rename ( + const TCHAR *path_old, /* Pointer to the old name */ + const TCHAR *path_new /* Pointer to the new name */ +) +{ + FRESULT res; + DIR djo, djn; + BYTE buf[21], *dir; + DWORD dw; + DEF_NAMEBUF; + + + res = chk_mounted(&path_old, &djo.fs, 1); + if (res == FR_OK) { + djn.fs = djo.fs; + INIT_BUF(djo); + res = follow_path(&djo, path_old); /* Check old object */ + if (_FS_RPATH && res == FR_OK && (djo.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; +#if _FS_LOCK + if (res == FR_OK) res = chk_lock(&djo, 2); +#endif + if (res == FR_OK) { /* Old object is found */ + if (!djo.dir) { /* Is root dir? */ + res = FR_NO_FILE; + } else { + mem_cpy(buf, djo.dir+DIR_Attr, 21); /* Save the object information except for name */ + mem_cpy(&djn, &djo, sizeof (DIR)); /* Check new object */ + res = follow_path(&djn, path_new); + if (res == FR_OK) res = FR_EXIST; /* The new object name is already existing */ + if (res == FR_NO_FILE) { /* Is it a valid path and no name collision? */ +/* Start critical section that any interruption can cause a cross-link */ + res = dir_register(&djn); /* Register the new entry */ + if (res == FR_OK) { + dir = djn.dir; /* Copy object information except for name */ + mem_cpy(dir+13, buf+2, 19); + dir[DIR_Attr] = buf[0] | AM_ARC; + djo.fs->wflag = 1; + if (djo.sclust != djn.sclust && (dir[DIR_Attr] & AM_DIR)) { /* Update .. entry in the directory if needed */ + dw = clust2sect(djo.fs, ld_clust(djo.fs, dir)); + if (!dw) { + res = FR_INT_ERR; + } else { + res = move_window(djo.fs, dw); + dir = djo.fs->win+SZ_DIR; /* .. entry */ + if (res == FR_OK && dir[1] == '.') { + dw = (djo.fs->fs_type == FS_FAT32 && djn.sclust == djo.fs->dirbase) ? 0 : djn.sclust; + st_clust(dir, dw); + djo.fs->wflag = 1; + } + } + } + if (res == FR_OK) { + res = dir_remove(&djo); /* Remove old entry */ + if (res == FR_OK) + res = sync_fs(djo.fs); + } + } +/* End critical section */ + } + } + } + FREE_BUF(); + } + + LEAVE_FF(djo.fs, res); +} + +#endif /* !_FS_READONLY */ +#endif /* _FS_MINIMIZE == 0 */ +#endif /* _FS_MINIMIZE <= 1 */ +#endif /* _FS_MINIMIZE <= 2 */ + + + +#if _USE_LABEL +/*-----------------------------------------------------------------------*/ +/* Get volume label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getlabel ( + const TCHAR* path, /* Path name of the logical drive number */ + TCHAR* label, /* Pointer to a buffer to return the volume label */ + DWORD* sn /* Pointer to a variable to return the volume serial number */ +) +{ + FRESULT res; + DIR dj; + UINT i, j; + + + /* Get logical drive */ + res = chk_mounted(&path, &dj.fs, 0); + + /* Get volume label */ + if (res == FR_OK && label) { + dj.sclust = 0; /* Open root dir */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = dir_read(&dj, 1); /* Get an entry with AM_VOL */ + if (res == FR_OK) { /* A volume label is exist */ +#if _LFN_UNICODE + WCHAR w; + i = j = 0; + do { + w = (i < 11) ? dj.dir[i++] : ' '; + if (IsDBCS1(w) && i < 11 && IsDBCS2(dj.dir[i])) + w = (w << 8) | dj.dir[i++]; + label[j++] = ff_convert(w, 1); + } while (j < 11); +#else + mem_cpy(label, dj.dir, 11); +#endif + j = 11; + do { + label[j] = 0; + if (!j) break; + } while (label[--j] == ' '); + } + if (res == FR_NO_FILE) { /* No label, return nul string */ + label[0] = 0; + res = FR_OK; + } + } + } + + /* Get volume serial number */ + if (res == FR_OK && sn) { + res = move_window(dj.fs, dj.fs->volbase); + if (res == FR_OK) { + i = dj.fs->fs_type == FS_FAT32 ? BS_VolID32 : BS_VolID; + *sn = LD_DWORD(&dj.fs->win[i]); + } + } + + LEAVE_FF(dj.fs, res); +} + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Set volume label */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_setlabel ( + const TCHAR* label /* Pointer to the volume label to set */ +) +{ + FRESULT res; + DIR dj; + BYTE vn[11]; + UINT i, j, sl; + WCHAR w; + DWORD tm; + + + /* Get logical drive */ + res = chk_mounted(&label, &dj.fs, 1); + if (res) LEAVE_FF(dj.fs, res); + + /* Create a volume label in directory form */ + vn[0] = 0; + for (sl = 0; label[sl]; sl++) ; /* Get name length */ + for ( ; sl && label[sl-1] == ' '; sl--) ; /* Remove trailing spaces */ + if (sl) { /* Create volume label in directory form */ + i = j = 0; + do { +#if _LFN_UNICODE + w = ff_convert(ff_wtoupper(label[i++]), 0); +#else + w = (BYTE)label[i++]; + if (IsDBCS1(w)) + w = (j < 10 && i < sl && IsDBCS2(label[i])) ? (w << 8) | (BYTE)label[i++] : 0; +#if _USE_LFN + w = ff_convert(ff_wtoupper(ff_convert(w, 1)), 0); +#else + if (IsLower(w)) w -= 0x20; /* To upper ASCII chars */ +#ifdef _EXCVT + if (w >= 0x80) w = ExCvt[w - 0x80]; /* To upper extended chars (SBCS cfg) */ +#else + if (!_DF1S && w >= 0x80) w = 0; /* Reject extended chars (ASCII cfg) */ +#endif +#endif +#endif + if (!w || chk_chr("\"*+,.:;<=>\?[]|\x7F", w) || j >= (UINT)((w >= 0x100) ? 10 : 11)) /* Reject invalid chars for volume label */ + LEAVE_FF(dj.fs, FR_INVALID_NAME); + if (w >= 0x100) vn[j++] = (BYTE)(w >> 8); + vn[j++] = (BYTE)w; + } while (i < sl); + while (j < 11) vn[j++] = ' '; + } + + /* Set volume label */ + dj.sclust = 0; /* Open root dir */ + res = dir_sdi(&dj, 0); + if (res == FR_OK) { + res = dir_read(&dj, 1); /* Get an entry with AM_VOL */ + if (res == FR_OK) { /* A volume label is found */ + if (vn[0]) { + mem_cpy(dj.dir, vn, 11); /* Change the volume label name */ + tm = get_fattime(); + ST_DWORD(dj.dir+DIR_WrtTime, tm); + } else { + dj.dir[0] = DDE; /* Remove the volume label */ + } + dj.fs->wflag = 1; + res = sync_fs(dj.fs); + } else { /* No volume label is found or error */ + if (res == FR_NO_FILE) { + res = FR_OK; + if (vn[0]) { /* Create volume label as new */ + res = dir_alloc(&dj, 1); /* Allocate an entry for volume label */ + if (res == FR_OK) { + mem_set(dj.dir, 0, SZ_DIR); /* Set volume label */ + mem_cpy(dj.dir, vn, 11); + dj.dir[DIR_Attr] = AM_VOL; + tm = get_fattime(); + ST_DWORD(dj.dir+DIR_WrtTime, tm); + dj.fs->wflag = 1; + res = sync_fs(dj.fs); + } + } + } + } + } + + LEAVE_FF(dj.fs, res); +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_LABEL */ + + + +/*-----------------------------------------------------------------------*/ +/* Forward data to the stream directly (available on only tiny cfg) */ +/*-----------------------------------------------------------------------*/ +#if _USE_FORWARD && _FS_TINY + +FRESULT f_forward ( + FIL *fp, /* Pointer to the file object */ + UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ + UINT btf, /* Number of bytes to forward */ + UINT *bf /* Pointer to number of bytes forwarded */ +) +{ + FRESULT res; + DWORD remain, clst, sect; + UINT rcnt; + BYTE csect; + + + *bf = 0; /* Clear transfer byte counter */ + + res = validate(fp); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check error flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_READ)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + + remain = fp->fsize - fp->fptr; + if (btf > remain) btf = (UINT)remain; /* Truncate btf by remaining bytes */ + + for ( ; btf && (*func)(0, 0); /* Repeat until all data transferred or stream becomes busy */ + fp->fptr += rcnt, *bf += rcnt, btf -= rcnt) { + csect = (BYTE)(fp->fptr / SS(fp->fs) & (fp->fs->csize - 1)); /* Sector offset in the cluster */ + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (!csect) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->sclust : get_fat(fp->fs, fp->clust); + if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->clust = clst; /* Update current cluster */ + } + } + sect = clust2sect(fp->fs, fp->clust); /* Get current data sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += csect; + if (move_window(fp->fs, sect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + fp->dsect = sect; + rcnt = SS(fp->fs) - (WORD)(fp->fptr % SS(fp->fs)); /* Forward data from sector window */ + if (rcnt > btf) rcnt = btf; + rcnt = (*func)(&fp->fs->win[(WORD)fp->fptr % SS(fp->fs)], rcnt); + if (!rcnt) ABORT(fp->fs, FR_INT_ERR); + } + + LEAVE_FF(fp->fs, FR_OK); +} +#endif /* _USE_FORWARD */ + + + +#if _USE_MKFS && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Create File System on the Drive */ +/*-----------------------------------------------------------------------*/ +#define N_ROOTDIR 512 /* Number of root dir entries for FAT12/16 */ +#define N_FATS 1 /* Number of FAT copies (1 or 2) */ + + +FRESULT f_mkfs ( + BYTE vol, /* Logical drive number */ + BYTE sfd, /* Partitioning rule 0:FDISK, 1:SFD */ + UINT au /* Allocation unit size [bytes] */ +) +{ + static const WORD vst[] = { 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 0}; + static const WORD cst[] = {32768, 16384, 8192, 4096, 2048, 16384, 8192, 4096, 2048, 1024, 512}; + BYTE fmt, md, sys, *tbl, pdrv, part; + DWORD n_clst, vs, n, wsect; + UINT i; + DWORD b_vol, b_fat, b_dir, b_data; /* LBA */ + DWORD n_vol, n_rsv, n_fat, n_dir; /* Size */ + FATFS *fs; + DSTATUS stat; + + + /* Check mounted drive and clear work area */ + if (vol >= _VOLUMES) return FR_INVALID_DRIVE; + if (sfd > 1) return FR_INVALID_PARAMETER; + if (au & (au - 1)) return FR_INVALID_PARAMETER; + fs = FatFs[vol]; + if (!fs) return FR_NOT_ENABLED; + fs->fs_type = 0; + pdrv = LD2PD(vol); /* Physical drive */ + part = LD2PT(vol); /* Partition (0:auto detect, 1-4:get from partition table)*/ + + /* Get disk statics */ + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; +#if _MAX_SS != 512 /* Get disk sector size */ + if (disk_ioctl(pdrv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK || SS(fs) > _MAX_SS) + return FR_DISK_ERR; +#endif + if (_MULTI_PARTITION && part) { + /* Get partition information from partition table in the MBR */ + if (disk_read(pdrv, fs->win, 0, 1) != RES_OK) return FR_DISK_ERR; + if (LD_WORD(fs->win+BS_55AA) != 0xAA55) return FR_MKFS_ABORTED; + tbl = &fs->win[MBR_Table + (part - 1) * SZ_PTE]; + if (!tbl[4]) return FR_MKFS_ABORTED; /* No partition? */ + b_vol = LD_DWORD(tbl+8); /* Volume start sector */ + n_vol = LD_DWORD(tbl+12); /* Volume size */ + } else { + /* Create a partition in this function */ + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &n_vol) != RES_OK || n_vol < 128) + return FR_DISK_ERR; + b_vol = (sfd) ? 0 : 63; /* Volume start sector */ + n_vol -= b_vol; /* Volume size */ + } + + if (!au) { /* AU auto selection */ + vs = n_vol / (2000 / (SS(fs) / 512)); + for (i = 0; vs < vst[i]; i++) ; + au = cst[i]; + } + au /= SS(fs); /* Number of sectors per cluster */ + if (au == 0) au = 1; + if (au > 128) au = 128; + + /* Pre-compute number of clusters and FAT sub-type */ + n_clst = n_vol / au; + fmt = FS_FAT12; + if (n_clst >= MIN_FAT16) fmt = FS_FAT16; + if (n_clst >= MIN_FAT32) fmt = FS_FAT32; + + /* Determine offset and size of FAT structure */ + if (fmt == FS_FAT32) { + n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); + n_rsv = 32; + n_dir = 0; + } else { + n_fat = (fmt == FS_FAT12) ? (n_clst * 3 + 1) / 2 + 3 : (n_clst * 2) + 4; + n_fat = (n_fat + SS(fs) - 1) / SS(fs); + n_rsv = 1; + n_dir = (DWORD)N_ROOTDIR * SZ_DIR / SS(fs); + } + b_fat = b_vol + n_rsv; /* FAT area start sector */ + b_dir = b_fat + n_fat * N_FATS; /* Directory area start sector */ + b_data = b_dir + n_dir; /* Data area start sector */ + if (n_vol < b_data + au - b_vol) return FR_MKFS_ABORTED; /* Too small volume */ + + /* Align data start sector to erase block boundary (for flash memory media) */ + if (disk_ioctl(pdrv, GET_BLOCK_SIZE, &n) != RES_OK || !n || n > 32768) n = 1; + n = (b_data + n - 1) & ~(n - 1); /* Next nearest erase block from current data start */ + n = (n - b_data) / N_FATS; + if (fmt == FS_FAT32) { /* FAT32: Move FAT offset */ + n_rsv += n; + b_fat += n; + } else { /* FAT12/16: Expand FAT size */ + n_fat += n; + } + + /* Determine number of clusters and final check of validity of the FAT sub-type */ + n_clst = (n_vol - n_rsv - n_fat * N_FATS - n_dir) / au; + if ( (fmt == FS_FAT16 && n_clst < MIN_FAT16) + || (fmt == FS_FAT32 && n_clst < MIN_FAT32)) + return FR_MKFS_ABORTED; + + switch (fmt) { /* Determine system ID for partition table */ + case FS_FAT12: sys = 0x01; break; + case FS_FAT16: sys = (n_vol < 0x10000) ? 0x04 : 0x06; break; + default: sys = 0x0C; + } + + if (_MULTI_PARTITION && part) { + /* Update system ID in the partition table */ + tbl = &fs->win[MBR_Table + (part - 1) * SZ_PTE]; + tbl[4] = sys; + if (disk_write(pdrv, fs->win, 0, 1) != RES_OK) return FR_DISK_ERR; + md = 0xF8; + } else { + if (sfd) { /* No partition table (SFD) */ + md = 0xF0; + } else { /* Create partition table (FDISK) */ + mem_set(fs->win, 0, SS(fs)); + tbl = fs->win+MBR_Table; /* Create partition table for single partition in the drive */ + tbl[1] = 1; /* Partition start head */ + tbl[2] = 1; /* Partition start sector */ + tbl[3] = 0; /* Partition start cylinder */ + tbl[4] = sys; /* System type */ + tbl[5] = 254; /* Partition end head */ + n = (b_vol + n_vol) / 63 / 255; + tbl[6] = (BYTE)((n >> 2) | 63); /* Partition end sector */ + tbl[7] = (BYTE)n; /* End cylinder */ + ST_DWORD(tbl+8, 63); /* Partition start in LBA */ + ST_DWORD(tbl+12, n_vol); /* Partition size in LBA */ + ST_WORD(fs->win+BS_55AA, 0xAA55); /* MBR signature */ + if (disk_write(pdrv, fs->win, 0, 1) != RES_OK) /* Write it to the MBR sector */ + return FR_DISK_ERR; + md = 0xF8; + } + } + + /* Create BPB in the VBR */ + tbl = fs->win; /* Clear sector */ + mem_set(tbl, 0, SS(fs)); + mem_cpy(tbl, "\xEB\xFE\x90" "MSDOS5.0", 11);/* Boot jump code, OEM name */ + i = SS(fs); /* Sector size */ + ST_WORD(tbl+BPB_BytsPerSec, i); + tbl[BPB_SecPerClus] = (BYTE)au; /* Sectors per cluster */ + ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ + tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ + i = (fmt == FS_FAT32) ? 0 : N_ROOTDIR; /* Number of rootdir entries */ + ST_WORD(tbl+BPB_RootEntCnt, i); + if (n_vol < 0x10000) { /* Number of total sectors */ + ST_WORD(tbl+BPB_TotSec16, n_vol); + } else { + ST_DWORD(tbl+BPB_TotSec32, n_vol); + } + tbl[BPB_Media] = md; /* Media descriptor */ + ST_WORD(tbl+BPB_SecPerTrk, 63); /* Number of sectors per track */ + ST_WORD(tbl+BPB_NumHeads, 255); /* Number of heads */ + ST_DWORD(tbl+BPB_HiddSec, b_vol); /* Hidden sectors */ + n = get_fattime(); /* Use current time as VSN */ + if (fmt == FS_FAT32) { + ST_DWORD(tbl+BS_VolID32, n); /* VSN */ + ST_DWORD(tbl+BPB_FATSz32, n_fat); /* Number of sectors per FAT */ + ST_DWORD(tbl+BPB_RootClus, 2); /* Root directory start cluster (2) */ + ST_WORD(tbl+BPB_FSInfo, 1); /* FSInfo record offset (VBR+1) */ + ST_WORD(tbl+BPB_BkBootSec, 6); /* Backup boot record offset (VBR+6) */ + tbl[BS_DrvNum32] = 0x80; /* Drive number */ + tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab32, "NO NAME " "FAT32 ", 19); /* Volume label, FAT signature */ + } else { + ST_DWORD(tbl+BS_VolID, n); /* VSN */ + ST_WORD(tbl+BPB_FATSz16, n_fat); /* Number of sectors per FAT */ + tbl[BS_DrvNum] = 0x80; /* Drive number */ + tbl[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab, "NO NAME " "FAT ", 19); /* Volume label, FAT signature */ + } + ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature (Offset is fixed here regardless of sector size) */ + if (disk_write(pdrv, tbl, b_vol, 1) != RES_OK) /* Write it to the VBR sector */ + return FR_DISK_ERR; + if (fmt == FS_FAT32) /* Write backup VBR if needed (VBR+6) */ + disk_write(pdrv, tbl, b_vol + 6, 1); + + /* Initialize FAT area */ + wsect = b_fat; + for (i = 0; i < N_FATS; i++) { /* Initialize each FAT copy */ + mem_set(tbl, 0, SS(fs)); /* 1st sector of the FAT */ + n = md; /* Media descriptor byte */ + if (fmt != FS_FAT32) { + n |= (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00; + ST_DWORD(tbl+0, n); /* Reserve cluster #0-1 (FAT12/16) */ + } else { + n |= 0xFFFFFF00; + ST_DWORD(tbl+0, n); /* Reserve cluster #0-1 (FAT32) */ + ST_DWORD(tbl+4, 0xFFFFFFFF); + ST_DWORD(tbl+8, 0x0FFFFFFF); /* Reserve cluster #2 for root dir */ + } + if (disk_write(pdrv, tbl, wsect++, 1) != RES_OK) + return FR_DISK_ERR; + mem_set(tbl, 0, SS(fs)); /* Fill following FAT entries with zero */ + for (n = 1; n < n_fat; n++) { /* This loop may take a time on FAT32 volume due to many single sector writes */ + if (disk_write(pdrv, tbl, wsect++, 1) != RES_OK) + return FR_DISK_ERR; + } + } + + /* Initialize root directory */ + i = (fmt == FS_FAT32) ? au : n_dir; + do { + if (disk_write(pdrv, tbl, wsect++, 1) != RES_OK) + return FR_DISK_ERR; + } while (--i); + +#if _USE_ERASE /* Erase data area if needed */ + { + DWORD eb[2]; + + eb[0] = wsect; eb[1] = wsect + (n_clst - ((fmt == FS_FAT32) ? 1 : 0)) * au - 1; + disk_ioctl(pdrv, CTRL_ERASE_SECTOR, eb); + } +#endif + + /* Create FSInfo if needed */ + if (fmt == FS_FAT32) { + ST_DWORD(tbl+FSI_LeadSig, 0x41615252); + ST_DWORD(tbl+FSI_StrucSig, 0x61417272); + ST_DWORD(tbl+FSI_Free_Count, n_clst - 1); /* Number of free clusters */ + ST_DWORD(tbl+FSI_Nxt_Free, 2); /* Last allocated cluster# */ + ST_WORD(tbl+BS_55AA, 0xAA55); + disk_write(pdrv, tbl, b_vol + 1, 1); /* Write original (VBR+1) */ + disk_write(pdrv, tbl, b_vol + 7, 1); /* Write backup (VBR+7) */ + } + + return (disk_ioctl(pdrv, CTRL_SYNC, 0) == RES_OK) ? FR_OK : FR_DISK_ERR; +} + + +#if _MULTI_PARTITION +/*-----------------------------------------------------------------------*/ +/* Divide Physical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_fdisk ( + BYTE pdrv, /* Physical drive number */ + const DWORD szt[], /* Pointer to the size table for each partitions */ + void* work /* Pointer to the working buffer */ +) +{ + UINT i, n, sz_cyl, tot_cyl, b_cyl, e_cyl, p_cyl; + BYTE s_hd, e_hd, *p, *buf = (BYTE*)work; + DSTATUS stat; + DWORD sz_disk, sz_part, s_part; + + + stat = disk_initialize(pdrv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; + if (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_disk)) return FR_DISK_ERR; + + /* Determine CHS in the table regardless of the drive geometry */ + for (n = 16; n < 256 && sz_disk / n / 63 > 1024; n *= 2) ; + if (n == 256) n--; + e_hd = n - 1; + sz_cyl = 63 * n; + tot_cyl = sz_disk / sz_cyl; + + /* Create partition table */ + mem_set(buf, 0, _MAX_SS); + p = buf + MBR_Table; b_cyl = 0; + for (i = 0; i < 4; i++, p += SZ_PTE) { + p_cyl = (szt[i] <= 100) ? (DWORD)tot_cyl * szt[i] / 100 : szt[i] / sz_cyl; + if (!p_cyl) continue; + s_part = (DWORD)sz_cyl * b_cyl; + sz_part = (DWORD)sz_cyl * p_cyl; + if (i == 0) { /* Exclude first track of cylinder 0 */ + s_hd = 1; + s_part += 63; sz_part -= 63; + } else { + s_hd = 0; + } + e_cyl = b_cyl + p_cyl - 1; + if (e_cyl >= tot_cyl) return FR_INVALID_PARAMETER; + + /* Set partition table */ + p[1] = s_hd; /* Start head */ + p[2] = (BYTE)((b_cyl >> 2) + 1); /* Start sector */ + p[3] = (BYTE)b_cyl; /* Start cylinder */ + p[4] = 0x06; /* System type (temporary setting) */ + p[5] = e_hd; /* End head */ + p[6] = (BYTE)((e_cyl >> 2) + 63); /* End sector */ + p[7] = (BYTE)e_cyl; /* End cylinder */ + ST_DWORD(p + 8, s_part); /* Start sector in LBA */ + ST_DWORD(p + 12, sz_part); /* Partition size */ + + /* Next partition */ + b_cyl += p_cyl; + } + ST_WORD(p, 0xAA55); + + /* Write it to the MBR */ + return (disk_write(pdrv, buf, 0, 1) || disk_ioctl(pdrv, CTRL_SYNC, 0)) ? FR_DISK_ERR : FR_OK; +} + + +#endif /* _MULTI_PARTITION */ +#endif /* _USE_MKFS && !_FS_READONLY */ + + + + +#if _USE_STRFUNC +/*-----------------------------------------------------------------------*/ +/* Get a string from the file */ +/*-----------------------------------------------------------------------*/ + +TCHAR* f_gets ( + TCHAR* buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer (characters) */ + FIL* fp /* Pointer to the file object */ +) +{ + int n = 0; + TCHAR c, *p = buff; + BYTE s[2]; + UINT rc; + + + while (n < len - 1) { /* Read bytes until buffer gets filled */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; /* Break on EOF or error */ + c = s[0]; +#if _LFN_UNICODE /* Read a character in UTF-8 encoding */ + if (c >= 0x80) { + if (c < 0xC0) continue; /* Skip stray trailer */ + if (c < 0xE0) { /* Two-byte sequence */ + f_read(fp, s, 1, &rc); + if (rc != 1) break; + c = ((c & 0x1F) << 6) | (s[0] & 0x3F); + if (c < 0x80) c = '?'; + } else { + if (c < 0xF0) { /* Three-byte sequence */ + f_read(fp, s, 2, &rc); + if (rc != 2) break; + c = (c << 12) | ((s[0] & 0x3F) << 6) | (s[1] & 0x3F); + if (c < 0x800) c = '?'; + } else { /* Reject four-byte sequence */ + c = '?'; + } + } + } +#endif +#if _USE_STRFUNC >= 2 + if (c == '\r') continue; /* Strip '\r' */ +#endif + *p++ = c; + n++; + if (c == '\n') break; /* Break on EOL */ + } + *p = 0; + return n ? buff : 0; /* When no data read (eof or error), return with error. */ +} + + + +#if !_FS_READONLY +#include +/*-----------------------------------------------------------------------*/ +/* Put a character to the file */ +/*-----------------------------------------------------------------------*/ + +int f_putc ( + TCHAR c, /* A character to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + UINT bw, btw; + BYTE s[3]; + + +#if _USE_STRFUNC >= 2 + if (c == '\n') f_putc ('\r', fp); /* LF -> CRLF conversion */ +#endif + +#if _LFN_UNICODE /* Write the character in UTF-8 encoding */ + if (c < 0x80) { /* 7-bit */ + s[0] = (BYTE)c; + btw = 1; + } else { + if (c < 0x800) { /* 11-bit */ + s[0] = (BYTE)(0xC0 | (c >> 6)); + s[1] = (BYTE)(0x80 | (c & 0x3F)); + btw = 2; + } else { /* 16-bit */ + s[0] = (BYTE)(0xE0 | (c >> 12)); + s[1] = (BYTE)(0x80 | ((c >> 6) & 0x3F)); + s[2] = (BYTE)(0x80 | (c & 0x3F)); + btw = 3; + } + } +#else /* Write the character without conversion */ + s[0] = (BYTE)c; + btw = 1; +#endif + f_write(fp, s, btw, &bw); /* Write the char to the file */ + return (bw == btw) ? 1 : EOF; /* Return the result */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a string to the file */ +/*-----------------------------------------------------------------------*/ + +int f_puts ( + const TCHAR* str, /* Pointer to the string to be output */ + FIL* fp /* Pointer to the file object */ +) +{ + int n; + + + for (n = 0; *str; str++, n++) { + if (f_putc(*str, fp) == EOF) return EOF; + } + return n; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a formatted string to the file */ +/*-----------------------------------------------------------------------*/ + +int f_printf ( + FIL* fp, /* Pointer to the file object */ + const TCHAR* str, /* Pointer to the format string */ + ... /* Optional arguments... */ +) +{ + va_list arp; + BYTE f, r; + UINT i, j, w; + ULONG v; + TCHAR c, d, s[16], *p; + int res, chc, cc; + + + va_start(arp, str); + + for (cc = res = 0; cc != EOF; res += cc) { + c = *str++; + if (c == 0) break; /* End of string */ + if (c != '%') { /* Non escape character */ + cc = f_putc(c, fp); + if (cc != EOF) cc = 1; + continue; + } + w = f = 0; + c = *str++; + if (c == '0') { /* Flag: '0' padding */ + f = 1; c = *str++; + } else { + if (c == '-') { /* Flag: left justified */ + f = 2; c = *str++; + } + } + while (IsDigit(c)) { /* Precision */ + w = w * 10 + c - '0'; + c = *str++; + } + if (c == 'l' || c == 'L') { /* Prefix: Size is long int */ + f |= 4; c = *str++; + } + if (!c) break; + d = c; + if (IsLower(d)) d -= 0x20; + switch (d) { /* Type is... */ + case 'S' : /* String */ + p = va_arg(arp, TCHAR*); + for (j = 0; p[j]; j++) ; + chc = 0; + if (!(f & 2)) { + while (j++ < w) chc += (cc = f_putc(' ', fp)); + } + chc += (cc = f_puts(p, fp)); + while (j++ < w) chc += (cc = f_putc(' ', fp)); + if (cc != EOF) cc = chc; + continue; + case 'C' : /* Character */ + cc = f_putc((TCHAR)va_arg(arp, int), fp); continue; + case 'B' : /* Binary */ + r = 2; break; + case 'O' : /* Octal */ + r = 8; break; + case 'D' : /* Signed decimal */ + case 'U' : /* Unsigned decimal */ + r = 10; break; + case 'X' : /* Hexdecimal */ + r = 16; break; + default: /* Unknown type (pass-through) */ + cc = f_putc(c, fp); continue; + } + + /* Get an argument and put it in numeral */ + v = (f & 4) ? (ULONG)va_arg(arp, long) : ((d == 'D') ? (ULONG)(long)va_arg(arp, int) : (ULONG)va_arg(arp, unsigned int)); + if (d == 'D' && (v & 0x80000000)) { + v = 0 - v; + f |= 8; + } + i = 0; + do { + d = (TCHAR)(v % r); v /= r; + if (d > 9) d += (c == 'x') ? 0x27 : 0x07; + s[i++] = d + '0'; + } while (v && i < sizeof s / sizeof s[0]); + if (f & 8) s[i++] = '-'; + j = i; d = (f & 1) ? '0' : ' '; + chc = 0; + while (!(f & 2) && j++ < w) chc += (cc = f_putc(d, fp)); + do chc += (cc = f_putc(s[--i], fp)); while(i); + while (j++ < w) chc += (cc = f_putc(' ', fp)); + if (cc != EOF) cc = chc; + } + + va_end(arp); + return (cc == EOF) ? cc : res; +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_STRFUNC */ diff --git a/third_party/fatfs/src/ff.h b/third_party/fatfs/src/ff.h new file mode 100644 index 0000000..b4115f6 --- /dev/null +++ b/third_party/fatfs/src/ff.h @@ -0,0 +1,340 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module include file R0.09b (C)ChaN, 2013 +/----------------------------------------------------------------------------/ +/ FatFs module is a generic FAT file system module for small embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following terms. +/ +/ Copyright (C) 2013, ChaN, all right reserved. +/ +/ * The FatFs module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/----------------------------------------------------------------------------*/ + +#ifndef _FATFS +#define _FATFS 82786 /* Revision ID */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "integer.h" /* Basic integer types */ +#include "ffconf.h" /* FatFs configuration options */ + +#if _FATFS != _FFCONF +#error Wrong configuration file (ffconf.h). +#endif + + + +/* Definitions of volume management */ + +#if _MULTI_PARTITION /* Multiple partition configuration */ +typedef struct { + BYTE pd; /* Physical drive number */ + BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */ +} PARTITION; +extern PARTITION VolToPart[]; /* Volume - Partition resolution table */ +#define LD2PD(vol) (VolToPart[vol].pd) /* Get physical drive number */ +#define LD2PT(vol) (VolToPart[vol].pt) /* Get partition index */ + +#else /* Single partition configuration */ +#define LD2PD(vol) (BYTE)(vol) /* Each logical drive is bound to the same physical drive number */ +#define LD2PT(vol) 0 /* Always mounts the 1st partition or in SFD */ + +#endif + + + +/* Type of path name strings on FatFs API */ + +#if _LFN_UNICODE /* Unicode string */ +#if !_USE_LFN +#error _LFN_UNICODE must be 0 in non-LFN cfg. +#endif +#ifndef _INC_TCHAR +typedef WCHAR TCHAR; +#define _T(x) L ## x +#define _TEXT(x) L ## x +#endif + +#else /* ANSI/OEM string */ +#ifndef _INC_TCHAR +typedef char TCHAR; +#define _T(x) x +#define _TEXT(x) x +#endif + +#endif + + + +/* File system object structure (FATFS) */ + +typedef struct { + BYTE fs_type; /* FAT sub-type (0:Not mounted) */ + BYTE drv; /* Physical drive number */ + BYTE csize; /* Sectors per cluster (1,2,4...128) */ + BYTE n_fats; /* Number of FAT copies (1,2) */ + BYTE wflag; /* win[] dirty flag (1:must be written back) */ + BYTE fsi_flag; /* fsinfo dirty flag (1:must be written back) */ + WORD id; /* File system mount ID */ + WORD n_rootdir; /* Number of root directory entries (FAT12/16) */ +#if _MAX_SS != 512 + WORD ssize; /* Bytes per sector (512, 1024, 2048 or 4096) */ +#endif +#if _FS_REENTRANT + _SYNC_t sobj; /* Identifier of sync object */ +#endif +#if !_FS_READONLY + DWORD last_clust; /* Last allocated cluster */ + DWORD free_clust; /* Number of free clusters */ + DWORD fsi_sector; /* fsinfo sector (FAT32) */ +#endif +#if _FS_RPATH + DWORD cdir; /* Current directory start cluster (0:root) */ +#endif + DWORD n_fatent; /* Number of FAT entries (= number of clusters + 2) */ + DWORD fsize; /* Sectors per FAT */ + DWORD volbase; /* Volume start sector */ + DWORD fatbase; /* FAT start sector */ + DWORD dirbase; /* Root directory start sector (FAT32:Cluster#) */ + DWORD database; /* Data start sector */ + DWORD winsect; /* Current sector appearing in the win[] */ + BYTE win[_MAX_SS]; /* Disk access window for Directory, FAT (and Data on tiny cfg) */ +} FATFS; + + + +/* File object structure (FIL) */ + +typedef struct { + FATFS* fs; /* Pointer to the related file system object (**do not change order**) */ + WORD id; /* Owner file system mount ID (**do not change order**) */ + BYTE flag; /* File status flags */ + BYTE pad1; + DWORD fptr; /* File read/write pointer (0ed on file open) */ + DWORD fsize; /* File size */ + DWORD sclust; /* File data start cluster (0:no data cluster, always 0 when fsize is 0) */ + DWORD clust; /* Current cluster of fpter */ + DWORD dsect; /* Current data sector of fpter */ +#if !_FS_READONLY + DWORD dir_sect; /* Sector containing the directory entry */ + BYTE* dir_ptr; /* Pointer to the directory entry in the window */ +#endif +#if _USE_FASTSEEK + DWORD* cltbl; /* Pointer to the cluster link map table (null on file open) */ +#endif +#if _FS_LOCK + UINT lockid; /* File lock ID (index of file semaphore table Files[]) */ +#endif +#if !_FS_TINY + BYTE buf[_MAX_SS]; /* File data read/write buffer */ +#endif +} FIL; + + + +/* Directory object structure (DIR) */ + +typedef struct { + FATFS* fs; /* Pointer to the owner file system object (**do not change order**) */ + WORD id; /* Owner file system mount ID (**do not change order**) */ + WORD index; /* Current read/write index number */ + DWORD sclust; /* Table start cluster (0:Root dir) */ + DWORD clust; /* Current cluster */ + DWORD sect; /* Current sector */ + BYTE* dir; /* Pointer to the current SFN entry in the win[] */ + BYTE* fn; /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */ +#if _USE_LFN + WCHAR* lfn; /* Pointer to the LFN working buffer */ + WORD lfn_idx; /* Last matched LFN index number (0xFFFF:No LFN) */ +#endif +} DIR; + + + +/* File status structure (FILINFO) */ + +typedef struct { + DWORD fsize; /* File size */ + WORD fdate; /* Last modified date */ + WORD ftime; /* Last modified time */ + BYTE fattrib; /* Attribute */ + TCHAR fname[13]; /* Short file name (8.3 format) */ +#if _USE_LFN + TCHAR* lfname; /* Pointer to the LFN buffer */ + UINT lfsize; /* Size of LFN buffer in TCHAR */ +#endif +} FILINFO; + + + +/* File function return code (FRESULT) */ + +typedef enum { + FR_OK = 0, /* (0) Succeeded */ + FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ + FR_INT_ERR, /* (2) Assertion failed */ + FR_NOT_READY, /* (3) The physical drive cannot work */ + FR_NO_FILE, /* (4) Could not find the file */ + FR_NO_PATH, /* (5) Could not find the path */ + FR_INVALID_NAME, /* (6) The path name format is invalid */ + FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ + FR_EXIST, /* (8) Access denied due to prohibited access */ + FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ + FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ + FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ + FR_NOT_ENABLED, /* (12) The volume has no work area */ + FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ + FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any parameter error */ + FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ + FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ + FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ + FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_SHARE */ + FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ +} FRESULT; + + + +/*--------------------------------------------------------------*/ +/* FatFs module application interface */ + +FRESULT f_mount (BYTE vol, FATFS* fs); /* Mount/Unmount a logical drive */ +FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */ +FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from a file */ +FRESULT f_lseek (FIL* fp, DWORD ofs); /* Move file pointer of a file object */ +FRESULT f_close (FIL* fp); /* Close an open file object */ +FRESULT f_opendir (DIR* dj, const TCHAR* path); /* Open an existing directory */ +FRESULT f_readdir (DIR* dj, FILINFO* fno); /* Read a directory item */ +FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */ +FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to a file */ +FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */ +FRESULT f_truncate (FIL* fp); /* Truncate file */ +FRESULT f_sync (FIL* fp); /* Flush cached data of a writing file */ +FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */ +FRESULT f_mkdir (const TCHAR* path); /* Create a new directory */ +FRESULT f_chmod (const TCHAR* path, BYTE value, BYTE mask); /* Change attribute of the file/dir */ +FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change times-tamp of the file/dir */ +FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */ +FRESULT f_chdrive (BYTE drv); /* Change current drive */ +FRESULT f_chdir (const TCHAR* path); /* Change current directory */ +FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */ +FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* sn); /* Get volume label */ +FRESULT f_setlabel (const TCHAR* label); /* Set volume label */ +FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */ +FRESULT f_mkfs (BYTE vol, BYTE sfd, UINT au); /* Create a file system on the drive */ +FRESULT f_fdisk (BYTE pdrv, const DWORD szt[], void* work); /* Divide a physical drive into some partitions */ +int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */ +int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */ +int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */ +TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */ + +#define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0) +#define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0) +#define f_tell(fp) ((fp)->fptr) +#define f_size(fp) ((fp)->fsize) + +#ifndef EOF +#define EOF (-1) +#endif + + + + +/*--------------------------------------------------------------*/ +/* Additional user defined functions */ + +/* RTC function */ +#if !_FS_READONLY +DWORD get_fattime (void); +#endif + +/* Unicode support functions */ +#if _USE_LFN /* Unicode - OEM code conversion */ +WCHAR ff_convert (WCHAR chr, UINT dir); /* OEM-Unicode bidirectional conversion */ +WCHAR ff_wtoupper (WCHAR chr); /* Unicode upper-case conversion */ +#if _USE_LFN == 3 /* Memory functions */ +void* ff_memalloc (UINT msize); /* Allocate memory block */ +void ff_memfree (void* mblock); /* Free memory block */ +#endif +#endif + +/* Sync functions */ +#if _FS_REENTRANT +int ff_cre_syncobj (BYTE vol, _SYNC_t* sobj); /* Create a sync object */ +int ff_req_grant (_SYNC_t sobj); /* Lock sync object */ +void ff_rel_grant (_SYNC_t sobj); /* Unlock sync object */ +int ff_del_syncobj (_SYNC_t sobj); /* Delete a sync object */ +#endif + + + + +/*--------------------------------------------------------------*/ +/* Flags and offset address */ + + +/* File access control and file status flags (FIL.flag) */ + +#define FA_READ 0x01 +#define FA_OPEN_EXISTING 0x00 +#define FA__ERROR 0x80 + +#if !_FS_READONLY +#define FA_WRITE 0x02 +#define FA_CREATE_NEW 0x04 +#define FA_CREATE_ALWAYS 0x08 +#define FA_OPEN_ALWAYS 0x10 +#define FA__WRITTEN 0x20 +#define FA__DIRTY 0x40 +#endif + + +/* FAT sub type (FATFS.fs_type) */ + +#define FS_FAT12 1 +#define FS_FAT16 2 +#define FS_FAT32 3 + + +/* File attribute bits for directory entry */ + +#define AM_RDO 0x01 /* Read only */ +#define AM_HID 0x02 /* Hidden */ +#define AM_SYS 0x04 /* System */ +#define AM_VOL 0x08 /* Volume label */ +#define AM_LFN 0x0F /* LFN entry */ +#define AM_DIR 0x10 /* Directory */ +#define AM_ARC 0x20 /* Archive */ +#define AM_MASK 0x3F /* Mask of defined bits */ + + +/* Fast seek feature */ +#define CREATE_LINKMAP 0xFFFFFFFF + + + +/*--------------------------------*/ +/* Multi-byte word access macros */ + +#if _WORD_ACCESS == 1 /* Enable word access to the FAT structure */ +#define LD_WORD(ptr) (WORD)(*(WORD*)(BYTE*)(ptr)) +#define LD_DWORD(ptr) (DWORD)(*(DWORD*)(BYTE*)(ptr)) +#define ST_WORD(ptr,val) *(WORD*)(BYTE*)(ptr)=(WORD)(val) +#define ST_DWORD(ptr,val) *(DWORD*)(BYTE*)(ptr)=(DWORD)(val) +#else /* Use byte-by-byte access to the FAT structure */ +#define LD_WORD(ptr) (WORD)(((WORD)*((BYTE*)(ptr)+1)<<8)|(WORD)*(BYTE*)(ptr)) +#define LD_DWORD(ptr) (DWORD)(((DWORD)*((BYTE*)(ptr)+3)<<24)|((DWORD)*((BYTE*)(ptr)+2)<<16)|((WORD)*((BYTE*)(ptr)+1)<<8)|*(BYTE*)(ptr)) +#define ST_WORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8) +#define ST_DWORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8); *((BYTE*)(ptr)+2)=(BYTE)((DWORD)(val)>>16); *((BYTE*)(ptr)+3)=(BYTE)((DWORD)(val)>>24) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _FATFS */ diff --git a/third_party/fatfs/src/ffconf.h b/third_party/fatfs/src/ffconf.h new file mode 100644 index 0000000..f0da5b8 --- /dev/null +++ b/third_party/fatfs/src/ffconf.h @@ -0,0 +1,195 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module configuration file R0.09b (C)ChaN, 2013 +/----------------------------------------------------------------------------/ +/ +/ CAUTION! Do not forget to make clean the project after any changes to +/ the configuration options. +/ +/----------------------------------------------------------------------------*/ +#ifndef _FFCONF +#define _FFCONF 82786 /* Revision ID */ + + +/*---------------------------------------------------------------------------/ +/ Functions and Buffer Configurations +/----------------------------------------------------------------------------*/ + +#define _FS_TINY 0 /* 0:Normal or 1:Tiny */ +/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system +/ object instead of the sector buffer in the individual file object for file +/ data transfer. This reduces memory consumption 512 bytes each file object. */ + + +#define _FS_READONLY 0 /* 0:Read/Write or 1:Read only */ +/* Setting _FS_READONLY to 1 defines read only configuration. This removes +/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, +/ f_truncate and useless f_getfree. */ + + +#define _FS_MINIMIZE 0 /* 0 to 3 */ +/* The _FS_MINIMIZE option defines minimization level to remove some functions. +/ +/ 0: Full function. +/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename +/ are removed. +/ 2: f_opendir and f_readdir are removed in addition to 1. +/ 3: f_lseek is removed in addition to 2. */ + + +#define _USE_STRFUNC 0 /* 0:Disable or 1-2:Enable */ +/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ + + +#define _USE_MKFS 0 /* 0:Disable or 1:Enable */ +/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ + + +#define _USE_FASTSEEK 0 /* 0:Disable or 1:Enable */ +/* To enable fast seek feature, set _USE_FASTSEEK to 1. */ + + +#define _USE_LABEL 0 /* 0:Disable or 1:Enable */ +/* To enable volume label functions, set _USE_LAVEL to 1 */ + + +#define _USE_FORWARD 0 /* 0:Disable or 1:Enable */ +/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/----------------------------------------------------------------------------*/ + +#define _CODE_PAGE 932 +/* The _CODE_PAGE specifies the OEM code page to be used on the target system. +/ Incorrect setting of the code page can cause a file open failure. +/ +/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) +/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) +/ 949 - Korean (DBCS, OEM, Windows) +/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) +/ 1250 - Central Europe (Windows) +/ 1251 - Cyrillic (Windows) +/ 1252 - Latin 1 (Windows) +/ 1253 - Greek (Windows) +/ 1254 - Turkish (Windows) +/ 1255 - Hebrew (Windows) +/ 1256 - Arabic (Windows) +/ 1257 - Baltic (Windows) +/ 1258 - Vietnam (OEM, Windows) +/ 437 - U.S. (OEM) +/ 720 - Arabic (OEM) +/ 737 - Greek (OEM) +/ 775 - Baltic (OEM) +/ 850 - Multilingual Latin 1 (OEM) +/ 858 - Multilingual Latin 1 + Euro (OEM) +/ 852 - Latin 2 (OEM) +/ 855 - Cyrillic (OEM) +/ 866 - Russian (OEM) +/ 857 - Turkish (OEM) +/ 862 - Hebrew (OEM) +/ 874 - Thai (OEM, Windows) +/ 1 - ASCII only (Valid for non LFN cfg.) +*/ + +#ifdef ENABLE_LFN +#define _USE_LFN 1 /* 0 to 3 */ +#else +#define _USE_LFN 0 /* 0 to 3 */ +#endif +#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ +/* The _USE_LFN option switches the LFN support. +/ +/ 0: Disable LFN feature. _MAX_LFN and _LFN_UNICODE have no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT reentrant. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ 3: Enable LFN with dynamic working buffer on the HEAP. +/ +/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. To enable LFN, +/ Unicode handling functions ff_convert() and ff_wtoupper() must be added +/ to the project. When enable to use heap, memory control functions +/ ff_memalloc() and ff_memfree() must be added to the project. */ + + +#define _LFN_UNICODE 0 /* 0:ANSI/OEM or 1:Unicode */ +/* To switch the character code set on FatFs API to Unicode, +/ enable LFN feature and set _LFN_UNICODE to 1. */ + + +#define _FS_RPATH 0 /* 0 to 2 */ +/* The _FS_RPATH option configures relative path feature. +/ +/ 0: Disable relative path feature and remove related functions. +/ 1: Enable relative path. f_chdrive() and f_chdir() are available. +/ 2: f_getcwd() is available in addition to 1. +/ +/ Note that output of the f_readdir fnction is affected by this option. */ + + +/*---------------------------------------------------------------------------/ +/ Physical Drive Configurations +/----------------------------------------------------------------------------*/ + +#define _VOLUMES 1 +/* Number of volumes (logical drives) to be used. */ + + +#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ +/* Maximum sector size to be handled. +/ Always set 512 for memory card and hard disk but a larger value may be +/ required for on-board flash memory, floppy disk and optical disk. +/ When _MAX_SS is larger than 512, it configures FatFs to variable sector size +/ and GET_SECTOR_SIZE command must be implememted to the disk_ioctl function. */ + + +#define _MULTI_PARTITION 0 /* 0:Single partition, 1:Enable multiple partition */ +/* When set to 0, each volume is bound to the same physical drive number and +/ it can mount only first primaly partition. When it is set to 1, each volume +/ is tied to the partitions listed in VolToPart[]. */ + + +#define _USE_ERASE 0 /* 0:Disable or 1:Enable */ +/* To enable sector erase feature, set _USE_ERASE to 1. CTRL_ERASE_SECTOR command +/ should be added to the disk_ioctl functio. */ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/----------------------------------------------------------------------------*/ + +#define _WORD_ACCESS 0 /* 0 or 1 */ +/* Set 0 first and it is always compatible with all platforms. The _WORD_ACCESS +/ option defines which access method is used to the word data on the FAT volume. +/ +/ 0: Byte-by-byte access. +/ 1: Word access. Do not choose this unless following condition is met. +/ +/ When the byte order on the memory is big-endian or address miss-aligned word +/ access results incorrect behavior, the _WORD_ACCESS must be set to 0. +/ If it is not the case, the value can also be set to 1 to improve the +/ performance and code size. +*/ + + +/* A header file that defines sync object types on the O/S, such as +/ windows.h, ucos_ii.h and semphr.h, must be included prior to ff.h. */ + +#define _FS_REENTRANT 0 /* 0:Disable or 1:Enable */ +#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ +#define _SYNC_t HANDLE /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ + +/* The _FS_REENTRANT option switches the reentrancy (thread safe) of the FatFs module. +/ +/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. +/ 1: Enable reentrancy. Also user provided synchronization handlers, +/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj +/ function must be added to the project. */ + + +#define _FS_LOCK 0 /* 0:Disable or >=1:Enable */ +/* To enable file lock control feature, set _FS_LOCK to 1 or greater. + The value defines how many files can be opened simultaneously. */ + + +#endif /* _FFCONFIG */ diff --git a/third_party/fatfs/src/integer.h b/third_party/fatfs/src/integer.h new file mode 100644 index 0000000..d0ce5d9 --- /dev/null +++ b/third_party/fatfs/src/integer.h @@ -0,0 +1,40 @@ +/*-------------------------------------------*/ +/* Integer type definitions for FatFs module */ +/*-------------------------------------------*/ + +#ifndef _INTEGER +#define _INTEGER + +#ifdef _WIN32 /* FatFs development platform */ + +#include +#include + +#else /* Embedded platform */ + +/* These types must be 16-bit, 32-bit or larger integer */ +typedef int INT; +typedef unsigned int UINT; + +/* These types must be 8-bit integer */ +typedef char CHAR; +typedef unsigned char UCHAR; +typedef unsigned char BYTE; + +/* These types must be 16-bit integer */ +typedef short SHORT; +typedef unsigned short USHORT; +typedef unsigned short WORD; +typedef unsigned short WCHAR; + +/* These types must be 32-bit integer */ +typedef long LONG; +typedef unsigned long ULONG; +typedef unsigned long DWORD; + +/* Boolean type */ +typedef enum { FALSE = 0, TRUE } BOOL; + +#endif + +#endif diff --git a/third_party/fatfs/src/option/cc932.c b/third_party/fatfs/src/option/cc932.c new file mode 100644 index 0000000..b0e84aa --- /dev/null +++ b/third_party/fatfs/src/option/cc932.c @@ -0,0 +1,3798 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ +/* */ +/* CP932 (Japanese Shift-JIS) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + +#define _TINY_TABLE 1 + +#if !_USE_LFN || _CODE_PAGE != 932 +#error This file is not needed in current configuration. Remove from the project. +#endif + + +static +const WCHAR uni2sjis[] = { +/* Unicode - Sjis, Unicode - Sjis, Unicode - Sjis, Unicode - Sjis, */ + 0x00A7, 0x8198, 0x00A8, 0x814E, 0x00B0, 0x818B, 0x00B1, 0x817D, + 0x00B4, 0x814C, 0x00B6, 0x81F7, 0x00D7, 0x817E, 0x00F7, 0x8180, + 0x0391, 0x839F, 0x0392, 0x83A0, 0x0393, 0x83A1, 0x0394, 0x83A2, + 0x0395, 0x83A3, 0x0396, 0x83A4, 0x0397, 0x83A5, 0x0398, 0x83A6, + 0x0399, 0x83A7, 0x039A, 0x83A8, 0x039B, 0x83A9, 0x039C, 0x83AA, + 0x039D, 0x83AB, 0x039E, 0x83AC, 0x039F, 0x83AD, 0x03A0, 0x83AE, + 0x03A1, 0x83AF, 0x03A3, 0x83B0, 0x03A4, 0x83B1, 0x03A5, 0x83B2, + 0x03A6, 0x83B3, 0x03A7, 0x83B4, 0x03A8, 0x83B5, 0x03A9, 0x83B6, + 0x03B1, 0x83BF, 0x03B2, 0x83C0, 0x03B3, 0x83C1, 0x03B4, 0x83C2, + 0x03B5, 0x83C3, 0x03B6, 0x83C4, 0x03B7, 0x83C5, 0x03B8, 0x83C6, + 0x03B9, 0x83C7, 0x03BA, 0x83C8, 0x03BB, 0x83C9, 0x03BC, 0x83CA, + 0x03BD, 0x83CB, 0x03BE, 0x83CC, 0x03BF, 0x83CD, 0x03C0, 0x83CE, + 0x03C1, 0x83CF, 0x03C3, 0x83D0, 0x03C4, 0x83D1, 0x03C5, 0x83D2, + 0x03C6, 0x83D3, 0x03C7, 0x83D4, 0x03C8, 0x83D5, 0x03C9, 0x83D6, + 0x0401, 0x8446, 0x0410, 0x8440, 0x0411, 0x8441, 0x0412, 0x8442, + 0x0413, 0x8443, 0x0414, 0x8444, 0x0415, 0x8445, 0x0416, 0x8447, + 0x0417, 0x8448, 0x0418, 0x8449, 0x0419, 0x844A, 0x041A, 0x844B, + 0x041B, 0x844C, 0x041C, 0x844D, 0x041D, 0x844E, 0x041E, 0x844F, + 0x041F, 0x8450, 0x0420, 0x8451, 0x0421, 0x8452, 0x0422, 0x8453, + 0x0423, 0x8454, 0x0424, 0x8455, 0x0425, 0x8456, 0x0426, 0x8457, + 0x0427, 0x8458, 0x0428, 0x8459, 0x0429, 0x845A, 0x042A, 0x845B, + 0x042B, 0x845C, 0x042C, 0x845D, 0x042D, 0x845E, 0x042E, 0x845F, + 0x042F, 0x8460, 0x0430, 0x8470, 0x0431, 0x8471, 0x0432, 0x8472, + 0x0433, 0x8473, 0x0434, 0x8474, 0x0435, 0x8475, 0x0436, 0x8477, + 0x0437, 0x8478, 0x0438, 0x8479, 0x0439, 0x847A, 0x043A, 0x847B, + 0x043B, 0x847C, 0x043C, 0x847D, 0x043D, 0x847E, 0x043E, 0x8480, + 0x043F, 0x8481, 0x0440, 0x8482, 0x0441, 0x8483, 0x0442, 0x8484, + 0x0443, 0x8485, 0x0444, 0x8486, 0x0445, 0x8487, 0x0446, 0x8488, + 0x0447, 0x8489, 0x0448, 0x848A, 0x0449, 0x848B, 0x044A, 0x848C, + 0x044B, 0x848D, 0x044C, 0x848E, 0x044D, 0x848F, 0x044E, 0x8490, + 0x044F, 0x8491, 0x0451, 0x8476, 0x2010, 0x815D, 0x2015, 0x815C, + 0x2018, 0x8165, 0x2019, 0x8166, 0x201C, 0x8167, 0x201D, 0x8168, + 0x2020, 0x81F5, 0x2021, 0x81F6, 0x2025, 0x8164, 0x2026, 0x8163, + 0x2030, 0x81F1, 0x2032, 0x818C, 0x2033, 0x818D, 0x203B, 0x81A6, + 0x2103, 0x818E, 0x2116, 0x8782, 0x2121, 0x8784, 0x212B, 0x81F0, + 0x2160, 0x8754, 0x2161, 0x8755, 0x2162, 0x8756, 0x2163, 0x8757, + 0x2164, 0x8758, 0x2165, 0x8759, 0x2166, 0x875A, 0x2167, 0x875B, + 0x2168, 0x875C, 0x2169, 0x875D, 0x2170, 0xFA40, 0x2171, 0xFA41, + 0x2172, 0xFA42, 0x2173, 0xFA43, 0x2174, 0xFA44, 0x2175, 0xFA45, + 0x2176, 0xFA46, 0x2177, 0xFA47, 0x2178, 0xFA48, 0x2179, 0xFA49, + 0x2190, 0x81A9, 0x2191, 0x81AA, 0x2192, 0x81A8, 0x2193, 0x81AB, + 0x21D2, 0x81CB, 0x21D4, 0x81CC, 0x2200, 0x81CD, 0x2202, 0x81DD, + 0x2203, 0x81CE, 0x2207, 0x81DE, 0x2208, 0x81B8, 0x220B, 0x81B9, + 0x2211, 0x8794, 0x221A, 0x81E3, 0x221D, 0x81E5, 0x221E, 0x8187, + 0x221F, 0x8798, 0x2220, 0x81DA, 0x2225, 0x8161, 0x2227, 0x81C8, + 0x2228, 0x81C9, 0x2229, 0x81BF, 0x222A, 0x81BE, 0x222B, 0x81E7, + 0x222C, 0x81E8, 0x222E, 0x8793, 0x2234, 0x8188, 0x2235, 0x81E6, + 0x223D, 0x81E4, 0x2252, 0x81E0, 0x2260, 0x8182, 0x2261, 0x81DF, + 0x2266, 0x8185, 0x2267, 0x8186, 0x226A, 0x81E1, 0x226B, 0x81E2, + 0x2282, 0x81BC, 0x2283, 0x81BD, 0x2286, 0x81BA, 0x2287, 0x81BB, + 0x22A5, 0x81DB, 0x22BF, 0x8799, 0x2312, 0x81DC, 0x2460, 0x8740, + 0x2461, 0x8741, 0x2462, 0x8742, 0x2463, 0x8743, 0x2464, 0x8744, + 0x2465, 0x8745, 0x2466, 0x8746, 0x2467, 0x8747, 0x2468, 0x8748, + 0x2469, 0x8749, 0x246A, 0x874A, 0x246B, 0x874B, 0x246C, 0x874C, + 0x246D, 0x874D, 0x246E, 0x874E, 0x246F, 0x874F, 0x2470, 0x8750, + 0x2471, 0x8751, 0x2472, 0x8752, 0x2473, 0x8753, 0x2500, 0x849F, + 0x2501, 0x84AA, 0x2502, 0x84A0, 0x2503, 0x84AB, 0x250C, 0x84A1, + 0x250F, 0x84AC, 0x2510, 0x84A2, 0x2513, 0x84AD, 0x2514, 0x84A4, + 0x2517, 0x84AF, 0x2518, 0x84A3, 0x251B, 0x84AE, 0x251C, 0x84A5, + 0x251D, 0x84BA, 0x2520, 0x84B5, 0x2523, 0x84B0, 0x2524, 0x84A7, + 0x2525, 0x84BC, 0x2528, 0x84B7, 0x252B, 0x84B2, 0x252C, 0x84A6, + 0x252F, 0x84B6, 0x2530, 0x84BB, 0x2533, 0x84B1, 0x2534, 0x84A8, + 0x2537, 0x84B8, 0x2538, 0x84BD, 0x253B, 0x84B3, 0x253C, 0x84A9, + 0x253F, 0x84B9, 0x2542, 0x84BE, 0x254B, 0x84B4, 0x25A0, 0x81A1, + 0x25A1, 0x81A0, 0x25B2, 0x81A3, 0x25B3, 0x81A2, 0x25BC, 0x81A5, + 0x25BD, 0x81A4, 0x25C6, 0x819F, 0x25C7, 0x819E, 0x25CB, 0x819B, + 0x25CE, 0x819D, 0x25CF, 0x819C, 0x25EF, 0x81FC, 0x2605, 0x819A, + 0x2606, 0x8199, 0x2640, 0x818A, 0x2642, 0x8189, 0x266A, 0x81F4, + 0x266D, 0x81F3, 0x266F, 0x81F2, 0x3000, 0x8140, 0x3001, 0x8141, + 0x3002, 0x8142, 0x3003, 0x8156, 0x3005, 0x8158, 0x3006, 0x8159, + 0x3007, 0x815A, 0x3008, 0x8171, 0x3009, 0x8172, 0x300A, 0x8173, + 0x300B, 0x8174, 0x300C, 0x8175, 0x300D, 0x8176, 0x300E, 0x8177, + 0x300F, 0x8178, 0x3010, 0x8179, 0x3011, 0x817A, 0x3012, 0x81A7, + 0x3013, 0x81AC, 0x3014, 0x816B, 0x3015, 0x816C, 0x301D, 0x8780, + 0x301F, 0x8781, 0x3041, 0x829F, 0x3042, 0x82A0, 0x3043, 0x82A1, + 0x3044, 0x82A2, 0x3045, 0x82A3, 0x3046, 0x82A4, 0x3047, 0x82A5, + 0x3048, 0x82A6, 0x3049, 0x82A7, 0x304A, 0x82A8, 0x304B, 0x82A9, + 0x304C, 0x82AA, 0x304D, 0x82AB, 0x304E, 0x82AC, 0x304F, 0x82AD, + 0x3050, 0x82AE, 0x3051, 0x82AF, 0x3052, 0x82B0, 0x3053, 0x82B1, + 0x3054, 0x82B2, 0x3055, 0x82B3, 0x3056, 0x82B4, 0x3057, 0x82B5, + 0x3058, 0x82B6, 0x3059, 0x82B7, 0x305A, 0x82B8, 0x305B, 0x82B9, + 0x305C, 0x82BA, 0x305D, 0x82BB, 0x305E, 0x82BC, 0x305F, 0x82BD, + 0x3060, 0x82BE, 0x3061, 0x82BF, 0x3062, 0x82C0, 0x3063, 0x82C1, + 0x3064, 0x82C2, 0x3065, 0x82C3, 0x3066, 0x82C4, 0x3067, 0x82C5, + 0x3068, 0x82C6, 0x3069, 0x82C7, 0x306A, 0x82C8, 0x306B, 0x82C9, + 0x306C, 0x82CA, 0x306D, 0x82CB, 0x306E, 0x82CC, 0x306F, 0x82CD, + 0x3070, 0x82CE, 0x3071, 0x82CF, 0x3072, 0x82D0, 0x3073, 0x82D1, + 0x3074, 0x82D2, 0x3075, 0x82D3, 0x3076, 0x82D4, 0x3077, 0x82D5, + 0x3078, 0x82D6, 0x3079, 0x82D7, 0x307A, 0x82D8, 0x307B, 0x82D9, + 0x307C, 0x82DA, 0x307D, 0x82DB, 0x307E, 0x82DC, 0x307F, 0x82DD, + 0x3080, 0x82DE, 0x3081, 0x82DF, 0x3082, 0x82E0, 0x3083, 0x82E1, + 0x3084, 0x82E2, 0x3085, 0x82E3, 0x3086, 0x82E4, 0x3087, 0x82E5, + 0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9, + 0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED, + 0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1, + 0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, + 0x309E, 0x8155, 0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, + 0x30A4, 0x8343, 0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, + 0x30A8, 0x8347, 0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, + 0x30AC, 0x834B, 0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, + 0x30B0, 0x834F, 0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, + 0x30B4, 0x8353, 0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, + 0x30B8, 0x8357, 0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, + 0x30BC, 0x835B, 0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, + 0x30C0, 0x835F, 0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, + 0x30C4, 0x8363, 0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, + 0x30C8, 0x8367, 0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, + 0x30CC, 0x836B, 0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, + 0x30D0, 0x836F, 0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, + 0x30D4, 0x8373, 0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, + 0x30D8, 0x8377, 0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, + 0x30DC, 0x837B, 0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, + 0x30E0, 0x8380, 0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, + 0x30E4, 0x8384, 0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, + 0x30E8, 0x8388, 0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, + 0x30EC, 0x838C, 0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, + 0x30F0, 0x8390, 0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, + 0x30F4, 0x8394, 0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, + 0x30FC, 0x815B, 0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, + 0x3232, 0x878B, 0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, + 0x32A6, 0x8787, 0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, + 0x330D, 0x8769, 0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, + 0x3323, 0x876B, 0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, + 0x3336, 0x8766, 0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, + 0x334D, 0x8762, 0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, + 0x337C, 0x878F, 0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, + 0x338F, 0x8773, 0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, + 0x33A1, 0x8775, 0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, + 0x4E01, 0x929A, 0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, + 0x4E09, 0x8E4F, 0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, + 0x4E0E, 0x975E, 0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, + 0x4E15, 0x98A1, 0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, + 0x4E19, 0x95B8, 0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, + 0x4E28, 0xFA68, 0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, + 0x4E32, 0x8BF8, 0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, + 0x4E3B, 0x8EE5, 0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, + 0x4E43, 0x9454, 0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, + 0x4E4E, 0x8CC1, 0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, + 0x4E57, 0x8FE6, 0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, + 0x4E5E, 0x8CEE, 0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, + 0x4E73, 0x93FB, 0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, + 0x4E85, 0x98AB, 0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, + 0x4E8A, 0x98AD, 0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, + 0x4E91, 0x895D, 0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, + 0x4E98, 0x986A, 0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, + 0x4E9E, 0x98B1, 0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, + 0x4EA2, 0x98B4, 0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, + 0x4EA8, 0x8B9C, 0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, + 0x4EAE, 0x97BA, 0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, + 0x4EBA, 0x906C, 0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, + 0x4EC4, 0x98BA, 0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, + 0x4ECB, 0x89EE, 0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, + 0x4ED4, 0x8E65, 0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, + 0x4ED8, 0x9574, 0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, + 0x4EDF, 0x98C0, 0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, + 0x4EE5, 0x88C8, 0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, + 0x4EF2, 0x9287, 0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, + 0x4EFC, 0xFA6A, 0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, + 0x4F09, 0x98C2, 0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, + 0x4F0F, 0x959A, 0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, + 0x4F1C, 0x98E5, 0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, + 0x4F34, 0x94BA, 0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, + 0x4F3A, 0x8E66, 0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, + 0x4F46, 0x9241, 0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, + 0x4F4F, 0x8F5A, 0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, + 0x4F55, 0x89BD, 0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, + 0x4F5A, 0x98C3, 0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, + 0x4F5E, 0x9B43, 0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, + 0x4F73, 0x89C0, 0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, + 0x4F7C, 0x8CF1, 0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, + 0x4F88, 0x98CA, 0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, + 0x4F8F, 0x98CB, 0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, + 0x4F96, 0x98D3, 0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, + 0x4F9D, 0x88CB, 0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, + 0x4FAD, 0x9699, 0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, + 0x4FB6, 0x97B5, 0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, + 0x4FC4, 0x89E2, 0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, + 0x4FCE, 0x98D7, 0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, + 0x4FD7, 0x91AD, 0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, + 0x4FDD, 0x95DB, 0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, + 0x4FE4, 0x98DD, 0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, + 0x4FF3, 0x946F, 0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, + 0x4FFA, 0x89B4, 0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, + 0x5006, 0x98ED, 0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, + 0x500F, 0xE0C5, 0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, + 0x5016, 0x8CF4, 0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, + 0x501F, 0x8ED8, 0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, + 0x5024, 0x926C, 0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, + 0x5029, 0x98E8, 0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, + 0x502D, 0x9860, 0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, + 0x5042, 0xFA7A, 0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, + 0x5048, 0x98F3, 0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, + 0x5055, 0x98F1, 0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, + 0x5065, 0x8C92, 0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, + 0x5074, 0x91A4, 0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, + 0x507D, 0x8B55, 0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, + 0x5091, 0x8C86, 0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, + 0x509A, 0x98F9, 0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, + 0x50B3, 0x9942, 0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, + 0x50BE, 0x8C58, 0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, + 0x50CA, 0x9941, 0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, + 0x50D5, 0x966C, 0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, + 0x50DE, 0x9945, 0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, + 0x50ED, 0x9947, 0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, + 0x50F9, 0x994A, 0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, + 0x5102, 0x994E, 0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, + 0x5114, 0x9951, 0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, + 0x511A, 0x9952, 0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, + 0x5132, 0x96D7, 0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, + 0x513C, 0x9956, 0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, + 0x5143, 0x8CB3, 0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, + 0x5147, 0x8BA2, 0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, + 0x514B, 0x8D8E, 0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, + 0x5150, 0x8E99, 0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, + 0x515C, 0x8A95, 0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, + 0x5168, 0x9153, 0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, + 0x516C, 0x8CF6, 0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, + 0x5175, 0x95BA, 0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, + 0x517C, 0x8C93, 0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, + 0x5186, 0x897E, 0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, + 0x518D, 0x8DC4, 0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, + 0x5192, 0x9660, 0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, + 0x5197, 0x8FE7, 0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, + 0x51A2, 0x996E, 0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, + 0x51A8, 0x9579, 0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, + 0x51AC, 0x937E, 0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, + 0x51B3, 0x9972, 0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, + 0x51B7, 0x97E2, 0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, + 0x51C5, 0x9978, 0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, + 0x51CC, 0x97BD, 0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, + 0x51DC, 0xEAA3, 0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, + 0x51E6, 0x8F88, 0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, + 0x51EC, 0xFA83, 0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, + 0x51F5, 0x9981, 0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, + 0x51FA, 0x8F6F, 0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, + 0x5203, 0x906E, 0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, + 0x5208, 0x8AA0, 0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, + 0x5211, 0x8C59, 0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, + 0x521D, 0x8F89, 0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, + 0x5229, 0x9798, 0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, + 0x5233, 0x998A, 0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, + 0x5239, 0x998B, 0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, + 0x5244, 0x998D, 0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, + 0x524C, 0x998F, 0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, + 0x5256, 0x9655, 0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, + 0x5264, 0x8DDC, 0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, + 0x526F, 0x959B, 0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, + 0x5273, 0x9995, 0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, + 0x527F, 0x9996, 0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, + 0x5289, 0x97AB, 0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, + 0x5294, 0x9999, 0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, + 0x52A0, 0x89C1, 0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, + 0x52AA, 0x9377, 0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, + 0x52AF, 0xFB77, 0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, + 0x52B9, 0x8CF8, 0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, + 0x52C1, 0x99A4, 0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, + 0x52C9, 0x95D7, 0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, + 0x52D7, 0x99A6, 0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, + 0x52DD, 0x8F9F, 0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, + 0x52E2, 0x90A8, 0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, + 0x52E7, 0x8AA9, 0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, + 0x52F8, 0x99AE, 0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, + 0x52FF, 0x96DC, 0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, + 0x5305, 0x95EF, 0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, + 0x530D, 0x99B3, 0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, + 0x5316, 0x89BB, 0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, + 0x531D, 0x9178, 0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, + 0x5324, 0xFA8B, 0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, + 0x5333, 0x99BB, 0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, + 0x533B, 0x88E3, 0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, + 0x5343, 0x90E7, 0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, + 0x5348, 0x8CDF, 0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, + 0x5351, 0x94DA, 0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, + 0x5357, 0x93EC, 0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, + 0x535E, 0x99C4, 0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, + 0x536E, 0x99C6, 0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, + 0x5372, 0xFA8C, 0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, + 0x5377, 0x99C9, 0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, + 0x5382, 0x99CA, 0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, + 0x5398, 0x97D0, 0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, + 0x53A5, 0x99CE, 0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, + 0x53AD, 0x897D, 0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, + 0x53B3, 0x8CB5, 0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, + 0x53C3, 0x99D2, 0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, + 0x53CB, 0x9746, 0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, + 0x53D4, 0x8F66, 0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, + 0x53DB, 0x94BE, 0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, + 0x53E2, 0x9170, 0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, + 0x53E8, 0x99D9, 0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, + 0x53EC, 0x8FA2, 0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, + 0x53F0, 0x91E4, 0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, + 0x53F6, 0x8A90, 0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, + 0x5401, 0x99DC, 0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, + 0x5409, 0x8B67, 0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, + 0x540D, 0x96BC, 0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, + 0x5411, 0x8CFC, 0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, + 0x5420, 0x9669, 0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, + 0x542C, 0x99DF, 0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, + 0x5438, 0x8B7A, 0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, + 0x543D, 0x99DD, 0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, + 0x5446, 0x95F0, 0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, + 0x544E, 0x99E6, 0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, + 0x546A, 0x8EF4, 0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, + 0x5475, 0x99E8, 0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, + 0x547C, 0x8CC4, 0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, + 0x5486, 0x99F4, 0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, + 0x548E, 0x99E9, 0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, + 0x549C, 0xFA91, 0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, + 0x54A8, 0x99FC, 0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, + 0x54AF, 0x9A5D, 0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, + 0x54BC, 0x9A44, 0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, + 0x54C1, 0x9569, 0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, + 0x54C8, 0x99FB, 0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, + 0x54E2, 0x9A4E, 0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, + 0x54E9, 0x9689, 0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, + 0x54FA, 0x9A4D, 0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, + 0x5506, 0x8DB4, 0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, + 0x5514, 0x9A49, 0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, + 0x5531, 0x8FA5, 0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, + 0x553E, 0x91C1, 0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, + 0x5546, 0x8FA4, 0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, + 0x5556, 0x9A56, 0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, + 0x5563, 0x9A51, 0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, + 0x5580, 0x9A5C, 0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, + 0x5587, 0x9A68, 0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, + 0x5598, 0x9A62, 0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, + 0x559D, 0x8A85, 0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, + 0x55A8, 0x9A69, 0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, + 0x55AC, 0x8BAA, 0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, + 0x55C4, 0x9A6D, 0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, + 0x55DA, 0x9A6A, 0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, + 0x55E4, 0x9A6F, 0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, + 0x55FE, 0x9A74, 0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, + 0x5616, 0x9A73, 0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, + 0x5629, 0x89DC, 0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, + 0x5634, 0x9A7B, 0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, + 0x564C, 0x9158, 0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, + 0x5664, 0x9A81, 0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, + 0x566C, 0x9A83, 0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, + 0x5680, 0x9A86, 0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, + 0x568F, 0x9A8A, 0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, + 0x56A5, 0x9A8B, 0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, + 0x56BC, 0x9A90, 0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, + 0x56C3, 0x9A92, 0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, + 0x56D3, 0x9A97, 0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, + 0x56DB, 0x8E6C, 0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, + 0x56EE, 0x9A99, 0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, + 0x56F9, 0x9A9A, 0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, + 0x5700, 0x9A9B, 0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, + 0x5709, 0x9A9E, 0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, + 0x5712, 0x8980, 0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, + 0x571C, 0x9AA6, 0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, + 0x5728, 0x8DDD, 0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, + 0x5738, 0x9AA9, 0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, + 0x5747, 0x8BCF, 0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, + 0x5750, 0x8DBF, 0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, + 0x5764, 0x8DA3, 0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, + 0x576A, 0x92D8, 0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, + 0x5789, 0x9AB3, 0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, + 0x57A2, 0x8D43, 0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, + 0x57AC, 0xFA98, 0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, + 0x57C3, 0x9ABA, 0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, + 0x57CB, 0x9684, 0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, + 0x57D4, 0x9ABC, 0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, + 0x57E0, 0x9575, 0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, + 0x57F9, 0x947C, 0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, + 0x5802, 0x93B0, 0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, + 0x580B, 0x9AC2, 0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, + 0x5821, 0x9AC6, 0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, + 0x5830, 0x8981, 0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, + 0x583A, 0x8DE4, 0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, + 0x584A, 0x89F2, 0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, + 0x5854, 0x9383, 0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, + 0x585A, 0x92CB, 0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, + 0x586B, 0x9355, 0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, + 0x5879, 0x9ACD, 0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, + 0x5893, 0x95E6, 0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, + 0x589F, 0x9AD0, 0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, + 0x58B2, 0xFA9E, 0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, + 0x58BA, 0x9AD2, 0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, + 0x58C5, 0x9AD7, 0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, + 0x58D1, 0x9AD9, 0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, + 0x58D8, 0x9ADC, 0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, + 0x58DF, 0x9AE0, 0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, + 0x58EC, 0x9070, 0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, + 0x58F1, 0x88EB, 0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, + 0x58FA, 0x9AE2, 0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, + 0x5902, 0x9AE7, 0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, + 0x590F, 0x89C4, 0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, + 0x5918, 0x99C7, 0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, + 0x591C, 0x96E9, 0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, + 0x5929, 0x9356, 0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, + 0x592D, 0x9AEE, 0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, + 0x5937, 0x88CE, 0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, + 0x5947, 0x8AEF, 0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, + 0x594F, 0x9174, 0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, + 0x5954, 0x967A, 0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, + 0x595A, 0x9AF6, 0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, + 0x5962, 0x9AF8, 0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, + 0x5968, 0x8FA7, 0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, + 0x596E, 0x95B1, 0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, + 0x597D, 0x8D44, 0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, + 0x5984, 0x96CF, 0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, + 0x5996, 0x9764, 0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, + 0x59A3, 0x9B45, 0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, + 0x59AC, 0x9369, 0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, + 0x59BB, 0x8DC8, 0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, + 0x59CB, 0x8E6E, 0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, + 0x59D4, 0x88CF, 0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, + 0x59E5, 0x8957, 0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, + 0x59EB, 0x9550, 0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, + 0x5A01, 0x88D0, 0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, + 0x5A18, 0x96BA, 0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, + 0x5A20, 0x9050, 0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, + 0x5A35, 0x9B56, 0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, + 0x5A41, 0x984B, 0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, + 0x5A62, 0x9B58, 0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, + 0x5A7F, 0x96B9, 0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, + 0x5ABC, 0x9B5B, 0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, + 0x5AC2, 0x9B5E, 0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, + 0x5AD0, 0x9B6B, 0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, + 0x5AE3, 0x9B60, 0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, + 0x5AFB, 0x9B66, 0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, + 0x5B16, 0x9B69, 0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, + 0x5B30, 0x8964, 0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, + 0x5B40, 0x9B71, 0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, + 0x5B51, 0x9B72, 0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, + 0x5B57, 0x8E9A, 0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, + 0x5B5C, 0x8E79, 0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, + 0x5B64, 0x8CC7, 0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, + 0x5B6B, 0x91B7, 0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, + 0x5B75, 0x9B7A, 0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, + 0x5B83, 0x9B80, 0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, + 0x5B89, 0x88C0, 0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, + 0x5B8F, 0x8D47, 0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, + 0x5B99, 0x9288, 0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, + 0x5B9D, 0x95F3, 0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, + 0x5BA4, 0x8EBA, 0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, + 0x5BB0, 0x8DC9, 0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, + 0x5BB6, 0x89C6, 0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, + 0x5BC0, 0xFAA7, 0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, + 0x5BC5, 0x93D0, 0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, + 0x5BCC, 0x9578, 0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, + 0x5BD4, 0x9B86, 0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, + 0x5BDE, 0x9B8B, 0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, + 0x5BE4, 0x9B88, 0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, + 0x5BE8, 0x9ECB, 0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, + 0x5BEE, 0x97BE, 0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, + 0x5BF6, 0x9B8F, 0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, + 0x5BFF, 0x8EF5, 0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, + 0x5C05, 0x9B91, 0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, + 0x5C09, 0x88D1, 0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, + 0x5C0E, 0x93B1, 0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, + 0x5C16, 0x90EB, 0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, + 0x5C22, 0x9B97, 0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, + 0x5C31, 0x8F41, 0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, + 0x5C3B, 0x904B, 0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, + 0x5C3F, 0x9441, 0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, + 0x5C46, 0x9B9C, 0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, + 0x5C4D, 0x8E72, 0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, + 0x5C51, 0x8BFB, 0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, + 0x5C60, 0x936A, 0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, + 0x5C6C, 0x9BA2, 0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, + 0x5C76, 0x9BA5, 0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, + 0x5C91, 0x9BA8, 0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, + 0x5CA8, 0x915A, 0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, + 0x5CB1, 0x91D0, 0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, + 0x5CB8, 0x8ADD, 0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, + 0x5CBE, 0x9BB1, 0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, + 0x5CE0, 0x93BB, 0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, + 0x5CEA, 0x9BB9, 0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, + 0x5CF5, 0xFAAE, 0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, + 0x5CFD, 0x9BB5, 0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, + 0x5D11, 0x9BC0, 0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, + 0x5D17, 0x9BBC, 0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, + 0x5D1B, 0x9BBF, 0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, + 0x5D29, 0x95F6, 0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, + 0x5D4E, 0x9BC8, 0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, + 0x5D5C, 0x9BBD, 0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, + 0x5D6F, 0x8DB5, 0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, + 0x5D84, 0x9BCE, 0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, + 0x5D90, 0x9BD5, 0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, + 0x5DAE, 0x9BD3, 0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, + 0x5DBA, 0x97E4, 0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, + 0x5DCC, 0x8ADE, 0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, + 0x5DD3, 0x9BDA, 0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, + 0x5DDE, 0x8F42, 0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, + 0x5DE6, 0x8DB6, 0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, + 0x5DEE, 0x8DB7, 0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, + 0x5DF4, 0x9462, 0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, + 0x5DFD, 0x9246, 0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, + 0x5E06, 0x94BF, 0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, + 0x5E16, 0x929F, 0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, + 0x5E1D, 0x92E9, 0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, + 0x5E2F, 0x91D1, 0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, + 0x5E37, 0x9BE7, 0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, + 0x5E43, 0x9BE9, 0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, + 0x5E4C, 0x9679, 0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, + 0x5E57, 0x9BEC, 0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, + 0x5E63, 0x95BC, 0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, + 0x5E74, 0x944E, 0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, + 0x5E79, 0x8AB2, 0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, + 0x5E7D, 0x9748, 0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, + 0x5E83, 0x8D4C, 0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, + 0x5E8F, 0x8F98, 0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, + 0x5E9A, 0x8D4D, 0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, + 0x5EA7, 0x8DC0, 0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, + 0x5EB6, 0x8F8E, 0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, + 0x5EC2, 0x9BF9, 0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, + 0x5ECA, 0x984C, 0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, + 0x5ED6, 0x9C40, 0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, + 0x5EDF, 0x955F, 0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, + 0x5EE3, 0x9C41, 0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, + 0x5EF0, 0x9C4C, 0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, + 0x5EF6, 0x8984, 0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, + 0x5EFB, 0x89F4, 0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, + 0x5F01, 0x95D9, 0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, + 0x5F0A, 0x95BE, 0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, + 0x5F0F, 0x8EAE, 0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, + 0x5F14, 0x92A2, 0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, + 0x5F18, 0x8D4F, 0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, + 0x5F25, 0x96ED, 0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, + 0x5F2D, 0x9C58, 0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, + 0x5F35, 0x92A3, 0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, + 0x5F3E, 0x9265, 0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, + 0x5F4A, 0x8BAE, 0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, + 0x5F53, 0x9396, 0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, + 0x5F5C, 0x9C53, 0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, + 0x5F66, 0x9546, 0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, + 0x5F6B, 0x92A4, 0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, + 0x5F71, 0x8965, 0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, + 0x5F7C, 0x94DE, 0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, + 0x5F82, 0x9C68, 0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, + 0x5F87, 0x9C6D, 0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, + 0x5F8C, 0x8CE3, 0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, + 0x5F93, 0x8F5D, 0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, + 0x5F9E, 0x9C6E, 0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, + 0x5FA9, 0x959C, 0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, + 0x5FB3, 0x93BF, 0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, + 0x5FBC, 0x9C74, 0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, + 0x5FCC, 0x8AF5, 0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, + 0x5FD8, 0x9659, 0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, + 0x5FDE, 0xFABB, 0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, + 0x5FF0, 0x9CAB, 0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, + 0x5FFB, 0x9C76, 0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, + 0x600F, 0x9C89, 0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, + 0x6016, 0x957C, 0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, + 0x601D, 0x8E76, 0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, + 0x6026, 0x9C88, 0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, + 0x602A, 0x89F6, 0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, + 0x603A, 0x9C8A, 0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, + 0x6046, 0x9C91, 0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, + 0x6050, 0x8BB0, 0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, + 0x605A, 0x9C8B, 0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, + 0x6062, 0x89F8, 0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, + 0x6068, 0x8DA6, 0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, + 0x606C, 0x9C97, 0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, + 0x6075, 0x8C62, 0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, + 0x6084, 0x9C9F, 0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, + 0x608B, 0x9CA5, 0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, + 0x6094, 0x89F7, 0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, + 0x609B, 0x9CA0, 0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, + 0x60A6, 0x8978, 0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, + 0x60B2, 0x94DF, 0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, + 0x60B6, 0x96E3, 0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, + 0x60C5, 0x8FEE, 0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, + 0x60D3, 0x9CA9, 0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, + 0x60DC, 0x90C9, 0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, + 0x60E1, 0x9CA6, 0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, + 0x60F0, 0x91C4, 0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, + 0x60F4, 0x9CB6, 0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, + 0x60FA, 0x9CB7, 0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, + 0x6103, 0x9CB8, 0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, + 0x610D, 0x9CBC, 0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, + 0x6115, 0x9CB1, 0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, + 0x6120, 0xFAC1, 0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, + 0x612C, 0x9CC5, 0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, + 0x613C, 0x9CC4, 0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, + 0x6142, 0x9CC8, 0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, + 0x614A, 0x9CC2, 0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, + 0x614E, 0x9054, 0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, + 0x6159, 0x9CCD, 0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, + 0x6162, 0x969D, 0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, + 0x6168, 0x8A53, 0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, + 0x6170, 0x88D4, 0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, + 0x6175, 0x9CD7, 0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, + 0x6182, 0x974A, 0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, + 0x6190, 0x97F7, 0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, + 0x6198, 0xFAC6, 0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, + 0x61A7, 0x93B2, 0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, + 0x61AE, 0x9CE1, 0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, + 0x61BE, 0x8AB6, 0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, + 0x61C8, 0x9CE6, 0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, + 0x61CC, 0x9CE2, 0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, + 0x61E6, 0x9CED, 0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, + 0x61F7, 0x9CE5, 0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, + 0x61FD, 0x9CF3, 0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, + 0x6208, 0x9CF7, 0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, + 0x620D, 0x9CF9, 0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, + 0x6212, 0x89FA, 0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, + 0x621A, 0x90CA, 0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, + 0x621F, 0x8C81, 0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, + 0x622E, 0x9D43, 0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, + 0x6233, 0x9D46, 0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, + 0x623F, 0x965B, 0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, + 0x6248, 0xE7BB, 0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, + 0x624E, 0x9D48, 0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, + 0x625B, 0x9D4B, 0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, + 0x6268, 0x9D4D, 0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, + 0x6279, 0x94E1, 0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, + 0x6280, 0x8B5A, 0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, + 0x6289, 0x9D50, 0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, + 0x6293, 0x9D53, 0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, + 0x6297, 0x8D52, 0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, + 0x629E, 0x91F0, 0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, + 0x62B1, 0x95F8, 0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, + 0x62BC, 0x899F, 0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, + 0x62C6, 0x9D5D, 0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, + 0x62CA, 0x9D62, 0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, + 0x62D0, 0x89FB, 0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, + 0x62D4, 0x9D55, 0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, + 0x62DB, 0x8FB5, 0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, + 0x62E1, 0x8A67, 0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, + 0x62EF, 0x9D6D, 0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, + 0x62F6, 0x8E41, 0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, + 0x6301, 0x8E9D, 0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, + 0x6309, 0x88C2, 0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, + 0x631F, 0x8BB2, 0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, + 0x632F, 0x9055, 0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, + 0x633F, 0x917D, 0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, + 0x634F, 0x9D73, 0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, + 0x635C, 0x917B, 0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, + 0x636B, 0x9D7E, 0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, + 0x6377, 0x8FB7, 0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, + 0x6383, 0x917C, 0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, + 0x638E, 0x9D75, 0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, + 0x6398, 0x8C40, 0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, + 0x63A1, 0x8DCC, 0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, + 0x63A7, 0x8D54, 0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, + 0x63AB, 0x9D77, 0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, + 0x63B5, 0x9D7D, 0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, + 0x63C3, 0x91B5, 0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, + 0x63CF, 0x9560, 0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, + 0x63DA, 0x9767, 0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, + 0x63E9, 0x9D82, 0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, + 0x63F6, 0x9D88, 0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, + 0x640F, 0x9D93, 0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, + 0x641C, 0x9D72, 0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, + 0x642D, 0x938B, 0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, + 0x643E, 0x8DEF, 0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, + 0x6460, 0xFACA, 0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, + 0x6476, 0x9D96, 0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, + 0x6488, 0x9D9D, 0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, + 0x649A, 0x9451, 0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, + 0x64A5, 0x9D9B, 0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, + 0x64AE, 0x8E42, 0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, + 0x64BB, 0x9DA3, 0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, + 0x64C5, 0x9DA1, 0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, + 0x64D2, 0x9DA0, 0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, + 0x64E0, 0x9DA9, 0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, + 0x64E6, 0x8E43, 0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, + 0x64F1, 0x9DA6, 0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, + 0x64FA, 0x9DB2, 0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, + 0x6505, 0x9DB7, 0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, + 0x6523, 0x9DB9, 0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, + 0x652C, 0x9DAE, 0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, + 0x6536, 0x9DBE, 0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, + 0x653B, 0x8D55, 0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, + 0x6548, 0x9DC1, 0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, + 0x6551, 0x8B7E, 0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, + 0x6558, 0x9DC5, 0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, + 0x6562, 0x8AB8, 0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, + 0x6570, 0x9094, 0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, + 0x6577, 0x957E, 0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, + 0x6587, 0x95B6, 0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, + 0x658E, 0x8DD6, 0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, + 0x6599, 0x97BF, 0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, + 0x65A1, 0x88B4, 0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, + 0x65AB, 0x9DCF, 0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, + 0x65B0, 0x9056, 0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, + 0x65BD, 0x8E7B, 0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, + 0x65C5, 0x97B7, 0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, + 0x65CF, 0x91B0, 0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, + 0x65DB, 0x9DD7, 0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, + 0x65E5, 0x93FA, 0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, + 0x65E9, 0x9181, 0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, + 0x65FA, 0x89A0, 0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, + 0x6603, 0x9DDE, 0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, + 0x660A, 0x9DDD, 0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, + 0x6613, 0x88D5, 0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, + 0x661E, 0xFAD3, 0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, + 0x6625, 0x8F74, 0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, + 0x662E, 0xFAD2, 0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, + 0x6635, 0x9DE1, 0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, + 0x663F, 0x9E45, 0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, + 0x6644, 0x9DE6, 0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, + 0x6652, 0x8E4E, 0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, + 0x665E, 0x9DE9, 0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, + 0x6665, 0xFAD5, 0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, + 0x6669, 0x94D3, 0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, + 0x6673, 0xFAD9, 0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, + 0x6681, 0x8BC5, 0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, + 0x6688, 0x9DF2, 0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, + 0x6696, 0x9267, 0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, + 0x669D, 0x9DF7, 0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, + 0x66AB, 0x8E62, 0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, + 0x66B8, 0x9E41, 0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, + 0x66BF, 0xFADD, 0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, + 0x66C9, 0x9DFA, 0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, + 0x66DC, 0x976A, 0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, + 0x66E9, 0x9E47, 0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, + 0x66F4, 0x8D58, 0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, + 0x66F9, 0x9182, 0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, + 0x66FD, 0x915D, 0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, + 0x6703, 0x98F0, 0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, + 0x670D, 0x959E, 0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, + 0x6715, 0x92BD, 0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, + 0x671D, 0x92A9, 0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, + 0x6727, 0x9E4F, 0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, + 0x672C, 0x967B, 0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, + 0x6734, 0x9670, 0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, + 0x673A, 0x8AF7, 0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, + 0x6746, 0x9E57, 0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, + 0x6750, 0x8DDE, 0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, + 0x6759, 0x9E5A, 0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, + 0x6760, 0x9E59, 0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, + 0x6764, 0x9E5C, 0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, + 0x676D, 0x8D59, 0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, + 0x6772, 0x9DDC, 0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, + 0x677C, 0x9E60, 0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, + 0x6787, 0x94F8, 0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, + 0x6790, 0x90CD, 0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, + 0x679C, 0x89CA, 0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, + 0x67A2, 0x9095, 0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, + 0x67B3, 0x9E6B, 0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, + 0x67B8, 0x9E6D, 0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, + 0x67C1, 0x91C6, 0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, + 0x67CE, 0x9E74, 0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, + 0x67D3, 0x90F5, 0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, + 0x67DD, 0x9E70, 0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, + 0x67E7, 0x9E76, 0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, + 0x67EF, 0x9E68, 0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, + 0x67F5, 0x8DF2, 0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, + 0x6801, 0xFAE5, 0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, + 0x6813, 0x90F0, 0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, + 0x6821, 0x8D5A, 0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, + 0x682B, 0x9E81, 0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, + 0x6839, 0x8DAA, 0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, + 0x6841, 0x8C85, 0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, + 0x6846, 0x9E79, 0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, + 0x6850, 0x8BCB, 0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, + 0x6854, 0x8B6A, 0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, + 0x685F, 0x8E56, 0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, + 0x6876, 0x89B1, 0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, + 0x6881, 0x97C0, 0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, + 0x688F, 0x9E87, 0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, + 0x689B, 0x9E8B, 0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, + 0x68A2, 0x8FBD, 0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, + 0x68AD, 0x9E88, 0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, + 0x68B3, 0x9E80, 0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, + 0x68BA, 0x9E92, 0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, + 0x68C8, 0xFA64, 0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, + 0x68CD, 0x9E9E, 0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, + 0x68D5, 0x9EA1, 0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, + 0x68DF, 0x938F, 0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, + 0x68E7, 0x9EA0, 0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, + 0x68F9, 0x9EA8, 0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, + 0x6904, 0x9EA4, 0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, + 0x690C, 0x9E9D, 0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, + 0x6912, 0x9EA3, 0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, + 0x691C, 0x8C9F, 0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, + 0x6925, 0x9EA7, 0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, + 0x6930, 0x9EBD, 0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, + 0x693D, 0x9EBB, 0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, + 0x6954, 0x9EB6, 0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, + 0x695C, 0x9EB3, 0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, + 0x6961, 0x9EBE, 0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, + 0x696B, 0x9EB5, 0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, + 0x6973, 0x9480, 0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, + 0x6978, 0x9EB4, 0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, + 0x697E, 0x9EB7, 0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, + 0x698E, 0x897C, 0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, + 0x6998, 0xFAEB, 0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, + 0x69A7, 0x9ED0, 0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, + 0x69B4, 0x9ED6, 0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, + 0x69C1, 0x9EC7, 0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, + 0x69CB, 0x8D5C, 0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, + 0x69D0, 0x9EC5, 0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, + 0x69DD, 0x9ECD, 0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, + 0x69E8, 0x9ED8, 0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, + 0x69F9, 0x9EDD, 0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, + 0x6A02, 0x9ED9, 0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, + 0x6A0C, 0x9EEC, 0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, + 0x6A17, 0x9294, 0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, + 0x6A1F, 0x8FBE, 0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, + 0x6A29, 0x8CA0, 0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, + 0x6A30, 0xFAED, 0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, + 0x6A39, 0x8EF7, 0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, + 0x6A46, 0xFAEF, 0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, + 0x6A58, 0x8B6B, 0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, + 0x6A62, 0x9EF1, 0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, + 0x6A73, 0xFAF0, 0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, + 0x6A80, 0x9268, 0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, + 0x6A90, 0x9EF7, 0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, + 0x6AA2, 0x9EFB, 0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, + 0x6AAE, 0x9E8D, 0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, + 0x6AC1, 0x9EE8, 0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, + 0x6AD3, 0x9845, 0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, + 0x6ADF, 0x9F4A, 0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, + 0x6AEA, 0x9F4D, 0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, + 0x6B05, 0x9F4F, 0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, + 0x6B1D, 0x8954, 0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, + 0x6B23, 0x8BD3, 0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, + 0x6B38, 0x9F56, 0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, + 0x6B3E, 0x8ABC, 0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, + 0x6B4C, 0x89CC, 0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, + 0x6B54, 0x9F60, 0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, + 0x6B61, 0x9F63, 0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, + 0x6B66, 0x9590, 0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, + 0x6B73, 0x8DCE, 0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, + 0x6B7B, 0x8E80, 0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, + 0x6B84, 0x9F68, 0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, + 0x6B8B, 0x8E63, 0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, + 0x6B98, 0x9F6B, 0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, + 0x6BAB, 0x9F70, 0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, + 0x6BB3, 0x9F74, 0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, + 0x6BBA, 0x8E45, 0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, + 0x6BC0, 0x9ACA, 0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, + 0x6BCD, 0x95EA, 0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, + 0x6BD4, 0x94E4, 0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, + 0x6BDF, 0x9F7A, 0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, + 0x6BF3, 0x9F7D, 0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, + 0x6C13, 0x9F82, 0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, + 0x6C23, 0x9F86, 0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, + 0x6C38, 0x8969, 0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, + 0x6C41, 0x8F60, 0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, + 0x6C55, 0x9F88, 0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, + 0x6C5D, 0x93F0, 0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, + 0x6C62, 0x9F89, 0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, + 0x6C70, 0x91BF, 0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, + 0x6C7D, 0x8B44, 0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, + 0x6C83, 0x9780, 0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, + 0x6C8D, 0x9F8C, 0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, + 0x6C96, 0x89AB, 0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, + 0x6CA1, 0x9676, 0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, + 0x6CB1, 0x9F9D, 0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, + 0x6CBA, 0x9F9F, 0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, + 0x6CBE, 0x9F9E, 0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, + 0x6CC5, 0x9F9A, 0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, + 0x6CD3, 0x9F97, 0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, + 0x6CDA, 0xFAF9, 0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, + 0x6CE2, 0x9467, 0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, + 0x6CEA, 0x9FA3, 0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, + 0x6CF3, 0x896A, 0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, + 0x6D12, 0x9FAD, 0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, + 0x6D1E, 0x93B4, 0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, + 0x6D2A, 0x8D5E, 0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, + 0x6D35, 0x9FAB, 0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, + 0x6D3D, 0x9FA8, 0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, + 0x6D45, 0x90F3, 0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, + 0x6D63, 0x9FAF, 0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, + 0x6D6A, 0x9851, 0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, + 0x6D74, 0x9781, 0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, + 0x6D85, 0x9FB8, 0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, + 0x6D8E, 0x9FB5, 0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, + 0x6D99, 0x97DC, 0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, + 0x6DAF, 0x8A55, 0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, + 0x6DBC, 0x97C1, 0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, + 0x6DC7, 0x9FBD, 0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, + 0x6DD1, 0x8F69, 0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, + 0x6DD9, 0x9FC8, 0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, + 0x6DE6, 0x9FBE, 0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, + 0x6DEC, 0x9FC1, 0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, + 0x6DF3, 0x8F7E, 0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, + 0x6DF9, 0x9FB9, 0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, + 0x6E05, 0x90B4, 0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, + 0x6E0A, 0x9FBB, 0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, + 0x6E19, 0x9FD0, 0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, + 0x6E1F, 0x9FD9, 0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, + 0x6E24, 0x9FDD, 0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, + 0x6E29, 0x89B7, 0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, + 0x6E2E, 0x9FCF, 0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, + 0x6E3A, 0x9FDB, 0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, + 0x6E4A, 0x96A9, 0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, + 0x6E58, 0x8FC3, 0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, + 0x6E67, 0x974E, 0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, + 0x6E72, 0x9FD1, 0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, + 0x6E80, 0x969E, 0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, + 0x6E90, 0x8CB9, 0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, + 0x6E9D, 0x8D61, 0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, + 0x6EAA, 0x9FE2, 0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, + 0x6EB7, 0x9FE5, 0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, + 0x6EC2, 0x9FEF, 0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, + 0x6ECB, 0x8EA0, 0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, + 0x6ED4, 0x9FEB, 0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, + 0x6EEC, 0x9FF4, 0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, + 0x6EF7, 0xE042, 0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, + 0x6F01, 0x8B99, 0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, + 0x6F0F, 0x9852, 0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, + 0x6F15, 0x9186, 0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, + 0x6F2B, 0x969F, 0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, + 0x6F38, 0x9151, 0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, + 0x6F45, 0x8AC1, 0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, + 0x6F5C, 0x90F6, 0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, + 0x6F6D, 0xE04B, 0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, + 0x6F74, 0xE06B, 0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, + 0x6F80, 0xE047, 0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, + 0x6F86, 0xE043, 0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, + 0x6F97, 0x8AC0, 0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, + 0x6FAA, 0xE059, 0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, + 0x6FB9, 0xE057, 0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, + 0x6FC3, 0x945A, 0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, + 0x6FD8, 0xE05E, 0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, + 0x6FE1, 0x9447, 0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, + 0x6FEE, 0xE060, 0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, + 0x6FF5, 0xFB4D, 0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, + 0x7001, 0xE066, 0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, + 0x700B, 0xE063, 0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, + 0x7018, 0xE06D, 0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, + 0x701E, 0x93D2, 0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, + 0x7028, 0xFB50, 0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, + 0x703E, 0xE070, 0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, + 0x7063, 0xE073, 0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, + 0x7078, 0x8B84, 0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, + 0x7089, 0x9846, 0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, + 0x7099, 0xE074, 0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, + 0x70AE, 0xE07B, 0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, + 0x70B9, 0x935F, 0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, + 0x70CB, 0xE07D, 0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, + 0x70DF, 0xE07C, 0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, + 0x7104, 0xFB54, 0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, + 0x7119, 0xE084, 0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, + 0x7126, 0x8FC5, 0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, + 0x7147, 0xFB57, 0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, + 0x7155, 0xE086, 0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, + 0x7162, 0xE089, 0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, + 0x7167, 0x8FC6, 0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, + 0x717D, 0x90F8, 0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, + 0x718F, 0xE08D, 0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, + 0x719F, 0x8F6E, 0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, + 0x71B9, 0xE094, 0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, + 0x71C8, 0x9395, 0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, + 0x71D2, 0xE096, 0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, + 0x71DF, 0x9A7A, 0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, + 0x71E7, 0xE09C, 0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, + 0x71F5, 0xE09D, 0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, + 0x71FE, 0xFB5A, 0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, + 0x7210, 0xE0A2, 0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, + 0x722C, 0xE0A6, 0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, + 0x7235, 0x8EDD, 0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, + 0x723C, 0xE0AA, 0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, + 0x7240, 0xE0AC, 0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, + 0x724B, 0xE0AE, 0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, + 0x7259, 0x89E5, 0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, + 0x7261, 0x89B2, 0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, + 0x7272, 0x90B5, 0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, + 0x727E, 0xE0B1, 0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, + 0x7287, 0xE0B4, 0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, + 0x72A2, 0xE0B7, 0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, + 0x72B1, 0xFB5B, 0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, + 0x72BE, 0xFB5C, 0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, + 0x72C6, 0xE0BC, 0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, + 0x72D7, 0x8BE7, 0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, + 0x72E1, 0xE0C2, 0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, + 0x72ED, 0x8BB7, 0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, + 0x72FC, 0x9854, 0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, + 0x7317, 0xE0C6, 0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, + 0x731F, 0x97C2, 0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, + 0x732A, 0x9296, 0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, + 0x7334, 0xE0CB, 0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, + 0x733F, 0x898E, 0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, + 0x734F, 0xE0D1, 0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, + 0x736A, 0xE0D4, 0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, + 0x7377, 0xFB5F, 0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, + 0x7384, 0x8CBA, 0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, + 0x7396, 0x8BE8, 0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, + 0x73BB, 0xE0DE, 0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, + 0x73C8, 0xE0DB, 0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, + 0x73CE, 0xE0DD, 0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, + 0x73E0, 0x8EEC, 0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, + 0x73ED, 0x94C7, 0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, + 0x73F8, 0xE0E7, 0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, + 0x7406, 0x979D, 0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, + 0x7425, 0xE0E6, 0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, + 0x742E, 0xFB6A, 0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, + 0x7435, 0x94FA, 0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, + 0x7441, 0xE0EE, 0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, + 0x745B, 0x896C, 0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, + 0x7460, 0x97DA, 0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, + 0x7469, 0xE0F0, 0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, + 0x7473, 0x8DBA, 0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, + 0x7489, 0xFB6C, 0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, + 0x74A2, 0xE0E3, 0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, + 0x74CA, 0xE0F9, 0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, + 0x74E0, 0xE140, 0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, + 0x74E7, 0xE142, 0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, + 0x74F1, 0xE147, 0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, + 0x74F8, 0xE148, 0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, + 0x7505, 0xE14C, 0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, + 0x7511, 0x8D99, 0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, + 0x751A, 0x9072, 0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, + 0x7523, 0x8E59, 0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, + 0x752B, 0x95E1, 0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, + 0x7531, 0x9752, 0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, + 0x7538, 0x99B2, 0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, + 0x7544, 0xE156, 0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, + 0x754B, 0x9DC0, 0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, + 0x7551, 0x94A8, 0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, + 0x755B, 0xE15A, 0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, + 0x7562, 0x954C, 0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, + 0x7567, 0xE15F, 0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, + 0x756D, 0xE161, 0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, + 0x7574, 0xE166, 0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, + 0x757F, 0x8B45, 0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, + 0x7589, 0xE168, 0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, + 0x758F, 0x9160, 0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, + 0x759D, 0xE16C, 0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, + 0x75B1, 0xE176, 0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, + 0x75B8, 0xE174, 0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, + 0x75BE, 0x8EBE, 0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, + 0x75C7, 0x8FC7, 0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, + 0x75D4, 0x8EA4, 0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, + 0x75DB, 0x92C9, 0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, + 0x75E9, 0x9189, 0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, + 0x75F4, 0x9273, 0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, + 0x75FF, 0xE17E, 0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, + 0x760D, 0xE187, 0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, + 0x7622, 0xE18D, 0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, + 0x7634, 0xE18F, 0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, + 0x7647, 0xE192, 0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, + 0x7656, 0x95C8, 0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, + 0x7662, 0xE198, 0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, + 0x766A, 0xE19B, 0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, + 0x7676, 0xE1A0, 0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, + 0x767C, 0xE1A2, 0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, + 0x7682, 0xFB70, 0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, + 0x7687, 0x8D63, 0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, + 0x7690, 0x8E48, 0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, + 0x769A, 0xE1AB, 0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, + 0x76A6, 0xFB74, 0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, + 0x76B7, 0xEA89, 0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, + 0x76BF, 0x8E4D, 0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, + 0x76C8, 0x896D, 0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, + 0x76D6, 0xE1B3, 0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, + 0x76DE, 0xE1B5, 0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, + 0x76E4, 0x94D5, 0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, + 0x76EE, 0x96DA, 0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, + 0x76FB, 0xE1BB, 0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, + 0x7707, 0xE1BD, 0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, + 0x770C, 0x8CA7, 0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, + 0x7720, 0x96B0, 0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, + 0x7729, 0xE1BF, 0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, + 0x773C, 0x8AE1, 0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, + 0x775A, 0xE1C8, 0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, + 0x7765, 0xE1CC, 0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, + 0x7779, 0xE1CF, 0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, + 0x778E, 0xE1D0, 0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, + 0x77A5, 0x95CB, 0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, + 0x77B3, 0x93B5, 0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, + 0x77BC, 0xE1D9, 0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, + 0x77CD, 0xE1DD, 0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, + 0x77DC, 0xE1E0, 0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, + 0x77E7, 0x948A, 0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, + 0x77EF, 0x8BB8, 0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, + 0x780C, 0xE1E4, 0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, + 0x7820, 0xE1E7, 0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, + 0x7827, 0x8B6D, 0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, + 0x783F, 0x8D7B, 0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, + 0x7864, 0xFB7A, 0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, + 0x7872, 0x94A1, 0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, + 0x7881, 0x8CE9, 0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, + 0x788D, 0x8A56, 0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, + 0x7895, 0x8DEA, 0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, + 0x78A7, 0x95C9, 0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, + 0x78B5, 0xE1F1, 0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, + 0x78C1, 0x8EA5, 0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, + 0x78CB, 0xE1F6, 0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, + 0x78DA, 0xE241, 0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, + 0x78EF, 0x88E9, 0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, + 0x7907, 0xE244, 0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, + 0x7919, 0xE247, 0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, + 0x792C, 0xE248, 0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, + 0x793E, 0x8ED0, 0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, + 0x7948, 0x8B46, 0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, + 0x7955, 0xE24F, 0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, + 0x795D, 0x8F6A, 0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, + 0x7962, 0x9449, 0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, + 0x7977, 0x9398, 0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, + 0x7981, 0x8BD6, 0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, + 0x798D, 0x89D0, 0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, + 0x799B, 0xFB83, 0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, + 0x79AA, 0xE257, 0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, + 0x79B9, 0xE25A, 0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, + 0x79BF, 0x93C3, 0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, + 0x79CB, 0x8F48, 0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, + 0x79D8, 0x94E9, 0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, + 0x79E4, 0x9489, 0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, + 0x79EC, 0xE25F, 0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, + 0x7A08, 0xE262, 0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, + 0x7A14, 0x96AB, 0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, + 0x7A1A, 0x9274, 0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, + 0x7A2E, 0x8EED, 0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, + 0x7A3B, 0xE26A, 0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, + 0x7A3F, 0x8D65, 0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, + 0x7A46, 0x9673, 0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, + 0x7A4F, 0x89B8, 0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, + 0x7A62, 0xE271, 0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, + 0x7A70, 0xE274, 0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, + 0x7A7A, 0x8BF3, 0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, + 0x7A83, 0x90DE, 0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, + 0x7A93, 0x918B, 0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, + 0x7A98, 0xE27A, 0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, + 0x7AAE, 0x8B87, 0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, + 0x7ABA, 0x894D, 0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, + 0x7AC5, 0xE281, 0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, + 0x7ACB, 0x97A7, 0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, + 0x7AD2, 0x9AF2, 0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, + 0x7ADA, 0xE28C, 0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, + 0x7AE0, 0x8FCD, 0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, + 0x7AE5, 0x93B6, 0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, + 0x7AEB, 0xFB87, 0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, + 0x7AF6, 0x8BA3, 0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, + 0x7AFF, 0x8AC6, 0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, + 0x7B08, 0x8B88, 0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, + 0x7B11, 0x8FCE, 0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, + 0x7B1E, 0xE29A, 0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, + 0x7B28, 0xE29C, 0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, + 0x7B36, 0xE29D, 0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, + 0x7B48, 0x94A4, 0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, + 0x7B4D, 0xE2A1, 0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, + 0x7B52, 0x939B, 0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, + 0x7B65, 0xE2A6, 0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, + 0x7B70, 0xE2A9, 0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, + 0x7B7A, 0xE29F, 0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, + 0x7B8D, 0xE2B0, 0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, + 0x7B95, 0x96A5, 0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, + 0x7B9A, 0xE2B2, 0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, + 0x7B9F, 0xE2AF, 0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, + 0x7BB1, 0x94A0, 0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, + 0x7BC1, 0xE2B9, 0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, + 0x7BC9, 0x927A, 0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, + 0x7BDD, 0xE2BE, 0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, + 0x7BE6, 0xE2C2, 0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, + 0x7BF6, 0xE2CC, 0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, + 0x7C0D, 0xE2CB, 0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, + 0x7C14, 0xE2C1, 0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, + 0x7C23, 0xE2CD, 0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, + 0x7C37, 0xE2D1, 0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, + 0x7C3F, 0x95EB, 0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, + 0x7C4D, 0x90D0, 0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, + 0x7C56, 0xE2DD, 0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, + 0x7C64, 0xE2DC, 0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, + 0x7C75, 0xE2E0, 0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, + 0x7C83, 0xE2E1, 0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, + 0x7C90, 0xE2E2, 0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, + 0x7C98, 0x9453, 0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, + 0x7CA2, 0xE2E5, 0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, + 0x7CA8, 0xE2E8, 0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, + 0x7CB1, 0xE2EB, 0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, + 0x7CBD, 0xE2EE, 0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, + 0x7CC5, 0xE2F0, 0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, + 0x7CD6, 0x939C, 0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, + 0x7CDF, 0x918C, 0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, + 0x7CEF, 0xE2F7, 0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, + 0x7CF8, 0x8E85, 0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, + 0x7D00, 0x8B49, 0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, + 0x7D06, 0xE2FC, 0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, + 0x7D10, 0x9552, 0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, + 0x7D18, 0x8D68, 0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, + 0x7D1C, 0xE341, 0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, + 0x7D2B, 0x8E87, 0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, + 0x7D30, 0x8DD7, 0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, + 0x7D39, 0x8FD0, 0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, + 0x7D43, 0x8CBC, 0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, + 0x7D48, 0xFB8A, 0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, + 0x7D4F, 0xE351, 0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, + 0x7D5C, 0xFB8B, 0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, + 0x7D63, 0xE352, 0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, + 0x7D71, 0x939D, 0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, + 0x7D76, 0x90E2, 0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, + 0x7D8F, 0xE356, 0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, + 0x7D9B, 0xE358, 0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, + 0x7DA2, 0xE361, 0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, + 0x7DAD, 0x88DB, 0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, + 0x7DB1, 0x8D6A, 0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, + 0x7DB7, 0xFB8C, 0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, + 0x7DBD, 0xE35E, 0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, + 0x7DCA, 0x8BD9, 0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, + 0x7DD2, 0x8F8F, 0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, + 0x7DDA, 0x90FC, 0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, + 0x7DE0, 0x92F7, 0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, + 0x7DE9, 0x8AC9, 0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, + 0x7DF4, 0x97FB, 0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, + 0x7E05, 0xE36E, 0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, + 0x7E12, 0xE372, 0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, + 0x7E21, 0xE371, 0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, + 0x7E2B, 0x9644, 0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, + 0x7E35, 0xE37B, 0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, + 0x7E3B, 0xE37A, 0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, + 0x7E43, 0xE37D, 0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, + 0x7E4D, 0x8F4A, 0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, + 0x7E56, 0xE384, 0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, + 0x7E5E, 0xE385, 0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, + 0x7E6A, 0xE389, 0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, + 0x7E7B, 0xE38C, 0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, + 0x7E82, 0x8E5B, 0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, + 0x7E8A, 0xFA5C, 0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, + 0x7E90, 0xE396, 0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, + 0x7E96, 0xE399, 0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, + 0x7F38, 0xE39D, 0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, + 0x7F4C, 0xE3A0, 0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, + 0x7F51, 0xE3A4, 0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, + 0x7F5F, 0xE3A8, 0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, + 0x7F69, 0xE3AB, 0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, + 0x7F70, 0x94B1, 0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, + 0x7F78, 0xE3AD, 0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, + 0x7F85, 0x9785, 0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, + 0x7F8A, 0x9772, 0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, + 0x7F9A, 0xE3B7, 0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, + 0x7FA3, 0xE3B8, 0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, + 0x7FAE, 0xE3BC, 0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, + 0x7FB8, 0xE3BE, 0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, + 0x7FC5, 0xE3C0, 0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, + 0x7FD2, 0x8F4B, 0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, + 0x7FE1, 0xE3C5, 0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, + 0x7FF0, 0x8ACB, 0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, + 0x7FFC, 0x9783, 0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, + 0x8004, 0xE3CC, 0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, + 0x800C, 0x8EA7, 0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, + 0x8017, 0x96D5, 0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, + 0x8021, 0xE3D2, 0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, + 0x803B, 0xE3D5, 0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, + 0x804A, 0xE3D6, 0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, + 0x805A, 0xE3DA, 0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, + 0x8062, 0xE3DC, 0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, + 0x8072, 0xE3DF, 0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, + 0x8077, 0x9045, 0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, + 0x807F, 0xE3E4, 0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, + 0x8087, 0x94A3, 0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, + 0x8093, 0xE3E9, 0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, + 0x809B, 0xE3E8, 0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, + 0x80A5, 0x94EC, 0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, + 0x80AD, 0xE3EB, 0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, + 0x80B4, 0x8DE6, 0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, + 0x80C6, 0x925F, 0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, + 0x80D9, 0xE3F0, 0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, + 0x80DE, 0x9645, 0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, + 0x80EF, 0xE3F6, 0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, + 0x80FC, 0xE445, 0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, + 0x8106, 0x90C6, 0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, + 0x810A, 0x90D2, 0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, + 0x8129, 0xE3F9, 0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, + 0x8139, 0x92AF, 0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, + 0x814E, 0x9074, 0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, + 0x8154, 0x8D6F, 0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, + 0x8166, 0xE449, 0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, + 0x8171, 0xE446, 0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, + 0x817A, 0x9142, 0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, + 0x8183, 0xE44B, 0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, + 0x8193, 0xE455, 0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, + 0x819D, 0x9547, 0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, + 0x81A8, 0x9663, 0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, + 0x81B5, 0xE458, 0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, + 0x81BE, 0xE459, 0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, + 0x81C6, 0x89B0, 0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, + 0x81D1, 0xE461, 0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, + 0x81DA, 0xE465, 0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, + 0x81E5, 0x89E7, 0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, + 0x81ED, 0x8F4C, 0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, + 0x81FB, 0xE46A, 0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, + 0x8202, 0xE46D, 0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, + 0x8209, 0x9DA8, 0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, + 0x820E, 0x8EC9, 0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, + 0x8217, 0x95DC, 0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, + 0x821E, 0x9591, 0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, + 0x822B, 0xE475, 0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, + 0x8235, 0x91C7, 0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, + 0x8239, 0x9144, 0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, + 0x8259, 0xE479, 0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, + 0x8262, 0xE480, 0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, + 0x826A, 0xE482, 0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, + 0x8271, 0xE485, 0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, + 0x8278, 0xE487, 0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, + 0x8292, 0xE48A, 0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, + 0x82A5, 0x8A48, 0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, + 0x82AD, 0x946D, 0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, + 0x82B8, 0x8C7C, 0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, + 0x82C5, 0x8AA1, 0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, + 0x82D4, 0x91DB, 0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, + 0x82DC, 0xE49C, 0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, + 0x82E3, 0xE490, 0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, + 0x82EB, 0x93CF, 0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, + 0x82F9, 0xE499, 0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, + 0x8302, 0x96CE, 0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, + 0x8306, 0xE49B, 0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, + 0x8317, 0xE4AA, 0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, + 0x8328, 0x88EF, 0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, + 0x8332, 0xE4A2, 0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, + 0x8338, 0x91F9, 0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, + 0x8349, 0x9190, 0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, + 0x8352, 0x8D72, 0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, + 0x8375, 0xE4B9, 0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, + 0x837F, 0xFB95, 0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, + 0x838A, 0xE4B5, 0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, + 0x839A, 0xE4AD, 0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, + 0x83A2, 0xE4B0, 0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, + 0x83B1, 0x9789, 0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, + 0x83C5, 0x909B, 0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, + 0x83CE, 0xE4C0, 0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, + 0x83DC, 0x8DD8, 0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, + 0x83EB, 0xE4BF, 0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, + 0x83F2, 0xE4C9, 0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, + 0x83FB, 0xE4D0, 0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, + 0x8407, 0xE4C7, 0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, + 0x840E, 0x88DE, 0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, + 0x8429, 0x948B, 0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, + 0x8435, 0xE4E0, 0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, + 0x8446, 0xE4DC, 0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, + 0x8457, 0x9298, 0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, + 0x8463, 0x939F, 0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, + 0x846C, 0x9192, 0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, + 0x8471, 0x944B, 0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, + 0x847A, 0x9598, 0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, + 0x8490, 0x8F4E, 0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, + 0x849F, 0xE4E5, 0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, + 0x84B4, 0xFB99, 0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, + 0x84BC, 0x9193, 0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, + 0x84C6, 0xE4EC, 0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, + 0x84CD, 0xE4E7, 0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, + 0x84D9, 0xE4E6, 0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, + 0x84EE, 0x9840, 0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, + 0x8500, 0x8EC1, 0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, + 0x8514, 0xE4F7, 0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, + 0x851A, 0x8955, 0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, + 0x852C, 0xE4F4, 0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, + 0x8540, 0xE4F9, 0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, + 0x8549, 0x8FD4, 0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, + 0x8553, 0xFB9A, 0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, + 0x8559, 0xFB9B, 0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, + 0x8569, 0x93A0, 0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, + 0x8577, 0xE550, 0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, + 0x8587, 0xE54E, 0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, + 0x8591, 0xE547, 0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, + 0x859B, 0xE54C, 0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, + 0x85A8, 0xE549, 0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, + 0x85AC, 0x96F2, 0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, + 0x85B9, 0xE556, 0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, + 0x85CD, 0x9795, 0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, + 0x85DC, 0xE55B, 0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, + 0x85E9, 0x94CB, 0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, + 0x85FA, 0xE561, 0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, + 0x8606, 0xE562, 0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, + 0x8613, 0xE55E, 0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, + 0x8622, 0xE563, 0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, + 0x863F, 0xE566, 0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, + 0x8654, 0xE569, 0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, + 0x865E, 0x8BF1, 0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, + 0x8671, 0xE56C, 0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, + 0x868B, 0xE571, 0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, + 0x86A3, 0xE56E, 0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, + 0x86AB, 0xE57A, 0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, + 0x86C4, 0xE575, 0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, + 0x86CB, 0x9260, 0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, + 0x86D9, 0x8A5E, 0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, + 0x86E4, 0x94B8, 0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, + 0x86EE, 0x94D8, 0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, + 0x86FB, 0xE588, 0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, + 0x8703, 0xE587, 0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, + 0x870A, 0xE58D, 0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, + 0x8718, 0x9277, 0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, + 0x8729, 0xE593, 0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, + 0x873F, 0xE58F, 0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, + 0x874E, 0xE599, 0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, + 0x8759, 0xE59E, 0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, + 0x8766, 0x89DA, 0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, + 0x8774, 0xE59A, 0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, + 0x8782, 0xE5A5, 0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, + 0x87AB, 0xE5AC, 0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, + 0x87BB, 0xE5B1, 0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, + 0x87C6, 0xE5B0, 0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, + 0x87D2, 0xE5BB, 0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, + 0x87F6, 0xE5B8, 0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, + 0x87FE, 0xE5B7, 0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, + 0x880E, 0xE5BA, 0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, + 0x8816, 0xE5BD, 0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, + 0x8827, 0xE5C4, 0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, + 0x883B, 0xE5C5, 0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, + 0x8846, 0x8F4F, 0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, + 0x8853, 0x8F70, 0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, + 0x885D, 0x8FD5, 0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, + 0x8863, 0x88DF, 0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, + 0x8872, 0xE5D3, 0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, + 0x887E, 0xE5CE, 0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, + 0x8888, 0x8C55, 0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, + 0x8896, 0x91B3, 0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, + 0x88A2, 0xE5D9, 0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, + 0x88B0, 0xE5DC, 0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, + 0x88B7, 0x88BF, 0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, + 0x88C3, 0xE5DF, 0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, + 0x88D4, 0xE5E1, 0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, + 0x88DC, 0x95E2, 0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, + 0x88E8, 0xE5E9, 0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, + 0x88F5, 0xFBA2, 0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, + 0x88FD, 0x90BB, 0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, + 0x8907, 0x95A1, 0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, + 0x8912, 0x964A, 0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, + 0x891E, 0xE5F0, 0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, + 0x8936, 0xE5F7, 0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, + 0x8943, 0xE5EF, 0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, + 0x8956, 0x89A6, 0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, + 0x8964, 0xE641, 0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, + 0x896F, 0xE644, 0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, + 0x897E, 0xE647, 0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, + 0x8986, 0x95A2, 0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, + 0x898B, 0x8CA9, 0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, + 0x8997, 0x9460, 0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, + 0x89A6, 0xE64F, 0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, + 0x89AC, 0xE650, 0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, + 0x89BA, 0xE653, 0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, + 0x89D2, 0x8A70, 0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, + 0x89E3, 0x89F0, 0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, + 0x89F8, 0xE65C, 0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, + 0x8A08, 0x8C76, 0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, + 0x8A10, 0xE65F, 0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, + 0x8A17, 0x91F5, 0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, + 0x8A1F, 0x8FD7, 0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, + 0x8A2D, 0x90DD, 0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, + 0x8A36, 0xE664, 0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, + 0x8A3C, 0x8FD8, 0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, + 0x8A50, 0x8DBC, 0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, + 0x8A55, 0x955D, 0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, + 0x8A62, 0xE66D, 0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, + 0x8A6B, 0x986C, 0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, + 0x8A70, 0x8B6C, 0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, + 0x8A79, 0xFBA5, 0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, + 0x8A85, 0xE66E, 0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, + 0x8A8D, 0x9446, 0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, + 0x8A98, 0x9755, 0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, + 0x8AA1, 0xE672, 0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, + 0x8AA6, 0xE675, 0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, + 0x8AAD, 0x93C7, 0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, + 0x8ABC, 0x8B62, 0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, + 0x8AC4, 0xE678, 0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, + 0x8ACD, 0xE679, 0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, + 0x8ADA, 0xE67B, 0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, + 0x8ADF, 0xFBA8, 0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, + 0x8AE4, 0xE680, 0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, + 0x8AED, 0x9740, 0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, + 0x8AF6, 0xFBAA, 0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, + 0x8AFE, 0x91F8, 0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, + 0x8B04, 0x93A3, 0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, + 0x8B10, 0xE68D, 0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, + 0x8B19, 0x8CAA, 0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, + 0x8B20, 0xE68F, 0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, + 0x8B2B, 0xE693, 0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, + 0x8B3E, 0xE694, 0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, + 0x8B4E, 0xE699, 0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, + 0x8B58, 0x8EAF, 0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, + 0x8B5F, 0xE69F, 0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, + 0x8B6F, 0xE6A1, 0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, + 0x8B74, 0xE6A2, 0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, + 0x8B80, 0xE6A4, 0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, + 0x8B8E, 0xE6A6, 0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, + 0x8B96, 0xE6A9, 0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, + 0x8C3A, 0xE6AC, 0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, + 0x8C48, 0xE6AF, 0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, + 0x8C50, 0xE6B2, 0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, + 0x8C62, 0xE6B4, 0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, + 0x8C78, 0xE6B6, 0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, + 0x8C82, 0xE6B8, 0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, + 0x8C8C, 0x9665, 0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, + 0x8C98, 0xE6C0, 0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, + 0x8CA1, 0x8DE0, 0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, + 0x8CA9, 0x94CC, 0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, + 0x8CAD, 0xE6C2, 0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, + 0x8CB2, 0xE6C5, 0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, + 0x8CB7, 0x9483, 0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, + 0x8CBD, 0xE6C4, 0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, + 0x8CC2, 0x9847, 0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, + 0x8CC8, 0xE6C9, 0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, + 0x8CD1, 0x93F6, 0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, + 0x8CDC, 0x8E92, 0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, + 0x8CE3, 0xE6CC, 0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, + 0x8CED, 0x9371, 0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, + 0x8CFB, 0xE6D0, 0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, + 0x8D05, 0xE6D2, 0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, + 0x8D0B, 0x8AE4, 0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, + 0x8D12, 0xFBAF, 0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, + 0x8D64, 0x90D4, 0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, + 0x8D6D, 0xE6DE, 0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, + 0x8D74, 0x958B, 0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, + 0x8D85, 0x92B4, 0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, + 0x8DA8, 0x9096, 0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, + 0x8DC2, 0xE6E3, 0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, + 0x8DD6, 0xE6E8, 0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, + 0x8DDF, 0xE6EE, 0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, + 0x8DEA, 0xE6EC, 0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, + 0x8DF5, 0x9148, 0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, + 0x8E09, 0xE6F2, 0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, + 0x8E1D, 0xE6F4, 0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, + 0x8E30, 0xE6FA, 0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, + 0x8E44, 0x92FB, 0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, + 0x8E4A, 0xE6FC, 0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, + 0x8E59, 0xE745, 0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, + 0x8E64, 0xE746, 0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, + 0x8E7C, 0xE74D, 0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, + 0x8E87, 0xE74F, 0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, + 0x8E91, 0xE755, 0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, + 0x8EA1, 0xE759, 0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, + 0x8EAF, 0x8BEB, 0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, + 0x8EC5, 0xE75F, 0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, + 0x8ECB, 0xE761, 0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, + 0x8ED2, 0x8CAC, 0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, + 0x8EE3, 0xE763, 0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, + 0x8EFC, 0xE764, 0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, + 0x8F05, 0xE769, 0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, + 0x8F12, 0xE76B, 0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, + 0x8F19, 0xE76C, 0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, + 0x8F1F, 0xE76F, 0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, + 0x8F2F, 0x8F53, 0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, + 0x8F3B, 0xE774, 0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, + 0x8F44, 0x8A8D, 0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, + 0x8F4C, 0xE779, 0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, + 0x8F5C, 0xE77E, 0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, + 0x8F63, 0xE781, 0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, + 0x8F9E, 0x8EAB, 0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, + 0x8FA8, 0x999E, 0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, + 0x8FB0, 0x9243, 0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, + 0x8FBA, 0x95D3, 0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, + 0x8FC2, 0x8949, 0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, + 0x8FD1, 0x8BDF, 0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, + 0x8FE5, 0xE78A, 0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, + 0x8FEB, 0x9497, 0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, + 0x8FF4, 0xE78F, 0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, + 0x8FFA, 0xE792, 0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, + 0x9003, 0x93A6, 0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, + 0x900D, 0xE796, 0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, + 0x9011, 0xE793, 0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, + 0x9016, 0xE798, 0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, + 0x901D, 0x90C0, 0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, + 0x9021, 0xE795, 0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, + 0x902E, 0x91DF, 0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, + 0x9036, 0xE79B, 0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, + 0x903E, 0xE7A5, 0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, + 0x9047, 0x8BF6, 0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, + 0x904D, 0x95D5, 0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, + 0x9051, 0xE7A1, 0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, + 0x9055, 0x88E1, 0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, + 0x905C, 0x91BB, 0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, + 0x9063, 0x8CAD, 0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, + 0x9069, 0x934B, 0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, + 0x9072, 0xE7AD, 0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, + 0x9078, 0x9149, 0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, + 0x907F, 0x94F0, 0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, + 0x9083, 0xE284, 0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, + 0x908A, 0xE7B2, 0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, + 0x90A6, 0x964D, 0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, + 0x90B1, 0xE7B7, 0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, + 0x90CA, 0x8D78, 0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, + 0x90E1, 0x8C53, 0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, + 0x90ED, 0x8A73, 0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, + 0x9102, 0xE7BD, 0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, + 0x9127, 0xFBB9, 0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, + 0x9149, 0x93D1, 0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, + 0x914D, 0x947A, 0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, + 0x9156, 0xE7C3, 0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, + 0x9165, 0xE7C6, 0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, + 0x9172, 0xE7C9, 0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, + 0x9178, 0x8E5F, 0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, + 0x918B, 0xE7CA, 0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, + 0x9197, 0x94AE, 0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, + 0x91AA, 0xE7D0, 0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, + 0x91B5, 0xE7D1, 0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, + 0x91C1, 0xE7D5, 0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, + 0x91C9, 0xE7D6, 0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, + 0x91CE, 0x96EC, 0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, + 0x91D6, 0xE7D9, 0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, + 0x91DB, 0xE7DC, 0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, + 0x91DF, 0xE7DA, 0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, + 0x91E5, 0xFBC0, 0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, + 0x91EE, 0xFBBE, 0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, + 0x91FF, 0xE7E1, 0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, + 0x920E, 0x8A62, 0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, + 0x9215, 0xE7E4, 0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, + 0x9234, 0x97E9, 0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, + 0x923C, 0xFBC6, 0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, + 0x9245, 0xE7E8, 0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, + 0x924E, 0xFBC7, 0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, + 0x9259, 0xFBC8, 0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, + 0x9262, 0x94AB, 0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, + 0x9271, 0x8D7A, 0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, + 0x9280, 0x8BE2, 0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, + 0x9291, 0x914C, 0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, + 0x9298, 0x96C1, 0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, + 0x92A7, 0xFBCC, 0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, + 0x92CF, 0xE7F5, 0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, + 0x92D5, 0xFBD4, 0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, + 0x92E4, 0x8F9B, 0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, + 0x92ED, 0x8973, 0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, + 0x92F9, 0xFA65, 0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, + 0x92FF, 0xFBDC, 0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, + 0x9310, 0x908D, 0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, + 0x931D, 0xFBDD, 0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, + 0x9322, 0xE841, 0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, + 0x9328, 0x9564, 0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, + 0x932F, 0x8DF6, 0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, + 0x933B, 0xE846, 0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, + 0x934D, 0x9374, 0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, + 0x935B, 0x9262, 0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, + 0x936E, 0xE84A, 0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, + 0x937E, 0x8FDF, 0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, + 0x9397, 0x9199, 0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, + 0x93AC, 0xE84D, 0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, + 0x93B9, 0xE850, 0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, + 0x93D0, 0xE858, 0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, + 0x93D8, 0xE855, 0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, + 0x93E4, 0xE85A, 0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, + 0x9403, 0xE85E, 0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, + 0x9414, 0xE85C, 0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, + 0x9421, 0xE864, 0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, + 0x9436, 0xE861, 0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, + 0x9444, 0xE868, 0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, + 0x9452, 0xE867, 0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, + 0x945E, 0xE86C, 0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, + 0x9470, 0xE86F, 0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, + 0x947D, 0xE872, 0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, + 0x9577, 0x92B7, 0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, + 0x9587, 0xE879, 0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, + 0x958F, 0x895B, 0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, + 0x9594, 0xE87B, 0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, + 0x95A0, 0xE880, 0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, + 0x95A5, 0x94B4, 0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, + 0x95B2, 0x897B, 0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, + 0x95BE, 0xE887, 0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, + 0x95CC, 0xE88C, 0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, + 0x95D6, 0xE88F, 0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, + 0x95E2, 0xE893, 0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, + 0x9628, 0xE895, 0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, + 0x9632, 0x9668, 0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, + 0x9642, 0xE898, 0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, + 0x964D, 0x8D7E, 0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, + 0x965C, 0xE89D, 0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, + 0x9662, 0x8940, 0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, + 0x9666, 0xE8A1, 0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, + 0x9672, 0xE8A2, 0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, + 0x9677, 0xE89C, 0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, + 0x9685, 0x8BF7, 0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, + 0x968B, 0xE440, 0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, + 0x9694, 0x8A75, 0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, + 0x9699, 0x8C84, 0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, + 0x96A0, 0x8942, 0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, + 0x96AA, 0xE8A8, 0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, + 0x96B2, 0xE8AB, 0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, + 0x96B8, 0xE8AF, 0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, + 0x96C0, 0x909D, 0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, + 0x96C6, 0x8F57, 0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, + 0x96CC, 0x8E93, 0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, + 0x96D5, 0xE8B8, 0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, + 0x96DC, 0xE8B6, 0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, + 0x96EA, 0x90E1, 0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, + 0x96F6, 0x97EB, 0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, + 0x9700, 0x8EF9, 0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, + 0x9708, 0xE8BC, 0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, + 0x970F, 0xE8C0, 0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, + 0x9719, 0xE8C2, 0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, + 0x9727, 0x96B6, 0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, + 0x9733, 0xFBED, 0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, + 0x973D, 0xE8C7, 0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, + 0x9744, 0xE8C9, 0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, + 0x974D, 0xFBF0, 0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, + 0x9755, 0xFBF3, 0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, + 0x975E, 0x94F1, 0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, + 0x9764, 0xE8D0, 0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, + 0x976B, 0xE8D4, 0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, + 0x9779, 0xE8D6, 0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, + 0x9784, 0x8A93, 0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, + 0x978D, 0x88C6, 0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, + 0x979C, 0xE8DF, 0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, + 0x97A8, 0xE8E0, 0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, + 0x97B4, 0xE8E4, 0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, + 0x97CB, 0xE8E8, 0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, + 0x97EE, 0x9442, 0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, + 0x97F6, 0xE8EE, 0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, + 0x9802, 0x92B8, 0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, + 0x9808, 0x907B, 0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, + 0x9811, 0x8AE6, 0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, + 0x9818, 0x97CC, 0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, + 0x982C, 0x966A, 0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, + 0x9838, 0xE8F2, 0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, + 0x9846, 0xE8F7, 0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, + 0x984E, 0x8A7B, 0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, + 0x9857, 0xFBF4, 0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, + 0x9865, 0xFBF5, 0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, + 0x9870, 0xE8FC, 0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, + 0x98A8, 0x9597, 0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, + 0x98B6, 0xE946, 0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, + 0x98DB, 0x94F2, 0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, + 0x98E9, 0xE94A, 0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, + 0x98EF, 0x94D1, 0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, + 0x98FD, 0x964F, 0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, + 0x9909, 0xE94D, 0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, + 0x9912, 0xE94E, 0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, + 0x991D, 0xE952, 0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, + 0x9924, 0xE954, 0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, + 0x992E, 0xE957, 0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, + 0x9945, 0xE95C, 0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, + 0x9950, 0xE95D, 0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, + 0x9957, 0x8BC0, 0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, + 0x9999, 0x8D81, 0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, + 0x99AC, 0x946E, 0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, + 0x99B4, 0x93E9, 0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, + 0x99C5, 0x8977, 0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, + 0x99D1, 0xE96D, 0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, + 0x99DB, 0xE96A, 0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, + 0x99ED, 0xE96E, 0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, + 0x99F8, 0xE973, 0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, + 0x9A05, 0xE976, 0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, + 0x9A13, 0x8CB1, 0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, + 0x9A30, 0x93AB, 0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, + 0x9A42, 0xE97C, 0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, + 0x9A4E, 0xFBFB, 0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, + 0x9A5B, 0xE983, 0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, + 0x9A65, 0xE987, 0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, + 0x9AA8, 0x8D9C, 0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, + 0x9ABC, 0xE98E, 0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, + 0x9AD1, 0xE991, 0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, + 0x9AD9, 0xFBFC, 0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, + 0x9AE2, 0xE996, 0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, + 0x9AEB, 0xE99A, 0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, + 0x9AF1, 0xE99D, 0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, + 0x9B06, 0xE9A0, 0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, + 0x9B22, 0xE9A4, 0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, + 0x9B28, 0xE9A8, 0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, + 0x9B2F, 0xE9AC, 0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, + 0x9B3C, 0x8B53, 0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, + 0x9B44, 0xE9AE, 0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, + 0x9B4F, 0xE9B0, 0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, + 0x9B5A, 0x8B9B, 0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, + 0x9B75, 0xFC41, 0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, + 0x9B91, 0xE9B8, 0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, + 0x9B97, 0xE9BA, 0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, + 0x9BAA, 0x968E, 0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, + 0x9BB1, 0xFC44, 0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, + 0x9BC0, 0xE9BF, 0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, + 0x9BCF, 0xE9C3, 0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, + 0x9BD6, 0x8E49, 0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, + 0x9BE3, 0xE9C6, 0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, + 0x9BF1, 0xE9CD, 0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, + 0x9C04, 0xE9D8, 0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, + 0x9C0A, 0xE9D7, 0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, + 0x9C12, 0xE9D6, 0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, + 0x9C1B, 0xE9DA, 0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, + 0x9C2D, 0x9568, 0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, + 0x9C32, 0xE9E0, 0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, + 0x9C3E, 0xE9E2, 0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, + 0x9C52, 0x9690, 0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, + 0x9C67, 0xE9E5, 0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, + 0x9CE7, 0xE9E8, 0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, + 0x9CF0, 0xE9EA, 0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, + 0x9D03, 0xE9EE, 0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, + 0x9D09, 0xE9EB, 0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, + 0x9D1B, 0x8995, 0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, + 0x9D28, 0x8A9B, 0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, + 0x9D3B, 0x8D83, 0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, + 0x9D44, 0xE9F5, 0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, + 0x9D51, 0xEA43, 0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, + 0x9D5E, 0xEA41, 0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, + 0x9D6B, 0xFC48, 0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, + 0x9D72, 0xEA46, 0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, + 0x9D8F, 0x8C7B, 0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, + 0x9DAB, 0xEA49, 0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, + 0x9DB8, 0xEA53, 0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, + 0x9DC2, 0xEA57, 0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, + 0x9DD3, 0xEA59, 0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, + 0x9DEF, 0xEA5D, 0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, + 0x9DFA, 0x8DEB, 0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, + 0x9E1B, 0xEA60, 0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, + 0x9E79, 0xEA63, 0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, + 0x9E88, 0xEA66, 0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, + 0x9E92, 0xEA69, 0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, + 0x9E9D, 0xEA6C, 0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, + 0x9EA9, 0xEA6E, 0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, + 0x9EB9, 0x8D8D, 0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, + 0x9EBE, 0x9F80, 0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, + 0x9ECD, 0x8B6F, 0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, + 0x9ED1, 0xFC4B, 0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, + 0x9ED9, 0x96D9, 0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, + 0x9EDE, 0xEA79, 0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, + 0x9EEF, 0xEA7E, 0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, + 0x9EF9, 0xEA83, 0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, + 0x9F07, 0xEA87, 0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, + 0x9F15, 0xEA8A, 0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, + 0x9F3B, 0x9540, 0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, + 0x9F4E, 0xE6D8, 0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, + 0x9F5F, 0xEA92, 0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, + 0x9F63, 0xEA91, 0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, + 0x9F6C, 0xEA97, 0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, + 0x9F8D, 0x97B4, 0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, + 0x9FA0, 0xEA9E, 0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, + 0xFA0F, 0xFA9B, 0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, + 0xFA13, 0xFAE8, 0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, + 0xFA17, 0xFB75, 0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, + 0xFA1B, 0xFB82, 0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, + 0xFA1F, 0xFB9D, 0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, + 0xFA23, 0xFBB1, 0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, + 0xFA27, 0xFBD3, 0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, + 0xFA2B, 0xFBF7, 0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, + 0xFF02, 0xFA57, 0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, + 0xFF06, 0x8195, 0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, + 0xFF0A, 0x8196, 0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, + 0xFF0E, 0x8144, 0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, + 0xFF12, 0x8251, 0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, + 0xFF16, 0x8255, 0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, + 0xFF1A, 0x8146, 0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, + 0xFF1E, 0x8184, 0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, + 0xFF22, 0x8261, 0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, + 0xFF26, 0x8265, 0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, + 0xFF2A, 0x8269, 0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, + 0xFF2E, 0x826D, 0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, + 0xFF32, 0x8271, 0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, + 0xFF36, 0x8275, 0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, + 0xFF3A, 0x8279, 0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, + 0xFF3E, 0x814F, 0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, + 0xFF42, 0x8282, 0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, + 0xFF46, 0x8286, 0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, + 0xFF4A, 0x828A, 0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, + 0xFF4E, 0x828E, 0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, + 0xFF52, 0x8292, 0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, + 0xFF56, 0x8296, 0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, + 0xFF5A, 0x829A, 0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, + 0xFF5E, 0x8160, 0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, + 0xFF64, 0x00A4, 0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, + 0xFF68, 0x00A8, 0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, + 0xFF6C, 0x00AC, 0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, + 0xFF70, 0x00B0, 0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, + 0xFF74, 0x00B4, 0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, + 0xFF78, 0x00B8, 0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, + 0xFF7C, 0x00BC, 0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, + 0xFF80, 0x00C0, 0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, + 0xFF84, 0x00C4, 0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, + 0xFF88, 0x00C8, 0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, + 0xFF8C, 0x00CC, 0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, + 0xFF90, 0x00D0, 0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, + 0xFF94, 0x00D4, 0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, + 0xFF98, 0x00D8, 0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, + 0xFF9C, 0x00DC, 0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, + 0xFFE0, 0x8191, 0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, + 0xFFE4, 0xFA55, 0xFFE5, 0x818F, 0, 0 +}; + +#if !_TINY_TABLE +static +const WCHAR sjis2uni[] = { +/* SJIS - Unicode, SJIS - Unicode, SJIS - Unicode, SJIS - Unicode, */ + 0x00A1, 0xFF61, 0x00A2, 0xFF62, 0x00A3, 0xFF63, 0x00A4, 0xFF64, + 0x00A5, 0xFF65, 0x00A6, 0xFF66, 0x00A7, 0xFF67, 0x00A8, 0xFF68, + 0x00A9, 0xFF69, 0x00AA, 0xFF6A, 0x00AB, 0xFF6B, 0x00AC, 0xFF6C, + 0x00AD, 0xFF6D, 0x00AE, 0xFF6E, 0x00AF, 0xFF6F, 0x00B0, 0xFF70, + 0x00B1, 0xFF71, 0x00B2, 0xFF72, 0x00B3, 0xFF73, 0x00B4, 0xFF74, + 0x00B5, 0xFF75, 0x00B6, 0xFF76, 0x00B7, 0xFF77, 0x00B8, 0xFF78, + 0x00B9, 0xFF79, 0x00BA, 0xFF7A, 0x00BB, 0xFF7B, 0x00BC, 0xFF7C, + 0x00BD, 0xFF7D, 0x00BE, 0xFF7E, 0x00BF, 0xFF7F, 0x00C0, 0xFF80, + 0x00C1, 0xFF81, 0x00C2, 0xFF82, 0x00C3, 0xFF83, 0x00C4, 0xFF84, + 0x00C5, 0xFF85, 0x00C6, 0xFF86, 0x00C7, 0xFF87, 0x00C8, 0xFF88, + 0x00C9, 0xFF89, 0x00CA, 0xFF8A, 0x00CB, 0xFF8B, 0x00CC, 0xFF8C, + 0x00CD, 0xFF8D, 0x00CE, 0xFF8E, 0x00CF, 0xFF8F, 0x00D0, 0xFF90, + 0x00D1, 0xFF91, 0x00D2, 0xFF92, 0x00D3, 0xFF93, 0x00D4, 0xFF94, + 0x00D5, 0xFF95, 0x00D6, 0xFF96, 0x00D7, 0xFF97, 0x00D8, 0xFF98, + 0x00D9, 0xFF99, 0x00DA, 0xFF9A, 0x00DB, 0xFF9B, 0x00DC, 0xFF9C, + 0x00DD, 0xFF9D, 0x00DE, 0xFF9E, 0x00DF, 0xFF9F, 0x8140, 0x3000, + 0x8141, 0x3001, 0x8142, 0x3002, 0x8143, 0xFF0C, 0x8144, 0xFF0E, + 0x8145, 0x30FB, 0x8146, 0xFF1A, 0x8147, 0xFF1B, 0x8148, 0xFF1F, + 0x8149, 0xFF01, 0x814A, 0x309B, 0x814B, 0x309C, 0x814C, 0x00B4, + 0x814D, 0xFF40, 0x814E, 0x00A8, 0x814F, 0xFF3E, 0x8150, 0xFFE3, + 0x8151, 0xFF3F, 0x8152, 0x30FD, 0x8153, 0x30FE, 0x8154, 0x309D, + 0x8155, 0x309E, 0x8156, 0x3003, 0x8157, 0x4EDD, 0x8158, 0x3005, + 0x8159, 0x3006, 0x815A, 0x3007, 0x815B, 0x30FC, 0x815C, 0x2015, + 0x815D, 0x2010, 0x815E, 0xFF0F, 0x815F, 0xFF3C, 0x8160, 0xFF5E, + 0x8161, 0x2225, 0x8162, 0xFF5C, 0x8163, 0x2026, 0x8164, 0x2025, + 0x8165, 0x2018, 0x8166, 0x2019, 0x8167, 0x201C, 0x8168, 0x201D, + 0x8169, 0xFF08, 0x816A, 0xFF09, 0x816B, 0x3014, 0x816C, 0x3015, + 0x816D, 0xFF3B, 0x816E, 0xFF3D, 0x816F, 0xFF5B, 0x8170, 0xFF5D, + 0x8171, 0x3008, 0x8172, 0x3009, 0x8173, 0x300A, 0x8174, 0x300B, + 0x8175, 0x300C, 0x8176, 0x300D, 0x8177, 0x300E, 0x8178, 0x300F, + 0x8179, 0x3010, 0x817A, 0x3011, 0x817B, 0xFF0B, 0x817C, 0xFF0D, + 0x817D, 0x00B1, 0x817E, 0x00D7, 0x8180, 0x00F7, 0x8181, 0xFF1D, + 0x8182, 0x2260, 0x8183, 0xFF1C, 0x8184, 0xFF1E, 0x8185, 0x2266, + 0x8186, 0x2267, 0x8187, 0x221E, 0x8188, 0x2234, 0x8189, 0x2642, + 0x818A, 0x2640, 0x818B, 0x00B0, 0x818C, 0x2032, 0x818D, 0x2033, + 0x818E, 0x2103, 0x818F, 0xFFE5, 0x8190, 0xFF04, 0x8191, 0xFFE0, + 0x8192, 0xFFE1, 0x8193, 0xFF05, 0x8194, 0xFF03, 0x8195, 0xFF06, + 0x8196, 0xFF0A, 0x8197, 0xFF20, 0x8198, 0x00A7, 0x8199, 0x2606, + 0x819A, 0x2605, 0x819B, 0x25CB, 0x819C, 0x25CF, 0x819D, 0x25CE, + 0x819E, 0x25C7, 0x819F, 0x25C6, 0x81A0, 0x25A1, 0x81A1, 0x25A0, + 0x81A2, 0x25B3, 0x81A3, 0x25B2, 0x81A4, 0x25BD, 0x81A5, 0x25BC, + 0x81A6, 0x203B, 0x81A7, 0x3012, 0x81A8, 0x2192, 0x81A9, 0x2190, + 0x81AA, 0x2191, 0x81AB, 0x2193, 0x81AC, 0x3013, 0x81B8, 0x2208, + 0x81B9, 0x220B, 0x81BA, 0x2286, 0x81BB, 0x2287, 0x81BC, 0x2282, + 0x81BD, 0x2283, 0x81BE, 0x222A, 0x81BF, 0x2229, 0x81C8, 0x2227, + 0x81C9, 0x2228, 0x81CA, 0xFFE2, 0x81CB, 0x21D2, 0x81CC, 0x21D4, + 0x81CD, 0x2200, 0x81CE, 0x2203, 0x81DA, 0x2220, 0x81DB, 0x22A5, + 0x81DC, 0x2312, 0x81DD, 0x2202, 0x81DE, 0x2207, 0x81DF, 0x2261, + 0x81E0, 0x2252, 0x81E1, 0x226A, 0x81E2, 0x226B, 0x81E3, 0x221A, + 0x81E4, 0x223D, 0x81E5, 0x221D, 0x81E6, 0x2235, 0x81E7, 0x222B, + 0x81E8, 0x222C, 0x81F0, 0x212B, 0x81F1, 0x2030, 0x81F2, 0x266F, + 0x81F3, 0x266D, 0x81F4, 0x266A, 0x81F5, 0x2020, 0x81F6, 0x2021, + 0x81F7, 0x00B6, 0x81FC, 0x25EF, 0x824F, 0xFF10, 0x8250, 0xFF11, + 0x8251, 0xFF12, 0x8252, 0xFF13, 0x8253, 0xFF14, 0x8254, 0xFF15, + 0x8255, 0xFF16, 0x8256, 0xFF17, 0x8257, 0xFF18, 0x8258, 0xFF19, + 0x8260, 0xFF21, 0x8261, 0xFF22, 0x8262, 0xFF23, 0x8263, 0xFF24, + 0x8264, 0xFF25, 0x8265, 0xFF26, 0x8266, 0xFF27, 0x8267, 0xFF28, + 0x8268, 0xFF29, 0x8269, 0xFF2A, 0x826A, 0xFF2B, 0x826B, 0xFF2C, + 0x826C, 0xFF2D, 0x826D, 0xFF2E, 0x826E, 0xFF2F, 0x826F, 0xFF30, + 0x8270, 0xFF31, 0x8271, 0xFF32, 0x8272, 0xFF33, 0x8273, 0xFF34, + 0x8274, 0xFF35, 0x8275, 0xFF36, 0x8276, 0xFF37, 0x8277, 0xFF38, + 0x8278, 0xFF39, 0x8279, 0xFF3A, 0x8281, 0xFF41, 0x8282, 0xFF42, + 0x8283, 0xFF43, 0x8284, 0xFF44, 0x8285, 0xFF45, 0x8286, 0xFF46, + 0x8287, 0xFF47, 0x8288, 0xFF48, 0x8289, 0xFF49, 0x828A, 0xFF4A, + 0x828B, 0xFF4B, 0x828C, 0xFF4C, 0x828D, 0xFF4D, 0x828E, 0xFF4E, + 0x828F, 0xFF4F, 0x8290, 0xFF50, 0x8291, 0xFF51, 0x8292, 0xFF52, + 0x8293, 0xFF53, 0x8294, 0xFF54, 0x8295, 0xFF55, 0x8296, 0xFF56, + 0x8297, 0xFF57, 0x8298, 0xFF58, 0x8299, 0xFF59, 0x829A, 0xFF5A, + 0x829F, 0x3041, 0x82A0, 0x3042, 0x82A1, 0x3043, 0x82A2, 0x3044, + 0x82A3, 0x3045, 0x82A4, 0x3046, 0x82A5, 0x3047, 0x82A6, 0x3048, + 0x82A7, 0x3049, 0x82A8, 0x304A, 0x82A9, 0x304B, 0x82AA, 0x304C, + 0x82AB, 0x304D, 0x82AC, 0x304E, 0x82AD, 0x304F, 0x82AE, 0x3050, + 0x82AF, 0x3051, 0x82B0, 0x3052, 0x82B1, 0x3053, 0x82B2, 0x3054, + 0x82B3, 0x3055, 0x82B4, 0x3056, 0x82B5, 0x3057, 0x82B6, 0x3058, + 0x82B7, 0x3059, 0x82B8, 0x305A, 0x82B9, 0x305B, 0x82BA, 0x305C, + 0x82BB, 0x305D, 0x82BC, 0x305E, 0x82BD, 0x305F, 0x82BE, 0x3060, + 0x82BF, 0x3061, 0x82C0, 0x3062, 0x82C1, 0x3063, 0x82C2, 0x3064, + 0x82C3, 0x3065, 0x82C4, 0x3066, 0x82C5, 0x3067, 0x82C6, 0x3068, + 0x82C7, 0x3069, 0x82C8, 0x306A, 0x82C9, 0x306B, 0x82CA, 0x306C, + 0x82CB, 0x306D, 0x82CC, 0x306E, 0x82CD, 0x306F, 0x82CE, 0x3070, + 0x82CF, 0x3071, 0x82D0, 0x3072, 0x82D1, 0x3073, 0x82D2, 0x3074, + 0x82D3, 0x3075, 0x82D4, 0x3076, 0x82D5, 0x3077, 0x82D6, 0x3078, + 0x82D7, 0x3079, 0x82D8, 0x307A, 0x82D9, 0x307B, 0x82DA, 0x307C, + 0x82DB, 0x307D, 0x82DC, 0x307E, 0x82DD, 0x307F, 0x82DE, 0x3080, + 0x82DF, 0x3081, 0x82E0, 0x3082, 0x82E1, 0x3083, 0x82E2, 0x3084, + 0x82E3, 0x3085, 0x82E4, 0x3086, 0x82E5, 0x3087, 0x82E6, 0x3088, + 0x82E7, 0x3089, 0x82E8, 0x308A, 0x82E9, 0x308B, 0x82EA, 0x308C, + 0x82EB, 0x308D, 0x82EC, 0x308E, 0x82ED, 0x308F, 0x82EE, 0x3090, + 0x82EF, 0x3091, 0x82F0, 0x3092, 0x82F1, 0x3093, 0x8340, 0x30A1, + 0x8341, 0x30A2, 0x8342, 0x30A3, 0x8343, 0x30A4, 0x8344, 0x30A5, + 0x8345, 0x30A6, 0x8346, 0x30A7, 0x8347, 0x30A8, 0x8348, 0x30A9, + 0x8349, 0x30AA, 0x834A, 0x30AB, 0x834B, 0x30AC, 0x834C, 0x30AD, + 0x834D, 0x30AE, 0x834E, 0x30AF, 0x834F, 0x30B0, 0x8350, 0x30B1, + 0x8351, 0x30B2, 0x8352, 0x30B3, 0x8353, 0x30B4, 0x8354, 0x30B5, + 0x8355, 0x30B6, 0x8356, 0x30B7, 0x8357, 0x30B8, 0x8358, 0x30B9, + 0x8359, 0x30BA, 0x835A, 0x30BB, 0x835B, 0x30BC, 0x835C, 0x30BD, + 0x835D, 0x30BE, 0x835E, 0x30BF, 0x835F, 0x30C0, 0x8360, 0x30C1, + 0x8361, 0x30C2, 0x8362, 0x30C3, 0x8363, 0x30C4, 0x8364, 0x30C5, + 0x8365, 0x30C6, 0x8366, 0x30C7, 0x8367, 0x30C8, 0x8368, 0x30C9, + 0x8369, 0x30CA, 0x836A, 0x30CB, 0x836B, 0x30CC, 0x836C, 0x30CD, + 0x836D, 0x30CE, 0x836E, 0x30CF, 0x836F, 0x30D0, 0x8370, 0x30D1, + 0x8371, 0x30D2, 0x8372, 0x30D3, 0x8373, 0x30D4, 0x8374, 0x30D5, + 0x8375, 0x30D6, 0x8376, 0x30D7, 0x8377, 0x30D8, 0x8378, 0x30D9, + 0x8379, 0x30DA, 0x837A, 0x30DB, 0x837B, 0x30DC, 0x837C, 0x30DD, + 0x837D, 0x30DE, 0x837E, 0x30DF, 0x8380, 0x30E0, 0x8381, 0x30E1, + 0x8382, 0x30E2, 0x8383, 0x30E3, 0x8384, 0x30E4, 0x8385, 0x30E5, + 0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9, + 0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED, + 0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1, + 0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4, + 0x8395, 0x30F5, 0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, + 0x83A1, 0x0393, 0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, + 0x83A5, 0x0397, 0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, + 0x83A9, 0x039B, 0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, + 0x83AD, 0x039F, 0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, + 0x83B1, 0x03A4, 0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, + 0x83B5, 0x03A8, 0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, + 0x83C1, 0x03B3, 0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, + 0x83C5, 0x03B7, 0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, + 0x83C9, 0x03BB, 0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, + 0x83CD, 0x03BF, 0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, + 0x83D1, 0x03C4, 0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, + 0x83D5, 0x03C8, 0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, + 0x8442, 0x0412, 0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, + 0x8446, 0x0401, 0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, + 0x844A, 0x0419, 0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, + 0x844E, 0x041D, 0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, + 0x8452, 0x0421, 0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, + 0x8456, 0x0425, 0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, + 0x845A, 0x0429, 0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, + 0x845E, 0x042D, 0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, + 0x8471, 0x0431, 0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, + 0x8475, 0x0435, 0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, + 0x8479, 0x0438, 0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, + 0x847D, 0x043C, 0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, + 0x8482, 0x0440, 0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, + 0x8486, 0x0444, 0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, + 0x848A, 0x0448, 0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, + 0x848E, 0x044C, 0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, + 0x849F, 0x2500, 0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, + 0x84A3, 0x2518, 0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, + 0x84A7, 0x2524, 0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, + 0x84AB, 0x2503, 0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, + 0x84AF, 0x2517, 0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, + 0x84B3, 0x253B, 0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, + 0x84B7, 0x2528, 0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, + 0x84BB, 0x2530, 0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, + 0x8740, 0x2460, 0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, + 0x8744, 0x2464, 0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, + 0x8748, 0x2468, 0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, + 0x874C, 0x246C, 0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, + 0x8750, 0x2470, 0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, + 0x8754, 0x2160, 0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, + 0x8758, 0x2164, 0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, + 0x875C, 0x2168, 0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, + 0x8761, 0x3322, 0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, + 0x8765, 0x3303, 0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, + 0x8769, 0x330D, 0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, + 0x876D, 0x334A, 0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, + 0x8771, 0x339E, 0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, + 0x8775, 0x33A1, 0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, + 0x8782, 0x2116, 0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, + 0x8786, 0x32A5, 0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, + 0x878A, 0x3231, 0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, + 0x878E, 0x337D, 0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, + 0x8798, 0x221F, 0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, + 0x88A1, 0x5A03, 0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, + 0x88A5, 0x6328, 0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, + 0x88A9, 0x831C, 0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, + 0x88AD, 0x6E25, 0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, + 0x88B1, 0x9BF5, 0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, + 0x88B5, 0x6271, 0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, + 0x88B9, 0x98F4, 0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, + 0x88BD, 0x6216, 0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, + 0x88C1, 0x5EB5, 0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, + 0x88C5, 0x95C7, 0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, + 0x88C9, 0x4F0A, 0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, + 0x88CD, 0x56F2, 0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, + 0x88D1, 0x5C09, 0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, + 0x88D5, 0x6613, 0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, + 0x88D9, 0x7570, 0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, + 0x88DD, 0x80C3, 0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, + 0x88E1, 0x9055, 0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, + 0x88E5, 0x4EA5, 0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, + 0x88E9, 0x78EF, 0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, + 0x88ED, 0x9038, 0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, + 0x88F1, 0x9C2F, 0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, + 0x88F5, 0x54E1, 0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, + 0x88F9, 0x98F2, 0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, + 0x8940, 0x9662, 0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, + 0x8944, 0x540B, 0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, + 0x8948, 0x7FBD, 0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, + 0x894C, 0x9D5C, 0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, + 0x8950, 0x81FC, 0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, + 0x8954, 0x6B1D, 0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, + 0x8958, 0x53A9, 0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, + 0x895C, 0x5642, 0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, + 0x8960, 0x834F, 0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, + 0x8964, 0x5B30, 0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, + 0x8968, 0x6804, 0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, + 0x896C, 0x745B, 0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, + 0x8970, 0x82F1, 0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, + 0x8974, 0x6DB2, 0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, + 0x8978, 0x60A6, 0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, + 0x897C, 0x698E, 0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, + 0x8981, 0x5830, 0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, + 0x8985, 0x6028, 0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, + 0x8989, 0x6F14, 0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, + 0x898D, 0x71D5, 0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, + 0x8991, 0x82D1, 0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, + 0x8995, 0x9D1B, 0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, + 0x8999, 0x7525, 0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, + 0x899D, 0x5F80, 0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, + 0x89A1, 0x6A2A, 0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, + 0x89A5, 0x7FC1, 0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, + 0x89A9, 0x9EC4, 0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, + 0x89AD, 0x5104, 0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, + 0x89B1, 0x6876, 0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, + 0x89B5, 0x5378, 0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, + 0x89B9, 0x97F3, 0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, + 0x89BD, 0x4F55, 0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, + 0x89C1, 0x52A0, 0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, + 0x89C5, 0x5AC1, 0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, + 0x89C9, 0x6687, 0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, + 0x89CD, 0x6CB3, 0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, + 0x89D1, 0x79BE, 0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, + 0x89D5, 0x82DB, 0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, + 0x89D9, 0x83D3, 0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, + 0x89DD, 0x8CA8, 0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, + 0x89E1, 0x868A, 0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, + 0x89E5, 0x7259, 0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, + 0x89E9, 0x86FE, 0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, + 0x89ED, 0x99D5, 0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, + 0x89F1, 0x56DE, 0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, + 0x89F5, 0x5FEB, 0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, + 0x89F9, 0x61D0, 0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, + 0x8A40, 0x9B41, 0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, + 0x8A44, 0x7070, 0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, + 0x8A48, 0x82A5, 0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, + 0x8A4C, 0x8C9D, 0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, + 0x8A50, 0x54B3, 0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, + 0x8A54, 0x6982, 0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, + 0x8A58, 0x8857, 0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, + 0x8A5C, 0x6D6C, 0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, + 0x8A60, 0x67FF, 0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, + 0x8A64, 0x5687, 0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, + 0x8A68, 0x64B9, 0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, + 0x8A6C, 0x7372, 0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, + 0x8A70, 0x89D2, 0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, + 0x8A74, 0x95A3, 0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, + 0x8A78, 0x5CB3, 0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, + 0x8A7C, 0x639B, 0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, + 0x8A81, 0x68B6, 0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, + 0x8A85, 0x559D, 0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, + 0x8A89, 0x6E07, 0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, + 0x8A8D, 0x8F44, 0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, + 0x8A91, 0x691B, 0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, + 0x8A95, 0x515C, 0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, + 0x8A99, 0x938C, 0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, + 0x8A9D, 0x8305, 0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, + 0x8AA1, 0x82C5, 0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, + 0x8AA5, 0x51A0, 0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, + 0x8AA9, 0x52E7, 0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, + 0x8AAD, 0x59E6, 0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, + 0x8AB1, 0x5E72, 0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, + 0x8AB5, 0x6163, 0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, + 0x8AB9, 0x67D1, 0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, + 0x8ABD, 0x6B53, 0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, + 0x8AC1, 0x6F45, 0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, + 0x8AC5, 0x770B, 0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, + 0x8AC9, 0x7DE9, 0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, + 0x8ACD, 0x8266, 0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, + 0x8AD1, 0x8CAB, 0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, + 0x8AD5, 0x9591, 0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, + 0x8AD9, 0x9928, 0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, + 0x8ADD, 0x5CB8, 0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, + 0x8AE1, 0x773C, 0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, + 0x8AE5, 0x96C1, 0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, + 0x8AE9, 0x4F01, 0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, + 0x8AED, 0x5668, 0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, + 0x8AF1, 0x5BC4, 0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, + 0x8AF5, 0x5FCC, 0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, + 0x8AF9, 0x65E2, 0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, + 0x8B40, 0x6A5F, 0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, + 0x8B44, 0x6C7D, 0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, + 0x8B48, 0x7A00, 0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, + 0x8B4C, 0x8A18, 0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, + 0x8B50, 0x8F1D, 0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, + 0x8B54, 0x4E80, 0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, + 0x8B58, 0x5B9C, 0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, + 0x8B5C, 0x6B3A, 0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, + 0x8B60, 0x7FA9, 0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, + 0x8B64, 0x63AC, 0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, + 0x8B68, 0x5403, 0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, + 0x8B6C, 0x8A70, 0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, + 0x8B70, 0x5374, 0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, + 0x8B74, 0x9006, 0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, + 0x8B78, 0x4F11, 0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, + 0x8B7C, 0x5F13, 0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, + 0x8B81, 0x6C42, 0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, + 0x8B85, 0x7403, 0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, + 0x8B89, 0x7D1A, 0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, + 0x8B8D, 0x725B, 0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, + 0x8B91, 0x62D2, 0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, + 0x8B95, 0x865A, 0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, + 0x8B99, 0x6F01, 0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, + 0x8B9D, 0x4EAB, 0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, + 0x8BA1, 0x50D1, 0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, + 0x8BA5, 0x51F6, 0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, + 0x8BA9, 0x53EB, 0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, + 0x8BAD, 0x5F37, 0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, + 0x8BB1, 0x606D, 0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, + 0x8BB5, 0x6CC1, 0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, + 0x8BB9, 0x80F8, 0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, + 0x8BBD, 0x90F7, 0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, + 0x8BC1, 0x9A5A, 0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, + 0x8BC5, 0x6681, 0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, + 0x8BC9, 0x6975, 0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, + 0x8BCD, 0x50C5, 0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, + 0x8BD1, 0x9326, 0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, + 0x8BD5, 0x7434, 0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, + 0x8BD9, 0x7DCA, 0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, + 0x8BDD, 0x895F, 0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, + 0x8BE1, 0x541F, 0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, + 0x8BE5, 0x53E5, 0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, + 0x8BE9, 0x77E9, 0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, + 0x8BED, 0x99C8, 0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, + 0x8BF1, 0x865E, 0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, + 0x8BF5, 0x5BD3, 0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, + 0x8BF9, 0x6ADB, 0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, + 0x8C40, 0x6398, 0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, + 0x8C44, 0x8F61, 0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, + 0x8C48, 0x7C82, 0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, + 0x8C4C, 0x936C, 0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, + 0x8C50, 0x8A13, 0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, + 0x8C54, 0x5366, 0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, + 0x8C58, 0x50BE, 0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, + 0x8C5C, 0x572D, 0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, + 0x8C60, 0x5F62, 0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, + 0x8C64, 0x6167, 0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, + 0x8C68, 0x656C, 0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, + 0x8C6C, 0x7566, 0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, + 0x8C70, 0x7D99, 0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, + 0x8C74, 0x834A, 0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, + 0x8C78, 0x8B66, 0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, + 0x8C7C, 0x82B8, 0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, + 0x8C81, 0x621F, 0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, + 0x8C85, 0x6841, 0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, + 0x8C89, 0x6F54, 0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, + 0x8C8D, 0x8A23, 0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, + 0x8C91, 0x5026, 0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, + 0x8C95, 0x5263, 0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, + 0x8C99, 0x5ACC, 0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, + 0x8C9D, 0x62F3, 0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, + 0x8CA1, 0x727D, 0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, + 0x8CA5, 0x786F, 0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, + 0x8CA9, 0x898B, 0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, + 0x8CAD, 0x9063, 0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, + 0x8CB1, 0x9A13, 0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, + 0x8CB5, 0x53B3, 0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, + 0x8CB9, 0x6E90, 0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, + 0x8CBD, 0x8237, 0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, + 0x8CC1, 0x4E4E, 0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, + 0x8CC5, 0x56FA, 0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, + 0x8CC9, 0x5EAB, 0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, + 0x8CCD, 0x67AF, 0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, + 0x8CD1, 0x88B4, 0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, + 0x8CD5, 0x864E, 0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, + 0x8CD9, 0x96C7, 0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, + 0x8CDD, 0x4E92, 0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, + 0x8CE1, 0x543E, 0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, + 0x8CE5, 0x609F, 0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, + 0x8CE9, 0x7881, 0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, + 0x8CED, 0x9190, 0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, + 0x8CF1, 0x4F7C, 0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, + 0x8CF5, 0x5149, 0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, + 0x8CF9, 0x52FE, 0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, + 0x8D40, 0x540E, 0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, + 0x8D44, 0x597D, 0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, + 0x8D48, 0x5DE5, 0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, + 0x8D4C, 0x5E83, 0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, + 0x8D50, 0x6052, 0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, + 0x8D54, 0x63A7, 0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, + 0x8D58, 0x66F4, 0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, + 0x8D5C, 0x69CB, 0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, + 0x8D60, 0x6E2F, 0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, + 0x8D64, 0x786C, 0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, + 0x8D68, 0x7D18, 0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, + 0x8D6C, 0x8003, 0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, + 0x8D70, 0x818F, 0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, + 0x8D74, 0x8861, 0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, + 0x8D78, 0x90CA, 0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, + 0x8D7C, 0x92FC, 0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, + 0x8D81, 0x9999, 0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, + 0x8D85, 0x52AB, 0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, + 0x8D89, 0x62F7, 0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, + 0x8D8D, 0x9EB9, 0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, + 0x8D91, 0x56FD, 0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, + 0x8D95, 0x9ED2, 0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, + 0x8D99, 0x7511, 0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, + 0x8D9D, 0x72DB, 0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, + 0x8DA1, 0x4ECA, 0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, + 0x8DA5, 0x5A5A, 0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, + 0x8DA9, 0x6606, 0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, + 0x8DAD, 0x75D5, 0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, + 0x8DB1, 0x4E9B, 0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, + 0x8DB5, 0x5D6F, 0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, + 0x8DB9, 0x6C99, 0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, + 0x8DBD, 0x9396, 0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, + 0x8DC1, 0x632B, 0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, + 0x8DC5, 0x6700, 0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, + 0x8DC9, 0x5BB0, 0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, + 0x8DCD, 0x683D, 0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, + 0x8DD1, 0x91C7, 0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, + 0x8DD5, 0x796D, 0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, + 0x8DD9, 0x88C1, 0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, + 0x8DDD, 0x5728, 0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, + 0x8DE1, 0x51B4, 0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, + 0x8DE5, 0x698A, 0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, + 0x8DE9, 0x57FC, 0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, + 0x8DED, 0x524A, 0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, + 0x8DF1, 0x6714, 0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, + 0x8DF5, 0x7D22, 0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, + 0x8DF9, 0x7B39, 0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, + 0x8E40, 0x5BDF, 0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, + 0x8E44, 0x672D, 0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, + 0x8E48, 0x7690, 0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, + 0x8E4C, 0x9BAB, 0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, + 0x8E50, 0x5098, 0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, + 0x8E54, 0x6492, 0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, + 0x8E58, 0x73CA, 0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, + 0x8E5C, 0x8695, 0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, + 0x8E60, 0x9910, 0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, + 0x8E64, 0x4ED5, 0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, + 0x8E68, 0x523A, 0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, + 0x8E6C, 0x56DB, 0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, + 0x8E70, 0x59FF, 0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, + 0x8E74, 0x5E2B, 0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, + 0x8E78, 0x652F, 0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, + 0x8E7C, 0x65E8, 0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, + 0x8E81, 0x6C0F, 0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, + 0x8E85, 0x7CF8, 0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, + 0x8E89, 0x8102, 0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, + 0x8E8D, 0x8A69, 0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, + 0x8E91, 0x8CC7, 0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, + 0x8E95, 0x6B6F, 0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, + 0x8E99, 0x5150, 0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, + 0x8E9D, 0x6301, 0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, + 0x8EA1, 0x6CBB, 0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, + 0x8EA5, 0x78C1, 0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, + 0x8EA9, 0x81EA, 0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, + 0x8EAD, 0x9E7F, 0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, + 0x8EB1, 0x7AFA, 0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, + 0x8EB5, 0x4E03, 0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, + 0x8EB9, 0x5AC9, 0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, + 0x8EBD, 0x6F06, 0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, + 0x8EC1, 0x8500, 0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, + 0x8EC5, 0x829D, 0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, + 0x8EC9, 0x820E, 0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, + 0x8ECD, 0x8D66, 0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, + 0x8ED1, 0x7D17, 0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, + 0x8ED5, 0x906E, 0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, + 0x8ED9, 0x52FA, 0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, + 0x8EDD, 0x7235, 0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, + 0x8EE1, 0x82E5, 0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, + 0x8EE5, 0x4E3B, 0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, + 0x8EE9, 0x6731, 0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, + 0x8EED, 0x7A2E, 0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, + 0x8EF1, 0x9996, 0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, + 0x8EF5, 0x5BFF, 0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, + 0x8EF9, 0x9700, 0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, + 0x8F40, 0x5B97, 0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, + 0x8F44, 0x6101, 0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, + 0x8F48, 0x79CB, 0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, + 0x8F4C, 0x81ED, 0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, + 0x8F50, 0x8972, 0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, + 0x8F54, 0x9031, 0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, + 0x8F58, 0x919C, 0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, + 0x8F5C, 0x5341, 0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, + 0x8F60, 0x6C41, 0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, + 0x8F64, 0x91CD, 0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, + 0x8F68, 0x5BBF, 0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, + 0x8F6C, 0x7C9B, 0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, + 0x8F70, 0x8853, 0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, + 0x8F74, 0x6625, 0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, + 0x8F78, 0x99FF, 0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, + 0x8F7C, 0x696F, 0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, + 0x8F81, 0x6F64, 0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, + 0x8F85, 0x9075, 0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, + 0x8F89, 0x521D, 0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, + 0x8F8D, 0x6E1A, 0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, + 0x8F91, 0x66F8, 0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, + 0x8F95, 0x52A9, 0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, + 0x8F99, 0x5F90, 0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, + 0x8F9D, 0x50B7, 0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, + 0x8FA1, 0x5347, 0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, + 0x8FA5, 0x5531, 0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, + 0x8FA9, 0x5A3C, 0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, + 0x8FAD, 0x5C11, 0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, + 0x8FB1, 0x5EE0, 0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, + 0x8FB5, 0x62DB, 0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, + 0x8FB9, 0x660C, 0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, + 0x8FBD, 0x68A2, 0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, + 0x8FC1, 0x6D88, 0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, + 0x8FC5, 0x7126, 0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, + 0x8FC9, 0x785D, 0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, + 0x8FCD, 0x7AE0, 0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, + 0x8FD1, 0x8096, 0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, + 0x8FD5, 0x885D, 0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, + 0x8FD9, 0x8A54, 0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, + 0x8FDD, 0x91A4, 0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, + 0x8FE1, 0x969C, 0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, + 0x8FE5, 0x4E1E, 0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, + 0x8FE9, 0x57CE, 0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, + 0x8FED, 0x5E38, 0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, + 0x8FF1, 0x6756, 0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, + 0x8FF5, 0x7A63, 0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, + 0x8FF9, 0x9320, 0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, + 0x9040, 0x62ED, 0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, + 0x9044, 0x7E54, 0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, + 0x9048, 0x98DF, 0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, + 0x904C, 0x4F38, 0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, + 0x9050, 0x5A20, 0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, + 0x9054, 0x614E, 0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, + 0x9058, 0x68EE, 0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, + 0x905C, 0x7533, 0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, + 0x9060, 0x79E6, 0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, + 0x9064, 0x85AA, 0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, + 0x9068, 0x8F9B, 0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, + 0x906C, 0x4EBA, 0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, + 0x9070, 0x58EC, 0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, + 0x9074, 0x814E, 0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, + 0x9078, 0x976D, 0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, + 0x907C, 0x9162, 0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, + 0x9081, 0x5439, 0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, + 0x9085, 0x6C34, 0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, + 0x9089, 0x7FE0, 0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, + 0x908D, 0x9310, 0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, + 0x9091, 0x9AC4, 0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, + 0x9095, 0x67A2, 0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, + 0x9099, 0x6749, 0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, + 0x909D, 0x96C0, 0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, + 0x90A1, 0x5BF8, 0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, + 0x90A5, 0x662F, 0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, + 0x90A9, 0x59D3, 0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, + 0x90AD, 0x653F, 0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, + 0x90B1, 0x68F2, 0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, + 0x90B5, 0x7272, 0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, + 0x90B9, 0x8056, 0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, + 0x90BD, 0x8AA0, 0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, + 0x90C1, 0x9192, 0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, + 0x90C5, 0x7A0E, 0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, + 0x90C9, 0x60DC, 0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, + 0x90CD, 0x6790, 0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, + 0x90D1, 0x7E3E, 0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, + 0x90D5, 0x8DE1, 0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, + 0x90D9, 0x62D9, 0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, + 0x90DD, 0x8A2D, 0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, + 0x90E1, 0x96EA, 0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, + 0x90E5, 0x4ED9, 0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, + 0x90E9, 0x5BA3, 0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, + 0x90ED, 0x6226, 0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, + 0x90F1, 0x6834, 0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, + 0x90F5, 0x67D3, 0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, + 0x90F9, 0x65CB, 0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, + 0x9140, 0x7E4A, 0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, + 0x9144, 0x8239, 0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, + 0x9148, 0x8DF5, 0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, + 0x914C, 0x9291, 0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, + 0x9150, 0x5584, 0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, + 0x9154, 0x7985, 0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, + 0x9158, 0x564C, 0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, + 0x915C, 0x66FE, 0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, + 0x9160, 0x758F, 0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, + 0x9164, 0x79DF, 0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, + 0x9168, 0x8607, 0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, + 0x916C, 0x9F20, 0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, + 0x9170, 0x53E2, 0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, + 0x9174, 0x594F, 0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, + 0x9178, 0x531D, 0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, + 0x917C, 0x6383, 0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, + 0x9181, 0x65E9, 0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, + 0x9185, 0x69FD, 0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, + 0x9189, 0x75E9, 0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, + 0x918D, 0x7DCF, 0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, + 0x9191, 0x8358, 0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, + 0x9195, 0x88C5, 0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, + 0x9199, 0x9397, 0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, + 0x919D, 0x5897, 0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, + 0x91A1, 0x8D08, 0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, + 0x91A5, 0x5247, 0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, + 0x91A9, 0x675F, 0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, + 0x91AD, 0x4FD7, 0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, + 0x91B1, 0x7D9A, 0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, + 0x91B5, 0x63C3, 0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, + 0x91B9, 0x640D, 0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, + 0x91BD, 0x591A, 0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, + 0x91C1, 0x553E, 0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, + 0x91C5, 0x6253, 0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, + 0x91C9, 0x9640, 0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, + 0x91CD, 0x5806, 0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, + 0x91D1, 0x5E2F, 0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, + 0x91D5, 0x6234, 0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, + 0x91D9, 0x80CE, 0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, + 0x91DD, 0x8CB8, 0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, + 0x91E1, 0x9EDB, 0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, + 0x91E5, 0x5927, 0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, + 0x91E9, 0x9DF9, 0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, + 0x91ED, 0x5544, 0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, + 0x91F1, 0x62D3, 0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, + 0x91F5, 0x8A17, 0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, + 0x91F9, 0x8338, 0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, + 0x9240, 0x53E9, 0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, + 0x9244, 0x596A, 0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, + 0x9248, 0x8FBF, 0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, + 0x924C, 0x9C48, 0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, + 0x9250, 0x5358, 0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, + 0x9254, 0x63A2, 0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, + 0x9258, 0x6E5B, 0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, + 0x925C, 0x7BAA, 0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, + 0x9260, 0x86CB, 0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, + 0x9264, 0x58C7, 0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, + 0x9268, 0x6A80, 0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, + 0x926C, 0x5024, 0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, + 0x9270, 0x6065, 0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, + 0x9274, 0x7A1A, 0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, + 0x9278, 0x9045, 0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, + 0x927C, 0x7AF9, 0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, + 0x9281, 0x79E9, 0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, + 0x9285, 0x7740, 0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, + 0x9289, 0x5FE0, 0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, + 0x928D, 0x6CE8, 0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, + 0x9291, 0x914E, 0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, + 0x9295, 0x7026, 0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, + 0x9299, 0x8CAF, 0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, + 0x929D, 0x558B, 0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, + 0x92A1, 0x5E81, 0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, + 0x92A5, 0x5FB4, 0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, + 0x92A9, 0x671D, 0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, + 0x92AD, 0x773A, 0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, + 0x92B1, 0x8776, 0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, + 0x92B5, 0x8DF3, 0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, + 0x92B9, 0x9CE5, 0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, + 0x92BD, 0x6715, 0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, + 0x92C1, 0x93AE, 0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, + 0x92C5, 0x690E, 0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, + 0x92C9, 0x75DB, 0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, + 0x92CD, 0x63B4, 0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, + 0x92D1, 0x67D8, 0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, + 0x92D5, 0x9354, 0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, + 0x92D9, 0x58F7, 0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, + 0x92DD, 0x540A, 0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, + 0x92E1, 0x4F4E, 0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, + 0x92E5, 0x8C9E, 0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, + 0x92E9, 0x5E1D, 0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, + 0x92ED, 0x5F1F, 0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, + 0x92F1, 0x63D0, 0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, + 0x92F5, 0x798E, 0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, + 0x92F9, 0x8A02, 0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, + 0x9340, 0x90B8, 0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, + 0x9344, 0x6CE5, 0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, + 0x9348, 0x6EF4, 0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, + 0x934C, 0x93D1, 0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, + 0x9350, 0x64A4, 0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, + 0x9354, 0x5178, 0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, + 0x9358, 0x5E97, 0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, + 0x935C, 0x8CBC, 0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, + 0x9360, 0x4F1D, 0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, + 0x9364, 0x96FB, 0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, + 0x9368, 0x5857, 0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, + 0x936C, 0x6597, 0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, + 0x9370, 0x83DF, 0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, + 0x9374, 0x934D, 0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, + 0x9378, 0x5EA6, 0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, + 0x937C, 0x5012, 0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, + 0x9381, 0x5200, 0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, + 0x9385, 0x5957, 0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, + 0x9389, 0x60BC, 0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, + 0x938D, 0x6843, 0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, + 0x9391, 0x6DD8, 0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, + 0x9395, 0x71C8, 0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, + 0x9399, 0x7B49, 0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, + 0x939D, 0x7D71, 0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, + 0x93A1, 0x85E4, 0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, + 0x93A5, 0x8E0F, 0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, + 0x93A9, 0x9676, 0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, + 0x93AD, 0x50CD, 0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, + 0x93B1, 0x5C0E, 0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, + 0x93B5, 0x77B3, 0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, + 0x93B9, 0x9053, 0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, + 0x93BD, 0x533F, 0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, + 0x93C1, 0x7279, 0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, + 0x93C5, 0x6BD2, 0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, + 0x93C9, 0x6A61, 0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, + 0x93CD, 0x5C4A, 0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, + 0x93D1, 0x9149, 0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, + 0x93D5, 0x60C7, 0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, + 0x93D9, 0x9041, 0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, + 0x93DD, 0x920D, 0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, + 0x93E1, 0x4E4D, 0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, + 0x93E5, 0x7058, 0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, + 0x93E9, 0x99B4, 0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, + 0x93ED, 0x6960, 0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, + 0x93F1, 0x4E8C, 0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, + 0x93F5, 0x5302, 0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, + 0x93F9, 0x5EFF, 0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, + 0x9440, 0x5982, 0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, + 0x9444, 0x598A, 0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, + 0x9448, 0x79B0, 0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, + 0x944C, 0x732B, 0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, + 0x9450, 0x637B, 0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, + 0x9454, 0x4E43, 0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, + 0x9458, 0x56A2, 0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, + 0x945C, 0x80FD, 0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, + 0x9460, 0x8997, 0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, + 0x9464, 0x64AD, 0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, + 0x9468, 0x6D3E, 0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, + 0x946C, 0x7F75, 0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, + 0x9470, 0x5EC3, 0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, + 0x9474, 0x676F, 0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, + 0x9478, 0x80BA, 0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, + 0x947C, 0x57F9, 0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, + 0x9481, 0x7164, 0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, + 0x9485, 0x8CE0, 0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, + 0x9489, 0x79E4, 0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, + 0x948D, 0x5265, 0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, + 0x9491, 0x6CCA, 0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, + 0x9495, 0x8236, 0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, + 0x9499, 0x6F20, 0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, + 0x949D, 0x99C1, 0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, + 0x94A1, 0x7872, 0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, + 0x94A5, 0x6AE8, 0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, + 0x94A9, 0x7560, 0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, + 0x94AD, 0x767A, 0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, + 0x94B1, 0x7F70, 0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, + 0x94B5, 0x9CE9, 0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, + 0x94B9, 0x96BC, 0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, + 0x94BD, 0x53CD, 0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, + 0x94C1, 0x6591, 0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, + 0x94C5, 0x7248, 0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, + 0x94C9, 0x7E41, 0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, + 0x94CD, 0x7BC4, 0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, + 0x94D1, 0x98EF, 0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, + 0x94D5, 0x76E4, 0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, + 0x94D9, 0x532A, 0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, + 0x94DD, 0x5E87, 0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, + 0x94E1, 0x6279, 0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, + 0x94E5, 0x6CCC, 0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, + 0x94E9, 0x79D8, 0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, + 0x94ED, 0x88AB, 0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, + 0x94F1, 0x975E, 0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, + 0x94F5, 0x5099, 0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, + 0x94F9, 0x6BD8, 0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, + 0x9540, 0x9F3B, 0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, + 0x9544, 0x758B, 0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, + 0x9548, 0x83F1, 0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, + 0x954C, 0x7562, 0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, + 0x9550, 0x59EB, 0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, + 0x9554, 0x8B2C, 0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, + 0x9558, 0x6C37, 0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, + 0x955C, 0x8868, 0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, + 0x9560, 0x63CF, 0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, + 0x9564, 0x9328, 0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, + 0x9568, 0x9C2D, 0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, + 0x956C, 0x6D5C, 0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, + 0x9570, 0x983B, 0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, + 0x9574, 0x4ED8, 0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, + 0x9578, 0x5BCC, 0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, + 0x957C, 0x6016, 0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, + 0x9581, 0x666E, 0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, + 0x9585, 0x8150, 0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, + 0x9589, 0x8CA0, 0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, + 0x958D, 0x9644, 0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, + 0x9591, 0x821E, 0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, + 0x9595, 0x5C01, 0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, + 0x9599, 0x8557, 0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, + 0x959D, 0x5E45, 0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, + 0x95A1, 0x8907, 0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, + 0x95A5, 0x6255, 0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, + 0x95A9, 0x9B92, 0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, + 0x95AD, 0x58B3, 0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, + 0x95B1, 0x596E, 0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, + 0x95B5, 0x96F0, 0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, + 0x95B9, 0x4F75, 0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, + 0x95BD, 0x5E73, 0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, + 0x95C1, 0x853D, 0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, + 0x95C5, 0x9801, 0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, + 0x95C9, 0x78A7, 0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, + 0x95CD, 0x7B86, 0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, + 0x95D1, 0x7BC7, 0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, + 0x95D5, 0x904D, 0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, + 0x95D9, 0x5F01, 0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, + 0x95DD, 0x92EA, 0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, + 0x95E1, 0x752B, 0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, + 0x95E5, 0x52DF, 0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, + 0x95E9, 0x66AE, 0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, + 0x95ED, 0x5023, 0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, + 0x95F1, 0x5831, 0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, + 0x95F5, 0x5CEF, 0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, + 0x95F9, 0x6367, 0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, + 0x9640, 0x6CD5, 0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, + 0x9644, 0x7E2B, 0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, + 0x9648, 0x84EC, 0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, + 0x964C, 0x8C4A, 0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, + 0x9650, 0x9CF3, 0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, + 0x9654, 0x508D, 0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, + 0x9658, 0x5E3D, 0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, + 0x965C, 0x66B4, 0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, + 0x9660, 0x5192, 0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, + 0x9664, 0x8B00, 0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, + 0x9668, 0x9632, 0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, + 0x966C, 0x50D5, 0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, + 0x9670, 0x6734, 0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, + 0x9674, 0x91E6, 0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, + 0x9678, 0x5800, 0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, + 0x967C, 0x7FFB, 0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, + 0x9681, 0x78E8, 0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, + 0x9685, 0x59B9, 0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, + 0x9689, 0x54E9, 0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, + 0x968D, 0x6795, 0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, + 0x9691, 0x685D, 0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, + 0x9695, 0x62B9, 0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, + 0x9699, 0x4FAD, 0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, + 0x969D, 0x6162, 0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, + 0x96A1, 0x5473, 0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, + 0x96A5, 0x7B95, 0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, + 0x96A9, 0x6E4A, 0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, + 0x96AD, 0x5999, 0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, + 0x96B1, 0x52D9, 0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, + 0x96B5, 0x77DB, 0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, + 0x96B9, 0x5A7F, 0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, + 0x96BD, 0x547D, 0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, + 0x96C1, 0x9298, 0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, + 0x96C5, 0x6EC5, 0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, + 0x96C9, 0x7DEC, 0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, + 0x96CD, 0x6A21, 0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, + 0x96D1, 0x6BDB, 0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, + 0x96D5, 0x8017, 0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, + 0x96D9, 0x9ED9, 0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, + 0x96DD, 0x9905, 0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, + 0x96E1, 0x8CB0, 0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, + 0x96E5, 0x9580, 0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, + 0x96E9, 0x591C, 0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, + 0x96ED, 0x5F25, 0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, + 0x96F1, 0x7D04, 0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, + 0x96F5, 0x9756, 0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, + 0x96F9, 0x6109, 0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, + 0x9740, 0x8AED, 0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, + 0x9744, 0x512A, 0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, + 0x9748, 0x5E7D, 0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, + 0x974C, 0x6709, 0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, + 0x9750, 0x7336, 0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, + 0x9754, 0x88D5, 0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, + 0x9758, 0x90F5, 0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, + 0x975C, 0x4E88, 0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, + 0x9760, 0x8F3F, 0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, + 0x9764, 0x5996, 0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, + 0x9768, 0x63FA, 0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, + 0x976C, 0x69D8, 0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, + 0x9770, 0x7528, 0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, + 0x9774, 0x8449, 0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, + 0x9778, 0x8E0A, 0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, + 0x977C, 0x617E, 0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, + 0x9781, 0x6D74, 0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, + 0x9785, 0x7F85, 0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, + 0x9789, 0x83B1, 0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, + 0x978D, 0x7D61, 0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, + 0x9791, 0x5375, 0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, + 0x9795, 0x85CD, 0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, + 0x9799, 0x540F, 0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, + 0x979D, 0x7406, 0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, + 0x97A1, 0x88E1, 0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, + 0x97A5, 0x5F8B, 0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, + 0x97A9, 0x63A0, 0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, + 0x97AD, 0x6E9C, 0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, + 0x97B1, 0x7C92, 0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, + 0x97B5, 0x4FB6, 0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, + 0x97B9, 0x4E86, 0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, + 0x97BD, 0x51CC, 0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, + 0x97C1, 0x6DBC, 0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, + 0x97C5, 0x7A1C, 0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, + 0x97C9, 0x907C, 0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, + 0x97CD, 0x529B, 0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, + 0x97D1, 0x6797, 0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, + 0x97D5, 0x81E8, 0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, + 0x97D9, 0x9E9F, 0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, + 0x97DD, 0x7D2F, 0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, + 0x97E1, 0x4F8B, 0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, + 0x97E5, 0x601C, 0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, + 0x97E9, 0x9234, 0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, + 0x97ED, 0x9E97, 0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, + 0x97F1, 0x5217, 0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, + 0x97F5, 0x5EC9, 0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, + 0x97F9, 0x7149, 0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, + 0x9840, 0x84EE, 0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, + 0x9844, 0x9B6F, 0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, + 0x9848, 0x8DEF, 0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, + 0x984C, 0x5ECA, 0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, + 0x9850, 0x6994, 0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, + 0x9854, 0x72FC, 0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, + 0x9858, 0x874B, 0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, + 0x985C, 0x7984, 0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, + 0x9860, 0x502D, 0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, + 0x9864, 0x8CC4, 0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, + 0x9868, 0x9DF2, 0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, + 0x986C, 0x8A6B, 0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, + 0x9870, 0x6E7E, 0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, + 0x98A0, 0x4E10, 0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, + 0x98A4, 0x4E36, 0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, + 0x98A8, 0x4E56, 0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, + 0x98AC, 0x8C6B, 0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, + 0x98B0, 0x4E8E, 0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, + 0x98B4, 0x4EA2, 0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, + 0x98B8, 0x4ECE, 0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, + 0x98BC, 0x4EC2, 0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, + 0x98C0, 0x4EDF, 0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, + 0x98C4, 0x4F30, 0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, + 0x98C8, 0x4F47, 0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, + 0x98CC, 0x4F98, 0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, + 0x98D0, 0x4F91, 0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, + 0x98D4, 0x5118, 0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, + 0x98D8, 0x4FD8, 0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, + 0x98DC, 0x4FD0, 0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, + 0x98E0, 0x5028, 0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, + 0x98E4, 0x5005, 0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, + 0x98E8, 0x5029, 0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, + 0x98EC, 0x5011, 0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, + 0x98F0, 0x6703, 0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, + 0x98F4, 0x505A, 0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, + 0x98F8, 0x5080, 0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, + 0x98FC, 0x50B2, 0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, + 0x9943, 0x50C2, 0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, + 0x9947, 0x50ED, 0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, + 0x994B, 0x50F5, 0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, + 0x994F, 0x5116, 0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, + 0x9953, 0x5121, 0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, + 0x9957, 0x513B, 0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, + 0x995B, 0x514C, 0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, + 0x995F, 0x5169, 0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, + 0x9963, 0x5182, 0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, + 0x9967, 0x518F, 0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, + 0x996B, 0x5196, 0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, + 0x996F, 0x51A9, 0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, + 0x9973, 0x51B1, 0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, + 0x9977, 0x51BD, 0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, + 0x997B, 0x51E0, 0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, + 0x9980, 0x51F0, 0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, + 0x9984, 0x520B, 0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, + 0x9988, 0x522A, 0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, + 0x998C, 0x524F, 0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, + 0x9990, 0x525E, 0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, + 0x9994, 0x5269, 0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, + 0x9998, 0x528D, 0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, + 0x999C, 0x5288, 0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, + 0x99A0, 0x52AC, 0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, + 0x99A4, 0x52C1, 0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, + 0x99A8, 0x52E3, 0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, + 0x99AC, 0x52F3, 0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, + 0x99B0, 0x5306, 0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, + 0x99B4, 0x5310, 0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, + 0x99B8, 0x5323, 0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, + 0x99BC, 0x5338, 0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, + 0x99C0, 0x4E17, 0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, + 0x99C4, 0x535E, 0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, + 0x99C8, 0x537B, 0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, + 0x99CC, 0x53A0, 0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, + 0x99D0, 0x53B0, 0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, + 0x99D4, 0x96D9, 0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, + 0x99D8, 0x53EE, 0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, + 0x99DC, 0x5401, 0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, + 0x99E0, 0x542D, 0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, + 0x99E4, 0x5429, 0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, + 0x99E8, 0x5475, 0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, + 0x99EC, 0x5477, 0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, + 0x99F0, 0x5480, 0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, + 0x99F4, 0x5486, 0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, + 0x99F8, 0x54A5, 0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, + 0x99FC, 0x54A8, 0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, + 0x9A43, 0x54BE, 0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, + 0x9A47, 0x54E6, 0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, + 0x9A4B, 0x54EE, 0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, + 0x9A4F, 0x5539, 0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, + 0x9A53, 0x552E, 0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, + 0x9A57, 0x5557, 0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, + 0x9A5B, 0x5599, 0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, + 0x9A5F, 0x559F, 0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, + 0x9A63, 0x559E, 0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, + 0x9A67, 0x55A9, 0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, + 0x9A6B, 0x55C5, 0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, + 0x9A6F, 0x55E4, 0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, + 0x9A73, 0x5616, 0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, + 0x9A77, 0x55F9, 0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, + 0x9A7B, 0x5634, 0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, + 0x9A80, 0x566B, 0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, + 0x9A84, 0x566A, 0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, + 0x9A88, 0x56A0, 0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, + 0x9A8C, 0x56AE, 0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, + 0x9A90, 0x56BC, 0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, + 0x9A94, 0x56C8, 0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, + 0x9A98, 0x56D7, 0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, + 0x9A9C, 0x56FF, 0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, + 0x9AA0, 0x570B, 0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, + 0x9AA4, 0x5716, 0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, + 0x9AA8, 0x5737, 0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, + 0x9AAC, 0x5740, 0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, + 0x9AB0, 0x5788, 0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, + 0x9AB4, 0x5793, 0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, + 0x9AB8, 0x57AA, 0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, + 0x9ABC, 0x57D4, 0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, + 0x9AC0, 0x57D6, 0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, + 0x9AC4, 0x581D, 0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, + 0x9AC8, 0x584B, 0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, + 0x9ACC, 0x583D, 0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, + 0x9AD0, 0x589F, 0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, + 0x9AD4, 0x58BB, 0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, + 0x9AD8, 0x58D3, 0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, + 0x9ADC, 0x58D8, 0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, + 0x9AE0, 0x58DF, 0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, + 0x9AE4, 0x58FB, 0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, + 0x9AE8, 0x590A, 0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, + 0x9AEC, 0x5925, 0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, + 0x9AF0, 0x5938, 0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, + 0x9AF4, 0x5950, 0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, + 0x9AF8, 0x5962, 0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, + 0x9AFC, 0x5969, 0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, + 0x9B43, 0x4F5E, 0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, + 0x9B47, 0x59C6, 0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, + 0x9B4B, 0x59D9, 0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, + 0x9B4F, 0x5A11, 0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, + 0x9B53, 0x5A40, 0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, + 0x9B57, 0x5A36, 0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, + 0x9B5B, 0x5ABC, 0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, + 0x9B5F, 0x5ABD, 0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, + 0x9B63, 0x5AE9, 0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, + 0x9B67, 0x5B0C, 0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, + 0x9B6B, 0x5AD0, 0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, + 0x9B6F, 0x5B43, 0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, + 0x9B73, 0x5B55, 0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, + 0x9B77, 0x5B69, 0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, + 0x9B7B, 0x5B78, 0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, + 0x9B80, 0x5B83, 0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, + 0x9B84, 0x5BC7, 0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, + 0x9B88, 0x5BE4, 0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, + 0x9B8C, 0x5BE5, 0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, + 0x9B90, 0x5BF3, 0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, + 0x9B94, 0x5C0D, 0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, + 0x9B98, 0x5C28, 0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, + 0x9B9C, 0x5C46, 0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, + 0x9BA0, 0x5C4F, 0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, + 0x9BA4, 0x4E62, 0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, + 0x9BA8, 0x5C91, 0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, + 0x9BAC, 0x5CBB, 0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, + 0x9BB0, 0x5CC5, 0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, + 0x9BB4, 0x5CE9, 0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, + 0x9BB8, 0x5D8C, 0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, + 0x9BBC, 0x5D17, 0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, + 0x9BC0, 0x5D11, 0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, + 0x9BC4, 0x5D19, 0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, + 0x9BC8, 0x5D4E, 0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, + 0x9BCC, 0x5D76, 0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, + 0x9BD0, 0x5DA2, 0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, + 0x9BD4, 0x5DBD, 0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, + 0x9BD8, 0x5DC9, 0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, + 0x9BDC, 0x5DD6, 0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, + 0x9BE0, 0x5DF5, 0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, + 0x9BE4, 0x5E11, 0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, + 0x9BE8, 0x5E44, 0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, + 0x9BEC, 0x5E57, 0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, + 0x9BF0, 0x5E64, 0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, + 0x9BF4, 0x5E7A, 0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, + 0x9BF8, 0x5EC1, 0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, + 0x9BFC, 0x5ECF, 0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, + 0x9C43, 0x5EDA, 0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, + 0x9C47, 0x5EE8, 0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, + 0x9C4B, 0x5EF3, 0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, + 0x9C4F, 0x5EFE, 0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, + 0x9C53, 0x5F5C, 0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, + 0x9C57, 0x5F29, 0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, + 0x9C5B, 0x5F48, 0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, + 0x9C5F, 0x5F51, 0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, + 0x9C63, 0x5F61, 0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, + 0x9C67, 0x5F83, 0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, + 0x9C6B, 0x5F88, 0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, + 0x9C6F, 0x5F99, 0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, + 0x9C73, 0x5FAD, 0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, + 0x9C77, 0x5FE4, 0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, + 0x9C7B, 0x60B3, 0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, + 0x9C80, 0x6019, 0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, + 0x9C84, 0x6031, 0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, + 0x9C88, 0x6026, 0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, + 0x9C8C, 0x6041, 0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, + 0x9C90, 0x604A, 0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, + 0x9C94, 0x6043, 0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, + 0x9C98, 0x606B, 0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, + 0x9C9C, 0x60E7, 0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, + 0x9CA0, 0x609B, 0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, + 0x9CA4, 0x60A7, 0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, + 0x9CA8, 0x60E0, 0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, + 0x9CAC, 0x60BD, 0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, + 0x9CB0, 0x614D, 0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, + 0x9CB4, 0x60F7, 0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, + 0x9CB8, 0x6103, 0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, + 0x9CBC, 0x610D, 0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, + 0x9CC0, 0x6128, 0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, + 0x9CC4, 0x613C, 0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, + 0x9CC8, 0x6142, 0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, + 0x9CCC, 0x6158, 0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, + 0x9CD0, 0x6174, 0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, + 0x9CD4, 0x615F, 0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, + 0x9CD8, 0x6199, 0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, + 0x9CDC, 0x6194, 0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, + 0x9CE0, 0x61AB, 0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, + 0x9CE4, 0x61C9, 0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, + 0x9CE8, 0x61C6, 0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, + 0x9CEC, 0x61CD, 0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, + 0x9CF0, 0x61FA, 0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, + 0x9CF4, 0x61FC, 0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, + 0x9CF8, 0x6209, 0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, + 0x9CFC, 0x621B, 0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, + 0x9D43, 0x622E, 0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, + 0x9D47, 0x6241, 0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, + 0x9D4B, 0x625B, 0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, + 0x9D4F, 0x6282, 0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, + 0x9D53, 0x6293, 0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, + 0x9D57, 0x6294, 0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, + 0x9D5B, 0x62CF, 0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, + 0x9D5F, 0x62C8, 0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, + 0x9D63, 0x62C2, 0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, + 0x9D67, 0x630C, 0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, + 0x9D6B, 0x6302, 0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, + 0x9D6F, 0x6350, 0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, + 0x9D73, 0x634F, 0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, + 0x9D77, 0x63AB, 0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, + 0x9D7B, 0x6389, 0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, + 0x9D80, 0x6369, 0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, + 0x9D84, 0x63C6, 0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, + 0x9D88, 0x63F6, 0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, + 0x9D8C, 0x6406, 0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, + 0x9D90, 0x651D, 0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, + 0x9D94, 0x6467, 0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, + 0x9D98, 0x652A, 0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, + 0x9D9C, 0x64A9, 0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, + 0x9DA0, 0x64D2, 0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, + 0x9DA4, 0x64D8, 0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, + 0x9DA8, 0x8209, 0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, + 0x9DAC, 0x64E3, 0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, + 0x9DB0, 0x64F4, 0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, + 0x9DB4, 0x64FD, 0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, + 0x9DB8, 0x6524, 0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, + 0x9DBC, 0x6535, 0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, + 0x9DC0, 0x754B, 0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, + 0x9DC4, 0x654D, 0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, + 0x9DC8, 0x6572, 0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, + 0x9DCC, 0x8B8A, 0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, + 0x9DD0, 0x65B7, 0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, + 0x9DD4, 0x65C4, 0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, + 0x9DD8, 0x65D9, 0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, + 0x9DDC, 0x6772, 0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, + 0x9DE0, 0x6773, 0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, + 0x9DE4, 0x661C, 0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, + 0x9DE8, 0x6641, 0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, + 0x9DEC, 0x6667, 0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, + 0x9DF0, 0x6670, 0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, + 0x9DF4, 0x6689, 0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, + 0x9DF8, 0x66C1, 0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, + 0x9DFC, 0x66BC, 0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, + 0x9E43, 0x66DA, 0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, + 0x9E47, 0x66E9, 0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, + 0x9E4B, 0x670F, 0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, + 0x9E4F, 0x6727, 0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, + 0x9E53, 0x6736, 0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, + 0x9E57, 0x6746, 0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, + 0x9E5B, 0x6763, 0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, + 0x9E5F, 0x67A9, 0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, + 0x9E63, 0x678B, 0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, + 0x9E67, 0x67B7, 0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, + 0x9E6B, 0x67B3, 0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, + 0x9E6F, 0x67DE, 0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, + 0x9E73, 0x67B9, 0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, + 0x9E77, 0x6A9C, 0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, + 0x9E7B, 0x6840, 0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, + 0x9E80, 0x68B3, 0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, + 0x9E84, 0x6877, 0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, + 0x9E88, 0x68AD, 0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, + 0x9E8C, 0x6883, 0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, + 0x9E90, 0x68B5, 0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, + 0x9E94, 0x688D, 0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, + 0x9E98, 0x6908, 0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, + 0x9E9C, 0x68E1, 0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, + 0x9EA0, 0x68E7, 0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, + 0x9EA4, 0x6904, 0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, + 0x9EA8, 0x68F9, 0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, + 0x9EAC, 0x692A, 0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, + 0x9EB0, 0x68C6, 0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, + 0x9EB4, 0x6978, 0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, + 0x9EB8, 0x696E, 0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, + 0x9EBC, 0x6959, 0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, + 0x9EC0, 0x695D, 0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, + 0x9EC4, 0x69AE, 0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, + 0x9EC8, 0x69D3, 0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, + 0x9ECC, 0x69CA, 0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, + 0x9ED0, 0x69A7, 0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, + 0x9ED4, 0x699C, 0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, + 0x9ED8, 0x69E8, 0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, + 0x9EDC, 0x6B0A, 0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, + 0x9EE0, 0x6A05, 0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, + 0x9EE4, 0x6A14, 0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, + 0x9EE8, 0x6AC1, 0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, + 0x9EEC, 0x6A0C, 0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, + 0x9EF0, 0x6A47, 0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, + 0x9EF4, 0x6A48, 0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, + 0x9EF8, 0x6A8D, 0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, + 0x9EFC, 0x6AA3, 0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, + 0x9F43, 0x6AC3, 0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, + 0x9F47, 0x6AAC, 0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, + 0x9F4B, 0x6AAA, 0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, + 0x9F4F, 0x6B05, 0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, + 0x9F53, 0x6B16, 0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, + 0x9F57, 0x6B37, 0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, + 0x9F5B, 0x6B47, 0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, + 0x9F5F, 0x6B59, 0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, + 0x9F63, 0x6B61, 0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, + 0x9F67, 0x6B80, 0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, + 0x9F6B, 0x6B98, 0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, + 0x9F6F, 0x6BAA, 0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, + 0x9F73, 0x6BB1, 0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, + 0x9F77, 0x6BC6, 0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, + 0x9F7B, 0x6BEC, 0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, + 0x9F80, 0x9EBE, 0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, + 0x9F84, 0x6C1B, 0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, + 0x9F88, 0x6C55, 0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, + 0x9F8C, 0x6C8D, 0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, + 0x9F90, 0x6C7E, 0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, + 0x9F94, 0x6C90, 0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, + 0x9F98, 0x6CBD, 0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, + 0x9F9C, 0x6CAE, 0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, + 0x9FA0, 0x6CDB, 0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, + 0x9FA4, 0x6D1F, 0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, + 0x9FA8, 0x6D3D, 0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, + 0x9FAC, 0x6D33, 0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, + 0x9FB0, 0x6D93, 0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, + 0x9FB4, 0x6D59, 0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, + 0x9FB8, 0x6D85, 0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, + 0x9FBC, 0x6DB5, 0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, + 0x9FC0, 0x6DC6, 0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, + 0x9FC4, 0x6DE8, 0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, + 0x9FC8, 0x6DD9, 0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, + 0x9FCC, 0x6DEE, 0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, + 0x9FD0, 0x6E19, 0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, + 0x9FD4, 0x6E23, 0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, + 0x9FD8, 0x6E4D, 0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, + 0x9FDC, 0x6E4E, 0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, + 0x9FE0, 0x6E38, 0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, + 0x9FE4, 0x6EC9, 0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, + 0x9FE8, 0x6EAF, 0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, + 0x9FEC, 0x6ED5, 0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, + 0x9FF0, 0x6E9F, 0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, + 0x9FF4, 0x6EEC, 0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, + 0x9FF8, 0x6EF2, 0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, + 0x9FFC, 0x6ECC, 0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, + 0xE043, 0x6F86, 0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, + 0xE047, 0x6F80, 0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, + 0xE04B, 0x6F6D, 0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, + 0xE04F, 0x6F8E, 0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, + 0xE053, 0x6FB3, 0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, + 0xE057, 0x6FB9, 0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, + 0xE05B, 0x6FD5, 0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, + 0xE05F, 0x6FF1, 0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, + 0xE063, 0x700B, 0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, + 0xE067, 0x700F, 0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, + 0xE06B, 0x6F74, 0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, + 0xE06F, 0x7030, 0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, + 0xE073, 0x7063, 0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, + 0xE077, 0x70F1, 0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, + 0xE07B, 0x70AE, 0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, + 0xE080, 0x70D9, 0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, + 0xE084, 0x7119, 0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, + 0xE088, 0x7166, 0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, + 0xE08C, 0x716C, 0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, + 0xE090, 0x7195, 0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, + 0xE094, 0x71B9, 0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, + 0xE098, 0x71D4, 0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, + 0xE09C, 0x71E7, 0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, + 0xE0A0, 0x71FF, 0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, + 0xE0A4, 0x7228, 0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, + 0xE0A8, 0x7232, 0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, + 0xE0AC, 0x7240, 0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, + 0xE0B0, 0x7274, 0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, + 0xE0B4, 0x7287, 0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, + 0xE0B8, 0x72A7, 0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, + 0xE0BC, 0x72C6, 0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, + 0xE0C0, 0x72E2, 0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, + 0xE0C4, 0x72F7, 0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, + 0xE0C8, 0x731C, 0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, + 0xE0CC, 0x732F, 0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, + 0xE0D0, 0x734E, 0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, + 0xE0D4, 0x736A, 0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, + 0xE0D8, 0x7375, 0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, + 0xE0DC, 0x73B3, 0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, + 0xE0E0, 0x73E5, 0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, + 0xE0E4, 0x7405, 0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, + 0xE0E8, 0x7432, 0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, + 0xE0EC, 0x745F, 0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, + 0xE0F0, 0x7469, 0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, + 0xE0F4, 0x7476, 0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, + 0xE0F8, 0x74A7, 0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, + 0xE0FC, 0x73F1, 0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, + 0xE143, 0x74E9, 0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, + 0xE147, 0x74F1, 0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, + 0xE14B, 0x7503, 0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, + 0xE14F, 0x750D, 0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, + 0xE153, 0x7526, 0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, + 0xE157, 0x754D, 0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, + 0xE15B, 0x7546, 0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, + 0xE15F, 0x7567, 0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, + 0xE163, 0x7576, 0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, + 0xE167, 0x758A, 0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, + 0xE16B, 0x759A, 0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, + 0xE16F, 0x75C2, 0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, + 0xE173, 0x75BD, 0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, + 0xE177, 0x75CD, 0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, + 0xE17B, 0x75E3, 0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, + 0xE180, 0x75FC, 0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, + 0xE184, 0x75F2, 0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, + 0xE188, 0x7609, 0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, + 0xE18C, 0x7621, 0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, + 0xE190, 0x7630, 0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, + 0xE194, 0x7646, 0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, + 0xE198, 0x7662, 0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, + 0xE19C, 0x7667, 0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, + 0xE1A0, 0x7676, 0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, + 0xE1A4, 0x7683, 0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, + 0xE1A8, 0x7696, 0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, + 0xE1AC, 0x76B0, 0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, + 0xE1B0, 0x76BA, 0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, + 0xE1B4, 0x76D2, 0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, + 0xE1B8, 0x76E7, 0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, + 0xE1BC, 0x7708, 0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, + 0xE1C0, 0x7724, 0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, + 0xE1C4, 0x771B, 0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, + 0xE1C8, 0x775A, 0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, + 0xE1CC, 0x7765, 0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, + 0xE1D0, 0x778E, 0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, + 0xE1D4, 0x779E, 0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, + 0xE1D8, 0x77BF, 0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, + 0xE1DC, 0x77C7, 0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, + 0xE1E0, 0x77DC, 0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, + 0xE1E4, 0x780C, 0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, + 0xE1E8, 0x792A, 0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, + 0xE1EC, 0x7886, 0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, + 0xE1F0, 0x78A3, 0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, + 0xE1F4, 0x78D1, 0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, + 0xE1F8, 0x78BE, 0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, + 0xE1FC, 0x78EC, 0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, + 0xE243, 0x78F4, 0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, + 0xE247, 0x7919, 0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, + 0xE24B, 0x7960, 0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, + 0xE24F, 0x7955, 0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, + 0xE253, 0x798A, 0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, + 0xE257, 0x79AA, 0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, + 0xE25B, 0x79BA, 0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, + 0xE25F, 0x79EC, 0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, + 0xE263, 0x7A0D, 0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, + 0xE267, 0x7A1F, 0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, + 0xE26B, 0x7A3E, 0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, + 0xE26F, 0x7A49, 0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, + 0xE273, 0x9F9D, 0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, + 0xE277, 0x7A88, 0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, + 0xE27B, 0x7A96, 0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, + 0xE280, 0x7AB6, 0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, + 0xE284, 0x9083, 0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, + 0xE288, 0x7ACF, 0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, + 0xE28C, 0x7ADA, 0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, + 0xE290, 0x7AE6, 0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, + 0xE294, 0x7B0F, 0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, + 0xE298, 0x7B18, 0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, + 0xE29C, 0x7B28, 0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, + 0xE2A0, 0x7B04, 0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, + 0xE2A4, 0x7B45, 0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, + 0xE2A8, 0x7B67, 0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, + 0xE2AC, 0x7B6E, 0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, + 0xE2B0, 0x7B8D, 0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, + 0xE2B4, 0x7B92, 0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, + 0xE2B8, 0x7BCB, 0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, + 0xE2BC, 0x7BB4, 0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, + 0xE2C0, 0x7C11, 0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, + 0xE2C4, 0x7C60, 0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, + 0xE2C8, 0x7BF3, 0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, + 0xE2CC, 0x7BF6, 0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, + 0xE2D0, 0x7C1F, 0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, + 0xE2D4, 0x7C4C, 0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, + 0xE2D8, 0x7C40, 0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, + 0xE2DC, 0x7C64, 0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, + 0xE2E0, 0x7C75, 0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, + 0xE2E4, 0x7CAD, 0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, + 0xE2E8, 0x7CA8, 0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, + 0xE2EC, 0x7CAE, 0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, + 0xE2F0, 0x7CC5, 0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, + 0xE2F4, 0x7CDC, 0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, + 0xE2F8, 0x7CF2, 0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, + 0xE2FC, 0x7D06, 0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, + 0xE343, 0x7D0A, 0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, + 0xE347, 0x7D32, 0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, + 0xE34B, 0x7D73, 0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, + 0xE34F, 0x7D68, 0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, + 0xE353, 0x7D93, 0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, + 0xE357, 0x7D7D, 0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, + 0xE35B, 0x7DA3, 0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, + 0xE35F, 0x7DAB, 0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, + 0xE363, 0x7DDC, 0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, + 0xE367, 0x7DD8, 0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, + 0xE36B, 0x7DFB, 0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, + 0xE36F, 0x7E0A, 0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, + 0xE373, 0x7E31, 0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, + 0xE377, 0x7E22, 0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, + 0xE37B, 0x7E35, 0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, + 0xE380, 0x7E32, 0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, + 0xE384, 0x7E56, 0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, + 0xE388, 0x7E79, 0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, + 0xE38C, 0x7E7B, 0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, + 0xE390, 0x8FAE, 0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, + 0xE394, 0x7E8C, 0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, + 0xE398, 0x7E94, 0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, + 0xE39C, 0x7E9C, 0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, + 0xE3A0, 0x7F4C, 0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, + 0xE3A4, 0x7F51, 0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, + 0xE3A8, 0x7F5F, 0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, + 0xE3AC, 0x7F67, 0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, + 0xE3B0, 0x7F83, 0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, + 0xE3B4, 0x7F94, 0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, + 0xE3B8, 0x7FA3, 0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, + 0xE3BC, 0x7FAE, 0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, + 0xE3C0, 0x7FC5, 0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, + 0xE3C4, 0x7FD4, 0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, + 0xE3C8, 0x7FF3, 0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, + 0xE3CC, 0x8004, 0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, + 0xE3D0, 0x8019, 0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, + 0xE3D4, 0x803F, 0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, + 0xE3D8, 0x8052, 0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, + 0xE3DC, 0x8062, 0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, + 0xE3E0, 0x8070, 0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, + 0xE3E4, 0x807F, 0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, + 0xE3E8, 0x809B, 0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, + 0xE3EC, 0x5190, 0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, + 0xE3F0, 0x80D9, 0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, + 0xE3F4, 0x80D6, 0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, + 0xE3F8, 0x811B, 0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, + 0xE3FC, 0x814B, 0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, + 0xE443, 0x8153, 0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, + 0xE447, 0x816E, 0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, + 0xE44B, 0x8183, 0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, + 0xE44F, 0x8182, 0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, + 0xE453, 0x81A3, 0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, + 0xE457, 0x81B0, 0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, + 0xE45B, 0x81BD, 0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, + 0xE45F, 0x81C9, 0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, + 0xE463, 0x81D8, 0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, + 0xE467, 0x81E0, 0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, + 0xE46B, 0x81FE, 0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, + 0xE46F, 0x8207, 0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, + 0xE473, 0x8216, 0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, + 0xE477, 0x8233, 0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, + 0xE47B, 0x825D, 0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, + 0xE480, 0x8262, 0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, + 0xE484, 0x822E, 0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, + 0xE488, 0x827E, 0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, + 0xE48C, 0x829F, 0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, + 0xE490, 0x82E3, 0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, + 0xE494, 0x82F3, 0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, + 0xE498, 0x82FB, 0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, + 0xE49C, 0x82DC, 0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, + 0xE4A0, 0x8334, 0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, + 0xE4A4, 0x8340, 0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, + 0xE4A8, 0x832F, 0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, + 0xE4AC, 0x8385, 0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, + 0xE4B0, 0x83A2, 0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, + 0xE4B4, 0x8387, 0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, + 0xE4B8, 0x8373, 0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, + 0xE4BC, 0x83A8, 0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, + 0xE4C0, 0x83CE, 0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, + 0xE4C4, 0x840B, 0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, + 0xE4C8, 0x83E0, 0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, + 0xE4CC, 0x8420, 0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, + 0xE4D0, 0x83FB, 0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, + 0xE4D4, 0x855A, 0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, + 0xE4D8, 0x84AD, 0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, + 0xE4DC, 0x8446, 0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, + 0xE4E0, 0x8435, 0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, + 0xE4E4, 0x84BF, 0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, + 0xE4E8, 0x84BB, 0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, + 0xE4EC, 0x84C6, 0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, + 0xE4F0, 0x84FF, 0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, + 0xE4F4, 0x852C, 0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, + 0xE4F8, 0x84FC, 0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, + 0xE4FC, 0x8548, 0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, + 0xE543, 0x8555, 0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, + 0xE547, 0x8591, 0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, + 0xE54B, 0x8594, 0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, + 0xE54F, 0x859C, 0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, + 0xE553, 0x85C9, 0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, + 0xE557, 0x85D0, 0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, + 0xE55B, 0x85DC, 0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, + 0xE55F, 0x860B, 0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, + 0xE563, 0x8622, 0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, + 0xE567, 0x864D, 0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, + 0xE56B, 0x8667, 0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, + 0xE56F, 0x86A9, 0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, + 0xE573, 0x86B6, 0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, + 0xE577, 0x86B0, 0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, + 0xE57B, 0x86D4, 0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, + 0xE580, 0x86DF, 0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, + 0xE584, 0x8706, 0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, + 0xE588, 0x86FB, 0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, + 0xE58C, 0x86F9, 0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, + 0xE590, 0x8737, 0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, + 0xE594, 0x871A, 0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, + 0xE598, 0x874C, 0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, + 0xE59C, 0x8768, 0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, + 0xE5A0, 0x8763, 0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, + 0xE5A4, 0x879F, 0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, + 0xE5A8, 0x87BD, 0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, + 0xE5AC, 0x87AB, 0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, + 0xE5B0, 0x87C6, 0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, + 0xE5B4, 0x87E0, 0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, + 0xE5B8, 0x87F6, 0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, + 0xE5BC, 0x8811, 0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, + 0xE5C0, 0x8821, 0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, + 0xE5C4, 0x8827, 0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, + 0xE5C8, 0x8852, 0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, + 0xE5CC, 0x886B, 0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, + 0xE5D0, 0x8875, 0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, + 0xE5D4, 0x8882, 0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, + 0xE5D8, 0x8899, 0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, + 0xE5DC, 0x88B0, 0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, + 0xE5E0, 0x88C4, 0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, + 0xE5E4, 0x88DD, 0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, + 0xE5E8, 0x88F4, 0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, + 0xE5EC, 0x890C, 0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, + 0xE5F0, 0x891E, 0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, + 0xE5F4, 0x8941, 0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, + 0xE5F8, 0x8938, 0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, + 0xE5FC, 0x895E, 0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, + 0xE643, 0x896A, 0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, + 0xE647, 0x897E, 0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, + 0xE64B, 0x8993, 0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, + 0xE64F, 0x89A6, 0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, + 0xE653, 0x89BA, 0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, + 0xE657, 0x89DA, 0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, + 0xE65B, 0x89F4, 0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, + 0xE65F, 0x8A10, 0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, + 0xE663, 0x8A25, 0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, + 0xE667, 0x8A52, 0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, + 0xE66B, 0x8A6D, 0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, + 0xE66F, 0x8A82, 0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, + 0xE673, 0x8A91, 0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, + 0xE677, 0x8AA3, 0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, + 0xE67B, 0x8ADA, 0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, + 0xE680, 0x8AE4, 0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, + 0xE684, 0x8AE2, 0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, + 0xE688, 0x8B0C, 0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, + 0xE68C, 0x8B16, 0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, + 0xE690, 0x8B33, 0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, + 0xE694, 0x8B3E, 0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, + 0xE698, 0x8B4F, 0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, + 0xE69C, 0x8B5B, 0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, + 0xE6A0, 0x8B6C, 0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, + 0xE6A4, 0x8B80, 0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, + 0xE6A8, 0x8B93, 0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, + 0xE6AC, 0x8C3A, 0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, + 0xE6B0, 0x8C4C, 0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, + 0xE6B4, 0x8C62, 0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, + 0xE6B8, 0x8C82, 0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, + 0xE6BC, 0x8C8D, 0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, + 0xE6C0, 0x8C98, 0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, + 0xE6C4, 0x8CBD, 0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, + 0xE6C8, 0x8CB6, 0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, + 0xE6CC, 0x8CE3, 0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, + 0xE6D0, 0x8CFB, 0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, + 0xE6D4, 0x8D07, 0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, + 0xE6D8, 0x9F4E, 0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, + 0xE6DC, 0x8D16, 0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, + 0xE6E0, 0x8D73, 0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, + 0xE6E4, 0x8DBE, 0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, + 0xE6E8, 0x8DD6, 0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, + 0xE6EC, 0x8DEA, 0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, + 0xE6F0, 0x8DFC, 0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, + 0xE6F4, 0x8E1D, 0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, + 0xE6F8, 0x8E42, 0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, + 0xE6FC, 0x8E4A, 0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, + 0xE743, 0x8E50, 0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, + 0xE747, 0x8E60, 0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, + 0xE74B, 0x8E76, 0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, + 0xE74F, 0x8E87, 0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, + 0xE753, 0x8E8A, 0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, + 0xE757, 0x8E99, 0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, + 0xE75B, 0x8EB0, 0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, + 0xE75F, 0x8EC5, 0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, + 0xE763, 0x8EE3, 0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, + 0xE767, 0x8EFE, 0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, + 0xE76B, 0x8F12, 0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, + 0xE76F, 0x8F1F, 0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, + 0xE773, 0x8F33, 0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, + 0xE777, 0x8F42, 0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, + 0xE77B, 0x8F46, 0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, + 0xE780, 0x8F62, 0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, + 0xE784, 0x8F9F, 0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, + 0xE788, 0x8FB7, 0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, + 0xE78C, 0x8FEA, 0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, + 0xE790, 0x9005, 0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, + 0xE794, 0x9015, 0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, + 0xE798, 0x9016, 0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, + 0xE79C, 0x9035, 0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, + 0xE7A0, 0x9050, 0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, + 0xE7A4, 0x9049, 0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, + 0xE7A8, 0x905E, 0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, + 0xE7AC, 0x96A8, 0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, + 0xE7B0, 0x9081, 0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, + 0xE7B4, 0x908F, 0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, + 0xE7B8, 0x90B5, 0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, + 0xE7BC, 0x90DB, 0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, + 0xE7C0, 0x9132, 0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, + 0xE7C4, 0x9158, 0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, + 0xE7C8, 0x9173, 0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, + 0xE7CC, 0x9182, 0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, + 0xE7D0, 0x91AA, 0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, + 0xE7D4, 0x91C0, 0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, + 0xE7D8, 0x91D0, 0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, + 0xE7DC, 0x91DB, 0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, + 0xE7E0, 0x921E, 0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, + 0xE7E4, 0x9215, 0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, + 0xE7E8, 0x9245, 0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, + 0xE7EC, 0x9295, 0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, + 0xE7F0, 0x929C, 0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, + 0xE7F4, 0x925A, 0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, + 0xE7F8, 0x92E9, 0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, + 0xE7FC, 0x932E, 0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, + 0xE843, 0x9323, 0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, + 0xE847, 0x935C, 0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, + 0xE84B, 0x9356, 0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, + 0xE84F, 0x9394, 0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, + 0xE853, 0x93E8, 0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, + 0xE857, 0x93DD, 0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, + 0xE85B, 0x941A, 0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, + 0xE85F, 0x9407, 0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, + 0xE863, 0x9435, 0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, + 0xE867, 0x9452, 0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, + 0xE86B, 0x9462, 0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, + 0xE86F, 0x9470, 0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, + 0xE873, 0x945A, 0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, + 0xE877, 0x947F, 0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, + 0xE87B, 0x9594, 0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, + 0xE880, 0x95A0, 0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, + 0xE884, 0x95BC, 0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, + 0xE888, 0x95CA, 0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, + 0xE88C, 0x95CC, 0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, + 0xE890, 0x95DC, 0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, + 0xE894, 0x9621, 0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, + 0xE898, 0x9642, 0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, + 0xE89C, 0x9677, 0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, + 0xE8A0, 0x965F, 0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, + 0xE8A4, 0x968D, 0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, + 0xE8A8, 0x96AA, 0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, + 0xE8AC, 0x96B0, 0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, + 0xE8B0, 0x96B9, 0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, + 0xE8B4, 0x96CD, 0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, + 0xE8B8, 0x96D5, 0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, + 0xE8BC, 0x9708, 0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, + 0xE8C0, 0x970F, 0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, + 0xE8C4, 0x972A, 0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, + 0xE8C8, 0x973E, 0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, + 0xE8CC, 0x9742, 0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, + 0xE8D0, 0x9764, 0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, + 0xE8D4, 0x976B, 0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, + 0xE8D8, 0x977C, 0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, + 0xE8DC, 0x978B, 0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, + 0xE8E0, 0x97A8, 0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, + 0xE8E4, 0x97B4, 0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, + 0xE8E8, 0x97CB, 0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, + 0xE8EC, 0x97F2, 0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, + 0xE8F0, 0x980F, 0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, + 0xE8F4, 0x9821, 0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, + 0xE8F8, 0x984F, 0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, + 0xE8FC, 0x9870, 0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, + 0xE943, 0x98AA, 0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, + 0xE947, 0x98C4, 0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, + 0xE94B, 0x98EB, 0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, + 0xE94F, 0x9914, 0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, + 0xE953, 0x991E, 0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, + 0xE957, 0x992E, 0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, + 0xE95B, 0x9949, 0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, + 0xE95F, 0x9951, 0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, + 0xE963, 0x9997, 0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, + 0xE967, 0x99AE, 0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, + 0xE96B, 0x99DD, 0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, + 0xE96F, 0x99EE, 0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, + 0xE973, 0x99F8, 0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, + 0xE977, 0x99E2, 0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, + 0xE97B, 0x9A45, 0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, + 0xE980, 0x9A3E, 0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, + 0xE984, 0x9A57, 0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, + 0xE988, 0x9A64, 0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, + 0xE98C, 0x9AAD, 0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, + 0xE990, 0x9ACF, 0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, + 0xE994, 0x9ADE, 0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, + 0xE998, 0x9AE6, 0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, + 0xE99C, 0x9AF4, 0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, + 0xE9A0, 0x9B06, 0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, + 0xE9A4, 0x9B22, 0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, + 0xE9A8, 0x9B28, 0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, + 0xE9AC, 0x9B2F, 0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, + 0xE9B0, 0x9B4F, 0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, + 0xE9B4, 0x9B58, 0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, + 0xE9B8, 0x9B91, 0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, + 0xE9BC, 0x9BA0, 0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, + 0xE9C0, 0x9BCA, 0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, + 0xE9C4, 0x9BD1, 0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, + 0xE9C8, 0x9BE4, 0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, + 0xE9CC, 0x9BF2, 0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, + 0xE9D0, 0x9C14, 0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, + 0xE9D4, 0x9C06, 0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, + 0xE9D8, 0x9C04, 0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, + 0xE9DC, 0x9C24, 0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, + 0xE9E0, 0x9C32, 0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, + 0xE9E4, 0x9C60, 0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, + 0xE9E8, 0x9CE7, 0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, + 0xE9EC, 0x9D08, 0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, + 0xE9F0, 0x9D2A, 0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, + 0xE9F4, 0x9D1F, 0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, + 0xE9F8, 0x9D41, 0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, + 0xE9FC, 0x9D48, 0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, + 0xEA43, 0x9D51, 0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, + 0xEA47, 0x9D89, 0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, + 0xEA4B, 0x9D7A, 0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, + 0xEA4F, 0x9DB2, 0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, + 0xEA53, 0x9DB8, 0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, + 0xEA57, 0x9DC2, 0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, + 0xEA5B, 0x9DE6, 0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, + 0xEA5F, 0x9E1A, 0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, + 0xEA63, 0x9E79, 0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, + 0xEA67, 0x9E8B, 0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, + 0xEA6B, 0x9E91, 0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, + 0xEA6F, 0x9EB8, 0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, + 0xEA73, 0x9ECC, 0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, + 0xEA77, 0x9ED4, 0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, + 0xEA7B, 0x9EE0, 0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, + 0xEA80, 0x9EF4, 0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, + 0xEA84, 0x9EFB, 0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, + 0xEA88, 0x9F08, 0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, + 0xEA8C, 0x9F2C, 0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, + 0xEA90, 0x9F54, 0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, + 0xEA94, 0x9F61, 0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, + 0xEA98, 0x9F6A, 0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, + 0xEA9C, 0x9F95, 0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, + 0xEAA0, 0x69C7, 0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, + 0xEAA4, 0x7199, 0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, + 0xFA43, 0x2173, 0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, + 0xFA47, 0x2177, 0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, + 0xFA56, 0xFF07, 0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, + 0xFA5E, 0x9348, 0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, + 0xFA62, 0x70BB, 0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, + 0xFA66, 0x66FB, 0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, + 0xFA6A, 0x4EFC, 0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, + 0xFA6E, 0x4F56, 0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, + 0xFA72, 0x4F94, 0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, + 0xFA76, 0x4FFF, 0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, + 0xFA7A, 0x5042, 0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, + 0xFA7E, 0x514A, 0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, + 0xFA83, 0x51EC, 0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, + 0xFA87, 0x52C0, 0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, + 0xFA8B, 0x5324, 0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, + 0xFA8F, 0x53DD, 0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, + 0xFA93, 0x54A9, 0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, + 0xFA97, 0x5765, 0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, + 0xFA9B, 0xFA0F, 0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, + 0xFA9F, 0x590B, 0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, + 0xFAA3, 0x5963, 0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, + 0xFAA7, 0x5BC0, 0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, + 0xFAAB, 0x5C1E, 0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, + 0xFAAF, 0x5D27, 0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, + 0xFAB3, 0x5D6D, 0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, + 0xFAB7, 0x5F21, 0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, + 0xFABB, 0x5FDE, 0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, + 0xFABF, 0x60DE, 0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, + 0xFAC3, 0x6111, 0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, + 0xFAC7, 0x6213, 0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, + 0xFACB, 0x649D, 0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, + 0xFACF, 0x6615, 0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, + 0xFAD3, 0x661E, 0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, + 0xFAD7, 0x6659, 0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, + 0xFADB, 0x66A0, 0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, + 0xFADF, 0x670E, 0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, + 0xFAE3, 0x6852, 0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, + 0xFAE7, 0x68CF, 0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, + 0xFAEB, 0x6998, 0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, + 0xFAEF, 0x6A46, 0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, + 0xFAF3, 0x6AE4, 0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, + 0xFAF7, 0x6C86, 0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, + 0xFAFB, 0x6D87, 0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, + 0xFB42, 0x6DCF, 0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, + 0xFB46, 0x6E39, 0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, + 0xFB4A, 0x6EBF, 0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, + 0xFB4E, 0x7005, 0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, + 0xFB52, 0x70AB, 0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, + 0xFB56, 0x7146, 0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, + 0xFB5A, 0x71FE, 0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, + 0xFB5E, 0xFA16, 0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, + 0xFB62, 0x73D6, 0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, + 0xFB66, 0x73F5, 0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, + 0xFB6A, 0x742E, 0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, + 0xFB6E, 0x7501, 0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, + 0xFB72, 0x769E, 0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, + 0xFB76, 0x7746, 0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, + 0xFB7A, 0x7864, 0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, + 0xFB7E, 0xFA19, 0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, + 0xFB83, 0x799B, 0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, + 0xFB87, 0x7AEB, 0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, + 0xFB8B, 0x7D5C, 0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, + 0xFB8F, 0x7E52, 0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, + 0xFB93, 0x8301, 0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, + 0xFB97, 0x83F6, 0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, + 0xFB9B, 0x8559, 0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, + 0xFB9F, 0xFA20, 0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, + 0xFBA3, 0x8A12, 0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, + 0xFBA7, 0x8ABE, 0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, + 0xFBAB, 0x8B53, 0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, + 0xFBAF, 0x8D12, 0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, + 0xFBB3, 0xFA24, 0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, + 0xFBB7, 0xFA26, 0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, + 0xFBBB, 0x91D7, 0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, + 0xFBBF, 0x91E4, 0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, + 0xFBC3, 0x920A, 0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, + 0xFBC7, 0x924E, 0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, + 0xFBCB, 0x9267, 0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, + 0xFBCF, 0x92E7, 0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, + 0xFBD3, 0xFA27, 0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, + 0xFBD7, 0x9325, 0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, + 0xFBDB, 0x931E, 0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, + 0xFBDF, 0x9370, 0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, + 0xFBE3, 0x93DE, 0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, + 0xFBE7, 0x9448, 0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, + 0xFBEB, 0x969D, 0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, + 0xFBEF, 0x9743, 0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, + 0xFBF3, 0x9755, 0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, + 0xFBF7, 0xFA2B, 0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, + 0xFBFB, 0x9A4E, 0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, + 0xFC42, 0x9B72, 0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, + 0xFC46, 0x9C00, 0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, + 0xFC4A, 0x9E19, 0xFC4B, 0x9ED1, 0, 0 +}; +#endif + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR chr, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (chr <= 0x80) { /* ASCII */ + c = chr; + } else { +#if !_TINY_TABLE + if (dir) { /* OEMCP to unicode */ + p = sjis2uni; + hi = sizeof(sjis2uni) / 4 - 1; + } else { /* Unicode to OEMCP */ + p = uni2sjis; + hi = sizeof(uni2sjis) / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (chr == p[i * 2]) break; + if (chr > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; +#else + if (dir) { /* OEMCP to unicode (Incremental search)*/ + p = &uni2sjis[1]; + do { + c = *p; + p += 2; + } while (c && c != chr); + p -= 3; + c = *p; + } else { /* Unicode to OEMCP */ + li = 0; hi = sizeof(uni2sjis) / 4 - 1; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (chr == uni2sjis[i * 2]) break; + if (chr > uni2sjis[i * 2]) + li = i; + else + hi = i; + } + c = n ? uni2sjis[i * 2 + 1] : 0; + } +#endif + } + + return c; +} + + + +WCHAR ff_wtoupper ( /* Upper converted character */ + WCHAR chr /* Input character */ +) +{ + static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; + static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; + int i; + + + for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + + return tbl_lower[i] ? tbl_upper[i] : chr; +} diff --git a/third_party/fatfs/src/option/cc936.c b/third_party/fatfs/src/option/cc936.c new file mode 100644 index 0000000..07a7c1c --- /dev/null +++ b/third_party/fatfs/src/option/cc936.c @@ -0,0 +1,10973 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ +/* */ +/* CP936 (Simplified Chinese GBK) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + + +#if !_USE_LFN || _CODE_PAGE != 936 +#error This file is not needed in current configuration. Remove from the project. +#endif + +static +const WCHAR uni2oem[] = { +/* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ + 0x00A4, 0xA1E8, 0x00A7, 0xA1EC, 0x00A8, 0xA1A7, 0x00B0, 0xA1E3, + 0x00B1, 0xA1C0, 0x00B7, 0xA1A4, 0x00D7, 0xA1C1, 0x00E0, 0xA8A4, + 0x00E1, 0xA8A2, 0x00E8, 0xA8A8, 0x00E9, 0xA8A6, 0x00EA, 0xA8BA, + 0x00EC, 0xA8AC, 0x00ED, 0xA8AA, 0x00F2, 0xA8B0, 0x00F3, 0xA8AE, + 0x00F7, 0xA1C2, 0x00F9, 0xA8B4, 0x00FA, 0xA8B2, 0x00FC, 0xA8B9, + 0x0101, 0xA8A1, 0x0113, 0xA8A5, 0x011B, 0xA8A7, 0x012B, 0xA8A9, + 0x0144, 0xA8BD, 0x0148, 0xA8BE, 0x014D, 0xA8AD, 0x016B, 0xA8B1, + 0x01CE, 0xA8A3, 0x01D0, 0xA8AB, 0x01D2, 0xA8AF, 0x01D4, 0xA8B3, + 0x01D6, 0xA8B5, 0x01D8, 0xA8B6, 0x01DA, 0xA8B7, 0x01DC, 0xA8B8, + 0x0251, 0xA8BB, 0x0261, 0xA8C0, 0x02C7, 0xA1A6, 0x02C9, 0xA1A5, + 0x02CA, 0xA840, 0x02CB, 0xA841, 0x02D9, 0xA842, 0x0391, 0xA6A1, + 0x0392, 0xA6A2, 0x0393, 0xA6A3, 0x0394, 0xA6A4, 0x0395, 0xA6A5, + 0x0396, 0xA6A6, 0x0397, 0xA6A7, 0x0398, 0xA6A8, 0x0399, 0xA6A9, + 0x039A, 0xA6AA, 0x039B, 0xA6AB, 0x039C, 0xA6AC, 0x039D, 0xA6AD, + 0x039E, 0xA6AE, 0x039F, 0xA6AF, 0x03A0, 0xA6B0, 0x03A1, 0xA6B1, + 0x03A3, 0xA6B2, 0x03A4, 0xA6B3, 0x03A5, 0xA6B4, 0x03A6, 0xA6B5, + 0x03A7, 0xA6B6, 0x03A8, 0xA6B7, 0x03A9, 0xA6B8, 0x03B1, 0xA6C1, + 0x03B2, 0xA6C2, 0x03B3, 0xA6C3, 0x03B4, 0xA6C4, 0x03B5, 0xA6C5, + 0x03B6, 0xA6C6, 0x03B7, 0xA6C7, 0x03B8, 0xA6C8, 0x03B9, 0xA6C9, + 0x03BA, 0xA6CA, 0x03BB, 0xA6CB, 0x03BC, 0xA6CC, 0x03BD, 0xA6CD, + 0x03BE, 0xA6CE, 0x03BF, 0xA6CF, 0x03C0, 0xA6D0, 0x03C1, 0xA6D1, + 0x03C3, 0xA6D2, 0x03C4, 0xA6D3, 0x03C5, 0xA6D4, 0x03C6, 0xA6D5, + 0x03C7, 0xA6D6, 0x03C8, 0xA6D7, 0x03C9, 0xA6D8, 0x0401, 0xA7A7, + 0x0410, 0xA7A1, 0x0411, 0xA7A2, 0x0412, 0xA7A3, 0x0413, 0xA7A4, + 0x0414, 0xA7A5, 0x0415, 0xA7A6, 0x0416, 0xA7A8, 0x0417, 0xA7A9, + 0x0418, 0xA7AA, 0x0419, 0xA7AB, 0x041A, 0xA7AC, 0x041B, 0xA7AD, + 0x041C, 0xA7AE, 0x041D, 0xA7AF, 0x041E, 0xA7B0, 0x041F, 0xA7B1, + 0x0420, 0xA7B2, 0x0421, 0xA7B3, 0x0422, 0xA7B4, 0x0423, 0xA7B5, + 0x0424, 0xA7B6, 0x0425, 0xA7B7, 0x0426, 0xA7B8, 0x0427, 0xA7B9, + 0x0428, 0xA7BA, 0x0429, 0xA7BB, 0x042A, 0xA7BC, 0x042B, 0xA7BD, + 0x042C, 0xA7BE, 0x042D, 0xA7BF, 0x042E, 0xA7C0, 0x042F, 0xA7C1, + 0x0430, 0xA7D1, 0x0431, 0xA7D2, 0x0432, 0xA7D3, 0x0433, 0xA7D4, + 0x0434, 0xA7D5, 0x0435, 0xA7D6, 0x0436, 0xA7D8, 0x0437, 0xA7D9, + 0x0438, 0xA7DA, 0x0439, 0xA7DB, 0x043A, 0xA7DC, 0x043B, 0xA7DD, + 0x043C, 0xA7DE, 0x043D, 0xA7DF, 0x043E, 0xA7E0, 0x043F, 0xA7E1, + 0x0440, 0xA7E2, 0x0441, 0xA7E3, 0x0442, 0xA7E4, 0x0443, 0xA7E5, + 0x0444, 0xA7E6, 0x0445, 0xA7E7, 0x0446, 0xA7E8, 0x0447, 0xA7E9, + 0x0448, 0xA7EA, 0x0449, 0xA7EB, 0x044A, 0xA7EC, 0x044B, 0xA7ED, + 0x044C, 0xA7EE, 0x044D, 0xA7EF, 0x044E, 0xA7F0, 0x044F, 0xA7F1, + 0x0451, 0xA7D7, 0x2010, 0xA95C, 0x2013, 0xA843, 0x2014, 0xA1AA, + 0x2015, 0xA844, 0x2016, 0xA1AC, 0x2018, 0xA1AE, 0x2019, 0xA1AF, + 0x201C, 0xA1B0, 0x201D, 0xA1B1, 0x2025, 0xA845, 0x2026, 0xA1AD, + 0x2030, 0xA1EB, 0x2032, 0xA1E4, 0x2033, 0xA1E5, 0x2035, 0xA846, + 0x203B, 0xA1F9, 0x20AC, 0x0080, 0x2103, 0xA1E6, 0x2105, 0xA847, + 0x2109, 0xA848, 0x2116, 0xA1ED, 0x2121, 0xA959, 0x2160, 0xA2F1, + 0x2161, 0xA2F2, 0x2162, 0xA2F3, 0x2163, 0xA2F4, 0x2164, 0xA2F5, + 0x2165, 0xA2F6, 0x2166, 0xA2F7, 0x2167, 0xA2F8, 0x2168, 0xA2F9, + 0x2169, 0xA2FA, 0x216A, 0xA2FB, 0x216B, 0xA2FC, 0x2170, 0xA2A1, + 0x2171, 0xA2A2, 0x2172, 0xA2A3, 0x2173, 0xA2A4, 0x2174, 0xA2A5, + 0x2175, 0xA2A6, 0x2176, 0xA2A7, 0x2177, 0xA2A8, 0x2178, 0xA2A9, + 0x2179, 0xA2AA, 0x2190, 0xA1FB, 0x2191, 0xA1FC, 0x2192, 0xA1FA, + 0x2193, 0xA1FD, 0x2196, 0xA849, 0x2197, 0xA84A, 0x2198, 0xA84B, + 0x2199, 0xA84C, 0x2208, 0xA1CA, 0x220F, 0xA1C7, 0x2211, 0xA1C6, + 0x2215, 0xA84D, 0x221A, 0xA1CC, 0x221D, 0xA1D8, 0x221E, 0xA1DE, + 0x221F, 0xA84E, 0x2220, 0xA1CF, 0x2223, 0xA84F, 0x2225, 0xA1CE, + 0x2227, 0xA1C4, 0x2228, 0xA1C5, 0x2229, 0xA1C9, 0x222A, 0xA1C8, + 0x222B, 0xA1D2, 0x222E, 0xA1D3, 0x2234, 0xA1E0, 0x2235, 0xA1DF, + 0x2236, 0xA1C3, 0x2237, 0xA1CB, 0x223D, 0xA1D7, 0x2248, 0xA1D6, + 0x224C, 0xA1D5, 0x2252, 0xA850, 0x2260, 0xA1D9, 0x2261, 0xA1D4, + 0x2264, 0xA1DC, 0x2265, 0xA1DD, 0x2266, 0xA851, 0x2267, 0xA852, + 0x226E, 0xA1DA, 0x226F, 0xA1DB, 0x2295, 0xA892, 0x2299, 0xA1D1, + 0x22A5, 0xA1CD, 0x22BF, 0xA853, 0x2312, 0xA1D0, 0x2460, 0xA2D9, + 0x2461, 0xA2DA, 0x2462, 0xA2DB, 0x2463, 0xA2DC, 0x2464, 0xA2DD, + 0x2465, 0xA2DE, 0x2466, 0xA2DF, 0x2467, 0xA2E0, 0x2468, 0xA2E1, + 0x2469, 0xA2E2, 0x2474, 0xA2C5, 0x2475, 0xA2C6, 0x2476, 0xA2C7, + 0x2477, 0xA2C8, 0x2478, 0xA2C9, 0x2479, 0xA2CA, 0x247A, 0xA2CB, + 0x247B, 0xA2CC, 0x247C, 0xA2CD, 0x247D, 0xA2CE, 0x247E, 0xA2CF, + 0x247F, 0xA2D0, 0x2480, 0xA2D1, 0x2481, 0xA2D2, 0x2482, 0xA2D3, + 0x2483, 0xA2D4, 0x2484, 0xA2D5, 0x2485, 0xA2D6, 0x2486, 0xA2D7, + 0x2487, 0xA2D8, 0x2488, 0xA2B1, 0x2489, 0xA2B2, 0x248A, 0xA2B3, + 0x248B, 0xA2B4, 0x248C, 0xA2B5, 0x248D, 0xA2B6, 0x248E, 0xA2B7, + 0x248F, 0xA2B8, 0x2490, 0xA2B9, 0x2491, 0xA2BA, 0x2492, 0xA2BB, + 0x2493, 0xA2BC, 0x2494, 0xA2BD, 0x2495, 0xA2BE, 0x2496, 0xA2BF, + 0x2497, 0xA2C0, 0x2498, 0xA2C1, 0x2499, 0xA2C2, 0x249A, 0xA2C3, + 0x249B, 0xA2C4, 0x2500, 0xA9A4, 0x2501, 0xA9A5, 0x2502, 0xA9A6, + 0x2503, 0xA9A7, 0x2504, 0xA9A8, 0x2505, 0xA9A9, 0x2506, 0xA9AA, + 0x2507, 0xA9AB, 0x2508, 0xA9AC, 0x2509, 0xA9AD, 0x250A, 0xA9AE, + 0x250B, 0xA9AF, 0x250C, 0xA9B0, 0x250D, 0xA9B1, 0x250E, 0xA9B2, + 0x250F, 0xA9B3, 0x2510, 0xA9B4, 0x2511, 0xA9B5, 0x2512, 0xA9B6, + 0x2513, 0xA9B7, 0x2514, 0xA9B8, 0x2515, 0xA9B9, 0x2516, 0xA9BA, + 0x2517, 0xA9BB, 0x2518, 0xA9BC, 0x2519, 0xA9BD, 0x251A, 0xA9BE, + 0x251B, 0xA9BF, 0x251C, 0xA9C0, 0x251D, 0xA9C1, 0x251E, 0xA9C2, + 0x251F, 0xA9C3, 0x2520, 0xA9C4, 0x2521, 0xA9C5, 0x2522, 0xA9C6, + 0x2523, 0xA9C7, 0x2524, 0xA9C8, 0x2525, 0xA9C9, 0x2526, 0xA9CA, + 0x2527, 0xA9CB, 0x2528, 0xA9CC, 0x2529, 0xA9CD, 0x252A, 0xA9CE, + 0x252B, 0xA9CF, 0x252C, 0xA9D0, 0x252D, 0xA9D1, 0x252E, 0xA9D2, + 0x252F, 0xA9D3, 0x2530, 0xA9D4, 0x2531, 0xA9D5, 0x2532, 0xA9D6, + 0x2533, 0xA9D7, 0x2534, 0xA9D8, 0x2535, 0xA9D9, 0x2536, 0xA9DA, + 0x2537, 0xA9DB, 0x2538, 0xA9DC, 0x2539, 0xA9DD, 0x253A, 0xA9DE, + 0x253B, 0xA9DF, 0x253C, 0xA9E0, 0x253D, 0xA9E1, 0x253E, 0xA9E2, + 0x253F, 0xA9E3, 0x2540, 0xA9E4, 0x2541, 0xA9E5, 0x2542, 0xA9E6, + 0x2543, 0xA9E7, 0x2544, 0xA9E8, 0x2545, 0xA9E9, 0x2546, 0xA9EA, + 0x2547, 0xA9EB, 0x2548, 0xA9EC, 0x2549, 0xA9ED, 0x254A, 0xA9EE, + 0x254B, 0xA9EF, 0x2550, 0xA854, 0x2551, 0xA855, 0x2552, 0xA856, + 0x2553, 0xA857, 0x2554, 0xA858, 0x2555, 0xA859, 0x2556, 0xA85A, + 0x2557, 0xA85B, 0x2558, 0xA85C, 0x2559, 0xA85D, 0x255A, 0xA85E, + 0x255B, 0xA85F, 0x255C, 0xA860, 0x255D, 0xA861, 0x255E, 0xA862, + 0x255F, 0xA863, 0x2560, 0xA864, 0x2561, 0xA865, 0x2562, 0xA866, + 0x2563, 0xA867, 0x2564, 0xA868, 0x2565, 0xA869, 0x2566, 0xA86A, + 0x2567, 0xA86B, 0x2568, 0xA86C, 0x2569, 0xA86D, 0x256A, 0xA86E, + 0x256B, 0xA86F, 0x256C, 0xA870, 0x256D, 0xA871, 0x256E, 0xA872, + 0x256F, 0xA873, 0x2570, 0xA874, 0x2571, 0xA875, 0x2572, 0xA876, + 0x2573, 0xA877, 0x2581, 0xA878, 0x2582, 0xA879, 0x2583, 0xA87A, + 0x2584, 0xA87B, 0x2585, 0xA87C, 0x2586, 0xA87D, 0x2587, 0xA87E, + 0x2588, 0xA880, 0x2589, 0xA881, 0x258A, 0xA882, 0x258B, 0xA883, + 0x258C, 0xA884, 0x258D, 0xA885, 0x258E, 0xA886, 0x258F, 0xA887, + 0x2593, 0xA888, 0x2594, 0xA889, 0x2595, 0xA88A, 0x25A0, 0xA1F6, + 0x25A1, 0xA1F5, 0x25B2, 0xA1F8, 0x25B3, 0xA1F7, 0x25BC, 0xA88B, + 0x25BD, 0xA88C, 0x25C6, 0xA1F4, 0x25C7, 0xA1F3, 0x25CB, 0xA1F0, + 0x25CE, 0xA1F2, 0x25CF, 0xA1F1, 0x25E2, 0xA88D, 0x25E3, 0xA88E, + 0x25E4, 0xA88F, 0x25E5, 0xA890, 0x2605, 0xA1EF, 0x2606, 0xA1EE, + 0x2609, 0xA891, 0x2640, 0xA1E2, 0x2642, 0xA1E1, 0x3000, 0xA1A1, + 0x3001, 0xA1A2, 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3005, 0xA1A9, + 0x3006, 0xA965, 0x3007, 0xA996, 0x3008, 0xA1B4, 0x3009, 0xA1B5, + 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, + 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BE, 0x3011, 0xA1BF, + 0x3012, 0xA893, 0x3013, 0xA1FE, 0x3014, 0xA1B2, 0x3015, 0xA1B3, + 0x3016, 0xA1BC, 0x3017, 0xA1BD, 0x301D, 0xA894, 0x301E, 0xA895, + 0x3021, 0xA940, 0x3022, 0xA941, 0x3023, 0xA942, 0x3024, 0xA943, + 0x3025, 0xA944, 0x3026, 0xA945, 0x3027, 0xA946, 0x3028, 0xA947, + 0x3029, 0xA948, 0x3041, 0xA4A1, 0x3042, 0xA4A2, 0x3043, 0xA4A3, + 0x3044, 0xA4A4, 0x3045, 0xA4A5, 0x3046, 0xA4A6, 0x3047, 0xA4A7, + 0x3048, 0xA4A8, 0x3049, 0xA4A9, 0x304A, 0xA4AA, 0x304B, 0xA4AB, + 0x304C, 0xA4AC, 0x304D, 0xA4AD, 0x304E, 0xA4AE, 0x304F, 0xA4AF, + 0x3050, 0xA4B0, 0x3051, 0xA4B1, 0x3052, 0xA4B2, 0x3053, 0xA4B3, + 0x3054, 0xA4B4, 0x3055, 0xA4B5, 0x3056, 0xA4B6, 0x3057, 0xA4B7, + 0x3058, 0xA4B8, 0x3059, 0xA4B9, 0x305A, 0xA4BA, 0x305B, 0xA4BB, + 0x305C, 0xA4BC, 0x305D, 0xA4BD, 0x305E, 0xA4BE, 0x305F, 0xA4BF, + 0x3060, 0xA4C0, 0x3061, 0xA4C1, 0x3062, 0xA4C2, 0x3063, 0xA4C3, + 0x3064, 0xA4C4, 0x3065, 0xA4C5, 0x3066, 0xA4C6, 0x3067, 0xA4C7, + 0x3068, 0xA4C8, 0x3069, 0xA4C9, 0x306A, 0xA4CA, 0x306B, 0xA4CB, + 0x306C, 0xA4CC, 0x306D, 0xA4CD, 0x306E, 0xA4CE, 0x306F, 0xA4CF, + 0x3070, 0xA4D0, 0x3071, 0xA4D1, 0x3072, 0xA4D2, 0x3073, 0xA4D3, + 0x3074, 0xA4D4, 0x3075, 0xA4D5, 0x3076, 0xA4D6, 0x3077, 0xA4D7, + 0x3078, 0xA4D8, 0x3079, 0xA4D9, 0x307A, 0xA4DA, 0x307B, 0xA4DB, + 0x307C, 0xA4DC, 0x307D, 0xA4DD, 0x307E, 0xA4DE, 0x307F, 0xA4DF, + 0x3080, 0xA4E0, 0x3081, 0xA4E1, 0x3082, 0xA4E2, 0x3083, 0xA4E3, + 0x3084, 0xA4E4, 0x3085, 0xA4E5, 0x3086, 0xA4E6, 0x3087, 0xA4E7, + 0x3088, 0xA4E8, 0x3089, 0xA4E9, 0x308A, 0xA4EA, 0x308B, 0xA4EB, + 0x308C, 0xA4EC, 0x308D, 0xA4ED, 0x308E, 0xA4EE, 0x308F, 0xA4EF, + 0x3090, 0xA4F0, 0x3091, 0xA4F1, 0x3092, 0xA4F2, 0x3093, 0xA4F3, + 0x309B, 0xA961, 0x309C, 0xA962, 0x309D, 0xA966, 0x309E, 0xA967, + 0x30A1, 0xA5A1, 0x30A2, 0xA5A2, 0x30A3, 0xA5A3, 0x30A4, 0xA5A4, + 0x30A5, 0xA5A5, 0x30A6, 0xA5A6, 0x30A7, 0xA5A7, 0x30A8, 0xA5A8, + 0x30A9, 0xA5A9, 0x30AA, 0xA5AA, 0x30AB, 0xA5AB, 0x30AC, 0xA5AC, + 0x30AD, 0xA5AD, 0x30AE, 0xA5AE, 0x30AF, 0xA5AF, 0x30B0, 0xA5B0, + 0x30B1, 0xA5B1, 0x30B2, 0xA5B2, 0x30B3, 0xA5B3, 0x30B4, 0xA5B4, + 0x30B5, 0xA5B5, 0x30B6, 0xA5B6, 0x30B7, 0xA5B7, 0x30B8, 0xA5B8, + 0x30B9, 0xA5B9, 0x30BA, 0xA5BA, 0x30BB, 0xA5BB, 0x30BC, 0xA5BC, + 0x30BD, 0xA5BD, 0x30BE, 0xA5BE, 0x30BF, 0xA5BF, 0x30C0, 0xA5C0, + 0x30C1, 0xA5C1, 0x30C2, 0xA5C2, 0x30C3, 0xA5C3, 0x30C4, 0xA5C4, + 0x30C5, 0xA5C5, 0x30C6, 0xA5C6, 0x30C7, 0xA5C7, 0x30C8, 0xA5C8, + 0x30C9, 0xA5C9, 0x30CA, 0xA5CA, 0x30CB, 0xA5CB, 0x30CC, 0xA5CC, + 0x30CD, 0xA5CD, 0x30CE, 0xA5CE, 0x30CF, 0xA5CF, 0x30D0, 0xA5D0, + 0x30D1, 0xA5D1, 0x30D2, 0xA5D2, 0x30D3, 0xA5D3, 0x30D4, 0xA5D4, + 0x30D5, 0xA5D5, 0x30D6, 0xA5D6, 0x30D7, 0xA5D7, 0x30D8, 0xA5D8, + 0x30D9, 0xA5D9, 0x30DA, 0xA5DA, 0x30DB, 0xA5DB, 0x30DC, 0xA5DC, + 0x30DD, 0xA5DD, 0x30DE, 0xA5DE, 0x30DF, 0xA5DF, 0x30E0, 0xA5E0, + 0x30E1, 0xA5E1, 0x30E2, 0xA5E2, 0x30E3, 0xA5E3, 0x30E4, 0xA5E4, + 0x30E5, 0xA5E5, 0x30E6, 0xA5E6, 0x30E7, 0xA5E7, 0x30E8, 0xA5E8, + 0x30E9, 0xA5E9, 0x30EA, 0xA5EA, 0x30EB, 0xA5EB, 0x30EC, 0xA5EC, + 0x30ED, 0xA5ED, 0x30EE, 0xA5EE, 0x30EF, 0xA5EF, 0x30F0, 0xA5F0, + 0x30F1, 0xA5F1, 0x30F2, 0xA5F2, 0x30F3, 0xA5F3, 0x30F4, 0xA5F4, + 0x30F5, 0xA5F5, 0x30F6, 0xA5F6, 0x30FC, 0xA960, 0x30FD, 0xA963, + 0x30FE, 0xA964, 0x3105, 0xA8C5, 0x3106, 0xA8C6, 0x3107, 0xA8C7, + 0x3108, 0xA8C8, 0x3109, 0xA8C9, 0x310A, 0xA8CA, 0x310B, 0xA8CB, + 0x310C, 0xA8CC, 0x310D, 0xA8CD, 0x310E, 0xA8CE, 0x310F, 0xA8CF, + 0x3110, 0xA8D0, 0x3111, 0xA8D1, 0x3112, 0xA8D2, 0x3113, 0xA8D3, + 0x3114, 0xA8D4, 0x3115, 0xA8D5, 0x3116, 0xA8D6, 0x3117, 0xA8D7, + 0x3118, 0xA8D8, 0x3119, 0xA8D9, 0x311A, 0xA8DA, 0x311B, 0xA8DB, + 0x311C, 0xA8DC, 0x311D, 0xA8DD, 0x311E, 0xA8DE, 0x311F, 0xA8DF, + 0x3120, 0xA8E0, 0x3121, 0xA8E1, 0x3122, 0xA8E2, 0x3123, 0xA8E3, + 0x3124, 0xA8E4, 0x3125, 0xA8E5, 0x3126, 0xA8E6, 0x3127, 0xA8E7, + 0x3128, 0xA8E8, 0x3129, 0xA8E9, 0x3220, 0xA2E5, 0x3221, 0xA2E6, + 0x3222, 0xA2E7, 0x3223, 0xA2E8, 0x3224, 0xA2E9, 0x3225, 0xA2EA, + 0x3226, 0xA2EB, 0x3227, 0xA2EC, 0x3228, 0xA2ED, 0x3229, 0xA2EE, + 0x3231, 0xA95A, 0x32A3, 0xA949, 0x338E, 0xA94A, 0x338F, 0xA94B, + 0x339C, 0xA94C, 0x339D, 0xA94D, 0x339E, 0xA94E, 0x33A1, 0xA94F, + 0x33C4, 0xA950, 0x33CE, 0xA951, 0x33D1, 0xA952, 0x33D2, 0xA953, + 0x33D5, 0xA954, 0x4E00, 0xD2BB, 0x4E01, 0xB6A1, 0x4E02, 0x8140, + 0x4E03, 0xC6DF, 0x4E04, 0x8141, 0x4E05, 0x8142, 0x4E06, 0x8143, + 0x4E07, 0xCDF2, 0x4E08, 0xD5C9, 0x4E09, 0xC8FD, 0x4E0A, 0xC9CF, + 0x4E0B, 0xCFC2, 0x4E0C, 0xD8A2, 0x4E0D, 0xB2BB, 0x4E0E, 0xD3EB, + 0x4E0F, 0x8144, 0x4E10, 0xD8A4, 0x4E11, 0xB3F3, 0x4E12, 0x8145, + 0x4E13, 0xD7A8, 0x4E14, 0xC7D2, 0x4E15, 0xD8A7, 0x4E16, 0xCAC0, + 0x4E17, 0x8146, 0x4E18, 0xC7F0, 0x4E19, 0xB1FB, 0x4E1A, 0xD2B5, + 0x4E1B, 0xB4D4, 0x4E1C, 0xB6AB, 0x4E1D, 0xCBBF, 0x4E1E, 0xD8A9, + 0x4E1F, 0x8147, 0x4E20, 0x8148, 0x4E21, 0x8149, 0x4E22, 0xB6AA, + 0x4E23, 0x814A, 0x4E24, 0xC1BD, 0x4E25, 0xD1CF, 0x4E26, 0x814B, + 0x4E27, 0xC9A5, 0x4E28, 0xD8AD, 0x4E29, 0x814C, 0x4E2A, 0xB8F6, + 0x4E2B, 0xD1BE, 0x4E2C, 0xE3DC, 0x4E2D, 0xD6D0, 0x4E2E, 0x814D, + 0x4E2F, 0x814E, 0x4E30, 0xB7E1, 0x4E31, 0x814F, 0x4E32, 0xB4AE, + 0x4E33, 0x8150, 0x4E34, 0xC1D9, 0x4E35, 0x8151, 0x4E36, 0xD8BC, + 0x4E37, 0x8152, 0x4E38, 0xCDE8, 0x4E39, 0xB5A4, 0x4E3A, 0xCEAA, + 0x4E3B, 0xD6F7, 0x4E3C, 0x8153, 0x4E3D, 0xC0F6, 0x4E3E, 0xBED9, + 0x4E3F, 0xD8AF, 0x4E40, 0x8154, 0x4E41, 0x8155, 0x4E42, 0x8156, + 0x4E43, 0xC4CB, 0x4E44, 0x8157, 0x4E45, 0xBEC3, 0x4E46, 0x8158, + 0x4E47, 0xD8B1, 0x4E48, 0xC3B4, 0x4E49, 0xD2E5, 0x4E4A, 0x8159, + 0x4E4B, 0xD6AE, 0x4E4C, 0xCEDA, 0x4E4D, 0xD5A7, 0x4E4E, 0xBAF5, + 0x4E4F, 0xB7A6, 0x4E50, 0xC0D6, 0x4E51, 0x815A, 0x4E52, 0xC6B9, + 0x4E53, 0xC5D2, 0x4E54, 0xC7C7, 0x4E55, 0x815B, 0x4E56, 0xB9D4, + 0x4E57, 0x815C, 0x4E58, 0xB3CB, 0x4E59, 0xD2D2, 0x4E5A, 0x815D, + 0x4E5B, 0x815E, 0x4E5C, 0xD8BF, 0x4E5D, 0xBEC5, 0x4E5E, 0xC6F2, + 0x4E5F, 0xD2B2, 0x4E60, 0xCFB0, 0x4E61, 0xCFE7, 0x4E62, 0x815F, + 0x4E63, 0x8160, 0x4E64, 0x8161, 0x4E65, 0x8162, 0x4E66, 0xCAE9, + 0x4E67, 0x8163, 0x4E68, 0x8164, 0x4E69, 0xD8C0, 0x4E6A, 0x8165, + 0x4E6B, 0x8166, 0x4E6C, 0x8167, 0x4E6D, 0x8168, 0x4E6E, 0x8169, + 0x4E6F, 0x816A, 0x4E70, 0xC2F2, 0x4E71, 0xC2D2, 0x4E72, 0x816B, + 0x4E73, 0xC8E9, 0x4E74, 0x816C, 0x4E75, 0x816D, 0x4E76, 0x816E, + 0x4E77, 0x816F, 0x4E78, 0x8170, 0x4E79, 0x8171, 0x4E7A, 0x8172, + 0x4E7B, 0x8173, 0x4E7C, 0x8174, 0x4E7D, 0x8175, 0x4E7E, 0xC7AC, + 0x4E7F, 0x8176, 0x4E80, 0x8177, 0x4E81, 0x8178, 0x4E82, 0x8179, + 0x4E83, 0x817A, 0x4E84, 0x817B, 0x4E85, 0x817C, 0x4E86, 0xC1CB, + 0x4E87, 0x817D, 0x4E88, 0xD3E8, 0x4E89, 0xD5F9, 0x4E8A, 0x817E, + 0x4E8B, 0xCAC2, 0x4E8C, 0xB6FE, 0x4E8D, 0xD8A1, 0x4E8E, 0xD3DA, + 0x4E8F, 0xBFF7, 0x4E90, 0x8180, 0x4E91, 0xD4C6, 0x4E92, 0xBBA5, + 0x4E93, 0xD8C1, 0x4E94, 0xCEE5, 0x4E95, 0xBEAE, 0x4E96, 0x8181, + 0x4E97, 0x8182, 0x4E98, 0xD8A8, 0x4E99, 0x8183, 0x4E9A, 0xD1C7, + 0x4E9B, 0xD0A9, 0x4E9C, 0x8184, 0x4E9D, 0x8185, 0x4E9E, 0x8186, + 0x4E9F, 0xD8BD, 0x4EA0, 0xD9EF, 0x4EA1, 0xCDF6, 0x4EA2, 0xBFBA, + 0x4EA3, 0x8187, 0x4EA4, 0xBDBB, 0x4EA5, 0xBAA5, 0x4EA6, 0xD2E0, + 0x4EA7, 0xB2FA, 0x4EA8, 0xBAE0, 0x4EA9, 0xC4B6, 0x4EAA, 0x8188, + 0x4EAB, 0xCFED, 0x4EAC, 0xBEA9, 0x4EAD, 0xCDA4, 0x4EAE, 0xC1C1, + 0x4EAF, 0x8189, 0x4EB0, 0x818A, 0x4EB1, 0x818B, 0x4EB2, 0xC7D7, + 0x4EB3, 0xD9F1, 0x4EB4, 0x818C, 0x4EB5, 0xD9F4, 0x4EB6, 0x818D, + 0x4EB7, 0x818E, 0x4EB8, 0x818F, 0x4EB9, 0x8190, 0x4EBA, 0xC8CB, + 0x4EBB, 0xD8E9, 0x4EBC, 0x8191, 0x4EBD, 0x8192, 0x4EBE, 0x8193, + 0x4EBF, 0xD2DA, 0x4EC0, 0xCAB2, 0x4EC1, 0xC8CA, 0x4EC2, 0xD8EC, + 0x4EC3, 0xD8EA, 0x4EC4, 0xD8C6, 0x4EC5, 0xBDF6, 0x4EC6, 0xC6CD, + 0x4EC7, 0xB3F0, 0x4EC8, 0x8194, 0x4EC9, 0xD8EB, 0x4ECA, 0xBDF1, + 0x4ECB, 0xBDE9, 0x4ECC, 0x8195, 0x4ECD, 0xC8D4, 0x4ECE, 0xB4D3, + 0x4ECF, 0x8196, 0x4ED0, 0x8197, 0x4ED1, 0xC2D8, 0x4ED2, 0x8198, + 0x4ED3, 0xB2D6, 0x4ED4, 0xD7D0, 0x4ED5, 0xCACB, 0x4ED6, 0xCBFB, + 0x4ED7, 0xD5CC, 0x4ED8, 0xB8B6, 0x4ED9, 0xCFC9, 0x4EDA, 0x8199, + 0x4EDB, 0x819A, 0x4EDC, 0x819B, 0x4EDD, 0xD9DA, 0x4EDE, 0xD8F0, + 0x4EDF, 0xC7AA, 0x4EE0, 0x819C, 0x4EE1, 0xD8EE, 0x4EE2, 0x819D, + 0x4EE3, 0xB4FA, 0x4EE4, 0xC1EE, 0x4EE5, 0xD2D4, 0x4EE6, 0x819E, + 0x4EE7, 0x819F, 0x4EE8, 0xD8ED, 0x4EE9, 0x81A0, 0x4EEA, 0xD2C7, + 0x4EEB, 0xD8EF, 0x4EEC, 0xC3C7, 0x4EED, 0x81A1, 0x4EEE, 0x81A2, + 0x4EEF, 0x81A3, 0x4EF0, 0xD1F6, 0x4EF1, 0x81A4, 0x4EF2, 0xD6D9, + 0x4EF3, 0xD8F2, 0x4EF4, 0x81A5, 0x4EF5, 0xD8F5, 0x4EF6, 0xBCFE, + 0x4EF7, 0xBCDB, 0x4EF8, 0x81A6, 0x4EF9, 0x81A7, 0x4EFA, 0x81A8, + 0x4EFB, 0xC8CE, 0x4EFC, 0x81A9, 0x4EFD, 0xB7DD, 0x4EFE, 0x81AA, + 0x4EFF, 0xB7C2, 0x4F00, 0x81AB, 0x4F01, 0xC6F3, 0x4F02, 0x81AC, + 0x4F03, 0x81AD, 0x4F04, 0x81AE, 0x4F05, 0x81AF, 0x4F06, 0x81B0, + 0x4F07, 0x81B1, 0x4F08, 0x81B2, 0x4F09, 0xD8F8, 0x4F0A, 0xD2C1, + 0x4F0B, 0x81B3, 0x4F0C, 0x81B4, 0x4F0D, 0xCEE9, 0x4F0E, 0xBCBF, + 0x4F0F, 0xB7FC, 0x4F10, 0xB7A5, 0x4F11, 0xD0DD, 0x4F12, 0x81B5, + 0x4F13, 0x81B6, 0x4F14, 0x81B7, 0x4F15, 0x81B8, 0x4F16, 0x81B9, + 0x4F17, 0xD6DA, 0x4F18, 0xD3C5, 0x4F19, 0xBBEF, 0x4F1A, 0xBBE1, + 0x4F1B, 0xD8F1, 0x4F1C, 0x81BA, 0x4F1D, 0x81BB, 0x4F1E, 0xC9A1, + 0x4F1F, 0xCEB0, 0x4F20, 0xB4AB, 0x4F21, 0x81BC, 0x4F22, 0xD8F3, + 0x4F23, 0x81BD, 0x4F24, 0xC9CB, 0x4F25, 0xD8F6, 0x4F26, 0xC2D7, + 0x4F27, 0xD8F7, 0x4F28, 0x81BE, 0x4F29, 0x81BF, 0x4F2A, 0xCEB1, + 0x4F2B, 0xD8F9, 0x4F2C, 0x81C0, 0x4F2D, 0x81C1, 0x4F2E, 0x81C2, + 0x4F2F, 0xB2AE, 0x4F30, 0xB9C0, 0x4F31, 0x81C3, 0x4F32, 0xD9A3, + 0x4F33, 0x81C4, 0x4F34, 0xB0E9, 0x4F35, 0x81C5, 0x4F36, 0xC1E6, + 0x4F37, 0x81C6, 0x4F38, 0xC9EC, 0x4F39, 0x81C7, 0x4F3A, 0xCBC5, + 0x4F3B, 0x81C8, 0x4F3C, 0xCBC6, 0x4F3D, 0xD9A4, 0x4F3E, 0x81C9, + 0x4F3F, 0x81CA, 0x4F40, 0x81CB, 0x4F41, 0x81CC, 0x4F42, 0x81CD, + 0x4F43, 0xB5E8, 0x4F44, 0x81CE, 0x4F45, 0x81CF, 0x4F46, 0xB5AB, + 0x4F47, 0x81D0, 0x4F48, 0x81D1, 0x4F49, 0x81D2, 0x4F4A, 0x81D3, + 0x4F4B, 0x81D4, 0x4F4C, 0x81D5, 0x4F4D, 0xCEBB, 0x4F4E, 0xB5CD, + 0x4F4F, 0xD7A1, 0x4F50, 0xD7F4, 0x4F51, 0xD3D3, 0x4F52, 0x81D6, + 0x4F53, 0xCCE5, 0x4F54, 0x81D7, 0x4F55, 0xBACE, 0x4F56, 0x81D8, + 0x4F57, 0xD9A2, 0x4F58, 0xD9DC, 0x4F59, 0xD3E0, 0x4F5A, 0xD8FD, + 0x4F5B, 0xB7F0, 0x4F5C, 0xD7F7, 0x4F5D, 0xD8FE, 0x4F5E, 0xD8FA, + 0x4F5F, 0xD9A1, 0x4F60, 0xC4E3, 0x4F61, 0x81D9, 0x4F62, 0x81DA, + 0x4F63, 0xD3B6, 0x4F64, 0xD8F4, 0x4F65, 0xD9DD, 0x4F66, 0x81DB, + 0x4F67, 0xD8FB, 0x4F68, 0x81DC, 0x4F69, 0xC5E5, 0x4F6A, 0x81DD, + 0x4F6B, 0x81DE, 0x4F6C, 0xC0D0, 0x4F6D, 0x81DF, 0x4F6E, 0x81E0, + 0x4F6F, 0xD1F0, 0x4F70, 0xB0DB, 0x4F71, 0x81E1, 0x4F72, 0x81E2, + 0x4F73, 0xBCD1, 0x4F74, 0xD9A6, 0x4F75, 0x81E3, 0x4F76, 0xD9A5, + 0x4F77, 0x81E4, 0x4F78, 0x81E5, 0x4F79, 0x81E6, 0x4F7A, 0x81E7, + 0x4F7B, 0xD9AC, 0x4F7C, 0xD9AE, 0x4F7D, 0x81E8, 0x4F7E, 0xD9AB, + 0x4F7F, 0xCAB9, 0x4F80, 0x81E9, 0x4F81, 0x81EA, 0x4F82, 0x81EB, + 0x4F83, 0xD9A9, 0x4F84, 0xD6B6, 0x4F85, 0x81EC, 0x4F86, 0x81ED, + 0x4F87, 0x81EE, 0x4F88, 0xB3DE, 0x4F89, 0xD9A8, 0x4F8A, 0x81EF, + 0x4F8B, 0xC0FD, 0x4F8C, 0x81F0, 0x4F8D, 0xCACC, 0x4F8E, 0x81F1, + 0x4F8F, 0xD9AA, 0x4F90, 0x81F2, 0x4F91, 0xD9A7, 0x4F92, 0x81F3, + 0x4F93, 0x81F4, 0x4F94, 0xD9B0, 0x4F95, 0x81F5, 0x4F96, 0x81F6, + 0x4F97, 0xB6B1, 0x4F98, 0x81F7, 0x4F99, 0x81F8, 0x4F9A, 0x81F9, + 0x4F9B, 0xB9A9, 0x4F9C, 0x81FA, 0x4F9D, 0xD2C0, 0x4F9E, 0x81FB, + 0x4F9F, 0x81FC, 0x4FA0, 0xCFC0, 0x4FA1, 0x81FD, 0x4FA2, 0x81FE, + 0x4FA3, 0xC2C2, 0x4FA4, 0x8240, 0x4FA5, 0xBDC4, 0x4FA6, 0xD5EC, + 0x4FA7, 0xB2E0, 0x4FA8, 0xC7C8, 0x4FA9, 0xBFEB, 0x4FAA, 0xD9AD, + 0x4FAB, 0x8241, 0x4FAC, 0xD9AF, 0x4FAD, 0x8242, 0x4FAE, 0xCEEA, + 0x4FAF, 0xBAEE, 0x4FB0, 0x8243, 0x4FB1, 0x8244, 0x4FB2, 0x8245, + 0x4FB3, 0x8246, 0x4FB4, 0x8247, 0x4FB5, 0xC7D6, 0x4FB6, 0x8248, + 0x4FB7, 0x8249, 0x4FB8, 0x824A, 0x4FB9, 0x824B, 0x4FBA, 0x824C, + 0x4FBB, 0x824D, 0x4FBC, 0x824E, 0x4FBD, 0x824F, 0x4FBE, 0x8250, + 0x4FBF, 0xB1E3, 0x4FC0, 0x8251, 0x4FC1, 0x8252, 0x4FC2, 0x8253, + 0x4FC3, 0xB4D9, 0x4FC4, 0xB6ED, 0x4FC5, 0xD9B4, 0x4FC6, 0x8254, + 0x4FC7, 0x8255, 0x4FC8, 0x8256, 0x4FC9, 0x8257, 0x4FCA, 0xBFA1, + 0x4FCB, 0x8258, 0x4FCC, 0x8259, 0x4FCD, 0x825A, 0x4FCE, 0xD9DE, + 0x4FCF, 0xC7CE, 0x4FD0, 0xC0FE, 0x4FD1, 0xD9B8, 0x4FD2, 0x825B, + 0x4FD3, 0x825C, 0x4FD4, 0x825D, 0x4FD5, 0x825E, 0x4FD6, 0x825F, + 0x4FD7, 0xCBD7, 0x4FD8, 0xB7FD, 0x4FD9, 0x8260, 0x4FDA, 0xD9B5, + 0x4FDB, 0x8261, 0x4FDC, 0xD9B7, 0x4FDD, 0xB1A3, 0x4FDE, 0xD3E1, + 0x4FDF, 0xD9B9, 0x4FE0, 0x8262, 0x4FE1, 0xD0C5, 0x4FE2, 0x8263, + 0x4FE3, 0xD9B6, 0x4FE4, 0x8264, 0x4FE5, 0x8265, 0x4FE6, 0xD9B1, + 0x4FE7, 0x8266, 0x4FE8, 0xD9B2, 0x4FE9, 0xC1A9, 0x4FEA, 0xD9B3, + 0x4FEB, 0x8267, 0x4FEC, 0x8268, 0x4FED, 0xBCF3, 0x4FEE, 0xD0DE, + 0x4FEF, 0xB8A9, 0x4FF0, 0x8269, 0x4FF1, 0xBEE3, 0x4FF2, 0x826A, + 0x4FF3, 0xD9BD, 0x4FF4, 0x826B, 0x4FF5, 0x826C, 0x4FF6, 0x826D, + 0x4FF7, 0x826E, 0x4FF8, 0xD9BA, 0x4FF9, 0x826F, 0x4FFA, 0xB0B3, + 0x4FFB, 0x8270, 0x4FFC, 0x8271, 0x4FFD, 0x8272, 0x4FFE, 0xD9C2, + 0x4FFF, 0x8273, 0x5000, 0x8274, 0x5001, 0x8275, 0x5002, 0x8276, + 0x5003, 0x8277, 0x5004, 0x8278, 0x5005, 0x8279, 0x5006, 0x827A, + 0x5007, 0x827B, 0x5008, 0x827C, 0x5009, 0x827D, 0x500A, 0x827E, + 0x500B, 0x8280, 0x500C, 0xD9C4, 0x500D, 0xB1B6, 0x500E, 0x8281, + 0x500F, 0xD9BF, 0x5010, 0x8282, 0x5011, 0x8283, 0x5012, 0xB5B9, + 0x5013, 0x8284, 0x5014, 0xBEF3, 0x5015, 0x8285, 0x5016, 0x8286, + 0x5017, 0x8287, 0x5018, 0xCCC8, 0x5019, 0xBAF2, 0x501A, 0xD2D0, + 0x501B, 0x8288, 0x501C, 0xD9C3, 0x501D, 0x8289, 0x501E, 0x828A, + 0x501F, 0xBDE8, 0x5020, 0x828B, 0x5021, 0xB3AB, 0x5022, 0x828C, + 0x5023, 0x828D, 0x5024, 0x828E, 0x5025, 0xD9C5, 0x5026, 0xBEEB, + 0x5027, 0x828F, 0x5028, 0xD9C6, 0x5029, 0xD9BB, 0x502A, 0xC4DF, + 0x502B, 0x8290, 0x502C, 0xD9BE, 0x502D, 0xD9C1, 0x502E, 0xD9C0, + 0x502F, 0x8291, 0x5030, 0x8292, 0x5031, 0x8293, 0x5032, 0x8294, + 0x5033, 0x8295, 0x5034, 0x8296, 0x5035, 0x8297, 0x5036, 0x8298, + 0x5037, 0x8299, 0x5038, 0x829A, 0x5039, 0x829B, 0x503A, 0xD5AE, + 0x503B, 0x829C, 0x503C, 0xD6B5, 0x503D, 0x829D, 0x503E, 0xC7E3, + 0x503F, 0x829E, 0x5040, 0x829F, 0x5041, 0x82A0, 0x5042, 0x82A1, + 0x5043, 0xD9C8, 0x5044, 0x82A2, 0x5045, 0x82A3, 0x5046, 0x82A4, + 0x5047, 0xBCD9, 0x5048, 0xD9CA, 0x5049, 0x82A5, 0x504A, 0x82A6, + 0x504B, 0x82A7, 0x504C, 0xD9BC, 0x504D, 0x82A8, 0x504E, 0xD9CB, + 0x504F, 0xC6AB, 0x5050, 0x82A9, 0x5051, 0x82AA, 0x5052, 0x82AB, + 0x5053, 0x82AC, 0x5054, 0x82AD, 0x5055, 0xD9C9, 0x5056, 0x82AE, + 0x5057, 0x82AF, 0x5058, 0x82B0, 0x5059, 0x82B1, 0x505A, 0xD7F6, + 0x505B, 0x82B2, 0x505C, 0xCDA3, 0x505D, 0x82B3, 0x505E, 0x82B4, + 0x505F, 0x82B5, 0x5060, 0x82B6, 0x5061, 0x82B7, 0x5062, 0x82B8, + 0x5063, 0x82B9, 0x5064, 0x82BA, 0x5065, 0xBDA1, 0x5066, 0x82BB, + 0x5067, 0x82BC, 0x5068, 0x82BD, 0x5069, 0x82BE, 0x506A, 0x82BF, + 0x506B, 0x82C0, 0x506C, 0xD9CC, 0x506D, 0x82C1, 0x506E, 0x82C2, + 0x506F, 0x82C3, 0x5070, 0x82C4, 0x5071, 0x82C5, 0x5072, 0x82C6, + 0x5073, 0x82C7, 0x5074, 0x82C8, 0x5075, 0x82C9, 0x5076, 0xC5BC, + 0x5077, 0xCDB5, 0x5078, 0x82CA, 0x5079, 0x82CB, 0x507A, 0x82CC, + 0x507B, 0xD9CD, 0x507C, 0x82CD, 0x507D, 0x82CE, 0x507E, 0xD9C7, + 0x507F, 0xB3A5, 0x5080, 0xBFFE, 0x5081, 0x82CF, 0x5082, 0x82D0, + 0x5083, 0x82D1, 0x5084, 0x82D2, 0x5085, 0xB8B5, 0x5086, 0x82D3, + 0x5087, 0x82D4, 0x5088, 0xC0FC, 0x5089, 0x82D5, 0x508A, 0x82D6, + 0x508B, 0x82D7, 0x508C, 0x82D8, 0x508D, 0xB0F8, 0x508E, 0x82D9, + 0x508F, 0x82DA, 0x5090, 0x82DB, 0x5091, 0x82DC, 0x5092, 0x82DD, + 0x5093, 0x82DE, 0x5094, 0x82DF, 0x5095, 0x82E0, 0x5096, 0x82E1, + 0x5097, 0x82E2, 0x5098, 0x82E3, 0x5099, 0x82E4, 0x509A, 0x82E5, + 0x509B, 0x82E6, 0x509C, 0x82E7, 0x509D, 0x82E8, 0x509E, 0x82E9, + 0x509F, 0x82EA, 0x50A0, 0x82EB, 0x50A1, 0x82EC, 0x50A2, 0x82ED, + 0x50A3, 0xB4F6, 0x50A4, 0x82EE, 0x50A5, 0xD9CE, 0x50A6, 0x82EF, + 0x50A7, 0xD9CF, 0x50A8, 0xB4A2, 0x50A9, 0xD9D0, 0x50AA, 0x82F0, + 0x50AB, 0x82F1, 0x50AC, 0xB4DF, 0x50AD, 0x82F2, 0x50AE, 0x82F3, + 0x50AF, 0x82F4, 0x50B0, 0x82F5, 0x50B1, 0x82F6, 0x50B2, 0xB0C1, + 0x50B3, 0x82F7, 0x50B4, 0x82F8, 0x50B5, 0x82F9, 0x50B6, 0x82FA, + 0x50B7, 0x82FB, 0x50B8, 0x82FC, 0x50B9, 0x82FD, 0x50BA, 0xD9D1, + 0x50BB, 0xC9B5, 0x50BC, 0x82FE, 0x50BD, 0x8340, 0x50BE, 0x8341, + 0x50BF, 0x8342, 0x50C0, 0x8343, 0x50C1, 0x8344, 0x50C2, 0x8345, + 0x50C3, 0x8346, 0x50C4, 0x8347, 0x50C5, 0x8348, 0x50C6, 0x8349, + 0x50C7, 0x834A, 0x50C8, 0x834B, 0x50C9, 0x834C, 0x50CA, 0x834D, + 0x50CB, 0x834E, 0x50CC, 0x834F, 0x50CD, 0x8350, 0x50CE, 0x8351, + 0x50CF, 0xCFF1, 0x50D0, 0x8352, 0x50D1, 0x8353, 0x50D2, 0x8354, + 0x50D3, 0x8355, 0x50D4, 0x8356, 0x50D5, 0x8357, 0x50D6, 0xD9D2, + 0x50D7, 0x8358, 0x50D8, 0x8359, 0x50D9, 0x835A, 0x50DA, 0xC1C5, + 0x50DB, 0x835B, 0x50DC, 0x835C, 0x50DD, 0x835D, 0x50DE, 0x835E, + 0x50DF, 0x835F, 0x50E0, 0x8360, 0x50E1, 0x8361, 0x50E2, 0x8362, + 0x50E3, 0x8363, 0x50E4, 0x8364, 0x50E5, 0x8365, 0x50E6, 0xD9D6, + 0x50E7, 0xC9AE, 0x50E8, 0x8366, 0x50E9, 0x8367, 0x50EA, 0x8368, + 0x50EB, 0x8369, 0x50EC, 0xD9D5, 0x50ED, 0xD9D4, 0x50EE, 0xD9D7, + 0x50EF, 0x836A, 0x50F0, 0x836B, 0x50F1, 0x836C, 0x50F2, 0x836D, + 0x50F3, 0xCBDB, 0x50F4, 0x836E, 0x50F5, 0xBDA9, 0x50F6, 0x836F, + 0x50F7, 0x8370, 0x50F8, 0x8371, 0x50F9, 0x8372, 0x50FA, 0x8373, + 0x50FB, 0xC6A7, 0x50FC, 0x8374, 0x50FD, 0x8375, 0x50FE, 0x8376, + 0x50FF, 0x8377, 0x5100, 0x8378, 0x5101, 0x8379, 0x5102, 0x837A, + 0x5103, 0x837B, 0x5104, 0x837C, 0x5105, 0x837D, 0x5106, 0xD9D3, + 0x5107, 0xD9D8, 0x5108, 0x837E, 0x5109, 0x8380, 0x510A, 0x8381, + 0x510B, 0xD9D9, 0x510C, 0x8382, 0x510D, 0x8383, 0x510E, 0x8384, + 0x510F, 0x8385, 0x5110, 0x8386, 0x5111, 0x8387, 0x5112, 0xC8E5, + 0x5113, 0x8388, 0x5114, 0x8389, 0x5115, 0x838A, 0x5116, 0x838B, + 0x5117, 0x838C, 0x5118, 0x838D, 0x5119, 0x838E, 0x511A, 0x838F, + 0x511B, 0x8390, 0x511C, 0x8391, 0x511D, 0x8392, 0x511E, 0x8393, + 0x511F, 0x8394, 0x5120, 0x8395, 0x5121, 0xC0DC, 0x5122, 0x8396, + 0x5123, 0x8397, 0x5124, 0x8398, 0x5125, 0x8399, 0x5126, 0x839A, + 0x5127, 0x839B, 0x5128, 0x839C, 0x5129, 0x839D, 0x512A, 0x839E, + 0x512B, 0x839F, 0x512C, 0x83A0, 0x512D, 0x83A1, 0x512E, 0x83A2, + 0x512F, 0x83A3, 0x5130, 0x83A4, 0x5131, 0x83A5, 0x5132, 0x83A6, + 0x5133, 0x83A7, 0x5134, 0x83A8, 0x5135, 0x83A9, 0x5136, 0x83AA, + 0x5137, 0x83AB, 0x5138, 0x83AC, 0x5139, 0x83AD, 0x513A, 0x83AE, + 0x513B, 0x83AF, 0x513C, 0x83B0, 0x513D, 0x83B1, 0x513E, 0x83B2, + 0x513F, 0xB6F9, 0x5140, 0xD8A3, 0x5141, 0xD4CA, 0x5142, 0x83B3, + 0x5143, 0xD4AA, 0x5144, 0xD0D6, 0x5145, 0xB3E4, 0x5146, 0xD5D7, + 0x5147, 0x83B4, 0x5148, 0xCFC8, 0x5149, 0xB9E2, 0x514A, 0x83B5, + 0x514B, 0xBFCB, 0x514C, 0x83B6, 0x514D, 0xC3E2, 0x514E, 0x83B7, + 0x514F, 0x83B8, 0x5150, 0x83B9, 0x5151, 0xB6D2, 0x5152, 0x83BA, + 0x5153, 0x83BB, 0x5154, 0xCDC3, 0x5155, 0xD9EE, 0x5156, 0xD9F0, + 0x5157, 0x83BC, 0x5158, 0x83BD, 0x5159, 0x83BE, 0x515A, 0xB5B3, + 0x515B, 0x83BF, 0x515C, 0xB6B5, 0x515D, 0x83C0, 0x515E, 0x83C1, + 0x515F, 0x83C2, 0x5160, 0x83C3, 0x5161, 0x83C4, 0x5162, 0xBEA4, + 0x5163, 0x83C5, 0x5164, 0x83C6, 0x5165, 0xC8EB, 0x5166, 0x83C7, + 0x5167, 0x83C8, 0x5168, 0xC8AB, 0x5169, 0x83C9, 0x516A, 0x83CA, + 0x516B, 0xB0CB, 0x516C, 0xB9AB, 0x516D, 0xC1F9, 0x516E, 0xD9E2, + 0x516F, 0x83CB, 0x5170, 0xC0BC, 0x5171, 0xB9B2, 0x5172, 0x83CC, + 0x5173, 0xB9D8, 0x5174, 0xD0CB, 0x5175, 0xB1F8, 0x5176, 0xC6E4, + 0x5177, 0xBEDF, 0x5178, 0xB5E4, 0x5179, 0xD7C8, 0x517A, 0x83CD, + 0x517B, 0xD1F8, 0x517C, 0xBCE6, 0x517D, 0xCADE, 0x517E, 0x83CE, + 0x517F, 0x83CF, 0x5180, 0xBCBD, 0x5181, 0xD9E6, 0x5182, 0xD8E7, + 0x5183, 0x83D0, 0x5184, 0x83D1, 0x5185, 0xC4DA, 0x5186, 0x83D2, + 0x5187, 0x83D3, 0x5188, 0xB8D4, 0x5189, 0xC8BD, 0x518A, 0x83D4, + 0x518B, 0x83D5, 0x518C, 0xB2E1, 0x518D, 0xD4D9, 0x518E, 0x83D6, + 0x518F, 0x83D7, 0x5190, 0x83D8, 0x5191, 0x83D9, 0x5192, 0xC3B0, + 0x5193, 0x83DA, 0x5194, 0x83DB, 0x5195, 0xC3E1, 0x5196, 0xDAA2, + 0x5197, 0xC8DF, 0x5198, 0x83DC, 0x5199, 0xD0B4, 0x519A, 0x83DD, + 0x519B, 0xBEFC, 0x519C, 0xC5A9, 0x519D, 0x83DE, 0x519E, 0x83DF, + 0x519F, 0x83E0, 0x51A0, 0xB9DA, 0x51A1, 0x83E1, 0x51A2, 0xDAA3, + 0x51A3, 0x83E2, 0x51A4, 0xD4A9, 0x51A5, 0xDAA4, 0x51A6, 0x83E3, + 0x51A7, 0x83E4, 0x51A8, 0x83E5, 0x51A9, 0x83E6, 0x51AA, 0x83E7, + 0x51AB, 0xD9FB, 0x51AC, 0xB6AC, 0x51AD, 0x83E8, 0x51AE, 0x83E9, + 0x51AF, 0xB7EB, 0x51B0, 0xB1F9, 0x51B1, 0xD9FC, 0x51B2, 0xB3E5, + 0x51B3, 0xBEF6, 0x51B4, 0x83EA, 0x51B5, 0xBFF6, 0x51B6, 0xD2B1, + 0x51B7, 0xC0E4, 0x51B8, 0x83EB, 0x51B9, 0x83EC, 0x51BA, 0x83ED, + 0x51BB, 0xB6B3, 0x51BC, 0xD9FE, 0x51BD, 0xD9FD, 0x51BE, 0x83EE, + 0x51BF, 0x83EF, 0x51C0, 0xBEBB, 0x51C1, 0x83F0, 0x51C2, 0x83F1, + 0x51C3, 0x83F2, 0x51C4, 0xC6E0, 0x51C5, 0x83F3, 0x51C6, 0xD7BC, + 0x51C7, 0xDAA1, 0x51C8, 0x83F4, 0x51C9, 0xC1B9, 0x51CA, 0x83F5, + 0x51CB, 0xB5F2, 0x51CC, 0xC1E8, 0x51CD, 0x83F6, 0x51CE, 0x83F7, + 0x51CF, 0xBCF5, 0x51D0, 0x83F8, 0x51D1, 0xB4D5, 0x51D2, 0x83F9, + 0x51D3, 0x83FA, 0x51D4, 0x83FB, 0x51D5, 0x83FC, 0x51D6, 0x83FD, + 0x51D7, 0x83FE, 0x51D8, 0x8440, 0x51D9, 0x8441, 0x51DA, 0x8442, + 0x51DB, 0xC1DD, 0x51DC, 0x8443, 0x51DD, 0xC4FD, 0x51DE, 0x8444, + 0x51DF, 0x8445, 0x51E0, 0xBCB8, 0x51E1, 0xB7B2, 0x51E2, 0x8446, + 0x51E3, 0x8447, 0x51E4, 0xB7EF, 0x51E5, 0x8448, 0x51E6, 0x8449, + 0x51E7, 0x844A, 0x51E8, 0x844B, 0x51E9, 0x844C, 0x51EA, 0x844D, + 0x51EB, 0xD9EC, 0x51EC, 0x844E, 0x51ED, 0xC6BE, 0x51EE, 0x844F, + 0x51EF, 0xBFAD, 0x51F0, 0xBBCB, 0x51F1, 0x8450, 0x51F2, 0x8451, + 0x51F3, 0xB5CA, 0x51F4, 0x8452, 0x51F5, 0xDBC9, 0x51F6, 0xD0D7, + 0x51F7, 0x8453, 0x51F8, 0xCDB9, 0x51F9, 0xB0BC, 0x51FA, 0xB3F6, + 0x51FB, 0xBBF7, 0x51FC, 0xDBCA, 0x51FD, 0xBAAF, 0x51FE, 0x8454, + 0x51FF, 0xD4E4, 0x5200, 0xB5B6, 0x5201, 0xB5F3, 0x5202, 0xD8D6, + 0x5203, 0xC8D0, 0x5204, 0x8455, 0x5205, 0x8456, 0x5206, 0xB7D6, + 0x5207, 0xC7D0, 0x5208, 0xD8D7, 0x5209, 0x8457, 0x520A, 0xBFAF, + 0x520B, 0x8458, 0x520C, 0x8459, 0x520D, 0xDBBB, 0x520E, 0xD8D8, + 0x520F, 0x845A, 0x5210, 0x845B, 0x5211, 0xD0CC, 0x5212, 0xBBAE, + 0x5213, 0x845C, 0x5214, 0x845D, 0x5215, 0x845E, 0x5216, 0xEBBE, + 0x5217, 0xC1D0, 0x5218, 0xC1F5, 0x5219, 0xD4F2, 0x521A, 0xB8D5, + 0x521B, 0xB4B4, 0x521C, 0x845F, 0x521D, 0xB3F5, 0x521E, 0x8460, + 0x521F, 0x8461, 0x5220, 0xC9BE, 0x5221, 0x8462, 0x5222, 0x8463, + 0x5223, 0x8464, 0x5224, 0xC5D0, 0x5225, 0x8465, 0x5226, 0x8466, + 0x5227, 0x8467, 0x5228, 0xC5D9, 0x5229, 0xC0FB, 0x522A, 0x8468, + 0x522B, 0xB1F0, 0x522C, 0x8469, 0x522D, 0xD8D9, 0x522E, 0xB9CE, + 0x522F, 0x846A, 0x5230, 0xB5BD, 0x5231, 0x846B, 0x5232, 0x846C, + 0x5233, 0xD8DA, 0x5234, 0x846D, 0x5235, 0x846E, 0x5236, 0xD6C6, + 0x5237, 0xCBA2, 0x5238, 0xC8AF, 0x5239, 0xC9B2, 0x523A, 0xB4CC, + 0x523B, 0xBFCC, 0x523C, 0x846F, 0x523D, 0xB9F4, 0x523E, 0x8470, + 0x523F, 0xD8DB, 0x5240, 0xD8DC, 0x5241, 0xB6E7, 0x5242, 0xBCC1, + 0x5243, 0xCCEA, 0x5244, 0x8471, 0x5245, 0x8472, 0x5246, 0x8473, + 0x5247, 0x8474, 0x5248, 0x8475, 0x5249, 0x8476, 0x524A, 0xCFF7, + 0x524B, 0x8477, 0x524C, 0xD8DD, 0x524D, 0xC7B0, 0x524E, 0x8478, + 0x524F, 0x8479, 0x5250, 0xB9D0, 0x5251, 0xBDA3, 0x5252, 0x847A, + 0x5253, 0x847B, 0x5254, 0xCCDE, 0x5255, 0x847C, 0x5256, 0xC6CA, + 0x5257, 0x847D, 0x5258, 0x847E, 0x5259, 0x8480, 0x525A, 0x8481, + 0x525B, 0x8482, 0x525C, 0xD8E0, 0x525D, 0x8483, 0x525E, 0xD8DE, + 0x525F, 0x8484, 0x5260, 0x8485, 0x5261, 0xD8DF, 0x5262, 0x8486, + 0x5263, 0x8487, 0x5264, 0x8488, 0x5265, 0xB0FE, 0x5266, 0x8489, + 0x5267, 0xBEE7, 0x5268, 0x848A, 0x5269, 0xCAA3, 0x526A, 0xBCF4, + 0x526B, 0x848B, 0x526C, 0x848C, 0x526D, 0x848D, 0x526E, 0x848E, + 0x526F, 0xB8B1, 0x5270, 0x848F, 0x5271, 0x8490, 0x5272, 0xB8EE, + 0x5273, 0x8491, 0x5274, 0x8492, 0x5275, 0x8493, 0x5276, 0x8494, + 0x5277, 0x8495, 0x5278, 0x8496, 0x5279, 0x8497, 0x527A, 0x8498, + 0x527B, 0x8499, 0x527C, 0x849A, 0x527D, 0xD8E2, 0x527E, 0x849B, + 0x527F, 0xBDCB, 0x5280, 0x849C, 0x5281, 0xD8E4, 0x5282, 0xD8E3, + 0x5283, 0x849D, 0x5284, 0x849E, 0x5285, 0x849F, 0x5286, 0x84A0, + 0x5287, 0x84A1, 0x5288, 0xC5FC, 0x5289, 0x84A2, 0x528A, 0x84A3, + 0x528B, 0x84A4, 0x528C, 0x84A5, 0x528D, 0x84A6, 0x528E, 0x84A7, + 0x528F, 0x84A8, 0x5290, 0xD8E5, 0x5291, 0x84A9, 0x5292, 0x84AA, + 0x5293, 0xD8E6, 0x5294, 0x84AB, 0x5295, 0x84AC, 0x5296, 0x84AD, + 0x5297, 0x84AE, 0x5298, 0x84AF, 0x5299, 0x84B0, 0x529A, 0x84B1, + 0x529B, 0xC1A6, 0x529C, 0x84B2, 0x529D, 0xC8B0, 0x529E, 0xB0EC, + 0x529F, 0xB9A6, 0x52A0, 0xBCD3, 0x52A1, 0xCEF1, 0x52A2, 0xDBBD, + 0x52A3, 0xC1D3, 0x52A4, 0x84B3, 0x52A5, 0x84B4, 0x52A6, 0x84B5, + 0x52A7, 0x84B6, 0x52A8, 0xB6AF, 0x52A9, 0xD6FA, 0x52AA, 0xC5AC, + 0x52AB, 0xBDD9, 0x52AC, 0xDBBE, 0x52AD, 0xDBBF, 0x52AE, 0x84B7, + 0x52AF, 0x84B8, 0x52B0, 0x84B9, 0x52B1, 0xC0F8, 0x52B2, 0xBEA2, + 0x52B3, 0xC0CD, 0x52B4, 0x84BA, 0x52B5, 0x84BB, 0x52B6, 0x84BC, + 0x52B7, 0x84BD, 0x52B8, 0x84BE, 0x52B9, 0x84BF, 0x52BA, 0x84C0, + 0x52BB, 0x84C1, 0x52BC, 0x84C2, 0x52BD, 0x84C3, 0x52BE, 0xDBC0, + 0x52BF, 0xCAC6, 0x52C0, 0x84C4, 0x52C1, 0x84C5, 0x52C2, 0x84C6, + 0x52C3, 0xB2AA, 0x52C4, 0x84C7, 0x52C5, 0x84C8, 0x52C6, 0x84C9, + 0x52C7, 0xD3C2, 0x52C8, 0x84CA, 0x52C9, 0xC3E3, 0x52CA, 0x84CB, + 0x52CB, 0xD1AB, 0x52CC, 0x84CC, 0x52CD, 0x84CD, 0x52CE, 0x84CE, + 0x52CF, 0x84CF, 0x52D0, 0xDBC2, 0x52D1, 0x84D0, 0x52D2, 0xC0D5, + 0x52D3, 0x84D1, 0x52D4, 0x84D2, 0x52D5, 0x84D3, 0x52D6, 0xDBC3, + 0x52D7, 0x84D4, 0x52D8, 0xBFB1, 0x52D9, 0x84D5, 0x52DA, 0x84D6, + 0x52DB, 0x84D7, 0x52DC, 0x84D8, 0x52DD, 0x84D9, 0x52DE, 0x84DA, + 0x52DF, 0xC4BC, 0x52E0, 0x84DB, 0x52E1, 0x84DC, 0x52E2, 0x84DD, + 0x52E3, 0x84DE, 0x52E4, 0xC7DA, 0x52E5, 0x84DF, 0x52E6, 0x84E0, + 0x52E7, 0x84E1, 0x52E8, 0x84E2, 0x52E9, 0x84E3, 0x52EA, 0x84E4, + 0x52EB, 0x84E5, 0x52EC, 0x84E6, 0x52ED, 0x84E7, 0x52EE, 0x84E8, + 0x52EF, 0x84E9, 0x52F0, 0xDBC4, 0x52F1, 0x84EA, 0x52F2, 0x84EB, + 0x52F3, 0x84EC, 0x52F4, 0x84ED, 0x52F5, 0x84EE, 0x52F6, 0x84EF, + 0x52F7, 0x84F0, 0x52F8, 0x84F1, 0x52F9, 0xD9E8, 0x52FA, 0xC9D7, + 0x52FB, 0x84F2, 0x52FC, 0x84F3, 0x52FD, 0x84F4, 0x52FE, 0xB9B4, + 0x52FF, 0xCEF0, 0x5300, 0xD4C8, 0x5301, 0x84F5, 0x5302, 0x84F6, + 0x5303, 0x84F7, 0x5304, 0x84F8, 0x5305, 0xB0FC, 0x5306, 0xB4D2, + 0x5307, 0x84F9, 0x5308, 0xD0D9, 0x5309, 0x84FA, 0x530A, 0x84FB, + 0x530B, 0x84FC, 0x530C, 0x84FD, 0x530D, 0xD9E9, 0x530E, 0x84FE, + 0x530F, 0xDECB, 0x5310, 0xD9EB, 0x5311, 0x8540, 0x5312, 0x8541, + 0x5313, 0x8542, 0x5314, 0x8543, 0x5315, 0xD8B0, 0x5316, 0xBBAF, + 0x5317, 0xB1B1, 0x5318, 0x8544, 0x5319, 0xB3D7, 0x531A, 0xD8CE, + 0x531B, 0x8545, 0x531C, 0x8546, 0x531D, 0xD4D1, 0x531E, 0x8547, + 0x531F, 0x8548, 0x5320, 0xBDB3, 0x5321, 0xBFEF, 0x5322, 0x8549, + 0x5323, 0xCFBB, 0x5324, 0x854A, 0x5325, 0x854B, 0x5326, 0xD8D0, + 0x5327, 0x854C, 0x5328, 0x854D, 0x5329, 0x854E, 0x532A, 0xB7CB, + 0x532B, 0x854F, 0x532C, 0x8550, 0x532D, 0x8551, 0x532E, 0xD8D1, + 0x532F, 0x8552, 0x5330, 0x8553, 0x5331, 0x8554, 0x5332, 0x8555, + 0x5333, 0x8556, 0x5334, 0x8557, 0x5335, 0x8558, 0x5336, 0x8559, + 0x5337, 0x855A, 0x5338, 0x855B, 0x5339, 0xC6A5, 0x533A, 0xC7F8, + 0x533B, 0xD2BD, 0x533C, 0x855C, 0x533D, 0x855D, 0x533E, 0xD8D2, + 0x533F, 0xC4E4, 0x5340, 0x855E, 0x5341, 0xCAAE, 0x5342, 0x855F, + 0x5343, 0xC7A7, 0x5344, 0x8560, 0x5345, 0xD8A6, 0x5346, 0x8561, + 0x5347, 0xC9FD, 0x5348, 0xCEE7, 0x5349, 0xBBDC, 0x534A, 0xB0EB, + 0x534B, 0x8562, 0x534C, 0x8563, 0x534D, 0x8564, 0x534E, 0xBBAA, + 0x534F, 0xD0AD, 0x5350, 0x8565, 0x5351, 0xB1B0, 0x5352, 0xD7E4, + 0x5353, 0xD7BF, 0x5354, 0x8566, 0x5355, 0xB5A5, 0x5356, 0xC2F4, + 0x5357, 0xC4CF, 0x5358, 0x8567, 0x5359, 0x8568, 0x535A, 0xB2A9, + 0x535B, 0x8569, 0x535C, 0xB2B7, 0x535D, 0x856A, 0x535E, 0xB1E5, + 0x535F, 0xDFB2, 0x5360, 0xD5BC, 0x5361, 0xBFA8, 0x5362, 0xC2AC, + 0x5363, 0xD8D5, 0x5364, 0xC2B1, 0x5365, 0x856B, 0x5366, 0xD8D4, + 0x5367, 0xCED4, 0x5368, 0x856C, 0x5369, 0xDAE0, 0x536A, 0x856D, + 0x536B, 0xCEC0, 0x536C, 0x856E, 0x536D, 0x856F, 0x536E, 0xD8B4, + 0x536F, 0xC3AE, 0x5370, 0xD3A1, 0x5371, 0xCEA3, 0x5372, 0x8570, + 0x5373, 0xBCB4, 0x5374, 0xC8B4, 0x5375, 0xC2D1, 0x5376, 0x8571, + 0x5377, 0xBEED, 0x5378, 0xD0B6, 0x5379, 0x8572, 0x537A, 0xDAE1, + 0x537B, 0x8573, 0x537C, 0x8574, 0x537D, 0x8575, 0x537E, 0x8576, + 0x537F, 0xC7E4, 0x5380, 0x8577, 0x5381, 0x8578, 0x5382, 0xB3A7, + 0x5383, 0x8579, 0x5384, 0xB6F2, 0x5385, 0xCCFC, 0x5386, 0xC0FA, + 0x5387, 0x857A, 0x5388, 0x857B, 0x5389, 0xC0F7, 0x538A, 0x857C, + 0x538B, 0xD1B9, 0x538C, 0xD1E1, 0x538D, 0xD8C7, 0x538E, 0x857D, + 0x538F, 0x857E, 0x5390, 0x8580, 0x5391, 0x8581, 0x5392, 0x8582, + 0x5393, 0x8583, 0x5394, 0x8584, 0x5395, 0xB2DE, 0x5396, 0x8585, + 0x5397, 0x8586, 0x5398, 0xC0E5, 0x5399, 0x8587, 0x539A, 0xBAF1, + 0x539B, 0x8588, 0x539C, 0x8589, 0x539D, 0xD8C8, 0x539E, 0x858A, + 0x539F, 0xD4AD, 0x53A0, 0x858B, 0x53A1, 0x858C, 0x53A2, 0xCFE1, + 0x53A3, 0xD8C9, 0x53A4, 0x858D, 0x53A5, 0xD8CA, 0x53A6, 0xCFC3, + 0x53A7, 0x858E, 0x53A8, 0xB3F8, 0x53A9, 0xBEC7, 0x53AA, 0x858F, + 0x53AB, 0x8590, 0x53AC, 0x8591, 0x53AD, 0x8592, 0x53AE, 0xD8CB, + 0x53AF, 0x8593, 0x53B0, 0x8594, 0x53B1, 0x8595, 0x53B2, 0x8596, + 0x53B3, 0x8597, 0x53B4, 0x8598, 0x53B5, 0x8599, 0x53B6, 0xDBCC, + 0x53B7, 0x859A, 0x53B8, 0x859B, 0x53B9, 0x859C, 0x53BA, 0x859D, + 0x53BB, 0xC8A5, 0x53BC, 0x859E, 0x53BD, 0x859F, 0x53BE, 0x85A0, + 0x53BF, 0xCFD8, 0x53C0, 0x85A1, 0x53C1, 0xC8FE, 0x53C2, 0xB2CE, + 0x53C3, 0x85A2, 0x53C4, 0x85A3, 0x53C5, 0x85A4, 0x53C6, 0x85A5, + 0x53C7, 0x85A6, 0x53C8, 0xD3D6, 0x53C9, 0xB2E6, 0x53CA, 0xBCB0, + 0x53CB, 0xD3D1, 0x53CC, 0xCBAB, 0x53CD, 0xB7B4, 0x53CE, 0x85A7, + 0x53CF, 0x85A8, 0x53D0, 0x85A9, 0x53D1, 0xB7A2, 0x53D2, 0x85AA, + 0x53D3, 0x85AB, 0x53D4, 0xCAE5, 0x53D5, 0x85AC, 0x53D6, 0xC8A1, + 0x53D7, 0xCADC, 0x53D8, 0xB1E4, 0x53D9, 0xD0F0, 0x53DA, 0x85AD, + 0x53DB, 0xC5D1, 0x53DC, 0x85AE, 0x53DD, 0x85AF, 0x53DE, 0x85B0, + 0x53DF, 0xDBC5, 0x53E0, 0xB5FE, 0x53E1, 0x85B1, 0x53E2, 0x85B2, + 0x53E3, 0xBFDA, 0x53E4, 0xB9C5, 0x53E5, 0xBEE4, 0x53E6, 0xC1ED, + 0x53E7, 0x85B3, 0x53E8, 0xDFB6, 0x53E9, 0xDFB5, 0x53EA, 0xD6BB, + 0x53EB, 0xBDD0, 0x53EC, 0xD5D9, 0x53ED, 0xB0C8, 0x53EE, 0xB6A3, + 0x53EF, 0xBFC9, 0x53F0, 0xCCA8, 0x53F1, 0xDFB3, 0x53F2, 0xCAB7, + 0x53F3, 0xD3D2, 0x53F4, 0x85B4, 0x53F5, 0xD8CF, 0x53F6, 0xD2B6, + 0x53F7, 0xBAC5, 0x53F8, 0xCBBE, 0x53F9, 0xCCBE, 0x53FA, 0x85B5, + 0x53FB, 0xDFB7, 0x53FC, 0xB5F0, 0x53FD, 0xDFB4, 0x53FE, 0x85B6, + 0x53FF, 0x85B7, 0x5400, 0x85B8, 0x5401, 0xD3F5, 0x5402, 0x85B9, + 0x5403, 0xB3D4, 0x5404, 0xB8F7, 0x5405, 0x85BA, 0x5406, 0xDFBA, + 0x5407, 0x85BB, 0x5408, 0xBACF, 0x5409, 0xBCAA, 0x540A, 0xB5F5, + 0x540B, 0x85BC, 0x540C, 0xCDAC, 0x540D, 0xC3FB, 0x540E, 0xBAF3, + 0x540F, 0xC0F4, 0x5410, 0xCDC2, 0x5411, 0xCFF2, 0x5412, 0xDFB8, + 0x5413, 0xCFC5, 0x5414, 0x85BD, 0x5415, 0xC2C0, 0x5416, 0xDFB9, + 0x5417, 0xC2F0, 0x5418, 0x85BE, 0x5419, 0x85BF, 0x541A, 0x85C0, + 0x541B, 0xBEFD, 0x541C, 0x85C1, 0x541D, 0xC1DF, 0x541E, 0xCDCC, + 0x541F, 0xD2F7, 0x5420, 0xB7CD, 0x5421, 0xDFC1, 0x5422, 0x85C2, + 0x5423, 0xDFC4, 0x5424, 0x85C3, 0x5425, 0x85C4, 0x5426, 0xB7F1, + 0x5427, 0xB0C9, 0x5428, 0xB6D6, 0x5429, 0xB7D4, 0x542A, 0x85C5, + 0x542B, 0xBAAC, 0x542C, 0xCCFD, 0x542D, 0xBFD4, 0x542E, 0xCBB1, + 0x542F, 0xC6F4, 0x5430, 0x85C6, 0x5431, 0xD6A8, 0x5432, 0xDFC5, + 0x5433, 0x85C7, 0x5434, 0xCEE2, 0x5435, 0xB3B3, 0x5436, 0x85C8, + 0x5437, 0x85C9, 0x5438, 0xCEFC, 0x5439, 0xB4B5, 0x543A, 0x85CA, + 0x543B, 0xCEC7, 0x543C, 0xBAF0, 0x543D, 0x85CB, 0x543E, 0xCEE1, + 0x543F, 0x85CC, 0x5440, 0xD1BD, 0x5441, 0x85CD, 0x5442, 0x85CE, + 0x5443, 0xDFC0, 0x5444, 0x85CF, 0x5445, 0x85D0, 0x5446, 0xB4F4, + 0x5447, 0x85D1, 0x5448, 0xB3CA, 0x5449, 0x85D2, 0x544A, 0xB8E6, + 0x544B, 0xDFBB, 0x544C, 0x85D3, 0x544D, 0x85D4, 0x544E, 0x85D5, + 0x544F, 0x85D6, 0x5450, 0xC4C5, 0x5451, 0x85D7, 0x5452, 0xDFBC, + 0x5453, 0xDFBD, 0x5454, 0xDFBE, 0x5455, 0xC5BB, 0x5456, 0xDFBF, + 0x5457, 0xDFC2, 0x5458, 0xD4B1, 0x5459, 0xDFC3, 0x545A, 0x85D8, + 0x545B, 0xC7BA, 0x545C, 0xCED8, 0x545D, 0x85D9, 0x545E, 0x85DA, + 0x545F, 0x85DB, 0x5460, 0x85DC, 0x5461, 0x85DD, 0x5462, 0xC4D8, + 0x5463, 0x85DE, 0x5464, 0xDFCA, 0x5465, 0x85DF, 0x5466, 0xDFCF, + 0x5467, 0x85E0, 0x5468, 0xD6DC, 0x5469, 0x85E1, 0x546A, 0x85E2, + 0x546B, 0x85E3, 0x546C, 0x85E4, 0x546D, 0x85E5, 0x546E, 0x85E6, + 0x546F, 0x85E7, 0x5470, 0x85E8, 0x5471, 0xDFC9, 0x5472, 0xDFDA, + 0x5473, 0xCEB6, 0x5474, 0x85E9, 0x5475, 0xBAC7, 0x5476, 0xDFCE, + 0x5477, 0xDFC8, 0x5478, 0xC5DE, 0x5479, 0x85EA, 0x547A, 0x85EB, + 0x547B, 0xC9EB, 0x547C, 0xBAF4, 0x547D, 0xC3FC, 0x547E, 0x85EC, + 0x547F, 0x85ED, 0x5480, 0xBED7, 0x5481, 0x85EE, 0x5482, 0xDFC6, + 0x5483, 0x85EF, 0x5484, 0xDFCD, 0x5485, 0x85F0, 0x5486, 0xC5D8, + 0x5487, 0x85F1, 0x5488, 0x85F2, 0x5489, 0x85F3, 0x548A, 0x85F4, + 0x548B, 0xD5A6, 0x548C, 0xBACD, 0x548D, 0x85F5, 0x548E, 0xBECC, + 0x548F, 0xD3BD, 0x5490, 0xB8C0, 0x5491, 0x85F6, 0x5492, 0xD6E4, + 0x5493, 0x85F7, 0x5494, 0xDFC7, 0x5495, 0xB9BE, 0x5496, 0xBFA7, + 0x5497, 0x85F8, 0x5498, 0x85F9, 0x5499, 0xC1FC, 0x549A, 0xDFCB, + 0x549B, 0xDFCC, 0x549C, 0x85FA, 0x549D, 0xDFD0, 0x549E, 0x85FB, + 0x549F, 0x85FC, 0x54A0, 0x85FD, 0x54A1, 0x85FE, 0x54A2, 0x8640, + 0x54A3, 0xDFDB, 0x54A4, 0xDFE5, 0x54A5, 0x8641, 0x54A6, 0xDFD7, + 0x54A7, 0xDFD6, 0x54A8, 0xD7C9, 0x54A9, 0xDFE3, 0x54AA, 0xDFE4, + 0x54AB, 0xE5EB, 0x54AC, 0xD2A7, 0x54AD, 0xDFD2, 0x54AE, 0x8642, + 0x54AF, 0xBFA9, 0x54B0, 0x8643, 0x54B1, 0xD4DB, 0x54B2, 0x8644, + 0x54B3, 0xBFC8, 0x54B4, 0xDFD4, 0x54B5, 0x8645, 0x54B6, 0x8646, + 0x54B7, 0x8647, 0x54B8, 0xCFCC, 0x54B9, 0x8648, 0x54BA, 0x8649, + 0x54BB, 0xDFDD, 0x54BC, 0x864A, 0x54BD, 0xD1CA, 0x54BE, 0x864B, + 0x54BF, 0xDFDE, 0x54C0, 0xB0A7, 0x54C1, 0xC6B7, 0x54C2, 0xDFD3, + 0x54C3, 0x864C, 0x54C4, 0xBAE5, 0x54C5, 0x864D, 0x54C6, 0xB6DF, + 0x54C7, 0xCDDB, 0x54C8, 0xB9FE, 0x54C9, 0xD4D5, 0x54CA, 0x864E, + 0x54CB, 0x864F, 0x54CC, 0xDFDF, 0x54CD, 0xCFEC, 0x54CE, 0xB0A5, + 0x54CF, 0xDFE7, 0x54D0, 0xDFD1, 0x54D1, 0xD1C6, 0x54D2, 0xDFD5, + 0x54D3, 0xDFD8, 0x54D4, 0xDFD9, 0x54D5, 0xDFDC, 0x54D6, 0x8650, + 0x54D7, 0xBBA9, 0x54D8, 0x8651, 0x54D9, 0xDFE0, 0x54DA, 0xDFE1, + 0x54DB, 0x8652, 0x54DC, 0xDFE2, 0x54DD, 0xDFE6, 0x54DE, 0xDFE8, + 0x54DF, 0xD3B4, 0x54E0, 0x8653, 0x54E1, 0x8654, 0x54E2, 0x8655, + 0x54E3, 0x8656, 0x54E4, 0x8657, 0x54E5, 0xB8E7, 0x54E6, 0xC5B6, + 0x54E7, 0xDFEA, 0x54E8, 0xC9DA, 0x54E9, 0xC1A8, 0x54EA, 0xC4C4, + 0x54EB, 0x8658, 0x54EC, 0x8659, 0x54ED, 0xBFDE, 0x54EE, 0xCFF8, + 0x54EF, 0x865A, 0x54F0, 0x865B, 0x54F1, 0x865C, 0x54F2, 0xD5DC, + 0x54F3, 0xDFEE, 0x54F4, 0x865D, 0x54F5, 0x865E, 0x54F6, 0x865F, + 0x54F7, 0x8660, 0x54F8, 0x8661, 0x54F9, 0x8662, 0x54FA, 0xB2B8, + 0x54FB, 0x8663, 0x54FC, 0xBADF, 0x54FD, 0xDFEC, 0x54FE, 0x8664, + 0x54FF, 0xDBC1, 0x5500, 0x8665, 0x5501, 0xD1E4, 0x5502, 0x8666, + 0x5503, 0x8667, 0x5504, 0x8668, 0x5505, 0x8669, 0x5506, 0xCBF4, + 0x5507, 0xB4BD, 0x5508, 0x866A, 0x5509, 0xB0A6, 0x550A, 0x866B, + 0x550B, 0x866C, 0x550C, 0x866D, 0x550D, 0x866E, 0x550E, 0x866F, + 0x550F, 0xDFF1, 0x5510, 0xCCC6, 0x5511, 0xDFF2, 0x5512, 0x8670, + 0x5513, 0x8671, 0x5514, 0xDFED, 0x5515, 0x8672, 0x5516, 0x8673, + 0x5517, 0x8674, 0x5518, 0x8675, 0x5519, 0x8676, 0x551A, 0x8677, + 0x551B, 0xDFE9, 0x551C, 0x8678, 0x551D, 0x8679, 0x551E, 0x867A, + 0x551F, 0x867B, 0x5520, 0xDFEB, 0x5521, 0x867C, 0x5522, 0xDFEF, + 0x5523, 0xDFF0, 0x5524, 0xBBBD, 0x5525, 0x867D, 0x5526, 0x867E, + 0x5527, 0xDFF3, 0x5528, 0x8680, 0x5529, 0x8681, 0x552A, 0xDFF4, + 0x552B, 0x8682, 0x552C, 0xBBA3, 0x552D, 0x8683, 0x552E, 0xCADB, + 0x552F, 0xCEA8, 0x5530, 0xE0A7, 0x5531, 0xB3AA, 0x5532, 0x8684, + 0x5533, 0xE0A6, 0x5534, 0x8685, 0x5535, 0x8686, 0x5536, 0x8687, + 0x5537, 0xE0A1, 0x5538, 0x8688, 0x5539, 0x8689, 0x553A, 0x868A, + 0x553B, 0x868B, 0x553C, 0xDFFE, 0x553D, 0x868C, 0x553E, 0xCDD9, + 0x553F, 0xDFFC, 0x5540, 0x868D, 0x5541, 0xDFFA, 0x5542, 0x868E, + 0x5543, 0xBFD0, 0x5544, 0xD7C4, 0x5545, 0x868F, 0x5546, 0xC9CC, + 0x5547, 0x8690, 0x5548, 0x8691, 0x5549, 0xDFF8, 0x554A, 0xB0A1, + 0x554B, 0x8692, 0x554C, 0x8693, 0x554D, 0x8694, 0x554E, 0x8695, + 0x554F, 0x8696, 0x5550, 0xDFFD, 0x5551, 0x8697, 0x5552, 0x8698, + 0x5553, 0x8699, 0x5554, 0x869A, 0x5555, 0xDFFB, 0x5556, 0xE0A2, + 0x5557, 0x869B, 0x5558, 0x869C, 0x5559, 0x869D, 0x555A, 0x869E, + 0x555B, 0x869F, 0x555C, 0xE0A8, 0x555D, 0x86A0, 0x555E, 0x86A1, + 0x555F, 0x86A2, 0x5560, 0x86A3, 0x5561, 0xB7C8, 0x5562, 0x86A4, + 0x5563, 0x86A5, 0x5564, 0xC6A1, 0x5565, 0xC9B6, 0x5566, 0xC0B2, + 0x5567, 0xDFF5, 0x5568, 0x86A6, 0x5569, 0x86A7, 0x556A, 0xC5BE, + 0x556B, 0x86A8, 0x556C, 0xD8C4, 0x556D, 0xDFF9, 0x556E, 0xC4F6, + 0x556F, 0x86A9, 0x5570, 0x86AA, 0x5571, 0x86AB, 0x5572, 0x86AC, + 0x5573, 0x86AD, 0x5574, 0x86AE, 0x5575, 0xE0A3, 0x5576, 0xE0A4, + 0x5577, 0xE0A5, 0x5578, 0xD0A5, 0x5579, 0x86AF, 0x557A, 0x86B0, + 0x557B, 0xE0B4, 0x557C, 0xCCE4, 0x557D, 0x86B1, 0x557E, 0xE0B1, + 0x557F, 0x86B2, 0x5580, 0xBFA6, 0x5581, 0xE0AF, 0x5582, 0xCEB9, + 0x5583, 0xE0AB, 0x5584, 0xC9C6, 0x5585, 0x86B3, 0x5586, 0x86B4, + 0x5587, 0xC0AE, 0x5588, 0xE0AE, 0x5589, 0xBAED, 0x558A, 0xBAB0, + 0x558B, 0xE0A9, 0x558C, 0x86B5, 0x558D, 0x86B6, 0x558E, 0x86B7, + 0x558F, 0xDFF6, 0x5590, 0x86B8, 0x5591, 0xE0B3, 0x5592, 0x86B9, + 0x5593, 0x86BA, 0x5594, 0xE0B8, 0x5595, 0x86BB, 0x5596, 0x86BC, + 0x5597, 0x86BD, 0x5598, 0xB4AD, 0x5599, 0xE0B9, 0x559A, 0x86BE, + 0x559B, 0x86BF, 0x559C, 0xCFB2, 0x559D, 0xBAC8, 0x559E, 0x86C0, + 0x559F, 0xE0B0, 0x55A0, 0x86C1, 0x55A1, 0x86C2, 0x55A2, 0x86C3, + 0x55A3, 0x86C4, 0x55A4, 0x86C5, 0x55A5, 0x86C6, 0x55A6, 0x86C7, + 0x55A7, 0xD0FA, 0x55A8, 0x86C8, 0x55A9, 0x86C9, 0x55AA, 0x86CA, + 0x55AB, 0x86CB, 0x55AC, 0x86CC, 0x55AD, 0x86CD, 0x55AE, 0x86CE, + 0x55AF, 0x86CF, 0x55B0, 0x86D0, 0x55B1, 0xE0AC, 0x55B2, 0x86D1, + 0x55B3, 0xD4FB, 0x55B4, 0x86D2, 0x55B5, 0xDFF7, 0x55B6, 0x86D3, + 0x55B7, 0xC5E7, 0x55B8, 0x86D4, 0x55B9, 0xE0AD, 0x55BA, 0x86D5, + 0x55BB, 0xD3F7, 0x55BC, 0x86D6, 0x55BD, 0xE0B6, 0x55BE, 0xE0B7, + 0x55BF, 0x86D7, 0x55C0, 0x86D8, 0x55C1, 0x86D9, 0x55C2, 0x86DA, + 0x55C3, 0x86DB, 0x55C4, 0xE0C4, 0x55C5, 0xD0E1, 0x55C6, 0x86DC, + 0x55C7, 0x86DD, 0x55C8, 0x86DE, 0x55C9, 0xE0BC, 0x55CA, 0x86DF, + 0x55CB, 0x86E0, 0x55CC, 0xE0C9, 0x55CD, 0xE0CA, 0x55CE, 0x86E1, + 0x55CF, 0x86E2, 0x55D0, 0x86E3, 0x55D1, 0xE0BE, 0x55D2, 0xE0AA, + 0x55D3, 0xC9A4, 0x55D4, 0xE0C1, 0x55D5, 0x86E4, 0x55D6, 0xE0B2, + 0x55D7, 0x86E5, 0x55D8, 0x86E6, 0x55D9, 0x86E7, 0x55DA, 0x86E8, + 0x55DB, 0x86E9, 0x55DC, 0xCAC8, 0x55DD, 0xE0C3, 0x55DE, 0x86EA, + 0x55DF, 0xE0B5, 0x55E0, 0x86EB, 0x55E1, 0xCECB, 0x55E2, 0x86EC, + 0x55E3, 0xCBC3, 0x55E4, 0xE0CD, 0x55E5, 0xE0C6, 0x55E6, 0xE0C2, + 0x55E7, 0x86ED, 0x55E8, 0xE0CB, 0x55E9, 0x86EE, 0x55EA, 0xE0BA, + 0x55EB, 0xE0BF, 0x55EC, 0xE0C0, 0x55ED, 0x86EF, 0x55EE, 0x86F0, + 0x55EF, 0xE0C5, 0x55F0, 0x86F1, 0x55F1, 0x86F2, 0x55F2, 0xE0C7, + 0x55F3, 0xE0C8, 0x55F4, 0x86F3, 0x55F5, 0xE0CC, 0x55F6, 0x86F4, + 0x55F7, 0xE0BB, 0x55F8, 0x86F5, 0x55F9, 0x86F6, 0x55FA, 0x86F7, + 0x55FB, 0x86F8, 0x55FC, 0x86F9, 0x55FD, 0xCBD4, 0x55FE, 0xE0D5, + 0x55FF, 0x86FA, 0x5600, 0xE0D6, 0x5601, 0xE0D2, 0x5602, 0x86FB, + 0x5603, 0x86FC, 0x5604, 0x86FD, 0x5605, 0x86FE, 0x5606, 0x8740, + 0x5607, 0x8741, 0x5608, 0xE0D0, 0x5609, 0xBCCE, 0x560A, 0x8742, + 0x560B, 0x8743, 0x560C, 0xE0D1, 0x560D, 0x8744, 0x560E, 0xB8C2, + 0x560F, 0xD8C5, 0x5610, 0x8745, 0x5611, 0x8746, 0x5612, 0x8747, + 0x5613, 0x8748, 0x5614, 0x8749, 0x5615, 0x874A, 0x5616, 0x874B, + 0x5617, 0x874C, 0x5618, 0xD0EA, 0x5619, 0x874D, 0x561A, 0x874E, + 0x561B, 0xC2EF, 0x561C, 0x874F, 0x561D, 0x8750, 0x561E, 0xE0CF, + 0x561F, 0xE0BD, 0x5620, 0x8751, 0x5621, 0x8752, 0x5622, 0x8753, + 0x5623, 0xE0D4, 0x5624, 0xE0D3, 0x5625, 0x8754, 0x5626, 0x8755, + 0x5627, 0xE0D7, 0x5628, 0x8756, 0x5629, 0x8757, 0x562A, 0x8758, + 0x562B, 0x8759, 0x562C, 0xE0DC, 0x562D, 0xE0D8, 0x562E, 0x875A, + 0x562F, 0x875B, 0x5630, 0x875C, 0x5631, 0xD6F6, 0x5632, 0xB3B0, + 0x5633, 0x875D, 0x5634, 0xD7EC, 0x5635, 0x875E, 0x5636, 0xCBBB, + 0x5637, 0x875F, 0x5638, 0x8760, 0x5639, 0xE0DA, 0x563A, 0x8761, + 0x563B, 0xCEFB, 0x563C, 0x8762, 0x563D, 0x8763, 0x563E, 0x8764, + 0x563F, 0xBAD9, 0x5640, 0x8765, 0x5641, 0x8766, 0x5642, 0x8767, + 0x5643, 0x8768, 0x5644, 0x8769, 0x5645, 0x876A, 0x5646, 0x876B, + 0x5647, 0x876C, 0x5648, 0x876D, 0x5649, 0x876E, 0x564A, 0x876F, + 0x564B, 0x8770, 0x564C, 0xE0E1, 0x564D, 0xE0DD, 0x564E, 0xD2AD, + 0x564F, 0x8771, 0x5650, 0x8772, 0x5651, 0x8773, 0x5652, 0x8774, + 0x5653, 0x8775, 0x5654, 0xE0E2, 0x5655, 0x8776, 0x5656, 0x8777, + 0x5657, 0xE0DB, 0x5658, 0xE0D9, 0x5659, 0xE0DF, 0x565A, 0x8778, + 0x565B, 0x8779, 0x565C, 0xE0E0, 0x565D, 0x877A, 0x565E, 0x877B, + 0x565F, 0x877C, 0x5660, 0x877D, 0x5661, 0x877E, 0x5662, 0xE0DE, + 0x5663, 0x8780, 0x5664, 0xE0E4, 0x5665, 0x8781, 0x5666, 0x8782, + 0x5667, 0x8783, 0x5668, 0xC6F7, 0x5669, 0xD8AC, 0x566A, 0xD4EB, + 0x566B, 0xE0E6, 0x566C, 0xCAC9, 0x566D, 0x8784, 0x566E, 0x8785, + 0x566F, 0x8786, 0x5670, 0x8787, 0x5671, 0xE0E5, 0x5672, 0x8788, + 0x5673, 0x8789, 0x5674, 0x878A, 0x5675, 0x878B, 0x5676, 0xB8C1, + 0x5677, 0x878C, 0x5678, 0x878D, 0x5679, 0x878E, 0x567A, 0x878F, + 0x567B, 0xE0E7, 0x567C, 0xE0E8, 0x567D, 0x8790, 0x567E, 0x8791, + 0x567F, 0x8792, 0x5680, 0x8793, 0x5681, 0x8794, 0x5682, 0x8795, + 0x5683, 0x8796, 0x5684, 0x8797, 0x5685, 0xE0E9, 0x5686, 0xE0E3, + 0x5687, 0x8798, 0x5688, 0x8799, 0x5689, 0x879A, 0x568A, 0x879B, + 0x568B, 0x879C, 0x568C, 0x879D, 0x568D, 0x879E, 0x568E, 0xBABF, + 0x568F, 0xCCE7, 0x5690, 0x879F, 0x5691, 0x87A0, 0x5692, 0x87A1, + 0x5693, 0xE0EA, 0x5694, 0x87A2, 0x5695, 0x87A3, 0x5696, 0x87A4, + 0x5697, 0x87A5, 0x5698, 0x87A6, 0x5699, 0x87A7, 0x569A, 0x87A8, + 0x569B, 0x87A9, 0x569C, 0x87AA, 0x569D, 0x87AB, 0x569E, 0x87AC, + 0x569F, 0x87AD, 0x56A0, 0x87AE, 0x56A1, 0x87AF, 0x56A2, 0x87B0, + 0x56A3, 0xCFF9, 0x56A4, 0x87B1, 0x56A5, 0x87B2, 0x56A6, 0x87B3, + 0x56A7, 0x87B4, 0x56A8, 0x87B5, 0x56A9, 0x87B6, 0x56AA, 0x87B7, + 0x56AB, 0x87B8, 0x56AC, 0x87B9, 0x56AD, 0x87BA, 0x56AE, 0x87BB, + 0x56AF, 0xE0EB, 0x56B0, 0x87BC, 0x56B1, 0x87BD, 0x56B2, 0x87BE, + 0x56B3, 0x87BF, 0x56B4, 0x87C0, 0x56B5, 0x87C1, 0x56B6, 0x87C2, + 0x56B7, 0xC8C2, 0x56B8, 0x87C3, 0x56B9, 0x87C4, 0x56BA, 0x87C5, + 0x56BB, 0x87C6, 0x56BC, 0xBDC0, 0x56BD, 0x87C7, 0x56BE, 0x87C8, + 0x56BF, 0x87C9, 0x56C0, 0x87CA, 0x56C1, 0x87CB, 0x56C2, 0x87CC, + 0x56C3, 0x87CD, 0x56C4, 0x87CE, 0x56C5, 0x87CF, 0x56C6, 0x87D0, + 0x56C7, 0x87D1, 0x56C8, 0x87D2, 0x56C9, 0x87D3, 0x56CA, 0xC4D2, + 0x56CB, 0x87D4, 0x56CC, 0x87D5, 0x56CD, 0x87D6, 0x56CE, 0x87D7, + 0x56CF, 0x87D8, 0x56D0, 0x87D9, 0x56D1, 0x87DA, 0x56D2, 0x87DB, + 0x56D3, 0x87DC, 0x56D4, 0xE0EC, 0x56D5, 0x87DD, 0x56D6, 0x87DE, + 0x56D7, 0xE0ED, 0x56D8, 0x87DF, 0x56D9, 0x87E0, 0x56DA, 0xC7F4, + 0x56DB, 0xCBC4, 0x56DC, 0x87E1, 0x56DD, 0xE0EE, 0x56DE, 0xBBD8, + 0x56DF, 0xD8B6, 0x56E0, 0xD2F2, 0x56E1, 0xE0EF, 0x56E2, 0xCDC5, + 0x56E3, 0x87E2, 0x56E4, 0xB6DA, 0x56E5, 0x87E3, 0x56E6, 0x87E4, + 0x56E7, 0x87E5, 0x56E8, 0x87E6, 0x56E9, 0x87E7, 0x56EA, 0x87E8, + 0x56EB, 0xE0F1, 0x56EC, 0x87E9, 0x56ED, 0xD4B0, 0x56EE, 0x87EA, + 0x56EF, 0x87EB, 0x56F0, 0xC0A7, 0x56F1, 0xB4D1, 0x56F2, 0x87EC, + 0x56F3, 0x87ED, 0x56F4, 0xCEA7, 0x56F5, 0xE0F0, 0x56F6, 0x87EE, + 0x56F7, 0x87EF, 0x56F8, 0x87F0, 0x56F9, 0xE0F2, 0x56FA, 0xB9CC, + 0x56FB, 0x87F1, 0x56FC, 0x87F2, 0x56FD, 0xB9FA, 0x56FE, 0xCDBC, + 0x56FF, 0xE0F3, 0x5700, 0x87F3, 0x5701, 0x87F4, 0x5702, 0x87F5, + 0x5703, 0xC6D4, 0x5704, 0xE0F4, 0x5705, 0x87F6, 0x5706, 0xD4B2, + 0x5707, 0x87F7, 0x5708, 0xC8A6, 0x5709, 0xE0F6, 0x570A, 0xE0F5, + 0x570B, 0x87F8, 0x570C, 0x87F9, 0x570D, 0x87FA, 0x570E, 0x87FB, + 0x570F, 0x87FC, 0x5710, 0x87FD, 0x5711, 0x87FE, 0x5712, 0x8840, + 0x5713, 0x8841, 0x5714, 0x8842, 0x5715, 0x8843, 0x5716, 0x8844, + 0x5717, 0x8845, 0x5718, 0x8846, 0x5719, 0x8847, 0x571A, 0x8848, + 0x571B, 0x8849, 0x571C, 0xE0F7, 0x571D, 0x884A, 0x571E, 0x884B, + 0x571F, 0xCDC1, 0x5720, 0x884C, 0x5721, 0x884D, 0x5722, 0x884E, + 0x5723, 0xCAA5, 0x5724, 0x884F, 0x5725, 0x8850, 0x5726, 0x8851, + 0x5727, 0x8852, 0x5728, 0xD4DA, 0x5729, 0xDBD7, 0x572A, 0xDBD9, + 0x572B, 0x8853, 0x572C, 0xDBD8, 0x572D, 0xB9E7, 0x572E, 0xDBDC, + 0x572F, 0xDBDD, 0x5730, 0xB5D8, 0x5731, 0x8854, 0x5732, 0x8855, + 0x5733, 0xDBDA, 0x5734, 0x8856, 0x5735, 0x8857, 0x5736, 0x8858, + 0x5737, 0x8859, 0x5738, 0x885A, 0x5739, 0xDBDB, 0x573A, 0xB3A1, + 0x573B, 0xDBDF, 0x573C, 0x885B, 0x573D, 0x885C, 0x573E, 0xBBF8, + 0x573F, 0x885D, 0x5740, 0xD6B7, 0x5741, 0x885E, 0x5742, 0xDBE0, + 0x5743, 0x885F, 0x5744, 0x8860, 0x5745, 0x8861, 0x5746, 0x8862, + 0x5747, 0xBEF9, 0x5748, 0x8863, 0x5749, 0x8864, 0x574A, 0xB7BB, + 0x574B, 0x8865, 0x574C, 0xDBD0, 0x574D, 0xCCAE, 0x574E, 0xBFB2, + 0x574F, 0xBBB5, 0x5750, 0xD7F8, 0x5751, 0xBFD3, 0x5752, 0x8866, + 0x5753, 0x8867, 0x5754, 0x8868, 0x5755, 0x8869, 0x5756, 0x886A, + 0x5757, 0xBFE9, 0x5758, 0x886B, 0x5759, 0x886C, 0x575A, 0xBCE1, + 0x575B, 0xCCB3, 0x575C, 0xDBDE, 0x575D, 0xB0D3, 0x575E, 0xCEEB, + 0x575F, 0xB7D8, 0x5760, 0xD7B9, 0x5761, 0xC6C2, 0x5762, 0x886D, + 0x5763, 0x886E, 0x5764, 0xC0A4, 0x5765, 0x886F, 0x5766, 0xCCB9, + 0x5767, 0x8870, 0x5768, 0xDBE7, 0x5769, 0xDBE1, 0x576A, 0xC6BA, + 0x576B, 0xDBE3, 0x576C, 0x8871, 0x576D, 0xDBE8, 0x576E, 0x8872, + 0x576F, 0xC5F7, 0x5770, 0x8873, 0x5771, 0x8874, 0x5772, 0x8875, + 0x5773, 0xDBEA, 0x5774, 0x8876, 0x5775, 0x8877, 0x5776, 0xDBE9, + 0x5777, 0xBFC0, 0x5778, 0x8878, 0x5779, 0x8879, 0x577A, 0x887A, + 0x577B, 0xDBE6, 0x577C, 0xDBE5, 0x577D, 0x887B, 0x577E, 0x887C, + 0x577F, 0x887D, 0x5780, 0x887E, 0x5781, 0x8880, 0x5782, 0xB4B9, + 0x5783, 0xC0AC, 0x5784, 0xC2A2, 0x5785, 0xDBE2, 0x5786, 0xDBE4, + 0x5787, 0x8881, 0x5788, 0x8882, 0x5789, 0x8883, 0x578A, 0x8884, + 0x578B, 0xD0CD, 0x578C, 0xDBED, 0x578D, 0x8885, 0x578E, 0x8886, + 0x578F, 0x8887, 0x5790, 0x8888, 0x5791, 0x8889, 0x5792, 0xC0DD, + 0x5793, 0xDBF2, 0x5794, 0x888A, 0x5795, 0x888B, 0x5796, 0x888C, + 0x5797, 0x888D, 0x5798, 0x888E, 0x5799, 0x888F, 0x579A, 0x8890, + 0x579B, 0xB6E2, 0x579C, 0x8891, 0x579D, 0x8892, 0x579E, 0x8893, + 0x579F, 0x8894, 0x57A0, 0xDBF3, 0x57A1, 0xDBD2, 0x57A2, 0xB9B8, + 0x57A3, 0xD4AB, 0x57A4, 0xDBEC, 0x57A5, 0x8895, 0x57A6, 0xBFD1, + 0x57A7, 0xDBF0, 0x57A8, 0x8896, 0x57A9, 0xDBD1, 0x57AA, 0x8897, + 0x57AB, 0xB5E6, 0x57AC, 0x8898, 0x57AD, 0xDBEB, 0x57AE, 0xBFE5, + 0x57AF, 0x8899, 0x57B0, 0x889A, 0x57B1, 0x889B, 0x57B2, 0xDBEE, + 0x57B3, 0x889C, 0x57B4, 0xDBF1, 0x57B5, 0x889D, 0x57B6, 0x889E, + 0x57B7, 0x889F, 0x57B8, 0xDBF9, 0x57B9, 0x88A0, 0x57BA, 0x88A1, + 0x57BB, 0x88A2, 0x57BC, 0x88A3, 0x57BD, 0x88A4, 0x57BE, 0x88A5, + 0x57BF, 0x88A6, 0x57C0, 0x88A7, 0x57C1, 0x88A8, 0x57C2, 0xB9A1, + 0x57C3, 0xB0A3, 0x57C4, 0x88A9, 0x57C5, 0x88AA, 0x57C6, 0x88AB, + 0x57C7, 0x88AC, 0x57C8, 0x88AD, 0x57C9, 0x88AE, 0x57CA, 0x88AF, + 0x57CB, 0xC2F1, 0x57CC, 0x88B0, 0x57CD, 0x88B1, 0x57CE, 0xB3C7, + 0x57CF, 0xDBEF, 0x57D0, 0x88B2, 0x57D1, 0x88B3, 0x57D2, 0xDBF8, + 0x57D3, 0x88B4, 0x57D4, 0xC6D2, 0x57D5, 0xDBF4, 0x57D6, 0x88B5, + 0x57D7, 0x88B6, 0x57D8, 0xDBF5, 0x57D9, 0xDBF7, 0x57DA, 0xDBF6, + 0x57DB, 0x88B7, 0x57DC, 0x88B8, 0x57DD, 0xDBFE, 0x57DE, 0x88B9, + 0x57DF, 0xD3F2, 0x57E0, 0xB2BA, 0x57E1, 0x88BA, 0x57E2, 0x88BB, + 0x57E3, 0x88BC, 0x57E4, 0xDBFD, 0x57E5, 0x88BD, 0x57E6, 0x88BE, + 0x57E7, 0x88BF, 0x57E8, 0x88C0, 0x57E9, 0x88C1, 0x57EA, 0x88C2, + 0x57EB, 0x88C3, 0x57EC, 0x88C4, 0x57ED, 0xDCA4, 0x57EE, 0x88C5, + 0x57EF, 0xDBFB, 0x57F0, 0x88C6, 0x57F1, 0x88C7, 0x57F2, 0x88C8, + 0x57F3, 0x88C9, 0x57F4, 0xDBFA, 0x57F5, 0x88CA, 0x57F6, 0x88CB, + 0x57F7, 0x88CC, 0x57F8, 0xDBFC, 0x57F9, 0xC5E0, 0x57FA, 0xBBF9, + 0x57FB, 0x88CD, 0x57FC, 0x88CE, 0x57FD, 0xDCA3, 0x57FE, 0x88CF, + 0x57FF, 0x88D0, 0x5800, 0xDCA5, 0x5801, 0x88D1, 0x5802, 0xCCC3, + 0x5803, 0x88D2, 0x5804, 0x88D3, 0x5805, 0x88D4, 0x5806, 0xB6D1, + 0x5807, 0xDDC0, 0x5808, 0x88D5, 0x5809, 0x88D6, 0x580A, 0x88D7, + 0x580B, 0xDCA1, 0x580C, 0x88D8, 0x580D, 0xDCA2, 0x580E, 0x88D9, + 0x580F, 0x88DA, 0x5810, 0x88DB, 0x5811, 0xC7B5, 0x5812, 0x88DC, + 0x5813, 0x88DD, 0x5814, 0x88DE, 0x5815, 0xB6E9, 0x5816, 0x88DF, + 0x5817, 0x88E0, 0x5818, 0x88E1, 0x5819, 0xDCA7, 0x581A, 0x88E2, + 0x581B, 0x88E3, 0x581C, 0x88E4, 0x581D, 0x88E5, 0x581E, 0xDCA6, + 0x581F, 0x88E6, 0x5820, 0xDCA9, 0x5821, 0xB1A4, 0x5822, 0x88E7, + 0x5823, 0x88E8, 0x5824, 0xB5CC, 0x5825, 0x88E9, 0x5826, 0x88EA, + 0x5827, 0x88EB, 0x5828, 0x88EC, 0x5829, 0x88ED, 0x582A, 0xBFB0, + 0x582B, 0x88EE, 0x582C, 0x88EF, 0x582D, 0x88F0, 0x582E, 0x88F1, + 0x582F, 0x88F2, 0x5830, 0xD1DF, 0x5831, 0x88F3, 0x5832, 0x88F4, + 0x5833, 0x88F5, 0x5834, 0x88F6, 0x5835, 0xB6C2, 0x5836, 0x88F7, + 0x5837, 0x88F8, 0x5838, 0x88F9, 0x5839, 0x88FA, 0x583A, 0x88FB, + 0x583B, 0x88FC, 0x583C, 0x88FD, 0x583D, 0x88FE, 0x583E, 0x8940, + 0x583F, 0x8941, 0x5840, 0x8942, 0x5841, 0x8943, 0x5842, 0x8944, + 0x5843, 0x8945, 0x5844, 0xDCA8, 0x5845, 0x8946, 0x5846, 0x8947, + 0x5847, 0x8948, 0x5848, 0x8949, 0x5849, 0x894A, 0x584A, 0x894B, + 0x584B, 0x894C, 0x584C, 0xCBFA, 0x584D, 0xEBF3, 0x584E, 0x894D, + 0x584F, 0x894E, 0x5850, 0x894F, 0x5851, 0xCBDC, 0x5852, 0x8950, + 0x5853, 0x8951, 0x5854, 0xCBFE, 0x5855, 0x8952, 0x5856, 0x8953, + 0x5857, 0x8954, 0x5858, 0xCCC1, 0x5859, 0x8955, 0x585A, 0x8956, + 0x585B, 0x8957, 0x585C, 0x8958, 0x585D, 0x8959, 0x585E, 0xC8FB, + 0x585F, 0x895A, 0x5860, 0x895B, 0x5861, 0x895C, 0x5862, 0x895D, + 0x5863, 0x895E, 0x5864, 0x895F, 0x5865, 0xDCAA, 0x5866, 0x8960, + 0x5867, 0x8961, 0x5868, 0x8962, 0x5869, 0x8963, 0x586A, 0x8964, + 0x586B, 0xCCEE, 0x586C, 0xDCAB, 0x586D, 0x8965, 0x586E, 0x8966, + 0x586F, 0x8967, 0x5870, 0x8968, 0x5871, 0x8969, 0x5872, 0x896A, + 0x5873, 0x896B, 0x5874, 0x896C, 0x5875, 0x896D, 0x5876, 0x896E, + 0x5877, 0x896F, 0x5878, 0x8970, 0x5879, 0x8971, 0x587A, 0x8972, + 0x587B, 0x8973, 0x587C, 0x8974, 0x587D, 0x8975, 0x587E, 0xDBD3, + 0x587F, 0x8976, 0x5880, 0xDCAF, 0x5881, 0xDCAC, 0x5882, 0x8977, + 0x5883, 0xBEB3, 0x5884, 0x8978, 0x5885, 0xCAFB, 0x5886, 0x8979, + 0x5887, 0x897A, 0x5888, 0x897B, 0x5889, 0xDCAD, 0x588A, 0x897C, + 0x588B, 0x897D, 0x588C, 0x897E, 0x588D, 0x8980, 0x588E, 0x8981, + 0x588F, 0x8982, 0x5890, 0x8983, 0x5891, 0x8984, 0x5892, 0xC9CA, + 0x5893, 0xC4B9, 0x5894, 0x8985, 0x5895, 0x8986, 0x5896, 0x8987, + 0x5897, 0x8988, 0x5898, 0x8989, 0x5899, 0xC7BD, 0x589A, 0xDCAE, + 0x589B, 0x898A, 0x589C, 0x898B, 0x589D, 0x898C, 0x589E, 0xD4F6, + 0x589F, 0xD0E6, 0x58A0, 0x898D, 0x58A1, 0x898E, 0x58A2, 0x898F, + 0x58A3, 0x8990, 0x58A4, 0x8991, 0x58A5, 0x8992, 0x58A6, 0x8993, + 0x58A7, 0x8994, 0x58A8, 0xC4AB, 0x58A9, 0xB6D5, 0x58AA, 0x8995, + 0x58AB, 0x8996, 0x58AC, 0x8997, 0x58AD, 0x8998, 0x58AE, 0x8999, + 0x58AF, 0x899A, 0x58B0, 0x899B, 0x58B1, 0x899C, 0x58B2, 0x899D, + 0x58B3, 0x899E, 0x58B4, 0x899F, 0x58B5, 0x89A0, 0x58B6, 0x89A1, + 0x58B7, 0x89A2, 0x58B8, 0x89A3, 0x58B9, 0x89A4, 0x58BA, 0x89A5, + 0x58BB, 0x89A6, 0x58BC, 0xDBD4, 0x58BD, 0x89A7, 0x58BE, 0x89A8, + 0x58BF, 0x89A9, 0x58C0, 0x89AA, 0x58C1, 0xB1DA, 0x58C2, 0x89AB, + 0x58C3, 0x89AC, 0x58C4, 0x89AD, 0x58C5, 0xDBD5, 0x58C6, 0x89AE, + 0x58C7, 0x89AF, 0x58C8, 0x89B0, 0x58C9, 0x89B1, 0x58CA, 0x89B2, + 0x58CB, 0x89B3, 0x58CC, 0x89B4, 0x58CD, 0x89B5, 0x58CE, 0x89B6, + 0x58CF, 0x89B7, 0x58D0, 0x89B8, 0x58D1, 0xDBD6, 0x58D2, 0x89B9, + 0x58D3, 0x89BA, 0x58D4, 0x89BB, 0x58D5, 0xBABE, 0x58D6, 0x89BC, + 0x58D7, 0x89BD, 0x58D8, 0x89BE, 0x58D9, 0x89BF, 0x58DA, 0x89C0, + 0x58DB, 0x89C1, 0x58DC, 0x89C2, 0x58DD, 0x89C3, 0x58DE, 0x89C4, + 0x58DF, 0x89C5, 0x58E0, 0x89C6, 0x58E1, 0x89C7, 0x58E2, 0x89C8, + 0x58E3, 0x89C9, 0x58E4, 0xC8C0, 0x58E5, 0x89CA, 0x58E6, 0x89CB, + 0x58E7, 0x89CC, 0x58E8, 0x89CD, 0x58E9, 0x89CE, 0x58EA, 0x89CF, + 0x58EB, 0xCABF, 0x58EC, 0xC8C9, 0x58ED, 0x89D0, 0x58EE, 0xD7B3, + 0x58EF, 0x89D1, 0x58F0, 0xC9F9, 0x58F1, 0x89D2, 0x58F2, 0x89D3, + 0x58F3, 0xBFC7, 0x58F4, 0x89D4, 0x58F5, 0x89D5, 0x58F6, 0xBAF8, + 0x58F7, 0x89D6, 0x58F8, 0x89D7, 0x58F9, 0xD2BC, 0x58FA, 0x89D8, + 0x58FB, 0x89D9, 0x58FC, 0x89DA, 0x58FD, 0x89DB, 0x58FE, 0x89DC, + 0x58FF, 0x89DD, 0x5900, 0x89DE, 0x5901, 0x89DF, 0x5902, 0xE2BA, + 0x5903, 0x89E0, 0x5904, 0xB4A6, 0x5905, 0x89E1, 0x5906, 0x89E2, + 0x5907, 0xB1B8, 0x5908, 0x89E3, 0x5909, 0x89E4, 0x590A, 0x89E5, + 0x590B, 0x89E6, 0x590C, 0x89E7, 0x590D, 0xB8B4, 0x590E, 0x89E8, + 0x590F, 0xCFC4, 0x5910, 0x89E9, 0x5911, 0x89EA, 0x5912, 0x89EB, + 0x5913, 0x89EC, 0x5914, 0xD9E7, 0x5915, 0xCFA6, 0x5916, 0xCDE2, + 0x5917, 0x89ED, 0x5918, 0x89EE, 0x5919, 0xD9ED, 0x591A, 0xB6E0, + 0x591B, 0x89EF, 0x591C, 0xD2B9, 0x591D, 0x89F0, 0x591E, 0x89F1, + 0x591F, 0xB9BB, 0x5920, 0x89F2, 0x5921, 0x89F3, 0x5922, 0x89F4, + 0x5923, 0x89F5, 0x5924, 0xE2B9, 0x5925, 0xE2B7, 0x5926, 0x89F6, + 0x5927, 0xB4F3, 0x5928, 0x89F7, 0x5929, 0xCCEC, 0x592A, 0xCCAB, + 0x592B, 0xB7F2, 0x592C, 0x89F8, 0x592D, 0xD8B2, 0x592E, 0xD1EB, + 0x592F, 0xBABB, 0x5930, 0x89F9, 0x5931, 0xCAA7, 0x5932, 0x89FA, + 0x5933, 0x89FB, 0x5934, 0xCDB7, 0x5935, 0x89FC, 0x5936, 0x89FD, + 0x5937, 0xD2C4, 0x5938, 0xBFE4, 0x5939, 0xBCD0, 0x593A, 0xB6E1, + 0x593B, 0x89FE, 0x593C, 0xDEC5, 0x593D, 0x8A40, 0x593E, 0x8A41, + 0x593F, 0x8A42, 0x5940, 0x8A43, 0x5941, 0xDEC6, 0x5942, 0xDBBC, + 0x5943, 0x8A44, 0x5944, 0xD1D9, 0x5945, 0x8A45, 0x5946, 0x8A46, + 0x5947, 0xC6E6, 0x5948, 0xC4CE, 0x5949, 0xB7EE, 0x594A, 0x8A47, + 0x594B, 0xB7DC, 0x594C, 0x8A48, 0x594D, 0x8A49, 0x594E, 0xBFFC, + 0x594F, 0xD7E0, 0x5950, 0x8A4A, 0x5951, 0xC6F5, 0x5952, 0x8A4B, + 0x5953, 0x8A4C, 0x5954, 0xB1BC, 0x5955, 0xDEC8, 0x5956, 0xBDB1, + 0x5957, 0xCCD7, 0x5958, 0xDECA, 0x5959, 0x8A4D, 0x595A, 0xDEC9, + 0x595B, 0x8A4E, 0x595C, 0x8A4F, 0x595D, 0x8A50, 0x595E, 0x8A51, + 0x595F, 0x8A52, 0x5960, 0xB5EC, 0x5961, 0x8A53, 0x5962, 0xC9DD, + 0x5963, 0x8A54, 0x5964, 0x8A55, 0x5965, 0xB0C2, 0x5966, 0x8A56, + 0x5967, 0x8A57, 0x5968, 0x8A58, 0x5969, 0x8A59, 0x596A, 0x8A5A, + 0x596B, 0x8A5B, 0x596C, 0x8A5C, 0x596D, 0x8A5D, 0x596E, 0x8A5E, + 0x596F, 0x8A5F, 0x5970, 0x8A60, 0x5971, 0x8A61, 0x5972, 0x8A62, + 0x5973, 0xC5AE, 0x5974, 0xC5AB, 0x5975, 0x8A63, 0x5976, 0xC4CC, + 0x5977, 0x8A64, 0x5978, 0xBCE9, 0x5979, 0xCBFD, 0x597A, 0x8A65, + 0x597B, 0x8A66, 0x597C, 0x8A67, 0x597D, 0xBAC3, 0x597E, 0x8A68, + 0x597F, 0x8A69, 0x5980, 0x8A6A, 0x5981, 0xE5F9, 0x5982, 0xC8E7, + 0x5983, 0xE5FA, 0x5984, 0xCDFD, 0x5985, 0x8A6B, 0x5986, 0xD7B1, + 0x5987, 0xB8BE, 0x5988, 0xC2E8, 0x5989, 0x8A6C, 0x598A, 0xC8D1, + 0x598B, 0x8A6D, 0x598C, 0x8A6E, 0x598D, 0xE5FB, 0x598E, 0x8A6F, + 0x598F, 0x8A70, 0x5990, 0x8A71, 0x5991, 0x8A72, 0x5992, 0xB6CA, + 0x5993, 0xBCCB, 0x5994, 0x8A73, 0x5995, 0x8A74, 0x5996, 0xD1FD, + 0x5997, 0xE6A1, 0x5998, 0x8A75, 0x5999, 0xC3EE, 0x599A, 0x8A76, + 0x599B, 0x8A77, 0x599C, 0x8A78, 0x599D, 0x8A79, 0x599E, 0xE6A4, + 0x599F, 0x8A7A, 0x59A0, 0x8A7B, 0x59A1, 0x8A7C, 0x59A2, 0x8A7D, + 0x59A3, 0xE5FE, 0x59A4, 0xE6A5, 0x59A5, 0xCDD7, 0x59A6, 0x8A7E, + 0x59A7, 0x8A80, 0x59A8, 0xB7C1, 0x59A9, 0xE5FC, 0x59AA, 0xE5FD, + 0x59AB, 0xE6A3, 0x59AC, 0x8A81, 0x59AD, 0x8A82, 0x59AE, 0xC4DD, + 0x59AF, 0xE6A8, 0x59B0, 0x8A83, 0x59B1, 0x8A84, 0x59B2, 0xE6A7, + 0x59B3, 0x8A85, 0x59B4, 0x8A86, 0x59B5, 0x8A87, 0x59B6, 0x8A88, + 0x59B7, 0x8A89, 0x59B8, 0x8A8A, 0x59B9, 0xC3C3, 0x59BA, 0x8A8B, + 0x59BB, 0xC6DE, 0x59BC, 0x8A8C, 0x59BD, 0x8A8D, 0x59BE, 0xE6AA, + 0x59BF, 0x8A8E, 0x59C0, 0x8A8F, 0x59C1, 0x8A90, 0x59C2, 0x8A91, + 0x59C3, 0x8A92, 0x59C4, 0x8A93, 0x59C5, 0x8A94, 0x59C6, 0xC4B7, + 0x59C7, 0x8A95, 0x59C8, 0x8A96, 0x59C9, 0x8A97, 0x59CA, 0xE6A2, + 0x59CB, 0xCABC, 0x59CC, 0x8A98, 0x59CD, 0x8A99, 0x59CE, 0x8A9A, + 0x59CF, 0x8A9B, 0x59D0, 0xBDE3, 0x59D1, 0xB9C3, 0x59D2, 0xE6A6, + 0x59D3, 0xD0D5, 0x59D4, 0xCEAF, 0x59D5, 0x8A9C, 0x59D6, 0x8A9D, + 0x59D7, 0xE6A9, 0x59D8, 0xE6B0, 0x59D9, 0x8A9E, 0x59DA, 0xD2A6, + 0x59DB, 0x8A9F, 0x59DC, 0xBDAA, 0x59DD, 0xE6AD, 0x59DE, 0x8AA0, + 0x59DF, 0x8AA1, 0x59E0, 0x8AA2, 0x59E1, 0x8AA3, 0x59E2, 0x8AA4, + 0x59E3, 0xE6AF, 0x59E4, 0x8AA5, 0x59E5, 0xC0D1, 0x59E6, 0x8AA6, + 0x59E7, 0x8AA7, 0x59E8, 0xD2CC, 0x59E9, 0x8AA8, 0x59EA, 0x8AA9, + 0x59EB, 0x8AAA, 0x59EC, 0xBCA7, 0x59ED, 0x8AAB, 0x59EE, 0x8AAC, + 0x59EF, 0x8AAD, 0x59F0, 0x8AAE, 0x59F1, 0x8AAF, 0x59F2, 0x8AB0, + 0x59F3, 0x8AB1, 0x59F4, 0x8AB2, 0x59F5, 0x8AB3, 0x59F6, 0x8AB4, + 0x59F7, 0x8AB5, 0x59F8, 0x8AB6, 0x59F9, 0xE6B1, 0x59FA, 0x8AB7, + 0x59FB, 0xD2F6, 0x59FC, 0x8AB8, 0x59FD, 0x8AB9, 0x59FE, 0x8ABA, + 0x59FF, 0xD7CB, 0x5A00, 0x8ABB, 0x5A01, 0xCDFE, 0x5A02, 0x8ABC, + 0x5A03, 0xCDDE, 0x5A04, 0xC2A6, 0x5A05, 0xE6AB, 0x5A06, 0xE6AC, + 0x5A07, 0xBDBF, 0x5A08, 0xE6AE, 0x5A09, 0xE6B3, 0x5A0A, 0x8ABD, + 0x5A0B, 0x8ABE, 0x5A0C, 0xE6B2, 0x5A0D, 0x8ABF, 0x5A0E, 0x8AC0, + 0x5A0F, 0x8AC1, 0x5A10, 0x8AC2, 0x5A11, 0xE6B6, 0x5A12, 0x8AC3, + 0x5A13, 0xE6B8, 0x5A14, 0x8AC4, 0x5A15, 0x8AC5, 0x5A16, 0x8AC6, + 0x5A17, 0x8AC7, 0x5A18, 0xC4EF, 0x5A19, 0x8AC8, 0x5A1A, 0x8AC9, + 0x5A1B, 0x8ACA, 0x5A1C, 0xC4C8, 0x5A1D, 0x8ACB, 0x5A1E, 0x8ACC, + 0x5A1F, 0xBEEA, 0x5A20, 0xC9EF, 0x5A21, 0x8ACD, 0x5A22, 0x8ACE, + 0x5A23, 0xE6B7, 0x5A24, 0x8ACF, 0x5A25, 0xB6F0, 0x5A26, 0x8AD0, + 0x5A27, 0x8AD1, 0x5A28, 0x8AD2, 0x5A29, 0xC3E4, 0x5A2A, 0x8AD3, + 0x5A2B, 0x8AD4, 0x5A2C, 0x8AD5, 0x5A2D, 0x8AD6, 0x5A2E, 0x8AD7, + 0x5A2F, 0x8AD8, 0x5A30, 0x8AD9, 0x5A31, 0xD3E9, 0x5A32, 0xE6B4, + 0x5A33, 0x8ADA, 0x5A34, 0xE6B5, 0x5A35, 0x8ADB, 0x5A36, 0xC8A2, + 0x5A37, 0x8ADC, 0x5A38, 0x8ADD, 0x5A39, 0x8ADE, 0x5A3A, 0x8ADF, + 0x5A3B, 0x8AE0, 0x5A3C, 0xE6BD, 0x5A3D, 0x8AE1, 0x5A3E, 0x8AE2, + 0x5A3F, 0x8AE3, 0x5A40, 0xE6B9, 0x5A41, 0x8AE4, 0x5A42, 0x8AE5, + 0x5A43, 0x8AE6, 0x5A44, 0x8AE7, 0x5A45, 0x8AE8, 0x5A46, 0xC6C5, + 0x5A47, 0x8AE9, 0x5A48, 0x8AEA, 0x5A49, 0xCDF1, 0x5A4A, 0xE6BB, + 0x5A4B, 0x8AEB, 0x5A4C, 0x8AEC, 0x5A4D, 0x8AED, 0x5A4E, 0x8AEE, + 0x5A4F, 0x8AEF, 0x5A50, 0x8AF0, 0x5A51, 0x8AF1, 0x5A52, 0x8AF2, + 0x5A53, 0x8AF3, 0x5A54, 0x8AF4, 0x5A55, 0xE6BC, 0x5A56, 0x8AF5, + 0x5A57, 0x8AF6, 0x5A58, 0x8AF7, 0x5A59, 0x8AF8, 0x5A5A, 0xBBE9, + 0x5A5B, 0x8AF9, 0x5A5C, 0x8AFA, 0x5A5D, 0x8AFB, 0x5A5E, 0x8AFC, + 0x5A5F, 0x8AFD, 0x5A60, 0x8AFE, 0x5A61, 0x8B40, 0x5A62, 0xE6BE, + 0x5A63, 0x8B41, 0x5A64, 0x8B42, 0x5A65, 0x8B43, 0x5A66, 0x8B44, + 0x5A67, 0xE6BA, 0x5A68, 0x8B45, 0x5A69, 0x8B46, 0x5A6A, 0xC0B7, + 0x5A6B, 0x8B47, 0x5A6C, 0x8B48, 0x5A6D, 0x8B49, 0x5A6E, 0x8B4A, + 0x5A6F, 0x8B4B, 0x5A70, 0x8B4C, 0x5A71, 0x8B4D, 0x5A72, 0x8B4E, + 0x5A73, 0x8B4F, 0x5A74, 0xD3A4, 0x5A75, 0xE6BF, 0x5A76, 0xC9F4, + 0x5A77, 0xE6C3, 0x5A78, 0x8B50, 0x5A79, 0x8B51, 0x5A7A, 0xE6C4, + 0x5A7B, 0x8B52, 0x5A7C, 0x8B53, 0x5A7D, 0x8B54, 0x5A7E, 0x8B55, + 0x5A7F, 0xD0F6, 0x5A80, 0x8B56, 0x5A81, 0x8B57, 0x5A82, 0x8B58, + 0x5A83, 0x8B59, 0x5A84, 0x8B5A, 0x5A85, 0x8B5B, 0x5A86, 0x8B5C, + 0x5A87, 0x8B5D, 0x5A88, 0x8B5E, 0x5A89, 0x8B5F, 0x5A8A, 0x8B60, + 0x5A8B, 0x8B61, 0x5A8C, 0x8B62, 0x5A8D, 0x8B63, 0x5A8E, 0x8B64, + 0x5A8F, 0x8B65, 0x5A90, 0x8B66, 0x5A91, 0x8B67, 0x5A92, 0xC3BD, + 0x5A93, 0x8B68, 0x5A94, 0x8B69, 0x5A95, 0x8B6A, 0x5A96, 0x8B6B, + 0x5A97, 0x8B6C, 0x5A98, 0x8B6D, 0x5A99, 0x8B6E, 0x5A9A, 0xC3C4, + 0x5A9B, 0xE6C2, 0x5A9C, 0x8B6F, 0x5A9D, 0x8B70, 0x5A9E, 0x8B71, + 0x5A9F, 0x8B72, 0x5AA0, 0x8B73, 0x5AA1, 0x8B74, 0x5AA2, 0x8B75, + 0x5AA3, 0x8B76, 0x5AA4, 0x8B77, 0x5AA5, 0x8B78, 0x5AA6, 0x8B79, + 0x5AA7, 0x8B7A, 0x5AA8, 0x8B7B, 0x5AA9, 0x8B7C, 0x5AAA, 0xE6C1, + 0x5AAB, 0x8B7D, 0x5AAC, 0x8B7E, 0x5AAD, 0x8B80, 0x5AAE, 0x8B81, + 0x5AAF, 0x8B82, 0x5AB0, 0x8B83, 0x5AB1, 0x8B84, 0x5AB2, 0xE6C7, + 0x5AB3, 0xCFB1, 0x5AB4, 0x8B85, 0x5AB5, 0xEBF4, 0x5AB6, 0x8B86, + 0x5AB7, 0x8B87, 0x5AB8, 0xE6CA, 0x5AB9, 0x8B88, 0x5ABA, 0x8B89, + 0x5ABB, 0x8B8A, 0x5ABC, 0x8B8B, 0x5ABD, 0x8B8C, 0x5ABE, 0xE6C5, + 0x5ABF, 0x8B8D, 0x5AC0, 0x8B8E, 0x5AC1, 0xBCDE, 0x5AC2, 0xC9A9, + 0x5AC3, 0x8B8F, 0x5AC4, 0x8B90, 0x5AC5, 0x8B91, 0x5AC6, 0x8B92, + 0x5AC7, 0x8B93, 0x5AC8, 0x8B94, 0x5AC9, 0xBCB5, 0x5ACA, 0x8B95, + 0x5ACB, 0x8B96, 0x5ACC, 0xCFD3, 0x5ACD, 0x8B97, 0x5ACE, 0x8B98, + 0x5ACF, 0x8B99, 0x5AD0, 0x8B9A, 0x5AD1, 0x8B9B, 0x5AD2, 0xE6C8, + 0x5AD3, 0x8B9C, 0x5AD4, 0xE6C9, 0x5AD5, 0x8B9D, 0x5AD6, 0xE6CE, + 0x5AD7, 0x8B9E, 0x5AD8, 0xE6D0, 0x5AD9, 0x8B9F, 0x5ADA, 0x8BA0, + 0x5ADB, 0x8BA1, 0x5ADC, 0xE6D1, 0x5ADD, 0x8BA2, 0x5ADE, 0x8BA3, + 0x5ADF, 0x8BA4, 0x5AE0, 0xE6CB, 0x5AE1, 0xB5D5, 0x5AE2, 0x8BA5, + 0x5AE3, 0xE6CC, 0x5AE4, 0x8BA6, 0x5AE5, 0x8BA7, 0x5AE6, 0xE6CF, + 0x5AE7, 0x8BA8, 0x5AE8, 0x8BA9, 0x5AE9, 0xC4DB, 0x5AEA, 0x8BAA, + 0x5AEB, 0xE6C6, 0x5AEC, 0x8BAB, 0x5AED, 0x8BAC, 0x5AEE, 0x8BAD, + 0x5AEF, 0x8BAE, 0x5AF0, 0x8BAF, 0x5AF1, 0xE6CD, 0x5AF2, 0x8BB0, + 0x5AF3, 0x8BB1, 0x5AF4, 0x8BB2, 0x5AF5, 0x8BB3, 0x5AF6, 0x8BB4, + 0x5AF7, 0x8BB5, 0x5AF8, 0x8BB6, 0x5AF9, 0x8BB7, 0x5AFA, 0x8BB8, + 0x5AFB, 0x8BB9, 0x5AFC, 0x8BBA, 0x5AFD, 0x8BBB, 0x5AFE, 0x8BBC, + 0x5AFF, 0x8BBD, 0x5B00, 0x8BBE, 0x5B01, 0x8BBF, 0x5B02, 0x8BC0, + 0x5B03, 0x8BC1, 0x5B04, 0x8BC2, 0x5B05, 0x8BC3, 0x5B06, 0x8BC4, + 0x5B07, 0x8BC5, 0x5B08, 0x8BC6, 0x5B09, 0xE6D2, 0x5B0A, 0x8BC7, + 0x5B0B, 0x8BC8, 0x5B0C, 0x8BC9, 0x5B0D, 0x8BCA, 0x5B0E, 0x8BCB, + 0x5B0F, 0x8BCC, 0x5B10, 0x8BCD, 0x5B11, 0x8BCE, 0x5B12, 0x8BCF, + 0x5B13, 0x8BD0, 0x5B14, 0x8BD1, 0x5B15, 0x8BD2, 0x5B16, 0xE6D4, + 0x5B17, 0xE6D3, 0x5B18, 0x8BD3, 0x5B19, 0x8BD4, 0x5B1A, 0x8BD5, + 0x5B1B, 0x8BD6, 0x5B1C, 0x8BD7, 0x5B1D, 0x8BD8, 0x5B1E, 0x8BD9, + 0x5B1F, 0x8BDA, 0x5B20, 0x8BDB, 0x5B21, 0x8BDC, 0x5B22, 0x8BDD, + 0x5B23, 0x8BDE, 0x5B24, 0x8BDF, 0x5B25, 0x8BE0, 0x5B26, 0x8BE1, + 0x5B27, 0x8BE2, 0x5B28, 0x8BE3, 0x5B29, 0x8BE4, 0x5B2A, 0x8BE5, + 0x5B2B, 0x8BE6, 0x5B2C, 0x8BE7, 0x5B2D, 0x8BE8, 0x5B2E, 0x8BE9, + 0x5B2F, 0x8BEA, 0x5B30, 0x8BEB, 0x5B31, 0x8BEC, 0x5B32, 0xE6D5, + 0x5B33, 0x8BED, 0x5B34, 0xD9F8, 0x5B35, 0x8BEE, 0x5B36, 0x8BEF, + 0x5B37, 0xE6D6, 0x5B38, 0x8BF0, 0x5B39, 0x8BF1, 0x5B3A, 0x8BF2, + 0x5B3B, 0x8BF3, 0x5B3C, 0x8BF4, 0x5B3D, 0x8BF5, 0x5B3E, 0x8BF6, + 0x5B3F, 0x8BF7, 0x5B40, 0xE6D7, 0x5B41, 0x8BF8, 0x5B42, 0x8BF9, + 0x5B43, 0x8BFA, 0x5B44, 0x8BFB, 0x5B45, 0x8BFC, 0x5B46, 0x8BFD, + 0x5B47, 0x8BFE, 0x5B48, 0x8C40, 0x5B49, 0x8C41, 0x5B4A, 0x8C42, + 0x5B4B, 0x8C43, 0x5B4C, 0x8C44, 0x5B4D, 0x8C45, 0x5B4E, 0x8C46, + 0x5B4F, 0x8C47, 0x5B50, 0xD7D3, 0x5B51, 0xE6DD, 0x5B52, 0x8C48, + 0x5B53, 0xE6DE, 0x5B54, 0xBFD7, 0x5B55, 0xD4D0, 0x5B56, 0x8C49, + 0x5B57, 0xD7D6, 0x5B58, 0xB4E6, 0x5B59, 0xCBEF, 0x5B5A, 0xE6DA, + 0x5B5B, 0xD8C3, 0x5B5C, 0xD7CE, 0x5B5D, 0xD0A2, 0x5B5E, 0x8C4A, + 0x5B5F, 0xC3CF, 0x5B60, 0x8C4B, 0x5B61, 0x8C4C, 0x5B62, 0xE6DF, + 0x5B63, 0xBCBE, 0x5B64, 0xB9C2, 0x5B65, 0xE6DB, 0x5B66, 0xD1A7, + 0x5B67, 0x8C4D, 0x5B68, 0x8C4E, 0x5B69, 0xBAA2, 0x5B6A, 0xC2CF, + 0x5B6B, 0x8C4F, 0x5B6C, 0xD8AB, 0x5B6D, 0x8C50, 0x5B6E, 0x8C51, + 0x5B6F, 0x8C52, 0x5B70, 0xCAEB, 0x5B71, 0xE5EE, 0x5B72, 0x8C53, + 0x5B73, 0xE6DC, 0x5B74, 0x8C54, 0x5B75, 0xB7F5, 0x5B76, 0x8C55, + 0x5B77, 0x8C56, 0x5B78, 0x8C57, 0x5B79, 0x8C58, 0x5B7A, 0xC8E6, + 0x5B7B, 0x8C59, 0x5B7C, 0x8C5A, 0x5B7D, 0xC4F5, 0x5B7E, 0x8C5B, + 0x5B7F, 0x8C5C, 0x5B80, 0xE5B2, 0x5B81, 0xC4FE, 0x5B82, 0x8C5D, + 0x5B83, 0xCBFC, 0x5B84, 0xE5B3, 0x5B85, 0xD5AC, 0x5B86, 0x8C5E, + 0x5B87, 0xD3EE, 0x5B88, 0xCAD8, 0x5B89, 0xB0B2, 0x5B8A, 0x8C5F, + 0x5B8B, 0xCBCE, 0x5B8C, 0xCDEA, 0x5B8D, 0x8C60, 0x5B8E, 0x8C61, + 0x5B8F, 0xBAEA, 0x5B90, 0x8C62, 0x5B91, 0x8C63, 0x5B92, 0x8C64, + 0x5B93, 0xE5B5, 0x5B94, 0x8C65, 0x5B95, 0xE5B4, 0x5B96, 0x8C66, + 0x5B97, 0xD7DA, 0x5B98, 0xB9D9, 0x5B99, 0xD6E6, 0x5B9A, 0xB6A8, + 0x5B9B, 0xCDF0, 0x5B9C, 0xD2CB, 0x5B9D, 0xB1A6, 0x5B9E, 0xCAB5, + 0x5B9F, 0x8C67, 0x5BA0, 0xB3E8, 0x5BA1, 0xC9F3, 0x5BA2, 0xBFCD, + 0x5BA3, 0xD0FB, 0x5BA4, 0xCAD2, 0x5BA5, 0xE5B6, 0x5BA6, 0xBBC2, + 0x5BA7, 0x8C68, 0x5BA8, 0x8C69, 0x5BA9, 0x8C6A, 0x5BAA, 0xCFDC, + 0x5BAB, 0xB9AC, 0x5BAC, 0x8C6B, 0x5BAD, 0x8C6C, 0x5BAE, 0x8C6D, + 0x5BAF, 0x8C6E, 0x5BB0, 0xD4D7, 0x5BB1, 0x8C6F, 0x5BB2, 0x8C70, + 0x5BB3, 0xBAA6, 0x5BB4, 0xD1E7, 0x5BB5, 0xCFFC, 0x5BB6, 0xBCD2, + 0x5BB7, 0x8C71, 0x5BB8, 0xE5B7, 0x5BB9, 0xC8DD, 0x5BBA, 0x8C72, + 0x5BBB, 0x8C73, 0x5BBC, 0x8C74, 0x5BBD, 0xBFED, 0x5BBE, 0xB1F6, + 0x5BBF, 0xCBDE, 0x5BC0, 0x8C75, 0x5BC1, 0x8C76, 0x5BC2, 0xBCC5, + 0x5BC3, 0x8C77, 0x5BC4, 0xBCC4, 0x5BC5, 0xD2FA, 0x5BC6, 0xC3DC, + 0x5BC7, 0xBFDC, 0x5BC8, 0x8C78, 0x5BC9, 0x8C79, 0x5BCA, 0x8C7A, + 0x5BCB, 0x8C7B, 0x5BCC, 0xB8BB, 0x5BCD, 0x8C7C, 0x5BCE, 0x8C7D, + 0x5BCF, 0x8C7E, 0x5BD0, 0xC3C2, 0x5BD1, 0x8C80, 0x5BD2, 0xBAAE, + 0x5BD3, 0xD4A2, 0x5BD4, 0x8C81, 0x5BD5, 0x8C82, 0x5BD6, 0x8C83, + 0x5BD7, 0x8C84, 0x5BD8, 0x8C85, 0x5BD9, 0x8C86, 0x5BDA, 0x8C87, + 0x5BDB, 0x8C88, 0x5BDC, 0x8C89, 0x5BDD, 0xC7DE, 0x5BDE, 0xC4AF, + 0x5BDF, 0xB2EC, 0x5BE0, 0x8C8A, 0x5BE1, 0xB9D1, 0x5BE2, 0x8C8B, + 0x5BE3, 0x8C8C, 0x5BE4, 0xE5BB, 0x5BE5, 0xC1C8, 0x5BE6, 0x8C8D, + 0x5BE7, 0x8C8E, 0x5BE8, 0xD5AF, 0x5BE9, 0x8C8F, 0x5BEA, 0x8C90, + 0x5BEB, 0x8C91, 0x5BEC, 0x8C92, 0x5BED, 0x8C93, 0x5BEE, 0xE5BC, + 0x5BEF, 0x8C94, 0x5BF0, 0xE5BE, 0x5BF1, 0x8C95, 0x5BF2, 0x8C96, + 0x5BF3, 0x8C97, 0x5BF4, 0x8C98, 0x5BF5, 0x8C99, 0x5BF6, 0x8C9A, + 0x5BF7, 0x8C9B, 0x5BF8, 0xB4E7, 0x5BF9, 0xB6D4, 0x5BFA, 0xCBC2, + 0x5BFB, 0xD1B0, 0x5BFC, 0xB5BC, 0x5BFD, 0x8C9C, 0x5BFE, 0x8C9D, + 0x5BFF, 0xCAD9, 0x5C00, 0x8C9E, 0x5C01, 0xB7E2, 0x5C02, 0x8C9F, + 0x5C03, 0x8CA0, 0x5C04, 0xC9E4, 0x5C05, 0x8CA1, 0x5C06, 0xBDAB, + 0x5C07, 0x8CA2, 0x5C08, 0x8CA3, 0x5C09, 0xCEBE, 0x5C0A, 0xD7F0, + 0x5C0B, 0x8CA4, 0x5C0C, 0x8CA5, 0x5C0D, 0x8CA6, 0x5C0E, 0x8CA7, + 0x5C0F, 0xD0A1, 0x5C10, 0x8CA8, 0x5C11, 0xC9D9, 0x5C12, 0x8CA9, + 0x5C13, 0x8CAA, 0x5C14, 0xB6FB, 0x5C15, 0xE6D8, 0x5C16, 0xBCE2, + 0x5C17, 0x8CAB, 0x5C18, 0xB3BE, 0x5C19, 0x8CAC, 0x5C1A, 0xC9D0, + 0x5C1B, 0x8CAD, 0x5C1C, 0xE6D9, 0x5C1D, 0xB3A2, 0x5C1E, 0x8CAE, + 0x5C1F, 0x8CAF, 0x5C20, 0x8CB0, 0x5C21, 0x8CB1, 0x5C22, 0xDECC, + 0x5C23, 0x8CB2, 0x5C24, 0xD3C8, 0x5C25, 0xDECD, 0x5C26, 0x8CB3, + 0x5C27, 0xD2A2, 0x5C28, 0x8CB4, 0x5C29, 0x8CB5, 0x5C2A, 0x8CB6, + 0x5C2B, 0x8CB7, 0x5C2C, 0xDECE, 0x5C2D, 0x8CB8, 0x5C2E, 0x8CB9, + 0x5C2F, 0x8CBA, 0x5C30, 0x8CBB, 0x5C31, 0xBECD, 0x5C32, 0x8CBC, + 0x5C33, 0x8CBD, 0x5C34, 0xDECF, 0x5C35, 0x8CBE, 0x5C36, 0x8CBF, + 0x5C37, 0x8CC0, 0x5C38, 0xCAAC, 0x5C39, 0xD2FC, 0x5C3A, 0xB3DF, + 0x5C3B, 0xE5EA, 0x5C3C, 0xC4E1, 0x5C3D, 0xBEA1, 0x5C3E, 0xCEB2, + 0x5C3F, 0xC4F2, 0x5C40, 0xBED6, 0x5C41, 0xC6A8, 0x5C42, 0xB2E3, + 0x5C43, 0x8CC1, 0x5C44, 0x8CC2, 0x5C45, 0xBED3, 0x5C46, 0x8CC3, + 0x5C47, 0x8CC4, 0x5C48, 0xC7FC, 0x5C49, 0xCCEB, 0x5C4A, 0xBDEC, + 0x5C4B, 0xCEDD, 0x5C4C, 0x8CC5, 0x5C4D, 0x8CC6, 0x5C4E, 0xCABA, + 0x5C4F, 0xC6C1, 0x5C50, 0xE5EC, 0x5C51, 0xD0BC, 0x5C52, 0x8CC7, + 0x5C53, 0x8CC8, 0x5C54, 0x8CC9, 0x5C55, 0xD5B9, 0x5C56, 0x8CCA, + 0x5C57, 0x8CCB, 0x5C58, 0x8CCC, 0x5C59, 0xE5ED, 0x5C5A, 0x8CCD, + 0x5C5B, 0x8CCE, 0x5C5C, 0x8CCF, 0x5C5D, 0x8CD0, 0x5C5E, 0xCAF4, + 0x5C5F, 0x8CD1, 0x5C60, 0xCDC0, 0x5C61, 0xC2C5, 0x5C62, 0x8CD2, + 0x5C63, 0xE5EF, 0x5C64, 0x8CD3, 0x5C65, 0xC2C4, 0x5C66, 0xE5F0, + 0x5C67, 0x8CD4, 0x5C68, 0x8CD5, 0x5C69, 0x8CD6, 0x5C6A, 0x8CD7, + 0x5C6B, 0x8CD8, 0x5C6C, 0x8CD9, 0x5C6D, 0x8CDA, 0x5C6E, 0xE5F8, + 0x5C6F, 0xCDCD, 0x5C70, 0x8CDB, 0x5C71, 0xC9BD, 0x5C72, 0x8CDC, + 0x5C73, 0x8CDD, 0x5C74, 0x8CDE, 0x5C75, 0x8CDF, 0x5C76, 0x8CE0, + 0x5C77, 0x8CE1, 0x5C78, 0x8CE2, 0x5C79, 0xD2D9, 0x5C7A, 0xE1A8, + 0x5C7B, 0x8CE3, 0x5C7C, 0x8CE4, 0x5C7D, 0x8CE5, 0x5C7E, 0x8CE6, + 0x5C7F, 0xD3EC, 0x5C80, 0x8CE7, 0x5C81, 0xCBEA, 0x5C82, 0xC6F1, + 0x5C83, 0x8CE8, 0x5C84, 0x8CE9, 0x5C85, 0x8CEA, 0x5C86, 0x8CEB, + 0x5C87, 0x8CEC, 0x5C88, 0xE1AC, 0x5C89, 0x8CED, 0x5C8A, 0x8CEE, + 0x5C8B, 0x8CEF, 0x5C8C, 0xE1A7, 0x5C8D, 0xE1A9, 0x5C8E, 0x8CF0, + 0x5C8F, 0x8CF1, 0x5C90, 0xE1AA, 0x5C91, 0xE1AF, 0x5C92, 0x8CF2, + 0x5C93, 0x8CF3, 0x5C94, 0xB2ED, 0x5C95, 0x8CF4, 0x5C96, 0xE1AB, + 0x5C97, 0xB8DA, 0x5C98, 0xE1AD, 0x5C99, 0xE1AE, 0x5C9A, 0xE1B0, + 0x5C9B, 0xB5BA, 0x5C9C, 0xE1B1, 0x5C9D, 0x8CF5, 0x5C9E, 0x8CF6, + 0x5C9F, 0x8CF7, 0x5CA0, 0x8CF8, 0x5CA1, 0x8CF9, 0x5CA2, 0xE1B3, + 0x5CA3, 0xE1B8, 0x5CA4, 0x8CFA, 0x5CA5, 0x8CFB, 0x5CA6, 0x8CFC, + 0x5CA7, 0x8CFD, 0x5CA8, 0x8CFE, 0x5CA9, 0xD1D2, 0x5CAA, 0x8D40, + 0x5CAB, 0xE1B6, 0x5CAC, 0xE1B5, 0x5CAD, 0xC1EB, 0x5CAE, 0x8D41, + 0x5CAF, 0x8D42, 0x5CB0, 0x8D43, 0x5CB1, 0xE1B7, 0x5CB2, 0x8D44, + 0x5CB3, 0xD4C0, 0x5CB4, 0x8D45, 0x5CB5, 0xE1B2, 0x5CB6, 0x8D46, + 0x5CB7, 0xE1BA, 0x5CB8, 0xB0B6, 0x5CB9, 0x8D47, 0x5CBA, 0x8D48, + 0x5CBB, 0x8D49, 0x5CBC, 0x8D4A, 0x5CBD, 0xE1B4, 0x5CBE, 0x8D4B, + 0x5CBF, 0xBFF9, 0x5CC0, 0x8D4C, 0x5CC1, 0xE1B9, 0x5CC2, 0x8D4D, + 0x5CC3, 0x8D4E, 0x5CC4, 0xE1BB, 0x5CC5, 0x8D4F, 0x5CC6, 0x8D50, + 0x5CC7, 0x8D51, 0x5CC8, 0x8D52, 0x5CC9, 0x8D53, 0x5CCA, 0x8D54, + 0x5CCB, 0xE1BE, 0x5CCC, 0x8D55, 0x5CCD, 0x8D56, 0x5CCE, 0x8D57, + 0x5CCF, 0x8D58, 0x5CD0, 0x8D59, 0x5CD1, 0x8D5A, 0x5CD2, 0xE1BC, + 0x5CD3, 0x8D5B, 0x5CD4, 0x8D5C, 0x5CD5, 0x8D5D, 0x5CD6, 0x8D5E, + 0x5CD7, 0x8D5F, 0x5CD8, 0x8D60, 0x5CD9, 0xD6C5, 0x5CDA, 0x8D61, + 0x5CDB, 0x8D62, 0x5CDC, 0x8D63, 0x5CDD, 0x8D64, 0x5CDE, 0x8D65, + 0x5CDF, 0x8D66, 0x5CE0, 0x8D67, 0x5CE1, 0xCFBF, 0x5CE2, 0x8D68, + 0x5CE3, 0x8D69, 0x5CE4, 0xE1BD, 0x5CE5, 0xE1BF, 0x5CE6, 0xC2CD, + 0x5CE7, 0x8D6A, 0x5CE8, 0xB6EB, 0x5CE9, 0x8D6B, 0x5CEA, 0xD3F8, + 0x5CEB, 0x8D6C, 0x5CEC, 0x8D6D, 0x5CED, 0xC7CD, 0x5CEE, 0x8D6E, + 0x5CEF, 0x8D6F, 0x5CF0, 0xB7E5, 0x5CF1, 0x8D70, 0x5CF2, 0x8D71, + 0x5CF3, 0x8D72, 0x5CF4, 0x8D73, 0x5CF5, 0x8D74, 0x5CF6, 0x8D75, + 0x5CF7, 0x8D76, 0x5CF8, 0x8D77, 0x5CF9, 0x8D78, 0x5CFA, 0x8D79, + 0x5CFB, 0xBEFE, 0x5CFC, 0x8D7A, 0x5CFD, 0x8D7B, 0x5CFE, 0x8D7C, + 0x5CFF, 0x8D7D, 0x5D00, 0x8D7E, 0x5D01, 0x8D80, 0x5D02, 0xE1C0, + 0x5D03, 0xE1C1, 0x5D04, 0x8D81, 0x5D05, 0x8D82, 0x5D06, 0xE1C7, + 0x5D07, 0xB3E7, 0x5D08, 0x8D83, 0x5D09, 0x8D84, 0x5D0A, 0x8D85, + 0x5D0B, 0x8D86, 0x5D0C, 0x8D87, 0x5D0D, 0x8D88, 0x5D0E, 0xC6E9, + 0x5D0F, 0x8D89, 0x5D10, 0x8D8A, 0x5D11, 0x8D8B, 0x5D12, 0x8D8C, + 0x5D13, 0x8D8D, 0x5D14, 0xB4DE, 0x5D15, 0x8D8E, 0x5D16, 0xD1C2, + 0x5D17, 0x8D8F, 0x5D18, 0x8D90, 0x5D19, 0x8D91, 0x5D1A, 0x8D92, + 0x5D1B, 0xE1C8, 0x5D1C, 0x8D93, 0x5D1D, 0x8D94, 0x5D1E, 0xE1C6, + 0x5D1F, 0x8D95, 0x5D20, 0x8D96, 0x5D21, 0x8D97, 0x5D22, 0x8D98, + 0x5D23, 0x8D99, 0x5D24, 0xE1C5, 0x5D25, 0x8D9A, 0x5D26, 0xE1C3, + 0x5D27, 0xE1C2, 0x5D28, 0x8D9B, 0x5D29, 0xB1C0, 0x5D2A, 0x8D9C, + 0x5D2B, 0x8D9D, 0x5D2C, 0x8D9E, 0x5D2D, 0xD5B8, 0x5D2E, 0xE1C4, + 0x5D2F, 0x8D9F, 0x5D30, 0x8DA0, 0x5D31, 0x8DA1, 0x5D32, 0x8DA2, + 0x5D33, 0x8DA3, 0x5D34, 0xE1CB, 0x5D35, 0x8DA4, 0x5D36, 0x8DA5, + 0x5D37, 0x8DA6, 0x5D38, 0x8DA7, 0x5D39, 0x8DA8, 0x5D3A, 0x8DA9, + 0x5D3B, 0x8DAA, 0x5D3C, 0x8DAB, 0x5D3D, 0xE1CC, 0x5D3E, 0xE1CA, + 0x5D3F, 0x8DAC, 0x5D40, 0x8DAD, 0x5D41, 0x8DAE, 0x5D42, 0x8DAF, + 0x5D43, 0x8DB0, 0x5D44, 0x8DB1, 0x5D45, 0x8DB2, 0x5D46, 0x8DB3, + 0x5D47, 0xEFFA, 0x5D48, 0x8DB4, 0x5D49, 0x8DB5, 0x5D4A, 0xE1D3, + 0x5D4B, 0xE1D2, 0x5D4C, 0xC7B6, 0x5D4D, 0x8DB6, 0x5D4E, 0x8DB7, + 0x5D4F, 0x8DB8, 0x5D50, 0x8DB9, 0x5D51, 0x8DBA, 0x5D52, 0x8DBB, + 0x5D53, 0x8DBC, 0x5D54, 0x8DBD, 0x5D55, 0x8DBE, 0x5D56, 0x8DBF, + 0x5D57, 0x8DC0, 0x5D58, 0xE1C9, 0x5D59, 0x8DC1, 0x5D5A, 0x8DC2, + 0x5D5B, 0xE1CE, 0x5D5C, 0x8DC3, 0x5D5D, 0xE1D0, 0x5D5E, 0x8DC4, + 0x5D5F, 0x8DC5, 0x5D60, 0x8DC6, 0x5D61, 0x8DC7, 0x5D62, 0x8DC8, + 0x5D63, 0x8DC9, 0x5D64, 0x8DCA, 0x5D65, 0x8DCB, 0x5D66, 0x8DCC, + 0x5D67, 0x8DCD, 0x5D68, 0x8DCE, 0x5D69, 0xE1D4, 0x5D6A, 0x8DCF, + 0x5D6B, 0xE1D1, 0x5D6C, 0xE1CD, 0x5D6D, 0x8DD0, 0x5D6E, 0x8DD1, + 0x5D6F, 0xE1CF, 0x5D70, 0x8DD2, 0x5D71, 0x8DD3, 0x5D72, 0x8DD4, + 0x5D73, 0x8DD5, 0x5D74, 0xE1D5, 0x5D75, 0x8DD6, 0x5D76, 0x8DD7, + 0x5D77, 0x8DD8, 0x5D78, 0x8DD9, 0x5D79, 0x8DDA, 0x5D7A, 0x8DDB, + 0x5D7B, 0x8DDC, 0x5D7C, 0x8DDD, 0x5D7D, 0x8DDE, 0x5D7E, 0x8DDF, + 0x5D7F, 0x8DE0, 0x5D80, 0x8DE1, 0x5D81, 0x8DE2, 0x5D82, 0xE1D6, + 0x5D83, 0x8DE3, 0x5D84, 0x8DE4, 0x5D85, 0x8DE5, 0x5D86, 0x8DE6, + 0x5D87, 0x8DE7, 0x5D88, 0x8DE8, 0x5D89, 0x8DE9, 0x5D8A, 0x8DEA, + 0x5D8B, 0x8DEB, 0x5D8C, 0x8DEC, 0x5D8D, 0x8DED, 0x5D8E, 0x8DEE, + 0x5D8F, 0x8DEF, 0x5D90, 0x8DF0, 0x5D91, 0x8DF1, 0x5D92, 0x8DF2, + 0x5D93, 0x8DF3, 0x5D94, 0x8DF4, 0x5D95, 0x8DF5, 0x5D96, 0x8DF6, + 0x5D97, 0x8DF7, 0x5D98, 0x8DF8, 0x5D99, 0xE1D7, 0x5D9A, 0x8DF9, + 0x5D9B, 0x8DFA, 0x5D9C, 0x8DFB, 0x5D9D, 0xE1D8, 0x5D9E, 0x8DFC, + 0x5D9F, 0x8DFD, 0x5DA0, 0x8DFE, 0x5DA1, 0x8E40, 0x5DA2, 0x8E41, + 0x5DA3, 0x8E42, 0x5DA4, 0x8E43, 0x5DA5, 0x8E44, 0x5DA6, 0x8E45, + 0x5DA7, 0x8E46, 0x5DA8, 0x8E47, 0x5DA9, 0x8E48, 0x5DAA, 0x8E49, + 0x5DAB, 0x8E4A, 0x5DAC, 0x8E4B, 0x5DAD, 0x8E4C, 0x5DAE, 0x8E4D, + 0x5DAF, 0x8E4E, 0x5DB0, 0x8E4F, 0x5DB1, 0x8E50, 0x5DB2, 0x8E51, + 0x5DB3, 0x8E52, 0x5DB4, 0x8E53, 0x5DB5, 0x8E54, 0x5DB6, 0x8E55, + 0x5DB7, 0xE1DA, 0x5DB8, 0x8E56, 0x5DB9, 0x8E57, 0x5DBA, 0x8E58, + 0x5DBB, 0x8E59, 0x5DBC, 0x8E5A, 0x5DBD, 0x8E5B, 0x5DBE, 0x8E5C, + 0x5DBF, 0x8E5D, 0x5DC0, 0x8E5E, 0x5DC1, 0x8E5F, 0x5DC2, 0x8E60, + 0x5DC3, 0x8E61, 0x5DC4, 0x8E62, 0x5DC5, 0xE1DB, 0x5DC6, 0x8E63, + 0x5DC7, 0x8E64, 0x5DC8, 0x8E65, 0x5DC9, 0x8E66, 0x5DCA, 0x8E67, + 0x5DCB, 0x8E68, 0x5DCC, 0x8E69, 0x5DCD, 0xCEA1, 0x5DCE, 0x8E6A, + 0x5DCF, 0x8E6B, 0x5DD0, 0x8E6C, 0x5DD1, 0x8E6D, 0x5DD2, 0x8E6E, + 0x5DD3, 0x8E6F, 0x5DD4, 0x8E70, 0x5DD5, 0x8E71, 0x5DD6, 0x8E72, + 0x5DD7, 0x8E73, 0x5DD8, 0x8E74, 0x5DD9, 0x8E75, 0x5DDA, 0x8E76, + 0x5DDB, 0xE7DD, 0x5DDC, 0x8E77, 0x5DDD, 0xB4A8, 0x5DDE, 0xD6DD, + 0x5DDF, 0x8E78, 0x5DE0, 0x8E79, 0x5DE1, 0xD1B2, 0x5DE2, 0xB3B2, + 0x5DE3, 0x8E7A, 0x5DE4, 0x8E7B, 0x5DE5, 0xB9A4, 0x5DE6, 0xD7F3, + 0x5DE7, 0xC7C9, 0x5DE8, 0xBEDE, 0x5DE9, 0xB9AE, 0x5DEA, 0x8E7C, + 0x5DEB, 0xCED7, 0x5DEC, 0x8E7D, 0x5DED, 0x8E7E, 0x5DEE, 0xB2EE, + 0x5DEF, 0xDBCF, 0x5DF0, 0x8E80, 0x5DF1, 0xBCBA, 0x5DF2, 0xD2D1, + 0x5DF3, 0xCBC8, 0x5DF4, 0xB0CD, 0x5DF5, 0x8E81, 0x5DF6, 0x8E82, + 0x5DF7, 0xCFEF, 0x5DF8, 0x8E83, 0x5DF9, 0x8E84, 0x5DFA, 0x8E85, + 0x5DFB, 0x8E86, 0x5DFC, 0x8E87, 0x5DFD, 0xD9E3, 0x5DFE, 0xBDED, + 0x5DFF, 0x8E88, 0x5E00, 0x8E89, 0x5E01, 0xB1D2, 0x5E02, 0xCAD0, + 0x5E03, 0xB2BC, 0x5E04, 0x8E8A, 0x5E05, 0xCBA7, 0x5E06, 0xB7AB, + 0x5E07, 0x8E8B, 0x5E08, 0xCAA6, 0x5E09, 0x8E8C, 0x5E0A, 0x8E8D, + 0x5E0B, 0x8E8E, 0x5E0C, 0xCFA3, 0x5E0D, 0x8E8F, 0x5E0E, 0x8E90, + 0x5E0F, 0xE0F8, 0x5E10, 0xD5CA, 0x5E11, 0xE0FB, 0x5E12, 0x8E91, + 0x5E13, 0x8E92, 0x5E14, 0xE0FA, 0x5E15, 0xC5C1, 0x5E16, 0xCCFB, + 0x5E17, 0x8E93, 0x5E18, 0xC1B1, 0x5E19, 0xE0F9, 0x5E1A, 0xD6E3, + 0x5E1B, 0xB2AF, 0x5E1C, 0xD6C4, 0x5E1D, 0xB5DB, 0x5E1E, 0x8E94, + 0x5E1F, 0x8E95, 0x5E20, 0x8E96, 0x5E21, 0x8E97, 0x5E22, 0x8E98, + 0x5E23, 0x8E99, 0x5E24, 0x8E9A, 0x5E25, 0x8E9B, 0x5E26, 0xB4F8, + 0x5E27, 0xD6A1, 0x5E28, 0x8E9C, 0x5E29, 0x8E9D, 0x5E2A, 0x8E9E, + 0x5E2B, 0x8E9F, 0x5E2C, 0x8EA0, 0x5E2D, 0xCFAF, 0x5E2E, 0xB0EF, + 0x5E2F, 0x8EA1, 0x5E30, 0x8EA2, 0x5E31, 0xE0FC, 0x5E32, 0x8EA3, + 0x5E33, 0x8EA4, 0x5E34, 0x8EA5, 0x5E35, 0x8EA6, 0x5E36, 0x8EA7, + 0x5E37, 0xE1A1, 0x5E38, 0xB3A3, 0x5E39, 0x8EA8, 0x5E3A, 0x8EA9, + 0x5E3B, 0xE0FD, 0x5E3C, 0xE0FE, 0x5E3D, 0xC3B1, 0x5E3E, 0x8EAA, + 0x5E3F, 0x8EAB, 0x5E40, 0x8EAC, 0x5E41, 0x8EAD, 0x5E42, 0xC3DD, + 0x5E43, 0x8EAE, 0x5E44, 0xE1A2, 0x5E45, 0xB7F9, 0x5E46, 0x8EAF, + 0x5E47, 0x8EB0, 0x5E48, 0x8EB1, 0x5E49, 0x8EB2, 0x5E4A, 0x8EB3, + 0x5E4B, 0x8EB4, 0x5E4C, 0xBBCF, 0x5E4D, 0x8EB5, 0x5E4E, 0x8EB6, + 0x5E4F, 0x8EB7, 0x5E50, 0x8EB8, 0x5E51, 0x8EB9, 0x5E52, 0x8EBA, + 0x5E53, 0x8EBB, 0x5E54, 0xE1A3, 0x5E55, 0xC4BB, 0x5E56, 0x8EBC, + 0x5E57, 0x8EBD, 0x5E58, 0x8EBE, 0x5E59, 0x8EBF, 0x5E5A, 0x8EC0, + 0x5E5B, 0xE1A4, 0x5E5C, 0x8EC1, 0x5E5D, 0x8EC2, 0x5E5E, 0xE1A5, + 0x5E5F, 0x8EC3, 0x5E60, 0x8EC4, 0x5E61, 0xE1A6, 0x5E62, 0xB4B1, + 0x5E63, 0x8EC5, 0x5E64, 0x8EC6, 0x5E65, 0x8EC7, 0x5E66, 0x8EC8, + 0x5E67, 0x8EC9, 0x5E68, 0x8ECA, 0x5E69, 0x8ECB, 0x5E6A, 0x8ECC, + 0x5E6B, 0x8ECD, 0x5E6C, 0x8ECE, 0x5E6D, 0x8ECF, 0x5E6E, 0x8ED0, + 0x5E6F, 0x8ED1, 0x5E70, 0x8ED2, 0x5E71, 0x8ED3, 0x5E72, 0xB8C9, + 0x5E73, 0xC6BD, 0x5E74, 0xC4EA, 0x5E75, 0x8ED4, 0x5E76, 0xB2A2, + 0x5E77, 0x8ED5, 0x5E78, 0xD0D2, 0x5E79, 0x8ED6, 0x5E7A, 0xE7DB, + 0x5E7B, 0xBBC3, 0x5E7C, 0xD3D7, 0x5E7D, 0xD3C4, 0x5E7E, 0x8ED7, + 0x5E7F, 0xB9E3, 0x5E80, 0xE2CF, 0x5E81, 0x8ED8, 0x5E82, 0x8ED9, + 0x5E83, 0x8EDA, 0x5E84, 0xD7AF, 0x5E85, 0x8EDB, 0x5E86, 0xC7EC, + 0x5E87, 0xB1D3, 0x5E88, 0x8EDC, 0x5E89, 0x8EDD, 0x5E8A, 0xB4B2, + 0x5E8B, 0xE2D1, 0x5E8C, 0x8EDE, 0x5E8D, 0x8EDF, 0x5E8E, 0x8EE0, + 0x5E8F, 0xD0F2, 0x5E90, 0xC2AE, 0x5E91, 0xE2D0, 0x5E92, 0x8EE1, + 0x5E93, 0xBFE2, 0x5E94, 0xD3A6, 0x5E95, 0xB5D7, 0x5E96, 0xE2D2, + 0x5E97, 0xB5EA, 0x5E98, 0x8EE2, 0x5E99, 0xC3ED, 0x5E9A, 0xB8FD, + 0x5E9B, 0x8EE3, 0x5E9C, 0xB8AE, 0x5E9D, 0x8EE4, 0x5E9E, 0xC5D3, + 0x5E9F, 0xB7CF, 0x5EA0, 0xE2D4, 0x5EA1, 0x8EE5, 0x5EA2, 0x8EE6, + 0x5EA3, 0x8EE7, 0x5EA4, 0x8EE8, 0x5EA5, 0xE2D3, 0x5EA6, 0xB6C8, + 0x5EA7, 0xD7F9, 0x5EA8, 0x8EE9, 0x5EA9, 0x8EEA, 0x5EAA, 0x8EEB, + 0x5EAB, 0x8EEC, 0x5EAC, 0x8EED, 0x5EAD, 0xCDA5, 0x5EAE, 0x8EEE, + 0x5EAF, 0x8EEF, 0x5EB0, 0x8EF0, 0x5EB1, 0x8EF1, 0x5EB2, 0x8EF2, + 0x5EB3, 0xE2D8, 0x5EB4, 0x8EF3, 0x5EB5, 0xE2D6, 0x5EB6, 0xCAFC, + 0x5EB7, 0xBFB5, 0x5EB8, 0xD3B9, 0x5EB9, 0xE2D5, 0x5EBA, 0x8EF4, + 0x5EBB, 0x8EF5, 0x5EBC, 0x8EF6, 0x5EBD, 0x8EF7, 0x5EBE, 0xE2D7, + 0x5EBF, 0x8EF8, 0x5EC0, 0x8EF9, 0x5EC1, 0x8EFA, 0x5EC2, 0x8EFB, + 0x5EC3, 0x8EFC, 0x5EC4, 0x8EFD, 0x5EC5, 0x8EFE, 0x5EC6, 0x8F40, + 0x5EC7, 0x8F41, 0x5EC8, 0x8F42, 0x5EC9, 0xC1AE, 0x5ECA, 0xC0C8, + 0x5ECB, 0x8F43, 0x5ECC, 0x8F44, 0x5ECD, 0x8F45, 0x5ECE, 0x8F46, + 0x5ECF, 0x8F47, 0x5ED0, 0x8F48, 0x5ED1, 0xE2DB, 0x5ED2, 0xE2DA, + 0x5ED3, 0xC0AA, 0x5ED4, 0x8F49, 0x5ED5, 0x8F4A, 0x5ED6, 0xC1CE, + 0x5ED7, 0x8F4B, 0x5ED8, 0x8F4C, 0x5ED9, 0x8F4D, 0x5EDA, 0x8F4E, + 0x5EDB, 0xE2DC, 0x5EDC, 0x8F4F, 0x5EDD, 0x8F50, 0x5EDE, 0x8F51, + 0x5EDF, 0x8F52, 0x5EE0, 0x8F53, 0x5EE1, 0x8F54, 0x5EE2, 0x8F55, + 0x5EE3, 0x8F56, 0x5EE4, 0x8F57, 0x5EE5, 0x8F58, 0x5EE6, 0x8F59, + 0x5EE7, 0x8F5A, 0x5EE8, 0xE2DD, 0x5EE9, 0x8F5B, 0x5EEA, 0xE2DE, + 0x5EEB, 0x8F5C, 0x5EEC, 0x8F5D, 0x5EED, 0x8F5E, 0x5EEE, 0x8F5F, + 0x5EEF, 0x8F60, 0x5EF0, 0x8F61, 0x5EF1, 0x8F62, 0x5EF2, 0x8F63, + 0x5EF3, 0x8F64, 0x5EF4, 0xDBC8, 0x5EF5, 0x8F65, 0x5EF6, 0xD1D3, + 0x5EF7, 0xCDA2, 0x5EF8, 0x8F66, 0x5EF9, 0x8F67, 0x5EFA, 0xBDA8, + 0x5EFB, 0x8F68, 0x5EFC, 0x8F69, 0x5EFD, 0x8F6A, 0x5EFE, 0xDEC3, + 0x5EFF, 0xD8A5, 0x5F00, 0xBFAA, 0x5F01, 0xDBCD, 0x5F02, 0xD2EC, + 0x5F03, 0xC6FA, 0x5F04, 0xC5AA, 0x5F05, 0x8F6B, 0x5F06, 0x8F6C, + 0x5F07, 0x8F6D, 0x5F08, 0xDEC4, 0x5F09, 0x8F6E, 0x5F0A, 0xB1D7, + 0x5F0B, 0xDFAE, 0x5F0C, 0x8F6F, 0x5F0D, 0x8F70, 0x5F0E, 0x8F71, + 0x5F0F, 0xCABD, 0x5F10, 0x8F72, 0x5F11, 0xDFB1, 0x5F12, 0x8F73, + 0x5F13, 0xB9AD, 0x5F14, 0x8F74, 0x5F15, 0xD2FD, 0x5F16, 0x8F75, + 0x5F17, 0xB8A5, 0x5F18, 0xBAEB, 0x5F19, 0x8F76, 0x5F1A, 0x8F77, + 0x5F1B, 0xB3DA, 0x5F1C, 0x8F78, 0x5F1D, 0x8F79, 0x5F1E, 0x8F7A, + 0x5F1F, 0xB5DC, 0x5F20, 0xD5C5, 0x5F21, 0x8F7B, 0x5F22, 0x8F7C, + 0x5F23, 0x8F7D, 0x5F24, 0x8F7E, 0x5F25, 0xC3D6, 0x5F26, 0xCFD2, + 0x5F27, 0xBBA1, 0x5F28, 0x8F80, 0x5F29, 0xE5F3, 0x5F2A, 0xE5F2, + 0x5F2B, 0x8F81, 0x5F2C, 0x8F82, 0x5F2D, 0xE5F4, 0x5F2E, 0x8F83, + 0x5F2F, 0xCDE4, 0x5F30, 0x8F84, 0x5F31, 0xC8F5, 0x5F32, 0x8F85, + 0x5F33, 0x8F86, 0x5F34, 0x8F87, 0x5F35, 0x8F88, 0x5F36, 0x8F89, + 0x5F37, 0x8F8A, 0x5F38, 0x8F8B, 0x5F39, 0xB5AF, 0x5F3A, 0xC7BF, + 0x5F3B, 0x8F8C, 0x5F3C, 0xE5F6, 0x5F3D, 0x8F8D, 0x5F3E, 0x8F8E, + 0x5F3F, 0x8F8F, 0x5F40, 0xECB0, 0x5F41, 0x8F90, 0x5F42, 0x8F91, + 0x5F43, 0x8F92, 0x5F44, 0x8F93, 0x5F45, 0x8F94, 0x5F46, 0x8F95, + 0x5F47, 0x8F96, 0x5F48, 0x8F97, 0x5F49, 0x8F98, 0x5F4A, 0x8F99, + 0x5F4B, 0x8F9A, 0x5F4C, 0x8F9B, 0x5F4D, 0x8F9C, 0x5F4E, 0x8F9D, + 0x5F4F, 0x8F9E, 0x5F50, 0xE5E6, 0x5F51, 0x8F9F, 0x5F52, 0xB9E9, + 0x5F53, 0xB5B1, 0x5F54, 0x8FA0, 0x5F55, 0xC2BC, 0x5F56, 0xE5E8, + 0x5F57, 0xE5E7, 0x5F58, 0xE5E9, 0x5F59, 0x8FA1, 0x5F5A, 0x8FA2, + 0x5F5B, 0x8FA3, 0x5F5C, 0x8FA4, 0x5F5D, 0xD2CD, 0x5F5E, 0x8FA5, + 0x5F5F, 0x8FA6, 0x5F60, 0x8FA7, 0x5F61, 0xE1EA, 0x5F62, 0xD0CE, + 0x5F63, 0x8FA8, 0x5F64, 0xCDAE, 0x5F65, 0x8FA9, 0x5F66, 0xD1E5, + 0x5F67, 0x8FAA, 0x5F68, 0x8FAB, 0x5F69, 0xB2CA, 0x5F6A, 0xB1EB, + 0x5F6B, 0x8FAC, 0x5F6C, 0xB1F2, 0x5F6D, 0xC5ED, 0x5F6E, 0x8FAD, + 0x5F6F, 0x8FAE, 0x5F70, 0xD5C3, 0x5F71, 0xD3B0, 0x5F72, 0x8FAF, + 0x5F73, 0xE1DC, 0x5F74, 0x8FB0, 0x5F75, 0x8FB1, 0x5F76, 0x8FB2, + 0x5F77, 0xE1DD, 0x5F78, 0x8FB3, 0x5F79, 0xD2DB, 0x5F7A, 0x8FB4, + 0x5F7B, 0xB3B9, 0x5F7C, 0xB1CB, 0x5F7D, 0x8FB5, 0x5F7E, 0x8FB6, + 0x5F7F, 0x8FB7, 0x5F80, 0xCDF9, 0x5F81, 0xD5F7, 0x5F82, 0xE1DE, + 0x5F83, 0x8FB8, 0x5F84, 0xBEB6, 0x5F85, 0xB4FD, 0x5F86, 0x8FB9, + 0x5F87, 0xE1DF, 0x5F88, 0xBADC, 0x5F89, 0xE1E0, 0x5F8A, 0xBBB2, + 0x5F8B, 0xC2C9, 0x5F8C, 0xE1E1, 0x5F8D, 0x8FBA, 0x5F8E, 0x8FBB, + 0x5F8F, 0x8FBC, 0x5F90, 0xD0EC, 0x5F91, 0x8FBD, 0x5F92, 0xCDBD, + 0x5F93, 0x8FBE, 0x5F94, 0x8FBF, 0x5F95, 0xE1E2, 0x5F96, 0x8FC0, + 0x5F97, 0xB5C3, 0x5F98, 0xC5C7, 0x5F99, 0xE1E3, 0x5F9A, 0x8FC1, + 0x5F9B, 0x8FC2, 0x5F9C, 0xE1E4, 0x5F9D, 0x8FC3, 0x5F9E, 0x8FC4, + 0x5F9F, 0x8FC5, 0x5FA0, 0x8FC6, 0x5FA1, 0xD3F9, 0x5FA2, 0x8FC7, + 0x5FA3, 0x8FC8, 0x5FA4, 0x8FC9, 0x5FA5, 0x8FCA, 0x5FA6, 0x8FCB, + 0x5FA7, 0x8FCC, 0x5FA8, 0xE1E5, 0x5FA9, 0x8FCD, 0x5FAA, 0xD1AD, + 0x5FAB, 0x8FCE, 0x5FAC, 0x8FCF, 0x5FAD, 0xE1E6, 0x5FAE, 0xCEA2, + 0x5FAF, 0x8FD0, 0x5FB0, 0x8FD1, 0x5FB1, 0x8FD2, 0x5FB2, 0x8FD3, + 0x5FB3, 0x8FD4, 0x5FB4, 0x8FD5, 0x5FB5, 0xE1E7, 0x5FB6, 0x8FD6, + 0x5FB7, 0xB5C2, 0x5FB8, 0x8FD7, 0x5FB9, 0x8FD8, 0x5FBA, 0x8FD9, + 0x5FBB, 0x8FDA, 0x5FBC, 0xE1E8, 0x5FBD, 0xBBD5, 0x5FBE, 0x8FDB, + 0x5FBF, 0x8FDC, 0x5FC0, 0x8FDD, 0x5FC1, 0x8FDE, 0x5FC2, 0x8FDF, + 0x5FC3, 0xD0C4, 0x5FC4, 0xE2E0, 0x5FC5, 0xB1D8, 0x5FC6, 0xD2E4, + 0x5FC7, 0x8FE0, 0x5FC8, 0x8FE1, 0x5FC9, 0xE2E1, 0x5FCA, 0x8FE2, + 0x5FCB, 0x8FE3, 0x5FCC, 0xBCC9, 0x5FCD, 0xC8CC, 0x5FCE, 0x8FE4, + 0x5FCF, 0xE2E3, 0x5FD0, 0xECFE, 0x5FD1, 0xECFD, 0x5FD2, 0xDFAF, + 0x5FD3, 0x8FE5, 0x5FD4, 0x8FE6, 0x5FD5, 0x8FE7, 0x5FD6, 0xE2E2, + 0x5FD7, 0xD6BE, 0x5FD8, 0xCDFC, 0x5FD9, 0xC3A6, 0x5FDA, 0x8FE8, + 0x5FDB, 0x8FE9, 0x5FDC, 0x8FEA, 0x5FDD, 0xE3C3, 0x5FDE, 0x8FEB, + 0x5FDF, 0x8FEC, 0x5FE0, 0xD6D2, 0x5FE1, 0xE2E7, 0x5FE2, 0x8FED, + 0x5FE3, 0x8FEE, 0x5FE4, 0xE2E8, 0x5FE5, 0x8FEF, 0x5FE6, 0x8FF0, + 0x5FE7, 0xD3C7, 0x5FE8, 0x8FF1, 0x5FE9, 0x8FF2, 0x5FEA, 0xE2EC, + 0x5FEB, 0xBFEC, 0x5FEC, 0x8FF3, 0x5FED, 0xE2ED, 0x5FEE, 0xE2E5, + 0x5FEF, 0x8FF4, 0x5FF0, 0x8FF5, 0x5FF1, 0xB3C0, 0x5FF2, 0x8FF6, + 0x5FF3, 0x8FF7, 0x5FF4, 0x8FF8, 0x5FF5, 0xC4EE, 0x5FF6, 0x8FF9, + 0x5FF7, 0x8FFA, 0x5FF8, 0xE2EE, 0x5FF9, 0x8FFB, 0x5FFA, 0x8FFC, + 0x5FFB, 0xD0C3, 0x5FFC, 0x8FFD, 0x5FFD, 0xBAF6, 0x5FFE, 0xE2E9, + 0x5FFF, 0xB7DE, 0x6000, 0xBBB3, 0x6001, 0xCCAC, 0x6002, 0xCBCB, + 0x6003, 0xE2E4, 0x6004, 0xE2E6, 0x6005, 0xE2EA, 0x6006, 0xE2EB, + 0x6007, 0x8FFE, 0x6008, 0x9040, 0x6009, 0x9041, 0x600A, 0xE2F7, + 0x600B, 0x9042, 0x600C, 0x9043, 0x600D, 0xE2F4, 0x600E, 0xD4F5, + 0x600F, 0xE2F3, 0x6010, 0x9044, 0x6011, 0x9045, 0x6012, 0xC5AD, + 0x6013, 0x9046, 0x6014, 0xD5FA, 0x6015, 0xC5C2, 0x6016, 0xB2C0, + 0x6017, 0x9047, 0x6018, 0x9048, 0x6019, 0xE2EF, 0x601A, 0x9049, + 0x601B, 0xE2F2, 0x601C, 0xC1AF, 0x601D, 0xCBBC, 0x601E, 0x904A, + 0x601F, 0x904B, 0x6020, 0xB5A1, 0x6021, 0xE2F9, 0x6022, 0x904C, + 0x6023, 0x904D, 0x6024, 0x904E, 0x6025, 0xBCB1, 0x6026, 0xE2F1, + 0x6027, 0xD0D4, 0x6028, 0xD4B9, 0x6029, 0xE2F5, 0x602A, 0xB9D6, + 0x602B, 0xE2F6, 0x602C, 0x904F, 0x602D, 0x9050, 0x602E, 0x9051, + 0x602F, 0xC7D3, 0x6030, 0x9052, 0x6031, 0x9053, 0x6032, 0x9054, + 0x6033, 0x9055, 0x6034, 0x9056, 0x6035, 0xE2F0, 0x6036, 0x9057, + 0x6037, 0x9058, 0x6038, 0x9059, 0x6039, 0x905A, 0x603A, 0x905B, + 0x603B, 0xD7DC, 0x603C, 0xEDA1, 0x603D, 0x905C, 0x603E, 0x905D, + 0x603F, 0xE2F8, 0x6040, 0x905E, 0x6041, 0xEDA5, 0x6042, 0xE2FE, + 0x6043, 0xCAD1, 0x6044, 0x905F, 0x6045, 0x9060, 0x6046, 0x9061, + 0x6047, 0x9062, 0x6048, 0x9063, 0x6049, 0x9064, 0x604A, 0x9065, + 0x604B, 0xC1B5, 0x604C, 0x9066, 0x604D, 0xBBD0, 0x604E, 0x9067, + 0x604F, 0x9068, 0x6050, 0xBFD6, 0x6051, 0x9069, 0x6052, 0xBAE3, + 0x6053, 0x906A, 0x6054, 0x906B, 0x6055, 0xCBA1, 0x6056, 0x906C, + 0x6057, 0x906D, 0x6058, 0x906E, 0x6059, 0xEDA6, 0x605A, 0xEDA3, + 0x605B, 0x906F, 0x605C, 0x9070, 0x605D, 0xEDA2, 0x605E, 0x9071, + 0x605F, 0x9072, 0x6060, 0x9073, 0x6061, 0x9074, 0x6062, 0xBBD6, + 0x6063, 0xEDA7, 0x6064, 0xD0F4, 0x6065, 0x9075, 0x6066, 0x9076, + 0x6067, 0xEDA4, 0x6068, 0xBADE, 0x6069, 0xB6F7, 0x606A, 0xE3A1, + 0x606B, 0xB6B2, 0x606C, 0xCCF1, 0x606D, 0xB9A7, 0x606E, 0x9077, + 0x606F, 0xCFA2, 0x6070, 0xC7A1, 0x6071, 0x9078, 0x6072, 0x9079, + 0x6073, 0xBFD2, 0x6074, 0x907A, 0x6075, 0x907B, 0x6076, 0xB6F1, + 0x6077, 0x907C, 0x6078, 0xE2FA, 0x6079, 0xE2FB, 0x607A, 0xE2FD, + 0x607B, 0xE2FC, 0x607C, 0xC4D5, 0x607D, 0xE3A2, 0x607E, 0x907D, + 0x607F, 0xD3C1, 0x6080, 0x907E, 0x6081, 0x9080, 0x6082, 0x9081, + 0x6083, 0xE3A7, 0x6084, 0xC7C4, 0x6085, 0x9082, 0x6086, 0x9083, + 0x6087, 0x9084, 0x6088, 0x9085, 0x6089, 0xCFA4, 0x608A, 0x9086, + 0x608B, 0x9087, 0x608C, 0xE3A9, 0x608D, 0xBAB7, 0x608E, 0x9088, + 0x608F, 0x9089, 0x6090, 0x908A, 0x6091, 0x908B, 0x6092, 0xE3A8, + 0x6093, 0x908C, 0x6094, 0xBBDA, 0x6095, 0x908D, 0x6096, 0xE3A3, + 0x6097, 0x908E, 0x6098, 0x908F, 0x6099, 0x9090, 0x609A, 0xE3A4, + 0x609B, 0xE3AA, 0x609C, 0x9091, 0x609D, 0xE3A6, 0x609E, 0x9092, + 0x609F, 0xCEF2, 0x60A0, 0xD3C6, 0x60A1, 0x9093, 0x60A2, 0x9094, + 0x60A3, 0xBBBC, 0x60A4, 0x9095, 0x60A5, 0x9096, 0x60A6, 0xD4C3, + 0x60A7, 0x9097, 0x60A8, 0xC4FA, 0x60A9, 0x9098, 0x60AA, 0x9099, + 0x60AB, 0xEDA8, 0x60AC, 0xD0FC, 0x60AD, 0xE3A5, 0x60AE, 0x909A, + 0x60AF, 0xC3F5, 0x60B0, 0x909B, 0x60B1, 0xE3AD, 0x60B2, 0xB1AF, + 0x60B3, 0x909C, 0x60B4, 0xE3B2, 0x60B5, 0x909D, 0x60B6, 0x909E, + 0x60B7, 0x909F, 0x60B8, 0xBCC2, 0x60B9, 0x90A0, 0x60BA, 0x90A1, + 0x60BB, 0xE3AC, 0x60BC, 0xB5BF, 0x60BD, 0x90A2, 0x60BE, 0x90A3, + 0x60BF, 0x90A4, 0x60C0, 0x90A5, 0x60C1, 0x90A6, 0x60C2, 0x90A7, + 0x60C3, 0x90A8, 0x60C4, 0x90A9, 0x60C5, 0xC7E9, 0x60C6, 0xE3B0, + 0x60C7, 0x90AA, 0x60C8, 0x90AB, 0x60C9, 0x90AC, 0x60CA, 0xBEAA, + 0x60CB, 0xCDEF, 0x60CC, 0x90AD, 0x60CD, 0x90AE, 0x60CE, 0x90AF, + 0x60CF, 0x90B0, 0x60D0, 0x90B1, 0x60D1, 0xBBF3, 0x60D2, 0x90B2, + 0x60D3, 0x90B3, 0x60D4, 0x90B4, 0x60D5, 0xCCE8, 0x60D6, 0x90B5, + 0x60D7, 0x90B6, 0x60D8, 0xE3AF, 0x60D9, 0x90B7, 0x60DA, 0xE3B1, + 0x60DB, 0x90B8, 0x60DC, 0xCFA7, 0x60DD, 0xE3AE, 0x60DE, 0x90B9, + 0x60DF, 0xCEA9, 0x60E0, 0xBBDD, 0x60E1, 0x90BA, 0x60E2, 0x90BB, + 0x60E3, 0x90BC, 0x60E4, 0x90BD, 0x60E5, 0x90BE, 0x60E6, 0xB5EB, + 0x60E7, 0xBEE5, 0x60E8, 0xB2D2, 0x60E9, 0xB3CD, 0x60EA, 0x90BF, + 0x60EB, 0xB1B9, 0x60EC, 0xE3AB, 0x60ED, 0xB2D1, 0x60EE, 0xB5AC, + 0x60EF, 0xB9DF, 0x60F0, 0xB6E8, 0x60F1, 0x90C0, 0x60F2, 0x90C1, + 0x60F3, 0xCFEB, 0x60F4, 0xE3B7, 0x60F5, 0x90C2, 0x60F6, 0xBBCC, + 0x60F7, 0x90C3, 0x60F8, 0x90C4, 0x60F9, 0xC8C7, 0x60FA, 0xD0CA, + 0x60FB, 0x90C5, 0x60FC, 0x90C6, 0x60FD, 0x90C7, 0x60FE, 0x90C8, + 0x60FF, 0x90C9, 0x6100, 0xE3B8, 0x6101, 0xB3EE, 0x6102, 0x90CA, + 0x6103, 0x90CB, 0x6104, 0x90CC, 0x6105, 0x90CD, 0x6106, 0xEDA9, + 0x6107, 0x90CE, 0x6108, 0xD3FA, 0x6109, 0xD3E4, 0x610A, 0x90CF, + 0x610B, 0x90D0, 0x610C, 0x90D1, 0x610D, 0xEDAA, 0x610E, 0xE3B9, + 0x610F, 0xD2E2, 0x6110, 0x90D2, 0x6111, 0x90D3, 0x6112, 0x90D4, + 0x6113, 0x90D5, 0x6114, 0x90D6, 0x6115, 0xE3B5, 0x6116, 0x90D7, + 0x6117, 0x90D8, 0x6118, 0x90D9, 0x6119, 0x90DA, 0x611A, 0xD3DE, + 0x611B, 0x90DB, 0x611C, 0x90DC, 0x611D, 0x90DD, 0x611E, 0x90DE, + 0x611F, 0xB8D0, 0x6120, 0xE3B3, 0x6121, 0x90DF, 0x6122, 0x90E0, + 0x6123, 0xE3B6, 0x6124, 0xB7DF, 0x6125, 0x90E1, 0x6126, 0xE3B4, + 0x6127, 0xC0A2, 0x6128, 0x90E2, 0x6129, 0x90E3, 0x612A, 0x90E4, + 0x612B, 0xE3BA, 0x612C, 0x90E5, 0x612D, 0x90E6, 0x612E, 0x90E7, + 0x612F, 0x90E8, 0x6130, 0x90E9, 0x6131, 0x90EA, 0x6132, 0x90EB, + 0x6133, 0x90EC, 0x6134, 0x90ED, 0x6135, 0x90EE, 0x6136, 0x90EF, + 0x6137, 0x90F0, 0x6138, 0x90F1, 0x6139, 0x90F2, 0x613A, 0x90F3, + 0x613B, 0x90F4, 0x613C, 0x90F5, 0x613D, 0x90F6, 0x613E, 0x90F7, + 0x613F, 0xD4B8, 0x6140, 0x90F8, 0x6141, 0x90F9, 0x6142, 0x90FA, + 0x6143, 0x90FB, 0x6144, 0x90FC, 0x6145, 0x90FD, 0x6146, 0x90FE, + 0x6147, 0x9140, 0x6148, 0xB4C8, 0x6149, 0x9141, 0x614A, 0xE3BB, + 0x614B, 0x9142, 0x614C, 0xBBC5, 0x614D, 0x9143, 0x614E, 0xC9F7, + 0x614F, 0x9144, 0x6150, 0x9145, 0x6151, 0xC9E5, 0x6152, 0x9146, + 0x6153, 0x9147, 0x6154, 0x9148, 0x6155, 0xC4BD, 0x6156, 0x9149, + 0x6157, 0x914A, 0x6158, 0x914B, 0x6159, 0x914C, 0x615A, 0x914D, + 0x615B, 0x914E, 0x615C, 0x914F, 0x615D, 0xEDAB, 0x615E, 0x9150, + 0x615F, 0x9151, 0x6160, 0x9152, 0x6161, 0x9153, 0x6162, 0xC2FD, + 0x6163, 0x9154, 0x6164, 0x9155, 0x6165, 0x9156, 0x6166, 0x9157, + 0x6167, 0xBBDB, 0x6168, 0xBFAE, 0x6169, 0x9158, 0x616A, 0x9159, + 0x616B, 0x915A, 0x616C, 0x915B, 0x616D, 0x915C, 0x616E, 0x915D, + 0x616F, 0x915E, 0x6170, 0xCEBF, 0x6171, 0x915F, 0x6172, 0x9160, + 0x6173, 0x9161, 0x6174, 0x9162, 0x6175, 0xE3BC, 0x6176, 0x9163, + 0x6177, 0xBFB6, 0x6178, 0x9164, 0x6179, 0x9165, 0x617A, 0x9166, + 0x617B, 0x9167, 0x617C, 0x9168, 0x617D, 0x9169, 0x617E, 0x916A, + 0x617F, 0x916B, 0x6180, 0x916C, 0x6181, 0x916D, 0x6182, 0x916E, + 0x6183, 0x916F, 0x6184, 0x9170, 0x6185, 0x9171, 0x6186, 0x9172, + 0x6187, 0x9173, 0x6188, 0x9174, 0x6189, 0x9175, 0x618A, 0x9176, + 0x618B, 0xB1EF, 0x618C, 0x9177, 0x618D, 0x9178, 0x618E, 0xD4F7, + 0x618F, 0x9179, 0x6190, 0x917A, 0x6191, 0x917B, 0x6192, 0x917C, + 0x6193, 0x917D, 0x6194, 0xE3BE, 0x6195, 0x917E, 0x6196, 0x9180, + 0x6197, 0x9181, 0x6198, 0x9182, 0x6199, 0x9183, 0x619A, 0x9184, + 0x619B, 0x9185, 0x619C, 0x9186, 0x619D, 0xEDAD, 0x619E, 0x9187, + 0x619F, 0x9188, 0x61A0, 0x9189, 0x61A1, 0x918A, 0x61A2, 0x918B, + 0x61A3, 0x918C, 0x61A4, 0x918D, 0x61A5, 0x918E, 0x61A6, 0x918F, + 0x61A7, 0xE3BF, 0x61A8, 0xBAA9, 0x61A9, 0xEDAC, 0x61AA, 0x9190, + 0x61AB, 0x9191, 0x61AC, 0xE3BD, 0x61AD, 0x9192, 0x61AE, 0x9193, + 0x61AF, 0x9194, 0x61B0, 0x9195, 0x61B1, 0x9196, 0x61B2, 0x9197, + 0x61B3, 0x9198, 0x61B4, 0x9199, 0x61B5, 0x919A, 0x61B6, 0x919B, + 0x61B7, 0xE3C0, 0x61B8, 0x919C, 0x61B9, 0x919D, 0x61BA, 0x919E, + 0x61BB, 0x919F, 0x61BC, 0x91A0, 0x61BD, 0x91A1, 0x61BE, 0xBAB6, + 0x61BF, 0x91A2, 0x61C0, 0x91A3, 0x61C1, 0x91A4, 0x61C2, 0xB6AE, + 0x61C3, 0x91A5, 0x61C4, 0x91A6, 0x61C5, 0x91A7, 0x61C6, 0x91A8, + 0x61C7, 0x91A9, 0x61C8, 0xD0B8, 0x61C9, 0x91AA, 0x61CA, 0xB0C3, + 0x61CB, 0xEDAE, 0x61CC, 0x91AB, 0x61CD, 0x91AC, 0x61CE, 0x91AD, + 0x61CF, 0x91AE, 0x61D0, 0x91AF, 0x61D1, 0xEDAF, 0x61D2, 0xC0C1, + 0x61D3, 0x91B0, 0x61D4, 0xE3C1, 0x61D5, 0x91B1, 0x61D6, 0x91B2, + 0x61D7, 0x91B3, 0x61D8, 0x91B4, 0x61D9, 0x91B5, 0x61DA, 0x91B6, + 0x61DB, 0x91B7, 0x61DC, 0x91B8, 0x61DD, 0x91B9, 0x61DE, 0x91BA, + 0x61DF, 0x91BB, 0x61E0, 0x91BC, 0x61E1, 0x91BD, 0x61E2, 0x91BE, + 0x61E3, 0x91BF, 0x61E4, 0x91C0, 0x61E5, 0x91C1, 0x61E6, 0xC5B3, + 0x61E7, 0x91C2, 0x61E8, 0x91C3, 0x61E9, 0x91C4, 0x61EA, 0x91C5, + 0x61EB, 0x91C6, 0x61EC, 0x91C7, 0x61ED, 0x91C8, 0x61EE, 0x91C9, + 0x61EF, 0x91CA, 0x61F0, 0x91CB, 0x61F1, 0x91CC, 0x61F2, 0x91CD, + 0x61F3, 0x91CE, 0x61F4, 0x91CF, 0x61F5, 0xE3C2, 0x61F6, 0x91D0, + 0x61F7, 0x91D1, 0x61F8, 0x91D2, 0x61F9, 0x91D3, 0x61FA, 0x91D4, + 0x61FB, 0x91D5, 0x61FC, 0x91D6, 0x61FD, 0x91D7, 0x61FE, 0x91D8, + 0x61FF, 0xDCB2, 0x6200, 0x91D9, 0x6201, 0x91DA, 0x6202, 0x91DB, + 0x6203, 0x91DC, 0x6204, 0x91DD, 0x6205, 0x91DE, 0x6206, 0xEDB0, + 0x6207, 0x91DF, 0x6208, 0xB8EA, 0x6209, 0x91E0, 0x620A, 0xCEEC, + 0x620B, 0xEAA7, 0x620C, 0xD0E7, 0x620D, 0xCAF9, 0x620E, 0xC8D6, + 0x620F, 0xCFB7, 0x6210, 0xB3C9, 0x6211, 0xCED2, 0x6212, 0xBDE4, + 0x6213, 0x91E1, 0x6214, 0x91E2, 0x6215, 0xE3DE, 0x6216, 0xBBF2, + 0x6217, 0xEAA8, 0x6218, 0xD5BD, 0x6219, 0x91E3, 0x621A, 0xC6DD, + 0x621B, 0xEAA9, 0x621C, 0x91E4, 0x621D, 0x91E5, 0x621E, 0x91E6, + 0x621F, 0xEAAA, 0x6220, 0x91E7, 0x6221, 0xEAAC, 0x6222, 0xEAAB, + 0x6223, 0x91E8, 0x6224, 0xEAAE, 0x6225, 0xEAAD, 0x6226, 0x91E9, + 0x6227, 0x91EA, 0x6228, 0x91EB, 0x6229, 0x91EC, 0x622A, 0xBDD8, + 0x622B, 0x91ED, 0x622C, 0xEAAF, 0x622D, 0x91EE, 0x622E, 0xC2BE, + 0x622F, 0x91EF, 0x6230, 0x91F0, 0x6231, 0x91F1, 0x6232, 0x91F2, + 0x6233, 0xB4C1, 0x6234, 0xB4F7, 0x6235, 0x91F3, 0x6236, 0x91F4, + 0x6237, 0xBBA7, 0x6238, 0x91F5, 0x6239, 0x91F6, 0x623A, 0x91F7, + 0x623B, 0x91F8, 0x623C, 0x91F9, 0x623D, 0xECE6, 0x623E, 0xECE5, + 0x623F, 0xB7BF, 0x6240, 0xCBF9, 0x6241, 0xB1E2, 0x6242, 0x91FA, + 0x6243, 0xECE7, 0x6244, 0x91FB, 0x6245, 0x91FC, 0x6246, 0x91FD, + 0x6247, 0xC9C8, 0x6248, 0xECE8, 0x6249, 0xECE9, 0x624A, 0x91FE, + 0x624B, 0xCAD6, 0x624C, 0xDED0, 0x624D, 0xB2C5, 0x624E, 0xD4FA, + 0x624F, 0x9240, 0x6250, 0x9241, 0x6251, 0xC6CB, 0x6252, 0xB0C7, + 0x6253, 0xB4F2, 0x6254, 0xC8D3, 0x6255, 0x9242, 0x6256, 0x9243, + 0x6257, 0x9244, 0x6258, 0xCDD0, 0x6259, 0x9245, 0x625A, 0x9246, + 0x625B, 0xBFB8, 0x625C, 0x9247, 0x625D, 0x9248, 0x625E, 0x9249, + 0x625F, 0x924A, 0x6260, 0x924B, 0x6261, 0x924C, 0x6262, 0x924D, + 0x6263, 0xBFDB, 0x6264, 0x924E, 0x6265, 0x924F, 0x6266, 0xC7A4, + 0x6267, 0xD6B4, 0x6268, 0x9250, 0x6269, 0xC0A9, 0x626A, 0xDED1, + 0x626B, 0xC9A8, 0x626C, 0xD1EF, 0x626D, 0xC5A4, 0x626E, 0xB0E7, + 0x626F, 0xB3B6, 0x6270, 0xC8C5, 0x6271, 0x9251, 0x6272, 0x9252, + 0x6273, 0xB0E2, 0x6274, 0x9253, 0x6275, 0x9254, 0x6276, 0xB7F6, + 0x6277, 0x9255, 0x6278, 0x9256, 0x6279, 0xC5FA, 0x627A, 0x9257, + 0x627B, 0x9258, 0x627C, 0xB6F3, 0x627D, 0x9259, 0x627E, 0xD5D2, + 0x627F, 0xB3D0, 0x6280, 0xBCBC, 0x6281, 0x925A, 0x6282, 0x925B, + 0x6283, 0x925C, 0x6284, 0xB3AD, 0x6285, 0x925D, 0x6286, 0x925E, + 0x6287, 0x925F, 0x6288, 0x9260, 0x6289, 0xBEF1, 0x628A, 0xB0D1, + 0x628B, 0x9261, 0x628C, 0x9262, 0x628D, 0x9263, 0x628E, 0x9264, + 0x628F, 0x9265, 0x6290, 0x9266, 0x6291, 0xD2D6, 0x6292, 0xCAE3, + 0x6293, 0xD7A5, 0x6294, 0x9267, 0x6295, 0xCDB6, 0x6296, 0xB6B6, + 0x6297, 0xBFB9, 0x6298, 0xD5DB, 0x6299, 0x9268, 0x629A, 0xB8A7, + 0x629B, 0xC5D7, 0x629C, 0x9269, 0x629D, 0x926A, 0x629E, 0x926B, + 0x629F, 0xDED2, 0x62A0, 0xBFD9, 0x62A1, 0xC2D5, 0x62A2, 0xC7C0, + 0x62A3, 0x926C, 0x62A4, 0xBBA4, 0x62A5, 0xB1A8, 0x62A6, 0x926D, + 0x62A7, 0x926E, 0x62A8, 0xC5EA, 0x62A9, 0x926F, 0x62AA, 0x9270, + 0x62AB, 0xC5FB, 0x62AC, 0xCCA7, 0x62AD, 0x9271, 0x62AE, 0x9272, + 0x62AF, 0x9273, 0x62B0, 0x9274, 0x62B1, 0xB1A7, 0x62B2, 0x9275, + 0x62B3, 0x9276, 0x62B4, 0x9277, 0x62B5, 0xB5D6, 0x62B6, 0x9278, + 0x62B7, 0x9279, 0x62B8, 0x927A, 0x62B9, 0xC4A8, 0x62BA, 0x927B, + 0x62BB, 0xDED3, 0x62BC, 0xD1BA, 0x62BD, 0xB3E9, 0x62BE, 0x927C, + 0x62BF, 0xC3F2, 0x62C0, 0x927D, 0x62C1, 0x927E, 0x62C2, 0xB7F7, + 0x62C3, 0x9280, 0x62C4, 0xD6F4, 0x62C5, 0xB5A3, 0x62C6, 0xB2F0, + 0x62C7, 0xC4B4, 0x62C8, 0xC4E9, 0x62C9, 0xC0AD, 0x62CA, 0xDED4, + 0x62CB, 0x9281, 0x62CC, 0xB0E8, 0x62CD, 0xC5C4, 0x62CE, 0xC1E0, + 0x62CF, 0x9282, 0x62D0, 0xB9D5, 0x62D1, 0x9283, 0x62D2, 0xBEDC, + 0x62D3, 0xCDD8, 0x62D4, 0xB0CE, 0x62D5, 0x9284, 0x62D6, 0xCDCF, + 0x62D7, 0xDED6, 0x62D8, 0xBED0, 0x62D9, 0xD7BE, 0x62DA, 0xDED5, + 0x62DB, 0xD5D0, 0x62DC, 0xB0DD, 0x62DD, 0x9285, 0x62DE, 0x9286, + 0x62DF, 0xC4E2, 0x62E0, 0x9287, 0x62E1, 0x9288, 0x62E2, 0xC2A3, + 0x62E3, 0xBCF0, 0x62E4, 0x9289, 0x62E5, 0xD3B5, 0x62E6, 0xC0B9, + 0x62E7, 0xC5A1, 0x62E8, 0xB2A6, 0x62E9, 0xD4F1, 0x62EA, 0x928A, + 0x62EB, 0x928B, 0x62EC, 0xC0A8, 0x62ED, 0xCAC3, 0x62EE, 0xDED7, + 0x62EF, 0xD5FC, 0x62F0, 0x928C, 0x62F1, 0xB9B0, 0x62F2, 0x928D, + 0x62F3, 0xC8AD, 0x62F4, 0xCBA9, 0x62F5, 0x928E, 0x62F6, 0xDED9, + 0x62F7, 0xBFBD, 0x62F8, 0x928F, 0x62F9, 0x9290, 0x62FA, 0x9291, + 0x62FB, 0x9292, 0x62FC, 0xC6B4, 0x62FD, 0xD7A7, 0x62FE, 0xCAB0, + 0x62FF, 0xC4C3, 0x6300, 0x9293, 0x6301, 0xB3D6, 0x6302, 0xB9D2, + 0x6303, 0x9294, 0x6304, 0x9295, 0x6305, 0x9296, 0x6306, 0x9297, + 0x6307, 0xD6B8, 0x6308, 0xEAFC, 0x6309, 0xB0B4, 0x630A, 0x9298, + 0x630B, 0x9299, 0x630C, 0x929A, 0x630D, 0x929B, 0x630E, 0xBFE6, + 0x630F, 0x929C, 0x6310, 0x929D, 0x6311, 0xCCF4, 0x6312, 0x929E, + 0x6313, 0x929F, 0x6314, 0x92A0, 0x6315, 0x92A1, 0x6316, 0xCDDA, + 0x6317, 0x92A2, 0x6318, 0x92A3, 0x6319, 0x92A4, 0x631A, 0xD6BF, + 0x631B, 0xC2CE, 0x631C, 0x92A5, 0x631D, 0xCECE, 0x631E, 0xCCA2, + 0x631F, 0xD0AE, 0x6320, 0xC4D3, 0x6321, 0xB5B2, 0x6322, 0xDED8, + 0x6323, 0xD5F5, 0x6324, 0xBCB7, 0x6325, 0xBBD3, 0x6326, 0x92A6, + 0x6327, 0x92A7, 0x6328, 0xB0A4, 0x6329, 0x92A8, 0x632A, 0xC5B2, + 0x632B, 0xB4EC, 0x632C, 0x92A9, 0x632D, 0x92AA, 0x632E, 0x92AB, + 0x632F, 0xD5F1, 0x6330, 0x92AC, 0x6331, 0x92AD, 0x6332, 0xEAFD, + 0x6333, 0x92AE, 0x6334, 0x92AF, 0x6335, 0x92B0, 0x6336, 0x92B1, + 0x6337, 0x92B2, 0x6338, 0x92B3, 0x6339, 0xDEDA, 0x633A, 0xCDA6, + 0x633B, 0x92B4, 0x633C, 0x92B5, 0x633D, 0xCDEC, 0x633E, 0x92B6, + 0x633F, 0x92B7, 0x6340, 0x92B8, 0x6341, 0x92B9, 0x6342, 0xCEE6, + 0x6343, 0xDEDC, 0x6344, 0x92BA, 0x6345, 0xCDB1, 0x6346, 0xC0A6, + 0x6347, 0x92BB, 0x6348, 0x92BC, 0x6349, 0xD7BD, 0x634A, 0x92BD, + 0x634B, 0xDEDB, 0x634C, 0xB0C6, 0x634D, 0xBAB4, 0x634E, 0xC9D3, + 0x634F, 0xC4F3, 0x6350, 0xBEE8, 0x6351, 0x92BE, 0x6352, 0x92BF, + 0x6353, 0x92C0, 0x6354, 0x92C1, 0x6355, 0xB2B6, 0x6356, 0x92C2, + 0x6357, 0x92C3, 0x6358, 0x92C4, 0x6359, 0x92C5, 0x635A, 0x92C6, + 0x635B, 0x92C7, 0x635C, 0x92C8, 0x635D, 0x92C9, 0x635E, 0xC0CC, + 0x635F, 0xCBF0, 0x6360, 0x92CA, 0x6361, 0xBCF1, 0x6362, 0xBBBB, + 0x6363, 0xB5B7, 0x6364, 0x92CB, 0x6365, 0x92CC, 0x6366, 0x92CD, + 0x6367, 0xC5F5, 0x6368, 0x92CE, 0x6369, 0xDEE6, 0x636A, 0x92CF, + 0x636B, 0x92D0, 0x636C, 0x92D1, 0x636D, 0xDEE3, 0x636E, 0xBEDD, + 0x636F, 0x92D2, 0x6370, 0x92D3, 0x6371, 0xDEDF, 0x6372, 0x92D4, + 0x6373, 0x92D5, 0x6374, 0x92D6, 0x6375, 0x92D7, 0x6376, 0xB4B7, + 0x6377, 0xBDDD, 0x6378, 0x92D8, 0x6379, 0x92D9, 0x637A, 0xDEE0, + 0x637B, 0xC4ED, 0x637C, 0x92DA, 0x637D, 0x92DB, 0x637E, 0x92DC, + 0x637F, 0x92DD, 0x6380, 0xCFC6, 0x6381, 0x92DE, 0x6382, 0xB5E0, + 0x6383, 0x92DF, 0x6384, 0x92E0, 0x6385, 0x92E1, 0x6386, 0x92E2, + 0x6387, 0xB6DE, 0x6388, 0xCADA, 0x6389, 0xB5F4, 0x638A, 0xDEE5, + 0x638B, 0x92E3, 0x638C, 0xD5C6, 0x638D, 0x92E4, 0x638E, 0xDEE1, + 0x638F, 0xCCCD, 0x6390, 0xC6FE, 0x6391, 0x92E5, 0x6392, 0xC5C5, + 0x6393, 0x92E6, 0x6394, 0x92E7, 0x6395, 0x92E8, 0x6396, 0xD2B4, + 0x6397, 0x92E9, 0x6398, 0xBEF2, 0x6399, 0x92EA, 0x639A, 0x92EB, + 0x639B, 0x92EC, 0x639C, 0x92ED, 0x639D, 0x92EE, 0x639E, 0x92EF, + 0x639F, 0x92F0, 0x63A0, 0xC2D3, 0x63A1, 0x92F1, 0x63A2, 0xCCBD, + 0x63A3, 0xB3B8, 0x63A4, 0x92F2, 0x63A5, 0xBDD3, 0x63A6, 0x92F3, + 0x63A7, 0xBFD8, 0x63A8, 0xCDC6, 0x63A9, 0xD1DA, 0x63AA, 0xB4EB, + 0x63AB, 0x92F4, 0x63AC, 0xDEE4, 0x63AD, 0xDEDD, 0x63AE, 0xDEE7, + 0x63AF, 0x92F5, 0x63B0, 0xEAFE, 0x63B1, 0x92F6, 0x63B2, 0x92F7, + 0x63B3, 0xC2B0, 0x63B4, 0xDEE2, 0x63B5, 0x92F8, 0x63B6, 0x92F9, + 0x63B7, 0xD6C0, 0x63B8, 0xB5A7, 0x63B9, 0x92FA, 0x63BA, 0xB2F4, + 0x63BB, 0x92FB, 0x63BC, 0xDEE8, 0x63BD, 0x92FC, 0x63BE, 0xDEF2, + 0x63BF, 0x92FD, 0x63C0, 0x92FE, 0x63C1, 0x9340, 0x63C2, 0x9341, + 0x63C3, 0x9342, 0x63C4, 0xDEED, 0x63C5, 0x9343, 0x63C6, 0xDEF1, + 0x63C7, 0x9344, 0x63C8, 0x9345, 0x63C9, 0xC8E0, 0x63CA, 0x9346, + 0x63CB, 0x9347, 0x63CC, 0x9348, 0x63CD, 0xD7E1, 0x63CE, 0xDEEF, + 0x63CF, 0xC3E8, 0x63D0, 0xCCE1, 0x63D1, 0x9349, 0x63D2, 0xB2E5, + 0x63D3, 0x934A, 0x63D4, 0x934B, 0x63D5, 0x934C, 0x63D6, 0xD2BE, + 0x63D7, 0x934D, 0x63D8, 0x934E, 0x63D9, 0x934F, 0x63DA, 0x9350, + 0x63DB, 0x9351, 0x63DC, 0x9352, 0x63DD, 0x9353, 0x63DE, 0xDEEE, + 0x63DF, 0x9354, 0x63E0, 0xDEEB, 0x63E1, 0xCED5, 0x63E2, 0x9355, + 0x63E3, 0xB4A7, 0x63E4, 0x9356, 0x63E5, 0x9357, 0x63E6, 0x9358, + 0x63E7, 0x9359, 0x63E8, 0x935A, 0x63E9, 0xBFAB, 0x63EA, 0xBEBE, + 0x63EB, 0x935B, 0x63EC, 0x935C, 0x63ED, 0xBDD2, 0x63EE, 0x935D, + 0x63EF, 0x935E, 0x63F0, 0x935F, 0x63F1, 0x9360, 0x63F2, 0xDEE9, + 0x63F3, 0x9361, 0x63F4, 0xD4AE, 0x63F5, 0x9362, 0x63F6, 0xDEDE, + 0x63F7, 0x9363, 0x63F8, 0xDEEA, 0x63F9, 0x9364, 0x63FA, 0x9365, + 0x63FB, 0x9366, 0x63FC, 0x9367, 0x63FD, 0xC0BF, 0x63FE, 0x9368, + 0x63FF, 0xDEEC, 0x6400, 0xB2F3, 0x6401, 0xB8E9, 0x6402, 0xC2A7, + 0x6403, 0x9369, 0x6404, 0x936A, 0x6405, 0xBDC1, 0x6406, 0x936B, + 0x6407, 0x936C, 0x6408, 0x936D, 0x6409, 0x936E, 0x640A, 0x936F, + 0x640B, 0xDEF5, 0x640C, 0xDEF8, 0x640D, 0x9370, 0x640E, 0x9371, + 0x640F, 0xB2AB, 0x6410, 0xB4A4, 0x6411, 0x9372, 0x6412, 0x9373, + 0x6413, 0xB4EA, 0x6414, 0xC9A6, 0x6415, 0x9374, 0x6416, 0x9375, + 0x6417, 0x9376, 0x6418, 0x9377, 0x6419, 0x9378, 0x641A, 0x9379, + 0x641B, 0xDEF6, 0x641C, 0xCBD1, 0x641D, 0x937A, 0x641E, 0xB8E3, + 0x641F, 0x937B, 0x6420, 0xDEF7, 0x6421, 0xDEFA, 0x6422, 0x937C, + 0x6423, 0x937D, 0x6424, 0x937E, 0x6425, 0x9380, 0x6426, 0xDEF9, + 0x6427, 0x9381, 0x6428, 0x9382, 0x6429, 0x9383, 0x642A, 0xCCC2, + 0x642B, 0x9384, 0x642C, 0xB0E1, 0x642D, 0xB4EE, 0x642E, 0x9385, + 0x642F, 0x9386, 0x6430, 0x9387, 0x6431, 0x9388, 0x6432, 0x9389, + 0x6433, 0x938A, 0x6434, 0xE5BA, 0x6435, 0x938B, 0x6436, 0x938C, + 0x6437, 0x938D, 0x6438, 0x938E, 0x6439, 0x938F, 0x643A, 0xD0AF, + 0x643B, 0x9390, 0x643C, 0x9391, 0x643D, 0xB2EB, 0x643E, 0x9392, + 0x643F, 0xEBA1, 0x6440, 0x9393, 0x6441, 0xDEF4, 0x6442, 0x9394, + 0x6443, 0x9395, 0x6444, 0xC9E3, 0x6445, 0xDEF3, 0x6446, 0xB0DA, + 0x6447, 0xD2A1, 0x6448, 0xB1F7, 0x6449, 0x9396, 0x644A, 0xCCAF, + 0x644B, 0x9397, 0x644C, 0x9398, 0x644D, 0x9399, 0x644E, 0x939A, + 0x644F, 0x939B, 0x6450, 0x939C, 0x6451, 0x939D, 0x6452, 0xDEF0, + 0x6453, 0x939E, 0x6454, 0xCBA4, 0x6455, 0x939F, 0x6456, 0x93A0, + 0x6457, 0x93A1, 0x6458, 0xD5AA, 0x6459, 0x93A2, 0x645A, 0x93A3, + 0x645B, 0x93A4, 0x645C, 0x93A5, 0x645D, 0x93A6, 0x645E, 0xDEFB, + 0x645F, 0x93A7, 0x6460, 0x93A8, 0x6461, 0x93A9, 0x6462, 0x93AA, + 0x6463, 0x93AB, 0x6464, 0x93AC, 0x6465, 0x93AD, 0x6466, 0x93AE, + 0x6467, 0xB4DD, 0x6468, 0x93AF, 0x6469, 0xC4A6, 0x646A, 0x93B0, + 0x646B, 0x93B1, 0x646C, 0x93B2, 0x646D, 0xDEFD, 0x646E, 0x93B3, + 0x646F, 0x93B4, 0x6470, 0x93B5, 0x6471, 0x93B6, 0x6472, 0x93B7, + 0x6473, 0x93B8, 0x6474, 0x93B9, 0x6475, 0x93BA, 0x6476, 0x93BB, + 0x6477, 0x93BC, 0x6478, 0xC3FE, 0x6479, 0xC4A1, 0x647A, 0xDFA1, + 0x647B, 0x93BD, 0x647C, 0x93BE, 0x647D, 0x93BF, 0x647E, 0x93C0, + 0x647F, 0x93C1, 0x6480, 0x93C2, 0x6481, 0x93C3, 0x6482, 0xC1CC, + 0x6483, 0x93C4, 0x6484, 0xDEFC, 0x6485, 0xBEEF, 0x6486, 0x93C5, + 0x6487, 0xC6B2, 0x6488, 0x93C6, 0x6489, 0x93C7, 0x648A, 0x93C8, + 0x648B, 0x93C9, 0x648C, 0x93CA, 0x648D, 0x93CB, 0x648E, 0x93CC, + 0x648F, 0x93CD, 0x6490, 0x93CE, 0x6491, 0xB3C5, 0x6492, 0xC8F6, + 0x6493, 0x93CF, 0x6494, 0x93D0, 0x6495, 0xCBBA, 0x6496, 0xDEFE, + 0x6497, 0x93D1, 0x6498, 0x93D2, 0x6499, 0xDFA4, 0x649A, 0x93D3, + 0x649B, 0x93D4, 0x649C, 0x93D5, 0x649D, 0x93D6, 0x649E, 0xD7B2, + 0x649F, 0x93D7, 0x64A0, 0x93D8, 0x64A1, 0x93D9, 0x64A2, 0x93DA, + 0x64A3, 0x93DB, 0x64A4, 0xB3B7, 0x64A5, 0x93DC, 0x64A6, 0x93DD, + 0x64A7, 0x93DE, 0x64A8, 0x93DF, 0x64A9, 0xC1C3, 0x64AA, 0x93E0, + 0x64AB, 0x93E1, 0x64AC, 0xC7CB, 0x64AD, 0xB2A5, 0x64AE, 0xB4E9, + 0x64AF, 0x93E2, 0x64B0, 0xD7AB, 0x64B1, 0x93E3, 0x64B2, 0x93E4, + 0x64B3, 0x93E5, 0x64B4, 0x93E6, 0x64B5, 0xC4EC, 0x64B6, 0x93E7, + 0x64B7, 0xDFA2, 0x64B8, 0xDFA3, 0x64B9, 0x93E8, 0x64BA, 0xDFA5, + 0x64BB, 0x93E9, 0x64BC, 0xBAB3, 0x64BD, 0x93EA, 0x64BE, 0x93EB, + 0x64BF, 0x93EC, 0x64C0, 0xDFA6, 0x64C1, 0x93ED, 0x64C2, 0xC0DE, + 0x64C3, 0x93EE, 0x64C4, 0x93EF, 0x64C5, 0xC9C3, 0x64C6, 0x93F0, + 0x64C7, 0x93F1, 0x64C8, 0x93F2, 0x64C9, 0x93F3, 0x64CA, 0x93F4, + 0x64CB, 0x93F5, 0x64CC, 0x93F6, 0x64CD, 0xB2D9, 0x64CE, 0xC7E6, + 0x64CF, 0x93F7, 0x64D0, 0xDFA7, 0x64D1, 0x93F8, 0x64D2, 0xC7DC, + 0x64D3, 0x93F9, 0x64D4, 0x93FA, 0x64D5, 0x93FB, 0x64D6, 0x93FC, + 0x64D7, 0xDFA8, 0x64D8, 0xEBA2, 0x64D9, 0x93FD, 0x64DA, 0x93FE, + 0x64DB, 0x9440, 0x64DC, 0x9441, 0x64DD, 0x9442, 0x64DE, 0xCBD3, + 0x64DF, 0x9443, 0x64E0, 0x9444, 0x64E1, 0x9445, 0x64E2, 0xDFAA, + 0x64E3, 0x9446, 0x64E4, 0xDFA9, 0x64E5, 0x9447, 0x64E6, 0xB2C1, + 0x64E7, 0x9448, 0x64E8, 0x9449, 0x64E9, 0x944A, 0x64EA, 0x944B, + 0x64EB, 0x944C, 0x64EC, 0x944D, 0x64ED, 0x944E, 0x64EE, 0x944F, + 0x64EF, 0x9450, 0x64F0, 0x9451, 0x64F1, 0x9452, 0x64F2, 0x9453, + 0x64F3, 0x9454, 0x64F4, 0x9455, 0x64F5, 0x9456, 0x64F6, 0x9457, + 0x64F7, 0x9458, 0x64F8, 0x9459, 0x64F9, 0x945A, 0x64FA, 0x945B, + 0x64FB, 0x945C, 0x64FC, 0x945D, 0x64FD, 0x945E, 0x64FE, 0x945F, + 0x64FF, 0x9460, 0x6500, 0xC5CA, 0x6501, 0x9461, 0x6502, 0x9462, + 0x6503, 0x9463, 0x6504, 0x9464, 0x6505, 0x9465, 0x6506, 0x9466, + 0x6507, 0x9467, 0x6508, 0x9468, 0x6509, 0xDFAB, 0x650A, 0x9469, + 0x650B, 0x946A, 0x650C, 0x946B, 0x650D, 0x946C, 0x650E, 0x946D, + 0x650F, 0x946E, 0x6510, 0x946F, 0x6511, 0x9470, 0x6512, 0xD4DC, + 0x6513, 0x9471, 0x6514, 0x9472, 0x6515, 0x9473, 0x6516, 0x9474, + 0x6517, 0x9475, 0x6518, 0xC8C1, 0x6519, 0x9476, 0x651A, 0x9477, + 0x651B, 0x9478, 0x651C, 0x9479, 0x651D, 0x947A, 0x651E, 0x947B, + 0x651F, 0x947C, 0x6520, 0x947D, 0x6521, 0x947E, 0x6522, 0x9480, + 0x6523, 0x9481, 0x6524, 0x9482, 0x6525, 0xDFAC, 0x6526, 0x9483, + 0x6527, 0x9484, 0x6528, 0x9485, 0x6529, 0x9486, 0x652A, 0x9487, + 0x652B, 0xBEF0, 0x652C, 0x9488, 0x652D, 0x9489, 0x652E, 0xDFAD, + 0x652F, 0xD6A7, 0x6530, 0x948A, 0x6531, 0x948B, 0x6532, 0x948C, + 0x6533, 0x948D, 0x6534, 0xEAB7, 0x6535, 0xEBB6, 0x6536, 0xCAD5, + 0x6537, 0x948E, 0x6538, 0xD8FC, 0x6539, 0xB8C4, 0x653A, 0x948F, + 0x653B, 0xB9A5, 0x653C, 0x9490, 0x653D, 0x9491, 0x653E, 0xB7C5, + 0x653F, 0xD5FE, 0x6540, 0x9492, 0x6541, 0x9493, 0x6542, 0x9494, + 0x6543, 0x9495, 0x6544, 0x9496, 0x6545, 0xB9CA, 0x6546, 0x9497, + 0x6547, 0x9498, 0x6548, 0xD0A7, 0x6549, 0xF4CD, 0x654A, 0x9499, + 0x654B, 0x949A, 0x654C, 0xB5D0, 0x654D, 0x949B, 0x654E, 0x949C, + 0x654F, 0xC3F4, 0x6550, 0x949D, 0x6551, 0xBEC8, 0x6552, 0x949E, + 0x6553, 0x949F, 0x6554, 0x94A0, 0x6555, 0xEBB7, 0x6556, 0xB0BD, + 0x6557, 0x94A1, 0x6558, 0x94A2, 0x6559, 0xBDCC, 0x655A, 0x94A3, + 0x655B, 0xC1B2, 0x655C, 0x94A4, 0x655D, 0xB1D6, 0x655E, 0xB3A8, + 0x655F, 0x94A5, 0x6560, 0x94A6, 0x6561, 0x94A7, 0x6562, 0xB8D2, + 0x6563, 0xC9A2, 0x6564, 0x94A8, 0x6565, 0x94A9, 0x6566, 0xB6D8, + 0x6567, 0x94AA, 0x6568, 0x94AB, 0x6569, 0x94AC, 0x656A, 0x94AD, + 0x656B, 0xEBB8, 0x656C, 0xBEB4, 0x656D, 0x94AE, 0x656E, 0x94AF, + 0x656F, 0x94B0, 0x6570, 0xCAFD, 0x6571, 0x94B1, 0x6572, 0xC7C3, + 0x6573, 0x94B2, 0x6574, 0xD5FB, 0x6575, 0x94B3, 0x6576, 0x94B4, + 0x6577, 0xB7F3, 0x6578, 0x94B5, 0x6579, 0x94B6, 0x657A, 0x94B7, + 0x657B, 0x94B8, 0x657C, 0x94B9, 0x657D, 0x94BA, 0x657E, 0x94BB, + 0x657F, 0x94BC, 0x6580, 0x94BD, 0x6581, 0x94BE, 0x6582, 0x94BF, + 0x6583, 0x94C0, 0x6584, 0x94C1, 0x6585, 0x94C2, 0x6586, 0x94C3, + 0x6587, 0xCEC4, 0x6588, 0x94C4, 0x6589, 0x94C5, 0x658A, 0x94C6, + 0x658B, 0xD5AB, 0x658C, 0xB1F3, 0x658D, 0x94C7, 0x658E, 0x94C8, + 0x658F, 0x94C9, 0x6590, 0xECB3, 0x6591, 0xB0DF, 0x6592, 0x94CA, + 0x6593, 0xECB5, 0x6594, 0x94CB, 0x6595, 0x94CC, 0x6596, 0x94CD, + 0x6597, 0xB6B7, 0x6598, 0x94CE, 0x6599, 0xC1CF, 0x659A, 0x94CF, + 0x659B, 0xF5FA, 0x659C, 0xD0B1, 0x659D, 0x94D0, 0x659E, 0x94D1, + 0x659F, 0xD5E5, 0x65A0, 0x94D2, 0x65A1, 0xCED3, 0x65A2, 0x94D3, + 0x65A3, 0x94D4, 0x65A4, 0xBDEF, 0x65A5, 0xB3E2, 0x65A6, 0x94D5, + 0x65A7, 0xB8AB, 0x65A8, 0x94D6, 0x65A9, 0xD5B6, 0x65AA, 0x94D7, + 0x65AB, 0xEDBD, 0x65AC, 0x94D8, 0x65AD, 0xB6CF, 0x65AE, 0x94D9, + 0x65AF, 0xCBB9, 0x65B0, 0xD0C2, 0x65B1, 0x94DA, 0x65B2, 0x94DB, + 0x65B3, 0x94DC, 0x65B4, 0x94DD, 0x65B5, 0x94DE, 0x65B6, 0x94DF, + 0x65B7, 0x94E0, 0x65B8, 0x94E1, 0x65B9, 0xB7BD, 0x65BA, 0x94E2, + 0x65BB, 0x94E3, 0x65BC, 0xECB6, 0x65BD, 0xCAA9, 0x65BE, 0x94E4, + 0x65BF, 0x94E5, 0x65C0, 0x94E6, 0x65C1, 0xC5D4, 0x65C2, 0x94E7, + 0x65C3, 0xECB9, 0x65C4, 0xECB8, 0x65C5, 0xC2C3, 0x65C6, 0xECB7, + 0x65C7, 0x94E8, 0x65C8, 0x94E9, 0x65C9, 0x94EA, 0x65CA, 0x94EB, + 0x65CB, 0xD0FD, 0x65CC, 0xECBA, 0x65CD, 0x94EC, 0x65CE, 0xECBB, + 0x65CF, 0xD7E5, 0x65D0, 0x94ED, 0x65D1, 0x94EE, 0x65D2, 0xECBC, + 0x65D3, 0x94EF, 0x65D4, 0x94F0, 0x65D5, 0x94F1, 0x65D6, 0xECBD, + 0x65D7, 0xC6EC, 0x65D8, 0x94F2, 0x65D9, 0x94F3, 0x65DA, 0x94F4, + 0x65DB, 0x94F5, 0x65DC, 0x94F6, 0x65DD, 0x94F7, 0x65DE, 0x94F8, + 0x65DF, 0x94F9, 0x65E0, 0xCEDE, 0x65E1, 0x94FA, 0x65E2, 0xBCC8, + 0x65E3, 0x94FB, 0x65E4, 0x94FC, 0x65E5, 0xC8D5, 0x65E6, 0xB5A9, + 0x65E7, 0xBEC9, 0x65E8, 0xD6BC, 0x65E9, 0xD4E7, 0x65EA, 0x94FD, + 0x65EB, 0x94FE, 0x65EC, 0xD1AE, 0x65ED, 0xD0F1, 0x65EE, 0xEAB8, + 0x65EF, 0xEAB9, 0x65F0, 0xEABA, 0x65F1, 0xBAB5, 0x65F2, 0x9540, + 0x65F3, 0x9541, 0x65F4, 0x9542, 0x65F5, 0x9543, 0x65F6, 0xCAB1, + 0x65F7, 0xBFF5, 0x65F8, 0x9544, 0x65F9, 0x9545, 0x65FA, 0xCDFA, + 0x65FB, 0x9546, 0x65FC, 0x9547, 0x65FD, 0x9548, 0x65FE, 0x9549, + 0x65FF, 0x954A, 0x6600, 0xEAC0, 0x6601, 0x954B, 0x6602, 0xB0BA, + 0x6603, 0xEABE, 0x6604, 0x954C, 0x6605, 0x954D, 0x6606, 0xC0A5, + 0x6607, 0x954E, 0x6608, 0x954F, 0x6609, 0x9550, 0x660A, 0xEABB, + 0x660B, 0x9551, 0x660C, 0xB2FD, 0x660D, 0x9552, 0x660E, 0xC3F7, + 0x660F, 0xBBE8, 0x6610, 0x9553, 0x6611, 0x9554, 0x6612, 0x9555, + 0x6613, 0xD2D7, 0x6614, 0xCEF4, 0x6615, 0xEABF, 0x6616, 0x9556, + 0x6617, 0x9557, 0x6618, 0x9558, 0x6619, 0xEABC, 0x661A, 0x9559, + 0x661B, 0x955A, 0x661C, 0x955B, 0x661D, 0xEAC3, 0x661E, 0x955C, + 0x661F, 0xD0C7, 0x6620, 0xD3B3, 0x6621, 0x955D, 0x6622, 0x955E, + 0x6623, 0x955F, 0x6624, 0x9560, 0x6625, 0xB4BA, 0x6626, 0x9561, + 0x6627, 0xC3C1, 0x6628, 0xD7F2, 0x6629, 0x9562, 0x662A, 0x9563, + 0x662B, 0x9564, 0x662C, 0x9565, 0x662D, 0xD5D1, 0x662E, 0x9566, + 0x662F, 0xCAC7, 0x6630, 0x9567, 0x6631, 0xEAC5, 0x6632, 0x9568, + 0x6633, 0x9569, 0x6634, 0xEAC4, 0x6635, 0xEAC7, 0x6636, 0xEAC6, + 0x6637, 0x956A, 0x6638, 0x956B, 0x6639, 0x956C, 0x663A, 0x956D, + 0x663B, 0x956E, 0x663C, 0xD6E7, 0x663D, 0x956F, 0x663E, 0xCFD4, + 0x663F, 0x9570, 0x6640, 0x9571, 0x6641, 0xEACB, 0x6642, 0x9572, + 0x6643, 0xBBCE, 0x6644, 0x9573, 0x6645, 0x9574, 0x6646, 0x9575, + 0x6647, 0x9576, 0x6648, 0x9577, 0x6649, 0x9578, 0x664A, 0x9579, + 0x664B, 0xBDFA, 0x664C, 0xC9CE, 0x664D, 0x957A, 0x664E, 0x957B, + 0x664F, 0xEACC, 0x6650, 0x957C, 0x6651, 0x957D, 0x6652, 0xC9B9, + 0x6653, 0xCFFE, 0x6654, 0xEACA, 0x6655, 0xD4CE, 0x6656, 0xEACD, + 0x6657, 0xEACF, 0x6658, 0x957E, 0x6659, 0x9580, 0x665A, 0xCDED, + 0x665B, 0x9581, 0x665C, 0x9582, 0x665D, 0x9583, 0x665E, 0x9584, + 0x665F, 0xEAC9, 0x6660, 0x9585, 0x6661, 0xEACE, 0x6662, 0x9586, + 0x6663, 0x9587, 0x6664, 0xCEEE, 0x6665, 0x9588, 0x6666, 0xBBDE, + 0x6667, 0x9589, 0x6668, 0xB3BF, 0x6669, 0x958A, 0x666A, 0x958B, + 0x666B, 0x958C, 0x666C, 0x958D, 0x666D, 0x958E, 0x666E, 0xC6D5, + 0x666F, 0xBEB0, 0x6670, 0xCEFA, 0x6671, 0x958F, 0x6672, 0x9590, + 0x6673, 0x9591, 0x6674, 0xC7E7, 0x6675, 0x9592, 0x6676, 0xBEA7, + 0x6677, 0xEAD0, 0x6678, 0x9593, 0x6679, 0x9594, 0x667A, 0xD6C7, + 0x667B, 0x9595, 0x667C, 0x9596, 0x667D, 0x9597, 0x667E, 0xC1C0, + 0x667F, 0x9598, 0x6680, 0x9599, 0x6681, 0x959A, 0x6682, 0xD4DD, + 0x6683, 0x959B, 0x6684, 0xEAD1, 0x6685, 0x959C, 0x6686, 0x959D, + 0x6687, 0xCFBE, 0x6688, 0x959E, 0x6689, 0x959F, 0x668A, 0x95A0, + 0x668B, 0x95A1, 0x668C, 0xEAD2, 0x668D, 0x95A2, 0x668E, 0x95A3, + 0x668F, 0x95A4, 0x6690, 0x95A5, 0x6691, 0xCAEE, 0x6692, 0x95A6, + 0x6693, 0x95A7, 0x6694, 0x95A8, 0x6695, 0x95A9, 0x6696, 0xC5AF, + 0x6697, 0xB0B5, 0x6698, 0x95AA, 0x6699, 0x95AB, 0x669A, 0x95AC, + 0x669B, 0x95AD, 0x669C, 0x95AE, 0x669D, 0xEAD4, 0x669E, 0x95AF, + 0x669F, 0x95B0, 0x66A0, 0x95B1, 0x66A1, 0x95B2, 0x66A2, 0x95B3, + 0x66A3, 0x95B4, 0x66A4, 0x95B5, 0x66A5, 0x95B6, 0x66A6, 0x95B7, + 0x66A7, 0xEAD3, 0x66A8, 0xF4DF, 0x66A9, 0x95B8, 0x66AA, 0x95B9, + 0x66AB, 0x95BA, 0x66AC, 0x95BB, 0x66AD, 0x95BC, 0x66AE, 0xC4BA, + 0x66AF, 0x95BD, 0x66B0, 0x95BE, 0x66B1, 0x95BF, 0x66B2, 0x95C0, + 0x66B3, 0x95C1, 0x66B4, 0xB1A9, 0x66B5, 0x95C2, 0x66B6, 0x95C3, + 0x66B7, 0x95C4, 0x66B8, 0x95C5, 0x66B9, 0xE5DF, 0x66BA, 0x95C6, + 0x66BB, 0x95C7, 0x66BC, 0x95C8, 0x66BD, 0x95C9, 0x66BE, 0xEAD5, + 0x66BF, 0x95CA, 0x66C0, 0x95CB, 0x66C1, 0x95CC, 0x66C2, 0x95CD, + 0x66C3, 0x95CE, 0x66C4, 0x95CF, 0x66C5, 0x95D0, 0x66C6, 0x95D1, + 0x66C7, 0x95D2, 0x66C8, 0x95D3, 0x66C9, 0x95D4, 0x66CA, 0x95D5, + 0x66CB, 0x95D6, 0x66CC, 0x95D7, 0x66CD, 0x95D8, 0x66CE, 0x95D9, + 0x66CF, 0x95DA, 0x66D0, 0x95DB, 0x66D1, 0x95DC, 0x66D2, 0x95DD, + 0x66D3, 0x95DE, 0x66D4, 0x95DF, 0x66D5, 0x95E0, 0x66D6, 0x95E1, + 0x66D7, 0x95E2, 0x66D8, 0x95E3, 0x66D9, 0xCAEF, 0x66DA, 0x95E4, + 0x66DB, 0xEAD6, 0x66DC, 0xEAD7, 0x66DD, 0xC6D8, 0x66DE, 0x95E5, + 0x66DF, 0x95E6, 0x66E0, 0x95E7, 0x66E1, 0x95E8, 0x66E2, 0x95E9, + 0x66E3, 0x95EA, 0x66E4, 0x95EB, 0x66E5, 0x95EC, 0x66E6, 0xEAD8, + 0x66E7, 0x95ED, 0x66E8, 0x95EE, 0x66E9, 0xEAD9, 0x66EA, 0x95EF, + 0x66EB, 0x95F0, 0x66EC, 0x95F1, 0x66ED, 0x95F2, 0x66EE, 0x95F3, + 0x66EF, 0x95F4, 0x66F0, 0xD4BB, 0x66F1, 0x95F5, 0x66F2, 0xC7FA, + 0x66F3, 0xD2B7, 0x66F4, 0xB8FC, 0x66F5, 0x95F6, 0x66F6, 0x95F7, + 0x66F7, 0xEAC2, 0x66F8, 0x95F8, 0x66F9, 0xB2DC, 0x66FA, 0x95F9, + 0x66FB, 0x95FA, 0x66FC, 0xC2FC, 0x66FD, 0x95FB, 0x66FE, 0xD4F8, + 0x66FF, 0xCCE6, 0x6700, 0xD7EE, 0x6701, 0x95FC, 0x6702, 0x95FD, + 0x6703, 0x95FE, 0x6704, 0x9640, 0x6705, 0x9641, 0x6706, 0x9642, + 0x6707, 0x9643, 0x6708, 0xD4C2, 0x6709, 0xD3D0, 0x670A, 0xEBC3, + 0x670B, 0xC5F3, 0x670C, 0x9644, 0x670D, 0xB7FE, 0x670E, 0x9645, + 0x670F, 0x9646, 0x6710, 0xEBD4, 0x6711, 0x9647, 0x6712, 0x9648, + 0x6713, 0x9649, 0x6714, 0xCBB7, 0x6715, 0xEBDE, 0x6716, 0x964A, + 0x6717, 0xC0CA, 0x6718, 0x964B, 0x6719, 0x964C, 0x671A, 0x964D, + 0x671B, 0xCDFB, 0x671C, 0x964E, 0x671D, 0xB3AF, 0x671E, 0x964F, + 0x671F, 0xC6DA, 0x6720, 0x9650, 0x6721, 0x9651, 0x6722, 0x9652, + 0x6723, 0x9653, 0x6724, 0x9654, 0x6725, 0x9655, 0x6726, 0xEBFC, + 0x6727, 0x9656, 0x6728, 0xC4BE, 0x6729, 0x9657, 0x672A, 0xCEB4, + 0x672B, 0xC4A9, 0x672C, 0xB1BE, 0x672D, 0xD4FD, 0x672E, 0x9658, + 0x672F, 0xCAF5, 0x6730, 0x9659, 0x6731, 0xD6EC, 0x6732, 0x965A, + 0x6733, 0x965B, 0x6734, 0xC6D3, 0x6735, 0xB6E4, 0x6736, 0x965C, + 0x6737, 0x965D, 0x6738, 0x965E, 0x6739, 0x965F, 0x673A, 0xBBFA, + 0x673B, 0x9660, 0x673C, 0x9661, 0x673D, 0xD0E0, 0x673E, 0x9662, + 0x673F, 0x9663, 0x6740, 0xC9B1, 0x6741, 0x9664, 0x6742, 0xD4D3, + 0x6743, 0xC8A8, 0x6744, 0x9665, 0x6745, 0x9666, 0x6746, 0xB8CB, + 0x6747, 0x9667, 0x6748, 0xE8BE, 0x6749, 0xC9BC, 0x674A, 0x9668, + 0x674B, 0x9669, 0x674C, 0xE8BB, 0x674D, 0x966A, 0x674E, 0xC0EE, + 0x674F, 0xD0D3, 0x6750, 0xB2C4, 0x6751, 0xB4E5, 0x6752, 0x966B, + 0x6753, 0xE8BC, 0x6754, 0x966C, 0x6755, 0x966D, 0x6756, 0xD5C8, + 0x6757, 0x966E, 0x6758, 0x966F, 0x6759, 0x9670, 0x675A, 0x9671, + 0x675B, 0x9672, 0x675C, 0xB6C5, 0x675D, 0x9673, 0x675E, 0xE8BD, + 0x675F, 0xCAF8, 0x6760, 0xB8DC, 0x6761, 0xCCF5, 0x6762, 0x9674, + 0x6763, 0x9675, 0x6764, 0x9676, 0x6765, 0xC0B4, 0x6766, 0x9677, + 0x6767, 0x9678, 0x6768, 0xD1EE, 0x6769, 0xE8BF, 0x676A, 0xE8C2, + 0x676B, 0x9679, 0x676C, 0x967A, 0x676D, 0xBABC, 0x676E, 0x967B, + 0x676F, 0xB1AD, 0x6770, 0xBDDC, 0x6771, 0x967C, 0x6772, 0xEABD, + 0x6773, 0xE8C3, 0x6774, 0x967D, 0x6775, 0xE8C6, 0x6776, 0x967E, + 0x6777, 0xE8CB, 0x6778, 0x9680, 0x6779, 0x9681, 0x677A, 0x9682, + 0x677B, 0x9683, 0x677C, 0xE8CC, 0x677D, 0x9684, 0x677E, 0xCBC9, + 0x677F, 0xB0E5, 0x6780, 0x9685, 0x6781, 0xBCAB, 0x6782, 0x9686, + 0x6783, 0x9687, 0x6784, 0xB9B9, 0x6785, 0x9688, 0x6786, 0x9689, + 0x6787, 0xE8C1, 0x6788, 0x968A, 0x6789, 0xCDF7, 0x678A, 0x968B, + 0x678B, 0xE8CA, 0x678C, 0x968C, 0x678D, 0x968D, 0x678E, 0x968E, + 0x678F, 0x968F, 0x6790, 0xCEF6, 0x6791, 0x9690, 0x6792, 0x9691, + 0x6793, 0x9692, 0x6794, 0x9693, 0x6795, 0xD5ED, 0x6796, 0x9694, + 0x6797, 0xC1D6, 0x6798, 0xE8C4, 0x6799, 0x9695, 0x679A, 0xC3B6, + 0x679B, 0x9696, 0x679C, 0xB9FB, 0x679D, 0xD6A6, 0x679E, 0xE8C8, + 0x679F, 0x9697, 0x67A0, 0x9698, 0x67A1, 0x9699, 0x67A2, 0xCAE0, + 0x67A3, 0xD4E6, 0x67A4, 0x969A, 0x67A5, 0xE8C0, 0x67A6, 0x969B, + 0x67A7, 0xE8C5, 0x67A8, 0xE8C7, 0x67A9, 0x969C, 0x67AA, 0xC7B9, + 0x67AB, 0xB7E3, 0x67AC, 0x969D, 0x67AD, 0xE8C9, 0x67AE, 0x969E, + 0x67AF, 0xBFDD, 0x67B0, 0xE8D2, 0x67B1, 0x969F, 0x67B2, 0x96A0, + 0x67B3, 0xE8D7, 0x67B4, 0x96A1, 0x67B5, 0xE8D5, 0x67B6, 0xBCDC, + 0x67B7, 0xBCCF, 0x67B8, 0xE8DB, 0x67B9, 0x96A2, 0x67BA, 0x96A3, + 0x67BB, 0x96A4, 0x67BC, 0x96A5, 0x67BD, 0x96A6, 0x67BE, 0x96A7, + 0x67BF, 0x96A8, 0x67C0, 0x96A9, 0x67C1, 0xE8DE, 0x67C2, 0x96AA, + 0x67C3, 0xE8DA, 0x67C4, 0xB1FA, 0x67C5, 0x96AB, 0x67C6, 0x96AC, + 0x67C7, 0x96AD, 0x67C8, 0x96AE, 0x67C9, 0x96AF, 0x67CA, 0x96B0, + 0x67CB, 0x96B1, 0x67CC, 0x96B2, 0x67CD, 0x96B3, 0x67CE, 0x96B4, + 0x67CF, 0xB0D8, 0x67D0, 0xC4B3, 0x67D1, 0xB8CC, 0x67D2, 0xC6E2, + 0x67D3, 0xC8BE, 0x67D4, 0xC8E1, 0x67D5, 0x96B5, 0x67D6, 0x96B6, + 0x67D7, 0x96B7, 0x67D8, 0xE8CF, 0x67D9, 0xE8D4, 0x67DA, 0xE8D6, + 0x67DB, 0x96B8, 0x67DC, 0xB9F1, 0x67DD, 0xE8D8, 0x67DE, 0xD7F5, + 0x67DF, 0x96B9, 0x67E0, 0xC4FB, 0x67E1, 0x96BA, 0x67E2, 0xE8DC, + 0x67E3, 0x96BB, 0x67E4, 0x96BC, 0x67E5, 0xB2E9, 0x67E6, 0x96BD, + 0x67E7, 0x96BE, 0x67E8, 0x96BF, 0x67E9, 0xE8D1, 0x67EA, 0x96C0, + 0x67EB, 0x96C1, 0x67EC, 0xBCED, 0x67ED, 0x96C2, 0x67EE, 0x96C3, + 0x67EF, 0xBFC2, 0x67F0, 0xE8CD, 0x67F1, 0xD6F9, 0x67F2, 0x96C4, + 0x67F3, 0xC1F8, 0x67F4, 0xB2F1, 0x67F5, 0x96C5, 0x67F6, 0x96C6, + 0x67F7, 0x96C7, 0x67F8, 0x96C8, 0x67F9, 0x96C9, 0x67FA, 0x96CA, + 0x67FB, 0x96CB, 0x67FC, 0x96CC, 0x67FD, 0xE8DF, 0x67FE, 0x96CD, + 0x67FF, 0xCAC1, 0x6800, 0xE8D9, 0x6801, 0x96CE, 0x6802, 0x96CF, + 0x6803, 0x96D0, 0x6804, 0x96D1, 0x6805, 0xD5A4, 0x6806, 0x96D2, + 0x6807, 0xB1EA, 0x6808, 0xD5BB, 0x6809, 0xE8CE, 0x680A, 0xE8D0, + 0x680B, 0xB6B0, 0x680C, 0xE8D3, 0x680D, 0x96D3, 0x680E, 0xE8DD, + 0x680F, 0xC0B8, 0x6810, 0x96D4, 0x6811, 0xCAF7, 0x6812, 0x96D5, + 0x6813, 0xCBA8, 0x6814, 0x96D6, 0x6815, 0x96D7, 0x6816, 0xC6DC, + 0x6817, 0xC0F5, 0x6818, 0x96D8, 0x6819, 0x96D9, 0x681A, 0x96DA, + 0x681B, 0x96DB, 0x681C, 0x96DC, 0x681D, 0xE8E9, 0x681E, 0x96DD, + 0x681F, 0x96DE, 0x6820, 0x96DF, 0x6821, 0xD0A3, 0x6822, 0x96E0, + 0x6823, 0x96E1, 0x6824, 0x96E2, 0x6825, 0x96E3, 0x6826, 0x96E4, + 0x6827, 0x96E5, 0x6828, 0x96E6, 0x6829, 0xE8F2, 0x682A, 0xD6EA, + 0x682B, 0x96E7, 0x682C, 0x96E8, 0x682D, 0x96E9, 0x682E, 0x96EA, + 0x682F, 0x96EB, 0x6830, 0x96EC, 0x6831, 0x96ED, 0x6832, 0xE8E0, + 0x6833, 0xE8E1, 0x6834, 0x96EE, 0x6835, 0x96EF, 0x6836, 0x96F0, + 0x6837, 0xD1F9, 0x6838, 0xBACB, 0x6839, 0xB8F9, 0x683A, 0x96F1, + 0x683B, 0x96F2, 0x683C, 0xB8F1, 0x683D, 0xD4D4, 0x683E, 0xE8EF, + 0x683F, 0x96F3, 0x6840, 0xE8EE, 0x6841, 0xE8EC, 0x6842, 0xB9F0, + 0x6843, 0xCCD2, 0x6844, 0xE8E6, 0x6845, 0xCEA6, 0x6846, 0xBFF2, + 0x6847, 0x96F4, 0x6848, 0xB0B8, 0x6849, 0xE8F1, 0x684A, 0xE8F0, + 0x684B, 0x96F5, 0x684C, 0xD7C0, 0x684D, 0x96F6, 0x684E, 0xE8E4, + 0x684F, 0x96F7, 0x6850, 0xCDA9, 0x6851, 0xC9A3, 0x6852, 0x96F8, + 0x6853, 0xBBB8, 0x6854, 0xBDDB, 0x6855, 0xE8EA, 0x6856, 0x96F9, + 0x6857, 0x96FA, 0x6858, 0x96FB, 0x6859, 0x96FC, 0x685A, 0x96FD, + 0x685B, 0x96FE, 0x685C, 0x9740, 0x685D, 0x9741, 0x685E, 0x9742, + 0x685F, 0x9743, 0x6860, 0xE8E2, 0x6861, 0xE8E3, 0x6862, 0xE8E5, + 0x6863, 0xB5B5, 0x6864, 0xE8E7, 0x6865, 0xC7C5, 0x6866, 0xE8EB, + 0x6867, 0xE8ED, 0x6868, 0xBDB0, 0x6869, 0xD7AE, 0x686A, 0x9744, + 0x686B, 0xE8F8, 0x686C, 0x9745, 0x686D, 0x9746, 0x686E, 0x9747, + 0x686F, 0x9748, 0x6870, 0x9749, 0x6871, 0x974A, 0x6872, 0x974B, + 0x6873, 0x974C, 0x6874, 0xE8F5, 0x6875, 0x974D, 0x6876, 0xCDB0, + 0x6877, 0xE8F6, 0x6878, 0x974E, 0x6879, 0x974F, 0x687A, 0x9750, + 0x687B, 0x9751, 0x687C, 0x9752, 0x687D, 0x9753, 0x687E, 0x9754, + 0x687F, 0x9755, 0x6880, 0x9756, 0x6881, 0xC1BA, 0x6882, 0x9757, + 0x6883, 0xE8E8, 0x6884, 0x9758, 0x6885, 0xC3B7, 0x6886, 0xB0F0, + 0x6887, 0x9759, 0x6888, 0x975A, 0x6889, 0x975B, 0x688A, 0x975C, + 0x688B, 0x975D, 0x688C, 0x975E, 0x688D, 0x975F, 0x688E, 0x9760, + 0x688F, 0xE8F4, 0x6890, 0x9761, 0x6891, 0x9762, 0x6892, 0x9763, + 0x6893, 0xE8F7, 0x6894, 0x9764, 0x6895, 0x9765, 0x6896, 0x9766, + 0x6897, 0xB9A3, 0x6898, 0x9767, 0x6899, 0x9768, 0x689A, 0x9769, + 0x689B, 0x976A, 0x689C, 0x976B, 0x689D, 0x976C, 0x689E, 0x976D, + 0x689F, 0x976E, 0x68A0, 0x976F, 0x68A1, 0x9770, 0x68A2, 0xC9D2, + 0x68A3, 0x9771, 0x68A4, 0x9772, 0x68A5, 0x9773, 0x68A6, 0xC3CE, + 0x68A7, 0xCEE0, 0x68A8, 0xC0E6, 0x68A9, 0x9774, 0x68AA, 0x9775, + 0x68AB, 0x9776, 0x68AC, 0x9777, 0x68AD, 0xCBF3, 0x68AE, 0x9778, + 0x68AF, 0xCCDD, 0x68B0, 0xD0B5, 0x68B1, 0x9779, 0x68B2, 0x977A, + 0x68B3, 0xCAE1, 0x68B4, 0x977B, 0x68B5, 0xE8F3, 0x68B6, 0x977C, + 0x68B7, 0x977D, 0x68B8, 0x977E, 0x68B9, 0x9780, 0x68BA, 0x9781, + 0x68BB, 0x9782, 0x68BC, 0x9783, 0x68BD, 0x9784, 0x68BE, 0x9785, + 0x68BF, 0x9786, 0x68C0, 0xBCEC, 0x68C1, 0x9787, 0x68C2, 0xE8F9, + 0x68C3, 0x9788, 0x68C4, 0x9789, 0x68C5, 0x978A, 0x68C6, 0x978B, + 0x68C7, 0x978C, 0x68C8, 0x978D, 0x68C9, 0xC3DE, 0x68CA, 0x978E, + 0x68CB, 0xC6E5, 0x68CC, 0x978F, 0x68CD, 0xB9F7, 0x68CE, 0x9790, + 0x68CF, 0x9791, 0x68D0, 0x9792, 0x68D1, 0x9793, 0x68D2, 0xB0F4, + 0x68D3, 0x9794, 0x68D4, 0x9795, 0x68D5, 0xD7D8, 0x68D6, 0x9796, + 0x68D7, 0x9797, 0x68D8, 0xBCAC, 0x68D9, 0x9798, 0x68DA, 0xC5EF, + 0x68DB, 0x9799, 0x68DC, 0x979A, 0x68DD, 0x979B, 0x68DE, 0x979C, + 0x68DF, 0x979D, 0x68E0, 0xCCC4, 0x68E1, 0x979E, 0x68E2, 0x979F, + 0x68E3, 0xE9A6, 0x68E4, 0x97A0, 0x68E5, 0x97A1, 0x68E6, 0x97A2, + 0x68E7, 0x97A3, 0x68E8, 0x97A4, 0x68E9, 0x97A5, 0x68EA, 0x97A6, + 0x68EB, 0x97A7, 0x68EC, 0x97A8, 0x68ED, 0x97A9, 0x68EE, 0xC9AD, + 0x68EF, 0x97AA, 0x68F0, 0xE9A2, 0x68F1, 0xC0E2, 0x68F2, 0x97AB, + 0x68F3, 0x97AC, 0x68F4, 0x97AD, 0x68F5, 0xBFC3, 0x68F6, 0x97AE, + 0x68F7, 0x97AF, 0x68F8, 0x97B0, 0x68F9, 0xE8FE, 0x68FA, 0xB9D7, + 0x68FB, 0x97B1, 0x68FC, 0xE8FB, 0x68FD, 0x97B2, 0x68FE, 0x97B3, + 0x68FF, 0x97B4, 0x6900, 0x97B5, 0x6901, 0xE9A4, 0x6902, 0x97B6, + 0x6903, 0x97B7, 0x6904, 0x97B8, 0x6905, 0xD2CE, 0x6906, 0x97B9, + 0x6907, 0x97BA, 0x6908, 0x97BB, 0x6909, 0x97BC, 0x690A, 0x97BD, + 0x690B, 0xE9A3, 0x690C, 0x97BE, 0x690D, 0xD6B2, 0x690E, 0xD7B5, + 0x690F, 0x97BF, 0x6910, 0xE9A7, 0x6911, 0x97C0, 0x6912, 0xBDB7, + 0x6913, 0x97C1, 0x6914, 0x97C2, 0x6915, 0x97C3, 0x6916, 0x97C4, + 0x6917, 0x97C5, 0x6918, 0x97C6, 0x6919, 0x97C7, 0x691A, 0x97C8, + 0x691B, 0x97C9, 0x691C, 0x97CA, 0x691D, 0x97CB, 0x691E, 0x97CC, + 0x691F, 0xE8FC, 0x6920, 0xE8FD, 0x6921, 0x97CD, 0x6922, 0x97CE, + 0x6923, 0x97CF, 0x6924, 0xE9A1, 0x6925, 0x97D0, 0x6926, 0x97D1, + 0x6927, 0x97D2, 0x6928, 0x97D3, 0x6929, 0x97D4, 0x692A, 0x97D5, + 0x692B, 0x97D6, 0x692C, 0x97D7, 0x692D, 0xCDD6, 0x692E, 0x97D8, + 0x692F, 0x97D9, 0x6930, 0xD2AC, 0x6931, 0x97DA, 0x6932, 0x97DB, + 0x6933, 0x97DC, 0x6934, 0xE9B2, 0x6935, 0x97DD, 0x6936, 0x97DE, + 0x6937, 0x97DF, 0x6938, 0x97E0, 0x6939, 0xE9A9, 0x693A, 0x97E1, + 0x693B, 0x97E2, 0x693C, 0x97E3, 0x693D, 0xB4AA, 0x693E, 0x97E4, + 0x693F, 0xB4BB, 0x6940, 0x97E5, 0x6941, 0x97E6, 0x6942, 0xE9AB, + 0x6943, 0x97E7, 0x6944, 0x97E8, 0x6945, 0x97E9, 0x6946, 0x97EA, + 0x6947, 0x97EB, 0x6948, 0x97EC, 0x6949, 0x97ED, 0x694A, 0x97EE, + 0x694B, 0x97EF, 0x694C, 0x97F0, 0x694D, 0x97F1, 0x694E, 0x97F2, + 0x694F, 0x97F3, 0x6950, 0x97F4, 0x6951, 0x97F5, 0x6952, 0x97F6, + 0x6953, 0x97F7, 0x6954, 0xD0A8, 0x6955, 0x97F8, 0x6956, 0x97F9, + 0x6957, 0xE9A5, 0x6958, 0x97FA, 0x6959, 0x97FB, 0x695A, 0xB3FE, + 0x695B, 0x97FC, 0x695C, 0x97FD, 0x695D, 0xE9AC, 0x695E, 0xC0E3, + 0x695F, 0x97FE, 0x6960, 0xE9AA, 0x6961, 0x9840, 0x6962, 0x9841, + 0x6963, 0xE9B9, 0x6964, 0x9842, 0x6965, 0x9843, 0x6966, 0xE9B8, + 0x6967, 0x9844, 0x6968, 0x9845, 0x6969, 0x9846, 0x696A, 0x9847, + 0x696B, 0xE9AE, 0x696C, 0x9848, 0x696D, 0x9849, 0x696E, 0xE8FA, + 0x696F, 0x984A, 0x6970, 0x984B, 0x6971, 0xE9A8, 0x6972, 0x984C, + 0x6973, 0x984D, 0x6974, 0x984E, 0x6975, 0x984F, 0x6976, 0x9850, + 0x6977, 0xBFAC, 0x6978, 0xE9B1, 0x6979, 0xE9BA, 0x697A, 0x9851, + 0x697B, 0x9852, 0x697C, 0xC2A5, 0x697D, 0x9853, 0x697E, 0x9854, + 0x697F, 0x9855, 0x6980, 0xE9AF, 0x6981, 0x9856, 0x6982, 0xB8C5, + 0x6983, 0x9857, 0x6984, 0xE9AD, 0x6985, 0x9858, 0x6986, 0xD3DC, + 0x6987, 0xE9B4, 0x6988, 0xE9B5, 0x6989, 0xE9B7, 0x698A, 0x9859, + 0x698B, 0x985A, 0x698C, 0x985B, 0x698D, 0xE9C7, 0x698E, 0x985C, + 0x698F, 0x985D, 0x6990, 0x985E, 0x6991, 0x985F, 0x6992, 0x9860, + 0x6993, 0x9861, 0x6994, 0xC0C6, 0x6995, 0xE9C5, 0x6996, 0x9862, + 0x6997, 0x9863, 0x6998, 0xE9B0, 0x6999, 0x9864, 0x699A, 0x9865, + 0x699B, 0xE9BB, 0x699C, 0xB0F1, 0x699D, 0x9866, 0x699E, 0x9867, + 0x699F, 0x9868, 0x69A0, 0x9869, 0x69A1, 0x986A, 0x69A2, 0x986B, + 0x69A3, 0x986C, 0x69A4, 0x986D, 0x69A5, 0x986E, 0x69A6, 0x986F, + 0x69A7, 0xE9BC, 0x69A8, 0xD5A5, 0x69A9, 0x9870, 0x69AA, 0x9871, + 0x69AB, 0xE9BE, 0x69AC, 0x9872, 0x69AD, 0xE9BF, 0x69AE, 0x9873, + 0x69AF, 0x9874, 0x69B0, 0x9875, 0x69B1, 0xE9C1, 0x69B2, 0x9876, + 0x69B3, 0x9877, 0x69B4, 0xC1F1, 0x69B5, 0x9878, 0x69B6, 0x9879, + 0x69B7, 0xC8B6, 0x69B8, 0x987A, 0x69B9, 0x987B, 0x69BA, 0x987C, + 0x69BB, 0xE9BD, 0x69BC, 0x987D, 0x69BD, 0x987E, 0x69BE, 0x9880, + 0x69BF, 0x9881, 0x69C0, 0x9882, 0x69C1, 0xE9C2, 0x69C2, 0x9883, + 0x69C3, 0x9884, 0x69C4, 0x9885, 0x69C5, 0x9886, 0x69C6, 0x9887, + 0x69C7, 0x9888, 0x69C8, 0x9889, 0x69C9, 0x988A, 0x69CA, 0xE9C3, + 0x69CB, 0x988B, 0x69CC, 0xE9B3, 0x69CD, 0x988C, 0x69CE, 0xE9B6, + 0x69CF, 0x988D, 0x69D0, 0xBBB1, 0x69D1, 0x988E, 0x69D2, 0x988F, + 0x69D3, 0x9890, 0x69D4, 0xE9C0, 0x69D5, 0x9891, 0x69D6, 0x9892, + 0x69D7, 0x9893, 0x69D8, 0x9894, 0x69D9, 0x9895, 0x69DA, 0x9896, + 0x69DB, 0xBCF7, 0x69DC, 0x9897, 0x69DD, 0x9898, 0x69DE, 0x9899, + 0x69DF, 0xE9C4, 0x69E0, 0xE9C6, 0x69E1, 0x989A, 0x69E2, 0x989B, + 0x69E3, 0x989C, 0x69E4, 0x989D, 0x69E5, 0x989E, 0x69E6, 0x989F, + 0x69E7, 0x98A0, 0x69E8, 0x98A1, 0x69E9, 0x98A2, 0x69EA, 0x98A3, + 0x69EB, 0x98A4, 0x69EC, 0x98A5, 0x69ED, 0xE9CA, 0x69EE, 0x98A6, + 0x69EF, 0x98A7, 0x69F0, 0x98A8, 0x69F1, 0x98A9, 0x69F2, 0xE9CE, + 0x69F3, 0x98AA, 0x69F4, 0x98AB, 0x69F5, 0x98AC, 0x69F6, 0x98AD, + 0x69F7, 0x98AE, 0x69F8, 0x98AF, 0x69F9, 0x98B0, 0x69FA, 0x98B1, + 0x69FB, 0x98B2, 0x69FC, 0x98B3, 0x69FD, 0xB2DB, 0x69FE, 0x98B4, + 0x69FF, 0xE9C8, 0x6A00, 0x98B5, 0x6A01, 0x98B6, 0x6A02, 0x98B7, + 0x6A03, 0x98B8, 0x6A04, 0x98B9, 0x6A05, 0x98BA, 0x6A06, 0x98BB, + 0x6A07, 0x98BC, 0x6A08, 0x98BD, 0x6A09, 0x98BE, 0x6A0A, 0xB7AE, + 0x6A0B, 0x98BF, 0x6A0C, 0x98C0, 0x6A0D, 0x98C1, 0x6A0E, 0x98C2, + 0x6A0F, 0x98C3, 0x6A10, 0x98C4, 0x6A11, 0x98C5, 0x6A12, 0x98C6, + 0x6A13, 0x98C7, 0x6A14, 0x98C8, 0x6A15, 0x98C9, 0x6A16, 0x98CA, + 0x6A17, 0xE9CB, 0x6A18, 0xE9CC, 0x6A19, 0x98CB, 0x6A1A, 0x98CC, + 0x6A1B, 0x98CD, 0x6A1C, 0x98CE, 0x6A1D, 0x98CF, 0x6A1E, 0x98D0, + 0x6A1F, 0xD5C1, 0x6A20, 0x98D1, 0x6A21, 0xC4A3, 0x6A22, 0x98D2, + 0x6A23, 0x98D3, 0x6A24, 0x98D4, 0x6A25, 0x98D5, 0x6A26, 0x98D6, + 0x6A27, 0x98D7, 0x6A28, 0xE9D8, 0x6A29, 0x98D8, 0x6A2A, 0xBAE1, + 0x6A2B, 0x98D9, 0x6A2C, 0x98DA, 0x6A2D, 0x98DB, 0x6A2E, 0x98DC, + 0x6A2F, 0xE9C9, 0x6A30, 0x98DD, 0x6A31, 0xD3A3, 0x6A32, 0x98DE, + 0x6A33, 0x98DF, 0x6A34, 0x98E0, 0x6A35, 0xE9D4, 0x6A36, 0x98E1, + 0x6A37, 0x98E2, 0x6A38, 0x98E3, 0x6A39, 0x98E4, 0x6A3A, 0x98E5, + 0x6A3B, 0x98E6, 0x6A3C, 0x98E7, 0x6A3D, 0xE9D7, 0x6A3E, 0xE9D0, + 0x6A3F, 0x98E8, 0x6A40, 0x98E9, 0x6A41, 0x98EA, 0x6A42, 0x98EB, + 0x6A43, 0x98EC, 0x6A44, 0xE9CF, 0x6A45, 0x98ED, 0x6A46, 0x98EE, + 0x6A47, 0xC7C1, 0x6A48, 0x98EF, 0x6A49, 0x98F0, 0x6A4A, 0x98F1, + 0x6A4B, 0x98F2, 0x6A4C, 0x98F3, 0x6A4D, 0x98F4, 0x6A4E, 0x98F5, + 0x6A4F, 0x98F6, 0x6A50, 0xE9D2, 0x6A51, 0x98F7, 0x6A52, 0x98F8, + 0x6A53, 0x98F9, 0x6A54, 0x98FA, 0x6A55, 0x98FB, 0x6A56, 0x98FC, + 0x6A57, 0x98FD, 0x6A58, 0xE9D9, 0x6A59, 0xB3C8, 0x6A5A, 0x98FE, + 0x6A5B, 0xE9D3, 0x6A5C, 0x9940, 0x6A5D, 0x9941, 0x6A5E, 0x9942, + 0x6A5F, 0x9943, 0x6A60, 0x9944, 0x6A61, 0xCFF0, 0x6A62, 0x9945, + 0x6A63, 0x9946, 0x6A64, 0x9947, 0x6A65, 0xE9CD, 0x6A66, 0x9948, + 0x6A67, 0x9949, 0x6A68, 0x994A, 0x6A69, 0x994B, 0x6A6A, 0x994C, + 0x6A6B, 0x994D, 0x6A6C, 0x994E, 0x6A6D, 0x994F, 0x6A6E, 0x9950, + 0x6A6F, 0x9951, 0x6A70, 0x9952, 0x6A71, 0xB3F7, 0x6A72, 0x9953, + 0x6A73, 0x9954, 0x6A74, 0x9955, 0x6A75, 0x9956, 0x6A76, 0x9957, + 0x6A77, 0x9958, 0x6A78, 0x9959, 0x6A79, 0xE9D6, 0x6A7A, 0x995A, + 0x6A7B, 0x995B, 0x6A7C, 0xE9DA, 0x6A7D, 0x995C, 0x6A7E, 0x995D, + 0x6A7F, 0x995E, 0x6A80, 0xCCB4, 0x6A81, 0x995F, 0x6A82, 0x9960, + 0x6A83, 0x9961, 0x6A84, 0xCFAD, 0x6A85, 0x9962, 0x6A86, 0x9963, + 0x6A87, 0x9964, 0x6A88, 0x9965, 0x6A89, 0x9966, 0x6A8A, 0x9967, + 0x6A8B, 0x9968, 0x6A8C, 0x9969, 0x6A8D, 0x996A, 0x6A8E, 0xE9D5, + 0x6A8F, 0x996B, 0x6A90, 0xE9DC, 0x6A91, 0xE9DB, 0x6A92, 0x996C, + 0x6A93, 0x996D, 0x6A94, 0x996E, 0x6A95, 0x996F, 0x6A96, 0x9970, + 0x6A97, 0xE9DE, 0x6A98, 0x9971, 0x6A99, 0x9972, 0x6A9A, 0x9973, + 0x6A9B, 0x9974, 0x6A9C, 0x9975, 0x6A9D, 0x9976, 0x6A9E, 0x9977, + 0x6A9F, 0x9978, 0x6AA0, 0xE9D1, 0x6AA1, 0x9979, 0x6AA2, 0x997A, + 0x6AA3, 0x997B, 0x6AA4, 0x997C, 0x6AA5, 0x997D, 0x6AA6, 0x997E, + 0x6AA7, 0x9980, 0x6AA8, 0x9981, 0x6AA9, 0xE9DD, 0x6AAA, 0x9982, + 0x6AAB, 0xE9DF, 0x6AAC, 0xC3CA, 0x6AAD, 0x9983, 0x6AAE, 0x9984, + 0x6AAF, 0x9985, 0x6AB0, 0x9986, 0x6AB1, 0x9987, 0x6AB2, 0x9988, + 0x6AB3, 0x9989, 0x6AB4, 0x998A, 0x6AB5, 0x998B, 0x6AB6, 0x998C, + 0x6AB7, 0x998D, 0x6AB8, 0x998E, 0x6AB9, 0x998F, 0x6ABA, 0x9990, + 0x6ABB, 0x9991, 0x6ABC, 0x9992, 0x6ABD, 0x9993, 0x6ABE, 0x9994, + 0x6ABF, 0x9995, 0x6AC0, 0x9996, 0x6AC1, 0x9997, 0x6AC2, 0x9998, + 0x6AC3, 0x9999, 0x6AC4, 0x999A, 0x6AC5, 0x999B, 0x6AC6, 0x999C, + 0x6AC7, 0x999D, 0x6AC8, 0x999E, 0x6AC9, 0x999F, 0x6ACA, 0x99A0, + 0x6ACB, 0x99A1, 0x6ACC, 0x99A2, 0x6ACD, 0x99A3, 0x6ACE, 0x99A4, + 0x6ACF, 0x99A5, 0x6AD0, 0x99A6, 0x6AD1, 0x99A7, 0x6AD2, 0x99A8, + 0x6AD3, 0x99A9, 0x6AD4, 0x99AA, 0x6AD5, 0x99AB, 0x6AD6, 0x99AC, + 0x6AD7, 0x99AD, 0x6AD8, 0x99AE, 0x6AD9, 0x99AF, 0x6ADA, 0x99B0, + 0x6ADB, 0x99B1, 0x6ADC, 0x99B2, 0x6ADD, 0x99B3, 0x6ADE, 0x99B4, + 0x6ADF, 0x99B5, 0x6AE0, 0x99B6, 0x6AE1, 0x99B7, 0x6AE2, 0x99B8, + 0x6AE3, 0x99B9, 0x6AE4, 0x99BA, 0x6AE5, 0x99BB, 0x6AE6, 0x99BC, + 0x6AE7, 0x99BD, 0x6AE8, 0x99BE, 0x6AE9, 0x99BF, 0x6AEA, 0x99C0, + 0x6AEB, 0x99C1, 0x6AEC, 0x99C2, 0x6AED, 0x99C3, 0x6AEE, 0x99C4, + 0x6AEF, 0x99C5, 0x6AF0, 0x99C6, 0x6AF1, 0x99C7, 0x6AF2, 0x99C8, + 0x6AF3, 0x99C9, 0x6AF4, 0x99CA, 0x6AF5, 0x99CB, 0x6AF6, 0x99CC, + 0x6AF7, 0x99CD, 0x6AF8, 0x99CE, 0x6AF9, 0x99CF, 0x6AFA, 0x99D0, + 0x6AFB, 0x99D1, 0x6AFC, 0x99D2, 0x6AFD, 0x99D3, 0x6AFE, 0x99D4, + 0x6AFF, 0x99D5, 0x6B00, 0x99D6, 0x6B01, 0x99D7, 0x6B02, 0x99D8, + 0x6B03, 0x99D9, 0x6B04, 0x99DA, 0x6B05, 0x99DB, 0x6B06, 0x99DC, + 0x6B07, 0x99DD, 0x6B08, 0x99DE, 0x6B09, 0x99DF, 0x6B0A, 0x99E0, + 0x6B0B, 0x99E1, 0x6B0C, 0x99E2, 0x6B0D, 0x99E3, 0x6B0E, 0x99E4, + 0x6B0F, 0x99E5, 0x6B10, 0x99E6, 0x6B11, 0x99E7, 0x6B12, 0x99E8, + 0x6B13, 0x99E9, 0x6B14, 0x99EA, 0x6B15, 0x99EB, 0x6B16, 0x99EC, + 0x6B17, 0x99ED, 0x6B18, 0x99EE, 0x6B19, 0x99EF, 0x6B1A, 0x99F0, + 0x6B1B, 0x99F1, 0x6B1C, 0x99F2, 0x6B1D, 0x99F3, 0x6B1E, 0x99F4, + 0x6B1F, 0x99F5, 0x6B20, 0xC7B7, 0x6B21, 0xB4CE, 0x6B22, 0xBBB6, + 0x6B23, 0xD0C0, 0x6B24, 0xECA3, 0x6B25, 0x99F6, 0x6B26, 0x99F7, + 0x6B27, 0xC5B7, 0x6B28, 0x99F8, 0x6B29, 0x99F9, 0x6B2A, 0x99FA, + 0x6B2B, 0x99FB, 0x6B2C, 0x99FC, 0x6B2D, 0x99FD, 0x6B2E, 0x99FE, + 0x6B2F, 0x9A40, 0x6B30, 0x9A41, 0x6B31, 0x9A42, 0x6B32, 0xD3FB, + 0x6B33, 0x9A43, 0x6B34, 0x9A44, 0x6B35, 0x9A45, 0x6B36, 0x9A46, + 0x6B37, 0xECA4, 0x6B38, 0x9A47, 0x6B39, 0xECA5, 0x6B3A, 0xC6DB, + 0x6B3B, 0x9A48, 0x6B3C, 0x9A49, 0x6B3D, 0x9A4A, 0x6B3E, 0xBFEE, + 0x6B3F, 0x9A4B, 0x6B40, 0x9A4C, 0x6B41, 0x9A4D, 0x6B42, 0x9A4E, + 0x6B43, 0xECA6, 0x6B44, 0x9A4F, 0x6B45, 0x9A50, 0x6B46, 0xECA7, + 0x6B47, 0xD0AA, 0x6B48, 0x9A51, 0x6B49, 0xC7B8, 0x6B4A, 0x9A52, + 0x6B4B, 0x9A53, 0x6B4C, 0xB8E8, 0x6B4D, 0x9A54, 0x6B4E, 0x9A55, + 0x6B4F, 0x9A56, 0x6B50, 0x9A57, 0x6B51, 0x9A58, 0x6B52, 0x9A59, + 0x6B53, 0x9A5A, 0x6B54, 0x9A5B, 0x6B55, 0x9A5C, 0x6B56, 0x9A5D, + 0x6B57, 0x9A5E, 0x6B58, 0x9A5F, 0x6B59, 0xECA8, 0x6B5A, 0x9A60, + 0x6B5B, 0x9A61, 0x6B5C, 0x9A62, 0x6B5D, 0x9A63, 0x6B5E, 0x9A64, + 0x6B5F, 0x9A65, 0x6B60, 0x9A66, 0x6B61, 0x9A67, 0x6B62, 0xD6B9, + 0x6B63, 0xD5FD, 0x6B64, 0xB4CB, 0x6B65, 0xB2BD, 0x6B66, 0xCEE4, + 0x6B67, 0xC6E7, 0x6B68, 0x9A68, 0x6B69, 0x9A69, 0x6B6A, 0xCDE1, + 0x6B6B, 0x9A6A, 0x6B6C, 0x9A6B, 0x6B6D, 0x9A6C, 0x6B6E, 0x9A6D, + 0x6B6F, 0x9A6E, 0x6B70, 0x9A6F, 0x6B71, 0x9A70, 0x6B72, 0x9A71, + 0x6B73, 0x9A72, 0x6B74, 0x9A73, 0x6B75, 0x9A74, 0x6B76, 0x9A75, + 0x6B77, 0x9A76, 0x6B78, 0x9A77, 0x6B79, 0xB4F5, 0x6B7A, 0x9A78, + 0x6B7B, 0xCBC0, 0x6B7C, 0xBCDF, 0x6B7D, 0x9A79, 0x6B7E, 0x9A7A, + 0x6B7F, 0x9A7B, 0x6B80, 0x9A7C, 0x6B81, 0xE9E2, 0x6B82, 0xE9E3, + 0x6B83, 0xD1EA, 0x6B84, 0xE9E5, 0x6B85, 0x9A7D, 0x6B86, 0xB4F9, + 0x6B87, 0xE9E4, 0x6B88, 0x9A7E, 0x6B89, 0xD1B3, 0x6B8A, 0xCAE2, + 0x6B8B, 0xB2D0, 0x6B8C, 0x9A80, 0x6B8D, 0xE9E8, 0x6B8E, 0x9A81, + 0x6B8F, 0x9A82, 0x6B90, 0x9A83, 0x6B91, 0x9A84, 0x6B92, 0xE9E6, + 0x6B93, 0xE9E7, 0x6B94, 0x9A85, 0x6B95, 0x9A86, 0x6B96, 0xD6B3, + 0x6B97, 0x9A87, 0x6B98, 0x9A88, 0x6B99, 0x9A89, 0x6B9A, 0xE9E9, + 0x6B9B, 0xE9EA, 0x6B9C, 0x9A8A, 0x6B9D, 0x9A8B, 0x6B9E, 0x9A8C, + 0x6B9F, 0x9A8D, 0x6BA0, 0x9A8E, 0x6BA1, 0xE9EB, 0x6BA2, 0x9A8F, + 0x6BA3, 0x9A90, 0x6BA4, 0x9A91, 0x6BA5, 0x9A92, 0x6BA6, 0x9A93, + 0x6BA7, 0x9A94, 0x6BA8, 0x9A95, 0x6BA9, 0x9A96, 0x6BAA, 0xE9EC, + 0x6BAB, 0x9A97, 0x6BAC, 0x9A98, 0x6BAD, 0x9A99, 0x6BAE, 0x9A9A, + 0x6BAF, 0x9A9B, 0x6BB0, 0x9A9C, 0x6BB1, 0x9A9D, 0x6BB2, 0x9A9E, + 0x6BB3, 0xECAF, 0x6BB4, 0xC5B9, 0x6BB5, 0xB6CE, 0x6BB6, 0x9A9F, + 0x6BB7, 0xD2F3, 0x6BB8, 0x9AA0, 0x6BB9, 0x9AA1, 0x6BBA, 0x9AA2, + 0x6BBB, 0x9AA3, 0x6BBC, 0x9AA4, 0x6BBD, 0x9AA5, 0x6BBE, 0x9AA6, + 0x6BBF, 0xB5EE, 0x6BC0, 0x9AA7, 0x6BC1, 0xBBD9, 0x6BC2, 0xECB1, + 0x6BC3, 0x9AA8, 0x6BC4, 0x9AA9, 0x6BC5, 0xD2E3, 0x6BC6, 0x9AAA, + 0x6BC7, 0x9AAB, 0x6BC8, 0x9AAC, 0x6BC9, 0x9AAD, 0x6BCA, 0x9AAE, + 0x6BCB, 0xCEE3, 0x6BCC, 0x9AAF, 0x6BCD, 0xC4B8, 0x6BCE, 0x9AB0, + 0x6BCF, 0xC3BF, 0x6BD0, 0x9AB1, 0x6BD1, 0x9AB2, 0x6BD2, 0xB6BE, + 0x6BD3, 0xD8B9, 0x6BD4, 0xB1C8, 0x6BD5, 0xB1CF, 0x6BD6, 0xB1D1, + 0x6BD7, 0xC5FE, 0x6BD8, 0x9AB3, 0x6BD9, 0xB1D0, 0x6BDA, 0x9AB4, + 0x6BDB, 0xC3AB, 0x6BDC, 0x9AB5, 0x6BDD, 0x9AB6, 0x6BDE, 0x9AB7, + 0x6BDF, 0x9AB8, 0x6BE0, 0x9AB9, 0x6BE1, 0xD5B1, 0x6BE2, 0x9ABA, + 0x6BE3, 0x9ABB, 0x6BE4, 0x9ABC, 0x6BE5, 0x9ABD, 0x6BE6, 0x9ABE, + 0x6BE7, 0x9ABF, 0x6BE8, 0x9AC0, 0x6BE9, 0x9AC1, 0x6BEA, 0xEBA4, + 0x6BEB, 0xBAC1, 0x6BEC, 0x9AC2, 0x6BED, 0x9AC3, 0x6BEE, 0x9AC4, + 0x6BEF, 0xCCBA, 0x6BF0, 0x9AC5, 0x6BF1, 0x9AC6, 0x6BF2, 0x9AC7, + 0x6BF3, 0xEBA5, 0x6BF4, 0x9AC8, 0x6BF5, 0xEBA7, 0x6BF6, 0x9AC9, + 0x6BF7, 0x9ACA, 0x6BF8, 0x9ACB, 0x6BF9, 0xEBA8, 0x6BFA, 0x9ACC, + 0x6BFB, 0x9ACD, 0x6BFC, 0x9ACE, 0x6BFD, 0xEBA6, 0x6BFE, 0x9ACF, + 0x6BFF, 0x9AD0, 0x6C00, 0x9AD1, 0x6C01, 0x9AD2, 0x6C02, 0x9AD3, + 0x6C03, 0x9AD4, 0x6C04, 0x9AD5, 0x6C05, 0xEBA9, 0x6C06, 0xEBAB, + 0x6C07, 0xEBAA, 0x6C08, 0x9AD6, 0x6C09, 0x9AD7, 0x6C0A, 0x9AD8, + 0x6C0B, 0x9AD9, 0x6C0C, 0x9ADA, 0x6C0D, 0xEBAC, 0x6C0E, 0x9ADB, + 0x6C0F, 0xCACF, 0x6C10, 0xD8B5, 0x6C11, 0xC3F1, 0x6C12, 0x9ADC, + 0x6C13, 0xC3A5, 0x6C14, 0xC6F8, 0x6C15, 0xEBAD, 0x6C16, 0xC4CA, + 0x6C17, 0x9ADD, 0x6C18, 0xEBAE, 0x6C19, 0xEBAF, 0x6C1A, 0xEBB0, + 0x6C1B, 0xB7D5, 0x6C1C, 0x9ADE, 0x6C1D, 0x9ADF, 0x6C1E, 0x9AE0, + 0x6C1F, 0xB7FA, 0x6C20, 0x9AE1, 0x6C21, 0xEBB1, 0x6C22, 0xC7E2, + 0x6C23, 0x9AE2, 0x6C24, 0xEBB3, 0x6C25, 0x9AE3, 0x6C26, 0xBAA4, + 0x6C27, 0xD1F5, 0x6C28, 0xB0B1, 0x6C29, 0xEBB2, 0x6C2A, 0xEBB4, + 0x6C2B, 0x9AE4, 0x6C2C, 0x9AE5, 0x6C2D, 0x9AE6, 0x6C2E, 0xB5AA, + 0x6C2F, 0xC2C8, 0x6C30, 0xC7E8, 0x6C31, 0x9AE7, 0x6C32, 0xEBB5, + 0x6C33, 0x9AE8, 0x6C34, 0xCBAE, 0x6C35, 0xE3DF, 0x6C36, 0x9AE9, + 0x6C37, 0x9AEA, 0x6C38, 0xD3C0, 0x6C39, 0x9AEB, 0x6C3A, 0x9AEC, + 0x6C3B, 0x9AED, 0x6C3C, 0x9AEE, 0x6C3D, 0xD9DB, 0x6C3E, 0x9AEF, + 0x6C3F, 0x9AF0, 0x6C40, 0xCDA1, 0x6C41, 0xD6AD, 0x6C42, 0xC7F3, + 0x6C43, 0x9AF1, 0x6C44, 0x9AF2, 0x6C45, 0x9AF3, 0x6C46, 0xD9E0, + 0x6C47, 0xBBE3, 0x6C48, 0x9AF4, 0x6C49, 0xBABA, 0x6C4A, 0xE3E2, + 0x6C4B, 0x9AF5, 0x6C4C, 0x9AF6, 0x6C4D, 0x9AF7, 0x6C4E, 0x9AF8, + 0x6C4F, 0x9AF9, 0x6C50, 0xCFAB, 0x6C51, 0x9AFA, 0x6C52, 0x9AFB, + 0x6C53, 0x9AFC, 0x6C54, 0xE3E0, 0x6C55, 0xC9C7, 0x6C56, 0x9AFD, + 0x6C57, 0xBAB9, 0x6C58, 0x9AFE, 0x6C59, 0x9B40, 0x6C5A, 0x9B41, + 0x6C5B, 0xD1B4, 0x6C5C, 0xE3E1, 0x6C5D, 0xC8EA, 0x6C5E, 0xB9AF, + 0x6C5F, 0xBDAD, 0x6C60, 0xB3D8, 0x6C61, 0xCEDB, 0x6C62, 0x9B42, + 0x6C63, 0x9B43, 0x6C64, 0xCCC0, 0x6C65, 0x9B44, 0x6C66, 0x9B45, + 0x6C67, 0x9B46, 0x6C68, 0xE3E8, 0x6C69, 0xE3E9, 0x6C6A, 0xCDF4, + 0x6C6B, 0x9B47, 0x6C6C, 0x9B48, 0x6C6D, 0x9B49, 0x6C6E, 0x9B4A, + 0x6C6F, 0x9B4B, 0x6C70, 0xCCAD, 0x6C71, 0x9B4C, 0x6C72, 0xBCB3, + 0x6C73, 0x9B4D, 0x6C74, 0xE3EA, 0x6C75, 0x9B4E, 0x6C76, 0xE3EB, + 0x6C77, 0x9B4F, 0x6C78, 0x9B50, 0x6C79, 0xD0DA, 0x6C7A, 0x9B51, + 0x6C7B, 0x9B52, 0x6C7C, 0x9B53, 0x6C7D, 0xC6FB, 0x6C7E, 0xB7DA, + 0x6C7F, 0x9B54, 0x6C80, 0x9B55, 0x6C81, 0xC7DF, 0x6C82, 0xD2CA, + 0x6C83, 0xCED6, 0x6C84, 0x9B56, 0x6C85, 0xE3E4, 0x6C86, 0xE3EC, + 0x6C87, 0x9B57, 0x6C88, 0xC9F2, 0x6C89, 0xB3C1, 0x6C8A, 0x9B58, + 0x6C8B, 0x9B59, 0x6C8C, 0xE3E7, 0x6C8D, 0x9B5A, 0x6C8E, 0x9B5B, + 0x6C8F, 0xC6E3, 0x6C90, 0xE3E5, 0x6C91, 0x9B5C, 0x6C92, 0x9B5D, + 0x6C93, 0xEDB3, 0x6C94, 0xE3E6, 0x6C95, 0x9B5E, 0x6C96, 0x9B5F, + 0x6C97, 0x9B60, 0x6C98, 0x9B61, 0x6C99, 0xC9B3, 0x6C9A, 0x9B62, + 0x6C9B, 0xC5E6, 0x6C9C, 0x9B63, 0x6C9D, 0x9B64, 0x6C9E, 0x9B65, + 0x6C9F, 0xB9B5, 0x6CA0, 0x9B66, 0x6CA1, 0xC3BB, 0x6CA2, 0x9B67, + 0x6CA3, 0xE3E3, 0x6CA4, 0xC5BD, 0x6CA5, 0xC1A4, 0x6CA6, 0xC2D9, + 0x6CA7, 0xB2D7, 0x6CA8, 0x9B68, 0x6CA9, 0xE3ED, 0x6CAA, 0xBBA6, + 0x6CAB, 0xC4AD, 0x6CAC, 0x9B69, 0x6CAD, 0xE3F0, 0x6CAE, 0xBEDA, + 0x6CAF, 0x9B6A, 0x6CB0, 0x9B6B, 0x6CB1, 0xE3FB, 0x6CB2, 0xE3F5, + 0x6CB3, 0xBAD3, 0x6CB4, 0x9B6C, 0x6CB5, 0x9B6D, 0x6CB6, 0x9B6E, + 0x6CB7, 0x9B6F, 0x6CB8, 0xB7D0, 0x6CB9, 0xD3CD, 0x6CBA, 0x9B70, + 0x6CBB, 0xD6CE, 0x6CBC, 0xD5D3, 0x6CBD, 0xB9C1, 0x6CBE, 0xD5B4, + 0x6CBF, 0xD1D8, 0x6CC0, 0x9B71, 0x6CC1, 0x9B72, 0x6CC2, 0x9B73, + 0x6CC3, 0x9B74, 0x6CC4, 0xD0B9, 0x6CC5, 0xC7F6, 0x6CC6, 0x9B75, + 0x6CC7, 0x9B76, 0x6CC8, 0x9B77, 0x6CC9, 0xC8AA, 0x6CCA, 0xB2B4, + 0x6CCB, 0x9B78, 0x6CCC, 0xC3DA, 0x6CCD, 0x9B79, 0x6CCE, 0x9B7A, + 0x6CCF, 0x9B7B, 0x6CD0, 0xE3EE, 0x6CD1, 0x9B7C, 0x6CD2, 0x9B7D, + 0x6CD3, 0xE3FC, 0x6CD4, 0xE3EF, 0x6CD5, 0xB7A8, 0x6CD6, 0xE3F7, + 0x6CD7, 0xE3F4, 0x6CD8, 0x9B7E, 0x6CD9, 0x9B80, 0x6CDA, 0x9B81, + 0x6CDB, 0xB7BA, 0x6CDC, 0x9B82, 0x6CDD, 0x9B83, 0x6CDE, 0xC5A2, + 0x6CDF, 0x9B84, 0x6CE0, 0xE3F6, 0x6CE1, 0xC5DD, 0x6CE2, 0xB2A8, + 0x6CE3, 0xC6FC, 0x6CE4, 0x9B85, 0x6CE5, 0xC4E0, 0x6CE6, 0x9B86, + 0x6CE7, 0x9B87, 0x6CE8, 0xD7A2, 0x6CE9, 0x9B88, 0x6CEA, 0xC0E1, + 0x6CEB, 0xE3F9, 0x6CEC, 0x9B89, 0x6CED, 0x9B8A, 0x6CEE, 0xE3FA, + 0x6CEF, 0xE3FD, 0x6CF0, 0xCCA9, 0x6CF1, 0xE3F3, 0x6CF2, 0x9B8B, + 0x6CF3, 0xD3BE, 0x6CF4, 0x9B8C, 0x6CF5, 0xB1C3, 0x6CF6, 0xEDB4, + 0x6CF7, 0xE3F1, 0x6CF8, 0xE3F2, 0x6CF9, 0x9B8D, 0x6CFA, 0xE3F8, + 0x6CFB, 0xD0BA, 0x6CFC, 0xC6C3, 0x6CFD, 0xD4F3, 0x6CFE, 0xE3FE, + 0x6CFF, 0x9B8E, 0x6D00, 0x9B8F, 0x6D01, 0xBDE0, 0x6D02, 0x9B90, + 0x6D03, 0x9B91, 0x6D04, 0xE4A7, 0x6D05, 0x9B92, 0x6D06, 0x9B93, + 0x6D07, 0xE4A6, 0x6D08, 0x9B94, 0x6D09, 0x9B95, 0x6D0A, 0x9B96, + 0x6D0B, 0xD1F3, 0x6D0C, 0xE4A3, 0x6D0D, 0x9B97, 0x6D0E, 0xE4A9, + 0x6D0F, 0x9B98, 0x6D10, 0x9B99, 0x6D11, 0x9B9A, 0x6D12, 0xC8F7, + 0x6D13, 0x9B9B, 0x6D14, 0x9B9C, 0x6D15, 0x9B9D, 0x6D16, 0x9B9E, + 0x6D17, 0xCFB4, 0x6D18, 0x9B9F, 0x6D19, 0xE4A8, 0x6D1A, 0xE4AE, + 0x6D1B, 0xC2E5, 0x6D1C, 0x9BA0, 0x6D1D, 0x9BA1, 0x6D1E, 0xB6B4, + 0x6D1F, 0x9BA2, 0x6D20, 0x9BA3, 0x6D21, 0x9BA4, 0x6D22, 0x9BA5, + 0x6D23, 0x9BA6, 0x6D24, 0x9BA7, 0x6D25, 0xBDF2, 0x6D26, 0x9BA8, + 0x6D27, 0xE4A2, 0x6D28, 0x9BA9, 0x6D29, 0x9BAA, 0x6D2A, 0xBAE9, + 0x6D2B, 0xE4AA, 0x6D2C, 0x9BAB, 0x6D2D, 0x9BAC, 0x6D2E, 0xE4AC, + 0x6D2F, 0x9BAD, 0x6D30, 0x9BAE, 0x6D31, 0xB6FD, 0x6D32, 0xD6DE, + 0x6D33, 0xE4B2, 0x6D34, 0x9BAF, 0x6D35, 0xE4AD, 0x6D36, 0x9BB0, + 0x6D37, 0x9BB1, 0x6D38, 0x9BB2, 0x6D39, 0xE4A1, 0x6D3A, 0x9BB3, + 0x6D3B, 0xBBEE, 0x6D3C, 0xCDDD, 0x6D3D, 0xC7A2, 0x6D3E, 0xC5C9, + 0x6D3F, 0x9BB4, 0x6D40, 0x9BB5, 0x6D41, 0xC1F7, 0x6D42, 0x9BB6, + 0x6D43, 0xE4A4, 0x6D44, 0x9BB7, 0x6D45, 0xC7B3, 0x6D46, 0xBDAC, + 0x6D47, 0xBDBD, 0x6D48, 0xE4A5, 0x6D49, 0x9BB8, 0x6D4A, 0xD7C7, + 0x6D4B, 0xB2E2, 0x6D4C, 0x9BB9, 0x6D4D, 0xE4AB, 0x6D4E, 0xBCC3, + 0x6D4F, 0xE4AF, 0x6D50, 0x9BBA, 0x6D51, 0xBBEB, 0x6D52, 0xE4B0, + 0x6D53, 0xC5A8, 0x6D54, 0xE4B1, 0x6D55, 0x9BBB, 0x6D56, 0x9BBC, + 0x6D57, 0x9BBD, 0x6D58, 0x9BBE, 0x6D59, 0xD5E3, 0x6D5A, 0xBFA3, + 0x6D5B, 0x9BBF, 0x6D5C, 0xE4BA, 0x6D5D, 0x9BC0, 0x6D5E, 0xE4B7, + 0x6D5F, 0x9BC1, 0x6D60, 0xE4BB, 0x6D61, 0x9BC2, 0x6D62, 0x9BC3, + 0x6D63, 0xE4BD, 0x6D64, 0x9BC4, 0x6D65, 0x9BC5, 0x6D66, 0xC6D6, + 0x6D67, 0x9BC6, 0x6D68, 0x9BC7, 0x6D69, 0xBAC6, 0x6D6A, 0xC0CB, + 0x6D6B, 0x9BC8, 0x6D6C, 0x9BC9, 0x6D6D, 0x9BCA, 0x6D6E, 0xB8A1, + 0x6D6F, 0xE4B4, 0x6D70, 0x9BCB, 0x6D71, 0x9BCC, 0x6D72, 0x9BCD, + 0x6D73, 0x9BCE, 0x6D74, 0xD4A1, 0x6D75, 0x9BCF, 0x6D76, 0x9BD0, + 0x6D77, 0xBAA3, 0x6D78, 0xBDFE, 0x6D79, 0x9BD1, 0x6D7A, 0x9BD2, + 0x6D7B, 0x9BD3, 0x6D7C, 0xE4BC, 0x6D7D, 0x9BD4, 0x6D7E, 0x9BD5, + 0x6D7F, 0x9BD6, 0x6D80, 0x9BD7, 0x6D81, 0x9BD8, 0x6D82, 0xCDBF, + 0x6D83, 0x9BD9, 0x6D84, 0x9BDA, 0x6D85, 0xC4F9, 0x6D86, 0x9BDB, + 0x6D87, 0x9BDC, 0x6D88, 0xCFFB, 0x6D89, 0xC9E6, 0x6D8A, 0x9BDD, + 0x6D8B, 0x9BDE, 0x6D8C, 0xD3BF, 0x6D8D, 0x9BDF, 0x6D8E, 0xCFD1, + 0x6D8F, 0x9BE0, 0x6D90, 0x9BE1, 0x6D91, 0xE4B3, 0x6D92, 0x9BE2, + 0x6D93, 0xE4B8, 0x6D94, 0xE4B9, 0x6D95, 0xCCE9, 0x6D96, 0x9BE3, + 0x6D97, 0x9BE4, 0x6D98, 0x9BE5, 0x6D99, 0x9BE6, 0x6D9A, 0x9BE7, + 0x6D9B, 0xCCCE, 0x6D9C, 0x9BE8, 0x6D9D, 0xC0D4, 0x6D9E, 0xE4B5, + 0x6D9F, 0xC1B0, 0x6DA0, 0xE4B6, 0x6DA1, 0xCED0, 0x6DA2, 0x9BE9, + 0x6DA3, 0xBBC1, 0x6DA4, 0xB5D3, 0x6DA5, 0x9BEA, 0x6DA6, 0xC8F3, + 0x6DA7, 0xBDA7, 0x6DA8, 0xD5C7, 0x6DA9, 0xC9AC, 0x6DAA, 0xB8A2, + 0x6DAB, 0xE4CA, 0x6DAC, 0x9BEB, 0x6DAD, 0x9BEC, 0x6DAE, 0xE4CC, + 0x6DAF, 0xD1C4, 0x6DB0, 0x9BED, 0x6DB1, 0x9BEE, 0x6DB2, 0xD2BA, + 0x6DB3, 0x9BEF, 0x6DB4, 0x9BF0, 0x6DB5, 0xBAAD, 0x6DB6, 0x9BF1, + 0x6DB7, 0x9BF2, 0x6DB8, 0xBAD4, 0x6DB9, 0x9BF3, 0x6DBA, 0x9BF4, + 0x6DBB, 0x9BF5, 0x6DBC, 0x9BF6, 0x6DBD, 0x9BF7, 0x6DBE, 0x9BF8, + 0x6DBF, 0xE4C3, 0x6DC0, 0xB5ED, 0x6DC1, 0x9BF9, 0x6DC2, 0x9BFA, + 0x6DC3, 0x9BFB, 0x6DC4, 0xD7CD, 0x6DC5, 0xE4C0, 0x6DC6, 0xCFFD, + 0x6DC7, 0xE4BF, 0x6DC8, 0x9BFC, 0x6DC9, 0x9BFD, 0x6DCA, 0x9BFE, + 0x6DCB, 0xC1DC, 0x6DCC, 0xCCCA, 0x6DCD, 0x9C40, 0x6DCE, 0x9C41, + 0x6DCF, 0x9C42, 0x6DD0, 0x9C43, 0x6DD1, 0xCAE7, 0x6DD2, 0x9C44, + 0x6DD3, 0x9C45, 0x6DD4, 0x9C46, 0x6DD5, 0x9C47, 0x6DD6, 0xC4D7, + 0x6DD7, 0x9C48, 0x6DD8, 0xCCD4, 0x6DD9, 0xE4C8, 0x6DDA, 0x9C49, + 0x6DDB, 0x9C4A, 0x6DDC, 0x9C4B, 0x6DDD, 0xE4C7, 0x6DDE, 0xE4C1, + 0x6DDF, 0x9C4C, 0x6DE0, 0xE4C4, 0x6DE1, 0xB5AD, 0x6DE2, 0x9C4D, + 0x6DE3, 0x9C4E, 0x6DE4, 0xD3D9, 0x6DE5, 0x9C4F, 0x6DE6, 0xE4C6, + 0x6DE7, 0x9C50, 0x6DE8, 0x9C51, 0x6DE9, 0x9C52, 0x6DEA, 0x9C53, + 0x6DEB, 0xD2F9, 0x6DEC, 0xB4E3, 0x6DED, 0x9C54, 0x6DEE, 0xBBB4, + 0x6DEF, 0x9C55, 0x6DF0, 0x9C56, 0x6DF1, 0xC9EE, 0x6DF2, 0x9C57, + 0x6DF3, 0xB4BE, 0x6DF4, 0x9C58, 0x6DF5, 0x9C59, 0x6DF6, 0x9C5A, + 0x6DF7, 0xBBEC, 0x6DF8, 0x9C5B, 0x6DF9, 0xD1CD, 0x6DFA, 0x9C5C, + 0x6DFB, 0xCCED, 0x6DFC, 0xEDB5, 0x6DFD, 0x9C5D, 0x6DFE, 0x9C5E, + 0x6DFF, 0x9C5F, 0x6E00, 0x9C60, 0x6E01, 0x9C61, 0x6E02, 0x9C62, + 0x6E03, 0x9C63, 0x6E04, 0x9C64, 0x6E05, 0xC7E5, 0x6E06, 0x9C65, + 0x6E07, 0x9C66, 0x6E08, 0x9C67, 0x6E09, 0x9C68, 0x6E0A, 0xD4A8, + 0x6E0B, 0x9C69, 0x6E0C, 0xE4CB, 0x6E0D, 0xD7D5, 0x6E0E, 0xE4C2, + 0x6E0F, 0x9C6A, 0x6E10, 0xBDA5, 0x6E11, 0xE4C5, 0x6E12, 0x9C6B, + 0x6E13, 0x9C6C, 0x6E14, 0xD3E6, 0x6E15, 0x9C6D, 0x6E16, 0xE4C9, + 0x6E17, 0xC9F8, 0x6E18, 0x9C6E, 0x6E19, 0x9C6F, 0x6E1A, 0xE4BE, + 0x6E1B, 0x9C70, 0x6E1C, 0x9C71, 0x6E1D, 0xD3E5, 0x6E1E, 0x9C72, + 0x6E1F, 0x9C73, 0x6E20, 0xC7FE, 0x6E21, 0xB6C9, 0x6E22, 0x9C74, + 0x6E23, 0xD4FC, 0x6E24, 0xB2B3, 0x6E25, 0xE4D7, 0x6E26, 0x9C75, + 0x6E27, 0x9C76, 0x6E28, 0x9C77, 0x6E29, 0xCEC2, 0x6E2A, 0x9C78, + 0x6E2B, 0xE4CD, 0x6E2C, 0x9C79, 0x6E2D, 0xCEBC, 0x6E2E, 0x9C7A, + 0x6E2F, 0xB8DB, 0x6E30, 0x9C7B, 0x6E31, 0x9C7C, 0x6E32, 0xE4D6, + 0x6E33, 0x9C7D, 0x6E34, 0xBFCA, 0x6E35, 0x9C7E, 0x6E36, 0x9C80, + 0x6E37, 0x9C81, 0x6E38, 0xD3CE, 0x6E39, 0x9C82, 0x6E3A, 0xC3EC, + 0x6E3B, 0x9C83, 0x6E3C, 0x9C84, 0x6E3D, 0x9C85, 0x6E3E, 0x9C86, + 0x6E3F, 0x9C87, 0x6E40, 0x9C88, 0x6E41, 0x9C89, 0x6E42, 0x9C8A, + 0x6E43, 0xC5C8, 0x6E44, 0xE4D8, 0x6E45, 0x9C8B, 0x6E46, 0x9C8C, + 0x6E47, 0x9C8D, 0x6E48, 0x9C8E, 0x6E49, 0x9C8F, 0x6E4A, 0x9C90, + 0x6E4B, 0x9C91, 0x6E4C, 0x9C92, 0x6E4D, 0xCDC4, 0x6E4E, 0xE4CF, + 0x6E4F, 0x9C93, 0x6E50, 0x9C94, 0x6E51, 0x9C95, 0x6E52, 0x9C96, + 0x6E53, 0xE4D4, 0x6E54, 0xE4D5, 0x6E55, 0x9C97, 0x6E56, 0xBAFE, + 0x6E57, 0x9C98, 0x6E58, 0xCFE6, 0x6E59, 0x9C99, 0x6E5A, 0x9C9A, + 0x6E5B, 0xD5BF, 0x6E5C, 0x9C9B, 0x6E5D, 0x9C9C, 0x6E5E, 0x9C9D, + 0x6E5F, 0xE4D2, 0x6E60, 0x9C9E, 0x6E61, 0x9C9F, 0x6E62, 0x9CA0, + 0x6E63, 0x9CA1, 0x6E64, 0x9CA2, 0x6E65, 0x9CA3, 0x6E66, 0x9CA4, + 0x6E67, 0x9CA5, 0x6E68, 0x9CA6, 0x6E69, 0x9CA7, 0x6E6A, 0x9CA8, + 0x6E6B, 0xE4D0, 0x6E6C, 0x9CA9, 0x6E6D, 0x9CAA, 0x6E6E, 0xE4CE, + 0x6E6F, 0x9CAB, 0x6E70, 0x9CAC, 0x6E71, 0x9CAD, 0x6E72, 0x9CAE, + 0x6E73, 0x9CAF, 0x6E74, 0x9CB0, 0x6E75, 0x9CB1, 0x6E76, 0x9CB2, + 0x6E77, 0x9CB3, 0x6E78, 0x9CB4, 0x6E79, 0x9CB5, 0x6E7A, 0x9CB6, + 0x6E7B, 0x9CB7, 0x6E7C, 0x9CB8, 0x6E7D, 0x9CB9, 0x6E7E, 0xCDE5, + 0x6E7F, 0xCAAA, 0x6E80, 0x9CBA, 0x6E81, 0x9CBB, 0x6E82, 0x9CBC, + 0x6E83, 0xC0A3, 0x6E84, 0x9CBD, 0x6E85, 0xBDA6, 0x6E86, 0xE4D3, + 0x6E87, 0x9CBE, 0x6E88, 0x9CBF, 0x6E89, 0xB8C8, 0x6E8A, 0x9CC0, + 0x6E8B, 0x9CC1, 0x6E8C, 0x9CC2, 0x6E8D, 0x9CC3, 0x6E8E, 0x9CC4, + 0x6E8F, 0xE4E7, 0x6E90, 0xD4B4, 0x6E91, 0x9CC5, 0x6E92, 0x9CC6, + 0x6E93, 0x9CC7, 0x6E94, 0x9CC8, 0x6E95, 0x9CC9, 0x6E96, 0x9CCA, + 0x6E97, 0x9CCB, 0x6E98, 0xE4DB, 0x6E99, 0x9CCC, 0x6E9A, 0x9CCD, + 0x6E9B, 0x9CCE, 0x6E9C, 0xC1EF, 0x6E9D, 0x9CCF, 0x6E9E, 0x9CD0, + 0x6E9F, 0xE4E9, 0x6EA0, 0x9CD1, 0x6EA1, 0x9CD2, 0x6EA2, 0xD2E7, + 0x6EA3, 0x9CD3, 0x6EA4, 0x9CD4, 0x6EA5, 0xE4DF, 0x6EA6, 0x9CD5, + 0x6EA7, 0xE4E0, 0x6EA8, 0x9CD6, 0x6EA9, 0x9CD7, 0x6EAA, 0xCFAA, + 0x6EAB, 0x9CD8, 0x6EAC, 0x9CD9, 0x6EAD, 0x9CDA, 0x6EAE, 0x9CDB, + 0x6EAF, 0xCBDD, 0x6EB0, 0x9CDC, 0x6EB1, 0xE4DA, 0x6EB2, 0xE4D1, + 0x6EB3, 0x9CDD, 0x6EB4, 0xE4E5, 0x6EB5, 0x9CDE, 0x6EB6, 0xC8DC, + 0x6EB7, 0xE4E3, 0x6EB8, 0x9CDF, 0x6EB9, 0x9CE0, 0x6EBA, 0xC4E7, + 0x6EBB, 0xE4E2, 0x6EBC, 0x9CE1, 0x6EBD, 0xE4E1, 0x6EBE, 0x9CE2, + 0x6EBF, 0x9CE3, 0x6EC0, 0x9CE4, 0x6EC1, 0xB3FC, 0x6EC2, 0xE4E8, + 0x6EC3, 0x9CE5, 0x6EC4, 0x9CE6, 0x6EC5, 0x9CE7, 0x6EC6, 0x9CE8, + 0x6EC7, 0xB5E1, 0x6EC8, 0x9CE9, 0x6EC9, 0x9CEA, 0x6ECA, 0x9CEB, + 0x6ECB, 0xD7CC, 0x6ECC, 0x9CEC, 0x6ECD, 0x9CED, 0x6ECE, 0x9CEE, + 0x6ECF, 0xE4E6, 0x6ED0, 0x9CEF, 0x6ED1, 0xBBAC, 0x6ED2, 0x9CF0, + 0x6ED3, 0xD7D2, 0x6ED4, 0xCCCF, 0x6ED5, 0xEBF8, 0x6ED6, 0x9CF1, + 0x6ED7, 0xE4E4, 0x6ED8, 0x9CF2, 0x6ED9, 0x9CF3, 0x6EDA, 0xB9F6, + 0x6EDB, 0x9CF4, 0x6EDC, 0x9CF5, 0x6EDD, 0x9CF6, 0x6EDE, 0xD6CD, + 0x6EDF, 0xE4D9, 0x6EE0, 0xE4DC, 0x6EE1, 0xC2FA, 0x6EE2, 0xE4DE, + 0x6EE3, 0x9CF7, 0x6EE4, 0xC2CB, 0x6EE5, 0xC0C4, 0x6EE6, 0xC2D0, + 0x6EE7, 0x9CF8, 0x6EE8, 0xB1F5, 0x6EE9, 0xCCB2, 0x6EEA, 0x9CF9, + 0x6EEB, 0x9CFA, 0x6EEC, 0x9CFB, 0x6EED, 0x9CFC, 0x6EEE, 0x9CFD, + 0x6EEF, 0x9CFE, 0x6EF0, 0x9D40, 0x6EF1, 0x9D41, 0x6EF2, 0x9D42, + 0x6EF3, 0x9D43, 0x6EF4, 0xB5CE, 0x6EF5, 0x9D44, 0x6EF6, 0x9D45, + 0x6EF7, 0x9D46, 0x6EF8, 0x9D47, 0x6EF9, 0xE4EF, 0x6EFA, 0x9D48, + 0x6EFB, 0x9D49, 0x6EFC, 0x9D4A, 0x6EFD, 0x9D4B, 0x6EFE, 0x9D4C, + 0x6EFF, 0x9D4D, 0x6F00, 0x9D4E, 0x6F01, 0x9D4F, 0x6F02, 0xC6AF, + 0x6F03, 0x9D50, 0x6F04, 0x9D51, 0x6F05, 0x9D52, 0x6F06, 0xC6E1, + 0x6F07, 0x9D53, 0x6F08, 0x9D54, 0x6F09, 0xE4F5, 0x6F0A, 0x9D55, + 0x6F0B, 0x9D56, 0x6F0C, 0x9D57, 0x6F0D, 0x9D58, 0x6F0E, 0x9D59, + 0x6F0F, 0xC2A9, 0x6F10, 0x9D5A, 0x6F11, 0x9D5B, 0x6F12, 0x9D5C, + 0x6F13, 0xC0EC, 0x6F14, 0xD1DD, 0x6F15, 0xE4EE, 0x6F16, 0x9D5D, + 0x6F17, 0x9D5E, 0x6F18, 0x9D5F, 0x6F19, 0x9D60, 0x6F1A, 0x9D61, + 0x6F1B, 0x9D62, 0x6F1C, 0x9D63, 0x6F1D, 0x9D64, 0x6F1E, 0x9D65, + 0x6F1F, 0x9D66, 0x6F20, 0xC4AE, 0x6F21, 0x9D67, 0x6F22, 0x9D68, + 0x6F23, 0x9D69, 0x6F24, 0xE4ED, 0x6F25, 0x9D6A, 0x6F26, 0x9D6B, + 0x6F27, 0x9D6C, 0x6F28, 0x9D6D, 0x6F29, 0xE4F6, 0x6F2A, 0xE4F4, + 0x6F2B, 0xC2FE, 0x6F2C, 0x9D6E, 0x6F2D, 0xE4DD, 0x6F2E, 0x9D6F, + 0x6F2F, 0xE4F0, 0x6F30, 0x9D70, 0x6F31, 0xCAFE, 0x6F32, 0x9D71, + 0x6F33, 0xD5C4, 0x6F34, 0x9D72, 0x6F35, 0x9D73, 0x6F36, 0xE4F1, + 0x6F37, 0x9D74, 0x6F38, 0x9D75, 0x6F39, 0x9D76, 0x6F3A, 0x9D77, + 0x6F3B, 0x9D78, 0x6F3C, 0x9D79, 0x6F3D, 0x9D7A, 0x6F3E, 0xD1FA, + 0x6F3F, 0x9D7B, 0x6F40, 0x9D7C, 0x6F41, 0x9D7D, 0x6F42, 0x9D7E, + 0x6F43, 0x9D80, 0x6F44, 0x9D81, 0x6F45, 0x9D82, 0x6F46, 0xE4EB, + 0x6F47, 0xE4EC, 0x6F48, 0x9D83, 0x6F49, 0x9D84, 0x6F4A, 0x9D85, + 0x6F4B, 0xE4F2, 0x6F4C, 0x9D86, 0x6F4D, 0xCEAB, 0x6F4E, 0x9D87, + 0x6F4F, 0x9D88, 0x6F50, 0x9D89, 0x6F51, 0x9D8A, 0x6F52, 0x9D8B, + 0x6F53, 0x9D8C, 0x6F54, 0x9D8D, 0x6F55, 0x9D8E, 0x6F56, 0x9D8F, + 0x6F57, 0x9D90, 0x6F58, 0xC5CB, 0x6F59, 0x9D91, 0x6F5A, 0x9D92, + 0x6F5B, 0x9D93, 0x6F5C, 0xC7B1, 0x6F5D, 0x9D94, 0x6F5E, 0xC2BA, + 0x6F5F, 0x9D95, 0x6F60, 0x9D96, 0x6F61, 0x9D97, 0x6F62, 0xE4EA, + 0x6F63, 0x9D98, 0x6F64, 0x9D99, 0x6F65, 0x9D9A, 0x6F66, 0xC1CA, + 0x6F67, 0x9D9B, 0x6F68, 0x9D9C, 0x6F69, 0x9D9D, 0x6F6A, 0x9D9E, + 0x6F6B, 0x9D9F, 0x6F6C, 0x9DA0, 0x6F6D, 0xCCB6, 0x6F6E, 0xB3B1, + 0x6F6F, 0x9DA1, 0x6F70, 0x9DA2, 0x6F71, 0x9DA3, 0x6F72, 0xE4FB, + 0x6F73, 0x9DA4, 0x6F74, 0xE4F3, 0x6F75, 0x9DA5, 0x6F76, 0x9DA6, + 0x6F77, 0x9DA7, 0x6F78, 0xE4FA, 0x6F79, 0x9DA8, 0x6F7A, 0xE4FD, + 0x6F7B, 0x9DA9, 0x6F7C, 0xE4FC, 0x6F7D, 0x9DAA, 0x6F7E, 0x9DAB, + 0x6F7F, 0x9DAC, 0x6F80, 0x9DAD, 0x6F81, 0x9DAE, 0x6F82, 0x9DAF, + 0x6F83, 0x9DB0, 0x6F84, 0xB3CE, 0x6F85, 0x9DB1, 0x6F86, 0x9DB2, + 0x6F87, 0x9DB3, 0x6F88, 0xB3BA, 0x6F89, 0xE4F7, 0x6F8A, 0x9DB4, + 0x6F8B, 0x9DB5, 0x6F8C, 0xE4F9, 0x6F8D, 0xE4F8, 0x6F8E, 0xC5EC, + 0x6F8F, 0x9DB6, 0x6F90, 0x9DB7, 0x6F91, 0x9DB8, 0x6F92, 0x9DB9, + 0x6F93, 0x9DBA, 0x6F94, 0x9DBB, 0x6F95, 0x9DBC, 0x6F96, 0x9DBD, + 0x6F97, 0x9DBE, 0x6F98, 0x9DBF, 0x6F99, 0x9DC0, 0x6F9A, 0x9DC1, + 0x6F9B, 0x9DC2, 0x6F9C, 0xC0BD, 0x6F9D, 0x9DC3, 0x6F9E, 0x9DC4, + 0x6F9F, 0x9DC5, 0x6FA0, 0x9DC6, 0x6FA1, 0xD4E8, 0x6FA2, 0x9DC7, + 0x6FA3, 0x9DC8, 0x6FA4, 0x9DC9, 0x6FA5, 0x9DCA, 0x6FA6, 0x9DCB, + 0x6FA7, 0xE5A2, 0x6FA8, 0x9DCC, 0x6FA9, 0x9DCD, 0x6FAA, 0x9DCE, + 0x6FAB, 0x9DCF, 0x6FAC, 0x9DD0, 0x6FAD, 0x9DD1, 0x6FAE, 0x9DD2, + 0x6FAF, 0x9DD3, 0x6FB0, 0x9DD4, 0x6FB1, 0x9DD5, 0x6FB2, 0x9DD6, + 0x6FB3, 0xB0C4, 0x6FB4, 0x9DD7, 0x6FB5, 0x9DD8, 0x6FB6, 0xE5A4, + 0x6FB7, 0x9DD9, 0x6FB8, 0x9DDA, 0x6FB9, 0xE5A3, 0x6FBA, 0x9DDB, + 0x6FBB, 0x9DDC, 0x6FBC, 0x9DDD, 0x6FBD, 0x9DDE, 0x6FBE, 0x9DDF, + 0x6FBF, 0x9DE0, 0x6FC0, 0xBCA4, 0x6FC1, 0x9DE1, 0x6FC2, 0xE5A5, + 0x6FC3, 0x9DE2, 0x6FC4, 0x9DE3, 0x6FC5, 0x9DE4, 0x6FC6, 0x9DE5, + 0x6FC7, 0x9DE6, 0x6FC8, 0x9DE7, 0x6FC9, 0xE5A1, 0x6FCA, 0x9DE8, + 0x6FCB, 0x9DE9, 0x6FCC, 0x9DEA, 0x6FCD, 0x9DEB, 0x6FCE, 0x9DEC, + 0x6FCF, 0x9DED, 0x6FD0, 0x9DEE, 0x6FD1, 0xE4FE, 0x6FD2, 0xB1F4, + 0x6FD3, 0x9DEF, 0x6FD4, 0x9DF0, 0x6FD5, 0x9DF1, 0x6FD6, 0x9DF2, + 0x6FD7, 0x9DF3, 0x6FD8, 0x9DF4, 0x6FD9, 0x9DF5, 0x6FDA, 0x9DF6, + 0x6FDB, 0x9DF7, 0x6FDC, 0x9DF8, 0x6FDD, 0x9DF9, 0x6FDE, 0xE5A8, + 0x6FDF, 0x9DFA, 0x6FE0, 0xE5A9, 0x6FE1, 0xE5A6, 0x6FE2, 0x9DFB, + 0x6FE3, 0x9DFC, 0x6FE4, 0x9DFD, 0x6FE5, 0x9DFE, 0x6FE6, 0x9E40, + 0x6FE7, 0x9E41, 0x6FE8, 0x9E42, 0x6FE9, 0x9E43, 0x6FEA, 0x9E44, + 0x6FEB, 0x9E45, 0x6FEC, 0x9E46, 0x6FED, 0x9E47, 0x6FEE, 0xE5A7, + 0x6FEF, 0xE5AA, 0x6FF0, 0x9E48, 0x6FF1, 0x9E49, 0x6FF2, 0x9E4A, + 0x6FF3, 0x9E4B, 0x6FF4, 0x9E4C, 0x6FF5, 0x9E4D, 0x6FF6, 0x9E4E, + 0x6FF7, 0x9E4F, 0x6FF8, 0x9E50, 0x6FF9, 0x9E51, 0x6FFA, 0x9E52, + 0x6FFB, 0x9E53, 0x6FFC, 0x9E54, 0x6FFD, 0x9E55, 0x6FFE, 0x9E56, + 0x6FFF, 0x9E57, 0x7000, 0x9E58, 0x7001, 0x9E59, 0x7002, 0x9E5A, + 0x7003, 0x9E5B, 0x7004, 0x9E5C, 0x7005, 0x9E5D, 0x7006, 0x9E5E, + 0x7007, 0x9E5F, 0x7008, 0x9E60, 0x7009, 0x9E61, 0x700A, 0x9E62, + 0x700B, 0x9E63, 0x700C, 0x9E64, 0x700D, 0x9E65, 0x700E, 0x9E66, + 0x700F, 0x9E67, 0x7010, 0x9E68, 0x7011, 0xC6D9, 0x7012, 0x9E69, + 0x7013, 0x9E6A, 0x7014, 0x9E6B, 0x7015, 0x9E6C, 0x7016, 0x9E6D, + 0x7017, 0x9E6E, 0x7018, 0x9E6F, 0x7019, 0x9E70, 0x701A, 0xE5AB, + 0x701B, 0xE5AD, 0x701C, 0x9E71, 0x701D, 0x9E72, 0x701E, 0x9E73, + 0x701F, 0x9E74, 0x7020, 0x9E75, 0x7021, 0x9E76, 0x7022, 0x9E77, + 0x7023, 0xE5AC, 0x7024, 0x9E78, 0x7025, 0x9E79, 0x7026, 0x9E7A, + 0x7027, 0x9E7B, 0x7028, 0x9E7C, 0x7029, 0x9E7D, 0x702A, 0x9E7E, + 0x702B, 0x9E80, 0x702C, 0x9E81, 0x702D, 0x9E82, 0x702E, 0x9E83, + 0x702F, 0x9E84, 0x7030, 0x9E85, 0x7031, 0x9E86, 0x7032, 0x9E87, + 0x7033, 0x9E88, 0x7034, 0x9E89, 0x7035, 0xE5AF, 0x7036, 0x9E8A, + 0x7037, 0x9E8B, 0x7038, 0x9E8C, 0x7039, 0xE5AE, 0x703A, 0x9E8D, + 0x703B, 0x9E8E, 0x703C, 0x9E8F, 0x703D, 0x9E90, 0x703E, 0x9E91, + 0x703F, 0x9E92, 0x7040, 0x9E93, 0x7041, 0x9E94, 0x7042, 0x9E95, + 0x7043, 0x9E96, 0x7044, 0x9E97, 0x7045, 0x9E98, 0x7046, 0x9E99, + 0x7047, 0x9E9A, 0x7048, 0x9E9B, 0x7049, 0x9E9C, 0x704A, 0x9E9D, + 0x704B, 0x9E9E, 0x704C, 0xB9E0, 0x704D, 0x9E9F, 0x704E, 0x9EA0, + 0x704F, 0xE5B0, 0x7050, 0x9EA1, 0x7051, 0x9EA2, 0x7052, 0x9EA3, + 0x7053, 0x9EA4, 0x7054, 0x9EA5, 0x7055, 0x9EA6, 0x7056, 0x9EA7, + 0x7057, 0x9EA8, 0x7058, 0x9EA9, 0x7059, 0x9EAA, 0x705A, 0x9EAB, + 0x705B, 0x9EAC, 0x705C, 0x9EAD, 0x705D, 0x9EAE, 0x705E, 0xE5B1, + 0x705F, 0x9EAF, 0x7060, 0x9EB0, 0x7061, 0x9EB1, 0x7062, 0x9EB2, + 0x7063, 0x9EB3, 0x7064, 0x9EB4, 0x7065, 0x9EB5, 0x7066, 0x9EB6, + 0x7067, 0x9EB7, 0x7068, 0x9EB8, 0x7069, 0x9EB9, 0x706A, 0x9EBA, + 0x706B, 0xBBF0, 0x706C, 0xECE1, 0x706D, 0xC3F0, 0x706E, 0x9EBB, + 0x706F, 0xB5C6, 0x7070, 0xBBD2, 0x7071, 0x9EBC, 0x7072, 0x9EBD, + 0x7073, 0x9EBE, 0x7074, 0x9EBF, 0x7075, 0xC1E9, 0x7076, 0xD4EE, + 0x7077, 0x9EC0, 0x7078, 0xBEC4, 0x7079, 0x9EC1, 0x707A, 0x9EC2, + 0x707B, 0x9EC3, 0x707C, 0xD7C6, 0x707D, 0x9EC4, 0x707E, 0xD4D6, + 0x707F, 0xB2D3, 0x7080, 0xECBE, 0x7081, 0x9EC5, 0x7082, 0x9EC6, + 0x7083, 0x9EC7, 0x7084, 0x9EC8, 0x7085, 0xEAC1, 0x7086, 0x9EC9, + 0x7087, 0x9ECA, 0x7088, 0x9ECB, 0x7089, 0xC2AF, 0x708A, 0xB4B6, + 0x708B, 0x9ECC, 0x708C, 0x9ECD, 0x708D, 0x9ECE, 0x708E, 0xD1D7, + 0x708F, 0x9ECF, 0x7090, 0x9ED0, 0x7091, 0x9ED1, 0x7092, 0xB3B4, + 0x7093, 0x9ED2, 0x7094, 0xC8B2, 0x7095, 0xBFBB, 0x7096, 0xECC0, + 0x7097, 0x9ED3, 0x7098, 0x9ED4, 0x7099, 0xD6CB, 0x709A, 0x9ED5, + 0x709B, 0x9ED6, 0x709C, 0xECBF, 0x709D, 0xECC1, 0x709E, 0x9ED7, + 0x709F, 0x9ED8, 0x70A0, 0x9ED9, 0x70A1, 0x9EDA, 0x70A2, 0x9EDB, + 0x70A3, 0x9EDC, 0x70A4, 0x9EDD, 0x70A5, 0x9EDE, 0x70A6, 0x9EDF, + 0x70A7, 0x9EE0, 0x70A8, 0x9EE1, 0x70A9, 0x9EE2, 0x70AA, 0x9EE3, + 0x70AB, 0xECC5, 0x70AC, 0xBEE6, 0x70AD, 0xCCBF, 0x70AE, 0xC5DA, + 0x70AF, 0xBEBC, 0x70B0, 0x9EE4, 0x70B1, 0xECC6, 0x70B2, 0x9EE5, + 0x70B3, 0xB1FE, 0x70B4, 0x9EE6, 0x70B5, 0x9EE7, 0x70B6, 0x9EE8, + 0x70B7, 0xECC4, 0x70B8, 0xD5A8, 0x70B9, 0xB5E3, 0x70BA, 0x9EE9, + 0x70BB, 0xECC2, 0x70BC, 0xC1B6, 0x70BD, 0xB3E3, 0x70BE, 0x9EEA, + 0x70BF, 0x9EEB, 0x70C0, 0xECC3, 0x70C1, 0xCBB8, 0x70C2, 0xC0C3, + 0x70C3, 0xCCFE, 0x70C4, 0x9EEC, 0x70C5, 0x9EED, 0x70C6, 0x9EEE, + 0x70C7, 0x9EEF, 0x70C8, 0xC1D2, 0x70C9, 0x9EF0, 0x70CA, 0xECC8, + 0x70CB, 0x9EF1, 0x70CC, 0x9EF2, 0x70CD, 0x9EF3, 0x70CE, 0x9EF4, + 0x70CF, 0x9EF5, 0x70D0, 0x9EF6, 0x70D1, 0x9EF7, 0x70D2, 0x9EF8, + 0x70D3, 0x9EF9, 0x70D4, 0x9EFA, 0x70D5, 0x9EFB, 0x70D6, 0x9EFC, + 0x70D7, 0x9EFD, 0x70D8, 0xBAE6, 0x70D9, 0xC0D3, 0x70DA, 0x9EFE, + 0x70DB, 0xD6F2, 0x70DC, 0x9F40, 0x70DD, 0x9F41, 0x70DE, 0x9F42, + 0x70DF, 0xD1CC, 0x70E0, 0x9F43, 0x70E1, 0x9F44, 0x70E2, 0x9F45, + 0x70E3, 0x9F46, 0x70E4, 0xBFBE, 0x70E5, 0x9F47, 0x70E6, 0xB7B3, + 0x70E7, 0xC9D5, 0x70E8, 0xECC7, 0x70E9, 0xBBE2, 0x70EA, 0x9F48, + 0x70EB, 0xCCCC, 0x70EC, 0xBDFD, 0x70ED, 0xC8C8, 0x70EE, 0x9F49, + 0x70EF, 0xCFA9, 0x70F0, 0x9F4A, 0x70F1, 0x9F4B, 0x70F2, 0x9F4C, + 0x70F3, 0x9F4D, 0x70F4, 0x9F4E, 0x70F5, 0x9F4F, 0x70F6, 0x9F50, + 0x70F7, 0xCDE9, 0x70F8, 0x9F51, 0x70F9, 0xC5EB, 0x70FA, 0x9F52, + 0x70FB, 0x9F53, 0x70FC, 0x9F54, 0x70FD, 0xB7E9, 0x70FE, 0x9F55, + 0x70FF, 0x9F56, 0x7100, 0x9F57, 0x7101, 0x9F58, 0x7102, 0x9F59, + 0x7103, 0x9F5A, 0x7104, 0x9F5B, 0x7105, 0x9F5C, 0x7106, 0x9F5D, + 0x7107, 0x9F5E, 0x7108, 0x9F5F, 0x7109, 0xD1C9, 0x710A, 0xBAB8, + 0x710B, 0x9F60, 0x710C, 0x9F61, 0x710D, 0x9F62, 0x710E, 0x9F63, + 0x710F, 0x9F64, 0x7110, 0xECC9, 0x7111, 0x9F65, 0x7112, 0x9F66, + 0x7113, 0xECCA, 0x7114, 0x9F67, 0x7115, 0xBBC0, 0x7116, 0xECCB, + 0x7117, 0x9F68, 0x7118, 0xECE2, 0x7119, 0xB1BA, 0x711A, 0xB7D9, + 0x711B, 0x9F69, 0x711C, 0x9F6A, 0x711D, 0x9F6B, 0x711E, 0x9F6C, + 0x711F, 0x9F6D, 0x7120, 0x9F6E, 0x7121, 0x9F6F, 0x7122, 0x9F70, + 0x7123, 0x9F71, 0x7124, 0x9F72, 0x7125, 0x9F73, 0x7126, 0xBDB9, + 0x7127, 0x9F74, 0x7128, 0x9F75, 0x7129, 0x9F76, 0x712A, 0x9F77, + 0x712B, 0x9F78, 0x712C, 0x9F79, 0x712D, 0x9F7A, 0x712E, 0x9F7B, + 0x712F, 0xECCC, 0x7130, 0xD1E6, 0x7131, 0xECCD, 0x7132, 0x9F7C, + 0x7133, 0x9F7D, 0x7134, 0x9F7E, 0x7135, 0x9F80, 0x7136, 0xC8BB, + 0x7137, 0x9F81, 0x7138, 0x9F82, 0x7139, 0x9F83, 0x713A, 0x9F84, + 0x713B, 0x9F85, 0x713C, 0x9F86, 0x713D, 0x9F87, 0x713E, 0x9F88, + 0x713F, 0x9F89, 0x7140, 0x9F8A, 0x7141, 0x9F8B, 0x7142, 0x9F8C, + 0x7143, 0x9F8D, 0x7144, 0x9F8E, 0x7145, 0xECD1, 0x7146, 0x9F8F, + 0x7147, 0x9F90, 0x7148, 0x9F91, 0x7149, 0x9F92, 0x714A, 0xECD3, + 0x714B, 0x9F93, 0x714C, 0xBBCD, 0x714D, 0x9F94, 0x714E, 0xBCE5, + 0x714F, 0x9F95, 0x7150, 0x9F96, 0x7151, 0x9F97, 0x7152, 0x9F98, + 0x7153, 0x9F99, 0x7154, 0x9F9A, 0x7155, 0x9F9B, 0x7156, 0x9F9C, + 0x7157, 0x9F9D, 0x7158, 0x9F9E, 0x7159, 0x9F9F, 0x715A, 0x9FA0, + 0x715B, 0x9FA1, 0x715C, 0xECCF, 0x715D, 0x9FA2, 0x715E, 0xC9B7, + 0x715F, 0x9FA3, 0x7160, 0x9FA4, 0x7161, 0x9FA5, 0x7162, 0x9FA6, + 0x7163, 0x9FA7, 0x7164, 0xC3BA, 0x7165, 0x9FA8, 0x7166, 0xECE3, + 0x7167, 0xD5D5, 0x7168, 0xECD0, 0x7169, 0x9FA9, 0x716A, 0x9FAA, + 0x716B, 0x9FAB, 0x716C, 0x9FAC, 0x716D, 0x9FAD, 0x716E, 0xD6F3, + 0x716F, 0x9FAE, 0x7170, 0x9FAF, 0x7171, 0x9FB0, 0x7172, 0xECD2, + 0x7173, 0xECCE, 0x7174, 0x9FB1, 0x7175, 0x9FB2, 0x7176, 0x9FB3, + 0x7177, 0x9FB4, 0x7178, 0xECD4, 0x7179, 0x9FB5, 0x717A, 0xECD5, + 0x717B, 0x9FB6, 0x717C, 0x9FB7, 0x717D, 0xC9BF, 0x717E, 0x9FB8, + 0x717F, 0x9FB9, 0x7180, 0x9FBA, 0x7181, 0x9FBB, 0x7182, 0x9FBC, + 0x7183, 0x9FBD, 0x7184, 0xCFA8, 0x7185, 0x9FBE, 0x7186, 0x9FBF, + 0x7187, 0x9FC0, 0x7188, 0x9FC1, 0x7189, 0x9FC2, 0x718A, 0xD0DC, + 0x718B, 0x9FC3, 0x718C, 0x9FC4, 0x718D, 0x9FC5, 0x718E, 0x9FC6, + 0x718F, 0xD1AC, 0x7190, 0x9FC7, 0x7191, 0x9FC8, 0x7192, 0x9FC9, + 0x7193, 0x9FCA, 0x7194, 0xC8DB, 0x7195, 0x9FCB, 0x7196, 0x9FCC, + 0x7197, 0x9FCD, 0x7198, 0xECD6, 0x7199, 0xCEF5, 0x719A, 0x9FCE, + 0x719B, 0x9FCF, 0x719C, 0x9FD0, 0x719D, 0x9FD1, 0x719E, 0x9FD2, + 0x719F, 0xCAEC, 0x71A0, 0xECDA, 0x71A1, 0x9FD3, 0x71A2, 0x9FD4, + 0x71A3, 0x9FD5, 0x71A4, 0x9FD6, 0x71A5, 0x9FD7, 0x71A6, 0x9FD8, + 0x71A7, 0x9FD9, 0x71A8, 0xECD9, 0x71A9, 0x9FDA, 0x71AA, 0x9FDB, + 0x71AB, 0x9FDC, 0x71AC, 0xB0BE, 0x71AD, 0x9FDD, 0x71AE, 0x9FDE, + 0x71AF, 0x9FDF, 0x71B0, 0x9FE0, 0x71B1, 0x9FE1, 0x71B2, 0x9FE2, + 0x71B3, 0xECD7, 0x71B4, 0x9FE3, 0x71B5, 0xECD8, 0x71B6, 0x9FE4, + 0x71B7, 0x9FE5, 0x71B8, 0x9FE6, 0x71B9, 0xECE4, 0x71BA, 0x9FE7, + 0x71BB, 0x9FE8, 0x71BC, 0x9FE9, 0x71BD, 0x9FEA, 0x71BE, 0x9FEB, + 0x71BF, 0x9FEC, 0x71C0, 0x9FED, 0x71C1, 0x9FEE, 0x71C2, 0x9FEF, + 0x71C3, 0xC8BC, 0x71C4, 0x9FF0, 0x71C5, 0x9FF1, 0x71C6, 0x9FF2, + 0x71C7, 0x9FF3, 0x71C8, 0x9FF4, 0x71C9, 0x9FF5, 0x71CA, 0x9FF6, + 0x71CB, 0x9FF7, 0x71CC, 0x9FF8, 0x71CD, 0x9FF9, 0x71CE, 0xC1C7, + 0x71CF, 0x9FFA, 0x71D0, 0x9FFB, 0x71D1, 0x9FFC, 0x71D2, 0x9FFD, + 0x71D3, 0x9FFE, 0x71D4, 0xECDC, 0x71D5, 0xD1E0, 0x71D6, 0xA040, + 0x71D7, 0xA041, 0x71D8, 0xA042, 0x71D9, 0xA043, 0x71DA, 0xA044, + 0x71DB, 0xA045, 0x71DC, 0xA046, 0x71DD, 0xA047, 0x71DE, 0xA048, + 0x71DF, 0xA049, 0x71E0, 0xECDB, 0x71E1, 0xA04A, 0x71E2, 0xA04B, + 0x71E3, 0xA04C, 0x71E4, 0xA04D, 0x71E5, 0xD4EF, 0x71E6, 0xA04E, + 0x71E7, 0xECDD, 0x71E8, 0xA04F, 0x71E9, 0xA050, 0x71EA, 0xA051, + 0x71EB, 0xA052, 0x71EC, 0xA053, 0x71ED, 0xA054, 0x71EE, 0xDBC6, + 0x71EF, 0xA055, 0x71F0, 0xA056, 0x71F1, 0xA057, 0x71F2, 0xA058, + 0x71F3, 0xA059, 0x71F4, 0xA05A, 0x71F5, 0xA05B, 0x71F6, 0xA05C, + 0x71F7, 0xA05D, 0x71F8, 0xA05E, 0x71F9, 0xECDE, 0x71FA, 0xA05F, + 0x71FB, 0xA060, 0x71FC, 0xA061, 0x71FD, 0xA062, 0x71FE, 0xA063, + 0x71FF, 0xA064, 0x7200, 0xA065, 0x7201, 0xA066, 0x7202, 0xA067, + 0x7203, 0xA068, 0x7204, 0xA069, 0x7205, 0xA06A, 0x7206, 0xB1AC, + 0x7207, 0xA06B, 0x7208, 0xA06C, 0x7209, 0xA06D, 0x720A, 0xA06E, + 0x720B, 0xA06F, 0x720C, 0xA070, 0x720D, 0xA071, 0x720E, 0xA072, + 0x720F, 0xA073, 0x7210, 0xA074, 0x7211, 0xA075, 0x7212, 0xA076, + 0x7213, 0xA077, 0x7214, 0xA078, 0x7215, 0xA079, 0x7216, 0xA07A, + 0x7217, 0xA07B, 0x7218, 0xA07C, 0x7219, 0xA07D, 0x721A, 0xA07E, + 0x721B, 0xA080, 0x721C, 0xA081, 0x721D, 0xECDF, 0x721E, 0xA082, + 0x721F, 0xA083, 0x7220, 0xA084, 0x7221, 0xA085, 0x7222, 0xA086, + 0x7223, 0xA087, 0x7224, 0xA088, 0x7225, 0xA089, 0x7226, 0xA08A, + 0x7227, 0xA08B, 0x7228, 0xECE0, 0x7229, 0xA08C, 0x722A, 0xD7A6, + 0x722B, 0xA08D, 0x722C, 0xC5C0, 0x722D, 0xA08E, 0x722E, 0xA08F, + 0x722F, 0xA090, 0x7230, 0xEBBC, 0x7231, 0xB0AE, 0x7232, 0xA091, + 0x7233, 0xA092, 0x7234, 0xA093, 0x7235, 0xBEF4, 0x7236, 0xB8B8, + 0x7237, 0xD2AF, 0x7238, 0xB0D6, 0x7239, 0xB5F9, 0x723A, 0xA094, + 0x723B, 0xD8B3, 0x723C, 0xA095, 0x723D, 0xCBAC, 0x723E, 0xA096, + 0x723F, 0xE3DD, 0x7240, 0xA097, 0x7241, 0xA098, 0x7242, 0xA099, + 0x7243, 0xA09A, 0x7244, 0xA09B, 0x7245, 0xA09C, 0x7246, 0xA09D, + 0x7247, 0xC6AC, 0x7248, 0xB0E6, 0x7249, 0xA09E, 0x724A, 0xA09F, + 0x724B, 0xA0A0, 0x724C, 0xC5C6, 0x724D, 0xEBB9, 0x724E, 0xA0A1, + 0x724F, 0xA0A2, 0x7250, 0xA0A3, 0x7251, 0xA0A4, 0x7252, 0xEBBA, + 0x7253, 0xA0A5, 0x7254, 0xA0A6, 0x7255, 0xA0A7, 0x7256, 0xEBBB, + 0x7257, 0xA0A8, 0x7258, 0xA0A9, 0x7259, 0xD1C0, 0x725A, 0xA0AA, + 0x725B, 0xC5A3, 0x725C, 0xA0AB, 0x725D, 0xEAF2, 0x725E, 0xA0AC, + 0x725F, 0xC4B2, 0x7260, 0xA0AD, 0x7261, 0xC4B5, 0x7262, 0xC0CE, + 0x7263, 0xA0AE, 0x7264, 0xA0AF, 0x7265, 0xA0B0, 0x7266, 0xEAF3, + 0x7267, 0xC4C1, 0x7268, 0xA0B1, 0x7269, 0xCEEF, 0x726A, 0xA0B2, + 0x726B, 0xA0B3, 0x726C, 0xA0B4, 0x726D, 0xA0B5, 0x726E, 0xEAF0, + 0x726F, 0xEAF4, 0x7270, 0xA0B6, 0x7271, 0xA0B7, 0x7272, 0xC9FC, + 0x7273, 0xA0B8, 0x7274, 0xA0B9, 0x7275, 0xC7A3, 0x7276, 0xA0BA, + 0x7277, 0xA0BB, 0x7278, 0xA0BC, 0x7279, 0xCCD8, 0x727A, 0xCEFE, + 0x727B, 0xA0BD, 0x727C, 0xA0BE, 0x727D, 0xA0BF, 0x727E, 0xEAF5, + 0x727F, 0xEAF6, 0x7280, 0xCFAC, 0x7281, 0xC0E7, 0x7282, 0xA0C0, + 0x7283, 0xA0C1, 0x7284, 0xEAF7, 0x7285, 0xA0C2, 0x7286, 0xA0C3, + 0x7287, 0xA0C4, 0x7288, 0xA0C5, 0x7289, 0xA0C6, 0x728A, 0xB6BF, + 0x728B, 0xEAF8, 0x728C, 0xA0C7, 0x728D, 0xEAF9, 0x728E, 0xA0C8, + 0x728F, 0xEAFA, 0x7290, 0xA0C9, 0x7291, 0xA0CA, 0x7292, 0xEAFB, + 0x7293, 0xA0CB, 0x7294, 0xA0CC, 0x7295, 0xA0CD, 0x7296, 0xA0CE, + 0x7297, 0xA0CF, 0x7298, 0xA0D0, 0x7299, 0xA0D1, 0x729A, 0xA0D2, + 0x729B, 0xA0D3, 0x729C, 0xA0D4, 0x729D, 0xA0D5, 0x729E, 0xA0D6, + 0x729F, 0xEAF1, 0x72A0, 0xA0D7, 0x72A1, 0xA0D8, 0x72A2, 0xA0D9, + 0x72A3, 0xA0DA, 0x72A4, 0xA0DB, 0x72A5, 0xA0DC, 0x72A6, 0xA0DD, + 0x72A7, 0xA0DE, 0x72A8, 0xA0DF, 0x72A9, 0xA0E0, 0x72AA, 0xA0E1, + 0x72AB, 0xA0E2, 0x72AC, 0xC8AE, 0x72AD, 0xE1EB, 0x72AE, 0xA0E3, + 0x72AF, 0xB7B8, 0x72B0, 0xE1EC, 0x72B1, 0xA0E4, 0x72B2, 0xA0E5, + 0x72B3, 0xA0E6, 0x72B4, 0xE1ED, 0x72B5, 0xA0E7, 0x72B6, 0xD7B4, + 0x72B7, 0xE1EE, 0x72B8, 0xE1EF, 0x72B9, 0xD3CC, 0x72BA, 0xA0E8, + 0x72BB, 0xA0E9, 0x72BC, 0xA0EA, 0x72BD, 0xA0EB, 0x72BE, 0xA0EC, + 0x72BF, 0xA0ED, 0x72C0, 0xA0EE, 0x72C1, 0xE1F1, 0x72C2, 0xBFF1, + 0x72C3, 0xE1F0, 0x72C4, 0xB5D2, 0x72C5, 0xA0EF, 0x72C6, 0xA0F0, + 0x72C7, 0xA0F1, 0x72C8, 0xB1B7, 0x72C9, 0xA0F2, 0x72CA, 0xA0F3, + 0x72CB, 0xA0F4, 0x72CC, 0xA0F5, 0x72CD, 0xE1F3, 0x72CE, 0xE1F2, + 0x72CF, 0xA0F6, 0x72D0, 0xBAFC, 0x72D1, 0xA0F7, 0x72D2, 0xE1F4, + 0x72D3, 0xA0F8, 0x72D4, 0xA0F9, 0x72D5, 0xA0FA, 0x72D6, 0xA0FB, + 0x72D7, 0xB9B7, 0x72D8, 0xA0FC, 0x72D9, 0xBED1, 0x72DA, 0xA0FD, + 0x72DB, 0xA0FE, 0x72DC, 0xAA40, 0x72DD, 0xAA41, 0x72DE, 0xC4FC, + 0x72DF, 0xAA42, 0x72E0, 0xBADD, 0x72E1, 0xBDC6, 0x72E2, 0xAA43, + 0x72E3, 0xAA44, 0x72E4, 0xAA45, 0x72E5, 0xAA46, 0x72E6, 0xAA47, + 0x72E7, 0xAA48, 0x72E8, 0xE1F5, 0x72E9, 0xE1F7, 0x72EA, 0xAA49, + 0x72EB, 0xAA4A, 0x72EC, 0xB6C0, 0x72ED, 0xCFC1, 0x72EE, 0xCAA8, + 0x72EF, 0xE1F6, 0x72F0, 0xD5F8, 0x72F1, 0xD3FC, 0x72F2, 0xE1F8, + 0x72F3, 0xE1FC, 0x72F4, 0xE1F9, 0x72F5, 0xAA4B, 0x72F6, 0xAA4C, + 0x72F7, 0xE1FA, 0x72F8, 0xC0EA, 0x72F9, 0xAA4D, 0x72FA, 0xE1FE, + 0x72FB, 0xE2A1, 0x72FC, 0xC0C7, 0x72FD, 0xAA4E, 0x72FE, 0xAA4F, + 0x72FF, 0xAA50, 0x7300, 0xAA51, 0x7301, 0xE1FB, 0x7302, 0xAA52, + 0x7303, 0xE1FD, 0x7304, 0xAA53, 0x7305, 0xAA54, 0x7306, 0xAA55, + 0x7307, 0xAA56, 0x7308, 0xAA57, 0x7309, 0xAA58, 0x730A, 0xE2A5, + 0x730B, 0xAA59, 0x730C, 0xAA5A, 0x730D, 0xAA5B, 0x730E, 0xC1D4, + 0x730F, 0xAA5C, 0x7310, 0xAA5D, 0x7311, 0xAA5E, 0x7312, 0xAA5F, + 0x7313, 0xE2A3, 0x7314, 0xAA60, 0x7315, 0xE2A8, 0x7316, 0xB2FE, + 0x7317, 0xE2A2, 0x7318, 0xAA61, 0x7319, 0xAA62, 0x731A, 0xAA63, + 0x731B, 0xC3CD, 0x731C, 0xB2C2, 0x731D, 0xE2A7, 0x731E, 0xE2A6, + 0x731F, 0xAA64, 0x7320, 0xAA65, 0x7321, 0xE2A4, 0x7322, 0xE2A9, + 0x7323, 0xAA66, 0x7324, 0xAA67, 0x7325, 0xE2AB, 0x7326, 0xAA68, + 0x7327, 0xAA69, 0x7328, 0xAA6A, 0x7329, 0xD0C9, 0x732A, 0xD6ED, + 0x732B, 0xC3A8, 0x732C, 0xE2AC, 0x732D, 0xAA6B, 0x732E, 0xCFD7, + 0x732F, 0xAA6C, 0x7330, 0xAA6D, 0x7331, 0xE2AE, 0x7332, 0xAA6E, + 0x7333, 0xAA6F, 0x7334, 0xBAEF, 0x7335, 0xAA70, 0x7336, 0xAA71, + 0x7337, 0xE9E0, 0x7338, 0xE2AD, 0x7339, 0xE2AA, 0x733A, 0xAA72, + 0x733B, 0xAA73, 0x733C, 0xAA74, 0x733D, 0xAA75, 0x733E, 0xBBAB, + 0x733F, 0xD4B3, 0x7340, 0xAA76, 0x7341, 0xAA77, 0x7342, 0xAA78, + 0x7343, 0xAA79, 0x7344, 0xAA7A, 0x7345, 0xAA7B, 0x7346, 0xAA7C, + 0x7347, 0xAA7D, 0x7348, 0xAA7E, 0x7349, 0xAA80, 0x734A, 0xAA81, + 0x734B, 0xAA82, 0x734C, 0xAA83, 0x734D, 0xE2B0, 0x734E, 0xAA84, + 0x734F, 0xAA85, 0x7350, 0xE2AF, 0x7351, 0xAA86, 0x7352, 0xE9E1, + 0x7353, 0xAA87, 0x7354, 0xAA88, 0x7355, 0xAA89, 0x7356, 0xAA8A, + 0x7357, 0xE2B1, 0x7358, 0xAA8B, 0x7359, 0xAA8C, 0x735A, 0xAA8D, + 0x735B, 0xAA8E, 0x735C, 0xAA8F, 0x735D, 0xAA90, 0x735E, 0xAA91, + 0x735F, 0xAA92, 0x7360, 0xE2B2, 0x7361, 0xAA93, 0x7362, 0xAA94, + 0x7363, 0xAA95, 0x7364, 0xAA96, 0x7365, 0xAA97, 0x7366, 0xAA98, + 0x7367, 0xAA99, 0x7368, 0xAA9A, 0x7369, 0xAA9B, 0x736A, 0xAA9C, + 0x736B, 0xAA9D, 0x736C, 0xE2B3, 0x736D, 0xCCA1, 0x736E, 0xAA9E, + 0x736F, 0xE2B4, 0x7370, 0xAA9F, 0x7371, 0xAAA0, 0x7372, 0xAB40, + 0x7373, 0xAB41, 0x7374, 0xAB42, 0x7375, 0xAB43, 0x7376, 0xAB44, + 0x7377, 0xAB45, 0x7378, 0xAB46, 0x7379, 0xAB47, 0x737A, 0xAB48, + 0x737B, 0xAB49, 0x737C, 0xAB4A, 0x737D, 0xAB4B, 0x737E, 0xE2B5, + 0x737F, 0xAB4C, 0x7380, 0xAB4D, 0x7381, 0xAB4E, 0x7382, 0xAB4F, + 0x7383, 0xAB50, 0x7384, 0xD0FE, 0x7385, 0xAB51, 0x7386, 0xAB52, + 0x7387, 0xC2CA, 0x7388, 0xAB53, 0x7389, 0xD3F1, 0x738A, 0xAB54, + 0x738B, 0xCDF5, 0x738C, 0xAB55, 0x738D, 0xAB56, 0x738E, 0xE7E0, + 0x738F, 0xAB57, 0x7390, 0xAB58, 0x7391, 0xE7E1, 0x7392, 0xAB59, + 0x7393, 0xAB5A, 0x7394, 0xAB5B, 0x7395, 0xAB5C, 0x7396, 0xBEC1, + 0x7397, 0xAB5D, 0x7398, 0xAB5E, 0x7399, 0xAB5F, 0x739A, 0xAB60, + 0x739B, 0xC2EA, 0x739C, 0xAB61, 0x739D, 0xAB62, 0x739E, 0xAB63, + 0x739F, 0xE7E4, 0x73A0, 0xAB64, 0x73A1, 0xAB65, 0x73A2, 0xE7E3, + 0x73A3, 0xAB66, 0x73A4, 0xAB67, 0x73A5, 0xAB68, 0x73A6, 0xAB69, + 0x73A7, 0xAB6A, 0x73A8, 0xAB6B, 0x73A9, 0xCDE6, 0x73AA, 0xAB6C, + 0x73AB, 0xC3B5, 0x73AC, 0xAB6D, 0x73AD, 0xAB6E, 0x73AE, 0xE7E2, + 0x73AF, 0xBBB7, 0x73B0, 0xCFD6, 0x73B1, 0xAB6F, 0x73B2, 0xC1E1, + 0x73B3, 0xE7E9, 0x73B4, 0xAB70, 0x73B5, 0xAB71, 0x73B6, 0xAB72, + 0x73B7, 0xE7E8, 0x73B8, 0xAB73, 0x73B9, 0xAB74, 0x73BA, 0xE7F4, + 0x73BB, 0xB2A3, 0x73BC, 0xAB75, 0x73BD, 0xAB76, 0x73BE, 0xAB77, + 0x73BF, 0xAB78, 0x73C0, 0xE7EA, 0x73C1, 0xAB79, 0x73C2, 0xE7E6, + 0x73C3, 0xAB7A, 0x73C4, 0xAB7B, 0x73C5, 0xAB7C, 0x73C6, 0xAB7D, + 0x73C7, 0xAB7E, 0x73C8, 0xE7EC, 0x73C9, 0xE7EB, 0x73CA, 0xC9BA, + 0x73CB, 0xAB80, 0x73CC, 0xAB81, 0x73CD, 0xD5E4, 0x73CE, 0xAB82, + 0x73CF, 0xE7E5, 0x73D0, 0xB7A9, 0x73D1, 0xE7E7, 0x73D2, 0xAB83, + 0x73D3, 0xAB84, 0x73D4, 0xAB85, 0x73D5, 0xAB86, 0x73D6, 0xAB87, + 0x73D7, 0xAB88, 0x73D8, 0xAB89, 0x73D9, 0xE7EE, 0x73DA, 0xAB8A, + 0x73DB, 0xAB8B, 0x73DC, 0xAB8C, 0x73DD, 0xAB8D, 0x73DE, 0xE7F3, + 0x73DF, 0xAB8E, 0x73E0, 0xD6E9, 0x73E1, 0xAB8F, 0x73E2, 0xAB90, + 0x73E3, 0xAB91, 0x73E4, 0xAB92, 0x73E5, 0xE7ED, 0x73E6, 0xAB93, + 0x73E7, 0xE7F2, 0x73E8, 0xAB94, 0x73E9, 0xE7F1, 0x73EA, 0xAB95, + 0x73EB, 0xAB96, 0x73EC, 0xAB97, 0x73ED, 0xB0E0, 0x73EE, 0xAB98, + 0x73EF, 0xAB99, 0x73F0, 0xAB9A, 0x73F1, 0xAB9B, 0x73F2, 0xE7F5, + 0x73F3, 0xAB9C, 0x73F4, 0xAB9D, 0x73F5, 0xAB9E, 0x73F6, 0xAB9F, + 0x73F7, 0xABA0, 0x73F8, 0xAC40, 0x73F9, 0xAC41, 0x73FA, 0xAC42, + 0x73FB, 0xAC43, 0x73FC, 0xAC44, 0x73FD, 0xAC45, 0x73FE, 0xAC46, + 0x73FF, 0xAC47, 0x7400, 0xAC48, 0x7401, 0xAC49, 0x7402, 0xAC4A, + 0x7403, 0xC7F2, 0x7404, 0xAC4B, 0x7405, 0xC0C5, 0x7406, 0xC0ED, + 0x7407, 0xAC4C, 0x7408, 0xAC4D, 0x7409, 0xC1F0, 0x740A, 0xE7F0, + 0x740B, 0xAC4E, 0x740C, 0xAC4F, 0x740D, 0xAC50, 0x740E, 0xAC51, + 0x740F, 0xE7F6, 0x7410, 0xCBF6, 0x7411, 0xAC52, 0x7412, 0xAC53, + 0x7413, 0xAC54, 0x7414, 0xAC55, 0x7415, 0xAC56, 0x7416, 0xAC57, + 0x7417, 0xAC58, 0x7418, 0xAC59, 0x7419, 0xAC5A, 0x741A, 0xE8A2, + 0x741B, 0xE8A1, 0x741C, 0xAC5B, 0x741D, 0xAC5C, 0x741E, 0xAC5D, + 0x741F, 0xAC5E, 0x7420, 0xAC5F, 0x7421, 0xAC60, 0x7422, 0xD7C1, + 0x7423, 0xAC61, 0x7424, 0xAC62, 0x7425, 0xE7FA, 0x7426, 0xE7F9, + 0x7427, 0xAC63, 0x7428, 0xE7FB, 0x7429, 0xAC64, 0x742A, 0xE7F7, + 0x742B, 0xAC65, 0x742C, 0xE7FE, 0x742D, 0xAC66, 0x742E, 0xE7FD, + 0x742F, 0xAC67, 0x7430, 0xE7FC, 0x7431, 0xAC68, 0x7432, 0xAC69, + 0x7433, 0xC1D5, 0x7434, 0xC7D9, 0x7435, 0xC5FD, 0x7436, 0xC5C3, + 0x7437, 0xAC6A, 0x7438, 0xAC6B, 0x7439, 0xAC6C, 0x743A, 0xAC6D, + 0x743B, 0xAC6E, 0x743C, 0xC7ED, 0x743D, 0xAC6F, 0x743E, 0xAC70, + 0x743F, 0xAC71, 0x7440, 0xAC72, 0x7441, 0xE8A3, 0x7442, 0xAC73, + 0x7443, 0xAC74, 0x7444, 0xAC75, 0x7445, 0xAC76, 0x7446, 0xAC77, + 0x7447, 0xAC78, 0x7448, 0xAC79, 0x7449, 0xAC7A, 0x744A, 0xAC7B, + 0x744B, 0xAC7C, 0x744C, 0xAC7D, 0x744D, 0xAC7E, 0x744E, 0xAC80, + 0x744F, 0xAC81, 0x7450, 0xAC82, 0x7451, 0xAC83, 0x7452, 0xAC84, + 0x7453, 0xAC85, 0x7454, 0xAC86, 0x7455, 0xE8A6, 0x7456, 0xAC87, + 0x7457, 0xE8A5, 0x7458, 0xAC88, 0x7459, 0xE8A7, 0x745A, 0xBAF7, + 0x745B, 0xE7F8, 0x745C, 0xE8A4, 0x745D, 0xAC89, 0x745E, 0xC8F0, + 0x745F, 0xC9AA, 0x7460, 0xAC8A, 0x7461, 0xAC8B, 0x7462, 0xAC8C, + 0x7463, 0xAC8D, 0x7464, 0xAC8E, 0x7465, 0xAC8F, 0x7466, 0xAC90, + 0x7467, 0xAC91, 0x7468, 0xAC92, 0x7469, 0xAC93, 0x746A, 0xAC94, + 0x746B, 0xAC95, 0x746C, 0xAC96, 0x746D, 0xE8A9, 0x746E, 0xAC97, + 0x746F, 0xAC98, 0x7470, 0xB9E5, 0x7471, 0xAC99, 0x7472, 0xAC9A, + 0x7473, 0xAC9B, 0x7474, 0xAC9C, 0x7475, 0xAC9D, 0x7476, 0xD1FE, + 0x7477, 0xE8A8, 0x7478, 0xAC9E, 0x7479, 0xAC9F, 0x747A, 0xACA0, + 0x747B, 0xAD40, 0x747C, 0xAD41, 0x747D, 0xAD42, 0x747E, 0xE8AA, + 0x747F, 0xAD43, 0x7480, 0xE8AD, 0x7481, 0xE8AE, 0x7482, 0xAD44, + 0x7483, 0xC1A7, 0x7484, 0xAD45, 0x7485, 0xAD46, 0x7486, 0xAD47, + 0x7487, 0xE8AF, 0x7488, 0xAD48, 0x7489, 0xAD49, 0x748A, 0xAD4A, + 0x748B, 0xE8B0, 0x748C, 0xAD4B, 0x748D, 0xAD4C, 0x748E, 0xE8AC, + 0x748F, 0xAD4D, 0x7490, 0xE8B4, 0x7491, 0xAD4E, 0x7492, 0xAD4F, + 0x7493, 0xAD50, 0x7494, 0xAD51, 0x7495, 0xAD52, 0x7496, 0xAD53, + 0x7497, 0xAD54, 0x7498, 0xAD55, 0x7499, 0xAD56, 0x749A, 0xAD57, + 0x749B, 0xAD58, 0x749C, 0xE8AB, 0x749D, 0xAD59, 0x749E, 0xE8B1, + 0x749F, 0xAD5A, 0x74A0, 0xAD5B, 0x74A1, 0xAD5C, 0x74A2, 0xAD5D, + 0x74A3, 0xAD5E, 0x74A4, 0xAD5F, 0x74A5, 0xAD60, 0x74A6, 0xAD61, + 0x74A7, 0xE8B5, 0x74A8, 0xE8B2, 0x74A9, 0xE8B3, 0x74AA, 0xAD62, + 0x74AB, 0xAD63, 0x74AC, 0xAD64, 0x74AD, 0xAD65, 0x74AE, 0xAD66, + 0x74AF, 0xAD67, 0x74B0, 0xAD68, 0x74B1, 0xAD69, 0x74B2, 0xAD6A, + 0x74B3, 0xAD6B, 0x74B4, 0xAD6C, 0x74B5, 0xAD6D, 0x74B6, 0xAD6E, + 0x74B7, 0xAD6F, 0x74B8, 0xAD70, 0x74B9, 0xAD71, 0x74BA, 0xE8B7, + 0x74BB, 0xAD72, 0x74BC, 0xAD73, 0x74BD, 0xAD74, 0x74BE, 0xAD75, + 0x74BF, 0xAD76, 0x74C0, 0xAD77, 0x74C1, 0xAD78, 0x74C2, 0xAD79, + 0x74C3, 0xAD7A, 0x74C4, 0xAD7B, 0x74C5, 0xAD7C, 0x74C6, 0xAD7D, + 0x74C7, 0xAD7E, 0x74C8, 0xAD80, 0x74C9, 0xAD81, 0x74CA, 0xAD82, + 0x74CB, 0xAD83, 0x74CC, 0xAD84, 0x74CD, 0xAD85, 0x74CE, 0xAD86, + 0x74CF, 0xAD87, 0x74D0, 0xAD88, 0x74D1, 0xAD89, 0x74D2, 0xE8B6, + 0x74D3, 0xAD8A, 0x74D4, 0xAD8B, 0x74D5, 0xAD8C, 0x74D6, 0xAD8D, + 0x74D7, 0xAD8E, 0x74D8, 0xAD8F, 0x74D9, 0xAD90, 0x74DA, 0xAD91, + 0x74DB, 0xAD92, 0x74DC, 0xB9CF, 0x74DD, 0xAD93, 0x74DE, 0xF0AC, + 0x74DF, 0xAD94, 0x74E0, 0xF0AD, 0x74E1, 0xAD95, 0x74E2, 0xC6B0, + 0x74E3, 0xB0EA, 0x74E4, 0xC8BF, 0x74E5, 0xAD96, 0x74E6, 0xCDDF, + 0x74E7, 0xAD97, 0x74E8, 0xAD98, 0x74E9, 0xAD99, 0x74EA, 0xAD9A, + 0x74EB, 0xAD9B, 0x74EC, 0xAD9C, 0x74ED, 0xAD9D, 0x74EE, 0xCECD, + 0x74EF, 0xEAB1, 0x74F0, 0xAD9E, 0x74F1, 0xAD9F, 0x74F2, 0xADA0, + 0x74F3, 0xAE40, 0x74F4, 0xEAB2, 0x74F5, 0xAE41, 0x74F6, 0xC6BF, + 0x74F7, 0xB4C9, 0x74F8, 0xAE42, 0x74F9, 0xAE43, 0x74FA, 0xAE44, + 0x74FB, 0xAE45, 0x74FC, 0xAE46, 0x74FD, 0xAE47, 0x74FE, 0xAE48, + 0x74FF, 0xEAB3, 0x7500, 0xAE49, 0x7501, 0xAE4A, 0x7502, 0xAE4B, + 0x7503, 0xAE4C, 0x7504, 0xD5E7, 0x7505, 0xAE4D, 0x7506, 0xAE4E, + 0x7507, 0xAE4F, 0x7508, 0xAE50, 0x7509, 0xAE51, 0x750A, 0xAE52, + 0x750B, 0xAE53, 0x750C, 0xAE54, 0x750D, 0xDDF9, 0x750E, 0xAE55, + 0x750F, 0xEAB4, 0x7510, 0xAE56, 0x7511, 0xEAB5, 0x7512, 0xAE57, + 0x7513, 0xEAB6, 0x7514, 0xAE58, 0x7515, 0xAE59, 0x7516, 0xAE5A, + 0x7517, 0xAE5B, 0x7518, 0xB8CA, 0x7519, 0xDFB0, 0x751A, 0xC9F5, + 0x751B, 0xAE5C, 0x751C, 0xCCF0, 0x751D, 0xAE5D, 0x751E, 0xAE5E, + 0x751F, 0xC9FA, 0x7520, 0xAE5F, 0x7521, 0xAE60, 0x7522, 0xAE61, + 0x7523, 0xAE62, 0x7524, 0xAE63, 0x7525, 0xC9FB, 0x7526, 0xAE64, + 0x7527, 0xAE65, 0x7528, 0xD3C3, 0x7529, 0xCBA6, 0x752A, 0xAE66, + 0x752B, 0xB8A6, 0x752C, 0xF0AE, 0x752D, 0xB1C2, 0x752E, 0xAE67, + 0x752F, 0xE5B8, 0x7530, 0xCCEF, 0x7531, 0xD3C9, 0x7532, 0xBCD7, + 0x7533, 0xC9EA, 0x7534, 0xAE68, 0x7535, 0xB5E7, 0x7536, 0xAE69, + 0x7537, 0xC4D0, 0x7538, 0xB5E9, 0x7539, 0xAE6A, 0x753A, 0xEEAE, + 0x753B, 0xBBAD, 0x753C, 0xAE6B, 0x753D, 0xAE6C, 0x753E, 0xE7DE, + 0x753F, 0xAE6D, 0x7540, 0xEEAF, 0x7541, 0xAE6E, 0x7542, 0xAE6F, + 0x7543, 0xAE70, 0x7544, 0xAE71, 0x7545, 0xB3A9, 0x7546, 0xAE72, + 0x7547, 0xAE73, 0x7548, 0xEEB2, 0x7549, 0xAE74, 0x754A, 0xAE75, + 0x754B, 0xEEB1, 0x754C, 0xBDE7, 0x754D, 0xAE76, 0x754E, 0xEEB0, + 0x754F, 0xCEB7, 0x7550, 0xAE77, 0x7551, 0xAE78, 0x7552, 0xAE79, + 0x7553, 0xAE7A, 0x7554, 0xC5CF, 0x7555, 0xAE7B, 0x7556, 0xAE7C, + 0x7557, 0xAE7D, 0x7558, 0xAE7E, 0x7559, 0xC1F4, 0x755A, 0xDBCE, + 0x755B, 0xEEB3, 0x755C, 0xD0F3, 0x755D, 0xAE80, 0x755E, 0xAE81, + 0x755F, 0xAE82, 0x7560, 0xAE83, 0x7561, 0xAE84, 0x7562, 0xAE85, + 0x7563, 0xAE86, 0x7564, 0xAE87, 0x7565, 0xC2D4, 0x7566, 0xC6E8, + 0x7567, 0xAE88, 0x7568, 0xAE89, 0x7569, 0xAE8A, 0x756A, 0xB7AC, + 0x756B, 0xAE8B, 0x756C, 0xAE8C, 0x756D, 0xAE8D, 0x756E, 0xAE8E, + 0x756F, 0xAE8F, 0x7570, 0xAE90, 0x7571, 0xAE91, 0x7572, 0xEEB4, + 0x7573, 0xAE92, 0x7574, 0xB3EB, 0x7575, 0xAE93, 0x7576, 0xAE94, + 0x7577, 0xAE95, 0x7578, 0xBBFB, 0x7579, 0xEEB5, 0x757A, 0xAE96, + 0x757B, 0xAE97, 0x757C, 0xAE98, 0x757D, 0xAE99, 0x757E, 0xAE9A, + 0x757F, 0xE7DC, 0x7580, 0xAE9B, 0x7581, 0xAE9C, 0x7582, 0xAE9D, + 0x7583, 0xEEB6, 0x7584, 0xAE9E, 0x7585, 0xAE9F, 0x7586, 0xBDAE, + 0x7587, 0xAEA0, 0x7588, 0xAF40, 0x7589, 0xAF41, 0x758A, 0xAF42, + 0x758B, 0xF1E2, 0x758C, 0xAF43, 0x758D, 0xAF44, 0x758E, 0xAF45, + 0x758F, 0xCAE8, 0x7590, 0xAF46, 0x7591, 0xD2C9, 0x7592, 0xF0DA, + 0x7593, 0xAF47, 0x7594, 0xF0DB, 0x7595, 0xAF48, 0x7596, 0xF0DC, + 0x7597, 0xC1C6, 0x7598, 0xAF49, 0x7599, 0xB8ED, 0x759A, 0xBECE, + 0x759B, 0xAF4A, 0x759C, 0xAF4B, 0x759D, 0xF0DE, 0x759E, 0xAF4C, + 0x759F, 0xC5B1, 0x75A0, 0xF0DD, 0x75A1, 0xD1F1, 0x75A2, 0xAF4D, + 0x75A3, 0xF0E0, 0x75A4, 0xB0CC, 0x75A5, 0xBDEA, 0x75A6, 0xAF4E, + 0x75A7, 0xAF4F, 0x75A8, 0xAF50, 0x75A9, 0xAF51, 0x75AA, 0xAF52, + 0x75AB, 0xD2DF, 0x75AC, 0xF0DF, 0x75AD, 0xAF53, 0x75AE, 0xB4AF, + 0x75AF, 0xB7E8, 0x75B0, 0xF0E6, 0x75B1, 0xF0E5, 0x75B2, 0xC6A3, + 0x75B3, 0xF0E1, 0x75B4, 0xF0E2, 0x75B5, 0xB4C3, 0x75B6, 0xAF54, + 0x75B7, 0xAF55, 0x75B8, 0xF0E3, 0x75B9, 0xD5EE, 0x75BA, 0xAF56, + 0x75BB, 0xAF57, 0x75BC, 0xCCDB, 0x75BD, 0xBED2, 0x75BE, 0xBCB2, + 0x75BF, 0xAF58, 0x75C0, 0xAF59, 0x75C1, 0xAF5A, 0x75C2, 0xF0E8, + 0x75C3, 0xF0E7, 0x75C4, 0xF0E4, 0x75C5, 0xB2A1, 0x75C6, 0xAF5B, + 0x75C7, 0xD6A2, 0x75C8, 0xD3B8, 0x75C9, 0xBEB7, 0x75CA, 0xC8AC, + 0x75CB, 0xAF5C, 0x75CC, 0xAF5D, 0x75CD, 0xF0EA, 0x75CE, 0xAF5E, + 0x75CF, 0xAF5F, 0x75D0, 0xAF60, 0x75D1, 0xAF61, 0x75D2, 0xD1F7, + 0x75D3, 0xAF62, 0x75D4, 0xD6CC, 0x75D5, 0xBADB, 0x75D6, 0xF0E9, + 0x75D7, 0xAF63, 0x75D8, 0xB6BB, 0x75D9, 0xAF64, 0x75DA, 0xAF65, + 0x75DB, 0xCDB4, 0x75DC, 0xAF66, 0x75DD, 0xAF67, 0x75DE, 0xC6A6, + 0x75DF, 0xAF68, 0x75E0, 0xAF69, 0x75E1, 0xAF6A, 0x75E2, 0xC1A1, + 0x75E3, 0xF0EB, 0x75E4, 0xF0EE, 0x75E5, 0xAF6B, 0x75E6, 0xF0ED, + 0x75E7, 0xF0F0, 0x75E8, 0xF0EC, 0x75E9, 0xAF6C, 0x75EA, 0xBBBE, + 0x75EB, 0xF0EF, 0x75EC, 0xAF6D, 0x75ED, 0xAF6E, 0x75EE, 0xAF6F, + 0x75EF, 0xAF70, 0x75F0, 0xCCB5, 0x75F1, 0xF0F2, 0x75F2, 0xAF71, + 0x75F3, 0xAF72, 0x75F4, 0xB3D5, 0x75F5, 0xAF73, 0x75F6, 0xAF74, + 0x75F7, 0xAF75, 0x75F8, 0xAF76, 0x75F9, 0xB1D4, 0x75FA, 0xAF77, + 0x75FB, 0xAF78, 0x75FC, 0xF0F3, 0x75FD, 0xAF79, 0x75FE, 0xAF7A, + 0x75FF, 0xF0F4, 0x7600, 0xF0F6, 0x7601, 0xB4E1, 0x7602, 0xAF7B, + 0x7603, 0xF0F1, 0x7604, 0xAF7C, 0x7605, 0xF0F7, 0x7606, 0xAF7D, + 0x7607, 0xAF7E, 0x7608, 0xAF80, 0x7609, 0xAF81, 0x760A, 0xF0FA, + 0x760B, 0xAF82, 0x760C, 0xF0F8, 0x760D, 0xAF83, 0x760E, 0xAF84, + 0x760F, 0xAF85, 0x7610, 0xF0F5, 0x7611, 0xAF86, 0x7612, 0xAF87, + 0x7613, 0xAF88, 0x7614, 0xAF89, 0x7615, 0xF0FD, 0x7616, 0xAF8A, + 0x7617, 0xF0F9, 0x7618, 0xF0FC, 0x7619, 0xF0FE, 0x761A, 0xAF8B, + 0x761B, 0xF1A1, 0x761C, 0xAF8C, 0x761D, 0xAF8D, 0x761E, 0xAF8E, + 0x761F, 0xCEC1, 0x7620, 0xF1A4, 0x7621, 0xAF8F, 0x7622, 0xF1A3, + 0x7623, 0xAF90, 0x7624, 0xC1F6, 0x7625, 0xF0FB, 0x7626, 0xCADD, + 0x7627, 0xAF91, 0x7628, 0xAF92, 0x7629, 0xB4F1, 0x762A, 0xB1F1, + 0x762B, 0xCCB1, 0x762C, 0xAF93, 0x762D, 0xF1A6, 0x762E, 0xAF94, + 0x762F, 0xAF95, 0x7630, 0xF1A7, 0x7631, 0xAF96, 0x7632, 0xAF97, + 0x7633, 0xF1AC, 0x7634, 0xD5CE, 0x7635, 0xF1A9, 0x7636, 0xAF98, + 0x7637, 0xAF99, 0x7638, 0xC8B3, 0x7639, 0xAF9A, 0x763A, 0xAF9B, + 0x763B, 0xAF9C, 0x763C, 0xF1A2, 0x763D, 0xAF9D, 0x763E, 0xF1AB, + 0x763F, 0xF1A8, 0x7640, 0xF1A5, 0x7641, 0xAF9E, 0x7642, 0xAF9F, + 0x7643, 0xF1AA, 0x7644, 0xAFA0, 0x7645, 0xB040, 0x7646, 0xB041, + 0x7647, 0xB042, 0x7648, 0xB043, 0x7649, 0xB044, 0x764A, 0xB045, + 0x764B, 0xB046, 0x764C, 0xB0A9, 0x764D, 0xF1AD, 0x764E, 0xB047, + 0x764F, 0xB048, 0x7650, 0xB049, 0x7651, 0xB04A, 0x7652, 0xB04B, + 0x7653, 0xB04C, 0x7654, 0xF1AF, 0x7655, 0xB04D, 0x7656, 0xF1B1, + 0x7657, 0xB04E, 0x7658, 0xB04F, 0x7659, 0xB050, 0x765A, 0xB051, + 0x765B, 0xB052, 0x765C, 0xF1B0, 0x765D, 0xB053, 0x765E, 0xF1AE, + 0x765F, 0xB054, 0x7660, 0xB055, 0x7661, 0xB056, 0x7662, 0xB057, + 0x7663, 0xD1A2, 0x7664, 0xB058, 0x7665, 0xB059, 0x7666, 0xB05A, + 0x7667, 0xB05B, 0x7668, 0xB05C, 0x7669, 0xB05D, 0x766A, 0xB05E, + 0x766B, 0xF1B2, 0x766C, 0xB05F, 0x766D, 0xB060, 0x766E, 0xB061, + 0x766F, 0xF1B3, 0x7670, 0xB062, 0x7671, 0xB063, 0x7672, 0xB064, + 0x7673, 0xB065, 0x7674, 0xB066, 0x7675, 0xB067, 0x7676, 0xB068, + 0x7677, 0xB069, 0x7678, 0xB9EF, 0x7679, 0xB06A, 0x767A, 0xB06B, + 0x767B, 0xB5C7, 0x767C, 0xB06C, 0x767D, 0xB0D7, 0x767E, 0xB0D9, + 0x767F, 0xB06D, 0x7680, 0xB06E, 0x7681, 0xB06F, 0x7682, 0xD4ED, + 0x7683, 0xB070, 0x7684, 0xB5C4, 0x7685, 0xB071, 0x7686, 0xBDD4, + 0x7687, 0xBBCA, 0x7688, 0xF0A7, 0x7689, 0xB072, 0x768A, 0xB073, + 0x768B, 0xB8DE, 0x768C, 0xB074, 0x768D, 0xB075, 0x768E, 0xF0A8, + 0x768F, 0xB076, 0x7690, 0xB077, 0x7691, 0xB0A8, 0x7692, 0xB078, + 0x7693, 0xF0A9, 0x7694, 0xB079, 0x7695, 0xB07A, 0x7696, 0xCDEE, + 0x7697, 0xB07B, 0x7698, 0xB07C, 0x7699, 0xF0AA, 0x769A, 0xB07D, + 0x769B, 0xB07E, 0x769C, 0xB080, 0x769D, 0xB081, 0x769E, 0xB082, + 0x769F, 0xB083, 0x76A0, 0xB084, 0x76A1, 0xB085, 0x76A2, 0xB086, + 0x76A3, 0xB087, 0x76A4, 0xF0AB, 0x76A5, 0xB088, 0x76A6, 0xB089, + 0x76A7, 0xB08A, 0x76A8, 0xB08B, 0x76A9, 0xB08C, 0x76AA, 0xB08D, + 0x76AB, 0xB08E, 0x76AC, 0xB08F, 0x76AD, 0xB090, 0x76AE, 0xC6A4, + 0x76AF, 0xB091, 0x76B0, 0xB092, 0x76B1, 0xD6E5, 0x76B2, 0xF1E4, + 0x76B3, 0xB093, 0x76B4, 0xF1E5, 0x76B5, 0xB094, 0x76B6, 0xB095, + 0x76B7, 0xB096, 0x76B8, 0xB097, 0x76B9, 0xB098, 0x76BA, 0xB099, + 0x76BB, 0xB09A, 0x76BC, 0xB09B, 0x76BD, 0xB09C, 0x76BE, 0xB09D, + 0x76BF, 0xC3F3, 0x76C0, 0xB09E, 0x76C1, 0xB09F, 0x76C2, 0xD3DB, + 0x76C3, 0xB0A0, 0x76C4, 0xB140, 0x76C5, 0xD6D1, 0x76C6, 0xC5E8, + 0x76C7, 0xB141, 0x76C8, 0xD3AF, 0x76C9, 0xB142, 0x76CA, 0xD2E6, + 0x76CB, 0xB143, 0x76CC, 0xB144, 0x76CD, 0xEEC1, 0x76CE, 0xB0BB, + 0x76CF, 0xD5B5, 0x76D0, 0xD1CE, 0x76D1, 0xBCE0, 0x76D2, 0xBAD0, + 0x76D3, 0xB145, 0x76D4, 0xBFF8, 0x76D5, 0xB146, 0x76D6, 0xB8C7, + 0x76D7, 0xB5C1, 0x76D8, 0xC5CC, 0x76D9, 0xB147, 0x76DA, 0xB148, + 0x76DB, 0xCAA2, 0x76DC, 0xB149, 0x76DD, 0xB14A, 0x76DE, 0xB14B, + 0x76DF, 0xC3CB, 0x76E0, 0xB14C, 0x76E1, 0xB14D, 0x76E2, 0xB14E, + 0x76E3, 0xB14F, 0x76E4, 0xB150, 0x76E5, 0xEEC2, 0x76E6, 0xB151, + 0x76E7, 0xB152, 0x76E8, 0xB153, 0x76E9, 0xB154, 0x76EA, 0xB155, + 0x76EB, 0xB156, 0x76EC, 0xB157, 0x76ED, 0xB158, 0x76EE, 0xC4BF, + 0x76EF, 0xB6A2, 0x76F0, 0xB159, 0x76F1, 0xEDEC, 0x76F2, 0xC3A4, + 0x76F3, 0xB15A, 0x76F4, 0xD6B1, 0x76F5, 0xB15B, 0x76F6, 0xB15C, + 0x76F7, 0xB15D, 0x76F8, 0xCFE0, 0x76F9, 0xEDEF, 0x76FA, 0xB15E, + 0x76FB, 0xB15F, 0x76FC, 0xC5CE, 0x76FD, 0xB160, 0x76FE, 0xB6DC, + 0x76FF, 0xB161, 0x7700, 0xB162, 0x7701, 0xCAA1, 0x7702, 0xB163, + 0x7703, 0xB164, 0x7704, 0xEDED, 0x7705, 0xB165, 0x7706, 0xB166, + 0x7707, 0xEDF0, 0x7708, 0xEDF1, 0x7709, 0xC3BC, 0x770A, 0xB167, + 0x770B, 0xBFB4, 0x770C, 0xB168, 0x770D, 0xEDEE, 0x770E, 0xB169, + 0x770F, 0xB16A, 0x7710, 0xB16B, 0x7711, 0xB16C, 0x7712, 0xB16D, + 0x7713, 0xB16E, 0x7714, 0xB16F, 0x7715, 0xB170, 0x7716, 0xB171, + 0x7717, 0xB172, 0x7718, 0xB173, 0x7719, 0xEDF4, 0x771A, 0xEDF2, + 0x771B, 0xB174, 0x771C, 0xB175, 0x771D, 0xB176, 0x771E, 0xB177, + 0x771F, 0xD5E6, 0x7720, 0xC3DF, 0x7721, 0xB178, 0x7722, 0xEDF3, + 0x7723, 0xB179, 0x7724, 0xB17A, 0x7725, 0xB17B, 0x7726, 0xEDF6, + 0x7727, 0xB17C, 0x7728, 0xD5A3, 0x7729, 0xD1A3, 0x772A, 0xB17D, + 0x772B, 0xB17E, 0x772C, 0xB180, 0x772D, 0xEDF5, 0x772E, 0xB181, + 0x772F, 0xC3D0, 0x7730, 0xB182, 0x7731, 0xB183, 0x7732, 0xB184, + 0x7733, 0xB185, 0x7734, 0xB186, 0x7735, 0xEDF7, 0x7736, 0xBFF4, + 0x7737, 0xBEEC, 0x7738, 0xEDF8, 0x7739, 0xB187, 0x773A, 0xCCF7, + 0x773B, 0xB188, 0x773C, 0xD1DB, 0x773D, 0xB189, 0x773E, 0xB18A, + 0x773F, 0xB18B, 0x7740, 0xD7C5, 0x7741, 0xD5F6, 0x7742, 0xB18C, + 0x7743, 0xEDFC, 0x7744, 0xB18D, 0x7745, 0xB18E, 0x7746, 0xB18F, + 0x7747, 0xEDFB, 0x7748, 0xB190, 0x7749, 0xB191, 0x774A, 0xB192, + 0x774B, 0xB193, 0x774C, 0xB194, 0x774D, 0xB195, 0x774E, 0xB196, + 0x774F, 0xB197, 0x7750, 0xEDF9, 0x7751, 0xEDFA, 0x7752, 0xB198, + 0x7753, 0xB199, 0x7754, 0xB19A, 0x7755, 0xB19B, 0x7756, 0xB19C, + 0x7757, 0xB19D, 0x7758, 0xB19E, 0x7759, 0xB19F, 0x775A, 0xEDFD, + 0x775B, 0xBEA6, 0x775C, 0xB1A0, 0x775D, 0xB240, 0x775E, 0xB241, + 0x775F, 0xB242, 0x7760, 0xB243, 0x7761, 0xCBAF, 0x7762, 0xEEA1, + 0x7763, 0xB6BD, 0x7764, 0xB244, 0x7765, 0xEEA2, 0x7766, 0xC4C0, + 0x7767, 0xB245, 0x7768, 0xEDFE, 0x7769, 0xB246, 0x776A, 0xB247, + 0x776B, 0xBDDE, 0x776C, 0xB2C7, 0x776D, 0xB248, 0x776E, 0xB249, + 0x776F, 0xB24A, 0x7770, 0xB24B, 0x7771, 0xB24C, 0x7772, 0xB24D, + 0x7773, 0xB24E, 0x7774, 0xB24F, 0x7775, 0xB250, 0x7776, 0xB251, + 0x7777, 0xB252, 0x7778, 0xB253, 0x7779, 0xB6C3, 0x777A, 0xB254, + 0x777B, 0xB255, 0x777C, 0xB256, 0x777D, 0xEEA5, 0x777E, 0xD8BA, + 0x777F, 0xEEA3, 0x7780, 0xEEA6, 0x7781, 0xB257, 0x7782, 0xB258, + 0x7783, 0xB259, 0x7784, 0xC3E9, 0x7785, 0xB3F2, 0x7786, 0xB25A, + 0x7787, 0xB25B, 0x7788, 0xB25C, 0x7789, 0xB25D, 0x778A, 0xB25E, + 0x778B, 0xB25F, 0x778C, 0xEEA7, 0x778D, 0xEEA4, 0x778E, 0xCFB9, + 0x778F, 0xB260, 0x7790, 0xB261, 0x7791, 0xEEA8, 0x7792, 0xC2F7, + 0x7793, 0xB262, 0x7794, 0xB263, 0x7795, 0xB264, 0x7796, 0xB265, + 0x7797, 0xB266, 0x7798, 0xB267, 0x7799, 0xB268, 0x779A, 0xB269, + 0x779B, 0xB26A, 0x779C, 0xB26B, 0x779D, 0xB26C, 0x779E, 0xB26D, + 0x779F, 0xEEA9, 0x77A0, 0xEEAA, 0x77A1, 0xB26E, 0x77A2, 0xDEAB, + 0x77A3, 0xB26F, 0x77A4, 0xB270, 0x77A5, 0xC6B3, 0x77A6, 0xB271, + 0x77A7, 0xC7C6, 0x77A8, 0xB272, 0x77A9, 0xD6F5, 0x77AA, 0xB5C9, + 0x77AB, 0xB273, 0x77AC, 0xCBB2, 0x77AD, 0xB274, 0x77AE, 0xB275, + 0x77AF, 0xB276, 0x77B0, 0xEEAB, 0x77B1, 0xB277, 0x77B2, 0xB278, + 0x77B3, 0xCDAB, 0x77B4, 0xB279, 0x77B5, 0xEEAC, 0x77B6, 0xB27A, + 0x77B7, 0xB27B, 0x77B8, 0xB27C, 0x77B9, 0xB27D, 0x77BA, 0xB27E, + 0x77BB, 0xD5B0, 0x77BC, 0xB280, 0x77BD, 0xEEAD, 0x77BE, 0xB281, + 0x77BF, 0xF6C4, 0x77C0, 0xB282, 0x77C1, 0xB283, 0x77C2, 0xB284, + 0x77C3, 0xB285, 0x77C4, 0xB286, 0x77C5, 0xB287, 0x77C6, 0xB288, + 0x77C7, 0xB289, 0x77C8, 0xB28A, 0x77C9, 0xB28B, 0x77CA, 0xB28C, + 0x77CB, 0xB28D, 0x77CC, 0xB28E, 0x77CD, 0xDBC7, 0x77CE, 0xB28F, + 0x77CF, 0xB290, 0x77D0, 0xB291, 0x77D1, 0xB292, 0x77D2, 0xB293, + 0x77D3, 0xB294, 0x77D4, 0xB295, 0x77D5, 0xB296, 0x77D6, 0xB297, + 0x77D7, 0xB4A3, 0x77D8, 0xB298, 0x77D9, 0xB299, 0x77DA, 0xB29A, + 0x77DB, 0xC3AC, 0x77DC, 0xF1E6, 0x77DD, 0xB29B, 0x77DE, 0xB29C, + 0x77DF, 0xB29D, 0x77E0, 0xB29E, 0x77E1, 0xB29F, 0x77E2, 0xCAB8, + 0x77E3, 0xD2D3, 0x77E4, 0xB2A0, 0x77E5, 0xD6AA, 0x77E6, 0xB340, + 0x77E7, 0xEFF2, 0x77E8, 0xB341, 0x77E9, 0xBED8, 0x77EA, 0xB342, + 0x77EB, 0xBDC3, 0x77EC, 0xEFF3, 0x77ED, 0xB6CC, 0x77EE, 0xB0AB, + 0x77EF, 0xB343, 0x77F0, 0xB344, 0x77F1, 0xB345, 0x77F2, 0xB346, + 0x77F3, 0xCAAF, 0x77F4, 0xB347, 0x77F5, 0xB348, 0x77F6, 0xEDB6, + 0x77F7, 0xB349, 0x77F8, 0xEDB7, 0x77F9, 0xB34A, 0x77FA, 0xB34B, + 0x77FB, 0xB34C, 0x77FC, 0xB34D, 0x77FD, 0xCEF9, 0x77FE, 0xB7AF, + 0x77FF, 0xBFF3, 0x7800, 0xEDB8, 0x7801, 0xC2EB, 0x7802, 0xC9B0, + 0x7803, 0xB34E, 0x7804, 0xB34F, 0x7805, 0xB350, 0x7806, 0xB351, + 0x7807, 0xB352, 0x7808, 0xB353, 0x7809, 0xEDB9, 0x780A, 0xB354, + 0x780B, 0xB355, 0x780C, 0xC6F6, 0x780D, 0xBFB3, 0x780E, 0xB356, + 0x780F, 0xB357, 0x7810, 0xB358, 0x7811, 0xEDBC, 0x7812, 0xC5F8, + 0x7813, 0xB359, 0x7814, 0xD1D0, 0x7815, 0xB35A, 0x7816, 0xD7A9, + 0x7817, 0xEDBA, 0x7818, 0xEDBB, 0x7819, 0xB35B, 0x781A, 0xD1E2, + 0x781B, 0xB35C, 0x781C, 0xEDBF, 0x781D, 0xEDC0, 0x781E, 0xB35D, + 0x781F, 0xEDC4, 0x7820, 0xB35E, 0x7821, 0xB35F, 0x7822, 0xB360, + 0x7823, 0xEDC8, 0x7824, 0xB361, 0x7825, 0xEDC6, 0x7826, 0xEDCE, + 0x7827, 0xD5E8, 0x7828, 0xB362, 0x7829, 0xEDC9, 0x782A, 0xB363, + 0x782B, 0xB364, 0x782C, 0xEDC7, 0x782D, 0xEDBE, 0x782E, 0xB365, + 0x782F, 0xB366, 0x7830, 0xC5E9, 0x7831, 0xB367, 0x7832, 0xB368, + 0x7833, 0xB369, 0x7834, 0xC6C6, 0x7835, 0xB36A, 0x7836, 0xB36B, + 0x7837, 0xC9E9, 0x7838, 0xD4D2, 0x7839, 0xEDC1, 0x783A, 0xEDC2, + 0x783B, 0xEDC3, 0x783C, 0xEDC5, 0x783D, 0xB36C, 0x783E, 0xC0F9, + 0x783F, 0xB36D, 0x7840, 0xB4A1, 0x7841, 0xB36E, 0x7842, 0xB36F, + 0x7843, 0xB370, 0x7844, 0xB371, 0x7845, 0xB9E8, 0x7846, 0xB372, + 0x7847, 0xEDD0, 0x7848, 0xB373, 0x7849, 0xB374, 0x784A, 0xB375, + 0x784B, 0xB376, 0x784C, 0xEDD1, 0x784D, 0xB377, 0x784E, 0xEDCA, + 0x784F, 0xB378, 0x7850, 0xEDCF, 0x7851, 0xB379, 0x7852, 0xCEF8, + 0x7853, 0xB37A, 0x7854, 0xB37B, 0x7855, 0xCBB6, 0x7856, 0xEDCC, + 0x7857, 0xEDCD, 0x7858, 0xB37C, 0x7859, 0xB37D, 0x785A, 0xB37E, + 0x785B, 0xB380, 0x785C, 0xB381, 0x785D, 0xCFF5, 0x785E, 0xB382, + 0x785F, 0xB383, 0x7860, 0xB384, 0x7861, 0xB385, 0x7862, 0xB386, + 0x7863, 0xB387, 0x7864, 0xB388, 0x7865, 0xB389, 0x7866, 0xB38A, + 0x7867, 0xB38B, 0x7868, 0xB38C, 0x7869, 0xB38D, 0x786A, 0xEDD2, + 0x786B, 0xC1F2, 0x786C, 0xD3B2, 0x786D, 0xEDCB, 0x786E, 0xC8B7, + 0x786F, 0xB38E, 0x7870, 0xB38F, 0x7871, 0xB390, 0x7872, 0xB391, + 0x7873, 0xB392, 0x7874, 0xB393, 0x7875, 0xB394, 0x7876, 0xB395, + 0x7877, 0xBCEF, 0x7878, 0xB396, 0x7879, 0xB397, 0x787A, 0xB398, + 0x787B, 0xB399, 0x787C, 0xC5F0, 0x787D, 0xB39A, 0x787E, 0xB39B, + 0x787F, 0xB39C, 0x7880, 0xB39D, 0x7881, 0xB39E, 0x7882, 0xB39F, + 0x7883, 0xB3A0, 0x7884, 0xB440, 0x7885, 0xB441, 0x7886, 0xB442, + 0x7887, 0xEDD6, 0x7888, 0xB443, 0x7889, 0xB5EF, 0x788A, 0xB444, + 0x788B, 0xB445, 0x788C, 0xC2B5, 0x788D, 0xB0AD, 0x788E, 0xCBE9, + 0x788F, 0xB446, 0x7890, 0xB447, 0x7891, 0xB1AE, 0x7892, 0xB448, + 0x7893, 0xEDD4, 0x7894, 0xB449, 0x7895, 0xB44A, 0x7896, 0xB44B, + 0x7897, 0xCDEB, 0x7898, 0xB5E2, 0x7899, 0xB44C, 0x789A, 0xEDD5, + 0x789B, 0xEDD3, 0x789C, 0xEDD7, 0x789D, 0xB44D, 0x789E, 0xB44E, + 0x789F, 0xB5FA, 0x78A0, 0xB44F, 0x78A1, 0xEDD8, 0x78A2, 0xB450, + 0x78A3, 0xEDD9, 0x78A4, 0xB451, 0x78A5, 0xEDDC, 0x78A6, 0xB452, + 0x78A7, 0xB1CC, 0x78A8, 0xB453, 0x78A9, 0xB454, 0x78AA, 0xB455, + 0x78AB, 0xB456, 0x78AC, 0xB457, 0x78AD, 0xB458, 0x78AE, 0xB459, + 0x78AF, 0xB45A, 0x78B0, 0xC5F6, 0x78B1, 0xBCEE, 0x78B2, 0xEDDA, + 0x78B3, 0xCCBC, 0x78B4, 0xB2EA, 0x78B5, 0xB45B, 0x78B6, 0xB45C, + 0x78B7, 0xB45D, 0x78B8, 0xB45E, 0x78B9, 0xEDDB, 0x78BA, 0xB45F, + 0x78BB, 0xB460, 0x78BC, 0xB461, 0x78BD, 0xB462, 0x78BE, 0xC4EB, + 0x78BF, 0xB463, 0x78C0, 0xB464, 0x78C1, 0xB4C5, 0x78C2, 0xB465, + 0x78C3, 0xB466, 0x78C4, 0xB467, 0x78C5, 0xB0F5, 0x78C6, 0xB468, + 0x78C7, 0xB469, 0x78C8, 0xB46A, 0x78C9, 0xEDDF, 0x78CA, 0xC0DA, + 0x78CB, 0xB4E8, 0x78CC, 0xB46B, 0x78CD, 0xB46C, 0x78CE, 0xB46D, + 0x78CF, 0xB46E, 0x78D0, 0xC5CD, 0x78D1, 0xB46F, 0x78D2, 0xB470, + 0x78D3, 0xB471, 0x78D4, 0xEDDD, 0x78D5, 0xBFC4, 0x78D6, 0xB472, + 0x78D7, 0xB473, 0x78D8, 0xB474, 0x78D9, 0xEDDE, 0x78DA, 0xB475, + 0x78DB, 0xB476, 0x78DC, 0xB477, 0x78DD, 0xB478, 0x78DE, 0xB479, + 0x78DF, 0xB47A, 0x78E0, 0xB47B, 0x78E1, 0xB47C, 0x78E2, 0xB47D, + 0x78E3, 0xB47E, 0x78E4, 0xB480, 0x78E5, 0xB481, 0x78E6, 0xB482, + 0x78E7, 0xB483, 0x78E8, 0xC4A5, 0x78E9, 0xB484, 0x78EA, 0xB485, + 0x78EB, 0xB486, 0x78EC, 0xEDE0, 0x78ED, 0xB487, 0x78EE, 0xB488, + 0x78EF, 0xB489, 0x78F0, 0xB48A, 0x78F1, 0xB48B, 0x78F2, 0xEDE1, + 0x78F3, 0xB48C, 0x78F4, 0xEDE3, 0x78F5, 0xB48D, 0x78F6, 0xB48E, + 0x78F7, 0xC1D7, 0x78F8, 0xB48F, 0x78F9, 0xB490, 0x78FA, 0xBBC7, + 0x78FB, 0xB491, 0x78FC, 0xB492, 0x78FD, 0xB493, 0x78FE, 0xB494, + 0x78FF, 0xB495, 0x7900, 0xB496, 0x7901, 0xBDB8, 0x7902, 0xB497, + 0x7903, 0xB498, 0x7904, 0xB499, 0x7905, 0xEDE2, 0x7906, 0xB49A, + 0x7907, 0xB49B, 0x7908, 0xB49C, 0x7909, 0xB49D, 0x790A, 0xB49E, + 0x790B, 0xB49F, 0x790C, 0xB4A0, 0x790D, 0xB540, 0x790E, 0xB541, + 0x790F, 0xB542, 0x7910, 0xB543, 0x7911, 0xB544, 0x7912, 0xB545, + 0x7913, 0xEDE4, 0x7914, 0xB546, 0x7915, 0xB547, 0x7916, 0xB548, + 0x7917, 0xB549, 0x7918, 0xB54A, 0x7919, 0xB54B, 0x791A, 0xB54C, + 0x791B, 0xB54D, 0x791C, 0xB54E, 0x791D, 0xB54F, 0x791E, 0xEDE6, + 0x791F, 0xB550, 0x7920, 0xB551, 0x7921, 0xB552, 0x7922, 0xB553, + 0x7923, 0xB554, 0x7924, 0xEDE5, 0x7925, 0xB555, 0x7926, 0xB556, + 0x7927, 0xB557, 0x7928, 0xB558, 0x7929, 0xB559, 0x792A, 0xB55A, + 0x792B, 0xB55B, 0x792C, 0xB55C, 0x792D, 0xB55D, 0x792E, 0xB55E, + 0x792F, 0xB55F, 0x7930, 0xB560, 0x7931, 0xB561, 0x7932, 0xB562, + 0x7933, 0xB563, 0x7934, 0xEDE7, 0x7935, 0xB564, 0x7936, 0xB565, + 0x7937, 0xB566, 0x7938, 0xB567, 0x7939, 0xB568, 0x793A, 0xCABE, + 0x793B, 0xECEA, 0x793C, 0xC0F1, 0x793D, 0xB569, 0x793E, 0xC9E7, + 0x793F, 0xB56A, 0x7940, 0xECEB, 0x7941, 0xC6EE, 0x7942, 0xB56B, + 0x7943, 0xB56C, 0x7944, 0xB56D, 0x7945, 0xB56E, 0x7946, 0xECEC, + 0x7947, 0xB56F, 0x7948, 0xC6ED, 0x7949, 0xECED, 0x794A, 0xB570, + 0x794B, 0xB571, 0x794C, 0xB572, 0x794D, 0xB573, 0x794E, 0xB574, + 0x794F, 0xB575, 0x7950, 0xB576, 0x7951, 0xB577, 0x7952, 0xB578, + 0x7953, 0xECF0, 0x7954, 0xB579, 0x7955, 0xB57A, 0x7956, 0xD7E6, + 0x7957, 0xECF3, 0x7958, 0xB57B, 0x7959, 0xB57C, 0x795A, 0xECF1, + 0x795B, 0xECEE, 0x795C, 0xECEF, 0x795D, 0xD7A3, 0x795E, 0xC9F1, + 0x795F, 0xCBEE, 0x7960, 0xECF4, 0x7961, 0xB57D, 0x7962, 0xECF2, + 0x7963, 0xB57E, 0x7964, 0xB580, 0x7965, 0xCFE9, 0x7966, 0xB581, + 0x7967, 0xECF6, 0x7968, 0xC6B1, 0x7969, 0xB582, 0x796A, 0xB583, + 0x796B, 0xB584, 0x796C, 0xB585, 0x796D, 0xBCC0, 0x796E, 0xB586, + 0x796F, 0xECF5, 0x7970, 0xB587, 0x7971, 0xB588, 0x7972, 0xB589, + 0x7973, 0xB58A, 0x7974, 0xB58B, 0x7975, 0xB58C, 0x7976, 0xB58D, + 0x7977, 0xB5BB, 0x7978, 0xBBF6, 0x7979, 0xB58E, 0x797A, 0xECF7, + 0x797B, 0xB58F, 0x797C, 0xB590, 0x797D, 0xB591, 0x797E, 0xB592, + 0x797F, 0xB593, 0x7980, 0xD9F7, 0x7981, 0xBDFB, 0x7982, 0xB594, + 0x7983, 0xB595, 0x7984, 0xC2BB, 0x7985, 0xECF8, 0x7986, 0xB596, + 0x7987, 0xB597, 0x7988, 0xB598, 0x7989, 0xB599, 0x798A, 0xECF9, + 0x798B, 0xB59A, 0x798C, 0xB59B, 0x798D, 0xB59C, 0x798E, 0xB59D, + 0x798F, 0xB8A3, 0x7990, 0xB59E, 0x7991, 0xB59F, 0x7992, 0xB5A0, + 0x7993, 0xB640, 0x7994, 0xB641, 0x7995, 0xB642, 0x7996, 0xB643, + 0x7997, 0xB644, 0x7998, 0xB645, 0x7999, 0xB646, 0x799A, 0xECFA, + 0x799B, 0xB647, 0x799C, 0xB648, 0x799D, 0xB649, 0x799E, 0xB64A, + 0x799F, 0xB64B, 0x79A0, 0xB64C, 0x79A1, 0xB64D, 0x79A2, 0xB64E, + 0x79A3, 0xB64F, 0x79A4, 0xB650, 0x79A5, 0xB651, 0x79A6, 0xB652, + 0x79A7, 0xECFB, 0x79A8, 0xB653, 0x79A9, 0xB654, 0x79AA, 0xB655, + 0x79AB, 0xB656, 0x79AC, 0xB657, 0x79AD, 0xB658, 0x79AE, 0xB659, + 0x79AF, 0xB65A, 0x79B0, 0xB65B, 0x79B1, 0xB65C, 0x79B2, 0xB65D, + 0x79B3, 0xECFC, 0x79B4, 0xB65E, 0x79B5, 0xB65F, 0x79B6, 0xB660, + 0x79B7, 0xB661, 0x79B8, 0xB662, 0x79B9, 0xD3ED, 0x79BA, 0xD8AE, + 0x79BB, 0xC0EB, 0x79BC, 0xB663, 0x79BD, 0xC7DD, 0x79BE, 0xBACC, + 0x79BF, 0xB664, 0x79C0, 0xD0E3, 0x79C1, 0xCBBD, 0x79C2, 0xB665, + 0x79C3, 0xCDBA, 0x79C4, 0xB666, 0x79C5, 0xB667, 0x79C6, 0xB8D1, + 0x79C7, 0xB668, 0x79C8, 0xB669, 0x79C9, 0xB1FC, 0x79CA, 0xB66A, + 0x79CB, 0xC7EF, 0x79CC, 0xB66B, 0x79CD, 0xD6D6, 0x79CE, 0xB66C, + 0x79CF, 0xB66D, 0x79D0, 0xB66E, 0x79D1, 0xBFC6, 0x79D2, 0xC3EB, + 0x79D3, 0xB66F, 0x79D4, 0xB670, 0x79D5, 0xEFF5, 0x79D6, 0xB671, + 0x79D7, 0xB672, 0x79D8, 0xC3D8, 0x79D9, 0xB673, 0x79DA, 0xB674, + 0x79DB, 0xB675, 0x79DC, 0xB676, 0x79DD, 0xB677, 0x79DE, 0xB678, + 0x79DF, 0xD7E2, 0x79E0, 0xB679, 0x79E1, 0xB67A, 0x79E2, 0xB67B, + 0x79E3, 0xEFF7, 0x79E4, 0xB3D3, 0x79E5, 0xB67C, 0x79E6, 0xC7D8, + 0x79E7, 0xD1ED, 0x79E8, 0xB67D, 0x79E9, 0xD6C8, 0x79EA, 0xB67E, + 0x79EB, 0xEFF8, 0x79EC, 0xB680, 0x79ED, 0xEFF6, 0x79EE, 0xB681, + 0x79EF, 0xBBFD, 0x79F0, 0xB3C6, 0x79F1, 0xB682, 0x79F2, 0xB683, + 0x79F3, 0xB684, 0x79F4, 0xB685, 0x79F5, 0xB686, 0x79F6, 0xB687, + 0x79F7, 0xB688, 0x79F8, 0xBDD5, 0x79F9, 0xB689, 0x79FA, 0xB68A, + 0x79FB, 0xD2C6, 0x79FC, 0xB68B, 0x79FD, 0xBBE0, 0x79FE, 0xB68C, + 0x79FF, 0xB68D, 0x7A00, 0xCFA1, 0x7A01, 0xB68E, 0x7A02, 0xEFFC, + 0x7A03, 0xEFFB, 0x7A04, 0xB68F, 0x7A05, 0xB690, 0x7A06, 0xEFF9, + 0x7A07, 0xB691, 0x7A08, 0xB692, 0x7A09, 0xB693, 0x7A0A, 0xB694, + 0x7A0B, 0xB3CC, 0x7A0C, 0xB695, 0x7A0D, 0xC9D4, 0x7A0E, 0xCBB0, + 0x7A0F, 0xB696, 0x7A10, 0xB697, 0x7A11, 0xB698, 0x7A12, 0xB699, + 0x7A13, 0xB69A, 0x7A14, 0xEFFE, 0x7A15, 0xB69B, 0x7A16, 0xB69C, + 0x7A17, 0xB0DE, 0x7A18, 0xB69D, 0x7A19, 0xB69E, 0x7A1A, 0xD6C9, + 0x7A1B, 0xB69F, 0x7A1C, 0xB6A0, 0x7A1D, 0xB740, 0x7A1E, 0xEFFD, + 0x7A1F, 0xB741, 0x7A20, 0xB3ED, 0x7A21, 0xB742, 0x7A22, 0xB743, + 0x7A23, 0xF6D5, 0x7A24, 0xB744, 0x7A25, 0xB745, 0x7A26, 0xB746, + 0x7A27, 0xB747, 0x7A28, 0xB748, 0x7A29, 0xB749, 0x7A2A, 0xB74A, + 0x7A2B, 0xB74B, 0x7A2C, 0xB74C, 0x7A2D, 0xB74D, 0x7A2E, 0xB74E, + 0x7A2F, 0xB74F, 0x7A30, 0xB750, 0x7A31, 0xB751, 0x7A32, 0xB752, + 0x7A33, 0xCEC8, 0x7A34, 0xB753, 0x7A35, 0xB754, 0x7A36, 0xB755, + 0x7A37, 0xF0A2, 0x7A38, 0xB756, 0x7A39, 0xF0A1, 0x7A3A, 0xB757, + 0x7A3B, 0xB5BE, 0x7A3C, 0xBCDA, 0x7A3D, 0xBBFC, 0x7A3E, 0xB758, + 0x7A3F, 0xB8E5, 0x7A40, 0xB759, 0x7A41, 0xB75A, 0x7A42, 0xB75B, + 0x7A43, 0xB75C, 0x7A44, 0xB75D, 0x7A45, 0xB75E, 0x7A46, 0xC4C2, + 0x7A47, 0xB75F, 0x7A48, 0xB760, 0x7A49, 0xB761, 0x7A4A, 0xB762, + 0x7A4B, 0xB763, 0x7A4C, 0xB764, 0x7A4D, 0xB765, 0x7A4E, 0xB766, + 0x7A4F, 0xB767, 0x7A50, 0xB768, 0x7A51, 0xF0A3, 0x7A52, 0xB769, + 0x7A53, 0xB76A, 0x7A54, 0xB76B, 0x7A55, 0xB76C, 0x7A56, 0xB76D, + 0x7A57, 0xCBEB, 0x7A58, 0xB76E, 0x7A59, 0xB76F, 0x7A5A, 0xB770, + 0x7A5B, 0xB771, 0x7A5C, 0xB772, 0x7A5D, 0xB773, 0x7A5E, 0xB774, + 0x7A5F, 0xB775, 0x7A60, 0xB776, 0x7A61, 0xB777, 0x7A62, 0xB778, + 0x7A63, 0xB779, 0x7A64, 0xB77A, 0x7A65, 0xB77B, 0x7A66, 0xB77C, + 0x7A67, 0xB77D, 0x7A68, 0xB77E, 0x7A69, 0xB780, 0x7A6A, 0xB781, + 0x7A6B, 0xB782, 0x7A6C, 0xB783, 0x7A6D, 0xB784, 0x7A6E, 0xB785, + 0x7A6F, 0xB786, 0x7A70, 0xF0A6, 0x7A71, 0xB787, 0x7A72, 0xB788, + 0x7A73, 0xB789, 0x7A74, 0xD1A8, 0x7A75, 0xB78A, 0x7A76, 0xBEBF, + 0x7A77, 0xC7EE, 0x7A78, 0xF1B6, 0x7A79, 0xF1B7, 0x7A7A, 0xBFD5, + 0x7A7B, 0xB78B, 0x7A7C, 0xB78C, 0x7A7D, 0xB78D, 0x7A7E, 0xB78E, + 0x7A7F, 0xB4A9, 0x7A80, 0xF1B8, 0x7A81, 0xCDBB, 0x7A82, 0xB78F, + 0x7A83, 0xC7D4, 0x7A84, 0xD5AD, 0x7A85, 0xB790, 0x7A86, 0xF1B9, + 0x7A87, 0xB791, 0x7A88, 0xF1BA, 0x7A89, 0xB792, 0x7A8A, 0xB793, + 0x7A8B, 0xB794, 0x7A8C, 0xB795, 0x7A8D, 0xC7CF, 0x7A8E, 0xB796, + 0x7A8F, 0xB797, 0x7A90, 0xB798, 0x7A91, 0xD2A4, 0x7A92, 0xD6CF, + 0x7A93, 0xB799, 0x7A94, 0xB79A, 0x7A95, 0xF1BB, 0x7A96, 0xBDD1, + 0x7A97, 0xB4B0, 0x7A98, 0xBEBD, 0x7A99, 0xB79B, 0x7A9A, 0xB79C, + 0x7A9B, 0xB79D, 0x7A9C, 0xB4DC, 0x7A9D, 0xCED1, 0x7A9E, 0xB79E, + 0x7A9F, 0xBFDF, 0x7AA0, 0xF1BD, 0x7AA1, 0xB79F, 0x7AA2, 0xB7A0, + 0x7AA3, 0xB840, 0x7AA4, 0xB841, 0x7AA5, 0xBFFA, 0x7AA6, 0xF1BC, + 0x7AA7, 0xB842, 0x7AA8, 0xF1BF, 0x7AA9, 0xB843, 0x7AAA, 0xB844, + 0x7AAB, 0xB845, 0x7AAC, 0xF1BE, 0x7AAD, 0xF1C0, 0x7AAE, 0xB846, + 0x7AAF, 0xB847, 0x7AB0, 0xB848, 0x7AB1, 0xB849, 0x7AB2, 0xB84A, + 0x7AB3, 0xF1C1, 0x7AB4, 0xB84B, 0x7AB5, 0xB84C, 0x7AB6, 0xB84D, + 0x7AB7, 0xB84E, 0x7AB8, 0xB84F, 0x7AB9, 0xB850, 0x7ABA, 0xB851, + 0x7ABB, 0xB852, 0x7ABC, 0xB853, 0x7ABD, 0xB854, 0x7ABE, 0xB855, + 0x7ABF, 0xC1FE, 0x7AC0, 0xB856, 0x7AC1, 0xB857, 0x7AC2, 0xB858, + 0x7AC3, 0xB859, 0x7AC4, 0xB85A, 0x7AC5, 0xB85B, 0x7AC6, 0xB85C, + 0x7AC7, 0xB85D, 0x7AC8, 0xB85E, 0x7AC9, 0xB85F, 0x7ACA, 0xB860, + 0x7ACB, 0xC1A2, 0x7ACC, 0xB861, 0x7ACD, 0xB862, 0x7ACE, 0xB863, + 0x7ACF, 0xB864, 0x7AD0, 0xB865, 0x7AD1, 0xB866, 0x7AD2, 0xB867, + 0x7AD3, 0xB868, 0x7AD4, 0xB869, 0x7AD5, 0xB86A, 0x7AD6, 0xCAFA, + 0x7AD7, 0xB86B, 0x7AD8, 0xB86C, 0x7AD9, 0xD5BE, 0x7ADA, 0xB86D, + 0x7ADB, 0xB86E, 0x7ADC, 0xB86F, 0x7ADD, 0xB870, 0x7ADE, 0xBEBA, + 0x7ADF, 0xBEB9, 0x7AE0, 0xD5C2, 0x7AE1, 0xB871, 0x7AE2, 0xB872, + 0x7AE3, 0xBFA2, 0x7AE4, 0xB873, 0x7AE5, 0xCDAF, 0x7AE6, 0xF1B5, + 0x7AE7, 0xB874, 0x7AE8, 0xB875, 0x7AE9, 0xB876, 0x7AEA, 0xB877, + 0x7AEB, 0xB878, 0x7AEC, 0xB879, 0x7AED, 0xBDDF, 0x7AEE, 0xB87A, + 0x7AEF, 0xB6CB, 0x7AF0, 0xB87B, 0x7AF1, 0xB87C, 0x7AF2, 0xB87D, + 0x7AF3, 0xB87E, 0x7AF4, 0xB880, 0x7AF5, 0xB881, 0x7AF6, 0xB882, + 0x7AF7, 0xB883, 0x7AF8, 0xB884, 0x7AF9, 0xD6F1, 0x7AFA, 0xF3C3, + 0x7AFB, 0xB885, 0x7AFC, 0xB886, 0x7AFD, 0xF3C4, 0x7AFE, 0xB887, + 0x7AFF, 0xB8CD, 0x7B00, 0xB888, 0x7B01, 0xB889, 0x7B02, 0xB88A, + 0x7B03, 0xF3C6, 0x7B04, 0xF3C7, 0x7B05, 0xB88B, 0x7B06, 0xB0CA, + 0x7B07, 0xB88C, 0x7B08, 0xF3C5, 0x7B09, 0xB88D, 0x7B0A, 0xF3C9, + 0x7B0B, 0xCBF1, 0x7B0C, 0xB88E, 0x7B0D, 0xB88F, 0x7B0E, 0xB890, + 0x7B0F, 0xF3CB, 0x7B10, 0xB891, 0x7B11, 0xD0A6, 0x7B12, 0xB892, + 0x7B13, 0xB893, 0x7B14, 0xB1CA, 0x7B15, 0xF3C8, 0x7B16, 0xB894, + 0x7B17, 0xB895, 0x7B18, 0xB896, 0x7B19, 0xF3CF, 0x7B1A, 0xB897, + 0x7B1B, 0xB5D1, 0x7B1C, 0xB898, 0x7B1D, 0xB899, 0x7B1E, 0xF3D7, + 0x7B1F, 0xB89A, 0x7B20, 0xF3D2, 0x7B21, 0xB89B, 0x7B22, 0xB89C, + 0x7B23, 0xB89D, 0x7B24, 0xF3D4, 0x7B25, 0xF3D3, 0x7B26, 0xB7FB, + 0x7B27, 0xB89E, 0x7B28, 0xB1BF, 0x7B29, 0xB89F, 0x7B2A, 0xF3CE, + 0x7B2B, 0xF3CA, 0x7B2C, 0xB5DA, 0x7B2D, 0xB8A0, 0x7B2E, 0xF3D0, + 0x7B2F, 0xB940, 0x7B30, 0xB941, 0x7B31, 0xF3D1, 0x7B32, 0xB942, + 0x7B33, 0xF3D5, 0x7B34, 0xB943, 0x7B35, 0xB944, 0x7B36, 0xB945, + 0x7B37, 0xB946, 0x7B38, 0xF3CD, 0x7B39, 0xB947, 0x7B3A, 0xBCE3, + 0x7B3B, 0xB948, 0x7B3C, 0xC1FD, 0x7B3D, 0xB949, 0x7B3E, 0xF3D6, + 0x7B3F, 0xB94A, 0x7B40, 0xB94B, 0x7B41, 0xB94C, 0x7B42, 0xB94D, + 0x7B43, 0xB94E, 0x7B44, 0xB94F, 0x7B45, 0xF3DA, 0x7B46, 0xB950, + 0x7B47, 0xF3CC, 0x7B48, 0xB951, 0x7B49, 0xB5C8, 0x7B4A, 0xB952, + 0x7B4B, 0xBDEE, 0x7B4C, 0xF3DC, 0x7B4D, 0xB953, 0x7B4E, 0xB954, + 0x7B4F, 0xB7A4, 0x7B50, 0xBFF0, 0x7B51, 0xD6FE, 0x7B52, 0xCDB2, + 0x7B53, 0xB955, 0x7B54, 0xB4F0, 0x7B55, 0xB956, 0x7B56, 0xB2DF, + 0x7B57, 0xB957, 0x7B58, 0xF3D8, 0x7B59, 0xB958, 0x7B5A, 0xF3D9, + 0x7B5B, 0xC9B8, 0x7B5C, 0xB959, 0x7B5D, 0xF3DD, 0x7B5E, 0xB95A, + 0x7B5F, 0xB95B, 0x7B60, 0xF3DE, 0x7B61, 0xB95C, 0x7B62, 0xF3E1, + 0x7B63, 0xB95D, 0x7B64, 0xB95E, 0x7B65, 0xB95F, 0x7B66, 0xB960, + 0x7B67, 0xB961, 0x7B68, 0xB962, 0x7B69, 0xB963, 0x7B6A, 0xB964, + 0x7B6B, 0xB965, 0x7B6C, 0xB966, 0x7B6D, 0xB967, 0x7B6E, 0xF3DF, + 0x7B6F, 0xB968, 0x7B70, 0xB969, 0x7B71, 0xF3E3, 0x7B72, 0xF3E2, + 0x7B73, 0xB96A, 0x7B74, 0xB96B, 0x7B75, 0xF3DB, 0x7B76, 0xB96C, + 0x7B77, 0xBFEA, 0x7B78, 0xB96D, 0x7B79, 0xB3EF, 0x7B7A, 0xB96E, + 0x7B7B, 0xF3E0, 0x7B7C, 0xB96F, 0x7B7D, 0xB970, 0x7B7E, 0xC7A9, + 0x7B7F, 0xB971, 0x7B80, 0xBCF2, 0x7B81, 0xB972, 0x7B82, 0xB973, + 0x7B83, 0xB974, 0x7B84, 0xB975, 0x7B85, 0xF3EB, 0x7B86, 0xB976, + 0x7B87, 0xB977, 0x7B88, 0xB978, 0x7B89, 0xB979, 0x7B8A, 0xB97A, + 0x7B8B, 0xB97B, 0x7B8C, 0xB97C, 0x7B8D, 0xB9BF, 0x7B8E, 0xB97D, + 0x7B8F, 0xB97E, 0x7B90, 0xF3E4, 0x7B91, 0xB980, 0x7B92, 0xB981, + 0x7B93, 0xB982, 0x7B94, 0xB2AD, 0x7B95, 0xBBFE, 0x7B96, 0xB983, + 0x7B97, 0xCBE3, 0x7B98, 0xB984, 0x7B99, 0xB985, 0x7B9A, 0xB986, + 0x7B9B, 0xB987, 0x7B9C, 0xF3ED, 0x7B9D, 0xF3E9, 0x7B9E, 0xB988, + 0x7B9F, 0xB989, 0x7BA0, 0xB98A, 0x7BA1, 0xB9DC, 0x7BA2, 0xF3EE, + 0x7BA3, 0xB98B, 0x7BA4, 0xB98C, 0x7BA5, 0xB98D, 0x7BA6, 0xF3E5, + 0x7BA7, 0xF3E6, 0x7BA8, 0xF3EA, 0x7BA9, 0xC2E1, 0x7BAA, 0xF3EC, + 0x7BAB, 0xF3EF, 0x7BAC, 0xF3E8, 0x7BAD, 0xBCFD, 0x7BAE, 0xB98E, + 0x7BAF, 0xB98F, 0x7BB0, 0xB990, 0x7BB1, 0xCFE4, 0x7BB2, 0xB991, + 0x7BB3, 0xB992, 0x7BB4, 0xF3F0, 0x7BB5, 0xB993, 0x7BB6, 0xB994, + 0x7BB7, 0xB995, 0x7BB8, 0xF3E7, 0x7BB9, 0xB996, 0x7BBA, 0xB997, + 0x7BBB, 0xB998, 0x7BBC, 0xB999, 0x7BBD, 0xB99A, 0x7BBE, 0xB99B, + 0x7BBF, 0xB99C, 0x7BC0, 0xB99D, 0x7BC1, 0xF3F2, 0x7BC2, 0xB99E, + 0x7BC3, 0xB99F, 0x7BC4, 0xB9A0, 0x7BC5, 0xBA40, 0x7BC6, 0xD7AD, + 0x7BC7, 0xC6AA, 0x7BC8, 0xBA41, 0x7BC9, 0xBA42, 0x7BCA, 0xBA43, + 0x7BCB, 0xBA44, 0x7BCC, 0xF3F3, 0x7BCD, 0xBA45, 0x7BCE, 0xBA46, + 0x7BCF, 0xBA47, 0x7BD0, 0xBA48, 0x7BD1, 0xF3F1, 0x7BD2, 0xBA49, + 0x7BD3, 0xC2A8, 0x7BD4, 0xBA4A, 0x7BD5, 0xBA4B, 0x7BD6, 0xBA4C, + 0x7BD7, 0xBA4D, 0x7BD8, 0xBA4E, 0x7BD9, 0xB8DD, 0x7BDA, 0xF3F5, + 0x7BDB, 0xBA4F, 0x7BDC, 0xBA50, 0x7BDD, 0xF3F4, 0x7BDE, 0xBA51, + 0x7BDF, 0xBA52, 0x7BE0, 0xBA53, 0x7BE1, 0xB4DB, 0x7BE2, 0xBA54, + 0x7BE3, 0xBA55, 0x7BE4, 0xBA56, 0x7BE5, 0xF3F6, 0x7BE6, 0xF3F7, + 0x7BE7, 0xBA57, 0x7BE8, 0xBA58, 0x7BE9, 0xBA59, 0x7BEA, 0xF3F8, + 0x7BEB, 0xBA5A, 0x7BEC, 0xBA5B, 0x7BED, 0xBA5C, 0x7BEE, 0xC0BA, + 0x7BEF, 0xBA5D, 0x7BF0, 0xBA5E, 0x7BF1, 0xC0E9, 0x7BF2, 0xBA5F, + 0x7BF3, 0xBA60, 0x7BF4, 0xBA61, 0x7BF5, 0xBA62, 0x7BF6, 0xBA63, + 0x7BF7, 0xC5F1, 0x7BF8, 0xBA64, 0x7BF9, 0xBA65, 0x7BFA, 0xBA66, + 0x7BFB, 0xBA67, 0x7BFC, 0xF3FB, 0x7BFD, 0xBA68, 0x7BFE, 0xF3FA, + 0x7BFF, 0xBA69, 0x7C00, 0xBA6A, 0x7C01, 0xBA6B, 0x7C02, 0xBA6C, + 0x7C03, 0xBA6D, 0x7C04, 0xBA6E, 0x7C05, 0xBA6F, 0x7C06, 0xBA70, + 0x7C07, 0xB4D8, 0x7C08, 0xBA71, 0x7C09, 0xBA72, 0x7C0A, 0xBA73, + 0x7C0B, 0xF3FE, 0x7C0C, 0xF3F9, 0x7C0D, 0xBA74, 0x7C0E, 0xBA75, + 0x7C0F, 0xF3FC, 0x7C10, 0xBA76, 0x7C11, 0xBA77, 0x7C12, 0xBA78, + 0x7C13, 0xBA79, 0x7C14, 0xBA7A, 0x7C15, 0xBA7B, 0x7C16, 0xF3FD, + 0x7C17, 0xBA7C, 0x7C18, 0xBA7D, 0x7C19, 0xBA7E, 0x7C1A, 0xBA80, + 0x7C1B, 0xBA81, 0x7C1C, 0xBA82, 0x7C1D, 0xBA83, 0x7C1E, 0xBA84, + 0x7C1F, 0xF4A1, 0x7C20, 0xBA85, 0x7C21, 0xBA86, 0x7C22, 0xBA87, + 0x7C23, 0xBA88, 0x7C24, 0xBA89, 0x7C25, 0xBA8A, 0x7C26, 0xF4A3, + 0x7C27, 0xBBC9, 0x7C28, 0xBA8B, 0x7C29, 0xBA8C, 0x7C2A, 0xF4A2, + 0x7C2B, 0xBA8D, 0x7C2C, 0xBA8E, 0x7C2D, 0xBA8F, 0x7C2E, 0xBA90, + 0x7C2F, 0xBA91, 0x7C30, 0xBA92, 0x7C31, 0xBA93, 0x7C32, 0xBA94, + 0x7C33, 0xBA95, 0x7C34, 0xBA96, 0x7C35, 0xBA97, 0x7C36, 0xBA98, + 0x7C37, 0xBA99, 0x7C38, 0xF4A4, 0x7C39, 0xBA9A, 0x7C3A, 0xBA9B, + 0x7C3B, 0xBA9C, 0x7C3C, 0xBA9D, 0x7C3D, 0xBA9E, 0x7C3E, 0xBA9F, + 0x7C3F, 0xB2BE, 0x7C40, 0xF4A6, 0x7C41, 0xF4A5, 0x7C42, 0xBAA0, + 0x7C43, 0xBB40, 0x7C44, 0xBB41, 0x7C45, 0xBB42, 0x7C46, 0xBB43, + 0x7C47, 0xBB44, 0x7C48, 0xBB45, 0x7C49, 0xBB46, 0x7C4A, 0xBB47, + 0x7C4B, 0xBB48, 0x7C4C, 0xBB49, 0x7C4D, 0xBCAE, 0x7C4E, 0xBB4A, + 0x7C4F, 0xBB4B, 0x7C50, 0xBB4C, 0x7C51, 0xBB4D, 0x7C52, 0xBB4E, + 0x7C53, 0xBB4F, 0x7C54, 0xBB50, 0x7C55, 0xBB51, 0x7C56, 0xBB52, + 0x7C57, 0xBB53, 0x7C58, 0xBB54, 0x7C59, 0xBB55, 0x7C5A, 0xBB56, + 0x7C5B, 0xBB57, 0x7C5C, 0xBB58, 0x7C5D, 0xBB59, 0x7C5E, 0xBB5A, + 0x7C5F, 0xBB5B, 0x7C60, 0xBB5C, 0x7C61, 0xBB5D, 0x7C62, 0xBB5E, + 0x7C63, 0xBB5F, 0x7C64, 0xBB60, 0x7C65, 0xBB61, 0x7C66, 0xBB62, + 0x7C67, 0xBB63, 0x7C68, 0xBB64, 0x7C69, 0xBB65, 0x7C6A, 0xBB66, + 0x7C6B, 0xBB67, 0x7C6C, 0xBB68, 0x7C6D, 0xBB69, 0x7C6E, 0xBB6A, + 0x7C6F, 0xBB6B, 0x7C70, 0xBB6C, 0x7C71, 0xBB6D, 0x7C72, 0xBB6E, + 0x7C73, 0xC3D7, 0x7C74, 0xD9E1, 0x7C75, 0xBB6F, 0x7C76, 0xBB70, + 0x7C77, 0xBB71, 0x7C78, 0xBB72, 0x7C79, 0xBB73, 0x7C7A, 0xBB74, + 0x7C7B, 0xC0E0, 0x7C7C, 0xF4CC, 0x7C7D, 0xD7D1, 0x7C7E, 0xBB75, + 0x7C7F, 0xBB76, 0x7C80, 0xBB77, 0x7C81, 0xBB78, 0x7C82, 0xBB79, + 0x7C83, 0xBB7A, 0x7C84, 0xBB7B, 0x7C85, 0xBB7C, 0x7C86, 0xBB7D, + 0x7C87, 0xBB7E, 0x7C88, 0xBB80, 0x7C89, 0xB7DB, 0x7C8A, 0xBB81, + 0x7C8B, 0xBB82, 0x7C8C, 0xBB83, 0x7C8D, 0xBB84, 0x7C8E, 0xBB85, + 0x7C8F, 0xBB86, 0x7C90, 0xBB87, 0x7C91, 0xF4CE, 0x7C92, 0xC1A3, + 0x7C93, 0xBB88, 0x7C94, 0xBB89, 0x7C95, 0xC6C9, 0x7C96, 0xBB8A, + 0x7C97, 0xB4D6, 0x7C98, 0xD5B3, 0x7C99, 0xBB8B, 0x7C9A, 0xBB8C, + 0x7C9B, 0xBB8D, 0x7C9C, 0xF4D0, 0x7C9D, 0xF4CF, 0x7C9E, 0xF4D1, + 0x7C9F, 0xCBDA, 0x7CA0, 0xBB8E, 0x7CA1, 0xBB8F, 0x7CA2, 0xF4D2, + 0x7CA3, 0xBB90, 0x7CA4, 0xD4C1, 0x7CA5, 0xD6E0, 0x7CA6, 0xBB91, + 0x7CA7, 0xBB92, 0x7CA8, 0xBB93, 0x7CA9, 0xBB94, 0x7CAA, 0xB7E0, + 0x7CAB, 0xBB95, 0x7CAC, 0xBB96, 0x7CAD, 0xBB97, 0x7CAE, 0xC1B8, + 0x7CAF, 0xBB98, 0x7CB0, 0xBB99, 0x7CB1, 0xC1BB, 0x7CB2, 0xF4D3, + 0x7CB3, 0xBEAC, 0x7CB4, 0xBB9A, 0x7CB5, 0xBB9B, 0x7CB6, 0xBB9C, + 0x7CB7, 0xBB9D, 0x7CB8, 0xBB9E, 0x7CB9, 0xB4E2, 0x7CBA, 0xBB9F, + 0x7CBB, 0xBBA0, 0x7CBC, 0xF4D4, 0x7CBD, 0xF4D5, 0x7CBE, 0xBEAB, + 0x7CBF, 0xBC40, 0x7CC0, 0xBC41, 0x7CC1, 0xF4D6, 0x7CC2, 0xBC42, + 0x7CC3, 0xBC43, 0x7CC4, 0xBC44, 0x7CC5, 0xF4DB, 0x7CC6, 0xBC45, + 0x7CC7, 0xF4D7, 0x7CC8, 0xF4DA, 0x7CC9, 0xBC46, 0x7CCA, 0xBAFD, + 0x7CCB, 0xBC47, 0x7CCC, 0xF4D8, 0x7CCD, 0xF4D9, 0x7CCE, 0xBC48, + 0x7CCF, 0xBC49, 0x7CD0, 0xBC4A, 0x7CD1, 0xBC4B, 0x7CD2, 0xBC4C, + 0x7CD3, 0xBC4D, 0x7CD4, 0xBC4E, 0x7CD5, 0xB8E2, 0x7CD6, 0xCCC7, + 0x7CD7, 0xF4DC, 0x7CD8, 0xBC4F, 0x7CD9, 0xB2DA, 0x7CDA, 0xBC50, + 0x7CDB, 0xBC51, 0x7CDC, 0xC3D3, 0x7CDD, 0xBC52, 0x7CDE, 0xBC53, + 0x7CDF, 0xD4E3, 0x7CE0, 0xBFB7, 0x7CE1, 0xBC54, 0x7CE2, 0xBC55, + 0x7CE3, 0xBC56, 0x7CE4, 0xBC57, 0x7CE5, 0xBC58, 0x7CE6, 0xBC59, + 0x7CE7, 0xBC5A, 0x7CE8, 0xF4DD, 0x7CE9, 0xBC5B, 0x7CEA, 0xBC5C, + 0x7CEB, 0xBC5D, 0x7CEC, 0xBC5E, 0x7CED, 0xBC5F, 0x7CEE, 0xBC60, + 0x7CEF, 0xC5B4, 0x7CF0, 0xBC61, 0x7CF1, 0xBC62, 0x7CF2, 0xBC63, + 0x7CF3, 0xBC64, 0x7CF4, 0xBC65, 0x7CF5, 0xBC66, 0x7CF6, 0xBC67, + 0x7CF7, 0xBC68, 0x7CF8, 0xF4E9, 0x7CF9, 0xBC69, 0x7CFA, 0xBC6A, + 0x7CFB, 0xCFB5, 0x7CFC, 0xBC6B, 0x7CFD, 0xBC6C, 0x7CFE, 0xBC6D, + 0x7CFF, 0xBC6E, 0x7D00, 0xBC6F, 0x7D01, 0xBC70, 0x7D02, 0xBC71, + 0x7D03, 0xBC72, 0x7D04, 0xBC73, 0x7D05, 0xBC74, 0x7D06, 0xBC75, + 0x7D07, 0xBC76, 0x7D08, 0xBC77, 0x7D09, 0xBC78, 0x7D0A, 0xCEC9, + 0x7D0B, 0xBC79, 0x7D0C, 0xBC7A, 0x7D0D, 0xBC7B, 0x7D0E, 0xBC7C, + 0x7D0F, 0xBC7D, 0x7D10, 0xBC7E, 0x7D11, 0xBC80, 0x7D12, 0xBC81, + 0x7D13, 0xBC82, 0x7D14, 0xBC83, 0x7D15, 0xBC84, 0x7D16, 0xBC85, + 0x7D17, 0xBC86, 0x7D18, 0xBC87, 0x7D19, 0xBC88, 0x7D1A, 0xBC89, + 0x7D1B, 0xBC8A, 0x7D1C, 0xBC8B, 0x7D1D, 0xBC8C, 0x7D1E, 0xBC8D, + 0x7D1F, 0xBC8E, 0x7D20, 0xCBD8, 0x7D21, 0xBC8F, 0x7D22, 0xCBF7, + 0x7D23, 0xBC90, 0x7D24, 0xBC91, 0x7D25, 0xBC92, 0x7D26, 0xBC93, + 0x7D27, 0xBDF4, 0x7D28, 0xBC94, 0x7D29, 0xBC95, 0x7D2A, 0xBC96, + 0x7D2B, 0xD7CF, 0x7D2C, 0xBC97, 0x7D2D, 0xBC98, 0x7D2E, 0xBC99, + 0x7D2F, 0xC0DB, 0x7D30, 0xBC9A, 0x7D31, 0xBC9B, 0x7D32, 0xBC9C, + 0x7D33, 0xBC9D, 0x7D34, 0xBC9E, 0x7D35, 0xBC9F, 0x7D36, 0xBCA0, + 0x7D37, 0xBD40, 0x7D38, 0xBD41, 0x7D39, 0xBD42, 0x7D3A, 0xBD43, + 0x7D3B, 0xBD44, 0x7D3C, 0xBD45, 0x7D3D, 0xBD46, 0x7D3E, 0xBD47, + 0x7D3F, 0xBD48, 0x7D40, 0xBD49, 0x7D41, 0xBD4A, 0x7D42, 0xBD4B, + 0x7D43, 0xBD4C, 0x7D44, 0xBD4D, 0x7D45, 0xBD4E, 0x7D46, 0xBD4F, + 0x7D47, 0xBD50, 0x7D48, 0xBD51, 0x7D49, 0xBD52, 0x7D4A, 0xBD53, + 0x7D4B, 0xBD54, 0x7D4C, 0xBD55, 0x7D4D, 0xBD56, 0x7D4E, 0xBD57, + 0x7D4F, 0xBD58, 0x7D50, 0xBD59, 0x7D51, 0xBD5A, 0x7D52, 0xBD5B, + 0x7D53, 0xBD5C, 0x7D54, 0xBD5D, 0x7D55, 0xBD5E, 0x7D56, 0xBD5F, + 0x7D57, 0xBD60, 0x7D58, 0xBD61, 0x7D59, 0xBD62, 0x7D5A, 0xBD63, + 0x7D5B, 0xBD64, 0x7D5C, 0xBD65, 0x7D5D, 0xBD66, 0x7D5E, 0xBD67, + 0x7D5F, 0xBD68, 0x7D60, 0xBD69, 0x7D61, 0xBD6A, 0x7D62, 0xBD6B, + 0x7D63, 0xBD6C, 0x7D64, 0xBD6D, 0x7D65, 0xBD6E, 0x7D66, 0xBD6F, + 0x7D67, 0xBD70, 0x7D68, 0xBD71, 0x7D69, 0xBD72, 0x7D6A, 0xBD73, + 0x7D6B, 0xBD74, 0x7D6C, 0xBD75, 0x7D6D, 0xBD76, 0x7D6E, 0xD0F5, + 0x7D6F, 0xBD77, 0x7D70, 0xBD78, 0x7D71, 0xBD79, 0x7D72, 0xBD7A, + 0x7D73, 0xBD7B, 0x7D74, 0xBD7C, 0x7D75, 0xBD7D, 0x7D76, 0xBD7E, + 0x7D77, 0xF4EA, 0x7D78, 0xBD80, 0x7D79, 0xBD81, 0x7D7A, 0xBD82, + 0x7D7B, 0xBD83, 0x7D7C, 0xBD84, 0x7D7D, 0xBD85, 0x7D7E, 0xBD86, + 0x7D7F, 0xBD87, 0x7D80, 0xBD88, 0x7D81, 0xBD89, 0x7D82, 0xBD8A, + 0x7D83, 0xBD8B, 0x7D84, 0xBD8C, 0x7D85, 0xBD8D, 0x7D86, 0xBD8E, + 0x7D87, 0xBD8F, 0x7D88, 0xBD90, 0x7D89, 0xBD91, 0x7D8A, 0xBD92, + 0x7D8B, 0xBD93, 0x7D8C, 0xBD94, 0x7D8D, 0xBD95, 0x7D8E, 0xBD96, + 0x7D8F, 0xBD97, 0x7D90, 0xBD98, 0x7D91, 0xBD99, 0x7D92, 0xBD9A, + 0x7D93, 0xBD9B, 0x7D94, 0xBD9C, 0x7D95, 0xBD9D, 0x7D96, 0xBD9E, + 0x7D97, 0xBD9F, 0x7D98, 0xBDA0, 0x7D99, 0xBE40, 0x7D9A, 0xBE41, + 0x7D9B, 0xBE42, 0x7D9C, 0xBE43, 0x7D9D, 0xBE44, 0x7D9E, 0xBE45, + 0x7D9F, 0xBE46, 0x7DA0, 0xBE47, 0x7DA1, 0xBE48, 0x7DA2, 0xBE49, + 0x7DA3, 0xBE4A, 0x7DA4, 0xBE4B, 0x7DA5, 0xBE4C, 0x7DA6, 0xF4EB, + 0x7DA7, 0xBE4D, 0x7DA8, 0xBE4E, 0x7DA9, 0xBE4F, 0x7DAA, 0xBE50, + 0x7DAB, 0xBE51, 0x7DAC, 0xBE52, 0x7DAD, 0xBE53, 0x7DAE, 0xF4EC, + 0x7DAF, 0xBE54, 0x7DB0, 0xBE55, 0x7DB1, 0xBE56, 0x7DB2, 0xBE57, + 0x7DB3, 0xBE58, 0x7DB4, 0xBE59, 0x7DB5, 0xBE5A, 0x7DB6, 0xBE5B, + 0x7DB7, 0xBE5C, 0x7DB8, 0xBE5D, 0x7DB9, 0xBE5E, 0x7DBA, 0xBE5F, + 0x7DBB, 0xBE60, 0x7DBC, 0xBE61, 0x7DBD, 0xBE62, 0x7DBE, 0xBE63, + 0x7DBF, 0xBE64, 0x7DC0, 0xBE65, 0x7DC1, 0xBE66, 0x7DC2, 0xBE67, + 0x7DC3, 0xBE68, 0x7DC4, 0xBE69, 0x7DC5, 0xBE6A, 0x7DC6, 0xBE6B, + 0x7DC7, 0xBE6C, 0x7DC8, 0xBE6D, 0x7DC9, 0xBE6E, 0x7DCA, 0xBE6F, + 0x7DCB, 0xBE70, 0x7DCC, 0xBE71, 0x7DCD, 0xBE72, 0x7DCE, 0xBE73, + 0x7DCF, 0xBE74, 0x7DD0, 0xBE75, 0x7DD1, 0xBE76, 0x7DD2, 0xBE77, + 0x7DD3, 0xBE78, 0x7DD4, 0xBE79, 0x7DD5, 0xBE7A, 0x7DD6, 0xBE7B, + 0x7DD7, 0xBE7C, 0x7DD8, 0xBE7D, 0x7DD9, 0xBE7E, 0x7DDA, 0xBE80, + 0x7DDB, 0xBE81, 0x7DDC, 0xBE82, 0x7DDD, 0xBE83, 0x7DDE, 0xBE84, + 0x7DDF, 0xBE85, 0x7DE0, 0xBE86, 0x7DE1, 0xBE87, 0x7DE2, 0xBE88, + 0x7DE3, 0xBE89, 0x7DE4, 0xBE8A, 0x7DE5, 0xBE8B, 0x7DE6, 0xBE8C, + 0x7DE7, 0xBE8D, 0x7DE8, 0xBE8E, 0x7DE9, 0xBE8F, 0x7DEA, 0xBE90, + 0x7DEB, 0xBE91, 0x7DEC, 0xBE92, 0x7DED, 0xBE93, 0x7DEE, 0xBE94, + 0x7DEF, 0xBE95, 0x7DF0, 0xBE96, 0x7DF1, 0xBE97, 0x7DF2, 0xBE98, + 0x7DF3, 0xBE99, 0x7DF4, 0xBE9A, 0x7DF5, 0xBE9B, 0x7DF6, 0xBE9C, + 0x7DF7, 0xBE9D, 0x7DF8, 0xBE9E, 0x7DF9, 0xBE9F, 0x7DFA, 0xBEA0, + 0x7DFB, 0xBF40, 0x7DFC, 0xBF41, 0x7DFD, 0xBF42, 0x7DFE, 0xBF43, + 0x7DFF, 0xBF44, 0x7E00, 0xBF45, 0x7E01, 0xBF46, 0x7E02, 0xBF47, + 0x7E03, 0xBF48, 0x7E04, 0xBF49, 0x7E05, 0xBF4A, 0x7E06, 0xBF4B, + 0x7E07, 0xBF4C, 0x7E08, 0xBF4D, 0x7E09, 0xBF4E, 0x7E0A, 0xBF4F, + 0x7E0B, 0xBF50, 0x7E0C, 0xBF51, 0x7E0D, 0xBF52, 0x7E0E, 0xBF53, + 0x7E0F, 0xBF54, 0x7E10, 0xBF55, 0x7E11, 0xBF56, 0x7E12, 0xBF57, + 0x7E13, 0xBF58, 0x7E14, 0xBF59, 0x7E15, 0xBF5A, 0x7E16, 0xBF5B, + 0x7E17, 0xBF5C, 0x7E18, 0xBF5D, 0x7E19, 0xBF5E, 0x7E1A, 0xBF5F, + 0x7E1B, 0xBF60, 0x7E1C, 0xBF61, 0x7E1D, 0xBF62, 0x7E1E, 0xBF63, + 0x7E1F, 0xBF64, 0x7E20, 0xBF65, 0x7E21, 0xBF66, 0x7E22, 0xBF67, + 0x7E23, 0xBF68, 0x7E24, 0xBF69, 0x7E25, 0xBF6A, 0x7E26, 0xBF6B, + 0x7E27, 0xBF6C, 0x7E28, 0xBF6D, 0x7E29, 0xBF6E, 0x7E2A, 0xBF6F, + 0x7E2B, 0xBF70, 0x7E2C, 0xBF71, 0x7E2D, 0xBF72, 0x7E2E, 0xBF73, + 0x7E2F, 0xBF74, 0x7E30, 0xBF75, 0x7E31, 0xBF76, 0x7E32, 0xBF77, + 0x7E33, 0xBF78, 0x7E34, 0xBF79, 0x7E35, 0xBF7A, 0x7E36, 0xBF7B, + 0x7E37, 0xBF7C, 0x7E38, 0xBF7D, 0x7E39, 0xBF7E, 0x7E3A, 0xBF80, + 0x7E3B, 0xF7E3, 0x7E3C, 0xBF81, 0x7E3D, 0xBF82, 0x7E3E, 0xBF83, + 0x7E3F, 0xBF84, 0x7E40, 0xBF85, 0x7E41, 0xB7B1, 0x7E42, 0xBF86, + 0x7E43, 0xBF87, 0x7E44, 0xBF88, 0x7E45, 0xBF89, 0x7E46, 0xBF8A, + 0x7E47, 0xF4ED, 0x7E48, 0xBF8B, 0x7E49, 0xBF8C, 0x7E4A, 0xBF8D, + 0x7E4B, 0xBF8E, 0x7E4C, 0xBF8F, 0x7E4D, 0xBF90, 0x7E4E, 0xBF91, + 0x7E4F, 0xBF92, 0x7E50, 0xBF93, 0x7E51, 0xBF94, 0x7E52, 0xBF95, + 0x7E53, 0xBF96, 0x7E54, 0xBF97, 0x7E55, 0xBF98, 0x7E56, 0xBF99, + 0x7E57, 0xBF9A, 0x7E58, 0xBF9B, 0x7E59, 0xBF9C, 0x7E5A, 0xBF9D, + 0x7E5B, 0xBF9E, 0x7E5C, 0xBF9F, 0x7E5D, 0xBFA0, 0x7E5E, 0xC040, + 0x7E5F, 0xC041, 0x7E60, 0xC042, 0x7E61, 0xC043, 0x7E62, 0xC044, + 0x7E63, 0xC045, 0x7E64, 0xC046, 0x7E65, 0xC047, 0x7E66, 0xC048, + 0x7E67, 0xC049, 0x7E68, 0xC04A, 0x7E69, 0xC04B, 0x7E6A, 0xC04C, + 0x7E6B, 0xC04D, 0x7E6C, 0xC04E, 0x7E6D, 0xC04F, 0x7E6E, 0xC050, + 0x7E6F, 0xC051, 0x7E70, 0xC052, 0x7E71, 0xC053, 0x7E72, 0xC054, + 0x7E73, 0xC055, 0x7E74, 0xC056, 0x7E75, 0xC057, 0x7E76, 0xC058, + 0x7E77, 0xC059, 0x7E78, 0xC05A, 0x7E79, 0xC05B, 0x7E7A, 0xC05C, + 0x7E7B, 0xC05D, 0x7E7C, 0xC05E, 0x7E7D, 0xC05F, 0x7E7E, 0xC060, + 0x7E7F, 0xC061, 0x7E80, 0xC062, 0x7E81, 0xC063, 0x7E82, 0xD7EB, + 0x7E83, 0xC064, 0x7E84, 0xC065, 0x7E85, 0xC066, 0x7E86, 0xC067, + 0x7E87, 0xC068, 0x7E88, 0xC069, 0x7E89, 0xC06A, 0x7E8A, 0xC06B, + 0x7E8B, 0xC06C, 0x7E8C, 0xC06D, 0x7E8D, 0xC06E, 0x7E8E, 0xC06F, + 0x7E8F, 0xC070, 0x7E90, 0xC071, 0x7E91, 0xC072, 0x7E92, 0xC073, + 0x7E93, 0xC074, 0x7E94, 0xC075, 0x7E95, 0xC076, 0x7E96, 0xC077, + 0x7E97, 0xC078, 0x7E98, 0xC079, 0x7E99, 0xC07A, 0x7E9A, 0xC07B, + 0x7E9B, 0xF4EE, 0x7E9C, 0xC07C, 0x7E9D, 0xC07D, 0x7E9E, 0xC07E, + 0x7E9F, 0xE6F9, 0x7EA0, 0xBEC0, 0x7EA1, 0xE6FA, 0x7EA2, 0xBAEC, + 0x7EA3, 0xE6FB, 0x7EA4, 0xCFCB, 0x7EA5, 0xE6FC, 0x7EA6, 0xD4BC, + 0x7EA7, 0xBCB6, 0x7EA8, 0xE6FD, 0x7EA9, 0xE6FE, 0x7EAA, 0xBCCD, + 0x7EAB, 0xC8D2, 0x7EAC, 0xCEB3, 0x7EAD, 0xE7A1, 0x7EAE, 0xC080, + 0x7EAF, 0xB4BF, 0x7EB0, 0xE7A2, 0x7EB1, 0xC9B4, 0x7EB2, 0xB8D9, + 0x7EB3, 0xC4C9, 0x7EB4, 0xC081, 0x7EB5, 0xD7DD, 0x7EB6, 0xC2DA, + 0x7EB7, 0xB7D7, 0x7EB8, 0xD6BD, 0x7EB9, 0xCEC6, 0x7EBA, 0xB7C4, + 0x7EBB, 0xC082, 0x7EBC, 0xC083, 0x7EBD, 0xC5A6, 0x7EBE, 0xE7A3, + 0x7EBF, 0xCFDF, 0x7EC0, 0xE7A4, 0x7EC1, 0xE7A5, 0x7EC2, 0xE7A6, + 0x7EC3, 0xC1B7, 0x7EC4, 0xD7E9, 0x7EC5, 0xC9F0, 0x7EC6, 0xCFB8, + 0x7EC7, 0xD6AF, 0x7EC8, 0xD6D5, 0x7EC9, 0xE7A7, 0x7ECA, 0xB0ED, + 0x7ECB, 0xE7A8, 0x7ECC, 0xE7A9, 0x7ECD, 0xC9DC, 0x7ECE, 0xD2EF, + 0x7ECF, 0xBEAD, 0x7ED0, 0xE7AA, 0x7ED1, 0xB0F3, 0x7ED2, 0xC8DE, + 0x7ED3, 0xBDE1, 0x7ED4, 0xE7AB, 0x7ED5, 0xC8C6, 0x7ED6, 0xC084, + 0x7ED7, 0xE7AC, 0x7ED8, 0xBBE6, 0x7ED9, 0xB8F8, 0x7EDA, 0xD1A4, + 0x7EDB, 0xE7AD, 0x7EDC, 0xC2E7, 0x7EDD, 0xBEF8, 0x7EDE, 0xBDCA, + 0x7EDF, 0xCDB3, 0x7EE0, 0xE7AE, 0x7EE1, 0xE7AF, 0x7EE2, 0xBEEE, + 0x7EE3, 0xD0E5, 0x7EE4, 0xC085, 0x7EE5, 0xCBE7, 0x7EE6, 0xCCD0, + 0x7EE7, 0xBCCC, 0x7EE8, 0xE7B0, 0x7EE9, 0xBCA8, 0x7EEA, 0xD0F7, + 0x7EEB, 0xE7B1, 0x7EEC, 0xC086, 0x7EED, 0xD0F8, 0x7EEE, 0xE7B2, + 0x7EEF, 0xE7B3, 0x7EF0, 0xB4C2, 0x7EF1, 0xE7B4, 0x7EF2, 0xE7B5, + 0x7EF3, 0xC9FE, 0x7EF4, 0xCEAC, 0x7EF5, 0xC3E0, 0x7EF6, 0xE7B7, + 0x7EF7, 0xB1C1, 0x7EF8, 0xB3F1, 0x7EF9, 0xC087, 0x7EFA, 0xE7B8, + 0x7EFB, 0xE7B9, 0x7EFC, 0xD7DB, 0x7EFD, 0xD5C0, 0x7EFE, 0xE7BA, + 0x7EFF, 0xC2CC, 0x7F00, 0xD7BA, 0x7F01, 0xE7BB, 0x7F02, 0xE7BC, + 0x7F03, 0xE7BD, 0x7F04, 0xBCEA, 0x7F05, 0xC3E5, 0x7F06, 0xC0C2, + 0x7F07, 0xE7BE, 0x7F08, 0xE7BF, 0x7F09, 0xBCA9, 0x7F0A, 0xC088, + 0x7F0B, 0xE7C0, 0x7F0C, 0xE7C1, 0x7F0D, 0xE7B6, 0x7F0E, 0xB6D0, + 0x7F0F, 0xE7C2, 0x7F10, 0xC089, 0x7F11, 0xE7C3, 0x7F12, 0xE7C4, + 0x7F13, 0xBBBA, 0x7F14, 0xB5DE, 0x7F15, 0xC2C6, 0x7F16, 0xB1E0, + 0x7F17, 0xE7C5, 0x7F18, 0xD4B5, 0x7F19, 0xE7C6, 0x7F1A, 0xB8BF, + 0x7F1B, 0xE7C8, 0x7F1C, 0xE7C7, 0x7F1D, 0xB7EC, 0x7F1E, 0xC08A, + 0x7F1F, 0xE7C9, 0x7F20, 0xB2F8, 0x7F21, 0xE7CA, 0x7F22, 0xE7CB, + 0x7F23, 0xE7CC, 0x7F24, 0xE7CD, 0x7F25, 0xE7CE, 0x7F26, 0xE7CF, + 0x7F27, 0xE7D0, 0x7F28, 0xD3A7, 0x7F29, 0xCBF5, 0x7F2A, 0xE7D1, + 0x7F2B, 0xE7D2, 0x7F2C, 0xE7D3, 0x7F2D, 0xE7D4, 0x7F2E, 0xC9C9, + 0x7F2F, 0xE7D5, 0x7F30, 0xE7D6, 0x7F31, 0xE7D7, 0x7F32, 0xE7D8, + 0x7F33, 0xE7D9, 0x7F34, 0xBDC9, 0x7F35, 0xE7DA, 0x7F36, 0xF3BE, + 0x7F37, 0xC08B, 0x7F38, 0xB8D7, 0x7F39, 0xC08C, 0x7F3A, 0xC8B1, + 0x7F3B, 0xC08D, 0x7F3C, 0xC08E, 0x7F3D, 0xC08F, 0x7F3E, 0xC090, + 0x7F3F, 0xC091, 0x7F40, 0xC092, 0x7F41, 0xC093, 0x7F42, 0xF3BF, + 0x7F43, 0xC094, 0x7F44, 0xF3C0, 0x7F45, 0xF3C1, 0x7F46, 0xC095, + 0x7F47, 0xC096, 0x7F48, 0xC097, 0x7F49, 0xC098, 0x7F4A, 0xC099, + 0x7F4B, 0xC09A, 0x7F4C, 0xC09B, 0x7F4D, 0xC09C, 0x7F4E, 0xC09D, + 0x7F4F, 0xC09E, 0x7F50, 0xB9DE, 0x7F51, 0xCDF8, 0x7F52, 0xC09F, + 0x7F53, 0xC0A0, 0x7F54, 0xD8E8, 0x7F55, 0xBAB1, 0x7F56, 0xC140, + 0x7F57, 0xC2DE, 0x7F58, 0xEEB7, 0x7F59, 0xC141, 0x7F5A, 0xB7A3, + 0x7F5B, 0xC142, 0x7F5C, 0xC143, 0x7F5D, 0xC144, 0x7F5E, 0xC145, + 0x7F5F, 0xEEB9, 0x7F60, 0xC146, 0x7F61, 0xEEB8, 0x7F62, 0xB0D5, + 0x7F63, 0xC147, 0x7F64, 0xC148, 0x7F65, 0xC149, 0x7F66, 0xC14A, + 0x7F67, 0xC14B, 0x7F68, 0xEEBB, 0x7F69, 0xD5D6, 0x7F6A, 0xD7EF, + 0x7F6B, 0xC14C, 0x7F6C, 0xC14D, 0x7F6D, 0xC14E, 0x7F6E, 0xD6C3, + 0x7F6F, 0xC14F, 0x7F70, 0xC150, 0x7F71, 0xEEBD, 0x7F72, 0xCAF0, + 0x7F73, 0xC151, 0x7F74, 0xEEBC, 0x7F75, 0xC152, 0x7F76, 0xC153, + 0x7F77, 0xC154, 0x7F78, 0xC155, 0x7F79, 0xEEBE, 0x7F7A, 0xC156, + 0x7F7B, 0xC157, 0x7F7C, 0xC158, 0x7F7D, 0xC159, 0x7F7E, 0xEEC0, + 0x7F7F, 0xC15A, 0x7F80, 0xC15B, 0x7F81, 0xEEBF, 0x7F82, 0xC15C, + 0x7F83, 0xC15D, 0x7F84, 0xC15E, 0x7F85, 0xC15F, 0x7F86, 0xC160, + 0x7F87, 0xC161, 0x7F88, 0xC162, 0x7F89, 0xC163, 0x7F8A, 0xD1F2, + 0x7F8B, 0xC164, 0x7F8C, 0xC7BC, 0x7F8D, 0xC165, 0x7F8E, 0xC3C0, + 0x7F8F, 0xC166, 0x7F90, 0xC167, 0x7F91, 0xC168, 0x7F92, 0xC169, + 0x7F93, 0xC16A, 0x7F94, 0xB8E1, 0x7F95, 0xC16B, 0x7F96, 0xC16C, + 0x7F97, 0xC16D, 0x7F98, 0xC16E, 0x7F99, 0xC16F, 0x7F9A, 0xC1E7, + 0x7F9B, 0xC170, 0x7F9C, 0xC171, 0x7F9D, 0xF4C6, 0x7F9E, 0xD0DF, + 0x7F9F, 0xF4C7, 0x7FA0, 0xC172, 0x7FA1, 0xCFDB, 0x7FA2, 0xC173, + 0x7FA3, 0xC174, 0x7FA4, 0xC8BA, 0x7FA5, 0xC175, 0x7FA6, 0xC176, + 0x7FA7, 0xF4C8, 0x7FA8, 0xC177, 0x7FA9, 0xC178, 0x7FAA, 0xC179, + 0x7FAB, 0xC17A, 0x7FAC, 0xC17B, 0x7FAD, 0xC17C, 0x7FAE, 0xC17D, + 0x7FAF, 0xF4C9, 0x7FB0, 0xF4CA, 0x7FB1, 0xC17E, 0x7FB2, 0xF4CB, + 0x7FB3, 0xC180, 0x7FB4, 0xC181, 0x7FB5, 0xC182, 0x7FB6, 0xC183, + 0x7FB7, 0xC184, 0x7FB8, 0xD9FA, 0x7FB9, 0xB8FE, 0x7FBA, 0xC185, + 0x7FBB, 0xC186, 0x7FBC, 0xE5F1, 0x7FBD, 0xD3F0, 0x7FBE, 0xC187, + 0x7FBF, 0xF4E0, 0x7FC0, 0xC188, 0x7FC1, 0xCECC, 0x7FC2, 0xC189, + 0x7FC3, 0xC18A, 0x7FC4, 0xC18B, 0x7FC5, 0xB3E1, 0x7FC6, 0xC18C, + 0x7FC7, 0xC18D, 0x7FC8, 0xC18E, 0x7FC9, 0xC18F, 0x7FCA, 0xF1B4, + 0x7FCB, 0xC190, 0x7FCC, 0xD2EE, 0x7FCD, 0xC191, 0x7FCE, 0xF4E1, + 0x7FCF, 0xC192, 0x7FD0, 0xC193, 0x7FD1, 0xC194, 0x7FD2, 0xC195, + 0x7FD3, 0xC196, 0x7FD4, 0xCFE8, 0x7FD5, 0xF4E2, 0x7FD6, 0xC197, + 0x7FD7, 0xC198, 0x7FD8, 0xC7CC, 0x7FD9, 0xC199, 0x7FDA, 0xC19A, + 0x7FDB, 0xC19B, 0x7FDC, 0xC19C, 0x7FDD, 0xC19D, 0x7FDE, 0xC19E, + 0x7FDF, 0xB5D4, 0x7FE0, 0xB4E4, 0x7FE1, 0xF4E4, 0x7FE2, 0xC19F, + 0x7FE3, 0xC1A0, 0x7FE4, 0xC240, 0x7FE5, 0xF4E3, 0x7FE6, 0xF4E5, + 0x7FE7, 0xC241, 0x7FE8, 0xC242, 0x7FE9, 0xF4E6, 0x7FEA, 0xC243, + 0x7FEB, 0xC244, 0x7FEC, 0xC245, 0x7FED, 0xC246, 0x7FEE, 0xF4E7, + 0x7FEF, 0xC247, 0x7FF0, 0xBAB2, 0x7FF1, 0xB0BF, 0x7FF2, 0xC248, + 0x7FF3, 0xF4E8, 0x7FF4, 0xC249, 0x7FF5, 0xC24A, 0x7FF6, 0xC24B, + 0x7FF7, 0xC24C, 0x7FF8, 0xC24D, 0x7FF9, 0xC24E, 0x7FFA, 0xC24F, + 0x7FFB, 0xB7AD, 0x7FFC, 0xD2ED, 0x7FFD, 0xC250, 0x7FFE, 0xC251, + 0x7FFF, 0xC252, 0x8000, 0xD2AB, 0x8001, 0xC0CF, 0x8002, 0xC253, + 0x8003, 0xBFBC, 0x8004, 0xEBA3, 0x8005, 0xD5DF, 0x8006, 0xEAC8, + 0x8007, 0xC254, 0x8008, 0xC255, 0x8009, 0xC256, 0x800A, 0xC257, + 0x800B, 0xF1F3, 0x800C, 0xB6F8, 0x800D, 0xCBA3, 0x800E, 0xC258, + 0x800F, 0xC259, 0x8010, 0xC4CD, 0x8011, 0xC25A, 0x8012, 0xF1E7, + 0x8013, 0xC25B, 0x8014, 0xF1E8, 0x8015, 0xB8FB, 0x8016, 0xF1E9, + 0x8017, 0xBAC4, 0x8018, 0xD4C5, 0x8019, 0xB0D2, 0x801A, 0xC25C, + 0x801B, 0xC25D, 0x801C, 0xF1EA, 0x801D, 0xC25E, 0x801E, 0xC25F, + 0x801F, 0xC260, 0x8020, 0xF1EB, 0x8021, 0xC261, 0x8022, 0xF1EC, + 0x8023, 0xC262, 0x8024, 0xC263, 0x8025, 0xF1ED, 0x8026, 0xF1EE, + 0x8027, 0xF1EF, 0x8028, 0xF1F1, 0x8029, 0xF1F0, 0x802A, 0xC5D5, + 0x802B, 0xC264, 0x802C, 0xC265, 0x802D, 0xC266, 0x802E, 0xC267, + 0x802F, 0xC268, 0x8030, 0xC269, 0x8031, 0xF1F2, 0x8032, 0xC26A, + 0x8033, 0xB6FA, 0x8034, 0xC26B, 0x8035, 0xF1F4, 0x8036, 0xD2AE, + 0x8037, 0xDEC7, 0x8038, 0xCBCA, 0x8039, 0xC26C, 0x803A, 0xC26D, + 0x803B, 0xB3DC, 0x803C, 0xC26E, 0x803D, 0xB5A2, 0x803E, 0xC26F, + 0x803F, 0xB9A2, 0x8040, 0xC270, 0x8041, 0xC271, 0x8042, 0xC4F4, + 0x8043, 0xF1F5, 0x8044, 0xC272, 0x8045, 0xC273, 0x8046, 0xF1F6, + 0x8047, 0xC274, 0x8048, 0xC275, 0x8049, 0xC276, 0x804A, 0xC1C4, + 0x804B, 0xC1FB, 0x804C, 0xD6B0, 0x804D, 0xF1F7, 0x804E, 0xC277, + 0x804F, 0xC278, 0x8050, 0xC279, 0x8051, 0xC27A, 0x8052, 0xF1F8, + 0x8053, 0xC27B, 0x8054, 0xC1AA, 0x8055, 0xC27C, 0x8056, 0xC27D, + 0x8057, 0xC27E, 0x8058, 0xC6B8, 0x8059, 0xC280, 0x805A, 0xBEDB, + 0x805B, 0xC281, 0x805C, 0xC282, 0x805D, 0xC283, 0x805E, 0xC284, + 0x805F, 0xC285, 0x8060, 0xC286, 0x8061, 0xC287, 0x8062, 0xC288, + 0x8063, 0xC289, 0x8064, 0xC28A, 0x8065, 0xC28B, 0x8066, 0xC28C, + 0x8067, 0xC28D, 0x8068, 0xC28E, 0x8069, 0xF1F9, 0x806A, 0xB4CF, + 0x806B, 0xC28F, 0x806C, 0xC290, 0x806D, 0xC291, 0x806E, 0xC292, + 0x806F, 0xC293, 0x8070, 0xC294, 0x8071, 0xF1FA, 0x8072, 0xC295, + 0x8073, 0xC296, 0x8074, 0xC297, 0x8075, 0xC298, 0x8076, 0xC299, + 0x8077, 0xC29A, 0x8078, 0xC29B, 0x8079, 0xC29C, 0x807A, 0xC29D, + 0x807B, 0xC29E, 0x807C, 0xC29F, 0x807D, 0xC2A0, 0x807E, 0xC340, + 0x807F, 0xEDB2, 0x8080, 0xEDB1, 0x8081, 0xC341, 0x8082, 0xC342, + 0x8083, 0xCBE0, 0x8084, 0xD2DE, 0x8085, 0xC343, 0x8086, 0xCBC1, + 0x8087, 0xD5D8, 0x8088, 0xC344, 0x8089, 0xC8E2, 0x808A, 0xC345, + 0x808B, 0xC0DF, 0x808C, 0xBCA1, 0x808D, 0xC346, 0x808E, 0xC347, + 0x808F, 0xC348, 0x8090, 0xC349, 0x8091, 0xC34A, 0x8092, 0xC34B, + 0x8093, 0xEBC1, 0x8094, 0xC34C, 0x8095, 0xC34D, 0x8096, 0xD0A4, + 0x8097, 0xC34E, 0x8098, 0xD6E2, 0x8099, 0xC34F, 0x809A, 0xB6C7, + 0x809B, 0xB8D8, 0x809C, 0xEBC0, 0x809D, 0xB8CE, 0x809E, 0xC350, + 0x809F, 0xEBBF, 0x80A0, 0xB3A6, 0x80A1, 0xB9C9, 0x80A2, 0xD6AB, + 0x80A3, 0xC351, 0x80A4, 0xB7F4, 0x80A5, 0xB7CA, 0x80A6, 0xC352, + 0x80A7, 0xC353, 0x80A8, 0xC354, 0x80A9, 0xBCE7, 0x80AA, 0xB7BE, + 0x80AB, 0xEBC6, 0x80AC, 0xC355, 0x80AD, 0xEBC7, 0x80AE, 0xB0B9, + 0x80AF, 0xBFCF, 0x80B0, 0xC356, 0x80B1, 0xEBC5, 0x80B2, 0xD3FD, + 0x80B3, 0xC357, 0x80B4, 0xEBC8, 0x80B5, 0xC358, 0x80B6, 0xC359, + 0x80B7, 0xEBC9, 0x80B8, 0xC35A, 0x80B9, 0xC35B, 0x80BA, 0xB7CE, + 0x80BB, 0xC35C, 0x80BC, 0xEBC2, 0x80BD, 0xEBC4, 0x80BE, 0xC9F6, + 0x80BF, 0xD6D7, 0x80C0, 0xD5CD, 0x80C1, 0xD0B2, 0x80C2, 0xEBCF, + 0x80C3, 0xCEB8, 0x80C4, 0xEBD0, 0x80C5, 0xC35D, 0x80C6, 0xB5A8, + 0x80C7, 0xC35E, 0x80C8, 0xC35F, 0x80C9, 0xC360, 0x80CA, 0xC361, + 0x80CB, 0xC362, 0x80CC, 0xB1B3, 0x80CD, 0xEBD2, 0x80CE, 0xCCA5, + 0x80CF, 0xC363, 0x80D0, 0xC364, 0x80D1, 0xC365, 0x80D2, 0xC366, + 0x80D3, 0xC367, 0x80D4, 0xC368, 0x80D5, 0xC369, 0x80D6, 0xC5D6, + 0x80D7, 0xEBD3, 0x80D8, 0xC36A, 0x80D9, 0xEBD1, 0x80DA, 0xC5DF, + 0x80DB, 0xEBCE, 0x80DC, 0xCAA4, 0x80DD, 0xEBD5, 0x80DE, 0xB0FB, + 0x80DF, 0xC36B, 0x80E0, 0xC36C, 0x80E1, 0xBAFA, 0x80E2, 0xC36D, + 0x80E3, 0xC36E, 0x80E4, 0xD8B7, 0x80E5, 0xF1E3, 0x80E6, 0xC36F, + 0x80E7, 0xEBCA, 0x80E8, 0xEBCB, 0x80E9, 0xEBCC, 0x80EA, 0xEBCD, + 0x80EB, 0xEBD6, 0x80EC, 0xE6C0, 0x80ED, 0xEBD9, 0x80EE, 0xC370, + 0x80EF, 0xBFE8, 0x80F0, 0xD2C8, 0x80F1, 0xEBD7, 0x80F2, 0xEBDC, + 0x80F3, 0xB8EC, 0x80F4, 0xEBD8, 0x80F5, 0xC371, 0x80F6, 0xBDBA, + 0x80F7, 0xC372, 0x80F8, 0xD0D8, 0x80F9, 0xC373, 0x80FA, 0xB0B7, + 0x80FB, 0xC374, 0x80FC, 0xEBDD, 0x80FD, 0xC4DC, 0x80FE, 0xC375, + 0x80FF, 0xC376, 0x8100, 0xC377, 0x8101, 0xC378, 0x8102, 0xD6AC, + 0x8103, 0xC379, 0x8104, 0xC37A, 0x8105, 0xC37B, 0x8106, 0xB4E0, + 0x8107, 0xC37C, 0x8108, 0xC37D, 0x8109, 0xC2F6, 0x810A, 0xBCB9, + 0x810B, 0xC37E, 0x810C, 0xC380, 0x810D, 0xEBDA, 0x810E, 0xEBDB, + 0x810F, 0xD4E0, 0x8110, 0xC6EA, 0x8111, 0xC4D4, 0x8112, 0xEBDF, + 0x8113, 0xC5A7, 0x8114, 0xD9F5, 0x8115, 0xC381, 0x8116, 0xB2B1, + 0x8117, 0xC382, 0x8118, 0xEBE4, 0x8119, 0xC383, 0x811A, 0xBDC5, + 0x811B, 0xC384, 0x811C, 0xC385, 0x811D, 0xC386, 0x811E, 0xEBE2, + 0x811F, 0xC387, 0x8120, 0xC388, 0x8121, 0xC389, 0x8122, 0xC38A, + 0x8123, 0xC38B, 0x8124, 0xC38C, 0x8125, 0xC38D, 0x8126, 0xC38E, + 0x8127, 0xC38F, 0x8128, 0xC390, 0x8129, 0xC391, 0x812A, 0xC392, + 0x812B, 0xC393, 0x812C, 0xEBE3, 0x812D, 0xC394, 0x812E, 0xC395, + 0x812F, 0xB8AC, 0x8130, 0xC396, 0x8131, 0xCDD1, 0x8132, 0xEBE5, + 0x8133, 0xC397, 0x8134, 0xC398, 0x8135, 0xC399, 0x8136, 0xEBE1, + 0x8137, 0xC39A, 0x8138, 0xC1B3, 0x8139, 0xC39B, 0x813A, 0xC39C, + 0x813B, 0xC39D, 0x813C, 0xC39E, 0x813D, 0xC39F, 0x813E, 0xC6A2, + 0x813F, 0xC3A0, 0x8140, 0xC440, 0x8141, 0xC441, 0x8142, 0xC442, + 0x8143, 0xC443, 0x8144, 0xC444, 0x8145, 0xC445, 0x8146, 0xCCF3, + 0x8147, 0xC446, 0x8148, 0xEBE6, 0x8149, 0xC447, 0x814A, 0xC0B0, + 0x814B, 0xD2B8, 0x814C, 0xEBE7, 0x814D, 0xC448, 0x814E, 0xC449, + 0x814F, 0xC44A, 0x8150, 0xB8AF, 0x8151, 0xB8AD, 0x8152, 0xC44B, + 0x8153, 0xEBE8, 0x8154, 0xC7BB, 0x8155, 0xCDF3, 0x8156, 0xC44C, + 0x8157, 0xC44D, 0x8158, 0xC44E, 0x8159, 0xEBEA, 0x815A, 0xEBEB, + 0x815B, 0xC44F, 0x815C, 0xC450, 0x815D, 0xC451, 0x815E, 0xC452, + 0x815F, 0xC453, 0x8160, 0xEBED, 0x8161, 0xC454, 0x8162, 0xC455, + 0x8163, 0xC456, 0x8164, 0xC457, 0x8165, 0xD0C8, 0x8166, 0xC458, + 0x8167, 0xEBF2, 0x8168, 0xC459, 0x8169, 0xEBEE, 0x816A, 0xC45A, + 0x816B, 0xC45B, 0x816C, 0xC45C, 0x816D, 0xEBF1, 0x816E, 0xC8F9, + 0x816F, 0xC45D, 0x8170, 0xD1FC, 0x8171, 0xEBEC, 0x8172, 0xC45E, + 0x8173, 0xC45F, 0x8174, 0xEBE9, 0x8175, 0xC460, 0x8176, 0xC461, + 0x8177, 0xC462, 0x8178, 0xC463, 0x8179, 0xB8B9, 0x817A, 0xCFD9, + 0x817B, 0xC4E5, 0x817C, 0xEBEF, 0x817D, 0xEBF0, 0x817E, 0xCCDA, + 0x817F, 0xCDC8, 0x8180, 0xB0F2, 0x8181, 0xC464, 0x8182, 0xEBF6, + 0x8183, 0xC465, 0x8184, 0xC466, 0x8185, 0xC467, 0x8186, 0xC468, + 0x8187, 0xC469, 0x8188, 0xEBF5, 0x8189, 0xC46A, 0x818A, 0xB2B2, + 0x818B, 0xC46B, 0x818C, 0xC46C, 0x818D, 0xC46D, 0x818E, 0xC46E, + 0x818F, 0xB8E0, 0x8190, 0xC46F, 0x8191, 0xEBF7, 0x8192, 0xC470, + 0x8193, 0xC471, 0x8194, 0xC472, 0x8195, 0xC473, 0x8196, 0xC474, + 0x8197, 0xC475, 0x8198, 0xB1EC, 0x8199, 0xC476, 0x819A, 0xC477, + 0x819B, 0xCCC5, 0x819C, 0xC4A4, 0x819D, 0xCFA5, 0x819E, 0xC478, + 0x819F, 0xC479, 0x81A0, 0xC47A, 0x81A1, 0xC47B, 0x81A2, 0xC47C, + 0x81A3, 0xEBF9, 0x81A4, 0xC47D, 0x81A5, 0xC47E, 0x81A6, 0xECA2, + 0x81A7, 0xC480, 0x81A8, 0xC5F2, 0x81A9, 0xC481, 0x81AA, 0xEBFA, + 0x81AB, 0xC482, 0x81AC, 0xC483, 0x81AD, 0xC484, 0x81AE, 0xC485, + 0x81AF, 0xC486, 0x81B0, 0xC487, 0x81B1, 0xC488, 0x81B2, 0xC489, + 0x81B3, 0xC9C5, 0x81B4, 0xC48A, 0x81B5, 0xC48B, 0x81B6, 0xC48C, + 0x81B7, 0xC48D, 0x81B8, 0xC48E, 0x81B9, 0xC48F, 0x81BA, 0xE2DF, + 0x81BB, 0xEBFE, 0x81BC, 0xC490, 0x81BD, 0xC491, 0x81BE, 0xC492, + 0x81BF, 0xC493, 0x81C0, 0xCDCE, 0x81C1, 0xECA1, 0x81C2, 0xB1DB, + 0x81C3, 0xD3B7, 0x81C4, 0xC494, 0x81C5, 0xC495, 0x81C6, 0xD2DC, + 0x81C7, 0xC496, 0x81C8, 0xC497, 0x81C9, 0xC498, 0x81CA, 0xEBFD, + 0x81CB, 0xC499, 0x81CC, 0xEBFB, 0x81CD, 0xC49A, 0x81CE, 0xC49B, + 0x81CF, 0xC49C, 0x81D0, 0xC49D, 0x81D1, 0xC49E, 0x81D2, 0xC49F, + 0x81D3, 0xC4A0, 0x81D4, 0xC540, 0x81D5, 0xC541, 0x81D6, 0xC542, + 0x81D7, 0xC543, 0x81D8, 0xC544, 0x81D9, 0xC545, 0x81DA, 0xC546, + 0x81DB, 0xC547, 0x81DC, 0xC548, 0x81DD, 0xC549, 0x81DE, 0xC54A, + 0x81DF, 0xC54B, 0x81E0, 0xC54C, 0x81E1, 0xC54D, 0x81E2, 0xC54E, + 0x81E3, 0xB3BC, 0x81E4, 0xC54F, 0x81E5, 0xC550, 0x81E6, 0xC551, + 0x81E7, 0xEAB0, 0x81E8, 0xC552, 0x81E9, 0xC553, 0x81EA, 0xD7D4, + 0x81EB, 0xC554, 0x81EC, 0xF4AB, 0x81ED, 0xB3F4, 0x81EE, 0xC555, + 0x81EF, 0xC556, 0x81F0, 0xC557, 0x81F1, 0xC558, 0x81F2, 0xC559, + 0x81F3, 0xD6C1, 0x81F4, 0xD6C2, 0x81F5, 0xC55A, 0x81F6, 0xC55B, + 0x81F7, 0xC55C, 0x81F8, 0xC55D, 0x81F9, 0xC55E, 0x81FA, 0xC55F, + 0x81FB, 0xD5E9, 0x81FC, 0xBECA, 0x81FD, 0xC560, 0x81FE, 0xF4A7, + 0x81FF, 0xC561, 0x8200, 0xD2A8, 0x8201, 0xF4A8, 0x8202, 0xF4A9, + 0x8203, 0xC562, 0x8204, 0xF4AA, 0x8205, 0xBECB, 0x8206, 0xD3DF, + 0x8207, 0xC563, 0x8208, 0xC564, 0x8209, 0xC565, 0x820A, 0xC566, + 0x820B, 0xC567, 0x820C, 0xC9E0, 0x820D, 0xC9E1, 0x820E, 0xC568, + 0x820F, 0xC569, 0x8210, 0xF3C2, 0x8211, 0xC56A, 0x8212, 0xCAE6, + 0x8213, 0xC56B, 0x8214, 0xCCF2, 0x8215, 0xC56C, 0x8216, 0xC56D, + 0x8217, 0xC56E, 0x8218, 0xC56F, 0x8219, 0xC570, 0x821A, 0xC571, + 0x821B, 0xE2B6, 0x821C, 0xCBB4, 0x821D, 0xC572, 0x821E, 0xCEE8, + 0x821F, 0xD6DB, 0x8220, 0xC573, 0x8221, 0xF4AD, 0x8222, 0xF4AE, + 0x8223, 0xF4AF, 0x8224, 0xC574, 0x8225, 0xC575, 0x8226, 0xC576, + 0x8227, 0xC577, 0x8228, 0xF4B2, 0x8229, 0xC578, 0x822A, 0xBABD, + 0x822B, 0xF4B3, 0x822C, 0xB0E3, 0x822D, 0xF4B0, 0x822E, 0xC579, + 0x822F, 0xF4B1, 0x8230, 0xBDA2, 0x8231, 0xB2D5, 0x8232, 0xC57A, + 0x8233, 0xF4B6, 0x8234, 0xF4B7, 0x8235, 0xB6E6, 0x8236, 0xB2B0, + 0x8237, 0xCFCF, 0x8238, 0xF4B4, 0x8239, 0xB4AC, 0x823A, 0xC57B, + 0x823B, 0xF4B5, 0x823C, 0xC57C, 0x823D, 0xC57D, 0x823E, 0xF4B8, + 0x823F, 0xC57E, 0x8240, 0xC580, 0x8241, 0xC581, 0x8242, 0xC582, + 0x8243, 0xC583, 0x8244, 0xF4B9, 0x8245, 0xC584, 0x8246, 0xC585, + 0x8247, 0xCDA7, 0x8248, 0xC586, 0x8249, 0xF4BA, 0x824A, 0xC587, + 0x824B, 0xF4BB, 0x824C, 0xC588, 0x824D, 0xC589, 0x824E, 0xC58A, + 0x824F, 0xF4BC, 0x8250, 0xC58B, 0x8251, 0xC58C, 0x8252, 0xC58D, + 0x8253, 0xC58E, 0x8254, 0xC58F, 0x8255, 0xC590, 0x8256, 0xC591, + 0x8257, 0xC592, 0x8258, 0xCBD2, 0x8259, 0xC593, 0x825A, 0xF4BD, + 0x825B, 0xC594, 0x825C, 0xC595, 0x825D, 0xC596, 0x825E, 0xC597, + 0x825F, 0xF4BE, 0x8260, 0xC598, 0x8261, 0xC599, 0x8262, 0xC59A, + 0x8263, 0xC59B, 0x8264, 0xC59C, 0x8265, 0xC59D, 0x8266, 0xC59E, + 0x8267, 0xC59F, 0x8268, 0xF4BF, 0x8269, 0xC5A0, 0x826A, 0xC640, + 0x826B, 0xC641, 0x826C, 0xC642, 0x826D, 0xC643, 0x826E, 0xF4DE, + 0x826F, 0xC1BC, 0x8270, 0xBCE8, 0x8271, 0xC644, 0x8272, 0xC9AB, + 0x8273, 0xD1DE, 0x8274, 0xE5F5, 0x8275, 0xC645, 0x8276, 0xC646, + 0x8277, 0xC647, 0x8278, 0xC648, 0x8279, 0xDCB3, 0x827A, 0xD2D5, + 0x827B, 0xC649, 0x827C, 0xC64A, 0x827D, 0xDCB4, 0x827E, 0xB0AC, + 0x827F, 0xDCB5, 0x8280, 0xC64B, 0x8281, 0xC64C, 0x8282, 0xBDDA, + 0x8283, 0xC64D, 0x8284, 0xDCB9, 0x8285, 0xC64E, 0x8286, 0xC64F, + 0x8287, 0xC650, 0x8288, 0xD8C2, 0x8289, 0xC651, 0x828A, 0xDCB7, + 0x828B, 0xD3F3, 0x828C, 0xC652, 0x828D, 0xC9D6, 0x828E, 0xDCBA, + 0x828F, 0xDCB6, 0x8290, 0xC653, 0x8291, 0xDCBB, 0x8292, 0xC3A2, + 0x8293, 0xC654, 0x8294, 0xC655, 0x8295, 0xC656, 0x8296, 0xC657, + 0x8297, 0xDCBC, 0x8298, 0xDCC5, 0x8299, 0xDCBD, 0x829A, 0xC658, + 0x829B, 0xC659, 0x829C, 0xCEDF, 0x829D, 0xD6A5, 0x829E, 0xC65A, + 0x829F, 0xDCCF, 0x82A0, 0xC65B, 0x82A1, 0xDCCD, 0x82A2, 0xC65C, + 0x82A3, 0xC65D, 0x82A4, 0xDCD2, 0x82A5, 0xBDE6, 0x82A6, 0xC2AB, + 0x82A7, 0xC65E, 0x82A8, 0xDCB8, 0x82A9, 0xDCCB, 0x82AA, 0xDCCE, + 0x82AB, 0xDCBE, 0x82AC, 0xB7D2, 0x82AD, 0xB0C5, 0x82AE, 0xDCC7, + 0x82AF, 0xD0BE, 0x82B0, 0xDCC1, 0x82B1, 0xBBA8, 0x82B2, 0xC65F, + 0x82B3, 0xB7BC, 0x82B4, 0xDCCC, 0x82B5, 0xC660, 0x82B6, 0xC661, + 0x82B7, 0xDCC6, 0x82B8, 0xDCBF, 0x82B9, 0xC7DB, 0x82BA, 0xC662, + 0x82BB, 0xC663, 0x82BC, 0xC664, 0x82BD, 0xD1BF, 0x82BE, 0xDCC0, + 0x82BF, 0xC665, 0x82C0, 0xC666, 0x82C1, 0xDCCA, 0x82C2, 0xC667, + 0x82C3, 0xC668, 0x82C4, 0xDCD0, 0x82C5, 0xC669, 0x82C6, 0xC66A, + 0x82C7, 0xCEAD, 0x82C8, 0xDCC2, 0x82C9, 0xC66B, 0x82CA, 0xDCC3, + 0x82CB, 0xDCC8, 0x82CC, 0xDCC9, 0x82CD, 0xB2D4, 0x82CE, 0xDCD1, + 0x82CF, 0xCBD5, 0x82D0, 0xC66C, 0x82D1, 0xD4B7, 0x82D2, 0xDCDB, + 0x82D3, 0xDCDF, 0x82D4, 0xCCA6, 0x82D5, 0xDCE6, 0x82D6, 0xC66D, + 0x82D7, 0xC3E7, 0x82D8, 0xDCDC, 0x82D9, 0xC66E, 0x82DA, 0xC66F, + 0x82DB, 0xBFC1, 0x82DC, 0xDCD9, 0x82DD, 0xC670, 0x82DE, 0xB0FA, + 0x82DF, 0xB9B6, 0x82E0, 0xDCE5, 0x82E1, 0xDCD3, 0x82E2, 0xC671, + 0x82E3, 0xDCC4, 0x82E4, 0xDCD6, 0x82E5, 0xC8F4, 0x82E6, 0xBFE0, + 0x82E7, 0xC672, 0x82E8, 0xC673, 0x82E9, 0xC674, 0x82EA, 0xC675, + 0x82EB, 0xC9BB, 0x82EC, 0xC676, 0x82ED, 0xC677, 0x82EE, 0xC678, + 0x82EF, 0xB1BD, 0x82F0, 0xC679, 0x82F1, 0xD3A2, 0x82F2, 0xC67A, + 0x82F3, 0xC67B, 0x82F4, 0xDCDA, 0x82F5, 0xC67C, 0x82F6, 0xC67D, + 0x82F7, 0xDCD5, 0x82F8, 0xC67E, 0x82F9, 0xC6BB, 0x82FA, 0xC680, + 0x82FB, 0xDCDE, 0x82FC, 0xC681, 0x82FD, 0xC682, 0x82FE, 0xC683, + 0x82FF, 0xC684, 0x8300, 0xC685, 0x8301, 0xD7C2, 0x8302, 0xC3AF, + 0x8303, 0xB7B6, 0x8304, 0xC7D1, 0x8305, 0xC3A9, 0x8306, 0xDCE2, + 0x8307, 0xDCD8, 0x8308, 0xDCEB, 0x8309, 0xDCD4, 0x830A, 0xC686, + 0x830B, 0xC687, 0x830C, 0xDCDD, 0x830D, 0xC688, 0x830E, 0xBEA5, + 0x830F, 0xDCD7, 0x8310, 0xC689, 0x8311, 0xDCE0, 0x8312, 0xC68A, + 0x8313, 0xC68B, 0x8314, 0xDCE3, 0x8315, 0xDCE4, 0x8316, 0xC68C, + 0x8317, 0xDCF8, 0x8318, 0xC68D, 0x8319, 0xC68E, 0x831A, 0xDCE1, + 0x831B, 0xDDA2, 0x831C, 0xDCE7, 0x831D, 0xC68F, 0x831E, 0xC690, + 0x831F, 0xC691, 0x8320, 0xC692, 0x8321, 0xC693, 0x8322, 0xC694, + 0x8323, 0xC695, 0x8324, 0xC696, 0x8325, 0xC697, 0x8326, 0xC698, + 0x8327, 0xBCEB, 0x8328, 0xB4C4, 0x8329, 0xC699, 0x832A, 0xC69A, + 0x832B, 0xC3A3, 0x832C, 0xB2E7, 0x832D, 0xDCFA, 0x832E, 0xC69B, + 0x832F, 0xDCF2, 0x8330, 0xC69C, 0x8331, 0xDCEF, 0x8332, 0xC69D, + 0x8333, 0xDCFC, 0x8334, 0xDCEE, 0x8335, 0xD2F0, 0x8336, 0xB2E8, + 0x8337, 0xC69E, 0x8338, 0xC8D7, 0x8339, 0xC8E3, 0x833A, 0xDCFB, + 0x833B, 0xC69F, 0x833C, 0xDCED, 0x833D, 0xC6A0, 0x833E, 0xC740, + 0x833F, 0xC741, 0x8340, 0xDCF7, 0x8341, 0xC742, 0x8342, 0xC743, + 0x8343, 0xDCF5, 0x8344, 0xC744, 0x8345, 0xC745, 0x8346, 0xBEA3, + 0x8347, 0xDCF4, 0x8348, 0xC746, 0x8349, 0xB2DD, 0x834A, 0xC747, + 0x834B, 0xC748, 0x834C, 0xC749, 0x834D, 0xC74A, 0x834E, 0xC74B, + 0x834F, 0xDCF3, 0x8350, 0xBCF6, 0x8351, 0xDCE8, 0x8352, 0xBBC4, + 0x8353, 0xC74C, 0x8354, 0xC0F3, 0x8355, 0xC74D, 0x8356, 0xC74E, + 0x8357, 0xC74F, 0x8358, 0xC750, 0x8359, 0xC751, 0x835A, 0xBCD4, + 0x835B, 0xDCE9, 0x835C, 0xDCEA, 0x835D, 0xC752, 0x835E, 0xDCF1, + 0x835F, 0xDCF6, 0x8360, 0xDCF9, 0x8361, 0xB5B4, 0x8362, 0xC753, + 0x8363, 0xC8D9, 0x8364, 0xBBE7, 0x8365, 0xDCFE, 0x8366, 0xDCFD, + 0x8367, 0xD3AB, 0x8368, 0xDDA1, 0x8369, 0xDDA3, 0x836A, 0xDDA5, + 0x836B, 0xD2F1, 0x836C, 0xDDA4, 0x836D, 0xDDA6, 0x836E, 0xDDA7, + 0x836F, 0xD2A9, 0x8370, 0xC754, 0x8371, 0xC755, 0x8372, 0xC756, + 0x8373, 0xC757, 0x8374, 0xC758, 0x8375, 0xC759, 0x8376, 0xC75A, + 0x8377, 0xBAC9, 0x8378, 0xDDA9, 0x8379, 0xC75B, 0x837A, 0xC75C, + 0x837B, 0xDDB6, 0x837C, 0xDDB1, 0x837D, 0xDDB4, 0x837E, 0xC75D, + 0x837F, 0xC75E, 0x8380, 0xC75F, 0x8381, 0xC760, 0x8382, 0xC761, + 0x8383, 0xC762, 0x8384, 0xC763, 0x8385, 0xDDB0, 0x8386, 0xC6CE, + 0x8387, 0xC764, 0x8388, 0xC765, 0x8389, 0xC0F2, 0x838A, 0xC766, + 0x838B, 0xC767, 0x838C, 0xC768, 0x838D, 0xC769, 0x838E, 0xC9AF, + 0x838F, 0xC76A, 0x8390, 0xC76B, 0x8391, 0xC76C, 0x8392, 0xDCEC, + 0x8393, 0xDDAE, 0x8394, 0xC76D, 0x8395, 0xC76E, 0x8396, 0xC76F, + 0x8397, 0xC770, 0x8398, 0xDDB7, 0x8399, 0xC771, 0x839A, 0xC772, + 0x839B, 0xDCF0, 0x839C, 0xDDAF, 0x839D, 0xC773, 0x839E, 0xDDB8, + 0x839F, 0xC774, 0x83A0, 0xDDAC, 0x83A1, 0xC775, 0x83A2, 0xC776, + 0x83A3, 0xC777, 0x83A4, 0xC778, 0x83A5, 0xC779, 0x83A6, 0xC77A, + 0x83A7, 0xC77B, 0x83A8, 0xDDB9, 0x83A9, 0xDDB3, 0x83AA, 0xDDAD, + 0x83AB, 0xC4AA, 0x83AC, 0xC77C, 0x83AD, 0xC77D, 0x83AE, 0xC77E, + 0x83AF, 0xC780, 0x83B0, 0xDDA8, 0x83B1, 0xC0B3, 0x83B2, 0xC1AB, + 0x83B3, 0xDDAA, 0x83B4, 0xDDAB, 0x83B5, 0xC781, 0x83B6, 0xDDB2, + 0x83B7, 0xBBF1, 0x83B8, 0xDDB5, 0x83B9, 0xD3A8, 0x83BA, 0xDDBA, + 0x83BB, 0xC782, 0x83BC, 0xDDBB, 0x83BD, 0xC3A7, 0x83BE, 0xC783, + 0x83BF, 0xC784, 0x83C0, 0xDDD2, 0x83C1, 0xDDBC, 0x83C2, 0xC785, + 0x83C3, 0xC786, 0x83C4, 0xC787, 0x83C5, 0xDDD1, 0x83C6, 0xC788, + 0x83C7, 0xB9BD, 0x83C8, 0xC789, 0x83C9, 0xC78A, 0x83CA, 0xBED5, + 0x83CB, 0xC78B, 0x83CC, 0xBEFA, 0x83CD, 0xC78C, 0x83CE, 0xC78D, + 0x83CF, 0xBACA, 0x83D0, 0xC78E, 0x83D1, 0xC78F, 0x83D2, 0xC790, + 0x83D3, 0xC791, 0x83D4, 0xDDCA, 0x83D5, 0xC792, 0x83D6, 0xDDC5, + 0x83D7, 0xC793, 0x83D8, 0xDDBF, 0x83D9, 0xC794, 0x83DA, 0xC795, + 0x83DB, 0xC796, 0x83DC, 0xB2CB, 0x83DD, 0xDDC3, 0x83DE, 0xC797, + 0x83DF, 0xDDCB, 0x83E0, 0xB2A4, 0x83E1, 0xDDD5, 0x83E2, 0xC798, + 0x83E3, 0xC799, 0x83E4, 0xC79A, 0x83E5, 0xDDBE, 0x83E6, 0xC79B, + 0x83E7, 0xC79C, 0x83E8, 0xC79D, 0x83E9, 0xC6D0, 0x83EA, 0xDDD0, + 0x83EB, 0xC79E, 0x83EC, 0xC79F, 0x83ED, 0xC7A0, 0x83EE, 0xC840, + 0x83EF, 0xC841, 0x83F0, 0xDDD4, 0x83F1, 0xC1E2, 0x83F2, 0xB7C6, + 0x83F3, 0xC842, 0x83F4, 0xC843, 0x83F5, 0xC844, 0x83F6, 0xC845, + 0x83F7, 0xC846, 0x83F8, 0xDDCE, 0x83F9, 0xDDCF, 0x83FA, 0xC847, + 0x83FB, 0xC848, 0x83FC, 0xC849, 0x83FD, 0xDDC4, 0x83FE, 0xC84A, + 0x83FF, 0xC84B, 0x8400, 0xC84C, 0x8401, 0xDDBD, 0x8402, 0xC84D, + 0x8403, 0xDDCD, 0x8404, 0xCCD1, 0x8405, 0xC84E, 0x8406, 0xDDC9, + 0x8407, 0xC84F, 0x8408, 0xC850, 0x8409, 0xC851, 0x840A, 0xC852, + 0x840B, 0xDDC2, 0x840C, 0xC3C8, 0x840D, 0xC6BC, 0x840E, 0xCEAE, + 0x840F, 0xDDCC, 0x8410, 0xC853, 0x8411, 0xDDC8, 0x8412, 0xC854, + 0x8413, 0xC855, 0x8414, 0xC856, 0x8415, 0xC857, 0x8416, 0xC858, + 0x8417, 0xC859, 0x8418, 0xDDC1, 0x8419, 0xC85A, 0x841A, 0xC85B, + 0x841B, 0xC85C, 0x841C, 0xDDC6, 0x841D, 0xC2DC, 0x841E, 0xC85D, + 0x841F, 0xC85E, 0x8420, 0xC85F, 0x8421, 0xC860, 0x8422, 0xC861, + 0x8423, 0xC862, 0x8424, 0xD3A9, 0x8425, 0xD3AA, 0x8426, 0xDDD3, + 0x8427, 0xCFF4, 0x8428, 0xC8F8, 0x8429, 0xC863, 0x842A, 0xC864, + 0x842B, 0xC865, 0x842C, 0xC866, 0x842D, 0xC867, 0x842E, 0xC868, + 0x842F, 0xC869, 0x8430, 0xC86A, 0x8431, 0xDDE6, 0x8432, 0xC86B, + 0x8433, 0xC86C, 0x8434, 0xC86D, 0x8435, 0xC86E, 0x8436, 0xC86F, + 0x8437, 0xC870, 0x8438, 0xDDC7, 0x8439, 0xC871, 0x843A, 0xC872, + 0x843B, 0xC873, 0x843C, 0xDDE0, 0x843D, 0xC2E4, 0x843E, 0xC874, + 0x843F, 0xC875, 0x8440, 0xC876, 0x8441, 0xC877, 0x8442, 0xC878, + 0x8443, 0xC879, 0x8444, 0xC87A, 0x8445, 0xC87B, 0x8446, 0xDDE1, + 0x8447, 0xC87C, 0x8448, 0xC87D, 0x8449, 0xC87E, 0x844A, 0xC880, + 0x844B, 0xC881, 0x844C, 0xC882, 0x844D, 0xC883, 0x844E, 0xC884, + 0x844F, 0xC885, 0x8450, 0xC886, 0x8451, 0xDDD7, 0x8452, 0xC887, + 0x8453, 0xC888, 0x8454, 0xC889, 0x8455, 0xC88A, 0x8456, 0xC88B, + 0x8457, 0xD6F8, 0x8458, 0xC88C, 0x8459, 0xDDD9, 0x845A, 0xDDD8, + 0x845B, 0xB8F0, 0x845C, 0xDDD6, 0x845D, 0xC88D, 0x845E, 0xC88E, + 0x845F, 0xC88F, 0x8460, 0xC890, 0x8461, 0xC6CF, 0x8462, 0xC891, + 0x8463, 0xB6AD, 0x8464, 0xC892, 0x8465, 0xC893, 0x8466, 0xC894, + 0x8467, 0xC895, 0x8468, 0xC896, 0x8469, 0xDDE2, 0x846A, 0xC897, + 0x846B, 0xBAF9, 0x846C, 0xD4E1, 0x846D, 0xDDE7, 0x846E, 0xC898, + 0x846F, 0xC899, 0x8470, 0xC89A, 0x8471, 0xB4D0, 0x8472, 0xC89B, + 0x8473, 0xDDDA, 0x8474, 0xC89C, 0x8475, 0xBFFB, 0x8476, 0xDDE3, + 0x8477, 0xC89D, 0x8478, 0xDDDF, 0x8479, 0xC89E, 0x847A, 0xDDDD, + 0x847B, 0xC89F, 0x847C, 0xC8A0, 0x847D, 0xC940, 0x847E, 0xC941, + 0x847F, 0xC942, 0x8480, 0xC943, 0x8481, 0xC944, 0x8482, 0xB5D9, + 0x8483, 0xC945, 0x8484, 0xC946, 0x8485, 0xC947, 0x8486, 0xC948, + 0x8487, 0xDDDB, 0x8488, 0xDDDC, 0x8489, 0xDDDE, 0x848A, 0xC949, + 0x848B, 0xBDAF, 0x848C, 0xDDE4, 0x848D, 0xC94A, 0x848E, 0xDDE5, + 0x848F, 0xC94B, 0x8490, 0xC94C, 0x8491, 0xC94D, 0x8492, 0xC94E, + 0x8493, 0xC94F, 0x8494, 0xC950, 0x8495, 0xC951, 0x8496, 0xC952, + 0x8497, 0xDDF5, 0x8498, 0xC953, 0x8499, 0xC3C9, 0x849A, 0xC954, + 0x849B, 0xC955, 0x849C, 0xCBE2, 0x849D, 0xC956, 0x849E, 0xC957, + 0x849F, 0xC958, 0x84A0, 0xC959, 0x84A1, 0xDDF2, 0x84A2, 0xC95A, + 0x84A3, 0xC95B, 0x84A4, 0xC95C, 0x84A5, 0xC95D, 0x84A6, 0xC95E, + 0x84A7, 0xC95F, 0x84A8, 0xC960, 0x84A9, 0xC961, 0x84AA, 0xC962, + 0x84AB, 0xC963, 0x84AC, 0xC964, 0x84AD, 0xC965, 0x84AE, 0xC966, + 0x84AF, 0xD8E1, 0x84B0, 0xC967, 0x84B1, 0xC968, 0x84B2, 0xC6D1, + 0x84B3, 0xC969, 0x84B4, 0xDDF4, 0x84B5, 0xC96A, 0x84B6, 0xC96B, + 0x84B7, 0xC96C, 0x84B8, 0xD5F4, 0x84B9, 0xDDF3, 0x84BA, 0xDDF0, + 0x84BB, 0xC96D, 0x84BC, 0xC96E, 0x84BD, 0xDDEC, 0x84BE, 0xC96F, + 0x84BF, 0xDDEF, 0x84C0, 0xC970, 0x84C1, 0xDDE8, 0x84C2, 0xC971, + 0x84C3, 0xC972, 0x84C4, 0xD0EE, 0x84C5, 0xC973, 0x84C6, 0xC974, + 0x84C7, 0xC975, 0x84C8, 0xC976, 0x84C9, 0xC8D8, 0x84CA, 0xDDEE, + 0x84CB, 0xC977, 0x84CC, 0xC978, 0x84CD, 0xDDE9, 0x84CE, 0xC979, + 0x84CF, 0xC97A, 0x84D0, 0xDDEA, 0x84D1, 0xCBF2, 0x84D2, 0xC97B, + 0x84D3, 0xDDED, 0x84D4, 0xC97C, 0x84D5, 0xC97D, 0x84D6, 0xB1CD, + 0x84D7, 0xC97E, 0x84D8, 0xC980, 0x84D9, 0xC981, 0x84DA, 0xC982, + 0x84DB, 0xC983, 0x84DC, 0xC984, 0x84DD, 0xC0B6, 0x84DE, 0xC985, + 0x84DF, 0xBCBB, 0x84E0, 0xDDF1, 0x84E1, 0xC986, 0x84E2, 0xC987, + 0x84E3, 0xDDF7, 0x84E4, 0xC988, 0x84E5, 0xDDF6, 0x84E6, 0xDDEB, + 0x84E7, 0xC989, 0x84E8, 0xC98A, 0x84E9, 0xC98B, 0x84EA, 0xC98C, + 0x84EB, 0xC98D, 0x84EC, 0xC5EE, 0x84ED, 0xC98E, 0x84EE, 0xC98F, + 0x84EF, 0xC990, 0x84F0, 0xDDFB, 0x84F1, 0xC991, 0x84F2, 0xC992, + 0x84F3, 0xC993, 0x84F4, 0xC994, 0x84F5, 0xC995, 0x84F6, 0xC996, + 0x84F7, 0xC997, 0x84F8, 0xC998, 0x84F9, 0xC999, 0x84FA, 0xC99A, + 0x84FB, 0xC99B, 0x84FC, 0xDEA4, 0x84FD, 0xC99C, 0x84FE, 0xC99D, + 0x84FF, 0xDEA3, 0x8500, 0xC99E, 0x8501, 0xC99F, 0x8502, 0xC9A0, + 0x8503, 0xCA40, 0x8504, 0xCA41, 0x8505, 0xCA42, 0x8506, 0xCA43, + 0x8507, 0xCA44, 0x8508, 0xCA45, 0x8509, 0xCA46, 0x850A, 0xCA47, + 0x850B, 0xCA48, 0x850C, 0xDDF8, 0x850D, 0xCA49, 0x850E, 0xCA4A, + 0x850F, 0xCA4B, 0x8510, 0xCA4C, 0x8511, 0xC3EF, 0x8512, 0xCA4D, + 0x8513, 0xC2FB, 0x8514, 0xCA4E, 0x8515, 0xCA4F, 0x8516, 0xCA50, + 0x8517, 0xD5E1, 0x8518, 0xCA51, 0x8519, 0xCA52, 0x851A, 0xCEB5, + 0x851B, 0xCA53, 0x851C, 0xCA54, 0x851D, 0xCA55, 0x851E, 0xCA56, + 0x851F, 0xDDFD, 0x8520, 0xCA57, 0x8521, 0xB2CC, 0x8522, 0xCA58, + 0x8523, 0xCA59, 0x8524, 0xCA5A, 0x8525, 0xCA5B, 0x8526, 0xCA5C, + 0x8527, 0xCA5D, 0x8528, 0xCA5E, 0x8529, 0xCA5F, 0x852A, 0xCA60, + 0x852B, 0xC4E8, 0x852C, 0xCADF, 0x852D, 0xCA61, 0x852E, 0xCA62, + 0x852F, 0xCA63, 0x8530, 0xCA64, 0x8531, 0xCA65, 0x8532, 0xCA66, + 0x8533, 0xCA67, 0x8534, 0xCA68, 0x8535, 0xCA69, 0x8536, 0xCA6A, + 0x8537, 0xC7BE, 0x8538, 0xDDFA, 0x8539, 0xDDFC, 0x853A, 0xDDFE, + 0x853B, 0xDEA2, 0x853C, 0xB0AA, 0x853D, 0xB1CE, 0x853E, 0xCA6B, + 0x853F, 0xCA6C, 0x8540, 0xCA6D, 0x8541, 0xCA6E, 0x8542, 0xCA6F, + 0x8543, 0xDEAC, 0x8544, 0xCA70, 0x8545, 0xCA71, 0x8546, 0xCA72, + 0x8547, 0xCA73, 0x8548, 0xDEA6, 0x8549, 0xBDB6, 0x854A, 0xC8EF, + 0x854B, 0xCA74, 0x854C, 0xCA75, 0x854D, 0xCA76, 0x854E, 0xCA77, + 0x854F, 0xCA78, 0x8550, 0xCA79, 0x8551, 0xCA7A, 0x8552, 0xCA7B, + 0x8553, 0xCA7C, 0x8554, 0xCA7D, 0x8555, 0xCA7E, 0x8556, 0xDEA1, + 0x8557, 0xCA80, 0x8558, 0xCA81, 0x8559, 0xDEA5, 0x855A, 0xCA82, + 0x855B, 0xCA83, 0x855C, 0xCA84, 0x855D, 0xCA85, 0x855E, 0xDEA9, + 0x855F, 0xCA86, 0x8560, 0xCA87, 0x8561, 0xCA88, 0x8562, 0xCA89, + 0x8563, 0xCA8A, 0x8564, 0xDEA8, 0x8565, 0xCA8B, 0x8566, 0xCA8C, + 0x8567, 0xCA8D, 0x8568, 0xDEA7, 0x8569, 0xCA8E, 0x856A, 0xCA8F, + 0x856B, 0xCA90, 0x856C, 0xCA91, 0x856D, 0xCA92, 0x856E, 0xCA93, + 0x856F, 0xCA94, 0x8570, 0xCA95, 0x8571, 0xCA96, 0x8572, 0xDEAD, + 0x8573, 0xCA97, 0x8574, 0xD4CC, 0x8575, 0xCA98, 0x8576, 0xCA99, + 0x8577, 0xCA9A, 0x8578, 0xCA9B, 0x8579, 0xDEB3, 0x857A, 0xDEAA, + 0x857B, 0xDEAE, 0x857C, 0xCA9C, 0x857D, 0xCA9D, 0x857E, 0xC0D9, + 0x857F, 0xCA9E, 0x8580, 0xCA9F, 0x8581, 0xCAA0, 0x8582, 0xCB40, + 0x8583, 0xCB41, 0x8584, 0xB1A1, 0x8585, 0xDEB6, 0x8586, 0xCB42, + 0x8587, 0xDEB1, 0x8588, 0xCB43, 0x8589, 0xCB44, 0x858A, 0xCB45, + 0x858B, 0xCB46, 0x858C, 0xCB47, 0x858D, 0xCB48, 0x858E, 0xCB49, + 0x858F, 0xDEB2, 0x8590, 0xCB4A, 0x8591, 0xCB4B, 0x8592, 0xCB4C, + 0x8593, 0xCB4D, 0x8594, 0xCB4E, 0x8595, 0xCB4F, 0x8596, 0xCB50, + 0x8597, 0xCB51, 0x8598, 0xCB52, 0x8599, 0xCB53, 0x859A, 0xCB54, + 0x859B, 0xD1A6, 0x859C, 0xDEB5, 0x859D, 0xCB55, 0x859E, 0xCB56, + 0x859F, 0xCB57, 0x85A0, 0xCB58, 0x85A1, 0xCB59, 0x85A2, 0xCB5A, + 0x85A3, 0xCB5B, 0x85A4, 0xDEAF, 0x85A5, 0xCB5C, 0x85A6, 0xCB5D, + 0x85A7, 0xCB5E, 0x85A8, 0xDEB0, 0x85A9, 0xCB5F, 0x85AA, 0xD0BD, + 0x85AB, 0xCB60, 0x85AC, 0xCB61, 0x85AD, 0xCB62, 0x85AE, 0xDEB4, + 0x85AF, 0xCAED, 0x85B0, 0xDEB9, 0x85B1, 0xCB63, 0x85B2, 0xCB64, + 0x85B3, 0xCB65, 0x85B4, 0xCB66, 0x85B5, 0xCB67, 0x85B6, 0xCB68, + 0x85B7, 0xDEB8, 0x85B8, 0xCB69, 0x85B9, 0xDEB7, 0x85BA, 0xCB6A, + 0x85BB, 0xCB6B, 0x85BC, 0xCB6C, 0x85BD, 0xCB6D, 0x85BE, 0xCB6E, + 0x85BF, 0xCB6F, 0x85C0, 0xCB70, 0x85C1, 0xDEBB, 0x85C2, 0xCB71, + 0x85C3, 0xCB72, 0x85C4, 0xCB73, 0x85C5, 0xCB74, 0x85C6, 0xCB75, + 0x85C7, 0xCB76, 0x85C8, 0xCB77, 0x85C9, 0xBDE5, 0x85CA, 0xCB78, + 0x85CB, 0xCB79, 0x85CC, 0xCB7A, 0x85CD, 0xCB7B, 0x85CE, 0xCB7C, + 0x85CF, 0xB2D8, 0x85D0, 0xC3EA, 0x85D1, 0xCB7D, 0x85D2, 0xCB7E, + 0x85D3, 0xDEBA, 0x85D4, 0xCB80, 0x85D5, 0xC5BA, 0x85D6, 0xCB81, + 0x85D7, 0xCB82, 0x85D8, 0xCB83, 0x85D9, 0xCB84, 0x85DA, 0xCB85, + 0x85DB, 0xCB86, 0x85DC, 0xDEBC, 0x85DD, 0xCB87, 0x85DE, 0xCB88, + 0x85DF, 0xCB89, 0x85E0, 0xCB8A, 0x85E1, 0xCB8B, 0x85E2, 0xCB8C, + 0x85E3, 0xCB8D, 0x85E4, 0xCCD9, 0x85E5, 0xCB8E, 0x85E6, 0xCB8F, + 0x85E7, 0xCB90, 0x85E8, 0xCB91, 0x85E9, 0xB7AA, 0x85EA, 0xCB92, + 0x85EB, 0xCB93, 0x85EC, 0xCB94, 0x85ED, 0xCB95, 0x85EE, 0xCB96, + 0x85EF, 0xCB97, 0x85F0, 0xCB98, 0x85F1, 0xCB99, 0x85F2, 0xCB9A, + 0x85F3, 0xCB9B, 0x85F4, 0xCB9C, 0x85F5, 0xCB9D, 0x85F6, 0xCB9E, + 0x85F7, 0xCB9F, 0x85F8, 0xCBA0, 0x85F9, 0xCC40, 0x85FA, 0xCC41, + 0x85FB, 0xD4E5, 0x85FC, 0xCC42, 0x85FD, 0xCC43, 0x85FE, 0xCC44, + 0x85FF, 0xDEBD, 0x8600, 0xCC45, 0x8601, 0xCC46, 0x8602, 0xCC47, + 0x8603, 0xCC48, 0x8604, 0xCC49, 0x8605, 0xDEBF, 0x8606, 0xCC4A, + 0x8607, 0xCC4B, 0x8608, 0xCC4C, 0x8609, 0xCC4D, 0x860A, 0xCC4E, + 0x860B, 0xCC4F, 0x860C, 0xCC50, 0x860D, 0xCC51, 0x860E, 0xCC52, + 0x860F, 0xCC53, 0x8610, 0xCC54, 0x8611, 0xC4A2, 0x8612, 0xCC55, + 0x8613, 0xCC56, 0x8614, 0xCC57, 0x8615, 0xCC58, 0x8616, 0xDEC1, + 0x8617, 0xCC59, 0x8618, 0xCC5A, 0x8619, 0xCC5B, 0x861A, 0xCC5C, + 0x861B, 0xCC5D, 0x861C, 0xCC5E, 0x861D, 0xCC5F, 0x861E, 0xCC60, + 0x861F, 0xCC61, 0x8620, 0xCC62, 0x8621, 0xCC63, 0x8622, 0xCC64, + 0x8623, 0xCC65, 0x8624, 0xCC66, 0x8625, 0xCC67, 0x8626, 0xCC68, + 0x8627, 0xDEBE, 0x8628, 0xCC69, 0x8629, 0xDEC0, 0x862A, 0xCC6A, + 0x862B, 0xCC6B, 0x862C, 0xCC6C, 0x862D, 0xCC6D, 0x862E, 0xCC6E, + 0x862F, 0xCC6F, 0x8630, 0xCC70, 0x8631, 0xCC71, 0x8632, 0xCC72, + 0x8633, 0xCC73, 0x8634, 0xCC74, 0x8635, 0xCC75, 0x8636, 0xCC76, + 0x8637, 0xCC77, 0x8638, 0xD5BA, 0x8639, 0xCC78, 0x863A, 0xCC79, + 0x863B, 0xCC7A, 0x863C, 0xDEC2, 0x863D, 0xCC7B, 0x863E, 0xCC7C, + 0x863F, 0xCC7D, 0x8640, 0xCC7E, 0x8641, 0xCC80, 0x8642, 0xCC81, + 0x8643, 0xCC82, 0x8644, 0xCC83, 0x8645, 0xCC84, 0x8646, 0xCC85, + 0x8647, 0xCC86, 0x8648, 0xCC87, 0x8649, 0xCC88, 0x864A, 0xCC89, + 0x864B, 0xCC8A, 0x864C, 0xCC8B, 0x864D, 0xF2AE, 0x864E, 0xBBA2, + 0x864F, 0xC2B2, 0x8650, 0xC5B0, 0x8651, 0xC2C7, 0x8652, 0xCC8C, + 0x8653, 0xCC8D, 0x8654, 0xF2AF, 0x8655, 0xCC8E, 0x8656, 0xCC8F, + 0x8657, 0xCC90, 0x8658, 0xCC91, 0x8659, 0xCC92, 0x865A, 0xD0E9, + 0x865B, 0xCC93, 0x865C, 0xCC94, 0x865D, 0xCC95, 0x865E, 0xD3DD, + 0x865F, 0xCC96, 0x8660, 0xCC97, 0x8661, 0xCC98, 0x8662, 0xEBBD, + 0x8663, 0xCC99, 0x8664, 0xCC9A, 0x8665, 0xCC9B, 0x8666, 0xCC9C, + 0x8667, 0xCC9D, 0x8668, 0xCC9E, 0x8669, 0xCC9F, 0x866A, 0xCCA0, + 0x866B, 0xB3E6, 0x866C, 0xF2B0, 0x866D, 0xCD40, 0x866E, 0xF2B1, + 0x866F, 0xCD41, 0x8670, 0xCD42, 0x8671, 0xCAAD, 0x8672, 0xCD43, + 0x8673, 0xCD44, 0x8674, 0xCD45, 0x8675, 0xCD46, 0x8676, 0xCD47, + 0x8677, 0xCD48, 0x8678, 0xCD49, 0x8679, 0xBAE7, 0x867A, 0xF2B3, + 0x867B, 0xF2B5, 0x867C, 0xF2B4, 0x867D, 0xCBE4, 0x867E, 0xCFBA, + 0x867F, 0xF2B2, 0x8680, 0xCAB4, 0x8681, 0xD2CF, 0x8682, 0xC2EC, + 0x8683, 0xCD4A, 0x8684, 0xCD4B, 0x8685, 0xCD4C, 0x8686, 0xCD4D, + 0x8687, 0xCD4E, 0x8688, 0xCD4F, 0x8689, 0xCD50, 0x868A, 0xCEC3, + 0x868B, 0xF2B8, 0x868C, 0xB0F6, 0x868D, 0xF2B7, 0x868E, 0xCD51, + 0x868F, 0xCD52, 0x8690, 0xCD53, 0x8691, 0xCD54, 0x8692, 0xCD55, + 0x8693, 0xF2BE, 0x8694, 0xCD56, 0x8695, 0xB2CF, 0x8696, 0xCD57, + 0x8697, 0xCD58, 0x8698, 0xCD59, 0x8699, 0xCD5A, 0x869A, 0xCD5B, + 0x869B, 0xCD5C, 0x869C, 0xD1C1, 0x869D, 0xF2BA, 0x869E, 0xCD5D, + 0x869F, 0xCD5E, 0x86A0, 0xCD5F, 0x86A1, 0xCD60, 0x86A2, 0xCD61, + 0x86A3, 0xF2BC, 0x86A4, 0xD4E9, 0x86A5, 0xCD62, 0x86A6, 0xCD63, + 0x86A7, 0xF2BB, 0x86A8, 0xF2B6, 0x86A9, 0xF2BF, 0x86AA, 0xF2BD, + 0x86AB, 0xCD64, 0x86AC, 0xF2B9, 0x86AD, 0xCD65, 0x86AE, 0xCD66, + 0x86AF, 0xF2C7, 0x86B0, 0xF2C4, 0x86B1, 0xF2C6, 0x86B2, 0xCD67, + 0x86B3, 0xCD68, 0x86B4, 0xF2CA, 0x86B5, 0xF2C2, 0x86B6, 0xF2C0, + 0x86B7, 0xCD69, 0x86B8, 0xCD6A, 0x86B9, 0xCD6B, 0x86BA, 0xF2C5, + 0x86BB, 0xCD6C, 0x86BC, 0xCD6D, 0x86BD, 0xCD6E, 0x86BE, 0xCD6F, + 0x86BF, 0xCD70, 0x86C0, 0xD6FB, 0x86C1, 0xCD71, 0x86C2, 0xCD72, + 0x86C3, 0xCD73, 0x86C4, 0xF2C1, 0x86C5, 0xCD74, 0x86C6, 0xC7F9, + 0x86C7, 0xC9DF, 0x86C8, 0xCD75, 0x86C9, 0xF2C8, 0x86CA, 0xB9C6, + 0x86CB, 0xB5B0, 0x86CC, 0xCD76, 0x86CD, 0xCD77, 0x86CE, 0xF2C3, + 0x86CF, 0xF2C9, 0x86D0, 0xF2D0, 0x86D1, 0xF2D6, 0x86D2, 0xCD78, + 0x86D3, 0xCD79, 0x86D4, 0xBBD7, 0x86D5, 0xCD7A, 0x86D6, 0xCD7B, + 0x86D7, 0xCD7C, 0x86D8, 0xF2D5, 0x86D9, 0xCDDC, 0x86DA, 0xCD7D, + 0x86DB, 0xD6EB, 0x86DC, 0xCD7E, 0x86DD, 0xCD80, 0x86DE, 0xF2D2, + 0x86DF, 0xF2D4, 0x86E0, 0xCD81, 0x86E1, 0xCD82, 0x86E2, 0xCD83, + 0x86E3, 0xCD84, 0x86E4, 0xB8F2, 0x86E5, 0xCD85, 0x86E6, 0xCD86, + 0x86E7, 0xCD87, 0x86E8, 0xCD88, 0x86E9, 0xF2CB, 0x86EA, 0xCD89, + 0x86EB, 0xCD8A, 0x86EC, 0xCD8B, 0x86ED, 0xF2CE, 0x86EE, 0xC2F9, + 0x86EF, 0xCD8C, 0x86F0, 0xD5DD, 0x86F1, 0xF2CC, 0x86F2, 0xF2CD, + 0x86F3, 0xF2CF, 0x86F4, 0xF2D3, 0x86F5, 0xCD8D, 0x86F6, 0xCD8E, + 0x86F7, 0xCD8F, 0x86F8, 0xF2D9, 0x86F9, 0xD3BC, 0x86FA, 0xCD90, + 0x86FB, 0xCD91, 0x86FC, 0xCD92, 0x86FD, 0xCD93, 0x86FE, 0xB6EA, + 0x86FF, 0xCD94, 0x8700, 0xCAF1, 0x8701, 0xCD95, 0x8702, 0xB7E4, + 0x8703, 0xF2D7, 0x8704, 0xCD96, 0x8705, 0xCD97, 0x8706, 0xCD98, + 0x8707, 0xF2D8, 0x8708, 0xF2DA, 0x8709, 0xF2DD, 0x870A, 0xF2DB, + 0x870B, 0xCD99, 0x870C, 0xCD9A, 0x870D, 0xF2DC, 0x870E, 0xCD9B, + 0x870F, 0xCD9C, 0x8710, 0xCD9D, 0x8711, 0xCD9E, 0x8712, 0xD1D1, + 0x8713, 0xF2D1, 0x8714, 0xCD9F, 0x8715, 0xCDC9, 0x8716, 0xCDA0, + 0x8717, 0xCECF, 0x8718, 0xD6A9, 0x8719, 0xCE40, 0x871A, 0xF2E3, + 0x871B, 0xCE41, 0x871C, 0xC3DB, 0x871D, 0xCE42, 0x871E, 0xF2E0, + 0x871F, 0xCE43, 0x8720, 0xCE44, 0x8721, 0xC0AF, 0x8722, 0xF2EC, + 0x8723, 0xF2DE, 0x8724, 0xCE45, 0x8725, 0xF2E1, 0x8726, 0xCE46, + 0x8727, 0xCE47, 0x8728, 0xCE48, 0x8729, 0xF2E8, 0x872A, 0xCE49, + 0x872B, 0xCE4A, 0x872C, 0xCE4B, 0x872D, 0xCE4C, 0x872E, 0xF2E2, + 0x872F, 0xCE4D, 0x8730, 0xCE4E, 0x8731, 0xF2E7, 0x8732, 0xCE4F, + 0x8733, 0xCE50, 0x8734, 0xF2E6, 0x8735, 0xCE51, 0x8736, 0xCE52, + 0x8737, 0xF2E9, 0x8738, 0xCE53, 0x8739, 0xCE54, 0x873A, 0xCE55, + 0x873B, 0xF2DF, 0x873C, 0xCE56, 0x873D, 0xCE57, 0x873E, 0xF2E4, + 0x873F, 0xF2EA, 0x8740, 0xCE58, 0x8741, 0xCE59, 0x8742, 0xCE5A, + 0x8743, 0xCE5B, 0x8744, 0xCE5C, 0x8745, 0xCE5D, 0x8746, 0xCE5E, + 0x8747, 0xD3AC, 0x8748, 0xF2E5, 0x8749, 0xB2F5, 0x874A, 0xCE5F, + 0x874B, 0xCE60, 0x874C, 0xF2F2, 0x874D, 0xCE61, 0x874E, 0xD0AB, + 0x874F, 0xCE62, 0x8750, 0xCE63, 0x8751, 0xCE64, 0x8752, 0xCE65, + 0x8753, 0xF2F5, 0x8754, 0xCE66, 0x8755, 0xCE67, 0x8756, 0xCE68, + 0x8757, 0xBBC8, 0x8758, 0xCE69, 0x8759, 0xF2F9, 0x875A, 0xCE6A, + 0x875B, 0xCE6B, 0x875C, 0xCE6C, 0x875D, 0xCE6D, 0x875E, 0xCE6E, + 0x875F, 0xCE6F, 0x8760, 0xF2F0, 0x8761, 0xCE70, 0x8762, 0xCE71, + 0x8763, 0xF2F6, 0x8764, 0xF2F8, 0x8765, 0xF2FA, 0x8766, 0xCE72, + 0x8767, 0xCE73, 0x8768, 0xCE74, 0x8769, 0xCE75, 0x876A, 0xCE76, + 0x876B, 0xCE77, 0x876C, 0xCE78, 0x876D, 0xCE79, 0x876E, 0xF2F3, + 0x876F, 0xCE7A, 0x8770, 0xF2F1, 0x8771, 0xCE7B, 0x8772, 0xCE7C, + 0x8773, 0xCE7D, 0x8774, 0xBAFB, 0x8775, 0xCE7E, 0x8776, 0xB5FB, + 0x8777, 0xCE80, 0x8778, 0xCE81, 0x8779, 0xCE82, 0x877A, 0xCE83, + 0x877B, 0xF2EF, 0x877C, 0xF2F7, 0x877D, 0xF2ED, 0x877E, 0xF2EE, + 0x877F, 0xCE84, 0x8780, 0xCE85, 0x8781, 0xCE86, 0x8782, 0xF2EB, + 0x8783, 0xF3A6, 0x8784, 0xCE87, 0x8785, 0xF3A3, 0x8786, 0xCE88, + 0x8787, 0xCE89, 0x8788, 0xF3A2, 0x8789, 0xCE8A, 0x878A, 0xCE8B, + 0x878B, 0xF2F4, 0x878C, 0xCE8C, 0x878D, 0xC8DA, 0x878E, 0xCE8D, + 0x878F, 0xCE8E, 0x8790, 0xCE8F, 0x8791, 0xCE90, 0x8792, 0xCE91, + 0x8793, 0xF2FB, 0x8794, 0xCE92, 0x8795, 0xCE93, 0x8796, 0xCE94, + 0x8797, 0xF3A5, 0x8798, 0xCE95, 0x8799, 0xCE96, 0x879A, 0xCE97, + 0x879B, 0xCE98, 0x879C, 0xCE99, 0x879D, 0xCE9A, 0x879E, 0xCE9B, + 0x879F, 0xC3F8, 0x87A0, 0xCE9C, 0x87A1, 0xCE9D, 0x87A2, 0xCE9E, + 0x87A3, 0xCE9F, 0x87A4, 0xCEA0, 0x87A5, 0xCF40, 0x87A6, 0xCF41, + 0x87A7, 0xCF42, 0x87A8, 0xF2FD, 0x87A9, 0xCF43, 0x87AA, 0xCF44, + 0x87AB, 0xF3A7, 0x87AC, 0xF3A9, 0x87AD, 0xF3A4, 0x87AE, 0xCF45, + 0x87AF, 0xF2FC, 0x87B0, 0xCF46, 0x87B1, 0xCF47, 0x87B2, 0xCF48, + 0x87B3, 0xF3AB, 0x87B4, 0xCF49, 0x87B5, 0xF3AA, 0x87B6, 0xCF4A, + 0x87B7, 0xCF4B, 0x87B8, 0xCF4C, 0x87B9, 0xCF4D, 0x87BA, 0xC2DD, + 0x87BB, 0xCF4E, 0x87BC, 0xCF4F, 0x87BD, 0xF3AE, 0x87BE, 0xCF50, + 0x87BF, 0xCF51, 0x87C0, 0xF3B0, 0x87C1, 0xCF52, 0x87C2, 0xCF53, + 0x87C3, 0xCF54, 0x87C4, 0xCF55, 0x87C5, 0xCF56, 0x87C6, 0xF3A1, + 0x87C7, 0xCF57, 0x87C8, 0xCF58, 0x87C9, 0xCF59, 0x87CA, 0xF3B1, + 0x87CB, 0xF3AC, 0x87CC, 0xCF5A, 0x87CD, 0xCF5B, 0x87CE, 0xCF5C, + 0x87CF, 0xCF5D, 0x87D0, 0xCF5E, 0x87D1, 0xF3AF, 0x87D2, 0xF2FE, + 0x87D3, 0xF3AD, 0x87D4, 0xCF5F, 0x87D5, 0xCF60, 0x87D6, 0xCF61, + 0x87D7, 0xCF62, 0x87D8, 0xCF63, 0x87D9, 0xCF64, 0x87DA, 0xCF65, + 0x87DB, 0xF3B2, 0x87DC, 0xCF66, 0x87DD, 0xCF67, 0x87DE, 0xCF68, + 0x87DF, 0xCF69, 0x87E0, 0xF3B4, 0x87E1, 0xCF6A, 0x87E2, 0xCF6B, + 0x87E3, 0xCF6C, 0x87E4, 0xCF6D, 0x87E5, 0xF3A8, 0x87E6, 0xCF6E, + 0x87E7, 0xCF6F, 0x87E8, 0xCF70, 0x87E9, 0xCF71, 0x87EA, 0xF3B3, + 0x87EB, 0xCF72, 0x87EC, 0xCF73, 0x87ED, 0xCF74, 0x87EE, 0xF3B5, + 0x87EF, 0xCF75, 0x87F0, 0xCF76, 0x87F1, 0xCF77, 0x87F2, 0xCF78, + 0x87F3, 0xCF79, 0x87F4, 0xCF7A, 0x87F5, 0xCF7B, 0x87F6, 0xCF7C, + 0x87F7, 0xCF7D, 0x87F8, 0xCF7E, 0x87F9, 0xD0B7, 0x87FA, 0xCF80, + 0x87FB, 0xCF81, 0x87FC, 0xCF82, 0x87FD, 0xCF83, 0x87FE, 0xF3B8, + 0x87FF, 0xCF84, 0x8800, 0xCF85, 0x8801, 0xCF86, 0x8802, 0xCF87, + 0x8803, 0xD9F9, 0x8804, 0xCF88, 0x8805, 0xCF89, 0x8806, 0xCF8A, + 0x8807, 0xCF8B, 0x8808, 0xCF8C, 0x8809, 0xCF8D, 0x880A, 0xF3B9, + 0x880B, 0xCF8E, 0x880C, 0xCF8F, 0x880D, 0xCF90, 0x880E, 0xCF91, + 0x880F, 0xCF92, 0x8810, 0xCF93, 0x8811, 0xCF94, 0x8812, 0xCF95, + 0x8813, 0xF3B7, 0x8814, 0xCF96, 0x8815, 0xC8E4, 0x8816, 0xF3B6, + 0x8817, 0xCF97, 0x8818, 0xCF98, 0x8819, 0xCF99, 0x881A, 0xCF9A, + 0x881B, 0xF3BA, 0x881C, 0xCF9B, 0x881D, 0xCF9C, 0x881E, 0xCF9D, + 0x881F, 0xCF9E, 0x8820, 0xCF9F, 0x8821, 0xF3BB, 0x8822, 0xB4C0, + 0x8823, 0xCFA0, 0x8824, 0xD040, 0x8825, 0xD041, 0x8826, 0xD042, + 0x8827, 0xD043, 0x8828, 0xD044, 0x8829, 0xD045, 0x882A, 0xD046, + 0x882B, 0xD047, 0x882C, 0xD048, 0x882D, 0xD049, 0x882E, 0xD04A, + 0x882F, 0xD04B, 0x8830, 0xD04C, 0x8831, 0xD04D, 0x8832, 0xEEC3, + 0x8833, 0xD04E, 0x8834, 0xD04F, 0x8835, 0xD050, 0x8836, 0xD051, + 0x8837, 0xD052, 0x8838, 0xD053, 0x8839, 0xF3BC, 0x883A, 0xD054, + 0x883B, 0xD055, 0x883C, 0xF3BD, 0x883D, 0xD056, 0x883E, 0xD057, + 0x883F, 0xD058, 0x8840, 0xD1AA, 0x8841, 0xD059, 0x8842, 0xD05A, + 0x8843, 0xD05B, 0x8844, 0xF4AC, 0x8845, 0xD0C6, 0x8846, 0xD05C, + 0x8847, 0xD05D, 0x8848, 0xD05E, 0x8849, 0xD05F, 0x884A, 0xD060, + 0x884B, 0xD061, 0x884C, 0xD0D0, 0x884D, 0xD1DC, 0x884E, 0xD062, + 0x884F, 0xD063, 0x8850, 0xD064, 0x8851, 0xD065, 0x8852, 0xD066, + 0x8853, 0xD067, 0x8854, 0xCFCE, 0x8855, 0xD068, 0x8856, 0xD069, + 0x8857, 0xBDD6, 0x8858, 0xD06A, 0x8859, 0xD1C3, 0x885A, 0xD06B, + 0x885B, 0xD06C, 0x885C, 0xD06D, 0x885D, 0xD06E, 0x885E, 0xD06F, + 0x885F, 0xD070, 0x8860, 0xD071, 0x8861, 0xBAE2, 0x8862, 0xE1E9, + 0x8863, 0xD2C2, 0x8864, 0xF1C2, 0x8865, 0xB2B9, 0x8866, 0xD072, + 0x8867, 0xD073, 0x8868, 0xB1ED, 0x8869, 0xF1C3, 0x886A, 0xD074, + 0x886B, 0xC9C0, 0x886C, 0xB3C4, 0x886D, 0xD075, 0x886E, 0xD9F2, + 0x886F, 0xD076, 0x8870, 0xCBA5, 0x8871, 0xD077, 0x8872, 0xF1C4, + 0x8873, 0xD078, 0x8874, 0xD079, 0x8875, 0xD07A, 0x8876, 0xD07B, + 0x8877, 0xD6D4, 0x8878, 0xD07C, 0x8879, 0xD07D, 0x887A, 0xD07E, + 0x887B, 0xD080, 0x887C, 0xD081, 0x887D, 0xF1C5, 0x887E, 0xF4C0, + 0x887F, 0xF1C6, 0x8880, 0xD082, 0x8881, 0xD4AC, 0x8882, 0xF1C7, + 0x8883, 0xD083, 0x8884, 0xB0C0, 0x8885, 0xF4C1, 0x8886, 0xD084, + 0x8887, 0xD085, 0x8888, 0xF4C2, 0x8889, 0xD086, 0x888A, 0xD087, + 0x888B, 0xB4FC, 0x888C, 0xD088, 0x888D, 0xC5DB, 0x888E, 0xD089, + 0x888F, 0xD08A, 0x8890, 0xD08B, 0x8891, 0xD08C, 0x8892, 0xCCBB, + 0x8893, 0xD08D, 0x8894, 0xD08E, 0x8895, 0xD08F, 0x8896, 0xD0E4, + 0x8897, 0xD090, 0x8898, 0xD091, 0x8899, 0xD092, 0x889A, 0xD093, + 0x889B, 0xD094, 0x889C, 0xCDE0, 0x889D, 0xD095, 0x889E, 0xD096, + 0x889F, 0xD097, 0x88A0, 0xD098, 0x88A1, 0xD099, 0x88A2, 0xF1C8, + 0x88A3, 0xD09A, 0x88A4, 0xD9F3, 0x88A5, 0xD09B, 0x88A6, 0xD09C, + 0x88A7, 0xD09D, 0x88A8, 0xD09E, 0x88A9, 0xD09F, 0x88AA, 0xD0A0, + 0x88AB, 0xB1BB, 0x88AC, 0xD140, 0x88AD, 0xCFAE, 0x88AE, 0xD141, + 0x88AF, 0xD142, 0x88B0, 0xD143, 0x88B1, 0xB8A4, 0x88B2, 0xD144, + 0x88B3, 0xD145, 0x88B4, 0xD146, 0x88B5, 0xD147, 0x88B6, 0xD148, + 0x88B7, 0xF1CA, 0x88B8, 0xD149, 0x88B9, 0xD14A, 0x88BA, 0xD14B, + 0x88BB, 0xD14C, 0x88BC, 0xF1CB, 0x88BD, 0xD14D, 0x88BE, 0xD14E, + 0x88BF, 0xD14F, 0x88C0, 0xD150, 0x88C1, 0xB2C3, 0x88C2, 0xC1D1, + 0x88C3, 0xD151, 0x88C4, 0xD152, 0x88C5, 0xD7B0, 0x88C6, 0xF1C9, + 0x88C7, 0xD153, 0x88C8, 0xD154, 0x88C9, 0xF1CC, 0x88CA, 0xD155, + 0x88CB, 0xD156, 0x88CC, 0xD157, 0x88CD, 0xD158, 0x88CE, 0xF1CE, + 0x88CF, 0xD159, 0x88D0, 0xD15A, 0x88D1, 0xD15B, 0x88D2, 0xD9F6, + 0x88D3, 0xD15C, 0x88D4, 0xD2E1, 0x88D5, 0xD4A3, 0x88D6, 0xD15D, + 0x88D7, 0xD15E, 0x88D8, 0xF4C3, 0x88D9, 0xC8B9, 0x88DA, 0xD15F, + 0x88DB, 0xD160, 0x88DC, 0xD161, 0x88DD, 0xD162, 0x88DE, 0xD163, + 0x88DF, 0xF4C4, 0x88E0, 0xD164, 0x88E1, 0xD165, 0x88E2, 0xF1CD, + 0x88E3, 0xF1CF, 0x88E4, 0xBFE3, 0x88E5, 0xF1D0, 0x88E6, 0xD166, + 0x88E7, 0xD167, 0x88E8, 0xF1D4, 0x88E9, 0xD168, 0x88EA, 0xD169, + 0x88EB, 0xD16A, 0x88EC, 0xD16B, 0x88ED, 0xD16C, 0x88EE, 0xD16D, + 0x88EF, 0xD16E, 0x88F0, 0xF1D6, 0x88F1, 0xF1D1, 0x88F2, 0xD16F, + 0x88F3, 0xC9D1, 0x88F4, 0xC5E1, 0x88F5, 0xD170, 0x88F6, 0xD171, + 0x88F7, 0xD172, 0x88F8, 0xC2E3, 0x88F9, 0xB9FC, 0x88FA, 0xD173, + 0x88FB, 0xD174, 0x88FC, 0xF1D3, 0x88FD, 0xD175, 0x88FE, 0xF1D5, + 0x88FF, 0xD176, 0x8900, 0xD177, 0x8901, 0xD178, 0x8902, 0xB9D3, + 0x8903, 0xD179, 0x8904, 0xD17A, 0x8905, 0xD17B, 0x8906, 0xD17C, + 0x8907, 0xD17D, 0x8908, 0xD17E, 0x8909, 0xD180, 0x890A, 0xF1DB, + 0x890B, 0xD181, 0x890C, 0xD182, 0x890D, 0xD183, 0x890E, 0xD184, + 0x890F, 0xD185, 0x8910, 0xBAD6, 0x8911, 0xD186, 0x8912, 0xB0FD, + 0x8913, 0xF1D9, 0x8914, 0xD187, 0x8915, 0xD188, 0x8916, 0xD189, + 0x8917, 0xD18A, 0x8918, 0xD18B, 0x8919, 0xF1D8, 0x891A, 0xF1D2, + 0x891B, 0xF1DA, 0x891C, 0xD18C, 0x891D, 0xD18D, 0x891E, 0xD18E, + 0x891F, 0xD18F, 0x8920, 0xD190, 0x8921, 0xF1D7, 0x8922, 0xD191, + 0x8923, 0xD192, 0x8924, 0xD193, 0x8925, 0xC8EC, 0x8926, 0xD194, + 0x8927, 0xD195, 0x8928, 0xD196, 0x8929, 0xD197, 0x892A, 0xCDCA, + 0x892B, 0xF1DD, 0x892C, 0xD198, 0x892D, 0xD199, 0x892E, 0xD19A, + 0x892F, 0xD19B, 0x8930, 0xE5BD, 0x8931, 0xD19C, 0x8932, 0xD19D, + 0x8933, 0xD19E, 0x8934, 0xF1DC, 0x8935, 0xD19F, 0x8936, 0xF1DE, + 0x8937, 0xD1A0, 0x8938, 0xD240, 0x8939, 0xD241, 0x893A, 0xD242, + 0x893B, 0xD243, 0x893C, 0xD244, 0x893D, 0xD245, 0x893E, 0xD246, + 0x893F, 0xD247, 0x8940, 0xD248, 0x8941, 0xF1DF, 0x8942, 0xD249, + 0x8943, 0xD24A, 0x8944, 0xCFE5, 0x8945, 0xD24B, 0x8946, 0xD24C, + 0x8947, 0xD24D, 0x8948, 0xD24E, 0x8949, 0xD24F, 0x894A, 0xD250, + 0x894B, 0xD251, 0x894C, 0xD252, 0x894D, 0xD253, 0x894E, 0xD254, + 0x894F, 0xD255, 0x8950, 0xD256, 0x8951, 0xD257, 0x8952, 0xD258, + 0x8953, 0xD259, 0x8954, 0xD25A, 0x8955, 0xD25B, 0x8956, 0xD25C, + 0x8957, 0xD25D, 0x8958, 0xD25E, 0x8959, 0xD25F, 0x895A, 0xD260, + 0x895B, 0xD261, 0x895C, 0xD262, 0x895D, 0xD263, 0x895E, 0xF4C5, + 0x895F, 0xBDF3, 0x8960, 0xD264, 0x8961, 0xD265, 0x8962, 0xD266, + 0x8963, 0xD267, 0x8964, 0xD268, 0x8965, 0xD269, 0x8966, 0xF1E0, + 0x8967, 0xD26A, 0x8968, 0xD26B, 0x8969, 0xD26C, 0x896A, 0xD26D, + 0x896B, 0xD26E, 0x896C, 0xD26F, 0x896D, 0xD270, 0x896E, 0xD271, + 0x896F, 0xD272, 0x8970, 0xD273, 0x8971, 0xD274, 0x8972, 0xD275, + 0x8973, 0xD276, 0x8974, 0xD277, 0x8975, 0xD278, 0x8976, 0xD279, + 0x8977, 0xD27A, 0x8978, 0xD27B, 0x8979, 0xD27C, 0x897A, 0xD27D, + 0x897B, 0xF1E1, 0x897C, 0xD27E, 0x897D, 0xD280, 0x897E, 0xD281, + 0x897F, 0xCEF7, 0x8980, 0xD282, 0x8981, 0xD2AA, 0x8982, 0xD283, + 0x8983, 0xF1FB, 0x8984, 0xD284, 0x8985, 0xD285, 0x8986, 0xB8B2, + 0x8987, 0xD286, 0x8988, 0xD287, 0x8989, 0xD288, 0x898A, 0xD289, + 0x898B, 0xD28A, 0x898C, 0xD28B, 0x898D, 0xD28C, 0x898E, 0xD28D, + 0x898F, 0xD28E, 0x8990, 0xD28F, 0x8991, 0xD290, 0x8992, 0xD291, + 0x8993, 0xD292, 0x8994, 0xD293, 0x8995, 0xD294, 0x8996, 0xD295, + 0x8997, 0xD296, 0x8998, 0xD297, 0x8999, 0xD298, 0x899A, 0xD299, + 0x899B, 0xD29A, 0x899C, 0xD29B, 0x899D, 0xD29C, 0x899E, 0xD29D, + 0x899F, 0xD29E, 0x89A0, 0xD29F, 0x89A1, 0xD2A0, 0x89A2, 0xD340, + 0x89A3, 0xD341, 0x89A4, 0xD342, 0x89A5, 0xD343, 0x89A6, 0xD344, + 0x89A7, 0xD345, 0x89A8, 0xD346, 0x89A9, 0xD347, 0x89AA, 0xD348, + 0x89AB, 0xD349, 0x89AC, 0xD34A, 0x89AD, 0xD34B, 0x89AE, 0xD34C, + 0x89AF, 0xD34D, 0x89B0, 0xD34E, 0x89B1, 0xD34F, 0x89B2, 0xD350, + 0x89B3, 0xD351, 0x89B4, 0xD352, 0x89B5, 0xD353, 0x89B6, 0xD354, + 0x89B7, 0xD355, 0x89B8, 0xD356, 0x89B9, 0xD357, 0x89BA, 0xD358, + 0x89BB, 0xD359, 0x89BC, 0xD35A, 0x89BD, 0xD35B, 0x89BE, 0xD35C, + 0x89BF, 0xD35D, 0x89C0, 0xD35E, 0x89C1, 0xBCFB, 0x89C2, 0xB9DB, + 0x89C3, 0xD35F, 0x89C4, 0xB9E6, 0x89C5, 0xC3D9, 0x89C6, 0xCAD3, + 0x89C7, 0xEAE8, 0x89C8, 0xC0C0, 0x89C9, 0xBEF5, 0x89CA, 0xEAE9, + 0x89CB, 0xEAEA, 0x89CC, 0xEAEB, 0x89CD, 0xD360, 0x89CE, 0xEAEC, + 0x89CF, 0xEAED, 0x89D0, 0xEAEE, 0x89D1, 0xEAEF, 0x89D2, 0xBDC7, + 0x89D3, 0xD361, 0x89D4, 0xD362, 0x89D5, 0xD363, 0x89D6, 0xF5FB, + 0x89D7, 0xD364, 0x89D8, 0xD365, 0x89D9, 0xD366, 0x89DA, 0xF5FD, + 0x89DB, 0xD367, 0x89DC, 0xF5FE, 0x89DD, 0xD368, 0x89DE, 0xF5FC, + 0x89DF, 0xD369, 0x89E0, 0xD36A, 0x89E1, 0xD36B, 0x89E2, 0xD36C, + 0x89E3, 0xBDE2, 0x89E4, 0xD36D, 0x89E5, 0xF6A1, 0x89E6, 0xB4A5, + 0x89E7, 0xD36E, 0x89E8, 0xD36F, 0x89E9, 0xD370, 0x89EA, 0xD371, + 0x89EB, 0xF6A2, 0x89EC, 0xD372, 0x89ED, 0xD373, 0x89EE, 0xD374, + 0x89EF, 0xF6A3, 0x89F0, 0xD375, 0x89F1, 0xD376, 0x89F2, 0xD377, + 0x89F3, 0xECB2, 0x89F4, 0xD378, 0x89F5, 0xD379, 0x89F6, 0xD37A, + 0x89F7, 0xD37B, 0x89F8, 0xD37C, 0x89F9, 0xD37D, 0x89FA, 0xD37E, + 0x89FB, 0xD380, 0x89FC, 0xD381, 0x89FD, 0xD382, 0x89FE, 0xD383, + 0x89FF, 0xD384, 0x8A00, 0xD1D4, 0x8A01, 0xD385, 0x8A02, 0xD386, + 0x8A03, 0xD387, 0x8A04, 0xD388, 0x8A05, 0xD389, 0x8A06, 0xD38A, + 0x8A07, 0xD9EA, 0x8A08, 0xD38B, 0x8A09, 0xD38C, 0x8A0A, 0xD38D, + 0x8A0B, 0xD38E, 0x8A0C, 0xD38F, 0x8A0D, 0xD390, 0x8A0E, 0xD391, + 0x8A0F, 0xD392, 0x8A10, 0xD393, 0x8A11, 0xD394, 0x8A12, 0xD395, + 0x8A13, 0xD396, 0x8A14, 0xD397, 0x8A15, 0xD398, 0x8A16, 0xD399, + 0x8A17, 0xD39A, 0x8A18, 0xD39B, 0x8A19, 0xD39C, 0x8A1A, 0xD39D, + 0x8A1B, 0xD39E, 0x8A1C, 0xD39F, 0x8A1D, 0xD3A0, 0x8A1E, 0xD440, + 0x8A1F, 0xD441, 0x8A20, 0xD442, 0x8A21, 0xD443, 0x8A22, 0xD444, + 0x8A23, 0xD445, 0x8A24, 0xD446, 0x8A25, 0xD447, 0x8A26, 0xD448, + 0x8A27, 0xD449, 0x8A28, 0xD44A, 0x8A29, 0xD44B, 0x8A2A, 0xD44C, + 0x8A2B, 0xD44D, 0x8A2C, 0xD44E, 0x8A2D, 0xD44F, 0x8A2E, 0xD450, + 0x8A2F, 0xD451, 0x8A30, 0xD452, 0x8A31, 0xD453, 0x8A32, 0xD454, + 0x8A33, 0xD455, 0x8A34, 0xD456, 0x8A35, 0xD457, 0x8A36, 0xD458, + 0x8A37, 0xD459, 0x8A38, 0xD45A, 0x8A39, 0xD45B, 0x8A3A, 0xD45C, + 0x8A3B, 0xD45D, 0x8A3C, 0xD45E, 0x8A3D, 0xD45F, 0x8A3E, 0xF6A4, + 0x8A3F, 0xD460, 0x8A40, 0xD461, 0x8A41, 0xD462, 0x8A42, 0xD463, + 0x8A43, 0xD464, 0x8A44, 0xD465, 0x8A45, 0xD466, 0x8A46, 0xD467, + 0x8A47, 0xD468, 0x8A48, 0xEEBA, 0x8A49, 0xD469, 0x8A4A, 0xD46A, + 0x8A4B, 0xD46B, 0x8A4C, 0xD46C, 0x8A4D, 0xD46D, 0x8A4E, 0xD46E, + 0x8A4F, 0xD46F, 0x8A50, 0xD470, 0x8A51, 0xD471, 0x8A52, 0xD472, + 0x8A53, 0xD473, 0x8A54, 0xD474, 0x8A55, 0xD475, 0x8A56, 0xD476, + 0x8A57, 0xD477, 0x8A58, 0xD478, 0x8A59, 0xD479, 0x8A5A, 0xD47A, + 0x8A5B, 0xD47B, 0x8A5C, 0xD47C, 0x8A5D, 0xD47D, 0x8A5E, 0xD47E, + 0x8A5F, 0xD480, 0x8A60, 0xD481, 0x8A61, 0xD482, 0x8A62, 0xD483, + 0x8A63, 0xD484, 0x8A64, 0xD485, 0x8A65, 0xD486, 0x8A66, 0xD487, + 0x8A67, 0xD488, 0x8A68, 0xD489, 0x8A69, 0xD48A, 0x8A6A, 0xD48B, + 0x8A6B, 0xD48C, 0x8A6C, 0xD48D, 0x8A6D, 0xD48E, 0x8A6E, 0xD48F, + 0x8A6F, 0xD490, 0x8A70, 0xD491, 0x8A71, 0xD492, 0x8A72, 0xD493, + 0x8A73, 0xD494, 0x8A74, 0xD495, 0x8A75, 0xD496, 0x8A76, 0xD497, + 0x8A77, 0xD498, 0x8A78, 0xD499, 0x8A79, 0xD5B2, 0x8A7A, 0xD49A, + 0x8A7B, 0xD49B, 0x8A7C, 0xD49C, 0x8A7D, 0xD49D, 0x8A7E, 0xD49E, + 0x8A7F, 0xD49F, 0x8A80, 0xD4A0, 0x8A81, 0xD540, 0x8A82, 0xD541, + 0x8A83, 0xD542, 0x8A84, 0xD543, 0x8A85, 0xD544, 0x8A86, 0xD545, + 0x8A87, 0xD546, 0x8A88, 0xD547, 0x8A89, 0xD3FE, 0x8A8A, 0xCCDC, + 0x8A8B, 0xD548, 0x8A8C, 0xD549, 0x8A8D, 0xD54A, 0x8A8E, 0xD54B, + 0x8A8F, 0xD54C, 0x8A90, 0xD54D, 0x8A91, 0xD54E, 0x8A92, 0xD54F, + 0x8A93, 0xCAC4, 0x8A94, 0xD550, 0x8A95, 0xD551, 0x8A96, 0xD552, + 0x8A97, 0xD553, 0x8A98, 0xD554, 0x8A99, 0xD555, 0x8A9A, 0xD556, + 0x8A9B, 0xD557, 0x8A9C, 0xD558, 0x8A9D, 0xD559, 0x8A9E, 0xD55A, + 0x8A9F, 0xD55B, 0x8AA0, 0xD55C, 0x8AA1, 0xD55D, 0x8AA2, 0xD55E, + 0x8AA3, 0xD55F, 0x8AA4, 0xD560, 0x8AA5, 0xD561, 0x8AA6, 0xD562, + 0x8AA7, 0xD563, 0x8AA8, 0xD564, 0x8AA9, 0xD565, 0x8AAA, 0xD566, + 0x8AAB, 0xD567, 0x8AAC, 0xD568, 0x8AAD, 0xD569, 0x8AAE, 0xD56A, + 0x8AAF, 0xD56B, 0x8AB0, 0xD56C, 0x8AB1, 0xD56D, 0x8AB2, 0xD56E, + 0x8AB3, 0xD56F, 0x8AB4, 0xD570, 0x8AB5, 0xD571, 0x8AB6, 0xD572, + 0x8AB7, 0xD573, 0x8AB8, 0xD574, 0x8AB9, 0xD575, 0x8ABA, 0xD576, + 0x8ABB, 0xD577, 0x8ABC, 0xD578, 0x8ABD, 0xD579, 0x8ABE, 0xD57A, + 0x8ABF, 0xD57B, 0x8AC0, 0xD57C, 0x8AC1, 0xD57D, 0x8AC2, 0xD57E, + 0x8AC3, 0xD580, 0x8AC4, 0xD581, 0x8AC5, 0xD582, 0x8AC6, 0xD583, + 0x8AC7, 0xD584, 0x8AC8, 0xD585, 0x8AC9, 0xD586, 0x8ACA, 0xD587, + 0x8ACB, 0xD588, 0x8ACC, 0xD589, 0x8ACD, 0xD58A, 0x8ACE, 0xD58B, + 0x8ACF, 0xD58C, 0x8AD0, 0xD58D, 0x8AD1, 0xD58E, 0x8AD2, 0xD58F, + 0x8AD3, 0xD590, 0x8AD4, 0xD591, 0x8AD5, 0xD592, 0x8AD6, 0xD593, + 0x8AD7, 0xD594, 0x8AD8, 0xD595, 0x8AD9, 0xD596, 0x8ADA, 0xD597, + 0x8ADB, 0xD598, 0x8ADC, 0xD599, 0x8ADD, 0xD59A, 0x8ADE, 0xD59B, + 0x8ADF, 0xD59C, 0x8AE0, 0xD59D, 0x8AE1, 0xD59E, 0x8AE2, 0xD59F, + 0x8AE3, 0xD5A0, 0x8AE4, 0xD640, 0x8AE5, 0xD641, 0x8AE6, 0xD642, + 0x8AE7, 0xD643, 0x8AE8, 0xD644, 0x8AE9, 0xD645, 0x8AEA, 0xD646, + 0x8AEB, 0xD647, 0x8AEC, 0xD648, 0x8AED, 0xD649, 0x8AEE, 0xD64A, + 0x8AEF, 0xD64B, 0x8AF0, 0xD64C, 0x8AF1, 0xD64D, 0x8AF2, 0xD64E, + 0x8AF3, 0xD64F, 0x8AF4, 0xD650, 0x8AF5, 0xD651, 0x8AF6, 0xD652, + 0x8AF7, 0xD653, 0x8AF8, 0xD654, 0x8AF9, 0xD655, 0x8AFA, 0xD656, + 0x8AFB, 0xD657, 0x8AFC, 0xD658, 0x8AFD, 0xD659, 0x8AFE, 0xD65A, + 0x8AFF, 0xD65B, 0x8B00, 0xD65C, 0x8B01, 0xD65D, 0x8B02, 0xD65E, + 0x8B03, 0xD65F, 0x8B04, 0xD660, 0x8B05, 0xD661, 0x8B06, 0xD662, + 0x8B07, 0xE5C0, 0x8B08, 0xD663, 0x8B09, 0xD664, 0x8B0A, 0xD665, + 0x8B0B, 0xD666, 0x8B0C, 0xD667, 0x8B0D, 0xD668, 0x8B0E, 0xD669, + 0x8B0F, 0xD66A, 0x8B10, 0xD66B, 0x8B11, 0xD66C, 0x8B12, 0xD66D, + 0x8B13, 0xD66E, 0x8B14, 0xD66F, 0x8B15, 0xD670, 0x8B16, 0xD671, + 0x8B17, 0xD672, 0x8B18, 0xD673, 0x8B19, 0xD674, 0x8B1A, 0xD675, + 0x8B1B, 0xD676, 0x8B1C, 0xD677, 0x8B1D, 0xD678, 0x8B1E, 0xD679, + 0x8B1F, 0xD67A, 0x8B20, 0xD67B, 0x8B21, 0xD67C, 0x8B22, 0xD67D, + 0x8B23, 0xD67E, 0x8B24, 0xD680, 0x8B25, 0xD681, 0x8B26, 0xF6A5, + 0x8B27, 0xD682, 0x8B28, 0xD683, 0x8B29, 0xD684, 0x8B2A, 0xD685, + 0x8B2B, 0xD686, 0x8B2C, 0xD687, 0x8B2D, 0xD688, 0x8B2E, 0xD689, + 0x8B2F, 0xD68A, 0x8B30, 0xD68B, 0x8B31, 0xD68C, 0x8B32, 0xD68D, + 0x8B33, 0xD68E, 0x8B34, 0xD68F, 0x8B35, 0xD690, 0x8B36, 0xD691, + 0x8B37, 0xD692, 0x8B38, 0xD693, 0x8B39, 0xD694, 0x8B3A, 0xD695, + 0x8B3B, 0xD696, 0x8B3C, 0xD697, 0x8B3D, 0xD698, 0x8B3E, 0xD699, + 0x8B3F, 0xD69A, 0x8B40, 0xD69B, 0x8B41, 0xD69C, 0x8B42, 0xD69D, + 0x8B43, 0xD69E, 0x8B44, 0xD69F, 0x8B45, 0xD6A0, 0x8B46, 0xD740, + 0x8B47, 0xD741, 0x8B48, 0xD742, 0x8B49, 0xD743, 0x8B4A, 0xD744, + 0x8B4B, 0xD745, 0x8B4C, 0xD746, 0x8B4D, 0xD747, 0x8B4E, 0xD748, + 0x8B4F, 0xD749, 0x8B50, 0xD74A, 0x8B51, 0xD74B, 0x8B52, 0xD74C, + 0x8B53, 0xD74D, 0x8B54, 0xD74E, 0x8B55, 0xD74F, 0x8B56, 0xD750, + 0x8B57, 0xD751, 0x8B58, 0xD752, 0x8B59, 0xD753, 0x8B5A, 0xD754, + 0x8B5B, 0xD755, 0x8B5C, 0xD756, 0x8B5D, 0xD757, 0x8B5E, 0xD758, + 0x8B5F, 0xD759, 0x8B60, 0xD75A, 0x8B61, 0xD75B, 0x8B62, 0xD75C, + 0x8B63, 0xD75D, 0x8B64, 0xD75E, 0x8B65, 0xD75F, 0x8B66, 0xBEAF, + 0x8B67, 0xD760, 0x8B68, 0xD761, 0x8B69, 0xD762, 0x8B6A, 0xD763, + 0x8B6B, 0xD764, 0x8B6C, 0xC6A9, 0x8B6D, 0xD765, 0x8B6E, 0xD766, + 0x8B6F, 0xD767, 0x8B70, 0xD768, 0x8B71, 0xD769, 0x8B72, 0xD76A, + 0x8B73, 0xD76B, 0x8B74, 0xD76C, 0x8B75, 0xD76D, 0x8B76, 0xD76E, + 0x8B77, 0xD76F, 0x8B78, 0xD770, 0x8B79, 0xD771, 0x8B7A, 0xD772, + 0x8B7B, 0xD773, 0x8B7C, 0xD774, 0x8B7D, 0xD775, 0x8B7E, 0xD776, + 0x8B7F, 0xD777, 0x8B80, 0xD778, 0x8B81, 0xD779, 0x8B82, 0xD77A, + 0x8B83, 0xD77B, 0x8B84, 0xD77C, 0x8B85, 0xD77D, 0x8B86, 0xD77E, + 0x8B87, 0xD780, 0x8B88, 0xD781, 0x8B89, 0xD782, 0x8B8A, 0xD783, + 0x8B8B, 0xD784, 0x8B8C, 0xD785, 0x8B8D, 0xD786, 0x8B8E, 0xD787, + 0x8B8F, 0xD788, 0x8B90, 0xD789, 0x8B91, 0xD78A, 0x8B92, 0xD78B, + 0x8B93, 0xD78C, 0x8B94, 0xD78D, 0x8B95, 0xD78E, 0x8B96, 0xD78F, + 0x8B97, 0xD790, 0x8B98, 0xD791, 0x8B99, 0xD792, 0x8B9A, 0xD793, + 0x8B9B, 0xD794, 0x8B9C, 0xD795, 0x8B9D, 0xD796, 0x8B9E, 0xD797, + 0x8B9F, 0xD798, 0x8BA0, 0xDAA5, 0x8BA1, 0xBCC6, 0x8BA2, 0xB6A9, + 0x8BA3, 0xB8BC, 0x8BA4, 0xC8CF, 0x8BA5, 0xBCA5, 0x8BA6, 0xDAA6, + 0x8BA7, 0xDAA7, 0x8BA8, 0xCCD6, 0x8BA9, 0xC8C3, 0x8BAA, 0xDAA8, + 0x8BAB, 0xC6FD, 0x8BAC, 0xD799, 0x8BAD, 0xD1B5, 0x8BAE, 0xD2E9, + 0x8BAF, 0xD1B6, 0x8BB0, 0xBCC7, 0x8BB1, 0xD79A, 0x8BB2, 0xBDB2, + 0x8BB3, 0xBBE4, 0x8BB4, 0xDAA9, 0x8BB5, 0xDAAA, 0x8BB6, 0xD1C8, + 0x8BB7, 0xDAAB, 0x8BB8, 0xD0ED, 0x8BB9, 0xB6EF, 0x8BBA, 0xC2DB, + 0x8BBB, 0xD79B, 0x8BBC, 0xCBCF, 0x8BBD, 0xB7ED, 0x8BBE, 0xC9E8, + 0x8BBF, 0xB7C3, 0x8BC0, 0xBEF7, 0x8BC1, 0xD6A4, 0x8BC2, 0xDAAC, + 0x8BC3, 0xDAAD, 0x8BC4, 0xC6C0, 0x8BC5, 0xD7E7, 0x8BC6, 0xCAB6, + 0x8BC7, 0xD79C, 0x8BC8, 0xD5A9, 0x8BC9, 0xCBDF, 0x8BCA, 0xD5EF, + 0x8BCB, 0xDAAE, 0x8BCC, 0xD6DF, 0x8BCD, 0xB4CA, 0x8BCE, 0xDAB0, + 0x8BCF, 0xDAAF, 0x8BD0, 0xD79D, 0x8BD1, 0xD2EB, 0x8BD2, 0xDAB1, + 0x8BD3, 0xDAB2, 0x8BD4, 0xDAB3, 0x8BD5, 0xCAD4, 0x8BD6, 0xDAB4, + 0x8BD7, 0xCAAB, 0x8BD8, 0xDAB5, 0x8BD9, 0xDAB6, 0x8BDA, 0xB3CF, + 0x8BDB, 0xD6EF, 0x8BDC, 0xDAB7, 0x8BDD, 0xBBB0, 0x8BDE, 0xB5AE, + 0x8BDF, 0xDAB8, 0x8BE0, 0xDAB9, 0x8BE1, 0xB9EE, 0x8BE2, 0xD1AF, + 0x8BE3, 0xD2E8, 0x8BE4, 0xDABA, 0x8BE5, 0xB8C3, 0x8BE6, 0xCFEA, + 0x8BE7, 0xB2EF, 0x8BE8, 0xDABB, 0x8BE9, 0xDABC, 0x8BEA, 0xD79E, + 0x8BEB, 0xBDEB, 0x8BEC, 0xCEDC, 0x8BED, 0xD3EF, 0x8BEE, 0xDABD, + 0x8BEF, 0xCEF3, 0x8BF0, 0xDABE, 0x8BF1, 0xD3D5, 0x8BF2, 0xBBE5, + 0x8BF3, 0xDABF, 0x8BF4, 0xCBB5, 0x8BF5, 0xCBD0, 0x8BF6, 0xDAC0, + 0x8BF7, 0xC7EB, 0x8BF8, 0xD6EE, 0x8BF9, 0xDAC1, 0x8BFA, 0xC5B5, + 0x8BFB, 0xB6C1, 0x8BFC, 0xDAC2, 0x8BFD, 0xB7CC, 0x8BFE, 0xBFCE, + 0x8BFF, 0xDAC3, 0x8C00, 0xDAC4, 0x8C01, 0xCBAD, 0x8C02, 0xDAC5, + 0x8C03, 0xB5F7, 0x8C04, 0xDAC6, 0x8C05, 0xC1C2, 0x8C06, 0xD7BB, + 0x8C07, 0xDAC7, 0x8C08, 0xCCB8, 0x8C09, 0xD79F, 0x8C0A, 0xD2EA, + 0x8C0B, 0xC4B1, 0x8C0C, 0xDAC8, 0x8C0D, 0xB5FD, 0x8C0E, 0xBBD1, + 0x8C0F, 0xDAC9, 0x8C10, 0xD0B3, 0x8C11, 0xDACA, 0x8C12, 0xDACB, + 0x8C13, 0xCEBD, 0x8C14, 0xDACC, 0x8C15, 0xDACD, 0x8C16, 0xDACE, + 0x8C17, 0xB2F7, 0x8C18, 0xDAD1, 0x8C19, 0xDACF, 0x8C1A, 0xD1E8, + 0x8C1B, 0xDAD0, 0x8C1C, 0xC3D5, 0x8C1D, 0xDAD2, 0x8C1E, 0xD7A0, + 0x8C1F, 0xDAD3, 0x8C20, 0xDAD4, 0x8C21, 0xDAD5, 0x8C22, 0xD0BB, + 0x8C23, 0xD2A5, 0x8C24, 0xB0F9, 0x8C25, 0xDAD6, 0x8C26, 0xC7AB, + 0x8C27, 0xDAD7, 0x8C28, 0xBDF7, 0x8C29, 0xC3A1, 0x8C2A, 0xDAD8, + 0x8C2B, 0xDAD9, 0x8C2C, 0xC3FD, 0x8C2D, 0xCCB7, 0x8C2E, 0xDADA, + 0x8C2F, 0xDADB, 0x8C30, 0xC0BE, 0x8C31, 0xC6D7, 0x8C32, 0xDADC, + 0x8C33, 0xDADD, 0x8C34, 0xC7B4, 0x8C35, 0xDADE, 0x8C36, 0xDADF, + 0x8C37, 0xB9C8, 0x8C38, 0xD840, 0x8C39, 0xD841, 0x8C3A, 0xD842, + 0x8C3B, 0xD843, 0x8C3C, 0xD844, 0x8C3D, 0xD845, 0x8C3E, 0xD846, + 0x8C3F, 0xD847, 0x8C40, 0xD848, 0x8C41, 0xBBED, 0x8C42, 0xD849, + 0x8C43, 0xD84A, 0x8C44, 0xD84B, 0x8C45, 0xD84C, 0x8C46, 0xB6B9, + 0x8C47, 0xF4F8, 0x8C48, 0xD84D, 0x8C49, 0xF4F9, 0x8C4A, 0xD84E, + 0x8C4B, 0xD84F, 0x8C4C, 0xCDE3, 0x8C4D, 0xD850, 0x8C4E, 0xD851, + 0x8C4F, 0xD852, 0x8C50, 0xD853, 0x8C51, 0xD854, 0x8C52, 0xD855, + 0x8C53, 0xD856, 0x8C54, 0xD857, 0x8C55, 0xF5B9, 0x8C56, 0xD858, + 0x8C57, 0xD859, 0x8C58, 0xD85A, 0x8C59, 0xD85B, 0x8C5A, 0xEBE0, + 0x8C5B, 0xD85C, 0x8C5C, 0xD85D, 0x8C5D, 0xD85E, 0x8C5E, 0xD85F, + 0x8C5F, 0xD860, 0x8C60, 0xD861, 0x8C61, 0xCFF3, 0x8C62, 0xBBBF, + 0x8C63, 0xD862, 0x8C64, 0xD863, 0x8C65, 0xD864, 0x8C66, 0xD865, + 0x8C67, 0xD866, 0x8C68, 0xD867, 0x8C69, 0xD868, 0x8C6A, 0xBAC0, + 0x8C6B, 0xD4A5, 0x8C6C, 0xD869, 0x8C6D, 0xD86A, 0x8C6E, 0xD86B, + 0x8C6F, 0xD86C, 0x8C70, 0xD86D, 0x8C71, 0xD86E, 0x8C72, 0xD86F, + 0x8C73, 0xE1D9, 0x8C74, 0xD870, 0x8C75, 0xD871, 0x8C76, 0xD872, + 0x8C77, 0xD873, 0x8C78, 0xF5F4, 0x8C79, 0xB1AA, 0x8C7A, 0xB2F2, + 0x8C7B, 0xD874, 0x8C7C, 0xD875, 0x8C7D, 0xD876, 0x8C7E, 0xD877, + 0x8C7F, 0xD878, 0x8C80, 0xD879, 0x8C81, 0xD87A, 0x8C82, 0xF5F5, + 0x8C83, 0xD87B, 0x8C84, 0xD87C, 0x8C85, 0xF5F7, 0x8C86, 0xD87D, + 0x8C87, 0xD87E, 0x8C88, 0xD880, 0x8C89, 0xBAD1, 0x8C8A, 0xF5F6, + 0x8C8B, 0xD881, 0x8C8C, 0xC3B2, 0x8C8D, 0xD882, 0x8C8E, 0xD883, + 0x8C8F, 0xD884, 0x8C90, 0xD885, 0x8C91, 0xD886, 0x8C92, 0xD887, + 0x8C93, 0xD888, 0x8C94, 0xF5F9, 0x8C95, 0xD889, 0x8C96, 0xD88A, + 0x8C97, 0xD88B, 0x8C98, 0xF5F8, 0x8C99, 0xD88C, 0x8C9A, 0xD88D, + 0x8C9B, 0xD88E, 0x8C9C, 0xD88F, 0x8C9D, 0xD890, 0x8C9E, 0xD891, + 0x8C9F, 0xD892, 0x8CA0, 0xD893, 0x8CA1, 0xD894, 0x8CA2, 0xD895, + 0x8CA3, 0xD896, 0x8CA4, 0xD897, 0x8CA5, 0xD898, 0x8CA6, 0xD899, + 0x8CA7, 0xD89A, 0x8CA8, 0xD89B, 0x8CA9, 0xD89C, 0x8CAA, 0xD89D, + 0x8CAB, 0xD89E, 0x8CAC, 0xD89F, 0x8CAD, 0xD8A0, 0x8CAE, 0xD940, + 0x8CAF, 0xD941, 0x8CB0, 0xD942, 0x8CB1, 0xD943, 0x8CB2, 0xD944, + 0x8CB3, 0xD945, 0x8CB4, 0xD946, 0x8CB5, 0xD947, 0x8CB6, 0xD948, + 0x8CB7, 0xD949, 0x8CB8, 0xD94A, 0x8CB9, 0xD94B, 0x8CBA, 0xD94C, + 0x8CBB, 0xD94D, 0x8CBC, 0xD94E, 0x8CBD, 0xD94F, 0x8CBE, 0xD950, + 0x8CBF, 0xD951, 0x8CC0, 0xD952, 0x8CC1, 0xD953, 0x8CC2, 0xD954, + 0x8CC3, 0xD955, 0x8CC4, 0xD956, 0x8CC5, 0xD957, 0x8CC6, 0xD958, + 0x8CC7, 0xD959, 0x8CC8, 0xD95A, 0x8CC9, 0xD95B, 0x8CCA, 0xD95C, + 0x8CCB, 0xD95D, 0x8CCC, 0xD95E, 0x8CCD, 0xD95F, 0x8CCE, 0xD960, + 0x8CCF, 0xD961, 0x8CD0, 0xD962, 0x8CD1, 0xD963, 0x8CD2, 0xD964, + 0x8CD3, 0xD965, 0x8CD4, 0xD966, 0x8CD5, 0xD967, 0x8CD6, 0xD968, + 0x8CD7, 0xD969, 0x8CD8, 0xD96A, 0x8CD9, 0xD96B, 0x8CDA, 0xD96C, + 0x8CDB, 0xD96D, 0x8CDC, 0xD96E, 0x8CDD, 0xD96F, 0x8CDE, 0xD970, + 0x8CDF, 0xD971, 0x8CE0, 0xD972, 0x8CE1, 0xD973, 0x8CE2, 0xD974, + 0x8CE3, 0xD975, 0x8CE4, 0xD976, 0x8CE5, 0xD977, 0x8CE6, 0xD978, + 0x8CE7, 0xD979, 0x8CE8, 0xD97A, 0x8CE9, 0xD97B, 0x8CEA, 0xD97C, + 0x8CEB, 0xD97D, 0x8CEC, 0xD97E, 0x8CED, 0xD980, 0x8CEE, 0xD981, + 0x8CEF, 0xD982, 0x8CF0, 0xD983, 0x8CF1, 0xD984, 0x8CF2, 0xD985, + 0x8CF3, 0xD986, 0x8CF4, 0xD987, 0x8CF5, 0xD988, 0x8CF6, 0xD989, + 0x8CF7, 0xD98A, 0x8CF8, 0xD98B, 0x8CF9, 0xD98C, 0x8CFA, 0xD98D, + 0x8CFB, 0xD98E, 0x8CFC, 0xD98F, 0x8CFD, 0xD990, 0x8CFE, 0xD991, + 0x8CFF, 0xD992, 0x8D00, 0xD993, 0x8D01, 0xD994, 0x8D02, 0xD995, + 0x8D03, 0xD996, 0x8D04, 0xD997, 0x8D05, 0xD998, 0x8D06, 0xD999, + 0x8D07, 0xD99A, 0x8D08, 0xD99B, 0x8D09, 0xD99C, 0x8D0A, 0xD99D, + 0x8D0B, 0xD99E, 0x8D0C, 0xD99F, 0x8D0D, 0xD9A0, 0x8D0E, 0xDA40, + 0x8D0F, 0xDA41, 0x8D10, 0xDA42, 0x8D11, 0xDA43, 0x8D12, 0xDA44, + 0x8D13, 0xDA45, 0x8D14, 0xDA46, 0x8D15, 0xDA47, 0x8D16, 0xDA48, + 0x8D17, 0xDA49, 0x8D18, 0xDA4A, 0x8D19, 0xDA4B, 0x8D1A, 0xDA4C, + 0x8D1B, 0xDA4D, 0x8D1C, 0xDA4E, 0x8D1D, 0xB1B4, 0x8D1E, 0xD5EA, + 0x8D1F, 0xB8BA, 0x8D20, 0xDA4F, 0x8D21, 0xB9B1, 0x8D22, 0xB2C6, + 0x8D23, 0xD4F0, 0x8D24, 0xCFCD, 0x8D25, 0xB0DC, 0x8D26, 0xD5CB, + 0x8D27, 0xBBF5, 0x8D28, 0xD6CA, 0x8D29, 0xB7B7, 0x8D2A, 0xCCB0, + 0x8D2B, 0xC6B6, 0x8D2C, 0xB1E1, 0x8D2D, 0xB9BA, 0x8D2E, 0xD6FC, + 0x8D2F, 0xB9E1, 0x8D30, 0xB7A1, 0x8D31, 0xBCFA, 0x8D32, 0xEADA, + 0x8D33, 0xEADB, 0x8D34, 0xCCF9, 0x8D35, 0xB9F3, 0x8D36, 0xEADC, + 0x8D37, 0xB4FB, 0x8D38, 0xC3B3, 0x8D39, 0xB7D1, 0x8D3A, 0xBAD8, + 0x8D3B, 0xEADD, 0x8D3C, 0xD4F4, 0x8D3D, 0xEADE, 0x8D3E, 0xBCD6, + 0x8D3F, 0xBBDF, 0x8D40, 0xEADF, 0x8D41, 0xC1DE, 0x8D42, 0xC2B8, + 0x8D43, 0xD4DF, 0x8D44, 0xD7CA, 0x8D45, 0xEAE0, 0x8D46, 0xEAE1, + 0x8D47, 0xEAE4, 0x8D48, 0xEAE2, 0x8D49, 0xEAE3, 0x8D4A, 0xC9DE, + 0x8D4B, 0xB8B3, 0x8D4C, 0xB6C4, 0x8D4D, 0xEAE5, 0x8D4E, 0xCAEA, + 0x8D4F, 0xC9CD, 0x8D50, 0xB4CD, 0x8D51, 0xDA50, 0x8D52, 0xDA51, + 0x8D53, 0xE2D9, 0x8D54, 0xC5E2, 0x8D55, 0xEAE6, 0x8D56, 0xC0B5, + 0x8D57, 0xDA52, 0x8D58, 0xD7B8, 0x8D59, 0xEAE7, 0x8D5A, 0xD7AC, + 0x8D5B, 0xC8FC, 0x8D5C, 0xD8D3, 0x8D5D, 0xD8CD, 0x8D5E, 0xD4DE, + 0x8D5F, 0xDA53, 0x8D60, 0xD4F9, 0x8D61, 0xC9C4, 0x8D62, 0xD3AE, + 0x8D63, 0xB8D3, 0x8D64, 0xB3E0, 0x8D65, 0xDA54, 0x8D66, 0xC9E2, + 0x8D67, 0xF4F6, 0x8D68, 0xDA55, 0x8D69, 0xDA56, 0x8D6A, 0xDA57, + 0x8D6B, 0xBAD5, 0x8D6C, 0xDA58, 0x8D6D, 0xF4F7, 0x8D6E, 0xDA59, + 0x8D6F, 0xDA5A, 0x8D70, 0xD7DF, 0x8D71, 0xDA5B, 0x8D72, 0xDA5C, + 0x8D73, 0xF4F1, 0x8D74, 0xB8B0, 0x8D75, 0xD5D4, 0x8D76, 0xB8CF, + 0x8D77, 0xC6F0, 0x8D78, 0xDA5D, 0x8D79, 0xDA5E, 0x8D7A, 0xDA5F, + 0x8D7B, 0xDA60, 0x8D7C, 0xDA61, 0x8D7D, 0xDA62, 0x8D7E, 0xDA63, + 0x8D7F, 0xDA64, 0x8D80, 0xDA65, 0x8D81, 0xB3C3, 0x8D82, 0xDA66, + 0x8D83, 0xDA67, 0x8D84, 0xF4F2, 0x8D85, 0xB3AC, 0x8D86, 0xDA68, + 0x8D87, 0xDA69, 0x8D88, 0xDA6A, 0x8D89, 0xDA6B, 0x8D8A, 0xD4BD, + 0x8D8B, 0xC7F7, 0x8D8C, 0xDA6C, 0x8D8D, 0xDA6D, 0x8D8E, 0xDA6E, + 0x8D8F, 0xDA6F, 0x8D90, 0xDA70, 0x8D91, 0xF4F4, 0x8D92, 0xDA71, + 0x8D93, 0xDA72, 0x8D94, 0xF4F3, 0x8D95, 0xDA73, 0x8D96, 0xDA74, + 0x8D97, 0xDA75, 0x8D98, 0xDA76, 0x8D99, 0xDA77, 0x8D9A, 0xDA78, + 0x8D9B, 0xDA79, 0x8D9C, 0xDA7A, 0x8D9D, 0xDA7B, 0x8D9E, 0xDA7C, + 0x8D9F, 0xCCCB, 0x8DA0, 0xDA7D, 0x8DA1, 0xDA7E, 0x8DA2, 0xDA80, + 0x8DA3, 0xC8A4, 0x8DA4, 0xDA81, 0x8DA5, 0xDA82, 0x8DA6, 0xDA83, + 0x8DA7, 0xDA84, 0x8DA8, 0xDA85, 0x8DA9, 0xDA86, 0x8DAA, 0xDA87, + 0x8DAB, 0xDA88, 0x8DAC, 0xDA89, 0x8DAD, 0xDA8A, 0x8DAE, 0xDA8B, + 0x8DAF, 0xDA8C, 0x8DB0, 0xDA8D, 0x8DB1, 0xF4F5, 0x8DB2, 0xDA8E, + 0x8DB3, 0xD7E3, 0x8DB4, 0xC5BF, 0x8DB5, 0xF5C0, 0x8DB6, 0xDA8F, + 0x8DB7, 0xDA90, 0x8DB8, 0xF5BB, 0x8DB9, 0xDA91, 0x8DBA, 0xF5C3, + 0x8DBB, 0xDA92, 0x8DBC, 0xF5C2, 0x8DBD, 0xDA93, 0x8DBE, 0xD6BA, + 0x8DBF, 0xF5C1, 0x8DC0, 0xDA94, 0x8DC1, 0xDA95, 0x8DC2, 0xDA96, + 0x8DC3, 0xD4BE, 0x8DC4, 0xF5C4, 0x8DC5, 0xDA97, 0x8DC6, 0xF5CC, + 0x8DC7, 0xDA98, 0x8DC8, 0xDA99, 0x8DC9, 0xDA9A, 0x8DCA, 0xDA9B, + 0x8DCB, 0xB0CF, 0x8DCC, 0xB5F8, 0x8DCD, 0xDA9C, 0x8DCE, 0xF5C9, + 0x8DCF, 0xF5CA, 0x8DD0, 0xDA9D, 0x8DD1, 0xC5DC, 0x8DD2, 0xDA9E, + 0x8DD3, 0xDA9F, 0x8DD4, 0xDAA0, 0x8DD5, 0xDB40, 0x8DD6, 0xF5C5, + 0x8DD7, 0xF5C6, 0x8DD8, 0xDB41, 0x8DD9, 0xDB42, 0x8DDA, 0xF5C7, + 0x8DDB, 0xF5CB, 0x8DDC, 0xDB43, 0x8DDD, 0xBEE0, 0x8DDE, 0xF5C8, + 0x8DDF, 0xB8FA, 0x8DE0, 0xDB44, 0x8DE1, 0xDB45, 0x8DE2, 0xDB46, + 0x8DE3, 0xF5D0, 0x8DE4, 0xF5D3, 0x8DE5, 0xDB47, 0x8DE6, 0xDB48, + 0x8DE7, 0xDB49, 0x8DE8, 0xBFE7, 0x8DE9, 0xDB4A, 0x8DEA, 0xB9F2, + 0x8DEB, 0xF5BC, 0x8DEC, 0xF5CD, 0x8DED, 0xDB4B, 0x8DEE, 0xDB4C, + 0x8DEF, 0xC2B7, 0x8DF0, 0xDB4D, 0x8DF1, 0xDB4E, 0x8DF2, 0xDB4F, + 0x8DF3, 0xCCF8, 0x8DF4, 0xDB50, 0x8DF5, 0xBCF9, 0x8DF6, 0xDB51, + 0x8DF7, 0xF5CE, 0x8DF8, 0xF5CF, 0x8DF9, 0xF5D1, 0x8DFA, 0xB6E5, + 0x8DFB, 0xF5D2, 0x8DFC, 0xDB52, 0x8DFD, 0xF5D5, 0x8DFE, 0xDB53, + 0x8DFF, 0xDB54, 0x8E00, 0xDB55, 0x8E01, 0xDB56, 0x8E02, 0xDB57, + 0x8E03, 0xDB58, 0x8E04, 0xDB59, 0x8E05, 0xF5BD, 0x8E06, 0xDB5A, + 0x8E07, 0xDB5B, 0x8E08, 0xDB5C, 0x8E09, 0xF5D4, 0x8E0A, 0xD3BB, + 0x8E0B, 0xDB5D, 0x8E0C, 0xB3EC, 0x8E0D, 0xDB5E, 0x8E0E, 0xDB5F, + 0x8E0F, 0xCCA4, 0x8E10, 0xDB60, 0x8E11, 0xDB61, 0x8E12, 0xDB62, + 0x8E13, 0xDB63, 0x8E14, 0xF5D6, 0x8E15, 0xDB64, 0x8E16, 0xDB65, + 0x8E17, 0xDB66, 0x8E18, 0xDB67, 0x8E19, 0xDB68, 0x8E1A, 0xDB69, + 0x8E1B, 0xDB6A, 0x8E1C, 0xDB6B, 0x8E1D, 0xF5D7, 0x8E1E, 0xBEE1, + 0x8E1F, 0xF5D8, 0x8E20, 0xDB6C, 0x8E21, 0xDB6D, 0x8E22, 0xCCDF, + 0x8E23, 0xF5DB, 0x8E24, 0xDB6E, 0x8E25, 0xDB6F, 0x8E26, 0xDB70, + 0x8E27, 0xDB71, 0x8E28, 0xDB72, 0x8E29, 0xB2C8, 0x8E2A, 0xD7D9, + 0x8E2B, 0xDB73, 0x8E2C, 0xF5D9, 0x8E2D, 0xDB74, 0x8E2E, 0xF5DA, + 0x8E2F, 0xF5DC, 0x8E30, 0xDB75, 0x8E31, 0xF5E2, 0x8E32, 0xDB76, + 0x8E33, 0xDB77, 0x8E34, 0xDB78, 0x8E35, 0xF5E0, 0x8E36, 0xDB79, + 0x8E37, 0xDB7A, 0x8E38, 0xDB7B, 0x8E39, 0xF5DF, 0x8E3A, 0xF5DD, + 0x8E3B, 0xDB7C, 0x8E3C, 0xDB7D, 0x8E3D, 0xF5E1, 0x8E3E, 0xDB7E, + 0x8E3F, 0xDB80, 0x8E40, 0xF5DE, 0x8E41, 0xF5E4, 0x8E42, 0xF5E5, + 0x8E43, 0xDB81, 0x8E44, 0xCCE3, 0x8E45, 0xDB82, 0x8E46, 0xDB83, + 0x8E47, 0xE5BF, 0x8E48, 0xB5B8, 0x8E49, 0xF5E3, 0x8E4A, 0xF5E8, + 0x8E4B, 0xCCA3, 0x8E4C, 0xDB84, 0x8E4D, 0xDB85, 0x8E4E, 0xDB86, + 0x8E4F, 0xDB87, 0x8E50, 0xDB88, 0x8E51, 0xF5E6, 0x8E52, 0xF5E7, + 0x8E53, 0xDB89, 0x8E54, 0xDB8A, 0x8E55, 0xDB8B, 0x8E56, 0xDB8C, + 0x8E57, 0xDB8D, 0x8E58, 0xDB8E, 0x8E59, 0xF5BE, 0x8E5A, 0xDB8F, + 0x8E5B, 0xDB90, 0x8E5C, 0xDB91, 0x8E5D, 0xDB92, 0x8E5E, 0xDB93, + 0x8E5F, 0xDB94, 0x8E60, 0xDB95, 0x8E61, 0xDB96, 0x8E62, 0xDB97, + 0x8E63, 0xDB98, 0x8E64, 0xDB99, 0x8E65, 0xDB9A, 0x8E66, 0xB1C4, + 0x8E67, 0xDB9B, 0x8E68, 0xDB9C, 0x8E69, 0xF5BF, 0x8E6A, 0xDB9D, + 0x8E6B, 0xDB9E, 0x8E6C, 0xB5C5, 0x8E6D, 0xB2E4, 0x8E6E, 0xDB9F, + 0x8E6F, 0xF5EC, 0x8E70, 0xF5E9, 0x8E71, 0xDBA0, 0x8E72, 0xB6D7, + 0x8E73, 0xDC40, 0x8E74, 0xF5ED, 0x8E75, 0xDC41, 0x8E76, 0xF5EA, + 0x8E77, 0xDC42, 0x8E78, 0xDC43, 0x8E79, 0xDC44, 0x8E7A, 0xDC45, + 0x8E7B, 0xDC46, 0x8E7C, 0xF5EB, 0x8E7D, 0xDC47, 0x8E7E, 0xDC48, + 0x8E7F, 0xB4DA, 0x8E80, 0xDC49, 0x8E81, 0xD4EA, 0x8E82, 0xDC4A, + 0x8E83, 0xDC4B, 0x8E84, 0xDC4C, 0x8E85, 0xF5EE, 0x8E86, 0xDC4D, + 0x8E87, 0xB3F9, 0x8E88, 0xDC4E, 0x8E89, 0xDC4F, 0x8E8A, 0xDC50, + 0x8E8B, 0xDC51, 0x8E8C, 0xDC52, 0x8E8D, 0xDC53, 0x8E8E, 0xDC54, + 0x8E8F, 0xF5EF, 0x8E90, 0xF5F1, 0x8E91, 0xDC55, 0x8E92, 0xDC56, + 0x8E93, 0xDC57, 0x8E94, 0xF5F0, 0x8E95, 0xDC58, 0x8E96, 0xDC59, + 0x8E97, 0xDC5A, 0x8E98, 0xDC5B, 0x8E99, 0xDC5C, 0x8E9A, 0xDC5D, + 0x8E9B, 0xDC5E, 0x8E9C, 0xF5F2, 0x8E9D, 0xDC5F, 0x8E9E, 0xF5F3, + 0x8E9F, 0xDC60, 0x8EA0, 0xDC61, 0x8EA1, 0xDC62, 0x8EA2, 0xDC63, + 0x8EA3, 0xDC64, 0x8EA4, 0xDC65, 0x8EA5, 0xDC66, 0x8EA6, 0xDC67, + 0x8EA7, 0xDC68, 0x8EA8, 0xDC69, 0x8EA9, 0xDC6A, 0x8EAA, 0xDC6B, + 0x8EAB, 0xC9ED, 0x8EAC, 0xB9AA, 0x8EAD, 0xDC6C, 0x8EAE, 0xDC6D, + 0x8EAF, 0xC7FB, 0x8EB0, 0xDC6E, 0x8EB1, 0xDC6F, 0x8EB2, 0xB6E3, + 0x8EB3, 0xDC70, 0x8EB4, 0xDC71, 0x8EB5, 0xDC72, 0x8EB6, 0xDC73, + 0x8EB7, 0xDC74, 0x8EB8, 0xDC75, 0x8EB9, 0xDC76, 0x8EBA, 0xCCC9, + 0x8EBB, 0xDC77, 0x8EBC, 0xDC78, 0x8EBD, 0xDC79, 0x8EBE, 0xDC7A, + 0x8EBF, 0xDC7B, 0x8EC0, 0xDC7C, 0x8EC1, 0xDC7D, 0x8EC2, 0xDC7E, + 0x8EC3, 0xDC80, 0x8EC4, 0xDC81, 0x8EC5, 0xDC82, 0x8EC6, 0xDC83, + 0x8EC7, 0xDC84, 0x8EC8, 0xDC85, 0x8EC9, 0xDC86, 0x8ECA, 0xDC87, + 0x8ECB, 0xDC88, 0x8ECC, 0xDC89, 0x8ECD, 0xDC8A, 0x8ECE, 0xEAA6, + 0x8ECF, 0xDC8B, 0x8ED0, 0xDC8C, 0x8ED1, 0xDC8D, 0x8ED2, 0xDC8E, + 0x8ED3, 0xDC8F, 0x8ED4, 0xDC90, 0x8ED5, 0xDC91, 0x8ED6, 0xDC92, + 0x8ED7, 0xDC93, 0x8ED8, 0xDC94, 0x8ED9, 0xDC95, 0x8EDA, 0xDC96, + 0x8EDB, 0xDC97, 0x8EDC, 0xDC98, 0x8EDD, 0xDC99, 0x8EDE, 0xDC9A, + 0x8EDF, 0xDC9B, 0x8EE0, 0xDC9C, 0x8EE1, 0xDC9D, 0x8EE2, 0xDC9E, + 0x8EE3, 0xDC9F, 0x8EE4, 0xDCA0, 0x8EE5, 0xDD40, 0x8EE6, 0xDD41, + 0x8EE7, 0xDD42, 0x8EE8, 0xDD43, 0x8EE9, 0xDD44, 0x8EEA, 0xDD45, + 0x8EEB, 0xDD46, 0x8EEC, 0xDD47, 0x8EED, 0xDD48, 0x8EEE, 0xDD49, + 0x8EEF, 0xDD4A, 0x8EF0, 0xDD4B, 0x8EF1, 0xDD4C, 0x8EF2, 0xDD4D, + 0x8EF3, 0xDD4E, 0x8EF4, 0xDD4F, 0x8EF5, 0xDD50, 0x8EF6, 0xDD51, + 0x8EF7, 0xDD52, 0x8EF8, 0xDD53, 0x8EF9, 0xDD54, 0x8EFA, 0xDD55, + 0x8EFB, 0xDD56, 0x8EFC, 0xDD57, 0x8EFD, 0xDD58, 0x8EFE, 0xDD59, + 0x8EFF, 0xDD5A, 0x8F00, 0xDD5B, 0x8F01, 0xDD5C, 0x8F02, 0xDD5D, + 0x8F03, 0xDD5E, 0x8F04, 0xDD5F, 0x8F05, 0xDD60, 0x8F06, 0xDD61, + 0x8F07, 0xDD62, 0x8F08, 0xDD63, 0x8F09, 0xDD64, 0x8F0A, 0xDD65, + 0x8F0B, 0xDD66, 0x8F0C, 0xDD67, 0x8F0D, 0xDD68, 0x8F0E, 0xDD69, + 0x8F0F, 0xDD6A, 0x8F10, 0xDD6B, 0x8F11, 0xDD6C, 0x8F12, 0xDD6D, + 0x8F13, 0xDD6E, 0x8F14, 0xDD6F, 0x8F15, 0xDD70, 0x8F16, 0xDD71, + 0x8F17, 0xDD72, 0x8F18, 0xDD73, 0x8F19, 0xDD74, 0x8F1A, 0xDD75, + 0x8F1B, 0xDD76, 0x8F1C, 0xDD77, 0x8F1D, 0xDD78, 0x8F1E, 0xDD79, + 0x8F1F, 0xDD7A, 0x8F20, 0xDD7B, 0x8F21, 0xDD7C, 0x8F22, 0xDD7D, + 0x8F23, 0xDD7E, 0x8F24, 0xDD80, 0x8F25, 0xDD81, 0x8F26, 0xDD82, + 0x8F27, 0xDD83, 0x8F28, 0xDD84, 0x8F29, 0xDD85, 0x8F2A, 0xDD86, + 0x8F2B, 0xDD87, 0x8F2C, 0xDD88, 0x8F2D, 0xDD89, 0x8F2E, 0xDD8A, + 0x8F2F, 0xDD8B, 0x8F30, 0xDD8C, 0x8F31, 0xDD8D, 0x8F32, 0xDD8E, + 0x8F33, 0xDD8F, 0x8F34, 0xDD90, 0x8F35, 0xDD91, 0x8F36, 0xDD92, + 0x8F37, 0xDD93, 0x8F38, 0xDD94, 0x8F39, 0xDD95, 0x8F3A, 0xDD96, + 0x8F3B, 0xDD97, 0x8F3C, 0xDD98, 0x8F3D, 0xDD99, 0x8F3E, 0xDD9A, + 0x8F3F, 0xDD9B, 0x8F40, 0xDD9C, 0x8F41, 0xDD9D, 0x8F42, 0xDD9E, + 0x8F43, 0xDD9F, 0x8F44, 0xDDA0, 0x8F45, 0xDE40, 0x8F46, 0xDE41, + 0x8F47, 0xDE42, 0x8F48, 0xDE43, 0x8F49, 0xDE44, 0x8F4A, 0xDE45, + 0x8F4B, 0xDE46, 0x8F4C, 0xDE47, 0x8F4D, 0xDE48, 0x8F4E, 0xDE49, + 0x8F4F, 0xDE4A, 0x8F50, 0xDE4B, 0x8F51, 0xDE4C, 0x8F52, 0xDE4D, + 0x8F53, 0xDE4E, 0x8F54, 0xDE4F, 0x8F55, 0xDE50, 0x8F56, 0xDE51, + 0x8F57, 0xDE52, 0x8F58, 0xDE53, 0x8F59, 0xDE54, 0x8F5A, 0xDE55, + 0x8F5B, 0xDE56, 0x8F5C, 0xDE57, 0x8F5D, 0xDE58, 0x8F5E, 0xDE59, + 0x8F5F, 0xDE5A, 0x8F60, 0xDE5B, 0x8F61, 0xDE5C, 0x8F62, 0xDE5D, + 0x8F63, 0xDE5E, 0x8F64, 0xDE5F, 0x8F65, 0xDE60, 0x8F66, 0xB3B5, + 0x8F67, 0xD4FE, 0x8F68, 0xB9EC, 0x8F69, 0xD0F9, 0x8F6A, 0xDE61, + 0x8F6B, 0xE9ED, 0x8F6C, 0xD7AA, 0x8F6D, 0xE9EE, 0x8F6E, 0xC2D6, + 0x8F6F, 0xC8ED, 0x8F70, 0xBAE4, 0x8F71, 0xE9EF, 0x8F72, 0xE9F0, + 0x8F73, 0xE9F1, 0x8F74, 0xD6E1, 0x8F75, 0xE9F2, 0x8F76, 0xE9F3, + 0x8F77, 0xE9F5, 0x8F78, 0xE9F4, 0x8F79, 0xE9F6, 0x8F7A, 0xE9F7, + 0x8F7B, 0xC7E1, 0x8F7C, 0xE9F8, 0x8F7D, 0xD4D8, 0x8F7E, 0xE9F9, + 0x8F7F, 0xBDCE, 0x8F80, 0xDE62, 0x8F81, 0xE9FA, 0x8F82, 0xE9FB, + 0x8F83, 0xBDCF, 0x8F84, 0xE9FC, 0x8F85, 0xB8A8, 0x8F86, 0xC1BE, + 0x8F87, 0xE9FD, 0x8F88, 0xB1B2, 0x8F89, 0xBBD4, 0x8F8A, 0xB9F5, + 0x8F8B, 0xE9FE, 0x8F8C, 0xDE63, 0x8F8D, 0xEAA1, 0x8F8E, 0xEAA2, + 0x8F8F, 0xEAA3, 0x8F90, 0xB7F8, 0x8F91, 0xBCAD, 0x8F92, 0xDE64, + 0x8F93, 0xCAE4, 0x8F94, 0xE0CE, 0x8F95, 0xD4AF, 0x8F96, 0xCFBD, + 0x8F97, 0xD5B7, 0x8F98, 0xEAA4, 0x8F99, 0xD5DE, 0x8F9A, 0xEAA5, + 0x8F9B, 0xD0C1, 0x8F9C, 0xB9BC, 0x8F9D, 0xDE65, 0x8F9E, 0xB4C7, + 0x8F9F, 0xB1D9, 0x8FA0, 0xDE66, 0x8FA1, 0xDE67, 0x8FA2, 0xDE68, + 0x8FA3, 0xC0B1, 0x8FA4, 0xDE69, 0x8FA5, 0xDE6A, 0x8FA6, 0xDE6B, + 0x8FA7, 0xDE6C, 0x8FA8, 0xB1E6, 0x8FA9, 0xB1E7, 0x8FAA, 0xDE6D, + 0x8FAB, 0xB1E8, 0x8FAC, 0xDE6E, 0x8FAD, 0xDE6F, 0x8FAE, 0xDE70, + 0x8FAF, 0xDE71, 0x8FB0, 0xB3BD, 0x8FB1, 0xC8E8, 0x8FB2, 0xDE72, + 0x8FB3, 0xDE73, 0x8FB4, 0xDE74, 0x8FB5, 0xDE75, 0x8FB6, 0xE5C1, + 0x8FB7, 0xDE76, 0x8FB8, 0xDE77, 0x8FB9, 0xB1DF, 0x8FBA, 0xDE78, + 0x8FBB, 0xDE79, 0x8FBC, 0xDE7A, 0x8FBD, 0xC1C9, 0x8FBE, 0xB4EF, + 0x8FBF, 0xDE7B, 0x8FC0, 0xDE7C, 0x8FC1, 0xC7A8, 0x8FC2, 0xD3D8, + 0x8FC3, 0xDE7D, 0x8FC4, 0xC6F9, 0x8FC5, 0xD1B8, 0x8FC6, 0xDE7E, + 0x8FC7, 0xB9FD, 0x8FC8, 0xC2F5, 0x8FC9, 0xDE80, 0x8FCA, 0xDE81, + 0x8FCB, 0xDE82, 0x8FCC, 0xDE83, 0x8FCD, 0xDE84, 0x8FCE, 0xD3AD, + 0x8FCF, 0xDE85, 0x8FD0, 0xD4CB, 0x8FD1, 0xBDFC, 0x8FD2, 0xDE86, + 0x8FD3, 0xE5C2, 0x8FD4, 0xB7B5, 0x8FD5, 0xE5C3, 0x8FD6, 0xDE87, + 0x8FD7, 0xDE88, 0x8FD8, 0xBBB9, 0x8FD9, 0xD5E2, 0x8FDA, 0xDE89, + 0x8FDB, 0xBDF8, 0x8FDC, 0xD4B6, 0x8FDD, 0xCEA5, 0x8FDE, 0xC1AC, + 0x8FDF, 0xB3D9, 0x8FE0, 0xDE8A, 0x8FE1, 0xDE8B, 0x8FE2, 0xCCF6, + 0x8FE3, 0xDE8C, 0x8FE4, 0xE5C6, 0x8FE5, 0xE5C4, 0x8FE6, 0xE5C8, + 0x8FE7, 0xDE8D, 0x8FE8, 0xE5CA, 0x8FE9, 0xE5C7, 0x8FEA, 0xB5CF, + 0x8FEB, 0xC6C8, 0x8FEC, 0xDE8E, 0x8FED, 0xB5FC, 0x8FEE, 0xE5C5, + 0x8FEF, 0xDE8F, 0x8FF0, 0xCAF6, 0x8FF1, 0xDE90, 0x8FF2, 0xDE91, + 0x8FF3, 0xE5C9, 0x8FF4, 0xDE92, 0x8FF5, 0xDE93, 0x8FF6, 0xDE94, + 0x8FF7, 0xC3D4, 0x8FF8, 0xB1C5, 0x8FF9, 0xBCA3, 0x8FFA, 0xDE95, + 0x8FFB, 0xDE96, 0x8FFC, 0xDE97, 0x8FFD, 0xD7B7, 0x8FFE, 0xDE98, + 0x8FFF, 0xDE99, 0x9000, 0xCDCB, 0x9001, 0xCBCD, 0x9002, 0xCACA, + 0x9003, 0xCCD3, 0x9004, 0xE5CC, 0x9005, 0xE5CB, 0x9006, 0xC4E6, + 0x9007, 0xDE9A, 0x9008, 0xDE9B, 0x9009, 0xD1A1, 0x900A, 0xD1B7, + 0x900B, 0xE5CD, 0x900C, 0xDE9C, 0x900D, 0xE5D0, 0x900E, 0xDE9D, + 0x900F, 0xCDB8, 0x9010, 0xD6F0, 0x9011, 0xE5CF, 0x9012, 0xB5DD, + 0x9013, 0xDE9E, 0x9014, 0xCDBE, 0x9015, 0xDE9F, 0x9016, 0xE5D1, + 0x9017, 0xB6BA, 0x9018, 0xDEA0, 0x9019, 0xDF40, 0x901A, 0xCDA8, + 0x901B, 0xB9E4, 0x901C, 0xDF41, 0x901D, 0xCAC5, 0x901E, 0xB3D1, + 0x901F, 0xCBD9, 0x9020, 0xD4EC, 0x9021, 0xE5D2, 0x9022, 0xB7EA, + 0x9023, 0xDF42, 0x9024, 0xDF43, 0x9025, 0xDF44, 0x9026, 0xE5CE, + 0x9027, 0xDF45, 0x9028, 0xDF46, 0x9029, 0xDF47, 0x902A, 0xDF48, + 0x902B, 0xDF49, 0x902C, 0xDF4A, 0x902D, 0xE5D5, 0x902E, 0xB4FE, + 0x902F, 0xE5D6, 0x9030, 0xDF4B, 0x9031, 0xDF4C, 0x9032, 0xDF4D, + 0x9033, 0xDF4E, 0x9034, 0xDF4F, 0x9035, 0xE5D3, 0x9036, 0xE5D4, + 0x9037, 0xDF50, 0x9038, 0xD2DD, 0x9039, 0xDF51, 0x903A, 0xDF52, + 0x903B, 0xC2DF, 0x903C, 0xB1C6, 0x903D, 0xDF53, 0x903E, 0xD3E2, + 0x903F, 0xDF54, 0x9040, 0xDF55, 0x9041, 0xB6DD, 0x9042, 0xCBEC, + 0x9043, 0xDF56, 0x9044, 0xE5D7, 0x9045, 0xDF57, 0x9046, 0xDF58, + 0x9047, 0xD3F6, 0x9048, 0xDF59, 0x9049, 0xDF5A, 0x904A, 0xDF5B, + 0x904B, 0xDF5C, 0x904C, 0xDF5D, 0x904D, 0xB1E9, 0x904E, 0xDF5E, + 0x904F, 0xB6F4, 0x9050, 0xE5DA, 0x9051, 0xE5D8, 0x9052, 0xE5D9, + 0x9053, 0xB5C0, 0x9054, 0xDF5F, 0x9055, 0xDF60, 0x9056, 0xDF61, + 0x9057, 0xD2C5, 0x9058, 0xE5DC, 0x9059, 0xDF62, 0x905A, 0xDF63, + 0x905B, 0xE5DE, 0x905C, 0xDF64, 0x905D, 0xDF65, 0x905E, 0xDF66, + 0x905F, 0xDF67, 0x9060, 0xDF68, 0x9061, 0xDF69, 0x9062, 0xE5DD, + 0x9063, 0xC7B2, 0x9064, 0xDF6A, 0x9065, 0xD2A3, 0x9066, 0xDF6B, + 0x9067, 0xDF6C, 0x9068, 0xE5DB, 0x9069, 0xDF6D, 0x906A, 0xDF6E, + 0x906B, 0xDF6F, 0x906C, 0xDF70, 0x906D, 0xD4E2, 0x906E, 0xD5DA, + 0x906F, 0xDF71, 0x9070, 0xDF72, 0x9071, 0xDF73, 0x9072, 0xDF74, + 0x9073, 0xDF75, 0x9074, 0xE5E0, 0x9075, 0xD7F1, 0x9076, 0xDF76, + 0x9077, 0xDF77, 0x9078, 0xDF78, 0x9079, 0xDF79, 0x907A, 0xDF7A, + 0x907B, 0xDF7B, 0x907C, 0xDF7C, 0x907D, 0xE5E1, 0x907E, 0xDF7D, + 0x907F, 0xB1DC, 0x9080, 0xD1FB, 0x9081, 0xDF7E, 0x9082, 0xE5E2, + 0x9083, 0xE5E4, 0x9084, 0xDF80, 0x9085, 0xDF81, 0x9086, 0xDF82, + 0x9087, 0xDF83, 0x9088, 0xE5E3, 0x9089, 0xDF84, 0x908A, 0xDF85, + 0x908B, 0xE5E5, 0x908C, 0xDF86, 0x908D, 0xDF87, 0x908E, 0xDF88, + 0x908F, 0xDF89, 0x9090, 0xDF8A, 0x9091, 0xD2D8, 0x9092, 0xDF8B, + 0x9093, 0xB5CB, 0x9094, 0xDF8C, 0x9095, 0xE7DF, 0x9096, 0xDF8D, + 0x9097, 0xDAF5, 0x9098, 0xDF8E, 0x9099, 0xDAF8, 0x909A, 0xDF8F, + 0x909B, 0xDAF6, 0x909C, 0xDF90, 0x909D, 0xDAF7, 0x909E, 0xDF91, + 0x909F, 0xDF92, 0x90A0, 0xDF93, 0x90A1, 0xDAFA, 0x90A2, 0xD0CF, + 0x90A3, 0xC4C7, 0x90A4, 0xDF94, 0x90A5, 0xDF95, 0x90A6, 0xB0EE, + 0x90A7, 0xDF96, 0x90A8, 0xDF97, 0x90A9, 0xDF98, 0x90AA, 0xD0B0, + 0x90AB, 0xDF99, 0x90AC, 0xDAF9, 0x90AD, 0xDF9A, 0x90AE, 0xD3CA, + 0x90AF, 0xBAAA, 0x90B0, 0xDBA2, 0x90B1, 0xC7F1, 0x90B2, 0xDF9B, + 0x90B3, 0xDAFC, 0x90B4, 0xDAFB, 0x90B5, 0xC9DB, 0x90B6, 0xDAFD, + 0x90B7, 0xDF9C, 0x90B8, 0xDBA1, 0x90B9, 0xD7DE, 0x90BA, 0xDAFE, + 0x90BB, 0xC1DA, 0x90BC, 0xDF9D, 0x90BD, 0xDF9E, 0x90BE, 0xDBA5, + 0x90BF, 0xDF9F, 0x90C0, 0xDFA0, 0x90C1, 0xD3F4, 0x90C2, 0xE040, + 0x90C3, 0xE041, 0x90C4, 0xDBA7, 0x90C5, 0xDBA4, 0x90C6, 0xE042, + 0x90C7, 0xDBA8, 0x90C8, 0xE043, 0x90C9, 0xE044, 0x90CA, 0xBDBC, + 0x90CB, 0xE045, 0x90CC, 0xE046, 0x90CD, 0xE047, 0x90CE, 0xC0C9, + 0x90CF, 0xDBA3, 0x90D0, 0xDBA6, 0x90D1, 0xD6A3, 0x90D2, 0xE048, + 0x90D3, 0xDBA9, 0x90D4, 0xE049, 0x90D5, 0xE04A, 0x90D6, 0xE04B, + 0x90D7, 0xDBAD, 0x90D8, 0xE04C, 0x90D9, 0xE04D, 0x90DA, 0xE04E, + 0x90DB, 0xDBAE, 0x90DC, 0xDBAC, 0x90DD, 0xBAC2, 0x90DE, 0xE04F, + 0x90DF, 0xE050, 0x90E0, 0xE051, 0x90E1, 0xBFA4, 0x90E2, 0xDBAB, + 0x90E3, 0xE052, 0x90E4, 0xE053, 0x90E5, 0xE054, 0x90E6, 0xDBAA, + 0x90E7, 0xD4C7, 0x90E8, 0xB2BF, 0x90E9, 0xE055, 0x90EA, 0xE056, + 0x90EB, 0xDBAF, 0x90EC, 0xE057, 0x90ED, 0xB9F9, 0x90EE, 0xE058, + 0x90EF, 0xDBB0, 0x90F0, 0xE059, 0x90F1, 0xE05A, 0x90F2, 0xE05B, + 0x90F3, 0xE05C, 0x90F4, 0xB3BB, 0x90F5, 0xE05D, 0x90F6, 0xE05E, + 0x90F7, 0xE05F, 0x90F8, 0xB5A6, 0x90F9, 0xE060, 0x90FA, 0xE061, + 0x90FB, 0xE062, 0x90FC, 0xE063, 0x90FD, 0xB6BC, 0x90FE, 0xDBB1, + 0x90FF, 0xE064, 0x9100, 0xE065, 0x9101, 0xE066, 0x9102, 0xB6F5, + 0x9103, 0xE067, 0x9104, 0xDBB2, 0x9105, 0xE068, 0x9106, 0xE069, + 0x9107, 0xE06A, 0x9108, 0xE06B, 0x9109, 0xE06C, 0x910A, 0xE06D, + 0x910B, 0xE06E, 0x910C, 0xE06F, 0x910D, 0xE070, 0x910E, 0xE071, + 0x910F, 0xE072, 0x9110, 0xE073, 0x9111, 0xE074, 0x9112, 0xE075, + 0x9113, 0xE076, 0x9114, 0xE077, 0x9115, 0xE078, 0x9116, 0xE079, + 0x9117, 0xE07A, 0x9118, 0xE07B, 0x9119, 0xB1C9, 0x911A, 0xE07C, + 0x911B, 0xE07D, 0x911C, 0xE07E, 0x911D, 0xE080, 0x911E, 0xDBB4, + 0x911F, 0xE081, 0x9120, 0xE082, 0x9121, 0xE083, 0x9122, 0xDBB3, + 0x9123, 0xDBB5, 0x9124, 0xE084, 0x9125, 0xE085, 0x9126, 0xE086, + 0x9127, 0xE087, 0x9128, 0xE088, 0x9129, 0xE089, 0x912A, 0xE08A, + 0x912B, 0xE08B, 0x912C, 0xE08C, 0x912D, 0xE08D, 0x912E, 0xE08E, + 0x912F, 0xDBB7, 0x9130, 0xE08F, 0x9131, 0xDBB6, 0x9132, 0xE090, + 0x9133, 0xE091, 0x9134, 0xE092, 0x9135, 0xE093, 0x9136, 0xE094, + 0x9137, 0xE095, 0x9138, 0xE096, 0x9139, 0xDBB8, 0x913A, 0xE097, + 0x913B, 0xE098, 0x913C, 0xE099, 0x913D, 0xE09A, 0x913E, 0xE09B, + 0x913F, 0xE09C, 0x9140, 0xE09D, 0x9141, 0xE09E, 0x9142, 0xE09F, + 0x9143, 0xDBB9, 0x9144, 0xE0A0, 0x9145, 0xE140, 0x9146, 0xDBBA, + 0x9147, 0xE141, 0x9148, 0xE142, 0x9149, 0xD3CF, 0x914A, 0xF4FA, + 0x914B, 0xC7F5, 0x914C, 0xD7C3, 0x914D, 0xC5E4, 0x914E, 0xF4FC, + 0x914F, 0xF4FD, 0x9150, 0xF4FB, 0x9151, 0xE143, 0x9152, 0xBEC6, + 0x9153, 0xE144, 0x9154, 0xE145, 0x9155, 0xE146, 0x9156, 0xE147, + 0x9157, 0xD0EF, 0x9158, 0xE148, 0x9159, 0xE149, 0x915A, 0xB7D3, + 0x915B, 0xE14A, 0x915C, 0xE14B, 0x915D, 0xD4CD, 0x915E, 0xCCAA, + 0x915F, 0xE14C, 0x9160, 0xE14D, 0x9161, 0xF5A2, 0x9162, 0xF5A1, + 0x9163, 0xBAA8, 0x9164, 0xF4FE, 0x9165, 0xCBD6, 0x9166, 0xE14E, + 0x9167, 0xE14F, 0x9168, 0xE150, 0x9169, 0xF5A4, 0x916A, 0xC0D2, + 0x916B, 0xE151, 0x916C, 0xB3EA, 0x916D, 0xE152, 0x916E, 0xCDAA, + 0x916F, 0xF5A5, 0x9170, 0xF5A3, 0x9171, 0xBDB4, 0x9172, 0xF5A8, + 0x9173, 0xE153, 0x9174, 0xF5A9, 0x9175, 0xBDCD, 0x9176, 0xC3B8, + 0x9177, 0xBFE1, 0x9178, 0xCBE1, 0x9179, 0xF5AA, 0x917A, 0xE154, + 0x917B, 0xE155, 0x917C, 0xE156, 0x917D, 0xF5A6, 0x917E, 0xF5A7, + 0x917F, 0xC4F0, 0x9180, 0xE157, 0x9181, 0xE158, 0x9182, 0xE159, + 0x9183, 0xE15A, 0x9184, 0xE15B, 0x9185, 0xF5AC, 0x9186, 0xE15C, + 0x9187, 0xB4BC, 0x9188, 0xE15D, 0x9189, 0xD7ED, 0x918A, 0xE15E, + 0x918B, 0xB4D7, 0x918C, 0xF5AB, 0x918D, 0xF5AE, 0x918E, 0xE15F, + 0x918F, 0xE160, 0x9190, 0xF5AD, 0x9191, 0xF5AF, 0x9192, 0xD0D1, + 0x9193, 0xE161, 0x9194, 0xE162, 0x9195, 0xE163, 0x9196, 0xE164, + 0x9197, 0xE165, 0x9198, 0xE166, 0x9199, 0xE167, 0x919A, 0xC3D1, + 0x919B, 0xC8A9, 0x919C, 0xE168, 0x919D, 0xE169, 0x919E, 0xE16A, + 0x919F, 0xE16B, 0x91A0, 0xE16C, 0x91A1, 0xE16D, 0x91A2, 0xF5B0, + 0x91A3, 0xF5B1, 0x91A4, 0xE16E, 0x91A5, 0xE16F, 0x91A6, 0xE170, + 0x91A7, 0xE171, 0x91A8, 0xE172, 0x91A9, 0xE173, 0x91AA, 0xF5B2, + 0x91AB, 0xE174, 0x91AC, 0xE175, 0x91AD, 0xF5B3, 0x91AE, 0xF5B4, + 0x91AF, 0xF5B5, 0x91B0, 0xE176, 0x91B1, 0xE177, 0x91B2, 0xE178, + 0x91B3, 0xE179, 0x91B4, 0xF5B7, 0x91B5, 0xF5B6, 0x91B6, 0xE17A, + 0x91B7, 0xE17B, 0x91B8, 0xE17C, 0x91B9, 0xE17D, 0x91BA, 0xF5B8, + 0x91BB, 0xE17E, 0x91BC, 0xE180, 0x91BD, 0xE181, 0x91BE, 0xE182, + 0x91BF, 0xE183, 0x91C0, 0xE184, 0x91C1, 0xE185, 0x91C2, 0xE186, + 0x91C3, 0xE187, 0x91C4, 0xE188, 0x91C5, 0xE189, 0x91C6, 0xE18A, + 0x91C7, 0xB2C9, 0x91C8, 0xE18B, 0x91C9, 0xD3D4, 0x91CA, 0xCACD, + 0x91CB, 0xE18C, 0x91CC, 0xC0EF, 0x91CD, 0xD6D8, 0x91CE, 0xD2B0, + 0x91CF, 0xC1BF, 0x91D0, 0xE18D, 0x91D1, 0xBDF0, 0x91D2, 0xE18E, + 0x91D3, 0xE18F, 0x91D4, 0xE190, 0x91D5, 0xE191, 0x91D6, 0xE192, + 0x91D7, 0xE193, 0x91D8, 0xE194, 0x91D9, 0xE195, 0x91DA, 0xE196, + 0x91DB, 0xE197, 0x91DC, 0xB8AA, 0x91DD, 0xE198, 0x91DE, 0xE199, + 0x91DF, 0xE19A, 0x91E0, 0xE19B, 0x91E1, 0xE19C, 0x91E2, 0xE19D, + 0x91E3, 0xE19E, 0x91E4, 0xE19F, 0x91E5, 0xE1A0, 0x91E6, 0xE240, + 0x91E7, 0xE241, 0x91E8, 0xE242, 0x91E9, 0xE243, 0x91EA, 0xE244, + 0x91EB, 0xE245, 0x91EC, 0xE246, 0x91ED, 0xE247, 0x91EE, 0xE248, + 0x91EF, 0xE249, 0x91F0, 0xE24A, 0x91F1, 0xE24B, 0x91F2, 0xE24C, + 0x91F3, 0xE24D, 0x91F4, 0xE24E, 0x91F5, 0xE24F, 0x91F6, 0xE250, + 0x91F7, 0xE251, 0x91F8, 0xE252, 0x91F9, 0xE253, 0x91FA, 0xE254, + 0x91FB, 0xE255, 0x91FC, 0xE256, 0x91FD, 0xE257, 0x91FE, 0xE258, + 0x91FF, 0xE259, 0x9200, 0xE25A, 0x9201, 0xE25B, 0x9202, 0xE25C, + 0x9203, 0xE25D, 0x9204, 0xE25E, 0x9205, 0xE25F, 0x9206, 0xE260, + 0x9207, 0xE261, 0x9208, 0xE262, 0x9209, 0xE263, 0x920A, 0xE264, + 0x920B, 0xE265, 0x920C, 0xE266, 0x920D, 0xE267, 0x920E, 0xE268, + 0x920F, 0xE269, 0x9210, 0xE26A, 0x9211, 0xE26B, 0x9212, 0xE26C, + 0x9213, 0xE26D, 0x9214, 0xE26E, 0x9215, 0xE26F, 0x9216, 0xE270, + 0x9217, 0xE271, 0x9218, 0xE272, 0x9219, 0xE273, 0x921A, 0xE274, + 0x921B, 0xE275, 0x921C, 0xE276, 0x921D, 0xE277, 0x921E, 0xE278, + 0x921F, 0xE279, 0x9220, 0xE27A, 0x9221, 0xE27B, 0x9222, 0xE27C, + 0x9223, 0xE27D, 0x9224, 0xE27E, 0x9225, 0xE280, 0x9226, 0xE281, + 0x9227, 0xE282, 0x9228, 0xE283, 0x9229, 0xE284, 0x922A, 0xE285, + 0x922B, 0xE286, 0x922C, 0xE287, 0x922D, 0xE288, 0x922E, 0xE289, + 0x922F, 0xE28A, 0x9230, 0xE28B, 0x9231, 0xE28C, 0x9232, 0xE28D, + 0x9233, 0xE28E, 0x9234, 0xE28F, 0x9235, 0xE290, 0x9236, 0xE291, + 0x9237, 0xE292, 0x9238, 0xE293, 0x9239, 0xE294, 0x923A, 0xE295, + 0x923B, 0xE296, 0x923C, 0xE297, 0x923D, 0xE298, 0x923E, 0xE299, + 0x923F, 0xE29A, 0x9240, 0xE29B, 0x9241, 0xE29C, 0x9242, 0xE29D, + 0x9243, 0xE29E, 0x9244, 0xE29F, 0x9245, 0xE2A0, 0x9246, 0xE340, + 0x9247, 0xE341, 0x9248, 0xE342, 0x9249, 0xE343, 0x924A, 0xE344, + 0x924B, 0xE345, 0x924C, 0xE346, 0x924D, 0xE347, 0x924E, 0xE348, + 0x924F, 0xE349, 0x9250, 0xE34A, 0x9251, 0xE34B, 0x9252, 0xE34C, + 0x9253, 0xE34D, 0x9254, 0xE34E, 0x9255, 0xE34F, 0x9256, 0xE350, + 0x9257, 0xE351, 0x9258, 0xE352, 0x9259, 0xE353, 0x925A, 0xE354, + 0x925B, 0xE355, 0x925C, 0xE356, 0x925D, 0xE357, 0x925E, 0xE358, + 0x925F, 0xE359, 0x9260, 0xE35A, 0x9261, 0xE35B, 0x9262, 0xE35C, + 0x9263, 0xE35D, 0x9264, 0xE35E, 0x9265, 0xE35F, 0x9266, 0xE360, + 0x9267, 0xE361, 0x9268, 0xE362, 0x9269, 0xE363, 0x926A, 0xE364, + 0x926B, 0xE365, 0x926C, 0xE366, 0x926D, 0xE367, 0x926E, 0xE368, + 0x926F, 0xE369, 0x9270, 0xE36A, 0x9271, 0xE36B, 0x9272, 0xE36C, + 0x9273, 0xE36D, 0x9274, 0xBCF8, 0x9275, 0xE36E, 0x9276, 0xE36F, + 0x9277, 0xE370, 0x9278, 0xE371, 0x9279, 0xE372, 0x927A, 0xE373, + 0x927B, 0xE374, 0x927C, 0xE375, 0x927D, 0xE376, 0x927E, 0xE377, + 0x927F, 0xE378, 0x9280, 0xE379, 0x9281, 0xE37A, 0x9282, 0xE37B, + 0x9283, 0xE37C, 0x9284, 0xE37D, 0x9285, 0xE37E, 0x9286, 0xE380, + 0x9287, 0xE381, 0x9288, 0xE382, 0x9289, 0xE383, 0x928A, 0xE384, + 0x928B, 0xE385, 0x928C, 0xE386, 0x928D, 0xE387, 0x928E, 0xF6C6, + 0x928F, 0xE388, 0x9290, 0xE389, 0x9291, 0xE38A, 0x9292, 0xE38B, + 0x9293, 0xE38C, 0x9294, 0xE38D, 0x9295, 0xE38E, 0x9296, 0xE38F, + 0x9297, 0xE390, 0x9298, 0xE391, 0x9299, 0xE392, 0x929A, 0xE393, + 0x929B, 0xE394, 0x929C, 0xE395, 0x929D, 0xE396, 0x929E, 0xE397, + 0x929F, 0xE398, 0x92A0, 0xE399, 0x92A1, 0xE39A, 0x92A2, 0xE39B, + 0x92A3, 0xE39C, 0x92A4, 0xE39D, 0x92A5, 0xE39E, 0x92A6, 0xE39F, + 0x92A7, 0xE3A0, 0x92A8, 0xE440, 0x92A9, 0xE441, 0x92AA, 0xE442, + 0x92AB, 0xE443, 0x92AC, 0xE444, 0x92AD, 0xE445, 0x92AE, 0xF6C7, + 0x92AF, 0xE446, 0x92B0, 0xE447, 0x92B1, 0xE448, 0x92B2, 0xE449, + 0x92B3, 0xE44A, 0x92B4, 0xE44B, 0x92B5, 0xE44C, 0x92B6, 0xE44D, + 0x92B7, 0xE44E, 0x92B8, 0xE44F, 0x92B9, 0xE450, 0x92BA, 0xE451, + 0x92BB, 0xE452, 0x92BC, 0xE453, 0x92BD, 0xE454, 0x92BE, 0xE455, + 0x92BF, 0xE456, 0x92C0, 0xE457, 0x92C1, 0xE458, 0x92C2, 0xE459, + 0x92C3, 0xE45A, 0x92C4, 0xE45B, 0x92C5, 0xE45C, 0x92C6, 0xE45D, + 0x92C7, 0xE45E, 0x92C8, 0xF6C8, 0x92C9, 0xE45F, 0x92CA, 0xE460, + 0x92CB, 0xE461, 0x92CC, 0xE462, 0x92CD, 0xE463, 0x92CE, 0xE464, + 0x92CF, 0xE465, 0x92D0, 0xE466, 0x92D1, 0xE467, 0x92D2, 0xE468, + 0x92D3, 0xE469, 0x92D4, 0xE46A, 0x92D5, 0xE46B, 0x92D6, 0xE46C, + 0x92D7, 0xE46D, 0x92D8, 0xE46E, 0x92D9, 0xE46F, 0x92DA, 0xE470, + 0x92DB, 0xE471, 0x92DC, 0xE472, 0x92DD, 0xE473, 0x92DE, 0xE474, + 0x92DF, 0xE475, 0x92E0, 0xE476, 0x92E1, 0xE477, 0x92E2, 0xE478, + 0x92E3, 0xE479, 0x92E4, 0xE47A, 0x92E5, 0xE47B, 0x92E6, 0xE47C, + 0x92E7, 0xE47D, 0x92E8, 0xE47E, 0x92E9, 0xE480, 0x92EA, 0xE481, + 0x92EB, 0xE482, 0x92EC, 0xE483, 0x92ED, 0xE484, 0x92EE, 0xE485, + 0x92EF, 0xE486, 0x92F0, 0xE487, 0x92F1, 0xE488, 0x92F2, 0xE489, + 0x92F3, 0xE48A, 0x92F4, 0xE48B, 0x92F5, 0xE48C, 0x92F6, 0xE48D, + 0x92F7, 0xE48E, 0x92F8, 0xE48F, 0x92F9, 0xE490, 0x92FA, 0xE491, + 0x92FB, 0xE492, 0x92FC, 0xE493, 0x92FD, 0xE494, 0x92FE, 0xE495, + 0x92FF, 0xE496, 0x9300, 0xE497, 0x9301, 0xE498, 0x9302, 0xE499, + 0x9303, 0xE49A, 0x9304, 0xE49B, 0x9305, 0xE49C, 0x9306, 0xE49D, + 0x9307, 0xE49E, 0x9308, 0xE49F, 0x9309, 0xE4A0, 0x930A, 0xE540, + 0x930B, 0xE541, 0x930C, 0xE542, 0x930D, 0xE543, 0x930E, 0xE544, + 0x930F, 0xE545, 0x9310, 0xE546, 0x9311, 0xE547, 0x9312, 0xE548, + 0x9313, 0xE549, 0x9314, 0xE54A, 0x9315, 0xE54B, 0x9316, 0xE54C, + 0x9317, 0xE54D, 0x9318, 0xE54E, 0x9319, 0xE54F, 0x931A, 0xE550, + 0x931B, 0xE551, 0x931C, 0xE552, 0x931D, 0xE553, 0x931E, 0xE554, + 0x931F, 0xE555, 0x9320, 0xE556, 0x9321, 0xE557, 0x9322, 0xE558, + 0x9323, 0xE559, 0x9324, 0xE55A, 0x9325, 0xE55B, 0x9326, 0xE55C, + 0x9327, 0xE55D, 0x9328, 0xE55E, 0x9329, 0xE55F, 0x932A, 0xE560, + 0x932B, 0xE561, 0x932C, 0xE562, 0x932D, 0xE563, 0x932E, 0xE564, + 0x932F, 0xE565, 0x9330, 0xE566, 0x9331, 0xE567, 0x9332, 0xE568, + 0x9333, 0xE569, 0x9334, 0xE56A, 0x9335, 0xE56B, 0x9336, 0xE56C, + 0x9337, 0xE56D, 0x9338, 0xE56E, 0x9339, 0xE56F, 0x933A, 0xE570, + 0x933B, 0xE571, 0x933C, 0xE572, 0x933D, 0xE573, 0x933E, 0xF6C9, + 0x933F, 0xE574, 0x9340, 0xE575, 0x9341, 0xE576, 0x9342, 0xE577, + 0x9343, 0xE578, 0x9344, 0xE579, 0x9345, 0xE57A, 0x9346, 0xE57B, + 0x9347, 0xE57C, 0x9348, 0xE57D, 0x9349, 0xE57E, 0x934A, 0xE580, + 0x934B, 0xE581, 0x934C, 0xE582, 0x934D, 0xE583, 0x934E, 0xE584, + 0x934F, 0xE585, 0x9350, 0xE586, 0x9351, 0xE587, 0x9352, 0xE588, + 0x9353, 0xE589, 0x9354, 0xE58A, 0x9355, 0xE58B, 0x9356, 0xE58C, + 0x9357, 0xE58D, 0x9358, 0xE58E, 0x9359, 0xE58F, 0x935A, 0xE590, + 0x935B, 0xE591, 0x935C, 0xE592, 0x935D, 0xE593, 0x935E, 0xE594, + 0x935F, 0xE595, 0x9360, 0xE596, 0x9361, 0xE597, 0x9362, 0xE598, + 0x9363, 0xE599, 0x9364, 0xE59A, 0x9365, 0xE59B, 0x9366, 0xE59C, + 0x9367, 0xE59D, 0x9368, 0xE59E, 0x9369, 0xE59F, 0x936A, 0xF6CA, + 0x936B, 0xE5A0, 0x936C, 0xE640, 0x936D, 0xE641, 0x936E, 0xE642, + 0x936F, 0xE643, 0x9370, 0xE644, 0x9371, 0xE645, 0x9372, 0xE646, + 0x9373, 0xE647, 0x9374, 0xE648, 0x9375, 0xE649, 0x9376, 0xE64A, + 0x9377, 0xE64B, 0x9378, 0xE64C, 0x9379, 0xE64D, 0x937A, 0xE64E, + 0x937B, 0xE64F, 0x937C, 0xE650, 0x937D, 0xE651, 0x937E, 0xE652, + 0x937F, 0xE653, 0x9380, 0xE654, 0x9381, 0xE655, 0x9382, 0xE656, + 0x9383, 0xE657, 0x9384, 0xE658, 0x9385, 0xE659, 0x9386, 0xE65A, + 0x9387, 0xE65B, 0x9388, 0xE65C, 0x9389, 0xE65D, 0x938A, 0xE65E, + 0x938B, 0xE65F, 0x938C, 0xE660, 0x938D, 0xE661, 0x938E, 0xE662, + 0x938F, 0xF6CC, 0x9390, 0xE663, 0x9391, 0xE664, 0x9392, 0xE665, + 0x9393, 0xE666, 0x9394, 0xE667, 0x9395, 0xE668, 0x9396, 0xE669, + 0x9397, 0xE66A, 0x9398, 0xE66B, 0x9399, 0xE66C, 0x939A, 0xE66D, + 0x939B, 0xE66E, 0x939C, 0xE66F, 0x939D, 0xE670, 0x939E, 0xE671, + 0x939F, 0xE672, 0x93A0, 0xE673, 0x93A1, 0xE674, 0x93A2, 0xE675, + 0x93A3, 0xE676, 0x93A4, 0xE677, 0x93A5, 0xE678, 0x93A6, 0xE679, + 0x93A7, 0xE67A, 0x93A8, 0xE67B, 0x93A9, 0xE67C, 0x93AA, 0xE67D, + 0x93AB, 0xE67E, 0x93AC, 0xE680, 0x93AD, 0xE681, 0x93AE, 0xE682, + 0x93AF, 0xE683, 0x93B0, 0xE684, 0x93B1, 0xE685, 0x93B2, 0xE686, + 0x93B3, 0xE687, 0x93B4, 0xE688, 0x93B5, 0xE689, 0x93B6, 0xE68A, + 0x93B7, 0xE68B, 0x93B8, 0xE68C, 0x93B9, 0xE68D, 0x93BA, 0xE68E, + 0x93BB, 0xE68F, 0x93BC, 0xE690, 0x93BD, 0xE691, 0x93BE, 0xE692, + 0x93BF, 0xE693, 0x93C0, 0xE694, 0x93C1, 0xE695, 0x93C2, 0xE696, + 0x93C3, 0xE697, 0x93C4, 0xE698, 0x93C5, 0xE699, 0x93C6, 0xE69A, + 0x93C7, 0xE69B, 0x93C8, 0xE69C, 0x93C9, 0xE69D, 0x93CA, 0xF6CB, + 0x93CB, 0xE69E, 0x93CC, 0xE69F, 0x93CD, 0xE6A0, 0x93CE, 0xE740, + 0x93CF, 0xE741, 0x93D0, 0xE742, 0x93D1, 0xE743, 0x93D2, 0xE744, + 0x93D3, 0xE745, 0x93D4, 0xE746, 0x93D5, 0xE747, 0x93D6, 0xF7E9, + 0x93D7, 0xE748, 0x93D8, 0xE749, 0x93D9, 0xE74A, 0x93DA, 0xE74B, + 0x93DB, 0xE74C, 0x93DC, 0xE74D, 0x93DD, 0xE74E, 0x93DE, 0xE74F, + 0x93DF, 0xE750, 0x93E0, 0xE751, 0x93E1, 0xE752, 0x93E2, 0xE753, + 0x93E3, 0xE754, 0x93E4, 0xE755, 0x93E5, 0xE756, 0x93E6, 0xE757, + 0x93E7, 0xE758, 0x93E8, 0xE759, 0x93E9, 0xE75A, 0x93EA, 0xE75B, + 0x93EB, 0xE75C, 0x93EC, 0xE75D, 0x93ED, 0xE75E, 0x93EE, 0xE75F, + 0x93EF, 0xE760, 0x93F0, 0xE761, 0x93F1, 0xE762, 0x93F2, 0xE763, + 0x93F3, 0xE764, 0x93F4, 0xE765, 0x93F5, 0xE766, 0x93F6, 0xE767, + 0x93F7, 0xE768, 0x93F8, 0xE769, 0x93F9, 0xE76A, 0x93FA, 0xE76B, + 0x93FB, 0xE76C, 0x93FC, 0xE76D, 0x93FD, 0xE76E, 0x93FE, 0xE76F, + 0x93FF, 0xE770, 0x9400, 0xE771, 0x9401, 0xE772, 0x9402, 0xE773, + 0x9403, 0xE774, 0x9404, 0xE775, 0x9405, 0xE776, 0x9406, 0xE777, + 0x9407, 0xE778, 0x9408, 0xE779, 0x9409, 0xE77A, 0x940A, 0xE77B, + 0x940B, 0xE77C, 0x940C, 0xE77D, 0x940D, 0xE77E, 0x940E, 0xE780, + 0x940F, 0xE781, 0x9410, 0xE782, 0x9411, 0xE783, 0x9412, 0xE784, + 0x9413, 0xE785, 0x9414, 0xE786, 0x9415, 0xE787, 0x9416, 0xE788, + 0x9417, 0xE789, 0x9418, 0xE78A, 0x9419, 0xE78B, 0x941A, 0xE78C, + 0x941B, 0xE78D, 0x941C, 0xE78E, 0x941D, 0xE78F, 0x941E, 0xE790, + 0x941F, 0xE791, 0x9420, 0xE792, 0x9421, 0xE793, 0x9422, 0xE794, + 0x9423, 0xE795, 0x9424, 0xE796, 0x9425, 0xE797, 0x9426, 0xE798, + 0x9427, 0xE799, 0x9428, 0xE79A, 0x9429, 0xE79B, 0x942A, 0xE79C, + 0x942B, 0xE79D, 0x942C, 0xE79E, 0x942D, 0xE79F, 0x942E, 0xE7A0, + 0x942F, 0xE840, 0x9430, 0xE841, 0x9431, 0xE842, 0x9432, 0xE843, + 0x9433, 0xE844, 0x9434, 0xE845, 0x9435, 0xE846, 0x9436, 0xE847, + 0x9437, 0xE848, 0x9438, 0xE849, 0x9439, 0xE84A, 0x943A, 0xE84B, + 0x943B, 0xE84C, 0x943C, 0xE84D, 0x943D, 0xE84E, 0x943E, 0xF6CD, + 0x943F, 0xE84F, 0x9440, 0xE850, 0x9441, 0xE851, 0x9442, 0xE852, + 0x9443, 0xE853, 0x9444, 0xE854, 0x9445, 0xE855, 0x9446, 0xE856, + 0x9447, 0xE857, 0x9448, 0xE858, 0x9449, 0xE859, 0x944A, 0xE85A, + 0x944B, 0xE85B, 0x944C, 0xE85C, 0x944D, 0xE85D, 0x944E, 0xE85E, + 0x944F, 0xE85F, 0x9450, 0xE860, 0x9451, 0xE861, 0x9452, 0xE862, + 0x9453, 0xE863, 0x9454, 0xE864, 0x9455, 0xE865, 0x9456, 0xE866, + 0x9457, 0xE867, 0x9458, 0xE868, 0x9459, 0xE869, 0x945A, 0xE86A, + 0x945B, 0xE86B, 0x945C, 0xE86C, 0x945D, 0xE86D, 0x945E, 0xE86E, + 0x945F, 0xE86F, 0x9460, 0xE870, 0x9461, 0xE871, 0x9462, 0xE872, + 0x9463, 0xE873, 0x9464, 0xE874, 0x9465, 0xE875, 0x9466, 0xE876, + 0x9467, 0xE877, 0x9468, 0xE878, 0x9469, 0xE879, 0x946A, 0xE87A, + 0x946B, 0xF6CE, 0x946C, 0xE87B, 0x946D, 0xE87C, 0x946E, 0xE87D, + 0x946F, 0xE87E, 0x9470, 0xE880, 0x9471, 0xE881, 0x9472, 0xE882, + 0x9473, 0xE883, 0x9474, 0xE884, 0x9475, 0xE885, 0x9476, 0xE886, + 0x9477, 0xE887, 0x9478, 0xE888, 0x9479, 0xE889, 0x947A, 0xE88A, + 0x947B, 0xE88B, 0x947C, 0xE88C, 0x947D, 0xE88D, 0x947E, 0xE88E, + 0x947F, 0xE88F, 0x9480, 0xE890, 0x9481, 0xE891, 0x9482, 0xE892, + 0x9483, 0xE893, 0x9484, 0xE894, 0x9485, 0xEEC4, 0x9486, 0xEEC5, + 0x9487, 0xEEC6, 0x9488, 0xD5EB, 0x9489, 0xB6A4, 0x948A, 0xEEC8, + 0x948B, 0xEEC7, 0x948C, 0xEEC9, 0x948D, 0xEECA, 0x948E, 0xC7A5, + 0x948F, 0xEECB, 0x9490, 0xEECC, 0x9491, 0xE895, 0x9492, 0xB7B0, + 0x9493, 0xB5F6, 0x9494, 0xEECD, 0x9495, 0xEECF, 0x9496, 0xE896, + 0x9497, 0xEECE, 0x9498, 0xE897, 0x9499, 0xB8C6, 0x949A, 0xEED0, + 0x949B, 0xEED1, 0x949C, 0xEED2, 0x949D, 0xB6DB, 0x949E, 0xB3AE, + 0x949F, 0xD6D3, 0x94A0, 0xC4C6, 0x94A1, 0xB1B5, 0x94A2, 0xB8D6, + 0x94A3, 0xEED3, 0x94A4, 0xEED4, 0x94A5, 0xD4BF, 0x94A6, 0xC7D5, + 0x94A7, 0xBEFB, 0x94A8, 0xCED9, 0x94A9, 0xB9B3, 0x94AA, 0xEED6, + 0x94AB, 0xEED5, 0x94AC, 0xEED8, 0x94AD, 0xEED7, 0x94AE, 0xC5A5, + 0x94AF, 0xEED9, 0x94B0, 0xEEDA, 0x94B1, 0xC7AE, 0x94B2, 0xEEDB, + 0x94B3, 0xC7AF, 0x94B4, 0xEEDC, 0x94B5, 0xB2A7, 0x94B6, 0xEEDD, + 0x94B7, 0xEEDE, 0x94B8, 0xEEDF, 0x94B9, 0xEEE0, 0x94BA, 0xEEE1, + 0x94BB, 0xD7EA, 0x94BC, 0xEEE2, 0x94BD, 0xEEE3, 0x94BE, 0xBCD8, + 0x94BF, 0xEEE4, 0x94C0, 0xD3CB, 0x94C1, 0xCCFA, 0x94C2, 0xB2AC, + 0x94C3, 0xC1E5, 0x94C4, 0xEEE5, 0x94C5, 0xC7A6, 0x94C6, 0xC3AD, + 0x94C7, 0xE898, 0x94C8, 0xEEE6, 0x94C9, 0xEEE7, 0x94CA, 0xEEE8, + 0x94CB, 0xEEE9, 0x94CC, 0xEEEA, 0x94CD, 0xEEEB, 0x94CE, 0xEEEC, + 0x94CF, 0xE899, 0x94D0, 0xEEED, 0x94D1, 0xEEEE, 0x94D2, 0xEEEF, + 0x94D3, 0xE89A, 0x94D4, 0xE89B, 0x94D5, 0xEEF0, 0x94D6, 0xEEF1, + 0x94D7, 0xEEF2, 0x94D8, 0xEEF4, 0x94D9, 0xEEF3, 0x94DA, 0xE89C, + 0x94DB, 0xEEF5, 0x94DC, 0xCDAD, 0x94DD, 0xC2C1, 0x94DE, 0xEEF6, + 0x94DF, 0xEEF7, 0x94E0, 0xEEF8, 0x94E1, 0xD5A1, 0x94E2, 0xEEF9, + 0x94E3, 0xCFB3, 0x94E4, 0xEEFA, 0x94E5, 0xEEFB, 0x94E6, 0xE89D, + 0x94E7, 0xEEFC, 0x94E8, 0xEEFD, 0x94E9, 0xEFA1, 0x94EA, 0xEEFE, + 0x94EB, 0xEFA2, 0x94EC, 0xB8F5, 0x94ED, 0xC3FA, 0x94EE, 0xEFA3, + 0x94EF, 0xEFA4, 0x94F0, 0xBDC2, 0x94F1, 0xD2BF, 0x94F2, 0xB2F9, + 0x94F3, 0xEFA5, 0x94F4, 0xEFA6, 0x94F5, 0xEFA7, 0x94F6, 0xD2F8, + 0x94F7, 0xEFA8, 0x94F8, 0xD6FD, 0x94F9, 0xEFA9, 0x94FA, 0xC6CC, + 0x94FB, 0xE89E, 0x94FC, 0xEFAA, 0x94FD, 0xEFAB, 0x94FE, 0xC1B4, + 0x94FF, 0xEFAC, 0x9500, 0xCFFA, 0x9501, 0xCBF8, 0x9502, 0xEFAE, + 0x9503, 0xEFAD, 0x9504, 0xB3FA, 0x9505, 0xB9F8, 0x9506, 0xEFAF, + 0x9507, 0xEFB0, 0x9508, 0xD0E2, 0x9509, 0xEFB1, 0x950A, 0xEFB2, + 0x950B, 0xB7E6, 0x950C, 0xD0BF, 0x950D, 0xEFB3, 0x950E, 0xEFB4, + 0x950F, 0xEFB5, 0x9510, 0xC8F1, 0x9511, 0xCCE0, 0x9512, 0xEFB6, + 0x9513, 0xEFB7, 0x9514, 0xEFB8, 0x9515, 0xEFB9, 0x9516, 0xEFBA, + 0x9517, 0xD5E0, 0x9518, 0xEFBB, 0x9519, 0xB4ED, 0x951A, 0xC3AA, + 0x951B, 0xEFBC, 0x951C, 0xE89F, 0x951D, 0xEFBD, 0x951E, 0xEFBE, + 0x951F, 0xEFBF, 0x9520, 0xE8A0, 0x9521, 0xCEFD, 0x9522, 0xEFC0, + 0x9523, 0xC2E0, 0x9524, 0xB4B8, 0x9525, 0xD7B6, 0x9526, 0xBDF5, + 0x9527, 0xE940, 0x9528, 0xCFC7, 0x9529, 0xEFC3, 0x952A, 0xEFC1, + 0x952B, 0xEFC2, 0x952C, 0xEFC4, 0x952D, 0xB6A7, 0x952E, 0xBCFC, + 0x952F, 0xBEE2, 0x9530, 0xC3CC, 0x9531, 0xEFC5, 0x9532, 0xEFC6, + 0x9533, 0xE941, 0x9534, 0xEFC7, 0x9535, 0xEFCF, 0x9536, 0xEFC8, + 0x9537, 0xEFC9, 0x9538, 0xEFCA, 0x9539, 0xC7C2, 0x953A, 0xEFF1, + 0x953B, 0xB6CD, 0x953C, 0xEFCB, 0x953D, 0xE942, 0x953E, 0xEFCC, + 0x953F, 0xEFCD, 0x9540, 0xB6C6, 0x9541, 0xC3BE, 0x9542, 0xEFCE, + 0x9543, 0xE943, 0x9544, 0xEFD0, 0x9545, 0xEFD1, 0x9546, 0xEFD2, + 0x9547, 0xD5F2, 0x9548, 0xE944, 0x9549, 0xEFD3, 0x954A, 0xC4F7, + 0x954B, 0xE945, 0x954C, 0xEFD4, 0x954D, 0xC4F8, 0x954E, 0xEFD5, + 0x954F, 0xEFD6, 0x9550, 0xB8E4, 0x9551, 0xB0F7, 0x9552, 0xEFD7, + 0x9553, 0xEFD8, 0x9554, 0xEFD9, 0x9555, 0xE946, 0x9556, 0xEFDA, + 0x9557, 0xEFDB, 0x9558, 0xEFDC, 0x9559, 0xEFDD, 0x955A, 0xE947, + 0x955B, 0xEFDE, 0x955C, 0xBEB5, 0x955D, 0xEFE1, 0x955E, 0xEFDF, + 0x955F, 0xEFE0, 0x9560, 0xE948, 0x9561, 0xEFE2, 0x9562, 0xEFE3, + 0x9563, 0xC1CD, 0x9564, 0xEFE4, 0x9565, 0xEFE5, 0x9566, 0xEFE6, + 0x9567, 0xEFE7, 0x9568, 0xEFE8, 0x9569, 0xEFE9, 0x956A, 0xEFEA, + 0x956B, 0xEFEB, 0x956C, 0xEFEC, 0x956D, 0xC0D8, 0x956E, 0xE949, + 0x956F, 0xEFED, 0x9570, 0xC1AD, 0x9571, 0xEFEE, 0x9572, 0xEFEF, + 0x9573, 0xEFF0, 0x9574, 0xE94A, 0x9575, 0xE94B, 0x9576, 0xCFE2, + 0x9577, 0xE94C, 0x9578, 0xE94D, 0x9579, 0xE94E, 0x957A, 0xE94F, + 0x957B, 0xE950, 0x957C, 0xE951, 0x957D, 0xE952, 0x957E, 0xE953, + 0x957F, 0xB3A4, 0x9580, 0xE954, 0x9581, 0xE955, 0x9582, 0xE956, + 0x9583, 0xE957, 0x9584, 0xE958, 0x9585, 0xE959, 0x9586, 0xE95A, + 0x9587, 0xE95B, 0x9588, 0xE95C, 0x9589, 0xE95D, 0x958A, 0xE95E, + 0x958B, 0xE95F, 0x958C, 0xE960, 0x958D, 0xE961, 0x958E, 0xE962, + 0x958F, 0xE963, 0x9590, 0xE964, 0x9591, 0xE965, 0x9592, 0xE966, + 0x9593, 0xE967, 0x9594, 0xE968, 0x9595, 0xE969, 0x9596, 0xE96A, + 0x9597, 0xE96B, 0x9598, 0xE96C, 0x9599, 0xE96D, 0x959A, 0xE96E, + 0x959B, 0xE96F, 0x959C, 0xE970, 0x959D, 0xE971, 0x959E, 0xE972, + 0x959F, 0xE973, 0x95A0, 0xE974, 0x95A1, 0xE975, 0x95A2, 0xE976, + 0x95A3, 0xE977, 0x95A4, 0xE978, 0x95A5, 0xE979, 0x95A6, 0xE97A, + 0x95A7, 0xE97B, 0x95A8, 0xE97C, 0x95A9, 0xE97D, 0x95AA, 0xE97E, + 0x95AB, 0xE980, 0x95AC, 0xE981, 0x95AD, 0xE982, 0x95AE, 0xE983, + 0x95AF, 0xE984, 0x95B0, 0xE985, 0x95B1, 0xE986, 0x95B2, 0xE987, + 0x95B3, 0xE988, 0x95B4, 0xE989, 0x95B5, 0xE98A, 0x95B6, 0xE98B, + 0x95B7, 0xE98C, 0x95B8, 0xE98D, 0x95B9, 0xE98E, 0x95BA, 0xE98F, + 0x95BB, 0xE990, 0x95BC, 0xE991, 0x95BD, 0xE992, 0x95BE, 0xE993, + 0x95BF, 0xE994, 0x95C0, 0xE995, 0x95C1, 0xE996, 0x95C2, 0xE997, + 0x95C3, 0xE998, 0x95C4, 0xE999, 0x95C5, 0xE99A, 0x95C6, 0xE99B, + 0x95C7, 0xE99C, 0x95C8, 0xE99D, 0x95C9, 0xE99E, 0x95CA, 0xE99F, + 0x95CB, 0xE9A0, 0x95CC, 0xEA40, 0x95CD, 0xEA41, 0x95CE, 0xEA42, + 0x95CF, 0xEA43, 0x95D0, 0xEA44, 0x95D1, 0xEA45, 0x95D2, 0xEA46, + 0x95D3, 0xEA47, 0x95D4, 0xEA48, 0x95D5, 0xEA49, 0x95D6, 0xEA4A, + 0x95D7, 0xEA4B, 0x95D8, 0xEA4C, 0x95D9, 0xEA4D, 0x95DA, 0xEA4E, + 0x95DB, 0xEA4F, 0x95DC, 0xEA50, 0x95DD, 0xEA51, 0x95DE, 0xEA52, + 0x95DF, 0xEA53, 0x95E0, 0xEA54, 0x95E1, 0xEA55, 0x95E2, 0xEA56, + 0x95E3, 0xEA57, 0x95E4, 0xEA58, 0x95E5, 0xEA59, 0x95E6, 0xEA5A, + 0x95E7, 0xEA5B, 0x95E8, 0xC3C5, 0x95E9, 0xE3C5, 0x95EA, 0xC9C1, + 0x95EB, 0xE3C6, 0x95EC, 0xEA5C, 0x95ED, 0xB1D5, 0x95EE, 0xCECA, + 0x95EF, 0xB4B3, 0x95F0, 0xC8F2, 0x95F1, 0xE3C7, 0x95F2, 0xCFD0, + 0x95F3, 0xE3C8, 0x95F4, 0xBCE4, 0x95F5, 0xE3C9, 0x95F6, 0xE3CA, + 0x95F7, 0xC3C6, 0x95F8, 0xD5A2, 0x95F9, 0xC4D6, 0x95FA, 0xB9EB, + 0x95FB, 0xCEC5, 0x95FC, 0xE3CB, 0x95FD, 0xC3F6, 0x95FE, 0xE3CC, + 0x95FF, 0xEA5D, 0x9600, 0xB7A7, 0x9601, 0xB8F3, 0x9602, 0xBAD2, + 0x9603, 0xE3CD, 0x9604, 0xE3CE, 0x9605, 0xD4C4, 0x9606, 0xE3CF, + 0x9607, 0xEA5E, 0x9608, 0xE3D0, 0x9609, 0xD1CB, 0x960A, 0xE3D1, + 0x960B, 0xE3D2, 0x960C, 0xE3D3, 0x960D, 0xE3D4, 0x960E, 0xD1D6, + 0x960F, 0xE3D5, 0x9610, 0xB2FB, 0x9611, 0xC0BB, 0x9612, 0xE3D6, + 0x9613, 0xEA5F, 0x9614, 0xC0AB, 0x9615, 0xE3D7, 0x9616, 0xE3D8, + 0x9617, 0xE3D9, 0x9618, 0xEA60, 0x9619, 0xE3DA, 0x961A, 0xE3DB, + 0x961B, 0xEA61, 0x961C, 0xB8B7, 0x961D, 0xDAE2, 0x961E, 0xEA62, + 0x961F, 0xB6D3, 0x9620, 0xEA63, 0x9621, 0xDAE4, 0x9622, 0xDAE3, + 0x9623, 0xEA64, 0x9624, 0xEA65, 0x9625, 0xEA66, 0x9626, 0xEA67, + 0x9627, 0xEA68, 0x9628, 0xEA69, 0x9629, 0xEA6A, 0x962A, 0xDAE6, + 0x962B, 0xEA6B, 0x962C, 0xEA6C, 0x962D, 0xEA6D, 0x962E, 0xC8EE, + 0x962F, 0xEA6E, 0x9630, 0xEA6F, 0x9631, 0xDAE5, 0x9632, 0xB7C0, + 0x9633, 0xD1F4, 0x9634, 0xD2F5, 0x9635, 0xD5F3, 0x9636, 0xBDD7, + 0x9637, 0xEA70, 0x9638, 0xEA71, 0x9639, 0xEA72, 0x963A, 0xEA73, + 0x963B, 0xD7E8, 0x963C, 0xDAE8, 0x963D, 0xDAE7, 0x963E, 0xEA74, + 0x963F, 0xB0A2, 0x9640, 0xCDD3, 0x9641, 0xEA75, 0x9642, 0xDAE9, + 0x9643, 0xEA76, 0x9644, 0xB8BD, 0x9645, 0xBCCA, 0x9646, 0xC2BD, + 0x9647, 0xC2A4, 0x9648, 0xB3C2, 0x9649, 0xDAEA, 0x964A, 0xEA77, + 0x964B, 0xC2AA, 0x964C, 0xC4B0, 0x964D, 0xBDB5, 0x964E, 0xEA78, + 0x964F, 0xEA79, 0x9650, 0xCFDE, 0x9651, 0xEA7A, 0x9652, 0xEA7B, + 0x9653, 0xEA7C, 0x9654, 0xDAEB, 0x9655, 0xC9C2, 0x9656, 0xEA7D, + 0x9657, 0xEA7E, 0x9658, 0xEA80, 0x9659, 0xEA81, 0x965A, 0xEA82, + 0x965B, 0xB1DD, 0x965C, 0xEA83, 0x965D, 0xEA84, 0x965E, 0xEA85, + 0x965F, 0xDAEC, 0x9660, 0xEA86, 0x9661, 0xB6B8, 0x9662, 0xD4BA, + 0x9663, 0xEA87, 0x9664, 0xB3FD, 0x9665, 0xEA88, 0x9666, 0xEA89, + 0x9667, 0xDAED, 0x9668, 0xD4C9, 0x9669, 0xCFD5, 0x966A, 0xC5E3, + 0x966B, 0xEA8A, 0x966C, 0xDAEE, 0x966D, 0xEA8B, 0x966E, 0xEA8C, + 0x966F, 0xEA8D, 0x9670, 0xEA8E, 0x9671, 0xEA8F, 0x9672, 0xDAEF, + 0x9673, 0xEA90, 0x9674, 0xDAF0, 0x9675, 0xC1EA, 0x9676, 0xCCD5, + 0x9677, 0xCFDD, 0x9678, 0xEA91, 0x9679, 0xEA92, 0x967A, 0xEA93, + 0x967B, 0xEA94, 0x967C, 0xEA95, 0x967D, 0xEA96, 0x967E, 0xEA97, + 0x967F, 0xEA98, 0x9680, 0xEA99, 0x9681, 0xEA9A, 0x9682, 0xEA9B, + 0x9683, 0xEA9C, 0x9684, 0xEA9D, 0x9685, 0xD3E7, 0x9686, 0xC2A1, + 0x9687, 0xEA9E, 0x9688, 0xDAF1, 0x9689, 0xEA9F, 0x968A, 0xEAA0, + 0x968B, 0xCBE5, 0x968C, 0xEB40, 0x968D, 0xDAF2, 0x968E, 0xEB41, + 0x968F, 0xCBE6, 0x9690, 0xD2FE, 0x9691, 0xEB42, 0x9692, 0xEB43, + 0x9693, 0xEB44, 0x9694, 0xB8F4, 0x9695, 0xEB45, 0x9696, 0xEB46, + 0x9697, 0xDAF3, 0x9698, 0xB0AF, 0x9699, 0xCFB6, 0x969A, 0xEB47, + 0x969B, 0xEB48, 0x969C, 0xD5CF, 0x969D, 0xEB49, 0x969E, 0xEB4A, + 0x969F, 0xEB4B, 0x96A0, 0xEB4C, 0x96A1, 0xEB4D, 0x96A2, 0xEB4E, + 0x96A3, 0xEB4F, 0x96A4, 0xEB50, 0x96A5, 0xEB51, 0x96A6, 0xEB52, + 0x96A7, 0xCBED, 0x96A8, 0xEB53, 0x96A9, 0xEB54, 0x96AA, 0xEB55, + 0x96AB, 0xEB56, 0x96AC, 0xEB57, 0x96AD, 0xEB58, 0x96AE, 0xEB59, + 0x96AF, 0xEB5A, 0x96B0, 0xDAF4, 0x96B1, 0xEB5B, 0x96B2, 0xEB5C, + 0x96B3, 0xE3C4, 0x96B4, 0xEB5D, 0x96B5, 0xEB5E, 0x96B6, 0xC1A5, + 0x96B7, 0xEB5F, 0x96B8, 0xEB60, 0x96B9, 0xF6BF, 0x96BA, 0xEB61, + 0x96BB, 0xEB62, 0x96BC, 0xF6C0, 0x96BD, 0xF6C1, 0x96BE, 0xC4D1, + 0x96BF, 0xEB63, 0x96C0, 0xC8B8, 0x96C1, 0xD1E3, 0x96C2, 0xEB64, + 0x96C3, 0xEB65, 0x96C4, 0xD0DB, 0x96C5, 0xD1C5, 0x96C6, 0xBCAF, + 0x96C7, 0xB9CD, 0x96C8, 0xEB66, 0x96C9, 0xEFF4, 0x96CA, 0xEB67, + 0x96CB, 0xEB68, 0x96CC, 0xB4C6, 0x96CD, 0xD3BA, 0x96CE, 0xF6C2, + 0x96CF, 0xB3FB, 0x96D0, 0xEB69, 0x96D1, 0xEB6A, 0x96D2, 0xF6C3, + 0x96D3, 0xEB6B, 0x96D4, 0xEB6C, 0x96D5, 0xB5F1, 0x96D6, 0xEB6D, + 0x96D7, 0xEB6E, 0x96D8, 0xEB6F, 0x96D9, 0xEB70, 0x96DA, 0xEB71, + 0x96DB, 0xEB72, 0x96DC, 0xEB73, 0x96DD, 0xEB74, 0x96DE, 0xEB75, + 0x96DF, 0xEB76, 0x96E0, 0xF6C5, 0x96E1, 0xEB77, 0x96E2, 0xEB78, + 0x96E3, 0xEB79, 0x96E4, 0xEB7A, 0x96E5, 0xEB7B, 0x96E6, 0xEB7C, + 0x96E7, 0xEB7D, 0x96E8, 0xD3EA, 0x96E9, 0xF6A7, 0x96EA, 0xD1A9, + 0x96EB, 0xEB7E, 0x96EC, 0xEB80, 0x96ED, 0xEB81, 0x96EE, 0xEB82, + 0x96EF, 0xF6A9, 0x96F0, 0xEB83, 0x96F1, 0xEB84, 0x96F2, 0xEB85, + 0x96F3, 0xF6A8, 0x96F4, 0xEB86, 0x96F5, 0xEB87, 0x96F6, 0xC1E3, + 0x96F7, 0xC0D7, 0x96F8, 0xEB88, 0x96F9, 0xB1A2, 0x96FA, 0xEB89, + 0x96FB, 0xEB8A, 0x96FC, 0xEB8B, 0x96FD, 0xEB8C, 0x96FE, 0xCEED, + 0x96FF, 0xEB8D, 0x9700, 0xD0E8, 0x9701, 0xF6AB, 0x9702, 0xEB8E, + 0x9703, 0xEB8F, 0x9704, 0xCFF6, 0x9705, 0xEB90, 0x9706, 0xF6AA, + 0x9707, 0xD5F0, 0x9708, 0xF6AC, 0x9709, 0xC3B9, 0x970A, 0xEB91, + 0x970B, 0xEB92, 0x970C, 0xEB93, 0x970D, 0xBBF4, 0x970E, 0xF6AE, + 0x970F, 0xF6AD, 0x9710, 0xEB94, 0x9711, 0xEB95, 0x9712, 0xEB96, + 0x9713, 0xC4DE, 0x9714, 0xEB97, 0x9715, 0xEB98, 0x9716, 0xC1D8, + 0x9717, 0xEB99, 0x9718, 0xEB9A, 0x9719, 0xEB9B, 0x971A, 0xEB9C, + 0x971B, 0xEB9D, 0x971C, 0xCBAA, 0x971D, 0xEB9E, 0x971E, 0xCFBC, + 0x971F, 0xEB9F, 0x9720, 0xEBA0, 0x9721, 0xEC40, 0x9722, 0xEC41, + 0x9723, 0xEC42, 0x9724, 0xEC43, 0x9725, 0xEC44, 0x9726, 0xEC45, + 0x9727, 0xEC46, 0x9728, 0xEC47, 0x9729, 0xEC48, 0x972A, 0xF6AF, + 0x972B, 0xEC49, 0x972C, 0xEC4A, 0x972D, 0xF6B0, 0x972E, 0xEC4B, + 0x972F, 0xEC4C, 0x9730, 0xF6B1, 0x9731, 0xEC4D, 0x9732, 0xC2B6, + 0x9733, 0xEC4E, 0x9734, 0xEC4F, 0x9735, 0xEC50, 0x9736, 0xEC51, + 0x9737, 0xEC52, 0x9738, 0xB0D4, 0x9739, 0xC5F9, 0x973A, 0xEC53, + 0x973B, 0xEC54, 0x973C, 0xEC55, 0x973D, 0xEC56, 0x973E, 0xF6B2, + 0x973F, 0xEC57, 0x9740, 0xEC58, 0x9741, 0xEC59, 0x9742, 0xEC5A, + 0x9743, 0xEC5B, 0x9744, 0xEC5C, 0x9745, 0xEC5D, 0x9746, 0xEC5E, + 0x9747, 0xEC5F, 0x9748, 0xEC60, 0x9749, 0xEC61, 0x974A, 0xEC62, + 0x974B, 0xEC63, 0x974C, 0xEC64, 0x974D, 0xEC65, 0x974E, 0xEC66, + 0x974F, 0xEC67, 0x9750, 0xEC68, 0x9751, 0xEC69, 0x9752, 0xC7E0, + 0x9753, 0xF6A6, 0x9754, 0xEC6A, 0x9755, 0xEC6B, 0x9756, 0xBEB8, + 0x9757, 0xEC6C, 0x9758, 0xEC6D, 0x9759, 0xBEB2, 0x975A, 0xEC6E, + 0x975B, 0xB5E5, 0x975C, 0xEC6F, 0x975D, 0xEC70, 0x975E, 0xB7C7, + 0x975F, 0xEC71, 0x9760, 0xBFBF, 0x9761, 0xC3D2, 0x9762, 0xC3E6, + 0x9763, 0xEC72, 0x9764, 0xEC73, 0x9765, 0xD8CC, 0x9766, 0xEC74, + 0x9767, 0xEC75, 0x9768, 0xEC76, 0x9769, 0xB8EF, 0x976A, 0xEC77, + 0x976B, 0xEC78, 0x976C, 0xEC79, 0x976D, 0xEC7A, 0x976E, 0xEC7B, + 0x976F, 0xEC7C, 0x9770, 0xEC7D, 0x9771, 0xEC7E, 0x9772, 0xEC80, + 0x9773, 0xBDF9, 0x9774, 0xD1A5, 0x9775, 0xEC81, 0x9776, 0xB0D0, + 0x9777, 0xEC82, 0x9778, 0xEC83, 0x9779, 0xEC84, 0x977A, 0xEC85, + 0x977B, 0xEC86, 0x977C, 0xF7B0, 0x977D, 0xEC87, 0x977E, 0xEC88, + 0x977F, 0xEC89, 0x9780, 0xEC8A, 0x9781, 0xEC8B, 0x9782, 0xEC8C, + 0x9783, 0xEC8D, 0x9784, 0xEC8E, 0x9785, 0xF7B1, 0x9786, 0xEC8F, + 0x9787, 0xEC90, 0x9788, 0xEC91, 0x9789, 0xEC92, 0x978A, 0xEC93, + 0x978B, 0xD0AC, 0x978C, 0xEC94, 0x978D, 0xB0B0, 0x978E, 0xEC95, + 0x978F, 0xEC96, 0x9790, 0xEC97, 0x9791, 0xF7B2, 0x9792, 0xF7B3, + 0x9793, 0xEC98, 0x9794, 0xF7B4, 0x9795, 0xEC99, 0x9796, 0xEC9A, + 0x9797, 0xEC9B, 0x9798, 0xC7CA, 0x9799, 0xEC9C, 0x979A, 0xEC9D, + 0x979B, 0xEC9E, 0x979C, 0xEC9F, 0x979D, 0xECA0, 0x979E, 0xED40, + 0x979F, 0xED41, 0x97A0, 0xBECF, 0x97A1, 0xED42, 0x97A2, 0xED43, + 0x97A3, 0xF7B7, 0x97A4, 0xED44, 0x97A5, 0xED45, 0x97A6, 0xED46, + 0x97A7, 0xED47, 0x97A8, 0xED48, 0x97A9, 0xED49, 0x97AA, 0xED4A, + 0x97AB, 0xF7B6, 0x97AC, 0xED4B, 0x97AD, 0xB1DE, 0x97AE, 0xED4C, + 0x97AF, 0xF7B5, 0x97B0, 0xED4D, 0x97B1, 0xED4E, 0x97B2, 0xF7B8, + 0x97B3, 0xED4F, 0x97B4, 0xF7B9, 0x97B5, 0xED50, 0x97B6, 0xED51, + 0x97B7, 0xED52, 0x97B8, 0xED53, 0x97B9, 0xED54, 0x97BA, 0xED55, + 0x97BB, 0xED56, 0x97BC, 0xED57, 0x97BD, 0xED58, 0x97BE, 0xED59, + 0x97BF, 0xED5A, 0x97C0, 0xED5B, 0x97C1, 0xED5C, 0x97C2, 0xED5D, + 0x97C3, 0xED5E, 0x97C4, 0xED5F, 0x97C5, 0xED60, 0x97C6, 0xED61, + 0x97C7, 0xED62, 0x97C8, 0xED63, 0x97C9, 0xED64, 0x97CA, 0xED65, + 0x97CB, 0xED66, 0x97CC, 0xED67, 0x97CD, 0xED68, 0x97CE, 0xED69, + 0x97CF, 0xED6A, 0x97D0, 0xED6B, 0x97D1, 0xED6C, 0x97D2, 0xED6D, + 0x97D3, 0xED6E, 0x97D4, 0xED6F, 0x97D5, 0xED70, 0x97D6, 0xED71, + 0x97D7, 0xED72, 0x97D8, 0xED73, 0x97D9, 0xED74, 0x97DA, 0xED75, + 0x97DB, 0xED76, 0x97DC, 0xED77, 0x97DD, 0xED78, 0x97DE, 0xED79, + 0x97DF, 0xED7A, 0x97E0, 0xED7B, 0x97E1, 0xED7C, 0x97E2, 0xED7D, + 0x97E3, 0xED7E, 0x97E4, 0xED80, 0x97E5, 0xED81, 0x97E6, 0xCEA4, + 0x97E7, 0xC8CD, 0x97E8, 0xED82, 0x97E9, 0xBAAB, 0x97EA, 0xE8B8, + 0x97EB, 0xE8B9, 0x97EC, 0xE8BA, 0x97ED, 0xBEC2, 0x97EE, 0xED83, + 0x97EF, 0xED84, 0x97F0, 0xED85, 0x97F1, 0xED86, 0x97F2, 0xED87, + 0x97F3, 0xD2F4, 0x97F4, 0xED88, 0x97F5, 0xD4CF, 0x97F6, 0xC9D8, + 0x97F7, 0xED89, 0x97F8, 0xED8A, 0x97F9, 0xED8B, 0x97FA, 0xED8C, + 0x97FB, 0xED8D, 0x97FC, 0xED8E, 0x97FD, 0xED8F, 0x97FE, 0xED90, + 0x97FF, 0xED91, 0x9800, 0xED92, 0x9801, 0xED93, 0x9802, 0xED94, + 0x9803, 0xED95, 0x9804, 0xED96, 0x9805, 0xED97, 0x9806, 0xED98, + 0x9807, 0xED99, 0x9808, 0xED9A, 0x9809, 0xED9B, 0x980A, 0xED9C, + 0x980B, 0xED9D, 0x980C, 0xED9E, 0x980D, 0xED9F, 0x980E, 0xEDA0, + 0x980F, 0xEE40, 0x9810, 0xEE41, 0x9811, 0xEE42, 0x9812, 0xEE43, + 0x9813, 0xEE44, 0x9814, 0xEE45, 0x9815, 0xEE46, 0x9816, 0xEE47, + 0x9817, 0xEE48, 0x9818, 0xEE49, 0x9819, 0xEE4A, 0x981A, 0xEE4B, + 0x981B, 0xEE4C, 0x981C, 0xEE4D, 0x981D, 0xEE4E, 0x981E, 0xEE4F, + 0x981F, 0xEE50, 0x9820, 0xEE51, 0x9821, 0xEE52, 0x9822, 0xEE53, + 0x9823, 0xEE54, 0x9824, 0xEE55, 0x9825, 0xEE56, 0x9826, 0xEE57, + 0x9827, 0xEE58, 0x9828, 0xEE59, 0x9829, 0xEE5A, 0x982A, 0xEE5B, + 0x982B, 0xEE5C, 0x982C, 0xEE5D, 0x982D, 0xEE5E, 0x982E, 0xEE5F, + 0x982F, 0xEE60, 0x9830, 0xEE61, 0x9831, 0xEE62, 0x9832, 0xEE63, + 0x9833, 0xEE64, 0x9834, 0xEE65, 0x9835, 0xEE66, 0x9836, 0xEE67, + 0x9837, 0xEE68, 0x9838, 0xEE69, 0x9839, 0xEE6A, 0x983A, 0xEE6B, + 0x983B, 0xEE6C, 0x983C, 0xEE6D, 0x983D, 0xEE6E, 0x983E, 0xEE6F, + 0x983F, 0xEE70, 0x9840, 0xEE71, 0x9841, 0xEE72, 0x9842, 0xEE73, + 0x9843, 0xEE74, 0x9844, 0xEE75, 0x9845, 0xEE76, 0x9846, 0xEE77, + 0x9847, 0xEE78, 0x9848, 0xEE79, 0x9849, 0xEE7A, 0x984A, 0xEE7B, + 0x984B, 0xEE7C, 0x984C, 0xEE7D, 0x984D, 0xEE7E, 0x984E, 0xEE80, + 0x984F, 0xEE81, 0x9850, 0xEE82, 0x9851, 0xEE83, 0x9852, 0xEE84, + 0x9853, 0xEE85, 0x9854, 0xEE86, 0x9855, 0xEE87, 0x9856, 0xEE88, + 0x9857, 0xEE89, 0x9858, 0xEE8A, 0x9859, 0xEE8B, 0x985A, 0xEE8C, + 0x985B, 0xEE8D, 0x985C, 0xEE8E, 0x985D, 0xEE8F, 0x985E, 0xEE90, + 0x985F, 0xEE91, 0x9860, 0xEE92, 0x9861, 0xEE93, 0x9862, 0xEE94, + 0x9863, 0xEE95, 0x9864, 0xEE96, 0x9865, 0xEE97, 0x9866, 0xEE98, + 0x9867, 0xEE99, 0x9868, 0xEE9A, 0x9869, 0xEE9B, 0x986A, 0xEE9C, + 0x986B, 0xEE9D, 0x986C, 0xEE9E, 0x986D, 0xEE9F, 0x986E, 0xEEA0, + 0x986F, 0xEF40, 0x9870, 0xEF41, 0x9871, 0xEF42, 0x9872, 0xEF43, + 0x9873, 0xEF44, 0x9874, 0xEF45, 0x9875, 0xD2B3, 0x9876, 0xB6A5, + 0x9877, 0xC7EA, 0x9878, 0xF1FC, 0x9879, 0xCFEE, 0x987A, 0xCBB3, + 0x987B, 0xD0EB, 0x987C, 0xE7EF, 0x987D, 0xCDE7, 0x987E, 0xB9CB, + 0x987F, 0xB6D9, 0x9880, 0xF1FD, 0x9881, 0xB0E4, 0x9882, 0xCBCC, + 0x9883, 0xF1FE, 0x9884, 0xD4A4, 0x9885, 0xC2AD, 0x9886, 0xC1EC, + 0x9887, 0xC6C4, 0x9888, 0xBEB1, 0x9889, 0xF2A1, 0x988A, 0xBCD5, + 0x988B, 0xEF46, 0x988C, 0xF2A2, 0x988D, 0xF2A3, 0x988E, 0xEF47, + 0x988F, 0xF2A4, 0x9890, 0xD2C3, 0x9891, 0xC6B5, 0x9892, 0xEF48, + 0x9893, 0xCDC7, 0x9894, 0xF2A5, 0x9895, 0xEF49, 0x9896, 0xD3B1, + 0x9897, 0xBFC5, 0x9898, 0xCCE2, 0x9899, 0xEF4A, 0x989A, 0xF2A6, + 0x989B, 0xF2A7, 0x989C, 0xD1D5, 0x989D, 0xB6EE, 0x989E, 0xF2A8, + 0x989F, 0xF2A9, 0x98A0, 0xB5DF, 0x98A1, 0xF2AA, 0x98A2, 0xF2AB, + 0x98A3, 0xEF4B, 0x98A4, 0xB2FC, 0x98A5, 0xF2AC, 0x98A6, 0xF2AD, + 0x98A7, 0xC8A7, 0x98A8, 0xEF4C, 0x98A9, 0xEF4D, 0x98AA, 0xEF4E, + 0x98AB, 0xEF4F, 0x98AC, 0xEF50, 0x98AD, 0xEF51, 0x98AE, 0xEF52, + 0x98AF, 0xEF53, 0x98B0, 0xEF54, 0x98B1, 0xEF55, 0x98B2, 0xEF56, + 0x98B3, 0xEF57, 0x98B4, 0xEF58, 0x98B5, 0xEF59, 0x98B6, 0xEF5A, + 0x98B7, 0xEF5B, 0x98B8, 0xEF5C, 0x98B9, 0xEF5D, 0x98BA, 0xEF5E, + 0x98BB, 0xEF5F, 0x98BC, 0xEF60, 0x98BD, 0xEF61, 0x98BE, 0xEF62, + 0x98BF, 0xEF63, 0x98C0, 0xEF64, 0x98C1, 0xEF65, 0x98C2, 0xEF66, + 0x98C3, 0xEF67, 0x98C4, 0xEF68, 0x98C5, 0xEF69, 0x98C6, 0xEF6A, + 0x98C7, 0xEF6B, 0x98C8, 0xEF6C, 0x98C9, 0xEF6D, 0x98CA, 0xEF6E, + 0x98CB, 0xEF6F, 0x98CC, 0xEF70, 0x98CD, 0xEF71, 0x98CE, 0xB7E7, + 0x98CF, 0xEF72, 0x98D0, 0xEF73, 0x98D1, 0xECA9, 0x98D2, 0xECAA, + 0x98D3, 0xECAB, 0x98D4, 0xEF74, 0x98D5, 0xECAC, 0x98D6, 0xEF75, + 0x98D7, 0xEF76, 0x98D8, 0xC6AE, 0x98D9, 0xECAD, 0x98DA, 0xECAE, + 0x98DB, 0xEF77, 0x98DC, 0xEF78, 0x98DD, 0xEF79, 0x98DE, 0xB7C9, + 0x98DF, 0xCAB3, 0x98E0, 0xEF7A, 0x98E1, 0xEF7B, 0x98E2, 0xEF7C, + 0x98E3, 0xEF7D, 0x98E4, 0xEF7E, 0x98E5, 0xEF80, 0x98E6, 0xEF81, + 0x98E7, 0xE2B8, 0x98E8, 0xF7CF, 0x98E9, 0xEF82, 0x98EA, 0xEF83, + 0x98EB, 0xEF84, 0x98EC, 0xEF85, 0x98ED, 0xEF86, 0x98EE, 0xEF87, + 0x98EF, 0xEF88, 0x98F0, 0xEF89, 0x98F1, 0xEF8A, 0x98F2, 0xEF8B, + 0x98F3, 0xEF8C, 0x98F4, 0xEF8D, 0x98F5, 0xEF8E, 0x98F6, 0xEF8F, + 0x98F7, 0xEF90, 0x98F8, 0xEF91, 0x98F9, 0xEF92, 0x98FA, 0xEF93, + 0x98FB, 0xEF94, 0x98FC, 0xEF95, 0x98FD, 0xEF96, 0x98FE, 0xEF97, + 0x98FF, 0xEF98, 0x9900, 0xEF99, 0x9901, 0xEF9A, 0x9902, 0xEF9B, + 0x9903, 0xEF9C, 0x9904, 0xEF9D, 0x9905, 0xEF9E, 0x9906, 0xEF9F, + 0x9907, 0xEFA0, 0x9908, 0xF040, 0x9909, 0xF041, 0x990A, 0xF042, + 0x990B, 0xF043, 0x990C, 0xF044, 0x990D, 0xF7D0, 0x990E, 0xF045, + 0x990F, 0xF046, 0x9910, 0xB2CD, 0x9911, 0xF047, 0x9912, 0xF048, + 0x9913, 0xF049, 0x9914, 0xF04A, 0x9915, 0xF04B, 0x9916, 0xF04C, + 0x9917, 0xF04D, 0x9918, 0xF04E, 0x9919, 0xF04F, 0x991A, 0xF050, + 0x991B, 0xF051, 0x991C, 0xF052, 0x991D, 0xF053, 0x991E, 0xF054, + 0x991F, 0xF055, 0x9920, 0xF056, 0x9921, 0xF057, 0x9922, 0xF058, + 0x9923, 0xF059, 0x9924, 0xF05A, 0x9925, 0xF05B, 0x9926, 0xF05C, + 0x9927, 0xF05D, 0x9928, 0xF05E, 0x9929, 0xF05F, 0x992A, 0xF060, + 0x992B, 0xF061, 0x992C, 0xF062, 0x992D, 0xF063, 0x992E, 0xF7D1, + 0x992F, 0xF064, 0x9930, 0xF065, 0x9931, 0xF066, 0x9932, 0xF067, + 0x9933, 0xF068, 0x9934, 0xF069, 0x9935, 0xF06A, 0x9936, 0xF06B, + 0x9937, 0xF06C, 0x9938, 0xF06D, 0x9939, 0xF06E, 0x993A, 0xF06F, + 0x993B, 0xF070, 0x993C, 0xF071, 0x993D, 0xF072, 0x993E, 0xF073, + 0x993F, 0xF074, 0x9940, 0xF075, 0x9941, 0xF076, 0x9942, 0xF077, + 0x9943, 0xF078, 0x9944, 0xF079, 0x9945, 0xF07A, 0x9946, 0xF07B, + 0x9947, 0xF07C, 0x9948, 0xF07D, 0x9949, 0xF07E, 0x994A, 0xF080, + 0x994B, 0xF081, 0x994C, 0xF082, 0x994D, 0xF083, 0x994E, 0xF084, + 0x994F, 0xF085, 0x9950, 0xF086, 0x9951, 0xF087, 0x9952, 0xF088, + 0x9953, 0xF089, 0x9954, 0xF7D3, 0x9955, 0xF7D2, 0x9956, 0xF08A, + 0x9957, 0xF08B, 0x9958, 0xF08C, 0x9959, 0xF08D, 0x995A, 0xF08E, + 0x995B, 0xF08F, 0x995C, 0xF090, 0x995D, 0xF091, 0x995E, 0xF092, + 0x995F, 0xF093, 0x9960, 0xF094, 0x9961, 0xF095, 0x9962, 0xF096, + 0x9963, 0xE2BB, 0x9964, 0xF097, 0x9965, 0xBCA2, 0x9966, 0xF098, + 0x9967, 0xE2BC, 0x9968, 0xE2BD, 0x9969, 0xE2BE, 0x996A, 0xE2BF, + 0x996B, 0xE2C0, 0x996C, 0xE2C1, 0x996D, 0xB7B9, 0x996E, 0xD2FB, + 0x996F, 0xBDA4, 0x9970, 0xCACE, 0x9971, 0xB1A5, 0x9972, 0xCBC7, + 0x9973, 0xF099, 0x9974, 0xE2C2, 0x9975, 0xB6FC, 0x9976, 0xC8C4, + 0x9977, 0xE2C3, 0x9978, 0xF09A, 0x9979, 0xF09B, 0x997A, 0xBDC8, + 0x997B, 0xF09C, 0x997C, 0xB1FD, 0x997D, 0xE2C4, 0x997E, 0xF09D, + 0x997F, 0xB6F6, 0x9980, 0xE2C5, 0x9981, 0xC4D9, 0x9982, 0xF09E, + 0x9983, 0xF09F, 0x9984, 0xE2C6, 0x9985, 0xCFDA, 0x9986, 0xB9DD, + 0x9987, 0xE2C7, 0x9988, 0xC0A1, 0x9989, 0xF0A0, 0x998A, 0xE2C8, + 0x998B, 0xB2F6, 0x998C, 0xF140, 0x998D, 0xE2C9, 0x998E, 0xF141, + 0x998F, 0xC1F3, 0x9990, 0xE2CA, 0x9991, 0xE2CB, 0x9992, 0xC2F8, + 0x9993, 0xE2CC, 0x9994, 0xE2CD, 0x9995, 0xE2CE, 0x9996, 0xCAD7, + 0x9997, 0xD8B8, 0x9998, 0xD9E5, 0x9999, 0xCFE3, 0x999A, 0xF142, + 0x999B, 0xF143, 0x999C, 0xF144, 0x999D, 0xF145, 0x999E, 0xF146, + 0x999F, 0xF147, 0x99A0, 0xF148, 0x99A1, 0xF149, 0x99A2, 0xF14A, + 0x99A3, 0xF14B, 0x99A4, 0xF14C, 0x99A5, 0xF0A5, 0x99A6, 0xF14D, + 0x99A7, 0xF14E, 0x99A8, 0xDCB0, 0x99A9, 0xF14F, 0x99AA, 0xF150, + 0x99AB, 0xF151, 0x99AC, 0xF152, 0x99AD, 0xF153, 0x99AE, 0xF154, + 0x99AF, 0xF155, 0x99B0, 0xF156, 0x99B1, 0xF157, 0x99B2, 0xF158, + 0x99B3, 0xF159, 0x99B4, 0xF15A, 0x99B5, 0xF15B, 0x99B6, 0xF15C, + 0x99B7, 0xF15D, 0x99B8, 0xF15E, 0x99B9, 0xF15F, 0x99BA, 0xF160, + 0x99BB, 0xF161, 0x99BC, 0xF162, 0x99BD, 0xF163, 0x99BE, 0xF164, + 0x99BF, 0xF165, 0x99C0, 0xF166, 0x99C1, 0xF167, 0x99C2, 0xF168, + 0x99C3, 0xF169, 0x99C4, 0xF16A, 0x99C5, 0xF16B, 0x99C6, 0xF16C, + 0x99C7, 0xF16D, 0x99C8, 0xF16E, 0x99C9, 0xF16F, 0x99CA, 0xF170, + 0x99CB, 0xF171, 0x99CC, 0xF172, 0x99CD, 0xF173, 0x99CE, 0xF174, + 0x99CF, 0xF175, 0x99D0, 0xF176, 0x99D1, 0xF177, 0x99D2, 0xF178, + 0x99D3, 0xF179, 0x99D4, 0xF17A, 0x99D5, 0xF17B, 0x99D6, 0xF17C, + 0x99D7, 0xF17D, 0x99D8, 0xF17E, 0x99D9, 0xF180, 0x99DA, 0xF181, + 0x99DB, 0xF182, 0x99DC, 0xF183, 0x99DD, 0xF184, 0x99DE, 0xF185, + 0x99DF, 0xF186, 0x99E0, 0xF187, 0x99E1, 0xF188, 0x99E2, 0xF189, + 0x99E3, 0xF18A, 0x99E4, 0xF18B, 0x99E5, 0xF18C, 0x99E6, 0xF18D, + 0x99E7, 0xF18E, 0x99E8, 0xF18F, 0x99E9, 0xF190, 0x99EA, 0xF191, + 0x99EB, 0xF192, 0x99EC, 0xF193, 0x99ED, 0xF194, 0x99EE, 0xF195, + 0x99EF, 0xF196, 0x99F0, 0xF197, 0x99F1, 0xF198, 0x99F2, 0xF199, + 0x99F3, 0xF19A, 0x99F4, 0xF19B, 0x99F5, 0xF19C, 0x99F6, 0xF19D, + 0x99F7, 0xF19E, 0x99F8, 0xF19F, 0x99F9, 0xF1A0, 0x99FA, 0xF240, + 0x99FB, 0xF241, 0x99FC, 0xF242, 0x99FD, 0xF243, 0x99FE, 0xF244, + 0x99FF, 0xF245, 0x9A00, 0xF246, 0x9A01, 0xF247, 0x9A02, 0xF248, + 0x9A03, 0xF249, 0x9A04, 0xF24A, 0x9A05, 0xF24B, 0x9A06, 0xF24C, + 0x9A07, 0xF24D, 0x9A08, 0xF24E, 0x9A09, 0xF24F, 0x9A0A, 0xF250, + 0x9A0B, 0xF251, 0x9A0C, 0xF252, 0x9A0D, 0xF253, 0x9A0E, 0xF254, + 0x9A0F, 0xF255, 0x9A10, 0xF256, 0x9A11, 0xF257, 0x9A12, 0xF258, + 0x9A13, 0xF259, 0x9A14, 0xF25A, 0x9A15, 0xF25B, 0x9A16, 0xF25C, + 0x9A17, 0xF25D, 0x9A18, 0xF25E, 0x9A19, 0xF25F, 0x9A1A, 0xF260, + 0x9A1B, 0xF261, 0x9A1C, 0xF262, 0x9A1D, 0xF263, 0x9A1E, 0xF264, + 0x9A1F, 0xF265, 0x9A20, 0xF266, 0x9A21, 0xF267, 0x9A22, 0xF268, + 0x9A23, 0xF269, 0x9A24, 0xF26A, 0x9A25, 0xF26B, 0x9A26, 0xF26C, + 0x9A27, 0xF26D, 0x9A28, 0xF26E, 0x9A29, 0xF26F, 0x9A2A, 0xF270, + 0x9A2B, 0xF271, 0x9A2C, 0xF272, 0x9A2D, 0xF273, 0x9A2E, 0xF274, + 0x9A2F, 0xF275, 0x9A30, 0xF276, 0x9A31, 0xF277, 0x9A32, 0xF278, + 0x9A33, 0xF279, 0x9A34, 0xF27A, 0x9A35, 0xF27B, 0x9A36, 0xF27C, + 0x9A37, 0xF27D, 0x9A38, 0xF27E, 0x9A39, 0xF280, 0x9A3A, 0xF281, + 0x9A3B, 0xF282, 0x9A3C, 0xF283, 0x9A3D, 0xF284, 0x9A3E, 0xF285, + 0x9A3F, 0xF286, 0x9A40, 0xF287, 0x9A41, 0xF288, 0x9A42, 0xF289, + 0x9A43, 0xF28A, 0x9A44, 0xF28B, 0x9A45, 0xF28C, 0x9A46, 0xF28D, + 0x9A47, 0xF28E, 0x9A48, 0xF28F, 0x9A49, 0xF290, 0x9A4A, 0xF291, + 0x9A4B, 0xF292, 0x9A4C, 0xF293, 0x9A4D, 0xF294, 0x9A4E, 0xF295, + 0x9A4F, 0xF296, 0x9A50, 0xF297, 0x9A51, 0xF298, 0x9A52, 0xF299, + 0x9A53, 0xF29A, 0x9A54, 0xF29B, 0x9A55, 0xF29C, 0x9A56, 0xF29D, + 0x9A57, 0xF29E, 0x9A58, 0xF29F, 0x9A59, 0xF2A0, 0x9A5A, 0xF340, + 0x9A5B, 0xF341, 0x9A5C, 0xF342, 0x9A5D, 0xF343, 0x9A5E, 0xF344, + 0x9A5F, 0xF345, 0x9A60, 0xF346, 0x9A61, 0xF347, 0x9A62, 0xF348, + 0x9A63, 0xF349, 0x9A64, 0xF34A, 0x9A65, 0xF34B, 0x9A66, 0xF34C, + 0x9A67, 0xF34D, 0x9A68, 0xF34E, 0x9A69, 0xF34F, 0x9A6A, 0xF350, + 0x9A6B, 0xF351, 0x9A6C, 0xC2ED, 0x9A6D, 0xD4A6, 0x9A6E, 0xCDD4, + 0x9A6F, 0xD1B1, 0x9A70, 0xB3DB, 0x9A71, 0xC7FD, 0x9A72, 0xF352, + 0x9A73, 0xB2B5, 0x9A74, 0xC2BF, 0x9A75, 0xE6E0, 0x9A76, 0xCABB, + 0x9A77, 0xE6E1, 0x9A78, 0xE6E2, 0x9A79, 0xBED4, 0x9A7A, 0xE6E3, + 0x9A7B, 0xD7A4, 0x9A7C, 0xCDD5, 0x9A7D, 0xE6E5, 0x9A7E, 0xBCDD, + 0x9A7F, 0xE6E4, 0x9A80, 0xE6E6, 0x9A81, 0xE6E7, 0x9A82, 0xC2EE, + 0x9A83, 0xF353, 0x9A84, 0xBDBE, 0x9A85, 0xE6E8, 0x9A86, 0xC2E6, + 0x9A87, 0xBAA7, 0x9A88, 0xE6E9, 0x9A89, 0xF354, 0x9A8A, 0xE6EA, + 0x9A8B, 0xB3D2, 0x9A8C, 0xD1E9, 0x9A8D, 0xF355, 0x9A8E, 0xF356, + 0x9A8F, 0xBFA5, 0x9A90, 0xE6EB, 0x9A91, 0xC6EF, 0x9A92, 0xE6EC, + 0x9A93, 0xE6ED, 0x9A94, 0xF357, 0x9A95, 0xF358, 0x9A96, 0xE6EE, + 0x9A97, 0xC6AD, 0x9A98, 0xE6EF, 0x9A99, 0xF359, 0x9A9A, 0xC9A7, + 0x9A9B, 0xE6F0, 0x9A9C, 0xE6F1, 0x9A9D, 0xE6F2, 0x9A9E, 0xE5B9, + 0x9A9F, 0xE6F3, 0x9AA0, 0xE6F4, 0x9AA1, 0xC2E2, 0x9AA2, 0xE6F5, + 0x9AA3, 0xE6F6, 0x9AA4, 0xD6E8, 0x9AA5, 0xE6F7, 0x9AA6, 0xF35A, + 0x9AA7, 0xE6F8, 0x9AA8, 0xB9C7, 0x9AA9, 0xF35B, 0x9AAA, 0xF35C, + 0x9AAB, 0xF35D, 0x9AAC, 0xF35E, 0x9AAD, 0xF35F, 0x9AAE, 0xF360, + 0x9AAF, 0xF361, 0x9AB0, 0xF7BB, 0x9AB1, 0xF7BA, 0x9AB2, 0xF362, + 0x9AB3, 0xF363, 0x9AB4, 0xF364, 0x9AB5, 0xF365, 0x9AB6, 0xF7BE, + 0x9AB7, 0xF7BC, 0x9AB8, 0xBAA1, 0x9AB9, 0xF366, 0x9ABA, 0xF7BF, + 0x9ABB, 0xF367, 0x9ABC, 0xF7C0, 0x9ABD, 0xF368, 0x9ABE, 0xF369, + 0x9ABF, 0xF36A, 0x9AC0, 0xF7C2, 0x9AC1, 0xF7C1, 0x9AC2, 0xF7C4, + 0x9AC3, 0xF36B, 0x9AC4, 0xF36C, 0x9AC5, 0xF7C3, 0x9AC6, 0xF36D, + 0x9AC7, 0xF36E, 0x9AC8, 0xF36F, 0x9AC9, 0xF370, 0x9ACA, 0xF371, + 0x9ACB, 0xF7C5, 0x9ACC, 0xF7C6, 0x9ACD, 0xF372, 0x9ACE, 0xF373, + 0x9ACF, 0xF374, 0x9AD0, 0xF375, 0x9AD1, 0xF7C7, 0x9AD2, 0xF376, + 0x9AD3, 0xCBE8, 0x9AD4, 0xF377, 0x9AD5, 0xF378, 0x9AD6, 0xF379, + 0x9AD7, 0xF37A, 0x9AD8, 0xB8DF, 0x9AD9, 0xF37B, 0x9ADA, 0xF37C, + 0x9ADB, 0xF37D, 0x9ADC, 0xF37E, 0x9ADD, 0xF380, 0x9ADE, 0xF381, + 0x9ADF, 0xF7D4, 0x9AE0, 0xF382, 0x9AE1, 0xF7D5, 0x9AE2, 0xF383, + 0x9AE3, 0xF384, 0x9AE4, 0xF385, 0x9AE5, 0xF386, 0x9AE6, 0xF7D6, + 0x9AE7, 0xF387, 0x9AE8, 0xF388, 0x9AE9, 0xF389, 0x9AEA, 0xF38A, + 0x9AEB, 0xF7D8, 0x9AEC, 0xF38B, 0x9AED, 0xF7DA, 0x9AEE, 0xF38C, + 0x9AEF, 0xF7D7, 0x9AF0, 0xF38D, 0x9AF1, 0xF38E, 0x9AF2, 0xF38F, + 0x9AF3, 0xF390, 0x9AF4, 0xF391, 0x9AF5, 0xF392, 0x9AF6, 0xF393, + 0x9AF7, 0xF394, 0x9AF8, 0xF395, 0x9AF9, 0xF7DB, 0x9AFA, 0xF396, + 0x9AFB, 0xF7D9, 0x9AFC, 0xF397, 0x9AFD, 0xF398, 0x9AFE, 0xF399, + 0x9AFF, 0xF39A, 0x9B00, 0xF39B, 0x9B01, 0xF39C, 0x9B02, 0xF39D, + 0x9B03, 0xD7D7, 0x9B04, 0xF39E, 0x9B05, 0xF39F, 0x9B06, 0xF3A0, + 0x9B07, 0xF440, 0x9B08, 0xF7DC, 0x9B09, 0xF441, 0x9B0A, 0xF442, + 0x9B0B, 0xF443, 0x9B0C, 0xF444, 0x9B0D, 0xF445, 0x9B0E, 0xF446, + 0x9B0F, 0xF7DD, 0x9B10, 0xF447, 0x9B11, 0xF448, 0x9B12, 0xF449, + 0x9B13, 0xF7DE, 0x9B14, 0xF44A, 0x9B15, 0xF44B, 0x9B16, 0xF44C, + 0x9B17, 0xF44D, 0x9B18, 0xF44E, 0x9B19, 0xF44F, 0x9B1A, 0xF450, + 0x9B1B, 0xF451, 0x9B1C, 0xF452, 0x9B1D, 0xF453, 0x9B1E, 0xF454, + 0x9B1F, 0xF7DF, 0x9B20, 0xF455, 0x9B21, 0xF456, 0x9B22, 0xF457, + 0x9B23, 0xF7E0, 0x9B24, 0xF458, 0x9B25, 0xF459, 0x9B26, 0xF45A, + 0x9B27, 0xF45B, 0x9B28, 0xF45C, 0x9B29, 0xF45D, 0x9B2A, 0xF45E, + 0x9B2B, 0xF45F, 0x9B2C, 0xF460, 0x9B2D, 0xF461, 0x9B2E, 0xF462, + 0x9B2F, 0xDBCB, 0x9B30, 0xF463, 0x9B31, 0xF464, 0x9B32, 0xD8AA, + 0x9B33, 0xF465, 0x9B34, 0xF466, 0x9B35, 0xF467, 0x9B36, 0xF468, + 0x9B37, 0xF469, 0x9B38, 0xF46A, 0x9B39, 0xF46B, 0x9B3A, 0xF46C, + 0x9B3B, 0xE5F7, 0x9B3C, 0xB9ED, 0x9B3D, 0xF46D, 0x9B3E, 0xF46E, + 0x9B3F, 0xF46F, 0x9B40, 0xF470, 0x9B41, 0xBFFD, 0x9B42, 0xBBEA, + 0x9B43, 0xF7C9, 0x9B44, 0xC6C7, 0x9B45, 0xF7C8, 0x9B46, 0xF471, + 0x9B47, 0xF7CA, 0x9B48, 0xF7CC, 0x9B49, 0xF7CB, 0x9B4A, 0xF472, + 0x9B4B, 0xF473, 0x9B4C, 0xF474, 0x9B4D, 0xF7CD, 0x9B4E, 0xF475, + 0x9B4F, 0xCEBA, 0x9B50, 0xF476, 0x9B51, 0xF7CE, 0x9B52, 0xF477, + 0x9B53, 0xF478, 0x9B54, 0xC4A7, 0x9B55, 0xF479, 0x9B56, 0xF47A, + 0x9B57, 0xF47B, 0x9B58, 0xF47C, 0x9B59, 0xF47D, 0x9B5A, 0xF47E, + 0x9B5B, 0xF480, 0x9B5C, 0xF481, 0x9B5D, 0xF482, 0x9B5E, 0xF483, + 0x9B5F, 0xF484, 0x9B60, 0xF485, 0x9B61, 0xF486, 0x9B62, 0xF487, + 0x9B63, 0xF488, 0x9B64, 0xF489, 0x9B65, 0xF48A, 0x9B66, 0xF48B, + 0x9B67, 0xF48C, 0x9B68, 0xF48D, 0x9B69, 0xF48E, 0x9B6A, 0xF48F, + 0x9B6B, 0xF490, 0x9B6C, 0xF491, 0x9B6D, 0xF492, 0x9B6E, 0xF493, + 0x9B6F, 0xF494, 0x9B70, 0xF495, 0x9B71, 0xF496, 0x9B72, 0xF497, + 0x9B73, 0xF498, 0x9B74, 0xF499, 0x9B75, 0xF49A, 0x9B76, 0xF49B, + 0x9B77, 0xF49C, 0x9B78, 0xF49D, 0x9B79, 0xF49E, 0x9B7A, 0xF49F, + 0x9B7B, 0xF4A0, 0x9B7C, 0xF540, 0x9B7D, 0xF541, 0x9B7E, 0xF542, + 0x9B7F, 0xF543, 0x9B80, 0xF544, 0x9B81, 0xF545, 0x9B82, 0xF546, + 0x9B83, 0xF547, 0x9B84, 0xF548, 0x9B85, 0xF549, 0x9B86, 0xF54A, + 0x9B87, 0xF54B, 0x9B88, 0xF54C, 0x9B89, 0xF54D, 0x9B8A, 0xF54E, + 0x9B8B, 0xF54F, 0x9B8C, 0xF550, 0x9B8D, 0xF551, 0x9B8E, 0xF552, + 0x9B8F, 0xF553, 0x9B90, 0xF554, 0x9B91, 0xF555, 0x9B92, 0xF556, + 0x9B93, 0xF557, 0x9B94, 0xF558, 0x9B95, 0xF559, 0x9B96, 0xF55A, + 0x9B97, 0xF55B, 0x9B98, 0xF55C, 0x9B99, 0xF55D, 0x9B9A, 0xF55E, + 0x9B9B, 0xF55F, 0x9B9C, 0xF560, 0x9B9D, 0xF561, 0x9B9E, 0xF562, + 0x9B9F, 0xF563, 0x9BA0, 0xF564, 0x9BA1, 0xF565, 0x9BA2, 0xF566, + 0x9BA3, 0xF567, 0x9BA4, 0xF568, 0x9BA5, 0xF569, 0x9BA6, 0xF56A, + 0x9BA7, 0xF56B, 0x9BA8, 0xF56C, 0x9BA9, 0xF56D, 0x9BAA, 0xF56E, + 0x9BAB, 0xF56F, 0x9BAC, 0xF570, 0x9BAD, 0xF571, 0x9BAE, 0xF572, + 0x9BAF, 0xF573, 0x9BB0, 0xF574, 0x9BB1, 0xF575, 0x9BB2, 0xF576, + 0x9BB3, 0xF577, 0x9BB4, 0xF578, 0x9BB5, 0xF579, 0x9BB6, 0xF57A, + 0x9BB7, 0xF57B, 0x9BB8, 0xF57C, 0x9BB9, 0xF57D, 0x9BBA, 0xF57E, + 0x9BBB, 0xF580, 0x9BBC, 0xF581, 0x9BBD, 0xF582, 0x9BBE, 0xF583, + 0x9BBF, 0xF584, 0x9BC0, 0xF585, 0x9BC1, 0xF586, 0x9BC2, 0xF587, + 0x9BC3, 0xF588, 0x9BC4, 0xF589, 0x9BC5, 0xF58A, 0x9BC6, 0xF58B, + 0x9BC7, 0xF58C, 0x9BC8, 0xF58D, 0x9BC9, 0xF58E, 0x9BCA, 0xF58F, + 0x9BCB, 0xF590, 0x9BCC, 0xF591, 0x9BCD, 0xF592, 0x9BCE, 0xF593, + 0x9BCF, 0xF594, 0x9BD0, 0xF595, 0x9BD1, 0xF596, 0x9BD2, 0xF597, + 0x9BD3, 0xF598, 0x9BD4, 0xF599, 0x9BD5, 0xF59A, 0x9BD6, 0xF59B, + 0x9BD7, 0xF59C, 0x9BD8, 0xF59D, 0x9BD9, 0xF59E, 0x9BDA, 0xF59F, + 0x9BDB, 0xF5A0, 0x9BDC, 0xF640, 0x9BDD, 0xF641, 0x9BDE, 0xF642, + 0x9BDF, 0xF643, 0x9BE0, 0xF644, 0x9BE1, 0xF645, 0x9BE2, 0xF646, + 0x9BE3, 0xF647, 0x9BE4, 0xF648, 0x9BE5, 0xF649, 0x9BE6, 0xF64A, + 0x9BE7, 0xF64B, 0x9BE8, 0xF64C, 0x9BE9, 0xF64D, 0x9BEA, 0xF64E, + 0x9BEB, 0xF64F, 0x9BEC, 0xF650, 0x9BED, 0xF651, 0x9BEE, 0xF652, + 0x9BEF, 0xF653, 0x9BF0, 0xF654, 0x9BF1, 0xF655, 0x9BF2, 0xF656, + 0x9BF3, 0xF657, 0x9BF4, 0xF658, 0x9BF5, 0xF659, 0x9BF6, 0xF65A, + 0x9BF7, 0xF65B, 0x9BF8, 0xF65C, 0x9BF9, 0xF65D, 0x9BFA, 0xF65E, + 0x9BFB, 0xF65F, 0x9BFC, 0xF660, 0x9BFD, 0xF661, 0x9BFE, 0xF662, + 0x9BFF, 0xF663, 0x9C00, 0xF664, 0x9C01, 0xF665, 0x9C02, 0xF666, + 0x9C03, 0xF667, 0x9C04, 0xF668, 0x9C05, 0xF669, 0x9C06, 0xF66A, + 0x9C07, 0xF66B, 0x9C08, 0xF66C, 0x9C09, 0xF66D, 0x9C0A, 0xF66E, + 0x9C0B, 0xF66F, 0x9C0C, 0xF670, 0x9C0D, 0xF671, 0x9C0E, 0xF672, + 0x9C0F, 0xF673, 0x9C10, 0xF674, 0x9C11, 0xF675, 0x9C12, 0xF676, + 0x9C13, 0xF677, 0x9C14, 0xF678, 0x9C15, 0xF679, 0x9C16, 0xF67A, + 0x9C17, 0xF67B, 0x9C18, 0xF67C, 0x9C19, 0xF67D, 0x9C1A, 0xF67E, + 0x9C1B, 0xF680, 0x9C1C, 0xF681, 0x9C1D, 0xF682, 0x9C1E, 0xF683, + 0x9C1F, 0xF684, 0x9C20, 0xF685, 0x9C21, 0xF686, 0x9C22, 0xF687, + 0x9C23, 0xF688, 0x9C24, 0xF689, 0x9C25, 0xF68A, 0x9C26, 0xF68B, + 0x9C27, 0xF68C, 0x9C28, 0xF68D, 0x9C29, 0xF68E, 0x9C2A, 0xF68F, + 0x9C2B, 0xF690, 0x9C2C, 0xF691, 0x9C2D, 0xF692, 0x9C2E, 0xF693, + 0x9C2F, 0xF694, 0x9C30, 0xF695, 0x9C31, 0xF696, 0x9C32, 0xF697, + 0x9C33, 0xF698, 0x9C34, 0xF699, 0x9C35, 0xF69A, 0x9C36, 0xF69B, + 0x9C37, 0xF69C, 0x9C38, 0xF69D, 0x9C39, 0xF69E, 0x9C3A, 0xF69F, + 0x9C3B, 0xF6A0, 0x9C3C, 0xF740, 0x9C3D, 0xF741, 0x9C3E, 0xF742, + 0x9C3F, 0xF743, 0x9C40, 0xF744, 0x9C41, 0xF745, 0x9C42, 0xF746, + 0x9C43, 0xF747, 0x9C44, 0xF748, 0x9C45, 0xF749, 0x9C46, 0xF74A, + 0x9C47, 0xF74B, 0x9C48, 0xF74C, 0x9C49, 0xF74D, 0x9C4A, 0xF74E, + 0x9C4B, 0xF74F, 0x9C4C, 0xF750, 0x9C4D, 0xF751, 0x9C4E, 0xF752, + 0x9C4F, 0xF753, 0x9C50, 0xF754, 0x9C51, 0xF755, 0x9C52, 0xF756, + 0x9C53, 0xF757, 0x9C54, 0xF758, 0x9C55, 0xF759, 0x9C56, 0xF75A, + 0x9C57, 0xF75B, 0x9C58, 0xF75C, 0x9C59, 0xF75D, 0x9C5A, 0xF75E, + 0x9C5B, 0xF75F, 0x9C5C, 0xF760, 0x9C5D, 0xF761, 0x9C5E, 0xF762, + 0x9C5F, 0xF763, 0x9C60, 0xF764, 0x9C61, 0xF765, 0x9C62, 0xF766, + 0x9C63, 0xF767, 0x9C64, 0xF768, 0x9C65, 0xF769, 0x9C66, 0xF76A, + 0x9C67, 0xF76B, 0x9C68, 0xF76C, 0x9C69, 0xF76D, 0x9C6A, 0xF76E, + 0x9C6B, 0xF76F, 0x9C6C, 0xF770, 0x9C6D, 0xF771, 0x9C6E, 0xF772, + 0x9C6F, 0xF773, 0x9C70, 0xF774, 0x9C71, 0xF775, 0x9C72, 0xF776, + 0x9C73, 0xF777, 0x9C74, 0xF778, 0x9C75, 0xF779, 0x9C76, 0xF77A, + 0x9C77, 0xF77B, 0x9C78, 0xF77C, 0x9C79, 0xF77D, 0x9C7A, 0xF77E, + 0x9C7B, 0xF780, 0x9C7C, 0xD3E3, 0x9C7D, 0xF781, 0x9C7E, 0xF782, + 0x9C7F, 0xF6CF, 0x9C80, 0xF783, 0x9C81, 0xC2B3, 0x9C82, 0xF6D0, + 0x9C83, 0xF784, 0x9C84, 0xF785, 0x9C85, 0xF6D1, 0x9C86, 0xF6D2, + 0x9C87, 0xF6D3, 0x9C88, 0xF6D4, 0x9C89, 0xF786, 0x9C8A, 0xF787, + 0x9C8B, 0xF6D6, 0x9C8C, 0xF788, 0x9C8D, 0xB1AB, 0x9C8E, 0xF6D7, + 0x9C8F, 0xF789, 0x9C90, 0xF6D8, 0x9C91, 0xF6D9, 0x9C92, 0xF6DA, + 0x9C93, 0xF78A, 0x9C94, 0xF6DB, 0x9C95, 0xF6DC, 0x9C96, 0xF78B, + 0x9C97, 0xF78C, 0x9C98, 0xF78D, 0x9C99, 0xF78E, 0x9C9A, 0xF6DD, + 0x9C9B, 0xF6DE, 0x9C9C, 0xCFCA, 0x9C9D, 0xF78F, 0x9C9E, 0xF6DF, + 0x9C9F, 0xF6E0, 0x9CA0, 0xF6E1, 0x9CA1, 0xF6E2, 0x9CA2, 0xF6E3, + 0x9CA3, 0xF6E4, 0x9CA4, 0xC0F0, 0x9CA5, 0xF6E5, 0x9CA6, 0xF6E6, + 0x9CA7, 0xF6E7, 0x9CA8, 0xF6E8, 0x9CA9, 0xF6E9, 0x9CAA, 0xF790, + 0x9CAB, 0xF6EA, 0x9CAC, 0xF791, 0x9CAD, 0xF6EB, 0x9CAE, 0xF6EC, + 0x9CAF, 0xF792, 0x9CB0, 0xF6ED, 0x9CB1, 0xF6EE, 0x9CB2, 0xF6EF, + 0x9CB3, 0xF6F0, 0x9CB4, 0xF6F1, 0x9CB5, 0xF6F2, 0x9CB6, 0xF6F3, + 0x9CB7, 0xF6F4, 0x9CB8, 0xBEA8, 0x9CB9, 0xF793, 0x9CBA, 0xF6F5, + 0x9CBB, 0xF6F6, 0x9CBC, 0xF6F7, 0x9CBD, 0xF6F8, 0x9CBE, 0xF794, + 0x9CBF, 0xF795, 0x9CC0, 0xF796, 0x9CC1, 0xF797, 0x9CC2, 0xF798, + 0x9CC3, 0xC8FA, 0x9CC4, 0xF6F9, 0x9CC5, 0xF6FA, 0x9CC6, 0xF6FB, + 0x9CC7, 0xF6FC, 0x9CC8, 0xF799, 0x9CC9, 0xF79A, 0x9CCA, 0xF6FD, + 0x9CCB, 0xF6FE, 0x9CCC, 0xF7A1, 0x9CCD, 0xF7A2, 0x9CCE, 0xF7A3, + 0x9CCF, 0xF7A4, 0x9CD0, 0xF7A5, 0x9CD1, 0xF79B, 0x9CD2, 0xF79C, + 0x9CD3, 0xF7A6, 0x9CD4, 0xF7A7, 0x9CD5, 0xF7A8, 0x9CD6, 0xB1EE, + 0x9CD7, 0xF7A9, 0x9CD8, 0xF7AA, 0x9CD9, 0xF7AB, 0x9CDA, 0xF79D, + 0x9CDB, 0xF79E, 0x9CDC, 0xF7AC, 0x9CDD, 0xF7AD, 0x9CDE, 0xC1DB, + 0x9CDF, 0xF7AE, 0x9CE0, 0xF79F, 0x9CE1, 0xF7A0, 0x9CE2, 0xF7AF, + 0x9CE3, 0xF840, 0x9CE4, 0xF841, 0x9CE5, 0xF842, 0x9CE6, 0xF843, + 0x9CE7, 0xF844, 0x9CE8, 0xF845, 0x9CE9, 0xF846, 0x9CEA, 0xF847, + 0x9CEB, 0xF848, 0x9CEC, 0xF849, 0x9CED, 0xF84A, 0x9CEE, 0xF84B, + 0x9CEF, 0xF84C, 0x9CF0, 0xF84D, 0x9CF1, 0xF84E, 0x9CF2, 0xF84F, + 0x9CF3, 0xF850, 0x9CF4, 0xF851, 0x9CF5, 0xF852, 0x9CF6, 0xF853, + 0x9CF7, 0xF854, 0x9CF8, 0xF855, 0x9CF9, 0xF856, 0x9CFA, 0xF857, + 0x9CFB, 0xF858, 0x9CFC, 0xF859, 0x9CFD, 0xF85A, 0x9CFE, 0xF85B, + 0x9CFF, 0xF85C, 0x9D00, 0xF85D, 0x9D01, 0xF85E, 0x9D02, 0xF85F, + 0x9D03, 0xF860, 0x9D04, 0xF861, 0x9D05, 0xF862, 0x9D06, 0xF863, + 0x9D07, 0xF864, 0x9D08, 0xF865, 0x9D09, 0xF866, 0x9D0A, 0xF867, + 0x9D0B, 0xF868, 0x9D0C, 0xF869, 0x9D0D, 0xF86A, 0x9D0E, 0xF86B, + 0x9D0F, 0xF86C, 0x9D10, 0xF86D, 0x9D11, 0xF86E, 0x9D12, 0xF86F, + 0x9D13, 0xF870, 0x9D14, 0xF871, 0x9D15, 0xF872, 0x9D16, 0xF873, + 0x9D17, 0xF874, 0x9D18, 0xF875, 0x9D19, 0xF876, 0x9D1A, 0xF877, + 0x9D1B, 0xF878, 0x9D1C, 0xF879, 0x9D1D, 0xF87A, 0x9D1E, 0xF87B, + 0x9D1F, 0xF87C, 0x9D20, 0xF87D, 0x9D21, 0xF87E, 0x9D22, 0xF880, + 0x9D23, 0xF881, 0x9D24, 0xF882, 0x9D25, 0xF883, 0x9D26, 0xF884, + 0x9D27, 0xF885, 0x9D28, 0xF886, 0x9D29, 0xF887, 0x9D2A, 0xF888, + 0x9D2B, 0xF889, 0x9D2C, 0xF88A, 0x9D2D, 0xF88B, 0x9D2E, 0xF88C, + 0x9D2F, 0xF88D, 0x9D30, 0xF88E, 0x9D31, 0xF88F, 0x9D32, 0xF890, + 0x9D33, 0xF891, 0x9D34, 0xF892, 0x9D35, 0xF893, 0x9D36, 0xF894, + 0x9D37, 0xF895, 0x9D38, 0xF896, 0x9D39, 0xF897, 0x9D3A, 0xF898, + 0x9D3B, 0xF899, 0x9D3C, 0xF89A, 0x9D3D, 0xF89B, 0x9D3E, 0xF89C, + 0x9D3F, 0xF89D, 0x9D40, 0xF89E, 0x9D41, 0xF89F, 0x9D42, 0xF8A0, + 0x9D43, 0xF940, 0x9D44, 0xF941, 0x9D45, 0xF942, 0x9D46, 0xF943, + 0x9D47, 0xF944, 0x9D48, 0xF945, 0x9D49, 0xF946, 0x9D4A, 0xF947, + 0x9D4B, 0xF948, 0x9D4C, 0xF949, 0x9D4D, 0xF94A, 0x9D4E, 0xF94B, + 0x9D4F, 0xF94C, 0x9D50, 0xF94D, 0x9D51, 0xF94E, 0x9D52, 0xF94F, + 0x9D53, 0xF950, 0x9D54, 0xF951, 0x9D55, 0xF952, 0x9D56, 0xF953, + 0x9D57, 0xF954, 0x9D58, 0xF955, 0x9D59, 0xF956, 0x9D5A, 0xF957, + 0x9D5B, 0xF958, 0x9D5C, 0xF959, 0x9D5D, 0xF95A, 0x9D5E, 0xF95B, + 0x9D5F, 0xF95C, 0x9D60, 0xF95D, 0x9D61, 0xF95E, 0x9D62, 0xF95F, + 0x9D63, 0xF960, 0x9D64, 0xF961, 0x9D65, 0xF962, 0x9D66, 0xF963, + 0x9D67, 0xF964, 0x9D68, 0xF965, 0x9D69, 0xF966, 0x9D6A, 0xF967, + 0x9D6B, 0xF968, 0x9D6C, 0xF969, 0x9D6D, 0xF96A, 0x9D6E, 0xF96B, + 0x9D6F, 0xF96C, 0x9D70, 0xF96D, 0x9D71, 0xF96E, 0x9D72, 0xF96F, + 0x9D73, 0xF970, 0x9D74, 0xF971, 0x9D75, 0xF972, 0x9D76, 0xF973, + 0x9D77, 0xF974, 0x9D78, 0xF975, 0x9D79, 0xF976, 0x9D7A, 0xF977, + 0x9D7B, 0xF978, 0x9D7C, 0xF979, 0x9D7D, 0xF97A, 0x9D7E, 0xF97B, + 0x9D7F, 0xF97C, 0x9D80, 0xF97D, 0x9D81, 0xF97E, 0x9D82, 0xF980, + 0x9D83, 0xF981, 0x9D84, 0xF982, 0x9D85, 0xF983, 0x9D86, 0xF984, + 0x9D87, 0xF985, 0x9D88, 0xF986, 0x9D89, 0xF987, 0x9D8A, 0xF988, + 0x9D8B, 0xF989, 0x9D8C, 0xF98A, 0x9D8D, 0xF98B, 0x9D8E, 0xF98C, + 0x9D8F, 0xF98D, 0x9D90, 0xF98E, 0x9D91, 0xF98F, 0x9D92, 0xF990, + 0x9D93, 0xF991, 0x9D94, 0xF992, 0x9D95, 0xF993, 0x9D96, 0xF994, + 0x9D97, 0xF995, 0x9D98, 0xF996, 0x9D99, 0xF997, 0x9D9A, 0xF998, + 0x9D9B, 0xF999, 0x9D9C, 0xF99A, 0x9D9D, 0xF99B, 0x9D9E, 0xF99C, + 0x9D9F, 0xF99D, 0x9DA0, 0xF99E, 0x9DA1, 0xF99F, 0x9DA2, 0xF9A0, + 0x9DA3, 0xFA40, 0x9DA4, 0xFA41, 0x9DA5, 0xFA42, 0x9DA6, 0xFA43, + 0x9DA7, 0xFA44, 0x9DA8, 0xFA45, 0x9DA9, 0xFA46, 0x9DAA, 0xFA47, + 0x9DAB, 0xFA48, 0x9DAC, 0xFA49, 0x9DAD, 0xFA4A, 0x9DAE, 0xFA4B, + 0x9DAF, 0xFA4C, 0x9DB0, 0xFA4D, 0x9DB1, 0xFA4E, 0x9DB2, 0xFA4F, + 0x9DB3, 0xFA50, 0x9DB4, 0xFA51, 0x9DB5, 0xFA52, 0x9DB6, 0xFA53, + 0x9DB7, 0xFA54, 0x9DB8, 0xFA55, 0x9DB9, 0xFA56, 0x9DBA, 0xFA57, + 0x9DBB, 0xFA58, 0x9DBC, 0xFA59, 0x9DBD, 0xFA5A, 0x9DBE, 0xFA5B, + 0x9DBF, 0xFA5C, 0x9DC0, 0xFA5D, 0x9DC1, 0xFA5E, 0x9DC2, 0xFA5F, + 0x9DC3, 0xFA60, 0x9DC4, 0xFA61, 0x9DC5, 0xFA62, 0x9DC6, 0xFA63, + 0x9DC7, 0xFA64, 0x9DC8, 0xFA65, 0x9DC9, 0xFA66, 0x9DCA, 0xFA67, + 0x9DCB, 0xFA68, 0x9DCC, 0xFA69, 0x9DCD, 0xFA6A, 0x9DCE, 0xFA6B, + 0x9DCF, 0xFA6C, 0x9DD0, 0xFA6D, 0x9DD1, 0xFA6E, 0x9DD2, 0xFA6F, + 0x9DD3, 0xFA70, 0x9DD4, 0xFA71, 0x9DD5, 0xFA72, 0x9DD6, 0xFA73, + 0x9DD7, 0xFA74, 0x9DD8, 0xFA75, 0x9DD9, 0xFA76, 0x9DDA, 0xFA77, + 0x9DDB, 0xFA78, 0x9DDC, 0xFA79, 0x9DDD, 0xFA7A, 0x9DDE, 0xFA7B, + 0x9DDF, 0xFA7C, 0x9DE0, 0xFA7D, 0x9DE1, 0xFA7E, 0x9DE2, 0xFA80, + 0x9DE3, 0xFA81, 0x9DE4, 0xFA82, 0x9DE5, 0xFA83, 0x9DE6, 0xFA84, + 0x9DE7, 0xFA85, 0x9DE8, 0xFA86, 0x9DE9, 0xFA87, 0x9DEA, 0xFA88, + 0x9DEB, 0xFA89, 0x9DEC, 0xFA8A, 0x9DED, 0xFA8B, 0x9DEE, 0xFA8C, + 0x9DEF, 0xFA8D, 0x9DF0, 0xFA8E, 0x9DF1, 0xFA8F, 0x9DF2, 0xFA90, + 0x9DF3, 0xFA91, 0x9DF4, 0xFA92, 0x9DF5, 0xFA93, 0x9DF6, 0xFA94, + 0x9DF7, 0xFA95, 0x9DF8, 0xFA96, 0x9DF9, 0xFA97, 0x9DFA, 0xFA98, + 0x9DFB, 0xFA99, 0x9DFC, 0xFA9A, 0x9DFD, 0xFA9B, 0x9DFE, 0xFA9C, + 0x9DFF, 0xFA9D, 0x9E00, 0xFA9E, 0x9E01, 0xFA9F, 0x9E02, 0xFAA0, + 0x9E03, 0xFB40, 0x9E04, 0xFB41, 0x9E05, 0xFB42, 0x9E06, 0xFB43, + 0x9E07, 0xFB44, 0x9E08, 0xFB45, 0x9E09, 0xFB46, 0x9E0A, 0xFB47, + 0x9E0B, 0xFB48, 0x9E0C, 0xFB49, 0x9E0D, 0xFB4A, 0x9E0E, 0xFB4B, + 0x9E0F, 0xFB4C, 0x9E10, 0xFB4D, 0x9E11, 0xFB4E, 0x9E12, 0xFB4F, + 0x9E13, 0xFB50, 0x9E14, 0xFB51, 0x9E15, 0xFB52, 0x9E16, 0xFB53, + 0x9E17, 0xFB54, 0x9E18, 0xFB55, 0x9E19, 0xFB56, 0x9E1A, 0xFB57, + 0x9E1B, 0xFB58, 0x9E1C, 0xFB59, 0x9E1D, 0xFB5A, 0x9E1E, 0xFB5B, + 0x9E1F, 0xC4F1, 0x9E20, 0xF0AF, 0x9E21, 0xBCA6, 0x9E22, 0xF0B0, + 0x9E23, 0xC3F9, 0x9E24, 0xFB5C, 0x9E25, 0xC5B8, 0x9E26, 0xD1BB, + 0x9E27, 0xFB5D, 0x9E28, 0xF0B1, 0x9E29, 0xF0B2, 0x9E2A, 0xF0B3, + 0x9E2B, 0xF0B4, 0x9E2C, 0xF0B5, 0x9E2D, 0xD1BC, 0x9E2E, 0xFB5E, + 0x9E2F, 0xD1EC, 0x9E30, 0xFB5F, 0x9E31, 0xF0B7, 0x9E32, 0xF0B6, + 0x9E33, 0xD4A7, 0x9E34, 0xFB60, 0x9E35, 0xCDD2, 0x9E36, 0xF0B8, + 0x9E37, 0xF0BA, 0x9E38, 0xF0B9, 0x9E39, 0xF0BB, 0x9E3A, 0xF0BC, + 0x9E3B, 0xFB61, 0x9E3C, 0xFB62, 0x9E3D, 0xB8EB, 0x9E3E, 0xF0BD, + 0x9E3F, 0xBAE8, 0x9E40, 0xFB63, 0x9E41, 0xF0BE, 0x9E42, 0xF0BF, + 0x9E43, 0xBEE9, 0x9E44, 0xF0C0, 0x9E45, 0xB6EC, 0x9E46, 0xF0C1, + 0x9E47, 0xF0C2, 0x9E48, 0xF0C3, 0x9E49, 0xF0C4, 0x9E4A, 0xC8B5, + 0x9E4B, 0xF0C5, 0x9E4C, 0xF0C6, 0x9E4D, 0xFB64, 0x9E4E, 0xF0C7, + 0x9E4F, 0xC5F4, 0x9E50, 0xFB65, 0x9E51, 0xF0C8, 0x9E52, 0xFB66, + 0x9E53, 0xFB67, 0x9E54, 0xFB68, 0x9E55, 0xF0C9, 0x9E56, 0xFB69, + 0x9E57, 0xF0CA, 0x9E58, 0xF7BD, 0x9E59, 0xFB6A, 0x9E5A, 0xF0CB, + 0x9E5B, 0xF0CC, 0x9E5C, 0xF0CD, 0x9E5D, 0xFB6B, 0x9E5E, 0xF0CE, + 0x9E5F, 0xFB6C, 0x9E60, 0xFB6D, 0x9E61, 0xFB6E, 0x9E62, 0xFB6F, + 0x9E63, 0xF0CF, 0x9E64, 0xBAD7, 0x9E65, 0xFB70, 0x9E66, 0xF0D0, + 0x9E67, 0xF0D1, 0x9E68, 0xF0D2, 0x9E69, 0xF0D3, 0x9E6A, 0xF0D4, + 0x9E6B, 0xF0D5, 0x9E6C, 0xF0D6, 0x9E6D, 0xF0D8, 0x9E6E, 0xFB71, + 0x9E6F, 0xFB72, 0x9E70, 0xD3A5, 0x9E71, 0xF0D7, 0x9E72, 0xFB73, + 0x9E73, 0xF0D9, 0x9E74, 0xFB74, 0x9E75, 0xFB75, 0x9E76, 0xFB76, + 0x9E77, 0xFB77, 0x9E78, 0xFB78, 0x9E79, 0xFB79, 0x9E7A, 0xFB7A, + 0x9E7B, 0xFB7B, 0x9E7C, 0xFB7C, 0x9E7D, 0xFB7D, 0x9E7E, 0xF5BA, + 0x9E7F, 0xC2B9, 0x9E80, 0xFB7E, 0x9E81, 0xFB80, 0x9E82, 0xF7E4, + 0x9E83, 0xFB81, 0x9E84, 0xFB82, 0x9E85, 0xFB83, 0x9E86, 0xFB84, + 0x9E87, 0xF7E5, 0x9E88, 0xF7E6, 0x9E89, 0xFB85, 0x9E8A, 0xFB86, + 0x9E8B, 0xF7E7, 0x9E8C, 0xFB87, 0x9E8D, 0xFB88, 0x9E8E, 0xFB89, + 0x9E8F, 0xFB8A, 0x9E90, 0xFB8B, 0x9E91, 0xFB8C, 0x9E92, 0xF7E8, + 0x9E93, 0xC2B4, 0x9E94, 0xFB8D, 0x9E95, 0xFB8E, 0x9E96, 0xFB8F, + 0x9E97, 0xFB90, 0x9E98, 0xFB91, 0x9E99, 0xFB92, 0x9E9A, 0xFB93, + 0x9E9B, 0xFB94, 0x9E9C, 0xFB95, 0x9E9D, 0xF7EA, 0x9E9E, 0xFB96, + 0x9E9F, 0xF7EB, 0x9EA0, 0xFB97, 0x9EA1, 0xFB98, 0x9EA2, 0xFB99, + 0x9EA3, 0xFB9A, 0x9EA4, 0xFB9B, 0x9EA5, 0xFB9C, 0x9EA6, 0xC2F3, + 0x9EA7, 0xFB9D, 0x9EA8, 0xFB9E, 0x9EA9, 0xFB9F, 0x9EAA, 0xFBA0, + 0x9EAB, 0xFC40, 0x9EAC, 0xFC41, 0x9EAD, 0xFC42, 0x9EAE, 0xFC43, + 0x9EAF, 0xFC44, 0x9EB0, 0xFC45, 0x9EB1, 0xFC46, 0x9EB2, 0xFC47, + 0x9EB3, 0xFC48, 0x9EB4, 0xF4F0, 0x9EB5, 0xFC49, 0x9EB6, 0xFC4A, + 0x9EB7, 0xFC4B, 0x9EB8, 0xF4EF, 0x9EB9, 0xFC4C, 0x9EBA, 0xFC4D, + 0x9EBB, 0xC2E9, 0x9EBC, 0xFC4E, 0x9EBD, 0xF7E1, 0x9EBE, 0xF7E2, + 0x9EBF, 0xFC4F, 0x9EC0, 0xFC50, 0x9EC1, 0xFC51, 0x9EC2, 0xFC52, + 0x9EC3, 0xFC53, 0x9EC4, 0xBBC6, 0x9EC5, 0xFC54, 0x9EC6, 0xFC55, + 0x9EC7, 0xFC56, 0x9EC8, 0xFC57, 0x9EC9, 0xD9E4, 0x9ECA, 0xFC58, + 0x9ECB, 0xFC59, 0x9ECC, 0xFC5A, 0x9ECD, 0xCAF2, 0x9ECE, 0xC0E8, + 0x9ECF, 0xF0A4, 0x9ED0, 0xFC5B, 0x9ED1, 0xBADA, 0x9ED2, 0xFC5C, + 0x9ED3, 0xFC5D, 0x9ED4, 0xC7AD, 0x9ED5, 0xFC5E, 0x9ED6, 0xFC5F, + 0x9ED7, 0xFC60, 0x9ED8, 0xC4AC, 0x9ED9, 0xFC61, 0x9EDA, 0xFC62, + 0x9EDB, 0xF7EC, 0x9EDC, 0xF7ED, 0x9EDD, 0xF7EE, 0x9EDE, 0xFC63, + 0x9EDF, 0xF7F0, 0x9EE0, 0xF7EF, 0x9EE1, 0xFC64, 0x9EE2, 0xF7F1, + 0x9EE3, 0xFC65, 0x9EE4, 0xFC66, 0x9EE5, 0xF7F4, 0x9EE6, 0xFC67, + 0x9EE7, 0xF7F3, 0x9EE8, 0xFC68, 0x9EE9, 0xF7F2, 0x9EEA, 0xF7F5, + 0x9EEB, 0xFC69, 0x9EEC, 0xFC6A, 0x9EED, 0xFC6B, 0x9EEE, 0xFC6C, + 0x9EEF, 0xF7F6, 0x9EF0, 0xFC6D, 0x9EF1, 0xFC6E, 0x9EF2, 0xFC6F, + 0x9EF3, 0xFC70, 0x9EF4, 0xFC71, 0x9EF5, 0xFC72, 0x9EF6, 0xFC73, + 0x9EF7, 0xFC74, 0x9EF8, 0xFC75, 0x9EF9, 0xEDE9, 0x9EFA, 0xFC76, + 0x9EFB, 0xEDEA, 0x9EFC, 0xEDEB, 0x9EFD, 0xFC77, 0x9EFE, 0xF6BC, + 0x9EFF, 0xFC78, 0x9F00, 0xFC79, 0x9F01, 0xFC7A, 0x9F02, 0xFC7B, + 0x9F03, 0xFC7C, 0x9F04, 0xFC7D, 0x9F05, 0xFC7E, 0x9F06, 0xFC80, + 0x9F07, 0xFC81, 0x9F08, 0xFC82, 0x9F09, 0xFC83, 0x9F0A, 0xFC84, + 0x9F0B, 0xF6BD, 0x9F0C, 0xFC85, 0x9F0D, 0xF6BE, 0x9F0E, 0xB6A6, + 0x9F0F, 0xFC86, 0x9F10, 0xD8BE, 0x9F11, 0xFC87, 0x9F12, 0xFC88, + 0x9F13, 0xB9C4, 0x9F14, 0xFC89, 0x9F15, 0xFC8A, 0x9F16, 0xFC8B, + 0x9F17, 0xD8BB, 0x9F18, 0xFC8C, 0x9F19, 0xDCB1, 0x9F1A, 0xFC8D, + 0x9F1B, 0xFC8E, 0x9F1C, 0xFC8F, 0x9F1D, 0xFC90, 0x9F1E, 0xFC91, + 0x9F1F, 0xFC92, 0x9F20, 0xCAF3, 0x9F21, 0xFC93, 0x9F22, 0xF7F7, + 0x9F23, 0xFC94, 0x9F24, 0xFC95, 0x9F25, 0xFC96, 0x9F26, 0xFC97, + 0x9F27, 0xFC98, 0x9F28, 0xFC99, 0x9F29, 0xFC9A, 0x9F2A, 0xFC9B, + 0x9F2B, 0xFC9C, 0x9F2C, 0xF7F8, 0x9F2D, 0xFC9D, 0x9F2E, 0xFC9E, + 0x9F2F, 0xF7F9, 0x9F30, 0xFC9F, 0x9F31, 0xFCA0, 0x9F32, 0xFD40, + 0x9F33, 0xFD41, 0x9F34, 0xFD42, 0x9F35, 0xFD43, 0x9F36, 0xFD44, + 0x9F37, 0xF7FB, 0x9F38, 0xFD45, 0x9F39, 0xF7FA, 0x9F3A, 0xFD46, + 0x9F3B, 0xB1C7, 0x9F3C, 0xFD47, 0x9F3D, 0xF7FC, 0x9F3E, 0xF7FD, + 0x9F3F, 0xFD48, 0x9F40, 0xFD49, 0x9F41, 0xFD4A, 0x9F42, 0xFD4B, + 0x9F43, 0xFD4C, 0x9F44, 0xF7FE, 0x9F45, 0xFD4D, 0x9F46, 0xFD4E, + 0x9F47, 0xFD4F, 0x9F48, 0xFD50, 0x9F49, 0xFD51, 0x9F4A, 0xFD52, + 0x9F4B, 0xFD53, 0x9F4C, 0xFD54, 0x9F4D, 0xFD55, 0x9F4E, 0xFD56, + 0x9F4F, 0xFD57, 0x9F50, 0xC6EB, 0x9F51, 0xECB4, 0x9F52, 0xFD58, + 0x9F53, 0xFD59, 0x9F54, 0xFD5A, 0x9F55, 0xFD5B, 0x9F56, 0xFD5C, + 0x9F57, 0xFD5D, 0x9F58, 0xFD5E, 0x9F59, 0xFD5F, 0x9F5A, 0xFD60, + 0x9F5B, 0xFD61, 0x9F5C, 0xFD62, 0x9F5D, 0xFD63, 0x9F5E, 0xFD64, + 0x9F5F, 0xFD65, 0x9F60, 0xFD66, 0x9F61, 0xFD67, 0x9F62, 0xFD68, + 0x9F63, 0xFD69, 0x9F64, 0xFD6A, 0x9F65, 0xFD6B, 0x9F66, 0xFD6C, + 0x9F67, 0xFD6D, 0x9F68, 0xFD6E, 0x9F69, 0xFD6F, 0x9F6A, 0xFD70, + 0x9F6B, 0xFD71, 0x9F6C, 0xFD72, 0x9F6D, 0xFD73, 0x9F6E, 0xFD74, + 0x9F6F, 0xFD75, 0x9F70, 0xFD76, 0x9F71, 0xFD77, 0x9F72, 0xFD78, + 0x9F73, 0xFD79, 0x9F74, 0xFD7A, 0x9F75, 0xFD7B, 0x9F76, 0xFD7C, + 0x9F77, 0xFD7D, 0x9F78, 0xFD7E, 0x9F79, 0xFD80, 0x9F7A, 0xFD81, + 0x9F7B, 0xFD82, 0x9F7C, 0xFD83, 0x9F7D, 0xFD84, 0x9F7E, 0xFD85, + 0x9F7F, 0xB3DD, 0x9F80, 0xF6B3, 0x9F81, 0xFD86, 0x9F82, 0xFD87, + 0x9F83, 0xF6B4, 0x9F84, 0xC1E4, 0x9F85, 0xF6B5, 0x9F86, 0xF6B6, + 0x9F87, 0xF6B7, 0x9F88, 0xF6B8, 0x9F89, 0xF6B9, 0x9F8A, 0xF6BA, + 0x9F8B, 0xC8A3, 0x9F8C, 0xF6BB, 0x9F8D, 0xFD88, 0x9F8E, 0xFD89, + 0x9F8F, 0xFD8A, 0x9F90, 0xFD8B, 0x9F91, 0xFD8C, 0x9F92, 0xFD8D, + 0x9F93, 0xFD8E, 0x9F94, 0xFD8F, 0x9F95, 0xFD90, 0x9F96, 0xFD91, + 0x9F97, 0xFD92, 0x9F98, 0xFD93, 0x9F99, 0xC1FA, 0x9F9A, 0xB9A8, + 0x9F9B, 0xEDE8, 0x9F9C, 0xFD94, 0x9F9D, 0xFD95, 0x9F9E, 0xFD96, + 0x9F9F, 0xB9EA, 0x9FA0, 0xD9DF, 0x9FA1, 0xFD97, 0x9FA2, 0xFD98, + 0x9FA3, 0xFD99, 0x9FA4, 0xFD9A, 0x9FA5, 0xFD9B, 0xF92C, 0xFD9C, + 0xF979, 0xFD9D, 0xF995, 0xFD9E, 0xF9E7, 0xFD9F, 0xF9F1, 0xFDA0, + 0xFA0C, 0xFE40, 0xFA0D, 0xFE41, 0xFA0E, 0xFE42, 0xFA0F, 0xFE43, + 0xFA11, 0xFE44, 0xFA13, 0xFE45, 0xFA14, 0xFE46, 0xFA18, 0xFE47, + 0xFA1F, 0xFE48, 0xFA20, 0xFE49, 0xFA21, 0xFE4A, 0xFA23, 0xFE4B, + 0xFA24, 0xFE4C, 0xFA27, 0xFE4D, 0xFA28, 0xFE4E, 0xFA29, 0xFE4F, + 0xFE30, 0xA955, 0xFE31, 0xA6F2, 0xFE33, 0xA6F4, 0xFE34, 0xA6F5, + 0xFE35, 0xA6E0, 0xFE36, 0xA6E1, 0xFE37, 0xA6F0, 0xFE38, 0xA6F1, + 0xFE39, 0xA6E2, 0xFE3A, 0xA6E3, 0xFE3B, 0xA6EE, 0xFE3C, 0xA6EF, + 0xFE3D, 0xA6E6, 0xFE3E, 0xA6E7, 0xFE3F, 0xA6E4, 0xFE40, 0xA6E5, + 0xFE41, 0xA6E8, 0xFE42, 0xA6E9, 0xFE43, 0xA6EA, 0xFE44, 0xA6EB, + 0xFE49, 0xA968, 0xFE4A, 0xA969, 0xFE4B, 0xA96A, 0xFE4C, 0xA96B, + 0xFE4D, 0xA96C, 0xFE4E, 0xA96D, 0xFE4F, 0xA96E, 0xFE50, 0xA96F, + 0xFE51, 0xA970, 0xFE52, 0xA971, 0xFE54, 0xA972, 0xFE55, 0xA973, + 0xFE56, 0xA974, 0xFE57, 0xA975, 0xFE59, 0xA976, 0xFE5A, 0xA977, + 0xFE5B, 0xA978, 0xFE5C, 0xA979, 0xFE5D, 0xA97A, 0xFE5E, 0xA97B, + 0xFE5F, 0xA97C, 0xFE60, 0xA97D, 0xFE61, 0xA97E, 0xFE62, 0xA980, + 0xFE63, 0xA981, 0xFE64, 0xA982, 0xFE65, 0xA983, 0xFE66, 0xA984, + 0xFE68, 0xA985, 0xFE69, 0xA986, 0xFE6A, 0xA987, 0xFE6B, 0xA988, + 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA1E7, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, + 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, + 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, + 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, + 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, + 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, + 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, + 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA3DC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, + 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, + 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, + 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, + 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA1AB, 0xFFE0, 0xA1E9, 0xFFE1, 0xA1EA, + 0xFFE2, 0xA956, 0xFFE3, 0xA3FE, 0xFFE4, 0xA957, 0xFFE5, 0xA3A4, + 0, 0 +}; + +static +const WCHAR oem2uni[] = { +/* OEM - Unicode, OEM - Unicode, OEM - Unicode, OEM - Unicode */ + 0x0080, 0x20AC, 0x8140, 0x4E02, 0x8141, 0x4E04, 0x8142, 0x4E05, + 0x8143, 0x4E06, 0x8144, 0x4E0F, 0x8145, 0x4E12, 0x8146, 0x4E17, + 0x8147, 0x4E1F, 0x8148, 0x4E20, 0x8149, 0x4E21, 0x814A, 0x4E23, + 0x814B, 0x4E26, 0x814C, 0x4E29, 0x814D, 0x4E2E, 0x814E, 0x4E2F, + 0x814F, 0x4E31, 0x8150, 0x4E33, 0x8151, 0x4E35, 0x8152, 0x4E37, + 0x8153, 0x4E3C, 0x8154, 0x4E40, 0x8155, 0x4E41, 0x8156, 0x4E42, + 0x8157, 0x4E44, 0x8158, 0x4E46, 0x8159, 0x4E4A, 0x815A, 0x4E51, + 0x815B, 0x4E55, 0x815C, 0x4E57, 0x815D, 0x4E5A, 0x815E, 0x4E5B, + 0x815F, 0x4E62, 0x8160, 0x4E63, 0x8161, 0x4E64, 0x8162, 0x4E65, + 0x8163, 0x4E67, 0x8164, 0x4E68, 0x8165, 0x4E6A, 0x8166, 0x4E6B, + 0x8167, 0x4E6C, 0x8168, 0x4E6D, 0x8169, 0x4E6E, 0x816A, 0x4E6F, + 0x816B, 0x4E72, 0x816C, 0x4E74, 0x816D, 0x4E75, 0x816E, 0x4E76, + 0x816F, 0x4E77, 0x8170, 0x4E78, 0x8171, 0x4E79, 0x8172, 0x4E7A, + 0x8173, 0x4E7B, 0x8174, 0x4E7C, 0x8175, 0x4E7D, 0x8176, 0x4E7F, + 0x8177, 0x4E80, 0x8178, 0x4E81, 0x8179, 0x4E82, 0x817A, 0x4E83, + 0x817B, 0x4E84, 0x817C, 0x4E85, 0x817D, 0x4E87, 0x817E, 0x4E8A, + 0x8180, 0x4E90, 0x8181, 0x4E96, 0x8182, 0x4E97, 0x8183, 0x4E99, + 0x8184, 0x4E9C, 0x8185, 0x4E9D, 0x8186, 0x4E9E, 0x8187, 0x4EA3, + 0x8188, 0x4EAA, 0x8189, 0x4EAF, 0x818A, 0x4EB0, 0x818B, 0x4EB1, + 0x818C, 0x4EB4, 0x818D, 0x4EB6, 0x818E, 0x4EB7, 0x818F, 0x4EB8, + 0x8190, 0x4EB9, 0x8191, 0x4EBC, 0x8192, 0x4EBD, 0x8193, 0x4EBE, + 0x8194, 0x4EC8, 0x8195, 0x4ECC, 0x8196, 0x4ECF, 0x8197, 0x4ED0, + 0x8198, 0x4ED2, 0x8199, 0x4EDA, 0x819A, 0x4EDB, 0x819B, 0x4EDC, + 0x819C, 0x4EE0, 0x819D, 0x4EE2, 0x819E, 0x4EE6, 0x819F, 0x4EE7, + 0x81A0, 0x4EE9, 0x81A1, 0x4EED, 0x81A2, 0x4EEE, 0x81A3, 0x4EEF, + 0x81A4, 0x4EF1, 0x81A5, 0x4EF4, 0x81A6, 0x4EF8, 0x81A7, 0x4EF9, + 0x81A8, 0x4EFA, 0x81A9, 0x4EFC, 0x81AA, 0x4EFE, 0x81AB, 0x4F00, + 0x81AC, 0x4F02, 0x81AD, 0x4F03, 0x81AE, 0x4F04, 0x81AF, 0x4F05, + 0x81B0, 0x4F06, 0x81B1, 0x4F07, 0x81B2, 0x4F08, 0x81B3, 0x4F0B, + 0x81B4, 0x4F0C, 0x81B5, 0x4F12, 0x81B6, 0x4F13, 0x81B7, 0x4F14, + 0x81B8, 0x4F15, 0x81B9, 0x4F16, 0x81BA, 0x4F1C, 0x81BB, 0x4F1D, + 0x81BC, 0x4F21, 0x81BD, 0x4F23, 0x81BE, 0x4F28, 0x81BF, 0x4F29, + 0x81C0, 0x4F2C, 0x81C1, 0x4F2D, 0x81C2, 0x4F2E, 0x81C3, 0x4F31, + 0x81C4, 0x4F33, 0x81C5, 0x4F35, 0x81C6, 0x4F37, 0x81C7, 0x4F39, + 0x81C8, 0x4F3B, 0x81C9, 0x4F3E, 0x81CA, 0x4F3F, 0x81CB, 0x4F40, + 0x81CC, 0x4F41, 0x81CD, 0x4F42, 0x81CE, 0x4F44, 0x81CF, 0x4F45, + 0x81D0, 0x4F47, 0x81D1, 0x4F48, 0x81D2, 0x4F49, 0x81D3, 0x4F4A, + 0x81D4, 0x4F4B, 0x81D5, 0x4F4C, 0x81D6, 0x4F52, 0x81D7, 0x4F54, + 0x81D8, 0x4F56, 0x81D9, 0x4F61, 0x81DA, 0x4F62, 0x81DB, 0x4F66, + 0x81DC, 0x4F68, 0x81DD, 0x4F6A, 0x81DE, 0x4F6B, 0x81DF, 0x4F6D, + 0x81E0, 0x4F6E, 0x81E1, 0x4F71, 0x81E2, 0x4F72, 0x81E3, 0x4F75, + 0x81E4, 0x4F77, 0x81E5, 0x4F78, 0x81E6, 0x4F79, 0x81E7, 0x4F7A, + 0x81E8, 0x4F7D, 0x81E9, 0x4F80, 0x81EA, 0x4F81, 0x81EB, 0x4F82, + 0x81EC, 0x4F85, 0x81ED, 0x4F86, 0x81EE, 0x4F87, 0x81EF, 0x4F8A, + 0x81F0, 0x4F8C, 0x81F1, 0x4F8E, 0x81F2, 0x4F90, 0x81F3, 0x4F92, + 0x81F4, 0x4F93, 0x81F5, 0x4F95, 0x81F6, 0x4F96, 0x81F7, 0x4F98, + 0x81F8, 0x4F99, 0x81F9, 0x4F9A, 0x81FA, 0x4F9C, 0x81FB, 0x4F9E, + 0x81FC, 0x4F9F, 0x81FD, 0x4FA1, 0x81FE, 0x4FA2, 0x8240, 0x4FA4, + 0x8241, 0x4FAB, 0x8242, 0x4FAD, 0x8243, 0x4FB0, 0x8244, 0x4FB1, + 0x8245, 0x4FB2, 0x8246, 0x4FB3, 0x8247, 0x4FB4, 0x8248, 0x4FB6, + 0x8249, 0x4FB7, 0x824A, 0x4FB8, 0x824B, 0x4FB9, 0x824C, 0x4FBA, + 0x824D, 0x4FBB, 0x824E, 0x4FBC, 0x824F, 0x4FBD, 0x8250, 0x4FBE, + 0x8251, 0x4FC0, 0x8252, 0x4FC1, 0x8253, 0x4FC2, 0x8254, 0x4FC6, + 0x8255, 0x4FC7, 0x8256, 0x4FC8, 0x8257, 0x4FC9, 0x8258, 0x4FCB, + 0x8259, 0x4FCC, 0x825A, 0x4FCD, 0x825B, 0x4FD2, 0x825C, 0x4FD3, + 0x825D, 0x4FD4, 0x825E, 0x4FD5, 0x825F, 0x4FD6, 0x8260, 0x4FD9, + 0x8261, 0x4FDB, 0x8262, 0x4FE0, 0x8263, 0x4FE2, 0x8264, 0x4FE4, + 0x8265, 0x4FE5, 0x8266, 0x4FE7, 0x8267, 0x4FEB, 0x8268, 0x4FEC, + 0x8269, 0x4FF0, 0x826A, 0x4FF2, 0x826B, 0x4FF4, 0x826C, 0x4FF5, + 0x826D, 0x4FF6, 0x826E, 0x4FF7, 0x826F, 0x4FF9, 0x8270, 0x4FFB, + 0x8271, 0x4FFC, 0x8272, 0x4FFD, 0x8273, 0x4FFF, 0x8274, 0x5000, + 0x8275, 0x5001, 0x8276, 0x5002, 0x8277, 0x5003, 0x8278, 0x5004, + 0x8279, 0x5005, 0x827A, 0x5006, 0x827B, 0x5007, 0x827C, 0x5008, + 0x827D, 0x5009, 0x827E, 0x500A, 0x8280, 0x500B, 0x8281, 0x500E, + 0x8282, 0x5010, 0x8283, 0x5011, 0x8284, 0x5013, 0x8285, 0x5015, + 0x8286, 0x5016, 0x8287, 0x5017, 0x8288, 0x501B, 0x8289, 0x501D, + 0x828A, 0x501E, 0x828B, 0x5020, 0x828C, 0x5022, 0x828D, 0x5023, + 0x828E, 0x5024, 0x828F, 0x5027, 0x8290, 0x502B, 0x8291, 0x502F, + 0x8292, 0x5030, 0x8293, 0x5031, 0x8294, 0x5032, 0x8295, 0x5033, + 0x8296, 0x5034, 0x8297, 0x5035, 0x8298, 0x5036, 0x8299, 0x5037, + 0x829A, 0x5038, 0x829B, 0x5039, 0x829C, 0x503B, 0x829D, 0x503D, + 0x829E, 0x503F, 0x829F, 0x5040, 0x82A0, 0x5041, 0x82A1, 0x5042, + 0x82A2, 0x5044, 0x82A3, 0x5045, 0x82A4, 0x5046, 0x82A5, 0x5049, + 0x82A6, 0x504A, 0x82A7, 0x504B, 0x82A8, 0x504D, 0x82A9, 0x5050, + 0x82AA, 0x5051, 0x82AB, 0x5052, 0x82AC, 0x5053, 0x82AD, 0x5054, + 0x82AE, 0x5056, 0x82AF, 0x5057, 0x82B0, 0x5058, 0x82B1, 0x5059, + 0x82B2, 0x505B, 0x82B3, 0x505D, 0x82B4, 0x505E, 0x82B5, 0x505F, + 0x82B6, 0x5060, 0x82B7, 0x5061, 0x82B8, 0x5062, 0x82B9, 0x5063, + 0x82BA, 0x5064, 0x82BB, 0x5066, 0x82BC, 0x5067, 0x82BD, 0x5068, + 0x82BE, 0x5069, 0x82BF, 0x506A, 0x82C0, 0x506B, 0x82C1, 0x506D, + 0x82C2, 0x506E, 0x82C3, 0x506F, 0x82C4, 0x5070, 0x82C5, 0x5071, + 0x82C6, 0x5072, 0x82C7, 0x5073, 0x82C8, 0x5074, 0x82C9, 0x5075, + 0x82CA, 0x5078, 0x82CB, 0x5079, 0x82CC, 0x507A, 0x82CD, 0x507C, + 0x82CE, 0x507D, 0x82CF, 0x5081, 0x82D0, 0x5082, 0x82D1, 0x5083, + 0x82D2, 0x5084, 0x82D3, 0x5086, 0x82D4, 0x5087, 0x82D5, 0x5089, + 0x82D6, 0x508A, 0x82D7, 0x508B, 0x82D8, 0x508C, 0x82D9, 0x508E, + 0x82DA, 0x508F, 0x82DB, 0x5090, 0x82DC, 0x5091, 0x82DD, 0x5092, + 0x82DE, 0x5093, 0x82DF, 0x5094, 0x82E0, 0x5095, 0x82E1, 0x5096, + 0x82E2, 0x5097, 0x82E3, 0x5098, 0x82E4, 0x5099, 0x82E5, 0x509A, + 0x82E6, 0x509B, 0x82E7, 0x509C, 0x82E8, 0x509D, 0x82E9, 0x509E, + 0x82EA, 0x509F, 0x82EB, 0x50A0, 0x82EC, 0x50A1, 0x82ED, 0x50A2, + 0x82EE, 0x50A4, 0x82EF, 0x50A6, 0x82F0, 0x50AA, 0x82F1, 0x50AB, + 0x82F2, 0x50AD, 0x82F3, 0x50AE, 0x82F4, 0x50AF, 0x82F5, 0x50B0, + 0x82F6, 0x50B1, 0x82F7, 0x50B3, 0x82F8, 0x50B4, 0x82F9, 0x50B5, + 0x82FA, 0x50B6, 0x82FB, 0x50B7, 0x82FC, 0x50B8, 0x82FD, 0x50B9, + 0x82FE, 0x50BC, 0x8340, 0x50BD, 0x8341, 0x50BE, 0x8342, 0x50BF, + 0x8343, 0x50C0, 0x8344, 0x50C1, 0x8345, 0x50C2, 0x8346, 0x50C3, + 0x8347, 0x50C4, 0x8348, 0x50C5, 0x8349, 0x50C6, 0x834A, 0x50C7, + 0x834B, 0x50C8, 0x834C, 0x50C9, 0x834D, 0x50CA, 0x834E, 0x50CB, + 0x834F, 0x50CC, 0x8350, 0x50CD, 0x8351, 0x50CE, 0x8352, 0x50D0, + 0x8353, 0x50D1, 0x8354, 0x50D2, 0x8355, 0x50D3, 0x8356, 0x50D4, + 0x8357, 0x50D5, 0x8358, 0x50D7, 0x8359, 0x50D8, 0x835A, 0x50D9, + 0x835B, 0x50DB, 0x835C, 0x50DC, 0x835D, 0x50DD, 0x835E, 0x50DE, + 0x835F, 0x50DF, 0x8360, 0x50E0, 0x8361, 0x50E1, 0x8362, 0x50E2, + 0x8363, 0x50E3, 0x8364, 0x50E4, 0x8365, 0x50E5, 0x8366, 0x50E8, + 0x8367, 0x50E9, 0x8368, 0x50EA, 0x8369, 0x50EB, 0x836A, 0x50EF, + 0x836B, 0x50F0, 0x836C, 0x50F1, 0x836D, 0x50F2, 0x836E, 0x50F4, + 0x836F, 0x50F6, 0x8370, 0x50F7, 0x8371, 0x50F8, 0x8372, 0x50F9, + 0x8373, 0x50FA, 0x8374, 0x50FC, 0x8375, 0x50FD, 0x8376, 0x50FE, + 0x8377, 0x50FF, 0x8378, 0x5100, 0x8379, 0x5101, 0x837A, 0x5102, + 0x837B, 0x5103, 0x837C, 0x5104, 0x837D, 0x5105, 0x837E, 0x5108, + 0x8380, 0x5109, 0x8381, 0x510A, 0x8382, 0x510C, 0x8383, 0x510D, + 0x8384, 0x510E, 0x8385, 0x510F, 0x8386, 0x5110, 0x8387, 0x5111, + 0x8388, 0x5113, 0x8389, 0x5114, 0x838A, 0x5115, 0x838B, 0x5116, + 0x838C, 0x5117, 0x838D, 0x5118, 0x838E, 0x5119, 0x838F, 0x511A, + 0x8390, 0x511B, 0x8391, 0x511C, 0x8392, 0x511D, 0x8393, 0x511E, + 0x8394, 0x511F, 0x8395, 0x5120, 0x8396, 0x5122, 0x8397, 0x5123, + 0x8398, 0x5124, 0x8399, 0x5125, 0x839A, 0x5126, 0x839B, 0x5127, + 0x839C, 0x5128, 0x839D, 0x5129, 0x839E, 0x512A, 0x839F, 0x512B, + 0x83A0, 0x512C, 0x83A1, 0x512D, 0x83A2, 0x512E, 0x83A3, 0x512F, + 0x83A4, 0x5130, 0x83A5, 0x5131, 0x83A6, 0x5132, 0x83A7, 0x5133, + 0x83A8, 0x5134, 0x83A9, 0x5135, 0x83AA, 0x5136, 0x83AB, 0x5137, + 0x83AC, 0x5138, 0x83AD, 0x5139, 0x83AE, 0x513A, 0x83AF, 0x513B, + 0x83B0, 0x513C, 0x83B1, 0x513D, 0x83B2, 0x513E, 0x83B3, 0x5142, + 0x83B4, 0x5147, 0x83B5, 0x514A, 0x83B6, 0x514C, 0x83B7, 0x514E, + 0x83B8, 0x514F, 0x83B9, 0x5150, 0x83BA, 0x5152, 0x83BB, 0x5153, + 0x83BC, 0x5157, 0x83BD, 0x5158, 0x83BE, 0x5159, 0x83BF, 0x515B, + 0x83C0, 0x515D, 0x83C1, 0x515E, 0x83C2, 0x515F, 0x83C3, 0x5160, + 0x83C4, 0x5161, 0x83C5, 0x5163, 0x83C6, 0x5164, 0x83C7, 0x5166, + 0x83C8, 0x5167, 0x83C9, 0x5169, 0x83CA, 0x516A, 0x83CB, 0x516F, + 0x83CC, 0x5172, 0x83CD, 0x517A, 0x83CE, 0x517E, 0x83CF, 0x517F, + 0x83D0, 0x5183, 0x83D1, 0x5184, 0x83D2, 0x5186, 0x83D3, 0x5187, + 0x83D4, 0x518A, 0x83D5, 0x518B, 0x83D6, 0x518E, 0x83D7, 0x518F, + 0x83D8, 0x5190, 0x83D9, 0x5191, 0x83DA, 0x5193, 0x83DB, 0x5194, + 0x83DC, 0x5198, 0x83DD, 0x519A, 0x83DE, 0x519D, 0x83DF, 0x519E, + 0x83E0, 0x519F, 0x83E1, 0x51A1, 0x83E2, 0x51A3, 0x83E3, 0x51A6, + 0x83E4, 0x51A7, 0x83E5, 0x51A8, 0x83E6, 0x51A9, 0x83E7, 0x51AA, + 0x83E8, 0x51AD, 0x83E9, 0x51AE, 0x83EA, 0x51B4, 0x83EB, 0x51B8, + 0x83EC, 0x51B9, 0x83ED, 0x51BA, 0x83EE, 0x51BE, 0x83EF, 0x51BF, + 0x83F0, 0x51C1, 0x83F1, 0x51C2, 0x83F2, 0x51C3, 0x83F3, 0x51C5, + 0x83F4, 0x51C8, 0x83F5, 0x51CA, 0x83F6, 0x51CD, 0x83F7, 0x51CE, + 0x83F8, 0x51D0, 0x83F9, 0x51D2, 0x83FA, 0x51D3, 0x83FB, 0x51D4, + 0x83FC, 0x51D5, 0x83FD, 0x51D6, 0x83FE, 0x51D7, 0x8440, 0x51D8, + 0x8441, 0x51D9, 0x8442, 0x51DA, 0x8443, 0x51DC, 0x8444, 0x51DE, + 0x8445, 0x51DF, 0x8446, 0x51E2, 0x8447, 0x51E3, 0x8448, 0x51E5, + 0x8449, 0x51E6, 0x844A, 0x51E7, 0x844B, 0x51E8, 0x844C, 0x51E9, + 0x844D, 0x51EA, 0x844E, 0x51EC, 0x844F, 0x51EE, 0x8450, 0x51F1, + 0x8451, 0x51F2, 0x8452, 0x51F4, 0x8453, 0x51F7, 0x8454, 0x51FE, + 0x8455, 0x5204, 0x8456, 0x5205, 0x8457, 0x5209, 0x8458, 0x520B, + 0x8459, 0x520C, 0x845A, 0x520F, 0x845B, 0x5210, 0x845C, 0x5213, + 0x845D, 0x5214, 0x845E, 0x5215, 0x845F, 0x521C, 0x8460, 0x521E, + 0x8461, 0x521F, 0x8462, 0x5221, 0x8463, 0x5222, 0x8464, 0x5223, + 0x8465, 0x5225, 0x8466, 0x5226, 0x8467, 0x5227, 0x8468, 0x522A, + 0x8469, 0x522C, 0x846A, 0x522F, 0x846B, 0x5231, 0x846C, 0x5232, + 0x846D, 0x5234, 0x846E, 0x5235, 0x846F, 0x523C, 0x8470, 0x523E, + 0x8471, 0x5244, 0x8472, 0x5245, 0x8473, 0x5246, 0x8474, 0x5247, + 0x8475, 0x5248, 0x8476, 0x5249, 0x8477, 0x524B, 0x8478, 0x524E, + 0x8479, 0x524F, 0x847A, 0x5252, 0x847B, 0x5253, 0x847C, 0x5255, + 0x847D, 0x5257, 0x847E, 0x5258, 0x8480, 0x5259, 0x8481, 0x525A, + 0x8482, 0x525B, 0x8483, 0x525D, 0x8484, 0x525F, 0x8485, 0x5260, + 0x8486, 0x5262, 0x8487, 0x5263, 0x8488, 0x5264, 0x8489, 0x5266, + 0x848A, 0x5268, 0x848B, 0x526B, 0x848C, 0x526C, 0x848D, 0x526D, + 0x848E, 0x526E, 0x848F, 0x5270, 0x8490, 0x5271, 0x8491, 0x5273, + 0x8492, 0x5274, 0x8493, 0x5275, 0x8494, 0x5276, 0x8495, 0x5277, + 0x8496, 0x5278, 0x8497, 0x5279, 0x8498, 0x527A, 0x8499, 0x527B, + 0x849A, 0x527C, 0x849B, 0x527E, 0x849C, 0x5280, 0x849D, 0x5283, + 0x849E, 0x5284, 0x849F, 0x5285, 0x84A0, 0x5286, 0x84A1, 0x5287, + 0x84A2, 0x5289, 0x84A3, 0x528A, 0x84A4, 0x528B, 0x84A5, 0x528C, + 0x84A6, 0x528D, 0x84A7, 0x528E, 0x84A8, 0x528F, 0x84A9, 0x5291, + 0x84AA, 0x5292, 0x84AB, 0x5294, 0x84AC, 0x5295, 0x84AD, 0x5296, + 0x84AE, 0x5297, 0x84AF, 0x5298, 0x84B0, 0x5299, 0x84B1, 0x529A, + 0x84B2, 0x529C, 0x84B3, 0x52A4, 0x84B4, 0x52A5, 0x84B5, 0x52A6, + 0x84B6, 0x52A7, 0x84B7, 0x52AE, 0x84B8, 0x52AF, 0x84B9, 0x52B0, + 0x84BA, 0x52B4, 0x84BB, 0x52B5, 0x84BC, 0x52B6, 0x84BD, 0x52B7, + 0x84BE, 0x52B8, 0x84BF, 0x52B9, 0x84C0, 0x52BA, 0x84C1, 0x52BB, + 0x84C2, 0x52BC, 0x84C3, 0x52BD, 0x84C4, 0x52C0, 0x84C5, 0x52C1, + 0x84C6, 0x52C2, 0x84C7, 0x52C4, 0x84C8, 0x52C5, 0x84C9, 0x52C6, + 0x84CA, 0x52C8, 0x84CB, 0x52CA, 0x84CC, 0x52CC, 0x84CD, 0x52CD, + 0x84CE, 0x52CE, 0x84CF, 0x52CF, 0x84D0, 0x52D1, 0x84D1, 0x52D3, + 0x84D2, 0x52D4, 0x84D3, 0x52D5, 0x84D4, 0x52D7, 0x84D5, 0x52D9, + 0x84D6, 0x52DA, 0x84D7, 0x52DB, 0x84D8, 0x52DC, 0x84D9, 0x52DD, + 0x84DA, 0x52DE, 0x84DB, 0x52E0, 0x84DC, 0x52E1, 0x84DD, 0x52E2, + 0x84DE, 0x52E3, 0x84DF, 0x52E5, 0x84E0, 0x52E6, 0x84E1, 0x52E7, + 0x84E2, 0x52E8, 0x84E3, 0x52E9, 0x84E4, 0x52EA, 0x84E5, 0x52EB, + 0x84E6, 0x52EC, 0x84E7, 0x52ED, 0x84E8, 0x52EE, 0x84E9, 0x52EF, + 0x84EA, 0x52F1, 0x84EB, 0x52F2, 0x84EC, 0x52F3, 0x84ED, 0x52F4, + 0x84EE, 0x52F5, 0x84EF, 0x52F6, 0x84F0, 0x52F7, 0x84F1, 0x52F8, + 0x84F2, 0x52FB, 0x84F3, 0x52FC, 0x84F4, 0x52FD, 0x84F5, 0x5301, + 0x84F6, 0x5302, 0x84F7, 0x5303, 0x84F8, 0x5304, 0x84F9, 0x5307, + 0x84FA, 0x5309, 0x84FB, 0x530A, 0x84FC, 0x530B, 0x84FD, 0x530C, + 0x84FE, 0x530E, 0x8540, 0x5311, 0x8541, 0x5312, 0x8542, 0x5313, + 0x8543, 0x5314, 0x8544, 0x5318, 0x8545, 0x531B, 0x8546, 0x531C, + 0x8547, 0x531E, 0x8548, 0x531F, 0x8549, 0x5322, 0x854A, 0x5324, + 0x854B, 0x5325, 0x854C, 0x5327, 0x854D, 0x5328, 0x854E, 0x5329, + 0x854F, 0x532B, 0x8550, 0x532C, 0x8551, 0x532D, 0x8552, 0x532F, + 0x8553, 0x5330, 0x8554, 0x5331, 0x8555, 0x5332, 0x8556, 0x5333, + 0x8557, 0x5334, 0x8558, 0x5335, 0x8559, 0x5336, 0x855A, 0x5337, + 0x855B, 0x5338, 0x855C, 0x533C, 0x855D, 0x533D, 0x855E, 0x5340, + 0x855F, 0x5342, 0x8560, 0x5344, 0x8561, 0x5346, 0x8562, 0x534B, + 0x8563, 0x534C, 0x8564, 0x534D, 0x8565, 0x5350, 0x8566, 0x5354, + 0x8567, 0x5358, 0x8568, 0x5359, 0x8569, 0x535B, 0x856A, 0x535D, + 0x856B, 0x5365, 0x856C, 0x5368, 0x856D, 0x536A, 0x856E, 0x536C, + 0x856F, 0x536D, 0x8570, 0x5372, 0x8571, 0x5376, 0x8572, 0x5379, + 0x8573, 0x537B, 0x8574, 0x537C, 0x8575, 0x537D, 0x8576, 0x537E, + 0x8577, 0x5380, 0x8578, 0x5381, 0x8579, 0x5383, 0x857A, 0x5387, + 0x857B, 0x5388, 0x857C, 0x538A, 0x857D, 0x538E, 0x857E, 0x538F, + 0x8580, 0x5390, 0x8581, 0x5391, 0x8582, 0x5392, 0x8583, 0x5393, + 0x8584, 0x5394, 0x8585, 0x5396, 0x8586, 0x5397, 0x8587, 0x5399, + 0x8588, 0x539B, 0x8589, 0x539C, 0x858A, 0x539E, 0x858B, 0x53A0, + 0x858C, 0x53A1, 0x858D, 0x53A4, 0x858E, 0x53A7, 0x858F, 0x53AA, + 0x8590, 0x53AB, 0x8591, 0x53AC, 0x8592, 0x53AD, 0x8593, 0x53AF, + 0x8594, 0x53B0, 0x8595, 0x53B1, 0x8596, 0x53B2, 0x8597, 0x53B3, + 0x8598, 0x53B4, 0x8599, 0x53B5, 0x859A, 0x53B7, 0x859B, 0x53B8, + 0x859C, 0x53B9, 0x859D, 0x53BA, 0x859E, 0x53BC, 0x859F, 0x53BD, + 0x85A0, 0x53BE, 0x85A1, 0x53C0, 0x85A2, 0x53C3, 0x85A3, 0x53C4, + 0x85A4, 0x53C5, 0x85A5, 0x53C6, 0x85A6, 0x53C7, 0x85A7, 0x53CE, + 0x85A8, 0x53CF, 0x85A9, 0x53D0, 0x85AA, 0x53D2, 0x85AB, 0x53D3, + 0x85AC, 0x53D5, 0x85AD, 0x53DA, 0x85AE, 0x53DC, 0x85AF, 0x53DD, + 0x85B0, 0x53DE, 0x85B1, 0x53E1, 0x85B2, 0x53E2, 0x85B3, 0x53E7, + 0x85B4, 0x53F4, 0x85B5, 0x53FA, 0x85B6, 0x53FE, 0x85B7, 0x53FF, + 0x85B8, 0x5400, 0x85B9, 0x5402, 0x85BA, 0x5405, 0x85BB, 0x5407, + 0x85BC, 0x540B, 0x85BD, 0x5414, 0x85BE, 0x5418, 0x85BF, 0x5419, + 0x85C0, 0x541A, 0x85C1, 0x541C, 0x85C2, 0x5422, 0x85C3, 0x5424, + 0x85C4, 0x5425, 0x85C5, 0x542A, 0x85C6, 0x5430, 0x85C7, 0x5433, + 0x85C8, 0x5436, 0x85C9, 0x5437, 0x85CA, 0x543A, 0x85CB, 0x543D, + 0x85CC, 0x543F, 0x85CD, 0x5441, 0x85CE, 0x5442, 0x85CF, 0x5444, + 0x85D0, 0x5445, 0x85D1, 0x5447, 0x85D2, 0x5449, 0x85D3, 0x544C, + 0x85D4, 0x544D, 0x85D5, 0x544E, 0x85D6, 0x544F, 0x85D7, 0x5451, + 0x85D8, 0x545A, 0x85D9, 0x545D, 0x85DA, 0x545E, 0x85DB, 0x545F, + 0x85DC, 0x5460, 0x85DD, 0x5461, 0x85DE, 0x5463, 0x85DF, 0x5465, + 0x85E0, 0x5467, 0x85E1, 0x5469, 0x85E2, 0x546A, 0x85E3, 0x546B, + 0x85E4, 0x546C, 0x85E5, 0x546D, 0x85E6, 0x546E, 0x85E7, 0x546F, + 0x85E8, 0x5470, 0x85E9, 0x5474, 0x85EA, 0x5479, 0x85EB, 0x547A, + 0x85EC, 0x547E, 0x85ED, 0x547F, 0x85EE, 0x5481, 0x85EF, 0x5483, + 0x85F0, 0x5485, 0x85F1, 0x5487, 0x85F2, 0x5488, 0x85F3, 0x5489, + 0x85F4, 0x548A, 0x85F5, 0x548D, 0x85F6, 0x5491, 0x85F7, 0x5493, + 0x85F8, 0x5497, 0x85F9, 0x5498, 0x85FA, 0x549C, 0x85FB, 0x549E, + 0x85FC, 0x549F, 0x85FD, 0x54A0, 0x85FE, 0x54A1, 0x8640, 0x54A2, + 0x8641, 0x54A5, 0x8642, 0x54AE, 0x8643, 0x54B0, 0x8644, 0x54B2, + 0x8645, 0x54B5, 0x8646, 0x54B6, 0x8647, 0x54B7, 0x8648, 0x54B9, + 0x8649, 0x54BA, 0x864A, 0x54BC, 0x864B, 0x54BE, 0x864C, 0x54C3, + 0x864D, 0x54C5, 0x864E, 0x54CA, 0x864F, 0x54CB, 0x8650, 0x54D6, + 0x8651, 0x54D8, 0x8652, 0x54DB, 0x8653, 0x54E0, 0x8654, 0x54E1, + 0x8655, 0x54E2, 0x8656, 0x54E3, 0x8657, 0x54E4, 0x8658, 0x54EB, + 0x8659, 0x54EC, 0x865A, 0x54EF, 0x865B, 0x54F0, 0x865C, 0x54F1, + 0x865D, 0x54F4, 0x865E, 0x54F5, 0x865F, 0x54F6, 0x8660, 0x54F7, + 0x8661, 0x54F8, 0x8662, 0x54F9, 0x8663, 0x54FB, 0x8664, 0x54FE, + 0x8665, 0x5500, 0x8666, 0x5502, 0x8667, 0x5503, 0x8668, 0x5504, + 0x8669, 0x5505, 0x866A, 0x5508, 0x866B, 0x550A, 0x866C, 0x550B, + 0x866D, 0x550C, 0x866E, 0x550D, 0x866F, 0x550E, 0x8670, 0x5512, + 0x8671, 0x5513, 0x8672, 0x5515, 0x8673, 0x5516, 0x8674, 0x5517, + 0x8675, 0x5518, 0x8676, 0x5519, 0x8677, 0x551A, 0x8678, 0x551C, + 0x8679, 0x551D, 0x867A, 0x551E, 0x867B, 0x551F, 0x867C, 0x5521, + 0x867D, 0x5525, 0x867E, 0x5526, 0x8680, 0x5528, 0x8681, 0x5529, + 0x8682, 0x552B, 0x8683, 0x552D, 0x8684, 0x5532, 0x8685, 0x5534, + 0x8686, 0x5535, 0x8687, 0x5536, 0x8688, 0x5538, 0x8689, 0x5539, + 0x868A, 0x553A, 0x868B, 0x553B, 0x868C, 0x553D, 0x868D, 0x5540, + 0x868E, 0x5542, 0x868F, 0x5545, 0x8690, 0x5547, 0x8691, 0x5548, + 0x8692, 0x554B, 0x8693, 0x554C, 0x8694, 0x554D, 0x8695, 0x554E, + 0x8696, 0x554F, 0x8697, 0x5551, 0x8698, 0x5552, 0x8699, 0x5553, + 0x869A, 0x5554, 0x869B, 0x5557, 0x869C, 0x5558, 0x869D, 0x5559, + 0x869E, 0x555A, 0x869F, 0x555B, 0x86A0, 0x555D, 0x86A1, 0x555E, + 0x86A2, 0x555F, 0x86A3, 0x5560, 0x86A4, 0x5562, 0x86A5, 0x5563, + 0x86A6, 0x5568, 0x86A7, 0x5569, 0x86A8, 0x556B, 0x86A9, 0x556F, + 0x86AA, 0x5570, 0x86AB, 0x5571, 0x86AC, 0x5572, 0x86AD, 0x5573, + 0x86AE, 0x5574, 0x86AF, 0x5579, 0x86B0, 0x557A, 0x86B1, 0x557D, + 0x86B2, 0x557F, 0x86B3, 0x5585, 0x86B4, 0x5586, 0x86B5, 0x558C, + 0x86B6, 0x558D, 0x86B7, 0x558E, 0x86B8, 0x5590, 0x86B9, 0x5592, + 0x86BA, 0x5593, 0x86BB, 0x5595, 0x86BC, 0x5596, 0x86BD, 0x5597, + 0x86BE, 0x559A, 0x86BF, 0x559B, 0x86C0, 0x559E, 0x86C1, 0x55A0, + 0x86C2, 0x55A1, 0x86C3, 0x55A2, 0x86C4, 0x55A3, 0x86C5, 0x55A4, + 0x86C6, 0x55A5, 0x86C7, 0x55A6, 0x86C8, 0x55A8, 0x86C9, 0x55A9, + 0x86CA, 0x55AA, 0x86CB, 0x55AB, 0x86CC, 0x55AC, 0x86CD, 0x55AD, + 0x86CE, 0x55AE, 0x86CF, 0x55AF, 0x86D0, 0x55B0, 0x86D1, 0x55B2, + 0x86D2, 0x55B4, 0x86D3, 0x55B6, 0x86D4, 0x55B8, 0x86D5, 0x55BA, + 0x86D6, 0x55BC, 0x86D7, 0x55BF, 0x86D8, 0x55C0, 0x86D9, 0x55C1, + 0x86DA, 0x55C2, 0x86DB, 0x55C3, 0x86DC, 0x55C6, 0x86DD, 0x55C7, + 0x86DE, 0x55C8, 0x86DF, 0x55CA, 0x86E0, 0x55CB, 0x86E1, 0x55CE, + 0x86E2, 0x55CF, 0x86E3, 0x55D0, 0x86E4, 0x55D5, 0x86E5, 0x55D7, + 0x86E6, 0x55D8, 0x86E7, 0x55D9, 0x86E8, 0x55DA, 0x86E9, 0x55DB, + 0x86EA, 0x55DE, 0x86EB, 0x55E0, 0x86EC, 0x55E2, 0x86ED, 0x55E7, + 0x86EE, 0x55E9, 0x86EF, 0x55ED, 0x86F0, 0x55EE, 0x86F1, 0x55F0, + 0x86F2, 0x55F1, 0x86F3, 0x55F4, 0x86F4, 0x55F6, 0x86F5, 0x55F8, + 0x86F6, 0x55F9, 0x86F7, 0x55FA, 0x86F8, 0x55FB, 0x86F9, 0x55FC, + 0x86FA, 0x55FF, 0x86FB, 0x5602, 0x86FC, 0x5603, 0x86FD, 0x5604, + 0x86FE, 0x5605, 0x8740, 0x5606, 0x8741, 0x5607, 0x8742, 0x560A, + 0x8743, 0x560B, 0x8744, 0x560D, 0x8745, 0x5610, 0x8746, 0x5611, + 0x8747, 0x5612, 0x8748, 0x5613, 0x8749, 0x5614, 0x874A, 0x5615, + 0x874B, 0x5616, 0x874C, 0x5617, 0x874D, 0x5619, 0x874E, 0x561A, + 0x874F, 0x561C, 0x8750, 0x561D, 0x8751, 0x5620, 0x8752, 0x5621, + 0x8753, 0x5622, 0x8754, 0x5625, 0x8755, 0x5626, 0x8756, 0x5628, + 0x8757, 0x5629, 0x8758, 0x562A, 0x8759, 0x562B, 0x875A, 0x562E, + 0x875B, 0x562F, 0x875C, 0x5630, 0x875D, 0x5633, 0x875E, 0x5635, + 0x875F, 0x5637, 0x8760, 0x5638, 0x8761, 0x563A, 0x8762, 0x563C, + 0x8763, 0x563D, 0x8764, 0x563E, 0x8765, 0x5640, 0x8766, 0x5641, + 0x8767, 0x5642, 0x8768, 0x5643, 0x8769, 0x5644, 0x876A, 0x5645, + 0x876B, 0x5646, 0x876C, 0x5647, 0x876D, 0x5648, 0x876E, 0x5649, + 0x876F, 0x564A, 0x8770, 0x564B, 0x8771, 0x564F, 0x8772, 0x5650, + 0x8773, 0x5651, 0x8774, 0x5652, 0x8775, 0x5653, 0x8776, 0x5655, + 0x8777, 0x5656, 0x8778, 0x565A, 0x8779, 0x565B, 0x877A, 0x565D, + 0x877B, 0x565E, 0x877C, 0x565F, 0x877D, 0x5660, 0x877E, 0x5661, + 0x8780, 0x5663, 0x8781, 0x5665, 0x8782, 0x5666, 0x8783, 0x5667, + 0x8784, 0x566D, 0x8785, 0x566E, 0x8786, 0x566F, 0x8787, 0x5670, + 0x8788, 0x5672, 0x8789, 0x5673, 0x878A, 0x5674, 0x878B, 0x5675, + 0x878C, 0x5677, 0x878D, 0x5678, 0x878E, 0x5679, 0x878F, 0x567A, + 0x8790, 0x567D, 0x8791, 0x567E, 0x8792, 0x567F, 0x8793, 0x5680, + 0x8794, 0x5681, 0x8795, 0x5682, 0x8796, 0x5683, 0x8797, 0x5684, + 0x8798, 0x5687, 0x8799, 0x5688, 0x879A, 0x5689, 0x879B, 0x568A, + 0x879C, 0x568B, 0x879D, 0x568C, 0x879E, 0x568D, 0x879F, 0x5690, + 0x87A0, 0x5691, 0x87A1, 0x5692, 0x87A2, 0x5694, 0x87A3, 0x5695, + 0x87A4, 0x5696, 0x87A5, 0x5697, 0x87A6, 0x5698, 0x87A7, 0x5699, + 0x87A8, 0x569A, 0x87A9, 0x569B, 0x87AA, 0x569C, 0x87AB, 0x569D, + 0x87AC, 0x569E, 0x87AD, 0x569F, 0x87AE, 0x56A0, 0x87AF, 0x56A1, + 0x87B0, 0x56A2, 0x87B1, 0x56A4, 0x87B2, 0x56A5, 0x87B3, 0x56A6, + 0x87B4, 0x56A7, 0x87B5, 0x56A8, 0x87B6, 0x56A9, 0x87B7, 0x56AA, + 0x87B8, 0x56AB, 0x87B9, 0x56AC, 0x87BA, 0x56AD, 0x87BB, 0x56AE, + 0x87BC, 0x56B0, 0x87BD, 0x56B1, 0x87BE, 0x56B2, 0x87BF, 0x56B3, + 0x87C0, 0x56B4, 0x87C1, 0x56B5, 0x87C2, 0x56B6, 0x87C3, 0x56B8, + 0x87C4, 0x56B9, 0x87C5, 0x56BA, 0x87C6, 0x56BB, 0x87C7, 0x56BD, + 0x87C8, 0x56BE, 0x87C9, 0x56BF, 0x87CA, 0x56C0, 0x87CB, 0x56C1, + 0x87CC, 0x56C2, 0x87CD, 0x56C3, 0x87CE, 0x56C4, 0x87CF, 0x56C5, + 0x87D0, 0x56C6, 0x87D1, 0x56C7, 0x87D2, 0x56C8, 0x87D3, 0x56C9, + 0x87D4, 0x56CB, 0x87D5, 0x56CC, 0x87D6, 0x56CD, 0x87D7, 0x56CE, + 0x87D8, 0x56CF, 0x87D9, 0x56D0, 0x87DA, 0x56D1, 0x87DB, 0x56D2, + 0x87DC, 0x56D3, 0x87DD, 0x56D5, 0x87DE, 0x56D6, 0x87DF, 0x56D8, + 0x87E0, 0x56D9, 0x87E1, 0x56DC, 0x87E2, 0x56E3, 0x87E3, 0x56E5, + 0x87E4, 0x56E6, 0x87E5, 0x56E7, 0x87E6, 0x56E8, 0x87E7, 0x56E9, + 0x87E8, 0x56EA, 0x87E9, 0x56EC, 0x87EA, 0x56EE, 0x87EB, 0x56EF, + 0x87EC, 0x56F2, 0x87ED, 0x56F3, 0x87EE, 0x56F6, 0x87EF, 0x56F7, + 0x87F0, 0x56F8, 0x87F1, 0x56FB, 0x87F2, 0x56FC, 0x87F3, 0x5700, + 0x87F4, 0x5701, 0x87F5, 0x5702, 0x87F6, 0x5705, 0x87F7, 0x5707, + 0x87F8, 0x570B, 0x87F9, 0x570C, 0x87FA, 0x570D, 0x87FB, 0x570E, + 0x87FC, 0x570F, 0x87FD, 0x5710, 0x87FE, 0x5711, 0x8840, 0x5712, + 0x8841, 0x5713, 0x8842, 0x5714, 0x8843, 0x5715, 0x8844, 0x5716, + 0x8845, 0x5717, 0x8846, 0x5718, 0x8847, 0x5719, 0x8848, 0x571A, + 0x8849, 0x571B, 0x884A, 0x571D, 0x884B, 0x571E, 0x884C, 0x5720, + 0x884D, 0x5721, 0x884E, 0x5722, 0x884F, 0x5724, 0x8850, 0x5725, + 0x8851, 0x5726, 0x8852, 0x5727, 0x8853, 0x572B, 0x8854, 0x5731, + 0x8855, 0x5732, 0x8856, 0x5734, 0x8857, 0x5735, 0x8858, 0x5736, + 0x8859, 0x5737, 0x885A, 0x5738, 0x885B, 0x573C, 0x885C, 0x573D, + 0x885D, 0x573F, 0x885E, 0x5741, 0x885F, 0x5743, 0x8860, 0x5744, + 0x8861, 0x5745, 0x8862, 0x5746, 0x8863, 0x5748, 0x8864, 0x5749, + 0x8865, 0x574B, 0x8866, 0x5752, 0x8867, 0x5753, 0x8868, 0x5754, + 0x8869, 0x5755, 0x886A, 0x5756, 0x886B, 0x5758, 0x886C, 0x5759, + 0x886D, 0x5762, 0x886E, 0x5763, 0x886F, 0x5765, 0x8870, 0x5767, + 0x8871, 0x576C, 0x8872, 0x576E, 0x8873, 0x5770, 0x8874, 0x5771, + 0x8875, 0x5772, 0x8876, 0x5774, 0x8877, 0x5775, 0x8878, 0x5778, + 0x8879, 0x5779, 0x887A, 0x577A, 0x887B, 0x577D, 0x887C, 0x577E, + 0x887D, 0x577F, 0x887E, 0x5780, 0x8880, 0x5781, 0x8881, 0x5787, + 0x8882, 0x5788, 0x8883, 0x5789, 0x8884, 0x578A, 0x8885, 0x578D, + 0x8886, 0x578E, 0x8887, 0x578F, 0x8888, 0x5790, 0x8889, 0x5791, + 0x888A, 0x5794, 0x888B, 0x5795, 0x888C, 0x5796, 0x888D, 0x5797, + 0x888E, 0x5798, 0x888F, 0x5799, 0x8890, 0x579A, 0x8891, 0x579C, + 0x8892, 0x579D, 0x8893, 0x579E, 0x8894, 0x579F, 0x8895, 0x57A5, + 0x8896, 0x57A8, 0x8897, 0x57AA, 0x8898, 0x57AC, 0x8899, 0x57AF, + 0x889A, 0x57B0, 0x889B, 0x57B1, 0x889C, 0x57B3, 0x889D, 0x57B5, + 0x889E, 0x57B6, 0x889F, 0x57B7, 0x88A0, 0x57B9, 0x88A1, 0x57BA, + 0x88A2, 0x57BB, 0x88A3, 0x57BC, 0x88A4, 0x57BD, 0x88A5, 0x57BE, + 0x88A6, 0x57BF, 0x88A7, 0x57C0, 0x88A8, 0x57C1, 0x88A9, 0x57C4, + 0x88AA, 0x57C5, 0x88AB, 0x57C6, 0x88AC, 0x57C7, 0x88AD, 0x57C8, + 0x88AE, 0x57C9, 0x88AF, 0x57CA, 0x88B0, 0x57CC, 0x88B1, 0x57CD, + 0x88B2, 0x57D0, 0x88B3, 0x57D1, 0x88B4, 0x57D3, 0x88B5, 0x57D6, + 0x88B6, 0x57D7, 0x88B7, 0x57DB, 0x88B8, 0x57DC, 0x88B9, 0x57DE, + 0x88BA, 0x57E1, 0x88BB, 0x57E2, 0x88BC, 0x57E3, 0x88BD, 0x57E5, + 0x88BE, 0x57E6, 0x88BF, 0x57E7, 0x88C0, 0x57E8, 0x88C1, 0x57E9, + 0x88C2, 0x57EA, 0x88C3, 0x57EB, 0x88C4, 0x57EC, 0x88C5, 0x57EE, + 0x88C6, 0x57F0, 0x88C7, 0x57F1, 0x88C8, 0x57F2, 0x88C9, 0x57F3, + 0x88CA, 0x57F5, 0x88CB, 0x57F6, 0x88CC, 0x57F7, 0x88CD, 0x57FB, + 0x88CE, 0x57FC, 0x88CF, 0x57FE, 0x88D0, 0x57FF, 0x88D1, 0x5801, + 0x88D2, 0x5803, 0x88D3, 0x5804, 0x88D4, 0x5805, 0x88D5, 0x5808, + 0x88D6, 0x5809, 0x88D7, 0x580A, 0x88D8, 0x580C, 0x88D9, 0x580E, + 0x88DA, 0x580F, 0x88DB, 0x5810, 0x88DC, 0x5812, 0x88DD, 0x5813, + 0x88DE, 0x5814, 0x88DF, 0x5816, 0x88E0, 0x5817, 0x88E1, 0x5818, + 0x88E2, 0x581A, 0x88E3, 0x581B, 0x88E4, 0x581C, 0x88E5, 0x581D, + 0x88E6, 0x581F, 0x88E7, 0x5822, 0x88E8, 0x5823, 0x88E9, 0x5825, + 0x88EA, 0x5826, 0x88EB, 0x5827, 0x88EC, 0x5828, 0x88ED, 0x5829, + 0x88EE, 0x582B, 0x88EF, 0x582C, 0x88F0, 0x582D, 0x88F1, 0x582E, + 0x88F2, 0x582F, 0x88F3, 0x5831, 0x88F4, 0x5832, 0x88F5, 0x5833, + 0x88F6, 0x5834, 0x88F7, 0x5836, 0x88F8, 0x5837, 0x88F9, 0x5838, + 0x88FA, 0x5839, 0x88FB, 0x583A, 0x88FC, 0x583B, 0x88FD, 0x583C, + 0x88FE, 0x583D, 0x8940, 0x583E, 0x8941, 0x583F, 0x8942, 0x5840, + 0x8943, 0x5841, 0x8944, 0x5842, 0x8945, 0x5843, 0x8946, 0x5845, + 0x8947, 0x5846, 0x8948, 0x5847, 0x8949, 0x5848, 0x894A, 0x5849, + 0x894B, 0x584A, 0x894C, 0x584B, 0x894D, 0x584E, 0x894E, 0x584F, + 0x894F, 0x5850, 0x8950, 0x5852, 0x8951, 0x5853, 0x8952, 0x5855, + 0x8953, 0x5856, 0x8954, 0x5857, 0x8955, 0x5859, 0x8956, 0x585A, + 0x8957, 0x585B, 0x8958, 0x585C, 0x8959, 0x585D, 0x895A, 0x585F, + 0x895B, 0x5860, 0x895C, 0x5861, 0x895D, 0x5862, 0x895E, 0x5863, + 0x895F, 0x5864, 0x8960, 0x5866, 0x8961, 0x5867, 0x8962, 0x5868, + 0x8963, 0x5869, 0x8964, 0x586A, 0x8965, 0x586D, 0x8966, 0x586E, + 0x8967, 0x586F, 0x8968, 0x5870, 0x8969, 0x5871, 0x896A, 0x5872, + 0x896B, 0x5873, 0x896C, 0x5874, 0x896D, 0x5875, 0x896E, 0x5876, + 0x896F, 0x5877, 0x8970, 0x5878, 0x8971, 0x5879, 0x8972, 0x587A, + 0x8973, 0x587B, 0x8974, 0x587C, 0x8975, 0x587D, 0x8976, 0x587F, + 0x8977, 0x5882, 0x8978, 0x5884, 0x8979, 0x5886, 0x897A, 0x5887, + 0x897B, 0x5888, 0x897C, 0x588A, 0x897D, 0x588B, 0x897E, 0x588C, + 0x8980, 0x588D, 0x8981, 0x588E, 0x8982, 0x588F, 0x8983, 0x5890, + 0x8984, 0x5891, 0x8985, 0x5894, 0x8986, 0x5895, 0x8987, 0x5896, + 0x8988, 0x5897, 0x8989, 0x5898, 0x898A, 0x589B, 0x898B, 0x589C, + 0x898C, 0x589D, 0x898D, 0x58A0, 0x898E, 0x58A1, 0x898F, 0x58A2, + 0x8990, 0x58A3, 0x8991, 0x58A4, 0x8992, 0x58A5, 0x8993, 0x58A6, + 0x8994, 0x58A7, 0x8995, 0x58AA, 0x8996, 0x58AB, 0x8997, 0x58AC, + 0x8998, 0x58AD, 0x8999, 0x58AE, 0x899A, 0x58AF, 0x899B, 0x58B0, + 0x899C, 0x58B1, 0x899D, 0x58B2, 0x899E, 0x58B3, 0x899F, 0x58B4, + 0x89A0, 0x58B5, 0x89A1, 0x58B6, 0x89A2, 0x58B7, 0x89A3, 0x58B8, + 0x89A4, 0x58B9, 0x89A5, 0x58BA, 0x89A6, 0x58BB, 0x89A7, 0x58BD, + 0x89A8, 0x58BE, 0x89A9, 0x58BF, 0x89AA, 0x58C0, 0x89AB, 0x58C2, + 0x89AC, 0x58C3, 0x89AD, 0x58C4, 0x89AE, 0x58C6, 0x89AF, 0x58C7, + 0x89B0, 0x58C8, 0x89B1, 0x58C9, 0x89B2, 0x58CA, 0x89B3, 0x58CB, + 0x89B4, 0x58CC, 0x89B5, 0x58CD, 0x89B6, 0x58CE, 0x89B7, 0x58CF, + 0x89B8, 0x58D0, 0x89B9, 0x58D2, 0x89BA, 0x58D3, 0x89BB, 0x58D4, + 0x89BC, 0x58D6, 0x89BD, 0x58D7, 0x89BE, 0x58D8, 0x89BF, 0x58D9, + 0x89C0, 0x58DA, 0x89C1, 0x58DB, 0x89C2, 0x58DC, 0x89C3, 0x58DD, + 0x89C4, 0x58DE, 0x89C5, 0x58DF, 0x89C6, 0x58E0, 0x89C7, 0x58E1, + 0x89C8, 0x58E2, 0x89C9, 0x58E3, 0x89CA, 0x58E5, 0x89CB, 0x58E6, + 0x89CC, 0x58E7, 0x89CD, 0x58E8, 0x89CE, 0x58E9, 0x89CF, 0x58EA, + 0x89D0, 0x58ED, 0x89D1, 0x58EF, 0x89D2, 0x58F1, 0x89D3, 0x58F2, + 0x89D4, 0x58F4, 0x89D5, 0x58F5, 0x89D6, 0x58F7, 0x89D7, 0x58F8, + 0x89D8, 0x58FA, 0x89D9, 0x58FB, 0x89DA, 0x58FC, 0x89DB, 0x58FD, + 0x89DC, 0x58FE, 0x89DD, 0x58FF, 0x89DE, 0x5900, 0x89DF, 0x5901, + 0x89E0, 0x5903, 0x89E1, 0x5905, 0x89E2, 0x5906, 0x89E3, 0x5908, + 0x89E4, 0x5909, 0x89E5, 0x590A, 0x89E6, 0x590B, 0x89E7, 0x590C, + 0x89E8, 0x590E, 0x89E9, 0x5910, 0x89EA, 0x5911, 0x89EB, 0x5912, + 0x89EC, 0x5913, 0x89ED, 0x5917, 0x89EE, 0x5918, 0x89EF, 0x591B, + 0x89F0, 0x591D, 0x89F1, 0x591E, 0x89F2, 0x5920, 0x89F3, 0x5921, + 0x89F4, 0x5922, 0x89F5, 0x5923, 0x89F6, 0x5926, 0x89F7, 0x5928, + 0x89F8, 0x592C, 0x89F9, 0x5930, 0x89FA, 0x5932, 0x89FB, 0x5933, + 0x89FC, 0x5935, 0x89FD, 0x5936, 0x89FE, 0x593B, 0x8A40, 0x593D, + 0x8A41, 0x593E, 0x8A42, 0x593F, 0x8A43, 0x5940, 0x8A44, 0x5943, + 0x8A45, 0x5945, 0x8A46, 0x5946, 0x8A47, 0x594A, 0x8A48, 0x594C, + 0x8A49, 0x594D, 0x8A4A, 0x5950, 0x8A4B, 0x5952, 0x8A4C, 0x5953, + 0x8A4D, 0x5959, 0x8A4E, 0x595B, 0x8A4F, 0x595C, 0x8A50, 0x595D, + 0x8A51, 0x595E, 0x8A52, 0x595F, 0x8A53, 0x5961, 0x8A54, 0x5963, + 0x8A55, 0x5964, 0x8A56, 0x5966, 0x8A57, 0x5967, 0x8A58, 0x5968, + 0x8A59, 0x5969, 0x8A5A, 0x596A, 0x8A5B, 0x596B, 0x8A5C, 0x596C, + 0x8A5D, 0x596D, 0x8A5E, 0x596E, 0x8A5F, 0x596F, 0x8A60, 0x5970, + 0x8A61, 0x5971, 0x8A62, 0x5972, 0x8A63, 0x5975, 0x8A64, 0x5977, + 0x8A65, 0x597A, 0x8A66, 0x597B, 0x8A67, 0x597C, 0x8A68, 0x597E, + 0x8A69, 0x597F, 0x8A6A, 0x5980, 0x8A6B, 0x5985, 0x8A6C, 0x5989, + 0x8A6D, 0x598B, 0x8A6E, 0x598C, 0x8A6F, 0x598E, 0x8A70, 0x598F, + 0x8A71, 0x5990, 0x8A72, 0x5991, 0x8A73, 0x5994, 0x8A74, 0x5995, + 0x8A75, 0x5998, 0x8A76, 0x599A, 0x8A77, 0x599B, 0x8A78, 0x599C, + 0x8A79, 0x599D, 0x8A7A, 0x599F, 0x8A7B, 0x59A0, 0x8A7C, 0x59A1, + 0x8A7D, 0x59A2, 0x8A7E, 0x59A6, 0x8A80, 0x59A7, 0x8A81, 0x59AC, + 0x8A82, 0x59AD, 0x8A83, 0x59B0, 0x8A84, 0x59B1, 0x8A85, 0x59B3, + 0x8A86, 0x59B4, 0x8A87, 0x59B5, 0x8A88, 0x59B6, 0x8A89, 0x59B7, + 0x8A8A, 0x59B8, 0x8A8B, 0x59BA, 0x8A8C, 0x59BC, 0x8A8D, 0x59BD, + 0x8A8E, 0x59BF, 0x8A8F, 0x59C0, 0x8A90, 0x59C1, 0x8A91, 0x59C2, + 0x8A92, 0x59C3, 0x8A93, 0x59C4, 0x8A94, 0x59C5, 0x8A95, 0x59C7, + 0x8A96, 0x59C8, 0x8A97, 0x59C9, 0x8A98, 0x59CC, 0x8A99, 0x59CD, + 0x8A9A, 0x59CE, 0x8A9B, 0x59CF, 0x8A9C, 0x59D5, 0x8A9D, 0x59D6, + 0x8A9E, 0x59D9, 0x8A9F, 0x59DB, 0x8AA0, 0x59DE, 0x8AA1, 0x59DF, + 0x8AA2, 0x59E0, 0x8AA3, 0x59E1, 0x8AA4, 0x59E2, 0x8AA5, 0x59E4, + 0x8AA6, 0x59E6, 0x8AA7, 0x59E7, 0x8AA8, 0x59E9, 0x8AA9, 0x59EA, + 0x8AAA, 0x59EB, 0x8AAB, 0x59ED, 0x8AAC, 0x59EE, 0x8AAD, 0x59EF, + 0x8AAE, 0x59F0, 0x8AAF, 0x59F1, 0x8AB0, 0x59F2, 0x8AB1, 0x59F3, + 0x8AB2, 0x59F4, 0x8AB3, 0x59F5, 0x8AB4, 0x59F6, 0x8AB5, 0x59F7, + 0x8AB6, 0x59F8, 0x8AB7, 0x59FA, 0x8AB8, 0x59FC, 0x8AB9, 0x59FD, + 0x8ABA, 0x59FE, 0x8ABB, 0x5A00, 0x8ABC, 0x5A02, 0x8ABD, 0x5A0A, + 0x8ABE, 0x5A0B, 0x8ABF, 0x5A0D, 0x8AC0, 0x5A0E, 0x8AC1, 0x5A0F, + 0x8AC2, 0x5A10, 0x8AC3, 0x5A12, 0x8AC4, 0x5A14, 0x8AC5, 0x5A15, + 0x8AC6, 0x5A16, 0x8AC7, 0x5A17, 0x8AC8, 0x5A19, 0x8AC9, 0x5A1A, + 0x8ACA, 0x5A1B, 0x8ACB, 0x5A1D, 0x8ACC, 0x5A1E, 0x8ACD, 0x5A21, + 0x8ACE, 0x5A22, 0x8ACF, 0x5A24, 0x8AD0, 0x5A26, 0x8AD1, 0x5A27, + 0x8AD2, 0x5A28, 0x8AD3, 0x5A2A, 0x8AD4, 0x5A2B, 0x8AD5, 0x5A2C, + 0x8AD6, 0x5A2D, 0x8AD7, 0x5A2E, 0x8AD8, 0x5A2F, 0x8AD9, 0x5A30, + 0x8ADA, 0x5A33, 0x8ADB, 0x5A35, 0x8ADC, 0x5A37, 0x8ADD, 0x5A38, + 0x8ADE, 0x5A39, 0x8ADF, 0x5A3A, 0x8AE0, 0x5A3B, 0x8AE1, 0x5A3D, + 0x8AE2, 0x5A3E, 0x8AE3, 0x5A3F, 0x8AE4, 0x5A41, 0x8AE5, 0x5A42, + 0x8AE6, 0x5A43, 0x8AE7, 0x5A44, 0x8AE8, 0x5A45, 0x8AE9, 0x5A47, + 0x8AEA, 0x5A48, 0x8AEB, 0x5A4B, 0x8AEC, 0x5A4C, 0x8AED, 0x5A4D, + 0x8AEE, 0x5A4E, 0x8AEF, 0x5A4F, 0x8AF0, 0x5A50, 0x8AF1, 0x5A51, + 0x8AF2, 0x5A52, 0x8AF3, 0x5A53, 0x8AF4, 0x5A54, 0x8AF5, 0x5A56, + 0x8AF6, 0x5A57, 0x8AF7, 0x5A58, 0x8AF8, 0x5A59, 0x8AF9, 0x5A5B, + 0x8AFA, 0x5A5C, 0x8AFB, 0x5A5D, 0x8AFC, 0x5A5E, 0x8AFD, 0x5A5F, + 0x8AFE, 0x5A60, 0x8B40, 0x5A61, 0x8B41, 0x5A63, 0x8B42, 0x5A64, + 0x8B43, 0x5A65, 0x8B44, 0x5A66, 0x8B45, 0x5A68, 0x8B46, 0x5A69, + 0x8B47, 0x5A6B, 0x8B48, 0x5A6C, 0x8B49, 0x5A6D, 0x8B4A, 0x5A6E, + 0x8B4B, 0x5A6F, 0x8B4C, 0x5A70, 0x8B4D, 0x5A71, 0x8B4E, 0x5A72, + 0x8B4F, 0x5A73, 0x8B50, 0x5A78, 0x8B51, 0x5A79, 0x8B52, 0x5A7B, + 0x8B53, 0x5A7C, 0x8B54, 0x5A7D, 0x8B55, 0x5A7E, 0x8B56, 0x5A80, + 0x8B57, 0x5A81, 0x8B58, 0x5A82, 0x8B59, 0x5A83, 0x8B5A, 0x5A84, + 0x8B5B, 0x5A85, 0x8B5C, 0x5A86, 0x8B5D, 0x5A87, 0x8B5E, 0x5A88, + 0x8B5F, 0x5A89, 0x8B60, 0x5A8A, 0x8B61, 0x5A8B, 0x8B62, 0x5A8C, + 0x8B63, 0x5A8D, 0x8B64, 0x5A8E, 0x8B65, 0x5A8F, 0x8B66, 0x5A90, + 0x8B67, 0x5A91, 0x8B68, 0x5A93, 0x8B69, 0x5A94, 0x8B6A, 0x5A95, + 0x8B6B, 0x5A96, 0x8B6C, 0x5A97, 0x8B6D, 0x5A98, 0x8B6E, 0x5A99, + 0x8B6F, 0x5A9C, 0x8B70, 0x5A9D, 0x8B71, 0x5A9E, 0x8B72, 0x5A9F, + 0x8B73, 0x5AA0, 0x8B74, 0x5AA1, 0x8B75, 0x5AA2, 0x8B76, 0x5AA3, + 0x8B77, 0x5AA4, 0x8B78, 0x5AA5, 0x8B79, 0x5AA6, 0x8B7A, 0x5AA7, + 0x8B7B, 0x5AA8, 0x8B7C, 0x5AA9, 0x8B7D, 0x5AAB, 0x8B7E, 0x5AAC, + 0x8B80, 0x5AAD, 0x8B81, 0x5AAE, 0x8B82, 0x5AAF, 0x8B83, 0x5AB0, + 0x8B84, 0x5AB1, 0x8B85, 0x5AB4, 0x8B86, 0x5AB6, 0x8B87, 0x5AB7, + 0x8B88, 0x5AB9, 0x8B89, 0x5ABA, 0x8B8A, 0x5ABB, 0x8B8B, 0x5ABC, + 0x8B8C, 0x5ABD, 0x8B8D, 0x5ABF, 0x8B8E, 0x5AC0, 0x8B8F, 0x5AC3, + 0x8B90, 0x5AC4, 0x8B91, 0x5AC5, 0x8B92, 0x5AC6, 0x8B93, 0x5AC7, + 0x8B94, 0x5AC8, 0x8B95, 0x5ACA, 0x8B96, 0x5ACB, 0x8B97, 0x5ACD, + 0x8B98, 0x5ACE, 0x8B99, 0x5ACF, 0x8B9A, 0x5AD0, 0x8B9B, 0x5AD1, + 0x8B9C, 0x5AD3, 0x8B9D, 0x5AD5, 0x8B9E, 0x5AD7, 0x8B9F, 0x5AD9, + 0x8BA0, 0x5ADA, 0x8BA1, 0x5ADB, 0x8BA2, 0x5ADD, 0x8BA3, 0x5ADE, + 0x8BA4, 0x5ADF, 0x8BA5, 0x5AE2, 0x8BA6, 0x5AE4, 0x8BA7, 0x5AE5, + 0x8BA8, 0x5AE7, 0x8BA9, 0x5AE8, 0x8BAA, 0x5AEA, 0x8BAB, 0x5AEC, + 0x8BAC, 0x5AED, 0x8BAD, 0x5AEE, 0x8BAE, 0x5AEF, 0x8BAF, 0x5AF0, + 0x8BB0, 0x5AF2, 0x8BB1, 0x5AF3, 0x8BB2, 0x5AF4, 0x8BB3, 0x5AF5, + 0x8BB4, 0x5AF6, 0x8BB5, 0x5AF7, 0x8BB6, 0x5AF8, 0x8BB7, 0x5AF9, + 0x8BB8, 0x5AFA, 0x8BB9, 0x5AFB, 0x8BBA, 0x5AFC, 0x8BBB, 0x5AFD, + 0x8BBC, 0x5AFE, 0x8BBD, 0x5AFF, 0x8BBE, 0x5B00, 0x8BBF, 0x5B01, + 0x8BC0, 0x5B02, 0x8BC1, 0x5B03, 0x8BC2, 0x5B04, 0x8BC3, 0x5B05, + 0x8BC4, 0x5B06, 0x8BC5, 0x5B07, 0x8BC6, 0x5B08, 0x8BC7, 0x5B0A, + 0x8BC8, 0x5B0B, 0x8BC9, 0x5B0C, 0x8BCA, 0x5B0D, 0x8BCB, 0x5B0E, + 0x8BCC, 0x5B0F, 0x8BCD, 0x5B10, 0x8BCE, 0x5B11, 0x8BCF, 0x5B12, + 0x8BD0, 0x5B13, 0x8BD1, 0x5B14, 0x8BD2, 0x5B15, 0x8BD3, 0x5B18, + 0x8BD4, 0x5B19, 0x8BD5, 0x5B1A, 0x8BD6, 0x5B1B, 0x8BD7, 0x5B1C, + 0x8BD8, 0x5B1D, 0x8BD9, 0x5B1E, 0x8BDA, 0x5B1F, 0x8BDB, 0x5B20, + 0x8BDC, 0x5B21, 0x8BDD, 0x5B22, 0x8BDE, 0x5B23, 0x8BDF, 0x5B24, + 0x8BE0, 0x5B25, 0x8BE1, 0x5B26, 0x8BE2, 0x5B27, 0x8BE3, 0x5B28, + 0x8BE4, 0x5B29, 0x8BE5, 0x5B2A, 0x8BE6, 0x5B2B, 0x8BE7, 0x5B2C, + 0x8BE8, 0x5B2D, 0x8BE9, 0x5B2E, 0x8BEA, 0x5B2F, 0x8BEB, 0x5B30, + 0x8BEC, 0x5B31, 0x8BED, 0x5B33, 0x8BEE, 0x5B35, 0x8BEF, 0x5B36, + 0x8BF0, 0x5B38, 0x8BF1, 0x5B39, 0x8BF2, 0x5B3A, 0x8BF3, 0x5B3B, + 0x8BF4, 0x5B3C, 0x8BF5, 0x5B3D, 0x8BF6, 0x5B3E, 0x8BF7, 0x5B3F, + 0x8BF8, 0x5B41, 0x8BF9, 0x5B42, 0x8BFA, 0x5B43, 0x8BFB, 0x5B44, + 0x8BFC, 0x5B45, 0x8BFD, 0x5B46, 0x8BFE, 0x5B47, 0x8C40, 0x5B48, + 0x8C41, 0x5B49, 0x8C42, 0x5B4A, 0x8C43, 0x5B4B, 0x8C44, 0x5B4C, + 0x8C45, 0x5B4D, 0x8C46, 0x5B4E, 0x8C47, 0x5B4F, 0x8C48, 0x5B52, + 0x8C49, 0x5B56, 0x8C4A, 0x5B5E, 0x8C4B, 0x5B60, 0x8C4C, 0x5B61, + 0x8C4D, 0x5B67, 0x8C4E, 0x5B68, 0x8C4F, 0x5B6B, 0x8C50, 0x5B6D, + 0x8C51, 0x5B6E, 0x8C52, 0x5B6F, 0x8C53, 0x5B72, 0x8C54, 0x5B74, + 0x8C55, 0x5B76, 0x8C56, 0x5B77, 0x8C57, 0x5B78, 0x8C58, 0x5B79, + 0x8C59, 0x5B7B, 0x8C5A, 0x5B7C, 0x8C5B, 0x5B7E, 0x8C5C, 0x5B7F, + 0x8C5D, 0x5B82, 0x8C5E, 0x5B86, 0x8C5F, 0x5B8A, 0x8C60, 0x5B8D, + 0x8C61, 0x5B8E, 0x8C62, 0x5B90, 0x8C63, 0x5B91, 0x8C64, 0x5B92, + 0x8C65, 0x5B94, 0x8C66, 0x5B96, 0x8C67, 0x5B9F, 0x8C68, 0x5BA7, + 0x8C69, 0x5BA8, 0x8C6A, 0x5BA9, 0x8C6B, 0x5BAC, 0x8C6C, 0x5BAD, + 0x8C6D, 0x5BAE, 0x8C6E, 0x5BAF, 0x8C6F, 0x5BB1, 0x8C70, 0x5BB2, + 0x8C71, 0x5BB7, 0x8C72, 0x5BBA, 0x8C73, 0x5BBB, 0x8C74, 0x5BBC, + 0x8C75, 0x5BC0, 0x8C76, 0x5BC1, 0x8C77, 0x5BC3, 0x8C78, 0x5BC8, + 0x8C79, 0x5BC9, 0x8C7A, 0x5BCA, 0x8C7B, 0x5BCB, 0x8C7C, 0x5BCD, + 0x8C7D, 0x5BCE, 0x8C7E, 0x5BCF, 0x8C80, 0x5BD1, 0x8C81, 0x5BD4, + 0x8C82, 0x5BD5, 0x8C83, 0x5BD6, 0x8C84, 0x5BD7, 0x8C85, 0x5BD8, + 0x8C86, 0x5BD9, 0x8C87, 0x5BDA, 0x8C88, 0x5BDB, 0x8C89, 0x5BDC, + 0x8C8A, 0x5BE0, 0x8C8B, 0x5BE2, 0x8C8C, 0x5BE3, 0x8C8D, 0x5BE6, + 0x8C8E, 0x5BE7, 0x8C8F, 0x5BE9, 0x8C90, 0x5BEA, 0x8C91, 0x5BEB, + 0x8C92, 0x5BEC, 0x8C93, 0x5BED, 0x8C94, 0x5BEF, 0x8C95, 0x5BF1, + 0x8C96, 0x5BF2, 0x8C97, 0x5BF3, 0x8C98, 0x5BF4, 0x8C99, 0x5BF5, + 0x8C9A, 0x5BF6, 0x8C9B, 0x5BF7, 0x8C9C, 0x5BFD, 0x8C9D, 0x5BFE, + 0x8C9E, 0x5C00, 0x8C9F, 0x5C02, 0x8CA0, 0x5C03, 0x8CA1, 0x5C05, + 0x8CA2, 0x5C07, 0x8CA3, 0x5C08, 0x8CA4, 0x5C0B, 0x8CA5, 0x5C0C, + 0x8CA6, 0x5C0D, 0x8CA7, 0x5C0E, 0x8CA8, 0x5C10, 0x8CA9, 0x5C12, + 0x8CAA, 0x5C13, 0x8CAB, 0x5C17, 0x8CAC, 0x5C19, 0x8CAD, 0x5C1B, + 0x8CAE, 0x5C1E, 0x8CAF, 0x5C1F, 0x8CB0, 0x5C20, 0x8CB1, 0x5C21, + 0x8CB2, 0x5C23, 0x8CB3, 0x5C26, 0x8CB4, 0x5C28, 0x8CB5, 0x5C29, + 0x8CB6, 0x5C2A, 0x8CB7, 0x5C2B, 0x8CB8, 0x5C2D, 0x8CB9, 0x5C2E, + 0x8CBA, 0x5C2F, 0x8CBB, 0x5C30, 0x8CBC, 0x5C32, 0x8CBD, 0x5C33, + 0x8CBE, 0x5C35, 0x8CBF, 0x5C36, 0x8CC0, 0x5C37, 0x8CC1, 0x5C43, + 0x8CC2, 0x5C44, 0x8CC3, 0x5C46, 0x8CC4, 0x5C47, 0x8CC5, 0x5C4C, + 0x8CC6, 0x5C4D, 0x8CC7, 0x5C52, 0x8CC8, 0x5C53, 0x8CC9, 0x5C54, + 0x8CCA, 0x5C56, 0x8CCB, 0x5C57, 0x8CCC, 0x5C58, 0x8CCD, 0x5C5A, + 0x8CCE, 0x5C5B, 0x8CCF, 0x5C5C, 0x8CD0, 0x5C5D, 0x8CD1, 0x5C5F, + 0x8CD2, 0x5C62, 0x8CD3, 0x5C64, 0x8CD4, 0x5C67, 0x8CD5, 0x5C68, + 0x8CD6, 0x5C69, 0x8CD7, 0x5C6A, 0x8CD8, 0x5C6B, 0x8CD9, 0x5C6C, + 0x8CDA, 0x5C6D, 0x8CDB, 0x5C70, 0x8CDC, 0x5C72, 0x8CDD, 0x5C73, + 0x8CDE, 0x5C74, 0x8CDF, 0x5C75, 0x8CE0, 0x5C76, 0x8CE1, 0x5C77, + 0x8CE2, 0x5C78, 0x8CE3, 0x5C7B, 0x8CE4, 0x5C7C, 0x8CE5, 0x5C7D, + 0x8CE6, 0x5C7E, 0x8CE7, 0x5C80, 0x8CE8, 0x5C83, 0x8CE9, 0x5C84, + 0x8CEA, 0x5C85, 0x8CEB, 0x5C86, 0x8CEC, 0x5C87, 0x8CED, 0x5C89, + 0x8CEE, 0x5C8A, 0x8CEF, 0x5C8B, 0x8CF0, 0x5C8E, 0x8CF1, 0x5C8F, + 0x8CF2, 0x5C92, 0x8CF3, 0x5C93, 0x8CF4, 0x5C95, 0x8CF5, 0x5C9D, + 0x8CF6, 0x5C9E, 0x8CF7, 0x5C9F, 0x8CF8, 0x5CA0, 0x8CF9, 0x5CA1, + 0x8CFA, 0x5CA4, 0x8CFB, 0x5CA5, 0x8CFC, 0x5CA6, 0x8CFD, 0x5CA7, + 0x8CFE, 0x5CA8, 0x8D40, 0x5CAA, 0x8D41, 0x5CAE, 0x8D42, 0x5CAF, + 0x8D43, 0x5CB0, 0x8D44, 0x5CB2, 0x8D45, 0x5CB4, 0x8D46, 0x5CB6, + 0x8D47, 0x5CB9, 0x8D48, 0x5CBA, 0x8D49, 0x5CBB, 0x8D4A, 0x5CBC, + 0x8D4B, 0x5CBE, 0x8D4C, 0x5CC0, 0x8D4D, 0x5CC2, 0x8D4E, 0x5CC3, + 0x8D4F, 0x5CC5, 0x8D50, 0x5CC6, 0x8D51, 0x5CC7, 0x8D52, 0x5CC8, + 0x8D53, 0x5CC9, 0x8D54, 0x5CCA, 0x8D55, 0x5CCC, 0x8D56, 0x5CCD, + 0x8D57, 0x5CCE, 0x8D58, 0x5CCF, 0x8D59, 0x5CD0, 0x8D5A, 0x5CD1, + 0x8D5B, 0x5CD3, 0x8D5C, 0x5CD4, 0x8D5D, 0x5CD5, 0x8D5E, 0x5CD6, + 0x8D5F, 0x5CD7, 0x8D60, 0x5CD8, 0x8D61, 0x5CDA, 0x8D62, 0x5CDB, + 0x8D63, 0x5CDC, 0x8D64, 0x5CDD, 0x8D65, 0x5CDE, 0x8D66, 0x5CDF, + 0x8D67, 0x5CE0, 0x8D68, 0x5CE2, 0x8D69, 0x5CE3, 0x8D6A, 0x5CE7, + 0x8D6B, 0x5CE9, 0x8D6C, 0x5CEB, 0x8D6D, 0x5CEC, 0x8D6E, 0x5CEE, + 0x8D6F, 0x5CEF, 0x8D70, 0x5CF1, 0x8D71, 0x5CF2, 0x8D72, 0x5CF3, + 0x8D73, 0x5CF4, 0x8D74, 0x5CF5, 0x8D75, 0x5CF6, 0x8D76, 0x5CF7, + 0x8D77, 0x5CF8, 0x8D78, 0x5CF9, 0x8D79, 0x5CFA, 0x8D7A, 0x5CFC, + 0x8D7B, 0x5CFD, 0x8D7C, 0x5CFE, 0x8D7D, 0x5CFF, 0x8D7E, 0x5D00, + 0x8D80, 0x5D01, 0x8D81, 0x5D04, 0x8D82, 0x5D05, 0x8D83, 0x5D08, + 0x8D84, 0x5D09, 0x8D85, 0x5D0A, 0x8D86, 0x5D0B, 0x8D87, 0x5D0C, + 0x8D88, 0x5D0D, 0x8D89, 0x5D0F, 0x8D8A, 0x5D10, 0x8D8B, 0x5D11, + 0x8D8C, 0x5D12, 0x8D8D, 0x5D13, 0x8D8E, 0x5D15, 0x8D8F, 0x5D17, + 0x8D90, 0x5D18, 0x8D91, 0x5D19, 0x8D92, 0x5D1A, 0x8D93, 0x5D1C, + 0x8D94, 0x5D1D, 0x8D95, 0x5D1F, 0x8D96, 0x5D20, 0x8D97, 0x5D21, + 0x8D98, 0x5D22, 0x8D99, 0x5D23, 0x8D9A, 0x5D25, 0x8D9B, 0x5D28, + 0x8D9C, 0x5D2A, 0x8D9D, 0x5D2B, 0x8D9E, 0x5D2C, 0x8D9F, 0x5D2F, + 0x8DA0, 0x5D30, 0x8DA1, 0x5D31, 0x8DA2, 0x5D32, 0x8DA3, 0x5D33, + 0x8DA4, 0x5D35, 0x8DA5, 0x5D36, 0x8DA6, 0x5D37, 0x8DA7, 0x5D38, + 0x8DA8, 0x5D39, 0x8DA9, 0x5D3A, 0x8DAA, 0x5D3B, 0x8DAB, 0x5D3C, + 0x8DAC, 0x5D3F, 0x8DAD, 0x5D40, 0x8DAE, 0x5D41, 0x8DAF, 0x5D42, + 0x8DB0, 0x5D43, 0x8DB1, 0x5D44, 0x8DB2, 0x5D45, 0x8DB3, 0x5D46, + 0x8DB4, 0x5D48, 0x8DB5, 0x5D49, 0x8DB6, 0x5D4D, 0x8DB7, 0x5D4E, + 0x8DB8, 0x5D4F, 0x8DB9, 0x5D50, 0x8DBA, 0x5D51, 0x8DBB, 0x5D52, + 0x8DBC, 0x5D53, 0x8DBD, 0x5D54, 0x8DBE, 0x5D55, 0x8DBF, 0x5D56, + 0x8DC0, 0x5D57, 0x8DC1, 0x5D59, 0x8DC2, 0x5D5A, 0x8DC3, 0x5D5C, + 0x8DC4, 0x5D5E, 0x8DC5, 0x5D5F, 0x8DC6, 0x5D60, 0x8DC7, 0x5D61, + 0x8DC8, 0x5D62, 0x8DC9, 0x5D63, 0x8DCA, 0x5D64, 0x8DCB, 0x5D65, + 0x8DCC, 0x5D66, 0x8DCD, 0x5D67, 0x8DCE, 0x5D68, 0x8DCF, 0x5D6A, + 0x8DD0, 0x5D6D, 0x8DD1, 0x5D6E, 0x8DD2, 0x5D70, 0x8DD3, 0x5D71, + 0x8DD4, 0x5D72, 0x8DD5, 0x5D73, 0x8DD6, 0x5D75, 0x8DD7, 0x5D76, + 0x8DD8, 0x5D77, 0x8DD9, 0x5D78, 0x8DDA, 0x5D79, 0x8DDB, 0x5D7A, + 0x8DDC, 0x5D7B, 0x8DDD, 0x5D7C, 0x8DDE, 0x5D7D, 0x8DDF, 0x5D7E, + 0x8DE0, 0x5D7F, 0x8DE1, 0x5D80, 0x8DE2, 0x5D81, 0x8DE3, 0x5D83, + 0x8DE4, 0x5D84, 0x8DE5, 0x5D85, 0x8DE6, 0x5D86, 0x8DE7, 0x5D87, + 0x8DE8, 0x5D88, 0x8DE9, 0x5D89, 0x8DEA, 0x5D8A, 0x8DEB, 0x5D8B, + 0x8DEC, 0x5D8C, 0x8DED, 0x5D8D, 0x8DEE, 0x5D8E, 0x8DEF, 0x5D8F, + 0x8DF0, 0x5D90, 0x8DF1, 0x5D91, 0x8DF2, 0x5D92, 0x8DF3, 0x5D93, + 0x8DF4, 0x5D94, 0x8DF5, 0x5D95, 0x8DF6, 0x5D96, 0x8DF7, 0x5D97, + 0x8DF8, 0x5D98, 0x8DF9, 0x5D9A, 0x8DFA, 0x5D9B, 0x8DFB, 0x5D9C, + 0x8DFC, 0x5D9E, 0x8DFD, 0x5D9F, 0x8DFE, 0x5DA0, 0x8E40, 0x5DA1, + 0x8E41, 0x5DA2, 0x8E42, 0x5DA3, 0x8E43, 0x5DA4, 0x8E44, 0x5DA5, + 0x8E45, 0x5DA6, 0x8E46, 0x5DA7, 0x8E47, 0x5DA8, 0x8E48, 0x5DA9, + 0x8E49, 0x5DAA, 0x8E4A, 0x5DAB, 0x8E4B, 0x5DAC, 0x8E4C, 0x5DAD, + 0x8E4D, 0x5DAE, 0x8E4E, 0x5DAF, 0x8E4F, 0x5DB0, 0x8E50, 0x5DB1, + 0x8E51, 0x5DB2, 0x8E52, 0x5DB3, 0x8E53, 0x5DB4, 0x8E54, 0x5DB5, + 0x8E55, 0x5DB6, 0x8E56, 0x5DB8, 0x8E57, 0x5DB9, 0x8E58, 0x5DBA, + 0x8E59, 0x5DBB, 0x8E5A, 0x5DBC, 0x8E5B, 0x5DBD, 0x8E5C, 0x5DBE, + 0x8E5D, 0x5DBF, 0x8E5E, 0x5DC0, 0x8E5F, 0x5DC1, 0x8E60, 0x5DC2, + 0x8E61, 0x5DC3, 0x8E62, 0x5DC4, 0x8E63, 0x5DC6, 0x8E64, 0x5DC7, + 0x8E65, 0x5DC8, 0x8E66, 0x5DC9, 0x8E67, 0x5DCA, 0x8E68, 0x5DCB, + 0x8E69, 0x5DCC, 0x8E6A, 0x5DCE, 0x8E6B, 0x5DCF, 0x8E6C, 0x5DD0, + 0x8E6D, 0x5DD1, 0x8E6E, 0x5DD2, 0x8E6F, 0x5DD3, 0x8E70, 0x5DD4, + 0x8E71, 0x5DD5, 0x8E72, 0x5DD6, 0x8E73, 0x5DD7, 0x8E74, 0x5DD8, + 0x8E75, 0x5DD9, 0x8E76, 0x5DDA, 0x8E77, 0x5DDC, 0x8E78, 0x5DDF, + 0x8E79, 0x5DE0, 0x8E7A, 0x5DE3, 0x8E7B, 0x5DE4, 0x8E7C, 0x5DEA, + 0x8E7D, 0x5DEC, 0x8E7E, 0x5DED, 0x8E80, 0x5DF0, 0x8E81, 0x5DF5, + 0x8E82, 0x5DF6, 0x8E83, 0x5DF8, 0x8E84, 0x5DF9, 0x8E85, 0x5DFA, + 0x8E86, 0x5DFB, 0x8E87, 0x5DFC, 0x8E88, 0x5DFF, 0x8E89, 0x5E00, + 0x8E8A, 0x5E04, 0x8E8B, 0x5E07, 0x8E8C, 0x5E09, 0x8E8D, 0x5E0A, + 0x8E8E, 0x5E0B, 0x8E8F, 0x5E0D, 0x8E90, 0x5E0E, 0x8E91, 0x5E12, + 0x8E92, 0x5E13, 0x8E93, 0x5E17, 0x8E94, 0x5E1E, 0x8E95, 0x5E1F, + 0x8E96, 0x5E20, 0x8E97, 0x5E21, 0x8E98, 0x5E22, 0x8E99, 0x5E23, + 0x8E9A, 0x5E24, 0x8E9B, 0x5E25, 0x8E9C, 0x5E28, 0x8E9D, 0x5E29, + 0x8E9E, 0x5E2A, 0x8E9F, 0x5E2B, 0x8EA0, 0x5E2C, 0x8EA1, 0x5E2F, + 0x8EA2, 0x5E30, 0x8EA3, 0x5E32, 0x8EA4, 0x5E33, 0x8EA5, 0x5E34, + 0x8EA6, 0x5E35, 0x8EA7, 0x5E36, 0x8EA8, 0x5E39, 0x8EA9, 0x5E3A, + 0x8EAA, 0x5E3E, 0x8EAB, 0x5E3F, 0x8EAC, 0x5E40, 0x8EAD, 0x5E41, + 0x8EAE, 0x5E43, 0x8EAF, 0x5E46, 0x8EB0, 0x5E47, 0x8EB1, 0x5E48, + 0x8EB2, 0x5E49, 0x8EB3, 0x5E4A, 0x8EB4, 0x5E4B, 0x8EB5, 0x5E4D, + 0x8EB6, 0x5E4E, 0x8EB7, 0x5E4F, 0x8EB8, 0x5E50, 0x8EB9, 0x5E51, + 0x8EBA, 0x5E52, 0x8EBB, 0x5E53, 0x8EBC, 0x5E56, 0x8EBD, 0x5E57, + 0x8EBE, 0x5E58, 0x8EBF, 0x5E59, 0x8EC0, 0x5E5A, 0x8EC1, 0x5E5C, + 0x8EC2, 0x5E5D, 0x8EC3, 0x5E5F, 0x8EC4, 0x5E60, 0x8EC5, 0x5E63, + 0x8EC6, 0x5E64, 0x8EC7, 0x5E65, 0x8EC8, 0x5E66, 0x8EC9, 0x5E67, + 0x8ECA, 0x5E68, 0x8ECB, 0x5E69, 0x8ECC, 0x5E6A, 0x8ECD, 0x5E6B, + 0x8ECE, 0x5E6C, 0x8ECF, 0x5E6D, 0x8ED0, 0x5E6E, 0x8ED1, 0x5E6F, + 0x8ED2, 0x5E70, 0x8ED3, 0x5E71, 0x8ED4, 0x5E75, 0x8ED5, 0x5E77, + 0x8ED6, 0x5E79, 0x8ED7, 0x5E7E, 0x8ED8, 0x5E81, 0x8ED9, 0x5E82, + 0x8EDA, 0x5E83, 0x8EDB, 0x5E85, 0x8EDC, 0x5E88, 0x8EDD, 0x5E89, + 0x8EDE, 0x5E8C, 0x8EDF, 0x5E8D, 0x8EE0, 0x5E8E, 0x8EE1, 0x5E92, + 0x8EE2, 0x5E98, 0x8EE3, 0x5E9B, 0x8EE4, 0x5E9D, 0x8EE5, 0x5EA1, + 0x8EE6, 0x5EA2, 0x8EE7, 0x5EA3, 0x8EE8, 0x5EA4, 0x8EE9, 0x5EA8, + 0x8EEA, 0x5EA9, 0x8EEB, 0x5EAA, 0x8EEC, 0x5EAB, 0x8EED, 0x5EAC, + 0x8EEE, 0x5EAE, 0x8EEF, 0x5EAF, 0x8EF0, 0x5EB0, 0x8EF1, 0x5EB1, + 0x8EF2, 0x5EB2, 0x8EF3, 0x5EB4, 0x8EF4, 0x5EBA, 0x8EF5, 0x5EBB, + 0x8EF6, 0x5EBC, 0x8EF7, 0x5EBD, 0x8EF8, 0x5EBF, 0x8EF9, 0x5EC0, + 0x8EFA, 0x5EC1, 0x8EFB, 0x5EC2, 0x8EFC, 0x5EC3, 0x8EFD, 0x5EC4, + 0x8EFE, 0x5EC5, 0x8F40, 0x5EC6, 0x8F41, 0x5EC7, 0x8F42, 0x5EC8, + 0x8F43, 0x5ECB, 0x8F44, 0x5ECC, 0x8F45, 0x5ECD, 0x8F46, 0x5ECE, + 0x8F47, 0x5ECF, 0x8F48, 0x5ED0, 0x8F49, 0x5ED4, 0x8F4A, 0x5ED5, + 0x8F4B, 0x5ED7, 0x8F4C, 0x5ED8, 0x8F4D, 0x5ED9, 0x8F4E, 0x5EDA, + 0x8F4F, 0x5EDC, 0x8F50, 0x5EDD, 0x8F51, 0x5EDE, 0x8F52, 0x5EDF, + 0x8F53, 0x5EE0, 0x8F54, 0x5EE1, 0x8F55, 0x5EE2, 0x8F56, 0x5EE3, + 0x8F57, 0x5EE4, 0x8F58, 0x5EE5, 0x8F59, 0x5EE6, 0x8F5A, 0x5EE7, + 0x8F5B, 0x5EE9, 0x8F5C, 0x5EEB, 0x8F5D, 0x5EEC, 0x8F5E, 0x5EED, + 0x8F5F, 0x5EEE, 0x8F60, 0x5EEF, 0x8F61, 0x5EF0, 0x8F62, 0x5EF1, + 0x8F63, 0x5EF2, 0x8F64, 0x5EF3, 0x8F65, 0x5EF5, 0x8F66, 0x5EF8, + 0x8F67, 0x5EF9, 0x8F68, 0x5EFB, 0x8F69, 0x5EFC, 0x8F6A, 0x5EFD, + 0x8F6B, 0x5F05, 0x8F6C, 0x5F06, 0x8F6D, 0x5F07, 0x8F6E, 0x5F09, + 0x8F6F, 0x5F0C, 0x8F70, 0x5F0D, 0x8F71, 0x5F0E, 0x8F72, 0x5F10, + 0x8F73, 0x5F12, 0x8F74, 0x5F14, 0x8F75, 0x5F16, 0x8F76, 0x5F19, + 0x8F77, 0x5F1A, 0x8F78, 0x5F1C, 0x8F79, 0x5F1D, 0x8F7A, 0x5F1E, + 0x8F7B, 0x5F21, 0x8F7C, 0x5F22, 0x8F7D, 0x5F23, 0x8F7E, 0x5F24, + 0x8F80, 0x5F28, 0x8F81, 0x5F2B, 0x8F82, 0x5F2C, 0x8F83, 0x5F2E, + 0x8F84, 0x5F30, 0x8F85, 0x5F32, 0x8F86, 0x5F33, 0x8F87, 0x5F34, + 0x8F88, 0x5F35, 0x8F89, 0x5F36, 0x8F8A, 0x5F37, 0x8F8B, 0x5F38, + 0x8F8C, 0x5F3B, 0x8F8D, 0x5F3D, 0x8F8E, 0x5F3E, 0x8F8F, 0x5F3F, + 0x8F90, 0x5F41, 0x8F91, 0x5F42, 0x8F92, 0x5F43, 0x8F93, 0x5F44, + 0x8F94, 0x5F45, 0x8F95, 0x5F46, 0x8F96, 0x5F47, 0x8F97, 0x5F48, + 0x8F98, 0x5F49, 0x8F99, 0x5F4A, 0x8F9A, 0x5F4B, 0x8F9B, 0x5F4C, + 0x8F9C, 0x5F4D, 0x8F9D, 0x5F4E, 0x8F9E, 0x5F4F, 0x8F9F, 0x5F51, + 0x8FA0, 0x5F54, 0x8FA1, 0x5F59, 0x8FA2, 0x5F5A, 0x8FA3, 0x5F5B, + 0x8FA4, 0x5F5C, 0x8FA5, 0x5F5E, 0x8FA6, 0x5F5F, 0x8FA7, 0x5F60, + 0x8FA8, 0x5F63, 0x8FA9, 0x5F65, 0x8FAA, 0x5F67, 0x8FAB, 0x5F68, + 0x8FAC, 0x5F6B, 0x8FAD, 0x5F6E, 0x8FAE, 0x5F6F, 0x8FAF, 0x5F72, + 0x8FB0, 0x5F74, 0x8FB1, 0x5F75, 0x8FB2, 0x5F76, 0x8FB3, 0x5F78, + 0x8FB4, 0x5F7A, 0x8FB5, 0x5F7D, 0x8FB6, 0x5F7E, 0x8FB7, 0x5F7F, + 0x8FB8, 0x5F83, 0x8FB9, 0x5F86, 0x8FBA, 0x5F8D, 0x8FBB, 0x5F8E, + 0x8FBC, 0x5F8F, 0x8FBD, 0x5F91, 0x8FBE, 0x5F93, 0x8FBF, 0x5F94, + 0x8FC0, 0x5F96, 0x8FC1, 0x5F9A, 0x8FC2, 0x5F9B, 0x8FC3, 0x5F9D, + 0x8FC4, 0x5F9E, 0x8FC5, 0x5F9F, 0x8FC6, 0x5FA0, 0x8FC7, 0x5FA2, + 0x8FC8, 0x5FA3, 0x8FC9, 0x5FA4, 0x8FCA, 0x5FA5, 0x8FCB, 0x5FA6, + 0x8FCC, 0x5FA7, 0x8FCD, 0x5FA9, 0x8FCE, 0x5FAB, 0x8FCF, 0x5FAC, + 0x8FD0, 0x5FAF, 0x8FD1, 0x5FB0, 0x8FD2, 0x5FB1, 0x8FD3, 0x5FB2, + 0x8FD4, 0x5FB3, 0x8FD5, 0x5FB4, 0x8FD6, 0x5FB6, 0x8FD7, 0x5FB8, + 0x8FD8, 0x5FB9, 0x8FD9, 0x5FBA, 0x8FDA, 0x5FBB, 0x8FDB, 0x5FBE, + 0x8FDC, 0x5FBF, 0x8FDD, 0x5FC0, 0x8FDE, 0x5FC1, 0x8FDF, 0x5FC2, + 0x8FE0, 0x5FC7, 0x8FE1, 0x5FC8, 0x8FE2, 0x5FCA, 0x8FE3, 0x5FCB, + 0x8FE4, 0x5FCE, 0x8FE5, 0x5FD3, 0x8FE6, 0x5FD4, 0x8FE7, 0x5FD5, + 0x8FE8, 0x5FDA, 0x8FE9, 0x5FDB, 0x8FEA, 0x5FDC, 0x8FEB, 0x5FDE, + 0x8FEC, 0x5FDF, 0x8FED, 0x5FE2, 0x8FEE, 0x5FE3, 0x8FEF, 0x5FE5, + 0x8FF0, 0x5FE6, 0x8FF1, 0x5FE8, 0x8FF2, 0x5FE9, 0x8FF3, 0x5FEC, + 0x8FF4, 0x5FEF, 0x8FF5, 0x5FF0, 0x8FF6, 0x5FF2, 0x8FF7, 0x5FF3, + 0x8FF8, 0x5FF4, 0x8FF9, 0x5FF6, 0x8FFA, 0x5FF7, 0x8FFB, 0x5FF9, + 0x8FFC, 0x5FFA, 0x8FFD, 0x5FFC, 0x8FFE, 0x6007, 0x9040, 0x6008, + 0x9041, 0x6009, 0x9042, 0x600B, 0x9043, 0x600C, 0x9044, 0x6010, + 0x9045, 0x6011, 0x9046, 0x6013, 0x9047, 0x6017, 0x9048, 0x6018, + 0x9049, 0x601A, 0x904A, 0x601E, 0x904B, 0x601F, 0x904C, 0x6022, + 0x904D, 0x6023, 0x904E, 0x6024, 0x904F, 0x602C, 0x9050, 0x602D, + 0x9051, 0x602E, 0x9052, 0x6030, 0x9053, 0x6031, 0x9054, 0x6032, + 0x9055, 0x6033, 0x9056, 0x6034, 0x9057, 0x6036, 0x9058, 0x6037, + 0x9059, 0x6038, 0x905A, 0x6039, 0x905B, 0x603A, 0x905C, 0x603D, + 0x905D, 0x603E, 0x905E, 0x6040, 0x905F, 0x6044, 0x9060, 0x6045, + 0x9061, 0x6046, 0x9062, 0x6047, 0x9063, 0x6048, 0x9064, 0x6049, + 0x9065, 0x604A, 0x9066, 0x604C, 0x9067, 0x604E, 0x9068, 0x604F, + 0x9069, 0x6051, 0x906A, 0x6053, 0x906B, 0x6054, 0x906C, 0x6056, + 0x906D, 0x6057, 0x906E, 0x6058, 0x906F, 0x605B, 0x9070, 0x605C, + 0x9071, 0x605E, 0x9072, 0x605F, 0x9073, 0x6060, 0x9074, 0x6061, + 0x9075, 0x6065, 0x9076, 0x6066, 0x9077, 0x606E, 0x9078, 0x6071, + 0x9079, 0x6072, 0x907A, 0x6074, 0x907B, 0x6075, 0x907C, 0x6077, + 0x907D, 0x607E, 0x907E, 0x6080, 0x9080, 0x6081, 0x9081, 0x6082, + 0x9082, 0x6085, 0x9083, 0x6086, 0x9084, 0x6087, 0x9085, 0x6088, + 0x9086, 0x608A, 0x9087, 0x608B, 0x9088, 0x608E, 0x9089, 0x608F, + 0x908A, 0x6090, 0x908B, 0x6091, 0x908C, 0x6093, 0x908D, 0x6095, + 0x908E, 0x6097, 0x908F, 0x6098, 0x9090, 0x6099, 0x9091, 0x609C, + 0x9092, 0x609E, 0x9093, 0x60A1, 0x9094, 0x60A2, 0x9095, 0x60A4, + 0x9096, 0x60A5, 0x9097, 0x60A7, 0x9098, 0x60A9, 0x9099, 0x60AA, + 0x909A, 0x60AE, 0x909B, 0x60B0, 0x909C, 0x60B3, 0x909D, 0x60B5, + 0x909E, 0x60B6, 0x909F, 0x60B7, 0x90A0, 0x60B9, 0x90A1, 0x60BA, + 0x90A2, 0x60BD, 0x90A3, 0x60BE, 0x90A4, 0x60BF, 0x90A5, 0x60C0, + 0x90A6, 0x60C1, 0x90A7, 0x60C2, 0x90A8, 0x60C3, 0x90A9, 0x60C4, + 0x90AA, 0x60C7, 0x90AB, 0x60C8, 0x90AC, 0x60C9, 0x90AD, 0x60CC, + 0x90AE, 0x60CD, 0x90AF, 0x60CE, 0x90B0, 0x60CF, 0x90B1, 0x60D0, + 0x90B2, 0x60D2, 0x90B3, 0x60D3, 0x90B4, 0x60D4, 0x90B5, 0x60D6, + 0x90B6, 0x60D7, 0x90B7, 0x60D9, 0x90B8, 0x60DB, 0x90B9, 0x60DE, + 0x90BA, 0x60E1, 0x90BB, 0x60E2, 0x90BC, 0x60E3, 0x90BD, 0x60E4, + 0x90BE, 0x60E5, 0x90BF, 0x60EA, 0x90C0, 0x60F1, 0x90C1, 0x60F2, + 0x90C2, 0x60F5, 0x90C3, 0x60F7, 0x90C4, 0x60F8, 0x90C5, 0x60FB, + 0x90C6, 0x60FC, 0x90C7, 0x60FD, 0x90C8, 0x60FE, 0x90C9, 0x60FF, + 0x90CA, 0x6102, 0x90CB, 0x6103, 0x90CC, 0x6104, 0x90CD, 0x6105, + 0x90CE, 0x6107, 0x90CF, 0x610A, 0x90D0, 0x610B, 0x90D1, 0x610C, + 0x90D2, 0x6110, 0x90D3, 0x6111, 0x90D4, 0x6112, 0x90D5, 0x6113, + 0x90D6, 0x6114, 0x90D7, 0x6116, 0x90D8, 0x6117, 0x90D9, 0x6118, + 0x90DA, 0x6119, 0x90DB, 0x611B, 0x90DC, 0x611C, 0x90DD, 0x611D, + 0x90DE, 0x611E, 0x90DF, 0x6121, 0x90E0, 0x6122, 0x90E1, 0x6125, + 0x90E2, 0x6128, 0x90E3, 0x6129, 0x90E4, 0x612A, 0x90E5, 0x612C, + 0x90E6, 0x612D, 0x90E7, 0x612E, 0x90E8, 0x612F, 0x90E9, 0x6130, + 0x90EA, 0x6131, 0x90EB, 0x6132, 0x90EC, 0x6133, 0x90ED, 0x6134, + 0x90EE, 0x6135, 0x90EF, 0x6136, 0x90F0, 0x6137, 0x90F1, 0x6138, + 0x90F2, 0x6139, 0x90F3, 0x613A, 0x90F4, 0x613B, 0x90F5, 0x613C, + 0x90F6, 0x613D, 0x90F7, 0x613E, 0x90F8, 0x6140, 0x90F9, 0x6141, + 0x90FA, 0x6142, 0x90FB, 0x6143, 0x90FC, 0x6144, 0x90FD, 0x6145, + 0x90FE, 0x6146, 0x9140, 0x6147, 0x9141, 0x6149, 0x9142, 0x614B, + 0x9143, 0x614D, 0x9144, 0x614F, 0x9145, 0x6150, 0x9146, 0x6152, + 0x9147, 0x6153, 0x9148, 0x6154, 0x9149, 0x6156, 0x914A, 0x6157, + 0x914B, 0x6158, 0x914C, 0x6159, 0x914D, 0x615A, 0x914E, 0x615B, + 0x914F, 0x615C, 0x9150, 0x615E, 0x9151, 0x615F, 0x9152, 0x6160, + 0x9153, 0x6161, 0x9154, 0x6163, 0x9155, 0x6164, 0x9156, 0x6165, + 0x9157, 0x6166, 0x9158, 0x6169, 0x9159, 0x616A, 0x915A, 0x616B, + 0x915B, 0x616C, 0x915C, 0x616D, 0x915D, 0x616E, 0x915E, 0x616F, + 0x915F, 0x6171, 0x9160, 0x6172, 0x9161, 0x6173, 0x9162, 0x6174, + 0x9163, 0x6176, 0x9164, 0x6178, 0x9165, 0x6179, 0x9166, 0x617A, + 0x9167, 0x617B, 0x9168, 0x617C, 0x9169, 0x617D, 0x916A, 0x617E, + 0x916B, 0x617F, 0x916C, 0x6180, 0x916D, 0x6181, 0x916E, 0x6182, + 0x916F, 0x6183, 0x9170, 0x6184, 0x9171, 0x6185, 0x9172, 0x6186, + 0x9173, 0x6187, 0x9174, 0x6188, 0x9175, 0x6189, 0x9176, 0x618A, + 0x9177, 0x618C, 0x9178, 0x618D, 0x9179, 0x618F, 0x917A, 0x6190, + 0x917B, 0x6191, 0x917C, 0x6192, 0x917D, 0x6193, 0x917E, 0x6195, + 0x9180, 0x6196, 0x9181, 0x6197, 0x9182, 0x6198, 0x9183, 0x6199, + 0x9184, 0x619A, 0x9185, 0x619B, 0x9186, 0x619C, 0x9187, 0x619E, + 0x9188, 0x619F, 0x9189, 0x61A0, 0x918A, 0x61A1, 0x918B, 0x61A2, + 0x918C, 0x61A3, 0x918D, 0x61A4, 0x918E, 0x61A5, 0x918F, 0x61A6, + 0x9190, 0x61AA, 0x9191, 0x61AB, 0x9192, 0x61AD, 0x9193, 0x61AE, + 0x9194, 0x61AF, 0x9195, 0x61B0, 0x9196, 0x61B1, 0x9197, 0x61B2, + 0x9198, 0x61B3, 0x9199, 0x61B4, 0x919A, 0x61B5, 0x919B, 0x61B6, + 0x919C, 0x61B8, 0x919D, 0x61B9, 0x919E, 0x61BA, 0x919F, 0x61BB, + 0x91A0, 0x61BC, 0x91A1, 0x61BD, 0x91A2, 0x61BF, 0x91A3, 0x61C0, + 0x91A4, 0x61C1, 0x91A5, 0x61C3, 0x91A6, 0x61C4, 0x91A7, 0x61C5, + 0x91A8, 0x61C6, 0x91A9, 0x61C7, 0x91AA, 0x61C9, 0x91AB, 0x61CC, + 0x91AC, 0x61CD, 0x91AD, 0x61CE, 0x91AE, 0x61CF, 0x91AF, 0x61D0, + 0x91B0, 0x61D3, 0x91B1, 0x61D5, 0x91B2, 0x61D6, 0x91B3, 0x61D7, + 0x91B4, 0x61D8, 0x91B5, 0x61D9, 0x91B6, 0x61DA, 0x91B7, 0x61DB, + 0x91B8, 0x61DC, 0x91B9, 0x61DD, 0x91BA, 0x61DE, 0x91BB, 0x61DF, + 0x91BC, 0x61E0, 0x91BD, 0x61E1, 0x91BE, 0x61E2, 0x91BF, 0x61E3, + 0x91C0, 0x61E4, 0x91C1, 0x61E5, 0x91C2, 0x61E7, 0x91C3, 0x61E8, + 0x91C4, 0x61E9, 0x91C5, 0x61EA, 0x91C6, 0x61EB, 0x91C7, 0x61EC, + 0x91C8, 0x61ED, 0x91C9, 0x61EE, 0x91CA, 0x61EF, 0x91CB, 0x61F0, + 0x91CC, 0x61F1, 0x91CD, 0x61F2, 0x91CE, 0x61F3, 0x91CF, 0x61F4, + 0x91D0, 0x61F6, 0x91D1, 0x61F7, 0x91D2, 0x61F8, 0x91D3, 0x61F9, + 0x91D4, 0x61FA, 0x91D5, 0x61FB, 0x91D6, 0x61FC, 0x91D7, 0x61FD, + 0x91D8, 0x61FE, 0x91D9, 0x6200, 0x91DA, 0x6201, 0x91DB, 0x6202, + 0x91DC, 0x6203, 0x91DD, 0x6204, 0x91DE, 0x6205, 0x91DF, 0x6207, + 0x91E0, 0x6209, 0x91E1, 0x6213, 0x91E2, 0x6214, 0x91E3, 0x6219, + 0x91E4, 0x621C, 0x91E5, 0x621D, 0x91E6, 0x621E, 0x91E7, 0x6220, + 0x91E8, 0x6223, 0x91E9, 0x6226, 0x91EA, 0x6227, 0x91EB, 0x6228, + 0x91EC, 0x6229, 0x91ED, 0x622B, 0x91EE, 0x622D, 0x91EF, 0x622F, + 0x91F0, 0x6230, 0x91F1, 0x6231, 0x91F2, 0x6232, 0x91F3, 0x6235, + 0x91F4, 0x6236, 0x91F5, 0x6238, 0x91F6, 0x6239, 0x91F7, 0x623A, + 0x91F8, 0x623B, 0x91F9, 0x623C, 0x91FA, 0x6242, 0x91FB, 0x6244, + 0x91FC, 0x6245, 0x91FD, 0x6246, 0x91FE, 0x624A, 0x9240, 0x624F, + 0x9241, 0x6250, 0x9242, 0x6255, 0x9243, 0x6256, 0x9244, 0x6257, + 0x9245, 0x6259, 0x9246, 0x625A, 0x9247, 0x625C, 0x9248, 0x625D, + 0x9249, 0x625E, 0x924A, 0x625F, 0x924B, 0x6260, 0x924C, 0x6261, + 0x924D, 0x6262, 0x924E, 0x6264, 0x924F, 0x6265, 0x9250, 0x6268, + 0x9251, 0x6271, 0x9252, 0x6272, 0x9253, 0x6274, 0x9254, 0x6275, + 0x9255, 0x6277, 0x9256, 0x6278, 0x9257, 0x627A, 0x9258, 0x627B, + 0x9259, 0x627D, 0x925A, 0x6281, 0x925B, 0x6282, 0x925C, 0x6283, + 0x925D, 0x6285, 0x925E, 0x6286, 0x925F, 0x6287, 0x9260, 0x6288, + 0x9261, 0x628B, 0x9262, 0x628C, 0x9263, 0x628D, 0x9264, 0x628E, + 0x9265, 0x628F, 0x9266, 0x6290, 0x9267, 0x6294, 0x9268, 0x6299, + 0x9269, 0x629C, 0x926A, 0x629D, 0x926B, 0x629E, 0x926C, 0x62A3, + 0x926D, 0x62A6, 0x926E, 0x62A7, 0x926F, 0x62A9, 0x9270, 0x62AA, + 0x9271, 0x62AD, 0x9272, 0x62AE, 0x9273, 0x62AF, 0x9274, 0x62B0, + 0x9275, 0x62B2, 0x9276, 0x62B3, 0x9277, 0x62B4, 0x9278, 0x62B6, + 0x9279, 0x62B7, 0x927A, 0x62B8, 0x927B, 0x62BA, 0x927C, 0x62BE, + 0x927D, 0x62C0, 0x927E, 0x62C1, 0x9280, 0x62C3, 0x9281, 0x62CB, + 0x9282, 0x62CF, 0x9283, 0x62D1, 0x9284, 0x62D5, 0x9285, 0x62DD, + 0x9286, 0x62DE, 0x9287, 0x62E0, 0x9288, 0x62E1, 0x9289, 0x62E4, + 0x928A, 0x62EA, 0x928B, 0x62EB, 0x928C, 0x62F0, 0x928D, 0x62F2, + 0x928E, 0x62F5, 0x928F, 0x62F8, 0x9290, 0x62F9, 0x9291, 0x62FA, + 0x9292, 0x62FB, 0x9293, 0x6300, 0x9294, 0x6303, 0x9295, 0x6304, + 0x9296, 0x6305, 0x9297, 0x6306, 0x9298, 0x630A, 0x9299, 0x630B, + 0x929A, 0x630C, 0x929B, 0x630D, 0x929C, 0x630F, 0x929D, 0x6310, + 0x929E, 0x6312, 0x929F, 0x6313, 0x92A0, 0x6314, 0x92A1, 0x6315, + 0x92A2, 0x6317, 0x92A3, 0x6318, 0x92A4, 0x6319, 0x92A5, 0x631C, + 0x92A6, 0x6326, 0x92A7, 0x6327, 0x92A8, 0x6329, 0x92A9, 0x632C, + 0x92AA, 0x632D, 0x92AB, 0x632E, 0x92AC, 0x6330, 0x92AD, 0x6331, + 0x92AE, 0x6333, 0x92AF, 0x6334, 0x92B0, 0x6335, 0x92B1, 0x6336, + 0x92B2, 0x6337, 0x92B3, 0x6338, 0x92B4, 0x633B, 0x92B5, 0x633C, + 0x92B6, 0x633E, 0x92B7, 0x633F, 0x92B8, 0x6340, 0x92B9, 0x6341, + 0x92BA, 0x6344, 0x92BB, 0x6347, 0x92BC, 0x6348, 0x92BD, 0x634A, + 0x92BE, 0x6351, 0x92BF, 0x6352, 0x92C0, 0x6353, 0x92C1, 0x6354, + 0x92C2, 0x6356, 0x92C3, 0x6357, 0x92C4, 0x6358, 0x92C5, 0x6359, + 0x92C6, 0x635A, 0x92C7, 0x635B, 0x92C8, 0x635C, 0x92C9, 0x635D, + 0x92CA, 0x6360, 0x92CB, 0x6364, 0x92CC, 0x6365, 0x92CD, 0x6366, + 0x92CE, 0x6368, 0x92CF, 0x636A, 0x92D0, 0x636B, 0x92D1, 0x636C, + 0x92D2, 0x636F, 0x92D3, 0x6370, 0x92D4, 0x6372, 0x92D5, 0x6373, + 0x92D6, 0x6374, 0x92D7, 0x6375, 0x92D8, 0x6378, 0x92D9, 0x6379, + 0x92DA, 0x637C, 0x92DB, 0x637D, 0x92DC, 0x637E, 0x92DD, 0x637F, + 0x92DE, 0x6381, 0x92DF, 0x6383, 0x92E0, 0x6384, 0x92E1, 0x6385, + 0x92E2, 0x6386, 0x92E3, 0x638B, 0x92E4, 0x638D, 0x92E5, 0x6391, + 0x92E6, 0x6393, 0x92E7, 0x6394, 0x92E8, 0x6395, 0x92E9, 0x6397, + 0x92EA, 0x6399, 0x92EB, 0x639A, 0x92EC, 0x639B, 0x92ED, 0x639C, + 0x92EE, 0x639D, 0x92EF, 0x639E, 0x92F0, 0x639F, 0x92F1, 0x63A1, + 0x92F2, 0x63A4, 0x92F3, 0x63A6, 0x92F4, 0x63AB, 0x92F5, 0x63AF, + 0x92F6, 0x63B1, 0x92F7, 0x63B2, 0x92F8, 0x63B5, 0x92F9, 0x63B6, + 0x92FA, 0x63B9, 0x92FB, 0x63BB, 0x92FC, 0x63BD, 0x92FD, 0x63BF, + 0x92FE, 0x63C0, 0x9340, 0x63C1, 0x9341, 0x63C2, 0x9342, 0x63C3, + 0x9343, 0x63C5, 0x9344, 0x63C7, 0x9345, 0x63C8, 0x9346, 0x63CA, + 0x9347, 0x63CB, 0x9348, 0x63CC, 0x9349, 0x63D1, 0x934A, 0x63D3, + 0x934B, 0x63D4, 0x934C, 0x63D5, 0x934D, 0x63D7, 0x934E, 0x63D8, + 0x934F, 0x63D9, 0x9350, 0x63DA, 0x9351, 0x63DB, 0x9352, 0x63DC, + 0x9353, 0x63DD, 0x9354, 0x63DF, 0x9355, 0x63E2, 0x9356, 0x63E4, + 0x9357, 0x63E5, 0x9358, 0x63E6, 0x9359, 0x63E7, 0x935A, 0x63E8, + 0x935B, 0x63EB, 0x935C, 0x63EC, 0x935D, 0x63EE, 0x935E, 0x63EF, + 0x935F, 0x63F0, 0x9360, 0x63F1, 0x9361, 0x63F3, 0x9362, 0x63F5, + 0x9363, 0x63F7, 0x9364, 0x63F9, 0x9365, 0x63FA, 0x9366, 0x63FB, + 0x9367, 0x63FC, 0x9368, 0x63FE, 0x9369, 0x6403, 0x936A, 0x6404, + 0x936B, 0x6406, 0x936C, 0x6407, 0x936D, 0x6408, 0x936E, 0x6409, + 0x936F, 0x640A, 0x9370, 0x640D, 0x9371, 0x640E, 0x9372, 0x6411, + 0x9373, 0x6412, 0x9374, 0x6415, 0x9375, 0x6416, 0x9376, 0x6417, + 0x9377, 0x6418, 0x9378, 0x6419, 0x9379, 0x641A, 0x937A, 0x641D, + 0x937B, 0x641F, 0x937C, 0x6422, 0x937D, 0x6423, 0x937E, 0x6424, + 0x9380, 0x6425, 0x9381, 0x6427, 0x9382, 0x6428, 0x9383, 0x6429, + 0x9384, 0x642B, 0x9385, 0x642E, 0x9386, 0x642F, 0x9387, 0x6430, + 0x9388, 0x6431, 0x9389, 0x6432, 0x938A, 0x6433, 0x938B, 0x6435, + 0x938C, 0x6436, 0x938D, 0x6437, 0x938E, 0x6438, 0x938F, 0x6439, + 0x9390, 0x643B, 0x9391, 0x643C, 0x9392, 0x643E, 0x9393, 0x6440, + 0x9394, 0x6442, 0x9395, 0x6443, 0x9396, 0x6449, 0x9397, 0x644B, + 0x9398, 0x644C, 0x9399, 0x644D, 0x939A, 0x644E, 0x939B, 0x644F, + 0x939C, 0x6450, 0x939D, 0x6451, 0x939E, 0x6453, 0x939F, 0x6455, + 0x93A0, 0x6456, 0x93A1, 0x6457, 0x93A2, 0x6459, 0x93A3, 0x645A, + 0x93A4, 0x645B, 0x93A5, 0x645C, 0x93A6, 0x645D, 0x93A7, 0x645F, + 0x93A8, 0x6460, 0x93A9, 0x6461, 0x93AA, 0x6462, 0x93AB, 0x6463, + 0x93AC, 0x6464, 0x93AD, 0x6465, 0x93AE, 0x6466, 0x93AF, 0x6468, + 0x93B0, 0x646A, 0x93B1, 0x646B, 0x93B2, 0x646C, 0x93B3, 0x646E, + 0x93B4, 0x646F, 0x93B5, 0x6470, 0x93B6, 0x6471, 0x93B7, 0x6472, + 0x93B8, 0x6473, 0x93B9, 0x6474, 0x93BA, 0x6475, 0x93BB, 0x6476, + 0x93BC, 0x6477, 0x93BD, 0x647B, 0x93BE, 0x647C, 0x93BF, 0x647D, + 0x93C0, 0x647E, 0x93C1, 0x647F, 0x93C2, 0x6480, 0x93C3, 0x6481, + 0x93C4, 0x6483, 0x93C5, 0x6486, 0x93C6, 0x6488, 0x93C7, 0x6489, + 0x93C8, 0x648A, 0x93C9, 0x648B, 0x93CA, 0x648C, 0x93CB, 0x648D, + 0x93CC, 0x648E, 0x93CD, 0x648F, 0x93CE, 0x6490, 0x93CF, 0x6493, + 0x93D0, 0x6494, 0x93D1, 0x6497, 0x93D2, 0x6498, 0x93D3, 0x649A, + 0x93D4, 0x649B, 0x93D5, 0x649C, 0x93D6, 0x649D, 0x93D7, 0x649F, + 0x93D8, 0x64A0, 0x93D9, 0x64A1, 0x93DA, 0x64A2, 0x93DB, 0x64A3, + 0x93DC, 0x64A5, 0x93DD, 0x64A6, 0x93DE, 0x64A7, 0x93DF, 0x64A8, + 0x93E0, 0x64AA, 0x93E1, 0x64AB, 0x93E2, 0x64AF, 0x93E3, 0x64B1, + 0x93E4, 0x64B2, 0x93E5, 0x64B3, 0x93E6, 0x64B4, 0x93E7, 0x64B6, + 0x93E8, 0x64B9, 0x93E9, 0x64BB, 0x93EA, 0x64BD, 0x93EB, 0x64BE, + 0x93EC, 0x64BF, 0x93ED, 0x64C1, 0x93EE, 0x64C3, 0x93EF, 0x64C4, + 0x93F0, 0x64C6, 0x93F1, 0x64C7, 0x93F2, 0x64C8, 0x93F3, 0x64C9, + 0x93F4, 0x64CA, 0x93F5, 0x64CB, 0x93F6, 0x64CC, 0x93F7, 0x64CF, + 0x93F8, 0x64D1, 0x93F9, 0x64D3, 0x93FA, 0x64D4, 0x93FB, 0x64D5, + 0x93FC, 0x64D6, 0x93FD, 0x64D9, 0x93FE, 0x64DA, 0x9440, 0x64DB, + 0x9441, 0x64DC, 0x9442, 0x64DD, 0x9443, 0x64DF, 0x9444, 0x64E0, + 0x9445, 0x64E1, 0x9446, 0x64E3, 0x9447, 0x64E5, 0x9448, 0x64E7, + 0x9449, 0x64E8, 0x944A, 0x64E9, 0x944B, 0x64EA, 0x944C, 0x64EB, + 0x944D, 0x64EC, 0x944E, 0x64ED, 0x944F, 0x64EE, 0x9450, 0x64EF, + 0x9451, 0x64F0, 0x9452, 0x64F1, 0x9453, 0x64F2, 0x9454, 0x64F3, + 0x9455, 0x64F4, 0x9456, 0x64F5, 0x9457, 0x64F6, 0x9458, 0x64F7, + 0x9459, 0x64F8, 0x945A, 0x64F9, 0x945B, 0x64FA, 0x945C, 0x64FB, + 0x945D, 0x64FC, 0x945E, 0x64FD, 0x945F, 0x64FE, 0x9460, 0x64FF, + 0x9461, 0x6501, 0x9462, 0x6502, 0x9463, 0x6503, 0x9464, 0x6504, + 0x9465, 0x6505, 0x9466, 0x6506, 0x9467, 0x6507, 0x9468, 0x6508, + 0x9469, 0x650A, 0x946A, 0x650B, 0x946B, 0x650C, 0x946C, 0x650D, + 0x946D, 0x650E, 0x946E, 0x650F, 0x946F, 0x6510, 0x9470, 0x6511, + 0x9471, 0x6513, 0x9472, 0x6514, 0x9473, 0x6515, 0x9474, 0x6516, + 0x9475, 0x6517, 0x9476, 0x6519, 0x9477, 0x651A, 0x9478, 0x651B, + 0x9479, 0x651C, 0x947A, 0x651D, 0x947B, 0x651E, 0x947C, 0x651F, + 0x947D, 0x6520, 0x947E, 0x6521, 0x9480, 0x6522, 0x9481, 0x6523, + 0x9482, 0x6524, 0x9483, 0x6526, 0x9484, 0x6527, 0x9485, 0x6528, + 0x9486, 0x6529, 0x9487, 0x652A, 0x9488, 0x652C, 0x9489, 0x652D, + 0x948A, 0x6530, 0x948B, 0x6531, 0x948C, 0x6532, 0x948D, 0x6533, + 0x948E, 0x6537, 0x948F, 0x653A, 0x9490, 0x653C, 0x9491, 0x653D, + 0x9492, 0x6540, 0x9493, 0x6541, 0x9494, 0x6542, 0x9495, 0x6543, + 0x9496, 0x6544, 0x9497, 0x6546, 0x9498, 0x6547, 0x9499, 0x654A, + 0x949A, 0x654B, 0x949B, 0x654D, 0x949C, 0x654E, 0x949D, 0x6550, + 0x949E, 0x6552, 0x949F, 0x6553, 0x94A0, 0x6554, 0x94A1, 0x6557, + 0x94A2, 0x6558, 0x94A3, 0x655A, 0x94A4, 0x655C, 0x94A5, 0x655F, + 0x94A6, 0x6560, 0x94A7, 0x6561, 0x94A8, 0x6564, 0x94A9, 0x6565, + 0x94AA, 0x6567, 0x94AB, 0x6568, 0x94AC, 0x6569, 0x94AD, 0x656A, + 0x94AE, 0x656D, 0x94AF, 0x656E, 0x94B0, 0x656F, 0x94B1, 0x6571, + 0x94B2, 0x6573, 0x94B3, 0x6575, 0x94B4, 0x6576, 0x94B5, 0x6578, + 0x94B6, 0x6579, 0x94B7, 0x657A, 0x94B8, 0x657B, 0x94B9, 0x657C, + 0x94BA, 0x657D, 0x94BB, 0x657E, 0x94BC, 0x657F, 0x94BD, 0x6580, + 0x94BE, 0x6581, 0x94BF, 0x6582, 0x94C0, 0x6583, 0x94C1, 0x6584, + 0x94C2, 0x6585, 0x94C3, 0x6586, 0x94C4, 0x6588, 0x94C5, 0x6589, + 0x94C6, 0x658A, 0x94C7, 0x658D, 0x94C8, 0x658E, 0x94C9, 0x658F, + 0x94CA, 0x6592, 0x94CB, 0x6594, 0x94CC, 0x6595, 0x94CD, 0x6596, + 0x94CE, 0x6598, 0x94CF, 0x659A, 0x94D0, 0x659D, 0x94D1, 0x659E, + 0x94D2, 0x65A0, 0x94D3, 0x65A2, 0x94D4, 0x65A3, 0x94D5, 0x65A6, + 0x94D6, 0x65A8, 0x94D7, 0x65AA, 0x94D8, 0x65AC, 0x94D9, 0x65AE, + 0x94DA, 0x65B1, 0x94DB, 0x65B2, 0x94DC, 0x65B3, 0x94DD, 0x65B4, + 0x94DE, 0x65B5, 0x94DF, 0x65B6, 0x94E0, 0x65B7, 0x94E1, 0x65B8, + 0x94E2, 0x65BA, 0x94E3, 0x65BB, 0x94E4, 0x65BE, 0x94E5, 0x65BF, + 0x94E6, 0x65C0, 0x94E7, 0x65C2, 0x94E8, 0x65C7, 0x94E9, 0x65C8, + 0x94EA, 0x65C9, 0x94EB, 0x65CA, 0x94EC, 0x65CD, 0x94ED, 0x65D0, + 0x94EE, 0x65D1, 0x94EF, 0x65D3, 0x94F0, 0x65D4, 0x94F1, 0x65D5, + 0x94F2, 0x65D8, 0x94F3, 0x65D9, 0x94F4, 0x65DA, 0x94F5, 0x65DB, + 0x94F6, 0x65DC, 0x94F7, 0x65DD, 0x94F8, 0x65DE, 0x94F9, 0x65DF, + 0x94FA, 0x65E1, 0x94FB, 0x65E3, 0x94FC, 0x65E4, 0x94FD, 0x65EA, + 0x94FE, 0x65EB, 0x9540, 0x65F2, 0x9541, 0x65F3, 0x9542, 0x65F4, + 0x9543, 0x65F5, 0x9544, 0x65F8, 0x9545, 0x65F9, 0x9546, 0x65FB, + 0x9547, 0x65FC, 0x9548, 0x65FD, 0x9549, 0x65FE, 0x954A, 0x65FF, + 0x954B, 0x6601, 0x954C, 0x6604, 0x954D, 0x6605, 0x954E, 0x6607, + 0x954F, 0x6608, 0x9550, 0x6609, 0x9551, 0x660B, 0x9552, 0x660D, + 0x9553, 0x6610, 0x9554, 0x6611, 0x9555, 0x6612, 0x9556, 0x6616, + 0x9557, 0x6617, 0x9558, 0x6618, 0x9559, 0x661A, 0x955A, 0x661B, + 0x955B, 0x661C, 0x955C, 0x661E, 0x955D, 0x6621, 0x955E, 0x6622, + 0x955F, 0x6623, 0x9560, 0x6624, 0x9561, 0x6626, 0x9562, 0x6629, + 0x9563, 0x662A, 0x9564, 0x662B, 0x9565, 0x662C, 0x9566, 0x662E, + 0x9567, 0x6630, 0x9568, 0x6632, 0x9569, 0x6633, 0x956A, 0x6637, + 0x956B, 0x6638, 0x956C, 0x6639, 0x956D, 0x663A, 0x956E, 0x663B, + 0x956F, 0x663D, 0x9570, 0x663F, 0x9571, 0x6640, 0x9572, 0x6642, + 0x9573, 0x6644, 0x9574, 0x6645, 0x9575, 0x6646, 0x9576, 0x6647, + 0x9577, 0x6648, 0x9578, 0x6649, 0x9579, 0x664A, 0x957A, 0x664D, + 0x957B, 0x664E, 0x957C, 0x6650, 0x957D, 0x6651, 0x957E, 0x6658, + 0x9580, 0x6659, 0x9581, 0x665B, 0x9582, 0x665C, 0x9583, 0x665D, + 0x9584, 0x665E, 0x9585, 0x6660, 0x9586, 0x6662, 0x9587, 0x6663, + 0x9588, 0x6665, 0x9589, 0x6667, 0x958A, 0x6669, 0x958B, 0x666A, + 0x958C, 0x666B, 0x958D, 0x666C, 0x958E, 0x666D, 0x958F, 0x6671, + 0x9590, 0x6672, 0x9591, 0x6673, 0x9592, 0x6675, 0x9593, 0x6678, + 0x9594, 0x6679, 0x9595, 0x667B, 0x9596, 0x667C, 0x9597, 0x667D, + 0x9598, 0x667F, 0x9599, 0x6680, 0x959A, 0x6681, 0x959B, 0x6683, + 0x959C, 0x6685, 0x959D, 0x6686, 0x959E, 0x6688, 0x959F, 0x6689, + 0x95A0, 0x668A, 0x95A1, 0x668B, 0x95A2, 0x668D, 0x95A3, 0x668E, + 0x95A4, 0x668F, 0x95A5, 0x6690, 0x95A6, 0x6692, 0x95A7, 0x6693, + 0x95A8, 0x6694, 0x95A9, 0x6695, 0x95AA, 0x6698, 0x95AB, 0x6699, + 0x95AC, 0x669A, 0x95AD, 0x669B, 0x95AE, 0x669C, 0x95AF, 0x669E, + 0x95B0, 0x669F, 0x95B1, 0x66A0, 0x95B2, 0x66A1, 0x95B3, 0x66A2, + 0x95B4, 0x66A3, 0x95B5, 0x66A4, 0x95B6, 0x66A5, 0x95B7, 0x66A6, + 0x95B8, 0x66A9, 0x95B9, 0x66AA, 0x95BA, 0x66AB, 0x95BB, 0x66AC, + 0x95BC, 0x66AD, 0x95BD, 0x66AF, 0x95BE, 0x66B0, 0x95BF, 0x66B1, + 0x95C0, 0x66B2, 0x95C1, 0x66B3, 0x95C2, 0x66B5, 0x95C3, 0x66B6, + 0x95C4, 0x66B7, 0x95C5, 0x66B8, 0x95C6, 0x66BA, 0x95C7, 0x66BB, + 0x95C8, 0x66BC, 0x95C9, 0x66BD, 0x95CA, 0x66BF, 0x95CB, 0x66C0, + 0x95CC, 0x66C1, 0x95CD, 0x66C2, 0x95CE, 0x66C3, 0x95CF, 0x66C4, + 0x95D0, 0x66C5, 0x95D1, 0x66C6, 0x95D2, 0x66C7, 0x95D3, 0x66C8, + 0x95D4, 0x66C9, 0x95D5, 0x66CA, 0x95D6, 0x66CB, 0x95D7, 0x66CC, + 0x95D8, 0x66CD, 0x95D9, 0x66CE, 0x95DA, 0x66CF, 0x95DB, 0x66D0, + 0x95DC, 0x66D1, 0x95DD, 0x66D2, 0x95DE, 0x66D3, 0x95DF, 0x66D4, + 0x95E0, 0x66D5, 0x95E1, 0x66D6, 0x95E2, 0x66D7, 0x95E3, 0x66D8, + 0x95E4, 0x66DA, 0x95E5, 0x66DE, 0x95E6, 0x66DF, 0x95E7, 0x66E0, + 0x95E8, 0x66E1, 0x95E9, 0x66E2, 0x95EA, 0x66E3, 0x95EB, 0x66E4, + 0x95EC, 0x66E5, 0x95ED, 0x66E7, 0x95EE, 0x66E8, 0x95EF, 0x66EA, + 0x95F0, 0x66EB, 0x95F1, 0x66EC, 0x95F2, 0x66ED, 0x95F3, 0x66EE, + 0x95F4, 0x66EF, 0x95F5, 0x66F1, 0x95F6, 0x66F5, 0x95F7, 0x66F6, + 0x95F8, 0x66F8, 0x95F9, 0x66FA, 0x95FA, 0x66FB, 0x95FB, 0x66FD, + 0x95FC, 0x6701, 0x95FD, 0x6702, 0x95FE, 0x6703, 0x9640, 0x6704, + 0x9641, 0x6705, 0x9642, 0x6706, 0x9643, 0x6707, 0x9644, 0x670C, + 0x9645, 0x670E, 0x9646, 0x670F, 0x9647, 0x6711, 0x9648, 0x6712, + 0x9649, 0x6713, 0x964A, 0x6716, 0x964B, 0x6718, 0x964C, 0x6719, + 0x964D, 0x671A, 0x964E, 0x671C, 0x964F, 0x671E, 0x9650, 0x6720, + 0x9651, 0x6721, 0x9652, 0x6722, 0x9653, 0x6723, 0x9654, 0x6724, + 0x9655, 0x6725, 0x9656, 0x6727, 0x9657, 0x6729, 0x9658, 0x672E, + 0x9659, 0x6730, 0x965A, 0x6732, 0x965B, 0x6733, 0x965C, 0x6736, + 0x965D, 0x6737, 0x965E, 0x6738, 0x965F, 0x6739, 0x9660, 0x673B, + 0x9661, 0x673C, 0x9662, 0x673E, 0x9663, 0x673F, 0x9664, 0x6741, + 0x9665, 0x6744, 0x9666, 0x6745, 0x9667, 0x6747, 0x9668, 0x674A, + 0x9669, 0x674B, 0x966A, 0x674D, 0x966B, 0x6752, 0x966C, 0x6754, + 0x966D, 0x6755, 0x966E, 0x6757, 0x966F, 0x6758, 0x9670, 0x6759, + 0x9671, 0x675A, 0x9672, 0x675B, 0x9673, 0x675D, 0x9674, 0x6762, + 0x9675, 0x6763, 0x9676, 0x6764, 0x9677, 0x6766, 0x9678, 0x6767, + 0x9679, 0x676B, 0x967A, 0x676C, 0x967B, 0x676E, 0x967C, 0x6771, + 0x967D, 0x6774, 0x967E, 0x6776, 0x9680, 0x6778, 0x9681, 0x6779, + 0x9682, 0x677A, 0x9683, 0x677B, 0x9684, 0x677D, 0x9685, 0x6780, + 0x9686, 0x6782, 0x9687, 0x6783, 0x9688, 0x6785, 0x9689, 0x6786, + 0x968A, 0x6788, 0x968B, 0x678A, 0x968C, 0x678C, 0x968D, 0x678D, + 0x968E, 0x678E, 0x968F, 0x678F, 0x9690, 0x6791, 0x9691, 0x6792, + 0x9692, 0x6793, 0x9693, 0x6794, 0x9694, 0x6796, 0x9695, 0x6799, + 0x9696, 0x679B, 0x9697, 0x679F, 0x9698, 0x67A0, 0x9699, 0x67A1, + 0x969A, 0x67A4, 0x969B, 0x67A6, 0x969C, 0x67A9, 0x969D, 0x67AC, + 0x969E, 0x67AE, 0x969F, 0x67B1, 0x96A0, 0x67B2, 0x96A1, 0x67B4, + 0x96A2, 0x67B9, 0x96A3, 0x67BA, 0x96A4, 0x67BB, 0x96A5, 0x67BC, + 0x96A6, 0x67BD, 0x96A7, 0x67BE, 0x96A8, 0x67BF, 0x96A9, 0x67C0, + 0x96AA, 0x67C2, 0x96AB, 0x67C5, 0x96AC, 0x67C6, 0x96AD, 0x67C7, + 0x96AE, 0x67C8, 0x96AF, 0x67C9, 0x96B0, 0x67CA, 0x96B1, 0x67CB, + 0x96B2, 0x67CC, 0x96B3, 0x67CD, 0x96B4, 0x67CE, 0x96B5, 0x67D5, + 0x96B6, 0x67D6, 0x96B7, 0x67D7, 0x96B8, 0x67DB, 0x96B9, 0x67DF, + 0x96BA, 0x67E1, 0x96BB, 0x67E3, 0x96BC, 0x67E4, 0x96BD, 0x67E6, + 0x96BE, 0x67E7, 0x96BF, 0x67E8, 0x96C0, 0x67EA, 0x96C1, 0x67EB, + 0x96C2, 0x67ED, 0x96C3, 0x67EE, 0x96C4, 0x67F2, 0x96C5, 0x67F5, + 0x96C6, 0x67F6, 0x96C7, 0x67F7, 0x96C8, 0x67F8, 0x96C9, 0x67F9, + 0x96CA, 0x67FA, 0x96CB, 0x67FB, 0x96CC, 0x67FC, 0x96CD, 0x67FE, + 0x96CE, 0x6801, 0x96CF, 0x6802, 0x96D0, 0x6803, 0x96D1, 0x6804, + 0x96D2, 0x6806, 0x96D3, 0x680D, 0x96D4, 0x6810, 0x96D5, 0x6812, + 0x96D6, 0x6814, 0x96D7, 0x6815, 0x96D8, 0x6818, 0x96D9, 0x6819, + 0x96DA, 0x681A, 0x96DB, 0x681B, 0x96DC, 0x681C, 0x96DD, 0x681E, + 0x96DE, 0x681F, 0x96DF, 0x6820, 0x96E0, 0x6822, 0x96E1, 0x6823, + 0x96E2, 0x6824, 0x96E3, 0x6825, 0x96E4, 0x6826, 0x96E5, 0x6827, + 0x96E6, 0x6828, 0x96E7, 0x682B, 0x96E8, 0x682C, 0x96E9, 0x682D, + 0x96EA, 0x682E, 0x96EB, 0x682F, 0x96EC, 0x6830, 0x96ED, 0x6831, + 0x96EE, 0x6834, 0x96EF, 0x6835, 0x96F0, 0x6836, 0x96F1, 0x683A, + 0x96F2, 0x683B, 0x96F3, 0x683F, 0x96F4, 0x6847, 0x96F5, 0x684B, + 0x96F6, 0x684D, 0x96F7, 0x684F, 0x96F8, 0x6852, 0x96F9, 0x6856, + 0x96FA, 0x6857, 0x96FB, 0x6858, 0x96FC, 0x6859, 0x96FD, 0x685A, + 0x96FE, 0x685B, 0x9740, 0x685C, 0x9741, 0x685D, 0x9742, 0x685E, + 0x9743, 0x685F, 0x9744, 0x686A, 0x9745, 0x686C, 0x9746, 0x686D, + 0x9747, 0x686E, 0x9748, 0x686F, 0x9749, 0x6870, 0x974A, 0x6871, + 0x974B, 0x6872, 0x974C, 0x6873, 0x974D, 0x6875, 0x974E, 0x6878, + 0x974F, 0x6879, 0x9750, 0x687A, 0x9751, 0x687B, 0x9752, 0x687C, + 0x9753, 0x687D, 0x9754, 0x687E, 0x9755, 0x687F, 0x9756, 0x6880, + 0x9757, 0x6882, 0x9758, 0x6884, 0x9759, 0x6887, 0x975A, 0x6888, + 0x975B, 0x6889, 0x975C, 0x688A, 0x975D, 0x688B, 0x975E, 0x688C, + 0x975F, 0x688D, 0x9760, 0x688E, 0x9761, 0x6890, 0x9762, 0x6891, + 0x9763, 0x6892, 0x9764, 0x6894, 0x9765, 0x6895, 0x9766, 0x6896, + 0x9767, 0x6898, 0x9768, 0x6899, 0x9769, 0x689A, 0x976A, 0x689B, + 0x976B, 0x689C, 0x976C, 0x689D, 0x976D, 0x689E, 0x976E, 0x689F, + 0x976F, 0x68A0, 0x9770, 0x68A1, 0x9771, 0x68A3, 0x9772, 0x68A4, + 0x9773, 0x68A5, 0x9774, 0x68A9, 0x9775, 0x68AA, 0x9776, 0x68AB, + 0x9777, 0x68AC, 0x9778, 0x68AE, 0x9779, 0x68B1, 0x977A, 0x68B2, + 0x977B, 0x68B4, 0x977C, 0x68B6, 0x977D, 0x68B7, 0x977E, 0x68B8, + 0x9780, 0x68B9, 0x9781, 0x68BA, 0x9782, 0x68BB, 0x9783, 0x68BC, + 0x9784, 0x68BD, 0x9785, 0x68BE, 0x9786, 0x68BF, 0x9787, 0x68C1, + 0x9788, 0x68C3, 0x9789, 0x68C4, 0x978A, 0x68C5, 0x978B, 0x68C6, + 0x978C, 0x68C7, 0x978D, 0x68C8, 0x978E, 0x68CA, 0x978F, 0x68CC, + 0x9790, 0x68CE, 0x9791, 0x68CF, 0x9792, 0x68D0, 0x9793, 0x68D1, + 0x9794, 0x68D3, 0x9795, 0x68D4, 0x9796, 0x68D6, 0x9797, 0x68D7, + 0x9798, 0x68D9, 0x9799, 0x68DB, 0x979A, 0x68DC, 0x979B, 0x68DD, + 0x979C, 0x68DE, 0x979D, 0x68DF, 0x979E, 0x68E1, 0x979F, 0x68E2, + 0x97A0, 0x68E4, 0x97A1, 0x68E5, 0x97A2, 0x68E6, 0x97A3, 0x68E7, + 0x97A4, 0x68E8, 0x97A5, 0x68E9, 0x97A6, 0x68EA, 0x97A7, 0x68EB, + 0x97A8, 0x68EC, 0x97A9, 0x68ED, 0x97AA, 0x68EF, 0x97AB, 0x68F2, + 0x97AC, 0x68F3, 0x97AD, 0x68F4, 0x97AE, 0x68F6, 0x97AF, 0x68F7, + 0x97B0, 0x68F8, 0x97B1, 0x68FB, 0x97B2, 0x68FD, 0x97B3, 0x68FE, + 0x97B4, 0x68FF, 0x97B5, 0x6900, 0x97B6, 0x6902, 0x97B7, 0x6903, + 0x97B8, 0x6904, 0x97B9, 0x6906, 0x97BA, 0x6907, 0x97BB, 0x6908, + 0x97BC, 0x6909, 0x97BD, 0x690A, 0x97BE, 0x690C, 0x97BF, 0x690F, + 0x97C0, 0x6911, 0x97C1, 0x6913, 0x97C2, 0x6914, 0x97C3, 0x6915, + 0x97C4, 0x6916, 0x97C5, 0x6917, 0x97C6, 0x6918, 0x97C7, 0x6919, + 0x97C8, 0x691A, 0x97C9, 0x691B, 0x97CA, 0x691C, 0x97CB, 0x691D, + 0x97CC, 0x691E, 0x97CD, 0x6921, 0x97CE, 0x6922, 0x97CF, 0x6923, + 0x97D0, 0x6925, 0x97D1, 0x6926, 0x97D2, 0x6927, 0x97D3, 0x6928, + 0x97D4, 0x6929, 0x97D5, 0x692A, 0x97D6, 0x692B, 0x97D7, 0x692C, + 0x97D8, 0x692E, 0x97D9, 0x692F, 0x97DA, 0x6931, 0x97DB, 0x6932, + 0x97DC, 0x6933, 0x97DD, 0x6935, 0x97DE, 0x6936, 0x97DF, 0x6937, + 0x97E0, 0x6938, 0x97E1, 0x693A, 0x97E2, 0x693B, 0x97E3, 0x693C, + 0x97E4, 0x693E, 0x97E5, 0x6940, 0x97E6, 0x6941, 0x97E7, 0x6943, + 0x97E8, 0x6944, 0x97E9, 0x6945, 0x97EA, 0x6946, 0x97EB, 0x6947, + 0x97EC, 0x6948, 0x97ED, 0x6949, 0x97EE, 0x694A, 0x97EF, 0x694B, + 0x97F0, 0x694C, 0x97F1, 0x694D, 0x97F2, 0x694E, 0x97F3, 0x694F, + 0x97F4, 0x6950, 0x97F5, 0x6951, 0x97F6, 0x6952, 0x97F7, 0x6953, + 0x97F8, 0x6955, 0x97F9, 0x6956, 0x97FA, 0x6958, 0x97FB, 0x6959, + 0x97FC, 0x695B, 0x97FD, 0x695C, 0x97FE, 0x695F, 0x9840, 0x6961, + 0x9841, 0x6962, 0x9842, 0x6964, 0x9843, 0x6965, 0x9844, 0x6967, + 0x9845, 0x6968, 0x9846, 0x6969, 0x9847, 0x696A, 0x9848, 0x696C, + 0x9849, 0x696D, 0x984A, 0x696F, 0x984B, 0x6970, 0x984C, 0x6972, + 0x984D, 0x6973, 0x984E, 0x6974, 0x984F, 0x6975, 0x9850, 0x6976, + 0x9851, 0x697A, 0x9852, 0x697B, 0x9853, 0x697D, 0x9854, 0x697E, + 0x9855, 0x697F, 0x9856, 0x6981, 0x9857, 0x6983, 0x9858, 0x6985, + 0x9859, 0x698A, 0x985A, 0x698B, 0x985B, 0x698C, 0x985C, 0x698E, + 0x985D, 0x698F, 0x985E, 0x6990, 0x985F, 0x6991, 0x9860, 0x6992, + 0x9861, 0x6993, 0x9862, 0x6996, 0x9863, 0x6997, 0x9864, 0x6999, + 0x9865, 0x699A, 0x9866, 0x699D, 0x9867, 0x699E, 0x9868, 0x699F, + 0x9869, 0x69A0, 0x986A, 0x69A1, 0x986B, 0x69A2, 0x986C, 0x69A3, + 0x986D, 0x69A4, 0x986E, 0x69A5, 0x986F, 0x69A6, 0x9870, 0x69A9, + 0x9871, 0x69AA, 0x9872, 0x69AC, 0x9873, 0x69AE, 0x9874, 0x69AF, + 0x9875, 0x69B0, 0x9876, 0x69B2, 0x9877, 0x69B3, 0x9878, 0x69B5, + 0x9879, 0x69B6, 0x987A, 0x69B8, 0x987B, 0x69B9, 0x987C, 0x69BA, + 0x987D, 0x69BC, 0x987E, 0x69BD, 0x9880, 0x69BE, 0x9881, 0x69BF, + 0x9882, 0x69C0, 0x9883, 0x69C2, 0x9884, 0x69C3, 0x9885, 0x69C4, + 0x9886, 0x69C5, 0x9887, 0x69C6, 0x9888, 0x69C7, 0x9889, 0x69C8, + 0x988A, 0x69C9, 0x988B, 0x69CB, 0x988C, 0x69CD, 0x988D, 0x69CF, + 0x988E, 0x69D1, 0x988F, 0x69D2, 0x9890, 0x69D3, 0x9891, 0x69D5, + 0x9892, 0x69D6, 0x9893, 0x69D7, 0x9894, 0x69D8, 0x9895, 0x69D9, + 0x9896, 0x69DA, 0x9897, 0x69DC, 0x9898, 0x69DD, 0x9899, 0x69DE, + 0x989A, 0x69E1, 0x989B, 0x69E2, 0x989C, 0x69E3, 0x989D, 0x69E4, + 0x989E, 0x69E5, 0x989F, 0x69E6, 0x98A0, 0x69E7, 0x98A1, 0x69E8, + 0x98A2, 0x69E9, 0x98A3, 0x69EA, 0x98A4, 0x69EB, 0x98A5, 0x69EC, + 0x98A6, 0x69EE, 0x98A7, 0x69EF, 0x98A8, 0x69F0, 0x98A9, 0x69F1, + 0x98AA, 0x69F3, 0x98AB, 0x69F4, 0x98AC, 0x69F5, 0x98AD, 0x69F6, + 0x98AE, 0x69F7, 0x98AF, 0x69F8, 0x98B0, 0x69F9, 0x98B1, 0x69FA, + 0x98B2, 0x69FB, 0x98B3, 0x69FC, 0x98B4, 0x69FE, 0x98B5, 0x6A00, + 0x98B6, 0x6A01, 0x98B7, 0x6A02, 0x98B8, 0x6A03, 0x98B9, 0x6A04, + 0x98BA, 0x6A05, 0x98BB, 0x6A06, 0x98BC, 0x6A07, 0x98BD, 0x6A08, + 0x98BE, 0x6A09, 0x98BF, 0x6A0B, 0x98C0, 0x6A0C, 0x98C1, 0x6A0D, + 0x98C2, 0x6A0E, 0x98C3, 0x6A0F, 0x98C4, 0x6A10, 0x98C5, 0x6A11, + 0x98C6, 0x6A12, 0x98C7, 0x6A13, 0x98C8, 0x6A14, 0x98C9, 0x6A15, + 0x98CA, 0x6A16, 0x98CB, 0x6A19, 0x98CC, 0x6A1A, 0x98CD, 0x6A1B, + 0x98CE, 0x6A1C, 0x98CF, 0x6A1D, 0x98D0, 0x6A1E, 0x98D1, 0x6A20, + 0x98D2, 0x6A22, 0x98D3, 0x6A23, 0x98D4, 0x6A24, 0x98D5, 0x6A25, + 0x98D6, 0x6A26, 0x98D7, 0x6A27, 0x98D8, 0x6A29, 0x98D9, 0x6A2B, + 0x98DA, 0x6A2C, 0x98DB, 0x6A2D, 0x98DC, 0x6A2E, 0x98DD, 0x6A30, + 0x98DE, 0x6A32, 0x98DF, 0x6A33, 0x98E0, 0x6A34, 0x98E1, 0x6A36, + 0x98E2, 0x6A37, 0x98E3, 0x6A38, 0x98E4, 0x6A39, 0x98E5, 0x6A3A, + 0x98E6, 0x6A3B, 0x98E7, 0x6A3C, 0x98E8, 0x6A3F, 0x98E9, 0x6A40, + 0x98EA, 0x6A41, 0x98EB, 0x6A42, 0x98EC, 0x6A43, 0x98ED, 0x6A45, + 0x98EE, 0x6A46, 0x98EF, 0x6A48, 0x98F0, 0x6A49, 0x98F1, 0x6A4A, + 0x98F2, 0x6A4B, 0x98F3, 0x6A4C, 0x98F4, 0x6A4D, 0x98F5, 0x6A4E, + 0x98F6, 0x6A4F, 0x98F7, 0x6A51, 0x98F8, 0x6A52, 0x98F9, 0x6A53, + 0x98FA, 0x6A54, 0x98FB, 0x6A55, 0x98FC, 0x6A56, 0x98FD, 0x6A57, + 0x98FE, 0x6A5A, 0x9940, 0x6A5C, 0x9941, 0x6A5D, 0x9942, 0x6A5E, + 0x9943, 0x6A5F, 0x9944, 0x6A60, 0x9945, 0x6A62, 0x9946, 0x6A63, + 0x9947, 0x6A64, 0x9948, 0x6A66, 0x9949, 0x6A67, 0x994A, 0x6A68, + 0x994B, 0x6A69, 0x994C, 0x6A6A, 0x994D, 0x6A6B, 0x994E, 0x6A6C, + 0x994F, 0x6A6D, 0x9950, 0x6A6E, 0x9951, 0x6A6F, 0x9952, 0x6A70, + 0x9953, 0x6A72, 0x9954, 0x6A73, 0x9955, 0x6A74, 0x9956, 0x6A75, + 0x9957, 0x6A76, 0x9958, 0x6A77, 0x9959, 0x6A78, 0x995A, 0x6A7A, + 0x995B, 0x6A7B, 0x995C, 0x6A7D, 0x995D, 0x6A7E, 0x995E, 0x6A7F, + 0x995F, 0x6A81, 0x9960, 0x6A82, 0x9961, 0x6A83, 0x9962, 0x6A85, + 0x9963, 0x6A86, 0x9964, 0x6A87, 0x9965, 0x6A88, 0x9966, 0x6A89, + 0x9967, 0x6A8A, 0x9968, 0x6A8B, 0x9969, 0x6A8C, 0x996A, 0x6A8D, + 0x996B, 0x6A8F, 0x996C, 0x6A92, 0x996D, 0x6A93, 0x996E, 0x6A94, + 0x996F, 0x6A95, 0x9970, 0x6A96, 0x9971, 0x6A98, 0x9972, 0x6A99, + 0x9973, 0x6A9A, 0x9974, 0x6A9B, 0x9975, 0x6A9C, 0x9976, 0x6A9D, + 0x9977, 0x6A9E, 0x9978, 0x6A9F, 0x9979, 0x6AA1, 0x997A, 0x6AA2, + 0x997B, 0x6AA3, 0x997C, 0x6AA4, 0x997D, 0x6AA5, 0x997E, 0x6AA6, + 0x9980, 0x6AA7, 0x9981, 0x6AA8, 0x9982, 0x6AAA, 0x9983, 0x6AAD, + 0x9984, 0x6AAE, 0x9985, 0x6AAF, 0x9986, 0x6AB0, 0x9987, 0x6AB1, + 0x9988, 0x6AB2, 0x9989, 0x6AB3, 0x998A, 0x6AB4, 0x998B, 0x6AB5, + 0x998C, 0x6AB6, 0x998D, 0x6AB7, 0x998E, 0x6AB8, 0x998F, 0x6AB9, + 0x9990, 0x6ABA, 0x9991, 0x6ABB, 0x9992, 0x6ABC, 0x9993, 0x6ABD, + 0x9994, 0x6ABE, 0x9995, 0x6ABF, 0x9996, 0x6AC0, 0x9997, 0x6AC1, + 0x9998, 0x6AC2, 0x9999, 0x6AC3, 0x999A, 0x6AC4, 0x999B, 0x6AC5, + 0x999C, 0x6AC6, 0x999D, 0x6AC7, 0x999E, 0x6AC8, 0x999F, 0x6AC9, + 0x99A0, 0x6ACA, 0x99A1, 0x6ACB, 0x99A2, 0x6ACC, 0x99A3, 0x6ACD, + 0x99A4, 0x6ACE, 0x99A5, 0x6ACF, 0x99A6, 0x6AD0, 0x99A7, 0x6AD1, + 0x99A8, 0x6AD2, 0x99A9, 0x6AD3, 0x99AA, 0x6AD4, 0x99AB, 0x6AD5, + 0x99AC, 0x6AD6, 0x99AD, 0x6AD7, 0x99AE, 0x6AD8, 0x99AF, 0x6AD9, + 0x99B0, 0x6ADA, 0x99B1, 0x6ADB, 0x99B2, 0x6ADC, 0x99B3, 0x6ADD, + 0x99B4, 0x6ADE, 0x99B5, 0x6ADF, 0x99B6, 0x6AE0, 0x99B7, 0x6AE1, + 0x99B8, 0x6AE2, 0x99B9, 0x6AE3, 0x99BA, 0x6AE4, 0x99BB, 0x6AE5, + 0x99BC, 0x6AE6, 0x99BD, 0x6AE7, 0x99BE, 0x6AE8, 0x99BF, 0x6AE9, + 0x99C0, 0x6AEA, 0x99C1, 0x6AEB, 0x99C2, 0x6AEC, 0x99C3, 0x6AED, + 0x99C4, 0x6AEE, 0x99C5, 0x6AEF, 0x99C6, 0x6AF0, 0x99C7, 0x6AF1, + 0x99C8, 0x6AF2, 0x99C9, 0x6AF3, 0x99CA, 0x6AF4, 0x99CB, 0x6AF5, + 0x99CC, 0x6AF6, 0x99CD, 0x6AF7, 0x99CE, 0x6AF8, 0x99CF, 0x6AF9, + 0x99D0, 0x6AFA, 0x99D1, 0x6AFB, 0x99D2, 0x6AFC, 0x99D3, 0x6AFD, + 0x99D4, 0x6AFE, 0x99D5, 0x6AFF, 0x99D6, 0x6B00, 0x99D7, 0x6B01, + 0x99D8, 0x6B02, 0x99D9, 0x6B03, 0x99DA, 0x6B04, 0x99DB, 0x6B05, + 0x99DC, 0x6B06, 0x99DD, 0x6B07, 0x99DE, 0x6B08, 0x99DF, 0x6B09, + 0x99E0, 0x6B0A, 0x99E1, 0x6B0B, 0x99E2, 0x6B0C, 0x99E3, 0x6B0D, + 0x99E4, 0x6B0E, 0x99E5, 0x6B0F, 0x99E6, 0x6B10, 0x99E7, 0x6B11, + 0x99E8, 0x6B12, 0x99E9, 0x6B13, 0x99EA, 0x6B14, 0x99EB, 0x6B15, + 0x99EC, 0x6B16, 0x99ED, 0x6B17, 0x99EE, 0x6B18, 0x99EF, 0x6B19, + 0x99F0, 0x6B1A, 0x99F1, 0x6B1B, 0x99F2, 0x6B1C, 0x99F3, 0x6B1D, + 0x99F4, 0x6B1E, 0x99F5, 0x6B1F, 0x99F6, 0x6B25, 0x99F7, 0x6B26, + 0x99F8, 0x6B28, 0x99F9, 0x6B29, 0x99FA, 0x6B2A, 0x99FB, 0x6B2B, + 0x99FC, 0x6B2C, 0x99FD, 0x6B2D, 0x99FE, 0x6B2E, 0x9A40, 0x6B2F, + 0x9A41, 0x6B30, 0x9A42, 0x6B31, 0x9A43, 0x6B33, 0x9A44, 0x6B34, + 0x9A45, 0x6B35, 0x9A46, 0x6B36, 0x9A47, 0x6B38, 0x9A48, 0x6B3B, + 0x9A49, 0x6B3C, 0x9A4A, 0x6B3D, 0x9A4B, 0x6B3F, 0x9A4C, 0x6B40, + 0x9A4D, 0x6B41, 0x9A4E, 0x6B42, 0x9A4F, 0x6B44, 0x9A50, 0x6B45, + 0x9A51, 0x6B48, 0x9A52, 0x6B4A, 0x9A53, 0x6B4B, 0x9A54, 0x6B4D, + 0x9A55, 0x6B4E, 0x9A56, 0x6B4F, 0x9A57, 0x6B50, 0x9A58, 0x6B51, + 0x9A59, 0x6B52, 0x9A5A, 0x6B53, 0x9A5B, 0x6B54, 0x9A5C, 0x6B55, + 0x9A5D, 0x6B56, 0x9A5E, 0x6B57, 0x9A5F, 0x6B58, 0x9A60, 0x6B5A, + 0x9A61, 0x6B5B, 0x9A62, 0x6B5C, 0x9A63, 0x6B5D, 0x9A64, 0x6B5E, + 0x9A65, 0x6B5F, 0x9A66, 0x6B60, 0x9A67, 0x6B61, 0x9A68, 0x6B68, + 0x9A69, 0x6B69, 0x9A6A, 0x6B6B, 0x9A6B, 0x6B6C, 0x9A6C, 0x6B6D, + 0x9A6D, 0x6B6E, 0x9A6E, 0x6B6F, 0x9A6F, 0x6B70, 0x9A70, 0x6B71, + 0x9A71, 0x6B72, 0x9A72, 0x6B73, 0x9A73, 0x6B74, 0x9A74, 0x6B75, + 0x9A75, 0x6B76, 0x9A76, 0x6B77, 0x9A77, 0x6B78, 0x9A78, 0x6B7A, + 0x9A79, 0x6B7D, 0x9A7A, 0x6B7E, 0x9A7B, 0x6B7F, 0x9A7C, 0x6B80, + 0x9A7D, 0x6B85, 0x9A7E, 0x6B88, 0x9A80, 0x6B8C, 0x9A81, 0x6B8E, + 0x9A82, 0x6B8F, 0x9A83, 0x6B90, 0x9A84, 0x6B91, 0x9A85, 0x6B94, + 0x9A86, 0x6B95, 0x9A87, 0x6B97, 0x9A88, 0x6B98, 0x9A89, 0x6B99, + 0x9A8A, 0x6B9C, 0x9A8B, 0x6B9D, 0x9A8C, 0x6B9E, 0x9A8D, 0x6B9F, + 0x9A8E, 0x6BA0, 0x9A8F, 0x6BA2, 0x9A90, 0x6BA3, 0x9A91, 0x6BA4, + 0x9A92, 0x6BA5, 0x9A93, 0x6BA6, 0x9A94, 0x6BA7, 0x9A95, 0x6BA8, + 0x9A96, 0x6BA9, 0x9A97, 0x6BAB, 0x9A98, 0x6BAC, 0x9A99, 0x6BAD, + 0x9A9A, 0x6BAE, 0x9A9B, 0x6BAF, 0x9A9C, 0x6BB0, 0x9A9D, 0x6BB1, + 0x9A9E, 0x6BB2, 0x9A9F, 0x6BB6, 0x9AA0, 0x6BB8, 0x9AA1, 0x6BB9, + 0x9AA2, 0x6BBA, 0x9AA3, 0x6BBB, 0x9AA4, 0x6BBC, 0x9AA5, 0x6BBD, + 0x9AA6, 0x6BBE, 0x9AA7, 0x6BC0, 0x9AA8, 0x6BC3, 0x9AA9, 0x6BC4, + 0x9AAA, 0x6BC6, 0x9AAB, 0x6BC7, 0x9AAC, 0x6BC8, 0x9AAD, 0x6BC9, + 0x9AAE, 0x6BCA, 0x9AAF, 0x6BCC, 0x9AB0, 0x6BCE, 0x9AB1, 0x6BD0, + 0x9AB2, 0x6BD1, 0x9AB3, 0x6BD8, 0x9AB4, 0x6BDA, 0x9AB5, 0x6BDC, + 0x9AB6, 0x6BDD, 0x9AB7, 0x6BDE, 0x9AB8, 0x6BDF, 0x9AB9, 0x6BE0, + 0x9ABA, 0x6BE2, 0x9ABB, 0x6BE3, 0x9ABC, 0x6BE4, 0x9ABD, 0x6BE5, + 0x9ABE, 0x6BE6, 0x9ABF, 0x6BE7, 0x9AC0, 0x6BE8, 0x9AC1, 0x6BE9, + 0x9AC2, 0x6BEC, 0x9AC3, 0x6BED, 0x9AC4, 0x6BEE, 0x9AC5, 0x6BF0, + 0x9AC6, 0x6BF1, 0x9AC7, 0x6BF2, 0x9AC8, 0x6BF4, 0x9AC9, 0x6BF6, + 0x9ACA, 0x6BF7, 0x9ACB, 0x6BF8, 0x9ACC, 0x6BFA, 0x9ACD, 0x6BFB, + 0x9ACE, 0x6BFC, 0x9ACF, 0x6BFE, 0x9AD0, 0x6BFF, 0x9AD1, 0x6C00, + 0x9AD2, 0x6C01, 0x9AD3, 0x6C02, 0x9AD4, 0x6C03, 0x9AD5, 0x6C04, + 0x9AD6, 0x6C08, 0x9AD7, 0x6C09, 0x9AD8, 0x6C0A, 0x9AD9, 0x6C0B, + 0x9ADA, 0x6C0C, 0x9ADB, 0x6C0E, 0x9ADC, 0x6C12, 0x9ADD, 0x6C17, + 0x9ADE, 0x6C1C, 0x9ADF, 0x6C1D, 0x9AE0, 0x6C1E, 0x9AE1, 0x6C20, + 0x9AE2, 0x6C23, 0x9AE3, 0x6C25, 0x9AE4, 0x6C2B, 0x9AE5, 0x6C2C, + 0x9AE6, 0x6C2D, 0x9AE7, 0x6C31, 0x9AE8, 0x6C33, 0x9AE9, 0x6C36, + 0x9AEA, 0x6C37, 0x9AEB, 0x6C39, 0x9AEC, 0x6C3A, 0x9AED, 0x6C3B, + 0x9AEE, 0x6C3C, 0x9AEF, 0x6C3E, 0x9AF0, 0x6C3F, 0x9AF1, 0x6C43, + 0x9AF2, 0x6C44, 0x9AF3, 0x6C45, 0x9AF4, 0x6C48, 0x9AF5, 0x6C4B, + 0x9AF6, 0x6C4C, 0x9AF7, 0x6C4D, 0x9AF8, 0x6C4E, 0x9AF9, 0x6C4F, + 0x9AFA, 0x6C51, 0x9AFB, 0x6C52, 0x9AFC, 0x6C53, 0x9AFD, 0x6C56, + 0x9AFE, 0x6C58, 0x9B40, 0x6C59, 0x9B41, 0x6C5A, 0x9B42, 0x6C62, + 0x9B43, 0x6C63, 0x9B44, 0x6C65, 0x9B45, 0x6C66, 0x9B46, 0x6C67, + 0x9B47, 0x6C6B, 0x9B48, 0x6C6C, 0x9B49, 0x6C6D, 0x9B4A, 0x6C6E, + 0x9B4B, 0x6C6F, 0x9B4C, 0x6C71, 0x9B4D, 0x6C73, 0x9B4E, 0x6C75, + 0x9B4F, 0x6C77, 0x9B50, 0x6C78, 0x9B51, 0x6C7A, 0x9B52, 0x6C7B, + 0x9B53, 0x6C7C, 0x9B54, 0x6C7F, 0x9B55, 0x6C80, 0x9B56, 0x6C84, + 0x9B57, 0x6C87, 0x9B58, 0x6C8A, 0x9B59, 0x6C8B, 0x9B5A, 0x6C8D, + 0x9B5B, 0x6C8E, 0x9B5C, 0x6C91, 0x9B5D, 0x6C92, 0x9B5E, 0x6C95, + 0x9B5F, 0x6C96, 0x9B60, 0x6C97, 0x9B61, 0x6C98, 0x9B62, 0x6C9A, + 0x9B63, 0x6C9C, 0x9B64, 0x6C9D, 0x9B65, 0x6C9E, 0x9B66, 0x6CA0, + 0x9B67, 0x6CA2, 0x9B68, 0x6CA8, 0x9B69, 0x6CAC, 0x9B6A, 0x6CAF, + 0x9B6B, 0x6CB0, 0x9B6C, 0x6CB4, 0x9B6D, 0x6CB5, 0x9B6E, 0x6CB6, + 0x9B6F, 0x6CB7, 0x9B70, 0x6CBA, 0x9B71, 0x6CC0, 0x9B72, 0x6CC1, + 0x9B73, 0x6CC2, 0x9B74, 0x6CC3, 0x9B75, 0x6CC6, 0x9B76, 0x6CC7, + 0x9B77, 0x6CC8, 0x9B78, 0x6CCB, 0x9B79, 0x6CCD, 0x9B7A, 0x6CCE, + 0x9B7B, 0x6CCF, 0x9B7C, 0x6CD1, 0x9B7D, 0x6CD2, 0x9B7E, 0x6CD8, + 0x9B80, 0x6CD9, 0x9B81, 0x6CDA, 0x9B82, 0x6CDC, 0x9B83, 0x6CDD, + 0x9B84, 0x6CDF, 0x9B85, 0x6CE4, 0x9B86, 0x6CE6, 0x9B87, 0x6CE7, + 0x9B88, 0x6CE9, 0x9B89, 0x6CEC, 0x9B8A, 0x6CED, 0x9B8B, 0x6CF2, + 0x9B8C, 0x6CF4, 0x9B8D, 0x6CF9, 0x9B8E, 0x6CFF, 0x9B8F, 0x6D00, + 0x9B90, 0x6D02, 0x9B91, 0x6D03, 0x9B92, 0x6D05, 0x9B93, 0x6D06, + 0x9B94, 0x6D08, 0x9B95, 0x6D09, 0x9B96, 0x6D0A, 0x9B97, 0x6D0D, + 0x9B98, 0x6D0F, 0x9B99, 0x6D10, 0x9B9A, 0x6D11, 0x9B9B, 0x6D13, + 0x9B9C, 0x6D14, 0x9B9D, 0x6D15, 0x9B9E, 0x6D16, 0x9B9F, 0x6D18, + 0x9BA0, 0x6D1C, 0x9BA1, 0x6D1D, 0x9BA2, 0x6D1F, 0x9BA3, 0x6D20, + 0x9BA4, 0x6D21, 0x9BA5, 0x6D22, 0x9BA6, 0x6D23, 0x9BA7, 0x6D24, + 0x9BA8, 0x6D26, 0x9BA9, 0x6D28, 0x9BAA, 0x6D29, 0x9BAB, 0x6D2C, + 0x9BAC, 0x6D2D, 0x9BAD, 0x6D2F, 0x9BAE, 0x6D30, 0x9BAF, 0x6D34, + 0x9BB0, 0x6D36, 0x9BB1, 0x6D37, 0x9BB2, 0x6D38, 0x9BB3, 0x6D3A, + 0x9BB4, 0x6D3F, 0x9BB5, 0x6D40, 0x9BB6, 0x6D42, 0x9BB7, 0x6D44, + 0x9BB8, 0x6D49, 0x9BB9, 0x6D4C, 0x9BBA, 0x6D50, 0x9BBB, 0x6D55, + 0x9BBC, 0x6D56, 0x9BBD, 0x6D57, 0x9BBE, 0x6D58, 0x9BBF, 0x6D5B, + 0x9BC0, 0x6D5D, 0x9BC1, 0x6D5F, 0x9BC2, 0x6D61, 0x9BC3, 0x6D62, + 0x9BC4, 0x6D64, 0x9BC5, 0x6D65, 0x9BC6, 0x6D67, 0x9BC7, 0x6D68, + 0x9BC8, 0x6D6B, 0x9BC9, 0x6D6C, 0x9BCA, 0x6D6D, 0x9BCB, 0x6D70, + 0x9BCC, 0x6D71, 0x9BCD, 0x6D72, 0x9BCE, 0x6D73, 0x9BCF, 0x6D75, + 0x9BD0, 0x6D76, 0x9BD1, 0x6D79, 0x9BD2, 0x6D7A, 0x9BD3, 0x6D7B, + 0x9BD4, 0x6D7D, 0x9BD5, 0x6D7E, 0x9BD6, 0x6D7F, 0x9BD7, 0x6D80, + 0x9BD8, 0x6D81, 0x9BD9, 0x6D83, 0x9BDA, 0x6D84, 0x9BDB, 0x6D86, + 0x9BDC, 0x6D87, 0x9BDD, 0x6D8A, 0x9BDE, 0x6D8B, 0x9BDF, 0x6D8D, + 0x9BE0, 0x6D8F, 0x9BE1, 0x6D90, 0x9BE2, 0x6D92, 0x9BE3, 0x6D96, + 0x9BE4, 0x6D97, 0x9BE5, 0x6D98, 0x9BE6, 0x6D99, 0x9BE7, 0x6D9A, + 0x9BE8, 0x6D9C, 0x9BE9, 0x6DA2, 0x9BEA, 0x6DA5, 0x9BEB, 0x6DAC, + 0x9BEC, 0x6DAD, 0x9BED, 0x6DB0, 0x9BEE, 0x6DB1, 0x9BEF, 0x6DB3, + 0x9BF0, 0x6DB4, 0x9BF1, 0x6DB6, 0x9BF2, 0x6DB7, 0x9BF3, 0x6DB9, + 0x9BF4, 0x6DBA, 0x9BF5, 0x6DBB, 0x9BF6, 0x6DBC, 0x9BF7, 0x6DBD, + 0x9BF8, 0x6DBE, 0x9BF9, 0x6DC1, 0x9BFA, 0x6DC2, 0x9BFB, 0x6DC3, + 0x9BFC, 0x6DC8, 0x9BFD, 0x6DC9, 0x9BFE, 0x6DCA, 0x9C40, 0x6DCD, + 0x9C41, 0x6DCE, 0x9C42, 0x6DCF, 0x9C43, 0x6DD0, 0x9C44, 0x6DD2, + 0x9C45, 0x6DD3, 0x9C46, 0x6DD4, 0x9C47, 0x6DD5, 0x9C48, 0x6DD7, + 0x9C49, 0x6DDA, 0x9C4A, 0x6DDB, 0x9C4B, 0x6DDC, 0x9C4C, 0x6DDF, + 0x9C4D, 0x6DE2, 0x9C4E, 0x6DE3, 0x9C4F, 0x6DE5, 0x9C50, 0x6DE7, + 0x9C51, 0x6DE8, 0x9C52, 0x6DE9, 0x9C53, 0x6DEA, 0x9C54, 0x6DED, + 0x9C55, 0x6DEF, 0x9C56, 0x6DF0, 0x9C57, 0x6DF2, 0x9C58, 0x6DF4, + 0x9C59, 0x6DF5, 0x9C5A, 0x6DF6, 0x9C5B, 0x6DF8, 0x9C5C, 0x6DFA, + 0x9C5D, 0x6DFD, 0x9C5E, 0x6DFE, 0x9C5F, 0x6DFF, 0x9C60, 0x6E00, + 0x9C61, 0x6E01, 0x9C62, 0x6E02, 0x9C63, 0x6E03, 0x9C64, 0x6E04, + 0x9C65, 0x6E06, 0x9C66, 0x6E07, 0x9C67, 0x6E08, 0x9C68, 0x6E09, + 0x9C69, 0x6E0B, 0x9C6A, 0x6E0F, 0x9C6B, 0x6E12, 0x9C6C, 0x6E13, + 0x9C6D, 0x6E15, 0x9C6E, 0x6E18, 0x9C6F, 0x6E19, 0x9C70, 0x6E1B, + 0x9C71, 0x6E1C, 0x9C72, 0x6E1E, 0x9C73, 0x6E1F, 0x9C74, 0x6E22, + 0x9C75, 0x6E26, 0x9C76, 0x6E27, 0x9C77, 0x6E28, 0x9C78, 0x6E2A, + 0x9C79, 0x6E2C, 0x9C7A, 0x6E2E, 0x9C7B, 0x6E30, 0x9C7C, 0x6E31, + 0x9C7D, 0x6E33, 0x9C7E, 0x6E35, 0x9C80, 0x6E36, 0x9C81, 0x6E37, + 0x9C82, 0x6E39, 0x9C83, 0x6E3B, 0x9C84, 0x6E3C, 0x9C85, 0x6E3D, + 0x9C86, 0x6E3E, 0x9C87, 0x6E3F, 0x9C88, 0x6E40, 0x9C89, 0x6E41, + 0x9C8A, 0x6E42, 0x9C8B, 0x6E45, 0x9C8C, 0x6E46, 0x9C8D, 0x6E47, + 0x9C8E, 0x6E48, 0x9C8F, 0x6E49, 0x9C90, 0x6E4A, 0x9C91, 0x6E4B, + 0x9C92, 0x6E4C, 0x9C93, 0x6E4F, 0x9C94, 0x6E50, 0x9C95, 0x6E51, + 0x9C96, 0x6E52, 0x9C97, 0x6E55, 0x9C98, 0x6E57, 0x9C99, 0x6E59, + 0x9C9A, 0x6E5A, 0x9C9B, 0x6E5C, 0x9C9C, 0x6E5D, 0x9C9D, 0x6E5E, + 0x9C9E, 0x6E60, 0x9C9F, 0x6E61, 0x9CA0, 0x6E62, 0x9CA1, 0x6E63, + 0x9CA2, 0x6E64, 0x9CA3, 0x6E65, 0x9CA4, 0x6E66, 0x9CA5, 0x6E67, + 0x9CA6, 0x6E68, 0x9CA7, 0x6E69, 0x9CA8, 0x6E6A, 0x9CA9, 0x6E6C, + 0x9CAA, 0x6E6D, 0x9CAB, 0x6E6F, 0x9CAC, 0x6E70, 0x9CAD, 0x6E71, + 0x9CAE, 0x6E72, 0x9CAF, 0x6E73, 0x9CB0, 0x6E74, 0x9CB1, 0x6E75, + 0x9CB2, 0x6E76, 0x9CB3, 0x6E77, 0x9CB4, 0x6E78, 0x9CB5, 0x6E79, + 0x9CB6, 0x6E7A, 0x9CB7, 0x6E7B, 0x9CB8, 0x6E7C, 0x9CB9, 0x6E7D, + 0x9CBA, 0x6E80, 0x9CBB, 0x6E81, 0x9CBC, 0x6E82, 0x9CBD, 0x6E84, + 0x9CBE, 0x6E87, 0x9CBF, 0x6E88, 0x9CC0, 0x6E8A, 0x9CC1, 0x6E8B, + 0x9CC2, 0x6E8C, 0x9CC3, 0x6E8D, 0x9CC4, 0x6E8E, 0x9CC5, 0x6E91, + 0x9CC6, 0x6E92, 0x9CC7, 0x6E93, 0x9CC8, 0x6E94, 0x9CC9, 0x6E95, + 0x9CCA, 0x6E96, 0x9CCB, 0x6E97, 0x9CCC, 0x6E99, 0x9CCD, 0x6E9A, + 0x9CCE, 0x6E9B, 0x9CCF, 0x6E9D, 0x9CD0, 0x6E9E, 0x9CD1, 0x6EA0, + 0x9CD2, 0x6EA1, 0x9CD3, 0x6EA3, 0x9CD4, 0x6EA4, 0x9CD5, 0x6EA6, + 0x9CD6, 0x6EA8, 0x9CD7, 0x6EA9, 0x9CD8, 0x6EAB, 0x9CD9, 0x6EAC, + 0x9CDA, 0x6EAD, 0x9CDB, 0x6EAE, 0x9CDC, 0x6EB0, 0x9CDD, 0x6EB3, + 0x9CDE, 0x6EB5, 0x9CDF, 0x6EB8, 0x9CE0, 0x6EB9, 0x9CE1, 0x6EBC, + 0x9CE2, 0x6EBE, 0x9CE3, 0x6EBF, 0x9CE4, 0x6EC0, 0x9CE5, 0x6EC3, + 0x9CE6, 0x6EC4, 0x9CE7, 0x6EC5, 0x9CE8, 0x6EC6, 0x9CE9, 0x6EC8, + 0x9CEA, 0x6EC9, 0x9CEB, 0x6ECA, 0x9CEC, 0x6ECC, 0x9CED, 0x6ECD, + 0x9CEE, 0x6ECE, 0x9CEF, 0x6ED0, 0x9CF0, 0x6ED2, 0x9CF1, 0x6ED6, + 0x9CF2, 0x6ED8, 0x9CF3, 0x6ED9, 0x9CF4, 0x6EDB, 0x9CF5, 0x6EDC, + 0x9CF6, 0x6EDD, 0x9CF7, 0x6EE3, 0x9CF8, 0x6EE7, 0x9CF9, 0x6EEA, + 0x9CFA, 0x6EEB, 0x9CFB, 0x6EEC, 0x9CFC, 0x6EED, 0x9CFD, 0x6EEE, + 0x9CFE, 0x6EEF, 0x9D40, 0x6EF0, 0x9D41, 0x6EF1, 0x9D42, 0x6EF2, + 0x9D43, 0x6EF3, 0x9D44, 0x6EF5, 0x9D45, 0x6EF6, 0x9D46, 0x6EF7, + 0x9D47, 0x6EF8, 0x9D48, 0x6EFA, 0x9D49, 0x6EFB, 0x9D4A, 0x6EFC, + 0x9D4B, 0x6EFD, 0x9D4C, 0x6EFE, 0x9D4D, 0x6EFF, 0x9D4E, 0x6F00, + 0x9D4F, 0x6F01, 0x9D50, 0x6F03, 0x9D51, 0x6F04, 0x9D52, 0x6F05, + 0x9D53, 0x6F07, 0x9D54, 0x6F08, 0x9D55, 0x6F0A, 0x9D56, 0x6F0B, + 0x9D57, 0x6F0C, 0x9D58, 0x6F0D, 0x9D59, 0x6F0E, 0x9D5A, 0x6F10, + 0x9D5B, 0x6F11, 0x9D5C, 0x6F12, 0x9D5D, 0x6F16, 0x9D5E, 0x6F17, + 0x9D5F, 0x6F18, 0x9D60, 0x6F19, 0x9D61, 0x6F1A, 0x9D62, 0x6F1B, + 0x9D63, 0x6F1C, 0x9D64, 0x6F1D, 0x9D65, 0x6F1E, 0x9D66, 0x6F1F, + 0x9D67, 0x6F21, 0x9D68, 0x6F22, 0x9D69, 0x6F23, 0x9D6A, 0x6F25, + 0x9D6B, 0x6F26, 0x9D6C, 0x6F27, 0x9D6D, 0x6F28, 0x9D6E, 0x6F2C, + 0x9D6F, 0x6F2E, 0x9D70, 0x6F30, 0x9D71, 0x6F32, 0x9D72, 0x6F34, + 0x9D73, 0x6F35, 0x9D74, 0x6F37, 0x9D75, 0x6F38, 0x9D76, 0x6F39, + 0x9D77, 0x6F3A, 0x9D78, 0x6F3B, 0x9D79, 0x6F3C, 0x9D7A, 0x6F3D, + 0x9D7B, 0x6F3F, 0x9D7C, 0x6F40, 0x9D7D, 0x6F41, 0x9D7E, 0x6F42, + 0x9D80, 0x6F43, 0x9D81, 0x6F44, 0x9D82, 0x6F45, 0x9D83, 0x6F48, + 0x9D84, 0x6F49, 0x9D85, 0x6F4A, 0x9D86, 0x6F4C, 0x9D87, 0x6F4E, + 0x9D88, 0x6F4F, 0x9D89, 0x6F50, 0x9D8A, 0x6F51, 0x9D8B, 0x6F52, + 0x9D8C, 0x6F53, 0x9D8D, 0x6F54, 0x9D8E, 0x6F55, 0x9D8F, 0x6F56, + 0x9D90, 0x6F57, 0x9D91, 0x6F59, 0x9D92, 0x6F5A, 0x9D93, 0x6F5B, + 0x9D94, 0x6F5D, 0x9D95, 0x6F5F, 0x9D96, 0x6F60, 0x9D97, 0x6F61, + 0x9D98, 0x6F63, 0x9D99, 0x6F64, 0x9D9A, 0x6F65, 0x9D9B, 0x6F67, + 0x9D9C, 0x6F68, 0x9D9D, 0x6F69, 0x9D9E, 0x6F6A, 0x9D9F, 0x6F6B, + 0x9DA0, 0x6F6C, 0x9DA1, 0x6F6F, 0x9DA2, 0x6F70, 0x9DA3, 0x6F71, + 0x9DA4, 0x6F73, 0x9DA5, 0x6F75, 0x9DA6, 0x6F76, 0x9DA7, 0x6F77, + 0x9DA8, 0x6F79, 0x9DA9, 0x6F7B, 0x9DAA, 0x6F7D, 0x9DAB, 0x6F7E, + 0x9DAC, 0x6F7F, 0x9DAD, 0x6F80, 0x9DAE, 0x6F81, 0x9DAF, 0x6F82, + 0x9DB0, 0x6F83, 0x9DB1, 0x6F85, 0x9DB2, 0x6F86, 0x9DB3, 0x6F87, + 0x9DB4, 0x6F8A, 0x9DB5, 0x6F8B, 0x9DB6, 0x6F8F, 0x9DB7, 0x6F90, + 0x9DB8, 0x6F91, 0x9DB9, 0x6F92, 0x9DBA, 0x6F93, 0x9DBB, 0x6F94, + 0x9DBC, 0x6F95, 0x9DBD, 0x6F96, 0x9DBE, 0x6F97, 0x9DBF, 0x6F98, + 0x9DC0, 0x6F99, 0x9DC1, 0x6F9A, 0x9DC2, 0x6F9B, 0x9DC3, 0x6F9D, + 0x9DC4, 0x6F9E, 0x9DC5, 0x6F9F, 0x9DC6, 0x6FA0, 0x9DC7, 0x6FA2, + 0x9DC8, 0x6FA3, 0x9DC9, 0x6FA4, 0x9DCA, 0x6FA5, 0x9DCB, 0x6FA6, + 0x9DCC, 0x6FA8, 0x9DCD, 0x6FA9, 0x9DCE, 0x6FAA, 0x9DCF, 0x6FAB, + 0x9DD0, 0x6FAC, 0x9DD1, 0x6FAD, 0x9DD2, 0x6FAE, 0x9DD3, 0x6FAF, + 0x9DD4, 0x6FB0, 0x9DD5, 0x6FB1, 0x9DD6, 0x6FB2, 0x9DD7, 0x6FB4, + 0x9DD8, 0x6FB5, 0x9DD9, 0x6FB7, 0x9DDA, 0x6FB8, 0x9DDB, 0x6FBA, + 0x9DDC, 0x6FBB, 0x9DDD, 0x6FBC, 0x9DDE, 0x6FBD, 0x9DDF, 0x6FBE, + 0x9DE0, 0x6FBF, 0x9DE1, 0x6FC1, 0x9DE2, 0x6FC3, 0x9DE3, 0x6FC4, + 0x9DE4, 0x6FC5, 0x9DE5, 0x6FC6, 0x9DE6, 0x6FC7, 0x9DE7, 0x6FC8, + 0x9DE8, 0x6FCA, 0x9DE9, 0x6FCB, 0x9DEA, 0x6FCC, 0x9DEB, 0x6FCD, + 0x9DEC, 0x6FCE, 0x9DED, 0x6FCF, 0x9DEE, 0x6FD0, 0x9DEF, 0x6FD3, + 0x9DF0, 0x6FD4, 0x9DF1, 0x6FD5, 0x9DF2, 0x6FD6, 0x9DF3, 0x6FD7, + 0x9DF4, 0x6FD8, 0x9DF5, 0x6FD9, 0x9DF6, 0x6FDA, 0x9DF7, 0x6FDB, + 0x9DF8, 0x6FDC, 0x9DF9, 0x6FDD, 0x9DFA, 0x6FDF, 0x9DFB, 0x6FE2, + 0x9DFC, 0x6FE3, 0x9DFD, 0x6FE4, 0x9DFE, 0x6FE5, 0x9E40, 0x6FE6, + 0x9E41, 0x6FE7, 0x9E42, 0x6FE8, 0x9E43, 0x6FE9, 0x9E44, 0x6FEA, + 0x9E45, 0x6FEB, 0x9E46, 0x6FEC, 0x9E47, 0x6FED, 0x9E48, 0x6FF0, + 0x9E49, 0x6FF1, 0x9E4A, 0x6FF2, 0x9E4B, 0x6FF3, 0x9E4C, 0x6FF4, + 0x9E4D, 0x6FF5, 0x9E4E, 0x6FF6, 0x9E4F, 0x6FF7, 0x9E50, 0x6FF8, + 0x9E51, 0x6FF9, 0x9E52, 0x6FFA, 0x9E53, 0x6FFB, 0x9E54, 0x6FFC, + 0x9E55, 0x6FFD, 0x9E56, 0x6FFE, 0x9E57, 0x6FFF, 0x9E58, 0x7000, + 0x9E59, 0x7001, 0x9E5A, 0x7002, 0x9E5B, 0x7003, 0x9E5C, 0x7004, + 0x9E5D, 0x7005, 0x9E5E, 0x7006, 0x9E5F, 0x7007, 0x9E60, 0x7008, + 0x9E61, 0x7009, 0x9E62, 0x700A, 0x9E63, 0x700B, 0x9E64, 0x700C, + 0x9E65, 0x700D, 0x9E66, 0x700E, 0x9E67, 0x700F, 0x9E68, 0x7010, + 0x9E69, 0x7012, 0x9E6A, 0x7013, 0x9E6B, 0x7014, 0x9E6C, 0x7015, + 0x9E6D, 0x7016, 0x9E6E, 0x7017, 0x9E6F, 0x7018, 0x9E70, 0x7019, + 0x9E71, 0x701C, 0x9E72, 0x701D, 0x9E73, 0x701E, 0x9E74, 0x701F, + 0x9E75, 0x7020, 0x9E76, 0x7021, 0x9E77, 0x7022, 0x9E78, 0x7024, + 0x9E79, 0x7025, 0x9E7A, 0x7026, 0x9E7B, 0x7027, 0x9E7C, 0x7028, + 0x9E7D, 0x7029, 0x9E7E, 0x702A, 0x9E80, 0x702B, 0x9E81, 0x702C, + 0x9E82, 0x702D, 0x9E83, 0x702E, 0x9E84, 0x702F, 0x9E85, 0x7030, + 0x9E86, 0x7031, 0x9E87, 0x7032, 0x9E88, 0x7033, 0x9E89, 0x7034, + 0x9E8A, 0x7036, 0x9E8B, 0x7037, 0x9E8C, 0x7038, 0x9E8D, 0x703A, + 0x9E8E, 0x703B, 0x9E8F, 0x703C, 0x9E90, 0x703D, 0x9E91, 0x703E, + 0x9E92, 0x703F, 0x9E93, 0x7040, 0x9E94, 0x7041, 0x9E95, 0x7042, + 0x9E96, 0x7043, 0x9E97, 0x7044, 0x9E98, 0x7045, 0x9E99, 0x7046, + 0x9E9A, 0x7047, 0x9E9B, 0x7048, 0x9E9C, 0x7049, 0x9E9D, 0x704A, + 0x9E9E, 0x704B, 0x9E9F, 0x704D, 0x9EA0, 0x704E, 0x9EA1, 0x7050, + 0x9EA2, 0x7051, 0x9EA3, 0x7052, 0x9EA4, 0x7053, 0x9EA5, 0x7054, + 0x9EA6, 0x7055, 0x9EA7, 0x7056, 0x9EA8, 0x7057, 0x9EA9, 0x7058, + 0x9EAA, 0x7059, 0x9EAB, 0x705A, 0x9EAC, 0x705B, 0x9EAD, 0x705C, + 0x9EAE, 0x705D, 0x9EAF, 0x705F, 0x9EB0, 0x7060, 0x9EB1, 0x7061, + 0x9EB2, 0x7062, 0x9EB3, 0x7063, 0x9EB4, 0x7064, 0x9EB5, 0x7065, + 0x9EB6, 0x7066, 0x9EB7, 0x7067, 0x9EB8, 0x7068, 0x9EB9, 0x7069, + 0x9EBA, 0x706A, 0x9EBB, 0x706E, 0x9EBC, 0x7071, 0x9EBD, 0x7072, + 0x9EBE, 0x7073, 0x9EBF, 0x7074, 0x9EC0, 0x7077, 0x9EC1, 0x7079, + 0x9EC2, 0x707A, 0x9EC3, 0x707B, 0x9EC4, 0x707D, 0x9EC5, 0x7081, + 0x9EC6, 0x7082, 0x9EC7, 0x7083, 0x9EC8, 0x7084, 0x9EC9, 0x7086, + 0x9ECA, 0x7087, 0x9ECB, 0x7088, 0x9ECC, 0x708B, 0x9ECD, 0x708C, + 0x9ECE, 0x708D, 0x9ECF, 0x708F, 0x9ED0, 0x7090, 0x9ED1, 0x7091, + 0x9ED2, 0x7093, 0x9ED3, 0x7097, 0x9ED4, 0x7098, 0x9ED5, 0x709A, + 0x9ED6, 0x709B, 0x9ED7, 0x709E, 0x9ED8, 0x709F, 0x9ED9, 0x70A0, + 0x9EDA, 0x70A1, 0x9EDB, 0x70A2, 0x9EDC, 0x70A3, 0x9EDD, 0x70A4, + 0x9EDE, 0x70A5, 0x9EDF, 0x70A6, 0x9EE0, 0x70A7, 0x9EE1, 0x70A8, + 0x9EE2, 0x70A9, 0x9EE3, 0x70AA, 0x9EE4, 0x70B0, 0x9EE5, 0x70B2, + 0x9EE6, 0x70B4, 0x9EE7, 0x70B5, 0x9EE8, 0x70B6, 0x9EE9, 0x70BA, + 0x9EEA, 0x70BE, 0x9EEB, 0x70BF, 0x9EEC, 0x70C4, 0x9EED, 0x70C5, + 0x9EEE, 0x70C6, 0x9EEF, 0x70C7, 0x9EF0, 0x70C9, 0x9EF1, 0x70CB, + 0x9EF2, 0x70CC, 0x9EF3, 0x70CD, 0x9EF4, 0x70CE, 0x9EF5, 0x70CF, + 0x9EF6, 0x70D0, 0x9EF7, 0x70D1, 0x9EF8, 0x70D2, 0x9EF9, 0x70D3, + 0x9EFA, 0x70D4, 0x9EFB, 0x70D5, 0x9EFC, 0x70D6, 0x9EFD, 0x70D7, + 0x9EFE, 0x70DA, 0x9F40, 0x70DC, 0x9F41, 0x70DD, 0x9F42, 0x70DE, + 0x9F43, 0x70E0, 0x9F44, 0x70E1, 0x9F45, 0x70E2, 0x9F46, 0x70E3, + 0x9F47, 0x70E5, 0x9F48, 0x70EA, 0x9F49, 0x70EE, 0x9F4A, 0x70F0, + 0x9F4B, 0x70F1, 0x9F4C, 0x70F2, 0x9F4D, 0x70F3, 0x9F4E, 0x70F4, + 0x9F4F, 0x70F5, 0x9F50, 0x70F6, 0x9F51, 0x70F8, 0x9F52, 0x70FA, + 0x9F53, 0x70FB, 0x9F54, 0x70FC, 0x9F55, 0x70FE, 0x9F56, 0x70FF, + 0x9F57, 0x7100, 0x9F58, 0x7101, 0x9F59, 0x7102, 0x9F5A, 0x7103, + 0x9F5B, 0x7104, 0x9F5C, 0x7105, 0x9F5D, 0x7106, 0x9F5E, 0x7107, + 0x9F5F, 0x7108, 0x9F60, 0x710B, 0x9F61, 0x710C, 0x9F62, 0x710D, + 0x9F63, 0x710E, 0x9F64, 0x710F, 0x9F65, 0x7111, 0x9F66, 0x7112, + 0x9F67, 0x7114, 0x9F68, 0x7117, 0x9F69, 0x711B, 0x9F6A, 0x711C, + 0x9F6B, 0x711D, 0x9F6C, 0x711E, 0x9F6D, 0x711F, 0x9F6E, 0x7120, + 0x9F6F, 0x7121, 0x9F70, 0x7122, 0x9F71, 0x7123, 0x9F72, 0x7124, + 0x9F73, 0x7125, 0x9F74, 0x7127, 0x9F75, 0x7128, 0x9F76, 0x7129, + 0x9F77, 0x712A, 0x9F78, 0x712B, 0x9F79, 0x712C, 0x9F7A, 0x712D, + 0x9F7B, 0x712E, 0x9F7C, 0x7132, 0x9F7D, 0x7133, 0x9F7E, 0x7134, + 0x9F80, 0x7135, 0x9F81, 0x7137, 0x9F82, 0x7138, 0x9F83, 0x7139, + 0x9F84, 0x713A, 0x9F85, 0x713B, 0x9F86, 0x713C, 0x9F87, 0x713D, + 0x9F88, 0x713E, 0x9F89, 0x713F, 0x9F8A, 0x7140, 0x9F8B, 0x7141, + 0x9F8C, 0x7142, 0x9F8D, 0x7143, 0x9F8E, 0x7144, 0x9F8F, 0x7146, + 0x9F90, 0x7147, 0x9F91, 0x7148, 0x9F92, 0x7149, 0x9F93, 0x714B, + 0x9F94, 0x714D, 0x9F95, 0x714F, 0x9F96, 0x7150, 0x9F97, 0x7151, + 0x9F98, 0x7152, 0x9F99, 0x7153, 0x9F9A, 0x7154, 0x9F9B, 0x7155, + 0x9F9C, 0x7156, 0x9F9D, 0x7157, 0x9F9E, 0x7158, 0x9F9F, 0x7159, + 0x9FA0, 0x715A, 0x9FA1, 0x715B, 0x9FA2, 0x715D, 0x9FA3, 0x715F, + 0x9FA4, 0x7160, 0x9FA5, 0x7161, 0x9FA6, 0x7162, 0x9FA7, 0x7163, + 0x9FA8, 0x7165, 0x9FA9, 0x7169, 0x9FAA, 0x716A, 0x9FAB, 0x716B, + 0x9FAC, 0x716C, 0x9FAD, 0x716D, 0x9FAE, 0x716F, 0x9FAF, 0x7170, + 0x9FB0, 0x7171, 0x9FB1, 0x7174, 0x9FB2, 0x7175, 0x9FB3, 0x7176, + 0x9FB4, 0x7177, 0x9FB5, 0x7179, 0x9FB6, 0x717B, 0x9FB7, 0x717C, + 0x9FB8, 0x717E, 0x9FB9, 0x717F, 0x9FBA, 0x7180, 0x9FBB, 0x7181, + 0x9FBC, 0x7182, 0x9FBD, 0x7183, 0x9FBE, 0x7185, 0x9FBF, 0x7186, + 0x9FC0, 0x7187, 0x9FC1, 0x7188, 0x9FC2, 0x7189, 0x9FC3, 0x718B, + 0x9FC4, 0x718C, 0x9FC5, 0x718D, 0x9FC6, 0x718E, 0x9FC7, 0x7190, + 0x9FC8, 0x7191, 0x9FC9, 0x7192, 0x9FCA, 0x7193, 0x9FCB, 0x7195, + 0x9FCC, 0x7196, 0x9FCD, 0x7197, 0x9FCE, 0x719A, 0x9FCF, 0x719B, + 0x9FD0, 0x719C, 0x9FD1, 0x719D, 0x9FD2, 0x719E, 0x9FD3, 0x71A1, + 0x9FD4, 0x71A2, 0x9FD5, 0x71A3, 0x9FD6, 0x71A4, 0x9FD7, 0x71A5, + 0x9FD8, 0x71A6, 0x9FD9, 0x71A7, 0x9FDA, 0x71A9, 0x9FDB, 0x71AA, + 0x9FDC, 0x71AB, 0x9FDD, 0x71AD, 0x9FDE, 0x71AE, 0x9FDF, 0x71AF, + 0x9FE0, 0x71B0, 0x9FE1, 0x71B1, 0x9FE2, 0x71B2, 0x9FE3, 0x71B4, + 0x9FE4, 0x71B6, 0x9FE5, 0x71B7, 0x9FE6, 0x71B8, 0x9FE7, 0x71BA, + 0x9FE8, 0x71BB, 0x9FE9, 0x71BC, 0x9FEA, 0x71BD, 0x9FEB, 0x71BE, + 0x9FEC, 0x71BF, 0x9FED, 0x71C0, 0x9FEE, 0x71C1, 0x9FEF, 0x71C2, + 0x9FF0, 0x71C4, 0x9FF1, 0x71C5, 0x9FF2, 0x71C6, 0x9FF3, 0x71C7, + 0x9FF4, 0x71C8, 0x9FF5, 0x71C9, 0x9FF6, 0x71CA, 0x9FF7, 0x71CB, + 0x9FF8, 0x71CC, 0x9FF9, 0x71CD, 0x9FFA, 0x71CF, 0x9FFB, 0x71D0, + 0x9FFC, 0x71D1, 0x9FFD, 0x71D2, 0x9FFE, 0x71D3, 0xA040, 0x71D6, + 0xA041, 0x71D7, 0xA042, 0x71D8, 0xA043, 0x71D9, 0xA044, 0x71DA, + 0xA045, 0x71DB, 0xA046, 0x71DC, 0xA047, 0x71DD, 0xA048, 0x71DE, + 0xA049, 0x71DF, 0xA04A, 0x71E1, 0xA04B, 0x71E2, 0xA04C, 0x71E3, + 0xA04D, 0x71E4, 0xA04E, 0x71E6, 0xA04F, 0x71E8, 0xA050, 0x71E9, + 0xA051, 0x71EA, 0xA052, 0x71EB, 0xA053, 0x71EC, 0xA054, 0x71ED, + 0xA055, 0x71EF, 0xA056, 0x71F0, 0xA057, 0x71F1, 0xA058, 0x71F2, + 0xA059, 0x71F3, 0xA05A, 0x71F4, 0xA05B, 0x71F5, 0xA05C, 0x71F6, + 0xA05D, 0x71F7, 0xA05E, 0x71F8, 0xA05F, 0x71FA, 0xA060, 0x71FB, + 0xA061, 0x71FC, 0xA062, 0x71FD, 0xA063, 0x71FE, 0xA064, 0x71FF, + 0xA065, 0x7200, 0xA066, 0x7201, 0xA067, 0x7202, 0xA068, 0x7203, + 0xA069, 0x7204, 0xA06A, 0x7205, 0xA06B, 0x7207, 0xA06C, 0x7208, + 0xA06D, 0x7209, 0xA06E, 0x720A, 0xA06F, 0x720B, 0xA070, 0x720C, + 0xA071, 0x720D, 0xA072, 0x720E, 0xA073, 0x720F, 0xA074, 0x7210, + 0xA075, 0x7211, 0xA076, 0x7212, 0xA077, 0x7213, 0xA078, 0x7214, + 0xA079, 0x7215, 0xA07A, 0x7216, 0xA07B, 0x7217, 0xA07C, 0x7218, + 0xA07D, 0x7219, 0xA07E, 0x721A, 0xA080, 0x721B, 0xA081, 0x721C, + 0xA082, 0x721E, 0xA083, 0x721F, 0xA084, 0x7220, 0xA085, 0x7221, + 0xA086, 0x7222, 0xA087, 0x7223, 0xA088, 0x7224, 0xA089, 0x7225, + 0xA08A, 0x7226, 0xA08B, 0x7227, 0xA08C, 0x7229, 0xA08D, 0x722B, + 0xA08E, 0x722D, 0xA08F, 0x722E, 0xA090, 0x722F, 0xA091, 0x7232, + 0xA092, 0x7233, 0xA093, 0x7234, 0xA094, 0x723A, 0xA095, 0x723C, + 0xA096, 0x723E, 0xA097, 0x7240, 0xA098, 0x7241, 0xA099, 0x7242, + 0xA09A, 0x7243, 0xA09B, 0x7244, 0xA09C, 0x7245, 0xA09D, 0x7246, + 0xA09E, 0x7249, 0xA09F, 0x724A, 0xA0A0, 0x724B, 0xA0A1, 0x724E, + 0xA0A2, 0x724F, 0xA0A3, 0x7250, 0xA0A4, 0x7251, 0xA0A5, 0x7253, + 0xA0A6, 0x7254, 0xA0A7, 0x7255, 0xA0A8, 0x7257, 0xA0A9, 0x7258, + 0xA0AA, 0x725A, 0xA0AB, 0x725C, 0xA0AC, 0x725E, 0xA0AD, 0x7260, + 0xA0AE, 0x7263, 0xA0AF, 0x7264, 0xA0B0, 0x7265, 0xA0B1, 0x7268, + 0xA0B2, 0x726A, 0xA0B3, 0x726B, 0xA0B4, 0x726C, 0xA0B5, 0x726D, + 0xA0B6, 0x7270, 0xA0B7, 0x7271, 0xA0B8, 0x7273, 0xA0B9, 0x7274, + 0xA0BA, 0x7276, 0xA0BB, 0x7277, 0xA0BC, 0x7278, 0xA0BD, 0x727B, + 0xA0BE, 0x727C, 0xA0BF, 0x727D, 0xA0C0, 0x7282, 0xA0C1, 0x7283, + 0xA0C2, 0x7285, 0xA0C3, 0x7286, 0xA0C4, 0x7287, 0xA0C5, 0x7288, + 0xA0C6, 0x7289, 0xA0C7, 0x728C, 0xA0C8, 0x728E, 0xA0C9, 0x7290, + 0xA0CA, 0x7291, 0xA0CB, 0x7293, 0xA0CC, 0x7294, 0xA0CD, 0x7295, + 0xA0CE, 0x7296, 0xA0CF, 0x7297, 0xA0D0, 0x7298, 0xA0D1, 0x7299, + 0xA0D2, 0x729A, 0xA0D3, 0x729B, 0xA0D4, 0x729C, 0xA0D5, 0x729D, + 0xA0D6, 0x729E, 0xA0D7, 0x72A0, 0xA0D8, 0x72A1, 0xA0D9, 0x72A2, + 0xA0DA, 0x72A3, 0xA0DB, 0x72A4, 0xA0DC, 0x72A5, 0xA0DD, 0x72A6, + 0xA0DE, 0x72A7, 0xA0DF, 0x72A8, 0xA0E0, 0x72A9, 0xA0E1, 0x72AA, + 0xA0E2, 0x72AB, 0xA0E3, 0x72AE, 0xA0E4, 0x72B1, 0xA0E5, 0x72B2, + 0xA0E6, 0x72B3, 0xA0E7, 0x72B5, 0xA0E8, 0x72BA, 0xA0E9, 0x72BB, + 0xA0EA, 0x72BC, 0xA0EB, 0x72BD, 0xA0EC, 0x72BE, 0xA0ED, 0x72BF, + 0xA0EE, 0x72C0, 0xA0EF, 0x72C5, 0xA0F0, 0x72C6, 0xA0F1, 0x72C7, + 0xA0F2, 0x72C9, 0xA0F3, 0x72CA, 0xA0F4, 0x72CB, 0xA0F5, 0x72CC, + 0xA0F6, 0x72CF, 0xA0F7, 0x72D1, 0xA0F8, 0x72D3, 0xA0F9, 0x72D4, + 0xA0FA, 0x72D5, 0xA0FB, 0x72D6, 0xA0FC, 0x72D8, 0xA0FD, 0x72DA, + 0xA0FE, 0x72DB, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, + 0xA1A4, 0x00B7, 0xA1A5, 0x02C9, 0xA1A6, 0x02C7, 0xA1A7, 0x00A8, + 0xA1A8, 0x3003, 0xA1A9, 0x3005, 0xA1AA, 0x2014, 0xA1AB, 0xFF5E, + 0xA1AC, 0x2016, 0xA1AD, 0x2026, 0xA1AE, 0x2018, 0xA1AF, 0x2019, + 0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, + 0xA1B4, 0x3008, 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, + 0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, + 0xA1BC, 0x3016, 0xA1BD, 0x3017, 0xA1BE, 0x3010, 0xA1BF, 0x3011, + 0xA1C0, 0x00B1, 0xA1C1, 0x00D7, 0xA1C2, 0x00F7, 0xA1C3, 0x2236, + 0xA1C4, 0x2227, 0xA1C5, 0x2228, 0xA1C6, 0x2211, 0xA1C7, 0x220F, + 0xA1C8, 0x222A, 0xA1C9, 0x2229, 0xA1CA, 0x2208, 0xA1CB, 0x2237, + 0xA1CC, 0x221A, 0xA1CD, 0x22A5, 0xA1CE, 0x2225, 0xA1CF, 0x2220, + 0xA1D0, 0x2312, 0xA1D1, 0x2299, 0xA1D2, 0x222B, 0xA1D3, 0x222E, + 0xA1D4, 0x2261, 0xA1D5, 0x224C, 0xA1D6, 0x2248, 0xA1D7, 0x223D, + 0xA1D8, 0x221D, 0xA1D9, 0x2260, 0xA1DA, 0x226E, 0xA1DB, 0x226F, + 0xA1DC, 0x2264, 0xA1DD, 0x2265, 0xA1DE, 0x221E, 0xA1DF, 0x2235, + 0xA1E0, 0x2234, 0xA1E1, 0x2642, 0xA1E2, 0x2640, 0xA1E3, 0x00B0, + 0xA1E4, 0x2032, 0xA1E5, 0x2033, 0xA1E6, 0x2103, 0xA1E7, 0xFF04, + 0xA1E8, 0x00A4, 0xA1E9, 0xFFE0, 0xA1EA, 0xFFE1, 0xA1EB, 0x2030, + 0xA1EC, 0x00A7, 0xA1ED, 0x2116, 0xA1EE, 0x2606, 0xA1EF, 0x2605, + 0xA1F0, 0x25CB, 0xA1F1, 0x25CF, 0xA1F2, 0x25CE, 0xA1F3, 0x25C7, + 0xA1F4, 0x25C6, 0xA1F5, 0x25A1, 0xA1F6, 0x25A0, 0xA1F7, 0x25B3, + 0xA1F8, 0x25B2, 0xA1F9, 0x203B, 0xA1FA, 0x2192, 0xA1FB, 0x2190, + 0xA1FC, 0x2191, 0xA1FD, 0x2193, 0xA1FE, 0x3013, 0xA2A1, 0x2170, + 0xA2A2, 0x2171, 0xA2A3, 0x2172, 0xA2A4, 0x2173, 0xA2A5, 0x2174, + 0xA2A6, 0x2175, 0xA2A7, 0x2176, 0xA2A8, 0x2177, 0xA2A9, 0x2178, + 0xA2AA, 0x2179, 0xA2B1, 0x2488, 0xA2B2, 0x2489, 0xA2B3, 0x248A, + 0xA2B4, 0x248B, 0xA2B5, 0x248C, 0xA2B6, 0x248D, 0xA2B7, 0x248E, + 0xA2B8, 0x248F, 0xA2B9, 0x2490, 0xA2BA, 0x2491, 0xA2BB, 0x2492, + 0xA2BC, 0x2493, 0xA2BD, 0x2494, 0xA2BE, 0x2495, 0xA2BF, 0x2496, + 0xA2C0, 0x2497, 0xA2C1, 0x2498, 0xA2C2, 0x2499, 0xA2C3, 0x249A, + 0xA2C4, 0x249B, 0xA2C5, 0x2474, 0xA2C6, 0x2475, 0xA2C7, 0x2476, + 0xA2C8, 0x2477, 0xA2C9, 0x2478, 0xA2CA, 0x2479, 0xA2CB, 0x247A, + 0xA2CC, 0x247B, 0xA2CD, 0x247C, 0xA2CE, 0x247D, 0xA2CF, 0x247E, + 0xA2D0, 0x247F, 0xA2D1, 0x2480, 0xA2D2, 0x2481, 0xA2D3, 0x2482, + 0xA2D4, 0x2483, 0xA2D5, 0x2484, 0xA2D6, 0x2485, 0xA2D7, 0x2486, + 0xA2D8, 0x2487, 0xA2D9, 0x2460, 0xA2DA, 0x2461, 0xA2DB, 0x2462, + 0xA2DC, 0x2463, 0xA2DD, 0x2464, 0xA2DE, 0x2465, 0xA2DF, 0x2466, + 0xA2E0, 0x2467, 0xA2E1, 0x2468, 0xA2E2, 0x2469, 0xA2E5, 0x3220, + 0xA2E6, 0x3221, 0xA2E7, 0x3222, 0xA2E8, 0x3223, 0xA2E9, 0x3224, + 0xA2EA, 0x3225, 0xA2EB, 0x3226, 0xA2EC, 0x3227, 0xA2ED, 0x3228, + 0xA2EE, 0x3229, 0xA2F1, 0x2160, 0xA2F2, 0x2161, 0xA2F3, 0x2162, + 0xA2F4, 0x2163, 0xA2F5, 0x2164, 0xA2F6, 0x2165, 0xA2F7, 0x2166, + 0xA2F8, 0x2167, 0xA2F9, 0x2168, 0xA2FA, 0x2169, 0xA2FB, 0x216A, + 0xA2FC, 0x216B, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, + 0xA3A4, 0xFFE5, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, + 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, + 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, + 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, + 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, + 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, + 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, + 0xA3DC, 0xFF3C, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, + 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, + 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, + 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, + 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA4A1, 0x3041, + 0xA4A2, 0x3042, 0xA4A3, 0x3043, 0xA4A4, 0x3044, 0xA4A5, 0x3045, + 0xA4A6, 0x3046, 0xA4A7, 0x3047, 0xA4A8, 0x3048, 0xA4A9, 0x3049, + 0xA4AA, 0x304A, 0xA4AB, 0x304B, 0xA4AC, 0x304C, 0xA4AD, 0x304D, + 0xA4AE, 0x304E, 0xA4AF, 0x304F, 0xA4B0, 0x3050, 0xA4B1, 0x3051, + 0xA4B2, 0x3052, 0xA4B3, 0x3053, 0xA4B4, 0x3054, 0xA4B5, 0x3055, + 0xA4B6, 0x3056, 0xA4B7, 0x3057, 0xA4B8, 0x3058, 0xA4B9, 0x3059, + 0xA4BA, 0x305A, 0xA4BB, 0x305B, 0xA4BC, 0x305C, 0xA4BD, 0x305D, + 0xA4BE, 0x305E, 0xA4BF, 0x305F, 0xA4C0, 0x3060, 0xA4C1, 0x3061, + 0xA4C2, 0x3062, 0xA4C3, 0x3063, 0xA4C4, 0x3064, 0xA4C5, 0x3065, + 0xA4C6, 0x3066, 0xA4C7, 0x3067, 0xA4C8, 0x3068, 0xA4C9, 0x3069, + 0xA4CA, 0x306A, 0xA4CB, 0x306B, 0xA4CC, 0x306C, 0xA4CD, 0x306D, + 0xA4CE, 0x306E, 0xA4CF, 0x306F, 0xA4D0, 0x3070, 0xA4D1, 0x3071, + 0xA4D2, 0x3072, 0xA4D3, 0x3073, 0xA4D4, 0x3074, 0xA4D5, 0x3075, + 0xA4D6, 0x3076, 0xA4D7, 0x3077, 0xA4D8, 0x3078, 0xA4D9, 0x3079, + 0xA4DA, 0x307A, 0xA4DB, 0x307B, 0xA4DC, 0x307C, 0xA4DD, 0x307D, + 0xA4DE, 0x307E, 0xA4DF, 0x307F, 0xA4E0, 0x3080, 0xA4E1, 0x3081, + 0xA4E2, 0x3082, 0xA4E3, 0x3083, 0xA4E4, 0x3084, 0xA4E5, 0x3085, + 0xA4E6, 0x3086, 0xA4E7, 0x3087, 0xA4E8, 0x3088, 0xA4E9, 0x3089, + 0xA4EA, 0x308A, 0xA4EB, 0x308B, 0xA4EC, 0x308C, 0xA4ED, 0x308D, + 0xA4EE, 0x308E, 0xA4EF, 0x308F, 0xA4F0, 0x3090, 0xA4F1, 0x3091, + 0xA4F2, 0x3092, 0xA4F3, 0x3093, 0xA5A1, 0x30A1, 0xA5A2, 0x30A2, + 0xA5A3, 0x30A3, 0xA5A4, 0x30A4, 0xA5A5, 0x30A5, 0xA5A6, 0x30A6, + 0xA5A7, 0x30A7, 0xA5A8, 0x30A8, 0xA5A9, 0x30A9, 0xA5AA, 0x30AA, + 0xA5AB, 0x30AB, 0xA5AC, 0x30AC, 0xA5AD, 0x30AD, 0xA5AE, 0x30AE, + 0xA5AF, 0x30AF, 0xA5B0, 0x30B0, 0xA5B1, 0x30B1, 0xA5B2, 0x30B2, + 0xA5B3, 0x30B3, 0xA5B4, 0x30B4, 0xA5B5, 0x30B5, 0xA5B6, 0x30B6, + 0xA5B7, 0x30B7, 0xA5B8, 0x30B8, 0xA5B9, 0x30B9, 0xA5BA, 0x30BA, + 0xA5BB, 0x30BB, 0xA5BC, 0x30BC, 0xA5BD, 0x30BD, 0xA5BE, 0x30BE, + 0xA5BF, 0x30BF, 0xA5C0, 0x30C0, 0xA5C1, 0x30C1, 0xA5C2, 0x30C2, + 0xA5C3, 0x30C3, 0xA5C4, 0x30C4, 0xA5C5, 0x30C5, 0xA5C6, 0x30C6, + 0xA5C7, 0x30C7, 0xA5C8, 0x30C8, 0xA5C9, 0x30C9, 0xA5CA, 0x30CA, + 0xA5CB, 0x30CB, 0xA5CC, 0x30CC, 0xA5CD, 0x30CD, 0xA5CE, 0x30CE, + 0xA5CF, 0x30CF, 0xA5D0, 0x30D0, 0xA5D1, 0x30D1, 0xA5D2, 0x30D2, + 0xA5D3, 0x30D3, 0xA5D4, 0x30D4, 0xA5D5, 0x30D5, 0xA5D6, 0x30D6, + 0xA5D7, 0x30D7, 0xA5D8, 0x30D8, 0xA5D9, 0x30D9, 0xA5DA, 0x30DA, + 0xA5DB, 0x30DB, 0xA5DC, 0x30DC, 0xA5DD, 0x30DD, 0xA5DE, 0x30DE, + 0xA5DF, 0x30DF, 0xA5E0, 0x30E0, 0xA5E1, 0x30E1, 0xA5E2, 0x30E2, + 0xA5E3, 0x30E3, 0xA5E4, 0x30E4, 0xA5E5, 0x30E5, 0xA5E6, 0x30E6, + 0xA5E7, 0x30E7, 0xA5E8, 0x30E8, 0xA5E9, 0x30E9, 0xA5EA, 0x30EA, + 0xA5EB, 0x30EB, 0xA5EC, 0x30EC, 0xA5ED, 0x30ED, 0xA5EE, 0x30EE, + 0xA5EF, 0x30EF, 0xA5F0, 0x30F0, 0xA5F1, 0x30F1, 0xA5F2, 0x30F2, + 0xA5F3, 0x30F3, 0xA5F4, 0x30F4, 0xA5F5, 0x30F5, 0xA5F6, 0x30F6, + 0xA6A1, 0x0391, 0xA6A2, 0x0392, 0xA6A3, 0x0393, 0xA6A4, 0x0394, + 0xA6A5, 0x0395, 0xA6A6, 0x0396, 0xA6A7, 0x0397, 0xA6A8, 0x0398, + 0xA6A9, 0x0399, 0xA6AA, 0x039A, 0xA6AB, 0x039B, 0xA6AC, 0x039C, + 0xA6AD, 0x039D, 0xA6AE, 0x039E, 0xA6AF, 0x039F, 0xA6B0, 0x03A0, + 0xA6B1, 0x03A1, 0xA6B2, 0x03A3, 0xA6B3, 0x03A4, 0xA6B4, 0x03A5, + 0xA6B5, 0x03A6, 0xA6B6, 0x03A7, 0xA6B7, 0x03A8, 0xA6B8, 0x03A9, + 0xA6C1, 0x03B1, 0xA6C2, 0x03B2, 0xA6C3, 0x03B3, 0xA6C4, 0x03B4, + 0xA6C5, 0x03B5, 0xA6C6, 0x03B6, 0xA6C7, 0x03B7, 0xA6C8, 0x03B8, + 0xA6C9, 0x03B9, 0xA6CA, 0x03BA, 0xA6CB, 0x03BB, 0xA6CC, 0x03BC, + 0xA6CD, 0x03BD, 0xA6CE, 0x03BE, 0xA6CF, 0x03BF, 0xA6D0, 0x03C0, + 0xA6D1, 0x03C1, 0xA6D2, 0x03C3, 0xA6D3, 0x03C4, 0xA6D4, 0x03C5, + 0xA6D5, 0x03C6, 0xA6D6, 0x03C7, 0xA6D7, 0x03C8, 0xA6D8, 0x03C9, + 0xA6E0, 0xFE35, 0xA6E1, 0xFE36, 0xA6E2, 0xFE39, 0xA6E3, 0xFE3A, + 0xA6E4, 0xFE3F, 0xA6E5, 0xFE40, 0xA6E6, 0xFE3D, 0xA6E7, 0xFE3E, + 0xA6E8, 0xFE41, 0xA6E9, 0xFE42, 0xA6EA, 0xFE43, 0xA6EB, 0xFE44, + 0xA6EE, 0xFE3B, 0xA6EF, 0xFE3C, 0xA6F0, 0xFE37, 0xA6F1, 0xFE38, + 0xA6F2, 0xFE31, 0xA6F4, 0xFE33, 0xA6F5, 0xFE34, 0xA7A1, 0x0410, + 0xA7A2, 0x0411, 0xA7A3, 0x0412, 0xA7A4, 0x0413, 0xA7A5, 0x0414, + 0xA7A6, 0x0415, 0xA7A7, 0x0401, 0xA7A8, 0x0416, 0xA7A9, 0x0417, + 0xA7AA, 0x0418, 0xA7AB, 0x0419, 0xA7AC, 0x041A, 0xA7AD, 0x041B, + 0xA7AE, 0x041C, 0xA7AF, 0x041D, 0xA7B0, 0x041E, 0xA7B1, 0x041F, + 0xA7B2, 0x0420, 0xA7B3, 0x0421, 0xA7B4, 0x0422, 0xA7B5, 0x0423, + 0xA7B6, 0x0424, 0xA7B7, 0x0425, 0xA7B8, 0x0426, 0xA7B9, 0x0427, + 0xA7BA, 0x0428, 0xA7BB, 0x0429, 0xA7BC, 0x042A, 0xA7BD, 0x042B, + 0xA7BE, 0x042C, 0xA7BF, 0x042D, 0xA7C0, 0x042E, 0xA7C1, 0x042F, + 0xA7D1, 0x0430, 0xA7D2, 0x0431, 0xA7D3, 0x0432, 0xA7D4, 0x0433, + 0xA7D5, 0x0434, 0xA7D6, 0x0435, 0xA7D7, 0x0451, 0xA7D8, 0x0436, + 0xA7D9, 0x0437, 0xA7DA, 0x0438, 0xA7DB, 0x0439, 0xA7DC, 0x043A, + 0xA7DD, 0x043B, 0xA7DE, 0x043C, 0xA7DF, 0x043D, 0xA7E0, 0x043E, + 0xA7E1, 0x043F, 0xA7E2, 0x0440, 0xA7E3, 0x0441, 0xA7E4, 0x0442, + 0xA7E5, 0x0443, 0xA7E6, 0x0444, 0xA7E7, 0x0445, 0xA7E8, 0x0446, + 0xA7E9, 0x0447, 0xA7EA, 0x0448, 0xA7EB, 0x0449, 0xA7EC, 0x044A, + 0xA7ED, 0x044B, 0xA7EE, 0x044C, 0xA7EF, 0x044D, 0xA7F0, 0x044E, + 0xA7F1, 0x044F, 0xA840, 0x02CA, 0xA841, 0x02CB, 0xA842, 0x02D9, + 0xA843, 0x2013, 0xA844, 0x2015, 0xA845, 0x2025, 0xA846, 0x2035, + 0xA847, 0x2105, 0xA848, 0x2109, 0xA849, 0x2196, 0xA84A, 0x2197, + 0xA84B, 0x2198, 0xA84C, 0x2199, 0xA84D, 0x2215, 0xA84E, 0x221F, + 0xA84F, 0x2223, 0xA850, 0x2252, 0xA851, 0x2266, 0xA852, 0x2267, + 0xA853, 0x22BF, 0xA854, 0x2550, 0xA855, 0x2551, 0xA856, 0x2552, + 0xA857, 0x2553, 0xA858, 0x2554, 0xA859, 0x2555, 0xA85A, 0x2556, + 0xA85B, 0x2557, 0xA85C, 0x2558, 0xA85D, 0x2559, 0xA85E, 0x255A, + 0xA85F, 0x255B, 0xA860, 0x255C, 0xA861, 0x255D, 0xA862, 0x255E, + 0xA863, 0x255F, 0xA864, 0x2560, 0xA865, 0x2561, 0xA866, 0x2562, + 0xA867, 0x2563, 0xA868, 0x2564, 0xA869, 0x2565, 0xA86A, 0x2566, + 0xA86B, 0x2567, 0xA86C, 0x2568, 0xA86D, 0x2569, 0xA86E, 0x256A, + 0xA86F, 0x256B, 0xA870, 0x256C, 0xA871, 0x256D, 0xA872, 0x256E, + 0xA873, 0x256F, 0xA874, 0x2570, 0xA875, 0x2571, 0xA876, 0x2572, + 0xA877, 0x2573, 0xA878, 0x2581, 0xA879, 0x2582, 0xA87A, 0x2583, + 0xA87B, 0x2584, 0xA87C, 0x2585, 0xA87D, 0x2586, 0xA87E, 0x2587, + 0xA880, 0x2588, 0xA881, 0x2589, 0xA882, 0x258A, 0xA883, 0x258B, + 0xA884, 0x258C, 0xA885, 0x258D, 0xA886, 0x258E, 0xA887, 0x258F, + 0xA888, 0x2593, 0xA889, 0x2594, 0xA88A, 0x2595, 0xA88B, 0x25BC, + 0xA88C, 0x25BD, 0xA88D, 0x25E2, 0xA88E, 0x25E3, 0xA88F, 0x25E4, + 0xA890, 0x25E5, 0xA891, 0x2609, 0xA892, 0x2295, 0xA893, 0x3012, + 0xA894, 0x301D, 0xA895, 0x301E, 0xA8A1, 0x0101, 0xA8A2, 0x00E1, + 0xA8A3, 0x01CE, 0xA8A4, 0x00E0, 0xA8A5, 0x0113, 0xA8A6, 0x00E9, + 0xA8A7, 0x011B, 0xA8A8, 0x00E8, 0xA8A9, 0x012B, 0xA8AA, 0x00ED, + 0xA8AB, 0x01D0, 0xA8AC, 0x00EC, 0xA8AD, 0x014D, 0xA8AE, 0x00F3, + 0xA8AF, 0x01D2, 0xA8B0, 0x00F2, 0xA8B1, 0x016B, 0xA8B2, 0x00FA, + 0xA8B3, 0x01D4, 0xA8B4, 0x00F9, 0xA8B5, 0x01D6, 0xA8B6, 0x01D8, + 0xA8B7, 0x01DA, 0xA8B8, 0x01DC, 0xA8B9, 0x00FC, 0xA8BA, 0x00EA, + 0xA8BB, 0x0251, 0xA8BD, 0x0144, 0xA8BE, 0x0148, 0xA8C0, 0x0261, + 0xA8C5, 0x3105, 0xA8C6, 0x3106, 0xA8C7, 0x3107, 0xA8C8, 0x3108, + 0xA8C9, 0x3109, 0xA8CA, 0x310A, 0xA8CB, 0x310B, 0xA8CC, 0x310C, + 0xA8CD, 0x310D, 0xA8CE, 0x310E, 0xA8CF, 0x310F, 0xA8D0, 0x3110, + 0xA8D1, 0x3111, 0xA8D2, 0x3112, 0xA8D3, 0x3113, 0xA8D4, 0x3114, + 0xA8D5, 0x3115, 0xA8D6, 0x3116, 0xA8D7, 0x3117, 0xA8D8, 0x3118, + 0xA8D9, 0x3119, 0xA8DA, 0x311A, 0xA8DB, 0x311B, 0xA8DC, 0x311C, + 0xA8DD, 0x311D, 0xA8DE, 0x311E, 0xA8DF, 0x311F, 0xA8E0, 0x3120, + 0xA8E1, 0x3121, 0xA8E2, 0x3122, 0xA8E3, 0x3123, 0xA8E4, 0x3124, + 0xA8E5, 0x3125, 0xA8E6, 0x3126, 0xA8E7, 0x3127, 0xA8E8, 0x3128, + 0xA8E9, 0x3129, 0xA940, 0x3021, 0xA941, 0x3022, 0xA942, 0x3023, + 0xA943, 0x3024, 0xA944, 0x3025, 0xA945, 0x3026, 0xA946, 0x3027, + 0xA947, 0x3028, 0xA948, 0x3029, 0xA949, 0x32A3, 0xA94A, 0x338E, + 0xA94B, 0x338F, 0xA94C, 0x339C, 0xA94D, 0x339D, 0xA94E, 0x339E, + 0xA94F, 0x33A1, 0xA950, 0x33C4, 0xA951, 0x33CE, 0xA952, 0x33D1, + 0xA953, 0x33D2, 0xA954, 0x33D5, 0xA955, 0xFE30, 0xA956, 0xFFE2, + 0xA957, 0xFFE4, 0xA959, 0x2121, 0xA95A, 0x3231, 0xA95C, 0x2010, + 0xA960, 0x30FC, 0xA961, 0x309B, 0xA962, 0x309C, 0xA963, 0x30FD, + 0xA964, 0x30FE, 0xA965, 0x3006, 0xA966, 0x309D, 0xA967, 0x309E, + 0xA968, 0xFE49, 0xA969, 0xFE4A, 0xA96A, 0xFE4B, 0xA96B, 0xFE4C, + 0xA96C, 0xFE4D, 0xA96D, 0xFE4E, 0xA96E, 0xFE4F, 0xA96F, 0xFE50, + 0xA970, 0xFE51, 0xA971, 0xFE52, 0xA972, 0xFE54, 0xA973, 0xFE55, + 0xA974, 0xFE56, 0xA975, 0xFE57, 0xA976, 0xFE59, 0xA977, 0xFE5A, + 0xA978, 0xFE5B, 0xA979, 0xFE5C, 0xA97A, 0xFE5D, 0xA97B, 0xFE5E, + 0xA97C, 0xFE5F, 0xA97D, 0xFE60, 0xA97E, 0xFE61, 0xA980, 0xFE62, + 0xA981, 0xFE63, 0xA982, 0xFE64, 0xA983, 0xFE65, 0xA984, 0xFE66, + 0xA985, 0xFE68, 0xA986, 0xFE69, 0xA987, 0xFE6A, 0xA988, 0xFE6B, + 0xA996, 0x3007, 0xA9A4, 0x2500, 0xA9A5, 0x2501, 0xA9A6, 0x2502, + 0xA9A7, 0x2503, 0xA9A8, 0x2504, 0xA9A9, 0x2505, 0xA9AA, 0x2506, + 0xA9AB, 0x2507, 0xA9AC, 0x2508, 0xA9AD, 0x2509, 0xA9AE, 0x250A, + 0xA9AF, 0x250B, 0xA9B0, 0x250C, 0xA9B1, 0x250D, 0xA9B2, 0x250E, + 0xA9B3, 0x250F, 0xA9B4, 0x2510, 0xA9B5, 0x2511, 0xA9B6, 0x2512, + 0xA9B7, 0x2513, 0xA9B8, 0x2514, 0xA9B9, 0x2515, 0xA9BA, 0x2516, + 0xA9BB, 0x2517, 0xA9BC, 0x2518, 0xA9BD, 0x2519, 0xA9BE, 0x251A, + 0xA9BF, 0x251B, 0xA9C0, 0x251C, 0xA9C1, 0x251D, 0xA9C2, 0x251E, + 0xA9C3, 0x251F, 0xA9C4, 0x2520, 0xA9C5, 0x2521, 0xA9C6, 0x2522, + 0xA9C7, 0x2523, 0xA9C8, 0x2524, 0xA9C9, 0x2525, 0xA9CA, 0x2526, + 0xA9CB, 0x2527, 0xA9CC, 0x2528, 0xA9CD, 0x2529, 0xA9CE, 0x252A, + 0xA9CF, 0x252B, 0xA9D0, 0x252C, 0xA9D1, 0x252D, 0xA9D2, 0x252E, + 0xA9D3, 0x252F, 0xA9D4, 0x2530, 0xA9D5, 0x2531, 0xA9D6, 0x2532, + 0xA9D7, 0x2533, 0xA9D8, 0x2534, 0xA9D9, 0x2535, 0xA9DA, 0x2536, + 0xA9DB, 0x2537, 0xA9DC, 0x2538, 0xA9DD, 0x2539, 0xA9DE, 0x253A, + 0xA9DF, 0x253B, 0xA9E0, 0x253C, 0xA9E1, 0x253D, 0xA9E2, 0x253E, + 0xA9E3, 0x253F, 0xA9E4, 0x2540, 0xA9E5, 0x2541, 0xA9E6, 0x2542, + 0xA9E7, 0x2543, 0xA9E8, 0x2544, 0xA9E9, 0x2545, 0xA9EA, 0x2546, + 0xA9EB, 0x2547, 0xA9EC, 0x2548, 0xA9ED, 0x2549, 0xA9EE, 0x254A, + 0xA9EF, 0x254B, 0xAA40, 0x72DC, 0xAA41, 0x72DD, 0xAA42, 0x72DF, + 0xAA43, 0x72E2, 0xAA44, 0x72E3, 0xAA45, 0x72E4, 0xAA46, 0x72E5, + 0xAA47, 0x72E6, 0xAA48, 0x72E7, 0xAA49, 0x72EA, 0xAA4A, 0x72EB, + 0xAA4B, 0x72F5, 0xAA4C, 0x72F6, 0xAA4D, 0x72F9, 0xAA4E, 0x72FD, + 0xAA4F, 0x72FE, 0xAA50, 0x72FF, 0xAA51, 0x7300, 0xAA52, 0x7302, + 0xAA53, 0x7304, 0xAA54, 0x7305, 0xAA55, 0x7306, 0xAA56, 0x7307, + 0xAA57, 0x7308, 0xAA58, 0x7309, 0xAA59, 0x730B, 0xAA5A, 0x730C, + 0xAA5B, 0x730D, 0xAA5C, 0x730F, 0xAA5D, 0x7310, 0xAA5E, 0x7311, + 0xAA5F, 0x7312, 0xAA60, 0x7314, 0xAA61, 0x7318, 0xAA62, 0x7319, + 0xAA63, 0x731A, 0xAA64, 0x731F, 0xAA65, 0x7320, 0xAA66, 0x7323, + 0xAA67, 0x7324, 0xAA68, 0x7326, 0xAA69, 0x7327, 0xAA6A, 0x7328, + 0xAA6B, 0x732D, 0xAA6C, 0x732F, 0xAA6D, 0x7330, 0xAA6E, 0x7332, + 0xAA6F, 0x7333, 0xAA70, 0x7335, 0xAA71, 0x7336, 0xAA72, 0x733A, + 0xAA73, 0x733B, 0xAA74, 0x733C, 0xAA75, 0x733D, 0xAA76, 0x7340, + 0xAA77, 0x7341, 0xAA78, 0x7342, 0xAA79, 0x7343, 0xAA7A, 0x7344, + 0xAA7B, 0x7345, 0xAA7C, 0x7346, 0xAA7D, 0x7347, 0xAA7E, 0x7348, + 0xAA80, 0x7349, 0xAA81, 0x734A, 0xAA82, 0x734B, 0xAA83, 0x734C, + 0xAA84, 0x734E, 0xAA85, 0x734F, 0xAA86, 0x7351, 0xAA87, 0x7353, + 0xAA88, 0x7354, 0xAA89, 0x7355, 0xAA8A, 0x7356, 0xAA8B, 0x7358, + 0xAA8C, 0x7359, 0xAA8D, 0x735A, 0xAA8E, 0x735B, 0xAA8F, 0x735C, + 0xAA90, 0x735D, 0xAA91, 0x735E, 0xAA92, 0x735F, 0xAA93, 0x7361, + 0xAA94, 0x7362, 0xAA95, 0x7363, 0xAA96, 0x7364, 0xAA97, 0x7365, + 0xAA98, 0x7366, 0xAA99, 0x7367, 0xAA9A, 0x7368, 0xAA9B, 0x7369, + 0xAA9C, 0x736A, 0xAA9D, 0x736B, 0xAA9E, 0x736E, 0xAA9F, 0x7370, + 0xAAA0, 0x7371, 0xAB40, 0x7372, 0xAB41, 0x7373, 0xAB42, 0x7374, + 0xAB43, 0x7375, 0xAB44, 0x7376, 0xAB45, 0x7377, 0xAB46, 0x7378, + 0xAB47, 0x7379, 0xAB48, 0x737A, 0xAB49, 0x737B, 0xAB4A, 0x737C, + 0xAB4B, 0x737D, 0xAB4C, 0x737F, 0xAB4D, 0x7380, 0xAB4E, 0x7381, + 0xAB4F, 0x7382, 0xAB50, 0x7383, 0xAB51, 0x7385, 0xAB52, 0x7386, + 0xAB53, 0x7388, 0xAB54, 0x738A, 0xAB55, 0x738C, 0xAB56, 0x738D, + 0xAB57, 0x738F, 0xAB58, 0x7390, 0xAB59, 0x7392, 0xAB5A, 0x7393, + 0xAB5B, 0x7394, 0xAB5C, 0x7395, 0xAB5D, 0x7397, 0xAB5E, 0x7398, + 0xAB5F, 0x7399, 0xAB60, 0x739A, 0xAB61, 0x739C, 0xAB62, 0x739D, + 0xAB63, 0x739E, 0xAB64, 0x73A0, 0xAB65, 0x73A1, 0xAB66, 0x73A3, + 0xAB67, 0x73A4, 0xAB68, 0x73A5, 0xAB69, 0x73A6, 0xAB6A, 0x73A7, + 0xAB6B, 0x73A8, 0xAB6C, 0x73AA, 0xAB6D, 0x73AC, 0xAB6E, 0x73AD, + 0xAB6F, 0x73B1, 0xAB70, 0x73B4, 0xAB71, 0x73B5, 0xAB72, 0x73B6, + 0xAB73, 0x73B8, 0xAB74, 0x73B9, 0xAB75, 0x73BC, 0xAB76, 0x73BD, + 0xAB77, 0x73BE, 0xAB78, 0x73BF, 0xAB79, 0x73C1, 0xAB7A, 0x73C3, + 0xAB7B, 0x73C4, 0xAB7C, 0x73C5, 0xAB7D, 0x73C6, 0xAB7E, 0x73C7, + 0xAB80, 0x73CB, 0xAB81, 0x73CC, 0xAB82, 0x73CE, 0xAB83, 0x73D2, + 0xAB84, 0x73D3, 0xAB85, 0x73D4, 0xAB86, 0x73D5, 0xAB87, 0x73D6, + 0xAB88, 0x73D7, 0xAB89, 0x73D8, 0xAB8A, 0x73DA, 0xAB8B, 0x73DB, + 0xAB8C, 0x73DC, 0xAB8D, 0x73DD, 0xAB8E, 0x73DF, 0xAB8F, 0x73E1, + 0xAB90, 0x73E2, 0xAB91, 0x73E3, 0xAB92, 0x73E4, 0xAB93, 0x73E6, + 0xAB94, 0x73E8, 0xAB95, 0x73EA, 0xAB96, 0x73EB, 0xAB97, 0x73EC, + 0xAB98, 0x73EE, 0xAB99, 0x73EF, 0xAB9A, 0x73F0, 0xAB9B, 0x73F1, + 0xAB9C, 0x73F3, 0xAB9D, 0x73F4, 0xAB9E, 0x73F5, 0xAB9F, 0x73F6, + 0xABA0, 0x73F7, 0xAC40, 0x73F8, 0xAC41, 0x73F9, 0xAC42, 0x73FA, + 0xAC43, 0x73FB, 0xAC44, 0x73FC, 0xAC45, 0x73FD, 0xAC46, 0x73FE, + 0xAC47, 0x73FF, 0xAC48, 0x7400, 0xAC49, 0x7401, 0xAC4A, 0x7402, + 0xAC4B, 0x7404, 0xAC4C, 0x7407, 0xAC4D, 0x7408, 0xAC4E, 0x740B, + 0xAC4F, 0x740C, 0xAC50, 0x740D, 0xAC51, 0x740E, 0xAC52, 0x7411, + 0xAC53, 0x7412, 0xAC54, 0x7413, 0xAC55, 0x7414, 0xAC56, 0x7415, + 0xAC57, 0x7416, 0xAC58, 0x7417, 0xAC59, 0x7418, 0xAC5A, 0x7419, + 0xAC5B, 0x741C, 0xAC5C, 0x741D, 0xAC5D, 0x741E, 0xAC5E, 0x741F, + 0xAC5F, 0x7420, 0xAC60, 0x7421, 0xAC61, 0x7423, 0xAC62, 0x7424, + 0xAC63, 0x7427, 0xAC64, 0x7429, 0xAC65, 0x742B, 0xAC66, 0x742D, + 0xAC67, 0x742F, 0xAC68, 0x7431, 0xAC69, 0x7432, 0xAC6A, 0x7437, + 0xAC6B, 0x7438, 0xAC6C, 0x7439, 0xAC6D, 0x743A, 0xAC6E, 0x743B, + 0xAC6F, 0x743D, 0xAC70, 0x743E, 0xAC71, 0x743F, 0xAC72, 0x7440, + 0xAC73, 0x7442, 0xAC74, 0x7443, 0xAC75, 0x7444, 0xAC76, 0x7445, + 0xAC77, 0x7446, 0xAC78, 0x7447, 0xAC79, 0x7448, 0xAC7A, 0x7449, + 0xAC7B, 0x744A, 0xAC7C, 0x744B, 0xAC7D, 0x744C, 0xAC7E, 0x744D, + 0xAC80, 0x744E, 0xAC81, 0x744F, 0xAC82, 0x7450, 0xAC83, 0x7451, + 0xAC84, 0x7452, 0xAC85, 0x7453, 0xAC86, 0x7454, 0xAC87, 0x7456, + 0xAC88, 0x7458, 0xAC89, 0x745D, 0xAC8A, 0x7460, 0xAC8B, 0x7461, + 0xAC8C, 0x7462, 0xAC8D, 0x7463, 0xAC8E, 0x7464, 0xAC8F, 0x7465, + 0xAC90, 0x7466, 0xAC91, 0x7467, 0xAC92, 0x7468, 0xAC93, 0x7469, + 0xAC94, 0x746A, 0xAC95, 0x746B, 0xAC96, 0x746C, 0xAC97, 0x746E, + 0xAC98, 0x746F, 0xAC99, 0x7471, 0xAC9A, 0x7472, 0xAC9B, 0x7473, + 0xAC9C, 0x7474, 0xAC9D, 0x7475, 0xAC9E, 0x7478, 0xAC9F, 0x7479, + 0xACA0, 0x747A, 0xAD40, 0x747B, 0xAD41, 0x747C, 0xAD42, 0x747D, + 0xAD43, 0x747F, 0xAD44, 0x7482, 0xAD45, 0x7484, 0xAD46, 0x7485, + 0xAD47, 0x7486, 0xAD48, 0x7488, 0xAD49, 0x7489, 0xAD4A, 0x748A, + 0xAD4B, 0x748C, 0xAD4C, 0x748D, 0xAD4D, 0x748F, 0xAD4E, 0x7491, + 0xAD4F, 0x7492, 0xAD50, 0x7493, 0xAD51, 0x7494, 0xAD52, 0x7495, + 0xAD53, 0x7496, 0xAD54, 0x7497, 0xAD55, 0x7498, 0xAD56, 0x7499, + 0xAD57, 0x749A, 0xAD58, 0x749B, 0xAD59, 0x749D, 0xAD5A, 0x749F, + 0xAD5B, 0x74A0, 0xAD5C, 0x74A1, 0xAD5D, 0x74A2, 0xAD5E, 0x74A3, + 0xAD5F, 0x74A4, 0xAD60, 0x74A5, 0xAD61, 0x74A6, 0xAD62, 0x74AA, + 0xAD63, 0x74AB, 0xAD64, 0x74AC, 0xAD65, 0x74AD, 0xAD66, 0x74AE, + 0xAD67, 0x74AF, 0xAD68, 0x74B0, 0xAD69, 0x74B1, 0xAD6A, 0x74B2, + 0xAD6B, 0x74B3, 0xAD6C, 0x74B4, 0xAD6D, 0x74B5, 0xAD6E, 0x74B6, + 0xAD6F, 0x74B7, 0xAD70, 0x74B8, 0xAD71, 0x74B9, 0xAD72, 0x74BB, + 0xAD73, 0x74BC, 0xAD74, 0x74BD, 0xAD75, 0x74BE, 0xAD76, 0x74BF, + 0xAD77, 0x74C0, 0xAD78, 0x74C1, 0xAD79, 0x74C2, 0xAD7A, 0x74C3, + 0xAD7B, 0x74C4, 0xAD7C, 0x74C5, 0xAD7D, 0x74C6, 0xAD7E, 0x74C7, + 0xAD80, 0x74C8, 0xAD81, 0x74C9, 0xAD82, 0x74CA, 0xAD83, 0x74CB, + 0xAD84, 0x74CC, 0xAD85, 0x74CD, 0xAD86, 0x74CE, 0xAD87, 0x74CF, + 0xAD88, 0x74D0, 0xAD89, 0x74D1, 0xAD8A, 0x74D3, 0xAD8B, 0x74D4, + 0xAD8C, 0x74D5, 0xAD8D, 0x74D6, 0xAD8E, 0x74D7, 0xAD8F, 0x74D8, + 0xAD90, 0x74D9, 0xAD91, 0x74DA, 0xAD92, 0x74DB, 0xAD93, 0x74DD, + 0xAD94, 0x74DF, 0xAD95, 0x74E1, 0xAD96, 0x74E5, 0xAD97, 0x74E7, + 0xAD98, 0x74E8, 0xAD99, 0x74E9, 0xAD9A, 0x74EA, 0xAD9B, 0x74EB, + 0xAD9C, 0x74EC, 0xAD9D, 0x74ED, 0xAD9E, 0x74F0, 0xAD9F, 0x74F1, + 0xADA0, 0x74F2, 0xAE40, 0x74F3, 0xAE41, 0x74F5, 0xAE42, 0x74F8, + 0xAE43, 0x74F9, 0xAE44, 0x74FA, 0xAE45, 0x74FB, 0xAE46, 0x74FC, + 0xAE47, 0x74FD, 0xAE48, 0x74FE, 0xAE49, 0x7500, 0xAE4A, 0x7501, + 0xAE4B, 0x7502, 0xAE4C, 0x7503, 0xAE4D, 0x7505, 0xAE4E, 0x7506, + 0xAE4F, 0x7507, 0xAE50, 0x7508, 0xAE51, 0x7509, 0xAE52, 0x750A, + 0xAE53, 0x750B, 0xAE54, 0x750C, 0xAE55, 0x750E, 0xAE56, 0x7510, + 0xAE57, 0x7512, 0xAE58, 0x7514, 0xAE59, 0x7515, 0xAE5A, 0x7516, + 0xAE5B, 0x7517, 0xAE5C, 0x751B, 0xAE5D, 0x751D, 0xAE5E, 0x751E, + 0xAE5F, 0x7520, 0xAE60, 0x7521, 0xAE61, 0x7522, 0xAE62, 0x7523, + 0xAE63, 0x7524, 0xAE64, 0x7526, 0xAE65, 0x7527, 0xAE66, 0x752A, + 0xAE67, 0x752E, 0xAE68, 0x7534, 0xAE69, 0x7536, 0xAE6A, 0x7539, + 0xAE6B, 0x753C, 0xAE6C, 0x753D, 0xAE6D, 0x753F, 0xAE6E, 0x7541, + 0xAE6F, 0x7542, 0xAE70, 0x7543, 0xAE71, 0x7544, 0xAE72, 0x7546, + 0xAE73, 0x7547, 0xAE74, 0x7549, 0xAE75, 0x754A, 0xAE76, 0x754D, + 0xAE77, 0x7550, 0xAE78, 0x7551, 0xAE79, 0x7552, 0xAE7A, 0x7553, + 0xAE7B, 0x7555, 0xAE7C, 0x7556, 0xAE7D, 0x7557, 0xAE7E, 0x7558, + 0xAE80, 0x755D, 0xAE81, 0x755E, 0xAE82, 0x755F, 0xAE83, 0x7560, + 0xAE84, 0x7561, 0xAE85, 0x7562, 0xAE86, 0x7563, 0xAE87, 0x7564, + 0xAE88, 0x7567, 0xAE89, 0x7568, 0xAE8A, 0x7569, 0xAE8B, 0x756B, + 0xAE8C, 0x756C, 0xAE8D, 0x756D, 0xAE8E, 0x756E, 0xAE8F, 0x756F, + 0xAE90, 0x7570, 0xAE91, 0x7571, 0xAE92, 0x7573, 0xAE93, 0x7575, + 0xAE94, 0x7576, 0xAE95, 0x7577, 0xAE96, 0x757A, 0xAE97, 0x757B, + 0xAE98, 0x757C, 0xAE99, 0x757D, 0xAE9A, 0x757E, 0xAE9B, 0x7580, + 0xAE9C, 0x7581, 0xAE9D, 0x7582, 0xAE9E, 0x7584, 0xAE9F, 0x7585, + 0xAEA0, 0x7587, 0xAF40, 0x7588, 0xAF41, 0x7589, 0xAF42, 0x758A, + 0xAF43, 0x758C, 0xAF44, 0x758D, 0xAF45, 0x758E, 0xAF46, 0x7590, + 0xAF47, 0x7593, 0xAF48, 0x7595, 0xAF49, 0x7598, 0xAF4A, 0x759B, + 0xAF4B, 0x759C, 0xAF4C, 0x759E, 0xAF4D, 0x75A2, 0xAF4E, 0x75A6, + 0xAF4F, 0x75A7, 0xAF50, 0x75A8, 0xAF51, 0x75A9, 0xAF52, 0x75AA, + 0xAF53, 0x75AD, 0xAF54, 0x75B6, 0xAF55, 0x75B7, 0xAF56, 0x75BA, + 0xAF57, 0x75BB, 0xAF58, 0x75BF, 0xAF59, 0x75C0, 0xAF5A, 0x75C1, + 0xAF5B, 0x75C6, 0xAF5C, 0x75CB, 0xAF5D, 0x75CC, 0xAF5E, 0x75CE, + 0xAF5F, 0x75CF, 0xAF60, 0x75D0, 0xAF61, 0x75D1, 0xAF62, 0x75D3, + 0xAF63, 0x75D7, 0xAF64, 0x75D9, 0xAF65, 0x75DA, 0xAF66, 0x75DC, + 0xAF67, 0x75DD, 0xAF68, 0x75DF, 0xAF69, 0x75E0, 0xAF6A, 0x75E1, + 0xAF6B, 0x75E5, 0xAF6C, 0x75E9, 0xAF6D, 0x75EC, 0xAF6E, 0x75ED, + 0xAF6F, 0x75EE, 0xAF70, 0x75EF, 0xAF71, 0x75F2, 0xAF72, 0x75F3, + 0xAF73, 0x75F5, 0xAF74, 0x75F6, 0xAF75, 0x75F7, 0xAF76, 0x75F8, + 0xAF77, 0x75FA, 0xAF78, 0x75FB, 0xAF79, 0x75FD, 0xAF7A, 0x75FE, + 0xAF7B, 0x7602, 0xAF7C, 0x7604, 0xAF7D, 0x7606, 0xAF7E, 0x7607, + 0xAF80, 0x7608, 0xAF81, 0x7609, 0xAF82, 0x760B, 0xAF83, 0x760D, + 0xAF84, 0x760E, 0xAF85, 0x760F, 0xAF86, 0x7611, 0xAF87, 0x7612, + 0xAF88, 0x7613, 0xAF89, 0x7614, 0xAF8A, 0x7616, 0xAF8B, 0x761A, + 0xAF8C, 0x761C, 0xAF8D, 0x761D, 0xAF8E, 0x761E, 0xAF8F, 0x7621, + 0xAF90, 0x7623, 0xAF91, 0x7627, 0xAF92, 0x7628, 0xAF93, 0x762C, + 0xAF94, 0x762E, 0xAF95, 0x762F, 0xAF96, 0x7631, 0xAF97, 0x7632, + 0xAF98, 0x7636, 0xAF99, 0x7637, 0xAF9A, 0x7639, 0xAF9B, 0x763A, + 0xAF9C, 0x763B, 0xAF9D, 0x763D, 0xAF9E, 0x7641, 0xAF9F, 0x7642, + 0xAFA0, 0x7644, 0xB040, 0x7645, 0xB041, 0x7646, 0xB042, 0x7647, + 0xB043, 0x7648, 0xB044, 0x7649, 0xB045, 0x764A, 0xB046, 0x764B, + 0xB047, 0x764E, 0xB048, 0x764F, 0xB049, 0x7650, 0xB04A, 0x7651, + 0xB04B, 0x7652, 0xB04C, 0x7653, 0xB04D, 0x7655, 0xB04E, 0x7657, + 0xB04F, 0x7658, 0xB050, 0x7659, 0xB051, 0x765A, 0xB052, 0x765B, + 0xB053, 0x765D, 0xB054, 0x765F, 0xB055, 0x7660, 0xB056, 0x7661, + 0xB057, 0x7662, 0xB058, 0x7664, 0xB059, 0x7665, 0xB05A, 0x7666, + 0xB05B, 0x7667, 0xB05C, 0x7668, 0xB05D, 0x7669, 0xB05E, 0x766A, + 0xB05F, 0x766C, 0xB060, 0x766D, 0xB061, 0x766E, 0xB062, 0x7670, + 0xB063, 0x7671, 0xB064, 0x7672, 0xB065, 0x7673, 0xB066, 0x7674, + 0xB067, 0x7675, 0xB068, 0x7676, 0xB069, 0x7677, 0xB06A, 0x7679, + 0xB06B, 0x767A, 0xB06C, 0x767C, 0xB06D, 0x767F, 0xB06E, 0x7680, + 0xB06F, 0x7681, 0xB070, 0x7683, 0xB071, 0x7685, 0xB072, 0x7689, + 0xB073, 0x768A, 0xB074, 0x768C, 0xB075, 0x768D, 0xB076, 0x768F, + 0xB077, 0x7690, 0xB078, 0x7692, 0xB079, 0x7694, 0xB07A, 0x7695, + 0xB07B, 0x7697, 0xB07C, 0x7698, 0xB07D, 0x769A, 0xB07E, 0x769B, + 0xB080, 0x769C, 0xB081, 0x769D, 0xB082, 0x769E, 0xB083, 0x769F, + 0xB084, 0x76A0, 0xB085, 0x76A1, 0xB086, 0x76A2, 0xB087, 0x76A3, + 0xB088, 0x76A5, 0xB089, 0x76A6, 0xB08A, 0x76A7, 0xB08B, 0x76A8, + 0xB08C, 0x76A9, 0xB08D, 0x76AA, 0xB08E, 0x76AB, 0xB08F, 0x76AC, + 0xB090, 0x76AD, 0xB091, 0x76AF, 0xB092, 0x76B0, 0xB093, 0x76B3, + 0xB094, 0x76B5, 0xB095, 0x76B6, 0xB096, 0x76B7, 0xB097, 0x76B8, + 0xB098, 0x76B9, 0xB099, 0x76BA, 0xB09A, 0x76BB, 0xB09B, 0x76BC, + 0xB09C, 0x76BD, 0xB09D, 0x76BE, 0xB09E, 0x76C0, 0xB09F, 0x76C1, + 0xB0A0, 0x76C3, 0xB0A1, 0x554A, 0xB0A2, 0x963F, 0xB0A3, 0x57C3, + 0xB0A4, 0x6328, 0xB0A5, 0x54CE, 0xB0A6, 0x5509, 0xB0A7, 0x54C0, + 0xB0A8, 0x7691, 0xB0A9, 0x764C, 0xB0AA, 0x853C, 0xB0AB, 0x77EE, + 0xB0AC, 0x827E, 0xB0AD, 0x788D, 0xB0AE, 0x7231, 0xB0AF, 0x9698, + 0xB0B0, 0x978D, 0xB0B1, 0x6C28, 0xB0B2, 0x5B89, 0xB0B3, 0x4FFA, + 0xB0B4, 0x6309, 0xB0B5, 0x6697, 0xB0B6, 0x5CB8, 0xB0B7, 0x80FA, + 0xB0B8, 0x6848, 0xB0B9, 0x80AE, 0xB0BA, 0x6602, 0xB0BB, 0x76CE, + 0xB0BC, 0x51F9, 0xB0BD, 0x6556, 0xB0BE, 0x71AC, 0xB0BF, 0x7FF1, + 0xB0C0, 0x8884, 0xB0C1, 0x50B2, 0xB0C2, 0x5965, 0xB0C3, 0x61CA, + 0xB0C4, 0x6FB3, 0xB0C5, 0x82AD, 0xB0C6, 0x634C, 0xB0C7, 0x6252, + 0xB0C8, 0x53ED, 0xB0C9, 0x5427, 0xB0CA, 0x7B06, 0xB0CB, 0x516B, + 0xB0CC, 0x75A4, 0xB0CD, 0x5DF4, 0xB0CE, 0x62D4, 0xB0CF, 0x8DCB, + 0xB0D0, 0x9776, 0xB0D1, 0x628A, 0xB0D2, 0x8019, 0xB0D3, 0x575D, + 0xB0D4, 0x9738, 0xB0D5, 0x7F62, 0xB0D6, 0x7238, 0xB0D7, 0x767D, + 0xB0D8, 0x67CF, 0xB0D9, 0x767E, 0xB0DA, 0x6446, 0xB0DB, 0x4F70, + 0xB0DC, 0x8D25, 0xB0DD, 0x62DC, 0xB0DE, 0x7A17, 0xB0DF, 0x6591, + 0xB0E0, 0x73ED, 0xB0E1, 0x642C, 0xB0E2, 0x6273, 0xB0E3, 0x822C, + 0xB0E4, 0x9881, 0xB0E5, 0x677F, 0xB0E6, 0x7248, 0xB0E7, 0x626E, + 0xB0E8, 0x62CC, 0xB0E9, 0x4F34, 0xB0EA, 0x74E3, 0xB0EB, 0x534A, + 0xB0EC, 0x529E, 0xB0ED, 0x7ECA, 0xB0EE, 0x90A6, 0xB0EF, 0x5E2E, + 0xB0F0, 0x6886, 0xB0F1, 0x699C, 0xB0F2, 0x8180, 0xB0F3, 0x7ED1, + 0xB0F4, 0x68D2, 0xB0F5, 0x78C5, 0xB0F6, 0x868C, 0xB0F7, 0x9551, + 0xB0F8, 0x508D, 0xB0F9, 0x8C24, 0xB0FA, 0x82DE, 0xB0FB, 0x80DE, + 0xB0FC, 0x5305, 0xB0FD, 0x8912, 0xB0FE, 0x5265, 0xB140, 0x76C4, + 0xB141, 0x76C7, 0xB142, 0x76C9, 0xB143, 0x76CB, 0xB144, 0x76CC, + 0xB145, 0x76D3, 0xB146, 0x76D5, 0xB147, 0x76D9, 0xB148, 0x76DA, + 0xB149, 0x76DC, 0xB14A, 0x76DD, 0xB14B, 0x76DE, 0xB14C, 0x76E0, + 0xB14D, 0x76E1, 0xB14E, 0x76E2, 0xB14F, 0x76E3, 0xB150, 0x76E4, + 0xB151, 0x76E6, 0xB152, 0x76E7, 0xB153, 0x76E8, 0xB154, 0x76E9, + 0xB155, 0x76EA, 0xB156, 0x76EB, 0xB157, 0x76EC, 0xB158, 0x76ED, + 0xB159, 0x76F0, 0xB15A, 0x76F3, 0xB15B, 0x76F5, 0xB15C, 0x76F6, + 0xB15D, 0x76F7, 0xB15E, 0x76FA, 0xB15F, 0x76FB, 0xB160, 0x76FD, + 0xB161, 0x76FF, 0xB162, 0x7700, 0xB163, 0x7702, 0xB164, 0x7703, + 0xB165, 0x7705, 0xB166, 0x7706, 0xB167, 0x770A, 0xB168, 0x770C, + 0xB169, 0x770E, 0xB16A, 0x770F, 0xB16B, 0x7710, 0xB16C, 0x7711, + 0xB16D, 0x7712, 0xB16E, 0x7713, 0xB16F, 0x7714, 0xB170, 0x7715, + 0xB171, 0x7716, 0xB172, 0x7717, 0xB173, 0x7718, 0xB174, 0x771B, + 0xB175, 0x771C, 0xB176, 0x771D, 0xB177, 0x771E, 0xB178, 0x7721, + 0xB179, 0x7723, 0xB17A, 0x7724, 0xB17B, 0x7725, 0xB17C, 0x7727, + 0xB17D, 0x772A, 0xB17E, 0x772B, 0xB180, 0x772C, 0xB181, 0x772E, + 0xB182, 0x7730, 0xB183, 0x7731, 0xB184, 0x7732, 0xB185, 0x7733, + 0xB186, 0x7734, 0xB187, 0x7739, 0xB188, 0x773B, 0xB189, 0x773D, + 0xB18A, 0x773E, 0xB18B, 0x773F, 0xB18C, 0x7742, 0xB18D, 0x7744, + 0xB18E, 0x7745, 0xB18F, 0x7746, 0xB190, 0x7748, 0xB191, 0x7749, + 0xB192, 0x774A, 0xB193, 0x774B, 0xB194, 0x774C, 0xB195, 0x774D, + 0xB196, 0x774E, 0xB197, 0x774F, 0xB198, 0x7752, 0xB199, 0x7753, + 0xB19A, 0x7754, 0xB19B, 0x7755, 0xB19C, 0x7756, 0xB19D, 0x7757, + 0xB19E, 0x7758, 0xB19F, 0x7759, 0xB1A0, 0x775C, 0xB1A1, 0x8584, + 0xB1A2, 0x96F9, 0xB1A3, 0x4FDD, 0xB1A4, 0x5821, 0xB1A5, 0x9971, + 0xB1A6, 0x5B9D, 0xB1A7, 0x62B1, 0xB1A8, 0x62A5, 0xB1A9, 0x66B4, + 0xB1AA, 0x8C79, 0xB1AB, 0x9C8D, 0xB1AC, 0x7206, 0xB1AD, 0x676F, + 0xB1AE, 0x7891, 0xB1AF, 0x60B2, 0xB1B0, 0x5351, 0xB1B1, 0x5317, + 0xB1B2, 0x8F88, 0xB1B3, 0x80CC, 0xB1B4, 0x8D1D, 0xB1B5, 0x94A1, + 0xB1B6, 0x500D, 0xB1B7, 0x72C8, 0xB1B8, 0x5907, 0xB1B9, 0x60EB, + 0xB1BA, 0x7119, 0xB1BB, 0x88AB, 0xB1BC, 0x5954, 0xB1BD, 0x82EF, + 0xB1BE, 0x672C, 0xB1BF, 0x7B28, 0xB1C0, 0x5D29, 0xB1C1, 0x7EF7, + 0xB1C2, 0x752D, 0xB1C3, 0x6CF5, 0xB1C4, 0x8E66, 0xB1C5, 0x8FF8, + 0xB1C6, 0x903C, 0xB1C7, 0x9F3B, 0xB1C8, 0x6BD4, 0xB1C9, 0x9119, + 0xB1CA, 0x7B14, 0xB1CB, 0x5F7C, 0xB1CC, 0x78A7, 0xB1CD, 0x84D6, + 0xB1CE, 0x853D, 0xB1CF, 0x6BD5, 0xB1D0, 0x6BD9, 0xB1D1, 0x6BD6, + 0xB1D2, 0x5E01, 0xB1D3, 0x5E87, 0xB1D4, 0x75F9, 0xB1D5, 0x95ED, + 0xB1D6, 0x655D, 0xB1D7, 0x5F0A, 0xB1D8, 0x5FC5, 0xB1D9, 0x8F9F, + 0xB1DA, 0x58C1, 0xB1DB, 0x81C2, 0xB1DC, 0x907F, 0xB1DD, 0x965B, + 0xB1DE, 0x97AD, 0xB1DF, 0x8FB9, 0xB1E0, 0x7F16, 0xB1E1, 0x8D2C, + 0xB1E2, 0x6241, 0xB1E3, 0x4FBF, 0xB1E4, 0x53D8, 0xB1E5, 0x535E, + 0xB1E6, 0x8FA8, 0xB1E7, 0x8FA9, 0xB1E8, 0x8FAB, 0xB1E9, 0x904D, + 0xB1EA, 0x6807, 0xB1EB, 0x5F6A, 0xB1EC, 0x8198, 0xB1ED, 0x8868, + 0xB1EE, 0x9CD6, 0xB1EF, 0x618B, 0xB1F0, 0x522B, 0xB1F1, 0x762A, + 0xB1F2, 0x5F6C, 0xB1F3, 0x658C, 0xB1F4, 0x6FD2, 0xB1F5, 0x6EE8, + 0xB1F6, 0x5BBE, 0xB1F7, 0x6448, 0xB1F8, 0x5175, 0xB1F9, 0x51B0, + 0xB1FA, 0x67C4, 0xB1FB, 0x4E19, 0xB1FC, 0x79C9, 0xB1FD, 0x997C, + 0xB1FE, 0x70B3, 0xB240, 0x775D, 0xB241, 0x775E, 0xB242, 0x775F, + 0xB243, 0x7760, 0xB244, 0x7764, 0xB245, 0x7767, 0xB246, 0x7769, + 0xB247, 0x776A, 0xB248, 0x776D, 0xB249, 0x776E, 0xB24A, 0x776F, + 0xB24B, 0x7770, 0xB24C, 0x7771, 0xB24D, 0x7772, 0xB24E, 0x7773, + 0xB24F, 0x7774, 0xB250, 0x7775, 0xB251, 0x7776, 0xB252, 0x7777, + 0xB253, 0x7778, 0xB254, 0x777A, 0xB255, 0x777B, 0xB256, 0x777C, + 0xB257, 0x7781, 0xB258, 0x7782, 0xB259, 0x7783, 0xB25A, 0x7786, + 0xB25B, 0x7787, 0xB25C, 0x7788, 0xB25D, 0x7789, 0xB25E, 0x778A, + 0xB25F, 0x778B, 0xB260, 0x778F, 0xB261, 0x7790, 0xB262, 0x7793, + 0xB263, 0x7794, 0xB264, 0x7795, 0xB265, 0x7796, 0xB266, 0x7797, + 0xB267, 0x7798, 0xB268, 0x7799, 0xB269, 0x779A, 0xB26A, 0x779B, + 0xB26B, 0x779C, 0xB26C, 0x779D, 0xB26D, 0x779E, 0xB26E, 0x77A1, + 0xB26F, 0x77A3, 0xB270, 0x77A4, 0xB271, 0x77A6, 0xB272, 0x77A8, + 0xB273, 0x77AB, 0xB274, 0x77AD, 0xB275, 0x77AE, 0xB276, 0x77AF, + 0xB277, 0x77B1, 0xB278, 0x77B2, 0xB279, 0x77B4, 0xB27A, 0x77B6, + 0xB27B, 0x77B7, 0xB27C, 0x77B8, 0xB27D, 0x77B9, 0xB27E, 0x77BA, + 0xB280, 0x77BC, 0xB281, 0x77BE, 0xB282, 0x77C0, 0xB283, 0x77C1, + 0xB284, 0x77C2, 0xB285, 0x77C3, 0xB286, 0x77C4, 0xB287, 0x77C5, + 0xB288, 0x77C6, 0xB289, 0x77C7, 0xB28A, 0x77C8, 0xB28B, 0x77C9, + 0xB28C, 0x77CA, 0xB28D, 0x77CB, 0xB28E, 0x77CC, 0xB28F, 0x77CE, + 0xB290, 0x77CF, 0xB291, 0x77D0, 0xB292, 0x77D1, 0xB293, 0x77D2, + 0xB294, 0x77D3, 0xB295, 0x77D4, 0xB296, 0x77D5, 0xB297, 0x77D6, + 0xB298, 0x77D8, 0xB299, 0x77D9, 0xB29A, 0x77DA, 0xB29B, 0x77DD, + 0xB29C, 0x77DE, 0xB29D, 0x77DF, 0xB29E, 0x77E0, 0xB29F, 0x77E1, + 0xB2A0, 0x77E4, 0xB2A1, 0x75C5, 0xB2A2, 0x5E76, 0xB2A3, 0x73BB, + 0xB2A4, 0x83E0, 0xB2A5, 0x64AD, 0xB2A6, 0x62E8, 0xB2A7, 0x94B5, + 0xB2A8, 0x6CE2, 0xB2A9, 0x535A, 0xB2AA, 0x52C3, 0xB2AB, 0x640F, + 0xB2AC, 0x94C2, 0xB2AD, 0x7B94, 0xB2AE, 0x4F2F, 0xB2AF, 0x5E1B, + 0xB2B0, 0x8236, 0xB2B1, 0x8116, 0xB2B2, 0x818A, 0xB2B3, 0x6E24, + 0xB2B4, 0x6CCA, 0xB2B5, 0x9A73, 0xB2B6, 0x6355, 0xB2B7, 0x535C, + 0xB2B8, 0x54FA, 0xB2B9, 0x8865, 0xB2BA, 0x57E0, 0xB2BB, 0x4E0D, + 0xB2BC, 0x5E03, 0xB2BD, 0x6B65, 0xB2BE, 0x7C3F, 0xB2BF, 0x90E8, + 0xB2C0, 0x6016, 0xB2C1, 0x64E6, 0xB2C2, 0x731C, 0xB2C3, 0x88C1, + 0xB2C4, 0x6750, 0xB2C5, 0x624D, 0xB2C6, 0x8D22, 0xB2C7, 0x776C, + 0xB2C8, 0x8E29, 0xB2C9, 0x91C7, 0xB2CA, 0x5F69, 0xB2CB, 0x83DC, + 0xB2CC, 0x8521, 0xB2CD, 0x9910, 0xB2CE, 0x53C2, 0xB2CF, 0x8695, + 0xB2D0, 0x6B8B, 0xB2D1, 0x60ED, 0xB2D2, 0x60E8, 0xB2D3, 0x707F, + 0xB2D4, 0x82CD, 0xB2D5, 0x8231, 0xB2D6, 0x4ED3, 0xB2D7, 0x6CA7, + 0xB2D8, 0x85CF, 0xB2D9, 0x64CD, 0xB2DA, 0x7CD9, 0xB2DB, 0x69FD, + 0xB2DC, 0x66F9, 0xB2DD, 0x8349, 0xB2DE, 0x5395, 0xB2DF, 0x7B56, + 0xB2E0, 0x4FA7, 0xB2E1, 0x518C, 0xB2E2, 0x6D4B, 0xB2E3, 0x5C42, + 0xB2E4, 0x8E6D, 0xB2E5, 0x63D2, 0xB2E6, 0x53C9, 0xB2E7, 0x832C, + 0xB2E8, 0x8336, 0xB2E9, 0x67E5, 0xB2EA, 0x78B4, 0xB2EB, 0x643D, + 0xB2EC, 0x5BDF, 0xB2ED, 0x5C94, 0xB2EE, 0x5DEE, 0xB2EF, 0x8BE7, + 0xB2F0, 0x62C6, 0xB2F1, 0x67F4, 0xB2F2, 0x8C7A, 0xB2F3, 0x6400, + 0xB2F4, 0x63BA, 0xB2F5, 0x8749, 0xB2F6, 0x998B, 0xB2F7, 0x8C17, + 0xB2F8, 0x7F20, 0xB2F9, 0x94F2, 0xB2FA, 0x4EA7, 0xB2FB, 0x9610, + 0xB2FC, 0x98A4, 0xB2FD, 0x660C, 0xB2FE, 0x7316, 0xB340, 0x77E6, + 0xB341, 0x77E8, 0xB342, 0x77EA, 0xB343, 0x77EF, 0xB344, 0x77F0, + 0xB345, 0x77F1, 0xB346, 0x77F2, 0xB347, 0x77F4, 0xB348, 0x77F5, + 0xB349, 0x77F7, 0xB34A, 0x77F9, 0xB34B, 0x77FA, 0xB34C, 0x77FB, + 0xB34D, 0x77FC, 0xB34E, 0x7803, 0xB34F, 0x7804, 0xB350, 0x7805, + 0xB351, 0x7806, 0xB352, 0x7807, 0xB353, 0x7808, 0xB354, 0x780A, + 0xB355, 0x780B, 0xB356, 0x780E, 0xB357, 0x780F, 0xB358, 0x7810, + 0xB359, 0x7813, 0xB35A, 0x7815, 0xB35B, 0x7819, 0xB35C, 0x781B, + 0xB35D, 0x781E, 0xB35E, 0x7820, 0xB35F, 0x7821, 0xB360, 0x7822, + 0xB361, 0x7824, 0xB362, 0x7828, 0xB363, 0x782A, 0xB364, 0x782B, + 0xB365, 0x782E, 0xB366, 0x782F, 0xB367, 0x7831, 0xB368, 0x7832, + 0xB369, 0x7833, 0xB36A, 0x7835, 0xB36B, 0x7836, 0xB36C, 0x783D, + 0xB36D, 0x783F, 0xB36E, 0x7841, 0xB36F, 0x7842, 0xB370, 0x7843, + 0xB371, 0x7844, 0xB372, 0x7846, 0xB373, 0x7848, 0xB374, 0x7849, + 0xB375, 0x784A, 0xB376, 0x784B, 0xB377, 0x784D, 0xB378, 0x784F, + 0xB379, 0x7851, 0xB37A, 0x7853, 0xB37B, 0x7854, 0xB37C, 0x7858, + 0xB37D, 0x7859, 0xB37E, 0x785A, 0xB380, 0x785B, 0xB381, 0x785C, + 0xB382, 0x785E, 0xB383, 0x785F, 0xB384, 0x7860, 0xB385, 0x7861, + 0xB386, 0x7862, 0xB387, 0x7863, 0xB388, 0x7864, 0xB389, 0x7865, + 0xB38A, 0x7866, 0xB38B, 0x7867, 0xB38C, 0x7868, 0xB38D, 0x7869, + 0xB38E, 0x786F, 0xB38F, 0x7870, 0xB390, 0x7871, 0xB391, 0x7872, + 0xB392, 0x7873, 0xB393, 0x7874, 0xB394, 0x7875, 0xB395, 0x7876, + 0xB396, 0x7878, 0xB397, 0x7879, 0xB398, 0x787A, 0xB399, 0x787B, + 0xB39A, 0x787D, 0xB39B, 0x787E, 0xB39C, 0x787F, 0xB39D, 0x7880, + 0xB39E, 0x7881, 0xB39F, 0x7882, 0xB3A0, 0x7883, 0xB3A1, 0x573A, + 0xB3A2, 0x5C1D, 0xB3A3, 0x5E38, 0xB3A4, 0x957F, 0xB3A5, 0x507F, + 0xB3A6, 0x80A0, 0xB3A7, 0x5382, 0xB3A8, 0x655E, 0xB3A9, 0x7545, + 0xB3AA, 0x5531, 0xB3AB, 0x5021, 0xB3AC, 0x8D85, 0xB3AD, 0x6284, + 0xB3AE, 0x949E, 0xB3AF, 0x671D, 0xB3B0, 0x5632, 0xB3B1, 0x6F6E, + 0xB3B2, 0x5DE2, 0xB3B3, 0x5435, 0xB3B4, 0x7092, 0xB3B5, 0x8F66, + 0xB3B6, 0x626F, 0xB3B7, 0x64A4, 0xB3B8, 0x63A3, 0xB3B9, 0x5F7B, + 0xB3BA, 0x6F88, 0xB3BB, 0x90F4, 0xB3BC, 0x81E3, 0xB3BD, 0x8FB0, + 0xB3BE, 0x5C18, 0xB3BF, 0x6668, 0xB3C0, 0x5FF1, 0xB3C1, 0x6C89, + 0xB3C2, 0x9648, 0xB3C3, 0x8D81, 0xB3C4, 0x886C, 0xB3C5, 0x6491, + 0xB3C6, 0x79F0, 0xB3C7, 0x57CE, 0xB3C8, 0x6A59, 0xB3C9, 0x6210, + 0xB3CA, 0x5448, 0xB3CB, 0x4E58, 0xB3CC, 0x7A0B, 0xB3CD, 0x60E9, + 0xB3CE, 0x6F84, 0xB3CF, 0x8BDA, 0xB3D0, 0x627F, 0xB3D1, 0x901E, + 0xB3D2, 0x9A8B, 0xB3D3, 0x79E4, 0xB3D4, 0x5403, 0xB3D5, 0x75F4, + 0xB3D6, 0x6301, 0xB3D7, 0x5319, 0xB3D8, 0x6C60, 0xB3D9, 0x8FDF, + 0xB3DA, 0x5F1B, 0xB3DB, 0x9A70, 0xB3DC, 0x803B, 0xB3DD, 0x9F7F, + 0xB3DE, 0x4F88, 0xB3DF, 0x5C3A, 0xB3E0, 0x8D64, 0xB3E1, 0x7FC5, + 0xB3E2, 0x65A5, 0xB3E3, 0x70BD, 0xB3E4, 0x5145, 0xB3E5, 0x51B2, + 0xB3E6, 0x866B, 0xB3E7, 0x5D07, 0xB3E8, 0x5BA0, 0xB3E9, 0x62BD, + 0xB3EA, 0x916C, 0xB3EB, 0x7574, 0xB3EC, 0x8E0C, 0xB3ED, 0x7A20, + 0xB3EE, 0x6101, 0xB3EF, 0x7B79, 0xB3F0, 0x4EC7, 0xB3F1, 0x7EF8, + 0xB3F2, 0x7785, 0xB3F3, 0x4E11, 0xB3F4, 0x81ED, 0xB3F5, 0x521D, + 0xB3F6, 0x51FA, 0xB3F7, 0x6A71, 0xB3F8, 0x53A8, 0xB3F9, 0x8E87, + 0xB3FA, 0x9504, 0xB3FB, 0x96CF, 0xB3FC, 0x6EC1, 0xB3FD, 0x9664, + 0xB3FE, 0x695A, 0xB440, 0x7884, 0xB441, 0x7885, 0xB442, 0x7886, + 0xB443, 0x7888, 0xB444, 0x788A, 0xB445, 0x788B, 0xB446, 0x788F, + 0xB447, 0x7890, 0xB448, 0x7892, 0xB449, 0x7894, 0xB44A, 0x7895, + 0xB44B, 0x7896, 0xB44C, 0x7899, 0xB44D, 0x789D, 0xB44E, 0x789E, + 0xB44F, 0x78A0, 0xB450, 0x78A2, 0xB451, 0x78A4, 0xB452, 0x78A6, + 0xB453, 0x78A8, 0xB454, 0x78A9, 0xB455, 0x78AA, 0xB456, 0x78AB, + 0xB457, 0x78AC, 0xB458, 0x78AD, 0xB459, 0x78AE, 0xB45A, 0x78AF, + 0xB45B, 0x78B5, 0xB45C, 0x78B6, 0xB45D, 0x78B7, 0xB45E, 0x78B8, + 0xB45F, 0x78BA, 0xB460, 0x78BB, 0xB461, 0x78BC, 0xB462, 0x78BD, + 0xB463, 0x78BF, 0xB464, 0x78C0, 0xB465, 0x78C2, 0xB466, 0x78C3, + 0xB467, 0x78C4, 0xB468, 0x78C6, 0xB469, 0x78C7, 0xB46A, 0x78C8, + 0xB46B, 0x78CC, 0xB46C, 0x78CD, 0xB46D, 0x78CE, 0xB46E, 0x78CF, + 0xB46F, 0x78D1, 0xB470, 0x78D2, 0xB471, 0x78D3, 0xB472, 0x78D6, + 0xB473, 0x78D7, 0xB474, 0x78D8, 0xB475, 0x78DA, 0xB476, 0x78DB, + 0xB477, 0x78DC, 0xB478, 0x78DD, 0xB479, 0x78DE, 0xB47A, 0x78DF, + 0xB47B, 0x78E0, 0xB47C, 0x78E1, 0xB47D, 0x78E2, 0xB47E, 0x78E3, + 0xB480, 0x78E4, 0xB481, 0x78E5, 0xB482, 0x78E6, 0xB483, 0x78E7, + 0xB484, 0x78E9, 0xB485, 0x78EA, 0xB486, 0x78EB, 0xB487, 0x78ED, + 0xB488, 0x78EE, 0xB489, 0x78EF, 0xB48A, 0x78F0, 0xB48B, 0x78F1, + 0xB48C, 0x78F3, 0xB48D, 0x78F5, 0xB48E, 0x78F6, 0xB48F, 0x78F8, + 0xB490, 0x78F9, 0xB491, 0x78FB, 0xB492, 0x78FC, 0xB493, 0x78FD, + 0xB494, 0x78FE, 0xB495, 0x78FF, 0xB496, 0x7900, 0xB497, 0x7902, + 0xB498, 0x7903, 0xB499, 0x7904, 0xB49A, 0x7906, 0xB49B, 0x7907, + 0xB49C, 0x7908, 0xB49D, 0x7909, 0xB49E, 0x790A, 0xB49F, 0x790B, + 0xB4A0, 0x790C, 0xB4A1, 0x7840, 0xB4A2, 0x50A8, 0xB4A3, 0x77D7, + 0xB4A4, 0x6410, 0xB4A5, 0x89E6, 0xB4A6, 0x5904, 0xB4A7, 0x63E3, + 0xB4A8, 0x5DDD, 0xB4A9, 0x7A7F, 0xB4AA, 0x693D, 0xB4AB, 0x4F20, + 0xB4AC, 0x8239, 0xB4AD, 0x5598, 0xB4AE, 0x4E32, 0xB4AF, 0x75AE, + 0xB4B0, 0x7A97, 0xB4B1, 0x5E62, 0xB4B2, 0x5E8A, 0xB4B3, 0x95EF, + 0xB4B4, 0x521B, 0xB4B5, 0x5439, 0xB4B6, 0x708A, 0xB4B7, 0x6376, + 0xB4B8, 0x9524, 0xB4B9, 0x5782, 0xB4BA, 0x6625, 0xB4BB, 0x693F, + 0xB4BC, 0x9187, 0xB4BD, 0x5507, 0xB4BE, 0x6DF3, 0xB4BF, 0x7EAF, + 0xB4C0, 0x8822, 0xB4C1, 0x6233, 0xB4C2, 0x7EF0, 0xB4C3, 0x75B5, + 0xB4C4, 0x8328, 0xB4C5, 0x78C1, 0xB4C6, 0x96CC, 0xB4C7, 0x8F9E, + 0xB4C8, 0x6148, 0xB4C9, 0x74F7, 0xB4CA, 0x8BCD, 0xB4CB, 0x6B64, + 0xB4CC, 0x523A, 0xB4CD, 0x8D50, 0xB4CE, 0x6B21, 0xB4CF, 0x806A, + 0xB4D0, 0x8471, 0xB4D1, 0x56F1, 0xB4D2, 0x5306, 0xB4D3, 0x4ECE, + 0xB4D4, 0x4E1B, 0xB4D5, 0x51D1, 0xB4D6, 0x7C97, 0xB4D7, 0x918B, + 0xB4D8, 0x7C07, 0xB4D9, 0x4FC3, 0xB4DA, 0x8E7F, 0xB4DB, 0x7BE1, + 0xB4DC, 0x7A9C, 0xB4DD, 0x6467, 0xB4DE, 0x5D14, 0xB4DF, 0x50AC, + 0xB4E0, 0x8106, 0xB4E1, 0x7601, 0xB4E2, 0x7CB9, 0xB4E3, 0x6DEC, + 0xB4E4, 0x7FE0, 0xB4E5, 0x6751, 0xB4E6, 0x5B58, 0xB4E7, 0x5BF8, + 0xB4E8, 0x78CB, 0xB4E9, 0x64AE, 0xB4EA, 0x6413, 0xB4EB, 0x63AA, + 0xB4EC, 0x632B, 0xB4ED, 0x9519, 0xB4EE, 0x642D, 0xB4EF, 0x8FBE, + 0xB4F0, 0x7B54, 0xB4F1, 0x7629, 0xB4F2, 0x6253, 0xB4F3, 0x5927, + 0xB4F4, 0x5446, 0xB4F5, 0x6B79, 0xB4F6, 0x50A3, 0xB4F7, 0x6234, + 0xB4F8, 0x5E26, 0xB4F9, 0x6B86, 0xB4FA, 0x4EE3, 0xB4FB, 0x8D37, + 0xB4FC, 0x888B, 0xB4FD, 0x5F85, 0xB4FE, 0x902E, 0xB540, 0x790D, + 0xB541, 0x790E, 0xB542, 0x790F, 0xB543, 0x7910, 0xB544, 0x7911, + 0xB545, 0x7912, 0xB546, 0x7914, 0xB547, 0x7915, 0xB548, 0x7916, + 0xB549, 0x7917, 0xB54A, 0x7918, 0xB54B, 0x7919, 0xB54C, 0x791A, + 0xB54D, 0x791B, 0xB54E, 0x791C, 0xB54F, 0x791D, 0xB550, 0x791F, + 0xB551, 0x7920, 0xB552, 0x7921, 0xB553, 0x7922, 0xB554, 0x7923, + 0xB555, 0x7925, 0xB556, 0x7926, 0xB557, 0x7927, 0xB558, 0x7928, + 0xB559, 0x7929, 0xB55A, 0x792A, 0xB55B, 0x792B, 0xB55C, 0x792C, + 0xB55D, 0x792D, 0xB55E, 0x792E, 0xB55F, 0x792F, 0xB560, 0x7930, + 0xB561, 0x7931, 0xB562, 0x7932, 0xB563, 0x7933, 0xB564, 0x7935, + 0xB565, 0x7936, 0xB566, 0x7937, 0xB567, 0x7938, 0xB568, 0x7939, + 0xB569, 0x793D, 0xB56A, 0x793F, 0xB56B, 0x7942, 0xB56C, 0x7943, + 0xB56D, 0x7944, 0xB56E, 0x7945, 0xB56F, 0x7947, 0xB570, 0x794A, + 0xB571, 0x794B, 0xB572, 0x794C, 0xB573, 0x794D, 0xB574, 0x794E, + 0xB575, 0x794F, 0xB576, 0x7950, 0xB577, 0x7951, 0xB578, 0x7952, + 0xB579, 0x7954, 0xB57A, 0x7955, 0xB57B, 0x7958, 0xB57C, 0x7959, + 0xB57D, 0x7961, 0xB57E, 0x7963, 0xB580, 0x7964, 0xB581, 0x7966, + 0xB582, 0x7969, 0xB583, 0x796A, 0xB584, 0x796B, 0xB585, 0x796C, + 0xB586, 0x796E, 0xB587, 0x7970, 0xB588, 0x7971, 0xB589, 0x7972, + 0xB58A, 0x7973, 0xB58B, 0x7974, 0xB58C, 0x7975, 0xB58D, 0x7976, + 0xB58E, 0x7979, 0xB58F, 0x797B, 0xB590, 0x797C, 0xB591, 0x797D, + 0xB592, 0x797E, 0xB593, 0x797F, 0xB594, 0x7982, 0xB595, 0x7983, + 0xB596, 0x7986, 0xB597, 0x7987, 0xB598, 0x7988, 0xB599, 0x7989, + 0xB59A, 0x798B, 0xB59B, 0x798C, 0xB59C, 0x798D, 0xB59D, 0x798E, + 0xB59E, 0x7990, 0xB59F, 0x7991, 0xB5A0, 0x7992, 0xB5A1, 0x6020, + 0xB5A2, 0x803D, 0xB5A3, 0x62C5, 0xB5A4, 0x4E39, 0xB5A5, 0x5355, + 0xB5A6, 0x90F8, 0xB5A7, 0x63B8, 0xB5A8, 0x80C6, 0xB5A9, 0x65E6, + 0xB5AA, 0x6C2E, 0xB5AB, 0x4F46, 0xB5AC, 0x60EE, 0xB5AD, 0x6DE1, + 0xB5AE, 0x8BDE, 0xB5AF, 0x5F39, 0xB5B0, 0x86CB, 0xB5B1, 0x5F53, + 0xB5B2, 0x6321, 0xB5B3, 0x515A, 0xB5B4, 0x8361, 0xB5B5, 0x6863, + 0xB5B6, 0x5200, 0xB5B7, 0x6363, 0xB5B8, 0x8E48, 0xB5B9, 0x5012, + 0xB5BA, 0x5C9B, 0xB5BB, 0x7977, 0xB5BC, 0x5BFC, 0xB5BD, 0x5230, + 0xB5BE, 0x7A3B, 0xB5BF, 0x60BC, 0xB5C0, 0x9053, 0xB5C1, 0x76D7, + 0xB5C2, 0x5FB7, 0xB5C3, 0x5F97, 0xB5C4, 0x7684, 0xB5C5, 0x8E6C, + 0xB5C6, 0x706F, 0xB5C7, 0x767B, 0xB5C8, 0x7B49, 0xB5C9, 0x77AA, + 0xB5CA, 0x51F3, 0xB5CB, 0x9093, 0xB5CC, 0x5824, 0xB5CD, 0x4F4E, + 0xB5CE, 0x6EF4, 0xB5CF, 0x8FEA, 0xB5D0, 0x654C, 0xB5D1, 0x7B1B, + 0xB5D2, 0x72C4, 0xB5D3, 0x6DA4, 0xB5D4, 0x7FDF, 0xB5D5, 0x5AE1, + 0xB5D6, 0x62B5, 0xB5D7, 0x5E95, 0xB5D8, 0x5730, 0xB5D9, 0x8482, + 0xB5DA, 0x7B2C, 0xB5DB, 0x5E1D, 0xB5DC, 0x5F1F, 0xB5DD, 0x9012, + 0xB5DE, 0x7F14, 0xB5DF, 0x98A0, 0xB5E0, 0x6382, 0xB5E1, 0x6EC7, + 0xB5E2, 0x7898, 0xB5E3, 0x70B9, 0xB5E4, 0x5178, 0xB5E5, 0x975B, + 0xB5E6, 0x57AB, 0xB5E7, 0x7535, 0xB5E8, 0x4F43, 0xB5E9, 0x7538, + 0xB5EA, 0x5E97, 0xB5EB, 0x60E6, 0xB5EC, 0x5960, 0xB5ED, 0x6DC0, + 0xB5EE, 0x6BBF, 0xB5EF, 0x7889, 0xB5F0, 0x53FC, 0xB5F1, 0x96D5, + 0xB5F2, 0x51CB, 0xB5F3, 0x5201, 0xB5F4, 0x6389, 0xB5F5, 0x540A, + 0xB5F6, 0x9493, 0xB5F7, 0x8C03, 0xB5F8, 0x8DCC, 0xB5F9, 0x7239, + 0xB5FA, 0x789F, 0xB5FB, 0x8776, 0xB5FC, 0x8FED, 0xB5FD, 0x8C0D, + 0xB5FE, 0x53E0, 0xB640, 0x7993, 0xB641, 0x7994, 0xB642, 0x7995, + 0xB643, 0x7996, 0xB644, 0x7997, 0xB645, 0x7998, 0xB646, 0x7999, + 0xB647, 0x799B, 0xB648, 0x799C, 0xB649, 0x799D, 0xB64A, 0x799E, + 0xB64B, 0x799F, 0xB64C, 0x79A0, 0xB64D, 0x79A1, 0xB64E, 0x79A2, + 0xB64F, 0x79A3, 0xB650, 0x79A4, 0xB651, 0x79A5, 0xB652, 0x79A6, + 0xB653, 0x79A8, 0xB654, 0x79A9, 0xB655, 0x79AA, 0xB656, 0x79AB, + 0xB657, 0x79AC, 0xB658, 0x79AD, 0xB659, 0x79AE, 0xB65A, 0x79AF, + 0xB65B, 0x79B0, 0xB65C, 0x79B1, 0xB65D, 0x79B2, 0xB65E, 0x79B4, + 0xB65F, 0x79B5, 0xB660, 0x79B6, 0xB661, 0x79B7, 0xB662, 0x79B8, + 0xB663, 0x79BC, 0xB664, 0x79BF, 0xB665, 0x79C2, 0xB666, 0x79C4, + 0xB667, 0x79C5, 0xB668, 0x79C7, 0xB669, 0x79C8, 0xB66A, 0x79CA, + 0xB66B, 0x79CC, 0xB66C, 0x79CE, 0xB66D, 0x79CF, 0xB66E, 0x79D0, + 0xB66F, 0x79D3, 0xB670, 0x79D4, 0xB671, 0x79D6, 0xB672, 0x79D7, + 0xB673, 0x79D9, 0xB674, 0x79DA, 0xB675, 0x79DB, 0xB676, 0x79DC, + 0xB677, 0x79DD, 0xB678, 0x79DE, 0xB679, 0x79E0, 0xB67A, 0x79E1, + 0xB67B, 0x79E2, 0xB67C, 0x79E5, 0xB67D, 0x79E8, 0xB67E, 0x79EA, + 0xB680, 0x79EC, 0xB681, 0x79EE, 0xB682, 0x79F1, 0xB683, 0x79F2, + 0xB684, 0x79F3, 0xB685, 0x79F4, 0xB686, 0x79F5, 0xB687, 0x79F6, + 0xB688, 0x79F7, 0xB689, 0x79F9, 0xB68A, 0x79FA, 0xB68B, 0x79FC, + 0xB68C, 0x79FE, 0xB68D, 0x79FF, 0xB68E, 0x7A01, 0xB68F, 0x7A04, + 0xB690, 0x7A05, 0xB691, 0x7A07, 0xB692, 0x7A08, 0xB693, 0x7A09, + 0xB694, 0x7A0A, 0xB695, 0x7A0C, 0xB696, 0x7A0F, 0xB697, 0x7A10, + 0xB698, 0x7A11, 0xB699, 0x7A12, 0xB69A, 0x7A13, 0xB69B, 0x7A15, + 0xB69C, 0x7A16, 0xB69D, 0x7A18, 0xB69E, 0x7A19, 0xB69F, 0x7A1B, + 0xB6A0, 0x7A1C, 0xB6A1, 0x4E01, 0xB6A2, 0x76EF, 0xB6A3, 0x53EE, + 0xB6A4, 0x9489, 0xB6A5, 0x9876, 0xB6A6, 0x9F0E, 0xB6A7, 0x952D, + 0xB6A8, 0x5B9A, 0xB6A9, 0x8BA2, 0xB6AA, 0x4E22, 0xB6AB, 0x4E1C, + 0xB6AC, 0x51AC, 0xB6AD, 0x8463, 0xB6AE, 0x61C2, 0xB6AF, 0x52A8, + 0xB6B0, 0x680B, 0xB6B1, 0x4F97, 0xB6B2, 0x606B, 0xB6B3, 0x51BB, + 0xB6B4, 0x6D1E, 0xB6B5, 0x515C, 0xB6B6, 0x6296, 0xB6B7, 0x6597, + 0xB6B8, 0x9661, 0xB6B9, 0x8C46, 0xB6BA, 0x9017, 0xB6BB, 0x75D8, + 0xB6BC, 0x90FD, 0xB6BD, 0x7763, 0xB6BE, 0x6BD2, 0xB6BF, 0x728A, + 0xB6C0, 0x72EC, 0xB6C1, 0x8BFB, 0xB6C2, 0x5835, 0xB6C3, 0x7779, + 0xB6C4, 0x8D4C, 0xB6C5, 0x675C, 0xB6C6, 0x9540, 0xB6C7, 0x809A, + 0xB6C8, 0x5EA6, 0xB6C9, 0x6E21, 0xB6CA, 0x5992, 0xB6CB, 0x7AEF, + 0xB6CC, 0x77ED, 0xB6CD, 0x953B, 0xB6CE, 0x6BB5, 0xB6CF, 0x65AD, + 0xB6D0, 0x7F0E, 0xB6D1, 0x5806, 0xB6D2, 0x5151, 0xB6D3, 0x961F, + 0xB6D4, 0x5BF9, 0xB6D5, 0x58A9, 0xB6D6, 0x5428, 0xB6D7, 0x8E72, + 0xB6D8, 0x6566, 0xB6D9, 0x987F, 0xB6DA, 0x56E4, 0xB6DB, 0x949D, + 0xB6DC, 0x76FE, 0xB6DD, 0x9041, 0xB6DE, 0x6387, 0xB6DF, 0x54C6, + 0xB6E0, 0x591A, 0xB6E1, 0x593A, 0xB6E2, 0x579B, 0xB6E3, 0x8EB2, + 0xB6E4, 0x6735, 0xB6E5, 0x8DFA, 0xB6E6, 0x8235, 0xB6E7, 0x5241, + 0xB6E8, 0x60F0, 0xB6E9, 0x5815, 0xB6EA, 0x86FE, 0xB6EB, 0x5CE8, + 0xB6EC, 0x9E45, 0xB6ED, 0x4FC4, 0xB6EE, 0x989D, 0xB6EF, 0x8BB9, + 0xB6F0, 0x5A25, 0xB6F1, 0x6076, 0xB6F2, 0x5384, 0xB6F3, 0x627C, + 0xB6F4, 0x904F, 0xB6F5, 0x9102, 0xB6F6, 0x997F, 0xB6F7, 0x6069, + 0xB6F8, 0x800C, 0xB6F9, 0x513F, 0xB6FA, 0x8033, 0xB6FB, 0x5C14, + 0xB6FC, 0x9975, 0xB6FD, 0x6D31, 0xB6FE, 0x4E8C, 0xB740, 0x7A1D, + 0xB741, 0x7A1F, 0xB742, 0x7A21, 0xB743, 0x7A22, 0xB744, 0x7A24, + 0xB745, 0x7A25, 0xB746, 0x7A26, 0xB747, 0x7A27, 0xB748, 0x7A28, + 0xB749, 0x7A29, 0xB74A, 0x7A2A, 0xB74B, 0x7A2B, 0xB74C, 0x7A2C, + 0xB74D, 0x7A2D, 0xB74E, 0x7A2E, 0xB74F, 0x7A2F, 0xB750, 0x7A30, + 0xB751, 0x7A31, 0xB752, 0x7A32, 0xB753, 0x7A34, 0xB754, 0x7A35, + 0xB755, 0x7A36, 0xB756, 0x7A38, 0xB757, 0x7A3A, 0xB758, 0x7A3E, + 0xB759, 0x7A40, 0xB75A, 0x7A41, 0xB75B, 0x7A42, 0xB75C, 0x7A43, + 0xB75D, 0x7A44, 0xB75E, 0x7A45, 0xB75F, 0x7A47, 0xB760, 0x7A48, + 0xB761, 0x7A49, 0xB762, 0x7A4A, 0xB763, 0x7A4B, 0xB764, 0x7A4C, + 0xB765, 0x7A4D, 0xB766, 0x7A4E, 0xB767, 0x7A4F, 0xB768, 0x7A50, + 0xB769, 0x7A52, 0xB76A, 0x7A53, 0xB76B, 0x7A54, 0xB76C, 0x7A55, + 0xB76D, 0x7A56, 0xB76E, 0x7A58, 0xB76F, 0x7A59, 0xB770, 0x7A5A, + 0xB771, 0x7A5B, 0xB772, 0x7A5C, 0xB773, 0x7A5D, 0xB774, 0x7A5E, + 0xB775, 0x7A5F, 0xB776, 0x7A60, 0xB777, 0x7A61, 0xB778, 0x7A62, + 0xB779, 0x7A63, 0xB77A, 0x7A64, 0xB77B, 0x7A65, 0xB77C, 0x7A66, + 0xB77D, 0x7A67, 0xB77E, 0x7A68, 0xB780, 0x7A69, 0xB781, 0x7A6A, + 0xB782, 0x7A6B, 0xB783, 0x7A6C, 0xB784, 0x7A6D, 0xB785, 0x7A6E, + 0xB786, 0x7A6F, 0xB787, 0x7A71, 0xB788, 0x7A72, 0xB789, 0x7A73, + 0xB78A, 0x7A75, 0xB78B, 0x7A7B, 0xB78C, 0x7A7C, 0xB78D, 0x7A7D, + 0xB78E, 0x7A7E, 0xB78F, 0x7A82, 0xB790, 0x7A85, 0xB791, 0x7A87, + 0xB792, 0x7A89, 0xB793, 0x7A8A, 0xB794, 0x7A8B, 0xB795, 0x7A8C, + 0xB796, 0x7A8E, 0xB797, 0x7A8F, 0xB798, 0x7A90, 0xB799, 0x7A93, + 0xB79A, 0x7A94, 0xB79B, 0x7A99, 0xB79C, 0x7A9A, 0xB79D, 0x7A9B, + 0xB79E, 0x7A9E, 0xB79F, 0x7AA1, 0xB7A0, 0x7AA2, 0xB7A1, 0x8D30, + 0xB7A2, 0x53D1, 0xB7A3, 0x7F5A, 0xB7A4, 0x7B4F, 0xB7A5, 0x4F10, + 0xB7A6, 0x4E4F, 0xB7A7, 0x9600, 0xB7A8, 0x6CD5, 0xB7A9, 0x73D0, + 0xB7AA, 0x85E9, 0xB7AB, 0x5E06, 0xB7AC, 0x756A, 0xB7AD, 0x7FFB, + 0xB7AE, 0x6A0A, 0xB7AF, 0x77FE, 0xB7B0, 0x9492, 0xB7B1, 0x7E41, + 0xB7B2, 0x51E1, 0xB7B3, 0x70E6, 0xB7B4, 0x53CD, 0xB7B5, 0x8FD4, + 0xB7B6, 0x8303, 0xB7B7, 0x8D29, 0xB7B8, 0x72AF, 0xB7B9, 0x996D, + 0xB7BA, 0x6CDB, 0xB7BB, 0x574A, 0xB7BC, 0x82B3, 0xB7BD, 0x65B9, + 0xB7BE, 0x80AA, 0xB7BF, 0x623F, 0xB7C0, 0x9632, 0xB7C1, 0x59A8, + 0xB7C2, 0x4EFF, 0xB7C3, 0x8BBF, 0xB7C4, 0x7EBA, 0xB7C5, 0x653E, + 0xB7C6, 0x83F2, 0xB7C7, 0x975E, 0xB7C8, 0x5561, 0xB7C9, 0x98DE, + 0xB7CA, 0x80A5, 0xB7CB, 0x532A, 0xB7CC, 0x8BFD, 0xB7CD, 0x5420, + 0xB7CE, 0x80BA, 0xB7CF, 0x5E9F, 0xB7D0, 0x6CB8, 0xB7D1, 0x8D39, + 0xB7D2, 0x82AC, 0xB7D3, 0x915A, 0xB7D4, 0x5429, 0xB7D5, 0x6C1B, + 0xB7D6, 0x5206, 0xB7D7, 0x7EB7, 0xB7D8, 0x575F, 0xB7D9, 0x711A, + 0xB7DA, 0x6C7E, 0xB7DB, 0x7C89, 0xB7DC, 0x594B, 0xB7DD, 0x4EFD, + 0xB7DE, 0x5FFF, 0xB7DF, 0x6124, 0xB7E0, 0x7CAA, 0xB7E1, 0x4E30, + 0xB7E2, 0x5C01, 0xB7E3, 0x67AB, 0xB7E4, 0x8702, 0xB7E5, 0x5CF0, + 0xB7E6, 0x950B, 0xB7E7, 0x98CE, 0xB7E8, 0x75AF, 0xB7E9, 0x70FD, + 0xB7EA, 0x9022, 0xB7EB, 0x51AF, 0xB7EC, 0x7F1D, 0xB7ED, 0x8BBD, + 0xB7EE, 0x5949, 0xB7EF, 0x51E4, 0xB7F0, 0x4F5B, 0xB7F1, 0x5426, + 0xB7F2, 0x592B, 0xB7F3, 0x6577, 0xB7F4, 0x80A4, 0xB7F5, 0x5B75, + 0xB7F6, 0x6276, 0xB7F7, 0x62C2, 0xB7F8, 0x8F90, 0xB7F9, 0x5E45, + 0xB7FA, 0x6C1F, 0xB7FB, 0x7B26, 0xB7FC, 0x4F0F, 0xB7FD, 0x4FD8, + 0xB7FE, 0x670D, 0xB840, 0x7AA3, 0xB841, 0x7AA4, 0xB842, 0x7AA7, + 0xB843, 0x7AA9, 0xB844, 0x7AAA, 0xB845, 0x7AAB, 0xB846, 0x7AAE, + 0xB847, 0x7AAF, 0xB848, 0x7AB0, 0xB849, 0x7AB1, 0xB84A, 0x7AB2, + 0xB84B, 0x7AB4, 0xB84C, 0x7AB5, 0xB84D, 0x7AB6, 0xB84E, 0x7AB7, + 0xB84F, 0x7AB8, 0xB850, 0x7AB9, 0xB851, 0x7ABA, 0xB852, 0x7ABB, + 0xB853, 0x7ABC, 0xB854, 0x7ABD, 0xB855, 0x7ABE, 0xB856, 0x7AC0, + 0xB857, 0x7AC1, 0xB858, 0x7AC2, 0xB859, 0x7AC3, 0xB85A, 0x7AC4, + 0xB85B, 0x7AC5, 0xB85C, 0x7AC6, 0xB85D, 0x7AC7, 0xB85E, 0x7AC8, + 0xB85F, 0x7AC9, 0xB860, 0x7ACA, 0xB861, 0x7ACC, 0xB862, 0x7ACD, + 0xB863, 0x7ACE, 0xB864, 0x7ACF, 0xB865, 0x7AD0, 0xB866, 0x7AD1, + 0xB867, 0x7AD2, 0xB868, 0x7AD3, 0xB869, 0x7AD4, 0xB86A, 0x7AD5, + 0xB86B, 0x7AD7, 0xB86C, 0x7AD8, 0xB86D, 0x7ADA, 0xB86E, 0x7ADB, + 0xB86F, 0x7ADC, 0xB870, 0x7ADD, 0xB871, 0x7AE1, 0xB872, 0x7AE2, + 0xB873, 0x7AE4, 0xB874, 0x7AE7, 0xB875, 0x7AE8, 0xB876, 0x7AE9, + 0xB877, 0x7AEA, 0xB878, 0x7AEB, 0xB879, 0x7AEC, 0xB87A, 0x7AEE, + 0xB87B, 0x7AF0, 0xB87C, 0x7AF1, 0xB87D, 0x7AF2, 0xB87E, 0x7AF3, + 0xB880, 0x7AF4, 0xB881, 0x7AF5, 0xB882, 0x7AF6, 0xB883, 0x7AF7, + 0xB884, 0x7AF8, 0xB885, 0x7AFB, 0xB886, 0x7AFC, 0xB887, 0x7AFE, + 0xB888, 0x7B00, 0xB889, 0x7B01, 0xB88A, 0x7B02, 0xB88B, 0x7B05, + 0xB88C, 0x7B07, 0xB88D, 0x7B09, 0xB88E, 0x7B0C, 0xB88F, 0x7B0D, + 0xB890, 0x7B0E, 0xB891, 0x7B10, 0xB892, 0x7B12, 0xB893, 0x7B13, + 0xB894, 0x7B16, 0xB895, 0x7B17, 0xB896, 0x7B18, 0xB897, 0x7B1A, + 0xB898, 0x7B1C, 0xB899, 0x7B1D, 0xB89A, 0x7B1F, 0xB89B, 0x7B21, + 0xB89C, 0x7B22, 0xB89D, 0x7B23, 0xB89E, 0x7B27, 0xB89F, 0x7B29, + 0xB8A0, 0x7B2D, 0xB8A1, 0x6D6E, 0xB8A2, 0x6DAA, 0xB8A3, 0x798F, + 0xB8A4, 0x88B1, 0xB8A5, 0x5F17, 0xB8A6, 0x752B, 0xB8A7, 0x629A, + 0xB8A8, 0x8F85, 0xB8A9, 0x4FEF, 0xB8AA, 0x91DC, 0xB8AB, 0x65A7, + 0xB8AC, 0x812F, 0xB8AD, 0x8151, 0xB8AE, 0x5E9C, 0xB8AF, 0x8150, + 0xB8B0, 0x8D74, 0xB8B1, 0x526F, 0xB8B2, 0x8986, 0xB8B3, 0x8D4B, + 0xB8B4, 0x590D, 0xB8B5, 0x5085, 0xB8B6, 0x4ED8, 0xB8B7, 0x961C, + 0xB8B8, 0x7236, 0xB8B9, 0x8179, 0xB8BA, 0x8D1F, 0xB8BB, 0x5BCC, + 0xB8BC, 0x8BA3, 0xB8BD, 0x9644, 0xB8BE, 0x5987, 0xB8BF, 0x7F1A, + 0xB8C0, 0x5490, 0xB8C1, 0x5676, 0xB8C2, 0x560E, 0xB8C3, 0x8BE5, + 0xB8C4, 0x6539, 0xB8C5, 0x6982, 0xB8C6, 0x9499, 0xB8C7, 0x76D6, + 0xB8C8, 0x6E89, 0xB8C9, 0x5E72, 0xB8CA, 0x7518, 0xB8CB, 0x6746, + 0xB8CC, 0x67D1, 0xB8CD, 0x7AFF, 0xB8CE, 0x809D, 0xB8CF, 0x8D76, + 0xB8D0, 0x611F, 0xB8D1, 0x79C6, 0xB8D2, 0x6562, 0xB8D3, 0x8D63, + 0xB8D4, 0x5188, 0xB8D5, 0x521A, 0xB8D6, 0x94A2, 0xB8D7, 0x7F38, + 0xB8D8, 0x809B, 0xB8D9, 0x7EB2, 0xB8DA, 0x5C97, 0xB8DB, 0x6E2F, + 0xB8DC, 0x6760, 0xB8DD, 0x7BD9, 0xB8DE, 0x768B, 0xB8DF, 0x9AD8, + 0xB8E0, 0x818F, 0xB8E1, 0x7F94, 0xB8E2, 0x7CD5, 0xB8E3, 0x641E, + 0xB8E4, 0x9550, 0xB8E5, 0x7A3F, 0xB8E6, 0x544A, 0xB8E7, 0x54E5, + 0xB8E8, 0x6B4C, 0xB8E9, 0x6401, 0xB8EA, 0x6208, 0xB8EB, 0x9E3D, + 0xB8EC, 0x80F3, 0xB8ED, 0x7599, 0xB8EE, 0x5272, 0xB8EF, 0x9769, + 0xB8F0, 0x845B, 0xB8F1, 0x683C, 0xB8F2, 0x86E4, 0xB8F3, 0x9601, + 0xB8F4, 0x9694, 0xB8F5, 0x94EC, 0xB8F6, 0x4E2A, 0xB8F7, 0x5404, + 0xB8F8, 0x7ED9, 0xB8F9, 0x6839, 0xB8FA, 0x8DDF, 0xB8FB, 0x8015, + 0xB8FC, 0x66F4, 0xB8FD, 0x5E9A, 0xB8FE, 0x7FB9, 0xB940, 0x7B2F, + 0xB941, 0x7B30, 0xB942, 0x7B32, 0xB943, 0x7B34, 0xB944, 0x7B35, + 0xB945, 0x7B36, 0xB946, 0x7B37, 0xB947, 0x7B39, 0xB948, 0x7B3B, + 0xB949, 0x7B3D, 0xB94A, 0x7B3F, 0xB94B, 0x7B40, 0xB94C, 0x7B41, + 0xB94D, 0x7B42, 0xB94E, 0x7B43, 0xB94F, 0x7B44, 0xB950, 0x7B46, + 0xB951, 0x7B48, 0xB952, 0x7B4A, 0xB953, 0x7B4D, 0xB954, 0x7B4E, + 0xB955, 0x7B53, 0xB956, 0x7B55, 0xB957, 0x7B57, 0xB958, 0x7B59, + 0xB959, 0x7B5C, 0xB95A, 0x7B5E, 0xB95B, 0x7B5F, 0xB95C, 0x7B61, + 0xB95D, 0x7B63, 0xB95E, 0x7B64, 0xB95F, 0x7B65, 0xB960, 0x7B66, + 0xB961, 0x7B67, 0xB962, 0x7B68, 0xB963, 0x7B69, 0xB964, 0x7B6A, + 0xB965, 0x7B6B, 0xB966, 0x7B6C, 0xB967, 0x7B6D, 0xB968, 0x7B6F, + 0xB969, 0x7B70, 0xB96A, 0x7B73, 0xB96B, 0x7B74, 0xB96C, 0x7B76, + 0xB96D, 0x7B78, 0xB96E, 0x7B7A, 0xB96F, 0x7B7C, 0xB970, 0x7B7D, + 0xB971, 0x7B7F, 0xB972, 0x7B81, 0xB973, 0x7B82, 0xB974, 0x7B83, + 0xB975, 0x7B84, 0xB976, 0x7B86, 0xB977, 0x7B87, 0xB978, 0x7B88, + 0xB979, 0x7B89, 0xB97A, 0x7B8A, 0xB97B, 0x7B8B, 0xB97C, 0x7B8C, + 0xB97D, 0x7B8E, 0xB97E, 0x7B8F, 0xB980, 0x7B91, 0xB981, 0x7B92, + 0xB982, 0x7B93, 0xB983, 0x7B96, 0xB984, 0x7B98, 0xB985, 0x7B99, + 0xB986, 0x7B9A, 0xB987, 0x7B9B, 0xB988, 0x7B9E, 0xB989, 0x7B9F, + 0xB98A, 0x7BA0, 0xB98B, 0x7BA3, 0xB98C, 0x7BA4, 0xB98D, 0x7BA5, + 0xB98E, 0x7BAE, 0xB98F, 0x7BAF, 0xB990, 0x7BB0, 0xB991, 0x7BB2, + 0xB992, 0x7BB3, 0xB993, 0x7BB5, 0xB994, 0x7BB6, 0xB995, 0x7BB7, + 0xB996, 0x7BB9, 0xB997, 0x7BBA, 0xB998, 0x7BBB, 0xB999, 0x7BBC, + 0xB99A, 0x7BBD, 0xB99B, 0x7BBE, 0xB99C, 0x7BBF, 0xB99D, 0x7BC0, + 0xB99E, 0x7BC2, 0xB99F, 0x7BC3, 0xB9A0, 0x7BC4, 0xB9A1, 0x57C2, + 0xB9A2, 0x803F, 0xB9A3, 0x6897, 0xB9A4, 0x5DE5, 0xB9A5, 0x653B, + 0xB9A6, 0x529F, 0xB9A7, 0x606D, 0xB9A8, 0x9F9A, 0xB9A9, 0x4F9B, + 0xB9AA, 0x8EAC, 0xB9AB, 0x516C, 0xB9AC, 0x5BAB, 0xB9AD, 0x5F13, + 0xB9AE, 0x5DE9, 0xB9AF, 0x6C5E, 0xB9B0, 0x62F1, 0xB9B1, 0x8D21, + 0xB9B2, 0x5171, 0xB9B3, 0x94A9, 0xB9B4, 0x52FE, 0xB9B5, 0x6C9F, + 0xB9B6, 0x82DF, 0xB9B7, 0x72D7, 0xB9B8, 0x57A2, 0xB9B9, 0x6784, + 0xB9BA, 0x8D2D, 0xB9BB, 0x591F, 0xB9BC, 0x8F9C, 0xB9BD, 0x83C7, + 0xB9BE, 0x5495, 0xB9BF, 0x7B8D, 0xB9C0, 0x4F30, 0xB9C1, 0x6CBD, + 0xB9C2, 0x5B64, 0xB9C3, 0x59D1, 0xB9C4, 0x9F13, 0xB9C5, 0x53E4, + 0xB9C6, 0x86CA, 0xB9C7, 0x9AA8, 0xB9C8, 0x8C37, 0xB9C9, 0x80A1, + 0xB9CA, 0x6545, 0xB9CB, 0x987E, 0xB9CC, 0x56FA, 0xB9CD, 0x96C7, + 0xB9CE, 0x522E, 0xB9CF, 0x74DC, 0xB9D0, 0x5250, 0xB9D1, 0x5BE1, + 0xB9D2, 0x6302, 0xB9D3, 0x8902, 0xB9D4, 0x4E56, 0xB9D5, 0x62D0, + 0xB9D6, 0x602A, 0xB9D7, 0x68FA, 0xB9D8, 0x5173, 0xB9D9, 0x5B98, + 0xB9DA, 0x51A0, 0xB9DB, 0x89C2, 0xB9DC, 0x7BA1, 0xB9DD, 0x9986, + 0xB9DE, 0x7F50, 0xB9DF, 0x60EF, 0xB9E0, 0x704C, 0xB9E1, 0x8D2F, + 0xB9E2, 0x5149, 0xB9E3, 0x5E7F, 0xB9E4, 0x901B, 0xB9E5, 0x7470, + 0xB9E6, 0x89C4, 0xB9E7, 0x572D, 0xB9E8, 0x7845, 0xB9E9, 0x5F52, + 0xB9EA, 0x9F9F, 0xB9EB, 0x95FA, 0xB9EC, 0x8F68, 0xB9ED, 0x9B3C, + 0xB9EE, 0x8BE1, 0xB9EF, 0x7678, 0xB9F0, 0x6842, 0xB9F1, 0x67DC, + 0xB9F2, 0x8DEA, 0xB9F3, 0x8D35, 0xB9F4, 0x523D, 0xB9F5, 0x8F8A, + 0xB9F6, 0x6EDA, 0xB9F7, 0x68CD, 0xB9F8, 0x9505, 0xB9F9, 0x90ED, + 0xB9FA, 0x56FD, 0xB9FB, 0x679C, 0xB9FC, 0x88F9, 0xB9FD, 0x8FC7, + 0xB9FE, 0x54C8, 0xBA40, 0x7BC5, 0xBA41, 0x7BC8, 0xBA42, 0x7BC9, + 0xBA43, 0x7BCA, 0xBA44, 0x7BCB, 0xBA45, 0x7BCD, 0xBA46, 0x7BCE, + 0xBA47, 0x7BCF, 0xBA48, 0x7BD0, 0xBA49, 0x7BD2, 0xBA4A, 0x7BD4, + 0xBA4B, 0x7BD5, 0xBA4C, 0x7BD6, 0xBA4D, 0x7BD7, 0xBA4E, 0x7BD8, + 0xBA4F, 0x7BDB, 0xBA50, 0x7BDC, 0xBA51, 0x7BDE, 0xBA52, 0x7BDF, + 0xBA53, 0x7BE0, 0xBA54, 0x7BE2, 0xBA55, 0x7BE3, 0xBA56, 0x7BE4, + 0xBA57, 0x7BE7, 0xBA58, 0x7BE8, 0xBA59, 0x7BE9, 0xBA5A, 0x7BEB, + 0xBA5B, 0x7BEC, 0xBA5C, 0x7BED, 0xBA5D, 0x7BEF, 0xBA5E, 0x7BF0, + 0xBA5F, 0x7BF2, 0xBA60, 0x7BF3, 0xBA61, 0x7BF4, 0xBA62, 0x7BF5, + 0xBA63, 0x7BF6, 0xBA64, 0x7BF8, 0xBA65, 0x7BF9, 0xBA66, 0x7BFA, + 0xBA67, 0x7BFB, 0xBA68, 0x7BFD, 0xBA69, 0x7BFF, 0xBA6A, 0x7C00, + 0xBA6B, 0x7C01, 0xBA6C, 0x7C02, 0xBA6D, 0x7C03, 0xBA6E, 0x7C04, + 0xBA6F, 0x7C05, 0xBA70, 0x7C06, 0xBA71, 0x7C08, 0xBA72, 0x7C09, + 0xBA73, 0x7C0A, 0xBA74, 0x7C0D, 0xBA75, 0x7C0E, 0xBA76, 0x7C10, + 0xBA77, 0x7C11, 0xBA78, 0x7C12, 0xBA79, 0x7C13, 0xBA7A, 0x7C14, + 0xBA7B, 0x7C15, 0xBA7C, 0x7C17, 0xBA7D, 0x7C18, 0xBA7E, 0x7C19, + 0xBA80, 0x7C1A, 0xBA81, 0x7C1B, 0xBA82, 0x7C1C, 0xBA83, 0x7C1D, + 0xBA84, 0x7C1E, 0xBA85, 0x7C20, 0xBA86, 0x7C21, 0xBA87, 0x7C22, + 0xBA88, 0x7C23, 0xBA89, 0x7C24, 0xBA8A, 0x7C25, 0xBA8B, 0x7C28, + 0xBA8C, 0x7C29, 0xBA8D, 0x7C2B, 0xBA8E, 0x7C2C, 0xBA8F, 0x7C2D, + 0xBA90, 0x7C2E, 0xBA91, 0x7C2F, 0xBA92, 0x7C30, 0xBA93, 0x7C31, + 0xBA94, 0x7C32, 0xBA95, 0x7C33, 0xBA96, 0x7C34, 0xBA97, 0x7C35, + 0xBA98, 0x7C36, 0xBA99, 0x7C37, 0xBA9A, 0x7C39, 0xBA9B, 0x7C3A, + 0xBA9C, 0x7C3B, 0xBA9D, 0x7C3C, 0xBA9E, 0x7C3D, 0xBA9F, 0x7C3E, + 0xBAA0, 0x7C42, 0xBAA1, 0x9AB8, 0xBAA2, 0x5B69, 0xBAA3, 0x6D77, + 0xBAA4, 0x6C26, 0xBAA5, 0x4EA5, 0xBAA6, 0x5BB3, 0xBAA7, 0x9A87, + 0xBAA8, 0x9163, 0xBAA9, 0x61A8, 0xBAAA, 0x90AF, 0xBAAB, 0x97E9, + 0xBAAC, 0x542B, 0xBAAD, 0x6DB5, 0xBAAE, 0x5BD2, 0xBAAF, 0x51FD, + 0xBAB0, 0x558A, 0xBAB1, 0x7F55, 0xBAB2, 0x7FF0, 0xBAB3, 0x64BC, + 0xBAB4, 0x634D, 0xBAB5, 0x65F1, 0xBAB6, 0x61BE, 0xBAB7, 0x608D, + 0xBAB8, 0x710A, 0xBAB9, 0x6C57, 0xBABA, 0x6C49, 0xBABB, 0x592F, + 0xBABC, 0x676D, 0xBABD, 0x822A, 0xBABE, 0x58D5, 0xBABF, 0x568E, + 0xBAC0, 0x8C6A, 0xBAC1, 0x6BEB, 0xBAC2, 0x90DD, 0xBAC3, 0x597D, + 0xBAC4, 0x8017, 0xBAC5, 0x53F7, 0xBAC6, 0x6D69, 0xBAC7, 0x5475, + 0xBAC8, 0x559D, 0xBAC9, 0x8377, 0xBACA, 0x83CF, 0xBACB, 0x6838, + 0xBACC, 0x79BE, 0xBACD, 0x548C, 0xBACE, 0x4F55, 0xBACF, 0x5408, + 0xBAD0, 0x76D2, 0xBAD1, 0x8C89, 0xBAD2, 0x9602, 0xBAD3, 0x6CB3, + 0xBAD4, 0x6DB8, 0xBAD5, 0x8D6B, 0xBAD6, 0x8910, 0xBAD7, 0x9E64, + 0xBAD8, 0x8D3A, 0xBAD9, 0x563F, 0xBADA, 0x9ED1, 0xBADB, 0x75D5, + 0xBADC, 0x5F88, 0xBADD, 0x72E0, 0xBADE, 0x6068, 0xBADF, 0x54FC, + 0xBAE0, 0x4EA8, 0xBAE1, 0x6A2A, 0xBAE2, 0x8861, 0xBAE3, 0x6052, + 0xBAE4, 0x8F70, 0xBAE5, 0x54C4, 0xBAE6, 0x70D8, 0xBAE7, 0x8679, + 0xBAE8, 0x9E3F, 0xBAE9, 0x6D2A, 0xBAEA, 0x5B8F, 0xBAEB, 0x5F18, + 0xBAEC, 0x7EA2, 0xBAED, 0x5589, 0xBAEE, 0x4FAF, 0xBAEF, 0x7334, + 0xBAF0, 0x543C, 0xBAF1, 0x539A, 0xBAF2, 0x5019, 0xBAF3, 0x540E, + 0xBAF4, 0x547C, 0xBAF5, 0x4E4E, 0xBAF6, 0x5FFD, 0xBAF7, 0x745A, + 0xBAF8, 0x58F6, 0xBAF9, 0x846B, 0xBAFA, 0x80E1, 0xBAFB, 0x8774, + 0xBAFC, 0x72D0, 0xBAFD, 0x7CCA, 0xBAFE, 0x6E56, 0xBB40, 0x7C43, + 0xBB41, 0x7C44, 0xBB42, 0x7C45, 0xBB43, 0x7C46, 0xBB44, 0x7C47, + 0xBB45, 0x7C48, 0xBB46, 0x7C49, 0xBB47, 0x7C4A, 0xBB48, 0x7C4B, + 0xBB49, 0x7C4C, 0xBB4A, 0x7C4E, 0xBB4B, 0x7C4F, 0xBB4C, 0x7C50, + 0xBB4D, 0x7C51, 0xBB4E, 0x7C52, 0xBB4F, 0x7C53, 0xBB50, 0x7C54, + 0xBB51, 0x7C55, 0xBB52, 0x7C56, 0xBB53, 0x7C57, 0xBB54, 0x7C58, + 0xBB55, 0x7C59, 0xBB56, 0x7C5A, 0xBB57, 0x7C5B, 0xBB58, 0x7C5C, + 0xBB59, 0x7C5D, 0xBB5A, 0x7C5E, 0xBB5B, 0x7C5F, 0xBB5C, 0x7C60, + 0xBB5D, 0x7C61, 0xBB5E, 0x7C62, 0xBB5F, 0x7C63, 0xBB60, 0x7C64, + 0xBB61, 0x7C65, 0xBB62, 0x7C66, 0xBB63, 0x7C67, 0xBB64, 0x7C68, + 0xBB65, 0x7C69, 0xBB66, 0x7C6A, 0xBB67, 0x7C6B, 0xBB68, 0x7C6C, + 0xBB69, 0x7C6D, 0xBB6A, 0x7C6E, 0xBB6B, 0x7C6F, 0xBB6C, 0x7C70, + 0xBB6D, 0x7C71, 0xBB6E, 0x7C72, 0xBB6F, 0x7C75, 0xBB70, 0x7C76, + 0xBB71, 0x7C77, 0xBB72, 0x7C78, 0xBB73, 0x7C79, 0xBB74, 0x7C7A, + 0xBB75, 0x7C7E, 0xBB76, 0x7C7F, 0xBB77, 0x7C80, 0xBB78, 0x7C81, + 0xBB79, 0x7C82, 0xBB7A, 0x7C83, 0xBB7B, 0x7C84, 0xBB7C, 0x7C85, + 0xBB7D, 0x7C86, 0xBB7E, 0x7C87, 0xBB80, 0x7C88, 0xBB81, 0x7C8A, + 0xBB82, 0x7C8B, 0xBB83, 0x7C8C, 0xBB84, 0x7C8D, 0xBB85, 0x7C8E, + 0xBB86, 0x7C8F, 0xBB87, 0x7C90, 0xBB88, 0x7C93, 0xBB89, 0x7C94, + 0xBB8A, 0x7C96, 0xBB8B, 0x7C99, 0xBB8C, 0x7C9A, 0xBB8D, 0x7C9B, + 0xBB8E, 0x7CA0, 0xBB8F, 0x7CA1, 0xBB90, 0x7CA3, 0xBB91, 0x7CA6, + 0xBB92, 0x7CA7, 0xBB93, 0x7CA8, 0xBB94, 0x7CA9, 0xBB95, 0x7CAB, + 0xBB96, 0x7CAC, 0xBB97, 0x7CAD, 0xBB98, 0x7CAF, 0xBB99, 0x7CB0, + 0xBB9A, 0x7CB4, 0xBB9B, 0x7CB5, 0xBB9C, 0x7CB6, 0xBB9D, 0x7CB7, + 0xBB9E, 0x7CB8, 0xBB9F, 0x7CBA, 0xBBA0, 0x7CBB, 0xBBA1, 0x5F27, + 0xBBA2, 0x864E, 0xBBA3, 0x552C, 0xBBA4, 0x62A4, 0xBBA5, 0x4E92, + 0xBBA6, 0x6CAA, 0xBBA7, 0x6237, 0xBBA8, 0x82B1, 0xBBA9, 0x54D7, + 0xBBAA, 0x534E, 0xBBAB, 0x733E, 0xBBAC, 0x6ED1, 0xBBAD, 0x753B, + 0xBBAE, 0x5212, 0xBBAF, 0x5316, 0xBBB0, 0x8BDD, 0xBBB1, 0x69D0, + 0xBBB2, 0x5F8A, 0xBBB3, 0x6000, 0xBBB4, 0x6DEE, 0xBBB5, 0x574F, + 0xBBB6, 0x6B22, 0xBBB7, 0x73AF, 0xBBB8, 0x6853, 0xBBB9, 0x8FD8, + 0xBBBA, 0x7F13, 0xBBBB, 0x6362, 0xBBBC, 0x60A3, 0xBBBD, 0x5524, + 0xBBBE, 0x75EA, 0xBBBF, 0x8C62, 0xBBC0, 0x7115, 0xBBC1, 0x6DA3, + 0xBBC2, 0x5BA6, 0xBBC3, 0x5E7B, 0xBBC4, 0x8352, 0xBBC5, 0x614C, + 0xBBC6, 0x9EC4, 0xBBC7, 0x78FA, 0xBBC8, 0x8757, 0xBBC9, 0x7C27, + 0xBBCA, 0x7687, 0xBBCB, 0x51F0, 0xBBCC, 0x60F6, 0xBBCD, 0x714C, + 0xBBCE, 0x6643, 0xBBCF, 0x5E4C, 0xBBD0, 0x604D, 0xBBD1, 0x8C0E, + 0xBBD2, 0x7070, 0xBBD3, 0x6325, 0xBBD4, 0x8F89, 0xBBD5, 0x5FBD, + 0xBBD6, 0x6062, 0xBBD7, 0x86D4, 0xBBD8, 0x56DE, 0xBBD9, 0x6BC1, + 0xBBDA, 0x6094, 0xBBDB, 0x6167, 0xBBDC, 0x5349, 0xBBDD, 0x60E0, + 0xBBDE, 0x6666, 0xBBDF, 0x8D3F, 0xBBE0, 0x79FD, 0xBBE1, 0x4F1A, + 0xBBE2, 0x70E9, 0xBBE3, 0x6C47, 0xBBE4, 0x8BB3, 0xBBE5, 0x8BF2, + 0xBBE6, 0x7ED8, 0xBBE7, 0x8364, 0xBBE8, 0x660F, 0xBBE9, 0x5A5A, + 0xBBEA, 0x9B42, 0xBBEB, 0x6D51, 0xBBEC, 0x6DF7, 0xBBED, 0x8C41, + 0xBBEE, 0x6D3B, 0xBBEF, 0x4F19, 0xBBF0, 0x706B, 0xBBF1, 0x83B7, + 0xBBF2, 0x6216, 0xBBF3, 0x60D1, 0xBBF4, 0x970D, 0xBBF5, 0x8D27, + 0xBBF6, 0x7978, 0xBBF7, 0x51FB, 0xBBF8, 0x573E, 0xBBF9, 0x57FA, + 0xBBFA, 0x673A, 0xBBFB, 0x7578, 0xBBFC, 0x7A3D, 0xBBFD, 0x79EF, + 0xBBFE, 0x7B95, 0xBC40, 0x7CBF, 0xBC41, 0x7CC0, 0xBC42, 0x7CC2, + 0xBC43, 0x7CC3, 0xBC44, 0x7CC4, 0xBC45, 0x7CC6, 0xBC46, 0x7CC9, + 0xBC47, 0x7CCB, 0xBC48, 0x7CCE, 0xBC49, 0x7CCF, 0xBC4A, 0x7CD0, + 0xBC4B, 0x7CD1, 0xBC4C, 0x7CD2, 0xBC4D, 0x7CD3, 0xBC4E, 0x7CD4, + 0xBC4F, 0x7CD8, 0xBC50, 0x7CDA, 0xBC51, 0x7CDB, 0xBC52, 0x7CDD, + 0xBC53, 0x7CDE, 0xBC54, 0x7CE1, 0xBC55, 0x7CE2, 0xBC56, 0x7CE3, + 0xBC57, 0x7CE4, 0xBC58, 0x7CE5, 0xBC59, 0x7CE6, 0xBC5A, 0x7CE7, + 0xBC5B, 0x7CE9, 0xBC5C, 0x7CEA, 0xBC5D, 0x7CEB, 0xBC5E, 0x7CEC, + 0xBC5F, 0x7CED, 0xBC60, 0x7CEE, 0xBC61, 0x7CF0, 0xBC62, 0x7CF1, + 0xBC63, 0x7CF2, 0xBC64, 0x7CF3, 0xBC65, 0x7CF4, 0xBC66, 0x7CF5, + 0xBC67, 0x7CF6, 0xBC68, 0x7CF7, 0xBC69, 0x7CF9, 0xBC6A, 0x7CFA, + 0xBC6B, 0x7CFC, 0xBC6C, 0x7CFD, 0xBC6D, 0x7CFE, 0xBC6E, 0x7CFF, + 0xBC6F, 0x7D00, 0xBC70, 0x7D01, 0xBC71, 0x7D02, 0xBC72, 0x7D03, + 0xBC73, 0x7D04, 0xBC74, 0x7D05, 0xBC75, 0x7D06, 0xBC76, 0x7D07, + 0xBC77, 0x7D08, 0xBC78, 0x7D09, 0xBC79, 0x7D0B, 0xBC7A, 0x7D0C, + 0xBC7B, 0x7D0D, 0xBC7C, 0x7D0E, 0xBC7D, 0x7D0F, 0xBC7E, 0x7D10, + 0xBC80, 0x7D11, 0xBC81, 0x7D12, 0xBC82, 0x7D13, 0xBC83, 0x7D14, + 0xBC84, 0x7D15, 0xBC85, 0x7D16, 0xBC86, 0x7D17, 0xBC87, 0x7D18, + 0xBC88, 0x7D19, 0xBC89, 0x7D1A, 0xBC8A, 0x7D1B, 0xBC8B, 0x7D1C, + 0xBC8C, 0x7D1D, 0xBC8D, 0x7D1E, 0xBC8E, 0x7D1F, 0xBC8F, 0x7D21, + 0xBC90, 0x7D23, 0xBC91, 0x7D24, 0xBC92, 0x7D25, 0xBC93, 0x7D26, + 0xBC94, 0x7D28, 0xBC95, 0x7D29, 0xBC96, 0x7D2A, 0xBC97, 0x7D2C, + 0xBC98, 0x7D2D, 0xBC99, 0x7D2E, 0xBC9A, 0x7D30, 0xBC9B, 0x7D31, + 0xBC9C, 0x7D32, 0xBC9D, 0x7D33, 0xBC9E, 0x7D34, 0xBC9F, 0x7D35, + 0xBCA0, 0x7D36, 0xBCA1, 0x808C, 0xBCA2, 0x9965, 0xBCA3, 0x8FF9, + 0xBCA4, 0x6FC0, 0xBCA5, 0x8BA5, 0xBCA6, 0x9E21, 0xBCA7, 0x59EC, + 0xBCA8, 0x7EE9, 0xBCA9, 0x7F09, 0xBCAA, 0x5409, 0xBCAB, 0x6781, + 0xBCAC, 0x68D8, 0xBCAD, 0x8F91, 0xBCAE, 0x7C4D, 0xBCAF, 0x96C6, + 0xBCB0, 0x53CA, 0xBCB1, 0x6025, 0xBCB2, 0x75BE, 0xBCB3, 0x6C72, + 0xBCB4, 0x5373, 0xBCB5, 0x5AC9, 0xBCB6, 0x7EA7, 0xBCB7, 0x6324, + 0xBCB8, 0x51E0, 0xBCB9, 0x810A, 0xBCBA, 0x5DF1, 0xBCBB, 0x84DF, + 0xBCBC, 0x6280, 0xBCBD, 0x5180, 0xBCBE, 0x5B63, 0xBCBF, 0x4F0E, + 0xBCC0, 0x796D, 0xBCC1, 0x5242, 0xBCC2, 0x60B8, 0xBCC3, 0x6D4E, + 0xBCC4, 0x5BC4, 0xBCC5, 0x5BC2, 0xBCC6, 0x8BA1, 0xBCC7, 0x8BB0, + 0xBCC8, 0x65E2, 0xBCC9, 0x5FCC, 0xBCCA, 0x9645, 0xBCCB, 0x5993, + 0xBCCC, 0x7EE7, 0xBCCD, 0x7EAA, 0xBCCE, 0x5609, 0xBCCF, 0x67B7, + 0xBCD0, 0x5939, 0xBCD1, 0x4F73, 0xBCD2, 0x5BB6, 0xBCD3, 0x52A0, + 0xBCD4, 0x835A, 0xBCD5, 0x988A, 0xBCD6, 0x8D3E, 0xBCD7, 0x7532, + 0xBCD8, 0x94BE, 0xBCD9, 0x5047, 0xBCDA, 0x7A3C, 0xBCDB, 0x4EF7, + 0xBCDC, 0x67B6, 0xBCDD, 0x9A7E, 0xBCDE, 0x5AC1, 0xBCDF, 0x6B7C, + 0xBCE0, 0x76D1, 0xBCE1, 0x575A, 0xBCE2, 0x5C16, 0xBCE3, 0x7B3A, + 0xBCE4, 0x95F4, 0xBCE5, 0x714E, 0xBCE6, 0x517C, 0xBCE7, 0x80A9, + 0xBCE8, 0x8270, 0xBCE9, 0x5978, 0xBCEA, 0x7F04, 0xBCEB, 0x8327, + 0xBCEC, 0x68C0, 0xBCED, 0x67EC, 0xBCEE, 0x78B1, 0xBCEF, 0x7877, + 0xBCF0, 0x62E3, 0xBCF1, 0x6361, 0xBCF2, 0x7B80, 0xBCF3, 0x4FED, + 0xBCF4, 0x526A, 0xBCF5, 0x51CF, 0xBCF6, 0x8350, 0xBCF7, 0x69DB, + 0xBCF8, 0x9274, 0xBCF9, 0x8DF5, 0xBCFA, 0x8D31, 0xBCFB, 0x89C1, + 0xBCFC, 0x952E, 0xBCFD, 0x7BAD, 0xBCFE, 0x4EF6, 0xBD40, 0x7D37, + 0xBD41, 0x7D38, 0xBD42, 0x7D39, 0xBD43, 0x7D3A, 0xBD44, 0x7D3B, + 0xBD45, 0x7D3C, 0xBD46, 0x7D3D, 0xBD47, 0x7D3E, 0xBD48, 0x7D3F, + 0xBD49, 0x7D40, 0xBD4A, 0x7D41, 0xBD4B, 0x7D42, 0xBD4C, 0x7D43, + 0xBD4D, 0x7D44, 0xBD4E, 0x7D45, 0xBD4F, 0x7D46, 0xBD50, 0x7D47, + 0xBD51, 0x7D48, 0xBD52, 0x7D49, 0xBD53, 0x7D4A, 0xBD54, 0x7D4B, + 0xBD55, 0x7D4C, 0xBD56, 0x7D4D, 0xBD57, 0x7D4E, 0xBD58, 0x7D4F, + 0xBD59, 0x7D50, 0xBD5A, 0x7D51, 0xBD5B, 0x7D52, 0xBD5C, 0x7D53, + 0xBD5D, 0x7D54, 0xBD5E, 0x7D55, 0xBD5F, 0x7D56, 0xBD60, 0x7D57, + 0xBD61, 0x7D58, 0xBD62, 0x7D59, 0xBD63, 0x7D5A, 0xBD64, 0x7D5B, + 0xBD65, 0x7D5C, 0xBD66, 0x7D5D, 0xBD67, 0x7D5E, 0xBD68, 0x7D5F, + 0xBD69, 0x7D60, 0xBD6A, 0x7D61, 0xBD6B, 0x7D62, 0xBD6C, 0x7D63, + 0xBD6D, 0x7D64, 0xBD6E, 0x7D65, 0xBD6F, 0x7D66, 0xBD70, 0x7D67, + 0xBD71, 0x7D68, 0xBD72, 0x7D69, 0xBD73, 0x7D6A, 0xBD74, 0x7D6B, + 0xBD75, 0x7D6C, 0xBD76, 0x7D6D, 0xBD77, 0x7D6F, 0xBD78, 0x7D70, + 0xBD79, 0x7D71, 0xBD7A, 0x7D72, 0xBD7B, 0x7D73, 0xBD7C, 0x7D74, + 0xBD7D, 0x7D75, 0xBD7E, 0x7D76, 0xBD80, 0x7D78, 0xBD81, 0x7D79, + 0xBD82, 0x7D7A, 0xBD83, 0x7D7B, 0xBD84, 0x7D7C, 0xBD85, 0x7D7D, + 0xBD86, 0x7D7E, 0xBD87, 0x7D7F, 0xBD88, 0x7D80, 0xBD89, 0x7D81, + 0xBD8A, 0x7D82, 0xBD8B, 0x7D83, 0xBD8C, 0x7D84, 0xBD8D, 0x7D85, + 0xBD8E, 0x7D86, 0xBD8F, 0x7D87, 0xBD90, 0x7D88, 0xBD91, 0x7D89, + 0xBD92, 0x7D8A, 0xBD93, 0x7D8B, 0xBD94, 0x7D8C, 0xBD95, 0x7D8D, + 0xBD96, 0x7D8E, 0xBD97, 0x7D8F, 0xBD98, 0x7D90, 0xBD99, 0x7D91, + 0xBD9A, 0x7D92, 0xBD9B, 0x7D93, 0xBD9C, 0x7D94, 0xBD9D, 0x7D95, + 0xBD9E, 0x7D96, 0xBD9F, 0x7D97, 0xBDA0, 0x7D98, 0xBDA1, 0x5065, + 0xBDA2, 0x8230, 0xBDA3, 0x5251, 0xBDA4, 0x996F, 0xBDA5, 0x6E10, + 0xBDA6, 0x6E85, 0xBDA7, 0x6DA7, 0xBDA8, 0x5EFA, 0xBDA9, 0x50F5, + 0xBDAA, 0x59DC, 0xBDAB, 0x5C06, 0xBDAC, 0x6D46, 0xBDAD, 0x6C5F, + 0xBDAE, 0x7586, 0xBDAF, 0x848B, 0xBDB0, 0x6868, 0xBDB1, 0x5956, + 0xBDB2, 0x8BB2, 0xBDB3, 0x5320, 0xBDB4, 0x9171, 0xBDB5, 0x964D, + 0xBDB6, 0x8549, 0xBDB7, 0x6912, 0xBDB8, 0x7901, 0xBDB9, 0x7126, + 0xBDBA, 0x80F6, 0xBDBB, 0x4EA4, 0xBDBC, 0x90CA, 0xBDBD, 0x6D47, + 0xBDBE, 0x9A84, 0xBDBF, 0x5A07, 0xBDC0, 0x56BC, 0xBDC1, 0x6405, + 0xBDC2, 0x94F0, 0xBDC3, 0x77EB, 0xBDC4, 0x4FA5, 0xBDC5, 0x811A, + 0xBDC6, 0x72E1, 0xBDC7, 0x89D2, 0xBDC8, 0x997A, 0xBDC9, 0x7F34, + 0xBDCA, 0x7EDE, 0xBDCB, 0x527F, 0xBDCC, 0x6559, 0xBDCD, 0x9175, + 0xBDCE, 0x8F7F, 0xBDCF, 0x8F83, 0xBDD0, 0x53EB, 0xBDD1, 0x7A96, + 0xBDD2, 0x63ED, 0xBDD3, 0x63A5, 0xBDD4, 0x7686, 0xBDD5, 0x79F8, + 0xBDD6, 0x8857, 0xBDD7, 0x9636, 0xBDD8, 0x622A, 0xBDD9, 0x52AB, + 0xBDDA, 0x8282, 0xBDDB, 0x6854, 0xBDDC, 0x6770, 0xBDDD, 0x6377, + 0xBDDE, 0x776B, 0xBDDF, 0x7AED, 0xBDE0, 0x6D01, 0xBDE1, 0x7ED3, + 0xBDE2, 0x89E3, 0xBDE3, 0x59D0, 0xBDE4, 0x6212, 0xBDE5, 0x85C9, + 0xBDE6, 0x82A5, 0xBDE7, 0x754C, 0xBDE8, 0x501F, 0xBDE9, 0x4ECB, + 0xBDEA, 0x75A5, 0xBDEB, 0x8BEB, 0xBDEC, 0x5C4A, 0xBDED, 0x5DFE, + 0xBDEE, 0x7B4B, 0xBDEF, 0x65A4, 0xBDF0, 0x91D1, 0xBDF1, 0x4ECA, + 0xBDF2, 0x6D25, 0xBDF3, 0x895F, 0xBDF4, 0x7D27, 0xBDF5, 0x9526, + 0xBDF6, 0x4EC5, 0xBDF7, 0x8C28, 0xBDF8, 0x8FDB, 0xBDF9, 0x9773, + 0xBDFA, 0x664B, 0xBDFB, 0x7981, 0xBDFC, 0x8FD1, 0xBDFD, 0x70EC, + 0xBDFE, 0x6D78, 0xBE40, 0x7D99, 0xBE41, 0x7D9A, 0xBE42, 0x7D9B, + 0xBE43, 0x7D9C, 0xBE44, 0x7D9D, 0xBE45, 0x7D9E, 0xBE46, 0x7D9F, + 0xBE47, 0x7DA0, 0xBE48, 0x7DA1, 0xBE49, 0x7DA2, 0xBE4A, 0x7DA3, + 0xBE4B, 0x7DA4, 0xBE4C, 0x7DA5, 0xBE4D, 0x7DA7, 0xBE4E, 0x7DA8, + 0xBE4F, 0x7DA9, 0xBE50, 0x7DAA, 0xBE51, 0x7DAB, 0xBE52, 0x7DAC, + 0xBE53, 0x7DAD, 0xBE54, 0x7DAF, 0xBE55, 0x7DB0, 0xBE56, 0x7DB1, + 0xBE57, 0x7DB2, 0xBE58, 0x7DB3, 0xBE59, 0x7DB4, 0xBE5A, 0x7DB5, + 0xBE5B, 0x7DB6, 0xBE5C, 0x7DB7, 0xBE5D, 0x7DB8, 0xBE5E, 0x7DB9, + 0xBE5F, 0x7DBA, 0xBE60, 0x7DBB, 0xBE61, 0x7DBC, 0xBE62, 0x7DBD, + 0xBE63, 0x7DBE, 0xBE64, 0x7DBF, 0xBE65, 0x7DC0, 0xBE66, 0x7DC1, + 0xBE67, 0x7DC2, 0xBE68, 0x7DC3, 0xBE69, 0x7DC4, 0xBE6A, 0x7DC5, + 0xBE6B, 0x7DC6, 0xBE6C, 0x7DC7, 0xBE6D, 0x7DC8, 0xBE6E, 0x7DC9, + 0xBE6F, 0x7DCA, 0xBE70, 0x7DCB, 0xBE71, 0x7DCC, 0xBE72, 0x7DCD, + 0xBE73, 0x7DCE, 0xBE74, 0x7DCF, 0xBE75, 0x7DD0, 0xBE76, 0x7DD1, + 0xBE77, 0x7DD2, 0xBE78, 0x7DD3, 0xBE79, 0x7DD4, 0xBE7A, 0x7DD5, + 0xBE7B, 0x7DD6, 0xBE7C, 0x7DD7, 0xBE7D, 0x7DD8, 0xBE7E, 0x7DD9, + 0xBE80, 0x7DDA, 0xBE81, 0x7DDB, 0xBE82, 0x7DDC, 0xBE83, 0x7DDD, + 0xBE84, 0x7DDE, 0xBE85, 0x7DDF, 0xBE86, 0x7DE0, 0xBE87, 0x7DE1, + 0xBE88, 0x7DE2, 0xBE89, 0x7DE3, 0xBE8A, 0x7DE4, 0xBE8B, 0x7DE5, + 0xBE8C, 0x7DE6, 0xBE8D, 0x7DE7, 0xBE8E, 0x7DE8, 0xBE8F, 0x7DE9, + 0xBE90, 0x7DEA, 0xBE91, 0x7DEB, 0xBE92, 0x7DEC, 0xBE93, 0x7DED, + 0xBE94, 0x7DEE, 0xBE95, 0x7DEF, 0xBE96, 0x7DF0, 0xBE97, 0x7DF1, + 0xBE98, 0x7DF2, 0xBE99, 0x7DF3, 0xBE9A, 0x7DF4, 0xBE9B, 0x7DF5, + 0xBE9C, 0x7DF6, 0xBE9D, 0x7DF7, 0xBE9E, 0x7DF8, 0xBE9F, 0x7DF9, + 0xBEA0, 0x7DFA, 0xBEA1, 0x5C3D, 0xBEA2, 0x52B2, 0xBEA3, 0x8346, + 0xBEA4, 0x5162, 0xBEA5, 0x830E, 0xBEA6, 0x775B, 0xBEA7, 0x6676, + 0xBEA8, 0x9CB8, 0xBEA9, 0x4EAC, 0xBEAA, 0x60CA, 0xBEAB, 0x7CBE, + 0xBEAC, 0x7CB3, 0xBEAD, 0x7ECF, 0xBEAE, 0x4E95, 0xBEAF, 0x8B66, + 0xBEB0, 0x666F, 0xBEB1, 0x9888, 0xBEB2, 0x9759, 0xBEB3, 0x5883, + 0xBEB4, 0x656C, 0xBEB5, 0x955C, 0xBEB6, 0x5F84, 0xBEB7, 0x75C9, + 0xBEB8, 0x9756, 0xBEB9, 0x7ADF, 0xBEBA, 0x7ADE, 0xBEBB, 0x51C0, + 0xBEBC, 0x70AF, 0xBEBD, 0x7A98, 0xBEBE, 0x63EA, 0xBEBF, 0x7A76, + 0xBEC0, 0x7EA0, 0xBEC1, 0x7396, 0xBEC2, 0x97ED, 0xBEC3, 0x4E45, + 0xBEC4, 0x7078, 0xBEC5, 0x4E5D, 0xBEC6, 0x9152, 0xBEC7, 0x53A9, + 0xBEC8, 0x6551, 0xBEC9, 0x65E7, 0xBECA, 0x81FC, 0xBECB, 0x8205, + 0xBECC, 0x548E, 0xBECD, 0x5C31, 0xBECE, 0x759A, 0xBECF, 0x97A0, + 0xBED0, 0x62D8, 0xBED1, 0x72D9, 0xBED2, 0x75BD, 0xBED3, 0x5C45, + 0xBED4, 0x9A79, 0xBED5, 0x83CA, 0xBED6, 0x5C40, 0xBED7, 0x5480, + 0xBED8, 0x77E9, 0xBED9, 0x4E3E, 0xBEDA, 0x6CAE, 0xBEDB, 0x805A, + 0xBEDC, 0x62D2, 0xBEDD, 0x636E, 0xBEDE, 0x5DE8, 0xBEDF, 0x5177, + 0xBEE0, 0x8DDD, 0xBEE1, 0x8E1E, 0xBEE2, 0x952F, 0xBEE3, 0x4FF1, + 0xBEE4, 0x53E5, 0xBEE5, 0x60E7, 0xBEE6, 0x70AC, 0xBEE7, 0x5267, + 0xBEE8, 0x6350, 0xBEE9, 0x9E43, 0xBEEA, 0x5A1F, 0xBEEB, 0x5026, + 0xBEEC, 0x7737, 0xBEED, 0x5377, 0xBEEE, 0x7EE2, 0xBEEF, 0x6485, + 0xBEF0, 0x652B, 0xBEF1, 0x6289, 0xBEF2, 0x6398, 0xBEF3, 0x5014, + 0xBEF4, 0x7235, 0xBEF5, 0x89C9, 0xBEF6, 0x51B3, 0xBEF7, 0x8BC0, + 0xBEF8, 0x7EDD, 0xBEF9, 0x5747, 0xBEFA, 0x83CC, 0xBEFB, 0x94A7, + 0xBEFC, 0x519B, 0xBEFD, 0x541B, 0xBEFE, 0x5CFB, 0xBF40, 0x7DFB, + 0xBF41, 0x7DFC, 0xBF42, 0x7DFD, 0xBF43, 0x7DFE, 0xBF44, 0x7DFF, + 0xBF45, 0x7E00, 0xBF46, 0x7E01, 0xBF47, 0x7E02, 0xBF48, 0x7E03, + 0xBF49, 0x7E04, 0xBF4A, 0x7E05, 0xBF4B, 0x7E06, 0xBF4C, 0x7E07, + 0xBF4D, 0x7E08, 0xBF4E, 0x7E09, 0xBF4F, 0x7E0A, 0xBF50, 0x7E0B, + 0xBF51, 0x7E0C, 0xBF52, 0x7E0D, 0xBF53, 0x7E0E, 0xBF54, 0x7E0F, + 0xBF55, 0x7E10, 0xBF56, 0x7E11, 0xBF57, 0x7E12, 0xBF58, 0x7E13, + 0xBF59, 0x7E14, 0xBF5A, 0x7E15, 0xBF5B, 0x7E16, 0xBF5C, 0x7E17, + 0xBF5D, 0x7E18, 0xBF5E, 0x7E19, 0xBF5F, 0x7E1A, 0xBF60, 0x7E1B, + 0xBF61, 0x7E1C, 0xBF62, 0x7E1D, 0xBF63, 0x7E1E, 0xBF64, 0x7E1F, + 0xBF65, 0x7E20, 0xBF66, 0x7E21, 0xBF67, 0x7E22, 0xBF68, 0x7E23, + 0xBF69, 0x7E24, 0xBF6A, 0x7E25, 0xBF6B, 0x7E26, 0xBF6C, 0x7E27, + 0xBF6D, 0x7E28, 0xBF6E, 0x7E29, 0xBF6F, 0x7E2A, 0xBF70, 0x7E2B, + 0xBF71, 0x7E2C, 0xBF72, 0x7E2D, 0xBF73, 0x7E2E, 0xBF74, 0x7E2F, + 0xBF75, 0x7E30, 0xBF76, 0x7E31, 0xBF77, 0x7E32, 0xBF78, 0x7E33, + 0xBF79, 0x7E34, 0xBF7A, 0x7E35, 0xBF7B, 0x7E36, 0xBF7C, 0x7E37, + 0xBF7D, 0x7E38, 0xBF7E, 0x7E39, 0xBF80, 0x7E3A, 0xBF81, 0x7E3C, + 0xBF82, 0x7E3D, 0xBF83, 0x7E3E, 0xBF84, 0x7E3F, 0xBF85, 0x7E40, + 0xBF86, 0x7E42, 0xBF87, 0x7E43, 0xBF88, 0x7E44, 0xBF89, 0x7E45, + 0xBF8A, 0x7E46, 0xBF8B, 0x7E48, 0xBF8C, 0x7E49, 0xBF8D, 0x7E4A, + 0xBF8E, 0x7E4B, 0xBF8F, 0x7E4C, 0xBF90, 0x7E4D, 0xBF91, 0x7E4E, + 0xBF92, 0x7E4F, 0xBF93, 0x7E50, 0xBF94, 0x7E51, 0xBF95, 0x7E52, + 0xBF96, 0x7E53, 0xBF97, 0x7E54, 0xBF98, 0x7E55, 0xBF99, 0x7E56, + 0xBF9A, 0x7E57, 0xBF9B, 0x7E58, 0xBF9C, 0x7E59, 0xBF9D, 0x7E5A, + 0xBF9E, 0x7E5B, 0xBF9F, 0x7E5C, 0xBFA0, 0x7E5D, 0xBFA1, 0x4FCA, + 0xBFA2, 0x7AE3, 0xBFA3, 0x6D5A, 0xBFA4, 0x90E1, 0xBFA5, 0x9A8F, + 0xBFA6, 0x5580, 0xBFA7, 0x5496, 0xBFA8, 0x5361, 0xBFA9, 0x54AF, + 0xBFAA, 0x5F00, 0xBFAB, 0x63E9, 0xBFAC, 0x6977, 0xBFAD, 0x51EF, + 0xBFAE, 0x6168, 0xBFAF, 0x520A, 0xBFB0, 0x582A, 0xBFB1, 0x52D8, + 0xBFB2, 0x574E, 0xBFB3, 0x780D, 0xBFB4, 0x770B, 0xBFB5, 0x5EB7, + 0xBFB6, 0x6177, 0xBFB7, 0x7CE0, 0xBFB8, 0x625B, 0xBFB9, 0x6297, + 0xBFBA, 0x4EA2, 0xBFBB, 0x7095, 0xBFBC, 0x8003, 0xBFBD, 0x62F7, + 0xBFBE, 0x70E4, 0xBFBF, 0x9760, 0xBFC0, 0x5777, 0xBFC1, 0x82DB, + 0xBFC2, 0x67EF, 0xBFC3, 0x68F5, 0xBFC4, 0x78D5, 0xBFC5, 0x9897, + 0xBFC6, 0x79D1, 0xBFC7, 0x58F3, 0xBFC8, 0x54B3, 0xBFC9, 0x53EF, + 0xBFCA, 0x6E34, 0xBFCB, 0x514B, 0xBFCC, 0x523B, 0xBFCD, 0x5BA2, + 0xBFCE, 0x8BFE, 0xBFCF, 0x80AF, 0xBFD0, 0x5543, 0xBFD1, 0x57A6, + 0xBFD2, 0x6073, 0xBFD3, 0x5751, 0xBFD4, 0x542D, 0xBFD5, 0x7A7A, + 0xBFD6, 0x6050, 0xBFD7, 0x5B54, 0xBFD8, 0x63A7, 0xBFD9, 0x62A0, + 0xBFDA, 0x53E3, 0xBFDB, 0x6263, 0xBFDC, 0x5BC7, 0xBFDD, 0x67AF, + 0xBFDE, 0x54ED, 0xBFDF, 0x7A9F, 0xBFE0, 0x82E6, 0xBFE1, 0x9177, + 0xBFE2, 0x5E93, 0xBFE3, 0x88E4, 0xBFE4, 0x5938, 0xBFE5, 0x57AE, + 0xBFE6, 0x630E, 0xBFE7, 0x8DE8, 0xBFE8, 0x80EF, 0xBFE9, 0x5757, + 0xBFEA, 0x7B77, 0xBFEB, 0x4FA9, 0xBFEC, 0x5FEB, 0xBFED, 0x5BBD, + 0xBFEE, 0x6B3E, 0xBFEF, 0x5321, 0xBFF0, 0x7B50, 0xBFF1, 0x72C2, + 0xBFF2, 0x6846, 0xBFF3, 0x77FF, 0xBFF4, 0x7736, 0xBFF5, 0x65F7, + 0xBFF6, 0x51B5, 0xBFF7, 0x4E8F, 0xBFF8, 0x76D4, 0xBFF9, 0x5CBF, + 0xBFFA, 0x7AA5, 0xBFFB, 0x8475, 0xBFFC, 0x594E, 0xBFFD, 0x9B41, + 0xBFFE, 0x5080, 0xC040, 0x7E5E, 0xC041, 0x7E5F, 0xC042, 0x7E60, + 0xC043, 0x7E61, 0xC044, 0x7E62, 0xC045, 0x7E63, 0xC046, 0x7E64, + 0xC047, 0x7E65, 0xC048, 0x7E66, 0xC049, 0x7E67, 0xC04A, 0x7E68, + 0xC04B, 0x7E69, 0xC04C, 0x7E6A, 0xC04D, 0x7E6B, 0xC04E, 0x7E6C, + 0xC04F, 0x7E6D, 0xC050, 0x7E6E, 0xC051, 0x7E6F, 0xC052, 0x7E70, + 0xC053, 0x7E71, 0xC054, 0x7E72, 0xC055, 0x7E73, 0xC056, 0x7E74, + 0xC057, 0x7E75, 0xC058, 0x7E76, 0xC059, 0x7E77, 0xC05A, 0x7E78, + 0xC05B, 0x7E79, 0xC05C, 0x7E7A, 0xC05D, 0x7E7B, 0xC05E, 0x7E7C, + 0xC05F, 0x7E7D, 0xC060, 0x7E7E, 0xC061, 0x7E7F, 0xC062, 0x7E80, + 0xC063, 0x7E81, 0xC064, 0x7E83, 0xC065, 0x7E84, 0xC066, 0x7E85, + 0xC067, 0x7E86, 0xC068, 0x7E87, 0xC069, 0x7E88, 0xC06A, 0x7E89, + 0xC06B, 0x7E8A, 0xC06C, 0x7E8B, 0xC06D, 0x7E8C, 0xC06E, 0x7E8D, + 0xC06F, 0x7E8E, 0xC070, 0x7E8F, 0xC071, 0x7E90, 0xC072, 0x7E91, + 0xC073, 0x7E92, 0xC074, 0x7E93, 0xC075, 0x7E94, 0xC076, 0x7E95, + 0xC077, 0x7E96, 0xC078, 0x7E97, 0xC079, 0x7E98, 0xC07A, 0x7E99, + 0xC07B, 0x7E9A, 0xC07C, 0x7E9C, 0xC07D, 0x7E9D, 0xC07E, 0x7E9E, + 0xC080, 0x7EAE, 0xC081, 0x7EB4, 0xC082, 0x7EBB, 0xC083, 0x7EBC, + 0xC084, 0x7ED6, 0xC085, 0x7EE4, 0xC086, 0x7EEC, 0xC087, 0x7EF9, + 0xC088, 0x7F0A, 0xC089, 0x7F10, 0xC08A, 0x7F1E, 0xC08B, 0x7F37, + 0xC08C, 0x7F39, 0xC08D, 0x7F3B, 0xC08E, 0x7F3C, 0xC08F, 0x7F3D, + 0xC090, 0x7F3E, 0xC091, 0x7F3F, 0xC092, 0x7F40, 0xC093, 0x7F41, + 0xC094, 0x7F43, 0xC095, 0x7F46, 0xC096, 0x7F47, 0xC097, 0x7F48, + 0xC098, 0x7F49, 0xC099, 0x7F4A, 0xC09A, 0x7F4B, 0xC09B, 0x7F4C, + 0xC09C, 0x7F4D, 0xC09D, 0x7F4E, 0xC09E, 0x7F4F, 0xC09F, 0x7F52, + 0xC0A0, 0x7F53, 0xC0A1, 0x9988, 0xC0A2, 0x6127, 0xC0A3, 0x6E83, + 0xC0A4, 0x5764, 0xC0A5, 0x6606, 0xC0A6, 0x6346, 0xC0A7, 0x56F0, + 0xC0A8, 0x62EC, 0xC0A9, 0x6269, 0xC0AA, 0x5ED3, 0xC0AB, 0x9614, + 0xC0AC, 0x5783, 0xC0AD, 0x62C9, 0xC0AE, 0x5587, 0xC0AF, 0x8721, + 0xC0B0, 0x814A, 0xC0B1, 0x8FA3, 0xC0B2, 0x5566, 0xC0B3, 0x83B1, + 0xC0B4, 0x6765, 0xC0B5, 0x8D56, 0xC0B6, 0x84DD, 0xC0B7, 0x5A6A, + 0xC0B8, 0x680F, 0xC0B9, 0x62E6, 0xC0BA, 0x7BEE, 0xC0BB, 0x9611, + 0xC0BC, 0x5170, 0xC0BD, 0x6F9C, 0xC0BE, 0x8C30, 0xC0BF, 0x63FD, + 0xC0C0, 0x89C8, 0xC0C1, 0x61D2, 0xC0C2, 0x7F06, 0xC0C3, 0x70C2, + 0xC0C4, 0x6EE5, 0xC0C5, 0x7405, 0xC0C6, 0x6994, 0xC0C7, 0x72FC, + 0xC0C8, 0x5ECA, 0xC0C9, 0x90CE, 0xC0CA, 0x6717, 0xC0CB, 0x6D6A, + 0xC0CC, 0x635E, 0xC0CD, 0x52B3, 0xC0CE, 0x7262, 0xC0CF, 0x8001, + 0xC0D0, 0x4F6C, 0xC0D1, 0x59E5, 0xC0D2, 0x916A, 0xC0D3, 0x70D9, + 0xC0D4, 0x6D9D, 0xC0D5, 0x52D2, 0xC0D6, 0x4E50, 0xC0D7, 0x96F7, + 0xC0D8, 0x956D, 0xC0D9, 0x857E, 0xC0DA, 0x78CA, 0xC0DB, 0x7D2F, + 0xC0DC, 0x5121, 0xC0DD, 0x5792, 0xC0DE, 0x64C2, 0xC0DF, 0x808B, + 0xC0E0, 0x7C7B, 0xC0E1, 0x6CEA, 0xC0E2, 0x68F1, 0xC0E3, 0x695E, + 0xC0E4, 0x51B7, 0xC0E5, 0x5398, 0xC0E6, 0x68A8, 0xC0E7, 0x7281, + 0xC0E8, 0x9ECE, 0xC0E9, 0x7BF1, 0xC0EA, 0x72F8, 0xC0EB, 0x79BB, + 0xC0EC, 0x6F13, 0xC0ED, 0x7406, 0xC0EE, 0x674E, 0xC0EF, 0x91CC, + 0xC0F0, 0x9CA4, 0xC0F1, 0x793C, 0xC0F2, 0x8389, 0xC0F3, 0x8354, + 0xC0F4, 0x540F, 0xC0F5, 0x6817, 0xC0F6, 0x4E3D, 0xC0F7, 0x5389, + 0xC0F8, 0x52B1, 0xC0F9, 0x783E, 0xC0FA, 0x5386, 0xC0FB, 0x5229, + 0xC0FC, 0x5088, 0xC0FD, 0x4F8B, 0xC0FE, 0x4FD0, 0xC140, 0x7F56, + 0xC141, 0x7F59, 0xC142, 0x7F5B, 0xC143, 0x7F5C, 0xC144, 0x7F5D, + 0xC145, 0x7F5E, 0xC146, 0x7F60, 0xC147, 0x7F63, 0xC148, 0x7F64, + 0xC149, 0x7F65, 0xC14A, 0x7F66, 0xC14B, 0x7F67, 0xC14C, 0x7F6B, + 0xC14D, 0x7F6C, 0xC14E, 0x7F6D, 0xC14F, 0x7F6F, 0xC150, 0x7F70, + 0xC151, 0x7F73, 0xC152, 0x7F75, 0xC153, 0x7F76, 0xC154, 0x7F77, + 0xC155, 0x7F78, 0xC156, 0x7F7A, 0xC157, 0x7F7B, 0xC158, 0x7F7C, + 0xC159, 0x7F7D, 0xC15A, 0x7F7F, 0xC15B, 0x7F80, 0xC15C, 0x7F82, + 0xC15D, 0x7F83, 0xC15E, 0x7F84, 0xC15F, 0x7F85, 0xC160, 0x7F86, + 0xC161, 0x7F87, 0xC162, 0x7F88, 0xC163, 0x7F89, 0xC164, 0x7F8B, + 0xC165, 0x7F8D, 0xC166, 0x7F8F, 0xC167, 0x7F90, 0xC168, 0x7F91, + 0xC169, 0x7F92, 0xC16A, 0x7F93, 0xC16B, 0x7F95, 0xC16C, 0x7F96, + 0xC16D, 0x7F97, 0xC16E, 0x7F98, 0xC16F, 0x7F99, 0xC170, 0x7F9B, + 0xC171, 0x7F9C, 0xC172, 0x7FA0, 0xC173, 0x7FA2, 0xC174, 0x7FA3, + 0xC175, 0x7FA5, 0xC176, 0x7FA6, 0xC177, 0x7FA8, 0xC178, 0x7FA9, + 0xC179, 0x7FAA, 0xC17A, 0x7FAB, 0xC17B, 0x7FAC, 0xC17C, 0x7FAD, + 0xC17D, 0x7FAE, 0xC17E, 0x7FB1, 0xC180, 0x7FB3, 0xC181, 0x7FB4, + 0xC182, 0x7FB5, 0xC183, 0x7FB6, 0xC184, 0x7FB7, 0xC185, 0x7FBA, + 0xC186, 0x7FBB, 0xC187, 0x7FBE, 0xC188, 0x7FC0, 0xC189, 0x7FC2, + 0xC18A, 0x7FC3, 0xC18B, 0x7FC4, 0xC18C, 0x7FC6, 0xC18D, 0x7FC7, + 0xC18E, 0x7FC8, 0xC18F, 0x7FC9, 0xC190, 0x7FCB, 0xC191, 0x7FCD, + 0xC192, 0x7FCF, 0xC193, 0x7FD0, 0xC194, 0x7FD1, 0xC195, 0x7FD2, + 0xC196, 0x7FD3, 0xC197, 0x7FD6, 0xC198, 0x7FD7, 0xC199, 0x7FD9, + 0xC19A, 0x7FDA, 0xC19B, 0x7FDB, 0xC19C, 0x7FDC, 0xC19D, 0x7FDD, + 0xC19E, 0x7FDE, 0xC19F, 0x7FE2, 0xC1A0, 0x7FE3, 0xC1A1, 0x75E2, + 0xC1A2, 0x7ACB, 0xC1A3, 0x7C92, 0xC1A4, 0x6CA5, 0xC1A5, 0x96B6, + 0xC1A6, 0x529B, 0xC1A7, 0x7483, 0xC1A8, 0x54E9, 0xC1A9, 0x4FE9, + 0xC1AA, 0x8054, 0xC1AB, 0x83B2, 0xC1AC, 0x8FDE, 0xC1AD, 0x9570, + 0xC1AE, 0x5EC9, 0xC1AF, 0x601C, 0xC1B0, 0x6D9F, 0xC1B1, 0x5E18, + 0xC1B2, 0x655B, 0xC1B3, 0x8138, 0xC1B4, 0x94FE, 0xC1B5, 0x604B, + 0xC1B6, 0x70BC, 0xC1B7, 0x7EC3, 0xC1B8, 0x7CAE, 0xC1B9, 0x51C9, + 0xC1BA, 0x6881, 0xC1BB, 0x7CB1, 0xC1BC, 0x826F, 0xC1BD, 0x4E24, + 0xC1BE, 0x8F86, 0xC1BF, 0x91CF, 0xC1C0, 0x667E, 0xC1C1, 0x4EAE, + 0xC1C2, 0x8C05, 0xC1C3, 0x64A9, 0xC1C4, 0x804A, 0xC1C5, 0x50DA, + 0xC1C6, 0x7597, 0xC1C7, 0x71CE, 0xC1C8, 0x5BE5, 0xC1C9, 0x8FBD, + 0xC1CA, 0x6F66, 0xC1CB, 0x4E86, 0xC1CC, 0x6482, 0xC1CD, 0x9563, + 0xC1CE, 0x5ED6, 0xC1CF, 0x6599, 0xC1D0, 0x5217, 0xC1D1, 0x88C2, + 0xC1D2, 0x70C8, 0xC1D3, 0x52A3, 0xC1D4, 0x730E, 0xC1D5, 0x7433, + 0xC1D6, 0x6797, 0xC1D7, 0x78F7, 0xC1D8, 0x9716, 0xC1D9, 0x4E34, + 0xC1DA, 0x90BB, 0xC1DB, 0x9CDE, 0xC1DC, 0x6DCB, 0xC1DD, 0x51DB, + 0xC1DE, 0x8D41, 0xC1DF, 0x541D, 0xC1E0, 0x62CE, 0xC1E1, 0x73B2, + 0xC1E2, 0x83F1, 0xC1E3, 0x96F6, 0xC1E4, 0x9F84, 0xC1E5, 0x94C3, + 0xC1E6, 0x4F36, 0xC1E7, 0x7F9A, 0xC1E8, 0x51CC, 0xC1E9, 0x7075, + 0xC1EA, 0x9675, 0xC1EB, 0x5CAD, 0xC1EC, 0x9886, 0xC1ED, 0x53E6, + 0xC1EE, 0x4EE4, 0xC1EF, 0x6E9C, 0xC1F0, 0x7409, 0xC1F1, 0x69B4, + 0xC1F2, 0x786B, 0xC1F3, 0x998F, 0xC1F4, 0x7559, 0xC1F5, 0x5218, + 0xC1F6, 0x7624, 0xC1F7, 0x6D41, 0xC1F8, 0x67F3, 0xC1F9, 0x516D, + 0xC1FA, 0x9F99, 0xC1FB, 0x804B, 0xC1FC, 0x5499, 0xC1FD, 0x7B3C, + 0xC1FE, 0x7ABF, 0xC240, 0x7FE4, 0xC241, 0x7FE7, 0xC242, 0x7FE8, + 0xC243, 0x7FEA, 0xC244, 0x7FEB, 0xC245, 0x7FEC, 0xC246, 0x7FED, + 0xC247, 0x7FEF, 0xC248, 0x7FF2, 0xC249, 0x7FF4, 0xC24A, 0x7FF5, + 0xC24B, 0x7FF6, 0xC24C, 0x7FF7, 0xC24D, 0x7FF8, 0xC24E, 0x7FF9, + 0xC24F, 0x7FFA, 0xC250, 0x7FFD, 0xC251, 0x7FFE, 0xC252, 0x7FFF, + 0xC253, 0x8002, 0xC254, 0x8007, 0xC255, 0x8008, 0xC256, 0x8009, + 0xC257, 0x800A, 0xC258, 0x800E, 0xC259, 0x800F, 0xC25A, 0x8011, + 0xC25B, 0x8013, 0xC25C, 0x801A, 0xC25D, 0x801B, 0xC25E, 0x801D, + 0xC25F, 0x801E, 0xC260, 0x801F, 0xC261, 0x8021, 0xC262, 0x8023, + 0xC263, 0x8024, 0xC264, 0x802B, 0xC265, 0x802C, 0xC266, 0x802D, + 0xC267, 0x802E, 0xC268, 0x802F, 0xC269, 0x8030, 0xC26A, 0x8032, + 0xC26B, 0x8034, 0xC26C, 0x8039, 0xC26D, 0x803A, 0xC26E, 0x803C, + 0xC26F, 0x803E, 0xC270, 0x8040, 0xC271, 0x8041, 0xC272, 0x8044, + 0xC273, 0x8045, 0xC274, 0x8047, 0xC275, 0x8048, 0xC276, 0x8049, + 0xC277, 0x804E, 0xC278, 0x804F, 0xC279, 0x8050, 0xC27A, 0x8051, + 0xC27B, 0x8053, 0xC27C, 0x8055, 0xC27D, 0x8056, 0xC27E, 0x8057, + 0xC280, 0x8059, 0xC281, 0x805B, 0xC282, 0x805C, 0xC283, 0x805D, + 0xC284, 0x805E, 0xC285, 0x805F, 0xC286, 0x8060, 0xC287, 0x8061, + 0xC288, 0x8062, 0xC289, 0x8063, 0xC28A, 0x8064, 0xC28B, 0x8065, + 0xC28C, 0x8066, 0xC28D, 0x8067, 0xC28E, 0x8068, 0xC28F, 0x806B, + 0xC290, 0x806C, 0xC291, 0x806D, 0xC292, 0x806E, 0xC293, 0x806F, + 0xC294, 0x8070, 0xC295, 0x8072, 0xC296, 0x8073, 0xC297, 0x8074, + 0xC298, 0x8075, 0xC299, 0x8076, 0xC29A, 0x8077, 0xC29B, 0x8078, + 0xC29C, 0x8079, 0xC29D, 0x807A, 0xC29E, 0x807B, 0xC29F, 0x807C, + 0xC2A0, 0x807D, 0xC2A1, 0x9686, 0xC2A2, 0x5784, 0xC2A3, 0x62E2, + 0xC2A4, 0x9647, 0xC2A5, 0x697C, 0xC2A6, 0x5A04, 0xC2A7, 0x6402, + 0xC2A8, 0x7BD3, 0xC2A9, 0x6F0F, 0xC2AA, 0x964B, 0xC2AB, 0x82A6, + 0xC2AC, 0x5362, 0xC2AD, 0x9885, 0xC2AE, 0x5E90, 0xC2AF, 0x7089, + 0xC2B0, 0x63B3, 0xC2B1, 0x5364, 0xC2B2, 0x864F, 0xC2B3, 0x9C81, + 0xC2B4, 0x9E93, 0xC2B5, 0x788C, 0xC2B6, 0x9732, 0xC2B7, 0x8DEF, + 0xC2B8, 0x8D42, 0xC2B9, 0x9E7F, 0xC2BA, 0x6F5E, 0xC2BB, 0x7984, + 0xC2BC, 0x5F55, 0xC2BD, 0x9646, 0xC2BE, 0x622E, 0xC2BF, 0x9A74, + 0xC2C0, 0x5415, 0xC2C1, 0x94DD, 0xC2C2, 0x4FA3, 0xC2C3, 0x65C5, + 0xC2C4, 0x5C65, 0xC2C5, 0x5C61, 0xC2C6, 0x7F15, 0xC2C7, 0x8651, + 0xC2C8, 0x6C2F, 0xC2C9, 0x5F8B, 0xC2CA, 0x7387, 0xC2CB, 0x6EE4, + 0xC2CC, 0x7EFF, 0xC2CD, 0x5CE6, 0xC2CE, 0x631B, 0xC2CF, 0x5B6A, + 0xC2D0, 0x6EE6, 0xC2D1, 0x5375, 0xC2D2, 0x4E71, 0xC2D3, 0x63A0, + 0xC2D4, 0x7565, 0xC2D5, 0x62A1, 0xC2D6, 0x8F6E, 0xC2D7, 0x4F26, + 0xC2D8, 0x4ED1, 0xC2D9, 0x6CA6, 0xC2DA, 0x7EB6, 0xC2DB, 0x8BBA, + 0xC2DC, 0x841D, 0xC2DD, 0x87BA, 0xC2DE, 0x7F57, 0xC2DF, 0x903B, + 0xC2E0, 0x9523, 0xC2E1, 0x7BA9, 0xC2E2, 0x9AA1, 0xC2E3, 0x88F8, + 0xC2E4, 0x843D, 0xC2E5, 0x6D1B, 0xC2E6, 0x9A86, 0xC2E7, 0x7EDC, + 0xC2E8, 0x5988, 0xC2E9, 0x9EBB, 0xC2EA, 0x739B, 0xC2EB, 0x7801, + 0xC2EC, 0x8682, 0xC2ED, 0x9A6C, 0xC2EE, 0x9A82, 0xC2EF, 0x561B, + 0xC2F0, 0x5417, 0xC2F1, 0x57CB, 0xC2F2, 0x4E70, 0xC2F3, 0x9EA6, + 0xC2F4, 0x5356, 0xC2F5, 0x8FC8, 0xC2F6, 0x8109, 0xC2F7, 0x7792, + 0xC2F8, 0x9992, 0xC2F9, 0x86EE, 0xC2FA, 0x6EE1, 0xC2FB, 0x8513, + 0xC2FC, 0x66FC, 0xC2FD, 0x6162, 0xC2FE, 0x6F2B, 0xC340, 0x807E, + 0xC341, 0x8081, 0xC342, 0x8082, 0xC343, 0x8085, 0xC344, 0x8088, + 0xC345, 0x808A, 0xC346, 0x808D, 0xC347, 0x808E, 0xC348, 0x808F, + 0xC349, 0x8090, 0xC34A, 0x8091, 0xC34B, 0x8092, 0xC34C, 0x8094, + 0xC34D, 0x8095, 0xC34E, 0x8097, 0xC34F, 0x8099, 0xC350, 0x809E, + 0xC351, 0x80A3, 0xC352, 0x80A6, 0xC353, 0x80A7, 0xC354, 0x80A8, + 0xC355, 0x80AC, 0xC356, 0x80B0, 0xC357, 0x80B3, 0xC358, 0x80B5, + 0xC359, 0x80B6, 0xC35A, 0x80B8, 0xC35B, 0x80B9, 0xC35C, 0x80BB, + 0xC35D, 0x80C5, 0xC35E, 0x80C7, 0xC35F, 0x80C8, 0xC360, 0x80C9, + 0xC361, 0x80CA, 0xC362, 0x80CB, 0xC363, 0x80CF, 0xC364, 0x80D0, + 0xC365, 0x80D1, 0xC366, 0x80D2, 0xC367, 0x80D3, 0xC368, 0x80D4, + 0xC369, 0x80D5, 0xC36A, 0x80D8, 0xC36B, 0x80DF, 0xC36C, 0x80E0, + 0xC36D, 0x80E2, 0xC36E, 0x80E3, 0xC36F, 0x80E6, 0xC370, 0x80EE, + 0xC371, 0x80F5, 0xC372, 0x80F7, 0xC373, 0x80F9, 0xC374, 0x80FB, + 0xC375, 0x80FE, 0xC376, 0x80FF, 0xC377, 0x8100, 0xC378, 0x8101, + 0xC379, 0x8103, 0xC37A, 0x8104, 0xC37B, 0x8105, 0xC37C, 0x8107, + 0xC37D, 0x8108, 0xC37E, 0x810B, 0xC380, 0x810C, 0xC381, 0x8115, + 0xC382, 0x8117, 0xC383, 0x8119, 0xC384, 0x811B, 0xC385, 0x811C, + 0xC386, 0x811D, 0xC387, 0x811F, 0xC388, 0x8120, 0xC389, 0x8121, + 0xC38A, 0x8122, 0xC38B, 0x8123, 0xC38C, 0x8124, 0xC38D, 0x8125, + 0xC38E, 0x8126, 0xC38F, 0x8127, 0xC390, 0x8128, 0xC391, 0x8129, + 0xC392, 0x812A, 0xC393, 0x812B, 0xC394, 0x812D, 0xC395, 0x812E, + 0xC396, 0x8130, 0xC397, 0x8133, 0xC398, 0x8134, 0xC399, 0x8135, + 0xC39A, 0x8137, 0xC39B, 0x8139, 0xC39C, 0x813A, 0xC39D, 0x813B, + 0xC39E, 0x813C, 0xC39F, 0x813D, 0xC3A0, 0x813F, 0xC3A1, 0x8C29, + 0xC3A2, 0x8292, 0xC3A3, 0x832B, 0xC3A4, 0x76F2, 0xC3A5, 0x6C13, + 0xC3A6, 0x5FD9, 0xC3A7, 0x83BD, 0xC3A8, 0x732B, 0xC3A9, 0x8305, + 0xC3AA, 0x951A, 0xC3AB, 0x6BDB, 0xC3AC, 0x77DB, 0xC3AD, 0x94C6, + 0xC3AE, 0x536F, 0xC3AF, 0x8302, 0xC3B0, 0x5192, 0xC3B1, 0x5E3D, + 0xC3B2, 0x8C8C, 0xC3B3, 0x8D38, 0xC3B4, 0x4E48, 0xC3B5, 0x73AB, + 0xC3B6, 0x679A, 0xC3B7, 0x6885, 0xC3B8, 0x9176, 0xC3B9, 0x9709, + 0xC3BA, 0x7164, 0xC3BB, 0x6CA1, 0xC3BC, 0x7709, 0xC3BD, 0x5A92, + 0xC3BE, 0x9541, 0xC3BF, 0x6BCF, 0xC3C0, 0x7F8E, 0xC3C1, 0x6627, + 0xC3C2, 0x5BD0, 0xC3C3, 0x59B9, 0xC3C4, 0x5A9A, 0xC3C5, 0x95E8, + 0xC3C6, 0x95F7, 0xC3C7, 0x4EEC, 0xC3C8, 0x840C, 0xC3C9, 0x8499, + 0xC3CA, 0x6AAC, 0xC3CB, 0x76DF, 0xC3CC, 0x9530, 0xC3CD, 0x731B, + 0xC3CE, 0x68A6, 0xC3CF, 0x5B5F, 0xC3D0, 0x772F, 0xC3D1, 0x919A, + 0xC3D2, 0x9761, 0xC3D3, 0x7CDC, 0xC3D4, 0x8FF7, 0xC3D5, 0x8C1C, + 0xC3D6, 0x5F25, 0xC3D7, 0x7C73, 0xC3D8, 0x79D8, 0xC3D9, 0x89C5, + 0xC3DA, 0x6CCC, 0xC3DB, 0x871C, 0xC3DC, 0x5BC6, 0xC3DD, 0x5E42, + 0xC3DE, 0x68C9, 0xC3DF, 0x7720, 0xC3E0, 0x7EF5, 0xC3E1, 0x5195, + 0xC3E2, 0x514D, 0xC3E3, 0x52C9, 0xC3E4, 0x5A29, 0xC3E5, 0x7F05, + 0xC3E6, 0x9762, 0xC3E7, 0x82D7, 0xC3E8, 0x63CF, 0xC3E9, 0x7784, + 0xC3EA, 0x85D0, 0xC3EB, 0x79D2, 0xC3EC, 0x6E3A, 0xC3ED, 0x5E99, + 0xC3EE, 0x5999, 0xC3EF, 0x8511, 0xC3F0, 0x706D, 0xC3F1, 0x6C11, + 0xC3F2, 0x62BF, 0xC3F3, 0x76BF, 0xC3F4, 0x654F, 0xC3F5, 0x60AF, + 0xC3F6, 0x95FD, 0xC3F7, 0x660E, 0xC3F8, 0x879F, 0xC3F9, 0x9E23, + 0xC3FA, 0x94ED, 0xC3FB, 0x540D, 0xC3FC, 0x547D, 0xC3FD, 0x8C2C, + 0xC3FE, 0x6478, 0xC440, 0x8140, 0xC441, 0x8141, 0xC442, 0x8142, + 0xC443, 0x8143, 0xC444, 0x8144, 0xC445, 0x8145, 0xC446, 0x8147, + 0xC447, 0x8149, 0xC448, 0x814D, 0xC449, 0x814E, 0xC44A, 0x814F, + 0xC44B, 0x8152, 0xC44C, 0x8156, 0xC44D, 0x8157, 0xC44E, 0x8158, + 0xC44F, 0x815B, 0xC450, 0x815C, 0xC451, 0x815D, 0xC452, 0x815E, + 0xC453, 0x815F, 0xC454, 0x8161, 0xC455, 0x8162, 0xC456, 0x8163, + 0xC457, 0x8164, 0xC458, 0x8166, 0xC459, 0x8168, 0xC45A, 0x816A, + 0xC45B, 0x816B, 0xC45C, 0x816C, 0xC45D, 0x816F, 0xC45E, 0x8172, + 0xC45F, 0x8173, 0xC460, 0x8175, 0xC461, 0x8176, 0xC462, 0x8177, + 0xC463, 0x8178, 0xC464, 0x8181, 0xC465, 0x8183, 0xC466, 0x8184, + 0xC467, 0x8185, 0xC468, 0x8186, 0xC469, 0x8187, 0xC46A, 0x8189, + 0xC46B, 0x818B, 0xC46C, 0x818C, 0xC46D, 0x818D, 0xC46E, 0x818E, + 0xC46F, 0x8190, 0xC470, 0x8192, 0xC471, 0x8193, 0xC472, 0x8194, + 0xC473, 0x8195, 0xC474, 0x8196, 0xC475, 0x8197, 0xC476, 0x8199, + 0xC477, 0x819A, 0xC478, 0x819E, 0xC479, 0x819F, 0xC47A, 0x81A0, + 0xC47B, 0x81A1, 0xC47C, 0x81A2, 0xC47D, 0x81A4, 0xC47E, 0x81A5, + 0xC480, 0x81A7, 0xC481, 0x81A9, 0xC482, 0x81AB, 0xC483, 0x81AC, + 0xC484, 0x81AD, 0xC485, 0x81AE, 0xC486, 0x81AF, 0xC487, 0x81B0, + 0xC488, 0x81B1, 0xC489, 0x81B2, 0xC48A, 0x81B4, 0xC48B, 0x81B5, + 0xC48C, 0x81B6, 0xC48D, 0x81B7, 0xC48E, 0x81B8, 0xC48F, 0x81B9, + 0xC490, 0x81BC, 0xC491, 0x81BD, 0xC492, 0x81BE, 0xC493, 0x81BF, + 0xC494, 0x81C4, 0xC495, 0x81C5, 0xC496, 0x81C7, 0xC497, 0x81C8, + 0xC498, 0x81C9, 0xC499, 0x81CB, 0xC49A, 0x81CD, 0xC49B, 0x81CE, + 0xC49C, 0x81CF, 0xC49D, 0x81D0, 0xC49E, 0x81D1, 0xC49F, 0x81D2, + 0xC4A0, 0x81D3, 0xC4A1, 0x6479, 0xC4A2, 0x8611, 0xC4A3, 0x6A21, + 0xC4A4, 0x819C, 0xC4A5, 0x78E8, 0xC4A6, 0x6469, 0xC4A7, 0x9B54, + 0xC4A8, 0x62B9, 0xC4A9, 0x672B, 0xC4AA, 0x83AB, 0xC4AB, 0x58A8, + 0xC4AC, 0x9ED8, 0xC4AD, 0x6CAB, 0xC4AE, 0x6F20, 0xC4AF, 0x5BDE, + 0xC4B0, 0x964C, 0xC4B1, 0x8C0B, 0xC4B2, 0x725F, 0xC4B3, 0x67D0, + 0xC4B4, 0x62C7, 0xC4B5, 0x7261, 0xC4B6, 0x4EA9, 0xC4B7, 0x59C6, + 0xC4B8, 0x6BCD, 0xC4B9, 0x5893, 0xC4BA, 0x66AE, 0xC4BB, 0x5E55, + 0xC4BC, 0x52DF, 0xC4BD, 0x6155, 0xC4BE, 0x6728, 0xC4BF, 0x76EE, + 0xC4C0, 0x7766, 0xC4C1, 0x7267, 0xC4C2, 0x7A46, 0xC4C3, 0x62FF, + 0xC4C4, 0x54EA, 0xC4C5, 0x5450, 0xC4C6, 0x94A0, 0xC4C7, 0x90A3, + 0xC4C8, 0x5A1C, 0xC4C9, 0x7EB3, 0xC4CA, 0x6C16, 0xC4CB, 0x4E43, + 0xC4CC, 0x5976, 0xC4CD, 0x8010, 0xC4CE, 0x5948, 0xC4CF, 0x5357, + 0xC4D0, 0x7537, 0xC4D1, 0x96BE, 0xC4D2, 0x56CA, 0xC4D3, 0x6320, + 0xC4D4, 0x8111, 0xC4D5, 0x607C, 0xC4D6, 0x95F9, 0xC4D7, 0x6DD6, + 0xC4D8, 0x5462, 0xC4D9, 0x9981, 0xC4DA, 0x5185, 0xC4DB, 0x5AE9, + 0xC4DC, 0x80FD, 0xC4DD, 0x59AE, 0xC4DE, 0x9713, 0xC4DF, 0x502A, + 0xC4E0, 0x6CE5, 0xC4E1, 0x5C3C, 0xC4E2, 0x62DF, 0xC4E3, 0x4F60, + 0xC4E4, 0x533F, 0xC4E5, 0x817B, 0xC4E6, 0x9006, 0xC4E7, 0x6EBA, + 0xC4E8, 0x852B, 0xC4E9, 0x62C8, 0xC4EA, 0x5E74, 0xC4EB, 0x78BE, + 0xC4EC, 0x64B5, 0xC4ED, 0x637B, 0xC4EE, 0x5FF5, 0xC4EF, 0x5A18, + 0xC4F0, 0x917F, 0xC4F1, 0x9E1F, 0xC4F2, 0x5C3F, 0xC4F3, 0x634F, + 0xC4F4, 0x8042, 0xC4F5, 0x5B7D, 0xC4F6, 0x556E, 0xC4F7, 0x954A, + 0xC4F8, 0x954D, 0xC4F9, 0x6D85, 0xC4FA, 0x60A8, 0xC4FB, 0x67E0, + 0xC4FC, 0x72DE, 0xC4FD, 0x51DD, 0xC4FE, 0x5B81, 0xC540, 0x81D4, + 0xC541, 0x81D5, 0xC542, 0x81D6, 0xC543, 0x81D7, 0xC544, 0x81D8, + 0xC545, 0x81D9, 0xC546, 0x81DA, 0xC547, 0x81DB, 0xC548, 0x81DC, + 0xC549, 0x81DD, 0xC54A, 0x81DE, 0xC54B, 0x81DF, 0xC54C, 0x81E0, + 0xC54D, 0x81E1, 0xC54E, 0x81E2, 0xC54F, 0x81E4, 0xC550, 0x81E5, + 0xC551, 0x81E6, 0xC552, 0x81E8, 0xC553, 0x81E9, 0xC554, 0x81EB, + 0xC555, 0x81EE, 0xC556, 0x81EF, 0xC557, 0x81F0, 0xC558, 0x81F1, + 0xC559, 0x81F2, 0xC55A, 0x81F5, 0xC55B, 0x81F6, 0xC55C, 0x81F7, + 0xC55D, 0x81F8, 0xC55E, 0x81F9, 0xC55F, 0x81FA, 0xC560, 0x81FD, + 0xC561, 0x81FF, 0xC562, 0x8203, 0xC563, 0x8207, 0xC564, 0x8208, + 0xC565, 0x8209, 0xC566, 0x820A, 0xC567, 0x820B, 0xC568, 0x820E, + 0xC569, 0x820F, 0xC56A, 0x8211, 0xC56B, 0x8213, 0xC56C, 0x8215, + 0xC56D, 0x8216, 0xC56E, 0x8217, 0xC56F, 0x8218, 0xC570, 0x8219, + 0xC571, 0x821A, 0xC572, 0x821D, 0xC573, 0x8220, 0xC574, 0x8224, + 0xC575, 0x8225, 0xC576, 0x8226, 0xC577, 0x8227, 0xC578, 0x8229, + 0xC579, 0x822E, 0xC57A, 0x8232, 0xC57B, 0x823A, 0xC57C, 0x823C, + 0xC57D, 0x823D, 0xC57E, 0x823F, 0xC580, 0x8240, 0xC581, 0x8241, + 0xC582, 0x8242, 0xC583, 0x8243, 0xC584, 0x8245, 0xC585, 0x8246, + 0xC586, 0x8248, 0xC587, 0x824A, 0xC588, 0x824C, 0xC589, 0x824D, + 0xC58A, 0x824E, 0xC58B, 0x8250, 0xC58C, 0x8251, 0xC58D, 0x8252, + 0xC58E, 0x8253, 0xC58F, 0x8254, 0xC590, 0x8255, 0xC591, 0x8256, + 0xC592, 0x8257, 0xC593, 0x8259, 0xC594, 0x825B, 0xC595, 0x825C, + 0xC596, 0x825D, 0xC597, 0x825E, 0xC598, 0x8260, 0xC599, 0x8261, + 0xC59A, 0x8262, 0xC59B, 0x8263, 0xC59C, 0x8264, 0xC59D, 0x8265, + 0xC59E, 0x8266, 0xC59F, 0x8267, 0xC5A0, 0x8269, 0xC5A1, 0x62E7, + 0xC5A2, 0x6CDE, 0xC5A3, 0x725B, 0xC5A4, 0x626D, 0xC5A5, 0x94AE, + 0xC5A6, 0x7EBD, 0xC5A7, 0x8113, 0xC5A8, 0x6D53, 0xC5A9, 0x519C, + 0xC5AA, 0x5F04, 0xC5AB, 0x5974, 0xC5AC, 0x52AA, 0xC5AD, 0x6012, + 0xC5AE, 0x5973, 0xC5AF, 0x6696, 0xC5B0, 0x8650, 0xC5B1, 0x759F, + 0xC5B2, 0x632A, 0xC5B3, 0x61E6, 0xC5B4, 0x7CEF, 0xC5B5, 0x8BFA, + 0xC5B6, 0x54E6, 0xC5B7, 0x6B27, 0xC5B8, 0x9E25, 0xC5B9, 0x6BB4, + 0xC5BA, 0x85D5, 0xC5BB, 0x5455, 0xC5BC, 0x5076, 0xC5BD, 0x6CA4, + 0xC5BE, 0x556A, 0xC5BF, 0x8DB4, 0xC5C0, 0x722C, 0xC5C1, 0x5E15, + 0xC5C2, 0x6015, 0xC5C3, 0x7436, 0xC5C4, 0x62CD, 0xC5C5, 0x6392, + 0xC5C6, 0x724C, 0xC5C7, 0x5F98, 0xC5C8, 0x6E43, 0xC5C9, 0x6D3E, + 0xC5CA, 0x6500, 0xC5CB, 0x6F58, 0xC5CC, 0x76D8, 0xC5CD, 0x78D0, + 0xC5CE, 0x76FC, 0xC5CF, 0x7554, 0xC5D0, 0x5224, 0xC5D1, 0x53DB, + 0xC5D2, 0x4E53, 0xC5D3, 0x5E9E, 0xC5D4, 0x65C1, 0xC5D5, 0x802A, + 0xC5D6, 0x80D6, 0xC5D7, 0x629B, 0xC5D8, 0x5486, 0xC5D9, 0x5228, + 0xC5DA, 0x70AE, 0xC5DB, 0x888D, 0xC5DC, 0x8DD1, 0xC5DD, 0x6CE1, + 0xC5DE, 0x5478, 0xC5DF, 0x80DA, 0xC5E0, 0x57F9, 0xC5E1, 0x88F4, + 0xC5E2, 0x8D54, 0xC5E3, 0x966A, 0xC5E4, 0x914D, 0xC5E5, 0x4F69, + 0xC5E6, 0x6C9B, 0xC5E7, 0x55B7, 0xC5E8, 0x76C6, 0xC5E9, 0x7830, + 0xC5EA, 0x62A8, 0xC5EB, 0x70F9, 0xC5EC, 0x6F8E, 0xC5ED, 0x5F6D, + 0xC5EE, 0x84EC, 0xC5EF, 0x68DA, 0xC5F0, 0x787C, 0xC5F1, 0x7BF7, + 0xC5F2, 0x81A8, 0xC5F3, 0x670B, 0xC5F4, 0x9E4F, 0xC5F5, 0x6367, + 0xC5F6, 0x78B0, 0xC5F7, 0x576F, 0xC5F8, 0x7812, 0xC5F9, 0x9739, + 0xC5FA, 0x6279, 0xC5FB, 0x62AB, 0xC5FC, 0x5288, 0xC5FD, 0x7435, + 0xC5FE, 0x6BD7, 0xC640, 0x826A, 0xC641, 0x826B, 0xC642, 0x826C, + 0xC643, 0x826D, 0xC644, 0x8271, 0xC645, 0x8275, 0xC646, 0x8276, + 0xC647, 0x8277, 0xC648, 0x8278, 0xC649, 0x827B, 0xC64A, 0x827C, + 0xC64B, 0x8280, 0xC64C, 0x8281, 0xC64D, 0x8283, 0xC64E, 0x8285, + 0xC64F, 0x8286, 0xC650, 0x8287, 0xC651, 0x8289, 0xC652, 0x828C, + 0xC653, 0x8290, 0xC654, 0x8293, 0xC655, 0x8294, 0xC656, 0x8295, + 0xC657, 0x8296, 0xC658, 0x829A, 0xC659, 0x829B, 0xC65A, 0x829E, + 0xC65B, 0x82A0, 0xC65C, 0x82A2, 0xC65D, 0x82A3, 0xC65E, 0x82A7, + 0xC65F, 0x82B2, 0xC660, 0x82B5, 0xC661, 0x82B6, 0xC662, 0x82BA, + 0xC663, 0x82BB, 0xC664, 0x82BC, 0xC665, 0x82BF, 0xC666, 0x82C0, + 0xC667, 0x82C2, 0xC668, 0x82C3, 0xC669, 0x82C5, 0xC66A, 0x82C6, + 0xC66B, 0x82C9, 0xC66C, 0x82D0, 0xC66D, 0x82D6, 0xC66E, 0x82D9, + 0xC66F, 0x82DA, 0xC670, 0x82DD, 0xC671, 0x82E2, 0xC672, 0x82E7, + 0xC673, 0x82E8, 0xC674, 0x82E9, 0xC675, 0x82EA, 0xC676, 0x82EC, + 0xC677, 0x82ED, 0xC678, 0x82EE, 0xC679, 0x82F0, 0xC67A, 0x82F2, + 0xC67B, 0x82F3, 0xC67C, 0x82F5, 0xC67D, 0x82F6, 0xC67E, 0x82F8, + 0xC680, 0x82FA, 0xC681, 0x82FC, 0xC682, 0x82FD, 0xC683, 0x82FE, + 0xC684, 0x82FF, 0xC685, 0x8300, 0xC686, 0x830A, 0xC687, 0x830B, + 0xC688, 0x830D, 0xC689, 0x8310, 0xC68A, 0x8312, 0xC68B, 0x8313, + 0xC68C, 0x8316, 0xC68D, 0x8318, 0xC68E, 0x8319, 0xC68F, 0x831D, + 0xC690, 0x831E, 0xC691, 0x831F, 0xC692, 0x8320, 0xC693, 0x8321, + 0xC694, 0x8322, 0xC695, 0x8323, 0xC696, 0x8324, 0xC697, 0x8325, + 0xC698, 0x8326, 0xC699, 0x8329, 0xC69A, 0x832A, 0xC69B, 0x832E, + 0xC69C, 0x8330, 0xC69D, 0x8332, 0xC69E, 0x8337, 0xC69F, 0x833B, + 0xC6A0, 0x833D, 0xC6A1, 0x5564, 0xC6A2, 0x813E, 0xC6A3, 0x75B2, + 0xC6A4, 0x76AE, 0xC6A5, 0x5339, 0xC6A6, 0x75DE, 0xC6A7, 0x50FB, + 0xC6A8, 0x5C41, 0xC6A9, 0x8B6C, 0xC6AA, 0x7BC7, 0xC6AB, 0x504F, + 0xC6AC, 0x7247, 0xC6AD, 0x9A97, 0xC6AE, 0x98D8, 0xC6AF, 0x6F02, + 0xC6B0, 0x74E2, 0xC6B1, 0x7968, 0xC6B2, 0x6487, 0xC6B3, 0x77A5, + 0xC6B4, 0x62FC, 0xC6B5, 0x9891, 0xC6B6, 0x8D2B, 0xC6B7, 0x54C1, + 0xC6B8, 0x8058, 0xC6B9, 0x4E52, 0xC6BA, 0x576A, 0xC6BB, 0x82F9, + 0xC6BC, 0x840D, 0xC6BD, 0x5E73, 0xC6BE, 0x51ED, 0xC6BF, 0x74F6, + 0xC6C0, 0x8BC4, 0xC6C1, 0x5C4F, 0xC6C2, 0x5761, 0xC6C3, 0x6CFC, + 0xC6C4, 0x9887, 0xC6C5, 0x5A46, 0xC6C6, 0x7834, 0xC6C7, 0x9B44, + 0xC6C8, 0x8FEB, 0xC6C9, 0x7C95, 0xC6CA, 0x5256, 0xC6CB, 0x6251, + 0xC6CC, 0x94FA, 0xC6CD, 0x4EC6, 0xC6CE, 0x8386, 0xC6CF, 0x8461, + 0xC6D0, 0x83E9, 0xC6D1, 0x84B2, 0xC6D2, 0x57D4, 0xC6D3, 0x6734, + 0xC6D4, 0x5703, 0xC6D5, 0x666E, 0xC6D6, 0x6D66, 0xC6D7, 0x8C31, + 0xC6D8, 0x66DD, 0xC6D9, 0x7011, 0xC6DA, 0x671F, 0xC6DB, 0x6B3A, + 0xC6DC, 0x6816, 0xC6DD, 0x621A, 0xC6DE, 0x59BB, 0xC6DF, 0x4E03, + 0xC6E0, 0x51C4, 0xC6E1, 0x6F06, 0xC6E2, 0x67D2, 0xC6E3, 0x6C8F, + 0xC6E4, 0x5176, 0xC6E5, 0x68CB, 0xC6E6, 0x5947, 0xC6E7, 0x6B67, + 0xC6E8, 0x7566, 0xC6E9, 0x5D0E, 0xC6EA, 0x8110, 0xC6EB, 0x9F50, + 0xC6EC, 0x65D7, 0xC6ED, 0x7948, 0xC6EE, 0x7941, 0xC6EF, 0x9A91, + 0xC6F0, 0x8D77, 0xC6F1, 0x5C82, 0xC6F2, 0x4E5E, 0xC6F3, 0x4F01, + 0xC6F4, 0x542F, 0xC6F5, 0x5951, 0xC6F6, 0x780C, 0xC6F7, 0x5668, + 0xC6F8, 0x6C14, 0xC6F9, 0x8FC4, 0xC6FA, 0x5F03, 0xC6FB, 0x6C7D, + 0xC6FC, 0x6CE3, 0xC6FD, 0x8BAB, 0xC6FE, 0x6390, 0xC740, 0x833E, + 0xC741, 0x833F, 0xC742, 0x8341, 0xC743, 0x8342, 0xC744, 0x8344, + 0xC745, 0x8345, 0xC746, 0x8348, 0xC747, 0x834A, 0xC748, 0x834B, + 0xC749, 0x834C, 0xC74A, 0x834D, 0xC74B, 0x834E, 0xC74C, 0x8353, + 0xC74D, 0x8355, 0xC74E, 0x8356, 0xC74F, 0x8357, 0xC750, 0x8358, + 0xC751, 0x8359, 0xC752, 0x835D, 0xC753, 0x8362, 0xC754, 0x8370, + 0xC755, 0x8371, 0xC756, 0x8372, 0xC757, 0x8373, 0xC758, 0x8374, + 0xC759, 0x8375, 0xC75A, 0x8376, 0xC75B, 0x8379, 0xC75C, 0x837A, + 0xC75D, 0x837E, 0xC75E, 0x837F, 0xC75F, 0x8380, 0xC760, 0x8381, + 0xC761, 0x8382, 0xC762, 0x8383, 0xC763, 0x8384, 0xC764, 0x8387, + 0xC765, 0x8388, 0xC766, 0x838A, 0xC767, 0x838B, 0xC768, 0x838C, + 0xC769, 0x838D, 0xC76A, 0x838F, 0xC76B, 0x8390, 0xC76C, 0x8391, + 0xC76D, 0x8394, 0xC76E, 0x8395, 0xC76F, 0x8396, 0xC770, 0x8397, + 0xC771, 0x8399, 0xC772, 0x839A, 0xC773, 0x839D, 0xC774, 0x839F, + 0xC775, 0x83A1, 0xC776, 0x83A2, 0xC777, 0x83A3, 0xC778, 0x83A4, + 0xC779, 0x83A5, 0xC77A, 0x83A6, 0xC77B, 0x83A7, 0xC77C, 0x83AC, + 0xC77D, 0x83AD, 0xC77E, 0x83AE, 0xC780, 0x83AF, 0xC781, 0x83B5, + 0xC782, 0x83BB, 0xC783, 0x83BE, 0xC784, 0x83BF, 0xC785, 0x83C2, + 0xC786, 0x83C3, 0xC787, 0x83C4, 0xC788, 0x83C6, 0xC789, 0x83C8, + 0xC78A, 0x83C9, 0xC78B, 0x83CB, 0xC78C, 0x83CD, 0xC78D, 0x83CE, + 0xC78E, 0x83D0, 0xC78F, 0x83D1, 0xC790, 0x83D2, 0xC791, 0x83D3, + 0xC792, 0x83D5, 0xC793, 0x83D7, 0xC794, 0x83D9, 0xC795, 0x83DA, + 0xC796, 0x83DB, 0xC797, 0x83DE, 0xC798, 0x83E2, 0xC799, 0x83E3, + 0xC79A, 0x83E4, 0xC79B, 0x83E6, 0xC79C, 0x83E7, 0xC79D, 0x83E8, + 0xC79E, 0x83EB, 0xC79F, 0x83EC, 0xC7A0, 0x83ED, 0xC7A1, 0x6070, + 0xC7A2, 0x6D3D, 0xC7A3, 0x7275, 0xC7A4, 0x6266, 0xC7A5, 0x948E, + 0xC7A6, 0x94C5, 0xC7A7, 0x5343, 0xC7A8, 0x8FC1, 0xC7A9, 0x7B7E, + 0xC7AA, 0x4EDF, 0xC7AB, 0x8C26, 0xC7AC, 0x4E7E, 0xC7AD, 0x9ED4, + 0xC7AE, 0x94B1, 0xC7AF, 0x94B3, 0xC7B0, 0x524D, 0xC7B1, 0x6F5C, + 0xC7B2, 0x9063, 0xC7B3, 0x6D45, 0xC7B4, 0x8C34, 0xC7B5, 0x5811, + 0xC7B6, 0x5D4C, 0xC7B7, 0x6B20, 0xC7B8, 0x6B49, 0xC7B9, 0x67AA, + 0xC7BA, 0x545B, 0xC7BB, 0x8154, 0xC7BC, 0x7F8C, 0xC7BD, 0x5899, + 0xC7BE, 0x8537, 0xC7BF, 0x5F3A, 0xC7C0, 0x62A2, 0xC7C1, 0x6A47, + 0xC7C2, 0x9539, 0xC7C3, 0x6572, 0xC7C4, 0x6084, 0xC7C5, 0x6865, + 0xC7C6, 0x77A7, 0xC7C7, 0x4E54, 0xC7C8, 0x4FA8, 0xC7C9, 0x5DE7, + 0xC7CA, 0x9798, 0xC7CB, 0x64AC, 0xC7CC, 0x7FD8, 0xC7CD, 0x5CED, + 0xC7CE, 0x4FCF, 0xC7CF, 0x7A8D, 0xC7D0, 0x5207, 0xC7D1, 0x8304, + 0xC7D2, 0x4E14, 0xC7D3, 0x602F, 0xC7D4, 0x7A83, 0xC7D5, 0x94A6, + 0xC7D6, 0x4FB5, 0xC7D7, 0x4EB2, 0xC7D8, 0x79E6, 0xC7D9, 0x7434, + 0xC7DA, 0x52E4, 0xC7DB, 0x82B9, 0xC7DC, 0x64D2, 0xC7DD, 0x79BD, + 0xC7DE, 0x5BDD, 0xC7DF, 0x6C81, 0xC7E0, 0x9752, 0xC7E1, 0x8F7B, + 0xC7E2, 0x6C22, 0xC7E3, 0x503E, 0xC7E4, 0x537F, 0xC7E5, 0x6E05, + 0xC7E6, 0x64CE, 0xC7E7, 0x6674, 0xC7E8, 0x6C30, 0xC7E9, 0x60C5, + 0xC7EA, 0x9877, 0xC7EB, 0x8BF7, 0xC7EC, 0x5E86, 0xC7ED, 0x743C, + 0xC7EE, 0x7A77, 0xC7EF, 0x79CB, 0xC7F0, 0x4E18, 0xC7F1, 0x90B1, + 0xC7F2, 0x7403, 0xC7F3, 0x6C42, 0xC7F4, 0x56DA, 0xC7F5, 0x914B, + 0xC7F6, 0x6CC5, 0xC7F7, 0x8D8B, 0xC7F8, 0x533A, 0xC7F9, 0x86C6, + 0xC7FA, 0x66F2, 0xC7FB, 0x8EAF, 0xC7FC, 0x5C48, 0xC7FD, 0x9A71, + 0xC7FE, 0x6E20, 0xC840, 0x83EE, 0xC841, 0x83EF, 0xC842, 0x83F3, + 0xC843, 0x83F4, 0xC844, 0x83F5, 0xC845, 0x83F6, 0xC846, 0x83F7, + 0xC847, 0x83FA, 0xC848, 0x83FB, 0xC849, 0x83FC, 0xC84A, 0x83FE, + 0xC84B, 0x83FF, 0xC84C, 0x8400, 0xC84D, 0x8402, 0xC84E, 0x8405, + 0xC84F, 0x8407, 0xC850, 0x8408, 0xC851, 0x8409, 0xC852, 0x840A, + 0xC853, 0x8410, 0xC854, 0x8412, 0xC855, 0x8413, 0xC856, 0x8414, + 0xC857, 0x8415, 0xC858, 0x8416, 0xC859, 0x8417, 0xC85A, 0x8419, + 0xC85B, 0x841A, 0xC85C, 0x841B, 0xC85D, 0x841E, 0xC85E, 0x841F, + 0xC85F, 0x8420, 0xC860, 0x8421, 0xC861, 0x8422, 0xC862, 0x8423, + 0xC863, 0x8429, 0xC864, 0x842A, 0xC865, 0x842B, 0xC866, 0x842C, + 0xC867, 0x842D, 0xC868, 0x842E, 0xC869, 0x842F, 0xC86A, 0x8430, + 0xC86B, 0x8432, 0xC86C, 0x8433, 0xC86D, 0x8434, 0xC86E, 0x8435, + 0xC86F, 0x8436, 0xC870, 0x8437, 0xC871, 0x8439, 0xC872, 0x843A, + 0xC873, 0x843B, 0xC874, 0x843E, 0xC875, 0x843F, 0xC876, 0x8440, + 0xC877, 0x8441, 0xC878, 0x8442, 0xC879, 0x8443, 0xC87A, 0x8444, + 0xC87B, 0x8445, 0xC87C, 0x8447, 0xC87D, 0x8448, 0xC87E, 0x8449, + 0xC880, 0x844A, 0xC881, 0x844B, 0xC882, 0x844C, 0xC883, 0x844D, + 0xC884, 0x844E, 0xC885, 0x844F, 0xC886, 0x8450, 0xC887, 0x8452, + 0xC888, 0x8453, 0xC889, 0x8454, 0xC88A, 0x8455, 0xC88B, 0x8456, + 0xC88C, 0x8458, 0xC88D, 0x845D, 0xC88E, 0x845E, 0xC88F, 0x845F, + 0xC890, 0x8460, 0xC891, 0x8462, 0xC892, 0x8464, 0xC893, 0x8465, + 0xC894, 0x8466, 0xC895, 0x8467, 0xC896, 0x8468, 0xC897, 0x846A, + 0xC898, 0x846E, 0xC899, 0x846F, 0xC89A, 0x8470, 0xC89B, 0x8472, + 0xC89C, 0x8474, 0xC89D, 0x8477, 0xC89E, 0x8479, 0xC89F, 0x847B, + 0xC8A0, 0x847C, 0xC8A1, 0x53D6, 0xC8A2, 0x5A36, 0xC8A3, 0x9F8B, + 0xC8A4, 0x8DA3, 0xC8A5, 0x53BB, 0xC8A6, 0x5708, 0xC8A7, 0x98A7, + 0xC8A8, 0x6743, 0xC8A9, 0x919B, 0xC8AA, 0x6CC9, 0xC8AB, 0x5168, + 0xC8AC, 0x75CA, 0xC8AD, 0x62F3, 0xC8AE, 0x72AC, 0xC8AF, 0x5238, + 0xC8B0, 0x529D, 0xC8B1, 0x7F3A, 0xC8B2, 0x7094, 0xC8B3, 0x7638, + 0xC8B4, 0x5374, 0xC8B5, 0x9E4A, 0xC8B6, 0x69B7, 0xC8B7, 0x786E, + 0xC8B8, 0x96C0, 0xC8B9, 0x88D9, 0xC8BA, 0x7FA4, 0xC8BB, 0x7136, + 0xC8BC, 0x71C3, 0xC8BD, 0x5189, 0xC8BE, 0x67D3, 0xC8BF, 0x74E4, + 0xC8C0, 0x58E4, 0xC8C1, 0x6518, 0xC8C2, 0x56B7, 0xC8C3, 0x8BA9, + 0xC8C4, 0x9976, 0xC8C5, 0x6270, 0xC8C6, 0x7ED5, 0xC8C7, 0x60F9, + 0xC8C8, 0x70ED, 0xC8C9, 0x58EC, 0xC8CA, 0x4EC1, 0xC8CB, 0x4EBA, + 0xC8CC, 0x5FCD, 0xC8CD, 0x97E7, 0xC8CE, 0x4EFB, 0xC8CF, 0x8BA4, + 0xC8D0, 0x5203, 0xC8D1, 0x598A, 0xC8D2, 0x7EAB, 0xC8D3, 0x6254, + 0xC8D4, 0x4ECD, 0xC8D5, 0x65E5, 0xC8D6, 0x620E, 0xC8D7, 0x8338, + 0xC8D8, 0x84C9, 0xC8D9, 0x8363, 0xC8DA, 0x878D, 0xC8DB, 0x7194, + 0xC8DC, 0x6EB6, 0xC8DD, 0x5BB9, 0xC8DE, 0x7ED2, 0xC8DF, 0x5197, + 0xC8E0, 0x63C9, 0xC8E1, 0x67D4, 0xC8E2, 0x8089, 0xC8E3, 0x8339, + 0xC8E4, 0x8815, 0xC8E5, 0x5112, 0xC8E6, 0x5B7A, 0xC8E7, 0x5982, + 0xC8E8, 0x8FB1, 0xC8E9, 0x4E73, 0xC8EA, 0x6C5D, 0xC8EB, 0x5165, + 0xC8EC, 0x8925, 0xC8ED, 0x8F6F, 0xC8EE, 0x962E, 0xC8EF, 0x854A, + 0xC8F0, 0x745E, 0xC8F1, 0x9510, 0xC8F2, 0x95F0, 0xC8F3, 0x6DA6, + 0xC8F4, 0x82E5, 0xC8F5, 0x5F31, 0xC8F6, 0x6492, 0xC8F7, 0x6D12, + 0xC8F8, 0x8428, 0xC8F9, 0x816E, 0xC8FA, 0x9CC3, 0xC8FB, 0x585E, + 0xC8FC, 0x8D5B, 0xC8FD, 0x4E09, 0xC8FE, 0x53C1, 0xC940, 0x847D, + 0xC941, 0x847E, 0xC942, 0x847F, 0xC943, 0x8480, 0xC944, 0x8481, + 0xC945, 0x8483, 0xC946, 0x8484, 0xC947, 0x8485, 0xC948, 0x8486, + 0xC949, 0x848A, 0xC94A, 0x848D, 0xC94B, 0x848F, 0xC94C, 0x8490, + 0xC94D, 0x8491, 0xC94E, 0x8492, 0xC94F, 0x8493, 0xC950, 0x8494, + 0xC951, 0x8495, 0xC952, 0x8496, 0xC953, 0x8498, 0xC954, 0x849A, + 0xC955, 0x849B, 0xC956, 0x849D, 0xC957, 0x849E, 0xC958, 0x849F, + 0xC959, 0x84A0, 0xC95A, 0x84A2, 0xC95B, 0x84A3, 0xC95C, 0x84A4, + 0xC95D, 0x84A5, 0xC95E, 0x84A6, 0xC95F, 0x84A7, 0xC960, 0x84A8, + 0xC961, 0x84A9, 0xC962, 0x84AA, 0xC963, 0x84AB, 0xC964, 0x84AC, + 0xC965, 0x84AD, 0xC966, 0x84AE, 0xC967, 0x84B0, 0xC968, 0x84B1, + 0xC969, 0x84B3, 0xC96A, 0x84B5, 0xC96B, 0x84B6, 0xC96C, 0x84B7, + 0xC96D, 0x84BB, 0xC96E, 0x84BC, 0xC96F, 0x84BE, 0xC970, 0x84C0, + 0xC971, 0x84C2, 0xC972, 0x84C3, 0xC973, 0x84C5, 0xC974, 0x84C6, + 0xC975, 0x84C7, 0xC976, 0x84C8, 0xC977, 0x84CB, 0xC978, 0x84CC, + 0xC979, 0x84CE, 0xC97A, 0x84CF, 0xC97B, 0x84D2, 0xC97C, 0x84D4, + 0xC97D, 0x84D5, 0xC97E, 0x84D7, 0xC980, 0x84D8, 0xC981, 0x84D9, + 0xC982, 0x84DA, 0xC983, 0x84DB, 0xC984, 0x84DC, 0xC985, 0x84DE, + 0xC986, 0x84E1, 0xC987, 0x84E2, 0xC988, 0x84E4, 0xC989, 0x84E7, + 0xC98A, 0x84E8, 0xC98B, 0x84E9, 0xC98C, 0x84EA, 0xC98D, 0x84EB, + 0xC98E, 0x84ED, 0xC98F, 0x84EE, 0xC990, 0x84EF, 0xC991, 0x84F1, + 0xC992, 0x84F2, 0xC993, 0x84F3, 0xC994, 0x84F4, 0xC995, 0x84F5, + 0xC996, 0x84F6, 0xC997, 0x84F7, 0xC998, 0x84F8, 0xC999, 0x84F9, + 0xC99A, 0x84FA, 0xC99B, 0x84FB, 0xC99C, 0x84FD, 0xC99D, 0x84FE, + 0xC99E, 0x8500, 0xC99F, 0x8501, 0xC9A0, 0x8502, 0xC9A1, 0x4F1E, + 0xC9A2, 0x6563, 0xC9A3, 0x6851, 0xC9A4, 0x55D3, 0xC9A5, 0x4E27, + 0xC9A6, 0x6414, 0xC9A7, 0x9A9A, 0xC9A8, 0x626B, 0xC9A9, 0x5AC2, + 0xC9AA, 0x745F, 0xC9AB, 0x8272, 0xC9AC, 0x6DA9, 0xC9AD, 0x68EE, + 0xC9AE, 0x50E7, 0xC9AF, 0x838E, 0xC9B0, 0x7802, 0xC9B1, 0x6740, + 0xC9B2, 0x5239, 0xC9B3, 0x6C99, 0xC9B4, 0x7EB1, 0xC9B5, 0x50BB, + 0xC9B6, 0x5565, 0xC9B7, 0x715E, 0xC9B8, 0x7B5B, 0xC9B9, 0x6652, + 0xC9BA, 0x73CA, 0xC9BB, 0x82EB, 0xC9BC, 0x6749, 0xC9BD, 0x5C71, + 0xC9BE, 0x5220, 0xC9BF, 0x717D, 0xC9C0, 0x886B, 0xC9C1, 0x95EA, + 0xC9C2, 0x9655, 0xC9C3, 0x64C5, 0xC9C4, 0x8D61, 0xC9C5, 0x81B3, + 0xC9C6, 0x5584, 0xC9C7, 0x6C55, 0xC9C8, 0x6247, 0xC9C9, 0x7F2E, + 0xC9CA, 0x5892, 0xC9CB, 0x4F24, 0xC9CC, 0x5546, 0xC9CD, 0x8D4F, + 0xC9CE, 0x664C, 0xC9CF, 0x4E0A, 0xC9D0, 0x5C1A, 0xC9D1, 0x88F3, + 0xC9D2, 0x68A2, 0xC9D3, 0x634E, 0xC9D4, 0x7A0D, 0xC9D5, 0x70E7, + 0xC9D6, 0x828D, 0xC9D7, 0x52FA, 0xC9D8, 0x97F6, 0xC9D9, 0x5C11, + 0xC9DA, 0x54E8, 0xC9DB, 0x90B5, 0xC9DC, 0x7ECD, 0xC9DD, 0x5962, + 0xC9DE, 0x8D4A, 0xC9DF, 0x86C7, 0xC9E0, 0x820C, 0xC9E1, 0x820D, + 0xC9E2, 0x8D66, 0xC9E3, 0x6444, 0xC9E4, 0x5C04, 0xC9E5, 0x6151, + 0xC9E6, 0x6D89, 0xC9E7, 0x793E, 0xC9E8, 0x8BBE, 0xC9E9, 0x7837, + 0xC9EA, 0x7533, 0xC9EB, 0x547B, 0xC9EC, 0x4F38, 0xC9ED, 0x8EAB, + 0xC9EE, 0x6DF1, 0xC9EF, 0x5A20, 0xC9F0, 0x7EC5, 0xC9F1, 0x795E, + 0xC9F2, 0x6C88, 0xC9F3, 0x5BA1, 0xC9F4, 0x5A76, 0xC9F5, 0x751A, + 0xC9F6, 0x80BE, 0xC9F7, 0x614E, 0xC9F8, 0x6E17, 0xC9F9, 0x58F0, + 0xC9FA, 0x751F, 0xC9FB, 0x7525, 0xC9FC, 0x7272, 0xC9FD, 0x5347, + 0xC9FE, 0x7EF3, 0xCA40, 0x8503, 0xCA41, 0x8504, 0xCA42, 0x8505, + 0xCA43, 0x8506, 0xCA44, 0x8507, 0xCA45, 0x8508, 0xCA46, 0x8509, + 0xCA47, 0x850A, 0xCA48, 0x850B, 0xCA49, 0x850D, 0xCA4A, 0x850E, + 0xCA4B, 0x850F, 0xCA4C, 0x8510, 0xCA4D, 0x8512, 0xCA4E, 0x8514, + 0xCA4F, 0x8515, 0xCA50, 0x8516, 0xCA51, 0x8518, 0xCA52, 0x8519, + 0xCA53, 0x851B, 0xCA54, 0x851C, 0xCA55, 0x851D, 0xCA56, 0x851E, + 0xCA57, 0x8520, 0xCA58, 0x8522, 0xCA59, 0x8523, 0xCA5A, 0x8524, + 0xCA5B, 0x8525, 0xCA5C, 0x8526, 0xCA5D, 0x8527, 0xCA5E, 0x8528, + 0xCA5F, 0x8529, 0xCA60, 0x852A, 0xCA61, 0x852D, 0xCA62, 0x852E, + 0xCA63, 0x852F, 0xCA64, 0x8530, 0xCA65, 0x8531, 0xCA66, 0x8532, + 0xCA67, 0x8533, 0xCA68, 0x8534, 0xCA69, 0x8535, 0xCA6A, 0x8536, + 0xCA6B, 0x853E, 0xCA6C, 0x853F, 0xCA6D, 0x8540, 0xCA6E, 0x8541, + 0xCA6F, 0x8542, 0xCA70, 0x8544, 0xCA71, 0x8545, 0xCA72, 0x8546, + 0xCA73, 0x8547, 0xCA74, 0x854B, 0xCA75, 0x854C, 0xCA76, 0x854D, + 0xCA77, 0x854E, 0xCA78, 0x854F, 0xCA79, 0x8550, 0xCA7A, 0x8551, + 0xCA7B, 0x8552, 0xCA7C, 0x8553, 0xCA7D, 0x8554, 0xCA7E, 0x8555, + 0xCA80, 0x8557, 0xCA81, 0x8558, 0xCA82, 0x855A, 0xCA83, 0x855B, + 0xCA84, 0x855C, 0xCA85, 0x855D, 0xCA86, 0x855F, 0xCA87, 0x8560, + 0xCA88, 0x8561, 0xCA89, 0x8562, 0xCA8A, 0x8563, 0xCA8B, 0x8565, + 0xCA8C, 0x8566, 0xCA8D, 0x8567, 0xCA8E, 0x8569, 0xCA8F, 0x856A, + 0xCA90, 0x856B, 0xCA91, 0x856C, 0xCA92, 0x856D, 0xCA93, 0x856E, + 0xCA94, 0x856F, 0xCA95, 0x8570, 0xCA96, 0x8571, 0xCA97, 0x8573, + 0xCA98, 0x8575, 0xCA99, 0x8576, 0xCA9A, 0x8577, 0xCA9B, 0x8578, + 0xCA9C, 0x857C, 0xCA9D, 0x857D, 0xCA9E, 0x857F, 0xCA9F, 0x8580, + 0xCAA0, 0x8581, 0xCAA1, 0x7701, 0xCAA2, 0x76DB, 0xCAA3, 0x5269, + 0xCAA4, 0x80DC, 0xCAA5, 0x5723, 0xCAA6, 0x5E08, 0xCAA7, 0x5931, + 0xCAA8, 0x72EE, 0xCAA9, 0x65BD, 0xCAAA, 0x6E7F, 0xCAAB, 0x8BD7, + 0xCAAC, 0x5C38, 0xCAAD, 0x8671, 0xCAAE, 0x5341, 0xCAAF, 0x77F3, + 0xCAB0, 0x62FE, 0xCAB1, 0x65F6, 0xCAB2, 0x4EC0, 0xCAB3, 0x98DF, + 0xCAB4, 0x8680, 0xCAB5, 0x5B9E, 0xCAB6, 0x8BC6, 0xCAB7, 0x53F2, + 0xCAB8, 0x77E2, 0xCAB9, 0x4F7F, 0xCABA, 0x5C4E, 0xCABB, 0x9A76, + 0xCABC, 0x59CB, 0xCABD, 0x5F0F, 0xCABE, 0x793A, 0xCABF, 0x58EB, + 0xCAC0, 0x4E16, 0xCAC1, 0x67FF, 0xCAC2, 0x4E8B, 0xCAC3, 0x62ED, + 0xCAC4, 0x8A93, 0xCAC5, 0x901D, 0xCAC6, 0x52BF, 0xCAC7, 0x662F, + 0xCAC8, 0x55DC, 0xCAC9, 0x566C, 0xCACA, 0x9002, 0xCACB, 0x4ED5, + 0xCACC, 0x4F8D, 0xCACD, 0x91CA, 0xCACE, 0x9970, 0xCACF, 0x6C0F, + 0xCAD0, 0x5E02, 0xCAD1, 0x6043, 0xCAD2, 0x5BA4, 0xCAD3, 0x89C6, + 0xCAD4, 0x8BD5, 0xCAD5, 0x6536, 0xCAD6, 0x624B, 0xCAD7, 0x9996, + 0xCAD8, 0x5B88, 0xCAD9, 0x5BFF, 0xCADA, 0x6388, 0xCADB, 0x552E, + 0xCADC, 0x53D7, 0xCADD, 0x7626, 0xCADE, 0x517D, 0xCADF, 0x852C, + 0xCAE0, 0x67A2, 0xCAE1, 0x68B3, 0xCAE2, 0x6B8A, 0xCAE3, 0x6292, + 0xCAE4, 0x8F93, 0xCAE5, 0x53D4, 0xCAE6, 0x8212, 0xCAE7, 0x6DD1, + 0xCAE8, 0x758F, 0xCAE9, 0x4E66, 0xCAEA, 0x8D4E, 0xCAEB, 0x5B70, + 0xCAEC, 0x719F, 0xCAED, 0x85AF, 0xCAEE, 0x6691, 0xCAEF, 0x66D9, + 0xCAF0, 0x7F72, 0xCAF1, 0x8700, 0xCAF2, 0x9ECD, 0xCAF3, 0x9F20, + 0xCAF4, 0x5C5E, 0xCAF5, 0x672F, 0xCAF6, 0x8FF0, 0xCAF7, 0x6811, + 0xCAF8, 0x675F, 0xCAF9, 0x620D, 0xCAFA, 0x7AD6, 0xCAFB, 0x5885, + 0xCAFC, 0x5EB6, 0xCAFD, 0x6570, 0xCAFE, 0x6F31, 0xCB40, 0x8582, + 0xCB41, 0x8583, 0xCB42, 0x8586, 0xCB43, 0x8588, 0xCB44, 0x8589, + 0xCB45, 0x858A, 0xCB46, 0x858B, 0xCB47, 0x858C, 0xCB48, 0x858D, + 0xCB49, 0x858E, 0xCB4A, 0x8590, 0xCB4B, 0x8591, 0xCB4C, 0x8592, + 0xCB4D, 0x8593, 0xCB4E, 0x8594, 0xCB4F, 0x8595, 0xCB50, 0x8596, + 0xCB51, 0x8597, 0xCB52, 0x8598, 0xCB53, 0x8599, 0xCB54, 0x859A, + 0xCB55, 0x859D, 0xCB56, 0x859E, 0xCB57, 0x859F, 0xCB58, 0x85A0, + 0xCB59, 0x85A1, 0xCB5A, 0x85A2, 0xCB5B, 0x85A3, 0xCB5C, 0x85A5, + 0xCB5D, 0x85A6, 0xCB5E, 0x85A7, 0xCB5F, 0x85A9, 0xCB60, 0x85AB, + 0xCB61, 0x85AC, 0xCB62, 0x85AD, 0xCB63, 0x85B1, 0xCB64, 0x85B2, + 0xCB65, 0x85B3, 0xCB66, 0x85B4, 0xCB67, 0x85B5, 0xCB68, 0x85B6, + 0xCB69, 0x85B8, 0xCB6A, 0x85BA, 0xCB6B, 0x85BB, 0xCB6C, 0x85BC, + 0xCB6D, 0x85BD, 0xCB6E, 0x85BE, 0xCB6F, 0x85BF, 0xCB70, 0x85C0, + 0xCB71, 0x85C2, 0xCB72, 0x85C3, 0xCB73, 0x85C4, 0xCB74, 0x85C5, + 0xCB75, 0x85C6, 0xCB76, 0x85C7, 0xCB77, 0x85C8, 0xCB78, 0x85CA, + 0xCB79, 0x85CB, 0xCB7A, 0x85CC, 0xCB7B, 0x85CD, 0xCB7C, 0x85CE, + 0xCB7D, 0x85D1, 0xCB7E, 0x85D2, 0xCB80, 0x85D4, 0xCB81, 0x85D6, + 0xCB82, 0x85D7, 0xCB83, 0x85D8, 0xCB84, 0x85D9, 0xCB85, 0x85DA, + 0xCB86, 0x85DB, 0xCB87, 0x85DD, 0xCB88, 0x85DE, 0xCB89, 0x85DF, + 0xCB8A, 0x85E0, 0xCB8B, 0x85E1, 0xCB8C, 0x85E2, 0xCB8D, 0x85E3, + 0xCB8E, 0x85E5, 0xCB8F, 0x85E6, 0xCB90, 0x85E7, 0xCB91, 0x85E8, + 0xCB92, 0x85EA, 0xCB93, 0x85EB, 0xCB94, 0x85EC, 0xCB95, 0x85ED, + 0xCB96, 0x85EE, 0xCB97, 0x85EF, 0xCB98, 0x85F0, 0xCB99, 0x85F1, + 0xCB9A, 0x85F2, 0xCB9B, 0x85F3, 0xCB9C, 0x85F4, 0xCB9D, 0x85F5, + 0xCB9E, 0x85F6, 0xCB9F, 0x85F7, 0xCBA0, 0x85F8, 0xCBA1, 0x6055, + 0xCBA2, 0x5237, 0xCBA3, 0x800D, 0xCBA4, 0x6454, 0xCBA5, 0x8870, + 0xCBA6, 0x7529, 0xCBA7, 0x5E05, 0xCBA8, 0x6813, 0xCBA9, 0x62F4, + 0xCBAA, 0x971C, 0xCBAB, 0x53CC, 0xCBAC, 0x723D, 0xCBAD, 0x8C01, + 0xCBAE, 0x6C34, 0xCBAF, 0x7761, 0xCBB0, 0x7A0E, 0xCBB1, 0x542E, + 0xCBB2, 0x77AC, 0xCBB3, 0x987A, 0xCBB4, 0x821C, 0xCBB5, 0x8BF4, + 0xCBB6, 0x7855, 0xCBB7, 0x6714, 0xCBB8, 0x70C1, 0xCBB9, 0x65AF, + 0xCBBA, 0x6495, 0xCBBB, 0x5636, 0xCBBC, 0x601D, 0xCBBD, 0x79C1, + 0xCBBE, 0x53F8, 0xCBBF, 0x4E1D, 0xCBC0, 0x6B7B, 0xCBC1, 0x8086, + 0xCBC2, 0x5BFA, 0xCBC3, 0x55E3, 0xCBC4, 0x56DB, 0xCBC5, 0x4F3A, + 0xCBC6, 0x4F3C, 0xCBC7, 0x9972, 0xCBC8, 0x5DF3, 0xCBC9, 0x677E, + 0xCBCA, 0x8038, 0xCBCB, 0x6002, 0xCBCC, 0x9882, 0xCBCD, 0x9001, + 0xCBCE, 0x5B8B, 0xCBCF, 0x8BBC, 0xCBD0, 0x8BF5, 0xCBD1, 0x641C, + 0xCBD2, 0x8258, 0xCBD3, 0x64DE, 0xCBD4, 0x55FD, 0xCBD5, 0x82CF, + 0xCBD6, 0x9165, 0xCBD7, 0x4FD7, 0xCBD8, 0x7D20, 0xCBD9, 0x901F, + 0xCBDA, 0x7C9F, 0xCBDB, 0x50F3, 0xCBDC, 0x5851, 0xCBDD, 0x6EAF, + 0xCBDE, 0x5BBF, 0xCBDF, 0x8BC9, 0xCBE0, 0x8083, 0xCBE1, 0x9178, + 0xCBE2, 0x849C, 0xCBE3, 0x7B97, 0xCBE4, 0x867D, 0xCBE5, 0x968B, + 0xCBE6, 0x968F, 0xCBE7, 0x7EE5, 0xCBE8, 0x9AD3, 0xCBE9, 0x788E, + 0xCBEA, 0x5C81, 0xCBEB, 0x7A57, 0xCBEC, 0x9042, 0xCBED, 0x96A7, + 0xCBEE, 0x795F, 0xCBEF, 0x5B59, 0xCBF0, 0x635F, 0xCBF1, 0x7B0B, + 0xCBF2, 0x84D1, 0xCBF3, 0x68AD, 0xCBF4, 0x5506, 0xCBF5, 0x7F29, + 0xCBF6, 0x7410, 0xCBF7, 0x7D22, 0xCBF8, 0x9501, 0xCBF9, 0x6240, + 0xCBFA, 0x584C, 0xCBFB, 0x4ED6, 0xCBFC, 0x5B83, 0xCBFD, 0x5979, + 0xCBFE, 0x5854, 0xCC40, 0x85F9, 0xCC41, 0x85FA, 0xCC42, 0x85FC, + 0xCC43, 0x85FD, 0xCC44, 0x85FE, 0xCC45, 0x8600, 0xCC46, 0x8601, + 0xCC47, 0x8602, 0xCC48, 0x8603, 0xCC49, 0x8604, 0xCC4A, 0x8606, + 0xCC4B, 0x8607, 0xCC4C, 0x8608, 0xCC4D, 0x8609, 0xCC4E, 0x860A, + 0xCC4F, 0x860B, 0xCC50, 0x860C, 0xCC51, 0x860D, 0xCC52, 0x860E, + 0xCC53, 0x860F, 0xCC54, 0x8610, 0xCC55, 0x8612, 0xCC56, 0x8613, + 0xCC57, 0x8614, 0xCC58, 0x8615, 0xCC59, 0x8617, 0xCC5A, 0x8618, + 0xCC5B, 0x8619, 0xCC5C, 0x861A, 0xCC5D, 0x861B, 0xCC5E, 0x861C, + 0xCC5F, 0x861D, 0xCC60, 0x861E, 0xCC61, 0x861F, 0xCC62, 0x8620, + 0xCC63, 0x8621, 0xCC64, 0x8622, 0xCC65, 0x8623, 0xCC66, 0x8624, + 0xCC67, 0x8625, 0xCC68, 0x8626, 0xCC69, 0x8628, 0xCC6A, 0x862A, + 0xCC6B, 0x862B, 0xCC6C, 0x862C, 0xCC6D, 0x862D, 0xCC6E, 0x862E, + 0xCC6F, 0x862F, 0xCC70, 0x8630, 0xCC71, 0x8631, 0xCC72, 0x8632, + 0xCC73, 0x8633, 0xCC74, 0x8634, 0xCC75, 0x8635, 0xCC76, 0x8636, + 0xCC77, 0x8637, 0xCC78, 0x8639, 0xCC79, 0x863A, 0xCC7A, 0x863B, + 0xCC7B, 0x863D, 0xCC7C, 0x863E, 0xCC7D, 0x863F, 0xCC7E, 0x8640, + 0xCC80, 0x8641, 0xCC81, 0x8642, 0xCC82, 0x8643, 0xCC83, 0x8644, + 0xCC84, 0x8645, 0xCC85, 0x8646, 0xCC86, 0x8647, 0xCC87, 0x8648, + 0xCC88, 0x8649, 0xCC89, 0x864A, 0xCC8A, 0x864B, 0xCC8B, 0x864C, + 0xCC8C, 0x8652, 0xCC8D, 0x8653, 0xCC8E, 0x8655, 0xCC8F, 0x8656, + 0xCC90, 0x8657, 0xCC91, 0x8658, 0xCC92, 0x8659, 0xCC93, 0x865B, + 0xCC94, 0x865C, 0xCC95, 0x865D, 0xCC96, 0x865F, 0xCC97, 0x8660, + 0xCC98, 0x8661, 0xCC99, 0x8663, 0xCC9A, 0x8664, 0xCC9B, 0x8665, + 0xCC9C, 0x8666, 0xCC9D, 0x8667, 0xCC9E, 0x8668, 0xCC9F, 0x8669, + 0xCCA0, 0x866A, 0xCCA1, 0x736D, 0xCCA2, 0x631E, 0xCCA3, 0x8E4B, + 0xCCA4, 0x8E0F, 0xCCA5, 0x80CE, 0xCCA6, 0x82D4, 0xCCA7, 0x62AC, + 0xCCA8, 0x53F0, 0xCCA9, 0x6CF0, 0xCCAA, 0x915E, 0xCCAB, 0x592A, + 0xCCAC, 0x6001, 0xCCAD, 0x6C70, 0xCCAE, 0x574D, 0xCCAF, 0x644A, + 0xCCB0, 0x8D2A, 0xCCB1, 0x762B, 0xCCB2, 0x6EE9, 0xCCB3, 0x575B, + 0xCCB4, 0x6A80, 0xCCB5, 0x75F0, 0xCCB6, 0x6F6D, 0xCCB7, 0x8C2D, + 0xCCB8, 0x8C08, 0xCCB9, 0x5766, 0xCCBA, 0x6BEF, 0xCCBB, 0x8892, + 0xCCBC, 0x78B3, 0xCCBD, 0x63A2, 0xCCBE, 0x53F9, 0xCCBF, 0x70AD, + 0xCCC0, 0x6C64, 0xCCC1, 0x5858, 0xCCC2, 0x642A, 0xCCC3, 0x5802, + 0xCCC4, 0x68E0, 0xCCC5, 0x819B, 0xCCC6, 0x5510, 0xCCC7, 0x7CD6, + 0xCCC8, 0x5018, 0xCCC9, 0x8EBA, 0xCCCA, 0x6DCC, 0xCCCB, 0x8D9F, + 0xCCCC, 0x70EB, 0xCCCD, 0x638F, 0xCCCE, 0x6D9B, 0xCCCF, 0x6ED4, + 0xCCD0, 0x7EE6, 0xCCD1, 0x8404, 0xCCD2, 0x6843, 0xCCD3, 0x9003, + 0xCCD4, 0x6DD8, 0xCCD5, 0x9676, 0xCCD6, 0x8BA8, 0xCCD7, 0x5957, + 0xCCD8, 0x7279, 0xCCD9, 0x85E4, 0xCCDA, 0x817E, 0xCCDB, 0x75BC, + 0xCCDC, 0x8A8A, 0xCCDD, 0x68AF, 0xCCDE, 0x5254, 0xCCDF, 0x8E22, + 0xCCE0, 0x9511, 0xCCE1, 0x63D0, 0xCCE2, 0x9898, 0xCCE3, 0x8E44, + 0xCCE4, 0x557C, 0xCCE5, 0x4F53, 0xCCE6, 0x66FF, 0xCCE7, 0x568F, + 0xCCE8, 0x60D5, 0xCCE9, 0x6D95, 0xCCEA, 0x5243, 0xCCEB, 0x5C49, + 0xCCEC, 0x5929, 0xCCED, 0x6DFB, 0xCCEE, 0x586B, 0xCCEF, 0x7530, + 0xCCF0, 0x751C, 0xCCF1, 0x606C, 0xCCF2, 0x8214, 0xCCF3, 0x8146, + 0xCCF4, 0x6311, 0xCCF5, 0x6761, 0xCCF6, 0x8FE2, 0xCCF7, 0x773A, + 0xCCF8, 0x8DF3, 0xCCF9, 0x8D34, 0xCCFA, 0x94C1, 0xCCFB, 0x5E16, + 0xCCFC, 0x5385, 0xCCFD, 0x542C, 0xCCFE, 0x70C3, 0xCD40, 0x866D, + 0xCD41, 0x866F, 0xCD42, 0x8670, 0xCD43, 0x8672, 0xCD44, 0x8673, + 0xCD45, 0x8674, 0xCD46, 0x8675, 0xCD47, 0x8676, 0xCD48, 0x8677, + 0xCD49, 0x8678, 0xCD4A, 0x8683, 0xCD4B, 0x8684, 0xCD4C, 0x8685, + 0xCD4D, 0x8686, 0xCD4E, 0x8687, 0xCD4F, 0x8688, 0xCD50, 0x8689, + 0xCD51, 0x868E, 0xCD52, 0x868F, 0xCD53, 0x8690, 0xCD54, 0x8691, + 0xCD55, 0x8692, 0xCD56, 0x8694, 0xCD57, 0x8696, 0xCD58, 0x8697, + 0xCD59, 0x8698, 0xCD5A, 0x8699, 0xCD5B, 0x869A, 0xCD5C, 0x869B, + 0xCD5D, 0x869E, 0xCD5E, 0x869F, 0xCD5F, 0x86A0, 0xCD60, 0x86A1, + 0xCD61, 0x86A2, 0xCD62, 0x86A5, 0xCD63, 0x86A6, 0xCD64, 0x86AB, + 0xCD65, 0x86AD, 0xCD66, 0x86AE, 0xCD67, 0x86B2, 0xCD68, 0x86B3, + 0xCD69, 0x86B7, 0xCD6A, 0x86B8, 0xCD6B, 0x86B9, 0xCD6C, 0x86BB, + 0xCD6D, 0x86BC, 0xCD6E, 0x86BD, 0xCD6F, 0x86BE, 0xCD70, 0x86BF, + 0xCD71, 0x86C1, 0xCD72, 0x86C2, 0xCD73, 0x86C3, 0xCD74, 0x86C5, + 0xCD75, 0x86C8, 0xCD76, 0x86CC, 0xCD77, 0x86CD, 0xCD78, 0x86D2, + 0xCD79, 0x86D3, 0xCD7A, 0x86D5, 0xCD7B, 0x86D6, 0xCD7C, 0x86D7, + 0xCD7D, 0x86DA, 0xCD7E, 0x86DC, 0xCD80, 0x86DD, 0xCD81, 0x86E0, + 0xCD82, 0x86E1, 0xCD83, 0x86E2, 0xCD84, 0x86E3, 0xCD85, 0x86E5, + 0xCD86, 0x86E6, 0xCD87, 0x86E7, 0xCD88, 0x86E8, 0xCD89, 0x86EA, + 0xCD8A, 0x86EB, 0xCD8B, 0x86EC, 0xCD8C, 0x86EF, 0xCD8D, 0x86F5, + 0xCD8E, 0x86F6, 0xCD8F, 0x86F7, 0xCD90, 0x86FA, 0xCD91, 0x86FB, + 0xCD92, 0x86FC, 0xCD93, 0x86FD, 0xCD94, 0x86FF, 0xCD95, 0x8701, + 0xCD96, 0x8704, 0xCD97, 0x8705, 0xCD98, 0x8706, 0xCD99, 0x870B, + 0xCD9A, 0x870C, 0xCD9B, 0x870E, 0xCD9C, 0x870F, 0xCD9D, 0x8710, + 0xCD9E, 0x8711, 0xCD9F, 0x8714, 0xCDA0, 0x8716, 0xCDA1, 0x6C40, + 0xCDA2, 0x5EF7, 0xCDA3, 0x505C, 0xCDA4, 0x4EAD, 0xCDA5, 0x5EAD, + 0xCDA6, 0x633A, 0xCDA7, 0x8247, 0xCDA8, 0x901A, 0xCDA9, 0x6850, + 0xCDAA, 0x916E, 0xCDAB, 0x77B3, 0xCDAC, 0x540C, 0xCDAD, 0x94DC, + 0xCDAE, 0x5F64, 0xCDAF, 0x7AE5, 0xCDB0, 0x6876, 0xCDB1, 0x6345, + 0xCDB2, 0x7B52, 0xCDB3, 0x7EDF, 0xCDB4, 0x75DB, 0xCDB5, 0x5077, + 0xCDB6, 0x6295, 0xCDB7, 0x5934, 0xCDB8, 0x900F, 0xCDB9, 0x51F8, + 0xCDBA, 0x79C3, 0xCDBB, 0x7A81, 0xCDBC, 0x56FE, 0xCDBD, 0x5F92, + 0xCDBE, 0x9014, 0xCDBF, 0x6D82, 0xCDC0, 0x5C60, 0xCDC1, 0x571F, + 0xCDC2, 0x5410, 0xCDC3, 0x5154, 0xCDC4, 0x6E4D, 0xCDC5, 0x56E2, + 0xCDC6, 0x63A8, 0xCDC7, 0x9893, 0xCDC8, 0x817F, 0xCDC9, 0x8715, + 0xCDCA, 0x892A, 0xCDCB, 0x9000, 0xCDCC, 0x541E, 0xCDCD, 0x5C6F, + 0xCDCE, 0x81C0, 0xCDCF, 0x62D6, 0xCDD0, 0x6258, 0xCDD1, 0x8131, + 0xCDD2, 0x9E35, 0xCDD3, 0x9640, 0xCDD4, 0x9A6E, 0xCDD5, 0x9A7C, + 0xCDD6, 0x692D, 0xCDD7, 0x59A5, 0xCDD8, 0x62D3, 0xCDD9, 0x553E, + 0xCDDA, 0x6316, 0xCDDB, 0x54C7, 0xCDDC, 0x86D9, 0xCDDD, 0x6D3C, + 0xCDDE, 0x5A03, 0xCDDF, 0x74E6, 0xCDE0, 0x889C, 0xCDE1, 0x6B6A, + 0xCDE2, 0x5916, 0xCDE3, 0x8C4C, 0xCDE4, 0x5F2F, 0xCDE5, 0x6E7E, + 0xCDE6, 0x73A9, 0xCDE7, 0x987D, 0xCDE8, 0x4E38, 0xCDE9, 0x70F7, + 0xCDEA, 0x5B8C, 0xCDEB, 0x7897, 0xCDEC, 0x633D, 0xCDED, 0x665A, + 0xCDEE, 0x7696, 0xCDEF, 0x60CB, 0xCDF0, 0x5B9B, 0xCDF1, 0x5A49, + 0xCDF2, 0x4E07, 0xCDF3, 0x8155, 0xCDF4, 0x6C6A, 0xCDF5, 0x738B, + 0xCDF6, 0x4EA1, 0xCDF7, 0x6789, 0xCDF8, 0x7F51, 0xCDF9, 0x5F80, + 0xCDFA, 0x65FA, 0xCDFB, 0x671B, 0xCDFC, 0x5FD8, 0xCDFD, 0x5984, + 0xCDFE, 0x5A01, 0xCE40, 0x8719, 0xCE41, 0x871B, 0xCE42, 0x871D, + 0xCE43, 0x871F, 0xCE44, 0x8720, 0xCE45, 0x8724, 0xCE46, 0x8726, + 0xCE47, 0x8727, 0xCE48, 0x8728, 0xCE49, 0x872A, 0xCE4A, 0x872B, + 0xCE4B, 0x872C, 0xCE4C, 0x872D, 0xCE4D, 0x872F, 0xCE4E, 0x8730, + 0xCE4F, 0x8732, 0xCE50, 0x8733, 0xCE51, 0x8735, 0xCE52, 0x8736, + 0xCE53, 0x8738, 0xCE54, 0x8739, 0xCE55, 0x873A, 0xCE56, 0x873C, + 0xCE57, 0x873D, 0xCE58, 0x8740, 0xCE59, 0x8741, 0xCE5A, 0x8742, + 0xCE5B, 0x8743, 0xCE5C, 0x8744, 0xCE5D, 0x8745, 0xCE5E, 0x8746, + 0xCE5F, 0x874A, 0xCE60, 0x874B, 0xCE61, 0x874D, 0xCE62, 0x874F, + 0xCE63, 0x8750, 0xCE64, 0x8751, 0xCE65, 0x8752, 0xCE66, 0x8754, + 0xCE67, 0x8755, 0xCE68, 0x8756, 0xCE69, 0x8758, 0xCE6A, 0x875A, + 0xCE6B, 0x875B, 0xCE6C, 0x875C, 0xCE6D, 0x875D, 0xCE6E, 0x875E, + 0xCE6F, 0x875F, 0xCE70, 0x8761, 0xCE71, 0x8762, 0xCE72, 0x8766, + 0xCE73, 0x8767, 0xCE74, 0x8768, 0xCE75, 0x8769, 0xCE76, 0x876A, + 0xCE77, 0x876B, 0xCE78, 0x876C, 0xCE79, 0x876D, 0xCE7A, 0x876F, + 0xCE7B, 0x8771, 0xCE7C, 0x8772, 0xCE7D, 0x8773, 0xCE7E, 0x8775, + 0xCE80, 0x8777, 0xCE81, 0x8778, 0xCE82, 0x8779, 0xCE83, 0x877A, + 0xCE84, 0x877F, 0xCE85, 0x8780, 0xCE86, 0x8781, 0xCE87, 0x8784, + 0xCE88, 0x8786, 0xCE89, 0x8787, 0xCE8A, 0x8789, 0xCE8B, 0x878A, + 0xCE8C, 0x878C, 0xCE8D, 0x878E, 0xCE8E, 0x878F, 0xCE8F, 0x8790, + 0xCE90, 0x8791, 0xCE91, 0x8792, 0xCE92, 0x8794, 0xCE93, 0x8795, + 0xCE94, 0x8796, 0xCE95, 0x8798, 0xCE96, 0x8799, 0xCE97, 0x879A, + 0xCE98, 0x879B, 0xCE99, 0x879C, 0xCE9A, 0x879D, 0xCE9B, 0x879E, + 0xCE9C, 0x87A0, 0xCE9D, 0x87A1, 0xCE9E, 0x87A2, 0xCE9F, 0x87A3, + 0xCEA0, 0x87A4, 0xCEA1, 0x5DCD, 0xCEA2, 0x5FAE, 0xCEA3, 0x5371, + 0xCEA4, 0x97E6, 0xCEA5, 0x8FDD, 0xCEA6, 0x6845, 0xCEA7, 0x56F4, + 0xCEA8, 0x552F, 0xCEA9, 0x60DF, 0xCEAA, 0x4E3A, 0xCEAB, 0x6F4D, + 0xCEAC, 0x7EF4, 0xCEAD, 0x82C7, 0xCEAE, 0x840E, 0xCEAF, 0x59D4, + 0xCEB0, 0x4F1F, 0xCEB1, 0x4F2A, 0xCEB2, 0x5C3E, 0xCEB3, 0x7EAC, + 0xCEB4, 0x672A, 0xCEB5, 0x851A, 0xCEB6, 0x5473, 0xCEB7, 0x754F, + 0xCEB8, 0x80C3, 0xCEB9, 0x5582, 0xCEBA, 0x9B4F, 0xCEBB, 0x4F4D, + 0xCEBC, 0x6E2D, 0xCEBD, 0x8C13, 0xCEBE, 0x5C09, 0xCEBF, 0x6170, + 0xCEC0, 0x536B, 0xCEC1, 0x761F, 0xCEC2, 0x6E29, 0xCEC3, 0x868A, + 0xCEC4, 0x6587, 0xCEC5, 0x95FB, 0xCEC6, 0x7EB9, 0xCEC7, 0x543B, + 0xCEC8, 0x7A33, 0xCEC9, 0x7D0A, 0xCECA, 0x95EE, 0xCECB, 0x55E1, + 0xCECC, 0x7FC1, 0xCECD, 0x74EE, 0xCECE, 0x631D, 0xCECF, 0x8717, + 0xCED0, 0x6DA1, 0xCED1, 0x7A9D, 0xCED2, 0x6211, 0xCED3, 0x65A1, + 0xCED4, 0x5367, 0xCED5, 0x63E1, 0xCED6, 0x6C83, 0xCED7, 0x5DEB, + 0xCED8, 0x545C, 0xCED9, 0x94A8, 0xCEDA, 0x4E4C, 0xCEDB, 0x6C61, + 0xCEDC, 0x8BEC, 0xCEDD, 0x5C4B, 0xCEDE, 0x65E0, 0xCEDF, 0x829C, + 0xCEE0, 0x68A7, 0xCEE1, 0x543E, 0xCEE2, 0x5434, 0xCEE3, 0x6BCB, + 0xCEE4, 0x6B66, 0xCEE5, 0x4E94, 0xCEE6, 0x6342, 0xCEE7, 0x5348, + 0xCEE8, 0x821E, 0xCEE9, 0x4F0D, 0xCEEA, 0x4FAE, 0xCEEB, 0x575E, + 0xCEEC, 0x620A, 0xCEED, 0x96FE, 0xCEEE, 0x6664, 0xCEEF, 0x7269, + 0xCEF0, 0x52FF, 0xCEF1, 0x52A1, 0xCEF2, 0x609F, 0xCEF3, 0x8BEF, + 0xCEF4, 0x6614, 0xCEF5, 0x7199, 0xCEF6, 0x6790, 0xCEF7, 0x897F, + 0xCEF8, 0x7852, 0xCEF9, 0x77FD, 0xCEFA, 0x6670, 0xCEFB, 0x563B, + 0xCEFC, 0x5438, 0xCEFD, 0x9521, 0xCEFE, 0x727A, 0xCF40, 0x87A5, + 0xCF41, 0x87A6, 0xCF42, 0x87A7, 0xCF43, 0x87A9, 0xCF44, 0x87AA, + 0xCF45, 0x87AE, 0xCF46, 0x87B0, 0xCF47, 0x87B1, 0xCF48, 0x87B2, + 0xCF49, 0x87B4, 0xCF4A, 0x87B6, 0xCF4B, 0x87B7, 0xCF4C, 0x87B8, + 0xCF4D, 0x87B9, 0xCF4E, 0x87BB, 0xCF4F, 0x87BC, 0xCF50, 0x87BE, + 0xCF51, 0x87BF, 0xCF52, 0x87C1, 0xCF53, 0x87C2, 0xCF54, 0x87C3, + 0xCF55, 0x87C4, 0xCF56, 0x87C5, 0xCF57, 0x87C7, 0xCF58, 0x87C8, + 0xCF59, 0x87C9, 0xCF5A, 0x87CC, 0xCF5B, 0x87CD, 0xCF5C, 0x87CE, + 0xCF5D, 0x87CF, 0xCF5E, 0x87D0, 0xCF5F, 0x87D4, 0xCF60, 0x87D5, + 0xCF61, 0x87D6, 0xCF62, 0x87D7, 0xCF63, 0x87D8, 0xCF64, 0x87D9, + 0xCF65, 0x87DA, 0xCF66, 0x87DC, 0xCF67, 0x87DD, 0xCF68, 0x87DE, + 0xCF69, 0x87DF, 0xCF6A, 0x87E1, 0xCF6B, 0x87E2, 0xCF6C, 0x87E3, + 0xCF6D, 0x87E4, 0xCF6E, 0x87E6, 0xCF6F, 0x87E7, 0xCF70, 0x87E8, + 0xCF71, 0x87E9, 0xCF72, 0x87EB, 0xCF73, 0x87EC, 0xCF74, 0x87ED, + 0xCF75, 0x87EF, 0xCF76, 0x87F0, 0xCF77, 0x87F1, 0xCF78, 0x87F2, + 0xCF79, 0x87F3, 0xCF7A, 0x87F4, 0xCF7B, 0x87F5, 0xCF7C, 0x87F6, + 0xCF7D, 0x87F7, 0xCF7E, 0x87F8, 0xCF80, 0x87FA, 0xCF81, 0x87FB, + 0xCF82, 0x87FC, 0xCF83, 0x87FD, 0xCF84, 0x87FF, 0xCF85, 0x8800, + 0xCF86, 0x8801, 0xCF87, 0x8802, 0xCF88, 0x8804, 0xCF89, 0x8805, + 0xCF8A, 0x8806, 0xCF8B, 0x8807, 0xCF8C, 0x8808, 0xCF8D, 0x8809, + 0xCF8E, 0x880B, 0xCF8F, 0x880C, 0xCF90, 0x880D, 0xCF91, 0x880E, + 0xCF92, 0x880F, 0xCF93, 0x8810, 0xCF94, 0x8811, 0xCF95, 0x8812, + 0xCF96, 0x8814, 0xCF97, 0x8817, 0xCF98, 0x8818, 0xCF99, 0x8819, + 0xCF9A, 0x881A, 0xCF9B, 0x881C, 0xCF9C, 0x881D, 0xCF9D, 0x881E, + 0xCF9E, 0x881F, 0xCF9F, 0x8820, 0xCFA0, 0x8823, 0xCFA1, 0x7A00, + 0xCFA2, 0x606F, 0xCFA3, 0x5E0C, 0xCFA4, 0x6089, 0xCFA5, 0x819D, + 0xCFA6, 0x5915, 0xCFA7, 0x60DC, 0xCFA8, 0x7184, 0xCFA9, 0x70EF, + 0xCFAA, 0x6EAA, 0xCFAB, 0x6C50, 0xCFAC, 0x7280, 0xCFAD, 0x6A84, + 0xCFAE, 0x88AD, 0xCFAF, 0x5E2D, 0xCFB0, 0x4E60, 0xCFB1, 0x5AB3, + 0xCFB2, 0x559C, 0xCFB3, 0x94E3, 0xCFB4, 0x6D17, 0xCFB5, 0x7CFB, + 0xCFB6, 0x9699, 0xCFB7, 0x620F, 0xCFB8, 0x7EC6, 0xCFB9, 0x778E, + 0xCFBA, 0x867E, 0xCFBB, 0x5323, 0xCFBC, 0x971E, 0xCFBD, 0x8F96, + 0xCFBE, 0x6687, 0xCFBF, 0x5CE1, 0xCFC0, 0x4FA0, 0xCFC1, 0x72ED, + 0xCFC2, 0x4E0B, 0xCFC3, 0x53A6, 0xCFC4, 0x590F, 0xCFC5, 0x5413, + 0xCFC6, 0x6380, 0xCFC7, 0x9528, 0xCFC8, 0x5148, 0xCFC9, 0x4ED9, + 0xCFCA, 0x9C9C, 0xCFCB, 0x7EA4, 0xCFCC, 0x54B8, 0xCFCD, 0x8D24, + 0xCFCE, 0x8854, 0xCFCF, 0x8237, 0xCFD0, 0x95F2, 0xCFD1, 0x6D8E, + 0xCFD2, 0x5F26, 0xCFD3, 0x5ACC, 0xCFD4, 0x663E, 0xCFD5, 0x9669, + 0xCFD6, 0x73B0, 0xCFD7, 0x732E, 0xCFD8, 0x53BF, 0xCFD9, 0x817A, + 0xCFDA, 0x9985, 0xCFDB, 0x7FA1, 0xCFDC, 0x5BAA, 0xCFDD, 0x9677, + 0xCFDE, 0x9650, 0xCFDF, 0x7EBF, 0xCFE0, 0x76F8, 0xCFE1, 0x53A2, + 0xCFE2, 0x9576, 0xCFE3, 0x9999, 0xCFE4, 0x7BB1, 0xCFE5, 0x8944, + 0xCFE6, 0x6E58, 0xCFE7, 0x4E61, 0xCFE8, 0x7FD4, 0xCFE9, 0x7965, + 0xCFEA, 0x8BE6, 0xCFEB, 0x60F3, 0xCFEC, 0x54CD, 0xCFED, 0x4EAB, + 0xCFEE, 0x9879, 0xCFEF, 0x5DF7, 0xCFF0, 0x6A61, 0xCFF1, 0x50CF, + 0xCFF2, 0x5411, 0xCFF3, 0x8C61, 0xCFF4, 0x8427, 0xCFF5, 0x785D, + 0xCFF6, 0x9704, 0xCFF7, 0x524A, 0xCFF8, 0x54EE, 0xCFF9, 0x56A3, + 0xCFFA, 0x9500, 0xCFFB, 0x6D88, 0xCFFC, 0x5BB5, 0xCFFD, 0x6DC6, + 0xCFFE, 0x6653, 0xD040, 0x8824, 0xD041, 0x8825, 0xD042, 0x8826, + 0xD043, 0x8827, 0xD044, 0x8828, 0xD045, 0x8829, 0xD046, 0x882A, + 0xD047, 0x882B, 0xD048, 0x882C, 0xD049, 0x882D, 0xD04A, 0x882E, + 0xD04B, 0x882F, 0xD04C, 0x8830, 0xD04D, 0x8831, 0xD04E, 0x8833, + 0xD04F, 0x8834, 0xD050, 0x8835, 0xD051, 0x8836, 0xD052, 0x8837, + 0xD053, 0x8838, 0xD054, 0x883A, 0xD055, 0x883B, 0xD056, 0x883D, + 0xD057, 0x883E, 0xD058, 0x883F, 0xD059, 0x8841, 0xD05A, 0x8842, + 0xD05B, 0x8843, 0xD05C, 0x8846, 0xD05D, 0x8847, 0xD05E, 0x8848, + 0xD05F, 0x8849, 0xD060, 0x884A, 0xD061, 0x884B, 0xD062, 0x884E, + 0xD063, 0x884F, 0xD064, 0x8850, 0xD065, 0x8851, 0xD066, 0x8852, + 0xD067, 0x8853, 0xD068, 0x8855, 0xD069, 0x8856, 0xD06A, 0x8858, + 0xD06B, 0x885A, 0xD06C, 0x885B, 0xD06D, 0x885C, 0xD06E, 0x885D, + 0xD06F, 0x885E, 0xD070, 0x885F, 0xD071, 0x8860, 0xD072, 0x8866, + 0xD073, 0x8867, 0xD074, 0x886A, 0xD075, 0x886D, 0xD076, 0x886F, + 0xD077, 0x8871, 0xD078, 0x8873, 0xD079, 0x8874, 0xD07A, 0x8875, + 0xD07B, 0x8876, 0xD07C, 0x8878, 0xD07D, 0x8879, 0xD07E, 0x887A, + 0xD080, 0x887B, 0xD081, 0x887C, 0xD082, 0x8880, 0xD083, 0x8883, + 0xD084, 0x8886, 0xD085, 0x8887, 0xD086, 0x8889, 0xD087, 0x888A, + 0xD088, 0x888C, 0xD089, 0x888E, 0xD08A, 0x888F, 0xD08B, 0x8890, + 0xD08C, 0x8891, 0xD08D, 0x8893, 0xD08E, 0x8894, 0xD08F, 0x8895, + 0xD090, 0x8897, 0xD091, 0x8898, 0xD092, 0x8899, 0xD093, 0x889A, + 0xD094, 0x889B, 0xD095, 0x889D, 0xD096, 0x889E, 0xD097, 0x889F, + 0xD098, 0x88A0, 0xD099, 0x88A1, 0xD09A, 0x88A3, 0xD09B, 0x88A5, + 0xD09C, 0x88A6, 0xD09D, 0x88A7, 0xD09E, 0x88A8, 0xD09F, 0x88A9, + 0xD0A0, 0x88AA, 0xD0A1, 0x5C0F, 0xD0A2, 0x5B5D, 0xD0A3, 0x6821, + 0xD0A4, 0x8096, 0xD0A5, 0x5578, 0xD0A6, 0x7B11, 0xD0A7, 0x6548, + 0xD0A8, 0x6954, 0xD0A9, 0x4E9B, 0xD0AA, 0x6B47, 0xD0AB, 0x874E, + 0xD0AC, 0x978B, 0xD0AD, 0x534F, 0xD0AE, 0x631F, 0xD0AF, 0x643A, + 0xD0B0, 0x90AA, 0xD0B1, 0x659C, 0xD0B2, 0x80C1, 0xD0B3, 0x8C10, + 0xD0B4, 0x5199, 0xD0B5, 0x68B0, 0xD0B6, 0x5378, 0xD0B7, 0x87F9, + 0xD0B8, 0x61C8, 0xD0B9, 0x6CC4, 0xD0BA, 0x6CFB, 0xD0BB, 0x8C22, + 0xD0BC, 0x5C51, 0xD0BD, 0x85AA, 0xD0BE, 0x82AF, 0xD0BF, 0x950C, + 0xD0C0, 0x6B23, 0xD0C1, 0x8F9B, 0xD0C2, 0x65B0, 0xD0C3, 0x5FFB, + 0xD0C4, 0x5FC3, 0xD0C5, 0x4FE1, 0xD0C6, 0x8845, 0xD0C7, 0x661F, + 0xD0C8, 0x8165, 0xD0C9, 0x7329, 0xD0CA, 0x60FA, 0xD0CB, 0x5174, + 0xD0CC, 0x5211, 0xD0CD, 0x578B, 0xD0CE, 0x5F62, 0xD0CF, 0x90A2, + 0xD0D0, 0x884C, 0xD0D1, 0x9192, 0xD0D2, 0x5E78, 0xD0D3, 0x674F, + 0xD0D4, 0x6027, 0xD0D5, 0x59D3, 0xD0D6, 0x5144, 0xD0D7, 0x51F6, + 0xD0D8, 0x80F8, 0xD0D9, 0x5308, 0xD0DA, 0x6C79, 0xD0DB, 0x96C4, + 0xD0DC, 0x718A, 0xD0DD, 0x4F11, 0xD0DE, 0x4FEE, 0xD0DF, 0x7F9E, + 0xD0E0, 0x673D, 0xD0E1, 0x55C5, 0xD0E2, 0x9508, 0xD0E3, 0x79C0, + 0xD0E4, 0x8896, 0xD0E5, 0x7EE3, 0xD0E6, 0x589F, 0xD0E7, 0x620C, + 0xD0E8, 0x9700, 0xD0E9, 0x865A, 0xD0EA, 0x5618, 0xD0EB, 0x987B, + 0xD0EC, 0x5F90, 0xD0ED, 0x8BB8, 0xD0EE, 0x84C4, 0xD0EF, 0x9157, + 0xD0F0, 0x53D9, 0xD0F1, 0x65ED, 0xD0F2, 0x5E8F, 0xD0F3, 0x755C, + 0xD0F4, 0x6064, 0xD0F5, 0x7D6E, 0xD0F6, 0x5A7F, 0xD0F7, 0x7EEA, + 0xD0F8, 0x7EED, 0xD0F9, 0x8F69, 0xD0FA, 0x55A7, 0xD0FB, 0x5BA3, + 0xD0FC, 0x60AC, 0xD0FD, 0x65CB, 0xD0FE, 0x7384, 0xD140, 0x88AC, + 0xD141, 0x88AE, 0xD142, 0x88AF, 0xD143, 0x88B0, 0xD144, 0x88B2, + 0xD145, 0x88B3, 0xD146, 0x88B4, 0xD147, 0x88B5, 0xD148, 0x88B6, + 0xD149, 0x88B8, 0xD14A, 0x88B9, 0xD14B, 0x88BA, 0xD14C, 0x88BB, + 0xD14D, 0x88BD, 0xD14E, 0x88BE, 0xD14F, 0x88BF, 0xD150, 0x88C0, + 0xD151, 0x88C3, 0xD152, 0x88C4, 0xD153, 0x88C7, 0xD154, 0x88C8, + 0xD155, 0x88CA, 0xD156, 0x88CB, 0xD157, 0x88CC, 0xD158, 0x88CD, + 0xD159, 0x88CF, 0xD15A, 0x88D0, 0xD15B, 0x88D1, 0xD15C, 0x88D3, + 0xD15D, 0x88D6, 0xD15E, 0x88D7, 0xD15F, 0x88DA, 0xD160, 0x88DB, + 0xD161, 0x88DC, 0xD162, 0x88DD, 0xD163, 0x88DE, 0xD164, 0x88E0, + 0xD165, 0x88E1, 0xD166, 0x88E6, 0xD167, 0x88E7, 0xD168, 0x88E9, + 0xD169, 0x88EA, 0xD16A, 0x88EB, 0xD16B, 0x88EC, 0xD16C, 0x88ED, + 0xD16D, 0x88EE, 0xD16E, 0x88EF, 0xD16F, 0x88F2, 0xD170, 0x88F5, + 0xD171, 0x88F6, 0xD172, 0x88F7, 0xD173, 0x88FA, 0xD174, 0x88FB, + 0xD175, 0x88FD, 0xD176, 0x88FF, 0xD177, 0x8900, 0xD178, 0x8901, + 0xD179, 0x8903, 0xD17A, 0x8904, 0xD17B, 0x8905, 0xD17C, 0x8906, + 0xD17D, 0x8907, 0xD17E, 0x8908, 0xD180, 0x8909, 0xD181, 0x890B, + 0xD182, 0x890C, 0xD183, 0x890D, 0xD184, 0x890E, 0xD185, 0x890F, + 0xD186, 0x8911, 0xD187, 0x8914, 0xD188, 0x8915, 0xD189, 0x8916, + 0xD18A, 0x8917, 0xD18B, 0x8918, 0xD18C, 0x891C, 0xD18D, 0x891D, + 0xD18E, 0x891E, 0xD18F, 0x891F, 0xD190, 0x8920, 0xD191, 0x8922, + 0xD192, 0x8923, 0xD193, 0x8924, 0xD194, 0x8926, 0xD195, 0x8927, + 0xD196, 0x8928, 0xD197, 0x8929, 0xD198, 0x892C, 0xD199, 0x892D, + 0xD19A, 0x892E, 0xD19B, 0x892F, 0xD19C, 0x8931, 0xD19D, 0x8932, + 0xD19E, 0x8933, 0xD19F, 0x8935, 0xD1A0, 0x8937, 0xD1A1, 0x9009, + 0xD1A2, 0x7663, 0xD1A3, 0x7729, 0xD1A4, 0x7EDA, 0xD1A5, 0x9774, + 0xD1A6, 0x859B, 0xD1A7, 0x5B66, 0xD1A8, 0x7A74, 0xD1A9, 0x96EA, + 0xD1AA, 0x8840, 0xD1AB, 0x52CB, 0xD1AC, 0x718F, 0xD1AD, 0x5FAA, + 0xD1AE, 0x65EC, 0xD1AF, 0x8BE2, 0xD1B0, 0x5BFB, 0xD1B1, 0x9A6F, + 0xD1B2, 0x5DE1, 0xD1B3, 0x6B89, 0xD1B4, 0x6C5B, 0xD1B5, 0x8BAD, + 0xD1B6, 0x8BAF, 0xD1B7, 0x900A, 0xD1B8, 0x8FC5, 0xD1B9, 0x538B, + 0xD1BA, 0x62BC, 0xD1BB, 0x9E26, 0xD1BC, 0x9E2D, 0xD1BD, 0x5440, + 0xD1BE, 0x4E2B, 0xD1BF, 0x82BD, 0xD1C0, 0x7259, 0xD1C1, 0x869C, + 0xD1C2, 0x5D16, 0xD1C3, 0x8859, 0xD1C4, 0x6DAF, 0xD1C5, 0x96C5, + 0xD1C6, 0x54D1, 0xD1C7, 0x4E9A, 0xD1C8, 0x8BB6, 0xD1C9, 0x7109, + 0xD1CA, 0x54BD, 0xD1CB, 0x9609, 0xD1CC, 0x70DF, 0xD1CD, 0x6DF9, + 0xD1CE, 0x76D0, 0xD1CF, 0x4E25, 0xD1D0, 0x7814, 0xD1D1, 0x8712, + 0xD1D2, 0x5CA9, 0xD1D3, 0x5EF6, 0xD1D4, 0x8A00, 0xD1D5, 0x989C, + 0xD1D6, 0x960E, 0xD1D7, 0x708E, 0xD1D8, 0x6CBF, 0xD1D9, 0x5944, + 0xD1DA, 0x63A9, 0xD1DB, 0x773C, 0xD1DC, 0x884D, 0xD1DD, 0x6F14, + 0xD1DE, 0x8273, 0xD1DF, 0x5830, 0xD1E0, 0x71D5, 0xD1E1, 0x538C, + 0xD1E2, 0x781A, 0xD1E3, 0x96C1, 0xD1E4, 0x5501, 0xD1E5, 0x5F66, + 0xD1E6, 0x7130, 0xD1E7, 0x5BB4, 0xD1E8, 0x8C1A, 0xD1E9, 0x9A8C, + 0xD1EA, 0x6B83, 0xD1EB, 0x592E, 0xD1EC, 0x9E2F, 0xD1ED, 0x79E7, + 0xD1EE, 0x6768, 0xD1EF, 0x626C, 0xD1F0, 0x4F6F, 0xD1F1, 0x75A1, + 0xD1F2, 0x7F8A, 0xD1F3, 0x6D0B, 0xD1F4, 0x9633, 0xD1F5, 0x6C27, + 0xD1F6, 0x4EF0, 0xD1F7, 0x75D2, 0xD1F8, 0x517B, 0xD1F9, 0x6837, + 0xD1FA, 0x6F3E, 0xD1FB, 0x9080, 0xD1FC, 0x8170, 0xD1FD, 0x5996, + 0xD1FE, 0x7476, 0xD240, 0x8938, 0xD241, 0x8939, 0xD242, 0x893A, + 0xD243, 0x893B, 0xD244, 0x893C, 0xD245, 0x893D, 0xD246, 0x893E, + 0xD247, 0x893F, 0xD248, 0x8940, 0xD249, 0x8942, 0xD24A, 0x8943, + 0xD24B, 0x8945, 0xD24C, 0x8946, 0xD24D, 0x8947, 0xD24E, 0x8948, + 0xD24F, 0x8949, 0xD250, 0x894A, 0xD251, 0x894B, 0xD252, 0x894C, + 0xD253, 0x894D, 0xD254, 0x894E, 0xD255, 0x894F, 0xD256, 0x8950, + 0xD257, 0x8951, 0xD258, 0x8952, 0xD259, 0x8953, 0xD25A, 0x8954, + 0xD25B, 0x8955, 0xD25C, 0x8956, 0xD25D, 0x8957, 0xD25E, 0x8958, + 0xD25F, 0x8959, 0xD260, 0x895A, 0xD261, 0x895B, 0xD262, 0x895C, + 0xD263, 0x895D, 0xD264, 0x8960, 0xD265, 0x8961, 0xD266, 0x8962, + 0xD267, 0x8963, 0xD268, 0x8964, 0xD269, 0x8965, 0xD26A, 0x8967, + 0xD26B, 0x8968, 0xD26C, 0x8969, 0xD26D, 0x896A, 0xD26E, 0x896B, + 0xD26F, 0x896C, 0xD270, 0x896D, 0xD271, 0x896E, 0xD272, 0x896F, + 0xD273, 0x8970, 0xD274, 0x8971, 0xD275, 0x8972, 0xD276, 0x8973, + 0xD277, 0x8974, 0xD278, 0x8975, 0xD279, 0x8976, 0xD27A, 0x8977, + 0xD27B, 0x8978, 0xD27C, 0x8979, 0xD27D, 0x897A, 0xD27E, 0x897C, + 0xD280, 0x897D, 0xD281, 0x897E, 0xD282, 0x8980, 0xD283, 0x8982, + 0xD284, 0x8984, 0xD285, 0x8985, 0xD286, 0x8987, 0xD287, 0x8988, + 0xD288, 0x8989, 0xD289, 0x898A, 0xD28A, 0x898B, 0xD28B, 0x898C, + 0xD28C, 0x898D, 0xD28D, 0x898E, 0xD28E, 0x898F, 0xD28F, 0x8990, + 0xD290, 0x8991, 0xD291, 0x8992, 0xD292, 0x8993, 0xD293, 0x8994, + 0xD294, 0x8995, 0xD295, 0x8996, 0xD296, 0x8997, 0xD297, 0x8998, + 0xD298, 0x8999, 0xD299, 0x899A, 0xD29A, 0x899B, 0xD29B, 0x899C, + 0xD29C, 0x899D, 0xD29D, 0x899E, 0xD29E, 0x899F, 0xD29F, 0x89A0, + 0xD2A0, 0x89A1, 0xD2A1, 0x6447, 0xD2A2, 0x5C27, 0xD2A3, 0x9065, + 0xD2A4, 0x7A91, 0xD2A5, 0x8C23, 0xD2A6, 0x59DA, 0xD2A7, 0x54AC, + 0xD2A8, 0x8200, 0xD2A9, 0x836F, 0xD2AA, 0x8981, 0xD2AB, 0x8000, + 0xD2AC, 0x6930, 0xD2AD, 0x564E, 0xD2AE, 0x8036, 0xD2AF, 0x7237, + 0xD2B0, 0x91CE, 0xD2B1, 0x51B6, 0xD2B2, 0x4E5F, 0xD2B3, 0x9875, + 0xD2B4, 0x6396, 0xD2B5, 0x4E1A, 0xD2B6, 0x53F6, 0xD2B7, 0x66F3, + 0xD2B8, 0x814B, 0xD2B9, 0x591C, 0xD2BA, 0x6DB2, 0xD2BB, 0x4E00, + 0xD2BC, 0x58F9, 0xD2BD, 0x533B, 0xD2BE, 0x63D6, 0xD2BF, 0x94F1, + 0xD2C0, 0x4F9D, 0xD2C1, 0x4F0A, 0xD2C2, 0x8863, 0xD2C3, 0x9890, + 0xD2C4, 0x5937, 0xD2C5, 0x9057, 0xD2C6, 0x79FB, 0xD2C7, 0x4EEA, + 0xD2C8, 0x80F0, 0xD2C9, 0x7591, 0xD2CA, 0x6C82, 0xD2CB, 0x5B9C, + 0xD2CC, 0x59E8, 0xD2CD, 0x5F5D, 0xD2CE, 0x6905, 0xD2CF, 0x8681, + 0xD2D0, 0x501A, 0xD2D1, 0x5DF2, 0xD2D2, 0x4E59, 0xD2D3, 0x77E3, + 0xD2D4, 0x4EE5, 0xD2D5, 0x827A, 0xD2D6, 0x6291, 0xD2D7, 0x6613, + 0xD2D8, 0x9091, 0xD2D9, 0x5C79, 0xD2DA, 0x4EBF, 0xD2DB, 0x5F79, + 0xD2DC, 0x81C6, 0xD2DD, 0x9038, 0xD2DE, 0x8084, 0xD2DF, 0x75AB, + 0xD2E0, 0x4EA6, 0xD2E1, 0x88D4, 0xD2E2, 0x610F, 0xD2E3, 0x6BC5, + 0xD2E4, 0x5FC6, 0xD2E5, 0x4E49, 0xD2E6, 0x76CA, 0xD2E7, 0x6EA2, + 0xD2E8, 0x8BE3, 0xD2E9, 0x8BAE, 0xD2EA, 0x8C0A, 0xD2EB, 0x8BD1, + 0xD2EC, 0x5F02, 0xD2ED, 0x7FFC, 0xD2EE, 0x7FCC, 0xD2EF, 0x7ECE, + 0xD2F0, 0x8335, 0xD2F1, 0x836B, 0xD2F2, 0x56E0, 0xD2F3, 0x6BB7, + 0xD2F4, 0x97F3, 0xD2F5, 0x9634, 0xD2F6, 0x59FB, 0xD2F7, 0x541F, + 0xD2F8, 0x94F6, 0xD2F9, 0x6DEB, 0xD2FA, 0x5BC5, 0xD2FB, 0x996E, + 0xD2FC, 0x5C39, 0xD2FD, 0x5F15, 0xD2FE, 0x9690, 0xD340, 0x89A2, + 0xD341, 0x89A3, 0xD342, 0x89A4, 0xD343, 0x89A5, 0xD344, 0x89A6, + 0xD345, 0x89A7, 0xD346, 0x89A8, 0xD347, 0x89A9, 0xD348, 0x89AA, + 0xD349, 0x89AB, 0xD34A, 0x89AC, 0xD34B, 0x89AD, 0xD34C, 0x89AE, + 0xD34D, 0x89AF, 0xD34E, 0x89B0, 0xD34F, 0x89B1, 0xD350, 0x89B2, + 0xD351, 0x89B3, 0xD352, 0x89B4, 0xD353, 0x89B5, 0xD354, 0x89B6, + 0xD355, 0x89B7, 0xD356, 0x89B8, 0xD357, 0x89B9, 0xD358, 0x89BA, + 0xD359, 0x89BB, 0xD35A, 0x89BC, 0xD35B, 0x89BD, 0xD35C, 0x89BE, + 0xD35D, 0x89BF, 0xD35E, 0x89C0, 0xD35F, 0x89C3, 0xD360, 0x89CD, + 0xD361, 0x89D3, 0xD362, 0x89D4, 0xD363, 0x89D5, 0xD364, 0x89D7, + 0xD365, 0x89D8, 0xD366, 0x89D9, 0xD367, 0x89DB, 0xD368, 0x89DD, + 0xD369, 0x89DF, 0xD36A, 0x89E0, 0xD36B, 0x89E1, 0xD36C, 0x89E2, + 0xD36D, 0x89E4, 0xD36E, 0x89E7, 0xD36F, 0x89E8, 0xD370, 0x89E9, + 0xD371, 0x89EA, 0xD372, 0x89EC, 0xD373, 0x89ED, 0xD374, 0x89EE, + 0xD375, 0x89F0, 0xD376, 0x89F1, 0xD377, 0x89F2, 0xD378, 0x89F4, + 0xD379, 0x89F5, 0xD37A, 0x89F6, 0xD37B, 0x89F7, 0xD37C, 0x89F8, + 0xD37D, 0x89F9, 0xD37E, 0x89FA, 0xD380, 0x89FB, 0xD381, 0x89FC, + 0xD382, 0x89FD, 0xD383, 0x89FE, 0xD384, 0x89FF, 0xD385, 0x8A01, + 0xD386, 0x8A02, 0xD387, 0x8A03, 0xD388, 0x8A04, 0xD389, 0x8A05, + 0xD38A, 0x8A06, 0xD38B, 0x8A08, 0xD38C, 0x8A09, 0xD38D, 0x8A0A, + 0xD38E, 0x8A0B, 0xD38F, 0x8A0C, 0xD390, 0x8A0D, 0xD391, 0x8A0E, + 0xD392, 0x8A0F, 0xD393, 0x8A10, 0xD394, 0x8A11, 0xD395, 0x8A12, + 0xD396, 0x8A13, 0xD397, 0x8A14, 0xD398, 0x8A15, 0xD399, 0x8A16, + 0xD39A, 0x8A17, 0xD39B, 0x8A18, 0xD39C, 0x8A19, 0xD39D, 0x8A1A, + 0xD39E, 0x8A1B, 0xD39F, 0x8A1C, 0xD3A0, 0x8A1D, 0xD3A1, 0x5370, + 0xD3A2, 0x82F1, 0xD3A3, 0x6A31, 0xD3A4, 0x5A74, 0xD3A5, 0x9E70, + 0xD3A6, 0x5E94, 0xD3A7, 0x7F28, 0xD3A8, 0x83B9, 0xD3A9, 0x8424, + 0xD3AA, 0x8425, 0xD3AB, 0x8367, 0xD3AC, 0x8747, 0xD3AD, 0x8FCE, + 0xD3AE, 0x8D62, 0xD3AF, 0x76C8, 0xD3B0, 0x5F71, 0xD3B1, 0x9896, + 0xD3B2, 0x786C, 0xD3B3, 0x6620, 0xD3B4, 0x54DF, 0xD3B5, 0x62E5, + 0xD3B6, 0x4F63, 0xD3B7, 0x81C3, 0xD3B8, 0x75C8, 0xD3B9, 0x5EB8, + 0xD3BA, 0x96CD, 0xD3BB, 0x8E0A, 0xD3BC, 0x86F9, 0xD3BD, 0x548F, + 0xD3BE, 0x6CF3, 0xD3BF, 0x6D8C, 0xD3C0, 0x6C38, 0xD3C1, 0x607F, + 0xD3C2, 0x52C7, 0xD3C3, 0x7528, 0xD3C4, 0x5E7D, 0xD3C5, 0x4F18, + 0xD3C6, 0x60A0, 0xD3C7, 0x5FE7, 0xD3C8, 0x5C24, 0xD3C9, 0x7531, + 0xD3CA, 0x90AE, 0xD3CB, 0x94C0, 0xD3CC, 0x72B9, 0xD3CD, 0x6CB9, + 0xD3CE, 0x6E38, 0xD3CF, 0x9149, 0xD3D0, 0x6709, 0xD3D1, 0x53CB, + 0xD3D2, 0x53F3, 0xD3D3, 0x4F51, 0xD3D4, 0x91C9, 0xD3D5, 0x8BF1, + 0xD3D6, 0x53C8, 0xD3D7, 0x5E7C, 0xD3D8, 0x8FC2, 0xD3D9, 0x6DE4, + 0xD3DA, 0x4E8E, 0xD3DB, 0x76C2, 0xD3DC, 0x6986, 0xD3DD, 0x865E, + 0xD3DE, 0x611A, 0xD3DF, 0x8206, 0xD3E0, 0x4F59, 0xD3E1, 0x4FDE, + 0xD3E2, 0x903E, 0xD3E3, 0x9C7C, 0xD3E4, 0x6109, 0xD3E5, 0x6E1D, + 0xD3E6, 0x6E14, 0xD3E7, 0x9685, 0xD3E8, 0x4E88, 0xD3E9, 0x5A31, + 0xD3EA, 0x96E8, 0xD3EB, 0x4E0E, 0xD3EC, 0x5C7F, 0xD3ED, 0x79B9, + 0xD3EE, 0x5B87, 0xD3EF, 0x8BED, 0xD3F0, 0x7FBD, 0xD3F1, 0x7389, + 0xD3F2, 0x57DF, 0xD3F3, 0x828B, 0xD3F4, 0x90C1, 0xD3F5, 0x5401, + 0xD3F6, 0x9047, 0xD3F7, 0x55BB, 0xD3F8, 0x5CEA, 0xD3F9, 0x5FA1, + 0xD3FA, 0x6108, 0xD3FB, 0x6B32, 0xD3FC, 0x72F1, 0xD3FD, 0x80B2, + 0xD3FE, 0x8A89, 0xD440, 0x8A1E, 0xD441, 0x8A1F, 0xD442, 0x8A20, + 0xD443, 0x8A21, 0xD444, 0x8A22, 0xD445, 0x8A23, 0xD446, 0x8A24, + 0xD447, 0x8A25, 0xD448, 0x8A26, 0xD449, 0x8A27, 0xD44A, 0x8A28, + 0xD44B, 0x8A29, 0xD44C, 0x8A2A, 0xD44D, 0x8A2B, 0xD44E, 0x8A2C, + 0xD44F, 0x8A2D, 0xD450, 0x8A2E, 0xD451, 0x8A2F, 0xD452, 0x8A30, + 0xD453, 0x8A31, 0xD454, 0x8A32, 0xD455, 0x8A33, 0xD456, 0x8A34, + 0xD457, 0x8A35, 0xD458, 0x8A36, 0xD459, 0x8A37, 0xD45A, 0x8A38, + 0xD45B, 0x8A39, 0xD45C, 0x8A3A, 0xD45D, 0x8A3B, 0xD45E, 0x8A3C, + 0xD45F, 0x8A3D, 0xD460, 0x8A3F, 0xD461, 0x8A40, 0xD462, 0x8A41, + 0xD463, 0x8A42, 0xD464, 0x8A43, 0xD465, 0x8A44, 0xD466, 0x8A45, + 0xD467, 0x8A46, 0xD468, 0x8A47, 0xD469, 0x8A49, 0xD46A, 0x8A4A, + 0xD46B, 0x8A4B, 0xD46C, 0x8A4C, 0xD46D, 0x8A4D, 0xD46E, 0x8A4E, + 0xD46F, 0x8A4F, 0xD470, 0x8A50, 0xD471, 0x8A51, 0xD472, 0x8A52, + 0xD473, 0x8A53, 0xD474, 0x8A54, 0xD475, 0x8A55, 0xD476, 0x8A56, + 0xD477, 0x8A57, 0xD478, 0x8A58, 0xD479, 0x8A59, 0xD47A, 0x8A5A, + 0xD47B, 0x8A5B, 0xD47C, 0x8A5C, 0xD47D, 0x8A5D, 0xD47E, 0x8A5E, + 0xD480, 0x8A5F, 0xD481, 0x8A60, 0xD482, 0x8A61, 0xD483, 0x8A62, + 0xD484, 0x8A63, 0xD485, 0x8A64, 0xD486, 0x8A65, 0xD487, 0x8A66, + 0xD488, 0x8A67, 0xD489, 0x8A68, 0xD48A, 0x8A69, 0xD48B, 0x8A6A, + 0xD48C, 0x8A6B, 0xD48D, 0x8A6C, 0xD48E, 0x8A6D, 0xD48F, 0x8A6E, + 0xD490, 0x8A6F, 0xD491, 0x8A70, 0xD492, 0x8A71, 0xD493, 0x8A72, + 0xD494, 0x8A73, 0xD495, 0x8A74, 0xD496, 0x8A75, 0xD497, 0x8A76, + 0xD498, 0x8A77, 0xD499, 0x8A78, 0xD49A, 0x8A7A, 0xD49B, 0x8A7B, + 0xD49C, 0x8A7C, 0xD49D, 0x8A7D, 0xD49E, 0x8A7E, 0xD49F, 0x8A7F, + 0xD4A0, 0x8A80, 0xD4A1, 0x6D74, 0xD4A2, 0x5BD3, 0xD4A3, 0x88D5, + 0xD4A4, 0x9884, 0xD4A5, 0x8C6B, 0xD4A6, 0x9A6D, 0xD4A7, 0x9E33, + 0xD4A8, 0x6E0A, 0xD4A9, 0x51A4, 0xD4AA, 0x5143, 0xD4AB, 0x57A3, + 0xD4AC, 0x8881, 0xD4AD, 0x539F, 0xD4AE, 0x63F4, 0xD4AF, 0x8F95, + 0xD4B0, 0x56ED, 0xD4B1, 0x5458, 0xD4B2, 0x5706, 0xD4B3, 0x733F, + 0xD4B4, 0x6E90, 0xD4B5, 0x7F18, 0xD4B6, 0x8FDC, 0xD4B7, 0x82D1, + 0xD4B8, 0x613F, 0xD4B9, 0x6028, 0xD4BA, 0x9662, 0xD4BB, 0x66F0, + 0xD4BC, 0x7EA6, 0xD4BD, 0x8D8A, 0xD4BE, 0x8DC3, 0xD4BF, 0x94A5, + 0xD4C0, 0x5CB3, 0xD4C1, 0x7CA4, 0xD4C2, 0x6708, 0xD4C3, 0x60A6, + 0xD4C4, 0x9605, 0xD4C5, 0x8018, 0xD4C6, 0x4E91, 0xD4C7, 0x90E7, + 0xD4C8, 0x5300, 0xD4C9, 0x9668, 0xD4CA, 0x5141, 0xD4CB, 0x8FD0, + 0xD4CC, 0x8574, 0xD4CD, 0x915D, 0xD4CE, 0x6655, 0xD4CF, 0x97F5, + 0xD4D0, 0x5B55, 0xD4D1, 0x531D, 0xD4D2, 0x7838, 0xD4D3, 0x6742, + 0xD4D4, 0x683D, 0xD4D5, 0x54C9, 0xD4D6, 0x707E, 0xD4D7, 0x5BB0, + 0xD4D8, 0x8F7D, 0xD4D9, 0x518D, 0xD4DA, 0x5728, 0xD4DB, 0x54B1, + 0xD4DC, 0x6512, 0xD4DD, 0x6682, 0xD4DE, 0x8D5E, 0xD4DF, 0x8D43, + 0xD4E0, 0x810F, 0xD4E1, 0x846C, 0xD4E2, 0x906D, 0xD4E3, 0x7CDF, + 0xD4E4, 0x51FF, 0xD4E5, 0x85FB, 0xD4E6, 0x67A3, 0xD4E7, 0x65E9, + 0xD4E8, 0x6FA1, 0xD4E9, 0x86A4, 0xD4EA, 0x8E81, 0xD4EB, 0x566A, + 0xD4EC, 0x9020, 0xD4ED, 0x7682, 0xD4EE, 0x7076, 0xD4EF, 0x71E5, + 0xD4F0, 0x8D23, 0xD4F1, 0x62E9, 0xD4F2, 0x5219, 0xD4F3, 0x6CFD, + 0xD4F4, 0x8D3C, 0xD4F5, 0x600E, 0xD4F6, 0x589E, 0xD4F7, 0x618E, + 0xD4F8, 0x66FE, 0xD4F9, 0x8D60, 0xD4FA, 0x624E, 0xD4FB, 0x55B3, + 0xD4FC, 0x6E23, 0xD4FD, 0x672D, 0xD4FE, 0x8F67, 0xD540, 0x8A81, + 0xD541, 0x8A82, 0xD542, 0x8A83, 0xD543, 0x8A84, 0xD544, 0x8A85, + 0xD545, 0x8A86, 0xD546, 0x8A87, 0xD547, 0x8A88, 0xD548, 0x8A8B, + 0xD549, 0x8A8C, 0xD54A, 0x8A8D, 0xD54B, 0x8A8E, 0xD54C, 0x8A8F, + 0xD54D, 0x8A90, 0xD54E, 0x8A91, 0xD54F, 0x8A92, 0xD550, 0x8A94, + 0xD551, 0x8A95, 0xD552, 0x8A96, 0xD553, 0x8A97, 0xD554, 0x8A98, + 0xD555, 0x8A99, 0xD556, 0x8A9A, 0xD557, 0x8A9B, 0xD558, 0x8A9C, + 0xD559, 0x8A9D, 0xD55A, 0x8A9E, 0xD55B, 0x8A9F, 0xD55C, 0x8AA0, + 0xD55D, 0x8AA1, 0xD55E, 0x8AA2, 0xD55F, 0x8AA3, 0xD560, 0x8AA4, + 0xD561, 0x8AA5, 0xD562, 0x8AA6, 0xD563, 0x8AA7, 0xD564, 0x8AA8, + 0xD565, 0x8AA9, 0xD566, 0x8AAA, 0xD567, 0x8AAB, 0xD568, 0x8AAC, + 0xD569, 0x8AAD, 0xD56A, 0x8AAE, 0xD56B, 0x8AAF, 0xD56C, 0x8AB0, + 0xD56D, 0x8AB1, 0xD56E, 0x8AB2, 0xD56F, 0x8AB3, 0xD570, 0x8AB4, + 0xD571, 0x8AB5, 0xD572, 0x8AB6, 0xD573, 0x8AB7, 0xD574, 0x8AB8, + 0xD575, 0x8AB9, 0xD576, 0x8ABA, 0xD577, 0x8ABB, 0xD578, 0x8ABC, + 0xD579, 0x8ABD, 0xD57A, 0x8ABE, 0xD57B, 0x8ABF, 0xD57C, 0x8AC0, + 0xD57D, 0x8AC1, 0xD57E, 0x8AC2, 0xD580, 0x8AC3, 0xD581, 0x8AC4, + 0xD582, 0x8AC5, 0xD583, 0x8AC6, 0xD584, 0x8AC7, 0xD585, 0x8AC8, + 0xD586, 0x8AC9, 0xD587, 0x8ACA, 0xD588, 0x8ACB, 0xD589, 0x8ACC, + 0xD58A, 0x8ACD, 0xD58B, 0x8ACE, 0xD58C, 0x8ACF, 0xD58D, 0x8AD0, + 0xD58E, 0x8AD1, 0xD58F, 0x8AD2, 0xD590, 0x8AD3, 0xD591, 0x8AD4, + 0xD592, 0x8AD5, 0xD593, 0x8AD6, 0xD594, 0x8AD7, 0xD595, 0x8AD8, + 0xD596, 0x8AD9, 0xD597, 0x8ADA, 0xD598, 0x8ADB, 0xD599, 0x8ADC, + 0xD59A, 0x8ADD, 0xD59B, 0x8ADE, 0xD59C, 0x8ADF, 0xD59D, 0x8AE0, + 0xD59E, 0x8AE1, 0xD59F, 0x8AE2, 0xD5A0, 0x8AE3, 0xD5A1, 0x94E1, + 0xD5A2, 0x95F8, 0xD5A3, 0x7728, 0xD5A4, 0x6805, 0xD5A5, 0x69A8, + 0xD5A6, 0x548B, 0xD5A7, 0x4E4D, 0xD5A8, 0x70B8, 0xD5A9, 0x8BC8, + 0xD5AA, 0x6458, 0xD5AB, 0x658B, 0xD5AC, 0x5B85, 0xD5AD, 0x7A84, + 0xD5AE, 0x503A, 0xD5AF, 0x5BE8, 0xD5B0, 0x77BB, 0xD5B1, 0x6BE1, + 0xD5B2, 0x8A79, 0xD5B3, 0x7C98, 0xD5B4, 0x6CBE, 0xD5B5, 0x76CF, + 0xD5B6, 0x65A9, 0xD5B7, 0x8F97, 0xD5B8, 0x5D2D, 0xD5B9, 0x5C55, + 0xD5BA, 0x8638, 0xD5BB, 0x6808, 0xD5BC, 0x5360, 0xD5BD, 0x6218, + 0xD5BE, 0x7AD9, 0xD5BF, 0x6E5B, 0xD5C0, 0x7EFD, 0xD5C1, 0x6A1F, + 0xD5C2, 0x7AE0, 0xD5C3, 0x5F70, 0xD5C4, 0x6F33, 0xD5C5, 0x5F20, + 0xD5C6, 0x638C, 0xD5C7, 0x6DA8, 0xD5C8, 0x6756, 0xD5C9, 0x4E08, + 0xD5CA, 0x5E10, 0xD5CB, 0x8D26, 0xD5CC, 0x4ED7, 0xD5CD, 0x80C0, + 0xD5CE, 0x7634, 0xD5CF, 0x969C, 0xD5D0, 0x62DB, 0xD5D1, 0x662D, + 0xD5D2, 0x627E, 0xD5D3, 0x6CBC, 0xD5D4, 0x8D75, 0xD5D5, 0x7167, + 0xD5D6, 0x7F69, 0xD5D7, 0x5146, 0xD5D8, 0x8087, 0xD5D9, 0x53EC, + 0xD5DA, 0x906E, 0xD5DB, 0x6298, 0xD5DC, 0x54F2, 0xD5DD, 0x86F0, + 0xD5DE, 0x8F99, 0xD5DF, 0x8005, 0xD5E0, 0x9517, 0xD5E1, 0x8517, + 0xD5E2, 0x8FD9, 0xD5E3, 0x6D59, 0xD5E4, 0x73CD, 0xD5E5, 0x659F, + 0xD5E6, 0x771F, 0xD5E7, 0x7504, 0xD5E8, 0x7827, 0xD5E9, 0x81FB, + 0xD5EA, 0x8D1E, 0xD5EB, 0x9488, 0xD5EC, 0x4FA6, 0xD5ED, 0x6795, + 0xD5EE, 0x75B9, 0xD5EF, 0x8BCA, 0xD5F0, 0x9707, 0xD5F1, 0x632F, + 0xD5F2, 0x9547, 0xD5F3, 0x9635, 0xD5F4, 0x84B8, 0xD5F5, 0x6323, + 0xD5F6, 0x7741, 0xD5F7, 0x5F81, 0xD5F8, 0x72F0, 0xD5F9, 0x4E89, + 0xD5FA, 0x6014, 0xD5FB, 0x6574, 0xD5FC, 0x62EF, 0xD5FD, 0x6B63, + 0xD5FE, 0x653F, 0xD640, 0x8AE4, 0xD641, 0x8AE5, 0xD642, 0x8AE6, + 0xD643, 0x8AE7, 0xD644, 0x8AE8, 0xD645, 0x8AE9, 0xD646, 0x8AEA, + 0xD647, 0x8AEB, 0xD648, 0x8AEC, 0xD649, 0x8AED, 0xD64A, 0x8AEE, + 0xD64B, 0x8AEF, 0xD64C, 0x8AF0, 0xD64D, 0x8AF1, 0xD64E, 0x8AF2, + 0xD64F, 0x8AF3, 0xD650, 0x8AF4, 0xD651, 0x8AF5, 0xD652, 0x8AF6, + 0xD653, 0x8AF7, 0xD654, 0x8AF8, 0xD655, 0x8AF9, 0xD656, 0x8AFA, + 0xD657, 0x8AFB, 0xD658, 0x8AFC, 0xD659, 0x8AFD, 0xD65A, 0x8AFE, + 0xD65B, 0x8AFF, 0xD65C, 0x8B00, 0xD65D, 0x8B01, 0xD65E, 0x8B02, + 0xD65F, 0x8B03, 0xD660, 0x8B04, 0xD661, 0x8B05, 0xD662, 0x8B06, + 0xD663, 0x8B08, 0xD664, 0x8B09, 0xD665, 0x8B0A, 0xD666, 0x8B0B, + 0xD667, 0x8B0C, 0xD668, 0x8B0D, 0xD669, 0x8B0E, 0xD66A, 0x8B0F, + 0xD66B, 0x8B10, 0xD66C, 0x8B11, 0xD66D, 0x8B12, 0xD66E, 0x8B13, + 0xD66F, 0x8B14, 0xD670, 0x8B15, 0xD671, 0x8B16, 0xD672, 0x8B17, + 0xD673, 0x8B18, 0xD674, 0x8B19, 0xD675, 0x8B1A, 0xD676, 0x8B1B, + 0xD677, 0x8B1C, 0xD678, 0x8B1D, 0xD679, 0x8B1E, 0xD67A, 0x8B1F, + 0xD67B, 0x8B20, 0xD67C, 0x8B21, 0xD67D, 0x8B22, 0xD67E, 0x8B23, + 0xD680, 0x8B24, 0xD681, 0x8B25, 0xD682, 0x8B27, 0xD683, 0x8B28, + 0xD684, 0x8B29, 0xD685, 0x8B2A, 0xD686, 0x8B2B, 0xD687, 0x8B2C, + 0xD688, 0x8B2D, 0xD689, 0x8B2E, 0xD68A, 0x8B2F, 0xD68B, 0x8B30, + 0xD68C, 0x8B31, 0xD68D, 0x8B32, 0xD68E, 0x8B33, 0xD68F, 0x8B34, + 0xD690, 0x8B35, 0xD691, 0x8B36, 0xD692, 0x8B37, 0xD693, 0x8B38, + 0xD694, 0x8B39, 0xD695, 0x8B3A, 0xD696, 0x8B3B, 0xD697, 0x8B3C, + 0xD698, 0x8B3D, 0xD699, 0x8B3E, 0xD69A, 0x8B3F, 0xD69B, 0x8B40, + 0xD69C, 0x8B41, 0xD69D, 0x8B42, 0xD69E, 0x8B43, 0xD69F, 0x8B44, + 0xD6A0, 0x8B45, 0xD6A1, 0x5E27, 0xD6A2, 0x75C7, 0xD6A3, 0x90D1, + 0xD6A4, 0x8BC1, 0xD6A5, 0x829D, 0xD6A6, 0x679D, 0xD6A7, 0x652F, + 0xD6A8, 0x5431, 0xD6A9, 0x8718, 0xD6AA, 0x77E5, 0xD6AB, 0x80A2, + 0xD6AC, 0x8102, 0xD6AD, 0x6C41, 0xD6AE, 0x4E4B, 0xD6AF, 0x7EC7, + 0xD6B0, 0x804C, 0xD6B1, 0x76F4, 0xD6B2, 0x690D, 0xD6B3, 0x6B96, + 0xD6B4, 0x6267, 0xD6B5, 0x503C, 0xD6B6, 0x4F84, 0xD6B7, 0x5740, + 0xD6B8, 0x6307, 0xD6B9, 0x6B62, 0xD6BA, 0x8DBE, 0xD6BB, 0x53EA, + 0xD6BC, 0x65E8, 0xD6BD, 0x7EB8, 0xD6BE, 0x5FD7, 0xD6BF, 0x631A, + 0xD6C0, 0x63B7, 0xD6C1, 0x81F3, 0xD6C2, 0x81F4, 0xD6C3, 0x7F6E, + 0xD6C4, 0x5E1C, 0xD6C5, 0x5CD9, 0xD6C6, 0x5236, 0xD6C7, 0x667A, + 0xD6C8, 0x79E9, 0xD6C9, 0x7A1A, 0xD6CA, 0x8D28, 0xD6CB, 0x7099, + 0xD6CC, 0x75D4, 0xD6CD, 0x6EDE, 0xD6CE, 0x6CBB, 0xD6CF, 0x7A92, + 0xD6D0, 0x4E2D, 0xD6D1, 0x76C5, 0xD6D2, 0x5FE0, 0xD6D3, 0x949F, + 0xD6D4, 0x8877, 0xD6D5, 0x7EC8, 0xD6D6, 0x79CD, 0xD6D7, 0x80BF, + 0xD6D8, 0x91CD, 0xD6D9, 0x4EF2, 0xD6DA, 0x4F17, 0xD6DB, 0x821F, + 0xD6DC, 0x5468, 0xD6DD, 0x5DDE, 0xD6DE, 0x6D32, 0xD6DF, 0x8BCC, + 0xD6E0, 0x7CA5, 0xD6E1, 0x8F74, 0xD6E2, 0x8098, 0xD6E3, 0x5E1A, + 0xD6E4, 0x5492, 0xD6E5, 0x76B1, 0xD6E6, 0x5B99, 0xD6E7, 0x663C, + 0xD6E8, 0x9AA4, 0xD6E9, 0x73E0, 0xD6EA, 0x682A, 0xD6EB, 0x86DB, + 0xD6EC, 0x6731, 0xD6ED, 0x732A, 0xD6EE, 0x8BF8, 0xD6EF, 0x8BDB, + 0xD6F0, 0x9010, 0xD6F1, 0x7AF9, 0xD6F2, 0x70DB, 0xD6F3, 0x716E, + 0xD6F4, 0x62C4, 0xD6F5, 0x77A9, 0xD6F6, 0x5631, 0xD6F7, 0x4E3B, + 0xD6F8, 0x8457, 0xD6F9, 0x67F1, 0xD6FA, 0x52A9, 0xD6FB, 0x86C0, + 0xD6FC, 0x8D2E, 0xD6FD, 0x94F8, 0xD6FE, 0x7B51, 0xD740, 0x8B46, + 0xD741, 0x8B47, 0xD742, 0x8B48, 0xD743, 0x8B49, 0xD744, 0x8B4A, + 0xD745, 0x8B4B, 0xD746, 0x8B4C, 0xD747, 0x8B4D, 0xD748, 0x8B4E, + 0xD749, 0x8B4F, 0xD74A, 0x8B50, 0xD74B, 0x8B51, 0xD74C, 0x8B52, + 0xD74D, 0x8B53, 0xD74E, 0x8B54, 0xD74F, 0x8B55, 0xD750, 0x8B56, + 0xD751, 0x8B57, 0xD752, 0x8B58, 0xD753, 0x8B59, 0xD754, 0x8B5A, + 0xD755, 0x8B5B, 0xD756, 0x8B5C, 0xD757, 0x8B5D, 0xD758, 0x8B5E, + 0xD759, 0x8B5F, 0xD75A, 0x8B60, 0xD75B, 0x8B61, 0xD75C, 0x8B62, + 0xD75D, 0x8B63, 0xD75E, 0x8B64, 0xD75F, 0x8B65, 0xD760, 0x8B67, + 0xD761, 0x8B68, 0xD762, 0x8B69, 0xD763, 0x8B6A, 0xD764, 0x8B6B, + 0xD765, 0x8B6D, 0xD766, 0x8B6E, 0xD767, 0x8B6F, 0xD768, 0x8B70, + 0xD769, 0x8B71, 0xD76A, 0x8B72, 0xD76B, 0x8B73, 0xD76C, 0x8B74, + 0xD76D, 0x8B75, 0xD76E, 0x8B76, 0xD76F, 0x8B77, 0xD770, 0x8B78, + 0xD771, 0x8B79, 0xD772, 0x8B7A, 0xD773, 0x8B7B, 0xD774, 0x8B7C, + 0xD775, 0x8B7D, 0xD776, 0x8B7E, 0xD777, 0x8B7F, 0xD778, 0x8B80, + 0xD779, 0x8B81, 0xD77A, 0x8B82, 0xD77B, 0x8B83, 0xD77C, 0x8B84, + 0xD77D, 0x8B85, 0xD77E, 0x8B86, 0xD780, 0x8B87, 0xD781, 0x8B88, + 0xD782, 0x8B89, 0xD783, 0x8B8A, 0xD784, 0x8B8B, 0xD785, 0x8B8C, + 0xD786, 0x8B8D, 0xD787, 0x8B8E, 0xD788, 0x8B8F, 0xD789, 0x8B90, + 0xD78A, 0x8B91, 0xD78B, 0x8B92, 0xD78C, 0x8B93, 0xD78D, 0x8B94, + 0xD78E, 0x8B95, 0xD78F, 0x8B96, 0xD790, 0x8B97, 0xD791, 0x8B98, + 0xD792, 0x8B99, 0xD793, 0x8B9A, 0xD794, 0x8B9B, 0xD795, 0x8B9C, + 0xD796, 0x8B9D, 0xD797, 0x8B9E, 0xD798, 0x8B9F, 0xD799, 0x8BAC, + 0xD79A, 0x8BB1, 0xD79B, 0x8BBB, 0xD79C, 0x8BC7, 0xD79D, 0x8BD0, + 0xD79E, 0x8BEA, 0xD79F, 0x8C09, 0xD7A0, 0x8C1E, 0xD7A1, 0x4F4F, + 0xD7A2, 0x6CE8, 0xD7A3, 0x795D, 0xD7A4, 0x9A7B, 0xD7A5, 0x6293, + 0xD7A6, 0x722A, 0xD7A7, 0x62FD, 0xD7A8, 0x4E13, 0xD7A9, 0x7816, + 0xD7AA, 0x8F6C, 0xD7AB, 0x64B0, 0xD7AC, 0x8D5A, 0xD7AD, 0x7BC6, + 0xD7AE, 0x6869, 0xD7AF, 0x5E84, 0xD7B0, 0x88C5, 0xD7B1, 0x5986, + 0xD7B2, 0x649E, 0xD7B3, 0x58EE, 0xD7B4, 0x72B6, 0xD7B5, 0x690E, + 0xD7B6, 0x9525, 0xD7B7, 0x8FFD, 0xD7B8, 0x8D58, 0xD7B9, 0x5760, + 0xD7BA, 0x7F00, 0xD7BB, 0x8C06, 0xD7BC, 0x51C6, 0xD7BD, 0x6349, + 0xD7BE, 0x62D9, 0xD7BF, 0x5353, 0xD7C0, 0x684C, 0xD7C1, 0x7422, + 0xD7C2, 0x8301, 0xD7C3, 0x914C, 0xD7C4, 0x5544, 0xD7C5, 0x7740, + 0xD7C6, 0x707C, 0xD7C7, 0x6D4A, 0xD7C8, 0x5179, 0xD7C9, 0x54A8, + 0xD7CA, 0x8D44, 0xD7CB, 0x59FF, 0xD7CC, 0x6ECB, 0xD7CD, 0x6DC4, + 0xD7CE, 0x5B5C, 0xD7CF, 0x7D2B, 0xD7D0, 0x4ED4, 0xD7D1, 0x7C7D, + 0xD7D2, 0x6ED3, 0xD7D3, 0x5B50, 0xD7D4, 0x81EA, 0xD7D5, 0x6E0D, + 0xD7D6, 0x5B57, 0xD7D7, 0x9B03, 0xD7D8, 0x68D5, 0xD7D9, 0x8E2A, + 0xD7DA, 0x5B97, 0xD7DB, 0x7EFC, 0xD7DC, 0x603B, 0xD7DD, 0x7EB5, + 0xD7DE, 0x90B9, 0xD7DF, 0x8D70, 0xD7E0, 0x594F, 0xD7E1, 0x63CD, + 0xD7E2, 0x79DF, 0xD7E3, 0x8DB3, 0xD7E4, 0x5352, 0xD7E5, 0x65CF, + 0xD7E6, 0x7956, 0xD7E7, 0x8BC5, 0xD7E8, 0x963B, 0xD7E9, 0x7EC4, + 0xD7EA, 0x94BB, 0xD7EB, 0x7E82, 0xD7EC, 0x5634, 0xD7ED, 0x9189, + 0xD7EE, 0x6700, 0xD7EF, 0x7F6A, 0xD7F0, 0x5C0A, 0xD7F1, 0x9075, + 0xD7F2, 0x6628, 0xD7F3, 0x5DE6, 0xD7F4, 0x4F50, 0xD7F5, 0x67DE, + 0xD7F6, 0x505A, 0xD7F7, 0x4F5C, 0xD7F8, 0x5750, 0xD7F9, 0x5EA7, + 0xD840, 0x8C38, 0xD841, 0x8C39, 0xD842, 0x8C3A, 0xD843, 0x8C3B, + 0xD844, 0x8C3C, 0xD845, 0x8C3D, 0xD846, 0x8C3E, 0xD847, 0x8C3F, + 0xD848, 0x8C40, 0xD849, 0x8C42, 0xD84A, 0x8C43, 0xD84B, 0x8C44, + 0xD84C, 0x8C45, 0xD84D, 0x8C48, 0xD84E, 0x8C4A, 0xD84F, 0x8C4B, + 0xD850, 0x8C4D, 0xD851, 0x8C4E, 0xD852, 0x8C4F, 0xD853, 0x8C50, + 0xD854, 0x8C51, 0xD855, 0x8C52, 0xD856, 0x8C53, 0xD857, 0x8C54, + 0xD858, 0x8C56, 0xD859, 0x8C57, 0xD85A, 0x8C58, 0xD85B, 0x8C59, + 0xD85C, 0x8C5B, 0xD85D, 0x8C5C, 0xD85E, 0x8C5D, 0xD85F, 0x8C5E, + 0xD860, 0x8C5F, 0xD861, 0x8C60, 0xD862, 0x8C63, 0xD863, 0x8C64, + 0xD864, 0x8C65, 0xD865, 0x8C66, 0xD866, 0x8C67, 0xD867, 0x8C68, + 0xD868, 0x8C69, 0xD869, 0x8C6C, 0xD86A, 0x8C6D, 0xD86B, 0x8C6E, + 0xD86C, 0x8C6F, 0xD86D, 0x8C70, 0xD86E, 0x8C71, 0xD86F, 0x8C72, + 0xD870, 0x8C74, 0xD871, 0x8C75, 0xD872, 0x8C76, 0xD873, 0x8C77, + 0xD874, 0x8C7B, 0xD875, 0x8C7C, 0xD876, 0x8C7D, 0xD877, 0x8C7E, + 0xD878, 0x8C7F, 0xD879, 0x8C80, 0xD87A, 0x8C81, 0xD87B, 0x8C83, + 0xD87C, 0x8C84, 0xD87D, 0x8C86, 0xD87E, 0x8C87, 0xD880, 0x8C88, + 0xD881, 0x8C8B, 0xD882, 0x8C8D, 0xD883, 0x8C8E, 0xD884, 0x8C8F, + 0xD885, 0x8C90, 0xD886, 0x8C91, 0xD887, 0x8C92, 0xD888, 0x8C93, + 0xD889, 0x8C95, 0xD88A, 0x8C96, 0xD88B, 0x8C97, 0xD88C, 0x8C99, + 0xD88D, 0x8C9A, 0xD88E, 0x8C9B, 0xD88F, 0x8C9C, 0xD890, 0x8C9D, + 0xD891, 0x8C9E, 0xD892, 0x8C9F, 0xD893, 0x8CA0, 0xD894, 0x8CA1, + 0xD895, 0x8CA2, 0xD896, 0x8CA3, 0xD897, 0x8CA4, 0xD898, 0x8CA5, + 0xD899, 0x8CA6, 0xD89A, 0x8CA7, 0xD89B, 0x8CA8, 0xD89C, 0x8CA9, + 0xD89D, 0x8CAA, 0xD89E, 0x8CAB, 0xD89F, 0x8CAC, 0xD8A0, 0x8CAD, + 0xD8A1, 0x4E8D, 0xD8A2, 0x4E0C, 0xD8A3, 0x5140, 0xD8A4, 0x4E10, + 0xD8A5, 0x5EFF, 0xD8A6, 0x5345, 0xD8A7, 0x4E15, 0xD8A8, 0x4E98, + 0xD8A9, 0x4E1E, 0xD8AA, 0x9B32, 0xD8AB, 0x5B6C, 0xD8AC, 0x5669, + 0xD8AD, 0x4E28, 0xD8AE, 0x79BA, 0xD8AF, 0x4E3F, 0xD8B0, 0x5315, + 0xD8B1, 0x4E47, 0xD8B2, 0x592D, 0xD8B3, 0x723B, 0xD8B4, 0x536E, + 0xD8B5, 0x6C10, 0xD8B6, 0x56DF, 0xD8B7, 0x80E4, 0xD8B8, 0x9997, + 0xD8B9, 0x6BD3, 0xD8BA, 0x777E, 0xD8BB, 0x9F17, 0xD8BC, 0x4E36, + 0xD8BD, 0x4E9F, 0xD8BE, 0x9F10, 0xD8BF, 0x4E5C, 0xD8C0, 0x4E69, + 0xD8C1, 0x4E93, 0xD8C2, 0x8288, 0xD8C3, 0x5B5B, 0xD8C4, 0x556C, + 0xD8C5, 0x560F, 0xD8C6, 0x4EC4, 0xD8C7, 0x538D, 0xD8C8, 0x539D, + 0xD8C9, 0x53A3, 0xD8CA, 0x53A5, 0xD8CB, 0x53AE, 0xD8CC, 0x9765, + 0xD8CD, 0x8D5D, 0xD8CE, 0x531A, 0xD8CF, 0x53F5, 0xD8D0, 0x5326, + 0xD8D1, 0x532E, 0xD8D2, 0x533E, 0xD8D3, 0x8D5C, 0xD8D4, 0x5366, + 0xD8D5, 0x5363, 0xD8D6, 0x5202, 0xD8D7, 0x5208, 0xD8D8, 0x520E, + 0xD8D9, 0x522D, 0xD8DA, 0x5233, 0xD8DB, 0x523F, 0xD8DC, 0x5240, + 0xD8DD, 0x524C, 0xD8DE, 0x525E, 0xD8DF, 0x5261, 0xD8E0, 0x525C, + 0xD8E1, 0x84AF, 0xD8E2, 0x527D, 0xD8E3, 0x5282, 0xD8E4, 0x5281, + 0xD8E5, 0x5290, 0xD8E6, 0x5293, 0xD8E7, 0x5182, 0xD8E8, 0x7F54, + 0xD8E9, 0x4EBB, 0xD8EA, 0x4EC3, 0xD8EB, 0x4EC9, 0xD8EC, 0x4EC2, + 0xD8ED, 0x4EE8, 0xD8EE, 0x4EE1, 0xD8EF, 0x4EEB, 0xD8F0, 0x4EDE, + 0xD8F1, 0x4F1B, 0xD8F2, 0x4EF3, 0xD8F3, 0x4F22, 0xD8F4, 0x4F64, + 0xD8F5, 0x4EF5, 0xD8F6, 0x4F25, 0xD8F7, 0x4F27, 0xD8F8, 0x4F09, + 0xD8F9, 0x4F2B, 0xD8FA, 0x4F5E, 0xD8FB, 0x4F67, 0xD8FC, 0x6538, + 0xD8FD, 0x4F5A, 0xD8FE, 0x4F5D, 0xD940, 0x8CAE, 0xD941, 0x8CAF, + 0xD942, 0x8CB0, 0xD943, 0x8CB1, 0xD944, 0x8CB2, 0xD945, 0x8CB3, + 0xD946, 0x8CB4, 0xD947, 0x8CB5, 0xD948, 0x8CB6, 0xD949, 0x8CB7, + 0xD94A, 0x8CB8, 0xD94B, 0x8CB9, 0xD94C, 0x8CBA, 0xD94D, 0x8CBB, + 0xD94E, 0x8CBC, 0xD94F, 0x8CBD, 0xD950, 0x8CBE, 0xD951, 0x8CBF, + 0xD952, 0x8CC0, 0xD953, 0x8CC1, 0xD954, 0x8CC2, 0xD955, 0x8CC3, + 0xD956, 0x8CC4, 0xD957, 0x8CC5, 0xD958, 0x8CC6, 0xD959, 0x8CC7, + 0xD95A, 0x8CC8, 0xD95B, 0x8CC9, 0xD95C, 0x8CCA, 0xD95D, 0x8CCB, + 0xD95E, 0x8CCC, 0xD95F, 0x8CCD, 0xD960, 0x8CCE, 0xD961, 0x8CCF, + 0xD962, 0x8CD0, 0xD963, 0x8CD1, 0xD964, 0x8CD2, 0xD965, 0x8CD3, + 0xD966, 0x8CD4, 0xD967, 0x8CD5, 0xD968, 0x8CD6, 0xD969, 0x8CD7, + 0xD96A, 0x8CD8, 0xD96B, 0x8CD9, 0xD96C, 0x8CDA, 0xD96D, 0x8CDB, + 0xD96E, 0x8CDC, 0xD96F, 0x8CDD, 0xD970, 0x8CDE, 0xD971, 0x8CDF, + 0xD972, 0x8CE0, 0xD973, 0x8CE1, 0xD974, 0x8CE2, 0xD975, 0x8CE3, + 0xD976, 0x8CE4, 0xD977, 0x8CE5, 0xD978, 0x8CE6, 0xD979, 0x8CE7, + 0xD97A, 0x8CE8, 0xD97B, 0x8CE9, 0xD97C, 0x8CEA, 0xD97D, 0x8CEB, + 0xD97E, 0x8CEC, 0xD980, 0x8CED, 0xD981, 0x8CEE, 0xD982, 0x8CEF, + 0xD983, 0x8CF0, 0xD984, 0x8CF1, 0xD985, 0x8CF2, 0xD986, 0x8CF3, + 0xD987, 0x8CF4, 0xD988, 0x8CF5, 0xD989, 0x8CF6, 0xD98A, 0x8CF7, + 0xD98B, 0x8CF8, 0xD98C, 0x8CF9, 0xD98D, 0x8CFA, 0xD98E, 0x8CFB, + 0xD98F, 0x8CFC, 0xD990, 0x8CFD, 0xD991, 0x8CFE, 0xD992, 0x8CFF, + 0xD993, 0x8D00, 0xD994, 0x8D01, 0xD995, 0x8D02, 0xD996, 0x8D03, + 0xD997, 0x8D04, 0xD998, 0x8D05, 0xD999, 0x8D06, 0xD99A, 0x8D07, + 0xD99B, 0x8D08, 0xD99C, 0x8D09, 0xD99D, 0x8D0A, 0xD99E, 0x8D0B, + 0xD99F, 0x8D0C, 0xD9A0, 0x8D0D, 0xD9A1, 0x4F5F, 0xD9A2, 0x4F57, + 0xD9A3, 0x4F32, 0xD9A4, 0x4F3D, 0xD9A5, 0x4F76, 0xD9A6, 0x4F74, + 0xD9A7, 0x4F91, 0xD9A8, 0x4F89, 0xD9A9, 0x4F83, 0xD9AA, 0x4F8F, + 0xD9AB, 0x4F7E, 0xD9AC, 0x4F7B, 0xD9AD, 0x4FAA, 0xD9AE, 0x4F7C, + 0xD9AF, 0x4FAC, 0xD9B0, 0x4F94, 0xD9B1, 0x4FE6, 0xD9B2, 0x4FE8, + 0xD9B3, 0x4FEA, 0xD9B4, 0x4FC5, 0xD9B5, 0x4FDA, 0xD9B6, 0x4FE3, + 0xD9B7, 0x4FDC, 0xD9B8, 0x4FD1, 0xD9B9, 0x4FDF, 0xD9BA, 0x4FF8, + 0xD9BB, 0x5029, 0xD9BC, 0x504C, 0xD9BD, 0x4FF3, 0xD9BE, 0x502C, + 0xD9BF, 0x500F, 0xD9C0, 0x502E, 0xD9C1, 0x502D, 0xD9C2, 0x4FFE, + 0xD9C3, 0x501C, 0xD9C4, 0x500C, 0xD9C5, 0x5025, 0xD9C6, 0x5028, + 0xD9C7, 0x507E, 0xD9C8, 0x5043, 0xD9C9, 0x5055, 0xD9CA, 0x5048, + 0xD9CB, 0x504E, 0xD9CC, 0x506C, 0xD9CD, 0x507B, 0xD9CE, 0x50A5, + 0xD9CF, 0x50A7, 0xD9D0, 0x50A9, 0xD9D1, 0x50BA, 0xD9D2, 0x50D6, + 0xD9D3, 0x5106, 0xD9D4, 0x50ED, 0xD9D5, 0x50EC, 0xD9D6, 0x50E6, + 0xD9D7, 0x50EE, 0xD9D8, 0x5107, 0xD9D9, 0x510B, 0xD9DA, 0x4EDD, + 0xD9DB, 0x6C3D, 0xD9DC, 0x4F58, 0xD9DD, 0x4F65, 0xD9DE, 0x4FCE, + 0xD9DF, 0x9FA0, 0xD9E0, 0x6C46, 0xD9E1, 0x7C74, 0xD9E2, 0x516E, + 0xD9E3, 0x5DFD, 0xD9E4, 0x9EC9, 0xD9E5, 0x9998, 0xD9E6, 0x5181, + 0xD9E7, 0x5914, 0xD9E8, 0x52F9, 0xD9E9, 0x530D, 0xD9EA, 0x8A07, + 0xD9EB, 0x5310, 0xD9EC, 0x51EB, 0xD9ED, 0x5919, 0xD9EE, 0x5155, + 0xD9EF, 0x4EA0, 0xD9F0, 0x5156, 0xD9F1, 0x4EB3, 0xD9F2, 0x886E, + 0xD9F3, 0x88A4, 0xD9F4, 0x4EB5, 0xD9F5, 0x8114, 0xD9F6, 0x88D2, + 0xD9F7, 0x7980, 0xD9F8, 0x5B34, 0xD9F9, 0x8803, 0xD9FA, 0x7FB8, + 0xD9FB, 0x51AB, 0xD9FC, 0x51B1, 0xD9FD, 0x51BD, 0xD9FE, 0x51BC, + 0xDA40, 0x8D0E, 0xDA41, 0x8D0F, 0xDA42, 0x8D10, 0xDA43, 0x8D11, + 0xDA44, 0x8D12, 0xDA45, 0x8D13, 0xDA46, 0x8D14, 0xDA47, 0x8D15, + 0xDA48, 0x8D16, 0xDA49, 0x8D17, 0xDA4A, 0x8D18, 0xDA4B, 0x8D19, + 0xDA4C, 0x8D1A, 0xDA4D, 0x8D1B, 0xDA4E, 0x8D1C, 0xDA4F, 0x8D20, + 0xDA50, 0x8D51, 0xDA51, 0x8D52, 0xDA52, 0x8D57, 0xDA53, 0x8D5F, + 0xDA54, 0x8D65, 0xDA55, 0x8D68, 0xDA56, 0x8D69, 0xDA57, 0x8D6A, + 0xDA58, 0x8D6C, 0xDA59, 0x8D6E, 0xDA5A, 0x8D6F, 0xDA5B, 0x8D71, + 0xDA5C, 0x8D72, 0xDA5D, 0x8D78, 0xDA5E, 0x8D79, 0xDA5F, 0x8D7A, + 0xDA60, 0x8D7B, 0xDA61, 0x8D7C, 0xDA62, 0x8D7D, 0xDA63, 0x8D7E, + 0xDA64, 0x8D7F, 0xDA65, 0x8D80, 0xDA66, 0x8D82, 0xDA67, 0x8D83, + 0xDA68, 0x8D86, 0xDA69, 0x8D87, 0xDA6A, 0x8D88, 0xDA6B, 0x8D89, + 0xDA6C, 0x8D8C, 0xDA6D, 0x8D8D, 0xDA6E, 0x8D8E, 0xDA6F, 0x8D8F, + 0xDA70, 0x8D90, 0xDA71, 0x8D92, 0xDA72, 0x8D93, 0xDA73, 0x8D95, + 0xDA74, 0x8D96, 0xDA75, 0x8D97, 0xDA76, 0x8D98, 0xDA77, 0x8D99, + 0xDA78, 0x8D9A, 0xDA79, 0x8D9B, 0xDA7A, 0x8D9C, 0xDA7B, 0x8D9D, + 0xDA7C, 0x8D9E, 0xDA7D, 0x8DA0, 0xDA7E, 0x8DA1, 0xDA80, 0x8DA2, + 0xDA81, 0x8DA4, 0xDA82, 0x8DA5, 0xDA83, 0x8DA6, 0xDA84, 0x8DA7, + 0xDA85, 0x8DA8, 0xDA86, 0x8DA9, 0xDA87, 0x8DAA, 0xDA88, 0x8DAB, + 0xDA89, 0x8DAC, 0xDA8A, 0x8DAD, 0xDA8B, 0x8DAE, 0xDA8C, 0x8DAF, + 0xDA8D, 0x8DB0, 0xDA8E, 0x8DB2, 0xDA8F, 0x8DB6, 0xDA90, 0x8DB7, + 0xDA91, 0x8DB9, 0xDA92, 0x8DBB, 0xDA93, 0x8DBD, 0xDA94, 0x8DC0, + 0xDA95, 0x8DC1, 0xDA96, 0x8DC2, 0xDA97, 0x8DC5, 0xDA98, 0x8DC7, + 0xDA99, 0x8DC8, 0xDA9A, 0x8DC9, 0xDA9B, 0x8DCA, 0xDA9C, 0x8DCD, + 0xDA9D, 0x8DD0, 0xDA9E, 0x8DD2, 0xDA9F, 0x8DD3, 0xDAA0, 0x8DD4, + 0xDAA1, 0x51C7, 0xDAA2, 0x5196, 0xDAA3, 0x51A2, 0xDAA4, 0x51A5, + 0xDAA5, 0x8BA0, 0xDAA6, 0x8BA6, 0xDAA7, 0x8BA7, 0xDAA8, 0x8BAA, + 0xDAA9, 0x8BB4, 0xDAAA, 0x8BB5, 0xDAAB, 0x8BB7, 0xDAAC, 0x8BC2, + 0xDAAD, 0x8BC3, 0xDAAE, 0x8BCB, 0xDAAF, 0x8BCF, 0xDAB0, 0x8BCE, + 0xDAB1, 0x8BD2, 0xDAB2, 0x8BD3, 0xDAB3, 0x8BD4, 0xDAB4, 0x8BD6, + 0xDAB5, 0x8BD8, 0xDAB6, 0x8BD9, 0xDAB7, 0x8BDC, 0xDAB8, 0x8BDF, + 0xDAB9, 0x8BE0, 0xDABA, 0x8BE4, 0xDABB, 0x8BE8, 0xDABC, 0x8BE9, + 0xDABD, 0x8BEE, 0xDABE, 0x8BF0, 0xDABF, 0x8BF3, 0xDAC0, 0x8BF6, + 0xDAC1, 0x8BF9, 0xDAC2, 0x8BFC, 0xDAC3, 0x8BFF, 0xDAC4, 0x8C00, + 0xDAC5, 0x8C02, 0xDAC6, 0x8C04, 0xDAC7, 0x8C07, 0xDAC8, 0x8C0C, + 0xDAC9, 0x8C0F, 0xDACA, 0x8C11, 0xDACB, 0x8C12, 0xDACC, 0x8C14, + 0xDACD, 0x8C15, 0xDACE, 0x8C16, 0xDACF, 0x8C19, 0xDAD0, 0x8C1B, + 0xDAD1, 0x8C18, 0xDAD2, 0x8C1D, 0xDAD3, 0x8C1F, 0xDAD4, 0x8C20, + 0xDAD5, 0x8C21, 0xDAD6, 0x8C25, 0xDAD7, 0x8C27, 0xDAD8, 0x8C2A, + 0xDAD9, 0x8C2B, 0xDADA, 0x8C2E, 0xDADB, 0x8C2F, 0xDADC, 0x8C32, + 0xDADD, 0x8C33, 0xDADE, 0x8C35, 0xDADF, 0x8C36, 0xDAE0, 0x5369, + 0xDAE1, 0x537A, 0xDAE2, 0x961D, 0xDAE3, 0x9622, 0xDAE4, 0x9621, + 0xDAE5, 0x9631, 0xDAE6, 0x962A, 0xDAE7, 0x963D, 0xDAE8, 0x963C, + 0xDAE9, 0x9642, 0xDAEA, 0x9649, 0xDAEB, 0x9654, 0xDAEC, 0x965F, + 0xDAED, 0x9667, 0xDAEE, 0x966C, 0xDAEF, 0x9672, 0xDAF0, 0x9674, + 0xDAF1, 0x9688, 0xDAF2, 0x968D, 0xDAF3, 0x9697, 0xDAF4, 0x96B0, + 0xDAF5, 0x9097, 0xDAF6, 0x909B, 0xDAF7, 0x909D, 0xDAF8, 0x9099, + 0xDAF9, 0x90AC, 0xDAFA, 0x90A1, 0xDAFB, 0x90B4, 0xDAFC, 0x90B3, + 0xDAFD, 0x90B6, 0xDAFE, 0x90BA, 0xDB40, 0x8DD5, 0xDB41, 0x8DD8, + 0xDB42, 0x8DD9, 0xDB43, 0x8DDC, 0xDB44, 0x8DE0, 0xDB45, 0x8DE1, + 0xDB46, 0x8DE2, 0xDB47, 0x8DE5, 0xDB48, 0x8DE6, 0xDB49, 0x8DE7, + 0xDB4A, 0x8DE9, 0xDB4B, 0x8DED, 0xDB4C, 0x8DEE, 0xDB4D, 0x8DF0, + 0xDB4E, 0x8DF1, 0xDB4F, 0x8DF2, 0xDB50, 0x8DF4, 0xDB51, 0x8DF6, + 0xDB52, 0x8DFC, 0xDB53, 0x8DFE, 0xDB54, 0x8DFF, 0xDB55, 0x8E00, + 0xDB56, 0x8E01, 0xDB57, 0x8E02, 0xDB58, 0x8E03, 0xDB59, 0x8E04, + 0xDB5A, 0x8E06, 0xDB5B, 0x8E07, 0xDB5C, 0x8E08, 0xDB5D, 0x8E0B, + 0xDB5E, 0x8E0D, 0xDB5F, 0x8E0E, 0xDB60, 0x8E10, 0xDB61, 0x8E11, + 0xDB62, 0x8E12, 0xDB63, 0x8E13, 0xDB64, 0x8E15, 0xDB65, 0x8E16, + 0xDB66, 0x8E17, 0xDB67, 0x8E18, 0xDB68, 0x8E19, 0xDB69, 0x8E1A, + 0xDB6A, 0x8E1B, 0xDB6B, 0x8E1C, 0xDB6C, 0x8E20, 0xDB6D, 0x8E21, + 0xDB6E, 0x8E24, 0xDB6F, 0x8E25, 0xDB70, 0x8E26, 0xDB71, 0x8E27, + 0xDB72, 0x8E28, 0xDB73, 0x8E2B, 0xDB74, 0x8E2D, 0xDB75, 0x8E30, + 0xDB76, 0x8E32, 0xDB77, 0x8E33, 0xDB78, 0x8E34, 0xDB79, 0x8E36, + 0xDB7A, 0x8E37, 0xDB7B, 0x8E38, 0xDB7C, 0x8E3B, 0xDB7D, 0x8E3C, + 0xDB7E, 0x8E3E, 0xDB80, 0x8E3F, 0xDB81, 0x8E43, 0xDB82, 0x8E45, + 0xDB83, 0x8E46, 0xDB84, 0x8E4C, 0xDB85, 0x8E4D, 0xDB86, 0x8E4E, + 0xDB87, 0x8E4F, 0xDB88, 0x8E50, 0xDB89, 0x8E53, 0xDB8A, 0x8E54, + 0xDB8B, 0x8E55, 0xDB8C, 0x8E56, 0xDB8D, 0x8E57, 0xDB8E, 0x8E58, + 0xDB8F, 0x8E5A, 0xDB90, 0x8E5B, 0xDB91, 0x8E5C, 0xDB92, 0x8E5D, + 0xDB93, 0x8E5E, 0xDB94, 0x8E5F, 0xDB95, 0x8E60, 0xDB96, 0x8E61, + 0xDB97, 0x8E62, 0xDB98, 0x8E63, 0xDB99, 0x8E64, 0xDB9A, 0x8E65, + 0xDB9B, 0x8E67, 0xDB9C, 0x8E68, 0xDB9D, 0x8E6A, 0xDB9E, 0x8E6B, + 0xDB9F, 0x8E6E, 0xDBA0, 0x8E71, 0xDBA1, 0x90B8, 0xDBA2, 0x90B0, + 0xDBA3, 0x90CF, 0xDBA4, 0x90C5, 0xDBA5, 0x90BE, 0xDBA6, 0x90D0, + 0xDBA7, 0x90C4, 0xDBA8, 0x90C7, 0xDBA9, 0x90D3, 0xDBAA, 0x90E6, + 0xDBAB, 0x90E2, 0xDBAC, 0x90DC, 0xDBAD, 0x90D7, 0xDBAE, 0x90DB, + 0xDBAF, 0x90EB, 0xDBB0, 0x90EF, 0xDBB1, 0x90FE, 0xDBB2, 0x9104, + 0xDBB3, 0x9122, 0xDBB4, 0x911E, 0xDBB5, 0x9123, 0xDBB6, 0x9131, + 0xDBB7, 0x912F, 0xDBB8, 0x9139, 0xDBB9, 0x9143, 0xDBBA, 0x9146, + 0xDBBB, 0x520D, 0xDBBC, 0x5942, 0xDBBD, 0x52A2, 0xDBBE, 0x52AC, + 0xDBBF, 0x52AD, 0xDBC0, 0x52BE, 0xDBC1, 0x54FF, 0xDBC2, 0x52D0, + 0xDBC3, 0x52D6, 0xDBC4, 0x52F0, 0xDBC5, 0x53DF, 0xDBC6, 0x71EE, + 0xDBC7, 0x77CD, 0xDBC8, 0x5EF4, 0xDBC9, 0x51F5, 0xDBCA, 0x51FC, + 0xDBCB, 0x9B2F, 0xDBCC, 0x53B6, 0xDBCD, 0x5F01, 0xDBCE, 0x755A, + 0xDBCF, 0x5DEF, 0xDBD0, 0x574C, 0xDBD1, 0x57A9, 0xDBD2, 0x57A1, + 0xDBD3, 0x587E, 0xDBD4, 0x58BC, 0xDBD5, 0x58C5, 0xDBD6, 0x58D1, + 0xDBD7, 0x5729, 0xDBD8, 0x572C, 0xDBD9, 0x572A, 0xDBDA, 0x5733, + 0xDBDB, 0x5739, 0xDBDC, 0x572E, 0xDBDD, 0x572F, 0xDBDE, 0x575C, + 0xDBDF, 0x573B, 0xDBE0, 0x5742, 0xDBE1, 0x5769, 0xDBE2, 0x5785, + 0xDBE3, 0x576B, 0xDBE4, 0x5786, 0xDBE5, 0x577C, 0xDBE6, 0x577B, + 0xDBE7, 0x5768, 0xDBE8, 0x576D, 0xDBE9, 0x5776, 0xDBEA, 0x5773, + 0xDBEB, 0x57AD, 0xDBEC, 0x57A4, 0xDBED, 0x578C, 0xDBEE, 0x57B2, + 0xDBEF, 0x57CF, 0xDBF0, 0x57A7, 0xDBF1, 0x57B4, 0xDBF2, 0x5793, + 0xDBF3, 0x57A0, 0xDBF4, 0x57D5, 0xDBF5, 0x57D8, 0xDBF6, 0x57DA, + 0xDBF7, 0x57D9, 0xDBF8, 0x57D2, 0xDBF9, 0x57B8, 0xDBFA, 0x57F4, + 0xDBFB, 0x57EF, 0xDBFC, 0x57F8, 0xDBFD, 0x57E4, 0xDBFE, 0x57DD, + 0xDC40, 0x8E73, 0xDC41, 0x8E75, 0xDC42, 0x8E77, 0xDC43, 0x8E78, + 0xDC44, 0x8E79, 0xDC45, 0x8E7A, 0xDC46, 0x8E7B, 0xDC47, 0x8E7D, + 0xDC48, 0x8E7E, 0xDC49, 0x8E80, 0xDC4A, 0x8E82, 0xDC4B, 0x8E83, + 0xDC4C, 0x8E84, 0xDC4D, 0x8E86, 0xDC4E, 0x8E88, 0xDC4F, 0x8E89, + 0xDC50, 0x8E8A, 0xDC51, 0x8E8B, 0xDC52, 0x8E8C, 0xDC53, 0x8E8D, + 0xDC54, 0x8E8E, 0xDC55, 0x8E91, 0xDC56, 0x8E92, 0xDC57, 0x8E93, + 0xDC58, 0x8E95, 0xDC59, 0x8E96, 0xDC5A, 0x8E97, 0xDC5B, 0x8E98, + 0xDC5C, 0x8E99, 0xDC5D, 0x8E9A, 0xDC5E, 0x8E9B, 0xDC5F, 0x8E9D, + 0xDC60, 0x8E9F, 0xDC61, 0x8EA0, 0xDC62, 0x8EA1, 0xDC63, 0x8EA2, + 0xDC64, 0x8EA3, 0xDC65, 0x8EA4, 0xDC66, 0x8EA5, 0xDC67, 0x8EA6, + 0xDC68, 0x8EA7, 0xDC69, 0x8EA8, 0xDC6A, 0x8EA9, 0xDC6B, 0x8EAA, + 0xDC6C, 0x8EAD, 0xDC6D, 0x8EAE, 0xDC6E, 0x8EB0, 0xDC6F, 0x8EB1, + 0xDC70, 0x8EB3, 0xDC71, 0x8EB4, 0xDC72, 0x8EB5, 0xDC73, 0x8EB6, + 0xDC74, 0x8EB7, 0xDC75, 0x8EB8, 0xDC76, 0x8EB9, 0xDC77, 0x8EBB, + 0xDC78, 0x8EBC, 0xDC79, 0x8EBD, 0xDC7A, 0x8EBE, 0xDC7B, 0x8EBF, + 0xDC7C, 0x8EC0, 0xDC7D, 0x8EC1, 0xDC7E, 0x8EC2, 0xDC80, 0x8EC3, + 0xDC81, 0x8EC4, 0xDC82, 0x8EC5, 0xDC83, 0x8EC6, 0xDC84, 0x8EC7, + 0xDC85, 0x8EC8, 0xDC86, 0x8EC9, 0xDC87, 0x8ECA, 0xDC88, 0x8ECB, + 0xDC89, 0x8ECC, 0xDC8A, 0x8ECD, 0xDC8B, 0x8ECF, 0xDC8C, 0x8ED0, + 0xDC8D, 0x8ED1, 0xDC8E, 0x8ED2, 0xDC8F, 0x8ED3, 0xDC90, 0x8ED4, + 0xDC91, 0x8ED5, 0xDC92, 0x8ED6, 0xDC93, 0x8ED7, 0xDC94, 0x8ED8, + 0xDC95, 0x8ED9, 0xDC96, 0x8EDA, 0xDC97, 0x8EDB, 0xDC98, 0x8EDC, + 0xDC99, 0x8EDD, 0xDC9A, 0x8EDE, 0xDC9B, 0x8EDF, 0xDC9C, 0x8EE0, + 0xDC9D, 0x8EE1, 0xDC9E, 0x8EE2, 0xDC9F, 0x8EE3, 0xDCA0, 0x8EE4, + 0xDCA1, 0x580B, 0xDCA2, 0x580D, 0xDCA3, 0x57FD, 0xDCA4, 0x57ED, + 0xDCA5, 0x5800, 0xDCA6, 0x581E, 0xDCA7, 0x5819, 0xDCA8, 0x5844, + 0xDCA9, 0x5820, 0xDCAA, 0x5865, 0xDCAB, 0x586C, 0xDCAC, 0x5881, + 0xDCAD, 0x5889, 0xDCAE, 0x589A, 0xDCAF, 0x5880, 0xDCB0, 0x99A8, + 0xDCB1, 0x9F19, 0xDCB2, 0x61FF, 0xDCB3, 0x8279, 0xDCB4, 0x827D, + 0xDCB5, 0x827F, 0xDCB6, 0x828F, 0xDCB7, 0x828A, 0xDCB8, 0x82A8, + 0xDCB9, 0x8284, 0xDCBA, 0x828E, 0xDCBB, 0x8291, 0xDCBC, 0x8297, + 0xDCBD, 0x8299, 0xDCBE, 0x82AB, 0xDCBF, 0x82B8, 0xDCC0, 0x82BE, + 0xDCC1, 0x82B0, 0xDCC2, 0x82C8, 0xDCC3, 0x82CA, 0xDCC4, 0x82E3, + 0xDCC5, 0x8298, 0xDCC6, 0x82B7, 0xDCC7, 0x82AE, 0xDCC8, 0x82CB, + 0xDCC9, 0x82CC, 0xDCCA, 0x82C1, 0xDCCB, 0x82A9, 0xDCCC, 0x82B4, + 0xDCCD, 0x82A1, 0xDCCE, 0x82AA, 0xDCCF, 0x829F, 0xDCD0, 0x82C4, + 0xDCD1, 0x82CE, 0xDCD2, 0x82A4, 0xDCD3, 0x82E1, 0xDCD4, 0x8309, + 0xDCD5, 0x82F7, 0xDCD6, 0x82E4, 0xDCD7, 0x830F, 0xDCD8, 0x8307, + 0xDCD9, 0x82DC, 0xDCDA, 0x82F4, 0xDCDB, 0x82D2, 0xDCDC, 0x82D8, + 0xDCDD, 0x830C, 0xDCDE, 0x82FB, 0xDCDF, 0x82D3, 0xDCE0, 0x8311, + 0xDCE1, 0x831A, 0xDCE2, 0x8306, 0xDCE3, 0x8314, 0xDCE4, 0x8315, + 0xDCE5, 0x82E0, 0xDCE6, 0x82D5, 0xDCE7, 0x831C, 0xDCE8, 0x8351, + 0xDCE9, 0x835B, 0xDCEA, 0x835C, 0xDCEB, 0x8308, 0xDCEC, 0x8392, + 0xDCED, 0x833C, 0xDCEE, 0x8334, 0xDCEF, 0x8331, 0xDCF0, 0x839B, + 0xDCF1, 0x835E, 0xDCF2, 0x832F, 0xDCF3, 0x834F, 0xDCF4, 0x8347, + 0xDCF5, 0x8343, 0xDCF6, 0x835F, 0xDCF7, 0x8340, 0xDCF8, 0x8317, + 0xDCF9, 0x8360, 0xDCFA, 0x832D, 0xDCFB, 0x833A, 0xDCFC, 0x8333, + 0xDCFD, 0x8366, 0xDCFE, 0x8365, 0xDD40, 0x8EE5, 0xDD41, 0x8EE6, + 0xDD42, 0x8EE7, 0xDD43, 0x8EE8, 0xDD44, 0x8EE9, 0xDD45, 0x8EEA, + 0xDD46, 0x8EEB, 0xDD47, 0x8EEC, 0xDD48, 0x8EED, 0xDD49, 0x8EEE, + 0xDD4A, 0x8EEF, 0xDD4B, 0x8EF0, 0xDD4C, 0x8EF1, 0xDD4D, 0x8EF2, + 0xDD4E, 0x8EF3, 0xDD4F, 0x8EF4, 0xDD50, 0x8EF5, 0xDD51, 0x8EF6, + 0xDD52, 0x8EF7, 0xDD53, 0x8EF8, 0xDD54, 0x8EF9, 0xDD55, 0x8EFA, + 0xDD56, 0x8EFB, 0xDD57, 0x8EFC, 0xDD58, 0x8EFD, 0xDD59, 0x8EFE, + 0xDD5A, 0x8EFF, 0xDD5B, 0x8F00, 0xDD5C, 0x8F01, 0xDD5D, 0x8F02, + 0xDD5E, 0x8F03, 0xDD5F, 0x8F04, 0xDD60, 0x8F05, 0xDD61, 0x8F06, + 0xDD62, 0x8F07, 0xDD63, 0x8F08, 0xDD64, 0x8F09, 0xDD65, 0x8F0A, + 0xDD66, 0x8F0B, 0xDD67, 0x8F0C, 0xDD68, 0x8F0D, 0xDD69, 0x8F0E, + 0xDD6A, 0x8F0F, 0xDD6B, 0x8F10, 0xDD6C, 0x8F11, 0xDD6D, 0x8F12, + 0xDD6E, 0x8F13, 0xDD6F, 0x8F14, 0xDD70, 0x8F15, 0xDD71, 0x8F16, + 0xDD72, 0x8F17, 0xDD73, 0x8F18, 0xDD74, 0x8F19, 0xDD75, 0x8F1A, + 0xDD76, 0x8F1B, 0xDD77, 0x8F1C, 0xDD78, 0x8F1D, 0xDD79, 0x8F1E, + 0xDD7A, 0x8F1F, 0xDD7B, 0x8F20, 0xDD7C, 0x8F21, 0xDD7D, 0x8F22, + 0xDD7E, 0x8F23, 0xDD80, 0x8F24, 0xDD81, 0x8F25, 0xDD82, 0x8F26, + 0xDD83, 0x8F27, 0xDD84, 0x8F28, 0xDD85, 0x8F29, 0xDD86, 0x8F2A, + 0xDD87, 0x8F2B, 0xDD88, 0x8F2C, 0xDD89, 0x8F2D, 0xDD8A, 0x8F2E, + 0xDD8B, 0x8F2F, 0xDD8C, 0x8F30, 0xDD8D, 0x8F31, 0xDD8E, 0x8F32, + 0xDD8F, 0x8F33, 0xDD90, 0x8F34, 0xDD91, 0x8F35, 0xDD92, 0x8F36, + 0xDD93, 0x8F37, 0xDD94, 0x8F38, 0xDD95, 0x8F39, 0xDD96, 0x8F3A, + 0xDD97, 0x8F3B, 0xDD98, 0x8F3C, 0xDD99, 0x8F3D, 0xDD9A, 0x8F3E, + 0xDD9B, 0x8F3F, 0xDD9C, 0x8F40, 0xDD9D, 0x8F41, 0xDD9E, 0x8F42, + 0xDD9F, 0x8F43, 0xDDA0, 0x8F44, 0xDDA1, 0x8368, 0xDDA2, 0x831B, + 0xDDA3, 0x8369, 0xDDA4, 0x836C, 0xDDA5, 0x836A, 0xDDA6, 0x836D, + 0xDDA7, 0x836E, 0xDDA8, 0x83B0, 0xDDA9, 0x8378, 0xDDAA, 0x83B3, + 0xDDAB, 0x83B4, 0xDDAC, 0x83A0, 0xDDAD, 0x83AA, 0xDDAE, 0x8393, + 0xDDAF, 0x839C, 0xDDB0, 0x8385, 0xDDB1, 0x837C, 0xDDB2, 0x83B6, + 0xDDB3, 0x83A9, 0xDDB4, 0x837D, 0xDDB5, 0x83B8, 0xDDB6, 0x837B, + 0xDDB7, 0x8398, 0xDDB8, 0x839E, 0xDDB9, 0x83A8, 0xDDBA, 0x83BA, + 0xDDBB, 0x83BC, 0xDDBC, 0x83C1, 0xDDBD, 0x8401, 0xDDBE, 0x83E5, + 0xDDBF, 0x83D8, 0xDDC0, 0x5807, 0xDDC1, 0x8418, 0xDDC2, 0x840B, + 0xDDC3, 0x83DD, 0xDDC4, 0x83FD, 0xDDC5, 0x83D6, 0xDDC6, 0x841C, + 0xDDC7, 0x8438, 0xDDC8, 0x8411, 0xDDC9, 0x8406, 0xDDCA, 0x83D4, + 0xDDCB, 0x83DF, 0xDDCC, 0x840F, 0xDDCD, 0x8403, 0xDDCE, 0x83F8, + 0xDDCF, 0x83F9, 0xDDD0, 0x83EA, 0xDDD1, 0x83C5, 0xDDD2, 0x83C0, + 0xDDD3, 0x8426, 0xDDD4, 0x83F0, 0xDDD5, 0x83E1, 0xDDD6, 0x845C, + 0xDDD7, 0x8451, 0xDDD8, 0x845A, 0xDDD9, 0x8459, 0xDDDA, 0x8473, + 0xDDDB, 0x8487, 0xDDDC, 0x8488, 0xDDDD, 0x847A, 0xDDDE, 0x8489, + 0xDDDF, 0x8478, 0xDDE0, 0x843C, 0xDDE1, 0x8446, 0xDDE2, 0x8469, + 0xDDE3, 0x8476, 0xDDE4, 0x848C, 0xDDE5, 0x848E, 0xDDE6, 0x8431, + 0xDDE7, 0x846D, 0xDDE8, 0x84C1, 0xDDE9, 0x84CD, 0xDDEA, 0x84D0, + 0xDDEB, 0x84E6, 0xDDEC, 0x84BD, 0xDDED, 0x84D3, 0xDDEE, 0x84CA, + 0xDDEF, 0x84BF, 0xDDF0, 0x84BA, 0xDDF1, 0x84E0, 0xDDF2, 0x84A1, + 0xDDF3, 0x84B9, 0xDDF4, 0x84B4, 0xDDF5, 0x8497, 0xDDF6, 0x84E5, + 0xDDF7, 0x84E3, 0xDDF8, 0x850C, 0xDDF9, 0x750D, 0xDDFA, 0x8538, + 0xDDFB, 0x84F0, 0xDDFC, 0x8539, 0xDDFD, 0x851F, 0xDDFE, 0x853A, + 0xDE40, 0x8F45, 0xDE41, 0x8F46, 0xDE42, 0x8F47, 0xDE43, 0x8F48, + 0xDE44, 0x8F49, 0xDE45, 0x8F4A, 0xDE46, 0x8F4B, 0xDE47, 0x8F4C, + 0xDE48, 0x8F4D, 0xDE49, 0x8F4E, 0xDE4A, 0x8F4F, 0xDE4B, 0x8F50, + 0xDE4C, 0x8F51, 0xDE4D, 0x8F52, 0xDE4E, 0x8F53, 0xDE4F, 0x8F54, + 0xDE50, 0x8F55, 0xDE51, 0x8F56, 0xDE52, 0x8F57, 0xDE53, 0x8F58, + 0xDE54, 0x8F59, 0xDE55, 0x8F5A, 0xDE56, 0x8F5B, 0xDE57, 0x8F5C, + 0xDE58, 0x8F5D, 0xDE59, 0x8F5E, 0xDE5A, 0x8F5F, 0xDE5B, 0x8F60, + 0xDE5C, 0x8F61, 0xDE5D, 0x8F62, 0xDE5E, 0x8F63, 0xDE5F, 0x8F64, + 0xDE60, 0x8F65, 0xDE61, 0x8F6A, 0xDE62, 0x8F80, 0xDE63, 0x8F8C, + 0xDE64, 0x8F92, 0xDE65, 0x8F9D, 0xDE66, 0x8FA0, 0xDE67, 0x8FA1, + 0xDE68, 0x8FA2, 0xDE69, 0x8FA4, 0xDE6A, 0x8FA5, 0xDE6B, 0x8FA6, + 0xDE6C, 0x8FA7, 0xDE6D, 0x8FAA, 0xDE6E, 0x8FAC, 0xDE6F, 0x8FAD, + 0xDE70, 0x8FAE, 0xDE71, 0x8FAF, 0xDE72, 0x8FB2, 0xDE73, 0x8FB3, + 0xDE74, 0x8FB4, 0xDE75, 0x8FB5, 0xDE76, 0x8FB7, 0xDE77, 0x8FB8, + 0xDE78, 0x8FBA, 0xDE79, 0x8FBB, 0xDE7A, 0x8FBC, 0xDE7B, 0x8FBF, + 0xDE7C, 0x8FC0, 0xDE7D, 0x8FC3, 0xDE7E, 0x8FC6, 0xDE80, 0x8FC9, + 0xDE81, 0x8FCA, 0xDE82, 0x8FCB, 0xDE83, 0x8FCC, 0xDE84, 0x8FCD, + 0xDE85, 0x8FCF, 0xDE86, 0x8FD2, 0xDE87, 0x8FD6, 0xDE88, 0x8FD7, + 0xDE89, 0x8FDA, 0xDE8A, 0x8FE0, 0xDE8B, 0x8FE1, 0xDE8C, 0x8FE3, + 0xDE8D, 0x8FE7, 0xDE8E, 0x8FEC, 0xDE8F, 0x8FEF, 0xDE90, 0x8FF1, + 0xDE91, 0x8FF2, 0xDE92, 0x8FF4, 0xDE93, 0x8FF5, 0xDE94, 0x8FF6, + 0xDE95, 0x8FFA, 0xDE96, 0x8FFB, 0xDE97, 0x8FFC, 0xDE98, 0x8FFE, + 0xDE99, 0x8FFF, 0xDE9A, 0x9007, 0xDE9B, 0x9008, 0xDE9C, 0x900C, + 0xDE9D, 0x900E, 0xDE9E, 0x9013, 0xDE9F, 0x9015, 0xDEA0, 0x9018, + 0xDEA1, 0x8556, 0xDEA2, 0x853B, 0xDEA3, 0x84FF, 0xDEA4, 0x84FC, + 0xDEA5, 0x8559, 0xDEA6, 0x8548, 0xDEA7, 0x8568, 0xDEA8, 0x8564, + 0xDEA9, 0x855E, 0xDEAA, 0x857A, 0xDEAB, 0x77A2, 0xDEAC, 0x8543, + 0xDEAD, 0x8572, 0xDEAE, 0x857B, 0xDEAF, 0x85A4, 0xDEB0, 0x85A8, + 0xDEB1, 0x8587, 0xDEB2, 0x858F, 0xDEB3, 0x8579, 0xDEB4, 0x85AE, + 0xDEB5, 0x859C, 0xDEB6, 0x8585, 0xDEB7, 0x85B9, 0xDEB8, 0x85B7, + 0xDEB9, 0x85B0, 0xDEBA, 0x85D3, 0xDEBB, 0x85C1, 0xDEBC, 0x85DC, + 0xDEBD, 0x85FF, 0xDEBE, 0x8627, 0xDEBF, 0x8605, 0xDEC0, 0x8629, + 0xDEC1, 0x8616, 0xDEC2, 0x863C, 0xDEC3, 0x5EFE, 0xDEC4, 0x5F08, + 0xDEC5, 0x593C, 0xDEC6, 0x5941, 0xDEC7, 0x8037, 0xDEC8, 0x5955, + 0xDEC9, 0x595A, 0xDECA, 0x5958, 0xDECB, 0x530F, 0xDECC, 0x5C22, + 0xDECD, 0x5C25, 0xDECE, 0x5C2C, 0xDECF, 0x5C34, 0xDED0, 0x624C, + 0xDED1, 0x626A, 0xDED2, 0x629F, 0xDED3, 0x62BB, 0xDED4, 0x62CA, + 0xDED5, 0x62DA, 0xDED6, 0x62D7, 0xDED7, 0x62EE, 0xDED8, 0x6322, + 0xDED9, 0x62F6, 0xDEDA, 0x6339, 0xDEDB, 0x634B, 0xDEDC, 0x6343, + 0xDEDD, 0x63AD, 0xDEDE, 0x63F6, 0xDEDF, 0x6371, 0xDEE0, 0x637A, + 0xDEE1, 0x638E, 0xDEE2, 0x63B4, 0xDEE3, 0x636D, 0xDEE4, 0x63AC, + 0xDEE5, 0x638A, 0xDEE6, 0x6369, 0xDEE7, 0x63AE, 0xDEE8, 0x63BC, + 0xDEE9, 0x63F2, 0xDEEA, 0x63F8, 0xDEEB, 0x63E0, 0xDEEC, 0x63FF, + 0xDEED, 0x63C4, 0xDEEE, 0x63DE, 0xDEEF, 0x63CE, 0xDEF0, 0x6452, + 0xDEF1, 0x63C6, 0xDEF2, 0x63BE, 0xDEF3, 0x6445, 0xDEF4, 0x6441, + 0xDEF5, 0x640B, 0xDEF6, 0x641B, 0xDEF7, 0x6420, 0xDEF8, 0x640C, + 0xDEF9, 0x6426, 0xDEFA, 0x6421, 0xDEFB, 0x645E, 0xDEFC, 0x6484, + 0xDEFD, 0x646D, 0xDEFE, 0x6496, 0xDF40, 0x9019, 0xDF41, 0x901C, + 0xDF42, 0x9023, 0xDF43, 0x9024, 0xDF44, 0x9025, 0xDF45, 0x9027, + 0xDF46, 0x9028, 0xDF47, 0x9029, 0xDF48, 0x902A, 0xDF49, 0x902B, + 0xDF4A, 0x902C, 0xDF4B, 0x9030, 0xDF4C, 0x9031, 0xDF4D, 0x9032, + 0xDF4E, 0x9033, 0xDF4F, 0x9034, 0xDF50, 0x9037, 0xDF51, 0x9039, + 0xDF52, 0x903A, 0xDF53, 0x903D, 0xDF54, 0x903F, 0xDF55, 0x9040, + 0xDF56, 0x9043, 0xDF57, 0x9045, 0xDF58, 0x9046, 0xDF59, 0x9048, + 0xDF5A, 0x9049, 0xDF5B, 0x904A, 0xDF5C, 0x904B, 0xDF5D, 0x904C, + 0xDF5E, 0x904E, 0xDF5F, 0x9054, 0xDF60, 0x9055, 0xDF61, 0x9056, + 0xDF62, 0x9059, 0xDF63, 0x905A, 0xDF64, 0x905C, 0xDF65, 0x905D, + 0xDF66, 0x905E, 0xDF67, 0x905F, 0xDF68, 0x9060, 0xDF69, 0x9061, + 0xDF6A, 0x9064, 0xDF6B, 0x9066, 0xDF6C, 0x9067, 0xDF6D, 0x9069, + 0xDF6E, 0x906A, 0xDF6F, 0x906B, 0xDF70, 0x906C, 0xDF71, 0x906F, + 0xDF72, 0x9070, 0xDF73, 0x9071, 0xDF74, 0x9072, 0xDF75, 0x9073, + 0xDF76, 0x9076, 0xDF77, 0x9077, 0xDF78, 0x9078, 0xDF79, 0x9079, + 0xDF7A, 0x907A, 0xDF7B, 0x907B, 0xDF7C, 0x907C, 0xDF7D, 0x907E, + 0xDF7E, 0x9081, 0xDF80, 0x9084, 0xDF81, 0x9085, 0xDF82, 0x9086, + 0xDF83, 0x9087, 0xDF84, 0x9089, 0xDF85, 0x908A, 0xDF86, 0x908C, + 0xDF87, 0x908D, 0xDF88, 0x908E, 0xDF89, 0x908F, 0xDF8A, 0x9090, + 0xDF8B, 0x9092, 0xDF8C, 0x9094, 0xDF8D, 0x9096, 0xDF8E, 0x9098, + 0xDF8F, 0x909A, 0xDF90, 0x909C, 0xDF91, 0x909E, 0xDF92, 0x909F, + 0xDF93, 0x90A0, 0xDF94, 0x90A4, 0xDF95, 0x90A5, 0xDF96, 0x90A7, + 0xDF97, 0x90A8, 0xDF98, 0x90A9, 0xDF99, 0x90AB, 0xDF9A, 0x90AD, + 0xDF9B, 0x90B2, 0xDF9C, 0x90B7, 0xDF9D, 0x90BC, 0xDF9E, 0x90BD, + 0xDF9F, 0x90BF, 0xDFA0, 0x90C0, 0xDFA1, 0x647A, 0xDFA2, 0x64B7, + 0xDFA3, 0x64B8, 0xDFA4, 0x6499, 0xDFA5, 0x64BA, 0xDFA6, 0x64C0, + 0xDFA7, 0x64D0, 0xDFA8, 0x64D7, 0xDFA9, 0x64E4, 0xDFAA, 0x64E2, + 0xDFAB, 0x6509, 0xDFAC, 0x6525, 0xDFAD, 0x652E, 0xDFAE, 0x5F0B, + 0xDFAF, 0x5FD2, 0xDFB0, 0x7519, 0xDFB1, 0x5F11, 0xDFB2, 0x535F, + 0xDFB3, 0x53F1, 0xDFB4, 0x53FD, 0xDFB5, 0x53E9, 0xDFB6, 0x53E8, + 0xDFB7, 0x53FB, 0xDFB8, 0x5412, 0xDFB9, 0x5416, 0xDFBA, 0x5406, + 0xDFBB, 0x544B, 0xDFBC, 0x5452, 0xDFBD, 0x5453, 0xDFBE, 0x5454, + 0xDFBF, 0x5456, 0xDFC0, 0x5443, 0xDFC1, 0x5421, 0xDFC2, 0x5457, + 0xDFC3, 0x5459, 0xDFC4, 0x5423, 0xDFC5, 0x5432, 0xDFC6, 0x5482, + 0xDFC7, 0x5494, 0xDFC8, 0x5477, 0xDFC9, 0x5471, 0xDFCA, 0x5464, + 0xDFCB, 0x549A, 0xDFCC, 0x549B, 0xDFCD, 0x5484, 0xDFCE, 0x5476, + 0xDFCF, 0x5466, 0xDFD0, 0x549D, 0xDFD1, 0x54D0, 0xDFD2, 0x54AD, + 0xDFD3, 0x54C2, 0xDFD4, 0x54B4, 0xDFD5, 0x54D2, 0xDFD6, 0x54A7, + 0xDFD7, 0x54A6, 0xDFD8, 0x54D3, 0xDFD9, 0x54D4, 0xDFDA, 0x5472, + 0xDFDB, 0x54A3, 0xDFDC, 0x54D5, 0xDFDD, 0x54BB, 0xDFDE, 0x54BF, + 0xDFDF, 0x54CC, 0xDFE0, 0x54D9, 0xDFE1, 0x54DA, 0xDFE2, 0x54DC, + 0xDFE3, 0x54A9, 0xDFE4, 0x54AA, 0xDFE5, 0x54A4, 0xDFE6, 0x54DD, + 0xDFE7, 0x54CF, 0xDFE8, 0x54DE, 0xDFE9, 0x551B, 0xDFEA, 0x54E7, + 0xDFEB, 0x5520, 0xDFEC, 0x54FD, 0xDFED, 0x5514, 0xDFEE, 0x54F3, + 0xDFEF, 0x5522, 0xDFF0, 0x5523, 0xDFF1, 0x550F, 0xDFF2, 0x5511, + 0xDFF3, 0x5527, 0xDFF4, 0x552A, 0xDFF5, 0x5567, 0xDFF6, 0x558F, + 0xDFF7, 0x55B5, 0xDFF8, 0x5549, 0xDFF9, 0x556D, 0xDFFA, 0x5541, + 0xDFFB, 0x5555, 0xDFFC, 0x553F, 0xDFFD, 0x5550, 0xDFFE, 0x553C, + 0xE040, 0x90C2, 0xE041, 0x90C3, 0xE042, 0x90C6, 0xE043, 0x90C8, + 0xE044, 0x90C9, 0xE045, 0x90CB, 0xE046, 0x90CC, 0xE047, 0x90CD, + 0xE048, 0x90D2, 0xE049, 0x90D4, 0xE04A, 0x90D5, 0xE04B, 0x90D6, + 0xE04C, 0x90D8, 0xE04D, 0x90D9, 0xE04E, 0x90DA, 0xE04F, 0x90DE, + 0xE050, 0x90DF, 0xE051, 0x90E0, 0xE052, 0x90E3, 0xE053, 0x90E4, + 0xE054, 0x90E5, 0xE055, 0x90E9, 0xE056, 0x90EA, 0xE057, 0x90EC, + 0xE058, 0x90EE, 0xE059, 0x90F0, 0xE05A, 0x90F1, 0xE05B, 0x90F2, + 0xE05C, 0x90F3, 0xE05D, 0x90F5, 0xE05E, 0x90F6, 0xE05F, 0x90F7, + 0xE060, 0x90F9, 0xE061, 0x90FA, 0xE062, 0x90FB, 0xE063, 0x90FC, + 0xE064, 0x90FF, 0xE065, 0x9100, 0xE066, 0x9101, 0xE067, 0x9103, + 0xE068, 0x9105, 0xE069, 0x9106, 0xE06A, 0x9107, 0xE06B, 0x9108, + 0xE06C, 0x9109, 0xE06D, 0x910A, 0xE06E, 0x910B, 0xE06F, 0x910C, + 0xE070, 0x910D, 0xE071, 0x910E, 0xE072, 0x910F, 0xE073, 0x9110, + 0xE074, 0x9111, 0xE075, 0x9112, 0xE076, 0x9113, 0xE077, 0x9114, + 0xE078, 0x9115, 0xE079, 0x9116, 0xE07A, 0x9117, 0xE07B, 0x9118, + 0xE07C, 0x911A, 0xE07D, 0x911B, 0xE07E, 0x911C, 0xE080, 0x911D, + 0xE081, 0x911F, 0xE082, 0x9120, 0xE083, 0x9121, 0xE084, 0x9124, + 0xE085, 0x9125, 0xE086, 0x9126, 0xE087, 0x9127, 0xE088, 0x9128, + 0xE089, 0x9129, 0xE08A, 0x912A, 0xE08B, 0x912B, 0xE08C, 0x912C, + 0xE08D, 0x912D, 0xE08E, 0x912E, 0xE08F, 0x9130, 0xE090, 0x9132, + 0xE091, 0x9133, 0xE092, 0x9134, 0xE093, 0x9135, 0xE094, 0x9136, + 0xE095, 0x9137, 0xE096, 0x9138, 0xE097, 0x913A, 0xE098, 0x913B, + 0xE099, 0x913C, 0xE09A, 0x913D, 0xE09B, 0x913E, 0xE09C, 0x913F, + 0xE09D, 0x9140, 0xE09E, 0x9141, 0xE09F, 0x9142, 0xE0A0, 0x9144, + 0xE0A1, 0x5537, 0xE0A2, 0x5556, 0xE0A3, 0x5575, 0xE0A4, 0x5576, + 0xE0A5, 0x5577, 0xE0A6, 0x5533, 0xE0A7, 0x5530, 0xE0A8, 0x555C, + 0xE0A9, 0x558B, 0xE0AA, 0x55D2, 0xE0AB, 0x5583, 0xE0AC, 0x55B1, + 0xE0AD, 0x55B9, 0xE0AE, 0x5588, 0xE0AF, 0x5581, 0xE0B0, 0x559F, + 0xE0B1, 0x557E, 0xE0B2, 0x55D6, 0xE0B3, 0x5591, 0xE0B4, 0x557B, + 0xE0B5, 0x55DF, 0xE0B6, 0x55BD, 0xE0B7, 0x55BE, 0xE0B8, 0x5594, + 0xE0B9, 0x5599, 0xE0BA, 0x55EA, 0xE0BB, 0x55F7, 0xE0BC, 0x55C9, + 0xE0BD, 0x561F, 0xE0BE, 0x55D1, 0xE0BF, 0x55EB, 0xE0C0, 0x55EC, + 0xE0C1, 0x55D4, 0xE0C2, 0x55E6, 0xE0C3, 0x55DD, 0xE0C4, 0x55C4, + 0xE0C5, 0x55EF, 0xE0C6, 0x55E5, 0xE0C7, 0x55F2, 0xE0C8, 0x55F3, + 0xE0C9, 0x55CC, 0xE0CA, 0x55CD, 0xE0CB, 0x55E8, 0xE0CC, 0x55F5, + 0xE0CD, 0x55E4, 0xE0CE, 0x8F94, 0xE0CF, 0x561E, 0xE0D0, 0x5608, + 0xE0D1, 0x560C, 0xE0D2, 0x5601, 0xE0D3, 0x5624, 0xE0D4, 0x5623, + 0xE0D5, 0x55FE, 0xE0D6, 0x5600, 0xE0D7, 0x5627, 0xE0D8, 0x562D, + 0xE0D9, 0x5658, 0xE0DA, 0x5639, 0xE0DB, 0x5657, 0xE0DC, 0x562C, + 0xE0DD, 0x564D, 0xE0DE, 0x5662, 0xE0DF, 0x5659, 0xE0E0, 0x565C, + 0xE0E1, 0x564C, 0xE0E2, 0x5654, 0xE0E3, 0x5686, 0xE0E4, 0x5664, + 0xE0E5, 0x5671, 0xE0E6, 0x566B, 0xE0E7, 0x567B, 0xE0E8, 0x567C, + 0xE0E9, 0x5685, 0xE0EA, 0x5693, 0xE0EB, 0x56AF, 0xE0EC, 0x56D4, + 0xE0ED, 0x56D7, 0xE0EE, 0x56DD, 0xE0EF, 0x56E1, 0xE0F0, 0x56F5, + 0xE0F1, 0x56EB, 0xE0F2, 0x56F9, 0xE0F3, 0x56FF, 0xE0F4, 0x5704, + 0xE0F5, 0x570A, 0xE0F6, 0x5709, 0xE0F7, 0x571C, 0xE0F8, 0x5E0F, + 0xE0F9, 0x5E19, 0xE0FA, 0x5E14, 0xE0FB, 0x5E11, 0xE0FC, 0x5E31, + 0xE0FD, 0x5E3B, 0xE0FE, 0x5E3C, 0xE140, 0x9145, 0xE141, 0x9147, + 0xE142, 0x9148, 0xE143, 0x9151, 0xE144, 0x9153, 0xE145, 0x9154, + 0xE146, 0x9155, 0xE147, 0x9156, 0xE148, 0x9158, 0xE149, 0x9159, + 0xE14A, 0x915B, 0xE14B, 0x915C, 0xE14C, 0x915F, 0xE14D, 0x9160, + 0xE14E, 0x9166, 0xE14F, 0x9167, 0xE150, 0x9168, 0xE151, 0x916B, + 0xE152, 0x916D, 0xE153, 0x9173, 0xE154, 0x917A, 0xE155, 0x917B, + 0xE156, 0x917C, 0xE157, 0x9180, 0xE158, 0x9181, 0xE159, 0x9182, + 0xE15A, 0x9183, 0xE15B, 0x9184, 0xE15C, 0x9186, 0xE15D, 0x9188, + 0xE15E, 0x918A, 0xE15F, 0x918E, 0xE160, 0x918F, 0xE161, 0x9193, + 0xE162, 0x9194, 0xE163, 0x9195, 0xE164, 0x9196, 0xE165, 0x9197, + 0xE166, 0x9198, 0xE167, 0x9199, 0xE168, 0x919C, 0xE169, 0x919D, + 0xE16A, 0x919E, 0xE16B, 0x919F, 0xE16C, 0x91A0, 0xE16D, 0x91A1, + 0xE16E, 0x91A4, 0xE16F, 0x91A5, 0xE170, 0x91A6, 0xE171, 0x91A7, + 0xE172, 0x91A8, 0xE173, 0x91A9, 0xE174, 0x91AB, 0xE175, 0x91AC, + 0xE176, 0x91B0, 0xE177, 0x91B1, 0xE178, 0x91B2, 0xE179, 0x91B3, + 0xE17A, 0x91B6, 0xE17B, 0x91B7, 0xE17C, 0x91B8, 0xE17D, 0x91B9, + 0xE17E, 0x91BB, 0xE180, 0x91BC, 0xE181, 0x91BD, 0xE182, 0x91BE, + 0xE183, 0x91BF, 0xE184, 0x91C0, 0xE185, 0x91C1, 0xE186, 0x91C2, + 0xE187, 0x91C3, 0xE188, 0x91C4, 0xE189, 0x91C5, 0xE18A, 0x91C6, + 0xE18B, 0x91C8, 0xE18C, 0x91CB, 0xE18D, 0x91D0, 0xE18E, 0x91D2, + 0xE18F, 0x91D3, 0xE190, 0x91D4, 0xE191, 0x91D5, 0xE192, 0x91D6, + 0xE193, 0x91D7, 0xE194, 0x91D8, 0xE195, 0x91D9, 0xE196, 0x91DA, + 0xE197, 0x91DB, 0xE198, 0x91DD, 0xE199, 0x91DE, 0xE19A, 0x91DF, + 0xE19B, 0x91E0, 0xE19C, 0x91E1, 0xE19D, 0x91E2, 0xE19E, 0x91E3, + 0xE19F, 0x91E4, 0xE1A0, 0x91E5, 0xE1A1, 0x5E37, 0xE1A2, 0x5E44, + 0xE1A3, 0x5E54, 0xE1A4, 0x5E5B, 0xE1A5, 0x5E5E, 0xE1A6, 0x5E61, + 0xE1A7, 0x5C8C, 0xE1A8, 0x5C7A, 0xE1A9, 0x5C8D, 0xE1AA, 0x5C90, + 0xE1AB, 0x5C96, 0xE1AC, 0x5C88, 0xE1AD, 0x5C98, 0xE1AE, 0x5C99, + 0xE1AF, 0x5C91, 0xE1B0, 0x5C9A, 0xE1B1, 0x5C9C, 0xE1B2, 0x5CB5, + 0xE1B3, 0x5CA2, 0xE1B4, 0x5CBD, 0xE1B5, 0x5CAC, 0xE1B6, 0x5CAB, + 0xE1B7, 0x5CB1, 0xE1B8, 0x5CA3, 0xE1B9, 0x5CC1, 0xE1BA, 0x5CB7, + 0xE1BB, 0x5CC4, 0xE1BC, 0x5CD2, 0xE1BD, 0x5CE4, 0xE1BE, 0x5CCB, + 0xE1BF, 0x5CE5, 0xE1C0, 0x5D02, 0xE1C1, 0x5D03, 0xE1C2, 0x5D27, + 0xE1C3, 0x5D26, 0xE1C4, 0x5D2E, 0xE1C5, 0x5D24, 0xE1C6, 0x5D1E, + 0xE1C7, 0x5D06, 0xE1C8, 0x5D1B, 0xE1C9, 0x5D58, 0xE1CA, 0x5D3E, + 0xE1CB, 0x5D34, 0xE1CC, 0x5D3D, 0xE1CD, 0x5D6C, 0xE1CE, 0x5D5B, + 0xE1CF, 0x5D6F, 0xE1D0, 0x5D5D, 0xE1D1, 0x5D6B, 0xE1D2, 0x5D4B, + 0xE1D3, 0x5D4A, 0xE1D4, 0x5D69, 0xE1D5, 0x5D74, 0xE1D6, 0x5D82, + 0xE1D7, 0x5D99, 0xE1D8, 0x5D9D, 0xE1D9, 0x8C73, 0xE1DA, 0x5DB7, + 0xE1DB, 0x5DC5, 0xE1DC, 0x5F73, 0xE1DD, 0x5F77, 0xE1DE, 0x5F82, + 0xE1DF, 0x5F87, 0xE1E0, 0x5F89, 0xE1E1, 0x5F8C, 0xE1E2, 0x5F95, + 0xE1E3, 0x5F99, 0xE1E4, 0x5F9C, 0xE1E5, 0x5FA8, 0xE1E6, 0x5FAD, + 0xE1E7, 0x5FB5, 0xE1E8, 0x5FBC, 0xE1E9, 0x8862, 0xE1EA, 0x5F61, + 0xE1EB, 0x72AD, 0xE1EC, 0x72B0, 0xE1ED, 0x72B4, 0xE1EE, 0x72B7, + 0xE1EF, 0x72B8, 0xE1F0, 0x72C3, 0xE1F1, 0x72C1, 0xE1F2, 0x72CE, + 0xE1F3, 0x72CD, 0xE1F4, 0x72D2, 0xE1F5, 0x72E8, 0xE1F6, 0x72EF, + 0xE1F7, 0x72E9, 0xE1F8, 0x72F2, 0xE1F9, 0x72F4, 0xE1FA, 0x72F7, + 0xE1FB, 0x7301, 0xE1FC, 0x72F3, 0xE1FD, 0x7303, 0xE1FE, 0x72FA, + 0xE240, 0x91E6, 0xE241, 0x91E7, 0xE242, 0x91E8, 0xE243, 0x91E9, + 0xE244, 0x91EA, 0xE245, 0x91EB, 0xE246, 0x91EC, 0xE247, 0x91ED, + 0xE248, 0x91EE, 0xE249, 0x91EF, 0xE24A, 0x91F0, 0xE24B, 0x91F1, + 0xE24C, 0x91F2, 0xE24D, 0x91F3, 0xE24E, 0x91F4, 0xE24F, 0x91F5, + 0xE250, 0x91F6, 0xE251, 0x91F7, 0xE252, 0x91F8, 0xE253, 0x91F9, + 0xE254, 0x91FA, 0xE255, 0x91FB, 0xE256, 0x91FC, 0xE257, 0x91FD, + 0xE258, 0x91FE, 0xE259, 0x91FF, 0xE25A, 0x9200, 0xE25B, 0x9201, + 0xE25C, 0x9202, 0xE25D, 0x9203, 0xE25E, 0x9204, 0xE25F, 0x9205, + 0xE260, 0x9206, 0xE261, 0x9207, 0xE262, 0x9208, 0xE263, 0x9209, + 0xE264, 0x920A, 0xE265, 0x920B, 0xE266, 0x920C, 0xE267, 0x920D, + 0xE268, 0x920E, 0xE269, 0x920F, 0xE26A, 0x9210, 0xE26B, 0x9211, + 0xE26C, 0x9212, 0xE26D, 0x9213, 0xE26E, 0x9214, 0xE26F, 0x9215, + 0xE270, 0x9216, 0xE271, 0x9217, 0xE272, 0x9218, 0xE273, 0x9219, + 0xE274, 0x921A, 0xE275, 0x921B, 0xE276, 0x921C, 0xE277, 0x921D, + 0xE278, 0x921E, 0xE279, 0x921F, 0xE27A, 0x9220, 0xE27B, 0x9221, + 0xE27C, 0x9222, 0xE27D, 0x9223, 0xE27E, 0x9224, 0xE280, 0x9225, + 0xE281, 0x9226, 0xE282, 0x9227, 0xE283, 0x9228, 0xE284, 0x9229, + 0xE285, 0x922A, 0xE286, 0x922B, 0xE287, 0x922C, 0xE288, 0x922D, + 0xE289, 0x922E, 0xE28A, 0x922F, 0xE28B, 0x9230, 0xE28C, 0x9231, + 0xE28D, 0x9232, 0xE28E, 0x9233, 0xE28F, 0x9234, 0xE290, 0x9235, + 0xE291, 0x9236, 0xE292, 0x9237, 0xE293, 0x9238, 0xE294, 0x9239, + 0xE295, 0x923A, 0xE296, 0x923B, 0xE297, 0x923C, 0xE298, 0x923D, + 0xE299, 0x923E, 0xE29A, 0x923F, 0xE29B, 0x9240, 0xE29C, 0x9241, + 0xE29D, 0x9242, 0xE29E, 0x9243, 0xE29F, 0x9244, 0xE2A0, 0x9245, + 0xE2A1, 0x72FB, 0xE2A2, 0x7317, 0xE2A3, 0x7313, 0xE2A4, 0x7321, + 0xE2A5, 0x730A, 0xE2A6, 0x731E, 0xE2A7, 0x731D, 0xE2A8, 0x7315, + 0xE2A9, 0x7322, 0xE2AA, 0x7339, 0xE2AB, 0x7325, 0xE2AC, 0x732C, + 0xE2AD, 0x7338, 0xE2AE, 0x7331, 0xE2AF, 0x7350, 0xE2B0, 0x734D, + 0xE2B1, 0x7357, 0xE2B2, 0x7360, 0xE2B3, 0x736C, 0xE2B4, 0x736F, + 0xE2B5, 0x737E, 0xE2B6, 0x821B, 0xE2B7, 0x5925, 0xE2B8, 0x98E7, + 0xE2B9, 0x5924, 0xE2BA, 0x5902, 0xE2BB, 0x9963, 0xE2BC, 0x9967, + 0xE2BD, 0x9968, 0xE2BE, 0x9969, 0xE2BF, 0x996A, 0xE2C0, 0x996B, + 0xE2C1, 0x996C, 0xE2C2, 0x9974, 0xE2C3, 0x9977, 0xE2C4, 0x997D, + 0xE2C5, 0x9980, 0xE2C6, 0x9984, 0xE2C7, 0x9987, 0xE2C8, 0x998A, + 0xE2C9, 0x998D, 0xE2CA, 0x9990, 0xE2CB, 0x9991, 0xE2CC, 0x9993, + 0xE2CD, 0x9994, 0xE2CE, 0x9995, 0xE2CF, 0x5E80, 0xE2D0, 0x5E91, + 0xE2D1, 0x5E8B, 0xE2D2, 0x5E96, 0xE2D3, 0x5EA5, 0xE2D4, 0x5EA0, + 0xE2D5, 0x5EB9, 0xE2D6, 0x5EB5, 0xE2D7, 0x5EBE, 0xE2D8, 0x5EB3, + 0xE2D9, 0x8D53, 0xE2DA, 0x5ED2, 0xE2DB, 0x5ED1, 0xE2DC, 0x5EDB, + 0xE2DD, 0x5EE8, 0xE2DE, 0x5EEA, 0xE2DF, 0x81BA, 0xE2E0, 0x5FC4, + 0xE2E1, 0x5FC9, 0xE2E2, 0x5FD6, 0xE2E3, 0x5FCF, 0xE2E4, 0x6003, + 0xE2E5, 0x5FEE, 0xE2E6, 0x6004, 0xE2E7, 0x5FE1, 0xE2E8, 0x5FE4, + 0xE2E9, 0x5FFE, 0xE2EA, 0x6005, 0xE2EB, 0x6006, 0xE2EC, 0x5FEA, + 0xE2ED, 0x5FED, 0xE2EE, 0x5FF8, 0xE2EF, 0x6019, 0xE2F0, 0x6035, + 0xE2F1, 0x6026, 0xE2F2, 0x601B, 0xE2F3, 0x600F, 0xE2F4, 0x600D, + 0xE2F5, 0x6029, 0xE2F6, 0x602B, 0xE2F7, 0x600A, 0xE2F8, 0x603F, + 0xE2F9, 0x6021, 0xE2FA, 0x6078, 0xE2FB, 0x6079, 0xE2FC, 0x607B, + 0xE2FD, 0x607A, 0xE2FE, 0x6042, 0xE340, 0x9246, 0xE341, 0x9247, + 0xE342, 0x9248, 0xE343, 0x9249, 0xE344, 0x924A, 0xE345, 0x924B, + 0xE346, 0x924C, 0xE347, 0x924D, 0xE348, 0x924E, 0xE349, 0x924F, + 0xE34A, 0x9250, 0xE34B, 0x9251, 0xE34C, 0x9252, 0xE34D, 0x9253, + 0xE34E, 0x9254, 0xE34F, 0x9255, 0xE350, 0x9256, 0xE351, 0x9257, + 0xE352, 0x9258, 0xE353, 0x9259, 0xE354, 0x925A, 0xE355, 0x925B, + 0xE356, 0x925C, 0xE357, 0x925D, 0xE358, 0x925E, 0xE359, 0x925F, + 0xE35A, 0x9260, 0xE35B, 0x9261, 0xE35C, 0x9262, 0xE35D, 0x9263, + 0xE35E, 0x9264, 0xE35F, 0x9265, 0xE360, 0x9266, 0xE361, 0x9267, + 0xE362, 0x9268, 0xE363, 0x9269, 0xE364, 0x926A, 0xE365, 0x926B, + 0xE366, 0x926C, 0xE367, 0x926D, 0xE368, 0x926E, 0xE369, 0x926F, + 0xE36A, 0x9270, 0xE36B, 0x9271, 0xE36C, 0x9272, 0xE36D, 0x9273, + 0xE36E, 0x9275, 0xE36F, 0x9276, 0xE370, 0x9277, 0xE371, 0x9278, + 0xE372, 0x9279, 0xE373, 0x927A, 0xE374, 0x927B, 0xE375, 0x927C, + 0xE376, 0x927D, 0xE377, 0x927E, 0xE378, 0x927F, 0xE379, 0x9280, + 0xE37A, 0x9281, 0xE37B, 0x9282, 0xE37C, 0x9283, 0xE37D, 0x9284, + 0xE37E, 0x9285, 0xE380, 0x9286, 0xE381, 0x9287, 0xE382, 0x9288, + 0xE383, 0x9289, 0xE384, 0x928A, 0xE385, 0x928B, 0xE386, 0x928C, + 0xE387, 0x928D, 0xE388, 0x928F, 0xE389, 0x9290, 0xE38A, 0x9291, + 0xE38B, 0x9292, 0xE38C, 0x9293, 0xE38D, 0x9294, 0xE38E, 0x9295, + 0xE38F, 0x9296, 0xE390, 0x9297, 0xE391, 0x9298, 0xE392, 0x9299, + 0xE393, 0x929A, 0xE394, 0x929B, 0xE395, 0x929C, 0xE396, 0x929D, + 0xE397, 0x929E, 0xE398, 0x929F, 0xE399, 0x92A0, 0xE39A, 0x92A1, + 0xE39B, 0x92A2, 0xE39C, 0x92A3, 0xE39D, 0x92A4, 0xE39E, 0x92A5, + 0xE39F, 0x92A6, 0xE3A0, 0x92A7, 0xE3A1, 0x606A, 0xE3A2, 0x607D, + 0xE3A3, 0x6096, 0xE3A4, 0x609A, 0xE3A5, 0x60AD, 0xE3A6, 0x609D, + 0xE3A7, 0x6083, 0xE3A8, 0x6092, 0xE3A9, 0x608C, 0xE3AA, 0x609B, + 0xE3AB, 0x60EC, 0xE3AC, 0x60BB, 0xE3AD, 0x60B1, 0xE3AE, 0x60DD, + 0xE3AF, 0x60D8, 0xE3B0, 0x60C6, 0xE3B1, 0x60DA, 0xE3B2, 0x60B4, + 0xE3B3, 0x6120, 0xE3B4, 0x6126, 0xE3B5, 0x6115, 0xE3B6, 0x6123, + 0xE3B7, 0x60F4, 0xE3B8, 0x6100, 0xE3B9, 0x610E, 0xE3BA, 0x612B, + 0xE3BB, 0x614A, 0xE3BC, 0x6175, 0xE3BD, 0x61AC, 0xE3BE, 0x6194, + 0xE3BF, 0x61A7, 0xE3C0, 0x61B7, 0xE3C1, 0x61D4, 0xE3C2, 0x61F5, + 0xE3C3, 0x5FDD, 0xE3C4, 0x96B3, 0xE3C5, 0x95E9, 0xE3C6, 0x95EB, + 0xE3C7, 0x95F1, 0xE3C8, 0x95F3, 0xE3C9, 0x95F5, 0xE3CA, 0x95F6, + 0xE3CB, 0x95FC, 0xE3CC, 0x95FE, 0xE3CD, 0x9603, 0xE3CE, 0x9604, + 0xE3CF, 0x9606, 0xE3D0, 0x9608, 0xE3D1, 0x960A, 0xE3D2, 0x960B, + 0xE3D3, 0x960C, 0xE3D4, 0x960D, 0xE3D5, 0x960F, 0xE3D6, 0x9612, + 0xE3D7, 0x9615, 0xE3D8, 0x9616, 0xE3D9, 0x9617, 0xE3DA, 0x9619, + 0xE3DB, 0x961A, 0xE3DC, 0x4E2C, 0xE3DD, 0x723F, 0xE3DE, 0x6215, + 0xE3DF, 0x6C35, 0xE3E0, 0x6C54, 0xE3E1, 0x6C5C, 0xE3E2, 0x6C4A, + 0xE3E3, 0x6CA3, 0xE3E4, 0x6C85, 0xE3E5, 0x6C90, 0xE3E6, 0x6C94, + 0xE3E7, 0x6C8C, 0xE3E8, 0x6C68, 0xE3E9, 0x6C69, 0xE3EA, 0x6C74, + 0xE3EB, 0x6C76, 0xE3EC, 0x6C86, 0xE3ED, 0x6CA9, 0xE3EE, 0x6CD0, + 0xE3EF, 0x6CD4, 0xE3F0, 0x6CAD, 0xE3F1, 0x6CF7, 0xE3F2, 0x6CF8, + 0xE3F3, 0x6CF1, 0xE3F4, 0x6CD7, 0xE3F5, 0x6CB2, 0xE3F6, 0x6CE0, + 0xE3F7, 0x6CD6, 0xE3F8, 0x6CFA, 0xE3F9, 0x6CEB, 0xE3FA, 0x6CEE, + 0xE3FB, 0x6CB1, 0xE3FC, 0x6CD3, 0xE3FD, 0x6CEF, 0xE3FE, 0x6CFE, + 0xE440, 0x92A8, 0xE441, 0x92A9, 0xE442, 0x92AA, 0xE443, 0x92AB, + 0xE444, 0x92AC, 0xE445, 0x92AD, 0xE446, 0x92AF, 0xE447, 0x92B0, + 0xE448, 0x92B1, 0xE449, 0x92B2, 0xE44A, 0x92B3, 0xE44B, 0x92B4, + 0xE44C, 0x92B5, 0xE44D, 0x92B6, 0xE44E, 0x92B7, 0xE44F, 0x92B8, + 0xE450, 0x92B9, 0xE451, 0x92BA, 0xE452, 0x92BB, 0xE453, 0x92BC, + 0xE454, 0x92BD, 0xE455, 0x92BE, 0xE456, 0x92BF, 0xE457, 0x92C0, + 0xE458, 0x92C1, 0xE459, 0x92C2, 0xE45A, 0x92C3, 0xE45B, 0x92C4, + 0xE45C, 0x92C5, 0xE45D, 0x92C6, 0xE45E, 0x92C7, 0xE45F, 0x92C9, + 0xE460, 0x92CA, 0xE461, 0x92CB, 0xE462, 0x92CC, 0xE463, 0x92CD, + 0xE464, 0x92CE, 0xE465, 0x92CF, 0xE466, 0x92D0, 0xE467, 0x92D1, + 0xE468, 0x92D2, 0xE469, 0x92D3, 0xE46A, 0x92D4, 0xE46B, 0x92D5, + 0xE46C, 0x92D6, 0xE46D, 0x92D7, 0xE46E, 0x92D8, 0xE46F, 0x92D9, + 0xE470, 0x92DA, 0xE471, 0x92DB, 0xE472, 0x92DC, 0xE473, 0x92DD, + 0xE474, 0x92DE, 0xE475, 0x92DF, 0xE476, 0x92E0, 0xE477, 0x92E1, + 0xE478, 0x92E2, 0xE479, 0x92E3, 0xE47A, 0x92E4, 0xE47B, 0x92E5, + 0xE47C, 0x92E6, 0xE47D, 0x92E7, 0xE47E, 0x92E8, 0xE480, 0x92E9, + 0xE481, 0x92EA, 0xE482, 0x92EB, 0xE483, 0x92EC, 0xE484, 0x92ED, + 0xE485, 0x92EE, 0xE486, 0x92EF, 0xE487, 0x92F0, 0xE488, 0x92F1, + 0xE489, 0x92F2, 0xE48A, 0x92F3, 0xE48B, 0x92F4, 0xE48C, 0x92F5, + 0xE48D, 0x92F6, 0xE48E, 0x92F7, 0xE48F, 0x92F8, 0xE490, 0x92F9, + 0xE491, 0x92FA, 0xE492, 0x92FB, 0xE493, 0x92FC, 0xE494, 0x92FD, + 0xE495, 0x92FE, 0xE496, 0x92FF, 0xE497, 0x9300, 0xE498, 0x9301, + 0xE499, 0x9302, 0xE49A, 0x9303, 0xE49B, 0x9304, 0xE49C, 0x9305, + 0xE49D, 0x9306, 0xE49E, 0x9307, 0xE49F, 0x9308, 0xE4A0, 0x9309, + 0xE4A1, 0x6D39, 0xE4A2, 0x6D27, 0xE4A3, 0x6D0C, 0xE4A4, 0x6D43, + 0xE4A5, 0x6D48, 0xE4A6, 0x6D07, 0xE4A7, 0x6D04, 0xE4A8, 0x6D19, + 0xE4A9, 0x6D0E, 0xE4AA, 0x6D2B, 0xE4AB, 0x6D4D, 0xE4AC, 0x6D2E, + 0xE4AD, 0x6D35, 0xE4AE, 0x6D1A, 0xE4AF, 0x6D4F, 0xE4B0, 0x6D52, + 0xE4B1, 0x6D54, 0xE4B2, 0x6D33, 0xE4B3, 0x6D91, 0xE4B4, 0x6D6F, + 0xE4B5, 0x6D9E, 0xE4B6, 0x6DA0, 0xE4B7, 0x6D5E, 0xE4B8, 0x6D93, + 0xE4B9, 0x6D94, 0xE4BA, 0x6D5C, 0xE4BB, 0x6D60, 0xE4BC, 0x6D7C, + 0xE4BD, 0x6D63, 0xE4BE, 0x6E1A, 0xE4BF, 0x6DC7, 0xE4C0, 0x6DC5, + 0xE4C1, 0x6DDE, 0xE4C2, 0x6E0E, 0xE4C3, 0x6DBF, 0xE4C4, 0x6DE0, + 0xE4C5, 0x6E11, 0xE4C6, 0x6DE6, 0xE4C7, 0x6DDD, 0xE4C8, 0x6DD9, + 0xE4C9, 0x6E16, 0xE4CA, 0x6DAB, 0xE4CB, 0x6E0C, 0xE4CC, 0x6DAE, + 0xE4CD, 0x6E2B, 0xE4CE, 0x6E6E, 0xE4CF, 0x6E4E, 0xE4D0, 0x6E6B, + 0xE4D1, 0x6EB2, 0xE4D2, 0x6E5F, 0xE4D3, 0x6E86, 0xE4D4, 0x6E53, + 0xE4D5, 0x6E54, 0xE4D6, 0x6E32, 0xE4D7, 0x6E25, 0xE4D8, 0x6E44, + 0xE4D9, 0x6EDF, 0xE4DA, 0x6EB1, 0xE4DB, 0x6E98, 0xE4DC, 0x6EE0, + 0xE4DD, 0x6F2D, 0xE4DE, 0x6EE2, 0xE4DF, 0x6EA5, 0xE4E0, 0x6EA7, + 0xE4E1, 0x6EBD, 0xE4E2, 0x6EBB, 0xE4E3, 0x6EB7, 0xE4E4, 0x6ED7, + 0xE4E5, 0x6EB4, 0xE4E6, 0x6ECF, 0xE4E7, 0x6E8F, 0xE4E8, 0x6EC2, + 0xE4E9, 0x6E9F, 0xE4EA, 0x6F62, 0xE4EB, 0x6F46, 0xE4EC, 0x6F47, + 0xE4ED, 0x6F24, 0xE4EE, 0x6F15, 0xE4EF, 0x6EF9, 0xE4F0, 0x6F2F, + 0xE4F1, 0x6F36, 0xE4F2, 0x6F4B, 0xE4F3, 0x6F74, 0xE4F4, 0x6F2A, + 0xE4F5, 0x6F09, 0xE4F6, 0x6F29, 0xE4F7, 0x6F89, 0xE4F8, 0x6F8D, + 0xE4F9, 0x6F8C, 0xE4FA, 0x6F78, 0xE4FB, 0x6F72, 0xE4FC, 0x6F7C, + 0xE4FD, 0x6F7A, 0xE4FE, 0x6FD1, 0xE540, 0x930A, 0xE541, 0x930B, + 0xE542, 0x930C, 0xE543, 0x930D, 0xE544, 0x930E, 0xE545, 0x930F, + 0xE546, 0x9310, 0xE547, 0x9311, 0xE548, 0x9312, 0xE549, 0x9313, + 0xE54A, 0x9314, 0xE54B, 0x9315, 0xE54C, 0x9316, 0xE54D, 0x9317, + 0xE54E, 0x9318, 0xE54F, 0x9319, 0xE550, 0x931A, 0xE551, 0x931B, + 0xE552, 0x931C, 0xE553, 0x931D, 0xE554, 0x931E, 0xE555, 0x931F, + 0xE556, 0x9320, 0xE557, 0x9321, 0xE558, 0x9322, 0xE559, 0x9323, + 0xE55A, 0x9324, 0xE55B, 0x9325, 0xE55C, 0x9326, 0xE55D, 0x9327, + 0xE55E, 0x9328, 0xE55F, 0x9329, 0xE560, 0x932A, 0xE561, 0x932B, + 0xE562, 0x932C, 0xE563, 0x932D, 0xE564, 0x932E, 0xE565, 0x932F, + 0xE566, 0x9330, 0xE567, 0x9331, 0xE568, 0x9332, 0xE569, 0x9333, + 0xE56A, 0x9334, 0xE56B, 0x9335, 0xE56C, 0x9336, 0xE56D, 0x9337, + 0xE56E, 0x9338, 0xE56F, 0x9339, 0xE570, 0x933A, 0xE571, 0x933B, + 0xE572, 0x933C, 0xE573, 0x933D, 0xE574, 0x933F, 0xE575, 0x9340, + 0xE576, 0x9341, 0xE577, 0x9342, 0xE578, 0x9343, 0xE579, 0x9344, + 0xE57A, 0x9345, 0xE57B, 0x9346, 0xE57C, 0x9347, 0xE57D, 0x9348, + 0xE57E, 0x9349, 0xE580, 0x934A, 0xE581, 0x934B, 0xE582, 0x934C, + 0xE583, 0x934D, 0xE584, 0x934E, 0xE585, 0x934F, 0xE586, 0x9350, + 0xE587, 0x9351, 0xE588, 0x9352, 0xE589, 0x9353, 0xE58A, 0x9354, + 0xE58B, 0x9355, 0xE58C, 0x9356, 0xE58D, 0x9357, 0xE58E, 0x9358, + 0xE58F, 0x9359, 0xE590, 0x935A, 0xE591, 0x935B, 0xE592, 0x935C, + 0xE593, 0x935D, 0xE594, 0x935E, 0xE595, 0x935F, 0xE596, 0x9360, + 0xE597, 0x9361, 0xE598, 0x9362, 0xE599, 0x9363, 0xE59A, 0x9364, + 0xE59B, 0x9365, 0xE59C, 0x9366, 0xE59D, 0x9367, 0xE59E, 0x9368, + 0xE59F, 0x9369, 0xE5A0, 0x936B, 0xE5A1, 0x6FC9, 0xE5A2, 0x6FA7, + 0xE5A3, 0x6FB9, 0xE5A4, 0x6FB6, 0xE5A5, 0x6FC2, 0xE5A6, 0x6FE1, + 0xE5A7, 0x6FEE, 0xE5A8, 0x6FDE, 0xE5A9, 0x6FE0, 0xE5AA, 0x6FEF, + 0xE5AB, 0x701A, 0xE5AC, 0x7023, 0xE5AD, 0x701B, 0xE5AE, 0x7039, + 0xE5AF, 0x7035, 0xE5B0, 0x704F, 0xE5B1, 0x705E, 0xE5B2, 0x5B80, + 0xE5B3, 0x5B84, 0xE5B4, 0x5B95, 0xE5B5, 0x5B93, 0xE5B6, 0x5BA5, + 0xE5B7, 0x5BB8, 0xE5B8, 0x752F, 0xE5B9, 0x9A9E, 0xE5BA, 0x6434, + 0xE5BB, 0x5BE4, 0xE5BC, 0x5BEE, 0xE5BD, 0x8930, 0xE5BE, 0x5BF0, + 0xE5BF, 0x8E47, 0xE5C0, 0x8B07, 0xE5C1, 0x8FB6, 0xE5C2, 0x8FD3, + 0xE5C3, 0x8FD5, 0xE5C4, 0x8FE5, 0xE5C5, 0x8FEE, 0xE5C6, 0x8FE4, + 0xE5C7, 0x8FE9, 0xE5C8, 0x8FE6, 0xE5C9, 0x8FF3, 0xE5CA, 0x8FE8, + 0xE5CB, 0x9005, 0xE5CC, 0x9004, 0xE5CD, 0x900B, 0xE5CE, 0x9026, + 0xE5CF, 0x9011, 0xE5D0, 0x900D, 0xE5D1, 0x9016, 0xE5D2, 0x9021, + 0xE5D3, 0x9035, 0xE5D4, 0x9036, 0xE5D5, 0x902D, 0xE5D6, 0x902F, + 0xE5D7, 0x9044, 0xE5D8, 0x9051, 0xE5D9, 0x9052, 0xE5DA, 0x9050, + 0xE5DB, 0x9068, 0xE5DC, 0x9058, 0xE5DD, 0x9062, 0xE5DE, 0x905B, + 0xE5DF, 0x66B9, 0xE5E0, 0x9074, 0xE5E1, 0x907D, 0xE5E2, 0x9082, + 0xE5E3, 0x9088, 0xE5E4, 0x9083, 0xE5E5, 0x908B, 0xE5E6, 0x5F50, + 0xE5E7, 0x5F57, 0xE5E8, 0x5F56, 0xE5E9, 0x5F58, 0xE5EA, 0x5C3B, + 0xE5EB, 0x54AB, 0xE5EC, 0x5C50, 0xE5ED, 0x5C59, 0xE5EE, 0x5B71, + 0xE5EF, 0x5C63, 0xE5F0, 0x5C66, 0xE5F1, 0x7FBC, 0xE5F2, 0x5F2A, + 0xE5F3, 0x5F29, 0xE5F4, 0x5F2D, 0xE5F5, 0x8274, 0xE5F6, 0x5F3C, + 0xE5F7, 0x9B3B, 0xE5F8, 0x5C6E, 0xE5F9, 0x5981, 0xE5FA, 0x5983, + 0xE5FB, 0x598D, 0xE5FC, 0x59A9, 0xE5FD, 0x59AA, 0xE5FE, 0x59A3, + 0xE640, 0x936C, 0xE641, 0x936D, 0xE642, 0x936E, 0xE643, 0x936F, + 0xE644, 0x9370, 0xE645, 0x9371, 0xE646, 0x9372, 0xE647, 0x9373, + 0xE648, 0x9374, 0xE649, 0x9375, 0xE64A, 0x9376, 0xE64B, 0x9377, + 0xE64C, 0x9378, 0xE64D, 0x9379, 0xE64E, 0x937A, 0xE64F, 0x937B, + 0xE650, 0x937C, 0xE651, 0x937D, 0xE652, 0x937E, 0xE653, 0x937F, + 0xE654, 0x9380, 0xE655, 0x9381, 0xE656, 0x9382, 0xE657, 0x9383, + 0xE658, 0x9384, 0xE659, 0x9385, 0xE65A, 0x9386, 0xE65B, 0x9387, + 0xE65C, 0x9388, 0xE65D, 0x9389, 0xE65E, 0x938A, 0xE65F, 0x938B, + 0xE660, 0x938C, 0xE661, 0x938D, 0xE662, 0x938E, 0xE663, 0x9390, + 0xE664, 0x9391, 0xE665, 0x9392, 0xE666, 0x9393, 0xE667, 0x9394, + 0xE668, 0x9395, 0xE669, 0x9396, 0xE66A, 0x9397, 0xE66B, 0x9398, + 0xE66C, 0x9399, 0xE66D, 0x939A, 0xE66E, 0x939B, 0xE66F, 0x939C, + 0xE670, 0x939D, 0xE671, 0x939E, 0xE672, 0x939F, 0xE673, 0x93A0, + 0xE674, 0x93A1, 0xE675, 0x93A2, 0xE676, 0x93A3, 0xE677, 0x93A4, + 0xE678, 0x93A5, 0xE679, 0x93A6, 0xE67A, 0x93A7, 0xE67B, 0x93A8, + 0xE67C, 0x93A9, 0xE67D, 0x93AA, 0xE67E, 0x93AB, 0xE680, 0x93AC, + 0xE681, 0x93AD, 0xE682, 0x93AE, 0xE683, 0x93AF, 0xE684, 0x93B0, + 0xE685, 0x93B1, 0xE686, 0x93B2, 0xE687, 0x93B3, 0xE688, 0x93B4, + 0xE689, 0x93B5, 0xE68A, 0x93B6, 0xE68B, 0x93B7, 0xE68C, 0x93B8, + 0xE68D, 0x93B9, 0xE68E, 0x93BA, 0xE68F, 0x93BB, 0xE690, 0x93BC, + 0xE691, 0x93BD, 0xE692, 0x93BE, 0xE693, 0x93BF, 0xE694, 0x93C0, + 0xE695, 0x93C1, 0xE696, 0x93C2, 0xE697, 0x93C3, 0xE698, 0x93C4, + 0xE699, 0x93C5, 0xE69A, 0x93C6, 0xE69B, 0x93C7, 0xE69C, 0x93C8, + 0xE69D, 0x93C9, 0xE69E, 0x93CB, 0xE69F, 0x93CC, 0xE6A0, 0x93CD, + 0xE6A1, 0x5997, 0xE6A2, 0x59CA, 0xE6A3, 0x59AB, 0xE6A4, 0x599E, + 0xE6A5, 0x59A4, 0xE6A6, 0x59D2, 0xE6A7, 0x59B2, 0xE6A8, 0x59AF, + 0xE6A9, 0x59D7, 0xE6AA, 0x59BE, 0xE6AB, 0x5A05, 0xE6AC, 0x5A06, + 0xE6AD, 0x59DD, 0xE6AE, 0x5A08, 0xE6AF, 0x59E3, 0xE6B0, 0x59D8, + 0xE6B1, 0x59F9, 0xE6B2, 0x5A0C, 0xE6B3, 0x5A09, 0xE6B4, 0x5A32, + 0xE6B5, 0x5A34, 0xE6B6, 0x5A11, 0xE6B7, 0x5A23, 0xE6B8, 0x5A13, + 0xE6B9, 0x5A40, 0xE6BA, 0x5A67, 0xE6BB, 0x5A4A, 0xE6BC, 0x5A55, + 0xE6BD, 0x5A3C, 0xE6BE, 0x5A62, 0xE6BF, 0x5A75, 0xE6C0, 0x80EC, + 0xE6C1, 0x5AAA, 0xE6C2, 0x5A9B, 0xE6C3, 0x5A77, 0xE6C4, 0x5A7A, + 0xE6C5, 0x5ABE, 0xE6C6, 0x5AEB, 0xE6C7, 0x5AB2, 0xE6C8, 0x5AD2, + 0xE6C9, 0x5AD4, 0xE6CA, 0x5AB8, 0xE6CB, 0x5AE0, 0xE6CC, 0x5AE3, + 0xE6CD, 0x5AF1, 0xE6CE, 0x5AD6, 0xE6CF, 0x5AE6, 0xE6D0, 0x5AD8, + 0xE6D1, 0x5ADC, 0xE6D2, 0x5B09, 0xE6D3, 0x5B17, 0xE6D4, 0x5B16, + 0xE6D5, 0x5B32, 0xE6D6, 0x5B37, 0xE6D7, 0x5B40, 0xE6D8, 0x5C15, + 0xE6D9, 0x5C1C, 0xE6DA, 0x5B5A, 0xE6DB, 0x5B65, 0xE6DC, 0x5B73, + 0xE6DD, 0x5B51, 0xE6DE, 0x5B53, 0xE6DF, 0x5B62, 0xE6E0, 0x9A75, + 0xE6E1, 0x9A77, 0xE6E2, 0x9A78, 0xE6E3, 0x9A7A, 0xE6E4, 0x9A7F, + 0xE6E5, 0x9A7D, 0xE6E6, 0x9A80, 0xE6E7, 0x9A81, 0xE6E8, 0x9A85, + 0xE6E9, 0x9A88, 0xE6EA, 0x9A8A, 0xE6EB, 0x9A90, 0xE6EC, 0x9A92, + 0xE6ED, 0x9A93, 0xE6EE, 0x9A96, 0xE6EF, 0x9A98, 0xE6F0, 0x9A9B, + 0xE6F1, 0x9A9C, 0xE6F2, 0x9A9D, 0xE6F3, 0x9A9F, 0xE6F4, 0x9AA0, + 0xE6F5, 0x9AA2, 0xE6F6, 0x9AA3, 0xE6F7, 0x9AA5, 0xE6F8, 0x9AA7, + 0xE6F9, 0x7E9F, 0xE6FA, 0x7EA1, 0xE6FB, 0x7EA3, 0xE6FC, 0x7EA5, + 0xE6FD, 0x7EA8, 0xE6FE, 0x7EA9, 0xE740, 0x93CE, 0xE741, 0x93CF, + 0xE742, 0x93D0, 0xE743, 0x93D1, 0xE744, 0x93D2, 0xE745, 0x93D3, + 0xE746, 0x93D4, 0xE747, 0x93D5, 0xE748, 0x93D7, 0xE749, 0x93D8, + 0xE74A, 0x93D9, 0xE74B, 0x93DA, 0xE74C, 0x93DB, 0xE74D, 0x93DC, + 0xE74E, 0x93DD, 0xE74F, 0x93DE, 0xE750, 0x93DF, 0xE751, 0x93E0, + 0xE752, 0x93E1, 0xE753, 0x93E2, 0xE754, 0x93E3, 0xE755, 0x93E4, + 0xE756, 0x93E5, 0xE757, 0x93E6, 0xE758, 0x93E7, 0xE759, 0x93E8, + 0xE75A, 0x93E9, 0xE75B, 0x93EA, 0xE75C, 0x93EB, 0xE75D, 0x93EC, + 0xE75E, 0x93ED, 0xE75F, 0x93EE, 0xE760, 0x93EF, 0xE761, 0x93F0, + 0xE762, 0x93F1, 0xE763, 0x93F2, 0xE764, 0x93F3, 0xE765, 0x93F4, + 0xE766, 0x93F5, 0xE767, 0x93F6, 0xE768, 0x93F7, 0xE769, 0x93F8, + 0xE76A, 0x93F9, 0xE76B, 0x93FA, 0xE76C, 0x93FB, 0xE76D, 0x93FC, + 0xE76E, 0x93FD, 0xE76F, 0x93FE, 0xE770, 0x93FF, 0xE771, 0x9400, + 0xE772, 0x9401, 0xE773, 0x9402, 0xE774, 0x9403, 0xE775, 0x9404, + 0xE776, 0x9405, 0xE777, 0x9406, 0xE778, 0x9407, 0xE779, 0x9408, + 0xE77A, 0x9409, 0xE77B, 0x940A, 0xE77C, 0x940B, 0xE77D, 0x940C, + 0xE77E, 0x940D, 0xE780, 0x940E, 0xE781, 0x940F, 0xE782, 0x9410, + 0xE783, 0x9411, 0xE784, 0x9412, 0xE785, 0x9413, 0xE786, 0x9414, + 0xE787, 0x9415, 0xE788, 0x9416, 0xE789, 0x9417, 0xE78A, 0x9418, + 0xE78B, 0x9419, 0xE78C, 0x941A, 0xE78D, 0x941B, 0xE78E, 0x941C, + 0xE78F, 0x941D, 0xE790, 0x941E, 0xE791, 0x941F, 0xE792, 0x9420, + 0xE793, 0x9421, 0xE794, 0x9422, 0xE795, 0x9423, 0xE796, 0x9424, + 0xE797, 0x9425, 0xE798, 0x9426, 0xE799, 0x9427, 0xE79A, 0x9428, + 0xE79B, 0x9429, 0xE79C, 0x942A, 0xE79D, 0x942B, 0xE79E, 0x942C, + 0xE79F, 0x942D, 0xE7A0, 0x942E, 0xE7A1, 0x7EAD, 0xE7A2, 0x7EB0, + 0xE7A3, 0x7EBE, 0xE7A4, 0x7EC0, 0xE7A5, 0x7EC1, 0xE7A6, 0x7EC2, + 0xE7A7, 0x7EC9, 0xE7A8, 0x7ECB, 0xE7A9, 0x7ECC, 0xE7AA, 0x7ED0, + 0xE7AB, 0x7ED4, 0xE7AC, 0x7ED7, 0xE7AD, 0x7EDB, 0xE7AE, 0x7EE0, + 0xE7AF, 0x7EE1, 0xE7B0, 0x7EE8, 0xE7B1, 0x7EEB, 0xE7B2, 0x7EEE, + 0xE7B3, 0x7EEF, 0xE7B4, 0x7EF1, 0xE7B5, 0x7EF2, 0xE7B6, 0x7F0D, + 0xE7B7, 0x7EF6, 0xE7B8, 0x7EFA, 0xE7B9, 0x7EFB, 0xE7BA, 0x7EFE, + 0xE7BB, 0x7F01, 0xE7BC, 0x7F02, 0xE7BD, 0x7F03, 0xE7BE, 0x7F07, + 0xE7BF, 0x7F08, 0xE7C0, 0x7F0B, 0xE7C1, 0x7F0C, 0xE7C2, 0x7F0F, + 0xE7C3, 0x7F11, 0xE7C4, 0x7F12, 0xE7C5, 0x7F17, 0xE7C6, 0x7F19, + 0xE7C7, 0x7F1C, 0xE7C8, 0x7F1B, 0xE7C9, 0x7F1F, 0xE7CA, 0x7F21, + 0xE7CB, 0x7F22, 0xE7CC, 0x7F23, 0xE7CD, 0x7F24, 0xE7CE, 0x7F25, + 0xE7CF, 0x7F26, 0xE7D0, 0x7F27, 0xE7D1, 0x7F2A, 0xE7D2, 0x7F2B, + 0xE7D3, 0x7F2C, 0xE7D4, 0x7F2D, 0xE7D5, 0x7F2F, 0xE7D6, 0x7F30, + 0xE7D7, 0x7F31, 0xE7D8, 0x7F32, 0xE7D9, 0x7F33, 0xE7DA, 0x7F35, + 0xE7DB, 0x5E7A, 0xE7DC, 0x757F, 0xE7DD, 0x5DDB, 0xE7DE, 0x753E, + 0xE7DF, 0x9095, 0xE7E0, 0x738E, 0xE7E1, 0x7391, 0xE7E2, 0x73AE, + 0xE7E3, 0x73A2, 0xE7E4, 0x739F, 0xE7E5, 0x73CF, 0xE7E6, 0x73C2, + 0xE7E7, 0x73D1, 0xE7E8, 0x73B7, 0xE7E9, 0x73B3, 0xE7EA, 0x73C0, + 0xE7EB, 0x73C9, 0xE7EC, 0x73C8, 0xE7ED, 0x73E5, 0xE7EE, 0x73D9, + 0xE7EF, 0x987C, 0xE7F0, 0x740A, 0xE7F1, 0x73E9, 0xE7F2, 0x73E7, + 0xE7F3, 0x73DE, 0xE7F4, 0x73BA, 0xE7F5, 0x73F2, 0xE7F6, 0x740F, + 0xE7F7, 0x742A, 0xE7F8, 0x745B, 0xE7F9, 0x7426, 0xE7FA, 0x7425, + 0xE7FB, 0x7428, 0xE7FC, 0x7430, 0xE7FD, 0x742E, 0xE7FE, 0x742C, + 0xE840, 0x942F, 0xE841, 0x9430, 0xE842, 0x9431, 0xE843, 0x9432, + 0xE844, 0x9433, 0xE845, 0x9434, 0xE846, 0x9435, 0xE847, 0x9436, + 0xE848, 0x9437, 0xE849, 0x9438, 0xE84A, 0x9439, 0xE84B, 0x943A, + 0xE84C, 0x943B, 0xE84D, 0x943C, 0xE84E, 0x943D, 0xE84F, 0x943F, + 0xE850, 0x9440, 0xE851, 0x9441, 0xE852, 0x9442, 0xE853, 0x9443, + 0xE854, 0x9444, 0xE855, 0x9445, 0xE856, 0x9446, 0xE857, 0x9447, + 0xE858, 0x9448, 0xE859, 0x9449, 0xE85A, 0x944A, 0xE85B, 0x944B, + 0xE85C, 0x944C, 0xE85D, 0x944D, 0xE85E, 0x944E, 0xE85F, 0x944F, + 0xE860, 0x9450, 0xE861, 0x9451, 0xE862, 0x9452, 0xE863, 0x9453, + 0xE864, 0x9454, 0xE865, 0x9455, 0xE866, 0x9456, 0xE867, 0x9457, + 0xE868, 0x9458, 0xE869, 0x9459, 0xE86A, 0x945A, 0xE86B, 0x945B, + 0xE86C, 0x945C, 0xE86D, 0x945D, 0xE86E, 0x945E, 0xE86F, 0x945F, + 0xE870, 0x9460, 0xE871, 0x9461, 0xE872, 0x9462, 0xE873, 0x9463, + 0xE874, 0x9464, 0xE875, 0x9465, 0xE876, 0x9466, 0xE877, 0x9467, + 0xE878, 0x9468, 0xE879, 0x9469, 0xE87A, 0x946A, 0xE87B, 0x946C, + 0xE87C, 0x946D, 0xE87D, 0x946E, 0xE87E, 0x946F, 0xE880, 0x9470, + 0xE881, 0x9471, 0xE882, 0x9472, 0xE883, 0x9473, 0xE884, 0x9474, + 0xE885, 0x9475, 0xE886, 0x9476, 0xE887, 0x9477, 0xE888, 0x9478, + 0xE889, 0x9479, 0xE88A, 0x947A, 0xE88B, 0x947B, 0xE88C, 0x947C, + 0xE88D, 0x947D, 0xE88E, 0x947E, 0xE88F, 0x947F, 0xE890, 0x9480, + 0xE891, 0x9481, 0xE892, 0x9482, 0xE893, 0x9483, 0xE894, 0x9484, + 0xE895, 0x9491, 0xE896, 0x9496, 0xE897, 0x9498, 0xE898, 0x94C7, + 0xE899, 0x94CF, 0xE89A, 0x94D3, 0xE89B, 0x94D4, 0xE89C, 0x94DA, + 0xE89D, 0x94E6, 0xE89E, 0x94FB, 0xE89F, 0x951C, 0xE8A0, 0x9520, + 0xE8A1, 0x741B, 0xE8A2, 0x741A, 0xE8A3, 0x7441, 0xE8A4, 0x745C, + 0xE8A5, 0x7457, 0xE8A6, 0x7455, 0xE8A7, 0x7459, 0xE8A8, 0x7477, + 0xE8A9, 0x746D, 0xE8AA, 0x747E, 0xE8AB, 0x749C, 0xE8AC, 0x748E, + 0xE8AD, 0x7480, 0xE8AE, 0x7481, 0xE8AF, 0x7487, 0xE8B0, 0x748B, + 0xE8B1, 0x749E, 0xE8B2, 0x74A8, 0xE8B3, 0x74A9, 0xE8B4, 0x7490, + 0xE8B5, 0x74A7, 0xE8B6, 0x74D2, 0xE8B7, 0x74BA, 0xE8B8, 0x97EA, + 0xE8B9, 0x97EB, 0xE8BA, 0x97EC, 0xE8BB, 0x674C, 0xE8BC, 0x6753, + 0xE8BD, 0x675E, 0xE8BE, 0x6748, 0xE8BF, 0x6769, 0xE8C0, 0x67A5, + 0xE8C1, 0x6787, 0xE8C2, 0x676A, 0xE8C3, 0x6773, 0xE8C4, 0x6798, + 0xE8C5, 0x67A7, 0xE8C6, 0x6775, 0xE8C7, 0x67A8, 0xE8C8, 0x679E, + 0xE8C9, 0x67AD, 0xE8CA, 0x678B, 0xE8CB, 0x6777, 0xE8CC, 0x677C, + 0xE8CD, 0x67F0, 0xE8CE, 0x6809, 0xE8CF, 0x67D8, 0xE8D0, 0x680A, + 0xE8D1, 0x67E9, 0xE8D2, 0x67B0, 0xE8D3, 0x680C, 0xE8D4, 0x67D9, + 0xE8D5, 0x67B5, 0xE8D6, 0x67DA, 0xE8D7, 0x67B3, 0xE8D8, 0x67DD, + 0xE8D9, 0x6800, 0xE8DA, 0x67C3, 0xE8DB, 0x67B8, 0xE8DC, 0x67E2, + 0xE8DD, 0x680E, 0xE8DE, 0x67C1, 0xE8DF, 0x67FD, 0xE8E0, 0x6832, + 0xE8E1, 0x6833, 0xE8E2, 0x6860, 0xE8E3, 0x6861, 0xE8E4, 0x684E, + 0xE8E5, 0x6862, 0xE8E6, 0x6844, 0xE8E7, 0x6864, 0xE8E8, 0x6883, + 0xE8E9, 0x681D, 0xE8EA, 0x6855, 0xE8EB, 0x6866, 0xE8EC, 0x6841, + 0xE8ED, 0x6867, 0xE8EE, 0x6840, 0xE8EF, 0x683E, 0xE8F0, 0x684A, + 0xE8F1, 0x6849, 0xE8F2, 0x6829, 0xE8F3, 0x68B5, 0xE8F4, 0x688F, + 0xE8F5, 0x6874, 0xE8F6, 0x6877, 0xE8F7, 0x6893, 0xE8F8, 0x686B, + 0xE8F9, 0x68C2, 0xE8FA, 0x696E, 0xE8FB, 0x68FC, 0xE8FC, 0x691F, + 0xE8FD, 0x6920, 0xE8FE, 0x68F9, 0xE940, 0x9527, 0xE941, 0x9533, + 0xE942, 0x953D, 0xE943, 0x9543, 0xE944, 0x9548, 0xE945, 0x954B, + 0xE946, 0x9555, 0xE947, 0x955A, 0xE948, 0x9560, 0xE949, 0x956E, + 0xE94A, 0x9574, 0xE94B, 0x9575, 0xE94C, 0x9577, 0xE94D, 0x9578, + 0xE94E, 0x9579, 0xE94F, 0x957A, 0xE950, 0x957B, 0xE951, 0x957C, + 0xE952, 0x957D, 0xE953, 0x957E, 0xE954, 0x9580, 0xE955, 0x9581, + 0xE956, 0x9582, 0xE957, 0x9583, 0xE958, 0x9584, 0xE959, 0x9585, + 0xE95A, 0x9586, 0xE95B, 0x9587, 0xE95C, 0x9588, 0xE95D, 0x9589, + 0xE95E, 0x958A, 0xE95F, 0x958B, 0xE960, 0x958C, 0xE961, 0x958D, + 0xE962, 0x958E, 0xE963, 0x958F, 0xE964, 0x9590, 0xE965, 0x9591, + 0xE966, 0x9592, 0xE967, 0x9593, 0xE968, 0x9594, 0xE969, 0x9595, + 0xE96A, 0x9596, 0xE96B, 0x9597, 0xE96C, 0x9598, 0xE96D, 0x9599, + 0xE96E, 0x959A, 0xE96F, 0x959B, 0xE970, 0x959C, 0xE971, 0x959D, + 0xE972, 0x959E, 0xE973, 0x959F, 0xE974, 0x95A0, 0xE975, 0x95A1, + 0xE976, 0x95A2, 0xE977, 0x95A3, 0xE978, 0x95A4, 0xE979, 0x95A5, + 0xE97A, 0x95A6, 0xE97B, 0x95A7, 0xE97C, 0x95A8, 0xE97D, 0x95A9, + 0xE97E, 0x95AA, 0xE980, 0x95AB, 0xE981, 0x95AC, 0xE982, 0x95AD, + 0xE983, 0x95AE, 0xE984, 0x95AF, 0xE985, 0x95B0, 0xE986, 0x95B1, + 0xE987, 0x95B2, 0xE988, 0x95B3, 0xE989, 0x95B4, 0xE98A, 0x95B5, + 0xE98B, 0x95B6, 0xE98C, 0x95B7, 0xE98D, 0x95B8, 0xE98E, 0x95B9, + 0xE98F, 0x95BA, 0xE990, 0x95BB, 0xE991, 0x95BC, 0xE992, 0x95BD, + 0xE993, 0x95BE, 0xE994, 0x95BF, 0xE995, 0x95C0, 0xE996, 0x95C1, + 0xE997, 0x95C2, 0xE998, 0x95C3, 0xE999, 0x95C4, 0xE99A, 0x95C5, + 0xE99B, 0x95C6, 0xE99C, 0x95C7, 0xE99D, 0x95C8, 0xE99E, 0x95C9, + 0xE99F, 0x95CA, 0xE9A0, 0x95CB, 0xE9A1, 0x6924, 0xE9A2, 0x68F0, + 0xE9A3, 0x690B, 0xE9A4, 0x6901, 0xE9A5, 0x6957, 0xE9A6, 0x68E3, + 0xE9A7, 0x6910, 0xE9A8, 0x6971, 0xE9A9, 0x6939, 0xE9AA, 0x6960, + 0xE9AB, 0x6942, 0xE9AC, 0x695D, 0xE9AD, 0x6984, 0xE9AE, 0x696B, + 0xE9AF, 0x6980, 0xE9B0, 0x6998, 0xE9B1, 0x6978, 0xE9B2, 0x6934, + 0xE9B3, 0x69CC, 0xE9B4, 0x6987, 0xE9B5, 0x6988, 0xE9B6, 0x69CE, + 0xE9B7, 0x6989, 0xE9B8, 0x6966, 0xE9B9, 0x6963, 0xE9BA, 0x6979, + 0xE9BB, 0x699B, 0xE9BC, 0x69A7, 0xE9BD, 0x69BB, 0xE9BE, 0x69AB, + 0xE9BF, 0x69AD, 0xE9C0, 0x69D4, 0xE9C1, 0x69B1, 0xE9C2, 0x69C1, + 0xE9C3, 0x69CA, 0xE9C4, 0x69DF, 0xE9C5, 0x6995, 0xE9C6, 0x69E0, + 0xE9C7, 0x698D, 0xE9C8, 0x69FF, 0xE9C9, 0x6A2F, 0xE9CA, 0x69ED, + 0xE9CB, 0x6A17, 0xE9CC, 0x6A18, 0xE9CD, 0x6A65, 0xE9CE, 0x69F2, + 0xE9CF, 0x6A44, 0xE9D0, 0x6A3E, 0xE9D1, 0x6AA0, 0xE9D2, 0x6A50, + 0xE9D3, 0x6A5B, 0xE9D4, 0x6A35, 0xE9D5, 0x6A8E, 0xE9D6, 0x6A79, + 0xE9D7, 0x6A3D, 0xE9D8, 0x6A28, 0xE9D9, 0x6A58, 0xE9DA, 0x6A7C, + 0xE9DB, 0x6A91, 0xE9DC, 0x6A90, 0xE9DD, 0x6AA9, 0xE9DE, 0x6A97, + 0xE9DF, 0x6AAB, 0xE9E0, 0x7337, 0xE9E1, 0x7352, 0xE9E2, 0x6B81, + 0xE9E3, 0x6B82, 0xE9E4, 0x6B87, 0xE9E5, 0x6B84, 0xE9E6, 0x6B92, + 0xE9E7, 0x6B93, 0xE9E8, 0x6B8D, 0xE9E9, 0x6B9A, 0xE9EA, 0x6B9B, + 0xE9EB, 0x6BA1, 0xE9EC, 0x6BAA, 0xE9ED, 0x8F6B, 0xE9EE, 0x8F6D, + 0xE9EF, 0x8F71, 0xE9F0, 0x8F72, 0xE9F1, 0x8F73, 0xE9F2, 0x8F75, + 0xE9F3, 0x8F76, 0xE9F4, 0x8F78, 0xE9F5, 0x8F77, 0xE9F6, 0x8F79, + 0xE9F7, 0x8F7A, 0xE9F8, 0x8F7C, 0xE9F9, 0x8F7E, 0xE9FA, 0x8F81, + 0xE9FB, 0x8F82, 0xE9FC, 0x8F84, 0xE9FD, 0x8F87, 0xE9FE, 0x8F8B, + 0xEA40, 0x95CC, 0xEA41, 0x95CD, 0xEA42, 0x95CE, 0xEA43, 0x95CF, + 0xEA44, 0x95D0, 0xEA45, 0x95D1, 0xEA46, 0x95D2, 0xEA47, 0x95D3, + 0xEA48, 0x95D4, 0xEA49, 0x95D5, 0xEA4A, 0x95D6, 0xEA4B, 0x95D7, + 0xEA4C, 0x95D8, 0xEA4D, 0x95D9, 0xEA4E, 0x95DA, 0xEA4F, 0x95DB, + 0xEA50, 0x95DC, 0xEA51, 0x95DD, 0xEA52, 0x95DE, 0xEA53, 0x95DF, + 0xEA54, 0x95E0, 0xEA55, 0x95E1, 0xEA56, 0x95E2, 0xEA57, 0x95E3, + 0xEA58, 0x95E4, 0xEA59, 0x95E5, 0xEA5A, 0x95E6, 0xEA5B, 0x95E7, + 0xEA5C, 0x95EC, 0xEA5D, 0x95FF, 0xEA5E, 0x9607, 0xEA5F, 0x9613, + 0xEA60, 0x9618, 0xEA61, 0x961B, 0xEA62, 0x961E, 0xEA63, 0x9620, + 0xEA64, 0x9623, 0xEA65, 0x9624, 0xEA66, 0x9625, 0xEA67, 0x9626, + 0xEA68, 0x9627, 0xEA69, 0x9628, 0xEA6A, 0x9629, 0xEA6B, 0x962B, + 0xEA6C, 0x962C, 0xEA6D, 0x962D, 0xEA6E, 0x962F, 0xEA6F, 0x9630, + 0xEA70, 0x9637, 0xEA71, 0x9638, 0xEA72, 0x9639, 0xEA73, 0x963A, + 0xEA74, 0x963E, 0xEA75, 0x9641, 0xEA76, 0x9643, 0xEA77, 0x964A, + 0xEA78, 0x964E, 0xEA79, 0x964F, 0xEA7A, 0x9651, 0xEA7B, 0x9652, + 0xEA7C, 0x9653, 0xEA7D, 0x9656, 0xEA7E, 0x9657, 0xEA80, 0x9658, + 0xEA81, 0x9659, 0xEA82, 0x965A, 0xEA83, 0x965C, 0xEA84, 0x965D, + 0xEA85, 0x965E, 0xEA86, 0x9660, 0xEA87, 0x9663, 0xEA88, 0x9665, + 0xEA89, 0x9666, 0xEA8A, 0x966B, 0xEA8B, 0x966D, 0xEA8C, 0x966E, + 0xEA8D, 0x966F, 0xEA8E, 0x9670, 0xEA8F, 0x9671, 0xEA90, 0x9673, + 0xEA91, 0x9678, 0xEA92, 0x9679, 0xEA93, 0x967A, 0xEA94, 0x967B, + 0xEA95, 0x967C, 0xEA96, 0x967D, 0xEA97, 0x967E, 0xEA98, 0x967F, + 0xEA99, 0x9680, 0xEA9A, 0x9681, 0xEA9B, 0x9682, 0xEA9C, 0x9683, + 0xEA9D, 0x9684, 0xEA9E, 0x9687, 0xEA9F, 0x9689, 0xEAA0, 0x968A, + 0xEAA1, 0x8F8D, 0xEAA2, 0x8F8E, 0xEAA3, 0x8F8F, 0xEAA4, 0x8F98, + 0xEAA5, 0x8F9A, 0xEAA6, 0x8ECE, 0xEAA7, 0x620B, 0xEAA8, 0x6217, + 0xEAA9, 0x621B, 0xEAAA, 0x621F, 0xEAAB, 0x6222, 0xEAAC, 0x6221, + 0xEAAD, 0x6225, 0xEAAE, 0x6224, 0xEAAF, 0x622C, 0xEAB0, 0x81E7, + 0xEAB1, 0x74EF, 0xEAB2, 0x74F4, 0xEAB3, 0x74FF, 0xEAB4, 0x750F, + 0xEAB5, 0x7511, 0xEAB6, 0x7513, 0xEAB7, 0x6534, 0xEAB8, 0x65EE, + 0xEAB9, 0x65EF, 0xEABA, 0x65F0, 0xEABB, 0x660A, 0xEABC, 0x6619, + 0xEABD, 0x6772, 0xEABE, 0x6603, 0xEABF, 0x6615, 0xEAC0, 0x6600, + 0xEAC1, 0x7085, 0xEAC2, 0x66F7, 0xEAC3, 0x661D, 0xEAC4, 0x6634, + 0xEAC5, 0x6631, 0xEAC6, 0x6636, 0xEAC7, 0x6635, 0xEAC8, 0x8006, + 0xEAC9, 0x665F, 0xEACA, 0x6654, 0xEACB, 0x6641, 0xEACC, 0x664F, + 0xEACD, 0x6656, 0xEACE, 0x6661, 0xEACF, 0x6657, 0xEAD0, 0x6677, + 0xEAD1, 0x6684, 0xEAD2, 0x668C, 0xEAD3, 0x66A7, 0xEAD4, 0x669D, + 0xEAD5, 0x66BE, 0xEAD6, 0x66DB, 0xEAD7, 0x66DC, 0xEAD8, 0x66E6, + 0xEAD9, 0x66E9, 0xEADA, 0x8D32, 0xEADB, 0x8D33, 0xEADC, 0x8D36, + 0xEADD, 0x8D3B, 0xEADE, 0x8D3D, 0xEADF, 0x8D40, 0xEAE0, 0x8D45, + 0xEAE1, 0x8D46, 0xEAE2, 0x8D48, 0xEAE3, 0x8D49, 0xEAE4, 0x8D47, + 0xEAE5, 0x8D4D, 0xEAE6, 0x8D55, 0xEAE7, 0x8D59, 0xEAE8, 0x89C7, + 0xEAE9, 0x89CA, 0xEAEA, 0x89CB, 0xEAEB, 0x89CC, 0xEAEC, 0x89CE, + 0xEAED, 0x89CF, 0xEAEE, 0x89D0, 0xEAEF, 0x89D1, 0xEAF0, 0x726E, + 0xEAF1, 0x729F, 0xEAF2, 0x725D, 0xEAF3, 0x7266, 0xEAF4, 0x726F, + 0xEAF5, 0x727E, 0xEAF6, 0x727F, 0xEAF7, 0x7284, 0xEAF8, 0x728B, + 0xEAF9, 0x728D, 0xEAFA, 0x728F, 0xEAFB, 0x7292, 0xEAFC, 0x6308, + 0xEAFD, 0x6332, 0xEAFE, 0x63B0, 0xEB40, 0x968C, 0xEB41, 0x968E, + 0xEB42, 0x9691, 0xEB43, 0x9692, 0xEB44, 0x9693, 0xEB45, 0x9695, + 0xEB46, 0x9696, 0xEB47, 0x969A, 0xEB48, 0x969B, 0xEB49, 0x969D, + 0xEB4A, 0x969E, 0xEB4B, 0x969F, 0xEB4C, 0x96A0, 0xEB4D, 0x96A1, + 0xEB4E, 0x96A2, 0xEB4F, 0x96A3, 0xEB50, 0x96A4, 0xEB51, 0x96A5, + 0xEB52, 0x96A6, 0xEB53, 0x96A8, 0xEB54, 0x96A9, 0xEB55, 0x96AA, + 0xEB56, 0x96AB, 0xEB57, 0x96AC, 0xEB58, 0x96AD, 0xEB59, 0x96AE, + 0xEB5A, 0x96AF, 0xEB5B, 0x96B1, 0xEB5C, 0x96B2, 0xEB5D, 0x96B4, + 0xEB5E, 0x96B5, 0xEB5F, 0x96B7, 0xEB60, 0x96B8, 0xEB61, 0x96BA, + 0xEB62, 0x96BB, 0xEB63, 0x96BF, 0xEB64, 0x96C2, 0xEB65, 0x96C3, + 0xEB66, 0x96C8, 0xEB67, 0x96CA, 0xEB68, 0x96CB, 0xEB69, 0x96D0, + 0xEB6A, 0x96D1, 0xEB6B, 0x96D3, 0xEB6C, 0x96D4, 0xEB6D, 0x96D6, + 0xEB6E, 0x96D7, 0xEB6F, 0x96D8, 0xEB70, 0x96D9, 0xEB71, 0x96DA, + 0xEB72, 0x96DB, 0xEB73, 0x96DC, 0xEB74, 0x96DD, 0xEB75, 0x96DE, + 0xEB76, 0x96DF, 0xEB77, 0x96E1, 0xEB78, 0x96E2, 0xEB79, 0x96E3, + 0xEB7A, 0x96E4, 0xEB7B, 0x96E5, 0xEB7C, 0x96E6, 0xEB7D, 0x96E7, + 0xEB7E, 0x96EB, 0xEB80, 0x96EC, 0xEB81, 0x96ED, 0xEB82, 0x96EE, + 0xEB83, 0x96F0, 0xEB84, 0x96F1, 0xEB85, 0x96F2, 0xEB86, 0x96F4, + 0xEB87, 0x96F5, 0xEB88, 0x96F8, 0xEB89, 0x96FA, 0xEB8A, 0x96FB, + 0xEB8B, 0x96FC, 0xEB8C, 0x96FD, 0xEB8D, 0x96FF, 0xEB8E, 0x9702, + 0xEB8F, 0x9703, 0xEB90, 0x9705, 0xEB91, 0x970A, 0xEB92, 0x970B, + 0xEB93, 0x970C, 0xEB94, 0x9710, 0xEB95, 0x9711, 0xEB96, 0x9712, + 0xEB97, 0x9714, 0xEB98, 0x9715, 0xEB99, 0x9717, 0xEB9A, 0x9718, + 0xEB9B, 0x9719, 0xEB9C, 0x971A, 0xEB9D, 0x971B, 0xEB9E, 0x971D, + 0xEB9F, 0x971F, 0xEBA0, 0x9720, 0xEBA1, 0x643F, 0xEBA2, 0x64D8, + 0xEBA3, 0x8004, 0xEBA4, 0x6BEA, 0xEBA5, 0x6BF3, 0xEBA6, 0x6BFD, + 0xEBA7, 0x6BF5, 0xEBA8, 0x6BF9, 0xEBA9, 0x6C05, 0xEBAA, 0x6C07, + 0xEBAB, 0x6C06, 0xEBAC, 0x6C0D, 0xEBAD, 0x6C15, 0xEBAE, 0x6C18, + 0xEBAF, 0x6C19, 0xEBB0, 0x6C1A, 0xEBB1, 0x6C21, 0xEBB2, 0x6C29, + 0xEBB3, 0x6C24, 0xEBB4, 0x6C2A, 0xEBB5, 0x6C32, 0xEBB6, 0x6535, + 0xEBB7, 0x6555, 0xEBB8, 0x656B, 0xEBB9, 0x724D, 0xEBBA, 0x7252, + 0xEBBB, 0x7256, 0xEBBC, 0x7230, 0xEBBD, 0x8662, 0xEBBE, 0x5216, + 0xEBBF, 0x809F, 0xEBC0, 0x809C, 0xEBC1, 0x8093, 0xEBC2, 0x80BC, + 0xEBC3, 0x670A, 0xEBC4, 0x80BD, 0xEBC5, 0x80B1, 0xEBC6, 0x80AB, + 0xEBC7, 0x80AD, 0xEBC8, 0x80B4, 0xEBC9, 0x80B7, 0xEBCA, 0x80E7, + 0xEBCB, 0x80E8, 0xEBCC, 0x80E9, 0xEBCD, 0x80EA, 0xEBCE, 0x80DB, + 0xEBCF, 0x80C2, 0xEBD0, 0x80C4, 0xEBD1, 0x80D9, 0xEBD2, 0x80CD, + 0xEBD3, 0x80D7, 0xEBD4, 0x6710, 0xEBD5, 0x80DD, 0xEBD6, 0x80EB, + 0xEBD7, 0x80F1, 0xEBD8, 0x80F4, 0xEBD9, 0x80ED, 0xEBDA, 0x810D, + 0xEBDB, 0x810E, 0xEBDC, 0x80F2, 0xEBDD, 0x80FC, 0xEBDE, 0x6715, + 0xEBDF, 0x8112, 0xEBE0, 0x8C5A, 0xEBE1, 0x8136, 0xEBE2, 0x811E, + 0xEBE3, 0x812C, 0xEBE4, 0x8118, 0xEBE5, 0x8132, 0xEBE6, 0x8148, + 0xEBE7, 0x814C, 0xEBE8, 0x8153, 0xEBE9, 0x8174, 0xEBEA, 0x8159, + 0xEBEB, 0x815A, 0xEBEC, 0x8171, 0xEBED, 0x8160, 0xEBEE, 0x8169, + 0xEBEF, 0x817C, 0xEBF0, 0x817D, 0xEBF1, 0x816D, 0xEBF2, 0x8167, + 0xEBF3, 0x584D, 0xEBF4, 0x5AB5, 0xEBF5, 0x8188, 0xEBF6, 0x8182, + 0xEBF7, 0x8191, 0xEBF8, 0x6ED5, 0xEBF9, 0x81A3, 0xEBFA, 0x81AA, + 0xEBFB, 0x81CC, 0xEBFC, 0x6726, 0xEBFD, 0x81CA, 0xEBFE, 0x81BB, + 0xEC40, 0x9721, 0xEC41, 0x9722, 0xEC42, 0x9723, 0xEC43, 0x9724, + 0xEC44, 0x9725, 0xEC45, 0x9726, 0xEC46, 0x9727, 0xEC47, 0x9728, + 0xEC48, 0x9729, 0xEC49, 0x972B, 0xEC4A, 0x972C, 0xEC4B, 0x972E, + 0xEC4C, 0x972F, 0xEC4D, 0x9731, 0xEC4E, 0x9733, 0xEC4F, 0x9734, + 0xEC50, 0x9735, 0xEC51, 0x9736, 0xEC52, 0x9737, 0xEC53, 0x973A, + 0xEC54, 0x973B, 0xEC55, 0x973C, 0xEC56, 0x973D, 0xEC57, 0x973F, + 0xEC58, 0x9740, 0xEC59, 0x9741, 0xEC5A, 0x9742, 0xEC5B, 0x9743, + 0xEC5C, 0x9744, 0xEC5D, 0x9745, 0xEC5E, 0x9746, 0xEC5F, 0x9747, + 0xEC60, 0x9748, 0xEC61, 0x9749, 0xEC62, 0x974A, 0xEC63, 0x974B, + 0xEC64, 0x974C, 0xEC65, 0x974D, 0xEC66, 0x974E, 0xEC67, 0x974F, + 0xEC68, 0x9750, 0xEC69, 0x9751, 0xEC6A, 0x9754, 0xEC6B, 0x9755, + 0xEC6C, 0x9757, 0xEC6D, 0x9758, 0xEC6E, 0x975A, 0xEC6F, 0x975C, + 0xEC70, 0x975D, 0xEC71, 0x975F, 0xEC72, 0x9763, 0xEC73, 0x9764, + 0xEC74, 0x9766, 0xEC75, 0x9767, 0xEC76, 0x9768, 0xEC77, 0x976A, + 0xEC78, 0x976B, 0xEC79, 0x976C, 0xEC7A, 0x976D, 0xEC7B, 0x976E, + 0xEC7C, 0x976F, 0xEC7D, 0x9770, 0xEC7E, 0x9771, 0xEC80, 0x9772, + 0xEC81, 0x9775, 0xEC82, 0x9777, 0xEC83, 0x9778, 0xEC84, 0x9779, + 0xEC85, 0x977A, 0xEC86, 0x977B, 0xEC87, 0x977D, 0xEC88, 0x977E, + 0xEC89, 0x977F, 0xEC8A, 0x9780, 0xEC8B, 0x9781, 0xEC8C, 0x9782, + 0xEC8D, 0x9783, 0xEC8E, 0x9784, 0xEC8F, 0x9786, 0xEC90, 0x9787, + 0xEC91, 0x9788, 0xEC92, 0x9789, 0xEC93, 0x978A, 0xEC94, 0x978C, + 0xEC95, 0x978E, 0xEC96, 0x978F, 0xEC97, 0x9790, 0xEC98, 0x9793, + 0xEC99, 0x9795, 0xEC9A, 0x9796, 0xEC9B, 0x9797, 0xEC9C, 0x9799, + 0xEC9D, 0x979A, 0xEC9E, 0x979B, 0xEC9F, 0x979C, 0xECA0, 0x979D, + 0xECA1, 0x81C1, 0xECA2, 0x81A6, 0xECA3, 0x6B24, 0xECA4, 0x6B37, + 0xECA5, 0x6B39, 0xECA6, 0x6B43, 0xECA7, 0x6B46, 0xECA8, 0x6B59, + 0xECA9, 0x98D1, 0xECAA, 0x98D2, 0xECAB, 0x98D3, 0xECAC, 0x98D5, + 0xECAD, 0x98D9, 0xECAE, 0x98DA, 0xECAF, 0x6BB3, 0xECB0, 0x5F40, + 0xECB1, 0x6BC2, 0xECB2, 0x89F3, 0xECB3, 0x6590, 0xECB4, 0x9F51, + 0xECB5, 0x6593, 0xECB6, 0x65BC, 0xECB7, 0x65C6, 0xECB8, 0x65C4, + 0xECB9, 0x65C3, 0xECBA, 0x65CC, 0xECBB, 0x65CE, 0xECBC, 0x65D2, + 0xECBD, 0x65D6, 0xECBE, 0x7080, 0xECBF, 0x709C, 0xECC0, 0x7096, + 0xECC1, 0x709D, 0xECC2, 0x70BB, 0xECC3, 0x70C0, 0xECC4, 0x70B7, + 0xECC5, 0x70AB, 0xECC6, 0x70B1, 0xECC7, 0x70E8, 0xECC8, 0x70CA, + 0xECC9, 0x7110, 0xECCA, 0x7113, 0xECCB, 0x7116, 0xECCC, 0x712F, + 0xECCD, 0x7131, 0xECCE, 0x7173, 0xECCF, 0x715C, 0xECD0, 0x7168, + 0xECD1, 0x7145, 0xECD2, 0x7172, 0xECD3, 0x714A, 0xECD4, 0x7178, + 0xECD5, 0x717A, 0xECD6, 0x7198, 0xECD7, 0x71B3, 0xECD8, 0x71B5, + 0xECD9, 0x71A8, 0xECDA, 0x71A0, 0xECDB, 0x71E0, 0xECDC, 0x71D4, + 0xECDD, 0x71E7, 0xECDE, 0x71F9, 0xECDF, 0x721D, 0xECE0, 0x7228, + 0xECE1, 0x706C, 0xECE2, 0x7118, 0xECE3, 0x7166, 0xECE4, 0x71B9, + 0xECE5, 0x623E, 0xECE6, 0x623D, 0xECE7, 0x6243, 0xECE8, 0x6248, + 0xECE9, 0x6249, 0xECEA, 0x793B, 0xECEB, 0x7940, 0xECEC, 0x7946, + 0xECED, 0x7949, 0xECEE, 0x795B, 0xECEF, 0x795C, 0xECF0, 0x7953, + 0xECF1, 0x795A, 0xECF2, 0x7962, 0xECF3, 0x7957, 0xECF4, 0x7960, + 0xECF5, 0x796F, 0xECF6, 0x7967, 0xECF7, 0x797A, 0xECF8, 0x7985, + 0xECF9, 0x798A, 0xECFA, 0x799A, 0xECFB, 0x79A7, 0xECFC, 0x79B3, + 0xECFD, 0x5FD1, 0xECFE, 0x5FD0, 0xED40, 0x979E, 0xED41, 0x979F, + 0xED42, 0x97A1, 0xED43, 0x97A2, 0xED44, 0x97A4, 0xED45, 0x97A5, + 0xED46, 0x97A6, 0xED47, 0x97A7, 0xED48, 0x97A8, 0xED49, 0x97A9, + 0xED4A, 0x97AA, 0xED4B, 0x97AC, 0xED4C, 0x97AE, 0xED4D, 0x97B0, + 0xED4E, 0x97B1, 0xED4F, 0x97B3, 0xED50, 0x97B5, 0xED51, 0x97B6, + 0xED52, 0x97B7, 0xED53, 0x97B8, 0xED54, 0x97B9, 0xED55, 0x97BA, + 0xED56, 0x97BB, 0xED57, 0x97BC, 0xED58, 0x97BD, 0xED59, 0x97BE, + 0xED5A, 0x97BF, 0xED5B, 0x97C0, 0xED5C, 0x97C1, 0xED5D, 0x97C2, + 0xED5E, 0x97C3, 0xED5F, 0x97C4, 0xED60, 0x97C5, 0xED61, 0x97C6, + 0xED62, 0x97C7, 0xED63, 0x97C8, 0xED64, 0x97C9, 0xED65, 0x97CA, + 0xED66, 0x97CB, 0xED67, 0x97CC, 0xED68, 0x97CD, 0xED69, 0x97CE, + 0xED6A, 0x97CF, 0xED6B, 0x97D0, 0xED6C, 0x97D1, 0xED6D, 0x97D2, + 0xED6E, 0x97D3, 0xED6F, 0x97D4, 0xED70, 0x97D5, 0xED71, 0x97D6, + 0xED72, 0x97D7, 0xED73, 0x97D8, 0xED74, 0x97D9, 0xED75, 0x97DA, + 0xED76, 0x97DB, 0xED77, 0x97DC, 0xED78, 0x97DD, 0xED79, 0x97DE, + 0xED7A, 0x97DF, 0xED7B, 0x97E0, 0xED7C, 0x97E1, 0xED7D, 0x97E2, + 0xED7E, 0x97E3, 0xED80, 0x97E4, 0xED81, 0x97E5, 0xED82, 0x97E8, + 0xED83, 0x97EE, 0xED84, 0x97EF, 0xED85, 0x97F0, 0xED86, 0x97F1, + 0xED87, 0x97F2, 0xED88, 0x97F4, 0xED89, 0x97F7, 0xED8A, 0x97F8, + 0xED8B, 0x97F9, 0xED8C, 0x97FA, 0xED8D, 0x97FB, 0xED8E, 0x97FC, + 0xED8F, 0x97FD, 0xED90, 0x97FE, 0xED91, 0x97FF, 0xED92, 0x9800, + 0xED93, 0x9801, 0xED94, 0x9802, 0xED95, 0x9803, 0xED96, 0x9804, + 0xED97, 0x9805, 0xED98, 0x9806, 0xED99, 0x9807, 0xED9A, 0x9808, + 0xED9B, 0x9809, 0xED9C, 0x980A, 0xED9D, 0x980B, 0xED9E, 0x980C, + 0xED9F, 0x980D, 0xEDA0, 0x980E, 0xEDA1, 0x603C, 0xEDA2, 0x605D, + 0xEDA3, 0x605A, 0xEDA4, 0x6067, 0xEDA5, 0x6041, 0xEDA6, 0x6059, + 0xEDA7, 0x6063, 0xEDA8, 0x60AB, 0xEDA9, 0x6106, 0xEDAA, 0x610D, + 0xEDAB, 0x615D, 0xEDAC, 0x61A9, 0xEDAD, 0x619D, 0xEDAE, 0x61CB, + 0xEDAF, 0x61D1, 0xEDB0, 0x6206, 0xEDB1, 0x8080, 0xEDB2, 0x807F, + 0xEDB3, 0x6C93, 0xEDB4, 0x6CF6, 0xEDB5, 0x6DFC, 0xEDB6, 0x77F6, + 0xEDB7, 0x77F8, 0xEDB8, 0x7800, 0xEDB9, 0x7809, 0xEDBA, 0x7817, + 0xEDBB, 0x7818, 0xEDBC, 0x7811, 0xEDBD, 0x65AB, 0xEDBE, 0x782D, + 0xEDBF, 0x781C, 0xEDC0, 0x781D, 0xEDC1, 0x7839, 0xEDC2, 0x783A, + 0xEDC3, 0x783B, 0xEDC4, 0x781F, 0xEDC5, 0x783C, 0xEDC6, 0x7825, + 0xEDC7, 0x782C, 0xEDC8, 0x7823, 0xEDC9, 0x7829, 0xEDCA, 0x784E, + 0xEDCB, 0x786D, 0xEDCC, 0x7856, 0xEDCD, 0x7857, 0xEDCE, 0x7826, + 0xEDCF, 0x7850, 0xEDD0, 0x7847, 0xEDD1, 0x784C, 0xEDD2, 0x786A, + 0xEDD3, 0x789B, 0xEDD4, 0x7893, 0xEDD5, 0x789A, 0xEDD6, 0x7887, + 0xEDD7, 0x789C, 0xEDD8, 0x78A1, 0xEDD9, 0x78A3, 0xEDDA, 0x78B2, + 0xEDDB, 0x78B9, 0xEDDC, 0x78A5, 0xEDDD, 0x78D4, 0xEDDE, 0x78D9, + 0xEDDF, 0x78C9, 0xEDE0, 0x78EC, 0xEDE1, 0x78F2, 0xEDE2, 0x7905, + 0xEDE3, 0x78F4, 0xEDE4, 0x7913, 0xEDE5, 0x7924, 0xEDE6, 0x791E, + 0xEDE7, 0x7934, 0xEDE8, 0x9F9B, 0xEDE9, 0x9EF9, 0xEDEA, 0x9EFB, + 0xEDEB, 0x9EFC, 0xEDEC, 0x76F1, 0xEDED, 0x7704, 0xEDEE, 0x770D, + 0xEDEF, 0x76F9, 0xEDF0, 0x7707, 0xEDF1, 0x7708, 0xEDF2, 0x771A, + 0xEDF3, 0x7722, 0xEDF4, 0x7719, 0xEDF5, 0x772D, 0xEDF6, 0x7726, + 0xEDF7, 0x7735, 0xEDF8, 0x7738, 0xEDF9, 0x7750, 0xEDFA, 0x7751, + 0xEDFB, 0x7747, 0xEDFC, 0x7743, 0xEDFD, 0x775A, 0xEDFE, 0x7768, + 0xEE40, 0x980F, 0xEE41, 0x9810, 0xEE42, 0x9811, 0xEE43, 0x9812, + 0xEE44, 0x9813, 0xEE45, 0x9814, 0xEE46, 0x9815, 0xEE47, 0x9816, + 0xEE48, 0x9817, 0xEE49, 0x9818, 0xEE4A, 0x9819, 0xEE4B, 0x981A, + 0xEE4C, 0x981B, 0xEE4D, 0x981C, 0xEE4E, 0x981D, 0xEE4F, 0x981E, + 0xEE50, 0x981F, 0xEE51, 0x9820, 0xEE52, 0x9821, 0xEE53, 0x9822, + 0xEE54, 0x9823, 0xEE55, 0x9824, 0xEE56, 0x9825, 0xEE57, 0x9826, + 0xEE58, 0x9827, 0xEE59, 0x9828, 0xEE5A, 0x9829, 0xEE5B, 0x982A, + 0xEE5C, 0x982B, 0xEE5D, 0x982C, 0xEE5E, 0x982D, 0xEE5F, 0x982E, + 0xEE60, 0x982F, 0xEE61, 0x9830, 0xEE62, 0x9831, 0xEE63, 0x9832, + 0xEE64, 0x9833, 0xEE65, 0x9834, 0xEE66, 0x9835, 0xEE67, 0x9836, + 0xEE68, 0x9837, 0xEE69, 0x9838, 0xEE6A, 0x9839, 0xEE6B, 0x983A, + 0xEE6C, 0x983B, 0xEE6D, 0x983C, 0xEE6E, 0x983D, 0xEE6F, 0x983E, + 0xEE70, 0x983F, 0xEE71, 0x9840, 0xEE72, 0x9841, 0xEE73, 0x9842, + 0xEE74, 0x9843, 0xEE75, 0x9844, 0xEE76, 0x9845, 0xEE77, 0x9846, + 0xEE78, 0x9847, 0xEE79, 0x9848, 0xEE7A, 0x9849, 0xEE7B, 0x984A, + 0xEE7C, 0x984B, 0xEE7D, 0x984C, 0xEE7E, 0x984D, 0xEE80, 0x984E, + 0xEE81, 0x984F, 0xEE82, 0x9850, 0xEE83, 0x9851, 0xEE84, 0x9852, + 0xEE85, 0x9853, 0xEE86, 0x9854, 0xEE87, 0x9855, 0xEE88, 0x9856, + 0xEE89, 0x9857, 0xEE8A, 0x9858, 0xEE8B, 0x9859, 0xEE8C, 0x985A, + 0xEE8D, 0x985B, 0xEE8E, 0x985C, 0xEE8F, 0x985D, 0xEE90, 0x985E, + 0xEE91, 0x985F, 0xEE92, 0x9860, 0xEE93, 0x9861, 0xEE94, 0x9862, + 0xEE95, 0x9863, 0xEE96, 0x9864, 0xEE97, 0x9865, 0xEE98, 0x9866, + 0xEE99, 0x9867, 0xEE9A, 0x9868, 0xEE9B, 0x9869, 0xEE9C, 0x986A, + 0xEE9D, 0x986B, 0xEE9E, 0x986C, 0xEE9F, 0x986D, 0xEEA0, 0x986E, + 0xEEA1, 0x7762, 0xEEA2, 0x7765, 0xEEA3, 0x777F, 0xEEA4, 0x778D, + 0xEEA5, 0x777D, 0xEEA6, 0x7780, 0xEEA7, 0x778C, 0xEEA8, 0x7791, + 0xEEA9, 0x779F, 0xEEAA, 0x77A0, 0xEEAB, 0x77B0, 0xEEAC, 0x77B5, + 0xEEAD, 0x77BD, 0xEEAE, 0x753A, 0xEEAF, 0x7540, 0xEEB0, 0x754E, + 0xEEB1, 0x754B, 0xEEB2, 0x7548, 0xEEB3, 0x755B, 0xEEB4, 0x7572, + 0xEEB5, 0x7579, 0xEEB6, 0x7583, 0xEEB7, 0x7F58, 0xEEB8, 0x7F61, + 0xEEB9, 0x7F5F, 0xEEBA, 0x8A48, 0xEEBB, 0x7F68, 0xEEBC, 0x7F74, + 0xEEBD, 0x7F71, 0xEEBE, 0x7F79, 0xEEBF, 0x7F81, 0xEEC0, 0x7F7E, + 0xEEC1, 0x76CD, 0xEEC2, 0x76E5, 0xEEC3, 0x8832, 0xEEC4, 0x9485, + 0xEEC5, 0x9486, 0xEEC6, 0x9487, 0xEEC7, 0x948B, 0xEEC8, 0x948A, + 0xEEC9, 0x948C, 0xEECA, 0x948D, 0xEECB, 0x948F, 0xEECC, 0x9490, + 0xEECD, 0x9494, 0xEECE, 0x9497, 0xEECF, 0x9495, 0xEED0, 0x949A, + 0xEED1, 0x949B, 0xEED2, 0x949C, 0xEED3, 0x94A3, 0xEED4, 0x94A4, + 0xEED5, 0x94AB, 0xEED6, 0x94AA, 0xEED7, 0x94AD, 0xEED8, 0x94AC, + 0xEED9, 0x94AF, 0xEEDA, 0x94B0, 0xEEDB, 0x94B2, 0xEEDC, 0x94B4, + 0xEEDD, 0x94B6, 0xEEDE, 0x94B7, 0xEEDF, 0x94B8, 0xEEE0, 0x94B9, + 0xEEE1, 0x94BA, 0xEEE2, 0x94BC, 0xEEE3, 0x94BD, 0xEEE4, 0x94BF, + 0xEEE5, 0x94C4, 0xEEE6, 0x94C8, 0xEEE7, 0x94C9, 0xEEE8, 0x94CA, + 0xEEE9, 0x94CB, 0xEEEA, 0x94CC, 0xEEEB, 0x94CD, 0xEEEC, 0x94CE, + 0xEEED, 0x94D0, 0xEEEE, 0x94D1, 0xEEEF, 0x94D2, 0xEEF0, 0x94D5, + 0xEEF1, 0x94D6, 0xEEF2, 0x94D7, 0xEEF3, 0x94D9, 0xEEF4, 0x94D8, + 0xEEF5, 0x94DB, 0xEEF6, 0x94DE, 0xEEF7, 0x94DF, 0xEEF8, 0x94E0, + 0xEEF9, 0x94E2, 0xEEFA, 0x94E4, 0xEEFB, 0x94E5, 0xEEFC, 0x94E7, + 0xEEFD, 0x94E8, 0xEEFE, 0x94EA, 0xEF40, 0x986F, 0xEF41, 0x9870, + 0xEF42, 0x9871, 0xEF43, 0x9872, 0xEF44, 0x9873, 0xEF45, 0x9874, + 0xEF46, 0x988B, 0xEF47, 0x988E, 0xEF48, 0x9892, 0xEF49, 0x9895, + 0xEF4A, 0x9899, 0xEF4B, 0x98A3, 0xEF4C, 0x98A8, 0xEF4D, 0x98A9, + 0xEF4E, 0x98AA, 0xEF4F, 0x98AB, 0xEF50, 0x98AC, 0xEF51, 0x98AD, + 0xEF52, 0x98AE, 0xEF53, 0x98AF, 0xEF54, 0x98B0, 0xEF55, 0x98B1, + 0xEF56, 0x98B2, 0xEF57, 0x98B3, 0xEF58, 0x98B4, 0xEF59, 0x98B5, + 0xEF5A, 0x98B6, 0xEF5B, 0x98B7, 0xEF5C, 0x98B8, 0xEF5D, 0x98B9, + 0xEF5E, 0x98BA, 0xEF5F, 0x98BB, 0xEF60, 0x98BC, 0xEF61, 0x98BD, + 0xEF62, 0x98BE, 0xEF63, 0x98BF, 0xEF64, 0x98C0, 0xEF65, 0x98C1, + 0xEF66, 0x98C2, 0xEF67, 0x98C3, 0xEF68, 0x98C4, 0xEF69, 0x98C5, + 0xEF6A, 0x98C6, 0xEF6B, 0x98C7, 0xEF6C, 0x98C8, 0xEF6D, 0x98C9, + 0xEF6E, 0x98CA, 0xEF6F, 0x98CB, 0xEF70, 0x98CC, 0xEF71, 0x98CD, + 0xEF72, 0x98CF, 0xEF73, 0x98D0, 0xEF74, 0x98D4, 0xEF75, 0x98D6, + 0xEF76, 0x98D7, 0xEF77, 0x98DB, 0xEF78, 0x98DC, 0xEF79, 0x98DD, + 0xEF7A, 0x98E0, 0xEF7B, 0x98E1, 0xEF7C, 0x98E2, 0xEF7D, 0x98E3, + 0xEF7E, 0x98E4, 0xEF80, 0x98E5, 0xEF81, 0x98E6, 0xEF82, 0x98E9, + 0xEF83, 0x98EA, 0xEF84, 0x98EB, 0xEF85, 0x98EC, 0xEF86, 0x98ED, + 0xEF87, 0x98EE, 0xEF88, 0x98EF, 0xEF89, 0x98F0, 0xEF8A, 0x98F1, + 0xEF8B, 0x98F2, 0xEF8C, 0x98F3, 0xEF8D, 0x98F4, 0xEF8E, 0x98F5, + 0xEF8F, 0x98F6, 0xEF90, 0x98F7, 0xEF91, 0x98F8, 0xEF92, 0x98F9, + 0xEF93, 0x98FA, 0xEF94, 0x98FB, 0xEF95, 0x98FC, 0xEF96, 0x98FD, + 0xEF97, 0x98FE, 0xEF98, 0x98FF, 0xEF99, 0x9900, 0xEF9A, 0x9901, + 0xEF9B, 0x9902, 0xEF9C, 0x9903, 0xEF9D, 0x9904, 0xEF9E, 0x9905, + 0xEF9F, 0x9906, 0xEFA0, 0x9907, 0xEFA1, 0x94E9, 0xEFA2, 0x94EB, + 0xEFA3, 0x94EE, 0xEFA4, 0x94EF, 0xEFA5, 0x94F3, 0xEFA6, 0x94F4, + 0xEFA7, 0x94F5, 0xEFA8, 0x94F7, 0xEFA9, 0x94F9, 0xEFAA, 0x94FC, + 0xEFAB, 0x94FD, 0xEFAC, 0x94FF, 0xEFAD, 0x9503, 0xEFAE, 0x9502, + 0xEFAF, 0x9506, 0xEFB0, 0x9507, 0xEFB1, 0x9509, 0xEFB2, 0x950A, + 0xEFB3, 0x950D, 0xEFB4, 0x950E, 0xEFB5, 0x950F, 0xEFB6, 0x9512, + 0xEFB7, 0x9513, 0xEFB8, 0x9514, 0xEFB9, 0x9515, 0xEFBA, 0x9516, + 0xEFBB, 0x9518, 0xEFBC, 0x951B, 0xEFBD, 0x951D, 0xEFBE, 0x951E, + 0xEFBF, 0x951F, 0xEFC0, 0x9522, 0xEFC1, 0x952A, 0xEFC2, 0x952B, + 0xEFC3, 0x9529, 0xEFC4, 0x952C, 0xEFC5, 0x9531, 0xEFC6, 0x9532, + 0xEFC7, 0x9534, 0xEFC8, 0x9536, 0xEFC9, 0x9537, 0xEFCA, 0x9538, + 0xEFCB, 0x953C, 0xEFCC, 0x953E, 0xEFCD, 0x953F, 0xEFCE, 0x9542, + 0xEFCF, 0x9535, 0xEFD0, 0x9544, 0xEFD1, 0x9545, 0xEFD2, 0x9546, + 0xEFD3, 0x9549, 0xEFD4, 0x954C, 0xEFD5, 0x954E, 0xEFD6, 0x954F, + 0xEFD7, 0x9552, 0xEFD8, 0x9553, 0xEFD9, 0x9554, 0xEFDA, 0x9556, + 0xEFDB, 0x9557, 0xEFDC, 0x9558, 0xEFDD, 0x9559, 0xEFDE, 0x955B, + 0xEFDF, 0x955E, 0xEFE0, 0x955F, 0xEFE1, 0x955D, 0xEFE2, 0x9561, + 0xEFE3, 0x9562, 0xEFE4, 0x9564, 0xEFE5, 0x9565, 0xEFE6, 0x9566, + 0xEFE7, 0x9567, 0xEFE8, 0x9568, 0xEFE9, 0x9569, 0xEFEA, 0x956A, + 0xEFEB, 0x956B, 0xEFEC, 0x956C, 0xEFED, 0x956F, 0xEFEE, 0x9571, + 0xEFEF, 0x9572, 0xEFF0, 0x9573, 0xEFF1, 0x953A, 0xEFF2, 0x77E7, + 0xEFF3, 0x77EC, 0xEFF4, 0x96C9, 0xEFF5, 0x79D5, 0xEFF6, 0x79ED, + 0xEFF7, 0x79E3, 0xEFF8, 0x79EB, 0xEFF9, 0x7A06, 0xEFFA, 0x5D47, + 0xEFFB, 0x7A03, 0xEFFC, 0x7A02, 0xEFFD, 0x7A1E, 0xEFFE, 0x7A14, + 0xF040, 0x9908, 0xF041, 0x9909, 0xF042, 0x990A, 0xF043, 0x990B, + 0xF044, 0x990C, 0xF045, 0x990E, 0xF046, 0x990F, 0xF047, 0x9911, + 0xF048, 0x9912, 0xF049, 0x9913, 0xF04A, 0x9914, 0xF04B, 0x9915, + 0xF04C, 0x9916, 0xF04D, 0x9917, 0xF04E, 0x9918, 0xF04F, 0x9919, + 0xF050, 0x991A, 0xF051, 0x991B, 0xF052, 0x991C, 0xF053, 0x991D, + 0xF054, 0x991E, 0xF055, 0x991F, 0xF056, 0x9920, 0xF057, 0x9921, + 0xF058, 0x9922, 0xF059, 0x9923, 0xF05A, 0x9924, 0xF05B, 0x9925, + 0xF05C, 0x9926, 0xF05D, 0x9927, 0xF05E, 0x9928, 0xF05F, 0x9929, + 0xF060, 0x992A, 0xF061, 0x992B, 0xF062, 0x992C, 0xF063, 0x992D, + 0xF064, 0x992F, 0xF065, 0x9930, 0xF066, 0x9931, 0xF067, 0x9932, + 0xF068, 0x9933, 0xF069, 0x9934, 0xF06A, 0x9935, 0xF06B, 0x9936, + 0xF06C, 0x9937, 0xF06D, 0x9938, 0xF06E, 0x9939, 0xF06F, 0x993A, + 0xF070, 0x993B, 0xF071, 0x993C, 0xF072, 0x993D, 0xF073, 0x993E, + 0xF074, 0x993F, 0xF075, 0x9940, 0xF076, 0x9941, 0xF077, 0x9942, + 0xF078, 0x9943, 0xF079, 0x9944, 0xF07A, 0x9945, 0xF07B, 0x9946, + 0xF07C, 0x9947, 0xF07D, 0x9948, 0xF07E, 0x9949, 0xF080, 0x994A, + 0xF081, 0x994B, 0xF082, 0x994C, 0xF083, 0x994D, 0xF084, 0x994E, + 0xF085, 0x994F, 0xF086, 0x9950, 0xF087, 0x9951, 0xF088, 0x9952, + 0xF089, 0x9953, 0xF08A, 0x9956, 0xF08B, 0x9957, 0xF08C, 0x9958, + 0xF08D, 0x9959, 0xF08E, 0x995A, 0xF08F, 0x995B, 0xF090, 0x995C, + 0xF091, 0x995D, 0xF092, 0x995E, 0xF093, 0x995F, 0xF094, 0x9960, + 0xF095, 0x9961, 0xF096, 0x9962, 0xF097, 0x9964, 0xF098, 0x9966, + 0xF099, 0x9973, 0xF09A, 0x9978, 0xF09B, 0x9979, 0xF09C, 0x997B, + 0xF09D, 0x997E, 0xF09E, 0x9982, 0xF09F, 0x9983, 0xF0A0, 0x9989, + 0xF0A1, 0x7A39, 0xF0A2, 0x7A37, 0xF0A3, 0x7A51, 0xF0A4, 0x9ECF, + 0xF0A5, 0x99A5, 0xF0A6, 0x7A70, 0xF0A7, 0x7688, 0xF0A8, 0x768E, + 0xF0A9, 0x7693, 0xF0AA, 0x7699, 0xF0AB, 0x76A4, 0xF0AC, 0x74DE, + 0xF0AD, 0x74E0, 0xF0AE, 0x752C, 0xF0AF, 0x9E20, 0xF0B0, 0x9E22, + 0xF0B1, 0x9E28, 0xF0B2, 0x9E29, 0xF0B3, 0x9E2A, 0xF0B4, 0x9E2B, + 0xF0B5, 0x9E2C, 0xF0B6, 0x9E32, 0xF0B7, 0x9E31, 0xF0B8, 0x9E36, + 0xF0B9, 0x9E38, 0xF0BA, 0x9E37, 0xF0BB, 0x9E39, 0xF0BC, 0x9E3A, + 0xF0BD, 0x9E3E, 0xF0BE, 0x9E41, 0xF0BF, 0x9E42, 0xF0C0, 0x9E44, + 0xF0C1, 0x9E46, 0xF0C2, 0x9E47, 0xF0C3, 0x9E48, 0xF0C4, 0x9E49, + 0xF0C5, 0x9E4B, 0xF0C6, 0x9E4C, 0xF0C7, 0x9E4E, 0xF0C8, 0x9E51, + 0xF0C9, 0x9E55, 0xF0CA, 0x9E57, 0xF0CB, 0x9E5A, 0xF0CC, 0x9E5B, + 0xF0CD, 0x9E5C, 0xF0CE, 0x9E5E, 0xF0CF, 0x9E63, 0xF0D0, 0x9E66, + 0xF0D1, 0x9E67, 0xF0D2, 0x9E68, 0xF0D3, 0x9E69, 0xF0D4, 0x9E6A, + 0xF0D5, 0x9E6B, 0xF0D6, 0x9E6C, 0xF0D7, 0x9E71, 0xF0D8, 0x9E6D, + 0xF0D9, 0x9E73, 0xF0DA, 0x7592, 0xF0DB, 0x7594, 0xF0DC, 0x7596, + 0xF0DD, 0x75A0, 0xF0DE, 0x759D, 0xF0DF, 0x75AC, 0xF0E0, 0x75A3, + 0xF0E1, 0x75B3, 0xF0E2, 0x75B4, 0xF0E3, 0x75B8, 0xF0E4, 0x75C4, + 0xF0E5, 0x75B1, 0xF0E6, 0x75B0, 0xF0E7, 0x75C3, 0xF0E8, 0x75C2, + 0xF0E9, 0x75D6, 0xF0EA, 0x75CD, 0xF0EB, 0x75E3, 0xF0EC, 0x75E8, + 0xF0ED, 0x75E6, 0xF0EE, 0x75E4, 0xF0EF, 0x75EB, 0xF0F0, 0x75E7, + 0xF0F1, 0x7603, 0xF0F2, 0x75F1, 0xF0F3, 0x75FC, 0xF0F4, 0x75FF, + 0xF0F5, 0x7610, 0xF0F6, 0x7600, 0xF0F7, 0x7605, 0xF0F8, 0x760C, + 0xF0F9, 0x7617, 0xF0FA, 0x760A, 0xF0FB, 0x7625, 0xF0FC, 0x7618, + 0xF0FD, 0x7615, 0xF0FE, 0x7619, 0xF140, 0x998C, 0xF141, 0x998E, + 0xF142, 0x999A, 0xF143, 0x999B, 0xF144, 0x999C, 0xF145, 0x999D, + 0xF146, 0x999E, 0xF147, 0x999F, 0xF148, 0x99A0, 0xF149, 0x99A1, + 0xF14A, 0x99A2, 0xF14B, 0x99A3, 0xF14C, 0x99A4, 0xF14D, 0x99A6, + 0xF14E, 0x99A7, 0xF14F, 0x99A9, 0xF150, 0x99AA, 0xF151, 0x99AB, + 0xF152, 0x99AC, 0xF153, 0x99AD, 0xF154, 0x99AE, 0xF155, 0x99AF, + 0xF156, 0x99B0, 0xF157, 0x99B1, 0xF158, 0x99B2, 0xF159, 0x99B3, + 0xF15A, 0x99B4, 0xF15B, 0x99B5, 0xF15C, 0x99B6, 0xF15D, 0x99B7, + 0xF15E, 0x99B8, 0xF15F, 0x99B9, 0xF160, 0x99BA, 0xF161, 0x99BB, + 0xF162, 0x99BC, 0xF163, 0x99BD, 0xF164, 0x99BE, 0xF165, 0x99BF, + 0xF166, 0x99C0, 0xF167, 0x99C1, 0xF168, 0x99C2, 0xF169, 0x99C3, + 0xF16A, 0x99C4, 0xF16B, 0x99C5, 0xF16C, 0x99C6, 0xF16D, 0x99C7, + 0xF16E, 0x99C8, 0xF16F, 0x99C9, 0xF170, 0x99CA, 0xF171, 0x99CB, + 0xF172, 0x99CC, 0xF173, 0x99CD, 0xF174, 0x99CE, 0xF175, 0x99CF, + 0xF176, 0x99D0, 0xF177, 0x99D1, 0xF178, 0x99D2, 0xF179, 0x99D3, + 0xF17A, 0x99D4, 0xF17B, 0x99D5, 0xF17C, 0x99D6, 0xF17D, 0x99D7, + 0xF17E, 0x99D8, 0xF180, 0x99D9, 0xF181, 0x99DA, 0xF182, 0x99DB, + 0xF183, 0x99DC, 0xF184, 0x99DD, 0xF185, 0x99DE, 0xF186, 0x99DF, + 0xF187, 0x99E0, 0xF188, 0x99E1, 0xF189, 0x99E2, 0xF18A, 0x99E3, + 0xF18B, 0x99E4, 0xF18C, 0x99E5, 0xF18D, 0x99E6, 0xF18E, 0x99E7, + 0xF18F, 0x99E8, 0xF190, 0x99E9, 0xF191, 0x99EA, 0xF192, 0x99EB, + 0xF193, 0x99EC, 0xF194, 0x99ED, 0xF195, 0x99EE, 0xF196, 0x99EF, + 0xF197, 0x99F0, 0xF198, 0x99F1, 0xF199, 0x99F2, 0xF19A, 0x99F3, + 0xF19B, 0x99F4, 0xF19C, 0x99F5, 0xF19D, 0x99F6, 0xF19E, 0x99F7, + 0xF19F, 0x99F8, 0xF1A0, 0x99F9, 0xF1A1, 0x761B, 0xF1A2, 0x763C, + 0xF1A3, 0x7622, 0xF1A4, 0x7620, 0xF1A5, 0x7640, 0xF1A6, 0x762D, + 0xF1A7, 0x7630, 0xF1A8, 0x763F, 0xF1A9, 0x7635, 0xF1AA, 0x7643, + 0xF1AB, 0x763E, 0xF1AC, 0x7633, 0xF1AD, 0x764D, 0xF1AE, 0x765E, + 0xF1AF, 0x7654, 0xF1B0, 0x765C, 0xF1B1, 0x7656, 0xF1B2, 0x766B, + 0xF1B3, 0x766F, 0xF1B4, 0x7FCA, 0xF1B5, 0x7AE6, 0xF1B6, 0x7A78, + 0xF1B7, 0x7A79, 0xF1B8, 0x7A80, 0xF1B9, 0x7A86, 0xF1BA, 0x7A88, + 0xF1BB, 0x7A95, 0xF1BC, 0x7AA6, 0xF1BD, 0x7AA0, 0xF1BE, 0x7AAC, + 0xF1BF, 0x7AA8, 0xF1C0, 0x7AAD, 0xF1C1, 0x7AB3, 0xF1C2, 0x8864, + 0xF1C3, 0x8869, 0xF1C4, 0x8872, 0xF1C5, 0x887D, 0xF1C6, 0x887F, + 0xF1C7, 0x8882, 0xF1C8, 0x88A2, 0xF1C9, 0x88C6, 0xF1CA, 0x88B7, + 0xF1CB, 0x88BC, 0xF1CC, 0x88C9, 0xF1CD, 0x88E2, 0xF1CE, 0x88CE, + 0xF1CF, 0x88E3, 0xF1D0, 0x88E5, 0xF1D1, 0x88F1, 0xF1D2, 0x891A, + 0xF1D3, 0x88FC, 0xF1D4, 0x88E8, 0xF1D5, 0x88FE, 0xF1D6, 0x88F0, + 0xF1D7, 0x8921, 0xF1D8, 0x8919, 0xF1D9, 0x8913, 0xF1DA, 0x891B, + 0xF1DB, 0x890A, 0xF1DC, 0x8934, 0xF1DD, 0x892B, 0xF1DE, 0x8936, + 0xF1DF, 0x8941, 0xF1E0, 0x8966, 0xF1E1, 0x897B, 0xF1E2, 0x758B, + 0xF1E3, 0x80E5, 0xF1E4, 0x76B2, 0xF1E5, 0x76B4, 0xF1E6, 0x77DC, + 0xF1E7, 0x8012, 0xF1E8, 0x8014, 0xF1E9, 0x8016, 0xF1EA, 0x801C, + 0xF1EB, 0x8020, 0xF1EC, 0x8022, 0xF1ED, 0x8025, 0xF1EE, 0x8026, + 0xF1EF, 0x8027, 0xF1F0, 0x8029, 0xF1F1, 0x8028, 0xF1F2, 0x8031, + 0xF1F3, 0x800B, 0xF1F4, 0x8035, 0xF1F5, 0x8043, 0xF1F6, 0x8046, + 0xF1F7, 0x804D, 0xF1F8, 0x8052, 0xF1F9, 0x8069, 0xF1FA, 0x8071, + 0xF1FB, 0x8983, 0xF1FC, 0x9878, 0xF1FD, 0x9880, 0xF1FE, 0x9883, + 0xF240, 0x99FA, 0xF241, 0x99FB, 0xF242, 0x99FC, 0xF243, 0x99FD, + 0xF244, 0x99FE, 0xF245, 0x99FF, 0xF246, 0x9A00, 0xF247, 0x9A01, + 0xF248, 0x9A02, 0xF249, 0x9A03, 0xF24A, 0x9A04, 0xF24B, 0x9A05, + 0xF24C, 0x9A06, 0xF24D, 0x9A07, 0xF24E, 0x9A08, 0xF24F, 0x9A09, + 0xF250, 0x9A0A, 0xF251, 0x9A0B, 0xF252, 0x9A0C, 0xF253, 0x9A0D, + 0xF254, 0x9A0E, 0xF255, 0x9A0F, 0xF256, 0x9A10, 0xF257, 0x9A11, + 0xF258, 0x9A12, 0xF259, 0x9A13, 0xF25A, 0x9A14, 0xF25B, 0x9A15, + 0xF25C, 0x9A16, 0xF25D, 0x9A17, 0xF25E, 0x9A18, 0xF25F, 0x9A19, + 0xF260, 0x9A1A, 0xF261, 0x9A1B, 0xF262, 0x9A1C, 0xF263, 0x9A1D, + 0xF264, 0x9A1E, 0xF265, 0x9A1F, 0xF266, 0x9A20, 0xF267, 0x9A21, + 0xF268, 0x9A22, 0xF269, 0x9A23, 0xF26A, 0x9A24, 0xF26B, 0x9A25, + 0xF26C, 0x9A26, 0xF26D, 0x9A27, 0xF26E, 0x9A28, 0xF26F, 0x9A29, + 0xF270, 0x9A2A, 0xF271, 0x9A2B, 0xF272, 0x9A2C, 0xF273, 0x9A2D, + 0xF274, 0x9A2E, 0xF275, 0x9A2F, 0xF276, 0x9A30, 0xF277, 0x9A31, + 0xF278, 0x9A32, 0xF279, 0x9A33, 0xF27A, 0x9A34, 0xF27B, 0x9A35, + 0xF27C, 0x9A36, 0xF27D, 0x9A37, 0xF27E, 0x9A38, 0xF280, 0x9A39, + 0xF281, 0x9A3A, 0xF282, 0x9A3B, 0xF283, 0x9A3C, 0xF284, 0x9A3D, + 0xF285, 0x9A3E, 0xF286, 0x9A3F, 0xF287, 0x9A40, 0xF288, 0x9A41, + 0xF289, 0x9A42, 0xF28A, 0x9A43, 0xF28B, 0x9A44, 0xF28C, 0x9A45, + 0xF28D, 0x9A46, 0xF28E, 0x9A47, 0xF28F, 0x9A48, 0xF290, 0x9A49, + 0xF291, 0x9A4A, 0xF292, 0x9A4B, 0xF293, 0x9A4C, 0xF294, 0x9A4D, + 0xF295, 0x9A4E, 0xF296, 0x9A4F, 0xF297, 0x9A50, 0xF298, 0x9A51, + 0xF299, 0x9A52, 0xF29A, 0x9A53, 0xF29B, 0x9A54, 0xF29C, 0x9A55, + 0xF29D, 0x9A56, 0xF29E, 0x9A57, 0xF29F, 0x9A58, 0xF2A0, 0x9A59, + 0xF2A1, 0x9889, 0xF2A2, 0x988C, 0xF2A3, 0x988D, 0xF2A4, 0x988F, + 0xF2A5, 0x9894, 0xF2A6, 0x989A, 0xF2A7, 0x989B, 0xF2A8, 0x989E, + 0xF2A9, 0x989F, 0xF2AA, 0x98A1, 0xF2AB, 0x98A2, 0xF2AC, 0x98A5, + 0xF2AD, 0x98A6, 0xF2AE, 0x864D, 0xF2AF, 0x8654, 0xF2B0, 0x866C, + 0xF2B1, 0x866E, 0xF2B2, 0x867F, 0xF2B3, 0x867A, 0xF2B4, 0x867C, + 0xF2B5, 0x867B, 0xF2B6, 0x86A8, 0xF2B7, 0x868D, 0xF2B8, 0x868B, + 0xF2B9, 0x86AC, 0xF2BA, 0x869D, 0xF2BB, 0x86A7, 0xF2BC, 0x86A3, + 0xF2BD, 0x86AA, 0xF2BE, 0x8693, 0xF2BF, 0x86A9, 0xF2C0, 0x86B6, + 0xF2C1, 0x86C4, 0xF2C2, 0x86B5, 0xF2C3, 0x86CE, 0xF2C4, 0x86B0, + 0xF2C5, 0x86BA, 0xF2C6, 0x86B1, 0xF2C7, 0x86AF, 0xF2C8, 0x86C9, + 0xF2C9, 0x86CF, 0xF2CA, 0x86B4, 0xF2CB, 0x86E9, 0xF2CC, 0x86F1, + 0xF2CD, 0x86F2, 0xF2CE, 0x86ED, 0xF2CF, 0x86F3, 0xF2D0, 0x86D0, + 0xF2D1, 0x8713, 0xF2D2, 0x86DE, 0xF2D3, 0x86F4, 0xF2D4, 0x86DF, + 0xF2D5, 0x86D8, 0xF2D6, 0x86D1, 0xF2D7, 0x8703, 0xF2D8, 0x8707, + 0xF2D9, 0x86F8, 0xF2DA, 0x8708, 0xF2DB, 0x870A, 0xF2DC, 0x870D, + 0xF2DD, 0x8709, 0xF2DE, 0x8723, 0xF2DF, 0x873B, 0xF2E0, 0x871E, + 0xF2E1, 0x8725, 0xF2E2, 0x872E, 0xF2E3, 0x871A, 0xF2E4, 0x873E, + 0xF2E5, 0x8748, 0xF2E6, 0x8734, 0xF2E7, 0x8731, 0xF2E8, 0x8729, + 0xF2E9, 0x8737, 0xF2EA, 0x873F, 0xF2EB, 0x8782, 0xF2EC, 0x8722, + 0xF2ED, 0x877D, 0xF2EE, 0x877E, 0xF2EF, 0x877B, 0xF2F0, 0x8760, + 0xF2F1, 0x8770, 0xF2F2, 0x874C, 0xF2F3, 0x876E, 0xF2F4, 0x878B, + 0xF2F5, 0x8753, 0xF2F6, 0x8763, 0xF2F7, 0x877C, 0xF2F8, 0x8764, + 0xF2F9, 0x8759, 0xF2FA, 0x8765, 0xF2FB, 0x8793, 0xF2FC, 0x87AF, + 0xF2FD, 0x87A8, 0xF2FE, 0x87D2, 0xF340, 0x9A5A, 0xF341, 0x9A5B, + 0xF342, 0x9A5C, 0xF343, 0x9A5D, 0xF344, 0x9A5E, 0xF345, 0x9A5F, + 0xF346, 0x9A60, 0xF347, 0x9A61, 0xF348, 0x9A62, 0xF349, 0x9A63, + 0xF34A, 0x9A64, 0xF34B, 0x9A65, 0xF34C, 0x9A66, 0xF34D, 0x9A67, + 0xF34E, 0x9A68, 0xF34F, 0x9A69, 0xF350, 0x9A6A, 0xF351, 0x9A6B, + 0xF352, 0x9A72, 0xF353, 0x9A83, 0xF354, 0x9A89, 0xF355, 0x9A8D, + 0xF356, 0x9A8E, 0xF357, 0x9A94, 0xF358, 0x9A95, 0xF359, 0x9A99, + 0xF35A, 0x9AA6, 0xF35B, 0x9AA9, 0xF35C, 0x9AAA, 0xF35D, 0x9AAB, + 0xF35E, 0x9AAC, 0xF35F, 0x9AAD, 0xF360, 0x9AAE, 0xF361, 0x9AAF, + 0xF362, 0x9AB2, 0xF363, 0x9AB3, 0xF364, 0x9AB4, 0xF365, 0x9AB5, + 0xF366, 0x9AB9, 0xF367, 0x9ABB, 0xF368, 0x9ABD, 0xF369, 0x9ABE, + 0xF36A, 0x9ABF, 0xF36B, 0x9AC3, 0xF36C, 0x9AC4, 0xF36D, 0x9AC6, + 0xF36E, 0x9AC7, 0xF36F, 0x9AC8, 0xF370, 0x9AC9, 0xF371, 0x9ACA, + 0xF372, 0x9ACD, 0xF373, 0x9ACE, 0xF374, 0x9ACF, 0xF375, 0x9AD0, + 0xF376, 0x9AD2, 0xF377, 0x9AD4, 0xF378, 0x9AD5, 0xF379, 0x9AD6, + 0xF37A, 0x9AD7, 0xF37B, 0x9AD9, 0xF37C, 0x9ADA, 0xF37D, 0x9ADB, + 0xF37E, 0x9ADC, 0xF380, 0x9ADD, 0xF381, 0x9ADE, 0xF382, 0x9AE0, + 0xF383, 0x9AE2, 0xF384, 0x9AE3, 0xF385, 0x9AE4, 0xF386, 0x9AE5, + 0xF387, 0x9AE7, 0xF388, 0x9AE8, 0xF389, 0x9AE9, 0xF38A, 0x9AEA, + 0xF38B, 0x9AEC, 0xF38C, 0x9AEE, 0xF38D, 0x9AF0, 0xF38E, 0x9AF1, + 0xF38F, 0x9AF2, 0xF390, 0x9AF3, 0xF391, 0x9AF4, 0xF392, 0x9AF5, + 0xF393, 0x9AF6, 0xF394, 0x9AF7, 0xF395, 0x9AF8, 0xF396, 0x9AFA, + 0xF397, 0x9AFC, 0xF398, 0x9AFD, 0xF399, 0x9AFE, 0xF39A, 0x9AFF, + 0xF39B, 0x9B00, 0xF39C, 0x9B01, 0xF39D, 0x9B02, 0xF39E, 0x9B04, + 0xF39F, 0x9B05, 0xF3A0, 0x9B06, 0xF3A1, 0x87C6, 0xF3A2, 0x8788, + 0xF3A3, 0x8785, 0xF3A4, 0x87AD, 0xF3A5, 0x8797, 0xF3A6, 0x8783, + 0xF3A7, 0x87AB, 0xF3A8, 0x87E5, 0xF3A9, 0x87AC, 0xF3AA, 0x87B5, + 0xF3AB, 0x87B3, 0xF3AC, 0x87CB, 0xF3AD, 0x87D3, 0xF3AE, 0x87BD, + 0xF3AF, 0x87D1, 0xF3B0, 0x87C0, 0xF3B1, 0x87CA, 0xF3B2, 0x87DB, + 0xF3B3, 0x87EA, 0xF3B4, 0x87E0, 0xF3B5, 0x87EE, 0xF3B6, 0x8816, + 0xF3B7, 0x8813, 0xF3B8, 0x87FE, 0xF3B9, 0x880A, 0xF3BA, 0x881B, + 0xF3BB, 0x8821, 0xF3BC, 0x8839, 0xF3BD, 0x883C, 0xF3BE, 0x7F36, + 0xF3BF, 0x7F42, 0xF3C0, 0x7F44, 0xF3C1, 0x7F45, 0xF3C2, 0x8210, + 0xF3C3, 0x7AFA, 0xF3C4, 0x7AFD, 0xF3C5, 0x7B08, 0xF3C6, 0x7B03, + 0xF3C7, 0x7B04, 0xF3C8, 0x7B15, 0xF3C9, 0x7B0A, 0xF3CA, 0x7B2B, + 0xF3CB, 0x7B0F, 0xF3CC, 0x7B47, 0xF3CD, 0x7B38, 0xF3CE, 0x7B2A, + 0xF3CF, 0x7B19, 0xF3D0, 0x7B2E, 0xF3D1, 0x7B31, 0xF3D2, 0x7B20, + 0xF3D3, 0x7B25, 0xF3D4, 0x7B24, 0xF3D5, 0x7B33, 0xF3D6, 0x7B3E, + 0xF3D7, 0x7B1E, 0xF3D8, 0x7B58, 0xF3D9, 0x7B5A, 0xF3DA, 0x7B45, + 0xF3DB, 0x7B75, 0xF3DC, 0x7B4C, 0xF3DD, 0x7B5D, 0xF3DE, 0x7B60, + 0xF3DF, 0x7B6E, 0xF3E0, 0x7B7B, 0xF3E1, 0x7B62, 0xF3E2, 0x7B72, + 0xF3E3, 0x7B71, 0xF3E4, 0x7B90, 0xF3E5, 0x7BA6, 0xF3E6, 0x7BA7, + 0xF3E7, 0x7BB8, 0xF3E8, 0x7BAC, 0xF3E9, 0x7B9D, 0xF3EA, 0x7BA8, + 0xF3EB, 0x7B85, 0xF3EC, 0x7BAA, 0xF3ED, 0x7B9C, 0xF3EE, 0x7BA2, + 0xF3EF, 0x7BAB, 0xF3F0, 0x7BB4, 0xF3F1, 0x7BD1, 0xF3F2, 0x7BC1, + 0xF3F3, 0x7BCC, 0xF3F4, 0x7BDD, 0xF3F5, 0x7BDA, 0xF3F6, 0x7BE5, + 0xF3F7, 0x7BE6, 0xF3F8, 0x7BEA, 0xF3F9, 0x7C0C, 0xF3FA, 0x7BFE, + 0xF3FB, 0x7BFC, 0xF3FC, 0x7C0F, 0xF3FD, 0x7C16, 0xF3FE, 0x7C0B, + 0xF440, 0x9B07, 0xF441, 0x9B09, 0xF442, 0x9B0A, 0xF443, 0x9B0B, + 0xF444, 0x9B0C, 0xF445, 0x9B0D, 0xF446, 0x9B0E, 0xF447, 0x9B10, + 0xF448, 0x9B11, 0xF449, 0x9B12, 0xF44A, 0x9B14, 0xF44B, 0x9B15, + 0xF44C, 0x9B16, 0xF44D, 0x9B17, 0xF44E, 0x9B18, 0xF44F, 0x9B19, + 0xF450, 0x9B1A, 0xF451, 0x9B1B, 0xF452, 0x9B1C, 0xF453, 0x9B1D, + 0xF454, 0x9B1E, 0xF455, 0x9B20, 0xF456, 0x9B21, 0xF457, 0x9B22, + 0xF458, 0x9B24, 0xF459, 0x9B25, 0xF45A, 0x9B26, 0xF45B, 0x9B27, + 0xF45C, 0x9B28, 0xF45D, 0x9B29, 0xF45E, 0x9B2A, 0xF45F, 0x9B2B, + 0xF460, 0x9B2C, 0xF461, 0x9B2D, 0xF462, 0x9B2E, 0xF463, 0x9B30, + 0xF464, 0x9B31, 0xF465, 0x9B33, 0xF466, 0x9B34, 0xF467, 0x9B35, + 0xF468, 0x9B36, 0xF469, 0x9B37, 0xF46A, 0x9B38, 0xF46B, 0x9B39, + 0xF46C, 0x9B3A, 0xF46D, 0x9B3D, 0xF46E, 0x9B3E, 0xF46F, 0x9B3F, + 0xF470, 0x9B40, 0xF471, 0x9B46, 0xF472, 0x9B4A, 0xF473, 0x9B4B, + 0xF474, 0x9B4C, 0xF475, 0x9B4E, 0xF476, 0x9B50, 0xF477, 0x9B52, + 0xF478, 0x9B53, 0xF479, 0x9B55, 0xF47A, 0x9B56, 0xF47B, 0x9B57, + 0xF47C, 0x9B58, 0xF47D, 0x9B59, 0xF47E, 0x9B5A, 0xF480, 0x9B5B, + 0xF481, 0x9B5C, 0xF482, 0x9B5D, 0xF483, 0x9B5E, 0xF484, 0x9B5F, + 0xF485, 0x9B60, 0xF486, 0x9B61, 0xF487, 0x9B62, 0xF488, 0x9B63, + 0xF489, 0x9B64, 0xF48A, 0x9B65, 0xF48B, 0x9B66, 0xF48C, 0x9B67, + 0xF48D, 0x9B68, 0xF48E, 0x9B69, 0xF48F, 0x9B6A, 0xF490, 0x9B6B, + 0xF491, 0x9B6C, 0xF492, 0x9B6D, 0xF493, 0x9B6E, 0xF494, 0x9B6F, + 0xF495, 0x9B70, 0xF496, 0x9B71, 0xF497, 0x9B72, 0xF498, 0x9B73, + 0xF499, 0x9B74, 0xF49A, 0x9B75, 0xF49B, 0x9B76, 0xF49C, 0x9B77, + 0xF49D, 0x9B78, 0xF49E, 0x9B79, 0xF49F, 0x9B7A, 0xF4A0, 0x9B7B, + 0xF4A1, 0x7C1F, 0xF4A2, 0x7C2A, 0xF4A3, 0x7C26, 0xF4A4, 0x7C38, + 0xF4A5, 0x7C41, 0xF4A6, 0x7C40, 0xF4A7, 0x81FE, 0xF4A8, 0x8201, + 0xF4A9, 0x8202, 0xF4AA, 0x8204, 0xF4AB, 0x81EC, 0xF4AC, 0x8844, + 0xF4AD, 0x8221, 0xF4AE, 0x8222, 0xF4AF, 0x8223, 0xF4B0, 0x822D, + 0xF4B1, 0x822F, 0xF4B2, 0x8228, 0xF4B3, 0x822B, 0xF4B4, 0x8238, + 0xF4B5, 0x823B, 0xF4B6, 0x8233, 0xF4B7, 0x8234, 0xF4B8, 0x823E, + 0xF4B9, 0x8244, 0xF4BA, 0x8249, 0xF4BB, 0x824B, 0xF4BC, 0x824F, + 0xF4BD, 0x825A, 0xF4BE, 0x825F, 0xF4BF, 0x8268, 0xF4C0, 0x887E, + 0xF4C1, 0x8885, 0xF4C2, 0x8888, 0xF4C3, 0x88D8, 0xF4C4, 0x88DF, + 0xF4C5, 0x895E, 0xF4C6, 0x7F9D, 0xF4C7, 0x7F9F, 0xF4C8, 0x7FA7, + 0xF4C9, 0x7FAF, 0xF4CA, 0x7FB0, 0xF4CB, 0x7FB2, 0xF4CC, 0x7C7C, + 0xF4CD, 0x6549, 0xF4CE, 0x7C91, 0xF4CF, 0x7C9D, 0xF4D0, 0x7C9C, + 0xF4D1, 0x7C9E, 0xF4D2, 0x7CA2, 0xF4D3, 0x7CB2, 0xF4D4, 0x7CBC, + 0xF4D5, 0x7CBD, 0xF4D6, 0x7CC1, 0xF4D7, 0x7CC7, 0xF4D8, 0x7CCC, + 0xF4D9, 0x7CCD, 0xF4DA, 0x7CC8, 0xF4DB, 0x7CC5, 0xF4DC, 0x7CD7, + 0xF4DD, 0x7CE8, 0xF4DE, 0x826E, 0xF4DF, 0x66A8, 0xF4E0, 0x7FBF, + 0xF4E1, 0x7FCE, 0xF4E2, 0x7FD5, 0xF4E3, 0x7FE5, 0xF4E4, 0x7FE1, + 0xF4E5, 0x7FE6, 0xF4E6, 0x7FE9, 0xF4E7, 0x7FEE, 0xF4E8, 0x7FF3, + 0xF4E9, 0x7CF8, 0xF4EA, 0x7D77, 0xF4EB, 0x7DA6, 0xF4EC, 0x7DAE, + 0xF4ED, 0x7E47, 0xF4EE, 0x7E9B, 0xF4EF, 0x9EB8, 0xF4F0, 0x9EB4, + 0xF4F1, 0x8D73, 0xF4F2, 0x8D84, 0xF4F3, 0x8D94, 0xF4F4, 0x8D91, + 0xF4F5, 0x8DB1, 0xF4F6, 0x8D67, 0xF4F7, 0x8D6D, 0xF4F8, 0x8C47, + 0xF4F9, 0x8C49, 0xF4FA, 0x914A, 0xF4FB, 0x9150, 0xF4FC, 0x914E, + 0xF4FD, 0x914F, 0xF4FE, 0x9164, 0xF540, 0x9B7C, 0xF541, 0x9B7D, + 0xF542, 0x9B7E, 0xF543, 0x9B7F, 0xF544, 0x9B80, 0xF545, 0x9B81, + 0xF546, 0x9B82, 0xF547, 0x9B83, 0xF548, 0x9B84, 0xF549, 0x9B85, + 0xF54A, 0x9B86, 0xF54B, 0x9B87, 0xF54C, 0x9B88, 0xF54D, 0x9B89, + 0xF54E, 0x9B8A, 0xF54F, 0x9B8B, 0xF550, 0x9B8C, 0xF551, 0x9B8D, + 0xF552, 0x9B8E, 0xF553, 0x9B8F, 0xF554, 0x9B90, 0xF555, 0x9B91, + 0xF556, 0x9B92, 0xF557, 0x9B93, 0xF558, 0x9B94, 0xF559, 0x9B95, + 0xF55A, 0x9B96, 0xF55B, 0x9B97, 0xF55C, 0x9B98, 0xF55D, 0x9B99, + 0xF55E, 0x9B9A, 0xF55F, 0x9B9B, 0xF560, 0x9B9C, 0xF561, 0x9B9D, + 0xF562, 0x9B9E, 0xF563, 0x9B9F, 0xF564, 0x9BA0, 0xF565, 0x9BA1, + 0xF566, 0x9BA2, 0xF567, 0x9BA3, 0xF568, 0x9BA4, 0xF569, 0x9BA5, + 0xF56A, 0x9BA6, 0xF56B, 0x9BA7, 0xF56C, 0x9BA8, 0xF56D, 0x9BA9, + 0xF56E, 0x9BAA, 0xF56F, 0x9BAB, 0xF570, 0x9BAC, 0xF571, 0x9BAD, + 0xF572, 0x9BAE, 0xF573, 0x9BAF, 0xF574, 0x9BB0, 0xF575, 0x9BB1, + 0xF576, 0x9BB2, 0xF577, 0x9BB3, 0xF578, 0x9BB4, 0xF579, 0x9BB5, + 0xF57A, 0x9BB6, 0xF57B, 0x9BB7, 0xF57C, 0x9BB8, 0xF57D, 0x9BB9, + 0xF57E, 0x9BBA, 0xF580, 0x9BBB, 0xF581, 0x9BBC, 0xF582, 0x9BBD, + 0xF583, 0x9BBE, 0xF584, 0x9BBF, 0xF585, 0x9BC0, 0xF586, 0x9BC1, + 0xF587, 0x9BC2, 0xF588, 0x9BC3, 0xF589, 0x9BC4, 0xF58A, 0x9BC5, + 0xF58B, 0x9BC6, 0xF58C, 0x9BC7, 0xF58D, 0x9BC8, 0xF58E, 0x9BC9, + 0xF58F, 0x9BCA, 0xF590, 0x9BCB, 0xF591, 0x9BCC, 0xF592, 0x9BCD, + 0xF593, 0x9BCE, 0xF594, 0x9BCF, 0xF595, 0x9BD0, 0xF596, 0x9BD1, + 0xF597, 0x9BD2, 0xF598, 0x9BD3, 0xF599, 0x9BD4, 0xF59A, 0x9BD5, + 0xF59B, 0x9BD6, 0xF59C, 0x9BD7, 0xF59D, 0x9BD8, 0xF59E, 0x9BD9, + 0xF59F, 0x9BDA, 0xF5A0, 0x9BDB, 0xF5A1, 0x9162, 0xF5A2, 0x9161, + 0xF5A3, 0x9170, 0xF5A4, 0x9169, 0xF5A5, 0x916F, 0xF5A6, 0x917D, + 0xF5A7, 0x917E, 0xF5A8, 0x9172, 0xF5A9, 0x9174, 0xF5AA, 0x9179, + 0xF5AB, 0x918C, 0xF5AC, 0x9185, 0xF5AD, 0x9190, 0xF5AE, 0x918D, + 0xF5AF, 0x9191, 0xF5B0, 0x91A2, 0xF5B1, 0x91A3, 0xF5B2, 0x91AA, + 0xF5B3, 0x91AD, 0xF5B4, 0x91AE, 0xF5B5, 0x91AF, 0xF5B6, 0x91B5, + 0xF5B7, 0x91B4, 0xF5B8, 0x91BA, 0xF5B9, 0x8C55, 0xF5BA, 0x9E7E, + 0xF5BB, 0x8DB8, 0xF5BC, 0x8DEB, 0xF5BD, 0x8E05, 0xF5BE, 0x8E59, + 0xF5BF, 0x8E69, 0xF5C0, 0x8DB5, 0xF5C1, 0x8DBF, 0xF5C2, 0x8DBC, + 0xF5C3, 0x8DBA, 0xF5C4, 0x8DC4, 0xF5C5, 0x8DD6, 0xF5C6, 0x8DD7, + 0xF5C7, 0x8DDA, 0xF5C8, 0x8DDE, 0xF5C9, 0x8DCE, 0xF5CA, 0x8DCF, + 0xF5CB, 0x8DDB, 0xF5CC, 0x8DC6, 0xF5CD, 0x8DEC, 0xF5CE, 0x8DF7, + 0xF5CF, 0x8DF8, 0xF5D0, 0x8DE3, 0xF5D1, 0x8DF9, 0xF5D2, 0x8DFB, + 0xF5D3, 0x8DE4, 0xF5D4, 0x8E09, 0xF5D5, 0x8DFD, 0xF5D6, 0x8E14, + 0xF5D7, 0x8E1D, 0xF5D8, 0x8E1F, 0xF5D9, 0x8E2C, 0xF5DA, 0x8E2E, + 0xF5DB, 0x8E23, 0xF5DC, 0x8E2F, 0xF5DD, 0x8E3A, 0xF5DE, 0x8E40, + 0xF5DF, 0x8E39, 0xF5E0, 0x8E35, 0xF5E1, 0x8E3D, 0xF5E2, 0x8E31, + 0xF5E3, 0x8E49, 0xF5E4, 0x8E41, 0xF5E5, 0x8E42, 0xF5E6, 0x8E51, + 0xF5E7, 0x8E52, 0xF5E8, 0x8E4A, 0xF5E9, 0x8E70, 0xF5EA, 0x8E76, + 0xF5EB, 0x8E7C, 0xF5EC, 0x8E6F, 0xF5ED, 0x8E74, 0xF5EE, 0x8E85, + 0xF5EF, 0x8E8F, 0xF5F0, 0x8E94, 0xF5F1, 0x8E90, 0xF5F2, 0x8E9C, + 0xF5F3, 0x8E9E, 0xF5F4, 0x8C78, 0xF5F5, 0x8C82, 0xF5F6, 0x8C8A, + 0xF5F7, 0x8C85, 0xF5F8, 0x8C98, 0xF5F9, 0x8C94, 0xF5FA, 0x659B, + 0xF5FB, 0x89D6, 0xF5FC, 0x89DE, 0xF5FD, 0x89DA, 0xF5FE, 0x89DC, + 0xF640, 0x9BDC, 0xF641, 0x9BDD, 0xF642, 0x9BDE, 0xF643, 0x9BDF, + 0xF644, 0x9BE0, 0xF645, 0x9BE1, 0xF646, 0x9BE2, 0xF647, 0x9BE3, + 0xF648, 0x9BE4, 0xF649, 0x9BE5, 0xF64A, 0x9BE6, 0xF64B, 0x9BE7, + 0xF64C, 0x9BE8, 0xF64D, 0x9BE9, 0xF64E, 0x9BEA, 0xF64F, 0x9BEB, + 0xF650, 0x9BEC, 0xF651, 0x9BED, 0xF652, 0x9BEE, 0xF653, 0x9BEF, + 0xF654, 0x9BF0, 0xF655, 0x9BF1, 0xF656, 0x9BF2, 0xF657, 0x9BF3, + 0xF658, 0x9BF4, 0xF659, 0x9BF5, 0xF65A, 0x9BF6, 0xF65B, 0x9BF7, + 0xF65C, 0x9BF8, 0xF65D, 0x9BF9, 0xF65E, 0x9BFA, 0xF65F, 0x9BFB, + 0xF660, 0x9BFC, 0xF661, 0x9BFD, 0xF662, 0x9BFE, 0xF663, 0x9BFF, + 0xF664, 0x9C00, 0xF665, 0x9C01, 0xF666, 0x9C02, 0xF667, 0x9C03, + 0xF668, 0x9C04, 0xF669, 0x9C05, 0xF66A, 0x9C06, 0xF66B, 0x9C07, + 0xF66C, 0x9C08, 0xF66D, 0x9C09, 0xF66E, 0x9C0A, 0xF66F, 0x9C0B, + 0xF670, 0x9C0C, 0xF671, 0x9C0D, 0xF672, 0x9C0E, 0xF673, 0x9C0F, + 0xF674, 0x9C10, 0xF675, 0x9C11, 0xF676, 0x9C12, 0xF677, 0x9C13, + 0xF678, 0x9C14, 0xF679, 0x9C15, 0xF67A, 0x9C16, 0xF67B, 0x9C17, + 0xF67C, 0x9C18, 0xF67D, 0x9C19, 0xF67E, 0x9C1A, 0xF680, 0x9C1B, + 0xF681, 0x9C1C, 0xF682, 0x9C1D, 0xF683, 0x9C1E, 0xF684, 0x9C1F, + 0xF685, 0x9C20, 0xF686, 0x9C21, 0xF687, 0x9C22, 0xF688, 0x9C23, + 0xF689, 0x9C24, 0xF68A, 0x9C25, 0xF68B, 0x9C26, 0xF68C, 0x9C27, + 0xF68D, 0x9C28, 0xF68E, 0x9C29, 0xF68F, 0x9C2A, 0xF690, 0x9C2B, + 0xF691, 0x9C2C, 0xF692, 0x9C2D, 0xF693, 0x9C2E, 0xF694, 0x9C2F, + 0xF695, 0x9C30, 0xF696, 0x9C31, 0xF697, 0x9C32, 0xF698, 0x9C33, + 0xF699, 0x9C34, 0xF69A, 0x9C35, 0xF69B, 0x9C36, 0xF69C, 0x9C37, + 0xF69D, 0x9C38, 0xF69E, 0x9C39, 0xF69F, 0x9C3A, 0xF6A0, 0x9C3B, + 0xF6A1, 0x89E5, 0xF6A2, 0x89EB, 0xF6A3, 0x89EF, 0xF6A4, 0x8A3E, + 0xF6A5, 0x8B26, 0xF6A6, 0x9753, 0xF6A7, 0x96E9, 0xF6A8, 0x96F3, + 0xF6A9, 0x96EF, 0xF6AA, 0x9706, 0xF6AB, 0x9701, 0xF6AC, 0x9708, + 0xF6AD, 0x970F, 0xF6AE, 0x970E, 0xF6AF, 0x972A, 0xF6B0, 0x972D, + 0xF6B1, 0x9730, 0xF6B2, 0x973E, 0xF6B3, 0x9F80, 0xF6B4, 0x9F83, + 0xF6B5, 0x9F85, 0xF6B6, 0x9F86, 0xF6B7, 0x9F87, 0xF6B8, 0x9F88, + 0xF6B9, 0x9F89, 0xF6BA, 0x9F8A, 0xF6BB, 0x9F8C, 0xF6BC, 0x9EFE, + 0xF6BD, 0x9F0B, 0xF6BE, 0x9F0D, 0xF6BF, 0x96B9, 0xF6C0, 0x96BC, + 0xF6C1, 0x96BD, 0xF6C2, 0x96CE, 0xF6C3, 0x96D2, 0xF6C4, 0x77BF, + 0xF6C5, 0x96E0, 0xF6C6, 0x928E, 0xF6C7, 0x92AE, 0xF6C8, 0x92C8, + 0xF6C9, 0x933E, 0xF6CA, 0x936A, 0xF6CB, 0x93CA, 0xF6CC, 0x938F, + 0xF6CD, 0x943E, 0xF6CE, 0x946B, 0xF6CF, 0x9C7F, 0xF6D0, 0x9C82, + 0xF6D1, 0x9C85, 0xF6D2, 0x9C86, 0xF6D3, 0x9C87, 0xF6D4, 0x9C88, + 0xF6D5, 0x7A23, 0xF6D6, 0x9C8B, 0xF6D7, 0x9C8E, 0xF6D8, 0x9C90, + 0xF6D9, 0x9C91, 0xF6DA, 0x9C92, 0xF6DB, 0x9C94, 0xF6DC, 0x9C95, + 0xF6DD, 0x9C9A, 0xF6DE, 0x9C9B, 0xF6DF, 0x9C9E, 0xF6E0, 0x9C9F, + 0xF6E1, 0x9CA0, 0xF6E2, 0x9CA1, 0xF6E3, 0x9CA2, 0xF6E4, 0x9CA3, + 0xF6E5, 0x9CA5, 0xF6E6, 0x9CA6, 0xF6E7, 0x9CA7, 0xF6E8, 0x9CA8, + 0xF6E9, 0x9CA9, 0xF6EA, 0x9CAB, 0xF6EB, 0x9CAD, 0xF6EC, 0x9CAE, + 0xF6ED, 0x9CB0, 0xF6EE, 0x9CB1, 0xF6EF, 0x9CB2, 0xF6F0, 0x9CB3, + 0xF6F1, 0x9CB4, 0xF6F2, 0x9CB5, 0xF6F3, 0x9CB6, 0xF6F4, 0x9CB7, + 0xF6F5, 0x9CBA, 0xF6F6, 0x9CBB, 0xF6F7, 0x9CBC, 0xF6F8, 0x9CBD, + 0xF6F9, 0x9CC4, 0xF6FA, 0x9CC5, 0xF6FB, 0x9CC6, 0xF6FC, 0x9CC7, + 0xF6FD, 0x9CCA, 0xF6FE, 0x9CCB, 0xF740, 0x9C3C, 0xF741, 0x9C3D, + 0xF742, 0x9C3E, 0xF743, 0x9C3F, 0xF744, 0x9C40, 0xF745, 0x9C41, + 0xF746, 0x9C42, 0xF747, 0x9C43, 0xF748, 0x9C44, 0xF749, 0x9C45, + 0xF74A, 0x9C46, 0xF74B, 0x9C47, 0xF74C, 0x9C48, 0xF74D, 0x9C49, + 0xF74E, 0x9C4A, 0xF74F, 0x9C4B, 0xF750, 0x9C4C, 0xF751, 0x9C4D, + 0xF752, 0x9C4E, 0xF753, 0x9C4F, 0xF754, 0x9C50, 0xF755, 0x9C51, + 0xF756, 0x9C52, 0xF757, 0x9C53, 0xF758, 0x9C54, 0xF759, 0x9C55, + 0xF75A, 0x9C56, 0xF75B, 0x9C57, 0xF75C, 0x9C58, 0xF75D, 0x9C59, + 0xF75E, 0x9C5A, 0xF75F, 0x9C5B, 0xF760, 0x9C5C, 0xF761, 0x9C5D, + 0xF762, 0x9C5E, 0xF763, 0x9C5F, 0xF764, 0x9C60, 0xF765, 0x9C61, + 0xF766, 0x9C62, 0xF767, 0x9C63, 0xF768, 0x9C64, 0xF769, 0x9C65, + 0xF76A, 0x9C66, 0xF76B, 0x9C67, 0xF76C, 0x9C68, 0xF76D, 0x9C69, + 0xF76E, 0x9C6A, 0xF76F, 0x9C6B, 0xF770, 0x9C6C, 0xF771, 0x9C6D, + 0xF772, 0x9C6E, 0xF773, 0x9C6F, 0xF774, 0x9C70, 0xF775, 0x9C71, + 0xF776, 0x9C72, 0xF777, 0x9C73, 0xF778, 0x9C74, 0xF779, 0x9C75, + 0xF77A, 0x9C76, 0xF77B, 0x9C77, 0xF77C, 0x9C78, 0xF77D, 0x9C79, + 0xF77E, 0x9C7A, 0xF780, 0x9C7B, 0xF781, 0x9C7D, 0xF782, 0x9C7E, + 0xF783, 0x9C80, 0xF784, 0x9C83, 0xF785, 0x9C84, 0xF786, 0x9C89, + 0xF787, 0x9C8A, 0xF788, 0x9C8C, 0xF789, 0x9C8F, 0xF78A, 0x9C93, + 0xF78B, 0x9C96, 0xF78C, 0x9C97, 0xF78D, 0x9C98, 0xF78E, 0x9C99, + 0xF78F, 0x9C9D, 0xF790, 0x9CAA, 0xF791, 0x9CAC, 0xF792, 0x9CAF, + 0xF793, 0x9CB9, 0xF794, 0x9CBE, 0xF795, 0x9CBF, 0xF796, 0x9CC0, + 0xF797, 0x9CC1, 0xF798, 0x9CC2, 0xF799, 0x9CC8, 0xF79A, 0x9CC9, + 0xF79B, 0x9CD1, 0xF79C, 0x9CD2, 0xF79D, 0x9CDA, 0xF79E, 0x9CDB, + 0xF79F, 0x9CE0, 0xF7A0, 0x9CE1, 0xF7A1, 0x9CCC, 0xF7A2, 0x9CCD, + 0xF7A3, 0x9CCE, 0xF7A4, 0x9CCF, 0xF7A5, 0x9CD0, 0xF7A6, 0x9CD3, + 0xF7A7, 0x9CD4, 0xF7A8, 0x9CD5, 0xF7A9, 0x9CD7, 0xF7AA, 0x9CD8, + 0xF7AB, 0x9CD9, 0xF7AC, 0x9CDC, 0xF7AD, 0x9CDD, 0xF7AE, 0x9CDF, + 0xF7AF, 0x9CE2, 0xF7B0, 0x977C, 0xF7B1, 0x9785, 0xF7B2, 0x9791, + 0xF7B3, 0x9792, 0xF7B4, 0x9794, 0xF7B5, 0x97AF, 0xF7B6, 0x97AB, + 0xF7B7, 0x97A3, 0xF7B8, 0x97B2, 0xF7B9, 0x97B4, 0xF7BA, 0x9AB1, + 0xF7BB, 0x9AB0, 0xF7BC, 0x9AB7, 0xF7BD, 0x9E58, 0xF7BE, 0x9AB6, + 0xF7BF, 0x9ABA, 0xF7C0, 0x9ABC, 0xF7C1, 0x9AC1, 0xF7C2, 0x9AC0, + 0xF7C3, 0x9AC5, 0xF7C4, 0x9AC2, 0xF7C5, 0x9ACB, 0xF7C6, 0x9ACC, + 0xF7C7, 0x9AD1, 0xF7C8, 0x9B45, 0xF7C9, 0x9B43, 0xF7CA, 0x9B47, + 0xF7CB, 0x9B49, 0xF7CC, 0x9B48, 0xF7CD, 0x9B4D, 0xF7CE, 0x9B51, + 0xF7CF, 0x98E8, 0xF7D0, 0x990D, 0xF7D1, 0x992E, 0xF7D2, 0x9955, + 0xF7D3, 0x9954, 0xF7D4, 0x9ADF, 0xF7D5, 0x9AE1, 0xF7D6, 0x9AE6, + 0xF7D7, 0x9AEF, 0xF7D8, 0x9AEB, 0xF7D9, 0x9AFB, 0xF7DA, 0x9AED, + 0xF7DB, 0x9AF9, 0xF7DC, 0x9B08, 0xF7DD, 0x9B0F, 0xF7DE, 0x9B13, + 0xF7DF, 0x9B1F, 0xF7E0, 0x9B23, 0xF7E1, 0x9EBD, 0xF7E2, 0x9EBE, + 0xF7E3, 0x7E3B, 0xF7E4, 0x9E82, 0xF7E5, 0x9E87, 0xF7E6, 0x9E88, + 0xF7E7, 0x9E8B, 0xF7E8, 0x9E92, 0xF7E9, 0x93D6, 0xF7EA, 0x9E9D, + 0xF7EB, 0x9E9F, 0xF7EC, 0x9EDB, 0xF7ED, 0x9EDC, 0xF7EE, 0x9EDD, + 0xF7EF, 0x9EE0, 0xF7F0, 0x9EDF, 0xF7F1, 0x9EE2, 0xF7F2, 0x9EE9, + 0xF7F3, 0x9EE7, 0xF7F4, 0x9EE5, 0xF7F5, 0x9EEA, 0xF7F6, 0x9EEF, + 0xF7F7, 0x9F22, 0xF7F8, 0x9F2C, 0xF7F9, 0x9F2F, 0xF7FA, 0x9F39, + 0xF7FB, 0x9F37, 0xF7FC, 0x9F3D, 0xF7FD, 0x9F3E, 0xF7FE, 0x9F44, + 0xF840, 0x9CE3, 0xF841, 0x9CE4, 0xF842, 0x9CE5, 0xF843, 0x9CE6, + 0xF844, 0x9CE7, 0xF845, 0x9CE8, 0xF846, 0x9CE9, 0xF847, 0x9CEA, + 0xF848, 0x9CEB, 0xF849, 0x9CEC, 0xF84A, 0x9CED, 0xF84B, 0x9CEE, + 0xF84C, 0x9CEF, 0xF84D, 0x9CF0, 0xF84E, 0x9CF1, 0xF84F, 0x9CF2, + 0xF850, 0x9CF3, 0xF851, 0x9CF4, 0xF852, 0x9CF5, 0xF853, 0x9CF6, + 0xF854, 0x9CF7, 0xF855, 0x9CF8, 0xF856, 0x9CF9, 0xF857, 0x9CFA, + 0xF858, 0x9CFB, 0xF859, 0x9CFC, 0xF85A, 0x9CFD, 0xF85B, 0x9CFE, + 0xF85C, 0x9CFF, 0xF85D, 0x9D00, 0xF85E, 0x9D01, 0xF85F, 0x9D02, + 0xF860, 0x9D03, 0xF861, 0x9D04, 0xF862, 0x9D05, 0xF863, 0x9D06, + 0xF864, 0x9D07, 0xF865, 0x9D08, 0xF866, 0x9D09, 0xF867, 0x9D0A, + 0xF868, 0x9D0B, 0xF869, 0x9D0C, 0xF86A, 0x9D0D, 0xF86B, 0x9D0E, + 0xF86C, 0x9D0F, 0xF86D, 0x9D10, 0xF86E, 0x9D11, 0xF86F, 0x9D12, + 0xF870, 0x9D13, 0xF871, 0x9D14, 0xF872, 0x9D15, 0xF873, 0x9D16, + 0xF874, 0x9D17, 0xF875, 0x9D18, 0xF876, 0x9D19, 0xF877, 0x9D1A, + 0xF878, 0x9D1B, 0xF879, 0x9D1C, 0xF87A, 0x9D1D, 0xF87B, 0x9D1E, + 0xF87C, 0x9D1F, 0xF87D, 0x9D20, 0xF87E, 0x9D21, 0xF880, 0x9D22, + 0xF881, 0x9D23, 0xF882, 0x9D24, 0xF883, 0x9D25, 0xF884, 0x9D26, + 0xF885, 0x9D27, 0xF886, 0x9D28, 0xF887, 0x9D29, 0xF888, 0x9D2A, + 0xF889, 0x9D2B, 0xF88A, 0x9D2C, 0xF88B, 0x9D2D, 0xF88C, 0x9D2E, + 0xF88D, 0x9D2F, 0xF88E, 0x9D30, 0xF88F, 0x9D31, 0xF890, 0x9D32, + 0xF891, 0x9D33, 0xF892, 0x9D34, 0xF893, 0x9D35, 0xF894, 0x9D36, + 0xF895, 0x9D37, 0xF896, 0x9D38, 0xF897, 0x9D39, 0xF898, 0x9D3A, + 0xF899, 0x9D3B, 0xF89A, 0x9D3C, 0xF89B, 0x9D3D, 0xF89C, 0x9D3E, + 0xF89D, 0x9D3F, 0xF89E, 0x9D40, 0xF89F, 0x9D41, 0xF8A0, 0x9D42, + 0xF940, 0x9D43, 0xF941, 0x9D44, 0xF942, 0x9D45, 0xF943, 0x9D46, + 0xF944, 0x9D47, 0xF945, 0x9D48, 0xF946, 0x9D49, 0xF947, 0x9D4A, + 0xF948, 0x9D4B, 0xF949, 0x9D4C, 0xF94A, 0x9D4D, 0xF94B, 0x9D4E, + 0xF94C, 0x9D4F, 0xF94D, 0x9D50, 0xF94E, 0x9D51, 0xF94F, 0x9D52, + 0xF950, 0x9D53, 0xF951, 0x9D54, 0xF952, 0x9D55, 0xF953, 0x9D56, + 0xF954, 0x9D57, 0xF955, 0x9D58, 0xF956, 0x9D59, 0xF957, 0x9D5A, + 0xF958, 0x9D5B, 0xF959, 0x9D5C, 0xF95A, 0x9D5D, 0xF95B, 0x9D5E, + 0xF95C, 0x9D5F, 0xF95D, 0x9D60, 0xF95E, 0x9D61, 0xF95F, 0x9D62, + 0xF960, 0x9D63, 0xF961, 0x9D64, 0xF962, 0x9D65, 0xF963, 0x9D66, + 0xF964, 0x9D67, 0xF965, 0x9D68, 0xF966, 0x9D69, 0xF967, 0x9D6A, + 0xF968, 0x9D6B, 0xF969, 0x9D6C, 0xF96A, 0x9D6D, 0xF96B, 0x9D6E, + 0xF96C, 0x9D6F, 0xF96D, 0x9D70, 0xF96E, 0x9D71, 0xF96F, 0x9D72, + 0xF970, 0x9D73, 0xF971, 0x9D74, 0xF972, 0x9D75, 0xF973, 0x9D76, + 0xF974, 0x9D77, 0xF975, 0x9D78, 0xF976, 0x9D79, 0xF977, 0x9D7A, + 0xF978, 0x9D7B, 0xF979, 0x9D7C, 0xF97A, 0x9D7D, 0xF97B, 0x9D7E, + 0xF97C, 0x9D7F, 0xF97D, 0x9D80, 0xF97E, 0x9D81, 0xF980, 0x9D82, + 0xF981, 0x9D83, 0xF982, 0x9D84, 0xF983, 0x9D85, 0xF984, 0x9D86, + 0xF985, 0x9D87, 0xF986, 0x9D88, 0xF987, 0x9D89, 0xF988, 0x9D8A, + 0xF989, 0x9D8B, 0xF98A, 0x9D8C, 0xF98B, 0x9D8D, 0xF98C, 0x9D8E, + 0xF98D, 0x9D8F, 0xF98E, 0x9D90, 0xF98F, 0x9D91, 0xF990, 0x9D92, + 0xF991, 0x9D93, 0xF992, 0x9D94, 0xF993, 0x9D95, 0xF994, 0x9D96, + 0xF995, 0x9D97, 0xF996, 0x9D98, 0xF997, 0x9D99, 0xF998, 0x9D9A, + 0xF999, 0x9D9B, 0xF99A, 0x9D9C, 0xF99B, 0x9D9D, 0xF99C, 0x9D9E, + 0xF99D, 0x9D9F, 0xF99E, 0x9DA0, 0xF99F, 0x9DA1, 0xF9A0, 0x9DA2, + 0xFA40, 0x9DA3, 0xFA41, 0x9DA4, 0xFA42, 0x9DA5, 0xFA43, 0x9DA6, + 0xFA44, 0x9DA7, 0xFA45, 0x9DA8, 0xFA46, 0x9DA9, 0xFA47, 0x9DAA, + 0xFA48, 0x9DAB, 0xFA49, 0x9DAC, 0xFA4A, 0x9DAD, 0xFA4B, 0x9DAE, + 0xFA4C, 0x9DAF, 0xFA4D, 0x9DB0, 0xFA4E, 0x9DB1, 0xFA4F, 0x9DB2, + 0xFA50, 0x9DB3, 0xFA51, 0x9DB4, 0xFA52, 0x9DB5, 0xFA53, 0x9DB6, + 0xFA54, 0x9DB7, 0xFA55, 0x9DB8, 0xFA56, 0x9DB9, 0xFA57, 0x9DBA, + 0xFA58, 0x9DBB, 0xFA59, 0x9DBC, 0xFA5A, 0x9DBD, 0xFA5B, 0x9DBE, + 0xFA5C, 0x9DBF, 0xFA5D, 0x9DC0, 0xFA5E, 0x9DC1, 0xFA5F, 0x9DC2, + 0xFA60, 0x9DC3, 0xFA61, 0x9DC4, 0xFA62, 0x9DC5, 0xFA63, 0x9DC6, + 0xFA64, 0x9DC7, 0xFA65, 0x9DC8, 0xFA66, 0x9DC9, 0xFA67, 0x9DCA, + 0xFA68, 0x9DCB, 0xFA69, 0x9DCC, 0xFA6A, 0x9DCD, 0xFA6B, 0x9DCE, + 0xFA6C, 0x9DCF, 0xFA6D, 0x9DD0, 0xFA6E, 0x9DD1, 0xFA6F, 0x9DD2, + 0xFA70, 0x9DD3, 0xFA71, 0x9DD4, 0xFA72, 0x9DD5, 0xFA73, 0x9DD6, + 0xFA74, 0x9DD7, 0xFA75, 0x9DD8, 0xFA76, 0x9DD9, 0xFA77, 0x9DDA, + 0xFA78, 0x9DDB, 0xFA79, 0x9DDC, 0xFA7A, 0x9DDD, 0xFA7B, 0x9DDE, + 0xFA7C, 0x9DDF, 0xFA7D, 0x9DE0, 0xFA7E, 0x9DE1, 0xFA80, 0x9DE2, + 0xFA81, 0x9DE3, 0xFA82, 0x9DE4, 0xFA83, 0x9DE5, 0xFA84, 0x9DE6, + 0xFA85, 0x9DE7, 0xFA86, 0x9DE8, 0xFA87, 0x9DE9, 0xFA88, 0x9DEA, + 0xFA89, 0x9DEB, 0xFA8A, 0x9DEC, 0xFA8B, 0x9DED, 0xFA8C, 0x9DEE, + 0xFA8D, 0x9DEF, 0xFA8E, 0x9DF0, 0xFA8F, 0x9DF1, 0xFA90, 0x9DF2, + 0xFA91, 0x9DF3, 0xFA92, 0x9DF4, 0xFA93, 0x9DF5, 0xFA94, 0x9DF6, + 0xFA95, 0x9DF7, 0xFA96, 0x9DF8, 0xFA97, 0x9DF9, 0xFA98, 0x9DFA, + 0xFA99, 0x9DFB, 0xFA9A, 0x9DFC, 0xFA9B, 0x9DFD, 0xFA9C, 0x9DFE, + 0xFA9D, 0x9DFF, 0xFA9E, 0x9E00, 0xFA9F, 0x9E01, 0xFAA0, 0x9E02, + 0xFB40, 0x9E03, 0xFB41, 0x9E04, 0xFB42, 0x9E05, 0xFB43, 0x9E06, + 0xFB44, 0x9E07, 0xFB45, 0x9E08, 0xFB46, 0x9E09, 0xFB47, 0x9E0A, + 0xFB48, 0x9E0B, 0xFB49, 0x9E0C, 0xFB4A, 0x9E0D, 0xFB4B, 0x9E0E, + 0xFB4C, 0x9E0F, 0xFB4D, 0x9E10, 0xFB4E, 0x9E11, 0xFB4F, 0x9E12, + 0xFB50, 0x9E13, 0xFB51, 0x9E14, 0xFB52, 0x9E15, 0xFB53, 0x9E16, + 0xFB54, 0x9E17, 0xFB55, 0x9E18, 0xFB56, 0x9E19, 0xFB57, 0x9E1A, + 0xFB58, 0x9E1B, 0xFB59, 0x9E1C, 0xFB5A, 0x9E1D, 0xFB5B, 0x9E1E, + 0xFB5C, 0x9E24, 0xFB5D, 0x9E27, 0xFB5E, 0x9E2E, 0xFB5F, 0x9E30, + 0xFB60, 0x9E34, 0xFB61, 0x9E3B, 0xFB62, 0x9E3C, 0xFB63, 0x9E40, + 0xFB64, 0x9E4D, 0xFB65, 0x9E50, 0xFB66, 0x9E52, 0xFB67, 0x9E53, + 0xFB68, 0x9E54, 0xFB69, 0x9E56, 0xFB6A, 0x9E59, 0xFB6B, 0x9E5D, + 0xFB6C, 0x9E5F, 0xFB6D, 0x9E60, 0xFB6E, 0x9E61, 0xFB6F, 0x9E62, + 0xFB70, 0x9E65, 0xFB71, 0x9E6E, 0xFB72, 0x9E6F, 0xFB73, 0x9E72, + 0xFB74, 0x9E74, 0xFB75, 0x9E75, 0xFB76, 0x9E76, 0xFB77, 0x9E77, + 0xFB78, 0x9E78, 0xFB79, 0x9E79, 0xFB7A, 0x9E7A, 0xFB7B, 0x9E7B, + 0xFB7C, 0x9E7C, 0xFB7D, 0x9E7D, 0xFB7E, 0x9E80, 0xFB80, 0x9E81, + 0xFB81, 0x9E83, 0xFB82, 0x9E84, 0xFB83, 0x9E85, 0xFB84, 0x9E86, + 0xFB85, 0x9E89, 0xFB86, 0x9E8A, 0xFB87, 0x9E8C, 0xFB88, 0x9E8D, + 0xFB89, 0x9E8E, 0xFB8A, 0x9E8F, 0xFB8B, 0x9E90, 0xFB8C, 0x9E91, + 0xFB8D, 0x9E94, 0xFB8E, 0x9E95, 0xFB8F, 0x9E96, 0xFB90, 0x9E97, + 0xFB91, 0x9E98, 0xFB92, 0x9E99, 0xFB93, 0x9E9A, 0xFB94, 0x9E9B, + 0xFB95, 0x9E9C, 0xFB96, 0x9E9E, 0xFB97, 0x9EA0, 0xFB98, 0x9EA1, + 0xFB99, 0x9EA2, 0xFB9A, 0x9EA3, 0xFB9B, 0x9EA4, 0xFB9C, 0x9EA5, + 0xFB9D, 0x9EA7, 0xFB9E, 0x9EA8, 0xFB9F, 0x9EA9, 0xFBA0, 0x9EAA, + 0xFC40, 0x9EAB, 0xFC41, 0x9EAC, 0xFC42, 0x9EAD, 0xFC43, 0x9EAE, + 0xFC44, 0x9EAF, 0xFC45, 0x9EB0, 0xFC46, 0x9EB1, 0xFC47, 0x9EB2, + 0xFC48, 0x9EB3, 0xFC49, 0x9EB5, 0xFC4A, 0x9EB6, 0xFC4B, 0x9EB7, + 0xFC4C, 0x9EB9, 0xFC4D, 0x9EBA, 0xFC4E, 0x9EBC, 0xFC4F, 0x9EBF, + 0xFC50, 0x9EC0, 0xFC51, 0x9EC1, 0xFC52, 0x9EC2, 0xFC53, 0x9EC3, + 0xFC54, 0x9EC5, 0xFC55, 0x9EC6, 0xFC56, 0x9EC7, 0xFC57, 0x9EC8, + 0xFC58, 0x9ECA, 0xFC59, 0x9ECB, 0xFC5A, 0x9ECC, 0xFC5B, 0x9ED0, + 0xFC5C, 0x9ED2, 0xFC5D, 0x9ED3, 0xFC5E, 0x9ED5, 0xFC5F, 0x9ED6, + 0xFC60, 0x9ED7, 0xFC61, 0x9ED9, 0xFC62, 0x9EDA, 0xFC63, 0x9EDE, + 0xFC64, 0x9EE1, 0xFC65, 0x9EE3, 0xFC66, 0x9EE4, 0xFC67, 0x9EE6, + 0xFC68, 0x9EE8, 0xFC69, 0x9EEB, 0xFC6A, 0x9EEC, 0xFC6B, 0x9EED, + 0xFC6C, 0x9EEE, 0xFC6D, 0x9EF0, 0xFC6E, 0x9EF1, 0xFC6F, 0x9EF2, + 0xFC70, 0x9EF3, 0xFC71, 0x9EF4, 0xFC72, 0x9EF5, 0xFC73, 0x9EF6, + 0xFC74, 0x9EF7, 0xFC75, 0x9EF8, 0xFC76, 0x9EFA, 0xFC77, 0x9EFD, + 0xFC78, 0x9EFF, 0xFC79, 0x9F00, 0xFC7A, 0x9F01, 0xFC7B, 0x9F02, + 0xFC7C, 0x9F03, 0xFC7D, 0x9F04, 0xFC7E, 0x9F05, 0xFC80, 0x9F06, + 0xFC81, 0x9F07, 0xFC82, 0x9F08, 0xFC83, 0x9F09, 0xFC84, 0x9F0A, + 0xFC85, 0x9F0C, 0xFC86, 0x9F0F, 0xFC87, 0x9F11, 0xFC88, 0x9F12, + 0xFC89, 0x9F14, 0xFC8A, 0x9F15, 0xFC8B, 0x9F16, 0xFC8C, 0x9F18, + 0xFC8D, 0x9F1A, 0xFC8E, 0x9F1B, 0xFC8F, 0x9F1C, 0xFC90, 0x9F1D, + 0xFC91, 0x9F1E, 0xFC92, 0x9F1F, 0xFC93, 0x9F21, 0xFC94, 0x9F23, + 0xFC95, 0x9F24, 0xFC96, 0x9F25, 0xFC97, 0x9F26, 0xFC98, 0x9F27, + 0xFC99, 0x9F28, 0xFC9A, 0x9F29, 0xFC9B, 0x9F2A, 0xFC9C, 0x9F2B, + 0xFC9D, 0x9F2D, 0xFC9E, 0x9F2E, 0xFC9F, 0x9F30, 0xFCA0, 0x9F31, + 0xFD40, 0x9F32, 0xFD41, 0x9F33, 0xFD42, 0x9F34, 0xFD43, 0x9F35, + 0xFD44, 0x9F36, 0xFD45, 0x9F38, 0xFD46, 0x9F3A, 0xFD47, 0x9F3C, + 0xFD48, 0x9F3F, 0xFD49, 0x9F40, 0xFD4A, 0x9F41, 0xFD4B, 0x9F42, + 0xFD4C, 0x9F43, 0xFD4D, 0x9F45, 0xFD4E, 0x9F46, 0xFD4F, 0x9F47, + 0xFD50, 0x9F48, 0xFD51, 0x9F49, 0xFD52, 0x9F4A, 0xFD53, 0x9F4B, + 0xFD54, 0x9F4C, 0xFD55, 0x9F4D, 0xFD56, 0x9F4E, 0xFD57, 0x9F4F, + 0xFD58, 0x9F52, 0xFD59, 0x9F53, 0xFD5A, 0x9F54, 0xFD5B, 0x9F55, + 0xFD5C, 0x9F56, 0xFD5D, 0x9F57, 0xFD5E, 0x9F58, 0xFD5F, 0x9F59, + 0xFD60, 0x9F5A, 0xFD61, 0x9F5B, 0xFD62, 0x9F5C, 0xFD63, 0x9F5D, + 0xFD64, 0x9F5E, 0xFD65, 0x9F5F, 0xFD66, 0x9F60, 0xFD67, 0x9F61, + 0xFD68, 0x9F62, 0xFD69, 0x9F63, 0xFD6A, 0x9F64, 0xFD6B, 0x9F65, + 0xFD6C, 0x9F66, 0xFD6D, 0x9F67, 0xFD6E, 0x9F68, 0xFD6F, 0x9F69, + 0xFD70, 0x9F6A, 0xFD71, 0x9F6B, 0xFD72, 0x9F6C, 0xFD73, 0x9F6D, + 0xFD74, 0x9F6E, 0xFD75, 0x9F6F, 0xFD76, 0x9F70, 0xFD77, 0x9F71, + 0xFD78, 0x9F72, 0xFD79, 0x9F73, 0xFD7A, 0x9F74, 0xFD7B, 0x9F75, + 0xFD7C, 0x9F76, 0xFD7D, 0x9F77, 0xFD7E, 0x9F78, 0xFD80, 0x9F79, + 0xFD81, 0x9F7A, 0xFD82, 0x9F7B, 0xFD83, 0x9F7C, 0xFD84, 0x9F7D, + 0xFD85, 0x9F7E, 0xFD86, 0x9F81, 0xFD87, 0x9F82, 0xFD88, 0x9F8D, + 0xFD89, 0x9F8E, 0xFD8A, 0x9F8F, 0xFD8B, 0x9F90, 0xFD8C, 0x9F91, + 0xFD8D, 0x9F92, 0xFD8E, 0x9F93, 0xFD8F, 0x9F94, 0xFD90, 0x9F95, + 0xFD91, 0x9F96, 0xFD92, 0x9F97, 0xFD93, 0x9F98, 0xFD94, 0x9F9C, + 0xFD95, 0x9F9D, 0xFD96, 0x9F9E, 0xFD97, 0x9FA1, 0xFD98, 0x9FA2, + 0xFD99, 0x9FA3, 0xFD9A, 0x9FA4, 0xFD9B, 0x9FA5, 0xFD9C, 0xF92C, + 0xFD9D, 0xF979, 0xFD9E, 0xF995, 0xFD9F, 0xF9E7, 0xFDA0, 0xF9F1, + 0xFE40, 0xFA0C, 0xFE41, 0xFA0D, 0xFE42, 0xFA0E, 0xFE43, 0xFA0F, + 0xFE44, 0xFA11, 0xFE45, 0xFA13, 0xFE46, 0xFA14, 0xFE47, 0xFA18, + 0xFE48, 0xFA1F, 0xFE49, 0xFA20, 0xFE4A, 0xFA21, 0xFE4B, 0xFA23, + 0xFE4C, 0xFA24, 0xFE4D, 0xFA27, 0xFE4E, 0xFA28, 0xFE4F, 0xFA29, + 0, 0 +}; + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR chr, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (chr < 0x80) { /* ASCII */ + c = chr; + } else { + if (dir) { /* OEMCP to unicode */ + p = oem2uni; + hi = sizeof(oem2uni) / 4 - 1; + } else { /* Unicode to OEMCP */ + p = uni2oem; + hi = sizeof(uni2oem) / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (chr == p[i * 2]) break; + if (chr > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; + } + + return c; +} + + + +WCHAR ff_wtoupper ( /* Upper converted character */ + WCHAR chr /* Input character */ +) +{ + static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; + static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; + int i; + + + for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + + return tbl_lower[i] ? tbl_upper[i] : chr; +} diff --git a/third_party/fatfs/src/option/cc949.c b/third_party/fatfs/src/option/cc949.c new file mode 100644 index 0000000..1fd075d --- /dev/null +++ b/third_party/fatfs/src/option/cc949.c @@ -0,0 +1,8603 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ +/* */ +/* CP949 (Korean EUC-KR) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + + +#if !_USE_LFN || _CODE_PAGE != 949 +#error This file is not needed in current configuration. Remove from the project. +#endif + + +static +const WCHAR uni2oem[] = { +/* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ + 0x00A1, 0xA2AE, 0x00A4, 0xA2B4, 0x00A7, 0xA1D7, 0x00A8, 0xA1A7, + 0x00AA, 0xA8A3, 0x00AD, 0xA1A9, 0x00AE, 0xA2E7, 0x00B0, 0xA1C6, + 0x00B1, 0xA1BE, 0x00B2, 0xA9F7, 0x00B3, 0xA9F8, 0x00B4, 0xA2A5, + 0x00B6, 0xA2D2, 0x00B7, 0xA1A4, 0x00B8, 0xA2AC, 0x00B9, 0xA9F6, + 0x00BA, 0xA8AC, 0x00BC, 0xA8F9, 0x00BD, 0xA8F6, 0x00BE, 0xA8FA, + 0x00BF, 0xA2AF, 0x00C6, 0xA8A1, 0x00D0, 0xA8A2, 0x00D7, 0xA1BF, + 0x00D8, 0xA8AA, 0x00DE, 0xA8AD, 0x00DF, 0xA9AC, 0x00E6, 0xA9A1, + 0x00F0, 0xA9A3, 0x00F7, 0xA1C0, 0x00F8, 0xA9AA, 0x00FE, 0xA9AD, + 0x0111, 0xA9A2, 0x0126, 0xA8A4, 0x0127, 0xA9A4, 0x0131, 0xA9A5, + 0x0132, 0xA8A6, 0x0133, 0xA9A6, 0x0138, 0xA9A7, 0x013F, 0xA8A8, + 0x0140, 0xA9A8, 0x0141, 0xA8A9, 0x0142, 0xA9A9, 0x0149, 0xA9B0, + 0x014A, 0xA8AF, 0x014B, 0xA9AF, 0x0152, 0xA8AB, 0x0153, 0xA9AB, + 0x0166, 0xA8AE, 0x0167, 0xA9AE, 0x02C7, 0xA2A7, 0x02D0, 0xA2B0, + 0x02D8, 0xA2A8, 0x02D9, 0xA2AB, 0x02DA, 0xA2AA, 0x02DB, 0xA2AD, + 0x02DD, 0xA2A9, 0x0391, 0xA5C1, 0x0392, 0xA5C2, 0x0393, 0xA5C3, + 0x0394, 0xA5C4, 0x0395, 0xA5C5, 0x0396, 0xA5C6, 0x0397, 0xA5C7, + 0x0398, 0xA5C8, 0x0399, 0xA5C9, 0x039A, 0xA5CA, 0x039B, 0xA5CB, + 0x039C, 0xA5CC, 0x039D, 0xA5CD, 0x039E, 0xA5CE, 0x039F, 0xA5CF, + 0x03A0, 0xA5D0, 0x03A1, 0xA5D1, 0x03A3, 0xA5D2, 0x03A4, 0xA5D3, + 0x03A5, 0xA5D4, 0x03A6, 0xA5D5, 0x03A7, 0xA5D6, 0x03A8, 0xA5D7, + 0x03A9, 0xA5D8, 0x03B1, 0xA5E1, 0x03B2, 0xA5E2, 0x03B3, 0xA5E3, + 0x03B4, 0xA5E4, 0x03B5, 0xA5E5, 0x03B6, 0xA5E6, 0x03B7, 0xA5E7, + 0x03B8, 0xA5E8, 0x03B9, 0xA5E9, 0x03BA, 0xA5EA, 0x03BB, 0xA5EB, + 0x03BC, 0xA5EC, 0x03BD, 0xA5ED, 0x03BE, 0xA5EE, 0x03BF, 0xA5EF, + 0x03C0, 0xA5F0, 0x03C1, 0xA5F1, 0x03C3, 0xA5F2, 0x03C4, 0xA5F3, + 0x03C5, 0xA5F4, 0x03C6, 0xA5F5, 0x03C7, 0xA5F6, 0x03C8, 0xA5F7, + 0x03C9, 0xA5F8, 0x0401, 0xACA7, 0x0410, 0xACA1, 0x0411, 0xACA2, + 0x0412, 0xACA3, 0x0413, 0xACA4, 0x0414, 0xACA5, 0x0415, 0xACA6, + 0x0416, 0xACA8, 0x0417, 0xACA9, 0x0418, 0xACAA, 0x0419, 0xACAB, + 0x041A, 0xACAC, 0x041B, 0xACAD, 0x041C, 0xACAE, 0x041D, 0xACAF, + 0x041E, 0xACB0, 0x041F, 0xACB1, 0x0420, 0xACB2, 0x0421, 0xACB3, + 0x0422, 0xACB4, 0x0423, 0xACB5, 0x0424, 0xACB6, 0x0425, 0xACB7, + 0x0426, 0xACB8, 0x0427, 0xACB9, 0x0428, 0xACBA, 0x0429, 0xACBB, + 0x042A, 0xACBC, 0x042B, 0xACBD, 0x042C, 0xACBE, 0x042D, 0xACBF, + 0x042E, 0xACC0, 0x042F, 0xACC1, 0x0430, 0xACD1, 0x0431, 0xACD2, + 0x0432, 0xACD3, 0x0433, 0xACD4, 0x0434, 0xACD5, 0x0435, 0xACD6, + 0x0436, 0xACD8, 0x0437, 0xACD9, 0x0438, 0xACDA, 0x0439, 0xACDB, + 0x043A, 0xACDC, 0x043B, 0xACDD, 0x043C, 0xACDE, 0x043D, 0xACDF, + 0x043E, 0xACE0, 0x043F, 0xACE1, 0x0440, 0xACE2, 0x0441, 0xACE3, + 0x0442, 0xACE4, 0x0443, 0xACE5, 0x0444, 0xACE6, 0x0445, 0xACE7, + 0x0446, 0xACE8, 0x0447, 0xACE9, 0x0448, 0xACEA, 0x0449, 0xACEB, + 0x044A, 0xACEC, 0x044B, 0xACED, 0x044C, 0xACEE, 0x044D, 0xACEF, + 0x044E, 0xACF0, 0x044F, 0xACF1, 0x0451, 0xACD7, 0x2015, 0xA1AA, + 0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1, + 0x2020, 0xA2D3, 0x2021, 0xA2D4, 0x2025, 0xA1A5, 0x2026, 0xA1A6, + 0x2030, 0xA2B6, 0x2032, 0xA1C7, 0x2033, 0xA1C8, 0x203B, 0xA1D8, + 0x2074, 0xA9F9, 0x207F, 0xA9FA, 0x2081, 0xA9FB, 0x2082, 0xA9FC, + 0x2083, 0xA9FD, 0x2084, 0xA9FE, 0x20AC, 0xA2E6, 0x2103, 0xA1C9, + 0x2109, 0xA2B5, 0x2113, 0xA7A4, 0x2116, 0xA2E0, 0x2121, 0xA2E5, + 0x2122, 0xA2E2, 0x2126, 0xA7D9, 0x212B, 0xA1CA, 0x2153, 0xA8F7, + 0x2154, 0xA8F8, 0x215B, 0xA8FB, 0x215C, 0xA8FC, 0x215D, 0xA8FD, + 0x215E, 0xA8FE, 0x2160, 0xA5B0, 0x2161, 0xA5B1, 0x2162, 0xA5B2, + 0x2163, 0xA5B3, 0x2164, 0xA5B4, 0x2165, 0xA5B5, 0x2166, 0xA5B6, + 0x2167, 0xA5B7, 0x2168, 0xA5B8, 0x2169, 0xA5B9, 0x2170, 0xA5A1, + 0x2171, 0xA5A2, 0x2172, 0xA5A3, 0x2173, 0xA5A4, 0x2174, 0xA5A5, + 0x2175, 0xA5A6, 0x2176, 0xA5A7, 0x2177, 0xA5A8, 0x2178, 0xA5A9, + 0x2179, 0xA5AA, 0x2190, 0xA1E7, 0x2191, 0xA1E8, 0x2192, 0xA1E6, + 0x2193, 0xA1E9, 0x2194, 0xA1EA, 0x2195, 0xA2D5, 0x2196, 0xA2D8, + 0x2197, 0xA2D6, 0x2198, 0xA2D9, 0x2199, 0xA2D7, 0x21D2, 0xA2A1, + 0x21D4, 0xA2A2, 0x2200, 0xA2A3, 0x2202, 0xA1D3, 0x2203, 0xA2A4, + 0x2207, 0xA1D4, 0x2208, 0xA1F4, 0x220B, 0xA1F5, 0x220F, 0xA2B3, + 0x2211, 0xA2B2, 0x221A, 0xA1EE, 0x221D, 0xA1F0, 0x221E, 0xA1C4, + 0x2220, 0xA1D0, 0x2225, 0xA1AB, 0x2227, 0xA1FC, 0x2228, 0xA1FD, + 0x2229, 0xA1FB, 0x222A, 0xA1FA, 0x222B, 0xA1F2, 0x222C, 0xA1F3, + 0x222E, 0xA2B1, 0x2234, 0xA1C5, 0x2235, 0xA1F1, 0x223C, 0xA1AD, + 0x223D, 0xA1EF, 0x2252, 0xA1D6, 0x2260, 0xA1C1, 0x2261, 0xA1D5, + 0x2264, 0xA1C2, 0x2265, 0xA1C3, 0x226A, 0xA1EC, 0x226B, 0xA1ED, + 0x2282, 0xA1F8, 0x2283, 0xA1F9, 0x2286, 0xA1F6, 0x2287, 0xA1F7, + 0x2299, 0xA2C1, 0x22A5, 0xA1D1, 0x2312, 0xA1D2, 0x2460, 0xA8E7, + 0x2461, 0xA8E8, 0x2462, 0xA8E9, 0x2463, 0xA8EA, 0x2464, 0xA8EB, + 0x2465, 0xA8EC, 0x2466, 0xA8ED, 0x2467, 0xA8EE, 0x2468, 0xA8EF, + 0x2469, 0xA8F0, 0x246A, 0xA8F1, 0x246B, 0xA8F2, 0x246C, 0xA8F3, + 0x246D, 0xA8F4, 0x246E, 0xA8F5, 0x2474, 0xA9E7, 0x2475, 0xA9E8, + 0x2476, 0xA9E9, 0x2477, 0xA9EA, 0x2478, 0xA9EB, 0x2479, 0xA9EC, + 0x247A, 0xA9ED, 0x247B, 0xA9EE, 0x247C, 0xA9EF, 0x247D, 0xA9F0, + 0x247E, 0xA9F1, 0x247F, 0xA9F2, 0x2480, 0xA9F3, 0x2481, 0xA9F4, + 0x2482, 0xA9F5, 0x249C, 0xA9CD, 0x249D, 0xA9CE, 0x249E, 0xA9CF, + 0x249F, 0xA9D0, 0x24A0, 0xA9D1, 0x24A1, 0xA9D2, 0x24A2, 0xA9D3, + 0x24A3, 0xA9D4, 0x24A4, 0xA9D5, 0x24A5, 0xA9D6, 0x24A6, 0xA9D7, + 0x24A7, 0xA9D8, 0x24A8, 0xA9D9, 0x24A9, 0xA9DA, 0x24AA, 0xA9DB, + 0x24AB, 0xA9DC, 0x24AC, 0xA9DD, 0x24AD, 0xA9DE, 0x24AE, 0xA9DF, + 0x24AF, 0xA9E0, 0x24B0, 0xA9E1, 0x24B1, 0xA9E2, 0x24B2, 0xA9E3, + 0x24B3, 0xA9E4, 0x24B4, 0xA9E5, 0x24B5, 0xA9E6, 0x24D0, 0xA8CD, + 0x24D1, 0xA8CE, 0x24D2, 0xA8CF, 0x24D3, 0xA8D0, 0x24D4, 0xA8D1, + 0x24D5, 0xA8D2, 0x24D6, 0xA8D3, 0x24D7, 0xA8D4, 0x24D8, 0xA8D5, + 0x24D9, 0xA8D6, 0x24DA, 0xA8D7, 0x24DB, 0xA8D8, 0x24DC, 0xA8D9, + 0x24DD, 0xA8DA, 0x24DE, 0xA8DB, 0x24DF, 0xA8DC, 0x24E0, 0xA8DD, + 0x24E1, 0xA8DE, 0x24E2, 0xA8DF, 0x24E3, 0xA8E0, 0x24E4, 0xA8E1, + 0x24E5, 0xA8E2, 0x24E6, 0xA8E3, 0x24E7, 0xA8E4, 0x24E8, 0xA8E5, + 0x24E9, 0xA8E6, 0x2500, 0xA6A1, 0x2501, 0xA6AC, 0x2502, 0xA6A2, + 0x2503, 0xA6AD, 0x250C, 0xA6A3, 0x250D, 0xA6C8, 0x250E, 0xA6C7, + 0x250F, 0xA6AE, 0x2510, 0xA6A4, 0x2511, 0xA6C2, 0x2512, 0xA6C1, + 0x2513, 0xA6AF, 0x2514, 0xA6A6, 0x2515, 0xA6C6, 0x2516, 0xA6C5, + 0x2517, 0xA6B1, 0x2518, 0xA6A5, 0x2519, 0xA6C4, 0x251A, 0xA6C3, + 0x251B, 0xA6B0, 0x251C, 0xA6A7, 0x251D, 0xA6BC, 0x251E, 0xA6C9, + 0x251F, 0xA6CA, 0x2520, 0xA6B7, 0x2521, 0xA6CB, 0x2522, 0xA6CC, + 0x2523, 0xA6B2, 0x2524, 0xA6A9, 0x2525, 0xA6BE, 0x2526, 0xA6CD, + 0x2527, 0xA6CE, 0x2528, 0xA6B9, 0x2529, 0xA6CF, 0x252A, 0xA6D0, + 0x252B, 0xA6B4, 0x252C, 0xA6A8, 0x252D, 0xA6D1, 0x252E, 0xA6D2, + 0x252F, 0xA6B8, 0x2530, 0xA6BD, 0x2531, 0xA6D3, 0x2532, 0xA6D4, + 0x2533, 0xA6B3, 0x2534, 0xA6AA, 0x2535, 0xA6D5, 0x2536, 0xA6D6, + 0x2537, 0xA6BA, 0x2538, 0xA6BF, 0x2539, 0xA6D7, 0x253A, 0xA6D8, + 0x253B, 0xA6B5, 0x253C, 0xA6AB, 0x253D, 0xA6D9, 0x253E, 0xA6DA, + 0x253F, 0xA6BB, 0x2540, 0xA6DB, 0x2541, 0xA6DC, 0x2542, 0xA6C0, + 0x2543, 0xA6DD, 0x2544, 0xA6DE, 0x2545, 0xA6DF, 0x2546, 0xA6E0, + 0x2547, 0xA6E1, 0x2548, 0xA6E2, 0x2549, 0xA6E3, 0x254A, 0xA6E4, + 0x254B, 0xA6B6, 0x2592, 0xA2C6, 0x25A0, 0xA1E1, 0x25A1, 0xA1E0, + 0x25A3, 0xA2C3, 0x25A4, 0xA2C7, 0x25A5, 0xA2C8, 0x25A6, 0xA2CB, + 0x25A7, 0xA2CA, 0x25A8, 0xA2C9, 0x25A9, 0xA2CC, 0x25B2, 0xA1E3, + 0x25B3, 0xA1E2, 0x25B6, 0xA2BA, 0x25B7, 0xA2B9, 0x25BC, 0xA1E5, + 0x25BD, 0xA1E4, 0x25C0, 0xA2B8, 0x25C1, 0xA2B7, 0x25C6, 0xA1DF, + 0x25C7, 0xA1DE, 0x25C8, 0xA2C2, 0x25CB, 0xA1DB, 0x25CE, 0xA1DD, + 0x25CF, 0xA1DC, 0x25D0, 0xA2C4, 0x25D1, 0xA2C5, 0x2605, 0xA1DA, + 0x2606, 0xA1D9, 0x260E, 0xA2CF, 0x260F, 0xA2CE, 0x261C, 0xA2D0, + 0x261E, 0xA2D1, 0x2640, 0xA1CF, 0x2642, 0xA1CE, 0x2660, 0xA2BC, + 0x2661, 0xA2BD, 0x2663, 0xA2C0, 0x2664, 0xA2BB, 0x2665, 0xA2BE, + 0x2667, 0xA2BF, 0x2668, 0xA2CD, 0x2669, 0xA2DB, 0x266A, 0xA2DC, + 0x266C, 0xA2DD, 0x266D, 0xA2DA, 0x3000, 0xA1A1, 0x3001, 0xA1A2, + 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3008, 0xA1B4, 0x3009, 0xA1B5, + 0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9, + 0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BC, 0x3011, 0xA1BD, + 0x3013, 0xA1EB, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3041, 0xAAA1, + 0x3042, 0xAAA2, 0x3043, 0xAAA3, 0x3044, 0xAAA4, 0x3045, 0xAAA5, + 0x3046, 0xAAA6, 0x3047, 0xAAA7, 0x3048, 0xAAA8, 0x3049, 0xAAA9, + 0x304A, 0xAAAA, 0x304B, 0xAAAB, 0x304C, 0xAAAC, 0x304D, 0xAAAD, + 0x304E, 0xAAAE, 0x304F, 0xAAAF, 0x3050, 0xAAB0, 0x3051, 0xAAB1, + 0x3052, 0xAAB2, 0x3053, 0xAAB3, 0x3054, 0xAAB4, 0x3055, 0xAAB5, + 0x3056, 0xAAB6, 0x3057, 0xAAB7, 0x3058, 0xAAB8, 0x3059, 0xAAB9, + 0x305A, 0xAABA, 0x305B, 0xAABB, 0x305C, 0xAABC, 0x305D, 0xAABD, + 0x305E, 0xAABE, 0x305F, 0xAABF, 0x3060, 0xAAC0, 0x3061, 0xAAC1, + 0x3062, 0xAAC2, 0x3063, 0xAAC3, 0x3064, 0xAAC4, 0x3065, 0xAAC5, + 0x3066, 0xAAC6, 0x3067, 0xAAC7, 0x3068, 0xAAC8, 0x3069, 0xAAC9, + 0x306A, 0xAACA, 0x306B, 0xAACB, 0x306C, 0xAACC, 0x306D, 0xAACD, + 0x306E, 0xAACE, 0x306F, 0xAACF, 0x3070, 0xAAD0, 0x3071, 0xAAD1, + 0x3072, 0xAAD2, 0x3073, 0xAAD3, 0x3074, 0xAAD4, 0x3075, 0xAAD5, + 0x3076, 0xAAD6, 0x3077, 0xAAD7, 0x3078, 0xAAD8, 0x3079, 0xAAD9, + 0x307A, 0xAADA, 0x307B, 0xAADB, 0x307C, 0xAADC, 0x307D, 0xAADD, + 0x307E, 0xAADE, 0x307F, 0xAADF, 0x3080, 0xAAE0, 0x3081, 0xAAE1, + 0x3082, 0xAAE2, 0x3083, 0xAAE3, 0x3084, 0xAAE4, 0x3085, 0xAAE5, + 0x3086, 0xAAE6, 0x3087, 0xAAE7, 0x3088, 0xAAE8, 0x3089, 0xAAE9, + 0x308A, 0xAAEA, 0x308B, 0xAAEB, 0x308C, 0xAAEC, 0x308D, 0xAAED, + 0x308E, 0xAAEE, 0x308F, 0xAAEF, 0x3090, 0xAAF0, 0x3091, 0xAAF1, + 0x3092, 0xAAF2, 0x3093, 0xAAF3, 0x30A1, 0xABA1, 0x30A2, 0xABA2, + 0x30A3, 0xABA3, 0x30A4, 0xABA4, 0x30A5, 0xABA5, 0x30A6, 0xABA6, + 0x30A7, 0xABA7, 0x30A8, 0xABA8, 0x30A9, 0xABA9, 0x30AA, 0xABAA, + 0x30AB, 0xABAB, 0x30AC, 0xABAC, 0x30AD, 0xABAD, 0x30AE, 0xABAE, + 0x30AF, 0xABAF, 0x30B0, 0xABB0, 0x30B1, 0xABB1, 0x30B2, 0xABB2, + 0x30B3, 0xABB3, 0x30B4, 0xABB4, 0x30B5, 0xABB5, 0x30B6, 0xABB6, + 0x30B7, 0xABB7, 0x30B8, 0xABB8, 0x30B9, 0xABB9, 0x30BA, 0xABBA, + 0x30BB, 0xABBB, 0x30BC, 0xABBC, 0x30BD, 0xABBD, 0x30BE, 0xABBE, + 0x30BF, 0xABBF, 0x30C0, 0xABC0, 0x30C1, 0xABC1, 0x30C2, 0xABC2, + 0x30C3, 0xABC3, 0x30C4, 0xABC4, 0x30C5, 0xABC5, 0x30C6, 0xABC6, + 0x30C7, 0xABC7, 0x30C8, 0xABC8, 0x30C9, 0xABC9, 0x30CA, 0xABCA, + 0x30CB, 0xABCB, 0x30CC, 0xABCC, 0x30CD, 0xABCD, 0x30CE, 0xABCE, + 0x30CF, 0xABCF, 0x30D0, 0xABD0, 0x30D1, 0xABD1, 0x30D2, 0xABD2, + 0x30D3, 0xABD3, 0x30D4, 0xABD4, 0x30D5, 0xABD5, 0x30D6, 0xABD6, + 0x30D7, 0xABD7, 0x30D8, 0xABD8, 0x30D9, 0xABD9, 0x30DA, 0xABDA, + 0x30DB, 0xABDB, 0x30DC, 0xABDC, 0x30DD, 0xABDD, 0x30DE, 0xABDE, + 0x30DF, 0xABDF, 0x30E0, 0xABE0, 0x30E1, 0xABE1, 0x30E2, 0xABE2, + 0x30E3, 0xABE3, 0x30E4, 0xABE4, 0x30E5, 0xABE5, 0x30E6, 0xABE6, + 0x30E7, 0xABE7, 0x30E8, 0xABE8, 0x30E9, 0xABE9, 0x30EA, 0xABEA, + 0x30EB, 0xABEB, 0x30EC, 0xABEC, 0x30ED, 0xABED, 0x30EE, 0xABEE, + 0x30EF, 0xABEF, 0x30F0, 0xABF0, 0x30F1, 0xABF1, 0x30F2, 0xABF2, + 0x30F3, 0xABF3, 0x30F4, 0xABF4, 0x30F5, 0xABF5, 0x30F6, 0xABF6, + 0x3131, 0xA4A1, 0x3132, 0xA4A2, 0x3133, 0xA4A3, 0x3134, 0xA4A4, + 0x3135, 0xA4A5, 0x3136, 0xA4A6, 0x3137, 0xA4A7, 0x3138, 0xA4A8, + 0x3139, 0xA4A9, 0x313A, 0xA4AA, 0x313B, 0xA4AB, 0x313C, 0xA4AC, + 0x313D, 0xA4AD, 0x313E, 0xA4AE, 0x313F, 0xA4AF, 0x3140, 0xA4B0, + 0x3141, 0xA4B1, 0x3142, 0xA4B2, 0x3143, 0xA4B3, 0x3144, 0xA4B4, + 0x3145, 0xA4B5, 0x3146, 0xA4B6, 0x3147, 0xA4B7, 0x3148, 0xA4B8, + 0x3149, 0xA4B9, 0x314A, 0xA4BA, 0x314B, 0xA4BB, 0x314C, 0xA4BC, + 0x314D, 0xA4BD, 0x314E, 0xA4BE, 0x314F, 0xA4BF, 0x3150, 0xA4C0, + 0x3151, 0xA4C1, 0x3152, 0xA4C2, 0x3153, 0xA4C3, 0x3154, 0xA4C4, + 0x3155, 0xA4C5, 0x3156, 0xA4C6, 0x3157, 0xA4C7, 0x3158, 0xA4C8, + 0x3159, 0xA4C9, 0x315A, 0xA4CA, 0x315B, 0xA4CB, 0x315C, 0xA4CC, + 0x315D, 0xA4CD, 0x315E, 0xA4CE, 0x315F, 0xA4CF, 0x3160, 0xA4D0, + 0x3161, 0xA4D1, 0x3162, 0xA4D2, 0x3163, 0xA4D3, 0x3164, 0xA4D4, + 0x3165, 0xA4D5, 0x3166, 0xA4D6, 0x3167, 0xA4D7, 0x3168, 0xA4D8, + 0x3169, 0xA4D9, 0x316A, 0xA4DA, 0x316B, 0xA4DB, 0x316C, 0xA4DC, + 0x316D, 0xA4DD, 0x316E, 0xA4DE, 0x316F, 0xA4DF, 0x3170, 0xA4E0, + 0x3171, 0xA4E1, 0x3172, 0xA4E2, 0x3173, 0xA4E3, 0x3174, 0xA4E4, + 0x3175, 0xA4E5, 0x3176, 0xA4E6, 0x3177, 0xA4E7, 0x3178, 0xA4E8, + 0x3179, 0xA4E9, 0x317A, 0xA4EA, 0x317B, 0xA4EB, 0x317C, 0xA4EC, + 0x317D, 0xA4ED, 0x317E, 0xA4EE, 0x317F, 0xA4EF, 0x3180, 0xA4F0, + 0x3181, 0xA4F1, 0x3182, 0xA4F2, 0x3183, 0xA4F3, 0x3184, 0xA4F4, + 0x3185, 0xA4F5, 0x3186, 0xA4F6, 0x3187, 0xA4F7, 0x3188, 0xA4F8, + 0x3189, 0xA4F9, 0x318A, 0xA4FA, 0x318B, 0xA4FB, 0x318C, 0xA4FC, + 0x318D, 0xA4FD, 0x318E, 0xA4FE, 0x3200, 0xA9B1, 0x3201, 0xA9B2, + 0x3202, 0xA9B3, 0x3203, 0xA9B4, 0x3204, 0xA9B5, 0x3205, 0xA9B6, + 0x3206, 0xA9B7, 0x3207, 0xA9B8, 0x3208, 0xA9B9, 0x3209, 0xA9BA, + 0x320A, 0xA9BB, 0x320B, 0xA9BC, 0x320C, 0xA9BD, 0x320D, 0xA9BE, + 0x320E, 0xA9BF, 0x320F, 0xA9C0, 0x3210, 0xA9C1, 0x3211, 0xA9C2, + 0x3212, 0xA9C3, 0x3213, 0xA9C4, 0x3214, 0xA9C5, 0x3215, 0xA9C6, + 0x3216, 0xA9C7, 0x3217, 0xA9C8, 0x3218, 0xA9C9, 0x3219, 0xA9CA, + 0x321A, 0xA9CB, 0x321B, 0xA9CC, 0x321C, 0xA2DF, 0x3260, 0xA8B1, + 0x3261, 0xA8B2, 0x3262, 0xA8B3, 0x3263, 0xA8B4, 0x3264, 0xA8B5, + 0x3265, 0xA8B6, 0x3266, 0xA8B7, 0x3267, 0xA8B8, 0x3268, 0xA8B9, + 0x3269, 0xA8BA, 0x326A, 0xA8BB, 0x326B, 0xA8BC, 0x326C, 0xA8BD, + 0x326D, 0xA8BE, 0x326E, 0xA8BF, 0x326F, 0xA8C0, 0x3270, 0xA8C1, + 0x3271, 0xA8C2, 0x3272, 0xA8C3, 0x3273, 0xA8C4, 0x3274, 0xA8C5, + 0x3275, 0xA8C6, 0x3276, 0xA8C7, 0x3277, 0xA8C8, 0x3278, 0xA8C9, + 0x3279, 0xA8CA, 0x327A, 0xA8CB, 0x327B, 0xA8CC, 0x327F, 0xA2DE, + 0x3380, 0xA7C9, 0x3381, 0xA7CA, 0x3382, 0xA7CB, 0x3383, 0xA7CC, + 0x3384, 0xA7CD, 0x3388, 0xA7BA, 0x3389, 0xA7BB, 0x338A, 0xA7DC, + 0x338B, 0xA7DD, 0x338C, 0xA7DE, 0x338D, 0xA7B6, 0x338E, 0xA7B7, + 0x338F, 0xA7B8, 0x3390, 0xA7D4, 0x3391, 0xA7D5, 0x3392, 0xA7D6, + 0x3393, 0xA7D7, 0x3394, 0xA7D8, 0x3395, 0xA7A1, 0x3396, 0xA7A2, + 0x3397, 0xA7A3, 0x3398, 0xA7A5, 0x3399, 0xA7AB, 0x339A, 0xA7AC, + 0x339B, 0xA7AD, 0x339C, 0xA7AE, 0x339D, 0xA7AF, 0x339E, 0xA7B0, + 0x339F, 0xA7B1, 0x33A0, 0xA7B2, 0x33A1, 0xA7B3, 0x33A2, 0xA7B4, + 0x33A3, 0xA7A7, 0x33A4, 0xA7A8, 0x33A5, 0xA7A9, 0x33A6, 0xA7AA, + 0x33A7, 0xA7BD, 0x33A8, 0xA7BE, 0x33A9, 0xA7E5, 0x33AA, 0xA7E6, + 0x33AB, 0xA7E7, 0x33AC, 0xA7E8, 0x33AD, 0xA7E1, 0x33AE, 0xA7E2, + 0x33AF, 0xA7E3, 0x33B0, 0xA7BF, 0x33B1, 0xA7C0, 0x33B2, 0xA7C1, + 0x33B3, 0xA7C2, 0x33B4, 0xA7C3, 0x33B5, 0xA7C4, 0x33B6, 0xA7C5, + 0x33B7, 0xA7C6, 0x33B8, 0xA7C7, 0x33B9, 0xA7C8, 0x33BA, 0xA7CE, + 0x33BB, 0xA7CF, 0x33BC, 0xA7D0, 0x33BD, 0xA7D1, 0x33BE, 0xA7D2, + 0x33BF, 0xA7D3, 0x33C0, 0xA7DA, 0x33C1, 0xA7DB, 0x33C2, 0xA2E3, + 0x33C3, 0xA7EC, 0x33C4, 0xA7A6, 0x33C5, 0xA7E0, 0x33C6, 0xA7EF, + 0x33C7, 0xA2E1, 0x33C8, 0xA7BC, 0x33C9, 0xA7ED, 0x33CA, 0xA7B5, + 0x33CF, 0xA7B9, 0x33D0, 0xA7EA, 0x33D3, 0xA7EB, 0x33D6, 0xA7DF, + 0x33D8, 0xA2E4, 0x33DB, 0xA7E4, 0x33DC, 0xA7EE, 0x33DD, 0xA7E9, + 0x4E00, 0xECE9, 0x4E01, 0xEFCB, 0x4E03, 0xF6D2, 0x4E07, 0xD8B2, + 0x4E08, 0xEDDB, 0x4E09, 0xDFB2, 0x4E0A, 0xDFBE, 0x4E0B, 0xF9BB, + 0x4E0D, 0xDCF4, 0x4E11, 0xF5E4, 0x4E14, 0xF3A6, 0x4E15, 0xDDE0, + 0x4E16, 0xE1A6, 0x4E18, 0xCEF8, 0x4E19, 0xDCB0, 0x4E1E, 0xE3AA, + 0x4E2D, 0xF1E9, 0x4E32, 0xCDFA, 0x4E38, 0xFCAF, 0x4E39, 0xD3A1, + 0x4E3B, 0xF1AB, 0x4E42, 0xE7D1, 0x4E43, 0xD2AC, 0x4E45, 0xCEF9, + 0x4E4B, 0xF1FD, 0x4E4D, 0xDEBF, 0x4E4E, 0xFBBA, 0x4E4F, 0xF9B9, + 0x4E56, 0xCED2, 0x4E58, 0xE3AB, 0x4E59, 0xEBE0, 0x4E5D, 0xCEFA, + 0x4E5E, 0xCBF7, 0x4E5F, 0xE5A5, 0x4E6B, 0xCAE1, 0x4E6D, 0xD4CC, + 0x4E73, 0xEAE1, 0x4E76, 0xDCE3, 0x4E77, 0xDFAD, 0x4E7E, 0xCBEB, + 0x4E82, 0xD5AF, 0x4E86, 0xD6F5, 0x4E88, 0xE5F8, 0x4E8B, 0xDEC0, + 0x4E8C, 0xECA3, 0x4E8E, 0xE9CD, 0x4E90, 0xEAA7, 0x4E91, 0xE9F6, + 0x4E92, 0xFBBB, 0x4E94, 0xE7E9, 0x4E95, 0xEFCC, 0x4E98, 0xD0E6, + 0x4E9B, 0xDEC1, 0x4E9E, 0xE4AC, 0x4EA1, 0xD8CC, 0x4EA2, 0xF9F1, + 0x4EA4, 0xCEDF, 0x4EA5, 0xFAA4, 0x4EA6, 0xE6B2, 0x4EA8, 0xFAFB, + 0x4EAB, 0xFABD, 0x4EAC, 0xCCC8, 0x4EAD, 0xEFCD, 0x4EAE, 0xD5D5, + 0x4EB6, 0xD3A2, 0x4EBA, 0xECD1, 0x4EC0, 0xE4A7, 0x4EC1, 0xECD2, + 0x4EC4, 0xF6B1, 0x4EC7, 0xCEFB, 0x4ECA, 0xD0D1, 0x4ECB, 0xCBBF, + 0x4ECD, 0xEDA4, 0x4ED4, 0xEDA8, 0x4ED5, 0xDEC2, 0x4ED6, 0xF6E2, + 0x4ED7, 0xEDDC, 0x4ED8, 0xDCF5, 0x4ED9, 0xE0B9, 0x4EDD, 0xD4CE, + 0x4EDF, 0xF4B5, 0x4EE3, 0xD3DB, 0x4EE4, 0xD6B5, 0x4EE5, 0xECA4, + 0x4EF0, 0xE4E6, 0x4EF2, 0xF1EA, 0x4EF6, 0xCBEC, 0x4EF7, 0xCBC0, + 0x4EFB, 0xECF2, 0x4F01, 0xD0EA, 0x4F09, 0xF9F2, 0x4F0A, 0xECA5, + 0x4F0B, 0xD0DF, 0x4F0D, 0xE7EA, 0x4F0E, 0xD0EB, 0x4F0F, 0xDCD1, + 0x4F10, 0xDBE9, 0x4F11, 0xFDCC, 0x4F2F, 0xDBD7, 0x4F34, 0xDAE1, + 0x4F36, 0xD6B6, 0x4F38, 0xE3DF, 0x4F3A, 0xDEC3, 0x4F3C, 0xDEC4, + 0x4F3D, 0xCAA1, 0x4F43, 0xEEEC, 0x4F46, 0xD3A3, 0x4F47, 0xEEB7, + 0x4F48, 0xF8CF, 0x4F4D, 0xEAC8, 0x4F4E, 0xEEB8, 0x4F4F, 0xF1AC, + 0x4F50, 0xF1A5, 0x4F51, 0xE9CE, 0x4F55, 0xF9BC, 0x4F59, 0xE5F9, + 0x4F5A, 0xECEA, 0x4F5B, 0xDDD6, 0x4F5C, 0xEDC2, 0x4F69, 0xF8A5, + 0x4F6F, 0xE5BA, 0x4F70, 0xDBD8, 0x4F73, 0xCAA2, 0x4F76, 0xD1CD, + 0x4F7A, 0xEEED, 0x4F7E, 0xECEB, 0x4F7F, 0xDEC5, 0x4F81, 0xE3E0, + 0x4F83, 0xCAC9, 0x4F84, 0xF2E9, 0x4F86, 0xD5CE, 0x4F88, 0xF6B6, + 0x4F8A, 0xCEC2, 0x4F8B, 0xD6C7, 0x4F8D, 0xE3B4, 0x4F8F, 0xF1AD, + 0x4F91, 0xEAE2, 0x4F96, 0xD7C2, 0x4F98, 0xF3A7, 0x4F9B, 0xCDEA, + 0x4F9D, 0xEBEE, 0x4FAE, 0xD9B2, 0x4FAF, 0xFDA5, 0x4FB5, 0xF6D5, + 0x4FB6, 0xD5E2, 0x4FBF, 0xF8B5, 0x4FC2, 0xCCF5, 0x4FC3, 0xF5B5, + 0x4FC4, 0xE4AD, 0x4FC9, 0xE7EB, 0x4FCA, 0xF1D5, 0x4FCE, 0xF0BB, + 0x4FD1, 0xE9B5, 0x4FD3, 0xCCC9, 0x4FD4, 0xFAD5, 0x4FD7, 0xE1D4, + 0x4FDA, 0xD7D6, 0x4FDD, 0xDCC1, 0x4FDF, 0xDEC6, 0x4FE0, 0xFAEF, + 0x4FE1, 0xE3E1, 0x4FEE, 0xE1F3, 0x4FEF, 0xDCF6, 0x4FF1, 0xCEFC, + 0x4FF3, 0xDBC4, 0x4FF5, 0xF8F1, 0x4FF8, 0xDCE4, 0x4FFA, 0xE5EF, + 0x5002, 0xDCB1, 0x5006, 0xD5D6, 0x5009, 0xF3DA, 0x500B, 0xCBC1, + 0x500D, 0xDBC3, 0x5011, 0xD9FA, 0x5012, 0xD3EE, 0x5016, 0xFAB8, + 0x5019, 0xFDA6, 0x501A, 0xEBEF, 0x501C, 0xF4A6, 0x501E, 0xCCCA, + 0x501F, 0xF3A8, 0x5021, 0xF3DB, 0x5023, 0xDBA7, 0x5024, 0xF6B7, + 0x5026, 0xCFE6, 0x5027, 0xF0F2, 0x5028, 0xCBDA, 0x502A, 0xE7D2, + 0x502B, 0xD7C3, 0x502C, 0xF6F0, 0x502D, 0xE8DE, 0x503B, 0xE5A6, + 0x5043, 0xE5E7, 0x5047, 0xCAA3, 0x5048, 0xCCA7, 0x5049, 0xEAC9, + 0x504F, 0xF8B6, 0x5055, 0xFAA5, 0x505A, 0xF1AE, 0x505C, 0xEFCE, + 0x5065, 0xCBED, 0x5074, 0xF6B0, 0x5075, 0xEFCF, 0x5076, 0xE9CF, + 0x5078, 0xF7DE, 0x5080, 0xCED3, 0x5085, 0xDCF7, 0x508D, 0xDBA8, + 0x5091, 0xCBF8, 0x5098, 0xDFA1, 0x5099, 0xDDE1, 0x50AC, 0xF5CA, + 0x50AD, 0xE9B6, 0x50B2, 0xE7EC, 0x50B3, 0xEEEE, 0x50B5, 0xF3F0, + 0x50B7, 0xDFBF, 0x50BE, 0xCCCB, 0x50C5, 0xD0C1, 0x50C9, 0xF4D2, + 0x50CA, 0xE0BA, 0x50CF, 0xDFC0, 0x50D1, 0xCEE0, 0x50D5, 0xDCD2, + 0x50D6, 0xFDEA, 0x50DA, 0xD6F6, 0x50DE, 0xEACA, 0x50E5, 0xE8E9, + 0x50E7, 0xE3AC, 0x50ED, 0xF3D0, 0x50F9, 0xCAA4, 0x50FB, 0xDBF8, + 0x50FF, 0xDEC7, 0x5100, 0xEBF0, 0x5101, 0xF1D6, 0x5104, 0xE5E2, + 0x5106, 0xCCCC, 0x5109, 0xCBFB, 0x5112, 0xEAE3, 0x511F, 0xDFC1, + 0x5121, 0xD6ED, 0x512A, 0xE9D0, 0x5132, 0xEEB9, 0x5137, 0xD5E3, + 0x513A, 0xD1D3, 0x513C, 0xE5F0, 0x5140, 0xE8B4, 0x5141, 0xEBC3, + 0x5143, 0xEAAA, 0x5144, 0xFAFC, 0x5145, 0xF5F6, 0x5146, 0xF0BC, + 0x5147, 0xFDD4, 0x5148, 0xE0BB, 0x5149, 0xCEC3, 0x514B, 0xD0BA, + 0x514C, 0xF7BA, 0x514D, 0xD8F3, 0x514E, 0xF7CD, 0x5152, 0xE4AE, + 0x515C, 0xD4DF, 0x5162, 0xD0E7, 0x5165, 0xECFD, 0x5167, 0xD2AE, + 0x5168, 0xEEEF, 0x5169, 0xD5D7, 0x516A, 0xEAE4, 0x516B, 0xF8A2, + 0x516C, 0xCDEB, 0x516D, 0xD7BF, 0x516E, 0xFBB1, 0x5171, 0xCDEC, + 0x5175, 0xDCB2, 0x5176, 0xD0EC, 0x5177, 0xCEFD, 0x5178, 0xEEF0, + 0x517C, 0xCCC2, 0x5180, 0xD0ED, 0x5186, 0xE5F7, 0x518A, 0xF3FC, + 0x518D, 0xEEA2, 0x5192, 0xD9B3, 0x5195, 0xD8F4, 0x5197, 0xE9B7, + 0x51A0, 0xCEAE, 0x51A5, 0xD9A2, 0x51AA, 0xD8F1, 0x51AC, 0xD4CF, + 0x51B6, 0xE5A7, 0x51B7, 0xD5D2, 0x51BD, 0xD6A9, 0x51C4, 0xF4A2, + 0x51C6, 0xF1D7, 0x51C9, 0xD5D8, 0x51CB, 0xF0BD, 0x51CC, 0xD7D0, + 0x51CD, 0xD4D0, 0x51DC, 0xD7CF, 0x51DD, 0xEBEA, 0x51DE, 0xFDEB, + 0x51E1, 0xDBED, 0x51F0, 0xFCC5, 0x51F1, 0xCBC2, 0x51F6, 0xFDD5, + 0x51F8, 0xF4C8, 0x51F9, 0xE8EA, 0x51FA, 0xF5F3, 0x51FD, 0xF9DE, + 0x5200, 0xD3EF, 0x5203, 0xECD3, 0x5206, 0xDDC2, 0x5207, 0xEFB7, + 0x5208, 0xE7D4, 0x520A, 0xCACA, 0x520E, 0xD9FB, 0x5211, 0xFAFD, + 0x5217, 0xD6AA, 0x521D, 0xF4F8, 0x5224, 0xF7F7, 0x5225, 0xDCAC, + 0x5229, 0xD7D7, 0x522A, 0xDFA2, 0x522E, 0xCEBE, 0x5230, 0xD3F0, + 0x5236, 0xF0A4, 0x5237, 0xE1EC, 0x5238, 0xCFE7, 0x5239, 0xF3CB, + 0x523A, 0xEDA9, 0x523B, 0xCABE, 0x5243, 0xF4EF, 0x5247, 0xF6CE, + 0x524A, 0xDEFB, 0x524B, 0xD0BB, 0x524C, 0xD5B7, 0x524D, 0xEEF1, + 0x5254, 0xF4A8, 0x5256, 0xDCF8, 0x525B, 0xCBA7, 0x525D, 0xDACE, + 0x5261, 0xE0E6, 0x5269, 0xEDA5, 0x526A, 0xEEF2, 0x526F, 0xDCF9, + 0x5272, 0xF9DC, 0x5275, 0xF3DC, 0x527D, 0xF8F2, 0x527F, 0xF4F9, + 0x5283, 0xFCF1, 0x5287, 0xD0BC, 0x5288, 0xDBF9, 0x5289, 0xD7B1, + 0x528D, 0xCBFC, 0x5291, 0xF0A5, 0x5292, 0xCBFD, 0x529B, 0xD5F4, + 0x529F, 0xCDED, 0x52A0, 0xCAA5, 0x52A3, 0xD6AB, 0x52A4, 0xD0C2, + 0x52A9, 0xF0BE, 0x52AA, 0xD2BD, 0x52AB, 0xCCA4, 0x52BE, 0xFAB6, + 0x52C1, 0xCCCD, 0x52C3, 0xDAFA, 0x52C5, 0xF6CF, 0x52C7, 0xE9B8, + 0x52C9, 0xD8F5, 0x52CD, 0xCCCE, 0x52D2, 0xD7CD, 0x52D5, 0xD4D1, + 0x52D6, 0xE9ED, 0x52D8, 0xCAEB, 0x52D9, 0xD9E2, 0x52DB, 0xFDB2, + 0x52DD, 0xE3AD, 0x52DE, 0xD6CC, 0x52DF, 0xD9B4, 0x52E2, 0xE1A7, + 0x52E3, 0xEED3, 0x52E4, 0xD0C3, 0x52F3, 0xFDB3, 0x52F5, 0xD5E4, + 0x52F8, 0xCFE8, 0x52FA, 0xEDC3, 0x52FB, 0xD0B2, 0x52FE, 0xCEFE, + 0x52FF, 0xDAA8, 0x5305, 0xF8D0, 0x5308, 0xFDD6, 0x530D, 0xF8D1, + 0x530F, 0xF8D2, 0x5310, 0xDCD3, 0x5315, 0xDDE2, 0x5316, 0xFBF9, + 0x5317, 0xDDC1, 0x5319, 0xE3B5, 0x5320, 0xEDDD, 0x5321, 0xCEC4, + 0x5323, 0xCBA1, 0x532A, 0xDDE3, 0x532F, 0xFCDD, 0x5339, 0xF9AF, + 0x533F, 0xD2FB, 0x5340, 0xCFA1, 0x5341, 0xE4A8, 0x5343, 0xF4B6, + 0x5344, 0xECFE, 0x5347, 0xE3AE, 0x5348, 0xE7ED, 0x5349, 0xFDC1, + 0x534A, 0xDAE2, 0x534D, 0xD8B3, 0x5351, 0xDDE4, 0x5352, 0xF0EF, + 0x5353, 0xF6F1, 0x5354, 0xFAF0, 0x5357, 0xD1F5, 0x535A, 0xDACF, + 0x535C, 0xDCD4, 0x535E, 0xDCA6, 0x5360, 0xEFBF, 0x5366, 0xCECF, + 0x5368, 0xE0D9, 0x536F, 0xD9D6, 0x5370, 0xECD4, 0x5371, 0xEACB, + 0x5374, 0xCABF, 0x5375, 0xD5B0, 0x5377, 0xCFE9, 0x537D, 0xF1ED, + 0x537F, 0xCCCF, 0x5384, 0xE4F8, 0x5393, 0xE4ED, 0x5398, 0xD7D8, + 0x539A, 0xFDA7, 0x539F, 0xEAAB, 0x53A0, 0xF6B2, 0x53A5, 0xCFF0, + 0x53A6, 0xF9BD, 0x53AD, 0xE6F4, 0x53BB, 0xCBDB, 0x53C3, 0xF3D1, + 0x53C8, 0xE9D1, 0x53C9, 0xF3A9, 0x53CA, 0xD0E0, 0x53CB, 0xE9D2, + 0x53CD, 0xDAE3, 0x53D4, 0xE2D2, 0x53D6, 0xF6A2, 0x53D7, 0xE1F4, + 0x53DB, 0xDAE4, 0x53E1, 0xE7D5, 0x53E2, 0xF5BF, 0x53E3, 0xCFA2, + 0x53E4, 0xCDAF, 0x53E5, 0xCFA3, 0x53E9, 0xCDB0, 0x53EA, 0xF1FE, + 0x53EB, 0xD0A3, 0x53EC, 0xE1AF, 0x53ED, 0xF8A3, 0x53EF, 0xCAA6, + 0x53F0, 0xF7BB, 0x53F1, 0xF2EA, 0x53F2, 0xDEC8, 0x53F3, 0xE9D3, + 0x53F8, 0xDEC9, 0x5403, 0xFDDE, 0x5404, 0xCAC0, 0x5408, 0xF9EA, + 0x5409, 0xD1CE, 0x540A, 0xEED4, 0x540C, 0xD4D2, 0x540D, 0xD9A3, + 0x540E, 0xFDA8, 0x540F, 0xD7D9, 0x5410, 0xF7CE, 0x5411, 0xFABE, + 0x541B, 0xCFD6, 0x541D, 0xD7F0, 0x541F, 0xEBE1, 0x5420, 0xF8C5, + 0x5426, 0xDCFA, 0x5429, 0xDDC3, 0x542B, 0xF9DF, 0x5433, 0xE7EF, + 0x5438, 0xFDE5, 0x5439, 0xF6A3, 0x543B, 0xD9FC, 0x543C, 0xFDA9, + 0x543E, 0xE7EE, 0x5442, 0xD5E5, 0x5448, 0xEFD0, 0x544A, 0xCDB1, + 0x5451, 0xF7A2, 0x5468, 0xF1B2, 0x546A, 0xF1B1, 0x5471, 0xCDB2, + 0x5473, 0xDAAB, 0x5475, 0xCAA7, 0x547B, 0xE3E2, 0x547C, 0xFBBC, + 0x547D, 0xD9A4, 0x5480, 0xEEBA, 0x5486, 0xF8D3, 0x548C, 0xFBFA, + 0x548E, 0xCFA4, 0x5490, 0xDCFB, 0x54A4, 0xF6E3, 0x54A8, 0xEDAA, + 0x54AB, 0xF2A1, 0x54AC, 0xCEE1, 0x54B3, 0xFAA6, 0x54B8, 0xF9E0, + 0x54BD, 0xECD6, 0x54C0, 0xE4EE, 0x54C1, 0xF9A1, 0x54C4, 0xFBEF, + 0x54C8, 0xF9EB, 0x54C9, 0xEEA3, 0x54E1, 0xEAAC, 0x54E5, 0xCAA8, + 0x54E8, 0xF4FA, 0x54ED, 0xCDD6, 0x54EE, 0xFCF6, 0x54F2, 0xF4C9, + 0x54FA, 0xF8D4, 0x5504, 0xF8A6, 0x5506, 0xDECA, 0x5507, 0xF2C6, + 0x550E, 0xD7DA, 0x5510, 0xD3D0, 0x551C, 0xD8C5, 0x552F, 0xEAE6, + 0x5531, 0xF3DD, 0x5535, 0xE4DA, 0x553E, 0xF6E4, 0x5544, 0xF6F2, + 0x5546, 0xDFC2, 0x554F, 0xD9FD, 0x5553, 0xCCF6, 0x5556, 0xD3BA, + 0x555E, 0xE4AF, 0x5563, 0xF9E1, 0x557C, 0xF0A6, 0x5580, 0xCBD3, + 0x5584, 0xE0BC, 0x5586, 0xF4CA, 0x5587, 0xD4FA, 0x5589, 0xFDAA, + 0x558A, 0xF9E2, 0x5598, 0xF4B7, 0x5599, 0xFDC2, 0x559A, 0xFCB0, + 0x559C, 0xFDEC, 0x559D, 0xCAE2, 0x55A7, 0xFDBD, 0x55A9, 0xEAE7, + 0x55AA, 0xDFC3, 0x55AB, 0xD1D2, 0x55AC, 0xCEE2, 0x55AE, 0xD3A4, + 0x55C5, 0xFDAB, 0x55C7, 0xDFE0, 0x55D4, 0xF2C7, 0x55DA, 0xE7F0, + 0x55DC, 0xD0EE, 0x55DF, 0xF3AA, 0x55E3, 0xDECB, 0x55E4, 0xF6B8, + 0x55FD, 0xE1F5, 0x55FE, 0xF1B3, 0x5606, 0xF7A3, 0x5609, 0xCAA9, + 0x5614, 0xCFA5, 0x5617, 0xDFC4, 0x562F, 0xE1B0, 0x5632, 0xF0BF, + 0x5634, 0xF6A4, 0x5636, 0xE3B6, 0x5653, 0xFAC6, 0x5668, 0xD0EF, + 0x566B, 0xFDED, 0x5674, 0xDDC4, 0x5686, 0xFCF7, 0x56A5, 0xE6BF, + 0x56AC, 0xDEAD, 0x56AE, 0xFABF, 0x56B4, 0xE5F1, 0x56BC, 0xEDC4, + 0x56CA, 0xD2A5, 0x56CD, 0xFDEE, 0x56D1, 0xF5B6, 0x56DA, 0xE1F6, + 0x56DB, 0xDECC, 0x56DE, 0xFCDE, 0x56E0, 0xECD7, 0x56F0, 0xCDDD, + 0x56F9, 0xD6B7, 0x56FA, 0xCDB3, 0x5703, 0xF8D5, 0x5704, 0xE5D8, + 0x5708, 0xCFEA, 0x570B, 0xCFD0, 0x570D, 0xEACC, 0x5712, 0xEAAE, + 0x5713, 0xEAAD, 0x5716, 0xD3F1, 0x5718, 0xD3A5, 0x571F, 0xF7CF, + 0x5728, 0xEEA4, 0x572D, 0xD0A4, 0x5730, 0xF2A2, 0x573B, 0xD0F0, + 0x5740, 0xF2A3, 0x5742, 0xF7F8, 0x5747, 0xD0B3, 0x574A, 0xDBA9, + 0x574D, 0xD3BB, 0x574E, 0xCAEC, 0x5750, 0xF1A6, 0x5751, 0xCBD5, + 0x5761, 0xF7E7, 0x5764, 0xCDDE, 0x5766, 0xF7A4, 0x576A, 0xF8C0, + 0x576E, 0xD3DD, 0x5770, 0xCCD0, 0x5775, 0xCFA6, 0x577C, 0xF6F3, + 0x5782, 0xE1F7, 0x5788, 0xD3DC, 0x578B, 0xFAFE, 0x5793, 0xFAA7, + 0x57A0, 0xEBD9, 0x57A2, 0xCFA7, 0x57A3, 0xEAAF, 0x57C3, 0xE4EF, + 0x57C7, 0xE9B9, 0x57C8, 0xF1D8, 0x57CB, 0xD8D8, 0x57CE, 0xE0F2, + 0x57DF, 0xE6B4, 0x57E0, 0xDCFC, 0x57F0, 0xF3F1, 0x57F4, 0xE3D0, + 0x57F7, 0xF2FB, 0x57F9, 0xDBC6, 0x57FA, 0xD0F1, 0x57FC, 0xD0F2, + 0x5800, 0xCFDC, 0x5802, 0xD3D1, 0x5805, 0xCCB1, 0x5806, 0xF7D8, + 0x5808, 0xCBA8, 0x5809, 0xEBBC, 0x580A, 0xE4BE, 0x581E, 0xF4DC, + 0x5821, 0xDCC2, 0x5824, 0xF0A7, 0x5827, 0xE6C0, 0x582A, 0xCAED, + 0x582F, 0xE8EB, 0x5830, 0xE5E8, 0x5831, 0xDCC3, 0x5834, 0xEDDE, + 0x5835, 0xD3F2, 0x583A, 0xCCF7, 0x584A, 0xCED4, 0x584B, 0xE7AB, + 0x584F, 0xCBC3, 0x5851, 0xE1B1, 0x5854, 0xF7B2, 0x5857, 0xD3F3, + 0x5858, 0xD3D2, 0x585A, 0xF5C0, 0x585E, 0xDFDD, 0x5861, 0xEEF3, + 0x5862, 0xE7F1, 0x5864, 0xFDB4, 0x5875, 0xF2C8, 0x5879, 0xF3D2, + 0x587C, 0xEEF4, 0x587E, 0xE2D3, 0x5883, 0xCCD1, 0x5885, 0xDFEA, + 0x5889, 0xE9BA, 0x5893, 0xD9D7, 0x589C, 0xF5CD, 0x589E, 0xF1F2, + 0x589F, 0xFAC7, 0x58A8, 0xD9F8, 0x58A9, 0xD4C2, 0x58AE, 0xF6E5, + 0x58B3, 0xDDC5, 0x58BA, 0xE7F2, 0x58BB, 0xEDDF, 0x58BE, 0xCACB, + 0x58C1, 0xDBFA, 0x58C5, 0xE8B5, 0x58C7, 0xD3A6, 0x58CE, 0xFDB5, + 0x58D1, 0xF9C9, 0x58D3, 0xE4E2, 0x58D5, 0xFBBD, 0x58D8, 0xD7A4, + 0x58D9, 0xCEC5, 0x58DE, 0xCED5, 0x58DF, 0xD6E6, 0x58E4, 0xE5BD, + 0x58EB, 0xDECD, 0x58EC, 0xECF3, 0x58EF, 0xEDE0, 0x58F9, 0xECEC, + 0x58FA, 0xFBBE, 0x58FB, 0xDFEB, 0x58FD, 0xE1F8, 0x590F, 0xF9BE, + 0x5914, 0xD0F3, 0x5915, 0xE0AA, 0x5916, 0xE8E2, 0x5919, 0xE2D4, + 0x591A, 0xD2FD, 0x591C, 0xE5A8, 0x5922, 0xD9D3, 0x5927, 0xD3DE, + 0x5929, 0xF4B8, 0x592A, 0xF7BC, 0x592B, 0xDCFD, 0x592D, 0xE8EC, + 0x592E, 0xE4E7, 0x5931, 0xE3F7, 0x5937, 0xECA8, 0x593E, 0xFAF1, + 0x5944, 0xE5F2, 0x5947, 0xD0F4, 0x5948, 0xD2AF, 0x5949, 0xDCE5, + 0x594E, 0xD0A5, 0x594F, 0xF1B4, 0x5950, 0xFCB1, 0x5951, 0xCCF8, + 0x5954, 0xDDC6, 0x5955, 0xFAD1, 0x5957, 0xF7DF, 0x595A, 0xFAA8, + 0x5960, 0xEEF5, 0x5962, 0xDECE, 0x5967, 0xE7F3, 0x596A, 0xF7AC, + 0x596B, 0xEBC4, 0x596C, 0xEDE1, 0x596D, 0xE0AB, 0x596E, 0xDDC7, + 0x5973, 0xD2B3, 0x5974, 0xD2BF, 0x5978, 0xCACC, 0x597D, 0xFBBF, + 0x5982, 0xE5FD, 0x5983, 0xDDE5, 0x5984, 0xD8CD, 0x598A, 0xECF4, + 0x5993, 0xD0F5, 0x5996, 0xE8ED, 0x5997, 0xD0D2, 0x5999, 0xD9D8, + 0x59A5, 0xF6E6, 0x59A8, 0xDBAA, 0x59AC, 0xF7E0, 0x59B9, 0xD8D9, + 0x59BB, 0xF4A3, 0x59BE, 0xF4DD, 0x59C3, 0xEFD1, 0x59C6, 0xD9B5, + 0x59C9, 0xEDAB, 0x59CB, 0xE3B7, 0x59D0, 0xEEBB, 0x59D1, 0xCDB4, + 0x59D3, 0xE0F3, 0x59D4, 0xEACD, 0x59D9, 0xECF5, 0x59DA, 0xE8EE, + 0x59DC, 0xCBA9, 0x59DD, 0xF1AF, 0x59E6, 0xCACD, 0x59E8, 0xECA9, + 0x59EA, 0xF2EB, 0x59EC, 0xFDEF, 0x59EE, 0xF9F3, 0x59F8, 0xE6C1, + 0x59FB, 0xECD8, 0x59FF, 0xEDAC, 0x5A01, 0xEACE, 0x5A03, 0xE8DF, + 0x5A11, 0xDECF, 0x5A18, 0xD2A6, 0x5A1B, 0xE7F4, 0x5A1C, 0xD1D6, + 0x5A1F, 0xE6C2, 0x5A20, 0xE3E3, 0x5A25, 0xE4B0, 0x5A29, 0xD8B4, + 0x5A36, 0xF6A5, 0x5A3C, 0xF3DE, 0x5A41, 0xD7A5, 0x5A46, 0xF7E8, + 0x5A49, 0xE8C6, 0x5A5A, 0xFBE6, 0x5A62, 0xDDE6, 0x5A66, 0xDCFE, + 0x5A92, 0xD8DA, 0x5A9A, 0xDAAC, 0x5A9B, 0xEAB0, 0x5AA4, 0xE3B8, + 0x5AC1, 0xCAAA, 0x5AC2, 0xE1F9, 0x5AC4, 0xEAB1, 0x5AC9, 0xF2EC, + 0x5ACC, 0xFAEE, 0x5AE1, 0xEED5, 0x5AE6, 0xF9F4, 0x5AE9, 0xD2EC, + 0x5B05, 0xFBFB, 0x5B09, 0xFDF0, 0x5B0B, 0xE0BD, 0x5B0C, 0xCEE3, + 0x5B16, 0xF8C6, 0x5B2A, 0xDEAE, 0x5B40, 0xDFC5, 0x5B43, 0xE5BE, + 0x5B50, 0xEDAD, 0x5B51, 0xFAEA, 0x5B54, 0xCDEE, 0x5B55, 0xEDA6, + 0x5B57, 0xEDAE, 0x5B58, 0xF0ED, 0x5B5A, 0xDDA1, 0x5B5C, 0xEDAF, + 0x5B5D, 0xFCF8, 0x5B5F, 0xD8EB, 0x5B63, 0xCCF9, 0x5B64, 0xCDB5, + 0x5B69, 0xFAA9, 0x5B6B, 0xE1DD, 0x5B70, 0xE2D5, 0x5B71, 0xEDCF, + 0x5B75, 0xDDA2, 0x5B78, 0xF9CA, 0x5B7A, 0xEAE8, 0x5B7C, 0xE5ED, + 0x5B85, 0xD3EB, 0x5B87, 0xE9D4, 0x5B88, 0xE1FA, 0x5B89, 0xE4CC, + 0x5B8B, 0xE1E4, 0x5B8C, 0xE8C7, 0x5B8F, 0xCEDB, 0x5B93, 0xDCD5, + 0x5B95, 0xF7B5, 0x5B96, 0xFCF3, 0x5B97, 0xF0F3, 0x5B98, 0xCEAF, + 0x5B99, 0xF1B5, 0x5B9A, 0xEFD2, 0x5B9B, 0xE8C8, 0x5B9C, 0xEBF1, + 0x5BA2, 0xCBD4, 0x5BA3, 0xE0BE, 0x5BA4, 0xE3F8, 0x5BA5, 0xEAE9, + 0x5BA6, 0xFCB2, 0x5BAC, 0xE0F4, 0x5BAE, 0xCFE0, 0x5BB0, 0xEEA5, + 0x5BB3, 0xFAAA, 0x5BB4, 0xE6C3, 0x5BB5, 0xE1B2, 0x5BB6, 0xCAAB, + 0x5BB8, 0xE3E4, 0x5BB9, 0xE9BB, 0x5BBF, 0xE2D6, 0x5BC0, 0xF3F2, + 0x5BC2, 0xEED6, 0x5BC3, 0xEAB2, 0x5BC4, 0xD0F6, 0x5BC5, 0xECD9, + 0x5BC6, 0xDACB, 0x5BC7, 0xCFA8, 0x5BCC, 0xDDA3, 0x5BD0, 0xD8DB, + 0x5BD2, 0xF9CE, 0x5BD3, 0xE9D5, 0x5BD4, 0xE3D1, 0x5BD7, 0xD2BC, + 0x5BDE, 0xD8AC, 0x5BDF, 0xF3CC, 0x5BE1, 0xCDFB, 0x5BE2, 0xF6D6, + 0x5BE4, 0xE7F5, 0x5BE5, 0xE8EF, 0x5BE6, 0xE3F9, 0x5BE7, 0xD2BB, + 0x5BE8, 0xF3F3, 0x5BE9, 0xE3FB, 0x5BEB, 0xDED0, 0x5BEC, 0xCEB0, + 0x5BEE, 0xD6F7, 0x5BEF, 0xF1D9, 0x5BF5, 0xF5C1, 0x5BF6, 0xDCC4, + 0x5BF8, 0xF5BB, 0x5BFA, 0xDED1, 0x5C01, 0xDCE6, 0x5C04, 0xDED2, + 0x5C07, 0xEDE2, 0x5C08, 0xEEF6, 0x5C09, 0xEACF, 0x5C0A, 0xF0EE, + 0x5C0B, 0xE3FC, 0x5C0D, 0xD3DF, 0x5C0E, 0xD3F4, 0x5C0F, 0xE1B3, + 0x5C11, 0xE1B4, 0x5C16, 0xF4D3, 0x5C19, 0xDFC6, 0x5C24, 0xE9D6, + 0x5C28, 0xDBAB, 0x5C31, 0xF6A6, 0x5C38, 0xE3B9, 0x5C39, 0xEBC5, + 0x5C3A, 0xF4A9, 0x5C3B, 0xCDB6, 0x5C3C, 0xD2F9, 0x5C3E, 0xDAAD, + 0x5C3F, 0xD2E3, 0x5C40, 0xCFD1, 0x5C45, 0xCBDC, 0x5C46, 0xCCFA, + 0x5C48, 0xCFDD, 0x5C4B, 0xE8A9, 0x5C4D, 0xE3BB, 0x5C4E, 0xE3BA, + 0x5C51, 0xE0DA, 0x5C55, 0xEEF7, 0x5C5B, 0xDCB3, 0x5C60, 0xD3F5, + 0x5C62, 0xD7A6, 0x5C64, 0xF6B5, 0x5C65, 0xD7DB, 0x5C6C, 0xE1D5, + 0x5C6F, 0xD4EA, 0x5C71, 0xDFA3, 0x5C79, 0xFDDF, 0x5C90, 0xD0F7, + 0x5C91, 0xEDD4, 0x5CA1, 0xCBAA, 0x5CA9, 0xE4DB, 0x5CAB, 0xE1FB, + 0x5CAC, 0xCBA2, 0x5CB1, 0xD3E0, 0x5CB3, 0xE4BF, 0x5CB5, 0xFBC0, + 0x5CB7, 0xDABE, 0x5CB8, 0xE4CD, 0x5CBA, 0xD6B9, 0x5CBE, 0xEFC0, + 0x5CC0, 0xE1FC, 0x5CD9, 0xF6B9, 0x5CE0, 0xDFC7, 0x5CE8, 0xE4B1, + 0x5CEF, 0xDCE7, 0x5CF0, 0xDCE8, 0x5CF4, 0xFAD6, 0x5CF6, 0xD3F6, + 0x5CFB, 0xF1DA, 0x5CFD, 0xFAF2, 0x5D07, 0xE2FD, 0x5D0D, 0xD5CF, + 0x5D0E, 0xD0F8, 0x5D11, 0xCDDF, 0x5D14, 0xF5CB, 0x5D16, 0xE4F0, + 0x5D17, 0xCBAB, 0x5D19, 0xD7C4, 0x5D27, 0xE2FE, 0x5D29, 0xDDDA, + 0x5D4B, 0xDAAE, 0x5D4C, 0xCAEE, 0x5D50, 0xD5B9, 0x5D69, 0xE3A1, + 0x5D6C, 0xE8E3, 0x5D6F, 0xF3AB, 0x5D87, 0xCFA9, 0x5D8B, 0xD3F7, + 0x5D9D, 0xD4F1, 0x5DA0, 0xCEE4, 0x5DA2, 0xE8F2, 0x5DAA, 0xE5F5, + 0x5DB8, 0xE7AE, 0x5DBA, 0xD6BA, 0x5DBC, 0xDFEC, 0x5DBD, 0xE4C0, + 0x5DCD, 0xE8E4, 0x5DD2, 0xD8B5, 0x5DD6, 0xE4DC, 0x5DDD, 0xF4B9, + 0x5DDE, 0xF1B6, 0x5DE1, 0xE2DE, 0x5DE2, 0xE1B5, 0x5DE5, 0xCDEF, + 0x5DE6, 0xF1A7, 0x5DE7, 0xCEE5, 0x5DE8, 0xCBDD, 0x5DEB, 0xD9E3, + 0x5DEE, 0xF3AC, 0x5DF1, 0xD0F9, 0x5DF2, 0xECAB, 0x5DF3, 0xDED3, + 0x5DF4, 0xF7E9, 0x5DF7, 0xF9F5, 0x5DFD, 0xE1DE, 0x5DFE, 0xCBEE, + 0x5E02, 0xE3BC, 0x5E03, 0xF8D6, 0x5E06, 0xDBEE, 0x5E0C, 0xFDF1, + 0x5E11, 0xF7B6, 0x5E16, 0xF4DE, 0x5E19, 0xF2ED, 0x5E1B, 0xDBD9, + 0x5E1D, 0xF0A8, 0x5E25, 0xE1FD, 0x5E2B, 0xDED4, 0x5E2D, 0xE0AC, + 0x5E33, 0xEDE3, 0x5E36, 0xD3E1, 0x5E38, 0xDFC8, 0x5E3D, 0xD9B6, + 0x5E3F, 0xFDAC, 0x5E40, 0xEFD3, 0x5E44, 0xE4C1, 0x5E45, 0xF8EB, + 0x5E47, 0xDBAC, 0x5E4C, 0xFCC6, 0x5E55, 0xD8AD, 0x5E5F, 0xF6BA, + 0x5E61, 0xDBDF, 0x5E62, 0xD3D3, 0x5E63, 0xF8C7, 0x5E72, 0xCACE, + 0x5E73, 0xF8C1, 0x5E74, 0xD2B4, 0x5E77, 0xDCB4, 0x5E78, 0xFAB9, + 0x5E79, 0xCACF, 0x5E7B, 0xFCB3, 0x5E7C, 0xEAEA, 0x5E7D, 0xEAEB, + 0x5E7E, 0xD0FA, 0x5E84, 0xEDE4, 0x5E87, 0xDDE7, 0x5E8A, 0xDFC9, + 0x5E8F, 0xDFED, 0x5E95, 0xEEBC, 0x5E97, 0xEFC1, 0x5E9A, 0xCCD2, + 0x5E9C, 0xDDA4, 0x5EA0, 0xDFCA, 0x5EA6, 0xD3F8, 0x5EA7, 0xF1A8, + 0x5EAB, 0xCDB7, 0x5EAD, 0xEFD4, 0x5EB5, 0xE4DD, 0x5EB6, 0xDFEE, + 0x5EB7, 0xCBAC, 0x5EB8, 0xE9BC, 0x5EBE, 0xEAEC, 0x5EC2, 0xDFCB, + 0x5EC8, 0xF9BF, 0x5EC9, 0xD6AF, 0x5ECA, 0xD5C6, 0x5ED0, 0xCFAA, + 0x5ED3, 0xCEA9, 0x5ED6, 0xD6F8, 0x5EDA, 0xF1B7, 0x5EDB, 0xEEF8, + 0x5EDF, 0xD9D9, 0x5EE0, 0xF3DF, 0x5EE2, 0xF8C8, 0x5EE3, 0xCEC6, + 0x5EEC, 0xD5E6, 0x5EF3, 0xF4E6, 0x5EF6, 0xE6C5, 0x5EF7, 0xEFD5, + 0x5EFA, 0xCBEF, 0x5EFB, 0xFCDF, 0x5F01, 0xDCA7, 0x5F04, 0xD6E7, + 0x5F0A, 0xF8C9, 0x5F0F, 0xE3D2, 0x5F11, 0xE3BD, 0x5F13, 0xCFE1, + 0x5F14, 0xF0C0, 0x5F15, 0xECDA, 0x5F17, 0xDDD7, 0x5F18, 0xFBF0, + 0x5F1B, 0xECAC, 0x5F1F, 0xF0A9, 0x5F26, 0xFAD7, 0x5F27, 0xFBC1, + 0x5F29, 0xD2C0, 0x5F31, 0xE5B0, 0x5F35, 0xEDE5, 0x5F3A, 0xCBAD, + 0x5F3C, 0xF9B0, 0x5F48, 0xF7A5, 0x5F4A, 0xCBAE, 0x5F4C, 0xDAAF, + 0x5F4E, 0xD8B6, 0x5F56, 0xD3A7, 0x5F57, 0xFBB2, 0x5F59, 0xFDC4, + 0x5F5B, 0xECAD, 0x5F62, 0xFBA1, 0x5F66, 0xE5E9, 0x5F67, 0xE9EE, + 0x5F69, 0xF3F4, 0x5F6A, 0xF8F3, 0x5F6B, 0xF0C1, 0x5F6C, 0xDEAF, + 0x5F6D, 0xF8B0, 0x5F70, 0xF3E0, 0x5F71, 0xE7AF, 0x5F77, 0xDBAD, + 0x5F79, 0xE6B5, 0x5F7C, 0xF9A8, 0x5F7F, 0xDDD8, 0x5F80, 0xE8D9, + 0x5F81, 0xEFD6, 0x5F85, 0xD3E2, 0x5F87, 0xE2DF, 0x5F8A, 0xFCE0, + 0x5F8B, 0xD7C8, 0x5F8C, 0xFDAD, 0x5F90, 0xDFEF, 0x5F91, 0xCCD3, + 0x5F92, 0xD3F9, 0x5F97, 0xD4F0, 0x5F98, 0xDBC7, 0x5F99, 0xDED5, + 0x5F9E, 0xF0F4, 0x5FA0, 0xD5D0, 0x5FA1, 0xE5D9, 0x5FA8, 0xFCC7, + 0x5FA9, 0xDCD6, 0x5FAA, 0xE2E0, 0x5FAE, 0xDAB0, 0x5FB5, 0xF3A3, + 0x5FB7, 0xD3EC, 0x5FB9, 0xF4CB, 0x5FBD, 0xFDC5, 0x5FC3, 0xE3FD, + 0x5FC5, 0xF9B1, 0x5FCC, 0xD0FB, 0x5FCD, 0xECDB, 0x5FD6, 0xF5BC, + 0x5FD7, 0xF2A4, 0x5FD8, 0xD8CE, 0x5FD9, 0xD8CF, 0x5FE0, 0xF5F7, + 0x5FEB, 0xF6E1, 0x5FF5, 0xD2B7, 0x5FFD, 0xFBEC, 0x5FFF, 0xDDC8, + 0x600F, 0xE4E8, 0x6012, 0xD2C1, 0x6016, 0xF8D7, 0x601C, 0xD6BB, + 0x601D, 0xDED6, 0x6020, 0xF7BD, 0x6021, 0xECAE, 0x6025, 0xD0E1, + 0x6027, 0xE0F5, 0x6028, 0xEAB3, 0x602A, 0xCED6, 0x602F, 0xCCA5, + 0x6041, 0xECF6, 0x6042, 0xE2E1, 0x6043, 0xE3BE, 0x604D, 0xFCC8, + 0x6050, 0xCDF0, 0x6052, 0xF9F6, 0x6055, 0xDFF0, 0x6059, 0xE5BF, + 0x605D, 0xCEBF, 0x6062, 0xFCE1, 0x6063, 0xEDB0, 0x6064, 0xFDD1, + 0x6065, 0xF6BB, 0x6068, 0xF9CF, 0x6069, 0xEBDA, 0x606A, 0xCAC1, + 0x606C, 0xD2B8, 0x606D, 0xCDF1, 0x606F, 0xE3D3, 0x6070, 0xFDE6, + 0x6085, 0xE6ED, 0x6089, 0xE3FA, 0x608C, 0xF0AA, 0x608D, 0xF9D0, + 0x6094, 0xFCE2, 0x6096, 0xF8A7, 0x609A, 0xE1E5, 0x609B, 0xEEF9, + 0x609F, 0xE7F6, 0x60A0, 0xEAED, 0x60A3, 0xFCB4, 0x60A4, 0xF5C2, + 0x60A7, 0xD7DC, 0x60B0, 0xF0F5, 0x60B2, 0xDDE8, 0x60B3, 0xD3ED, + 0x60B4, 0xF5FC, 0x60B6, 0xDABF, 0x60B8, 0xCCFB, 0x60BC, 0xD3FA, + 0x60BD, 0xF4A4, 0x60C5, 0xEFD7, 0x60C7, 0xD4C3, 0x60D1, 0xFBE3, + 0x60DA, 0xFBED, 0x60DC, 0xE0AD, 0x60DF, 0xEAEE, 0x60E0, 0xFBB3, + 0x60E1, 0xE4C2, 0x60F0, 0xF6E7, 0x60F1, 0xD2DD, 0x60F3, 0xDFCC, + 0x60F6, 0xFCC9, 0x60F9, 0xE5A9, 0x60FA, 0xE0F6, 0x60FB, 0xF6B3, + 0x6101, 0xE1FE, 0x6106, 0xCBF0, 0x6108, 0xEAEF, 0x6109, 0xEAF0, + 0x610D, 0xDAC0, 0x610E, 0xF8B4, 0x610F, 0xEBF2, 0x6115, 0xE4C3, + 0x611A, 0xE9D7, 0x611B, 0xE4F1, 0x611F, 0xCAEF, 0x6127, 0xCED7, + 0x6130, 0xFCCA, 0x6134, 0xF3E1, 0x6137, 0xCBC4, 0x613C, 0xE3E5, + 0x613E, 0xCBC5, 0x613F, 0xEAB4, 0x6142, 0xE9BD, 0x6144, 0xD7C9, + 0x6147, 0xEBDB, 0x6148, 0xEDB1, 0x614A, 0xCCC3, 0x614B, 0xF7BE, + 0x614C, 0xFCCB, 0x6153, 0xF8F4, 0x6155, 0xD9B7, 0x6158, 0xF3D3, + 0x6159, 0xF3D4, 0x615D, 0xF7E4, 0x615F, 0xF7D1, 0x6162, 0xD8B7, + 0x6163, 0xCEB1, 0x6164, 0xCAC2, 0x6167, 0xFBB4, 0x6168, 0xCBC6, + 0x616B, 0xF0F6, 0x616E, 0xD5E7, 0x6170, 0xEAD0, 0x6176, 0xCCD4, + 0x6177, 0xCBAF, 0x617D, 0xF4AA, 0x617E, 0xE9AF, 0x6181, 0xF5C3, + 0x6182, 0xE9D8, 0x618A, 0xDDE9, 0x618E, 0xF1F3, 0x6190, 0xD5FB, + 0x6191, 0xDEBB, 0x6194, 0xF4FB, 0x6198, 0xFDF3, 0x6199, 0xFDF2, + 0x619A, 0xF7A6, 0x61A4, 0xDDC9, 0x61A7, 0xD4D3, 0x61A9, 0xCCA8, + 0x61AB, 0xDAC1, 0x61AC, 0xCCD5, 0x61AE, 0xD9E4, 0x61B2, 0xFACA, + 0x61B6, 0xE5E3, 0x61BA, 0xD3BC, 0x61BE, 0xCAF0, 0x61C3, 0xD0C4, + 0x61C7, 0xCAD0, 0x61C8, 0xFAAB, 0x61C9, 0xEBEB, 0x61CA, 0xE7F8, + 0x61CB, 0xD9E5, 0x61E6, 0xD1D7, 0x61F2, 0xF3A4, 0x61F6, 0xD4FB, + 0x61F7, 0xFCE3, 0x61F8, 0xFAD8, 0x61FA, 0xF3D5, 0x61FC, 0xCFAB, + 0x61FF, 0xEBF3, 0x6200, 0xD5FC, 0x6207, 0xD3D4, 0x6208, 0xCDFC, + 0x620A, 0xD9E6, 0x620C, 0xE2F9, 0x620D, 0xE2A1, 0x620E, 0xEBD4, + 0x6210, 0xE0F7, 0x6211, 0xE4B2, 0x6212, 0xCCFC, 0x6216, 0xFBE4, + 0x621A, 0xF4AB, 0x621F, 0xD0BD, 0x6221, 0xCAF1, 0x622A, 0xEFB8, + 0x622E, 0xD7C0, 0x6230, 0xEEFA, 0x6231, 0xFDF4, 0x6234, 0xD3E3, + 0x6236, 0xFBC2, 0x623E, 0xD5E8, 0x623F, 0xDBAE, 0x6240, 0xE1B6, + 0x6241, 0xF8B7, 0x6247, 0xE0BF, 0x6248, 0xFBC3, 0x6249, 0xDDEA, + 0x624B, 0xE2A2, 0x624D, 0xEEA6, 0x6253, 0xF6E8, 0x6258, 0xF6F5, + 0x626E, 0xDDCA, 0x6271, 0xD0E2, 0x6276, 0xDDA6, 0x6279, 0xDDEB, + 0x627C, 0xE4F9, 0x627F, 0xE3AF, 0x6280, 0xD0FC, 0x6284, 0xF4FC, + 0x6289, 0xCCBC, 0x628A, 0xF7EA, 0x6291, 0xE5E4, 0x6292, 0xDFF1, + 0x6295, 0xF7E1, 0x6297, 0xF9F7, 0x6298, 0xEFB9, 0x629B, 0xF8D8, + 0x62AB, 0xF9A9, 0x62B1, 0xF8D9, 0x62B5, 0xEEBD, 0x62B9, 0xD8C6, + 0x62BC, 0xE4E3, 0x62BD, 0xF5CE, 0x62C2, 0xDDD9, 0x62C7, 0xD9E7, + 0x62C8, 0xD2B9, 0x62C9, 0xD5C3, 0x62CC, 0xDAE5, 0x62CD, 0xDAD0, + 0x62CF, 0xD1D9, 0x62D0, 0xCED8, 0x62D2, 0xCBDE, 0x62D3, 0xF4AC, + 0x62D4, 0xDAFB, 0x62D6, 0xF6E9, 0x62D7, 0xE8F3, 0x62D8, 0xCFAC, + 0x62D9, 0xF0F0, 0x62DB, 0xF4FD, 0x62DC, 0xDBC8, 0x62EC, 0xCEC0, + 0x62ED, 0xE3D4, 0x62EE, 0xD1CF, 0x62EF, 0xF1F5, 0x62F1, 0xCDF2, + 0x62F3, 0xCFEB, 0x62F7, 0xCDB8, 0x62FE, 0xE3A6, 0x62FF, 0xD1DA, + 0x6301, 0xF2A5, 0x6307, 0xF2A6, 0x6309, 0xE4CE, 0x6311, 0xD3FB, + 0x632B, 0xF1A9, 0x632F, 0xF2C9, 0x633A, 0xEFD8, 0x633B, 0xE6C9, + 0x633D, 0xD8B8, 0x633E, 0xFAF3, 0x6349, 0xF3B5, 0x634C, 0xF8A4, + 0x634F, 0xD1F3, 0x6350, 0xE6C8, 0x6355, 0xF8DA, 0x6367, 0xDCE9, + 0x6368, 0xDED7, 0x636E, 0xCBDF, 0x6372, 0xCFEC, 0x6377, 0xF4DF, + 0x637A, 0xD1F4, 0x637B, 0xD2BA, 0x637F, 0xDFF2, 0x6383, 0xE1B7, + 0x6388, 0xE2A3, 0x6389, 0xD3FC, 0x638C, 0xEDE6, 0x6392, 0xDBC9, + 0x6396, 0xE4FA, 0x6398, 0xCFDE, 0x639B, 0xCED0, 0x63A0, 0xD5D3, + 0x63A1, 0xF3F5, 0x63A2, 0xF7AE, 0x63A5, 0xEFC8, 0x63A7, 0xCDF3, + 0x63A8, 0xF5CF, 0x63A9, 0xE5F3, 0x63AA, 0xF0C2, 0x63C0, 0xCAD1, + 0x63C4, 0xEAF1, 0x63C6, 0xD0A6, 0x63CF, 0xD9DA, 0x63D0, 0xF0AB, + 0x63D6, 0xEBE7, 0x63DA, 0xE5C0, 0x63DB, 0xFCB5, 0x63E1, 0xE4C4, + 0x63ED, 0xCCA9, 0x63EE, 0xFDC6, 0x63F4, 0xEAB5, 0x63F6, 0xE5AA, + 0x63F7, 0xDFBA, 0x640D, 0xE1DF, 0x640F, 0xDAD1, 0x6414, 0xE1B8, + 0x6416, 0xE8F4, 0x6417, 0xD3FD, 0x641C, 0xE2A4, 0x6422, 0xF2CA, + 0x642C, 0xDAE6, 0x642D, 0xF7B3, 0x643A, 0xFDCD, 0x643E, 0xF3B6, + 0x6458, 0xEED7, 0x6460, 0xF5C4, 0x6469, 0xD8A4, 0x646F, 0xF2A7, + 0x6478, 0xD9B8, 0x6479, 0xD9B9, 0x647A, 0xEFC9, 0x6488, 0xD6CE, + 0x6491, 0xF7CB, 0x6492, 0xDFAE, 0x6493, 0xE8F5, 0x649A, 0xD2B5, + 0x649E, 0xD3D5, 0x64A4, 0xF4CC, 0x64A5, 0xDAFC, 0x64AB, 0xD9E8, + 0x64AD, 0xF7EB, 0x64AE, 0xF5C9, 0x64B0, 0xF3BC, 0x64B2, 0xDAD2, + 0x64BB, 0xD3B5, 0x64C1, 0xE8B6, 0x64C4, 0xD6CF, 0x64C5, 0xF4BA, + 0x64C7, 0xF7C9, 0x64CA, 0xCCAA, 0x64CD, 0xF0C3, 0x64CE, 0xCCD6, + 0x64D2, 0xD0D3, 0x64D4, 0xD3BD, 0x64D8, 0xDBFB, 0x64DA, 0xCBE0, + 0x64E1, 0xD3E4, 0x64E2, 0xF6F7, 0x64E5, 0xD5BA, 0x64E6, 0xF3CD, + 0x64E7, 0xCBE1, 0x64EC, 0xEBF4, 0x64F2, 0xF4AD, 0x64F4, 0xFCAA, + 0x64FA, 0xF7EC, 0x64FE, 0xE8F6, 0x6500, 0xDAE7, 0x6504, 0xF7CC, + 0x6518, 0xE5C1, 0x651D, 0xE0EE, 0x6523, 0xD5FD, 0x652A, 0xCEE6, + 0x652B, 0xFCAB, 0x652C, 0xD5BB, 0x652F, 0xF2A8, 0x6536, 0xE2A5, + 0x6537, 0xCDB9, 0x6538, 0xEAF2, 0x6539, 0xCBC7, 0x653B, 0xCDF4, + 0x653E, 0xDBAF, 0x653F, 0xEFD9, 0x6545, 0xCDBA, 0x6548, 0xFCF9, + 0x654D, 0xDFF3, 0x654E, 0xCEE7, 0x654F, 0xDAC2, 0x6551, 0xCFAD, + 0x6556, 0xE7F9, 0x6557, 0xF8A8, 0x655E, 0xF3E2, 0x6562, 0xCAF2, + 0x6563, 0xDFA4, 0x6566, 0xD4C4, 0x656C, 0xCCD7, 0x656D, 0xE5C2, + 0x6572, 0xCDBB, 0x6574, 0xEFDA, 0x6575, 0xEED8, 0x6577, 0xDDA7, + 0x6578, 0xE2A6, 0x657E, 0xE0C0, 0x6582, 0xD6B0, 0x6583, 0xF8CA, + 0x6585, 0xFCFA, 0x6587, 0xD9FE, 0x658C, 0xDEB0, 0x6590, 0xDDEC, + 0x6591, 0xDAE8, 0x6597, 0xD4E0, 0x6599, 0xD6F9, 0x659B, 0xCDD7, + 0x659C, 0xDED8, 0x659F, 0xF2F8, 0x65A1, 0xE4D6, 0x65A4, 0xD0C5, + 0x65A5, 0xF4AE, 0x65A7, 0xDDA8, 0x65AB, 0xEDC5, 0x65AC, 0xF3D6, + 0x65AF, 0xDED9, 0x65B0, 0xE3E6, 0x65B7, 0xD3A8, 0x65B9, 0xDBB0, + 0x65BC, 0xE5DA, 0x65BD, 0xE3BF, 0x65C1, 0xDBB1, 0x65C5, 0xD5E9, + 0x65CB, 0xE0C1, 0x65CC, 0xEFDB, 0x65CF, 0xF0E9, 0x65D2, 0xD7B2, + 0x65D7, 0xD0FD, 0x65E0, 0xD9E9, 0x65E3, 0xD0FE, 0x65E5, 0xECED, + 0x65E6, 0xD3A9, 0x65E8, 0xF2A9, 0x65E9, 0xF0C4, 0x65EC, 0xE2E2, + 0x65ED, 0xE9EF, 0x65F1, 0xF9D1, 0x65F4, 0xE9D9, 0x65FA, 0xE8DA, + 0x65FB, 0xDAC3, 0x65FC, 0xDAC4, 0x65FD, 0xD4C5, 0x65FF, 0xE7FA, + 0x6606, 0xCDE0, 0x6607, 0xE3B0, 0x6609, 0xDBB2, 0x660A, 0xFBC4, + 0x660C, 0xF3E3, 0x660E, 0xD9A5, 0x660F, 0xFBE7, 0x6610, 0xDDCB, + 0x6611, 0xD0D4, 0x6613, 0xE6B6, 0x6614, 0xE0AE, 0x6615, 0xFDDA, + 0x661E, 0xDCB5, 0x661F, 0xE0F8, 0x6620, 0xE7B1, 0x6625, 0xF5F0, + 0x6627, 0xD8DC, 0x6628, 0xEDC6, 0x662D, 0xE1B9, 0x662F, 0xE3C0, + 0x6630, 0xF9C0, 0x6631, 0xE9F0, 0x6634, 0xD9DB, 0x6636, 0xF3E4, + 0x663A, 0xDCB6, 0x663B, 0xE4E9, 0x6641, 0xF0C5, 0x6642, 0xE3C1, + 0x6643, 0xFCCC, 0x6644, 0xFCCD, 0x6649, 0xF2CB, 0x664B, 0xF2CC, + 0x664F, 0xE4CF, 0x6659, 0xF1DB, 0x665B, 0xFAD9, 0x665D, 0xF1B8, + 0x665E, 0xFDF5, 0x665F, 0xE0F9, 0x6664, 0xE7FB, 0x6665, 0xFCB7, + 0x6666, 0xFCE4, 0x6667, 0xFBC5, 0x6668, 0xE3E7, 0x6669, 0xD8B9, + 0x666B, 0xF6F8, 0x666E, 0xDCC5, 0x666F, 0xCCD8, 0x6673, 0xE0AF, + 0x6674, 0xF4E7, 0x6676, 0xEFDC, 0x6677, 0xCFFC, 0x6678, 0xEFDD, + 0x667A, 0xF2AA, 0x6684, 0xFDBE, 0x6687, 0xCAAC, 0x6688, 0xFDBB, + 0x6689, 0xFDC7, 0x668E, 0xE7B2, 0x6690, 0xEAD1, 0x6691, 0xDFF4, + 0x6696, 0xD1EC, 0x6697, 0xE4DE, 0x6698, 0xE5C3, 0x669D, 0xD9A6, + 0x66A0, 0xCDBC, 0x66A2, 0xF3E5, 0x66AB, 0xEDD5, 0x66AE, 0xD9BA, + 0x66B2, 0xEDE7, 0x66B3, 0xFBB5, 0x66B4, 0xF8EC, 0x66B9, 0xE0E7, + 0x66BB, 0xCCD9, 0x66BE, 0xD4C6, 0x66C4, 0xE7A5, 0x66C6, 0xD5F5, + 0x66C7, 0xD3BE, 0x66C9, 0xFCFB, 0x66D6, 0xE4F2, 0x66D9, 0xDFF5, + 0x66DC, 0xE8F8, 0x66DD, 0xF8ED, 0x66E0, 0xCEC7, 0x66E6, 0xFDF6, + 0x66F0, 0xE8D8, 0x66F2, 0xCDD8, 0x66F3, 0xE7D6, 0x66F4, 0xCCDA, + 0x66F7, 0xCAE3, 0x66F8, 0xDFF6, 0x66F9, 0xF0C7, 0x66FA, 0xF0C6, + 0x66FC, 0xD8BA, 0x66FE, 0xF1F4, 0x66FF, 0xF4F0, 0x6700, 0xF5CC, + 0x6703, 0xFCE5, 0x6708, 0xEAC5, 0x6709, 0xEAF3, 0x670B, 0xDDDB, + 0x670D, 0xDCD7, 0x6714, 0xDEFD, 0x6715, 0xF2F9, 0x6717, 0xD5C7, + 0x671B, 0xD8D0, 0x671D, 0xF0C8, 0x671E, 0xD1A1, 0x671F, 0xD1A2, + 0x6726, 0xD9D4, 0x6727, 0xD6E8, 0x6728, 0xD9CA, 0x672A, 0xDAB1, + 0x672B, 0xD8C7, 0x672C, 0xDCE2, 0x672D, 0xF3CE, 0x672E, 0xF5F4, + 0x6731, 0xF1B9, 0x6734, 0xDAD3, 0x6736, 0xF6EA, 0x673A, 0xCFF5, + 0x673D, 0xFDAE, 0x6746, 0xCAD2, 0x6749, 0xDFB4, 0x674E, 0xD7DD, + 0x674F, 0xFABA, 0x6750, 0xEEA7, 0x6751, 0xF5BD, 0x6753, 0xF8F5, + 0x6756, 0xEDE8, 0x675C, 0xD4E1, 0x675E, 0xD1A3, 0x675F, 0xE1D6, + 0x676D, 0xF9F8, 0x676F, 0xDBCA, 0x6770, 0xCBF9, 0x6771, 0xD4D4, + 0x6773, 0xD9DC, 0x6775, 0xEEBE, 0x6777, 0xF7ED, 0x677B, 0xD2EE, + 0x677E, 0xE1E6, 0x677F, 0xF7F9, 0x6787, 0xDDED, 0x6789, 0xE8DB, + 0x678B, 0xDBB3, 0x678F, 0xD1F7, 0x6790, 0xE0B0, 0x6793, 0xD4E2, + 0x6795, 0xF6D7, 0x6797, 0xD7F9, 0x679A, 0xD8DD, 0x679C, 0xCDFD, + 0x679D, 0xF2AB, 0x67AF, 0xCDBD, 0x67B0, 0xF8C2, 0x67B3, 0xF2AC, + 0x67B6, 0xCAAD, 0x67B7, 0xCAAE, 0x67B8, 0xCFAE, 0x67BE, 0xE3C2, + 0x67C4, 0xDCB7, 0x67CF, 0xDBDA, 0x67D0, 0xD9BB, 0x67D1, 0xCAF3, + 0x67D2, 0xF6D3, 0x67D3, 0xE6F8, 0x67D4, 0xEAF5, 0x67DA, 0xEAF6, + 0x67DD, 0xF6F9, 0x67E9, 0xCFAF, 0x67EC, 0xCAD3, 0x67EF, 0xCAAF, + 0x67F0, 0xD2B0, 0x67F1, 0xF1BA, 0x67F3, 0xD7B3, 0x67F4, 0xE3C3, + 0x67F5, 0xF3FD, 0x67F6, 0xDEDA, 0x67FB, 0xDEDB, 0x67FE, 0xEFDE, + 0x6812, 0xE2E3, 0x6813, 0xEEFB, 0x6816, 0xDFF7, 0x6817, 0xD7CA, + 0x6821, 0xCEE8, 0x6822, 0xDBDB, 0x682A, 0xF1BB, 0x682F, 0xE9F1, + 0x6838, 0xFAB7, 0x6839, 0xD0C6, 0x683C, 0xCCAB, 0x683D, 0xEEA8, + 0x6840, 0xCBFA, 0x6841, 0xF9F9, 0x6842, 0xCCFD, 0x6843, 0xD3FE, + 0x6848, 0xE4D0, 0x684E, 0xF2EE, 0x6850, 0xD4D5, 0x6851, 0xDFCD, + 0x6853, 0xFCB8, 0x6854, 0xD1D0, 0x686D, 0xF2CD, 0x6876, 0xF7D2, + 0x687F, 0xCAD4, 0x6881, 0xD5D9, 0x6885, 0xD8DE, 0x688F, 0xCDD9, + 0x6893, 0xEEA9, 0x6894, 0xF6BC, 0x6897, 0xCCDB, 0x689D, 0xF0C9, + 0x689F, 0xFCFC, 0x68A1, 0xE8C9, 0x68A2, 0xF4FE, 0x68A7, 0xE7FC, + 0x68A8, 0xD7DE, 0x68AD, 0xDEDC, 0x68AF, 0xF0AC, 0x68B0, 0xCCFE, + 0x68B1, 0xCDE1, 0x68B3, 0xE1BA, 0x68B5, 0xDBEF, 0x68B6, 0xDAB2, + 0x68C4, 0xD1A5, 0x68C5, 0xDCB8, 0x68C9, 0xD8F6, 0x68CB, 0xD1A4, + 0x68CD, 0xCDE2, 0x68D2, 0xDCEA, 0x68D5, 0xF0F7, 0x68D7, 0xF0CA, + 0x68D8, 0xD0BE, 0x68DA, 0xDDDC, 0x68DF, 0xD4D6, 0x68E0, 0xD3D6, + 0x68E7, 0xEDD0, 0x68E8, 0xCDA1, 0x68EE, 0xDFB5, 0x68F2, 0xDFF8, + 0x68F9, 0xD4A1, 0x68FA, 0xCEB2, 0x6900, 0xE8CA, 0x6905, 0xEBF5, + 0x690D, 0xE3D5, 0x690E, 0xF5D0, 0x6912, 0xF5A1, 0x6927, 0xD9A7, + 0x6930, 0xE5AB, 0x693D, 0xE6CB, 0x693F, 0xF5F1, 0x694A, 0xE5C5, + 0x6953, 0xF9A3, 0x6954, 0xE0DB, 0x6955, 0xF6EB, 0x6957, 0xCBF1, + 0x6959, 0xD9EA, 0x695A, 0xF5A2, 0x695E, 0xD7D1, 0x6960, 0xD1F8, + 0x6961, 0xEAF8, 0x6962, 0xEAF9, 0x6963, 0xDAB3, 0x6968, 0xEFDF, + 0x696B, 0xF1EF, 0x696D, 0xE5F6, 0x696E, 0xEEBF, 0x696F, 0xE2E4, + 0x6975, 0xD0BF, 0x6977, 0xFAAC, 0x6978, 0xF5D1, 0x6979, 0xE7B3, + 0x6995, 0xE9BE, 0x699B, 0xF2CE, 0x699C, 0xDBB4, 0x69A5, 0xFCCE, + 0x69A7, 0xDDEE, 0x69AE, 0xE7B4, 0x69B4, 0xD7B4, 0x69BB, 0xF7B4, + 0x69C1, 0xCDBE, 0x69C3, 0xDAE9, 0x69CB, 0xCFB0, 0x69CC, 0xF7D9, + 0x69CD, 0xF3E6, 0x69D0, 0xCED9, 0x69E8, 0xCEAA, 0x69EA, 0xCBC8, + 0x69FB, 0xD0A7, 0x69FD, 0xF0CB, 0x69FF, 0xD0C7, 0x6A02, 0xE4C5, + 0x6A0A, 0xDBE0, 0x6A11, 0xD5DA, 0x6A13, 0xD7A7, 0x6A17, 0xEEC0, + 0x6A19, 0xF8F6, 0x6A1E, 0xF5D2, 0x6A1F, 0xEDE9, 0x6A21, 0xD9BC, + 0x6A23, 0xE5C6, 0x6A35, 0xF5A3, 0x6A38, 0xDAD4, 0x6A39, 0xE2A7, + 0x6A3A, 0xFBFC, 0x6A3D, 0xF1DC, 0x6A44, 0xCAF4, 0x6A48, 0xE8FA, + 0x6A4B, 0xCEE9, 0x6A52, 0xE9F8, 0x6A53, 0xE2E5, 0x6A58, 0xD0B9, + 0x6A59, 0xD4F2, 0x6A5F, 0xD1A6, 0x6A61, 0xDFCE, 0x6A6B, 0xFCF4, + 0x6A80, 0xD3AA, 0x6A84, 0xCCAC, 0x6A89, 0xEFE0, 0x6A8D, 0xE5E5, + 0x6A8E, 0xD0D5, 0x6A97, 0xDBFC, 0x6A9C, 0xFCE6, 0x6AA2, 0xCBFE, + 0x6AA3, 0xEDEA, 0x6AB3, 0xDEB1, 0x6ABB, 0xF9E3, 0x6AC2, 0xD4A2, + 0x6AC3, 0xCFF6, 0x6AD3, 0xD6D0, 0x6ADA, 0xD5EA, 0x6ADB, 0xF1EE, + 0x6AF6, 0xFACB, 0x6AFB, 0xE5A1, 0x6B04, 0xD5B1, 0x6B0A, 0xCFED, + 0x6B0C, 0xEDEB, 0x6B12, 0xD5B2, 0x6B16, 0xD5BC, 0x6B20, 0xFDE2, + 0x6B21, 0xF3AD, 0x6B23, 0xFDDB, 0x6B32, 0xE9B0, 0x6B3A, 0xD1A7, + 0x6B3D, 0xFDE3, 0x6B3E, 0xCEB3, 0x6B46, 0xFDE4, 0x6B47, 0xFACE, + 0x6B4C, 0xCAB0, 0x6B4E, 0xF7A7, 0x6B50, 0xCFB1, 0x6B5F, 0xE6A2, + 0x6B61, 0xFCB6, 0x6B62, 0xF2AD, 0x6B63, 0xEFE1, 0x6B64, 0xF3AE, + 0x6B65, 0xDCC6, 0x6B66, 0xD9EB, 0x6B6A, 0xE8E0, 0x6B72, 0xE1A8, + 0x6B77, 0xD5F6, 0x6B78, 0xCFFD, 0x6B7B, 0xDEDD, 0x6B7F, 0xD9D1, + 0x6B83, 0xE4EA, 0x6B84, 0xF2CF, 0x6B86, 0xF7BF, 0x6B89, 0xE2E6, + 0x6B8A, 0xE2A8, 0x6B96, 0xE3D6, 0x6B98, 0xEDD1, 0x6B9E, 0xE9F9, + 0x6BAE, 0xD6B1, 0x6BAF, 0xDEB2, 0x6BB2, 0xE0E8, 0x6BB5, 0xD3AB, + 0x6BB7, 0xEBDC, 0x6BBA, 0xDFAF, 0x6BBC, 0xCAC3, 0x6BBF, 0xEEFC, + 0x6BC1, 0xFDC3, 0x6BC5, 0xEBF6, 0x6BC6, 0xCFB2, 0x6BCB, 0xD9EC, + 0x6BCD, 0xD9BD, 0x6BCF, 0xD8DF, 0x6BD2, 0xD4B8, 0x6BD3, 0xEBBE, + 0x6BD4, 0xDDEF, 0x6BD6, 0xDDF0, 0x6BD7, 0xDDF1, 0x6BD8, 0xDDF2, + 0x6BDB, 0xD9BE, 0x6BEB, 0xFBC6, 0x6BEC, 0xCFB3, 0x6C08, 0xEEFD, + 0x6C0F, 0xE4AB, 0x6C11, 0xDAC5, 0x6C13, 0xD8EC, 0x6C23, 0xD1A8, + 0x6C34, 0xE2A9, 0x6C37, 0xDEBC, 0x6C38, 0xE7B5, 0x6C3E, 0xDBF0, + 0x6C40, 0xEFE2, 0x6C41, 0xF1F0, 0x6C42, 0xCFB4, 0x6C4E, 0xDBF1, + 0x6C50, 0xE0B1, 0x6C55, 0xDFA5, 0x6C57, 0xF9D2, 0x6C5A, 0xE7FD, + 0x6C5D, 0xE6A3, 0x6C5E, 0xFBF1, 0x6C5F, 0xCBB0, 0x6C60, 0xF2AE, + 0x6C68, 0xCDE7, 0x6C6A, 0xE8DC, 0x6C6D, 0xE7D7, 0x6C70, 0xF7C0, + 0x6C72, 0xD0E3, 0x6C76, 0xDAA1, 0x6C7A, 0xCCBD, 0x6C7D, 0xD1A9, + 0x6C7E, 0xDDCC, 0x6C81, 0xE3FE, 0x6C82, 0xD1AA, 0x6C83, 0xE8AA, + 0x6C85, 0xEAB6, 0x6C86, 0xF9FA, 0x6C87, 0xE6CC, 0x6C88, 0xF6D8, + 0x6C8C, 0xD4C7, 0x6C90, 0xD9CB, 0x6C92, 0xD9D2, 0x6C93, 0xD3CB, + 0x6C94, 0xD8F7, 0x6C95, 0xDAA9, 0x6C96, 0xF5F8, 0x6C99, 0xDEDE, + 0x6C9A, 0xF2AF, 0x6C9B, 0xF8A9, 0x6CAB, 0xD8C8, 0x6CAE, 0xEEC1, + 0x6CB3, 0xF9C1, 0x6CB8, 0xDDF3, 0x6CB9, 0xEAFA, 0x6CBB, 0xF6BD, + 0x6CBC, 0xE1BB, 0x6CBD, 0xCDBF, 0x6CBE, 0xF4D4, 0x6CBF, 0xE6CD, + 0x6CC1, 0xFCCF, 0x6CC2, 0xFBA2, 0x6CC4, 0xE0DC, 0x6CC9, 0xF4BB, + 0x6CCA, 0xDAD5, 0x6CCC, 0xF9B2, 0x6CD3, 0xFBF2, 0x6CD5, 0xDBF6, + 0x6CD7, 0xDEDF, 0x6CDB, 0xDBF2, 0x6CE1, 0xF8DC, 0x6CE2, 0xF7EE, + 0x6CE3, 0xEBE8, 0x6CE5, 0xD2FA, 0x6CE8, 0xF1BC, 0x6CEB, 0xFADA, + 0x6CEE, 0xDAEA, 0x6CEF, 0xDAC6, 0x6CF0, 0xF7C1, 0x6CF3, 0xE7B6, + 0x6D0B, 0xE5C7, 0x6D0C, 0xD6AC, 0x6D11, 0xDCC7, 0x6D17, 0xE1A9, + 0x6D19, 0xE2AA, 0x6D1B, 0xD5A6, 0x6D1E, 0xD4D7, 0x6D25, 0xF2D0, + 0x6D27, 0xEAFB, 0x6D29, 0xE0DD, 0x6D2A, 0xFBF3, 0x6D32, 0xF1BD, + 0x6D35, 0xE2E7, 0x6D36, 0xFDD7, 0x6D38, 0xCEC8, 0x6D39, 0xEAB7, + 0x6D3B, 0xFCC0, 0x6D3D, 0xFDE7, 0x6D3E, 0xF7EF, 0x6D41, 0xD7B5, + 0x6D59, 0xEFBA, 0x6D5A, 0xF1DD, 0x6D5C, 0xDEB3, 0x6D63, 0xE8CB, + 0x6D66, 0xF8DD, 0x6D69, 0xFBC7, 0x6D6A, 0xD5C8, 0x6D6C, 0xD7DF, + 0x6D6E, 0xDDA9, 0x6D74, 0xE9B1, 0x6D77, 0xFAAD, 0x6D78, 0xF6D9, + 0x6D79, 0xFAF4, 0x6D7F, 0xF8AA, 0x6D85, 0xE6EE, 0x6D87, 0xCCDC, + 0x6D88, 0xE1BC, 0x6D89, 0xE0EF, 0x6D8C, 0xE9BF, 0x6D8D, 0xFCFD, + 0x6D8E, 0xE6CE, 0x6D91, 0xE1D7, 0x6D93, 0xE6CF, 0x6D95, 0xF4F1, + 0x6DAF, 0xE4F3, 0x6DB2, 0xE4FB, 0x6DB5, 0xF9E4, 0x6DC0, 0xEFE3, + 0x6DC3, 0xCFEE, 0x6DC4, 0xF6BE, 0x6DC5, 0xE0B2, 0x6DC6, 0xFCFE, + 0x6DC7, 0xD1AB, 0x6DCB, 0xD7FA, 0x6DCF, 0xFBC8, 0x6DD1, 0xE2D7, + 0x6DD8, 0xD4A3, 0x6DD9, 0xF0F8, 0x6DDA, 0xD7A8, 0x6DDE, 0xE1E7, + 0x6DE1, 0xD3BF, 0x6DE8, 0xEFE4, 0x6DEA, 0xD7C5, 0x6DEB, 0xEBE2, + 0x6DEE, 0xFCE7, 0x6DF1, 0xE4A2, 0x6DF3, 0xE2E8, 0x6DF5, 0xE6D0, + 0x6DF7, 0xFBE8, 0x6DF8, 0xF4E8, 0x6DF9, 0xE5F4, 0x6DFA, 0xF4BC, + 0x6DFB, 0xF4D5, 0x6E17, 0xDFB6, 0x6E19, 0xFCB9, 0x6E1A, 0xEEC2, + 0x6E1B, 0xCAF5, 0x6E1F, 0xEFE5, 0x6E20, 0xCBE2, 0x6E21, 0xD4A4, + 0x6E23, 0xDEE0, 0x6E24, 0xDAFD, 0x6E25, 0xE4C6, 0x6E26, 0xE8BE, + 0x6E2B, 0xE0DE, 0x6E2C, 0xF6B4, 0x6E2D, 0xEAD2, 0x6E2F, 0xF9FB, + 0x6E32, 0xE0C2, 0x6E34, 0xCAE4, 0x6E36, 0xE7B7, 0x6E38, 0xEAFD, + 0x6E3A, 0xD9DD, 0x6E3C, 0xDAB4, 0x6E3D, 0xEEAA, 0x6E3E, 0xFBE9, + 0x6E43, 0xDBCB, 0x6E44, 0xDAB5, 0x6E4A, 0xF1BE, 0x6E4D, 0xD3AC, + 0x6E56, 0xFBC9, 0x6E58, 0xDFCF, 0x6E5B, 0xD3C0, 0x6E5C, 0xE3D7, + 0x6E5E, 0xEFE6, 0x6E5F, 0xFCD0, 0x6E67, 0xE9C0, 0x6E6B, 0xF5D3, + 0x6E6E, 0xECDC, 0x6E6F, 0xF7B7, 0x6E72, 0xEAB8, 0x6E73, 0xD1F9, + 0x6E7A, 0xDCC8, 0x6E90, 0xEAB9, 0x6E96, 0xF1DE, 0x6E9C, 0xD7B6, + 0x6E9D, 0xCFB5, 0x6E9F, 0xD9A8, 0x6EA2, 0xECEE, 0x6EA5, 0xDDAA, + 0x6EAA, 0xCDA2, 0x6EAB, 0xE8AE, 0x6EAF, 0xE1BD, 0x6EB1, 0xF2D1, + 0x6EB6, 0xE9C1, 0x6EBA, 0xD2FC, 0x6EC2, 0xDBB5, 0x6EC4, 0xF3E7, + 0x6EC5, 0xD8FE, 0x6EC9, 0xFCD1, 0x6ECB, 0xEDB2, 0x6ECC, 0xF4AF, + 0x6ECE, 0xFBA3, 0x6ED1, 0xFCC1, 0x6ED3, 0xEEAB, 0x6ED4, 0xD4A5, + 0x6EEF, 0xF4F2, 0x6EF4, 0xEED9, 0x6EF8, 0xFBCA, 0x6EFE, 0xCDE3, + 0x6EFF, 0xD8BB, 0x6F01, 0xE5DB, 0x6F02, 0xF8F7, 0x6F06, 0xF6D4, + 0x6F0F, 0xD7A9, 0x6F11, 0xCBC9, 0x6F14, 0xE6D1, 0x6F15, 0xF0CC, + 0x6F20, 0xD8AE, 0x6F22, 0xF9D3, 0x6F23, 0xD5FE, 0x6F2B, 0xD8BC, + 0x6F2C, 0xF2B0, 0x6F31, 0xE2AB, 0x6F32, 0xF3E8, 0x6F38, 0xEFC2, + 0x6F3F, 0xEDEC, 0x6F41, 0xE7B8, 0x6F51, 0xDAFE, 0x6F54, 0xCCBE, + 0x6F57, 0xF2FC, 0x6F58, 0xDAEB, 0x6F5A, 0xE2D8, 0x6F5B, 0xEDD6, + 0x6F5E, 0xD6D1, 0x6F5F, 0xE0B3, 0x6F62, 0xFCD2, 0x6F64, 0xEBC8, + 0x6F6D, 0xD3C1, 0x6F6E, 0xF0CD, 0x6F70, 0xCFF7, 0x6F7A, 0xEDD2, + 0x6F7C, 0xD4D8, 0x6F7D, 0xDCC9, 0x6F7E, 0xD7F1, 0x6F81, 0xDFBB, + 0x6F84, 0xF3A5, 0x6F88, 0xF4CD, 0x6F8D, 0xF1BF, 0x6F8E, 0xF8B1, + 0x6F90, 0xE9FA, 0x6F94, 0xFBCB, 0x6F97, 0xCAD5, 0x6FA3, 0xF9D4, + 0x6FA4, 0xF7CA, 0x6FA7, 0xD6C8, 0x6FAE, 0xFCE8, 0x6FAF, 0xF3BD, + 0x6FB1, 0xEEFE, 0x6FB3, 0xE7FE, 0x6FB9, 0xD3C2, 0x6FBE, 0xD3B6, + 0x6FC0, 0xCCAD, 0x6FC1, 0xF6FA, 0x6FC2, 0xD6B2, 0x6FC3, 0xD2D8, + 0x6FCA, 0xE7D8, 0x6FD5, 0xE3A5, 0x6FDA, 0xE7B9, 0x6FDF, 0xF0AD, + 0x6FE0, 0xFBCC, 0x6FE1, 0xEBA1, 0x6FE4, 0xD4A6, 0x6FE9, 0xFBCD, + 0x6FEB, 0xD5BD, 0x6FEC, 0xF1DF, 0x6FEF, 0xF6FB, 0x6FF1, 0xDEB4, + 0x6FFE, 0xD5EB, 0x7001, 0xE5C8, 0x7005, 0xFBA4, 0x7006, 0xD4B9, + 0x7009, 0xDEE1, 0x700B, 0xE4A3, 0x700F, 0xD7B7, 0x7011, 0xF8EE, + 0x7015, 0xDEB5, 0x7018, 0xD6D2, 0x701A, 0xF9D5, 0x701B, 0xE7BA, + 0x701C, 0xEBD5, 0x701D, 0xD5F7, 0x701E, 0xEFE7, 0x701F, 0xE1BE, + 0x7023, 0xFAAE, 0x7027, 0xD6E9, 0x7028, 0xD6EE, 0x702F, 0xE7BB, + 0x7037, 0xECCB, 0x703E, 0xD5B3, 0x704C, 0xCEB4, 0x7050, 0xFBA5, + 0x7051, 0xE1EE, 0x7058, 0xF7A8, 0x705D, 0xFBCE, 0x7063, 0xD8BD, + 0x706B, 0xFBFD, 0x7070, 0xFCE9, 0x7078, 0xCFB6, 0x707C, 0xEDC7, + 0x707D, 0xEEAC, 0x7085, 0xCCDD, 0x708A, 0xF6A7, 0x708E, 0xE6FA, + 0x7092, 0xF5A4, 0x7098, 0xFDDC, 0x7099, 0xEDB3, 0x709A, 0xCEC9, + 0x70A1, 0xEFE8, 0x70A4, 0xE1BF, 0x70AB, 0xFADB, 0x70AC, 0xCBE3, + 0x70AD, 0xF7A9, 0x70AF, 0xFBA6, 0x70B3, 0xDCB9, 0x70B7, 0xF1C0, + 0x70B8, 0xEDC8, 0x70B9, 0xEFC3, 0x70C8, 0xD6AD, 0x70CB, 0xFDCE, + 0x70CF, 0xE8A1, 0x70D8, 0xFBF4, 0x70D9, 0xD5A7, 0x70DD, 0xF1F6, + 0x70DF, 0xE6D3, 0x70F1, 0xCCDE, 0x70F9, 0xF8B2, 0x70FD, 0xDCEB, + 0x7104, 0xFDB6, 0x7109, 0xE5EA, 0x710C, 0xF1E0, 0x7119, 0xDBCC, + 0x711A, 0xDDCD, 0x711E, 0xD4C8, 0x7121, 0xD9ED, 0x7126, 0xF5A5, + 0x7130, 0xE6FB, 0x7136, 0xE6D4, 0x7147, 0xFDC8, 0x7149, 0xD6A1, + 0x714A, 0xFDBF, 0x714C, 0xFCD3, 0x714E, 0xEFA1, 0x7150, 0xE7BC, + 0x7156, 0xD1EE, 0x7159, 0xE6D5, 0x715C, 0xE9F2, 0x715E, 0xDFB0, + 0x7164, 0xD8E0, 0x7165, 0xFCBA, 0x7166, 0xFDAF, 0x7167, 0xF0CE, + 0x7169, 0xDBE1, 0x716C, 0xE5C9, 0x716E, 0xEDB4, 0x717D, 0xE0C3, + 0x7184, 0xE3D8, 0x7189, 0xE9FB, 0x718A, 0xEAA8, 0x718F, 0xFDB7, + 0x7192, 0xFBA7, 0x7194, 0xE9C2, 0x7199, 0xFDF7, 0x719F, 0xE2D9, + 0x71A2, 0xDCEC, 0x71AC, 0xE8A2, 0x71B1, 0xE6F0, 0x71B9, 0xFDF8, + 0x71BA, 0xFDF9, 0x71BE, 0xF6BF, 0x71C1, 0xE7A7, 0x71C3, 0xE6D7, + 0x71C8, 0xD4F3, 0x71C9, 0xD4C9, 0x71CE, 0xD6FA, 0x71D0, 0xD7F2, + 0x71D2, 0xE1C0, 0x71D4, 0xDBE2, 0x71D5, 0xE6D8, 0x71DF, 0xE7BD, + 0x71E5, 0xF0CF, 0x71E6, 0xF3BE, 0x71E7, 0xE2AC, 0x71ED, 0xF5B7, + 0x71EE, 0xE0F0, 0x71FB, 0xFDB8, 0x71FC, 0xE3E8, 0x71FE, 0xD4A7, + 0x71FF, 0xE8FC, 0x7200, 0xFAD2, 0x7206, 0xF8EF, 0x7210, 0xD6D3, + 0x721B, 0xD5B4, 0x722A, 0xF0D0, 0x722C, 0xF7F0, 0x722D, 0xEEB3, + 0x7230, 0xEABA, 0x7232, 0xEAD3, 0x7235, 0xEDC9, 0x7236, 0xDDAB, + 0x723A, 0xE5AC, 0x723B, 0xFDA1, 0x723D, 0xDFD0, 0x723E, 0xECB3, + 0x7240, 0xDFD1, 0x7246, 0xEDED, 0x7247, 0xF8B8, 0x7248, 0xF7FA, + 0x724C, 0xF8AB, 0x7252, 0xF4E0, 0x7258, 0xD4BA, 0x7259, 0xE4B3, + 0x725B, 0xE9DA, 0x725D, 0xDEB6, 0x725F, 0xD9BF, 0x7261, 0xD9C0, + 0x7262, 0xD6EF, 0x7267, 0xD9CC, 0x7269, 0xDAAA, 0x7272, 0xDFE5, + 0x7279, 0xF7E5, 0x727D, 0xCCB2, 0x7280, 0xDFF9, 0x7281, 0xD7E0, + 0x72A2, 0xD4BB, 0x72A7, 0xFDFA, 0x72AC, 0xCCB3, 0x72AF, 0xDBF3, + 0x72C0, 0xDFD2, 0x72C2, 0xCECA, 0x72C4, 0xEEDA, 0x72CE, 0xE4E4, + 0x72D0, 0xFBCF, 0x72D7, 0xCFB7, 0x72D9, 0xEEC3, 0x72E1, 0xCEEA, + 0x72E9, 0xE2AD, 0x72F8, 0xD7E1, 0x72F9, 0xFAF5, 0x72FC, 0xD5C9, + 0x72FD, 0xF8AC, 0x730A, 0xE7D9, 0x7316, 0xF3E9, 0x731B, 0xD8ED, + 0x731C, 0xE3C4, 0x731D, 0xF0F1, 0x7325, 0xE8E5, 0x7329, 0xE0FA, + 0x732A, 0xEEC4, 0x732B, 0xD9DE, 0x7336, 0xEBA2, 0x7337, 0xEBA3, + 0x733E, 0xFCC2, 0x733F, 0xEABB, 0x7344, 0xE8AB, 0x7345, 0xDEE2, + 0x7350, 0xEDEF, 0x7352, 0xE8A3, 0x7357, 0xCFF1, 0x7368, 0xD4BC, + 0x736A, 0xFCEA, 0x7370, 0xE7BE, 0x7372, 0xFCF2, 0x7375, 0xD6B4, + 0x7378, 0xE2AE, 0x737A, 0xD3B7, 0x737B, 0xFACC, 0x7384, 0xFADC, + 0x7386, 0xEDB5, 0x7387, 0xE1E3, 0x7389, 0xE8AC, 0x738B, 0xE8DD, + 0x738E, 0xEFE9, 0x7394, 0xF4BD, 0x7396, 0xCFB8, 0x7397, 0xE9DB, + 0x7398, 0xD1AC, 0x739F, 0xDAC7, 0x73A7, 0xEBC9, 0x73A9, 0xE8CC, + 0x73AD, 0xDEB7, 0x73B2, 0xD6BC, 0x73B3, 0xD3E5, 0x73B9, 0xFADD, + 0x73C0, 0xDAD6, 0x73C2, 0xCAB1, 0x73C9, 0xDAC8, 0x73CA, 0xDFA6, + 0x73CC, 0xF9B3, 0x73CD, 0xF2D2, 0x73CF, 0xCAC4, 0x73D6, 0xCECB, + 0x73D9, 0xCDF5, 0x73DD, 0xFDB0, 0x73DE, 0xD5A8, 0x73E0, 0xF1C1, + 0x73E3, 0xE2E9, 0x73E4, 0xDCCA, 0x73E5, 0xECB4, 0x73E6, 0xFAC0, + 0x73E9, 0xFBA8, 0x73EA, 0xD0A8, 0x73ED, 0xDAEC, 0x73F7, 0xD9EE, + 0x73F9, 0xE0FB, 0x73FD, 0xEFEA, 0x73FE, 0xFADE, 0x7401, 0xE0C4, + 0x7403, 0xCFB9, 0x7405, 0xD5CA, 0x7406, 0xD7E2, 0x7407, 0xE2AF, + 0x7409, 0xD7B8, 0x7413, 0xE8CD, 0x741B, 0xF6DA, 0x7420, 0xEFA2, + 0x7421, 0xE2DA, 0x7422, 0xF6FC, 0x7425, 0xFBD0, 0x7426, 0xD1AD, + 0x7428, 0xCDE4, 0x742A, 0xD1AE, 0x742B, 0xDCED, 0x742C, 0xE8CE, + 0x742E, 0xF0F9, 0x742F, 0xCEB5, 0x7430, 0xE6FC, 0x7433, 0xD7FB, + 0x7434, 0xD0D6, 0x7435, 0xDDF5, 0x7436, 0xF7F1, 0x7438, 0xF6FD, + 0x743A, 0xDBF7, 0x743F, 0xFBEA, 0x7440, 0xE9DC, 0x7441, 0xD9C1, + 0x7443, 0xF5F2, 0x7444, 0xE0C5, 0x744B, 0xEAD4, 0x7455, 0xF9C2, + 0x7457, 0xEABC, 0x7459, 0xD2C5, 0x745A, 0xFBD1, 0x745B, 0xE7C0, + 0x745C, 0xEBA5, 0x745E, 0xDFFA, 0x745F, 0xE3A2, 0x7460, 0xD7B9, + 0x7462, 0xE9C3, 0x7464, 0xE8FD, 0x7465, 0xE8AF, 0x7468, 0xF2D3, + 0x7469, 0xFBA9, 0x746A, 0xD8A5, 0x746F, 0xD5CB, 0x747E, 0xD0C8, + 0x7482, 0xD1AF, 0x7483, 0xD7E3, 0x7487, 0xE0C6, 0x7489, 0xD6A2, + 0x748B, 0xEDF0, 0x7498, 0xD7F3, 0x749C, 0xFCD4, 0x749E, 0xDAD7, + 0x749F, 0xCCDF, 0x74A1, 0xF2D4, 0x74A3, 0xD1B0, 0x74A5, 0xCCE0, + 0x74A7, 0xDBFD, 0x74A8, 0xF3BF, 0x74AA, 0xF0D1, 0x74B0, 0xFCBB, + 0x74B2, 0xE2B0, 0x74B5, 0xE6A5, 0x74B9, 0xE2DB, 0x74BD, 0xDFDE, + 0x74BF, 0xE0C7, 0x74C6, 0xF2EF, 0x74CA, 0xCCE1, 0x74CF, 0xD6EA, + 0x74D4, 0xE7C2, 0x74D8, 0xCEB6, 0x74DA, 0xF3C0, 0x74DC, 0xCDFE, + 0x74E0, 0xFBD2, 0x74E2, 0xF8F8, 0x74E3, 0xF7FB, 0x74E6, 0xE8BF, + 0x74EE, 0xE8B7, 0x74F7, 0xEDB6, 0x7501, 0xDCBA, 0x7504, 0xCCB4, + 0x7511, 0xF1F7, 0x7515, 0xE8B8, 0x7518, 0xCAF6, 0x751A, 0xE4A4, + 0x751B, 0xF4D6, 0x751F, 0xDFE6, 0x7523, 0xDFA7, 0x7525, 0xDFE7, + 0x7526, 0xE1C1, 0x7528, 0xE9C4, 0x752B, 0xDCCB, 0x752C, 0xE9C5, + 0x7530, 0xEFA3, 0x7531, 0xEBA6, 0x7532, 0xCBA3, 0x7533, 0xE3E9, + 0x7537, 0xD1FB, 0x7538, 0xEFA4, 0x753A, 0xEFEB, 0x7547, 0xD0B4, + 0x754C, 0xCDA3, 0x754F, 0xE8E6, 0x7551, 0xEFA5, 0x7553, 0xD3CC, + 0x7554, 0xDAED, 0x7559, 0xD7BA, 0x755B, 0xF2D5, 0x755C, 0xF5E5, + 0x755D, 0xD9EF, 0x7562, 0xF9B4, 0x7565, 0xD5D4, 0x7566, 0xFDCF, + 0x756A, 0xDBE3, 0x756F, 0xF1E1, 0x7570, 0xECB6, 0x7575, 0xFBFE, + 0x7576, 0xD3D7, 0x7578, 0xD1B1, 0x757A, 0xCBB1, 0x757F, 0xD1B2, + 0x7586, 0xCBB2, 0x7587, 0xF1C2, 0x758A, 0xF4E1, 0x758B, 0xF9B5, + 0x758E, 0xE1C3, 0x758F, 0xE1C2, 0x7591, 0xEBF7, 0x759D, 0xDFA8, + 0x75A5, 0xCBCA, 0x75AB, 0xE6B9, 0x75B1, 0xF8DE, 0x75B2, 0xF9AA, + 0x75B3, 0xCAF7, 0x75B5, 0xEDB7, 0x75B8, 0xD3B8, 0x75B9, 0xF2D6, + 0x75BC, 0xD4D9, 0x75BD, 0xEEC5, 0x75BE, 0xF2F0, 0x75C2, 0xCAB2, + 0x75C5, 0xDCBB, 0x75C7, 0xF1F8, 0x75CD, 0xECB7, 0x75D2, 0xE5CA, + 0x75D4, 0xF6C0, 0x75D5, 0xFDDD, 0x75D8, 0xD4E3, 0x75D9, 0xCCE2, + 0x75DB, 0xF7D4, 0x75E2, 0xD7E5, 0x75F0, 0xD3C3, 0x75F2, 0xD8A6, + 0x75F4, 0xF6C1, 0x75FA, 0xDDF6, 0x75FC, 0xCDC0, 0x7600, 0xE5DC, + 0x760D, 0xE5CB, 0x7619, 0xE1C4, 0x761F, 0xE8B0, 0x7620, 0xF4B0, + 0x7621, 0xF3EA, 0x7622, 0xDAEE, 0x7624, 0xD7BB, 0x7626, 0xE2B1, + 0x763B, 0xD7AA, 0x7642, 0xD6FB, 0x764C, 0xE4DF, 0x764E, 0xCAD6, + 0x7652, 0xEBA8, 0x7656, 0xDBFE, 0x7661, 0xF6C2, 0x7664, 0xEFBB, + 0x7669, 0xD4FD, 0x766C, 0xE0C8, 0x7670, 0xE8B9, 0x7672, 0xEFA6, + 0x7678, 0xCDA4, 0x767B, 0xD4F4, 0x767C, 0xDBA1, 0x767D, 0xDBDC, + 0x767E, 0xDBDD, 0x7684, 0xEEDC, 0x7686, 0xCBCB, 0x7687, 0xFCD5, + 0x768E, 0xCEEB, 0x7690, 0xCDC1, 0x7693, 0xFBD3, 0x76AE, 0xF9AB, + 0x76BA, 0xF5D4, 0x76BF, 0xD9A9, 0x76C2, 0xE9DD, 0x76C3, 0xDBCD, + 0x76C6, 0xDDCE, 0x76C8, 0xE7C3, 0x76CA, 0xECCC, 0x76D2, 0xF9EC, + 0x76D6, 0xCBCC, 0x76DB, 0xE0FC, 0x76DC, 0xD4A8, 0x76DE, 0xEDD3, + 0x76DF, 0xD8EF, 0x76E1, 0xF2D7, 0x76E3, 0xCAF8, 0x76E4, 0xDAEF, + 0x76E7, 0xD6D4, 0x76EE, 0xD9CD, 0x76F2, 0xD8EE, 0x76F4, 0xF2C1, + 0x76F8, 0xDFD3, 0x76FC, 0xDAF0, 0x76FE, 0xE2EA, 0x7701, 0xE0FD, + 0x7704, 0xD8F8, 0x7708, 0xF7AF, 0x7709, 0xDAB6, 0x770B, 0xCAD7, + 0x771E, 0xF2D8, 0x7720, 0xD8F9, 0x7729, 0xFADF, 0x7737, 0xCFEF, + 0x7738, 0xD9C2, 0x773A, 0xF0D2, 0x773C, 0xE4D1, 0x7740, 0xF3B7, + 0x774D, 0xFAE0, 0x775B, 0xEFEC, 0x7761, 0xE2B2, 0x7763, 0xD4BD, + 0x7766, 0xD9CE, 0x776B, 0xF4E2, 0x7779, 0xD4A9, 0x777E, 0xCDC2, + 0x777F, 0xE7DA, 0x778B, 0xF2D9, 0x7791, 0xD9AA, 0x779E, 0xD8BE, + 0x77A5, 0xDCAD, 0x77AC, 0xE2EB, 0x77AD, 0xD6FC, 0x77B0, 0xCAF9, + 0x77B3, 0xD4DA, 0x77BB, 0xF4D7, 0x77BC, 0xCCA1, 0x77BF, 0xCFBA, + 0x77D7, 0xF5B8, 0x77DB, 0xD9C3, 0x77DC, 0xD0E8, 0x77E2, 0xE3C5, + 0x77E3, 0xEBF8, 0x77E5, 0xF2B1, 0x77E9, 0xCFBB, 0x77ED, 0xD3AD, + 0x77EE, 0xE8E1, 0x77EF, 0xCEEC, 0x77F3, 0xE0B4, 0x7802, 0xDEE3, + 0x7812, 0xDDF7, 0x7825, 0xF2B2, 0x7826, 0xF3F6, 0x7827, 0xF6DB, + 0x782C, 0xD7FE, 0x7832, 0xF8DF, 0x7834, 0xF7F2, 0x7845, 0xD0A9, + 0x784F, 0xE6DA, 0x785D, 0xF5A6, 0x786B, 0xD7BC, 0x786C, 0xCCE3, + 0x786F, 0xE6DB, 0x787C, 0xDDDD, 0x7881, 0xD1B3, 0x7887, 0xEFED, + 0x788C, 0xD6DE, 0x788D, 0xE4F4, 0x788E, 0xE1EF, 0x7891, 0xDDF8, + 0x7897, 0xE8CF, 0x78A3, 0xCAE5, 0x78A7, 0xDCA1, 0x78A9, 0xE0B5, + 0x78BA, 0xFCAC, 0x78BB, 0xFCAD, 0x78BC, 0xD8A7, 0x78C1, 0xEDB8, + 0x78C5, 0xDBB6, 0x78CA, 0xD6F0, 0x78CB, 0xF3AF, 0x78CE, 0xCDA5, + 0x78D0, 0xDAF1, 0x78E8, 0xD8A8, 0x78EC, 0xCCE4, 0x78EF, 0xD1B4, + 0x78F5, 0xCAD8, 0x78FB, 0xDAF2, 0x7901, 0xF5A7, 0x790E, 0xF5A8, + 0x7916, 0xE6A6, 0x792A, 0xD5EC, 0x792B, 0xD5F8, 0x792C, 0xDAF3, + 0x793A, 0xE3C6, 0x793E, 0xDEE4, 0x7940, 0xDEE5, 0x7941, 0xD1B5, + 0x7947, 0xD1B6, 0x7948, 0xD1B7, 0x7949, 0xF2B3, 0x7950, 0xE9DE, + 0x7956, 0xF0D3, 0x7957, 0xF2B4, 0x795A, 0xF0D4, 0x795B, 0xCBE4, + 0x795C, 0xFBD4, 0x795D, 0xF5E6, 0x795E, 0xE3EA, 0x7960, 0xDEE6, + 0x7965, 0xDFD4, 0x7968, 0xF8F9, 0x796D, 0xF0AE, 0x797A, 0xD1B8, + 0x797F, 0xD6DF, 0x7981, 0xD0D7, 0x798D, 0xFCA1, 0x798E, 0xEFEE, + 0x798F, 0xDCD8, 0x7991, 0xE9DF, 0x79A6, 0xE5DD, 0x79A7, 0xFDFB, + 0x79AA, 0xE0C9, 0x79AE, 0xD6C9, 0x79B1, 0xD4AA, 0x79B3, 0xE5CC, + 0x79B9, 0xE9E0, 0x79BD, 0xD0D8, 0x79BE, 0xFCA2, 0x79BF, 0xD4BE, + 0x79C0, 0xE2B3, 0x79C1, 0xDEE7, 0x79C9, 0xDCBC, 0x79CA, 0xD2B6, + 0x79CB, 0xF5D5, 0x79D1, 0xCEA1, 0x79D2, 0xF5A9, 0x79D5, 0xDDF9, + 0x79D8, 0xDDFA, 0x79DF, 0xF0D5, 0x79E4, 0xF6DF, 0x79E6, 0xF2DA, + 0x79E7, 0xE4EB, 0x79E9, 0xF2F1, 0x79FB, 0xECB9, 0x7A00, 0xFDFC, + 0x7A05, 0xE1AA, 0x7A08, 0xCAD9, 0x7A0B, 0xEFEF, 0x7A0D, 0xF5AA, + 0x7A14, 0xECF9, 0x7A17, 0xF8AD, 0x7A19, 0xF2C2, 0x7A1A, 0xF6C3, + 0x7A1C, 0xD7D2, 0x7A1F, 0xF9A2, 0x7A20, 0xF0D6, 0x7A2E, 0xF0FA, + 0x7A31, 0xF6E0, 0x7A36, 0xE9F3, 0x7A37, 0xF2C3, 0x7A3B, 0xD4AB, + 0x7A3C, 0xCAB3, 0x7A3D, 0xCDA6, 0x7A3F, 0xCDC3, 0x7A40, 0xCDDA, + 0x7A46, 0xD9CF, 0x7A49, 0xF6C4, 0x7A4D, 0xEEDD, 0x7A4E, 0xE7C4, + 0x7A57, 0xE2B4, 0x7A61, 0xDFE2, 0x7A62, 0xE7DB, 0x7A69, 0xE8B1, + 0x7A6B, 0xFCAE, 0x7A70, 0xE5CD, 0x7A74, 0xFAEB, 0x7A76, 0xCFBC, + 0x7A79, 0xCFE2, 0x7A7A, 0xCDF6, 0x7A7D, 0xEFF0, 0x7A7F, 0xF4BE, + 0x7A81, 0xD4CD, 0x7A84, 0xF3B8, 0x7A88, 0xE9A1, 0x7A92, 0xF2F2, + 0x7A93, 0xF3EB, 0x7A95, 0xF0D7, 0x7A98, 0xCFD7, 0x7A9F, 0xCFDF, + 0x7AA9, 0xE8C0, 0x7AAA, 0xE8C1, 0x7AAE, 0xCFE3, 0x7AAF, 0xE9A2, + 0x7ABA, 0xD0AA, 0x7AC4, 0xF3C1, 0x7AC5, 0xD0AB, 0x7AC7, 0xD4E4, + 0x7ACA, 0xEFBC, 0x7ACB, 0xD8A1, 0x7AD7, 0xD9DF, 0x7AD9, 0xF3D7, + 0x7ADD, 0xDCBD, 0x7ADF, 0xCCE5, 0x7AE0, 0xEDF1, 0x7AE3, 0xF1E2, + 0x7AE5, 0xD4DB, 0x7AEA, 0xE2B5, 0x7AED, 0xCAE6, 0x7AEF, 0xD3AE, + 0x7AF6, 0xCCE6, 0x7AF9, 0xF1D3, 0x7AFA, 0xF5E7, 0x7AFF, 0xCADA, + 0x7B0F, 0xFBEE, 0x7B11, 0xE1C5, 0x7B19, 0xDFE9, 0x7B1B, 0xEEDE, + 0x7B1E, 0xF7C2, 0x7B20, 0xD8A2, 0x7B26, 0xDDAC, 0x7B2C, 0xF0AF, + 0x7B2D, 0xD6BD, 0x7B39, 0xE1AB, 0x7B46, 0xF9B6, 0x7B49, 0xD4F5, + 0x7B4B, 0xD0C9, 0x7B4C, 0xEFA7, 0x7B4D, 0xE2EC, 0x7B4F, 0xDBEA, + 0x7B50, 0xCECC, 0x7B51, 0xF5E8, 0x7B52, 0xF7D5, 0x7B54, 0xD3CD, + 0x7B56, 0xF3FE, 0x7B60, 0xD0B5, 0x7B6C, 0xE0FE, 0x7B6E, 0xDFFB, + 0x7B75, 0xE6DD, 0x7B7D, 0xE8A4, 0x7B87, 0xCBCD, 0x7B8B, 0xEFA8, + 0x7B8F, 0xEEB4, 0x7B94, 0xDAD8, 0x7B95, 0xD1B9, 0x7B97, 0xDFA9, + 0x7B9A, 0xF3B0, 0x7B9D, 0xCCC4, 0x7BA1, 0xCEB7, 0x7BAD, 0xEFA9, + 0x7BB1, 0xDFD5, 0x7BB4, 0xEDD7, 0x7BB8, 0xEEC6, 0x7BC0, 0xEFBD, + 0x7BC1, 0xFCD6, 0x7BC4, 0xDBF4, 0x7BC6, 0xEFAA, 0x7BC7, 0xF8B9, + 0x7BC9, 0xF5E9, 0x7BD2, 0xE3D9, 0x7BE0, 0xE1C6, 0x7BE4, 0xD4BF, + 0x7BE9, 0xDEE8, 0x7C07, 0xF0EA, 0x7C12, 0xF3C2, 0x7C1E, 0xD3AF, + 0x7C21, 0xCADB, 0x7C27, 0xFCD7, 0x7C2A, 0xEDD8, 0x7C2B, 0xE1C7, + 0x7C3D, 0xF4D8, 0x7C3E, 0xD6B3, 0x7C3F, 0xDDAD, 0x7C43, 0xD5BE, + 0x7C4C, 0xF1C3, 0x7C4D, 0xEEDF, 0x7C60, 0xD6EB, 0x7C64, 0xF4D9, + 0x7C6C, 0xD7E6, 0x7C73, 0xDAB7, 0x7C83, 0xDDFB, 0x7C89, 0xDDCF, + 0x7C92, 0xD8A3, 0x7C95, 0xDAD9, 0x7C97, 0xF0D8, 0x7C98, 0xEFC4, + 0x7C9F, 0xE1D8, 0x7CA5, 0xF1D4, 0x7CA7, 0xEDF2, 0x7CAE, 0xD5DB, + 0x7CB1, 0xD5DC, 0x7CB2, 0xF3C4, 0x7CB3, 0xCBD7, 0x7CB9, 0xE2B6, + 0x7CBE, 0xEFF1, 0x7CCA, 0xFBD5, 0x7CD6, 0xD3D8, 0x7CDE, 0xDDD0, + 0x7CDF, 0xF0D9, 0x7CE0, 0xCBB3, 0x7CE7, 0xD5DD, 0x7CFB, 0xCDA7, + 0x7CFE, 0xD0AC, 0x7D00, 0xD1BA, 0x7D02, 0xF1C4, 0x7D04, 0xE5B3, + 0x7D05, 0xFBF5, 0x7D06, 0xE9E1, 0x7D07, 0xFDE0, 0x7D08, 0xFCBC, + 0x7D0A, 0xDAA2, 0x7D0B, 0xDAA3, 0x7D0D, 0xD2A1, 0x7D10, 0xD2EF, + 0x7D14, 0xE2ED, 0x7D17, 0xDEE9, 0x7D18, 0xCEDC, 0x7D19, 0xF2B5, + 0x7D1A, 0xD0E4, 0x7D1B, 0xDDD1, 0x7D20, 0xE1C8, 0x7D21, 0xDBB7, + 0x7D22, 0xDFE3, 0x7D2B, 0xEDB9, 0x7D2C, 0xF1C5, 0x7D2E, 0xF3CF, + 0x7D2F, 0xD7AB, 0x7D30, 0xE1AC, 0x7D33, 0xE3EB, 0x7D35, 0xEEC7, + 0x7D39, 0xE1C9, 0x7D3A, 0xCAFA, 0x7D42, 0xF0FB, 0x7D43, 0xFAE1, + 0x7D44, 0xF0DA, 0x7D45, 0xCCE7, 0x7D46, 0xDAF4, 0x7D50, 0xCCBF, + 0x7D5E, 0xCEED, 0x7D61, 0xD5A9, 0x7D62, 0xFAE2, 0x7D66, 0xD0E5, + 0x7D68, 0xEBD6, 0x7D6A, 0xECDF, 0x7D6E, 0xDFFC, 0x7D71, 0xF7D6, + 0x7D72, 0xDEEA, 0x7D73, 0xCBB4, 0x7D76, 0xEFBE, 0x7D79, 0xCCB5, + 0x7D7F, 0xCFBD, 0x7D8E, 0xEFF2, 0x7D8F, 0xE2B7, 0x7D93, 0xCCE8, + 0x7D9C, 0xF0FC, 0x7DA0, 0xD6E0, 0x7DA2, 0xF1C6, 0x7DAC, 0xE2B8, + 0x7DAD, 0xEBAB, 0x7DB1, 0xCBB5, 0x7DB2, 0xD8D1, 0x7DB4, 0xF4CE, + 0x7DB5, 0xF3F7, 0x7DB8, 0xD7C6, 0x7DBA, 0xD1BB, 0x7DBB, 0xF7AA, + 0x7DBD, 0xEDCA, 0x7DBE, 0xD7D3, 0x7DBF, 0xD8FA, 0x7DC7, 0xF6C5, + 0x7DCA, 0xD1CC, 0x7DCB, 0xDDFC, 0x7DD6, 0xDFFD, 0x7DD8, 0xF9E5, + 0x7DDA, 0xE0CA, 0x7DDD, 0xF2FD, 0x7DDE, 0xD3B0, 0x7DE0, 0xF4F3, + 0x7DE1, 0xDAC9, 0x7DE3, 0xE6DE, 0x7DE8, 0xF8BA, 0x7DE9, 0xE8D0, + 0x7DEC, 0xD8FB, 0x7DEF, 0xEAD5, 0x7DF4, 0xD6A3, 0x7DFB, 0xF6C6, + 0x7E09, 0xF2DB, 0x7E0A, 0xE4FC, 0x7E15, 0xE8B2, 0x7E1B, 0xDADA, + 0x7E1D, 0xF2DC, 0x7E1E, 0xFBD6, 0x7E1F, 0xE9B2, 0x7E21, 0xEEAD, + 0x7E23, 0xFAE3, 0x7E2B, 0xDCEE, 0x7E2E, 0xF5EA, 0x7E2F, 0xE6E0, + 0x7E31, 0xF0FD, 0x7E37, 0xD7AC, 0x7E3D, 0xF5C5, 0x7E3E, 0xEEE0, + 0x7E41, 0xDBE5, 0x7E43, 0xDDDE, 0x7E46, 0xD9F0, 0x7E47, 0xE9A3, + 0x7E52, 0xF1F9, 0x7E54, 0xF2C4, 0x7E55, 0xE0CB, 0x7E5E, 0xE9A4, + 0x7E61, 0xE2B9, 0x7E69, 0xE3B1, 0x7E6A, 0xFCEB, 0x7E6B, 0xCDA8, + 0x7E6D, 0xCCB6, 0x7E70, 0xF0DB, 0x7E79, 0xE6BA, 0x7E7C, 0xCDA9, + 0x7E82, 0xF3C3, 0x7E8C, 0xE1D9, 0x7E8F, 0xEFAB, 0x7E93, 0xE7C5, + 0x7E96, 0xE0E9, 0x7E98, 0xF3C5, 0x7E9B, 0xD4C0, 0x7E9C, 0xD5BF, + 0x7F36, 0xDDAE, 0x7F38, 0xF9FC, 0x7F3A, 0xCCC0, 0x7F4C, 0xE5A2, + 0x7F50, 0xCEB8, 0x7F54, 0xD8D2, 0x7F55, 0xF9D6, 0x7F6A, 0xF1AA, + 0x7F6B, 0xCED1, 0x7F6E, 0xF6C7, 0x7F70, 0xDBEB, 0x7F72, 0xDFFE, + 0x7F75, 0xD8E1, 0x7F77, 0xF7F3, 0x7F79, 0xD7E7, 0x7F85, 0xD4FE, + 0x7F88, 0xD1BC, 0x7F8A, 0xE5CF, 0x7F8C, 0xCBB6, 0x7F8E, 0xDAB8, + 0x7F94, 0xCDC4, 0x7F9A, 0xD6BE, 0x7F9E, 0xE2BA, 0x7FA4, 0xCFD8, + 0x7FA8, 0xE0CC, 0x7FA9, 0xEBF9, 0x7FB2, 0xFDFD, 0x7FB8, 0xD7E8, + 0x7FB9, 0xCBD8, 0x7FBD, 0xE9E2, 0x7FC1, 0xE8BA, 0x7FC5, 0xE3C7, + 0x7FCA, 0xECCD, 0x7FCC, 0xECCE, 0x7FCE, 0xD6BF, 0x7FD2, 0xE3A7, + 0x7FD4, 0xDFD6, 0x7FD5, 0xFDE8, 0x7FDF, 0xEEE1, 0x7FE0, 0xF6A8, + 0x7FE1, 0xDDFD, 0x7FE9, 0xF8BB, 0x7FEB, 0xE8D1, 0x7FF0, 0xF9D7, + 0x7FF9, 0xCEEE, 0x7FFC, 0xECCF, 0x8000, 0xE9A5, 0x8001, 0xD6D5, + 0x8003, 0xCDC5, 0x8005, 0xEDBA, 0x8006, 0xD1BD, 0x8009, 0xCFBE, + 0x800C, 0xECBB, 0x8010, 0xD2B1, 0x8015, 0xCCE9, 0x8017, 0xD9C4, + 0x8018, 0xE9FC, 0x802D, 0xD1BE, 0x8033, 0xECBC, 0x8036, 0xE5AD, + 0x803D, 0xF7B0, 0x803F, 0xCCEA, 0x8043, 0xD3C4, 0x8046, 0xD6C0, + 0x804A, 0xD6FD, 0x8056, 0xE1A1, 0x8058, 0xDEBD, 0x805A, 0xF6A9, + 0x805E, 0xDAA4, 0x806F, 0xD6A4, 0x8070, 0xF5C6, 0x8072, 0xE1A2, + 0x8073, 0xE9C6, 0x8077, 0xF2C5, 0x807D, 0xF4E9, 0x807E, 0xD6EC, + 0x807F, 0xEBD3, 0x8084, 0xECBD, 0x8085, 0xE2DC, 0x8086, 0xDEEB, + 0x8087, 0xF0DC, 0x8089, 0xEBBF, 0x808B, 0xD7CE, 0x808C, 0xD1BF, + 0x8096, 0xF5AB, 0x809B, 0xF9FD, 0x809D, 0xCADC, 0x80A1, 0xCDC6, + 0x80A2, 0xF2B6, 0x80A5, 0xDDFE, 0x80A9, 0xCCB7, 0x80AA, 0xDBB8, + 0x80AF, 0xD0E9, 0x80B1, 0xCEDD, 0x80B2, 0xEBC0, 0x80B4, 0xFDA2, + 0x80BA, 0xF8CB, 0x80C3, 0xEAD6, 0x80C4, 0xF1B0, 0x80CC, 0xDBCE, + 0x80CE, 0xF7C3, 0x80DA, 0xDBCF, 0x80DB, 0xCBA4, 0x80DE, 0xF8E0, + 0x80E1, 0xFBD7, 0x80E4, 0xEBCA, 0x80E5, 0xE0A1, 0x80F1, 0xCECD, + 0x80F4, 0xD4DC, 0x80F8, 0xFDD8, 0x80FD, 0xD2F6, 0x8102, 0xF2B7, + 0x8105, 0xFAF6, 0x8106, 0xF6AA, 0x8107, 0xFAF7, 0x8108, 0xD8E6, + 0x810A, 0xF4B1, 0x8118, 0xE8D2, 0x811A, 0xCAC5, 0x811B, 0xCCEB, + 0x8123, 0xE2EE, 0x8129, 0xE2BB, 0x812B, 0xF7AD, 0x812F, 0xF8E1, + 0x8139, 0xF3EC, 0x813E, 0xDEA1, 0x814B, 0xE4FD, 0x814E, 0xE3EC, + 0x8150, 0xDDAF, 0x8151, 0xDDB0, 0x8154, 0xCBB7, 0x8155, 0xE8D3, + 0x8165, 0xE1A3, 0x8166, 0xD2E0, 0x816B, 0xF0FE, 0x8170, 0xE9A6, + 0x8171, 0xCBF2, 0x8178, 0xEDF3, 0x8179, 0xDCD9, 0x817A, 0xE0CD, + 0x817F, 0xF7DA, 0x8180, 0xDBB9, 0x8188, 0xCCAE, 0x818A, 0xDADB, + 0x818F, 0xCDC7, 0x819A, 0xDDB1, 0x819C, 0xD8AF, 0x819D, 0xE3A3, + 0x81A0, 0xCEEF, 0x81A3, 0xF2F3, 0x81A8, 0xF8B3, 0x81B3, 0xE0CE, + 0x81B5, 0xF5FD, 0x81BA, 0xEBEC, 0x81BD, 0xD3C5, 0x81BE, 0xFCEC, + 0x81BF, 0xD2DB, 0x81C0, 0xD4EB, 0x81C2, 0xDEA2, 0x81C6, 0xE5E6, + 0x81CD, 0xF0B0, 0x81D8, 0xD5C4, 0x81DF, 0xEDF4, 0x81E3, 0xE3ED, + 0x81E5, 0xE8C2, 0x81E7, 0xEDF5, 0x81E8, 0xD7FC, 0x81EA, 0xEDBB, + 0x81ED, 0xF6AB, 0x81F3, 0xF2B8, 0x81F4, 0xF6C8, 0x81FA, 0xD3E6, + 0x81FB, 0xF2DD, 0x81FC, 0xCFBF, 0x81FE, 0xEBAC, 0x8205, 0xCFC0, + 0x8207, 0xE6A8, 0x8208, 0xFDE9, 0x820A, 0xCFC1, 0x820C, 0xE0DF, + 0x820D, 0xDEEC, 0x8212, 0xE0A2, 0x821B, 0xF4BF, 0x821C, 0xE2EF, + 0x821E, 0xD9F1, 0x821F, 0xF1C7, 0x8221, 0xCBB8, 0x822A, 0xF9FE, + 0x822B, 0xDBBA, 0x822C, 0xDAF5, 0x8235, 0xF6EC, 0x8236, 0xDADC, + 0x8237, 0xFAE4, 0x8239, 0xE0CF, 0x8240, 0xDDB2, 0x8245, 0xE6A9, + 0x8247, 0xEFF3, 0x8259, 0xF3ED, 0x8264, 0xEBFA, 0x8266, 0xF9E6, + 0x826E, 0xCADD, 0x826F, 0xD5DE, 0x8271, 0xCADE, 0x8272, 0xDFE4, + 0x8276, 0xE6FD, 0x8278, 0xF5AC, 0x827E, 0xE4F5, 0x828B, 0xE9E3, + 0x828D, 0xEDCB, 0x828E, 0xCFE4, 0x8292, 0xD8D3, 0x8299, 0xDDB3, + 0x829A, 0xD4EC, 0x829D, 0xF2B9, 0x829F, 0xDFB7, 0x82A5, 0xCBCE, + 0x82A6, 0xFBD8, 0x82A9, 0xD0D9, 0x82AC, 0xDDD2, 0x82AD, 0xF7F4, + 0x82AE, 0xE7DC, 0x82AF, 0xE4A5, 0x82B1, 0xFCA3, 0x82B3, 0xDBBB, + 0x82B7, 0xF2BA, 0x82B8, 0xE9FD, 0x82B9, 0xD0CA, 0x82BB, 0xF5D6, + 0x82BC, 0xD9C5, 0x82BD, 0xE4B4, 0x82BF, 0xEDA7, 0x82D1, 0xEABD, + 0x82D2, 0xE6FE, 0x82D4, 0xF7C4, 0x82D5, 0xF5AD, 0x82D7, 0xD9E0, + 0x82DB, 0xCAB4, 0x82DE, 0xF8E2, 0x82DF, 0xCFC2, 0x82E1, 0xECBE, + 0x82E5, 0xE5B4, 0x82E6, 0xCDC8, 0x82E7, 0xEEC8, 0x82F1, 0xE7C8, + 0x82FD, 0xCDC9, 0x82FE, 0xF9B7, 0x8301, 0xF1E8, 0x8302, 0xD9F2, + 0x8303, 0xDBF5, 0x8304, 0xCAB5, 0x8305, 0xD9C6, 0x8309, 0xD8C9, + 0x8317, 0xD9AB, 0x8328, 0xEDBC, 0x832B, 0xD8D4, 0x832F, 0xDCDA, + 0x8331, 0xE2BC, 0x8334, 0xFCED, 0x8335, 0xECE0, 0x8336, 0xD2FE, + 0x8338, 0xE9C7, 0x8339, 0xE6AA, 0x8340, 0xE2F0, 0x8347, 0xFABB, + 0x8349, 0xF5AE, 0x834A, 0xFBAA, 0x834F, 0xECFB, 0x8351, 0xECBF, + 0x8352, 0xFCD8, 0x8373, 0xD4E5, 0x8377, 0xF9C3, 0x837B, 0xEEE2, + 0x8389, 0xD7E9, 0x838A, 0xEDF6, 0x838E, 0xDEED, 0x8396, 0xCCEC, + 0x8398, 0xE3EE, 0x839E, 0xE8D4, 0x83A2, 0xFAF8, 0x83A9, 0xDDB4, + 0x83AA, 0xE4B5, 0x83AB, 0xD8B0, 0x83BD, 0xD8D5, 0x83C1, 0xF4EA, + 0x83C5, 0xCEB9, 0x83C9, 0xD6E1, 0x83CA, 0xCFD2, 0x83CC, 0xD0B6, + 0x83D3, 0xCEA2, 0x83D6, 0xF3EE, 0x83DC, 0xF3F8, 0x83E9, 0xDCCC, + 0x83EB, 0xD0CB, 0x83EF, 0xFCA4, 0x83F0, 0xCDCA, 0x83F1, 0xD7D4, + 0x83F2, 0xDEA3, 0x83F4, 0xE4E0, 0x83F9, 0xEEC9, 0x83FD, 0xE2DD, + 0x8403, 0xF5FE, 0x8404, 0xD4AC, 0x840A, 0xD5D1, 0x840C, 0xD8F0, + 0x840D, 0xF8C3, 0x840E, 0xEAD7, 0x8429, 0xF5D7, 0x842C, 0xD8BF, + 0x8431, 0xFDC0, 0x8438, 0xEBAD, 0x843D, 0xD5AA, 0x8449, 0xE7A8, + 0x8457, 0xEECA, 0x845B, 0xCAE7, 0x8461, 0xF8E3, 0x8463, 0xD4DD, + 0x8466, 0xEAD8, 0x846B, 0xFBD9, 0x846C, 0xEDF7, 0x846F, 0xE5B5, + 0x8475, 0xD0AD, 0x847A, 0xF1F1, 0x8490, 0xE2BD, 0x8494, 0xE3C8, + 0x8499, 0xD9D5, 0x849C, 0xDFAA, 0x84A1, 0xDBBC, 0x84B2, 0xF8E4, + 0x84B8, 0xF1FA, 0x84BB, 0xE5B6, 0x84BC, 0xF3EF, 0x84BF, 0xFBDA, + 0x84C0, 0xE1E0, 0x84C2, 0xD9AC, 0x84C4, 0xF5EB, 0x84C6, 0xE0B6, + 0x84C9, 0xE9C8, 0x84CB, 0xCBCF, 0x84CD, 0xE3C9, 0x84D1, 0xDEEE, + 0x84DA, 0xE2BE, 0x84EC, 0xDCEF, 0x84EE, 0xD6A5, 0x84F4, 0xE2F1, + 0x84FC, 0xD6FE, 0x8511, 0xD9A1, 0x8513, 0xD8C0, 0x8514, 0xDCDB, + 0x8517, 0xEDBD, 0x8518, 0xDFB8, 0x851A, 0xEAA5, 0x851E, 0xD7AD, + 0x8521, 0xF3F9, 0x8523, 0xEDF8, 0x8525, 0xF5C7, 0x852C, 0xE1CA, + 0x852D, 0xEBE3, 0x852F, 0xF2DE, 0x853D, 0xF8CC, 0x853F, 0xEAD9, + 0x8541, 0xD3C6, 0x8543, 0xDBE6, 0x8549, 0xF5AF, 0x854E, 0xCEF0, + 0x8553, 0xE9FE, 0x8559, 0xFBB6, 0x8563, 0xE2F2, 0x8568, 0xCFF2, + 0x8569, 0xF7B9, 0x856A, 0xD9F3, 0x856D, 0xE1CB, 0x8584, 0xDADD, + 0x8587, 0xDAB9, 0x858F, 0xEBFB, 0x8591, 0xCBB9, 0x8594, 0xEDF9, + 0x859B, 0xE0E0, 0x85A6, 0xF4C0, 0x85A8, 0xFDBC, 0x85A9, 0xDFB1, + 0x85AA, 0xE3EF, 0x85AF, 0xE0A3, 0x85B0, 0xFDB9, 0x85BA, 0xF0B1, + 0x85C1, 0xCDCB, 0x85C9, 0xEDBE, 0x85CD, 0xD5C0, 0x85CE, 0xE3F0, + 0x85CF, 0xEDFA, 0x85D5, 0xE9E4, 0x85DC, 0xD5ED, 0x85DD, 0xE7DD, + 0x85E4, 0xD4F6, 0x85E5, 0xE5B7, 0x85E9, 0xDBE7, 0x85EA, 0xE2BF, + 0x85F7, 0xEECB, 0x85FA, 0xD7F4, 0x85FB, 0xF0DD, 0x85FF, 0xCEAB, + 0x8602, 0xE7DE, 0x8606, 0xD6D6, 0x8607, 0xE1CC, 0x860A, 0xE8B3, + 0x8616, 0xE5EE, 0x8617, 0xDCA2, 0x861A, 0xE0D0, 0x862D, 0xD5B5, + 0x863F, 0xD5A1, 0x864E, 0xFBDB, 0x8650, 0xF9CB, 0x8654, 0xCBF3, + 0x8655, 0xF4A5, 0x865B, 0xFAC8, 0x865C, 0xD6D7, 0x865E, 0xE9E5, + 0x865F, 0xFBDC, 0x8667, 0xFDD0, 0x8679, 0xFBF6, 0x868A, 0xDAA5, + 0x868C, 0xDBBD, 0x8693, 0xECE2, 0x86A3, 0xCDF7, 0x86A4, 0xF0DE, + 0x86A9, 0xF6C9, 0x86C7, 0xDEEF, 0x86CB, 0xD3B1, 0x86D4, 0xFCEE, + 0x86D9, 0xE8C3, 0x86DB, 0xF1C8, 0x86DF, 0xCEF1, 0x86E4, 0xF9ED, + 0x86ED, 0xF2F4, 0x86FE, 0xE4B6, 0x8700, 0xF5B9, 0x8702, 0xDCF0, + 0x8703, 0xE3F1, 0x8708, 0xE8A5, 0x8718, 0xF2BB, 0x871A, 0xDEA4, + 0x871C, 0xDACC, 0x874E, 0xCAE9, 0x8755, 0xE3DA, 0x8757, 0xFCD9, + 0x875F, 0xEADA, 0x8766, 0xF9C4, 0x8768, 0xE3A4, 0x8774, 0xFBDD, + 0x8776, 0xEFCA, 0x8778, 0xE8C4, 0x8782, 0xD5CC, 0x878D, 0xEBD7, + 0x879F, 0xD9AD, 0x87A2, 0xFBAB, 0x87B3, 0xD3D9, 0x87BA, 0xD5A2, + 0x87C4, 0xF6DE, 0x87E0, 0xDAF6, 0x87EC, 0xE0D1, 0x87EF, 0xE9A8, + 0x87F2, 0xF5F9, 0x87F9, 0xFAAF, 0x87FB, 0xEBFC, 0x87FE, 0xE0EA, + 0x8805, 0xE3B2, 0x881F, 0xD5C5, 0x8822, 0xF1E3, 0x8823, 0xD5EE, + 0x8831, 0xCDCC, 0x8836, 0xEDD9, 0x883B, 0xD8C1, 0x8840, 0xFAEC, + 0x8846, 0xF1EB, 0x884C, 0xFABC, 0x884D, 0xE6E2, 0x8852, 0xFAE5, + 0x8853, 0xE2FA, 0x8857, 0xCAB6, 0x8859, 0xE4B7, 0x885B, 0xEADB, + 0x885D, 0xF5FA, 0x8861, 0xFBAC, 0x8862, 0xCFC3, 0x8863, 0xEBFD, + 0x8868, 0xF8FA, 0x886B, 0xDFB9, 0x8870, 0xE1F1, 0x8872, 0xD2A4, + 0x8877, 0xF5FB, 0x887E, 0xD0DA, 0x887F, 0xD0DB, 0x8881, 0xEABE, + 0x8882, 0xD9B1, 0x8888, 0xCAB7, 0x888B, 0xD3E7, 0x888D, 0xF8E5, + 0x8892, 0xD3B2, 0x8896, 0xE2C0, 0x8897, 0xF2DF, 0x889E, 0xCDE5, + 0x88AB, 0xF9AC, 0x88B4, 0xCDCD, 0x88C1, 0xEEAE, 0x88C2, 0xD6AE, + 0x88CF, 0xD7EA, 0x88D4, 0xE7E0, 0x88D5, 0xEBAE, 0x88D9, 0xCFD9, + 0x88DC, 0xDCCD, 0x88DD, 0xEDFB, 0x88DF, 0xDEF0, 0x88E1, 0xD7EB, + 0x88E8, 0xDEA5, 0x88F3, 0xDFD7, 0x88F4, 0xDBD0, 0x88F5, 0xDBD1, + 0x88F8, 0xD5A3, 0x88FD, 0xF0B2, 0x8907, 0xDCDC, 0x8910, 0xCAE8, + 0x8912, 0xF8E6, 0x8913, 0xDCCE, 0x8918, 0xEADC, 0x8919, 0xDBD2, + 0x8925, 0xE9B3, 0x892A, 0xF7DB, 0x8936, 0xE3A8, 0x8938, 0xD7AE, + 0x893B, 0xE0E1, 0x8941, 0xCBBA, 0x8944, 0xE5D1, 0x895F, 0xD0DC, + 0x8964, 0xD5C1, 0x896A, 0xD8CA, 0x8972, 0xE3A9, 0x897F, 0xE0A4, + 0x8981, 0xE9A9, 0x8983, 0xD3C7, 0x8986, 0xDCDD, 0x8987, 0xF8AE, + 0x898B, 0xCCB8, 0x898F, 0xD0AE, 0x8993, 0xD8F2, 0x8996, 0xE3CA, + 0x89A1, 0xCCAF, 0x89A9, 0xD4AD, 0x89AA, 0xF6D1, 0x89B2, 0xD0CC, + 0x89BA, 0xCAC6, 0x89BD, 0xD5C2, 0x89C0, 0xCEBA, 0x89D2, 0xCAC7, + 0x89E3, 0xFAB0, 0x89F4, 0xDFD8, 0x89F8, 0xF5BA, 0x8A00, 0xE5EB, + 0x8A02, 0xEFF4, 0x8A03, 0xDDB5, 0x8A08, 0xCDAA, 0x8A0A, 0xE3F2, + 0x8A0C, 0xFBF7, 0x8A0E, 0xF7D0, 0x8A13, 0xFDBA, 0x8A16, 0xFDE1, + 0x8A17, 0xF6FE, 0x8A18, 0xD1C0, 0x8A1B, 0xE8C5, 0x8A1D, 0xE4B8, + 0x8A1F, 0xE1E8, 0x8A23, 0xCCC1, 0x8A25, 0xD2ED, 0x8A2A, 0xDBBE, + 0x8A2D, 0xE0E2, 0x8A31, 0xFAC9, 0x8A34, 0xE1CD, 0x8A36, 0xCAB8, + 0x8A3A, 0xF2E0, 0x8A3B, 0xF1C9, 0x8A50, 0xDEF1, 0x8A54, 0xF0DF, + 0x8A55, 0xF8C4, 0x8A5B, 0xEECC, 0x8A5E, 0xDEF2, 0x8A60, 0xE7C9, + 0x8A62, 0xE2F3, 0x8A63, 0xE7E1, 0x8A66, 0xE3CB, 0x8A69, 0xE3CC, + 0x8A6D, 0xCFF8, 0x8A6E, 0xEFAC, 0x8A70, 0xFDFE, 0x8A71, 0xFCA5, + 0x8A72, 0xFAB1, 0x8A73, 0xDFD9, 0x8A75, 0xE0D2, 0x8A79, 0xF4DA, + 0x8A85, 0xF1CA, 0x8A87, 0xCEA3, 0x8A8C, 0xF2BC, 0x8A8D, 0xECE3, + 0x8A93, 0xE0A5, 0x8A95, 0xF7AB, 0x8A98, 0xEBAF, 0x8A9E, 0xE5DE, + 0x8AA0, 0xE1A4, 0x8AA1, 0xCDAB, 0x8AA3, 0xD9F4, 0x8AA4, 0xE8A6, + 0x8AA5, 0xCDCE, 0x8AA6, 0xE1E9, 0x8AA8, 0xFCEF, 0x8AAA, 0xE0E3, + 0x8AB0, 0xE2C1, 0x8AB2, 0xCEA4, 0x8AB9, 0xDEA6, 0x8ABC, 0xEBFE, + 0x8ABE, 0xEBDD, 0x8ABF, 0xF0E0, 0x8AC2, 0xF4DB, 0x8AC4, 0xE2F4, + 0x8AC7, 0xD3C8, 0x8ACB, 0xF4EB, 0x8ACD, 0xEEB5, 0x8ACF, 0xF5D8, + 0x8AD2, 0xD5DF, 0x8AD6, 0xD6E5, 0x8ADB, 0xEBB0, 0x8ADC, 0xF4E3, + 0x8AE1, 0xE3CD, 0x8AE6, 0xF4F4, 0x8AE7, 0xFAB2, 0x8AEA, 0xEFF5, + 0x8AEB, 0xCADF, 0x8AED, 0xEBB1, 0x8AEE, 0xEDBF, 0x8AF1, 0xFDC9, + 0x8AF6, 0xE4A6, 0x8AF7, 0xF9A4, 0x8AF8, 0xF0B3, 0x8AFA, 0xE5EC, + 0x8AFE, 0xD1E7, 0x8B00, 0xD9C7, 0x8B01, 0xE4D7, 0x8B02, 0xEADD, + 0x8B04, 0xD4F7, 0x8B0E, 0xDABA, 0x8B10, 0xDACD, 0x8B14, 0xF9CC, + 0x8B16, 0xE1DA, 0x8B17, 0xDBBF, 0x8B19, 0xCCC5, 0x8B1A, 0xECD0, + 0x8B1B, 0xCBBB, 0x8B1D, 0xDEF3, 0x8B20, 0xE9AA, 0x8B28, 0xD9C8, + 0x8B2B, 0xEEE3, 0x8B2C, 0xD7BD, 0x8B33, 0xCFC4, 0x8B39, 0xD0CD, + 0x8B41, 0xFCA6, 0x8B49, 0xF1FB, 0x8B4E, 0xFDD2, 0x8B4F, 0xD1C1, + 0x8B58, 0xE3DB, 0x8B5A, 0xD3C9, 0x8B5C, 0xDCCF, 0x8B66, 0xCCED, + 0x8B6C, 0xDEA7, 0x8B6F, 0xE6BB, 0x8B70, 0xECA1, 0x8B74, 0xCCB9, + 0x8B77, 0xFBDE, 0x8B7D, 0xE7E2, 0x8B80, 0xD4C1, 0x8B8A, 0xDCA8, + 0x8B90, 0xE2C2, 0x8B92, 0xF3D8, 0x8B93, 0xE5D3, 0x8B96, 0xF3D9, + 0x8B9A, 0xF3C6, 0x8C37, 0xCDDB, 0x8C3F, 0xCDAC, 0x8C41, 0xFCC3, + 0x8C46, 0xD4E7, 0x8C48, 0xD1C2, 0x8C4A, 0xF9A5, 0x8C4C, 0xE8D5, + 0x8C55, 0xE3CE, 0x8C5A, 0xD4CA, 0x8C61, 0xDFDA, 0x8C6A, 0xFBDF, + 0x8C6B, 0xE7E3, 0x8C79, 0xF8FB, 0x8C7A, 0xE3CF, 0x8C82, 0xF5B0, + 0x8C8A, 0xD8E7, 0x8C8C, 0xD9C9, 0x8C9D, 0xF8AF, 0x8C9E, 0xEFF6, + 0x8CA0, 0xDDB6, 0x8CA1, 0xEEAF, 0x8CA2, 0xCDF8, 0x8CA7, 0xDEB8, + 0x8CA8, 0xFCA7, 0x8CA9, 0xF7FC, 0x8CAA, 0xF7B1, 0x8CAB, 0xCEBB, + 0x8CAC, 0xF4A1, 0x8CAF, 0xEECD, 0x8CB0, 0xE1AE, 0x8CB3, 0xECC3, + 0x8CB4, 0xCFFE, 0x8CB6, 0xF8BF, 0x8CB7, 0xD8E2, 0x8CB8, 0xD3E8, + 0x8CBB, 0xDEA8, 0x8CBC, 0xF4E4, 0x8CBD, 0xECC2, 0x8CBF, 0xD9F5, + 0x8CC0, 0xF9C5, 0x8CC1, 0xDDD3, 0x8CC2, 0xD6F1, 0x8CC3, 0xECFC, + 0x8CC4, 0xFCF0, 0x8CC7, 0xEDC0, 0x8CC8, 0xCAB9, 0x8CCA, 0xEEE4, + 0x8CD1, 0xF2E1, 0x8CD3, 0xDEB9, 0x8CDA, 0xD6F2, 0x8CDC, 0xDEF4, + 0x8CDE, 0xDFDB, 0x8CE0, 0xDBD3, 0x8CE2, 0xFAE7, 0x8CE3, 0xD8E3, + 0x8CE4, 0xF4C1, 0x8CE6, 0xDDB7, 0x8CEA, 0xF2F5, 0x8CED, 0xD4AE, + 0x8CF4, 0xD6F3, 0x8CFB, 0xDDB8, 0x8CFC, 0xCFC5, 0x8CFD, 0xDFDF, + 0x8D04, 0xF2BE, 0x8D05, 0xF6A1, 0x8D07, 0xEBCB, 0x8D08, 0xF1FC, + 0x8D0A, 0xF3C7, 0x8D0D, 0xE0EB, 0x8D13, 0xEDFC, 0x8D16, 0xE1DB, + 0x8D64, 0xEEE5, 0x8D66, 0xDEF5, 0x8D6B, 0xFAD3, 0x8D70, 0xF1CB, + 0x8D73, 0xD0AF, 0x8D74, 0xDDB9, 0x8D77, 0xD1C3, 0x8D85, 0xF5B1, + 0x8D8A, 0xEAC6, 0x8D99, 0xF0E1, 0x8DA3, 0xF6AC, 0x8DA8, 0xF5D9, + 0x8DB3, 0xF0EB, 0x8DBA, 0xDDBA, 0x8DBE, 0xF2BF, 0x8DC6, 0xF7C5, + 0x8DCB, 0xDBA2, 0x8DCC, 0xF2F6, 0x8DCF, 0xCABA, 0x8DDB, 0xF7F5, + 0x8DDD, 0xCBE5, 0x8DE1, 0xEEE6, 0x8DE3, 0xE0D3, 0x8DE8, 0xCEA5, + 0x8DEF, 0xD6D8, 0x8DF3, 0xD4AF, 0x8E0A, 0xE9C9, 0x8E0F, 0xD3CE, + 0x8E10, 0xF4C2, 0x8E1E, 0xCBE6, 0x8E2A, 0xF1A1, 0x8E30, 0xEBB2, + 0x8E35, 0xF1A2, 0x8E42, 0xEBB3, 0x8E44, 0xF0B4, 0x8E47, 0xCBF4, + 0x8E48, 0xD4B0, 0x8E49, 0xF3B2, 0x8E4A, 0xFBB7, 0x8E59, 0xF5EC, + 0x8E5F, 0xEEE7, 0x8E60, 0xF4B2, 0x8E74, 0xF5ED, 0x8E76, 0xCFF3, + 0x8E81, 0xF0E2, 0x8E87, 0xEECE, 0x8E8A, 0xF1CC, 0x8E8D, 0xE5B8, + 0x8EAA, 0xD7F5, 0x8EAB, 0xE3F3, 0x8EAC, 0xCFE5, 0x8EC0, 0xCFC6, + 0x8ECA, 0xF3B3, 0x8ECB, 0xE4D8, 0x8ECC, 0xCFF9, 0x8ECD, 0xCFDA, + 0x8ED2, 0xFACD, 0x8EDF, 0xE6E3, 0x8EEB, 0xF2E2, 0x8EF8, 0xF5EE, + 0x8EFB, 0xCABB, 0x8EFE, 0xE3DC, 0x8F03, 0xCEF2, 0x8F05, 0xD6D9, + 0x8F09, 0xEEB0, 0x8F12, 0xF4E5, 0x8F13, 0xD8C2, 0x8F14, 0xDCD0, + 0x8F15, 0xCCEE, 0x8F1B, 0xD5E0, 0x8F1C, 0xF6CA, 0x8F1D, 0xFDCA, + 0x8F1E, 0xD8D6, 0x8F1F, 0xF4CF, 0x8F26, 0xD6A6, 0x8F27, 0xDCBE, + 0x8F29, 0xDBD4, 0x8F2A, 0xD7C7, 0x8F2F, 0xF2FE, 0x8F33, 0xF1CD, + 0x8F38, 0xE2C3, 0x8F39, 0xDCDE, 0x8F3B, 0xDCDF, 0x8F3E, 0xEFAD, + 0x8F3F, 0xE6AB, 0x8F44, 0xF9DD, 0x8F45, 0xEABF, 0x8F49, 0xEFAE, + 0x8F4D, 0xF4D0, 0x8F4E, 0xCEF3, 0x8F5D, 0xE6AC, 0x8F5F, 0xCEDE, + 0x8F62, 0xD5F9, 0x8F9B, 0xE3F4, 0x8F9C, 0xCDD0, 0x8FA3, 0xD5B8, + 0x8FA6, 0xF7FD, 0x8FA8, 0xDCA9, 0x8FAD, 0xDEF6, 0x8FAF, 0xDCAA, + 0x8FB0, 0xF2E3, 0x8FB1, 0xE9B4, 0x8FB2, 0xD2DC, 0x8FC2, 0xE9E6, + 0x8FC5, 0xE3F6, 0x8FCE, 0xE7CA, 0x8FD1, 0xD0CE, 0x8FD4, 0xDAF7, + 0x8FE6, 0xCABC, 0x8FEA, 0xEEE8, 0x8FEB, 0xDADE, 0x8FED, 0xF2F7, + 0x8FF0, 0xE2FB, 0x8FF2, 0xCCA6, 0x8FF7, 0xDABB, 0x8FF9, 0xEEE9, + 0x8FFD, 0xF5DA, 0x9000, 0xF7DC, 0x9001, 0xE1EA, 0x9002, 0xCEC1, + 0x9003, 0xD4B1, 0x9005, 0xFDB1, 0x9006, 0xE6BD, 0x9008, 0xFBAD, + 0x900B, 0xF8E7, 0x900D, 0xE1CE, 0x900F, 0xF7E2, 0x9010, 0xF5EF, + 0x9011, 0xCFC7, 0x9014, 0xD4B2, 0x9015, 0xCCEF, 0x9017, 0xD4E8, + 0x9019, 0xEECF, 0x901A, 0xF7D7, 0x901D, 0xE0A6, 0x901E, 0xD6C1, + 0x901F, 0xE1DC, 0x9020, 0xF0E3, 0x9021, 0xF1E4, 0x9022, 0xDCF1, + 0x9023, 0xD6A7, 0x902E, 0xF4F5, 0x9031, 0xF1CE, 0x9032, 0xF2E4, + 0x9035, 0xD0B0, 0x9038, 0xECEF, 0x903C, 0xF9BA, 0x903E, 0xEBB5, + 0x9041, 0xD4ED, 0x9042, 0xE2C4, 0x9047, 0xE9E7, 0x904A, 0xEBB4, + 0x904B, 0xEAA1, 0x904D, 0xF8BC, 0x904E, 0xCEA6, 0x9050, 0xF9C6, + 0x9051, 0xFCDA, 0x9053, 0xD4B3, 0x9054, 0xD3B9, 0x9055, 0xEADE, + 0x9059, 0xE9AB, 0x905C, 0xE1E1, 0x905D, 0xD3CF, 0x905E, 0xF4F6, + 0x9060, 0xEAC0, 0x9061, 0xE1CF, 0x9063, 0xCCBA, 0x9069, 0xEEEA, + 0x906D, 0xF0E4, 0x906E, 0xF3B4, 0x906F, 0xD4EE, 0x9072, 0xF2C0, + 0x9075, 0xF1E5, 0x9077, 0xF4C3, 0x9078, 0xE0D4, 0x907A, 0xEBB6, + 0x907C, 0xD7A1, 0x907D, 0xCBE8, 0x907F, 0xF9AD, 0x9080, 0xE9AD, + 0x9081, 0xD8E4, 0x9082, 0xFAB3, 0x9083, 0xE2C5, 0x9084, 0xFCBD, + 0x9087, 0xECC4, 0x9088, 0xD8B1, 0x908A, 0xDCAB, 0x908F, 0xD5A4, + 0x9091, 0xEBE9, 0x9095, 0xE8BB, 0x9099, 0xD8D7, 0x90A2, 0xFBAE, + 0x90A3, 0xD1E1, 0x90A6, 0xDBC0, 0x90A8, 0xF5BE, 0x90AA, 0xDEF7, + 0x90AF, 0xCAFB, 0x90B0, 0xF7C6, 0x90B1, 0xCFC8, 0x90B5, 0xE1D0, + 0x90B8, 0xEED0, 0x90C1, 0xE9F4, 0x90CA, 0xCEF4, 0x90DE, 0xD5CD, + 0x90E1, 0xCFDB, 0x90E8, 0xDDBB, 0x90ED, 0xCEAC, 0x90F5, 0xE9E8, + 0x90FD, 0xD4B4, 0x9102, 0xE4C7, 0x9112, 0xF5DB, 0x9115, 0xFAC1, + 0x9119, 0xDEA9, 0x9127, 0xD4F8, 0x912D, 0xEFF7, 0x9132, 0xD3B3, + 0x9149, 0xEBB7, 0x914A, 0xEFF8, 0x914B, 0xF5DC, 0x914C, 0xEDCC, + 0x914D, 0xDBD5, 0x914E, 0xF1CF, 0x9152, 0xF1D0, 0x9162, 0xF5B2, + 0x9169, 0xD9AE, 0x916A, 0xD5AC, 0x916C, 0xE2C6, 0x9175, 0xFDA3, + 0x9177, 0xFBE5, 0x9178, 0xDFAB, 0x9187, 0xE2F5, 0x9189, 0xF6AD, + 0x918B, 0xF5B3, 0x918D, 0xF0B5, 0x9192, 0xE1A5, 0x919C, 0xF5DD, + 0x91AB, 0xECA2, 0x91AC, 0xEDFD, 0x91AE, 0xF5B4, 0x91AF, 0xFBB8, + 0x91B1, 0xDBA3, 0x91B4, 0xD6CA, 0x91B5, 0xCBD9, 0x91C0, 0xE5D4, + 0x91C7, 0xF3FA, 0x91C9, 0xEBB8, 0x91CB, 0xE0B7, 0x91CC, 0xD7EC, + 0x91CD, 0xF1EC, 0x91CE, 0xE5AF, 0x91CF, 0xD5E1, 0x91D0, 0xD7ED, + 0x91D1, 0xD1D1, 0x91D7, 0xE1F2, 0x91D8, 0xEFF9, 0x91DC, 0xDDBC, + 0x91DD, 0xF6DC, 0x91E3, 0xF0E5, 0x91E7, 0xF4C4, 0x91EA, 0xE9E9, + 0x91F5, 0xF3FB, 0x920D, 0xD4EF, 0x9210, 0xCCA2, 0x9211, 0xF7FE, + 0x9212, 0xDFBC, 0x9217, 0xEBCD, 0x921E, 0xD0B7, 0x9234, 0xD6C2, + 0x923A, 0xE8AD, 0x923F, 0xEFAF, 0x9240, 0xCBA5, 0x9245, 0xCBE9, + 0x9249, 0xFAE8, 0x9257, 0xCCC6, 0x925B, 0xE6E7, 0x925E, 0xEAC7, + 0x9262, 0xDBA4, 0x9264, 0xCFC9, 0x9265, 0xE2FC, 0x9266, 0xEFFA, + 0x9280, 0xEBDE, 0x9283, 0xF5C8, 0x9285, 0xD4DE, 0x9291, 0xE0D5, + 0x9293, 0xEFB0, 0x9296, 0xE2C7, 0x9298, 0xD9AF, 0x929C, 0xF9E7, + 0x92B3, 0xE7E5, 0x92B6, 0xCFCA, 0x92B7, 0xE1D1, 0x92B9, 0xE2C8, + 0x92CC, 0xEFFB, 0x92CF, 0xFAF9, 0x92D2, 0xDCF2, 0x92E4, 0xE0A7, + 0x92EA, 0xF8E8, 0x92F8, 0xCBEA, 0x92FC, 0xCBBC, 0x9304, 0xD6E2, + 0x9310, 0xF5DE, 0x9318, 0xF5DF, 0x931A, 0xEEB6, 0x931E, 0xE2F6, + 0x931F, 0xD3CA, 0x9320, 0xEFFC, 0x9321, 0xD1C4, 0x9322, 0xEFB1, + 0x9324, 0xD1C5, 0x9326, 0xD0DE, 0x9328, 0xD9E1, 0x932B, 0xE0B8, + 0x932E, 0xCDD1, 0x932F, 0xF3B9, 0x9348, 0xE7CC, 0x934A, 0xD6A8, + 0x934B, 0xCEA7, 0x934D, 0xD4B5, 0x9354, 0xE4C8, 0x935B, 0xD3B4, + 0x936E, 0xEBB9, 0x9375, 0xCBF5, 0x937C, 0xF6DD, 0x937E, 0xF1A3, + 0x938C, 0xCCC7, 0x9394, 0xE9CA, 0x9396, 0xE1F0, 0x939A, 0xF5E0, + 0x93A3, 0xFBAF, 0x93A7, 0xCBD1, 0x93AC, 0xFBE0, 0x93AD, 0xF2E5, + 0x93B0, 0xECF0, 0x93C3, 0xF0EC, 0x93D1, 0xEEEB, 0x93DE, 0xE9CB, + 0x93E1, 0xCCF0, 0x93E4, 0xD7AF, 0x93F6, 0xF3A1, 0x9404, 0xFCF5, + 0x9418, 0xF1A4, 0x9425, 0xE0D6, 0x942B, 0xEFB2, 0x9435, 0xF4D1, + 0x9438, 0xF7A1, 0x9444, 0xF1D1, 0x9451, 0xCAFC, 0x9452, 0xCAFD, + 0x945B, 0xCECE, 0x947D, 0xF3C8, 0x947F, 0xF3BA, 0x9577, 0xEDFE, + 0x9580, 0xDAA6, 0x9583, 0xE0EC, 0x9589, 0xF8CD, 0x958B, 0xCBD2, + 0x958F, 0xEBCE, 0x9591, 0xF9D8, 0x9592, 0xF9D9, 0x9593, 0xCAE0, + 0x9594, 0xDACA, 0x9598, 0xCBA6, 0x95A3, 0xCAC8, 0x95A4, 0xF9EE, + 0x95A5, 0xDBEC, 0x95A8, 0xD0B1, 0x95AD, 0xD5EF, 0x95B1, 0xE6F3, + 0x95BB, 0xE7A2, 0x95BC, 0xE4D9, 0x95C7, 0xE4E1, 0x95CA, 0xFCC4, + 0x95D4, 0xF9EF, 0x95D5, 0xCFF4, 0x95D6, 0xF7E6, 0x95DC, 0xCEBC, + 0x95E1, 0xF4C5, 0x95E2, 0xDCA3, 0x961C, 0xDDBD, 0x9621, 0xF4C6, + 0x962A, 0xF8A1, 0x962E, 0xE8D6, 0x9632, 0xDBC1, 0x963B, 0xF0E6, + 0x963F, 0xE4B9, 0x9640, 0xF6ED, 0x9642, 0xF9AE, 0x9644, 0xDDBE, + 0x964B, 0xD7B0, 0x964C, 0xD8E8, 0x964D, 0xCBBD, 0x9650, 0xF9DA, + 0x965B, 0xF8CE, 0x965C, 0xF9F0, 0x965D, 0xE0ED, 0x965E, 0xE3B3, + 0x965F, 0xF4B3, 0x9662, 0xEAC2, 0x9663, 0xF2E6, 0x9664, 0xF0B6, + 0x966A, 0xDBD6, 0x9670, 0xEBE4, 0x9673, 0xF2E7, 0x9675, 0xD7D5, + 0x9676, 0xD4B6, 0x9677, 0xF9E8, 0x9678, 0xD7C1, 0x967D, 0xE5D5, + 0x9685, 0xE9EA, 0x9686, 0xD7CC, 0x968A, 0xD3E9, 0x968B, 0xE2C9, + 0x968D, 0xFCDB, 0x968E, 0xCDAD, 0x9694, 0xCCB0, 0x9695, 0xEAA2, + 0x9698, 0xE4F6, 0x9699, 0xD0C0, 0x969B, 0xF0B7, 0x969C, 0xEEA1, + 0x96A3, 0xD7F6, 0x96A7, 0xE2CA, 0x96A8, 0xE2CB, 0x96AA, 0xFACF, + 0x96B1, 0xEBDF, 0x96B7, 0xD6CB, 0x96BB, 0xF4B4, 0x96C0, 0xEDCD, + 0x96C1, 0xE4D2, 0x96C4, 0xEAA9, 0x96C5, 0xE4BA, 0x96C6, 0xF3A2, + 0x96C7, 0xCDD2, 0x96C9, 0xF6CB, 0x96CB, 0xF1E6, 0x96CC, 0xEDC1, + 0x96CD, 0xE8BC, 0x96CE, 0xEED1, 0x96D5, 0xF0E7, 0x96D6, 0xE2CC, + 0x96D9, 0xE4AA, 0x96DB, 0xF5E1, 0x96DC, 0xEDDA, 0x96E2, 0xD7EE, + 0x96E3, 0xD1F1, 0x96E8, 0xE9EB, 0x96E9, 0xE9EC, 0x96EA, 0xE0E4, + 0x96EF, 0xDAA7, 0x96F0, 0xDDD4, 0x96F2, 0xEAA3, 0x96F6, 0xD6C3, + 0x96F7, 0xD6F4, 0x96F9, 0xDADF, 0x96FB, 0xEFB3, 0x9700, 0xE2CD, + 0x9706, 0xEFFD, 0x9707, 0xF2E8, 0x9711, 0xEFC5, 0x9713, 0xE7E7, + 0x9716, 0xD7FD, 0x9719, 0xE7CE, 0x971C, 0xDFDC, 0x971E, 0xF9C7, + 0x9727, 0xD9F6, 0x9730, 0xDFAC, 0x9732, 0xD6DA, 0x9739, 0xDCA4, + 0x973D, 0xF0B8, 0x9742, 0xD5FA, 0x9744, 0xE4F7, 0x9748, 0xD6C4, + 0x9751, 0xF4EC, 0x9756, 0xEFFE, 0x975C, 0xF0A1, 0x975E, 0xDEAA, + 0x9761, 0xDABC, 0x9762, 0xD8FC, 0x9769, 0xFAD4, 0x976D, 0xECE5, + 0x9774, 0xFCA8, 0x9777, 0xECE6, 0x977A, 0xD8CB, 0x978B, 0xFBB9, + 0x978D, 0xE4D3, 0x978F, 0xCDF9, 0x97A0, 0xCFD3, 0x97A8, 0xCAEA, + 0x97AB, 0xCFD4, 0x97AD, 0xF8BD, 0x97C6, 0xF4C7, 0x97CB, 0xEADF, + 0x97D3, 0xF9DB, 0x97DC, 0xD4B7, 0x97F3, 0xEBE5, 0x97F6, 0xE1D2, + 0x97FB, 0xEAA4, 0x97FF, 0xFAC2, 0x9800, 0xFBE1, 0x9801, 0xFAED, + 0x9802, 0xF0A2, 0x9803, 0xCCF1, 0x9805, 0xFAA3, 0x9806, 0xE2F7, + 0x9808, 0xE2CE, 0x980A, 0xE9F5, 0x980C, 0xE1EB, 0x9810, 0xE7E8, + 0x9811, 0xE8D7, 0x9812, 0xDAF8, 0x9813, 0xD4CB, 0x9817, 0xF7F6, + 0x9818, 0xD6C5, 0x982D, 0xD4E9, 0x9830, 0xFAFA, 0x9838, 0xCCF2, + 0x9839, 0xF7DD, 0x983B, 0xDEBA, 0x9846, 0xCEA8, 0x984C, 0xF0B9, + 0x984D, 0xE4FE, 0x984E, 0xE4C9, 0x9854, 0xE4D4, 0x9858, 0xEAC3, + 0x985A, 0xEFB4, 0x985E, 0xD7BE, 0x9865, 0xFBE2, 0x9867, 0xCDD3, + 0x986B, 0xEFB5, 0x986F, 0xFAE9, 0x98A8, 0xF9A6, 0x98AF, 0xDFBD, + 0x98B1, 0xF7C7, 0x98C4, 0xF8FD, 0x98C7, 0xF8FC, 0x98DB, 0xDEAB, + 0x98DC, 0xDBE8, 0x98DF, 0xE3DD, 0x98E1, 0xE1E2, 0x98E2, 0xD1C6, + 0x98ED, 0xF6D0, 0x98EE, 0xEBE6, 0x98EF, 0xDAF9, 0x98F4, 0xECC7, + 0x98FC, 0xDEF8, 0x98FD, 0xF8E9, 0x98FE, 0xE3DE, 0x9903, 0xCEF5, + 0x9909, 0xFAC3, 0x990A, 0xE5D7, 0x990C, 0xECC8, 0x9910, 0xF3C9, + 0x9913, 0xE4BB, 0x9918, 0xE6AE, 0x991E, 0xEFB6, 0x9920, 0xDCBF, + 0x9928, 0xCEBD, 0x9945, 0xD8C3, 0x9949, 0xD0CF, 0x994B, 0xCFFA, + 0x994C, 0xF3CA, 0x994D, 0xE0D7, 0x9951, 0xD1C7, 0x9952, 0xE9AE, + 0x9954, 0xE8BD, 0x9957, 0xFAC4, 0x9996, 0xE2CF, 0x9999, 0xFAC5, + 0x999D, 0xF9B8, 0x99A5, 0xDCE0, 0x99A8, 0xFBB0, 0x99AC, 0xD8A9, + 0x99AD, 0xE5DF, 0x99AE, 0xF9A7, 0x99B1, 0xF6EE, 0x99B3, 0xF6CC, + 0x99B4, 0xE2F8, 0x99B9, 0xECF1, 0x99C1, 0xDAE0, 0x99D0, 0xF1D2, + 0x99D1, 0xD2CC, 0x99D2, 0xCFCB, 0x99D5, 0xCABD, 0x99D9, 0xDDBF, + 0x99DD, 0xF6EF, 0x99DF, 0xDEF9, 0x99ED, 0xFAB4, 0x99F1, 0xD5AD, + 0x99FF, 0xF1E7, 0x9A01, 0xDEBE, 0x9A08, 0xDCC0, 0x9A0E, 0xD1C8, + 0x9A0F, 0xD1C9, 0x9A19, 0xF8BE, 0x9A2B, 0xCBF6, 0x9A30, 0xD4F9, + 0x9A36, 0xF5E2, 0x9A37, 0xE1D3, 0x9A40, 0xD8E9, 0x9A43, 0xF8FE, + 0x9A45, 0xCFCC, 0x9A4D, 0xFDA4, 0x9A55, 0xCEF6, 0x9A57, 0xFAD0, + 0x9A5A, 0xCCF3, 0x9A5B, 0xE6BE, 0x9A5F, 0xF6AE, 0x9A62, 0xD5F0, + 0x9A65, 0xD1CA, 0x9A69, 0xFCBE, 0x9A6A, 0xD5F1, 0x9AA8, 0xCDE9, + 0x9AB8, 0xFAB5, 0x9AD3, 0xE2D0, 0x9AD4, 0xF4F7, 0x9AD8, 0xCDD4, + 0x9AE5, 0xE7A3, 0x9AEE, 0xDBA5, 0x9B1A, 0xE2D1, 0x9B27, 0xD7A2, + 0x9B2A, 0xF7E3, 0x9B31, 0xEAA6, 0x9B3C, 0xD0A1, 0x9B41, 0xCEDA, + 0x9B42, 0xFBEB, 0x9B43, 0xDBA6, 0x9B44, 0xDBDE, 0x9B45, 0xD8E5, + 0x9B4F, 0xEAE0, 0x9B54, 0xD8AA, 0x9B5A, 0xE5E0, 0x9B6F, 0xD6DB, + 0x9B8E, 0xEFC6, 0x9B91, 0xF8EA, 0x9B9F, 0xE4D5, 0x9BAB, 0xCEF7, + 0x9BAE, 0xE0D8, 0x9BC9, 0xD7EF, 0x9BD6, 0xF4ED, 0x9BE4, 0xCDE6, + 0x9BE8, 0xCCF4, 0x9C0D, 0xF5E3, 0x9C10, 0xE4CA, 0x9C12, 0xDCE1, + 0x9C15, 0xF9C8, 0x9C25, 0xFCBF, 0x9C32, 0xE8A7, 0x9C3B, 0xD8C4, + 0x9C47, 0xCBBE, 0x9C49, 0xDCAE, 0x9C57, 0xD7F7, 0x9CE5, 0xF0E8, + 0x9CE7, 0xDDC0, 0x9CE9, 0xCFCD, 0x9CF3, 0xDCF3, 0x9CF4, 0xD9B0, + 0x9CF6, 0xE6E9, 0x9D09, 0xE4BC, 0x9D1B, 0xEAC4, 0x9D26, 0xE4EC, + 0x9D28, 0xE4E5, 0x9D3B, 0xFBF8, 0x9D51, 0xCCBB, 0x9D5D, 0xE4BD, + 0x9D60, 0xCDDC, 0x9D61, 0xD9F7, 0x9D6C, 0xDDDF, 0x9D72, 0xEDCE, + 0x9DA9, 0xD9D0, 0x9DAF, 0xE5A3, 0x9DB4, 0xF9CD, 0x9DC4, 0xCDAE, + 0x9DD7, 0xCFCE, 0x9DF2, 0xF6AF, 0x9DF8, 0xFDD3, 0x9DF9, 0xEBED, + 0x9DFA, 0xD6DC, 0x9E1A, 0xE5A4, 0x9E1E, 0xD5B6, 0x9E75, 0xD6DD, + 0x9E79, 0xF9E9, 0x9E7D, 0xE7A4, 0x9E7F, 0xD6E3, 0x9E92, 0xD1CB, + 0x9E93, 0xD6E4, 0x9E97, 0xD5F2, 0x9E9D, 0xDEFA, 0x9E9F, 0xD7F8, + 0x9EA5, 0xD8EA, 0x9EB4, 0xCFD5, 0x9EB5, 0xD8FD, 0x9EBB, 0xD8AB, + 0x9EBE, 0xFDCB, 0x9EC3, 0xFCDC, 0x9ECD, 0xE0A8, 0x9ECE, 0xD5F3, + 0x9ED1, 0xFDD9, 0x9ED4, 0xCCA3, 0x9ED8, 0xD9F9, 0x9EDB, 0xD3EA, + 0x9EDC, 0xF5F5, 0x9EDE, 0xEFC7, 0x9EE8, 0xD3DA, 0x9EF4, 0xDABD, + 0x9F07, 0xE8A8, 0x9F08, 0xDCAF, 0x9F0E, 0xF0A3, 0x9F13, 0xCDD5, + 0x9F20, 0xE0A9, 0x9F3B, 0xDEAC, 0x9F4A, 0xF0BA, 0x9F4B, 0xEEB1, + 0x9F4E, 0xEEB2, 0x9F52, 0xF6CD, 0x9F5F, 0xEED2, 0x9F61, 0xD6C6, + 0x9F67, 0xE0E5, 0x9F6A, 0xF3BB, 0x9F6C, 0xE5E1, 0x9F77, 0xE4CB, + 0x9F8D, 0xD7A3, 0x9F90, 0xDBC2, 0x9F95, 0xCAFE, 0x9F9C, 0xCFCF, + 0xAC00, 0xB0A1, 0xAC01, 0xB0A2, 0xAC02, 0x8141, 0xAC03, 0x8142, + 0xAC04, 0xB0A3, 0xAC05, 0x8143, 0xAC06, 0x8144, 0xAC07, 0xB0A4, + 0xAC08, 0xB0A5, 0xAC09, 0xB0A6, 0xAC0A, 0xB0A7, 0xAC0B, 0x8145, + 0xAC0C, 0x8146, 0xAC0D, 0x8147, 0xAC0E, 0x8148, 0xAC0F, 0x8149, + 0xAC10, 0xB0A8, 0xAC11, 0xB0A9, 0xAC12, 0xB0AA, 0xAC13, 0xB0AB, + 0xAC14, 0xB0AC, 0xAC15, 0xB0AD, 0xAC16, 0xB0AE, 0xAC17, 0xB0AF, + 0xAC18, 0x814A, 0xAC19, 0xB0B0, 0xAC1A, 0xB0B1, 0xAC1B, 0xB0B2, + 0xAC1C, 0xB0B3, 0xAC1D, 0xB0B4, 0xAC1E, 0x814B, 0xAC1F, 0x814C, + 0xAC20, 0xB0B5, 0xAC21, 0x814D, 0xAC22, 0x814E, 0xAC23, 0x814F, + 0xAC24, 0xB0B6, 0xAC25, 0x8150, 0xAC26, 0x8151, 0xAC27, 0x8152, + 0xAC28, 0x8153, 0xAC29, 0x8154, 0xAC2A, 0x8155, 0xAC2B, 0x8156, + 0xAC2C, 0xB0B7, 0xAC2D, 0xB0B8, 0xAC2E, 0x8157, 0xAC2F, 0xB0B9, + 0xAC30, 0xB0BA, 0xAC31, 0xB0BB, 0xAC32, 0x8158, 0xAC33, 0x8159, + 0xAC34, 0x815A, 0xAC35, 0x8161, 0xAC36, 0x8162, 0xAC37, 0x8163, + 0xAC38, 0xB0BC, 0xAC39, 0xB0BD, 0xAC3A, 0x8164, 0xAC3B, 0x8165, + 0xAC3C, 0xB0BE, 0xAC3D, 0x8166, 0xAC3E, 0x8167, 0xAC3F, 0x8168, + 0xAC40, 0xB0BF, 0xAC41, 0x8169, 0xAC42, 0x816A, 0xAC43, 0x816B, + 0xAC44, 0x816C, 0xAC45, 0x816D, 0xAC46, 0x816E, 0xAC47, 0x816F, + 0xAC48, 0x8170, 0xAC49, 0x8171, 0xAC4A, 0x8172, 0xAC4B, 0xB0C0, + 0xAC4C, 0x8173, 0xAC4D, 0xB0C1, 0xAC4E, 0x8174, 0xAC4F, 0x8175, + 0xAC50, 0x8176, 0xAC51, 0x8177, 0xAC52, 0x8178, 0xAC53, 0x8179, + 0xAC54, 0xB0C2, 0xAC55, 0x817A, 0xAC56, 0x8181, 0xAC57, 0x8182, + 0xAC58, 0xB0C3, 0xAC59, 0x8183, 0xAC5A, 0x8184, 0xAC5B, 0x8185, + 0xAC5C, 0xB0C4, 0xAC5D, 0x8186, 0xAC5E, 0x8187, 0xAC5F, 0x8188, + 0xAC60, 0x8189, 0xAC61, 0x818A, 0xAC62, 0x818B, 0xAC63, 0x818C, + 0xAC64, 0x818D, 0xAC65, 0x818E, 0xAC66, 0x818F, 0xAC67, 0x8190, + 0xAC68, 0x8191, 0xAC69, 0x8192, 0xAC6A, 0x8193, 0xAC6B, 0x8194, + 0xAC6C, 0x8195, 0xAC6D, 0x8196, 0xAC6E, 0x8197, 0xAC6F, 0x8198, + 0xAC70, 0xB0C5, 0xAC71, 0xB0C6, 0xAC72, 0x8199, 0xAC73, 0x819A, + 0xAC74, 0xB0C7, 0xAC75, 0x819B, 0xAC76, 0x819C, 0xAC77, 0xB0C8, + 0xAC78, 0xB0C9, 0xAC79, 0x819D, 0xAC7A, 0xB0CA, 0xAC7B, 0x819E, + 0xAC7C, 0x819F, 0xAC7D, 0x81A0, 0xAC7E, 0x81A1, 0xAC7F, 0x81A2, + 0xAC80, 0xB0CB, 0xAC81, 0xB0CC, 0xAC82, 0x81A3, 0xAC83, 0xB0CD, + 0xAC84, 0xB0CE, 0xAC85, 0xB0CF, 0xAC86, 0xB0D0, 0xAC87, 0x81A4, + 0xAC88, 0x81A5, 0xAC89, 0xB0D1, 0xAC8A, 0xB0D2, 0xAC8B, 0xB0D3, + 0xAC8C, 0xB0D4, 0xAC8D, 0x81A6, 0xAC8E, 0x81A7, 0xAC8F, 0x81A8, + 0xAC90, 0xB0D5, 0xAC91, 0x81A9, 0xAC92, 0x81AA, 0xAC93, 0x81AB, + 0xAC94, 0xB0D6, 0xAC95, 0x81AC, 0xAC96, 0x81AD, 0xAC97, 0x81AE, + 0xAC98, 0x81AF, 0xAC99, 0x81B0, 0xAC9A, 0x81B1, 0xAC9B, 0x81B2, + 0xAC9C, 0xB0D7, 0xAC9D, 0xB0D8, 0xAC9E, 0x81B3, 0xAC9F, 0xB0D9, + 0xACA0, 0xB0DA, 0xACA1, 0xB0DB, 0xACA2, 0x81B4, 0xACA3, 0x81B5, + 0xACA4, 0x81B6, 0xACA5, 0x81B7, 0xACA6, 0x81B8, 0xACA7, 0x81B9, + 0xACA8, 0xB0DC, 0xACA9, 0xB0DD, 0xACAA, 0xB0DE, 0xACAB, 0x81BA, + 0xACAC, 0xB0DF, 0xACAD, 0x81BB, 0xACAE, 0x81BC, 0xACAF, 0xB0E0, + 0xACB0, 0xB0E1, 0xACB1, 0x81BD, 0xACB2, 0x81BE, 0xACB3, 0x81BF, + 0xACB4, 0x81C0, 0xACB5, 0x81C1, 0xACB6, 0x81C2, 0xACB7, 0x81C3, + 0xACB8, 0xB0E2, 0xACB9, 0xB0E3, 0xACBA, 0x81C4, 0xACBB, 0xB0E4, + 0xACBC, 0xB0E5, 0xACBD, 0xB0E6, 0xACBE, 0x81C5, 0xACBF, 0x81C6, + 0xACC0, 0x81C7, 0xACC1, 0xB0E7, 0xACC2, 0x81C8, 0xACC3, 0x81C9, + 0xACC4, 0xB0E8, 0xACC5, 0x81CA, 0xACC6, 0x81CB, 0xACC7, 0x81CC, + 0xACC8, 0xB0E9, 0xACC9, 0x81CD, 0xACCA, 0x81CE, 0xACCB, 0x81CF, + 0xACCC, 0xB0EA, 0xACCD, 0x81D0, 0xACCE, 0x81D1, 0xACCF, 0x81D2, + 0xACD0, 0x81D3, 0xACD1, 0x81D4, 0xACD2, 0x81D5, 0xACD3, 0x81D6, + 0xACD4, 0x81D7, 0xACD5, 0xB0EB, 0xACD6, 0x81D8, 0xACD7, 0xB0EC, + 0xACD8, 0x81D9, 0xACD9, 0x81DA, 0xACDA, 0x81DB, 0xACDB, 0x81DC, + 0xACDC, 0x81DD, 0xACDD, 0x81DE, 0xACDE, 0x81DF, 0xACDF, 0x81E0, + 0xACE0, 0xB0ED, 0xACE1, 0xB0EE, 0xACE2, 0x81E1, 0xACE3, 0x81E2, + 0xACE4, 0xB0EF, 0xACE5, 0x81E3, 0xACE6, 0x81E4, 0xACE7, 0xB0F0, + 0xACE8, 0xB0F1, 0xACE9, 0x81E5, 0xACEA, 0xB0F2, 0xACEB, 0x81E6, + 0xACEC, 0xB0F3, 0xACED, 0x81E7, 0xACEE, 0x81E8, 0xACEF, 0xB0F4, + 0xACF0, 0xB0F5, 0xACF1, 0xB0F6, 0xACF2, 0x81E9, 0xACF3, 0xB0F7, + 0xACF4, 0x81EA, 0xACF5, 0xB0F8, 0xACF6, 0xB0F9, 0xACF7, 0x81EB, + 0xACF8, 0x81EC, 0xACF9, 0x81ED, 0xACFA, 0x81EE, 0xACFB, 0x81EF, + 0xACFC, 0xB0FA, 0xACFD, 0xB0FB, 0xACFE, 0x81F0, 0xACFF, 0x81F1, + 0xAD00, 0xB0FC, 0xAD01, 0x81F2, 0xAD02, 0x81F3, 0xAD03, 0x81F4, + 0xAD04, 0xB0FD, 0xAD05, 0x81F5, 0xAD06, 0xB0FE, 0xAD07, 0x81F6, + 0xAD08, 0x81F7, 0xAD09, 0x81F8, 0xAD0A, 0x81F9, 0xAD0B, 0x81FA, + 0xAD0C, 0xB1A1, 0xAD0D, 0xB1A2, 0xAD0E, 0x81FB, 0xAD0F, 0xB1A3, + 0xAD10, 0x81FC, 0xAD11, 0xB1A4, 0xAD12, 0x81FD, 0xAD13, 0x81FE, + 0xAD14, 0x8241, 0xAD15, 0x8242, 0xAD16, 0x8243, 0xAD17, 0x8244, + 0xAD18, 0xB1A5, 0xAD19, 0x8245, 0xAD1A, 0x8246, 0xAD1B, 0x8247, + 0xAD1C, 0xB1A6, 0xAD1D, 0x8248, 0xAD1E, 0x8249, 0xAD1F, 0x824A, + 0xAD20, 0xB1A7, 0xAD21, 0x824B, 0xAD22, 0x824C, 0xAD23, 0x824D, + 0xAD24, 0x824E, 0xAD25, 0x824F, 0xAD26, 0x8250, 0xAD27, 0x8251, + 0xAD28, 0x8252, 0xAD29, 0xB1A8, 0xAD2A, 0x8253, 0xAD2B, 0x8254, + 0xAD2C, 0xB1A9, 0xAD2D, 0xB1AA, 0xAD2E, 0x8255, 0xAD2F, 0x8256, + 0xAD30, 0x8257, 0xAD31, 0x8258, 0xAD32, 0x8259, 0xAD33, 0x825A, + 0xAD34, 0xB1AB, 0xAD35, 0xB1AC, 0xAD36, 0x8261, 0xAD37, 0x8262, + 0xAD38, 0xB1AD, 0xAD39, 0x8263, 0xAD3A, 0x8264, 0xAD3B, 0x8265, + 0xAD3C, 0xB1AE, 0xAD3D, 0x8266, 0xAD3E, 0x8267, 0xAD3F, 0x8268, + 0xAD40, 0x8269, 0xAD41, 0x826A, 0xAD42, 0x826B, 0xAD43, 0x826C, + 0xAD44, 0xB1AF, 0xAD45, 0xB1B0, 0xAD46, 0x826D, 0xAD47, 0xB1B1, + 0xAD48, 0x826E, 0xAD49, 0xB1B2, 0xAD4A, 0x826F, 0xAD4B, 0x8270, + 0xAD4C, 0x8271, 0xAD4D, 0x8272, 0xAD4E, 0x8273, 0xAD4F, 0x8274, + 0xAD50, 0xB1B3, 0xAD51, 0x8275, 0xAD52, 0x8276, 0xAD53, 0x8277, + 0xAD54, 0xB1B4, 0xAD55, 0x8278, 0xAD56, 0x8279, 0xAD57, 0x827A, + 0xAD58, 0xB1B5, 0xAD59, 0x8281, 0xAD5A, 0x8282, 0xAD5B, 0x8283, + 0xAD5C, 0x8284, 0xAD5D, 0x8285, 0xAD5E, 0x8286, 0xAD5F, 0x8287, + 0xAD60, 0x8288, 0xAD61, 0xB1B6, 0xAD62, 0x8289, 0xAD63, 0xB1B7, + 0xAD64, 0x828A, 0xAD65, 0x828B, 0xAD66, 0x828C, 0xAD67, 0x828D, + 0xAD68, 0x828E, 0xAD69, 0x828F, 0xAD6A, 0x8290, 0xAD6B, 0x8291, + 0xAD6C, 0xB1B8, 0xAD6D, 0xB1B9, 0xAD6E, 0x8292, 0xAD6F, 0x8293, + 0xAD70, 0xB1BA, 0xAD71, 0x8294, 0xAD72, 0x8295, 0xAD73, 0xB1BB, + 0xAD74, 0xB1BC, 0xAD75, 0xB1BD, 0xAD76, 0xB1BE, 0xAD77, 0x8296, + 0xAD78, 0x8297, 0xAD79, 0x8298, 0xAD7A, 0x8299, 0xAD7B, 0xB1BF, + 0xAD7C, 0xB1C0, 0xAD7D, 0xB1C1, 0xAD7E, 0x829A, 0xAD7F, 0xB1C2, + 0xAD80, 0x829B, 0xAD81, 0xB1C3, 0xAD82, 0xB1C4, 0xAD83, 0x829C, + 0xAD84, 0x829D, 0xAD85, 0x829E, 0xAD86, 0x829F, 0xAD87, 0x82A0, + 0xAD88, 0xB1C5, 0xAD89, 0xB1C6, 0xAD8A, 0x82A1, 0xAD8B, 0x82A2, + 0xAD8C, 0xB1C7, 0xAD8D, 0x82A3, 0xAD8E, 0x82A4, 0xAD8F, 0x82A5, + 0xAD90, 0xB1C8, 0xAD91, 0x82A6, 0xAD92, 0x82A7, 0xAD93, 0x82A8, + 0xAD94, 0x82A9, 0xAD95, 0x82AA, 0xAD96, 0x82AB, 0xAD97, 0x82AC, + 0xAD98, 0x82AD, 0xAD99, 0x82AE, 0xAD9A, 0x82AF, 0xAD9B, 0x82B0, + 0xAD9C, 0xB1C9, 0xAD9D, 0xB1CA, 0xAD9E, 0x82B1, 0xAD9F, 0x82B2, + 0xADA0, 0x82B3, 0xADA1, 0x82B4, 0xADA2, 0x82B5, 0xADA3, 0x82B6, + 0xADA4, 0xB1CB, 0xADA5, 0x82B7, 0xADA6, 0x82B8, 0xADA7, 0x82B9, + 0xADA8, 0x82BA, 0xADA9, 0x82BB, 0xADAA, 0x82BC, 0xADAB, 0x82BD, + 0xADAC, 0x82BE, 0xADAD, 0x82BF, 0xADAE, 0x82C0, 0xADAF, 0x82C1, + 0xADB0, 0x82C2, 0xADB1, 0x82C3, 0xADB2, 0x82C4, 0xADB3, 0x82C5, + 0xADB4, 0x82C6, 0xADB5, 0x82C7, 0xADB6, 0x82C8, 0xADB7, 0xB1CC, + 0xADB8, 0x82C9, 0xADB9, 0x82CA, 0xADBA, 0x82CB, 0xADBB, 0x82CC, + 0xADBC, 0x82CD, 0xADBD, 0x82CE, 0xADBE, 0x82CF, 0xADBF, 0x82D0, + 0xADC0, 0xB1CD, 0xADC1, 0xB1CE, 0xADC2, 0x82D1, 0xADC3, 0x82D2, + 0xADC4, 0xB1CF, 0xADC5, 0x82D3, 0xADC6, 0x82D4, 0xADC7, 0x82D5, + 0xADC8, 0xB1D0, 0xADC9, 0x82D6, 0xADCA, 0x82D7, 0xADCB, 0x82D8, + 0xADCC, 0x82D9, 0xADCD, 0x82DA, 0xADCE, 0x82DB, 0xADCF, 0x82DC, + 0xADD0, 0xB1D1, 0xADD1, 0xB1D2, 0xADD2, 0x82DD, 0xADD3, 0xB1D3, + 0xADD4, 0x82DE, 0xADD5, 0x82DF, 0xADD6, 0x82E0, 0xADD7, 0x82E1, + 0xADD8, 0x82E2, 0xADD9, 0x82E3, 0xADDA, 0x82E4, 0xADDB, 0x82E5, + 0xADDC, 0xB1D4, 0xADDD, 0x82E6, 0xADDE, 0x82E7, 0xADDF, 0x82E8, + 0xADE0, 0xB1D5, 0xADE1, 0x82E9, 0xADE2, 0x82EA, 0xADE3, 0x82EB, + 0xADE4, 0xB1D6, 0xADE5, 0x82EC, 0xADE6, 0x82ED, 0xADE7, 0x82EE, + 0xADE8, 0x82EF, 0xADE9, 0x82F0, 0xADEA, 0x82F1, 0xADEB, 0x82F2, + 0xADEC, 0x82F3, 0xADED, 0x82F4, 0xADEE, 0x82F5, 0xADEF, 0x82F6, + 0xADF0, 0x82F7, 0xADF1, 0x82F8, 0xADF2, 0x82F9, 0xADF3, 0x82FA, + 0xADF4, 0x82FB, 0xADF5, 0x82FC, 0xADF6, 0x82FD, 0xADF7, 0x82FE, + 0xADF8, 0xB1D7, 0xADF9, 0xB1D8, 0xADFA, 0x8341, 0xADFB, 0x8342, + 0xADFC, 0xB1D9, 0xADFD, 0x8343, 0xADFE, 0x8344, 0xADFF, 0xB1DA, + 0xAE00, 0xB1DB, 0xAE01, 0xB1DC, 0xAE02, 0x8345, 0xAE03, 0x8346, + 0xAE04, 0x8347, 0xAE05, 0x8348, 0xAE06, 0x8349, 0xAE07, 0x834A, + 0xAE08, 0xB1DD, 0xAE09, 0xB1DE, 0xAE0A, 0x834B, 0xAE0B, 0xB1DF, + 0xAE0C, 0x834C, 0xAE0D, 0xB1E0, 0xAE0E, 0x834D, 0xAE0F, 0x834E, + 0xAE10, 0x834F, 0xAE11, 0x8350, 0xAE12, 0x8351, 0xAE13, 0x8352, + 0xAE14, 0xB1E1, 0xAE15, 0x8353, 0xAE16, 0x8354, 0xAE17, 0x8355, + 0xAE18, 0x8356, 0xAE19, 0x8357, 0xAE1A, 0x8358, 0xAE1B, 0x8359, + 0xAE1C, 0x835A, 0xAE1D, 0x8361, 0xAE1E, 0x8362, 0xAE1F, 0x8363, + 0xAE20, 0x8364, 0xAE21, 0x8365, 0xAE22, 0x8366, 0xAE23, 0x8367, + 0xAE24, 0x8368, 0xAE25, 0x8369, 0xAE26, 0x836A, 0xAE27, 0x836B, + 0xAE28, 0x836C, 0xAE29, 0x836D, 0xAE2A, 0x836E, 0xAE2B, 0x836F, + 0xAE2C, 0x8370, 0xAE2D, 0x8371, 0xAE2E, 0x8372, 0xAE2F, 0x8373, + 0xAE30, 0xB1E2, 0xAE31, 0xB1E3, 0xAE32, 0x8374, 0xAE33, 0x8375, + 0xAE34, 0xB1E4, 0xAE35, 0x8376, 0xAE36, 0x8377, 0xAE37, 0xB1E5, + 0xAE38, 0xB1E6, 0xAE39, 0x8378, 0xAE3A, 0xB1E7, 0xAE3B, 0x8379, + 0xAE3C, 0x837A, 0xAE3D, 0x8381, 0xAE3E, 0x8382, 0xAE3F, 0x8383, + 0xAE40, 0xB1E8, 0xAE41, 0xB1E9, 0xAE42, 0x8384, 0xAE43, 0xB1EA, + 0xAE44, 0x8385, 0xAE45, 0xB1EB, 0xAE46, 0xB1EC, 0xAE47, 0x8386, + 0xAE48, 0x8387, 0xAE49, 0x8388, 0xAE4A, 0xB1ED, 0xAE4B, 0x8389, + 0xAE4C, 0xB1EE, 0xAE4D, 0xB1EF, 0xAE4E, 0xB1F0, 0xAE4F, 0x838A, + 0xAE50, 0xB1F1, 0xAE51, 0x838B, 0xAE52, 0x838C, 0xAE53, 0x838D, + 0xAE54, 0xB1F2, 0xAE55, 0x838E, 0xAE56, 0xB1F3, 0xAE57, 0x838F, + 0xAE58, 0x8390, 0xAE59, 0x8391, 0xAE5A, 0x8392, 0xAE5B, 0x8393, + 0xAE5C, 0xB1F4, 0xAE5D, 0xB1F5, 0xAE5E, 0x8394, 0xAE5F, 0xB1F6, + 0xAE60, 0xB1F7, 0xAE61, 0xB1F8, 0xAE62, 0x8395, 0xAE63, 0x8396, + 0xAE64, 0x8397, 0xAE65, 0xB1F9, 0xAE66, 0x8398, 0xAE67, 0x8399, + 0xAE68, 0xB1FA, 0xAE69, 0xB1FB, 0xAE6A, 0x839A, 0xAE6B, 0x839B, + 0xAE6C, 0xB1FC, 0xAE6D, 0x839C, 0xAE6E, 0x839D, 0xAE6F, 0x839E, + 0xAE70, 0xB1FD, 0xAE71, 0x839F, 0xAE72, 0x83A0, 0xAE73, 0x83A1, + 0xAE74, 0x83A2, 0xAE75, 0x83A3, 0xAE76, 0x83A4, 0xAE77, 0x83A5, + 0xAE78, 0xB1FE, 0xAE79, 0xB2A1, 0xAE7A, 0x83A6, 0xAE7B, 0xB2A2, + 0xAE7C, 0xB2A3, 0xAE7D, 0xB2A4, 0xAE7E, 0x83A7, 0xAE7F, 0x83A8, + 0xAE80, 0x83A9, 0xAE81, 0x83AA, 0xAE82, 0x83AB, 0xAE83, 0x83AC, + 0xAE84, 0xB2A5, 0xAE85, 0xB2A6, 0xAE86, 0x83AD, 0xAE87, 0x83AE, + 0xAE88, 0x83AF, 0xAE89, 0x83B0, 0xAE8A, 0x83B1, 0xAE8B, 0x83B2, + 0xAE8C, 0xB2A7, 0xAE8D, 0x83B3, 0xAE8E, 0x83B4, 0xAE8F, 0x83B5, + 0xAE90, 0x83B6, 0xAE91, 0x83B7, 0xAE92, 0x83B8, 0xAE93, 0x83B9, + 0xAE94, 0x83BA, 0xAE95, 0x83BB, 0xAE96, 0x83BC, 0xAE97, 0x83BD, + 0xAE98, 0x83BE, 0xAE99, 0x83BF, 0xAE9A, 0x83C0, 0xAE9B, 0x83C1, + 0xAE9C, 0x83C2, 0xAE9D, 0x83C3, 0xAE9E, 0x83C4, 0xAE9F, 0x83C5, + 0xAEA0, 0x83C6, 0xAEA1, 0x83C7, 0xAEA2, 0x83C8, 0xAEA3, 0x83C9, + 0xAEA4, 0x83CA, 0xAEA5, 0x83CB, 0xAEA6, 0x83CC, 0xAEA7, 0x83CD, + 0xAEA8, 0x83CE, 0xAEA9, 0x83CF, 0xAEAA, 0x83D0, 0xAEAB, 0x83D1, + 0xAEAC, 0x83D2, 0xAEAD, 0x83D3, 0xAEAE, 0x83D4, 0xAEAF, 0x83D5, + 0xAEB0, 0x83D6, 0xAEB1, 0x83D7, 0xAEB2, 0x83D8, 0xAEB3, 0x83D9, + 0xAEB4, 0x83DA, 0xAEB5, 0x83DB, 0xAEB6, 0x83DC, 0xAEB7, 0x83DD, + 0xAEB8, 0x83DE, 0xAEB9, 0x83DF, 0xAEBA, 0x83E0, 0xAEBB, 0x83E1, + 0xAEBC, 0xB2A8, 0xAEBD, 0xB2A9, 0xAEBE, 0xB2AA, 0xAEBF, 0x83E2, + 0xAEC0, 0xB2AB, 0xAEC1, 0x83E3, 0xAEC2, 0x83E4, 0xAEC3, 0x83E5, + 0xAEC4, 0xB2AC, 0xAEC5, 0x83E6, 0xAEC6, 0x83E7, 0xAEC7, 0x83E8, + 0xAEC8, 0x83E9, 0xAEC9, 0x83EA, 0xAECA, 0x83EB, 0xAECB, 0x83EC, + 0xAECC, 0xB2AD, 0xAECD, 0xB2AE, 0xAECE, 0x83ED, 0xAECF, 0xB2AF, + 0xAED0, 0xB2B0, 0xAED1, 0xB2B1, 0xAED2, 0x83EE, 0xAED3, 0x83EF, + 0xAED4, 0x83F0, 0xAED5, 0x83F1, 0xAED6, 0x83F2, 0xAED7, 0x83F3, + 0xAED8, 0xB2B2, 0xAED9, 0xB2B3, 0xAEDA, 0x83F4, 0xAEDB, 0x83F5, + 0xAEDC, 0xB2B4, 0xAEDD, 0x83F6, 0xAEDE, 0x83F7, 0xAEDF, 0x83F8, + 0xAEE0, 0x83F9, 0xAEE1, 0x83FA, 0xAEE2, 0x83FB, 0xAEE3, 0x83FC, + 0xAEE4, 0x83FD, 0xAEE5, 0x83FE, 0xAEE6, 0x8441, 0xAEE7, 0x8442, + 0xAEE8, 0xB2B5, 0xAEE9, 0x8443, 0xAEEA, 0x8444, 0xAEEB, 0xB2B6, + 0xAEEC, 0x8445, 0xAEED, 0xB2B7, 0xAEEE, 0x8446, 0xAEEF, 0x8447, + 0xAEF0, 0x8448, 0xAEF1, 0x8449, 0xAEF2, 0x844A, 0xAEF3, 0x844B, + 0xAEF4, 0xB2B8, 0xAEF5, 0x844C, 0xAEF6, 0x844D, 0xAEF7, 0x844E, + 0xAEF8, 0xB2B9, 0xAEF9, 0x844F, 0xAEFA, 0x8450, 0xAEFB, 0x8451, + 0xAEFC, 0xB2BA, 0xAEFD, 0x8452, 0xAEFE, 0x8453, 0xAEFF, 0x8454, + 0xAF00, 0x8455, 0xAF01, 0x8456, 0xAF02, 0x8457, 0xAF03, 0x8458, + 0xAF04, 0x8459, 0xAF05, 0x845A, 0xAF06, 0x8461, 0xAF07, 0xB2BB, + 0xAF08, 0xB2BC, 0xAF09, 0x8462, 0xAF0A, 0x8463, 0xAF0B, 0x8464, + 0xAF0C, 0x8465, 0xAF0D, 0xB2BD, 0xAF0E, 0x8466, 0xAF0F, 0x8467, + 0xAF10, 0xB2BE, 0xAF11, 0x8468, 0xAF12, 0x8469, 0xAF13, 0x846A, + 0xAF14, 0x846B, 0xAF15, 0x846C, 0xAF16, 0x846D, 0xAF17, 0x846E, + 0xAF18, 0x846F, 0xAF19, 0x8470, 0xAF1A, 0x8471, 0xAF1B, 0x8472, + 0xAF1C, 0x8473, 0xAF1D, 0x8474, 0xAF1E, 0x8475, 0xAF1F, 0x8476, + 0xAF20, 0x8477, 0xAF21, 0x8478, 0xAF22, 0x8479, 0xAF23, 0x847A, + 0xAF24, 0x8481, 0xAF25, 0x8482, 0xAF26, 0x8483, 0xAF27, 0x8484, + 0xAF28, 0x8485, 0xAF29, 0x8486, 0xAF2A, 0x8487, 0xAF2B, 0x8488, + 0xAF2C, 0xB2BF, 0xAF2D, 0xB2C0, 0xAF2E, 0x8489, 0xAF2F, 0x848A, + 0xAF30, 0xB2C1, 0xAF31, 0x848B, 0xAF32, 0xB2C2, 0xAF33, 0x848C, + 0xAF34, 0xB2C3, 0xAF35, 0x848D, 0xAF36, 0x848E, 0xAF37, 0x848F, + 0xAF38, 0x8490, 0xAF39, 0x8491, 0xAF3A, 0x8492, 0xAF3B, 0x8493, + 0xAF3C, 0xB2C4, 0xAF3D, 0xB2C5, 0xAF3E, 0x8494, 0xAF3F, 0xB2C6, + 0xAF40, 0x8495, 0xAF41, 0xB2C7, 0xAF42, 0xB2C8, 0xAF43, 0xB2C9, + 0xAF44, 0x8496, 0xAF45, 0x8497, 0xAF46, 0x8498, 0xAF47, 0x8499, + 0xAF48, 0xB2CA, 0xAF49, 0xB2CB, 0xAF4A, 0x849A, 0xAF4B, 0x849B, + 0xAF4C, 0x849C, 0xAF4D, 0x849D, 0xAF4E, 0x849E, 0xAF4F, 0x849F, + 0xAF50, 0xB2CC, 0xAF51, 0x84A0, 0xAF52, 0x84A1, 0xAF53, 0x84A2, + 0xAF54, 0x84A3, 0xAF55, 0x84A4, 0xAF56, 0x84A5, 0xAF57, 0x84A6, + 0xAF58, 0x84A7, 0xAF59, 0x84A8, 0xAF5A, 0x84A9, 0xAF5B, 0x84AA, + 0xAF5C, 0xB2CD, 0xAF5D, 0xB2CE, 0xAF5E, 0x84AB, 0xAF5F, 0x84AC, + 0xAF60, 0x84AD, 0xAF61, 0x84AE, 0xAF62, 0x84AF, 0xAF63, 0x84B0, + 0xAF64, 0xB2CF, 0xAF65, 0xB2D0, 0xAF66, 0x84B1, 0xAF67, 0x84B2, + 0xAF68, 0x84B3, 0xAF69, 0x84B4, 0xAF6A, 0x84B5, 0xAF6B, 0x84B6, + 0xAF6C, 0x84B7, 0xAF6D, 0x84B8, 0xAF6E, 0x84B9, 0xAF6F, 0x84BA, + 0xAF70, 0x84BB, 0xAF71, 0x84BC, 0xAF72, 0x84BD, 0xAF73, 0x84BE, + 0xAF74, 0x84BF, 0xAF75, 0x84C0, 0xAF76, 0x84C1, 0xAF77, 0x84C2, + 0xAF78, 0x84C3, 0xAF79, 0xB2D1, 0xAF7A, 0x84C4, 0xAF7B, 0x84C5, + 0xAF7C, 0x84C6, 0xAF7D, 0x84C7, 0xAF7E, 0x84C8, 0xAF7F, 0x84C9, + 0xAF80, 0xB2D2, 0xAF81, 0x84CA, 0xAF82, 0x84CB, 0xAF83, 0x84CC, + 0xAF84, 0xB2D3, 0xAF85, 0x84CD, 0xAF86, 0x84CE, 0xAF87, 0x84CF, + 0xAF88, 0xB2D4, 0xAF89, 0x84D0, 0xAF8A, 0x84D1, 0xAF8B, 0x84D2, + 0xAF8C, 0x84D3, 0xAF8D, 0x84D4, 0xAF8E, 0x84D5, 0xAF8F, 0x84D6, + 0xAF90, 0xB2D5, 0xAF91, 0xB2D6, 0xAF92, 0x84D7, 0xAF93, 0x84D8, + 0xAF94, 0x84D9, 0xAF95, 0xB2D7, 0xAF96, 0x84DA, 0xAF97, 0x84DB, + 0xAF98, 0x84DC, 0xAF99, 0x84DD, 0xAF9A, 0x84DE, 0xAF9B, 0x84DF, + 0xAF9C, 0xB2D8, 0xAF9D, 0x84E0, 0xAF9E, 0x84E1, 0xAF9F, 0x84E2, + 0xAFA0, 0x84E3, 0xAFA1, 0x84E4, 0xAFA2, 0x84E5, 0xAFA3, 0x84E6, + 0xAFA4, 0x84E7, 0xAFA5, 0x84E8, 0xAFA6, 0x84E9, 0xAFA7, 0x84EA, + 0xAFA8, 0x84EB, 0xAFA9, 0x84EC, 0xAFAA, 0x84ED, 0xAFAB, 0x84EE, + 0xAFAC, 0x84EF, 0xAFAD, 0x84F0, 0xAFAE, 0x84F1, 0xAFAF, 0x84F2, + 0xAFB0, 0x84F3, 0xAFB1, 0x84F4, 0xAFB2, 0x84F5, 0xAFB3, 0x84F6, + 0xAFB4, 0x84F7, 0xAFB5, 0x84F8, 0xAFB6, 0x84F9, 0xAFB7, 0x84FA, + 0xAFB8, 0xB2D9, 0xAFB9, 0xB2DA, 0xAFBA, 0x84FB, 0xAFBB, 0x84FC, + 0xAFBC, 0xB2DB, 0xAFBD, 0x84FD, 0xAFBE, 0x84FE, 0xAFBF, 0x8541, + 0xAFC0, 0xB2DC, 0xAFC1, 0x8542, 0xAFC2, 0x8543, 0xAFC3, 0x8544, + 0xAFC4, 0x8545, 0xAFC5, 0x8546, 0xAFC6, 0x8547, 0xAFC7, 0xB2DD, + 0xAFC8, 0xB2DE, 0xAFC9, 0xB2DF, 0xAFCA, 0x8548, 0xAFCB, 0xB2E0, + 0xAFCC, 0x8549, 0xAFCD, 0xB2E1, 0xAFCE, 0xB2E2, 0xAFCF, 0x854A, + 0xAFD0, 0x854B, 0xAFD1, 0x854C, 0xAFD2, 0x854D, 0xAFD3, 0x854E, + 0xAFD4, 0xB2E3, 0xAFD5, 0x854F, 0xAFD6, 0x8550, 0xAFD7, 0x8551, + 0xAFD8, 0x8552, 0xAFD9, 0x8553, 0xAFDA, 0x8554, 0xAFDB, 0x8555, + 0xAFDC, 0xB2E4, 0xAFDD, 0x8556, 0xAFDE, 0x8557, 0xAFDF, 0x8558, + 0xAFE0, 0x8559, 0xAFE1, 0x855A, 0xAFE2, 0x8561, 0xAFE3, 0x8562, + 0xAFE4, 0x8563, 0xAFE5, 0x8564, 0xAFE6, 0x8565, 0xAFE7, 0x8566, + 0xAFE8, 0xB2E5, 0xAFE9, 0xB2E6, 0xAFEA, 0x8567, 0xAFEB, 0x8568, + 0xAFEC, 0x8569, 0xAFED, 0x856A, 0xAFEE, 0x856B, 0xAFEF, 0x856C, + 0xAFF0, 0xB2E7, 0xAFF1, 0xB2E8, 0xAFF2, 0x856D, 0xAFF3, 0x856E, + 0xAFF4, 0xB2E9, 0xAFF5, 0x856F, 0xAFF6, 0x8570, 0xAFF7, 0x8571, + 0xAFF8, 0xB2EA, 0xAFF9, 0x8572, 0xAFFA, 0x8573, 0xAFFB, 0x8574, + 0xAFFC, 0x8575, 0xAFFD, 0x8576, 0xAFFE, 0x8577, 0xAFFF, 0x8578, + 0xB000, 0xB2EB, 0xB001, 0xB2EC, 0xB002, 0x8579, 0xB003, 0x857A, + 0xB004, 0xB2ED, 0xB005, 0x8581, 0xB006, 0x8582, 0xB007, 0x8583, + 0xB008, 0x8584, 0xB009, 0x8585, 0xB00A, 0x8586, 0xB00B, 0x8587, + 0xB00C, 0xB2EE, 0xB00D, 0x8588, 0xB00E, 0x8589, 0xB00F, 0x858A, + 0xB010, 0xB2EF, 0xB011, 0x858B, 0xB012, 0x858C, 0xB013, 0x858D, + 0xB014, 0xB2F0, 0xB015, 0x858E, 0xB016, 0x858F, 0xB017, 0x8590, + 0xB018, 0x8591, 0xB019, 0x8592, 0xB01A, 0x8593, 0xB01B, 0x8594, + 0xB01C, 0xB2F1, 0xB01D, 0xB2F2, 0xB01E, 0x8595, 0xB01F, 0x8596, + 0xB020, 0x8597, 0xB021, 0x8598, 0xB022, 0x8599, 0xB023, 0x859A, + 0xB024, 0x859B, 0xB025, 0x859C, 0xB026, 0x859D, 0xB027, 0x859E, + 0xB028, 0xB2F3, 0xB029, 0x859F, 0xB02A, 0x85A0, 0xB02B, 0x85A1, + 0xB02C, 0x85A2, 0xB02D, 0x85A3, 0xB02E, 0x85A4, 0xB02F, 0x85A5, + 0xB030, 0x85A6, 0xB031, 0x85A7, 0xB032, 0x85A8, 0xB033, 0x85A9, + 0xB034, 0x85AA, 0xB035, 0x85AB, 0xB036, 0x85AC, 0xB037, 0x85AD, + 0xB038, 0x85AE, 0xB039, 0x85AF, 0xB03A, 0x85B0, 0xB03B, 0x85B1, + 0xB03C, 0x85B2, 0xB03D, 0x85B3, 0xB03E, 0x85B4, 0xB03F, 0x85B5, + 0xB040, 0x85B6, 0xB041, 0x85B7, 0xB042, 0x85B8, 0xB043, 0x85B9, + 0xB044, 0xB2F4, 0xB045, 0xB2F5, 0xB046, 0x85BA, 0xB047, 0x85BB, + 0xB048, 0xB2F6, 0xB049, 0x85BC, 0xB04A, 0xB2F7, 0xB04B, 0x85BD, + 0xB04C, 0xB2F8, 0xB04D, 0x85BE, 0xB04E, 0xB2F9, 0xB04F, 0x85BF, + 0xB050, 0x85C0, 0xB051, 0x85C1, 0xB052, 0x85C2, 0xB053, 0xB2FA, + 0xB054, 0xB2FB, 0xB055, 0xB2FC, 0xB056, 0x85C3, 0xB057, 0xB2FD, + 0xB058, 0x85C4, 0xB059, 0xB2FE, 0xB05A, 0x85C5, 0xB05B, 0x85C6, + 0xB05C, 0x85C7, 0xB05D, 0xB3A1, 0xB05E, 0x85C8, 0xB05F, 0x85C9, + 0xB060, 0x85CA, 0xB061, 0x85CB, 0xB062, 0x85CC, 0xB063, 0x85CD, + 0xB064, 0x85CE, 0xB065, 0x85CF, 0xB066, 0x85D0, 0xB067, 0x85D1, + 0xB068, 0x85D2, 0xB069, 0x85D3, 0xB06A, 0x85D4, 0xB06B, 0x85D5, + 0xB06C, 0x85D6, 0xB06D, 0x85D7, 0xB06E, 0x85D8, 0xB06F, 0x85D9, + 0xB070, 0x85DA, 0xB071, 0x85DB, 0xB072, 0x85DC, 0xB073, 0x85DD, + 0xB074, 0x85DE, 0xB075, 0x85DF, 0xB076, 0x85E0, 0xB077, 0x85E1, + 0xB078, 0x85E2, 0xB079, 0x85E3, 0xB07A, 0x85E4, 0xB07B, 0x85E5, + 0xB07C, 0xB3A2, 0xB07D, 0xB3A3, 0xB07E, 0x85E6, 0xB07F, 0x85E7, + 0xB080, 0xB3A4, 0xB081, 0x85E8, 0xB082, 0x85E9, 0xB083, 0x85EA, + 0xB084, 0xB3A5, 0xB085, 0x85EB, 0xB086, 0x85EC, 0xB087, 0x85ED, + 0xB088, 0x85EE, 0xB089, 0x85EF, 0xB08A, 0x85F0, 0xB08B, 0x85F1, + 0xB08C, 0xB3A6, 0xB08D, 0xB3A7, 0xB08E, 0x85F2, 0xB08F, 0xB3A8, + 0xB090, 0x85F3, 0xB091, 0xB3A9, 0xB092, 0x85F4, 0xB093, 0x85F5, + 0xB094, 0x85F6, 0xB095, 0x85F7, 0xB096, 0x85F8, 0xB097, 0x85F9, + 0xB098, 0xB3AA, 0xB099, 0xB3AB, 0xB09A, 0xB3AC, 0xB09B, 0x85FA, + 0xB09C, 0xB3AD, 0xB09D, 0x85FB, 0xB09E, 0x85FC, 0xB09F, 0xB3AE, + 0xB0A0, 0xB3AF, 0xB0A1, 0xB3B0, 0xB0A2, 0xB3B1, 0xB0A3, 0x85FD, + 0xB0A4, 0x85FE, 0xB0A5, 0x8641, 0xB0A6, 0x8642, 0xB0A7, 0x8643, + 0xB0A8, 0xB3B2, 0xB0A9, 0xB3B3, 0xB0AA, 0x8644, 0xB0AB, 0xB3B4, + 0xB0AC, 0xB3B5, 0xB0AD, 0xB3B6, 0xB0AE, 0xB3B7, 0xB0AF, 0xB3B8, + 0xB0B0, 0x8645, 0xB0B1, 0xB3B9, 0xB0B2, 0x8646, 0xB0B3, 0xB3BA, + 0xB0B4, 0xB3BB, 0xB0B5, 0xB3BC, 0xB0B6, 0x8647, 0xB0B7, 0x8648, + 0xB0B8, 0xB3BD, 0xB0B9, 0x8649, 0xB0BA, 0x864A, 0xB0BB, 0x864B, + 0xB0BC, 0xB3BE, 0xB0BD, 0x864C, 0xB0BE, 0x864D, 0xB0BF, 0x864E, + 0xB0C0, 0x864F, 0xB0C1, 0x8650, 0xB0C2, 0x8651, 0xB0C3, 0x8652, + 0xB0C4, 0xB3BF, 0xB0C5, 0xB3C0, 0xB0C6, 0x8653, 0xB0C7, 0xB3C1, + 0xB0C8, 0xB3C2, 0xB0C9, 0xB3C3, 0xB0CA, 0x8654, 0xB0CB, 0x8655, + 0xB0CC, 0x8656, 0xB0CD, 0x8657, 0xB0CE, 0x8658, 0xB0CF, 0x8659, + 0xB0D0, 0xB3C4, 0xB0D1, 0xB3C5, 0xB0D2, 0x865A, 0xB0D3, 0x8661, + 0xB0D4, 0xB3C6, 0xB0D5, 0x8662, 0xB0D6, 0x8663, 0xB0D7, 0x8664, + 0xB0D8, 0xB3C7, 0xB0D9, 0x8665, 0xB0DA, 0x8666, 0xB0DB, 0x8667, + 0xB0DC, 0x8668, 0xB0DD, 0x8669, 0xB0DE, 0x866A, 0xB0DF, 0x866B, + 0xB0E0, 0xB3C8, 0xB0E1, 0x866C, 0xB0E2, 0x866D, 0xB0E3, 0x866E, + 0xB0E4, 0x866F, 0xB0E5, 0xB3C9, 0xB0E6, 0x8670, 0xB0E7, 0x8671, + 0xB0E8, 0x8672, 0xB0E9, 0x8673, 0xB0EA, 0x8674, 0xB0EB, 0x8675, + 0xB0EC, 0x8676, 0xB0ED, 0x8677, 0xB0EE, 0x8678, 0xB0EF, 0x8679, + 0xB0F0, 0x867A, 0xB0F1, 0x8681, 0xB0F2, 0x8682, 0xB0F3, 0x8683, + 0xB0F4, 0x8684, 0xB0F5, 0x8685, 0xB0F6, 0x8686, 0xB0F7, 0x8687, + 0xB0F8, 0x8688, 0xB0F9, 0x8689, 0xB0FA, 0x868A, 0xB0FB, 0x868B, + 0xB0FC, 0x868C, 0xB0FD, 0x868D, 0xB0FE, 0x868E, 0xB0FF, 0x868F, + 0xB100, 0x8690, 0xB101, 0x8691, 0xB102, 0x8692, 0xB103, 0x8693, + 0xB104, 0x8694, 0xB105, 0x8695, 0xB106, 0x8696, 0xB107, 0x8697, + 0xB108, 0xB3CA, 0xB109, 0xB3CB, 0xB10A, 0x8698, 0xB10B, 0xB3CC, + 0xB10C, 0xB3CD, 0xB10D, 0x8699, 0xB10E, 0x869A, 0xB10F, 0x869B, + 0xB110, 0xB3CE, 0xB111, 0x869C, 0xB112, 0xB3CF, 0xB113, 0xB3D0, + 0xB114, 0x869D, 0xB115, 0x869E, 0xB116, 0x869F, 0xB117, 0x86A0, + 0xB118, 0xB3D1, 0xB119, 0xB3D2, 0xB11A, 0x86A1, 0xB11B, 0xB3D3, + 0xB11C, 0xB3D4, 0xB11D, 0xB3D5, 0xB11E, 0x86A2, 0xB11F, 0x86A3, + 0xB120, 0x86A4, 0xB121, 0x86A5, 0xB122, 0x86A6, 0xB123, 0xB3D6, + 0xB124, 0xB3D7, 0xB125, 0xB3D8, 0xB126, 0x86A7, 0xB127, 0x86A8, + 0xB128, 0xB3D9, 0xB129, 0x86A9, 0xB12A, 0x86AA, 0xB12B, 0x86AB, + 0xB12C, 0xB3DA, 0xB12D, 0x86AC, 0xB12E, 0x86AD, 0xB12F, 0x86AE, + 0xB130, 0x86AF, 0xB131, 0x86B0, 0xB132, 0x86B1, 0xB133, 0x86B2, + 0xB134, 0xB3DB, 0xB135, 0xB3DC, 0xB136, 0x86B3, 0xB137, 0xB3DD, + 0xB138, 0xB3DE, 0xB139, 0xB3DF, 0xB13A, 0x86B4, 0xB13B, 0x86B5, + 0xB13C, 0x86B6, 0xB13D, 0x86B7, 0xB13E, 0x86B8, 0xB13F, 0x86B9, + 0xB140, 0xB3E0, 0xB141, 0xB3E1, 0xB142, 0x86BA, 0xB143, 0x86BB, + 0xB144, 0xB3E2, 0xB145, 0x86BC, 0xB146, 0x86BD, 0xB147, 0x86BE, + 0xB148, 0xB3E3, 0xB149, 0x86BF, 0xB14A, 0x86C0, 0xB14B, 0x86C1, + 0xB14C, 0x86C2, 0xB14D, 0x86C3, 0xB14E, 0x86C4, 0xB14F, 0x86C5, + 0xB150, 0xB3E4, 0xB151, 0xB3E5, 0xB152, 0x86C6, 0xB153, 0x86C7, + 0xB154, 0xB3E6, 0xB155, 0xB3E7, 0xB156, 0x86C8, 0xB157, 0x86C9, + 0xB158, 0xB3E8, 0xB159, 0x86CA, 0xB15A, 0x86CB, 0xB15B, 0x86CC, + 0xB15C, 0xB3E9, 0xB15D, 0x86CD, 0xB15E, 0x86CE, 0xB15F, 0x86CF, + 0xB160, 0xB3EA, 0xB161, 0x86D0, 0xB162, 0x86D1, 0xB163, 0x86D2, + 0xB164, 0x86D3, 0xB165, 0x86D4, 0xB166, 0x86D5, 0xB167, 0x86D6, + 0xB168, 0x86D7, 0xB169, 0x86D8, 0xB16A, 0x86D9, 0xB16B, 0x86DA, + 0xB16C, 0x86DB, 0xB16D, 0x86DC, 0xB16E, 0x86DD, 0xB16F, 0x86DE, + 0xB170, 0x86DF, 0xB171, 0x86E0, 0xB172, 0x86E1, 0xB173, 0x86E2, + 0xB174, 0x86E3, 0xB175, 0x86E4, 0xB176, 0x86E5, 0xB177, 0x86E6, + 0xB178, 0xB3EB, 0xB179, 0xB3EC, 0xB17A, 0x86E7, 0xB17B, 0x86E8, + 0xB17C, 0xB3ED, 0xB17D, 0x86E9, 0xB17E, 0x86EA, 0xB17F, 0x86EB, + 0xB180, 0xB3EE, 0xB181, 0x86EC, 0xB182, 0xB3EF, 0xB183, 0x86ED, + 0xB184, 0x86EE, 0xB185, 0x86EF, 0xB186, 0x86F0, 0xB187, 0x86F1, + 0xB188, 0xB3F0, 0xB189, 0xB3F1, 0xB18A, 0x86F2, 0xB18B, 0xB3F2, + 0xB18C, 0x86F3, 0xB18D, 0xB3F3, 0xB18E, 0x86F4, 0xB18F, 0x86F5, + 0xB190, 0x86F6, 0xB191, 0x86F7, 0xB192, 0xB3F4, 0xB193, 0xB3F5, + 0xB194, 0xB3F6, 0xB195, 0x86F8, 0xB196, 0x86F9, 0xB197, 0x86FA, + 0xB198, 0xB3F7, 0xB199, 0x86FB, 0xB19A, 0x86FC, 0xB19B, 0x86FD, + 0xB19C, 0xB3F8, 0xB19D, 0x86FE, 0xB19E, 0x8741, 0xB19F, 0x8742, + 0xB1A0, 0x8743, 0xB1A1, 0x8744, 0xB1A2, 0x8745, 0xB1A3, 0x8746, + 0xB1A4, 0x8747, 0xB1A5, 0x8748, 0xB1A6, 0x8749, 0xB1A7, 0x874A, + 0xB1A8, 0xB3F9, 0xB1A9, 0x874B, 0xB1AA, 0x874C, 0xB1AB, 0x874D, + 0xB1AC, 0x874E, 0xB1AD, 0x874F, 0xB1AE, 0x8750, 0xB1AF, 0x8751, + 0xB1B0, 0x8752, 0xB1B1, 0x8753, 0xB1B2, 0x8754, 0xB1B3, 0x8755, + 0xB1B4, 0x8756, 0xB1B5, 0x8757, 0xB1B6, 0x8758, 0xB1B7, 0x8759, + 0xB1B8, 0x875A, 0xB1B9, 0x8761, 0xB1BA, 0x8762, 0xB1BB, 0x8763, + 0xB1BC, 0x8764, 0xB1BD, 0x8765, 0xB1BE, 0x8766, 0xB1BF, 0x8767, + 0xB1C0, 0x8768, 0xB1C1, 0x8769, 0xB1C2, 0x876A, 0xB1C3, 0x876B, + 0xB1C4, 0x876C, 0xB1C5, 0x876D, 0xB1C6, 0x876E, 0xB1C7, 0x876F, + 0xB1C8, 0x8770, 0xB1C9, 0x8771, 0xB1CA, 0x8772, 0xB1CB, 0x8773, + 0xB1CC, 0xB3FA, 0xB1CD, 0x8774, 0xB1CE, 0x8775, 0xB1CF, 0x8776, + 0xB1D0, 0xB3FB, 0xB1D1, 0x8777, 0xB1D2, 0x8778, 0xB1D3, 0x8779, + 0xB1D4, 0xB3FC, 0xB1D5, 0x877A, 0xB1D6, 0x8781, 0xB1D7, 0x8782, + 0xB1D8, 0x8783, 0xB1D9, 0x8784, 0xB1DA, 0x8785, 0xB1DB, 0x8786, + 0xB1DC, 0xB3FD, 0xB1DD, 0xB3FE, 0xB1DE, 0x8787, 0xB1DF, 0xB4A1, + 0xB1E0, 0x8788, 0xB1E1, 0x8789, 0xB1E2, 0x878A, 0xB1E3, 0x878B, + 0xB1E4, 0x878C, 0xB1E5, 0x878D, 0xB1E6, 0x878E, 0xB1E7, 0x878F, + 0xB1E8, 0xB4A2, 0xB1E9, 0xB4A3, 0xB1EA, 0x8790, 0xB1EB, 0x8791, + 0xB1EC, 0xB4A4, 0xB1ED, 0x8792, 0xB1EE, 0x8793, 0xB1EF, 0x8794, + 0xB1F0, 0xB4A5, 0xB1F1, 0x8795, 0xB1F2, 0x8796, 0xB1F3, 0x8797, + 0xB1F4, 0x8798, 0xB1F5, 0x8799, 0xB1F6, 0x879A, 0xB1F7, 0x879B, + 0xB1F8, 0x879C, 0xB1F9, 0xB4A6, 0xB1FA, 0x879D, 0xB1FB, 0xB4A7, + 0xB1FC, 0x879E, 0xB1FD, 0xB4A8, 0xB1FE, 0x879F, 0xB1FF, 0x87A0, + 0xB200, 0x87A1, 0xB201, 0x87A2, 0xB202, 0x87A3, 0xB203, 0x87A4, + 0xB204, 0xB4A9, 0xB205, 0xB4AA, 0xB206, 0x87A5, 0xB207, 0x87A6, + 0xB208, 0xB4AB, 0xB209, 0x87A7, 0xB20A, 0x87A8, 0xB20B, 0xB4AC, + 0xB20C, 0xB4AD, 0xB20D, 0x87A9, 0xB20E, 0x87AA, 0xB20F, 0x87AB, + 0xB210, 0x87AC, 0xB211, 0x87AD, 0xB212, 0x87AE, 0xB213, 0x87AF, + 0xB214, 0xB4AE, 0xB215, 0xB4AF, 0xB216, 0x87B0, 0xB217, 0xB4B0, + 0xB218, 0x87B1, 0xB219, 0xB4B1, 0xB21A, 0x87B2, 0xB21B, 0x87B3, + 0xB21C, 0x87B4, 0xB21D, 0x87B5, 0xB21E, 0x87B6, 0xB21F, 0x87B7, + 0xB220, 0xB4B2, 0xB221, 0x87B8, 0xB222, 0x87B9, 0xB223, 0x87BA, + 0xB224, 0x87BB, 0xB225, 0x87BC, 0xB226, 0x87BD, 0xB227, 0x87BE, + 0xB228, 0x87BF, 0xB229, 0x87C0, 0xB22A, 0x87C1, 0xB22B, 0x87C2, + 0xB22C, 0x87C3, 0xB22D, 0x87C4, 0xB22E, 0x87C5, 0xB22F, 0x87C6, + 0xB230, 0x87C7, 0xB231, 0x87C8, 0xB232, 0x87C9, 0xB233, 0x87CA, + 0xB234, 0xB4B3, 0xB235, 0x87CB, 0xB236, 0x87CC, 0xB237, 0x87CD, + 0xB238, 0x87CE, 0xB239, 0x87CF, 0xB23A, 0x87D0, 0xB23B, 0x87D1, + 0xB23C, 0xB4B4, 0xB23D, 0x87D2, 0xB23E, 0x87D3, 0xB23F, 0x87D4, + 0xB240, 0x87D5, 0xB241, 0x87D6, 0xB242, 0x87D7, 0xB243, 0x87D8, + 0xB244, 0x87D9, 0xB245, 0x87DA, 0xB246, 0x87DB, 0xB247, 0x87DC, + 0xB248, 0x87DD, 0xB249, 0x87DE, 0xB24A, 0x87DF, 0xB24B, 0x87E0, + 0xB24C, 0x87E1, 0xB24D, 0x87E2, 0xB24E, 0x87E3, 0xB24F, 0x87E4, + 0xB250, 0x87E5, 0xB251, 0x87E6, 0xB252, 0x87E7, 0xB253, 0x87E8, + 0xB254, 0x87E9, 0xB255, 0x87EA, 0xB256, 0x87EB, 0xB257, 0x87EC, + 0xB258, 0xB4B5, 0xB259, 0x87ED, 0xB25A, 0x87EE, 0xB25B, 0x87EF, + 0xB25C, 0xB4B6, 0xB25D, 0x87F0, 0xB25E, 0x87F1, 0xB25F, 0x87F2, + 0xB260, 0xB4B7, 0xB261, 0x87F3, 0xB262, 0x87F4, 0xB263, 0x87F5, + 0xB264, 0x87F6, 0xB265, 0x87F7, 0xB266, 0x87F8, 0xB267, 0x87F9, + 0xB268, 0xB4B8, 0xB269, 0xB4B9, 0xB26A, 0x87FA, 0xB26B, 0x87FB, + 0xB26C, 0x87FC, 0xB26D, 0x87FD, 0xB26E, 0x87FE, 0xB26F, 0x8841, + 0xB270, 0x8842, 0xB271, 0x8843, 0xB272, 0x8844, 0xB273, 0x8845, + 0xB274, 0xB4BA, 0xB275, 0xB4BB, 0xB276, 0x8846, 0xB277, 0x8847, + 0xB278, 0x8848, 0xB279, 0x8849, 0xB27A, 0x884A, 0xB27B, 0x884B, + 0xB27C, 0xB4BC, 0xB27D, 0x884C, 0xB27E, 0x884D, 0xB27F, 0x884E, + 0xB280, 0x884F, 0xB281, 0x8850, 0xB282, 0x8851, 0xB283, 0x8852, + 0xB284, 0xB4BD, 0xB285, 0xB4BE, 0xB286, 0x8853, 0xB287, 0x8854, + 0xB288, 0x8855, 0xB289, 0xB4BF, 0xB28A, 0x8856, 0xB28B, 0x8857, + 0xB28C, 0x8858, 0xB28D, 0x8859, 0xB28E, 0x885A, 0xB28F, 0x8861, + 0xB290, 0xB4C0, 0xB291, 0xB4C1, 0xB292, 0x8862, 0xB293, 0x8863, + 0xB294, 0xB4C2, 0xB295, 0x8864, 0xB296, 0x8865, 0xB297, 0x8866, + 0xB298, 0xB4C3, 0xB299, 0xB4C4, 0xB29A, 0xB4C5, 0xB29B, 0x8867, + 0xB29C, 0x8868, 0xB29D, 0x8869, 0xB29E, 0x886A, 0xB29F, 0x886B, + 0xB2A0, 0xB4C6, 0xB2A1, 0xB4C7, 0xB2A2, 0x886C, 0xB2A3, 0xB4C8, + 0xB2A4, 0x886D, 0xB2A5, 0xB4C9, 0xB2A6, 0xB4CA, 0xB2A7, 0x886E, + 0xB2A8, 0x886F, 0xB2A9, 0x8870, 0xB2AA, 0xB4CB, 0xB2AB, 0x8871, + 0xB2AC, 0xB4CC, 0xB2AD, 0x8872, 0xB2AE, 0x8873, 0xB2AF, 0x8874, + 0xB2B0, 0xB4CD, 0xB2B1, 0x8875, 0xB2B2, 0x8876, 0xB2B3, 0x8877, + 0xB2B4, 0xB4CE, 0xB2B5, 0x8878, 0xB2B6, 0x8879, 0xB2B7, 0x887A, + 0xB2B8, 0x8881, 0xB2B9, 0x8882, 0xB2BA, 0x8883, 0xB2BB, 0x8884, + 0xB2BC, 0x8885, 0xB2BD, 0x8886, 0xB2BE, 0x8887, 0xB2BF, 0x8888, + 0xB2C0, 0x8889, 0xB2C1, 0x888A, 0xB2C2, 0x888B, 0xB2C3, 0x888C, + 0xB2C4, 0x888D, 0xB2C5, 0x888E, 0xB2C6, 0x888F, 0xB2C7, 0x8890, + 0xB2C8, 0xB4CF, 0xB2C9, 0xB4D0, 0xB2CA, 0x8891, 0xB2CB, 0x8892, + 0xB2CC, 0xB4D1, 0xB2CD, 0x8893, 0xB2CE, 0x8894, 0xB2CF, 0x8895, + 0xB2D0, 0xB4D2, 0xB2D1, 0x8896, 0xB2D2, 0xB4D3, 0xB2D3, 0x8897, + 0xB2D4, 0x8898, 0xB2D5, 0x8899, 0xB2D6, 0x889A, 0xB2D7, 0x889B, + 0xB2D8, 0xB4D4, 0xB2D9, 0xB4D5, 0xB2DA, 0x889C, 0xB2DB, 0xB4D6, + 0xB2DC, 0x889D, 0xB2DD, 0xB4D7, 0xB2DE, 0x889E, 0xB2DF, 0x889F, + 0xB2E0, 0x88A0, 0xB2E1, 0x88A1, 0xB2E2, 0xB4D8, 0xB2E3, 0x88A2, + 0xB2E4, 0xB4D9, 0xB2E5, 0xB4DA, 0xB2E6, 0xB4DB, 0xB2E7, 0x88A3, + 0xB2E8, 0xB4DC, 0xB2E9, 0x88A4, 0xB2EA, 0x88A5, 0xB2EB, 0xB4DD, + 0xB2EC, 0xB4DE, 0xB2ED, 0xB4DF, 0xB2EE, 0xB4E0, 0xB2EF, 0xB4E1, + 0xB2F0, 0x88A6, 0xB2F1, 0x88A7, 0xB2F2, 0x88A8, 0xB2F3, 0xB4E2, + 0xB2F4, 0xB4E3, 0xB2F5, 0xB4E4, 0xB2F6, 0x88A9, 0xB2F7, 0xB4E5, + 0xB2F8, 0xB4E6, 0xB2F9, 0xB4E7, 0xB2FA, 0xB4E8, 0xB2FB, 0xB4E9, + 0xB2FC, 0x88AA, 0xB2FD, 0x88AB, 0xB2FE, 0x88AC, 0xB2FF, 0xB4EA, + 0xB300, 0xB4EB, 0xB301, 0xB4EC, 0xB302, 0x88AD, 0xB303, 0x88AE, + 0xB304, 0xB4ED, 0xB305, 0x88AF, 0xB306, 0x88B0, 0xB307, 0x88B1, + 0xB308, 0xB4EE, 0xB309, 0x88B2, 0xB30A, 0x88B3, 0xB30B, 0x88B4, + 0xB30C, 0x88B5, 0xB30D, 0x88B6, 0xB30E, 0x88B7, 0xB30F, 0x88B8, + 0xB310, 0xB4EF, 0xB311, 0xB4F0, 0xB312, 0x88B9, 0xB313, 0xB4F1, + 0xB314, 0xB4F2, 0xB315, 0xB4F3, 0xB316, 0x88BA, 0xB317, 0x88BB, + 0xB318, 0x88BC, 0xB319, 0x88BD, 0xB31A, 0x88BE, 0xB31B, 0x88BF, + 0xB31C, 0xB4F4, 0xB31D, 0x88C0, 0xB31E, 0x88C1, 0xB31F, 0x88C2, + 0xB320, 0x88C3, 0xB321, 0x88C4, 0xB322, 0x88C5, 0xB323, 0x88C6, + 0xB324, 0x88C7, 0xB325, 0x88C8, 0xB326, 0x88C9, 0xB327, 0x88CA, + 0xB328, 0x88CB, 0xB329, 0x88CC, 0xB32A, 0x88CD, 0xB32B, 0x88CE, + 0xB32C, 0x88CF, 0xB32D, 0x88D0, 0xB32E, 0x88D1, 0xB32F, 0x88D2, + 0xB330, 0x88D3, 0xB331, 0x88D4, 0xB332, 0x88D5, 0xB333, 0x88D6, + 0xB334, 0x88D7, 0xB335, 0x88D8, 0xB336, 0x88D9, 0xB337, 0x88DA, + 0xB338, 0x88DB, 0xB339, 0x88DC, 0xB33A, 0x88DD, 0xB33B, 0x88DE, + 0xB33C, 0x88DF, 0xB33D, 0x88E0, 0xB33E, 0x88E1, 0xB33F, 0x88E2, + 0xB340, 0x88E3, 0xB341, 0x88E4, 0xB342, 0x88E5, 0xB343, 0x88E6, + 0xB344, 0x88E7, 0xB345, 0x88E8, 0xB346, 0x88E9, 0xB347, 0x88EA, + 0xB348, 0x88EB, 0xB349, 0x88EC, 0xB34A, 0x88ED, 0xB34B, 0x88EE, + 0xB34C, 0x88EF, 0xB34D, 0x88F0, 0xB34E, 0x88F1, 0xB34F, 0x88F2, + 0xB350, 0x88F3, 0xB351, 0x88F4, 0xB352, 0x88F5, 0xB353, 0x88F6, + 0xB354, 0xB4F5, 0xB355, 0xB4F6, 0xB356, 0xB4F7, 0xB357, 0x88F7, + 0xB358, 0xB4F8, 0xB359, 0x88F8, 0xB35A, 0x88F9, 0xB35B, 0xB4F9, + 0xB35C, 0xB4FA, 0xB35D, 0x88FA, 0xB35E, 0xB4FB, 0xB35F, 0xB4FC, + 0xB360, 0x88FB, 0xB361, 0x88FC, 0xB362, 0x88FD, 0xB363, 0x88FE, + 0xB364, 0xB4FD, 0xB365, 0xB4FE, 0xB366, 0x8941, 0xB367, 0xB5A1, + 0xB368, 0x8942, 0xB369, 0xB5A2, 0xB36A, 0x8943, 0xB36B, 0xB5A3, + 0xB36C, 0x8944, 0xB36D, 0x8945, 0xB36E, 0xB5A4, 0xB36F, 0x8946, + 0xB370, 0xB5A5, 0xB371, 0xB5A6, 0xB372, 0x8947, 0xB373, 0x8948, + 0xB374, 0xB5A7, 0xB375, 0x8949, 0xB376, 0x894A, 0xB377, 0x894B, + 0xB378, 0xB5A8, 0xB379, 0x894C, 0xB37A, 0x894D, 0xB37B, 0x894E, + 0xB37C, 0x894F, 0xB37D, 0x8950, 0xB37E, 0x8951, 0xB37F, 0x8952, + 0xB380, 0xB5A9, 0xB381, 0xB5AA, 0xB382, 0x8953, 0xB383, 0xB5AB, + 0xB384, 0xB5AC, 0xB385, 0xB5AD, 0xB386, 0x8954, 0xB387, 0x8955, + 0xB388, 0x8956, 0xB389, 0x8957, 0xB38A, 0x8958, 0xB38B, 0x8959, + 0xB38C, 0xB5AE, 0xB38D, 0x895A, 0xB38E, 0x8961, 0xB38F, 0x8962, + 0xB390, 0xB5AF, 0xB391, 0x8963, 0xB392, 0x8964, 0xB393, 0x8965, + 0xB394, 0xB5B0, 0xB395, 0x8966, 0xB396, 0x8967, 0xB397, 0x8968, + 0xB398, 0x8969, 0xB399, 0x896A, 0xB39A, 0x896B, 0xB39B, 0x896C, + 0xB39C, 0x896D, 0xB39D, 0x896E, 0xB39E, 0x896F, 0xB39F, 0x8970, + 0xB3A0, 0xB5B1, 0xB3A1, 0xB5B2, 0xB3A2, 0x8971, 0xB3A3, 0x8972, + 0xB3A4, 0x8973, 0xB3A5, 0x8974, 0xB3A6, 0x8975, 0xB3A7, 0x8976, + 0xB3A8, 0xB5B3, 0xB3A9, 0x8977, 0xB3AA, 0x8978, 0xB3AB, 0x8979, + 0xB3AC, 0xB5B4, 0xB3AD, 0x897A, 0xB3AE, 0x8981, 0xB3AF, 0x8982, + 0xB3B0, 0x8983, 0xB3B1, 0x8984, 0xB3B2, 0x8985, 0xB3B3, 0x8986, + 0xB3B4, 0x8987, 0xB3B5, 0x8988, 0xB3B6, 0x8989, 0xB3B7, 0x898A, + 0xB3B8, 0x898B, 0xB3B9, 0x898C, 0xB3BA, 0x898D, 0xB3BB, 0x898E, + 0xB3BC, 0x898F, 0xB3BD, 0x8990, 0xB3BE, 0x8991, 0xB3BF, 0x8992, + 0xB3C0, 0x8993, 0xB3C1, 0x8994, 0xB3C2, 0x8995, 0xB3C3, 0x8996, + 0xB3C4, 0xB5B5, 0xB3C5, 0xB5B6, 0xB3C6, 0x8997, 0xB3C7, 0x8998, + 0xB3C8, 0xB5B7, 0xB3C9, 0x8999, 0xB3CA, 0x899A, 0xB3CB, 0xB5B8, + 0xB3CC, 0xB5B9, 0xB3CD, 0x899B, 0xB3CE, 0xB5BA, 0xB3CF, 0x899C, + 0xB3D0, 0xB5BB, 0xB3D1, 0x899D, 0xB3D2, 0x899E, 0xB3D3, 0x899F, + 0xB3D4, 0xB5BC, 0xB3D5, 0xB5BD, 0xB3D6, 0x89A0, 0xB3D7, 0xB5BE, + 0xB3D8, 0x89A1, 0xB3D9, 0xB5BF, 0xB3DA, 0x89A2, 0xB3DB, 0xB5C0, + 0xB3DC, 0x89A3, 0xB3DD, 0xB5C1, 0xB3DE, 0x89A4, 0xB3DF, 0x89A5, + 0xB3E0, 0xB5C2, 0xB3E1, 0x89A6, 0xB3E2, 0x89A7, 0xB3E3, 0x89A8, + 0xB3E4, 0xB5C3, 0xB3E5, 0x89A9, 0xB3E6, 0x89AA, 0xB3E7, 0x89AB, + 0xB3E8, 0xB5C4, 0xB3E9, 0x89AC, 0xB3EA, 0x89AD, 0xB3EB, 0x89AE, + 0xB3EC, 0x89AF, 0xB3ED, 0x89B0, 0xB3EE, 0x89B1, 0xB3EF, 0x89B2, + 0xB3F0, 0x89B3, 0xB3F1, 0x89B4, 0xB3F2, 0x89B5, 0xB3F3, 0x89B6, + 0xB3F4, 0x89B7, 0xB3F5, 0x89B8, 0xB3F6, 0x89B9, 0xB3F7, 0x89BA, + 0xB3F8, 0x89BB, 0xB3F9, 0x89BC, 0xB3FA, 0x89BD, 0xB3FB, 0x89BE, + 0xB3FC, 0xB5C5, 0xB3FD, 0x89BF, 0xB3FE, 0x89C0, 0xB3FF, 0x89C1, + 0xB400, 0x89C2, 0xB401, 0x89C3, 0xB402, 0x89C4, 0xB403, 0x89C5, + 0xB404, 0x89C6, 0xB405, 0x89C7, 0xB406, 0x89C8, 0xB407, 0x89C9, + 0xB408, 0x89CA, 0xB409, 0x89CB, 0xB40A, 0x89CC, 0xB40B, 0x89CD, + 0xB40C, 0x89CE, 0xB40D, 0x89CF, 0xB40E, 0x89D0, 0xB40F, 0x89D1, + 0xB410, 0xB5C6, 0xB411, 0x89D2, 0xB412, 0x89D3, 0xB413, 0x89D4, + 0xB414, 0x89D5, 0xB415, 0x89D6, 0xB416, 0x89D7, 0xB417, 0x89D8, + 0xB418, 0xB5C7, 0xB419, 0x89D9, 0xB41A, 0x89DA, 0xB41B, 0x89DB, + 0xB41C, 0xB5C8, 0xB41D, 0x89DC, 0xB41E, 0x89DD, 0xB41F, 0x89DE, + 0xB420, 0xB5C9, 0xB421, 0x89DF, 0xB422, 0x89E0, 0xB423, 0x89E1, + 0xB424, 0x89E2, 0xB425, 0x89E3, 0xB426, 0x89E4, 0xB427, 0x89E5, + 0xB428, 0xB5CA, 0xB429, 0xB5CB, 0xB42A, 0x89E6, 0xB42B, 0xB5CC, + 0xB42C, 0x89E7, 0xB42D, 0x89E8, 0xB42E, 0x89E9, 0xB42F, 0x89EA, + 0xB430, 0x89EB, 0xB431, 0x89EC, 0xB432, 0x89ED, 0xB433, 0x89EE, + 0xB434, 0xB5CD, 0xB435, 0x89EF, 0xB436, 0x89F0, 0xB437, 0x89F1, + 0xB438, 0x89F2, 0xB439, 0x89F3, 0xB43A, 0x89F4, 0xB43B, 0x89F5, + 0xB43C, 0x89F6, 0xB43D, 0x89F7, 0xB43E, 0x89F8, 0xB43F, 0x89F9, + 0xB440, 0x89FA, 0xB441, 0x89FB, 0xB442, 0x89FC, 0xB443, 0x89FD, + 0xB444, 0x89FE, 0xB445, 0x8A41, 0xB446, 0x8A42, 0xB447, 0x8A43, + 0xB448, 0x8A44, 0xB449, 0x8A45, 0xB44A, 0x8A46, 0xB44B, 0x8A47, + 0xB44C, 0x8A48, 0xB44D, 0x8A49, 0xB44E, 0x8A4A, 0xB44F, 0x8A4B, + 0xB450, 0xB5CE, 0xB451, 0xB5CF, 0xB452, 0x8A4C, 0xB453, 0x8A4D, + 0xB454, 0xB5D0, 0xB455, 0x8A4E, 0xB456, 0x8A4F, 0xB457, 0x8A50, + 0xB458, 0xB5D1, 0xB459, 0x8A51, 0xB45A, 0x8A52, 0xB45B, 0x8A53, + 0xB45C, 0x8A54, 0xB45D, 0x8A55, 0xB45E, 0x8A56, 0xB45F, 0x8A57, + 0xB460, 0xB5D2, 0xB461, 0xB5D3, 0xB462, 0x8A58, 0xB463, 0xB5D4, + 0xB464, 0x8A59, 0xB465, 0xB5D5, 0xB466, 0x8A5A, 0xB467, 0x8A61, + 0xB468, 0x8A62, 0xB469, 0x8A63, 0xB46A, 0x8A64, 0xB46B, 0x8A65, + 0xB46C, 0xB5D6, 0xB46D, 0x8A66, 0xB46E, 0x8A67, 0xB46F, 0x8A68, + 0xB470, 0x8A69, 0xB471, 0x8A6A, 0xB472, 0x8A6B, 0xB473, 0x8A6C, + 0xB474, 0x8A6D, 0xB475, 0x8A6E, 0xB476, 0x8A6F, 0xB477, 0x8A70, + 0xB478, 0x8A71, 0xB479, 0x8A72, 0xB47A, 0x8A73, 0xB47B, 0x8A74, + 0xB47C, 0x8A75, 0xB47D, 0x8A76, 0xB47E, 0x8A77, 0xB47F, 0x8A78, + 0xB480, 0xB5D7, 0xB481, 0x8A79, 0xB482, 0x8A7A, 0xB483, 0x8A81, + 0xB484, 0x8A82, 0xB485, 0x8A83, 0xB486, 0x8A84, 0xB487, 0x8A85, + 0xB488, 0xB5D8, 0xB489, 0x8A86, 0xB48A, 0x8A87, 0xB48B, 0x8A88, + 0xB48C, 0x8A89, 0xB48D, 0x8A8A, 0xB48E, 0x8A8B, 0xB48F, 0x8A8C, + 0xB490, 0x8A8D, 0xB491, 0x8A8E, 0xB492, 0x8A8F, 0xB493, 0x8A90, + 0xB494, 0x8A91, 0xB495, 0x8A92, 0xB496, 0x8A93, 0xB497, 0x8A94, + 0xB498, 0x8A95, 0xB499, 0x8A96, 0xB49A, 0x8A97, 0xB49B, 0x8A98, + 0xB49C, 0x8A99, 0xB49D, 0xB5D9, 0xB49E, 0x8A9A, 0xB49F, 0x8A9B, + 0xB4A0, 0x8A9C, 0xB4A1, 0x8A9D, 0xB4A2, 0x8A9E, 0xB4A3, 0x8A9F, + 0xB4A4, 0xB5DA, 0xB4A5, 0x8AA0, 0xB4A6, 0x8AA1, 0xB4A7, 0x8AA2, + 0xB4A8, 0xB5DB, 0xB4A9, 0x8AA3, 0xB4AA, 0x8AA4, 0xB4AB, 0x8AA5, + 0xB4AC, 0xB5DC, 0xB4AD, 0x8AA6, 0xB4AE, 0x8AA7, 0xB4AF, 0x8AA8, + 0xB4B0, 0x8AA9, 0xB4B1, 0x8AAA, 0xB4B2, 0x8AAB, 0xB4B3, 0x8AAC, + 0xB4B4, 0x8AAD, 0xB4B5, 0xB5DD, 0xB4B6, 0x8AAE, 0xB4B7, 0xB5DE, + 0xB4B8, 0x8AAF, 0xB4B9, 0xB5DF, 0xB4BA, 0x8AB0, 0xB4BB, 0x8AB1, + 0xB4BC, 0x8AB2, 0xB4BD, 0x8AB3, 0xB4BE, 0x8AB4, 0xB4BF, 0x8AB5, + 0xB4C0, 0xB5E0, 0xB4C1, 0x8AB6, 0xB4C2, 0x8AB7, 0xB4C3, 0x8AB8, + 0xB4C4, 0xB5E1, 0xB4C5, 0x8AB9, 0xB4C6, 0x8ABA, 0xB4C7, 0x8ABB, + 0xB4C8, 0xB5E2, 0xB4C9, 0x8ABC, 0xB4CA, 0x8ABD, 0xB4CB, 0x8ABE, + 0xB4CC, 0x8ABF, 0xB4CD, 0x8AC0, 0xB4CE, 0x8AC1, 0xB4CF, 0x8AC2, + 0xB4D0, 0xB5E3, 0xB4D1, 0x8AC3, 0xB4D2, 0x8AC4, 0xB4D3, 0x8AC5, + 0xB4D4, 0x8AC6, 0xB4D5, 0xB5E4, 0xB4D6, 0x8AC7, 0xB4D7, 0x8AC8, + 0xB4D8, 0x8AC9, 0xB4D9, 0x8ACA, 0xB4DA, 0x8ACB, 0xB4DB, 0x8ACC, + 0xB4DC, 0xB5E5, 0xB4DD, 0xB5E6, 0xB4DE, 0x8ACD, 0xB4DF, 0x8ACE, + 0xB4E0, 0xB5E7, 0xB4E1, 0x8ACF, 0xB4E2, 0x8AD0, 0xB4E3, 0xB5E8, + 0xB4E4, 0xB5E9, 0xB4E5, 0x8AD1, 0xB4E6, 0xB5EA, 0xB4E7, 0x8AD2, + 0xB4E8, 0x8AD3, 0xB4E9, 0x8AD4, 0xB4EA, 0x8AD5, 0xB4EB, 0x8AD6, + 0xB4EC, 0xB5EB, 0xB4ED, 0xB5EC, 0xB4EE, 0x8AD7, 0xB4EF, 0xB5ED, + 0xB4F0, 0x8AD8, 0xB4F1, 0xB5EE, 0xB4F2, 0x8AD9, 0xB4F3, 0x8ADA, + 0xB4F4, 0x8ADB, 0xB4F5, 0x8ADC, 0xB4F6, 0x8ADD, 0xB4F7, 0x8ADE, + 0xB4F8, 0xB5EF, 0xB4F9, 0x8ADF, 0xB4FA, 0x8AE0, 0xB4FB, 0x8AE1, + 0xB4FC, 0x8AE2, 0xB4FD, 0x8AE3, 0xB4FE, 0x8AE4, 0xB4FF, 0x8AE5, + 0xB500, 0x8AE6, 0xB501, 0x8AE7, 0xB502, 0x8AE8, 0xB503, 0x8AE9, + 0xB504, 0x8AEA, 0xB505, 0x8AEB, 0xB506, 0x8AEC, 0xB507, 0x8AED, + 0xB508, 0x8AEE, 0xB509, 0x8AEF, 0xB50A, 0x8AF0, 0xB50B, 0x8AF1, + 0xB50C, 0x8AF2, 0xB50D, 0x8AF3, 0xB50E, 0x8AF4, 0xB50F, 0x8AF5, + 0xB510, 0x8AF6, 0xB511, 0x8AF7, 0xB512, 0x8AF8, 0xB513, 0x8AF9, + 0xB514, 0xB5F0, 0xB515, 0xB5F1, 0xB516, 0x8AFA, 0xB517, 0x8AFB, + 0xB518, 0xB5F2, 0xB519, 0x8AFC, 0xB51A, 0x8AFD, 0xB51B, 0xB5F3, + 0xB51C, 0xB5F4, 0xB51D, 0x8AFE, 0xB51E, 0x8B41, 0xB51F, 0x8B42, + 0xB520, 0x8B43, 0xB521, 0x8B44, 0xB522, 0x8B45, 0xB523, 0x8B46, + 0xB524, 0xB5F5, 0xB525, 0xB5F6, 0xB526, 0x8B47, 0xB527, 0xB5F7, + 0xB528, 0xB5F8, 0xB529, 0xB5F9, 0xB52A, 0xB5FA, 0xB52B, 0x8B48, + 0xB52C, 0x8B49, 0xB52D, 0x8B4A, 0xB52E, 0x8B4B, 0xB52F, 0x8B4C, + 0xB530, 0xB5FB, 0xB531, 0xB5FC, 0xB532, 0x8B4D, 0xB533, 0x8B4E, + 0xB534, 0xB5FD, 0xB535, 0x8B4F, 0xB536, 0x8B50, 0xB537, 0x8B51, + 0xB538, 0xB5FE, 0xB539, 0x8B52, 0xB53A, 0x8B53, 0xB53B, 0x8B54, + 0xB53C, 0x8B55, 0xB53D, 0x8B56, 0xB53E, 0x8B57, 0xB53F, 0x8B58, + 0xB540, 0xB6A1, 0xB541, 0xB6A2, 0xB542, 0x8B59, 0xB543, 0xB6A3, + 0xB544, 0xB6A4, 0xB545, 0xB6A5, 0xB546, 0x8B5A, 0xB547, 0x8B61, + 0xB548, 0x8B62, 0xB549, 0x8B63, 0xB54A, 0x8B64, 0xB54B, 0xB6A6, + 0xB54C, 0xB6A7, 0xB54D, 0xB6A8, 0xB54E, 0x8B65, 0xB54F, 0x8B66, + 0xB550, 0xB6A9, 0xB551, 0x8B67, 0xB552, 0x8B68, 0xB553, 0x8B69, + 0xB554, 0xB6AA, 0xB555, 0x8B6A, 0xB556, 0x8B6B, 0xB557, 0x8B6C, + 0xB558, 0x8B6D, 0xB559, 0x8B6E, 0xB55A, 0x8B6F, 0xB55B, 0x8B70, + 0xB55C, 0xB6AB, 0xB55D, 0xB6AC, 0xB55E, 0x8B71, 0xB55F, 0xB6AD, + 0xB560, 0xB6AE, 0xB561, 0xB6AF, 0xB562, 0x8B72, 0xB563, 0x8B73, + 0xB564, 0x8B74, 0xB565, 0x8B75, 0xB566, 0x8B76, 0xB567, 0x8B77, + 0xB568, 0x8B78, 0xB569, 0x8B79, 0xB56A, 0x8B7A, 0xB56B, 0x8B81, + 0xB56C, 0x8B82, 0xB56D, 0x8B83, 0xB56E, 0x8B84, 0xB56F, 0x8B85, + 0xB570, 0x8B86, 0xB571, 0x8B87, 0xB572, 0x8B88, 0xB573, 0x8B89, + 0xB574, 0x8B8A, 0xB575, 0x8B8B, 0xB576, 0x8B8C, 0xB577, 0x8B8D, + 0xB578, 0x8B8E, 0xB579, 0x8B8F, 0xB57A, 0x8B90, 0xB57B, 0x8B91, + 0xB57C, 0x8B92, 0xB57D, 0x8B93, 0xB57E, 0x8B94, 0xB57F, 0x8B95, + 0xB580, 0x8B96, 0xB581, 0x8B97, 0xB582, 0x8B98, 0xB583, 0x8B99, + 0xB584, 0x8B9A, 0xB585, 0x8B9B, 0xB586, 0x8B9C, 0xB587, 0x8B9D, + 0xB588, 0x8B9E, 0xB589, 0x8B9F, 0xB58A, 0x8BA0, 0xB58B, 0x8BA1, + 0xB58C, 0x8BA2, 0xB58D, 0x8BA3, 0xB58E, 0x8BA4, 0xB58F, 0x8BA5, + 0xB590, 0x8BA6, 0xB591, 0x8BA7, 0xB592, 0x8BA8, 0xB593, 0x8BA9, + 0xB594, 0x8BAA, 0xB595, 0x8BAB, 0xB596, 0x8BAC, 0xB597, 0x8BAD, + 0xB598, 0x8BAE, 0xB599, 0x8BAF, 0xB59A, 0x8BB0, 0xB59B, 0x8BB1, + 0xB59C, 0x8BB2, 0xB59D, 0x8BB3, 0xB59E, 0x8BB4, 0xB59F, 0x8BB5, + 0xB5A0, 0xB6B0, 0xB5A1, 0xB6B1, 0xB5A2, 0x8BB6, 0xB5A3, 0x8BB7, + 0xB5A4, 0xB6B2, 0xB5A5, 0x8BB8, 0xB5A6, 0x8BB9, 0xB5A7, 0x8BBA, + 0xB5A8, 0xB6B3, 0xB5A9, 0x8BBB, 0xB5AA, 0xB6B4, 0xB5AB, 0xB6B5, + 0xB5AC, 0x8BBC, 0xB5AD, 0x8BBD, 0xB5AE, 0x8BBE, 0xB5AF, 0x8BBF, + 0xB5B0, 0xB6B6, 0xB5B1, 0xB6B7, 0xB5B2, 0x8BC0, 0xB5B3, 0xB6B8, + 0xB5B4, 0xB6B9, 0xB5B5, 0xB6BA, 0xB5B6, 0x8BC1, 0xB5B7, 0x8BC2, + 0xB5B8, 0x8BC3, 0xB5B9, 0x8BC4, 0xB5BA, 0x8BC5, 0xB5BB, 0xB6BB, + 0xB5BC, 0xB6BC, 0xB5BD, 0xB6BD, 0xB5BE, 0x8BC6, 0xB5BF, 0x8BC7, + 0xB5C0, 0xB6BE, 0xB5C1, 0x8BC8, 0xB5C2, 0x8BC9, 0xB5C3, 0x8BCA, + 0xB5C4, 0xB6BF, 0xB5C5, 0x8BCB, 0xB5C6, 0x8BCC, 0xB5C7, 0x8BCD, + 0xB5C8, 0x8BCE, 0xB5C9, 0x8BCF, 0xB5CA, 0x8BD0, 0xB5CB, 0x8BD1, + 0xB5CC, 0xB6C0, 0xB5CD, 0xB6C1, 0xB5CE, 0x8BD2, 0xB5CF, 0xB6C2, + 0xB5D0, 0xB6C3, 0xB5D1, 0xB6C4, 0xB5D2, 0x8BD3, 0xB5D3, 0x8BD4, + 0xB5D4, 0x8BD5, 0xB5D5, 0x8BD6, 0xB5D6, 0x8BD7, 0xB5D7, 0x8BD8, + 0xB5D8, 0xB6C5, 0xB5D9, 0x8BD9, 0xB5DA, 0x8BDA, 0xB5DB, 0x8BDB, + 0xB5DC, 0x8BDC, 0xB5DD, 0x8BDD, 0xB5DE, 0x8BDE, 0xB5DF, 0x8BDF, + 0xB5E0, 0x8BE0, 0xB5E1, 0x8BE1, 0xB5E2, 0x8BE2, 0xB5E3, 0x8BE3, + 0xB5E4, 0x8BE4, 0xB5E5, 0x8BE5, 0xB5E6, 0x8BE6, 0xB5E7, 0x8BE7, + 0xB5E8, 0x8BE8, 0xB5E9, 0x8BE9, 0xB5EA, 0x8BEA, 0xB5EB, 0x8BEB, + 0xB5EC, 0xB6C6, 0xB5ED, 0x8BEC, 0xB5EE, 0x8BED, 0xB5EF, 0x8BEE, + 0xB5F0, 0x8BEF, 0xB5F1, 0x8BF0, 0xB5F2, 0x8BF1, 0xB5F3, 0x8BF2, + 0xB5F4, 0x8BF3, 0xB5F5, 0x8BF4, 0xB5F6, 0x8BF5, 0xB5F7, 0x8BF6, + 0xB5F8, 0x8BF7, 0xB5F9, 0x8BF8, 0xB5FA, 0x8BF9, 0xB5FB, 0x8BFA, + 0xB5FC, 0x8BFB, 0xB5FD, 0x8BFC, 0xB5FE, 0x8BFD, 0xB5FF, 0x8BFE, + 0xB600, 0x8C41, 0xB601, 0x8C42, 0xB602, 0x8C43, 0xB603, 0x8C44, + 0xB604, 0x8C45, 0xB605, 0x8C46, 0xB606, 0x8C47, 0xB607, 0x8C48, + 0xB608, 0x8C49, 0xB609, 0x8C4A, 0xB60A, 0x8C4B, 0xB60B, 0x8C4C, + 0xB60C, 0x8C4D, 0xB60D, 0x8C4E, 0xB60E, 0x8C4F, 0xB60F, 0x8C50, + 0xB610, 0xB6C7, 0xB611, 0xB6C8, 0xB612, 0x8C51, 0xB613, 0x8C52, + 0xB614, 0xB6C9, 0xB615, 0x8C53, 0xB616, 0x8C54, 0xB617, 0x8C55, + 0xB618, 0xB6CA, 0xB619, 0x8C56, 0xB61A, 0x8C57, 0xB61B, 0x8C58, + 0xB61C, 0x8C59, 0xB61D, 0x8C5A, 0xB61E, 0x8C61, 0xB61F, 0x8C62, + 0xB620, 0x8C63, 0xB621, 0x8C64, 0xB622, 0x8C65, 0xB623, 0x8C66, + 0xB624, 0x8C67, 0xB625, 0xB6CB, 0xB626, 0x8C68, 0xB627, 0x8C69, + 0xB628, 0x8C6A, 0xB629, 0x8C6B, 0xB62A, 0x8C6C, 0xB62B, 0x8C6D, + 0xB62C, 0xB6CC, 0xB62D, 0x8C6E, 0xB62E, 0x8C6F, 0xB62F, 0x8C70, + 0xB630, 0x8C71, 0xB631, 0x8C72, 0xB632, 0x8C73, 0xB633, 0x8C74, + 0xB634, 0xB6CD, 0xB635, 0x8C75, 0xB636, 0x8C76, 0xB637, 0x8C77, + 0xB638, 0x8C78, 0xB639, 0x8C79, 0xB63A, 0x8C7A, 0xB63B, 0x8C81, + 0xB63C, 0x8C82, 0xB63D, 0x8C83, 0xB63E, 0x8C84, 0xB63F, 0x8C85, + 0xB640, 0x8C86, 0xB641, 0x8C87, 0xB642, 0x8C88, 0xB643, 0x8C89, + 0xB644, 0x8C8A, 0xB645, 0x8C8B, 0xB646, 0x8C8C, 0xB647, 0x8C8D, + 0xB648, 0xB6CE, 0xB649, 0x8C8E, 0xB64A, 0x8C8F, 0xB64B, 0x8C90, + 0xB64C, 0x8C91, 0xB64D, 0x8C92, 0xB64E, 0x8C93, 0xB64F, 0x8C94, + 0xB650, 0x8C95, 0xB651, 0x8C96, 0xB652, 0x8C97, 0xB653, 0x8C98, + 0xB654, 0x8C99, 0xB655, 0x8C9A, 0xB656, 0x8C9B, 0xB657, 0x8C9C, + 0xB658, 0x8C9D, 0xB659, 0x8C9E, 0xB65A, 0x8C9F, 0xB65B, 0x8CA0, + 0xB65C, 0x8CA1, 0xB65D, 0x8CA2, 0xB65E, 0x8CA3, 0xB65F, 0x8CA4, + 0xB660, 0x8CA5, 0xB661, 0x8CA6, 0xB662, 0x8CA7, 0xB663, 0x8CA8, + 0xB664, 0xB6CF, 0xB665, 0x8CA9, 0xB666, 0x8CAA, 0xB667, 0x8CAB, + 0xB668, 0xB6D0, 0xB669, 0x8CAC, 0xB66A, 0x8CAD, 0xB66B, 0x8CAE, + 0xB66C, 0x8CAF, 0xB66D, 0x8CB0, 0xB66E, 0x8CB1, 0xB66F, 0x8CB2, + 0xB670, 0x8CB3, 0xB671, 0x8CB4, 0xB672, 0x8CB5, 0xB673, 0x8CB6, + 0xB674, 0x8CB7, 0xB675, 0x8CB8, 0xB676, 0x8CB9, 0xB677, 0x8CBA, + 0xB678, 0x8CBB, 0xB679, 0x8CBC, 0xB67A, 0x8CBD, 0xB67B, 0x8CBE, + 0xB67C, 0x8CBF, 0xB67D, 0x8CC0, 0xB67E, 0x8CC1, 0xB67F, 0x8CC2, + 0xB680, 0x8CC3, 0xB681, 0x8CC4, 0xB682, 0x8CC5, 0xB683, 0x8CC6, + 0xB684, 0x8CC7, 0xB685, 0x8CC8, 0xB686, 0x8CC9, 0xB687, 0x8CCA, + 0xB688, 0x8CCB, 0xB689, 0x8CCC, 0xB68A, 0x8CCD, 0xB68B, 0x8CCE, + 0xB68C, 0x8CCF, 0xB68D, 0x8CD0, 0xB68E, 0x8CD1, 0xB68F, 0x8CD2, + 0xB690, 0x8CD3, 0xB691, 0x8CD4, 0xB692, 0x8CD5, 0xB693, 0x8CD6, + 0xB694, 0x8CD7, 0xB695, 0x8CD8, 0xB696, 0x8CD9, 0xB697, 0x8CDA, + 0xB698, 0x8CDB, 0xB699, 0x8CDC, 0xB69A, 0x8CDD, 0xB69B, 0x8CDE, + 0xB69C, 0xB6D1, 0xB69D, 0xB6D2, 0xB69E, 0x8CDF, 0xB69F, 0x8CE0, + 0xB6A0, 0xB6D3, 0xB6A1, 0x8CE1, 0xB6A2, 0x8CE2, 0xB6A3, 0x8CE3, + 0xB6A4, 0xB6D4, 0xB6A5, 0x8CE4, 0xB6A6, 0x8CE5, 0xB6A7, 0x8CE6, + 0xB6A8, 0x8CE7, 0xB6A9, 0x8CE8, 0xB6AA, 0x8CE9, 0xB6AB, 0xB6D5, + 0xB6AC, 0xB6D6, 0xB6AD, 0x8CEA, 0xB6AE, 0x8CEB, 0xB6AF, 0x8CEC, + 0xB6B0, 0x8CED, 0xB6B1, 0xB6D7, 0xB6B2, 0x8CEE, 0xB6B3, 0x8CEF, + 0xB6B4, 0x8CF0, 0xB6B5, 0x8CF1, 0xB6B6, 0x8CF2, 0xB6B7, 0x8CF3, + 0xB6B8, 0x8CF4, 0xB6B9, 0x8CF5, 0xB6BA, 0x8CF6, 0xB6BB, 0x8CF7, + 0xB6BC, 0x8CF8, 0xB6BD, 0x8CF9, 0xB6BE, 0x8CFA, 0xB6BF, 0x8CFB, + 0xB6C0, 0x8CFC, 0xB6C1, 0x8CFD, 0xB6C2, 0x8CFE, 0xB6C3, 0x8D41, + 0xB6C4, 0x8D42, 0xB6C5, 0x8D43, 0xB6C6, 0x8D44, 0xB6C7, 0x8D45, + 0xB6C8, 0x8D46, 0xB6C9, 0x8D47, 0xB6CA, 0x8D48, 0xB6CB, 0x8D49, + 0xB6CC, 0x8D4A, 0xB6CD, 0x8D4B, 0xB6CE, 0x8D4C, 0xB6CF, 0x8D4D, + 0xB6D0, 0x8D4E, 0xB6D1, 0x8D4F, 0xB6D2, 0x8D50, 0xB6D3, 0x8D51, + 0xB6D4, 0xB6D8, 0xB6D5, 0x8D52, 0xB6D6, 0x8D53, 0xB6D7, 0x8D54, + 0xB6D8, 0x8D55, 0xB6D9, 0x8D56, 0xB6DA, 0x8D57, 0xB6DB, 0x8D58, + 0xB6DC, 0x8D59, 0xB6DD, 0x8D5A, 0xB6DE, 0x8D61, 0xB6DF, 0x8D62, + 0xB6E0, 0x8D63, 0xB6E1, 0x8D64, 0xB6E2, 0x8D65, 0xB6E3, 0x8D66, + 0xB6E4, 0x8D67, 0xB6E5, 0x8D68, 0xB6E6, 0x8D69, 0xB6E7, 0x8D6A, + 0xB6E8, 0x8D6B, 0xB6E9, 0x8D6C, 0xB6EA, 0x8D6D, 0xB6EB, 0x8D6E, + 0xB6EC, 0x8D6F, 0xB6ED, 0x8D70, 0xB6EE, 0x8D71, 0xB6EF, 0x8D72, + 0xB6F0, 0xB6D9, 0xB6F1, 0x8D73, 0xB6F2, 0x8D74, 0xB6F3, 0x8D75, + 0xB6F4, 0xB6DA, 0xB6F5, 0x8D76, 0xB6F6, 0x8D77, 0xB6F7, 0x8D78, + 0xB6F8, 0xB6DB, 0xB6F9, 0x8D79, 0xB6FA, 0x8D7A, 0xB6FB, 0x8D81, + 0xB6FC, 0x8D82, 0xB6FD, 0x8D83, 0xB6FE, 0x8D84, 0xB6FF, 0x8D85, + 0xB700, 0xB6DC, 0xB701, 0xB6DD, 0xB702, 0x8D86, 0xB703, 0x8D87, + 0xB704, 0x8D88, 0xB705, 0xB6DE, 0xB706, 0x8D89, 0xB707, 0x8D8A, + 0xB708, 0x8D8B, 0xB709, 0x8D8C, 0xB70A, 0x8D8D, 0xB70B, 0x8D8E, + 0xB70C, 0x8D8F, 0xB70D, 0x8D90, 0xB70E, 0x8D91, 0xB70F, 0x8D92, + 0xB710, 0x8D93, 0xB711, 0x8D94, 0xB712, 0x8D95, 0xB713, 0x8D96, + 0xB714, 0x8D97, 0xB715, 0x8D98, 0xB716, 0x8D99, 0xB717, 0x8D9A, + 0xB718, 0x8D9B, 0xB719, 0x8D9C, 0xB71A, 0x8D9D, 0xB71B, 0x8D9E, + 0xB71C, 0x8D9F, 0xB71D, 0x8DA0, 0xB71E, 0x8DA1, 0xB71F, 0x8DA2, + 0xB720, 0x8DA3, 0xB721, 0x8DA4, 0xB722, 0x8DA5, 0xB723, 0x8DA6, + 0xB724, 0x8DA7, 0xB725, 0x8DA8, 0xB726, 0x8DA9, 0xB727, 0x8DAA, + 0xB728, 0xB6DF, 0xB729, 0xB6E0, 0xB72A, 0x8DAB, 0xB72B, 0x8DAC, + 0xB72C, 0xB6E1, 0xB72D, 0x8DAD, 0xB72E, 0x8DAE, 0xB72F, 0xB6E2, + 0xB730, 0xB6E3, 0xB731, 0x8DAF, 0xB732, 0x8DB0, 0xB733, 0x8DB1, + 0xB734, 0x8DB2, 0xB735, 0x8DB3, 0xB736, 0x8DB4, 0xB737, 0x8DB5, + 0xB738, 0xB6E4, 0xB739, 0xB6E5, 0xB73A, 0x8DB6, 0xB73B, 0xB6E6, + 0xB73C, 0x8DB7, 0xB73D, 0x8DB8, 0xB73E, 0x8DB9, 0xB73F, 0x8DBA, + 0xB740, 0x8DBB, 0xB741, 0x8DBC, 0xB742, 0x8DBD, 0xB743, 0x8DBE, + 0xB744, 0xB6E7, 0xB745, 0x8DBF, 0xB746, 0x8DC0, 0xB747, 0x8DC1, + 0xB748, 0xB6E8, 0xB749, 0x8DC2, 0xB74A, 0x8DC3, 0xB74B, 0x8DC4, + 0xB74C, 0xB6E9, 0xB74D, 0x8DC5, 0xB74E, 0x8DC6, 0xB74F, 0x8DC7, + 0xB750, 0x8DC8, 0xB751, 0x8DC9, 0xB752, 0x8DCA, 0xB753, 0x8DCB, + 0xB754, 0xB6EA, 0xB755, 0xB6EB, 0xB756, 0x8DCC, 0xB757, 0x8DCD, + 0xB758, 0x8DCE, 0xB759, 0x8DCF, 0xB75A, 0x8DD0, 0xB75B, 0x8DD1, + 0xB75C, 0x8DD2, 0xB75D, 0x8DD3, 0xB75E, 0x8DD4, 0xB75F, 0x8DD5, + 0xB760, 0xB6EC, 0xB761, 0x8DD6, 0xB762, 0x8DD7, 0xB763, 0x8DD8, + 0xB764, 0xB6ED, 0xB765, 0x8DD9, 0xB766, 0x8DDA, 0xB767, 0x8DDB, + 0xB768, 0xB6EE, 0xB769, 0x8DDC, 0xB76A, 0x8DDD, 0xB76B, 0x8DDE, + 0xB76C, 0x8DDF, 0xB76D, 0x8DE0, 0xB76E, 0x8DE1, 0xB76F, 0x8DE2, + 0xB770, 0xB6EF, 0xB771, 0xB6F0, 0xB772, 0x8DE3, 0xB773, 0xB6F1, + 0xB774, 0x8DE4, 0xB775, 0xB6F2, 0xB776, 0x8DE5, 0xB777, 0x8DE6, + 0xB778, 0x8DE7, 0xB779, 0x8DE8, 0xB77A, 0x8DE9, 0xB77B, 0x8DEA, + 0xB77C, 0xB6F3, 0xB77D, 0xB6F4, 0xB77E, 0x8DEB, 0xB77F, 0x8DEC, + 0xB780, 0xB6F5, 0xB781, 0x8DED, 0xB782, 0x8DEE, 0xB783, 0x8DEF, + 0xB784, 0xB6F6, 0xB785, 0x8DF0, 0xB786, 0x8DF1, 0xB787, 0x8DF2, + 0xB788, 0x8DF3, 0xB789, 0x8DF4, 0xB78A, 0x8DF5, 0xB78B, 0x8DF6, + 0xB78C, 0xB6F7, 0xB78D, 0xB6F8, 0xB78E, 0x8DF7, 0xB78F, 0xB6F9, + 0xB790, 0xB6FA, 0xB791, 0xB6FB, 0xB792, 0xB6FC, 0xB793, 0x8DF8, + 0xB794, 0x8DF9, 0xB795, 0x8DFA, 0xB796, 0xB6FD, 0xB797, 0xB6FE, + 0xB798, 0xB7A1, 0xB799, 0xB7A2, 0xB79A, 0x8DFB, 0xB79B, 0x8DFC, + 0xB79C, 0xB7A3, 0xB79D, 0x8DFD, 0xB79E, 0x8DFE, 0xB79F, 0x8E41, + 0xB7A0, 0xB7A4, 0xB7A1, 0x8E42, 0xB7A2, 0x8E43, 0xB7A3, 0x8E44, + 0xB7A4, 0x8E45, 0xB7A5, 0x8E46, 0xB7A6, 0x8E47, 0xB7A7, 0x8E48, + 0xB7A8, 0xB7A5, 0xB7A9, 0xB7A6, 0xB7AA, 0x8E49, 0xB7AB, 0xB7A7, + 0xB7AC, 0xB7A8, 0xB7AD, 0xB7A9, 0xB7AE, 0x8E4A, 0xB7AF, 0x8E4B, + 0xB7B0, 0x8E4C, 0xB7B1, 0x8E4D, 0xB7B2, 0x8E4E, 0xB7B3, 0x8E4F, + 0xB7B4, 0xB7AA, 0xB7B5, 0xB7AB, 0xB7B6, 0x8E50, 0xB7B7, 0x8E51, + 0xB7B8, 0xB7AC, 0xB7B9, 0x8E52, 0xB7BA, 0x8E53, 0xB7BB, 0x8E54, + 0xB7BC, 0x8E55, 0xB7BD, 0x8E56, 0xB7BE, 0x8E57, 0xB7BF, 0x8E58, + 0xB7C0, 0x8E59, 0xB7C1, 0x8E5A, 0xB7C2, 0x8E61, 0xB7C3, 0x8E62, + 0xB7C4, 0x8E63, 0xB7C5, 0x8E64, 0xB7C6, 0x8E65, 0xB7C7, 0xB7AD, + 0xB7C8, 0x8E66, 0xB7C9, 0xB7AE, 0xB7CA, 0x8E67, 0xB7CB, 0x8E68, + 0xB7CC, 0x8E69, 0xB7CD, 0x8E6A, 0xB7CE, 0x8E6B, 0xB7CF, 0x8E6C, + 0xB7D0, 0x8E6D, 0xB7D1, 0x8E6E, 0xB7D2, 0x8E6F, 0xB7D3, 0x8E70, + 0xB7D4, 0x8E71, 0xB7D5, 0x8E72, 0xB7D6, 0x8E73, 0xB7D7, 0x8E74, + 0xB7D8, 0x8E75, 0xB7D9, 0x8E76, 0xB7DA, 0x8E77, 0xB7DB, 0x8E78, + 0xB7DC, 0x8E79, 0xB7DD, 0x8E7A, 0xB7DE, 0x8E81, 0xB7DF, 0x8E82, + 0xB7E0, 0x8E83, 0xB7E1, 0x8E84, 0xB7E2, 0x8E85, 0xB7E3, 0x8E86, + 0xB7E4, 0x8E87, 0xB7E5, 0x8E88, 0xB7E6, 0x8E89, 0xB7E7, 0x8E8A, + 0xB7E8, 0x8E8B, 0xB7E9, 0x8E8C, 0xB7EA, 0x8E8D, 0xB7EB, 0x8E8E, + 0xB7EC, 0xB7AF, 0xB7ED, 0xB7B0, 0xB7EE, 0x8E8F, 0xB7EF, 0x8E90, + 0xB7F0, 0xB7B1, 0xB7F1, 0x8E91, 0xB7F2, 0x8E92, 0xB7F3, 0x8E93, + 0xB7F4, 0xB7B2, 0xB7F5, 0x8E94, 0xB7F6, 0x8E95, 0xB7F7, 0x8E96, + 0xB7F8, 0x8E97, 0xB7F9, 0x8E98, 0xB7FA, 0x8E99, 0xB7FB, 0x8E9A, + 0xB7FC, 0xB7B3, 0xB7FD, 0xB7B4, 0xB7FE, 0x8E9B, 0xB7FF, 0xB7B5, + 0xB800, 0xB7B6, 0xB801, 0xB7B7, 0xB802, 0x8E9C, 0xB803, 0x8E9D, + 0xB804, 0x8E9E, 0xB805, 0x8E9F, 0xB806, 0x8EA0, 0xB807, 0xB7B8, + 0xB808, 0xB7B9, 0xB809, 0xB7BA, 0xB80A, 0x8EA1, 0xB80B, 0x8EA2, + 0xB80C, 0xB7BB, 0xB80D, 0x8EA3, 0xB80E, 0x8EA4, 0xB80F, 0x8EA5, + 0xB810, 0xB7BC, 0xB811, 0x8EA6, 0xB812, 0x8EA7, 0xB813, 0x8EA8, + 0xB814, 0x8EA9, 0xB815, 0x8EAA, 0xB816, 0x8EAB, 0xB817, 0x8EAC, + 0xB818, 0xB7BD, 0xB819, 0xB7BE, 0xB81A, 0x8EAD, 0xB81B, 0xB7BF, + 0xB81C, 0x8EAE, 0xB81D, 0xB7C0, 0xB81E, 0x8EAF, 0xB81F, 0x8EB0, + 0xB820, 0x8EB1, 0xB821, 0x8EB2, 0xB822, 0x8EB3, 0xB823, 0x8EB4, + 0xB824, 0xB7C1, 0xB825, 0xB7C2, 0xB826, 0x8EB5, 0xB827, 0x8EB6, + 0xB828, 0xB7C3, 0xB829, 0x8EB7, 0xB82A, 0x8EB8, 0xB82B, 0x8EB9, + 0xB82C, 0xB7C4, 0xB82D, 0x8EBA, 0xB82E, 0x8EBB, 0xB82F, 0x8EBC, + 0xB830, 0x8EBD, 0xB831, 0x8EBE, 0xB832, 0x8EBF, 0xB833, 0x8EC0, + 0xB834, 0xB7C5, 0xB835, 0xB7C6, 0xB836, 0x8EC1, 0xB837, 0xB7C7, + 0xB838, 0xB7C8, 0xB839, 0xB7C9, 0xB83A, 0x8EC2, 0xB83B, 0x8EC3, + 0xB83C, 0x8EC4, 0xB83D, 0x8EC5, 0xB83E, 0x8EC6, 0xB83F, 0x8EC7, + 0xB840, 0xB7CA, 0xB841, 0x8EC8, 0xB842, 0x8EC9, 0xB843, 0x8ECA, + 0xB844, 0xB7CB, 0xB845, 0x8ECB, 0xB846, 0x8ECC, 0xB847, 0x8ECD, + 0xB848, 0x8ECE, 0xB849, 0x8ECF, 0xB84A, 0x8ED0, 0xB84B, 0x8ED1, + 0xB84C, 0x8ED2, 0xB84D, 0x8ED3, 0xB84E, 0x8ED4, 0xB84F, 0x8ED5, + 0xB850, 0x8ED6, 0xB851, 0xB7CC, 0xB852, 0x8ED7, 0xB853, 0xB7CD, + 0xB854, 0x8ED8, 0xB855, 0x8ED9, 0xB856, 0x8EDA, 0xB857, 0x8EDB, + 0xB858, 0x8EDC, 0xB859, 0x8EDD, 0xB85A, 0x8EDE, 0xB85B, 0x8EDF, + 0xB85C, 0xB7CE, 0xB85D, 0xB7CF, 0xB85E, 0x8EE0, 0xB85F, 0x8EE1, + 0xB860, 0xB7D0, 0xB861, 0x8EE2, 0xB862, 0x8EE3, 0xB863, 0x8EE4, + 0xB864, 0xB7D1, 0xB865, 0x8EE5, 0xB866, 0x8EE6, 0xB867, 0x8EE7, + 0xB868, 0x8EE8, 0xB869, 0x8EE9, 0xB86A, 0x8EEA, 0xB86B, 0x8EEB, + 0xB86C, 0xB7D2, 0xB86D, 0xB7D3, 0xB86E, 0x8EEC, 0xB86F, 0xB7D4, + 0xB870, 0x8EED, 0xB871, 0xB7D5, 0xB872, 0x8EEE, 0xB873, 0x8EEF, + 0xB874, 0x8EF0, 0xB875, 0x8EF1, 0xB876, 0x8EF2, 0xB877, 0x8EF3, + 0xB878, 0xB7D6, 0xB879, 0x8EF4, 0xB87A, 0x8EF5, 0xB87B, 0x8EF6, + 0xB87C, 0xB7D7, 0xB87D, 0x8EF7, 0xB87E, 0x8EF8, 0xB87F, 0x8EF9, + 0xB880, 0x8EFA, 0xB881, 0x8EFB, 0xB882, 0x8EFC, 0xB883, 0x8EFD, + 0xB884, 0x8EFE, 0xB885, 0x8F41, 0xB886, 0x8F42, 0xB887, 0x8F43, + 0xB888, 0x8F44, 0xB889, 0x8F45, 0xB88A, 0x8F46, 0xB88B, 0x8F47, + 0xB88C, 0x8F48, 0xB88D, 0xB7D8, 0xB88E, 0x8F49, 0xB88F, 0x8F4A, + 0xB890, 0x8F4B, 0xB891, 0x8F4C, 0xB892, 0x8F4D, 0xB893, 0x8F4E, + 0xB894, 0x8F4F, 0xB895, 0x8F50, 0xB896, 0x8F51, 0xB897, 0x8F52, + 0xB898, 0x8F53, 0xB899, 0x8F54, 0xB89A, 0x8F55, 0xB89B, 0x8F56, + 0xB89C, 0x8F57, 0xB89D, 0x8F58, 0xB89E, 0x8F59, 0xB89F, 0x8F5A, + 0xB8A0, 0x8F61, 0xB8A1, 0x8F62, 0xB8A2, 0x8F63, 0xB8A3, 0x8F64, + 0xB8A4, 0x8F65, 0xB8A5, 0x8F66, 0xB8A6, 0x8F67, 0xB8A7, 0x8F68, + 0xB8A8, 0xB7D9, 0xB8A9, 0x8F69, 0xB8AA, 0x8F6A, 0xB8AB, 0x8F6B, + 0xB8AC, 0x8F6C, 0xB8AD, 0x8F6D, 0xB8AE, 0x8F6E, 0xB8AF, 0x8F6F, + 0xB8B0, 0xB7DA, 0xB8B1, 0x8F70, 0xB8B2, 0x8F71, 0xB8B3, 0x8F72, + 0xB8B4, 0xB7DB, 0xB8B5, 0x8F73, 0xB8B6, 0x8F74, 0xB8B7, 0x8F75, + 0xB8B8, 0xB7DC, 0xB8B9, 0x8F76, 0xB8BA, 0x8F77, 0xB8BB, 0x8F78, + 0xB8BC, 0x8F79, 0xB8BD, 0x8F7A, 0xB8BE, 0x8F81, 0xB8BF, 0x8F82, + 0xB8C0, 0xB7DD, 0xB8C1, 0xB7DE, 0xB8C2, 0x8F83, 0xB8C3, 0xB7DF, + 0xB8C4, 0x8F84, 0xB8C5, 0xB7E0, 0xB8C6, 0x8F85, 0xB8C7, 0x8F86, + 0xB8C8, 0x8F87, 0xB8C9, 0x8F88, 0xB8CA, 0x8F89, 0xB8CB, 0x8F8A, + 0xB8CC, 0xB7E1, 0xB8CD, 0x8F8B, 0xB8CE, 0x8F8C, 0xB8CF, 0x8F8D, + 0xB8D0, 0xB7E2, 0xB8D1, 0x8F8E, 0xB8D2, 0x8F8F, 0xB8D3, 0x8F90, + 0xB8D4, 0xB7E3, 0xB8D5, 0x8F91, 0xB8D6, 0x8F92, 0xB8D7, 0x8F93, + 0xB8D8, 0x8F94, 0xB8D9, 0x8F95, 0xB8DA, 0x8F96, 0xB8DB, 0x8F97, + 0xB8DC, 0x8F98, 0xB8DD, 0xB7E4, 0xB8DE, 0x8F99, 0xB8DF, 0xB7E5, + 0xB8E0, 0x8F9A, 0xB8E1, 0xB7E6, 0xB8E2, 0x8F9B, 0xB8E3, 0x8F9C, + 0xB8E4, 0x8F9D, 0xB8E5, 0x8F9E, 0xB8E6, 0x8F9F, 0xB8E7, 0x8FA0, + 0xB8E8, 0xB7E7, 0xB8E9, 0xB7E8, 0xB8EA, 0x8FA1, 0xB8EB, 0x8FA2, + 0xB8EC, 0xB7E9, 0xB8ED, 0x8FA3, 0xB8EE, 0x8FA4, 0xB8EF, 0x8FA5, + 0xB8F0, 0xB7EA, 0xB8F1, 0x8FA6, 0xB8F2, 0x8FA7, 0xB8F3, 0x8FA8, + 0xB8F4, 0x8FA9, 0xB8F5, 0x8FAA, 0xB8F6, 0x8FAB, 0xB8F7, 0x8FAC, + 0xB8F8, 0xB7EB, 0xB8F9, 0xB7EC, 0xB8FA, 0x8FAD, 0xB8FB, 0xB7ED, + 0xB8FC, 0x8FAE, 0xB8FD, 0xB7EE, 0xB8FE, 0x8FAF, 0xB8FF, 0x8FB0, + 0xB900, 0x8FB1, 0xB901, 0x8FB2, 0xB902, 0x8FB3, 0xB903, 0x8FB4, + 0xB904, 0xB7EF, 0xB905, 0x8FB5, 0xB906, 0x8FB6, 0xB907, 0x8FB7, + 0xB908, 0x8FB8, 0xB909, 0x8FB9, 0xB90A, 0x8FBA, 0xB90B, 0x8FBB, + 0xB90C, 0x8FBC, 0xB90D, 0x8FBD, 0xB90E, 0x8FBE, 0xB90F, 0x8FBF, + 0xB910, 0x8FC0, 0xB911, 0x8FC1, 0xB912, 0x8FC2, 0xB913, 0x8FC3, + 0xB914, 0x8FC4, 0xB915, 0x8FC5, 0xB916, 0x8FC6, 0xB917, 0x8FC7, + 0xB918, 0xB7F0, 0xB919, 0x8FC8, 0xB91A, 0x8FC9, 0xB91B, 0x8FCA, + 0xB91C, 0x8FCB, 0xB91D, 0x8FCC, 0xB91E, 0x8FCD, 0xB91F, 0x8FCE, + 0xB920, 0xB7F1, 0xB921, 0x8FCF, 0xB922, 0x8FD0, 0xB923, 0x8FD1, + 0xB924, 0x8FD2, 0xB925, 0x8FD3, 0xB926, 0x8FD4, 0xB927, 0x8FD5, + 0xB928, 0x8FD6, 0xB929, 0x8FD7, 0xB92A, 0x8FD8, 0xB92B, 0x8FD9, + 0xB92C, 0x8FDA, 0xB92D, 0x8FDB, 0xB92E, 0x8FDC, 0xB92F, 0x8FDD, + 0xB930, 0x8FDE, 0xB931, 0x8FDF, 0xB932, 0x8FE0, 0xB933, 0x8FE1, + 0xB934, 0x8FE2, 0xB935, 0x8FE3, 0xB936, 0x8FE4, 0xB937, 0x8FE5, + 0xB938, 0x8FE6, 0xB939, 0x8FE7, 0xB93A, 0x8FE8, 0xB93B, 0x8FE9, + 0xB93C, 0xB7F2, 0xB93D, 0xB7F3, 0xB93E, 0x8FEA, 0xB93F, 0x8FEB, + 0xB940, 0xB7F4, 0xB941, 0x8FEC, 0xB942, 0x8FED, 0xB943, 0x8FEE, + 0xB944, 0xB7F5, 0xB945, 0x8FEF, 0xB946, 0x8FF0, 0xB947, 0x8FF1, + 0xB948, 0x8FF2, 0xB949, 0x8FF3, 0xB94A, 0x8FF4, 0xB94B, 0x8FF5, + 0xB94C, 0xB7F6, 0xB94D, 0x8FF6, 0xB94E, 0x8FF7, 0xB94F, 0xB7F7, + 0xB950, 0x8FF8, 0xB951, 0xB7F8, 0xB952, 0x8FF9, 0xB953, 0x8FFA, + 0xB954, 0x8FFB, 0xB955, 0x8FFC, 0xB956, 0x8FFD, 0xB957, 0x8FFE, + 0xB958, 0xB7F9, 0xB959, 0xB7FA, 0xB95A, 0x9041, 0xB95B, 0x9042, + 0xB95C, 0xB7FB, 0xB95D, 0x9043, 0xB95E, 0x9044, 0xB95F, 0x9045, + 0xB960, 0xB7FC, 0xB961, 0x9046, 0xB962, 0x9047, 0xB963, 0x9048, + 0xB964, 0x9049, 0xB965, 0x904A, 0xB966, 0x904B, 0xB967, 0x904C, + 0xB968, 0xB7FD, 0xB969, 0xB7FE, 0xB96A, 0x904D, 0xB96B, 0xB8A1, + 0xB96C, 0x904E, 0xB96D, 0xB8A2, 0xB96E, 0x904F, 0xB96F, 0x9050, + 0xB970, 0x9051, 0xB971, 0x9052, 0xB972, 0x9053, 0xB973, 0x9054, + 0xB974, 0xB8A3, 0xB975, 0xB8A4, 0xB976, 0x9055, 0xB977, 0x9056, + 0xB978, 0xB8A5, 0xB979, 0x9057, 0xB97A, 0x9058, 0xB97B, 0x9059, + 0xB97C, 0xB8A6, 0xB97D, 0x905A, 0xB97E, 0x9061, 0xB97F, 0x9062, + 0xB980, 0x9063, 0xB981, 0x9064, 0xB982, 0x9065, 0xB983, 0x9066, + 0xB984, 0xB8A7, 0xB985, 0xB8A8, 0xB986, 0x9067, 0xB987, 0xB8A9, + 0xB988, 0x9068, 0xB989, 0xB8AA, 0xB98A, 0xB8AB, 0xB98B, 0x9069, + 0xB98C, 0x906A, 0xB98D, 0xB8AC, 0xB98E, 0xB8AD, 0xB98F, 0x906B, + 0xB990, 0x906C, 0xB991, 0x906D, 0xB992, 0x906E, 0xB993, 0x906F, + 0xB994, 0x9070, 0xB995, 0x9071, 0xB996, 0x9072, 0xB997, 0x9073, + 0xB998, 0x9074, 0xB999, 0x9075, 0xB99A, 0x9076, 0xB99B, 0x9077, + 0xB99C, 0x9078, 0xB99D, 0x9079, 0xB99E, 0x907A, 0xB99F, 0x9081, + 0xB9A0, 0x9082, 0xB9A1, 0x9083, 0xB9A2, 0x9084, 0xB9A3, 0x9085, + 0xB9A4, 0x9086, 0xB9A5, 0x9087, 0xB9A6, 0x9088, 0xB9A7, 0x9089, + 0xB9A8, 0x908A, 0xB9A9, 0x908B, 0xB9AA, 0x908C, 0xB9AB, 0x908D, + 0xB9AC, 0xB8AE, 0xB9AD, 0xB8AF, 0xB9AE, 0x908E, 0xB9AF, 0x908F, + 0xB9B0, 0xB8B0, 0xB9B1, 0x9090, 0xB9B2, 0x9091, 0xB9B3, 0x9092, + 0xB9B4, 0xB8B1, 0xB9B5, 0x9093, 0xB9B6, 0x9094, 0xB9B7, 0x9095, + 0xB9B8, 0x9096, 0xB9B9, 0x9097, 0xB9BA, 0x9098, 0xB9BB, 0x9099, + 0xB9BC, 0xB8B2, 0xB9BD, 0xB8B3, 0xB9BE, 0x909A, 0xB9BF, 0xB8B4, + 0xB9C0, 0x909B, 0xB9C1, 0xB8B5, 0xB9C2, 0x909C, 0xB9C3, 0x909D, + 0xB9C4, 0x909E, 0xB9C5, 0x909F, 0xB9C6, 0x90A0, 0xB9C7, 0x90A1, + 0xB9C8, 0xB8B6, 0xB9C9, 0xB8B7, 0xB9CA, 0x90A2, 0xB9CB, 0x90A3, + 0xB9CC, 0xB8B8, 0xB9CD, 0x90A4, 0xB9CE, 0xB8B9, 0xB9CF, 0xB8BA, + 0xB9D0, 0xB8BB, 0xB9D1, 0xB8BC, 0xB9D2, 0xB8BD, 0xB9D3, 0x90A5, + 0xB9D4, 0x90A6, 0xB9D5, 0x90A7, 0xB9D6, 0x90A8, 0xB9D7, 0x90A9, + 0xB9D8, 0xB8BE, 0xB9D9, 0xB8BF, 0xB9DA, 0x90AA, 0xB9DB, 0xB8C0, + 0xB9DC, 0x90AB, 0xB9DD, 0xB8C1, 0xB9DE, 0xB8C2, 0xB9DF, 0x90AC, + 0xB9E0, 0x90AD, 0xB9E1, 0xB8C3, 0xB9E2, 0x90AE, 0xB9E3, 0xB8C4, + 0xB9E4, 0xB8C5, 0xB9E5, 0xB8C6, 0xB9E6, 0x90AF, 0xB9E7, 0x90B0, + 0xB9E8, 0xB8C7, 0xB9E9, 0x90B1, 0xB9EA, 0x90B2, 0xB9EB, 0x90B3, + 0xB9EC, 0xB8C8, 0xB9ED, 0x90B4, 0xB9EE, 0x90B5, 0xB9EF, 0x90B6, + 0xB9F0, 0x90B7, 0xB9F1, 0x90B8, 0xB9F2, 0x90B9, 0xB9F3, 0x90BA, + 0xB9F4, 0xB8C9, 0xB9F5, 0xB8CA, 0xB9F6, 0x90BB, 0xB9F7, 0xB8CB, + 0xB9F8, 0xB8CC, 0xB9F9, 0xB8CD, 0xB9FA, 0xB8CE, 0xB9FB, 0x90BC, + 0xB9FC, 0x90BD, 0xB9FD, 0x90BE, 0xB9FE, 0x90BF, 0xB9FF, 0x90C0, + 0xBA00, 0xB8CF, 0xBA01, 0xB8D0, 0xBA02, 0x90C1, 0xBA03, 0x90C2, + 0xBA04, 0x90C3, 0xBA05, 0x90C4, 0xBA06, 0x90C5, 0xBA07, 0x90C6, + 0xBA08, 0xB8D1, 0xBA09, 0x90C7, 0xBA0A, 0x90C8, 0xBA0B, 0x90C9, + 0xBA0C, 0x90CA, 0xBA0D, 0x90CB, 0xBA0E, 0x90CC, 0xBA0F, 0x90CD, + 0xBA10, 0x90CE, 0xBA11, 0x90CF, 0xBA12, 0x90D0, 0xBA13, 0x90D1, + 0xBA14, 0x90D2, 0xBA15, 0xB8D2, 0xBA16, 0x90D3, 0xBA17, 0x90D4, + 0xBA18, 0x90D5, 0xBA19, 0x90D6, 0xBA1A, 0x90D7, 0xBA1B, 0x90D8, + 0xBA1C, 0x90D9, 0xBA1D, 0x90DA, 0xBA1E, 0x90DB, 0xBA1F, 0x90DC, + 0xBA20, 0x90DD, 0xBA21, 0x90DE, 0xBA22, 0x90DF, 0xBA23, 0x90E0, + 0xBA24, 0x90E1, 0xBA25, 0x90E2, 0xBA26, 0x90E3, 0xBA27, 0x90E4, + 0xBA28, 0x90E5, 0xBA29, 0x90E6, 0xBA2A, 0x90E7, 0xBA2B, 0x90E8, + 0xBA2C, 0x90E9, 0xBA2D, 0x90EA, 0xBA2E, 0x90EB, 0xBA2F, 0x90EC, + 0xBA30, 0x90ED, 0xBA31, 0x90EE, 0xBA32, 0x90EF, 0xBA33, 0x90F0, + 0xBA34, 0x90F1, 0xBA35, 0x90F2, 0xBA36, 0x90F3, 0xBA37, 0x90F4, + 0xBA38, 0xB8D3, 0xBA39, 0xB8D4, 0xBA3A, 0x90F5, 0xBA3B, 0x90F6, + 0xBA3C, 0xB8D5, 0xBA3D, 0x90F7, 0xBA3E, 0x90F8, 0xBA3F, 0x90F9, + 0xBA40, 0xB8D6, 0xBA41, 0x90FA, 0xBA42, 0xB8D7, 0xBA43, 0x90FB, + 0xBA44, 0x90FC, 0xBA45, 0x90FD, 0xBA46, 0x90FE, 0xBA47, 0x9141, + 0xBA48, 0xB8D8, 0xBA49, 0xB8D9, 0xBA4A, 0x9142, 0xBA4B, 0xB8DA, + 0xBA4C, 0x9143, 0xBA4D, 0xB8DB, 0xBA4E, 0xB8DC, 0xBA4F, 0x9144, + 0xBA50, 0x9145, 0xBA51, 0x9146, 0xBA52, 0x9147, 0xBA53, 0xB8DD, + 0xBA54, 0xB8DE, 0xBA55, 0xB8DF, 0xBA56, 0x9148, 0xBA57, 0x9149, + 0xBA58, 0xB8E0, 0xBA59, 0x914A, 0xBA5A, 0x914B, 0xBA5B, 0x914C, + 0xBA5C, 0xB8E1, 0xBA5D, 0x914D, 0xBA5E, 0x914E, 0xBA5F, 0x914F, + 0xBA60, 0x9150, 0xBA61, 0x9151, 0xBA62, 0x9152, 0xBA63, 0x9153, + 0xBA64, 0xB8E2, 0xBA65, 0xB8E3, 0xBA66, 0x9154, 0xBA67, 0xB8E4, + 0xBA68, 0xB8E5, 0xBA69, 0xB8E6, 0xBA6A, 0x9155, 0xBA6B, 0x9156, + 0xBA6C, 0x9157, 0xBA6D, 0x9158, 0xBA6E, 0x9159, 0xBA6F, 0x915A, + 0xBA70, 0xB8E7, 0xBA71, 0xB8E8, 0xBA72, 0x9161, 0xBA73, 0x9162, + 0xBA74, 0xB8E9, 0xBA75, 0x9163, 0xBA76, 0x9164, 0xBA77, 0x9165, + 0xBA78, 0xB8EA, 0xBA79, 0x9166, 0xBA7A, 0x9167, 0xBA7B, 0x9168, + 0xBA7C, 0x9169, 0xBA7D, 0x916A, 0xBA7E, 0x916B, 0xBA7F, 0x916C, + 0xBA80, 0x916D, 0xBA81, 0x916E, 0xBA82, 0x916F, 0xBA83, 0xB8EB, + 0xBA84, 0xB8EC, 0xBA85, 0xB8ED, 0xBA86, 0x9170, 0xBA87, 0xB8EE, + 0xBA88, 0x9171, 0xBA89, 0x9172, 0xBA8A, 0x9173, 0xBA8B, 0x9174, + 0xBA8C, 0xB8EF, 0xBA8D, 0x9175, 0xBA8E, 0x9176, 0xBA8F, 0x9177, + 0xBA90, 0x9178, 0xBA91, 0x9179, 0xBA92, 0x917A, 0xBA93, 0x9181, + 0xBA94, 0x9182, 0xBA95, 0x9183, 0xBA96, 0x9184, 0xBA97, 0x9185, + 0xBA98, 0x9186, 0xBA99, 0x9187, 0xBA9A, 0x9188, 0xBA9B, 0x9189, + 0xBA9C, 0x918A, 0xBA9D, 0x918B, 0xBA9E, 0x918C, 0xBA9F, 0x918D, + 0xBAA0, 0x918E, 0xBAA1, 0x918F, 0xBAA2, 0x9190, 0xBAA3, 0x9191, + 0xBAA4, 0x9192, 0xBAA5, 0x9193, 0xBAA6, 0x9194, 0xBAA7, 0x9195, + 0xBAA8, 0xB8F0, 0xBAA9, 0xB8F1, 0xBAAA, 0x9196, 0xBAAB, 0xB8F2, + 0xBAAC, 0xB8F3, 0xBAAD, 0x9197, 0xBAAE, 0x9198, 0xBAAF, 0x9199, + 0xBAB0, 0xB8F4, 0xBAB1, 0x919A, 0xBAB2, 0xB8F5, 0xBAB3, 0x919B, + 0xBAB4, 0x919C, 0xBAB5, 0x919D, 0xBAB6, 0x919E, 0xBAB7, 0x919F, + 0xBAB8, 0xB8F6, 0xBAB9, 0xB8F7, 0xBABA, 0x91A0, 0xBABB, 0xB8F8, + 0xBABC, 0x91A1, 0xBABD, 0xB8F9, 0xBABE, 0x91A2, 0xBABF, 0x91A3, + 0xBAC0, 0x91A4, 0xBAC1, 0x91A5, 0xBAC2, 0x91A6, 0xBAC3, 0x91A7, + 0xBAC4, 0xB8FA, 0xBAC5, 0x91A8, 0xBAC6, 0x91A9, 0xBAC7, 0x91AA, + 0xBAC8, 0xB8FB, 0xBAC9, 0x91AB, 0xBACA, 0x91AC, 0xBACB, 0x91AD, + 0xBACC, 0x91AE, 0xBACD, 0x91AF, 0xBACE, 0x91B0, 0xBACF, 0x91B1, + 0xBAD0, 0x91B2, 0xBAD1, 0x91B3, 0xBAD2, 0x91B4, 0xBAD3, 0x91B5, + 0xBAD4, 0x91B6, 0xBAD5, 0x91B7, 0xBAD6, 0x91B8, 0xBAD7, 0x91B9, + 0xBAD8, 0xB8FC, 0xBAD9, 0xB8FD, 0xBADA, 0x91BA, 0xBADB, 0x91BB, + 0xBADC, 0x91BC, 0xBADD, 0x91BD, 0xBADE, 0x91BE, 0xBADF, 0x91BF, + 0xBAE0, 0x91C0, 0xBAE1, 0x91C1, 0xBAE2, 0x91C2, 0xBAE3, 0x91C3, + 0xBAE4, 0x91C4, 0xBAE5, 0x91C5, 0xBAE6, 0x91C6, 0xBAE7, 0x91C7, + 0xBAE8, 0x91C8, 0xBAE9, 0x91C9, 0xBAEA, 0x91CA, 0xBAEB, 0x91CB, + 0xBAEC, 0x91CC, 0xBAED, 0x91CD, 0xBAEE, 0x91CE, 0xBAEF, 0x91CF, + 0xBAF0, 0x91D0, 0xBAF1, 0x91D1, 0xBAF2, 0x91D2, 0xBAF3, 0x91D3, + 0xBAF4, 0x91D4, 0xBAF5, 0x91D5, 0xBAF6, 0x91D6, 0xBAF7, 0x91D7, + 0xBAF8, 0x91D8, 0xBAF9, 0x91D9, 0xBAFA, 0x91DA, 0xBAFB, 0x91DB, + 0xBAFC, 0xB8FE, 0xBAFD, 0x91DC, 0xBAFE, 0x91DD, 0xBAFF, 0x91DE, + 0xBB00, 0xB9A1, 0xBB01, 0x91DF, 0xBB02, 0x91E0, 0xBB03, 0x91E1, + 0xBB04, 0xB9A2, 0xBB05, 0x91E2, 0xBB06, 0x91E3, 0xBB07, 0x91E4, + 0xBB08, 0x91E5, 0xBB09, 0x91E6, 0xBB0A, 0x91E7, 0xBB0B, 0x91E8, + 0xBB0C, 0x91E9, 0xBB0D, 0xB9A3, 0xBB0E, 0x91EA, 0xBB0F, 0xB9A4, + 0xBB10, 0x91EB, 0xBB11, 0xB9A5, 0xBB12, 0x91EC, 0xBB13, 0x91ED, + 0xBB14, 0x91EE, 0xBB15, 0x91EF, 0xBB16, 0x91F0, 0xBB17, 0x91F1, + 0xBB18, 0xB9A6, 0xBB19, 0x91F2, 0xBB1A, 0x91F3, 0xBB1B, 0x91F4, + 0xBB1C, 0xB9A7, 0xBB1D, 0x91F5, 0xBB1E, 0x91F6, 0xBB1F, 0x91F7, + 0xBB20, 0xB9A8, 0xBB21, 0x91F8, 0xBB22, 0x91F9, 0xBB23, 0x91FA, + 0xBB24, 0x91FB, 0xBB25, 0x91FC, 0xBB26, 0x91FD, 0xBB27, 0x91FE, + 0xBB28, 0x9241, 0xBB29, 0xB9A9, 0xBB2A, 0x9242, 0xBB2B, 0xB9AA, + 0xBB2C, 0x9243, 0xBB2D, 0x9244, 0xBB2E, 0x9245, 0xBB2F, 0x9246, + 0xBB30, 0x9247, 0xBB31, 0x9248, 0xBB32, 0x9249, 0xBB33, 0x924A, + 0xBB34, 0xB9AB, 0xBB35, 0xB9AC, 0xBB36, 0xB9AD, 0xBB37, 0x924B, + 0xBB38, 0xB9AE, 0xBB39, 0x924C, 0xBB3A, 0x924D, 0xBB3B, 0xB9AF, + 0xBB3C, 0xB9B0, 0xBB3D, 0xB9B1, 0xBB3E, 0xB9B2, 0xBB3F, 0x924E, + 0xBB40, 0x924F, 0xBB41, 0x9250, 0xBB42, 0x9251, 0xBB43, 0x9252, + 0xBB44, 0xB9B3, 0xBB45, 0xB9B4, 0xBB46, 0x9253, 0xBB47, 0xB9B5, + 0xBB48, 0x9254, 0xBB49, 0xB9B6, 0xBB4A, 0x9255, 0xBB4B, 0x9256, + 0xBB4C, 0x9257, 0xBB4D, 0xB9B7, 0xBB4E, 0x9258, 0xBB4F, 0xB9B8, + 0xBB50, 0xB9B9, 0xBB51, 0x9259, 0xBB52, 0x925A, 0xBB53, 0x9261, + 0xBB54, 0xB9BA, 0xBB55, 0x9262, 0xBB56, 0x9263, 0xBB57, 0x9264, + 0xBB58, 0xB9BB, 0xBB59, 0x9265, 0xBB5A, 0x9266, 0xBB5B, 0x9267, + 0xBB5C, 0x9268, 0xBB5D, 0x9269, 0xBB5E, 0x926A, 0xBB5F, 0x926B, + 0xBB60, 0x926C, 0xBB61, 0xB9BC, 0xBB62, 0x926D, 0xBB63, 0xB9BD, + 0xBB64, 0x926E, 0xBB65, 0x926F, 0xBB66, 0x9270, 0xBB67, 0x9271, + 0xBB68, 0x9272, 0xBB69, 0x9273, 0xBB6A, 0x9274, 0xBB6B, 0x9275, + 0xBB6C, 0xB9BE, 0xBB6D, 0x9276, 0xBB6E, 0x9277, 0xBB6F, 0x9278, + 0xBB70, 0x9279, 0xBB71, 0x927A, 0xBB72, 0x9281, 0xBB73, 0x9282, + 0xBB74, 0x9283, 0xBB75, 0x9284, 0xBB76, 0x9285, 0xBB77, 0x9286, + 0xBB78, 0x9287, 0xBB79, 0x9288, 0xBB7A, 0x9289, 0xBB7B, 0x928A, + 0xBB7C, 0x928B, 0xBB7D, 0x928C, 0xBB7E, 0x928D, 0xBB7F, 0x928E, + 0xBB80, 0x928F, 0xBB81, 0x9290, 0xBB82, 0x9291, 0xBB83, 0x9292, + 0xBB84, 0x9293, 0xBB85, 0x9294, 0xBB86, 0x9295, 0xBB87, 0x9296, + 0xBB88, 0xB9BF, 0xBB89, 0x9297, 0xBB8A, 0x9298, 0xBB8B, 0x9299, + 0xBB8C, 0xB9C0, 0xBB8D, 0x929A, 0xBB8E, 0x929B, 0xBB8F, 0x929C, + 0xBB90, 0xB9C1, 0xBB91, 0x929D, 0xBB92, 0x929E, 0xBB93, 0x929F, + 0xBB94, 0x92A0, 0xBB95, 0x92A1, 0xBB96, 0x92A2, 0xBB97, 0x92A3, + 0xBB98, 0x92A4, 0xBB99, 0x92A5, 0xBB9A, 0x92A6, 0xBB9B, 0x92A7, + 0xBB9C, 0x92A8, 0xBB9D, 0x92A9, 0xBB9E, 0x92AA, 0xBB9F, 0x92AB, + 0xBBA0, 0x92AC, 0xBBA1, 0x92AD, 0xBBA2, 0x92AE, 0xBBA3, 0x92AF, + 0xBBA4, 0xB9C2, 0xBBA5, 0x92B0, 0xBBA6, 0x92B1, 0xBBA7, 0x92B2, + 0xBBA8, 0xB9C3, 0xBBA9, 0x92B3, 0xBBAA, 0x92B4, 0xBBAB, 0x92B5, + 0xBBAC, 0xB9C4, 0xBBAD, 0x92B6, 0xBBAE, 0x92B7, 0xBBAF, 0x92B8, + 0xBBB0, 0x92B9, 0xBBB1, 0x92BA, 0xBBB2, 0x92BB, 0xBBB3, 0x92BC, + 0xBBB4, 0xB9C5, 0xBBB5, 0x92BD, 0xBBB6, 0x92BE, 0xBBB7, 0xB9C6, + 0xBBB8, 0x92BF, 0xBBB9, 0x92C0, 0xBBBA, 0x92C1, 0xBBBB, 0x92C2, + 0xBBBC, 0x92C3, 0xBBBD, 0x92C4, 0xBBBE, 0x92C5, 0xBBBF, 0x92C6, + 0xBBC0, 0xB9C7, 0xBBC1, 0x92C7, 0xBBC2, 0x92C8, 0xBBC3, 0x92C9, + 0xBBC4, 0xB9C8, 0xBBC5, 0x92CA, 0xBBC6, 0x92CB, 0xBBC7, 0x92CC, + 0xBBC8, 0xB9C9, 0xBBC9, 0x92CD, 0xBBCA, 0x92CE, 0xBBCB, 0x92CF, + 0xBBCC, 0x92D0, 0xBBCD, 0x92D1, 0xBBCE, 0x92D2, 0xBBCF, 0x92D3, + 0xBBD0, 0xB9CA, 0xBBD1, 0x92D4, 0xBBD2, 0x92D5, 0xBBD3, 0xB9CB, + 0xBBD4, 0x92D6, 0xBBD5, 0x92D7, 0xBBD6, 0x92D8, 0xBBD7, 0x92D9, + 0xBBD8, 0x92DA, 0xBBD9, 0x92DB, 0xBBDA, 0x92DC, 0xBBDB, 0x92DD, + 0xBBDC, 0x92DE, 0xBBDD, 0x92DF, 0xBBDE, 0x92E0, 0xBBDF, 0x92E1, + 0xBBE0, 0x92E2, 0xBBE1, 0x92E3, 0xBBE2, 0x92E4, 0xBBE3, 0x92E5, + 0xBBE4, 0x92E6, 0xBBE5, 0x92E7, 0xBBE6, 0x92E8, 0xBBE7, 0x92E9, + 0xBBE8, 0x92EA, 0xBBE9, 0x92EB, 0xBBEA, 0x92EC, 0xBBEB, 0x92ED, + 0xBBEC, 0x92EE, 0xBBED, 0x92EF, 0xBBEE, 0x92F0, 0xBBEF, 0x92F1, + 0xBBF0, 0x92F2, 0xBBF1, 0x92F3, 0xBBF2, 0x92F4, 0xBBF3, 0x92F5, + 0xBBF4, 0x92F6, 0xBBF5, 0x92F7, 0xBBF6, 0x92F8, 0xBBF7, 0x92F9, + 0xBBF8, 0xB9CC, 0xBBF9, 0xB9CD, 0xBBFA, 0x92FA, 0xBBFB, 0x92FB, + 0xBBFC, 0xB9CE, 0xBBFD, 0x92FC, 0xBBFE, 0x92FD, 0xBBFF, 0xB9CF, + 0xBC00, 0xB9D0, 0xBC01, 0x92FE, 0xBC02, 0xB9D1, 0xBC03, 0x9341, + 0xBC04, 0x9342, 0xBC05, 0x9343, 0xBC06, 0x9344, 0xBC07, 0x9345, + 0xBC08, 0xB9D2, 0xBC09, 0xB9D3, 0xBC0A, 0x9346, 0xBC0B, 0xB9D4, + 0xBC0C, 0xB9D5, 0xBC0D, 0xB9D6, 0xBC0E, 0x9347, 0xBC0F, 0xB9D7, + 0xBC10, 0x9348, 0xBC11, 0xB9D8, 0xBC12, 0x9349, 0xBC13, 0x934A, + 0xBC14, 0xB9D9, 0xBC15, 0xB9DA, 0xBC16, 0xB9DB, 0xBC17, 0xB9DC, + 0xBC18, 0xB9DD, 0xBC19, 0x934B, 0xBC1A, 0x934C, 0xBC1B, 0xB9DE, + 0xBC1C, 0xB9DF, 0xBC1D, 0xB9E0, 0xBC1E, 0xB9E1, 0xBC1F, 0xB9E2, + 0xBC20, 0x934D, 0xBC21, 0x934E, 0xBC22, 0x934F, 0xBC23, 0x9350, + 0xBC24, 0xB9E3, 0xBC25, 0xB9E4, 0xBC26, 0x9351, 0xBC27, 0xB9E5, + 0xBC28, 0x9352, 0xBC29, 0xB9E6, 0xBC2A, 0x9353, 0xBC2B, 0x9354, + 0xBC2C, 0x9355, 0xBC2D, 0xB9E7, 0xBC2E, 0x9356, 0xBC2F, 0x9357, + 0xBC30, 0xB9E8, 0xBC31, 0xB9E9, 0xBC32, 0x9358, 0xBC33, 0x9359, + 0xBC34, 0xB9EA, 0xBC35, 0x935A, 0xBC36, 0x9361, 0xBC37, 0x9362, + 0xBC38, 0xB9EB, 0xBC39, 0x9363, 0xBC3A, 0x9364, 0xBC3B, 0x9365, + 0xBC3C, 0x9366, 0xBC3D, 0x9367, 0xBC3E, 0x9368, 0xBC3F, 0x9369, + 0xBC40, 0xB9EC, 0xBC41, 0xB9ED, 0xBC42, 0x936A, 0xBC43, 0xB9EE, + 0xBC44, 0xB9EF, 0xBC45, 0xB9F0, 0xBC46, 0x936B, 0xBC47, 0x936C, + 0xBC48, 0x936D, 0xBC49, 0xB9F1, 0xBC4A, 0x936E, 0xBC4B, 0x936F, + 0xBC4C, 0xB9F2, 0xBC4D, 0xB9F3, 0xBC4E, 0x9370, 0xBC4F, 0x9371, + 0xBC50, 0xB9F4, 0xBC51, 0x9372, 0xBC52, 0x9373, 0xBC53, 0x9374, + 0xBC54, 0x9375, 0xBC55, 0x9376, 0xBC56, 0x9377, 0xBC57, 0x9378, + 0xBC58, 0x9379, 0xBC59, 0x937A, 0xBC5A, 0x9381, 0xBC5B, 0x9382, + 0xBC5C, 0x9383, 0xBC5D, 0xB9F5, 0xBC5E, 0x9384, 0xBC5F, 0x9385, + 0xBC60, 0x9386, 0xBC61, 0x9387, 0xBC62, 0x9388, 0xBC63, 0x9389, + 0xBC64, 0x938A, 0xBC65, 0x938B, 0xBC66, 0x938C, 0xBC67, 0x938D, + 0xBC68, 0x938E, 0xBC69, 0x938F, 0xBC6A, 0x9390, 0xBC6B, 0x9391, + 0xBC6C, 0x9392, 0xBC6D, 0x9393, 0xBC6E, 0x9394, 0xBC6F, 0x9395, + 0xBC70, 0x9396, 0xBC71, 0x9397, 0xBC72, 0x9398, 0xBC73, 0x9399, + 0xBC74, 0x939A, 0xBC75, 0x939B, 0xBC76, 0x939C, 0xBC77, 0x939D, + 0xBC78, 0x939E, 0xBC79, 0x939F, 0xBC7A, 0x93A0, 0xBC7B, 0x93A1, + 0xBC7C, 0x93A2, 0xBC7D, 0x93A3, 0xBC7E, 0x93A4, 0xBC7F, 0x93A5, + 0xBC80, 0x93A6, 0xBC81, 0x93A7, 0xBC82, 0x93A8, 0xBC83, 0x93A9, + 0xBC84, 0xB9F6, 0xBC85, 0xB9F7, 0xBC86, 0x93AA, 0xBC87, 0x93AB, + 0xBC88, 0xB9F8, 0xBC89, 0x93AC, 0xBC8A, 0x93AD, 0xBC8B, 0xB9F9, + 0xBC8C, 0xB9FA, 0xBC8D, 0x93AE, 0xBC8E, 0xB9FB, 0xBC8F, 0x93AF, + 0xBC90, 0x93B0, 0xBC91, 0x93B1, 0xBC92, 0x93B2, 0xBC93, 0x93B3, + 0xBC94, 0xB9FC, 0xBC95, 0xB9FD, 0xBC96, 0x93B4, 0xBC97, 0xB9FE, + 0xBC98, 0x93B5, 0xBC99, 0xBAA1, 0xBC9A, 0xBAA2, 0xBC9B, 0x93B6, + 0xBC9C, 0x93B7, 0xBC9D, 0x93B8, 0xBC9E, 0x93B9, 0xBC9F, 0x93BA, + 0xBCA0, 0xBAA3, 0xBCA1, 0xBAA4, 0xBCA2, 0x93BB, 0xBCA3, 0x93BC, + 0xBCA4, 0xBAA5, 0xBCA5, 0x93BD, 0xBCA6, 0x93BE, 0xBCA7, 0xBAA6, + 0xBCA8, 0xBAA7, 0xBCA9, 0x93BF, 0xBCAA, 0x93C0, 0xBCAB, 0x93C1, + 0xBCAC, 0x93C2, 0xBCAD, 0x93C3, 0xBCAE, 0x93C4, 0xBCAF, 0x93C5, + 0xBCB0, 0xBAA8, 0xBCB1, 0xBAA9, 0xBCB2, 0x93C6, 0xBCB3, 0xBAAA, + 0xBCB4, 0xBAAB, 0xBCB5, 0xBAAC, 0xBCB6, 0x93C7, 0xBCB7, 0x93C8, + 0xBCB8, 0x93C9, 0xBCB9, 0x93CA, 0xBCBA, 0x93CB, 0xBCBB, 0x93CC, + 0xBCBC, 0xBAAD, 0xBCBD, 0xBAAE, 0xBCBE, 0x93CD, 0xBCBF, 0x93CE, + 0xBCC0, 0xBAAF, 0xBCC1, 0x93CF, 0xBCC2, 0x93D0, 0xBCC3, 0x93D1, + 0xBCC4, 0xBAB0, 0xBCC5, 0x93D2, 0xBCC6, 0x93D3, 0xBCC7, 0x93D4, + 0xBCC8, 0x93D5, 0xBCC9, 0x93D6, 0xBCCA, 0x93D7, 0xBCCB, 0x93D8, + 0xBCCC, 0x93D9, 0xBCCD, 0xBAB1, 0xBCCE, 0x93DA, 0xBCCF, 0xBAB2, + 0xBCD0, 0xBAB3, 0xBCD1, 0xBAB4, 0xBCD2, 0x93DB, 0xBCD3, 0x93DC, + 0xBCD4, 0x93DD, 0xBCD5, 0xBAB5, 0xBCD6, 0x93DE, 0xBCD7, 0x93DF, + 0xBCD8, 0xBAB6, 0xBCD9, 0x93E0, 0xBCDA, 0x93E1, 0xBCDB, 0x93E2, + 0xBCDC, 0xBAB7, 0xBCDD, 0x93E3, 0xBCDE, 0x93E4, 0xBCDF, 0x93E5, + 0xBCE0, 0x93E6, 0xBCE1, 0x93E7, 0xBCE2, 0x93E8, 0xBCE3, 0x93E9, + 0xBCE4, 0x93EA, 0xBCE5, 0x93EB, 0xBCE6, 0x93EC, 0xBCE7, 0x93ED, + 0xBCE8, 0x93EE, 0xBCE9, 0x93EF, 0xBCEA, 0x93F0, 0xBCEB, 0x93F1, + 0xBCEC, 0x93F2, 0xBCED, 0x93F3, 0xBCEE, 0x93F4, 0xBCEF, 0x93F5, + 0xBCF0, 0x93F6, 0xBCF1, 0x93F7, 0xBCF2, 0x93F8, 0xBCF3, 0x93F9, + 0xBCF4, 0xBAB8, 0xBCF5, 0xBAB9, 0xBCF6, 0xBABA, 0xBCF7, 0x93FA, + 0xBCF8, 0xBABB, 0xBCF9, 0x93FB, 0xBCFA, 0x93FC, 0xBCFB, 0x93FD, + 0xBCFC, 0xBABC, 0xBCFD, 0x93FE, 0xBCFE, 0x9441, 0xBCFF, 0x9442, + 0xBD00, 0x9443, 0xBD01, 0x9444, 0xBD02, 0x9445, 0xBD03, 0x9446, + 0xBD04, 0xBABD, 0xBD05, 0xBABE, 0xBD06, 0x9447, 0xBD07, 0xBABF, + 0xBD08, 0x9448, 0xBD09, 0xBAC0, 0xBD0A, 0x9449, 0xBD0B, 0x944A, + 0xBD0C, 0x944B, 0xBD0D, 0x944C, 0xBD0E, 0x944D, 0xBD0F, 0x944E, + 0xBD10, 0xBAC1, 0xBD11, 0x944F, 0xBD12, 0x9450, 0xBD13, 0x9451, + 0xBD14, 0xBAC2, 0xBD15, 0x9452, 0xBD16, 0x9453, 0xBD17, 0x9454, + 0xBD18, 0x9455, 0xBD19, 0x9456, 0xBD1A, 0x9457, 0xBD1B, 0x9458, + 0xBD1C, 0x9459, 0xBD1D, 0x945A, 0xBD1E, 0x9461, 0xBD1F, 0x9462, + 0xBD20, 0x9463, 0xBD21, 0x9464, 0xBD22, 0x9465, 0xBD23, 0x9466, + 0xBD24, 0xBAC3, 0xBD25, 0x9467, 0xBD26, 0x9468, 0xBD27, 0x9469, + 0xBD28, 0x946A, 0xBD29, 0x946B, 0xBD2A, 0x946C, 0xBD2B, 0x946D, + 0xBD2C, 0xBAC4, 0xBD2D, 0x946E, 0xBD2E, 0x946F, 0xBD2F, 0x9470, + 0xBD30, 0x9471, 0xBD31, 0x9472, 0xBD32, 0x9473, 0xBD33, 0x9474, + 0xBD34, 0x9475, 0xBD35, 0x9476, 0xBD36, 0x9477, 0xBD37, 0x9478, + 0xBD38, 0x9479, 0xBD39, 0x947A, 0xBD3A, 0x9481, 0xBD3B, 0x9482, + 0xBD3C, 0x9483, 0xBD3D, 0x9484, 0xBD3E, 0x9485, 0xBD3F, 0x9486, + 0xBD40, 0xBAC5, 0xBD41, 0x9487, 0xBD42, 0x9488, 0xBD43, 0x9489, + 0xBD44, 0x948A, 0xBD45, 0x948B, 0xBD46, 0x948C, 0xBD47, 0x948D, + 0xBD48, 0xBAC6, 0xBD49, 0xBAC7, 0xBD4A, 0x948E, 0xBD4B, 0x948F, + 0xBD4C, 0xBAC8, 0xBD4D, 0x9490, 0xBD4E, 0x9491, 0xBD4F, 0x9492, + 0xBD50, 0xBAC9, 0xBD51, 0x9493, 0xBD52, 0x9494, 0xBD53, 0x9495, + 0xBD54, 0x9496, 0xBD55, 0x9497, 0xBD56, 0x9498, 0xBD57, 0x9499, + 0xBD58, 0xBACA, 0xBD59, 0xBACB, 0xBD5A, 0x949A, 0xBD5B, 0x949B, + 0xBD5C, 0x949C, 0xBD5D, 0x949D, 0xBD5E, 0x949E, 0xBD5F, 0x949F, + 0xBD60, 0x94A0, 0xBD61, 0x94A1, 0xBD62, 0x94A2, 0xBD63, 0x94A3, + 0xBD64, 0xBACC, 0xBD65, 0x94A4, 0xBD66, 0x94A5, 0xBD67, 0x94A6, + 0xBD68, 0xBACD, 0xBD69, 0x94A7, 0xBD6A, 0x94A8, 0xBD6B, 0x94A9, + 0xBD6C, 0x94AA, 0xBD6D, 0x94AB, 0xBD6E, 0x94AC, 0xBD6F, 0x94AD, + 0xBD70, 0x94AE, 0xBD71, 0x94AF, 0xBD72, 0x94B0, 0xBD73, 0x94B1, + 0xBD74, 0x94B2, 0xBD75, 0x94B3, 0xBD76, 0x94B4, 0xBD77, 0x94B5, + 0xBD78, 0x94B6, 0xBD79, 0x94B7, 0xBD7A, 0x94B8, 0xBD7B, 0x94B9, + 0xBD7C, 0x94BA, 0xBD7D, 0x94BB, 0xBD7E, 0x94BC, 0xBD7F, 0x94BD, + 0xBD80, 0xBACE, 0xBD81, 0xBACF, 0xBD82, 0x94BE, 0xBD83, 0x94BF, + 0xBD84, 0xBAD0, 0xBD85, 0x94C0, 0xBD86, 0x94C1, 0xBD87, 0xBAD1, + 0xBD88, 0xBAD2, 0xBD89, 0xBAD3, 0xBD8A, 0xBAD4, 0xBD8B, 0x94C2, + 0xBD8C, 0x94C3, 0xBD8D, 0x94C4, 0xBD8E, 0x94C5, 0xBD8F, 0x94C6, + 0xBD90, 0xBAD5, 0xBD91, 0xBAD6, 0xBD92, 0x94C7, 0xBD93, 0xBAD7, + 0xBD94, 0x94C8, 0xBD95, 0xBAD8, 0xBD96, 0x94C9, 0xBD97, 0x94CA, + 0xBD98, 0x94CB, 0xBD99, 0xBAD9, 0xBD9A, 0xBADA, 0xBD9B, 0x94CC, + 0xBD9C, 0xBADB, 0xBD9D, 0x94CD, 0xBD9E, 0x94CE, 0xBD9F, 0x94CF, + 0xBDA0, 0x94D0, 0xBDA1, 0x94D1, 0xBDA2, 0x94D2, 0xBDA3, 0x94D3, + 0xBDA4, 0xBADC, 0xBDA5, 0x94D4, 0xBDA6, 0x94D5, 0xBDA7, 0x94D6, + 0xBDA8, 0x94D7, 0xBDA9, 0x94D8, 0xBDAA, 0x94D9, 0xBDAB, 0x94DA, + 0xBDAC, 0x94DB, 0xBDAD, 0x94DC, 0xBDAE, 0x94DD, 0xBDAF, 0x94DE, + 0xBDB0, 0xBADD, 0xBDB1, 0x94DF, 0xBDB2, 0x94E0, 0xBDB3, 0x94E1, + 0xBDB4, 0x94E2, 0xBDB5, 0x94E3, 0xBDB6, 0x94E4, 0xBDB7, 0x94E5, + 0xBDB8, 0xBADE, 0xBDB9, 0x94E6, 0xBDBA, 0x94E7, 0xBDBB, 0x94E8, + 0xBDBC, 0x94E9, 0xBDBD, 0x94EA, 0xBDBE, 0x94EB, 0xBDBF, 0x94EC, + 0xBDC0, 0x94ED, 0xBDC1, 0x94EE, 0xBDC2, 0x94EF, 0xBDC3, 0x94F0, + 0xBDC4, 0x94F1, 0xBDC5, 0x94F2, 0xBDC6, 0x94F3, 0xBDC7, 0x94F4, + 0xBDC8, 0x94F5, 0xBDC9, 0x94F6, 0xBDCA, 0x94F7, 0xBDCB, 0x94F8, + 0xBDCC, 0x94F9, 0xBDCD, 0x94FA, 0xBDCE, 0x94FB, 0xBDCF, 0x94FC, + 0xBDD0, 0x94FD, 0xBDD1, 0x94FE, 0xBDD2, 0x9541, 0xBDD3, 0x9542, + 0xBDD4, 0xBADF, 0xBDD5, 0xBAE0, 0xBDD6, 0x9543, 0xBDD7, 0x9544, + 0xBDD8, 0xBAE1, 0xBDD9, 0x9545, 0xBDDA, 0x9546, 0xBDDB, 0x9547, + 0xBDDC, 0xBAE2, 0xBDDD, 0x9548, 0xBDDE, 0x9549, 0xBDDF, 0x954A, + 0xBDE0, 0x954B, 0xBDE1, 0x954C, 0xBDE2, 0x954D, 0xBDE3, 0x954E, + 0xBDE4, 0x954F, 0xBDE5, 0x9550, 0xBDE6, 0x9551, 0xBDE7, 0x9552, + 0xBDE8, 0x9553, 0xBDE9, 0xBAE3, 0xBDEA, 0x9554, 0xBDEB, 0x9555, + 0xBDEC, 0x9556, 0xBDED, 0x9557, 0xBDEE, 0x9558, 0xBDEF, 0x9559, + 0xBDF0, 0xBAE4, 0xBDF1, 0x955A, 0xBDF2, 0x9561, 0xBDF3, 0x9562, + 0xBDF4, 0xBAE5, 0xBDF5, 0x9563, 0xBDF6, 0x9564, 0xBDF7, 0x9565, + 0xBDF8, 0xBAE6, 0xBDF9, 0x9566, 0xBDFA, 0x9567, 0xBDFB, 0x9568, + 0xBDFC, 0x9569, 0xBDFD, 0x956A, 0xBDFE, 0x956B, 0xBDFF, 0x956C, + 0xBE00, 0xBAE7, 0xBE01, 0x956D, 0xBE02, 0x956E, 0xBE03, 0xBAE8, + 0xBE04, 0x956F, 0xBE05, 0xBAE9, 0xBE06, 0x9570, 0xBE07, 0x9571, + 0xBE08, 0x9572, 0xBE09, 0x9573, 0xBE0A, 0x9574, 0xBE0B, 0x9575, + 0xBE0C, 0xBAEA, 0xBE0D, 0xBAEB, 0xBE0E, 0x9576, 0xBE0F, 0x9577, + 0xBE10, 0xBAEC, 0xBE11, 0x9578, 0xBE12, 0x9579, 0xBE13, 0x957A, + 0xBE14, 0xBAED, 0xBE15, 0x9581, 0xBE16, 0x9582, 0xBE17, 0x9583, + 0xBE18, 0x9584, 0xBE19, 0x9585, 0xBE1A, 0x9586, 0xBE1B, 0x9587, + 0xBE1C, 0xBAEE, 0xBE1D, 0xBAEF, 0xBE1E, 0x9588, 0xBE1F, 0xBAF0, + 0xBE20, 0x9589, 0xBE21, 0x958A, 0xBE22, 0x958B, 0xBE23, 0x958C, + 0xBE24, 0x958D, 0xBE25, 0x958E, 0xBE26, 0x958F, 0xBE27, 0x9590, + 0xBE28, 0x9591, 0xBE29, 0x9592, 0xBE2A, 0x9593, 0xBE2B, 0x9594, + 0xBE2C, 0x9595, 0xBE2D, 0x9596, 0xBE2E, 0x9597, 0xBE2F, 0x9598, + 0xBE30, 0x9599, 0xBE31, 0x959A, 0xBE32, 0x959B, 0xBE33, 0x959C, + 0xBE34, 0x959D, 0xBE35, 0x959E, 0xBE36, 0x959F, 0xBE37, 0x95A0, + 0xBE38, 0x95A1, 0xBE39, 0x95A2, 0xBE3A, 0x95A3, 0xBE3B, 0x95A4, + 0xBE3C, 0x95A5, 0xBE3D, 0x95A6, 0xBE3E, 0x95A7, 0xBE3F, 0x95A8, + 0xBE40, 0x95A9, 0xBE41, 0x95AA, 0xBE42, 0x95AB, 0xBE43, 0x95AC, + 0xBE44, 0xBAF1, 0xBE45, 0xBAF2, 0xBE46, 0x95AD, 0xBE47, 0x95AE, + 0xBE48, 0xBAF3, 0xBE49, 0x95AF, 0xBE4A, 0x95B0, 0xBE4B, 0x95B1, + 0xBE4C, 0xBAF4, 0xBE4D, 0x95B2, 0xBE4E, 0xBAF5, 0xBE4F, 0x95B3, + 0xBE50, 0x95B4, 0xBE51, 0x95B5, 0xBE52, 0x95B6, 0xBE53, 0x95B7, + 0xBE54, 0xBAF6, 0xBE55, 0xBAF7, 0xBE56, 0x95B8, 0xBE57, 0xBAF8, + 0xBE58, 0x95B9, 0xBE59, 0xBAF9, 0xBE5A, 0xBAFA, 0xBE5B, 0xBAFB, + 0xBE5C, 0x95BA, 0xBE5D, 0x95BB, 0xBE5E, 0x95BC, 0xBE5F, 0x95BD, + 0xBE60, 0xBAFC, 0xBE61, 0xBAFD, 0xBE62, 0x95BE, 0xBE63, 0x95BF, + 0xBE64, 0xBAFE, 0xBE65, 0x95C0, 0xBE66, 0x95C1, 0xBE67, 0x95C2, + 0xBE68, 0xBBA1, 0xBE69, 0x95C3, 0xBE6A, 0xBBA2, 0xBE6B, 0x95C4, + 0xBE6C, 0x95C5, 0xBE6D, 0x95C6, 0xBE6E, 0x95C7, 0xBE6F, 0x95C8, + 0xBE70, 0xBBA3, 0xBE71, 0xBBA4, 0xBE72, 0x95C9, 0xBE73, 0xBBA5, + 0xBE74, 0xBBA6, 0xBE75, 0xBBA7, 0xBE76, 0x95CA, 0xBE77, 0x95CB, + 0xBE78, 0x95CC, 0xBE79, 0x95CD, 0xBE7A, 0x95CE, 0xBE7B, 0xBBA8, + 0xBE7C, 0xBBA9, 0xBE7D, 0xBBAA, 0xBE7E, 0x95CF, 0xBE7F, 0x95D0, + 0xBE80, 0xBBAB, 0xBE81, 0x95D1, 0xBE82, 0x95D2, 0xBE83, 0x95D3, + 0xBE84, 0xBBAC, 0xBE85, 0x95D4, 0xBE86, 0x95D5, 0xBE87, 0x95D6, + 0xBE88, 0x95D7, 0xBE89, 0x95D8, 0xBE8A, 0x95D9, 0xBE8B, 0x95DA, + 0xBE8C, 0xBBAD, 0xBE8D, 0xBBAE, 0xBE8E, 0x95DB, 0xBE8F, 0xBBAF, + 0xBE90, 0xBBB0, 0xBE91, 0xBBB1, 0xBE92, 0x95DC, 0xBE93, 0x95DD, + 0xBE94, 0x95DE, 0xBE95, 0x95DF, 0xBE96, 0x95E0, 0xBE97, 0x95E1, + 0xBE98, 0xBBB2, 0xBE99, 0xBBB3, 0xBE9A, 0x95E2, 0xBE9B, 0x95E3, + 0xBE9C, 0x95E4, 0xBE9D, 0x95E5, 0xBE9E, 0x95E6, 0xBE9F, 0x95E7, + 0xBEA0, 0x95E8, 0xBEA1, 0x95E9, 0xBEA2, 0x95EA, 0xBEA3, 0x95EB, + 0xBEA4, 0x95EC, 0xBEA5, 0x95ED, 0xBEA6, 0x95EE, 0xBEA7, 0x95EF, + 0xBEA8, 0xBBB4, 0xBEA9, 0x95F0, 0xBEAA, 0x95F1, 0xBEAB, 0x95F2, + 0xBEAC, 0x95F3, 0xBEAD, 0x95F4, 0xBEAE, 0x95F5, 0xBEAF, 0x95F6, + 0xBEB0, 0x95F7, 0xBEB1, 0x95F8, 0xBEB2, 0x95F9, 0xBEB3, 0x95FA, + 0xBEB4, 0x95FB, 0xBEB5, 0x95FC, 0xBEB6, 0x95FD, 0xBEB7, 0x95FE, + 0xBEB8, 0x9641, 0xBEB9, 0x9642, 0xBEBA, 0x9643, 0xBEBB, 0x9644, + 0xBEBC, 0x9645, 0xBEBD, 0x9646, 0xBEBE, 0x9647, 0xBEBF, 0x9648, + 0xBEC0, 0x9649, 0xBEC1, 0x964A, 0xBEC2, 0x964B, 0xBEC3, 0x964C, + 0xBEC4, 0x964D, 0xBEC5, 0x964E, 0xBEC6, 0x964F, 0xBEC7, 0x9650, + 0xBEC8, 0x9651, 0xBEC9, 0x9652, 0xBECA, 0x9653, 0xBECB, 0x9654, + 0xBECC, 0x9655, 0xBECD, 0x9656, 0xBECE, 0x9657, 0xBECF, 0x9658, + 0xBED0, 0xBBB5, 0xBED1, 0xBBB6, 0xBED2, 0x9659, 0xBED3, 0x965A, + 0xBED4, 0xBBB7, 0xBED5, 0x9661, 0xBED6, 0x9662, 0xBED7, 0xBBB8, + 0xBED8, 0xBBB9, 0xBED9, 0x9663, 0xBEDA, 0x9664, 0xBEDB, 0x9665, + 0xBEDC, 0x9666, 0xBEDD, 0x9667, 0xBEDE, 0x9668, 0xBEDF, 0x9669, + 0xBEE0, 0xBBBA, 0xBEE1, 0x966A, 0xBEE2, 0x966B, 0xBEE3, 0xBBBB, + 0xBEE4, 0xBBBC, 0xBEE5, 0xBBBD, 0xBEE6, 0x966C, 0xBEE7, 0x966D, + 0xBEE8, 0x966E, 0xBEE9, 0x966F, 0xBEEA, 0x9670, 0xBEEB, 0x9671, + 0xBEEC, 0xBBBE, 0xBEED, 0x9672, 0xBEEE, 0x9673, 0xBEEF, 0x9674, + 0xBEF0, 0x9675, 0xBEF1, 0x9676, 0xBEF2, 0x9677, 0xBEF3, 0x9678, + 0xBEF4, 0x9679, 0xBEF5, 0x967A, 0xBEF6, 0x9681, 0xBEF7, 0x9682, + 0xBEF8, 0x9683, 0xBEF9, 0x9684, 0xBEFA, 0x9685, 0xBEFB, 0x9686, + 0xBEFC, 0x9687, 0xBEFD, 0x9688, 0xBEFE, 0x9689, 0xBEFF, 0x968A, + 0xBF00, 0x968B, 0xBF01, 0xBBBF, 0xBF02, 0x968C, 0xBF03, 0x968D, + 0xBF04, 0x968E, 0xBF05, 0x968F, 0xBF06, 0x9690, 0xBF07, 0x9691, + 0xBF08, 0xBBC0, 0xBF09, 0xBBC1, 0xBF0A, 0x9692, 0xBF0B, 0x9693, + 0xBF0C, 0x9694, 0xBF0D, 0x9695, 0xBF0E, 0x9696, 0xBF0F, 0x9697, + 0xBF10, 0x9698, 0xBF11, 0x9699, 0xBF12, 0x969A, 0xBF13, 0x969B, + 0xBF14, 0x969C, 0xBF15, 0x969D, 0xBF16, 0x969E, 0xBF17, 0x969F, + 0xBF18, 0xBBC2, 0xBF19, 0xBBC3, 0xBF1A, 0x96A0, 0xBF1B, 0xBBC4, + 0xBF1C, 0xBBC5, 0xBF1D, 0xBBC6, 0xBF1E, 0x96A1, 0xBF1F, 0x96A2, + 0xBF20, 0x96A3, 0xBF21, 0x96A4, 0xBF22, 0x96A5, 0xBF23, 0x96A6, + 0xBF24, 0x96A7, 0xBF25, 0x96A8, 0xBF26, 0x96A9, 0xBF27, 0x96AA, + 0xBF28, 0x96AB, 0xBF29, 0x96AC, 0xBF2A, 0x96AD, 0xBF2B, 0x96AE, + 0xBF2C, 0x96AF, 0xBF2D, 0x96B0, 0xBF2E, 0x96B1, 0xBF2F, 0x96B2, + 0xBF30, 0x96B3, 0xBF31, 0x96B4, 0xBF32, 0x96B5, 0xBF33, 0x96B6, + 0xBF34, 0x96B7, 0xBF35, 0x96B8, 0xBF36, 0x96B9, 0xBF37, 0x96BA, + 0xBF38, 0x96BB, 0xBF39, 0x96BC, 0xBF3A, 0x96BD, 0xBF3B, 0x96BE, + 0xBF3C, 0x96BF, 0xBF3D, 0x96C0, 0xBF3E, 0x96C1, 0xBF3F, 0x96C2, + 0xBF40, 0xBBC7, 0xBF41, 0xBBC8, 0xBF42, 0x96C3, 0xBF43, 0x96C4, + 0xBF44, 0xBBC9, 0xBF45, 0x96C5, 0xBF46, 0x96C6, 0xBF47, 0x96C7, + 0xBF48, 0xBBCA, 0xBF49, 0x96C8, 0xBF4A, 0x96C9, 0xBF4B, 0x96CA, + 0xBF4C, 0x96CB, 0xBF4D, 0x96CC, 0xBF4E, 0x96CD, 0xBF4F, 0x96CE, + 0xBF50, 0xBBCB, 0xBF51, 0xBBCC, 0xBF52, 0x96CF, 0xBF53, 0x96D0, + 0xBF54, 0x96D1, 0xBF55, 0xBBCD, 0xBF56, 0x96D2, 0xBF57, 0x96D3, + 0xBF58, 0x96D4, 0xBF59, 0x96D5, 0xBF5A, 0x96D6, 0xBF5B, 0x96D7, + 0xBF5C, 0x96D8, 0xBF5D, 0x96D9, 0xBF5E, 0x96DA, 0xBF5F, 0x96DB, + 0xBF60, 0x96DC, 0xBF61, 0x96DD, 0xBF62, 0x96DE, 0xBF63, 0x96DF, + 0xBF64, 0x96E0, 0xBF65, 0x96E1, 0xBF66, 0x96E2, 0xBF67, 0x96E3, + 0xBF68, 0x96E4, 0xBF69, 0x96E5, 0xBF6A, 0x96E6, 0xBF6B, 0x96E7, + 0xBF6C, 0x96E8, 0xBF6D, 0x96E9, 0xBF6E, 0x96EA, 0xBF6F, 0x96EB, + 0xBF70, 0x96EC, 0xBF71, 0x96ED, 0xBF72, 0x96EE, 0xBF73, 0x96EF, + 0xBF74, 0x96F0, 0xBF75, 0x96F1, 0xBF76, 0x96F2, 0xBF77, 0x96F3, + 0xBF78, 0x96F4, 0xBF79, 0x96F5, 0xBF7A, 0x96F6, 0xBF7B, 0x96F7, + 0xBF7C, 0x96F8, 0xBF7D, 0x96F9, 0xBF7E, 0x96FA, 0xBF7F, 0x96FB, + 0xBF80, 0x96FC, 0xBF81, 0x96FD, 0xBF82, 0x96FE, 0xBF83, 0x9741, + 0xBF84, 0x9742, 0xBF85, 0x9743, 0xBF86, 0x9744, 0xBF87, 0x9745, + 0xBF88, 0x9746, 0xBF89, 0x9747, 0xBF8A, 0x9748, 0xBF8B, 0x9749, + 0xBF8C, 0x974A, 0xBF8D, 0x974B, 0xBF8E, 0x974C, 0xBF8F, 0x974D, + 0xBF90, 0x974E, 0xBF91, 0x974F, 0xBF92, 0x9750, 0xBF93, 0x9751, + 0xBF94, 0xBBCE, 0xBF95, 0x9752, 0xBF96, 0x9753, 0xBF97, 0x9754, + 0xBF98, 0x9755, 0xBF99, 0x9756, 0xBF9A, 0x9757, 0xBF9B, 0x9758, + 0xBF9C, 0x9759, 0xBF9D, 0x975A, 0xBF9E, 0x9761, 0xBF9F, 0x9762, + 0xBFA0, 0x9763, 0xBFA1, 0x9764, 0xBFA2, 0x9765, 0xBFA3, 0x9766, + 0xBFA4, 0x9767, 0xBFA5, 0x9768, 0xBFA6, 0x9769, 0xBFA7, 0x976A, + 0xBFA8, 0x976B, 0xBFA9, 0x976C, 0xBFAA, 0x976D, 0xBFAB, 0x976E, + 0xBFAC, 0x976F, 0xBFAD, 0x9770, 0xBFAE, 0x9771, 0xBFAF, 0x9772, + 0xBFB0, 0xBBCF, 0xBFB1, 0x9773, 0xBFB2, 0x9774, 0xBFB3, 0x9775, + 0xBFB4, 0x9776, 0xBFB5, 0x9777, 0xBFB6, 0x9778, 0xBFB7, 0x9779, + 0xBFB8, 0x977A, 0xBFB9, 0x9781, 0xBFBA, 0x9782, 0xBFBB, 0x9783, + 0xBFBC, 0x9784, 0xBFBD, 0x9785, 0xBFBE, 0x9786, 0xBFBF, 0x9787, + 0xBFC0, 0x9788, 0xBFC1, 0x9789, 0xBFC2, 0x978A, 0xBFC3, 0x978B, + 0xBFC4, 0x978C, 0xBFC5, 0xBBD0, 0xBFC6, 0x978D, 0xBFC7, 0x978E, + 0xBFC8, 0x978F, 0xBFC9, 0x9790, 0xBFCA, 0x9791, 0xBFCB, 0x9792, + 0xBFCC, 0xBBD1, 0xBFCD, 0xBBD2, 0xBFCE, 0x9793, 0xBFCF, 0x9794, + 0xBFD0, 0xBBD3, 0xBFD1, 0x9795, 0xBFD2, 0x9796, 0xBFD3, 0x9797, + 0xBFD4, 0xBBD4, 0xBFD5, 0x9798, 0xBFD6, 0x9799, 0xBFD7, 0x979A, + 0xBFD8, 0x979B, 0xBFD9, 0x979C, 0xBFDA, 0x979D, 0xBFDB, 0x979E, + 0xBFDC, 0xBBD5, 0xBFDD, 0x979F, 0xBFDE, 0x97A0, 0xBFDF, 0xBBD6, + 0xBFE0, 0x97A1, 0xBFE1, 0xBBD7, 0xBFE2, 0x97A2, 0xBFE3, 0x97A3, + 0xBFE4, 0x97A4, 0xBFE5, 0x97A5, 0xBFE6, 0x97A6, 0xBFE7, 0x97A7, + 0xBFE8, 0x97A8, 0xBFE9, 0x97A9, 0xBFEA, 0x97AA, 0xBFEB, 0x97AB, + 0xBFEC, 0x97AC, 0xBFED, 0x97AD, 0xBFEE, 0x97AE, 0xBFEF, 0x97AF, + 0xBFF0, 0x97B0, 0xBFF1, 0x97B1, 0xBFF2, 0x97B2, 0xBFF3, 0x97B3, + 0xBFF4, 0x97B4, 0xBFF5, 0x97B5, 0xBFF6, 0x97B6, 0xBFF7, 0x97B7, + 0xBFF8, 0x97B8, 0xBFF9, 0x97B9, 0xBFFA, 0x97BA, 0xBFFB, 0x97BB, + 0xBFFC, 0x97BC, 0xBFFD, 0x97BD, 0xBFFE, 0x97BE, 0xBFFF, 0x97BF, + 0xC000, 0x97C0, 0xC001, 0x97C1, 0xC002, 0x97C2, 0xC003, 0x97C3, + 0xC004, 0x97C4, 0xC005, 0x97C5, 0xC006, 0x97C6, 0xC007, 0x97C7, + 0xC008, 0x97C8, 0xC009, 0x97C9, 0xC00A, 0x97CA, 0xC00B, 0x97CB, + 0xC00C, 0x97CC, 0xC00D, 0x97CD, 0xC00E, 0x97CE, 0xC00F, 0x97CF, + 0xC010, 0x97D0, 0xC011, 0x97D1, 0xC012, 0x97D2, 0xC013, 0x97D3, + 0xC014, 0x97D4, 0xC015, 0x97D5, 0xC016, 0x97D6, 0xC017, 0x97D7, + 0xC018, 0x97D8, 0xC019, 0x97D9, 0xC01A, 0x97DA, 0xC01B, 0x97DB, + 0xC01C, 0x97DC, 0xC01D, 0x97DD, 0xC01E, 0x97DE, 0xC01F, 0x97DF, + 0xC020, 0x97E0, 0xC021, 0x97E1, 0xC022, 0x97E2, 0xC023, 0x97E3, + 0xC024, 0x97E4, 0xC025, 0x97E5, 0xC026, 0x97E6, 0xC027, 0x97E7, + 0xC028, 0x97E8, 0xC029, 0x97E9, 0xC02A, 0x97EA, 0xC02B, 0x97EB, + 0xC02C, 0x97EC, 0xC02D, 0x97ED, 0xC02E, 0x97EE, 0xC02F, 0x97EF, + 0xC030, 0x97F0, 0xC031, 0x97F1, 0xC032, 0x97F2, 0xC033, 0x97F3, + 0xC034, 0x97F4, 0xC035, 0x97F5, 0xC036, 0x97F6, 0xC037, 0x97F7, + 0xC038, 0x97F8, 0xC039, 0x97F9, 0xC03A, 0x97FA, 0xC03B, 0x97FB, + 0xC03C, 0xBBD8, 0xC03D, 0x97FC, 0xC03E, 0x97FD, 0xC03F, 0x97FE, + 0xC040, 0x9841, 0xC041, 0x9842, 0xC042, 0x9843, 0xC043, 0x9844, + 0xC044, 0x9845, 0xC045, 0x9846, 0xC046, 0x9847, 0xC047, 0x9848, + 0xC048, 0x9849, 0xC049, 0x984A, 0xC04A, 0x984B, 0xC04B, 0x984C, + 0xC04C, 0x984D, 0xC04D, 0x984E, 0xC04E, 0x984F, 0xC04F, 0x9850, + 0xC050, 0x9851, 0xC051, 0xBBD9, 0xC052, 0x9852, 0xC053, 0x9853, + 0xC054, 0x9854, 0xC055, 0x9855, 0xC056, 0x9856, 0xC057, 0x9857, + 0xC058, 0xBBDA, 0xC059, 0x9858, 0xC05A, 0x9859, 0xC05B, 0x985A, + 0xC05C, 0xBBDB, 0xC05D, 0x9861, 0xC05E, 0x9862, 0xC05F, 0x9863, + 0xC060, 0xBBDC, 0xC061, 0x9864, 0xC062, 0x9865, 0xC063, 0x9866, + 0xC064, 0x9867, 0xC065, 0x9868, 0xC066, 0x9869, 0xC067, 0x986A, + 0xC068, 0xBBDD, 0xC069, 0xBBDE, 0xC06A, 0x986B, 0xC06B, 0x986C, + 0xC06C, 0x986D, 0xC06D, 0x986E, 0xC06E, 0x986F, 0xC06F, 0x9870, + 0xC070, 0x9871, 0xC071, 0x9872, 0xC072, 0x9873, 0xC073, 0x9874, + 0xC074, 0x9875, 0xC075, 0x9876, 0xC076, 0x9877, 0xC077, 0x9878, + 0xC078, 0x9879, 0xC079, 0x987A, 0xC07A, 0x9881, 0xC07B, 0x9882, + 0xC07C, 0x9883, 0xC07D, 0x9884, 0xC07E, 0x9885, 0xC07F, 0x9886, + 0xC080, 0x9887, 0xC081, 0x9888, 0xC082, 0x9889, 0xC083, 0x988A, + 0xC084, 0x988B, 0xC085, 0x988C, 0xC086, 0x988D, 0xC087, 0x988E, + 0xC088, 0x988F, 0xC089, 0x9890, 0xC08A, 0x9891, 0xC08B, 0x9892, + 0xC08C, 0x9893, 0xC08D, 0x9894, 0xC08E, 0x9895, 0xC08F, 0x9896, + 0xC090, 0xBBDF, 0xC091, 0xBBE0, 0xC092, 0x9897, 0xC093, 0x9898, + 0xC094, 0xBBE1, 0xC095, 0x9899, 0xC096, 0x989A, 0xC097, 0x989B, + 0xC098, 0xBBE2, 0xC099, 0x989C, 0xC09A, 0x989D, 0xC09B, 0x989E, + 0xC09C, 0x989F, 0xC09D, 0x98A0, 0xC09E, 0x98A1, 0xC09F, 0x98A2, + 0xC0A0, 0xBBE3, 0xC0A1, 0xBBE4, 0xC0A2, 0x98A3, 0xC0A3, 0xBBE5, + 0xC0A4, 0x98A4, 0xC0A5, 0xBBE6, 0xC0A6, 0x98A5, 0xC0A7, 0x98A6, + 0xC0A8, 0x98A7, 0xC0A9, 0x98A8, 0xC0AA, 0x98A9, 0xC0AB, 0x98AA, + 0xC0AC, 0xBBE7, 0xC0AD, 0xBBE8, 0xC0AE, 0x98AB, 0xC0AF, 0xBBE9, + 0xC0B0, 0xBBEA, 0xC0B1, 0x98AC, 0xC0B2, 0x98AD, 0xC0B3, 0xBBEB, + 0xC0B4, 0xBBEC, 0xC0B5, 0xBBED, 0xC0B6, 0xBBEE, 0xC0B7, 0x98AE, + 0xC0B8, 0x98AF, 0xC0B9, 0x98B0, 0xC0BA, 0x98B1, 0xC0BB, 0x98B2, + 0xC0BC, 0xBBEF, 0xC0BD, 0xBBF0, 0xC0BE, 0x98B3, 0xC0BF, 0xBBF1, + 0xC0C0, 0xBBF2, 0xC0C1, 0xBBF3, 0xC0C2, 0x98B4, 0xC0C3, 0x98B5, + 0xC0C4, 0x98B6, 0xC0C5, 0xBBF4, 0xC0C6, 0x98B7, 0xC0C7, 0x98B8, + 0xC0C8, 0xBBF5, 0xC0C9, 0xBBF6, 0xC0CA, 0x98B9, 0xC0CB, 0x98BA, + 0xC0CC, 0xBBF7, 0xC0CD, 0x98BB, 0xC0CE, 0x98BC, 0xC0CF, 0x98BD, + 0xC0D0, 0xBBF8, 0xC0D1, 0x98BE, 0xC0D2, 0x98BF, 0xC0D3, 0x98C0, + 0xC0D4, 0x98C1, 0xC0D5, 0x98C2, 0xC0D6, 0x98C3, 0xC0D7, 0x98C4, + 0xC0D8, 0xBBF9, 0xC0D9, 0xBBFA, 0xC0DA, 0x98C5, 0xC0DB, 0xBBFB, + 0xC0DC, 0xBBFC, 0xC0DD, 0xBBFD, 0xC0DE, 0x98C6, 0xC0DF, 0x98C7, + 0xC0E0, 0x98C8, 0xC0E1, 0x98C9, 0xC0E2, 0x98CA, 0xC0E3, 0x98CB, + 0xC0E4, 0xBBFE, 0xC0E5, 0xBCA1, 0xC0E6, 0x98CC, 0xC0E7, 0x98CD, + 0xC0E8, 0xBCA2, 0xC0E9, 0x98CE, 0xC0EA, 0x98CF, 0xC0EB, 0x98D0, + 0xC0EC, 0xBCA3, 0xC0ED, 0x98D1, 0xC0EE, 0x98D2, 0xC0EF, 0x98D3, + 0xC0F0, 0x98D4, 0xC0F1, 0x98D5, 0xC0F2, 0x98D6, 0xC0F3, 0x98D7, + 0xC0F4, 0xBCA4, 0xC0F5, 0xBCA5, 0xC0F6, 0x98D8, 0xC0F7, 0xBCA6, + 0xC0F8, 0x98D9, 0xC0F9, 0xBCA7, 0xC0FA, 0x98DA, 0xC0FB, 0x98DB, + 0xC0FC, 0x98DC, 0xC0FD, 0x98DD, 0xC0FE, 0x98DE, 0xC0FF, 0x98DF, + 0xC100, 0xBCA8, 0xC101, 0x98E0, 0xC102, 0x98E1, 0xC103, 0x98E2, + 0xC104, 0xBCA9, 0xC105, 0x98E3, 0xC106, 0x98E4, 0xC107, 0x98E5, + 0xC108, 0xBCAA, 0xC109, 0x98E6, 0xC10A, 0x98E7, 0xC10B, 0x98E8, + 0xC10C, 0x98E9, 0xC10D, 0x98EA, 0xC10E, 0x98EB, 0xC10F, 0x98EC, + 0xC110, 0xBCAB, 0xC111, 0x98ED, 0xC112, 0x98EE, 0xC113, 0x98EF, + 0xC114, 0x98F0, 0xC115, 0xBCAC, 0xC116, 0x98F1, 0xC117, 0x98F2, + 0xC118, 0x98F3, 0xC119, 0x98F4, 0xC11A, 0x98F5, 0xC11B, 0x98F6, + 0xC11C, 0xBCAD, 0xC11D, 0xBCAE, 0xC11E, 0xBCAF, 0xC11F, 0xBCB0, + 0xC120, 0xBCB1, 0xC121, 0x98F7, 0xC122, 0x98F8, 0xC123, 0xBCB2, + 0xC124, 0xBCB3, 0xC125, 0x98F9, 0xC126, 0xBCB4, 0xC127, 0xBCB5, + 0xC128, 0x98FA, 0xC129, 0x98FB, 0xC12A, 0x98FC, 0xC12B, 0x98FD, + 0xC12C, 0xBCB6, 0xC12D, 0xBCB7, 0xC12E, 0x98FE, 0xC12F, 0xBCB8, + 0xC130, 0xBCB9, 0xC131, 0xBCBA, 0xC132, 0x9941, 0xC133, 0x9942, + 0xC134, 0x9943, 0xC135, 0x9944, 0xC136, 0xBCBB, 0xC137, 0x9945, + 0xC138, 0xBCBC, 0xC139, 0xBCBD, 0xC13A, 0x9946, 0xC13B, 0x9947, + 0xC13C, 0xBCBE, 0xC13D, 0x9948, 0xC13E, 0x9949, 0xC13F, 0x994A, + 0xC140, 0xBCBF, 0xC141, 0x994B, 0xC142, 0x994C, 0xC143, 0x994D, + 0xC144, 0x994E, 0xC145, 0x994F, 0xC146, 0x9950, 0xC147, 0x9951, + 0xC148, 0xBCC0, 0xC149, 0xBCC1, 0xC14A, 0x9952, 0xC14B, 0xBCC2, + 0xC14C, 0xBCC3, 0xC14D, 0xBCC4, 0xC14E, 0x9953, 0xC14F, 0x9954, + 0xC150, 0x9955, 0xC151, 0x9956, 0xC152, 0x9957, 0xC153, 0x9958, + 0xC154, 0xBCC5, 0xC155, 0xBCC6, 0xC156, 0x9959, 0xC157, 0x995A, + 0xC158, 0xBCC7, 0xC159, 0x9961, 0xC15A, 0x9962, 0xC15B, 0x9963, + 0xC15C, 0xBCC8, 0xC15D, 0x9964, 0xC15E, 0x9965, 0xC15F, 0x9966, + 0xC160, 0x9967, 0xC161, 0x9968, 0xC162, 0x9969, 0xC163, 0x996A, + 0xC164, 0xBCC9, 0xC165, 0xBCCA, 0xC166, 0x996B, 0xC167, 0xBCCB, + 0xC168, 0xBCCC, 0xC169, 0xBCCD, 0xC16A, 0x996C, 0xC16B, 0x996D, + 0xC16C, 0x996E, 0xC16D, 0x996F, 0xC16E, 0x9970, 0xC16F, 0x9971, + 0xC170, 0xBCCE, 0xC171, 0x9972, 0xC172, 0x9973, 0xC173, 0x9974, + 0xC174, 0xBCCF, 0xC175, 0x9975, 0xC176, 0x9976, 0xC177, 0x9977, + 0xC178, 0xBCD0, 0xC179, 0x9978, 0xC17A, 0x9979, 0xC17B, 0x997A, + 0xC17C, 0x9981, 0xC17D, 0x9982, 0xC17E, 0x9983, 0xC17F, 0x9984, + 0xC180, 0x9985, 0xC181, 0x9986, 0xC182, 0x9987, 0xC183, 0x9988, + 0xC184, 0x9989, 0xC185, 0xBCD1, 0xC186, 0x998A, 0xC187, 0x998B, + 0xC188, 0x998C, 0xC189, 0x998D, 0xC18A, 0x998E, 0xC18B, 0x998F, + 0xC18C, 0xBCD2, 0xC18D, 0xBCD3, 0xC18E, 0xBCD4, 0xC18F, 0x9990, + 0xC190, 0xBCD5, 0xC191, 0x9991, 0xC192, 0x9992, 0xC193, 0x9993, + 0xC194, 0xBCD6, 0xC195, 0x9994, 0xC196, 0xBCD7, 0xC197, 0x9995, + 0xC198, 0x9996, 0xC199, 0x9997, 0xC19A, 0x9998, 0xC19B, 0x9999, + 0xC19C, 0xBCD8, 0xC19D, 0xBCD9, 0xC19E, 0x999A, 0xC19F, 0xBCDA, + 0xC1A0, 0x999B, 0xC1A1, 0xBCDB, 0xC1A2, 0x999C, 0xC1A3, 0x999D, + 0xC1A4, 0x999E, 0xC1A5, 0xBCDC, 0xC1A6, 0x999F, 0xC1A7, 0x99A0, + 0xC1A8, 0xBCDD, 0xC1A9, 0xBCDE, 0xC1AA, 0x99A1, 0xC1AB, 0x99A2, + 0xC1AC, 0xBCDF, 0xC1AD, 0x99A3, 0xC1AE, 0x99A4, 0xC1AF, 0x99A5, + 0xC1B0, 0xBCE0, 0xC1B1, 0x99A6, 0xC1B2, 0x99A7, 0xC1B3, 0x99A8, + 0xC1B4, 0x99A9, 0xC1B5, 0x99AA, 0xC1B6, 0x99AB, 0xC1B7, 0x99AC, + 0xC1B8, 0x99AD, 0xC1B9, 0x99AE, 0xC1BA, 0x99AF, 0xC1BB, 0x99B0, + 0xC1BC, 0x99B1, 0xC1BD, 0xBCE1, 0xC1BE, 0x99B2, 0xC1BF, 0x99B3, + 0xC1C0, 0x99B4, 0xC1C1, 0x99B5, 0xC1C2, 0x99B6, 0xC1C3, 0x99B7, + 0xC1C4, 0xBCE2, 0xC1C5, 0x99B8, 0xC1C6, 0x99B9, 0xC1C7, 0x99BA, + 0xC1C8, 0xBCE3, 0xC1C9, 0x99BB, 0xC1CA, 0x99BC, 0xC1CB, 0x99BD, + 0xC1CC, 0xBCE4, 0xC1CD, 0x99BE, 0xC1CE, 0x99BF, 0xC1CF, 0x99C0, + 0xC1D0, 0x99C1, 0xC1D1, 0x99C2, 0xC1D2, 0x99C3, 0xC1D3, 0x99C4, + 0xC1D4, 0xBCE5, 0xC1D5, 0x99C5, 0xC1D6, 0x99C6, 0xC1D7, 0xBCE6, + 0xC1D8, 0xBCE7, 0xC1D9, 0x99C7, 0xC1DA, 0x99C8, 0xC1DB, 0x99C9, + 0xC1DC, 0x99CA, 0xC1DD, 0x99CB, 0xC1DE, 0x99CC, 0xC1DF, 0x99CD, + 0xC1E0, 0xBCE8, 0xC1E1, 0x99CE, 0xC1E2, 0x99CF, 0xC1E3, 0x99D0, + 0xC1E4, 0xBCE9, 0xC1E5, 0x99D1, 0xC1E6, 0x99D2, 0xC1E7, 0x99D3, + 0xC1E8, 0xBCEA, 0xC1E9, 0x99D4, 0xC1EA, 0x99D5, 0xC1EB, 0x99D6, + 0xC1EC, 0x99D7, 0xC1ED, 0x99D8, 0xC1EE, 0x99D9, 0xC1EF, 0x99DA, + 0xC1F0, 0xBCEB, 0xC1F1, 0xBCEC, 0xC1F2, 0x99DB, 0xC1F3, 0xBCED, + 0xC1F4, 0x99DC, 0xC1F5, 0x99DD, 0xC1F6, 0x99DE, 0xC1F7, 0x99DF, + 0xC1F8, 0x99E0, 0xC1F9, 0x99E1, 0xC1FA, 0x99E2, 0xC1FB, 0x99E3, + 0xC1FC, 0xBCEE, 0xC1FD, 0xBCEF, 0xC1FE, 0x99E4, 0xC1FF, 0x99E5, + 0xC200, 0xBCF0, 0xC201, 0x99E6, 0xC202, 0x99E7, 0xC203, 0x99E8, + 0xC204, 0xBCF1, 0xC205, 0x99E9, 0xC206, 0x99EA, 0xC207, 0x99EB, + 0xC208, 0x99EC, 0xC209, 0x99ED, 0xC20A, 0x99EE, 0xC20B, 0x99EF, + 0xC20C, 0xBCF2, 0xC20D, 0xBCF3, 0xC20E, 0x99F0, 0xC20F, 0xBCF4, + 0xC210, 0x99F1, 0xC211, 0xBCF5, 0xC212, 0x99F2, 0xC213, 0x99F3, + 0xC214, 0x99F4, 0xC215, 0x99F5, 0xC216, 0x99F6, 0xC217, 0x99F7, + 0xC218, 0xBCF6, 0xC219, 0xBCF7, 0xC21A, 0x99F8, 0xC21B, 0x99F9, + 0xC21C, 0xBCF8, 0xC21D, 0x99FA, 0xC21E, 0x99FB, 0xC21F, 0xBCF9, + 0xC220, 0xBCFA, 0xC221, 0x99FC, 0xC222, 0x99FD, 0xC223, 0x99FE, + 0xC224, 0x9A41, 0xC225, 0x9A42, 0xC226, 0x9A43, 0xC227, 0x9A44, + 0xC228, 0xBCFB, 0xC229, 0xBCFC, 0xC22A, 0x9A45, 0xC22B, 0xBCFD, + 0xC22C, 0x9A46, 0xC22D, 0xBCFE, 0xC22E, 0x9A47, 0xC22F, 0xBDA1, + 0xC230, 0x9A48, 0xC231, 0xBDA2, 0xC232, 0xBDA3, 0xC233, 0x9A49, + 0xC234, 0xBDA4, 0xC235, 0x9A4A, 0xC236, 0x9A4B, 0xC237, 0x9A4C, + 0xC238, 0x9A4D, 0xC239, 0x9A4E, 0xC23A, 0x9A4F, 0xC23B, 0x9A50, + 0xC23C, 0x9A51, 0xC23D, 0x9A52, 0xC23E, 0x9A53, 0xC23F, 0x9A54, + 0xC240, 0x9A55, 0xC241, 0x9A56, 0xC242, 0x9A57, 0xC243, 0x9A58, + 0xC244, 0x9A59, 0xC245, 0x9A5A, 0xC246, 0x9A61, 0xC247, 0x9A62, + 0xC248, 0xBDA5, 0xC249, 0x9A63, 0xC24A, 0x9A64, 0xC24B, 0x9A65, + 0xC24C, 0x9A66, 0xC24D, 0x9A67, 0xC24E, 0x9A68, 0xC24F, 0x9A69, + 0xC250, 0xBDA6, 0xC251, 0xBDA7, 0xC252, 0x9A6A, 0xC253, 0x9A6B, + 0xC254, 0xBDA8, 0xC255, 0x9A6C, 0xC256, 0x9A6D, 0xC257, 0x9A6E, + 0xC258, 0xBDA9, 0xC259, 0x9A6F, 0xC25A, 0x9A70, 0xC25B, 0x9A71, + 0xC25C, 0x9A72, 0xC25D, 0x9A73, 0xC25E, 0x9A74, 0xC25F, 0x9A75, + 0xC260, 0xBDAA, 0xC261, 0x9A76, 0xC262, 0x9A77, 0xC263, 0x9A78, + 0xC264, 0x9A79, 0xC265, 0xBDAB, 0xC266, 0x9A7A, 0xC267, 0x9A81, + 0xC268, 0x9A82, 0xC269, 0x9A83, 0xC26A, 0x9A84, 0xC26B, 0x9A85, + 0xC26C, 0xBDAC, 0xC26D, 0xBDAD, 0xC26E, 0x9A86, 0xC26F, 0x9A87, + 0xC270, 0xBDAE, 0xC271, 0x9A88, 0xC272, 0x9A89, 0xC273, 0x9A8A, + 0xC274, 0xBDAF, 0xC275, 0x9A8B, 0xC276, 0x9A8C, 0xC277, 0x9A8D, + 0xC278, 0x9A8E, 0xC279, 0x9A8F, 0xC27A, 0x9A90, 0xC27B, 0x9A91, + 0xC27C, 0xBDB0, 0xC27D, 0xBDB1, 0xC27E, 0x9A92, 0xC27F, 0xBDB2, + 0xC280, 0x9A93, 0xC281, 0xBDB3, 0xC282, 0x9A94, 0xC283, 0x9A95, + 0xC284, 0x9A96, 0xC285, 0x9A97, 0xC286, 0x9A98, 0xC287, 0x9A99, + 0xC288, 0xBDB4, 0xC289, 0xBDB5, 0xC28A, 0x9A9A, 0xC28B, 0x9A9B, + 0xC28C, 0x9A9C, 0xC28D, 0x9A9D, 0xC28E, 0x9A9E, 0xC28F, 0x9A9F, + 0xC290, 0xBDB6, 0xC291, 0x9AA0, 0xC292, 0x9AA1, 0xC293, 0x9AA2, + 0xC294, 0x9AA3, 0xC295, 0x9AA4, 0xC296, 0x9AA5, 0xC297, 0x9AA6, + 0xC298, 0xBDB7, 0xC299, 0x9AA7, 0xC29A, 0x9AA8, 0xC29B, 0xBDB8, + 0xC29C, 0x9AA9, 0xC29D, 0xBDB9, 0xC29E, 0x9AAA, 0xC29F, 0x9AAB, + 0xC2A0, 0x9AAC, 0xC2A1, 0x9AAD, 0xC2A2, 0x9AAE, 0xC2A3, 0x9AAF, + 0xC2A4, 0xBDBA, 0xC2A5, 0xBDBB, 0xC2A6, 0x9AB0, 0xC2A7, 0x9AB1, + 0xC2A8, 0xBDBC, 0xC2A9, 0x9AB2, 0xC2AA, 0x9AB3, 0xC2AB, 0x9AB4, + 0xC2AC, 0xBDBD, 0xC2AD, 0xBDBE, 0xC2AE, 0x9AB5, 0xC2AF, 0x9AB6, + 0xC2B0, 0x9AB7, 0xC2B1, 0x9AB8, 0xC2B2, 0x9AB9, 0xC2B3, 0x9ABA, + 0xC2B4, 0xBDBF, 0xC2B5, 0xBDC0, 0xC2B6, 0x9ABB, 0xC2B7, 0xBDC1, + 0xC2B8, 0x9ABC, 0xC2B9, 0xBDC2, 0xC2BA, 0x9ABD, 0xC2BB, 0x9ABE, + 0xC2BC, 0x9ABF, 0xC2BD, 0x9AC0, 0xC2BE, 0x9AC1, 0xC2BF, 0x9AC2, + 0xC2C0, 0x9AC3, 0xC2C1, 0x9AC4, 0xC2C2, 0x9AC5, 0xC2C3, 0x9AC6, + 0xC2C4, 0x9AC7, 0xC2C5, 0x9AC8, 0xC2C6, 0x9AC9, 0xC2C7, 0x9ACA, + 0xC2C8, 0x9ACB, 0xC2C9, 0x9ACC, 0xC2CA, 0x9ACD, 0xC2CB, 0x9ACE, + 0xC2CC, 0x9ACF, 0xC2CD, 0x9AD0, 0xC2CE, 0x9AD1, 0xC2CF, 0x9AD2, + 0xC2D0, 0x9AD3, 0xC2D1, 0x9AD4, 0xC2D2, 0x9AD5, 0xC2D3, 0x9AD6, + 0xC2D4, 0x9AD7, 0xC2D5, 0x9AD8, 0xC2D6, 0x9AD9, 0xC2D7, 0x9ADA, + 0xC2D8, 0x9ADB, 0xC2D9, 0x9ADC, 0xC2DA, 0x9ADD, 0xC2DB, 0x9ADE, + 0xC2DC, 0xBDC3, 0xC2DD, 0xBDC4, 0xC2DE, 0x9ADF, 0xC2DF, 0x9AE0, + 0xC2E0, 0xBDC5, 0xC2E1, 0x9AE1, 0xC2E2, 0x9AE2, 0xC2E3, 0xBDC6, + 0xC2E4, 0xBDC7, 0xC2E5, 0x9AE3, 0xC2E6, 0x9AE4, 0xC2E7, 0x9AE5, + 0xC2E8, 0x9AE6, 0xC2E9, 0x9AE7, 0xC2EA, 0x9AE8, 0xC2EB, 0xBDC8, + 0xC2EC, 0xBDC9, 0xC2ED, 0xBDCA, 0xC2EE, 0x9AE9, 0xC2EF, 0xBDCB, + 0xC2F0, 0x9AEA, 0xC2F1, 0xBDCC, 0xC2F2, 0x9AEB, 0xC2F3, 0x9AEC, + 0xC2F4, 0x9AED, 0xC2F5, 0x9AEE, 0xC2F6, 0xBDCD, 0xC2F7, 0x9AEF, + 0xC2F8, 0xBDCE, 0xC2F9, 0xBDCF, 0xC2FA, 0x9AF0, 0xC2FB, 0xBDD0, + 0xC2FC, 0xBDD1, 0xC2FD, 0x9AF1, 0xC2FE, 0x9AF2, 0xC2FF, 0x9AF3, + 0xC300, 0xBDD2, 0xC301, 0x9AF4, 0xC302, 0x9AF5, 0xC303, 0x9AF6, + 0xC304, 0x9AF7, 0xC305, 0x9AF8, 0xC306, 0x9AF9, 0xC307, 0x9AFA, + 0xC308, 0xBDD3, 0xC309, 0xBDD4, 0xC30A, 0x9AFB, 0xC30B, 0x9AFC, + 0xC30C, 0xBDD5, 0xC30D, 0xBDD6, 0xC30E, 0x9AFD, 0xC30F, 0x9AFE, + 0xC310, 0x9B41, 0xC311, 0x9B42, 0xC312, 0x9B43, 0xC313, 0xBDD7, + 0xC314, 0xBDD8, 0xC315, 0xBDD9, 0xC316, 0x9B44, 0xC317, 0x9B45, + 0xC318, 0xBDDA, 0xC319, 0x9B46, 0xC31A, 0x9B47, 0xC31B, 0x9B48, + 0xC31C, 0xBDDB, 0xC31D, 0x9B49, 0xC31E, 0x9B4A, 0xC31F, 0x9B4B, + 0xC320, 0x9B4C, 0xC321, 0x9B4D, 0xC322, 0x9B4E, 0xC323, 0x9B4F, + 0xC324, 0xBDDC, 0xC325, 0xBDDD, 0xC326, 0x9B50, 0xC327, 0x9B51, + 0xC328, 0xBDDE, 0xC329, 0xBDDF, 0xC32A, 0x9B52, 0xC32B, 0x9B53, + 0xC32C, 0x9B54, 0xC32D, 0x9B55, 0xC32E, 0x9B56, 0xC32F, 0x9B57, + 0xC330, 0x9B58, 0xC331, 0x9B59, 0xC332, 0x9B5A, 0xC333, 0x9B61, + 0xC334, 0x9B62, 0xC335, 0x9B63, 0xC336, 0x9B64, 0xC337, 0x9B65, + 0xC338, 0x9B66, 0xC339, 0x9B67, 0xC33A, 0x9B68, 0xC33B, 0x9B69, + 0xC33C, 0x9B6A, 0xC33D, 0x9B6B, 0xC33E, 0x9B6C, 0xC33F, 0x9B6D, + 0xC340, 0x9B6E, 0xC341, 0x9B6F, 0xC342, 0x9B70, 0xC343, 0x9B71, + 0xC344, 0x9B72, 0xC345, 0xBDE0, 0xC346, 0x9B73, 0xC347, 0x9B74, + 0xC348, 0x9B75, 0xC349, 0x9B76, 0xC34A, 0x9B77, 0xC34B, 0x9B78, + 0xC34C, 0x9B79, 0xC34D, 0x9B7A, 0xC34E, 0x9B81, 0xC34F, 0x9B82, + 0xC350, 0x9B83, 0xC351, 0x9B84, 0xC352, 0x9B85, 0xC353, 0x9B86, + 0xC354, 0x9B87, 0xC355, 0x9B88, 0xC356, 0x9B89, 0xC357, 0x9B8A, + 0xC358, 0x9B8B, 0xC359, 0x9B8C, 0xC35A, 0x9B8D, 0xC35B, 0x9B8E, + 0xC35C, 0x9B8F, 0xC35D, 0x9B90, 0xC35E, 0x9B91, 0xC35F, 0x9B92, + 0xC360, 0x9B93, 0xC361, 0x9B94, 0xC362, 0x9B95, 0xC363, 0x9B96, + 0xC364, 0x9B97, 0xC365, 0x9B98, 0xC366, 0x9B99, 0xC367, 0x9B9A, + 0xC368, 0xBDE1, 0xC369, 0xBDE2, 0xC36A, 0x9B9B, 0xC36B, 0x9B9C, + 0xC36C, 0xBDE3, 0xC36D, 0x9B9D, 0xC36E, 0x9B9E, 0xC36F, 0x9B9F, + 0xC370, 0xBDE4, 0xC371, 0x9BA0, 0xC372, 0xBDE5, 0xC373, 0x9BA1, + 0xC374, 0x9BA2, 0xC375, 0x9BA3, 0xC376, 0x9BA4, 0xC377, 0x9BA5, + 0xC378, 0xBDE6, 0xC379, 0xBDE7, 0xC37A, 0x9BA6, 0xC37B, 0x9BA7, + 0xC37C, 0xBDE8, 0xC37D, 0xBDE9, 0xC37E, 0x9BA8, 0xC37F, 0x9BA9, + 0xC380, 0x9BAA, 0xC381, 0x9BAB, 0xC382, 0x9BAC, 0xC383, 0x9BAD, + 0xC384, 0xBDEA, 0xC385, 0x9BAE, 0xC386, 0x9BAF, 0xC387, 0x9BB0, + 0xC388, 0xBDEB, 0xC389, 0x9BB1, 0xC38A, 0x9BB2, 0xC38B, 0x9BB3, + 0xC38C, 0xBDEC, 0xC38D, 0x9BB4, 0xC38E, 0x9BB5, 0xC38F, 0x9BB6, + 0xC390, 0x9BB7, 0xC391, 0x9BB8, 0xC392, 0x9BB9, 0xC393, 0x9BBA, + 0xC394, 0x9BBB, 0xC395, 0x9BBC, 0xC396, 0x9BBD, 0xC397, 0x9BBE, + 0xC398, 0x9BBF, 0xC399, 0x9BC0, 0xC39A, 0x9BC1, 0xC39B, 0x9BC2, + 0xC39C, 0x9BC3, 0xC39D, 0x9BC4, 0xC39E, 0x9BC5, 0xC39F, 0x9BC6, + 0xC3A0, 0x9BC7, 0xC3A1, 0x9BC8, 0xC3A2, 0x9BC9, 0xC3A3, 0x9BCA, + 0xC3A4, 0x9BCB, 0xC3A5, 0x9BCC, 0xC3A6, 0x9BCD, 0xC3A7, 0x9BCE, + 0xC3A8, 0x9BCF, 0xC3A9, 0x9BD0, 0xC3AA, 0x9BD1, 0xC3AB, 0x9BD2, + 0xC3AC, 0x9BD3, 0xC3AD, 0x9BD4, 0xC3AE, 0x9BD5, 0xC3AF, 0x9BD6, + 0xC3B0, 0x9BD7, 0xC3B1, 0x9BD8, 0xC3B2, 0x9BD9, 0xC3B3, 0x9BDA, + 0xC3B4, 0x9BDB, 0xC3B5, 0x9BDC, 0xC3B6, 0x9BDD, 0xC3B7, 0x9BDE, + 0xC3B8, 0x9BDF, 0xC3B9, 0x9BE0, 0xC3BA, 0x9BE1, 0xC3BB, 0x9BE2, + 0xC3BC, 0x9BE3, 0xC3BD, 0x9BE4, 0xC3BE, 0x9BE5, 0xC3BF, 0x9BE6, + 0xC3C0, 0xBDED, 0xC3C1, 0x9BE7, 0xC3C2, 0x9BE8, 0xC3C3, 0x9BE9, + 0xC3C4, 0x9BEA, 0xC3C5, 0x9BEB, 0xC3C6, 0x9BEC, 0xC3C7, 0x9BED, + 0xC3C8, 0x9BEE, 0xC3C9, 0x9BEF, 0xC3CA, 0x9BF0, 0xC3CB, 0x9BF1, + 0xC3CC, 0x9BF2, 0xC3CD, 0x9BF3, 0xC3CE, 0x9BF4, 0xC3CF, 0x9BF5, + 0xC3D0, 0x9BF6, 0xC3D1, 0x9BF7, 0xC3D2, 0x9BF8, 0xC3D3, 0x9BF9, + 0xC3D4, 0x9BFA, 0xC3D5, 0x9BFB, 0xC3D6, 0x9BFC, 0xC3D7, 0x9BFD, + 0xC3D8, 0xBDEE, 0xC3D9, 0xBDEF, 0xC3DA, 0x9BFE, 0xC3DB, 0x9C41, + 0xC3DC, 0xBDF0, 0xC3DD, 0x9C42, 0xC3DE, 0x9C43, 0xC3DF, 0xBDF1, + 0xC3E0, 0xBDF2, 0xC3E1, 0x9C44, 0xC3E2, 0xBDF3, 0xC3E3, 0x9C45, + 0xC3E4, 0x9C46, 0xC3E5, 0x9C47, 0xC3E6, 0x9C48, 0xC3E7, 0x9C49, + 0xC3E8, 0xBDF4, 0xC3E9, 0xBDF5, 0xC3EA, 0x9C4A, 0xC3EB, 0x9C4B, + 0xC3EC, 0x9C4C, 0xC3ED, 0xBDF6, 0xC3EE, 0x9C4D, 0xC3EF, 0x9C4E, + 0xC3F0, 0x9C4F, 0xC3F1, 0x9C50, 0xC3F2, 0x9C51, 0xC3F3, 0x9C52, + 0xC3F4, 0xBDF7, 0xC3F5, 0xBDF8, 0xC3F6, 0x9C53, 0xC3F7, 0x9C54, + 0xC3F8, 0xBDF9, 0xC3F9, 0x9C55, 0xC3FA, 0x9C56, 0xC3FB, 0x9C57, + 0xC3FC, 0x9C58, 0xC3FD, 0x9C59, 0xC3FE, 0x9C5A, 0xC3FF, 0x9C61, + 0xC400, 0x9C62, 0xC401, 0x9C63, 0xC402, 0x9C64, 0xC403, 0x9C65, + 0xC404, 0x9C66, 0xC405, 0x9C67, 0xC406, 0x9C68, 0xC407, 0x9C69, + 0xC408, 0xBDFA, 0xC409, 0x9C6A, 0xC40A, 0x9C6B, 0xC40B, 0x9C6C, + 0xC40C, 0x9C6D, 0xC40D, 0x9C6E, 0xC40E, 0x9C6F, 0xC40F, 0x9C70, + 0xC410, 0xBDFB, 0xC411, 0x9C71, 0xC412, 0x9C72, 0xC413, 0x9C73, + 0xC414, 0x9C74, 0xC415, 0x9C75, 0xC416, 0x9C76, 0xC417, 0x9C77, + 0xC418, 0x9C78, 0xC419, 0x9C79, 0xC41A, 0x9C7A, 0xC41B, 0x9C81, + 0xC41C, 0x9C82, 0xC41D, 0x9C83, 0xC41E, 0x9C84, 0xC41F, 0x9C85, + 0xC420, 0x9C86, 0xC421, 0x9C87, 0xC422, 0x9C88, 0xC423, 0x9C89, + 0xC424, 0xBDFC, 0xC425, 0x9C8A, 0xC426, 0x9C8B, 0xC427, 0x9C8C, + 0xC428, 0x9C8D, 0xC429, 0x9C8E, 0xC42A, 0x9C8F, 0xC42B, 0x9C90, + 0xC42C, 0xBDFD, 0xC42D, 0x9C91, 0xC42E, 0x9C92, 0xC42F, 0x9C93, + 0xC430, 0xBDFE, 0xC431, 0x9C94, 0xC432, 0x9C95, 0xC433, 0x9C96, + 0xC434, 0xBEA1, 0xC435, 0x9C97, 0xC436, 0x9C98, 0xC437, 0x9C99, + 0xC438, 0x9C9A, 0xC439, 0x9C9B, 0xC43A, 0x9C9C, 0xC43B, 0x9C9D, + 0xC43C, 0xBEA2, 0xC43D, 0xBEA3, 0xC43E, 0x9C9E, 0xC43F, 0x9C9F, + 0xC440, 0x9CA0, 0xC441, 0x9CA1, 0xC442, 0x9CA2, 0xC443, 0x9CA3, + 0xC444, 0x9CA4, 0xC445, 0x9CA5, 0xC446, 0x9CA6, 0xC447, 0x9CA7, + 0xC448, 0xBEA4, 0xC449, 0x9CA8, 0xC44A, 0x9CA9, 0xC44B, 0x9CAA, + 0xC44C, 0x9CAB, 0xC44D, 0x9CAC, 0xC44E, 0x9CAD, 0xC44F, 0x9CAE, + 0xC450, 0x9CAF, 0xC451, 0x9CB0, 0xC452, 0x9CB1, 0xC453, 0x9CB2, + 0xC454, 0x9CB3, 0xC455, 0x9CB4, 0xC456, 0x9CB5, 0xC457, 0x9CB6, + 0xC458, 0x9CB7, 0xC459, 0x9CB8, 0xC45A, 0x9CB9, 0xC45B, 0x9CBA, + 0xC45C, 0x9CBB, 0xC45D, 0x9CBC, 0xC45E, 0x9CBD, 0xC45F, 0x9CBE, + 0xC460, 0x9CBF, 0xC461, 0x9CC0, 0xC462, 0x9CC1, 0xC463, 0x9CC2, + 0xC464, 0xBEA5, 0xC465, 0xBEA6, 0xC466, 0x9CC3, 0xC467, 0x9CC4, + 0xC468, 0xBEA7, 0xC469, 0x9CC5, 0xC46A, 0x9CC6, 0xC46B, 0x9CC7, + 0xC46C, 0xBEA8, 0xC46D, 0x9CC8, 0xC46E, 0x9CC9, 0xC46F, 0x9CCA, + 0xC470, 0x9CCB, 0xC471, 0x9CCC, 0xC472, 0x9CCD, 0xC473, 0x9CCE, + 0xC474, 0xBEA9, 0xC475, 0xBEAA, 0xC476, 0x9CCF, 0xC477, 0x9CD0, + 0xC478, 0x9CD1, 0xC479, 0xBEAB, 0xC47A, 0x9CD2, 0xC47B, 0x9CD3, + 0xC47C, 0x9CD4, 0xC47D, 0x9CD5, 0xC47E, 0x9CD6, 0xC47F, 0x9CD7, + 0xC480, 0xBEAC, 0xC481, 0x9CD8, 0xC482, 0x9CD9, 0xC483, 0x9CDA, + 0xC484, 0x9CDB, 0xC485, 0x9CDC, 0xC486, 0x9CDD, 0xC487, 0x9CDE, + 0xC488, 0x9CDF, 0xC489, 0x9CE0, 0xC48A, 0x9CE1, 0xC48B, 0x9CE2, + 0xC48C, 0x9CE3, 0xC48D, 0x9CE4, 0xC48E, 0x9CE5, 0xC48F, 0x9CE6, + 0xC490, 0x9CE7, 0xC491, 0x9CE8, 0xC492, 0x9CE9, 0xC493, 0x9CEA, + 0xC494, 0xBEAD, 0xC495, 0x9CEB, 0xC496, 0x9CEC, 0xC497, 0x9CED, + 0xC498, 0x9CEE, 0xC499, 0x9CEF, 0xC49A, 0x9CF0, 0xC49B, 0x9CF1, + 0xC49C, 0xBEAE, 0xC49D, 0x9CF2, 0xC49E, 0x9CF3, 0xC49F, 0x9CF4, + 0xC4A0, 0x9CF5, 0xC4A1, 0x9CF6, 0xC4A2, 0x9CF7, 0xC4A3, 0x9CF8, + 0xC4A4, 0x9CF9, 0xC4A5, 0x9CFA, 0xC4A6, 0x9CFB, 0xC4A7, 0x9CFC, + 0xC4A8, 0x9CFD, 0xC4A9, 0x9CFE, 0xC4AA, 0x9D41, 0xC4AB, 0x9D42, + 0xC4AC, 0x9D43, 0xC4AD, 0x9D44, 0xC4AE, 0x9D45, 0xC4AF, 0x9D46, + 0xC4B0, 0x9D47, 0xC4B1, 0x9D48, 0xC4B2, 0x9D49, 0xC4B3, 0x9D4A, + 0xC4B4, 0x9D4B, 0xC4B5, 0x9D4C, 0xC4B6, 0x9D4D, 0xC4B7, 0x9D4E, + 0xC4B8, 0xBEAF, 0xC4B9, 0x9D4F, 0xC4BA, 0x9D50, 0xC4BB, 0x9D51, + 0xC4BC, 0xBEB0, 0xC4BD, 0x9D52, 0xC4BE, 0x9D53, 0xC4BF, 0x9D54, + 0xC4C0, 0x9D55, 0xC4C1, 0x9D56, 0xC4C2, 0x9D57, 0xC4C3, 0x9D58, + 0xC4C4, 0x9D59, 0xC4C5, 0x9D5A, 0xC4C6, 0x9D61, 0xC4C7, 0x9D62, + 0xC4C8, 0x9D63, 0xC4C9, 0x9D64, 0xC4CA, 0x9D65, 0xC4CB, 0x9D66, + 0xC4CC, 0x9D67, 0xC4CD, 0x9D68, 0xC4CE, 0x9D69, 0xC4CF, 0x9D6A, + 0xC4D0, 0x9D6B, 0xC4D1, 0x9D6C, 0xC4D2, 0x9D6D, 0xC4D3, 0x9D6E, + 0xC4D4, 0x9D6F, 0xC4D5, 0x9D70, 0xC4D6, 0x9D71, 0xC4D7, 0x9D72, + 0xC4D8, 0x9D73, 0xC4D9, 0x9D74, 0xC4DA, 0x9D75, 0xC4DB, 0x9D76, + 0xC4DC, 0x9D77, 0xC4DD, 0x9D78, 0xC4DE, 0x9D79, 0xC4DF, 0x9D7A, + 0xC4E0, 0x9D81, 0xC4E1, 0x9D82, 0xC4E2, 0x9D83, 0xC4E3, 0x9D84, + 0xC4E4, 0x9D85, 0xC4E5, 0x9D86, 0xC4E6, 0x9D87, 0xC4E7, 0x9D88, + 0xC4E8, 0x9D89, 0xC4E9, 0xBEB1, 0xC4EA, 0x9D8A, 0xC4EB, 0x9D8B, + 0xC4EC, 0x9D8C, 0xC4ED, 0x9D8D, 0xC4EE, 0x9D8E, 0xC4EF, 0x9D8F, + 0xC4F0, 0xBEB2, 0xC4F1, 0xBEB3, 0xC4F2, 0x9D90, 0xC4F3, 0x9D91, + 0xC4F4, 0xBEB4, 0xC4F5, 0x9D92, 0xC4F6, 0x9D93, 0xC4F7, 0x9D94, + 0xC4F8, 0xBEB5, 0xC4F9, 0x9D95, 0xC4FA, 0xBEB6, 0xC4FB, 0x9D96, + 0xC4FC, 0x9D97, 0xC4FD, 0x9D98, 0xC4FE, 0x9D99, 0xC4FF, 0xBEB7, + 0xC500, 0xBEB8, 0xC501, 0xBEB9, 0xC502, 0x9D9A, 0xC503, 0x9D9B, + 0xC504, 0x9D9C, 0xC505, 0x9D9D, 0xC506, 0x9D9E, 0xC507, 0x9D9F, + 0xC508, 0x9DA0, 0xC509, 0x9DA1, 0xC50A, 0x9DA2, 0xC50B, 0x9DA3, + 0xC50C, 0xBEBA, 0xC50D, 0x9DA4, 0xC50E, 0x9DA5, 0xC50F, 0x9DA6, + 0xC510, 0xBEBB, 0xC511, 0x9DA7, 0xC512, 0x9DA8, 0xC513, 0x9DA9, + 0xC514, 0xBEBC, 0xC515, 0x9DAA, 0xC516, 0x9DAB, 0xC517, 0x9DAC, + 0xC518, 0x9DAD, 0xC519, 0x9DAE, 0xC51A, 0x9DAF, 0xC51B, 0x9DB0, + 0xC51C, 0xBEBD, 0xC51D, 0x9DB1, 0xC51E, 0x9DB2, 0xC51F, 0x9DB3, + 0xC520, 0x9DB4, 0xC521, 0x9DB5, 0xC522, 0x9DB6, 0xC523, 0x9DB7, + 0xC524, 0x9DB8, 0xC525, 0x9DB9, 0xC526, 0x9DBA, 0xC527, 0x9DBB, + 0xC528, 0xBEBE, 0xC529, 0xBEBF, 0xC52A, 0x9DBC, 0xC52B, 0x9DBD, + 0xC52C, 0xBEC0, 0xC52D, 0x9DBE, 0xC52E, 0x9DBF, 0xC52F, 0x9DC0, + 0xC530, 0xBEC1, 0xC531, 0x9DC1, 0xC532, 0x9DC2, 0xC533, 0x9DC3, + 0xC534, 0x9DC4, 0xC535, 0x9DC5, 0xC536, 0x9DC6, 0xC537, 0x9DC7, + 0xC538, 0xBEC2, 0xC539, 0xBEC3, 0xC53A, 0x9DC8, 0xC53B, 0xBEC4, + 0xC53C, 0x9DC9, 0xC53D, 0xBEC5, 0xC53E, 0x9DCA, 0xC53F, 0x9DCB, + 0xC540, 0x9DCC, 0xC541, 0x9DCD, 0xC542, 0x9DCE, 0xC543, 0x9DCF, + 0xC544, 0xBEC6, 0xC545, 0xBEC7, 0xC546, 0x9DD0, 0xC547, 0x9DD1, + 0xC548, 0xBEC8, 0xC549, 0xBEC9, 0xC54A, 0xBECA, 0xC54B, 0x9DD2, + 0xC54C, 0xBECB, 0xC54D, 0xBECC, 0xC54E, 0xBECD, 0xC54F, 0x9DD3, + 0xC550, 0x9DD4, 0xC551, 0x9DD5, 0xC552, 0x9DD6, 0xC553, 0xBECE, + 0xC554, 0xBECF, 0xC555, 0xBED0, 0xC556, 0x9DD7, 0xC557, 0xBED1, + 0xC558, 0xBED2, 0xC559, 0xBED3, 0xC55A, 0x9DD8, 0xC55B, 0x9DD9, + 0xC55C, 0x9DDA, 0xC55D, 0xBED4, 0xC55E, 0xBED5, 0xC55F, 0x9DDB, + 0xC560, 0xBED6, 0xC561, 0xBED7, 0xC562, 0x9DDC, 0xC563, 0x9DDD, + 0xC564, 0xBED8, 0xC565, 0x9DDE, 0xC566, 0x9DDF, 0xC567, 0x9DE0, + 0xC568, 0xBED9, 0xC569, 0x9DE1, 0xC56A, 0x9DE2, 0xC56B, 0x9DE3, + 0xC56C, 0x9DE4, 0xC56D, 0x9DE5, 0xC56E, 0x9DE6, 0xC56F, 0x9DE7, + 0xC570, 0xBEDA, 0xC571, 0xBEDB, 0xC572, 0x9DE8, 0xC573, 0xBEDC, + 0xC574, 0xBEDD, 0xC575, 0xBEDE, 0xC576, 0x9DE9, 0xC577, 0x9DEA, + 0xC578, 0x9DEB, 0xC579, 0x9DEC, 0xC57A, 0x9DED, 0xC57B, 0x9DEE, + 0xC57C, 0xBEDF, 0xC57D, 0xBEE0, 0xC57E, 0x9DEF, 0xC57F, 0x9DF0, + 0xC580, 0xBEE1, 0xC581, 0x9DF1, 0xC582, 0x9DF2, 0xC583, 0x9DF3, + 0xC584, 0xBEE2, 0xC585, 0x9DF4, 0xC586, 0x9DF5, 0xC587, 0xBEE3, + 0xC588, 0x9DF6, 0xC589, 0x9DF7, 0xC58A, 0x9DF8, 0xC58B, 0x9DF9, + 0xC58C, 0xBEE4, 0xC58D, 0xBEE5, 0xC58E, 0x9DFA, 0xC58F, 0xBEE6, + 0xC590, 0x9DFB, 0xC591, 0xBEE7, 0xC592, 0x9DFC, 0xC593, 0x9DFD, + 0xC594, 0x9DFE, 0xC595, 0xBEE8, 0xC596, 0x9E41, 0xC597, 0xBEE9, + 0xC598, 0xBEEA, 0xC599, 0x9E42, 0xC59A, 0x9E43, 0xC59B, 0x9E44, + 0xC59C, 0xBEEB, 0xC59D, 0x9E45, 0xC59E, 0x9E46, 0xC59F, 0x9E47, + 0xC5A0, 0xBEEC, 0xC5A1, 0x9E48, 0xC5A2, 0x9E49, 0xC5A3, 0x9E4A, + 0xC5A4, 0x9E4B, 0xC5A5, 0x9E4C, 0xC5A6, 0x9E4D, 0xC5A7, 0x9E4E, + 0xC5A8, 0x9E4F, 0xC5A9, 0xBEED, 0xC5AA, 0x9E50, 0xC5AB, 0x9E51, + 0xC5AC, 0x9E52, 0xC5AD, 0x9E53, 0xC5AE, 0x9E54, 0xC5AF, 0x9E55, + 0xC5B0, 0x9E56, 0xC5B1, 0x9E57, 0xC5B2, 0x9E58, 0xC5B3, 0x9E59, + 0xC5B4, 0xBEEE, 0xC5B5, 0xBEEF, 0xC5B6, 0x9E5A, 0xC5B7, 0x9E61, + 0xC5B8, 0xBEF0, 0xC5B9, 0xBEF1, 0xC5BA, 0x9E62, 0xC5BB, 0xBEF2, + 0xC5BC, 0xBEF3, 0xC5BD, 0xBEF4, 0xC5BE, 0xBEF5, 0xC5BF, 0x9E63, + 0xC5C0, 0x9E64, 0xC5C1, 0x9E65, 0xC5C2, 0x9E66, 0xC5C3, 0x9E67, + 0xC5C4, 0xBEF6, 0xC5C5, 0xBEF7, 0xC5C6, 0xBEF8, 0xC5C7, 0xBEF9, + 0xC5C8, 0xBEFA, 0xC5C9, 0xBEFB, 0xC5CA, 0xBEFC, 0xC5CB, 0x9E68, + 0xC5CC, 0xBEFD, 0xC5CD, 0x9E69, 0xC5CE, 0xBEFE, 0xC5CF, 0x9E6A, + 0xC5D0, 0xBFA1, 0xC5D1, 0xBFA2, 0xC5D2, 0x9E6B, 0xC5D3, 0x9E6C, + 0xC5D4, 0xBFA3, 0xC5D5, 0x9E6D, 0xC5D6, 0x9E6E, 0xC5D7, 0x9E6F, + 0xC5D8, 0xBFA4, 0xC5D9, 0x9E70, 0xC5DA, 0x9E71, 0xC5DB, 0x9E72, + 0xC5DC, 0x9E73, 0xC5DD, 0x9E74, 0xC5DE, 0x9E75, 0xC5DF, 0x9E76, + 0xC5E0, 0xBFA5, 0xC5E1, 0xBFA6, 0xC5E2, 0x9E77, 0xC5E3, 0xBFA7, + 0xC5E4, 0x9E78, 0xC5E5, 0xBFA8, 0xC5E6, 0x9E79, 0xC5E7, 0x9E7A, + 0xC5E8, 0x9E81, 0xC5E9, 0x9E82, 0xC5EA, 0x9E83, 0xC5EB, 0x9E84, + 0xC5EC, 0xBFA9, 0xC5ED, 0xBFAA, 0xC5EE, 0xBFAB, 0xC5EF, 0x9E85, + 0xC5F0, 0xBFAC, 0xC5F1, 0x9E86, 0xC5F2, 0x9E87, 0xC5F3, 0x9E88, + 0xC5F4, 0xBFAD, 0xC5F5, 0x9E89, 0xC5F6, 0xBFAE, 0xC5F7, 0xBFAF, + 0xC5F8, 0x9E8A, 0xC5F9, 0x9E8B, 0xC5FA, 0x9E8C, 0xC5FB, 0x9E8D, + 0xC5FC, 0xBFB0, 0xC5FD, 0xBFB1, 0xC5FE, 0xBFB2, 0xC5FF, 0xBFB3, + 0xC600, 0xBFB4, 0xC601, 0xBFB5, 0xC602, 0x9E8E, 0xC603, 0x9E8F, + 0xC604, 0x9E90, 0xC605, 0xBFB6, 0xC606, 0xBFB7, 0xC607, 0xBFB8, + 0xC608, 0xBFB9, 0xC609, 0x9E91, 0xC60A, 0x9E92, 0xC60B, 0x9E93, + 0xC60C, 0xBFBA, 0xC60D, 0x9E94, 0xC60E, 0x9E95, 0xC60F, 0x9E96, + 0xC610, 0xBFBB, 0xC611, 0x9E97, 0xC612, 0x9E98, 0xC613, 0x9E99, + 0xC614, 0x9E9A, 0xC615, 0x9E9B, 0xC616, 0x9E9C, 0xC617, 0x9E9D, + 0xC618, 0xBFBC, 0xC619, 0xBFBD, 0xC61A, 0x9E9E, 0xC61B, 0xBFBE, + 0xC61C, 0xBFBF, 0xC61D, 0x9E9F, 0xC61E, 0x9EA0, 0xC61F, 0x9EA1, + 0xC620, 0x9EA2, 0xC621, 0x9EA3, 0xC622, 0x9EA4, 0xC623, 0x9EA5, + 0xC624, 0xBFC0, 0xC625, 0xBFC1, 0xC626, 0x9EA6, 0xC627, 0x9EA7, + 0xC628, 0xBFC2, 0xC629, 0x9EA8, 0xC62A, 0x9EA9, 0xC62B, 0x9EAA, + 0xC62C, 0xBFC3, 0xC62D, 0xBFC4, 0xC62E, 0xBFC5, 0xC62F, 0x9EAB, + 0xC630, 0xBFC6, 0xC631, 0x9EAC, 0xC632, 0x9EAD, 0xC633, 0xBFC7, + 0xC634, 0xBFC8, 0xC635, 0xBFC9, 0xC636, 0x9EAE, 0xC637, 0xBFCA, + 0xC638, 0x9EAF, 0xC639, 0xBFCB, 0xC63A, 0x9EB0, 0xC63B, 0xBFCC, + 0xC63C, 0x9EB1, 0xC63D, 0x9EB2, 0xC63E, 0x9EB3, 0xC63F, 0x9EB4, + 0xC640, 0xBFCD, 0xC641, 0xBFCE, 0xC642, 0x9EB5, 0xC643, 0x9EB6, + 0xC644, 0xBFCF, 0xC645, 0x9EB7, 0xC646, 0x9EB8, 0xC647, 0x9EB9, + 0xC648, 0xBFD0, 0xC649, 0x9EBA, 0xC64A, 0x9EBB, 0xC64B, 0x9EBC, + 0xC64C, 0x9EBD, 0xC64D, 0x9EBE, 0xC64E, 0x9EBF, 0xC64F, 0x9EC0, + 0xC650, 0xBFD1, 0xC651, 0xBFD2, 0xC652, 0x9EC1, 0xC653, 0xBFD3, + 0xC654, 0xBFD4, 0xC655, 0xBFD5, 0xC656, 0x9EC2, 0xC657, 0x9EC3, + 0xC658, 0x9EC4, 0xC659, 0x9EC5, 0xC65A, 0x9EC6, 0xC65B, 0x9EC7, + 0xC65C, 0xBFD6, 0xC65D, 0xBFD7, 0xC65E, 0x9EC8, 0xC65F, 0x9EC9, + 0xC660, 0xBFD8, 0xC661, 0x9ECA, 0xC662, 0x9ECB, 0xC663, 0x9ECC, + 0xC664, 0x9ECD, 0xC665, 0x9ECE, 0xC666, 0x9ECF, 0xC667, 0x9ED0, + 0xC668, 0x9ED1, 0xC669, 0x9ED2, 0xC66A, 0x9ED3, 0xC66B, 0x9ED4, + 0xC66C, 0xBFD9, 0xC66D, 0x9ED5, 0xC66E, 0x9ED6, 0xC66F, 0xBFDA, + 0xC670, 0x9ED7, 0xC671, 0xBFDB, 0xC672, 0x9ED8, 0xC673, 0x9ED9, + 0xC674, 0x9EDA, 0xC675, 0x9EDB, 0xC676, 0x9EDC, 0xC677, 0x9EDD, + 0xC678, 0xBFDC, 0xC679, 0xBFDD, 0xC67A, 0x9EDE, 0xC67B, 0x9EDF, + 0xC67C, 0xBFDE, 0xC67D, 0x9EE0, 0xC67E, 0x9EE1, 0xC67F, 0x9EE2, + 0xC680, 0xBFDF, 0xC681, 0x9EE3, 0xC682, 0x9EE4, 0xC683, 0x9EE5, + 0xC684, 0x9EE6, 0xC685, 0x9EE7, 0xC686, 0x9EE8, 0xC687, 0x9EE9, + 0xC688, 0xBFE0, 0xC689, 0xBFE1, 0xC68A, 0x9EEA, 0xC68B, 0xBFE2, + 0xC68C, 0x9EEB, 0xC68D, 0xBFE3, 0xC68E, 0x9EEC, 0xC68F, 0x9EED, + 0xC690, 0x9EEE, 0xC691, 0x9EEF, 0xC692, 0x9EF0, 0xC693, 0x9EF1, + 0xC694, 0xBFE4, 0xC695, 0xBFE5, 0xC696, 0x9EF2, 0xC697, 0x9EF3, + 0xC698, 0xBFE6, 0xC699, 0x9EF4, 0xC69A, 0x9EF5, 0xC69B, 0x9EF6, + 0xC69C, 0xBFE7, 0xC69D, 0x9EF7, 0xC69E, 0x9EF8, 0xC69F, 0x9EF9, + 0xC6A0, 0x9EFA, 0xC6A1, 0x9EFB, 0xC6A2, 0x9EFC, 0xC6A3, 0x9EFD, + 0xC6A4, 0xBFE8, 0xC6A5, 0xBFE9, 0xC6A6, 0x9EFE, 0xC6A7, 0xBFEA, + 0xC6A8, 0x9F41, 0xC6A9, 0xBFEB, 0xC6AA, 0x9F42, 0xC6AB, 0x9F43, + 0xC6AC, 0x9F44, 0xC6AD, 0x9F45, 0xC6AE, 0x9F46, 0xC6AF, 0x9F47, + 0xC6B0, 0xBFEC, 0xC6B1, 0xBFED, 0xC6B2, 0x9F48, 0xC6B3, 0x9F49, + 0xC6B4, 0xBFEE, 0xC6B5, 0x9F4A, 0xC6B6, 0x9F4B, 0xC6B7, 0x9F4C, + 0xC6B8, 0xBFEF, 0xC6B9, 0xBFF0, 0xC6BA, 0xBFF1, 0xC6BB, 0x9F4D, + 0xC6BC, 0x9F4E, 0xC6BD, 0x9F4F, 0xC6BE, 0x9F50, 0xC6BF, 0x9F51, + 0xC6C0, 0xBFF2, 0xC6C1, 0xBFF3, 0xC6C2, 0x9F52, 0xC6C3, 0xBFF4, + 0xC6C4, 0x9F53, 0xC6C5, 0xBFF5, 0xC6C6, 0x9F54, 0xC6C7, 0x9F55, + 0xC6C8, 0x9F56, 0xC6C9, 0x9F57, 0xC6CA, 0x9F58, 0xC6CB, 0x9F59, + 0xC6CC, 0xBFF6, 0xC6CD, 0xBFF7, 0xC6CE, 0x9F5A, 0xC6CF, 0x9F61, + 0xC6D0, 0xBFF8, 0xC6D1, 0x9F62, 0xC6D2, 0x9F63, 0xC6D3, 0x9F64, + 0xC6D4, 0xBFF9, 0xC6D5, 0x9F65, 0xC6D6, 0x9F66, 0xC6D7, 0x9F67, + 0xC6D8, 0x9F68, 0xC6D9, 0x9F69, 0xC6DA, 0x9F6A, 0xC6DB, 0x9F6B, + 0xC6DC, 0xBFFA, 0xC6DD, 0xBFFB, 0xC6DE, 0x9F6C, 0xC6DF, 0x9F6D, + 0xC6E0, 0xBFFC, 0xC6E1, 0xBFFD, 0xC6E2, 0x9F6E, 0xC6E3, 0x9F6F, + 0xC6E4, 0x9F70, 0xC6E5, 0x9F71, 0xC6E6, 0x9F72, 0xC6E7, 0x9F73, + 0xC6E8, 0xBFFE, 0xC6E9, 0xC0A1, 0xC6EA, 0x9F74, 0xC6EB, 0x9F75, + 0xC6EC, 0xC0A2, 0xC6ED, 0x9F76, 0xC6EE, 0x9F77, 0xC6EF, 0x9F78, + 0xC6F0, 0xC0A3, 0xC6F1, 0x9F79, 0xC6F2, 0x9F7A, 0xC6F3, 0x9F81, + 0xC6F4, 0x9F82, 0xC6F5, 0x9F83, 0xC6F6, 0x9F84, 0xC6F7, 0x9F85, + 0xC6F8, 0xC0A4, 0xC6F9, 0xC0A5, 0xC6FA, 0x9F86, 0xC6FB, 0x9F87, + 0xC6FC, 0x9F88, 0xC6FD, 0xC0A6, 0xC6FE, 0x9F89, 0xC6FF, 0x9F8A, + 0xC700, 0x9F8B, 0xC701, 0x9F8C, 0xC702, 0x9F8D, 0xC703, 0x9F8E, + 0xC704, 0xC0A7, 0xC705, 0xC0A8, 0xC706, 0x9F8F, 0xC707, 0x9F90, + 0xC708, 0xC0A9, 0xC709, 0x9F91, 0xC70A, 0x9F92, 0xC70B, 0x9F93, + 0xC70C, 0xC0AA, 0xC70D, 0x9F94, 0xC70E, 0x9F95, 0xC70F, 0x9F96, + 0xC710, 0x9F97, 0xC711, 0x9F98, 0xC712, 0x9F99, 0xC713, 0x9F9A, + 0xC714, 0xC0AB, 0xC715, 0xC0AC, 0xC716, 0x9F9B, 0xC717, 0xC0AD, + 0xC718, 0x9F9C, 0xC719, 0xC0AE, 0xC71A, 0x9F9D, 0xC71B, 0x9F9E, + 0xC71C, 0x9F9F, 0xC71D, 0x9FA0, 0xC71E, 0x9FA1, 0xC71F, 0x9FA2, + 0xC720, 0xC0AF, 0xC721, 0xC0B0, 0xC722, 0x9FA3, 0xC723, 0x9FA4, + 0xC724, 0xC0B1, 0xC725, 0x9FA5, 0xC726, 0x9FA6, 0xC727, 0x9FA7, + 0xC728, 0xC0B2, 0xC729, 0x9FA8, 0xC72A, 0x9FA9, 0xC72B, 0x9FAA, + 0xC72C, 0x9FAB, 0xC72D, 0x9FAC, 0xC72E, 0x9FAD, 0xC72F, 0x9FAE, + 0xC730, 0xC0B3, 0xC731, 0xC0B4, 0xC732, 0x9FAF, 0xC733, 0xC0B5, + 0xC734, 0x9FB0, 0xC735, 0xC0B6, 0xC736, 0x9FB1, 0xC737, 0xC0B7, + 0xC738, 0x9FB2, 0xC739, 0x9FB3, 0xC73A, 0x9FB4, 0xC73B, 0x9FB5, + 0xC73C, 0xC0B8, 0xC73D, 0xC0B9, 0xC73E, 0x9FB6, 0xC73F, 0x9FB7, + 0xC740, 0xC0BA, 0xC741, 0x9FB8, 0xC742, 0x9FB9, 0xC743, 0x9FBA, + 0xC744, 0xC0BB, 0xC745, 0x9FBB, 0xC746, 0x9FBC, 0xC747, 0x9FBD, + 0xC748, 0x9FBE, 0xC749, 0x9FBF, 0xC74A, 0xC0BC, 0xC74B, 0x9FC0, + 0xC74C, 0xC0BD, 0xC74D, 0xC0BE, 0xC74E, 0x9FC1, 0xC74F, 0xC0BF, + 0xC750, 0x9FC2, 0xC751, 0xC0C0, 0xC752, 0xC0C1, 0xC753, 0xC0C2, + 0xC754, 0xC0C3, 0xC755, 0xC0C4, 0xC756, 0xC0C5, 0xC757, 0xC0C6, + 0xC758, 0xC0C7, 0xC759, 0x9FC3, 0xC75A, 0x9FC4, 0xC75B, 0x9FC5, + 0xC75C, 0xC0C8, 0xC75D, 0x9FC6, 0xC75E, 0x9FC7, 0xC75F, 0x9FC8, + 0xC760, 0xC0C9, 0xC761, 0x9FC9, 0xC762, 0x9FCA, 0xC763, 0x9FCB, + 0xC764, 0x9FCC, 0xC765, 0x9FCD, 0xC766, 0x9FCE, 0xC767, 0x9FCF, + 0xC768, 0xC0CA, 0xC769, 0x9FD0, 0xC76A, 0x9FD1, 0xC76B, 0xC0CB, + 0xC76C, 0x9FD2, 0xC76D, 0x9FD3, 0xC76E, 0x9FD4, 0xC76F, 0x9FD5, + 0xC770, 0x9FD6, 0xC771, 0x9FD7, 0xC772, 0x9FD8, 0xC773, 0x9FD9, + 0xC774, 0xC0CC, 0xC775, 0xC0CD, 0xC776, 0x9FDA, 0xC777, 0x9FDB, + 0xC778, 0xC0CE, 0xC779, 0x9FDC, 0xC77A, 0x9FDD, 0xC77B, 0x9FDE, + 0xC77C, 0xC0CF, 0xC77D, 0xC0D0, 0xC77E, 0xC0D1, 0xC77F, 0x9FDF, + 0xC780, 0x9FE0, 0xC781, 0x9FE1, 0xC782, 0x9FE2, 0xC783, 0xC0D2, + 0xC784, 0xC0D3, 0xC785, 0xC0D4, 0xC786, 0x9FE3, 0xC787, 0xC0D5, + 0xC788, 0xC0D6, 0xC789, 0xC0D7, 0xC78A, 0xC0D8, 0xC78B, 0x9FE4, + 0xC78C, 0x9FE5, 0xC78D, 0x9FE6, 0xC78E, 0xC0D9, 0xC78F, 0x9FE7, + 0xC790, 0xC0DA, 0xC791, 0xC0DB, 0xC792, 0x9FE8, 0xC793, 0x9FE9, + 0xC794, 0xC0DC, 0xC795, 0x9FEA, 0xC796, 0xC0DD, 0xC797, 0xC0DE, + 0xC798, 0xC0DF, 0xC799, 0x9FEB, 0xC79A, 0xC0E0, 0xC79B, 0x9FEC, + 0xC79C, 0x9FED, 0xC79D, 0x9FEE, 0xC79E, 0x9FEF, 0xC79F, 0x9FF0, + 0xC7A0, 0xC0E1, 0xC7A1, 0xC0E2, 0xC7A2, 0x9FF1, 0xC7A3, 0xC0E3, + 0xC7A4, 0xC0E4, 0xC7A5, 0xC0E5, 0xC7A6, 0xC0E6, 0xC7A7, 0x9FF2, + 0xC7A8, 0x9FF3, 0xC7A9, 0x9FF4, 0xC7AA, 0x9FF5, 0xC7AB, 0x9FF6, + 0xC7AC, 0xC0E7, 0xC7AD, 0xC0E8, 0xC7AE, 0x9FF7, 0xC7AF, 0x9FF8, + 0xC7B0, 0xC0E9, 0xC7B1, 0x9FF9, 0xC7B2, 0x9FFA, 0xC7B3, 0x9FFB, + 0xC7B4, 0xC0EA, 0xC7B5, 0x9FFC, 0xC7B6, 0x9FFD, 0xC7B7, 0x9FFE, + 0xC7B8, 0xA041, 0xC7B9, 0xA042, 0xC7BA, 0xA043, 0xC7BB, 0xA044, + 0xC7BC, 0xC0EB, 0xC7BD, 0xC0EC, 0xC7BE, 0xA045, 0xC7BF, 0xC0ED, + 0xC7C0, 0xC0EE, 0xC7C1, 0xC0EF, 0xC7C2, 0xA046, 0xC7C3, 0xA047, + 0xC7C4, 0xA048, 0xC7C5, 0xA049, 0xC7C6, 0xA04A, 0xC7C7, 0xA04B, + 0xC7C8, 0xC0F0, 0xC7C9, 0xC0F1, 0xC7CA, 0xA04C, 0xC7CB, 0xA04D, + 0xC7CC, 0xC0F2, 0xC7CD, 0xA04E, 0xC7CE, 0xC0F3, 0xC7CF, 0xA04F, + 0xC7D0, 0xC0F4, 0xC7D1, 0xA050, 0xC7D2, 0xA051, 0xC7D3, 0xA052, + 0xC7D4, 0xA053, 0xC7D5, 0xA054, 0xC7D6, 0xA055, 0xC7D7, 0xA056, + 0xC7D8, 0xC0F5, 0xC7D9, 0xA057, 0xC7DA, 0xA058, 0xC7DB, 0xA059, + 0xC7DC, 0xA05A, 0xC7DD, 0xC0F6, 0xC7DE, 0xA061, 0xC7DF, 0xA062, + 0xC7E0, 0xA063, 0xC7E1, 0xA064, 0xC7E2, 0xA065, 0xC7E3, 0xA066, + 0xC7E4, 0xC0F7, 0xC7E5, 0xA067, 0xC7E6, 0xA068, 0xC7E7, 0xA069, + 0xC7E8, 0xC0F8, 0xC7E9, 0xA06A, 0xC7EA, 0xA06B, 0xC7EB, 0xA06C, + 0xC7EC, 0xC0F9, 0xC7ED, 0xA06D, 0xC7EE, 0xA06E, 0xC7EF, 0xA06F, + 0xC7F0, 0xA070, 0xC7F1, 0xA071, 0xC7F2, 0xA072, 0xC7F3, 0xA073, + 0xC7F4, 0xA074, 0xC7F5, 0xA075, 0xC7F6, 0xA076, 0xC7F7, 0xA077, + 0xC7F8, 0xA078, 0xC7F9, 0xA079, 0xC7FA, 0xA07A, 0xC7FB, 0xA081, + 0xC7FC, 0xA082, 0xC7FD, 0xA083, 0xC7FE, 0xA084, 0xC7FF, 0xA085, + 0xC800, 0xC0FA, 0xC801, 0xC0FB, 0xC802, 0xA086, 0xC803, 0xA087, + 0xC804, 0xC0FC, 0xC805, 0xA088, 0xC806, 0xA089, 0xC807, 0xA08A, + 0xC808, 0xC0FD, 0xC809, 0xA08B, 0xC80A, 0xC0FE, 0xC80B, 0xA08C, + 0xC80C, 0xA08D, 0xC80D, 0xA08E, 0xC80E, 0xA08F, 0xC80F, 0xA090, + 0xC810, 0xC1A1, 0xC811, 0xC1A2, 0xC812, 0xA091, 0xC813, 0xC1A3, + 0xC814, 0xA092, 0xC815, 0xC1A4, 0xC816, 0xC1A5, 0xC817, 0xA093, + 0xC818, 0xA094, 0xC819, 0xA095, 0xC81A, 0xA096, 0xC81B, 0xA097, + 0xC81C, 0xC1A6, 0xC81D, 0xC1A7, 0xC81E, 0xA098, 0xC81F, 0xA099, + 0xC820, 0xC1A8, 0xC821, 0xA09A, 0xC822, 0xA09B, 0xC823, 0xA09C, + 0xC824, 0xC1A9, 0xC825, 0xA09D, 0xC826, 0xA09E, 0xC827, 0xA09F, + 0xC828, 0xA0A0, 0xC829, 0xA0A1, 0xC82A, 0xA0A2, 0xC82B, 0xA0A3, + 0xC82C, 0xC1AA, 0xC82D, 0xC1AB, 0xC82E, 0xA0A4, 0xC82F, 0xC1AC, + 0xC830, 0xA0A5, 0xC831, 0xC1AD, 0xC832, 0xA0A6, 0xC833, 0xA0A7, + 0xC834, 0xA0A8, 0xC835, 0xA0A9, 0xC836, 0xA0AA, 0xC837, 0xA0AB, + 0xC838, 0xC1AE, 0xC839, 0xA0AC, 0xC83A, 0xA0AD, 0xC83B, 0xA0AE, + 0xC83C, 0xC1AF, 0xC83D, 0xA0AF, 0xC83E, 0xA0B0, 0xC83F, 0xA0B1, + 0xC840, 0xC1B0, 0xC841, 0xA0B2, 0xC842, 0xA0B3, 0xC843, 0xA0B4, + 0xC844, 0xA0B5, 0xC845, 0xA0B6, 0xC846, 0xA0B7, 0xC847, 0xA0B8, + 0xC848, 0xC1B1, 0xC849, 0xC1B2, 0xC84A, 0xA0B9, 0xC84B, 0xA0BA, + 0xC84C, 0xC1B3, 0xC84D, 0xC1B4, 0xC84E, 0xA0BB, 0xC84F, 0xA0BC, + 0xC850, 0xA0BD, 0xC851, 0xA0BE, 0xC852, 0xA0BF, 0xC853, 0xA0C0, + 0xC854, 0xC1B5, 0xC855, 0xA0C1, 0xC856, 0xA0C2, 0xC857, 0xA0C3, + 0xC858, 0xA0C4, 0xC859, 0xA0C5, 0xC85A, 0xA0C6, 0xC85B, 0xA0C7, + 0xC85C, 0xA0C8, 0xC85D, 0xA0C9, 0xC85E, 0xA0CA, 0xC85F, 0xA0CB, + 0xC860, 0xA0CC, 0xC861, 0xA0CD, 0xC862, 0xA0CE, 0xC863, 0xA0CF, + 0xC864, 0xA0D0, 0xC865, 0xA0D1, 0xC866, 0xA0D2, 0xC867, 0xA0D3, + 0xC868, 0xA0D4, 0xC869, 0xA0D5, 0xC86A, 0xA0D6, 0xC86B, 0xA0D7, + 0xC86C, 0xA0D8, 0xC86D, 0xA0D9, 0xC86E, 0xA0DA, 0xC86F, 0xA0DB, + 0xC870, 0xC1B6, 0xC871, 0xC1B7, 0xC872, 0xA0DC, 0xC873, 0xA0DD, + 0xC874, 0xC1B8, 0xC875, 0xA0DE, 0xC876, 0xA0DF, 0xC877, 0xA0E0, + 0xC878, 0xC1B9, 0xC879, 0xA0E1, 0xC87A, 0xC1BA, 0xC87B, 0xA0E2, + 0xC87C, 0xA0E3, 0xC87D, 0xA0E4, 0xC87E, 0xA0E5, 0xC87F, 0xA0E6, + 0xC880, 0xC1BB, 0xC881, 0xC1BC, 0xC882, 0xA0E7, 0xC883, 0xC1BD, + 0xC884, 0xA0E8, 0xC885, 0xC1BE, 0xC886, 0xC1BF, 0xC887, 0xC1C0, + 0xC888, 0xA0E9, 0xC889, 0xA0EA, 0xC88A, 0xA0EB, 0xC88B, 0xC1C1, + 0xC88C, 0xC1C2, 0xC88D, 0xC1C3, 0xC88E, 0xA0EC, 0xC88F, 0xA0ED, + 0xC890, 0xA0EE, 0xC891, 0xA0EF, 0xC892, 0xA0F0, 0xC893, 0xA0F1, + 0xC894, 0xC1C4, 0xC895, 0xA0F2, 0xC896, 0xA0F3, 0xC897, 0xA0F4, + 0xC898, 0xA0F5, 0xC899, 0xA0F6, 0xC89A, 0xA0F7, 0xC89B, 0xA0F8, + 0xC89C, 0xA0F9, 0xC89D, 0xC1C5, 0xC89E, 0xA0FA, 0xC89F, 0xC1C6, + 0xC8A0, 0xA0FB, 0xC8A1, 0xC1C7, 0xC8A2, 0xA0FC, 0xC8A3, 0xA0FD, + 0xC8A4, 0xA0FE, 0xC8A5, 0xA141, 0xC8A6, 0xA142, 0xC8A7, 0xA143, + 0xC8A8, 0xC1C8, 0xC8A9, 0xA144, 0xC8AA, 0xA145, 0xC8AB, 0xA146, + 0xC8AC, 0xA147, 0xC8AD, 0xA148, 0xC8AE, 0xA149, 0xC8AF, 0xA14A, + 0xC8B0, 0xA14B, 0xC8B1, 0xA14C, 0xC8B2, 0xA14D, 0xC8B3, 0xA14E, + 0xC8B4, 0xA14F, 0xC8B5, 0xA150, 0xC8B6, 0xA151, 0xC8B7, 0xA152, + 0xC8B8, 0xA153, 0xC8B9, 0xA154, 0xC8BA, 0xA155, 0xC8BB, 0xA156, + 0xC8BC, 0xC1C9, 0xC8BD, 0xC1CA, 0xC8BE, 0xA157, 0xC8BF, 0xA158, + 0xC8C0, 0xA159, 0xC8C1, 0xA15A, 0xC8C2, 0xA161, 0xC8C3, 0xA162, + 0xC8C4, 0xC1CB, 0xC8C5, 0xA163, 0xC8C6, 0xA164, 0xC8C7, 0xA165, + 0xC8C8, 0xC1CC, 0xC8C9, 0xA166, 0xC8CA, 0xA167, 0xC8CB, 0xA168, + 0xC8CC, 0xC1CD, 0xC8CD, 0xA169, 0xC8CE, 0xA16A, 0xC8CF, 0xA16B, + 0xC8D0, 0xA16C, 0xC8D1, 0xA16D, 0xC8D2, 0xA16E, 0xC8D3, 0xA16F, + 0xC8D4, 0xC1CE, 0xC8D5, 0xC1CF, 0xC8D6, 0xA170, 0xC8D7, 0xC1D0, + 0xC8D8, 0xA171, 0xC8D9, 0xC1D1, 0xC8DA, 0xA172, 0xC8DB, 0xA173, + 0xC8DC, 0xA174, 0xC8DD, 0xA175, 0xC8DE, 0xA176, 0xC8DF, 0xA177, + 0xC8E0, 0xC1D2, 0xC8E1, 0xC1D3, 0xC8E2, 0xA178, 0xC8E3, 0xA179, + 0xC8E4, 0xC1D4, 0xC8E5, 0xA17A, 0xC8E6, 0xA181, 0xC8E7, 0xA182, + 0xC8E8, 0xA183, 0xC8E9, 0xA184, 0xC8EA, 0xA185, 0xC8EB, 0xA186, + 0xC8EC, 0xA187, 0xC8ED, 0xA188, 0xC8EE, 0xA189, 0xC8EF, 0xA18A, + 0xC8F0, 0xA18B, 0xC8F1, 0xA18C, 0xC8F2, 0xA18D, 0xC8F3, 0xA18E, + 0xC8F4, 0xA18F, 0xC8F5, 0xC1D5, 0xC8F6, 0xA190, 0xC8F7, 0xA191, + 0xC8F8, 0xA192, 0xC8F9, 0xA193, 0xC8FA, 0xA194, 0xC8FB, 0xA195, + 0xC8FC, 0xC1D6, 0xC8FD, 0xC1D7, 0xC8FE, 0xA196, 0xC8FF, 0xA197, + 0xC900, 0xC1D8, 0xC901, 0xA198, 0xC902, 0xA199, 0xC903, 0xA19A, + 0xC904, 0xC1D9, 0xC905, 0xC1DA, 0xC906, 0xC1DB, 0xC907, 0xA19B, + 0xC908, 0xA19C, 0xC909, 0xA19D, 0xC90A, 0xA19E, 0xC90B, 0xA19F, + 0xC90C, 0xC1DC, 0xC90D, 0xC1DD, 0xC90E, 0xA1A0, 0xC90F, 0xC1DE, + 0xC910, 0xA241, 0xC911, 0xC1DF, 0xC912, 0xA242, 0xC913, 0xA243, + 0xC914, 0xA244, 0xC915, 0xA245, 0xC916, 0xA246, 0xC917, 0xA247, + 0xC918, 0xC1E0, 0xC919, 0xA248, 0xC91A, 0xA249, 0xC91B, 0xA24A, + 0xC91C, 0xA24B, 0xC91D, 0xA24C, 0xC91E, 0xA24D, 0xC91F, 0xA24E, + 0xC920, 0xA24F, 0xC921, 0xA250, 0xC922, 0xA251, 0xC923, 0xA252, + 0xC924, 0xA253, 0xC925, 0xA254, 0xC926, 0xA255, 0xC927, 0xA256, + 0xC928, 0xA257, 0xC929, 0xA258, 0xC92A, 0xA259, 0xC92B, 0xA25A, + 0xC92C, 0xC1E1, 0xC92D, 0xA261, 0xC92E, 0xA262, 0xC92F, 0xA263, + 0xC930, 0xA264, 0xC931, 0xA265, 0xC932, 0xA266, 0xC933, 0xA267, + 0xC934, 0xC1E2, 0xC935, 0xA268, 0xC936, 0xA269, 0xC937, 0xA26A, + 0xC938, 0xA26B, 0xC939, 0xA26C, 0xC93A, 0xA26D, 0xC93B, 0xA26E, + 0xC93C, 0xA26F, 0xC93D, 0xA270, 0xC93E, 0xA271, 0xC93F, 0xA272, + 0xC940, 0xA273, 0xC941, 0xA274, 0xC942, 0xA275, 0xC943, 0xA276, + 0xC944, 0xA277, 0xC945, 0xA278, 0xC946, 0xA279, 0xC947, 0xA27A, + 0xC948, 0xA281, 0xC949, 0xA282, 0xC94A, 0xA283, 0xC94B, 0xA284, + 0xC94C, 0xA285, 0xC94D, 0xA286, 0xC94E, 0xA287, 0xC94F, 0xA288, + 0xC950, 0xC1E3, 0xC951, 0xC1E4, 0xC952, 0xA289, 0xC953, 0xA28A, + 0xC954, 0xC1E5, 0xC955, 0xA28B, 0xC956, 0xA28C, 0xC957, 0xA28D, + 0xC958, 0xC1E6, 0xC959, 0xA28E, 0xC95A, 0xA28F, 0xC95B, 0xA290, + 0xC95C, 0xA291, 0xC95D, 0xA292, 0xC95E, 0xA293, 0xC95F, 0xA294, + 0xC960, 0xC1E7, 0xC961, 0xC1E8, 0xC962, 0xA295, 0xC963, 0xC1E9, + 0xC964, 0xA296, 0xC965, 0xA297, 0xC966, 0xA298, 0xC967, 0xA299, + 0xC968, 0xA29A, 0xC969, 0xA29B, 0xC96A, 0xA29C, 0xC96B, 0xA29D, + 0xC96C, 0xC1EA, 0xC96D, 0xA29E, 0xC96E, 0xA29F, 0xC96F, 0xA2A0, + 0xC970, 0xC1EB, 0xC971, 0xA341, 0xC972, 0xA342, 0xC973, 0xA343, + 0xC974, 0xC1EC, 0xC975, 0xA344, 0xC976, 0xA345, 0xC977, 0xA346, + 0xC978, 0xA347, 0xC979, 0xA348, 0xC97A, 0xA349, 0xC97B, 0xA34A, + 0xC97C, 0xC1ED, 0xC97D, 0xA34B, 0xC97E, 0xA34C, 0xC97F, 0xA34D, + 0xC980, 0xA34E, 0xC981, 0xA34F, 0xC982, 0xA350, 0xC983, 0xA351, + 0xC984, 0xA352, 0xC985, 0xA353, 0xC986, 0xA354, 0xC987, 0xA355, + 0xC988, 0xC1EE, 0xC989, 0xC1EF, 0xC98A, 0xA356, 0xC98B, 0xA357, + 0xC98C, 0xC1F0, 0xC98D, 0xA358, 0xC98E, 0xA359, 0xC98F, 0xA35A, + 0xC990, 0xC1F1, 0xC991, 0xA361, 0xC992, 0xA362, 0xC993, 0xA363, + 0xC994, 0xA364, 0xC995, 0xA365, 0xC996, 0xA366, 0xC997, 0xA367, + 0xC998, 0xC1F2, 0xC999, 0xC1F3, 0xC99A, 0xA368, 0xC99B, 0xC1F4, + 0xC99C, 0xA369, 0xC99D, 0xC1F5, 0xC99E, 0xA36A, 0xC99F, 0xA36B, + 0xC9A0, 0xA36C, 0xC9A1, 0xA36D, 0xC9A2, 0xA36E, 0xC9A3, 0xA36F, + 0xC9A4, 0xA370, 0xC9A5, 0xA371, 0xC9A6, 0xA372, 0xC9A7, 0xA373, + 0xC9A8, 0xA374, 0xC9A9, 0xA375, 0xC9AA, 0xA376, 0xC9AB, 0xA377, + 0xC9AC, 0xA378, 0xC9AD, 0xA379, 0xC9AE, 0xA37A, 0xC9AF, 0xA381, + 0xC9B0, 0xA382, 0xC9B1, 0xA383, 0xC9B2, 0xA384, 0xC9B3, 0xA385, + 0xC9B4, 0xA386, 0xC9B5, 0xA387, 0xC9B6, 0xA388, 0xC9B7, 0xA389, + 0xC9B8, 0xA38A, 0xC9B9, 0xA38B, 0xC9BA, 0xA38C, 0xC9BB, 0xA38D, + 0xC9BC, 0xA38E, 0xC9BD, 0xA38F, 0xC9BE, 0xA390, 0xC9BF, 0xA391, + 0xC9C0, 0xC1F6, 0xC9C1, 0xC1F7, 0xC9C2, 0xA392, 0xC9C3, 0xA393, + 0xC9C4, 0xC1F8, 0xC9C5, 0xA394, 0xC9C6, 0xA395, 0xC9C7, 0xC1F9, + 0xC9C8, 0xC1FA, 0xC9C9, 0xA396, 0xC9CA, 0xC1FB, 0xC9CB, 0xA397, + 0xC9CC, 0xA398, 0xC9CD, 0xA399, 0xC9CE, 0xA39A, 0xC9CF, 0xA39B, + 0xC9D0, 0xC1FC, 0xC9D1, 0xC1FD, 0xC9D2, 0xA39C, 0xC9D3, 0xC1FE, + 0xC9D4, 0xA39D, 0xC9D5, 0xC2A1, 0xC9D6, 0xC2A2, 0xC9D7, 0xA39E, + 0xC9D8, 0xA39F, 0xC9D9, 0xC2A3, 0xC9DA, 0xC2A4, 0xC9DB, 0xA3A0, + 0xC9DC, 0xC2A5, 0xC9DD, 0xC2A6, 0xC9DE, 0xA441, 0xC9DF, 0xA442, + 0xC9E0, 0xC2A7, 0xC9E1, 0xA443, 0xC9E2, 0xC2A8, 0xC9E3, 0xA444, + 0xC9E4, 0xC2A9, 0xC9E5, 0xA445, 0xC9E6, 0xA446, 0xC9E7, 0xC2AA, + 0xC9E8, 0xA447, 0xC9E9, 0xA448, 0xC9EA, 0xA449, 0xC9EB, 0xA44A, + 0xC9EC, 0xC2AB, 0xC9ED, 0xC2AC, 0xC9EE, 0xA44B, 0xC9EF, 0xC2AD, + 0xC9F0, 0xC2AE, 0xC9F1, 0xC2AF, 0xC9F2, 0xA44C, 0xC9F3, 0xA44D, + 0xC9F4, 0xA44E, 0xC9F5, 0xA44F, 0xC9F6, 0xA450, 0xC9F7, 0xA451, + 0xC9F8, 0xC2B0, 0xC9F9, 0xC2B1, 0xC9FA, 0xA452, 0xC9FB, 0xA453, + 0xC9FC, 0xC2B2, 0xC9FD, 0xA454, 0xC9FE, 0xA455, 0xC9FF, 0xA456, + 0xCA00, 0xC2B3, 0xCA01, 0xA457, 0xCA02, 0xA458, 0xCA03, 0xA459, + 0xCA04, 0xA45A, 0xCA05, 0xA461, 0xCA06, 0xA462, 0xCA07, 0xA463, + 0xCA08, 0xC2B4, 0xCA09, 0xC2B5, 0xCA0A, 0xA464, 0xCA0B, 0xC2B6, + 0xCA0C, 0xC2B7, 0xCA0D, 0xC2B8, 0xCA0E, 0xA465, 0xCA0F, 0xA466, + 0xCA10, 0xA467, 0xCA11, 0xA468, 0xCA12, 0xA469, 0xCA13, 0xA46A, + 0xCA14, 0xC2B9, 0xCA15, 0xA46B, 0xCA16, 0xA46C, 0xCA17, 0xA46D, + 0xCA18, 0xC2BA, 0xCA19, 0xA46E, 0xCA1A, 0xA46F, 0xCA1B, 0xA470, + 0xCA1C, 0xA471, 0xCA1D, 0xA472, 0xCA1E, 0xA473, 0xCA1F, 0xA474, + 0xCA20, 0xA475, 0xCA21, 0xA476, 0xCA22, 0xA477, 0xCA23, 0xA478, + 0xCA24, 0xA479, 0xCA25, 0xA47A, 0xCA26, 0xA481, 0xCA27, 0xA482, + 0xCA28, 0xA483, 0xCA29, 0xC2BB, 0xCA2A, 0xA484, 0xCA2B, 0xA485, + 0xCA2C, 0xA486, 0xCA2D, 0xA487, 0xCA2E, 0xA488, 0xCA2F, 0xA489, + 0xCA30, 0xA48A, 0xCA31, 0xA48B, 0xCA32, 0xA48C, 0xCA33, 0xA48D, + 0xCA34, 0xA48E, 0xCA35, 0xA48F, 0xCA36, 0xA490, 0xCA37, 0xA491, + 0xCA38, 0xA492, 0xCA39, 0xA493, 0xCA3A, 0xA494, 0xCA3B, 0xA495, + 0xCA3C, 0xA496, 0xCA3D, 0xA497, 0xCA3E, 0xA498, 0xCA3F, 0xA499, + 0xCA40, 0xA49A, 0xCA41, 0xA49B, 0xCA42, 0xA49C, 0xCA43, 0xA49D, + 0xCA44, 0xA49E, 0xCA45, 0xA49F, 0xCA46, 0xA4A0, 0xCA47, 0xA541, + 0xCA48, 0xA542, 0xCA49, 0xA543, 0xCA4A, 0xA544, 0xCA4B, 0xA545, + 0xCA4C, 0xC2BC, 0xCA4D, 0xC2BD, 0xCA4E, 0xA546, 0xCA4F, 0xA547, + 0xCA50, 0xC2BE, 0xCA51, 0xA548, 0xCA52, 0xA549, 0xCA53, 0xA54A, + 0xCA54, 0xC2BF, 0xCA55, 0xA54B, 0xCA56, 0xA54C, 0xCA57, 0xA54D, + 0xCA58, 0xA54E, 0xCA59, 0xA54F, 0xCA5A, 0xA550, 0xCA5B, 0xA551, + 0xCA5C, 0xC2C0, 0xCA5D, 0xC2C1, 0xCA5E, 0xA552, 0xCA5F, 0xC2C2, + 0xCA60, 0xC2C3, 0xCA61, 0xC2C4, 0xCA62, 0xA553, 0xCA63, 0xA554, + 0xCA64, 0xA555, 0xCA65, 0xA556, 0xCA66, 0xA557, 0xCA67, 0xA558, + 0xCA68, 0xC2C5, 0xCA69, 0xA559, 0xCA6A, 0xA55A, 0xCA6B, 0xA561, + 0xCA6C, 0xA562, 0xCA6D, 0xA563, 0xCA6E, 0xA564, 0xCA6F, 0xA565, + 0xCA70, 0xA566, 0xCA71, 0xA567, 0xCA72, 0xA568, 0xCA73, 0xA569, + 0xCA74, 0xA56A, 0xCA75, 0xA56B, 0xCA76, 0xA56C, 0xCA77, 0xA56D, + 0xCA78, 0xA56E, 0xCA79, 0xA56F, 0xCA7A, 0xA570, 0xCA7B, 0xA571, + 0xCA7C, 0xA572, 0xCA7D, 0xC2C6, 0xCA7E, 0xA573, 0xCA7F, 0xA574, + 0xCA80, 0xA575, 0xCA81, 0xA576, 0xCA82, 0xA577, 0xCA83, 0xA578, + 0xCA84, 0xC2C7, 0xCA85, 0xA579, 0xCA86, 0xA57A, 0xCA87, 0xA581, + 0xCA88, 0xA582, 0xCA89, 0xA583, 0xCA8A, 0xA584, 0xCA8B, 0xA585, + 0xCA8C, 0xA586, 0xCA8D, 0xA587, 0xCA8E, 0xA588, 0xCA8F, 0xA589, + 0xCA90, 0xA58A, 0xCA91, 0xA58B, 0xCA92, 0xA58C, 0xCA93, 0xA58D, + 0xCA94, 0xA58E, 0xCA95, 0xA58F, 0xCA96, 0xA590, 0xCA97, 0xA591, + 0xCA98, 0xC2C8, 0xCA99, 0xA592, 0xCA9A, 0xA593, 0xCA9B, 0xA594, + 0xCA9C, 0xA595, 0xCA9D, 0xA596, 0xCA9E, 0xA597, 0xCA9F, 0xA598, + 0xCAA0, 0xA599, 0xCAA1, 0xA59A, 0xCAA2, 0xA59B, 0xCAA3, 0xA59C, + 0xCAA4, 0xA59D, 0xCAA5, 0xA59E, 0xCAA6, 0xA59F, 0xCAA7, 0xA5A0, + 0xCAA8, 0xA641, 0xCAA9, 0xA642, 0xCAAA, 0xA643, 0xCAAB, 0xA644, + 0xCAAC, 0xA645, 0xCAAD, 0xA646, 0xCAAE, 0xA647, 0xCAAF, 0xA648, + 0xCAB0, 0xA649, 0xCAB1, 0xA64A, 0xCAB2, 0xA64B, 0xCAB3, 0xA64C, + 0xCAB4, 0xA64D, 0xCAB5, 0xA64E, 0xCAB6, 0xA64F, 0xCAB7, 0xA650, + 0xCAB8, 0xA651, 0xCAB9, 0xA652, 0xCABA, 0xA653, 0xCABB, 0xA654, + 0xCABC, 0xC2C9, 0xCABD, 0xC2CA, 0xCABE, 0xA655, 0xCABF, 0xA656, + 0xCAC0, 0xC2CB, 0xCAC1, 0xA657, 0xCAC2, 0xA658, 0xCAC3, 0xA659, + 0xCAC4, 0xC2CC, 0xCAC5, 0xA65A, 0xCAC6, 0xA661, 0xCAC7, 0xA662, + 0xCAC8, 0xA663, 0xCAC9, 0xA664, 0xCACA, 0xA665, 0xCACB, 0xA666, + 0xCACC, 0xC2CD, 0xCACD, 0xC2CE, 0xCACE, 0xA667, 0xCACF, 0xC2CF, + 0xCAD0, 0xA668, 0xCAD1, 0xC2D0, 0xCAD2, 0xA669, 0xCAD3, 0xC2D1, + 0xCAD4, 0xA66A, 0xCAD5, 0xA66B, 0xCAD6, 0xA66C, 0xCAD7, 0xA66D, + 0xCAD8, 0xC2D2, 0xCAD9, 0xC2D3, 0xCADA, 0xA66E, 0xCADB, 0xA66F, + 0xCADC, 0xA670, 0xCADD, 0xA671, 0xCADE, 0xA672, 0xCADF, 0xA673, + 0xCAE0, 0xC2D4, 0xCAE1, 0xA674, 0xCAE2, 0xA675, 0xCAE3, 0xA676, + 0xCAE4, 0xA677, 0xCAE5, 0xA678, 0xCAE6, 0xA679, 0xCAE7, 0xA67A, + 0xCAE8, 0xA681, 0xCAE9, 0xA682, 0xCAEA, 0xA683, 0xCAEB, 0xA684, + 0xCAEC, 0xC2D5, 0xCAED, 0xA685, 0xCAEE, 0xA686, 0xCAEF, 0xA687, + 0xCAF0, 0xA688, 0xCAF1, 0xA689, 0xCAF2, 0xA68A, 0xCAF3, 0xA68B, + 0xCAF4, 0xC2D6, 0xCAF5, 0xA68C, 0xCAF6, 0xA68D, 0xCAF7, 0xA68E, + 0xCAF8, 0xA68F, 0xCAF9, 0xA690, 0xCAFA, 0xA691, 0xCAFB, 0xA692, + 0xCAFC, 0xA693, 0xCAFD, 0xA694, 0xCAFE, 0xA695, 0xCAFF, 0xA696, + 0xCB00, 0xA697, 0xCB01, 0xA698, 0xCB02, 0xA699, 0xCB03, 0xA69A, + 0xCB04, 0xA69B, 0xCB05, 0xA69C, 0xCB06, 0xA69D, 0xCB07, 0xA69E, + 0xCB08, 0xC2D7, 0xCB09, 0xA69F, 0xCB0A, 0xA6A0, 0xCB0B, 0xA741, + 0xCB0C, 0xA742, 0xCB0D, 0xA743, 0xCB0E, 0xA744, 0xCB0F, 0xA745, + 0xCB10, 0xC2D8, 0xCB11, 0xA746, 0xCB12, 0xA747, 0xCB13, 0xA748, + 0xCB14, 0xC2D9, 0xCB15, 0xA749, 0xCB16, 0xA74A, 0xCB17, 0xA74B, + 0xCB18, 0xC2DA, 0xCB19, 0xA74C, 0xCB1A, 0xA74D, 0xCB1B, 0xA74E, + 0xCB1C, 0xA74F, 0xCB1D, 0xA750, 0xCB1E, 0xA751, 0xCB1F, 0xA752, + 0xCB20, 0xC2DB, 0xCB21, 0xC2DC, 0xCB22, 0xA753, 0xCB23, 0xA754, + 0xCB24, 0xA755, 0xCB25, 0xA756, 0xCB26, 0xA757, 0xCB27, 0xA758, + 0xCB28, 0xA759, 0xCB29, 0xA75A, 0xCB2A, 0xA761, 0xCB2B, 0xA762, + 0xCB2C, 0xA763, 0xCB2D, 0xA764, 0xCB2E, 0xA765, 0xCB2F, 0xA766, + 0xCB30, 0xA767, 0xCB31, 0xA768, 0xCB32, 0xA769, 0xCB33, 0xA76A, + 0xCB34, 0xA76B, 0xCB35, 0xA76C, 0xCB36, 0xA76D, 0xCB37, 0xA76E, + 0xCB38, 0xA76F, 0xCB39, 0xA770, 0xCB3A, 0xA771, 0xCB3B, 0xA772, + 0xCB3C, 0xA773, 0xCB3D, 0xA774, 0xCB3E, 0xA775, 0xCB3F, 0xA776, + 0xCB40, 0xA777, 0xCB41, 0xC2DD, 0xCB42, 0xA778, 0xCB43, 0xA779, + 0xCB44, 0xA77A, 0xCB45, 0xA781, 0xCB46, 0xA782, 0xCB47, 0xA783, + 0xCB48, 0xC2DE, 0xCB49, 0xC2DF, 0xCB4A, 0xA784, 0xCB4B, 0xA785, + 0xCB4C, 0xC2E0, 0xCB4D, 0xA786, 0xCB4E, 0xA787, 0xCB4F, 0xA788, + 0xCB50, 0xC2E1, 0xCB51, 0xA789, 0xCB52, 0xA78A, 0xCB53, 0xA78B, + 0xCB54, 0xA78C, 0xCB55, 0xA78D, 0xCB56, 0xA78E, 0xCB57, 0xA78F, + 0xCB58, 0xC2E2, 0xCB59, 0xC2E3, 0xCB5A, 0xA790, 0xCB5B, 0xA791, + 0xCB5C, 0xA792, 0xCB5D, 0xC2E4, 0xCB5E, 0xA793, 0xCB5F, 0xA794, + 0xCB60, 0xA795, 0xCB61, 0xA796, 0xCB62, 0xA797, 0xCB63, 0xA798, + 0xCB64, 0xC2E5, 0xCB65, 0xA799, 0xCB66, 0xA79A, 0xCB67, 0xA79B, + 0xCB68, 0xA79C, 0xCB69, 0xA79D, 0xCB6A, 0xA79E, 0xCB6B, 0xA79F, + 0xCB6C, 0xA7A0, 0xCB6D, 0xA841, 0xCB6E, 0xA842, 0xCB6F, 0xA843, + 0xCB70, 0xA844, 0xCB71, 0xA845, 0xCB72, 0xA846, 0xCB73, 0xA847, + 0xCB74, 0xA848, 0xCB75, 0xA849, 0xCB76, 0xA84A, 0xCB77, 0xA84B, + 0xCB78, 0xC2E6, 0xCB79, 0xC2E7, 0xCB7A, 0xA84C, 0xCB7B, 0xA84D, + 0xCB7C, 0xA84E, 0xCB7D, 0xA84F, 0xCB7E, 0xA850, 0xCB7F, 0xA851, + 0xCB80, 0xA852, 0xCB81, 0xA853, 0xCB82, 0xA854, 0xCB83, 0xA855, + 0xCB84, 0xA856, 0xCB85, 0xA857, 0xCB86, 0xA858, 0xCB87, 0xA859, + 0xCB88, 0xA85A, 0xCB89, 0xA861, 0xCB8A, 0xA862, 0xCB8B, 0xA863, + 0xCB8C, 0xA864, 0xCB8D, 0xA865, 0xCB8E, 0xA866, 0xCB8F, 0xA867, + 0xCB90, 0xA868, 0xCB91, 0xA869, 0xCB92, 0xA86A, 0xCB93, 0xA86B, + 0xCB94, 0xA86C, 0xCB95, 0xA86D, 0xCB96, 0xA86E, 0xCB97, 0xA86F, + 0xCB98, 0xA870, 0xCB99, 0xA871, 0xCB9A, 0xA872, 0xCB9B, 0xA873, + 0xCB9C, 0xC2E8, 0xCB9D, 0xA874, 0xCB9E, 0xA875, 0xCB9F, 0xA876, + 0xCBA0, 0xA877, 0xCBA1, 0xA878, 0xCBA2, 0xA879, 0xCBA3, 0xA87A, + 0xCBA4, 0xA881, 0xCBA5, 0xA882, 0xCBA6, 0xA883, 0xCBA7, 0xA884, + 0xCBA8, 0xA885, 0xCBA9, 0xA886, 0xCBAA, 0xA887, 0xCBAB, 0xA888, + 0xCBAC, 0xA889, 0xCBAD, 0xA88A, 0xCBAE, 0xA88B, 0xCBAF, 0xA88C, + 0xCBB0, 0xA88D, 0xCBB1, 0xA88E, 0xCBB2, 0xA88F, 0xCBB3, 0xA890, + 0xCBB4, 0xA891, 0xCBB5, 0xA892, 0xCBB6, 0xA893, 0xCBB7, 0xA894, + 0xCBB8, 0xC2E9, 0xCBB9, 0xA895, 0xCBBA, 0xA896, 0xCBBB, 0xA897, + 0xCBBC, 0xA898, 0xCBBD, 0xA899, 0xCBBE, 0xA89A, 0xCBBF, 0xA89B, + 0xCBC0, 0xA89C, 0xCBC1, 0xA89D, 0xCBC2, 0xA89E, 0xCBC3, 0xA89F, + 0xCBC4, 0xA8A0, 0xCBC5, 0xA941, 0xCBC6, 0xA942, 0xCBC7, 0xA943, + 0xCBC8, 0xA944, 0xCBC9, 0xA945, 0xCBCA, 0xA946, 0xCBCB, 0xA947, + 0xCBCC, 0xA948, 0xCBCD, 0xA949, 0xCBCE, 0xA94A, 0xCBCF, 0xA94B, + 0xCBD0, 0xA94C, 0xCBD1, 0xA94D, 0xCBD2, 0xA94E, 0xCBD3, 0xA94F, + 0xCBD4, 0xC2EA, 0xCBD5, 0xA950, 0xCBD6, 0xA951, 0xCBD7, 0xA952, + 0xCBD8, 0xA953, 0xCBD9, 0xA954, 0xCBDA, 0xA955, 0xCBDB, 0xA956, + 0xCBDC, 0xA957, 0xCBDD, 0xA958, 0xCBDE, 0xA959, 0xCBDF, 0xA95A, + 0xCBE0, 0xA961, 0xCBE1, 0xA962, 0xCBE2, 0xA963, 0xCBE3, 0xA964, + 0xCBE4, 0xC2EB, 0xCBE5, 0xA965, 0xCBE6, 0xA966, 0xCBE7, 0xC2EC, + 0xCBE8, 0xA967, 0xCBE9, 0xC2ED, 0xCBEA, 0xA968, 0xCBEB, 0xA969, + 0xCBEC, 0xA96A, 0xCBED, 0xA96B, 0xCBEE, 0xA96C, 0xCBEF, 0xA96D, + 0xCBF0, 0xA96E, 0xCBF1, 0xA96F, 0xCBF2, 0xA970, 0xCBF3, 0xA971, + 0xCBF4, 0xA972, 0xCBF5, 0xA973, 0xCBF6, 0xA974, 0xCBF7, 0xA975, + 0xCBF8, 0xA976, 0xCBF9, 0xA977, 0xCBFA, 0xA978, 0xCBFB, 0xA979, + 0xCBFC, 0xA97A, 0xCBFD, 0xA981, 0xCBFE, 0xA982, 0xCBFF, 0xA983, + 0xCC00, 0xA984, 0xCC01, 0xA985, 0xCC02, 0xA986, 0xCC03, 0xA987, + 0xCC04, 0xA988, 0xCC05, 0xA989, 0xCC06, 0xA98A, 0xCC07, 0xA98B, + 0xCC08, 0xA98C, 0xCC09, 0xA98D, 0xCC0A, 0xA98E, 0xCC0B, 0xA98F, + 0xCC0C, 0xC2EE, 0xCC0D, 0xC2EF, 0xCC0E, 0xA990, 0xCC0F, 0xA991, + 0xCC10, 0xC2F0, 0xCC11, 0xA992, 0xCC12, 0xA993, 0xCC13, 0xA994, + 0xCC14, 0xC2F1, 0xCC15, 0xA995, 0xCC16, 0xA996, 0xCC17, 0xA997, + 0xCC18, 0xA998, 0xCC19, 0xA999, 0xCC1A, 0xA99A, 0xCC1B, 0xA99B, + 0xCC1C, 0xC2F2, 0xCC1D, 0xC2F3, 0xCC1E, 0xA99C, 0xCC1F, 0xA99D, + 0xCC20, 0xA99E, 0xCC21, 0xC2F4, 0xCC22, 0xC2F5, 0xCC23, 0xA99F, + 0xCC24, 0xA9A0, 0xCC25, 0xAA41, 0xCC26, 0xAA42, 0xCC27, 0xC2F6, + 0xCC28, 0xC2F7, 0xCC29, 0xC2F8, 0xCC2A, 0xAA43, 0xCC2B, 0xAA44, + 0xCC2C, 0xC2F9, 0xCC2D, 0xAA45, 0xCC2E, 0xC2FA, 0xCC2F, 0xAA46, + 0xCC30, 0xC2FB, 0xCC31, 0xAA47, 0xCC32, 0xAA48, 0xCC33, 0xAA49, + 0xCC34, 0xAA4A, 0xCC35, 0xAA4B, 0xCC36, 0xAA4C, 0xCC37, 0xAA4D, + 0xCC38, 0xC2FC, 0xCC39, 0xC2FD, 0xCC3A, 0xAA4E, 0xCC3B, 0xC2FE, + 0xCC3C, 0xC3A1, 0xCC3D, 0xC3A2, 0xCC3E, 0xC3A3, 0xCC3F, 0xAA4F, + 0xCC40, 0xAA50, 0xCC41, 0xAA51, 0xCC42, 0xAA52, 0xCC43, 0xAA53, + 0xCC44, 0xC3A4, 0xCC45, 0xC3A5, 0xCC46, 0xAA54, 0xCC47, 0xAA55, + 0xCC48, 0xC3A6, 0xCC49, 0xAA56, 0xCC4A, 0xAA57, 0xCC4B, 0xAA58, + 0xCC4C, 0xC3A7, 0xCC4D, 0xAA59, 0xCC4E, 0xAA5A, 0xCC4F, 0xAA61, + 0xCC50, 0xAA62, 0xCC51, 0xAA63, 0xCC52, 0xAA64, 0xCC53, 0xAA65, + 0xCC54, 0xC3A8, 0xCC55, 0xC3A9, 0xCC56, 0xAA66, 0xCC57, 0xC3AA, + 0xCC58, 0xC3AB, 0xCC59, 0xC3AC, 0xCC5A, 0xAA67, 0xCC5B, 0xAA68, + 0xCC5C, 0xAA69, 0xCC5D, 0xAA6A, 0xCC5E, 0xAA6B, 0xCC5F, 0xAA6C, + 0xCC60, 0xC3AD, 0xCC61, 0xAA6D, 0xCC62, 0xAA6E, 0xCC63, 0xAA6F, + 0xCC64, 0xC3AE, 0xCC65, 0xAA70, 0xCC66, 0xC3AF, 0xCC67, 0xAA71, + 0xCC68, 0xC3B0, 0xCC69, 0xAA72, 0xCC6A, 0xAA73, 0xCC6B, 0xAA74, + 0xCC6C, 0xAA75, 0xCC6D, 0xAA76, 0xCC6E, 0xAA77, 0xCC6F, 0xAA78, + 0xCC70, 0xC3B1, 0xCC71, 0xAA79, 0xCC72, 0xAA7A, 0xCC73, 0xAA81, + 0xCC74, 0xAA82, 0xCC75, 0xC3B2, 0xCC76, 0xAA83, 0xCC77, 0xAA84, + 0xCC78, 0xAA85, 0xCC79, 0xAA86, 0xCC7A, 0xAA87, 0xCC7B, 0xAA88, + 0xCC7C, 0xAA89, 0xCC7D, 0xAA8A, 0xCC7E, 0xAA8B, 0xCC7F, 0xAA8C, + 0xCC80, 0xAA8D, 0xCC81, 0xAA8E, 0xCC82, 0xAA8F, 0xCC83, 0xAA90, + 0xCC84, 0xAA91, 0xCC85, 0xAA92, 0xCC86, 0xAA93, 0xCC87, 0xAA94, + 0xCC88, 0xAA95, 0xCC89, 0xAA96, 0xCC8A, 0xAA97, 0xCC8B, 0xAA98, + 0xCC8C, 0xAA99, 0xCC8D, 0xAA9A, 0xCC8E, 0xAA9B, 0xCC8F, 0xAA9C, + 0xCC90, 0xAA9D, 0xCC91, 0xAA9E, 0xCC92, 0xAA9F, 0xCC93, 0xAAA0, + 0xCC94, 0xAB41, 0xCC95, 0xAB42, 0xCC96, 0xAB43, 0xCC97, 0xAB44, + 0xCC98, 0xC3B3, 0xCC99, 0xC3B4, 0xCC9A, 0xAB45, 0xCC9B, 0xAB46, + 0xCC9C, 0xC3B5, 0xCC9D, 0xAB47, 0xCC9E, 0xAB48, 0xCC9F, 0xAB49, + 0xCCA0, 0xC3B6, 0xCCA1, 0xAB4A, 0xCCA2, 0xAB4B, 0xCCA3, 0xAB4C, + 0xCCA4, 0xAB4D, 0xCCA5, 0xAB4E, 0xCCA6, 0xAB4F, 0xCCA7, 0xAB50, + 0xCCA8, 0xC3B7, 0xCCA9, 0xC3B8, 0xCCAA, 0xAB51, 0xCCAB, 0xC3B9, + 0xCCAC, 0xC3BA, 0xCCAD, 0xC3BB, 0xCCAE, 0xAB52, 0xCCAF, 0xAB53, + 0xCCB0, 0xAB54, 0xCCB1, 0xAB55, 0xCCB2, 0xAB56, 0xCCB3, 0xAB57, + 0xCCB4, 0xC3BC, 0xCCB5, 0xC3BD, 0xCCB6, 0xAB58, 0xCCB7, 0xAB59, + 0xCCB8, 0xC3BE, 0xCCB9, 0xAB5A, 0xCCBA, 0xAB61, 0xCCBB, 0xAB62, + 0xCCBC, 0xC3BF, 0xCCBD, 0xAB63, 0xCCBE, 0xAB64, 0xCCBF, 0xAB65, + 0xCCC0, 0xAB66, 0xCCC1, 0xAB67, 0xCCC2, 0xAB68, 0xCCC3, 0xAB69, + 0xCCC4, 0xC3C0, 0xCCC5, 0xC3C1, 0xCCC6, 0xAB6A, 0xCCC7, 0xC3C2, + 0xCCC8, 0xAB6B, 0xCCC9, 0xC3C3, 0xCCCA, 0xAB6C, 0xCCCB, 0xAB6D, + 0xCCCC, 0xAB6E, 0xCCCD, 0xAB6F, 0xCCCE, 0xAB70, 0xCCCF, 0xAB71, + 0xCCD0, 0xC3C4, 0xCCD1, 0xAB72, 0xCCD2, 0xAB73, 0xCCD3, 0xAB74, + 0xCCD4, 0xC3C5, 0xCCD5, 0xAB75, 0xCCD6, 0xAB76, 0xCCD7, 0xAB77, + 0xCCD8, 0xAB78, 0xCCD9, 0xAB79, 0xCCDA, 0xAB7A, 0xCCDB, 0xAB81, + 0xCCDC, 0xAB82, 0xCCDD, 0xAB83, 0xCCDE, 0xAB84, 0xCCDF, 0xAB85, + 0xCCE0, 0xAB86, 0xCCE1, 0xAB87, 0xCCE2, 0xAB88, 0xCCE3, 0xAB89, + 0xCCE4, 0xC3C6, 0xCCE5, 0xAB8A, 0xCCE6, 0xAB8B, 0xCCE7, 0xAB8C, + 0xCCE8, 0xAB8D, 0xCCE9, 0xAB8E, 0xCCEA, 0xAB8F, 0xCCEB, 0xAB90, + 0xCCEC, 0xC3C7, 0xCCED, 0xAB91, 0xCCEE, 0xAB92, 0xCCEF, 0xAB93, + 0xCCF0, 0xC3C8, 0xCCF1, 0xAB94, 0xCCF2, 0xAB95, 0xCCF3, 0xAB96, + 0xCCF4, 0xAB97, 0xCCF5, 0xAB98, 0xCCF6, 0xAB99, 0xCCF7, 0xAB9A, + 0xCCF8, 0xAB9B, 0xCCF9, 0xAB9C, 0xCCFA, 0xAB9D, 0xCCFB, 0xAB9E, + 0xCCFC, 0xAB9F, 0xCCFD, 0xABA0, 0xCCFE, 0xAC41, 0xCCFF, 0xAC42, + 0xCD00, 0xAC43, 0xCD01, 0xC3C9, 0xCD02, 0xAC44, 0xCD03, 0xAC45, + 0xCD04, 0xAC46, 0xCD05, 0xAC47, 0xCD06, 0xAC48, 0xCD07, 0xAC49, + 0xCD08, 0xC3CA, 0xCD09, 0xC3CB, 0xCD0A, 0xAC4A, 0xCD0B, 0xAC4B, + 0xCD0C, 0xC3CC, 0xCD0D, 0xAC4C, 0xCD0E, 0xAC4D, 0xCD0F, 0xAC4E, + 0xCD10, 0xC3CD, 0xCD11, 0xAC4F, 0xCD12, 0xAC50, 0xCD13, 0xAC51, + 0xCD14, 0xAC52, 0xCD15, 0xAC53, 0xCD16, 0xAC54, 0xCD17, 0xAC55, + 0xCD18, 0xC3CE, 0xCD19, 0xC3CF, 0xCD1A, 0xAC56, 0xCD1B, 0xC3D0, + 0xCD1C, 0xAC57, 0xCD1D, 0xC3D1, 0xCD1E, 0xAC58, 0xCD1F, 0xAC59, + 0xCD20, 0xAC5A, 0xCD21, 0xAC61, 0xCD22, 0xAC62, 0xCD23, 0xAC63, + 0xCD24, 0xC3D2, 0xCD25, 0xAC64, 0xCD26, 0xAC65, 0xCD27, 0xAC66, + 0xCD28, 0xC3D3, 0xCD29, 0xAC67, 0xCD2A, 0xAC68, 0xCD2B, 0xAC69, + 0xCD2C, 0xC3D4, 0xCD2D, 0xAC6A, 0xCD2E, 0xAC6B, 0xCD2F, 0xAC6C, + 0xCD30, 0xAC6D, 0xCD31, 0xAC6E, 0xCD32, 0xAC6F, 0xCD33, 0xAC70, + 0xCD34, 0xAC71, 0xCD35, 0xAC72, 0xCD36, 0xAC73, 0xCD37, 0xAC74, + 0xCD38, 0xAC75, 0xCD39, 0xC3D5, 0xCD3A, 0xAC76, 0xCD3B, 0xAC77, + 0xCD3C, 0xAC78, 0xCD3D, 0xAC79, 0xCD3E, 0xAC7A, 0xCD3F, 0xAC81, + 0xCD40, 0xAC82, 0xCD41, 0xAC83, 0xCD42, 0xAC84, 0xCD43, 0xAC85, + 0xCD44, 0xAC86, 0xCD45, 0xAC87, 0xCD46, 0xAC88, 0xCD47, 0xAC89, + 0xCD48, 0xAC8A, 0xCD49, 0xAC8B, 0xCD4A, 0xAC8C, 0xCD4B, 0xAC8D, + 0xCD4C, 0xAC8E, 0xCD4D, 0xAC8F, 0xCD4E, 0xAC90, 0xCD4F, 0xAC91, + 0xCD50, 0xAC92, 0xCD51, 0xAC93, 0xCD52, 0xAC94, 0xCD53, 0xAC95, + 0xCD54, 0xAC96, 0xCD55, 0xAC97, 0xCD56, 0xAC98, 0xCD57, 0xAC99, + 0xCD58, 0xAC9A, 0xCD59, 0xAC9B, 0xCD5A, 0xAC9C, 0xCD5B, 0xAC9D, + 0xCD5C, 0xC3D6, 0xCD5D, 0xAC9E, 0xCD5E, 0xAC9F, 0xCD5F, 0xACA0, + 0xCD60, 0xC3D7, 0xCD61, 0xAD41, 0xCD62, 0xAD42, 0xCD63, 0xAD43, + 0xCD64, 0xC3D8, 0xCD65, 0xAD44, 0xCD66, 0xAD45, 0xCD67, 0xAD46, + 0xCD68, 0xAD47, 0xCD69, 0xAD48, 0xCD6A, 0xAD49, 0xCD6B, 0xAD4A, + 0xCD6C, 0xC3D9, 0xCD6D, 0xC3DA, 0xCD6E, 0xAD4B, 0xCD6F, 0xC3DB, + 0xCD70, 0xAD4C, 0xCD71, 0xC3DC, 0xCD72, 0xAD4D, 0xCD73, 0xAD4E, + 0xCD74, 0xAD4F, 0xCD75, 0xAD50, 0xCD76, 0xAD51, 0xCD77, 0xAD52, + 0xCD78, 0xC3DD, 0xCD79, 0xAD53, 0xCD7A, 0xAD54, 0xCD7B, 0xAD55, + 0xCD7C, 0xAD56, 0xCD7D, 0xAD57, 0xCD7E, 0xAD58, 0xCD7F, 0xAD59, + 0xCD80, 0xAD5A, 0xCD81, 0xAD61, 0xCD82, 0xAD62, 0xCD83, 0xAD63, + 0xCD84, 0xAD64, 0xCD85, 0xAD65, 0xCD86, 0xAD66, 0xCD87, 0xAD67, + 0xCD88, 0xC3DE, 0xCD89, 0xAD68, 0xCD8A, 0xAD69, 0xCD8B, 0xAD6A, + 0xCD8C, 0xAD6B, 0xCD8D, 0xAD6C, 0xCD8E, 0xAD6D, 0xCD8F, 0xAD6E, + 0xCD90, 0xAD6F, 0xCD91, 0xAD70, 0xCD92, 0xAD71, 0xCD93, 0xAD72, + 0xCD94, 0xC3DF, 0xCD95, 0xC3E0, 0xCD96, 0xAD73, 0xCD97, 0xAD74, + 0xCD98, 0xC3E1, 0xCD99, 0xAD75, 0xCD9A, 0xAD76, 0xCD9B, 0xAD77, + 0xCD9C, 0xC3E2, 0xCD9D, 0xAD78, 0xCD9E, 0xAD79, 0xCD9F, 0xAD7A, + 0xCDA0, 0xAD81, 0xCDA1, 0xAD82, 0xCDA2, 0xAD83, 0xCDA3, 0xAD84, + 0xCDA4, 0xC3E3, 0xCDA5, 0xC3E4, 0xCDA6, 0xAD85, 0xCDA7, 0xC3E5, + 0xCDA8, 0xAD86, 0xCDA9, 0xC3E6, 0xCDAA, 0xAD87, 0xCDAB, 0xAD88, + 0xCDAC, 0xAD89, 0xCDAD, 0xAD8A, 0xCDAE, 0xAD8B, 0xCDAF, 0xAD8C, + 0xCDB0, 0xC3E7, 0xCDB1, 0xAD8D, 0xCDB2, 0xAD8E, 0xCDB3, 0xAD8F, + 0xCDB4, 0xAD90, 0xCDB5, 0xAD91, 0xCDB6, 0xAD92, 0xCDB7, 0xAD93, + 0xCDB8, 0xAD94, 0xCDB9, 0xAD95, 0xCDBA, 0xAD96, 0xCDBB, 0xAD97, + 0xCDBC, 0xAD98, 0xCDBD, 0xAD99, 0xCDBE, 0xAD9A, 0xCDBF, 0xAD9B, + 0xCDC0, 0xAD9C, 0xCDC1, 0xAD9D, 0xCDC2, 0xAD9E, 0xCDC3, 0xAD9F, + 0xCDC4, 0xC3E8, 0xCDC5, 0xADA0, 0xCDC6, 0xAE41, 0xCDC7, 0xAE42, + 0xCDC8, 0xAE43, 0xCDC9, 0xAE44, 0xCDCA, 0xAE45, 0xCDCB, 0xAE46, + 0xCDCC, 0xC3E9, 0xCDCD, 0xAE47, 0xCDCE, 0xAE48, 0xCDCF, 0xAE49, + 0xCDD0, 0xC3EA, 0xCDD1, 0xAE4A, 0xCDD2, 0xAE4B, 0xCDD3, 0xAE4C, + 0xCDD4, 0xAE4D, 0xCDD5, 0xAE4E, 0xCDD6, 0xAE4F, 0xCDD7, 0xAE50, + 0xCDD8, 0xAE51, 0xCDD9, 0xAE52, 0xCDDA, 0xAE53, 0xCDDB, 0xAE54, + 0xCDDC, 0xAE55, 0xCDDD, 0xAE56, 0xCDDE, 0xAE57, 0xCDDF, 0xAE58, + 0xCDE0, 0xAE59, 0xCDE1, 0xAE5A, 0xCDE2, 0xAE61, 0xCDE3, 0xAE62, + 0xCDE4, 0xAE63, 0xCDE5, 0xAE64, 0xCDE6, 0xAE65, 0xCDE7, 0xAE66, + 0xCDE8, 0xC3EB, 0xCDE9, 0xAE67, 0xCDEA, 0xAE68, 0xCDEB, 0xAE69, + 0xCDEC, 0xC3EC, 0xCDED, 0xAE6A, 0xCDEE, 0xAE6B, 0xCDEF, 0xAE6C, + 0xCDF0, 0xC3ED, 0xCDF1, 0xAE6D, 0xCDF2, 0xAE6E, 0xCDF3, 0xAE6F, + 0xCDF4, 0xAE70, 0xCDF5, 0xAE71, 0xCDF6, 0xAE72, 0xCDF7, 0xAE73, + 0xCDF8, 0xC3EE, 0xCDF9, 0xC3EF, 0xCDFA, 0xAE74, 0xCDFB, 0xC3F0, + 0xCDFC, 0xAE75, 0xCDFD, 0xC3F1, 0xCDFE, 0xAE76, 0xCDFF, 0xAE77, + 0xCE00, 0xAE78, 0xCE01, 0xAE79, 0xCE02, 0xAE7A, 0xCE03, 0xAE81, + 0xCE04, 0xC3F2, 0xCE05, 0xAE82, 0xCE06, 0xAE83, 0xCE07, 0xAE84, + 0xCE08, 0xC3F3, 0xCE09, 0xAE85, 0xCE0A, 0xAE86, 0xCE0B, 0xAE87, + 0xCE0C, 0xC3F4, 0xCE0D, 0xAE88, 0xCE0E, 0xAE89, 0xCE0F, 0xAE8A, + 0xCE10, 0xAE8B, 0xCE11, 0xAE8C, 0xCE12, 0xAE8D, 0xCE13, 0xAE8E, + 0xCE14, 0xC3F5, 0xCE15, 0xAE8F, 0xCE16, 0xAE90, 0xCE17, 0xAE91, + 0xCE18, 0xAE92, 0xCE19, 0xC3F6, 0xCE1A, 0xAE93, 0xCE1B, 0xAE94, + 0xCE1C, 0xAE95, 0xCE1D, 0xAE96, 0xCE1E, 0xAE97, 0xCE1F, 0xAE98, + 0xCE20, 0xC3F7, 0xCE21, 0xC3F8, 0xCE22, 0xAE99, 0xCE23, 0xAE9A, + 0xCE24, 0xC3F9, 0xCE25, 0xAE9B, 0xCE26, 0xAE9C, 0xCE27, 0xAE9D, + 0xCE28, 0xC3FA, 0xCE29, 0xAE9E, 0xCE2A, 0xAE9F, 0xCE2B, 0xAEA0, + 0xCE2C, 0xAF41, 0xCE2D, 0xAF42, 0xCE2E, 0xAF43, 0xCE2F, 0xAF44, + 0xCE30, 0xC3FB, 0xCE31, 0xC3FC, 0xCE32, 0xAF45, 0xCE33, 0xC3FD, + 0xCE34, 0xAF46, 0xCE35, 0xC3FE, 0xCE36, 0xAF47, 0xCE37, 0xAF48, + 0xCE38, 0xAF49, 0xCE39, 0xAF4A, 0xCE3A, 0xAF4B, 0xCE3B, 0xAF4C, + 0xCE3C, 0xAF4D, 0xCE3D, 0xAF4E, 0xCE3E, 0xAF4F, 0xCE3F, 0xAF50, + 0xCE40, 0xAF51, 0xCE41, 0xAF52, 0xCE42, 0xAF53, 0xCE43, 0xAF54, + 0xCE44, 0xAF55, 0xCE45, 0xAF56, 0xCE46, 0xAF57, 0xCE47, 0xAF58, + 0xCE48, 0xAF59, 0xCE49, 0xAF5A, 0xCE4A, 0xAF61, 0xCE4B, 0xAF62, + 0xCE4C, 0xAF63, 0xCE4D, 0xAF64, 0xCE4E, 0xAF65, 0xCE4F, 0xAF66, + 0xCE50, 0xAF67, 0xCE51, 0xAF68, 0xCE52, 0xAF69, 0xCE53, 0xAF6A, + 0xCE54, 0xAF6B, 0xCE55, 0xAF6C, 0xCE56, 0xAF6D, 0xCE57, 0xAF6E, + 0xCE58, 0xC4A1, 0xCE59, 0xC4A2, 0xCE5A, 0xAF6F, 0xCE5B, 0xAF70, + 0xCE5C, 0xC4A3, 0xCE5D, 0xAF71, 0xCE5E, 0xAF72, 0xCE5F, 0xC4A4, + 0xCE60, 0xC4A5, 0xCE61, 0xC4A6, 0xCE62, 0xAF73, 0xCE63, 0xAF74, + 0xCE64, 0xAF75, 0xCE65, 0xAF76, 0xCE66, 0xAF77, 0xCE67, 0xAF78, + 0xCE68, 0xC4A7, 0xCE69, 0xC4A8, 0xCE6A, 0xAF79, 0xCE6B, 0xC4A9, + 0xCE6C, 0xAF7A, 0xCE6D, 0xC4AA, 0xCE6E, 0xAF81, 0xCE6F, 0xAF82, + 0xCE70, 0xAF83, 0xCE71, 0xAF84, 0xCE72, 0xAF85, 0xCE73, 0xAF86, + 0xCE74, 0xC4AB, 0xCE75, 0xC4AC, 0xCE76, 0xAF87, 0xCE77, 0xAF88, + 0xCE78, 0xC4AD, 0xCE79, 0xAF89, 0xCE7A, 0xAF8A, 0xCE7B, 0xAF8B, + 0xCE7C, 0xC4AE, 0xCE7D, 0xAF8C, 0xCE7E, 0xAF8D, 0xCE7F, 0xAF8E, + 0xCE80, 0xAF8F, 0xCE81, 0xAF90, 0xCE82, 0xAF91, 0xCE83, 0xAF92, + 0xCE84, 0xC4AF, 0xCE85, 0xC4B0, 0xCE86, 0xAF93, 0xCE87, 0xC4B1, + 0xCE88, 0xAF94, 0xCE89, 0xC4B2, 0xCE8A, 0xAF95, 0xCE8B, 0xAF96, + 0xCE8C, 0xAF97, 0xCE8D, 0xAF98, 0xCE8E, 0xAF99, 0xCE8F, 0xAF9A, + 0xCE90, 0xC4B3, 0xCE91, 0xC4B4, 0xCE92, 0xAF9B, 0xCE93, 0xAF9C, + 0xCE94, 0xC4B5, 0xCE95, 0xAF9D, 0xCE96, 0xAF9E, 0xCE97, 0xAF9F, + 0xCE98, 0xC4B6, 0xCE99, 0xAFA0, 0xCE9A, 0xB041, 0xCE9B, 0xB042, + 0xCE9C, 0xB043, 0xCE9D, 0xB044, 0xCE9E, 0xB045, 0xCE9F, 0xB046, + 0xCEA0, 0xC4B7, 0xCEA1, 0xC4B8, 0xCEA2, 0xB047, 0xCEA3, 0xC4B9, + 0xCEA4, 0xC4BA, 0xCEA5, 0xC4BB, 0xCEA6, 0xB048, 0xCEA7, 0xB049, + 0xCEA8, 0xB04A, 0xCEA9, 0xB04B, 0xCEAA, 0xB04C, 0xCEAB, 0xB04D, + 0xCEAC, 0xC4BC, 0xCEAD, 0xC4BD, 0xCEAE, 0xB04E, 0xCEAF, 0xB04F, + 0xCEB0, 0xB050, 0xCEB1, 0xB051, 0xCEB2, 0xB052, 0xCEB3, 0xB053, + 0xCEB4, 0xB054, 0xCEB5, 0xB055, 0xCEB6, 0xB056, 0xCEB7, 0xB057, + 0xCEB8, 0xB058, 0xCEB9, 0xB059, 0xCEBA, 0xB05A, 0xCEBB, 0xB061, + 0xCEBC, 0xB062, 0xCEBD, 0xB063, 0xCEBE, 0xB064, 0xCEBF, 0xB065, + 0xCEC0, 0xB066, 0xCEC1, 0xC4BE, 0xCEC2, 0xB067, 0xCEC3, 0xB068, + 0xCEC4, 0xB069, 0xCEC5, 0xB06A, 0xCEC6, 0xB06B, 0xCEC7, 0xB06C, + 0xCEC8, 0xB06D, 0xCEC9, 0xB06E, 0xCECA, 0xB06F, 0xCECB, 0xB070, + 0xCECC, 0xB071, 0xCECD, 0xB072, 0xCECE, 0xB073, 0xCECF, 0xB074, + 0xCED0, 0xB075, 0xCED1, 0xB076, 0xCED2, 0xB077, 0xCED3, 0xB078, + 0xCED4, 0xB079, 0xCED5, 0xB07A, 0xCED6, 0xB081, 0xCED7, 0xB082, + 0xCED8, 0xB083, 0xCED9, 0xB084, 0xCEDA, 0xB085, 0xCEDB, 0xB086, + 0xCEDC, 0xB087, 0xCEDD, 0xB088, 0xCEDE, 0xB089, 0xCEDF, 0xB08A, + 0xCEE0, 0xB08B, 0xCEE1, 0xB08C, 0xCEE2, 0xB08D, 0xCEE3, 0xB08E, + 0xCEE4, 0xC4BF, 0xCEE5, 0xC4C0, 0xCEE6, 0xB08F, 0xCEE7, 0xB090, + 0xCEE8, 0xC4C1, 0xCEE9, 0xB091, 0xCEEA, 0xB092, 0xCEEB, 0xC4C2, + 0xCEEC, 0xC4C3, 0xCEED, 0xB093, 0xCEEE, 0xB094, 0xCEEF, 0xB095, + 0xCEF0, 0xB096, 0xCEF1, 0xB097, 0xCEF2, 0xB098, 0xCEF3, 0xB099, + 0xCEF4, 0xC4C4, 0xCEF5, 0xC4C5, 0xCEF6, 0xB09A, 0xCEF7, 0xC4C6, + 0xCEF8, 0xC4C7, 0xCEF9, 0xC4C8, 0xCEFA, 0xB09B, 0xCEFB, 0xB09C, + 0xCEFC, 0xB09D, 0xCEFD, 0xB09E, 0xCEFE, 0xB09F, 0xCEFF, 0xB0A0, + 0xCF00, 0xC4C9, 0xCF01, 0xC4CA, 0xCF02, 0xB141, 0xCF03, 0xB142, + 0xCF04, 0xC4CB, 0xCF05, 0xB143, 0xCF06, 0xB144, 0xCF07, 0xB145, + 0xCF08, 0xC4CC, 0xCF09, 0xB146, 0xCF0A, 0xB147, 0xCF0B, 0xB148, + 0xCF0C, 0xB149, 0xCF0D, 0xB14A, 0xCF0E, 0xB14B, 0xCF0F, 0xB14C, + 0xCF10, 0xC4CD, 0xCF11, 0xC4CE, 0xCF12, 0xB14D, 0xCF13, 0xC4CF, + 0xCF14, 0xB14E, 0xCF15, 0xC4D0, 0xCF16, 0xB14F, 0xCF17, 0xB150, + 0xCF18, 0xB151, 0xCF19, 0xB152, 0xCF1A, 0xB153, 0xCF1B, 0xB154, + 0xCF1C, 0xC4D1, 0xCF1D, 0xB155, 0xCF1E, 0xB156, 0xCF1F, 0xB157, + 0xCF20, 0xC4D2, 0xCF21, 0xB158, 0xCF22, 0xB159, 0xCF23, 0xB15A, + 0xCF24, 0xC4D3, 0xCF25, 0xB161, 0xCF26, 0xB162, 0xCF27, 0xB163, + 0xCF28, 0xB164, 0xCF29, 0xB165, 0xCF2A, 0xB166, 0xCF2B, 0xB167, + 0xCF2C, 0xC4D4, 0xCF2D, 0xC4D5, 0xCF2E, 0xB168, 0xCF2F, 0xC4D6, + 0xCF30, 0xC4D7, 0xCF31, 0xC4D8, 0xCF32, 0xB169, 0xCF33, 0xB16A, + 0xCF34, 0xB16B, 0xCF35, 0xB16C, 0xCF36, 0xB16D, 0xCF37, 0xB16E, + 0xCF38, 0xC4D9, 0xCF39, 0xB16F, 0xCF3A, 0xB170, 0xCF3B, 0xB171, + 0xCF3C, 0xB172, 0xCF3D, 0xB173, 0xCF3E, 0xB174, 0xCF3F, 0xB175, + 0xCF40, 0xB176, 0xCF41, 0xB177, 0xCF42, 0xB178, 0xCF43, 0xB179, + 0xCF44, 0xB17A, 0xCF45, 0xB181, 0xCF46, 0xB182, 0xCF47, 0xB183, + 0xCF48, 0xB184, 0xCF49, 0xB185, 0xCF4A, 0xB186, 0xCF4B, 0xB187, + 0xCF4C, 0xB188, 0xCF4D, 0xB189, 0xCF4E, 0xB18A, 0xCF4F, 0xB18B, + 0xCF50, 0xB18C, 0xCF51, 0xB18D, 0xCF52, 0xB18E, 0xCF53, 0xB18F, + 0xCF54, 0xC4DA, 0xCF55, 0xC4DB, 0xCF56, 0xB190, 0xCF57, 0xB191, + 0xCF58, 0xC4DC, 0xCF59, 0xB192, 0xCF5A, 0xB193, 0xCF5B, 0xB194, + 0xCF5C, 0xC4DD, 0xCF5D, 0xB195, 0xCF5E, 0xB196, 0xCF5F, 0xB197, + 0xCF60, 0xB198, 0xCF61, 0xB199, 0xCF62, 0xB19A, 0xCF63, 0xB19B, + 0xCF64, 0xC4DE, 0xCF65, 0xC4DF, 0xCF66, 0xB19C, 0xCF67, 0xC4E0, + 0xCF68, 0xB19D, 0xCF69, 0xC4E1, 0xCF6A, 0xB19E, 0xCF6B, 0xB19F, + 0xCF6C, 0xB1A0, 0xCF6D, 0xB241, 0xCF6E, 0xB242, 0xCF6F, 0xB243, + 0xCF70, 0xC4E2, 0xCF71, 0xC4E3, 0xCF72, 0xB244, 0xCF73, 0xB245, + 0xCF74, 0xC4E4, 0xCF75, 0xB246, 0xCF76, 0xB247, 0xCF77, 0xB248, + 0xCF78, 0xC4E5, 0xCF79, 0xB249, 0xCF7A, 0xB24A, 0xCF7B, 0xB24B, + 0xCF7C, 0xB24C, 0xCF7D, 0xB24D, 0xCF7E, 0xB24E, 0xCF7F, 0xB24F, + 0xCF80, 0xC4E6, 0xCF81, 0xB250, 0xCF82, 0xB251, 0xCF83, 0xB252, + 0xCF84, 0xB253, 0xCF85, 0xC4E7, 0xCF86, 0xB254, 0xCF87, 0xB255, + 0xCF88, 0xB256, 0xCF89, 0xB257, 0xCF8A, 0xB258, 0xCF8B, 0xB259, + 0xCF8C, 0xC4E8, 0xCF8D, 0xB25A, 0xCF8E, 0xB261, 0xCF8F, 0xB262, + 0xCF90, 0xB263, 0xCF91, 0xB264, 0xCF92, 0xB265, 0xCF93, 0xB266, + 0xCF94, 0xB267, 0xCF95, 0xB268, 0xCF96, 0xB269, 0xCF97, 0xB26A, + 0xCF98, 0xB26B, 0xCF99, 0xB26C, 0xCF9A, 0xB26D, 0xCF9B, 0xB26E, + 0xCF9C, 0xB26F, 0xCF9D, 0xB270, 0xCF9E, 0xB271, 0xCF9F, 0xB272, + 0xCFA0, 0xB273, 0xCFA1, 0xC4E9, 0xCFA2, 0xB274, 0xCFA3, 0xB275, + 0xCFA4, 0xB276, 0xCFA5, 0xB277, 0xCFA6, 0xB278, 0xCFA7, 0xB279, + 0xCFA8, 0xC4EA, 0xCFA9, 0xB27A, 0xCFAA, 0xB281, 0xCFAB, 0xB282, + 0xCFAC, 0xB283, 0xCFAD, 0xB284, 0xCFAE, 0xB285, 0xCFAF, 0xB286, + 0xCFB0, 0xC4EB, 0xCFB1, 0xB287, 0xCFB2, 0xB288, 0xCFB3, 0xB289, + 0xCFB4, 0xB28A, 0xCFB5, 0xB28B, 0xCFB6, 0xB28C, 0xCFB7, 0xB28D, + 0xCFB8, 0xB28E, 0xCFB9, 0xB28F, 0xCFBA, 0xB290, 0xCFBB, 0xB291, + 0xCFBC, 0xB292, 0xCFBD, 0xB293, 0xCFBE, 0xB294, 0xCFBF, 0xB295, + 0xCFC0, 0xB296, 0xCFC1, 0xB297, 0xCFC2, 0xB298, 0xCFC3, 0xB299, + 0xCFC4, 0xC4EC, 0xCFC5, 0xB29A, 0xCFC6, 0xB29B, 0xCFC7, 0xB29C, + 0xCFC8, 0xB29D, 0xCFC9, 0xB29E, 0xCFCA, 0xB29F, 0xCFCB, 0xB2A0, + 0xCFCC, 0xB341, 0xCFCD, 0xB342, 0xCFCE, 0xB343, 0xCFCF, 0xB344, + 0xCFD0, 0xB345, 0xCFD1, 0xB346, 0xCFD2, 0xB347, 0xCFD3, 0xB348, + 0xCFD4, 0xB349, 0xCFD5, 0xB34A, 0xCFD6, 0xB34B, 0xCFD7, 0xB34C, + 0xCFD8, 0xB34D, 0xCFD9, 0xB34E, 0xCFDA, 0xB34F, 0xCFDB, 0xB350, + 0xCFDC, 0xB351, 0xCFDD, 0xB352, 0xCFDE, 0xB353, 0xCFDF, 0xB354, + 0xCFE0, 0xC4ED, 0xCFE1, 0xC4EE, 0xCFE2, 0xB355, 0xCFE3, 0xB356, + 0xCFE4, 0xC4EF, 0xCFE5, 0xB357, 0xCFE6, 0xB358, 0xCFE7, 0xB359, + 0xCFE8, 0xC4F0, 0xCFE9, 0xB35A, 0xCFEA, 0xB361, 0xCFEB, 0xB362, + 0xCFEC, 0xB363, 0xCFED, 0xB364, 0xCFEE, 0xB365, 0xCFEF, 0xB366, + 0xCFF0, 0xC4F1, 0xCFF1, 0xC4F2, 0xCFF2, 0xB367, 0xCFF3, 0xC4F3, + 0xCFF4, 0xB368, 0xCFF5, 0xC4F4, 0xCFF6, 0xB369, 0xCFF7, 0xB36A, + 0xCFF8, 0xB36B, 0xCFF9, 0xB36C, 0xCFFA, 0xB36D, 0xCFFB, 0xB36E, + 0xCFFC, 0xC4F5, 0xCFFD, 0xB36F, 0xCFFE, 0xB370, 0xCFFF, 0xB371, + 0xD000, 0xC4F6, 0xD001, 0xB372, 0xD002, 0xB373, 0xD003, 0xB374, + 0xD004, 0xC4F7, 0xD005, 0xB375, 0xD006, 0xB376, 0xD007, 0xB377, + 0xD008, 0xB378, 0xD009, 0xB379, 0xD00A, 0xB37A, 0xD00B, 0xB381, + 0xD00C, 0xB382, 0xD00D, 0xB383, 0xD00E, 0xB384, 0xD00F, 0xB385, + 0xD010, 0xB386, 0xD011, 0xC4F8, 0xD012, 0xB387, 0xD013, 0xB388, + 0xD014, 0xB389, 0xD015, 0xB38A, 0xD016, 0xB38B, 0xD017, 0xB38C, + 0xD018, 0xC4F9, 0xD019, 0xB38D, 0xD01A, 0xB38E, 0xD01B, 0xB38F, + 0xD01C, 0xB390, 0xD01D, 0xB391, 0xD01E, 0xB392, 0xD01F, 0xB393, + 0xD020, 0xB394, 0xD021, 0xB395, 0xD022, 0xB396, 0xD023, 0xB397, + 0xD024, 0xB398, 0xD025, 0xB399, 0xD026, 0xB39A, 0xD027, 0xB39B, + 0xD028, 0xB39C, 0xD029, 0xB39D, 0xD02A, 0xB39E, 0xD02B, 0xB39F, + 0xD02C, 0xB3A0, 0xD02D, 0xC4FA, 0xD02E, 0xB441, 0xD02F, 0xB442, + 0xD030, 0xB443, 0xD031, 0xB444, 0xD032, 0xB445, 0xD033, 0xB446, + 0xD034, 0xC4FB, 0xD035, 0xC4FC, 0xD036, 0xB447, 0xD037, 0xB448, + 0xD038, 0xC4FD, 0xD039, 0xB449, 0xD03A, 0xB44A, 0xD03B, 0xB44B, + 0xD03C, 0xC4FE, 0xD03D, 0xB44C, 0xD03E, 0xB44D, 0xD03F, 0xB44E, + 0xD040, 0xB44F, 0xD041, 0xB450, 0xD042, 0xB451, 0xD043, 0xB452, + 0xD044, 0xC5A1, 0xD045, 0xC5A2, 0xD046, 0xB453, 0xD047, 0xC5A3, + 0xD048, 0xB454, 0xD049, 0xC5A4, 0xD04A, 0xB455, 0xD04B, 0xB456, + 0xD04C, 0xB457, 0xD04D, 0xB458, 0xD04E, 0xB459, 0xD04F, 0xB45A, + 0xD050, 0xC5A5, 0xD051, 0xB461, 0xD052, 0xB462, 0xD053, 0xB463, + 0xD054, 0xC5A6, 0xD055, 0xB464, 0xD056, 0xB465, 0xD057, 0xB466, + 0xD058, 0xC5A7, 0xD059, 0xB467, 0xD05A, 0xB468, 0xD05B, 0xB469, + 0xD05C, 0xB46A, 0xD05D, 0xB46B, 0xD05E, 0xB46C, 0xD05F, 0xB46D, + 0xD060, 0xC5A8, 0xD061, 0xB46E, 0xD062, 0xB46F, 0xD063, 0xB470, + 0xD064, 0xB471, 0xD065, 0xB472, 0xD066, 0xB473, 0xD067, 0xB474, + 0xD068, 0xB475, 0xD069, 0xB476, 0xD06A, 0xB477, 0xD06B, 0xB478, + 0xD06C, 0xC5A9, 0xD06D, 0xC5AA, 0xD06E, 0xB479, 0xD06F, 0xB47A, + 0xD070, 0xC5AB, 0xD071, 0xB481, 0xD072, 0xB482, 0xD073, 0xB483, + 0xD074, 0xC5AC, 0xD075, 0xB484, 0xD076, 0xB485, 0xD077, 0xB486, + 0xD078, 0xB487, 0xD079, 0xB488, 0xD07A, 0xB489, 0xD07B, 0xB48A, + 0xD07C, 0xC5AD, 0xD07D, 0xC5AE, 0xD07E, 0xB48B, 0xD07F, 0xB48C, + 0xD080, 0xB48D, 0xD081, 0xC5AF, 0xD082, 0xB48E, 0xD083, 0xB48F, + 0xD084, 0xB490, 0xD085, 0xB491, 0xD086, 0xB492, 0xD087, 0xB493, + 0xD088, 0xB494, 0xD089, 0xB495, 0xD08A, 0xB496, 0xD08B, 0xB497, + 0xD08C, 0xB498, 0xD08D, 0xB499, 0xD08E, 0xB49A, 0xD08F, 0xB49B, + 0xD090, 0xB49C, 0xD091, 0xB49D, 0xD092, 0xB49E, 0xD093, 0xB49F, + 0xD094, 0xB4A0, 0xD095, 0xB541, 0xD096, 0xB542, 0xD097, 0xB543, + 0xD098, 0xB544, 0xD099, 0xB545, 0xD09A, 0xB546, 0xD09B, 0xB547, + 0xD09C, 0xB548, 0xD09D, 0xB549, 0xD09E, 0xB54A, 0xD09F, 0xB54B, + 0xD0A0, 0xB54C, 0xD0A1, 0xB54D, 0xD0A2, 0xB54E, 0xD0A3, 0xB54F, + 0xD0A4, 0xC5B0, 0xD0A5, 0xC5B1, 0xD0A6, 0xB550, 0xD0A7, 0xB551, + 0xD0A8, 0xC5B2, 0xD0A9, 0xB552, 0xD0AA, 0xB553, 0xD0AB, 0xB554, + 0xD0AC, 0xC5B3, 0xD0AD, 0xB555, 0xD0AE, 0xB556, 0xD0AF, 0xB557, + 0xD0B0, 0xB558, 0xD0B1, 0xB559, 0xD0B2, 0xB55A, 0xD0B3, 0xB561, + 0xD0B4, 0xC5B4, 0xD0B5, 0xC5B5, 0xD0B6, 0xB562, 0xD0B7, 0xC5B6, + 0xD0B8, 0xB563, 0xD0B9, 0xC5B7, 0xD0BA, 0xB564, 0xD0BB, 0xB565, + 0xD0BC, 0xB566, 0xD0BD, 0xB567, 0xD0BE, 0xB568, 0xD0BF, 0xB569, + 0xD0C0, 0xC5B8, 0xD0C1, 0xC5B9, 0xD0C2, 0xB56A, 0xD0C3, 0xB56B, + 0xD0C4, 0xC5BA, 0xD0C5, 0xB56C, 0xD0C6, 0xB56D, 0xD0C7, 0xB56E, + 0xD0C8, 0xC5BB, 0xD0C9, 0xC5BC, 0xD0CA, 0xB56F, 0xD0CB, 0xB570, + 0xD0CC, 0xB571, 0xD0CD, 0xB572, 0xD0CE, 0xB573, 0xD0CF, 0xB574, + 0xD0D0, 0xC5BD, 0xD0D1, 0xC5BE, 0xD0D2, 0xB575, 0xD0D3, 0xC5BF, + 0xD0D4, 0xC5C0, 0xD0D5, 0xC5C1, 0xD0D6, 0xB576, 0xD0D7, 0xB577, + 0xD0D8, 0xB578, 0xD0D9, 0xB579, 0xD0DA, 0xB57A, 0xD0DB, 0xB581, + 0xD0DC, 0xC5C2, 0xD0DD, 0xC5C3, 0xD0DE, 0xB582, 0xD0DF, 0xB583, + 0xD0E0, 0xC5C4, 0xD0E1, 0xB584, 0xD0E2, 0xB585, 0xD0E3, 0xB586, + 0xD0E4, 0xC5C5, 0xD0E5, 0xB587, 0xD0E6, 0xB588, 0xD0E7, 0xB589, + 0xD0E8, 0xB58A, 0xD0E9, 0xB58B, 0xD0EA, 0xB58C, 0xD0EB, 0xB58D, + 0xD0EC, 0xC5C6, 0xD0ED, 0xC5C7, 0xD0EE, 0xB58E, 0xD0EF, 0xC5C8, + 0xD0F0, 0xC5C9, 0xD0F1, 0xC5CA, 0xD0F2, 0xB58F, 0xD0F3, 0xB590, + 0xD0F4, 0xB591, 0xD0F5, 0xB592, 0xD0F6, 0xB593, 0xD0F7, 0xB594, + 0xD0F8, 0xC5CB, 0xD0F9, 0xB595, 0xD0FA, 0xB596, 0xD0FB, 0xB597, + 0xD0FC, 0xB598, 0xD0FD, 0xB599, 0xD0FE, 0xB59A, 0xD0FF, 0xB59B, + 0xD100, 0xB59C, 0xD101, 0xB59D, 0xD102, 0xB59E, 0xD103, 0xB59F, + 0xD104, 0xB5A0, 0xD105, 0xB641, 0xD106, 0xB642, 0xD107, 0xB643, + 0xD108, 0xB644, 0xD109, 0xB645, 0xD10A, 0xB646, 0xD10B, 0xB647, + 0xD10C, 0xB648, 0xD10D, 0xC5CC, 0xD10E, 0xB649, 0xD10F, 0xB64A, + 0xD110, 0xB64B, 0xD111, 0xB64C, 0xD112, 0xB64D, 0xD113, 0xB64E, + 0xD114, 0xB64F, 0xD115, 0xB650, 0xD116, 0xB651, 0xD117, 0xB652, + 0xD118, 0xB653, 0xD119, 0xB654, 0xD11A, 0xB655, 0xD11B, 0xB656, + 0xD11C, 0xB657, 0xD11D, 0xB658, 0xD11E, 0xB659, 0xD11F, 0xB65A, + 0xD120, 0xB661, 0xD121, 0xB662, 0xD122, 0xB663, 0xD123, 0xB664, + 0xD124, 0xB665, 0xD125, 0xB666, 0xD126, 0xB667, 0xD127, 0xB668, + 0xD128, 0xB669, 0xD129, 0xB66A, 0xD12A, 0xB66B, 0xD12B, 0xB66C, + 0xD12C, 0xB66D, 0xD12D, 0xB66E, 0xD12E, 0xB66F, 0xD12F, 0xB670, + 0xD130, 0xC5CD, 0xD131, 0xC5CE, 0xD132, 0xB671, 0xD133, 0xB672, + 0xD134, 0xC5CF, 0xD135, 0xB673, 0xD136, 0xB674, 0xD137, 0xB675, + 0xD138, 0xC5D0, 0xD139, 0xB676, 0xD13A, 0xC5D1, 0xD13B, 0xB677, + 0xD13C, 0xB678, 0xD13D, 0xB679, 0xD13E, 0xB67A, 0xD13F, 0xB681, + 0xD140, 0xC5D2, 0xD141, 0xC5D3, 0xD142, 0xB682, 0xD143, 0xC5D4, + 0xD144, 0xC5D5, 0xD145, 0xC5D6, 0xD146, 0xB683, 0xD147, 0xB684, + 0xD148, 0xB685, 0xD149, 0xB686, 0xD14A, 0xB687, 0xD14B, 0xB688, + 0xD14C, 0xC5D7, 0xD14D, 0xC5D8, 0xD14E, 0xB689, 0xD14F, 0xB68A, + 0xD150, 0xC5D9, 0xD151, 0xB68B, 0xD152, 0xB68C, 0xD153, 0xB68D, + 0xD154, 0xC5DA, 0xD155, 0xB68E, 0xD156, 0xB68F, 0xD157, 0xB690, + 0xD158, 0xB691, 0xD159, 0xB692, 0xD15A, 0xB693, 0xD15B, 0xB694, + 0xD15C, 0xC5DB, 0xD15D, 0xC5DC, 0xD15E, 0xB695, 0xD15F, 0xC5DD, + 0xD160, 0xB696, 0xD161, 0xC5DE, 0xD162, 0xB697, 0xD163, 0xB698, + 0xD164, 0xB699, 0xD165, 0xB69A, 0xD166, 0xB69B, 0xD167, 0xB69C, + 0xD168, 0xC5DF, 0xD169, 0xB69D, 0xD16A, 0xB69E, 0xD16B, 0xB69F, + 0xD16C, 0xC5E0, 0xD16D, 0xB6A0, 0xD16E, 0xB741, 0xD16F, 0xB742, + 0xD170, 0xB743, 0xD171, 0xB744, 0xD172, 0xB745, 0xD173, 0xB746, + 0xD174, 0xB747, 0xD175, 0xB748, 0xD176, 0xB749, 0xD177, 0xB74A, + 0xD178, 0xB74B, 0xD179, 0xB74C, 0xD17A, 0xB74D, 0xD17B, 0xB74E, + 0xD17C, 0xC5E1, 0xD17D, 0xB74F, 0xD17E, 0xB750, 0xD17F, 0xB751, + 0xD180, 0xB752, 0xD181, 0xB753, 0xD182, 0xB754, 0xD183, 0xB755, + 0xD184, 0xC5E2, 0xD185, 0xB756, 0xD186, 0xB757, 0xD187, 0xB758, + 0xD188, 0xC5E3, 0xD189, 0xB759, 0xD18A, 0xB75A, 0xD18B, 0xB761, + 0xD18C, 0xB762, 0xD18D, 0xB763, 0xD18E, 0xB764, 0xD18F, 0xB765, + 0xD190, 0xB766, 0xD191, 0xB767, 0xD192, 0xB768, 0xD193, 0xB769, + 0xD194, 0xB76A, 0xD195, 0xB76B, 0xD196, 0xB76C, 0xD197, 0xB76D, + 0xD198, 0xB76E, 0xD199, 0xB76F, 0xD19A, 0xB770, 0xD19B, 0xB771, + 0xD19C, 0xB772, 0xD19D, 0xB773, 0xD19E, 0xB774, 0xD19F, 0xB775, + 0xD1A0, 0xC5E4, 0xD1A1, 0xC5E5, 0xD1A2, 0xB776, 0xD1A3, 0xB777, + 0xD1A4, 0xC5E6, 0xD1A5, 0xB778, 0xD1A6, 0xB779, 0xD1A7, 0xB77A, + 0xD1A8, 0xC5E7, 0xD1A9, 0xB781, 0xD1AA, 0xB782, 0xD1AB, 0xB783, + 0xD1AC, 0xB784, 0xD1AD, 0xB785, 0xD1AE, 0xB786, 0xD1AF, 0xB787, + 0xD1B0, 0xC5E8, 0xD1B1, 0xC5E9, 0xD1B2, 0xB788, 0xD1B3, 0xC5EA, + 0xD1B4, 0xB789, 0xD1B5, 0xC5EB, 0xD1B6, 0xB78A, 0xD1B7, 0xB78B, + 0xD1B8, 0xB78C, 0xD1B9, 0xB78D, 0xD1BA, 0xC5EC, 0xD1BB, 0xB78E, + 0xD1BC, 0xC5ED, 0xD1BD, 0xB78F, 0xD1BE, 0xB790, 0xD1BF, 0xB791, + 0xD1C0, 0xC5EE, 0xD1C1, 0xB792, 0xD1C2, 0xB793, 0xD1C3, 0xB794, + 0xD1C4, 0xB795, 0xD1C5, 0xB796, 0xD1C6, 0xB797, 0xD1C7, 0xB798, + 0xD1C8, 0xB799, 0xD1C9, 0xB79A, 0xD1CA, 0xB79B, 0xD1CB, 0xB79C, + 0xD1CC, 0xB79D, 0xD1CD, 0xB79E, 0xD1CE, 0xB79F, 0xD1CF, 0xB7A0, + 0xD1D0, 0xB841, 0xD1D1, 0xB842, 0xD1D2, 0xB843, 0xD1D3, 0xB844, + 0xD1D4, 0xB845, 0xD1D5, 0xB846, 0xD1D6, 0xB847, 0xD1D7, 0xB848, + 0xD1D8, 0xC5EF, 0xD1D9, 0xB849, 0xD1DA, 0xB84A, 0xD1DB, 0xB84B, + 0xD1DC, 0xB84C, 0xD1DD, 0xB84D, 0xD1DE, 0xB84E, 0xD1DF, 0xB84F, + 0xD1E0, 0xB850, 0xD1E1, 0xB851, 0xD1E2, 0xB852, 0xD1E3, 0xB853, + 0xD1E4, 0xB854, 0xD1E5, 0xB855, 0xD1E6, 0xB856, 0xD1E7, 0xB857, + 0xD1E8, 0xB858, 0xD1E9, 0xB859, 0xD1EA, 0xB85A, 0xD1EB, 0xB861, + 0xD1EC, 0xB862, 0xD1ED, 0xB863, 0xD1EE, 0xB864, 0xD1EF, 0xB865, + 0xD1F0, 0xB866, 0xD1F1, 0xB867, 0xD1F2, 0xB868, 0xD1F3, 0xB869, + 0xD1F4, 0xC5F0, 0xD1F5, 0xB86A, 0xD1F6, 0xB86B, 0xD1F7, 0xB86C, + 0xD1F8, 0xC5F1, 0xD1F9, 0xB86D, 0xD1FA, 0xB86E, 0xD1FB, 0xB86F, + 0xD1FC, 0xB870, 0xD1FD, 0xB871, 0xD1FE, 0xB872, 0xD1FF, 0xB873, + 0xD200, 0xB874, 0xD201, 0xB875, 0xD202, 0xB876, 0xD203, 0xB877, + 0xD204, 0xB878, 0xD205, 0xB879, 0xD206, 0xB87A, 0xD207, 0xC5F2, + 0xD208, 0xB881, 0xD209, 0xC5F3, 0xD20A, 0xB882, 0xD20B, 0xB883, + 0xD20C, 0xB884, 0xD20D, 0xB885, 0xD20E, 0xB886, 0xD20F, 0xB887, + 0xD210, 0xC5F4, 0xD211, 0xB888, 0xD212, 0xB889, 0xD213, 0xB88A, + 0xD214, 0xB88B, 0xD215, 0xB88C, 0xD216, 0xB88D, 0xD217, 0xB88E, + 0xD218, 0xB88F, 0xD219, 0xB890, 0xD21A, 0xB891, 0xD21B, 0xB892, + 0xD21C, 0xB893, 0xD21D, 0xB894, 0xD21E, 0xB895, 0xD21F, 0xB896, + 0xD220, 0xB897, 0xD221, 0xB898, 0xD222, 0xB899, 0xD223, 0xB89A, + 0xD224, 0xB89B, 0xD225, 0xB89C, 0xD226, 0xB89D, 0xD227, 0xB89E, + 0xD228, 0xB89F, 0xD229, 0xB8A0, 0xD22A, 0xB941, 0xD22B, 0xB942, + 0xD22C, 0xC5F5, 0xD22D, 0xC5F6, 0xD22E, 0xB943, 0xD22F, 0xB944, + 0xD230, 0xC5F7, 0xD231, 0xB945, 0xD232, 0xB946, 0xD233, 0xB947, + 0xD234, 0xC5F8, 0xD235, 0xB948, 0xD236, 0xB949, 0xD237, 0xB94A, + 0xD238, 0xB94B, 0xD239, 0xB94C, 0xD23A, 0xB94D, 0xD23B, 0xB94E, + 0xD23C, 0xC5F9, 0xD23D, 0xC5FA, 0xD23E, 0xB94F, 0xD23F, 0xC5FB, + 0xD240, 0xB950, 0xD241, 0xC5FC, 0xD242, 0xB951, 0xD243, 0xB952, + 0xD244, 0xB953, 0xD245, 0xB954, 0xD246, 0xB955, 0xD247, 0xB956, + 0xD248, 0xC5FD, 0xD249, 0xB957, 0xD24A, 0xB958, 0xD24B, 0xB959, + 0xD24C, 0xB95A, 0xD24D, 0xB961, 0xD24E, 0xB962, 0xD24F, 0xB963, + 0xD250, 0xB964, 0xD251, 0xB965, 0xD252, 0xB966, 0xD253, 0xB967, + 0xD254, 0xB968, 0xD255, 0xB969, 0xD256, 0xB96A, 0xD257, 0xB96B, + 0xD258, 0xB96C, 0xD259, 0xB96D, 0xD25A, 0xB96E, 0xD25B, 0xB96F, + 0xD25C, 0xC5FE, 0xD25D, 0xB970, 0xD25E, 0xB971, 0xD25F, 0xB972, + 0xD260, 0xB973, 0xD261, 0xB974, 0xD262, 0xB975, 0xD263, 0xB976, + 0xD264, 0xC6A1, 0xD265, 0xB977, 0xD266, 0xB978, 0xD267, 0xB979, + 0xD268, 0xB97A, 0xD269, 0xB981, 0xD26A, 0xB982, 0xD26B, 0xB983, + 0xD26C, 0xB984, 0xD26D, 0xB985, 0xD26E, 0xB986, 0xD26F, 0xB987, + 0xD270, 0xB988, 0xD271, 0xB989, 0xD272, 0xB98A, 0xD273, 0xB98B, + 0xD274, 0xB98C, 0xD275, 0xB98D, 0xD276, 0xB98E, 0xD277, 0xB98F, + 0xD278, 0xB990, 0xD279, 0xB991, 0xD27A, 0xB992, 0xD27B, 0xB993, + 0xD27C, 0xB994, 0xD27D, 0xB995, 0xD27E, 0xB996, 0xD27F, 0xB997, + 0xD280, 0xC6A2, 0xD281, 0xC6A3, 0xD282, 0xB998, 0xD283, 0xB999, + 0xD284, 0xC6A4, 0xD285, 0xB99A, 0xD286, 0xB99B, 0xD287, 0xB99C, + 0xD288, 0xC6A5, 0xD289, 0xB99D, 0xD28A, 0xB99E, 0xD28B, 0xB99F, + 0xD28C, 0xB9A0, 0xD28D, 0xBA41, 0xD28E, 0xBA42, 0xD28F, 0xBA43, + 0xD290, 0xC6A6, 0xD291, 0xC6A7, 0xD292, 0xBA44, 0xD293, 0xBA45, + 0xD294, 0xBA46, 0xD295, 0xC6A8, 0xD296, 0xBA47, 0xD297, 0xBA48, + 0xD298, 0xBA49, 0xD299, 0xBA4A, 0xD29A, 0xBA4B, 0xD29B, 0xBA4C, + 0xD29C, 0xC6A9, 0xD29D, 0xBA4D, 0xD29E, 0xBA4E, 0xD29F, 0xBA4F, + 0xD2A0, 0xC6AA, 0xD2A1, 0xBA50, 0xD2A2, 0xBA51, 0xD2A3, 0xBA52, + 0xD2A4, 0xC6AB, 0xD2A5, 0xBA53, 0xD2A6, 0xBA54, 0xD2A7, 0xBA55, + 0xD2A8, 0xBA56, 0xD2A9, 0xBA57, 0xD2AA, 0xBA58, 0xD2AB, 0xBA59, + 0xD2AC, 0xC6AC, 0xD2AD, 0xBA5A, 0xD2AE, 0xBA61, 0xD2AF, 0xBA62, + 0xD2B0, 0xBA63, 0xD2B1, 0xC6AD, 0xD2B2, 0xBA64, 0xD2B3, 0xBA65, + 0xD2B4, 0xBA66, 0xD2B5, 0xBA67, 0xD2B6, 0xBA68, 0xD2B7, 0xBA69, + 0xD2B8, 0xC6AE, 0xD2B9, 0xC6AF, 0xD2BA, 0xBA6A, 0xD2BB, 0xBA6B, + 0xD2BC, 0xC6B0, 0xD2BD, 0xBA6C, 0xD2BE, 0xBA6D, 0xD2BF, 0xC6B1, + 0xD2C0, 0xC6B2, 0xD2C1, 0xBA6E, 0xD2C2, 0xC6B3, 0xD2C3, 0xBA6F, + 0xD2C4, 0xBA70, 0xD2C5, 0xBA71, 0xD2C6, 0xBA72, 0xD2C7, 0xBA73, + 0xD2C8, 0xC6B4, 0xD2C9, 0xC6B5, 0xD2CA, 0xBA74, 0xD2CB, 0xC6B6, + 0xD2CC, 0xBA75, 0xD2CD, 0xBA76, 0xD2CE, 0xBA77, 0xD2CF, 0xBA78, + 0xD2D0, 0xBA79, 0xD2D1, 0xBA7A, 0xD2D2, 0xBA81, 0xD2D3, 0xBA82, + 0xD2D4, 0xC6B7, 0xD2D5, 0xBA83, 0xD2D6, 0xBA84, 0xD2D7, 0xBA85, + 0xD2D8, 0xC6B8, 0xD2D9, 0xBA86, 0xD2DA, 0xBA87, 0xD2DB, 0xBA88, + 0xD2DC, 0xC6B9, 0xD2DD, 0xBA89, 0xD2DE, 0xBA8A, 0xD2DF, 0xBA8B, + 0xD2E0, 0xBA8C, 0xD2E1, 0xBA8D, 0xD2E2, 0xBA8E, 0xD2E3, 0xBA8F, + 0xD2E4, 0xC6BA, 0xD2E5, 0xC6BB, 0xD2E6, 0xBA90, 0xD2E7, 0xBA91, + 0xD2E8, 0xBA92, 0xD2E9, 0xBA93, 0xD2EA, 0xBA94, 0xD2EB, 0xBA95, + 0xD2EC, 0xBA96, 0xD2ED, 0xBA97, 0xD2EE, 0xBA98, 0xD2EF, 0xBA99, + 0xD2F0, 0xC6BC, 0xD2F1, 0xC6BD, 0xD2F2, 0xBA9A, 0xD2F3, 0xBA9B, + 0xD2F4, 0xC6BE, 0xD2F5, 0xBA9C, 0xD2F6, 0xBA9D, 0xD2F7, 0xBA9E, + 0xD2F8, 0xC6BF, 0xD2F9, 0xBA9F, 0xD2FA, 0xBAA0, 0xD2FB, 0xBB41, + 0xD2FC, 0xBB42, 0xD2FD, 0xBB43, 0xD2FE, 0xBB44, 0xD2FF, 0xBB45, + 0xD300, 0xC6C0, 0xD301, 0xC6C1, 0xD302, 0xBB46, 0xD303, 0xC6C2, + 0xD304, 0xBB47, 0xD305, 0xC6C3, 0xD306, 0xBB48, 0xD307, 0xBB49, + 0xD308, 0xBB4A, 0xD309, 0xBB4B, 0xD30A, 0xBB4C, 0xD30B, 0xBB4D, + 0xD30C, 0xC6C4, 0xD30D, 0xC6C5, 0xD30E, 0xC6C6, 0xD30F, 0xBB4E, + 0xD310, 0xC6C7, 0xD311, 0xBB4F, 0xD312, 0xBB50, 0xD313, 0xBB51, + 0xD314, 0xC6C8, 0xD315, 0xBB52, 0xD316, 0xC6C9, 0xD317, 0xBB53, + 0xD318, 0xBB54, 0xD319, 0xBB55, 0xD31A, 0xBB56, 0xD31B, 0xBB57, + 0xD31C, 0xC6CA, 0xD31D, 0xC6CB, 0xD31E, 0xBB58, 0xD31F, 0xC6CC, + 0xD320, 0xC6CD, 0xD321, 0xC6CE, 0xD322, 0xBB59, 0xD323, 0xBB5A, + 0xD324, 0xBB61, 0xD325, 0xC6CF, 0xD326, 0xBB62, 0xD327, 0xBB63, + 0xD328, 0xC6D0, 0xD329, 0xC6D1, 0xD32A, 0xBB64, 0xD32B, 0xBB65, + 0xD32C, 0xC6D2, 0xD32D, 0xBB66, 0xD32E, 0xBB67, 0xD32F, 0xBB68, + 0xD330, 0xC6D3, 0xD331, 0xBB69, 0xD332, 0xBB6A, 0xD333, 0xBB6B, + 0xD334, 0xBB6C, 0xD335, 0xBB6D, 0xD336, 0xBB6E, 0xD337, 0xBB6F, + 0xD338, 0xC6D4, 0xD339, 0xC6D5, 0xD33A, 0xBB70, 0xD33B, 0xC6D6, + 0xD33C, 0xC6D7, 0xD33D, 0xC6D8, 0xD33E, 0xBB71, 0xD33F, 0xBB72, + 0xD340, 0xBB73, 0xD341, 0xBB74, 0xD342, 0xBB75, 0xD343, 0xBB76, + 0xD344, 0xC6D9, 0xD345, 0xC6DA, 0xD346, 0xBB77, 0xD347, 0xBB78, + 0xD348, 0xBB79, 0xD349, 0xBB7A, 0xD34A, 0xBB81, 0xD34B, 0xBB82, + 0xD34C, 0xBB83, 0xD34D, 0xBB84, 0xD34E, 0xBB85, 0xD34F, 0xBB86, + 0xD350, 0xBB87, 0xD351, 0xBB88, 0xD352, 0xBB89, 0xD353, 0xBB8A, + 0xD354, 0xBB8B, 0xD355, 0xBB8C, 0xD356, 0xBB8D, 0xD357, 0xBB8E, + 0xD358, 0xBB8F, 0xD359, 0xBB90, 0xD35A, 0xBB91, 0xD35B, 0xBB92, + 0xD35C, 0xBB93, 0xD35D, 0xBB94, 0xD35E, 0xBB95, 0xD35F, 0xBB96, + 0xD360, 0xBB97, 0xD361, 0xBB98, 0xD362, 0xBB99, 0xD363, 0xBB9A, + 0xD364, 0xBB9B, 0xD365, 0xBB9C, 0xD366, 0xBB9D, 0xD367, 0xBB9E, + 0xD368, 0xBB9F, 0xD369, 0xBBA0, 0xD36A, 0xBC41, 0xD36B, 0xBC42, + 0xD36C, 0xBC43, 0xD36D, 0xBC44, 0xD36E, 0xBC45, 0xD36F, 0xBC46, + 0xD370, 0xBC47, 0xD371, 0xBC48, 0xD372, 0xBC49, 0xD373, 0xBC4A, + 0xD374, 0xBC4B, 0xD375, 0xBC4C, 0xD376, 0xBC4D, 0xD377, 0xBC4E, + 0xD378, 0xBC4F, 0xD379, 0xBC50, 0xD37A, 0xBC51, 0xD37B, 0xBC52, + 0xD37C, 0xC6DB, 0xD37D, 0xC6DC, 0xD37E, 0xBC53, 0xD37F, 0xBC54, + 0xD380, 0xC6DD, 0xD381, 0xBC55, 0xD382, 0xBC56, 0xD383, 0xBC57, + 0xD384, 0xC6DE, 0xD385, 0xBC58, 0xD386, 0xBC59, 0xD387, 0xBC5A, + 0xD388, 0xBC61, 0xD389, 0xBC62, 0xD38A, 0xBC63, 0xD38B, 0xBC64, + 0xD38C, 0xC6DF, 0xD38D, 0xC6E0, 0xD38E, 0xBC65, 0xD38F, 0xC6E1, + 0xD390, 0xC6E2, 0xD391, 0xC6E3, 0xD392, 0xBC66, 0xD393, 0xBC67, + 0xD394, 0xBC68, 0xD395, 0xBC69, 0xD396, 0xBC6A, 0xD397, 0xBC6B, + 0xD398, 0xC6E4, 0xD399, 0xC6E5, 0xD39A, 0xBC6C, 0xD39B, 0xBC6D, + 0xD39C, 0xC6E6, 0xD39D, 0xBC6E, 0xD39E, 0xBC6F, 0xD39F, 0xBC70, + 0xD3A0, 0xC6E7, 0xD3A1, 0xBC71, 0xD3A2, 0xBC72, 0xD3A3, 0xBC73, + 0xD3A4, 0xBC74, 0xD3A5, 0xBC75, 0xD3A6, 0xBC76, 0xD3A7, 0xBC77, + 0xD3A8, 0xC6E8, 0xD3A9, 0xC6E9, 0xD3AA, 0xBC78, 0xD3AB, 0xC6EA, + 0xD3AC, 0xBC79, 0xD3AD, 0xC6EB, 0xD3AE, 0xBC7A, 0xD3AF, 0xBC81, + 0xD3B0, 0xBC82, 0xD3B1, 0xBC83, 0xD3B2, 0xBC84, 0xD3B3, 0xBC85, + 0xD3B4, 0xC6EC, 0xD3B5, 0xBC86, 0xD3B6, 0xBC87, 0xD3B7, 0xBC88, + 0xD3B8, 0xC6ED, 0xD3B9, 0xBC89, 0xD3BA, 0xBC8A, 0xD3BB, 0xBC8B, + 0xD3BC, 0xC6EE, 0xD3BD, 0xBC8C, 0xD3BE, 0xBC8D, 0xD3BF, 0xBC8E, + 0xD3C0, 0xBC8F, 0xD3C1, 0xBC90, 0xD3C2, 0xBC91, 0xD3C3, 0xBC92, + 0xD3C4, 0xC6EF, 0xD3C5, 0xC6F0, 0xD3C6, 0xBC93, 0xD3C7, 0xBC94, + 0xD3C8, 0xC6F1, 0xD3C9, 0xC6F2, 0xD3CA, 0xBC95, 0xD3CB, 0xBC96, + 0xD3CC, 0xBC97, 0xD3CD, 0xBC98, 0xD3CE, 0xBC99, 0xD3CF, 0xBC9A, + 0xD3D0, 0xC6F3, 0xD3D1, 0xBC9B, 0xD3D2, 0xBC9C, 0xD3D3, 0xBC9D, + 0xD3D4, 0xBC9E, 0xD3D5, 0xBC9F, 0xD3D6, 0xBCA0, 0xD3D7, 0xBD41, + 0xD3D8, 0xC6F4, 0xD3D9, 0xBD42, 0xD3DA, 0xBD43, 0xD3DB, 0xBD44, + 0xD3DC, 0xBD45, 0xD3DD, 0xBD46, 0xD3DE, 0xBD47, 0xD3DF, 0xBD48, + 0xD3E0, 0xBD49, 0xD3E1, 0xC6F5, 0xD3E2, 0xBD4A, 0xD3E3, 0xC6F6, + 0xD3E4, 0xBD4B, 0xD3E5, 0xBD4C, 0xD3E6, 0xBD4D, 0xD3E7, 0xBD4E, + 0xD3E8, 0xBD4F, 0xD3E9, 0xBD50, 0xD3EA, 0xBD51, 0xD3EB, 0xBD52, + 0xD3EC, 0xC6F7, 0xD3ED, 0xC6F8, 0xD3EE, 0xBD53, 0xD3EF, 0xBD54, + 0xD3F0, 0xC6F9, 0xD3F1, 0xBD55, 0xD3F2, 0xBD56, 0xD3F3, 0xBD57, + 0xD3F4, 0xC6FA, 0xD3F5, 0xBD58, 0xD3F6, 0xBD59, 0xD3F7, 0xBD5A, + 0xD3F8, 0xBD61, 0xD3F9, 0xBD62, 0xD3FA, 0xBD63, 0xD3FB, 0xBD64, + 0xD3FC, 0xC6FB, 0xD3FD, 0xC6FC, 0xD3FE, 0xBD65, 0xD3FF, 0xC6FD, + 0xD400, 0xBD66, 0xD401, 0xC6FE, 0xD402, 0xBD67, 0xD403, 0xBD68, + 0xD404, 0xBD69, 0xD405, 0xBD6A, 0xD406, 0xBD6B, 0xD407, 0xBD6C, + 0xD408, 0xC7A1, 0xD409, 0xBD6D, 0xD40A, 0xBD6E, 0xD40B, 0xBD6F, + 0xD40C, 0xBD70, 0xD40D, 0xBD71, 0xD40E, 0xBD72, 0xD40F, 0xBD73, + 0xD410, 0xBD74, 0xD411, 0xBD75, 0xD412, 0xBD76, 0xD413, 0xBD77, + 0xD414, 0xBD78, 0xD415, 0xBD79, 0xD416, 0xBD7A, 0xD417, 0xBD81, + 0xD418, 0xBD82, 0xD419, 0xBD83, 0xD41A, 0xBD84, 0xD41B, 0xBD85, + 0xD41C, 0xBD86, 0xD41D, 0xC7A2, 0xD41E, 0xBD87, 0xD41F, 0xBD88, + 0xD420, 0xBD89, 0xD421, 0xBD8A, 0xD422, 0xBD8B, 0xD423, 0xBD8C, + 0xD424, 0xBD8D, 0xD425, 0xBD8E, 0xD426, 0xBD8F, 0xD427, 0xBD90, + 0xD428, 0xBD91, 0xD429, 0xBD92, 0xD42A, 0xBD93, 0xD42B, 0xBD94, + 0xD42C, 0xBD95, 0xD42D, 0xBD96, 0xD42E, 0xBD97, 0xD42F, 0xBD98, + 0xD430, 0xBD99, 0xD431, 0xBD9A, 0xD432, 0xBD9B, 0xD433, 0xBD9C, + 0xD434, 0xBD9D, 0xD435, 0xBD9E, 0xD436, 0xBD9F, 0xD437, 0xBDA0, + 0xD438, 0xBE41, 0xD439, 0xBE42, 0xD43A, 0xBE43, 0xD43B, 0xBE44, + 0xD43C, 0xBE45, 0xD43D, 0xBE46, 0xD43E, 0xBE47, 0xD43F, 0xBE48, + 0xD440, 0xC7A3, 0xD441, 0xBE49, 0xD442, 0xBE4A, 0xD443, 0xBE4B, + 0xD444, 0xC7A4, 0xD445, 0xBE4C, 0xD446, 0xBE4D, 0xD447, 0xBE4E, + 0xD448, 0xBE4F, 0xD449, 0xBE50, 0xD44A, 0xBE51, 0xD44B, 0xBE52, + 0xD44C, 0xBE53, 0xD44D, 0xBE54, 0xD44E, 0xBE55, 0xD44F, 0xBE56, + 0xD450, 0xBE57, 0xD451, 0xBE58, 0xD452, 0xBE59, 0xD453, 0xBE5A, + 0xD454, 0xBE61, 0xD455, 0xBE62, 0xD456, 0xBE63, 0xD457, 0xBE64, + 0xD458, 0xBE65, 0xD459, 0xBE66, 0xD45A, 0xBE67, 0xD45B, 0xBE68, + 0xD45C, 0xC7A5, 0xD45D, 0xBE69, 0xD45E, 0xBE6A, 0xD45F, 0xBE6B, + 0xD460, 0xC7A6, 0xD461, 0xBE6C, 0xD462, 0xBE6D, 0xD463, 0xBE6E, + 0xD464, 0xC7A7, 0xD465, 0xBE6F, 0xD466, 0xBE70, 0xD467, 0xBE71, + 0xD468, 0xBE72, 0xD469, 0xBE73, 0xD46A, 0xBE74, 0xD46B, 0xBE75, + 0xD46C, 0xBE76, 0xD46D, 0xC7A8, 0xD46E, 0xBE77, 0xD46F, 0xC7A9, + 0xD470, 0xBE78, 0xD471, 0xBE79, 0xD472, 0xBE7A, 0xD473, 0xBE81, + 0xD474, 0xBE82, 0xD475, 0xBE83, 0xD476, 0xBE84, 0xD477, 0xBE85, + 0xD478, 0xC7AA, 0xD479, 0xC7AB, 0xD47A, 0xBE86, 0xD47B, 0xBE87, + 0xD47C, 0xC7AC, 0xD47D, 0xBE88, 0xD47E, 0xBE89, 0xD47F, 0xC7AD, + 0xD480, 0xC7AE, 0xD481, 0xBE8A, 0xD482, 0xC7AF, 0xD483, 0xBE8B, + 0xD484, 0xBE8C, 0xD485, 0xBE8D, 0xD486, 0xBE8E, 0xD487, 0xBE8F, + 0xD488, 0xC7B0, 0xD489, 0xC7B1, 0xD48A, 0xBE90, 0xD48B, 0xC7B2, + 0xD48C, 0xBE91, 0xD48D, 0xC7B3, 0xD48E, 0xBE92, 0xD48F, 0xBE93, + 0xD490, 0xBE94, 0xD491, 0xBE95, 0xD492, 0xBE96, 0xD493, 0xBE97, + 0xD494, 0xC7B4, 0xD495, 0xBE98, 0xD496, 0xBE99, 0xD497, 0xBE9A, + 0xD498, 0xBE9B, 0xD499, 0xBE9C, 0xD49A, 0xBE9D, 0xD49B, 0xBE9E, + 0xD49C, 0xBE9F, 0xD49D, 0xBEA0, 0xD49E, 0xBF41, 0xD49F, 0xBF42, + 0xD4A0, 0xBF43, 0xD4A1, 0xBF44, 0xD4A2, 0xBF45, 0xD4A3, 0xBF46, + 0xD4A4, 0xBF47, 0xD4A5, 0xBF48, 0xD4A6, 0xBF49, 0xD4A7, 0xBF4A, + 0xD4A8, 0xBF4B, 0xD4A9, 0xC7B5, 0xD4AA, 0xBF4C, 0xD4AB, 0xBF4D, + 0xD4AC, 0xBF4E, 0xD4AD, 0xBF4F, 0xD4AE, 0xBF50, 0xD4AF, 0xBF51, + 0xD4B0, 0xBF52, 0xD4B1, 0xBF53, 0xD4B2, 0xBF54, 0xD4B3, 0xBF55, + 0xD4B4, 0xBF56, 0xD4B5, 0xBF57, 0xD4B6, 0xBF58, 0xD4B7, 0xBF59, + 0xD4B8, 0xBF5A, 0xD4B9, 0xBF61, 0xD4BA, 0xBF62, 0xD4BB, 0xBF63, + 0xD4BC, 0xBF64, 0xD4BD, 0xBF65, 0xD4BE, 0xBF66, 0xD4BF, 0xBF67, + 0xD4C0, 0xBF68, 0xD4C1, 0xBF69, 0xD4C2, 0xBF6A, 0xD4C3, 0xBF6B, + 0xD4C4, 0xBF6C, 0xD4C5, 0xBF6D, 0xD4C6, 0xBF6E, 0xD4C7, 0xBF6F, + 0xD4C8, 0xBF70, 0xD4C9, 0xBF71, 0xD4CA, 0xBF72, 0xD4CB, 0xBF73, + 0xD4CC, 0xC7B6, 0xD4CD, 0xBF74, 0xD4CE, 0xBF75, 0xD4CF, 0xBF76, + 0xD4D0, 0xC7B7, 0xD4D1, 0xBF77, 0xD4D2, 0xBF78, 0xD4D3, 0xBF79, + 0xD4D4, 0xC7B8, 0xD4D5, 0xBF7A, 0xD4D6, 0xBF81, 0xD4D7, 0xBF82, + 0xD4D8, 0xBF83, 0xD4D9, 0xBF84, 0xD4DA, 0xBF85, 0xD4DB, 0xBF86, + 0xD4DC, 0xC7B9, 0xD4DD, 0xBF87, 0xD4DE, 0xBF88, 0xD4DF, 0xC7BA, + 0xD4E0, 0xBF89, 0xD4E1, 0xBF8A, 0xD4E2, 0xBF8B, 0xD4E3, 0xBF8C, + 0xD4E4, 0xBF8D, 0xD4E5, 0xBF8E, 0xD4E6, 0xBF8F, 0xD4E7, 0xBF90, + 0xD4E8, 0xC7BB, 0xD4E9, 0xBF91, 0xD4EA, 0xBF92, 0xD4EB, 0xBF93, + 0xD4EC, 0xC7BC, 0xD4ED, 0xBF94, 0xD4EE, 0xBF95, 0xD4EF, 0xBF96, + 0xD4F0, 0xC7BD, 0xD4F1, 0xBF97, 0xD4F2, 0xBF98, 0xD4F3, 0xBF99, + 0xD4F4, 0xBF9A, 0xD4F5, 0xBF9B, 0xD4F6, 0xBF9C, 0xD4F7, 0xBF9D, + 0xD4F8, 0xC7BE, 0xD4F9, 0xBF9E, 0xD4FA, 0xBF9F, 0xD4FB, 0xC7BF, + 0xD4FC, 0xBFA0, 0xD4FD, 0xC7C0, 0xD4FE, 0xC041, 0xD4FF, 0xC042, + 0xD500, 0xC043, 0xD501, 0xC044, 0xD502, 0xC045, 0xD503, 0xC046, + 0xD504, 0xC7C1, 0xD505, 0xC047, 0xD506, 0xC048, 0xD507, 0xC049, + 0xD508, 0xC7C2, 0xD509, 0xC04A, 0xD50A, 0xC04B, 0xD50B, 0xC04C, + 0xD50C, 0xC7C3, 0xD50D, 0xC04D, 0xD50E, 0xC04E, 0xD50F, 0xC04F, + 0xD510, 0xC050, 0xD511, 0xC051, 0xD512, 0xC052, 0xD513, 0xC053, + 0xD514, 0xC7C4, 0xD515, 0xC7C5, 0xD516, 0xC054, 0xD517, 0xC7C6, + 0xD518, 0xC055, 0xD519, 0xC056, 0xD51A, 0xC057, 0xD51B, 0xC058, + 0xD51C, 0xC059, 0xD51D, 0xC05A, 0xD51E, 0xC061, 0xD51F, 0xC062, + 0xD520, 0xC063, 0xD521, 0xC064, 0xD522, 0xC065, 0xD523, 0xC066, + 0xD524, 0xC067, 0xD525, 0xC068, 0xD526, 0xC069, 0xD527, 0xC06A, + 0xD528, 0xC06B, 0xD529, 0xC06C, 0xD52A, 0xC06D, 0xD52B, 0xC06E, + 0xD52C, 0xC06F, 0xD52D, 0xC070, 0xD52E, 0xC071, 0xD52F, 0xC072, + 0xD530, 0xC073, 0xD531, 0xC074, 0xD532, 0xC075, 0xD533, 0xC076, + 0xD534, 0xC077, 0xD535, 0xC078, 0xD536, 0xC079, 0xD537, 0xC07A, + 0xD538, 0xC081, 0xD539, 0xC082, 0xD53A, 0xC083, 0xD53B, 0xC084, + 0xD53C, 0xC7C7, 0xD53D, 0xC7C8, 0xD53E, 0xC085, 0xD53F, 0xC086, + 0xD540, 0xC7C9, 0xD541, 0xC087, 0xD542, 0xC088, 0xD543, 0xC089, + 0xD544, 0xC7CA, 0xD545, 0xC08A, 0xD546, 0xC08B, 0xD547, 0xC08C, + 0xD548, 0xC08D, 0xD549, 0xC08E, 0xD54A, 0xC08F, 0xD54B, 0xC090, + 0xD54C, 0xC7CB, 0xD54D, 0xC7CC, 0xD54E, 0xC091, 0xD54F, 0xC7CD, + 0xD550, 0xC092, 0xD551, 0xC7CE, 0xD552, 0xC093, 0xD553, 0xC094, + 0xD554, 0xC095, 0xD555, 0xC096, 0xD556, 0xC097, 0xD557, 0xC098, + 0xD558, 0xC7CF, 0xD559, 0xC7D0, 0xD55A, 0xC099, 0xD55B, 0xC09A, + 0xD55C, 0xC7D1, 0xD55D, 0xC09B, 0xD55E, 0xC09C, 0xD55F, 0xC09D, + 0xD560, 0xC7D2, 0xD561, 0xC09E, 0xD562, 0xC09F, 0xD563, 0xC0A0, + 0xD564, 0xC141, 0xD565, 0xC7D3, 0xD566, 0xC142, 0xD567, 0xC143, + 0xD568, 0xC7D4, 0xD569, 0xC7D5, 0xD56A, 0xC144, 0xD56B, 0xC7D6, + 0xD56C, 0xC145, 0xD56D, 0xC7D7, 0xD56E, 0xC146, 0xD56F, 0xC147, + 0xD570, 0xC148, 0xD571, 0xC149, 0xD572, 0xC14A, 0xD573, 0xC14B, + 0xD574, 0xC7D8, 0xD575, 0xC7D9, 0xD576, 0xC14C, 0xD577, 0xC14D, + 0xD578, 0xC7DA, 0xD579, 0xC14E, 0xD57A, 0xC14F, 0xD57B, 0xC150, + 0xD57C, 0xC7DB, 0xD57D, 0xC151, 0xD57E, 0xC152, 0xD57F, 0xC153, + 0xD580, 0xC154, 0xD581, 0xC155, 0xD582, 0xC156, 0xD583, 0xC157, + 0xD584, 0xC7DC, 0xD585, 0xC7DD, 0xD586, 0xC158, 0xD587, 0xC7DE, + 0xD588, 0xC7DF, 0xD589, 0xC7E0, 0xD58A, 0xC159, 0xD58B, 0xC15A, + 0xD58C, 0xC161, 0xD58D, 0xC162, 0xD58E, 0xC163, 0xD58F, 0xC164, + 0xD590, 0xC7E1, 0xD591, 0xC165, 0xD592, 0xC166, 0xD593, 0xC167, + 0xD594, 0xC168, 0xD595, 0xC169, 0xD596, 0xC16A, 0xD597, 0xC16B, + 0xD598, 0xC16C, 0xD599, 0xC16D, 0xD59A, 0xC16E, 0xD59B, 0xC16F, + 0xD59C, 0xC170, 0xD59D, 0xC171, 0xD59E, 0xC172, 0xD59F, 0xC173, + 0xD5A0, 0xC174, 0xD5A1, 0xC175, 0xD5A2, 0xC176, 0xD5A3, 0xC177, + 0xD5A4, 0xC178, 0xD5A5, 0xC7E2, 0xD5A6, 0xC179, 0xD5A7, 0xC17A, + 0xD5A8, 0xC181, 0xD5A9, 0xC182, 0xD5AA, 0xC183, 0xD5AB, 0xC184, + 0xD5AC, 0xC185, 0xD5AD, 0xC186, 0xD5AE, 0xC187, 0xD5AF, 0xC188, + 0xD5B0, 0xC189, 0xD5B1, 0xC18A, 0xD5B2, 0xC18B, 0xD5B3, 0xC18C, + 0xD5B4, 0xC18D, 0xD5B5, 0xC18E, 0xD5B6, 0xC18F, 0xD5B7, 0xC190, + 0xD5B8, 0xC191, 0xD5B9, 0xC192, 0xD5BA, 0xC193, 0xD5BB, 0xC194, + 0xD5BC, 0xC195, 0xD5BD, 0xC196, 0xD5BE, 0xC197, 0xD5BF, 0xC198, + 0xD5C0, 0xC199, 0xD5C1, 0xC19A, 0xD5C2, 0xC19B, 0xD5C3, 0xC19C, + 0xD5C4, 0xC19D, 0xD5C5, 0xC19E, 0xD5C6, 0xC19F, 0xD5C7, 0xC1A0, + 0xD5C8, 0xC7E3, 0xD5C9, 0xC7E4, 0xD5CA, 0xC241, 0xD5CB, 0xC242, + 0xD5CC, 0xC7E5, 0xD5CD, 0xC243, 0xD5CE, 0xC244, 0xD5CF, 0xC245, + 0xD5D0, 0xC7E6, 0xD5D1, 0xC246, 0xD5D2, 0xC7E7, 0xD5D3, 0xC247, + 0xD5D4, 0xC248, 0xD5D5, 0xC249, 0xD5D6, 0xC24A, 0xD5D7, 0xC24B, + 0xD5D8, 0xC7E8, 0xD5D9, 0xC7E9, 0xD5DA, 0xC24C, 0xD5DB, 0xC7EA, + 0xD5DC, 0xC24D, 0xD5DD, 0xC7EB, 0xD5DE, 0xC24E, 0xD5DF, 0xC24F, + 0xD5E0, 0xC250, 0xD5E1, 0xC251, 0xD5E2, 0xC252, 0xD5E3, 0xC253, + 0xD5E4, 0xC7EC, 0xD5E5, 0xC7ED, 0xD5E6, 0xC254, 0xD5E7, 0xC255, + 0xD5E8, 0xC7EE, 0xD5E9, 0xC256, 0xD5EA, 0xC257, 0xD5EB, 0xC258, + 0xD5EC, 0xC7EF, 0xD5ED, 0xC259, 0xD5EE, 0xC25A, 0xD5EF, 0xC261, + 0xD5F0, 0xC262, 0xD5F1, 0xC263, 0xD5F2, 0xC264, 0xD5F3, 0xC265, + 0xD5F4, 0xC7F0, 0xD5F5, 0xC7F1, 0xD5F6, 0xC266, 0xD5F7, 0xC7F2, + 0xD5F8, 0xC267, 0xD5F9, 0xC7F3, 0xD5FA, 0xC268, 0xD5FB, 0xC269, + 0xD5FC, 0xC26A, 0xD5FD, 0xC26B, 0xD5FE, 0xC26C, 0xD5FF, 0xC26D, + 0xD600, 0xC7F4, 0xD601, 0xC7F5, 0xD602, 0xC26E, 0xD603, 0xC26F, + 0xD604, 0xC7F6, 0xD605, 0xC270, 0xD606, 0xC271, 0xD607, 0xC272, + 0xD608, 0xC7F7, 0xD609, 0xC273, 0xD60A, 0xC274, 0xD60B, 0xC275, + 0xD60C, 0xC276, 0xD60D, 0xC277, 0xD60E, 0xC278, 0xD60F, 0xC279, + 0xD610, 0xC7F8, 0xD611, 0xC7F9, 0xD612, 0xC27A, 0xD613, 0xC7FA, + 0xD614, 0xC7FB, 0xD615, 0xC7FC, 0xD616, 0xC281, 0xD617, 0xC282, + 0xD618, 0xC283, 0xD619, 0xC284, 0xD61A, 0xC285, 0xD61B, 0xC286, + 0xD61C, 0xC7FD, 0xD61D, 0xC287, 0xD61E, 0xC288, 0xD61F, 0xC289, + 0xD620, 0xC7FE, 0xD621, 0xC28A, 0xD622, 0xC28B, 0xD623, 0xC28C, + 0xD624, 0xC8A1, 0xD625, 0xC28D, 0xD626, 0xC28E, 0xD627, 0xC28F, + 0xD628, 0xC290, 0xD629, 0xC291, 0xD62A, 0xC292, 0xD62B, 0xC293, + 0xD62C, 0xC294, 0xD62D, 0xC8A2, 0xD62E, 0xC295, 0xD62F, 0xC296, + 0xD630, 0xC297, 0xD631, 0xC298, 0xD632, 0xC299, 0xD633, 0xC29A, + 0xD634, 0xC29B, 0xD635, 0xC29C, 0xD636, 0xC29D, 0xD637, 0xC29E, + 0xD638, 0xC8A3, 0xD639, 0xC8A4, 0xD63A, 0xC29F, 0xD63B, 0xC2A0, + 0xD63C, 0xC8A5, 0xD63D, 0xC341, 0xD63E, 0xC342, 0xD63F, 0xC343, + 0xD640, 0xC8A6, 0xD641, 0xC344, 0xD642, 0xC345, 0xD643, 0xC346, + 0xD644, 0xC347, 0xD645, 0xC8A7, 0xD646, 0xC348, 0xD647, 0xC349, + 0xD648, 0xC8A8, 0xD649, 0xC8A9, 0xD64A, 0xC34A, 0xD64B, 0xC8AA, + 0xD64C, 0xC34B, 0xD64D, 0xC8AB, 0xD64E, 0xC34C, 0xD64F, 0xC34D, + 0xD650, 0xC34E, 0xD651, 0xC8AC, 0xD652, 0xC34F, 0xD653, 0xC350, + 0xD654, 0xC8AD, 0xD655, 0xC8AE, 0xD656, 0xC351, 0xD657, 0xC352, + 0xD658, 0xC8AF, 0xD659, 0xC353, 0xD65A, 0xC354, 0xD65B, 0xC355, + 0xD65C, 0xC8B0, 0xD65D, 0xC356, 0xD65E, 0xC357, 0xD65F, 0xC358, + 0xD660, 0xC359, 0xD661, 0xC35A, 0xD662, 0xC361, 0xD663, 0xC362, + 0xD664, 0xC363, 0xD665, 0xC364, 0xD666, 0xC365, 0xD667, 0xC8B1, + 0xD668, 0xC366, 0xD669, 0xC8B2, 0xD66A, 0xC367, 0xD66B, 0xC368, + 0xD66C, 0xC369, 0xD66D, 0xC36A, 0xD66E, 0xC36B, 0xD66F, 0xC36C, + 0xD670, 0xC8B3, 0xD671, 0xC8B4, 0xD672, 0xC36D, 0xD673, 0xC36E, + 0xD674, 0xC8B5, 0xD675, 0xC36F, 0xD676, 0xC370, 0xD677, 0xC371, + 0xD678, 0xC372, 0xD679, 0xC373, 0xD67A, 0xC374, 0xD67B, 0xC375, + 0xD67C, 0xC376, 0xD67D, 0xC377, 0xD67E, 0xC378, 0xD67F, 0xC379, + 0xD680, 0xC37A, 0xD681, 0xC381, 0xD682, 0xC382, 0xD683, 0xC8B6, + 0xD684, 0xC383, 0xD685, 0xC8B7, 0xD686, 0xC384, 0xD687, 0xC385, + 0xD688, 0xC386, 0xD689, 0xC387, 0xD68A, 0xC388, 0xD68B, 0xC389, + 0xD68C, 0xC8B8, 0xD68D, 0xC8B9, 0xD68E, 0xC38A, 0xD68F, 0xC38B, + 0xD690, 0xC8BA, 0xD691, 0xC38C, 0xD692, 0xC38D, 0xD693, 0xC38E, + 0xD694, 0xC8BB, 0xD695, 0xC38F, 0xD696, 0xC390, 0xD697, 0xC391, + 0xD698, 0xC392, 0xD699, 0xC393, 0xD69A, 0xC394, 0xD69B, 0xC395, + 0xD69C, 0xC396, 0xD69D, 0xC8BC, 0xD69E, 0xC397, 0xD69F, 0xC8BD, + 0xD6A0, 0xC398, 0xD6A1, 0xC8BE, 0xD6A2, 0xC399, 0xD6A3, 0xC39A, + 0xD6A4, 0xC39B, 0xD6A5, 0xC39C, 0xD6A6, 0xC39D, 0xD6A7, 0xC39E, + 0xD6A8, 0xC8BF, 0xD6A9, 0xC39F, 0xD6AA, 0xC3A0, 0xD6AB, 0xC441, + 0xD6AC, 0xC8C0, 0xD6AD, 0xC442, 0xD6AE, 0xC443, 0xD6AF, 0xC444, + 0xD6B0, 0xC8C1, 0xD6B1, 0xC445, 0xD6B2, 0xC446, 0xD6B3, 0xC447, + 0xD6B4, 0xC448, 0xD6B5, 0xC449, 0xD6B6, 0xC44A, 0xD6B7, 0xC44B, + 0xD6B8, 0xC44C, 0xD6B9, 0xC8C2, 0xD6BA, 0xC44D, 0xD6BB, 0xC8C3, + 0xD6BC, 0xC44E, 0xD6BD, 0xC44F, 0xD6BE, 0xC450, 0xD6BF, 0xC451, + 0xD6C0, 0xC452, 0xD6C1, 0xC453, 0xD6C2, 0xC454, 0xD6C3, 0xC455, + 0xD6C4, 0xC8C4, 0xD6C5, 0xC8C5, 0xD6C6, 0xC456, 0xD6C7, 0xC457, + 0xD6C8, 0xC8C6, 0xD6C9, 0xC458, 0xD6CA, 0xC459, 0xD6CB, 0xC45A, + 0xD6CC, 0xC8C7, 0xD6CD, 0xC461, 0xD6CE, 0xC462, 0xD6CF, 0xC463, + 0xD6D0, 0xC464, 0xD6D1, 0xC8C8, 0xD6D2, 0xC465, 0xD6D3, 0xC466, + 0xD6D4, 0xC8C9, 0xD6D5, 0xC467, 0xD6D6, 0xC468, 0xD6D7, 0xC8CA, + 0xD6D8, 0xC469, 0xD6D9, 0xC8CB, 0xD6DA, 0xC46A, 0xD6DB, 0xC46B, + 0xD6DC, 0xC46C, 0xD6DD, 0xC46D, 0xD6DE, 0xC46E, 0xD6DF, 0xC46F, + 0xD6E0, 0xC8CC, 0xD6E1, 0xC470, 0xD6E2, 0xC471, 0xD6E3, 0xC472, + 0xD6E4, 0xC8CD, 0xD6E5, 0xC473, 0xD6E6, 0xC474, 0xD6E7, 0xC475, + 0xD6E8, 0xC8CE, 0xD6E9, 0xC476, 0xD6EA, 0xC477, 0xD6EB, 0xC478, + 0xD6EC, 0xC479, 0xD6ED, 0xC47A, 0xD6EE, 0xC481, 0xD6EF, 0xC482, + 0xD6F0, 0xC8CF, 0xD6F1, 0xC483, 0xD6F2, 0xC484, 0xD6F3, 0xC485, + 0xD6F4, 0xC486, 0xD6F5, 0xC8D0, 0xD6F6, 0xC487, 0xD6F7, 0xC488, + 0xD6F8, 0xC489, 0xD6F9, 0xC48A, 0xD6FA, 0xC48B, 0xD6FB, 0xC48C, + 0xD6FC, 0xC8D1, 0xD6FD, 0xC8D2, 0xD6FE, 0xC48D, 0xD6FF, 0xC48E, + 0xD700, 0xC8D3, 0xD701, 0xC48F, 0xD702, 0xC490, 0xD703, 0xC491, + 0xD704, 0xC8D4, 0xD705, 0xC492, 0xD706, 0xC493, 0xD707, 0xC494, + 0xD708, 0xC495, 0xD709, 0xC496, 0xD70A, 0xC497, 0xD70B, 0xC498, + 0xD70C, 0xC499, 0xD70D, 0xC49A, 0xD70E, 0xC49B, 0xD70F, 0xC49C, + 0xD710, 0xC49D, 0xD711, 0xC8D5, 0xD712, 0xC49E, 0xD713, 0xC49F, + 0xD714, 0xC4A0, 0xD715, 0xC541, 0xD716, 0xC542, 0xD717, 0xC543, + 0xD718, 0xC8D6, 0xD719, 0xC8D7, 0xD71A, 0xC544, 0xD71B, 0xC545, + 0xD71C, 0xC8D8, 0xD71D, 0xC546, 0xD71E, 0xC547, 0xD71F, 0xC548, + 0xD720, 0xC8D9, 0xD721, 0xC549, 0xD722, 0xC54A, 0xD723, 0xC54B, + 0xD724, 0xC54C, 0xD725, 0xC54D, 0xD726, 0xC54E, 0xD727, 0xC54F, + 0xD728, 0xC8DA, 0xD729, 0xC8DB, 0xD72A, 0xC550, 0xD72B, 0xC8DC, + 0xD72C, 0xC551, 0xD72D, 0xC8DD, 0xD72E, 0xC552, 0xD72F, 0xC553, + 0xD730, 0xC554, 0xD731, 0xC555, 0xD732, 0xC556, 0xD733, 0xC557, + 0xD734, 0xC8DE, 0xD735, 0xC8DF, 0xD736, 0xC558, 0xD737, 0xC559, + 0xD738, 0xC8E0, 0xD739, 0xC55A, 0xD73A, 0xC561, 0xD73B, 0xC562, + 0xD73C, 0xC8E1, 0xD73D, 0xC563, 0xD73E, 0xC564, 0xD73F, 0xC565, + 0xD740, 0xC566, 0xD741, 0xC567, 0xD742, 0xC568, 0xD743, 0xC569, + 0xD744, 0xC8E2, 0xD745, 0xC56A, 0xD746, 0xC56B, 0xD747, 0xC8E3, + 0xD748, 0xC56C, 0xD749, 0xC8E4, 0xD74A, 0xC56D, 0xD74B, 0xC56E, + 0xD74C, 0xC56F, 0xD74D, 0xC570, 0xD74E, 0xC571, 0xD74F, 0xC572, + 0xD750, 0xC8E5, 0xD751, 0xC8E6, 0xD752, 0xC573, 0xD753, 0xC574, + 0xD754, 0xC8E7, 0xD755, 0xC575, 0xD756, 0xC8E8, 0xD757, 0xC8E9, + 0xD758, 0xC8EA, 0xD759, 0xC8EB, 0xD75A, 0xC576, 0xD75B, 0xC577, + 0xD75C, 0xC578, 0xD75D, 0xC579, 0xD75E, 0xC57A, 0xD75F, 0xC581, + 0xD760, 0xC8EC, 0xD761, 0xC8ED, 0xD762, 0xC582, 0xD763, 0xC8EE, + 0xD764, 0xC583, 0xD765, 0xC8EF, 0xD766, 0xC584, 0xD767, 0xC585, + 0xD768, 0xC586, 0xD769, 0xC8F0, 0xD76A, 0xC587, 0xD76B, 0xC588, + 0xD76C, 0xC8F1, 0xD76D, 0xC589, 0xD76E, 0xC58A, 0xD76F, 0xC58B, + 0xD770, 0xC8F2, 0xD771, 0xC58C, 0xD772, 0xC58D, 0xD773, 0xC58E, + 0xD774, 0xC8F3, 0xD775, 0xC58F, 0xD776, 0xC590, 0xD777, 0xC591, + 0xD778, 0xC592, 0xD779, 0xC593, 0xD77A, 0xC594, 0xD77B, 0xC595, + 0xD77C, 0xC8F4, 0xD77D, 0xC8F5, 0xD77E, 0xC596, 0xD77F, 0xC597, + 0xD780, 0xC598, 0xD781, 0xC8F6, 0xD782, 0xC599, 0xD783, 0xC59A, + 0xD784, 0xC59B, 0xD785, 0xC59C, 0xD786, 0xC59D, 0xD787, 0xC59E, + 0xD788, 0xC8F7, 0xD789, 0xC8F8, 0xD78A, 0xC59F, 0xD78B, 0xC5A0, + 0xD78C, 0xC8F9, 0xD78D, 0xC641, 0xD78E, 0xC642, 0xD78F, 0xC643, + 0xD790, 0xC8FA, 0xD791, 0xC644, 0xD792, 0xC645, 0xD793, 0xC646, + 0xD794, 0xC647, 0xD795, 0xC648, 0xD796, 0xC649, 0xD797, 0xC64A, + 0xD798, 0xC8FB, 0xD799, 0xC8FC, 0xD79A, 0xC64B, 0xD79B, 0xC8FD, + 0xD79C, 0xC64C, 0xD79D, 0xC8FE, 0xD79E, 0xC64D, 0xD79F, 0xC64E, + 0xD7A0, 0xC64F, 0xD7A1, 0xC650, 0xD7A2, 0xC651, 0xD7A3, 0xC652, + 0xF900, 0xCBD0, 0xF901, 0xCBD6, 0xF902, 0xCBE7, 0xF903, 0xCDCF, + 0xF904, 0xCDE8, 0xF905, 0xCEAD, 0xF906, 0xCFFB, 0xF907, 0xD0A2, + 0xF908, 0xD0B8, 0xF909, 0xD0D0, 0xF90A, 0xD0DD, 0xF90B, 0xD1D4, + 0xF90C, 0xD1D5, 0xF90D, 0xD1D8, 0xF90E, 0xD1DB, 0xF90F, 0xD1DC, + 0xF910, 0xD1DD, 0xF911, 0xD1DE, 0xF912, 0xD1DF, 0xF913, 0xD1E0, + 0xF914, 0xD1E2, 0xF915, 0xD1E3, 0xF916, 0xD1E4, 0xF917, 0xD1E5, + 0xF918, 0xD1E6, 0xF919, 0xD1E8, 0xF91A, 0xD1E9, 0xF91B, 0xD1EA, + 0xF91C, 0xD1EB, 0xF91D, 0xD1ED, 0xF91E, 0xD1EF, 0xF91F, 0xD1F0, + 0xF920, 0xD1F2, 0xF921, 0xD1F6, 0xF922, 0xD1FA, 0xF923, 0xD1FC, + 0xF924, 0xD1FD, 0xF925, 0xD1FE, 0xF926, 0xD2A2, 0xF927, 0xD2A3, + 0xF928, 0xD2A7, 0xF929, 0xD2A8, 0xF92A, 0xD2A9, 0xF92B, 0xD2AA, + 0xF92C, 0xD2AB, 0xF92D, 0xD2AD, 0xF92E, 0xD2B2, 0xF92F, 0xD2BE, + 0xF930, 0xD2C2, 0xF931, 0xD2C3, 0xF932, 0xD2C4, 0xF933, 0xD2C6, + 0xF934, 0xD2C7, 0xF935, 0xD2C8, 0xF936, 0xD2C9, 0xF937, 0xD2CA, + 0xF938, 0xD2CB, 0xF939, 0xD2CD, 0xF93A, 0xD2CE, 0xF93B, 0xD2CF, + 0xF93C, 0xD2D0, 0xF93D, 0xD2D1, 0xF93E, 0xD2D2, 0xF93F, 0xD2D3, + 0xF940, 0xD2D4, 0xF941, 0xD2D5, 0xF942, 0xD2D6, 0xF943, 0xD2D7, + 0xF944, 0xD2D9, 0xF945, 0xD2DA, 0xF946, 0xD2DE, 0xF947, 0xD2DF, + 0xF948, 0xD2E1, 0xF949, 0xD2E2, 0xF94A, 0xD2E4, 0xF94B, 0xD2E5, + 0xF94C, 0xD2E6, 0xF94D, 0xD2E7, 0xF94E, 0xD2E8, 0xF94F, 0xD2E9, + 0xF950, 0xD2EA, 0xF951, 0xD2EB, 0xF952, 0xD2F0, 0xF953, 0xD2F1, + 0xF954, 0xD2F2, 0xF955, 0xD2F3, 0xF956, 0xD2F4, 0xF957, 0xD2F5, + 0xF958, 0xD2F7, 0xF959, 0xD2F8, 0xF95A, 0xD4E6, 0xF95B, 0xD4FC, + 0xF95C, 0xD5A5, 0xF95D, 0xD5AB, 0xF95E, 0xD5AE, 0xF95F, 0xD6B8, + 0xF960, 0xD6CD, 0xF961, 0xD7CB, 0xF962, 0xD7E4, 0xF963, 0xDBC5, + 0xF964, 0xDBE4, 0xF965, 0xDCA5, 0xF966, 0xDDA5, 0xF967, 0xDDD5, + 0xF968, 0xDDF4, 0xF969, 0xDEFC, 0xF96A, 0xDEFE, 0xF96B, 0xDFB3, + 0xF96C, 0xDFE1, 0xF96D, 0xDFE8, 0xF96E, 0xE0F1, 0xF96F, 0xE1AD, + 0xF970, 0xE1ED, 0xF971, 0xE3F5, 0xF972, 0xE4A1, 0xF973, 0xE4A9, + 0xF974, 0xE5AE, 0xF975, 0xE5B1, 0xF976, 0xE5B2, 0xF977, 0xE5B9, + 0xF978, 0xE5BB, 0xF979, 0xE5BC, 0xF97A, 0xE5C4, 0xF97B, 0xE5CE, + 0xF97C, 0xE5D0, 0xF97D, 0xE5D2, 0xF97E, 0xE5D6, 0xF97F, 0xE5FA, + 0xF980, 0xE5FB, 0xF981, 0xE5FC, 0xF982, 0xE5FE, 0xF983, 0xE6A1, + 0xF984, 0xE6A4, 0xF985, 0xE6A7, 0xF986, 0xE6AD, 0xF987, 0xE6AF, + 0xF988, 0xE6B0, 0xF989, 0xE6B1, 0xF98A, 0xE6B3, 0xF98B, 0xE6B7, + 0xF98C, 0xE6B8, 0xF98D, 0xE6BC, 0xF98E, 0xE6C4, 0xF98F, 0xE6C6, + 0xF990, 0xE6C7, 0xF991, 0xE6CA, 0xF992, 0xE6D2, 0xF993, 0xE6D6, + 0xF994, 0xE6D9, 0xF995, 0xE6DC, 0xF996, 0xE6DF, 0xF997, 0xE6E1, + 0xF998, 0xE6E4, 0xF999, 0xE6E5, 0xF99A, 0xE6E6, 0xF99B, 0xE6E8, + 0xF99C, 0xE6EA, 0xF99D, 0xE6EB, 0xF99E, 0xE6EC, 0xF99F, 0xE6EF, + 0xF9A0, 0xE6F1, 0xF9A1, 0xE6F2, 0xF9A2, 0xE6F5, 0xF9A3, 0xE6F6, + 0xF9A4, 0xE6F7, 0xF9A5, 0xE6F9, 0xF9A6, 0xE7A1, 0xF9A7, 0xE7A6, + 0xF9A8, 0xE7A9, 0xF9A9, 0xE7AA, 0xF9AA, 0xE7AC, 0xF9AB, 0xE7AD, + 0xF9AC, 0xE7B0, 0xF9AD, 0xE7BF, 0xF9AE, 0xE7C1, 0xF9AF, 0xE7C6, + 0xF9B0, 0xE7C7, 0xF9B1, 0xE7CB, 0xF9B2, 0xE7CD, 0xF9B3, 0xE7CF, + 0xF9B4, 0xE7D0, 0xF9B5, 0xE7D3, 0xF9B6, 0xE7DF, 0xF9B7, 0xE7E4, + 0xF9B8, 0xE7E6, 0xF9B9, 0xE7F7, 0xF9BA, 0xE8E7, 0xF9BB, 0xE8E8, + 0xF9BC, 0xE8F0, 0xF9BD, 0xE8F1, 0xF9BE, 0xE8F7, 0xF9BF, 0xE8F9, + 0xF9C0, 0xE8FB, 0xF9C1, 0xE8FE, 0xF9C2, 0xE9A7, 0xF9C3, 0xE9AC, + 0xF9C4, 0xE9CC, 0xF9C5, 0xE9F7, 0xF9C6, 0xEAC1, 0xF9C7, 0xEAE5, + 0xF9C8, 0xEAF4, 0xF9C9, 0xEAF7, 0xF9CA, 0xEAFC, 0xF9CB, 0xEAFE, + 0xF9CC, 0xEBA4, 0xF9CD, 0xEBA7, 0xF9CE, 0xEBA9, 0xF9CF, 0xEBAA, + 0xF9D0, 0xEBBA, 0xF9D1, 0xEBBB, 0xF9D2, 0xEBBD, 0xF9D3, 0xEBC1, + 0xF9D4, 0xEBC2, 0xF9D5, 0xEBC6, 0xF9D6, 0xEBC7, 0xF9D7, 0xEBCC, + 0xF9D8, 0xEBCF, 0xF9D9, 0xEBD0, 0xF9DA, 0xEBD1, 0xF9DB, 0xEBD2, + 0xF9DC, 0xEBD8, 0xF9DD, 0xECA6, 0xF9DE, 0xECA7, 0xF9DF, 0xECAA, + 0xF9E0, 0xECAF, 0xF9E1, 0xECB0, 0xF9E2, 0xECB1, 0xF9E3, 0xECB2, + 0xF9E4, 0xECB5, 0xF9E5, 0xECB8, 0xF9E6, 0xECBA, 0xF9E7, 0xECC0, + 0xF9E8, 0xECC1, 0xF9E9, 0xECC5, 0xF9EA, 0xECC6, 0xF9EB, 0xECC9, + 0xF9EC, 0xECCA, 0xF9ED, 0xECD5, 0xF9EE, 0xECDD, 0xF9EF, 0xECDE, + 0xF9F0, 0xECE1, 0xF9F1, 0xECE4, 0xF9F2, 0xECE7, 0xF9F3, 0xECE8, + 0xF9F4, 0xECF7, 0xF9F5, 0xECF8, 0xF9F6, 0xECFA, 0xF9F7, 0xEDA1, + 0xF9F8, 0xEDA2, 0xF9F9, 0xEDA3, 0xF9FA, 0xEDEE, 0xF9FB, 0xEEDB, + 0xF9FC, 0xF2BD, 0xF9FD, 0xF2FA, 0xF9FE, 0xF3B1, 0xF9FF, 0xF4A7, + 0xFA00, 0xF4EE, 0xFA01, 0xF6F4, 0xFA02, 0xF6F6, 0xFA03, 0xF7B8, + 0xFA04, 0xF7C8, 0xFA05, 0xF7D3, 0xFA06, 0xF8DB, 0xFA07, 0xF8F0, + 0xFA08, 0xFAA1, 0xFA09, 0xFAA2, 0xFA0A, 0xFAE6, 0xFA0B, 0xFCA9, + 0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA3A4, + 0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8, + 0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0, + 0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8, + 0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0, + 0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8, + 0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0, + 0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8, + 0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA1AC, + 0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0, + 0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8, + 0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0, + 0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8, + 0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, 0xFF5E, 0xA2A6, 0xFFE0, 0xA1CB, 0xFFE1, 0xA1CC, + 0xFFE2, 0xA1FE, 0xFFE3, 0xA3FE, 0xFFE5, 0xA1CD, 0xFFE6, 0xA3DC, + 0, 0 +}; + +static +const WCHAR oem2uni[] = { +/* OEM - Unicode, OEM - Unicode, OEM - Unicode, OEM - Unicode */ + 0x8141, 0xAC02, 0x8142, 0xAC03, 0x8143, 0xAC05, 0x8144, 0xAC06, + 0x8145, 0xAC0B, 0x8146, 0xAC0C, 0x8147, 0xAC0D, 0x8148, 0xAC0E, + 0x8149, 0xAC0F, 0x814A, 0xAC18, 0x814B, 0xAC1E, 0x814C, 0xAC1F, + 0x814D, 0xAC21, 0x814E, 0xAC22, 0x814F, 0xAC23, 0x8150, 0xAC25, + 0x8151, 0xAC26, 0x8152, 0xAC27, 0x8153, 0xAC28, 0x8154, 0xAC29, + 0x8155, 0xAC2A, 0x8156, 0xAC2B, 0x8157, 0xAC2E, 0x8158, 0xAC32, + 0x8159, 0xAC33, 0x815A, 0xAC34, 0x8161, 0xAC35, 0x8162, 0xAC36, + 0x8163, 0xAC37, 0x8164, 0xAC3A, 0x8165, 0xAC3B, 0x8166, 0xAC3D, + 0x8167, 0xAC3E, 0x8168, 0xAC3F, 0x8169, 0xAC41, 0x816A, 0xAC42, + 0x816B, 0xAC43, 0x816C, 0xAC44, 0x816D, 0xAC45, 0x816E, 0xAC46, + 0x816F, 0xAC47, 0x8170, 0xAC48, 0x8171, 0xAC49, 0x8172, 0xAC4A, + 0x8173, 0xAC4C, 0x8174, 0xAC4E, 0x8175, 0xAC4F, 0x8176, 0xAC50, + 0x8177, 0xAC51, 0x8178, 0xAC52, 0x8179, 0xAC53, 0x817A, 0xAC55, + 0x8181, 0xAC56, 0x8182, 0xAC57, 0x8183, 0xAC59, 0x8184, 0xAC5A, + 0x8185, 0xAC5B, 0x8186, 0xAC5D, 0x8187, 0xAC5E, 0x8188, 0xAC5F, + 0x8189, 0xAC60, 0x818A, 0xAC61, 0x818B, 0xAC62, 0x818C, 0xAC63, + 0x818D, 0xAC64, 0x818E, 0xAC65, 0x818F, 0xAC66, 0x8190, 0xAC67, + 0x8191, 0xAC68, 0x8192, 0xAC69, 0x8193, 0xAC6A, 0x8194, 0xAC6B, + 0x8195, 0xAC6C, 0x8196, 0xAC6D, 0x8197, 0xAC6E, 0x8198, 0xAC6F, + 0x8199, 0xAC72, 0x819A, 0xAC73, 0x819B, 0xAC75, 0x819C, 0xAC76, + 0x819D, 0xAC79, 0x819E, 0xAC7B, 0x819F, 0xAC7C, 0x81A0, 0xAC7D, + 0x81A1, 0xAC7E, 0x81A2, 0xAC7F, 0x81A3, 0xAC82, 0x81A4, 0xAC87, + 0x81A5, 0xAC88, 0x81A6, 0xAC8D, 0x81A7, 0xAC8E, 0x81A8, 0xAC8F, + 0x81A9, 0xAC91, 0x81AA, 0xAC92, 0x81AB, 0xAC93, 0x81AC, 0xAC95, + 0x81AD, 0xAC96, 0x81AE, 0xAC97, 0x81AF, 0xAC98, 0x81B0, 0xAC99, + 0x81B1, 0xAC9A, 0x81B2, 0xAC9B, 0x81B3, 0xAC9E, 0x81B4, 0xACA2, + 0x81B5, 0xACA3, 0x81B6, 0xACA4, 0x81B7, 0xACA5, 0x81B8, 0xACA6, + 0x81B9, 0xACA7, 0x81BA, 0xACAB, 0x81BB, 0xACAD, 0x81BC, 0xACAE, + 0x81BD, 0xACB1, 0x81BE, 0xACB2, 0x81BF, 0xACB3, 0x81C0, 0xACB4, + 0x81C1, 0xACB5, 0x81C2, 0xACB6, 0x81C3, 0xACB7, 0x81C4, 0xACBA, + 0x81C5, 0xACBE, 0x81C6, 0xACBF, 0x81C7, 0xACC0, 0x81C8, 0xACC2, + 0x81C9, 0xACC3, 0x81CA, 0xACC5, 0x81CB, 0xACC6, 0x81CC, 0xACC7, + 0x81CD, 0xACC9, 0x81CE, 0xACCA, 0x81CF, 0xACCB, 0x81D0, 0xACCD, + 0x81D1, 0xACCE, 0x81D2, 0xACCF, 0x81D3, 0xACD0, 0x81D4, 0xACD1, + 0x81D5, 0xACD2, 0x81D6, 0xACD3, 0x81D7, 0xACD4, 0x81D8, 0xACD6, + 0x81D9, 0xACD8, 0x81DA, 0xACD9, 0x81DB, 0xACDA, 0x81DC, 0xACDB, + 0x81DD, 0xACDC, 0x81DE, 0xACDD, 0x81DF, 0xACDE, 0x81E0, 0xACDF, + 0x81E1, 0xACE2, 0x81E2, 0xACE3, 0x81E3, 0xACE5, 0x81E4, 0xACE6, + 0x81E5, 0xACE9, 0x81E6, 0xACEB, 0x81E7, 0xACED, 0x81E8, 0xACEE, + 0x81E9, 0xACF2, 0x81EA, 0xACF4, 0x81EB, 0xACF7, 0x81EC, 0xACF8, + 0x81ED, 0xACF9, 0x81EE, 0xACFA, 0x81EF, 0xACFB, 0x81F0, 0xACFE, + 0x81F1, 0xACFF, 0x81F2, 0xAD01, 0x81F3, 0xAD02, 0x81F4, 0xAD03, + 0x81F5, 0xAD05, 0x81F6, 0xAD07, 0x81F7, 0xAD08, 0x81F8, 0xAD09, + 0x81F9, 0xAD0A, 0x81FA, 0xAD0B, 0x81FB, 0xAD0E, 0x81FC, 0xAD10, + 0x81FD, 0xAD12, 0x81FE, 0xAD13, 0x8241, 0xAD14, 0x8242, 0xAD15, + 0x8243, 0xAD16, 0x8244, 0xAD17, 0x8245, 0xAD19, 0x8246, 0xAD1A, + 0x8247, 0xAD1B, 0x8248, 0xAD1D, 0x8249, 0xAD1E, 0x824A, 0xAD1F, + 0x824B, 0xAD21, 0x824C, 0xAD22, 0x824D, 0xAD23, 0x824E, 0xAD24, + 0x824F, 0xAD25, 0x8250, 0xAD26, 0x8251, 0xAD27, 0x8252, 0xAD28, + 0x8253, 0xAD2A, 0x8254, 0xAD2B, 0x8255, 0xAD2E, 0x8256, 0xAD2F, + 0x8257, 0xAD30, 0x8258, 0xAD31, 0x8259, 0xAD32, 0x825A, 0xAD33, + 0x8261, 0xAD36, 0x8262, 0xAD37, 0x8263, 0xAD39, 0x8264, 0xAD3A, + 0x8265, 0xAD3B, 0x8266, 0xAD3D, 0x8267, 0xAD3E, 0x8268, 0xAD3F, + 0x8269, 0xAD40, 0x826A, 0xAD41, 0x826B, 0xAD42, 0x826C, 0xAD43, + 0x826D, 0xAD46, 0x826E, 0xAD48, 0x826F, 0xAD4A, 0x8270, 0xAD4B, + 0x8271, 0xAD4C, 0x8272, 0xAD4D, 0x8273, 0xAD4E, 0x8274, 0xAD4F, + 0x8275, 0xAD51, 0x8276, 0xAD52, 0x8277, 0xAD53, 0x8278, 0xAD55, + 0x8279, 0xAD56, 0x827A, 0xAD57, 0x8281, 0xAD59, 0x8282, 0xAD5A, + 0x8283, 0xAD5B, 0x8284, 0xAD5C, 0x8285, 0xAD5D, 0x8286, 0xAD5E, + 0x8287, 0xAD5F, 0x8288, 0xAD60, 0x8289, 0xAD62, 0x828A, 0xAD64, + 0x828B, 0xAD65, 0x828C, 0xAD66, 0x828D, 0xAD67, 0x828E, 0xAD68, + 0x828F, 0xAD69, 0x8290, 0xAD6A, 0x8291, 0xAD6B, 0x8292, 0xAD6E, + 0x8293, 0xAD6F, 0x8294, 0xAD71, 0x8295, 0xAD72, 0x8296, 0xAD77, + 0x8297, 0xAD78, 0x8298, 0xAD79, 0x8299, 0xAD7A, 0x829A, 0xAD7E, + 0x829B, 0xAD80, 0x829C, 0xAD83, 0x829D, 0xAD84, 0x829E, 0xAD85, + 0x829F, 0xAD86, 0x82A0, 0xAD87, 0x82A1, 0xAD8A, 0x82A2, 0xAD8B, + 0x82A3, 0xAD8D, 0x82A4, 0xAD8E, 0x82A5, 0xAD8F, 0x82A6, 0xAD91, + 0x82A7, 0xAD92, 0x82A8, 0xAD93, 0x82A9, 0xAD94, 0x82AA, 0xAD95, + 0x82AB, 0xAD96, 0x82AC, 0xAD97, 0x82AD, 0xAD98, 0x82AE, 0xAD99, + 0x82AF, 0xAD9A, 0x82B0, 0xAD9B, 0x82B1, 0xAD9E, 0x82B2, 0xAD9F, + 0x82B3, 0xADA0, 0x82B4, 0xADA1, 0x82B5, 0xADA2, 0x82B6, 0xADA3, + 0x82B7, 0xADA5, 0x82B8, 0xADA6, 0x82B9, 0xADA7, 0x82BA, 0xADA8, + 0x82BB, 0xADA9, 0x82BC, 0xADAA, 0x82BD, 0xADAB, 0x82BE, 0xADAC, + 0x82BF, 0xADAD, 0x82C0, 0xADAE, 0x82C1, 0xADAF, 0x82C2, 0xADB0, + 0x82C3, 0xADB1, 0x82C4, 0xADB2, 0x82C5, 0xADB3, 0x82C6, 0xADB4, + 0x82C7, 0xADB5, 0x82C8, 0xADB6, 0x82C9, 0xADB8, 0x82CA, 0xADB9, + 0x82CB, 0xADBA, 0x82CC, 0xADBB, 0x82CD, 0xADBC, 0x82CE, 0xADBD, + 0x82CF, 0xADBE, 0x82D0, 0xADBF, 0x82D1, 0xADC2, 0x82D2, 0xADC3, + 0x82D3, 0xADC5, 0x82D4, 0xADC6, 0x82D5, 0xADC7, 0x82D6, 0xADC9, + 0x82D7, 0xADCA, 0x82D8, 0xADCB, 0x82D9, 0xADCC, 0x82DA, 0xADCD, + 0x82DB, 0xADCE, 0x82DC, 0xADCF, 0x82DD, 0xADD2, 0x82DE, 0xADD4, + 0x82DF, 0xADD5, 0x82E0, 0xADD6, 0x82E1, 0xADD7, 0x82E2, 0xADD8, + 0x82E3, 0xADD9, 0x82E4, 0xADDA, 0x82E5, 0xADDB, 0x82E6, 0xADDD, + 0x82E7, 0xADDE, 0x82E8, 0xADDF, 0x82E9, 0xADE1, 0x82EA, 0xADE2, + 0x82EB, 0xADE3, 0x82EC, 0xADE5, 0x82ED, 0xADE6, 0x82EE, 0xADE7, + 0x82EF, 0xADE8, 0x82F0, 0xADE9, 0x82F1, 0xADEA, 0x82F2, 0xADEB, + 0x82F3, 0xADEC, 0x82F4, 0xADED, 0x82F5, 0xADEE, 0x82F6, 0xADEF, + 0x82F7, 0xADF0, 0x82F8, 0xADF1, 0x82F9, 0xADF2, 0x82FA, 0xADF3, + 0x82FB, 0xADF4, 0x82FC, 0xADF5, 0x82FD, 0xADF6, 0x82FE, 0xADF7, + 0x8341, 0xADFA, 0x8342, 0xADFB, 0x8343, 0xADFD, 0x8344, 0xADFE, + 0x8345, 0xAE02, 0x8346, 0xAE03, 0x8347, 0xAE04, 0x8348, 0xAE05, + 0x8349, 0xAE06, 0x834A, 0xAE07, 0x834B, 0xAE0A, 0x834C, 0xAE0C, + 0x834D, 0xAE0E, 0x834E, 0xAE0F, 0x834F, 0xAE10, 0x8350, 0xAE11, + 0x8351, 0xAE12, 0x8352, 0xAE13, 0x8353, 0xAE15, 0x8354, 0xAE16, + 0x8355, 0xAE17, 0x8356, 0xAE18, 0x8357, 0xAE19, 0x8358, 0xAE1A, + 0x8359, 0xAE1B, 0x835A, 0xAE1C, 0x8361, 0xAE1D, 0x8362, 0xAE1E, + 0x8363, 0xAE1F, 0x8364, 0xAE20, 0x8365, 0xAE21, 0x8366, 0xAE22, + 0x8367, 0xAE23, 0x8368, 0xAE24, 0x8369, 0xAE25, 0x836A, 0xAE26, + 0x836B, 0xAE27, 0x836C, 0xAE28, 0x836D, 0xAE29, 0x836E, 0xAE2A, + 0x836F, 0xAE2B, 0x8370, 0xAE2C, 0x8371, 0xAE2D, 0x8372, 0xAE2E, + 0x8373, 0xAE2F, 0x8374, 0xAE32, 0x8375, 0xAE33, 0x8376, 0xAE35, + 0x8377, 0xAE36, 0x8378, 0xAE39, 0x8379, 0xAE3B, 0x837A, 0xAE3C, + 0x8381, 0xAE3D, 0x8382, 0xAE3E, 0x8383, 0xAE3F, 0x8384, 0xAE42, + 0x8385, 0xAE44, 0x8386, 0xAE47, 0x8387, 0xAE48, 0x8388, 0xAE49, + 0x8389, 0xAE4B, 0x838A, 0xAE4F, 0x838B, 0xAE51, 0x838C, 0xAE52, + 0x838D, 0xAE53, 0x838E, 0xAE55, 0x838F, 0xAE57, 0x8390, 0xAE58, + 0x8391, 0xAE59, 0x8392, 0xAE5A, 0x8393, 0xAE5B, 0x8394, 0xAE5E, + 0x8395, 0xAE62, 0x8396, 0xAE63, 0x8397, 0xAE64, 0x8398, 0xAE66, + 0x8399, 0xAE67, 0x839A, 0xAE6A, 0x839B, 0xAE6B, 0x839C, 0xAE6D, + 0x839D, 0xAE6E, 0x839E, 0xAE6F, 0x839F, 0xAE71, 0x83A0, 0xAE72, + 0x83A1, 0xAE73, 0x83A2, 0xAE74, 0x83A3, 0xAE75, 0x83A4, 0xAE76, + 0x83A5, 0xAE77, 0x83A6, 0xAE7A, 0x83A7, 0xAE7E, 0x83A8, 0xAE7F, + 0x83A9, 0xAE80, 0x83AA, 0xAE81, 0x83AB, 0xAE82, 0x83AC, 0xAE83, + 0x83AD, 0xAE86, 0x83AE, 0xAE87, 0x83AF, 0xAE88, 0x83B0, 0xAE89, + 0x83B1, 0xAE8A, 0x83B2, 0xAE8B, 0x83B3, 0xAE8D, 0x83B4, 0xAE8E, + 0x83B5, 0xAE8F, 0x83B6, 0xAE90, 0x83B7, 0xAE91, 0x83B8, 0xAE92, + 0x83B9, 0xAE93, 0x83BA, 0xAE94, 0x83BB, 0xAE95, 0x83BC, 0xAE96, + 0x83BD, 0xAE97, 0x83BE, 0xAE98, 0x83BF, 0xAE99, 0x83C0, 0xAE9A, + 0x83C1, 0xAE9B, 0x83C2, 0xAE9C, 0x83C3, 0xAE9D, 0x83C4, 0xAE9E, + 0x83C5, 0xAE9F, 0x83C6, 0xAEA0, 0x83C7, 0xAEA1, 0x83C8, 0xAEA2, + 0x83C9, 0xAEA3, 0x83CA, 0xAEA4, 0x83CB, 0xAEA5, 0x83CC, 0xAEA6, + 0x83CD, 0xAEA7, 0x83CE, 0xAEA8, 0x83CF, 0xAEA9, 0x83D0, 0xAEAA, + 0x83D1, 0xAEAB, 0x83D2, 0xAEAC, 0x83D3, 0xAEAD, 0x83D4, 0xAEAE, + 0x83D5, 0xAEAF, 0x83D6, 0xAEB0, 0x83D7, 0xAEB1, 0x83D8, 0xAEB2, + 0x83D9, 0xAEB3, 0x83DA, 0xAEB4, 0x83DB, 0xAEB5, 0x83DC, 0xAEB6, + 0x83DD, 0xAEB7, 0x83DE, 0xAEB8, 0x83DF, 0xAEB9, 0x83E0, 0xAEBA, + 0x83E1, 0xAEBB, 0x83E2, 0xAEBF, 0x83E3, 0xAEC1, 0x83E4, 0xAEC2, + 0x83E5, 0xAEC3, 0x83E6, 0xAEC5, 0x83E7, 0xAEC6, 0x83E8, 0xAEC7, + 0x83E9, 0xAEC8, 0x83EA, 0xAEC9, 0x83EB, 0xAECA, 0x83EC, 0xAECB, + 0x83ED, 0xAECE, 0x83EE, 0xAED2, 0x83EF, 0xAED3, 0x83F0, 0xAED4, + 0x83F1, 0xAED5, 0x83F2, 0xAED6, 0x83F3, 0xAED7, 0x83F4, 0xAEDA, + 0x83F5, 0xAEDB, 0x83F6, 0xAEDD, 0x83F7, 0xAEDE, 0x83F8, 0xAEDF, + 0x83F9, 0xAEE0, 0x83FA, 0xAEE1, 0x83FB, 0xAEE2, 0x83FC, 0xAEE3, + 0x83FD, 0xAEE4, 0x83FE, 0xAEE5, 0x8441, 0xAEE6, 0x8442, 0xAEE7, + 0x8443, 0xAEE9, 0x8444, 0xAEEA, 0x8445, 0xAEEC, 0x8446, 0xAEEE, + 0x8447, 0xAEEF, 0x8448, 0xAEF0, 0x8449, 0xAEF1, 0x844A, 0xAEF2, + 0x844B, 0xAEF3, 0x844C, 0xAEF5, 0x844D, 0xAEF6, 0x844E, 0xAEF7, + 0x844F, 0xAEF9, 0x8450, 0xAEFA, 0x8451, 0xAEFB, 0x8452, 0xAEFD, + 0x8453, 0xAEFE, 0x8454, 0xAEFF, 0x8455, 0xAF00, 0x8456, 0xAF01, + 0x8457, 0xAF02, 0x8458, 0xAF03, 0x8459, 0xAF04, 0x845A, 0xAF05, + 0x8461, 0xAF06, 0x8462, 0xAF09, 0x8463, 0xAF0A, 0x8464, 0xAF0B, + 0x8465, 0xAF0C, 0x8466, 0xAF0E, 0x8467, 0xAF0F, 0x8468, 0xAF11, + 0x8469, 0xAF12, 0x846A, 0xAF13, 0x846B, 0xAF14, 0x846C, 0xAF15, + 0x846D, 0xAF16, 0x846E, 0xAF17, 0x846F, 0xAF18, 0x8470, 0xAF19, + 0x8471, 0xAF1A, 0x8472, 0xAF1B, 0x8473, 0xAF1C, 0x8474, 0xAF1D, + 0x8475, 0xAF1E, 0x8476, 0xAF1F, 0x8477, 0xAF20, 0x8478, 0xAF21, + 0x8479, 0xAF22, 0x847A, 0xAF23, 0x8481, 0xAF24, 0x8482, 0xAF25, + 0x8483, 0xAF26, 0x8484, 0xAF27, 0x8485, 0xAF28, 0x8486, 0xAF29, + 0x8487, 0xAF2A, 0x8488, 0xAF2B, 0x8489, 0xAF2E, 0x848A, 0xAF2F, + 0x848B, 0xAF31, 0x848C, 0xAF33, 0x848D, 0xAF35, 0x848E, 0xAF36, + 0x848F, 0xAF37, 0x8490, 0xAF38, 0x8491, 0xAF39, 0x8492, 0xAF3A, + 0x8493, 0xAF3B, 0x8494, 0xAF3E, 0x8495, 0xAF40, 0x8496, 0xAF44, + 0x8497, 0xAF45, 0x8498, 0xAF46, 0x8499, 0xAF47, 0x849A, 0xAF4A, + 0x849B, 0xAF4B, 0x849C, 0xAF4C, 0x849D, 0xAF4D, 0x849E, 0xAF4E, + 0x849F, 0xAF4F, 0x84A0, 0xAF51, 0x84A1, 0xAF52, 0x84A2, 0xAF53, + 0x84A3, 0xAF54, 0x84A4, 0xAF55, 0x84A5, 0xAF56, 0x84A6, 0xAF57, + 0x84A7, 0xAF58, 0x84A8, 0xAF59, 0x84A9, 0xAF5A, 0x84AA, 0xAF5B, + 0x84AB, 0xAF5E, 0x84AC, 0xAF5F, 0x84AD, 0xAF60, 0x84AE, 0xAF61, + 0x84AF, 0xAF62, 0x84B0, 0xAF63, 0x84B1, 0xAF66, 0x84B2, 0xAF67, + 0x84B3, 0xAF68, 0x84B4, 0xAF69, 0x84B5, 0xAF6A, 0x84B6, 0xAF6B, + 0x84B7, 0xAF6C, 0x84B8, 0xAF6D, 0x84B9, 0xAF6E, 0x84BA, 0xAF6F, + 0x84BB, 0xAF70, 0x84BC, 0xAF71, 0x84BD, 0xAF72, 0x84BE, 0xAF73, + 0x84BF, 0xAF74, 0x84C0, 0xAF75, 0x84C1, 0xAF76, 0x84C2, 0xAF77, + 0x84C3, 0xAF78, 0x84C4, 0xAF7A, 0x84C5, 0xAF7B, 0x84C6, 0xAF7C, + 0x84C7, 0xAF7D, 0x84C8, 0xAF7E, 0x84C9, 0xAF7F, 0x84CA, 0xAF81, + 0x84CB, 0xAF82, 0x84CC, 0xAF83, 0x84CD, 0xAF85, 0x84CE, 0xAF86, + 0x84CF, 0xAF87, 0x84D0, 0xAF89, 0x84D1, 0xAF8A, 0x84D2, 0xAF8B, + 0x84D3, 0xAF8C, 0x84D4, 0xAF8D, 0x84D5, 0xAF8E, 0x84D6, 0xAF8F, + 0x84D7, 0xAF92, 0x84D8, 0xAF93, 0x84D9, 0xAF94, 0x84DA, 0xAF96, + 0x84DB, 0xAF97, 0x84DC, 0xAF98, 0x84DD, 0xAF99, 0x84DE, 0xAF9A, + 0x84DF, 0xAF9B, 0x84E0, 0xAF9D, 0x84E1, 0xAF9E, 0x84E2, 0xAF9F, + 0x84E3, 0xAFA0, 0x84E4, 0xAFA1, 0x84E5, 0xAFA2, 0x84E6, 0xAFA3, + 0x84E7, 0xAFA4, 0x84E8, 0xAFA5, 0x84E9, 0xAFA6, 0x84EA, 0xAFA7, + 0x84EB, 0xAFA8, 0x84EC, 0xAFA9, 0x84ED, 0xAFAA, 0x84EE, 0xAFAB, + 0x84EF, 0xAFAC, 0x84F0, 0xAFAD, 0x84F1, 0xAFAE, 0x84F2, 0xAFAF, + 0x84F3, 0xAFB0, 0x84F4, 0xAFB1, 0x84F5, 0xAFB2, 0x84F6, 0xAFB3, + 0x84F7, 0xAFB4, 0x84F8, 0xAFB5, 0x84F9, 0xAFB6, 0x84FA, 0xAFB7, + 0x84FB, 0xAFBA, 0x84FC, 0xAFBB, 0x84FD, 0xAFBD, 0x84FE, 0xAFBE, + 0x8541, 0xAFBF, 0x8542, 0xAFC1, 0x8543, 0xAFC2, 0x8544, 0xAFC3, + 0x8545, 0xAFC4, 0x8546, 0xAFC5, 0x8547, 0xAFC6, 0x8548, 0xAFCA, + 0x8549, 0xAFCC, 0x854A, 0xAFCF, 0x854B, 0xAFD0, 0x854C, 0xAFD1, + 0x854D, 0xAFD2, 0x854E, 0xAFD3, 0x854F, 0xAFD5, 0x8550, 0xAFD6, + 0x8551, 0xAFD7, 0x8552, 0xAFD8, 0x8553, 0xAFD9, 0x8554, 0xAFDA, + 0x8555, 0xAFDB, 0x8556, 0xAFDD, 0x8557, 0xAFDE, 0x8558, 0xAFDF, + 0x8559, 0xAFE0, 0x855A, 0xAFE1, 0x8561, 0xAFE2, 0x8562, 0xAFE3, + 0x8563, 0xAFE4, 0x8564, 0xAFE5, 0x8565, 0xAFE6, 0x8566, 0xAFE7, + 0x8567, 0xAFEA, 0x8568, 0xAFEB, 0x8569, 0xAFEC, 0x856A, 0xAFED, + 0x856B, 0xAFEE, 0x856C, 0xAFEF, 0x856D, 0xAFF2, 0x856E, 0xAFF3, + 0x856F, 0xAFF5, 0x8570, 0xAFF6, 0x8571, 0xAFF7, 0x8572, 0xAFF9, + 0x8573, 0xAFFA, 0x8574, 0xAFFB, 0x8575, 0xAFFC, 0x8576, 0xAFFD, + 0x8577, 0xAFFE, 0x8578, 0xAFFF, 0x8579, 0xB002, 0x857A, 0xB003, + 0x8581, 0xB005, 0x8582, 0xB006, 0x8583, 0xB007, 0x8584, 0xB008, + 0x8585, 0xB009, 0x8586, 0xB00A, 0x8587, 0xB00B, 0x8588, 0xB00D, + 0x8589, 0xB00E, 0x858A, 0xB00F, 0x858B, 0xB011, 0x858C, 0xB012, + 0x858D, 0xB013, 0x858E, 0xB015, 0x858F, 0xB016, 0x8590, 0xB017, + 0x8591, 0xB018, 0x8592, 0xB019, 0x8593, 0xB01A, 0x8594, 0xB01B, + 0x8595, 0xB01E, 0x8596, 0xB01F, 0x8597, 0xB020, 0x8598, 0xB021, + 0x8599, 0xB022, 0x859A, 0xB023, 0x859B, 0xB024, 0x859C, 0xB025, + 0x859D, 0xB026, 0x859E, 0xB027, 0x859F, 0xB029, 0x85A0, 0xB02A, + 0x85A1, 0xB02B, 0x85A2, 0xB02C, 0x85A3, 0xB02D, 0x85A4, 0xB02E, + 0x85A5, 0xB02F, 0x85A6, 0xB030, 0x85A7, 0xB031, 0x85A8, 0xB032, + 0x85A9, 0xB033, 0x85AA, 0xB034, 0x85AB, 0xB035, 0x85AC, 0xB036, + 0x85AD, 0xB037, 0x85AE, 0xB038, 0x85AF, 0xB039, 0x85B0, 0xB03A, + 0x85B1, 0xB03B, 0x85B2, 0xB03C, 0x85B3, 0xB03D, 0x85B4, 0xB03E, + 0x85B5, 0xB03F, 0x85B6, 0xB040, 0x85B7, 0xB041, 0x85B8, 0xB042, + 0x85B9, 0xB043, 0x85BA, 0xB046, 0x85BB, 0xB047, 0x85BC, 0xB049, + 0x85BD, 0xB04B, 0x85BE, 0xB04D, 0x85BF, 0xB04F, 0x85C0, 0xB050, + 0x85C1, 0xB051, 0x85C2, 0xB052, 0x85C3, 0xB056, 0x85C4, 0xB058, + 0x85C5, 0xB05A, 0x85C6, 0xB05B, 0x85C7, 0xB05C, 0x85C8, 0xB05E, + 0x85C9, 0xB05F, 0x85CA, 0xB060, 0x85CB, 0xB061, 0x85CC, 0xB062, + 0x85CD, 0xB063, 0x85CE, 0xB064, 0x85CF, 0xB065, 0x85D0, 0xB066, + 0x85D1, 0xB067, 0x85D2, 0xB068, 0x85D3, 0xB069, 0x85D4, 0xB06A, + 0x85D5, 0xB06B, 0x85D6, 0xB06C, 0x85D7, 0xB06D, 0x85D8, 0xB06E, + 0x85D9, 0xB06F, 0x85DA, 0xB070, 0x85DB, 0xB071, 0x85DC, 0xB072, + 0x85DD, 0xB073, 0x85DE, 0xB074, 0x85DF, 0xB075, 0x85E0, 0xB076, + 0x85E1, 0xB077, 0x85E2, 0xB078, 0x85E3, 0xB079, 0x85E4, 0xB07A, + 0x85E5, 0xB07B, 0x85E6, 0xB07E, 0x85E7, 0xB07F, 0x85E8, 0xB081, + 0x85E9, 0xB082, 0x85EA, 0xB083, 0x85EB, 0xB085, 0x85EC, 0xB086, + 0x85ED, 0xB087, 0x85EE, 0xB088, 0x85EF, 0xB089, 0x85F0, 0xB08A, + 0x85F1, 0xB08B, 0x85F2, 0xB08E, 0x85F3, 0xB090, 0x85F4, 0xB092, + 0x85F5, 0xB093, 0x85F6, 0xB094, 0x85F7, 0xB095, 0x85F8, 0xB096, + 0x85F9, 0xB097, 0x85FA, 0xB09B, 0x85FB, 0xB09D, 0x85FC, 0xB09E, + 0x85FD, 0xB0A3, 0x85FE, 0xB0A4, 0x8641, 0xB0A5, 0x8642, 0xB0A6, + 0x8643, 0xB0A7, 0x8644, 0xB0AA, 0x8645, 0xB0B0, 0x8646, 0xB0B2, + 0x8647, 0xB0B6, 0x8648, 0xB0B7, 0x8649, 0xB0B9, 0x864A, 0xB0BA, + 0x864B, 0xB0BB, 0x864C, 0xB0BD, 0x864D, 0xB0BE, 0x864E, 0xB0BF, + 0x864F, 0xB0C0, 0x8650, 0xB0C1, 0x8651, 0xB0C2, 0x8652, 0xB0C3, + 0x8653, 0xB0C6, 0x8654, 0xB0CA, 0x8655, 0xB0CB, 0x8656, 0xB0CC, + 0x8657, 0xB0CD, 0x8658, 0xB0CE, 0x8659, 0xB0CF, 0x865A, 0xB0D2, + 0x8661, 0xB0D3, 0x8662, 0xB0D5, 0x8663, 0xB0D6, 0x8664, 0xB0D7, + 0x8665, 0xB0D9, 0x8666, 0xB0DA, 0x8667, 0xB0DB, 0x8668, 0xB0DC, + 0x8669, 0xB0DD, 0x866A, 0xB0DE, 0x866B, 0xB0DF, 0x866C, 0xB0E1, + 0x866D, 0xB0E2, 0x866E, 0xB0E3, 0x866F, 0xB0E4, 0x8670, 0xB0E6, + 0x8671, 0xB0E7, 0x8672, 0xB0E8, 0x8673, 0xB0E9, 0x8674, 0xB0EA, + 0x8675, 0xB0EB, 0x8676, 0xB0EC, 0x8677, 0xB0ED, 0x8678, 0xB0EE, + 0x8679, 0xB0EF, 0x867A, 0xB0F0, 0x8681, 0xB0F1, 0x8682, 0xB0F2, + 0x8683, 0xB0F3, 0x8684, 0xB0F4, 0x8685, 0xB0F5, 0x8686, 0xB0F6, + 0x8687, 0xB0F7, 0x8688, 0xB0F8, 0x8689, 0xB0F9, 0x868A, 0xB0FA, + 0x868B, 0xB0FB, 0x868C, 0xB0FC, 0x868D, 0xB0FD, 0x868E, 0xB0FE, + 0x868F, 0xB0FF, 0x8690, 0xB100, 0x8691, 0xB101, 0x8692, 0xB102, + 0x8693, 0xB103, 0x8694, 0xB104, 0x8695, 0xB105, 0x8696, 0xB106, + 0x8697, 0xB107, 0x8698, 0xB10A, 0x8699, 0xB10D, 0x869A, 0xB10E, + 0x869B, 0xB10F, 0x869C, 0xB111, 0x869D, 0xB114, 0x869E, 0xB115, + 0x869F, 0xB116, 0x86A0, 0xB117, 0x86A1, 0xB11A, 0x86A2, 0xB11E, + 0x86A3, 0xB11F, 0x86A4, 0xB120, 0x86A5, 0xB121, 0x86A6, 0xB122, + 0x86A7, 0xB126, 0x86A8, 0xB127, 0x86A9, 0xB129, 0x86AA, 0xB12A, + 0x86AB, 0xB12B, 0x86AC, 0xB12D, 0x86AD, 0xB12E, 0x86AE, 0xB12F, + 0x86AF, 0xB130, 0x86B0, 0xB131, 0x86B1, 0xB132, 0x86B2, 0xB133, + 0x86B3, 0xB136, 0x86B4, 0xB13A, 0x86B5, 0xB13B, 0x86B6, 0xB13C, + 0x86B7, 0xB13D, 0x86B8, 0xB13E, 0x86B9, 0xB13F, 0x86BA, 0xB142, + 0x86BB, 0xB143, 0x86BC, 0xB145, 0x86BD, 0xB146, 0x86BE, 0xB147, + 0x86BF, 0xB149, 0x86C0, 0xB14A, 0x86C1, 0xB14B, 0x86C2, 0xB14C, + 0x86C3, 0xB14D, 0x86C4, 0xB14E, 0x86C5, 0xB14F, 0x86C6, 0xB152, + 0x86C7, 0xB153, 0x86C8, 0xB156, 0x86C9, 0xB157, 0x86CA, 0xB159, + 0x86CB, 0xB15A, 0x86CC, 0xB15B, 0x86CD, 0xB15D, 0x86CE, 0xB15E, + 0x86CF, 0xB15F, 0x86D0, 0xB161, 0x86D1, 0xB162, 0x86D2, 0xB163, + 0x86D3, 0xB164, 0x86D4, 0xB165, 0x86D5, 0xB166, 0x86D6, 0xB167, + 0x86D7, 0xB168, 0x86D8, 0xB169, 0x86D9, 0xB16A, 0x86DA, 0xB16B, + 0x86DB, 0xB16C, 0x86DC, 0xB16D, 0x86DD, 0xB16E, 0x86DE, 0xB16F, + 0x86DF, 0xB170, 0x86E0, 0xB171, 0x86E1, 0xB172, 0x86E2, 0xB173, + 0x86E3, 0xB174, 0x86E4, 0xB175, 0x86E5, 0xB176, 0x86E6, 0xB177, + 0x86E7, 0xB17A, 0x86E8, 0xB17B, 0x86E9, 0xB17D, 0x86EA, 0xB17E, + 0x86EB, 0xB17F, 0x86EC, 0xB181, 0x86ED, 0xB183, 0x86EE, 0xB184, + 0x86EF, 0xB185, 0x86F0, 0xB186, 0x86F1, 0xB187, 0x86F2, 0xB18A, + 0x86F3, 0xB18C, 0x86F4, 0xB18E, 0x86F5, 0xB18F, 0x86F6, 0xB190, + 0x86F7, 0xB191, 0x86F8, 0xB195, 0x86F9, 0xB196, 0x86FA, 0xB197, + 0x86FB, 0xB199, 0x86FC, 0xB19A, 0x86FD, 0xB19B, 0x86FE, 0xB19D, + 0x8741, 0xB19E, 0x8742, 0xB19F, 0x8743, 0xB1A0, 0x8744, 0xB1A1, + 0x8745, 0xB1A2, 0x8746, 0xB1A3, 0x8747, 0xB1A4, 0x8748, 0xB1A5, + 0x8749, 0xB1A6, 0x874A, 0xB1A7, 0x874B, 0xB1A9, 0x874C, 0xB1AA, + 0x874D, 0xB1AB, 0x874E, 0xB1AC, 0x874F, 0xB1AD, 0x8750, 0xB1AE, + 0x8751, 0xB1AF, 0x8752, 0xB1B0, 0x8753, 0xB1B1, 0x8754, 0xB1B2, + 0x8755, 0xB1B3, 0x8756, 0xB1B4, 0x8757, 0xB1B5, 0x8758, 0xB1B6, + 0x8759, 0xB1B7, 0x875A, 0xB1B8, 0x8761, 0xB1B9, 0x8762, 0xB1BA, + 0x8763, 0xB1BB, 0x8764, 0xB1BC, 0x8765, 0xB1BD, 0x8766, 0xB1BE, + 0x8767, 0xB1BF, 0x8768, 0xB1C0, 0x8769, 0xB1C1, 0x876A, 0xB1C2, + 0x876B, 0xB1C3, 0x876C, 0xB1C4, 0x876D, 0xB1C5, 0x876E, 0xB1C6, + 0x876F, 0xB1C7, 0x8770, 0xB1C8, 0x8771, 0xB1C9, 0x8772, 0xB1CA, + 0x8773, 0xB1CB, 0x8774, 0xB1CD, 0x8775, 0xB1CE, 0x8776, 0xB1CF, + 0x8777, 0xB1D1, 0x8778, 0xB1D2, 0x8779, 0xB1D3, 0x877A, 0xB1D5, + 0x8781, 0xB1D6, 0x8782, 0xB1D7, 0x8783, 0xB1D8, 0x8784, 0xB1D9, + 0x8785, 0xB1DA, 0x8786, 0xB1DB, 0x8787, 0xB1DE, 0x8788, 0xB1E0, + 0x8789, 0xB1E1, 0x878A, 0xB1E2, 0x878B, 0xB1E3, 0x878C, 0xB1E4, + 0x878D, 0xB1E5, 0x878E, 0xB1E6, 0x878F, 0xB1E7, 0x8790, 0xB1EA, + 0x8791, 0xB1EB, 0x8792, 0xB1ED, 0x8793, 0xB1EE, 0x8794, 0xB1EF, + 0x8795, 0xB1F1, 0x8796, 0xB1F2, 0x8797, 0xB1F3, 0x8798, 0xB1F4, + 0x8799, 0xB1F5, 0x879A, 0xB1F6, 0x879B, 0xB1F7, 0x879C, 0xB1F8, + 0x879D, 0xB1FA, 0x879E, 0xB1FC, 0x879F, 0xB1FE, 0x87A0, 0xB1FF, + 0x87A1, 0xB200, 0x87A2, 0xB201, 0x87A3, 0xB202, 0x87A4, 0xB203, + 0x87A5, 0xB206, 0x87A6, 0xB207, 0x87A7, 0xB209, 0x87A8, 0xB20A, + 0x87A9, 0xB20D, 0x87AA, 0xB20E, 0x87AB, 0xB20F, 0x87AC, 0xB210, + 0x87AD, 0xB211, 0x87AE, 0xB212, 0x87AF, 0xB213, 0x87B0, 0xB216, + 0x87B1, 0xB218, 0x87B2, 0xB21A, 0x87B3, 0xB21B, 0x87B4, 0xB21C, + 0x87B5, 0xB21D, 0x87B6, 0xB21E, 0x87B7, 0xB21F, 0x87B8, 0xB221, + 0x87B9, 0xB222, 0x87BA, 0xB223, 0x87BB, 0xB224, 0x87BC, 0xB225, + 0x87BD, 0xB226, 0x87BE, 0xB227, 0x87BF, 0xB228, 0x87C0, 0xB229, + 0x87C1, 0xB22A, 0x87C2, 0xB22B, 0x87C3, 0xB22C, 0x87C4, 0xB22D, + 0x87C5, 0xB22E, 0x87C6, 0xB22F, 0x87C7, 0xB230, 0x87C8, 0xB231, + 0x87C9, 0xB232, 0x87CA, 0xB233, 0x87CB, 0xB235, 0x87CC, 0xB236, + 0x87CD, 0xB237, 0x87CE, 0xB238, 0x87CF, 0xB239, 0x87D0, 0xB23A, + 0x87D1, 0xB23B, 0x87D2, 0xB23D, 0x87D3, 0xB23E, 0x87D4, 0xB23F, + 0x87D5, 0xB240, 0x87D6, 0xB241, 0x87D7, 0xB242, 0x87D8, 0xB243, + 0x87D9, 0xB244, 0x87DA, 0xB245, 0x87DB, 0xB246, 0x87DC, 0xB247, + 0x87DD, 0xB248, 0x87DE, 0xB249, 0x87DF, 0xB24A, 0x87E0, 0xB24B, + 0x87E1, 0xB24C, 0x87E2, 0xB24D, 0x87E3, 0xB24E, 0x87E4, 0xB24F, + 0x87E5, 0xB250, 0x87E6, 0xB251, 0x87E7, 0xB252, 0x87E8, 0xB253, + 0x87E9, 0xB254, 0x87EA, 0xB255, 0x87EB, 0xB256, 0x87EC, 0xB257, + 0x87ED, 0xB259, 0x87EE, 0xB25A, 0x87EF, 0xB25B, 0x87F0, 0xB25D, + 0x87F1, 0xB25E, 0x87F2, 0xB25F, 0x87F3, 0xB261, 0x87F4, 0xB262, + 0x87F5, 0xB263, 0x87F6, 0xB264, 0x87F7, 0xB265, 0x87F8, 0xB266, + 0x87F9, 0xB267, 0x87FA, 0xB26A, 0x87FB, 0xB26B, 0x87FC, 0xB26C, + 0x87FD, 0xB26D, 0x87FE, 0xB26E, 0x8841, 0xB26F, 0x8842, 0xB270, + 0x8843, 0xB271, 0x8844, 0xB272, 0x8845, 0xB273, 0x8846, 0xB276, + 0x8847, 0xB277, 0x8848, 0xB278, 0x8849, 0xB279, 0x884A, 0xB27A, + 0x884B, 0xB27B, 0x884C, 0xB27D, 0x884D, 0xB27E, 0x884E, 0xB27F, + 0x884F, 0xB280, 0x8850, 0xB281, 0x8851, 0xB282, 0x8852, 0xB283, + 0x8853, 0xB286, 0x8854, 0xB287, 0x8855, 0xB288, 0x8856, 0xB28A, + 0x8857, 0xB28B, 0x8858, 0xB28C, 0x8859, 0xB28D, 0x885A, 0xB28E, + 0x8861, 0xB28F, 0x8862, 0xB292, 0x8863, 0xB293, 0x8864, 0xB295, + 0x8865, 0xB296, 0x8866, 0xB297, 0x8867, 0xB29B, 0x8868, 0xB29C, + 0x8869, 0xB29D, 0x886A, 0xB29E, 0x886B, 0xB29F, 0x886C, 0xB2A2, + 0x886D, 0xB2A4, 0x886E, 0xB2A7, 0x886F, 0xB2A8, 0x8870, 0xB2A9, + 0x8871, 0xB2AB, 0x8872, 0xB2AD, 0x8873, 0xB2AE, 0x8874, 0xB2AF, + 0x8875, 0xB2B1, 0x8876, 0xB2B2, 0x8877, 0xB2B3, 0x8878, 0xB2B5, + 0x8879, 0xB2B6, 0x887A, 0xB2B7, 0x8881, 0xB2B8, 0x8882, 0xB2B9, + 0x8883, 0xB2BA, 0x8884, 0xB2BB, 0x8885, 0xB2BC, 0x8886, 0xB2BD, + 0x8887, 0xB2BE, 0x8888, 0xB2BF, 0x8889, 0xB2C0, 0x888A, 0xB2C1, + 0x888B, 0xB2C2, 0x888C, 0xB2C3, 0x888D, 0xB2C4, 0x888E, 0xB2C5, + 0x888F, 0xB2C6, 0x8890, 0xB2C7, 0x8891, 0xB2CA, 0x8892, 0xB2CB, + 0x8893, 0xB2CD, 0x8894, 0xB2CE, 0x8895, 0xB2CF, 0x8896, 0xB2D1, + 0x8897, 0xB2D3, 0x8898, 0xB2D4, 0x8899, 0xB2D5, 0x889A, 0xB2D6, + 0x889B, 0xB2D7, 0x889C, 0xB2DA, 0x889D, 0xB2DC, 0x889E, 0xB2DE, + 0x889F, 0xB2DF, 0x88A0, 0xB2E0, 0x88A1, 0xB2E1, 0x88A2, 0xB2E3, + 0x88A3, 0xB2E7, 0x88A4, 0xB2E9, 0x88A5, 0xB2EA, 0x88A6, 0xB2F0, + 0x88A7, 0xB2F1, 0x88A8, 0xB2F2, 0x88A9, 0xB2F6, 0x88AA, 0xB2FC, + 0x88AB, 0xB2FD, 0x88AC, 0xB2FE, 0x88AD, 0xB302, 0x88AE, 0xB303, + 0x88AF, 0xB305, 0x88B0, 0xB306, 0x88B1, 0xB307, 0x88B2, 0xB309, + 0x88B3, 0xB30A, 0x88B4, 0xB30B, 0x88B5, 0xB30C, 0x88B6, 0xB30D, + 0x88B7, 0xB30E, 0x88B8, 0xB30F, 0x88B9, 0xB312, 0x88BA, 0xB316, + 0x88BB, 0xB317, 0x88BC, 0xB318, 0x88BD, 0xB319, 0x88BE, 0xB31A, + 0x88BF, 0xB31B, 0x88C0, 0xB31D, 0x88C1, 0xB31E, 0x88C2, 0xB31F, + 0x88C3, 0xB320, 0x88C4, 0xB321, 0x88C5, 0xB322, 0x88C6, 0xB323, + 0x88C7, 0xB324, 0x88C8, 0xB325, 0x88C9, 0xB326, 0x88CA, 0xB327, + 0x88CB, 0xB328, 0x88CC, 0xB329, 0x88CD, 0xB32A, 0x88CE, 0xB32B, + 0x88CF, 0xB32C, 0x88D0, 0xB32D, 0x88D1, 0xB32E, 0x88D2, 0xB32F, + 0x88D3, 0xB330, 0x88D4, 0xB331, 0x88D5, 0xB332, 0x88D6, 0xB333, + 0x88D7, 0xB334, 0x88D8, 0xB335, 0x88D9, 0xB336, 0x88DA, 0xB337, + 0x88DB, 0xB338, 0x88DC, 0xB339, 0x88DD, 0xB33A, 0x88DE, 0xB33B, + 0x88DF, 0xB33C, 0x88E0, 0xB33D, 0x88E1, 0xB33E, 0x88E2, 0xB33F, + 0x88E3, 0xB340, 0x88E4, 0xB341, 0x88E5, 0xB342, 0x88E6, 0xB343, + 0x88E7, 0xB344, 0x88E8, 0xB345, 0x88E9, 0xB346, 0x88EA, 0xB347, + 0x88EB, 0xB348, 0x88EC, 0xB349, 0x88ED, 0xB34A, 0x88EE, 0xB34B, + 0x88EF, 0xB34C, 0x88F0, 0xB34D, 0x88F1, 0xB34E, 0x88F2, 0xB34F, + 0x88F3, 0xB350, 0x88F4, 0xB351, 0x88F5, 0xB352, 0x88F6, 0xB353, + 0x88F7, 0xB357, 0x88F8, 0xB359, 0x88F9, 0xB35A, 0x88FA, 0xB35D, + 0x88FB, 0xB360, 0x88FC, 0xB361, 0x88FD, 0xB362, 0x88FE, 0xB363, + 0x8941, 0xB366, 0x8942, 0xB368, 0x8943, 0xB36A, 0x8944, 0xB36C, + 0x8945, 0xB36D, 0x8946, 0xB36F, 0x8947, 0xB372, 0x8948, 0xB373, + 0x8949, 0xB375, 0x894A, 0xB376, 0x894B, 0xB377, 0x894C, 0xB379, + 0x894D, 0xB37A, 0x894E, 0xB37B, 0x894F, 0xB37C, 0x8950, 0xB37D, + 0x8951, 0xB37E, 0x8952, 0xB37F, 0x8953, 0xB382, 0x8954, 0xB386, + 0x8955, 0xB387, 0x8956, 0xB388, 0x8957, 0xB389, 0x8958, 0xB38A, + 0x8959, 0xB38B, 0x895A, 0xB38D, 0x8961, 0xB38E, 0x8962, 0xB38F, + 0x8963, 0xB391, 0x8964, 0xB392, 0x8965, 0xB393, 0x8966, 0xB395, + 0x8967, 0xB396, 0x8968, 0xB397, 0x8969, 0xB398, 0x896A, 0xB399, + 0x896B, 0xB39A, 0x896C, 0xB39B, 0x896D, 0xB39C, 0x896E, 0xB39D, + 0x896F, 0xB39E, 0x8970, 0xB39F, 0x8971, 0xB3A2, 0x8972, 0xB3A3, + 0x8973, 0xB3A4, 0x8974, 0xB3A5, 0x8975, 0xB3A6, 0x8976, 0xB3A7, + 0x8977, 0xB3A9, 0x8978, 0xB3AA, 0x8979, 0xB3AB, 0x897A, 0xB3AD, + 0x8981, 0xB3AE, 0x8982, 0xB3AF, 0x8983, 0xB3B0, 0x8984, 0xB3B1, + 0x8985, 0xB3B2, 0x8986, 0xB3B3, 0x8987, 0xB3B4, 0x8988, 0xB3B5, + 0x8989, 0xB3B6, 0x898A, 0xB3B7, 0x898B, 0xB3B8, 0x898C, 0xB3B9, + 0x898D, 0xB3BA, 0x898E, 0xB3BB, 0x898F, 0xB3BC, 0x8990, 0xB3BD, + 0x8991, 0xB3BE, 0x8992, 0xB3BF, 0x8993, 0xB3C0, 0x8994, 0xB3C1, + 0x8995, 0xB3C2, 0x8996, 0xB3C3, 0x8997, 0xB3C6, 0x8998, 0xB3C7, + 0x8999, 0xB3C9, 0x899A, 0xB3CA, 0x899B, 0xB3CD, 0x899C, 0xB3CF, + 0x899D, 0xB3D1, 0x899E, 0xB3D2, 0x899F, 0xB3D3, 0x89A0, 0xB3D6, + 0x89A1, 0xB3D8, 0x89A2, 0xB3DA, 0x89A3, 0xB3DC, 0x89A4, 0xB3DE, + 0x89A5, 0xB3DF, 0x89A6, 0xB3E1, 0x89A7, 0xB3E2, 0x89A8, 0xB3E3, + 0x89A9, 0xB3E5, 0x89AA, 0xB3E6, 0x89AB, 0xB3E7, 0x89AC, 0xB3E9, + 0x89AD, 0xB3EA, 0x89AE, 0xB3EB, 0x89AF, 0xB3EC, 0x89B0, 0xB3ED, + 0x89B1, 0xB3EE, 0x89B2, 0xB3EF, 0x89B3, 0xB3F0, 0x89B4, 0xB3F1, + 0x89B5, 0xB3F2, 0x89B6, 0xB3F3, 0x89B7, 0xB3F4, 0x89B8, 0xB3F5, + 0x89B9, 0xB3F6, 0x89BA, 0xB3F7, 0x89BB, 0xB3F8, 0x89BC, 0xB3F9, + 0x89BD, 0xB3FA, 0x89BE, 0xB3FB, 0x89BF, 0xB3FD, 0x89C0, 0xB3FE, + 0x89C1, 0xB3FF, 0x89C2, 0xB400, 0x89C3, 0xB401, 0x89C4, 0xB402, + 0x89C5, 0xB403, 0x89C6, 0xB404, 0x89C7, 0xB405, 0x89C8, 0xB406, + 0x89C9, 0xB407, 0x89CA, 0xB408, 0x89CB, 0xB409, 0x89CC, 0xB40A, + 0x89CD, 0xB40B, 0x89CE, 0xB40C, 0x89CF, 0xB40D, 0x89D0, 0xB40E, + 0x89D1, 0xB40F, 0x89D2, 0xB411, 0x89D3, 0xB412, 0x89D4, 0xB413, + 0x89D5, 0xB414, 0x89D6, 0xB415, 0x89D7, 0xB416, 0x89D8, 0xB417, + 0x89D9, 0xB419, 0x89DA, 0xB41A, 0x89DB, 0xB41B, 0x89DC, 0xB41D, + 0x89DD, 0xB41E, 0x89DE, 0xB41F, 0x89DF, 0xB421, 0x89E0, 0xB422, + 0x89E1, 0xB423, 0x89E2, 0xB424, 0x89E3, 0xB425, 0x89E4, 0xB426, + 0x89E5, 0xB427, 0x89E6, 0xB42A, 0x89E7, 0xB42C, 0x89E8, 0xB42D, + 0x89E9, 0xB42E, 0x89EA, 0xB42F, 0x89EB, 0xB430, 0x89EC, 0xB431, + 0x89ED, 0xB432, 0x89EE, 0xB433, 0x89EF, 0xB435, 0x89F0, 0xB436, + 0x89F1, 0xB437, 0x89F2, 0xB438, 0x89F3, 0xB439, 0x89F4, 0xB43A, + 0x89F5, 0xB43B, 0x89F6, 0xB43C, 0x89F7, 0xB43D, 0x89F8, 0xB43E, + 0x89F9, 0xB43F, 0x89FA, 0xB440, 0x89FB, 0xB441, 0x89FC, 0xB442, + 0x89FD, 0xB443, 0x89FE, 0xB444, 0x8A41, 0xB445, 0x8A42, 0xB446, + 0x8A43, 0xB447, 0x8A44, 0xB448, 0x8A45, 0xB449, 0x8A46, 0xB44A, + 0x8A47, 0xB44B, 0x8A48, 0xB44C, 0x8A49, 0xB44D, 0x8A4A, 0xB44E, + 0x8A4B, 0xB44F, 0x8A4C, 0xB452, 0x8A4D, 0xB453, 0x8A4E, 0xB455, + 0x8A4F, 0xB456, 0x8A50, 0xB457, 0x8A51, 0xB459, 0x8A52, 0xB45A, + 0x8A53, 0xB45B, 0x8A54, 0xB45C, 0x8A55, 0xB45D, 0x8A56, 0xB45E, + 0x8A57, 0xB45F, 0x8A58, 0xB462, 0x8A59, 0xB464, 0x8A5A, 0xB466, + 0x8A61, 0xB467, 0x8A62, 0xB468, 0x8A63, 0xB469, 0x8A64, 0xB46A, + 0x8A65, 0xB46B, 0x8A66, 0xB46D, 0x8A67, 0xB46E, 0x8A68, 0xB46F, + 0x8A69, 0xB470, 0x8A6A, 0xB471, 0x8A6B, 0xB472, 0x8A6C, 0xB473, + 0x8A6D, 0xB474, 0x8A6E, 0xB475, 0x8A6F, 0xB476, 0x8A70, 0xB477, + 0x8A71, 0xB478, 0x8A72, 0xB479, 0x8A73, 0xB47A, 0x8A74, 0xB47B, + 0x8A75, 0xB47C, 0x8A76, 0xB47D, 0x8A77, 0xB47E, 0x8A78, 0xB47F, + 0x8A79, 0xB481, 0x8A7A, 0xB482, 0x8A81, 0xB483, 0x8A82, 0xB484, + 0x8A83, 0xB485, 0x8A84, 0xB486, 0x8A85, 0xB487, 0x8A86, 0xB489, + 0x8A87, 0xB48A, 0x8A88, 0xB48B, 0x8A89, 0xB48C, 0x8A8A, 0xB48D, + 0x8A8B, 0xB48E, 0x8A8C, 0xB48F, 0x8A8D, 0xB490, 0x8A8E, 0xB491, + 0x8A8F, 0xB492, 0x8A90, 0xB493, 0x8A91, 0xB494, 0x8A92, 0xB495, + 0x8A93, 0xB496, 0x8A94, 0xB497, 0x8A95, 0xB498, 0x8A96, 0xB499, + 0x8A97, 0xB49A, 0x8A98, 0xB49B, 0x8A99, 0xB49C, 0x8A9A, 0xB49E, + 0x8A9B, 0xB49F, 0x8A9C, 0xB4A0, 0x8A9D, 0xB4A1, 0x8A9E, 0xB4A2, + 0x8A9F, 0xB4A3, 0x8AA0, 0xB4A5, 0x8AA1, 0xB4A6, 0x8AA2, 0xB4A7, + 0x8AA3, 0xB4A9, 0x8AA4, 0xB4AA, 0x8AA5, 0xB4AB, 0x8AA6, 0xB4AD, + 0x8AA7, 0xB4AE, 0x8AA8, 0xB4AF, 0x8AA9, 0xB4B0, 0x8AAA, 0xB4B1, + 0x8AAB, 0xB4B2, 0x8AAC, 0xB4B3, 0x8AAD, 0xB4B4, 0x8AAE, 0xB4B6, + 0x8AAF, 0xB4B8, 0x8AB0, 0xB4BA, 0x8AB1, 0xB4BB, 0x8AB2, 0xB4BC, + 0x8AB3, 0xB4BD, 0x8AB4, 0xB4BE, 0x8AB5, 0xB4BF, 0x8AB6, 0xB4C1, + 0x8AB7, 0xB4C2, 0x8AB8, 0xB4C3, 0x8AB9, 0xB4C5, 0x8ABA, 0xB4C6, + 0x8ABB, 0xB4C7, 0x8ABC, 0xB4C9, 0x8ABD, 0xB4CA, 0x8ABE, 0xB4CB, + 0x8ABF, 0xB4CC, 0x8AC0, 0xB4CD, 0x8AC1, 0xB4CE, 0x8AC2, 0xB4CF, + 0x8AC3, 0xB4D1, 0x8AC4, 0xB4D2, 0x8AC5, 0xB4D3, 0x8AC6, 0xB4D4, + 0x8AC7, 0xB4D6, 0x8AC8, 0xB4D7, 0x8AC9, 0xB4D8, 0x8ACA, 0xB4D9, + 0x8ACB, 0xB4DA, 0x8ACC, 0xB4DB, 0x8ACD, 0xB4DE, 0x8ACE, 0xB4DF, + 0x8ACF, 0xB4E1, 0x8AD0, 0xB4E2, 0x8AD1, 0xB4E5, 0x8AD2, 0xB4E7, + 0x8AD3, 0xB4E8, 0x8AD4, 0xB4E9, 0x8AD5, 0xB4EA, 0x8AD6, 0xB4EB, + 0x8AD7, 0xB4EE, 0x8AD8, 0xB4F0, 0x8AD9, 0xB4F2, 0x8ADA, 0xB4F3, + 0x8ADB, 0xB4F4, 0x8ADC, 0xB4F5, 0x8ADD, 0xB4F6, 0x8ADE, 0xB4F7, + 0x8ADF, 0xB4F9, 0x8AE0, 0xB4FA, 0x8AE1, 0xB4FB, 0x8AE2, 0xB4FC, + 0x8AE3, 0xB4FD, 0x8AE4, 0xB4FE, 0x8AE5, 0xB4FF, 0x8AE6, 0xB500, + 0x8AE7, 0xB501, 0x8AE8, 0xB502, 0x8AE9, 0xB503, 0x8AEA, 0xB504, + 0x8AEB, 0xB505, 0x8AEC, 0xB506, 0x8AED, 0xB507, 0x8AEE, 0xB508, + 0x8AEF, 0xB509, 0x8AF0, 0xB50A, 0x8AF1, 0xB50B, 0x8AF2, 0xB50C, + 0x8AF3, 0xB50D, 0x8AF4, 0xB50E, 0x8AF5, 0xB50F, 0x8AF6, 0xB510, + 0x8AF7, 0xB511, 0x8AF8, 0xB512, 0x8AF9, 0xB513, 0x8AFA, 0xB516, + 0x8AFB, 0xB517, 0x8AFC, 0xB519, 0x8AFD, 0xB51A, 0x8AFE, 0xB51D, + 0x8B41, 0xB51E, 0x8B42, 0xB51F, 0x8B43, 0xB520, 0x8B44, 0xB521, + 0x8B45, 0xB522, 0x8B46, 0xB523, 0x8B47, 0xB526, 0x8B48, 0xB52B, + 0x8B49, 0xB52C, 0x8B4A, 0xB52D, 0x8B4B, 0xB52E, 0x8B4C, 0xB52F, + 0x8B4D, 0xB532, 0x8B4E, 0xB533, 0x8B4F, 0xB535, 0x8B50, 0xB536, + 0x8B51, 0xB537, 0x8B52, 0xB539, 0x8B53, 0xB53A, 0x8B54, 0xB53B, + 0x8B55, 0xB53C, 0x8B56, 0xB53D, 0x8B57, 0xB53E, 0x8B58, 0xB53F, + 0x8B59, 0xB542, 0x8B5A, 0xB546, 0x8B61, 0xB547, 0x8B62, 0xB548, + 0x8B63, 0xB549, 0x8B64, 0xB54A, 0x8B65, 0xB54E, 0x8B66, 0xB54F, + 0x8B67, 0xB551, 0x8B68, 0xB552, 0x8B69, 0xB553, 0x8B6A, 0xB555, + 0x8B6B, 0xB556, 0x8B6C, 0xB557, 0x8B6D, 0xB558, 0x8B6E, 0xB559, + 0x8B6F, 0xB55A, 0x8B70, 0xB55B, 0x8B71, 0xB55E, 0x8B72, 0xB562, + 0x8B73, 0xB563, 0x8B74, 0xB564, 0x8B75, 0xB565, 0x8B76, 0xB566, + 0x8B77, 0xB567, 0x8B78, 0xB568, 0x8B79, 0xB569, 0x8B7A, 0xB56A, + 0x8B81, 0xB56B, 0x8B82, 0xB56C, 0x8B83, 0xB56D, 0x8B84, 0xB56E, + 0x8B85, 0xB56F, 0x8B86, 0xB570, 0x8B87, 0xB571, 0x8B88, 0xB572, + 0x8B89, 0xB573, 0x8B8A, 0xB574, 0x8B8B, 0xB575, 0x8B8C, 0xB576, + 0x8B8D, 0xB577, 0x8B8E, 0xB578, 0x8B8F, 0xB579, 0x8B90, 0xB57A, + 0x8B91, 0xB57B, 0x8B92, 0xB57C, 0x8B93, 0xB57D, 0x8B94, 0xB57E, + 0x8B95, 0xB57F, 0x8B96, 0xB580, 0x8B97, 0xB581, 0x8B98, 0xB582, + 0x8B99, 0xB583, 0x8B9A, 0xB584, 0x8B9B, 0xB585, 0x8B9C, 0xB586, + 0x8B9D, 0xB587, 0x8B9E, 0xB588, 0x8B9F, 0xB589, 0x8BA0, 0xB58A, + 0x8BA1, 0xB58B, 0x8BA2, 0xB58C, 0x8BA3, 0xB58D, 0x8BA4, 0xB58E, + 0x8BA5, 0xB58F, 0x8BA6, 0xB590, 0x8BA7, 0xB591, 0x8BA8, 0xB592, + 0x8BA9, 0xB593, 0x8BAA, 0xB594, 0x8BAB, 0xB595, 0x8BAC, 0xB596, + 0x8BAD, 0xB597, 0x8BAE, 0xB598, 0x8BAF, 0xB599, 0x8BB0, 0xB59A, + 0x8BB1, 0xB59B, 0x8BB2, 0xB59C, 0x8BB3, 0xB59D, 0x8BB4, 0xB59E, + 0x8BB5, 0xB59F, 0x8BB6, 0xB5A2, 0x8BB7, 0xB5A3, 0x8BB8, 0xB5A5, + 0x8BB9, 0xB5A6, 0x8BBA, 0xB5A7, 0x8BBB, 0xB5A9, 0x8BBC, 0xB5AC, + 0x8BBD, 0xB5AD, 0x8BBE, 0xB5AE, 0x8BBF, 0xB5AF, 0x8BC0, 0xB5B2, + 0x8BC1, 0xB5B6, 0x8BC2, 0xB5B7, 0x8BC3, 0xB5B8, 0x8BC4, 0xB5B9, + 0x8BC5, 0xB5BA, 0x8BC6, 0xB5BE, 0x8BC7, 0xB5BF, 0x8BC8, 0xB5C1, + 0x8BC9, 0xB5C2, 0x8BCA, 0xB5C3, 0x8BCB, 0xB5C5, 0x8BCC, 0xB5C6, + 0x8BCD, 0xB5C7, 0x8BCE, 0xB5C8, 0x8BCF, 0xB5C9, 0x8BD0, 0xB5CA, + 0x8BD1, 0xB5CB, 0x8BD2, 0xB5CE, 0x8BD3, 0xB5D2, 0x8BD4, 0xB5D3, + 0x8BD5, 0xB5D4, 0x8BD6, 0xB5D5, 0x8BD7, 0xB5D6, 0x8BD8, 0xB5D7, + 0x8BD9, 0xB5D9, 0x8BDA, 0xB5DA, 0x8BDB, 0xB5DB, 0x8BDC, 0xB5DC, + 0x8BDD, 0xB5DD, 0x8BDE, 0xB5DE, 0x8BDF, 0xB5DF, 0x8BE0, 0xB5E0, + 0x8BE1, 0xB5E1, 0x8BE2, 0xB5E2, 0x8BE3, 0xB5E3, 0x8BE4, 0xB5E4, + 0x8BE5, 0xB5E5, 0x8BE6, 0xB5E6, 0x8BE7, 0xB5E7, 0x8BE8, 0xB5E8, + 0x8BE9, 0xB5E9, 0x8BEA, 0xB5EA, 0x8BEB, 0xB5EB, 0x8BEC, 0xB5ED, + 0x8BED, 0xB5EE, 0x8BEE, 0xB5EF, 0x8BEF, 0xB5F0, 0x8BF0, 0xB5F1, + 0x8BF1, 0xB5F2, 0x8BF2, 0xB5F3, 0x8BF3, 0xB5F4, 0x8BF4, 0xB5F5, + 0x8BF5, 0xB5F6, 0x8BF6, 0xB5F7, 0x8BF7, 0xB5F8, 0x8BF8, 0xB5F9, + 0x8BF9, 0xB5FA, 0x8BFA, 0xB5FB, 0x8BFB, 0xB5FC, 0x8BFC, 0xB5FD, + 0x8BFD, 0xB5FE, 0x8BFE, 0xB5FF, 0x8C41, 0xB600, 0x8C42, 0xB601, + 0x8C43, 0xB602, 0x8C44, 0xB603, 0x8C45, 0xB604, 0x8C46, 0xB605, + 0x8C47, 0xB606, 0x8C48, 0xB607, 0x8C49, 0xB608, 0x8C4A, 0xB609, + 0x8C4B, 0xB60A, 0x8C4C, 0xB60B, 0x8C4D, 0xB60C, 0x8C4E, 0xB60D, + 0x8C4F, 0xB60E, 0x8C50, 0xB60F, 0x8C51, 0xB612, 0x8C52, 0xB613, + 0x8C53, 0xB615, 0x8C54, 0xB616, 0x8C55, 0xB617, 0x8C56, 0xB619, + 0x8C57, 0xB61A, 0x8C58, 0xB61B, 0x8C59, 0xB61C, 0x8C5A, 0xB61D, + 0x8C61, 0xB61E, 0x8C62, 0xB61F, 0x8C63, 0xB620, 0x8C64, 0xB621, + 0x8C65, 0xB622, 0x8C66, 0xB623, 0x8C67, 0xB624, 0x8C68, 0xB626, + 0x8C69, 0xB627, 0x8C6A, 0xB628, 0x8C6B, 0xB629, 0x8C6C, 0xB62A, + 0x8C6D, 0xB62B, 0x8C6E, 0xB62D, 0x8C6F, 0xB62E, 0x8C70, 0xB62F, + 0x8C71, 0xB630, 0x8C72, 0xB631, 0x8C73, 0xB632, 0x8C74, 0xB633, + 0x8C75, 0xB635, 0x8C76, 0xB636, 0x8C77, 0xB637, 0x8C78, 0xB638, + 0x8C79, 0xB639, 0x8C7A, 0xB63A, 0x8C81, 0xB63B, 0x8C82, 0xB63C, + 0x8C83, 0xB63D, 0x8C84, 0xB63E, 0x8C85, 0xB63F, 0x8C86, 0xB640, + 0x8C87, 0xB641, 0x8C88, 0xB642, 0x8C89, 0xB643, 0x8C8A, 0xB644, + 0x8C8B, 0xB645, 0x8C8C, 0xB646, 0x8C8D, 0xB647, 0x8C8E, 0xB649, + 0x8C8F, 0xB64A, 0x8C90, 0xB64B, 0x8C91, 0xB64C, 0x8C92, 0xB64D, + 0x8C93, 0xB64E, 0x8C94, 0xB64F, 0x8C95, 0xB650, 0x8C96, 0xB651, + 0x8C97, 0xB652, 0x8C98, 0xB653, 0x8C99, 0xB654, 0x8C9A, 0xB655, + 0x8C9B, 0xB656, 0x8C9C, 0xB657, 0x8C9D, 0xB658, 0x8C9E, 0xB659, + 0x8C9F, 0xB65A, 0x8CA0, 0xB65B, 0x8CA1, 0xB65C, 0x8CA2, 0xB65D, + 0x8CA3, 0xB65E, 0x8CA4, 0xB65F, 0x8CA5, 0xB660, 0x8CA6, 0xB661, + 0x8CA7, 0xB662, 0x8CA8, 0xB663, 0x8CA9, 0xB665, 0x8CAA, 0xB666, + 0x8CAB, 0xB667, 0x8CAC, 0xB669, 0x8CAD, 0xB66A, 0x8CAE, 0xB66B, + 0x8CAF, 0xB66C, 0x8CB0, 0xB66D, 0x8CB1, 0xB66E, 0x8CB2, 0xB66F, + 0x8CB3, 0xB670, 0x8CB4, 0xB671, 0x8CB5, 0xB672, 0x8CB6, 0xB673, + 0x8CB7, 0xB674, 0x8CB8, 0xB675, 0x8CB9, 0xB676, 0x8CBA, 0xB677, + 0x8CBB, 0xB678, 0x8CBC, 0xB679, 0x8CBD, 0xB67A, 0x8CBE, 0xB67B, + 0x8CBF, 0xB67C, 0x8CC0, 0xB67D, 0x8CC1, 0xB67E, 0x8CC2, 0xB67F, + 0x8CC3, 0xB680, 0x8CC4, 0xB681, 0x8CC5, 0xB682, 0x8CC6, 0xB683, + 0x8CC7, 0xB684, 0x8CC8, 0xB685, 0x8CC9, 0xB686, 0x8CCA, 0xB687, + 0x8CCB, 0xB688, 0x8CCC, 0xB689, 0x8CCD, 0xB68A, 0x8CCE, 0xB68B, + 0x8CCF, 0xB68C, 0x8CD0, 0xB68D, 0x8CD1, 0xB68E, 0x8CD2, 0xB68F, + 0x8CD3, 0xB690, 0x8CD4, 0xB691, 0x8CD5, 0xB692, 0x8CD6, 0xB693, + 0x8CD7, 0xB694, 0x8CD8, 0xB695, 0x8CD9, 0xB696, 0x8CDA, 0xB697, + 0x8CDB, 0xB698, 0x8CDC, 0xB699, 0x8CDD, 0xB69A, 0x8CDE, 0xB69B, + 0x8CDF, 0xB69E, 0x8CE0, 0xB69F, 0x8CE1, 0xB6A1, 0x8CE2, 0xB6A2, + 0x8CE3, 0xB6A3, 0x8CE4, 0xB6A5, 0x8CE5, 0xB6A6, 0x8CE6, 0xB6A7, + 0x8CE7, 0xB6A8, 0x8CE8, 0xB6A9, 0x8CE9, 0xB6AA, 0x8CEA, 0xB6AD, + 0x8CEB, 0xB6AE, 0x8CEC, 0xB6AF, 0x8CED, 0xB6B0, 0x8CEE, 0xB6B2, + 0x8CEF, 0xB6B3, 0x8CF0, 0xB6B4, 0x8CF1, 0xB6B5, 0x8CF2, 0xB6B6, + 0x8CF3, 0xB6B7, 0x8CF4, 0xB6B8, 0x8CF5, 0xB6B9, 0x8CF6, 0xB6BA, + 0x8CF7, 0xB6BB, 0x8CF8, 0xB6BC, 0x8CF9, 0xB6BD, 0x8CFA, 0xB6BE, + 0x8CFB, 0xB6BF, 0x8CFC, 0xB6C0, 0x8CFD, 0xB6C1, 0x8CFE, 0xB6C2, + 0x8D41, 0xB6C3, 0x8D42, 0xB6C4, 0x8D43, 0xB6C5, 0x8D44, 0xB6C6, + 0x8D45, 0xB6C7, 0x8D46, 0xB6C8, 0x8D47, 0xB6C9, 0x8D48, 0xB6CA, + 0x8D49, 0xB6CB, 0x8D4A, 0xB6CC, 0x8D4B, 0xB6CD, 0x8D4C, 0xB6CE, + 0x8D4D, 0xB6CF, 0x8D4E, 0xB6D0, 0x8D4F, 0xB6D1, 0x8D50, 0xB6D2, + 0x8D51, 0xB6D3, 0x8D52, 0xB6D5, 0x8D53, 0xB6D6, 0x8D54, 0xB6D7, + 0x8D55, 0xB6D8, 0x8D56, 0xB6D9, 0x8D57, 0xB6DA, 0x8D58, 0xB6DB, + 0x8D59, 0xB6DC, 0x8D5A, 0xB6DD, 0x8D61, 0xB6DE, 0x8D62, 0xB6DF, + 0x8D63, 0xB6E0, 0x8D64, 0xB6E1, 0x8D65, 0xB6E2, 0x8D66, 0xB6E3, + 0x8D67, 0xB6E4, 0x8D68, 0xB6E5, 0x8D69, 0xB6E6, 0x8D6A, 0xB6E7, + 0x8D6B, 0xB6E8, 0x8D6C, 0xB6E9, 0x8D6D, 0xB6EA, 0x8D6E, 0xB6EB, + 0x8D6F, 0xB6EC, 0x8D70, 0xB6ED, 0x8D71, 0xB6EE, 0x8D72, 0xB6EF, + 0x8D73, 0xB6F1, 0x8D74, 0xB6F2, 0x8D75, 0xB6F3, 0x8D76, 0xB6F5, + 0x8D77, 0xB6F6, 0x8D78, 0xB6F7, 0x8D79, 0xB6F9, 0x8D7A, 0xB6FA, + 0x8D81, 0xB6FB, 0x8D82, 0xB6FC, 0x8D83, 0xB6FD, 0x8D84, 0xB6FE, + 0x8D85, 0xB6FF, 0x8D86, 0xB702, 0x8D87, 0xB703, 0x8D88, 0xB704, + 0x8D89, 0xB706, 0x8D8A, 0xB707, 0x8D8B, 0xB708, 0x8D8C, 0xB709, + 0x8D8D, 0xB70A, 0x8D8E, 0xB70B, 0x8D8F, 0xB70C, 0x8D90, 0xB70D, + 0x8D91, 0xB70E, 0x8D92, 0xB70F, 0x8D93, 0xB710, 0x8D94, 0xB711, + 0x8D95, 0xB712, 0x8D96, 0xB713, 0x8D97, 0xB714, 0x8D98, 0xB715, + 0x8D99, 0xB716, 0x8D9A, 0xB717, 0x8D9B, 0xB718, 0x8D9C, 0xB719, + 0x8D9D, 0xB71A, 0x8D9E, 0xB71B, 0x8D9F, 0xB71C, 0x8DA0, 0xB71D, + 0x8DA1, 0xB71E, 0x8DA2, 0xB71F, 0x8DA3, 0xB720, 0x8DA4, 0xB721, + 0x8DA5, 0xB722, 0x8DA6, 0xB723, 0x8DA7, 0xB724, 0x8DA8, 0xB725, + 0x8DA9, 0xB726, 0x8DAA, 0xB727, 0x8DAB, 0xB72A, 0x8DAC, 0xB72B, + 0x8DAD, 0xB72D, 0x8DAE, 0xB72E, 0x8DAF, 0xB731, 0x8DB0, 0xB732, + 0x8DB1, 0xB733, 0x8DB2, 0xB734, 0x8DB3, 0xB735, 0x8DB4, 0xB736, + 0x8DB5, 0xB737, 0x8DB6, 0xB73A, 0x8DB7, 0xB73C, 0x8DB8, 0xB73D, + 0x8DB9, 0xB73E, 0x8DBA, 0xB73F, 0x8DBB, 0xB740, 0x8DBC, 0xB741, + 0x8DBD, 0xB742, 0x8DBE, 0xB743, 0x8DBF, 0xB745, 0x8DC0, 0xB746, + 0x8DC1, 0xB747, 0x8DC2, 0xB749, 0x8DC3, 0xB74A, 0x8DC4, 0xB74B, + 0x8DC5, 0xB74D, 0x8DC6, 0xB74E, 0x8DC7, 0xB74F, 0x8DC8, 0xB750, + 0x8DC9, 0xB751, 0x8DCA, 0xB752, 0x8DCB, 0xB753, 0x8DCC, 0xB756, + 0x8DCD, 0xB757, 0x8DCE, 0xB758, 0x8DCF, 0xB759, 0x8DD0, 0xB75A, + 0x8DD1, 0xB75B, 0x8DD2, 0xB75C, 0x8DD3, 0xB75D, 0x8DD4, 0xB75E, + 0x8DD5, 0xB75F, 0x8DD6, 0xB761, 0x8DD7, 0xB762, 0x8DD8, 0xB763, + 0x8DD9, 0xB765, 0x8DDA, 0xB766, 0x8DDB, 0xB767, 0x8DDC, 0xB769, + 0x8DDD, 0xB76A, 0x8DDE, 0xB76B, 0x8DDF, 0xB76C, 0x8DE0, 0xB76D, + 0x8DE1, 0xB76E, 0x8DE2, 0xB76F, 0x8DE3, 0xB772, 0x8DE4, 0xB774, + 0x8DE5, 0xB776, 0x8DE6, 0xB777, 0x8DE7, 0xB778, 0x8DE8, 0xB779, + 0x8DE9, 0xB77A, 0x8DEA, 0xB77B, 0x8DEB, 0xB77E, 0x8DEC, 0xB77F, + 0x8DED, 0xB781, 0x8DEE, 0xB782, 0x8DEF, 0xB783, 0x8DF0, 0xB785, + 0x8DF1, 0xB786, 0x8DF2, 0xB787, 0x8DF3, 0xB788, 0x8DF4, 0xB789, + 0x8DF5, 0xB78A, 0x8DF6, 0xB78B, 0x8DF7, 0xB78E, 0x8DF8, 0xB793, + 0x8DF9, 0xB794, 0x8DFA, 0xB795, 0x8DFB, 0xB79A, 0x8DFC, 0xB79B, + 0x8DFD, 0xB79D, 0x8DFE, 0xB79E, 0x8E41, 0xB79F, 0x8E42, 0xB7A1, + 0x8E43, 0xB7A2, 0x8E44, 0xB7A3, 0x8E45, 0xB7A4, 0x8E46, 0xB7A5, + 0x8E47, 0xB7A6, 0x8E48, 0xB7A7, 0x8E49, 0xB7AA, 0x8E4A, 0xB7AE, + 0x8E4B, 0xB7AF, 0x8E4C, 0xB7B0, 0x8E4D, 0xB7B1, 0x8E4E, 0xB7B2, + 0x8E4F, 0xB7B3, 0x8E50, 0xB7B6, 0x8E51, 0xB7B7, 0x8E52, 0xB7B9, + 0x8E53, 0xB7BA, 0x8E54, 0xB7BB, 0x8E55, 0xB7BC, 0x8E56, 0xB7BD, + 0x8E57, 0xB7BE, 0x8E58, 0xB7BF, 0x8E59, 0xB7C0, 0x8E5A, 0xB7C1, + 0x8E61, 0xB7C2, 0x8E62, 0xB7C3, 0x8E63, 0xB7C4, 0x8E64, 0xB7C5, + 0x8E65, 0xB7C6, 0x8E66, 0xB7C8, 0x8E67, 0xB7CA, 0x8E68, 0xB7CB, + 0x8E69, 0xB7CC, 0x8E6A, 0xB7CD, 0x8E6B, 0xB7CE, 0x8E6C, 0xB7CF, + 0x8E6D, 0xB7D0, 0x8E6E, 0xB7D1, 0x8E6F, 0xB7D2, 0x8E70, 0xB7D3, + 0x8E71, 0xB7D4, 0x8E72, 0xB7D5, 0x8E73, 0xB7D6, 0x8E74, 0xB7D7, + 0x8E75, 0xB7D8, 0x8E76, 0xB7D9, 0x8E77, 0xB7DA, 0x8E78, 0xB7DB, + 0x8E79, 0xB7DC, 0x8E7A, 0xB7DD, 0x8E81, 0xB7DE, 0x8E82, 0xB7DF, + 0x8E83, 0xB7E0, 0x8E84, 0xB7E1, 0x8E85, 0xB7E2, 0x8E86, 0xB7E3, + 0x8E87, 0xB7E4, 0x8E88, 0xB7E5, 0x8E89, 0xB7E6, 0x8E8A, 0xB7E7, + 0x8E8B, 0xB7E8, 0x8E8C, 0xB7E9, 0x8E8D, 0xB7EA, 0x8E8E, 0xB7EB, + 0x8E8F, 0xB7EE, 0x8E90, 0xB7EF, 0x8E91, 0xB7F1, 0x8E92, 0xB7F2, + 0x8E93, 0xB7F3, 0x8E94, 0xB7F5, 0x8E95, 0xB7F6, 0x8E96, 0xB7F7, + 0x8E97, 0xB7F8, 0x8E98, 0xB7F9, 0x8E99, 0xB7FA, 0x8E9A, 0xB7FB, + 0x8E9B, 0xB7FE, 0x8E9C, 0xB802, 0x8E9D, 0xB803, 0x8E9E, 0xB804, + 0x8E9F, 0xB805, 0x8EA0, 0xB806, 0x8EA1, 0xB80A, 0x8EA2, 0xB80B, + 0x8EA3, 0xB80D, 0x8EA4, 0xB80E, 0x8EA5, 0xB80F, 0x8EA6, 0xB811, + 0x8EA7, 0xB812, 0x8EA8, 0xB813, 0x8EA9, 0xB814, 0x8EAA, 0xB815, + 0x8EAB, 0xB816, 0x8EAC, 0xB817, 0x8EAD, 0xB81A, 0x8EAE, 0xB81C, + 0x8EAF, 0xB81E, 0x8EB0, 0xB81F, 0x8EB1, 0xB820, 0x8EB2, 0xB821, + 0x8EB3, 0xB822, 0x8EB4, 0xB823, 0x8EB5, 0xB826, 0x8EB6, 0xB827, + 0x8EB7, 0xB829, 0x8EB8, 0xB82A, 0x8EB9, 0xB82B, 0x8EBA, 0xB82D, + 0x8EBB, 0xB82E, 0x8EBC, 0xB82F, 0x8EBD, 0xB830, 0x8EBE, 0xB831, + 0x8EBF, 0xB832, 0x8EC0, 0xB833, 0x8EC1, 0xB836, 0x8EC2, 0xB83A, + 0x8EC3, 0xB83B, 0x8EC4, 0xB83C, 0x8EC5, 0xB83D, 0x8EC6, 0xB83E, + 0x8EC7, 0xB83F, 0x8EC8, 0xB841, 0x8EC9, 0xB842, 0x8ECA, 0xB843, + 0x8ECB, 0xB845, 0x8ECC, 0xB846, 0x8ECD, 0xB847, 0x8ECE, 0xB848, + 0x8ECF, 0xB849, 0x8ED0, 0xB84A, 0x8ED1, 0xB84B, 0x8ED2, 0xB84C, + 0x8ED3, 0xB84D, 0x8ED4, 0xB84E, 0x8ED5, 0xB84F, 0x8ED6, 0xB850, + 0x8ED7, 0xB852, 0x8ED8, 0xB854, 0x8ED9, 0xB855, 0x8EDA, 0xB856, + 0x8EDB, 0xB857, 0x8EDC, 0xB858, 0x8EDD, 0xB859, 0x8EDE, 0xB85A, + 0x8EDF, 0xB85B, 0x8EE0, 0xB85E, 0x8EE1, 0xB85F, 0x8EE2, 0xB861, + 0x8EE3, 0xB862, 0x8EE4, 0xB863, 0x8EE5, 0xB865, 0x8EE6, 0xB866, + 0x8EE7, 0xB867, 0x8EE8, 0xB868, 0x8EE9, 0xB869, 0x8EEA, 0xB86A, + 0x8EEB, 0xB86B, 0x8EEC, 0xB86E, 0x8EED, 0xB870, 0x8EEE, 0xB872, + 0x8EEF, 0xB873, 0x8EF0, 0xB874, 0x8EF1, 0xB875, 0x8EF2, 0xB876, + 0x8EF3, 0xB877, 0x8EF4, 0xB879, 0x8EF5, 0xB87A, 0x8EF6, 0xB87B, + 0x8EF7, 0xB87D, 0x8EF8, 0xB87E, 0x8EF9, 0xB87F, 0x8EFA, 0xB880, + 0x8EFB, 0xB881, 0x8EFC, 0xB882, 0x8EFD, 0xB883, 0x8EFE, 0xB884, + 0x8F41, 0xB885, 0x8F42, 0xB886, 0x8F43, 0xB887, 0x8F44, 0xB888, + 0x8F45, 0xB889, 0x8F46, 0xB88A, 0x8F47, 0xB88B, 0x8F48, 0xB88C, + 0x8F49, 0xB88E, 0x8F4A, 0xB88F, 0x8F4B, 0xB890, 0x8F4C, 0xB891, + 0x8F4D, 0xB892, 0x8F4E, 0xB893, 0x8F4F, 0xB894, 0x8F50, 0xB895, + 0x8F51, 0xB896, 0x8F52, 0xB897, 0x8F53, 0xB898, 0x8F54, 0xB899, + 0x8F55, 0xB89A, 0x8F56, 0xB89B, 0x8F57, 0xB89C, 0x8F58, 0xB89D, + 0x8F59, 0xB89E, 0x8F5A, 0xB89F, 0x8F61, 0xB8A0, 0x8F62, 0xB8A1, + 0x8F63, 0xB8A2, 0x8F64, 0xB8A3, 0x8F65, 0xB8A4, 0x8F66, 0xB8A5, + 0x8F67, 0xB8A6, 0x8F68, 0xB8A7, 0x8F69, 0xB8A9, 0x8F6A, 0xB8AA, + 0x8F6B, 0xB8AB, 0x8F6C, 0xB8AC, 0x8F6D, 0xB8AD, 0x8F6E, 0xB8AE, + 0x8F6F, 0xB8AF, 0x8F70, 0xB8B1, 0x8F71, 0xB8B2, 0x8F72, 0xB8B3, + 0x8F73, 0xB8B5, 0x8F74, 0xB8B6, 0x8F75, 0xB8B7, 0x8F76, 0xB8B9, + 0x8F77, 0xB8BA, 0x8F78, 0xB8BB, 0x8F79, 0xB8BC, 0x8F7A, 0xB8BD, + 0x8F81, 0xB8BE, 0x8F82, 0xB8BF, 0x8F83, 0xB8C2, 0x8F84, 0xB8C4, + 0x8F85, 0xB8C6, 0x8F86, 0xB8C7, 0x8F87, 0xB8C8, 0x8F88, 0xB8C9, + 0x8F89, 0xB8CA, 0x8F8A, 0xB8CB, 0x8F8B, 0xB8CD, 0x8F8C, 0xB8CE, + 0x8F8D, 0xB8CF, 0x8F8E, 0xB8D1, 0x8F8F, 0xB8D2, 0x8F90, 0xB8D3, + 0x8F91, 0xB8D5, 0x8F92, 0xB8D6, 0x8F93, 0xB8D7, 0x8F94, 0xB8D8, + 0x8F95, 0xB8D9, 0x8F96, 0xB8DA, 0x8F97, 0xB8DB, 0x8F98, 0xB8DC, + 0x8F99, 0xB8DE, 0x8F9A, 0xB8E0, 0x8F9B, 0xB8E2, 0x8F9C, 0xB8E3, + 0x8F9D, 0xB8E4, 0x8F9E, 0xB8E5, 0x8F9F, 0xB8E6, 0x8FA0, 0xB8E7, + 0x8FA1, 0xB8EA, 0x8FA2, 0xB8EB, 0x8FA3, 0xB8ED, 0x8FA4, 0xB8EE, + 0x8FA5, 0xB8EF, 0x8FA6, 0xB8F1, 0x8FA7, 0xB8F2, 0x8FA8, 0xB8F3, + 0x8FA9, 0xB8F4, 0x8FAA, 0xB8F5, 0x8FAB, 0xB8F6, 0x8FAC, 0xB8F7, + 0x8FAD, 0xB8FA, 0x8FAE, 0xB8FC, 0x8FAF, 0xB8FE, 0x8FB0, 0xB8FF, + 0x8FB1, 0xB900, 0x8FB2, 0xB901, 0x8FB3, 0xB902, 0x8FB4, 0xB903, + 0x8FB5, 0xB905, 0x8FB6, 0xB906, 0x8FB7, 0xB907, 0x8FB8, 0xB908, + 0x8FB9, 0xB909, 0x8FBA, 0xB90A, 0x8FBB, 0xB90B, 0x8FBC, 0xB90C, + 0x8FBD, 0xB90D, 0x8FBE, 0xB90E, 0x8FBF, 0xB90F, 0x8FC0, 0xB910, + 0x8FC1, 0xB911, 0x8FC2, 0xB912, 0x8FC3, 0xB913, 0x8FC4, 0xB914, + 0x8FC5, 0xB915, 0x8FC6, 0xB916, 0x8FC7, 0xB917, 0x8FC8, 0xB919, + 0x8FC9, 0xB91A, 0x8FCA, 0xB91B, 0x8FCB, 0xB91C, 0x8FCC, 0xB91D, + 0x8FCD, 0xB91E, 0x8FCE, 0xB91F, 0x8FCF, 0xB921, 0x8FD0, 0xB922, + 0x8FD1, 0xB923, 0x8FD2, 0xB924, 0x8FD3, 0xB925, 0x8FD4, 0xB926, + 0x8FD5, 0xB927, 0x8FD6, 0xB928, 0x8FD7, 0xB929, 0x8FD8, 0xB92A, + 0x8FD9, 0xB92B, 0x8FDA, 0xB92C, 0x8FDB, 0xB92D, 0x8FDC, 0xB92E, + 0x8FDD, 0xB92F, 0x8FDE, 0xB930, 0x8FDF, 0xB931, 0x8FE0, 0xB932, + 0x8FE1, 0xB933, 0x8FE2, 0xB934, 0x8FE3, 0xB935, 0x8FE4, 0xB936, + 0x8FE5, 0xB937, 0x8FE6, 0xB938, 0x8FE7, 0xB939, 0x8FE8, 0xB93A, + 0x8FE9, 0xB93B, 0x8FEA, 0xB93E, 0x8FEB, 0xB93F, 0x8FEC, 0xB941, + 0x8FED, 0xB942, 0x8FEE, 0xB943, 0x8FEF, 0xB945, 0x8FF0, 0xB946, + 0x8FF1, 0xB947, 0x8FF2, 0xB948, 0x8FF3, 0xB949, 0x8FF4, 0xB94A, + 0x8FF5, 0xB94B, 0x8FF6, 0xB94D, 0x8FF7, 0xB94E, 0x8FF8, 0xB950, + 0x8FF9, 0xB952, 0x8FFA, 0xB953, 0x8FFB, 0xB954, 0x8FFC, 0xB955, + 0x8FFD, 0xB956, 0x8FFE, 0xB957, 0x9041, 0xB95A, 0x9042, 0xB95B, + 0x9043, 0xB95D, 0x9044, 0xB95E, 0x9045, 0xB95F, 0x9046, 0xB961, + 0x9047, 0xB962, 0x9048, 0xB963, 0x9049, 0xB964, 0x904A, 0xB965, + 0x904B, 0xB966, 0x904C, 0xB967, 0x904D, 0xB96A, 0x904E, 0xB96C, + 0x904F, 0xB96E, 0x9050, 0xB96F, 0x9051, 0xB970, 0x9052, 0xB971, + 0x9053, 0xB972, 0x9054, 0xB973, 0x9055, 0xB976, 0x9056, 0xB977, + 0x9057, 0xB979, 0x9058, 0xB97A, 0x9059, 0xB97B, 0x905A, 0xB97D, + 0x9061, 0xB97E, 0x9062, 0xB97F, 0x9063, 0xB980, 0x9064, 0xB981, + 0x9065, 0xB982, 0x9066, 0xB983, 0x9067, 0xB986, 0x9068, 0xB988, + 0x9069, 0xB98B, 0x906A, 0xB98C, 0x906B, 0xB98F, 0x906C, 0xB990, + 0x906D, 0xB991, 0x906E, 0xB992, 0x906F, 0xB993, 0x9070, 0xB994, + 0x9071, 0xB995, 0x9072, 0xB996, 0x9073, 0xB997, 0x9074, 0xB998, + 0x9075, 0xB999, 0x9076, 0xB99A, 0x9077, 0xB99B, 0x9078, 0xB99C, + 0x9079, 0xB99D, 0x907A, 0xB99E, 0x9081, 0xB99F, 0x9082, 0xB9A0, + 0x9083, 0xB9A1, 0x9084, 0xB9A2, 0x9085, 0xB9A3, 0x9086, 0xB9A4, + 0x9087, 0xB9A5, 0x9088, 0xB9A6, 0x9089, 0xB9A7, 0x908A, 0xB9A8, + 0x908B, 0xB9A9, 0x908C, 0xB9AA, 0x908D, 0xB9AB, 0x908E, 0xB9AE, + 0x908F, 0xB9AF, 0x9090, 0xB9B1, 0x9091, 0xB9B2, 0x9092, 0xB9B3, + 0x9093, 0xB9B5, 0x9094, 0xB9B6, 0x9095, 0xB9B7, 0x9096, 0xB9B8, + 0x9097, 0xB9B9, 0x9098, 0xB9BA, 0x9099, 0xB9BB, 0x909A, 0xB9BE, + 0x909B, 0xB9C0, 0x909C, 0xB9C2, 0x909D, 0xB9C3, 0x909E, 0xB9C4, + 0x909F, 0xB9C5, 0x90A0, 0xB9C6, 0x90A1, 0xB9C7, 0x90A2, 0xB9CA, + 0x90A3, 0xB9CB, 0x90A4, 0xB9CD, 0x90A5, 0xB9D3, 0x90A6, 0xB9D4, + 0x90A7, 0xB9D5, 0x90A8, 0xB9D6, 0x90A9, 0xB9D7, 0x90AA, 0xB9DA, + 0x90AB, 0xB9DC, 0x90AC, 0xB9DF, 0x90AD, 0xB9E0, 0x90AE, 0xB9E2, + 0x90AF, 0xB9E6, 0x90B0, 0xB9E7, 0x90B1, 0xB9E9, 0x90B2, 0xB9EA, + 0x90B3, 0xB9EB, 0x90B4, 0xB9ED, 0x90B5, 0xB9EE, 0x90B6, 0xB9EF, + 0x90B7, 0xB9F0, 0x90B8, 0xB9F1, 0x90B9, 0xB9F2, 0x90BA, 0xB9F3, + 0x90BB, 0xB9F6, 0x90BC, 0xB9FB, 0x90BD, 0xB9FC, 0x90BE, 0xB9FD, + 0x90BF, 0xB9FE, 0x90C0, 0xB9FF, 0x90C1, 0xBA02, 0x90C2, 0xBA03, + 0x90C3, 0xBA04, 0x90C4, 0xBA05, 0x90C5, 0xBA06, 0x90C6, 0xBA07, + 0x90C7, 0xBA09, 0x90C8, 0xBA0A, 0x90C9, 0xBA0B, 0x90CA, 0xBA0C, + 0x90CB, 0xBA0D, 0x90CC, 0xBA0E, 0x90CD, 0xBA0F, 0x90CE, 0xBA10, + 0x90CF, 0xBA11, 0x90D0, 0xBA12, 0x90D1, 0xBA13, 0x90D2, 0xBA14, + 0x90D3, 0xBA16, 0x90D4, 0xBA17, 0x90D5, 0xBA18, 0x90D6, 0xBA19, + 0x90D7, 0xBA1A, 0x90D8, 0xBA1B, 0x90D9, 0xBA1C, 0x90DA, 0xBA1D, + 0x90DB, 0xBA1E, 0x90DC, 0xBA1F, 0x90DD, 0xBA20, 0x90DE, 0xBA21, + 0x90DF, 0xBA22, 0x90E0, 0xBA23, 0x90E1, 0xBA24, 0x90E2, 0xBA25, + 0x90E3, 0xBA26, 0x90E4, 0xBA27, 0x90E5, 0xBA28, 0x90E6, 0xBA29, + 0x90E7, 0xBA2A, 0x90E8, 0xBA2B, 0x90E9, 0xBA2C, 0x90EA, 0xBA2D, + 0x90EB, 0xBA2E, 0x90EC, 0xBA2F, 0x90ED, 0xBA30, 0x90EE, 0xBA31, + 0x90EF, 0xBA32, 0x90F0, 0xBA33, 0x90F1, 0xBA34, 0x90F2, 0xBA35, + 0x90F3, 0xBA36, 0x90F4, 0xBA37, 0x90F5, 0xBA3A, 0x90F6, 0xBA3B, + 0x90F7, 0xBA3D, 0x90F8, 0xBA3E, 0x90F9, 0xBA3F, 0x90FA, 0xBA41, + 0x90FB, 0xBA43, 0x90FC, 0xBA44, 0x90FD, 0xBA45, 0x90FE, 0xBA46, + 0x9141, 0xBA47, 0x9142, 0xBA4A, 0x9143, 0xBA4C, 0x9144, 0xBA4F, + 0x9145, 0xBA50, 0x9146, 0xBA51, 0x9147, 0xBA52, 0x9148, 0xBA56, + 0x9149, 0xBA57, 0x914A, 0xBA59, 0x914B, 0xBA5A, 0x914C, 0xBA5B, + 0x914D, 0xBA5D, 0x914E, 0xBA5E, 0x914F, 0xBA5F, 0x9150, 0xBA60, + 0x9151, 0xBA61, 0x9152, 0xBA62, 0x9153, 0xBA63, 0x9154, 0xBA66, + 0x9155, 0xBA6A, 0x9156, 0xBA6B, 0x9157, 0xBA6C, 0x9158, 0xBA6D, + 0x9159, 0xBA6E, 0x915A, 0xBA6F, 0x9161, 0xBA72, 0x9162, 0xBA73, + 0x9163, 0xBA75, 0x9164, 0xBA76, 0x9165, 0xBA77, 0x9166, 0xBA79, + 0x9167, 0xBA7A, 0x9168, 0xBA7B, 0x9169, 0xBA7C, 0x916A, 0xBA7D, + 0x916B, 0xBA7E, 0x916C, 0xBA7F, 0x916D, 0xBA80, 0x916E, 0xBA81, + 0x916F, 0xBA82, 0x9170, 0xBA86, 0x9171, 0xBA88, 0x9172, 0xBA89, + 0x9173, 0xBA8A, 0x9174, 0xBA8B, 0x9175, 0xBA8D, 0x9176, 0xBA8E, + 0x9177, 0xBA8F, 0x9178, 0xBA90, 0x9179, 0xBA91, 0x917A, 0xBA92, + 0x9181, 0xBA93, 0x9182, 0xBA94, 0x9183, 0xBA95, 0x9184, 0xBA96, + 0x9185, 0xBA97, 0x9186, 0xBA98, 0x9187, 0xBA99, 0x9188, 0xBA9A, + 0x9189, 0xBA9B, 0x918A, 0xBA9C, 0x918B, 0xBA9D, 0x918C, 0xBA9E, + 0x918D, 0xBA9F, 0x918E, 0xBAA0, 0x918F, 0xBAA1, 0x9190, 0xBAA2, + 0x9191, 0xBAA3, 0x9192, 0xBAA4, 0x9193, 0xBAA5, 0x9194, 0xBAA6, + 0x9195, 0xBAA7, 0x9196, 0xBAAA, 0x9197, 0xBAAD, 0x9198, 0xBAAE, + 0x9199, 0xBAAF, 0x919A, 0xBAB1, 0x919B, 0xBAB3, 0x919C, 0xBAB4, + 0x919D, 0xBAB5, 0x919E, 0xBAB6, 0x919F, 0xBAB7, 0x91A0, 0xBABA, + 0x91A1, 0xBABC, 0x91A2, 0xBABE, 0x91A3, 0xBABF, 0x91A4, 0xBAC0, + 0x91A5, 0xBAC1, 0x91A6, 0xBAC2, 0x91A7, 0xBAC3, 0x91A8, 0xBAC5, + 0x91A9, 0xBAC6, 0x91AA, 0xBAC7, 0x91AB, 0xBAC9, 0x91AC, 0xBACA, + 0x91AD, 0xBACB, 0x91AE, 0xBACC, 0x91AF, 0xBACD, 0x91B0, 0xBACE, + 0x91B1, 0xBACF, 0x91B2, 0xBAD0, 0x91B3, 0xBAD1, 0x91B4, 0xBAD2, + 0x91B5, 0xBAD3, 0x91B6, 0xBAD4, 0x91B7, 0xBAD5, 0x91B8, 0xBAD6, + 0x91B9, 0xBAD7, 0x91BA, 0xBADA, 0x91BB, 0xBADB, 0x91BC, 0xBADC, + 0x91BD, 0xBADD, 0x91BE, 0xBADE, 0x91BF, 0xBADF, 0x91C0, 0xBAE0, + 0x91C1, 0xBAE1, 0x91C2, 0xBAE2, 0x91C3, 0xBAE3, 0x91C4, 0xBAE4, + 0x91C5, 0xBAE5, 0x91C6, 0xBAE6, 0x91C7, 0xBAE7, 0x91C8, 0xBAE8, + 0x91C9, 0xBAE9, 0x91CA, 0xBAEA, 0x91CB, 0xBAEB, 0x91CC, 0xBAEC, + 0x91CD, 0xBAED, 0x91CE, 0xBAEE, 0x91CF, 0xBAEF, 0x91D0, 0xBAF0, + 0x91D1, 0xBAF1, 0x91D2, 0xBAF2, 0x91D3, 0xBAF3, 0x91D4, 0xBAF4, + 0x91D5, 0xBAF5, 0x91D6, 0xBAF6, 0x91D7, 0xBAF7, 0x91D8, 0xBAF8, + 0x91D9, 0xBAF9, 0x91DA, 0xBAFA, 0x91DB, 0xBAFB, 0x91DC, 0xBAFD, + 0x91DD, 0xBAFE, 0x91DE, 0xBAFF, 0x91DF, 0xBB01, 0x91E0, 0xBB02, + 0x91E1, 0xBB03, 0x91E2, 0xBB05, 0x91E3, 0xBB06, 0x91E4, 0xBB07, + 0x91E5, 0xBB08, 0x91E6, 0xBB09, 0x91E7, 0xBB0A, 0x91E8, 0xBB0B, + 0x91E9, 0xBB0C, 0x91EA, 0xBB0E, 0x91EB, 0xBB10, 0x91EC, 0xBB12, + 0x91ED, 0xBB13, 0x91EE, 0xBB14, 0x91EF, 0xBB15, 0x91F0, 0xBB16, + 0x91F1, 0xBB17, 0x91F2, 0xBB19, 0x91F3, 0xBB1A, 0x91F4, 0xBB1B, + 0x91F5, 0xBB1D, 0x91F6, 0xBB1E, 0x91F7, 0xBB1F, 0x91F8, 0xBB21, + 0x91F9, 0xBB22, 0x91FA, 0xBB23, 0x91FB, 0xBB24, 0x91FC, 0xBB25, + 0x91FD, 0xBB26, 0x91FE, 0xBB27, 0x9241, 0xBB28, 0x9242, 0xBB2A, + 0x9243, 0xBB2C, 0x9244, 0xBB2D, 0x9245, 0xBB2E, 0x9246, 0xBB2F, + 0x9247, 0xBB30, 0x9248, 0xBB31, 0x9249, 0xBB32, 0x924A, 0xBB33, + 0x924B, 0xBB37, 0x924C, 0xBB39, 0x924D, 0xBB3A, 0x924E, 0xBB3F, + 0x924F, 0xBB40, 0x9250, 0xBB41, 0x9251, 0xBB42, 0x9252, 0xBB43, + 0x9253, 0xBB46, 0x9254, 0xBB48, 0x9255, 0xBB4A, 0x9256, 0xBB4B, + 0x9257, 0xBB4C, 0x9258, 0xBB4E, 0x9259, 0xBB51, 0x925A, 0xBB52, + 0x9261, 0xBB53, 0x9262, 0xBB55, 0x9263, 0xBB56, 0x9264, 0xBB57, + 0x9265, 0xBB59, 0x9266, 0xBB5A, 0x9267, 0xBB5B, 0x9268, 0xBB5C, + 0x9269, 0xBB5D, 0x926A, 0xBB5E, 0x926B, 0xBB5F, 0x926C, 0xBB60, + 0x926D, 0xBB62, 0x926E, 0xBB64, 0x926F, 0xBB65, 0x9270, 0xBB66, + 0x9271, 0xBB67, 0x9272, 0xBB68, 0x9273, 0xBB69, 0x9274, 0xBB6A, + 0x9275, 0xBB6B, 0x9276, 0xBB6D, 0x9277, 0xBB6E, 0x9278, 0xBB6F, + 0x9279, 0xBB70, 0x927A, 0xBB71, 0x9281, 0xBB72, 0x9282, 0xBB73, + 0x9283, 0xBB74, 0x9284, 0xBB75, 0x9285, 0xBB76, 0x9286, 0xBB77, + 0x9287, 0xBB78, 0x9288, 0xBB79, 0x9289, 0xBB7A, 0x928A, 0xBB7B, + 0x928B, 0xBB7C, 0x928C, 0xBB7D, 0x928D, 0xBB7E, 0x928E, 0xBB7F, + 0x928F, 0xBB80, 0x9290, 0xBB81, 0x9291, 0xBB82, 0x9292, 0xBB83, + 0x9293, 0xBB84, 0x9294, 0xBB85, 0x9295, 0xBB86, 0x9296, 0xBB87, + 0x9297, 0xBB89, 0x9298, 0xBB8A, 0x9299, 0xBB8B, 0x929A, 0xBB8D, + 0x929B, 0xBB8E, 0x929C, 0xBB8F, 0x929D, 0xBB91, 0x929E, 0xBB92, + 0x929F, 0xBB93, 0x92A0, 0xBB94, 0x92A1, 0xBB95, 0x92A2, 0xBB96, + 0x92A3, 0xBB97, 0x92A4, 0xBB98, 0x92A5, 0xBB99, 0x92A6, 0xBB9A, + 0x92A7, 0xBB9B, 0x92A8, 0xBB9C, 0x92A9, 0xBB9D, 0x92AA, 0xBB9E, + 0x92AB, 0xBB9F, 0x92AC, 0xBBA0, 0x92AD, 0xBBA1, 0x92AE, 0xBBA2, + 0x92AF, 0xBBA3, 0x92B0, 0xBBA5, 0x92B1, 0xBBA6, 0x92B2, 0xBBA7, + 0x92B3, 0xBBA9, 0x92B4, 0xBBAA, 0x92B5, 0xBBAB, 0x92B6, 0xBBAD, + 0x92B7, 0xBBAE, 0x92B8, 0xBBAF, 0x92B9, 0xBBB0, 0x92BA, 0xBBB1, + 0x92BB, 0xBBB2, 0x92BC, 0xBBB3, 0x92BD, 0xBBB5, 0x92BE, 0xBBB6, + 0x92BF, 0xBBB8, 0x92C0, 0xBBB9, 0x92C1, 0xBBBA, 0x92C2, 0xBBBB, + 0x92C3, 0xBBBC, 0x92C4, 0xBBBD, 0x92C5, 0xBBBE, 0x92C6, 0xBBBF, + 0x92C7, 0xBBC1, 0x92C8, 0xBBC2, 0x92C9, 0xBBC3, 0x92CA, 0xBBC5, + 0x92CB, 0xBBC6, 0x92CC, 0xBBC7, 0x92CD, 0xBBC9, 0x92CE, 0xBBCA, + 0x92CF, 0xBBCB, 0x92D0, 0xBBCC, 0x92D1, 0xBBCD, 0x92D2, 0xBBCE, + 0x92D3, 0xBBCF, 0x92D4, 0xBBD1, 0x92D5, 0xBBD2, 0x92D6, 0xBBD4, + 0x92D7, 0xBBD5, 0x92D8, 0xBBD6, 0x92D9, 0xBBD7, 0x92DA, 0xBBD8, + 0x92DB, 0xBBD9, 0x92DC, 0xBBDA, 0x92DD, 0xBBDB, 0x92DE, 0xBBDC, + 0x92DF, 0xBBDD, 0x92E0, 0xBBDE, 0x92E1, 0xBBDF, 0x92E2, 0xBBE0, + 0x92E3, 0xBBE1, 0x92E4, 0xBBE2, 0x92E5, 0xBBE3, 0x92E6, 0xBBE4, + 0x92E7, 0xBBE5, 0x92E8, 0xBBE6, 0x92E9, 0xBBE7, 0x92EA, 0xBBE8, + 0x92EB, 0xBBE9, 0x92EC, 0xBBEA, 0x92ED, 0xBBEB, 0x92EE, 0xBBEC, + 0x92EF, 0xBBED, 0x92F0, 0xBBEE, 0x92F1, 0xBBEF, 0x92F2, 0xBBF0, + 0x92F3, 0xBBF1, 0x92F4, 0xBBF2, 0x92F5, 0xBBF3, 0x92F6, 0xBBF4, + 0x92F7, 0xBBF5, 0x92F8, 0xBBF6, 0x92F9, 0xBBF7, 0x92FA, 0xBBFA, + 0x92FB, 0xBBFB, 0x92FC, 0xBBFD, 0x92FD, 0xBBFE, 0x92FE, 0xBC01, + 0x9341, 0xBC03, 0x9342, 0xBC04, 0x9343, 0xBC05, 0x9344, 0xBC06, + 0x9345, 0xBC07, 0x9346, 0xBC0A, 0x9347, 0xBC0E, 0x9348, 0xBC10, + 0x9349, 0xBC12, 0x934A, 0xBC13, 0x934B, 0xBC19, 0x934C, 0xBC1A, + 0x934D, 0xBC20, 0x934E, 0xBC21, 0x934F, 0xBC22, 0x9350, 0xBC23, + 0x9351, 0xBC26, 0x9352, 0xBC28, 0x9353, 0xBC2A, 0x9354, 0xBC2B, + 0x9355, 0xBC2C, 0x9356, 0xBC2E, 0x9357, 0xBC2F, 0x9358, 0xBC32, + 0x9359, 0xBC33, 0x935A, 0xBC35, 0x9361, 0xBC36, 0x9362, 0xBC37, + 0x9363, 0xBC39, 0x9364, 0xBC3A, 0x9365, 0xBC3B, 0x9366, 0xBC3C, + 0x9367, 0xBC3D, 0x9368, 0xBC3E, 0x9369, 0xBC3F, 0x936A, 0xBC42, + 0x936B, 0xBC46, 0x936C, 0xBC47, 0x936D, 0xBC48, 0x936E, 0xBC4A, + 0x936F, 0xBC4B, 0x9370, 0xBC4E, 0x9371, 0xBC4F, 0x9372, 0xBC51, + 0x9373, 0xBC52, 0x9374, 0xBC53, 0x9375, 0xBC54, 0x9376, 0xBC55, + 0x9377, 0xBC56, 0x9378, 0xBC57, 0x9379, 0xBC58, 0x937A, 0xBC59, + 0x9381, 0xBC5A, 0x9382, 0xBC5B, 0x9383, 0xBC5C, 0x9384, 0xBC5E, + 0x9385, 0xBC5F, 0x9386, 0xBC60, 0x9387, 0xBC61, 0x9388, 0xBC62, + 0x9389, 0xBC63, 0x938A, 0xBC64, 0x938B, 0xBC65, 0x938C, 0xBC66, + 0x938D, 0xBC67, 0x938E, 0xBC68, 0x938F, 0xBC69, 0x9390, 0xBC6A, + 0x9391, 0xBC6B, 0x9392, 0xBC6C, 0x9393, 0xBC6D, 0x9394, 0xBC6E, + 0x9395, 0xBC6F, 0x9396, 0xBC70, 0x9397, 0xBC71, 0x9398, 0xBC72, + 0x9399, 0xBC73, 0x939A, 0xBC74, 0x939B, 0xBC75, 0x939C, 0xBC76, + 0x939D, 0xBC77, 0x939E, 0xBC78, 0x939F, 0xBC79, 0x93A0, 0xBC7A, + 0x93A1, 0xBC7B, 0x93A2, 0xBC7C, 0x93A3, 0xBC7D, 0x93A4, 0xBC7E, + 0x93A5, 0xBC7F, 0x93A6, 0xBC80, 0x93A7, 0xBC81, 0x93A8, 0xBC82, + 0x93A9, 0xBC83, 0x93AA, 0xBC86, 0x93AB, 0xBC87, 0x93AC, 0xBC89, + 0x93AD, 0xBC8A, 0x93AE, 0xBC8D, 0x93AF, 0xBC8F, 0x93B0, 0xBC90, + 0x93B1, 0xBC91, 0x93B2, 0xBC92, 0x93B3, 0xBC93, 0x93B4, 0xBC96, + 0x93B5, 0xBC98, 0x93B6, 0xBC9B, 0x93B7, 0xBC9C, 0x93B8, 0xBC9D, + 0x93B9, 0xBC9E, 0x93BA, 0xBC9F, 0x93BB, 0xBCA2, 0x93BC, 0xBCA3, + 0x93BD, 0xBCA5, 0x93BE, 0xBCA6, 0x93BF, 0xBCA9, 0x93C0, 0xBCAA, + 0x93C1, 0xBCAB, 0x93C2, 0xBCAC, 0x93C3, 0xBCAD, 0x93C4, 0xBCAE, + 0x93C5, 0xBCAF, 0x93C6, 0xBCB2, 0x93C7, 0xBCB6, 0x93C8, 0xBCB7, + 0x93C9, 0xBCB8, 0x93CA, 0xBCB9, 0x93CB, 0xBCBA, 0x93CC, 0xBCBB, + 0x93CD, 0xBCBE, 0x93CE, 0xBCBF, 0x93CF, 0xBCC1, 0x93D0, 0xBCC2, + 0x93D1, 0xBCC3, 0x93D2, 0xBCC5, 0x93D3, 0xBCC6, 0x93D4, 0xBCC7, + 0x93D5, 0xBCC8, 0x93D6, 0xBCC9, 0x93D7, 0xBCCA, 0x93D8, 0xBCCB, + 0x93D9, 0xBCCC, 0x93DA, 0xBCCE, 0x93DB, 0xBCD2, 0x93DC, 0xBCD3, + 0x93DD, 0xBCD4, 0x93DE, 0xBCD6, 0x93DF, 0xBCD7, 0x93E0, 0xBCD9, + 0x93E1, 0xBCDA, 0x93E2, 0xBCDB, 0x93E3, 0xBCDD, 0x93E4, 0xBCDE, + 0x93E5, 0xBCDF, 0x93E6, 0xBCE0, 0x93E7, 0xBCE1, 0x93E8, 0xBCE2, + 0x93E9, 0xBCE3, 0x93EA, 0xBCE4, 0x93EB, 0xBCE5, 0x93EC, 0xBCE6, + 0x93ED, 0xBCE7, 0x93EE, 0xBCE8, 0x93EF, 0xBCE9, 0x93F0, 0xBCEA, + 0x93F1, 0xBCEB, 0x93F2, 0xBCEC, 0x93F3, 0xBCED, 0x93F4, 0xBCEE, + 0x93F5, 0xBCEF, 0x93F6, 0xBCF0, 0x93F7, 0xBCF1, 0x93F8, 0xBCF2, + 0x93F9, 0xBCF3, 0x93FA, 0xBCF7, 0x93FB, 0xBCF9, 0x93FC, 0xBCFA, + 0x93FD, 0xBCFB, 0x93FE, 0xBCFD, 0x9441, 0xBCFE, 0x9442, 0xBCFF, + 0x9443, 0xBD00, 0x9444, 0xBD01, 0x9445, 0xBD02, 0x9446, 0xBD03, + 0x9447, 0xBD06, 0x9448, 0xBD08, 0x9449, 0xBD0A, 0x944A, 0xBD0B, + 0x944B, 0xBD0C, 0x944C, 0xBD0D, 0x944D, 0xBD0E, 0x944E, 0xBD0F, + 0x944F, 0xBD11, 0x9450, 0xBD12, 0x9451, 0xBD13, 0x9452, 0xBD15, + 0x9453, 0xBD16, 0x9454, 0xBD17, 0x9455, 0xBD18, 0x9456, 0xBD19, + 0x9457, 0xBD1A, 0x9458, 0xBD1B, 0x9459, 0xBD1C, 0x945A, 0xBD1D, + 0x9461, 0xBD1E, 0x9462, 0xBD1F, 0x9463, 0xBD20, 0x9464, 0xBD21, + 0x9465, 0xBD22, 0x9466, 0xBD23, 0x9467, 0xBD25, 0x9468, 0xBD26, + 0x9469, 0xBD27, 0x946A, 0xBD28, 0x946B, 0xBD29, 0x946C, 0xBD2A, + 0x946D, 0xBD2B, 0x946E, 0xBD2D, 0x946F, 0xBD2E, 0x9470, 0xBD2F, + 0x9471, 0xBD30, 0x9472, 0xBD31, 0x9473, 0xBD32, 0x9474, 0xBD33, + 0x9475, 0xBD34, 0x9476, 0xBD35, 0x9477, 0xBD36, 0x9478, 0xBD37, + 0x9479, 0xBD38, 0x947A, 0xBD39, 0x9481, 0xBD3A, 0x9482, 0xBD3B, + 0x9483, 0xBD3C, 0x9484, 0xBD3D, 0x9485, 0xBD3E, 0x9486, 0xBD3F, + 0x9487, 0xBD41, 0x9488, 0xBD42, 0x9489, 0xBD43, 0x948A, 0xBD44, + 0x948B, 0xBD45, 0x948C, 0xBD46, 0x948D, 0xBD47, 0x948E, 0xBD4A, + 0x948F, 0xBD4B, 0x9490, 0xBD4D, 0x9491, 0xBD4E, 0x9492, 0xBD4F, + 0x9493, 0xBD51, 0x9494, 0xBD52, 0x9495, 0xBD53, 0x9496, 0xBD54, + 0x9497, 0xBD55, 0x9498, 0xBD56, 0x9499, 0xBD57, 0x949A, 0xBD5A, + 0x949B, 0xBD5B, 0x949C, 0xBD5C, 0x949D, 0xBD5D, 0x949E, 0xBD5E, + 0x949F, 0xBD5F, 0x94A0, 0xBD60, 0x94A1, 0xBD61, 0x94A2, 0xBD62, + 0x94A3, 0xBD63, 0x94A4, 0xBD65, 0x94A5, 0xBD66, 0x94A6, 0xBD67, + 0x94A7, 0xBD69, 0x94A8, 0xBD6A, 0x94A9, 0xBD6B, 0x94AA, 0xBD6C, + 0x94AB, 0xBD6D, 0x94AC, 0xBD6E, 0x94AD, 0xBD6F, 0x94AE, 0xBD70, + 0x94AF, 0xBD71, 0x94B0, 0xBD72, 0x94B1, 0xBD73, 0x94B2, 0xBD74, + 0x94B3, 0xBD75, 0x94B4, 0xBD76, 0x94B5, 0xBD77, 0x94B6, 0xBD78, + 0x94B7, 0xBD79, 0x94B8, 0xBD7A, 0x94B9, 0xBD7B, 0x94BA, 0xBD7C, + 0x94BB, 0xBD7D, 0x94BC, 0xBD7E, 0x94BD, 0xBD7F, 0x94BE, 0xBD82, + 0x94BF, 0xBD83, 0x94C0, 0xBD85, 0x94C1, 0xBD86, 0x94C2, 0xBD8B, + 0x94C3, 0xBD8C, 0x94C4, 0xBD8D, 0x94C5, 0xBD8E, 0x94C6, 0xBD8F, + 0x94C7, 0xBD92, 0x94C8, 0xBD94, 0x94C9, 0xBD96, 0x94CA, 0xBD97, + 0x94CB, 0xBD98, 0x94CC, 0xBD9B, 0x94CD, 0xBD9D, 0x94CE, 0xBD9E, + 0x94CF, 0xBD9F, 0x94D0, 0xBDA0, 0x94D1, 0xBDA1, 0x94D2, 0xBDA2, + 0x94D3, 0xBDA3, 0x94D4, 0xBDA5, 0x94D5, 0xBDA6, 0x94D6, 0xBDA7, + 0x94D7, 0xBDA8, 0x94D8, 0xBDA9, 0x94D9, 0xBDAA, 0x94DA, 0xBDAB, + 0x94DB, 0xBDAC, 0x94DC, 0xBDAD, 0x94DD, 0xBDAE, 0x94DE, 0xBDAF, + 0x94DF, 0xBDB1, 0x94E0, 0xBDB2, 0x94E1, 0xBDB3, 0x94E2, 0xBDB4, + 0x94E3, 0xBDB5, 0x94E4, 0xBDB6, 0x94E5, 0xBDB7, 0x94E6, 0xBDB9, + 0x94E7, 0xBDBA, 0x94E8, 0xBDBB, 0x94E9, 0xBDBC, 0x94EA, 0xBDBD, + 0x94EB, 0xBDBE, 0x94EC, 0xBDBF, 0x94ED, 0xBDC0, 0x94EE, 0xBDC1, + 0x94EF, 0xBDC2, 0x94F0, 0xBDC3, 0x94F1, 0xBDC4, 0x94F2, 0xBDC5, + 0x94F3, 0xBDC6, 0x94F4, 0xBDC7, 0x94F5, 0xBDC8, 0x94F6, 0xBDC9, + 0x94F7, 0xBDCA, 0x94F8, 0xBDCB, 0x94F9, 0xBDCC, 0x94FA, 0xBDCD, + 0x94FB, 0xBDCE, 0x94FC, 0xBDCF, 0x94FD, 0xBDD0, 0x94FE, 0xBDD1, + 0x9541, 0xBDD2, 0x9542, 0xBDD3, 0x9543, 0xBDD6, 0x9544, 0xBDD7, + 0x9545, 0xBDD9, 0x9546, 0xBDDA, 0x9547, 0xBDDB, 0x9548, 0xBDDD, + 0x9549, 0xBDDE, 0x954A, 0xBDDF, 0x954B, 0xBDE0, 0x954C, 0xBDE1, + 0x954D, 0xBDE2, 0x954E, 0xBDE3, 0x954F, 0xBDE4, 0x9550, 0xBDE5, + 0x9551, 0xBDE6, 0x9552, 0xBDE7, 0x9553, 0xBDE8, 0x9554, 0xBDEA, + 0x9555, 0xBDEB, 0x9556, 0xBDEC, 0x9557, 0xBDED, 0x9558, 0xBDEE, + 0x9559, 0xBDEF, 0x955A, 0xBDF1, 0x9561, 0xBDF2, 0x9562, 0xBDF3, + 0x9563, 0xBDF5, 0x9564, 0xBDF6, 0x9565, 0xBDF7, 0x9566, 0xBDF9, + 0x9567, 0xBDFA, 0x9568, 0xBDFB, 0x9569, 0xBDFC, 0x956A, 0xBDFD, + 0x956B, 0xBDFE, 0x956C, 0xBDFF, 0x956D, 0xBE01, 0x956E, 0xBE02, + 0x956F, 0xBE04, 0x9570, 0xBE06, 0x9571, 0xBE07, 0x9572, 0xBE08, + 0x9573, 0xBE09, 0x9574, 0xBE0A, 0x9575, 0xBE0B, 0x9576, 0xBE0E, + 0x9577, 0xBE0F, 0x9578, 0xBE11, 0x9579, 0xBE12, 0x957A, 0xBE13, + 0x9581, 0xBE15, 0x9582, 0xBE16, 0x9583, 0xBE17, 0x9584, 0xBE18, + 0x9585, 0xBE19, 0x9586, 0xBE1A, 0x9587, 0xBE1B, 0x9588, 0xBE1E, + 0x9589, 0xBE20, 0x958A, 0xBE21, 0x958B, 0xBE22, 0x958C, 0xBE23, + 0x958D, 0xBE24, 0x958E, 0xBE25, 0x958F, 0xBE26, 0x9590, 0xBE27, + 0x9591, 0xBE28, 0x9592, 0xBE29, 0x9593, 0xBE2A, 0x9594, 0xBE2B, + 0x9595, 0xBE2C, 0x9596, 0xBE2D, 0x9597, 0xBE2E, 0x9598, 0xBE2F, + 0x9599, 0xBE30, 0x959A, 0xBE31, 0x959B, 0xBE32, 0x959C, 0xBE33, + 0x959D, 0xBE34, 0x959E, 0xBE35, 0x959F, 0xBE36, 0x95A0, 0xBE37, + 0x95A1, 0xBE38, 0x95A2, 0xBE39, 0x95A3, 0xBE3A, 0x95A4, 0xBE3B, + 0x95A5, 0xBE3C, 0x95A6, 0xBE3D, 0x95A7, 0xBE3E, 0x95A8, 0xBE3F, + 0x95A9, 0xBE40, 0x95AA, 0xBE41, 0x95AB, 0xBE42, 0x95AC, 0xBE43, + 0x95AD, 0xBE46, 0x95AE, 0xBE47, 0x95AF, 0xBE49, 0x95B0, 0xBE4A, + 0x95B1, 0xBE4B, 0x95B2, 0xBE4D, 0x95B3, 0xBE4F, 0x95B4, 0xBE50, + 0x95B5, 0xBE51, 0x95B6, 0xBE52, 0x95B7, 0xBE53, 0x95B8, 0xBE56, + 0x95B9, 0xBE58, 0x95BA, 0xBE5C, 0x95BB, 0xBE5D, 0x95BC, 0xBE5E, + 0x95BD, 0xBE5F, 0x95BE, 0xBE62, 0x95BF, 0xBE63, 0x95C0, 0xBE65, + 0x95C1, 0xBE66, 0x95C2, 0xBE67, 0x95C3, 0xBE69, 0x95C4, 0xBE6B, + 0x95C5, 0xBE6C, 0x95C6, 0xBE6D, 0x95C7, 0xBE6E, 0x95C8, 0xBE6F, + 0x95C9, 0xBE72, 0x95CA, 0xBE76, 0x95CB, 0xBE77, 0x95CC, 0xBE78, + 0x95CD, 0xBE79, 0x95CE, 0xBE7A, 0x95CF, 0xBE7E, 0x95D0, 0xBE7F, + 0x95D1, 0xBE81, 0x95D2, 0xBE82, 0x95D3, 0xBE83, 0x95D4, 0xBE85, + 0x95D5, 0xBE86, 0x95D6, 0xBE87, 0x95D7, 0xBE88, 0x95D8, 0xBE89, + 0x95D9, 0xBE8A, 0x95DA, 0xBE8B, 0x95DB, 0xBE8E, 0x95DC, 0xBE92, + 0x95DD, 0xBE93, 0x95DE, 0xBE94, 0x95DF, 0xBE95, 0x95E0, 0xBE96, + 0x95E1, 0xBE97, 0x95E2, 0xBE9A, 0x95E3, 0xBE9B, 0x95E4, 0xBE9C, + 0x95E5, 0xBE9D, 0x95E6, 0xBE9E, 0x95E7, 0xBE9F, 0x95E8, 0xBEA0, + 0x95E9, 0xBEA1, 0x95EA, 0xBEA2, 0x95EB, 0xBEA3, 0x95EC, 0xBEA4, + 0x95ED, 0xBEA5, 0x95EE, 0xBEA6, 0x95EF, 0xBEA7, 0x95F0, 0xBEA9, + 0x95F1, 0xBEAA, 0x95F2, 0xBEAB, 0x95F3, 0xBEAC, 0x95F4, 0xBEAD, + 0x95F5, 0xBEAE, 0x95F6, 0xBEAF, 0x95F7, 0xBEB0, 0x95F8, 0xBEB1, + 0x95F9, 0xBEB2, 0x95FA, 0xBEB3, 0x95FB, 0xBEB4, 0x95FC, 0xBEB5, + 0x95FD, 0xBEB6, 0x95FE, 0xBEB7, 0x9641, 0xBEB8, 0x9642, 0xBEB9, + 0x9643, 0xBEBA, 0x9644, 0xBEBB, 0x9645, 0xBEBC, 0x9646, 0xBEBD, + 0x9647, 0xBEBE, 0x9648, 0xBEBF, 0x9649, 0xBEC0, 0x964A, 0xBEC1, + 0x964B, 0xBEC2, 0x964C, 0xBEC3, 0x964D, 0xBEC4, 0x964E, 0xBEC5, + 0x964F, 0xBEC6, 0x9650, 0xBEC7, 0x9651, 0xBEC8, 0x9652, 0xBEC9, + 0x9653, 0xBECA, 0x9654, 0xBECB, 0x9655, 0xBECC, 0x9656, 0xBECD, + 0x9657, 0xBECE, 0x9658, 0xBECF, 0x9659, 0xBED2, 0x965A, 0xBED3, + 0x9661, 0xBED5, 0x9662, 0xBED6, 0x9663, 0xBED9, 0x9664, 0xBEDA, + 0x9665, 0xBEDB, 0x9666, 0xBEDC, 0x9667, 0xBEDD, 0x9668, 0xBEDE, + 0x9669, 0xBEDF, 0x966A, 0xBEE1, 0x966B, 0xBEE2, 0x966C, 0xBEE6, + 0x966D, 0xBEE7, 0x966E, 0xBEE8, 0x966F, 0xBEE9, 0x9670, 0xBEEA, + 0x9671, 0xBEEB, 0x9672, 0xBEED, 0x9673, 0xBEEE, 0x9674, 0xBEEF, + 0x9675, 0xBEF0, 0x9676, 0xBEF1, 0x9677, 0xBEF2, 0x9678, 0xBEF3, + 0x9679, 0xBEF4, 0x967A, 0xBEF5, 0x9681, 0xBEF6, 0x9682, 0xBEF7, + 0x9683, 0xBEF8, 0x9684, 0xBEF9, 0x9685, 0xBEFA, 0x9686, 0xBEFB, + 0x9687, 0xBEFC, 0x9688, 0xBEFD, 0x9689, 0xBEFE, 0x968A, 0xBEFF, + 0x968B, 0xBF00, 0x968C, 0xBF02, 0x968D, 0xBF03, 0x968E, 0xBF04, + 0x968F, 0xBF05, 0x9690, 0xBF06, 0x9691, 0xBF07, 0x9692, 0xBF0A, + 0x9693, 0xBF0B, 0x9694, 0xBF0C, 0x9695, 0xBF0D, 0x9696, 0xBF0E, + 0x9697, 0xBF0F, 0x9698, 0xBF10, 0x9699, 0xBF11, 0x969A, 0xBF12, + 0x969B, 0xBF13, 0x969C, 0xBF14, 0x969D, 0xBF15, 0x969E, 0xBF16, + 0x969F, 0xBF17, 0x96A0, 0xBF1A, 0x96A1, 0xBF1E, 0x96A2, 0xBF1F, + 0x96A3, 0xBF20, 0x96A4, 0xBF21, 0x96A5, 0xBF22, 0x96A6, 0xBF23, + 0x96A7, 0xBF24, 0x96A8, 0xBF25, 0x96A9, 0xBF26, 0x96AA, 0xBF27, + 0x96AB, 0xBF28, 0x96AC, 0xBF29, 0x96AD, 0xBF2A, 0x96AE, 0xBF2B, + 0x96AF, 0xBF2C, 0x96B0, 0xBF2D, 0x96B1, 0xBF2E, 0x96B2, 0xBF2F, + 0x96B3, 0xBF30, 0x96B4, 0xBF31, 0x96B5, 0xBF32, 0x96B6, 0xBF33, + 0x96B7, 0xBF34, 0x96B8, 0xBF35, 0x96B9, 0xBF36, 0x96BA, 0xBF37, + 0x96BB, 0xBF38, 0x96BC, 0xBF39, 0x96BD, 0xBF3A, 0x96BE, 0xBF3B, + 0x96BF, 0xBF3C, 0x96C0, 0xBF3D, 0x96C1, 0xBF3E, 0x96C2, 0xBF3F, + 0x96C3, 0xBF42, 0x96C4, 0xBF43, 0x96C5, 0xBF45, 0x96C6, 0xBF46, + 0x96C7, 0xBF47, 0x96C8, 0xBF49, 0x96C9, 0xBF4A, 0x96CA, 0xBF4B, + 0x96CB, 0xBF4C, 0x96CC, 0xBF4D, 0x96CD, 0xBF4E, 0x96CE, 0xBF4F, + 0x96CF, 0xBF52, 0x96D0, 0xBF53, 0x96D1, 0xBF54, 0x96D2, 0xBF56, + 0x96D3, 0xBF57, 0x96D4, 0xBF58, 0x96D5, 0xBF59, 0x96D6, 0xBF5A, + 0x96D7, 0xBF5B, 0x96D8, 0xBF5C, 0x96D9, 0xBF5D, 0x96DA, 0xBF5E, + 0x96DB, 0xBF5F, 0x96DC, 0xBF60, 0x96DD, 0xBF61, 0x96DE, 0xBF62, + 0x96DF, 0xBF63, 0x96E0, 0xBF64, 0x96E1, 0xBF65, 0x96E2, 0xBF66, + 0x96E3, 0xBF67, 0x96E4, 0xBF68, 0x96E5, 0xBF69, 0x96E6, 0xBF6A, + 0x96E7, 0xBF6B, 0x96E8, 0xBF6C, 0x96E9, 0xBF6D, 0x96EA, 0xBF6E, + 0x96EB, 0xBF6F, 0x96EC, 0xBF70, 0x96ED, 0xBF71, 0x96EE, 0xBF72, + 0x96EF, 0xBF73, 0x96F0, 0xBF74, 0x96F1, 0xBF75, 0x96F2, 0xBF76, + 0x96F3, 0xBF77, 0x96F4, 0xBF78, 0x96F5, 0xBF79, 0x96F6, 0xBF7A, + 0x96F7, 0xBF7B, 0x96F8, 0xBF7C, 0x96F9, 0xBF7D, 0x96FA, 0xBF7E, + 0x96FB, 0xBF7F, 0x96FC, 0xBF80, 0x96FD, 0xBF81, 0x96FE, 0xBF82, + 0x9741, 0xBF83, 0x9742, 0xBF84, 0x9743, 0xBF85, 0x9744, 0xBF86, + 0x9745, 0xBF87, 0x9746, 0xBF88, 0x9747, 0xBF89, 0x9748, 0xBF8A, + 0x9749, 0xBF8B, 0x974A, 0xBF8C, 0x974B, 0xBF8D, 0x974C, 0xBF8E, + 0x974D, 0xBF8F, 0x974E, 0xBF90, 0x974F, 0xBF91, 0x9750, 0xBF92, + 0x9751, 0xBF93, 0x9752, 0xBF95, 0x9753, 0xBF96, 0x9754, 0xBF97, + 0x9755, 0xBF98, 0x9756, 0xBF99, 0x9757, 0xBF9A, 0x9758, 0xBF9B, + 0x9759, 0xBF9C, 0x975A, 0xBF9D, 0x9761, 0xBF9E, 0x9762, 0xBF9F, + 0x9763, 0xBFA0, 0x9764, 0xBFA1, 0x9765, 0xBFA2, 0x9766, 0xBFA3, + 0x9767, 0xBFA4, 0x9768, 0xBFA5, 0x9769, 0xBFA6, 0x976A, 0xBFA7, + 0x976B, 0xBFA8, 0x976C, 0xBFA9, 0x976D, 0xBFAA, 0x976E, 0xBFAB, + 0x976F, 0xBFAC, 0x9770, 0xBFAD, 0x9771, 0xBFAE, 0x9772, 0xBFAF, + 0x9773, 0xBFB1, 0x9774, 0xBFB2, 0x9775, 0xBFB3, 0x9776, 0xBFB4, + 0x9777, 0xBFB5, 0x9778, 0xBFB6, 0x9779, 0xBFB7, 0x977A, 0xBFB8, + 0x9781, 0xBFB9, 0x9782, 0xBFBA, 0x9783, 0xBFBB, 0x9784, 0xBFBC, + 0x9785, 0xBFBD, 0x9786, 0xBFBE, 0x9787, 0xBFBF, 0x9788, 0xBFC0, + 0x9789, 0xBFC1, 0x978A, 0xBFC2, 0x978B, 0xBFC3, 0x978C, 0xBFC4, + 0x978D, 0xBFC6, 0x978E, 0xBFC7, 0x978F, 0xBFC8, 0x9790, 0xBFC9, + 0x9791, 0xBFCA, 0x9792, 0xBFCB, 0x9793, 0xBFCE, 0x9794, 0xBFCF, + 0x9795, 0xBFD1, 0x9796, 0xBFD2, 0x9797, 0xBFD3, 0x9798, 0xBFD5, + 0x9799, 0xBFD6, 0x979A, 0xBFD7, 0x979B, 0xBFD8, 0x979C, 0xBFD9, + 0x979D, 0xBFDA, 0x979E, 0xBFDB, 0x979F, 0xBFDD, 0x97A0, 0xBFDE, + 0x97A1, 0xBFE0, 0x97A2, 0xBFE2, 0x97A3, 0xBFE3, 0x97A4, 0xBFE4, + 0x97A5, 0xBFE5, 0x97A6, 0xBFE6, 0x97A7, 0xBFE7, 0x97A8, 0xBFE8, + 0x97A9, 0xBFE9, 0x97AA, 0xBFEA, 0x97AB, 0xBFEB, 0x97AC, 0xBFEC, + 0x97AD, 0xBFED, 0x97AE, 0xBFEE, 0x97AF, 0xBFEF, 0x97B0, 0xBFF0, + 0x97B1, 0xBFF1, 0x97B2, 0xBFF2, 0x97B3, 0xBFF3, 0x97B4, 0xBFF4, + 0x97B5, 0xBFF5, 0x97B6, 0xBFF6, 0x97B7, 0xBFF7, 0x97B8, 0xBFF8, + 0x97B9, 0xBFF9, 0x97BA, 0xBFFA, 0x97BB, 0xBFFB, 0x97BC, 0xBFFC, + 0x97BD, 0xBFFD, 0x97BE, 0xBFFE, 0x97BF, 0xBFFF, 0x97C0, 0xC000, + 0x97C1, 0xC001, 0x97C2, 0xC002, 0x97C3, 0xC003, 0x97C4, 0xC004, + 0x97C5, 0xC005, 0x97C6, 0xC006, 0x97C7, 0xC007, 0x97C8, 0xC008, + 0x97C9, 0xC009, 0x97CA, 0xC00A, 0x97CB, 0xC00B, 0x97CC, 0xC00C, + 0x97CD, 0xC00D, 0x97CE, 0xC00E, 0x97CF, 0xC00F, 0x97D0, 0xC010, + 0x97D1, 0xC011, 0x97D2, 0xC012, 0x97D3, 0xC013, 0x97D4, 0xC014, + 0x97D5, 0xC015, 0x97D6, 0xC016, 0x97D7, 0xC017, 0x97D8, 0xC018, + 0x97D9, 0xC019, 0x97DA, 0xC01A, 0x97DB, 0xC01B, 0x97DC, 0xC01C, + 0x97DD, 0xC01D, 0x97DE, 0xC01E, 0x97DF, 0xC01F, 0x97E0, 0xC020, + 0x97E1, 0xC021, 0x97E2, 0xC022, 0x97E3, 0xC023, 0x97E4, 0xC024, + 0x97E5, 0xC025, 0x97E6, 0xC026, 0x97E7, 0xC027, 0x97E8, 0xC028, + 0x97E9, 0xC029, 0x97EA, 0xC02A, 0x97EB, 0xC02B, 0x97EC, 0xC02C, + 0x97ED, 0xC02D, 0x97EE, 0xC02E, 0x97EF, 0xC02F, 0x97F0, 0xC030, + 0x97F1, 0xC031, 0x97F2, 0xC032, 0x97F3, 0xC033, 0x97F4, 0xC034, + 0x97F5, 0xC035, 0x97F6, 0xC036, 0x97F7, 0xC037, 0x97F8, 0xC038, + 0x97F9, 0xC039, 0x97FA, 0xC03A, 0x97FB, 0xC03B, 0x97FC, 0xC03D, + 0x97FD, 0xC03E, 0x97FE, 0xC03F, 0x9841, 0xC040, 0x9842, 0xC041, + 0x9843, 0xC042, 0x9844, 0xC043, 0x9845, 0xC044, 0x9846, 0xC045, + 0x9847, 0xC046, 0x9848, 0xC047, 0x9849, 0xC048, 0x984A, 0xC049, + 0x984B, 0xC04A, 0x984C, 0xC04B, 0x984D, 0xC04C, 0x984E, 0xC04D, + 0x984F, 0xC04E, 0x9850, 0xC04F, 0x9851, 0xC050, 0x9852, 0xC052, + 0x9853, 0xC053, 0x9854, 0xC054, 0x9855, 0xC055, 0x9856, 0xC056, + 0x9857, 0xC057, 0x9858, 0xC059, 0x9859, 0xC05A, 0x985A, 0xC05B, + 0x9861, 0xC05D, 0x9862, 0xC05E, 0x9863, 0xC05F, 0x9864, 0xC061, + 0x9865, 0xC062, 0x9866, 0xC063, 0x9867, 0xC064, 0x9868, 0xC065, + 0x9869, 0xC066, 0x986A, 0xC067, 0x986B, 0xC06A, 0x986C, 0xC06B, + 0x986D, 0xC06C, 0x986E, 0xC06D, 0x986F, 0xC06E, 0x9870, 0xC06F, + 0x9871, 0xC070, 0x9872, 0xC071, 0x9873, 0xC072, 0x9874, 0xC073, + 0x9875, 0xC074, 0x9876, 0xC075, 0x9877, 0xC076, 0x9878, 0xC077, + 0x9879, 0xC078, 0x987A, 0xC079, 0x9881, 0xC07A, 0x9882, 0xC07B, + 0x9883, 0xC07C, 0x9884, 0xC07D, 0x9885, 0xC07E, 0x9886, 0xC07F, + 0x9887, 0xC080, 0x9888, 0xC081, 0x9889, 0xC082, 0x988A, 0xC083, + 0x988B, 0xC084, 0x988C, 0xC085, 0x988D, 0xC086, 0x988E, 0xC087, + 0x988F, 0xC088, 0x9890, 0xC089, 0x9891, 0xC08A, 0x9892, 0xC08B, + 0x9893, 0xC08C, 0x9894, 0xC08D, 0x9895, 0xC08E, 0x9896, 0xC08F, + 0x9897, 0xC092, 0x9898, 0xC093, 0x9899, 0xC095, 0x989A, 0xC096, + 0x989B, 0xC097, 0x989C, 0xC099, 0x989D, 0xC09A, 0x989E, 0xC09B, + 0x989F, 0xC09C, 0x98A0, 0xC09D, 0x98A1, 0xC09E, 0x98A2, 0xC09F, + 0x98A3, 0xC0A2, 0x98A4, 0xC0A4, 0x98A5, 0xC0A6, 0x98A6, 0xC0A7, + 0x98A7, 0xC0A8, 0x98A8, 0xC0A9, 0x98A9, 0xC0AA, 0x98AA, 0xC0AB, + 0x98AB, 0xC0AE, 0x98AC, 0xC0B1, 0x98AD, 0xC0B2, 0x98AE, 0xC0B7, + 0x98AF, 0xC0B8, 0x98B0, 0xC0B9, 0x98B1, 0xC0BA, 0x98B2, 0xC0BB, + 0x98B3, 0xC0BE, 0x98B4, 0xC0C2, 0x98B5, 0xC0C3, 0x98B6, 0xC0C4, + 0x98B7, 0xC0C6, 0x98B8, 0xC0C7, 0x98B9, 0xC0CA, 0x98BA, 0xC0CB, + 0x98BB, 0xC0CD, 0x98BC, 0xC0CE, 0x98BD, 0xC0CF, 0x98BE, 0xC0D1, + 0x98BF, 0xC0D2, 0x98C0, 0xC0D3, 0x98C1, 0xC0D4, 0x98C2, 0xC0D5, + 0x98C3, 0xC0D6, 0x98C4, 0xC0D7, 0x98C5, 0xC0DA, 0x98C6, 0xC0DE, + 0x98C7, 0xC0DF, 0x98C8, 0xC0E0, 0x98C9, 0xC0E1, 0x98CA, 0xC0E2, + 0x98CB, 0xC0E3, 0x98CC, 0xC0E6, 0x98CD, 0xC0E7, 0x98CE, 0xC0E9, + 0x98CF, 0xC0EA, 0x98D0, 0xC0EB, 0x98D1, 0xC0ED, 0x98D2, 0xC0EE, + 0x98D3, 0xC0EF, 0x98D4, 0xC0F0, 0x98D5, 0xC0F1, 0x98D6, 0xC0F2, + 0x98D7, 0xC0F3, 0x98D8, 0xC0F6, 0x98D9, 0xC0F8, 0x98DA, 0xC0FA, + 0x98DB, 0xC0FB, 0x98DC, 0xC0FC, 0x98DD, 0xC0FD, 0x98DE, 0xC0FE, + 0x98DF, 0xC0FF, 0x98E0, 0xC101, 0x98E1, 0xC102, 0x98E2, 0xC103, + 0x98E3, 0xC105, 0x98E4, 0xC106, 0x98E5, 0xC107, 0x98E6, 0xC109, + 0x98E7, 0xC10A, 0x98E8, 0xC10B, 0x98E9, 0xC10C, 0x98EA, 0xC10D, + 0x98EB, 0xC10E, 0x98EC, 0xC10F, 0x98ED, 0xC111, 0x98EE, 0xC112, + 0x98EF, 0xC113, 0x98F0, 0xC114, 0x98F1, 0xC116, 0x98F2, 0xC117, + 0x98F3, 0xC118, 0x98F4, 0xC119, 0x98F5, 0xC11A, 0x98F6, 0xC11B, + 0x98F7, 0xC121, 0x98F8, 0xC122, 0x98F9, 0xC125, 0x98FA, 0xC128, + 0x98FB, 0xC129, 0x98FC, 0xC12A, 0x98FD, 0xC12B, 0x98FE, 0xC12E, + 0x9941, 0xC132, 0x9942, 0xC133, 0x9943, 0xC134, 0x9944, 0xC135, + 0x9945, 0xC137, 0x9946, 0xC13A, 0x9947, 0xC13B, 0x9948, 0xC13D, + 0x9949, 0xC13E, 0x994A, 0xC13F, 0x994B, 0xC141, 0x994C, 0xC142, + 0x994D, 0xC143, 0x994E, 0xC144, 0x994F, 0xC145, 0x9950, 0xC146, + 0x9951, 0xC147, 0x9952, 0xC14A, 0x9953, 0xC14E, 0x9954, 0xC14F, + 0x9955, 0xC150, 0x9956, 0xC151, 0x9957, 0xC152, 0x9958, 0xC153, + 0x9959, 0xC156, 0x995A, 0xC157, 0x9961, 0xC159, 0x9962, 0xC15A, + 0x9963, 0xC15B, 0x9964, 0xC15D, 0x9965, 0xC15E, 0x9966, 0xC15F, + 0x9967, 0xC160, 0x9968, 0xC161, 0x9969, 0xC162, 0x996A, 0xC163, + 0x996B, 0xC166, 0x996C, 0xC16A, 0x996D, 0xC16B, 0x996E, 0xC16C, + 0x996F, 0xC16D, 0x9970, 0xC16E, 0x9971, 0xC16F, 0x9972, 0xC171, + 0x9973, 0xC172, 0x9974, 0xC173, 0x9975, 0xC175, 0x9976, 0xC176, + 0x9977, 0xC177, 0x9978, 0xC179, 0x9979, 0xC17A, 0x997A, 0xC17B, + 0x9981, 0xC17C, 0x9982, 0xC17D, 0x9983, 0xC17E, 0x9984, 0xC17F, + 0x9985, 0xC180, 0x9986, 0xC181, 0x9987, 0xC182, 0x9988, 0xC183, + 0x9989, 0xC184, 0x998A, 0xC186, 0x998B, 0xC187, 0x998C, 0xC188, + 0x998D, 0xC189, 0x998E, 0xC18A, 0x998F, 0xC18B, 0x9990, 0xC18F, + 0x9991, 0xC191, 0x9992, 0xC192, 0x9993, 0xC193, 0x9994, 0xC195, + 0x9995, 0xC197, 0x9996, 0xC198, 0x9997, 0xC199, 0x9998, 0xC19A, + 0x9999, 0xC19B, 0x999A, 0xC19E, 0x999B, 0xC1A0, 0x999C, 0xC1A2, + 0x999D, 0xC1A3, 0x999E, 0xC1A4, 0x999F, 0xC1A6, 0x99A0, 0xC1A7, + 0x99A1, 0xC1AA, 0x99A2, 0xC1AB, 0x99A3, 0xC1AD, 0x99A4, 0xC1AE, + 0x99A5, 0xC1AF, 0x99A6, 0xC1B1, 0x99A7, 0xC1B2, 0x99A8, 0xC1B3, + 0x99A9, 0xC1B4, 0x99AA, 0xC1B5, 0x99AB, 0xC1B6, 0x99AC, 0xC1B7, + 0x99AD, 0xC1B8, 0x99AE, 0xC1B9, 0x99AF, 0xC1BA, 0x99B0, 0xC1BB, + 0x99B1, 0xC1BC, 0x99B2, 0xC1BE, 0x99B3, 0xC1BF, 0x99B4, 0xC1C0, + 0x99B5, 0xC1C1, 0x99B6, 0xC1C2, 0x99B7, 0xC1C3, 0x99B8, 0xC1C5, + 0x99B9, 0xC1C6, 0x99BA, 0xC1C7, 0x99BB, 0xC1C9, 0x99BC, 0xC1CA, + 0x99BD, 0xC1CB, 0x99BE, 0xC1CD, 0x99BF, 0xC1CE, 0x99C0, 0xC1CF, + 0x99C1, 0xC1D0, 0x99C2, 0xC1D1, 0x99C3, 0xC1D2, 0x99C4, 0xC1D3, + 0x99C5, 0xC1D5, 0x99C6, 0xC1D6, 0x99C7, 0xC1D9, 0x99C8, 0xC1DA, + 0x99C9, 0xC1DB, 0x99CA, 0xC1DC, 0x99CB, 0xC1DD, 0x99CC, 0xC1DE, + 0x99CD, 0xC1DF, 0x99CE, 0xC1E1, 0x99CF, 0xC1E2, 0x99D0, 0xC1E3, + 0x99D1, 0xC1E5, 0x99D2, 0xC1E6, 0x99D3, 0xC1E7, 0x99D4, 0xC1E9, + 0x99D5, 0xC1EA, 0x99D6, 0xC1EB, 0x99D7, 0xC1EC, 0x99D8, 0xC1ED, + 0x99D9, 0xC1EE, 0x99DA, 0xC1EF, 0x99DB, 0xC1F2, 0x99DC, 0xC1F4, + 0x99DD, 0xC1F5, 0x99DE, 0xC1F6, 0x99DF, 0xC1F7, 0x99E0, 0xC1F8, + 0x99E1, 0xC1F9, 0x99E2, 0xC1FA, 0x99E3, 0xC1FB, 0x99E4, 0xC1FE, + 0x99E5, 0xC1FF, 0x99E6, 0xC201, 0x99E7, 0xC202, 0x99E8, 0xC203, + 0x99E9, 0xC205, 0x99EA, 0xC206, 0x99EB, 0xC207, 0x99EC, 0xC208, + 0x99ED, 0xC209, 0x99EE, 0xC20A, 0x99EF, 0xC20B, 0x99F0, 0xC20E, + 0x99F1, 0xC210, 0x99F2, 0xC212, 0x99F3, 0xC213, 0x99F4, 0xC214, + 0x99F5, 0xC215, 0x99F6, 0xC216, 0x99F7, 0xC217, 0x99F8, 0xC21A, + 0x99F9, 0xC21B, 0x99FA, 0xC21D, 0x99FB, 0xC21E, 0x99FC, 0xC221, + 0x99FD, 0xC222, 0x99FE, 0xC223, 0x9A41, 0xC224, 0x9A42, 0xC225, + 0x9A43, 0xC226, 0x9A44, 0xC227, 0x9A45, 0xC22A, 0x9A46, 0xC22C, + 0x9A47, 0xC22E, 0x9A48, 0xC230, 0x9A49, 0xC233, 0x9A4A, 0xC235, + 0x9A4B, 0xC236, 0x9A4C, 0xC237, 0x9A4D, 0xC238, 0x9A4E, 0xC239, + 0x9A4F, 0xC23A, 0x9A50, 0xC23B, 0x9A51, 0xC23C, 0x9A52, 0xC23D, + 0x9A53, 0xC23E, 0x9A54, 0xC23F, 0x9A55, 0xC240, 0x9A56, 0xC241, + 0x9A57, 0xC242, 0x9A58, 0xC243, 0x9A59, 0xC244, 0x9A5A, 0xC245, + 0x9A61, 0xC246, 0x9A62, 0xC247, 0x9A63, 0xC249, 0x9A64, 0xC24A, + 0x9A65, 0xC24B, 0x9A66, 0xC24C, 0x9A67, 0xC24D, 0x9A68, 0xC24E, + 0x9A69, 0xC24F, 0x9A6A, 0xC252, 0x9A6B, 0xC253, 0x9A6C, 0xC255, + 0x9A6D, 0xC256, 0x9A6E, 0xC257, 0x9A6F, 0xC259, 0x9A70, 0xC25A, + 0x9A71, 0xC25B, 0x9A72, 0xC25C, 0x9A73, 0xC25D, 0x9A74, 0xC25E, + 0x9A75, 0xC25F, 0x9A76, 0xC261, 0x9A77, 0xC262, 0x9A78, 0xC263, + 0x9A79, 0xC264, 0x9A7A, 0xC266, 0x9A81, 0xC267, 0x9A82, 0xC268, + 0x9A83, 0xC269, 0x9A84, 0xC26A, 0x9A85, 0xC26B, 0x9A86, 0xC26E, + 0x9A87, 0xC26F, 0x9A88, 0xC271, 0x9A89, 0xC272, 0x9A8A, 0xC273, + 0x9A8B, 0xC275, 0x9A8C, 0xC276, 0x9A8D, 0xC277, 0x9A8E, 0xC278, + 0x9A8F, 0xC279, 0x9A90, 0xC27A, 0x9A91, 0xC27B, 0x9A92, 0xC27E, + 0x9A93, 0xC280, 0x9A94, 0xC282, 0x9A95, 0xC283, 0x9A96, 0xC284, + 0x9A97, 0xC285, 0x9A98, 0xC286, 0x9A99, 0xC287, 0x9A9A, 0xC28A, + 0x9A9B, 0xC28B, 0x9A9C, 0xC28C, 0x9A9D, 0xC28D, 0x9A9E, 0xC28E, + 0x9A9F, 0xC28F, 0x9AA0, 0xC291, 0x9AA1, 0xC292, 0x9AA2, 0xC293, + 0x9AA3, 0xC294, 0x9AA4, 0xC295, 0x9AA5, 0xC296, 0x9AA6, 0xC297, + 0x9AA7, 0xC299, 0x9AA8, 0xC29A, 0x9AA9, 0xC29C, 0x9AAA, 0xC29E, + 0x9AAB, 0xC29F, 0x9AAC, 0xC2A0, 0x9AAD, 0xC2A1, 0x9AAE, 0xC2A2, + 0x9AAF, 0xC2A3, 0x9AB0, 0xC2A6, 0x9AB1, 0xC2A7, 0x9AB2, 0xC2A9, + 0x9AB3, 0xC2AA, 0x9AB4, 0xC2AB, 0x9AB5, 0xC2AE, 0x9AB6, 0xC2AF, + 0x9AB7, 0xC2B0, 0x9AB8, 0xC2B1, 0x9AB9, 0xC2B2, 0x9ABA, 0xC2B3, + 0x9ABB, 0xC2B6, 0x9ABC, 0xC2B8, 0x9ABD, 0xC2BA, 0x9ABE, 0xC2BB, + 0x9ABF, 0xC2BC, 0x9AC0, 0xC2BD, 0x9AC1, 0xC2BE, 0x9AC2, 0xC2BF, + 0x9AC3, 0xC2C0, 0x9AC4, 0xC2C1, 0x9AC5, 0xC2C2, 0x9AC6, 0xC2C3, + 0x9AC7, 0xC2C4, 0x9AC8, 0xC2C5, 0x9AC9, 0xC2C6, 0x9ACA, 0xC2C7, + 0x9ACB, 0xC2C8, 0x9ACC, 0xC2C9, 0x9ACD, 0xC2CA, 0x9ACE, 0xC2CB, + 0x9ACF, 0xC2CC, 0x9AD0, 0xC2CD, 0x9AD1, 0xC2CE, 0x9AD2, 0xC2CF, + 0x9AD3, 0xC2D0, 0x9AD4, 0xC2D1, 0x9AD5, 0xC2D2, 0x9AD6, 0xC2D3, + 0x9AD7, 0xC2D4, 0x9AD8, 0xC2D5, 0x9AD9, 0xC2D6, 0x9ADA, 0xC2D7, + 0x9ADB, 0xC2D8, 0x9ADC, 0xC2D9, 0x9ADD, 0xC2DA, 0x9ADE, 0xC2DB, + 0x9ADF, 0xC2DE, 0x9AE0, 0xC2DF, 0x9AE1, 0xC2E1, 0x9AE2, 0xC2E2, + 0x9AE3, 0xC2E5, 0x9AE4, 0xC2E6, 0x9AE5, 0xC2E7, 0x9AE6, 0xC2E8, + 0x9AE7, 0xC2E9, 0x9AE8, 0xC2EA, 0x9AE9, 0xC2EE, 0x9AEA, 0xC2F0, + 0x9AEB, 0xC2F2, 0x9AEC, 0xC2F3, 0x9AED, 0xC2F4, 0x9AEE, 0xC2F5, + 0x9AEF, 0xC2F7, 0x9AF0, 0xC2FA, 0x9AF1, 0xC2FD, 0x9AF2, 0xC2FE, + 0x9AF3, 0xC2FF, 0x9AF4, 0xC301, 0x9AF5, 0xC302, 0x9AF6, 0xC303, + 0x9AF7, 0xC304, 0x9AF8, 0xC305, 0x9AF9, 0xC306, 0x9AFA, 0xC307, + 0x9AFB, 0xC30A, 0x9AFC, 0xC30B, 0x9AFD, 0xC30E, 0x9AFE, 0xC30F, + 0x9B41, 0xC310, 0x9B42, 0xC311, 0x9B43, 0xC312, 0x9B44, 0xC316, + 0x9B45, 0xC317, 0x9B46, 0xC319, 0x9B47, 0xC31A, 0x9B48, 0xC31B, + 0x9B49, 0xC31D, 0x9B4A, 0xC31E, 0x9B4B, 0xC31F, 0x9B4C, 0xC320, + 0x9B4D, 0xC321, 0x9B4E, 0xC322, 0x9B4F, 0xC323, 0x9B50, 0xC326, + 0x9B51, 0xC327, 0x9B52, 0xC32A, 0x9B53, 0xC32B, 0x9B54, 0xC32C, + 0x9B55, 0xC32D, 0x9B56, 0xC32E, 0x9B57, 0xC32F, 0x9B58, 0xC330, + 0x9B59, 0xC331, 0x9B5A, 0xC332, 0x9B61, 0xC333, 0x9B62, 0xC334, + 0x9B63, 0xC335, 0x9B64, 0xC336, 0x9B65, 0xC337, 0x9B66, 0xC338, + 0x9B67, 0xC339, 0x9B68, 0xC33A, 0x9B69, 0xC33B, 0x9B6A, 0xC33C, + 0x9B6B, 0xC33D, 0x9B6C, 0xC33E, 0x9B6D, 0xC33F, 0x9B6E, 0xC340, + 0x9B6F, 0xC341, 0x9B70, 0xC342, 0x9B71, 0xC343, 0x9B72, 0xC344, + 0x9B73, 0xC346, 0x9B74, 0xC347, 0x9B75, 0xC348, 0x9B76, 0xC349, + 0x9B77, 0xC34A, 0x9B78, 0xC34B, 0x9B79, 0xC34C, 0x9B7A, 0xC34D, + 0x9B81, 0xC34E, 0x9B82, 0xC34F, 0x9B83, 0xC350, 0x9B84, 0xC351, + 0x9B85, 0xC352, 0x9B86, 0xC353, 0x9B87, 0xC354, 0x9B88, 0xC355, + 0x9B89, 0xC356, 0x9B8A, 0xC357, 0x9B8B, 0xC358, 0x9B8C, 0xC359, + 0x9B8D, 0xC35A, 0x9B8E, 0xC35B, 0x9B8F, 0xC35C, 0x9B90, 0xC35D, + 0x9B91, 0xC35E, 0x9B92, 0xC35F, 0x9B93, 0xC360, 0x9B94, 0xC361, + 0x9B95, 0xC362, 0x9B96, 0xC363, 0x9B97, 0xC364, 0x9B98, 0xC365, + 0x9B99, 0xC366, 0x9B9A, 0xC367, 0x9B9B, 0xC36A, 0x9B9C, 0xC36B, + 0x9B9D, 0xC36D, 0x9B9E, 0xC36E, 0x9B9F, 0xC36F, 0x9BA0, 0xC371, + 0x9BA1, 0xC373, 0x9BA2, 0xC374, 0x9BA3, 0xC375, 0x9BA4, 0xC376, + 0x9BA5, 0xC377, 0x9BA6, 0xC37A, 0x9BA7, 0xC37B, 0x9BA8, 0xC37E, + 0x9BA9, 0xC37F, 0x9BAA, 0xC380, 0x9BAB, 0xC381, 0x9BAC, 0xC382, + 0x9BAD, 0xC383, 0x9BAE, 0xC385, 0x9BAF, 0xC386, 0x9BB0, 0xC387, + 0x9BB1, 0xC389, 0x9BB2, 0xC38A, 0x9BB3, 0xC38B, 0x9BB4, 0xC38D, + 0x9BB5, 0xC38E, 0x9BB6, 0xC38F, 0x9BB7, 0xC390, 0x9BB8, 0xC391, + 0x9BB9, 0xC392, 0x9BBA, 0xC393, 0x9BBB, 0xC394, 0x9BBC, 0xC395, + 0x9BBD, 0xC396, 0x9BBE, 0xC397, 0x9BBF, 0xC398, 0x9BC0, 0xC399, + 0x9BC1, 0xC39A, 0x9BC2, 0xC39B, 0x9BC3, 0xC39C, 0x9BC4, 0xC39D, + 0x9BC5, 0xC39E, 0x9BC6, 0xC39F, 0x9BC7, 0xC3A0, 0x9BC8, 0xC3A1, + 0x9BC9, 0xC3A2, 0x9BCA, 0xC3A3, 0x9BCB, 0xC3A4, 0x9BCC, 0xC3A5, + 0x9BCD, 0xC3A6, 0x9BCE, 0xC3A7, 0x9BCF, 0xC3A8, 0x9BD0, 0xC3A9, + 0x9BD1, 0xC3AA, 0x9BD2, 0xC3AB, 0x9BD3, 0xC3AC, 0x9BD4, 0xC3AD, + 0x9BD5, 0xC3AE, 0x9BD6, 0xC3AF, 0x9BD7, 0xC3B0, 0x9BD8, 0xC3B1, + 0x9BD9, 0xC3B2, 0x9BDA, 0xC3B3, 0x9BDB, 0xC3B4, 0x9BDC, 0xC3B5, + 0x9BDD, 0xC3B6, 0x9BDE, 0xC3B7, 0x9BDF, 0xC3B8, 0x9BE0, 0xC3B9, + 0x9BE1, 0xC3BA, 0x9BE2, 0xC3BB, 0x9BE3, 0xC3BC, 0x9BE4, 0xC3BD, + 0x9BE5, 0xC3BE, 0x9BE6, 0xC3BF, 0x9BE7, 0xC3C1, 0x9BE8, 0xC3C2, + 0x9BE9, 0xC3C3, 0x9BEA, 0xC3C4, 0x9BEB, 0xC3C5, 0x9BEC, 0xC3C6, + 0x9BED, 0xC3C7, 0x9BEE, 0xC3C8, 0x9BEF, 0xC3C9, 0x9BF0, 0xC3CA, + 0x9BF1, 0xC3CB, 0x9BF2, 0xC3CC, 0x9BF3, 0xC3CD, 0x9BF4, 0xC3CE, + 0x9BF5, 0xC3CF, 0x9BF6, 0xC3D0, 0x9BF7, 0xC3D1, 0x9BF8, 0xC3D2, + 0x9BF9, 0xC3D3, 0x9BFA, 0xC3D4, 0x9BFB, 0xC3D5, 0x9BFC, 0xC3D6, + 0x9BFD, 0xC3D7, 0x9BFE, 0xC3DA, 0x9C41, 0xC3DB, 0x9C42, 0xC3DD, + 0x9C43, 0xC3DE, 0x9C44, 0xC3E1, 0x9C45, 0xC3E3, 0x9C46, 0xC3E4, + 0x9C47, 0xC3E5, 0x9C48, 0xC3E6, 0x9C49, 0xC3E7, 0x9C4A, 0xC3EA, + 0x9C4B, 0xC3EB, 0x9C4C, 0xC3EC, 0x9C4D, 0xC3EE, 0x9C4E, 0xC3EF, + 0x9C4F, 0xC3F0, 0x9C50, 0xC3F1, 0x9C51, 0xC3F2, 0x9C52, 0xC3F3, + 0x9C53, 0xC3F6, 0x9C54, 0xC3F7, 0x9C55, 0xC3F9, 0x9C56, 0xC3FA, + 0x9C57, 0xC3FB, 0x9C58, 0xC3FC, 0x9C59, 0xC3FD, 0x9C5A, 0xC3FE, + 0x9C61, 0xC3FF, 0x9C62, 0xC400, 0x9C63, 0xC401, 0x9C64, 0xC402, + 0x9C65, 0xC403, 0x9C66, 0xC404, 0x9C67, 0xC405, 0x9C68, 0xC406, + 0x9C69, 0xC407, 0x9C6A, 0xC409, 0x9C6B, 0xC40A, 0x9C6C, 0xC40B, + 0x9C6D, 0xC40C, 0x9C6E, 0xC40D, 0x9C6F, 0xC40E, 0x9C70, 0xC40F, + 0x9C71, 0xC411, 0x9C72, 0xC412, 0x9C73, 0xC413, 0x9C74, 0xC414, + 0x9C75, 0xC415, 0x9C76, 0xC416, 0x9C77, 0xC417, 0x9C78, 0xC418, + 0x9C79, 0xC419, 0x9C7A, 0xC41A, 0x9C81, 0xC41B, 0x9C82, 0xC41C, + 0x9C83, 0xC41D, 0x9C84, 0xC41E, 0x9C85, 0xC41F, 0x9C86, 0xC420, + 0x9C87, 0xC421, 0x9C88, 0xC422, 0x9C89, 0xC423, 0x9C8A, 0xC425, + 0x9C8B, 0xC426, 0x9C8C, 0xC427, 0x9C8D, 0xC428, 0x9C8E, 0xC429, + 0x9C8F, 0xC42A, 0x9C90, 0xC42B, 0x9C91, 0xC42D, 0x9C92, 0xC42E, + 0x9C93, 0xC42F, 0x9C94, 0xC431, 0x9C95, 0xC432, 0x9C96, 0xC433, + 0x9C97, 0xC435, 0x9C98, 0xC436, 0x9C99, 0xC437, 0x9C9A, 0xC438, + 0x9C9B, 0xC439, 0x9C9C, 0xC43A, 0x9C9D, 0xC43B, 0x9C9E, 0xC43E, + 0x9C9F, 0xC43F, 0x9CA0, 0xC440, 0x9CA1, 0xC441, 0x9CA2, 0xC442, + 0x9CA3, 0xC443, 0x9CA4, 0xC444, 0x9CA5, 0xC445, 0x9CA6, 0xC446, + 0x9CA7, 0xC447, 0x9CA8, 0xC449, 0x9CA9, 0xC44A, 0x9CAA, 0xC44B, + 0x9CAB, 0xC44C, 0x9CAC, 0xC44D, 0x9CAD, 0xC44E, 0x9CAE, 0xC44F, + 0x9CAF, 0xC450, 0x9CB0, 0xC451, 0x9CB1, 0xC452, 0x9CB2, 0xC453, + 0x9CB3, 0xC454, 0x9CB4, 0xC455, 0x9CB5, 0xC456, 0x9CB6, 0xC457, + 0x9CB7, 0xC458, 0x9CB8, 0xC459, 0x9CB9, 0xC45A, 0x9CBA, 0xC45B, + 0x9CBB, 0xC45C, 0x9CBC, 0xC45D, 0x9CBD, 0xC45E, 0x9CBE, 0xC45F, + 0x9CBF, 0xC460, 0x9CC0, 0xC461, 0x9CC1, 0xC462, 0x9CC2, 0xC463, + 0x9CC3, 0xC466, 0x9CC4, 0xC467, 0x9CC5, 0xC469, 0x9CC6, 0xC46A, + 0x9CC7, 0xC46B, 0x9CC8, 0xC46D, 0x9CC9, 0xC46E, 0x9CCA, 0xC46F, + 0x9CCB, 0xC470, 0x9CCC, 0xC471, 0x9CCD, 0xC472, 0x9CCE, 0xC473, + 0x9CCF, 0xC476, 0x9CD0, 0xC477, 0x9CD1, 0xC478, 0x9CD2, 0xC47A, + 0x9CD3, 0xC47B, 0x9CD4, 0xC47C, 0x9CD5, 0xC47D, 0x9CD6, 0xC47E, + 0x9CD7, 0xC47F, 0x9CD8, 0xC481, 0x9CD9, 0xC482, 0x9CDA, 0xC483, + 0x9CDB, 0xC484, 0x9CDC, 0xC485, 0x9CDD, 0xC486, 0x9CDE, 0xC487, + 0x9CDF, 0xC488, 0x9CE0, 0xC489, 0x9CE1, 0xC48A, 0x9CE2, 0xC48B, + 0x9CE3, 0xC48C, 0x9CE4, 0xC48D, 0x9CE5, 0xC48E, 0x9CE6, 0xC48F, + 0x9CE7, 0xC490, 0x9CE8, 0xC491, 0x9CE9, 0xC492, 0x9CEA, 0xC493, + 0x9CEB, 0xC495, 0x9CEC, 0xC496, 0x9CED, 0xC497, 0x9CEE, 0xC498, + 0x9CEF, 0xC499, 0x9CF0, 0xC49A, 0x9CF1, 0xC49B, 0x9CF2, 0xC49D, + 0x9CF3, 0xC49E, 0x9CF4, 0xC49F, 0x9CF5, 0xC4A0, 0x9CF6, 0xC4A1, + 0x9CF7, 0xC4A2, 0x9CF8, 0xC4A3, 0x9CF9, 0xC4A4, 0x9CFA, 0xC4A5, + 0x9CFB, 0xC4A6, 0x9CFC, 0xC4A7, 0x9CFD, 0xC4A8, 0x9CFE, 0xC4A9, + 0x9D41, 0xC4AA, 0x9D42, 0xC4AB, 0x9D43, 0xC4AC, 0x9D44, 0xC4AD, + 0x9D45, 0xC4AE, 0x9D46, 0xC4AF, 0x9D47, 0xC4B0, 0x9D48, 0xC4B1, + 0x9D49, 0xC4B2, 0x9D4A, 0xC4B3, 0x9D4B, 0xC4B4, 0x9D4C, 0xC4B5, + 0x9D4D, 0xC4B6, 0x9D4E, 0xC4B7, 0x9D4F, 0xC4B9, 0x9D50, 0xC4BA, + 0x9D51, 0xC4BB, 0x9D52, 0xC4BD, 0x9D53, 0xC4BE, 0x9D54, 0xC4BF, + 0x9D55, 0xC4C0, 0x9D56, 0xC4C1, 0x9D57, 0xC4C2, 0x9D58, 0xC4C3, + 0x9D59, 0xC4C4, 0x9D5A, 0xC4C5, 0x9D61, 0xC4C6, 0x9D62, 0xC4C7, + 0x9D63, 0xC4C8, 0x9D64, 0xC4C9, 0x9D65, 0xC4CA, 0x9D66, 0xC4CB, + 0x9D67, 0xC4CC, 0x9D68, 0xC4CD, 0x9D69, 0xC4CE, 0x9D6A, 0xC4CF, + 0x9D6B, 0xC4D0, 0x9D6C, 0xC4D1, 0x9D6D, 0xC4D2, 0x9D6E, 0xC4D3, + 0x9D6F, 0xC4D4, 0x9D70, 0xC4D5, 0x9D71, 0xC4D6, 0x9D72, 0xC4D7, + 0x9D73, 0xC4D8, 0x9D74, 0xC4D9, 0x9D75, 0xC4DA, 0x9D76, 0xC4DB, + 0x9D77, 0xC4DC, 0x9D78, 0xC4DD, 0x9D79, 0xC4DE, 0x9D7A, 0xC4DF, + 0x9D81, 0xC4E0, 0x9D82, 0xC4E1, 0x9D83, 0xC4E2, 0x9D84, 0xC4E3, + 0x9D85, 0xC4E4, 0x9D86, 0xC4E5, 0x9D87, 0xC4E6, 0x9D88, 0xC4E7, + 0x9D89, 0xC4E8, 0x9D8A, 0xC4EA, 0x9D8B, 0xC4EB, 0x9D8C, 0xC4EC, + 0x9D8D, 0xC4ED, 0x9D8E, 0xC4EE, 0x9D8F, 0xC4EF, 0x9D90, 0xC4F2, + 0x9D91, 0xC4F3, 0x9D92, 0xC4F5, 0x9D93, 0xC4F6, 0x9D94, 0xC4F7, + 0x9D95, 0xC4F9, 0x9D96, 0xC4FB, 0x9D97, 0xC4FC, 0x9D98, 0xC4FD, + 0x9D99, 0xC4FE, 0x9D9A, 0xC502, 0x9D9B, 0xC503, 0x9D9C, 0xC504, + 0x9D9D, 0xC505, 0x9D9E, 0xC506, 0x9D9F, 0xC507, 0x9DA0, 0xC508, + 0x9DA1, 0xC509, 0x9DA2, 0xC50A, 0x9DA3, 0xC50B, 0x9DA4, 0xC50D, + 0x9DA5, 0xC50E, 0x9DA6, 0xC50F, 0x9DA7, 0xC511, 0x9DA8, 0xC512, + 0x9DA9, 0xC513, 0x9DAA, 0xC515, 0x9DAB, 0xC516, 0x9DAC, 0xC517, + 0x9DAD, 0xC518, 0x9DAE, 0xC519, 0x9DAF, 0xC51A, 0x9DB0, 0xC51B, + 0x9DB1, 0xC51D, 0x9DB2, 0xC51E, 0x9DB3, 0xC51F, 0x9DB4, 0xC520, + 0x9DB5, 0xC521, 0x9DB6, 0xC522, 0x9DB7, 0xC523, 0x9DB8, 0xC524, + 0x9DB9, 0xC525, 0x9DBA, 0xC526, 0x9DBB, 0xC527, 0x9DBC, 0xC52A, + 0x9DBD, 0xC52B, 0x9DBE, 0xC52D, 0x9DBF, 0xC52E, 0x9DC0, 0xC52F, + 0x9DC1, 0xC531, 0x9DC2, 0xC532, 0x9DC3, 0xC533, 0x9DC4, 0xC534, + 0x9DC5, 0xC535, 0x9DC6, 0xC536, 0x9DC7, 0xC537, 0x9DC8, 0xC53A, + 0x9DC9, 0xC53C, 0x9DCA, 0xC53E, 0x9DCB, 0xC53F, 0x9DCC, 0xC540, + 0x9DCD, 0xC541, 0x9DCE, 0xC542, 0x9DCF, 0xC543, 0x9DD0, 0xC546, + 0x9DD1, 0xC547, 0x9DD2, 0xC54B, 0x9DD3, 0xC54F, 0x9DD4, 0xC550, + 0x9DD5, 0xC551, 0x9DD6, 0xC552, 0x9DD7, 0xC556, 0x9DD8, 0xC55A, + 0x9DD9, 0xC55B, 0x9DDA, 0xC55C, 0x9DDB, 0xC55F, 0x9DDC, 0xC562, + 0x9DDD, 0xC563, 0x9DDE, 0xC565, 0x9DDF, 0xC566, 0x9DE0, 0xC567, + 0x9DE1, 0xC569, 0x9DE2, 0xC56A, 0x9DE3, 0xC56B, 0x9DE4, 0xC56C, + 0x9DE5, 0xC56D, 0x9DE6, 0xC56E, 0x9DE7, 0xC56F, 0x9DE8, 0xC572, + 0x9DE9, 0xC576, 0x9DEA, 0xC577, 0x9DEB, 0xC578, 0x9DEC, 0xC579, + 0x9DED, 0xC57A, 0x9DEE, 0xC57B, 0x9DEF, 0xC57E, 0x9DF0, 0xC57F, + 0x9DF1, 0xC581, 0x9DF2, 0xC582, 0x9DF3, 0xC583, 0x9DF4, 0xC585, + 0x9DF5, 0xC586, 0x9DF6, 0xC588, 0x9DF7, 0xC589, 0x9DF8, 0xC58A, + 0x9DF9, 0xC58B, 0x9DFA, 0xC58E, 0x9DFB, 0xC590, 0x9DFC, 0xC592, + 0x9DFD, 0xC593, 0x9DFE, 0xC594, 0x9E41, 0xC596, 0x9E42, 0xC599, + 0x9E43, 0xC59A, 0x9E44, 0xC59B, 0x9E45, 0xC59D, 0x9E46, 0xC59E, + 0x9E47, 0xC59F, 0x9E48, 0xC5A1, 0x9E49, 0xC5A2, 0x9E4A, 0xC5A3, + 0x9E4B, 0xC5A4, 0x9E4C, 0xC5A5, 0x9E4D, 0xC5A6, 0x9E4E, 0xC5A7, + 0x9E4F, 0xC5A8, 0x9E50, 0xC5AA, 0x9E51, 0xC5AB, 0x9E52, 0xC5AC, + 0x9E53, 0xC5AD, 0x9E54, 0xC5AE, 0x9E55, 0xC5AF, 0x9E56, 0xC5B0, + 0x9E57, 0xC5B1, 0x9E58, 0xC5B2, 0x9E59, 0xC5B3, 0x9E5A, 0xC5B6, + 0x9E61, 0xC5B7, 0x9E62, 0xC5BA, 0x9E63, 0xC5BF, 0x9E64, 0xC5C0, + 0x9E65, 0xC5C1, 0x9E66, 0xC5C2, 0x9E67, 0xC5C3, 0x9E68, 0xC5CB, + 0x9E69, 0xC5CD, 0x9E6A, 0xC5CF, 0x9E6B, 0xC5D2, 0x9E6C, 0xC5D3, + 0x9E6D, 0xC5D5, 0x9E6E, 0xC5D6, 0x9E6F, 0xC5D7, 0x9E70, 0xC5D9, + 0x9E71, 0xC5DA, 0x9E72, 0xC5DB, 0x9E73, 0xC5DC, 0x9E74, 0xC5DD, + 0x9E75, 0xC5DE, 0x9E76, 0xC5DF, 0x9E77, 0xC5E2, 0x9E78, 0xC5E4, + 0x9E79, 0xC5E6, 0x9E7A, 0xC5E7, 0x9E81, 0xC5E8, 0x9E82, 0xC5E9, + 0x9E83, 0xC5EA, 0x9E84, 0xC5EB, 0x9E85, 0xC5EF, 0x9E86, 0xC5F1, + 0x9E87, 0xC5F2, 0x9E88, 0xC5F3, 0x9E89, 0xC5F5, 0x9E8A, 0xC5F8, + 0x9E8B, 0xC5F9, 0x9E8C, 0xC5FA, 0x9E8D, 0xC5FB, 0x9E8E, 0xC602, + 0x9E8F, 0xC603, 0x9E90, 0xC604, 0x9E91, 0xC609, 0x9E92, 0xC60A, + 0x9E93, 0xC60B, 0x9E94, 0xC60D, 0x9E95, 0xC60E, 0x9E96, 0xC60F, + 0x9E97, 0xC611, 0x9E98, 0xC612, 0x9E99, 0xC613, 0x9E9A, 0xC614, + 0x9E9B, 0xC615, 0x9E9C, 0xC616, 0x9E9D, 0xC617, 0x9E9E, 0xC61A, + 0x9E9F, 0xC61D, 0x9EA0, 0xC61E, 0x9EA1, 0xC61F, 0x9EA2, 0xC620, + 0x9EA3, 0xC621, 0x9EA4, 0xC622, 0x9EA5, 0xC623, 0x9EA6, 0xC626, + 0x9EA7, 0xC627, 0x9EA8, 0xC629, 0x9EA9, 0xC62A, 0x9EAA, 0xC62B, + 0x9EAB, 0xC62F, 0x9EAC, 0xC631, 0x9EAD, 0xC632, 0x9EAE, 0xC636, + 0x9EAF, 0xC638, 0x9EB0, 0xC63A, 0x9EB1, 0xC63C, 0x9EB2, 0xC63D, + 0x9EB3, 0xC63E, 0x9EB4, 0xC63F, 0x9EB5, 0xC642, 0x9EB6, 0xC643, + 0x9EB7, 0xC645, 0x9EB8, 0xC646, 0x9EB9, 0xC647, 0x9EBA, 0xC649, + 0x9EBB, 0xC64A, 0x9EBC, 0xC64B, 0x9EBD, 0xC64C, 0x9EBE, 0xC64D, + 0x9EBF, 0xC64E, 0x9EC0, 0xC64F, 0x9EC1, 0xC652, 0x9EC2, 0xC656, + 0x9EC3, 0xC657, 0x9EC4, 0xC658, 0x9EC5, 0xC659, 0x9EC6, 0xC65A, + 0x9EC7, 0xC65B, 0x9EC8, 0xC65E, 0x9EC9, 0xC65F, 0x9ECA, 0xC661, + 0x9ECB, 0xC662, 0x9ECC, 0xC663, 0x9ECD, 0xC664, 0x9ECE, 0xC665, + 0x9ECF, 0xC666, 0x9ED0, 0xC667, 0x9ED1, 0xC668, 0x9ED2, 0xC669, + 0x9ED3, 0xC66A, 0x9ED4, 0xC66B, 0x9ED5, 0xC66D, 0x9ED6, 0xC66E, + 0x9ED7, 0xC670, 0x9ED8, 0xC672, 0x9ED9, 0xC673, 0x9EDA, 0xC674, + 0x9EDB, 0xC675, 0x9EDC, 0xC676, 0x9EDD, 0xC677, 0x9EDE, 0xC67A, + 0x9EDF, 0xC67B, 0x9EE0, 0xC67D, 0x9EE1, 0xC67E, 0x9EE2, 0xC67F, + 0x9EE3, 0xC681, 0x9EE4, 0xC682, 0x9EE5, 0xC683, 0x9EE6, 0xC684, + 0x9EE7, 0xC685, 0x9EE8, 0xC686, 0x9EE9, 0xC687, 0x9EEA, 0xC68A, + 0x9EEB, 0xC68C, 0x9EEC, 0xC68E, 0x9EED, 0xC68F, 0x9EEE, 0xC690, + 0x9EEF, 0xC691, 0x9EF0, 0xC692, 0x9EF1, 0xC693, 0x9EF2, 0xC696, + 0x9EF3, 0xC697, 0x9EF4, 0xC699, 0x9EF5, 0xC69A, 0x9EF6, 0xC69B, + 0x9EF7, 0xC69D, 0x9EF8, 0xC69E, 0x9EF9, 0xC69F, 0x9EFA, 0xC6A0, + 0x9EFB, 0xC6A1, 0x9EFC, 0xC6A2, 0x9EFD, 0xC6A3, 0x9EFE, 0xC6A6, + 0x9F41, 0xC6A8, 0x9F42, 0xC6AA, 0x9F43, 0xC6AB, 0x9F44, 0xC6AC, + 0x9F45, 0xC6AD, 0x9F46, 0xC6AE, 0x9F47, 0xC6AF, 0x9F48, 0xC6B2, + 0x9F49, 0xC6B3, 0x9F4A, 0xC6B5, 0x9F4B, 0xC6B6, 0x9F4C, 0xC6B7, + 0x9F4D, 0xC6BB, 0x9F4E, 0xC6BC, 0x9F4F, 0xC6BD, 0x9F50, 0xC6BE, + 0x9F51, 0xC6BF, 0x9F52, 0xC6C2, 0x9F53, 0xC6C4, 0x9F54, 0xC6C6, + 0x9F55, 0xC6C7, 0x9F56, 0xC6C8, 0x9F57, 0xC6C9, 0x9F58, 0xC6CA, + 0x9F59, 0xC6CB, 0x9F5A, 0xC6CE, 0x9F61, 0xC6CF, 0x9F62, 0xC6D1, + 0x9F63, 0xC6D2, 0x9F64, 0xC6D3, 0x9F65, 0xC6D5, 0x9F66, 0xC6D6, + 0x9F67, 0xC6D7, 0x9F68, 0xC6D8, 0x9F69, 0xC6D9, 0x9F6A, 0xC6DA, + 0x9F6B, 0xC6DB, 0x9F6C, 0xC6DE, 0x9F6D, 0xC6DF, 0x9F6E, 0xC6E2, + 0x9F6F, 0xC6E3, 0x9F70, 0xC6E4, 0x9F71, 0xC6E5, 0x9F72, 0xC6E6, + 0x9F73, 0xC6E7, 0x9F74, 0xC6EA, 0x9F75, 0xC6EB, 0x9F76, 0xC6ED, + 0x9F77, 0xC6EE, 0x9F78, 0xC6EF, 0x9F79, 0xC6F1, 0x9F7A, 0xC6F2, + 0x9F81, 0xC6F3, 0x9F82, 0xC6F4, 0x9F83, 0xC6F5, 0x9F84, 0xC6F6, + 0x9F85, 0xC6F7, 0x9F86, 0xC6FA, 0x9F87, 0xC6FB, 0x9F88, 0xC6FC, + 0x9F89, 0xC6FE, 0x9F8A, 0xC6FF, 0x9F8B, 0xC700, 0x9F8C, 0xC701, + 0x9F8D, 0xC702, 0x9F8E, 0xC703, 0x9F8F, 0xC706, 0x9F90, 0xC707, + 0x9F91, 0xC709, 0x9F92, 0xC70A, 0x9F93, 0xC70B, 0x9F94, 0xC70D, + 0x9F95, 0xC70E, 0x9F96, 0xC70F, 0x9F97, 0xC710, 0x9F98, 0xC711, + 0x9F99, 0xC712, 0x9F9A, 0xC713, 0x9F9B, 0xC716, 0x9F9C, 0xC718, + 0x9F9D, 0xC71A, 0x9F9E, 0xC71B, 0x9F9F, 0xC71C, 0x9FA0, 0xC71D, + 0x9FA1, 0xC71E, 0x9FA2, 0xC71F, 0x9FA3, 0xC722, 0x9FA4, 0xC723, + 0x9FA5, 0xC725, 0x9FA6, 0xC726, 0x9FA7, 0xC727, 0x9FA8, 0xC729, + 0x9FA9, 0xC72A, 0x9FAA, 0xC72B, 0x9FAB, 0xC72C, 0x9FAC, 0xC72D, + 0x9FAD, 0xC72E, 0x9FAE, 0xC72F, 0x9FAF, 0xC732, 0x9FB0, 0xC734, + 0x9FB1, 0xC736, 0x9FB2, 0xC738, 0x9FB3, 0xC739, 0x9FB4, 0xC73A, + 0x9FB5, 0xC73B, 0x9FB6, 0xC73E, 0x9FB7, 0xC73F, 0x9FB8, 0xC741, + 0x9FB9, 0xC742, 0x9FBA, 0xC743, 0x9FBB, 0xC745, 0x9FBC, 0xC746, + 0x9FBD, 0xC747, 0x9FBE, 0xC748, 0x9FBF, 0xC749, 0x9FC0, 0xC74B, + 0x9FC1, 0xC74E, 0x9FC2, 0xC750, 0x9FC3, 0xC759, 0x9FC4, 0xC75A, + 0x9FC5, 0xC75B, 0x9FC6, 0xC75D, 0x9FC7, 0xC75E, 0x9FC8, 0xC75F, + 0x9FC9, 0xC761, 0x9FCA, 0xC762, 0x9FCB, 0xC763, 0x9FCC, 0xC764, + 0x9FCD, 0xC765, 0x9FCE, 0xC766, 0x9FCF, 0xC767, 0x9FD0, 0xC769, + 0x9FD1, 0xC76A, 0x9FD2, 0xC76C, 0x9FD3, 0xC76D, 0x9FD4, 0xC76E, + 0x9FD5, 0xC76F, 0x9FD6, 0xC770, 0x9FD7, 0xC771, 0x9FD8, 0xC772, + 0x9FD9, 0xC773, 0x9FDA, 0xC776, 0x9FDB, 0xC777, 0x9FDC, 0xC779, + 0x9FDD, 0xC77A, 0x9FDE, 0xC77B, 0x9FDF, 0xC77F, 0x9FE0, 0xC780, + 0x9FE1, 0xC781, 0x9FE2, 0xC782, 0x9FE3, 0xC786, 0x9FE4, 0xC78B, + 0x9FE5, 0xC78C, 0x9FE6, 0xC78D, 0x9FE7, 0xC78F, 0x9FE8, 0xC792, + 0x9FE9, 0xC793, 0x9FEA, 0xC795, 0x9FEB, 0xC799, 0x9FEC, 0xC79B, + 0x9FED, 0xC79C, 0x9FEE, 0xC79D, 0x9FEF, 0xC79E, 0x9FF0, 0xC79F, + 0x9FF1, 0xC7A2, 0x9FF2, 0xC7A7, 0x9FF3, 0xC7A8, 0x9FF4, 0xC7A9, + 0x9FF5, 0xC7AA, 0x9FF6, 0xC7AB, 0x9FF7, 0xC7AE, 0x9FF8, 0xC7AF, + 0x9FF9, 0xC7B1, 0x9FFA, 0xC7B2, 0x9FFB, 0xC7B3, 0x9FFC, 0xC7B5, + 0x9FFD, 0xC7B6, 0x9FFE, 0xC7B7, 0xA041, 0xC7B8, 0xA042, 0xC7B9, + 0xA043, 0xC7BA, 0xA044, 0xC7BB, 0xA045, 0xC7BE, 0xA046, 0xC7C2, + 0xA047, 0xC7C3, 0xA048, 0xC7C4, 0xA049, 0xC7C5, 0xA04A, 0xC7C6, + 0xA04B, 0xC7C7, 0xA04C, 0xC7CA, 0xA04D, 0xC7CB, 0xA04E, 0xC7CD, + 0xA04F, 0xC7CF, 0xA050, 0xC7D1, 0xA051, 0xC7D2, 0xA052, 0xC7D3, + 0xA053, 0xC7D4, 0xA054, 0xC7D5, 0xA055, 0xC7D6, 0xA056, 0xC7D7, + 0xA057, 0xC7D9, 0xA058, 0xC7DA, 0xA059, 0xC7DB, 0xA05A, 0xC7DC, + 0xA061, 0xC7DE, 0xA062, 0xC7DF, 0xA063, 0xC7E0, 0xA064, 0xC7E1, + 0xA065, 0xC7E2, 0xA066, 0xC7E3, 0xA067, 0xC7E5, 0xA068, 0xC7E6, + 0xA069, 0xC7E7, 0xA06A, 0xC7E9, 0xA06B, 0xC7EA, 0xA06C, 0xC7EB, + 0xA06D, 0xC7ED, 0xA06E, 0xC7EE, 0xA06F, 0xC7EF, 0xA070, 0xC7F0, + 0xA071, 0xC7F1, 0xA072, 0xC7F2, 0xA073, 0xC7F3, 0xA074, 0xC7F4, + 0xA075, 0xC7F5, 0xA076, 0xC7F6, 0xA077, 0xC7F7, 0xA078, 0xC7F8, + 0xA079, 0xC7F9, 0xA07A, 0xC7FA, 0xA081, 0xC7FB, 0xA082, 0xC7FC, + 0xA083, 0xC7FD, 0xA084, 0xC7FE, 0xA085, 0xC7FF, 0xA086, 0xC802, + 0xA087, 0xC803, 0xA088, 0xC805, 0xA089, 0xC806, 0xA08A, 0xC807, + 0xA08B, 0xC809, 0xA08C, 0xC80B, 0xA08D, 0xC80C, 0xA08E, 0xC80D, + 0xA08F, 0xC80E, 0xA090, 0xC80F, 0xA091, 0xC812, 0xA092, 0xC814, + 0xA093, 0xC817, 0xA094, 0xC818, 0xA095, 0xC819, 0xA096, 0xC81A, + 0xA097, 0xC81B, 0xA098, 0xC81E, 0xA099, 0xC81F, 0xA09A, 0xC821, + 0xA09B, 0xC822, 0xA09C, 0xC823, 0xA09D, 0xC825, 0xA09E, 0xC826, + 0xA09F, 0xC827, 0xA0A0, 0xC828, 0xA0A1, 0xC829, 0xA0A2, 0xC82A, + 0xA0A3, 0xC82B, 0xA0A4, 0xC82E, 0xA0A5, 0xC830, 0xA0A6, 0xC832, + 0xA0A7, 0xC833, 0xA0A8, 0xC834, 0xA0A9, 0xC835, 0xA0AA, 0xC836, + 0xA0AB, 0xC837, 0xA0AC, 0xC839, 0xA0AD, 0xC83A, 0xA0AE, 0xC83B, + 0xA0AF, 0xC83D, 0xA0B0, 0xC83E, 0xA0B1, 0xC83F, 0xA0B2, 0xC841, + 0xA0B3, 0xC842, 0xA0B4, 0xC843, 0xA0B5, 0xC844, 0xA0B6, 0xC845, + 0xA0B7, 0xC846, 0xA0B8, 0xC847, 0xA0B9, 0xC84A, 0xA0BA, 0xC84B, + 0xA0BB, 0xC84E, 0xA0BC, 0xC84F, 0xA0BD, 0xC850, 0xA0BE, 0xC851, + 0xA0BF, 0xC852, 0xA0C0, 0xC853, 0xA0C1, 0xC855, 0xA0C2, 0xC856, + 0xA0C3, 0xC857, 0xA0C4, 0xC858, 0xA0C5, 0xC859, 0xA0C6, 0xC85A, + 0xA0C7, 0xC85B, 0xA0C8, 0xC85C, 0xA0C9, 0xC85D, 0xA0CA, 0xC85E, + 0xA0CB, 0xC85F, 0xA0CC, 0xC860, 0xA0CD, 0xC861, 0xA0CE, 0xC862, + 0xA0CF, 0xC863, 0xA0D0, 0xC864, 0xA0D1, 0xC865, 0xA0D2, 0xC866, + 0xA0D3, 0xC867, 0xA0D4, 0xC868, 0xA0D5, 0xC869, 0xA0D6, 0xC86A, + 0xA0D7, 0xC86B, 0xA0D8, 0xC86C, 0xA0D9, 0xC86D, 0xA0DA, 0xC86E, + 0xA0DB, 0xC86F, 0xA0DC, 0xC872, 0xA0DD, 0xC873, 0xA0DE, 0xC875, + 0xA0DF, 0xC876, 0xA0E0, 0xC877, 0xA0E1, 0xC879, 0xA0E2, 0xC87B, + 0xA0E3, 0xC87C, 0xA0E4, 0xC87D, 0xA0E5, 0xC87E, 0xA0E6, 0xC87F, + 0xA0E7, 0xC882, 0xA0E8, 0xC884, 0xA0E9, 0xC888, 0xA0EA, 0xC889, + 0xA0EB, 0xC88A, 0xA0EC, 0xC88E, 0xA0ED, 0xC88F, 0xA0EE, 0xC890, + 0xA0EF, 0xC891, 0xA0F0, 0xC892, 0xA0F1, 0xC893, 0xA0F2, 0xC895, + 0xA0F3, 0xC896, 0xA0F4, 0xC897, 0xA0F5, 0xC898, 0xA0F6, 0xC899, + 0xA0F7, 0xC89A, 0xA0F8, 0xC89B, 0xA0F9, 0xC89C, 0xA0FA, 0xC89E, + 0xA0FB, 0xC8A0, 0xA0FC, 0xC8A2, 0xA0FD, 0xC8A3, 0xA0FE, 0xC8A4, + 0xA141, 0xC8A5, 0xA142, 0xC8A6, 0xA143, 0xC8A7, 0xA144, 0xC8A9, + 0xA145, 0xC8AA, 0xA146, 0xC8AB, 0xA147, 0xC8AC, 0xA148, 0xC8AD, + 0xA149, 0xC8AE, 0xA14A, 0xC8AF, 0xA14B, 0xC8B0, 0xA14C, 0xC8B1, + 0xA14D, 0xC8B2, 0xA14E, 0xC8B3, 0xA14F, 0xC8B4, 0xA150, 0xC8B5, + 0xA151, 0xC8B6, 0xA152, 0xC8B7, 0xA153, 0xC8B8, 0xA154, 0xC8B9, + 0xA155, 0xC8BA, 0xA156, 0xC8BB, 0xA157, 0xC8BE, 0xA158, 0xC8BF, + 0xA159, 0xC8C0, 0xA15A, 0xC8C1, 0xA161, 0xC8C2, 0xA162, 0xC8C3, + 0xA163, 0xC8C5, 0xA164, 0xC8C6, 0xA165, 0xC8C7, 0xA166, 0xC8C9, + 0xA167, 0xC8CA, 0xA168, 0xC8CB, 0xA169, 0xC8CD, 0xA16A, 0xC8CE, + 0xA16B, 0xC8CF, 0xA16C, 0xC8D0, 0xA16D, 0xC8D1, 0xA16E, 0xC8D2, + 0xA16F, 0xC8D3, 0xA170, 0xC8D6, 0xA171, 0xC8D8, 0xA172, 0xC8DA, + 0xA173, 0xC8DB, 0xA174, 0xC8DC, 0xA175, 0xC8DD, 0xA176, 0xC8DE, + 0xA177, 0xC8DF, 0xA178, 0xC8E2, 0xA179, 0xC8E3, 0xA17A, 0xC8E5, + 0xA181, 0xC8E6, 0xA182, 0xC8E7, 0xA183, 0xC8E8, 0xA184, 0xC8E9, + 0xA185, 0xC8EA, 0xA186, 0xC8EB, 0xA187, 0xC8EC, 0xA188, 0xC8ED, + 0xA189, 0xC8EE, 0xA18A, 0xC8EF, 0xA18B, 0xC8F0, 0xA18C, 0xC8F1, + 0xA18D, 0xC8F2, 0xA18E, 0xC8F3, 0xA18F, 0xC8F4, 0xA190, 0xC8F6, + 0xA191, 0xC8F7, 0xA192, 0xC8F8, 0xA193, 0xC8F9, 0xA194, 0xC8FA, + 0xA195, 0xC8FB, 0xA196, 0xC8FE, 0xA197, 0xC8FF, 0xA198, 0xC901, + 0xA199, 0xC902, 0xA19A, 0xC903, 0xA19B, 0xC907, 0xA19C, 0xC908, + 0xA19D, 0xC909, 0xA19E, 0xC90A, 0xA19F, 0xC90B, 0xA1A0, 0xC90E, + 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7, + 0xA1A5, 0x2025, 0xA1A6, 0x2026, 0xA1A7, 0x00A8, 0xA1A8, 0x3003, + 0xA1A9, 0x00AD, 0xA1AA, 0x2015, 0xA1AB, 0x2225, 0xA1AC, 0xFF3C, + 0xA1AD, 0x223C, 0xA1AE, 0x2018, 0xA1AF, 0x2019, 0xA1B0, 0x201C, + 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008, + 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, 0xA1B8, 0x300C, + 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3010, + 0xA1BD, 0x3011, 0xA1BE, 0x00B1, 0xA1BF, 0x00D7, 0xA1C0, 0x00F7, + 0xA1C1, 0x2260, 0xA1C2, 0x2264, 0xA1C3, 0x2265, 0xA1C4, 0x221E, + 0xA1C5, 0x2234, 0xA1C6, 0x00B0, 0xA1C7, 0x2032, 0xA1C8, 0x2033, + 0xA1C9, 0x2103, 0xA1CA, 0x212B, 0xA1CB, 0xFFE0, 0xA1CC, 0xFFE1, + 0xA1CD, 0xFFE5, 0xA1CE, 0x2642, 0xA1CF, 0x2640, 0xA1D0, 0x2220, + 0xA1D1, 0x22A5, 0xA1D2, 0x2312, 0xA1D3, 0x2202, 0xA1D4, 0x2207, + 0xA1D5, 0x2261, 0xA1D6, 0x2252, 0xA1D7, 0x00A7, 0xA1D8, 0x203B, + 0xA1D9, 0x2606, 0xA1DA, 0x2605, 0xA1DB, 0x25CB, 0xA1DC, 0x25CF, + 0xA1DD, 0x25CE, 0xA1DE, 0x25C7, 0xA1DF, 0x25C6, 0xA1E0, 0x25A1, + 0xA1E1, 0x25A0, 0xA1E2, 0x25B3, 0xA1E3, 0x25B2, 0xA1E4, 0x25BD, + 0xA1E5, 0x25BC, 0xA1E6, 0x2192, 0xA1E7, 0x2190, 0xA1E8, 0x2191, + 0xA1E9, 0x2193, 0xA1EA, 0x2194, 0xA1EB, 0x3013, 0xA1EC, 0x226A, + 0xA1ED, 0x226B, 0xA1EE, 0x221A, 0xA1EF, 0x223D, 0xA1F0, 0x221D, + 0xA1F1, 0x2235, 0xA1F2, 0x222B, 0xA1F3, 0x222C, 0xA1F4, 0x2208, + 0xA1F5, 0x220B, 0xA1F6, 0x2286, 0xA1F7, 0x2287, 0xA1F8, 0x2282, + 0xA1F9, 0x2283, 0xA1FA, 0x222A, 0xA1FB, 0x2229, 0xA1FC, 0x2227, + 0xA1FD, 0x2228, 0xA1FE, 0xFFE2, 0xA241, 0xC910, 0xA242, 0xC912, + 0xA243, 0xC913, 0xA244, 0xC914, 0xA245, 0xC915, 0xA246, 0xC916, + 0xA247, 0xC917, 0xA248, 0xC919, 0xA249, 0xC91A, 0xA24A, 0xC91B, + 0xA24B, 0xC91C, 0xA24C, 0xC91D, 0xA24D, 0xC91E, 0xA24E, 0xC91F, + 0xA24F, 0xC920, 0xA250, 0xC921, 0xA251, 0xC922, 0xA252, 0xC923, + 0xA253, 0xC924, 0xA254, 0xC925, 0xA255, 0xC926, 0xA256, 0xC927, + 0xA257, 0xC928, 0xA258, 0xC929, 0xA259, 0xC92A, 0xA25A, 0xC92B, + 0xA261, 0xC92D, 0xA262, 0xC92E, 0xA263, 0xC92F, 0xA264, 0xC930, + 0xA265, 0xC931, 0xA266, 0xC932, 0xA267, 0xC933, 0xA268, 0xC935, + 0xA269, 0xC936, 0xA26A, 0xC937, 0xA26B, 0xC938, 0xA26C, 0xC939, + 0xA26D, 0xC93A, 0xA26E, 0xC93B, 0xA26F, 0xC93C, 0xA270, 0xC93D, + 0xA271, 0xC93E, 0xA272, 0xC93F, 0xA273, 0xC940, 0xA274, 0xC941, + 0xA275, 0xC942, 0xA276, 0xC943, 0xA277, 0xC944, 0xA278, 0xC945, + 0xA279, 0xC946, 0xA27A, 0xC947, 0xA281, 0xC948, 0xA282, 0xC949, + 0xA283, 0xC94A, 0xA284, 0xC94B, 0xA285, 0xC94C, 0xA286, 0xC94D, + 0xA287, 0xC94E, 0xA288, 0xC94F, 0xA289, 0xC952, 0xA28A, 0xC953, + 0xA28B, 0xC955, 0xA28C, 0xC956, 0xA28D, 0xC957, 0xA28E, 0xC959, + 0xA28F, 0xC95A, 0xA290, 0xC95B, 0xA291, 0xC95C, 0xA292, 0xC95D, + 0xA293, 0xC95E, 0xA294, 0xC95F, 0xA295, 0xC962, 0xA296, 0xC964, + 0xA297, 0xC965, 0xA298, 0xC966, 0xA299, 0xC967, 0xA29A, 0xC968, + 0xA29B, 0xC969, 0xA29C, 0xC96A, 0xA29D, 0xC96B, 0xA29E, 0xC96D, + 0xA29F, 0xC96E, 0xA2A0, 0xC96F, 0xA2A1, 0x21D2, 0xA2A2, 0x21D4, + 0xA2A3, 0x2200, 0xA2A4, 0x2203, 0xA2A5, 0x00B4, 0xA2A6, 0xFF5E, + 0xA2A7, 0x02C7, 0xA2A8, 0x02D8, 0xA2A9, 0x02DD, 0xA2AA, 0x02DA, + 0xA2AB, 0x02D9, 0xA2AC, 0x00B8, 0xA2AD, 0x02DB, 0xA2AE, 0x00A1, + 0xA2AF, 0x00BF, 0xA2B0, 0x02D0, 0xA2B1, 0x222E, 0xA2B2, 0x2211, + 0xA2B3, 0x220F, 0xA2B4, 0x00A4, 0xA2B5, 0x2109, 0xA2B6, 0x2030, + 0xA2B7, 0x25C1, 0xA2B8, 0x25C0, 0xA2B9, 0x25B7, 0xA2BA, 0x25B6, + 0xA2BB, 0x2664, 0xA2BC, 0x2660, 0xA2BD, 0x2661, 0xA2BE, 0x2665, + 0xA2BF, 0x2667, 0xA2C0, 0x2663, 0xA2C1, 0x2299, 0xA2C2, 0x25C8, + 0xA2C3, 0x25A3, 0xA2C4, 0x25D0, 0xA2C5, 0x25D1, 0xA2C6, 0x2592, + 0xA2C7, 0x25A4, 0xA2C8, 0x25A5, 0xA2C9, 0x25A8, 0xA2CA, 0x25A7, + 0xA2CB, 0x25A6, 0xA2CC, 0x25A9, 0xA2CD, 0x2668, 0xA2CE, 0x260F, + 0xA2CF, 0x260E, 0xA2D0, 0x261C, 0xA2D1, 0x261E, 0xA2D2, 0x00B6, + 0xA2D3, 0x2020, 0xA2D4, 0x2021, 0xA2D5, 0x2195, 0xA2D6, 0x2197, + 0xA2D7, 0x2199, 0xA2D8, 0x2196, 0xA2D9, 0x2198, 0xA2DA, 0x266D, + 0xA2DB, 0x2669, 0xA2DC, 0x266A, 0xA2DD, 0x266C, 0xA2DE, 0x327F, + 0xA2DF, 0x321C, 0xA2E0, 0x2116, 0xA2E1, 0x33C7, 0xA2E2, 0x2122, + 0xA2E3, 0x33C2, 0xA2E4, 0x33D8, 0xA2E5, 0x2121, 0xA2E6, 0x20AC, + 0xA2E7, 0x00AE, 0xA341, 0xC971, 0xA342, 0xC972, 0xA343, 0xC973, + 0xA344, 0xC975, 0xA345, 0xC976, 0xA346, 0xC977, 0xA347, 0xC978, + 0xA348, 0xC979, 0xA349, 0xC97A, 0xA34A, 0xC97B, 0xA34B, 0xC97D, + 0xA34C, 0xC97E, 0xA34D, 0xC97F, 0xA34E, 0xC980, 0xA34F, 0xC981, + 0xA350, 0xC982, 0xA351, 0xC983, 0xA352, 0xC984, 0xA353, 0xC985, + 0xA354, 0xC986, 0xA355, 0xC987, 0xA356, 0xC98A, 0xA357, 0xC98B, + 0xA358, 0xC98D, 0xA359, 0xC98E, 0xA35A, 0xC98F, 0xA361, 0xC991, + 0xA362, 0xC992, 0xA363, 0xC993, 0xA364, 0xC994, 0xA365, 0xC995, + 0xA366, 0xC996, 0xA367, 0xC997, 0xA368, 0xC99A, 0xA369, 0xC99C, + 0xA36A, 0xC99E, 0xA36B, 0xC99F, 0xA36C, 0xC9A0, 0xA36D, 0xC9A1, + 0xA36E, 0xC9A2, 0xA36F, 0xC9A3, 0xA370, 0xC9A4, 0xA371, 0xC9A5, + 0xA372, 0xC9A6, 0xA373, 0xC9A7, 0xA374, 0xC9A8, 0xA375, 0xC9A9, + 0xA376, 0xC9AA, 0xA377, 0xC9AB, 0xA378, 0xC9AC, 0xA379, 0xC9AD, + 0xA37A, 0xC9AE, 0xA381, 0xC9AF, 0xA382, 0xC9B0, 0xA383, 0xC9B1, + 0xA384, 0xC9B2, 0xA385, 0xC9B3, 0xA386, 0xC9B4, 0xA387, 0xC9B5, + 0xA388, 0xC9B6, 0xA389, 0xC9B7, 0xA38A, 0xC9B8, 0xA38B, 0xC9B9, + 0xA38C, 0xC9BA, 0xA38D, 0xC9BB, 0xA38E, 0xC9BC, 0xA38F, 0xC9BD, + 0xA390, 0xC9BE, 0xA391, 0xC9BF, 0xA392, 0xC9C2, 0xA393, 0xC9C3, + 0xA394, 0xC9C5, 0xA395, 0xC9C6, 0xA396, 0xC9C9, 0xA397, 0xC9CB, + 0xA398, 0xC9CC, 0xA399, 0xC9CD, 0xA39A, 0xC9CE, 0xA39B, 0xC9CF, + 0xA39C, 0xC9D2, 0xA39D, 0xC9D4, 0xA39E, 0xC9D7, 0xA39F, 0xC9D8, + 0xA3A0, 0xC9DB, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03, + 0xA3A4, 0xFF04, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07, + 0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B, + 0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F, + 0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13, + 0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17, + 0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B, + 0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F, + 0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23, + 0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27, + 0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B, + 0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F, + 0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33, + 0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37, + 0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B, + 0xA3DC, 0xFFE6, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F, + 0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43, + 0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47, + 0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B, + 0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F, + 0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53, + 0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57, + 0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B, + 0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA441, 0xC9DE, + 0xA442, 0xC9DF, 0xA443, 0xC9E1, 0xA444, 0xC9E3, 0xA445, 0xC9E5, + 0xA446, 0xC9E6, 0xA447, 0xC9E8, 0xA448, 0xC9E9, 0xA449, 0xC9EA, + 0xA44A, 0xC9EB, 0xA44B, 0xC9EE, 0xA44C, 0xC9F2, 0xA44D, 0xC9F3, + 0xA44E, 0xC9F4, 0xA44F, 0xC9F5, 0xA450, 0xC9F6, 0xA451, 0xC9F7, + 0xA452, 0xC9FA, 0xA453, 0xC9FB, 0xA454, 0xC9FD, 0xA455, 0xC9FE, + 0xA456, 0xC9FF, 0xA457, 0xCA01, 0xA458, 0xCA02, 0xA459, 0xCA03, + 0xA45A, 0xCA04, 0xA461, 0xCA05, 0xA462, 0xCA06, 0xA463, 0xCA07, + 0xA464, 0xCA0A, 0xA465, 0xCA0E, 0xA466, 0xCA0F, 0xA467, 0xCA10, + 0xA468, 0xCA11, 0xA469, 0xCA12, 0xA46A, 0xCA13, 0xA46B, 0xCA15, + 0xA46C, 0xCA16, 0xA46D, 0xCA17, 0xA46E, 0xCA19, 0xA46F, 0xCA1A, + 0xA470, 0xCA1B, 0xA471, 0xCA1C, 0xA472, 0xCA1D, 0xA473, 0xCA1E, + 0xA474, 0xCA1F, 0xA475, 0xCA20, 0xA476, 0xCA21, 0xA477, 0xCA22, + 0xA478, 0xCA23, 0xA479, 0xCA24, 0xA47A, 0xCA25, 0xA481, 0xCA26, + 0xA482, 0xCA27, 0xA483, 0xCA28, 0xA484, 0xCA2A, 0xA485, 0xCA2B, + 0xA486, 0xCA2C, 0xA487, 0xCA2D, 0xA488, 0xCA2E, 0xA489, 0xCA2F, + 0xA48A, 0xCA30, 0xA48B, 0xCA31, 0xA48C, 0xCA32, 0xA48D, 0xCA33, + 0xA48E, 0xCA34, 0xA48F, 0xCA35, 0xA490, 0xCA36, 0xA491, 0xCA37, + 0xA492, 0xCA38, 0xA493, 0xCA39, 0xA494, 0xCA3A, 0xA495, 0xCA3B, + 0xA496, 0xCA3C, 0xA497, 0xCA3D, 0xA498, 0xCA3E, 0xA499, 0xCA3F, + 0xA49A, 0xCA40, 0xA49B, 0xCA41, 0xA49C, 0xCA42, 0xA49D, 0xCA43, + 0xA49E, 0xCA44, 0xA49F, 0xCA45, 0xA4A0, 0xCA46, 0xA4A1, 0x3131, + 0xA4A2, 0x3132, 0xA4A3, 0x3133, 0xA4A4, 0x3134, 0xA4A5, 0x3135, + 0xA4A6, 0x3136, 0xA4A7, 0x3137, 0xA4A8, 0x3138, 0xA4A9, 0x3139, + 0xA4AA, 0x313A, 0xA4AB, 0x313B, 0xA4AC, 0x313C, 0xA4AD, 0x313D, + 0xA4AE, 0x313E, 0xA4AF, 0x313F, 0xA4B0, 0x3140, 0xA4B1, 0x3141, + 0xA4B2, 0x3142, 0xA4B3, 0x3143, 0xA4B4, 0x3144, 0xA4B5, 0x3145, + 0xA4B6, 0x3146, 0xA4B7, 0x3147, 0xA4B8, 0x3148, 0xA4B9, 0x3149, + 0xA4BA, 0x314A, 0xA4BB, 0x314B, 0xA4BC, 0x314C, 0xA4BD, 0x314D, + 0xA4BE, 0x314E, 0xA4BF, 0x314F, 0xA4C0, 0x3150, 0xA4C1, 0x3151, + 0xA4C2, 0x3152, 0xA4C3, 0x3153, 0xA4C4, 0x3154, 0xA4C5, 0x3155, + 0xA4C6, 0x3156, 0xA4C7, 0x3157, 0xA4C8, 0x3158, 0xA4C9, 0x3159, + 0xA4CA, 0x315A, 0xA4CB, 0x315B, 0xA4CC, 0x315C, 0xA4CD, 0x315D, + 0xA4CE, 0x315E, 0xA4CF, 0x315F, 0xA4D0, 0x3160, 0xA4D1, 0x3161, + 0xA4D2, 0x3162, 0xA4D3, 0x3163, 0xA4D4, 0x3164, 0xA4D5, 0x3165, + 0xA4D6, 0x3166, 0xA4D7, 0x3167, 0xA4D8, 0x3168, 0xA4D9, 0x3169, + 0xA4DA, 0x316A, 0xA4DB, 0x316B, 0xA4DC, 0x316C, 0xA4DD, 0x316D, + 0xA4DE, 0x316E, 0xA4DF, 0x316F, 0xA4E0, 0x3170, 0xA4E1, 0x3171, + 0xA4E2, 0x3172, 0xA4E3, 0x3173, 0xA4E4, 0x3174, 0xA4E5, 0x3175, + 0xA4E6, 0x3176, 0xA4E7, 0x3177, 0xA4E8, 0x3178, 0xA4E9, 0x3179, + 0xA4EA, 0x317A, 0xA4EB, 0x317B, 0xA4EC, 0x317C, 0xA4ED, 0x317D, + 0xA4EE, 0x317E, 0xA4EF, 0x317F, 0xA4F0, 0x3180, 0xA4F1, 0x3181, + 0xA4F2, 0x3182, 0xA4F3, 0x3183, 0xA4F4, 0x3184, 0xA4F5, 0x3185, + 0xA4F6, 0x3186, 0xA4F7, 0x3187, 0xA4F8, 0x3188, 0xA4F9, 0x3189, + 0xA4FA, 0x318A, 0xA4FB, 0x318B, 0xA4FC, 0x318C, 0xA4FD, 0x318D, + 0xA4FE, 0x318E, 0xA541, 0xCA47, 0xA542, 0xCA48, 0xA543, 0xCA49, + 0xA544, 0xCA4A, 0xA545, 0xCA4B, 0xA546, 0xCA4E, 0xA547, 0xCA4F, + 0xA548, 0xCA51, 0xA549, 0xCA52, 0xA54A, 0xCA53, 0xA54B, 0xCA55, + 0xA54C, 0xCA56, 0xA54D, 0xCA57, 0xA54E, 0xCA58, 0xA54F, 0xCA59, + 0xA550, 0xCA5A, 0xA551, 0xCA5B, 0xA552, 0xCA5E, 0xA553, 0xCA62, + 0xA554, 0xCA63, 0xA555, 0xCA64, 0xA556, 0xCA65, 0xA557, 0xCA66, + 0xA558, 0xCA67, 0xA559, 0xCA69, 0xA55A, 0xCA6A, 0xA561, 0xCA6B, + 0xA562, 0xCA6C, 0xA563, 0xCA6D, 0xA564, 0xCA6E, 0xA565, 0xCA6F, + 0xA566, 0xCA70, 0xA567, 0xCA71, 0xA568, 0xCA72, 0xA569, 0xCA73, + 0xA56A, 0xCA74, 0xA56B, 0xCA75, 0xA56C, 0xCA76, 0xA56D, 0xCA77, + 0xA56E, 0xCA78, 0xA56F, 0xCA79, 0xA570, 0xCA7A, 0xA571, 0xCA7B, + 0xA572, 0xCA7C, 0xA573, 0xCA7E, 0xA574, 0xCA7F, 0xA575, 0xCA80, + 0xA576, 0xCA81, 0xA577, 0xCA82, 0xA578, 0xCA83, 0xA579, 0xCA85, + 0xA57A, 0xCA86, 0xA581, 0xCA87, 0xA582, 0xCA88, 0xA583, 0xCA89, + 0xA584, 0xCA8A, 0xA585, 0xCA8B, 0xA586, 0xCA8C, 0xA587, 0xCA8D, + 0xA588, 0xCA8E, 0xA589, 0xCA8F, 0xA58A, 0xCA90, 0xA58B, 0xCA91, + 0xA58C, 0xCA92, 0xA58D, 0xCA93, 0xA58E, 0xCA94, 0xA58F, 0xCA95, + 0xA590, 0xCA96, 0xA591, 0xCA97, 0xA592, 0xCA99, 0xA593, 0xCA9A, + 0xA594, 0xCA9B, 0xA595, 0xCA9C, 0xA596, 0xCA9D, 0xA597, 0xCA9E, + 0xA598, 0xCA9F, 0xA599, 0xCAA0, 0xA59A, 0xCAA1, 0xA59B, 0xCAA2, + 0xA59C, 0xCAA3, 0xA59D, 0xCAA4, 0xA59E, 0xCAA5, 0xA59F, 0xCAA6, + 0xA5A0, 0xCAA7, 0xA5A1, 0x2170, 0xA5A2, 0x2171, 0xA5A3, 0x2172, + 0xA5A4, 0x2173, 0xA5A5, 0x2174, 0xA5A6, 0x2175, 0xA5A7, 0x2176, + 0xA5A8, 0x2177, 0xA5A9, 0x2178, 0xA5AA, 0x2179, 0xA5B0, 0x2160, + 0xA5B1, 0x2161, 0xA5B2, 0x2162, 0xA5B3, 0x2163, 0xA5B4, 0x2164, + 0xA5B5, 0x2165, 0xA5B6, 0x2166, 0xA5B7, 0x2167, 0xA5B8, 0x2168, + 0xA5B9, 0x2169, 0xA5C1, 0x0391, 0xA5C2, 0x0392, 0xA5C3, 0x0393, + 0xA5C4, 0x0394, 0xA5C5, 0x0395, 0xA5C6, 0x0396, 0xA5C7, 0x0397, + 0xA5C8, 0x0398, 0xA5C9, 0x0399, 0xA5CA, 0x039A, 0xA5CB, 0x039B, + 0xA5CC, 0x039C, 0xA5CD, 0x039D, 0xA5CE, 0x039E, 0xA5CF, 0x039F, + 0xA5D0, 0x03A0, 0xA5D1, 0x03A1, 0xA5D2, 0x03A3, 0xA5D3, 0x03A4, + 0xA5D4, 0x03A5, 0xA5D5, 0x03A6, 0xA5D6, 0x03A7, 0xA5D7, 0x03A8, + 0xA5D8, 0x03A9, 0xA5E1, 0x03B1, 0xA5E2, 0x03B2, 0xA5E3, 0x03B3, + 0xA5E4, 0x03B4, 0xA5E5, 0x03B5, 0xA5E6, 0x03B6, 0xA5E7, 0x03B7, + 0xA5E8, 0x03B8, 0xA5E9, 0x03B9, 0xA5EA, 0x03BA, 0xA5EB, 0x03BB, + 0xA5EC, 0x03BC, 0xA5ED, 0x03BD, 0xA5EE, 0x03BE, 0xA5EF, 0x03BF, + 0xA5F0, 0x03C0, 0xA5F1, 0x03C1, 0xA5F2, 0x03C3, 0xA5F3, 0x03C4, + 0xA5F4, 0x03C5, 0xA5F5, 0x03C6, 0xA5F6, 0x03C7, 0xA5F7, 0x03C8, + 0xA5F8, 0x03C9, 0xA641, 0xCAA8, 0xA642, 0xCAA9, 0xA643, 0xCAAA, + 0xA644, 0xCAAB, 0xA645, 0xCAAC, 0xA646, 0xCAAD, 0xA647, 0xCAAE, + 0xA648, 0xCAAF, 0xA649, 0xCAB0, 0xA64A, 0xCAB1, 0xA64B, 0xCAB2, + 0xA64C, 0xCAB3, 0xA64D, 0xCAB4, 0xA64E, 0xCAB5, 0xA64F, 0xCAB6, + 0xA650, 0xCAB7, 0xA651, 0xCAB8, 0xA652, 0xCAB9, 0xA653, 0xCABA, + 0xA654, 0xCABB, 0xA655, 0xCABE, 0xA656, 0xCABF, 0xA657, 0xCAC1, + 0xA658, 0xCAC2, 0xA659, 0xCAC3, 0xA65A, 0xCAC5, 0xA661, 0xCAC6, + 0xA662, 0xCAC7, 0xA663, 0xCAC8, 0xA664, 0xCAC9, 0xA665, 0xCACA, + 0xA666, 0xCACB, 0xA667, 0xCACE, 0xA668, 0xCAD0, 0xA669, 0xCAD2, + 0xA66A, 0xCAD4, 0xA66B, 0xCAD5, 0xA66C, 0xCAD6, 0xA66D, 0xCAD7, + 0xA66E, 0xCADA, 0xA66F, 0xCADB, 0xA670, 0xCADC, 0xA671, 0xCADD, + 0xA672, 0xCADE, 0xA673, 0xCADF, 0xA674, 0xCAE1, 0xA675, 0xCAE2, + 0xA676, 0xCAE3, 0xA677, 0xCAE4, 0xA678, 0xCAE5, 0xA679, 0xCAE6, + 0xA67A, 0xCAE7, 0xA681, 0xCAE8, 0xA682, 0xCAE9, 0xA683, 0xCAEA, + 0xA684, 0xCAEB, 0xA685, 0xCAED, 0xA686, 0xCAEE, 0xA687, 0xCAEF, + 0xA688, 0xCAF0, 0xA689, 0xCAF1, 0xA68A, 0xCAF2, 0xA68B, 0xCAF3, + 0xA68C, 0xCAF5, 0xA68D, 0xCAF6, 0xA68E, 0xCAF7, 0xA68F, 0xCAF8, + 0xA690, 0xCAF9, 0xA691, 0xCAFA, 0xA692, 0xCAFB, 0xA693, 0xCAFC, + 0xA694, 0xCAFD, 0xA695, 0xCAFE, 0xA696, 0xCAFF, 0xA697, 0xCB00, + 0xA698, 0xCB01, 0xA699, 0xCB02, 0xA69A, 0xCB03, 0xA69B, 0xCB04, + 0xA69C, 0xCB05, 0xA69D, 0xCB06, 0xA69E, 0xCB07, 0xA69F, 0xCB09, + 0xA6A0, 0xCB0A, 0xA6A1, 0x2500, 0xA6A2, 0x2502, 0xA6A3, 0x250C, + 0xA6A4, 0x2510, 0xA6A5, 0x2518, 0xA6A6, 0x2514, 0xA6A7, 0x251C, + 0xA6A8, 0x252C, 0xA6A9, 0x2524, 0xA6AA, 0x2534, 0xA6AB, 0x253C, + 0xA6AC, 0x2501, 0xA6AD, 0x2503, 0xA6AE, 0x250F, 0xA6AF, 0x2513, + 0xA6B0, 0x251B, 0xA6B1, 0x2517, 0xA6B2, 0x2523, 0xA6B3, 0x2533, + 0xA6B4, 0x252B, 0xA6B5, 0x253B, 0xA6B6, 0x254B, 0xA6B7, 0x2520, + 0xA6B8, 0x252F, 0xA6B9, 0x2528, 0xA6BA, 0x2537, 0xA6BB, 0x253F, + 0xA6BC, 0x251D, 0xA6BD, 0x2530, 0xA6BE, 0x2525, 0xA6BF, 0x2538, + 0xA6C0, 0x2542, 0xA6C1, 0x2512, 0xA6C2, 0x2511, 0xA6C3, 0x251A, + 0xA6C4, 0x2519, 0xA6C5, 0x2516, 0xA6C6, 0x2515, 0xA6C7, 0x250E, + 0xA6C8, 0x250D, 0xA6C9, 0x251E, 0xA6CA, 0x251F, 0xA6CB, 0x2521, + 0xA6CC, 0x2522, 0xA6CD, 0x2526, 0xA6CE, 0x2527, 0xA6CF, 0x2529, + 0xA6D0, 0x252A, 0xA6D1, 0x252D, 0xA6D2, 0x252E, 0xA6D3, 0x2531, + 0xA6D4, 0x2532, 0xA6D5, 0x2535, 0xA6D6, 0x2536, 0xA6D7, 0x2539, + 0xA6D8, 0x253A, 0xA6D9, 0x253D, 0xA6DA, 0x253E, 0xA6DB, 0x2540, + 0xA6DC, 0x2541, 0xA6DD, 0x2543, 0xA6DE, 0x2544, 0xA6DF, 0x2545, + 0xA6E0, 0x2546, 0xA6E1, 0x2547, 0xA6E2, 0x2548, 0xA6E3, 0x2549, + 0xA6E4, 0x254A, 0xA741, 0xCB0B, 0xA742, 0xCB0C, 0xA743, 0xCB0D, + 0xA744, 0xCB0E, 0xA745, 0xCB0F, 0xA746, 0xCB11, 0xA747, 0xCB12, + 0xA748, 0xCB13, 0xA749, 0xCB15, 0xA74A, 0xCB16, 0xA74B, 0xCB17, + 0xA74C, 0xCB19, 0xA74D, 0xCB1A, 0xA74E, 0xCB1B, 0xA74F, 0xCB1C, + 0xA750, 0xCB1D, 0xA751, 0xCB1E, 0xA752, 0xCB1F, 0xA753, 0xCB22, + 0xA754, 0xCB23, 0xA755, 0xCB24, 0xA756, 0xCB25, 0xA757, 0xCB26, + 0xA758, 0xCB27, 0xA759, 0xCB28, 0xA75A, 0xCB29, 0xA761, 0xCB2A, + 0xA762, 0xCB2B, 0xA763, 0xCB2C, 0xA764, 0xCB2D, 0xA765, 0xCB2E, + 0xA766, 0xCB2F, 0xA767, 0xCB30, 0xA768, 0xCB31, 0xA769, 0xCB32, + 0xA76A, 0xCB33, 0xA76B, 0xCB34, 0xA76C, 0xCB35, 0xA76D, 0xCB36, + 0xA76E, 0xCB37, 0xA76F, 0xCB38, 0xA770, 0xCB39, 0xA771, 0xCB3A, + 0xA772, 0xCB3B, 0xA773, 0xCB3C, 0xA774, 0xCB3D, 0xA775, 0xCB3E, + 0xA776, 0xCB3F, 0xA777, 0xCB40, 0xA778, 0xCB42, 0xA779, 0xCB43, + 0xA77A, 0xCB44, 0xA781, 0xCB45, 0xA782, 0xCB46, 0xA783, 0xCB47, + 0xA784, 0xCB4A, 0xA785, 0xCB4B, 0xA786, 0xCB4D, 0xA787, 0xCB4E, + 0xA788, 0xCB4F, 0xA789, 0xCB51, 0xA78A, 0xCB52, 0xA78B, 0xCB53, + 0xA78C, 0xCB54, 0xA78D, 0xCB55, 0xA78E, 0xCB56, 0xA78F, 0xCB57, + 0xA790, 0xCB5A, 0xA791, 0xCB5B, 0xA792, 0xCB5C, 0xA793, 0xCB5E, + 0xA794, 0xCB5F, 0xA795, 0xCB60, 0xA796, 0xCB61, 0xA797, 0xCB62, + 0xA798, 0xCB63, 0xA799, 0xCB65, 0xA79A, 0xCB66, 0xA79B, 0xCB67, + 0xA79C, 0xCB68, 0xA79D, 0xCB69, 0xA79E, 0xCB6A, 0xA79F, 0xCB6B, + 0xA7A0, 0xCB6C, 0xA7A1, 0x3395, 0xA7A2, 0x3396, 0xA7A3, 0x3397, + 0xA7A4, 0x2113, 0xA7A5, 0x3398, 0xA7A6, 0x33C4, 0xA7A7, 0x33A3, + 0xA7A8, 0x33A4, 0xA7A9, 0x33A5, 0xA7AA, 0x33A6, 0xA7AB, 0x3399, + 0xA7AC, 0x339A, 0xA7AD, 0x339B, 0xA7AE, 0x339C, 0xA7AF, 0x339D, + 0xA7B0, 0x339E, 0xA7B1, 0x339F, 0xA7B2, 0x33A0, 0xA7B3, 0x33A1, + 0xA7B4, 0x33A2, 0xA7B5, 0x33CA, 0xA7B6, 0x338D, 0xA7B7, 0x338E, + 0xA7B8, 0x338F, 0xA7B9, 0x33CF, 0xA7BA, 0x3388, 0xA7BB, 0x3389, + 0xA7BC, 0x33C8, 0xA7BD, 0x33A7, 0xA7BE, 0x33A8, 0xA7BF, 0x33B0, + 0xA7C0, 0x33B1, 0xA7C1, 0x33B2, 0xA7C2, 0x33B3, 0xA7C3, 0x33B4, + 0xA7C4, 0x33B5, 0xA7C5, 0x33B6, 0xA7C6, 0x33B7, 0xA7C7, 0x33B8, + 0xA7C8, 0x33B9, 0xA7C9, 0x3380, 0xA7CA, 0x3381, 0xA7CB, 0x3382, + 0xA7CC, 0x3383, 0xA7CD, 0x3384, 0xA7CE, 0x33BA, 0xA7CF, 0x33BB, + 0xA7D0, 0x33BC, 0xA7D1, 0x33BD, 0xA7D2, 0x33BE, 0xA7D3, 0x33BF, + 0xA7D4, 0x3390, 0xA7D5, 0x3391, 0xA7D6, 0x3392, 0xA7D7, 0x3393, + 0xA7D8, 0x3394, 0xA7D9, 0x2126, 0xA7DA, 0x33C0, 0xA7DB, 0x33C1, + 0xA7DC, 0x338A, 0xA7DD, 0x338B, 0xA7DE, 0x338C, 0xA7DF, 0x33D6, + 0xA7E0, 0x33C5, 0xA7E1, 0x33AD, 0xA7E2, 0x33AE, 0xA7E3, 0x33AF, + 0xA7E4, 0x33DB, 0xA7E5, 0x33A9, 0xA7E6, 0x33AA, 0xA7E7, 0x33AB, + 0xA7E8, 0x33AC, 0xA7E9, 0x33DD, 0xA7EA, 0x33D0, 0xA7EB, 0x33D3, + 0xA7EC, 0x33C3, 0xA7ED, 0x33C9, 0xA7EE, 0x33DC, 0xA7EF, 0x33C6, + 0xA841, 0xCB6D, 0xA842, 0xCB6E, 0xA843, 0xCB6F, 0xA844, 0xCB70, + 0xA845, 0xCB71, 0xA846, 0xCB72, 0xA847, 0xCB73, 0xA848, 0xCB74, + 0xA849, 0xCB75, 0xA84A, 0xCB76, 0xA84B, 0xCB77, 0xA84C, 0xCB7A, + 0xA84D, 0xCB7B, 0xA84E, 0xCB7C, 0xA84F, 0xCB7D, 0xA850, 0xCB7E, + 0xA851, 0xCB7F, 0xA852, 0xCB80, 0xA853, 0xCB81, 0xA854, 0xCB82, + 0xA855, 0xCB83, 0xA856, 0xCB84, 0xA857, 0xCB85, 0xA858, 0xCB86, + 0xA859, 0xCB87, 0xA85A, 0xCB88, 0xA861, 0xCB89, 0xA862, 0xCB8A, + 0xA863, 0xCB8B, 0xA864, 0xCB8C, 0xA865, 0xCB8D, 0xA866, 0xCB8E, + 0xA867, 0xCB8F, 0xA868, 0xCB90, 0xA869, 0xCB91, 0xA86A, 0xCB92, + 0xA86B, 0xCB93, 0xA86C, 0xCB94, 0xA86D, 0xCB95, 0xA86E, 0xCB96, + 0xA86F, 0xCB97, 0xA870, 0xCB98, 0xA871, 0xCB99, 0xA872, 0xCB9A, + 0xA873, 0xCB9B, 0xA874, 0xCB9D, 0xA875, 0xCB9E, 0xA876, 0xCB9F, + 0xA877, 0xCBA0, 0xA878, 0xCBA1, 0xA879, 0xCBA2, 0xA87A, 0xCBA3, + 0xA881, 0xCBA4, 0xA882, 0xCBA5, 0xA883, 0xCBA6, 0xA884, 0xCBA7, + 0xA885, 0xCBA8, 0xA886, 0xCBA9, 0xA887, 0xCBAA, 0xA888, 0xCBAB, + 0xA889, 0xCBAC, 0xA88A, 0xCBAD, 0xA88B, 0xCBAE, 0xA88C, 0xCBAF, + 0xA88D, 0xCBB0, 0xA88E, 0xCBB1, 0xA88F, 0xCBB2, 0xA890, 0xCBB3, + 0xA891, 0xCBB4, 0xA892, 0xCBB5, 0xA893, 0xCBB6, 0xA894, 0xCBB7, + 0xA895, 0xCBB9, 0xA896, 0xCBBA, 0xA897, 0xCBBB, 0xA898, 0xCBBC, + 0xA899, 0xCBBD, 0xA89A, 0xCBBE, 0xA89B, 0xCBBF, 0xA89C, 0xCBC0, + 0xA89D, 0xCBC1, 0xA89E, 0xCBC2, 0xA89F, 0xCBC3, 0xA8A0, 0xCBC4, + 0xA8A1, 0x00C6, 0xA8A2, 0x00D0, 0xA8A3, 0x00AA, 0xA8A4, 0x0126, + 0xA8A6, 0x0132, 0xA8A8, 0x013F, 0xA8A9, 0x0141, 0xA8AA, 0x00D8, + 0xA8AB, 0x0152, 0xA8AC, 0x00BA, 0xA8AD, 0x00DE, 0xA8AE, 0x0166, + 0xA8AF, 0x014A, 0xA8B1, 0x3260, 0xA8B2, 0x3261, 0xA8B3, 0x3262, + 0xA8B4, 0x3263, 0xA8B5, 0x3264, 0xA8B6, 0x3265, 0xA8B7, 0x3266, + 0xA8B8, 0x3267, 0xA8B9, 0x3268, 0xA8BA, 0x3269, 0xA8BB, 0x326A, + 0xA8BC, 0x326B, 0xA8BD, 0x326C, 0xA8BE, 0x326D, 0xA8BF, 0x326E, + 0xA8C0, 0x326F, 0xA8C1, 0x3270, 0xA8C2, 0x3271, 0xA8C3, 0x3272, + 0xA8C4, 0x3273, 0xA8C5, 0x3274, 0xA8C6, 0x3275, 0xA8C7, 0x3276, + 0xA8C8, 0x3277, 0xA8C9, 0x3278, 0xA8CA, 0x3279, 0xA8CB, 0x327A, + 0xA8CC, 0x327B, 0xA8CD, 0x24D0, 0xA8CE, 0x24D1, 0xA8CF, 0x24D2, + 0xA8D0, 0x24D3, 0xA8D1, 0x24D4, 0xA8D2, 0x24D5, 0xA8D3, 0x24D6, + 0xA8D4, 0x24D7, 0xA8D5, 0x24D8, 0xA8D6, 0x24D9, 0xA8D7, 0x24DA, + 0xA8D8, 0x24DB, 0xA8D9, 0x24DC, 0xA8DA, 0x24DD, 0xA8DB, 0x24DE, + 0xA8DC, 0x24DF, 0xA8DD, 0x24E0, 0xA8DE, 0x24E1, 0xA8DF, 0x24E2, + 0xA8E0, 0x24E3, 0xA8E1, 0x24E4, 0xA8E2, 0x24E5, 0xA8E3, 0x24E6, + 0xA8E4, 0x24E7, 0xA8E5, 0x24E8, 0xA8E6, 0x24E9, 0xA8E7, 0x2460, + 0xA8E8, 0x2461, 0xA8E9, 0x2462, 0xA8EA, 0x2463, 0xA8EB, 0x2464, + 0xA8EC, 0x2465, 0xA8ED, 0x2466, 0xA8EE, 0x2467, 0xA8EF, 0x2468, + 0xA8F0, 0x2469, 0xA8F1, 0x246A, 0xA8F2, 0x246B, 0xA8F3, 0x246C, + 0xA8F4, 0x246D, 0xA8F5, 0x246E, 0xA8F6, 0x00BD, 0xA8F7, 0x2153, + 0xA8F8, 0x2154, 0xA8F9, 0x00BC, 0xA8FA, 0x00BE, 0xA8FB, 0x215B, + 0xA8FC, 0x215C, 0xA8FD, 0x215D, 0xA8FE, 0x215E, 0xA941, 0xCBC5, + 0xA942, 0xCBC6, 0xA943, 0xCBC7, 0xA944, 0xCBC8, 0xA945, 0xCBC9, + 0xA946, 0xCBCA, 0xA947, 0xCBCB, 0xA948, 0xCBCC, 0xA949, 0xCBCD, + 0xA94A, 0xCBCE, 0xA94B, 0xCBCF, 0xA94C, 0xCBD0, 0xA94D, 0xCBD1, + 0xA94E, 0xCBD2, 0xA94F, 0xCBD3, 0xA950, 0xCBD5, 0xA951, 0xCBD6, + 0xA952, 0xCBD7, 0xA953, 0xCBD8, 0xA954, 0xCBD9, 0xA955, 0xCBDA, + 0xA956, 0xCBDB, 0xA957, 0xCBDC, 0xA958, 0xCBDD, 0xA959, 0xCBDE, + 0xA95A, 0xCBDF, 0xA961, 0xCBE0, 0xA962, 0xCBE1, 0xA963, 0xCBE2, + 0xA964, 0xCBE3, 0xA965, 0xCBE5, 0xA966, 0xCBE6, 0xA967, 0xCBE8, + 0xA968, 0xCBEA, 0xA969, 0xCBEB, 0xA96A, 0xCBEC, 0xA96B, 0xCBED, + 0xA96C, 0xCBEE, 0xA96D, 0xCBEF, 0xA96E, 0xCBF0, 0xA96F, 0xCBF1, + 0xA970, 0xCBF2, 0xA971, 0xCBF3, 0xA972, 0xCBF4, 0xA973, 0xCBF5, + 0xA974, 0xCBF6, 0xA975, 0xCBF7, 0xA976, 0xCBF8, 0xA977, 0xCBF9, + 0xA978, 0xCBFA, 0xA979, 0xCBFB, 0xA97A, 0xCBFC, 0xA981, 0xCBFD, + 0xA982, 0xCBFE, 0xA983, 0xCBFF, 0xA984, 0xCC00, 0xA985, 0xCC01, + 0xA986, 0xCC02, 0xA987, 0xCC03, 0xA988, 0xCC04, 0xA989, 0xCC05, + 0xA98A, 0xCC06, 0xA98B, 0xCC07, 0xA98C, 0xCC08, 0xA98D, 0xCC09, + 0xA98E, 0xCC0A, 0xA98F, 0xCC0B, 0xA990, 0xCC0E, 0xA991, 0xCC0F, + 0xA992, 0xCC11, 0xA993, 0xCC12, 0xA994, 0xCC13, 0xA995, 0xCC15, + 0xA996, 0xCC16, 0xA997, 0xCC17, 0xA998, 0xCC18, 0xA999, 0xCC19, + 0xA99A, 0xCC1A, 0xA99B, 0xCC1B, 0xA99C, 0xCC1E, 0xA99D, 0xCC1F, + 0xA99E, 0xCC20, 0xA99F, 0xCC23, 0xA9A0, 0xCC24, 0xA9A1, 0x00E6, + 0xA9A2, 0x0111, 0xA9A3, 0x00F0, 0xA9A4, 0x0127, 0xA9A5, 0x0131, + 0xA9A6, 0x0133, 0xA9A7, 0x0138, 0xA9A8, 0x0140, 0xA9A9, 0x0142, + 0xA9AA, 0x00F8, 0xA9AB, 0x0153, 0xA9AC, 0x00DF, 0xA9AD, 0x00FE, + 0xA9AE, 0x0167, 0xA9AF, 0x014B, 0xA9B0, 0x0149, 0xA9B1, 0x3200, + 0xA9B2, 0x3201, 0xA9B3, 0x3202, 0xA9B4, 0x3203, 0xA9B5, 0x3204, + 0xA9B6, 0x3205, 0xA9B7, 0x3206, 0xA9B8, 0x3207, 0xA9B9, 0x3208, + 0xA9BA, 0x3209, 0xA9BB, 0x320A, 0xA9BC, 0x320B, 0xA9BD, 0x320C, + 0xA9BE, 0x320D, 0xA9BF, 0x320E, 0xA9C0, 0x320F, 0xA9C1, 0x3210, + 0xA9C2, 0x3211, 0xA9C3, 0x3212, 0xA9C4, 0x3213, 0xA9C5, 0x3214, + 0xA9C6, 0x3215, 0xA9C7, 0x3216, 0xA9C8, 0x3217, 0xA9C9, 0x3218, + 0xA9CA, 0x3219, 0xA9CB, 0x321A, 0xA9CC, 0x321B, 0xA9CD, 0x249C, + 0xA9CE, 0x249D, 0xA9CF, 0x249E, 0xA9D0, 0x249F, 0xA9D1, 0x24A0, + 0xA9D2, 0x24A1, 0xA9D3, 0x24A2, 0xA9D4, 0x24A3, 0xA9D5, 0x24A4, + 0xA9D6, 0x24A5, 0xA9D7, 0x24A6, 0xA9D8, 0x24A7, 0xA9D9, 0x24A8, + 0xA9DA, 0x24A9, 0xA9DB, 0x24AA, 0xA9DC, 0x24AB, 0xA9DD, 0x24AC, + 0xA9DE, 0x24AD, 0xA9DF, 0x24AE, 0xA9E0, 0x24AF, 0xA9E1, 0x24B0, + 0xA9E2, 0x24B1, 0xA9E3, 0x24B2, 0xA9E4, 0x24B3, 0xA9E5, 0x24B4, + 0xA9E6, 0x24B5, 0xA9E7, 0x2474, 0xA9E8, 0x2475, 0xA9E9, 0x2476, + 0xA9EA, 0x2477, 0xA9EB, 0x2478, 0xA9EC, 0x2479, 0xA9ED, 0x247A, + 0xA9EE, 0x247B, 0xA9EF, 0x247C, 0xA9F0, 0x247D, 0xA9F1, 0x247E, + 0xA9F2, 0x247F, 0xA9F3, 0x2480, 0xA9F4, 0x2481, 0xA9F5, 0x2482, + 0xA9F6, 0x00B9, 0xA9F7, 0x00B2, 0xA9F8, 0x00B3, 0xA9F9, 0x2074, + 0xA9FA, 0x207F, 0xA9FB, 0x2081, 0xA9FC, 0x2082, 0xA9FD, 0x2083, + 0xA9FE, 0x2084, 0xAA41, 0xCC25, 0xAA42, 0xCC26, 0xAA43, 0xCC2A, + 0xAA44, 0xCC2B, 0xAA45, 0xCC2D, 0xAA46, 0xCC2F, 0xAA47, 0xCC31, + 0xAA48, 0xCC32, 0xAA49, 0xCC33, 0xAA4A, 0xCC34, 0xAA4B, 0xCC35, + 0xAA4C, 0xCC36, 0xAA4D, 0xCC37, 0xAA4E, 0xCC3A, 0xAA4F, 0xCC3F, + 0xAA50, 0xCC40, 0xAA51, 0xCC41, 0xAA52, 0xCC42, 0xAA53, 0xCC43, + 0xAA54, 0xCC46, 0xAA55, 0xCC47, 0xAA56, 0xCC49, 0xAA57, 0xCC4A, + 0xAA58, 0xCC4B, 0xAA59, 0xCC4D, 0xAA5A, 0xCC4E, 0xAA61, 0xCC4F, + 0xAA62, 0xCC50, 0xAA63, 0xCC51, 0xAA64, 0xCC52, 0xAA65, 0xCC53, + 0xAA66, 0xCC56, 0xAA67, 0xCC5A, 0xAA68, 0xCC5B, 0xAA69, 0xCC5C, + 0xAA6A, 0xCC5D, 0xAA6B, 0xCC5E, 0xAA6C, 0xCC5F, 0xAA6D, 0xCC61, + 0xAA6E, 0xCC62, 0xAA6F, 0xCC63, 0xAA70, 0xCC65, 0xAA71, 0xCC67, + 0xAA72, 0xCC69, 0xAA73, 0xCC6A, 0xAA74, 0xCC6B, 0xAA75, 0xCC6C, + 0xAA76, 0xCC6D, 0xAA77, 0xCC6E, 0xAA78, 0xCC6F, 0xAA79, 0xCC71, + 0xAA7A, 0xCC72, 0xAA81, 0xCC73, 0xAA82, 0xCC74, 0xAA83, 0xCC76, + 0xAA84, 0xCC77, 0xAA85, 0xCC78, 0xAA86, 0xCC79, 0xAA87, 0xCC7A, + 0xAA88, 0xCC7B, 0xAA89, 0xCC7C, 0xAA8A, 0xCC7D, 0xAA8B, 0xCC7E, + 0xAA8C, 0xCC7F, 0xAA8D, 0xCC80, 0xAA8E, 0xCC81, 0xAA8F, 0xCC82, + 0xAA90, 0xCC83, 0xAA91, 0xCC84, 0xAA92, 0xCC85, 0xAA93, 0xCC86, + 0xAA94, 0xCC87, 0xAA95, 0xCC88, 0xAA96, 0xCC89, 0xAA97, 0xCC8A, + 0xAA98, 0xCC8B, 0xAA99, 0xCC8C, 0xAA9A, 0xCC8D, 0xAA9B, 0xCC8E, + 0xAA9C, 0xCC8F, 0xAA9D, 0xCC90, 0xAA9E, 0xCC91, 0xAA9F, 0xCC92, + 0xAAA0, 0xCC93, 0xAAA1, 0x3041, 0xAAA2, 0x3042, 0xAAA3, 0x3043, + 0xAAA4, 0x3044, 0xAAA5, 0x3045, 0xAAA6, 0x3046, 0xAAA7, 0x3047, + 0xAAA8, 0x3048, 0xAAA9, 0x3049, 0xAAAA, 0x304A, 0xAAAB, 0x304B, + 0xAAAC, 0x304C, 0xAAAD, 0x304D, 0xAAAE, 0x304E, 0xAAAF, 0x304F, + 0xAAB0, 0x3050, 0xAAB1, 0x3051, 0xAAB2, 0x3052, 0xAAB3, 0x3053, + 0xAAB4, 0x3054, 0xAAB5, 0x3055, 0xAAB6, 0x3056, 0xAAB7, 0x3057, + 0xAAB8, 0x3058, 0xAAB9, 0x3059, 0xAABA, 0x305A, 0xAABB, 0x305B, + 0xAABC, 0x305C, 0xAABD, 0x305D, 0xAABE, 0x305E, 0xAABF, 0x305F, + 0xAAC0, 0x3060, 0xAAC1, 0x3061, 0xAAC2, 0x3062, 0xAAC3, 0x3063, + 0xAAC4, 0x3064, 0xAAC5, 0x3065, 0xAAC6, 0x3066, 0xAAC7, 0x3067, + 0xAAC8, 0x3068, 0xAAC9, 0x3069, 0xAACA, 0x306A, 0xAACB, 0x306B, + 0xAACC, 0x306C, 0xAACD, 0x306D, 0xAACE, 0x306E, 0xAACF, 0x306F, + 0xAAD0, 0x3070, 0xAAD1, 0x3071, 0xAAD2, 0x3072, 0xAAD3, 0x3073, + 0xAAD4, 0x3074, 0xAAD5, 0x3075, 0xAAD6, 0x3076, 0xAAD7, 0x3077, + 0xAAD8, 0x3078, 0xAAD9, 0x3079, 0xAADA, 0x307A, 0xAADB, 0x307B, + 0xAADC, 0x307C, 0xAADD, 0x307D, 0xAADE, 0x307E, 0xAADF, 0x307F, + 0xAAE0, 0x3080, 0xAAE1, 0x3081, 0xAAE2, 0x3082, 0xAAE3, 0x3083, + 0xAAE4, 0x3084, 0xAAE5, 0x3085, 0xAAE6, 0x3086, 0xAAE7, 0x3087, + 0xAAE8, 0x3088, 0xAAE9, 0x3089, 0xAAEA, 0x308A, 0xAAEB, 0x308B, + 0xAAEC, 0x308C, 0xAAED, 0x308D, 0xAAEE, 0x308E, 0xAAEF, 0x308F, + 0xAAF0, 0x3090, 0xAAF1, 0x3091, 0xAAF2, 0x3092, 0xAAF3, 0x3093, + 0xAB41, 0xCC94, 0xAB42, 0xCC95, 0xAB43, 0xCC96, 0xAB44, 0xCC97, + 0xAB45, 0xCC9A, 0xAB46, 0xCC9B, 0xAB47, 0xCC9D, 0xAB48, 0xCC9E, + 0xAB49, 0xCC9F, 0xAB4A, 0xCCA1, 0xAB4B, 0xCCA2, 0xAB4C, 0xCCA3, + 0xAB4D, 0xCCA4, 0xAB4E, 0xCCA5, 0xAB4F, 0xCCA6, 0xAB50, 0xCCA7, + 0xAB51, 0xCCAA, 0xAB52, 0xCCAE, 0xAB53, 0xCCAF, 0xAB54, 0xCCB0, + 0xAB55, 0xCCB1, 0xAB56, 0xCCB2, 0xAB57, 0xCCB3, 0xAB58, 0xCCB6, + 0xAB59, 0xCCB7, 0xAB5A, 0xCCB9, 0xAB61, 0xCCBA, 0xAB62, 0xCCBB, + 0xAB63, 0xCCBD, 0xAB64, 0xCCBE, 0xAB65, 0xCCBF, 0xAB66, 0xCCC0, + 0xAB67, 0xCCC1, 0xAB68, 0xCCC2, 0xAB69, 0xCCC3, 0xAB6A, 0xCCC6, + 0xAB6B, 0xCCC8, 0xAB6C, 0xCCCA, 0xAB6D, 0xCCCB, 0xAB6E, 0xCCCC, + 0xAB6F, 0xCCCD, 0xAB70, 0xCCCE, 0xAB71, 0xCCCF, 0xAB72, 0xCCD1, + 0xAB73, 0xCCD2, 0xAB74, 0xCCD3, 0xAB75, 0xCCD5, 0xAB76, 0xCCD6, + 0xAB77, 0xCCD7, 0xAB78, 0xCCD8, 0xAB79, 0xCCD9, 0xAB7A, 0xCCDA, + 0xAB81, 0xCCDB, 0xAB82, 0xCCDC, 0xAB83, 0xCCDD, 0xAB84, 0xCCDE, + 0xAB85, 0xCCDF, 0xAB86, 0xCCE0, 0xAB87, 0xCCE1, 0xAB88, 0xCCE2, + 0xAB89, 0xCCE3, 0xAB8A, 0xCCE5, 0xAB8B, 0xCCE6, 0xAB8C, 0xCCE7, + 0xAB8D, 0xCCE8, 0xAB8E, 0xCCE9, 0xAB8F, 0xCCEA, 0xAB90, 0xCCEB, + 0xAB91, 0xCCED, 0xAB92, 0xCCEE, 0xAB93, 0xCCEF, 0xAB94, 0xCCF1, + 0xAB95, 0xCCF2, 0xAB96, 0xCCF3, 0xAB97, 0xCCF4, 0xAB98, 0xCCF5, + 0xAB99, 0xCCF6, 0xAB9A, 0xCCF7, 0xAB9B, 0xCCF8, 0xAB9C, 0xCCF9, + 0xAB9D, 0xCCFA, 0xAB9E, 0xCCFB, 0xAB9F, 0xCCFC, 0xABA0, 0xCCFD, + 0xABA1, 0x30A1, 0xABA2, 0x30A2, 0xABA3, 0x30A3, 0xABA4, 0x30A4, + 0xABA5, 0x30A5, 0xABA6, 0x30A6, 0xABA7, 0x30A7, 0xABA8, 0x30A8, + 0xABA9, 0x30A9, 0xABAA, 0x30AA, 0xABAB, 0x30AB, 0xABAC, 0x30AC, + 0xABAD, 0x30AD, 0xABAE, 0x30AE, 0xABAF, 0x30AF, 0xABB0, 0x30B0, + 0xABB1, 0x30B1, 0xABB2, 0x30B2, 0xABB3, 0x30B3, 0xABB4, 0x30B4, + 0xABB5, 0x30B5, 0xABB6, 0x30B6, 0xABB7, 0x30B7, 0xABB8, 0x30B8, + 0xABB9, 0x30B9, 0xABBA, 0x30BA, 0xABBB, 0x30BB, 0xABBC, 0x30BC, + 0xABBD, 0x30BD, 0xABBE, 0x30BE, 0xABBF, 0x30BF, 0xABC0, 0x30C0, + 0xABC1, 0x30C1, 0xABC2, 0x30C2, 0xABC3, 0x30C3, 0xABC4, 0x30C4, + 0xABC5, 0x30C5, 0xABC6, 0x30C6, 0xABC7, 0x30C7, 0xABC8, 0x30C8, + 0xABC9, 0x30C9, 0xABCA, 0x30CA, 0xABCB, 0x30CB, 0xABCC, 0x30CC, + 0xABCD, 0x30CD, 0xABCE, 0x30CE, 0xABCF, 0x30CF, 0xABD0, 0x30D0, + 0xABD1, 0x30D1, 0xABD2, 0x30D2, 0xABD3, 0x30D3, 0xABD4, 0x30D4, + 0xABD5, 0x30D5, 0xABD6, 0x30D6, 0xABD7, 0x30D7, 0xABD8, 0x30D8, + 0xABD9, 0x30D9, 0xABDA, 0x30DA, 0xABDB, 0x30DB, 0xABDC, 0x30DC, + 0xABDD, 0x30DD, 0xABDE, 0x30DE, 0xABDF, 0x30DF, 0xABE0, 0x30E0, + 0xABE1, 0x30E1, 0xABE2, 0x30E2, 0xABE3, 0x30E3, 0xABE4, 0x30E4, + 0xABE5, 0x30E5, 0xABE6, 0x30E6, 0xABE7, 0x30E7, 0xABE8, 0x30E8, + 0xABE9, 0x30E9, 0xABEA, 0x30EA, 0xABEB, 0x30EB, 0xABEC, 0x30EC, + 0xABED, 0x30ED, 0xABEE, 0x30EE, 0xABEF, 0x30EF, 0xABF0, 0x30F0, + 0xABF1, 0x30F1, 0xABF2, 0x30F2, 0xABF3, 0x30F3, 0xABF4, 0x30F4, + 0xABF5, 0x30F5, 0xABF6, 0x30F6, 0xAC41, 0xCCFE, 0xAC42, 0xCCFF, + 0xAC43, 0xCD00, 0xAC44, 0xCD02, 0xAC45, 0xCD03, 0xAC46, 0xCD04, + 0xAC47, 0xCD05, 0xAC48, 0xCD06, 0xAC49, 0xCD07, 0xAC4A, 0xCD0A, + 0xAC4B, 0xCD0B, 0xAC4C, 0xCD0D, 0xAC4D, 0xCD0E, 0xAC4E, 0xCD0F, + 0xAC4F, 0xCD11, 0xAC50, 0xCD12, 0xAC51, 0xCD13, 0xAC52, 0xCD14, + 0xAC53, 0xCD15, 0xAC54, 0xCD16, 0xAC55, 0xCD17, 0xAC56, 0xCD1A, + 0xAC57, 0xCD1C, 0xAC58, 0xCD1E, 0xAC59, 0xCD1F, 0xAC5A, 0xCD20, + 0xAC61, 0xCD21, 0xAC62, 0xCD22, 0xAC63, 0xCD23, 0xAC64, 0xCD25, + 0xAC65, 0xCD26, 0xAC66, 0xCD27, 0xAC67, 0xCD29, 0xAC68, 0xCD2A, + 0xAC69, 0xCD2B, 0xAC6A, 0xCD2D, 0xAC6B, 0xCD2E, 0xAC6C, 0xCD2F, + 0xAC6D, 0xCD30, 0xAC6E, 0xCD31, 0xAC6F, 0xCD32, 0xAC70, 0xCD33, + 0xAC71, 0xCD34, 0xAC72, 0xCD35, 0xAC73, 0xCD36, 0xAC74, 0xCD37, + 0xAC75, 0xCD38, 0xAC76, 0xCD3A, 0xAC77, 0xCD3B, 0xAC78, 0xCD3C, + 0xAC79, 0xCD3D, 0xAC7A, 0xCD3E, 0xAC81, 0xCD3F, 0xAC82, 0xCD40, + 0xAC83, 0xCD41, 0xAC84, 0xCD42, 0xAC85, 0xCD43, 0xAC86, 0xCD44, + 0xAC87, 0xCD45, 0xAC88, 0xCD46, 0xAC89, 0xCD47, 0xAC8A, 0xCD48, + 0xAC8B, 0xCD49, 0xAC8C, 0xCD4A, 0xAC8D, 0xCD4B, 0xAC8E, 0xCD4C, + 0xAC8F, 0xCD4D, 0xAC90, 0xCD4E, 0xAC91, 0xCD4F, 0xAC92, 0xCD50, + 0xAC93, 0xCD51, 0xAC94, 0xCD52, 0xAC95, 0xCD53, 0xAC96, 0xCD54, + 0xAC97, 0xCD55, 0xAC98, 0xCD56, 0xAC99, 0xCD57, 0xAC9A, 0xCD58, + 0xAC9B, 0xCD59, 0xAC9C, 0xCD5A, 0xAC9D, 0xCD5B, 0xAC9E, 0xCD5D, + 0xAC9F, 0xCD5E, 0xACA0, 0xCD5F, 0xACA1, 0x0410, 0xACA2, 0x0411, + 0xACA3, 0x0412, 0xACA4, 0x0413, 0xACA5, 0x0414, 0xACA6, 0x0415, + 0xACA7, 0x0401, 0xACA8, 0x0416, 0xACA9, 0x0417, 0xACAA, 0x0418, + 0xACAB, 0x0419, 0xACAC, 0x041A, 0xACAD, 0x041B, 0xACAE, 0x041C, + 0xACAF, 0x041D, 0xACB0, 0x041E, 0xACB1, 0x041F, 0xACB2, 0x0420, + 0xACB3, 0x0421, 0xACB4, 0x0422, 0xACB5, 0x0423, 0xACB6, 0x0424, + 0xACB7, 0x0425, 0xACB8, 0x0426, 0xACB9, 0x0427, 0xACBA, 0x0428, + 0xACBB, 0x0429, 0xACBC, 0x042A, 0xACBD, 0x042B, 0xACBE, 0x042C, + 0xACBF, 0x042D, 0xACC0, 0x042E, 0xACC1, 0x042F, 0xACD1, 0x0430, + 0xACD2, 0x0431, 0xACD3, 0x0432, 0xACD4, 0x0433, 0xACD5, 0x0434, + 0xACD6, 0x0435, 0xACD7, 0x0451, 0xACD8, 0x0436, 0xACD9, 0x0437, + 0xACDA, 0x0438, 0xACDB, 0x0439, 0xACDC, 0x043A, 0xACDD, 0x043B, + 0xACDE, 0x043C, 0xACDF, 0x043D, 0xACE0, 0x043E, 0xACE1, 0x043F, + 0xACE2, 0x0440, 0xACE3, 0x0441, 0xACE4, 0x0442, 0xACE5, 0x0443, + 0xACE6, 0x0444, 0xACE7, 0x0445, 0xACE8, 0x0446, 0xACE9, 0x0447, + 0xACEA, 0x0448, 0xACEB, 0x0449, 0xACEC, 0x044A, 0xACED, 0x044B, + 0xACEE, 0x044C, 0xACEF, 0x044D, 0xACF0, 0x044E, 0xACF1, 0x044F, + 0xAD41, 0xCD61, 0xAD42, 0xCD62, 0xAD43, 0xCD63, 0xAD44, 0xCD65, + 0xAD45, 0xCD66, 0xAD46, 0xCD67, 0xAD47, 0xCD68, 0xAD48, 0xCD69, + 0xAD49, 0xCD6A, 0xAD4A, 0xCD6B, 0xAD4B, 0xCD6E, 0xAD4C, 0xCD70, + 0xAD4D, 0xCD72, 0xAD4E, 0xCD73, 0xAD4F, 0xCD74, 0xAD50, 0xCD75, + 0xAD51, 0xCD76, 0xAD52, 0xCD77, 0xAD53, 0xCD79, 0xAD54, 0xCD7A, + 0xAD55, 0xCD7B, 0xAD56, 0xCD7C, 0xAD57, 0xCD7D, 0xAD58, 0xCD7E, + 0xAD59, 0xCD7F, 0xAD5A, 0xCD80, 0xAD61, 0xCD81, 0xAD62, 0xCD82, + 0xAD63, 0xCD83, 0xAD64, 0xCD84, 0xAD65, 0xCD85, 0xAD66, 0xCD86, + 0xAD67, 0xCD87, 0xAD68, 0xCD89, 0xAD69, 0xCD8A, 0xAD6A, 0xCD8B, + 0xAD6B, 0xCD8C, 0xAD6C, 0xCD8D, 0xAD6D, 0xCD8E, 0xAD6E, 0xCD8F, + 0xAD6F, 0xCD90, 0xAD70, 0xCD91, 0xAD71, 0xCD92, 0xAD72, 0xCD93, + 0xAD73, 0xCD96, 0xAD74, 0xCD97, 0xAD75, 0xCD99, 0xAD76, 0xCD9A, + 0xAD77, 0xCD9B, 0xAD78, 0xCD9D, 0xAD79, 0xCD9E, 0xAD7A, 0xCD9F, + 0xAD81, 0xCDA0, 0xAD82, 0xCDA1, 0xAD83, 0xCDA2, 0xAD84, 0xCDA3, + 0xAD85, 0xCDA6, 0xAD86, 0xCDA8, 0xAD87, 0xCDAA, 0xAD88, 0xCDAB, + 0xAD89, 0xCDAC, 0xAD8A, 0xCDAD, 0xAD8B, 0xCDAE, 0xAD8C, 0xCDAF, + 0xAD8D, 0xCDB1, 0xAD8E, 0xCDB2, 0xAD8F, 0xCDB3, 0xAD90, 0xCDB4, + 0xAD91, 0xCDB5, 0xAD92, 0xCDB6, 0xAD93, 0xCDB7, 0xAD94, 0xCDB8, + 0xAD95, 0xCDB9, 0xAD96, 0xCDBA, 0xAD97, 0xCDBB, 0xAD98, 0xCDBC, + 0xAD99, 0xCDBD, 0xAD9A, 0xCDBE, 0xAD9B, 0xCDBF, 0xAD9C, 0xCDC0, + 0xAD9D, 0xCDC1, 0xAD9E, 0xCDC2, 0xAD9F, 0xCDC3, 0xADA0, 0xCDC5, + 0xAE41, 0xCDC6, 0xAE42, 0xCDC7, 0xAE43, 0xCDC8, 0xAE44, 0xCDC9, + 0xAE45, 0xCDCA, 0xAE46, 0xCDCB, 0xAE47, 0xCDCD, 0xAE48, 0xCDCE, + 0xAE49, 0xCDCF, 0xAE4A, 0xCDD1, 0xAE4B, 0xCDD2, 0xAE4C, 0xCDD3, + 0xAE4D, 0xCDD4, 0xAE4E, 0xCDD5, 0xAE4F, 0xCDD6, 0xAE50, 0xCDD7, + 0xAE51, 0xCDD8, 0xAE52, 0xCDD9, 0xAE53, 0xCDDA, 0xAE54, 0xCDDB, + 0xAE55, 0xCDDC, 0xAE56, 0xCDDD, 0xAE57, 0xCDDE, 0xAE58, 0xCDDF, + 0xAE59, 0xCDE0, 0xAE5A, 0xCDE1, 0xAE61, 0xCDE2, 0xAE62, 0xCDE3, + 0xAE63, 0xCDE4, 0xAE64, 0xCDE5, 0xAE65, 0xCDE6, 0xAE66, 0xCDE7, + 0xAE67, 0xCDE9, 0xAE68, 0xCDEA, 0xAE69, 0xCDEB, 0xAE6A, 0xCDED, + 0xAE6B, 0xCDEE, 0xAE6C, 0xCDEF, 0xAE6D, 0xCDF1, 0xAE6E, 0xCDF2, + 0xAE6F, 0xCDF3, 0xAE70, 0xCDF4, 0xAE71, 0xCDF5, 0xAE72, 0xCDF6, + 0xAE73, 0xCDF7, 0xAE74, 0xCDFA, 0xAE75, 0xCDFC, 0xAE76, 0xCDFE, + 0xAE77, 0xCDFF, 0xAE78, 0xCE00, 0xAE79, 0xCE01, 0xAE7A, 0xCE02, + 0xAE81, 0xCE03, 0xAE82, 0xCE05, 0xAE83, 0xCE06, 0xAE84, 0xCE07, + 0xAE85, 0xCE09, 0xAE86, 0xCE0A, 0xAE87, 0xCE0B, 0xAE88, 0xCE0D, + 0xAE89, 0xCE0E, 0xAE8A, 0xCE0F, 0xAE8B, 0xCE10, 0xAE8C, 0xCE11, + 0xAE8D, 0xCE12, 0xAE8E, 0xCE13, 0xAE8F, 0xCE15, 0xAE90, 0xCE16, + 0xAE91, 0xCE17, 0xAE92, 0xCE18, 0xAE93, 0xCE1A, 0xAE94, 0xCE1B, + 0xAE95, 0xCE1C, 0xAE96, 0xCE1D, 0xAE97, 0xCE1E, 0xAE98, 0xCE1F, + 0xAE99, 0xCE22, 0xAE9A, 0xCE23, 0xAE9B, 0xCE25, 0xAE9C, 0xCE26, + 0xAE9D, 0xCE27, 0xAE9E, 0xCE29, 0xAE9F, 0xCE2A, 0xAEA0, 0xCE2B, + 0xAF41, 0xCE2C, 0xAF42, 0xCE2D, 0xAF43, 0xCE2E, 0xAF44, 0xCE2F, + 0xAF45, 0xCE32, 0xAF46, 0xCE34, 0xAF47, 0xCE36, 0xAF48, 0xCE37, + 0xAF49, 0xCE38, 0xAF4A, 0xCE39, 0xAF4B, 0xCE3A, 0xAF4C, 0xCE3B, + 0xAF4D, 0xCE3C, 0xAF4E, 0xCE3D, 0xAF4F, 0xCE3E, 0xAF50, 0xCE3F, + 0xAF51, 0xCE40, 0xAF52, 0xCE41, 0xAF53, 0xCE42, 0xAF54, 0xCE43, + 0xAF55, 0xCE44, 0xAF56, 0xCE45, 0xAF57, 0xCE46, 0xAF58, 0xCE47, + 0xAF59, 0xCE48, 0xAF5A, 0xCE49, 0xAF61, 0xCE4A, 0xAF62, 0xCE4B, + 0xAF63, 0xCE4C, 0xAF64, 0xCE4D, 0xAF65, 0xCE4E, 0xAF66, 0xCE4F, + 0xAF67, 0xCE50, 0xAF68, 0xCE51, 0xAF69, 0xCE52, 0xAF6A, 0xCE53, + 0xAF6B, 0xCE54, 0xAF6C, 0xCE55, 0xAF6D, 0xCE56, 0xAF6E, 0xCE57, + 0xAF6F, 0xCE5A, 0xAF70, 0xCE5B, 0xAF71, 0xCE5D, 0xAF72, 0xCE5E, + 0xAF73, 0xCE62, 0xAF74, 0xCE63, 0xAF75, 0xCE64, 0xAF76, 0xCE65, + 0xAF77, 0xCE66, 0xAF78, 0xCE67, 0xAF79, 0xCE6A, 0xAF7A, 0xCE6C, + 0xAF81, 0xCE6E, 0xAF82, 0xCE6F, 0xAF83, 0xCE70, 0xAF84, 0xCE71, + 0xAF85, 0xCE72, 0xAF86, 0xCE73, 0xAF87, 0xCE76, 0xAF88, 0xCE77, + 0xAF89, 0xCE79, 0xAF8A, 0xCE7A, 0xAF8B, 0xCE7B, 0xAF8C, 0xCE7D, + 0xAF8D, 0xCE7E, 0xAF8E, 0xCE7F, 0xAF8F, 0xCE80, 0xAF90, 0xCE81, + 0xAF91, 0xCE82, 0xAF92, 0xCE83, 0xAF93, 0xCE86, 0xAF94, 0xCE88, + 0xAF95, 0xCE8A, 0xAF96, 0xCE8B, 0xAF97, 0xCE8C, 0xAF98, 0xCE8D, + 0xAF99, 0xCE8E, 0xAF9A, 0xCE8F, 0xAF9B, 0xCE92, 0xAF9C, 0xCE93, + 0xAF9D, 0xCE95, 0xAF9E, 0xCE96, 0xAF9F, 0xCE97, 0xAFA0, 0xCE99, + 0xB041, 0xCE9A, 0xB042, 0xCE9B, 0xB043, 0xCE9C, 0xB044, 0xCE9D, + 0xB045, 0xCE9E, 0xB046, 0xCE9F, 0xB047, 0xCEA2, 0xB048, 0xCEA6, + 0xB049, 0xCEA7, 0xB04A, 0xCEA8, 0xB04B, 0xCEA9, 0xB04C, 0xCEAA, + 0xB04D, 0xCEAB, 0xB04E, 0xCEAE, 0xB04F, 0xCEAF, 0xB050, 0xCEB0, + 0xB051, 0xCEB1, 0xB052, 0xCEB2, 0xB053, 0xCEB3, 0xB054, 0xCEB4, + 0xB055, 0xCEB5, 0xB056, 0xCEB6, 0xB057, 0xCEB7, 0xB058, 0xCEB8, + 0xB059, 0xCEB9, 0xB05A, 0xCEBA, 0xB061, 0xCEBB, 0xB062, 0xCEBC, + 0xB063, 0xCEBD, 0xB064, 0xCEBE, 0xB065, 0xCEBF, 0xB066, 0xCEC0, + 0xB067, 0xCEC2, 0xB068, 0xCEC3, 0xB069, 0xCEC4, 0xB06A, 0xCEC5, + 0xB06B, 0xCEC6, 0xB06C, 0xCEC7, 0xB06D, 0xCEC8, 0xB06E, 0xCEC9, + 0xB06F, 0xCECA, 0xB070, 0xCECB, 0xB071, 0xCECC, 0xB072, 0xCECD, + 0xB073, 0xCECE, 0xB074, 0xCECF, 0xB075, 0xCED0, 0xB076, 0xCED1, + 0xB077, 0xCED2, 0xB078, 0xCED3, 0xB079, 0xCED4, 0xB07A, 0xCED5, + 0xB081, 0xCED6, 0xB082, 0xCED7, 0xB083, 0xCED8, 0xB084, 0xCED9, + 0xB085, 0xCEDA, 0xB086, 0xCEDB, 0xB087, 0xCEDC, 0xB088, 0xCEDD, + 0xB089, 0xCEDE, 0xB08A, 0xCEDF, 0xB08B, 0xCEE0, 0xB08C, 0xCEE1, + 0xB08D, 0xCEE2, 0xB08E, 0xCEE3, 0xB08F, 0xCEE6, 0xB090, 0xCEE7, + 0xB091, 0xCEE9, 0xB092, 0xCEEA, 0xB093, 0xCEED, 0xB094, 0xCEEE, + 0xB095, 0xCEEF, 0xB096, 0xCEF0, 0xB097, 0xCEF1, 0xB098, 0xCEF2, + 0xB099, 0xCEF3, 0xB09A, 0xCEF6, 0xB09B, 0xCEFA, 0xB09C, 0xCEFB, + 0xB09D, 0xCEFC, 0xB09E, 0xCEFD, 0xB09F, 0xCEFE, 0xB0A0, 0xCEFF, + 0xB0A1, 0xAC00, 0xB0A2, 0xAC01, 0xB0A3, 0xAC04, 0xB0A4, 0xAC07, + 0xB0A5, 0xAC08, 0xB0A6, 0xAC09, 0xB0A7, 0xAC0A, 0xB0A8, 0xAC10, + 0xB0A9, 0xAC11, 0xB0AA, 0xAC12, 0xB0AB, 0xAC13, 0xB0AC, 0xAC14, + 0xB0AD, 0xAC15, 0xB0AE, 0xAC16, 0xB0AF, 0xAC17, 0xB0B0, 0xAC19, + 0xB0B1, 0xAC1A, 0xB0B2, 0xAC1B, 0xB0B3, 0xAC1C, 0xB0B4, 0xAC1D, + 0xB0B5, 0xAC20, 0xB0B6, 0xAC24, 0xB0B7, 0xAC2C, 0xB0B8, 0xAC2D, + 0xB0B9, 0xAC2F, 0xB0BA, 0xAC30, 0xB0BB, 0xAC31, 0xB0BC, 0xAC38, + 0xB0BD, 0xAC39, 0xB0BE, 0xAC3C, 0xB0BF, 0xAC40, 0xB0C0, 0xAC4B, + 0xB0C1, 0xAC4D, 0xB0C2, 0xAC54, 0xB0C3, 0xAC58, 0xB0C4, 0xAC5C, + 0xB0C5, 0xAC70, 0xB0C6, 0xAC71, 0xB0C7, 0xAC74, 0xB0C8, 0xAC77, + 0xB0C9, 0xAC78, 0xB0CA, 0xAC7A, 0xB0CB, 0xAC80, 0xB0CC, 0xAC81, + 0xB0CD, 0xAC83, 0xB0CE, 0xAC84, 0xB0CF, 0xAC85, 0xB0D0, 0xAC86, + 0xB0D1, 0xAC89, 0xB0D2, 0xAC8A, 0xB0D3, 0xAC8B, 0xB0D4, 0xAC8C, + 0xB0D5, 0xAC90, 0xB0D6, 0xAC94, 0xB0D7, 0xAC9C, 0xB0D8, 0xAC9D, + 0xB0D9, 0xAC9F, 0xB0DA, 0xACA0, 0xB0DB, 0xACA1, 0xB0DC, 0xACA8, + 0xB0DD, 0xACA9, 0xB0DE, 0xACAA, 0xB0DF, 0xACAC, 0xB0E0, 0xACAF, + 0xB0E1, 0xACB0, 0xB0E2, 0xACB8, 0xB0E3, 0xACB9, 0xB0E4, 0xACBB, + 0xB0E5, 0xACBC, 0xB0E6, 0xACBD, 0xB0E7, 0xACC1, 0xB0E8, 0xACC4, + 0xB0E9, 0xACC8, 0xB0EA, 0xACCC, 0xB0EB, 0xACD5, 0xB0EC, 0xACD7, + 0xB0ED, 0xACE0, 0xB0EE, 0xACE1, 0xB0EF, 0xACE4, 0xB0F0, 0xACE7, + 0xB0F1, 0xACE8, 0xB0F2, 0xACEA, 0xB0F3, 0xACEC, 0xB0F4, 0xACEF, + 0xB0F5, 0xACF0, 0xB0F6, 0xACF1, 0xB0F7, 0xACF3, 0xB0F8, 0xACF5, + 0xB0F9, 0xACF6, 0xB0FA, 0xACFC, 0xB0FB, 0xACFD, 0xB0FC, 0xAD00, + 0xB0FD, 0xAD04, 0xB0FE, 0xAD06, 0xB141, 0xCF02, 0xB142, 0xCF03, + 0xB143, 0xCF05, 0xB144, 0xCF06, 0xB145, 0xCF07, 0xB146, 0xCF09, + 0xB147, 0xCF0A, 0xB148, 0xCF0B, 0xB149, 0xCF0C, 0xB14A, 0xCF0D, + 0xB14B, 0xCF0E, 0xB14C, 0xCF0F, 0xB14D, 0xCF12, 0xB14E, 0xCF14, + 0xB14F, 0xCF16, 0xB150, 0xCF17, 0xB151, 0xCF18, 0xB152, 0xCF19, + 0xB153, 0xCF1A, 0xB154, 0xCF1B, 0xB155, 0xCF1D, 0xB156, 0xCF1E, + 0xB157, 0xCF1F, 0xB158, 0xCF21, 0xB159, 0xCF22, 0xB15A, 0xCF23, + 0xB161, 0xCF25, 0xB162, 0xCF26, 0xB163, 0xCF27, 0xB164, 0xCF28, + 0xB165, 0xCF29, 0xB166, 0xCF2A, 0xB167, 0xCF2B, 0xB168, 0xCF2E, + 0xB169, 0xCF32, 0xB16A, 0xCF33, 0xB16B, 0xCF34, 0xB16C, 0xCF35, + 0xB16D, 0xCF36, 0xB16E, 0xCF37, 0xB16F, 0xCF39, 0xB170, 0xCF3A, + 0xB171, 0xCF3B, 0xB172, 0xCF3C, 0xB173, 0xCF3D, 0xB174, 0xCF3E, + 0xB175, 0xCF3F, 0xB176, 0xCF40, 0xB177, 0xCF41, 0xB178, 0xCF42, + 0xB179, 0xCF43, 0xB17A, 0xCF44, 0xB181, 0xCF45, 0xB182, 0xCF46, + 0xB183, 0xCF47, 0xB184, 0xCF48, 0xB185, 0xCF49, 0xB186, 0xCF4A, + 0xB187, 0xCF4B, 0xB188, 0xCF4C, 0xB189, 0xCF4D, 0xB18A, 0xCF4E, + 0xB18B, 0xCF4F, 0xB18C, 0xCF50, 0xB18D, 0xCF51, 0xB18E, 0xCF52, + 0xB18F, 0xCF53, 0xB190, 0xCF56, 0xB191, 0xCF57, 0xB192, 0xCF59, + 0xB193, 0xCF5A, 0xB194, 0xCF5B, 0xB195, 0xCF5D, 0xB196, 0xCF5E, + 0xB197, 0xCF5F, 0xB198, 0xCF60, 0xB199, 0xCF61, 0xB19A, 0xCF62, + 0xB19B, 0xCF63, 0xB19C, 0xCF66, 0xB19D, 0xCF68, 0xB19E, 0xCF6A, + 0xB19F, 0xCF6B, 0xB1A0, 0xCF6C, 0xB1A1, 0xAD0C, 0xB1A2, 0xAD0D, + 0xB1A3, 0xAD0F, 0xB1A4, 0xAD11, 0xB1A5, 0xAD18, 0xB1A6, 0xAD1C, + 0xB1A7, 0xAD20, 0xB1A8, 0xAD29, 0xB1A9, 0xAD2C, 0xB1AA, 0xAD2D, + 0xB1AB, 0xAD34, 0xB1AC, 0xAD35, 0xB1AD, 0xAD38, 0xB1AE, 0xAD3C, + 0xB1AF, 0xAD44, 0xB1B0, 0xAD45, 0xB1B1, 0xAD47, 0xB1B2, 0xAD49, + 0xB1B3, 0xAD50, 0xB1B4, 0xAD54, 0xB1B5, 0xAD58, 0xB1B6, 0xAD61, + 0xB1B7, 0xAD63, 0xB1B8, 0xAD6C, 0xB1B9, 0xAD6D, 0xB1BA, 0xAD70, + 0xB1BB, 0xAD73, 0xB1BC, 0xAD74, 0xB1BD, 0xAD75, 0xB1BE, 0xAD76, + 0xB1BF, 0xAD7B, 0xB1C0, 0xAD7C, 0xB1C1, 0xAD7D, 0xB1C2, 0xAD7F, + 0xB1C3, 0xAD81, 0xB1C4, 0xAD82, 0xB1C5, 0xAD88, 0xB1C6, 0xAD89, + 0xB1C7, 0xAD8C, 0xB1C8, 0xAD90, 0xB1C9, 0xAD9C, 0xB1CA, 0xAD9D, + 0xB1CB, 0xADA4, 0xB1CC, 0xADB7, 0xB1CD, 0xADC0, 0xB1CE, 0xADC1, + 0xB1CF, 0xADC4, 0xB1D0, 0xADC8, 0xB1D1, 0xADD0, 0xB1D2, 0xADD1, + 0xB1D3, 0xADD3, 0xB1D4, 0xADDC, 0xB1D5, 0xADE0, 0xB1D6, 0xADE4, + 0xB1D7, 0xADF8, 0xB1D8, 0xADF9, 0xB1D9, 0xADFC, 0xB1DA, 0xADFF, + 0xB1DB, 0xAE00, 0xB1DC, 0xAE01, 0xB1DD, 0xAE08, 0xB1DE, 0xAE09, + 0xB1DF, 0xAE0B, 0xB1E0, 0xAE0D, 0xB1E1, 0xAE14, 0xB1E2, 0xAE30, + 0xB1E3, 0xAE31, 0xB1E4, 0xAE34, 0xB1E5, 0xAE37, 0xB1E6, 0xAE38, + 0xB1E7, 0xAE3A, 0xB1E8, 0xAE40, 0xB1E9, 0xAE41, 0xB1EA, 0xAE43, + 0xB1EB, 0xAE45, 0xB1EC, 0xAE46, 0xB1ED, 0xAE4A, 0xB1EE, 0xAE4C, + 0xB1EF, 0xAE4D, 0xB1F0, 0xAE4E, 0xB1F1, 0xAE50, 0xB1F2, 0xAE54, + 0xB1F3, 0xAE56, 0xB1F4, 0xAE5C, 0xB1F5, 0xAE5D, 0xB1F6, 0xAE5F, + 0xB1F7, 0xAE60, 0xB1F8, 0xAE61, 0xB1F9, 0xAE65, 0xB1FA, 0xAE68, + 0xB1FB, 0xAE69, 0xB1FC, 0xAE6C, 0xB1FD, 0xAE70, 0xB1FE, 0xAE78, + 0xB241, 0xCF6D, 0xB242, 0xCF6E, 0xB243, 0xCF6F, 0xB244, 0xCF72, + 0xB245, 0xCF73, 0xB246, 0xCF75, 0xB247, 0xCF76, 0xB248, 0xCF77, + 0xB249, 0xCF79, 0xB24A, 0xCF7A, 0xB24B, 0xCF7B, 0xB24C, 0xCF7C, + 0xB24D, 0xCF7D, 0xB24E, 0xCF7E, 0xB24F, 0xCF7F, 0xB250, 0xCF81, + 0xB251, 0xCF82, 0xB252, 0xCF83, 0xB253, 0xCF84, 0xB254, 0xCF86, + 0xB255, 0xCF87, 0xB256, 0xCF88, 0xB257, 0xCF89, 0xB258, 0xCF8A, + 0xB259, 0xCF8B, 0xB25A, 0xCF8D, 0xB261, 0xCF8E, 0xB262, 0xCF8F, + 0xB263, 0xCF90, 0xB264, 0xCF91, 0xB265, 0xCF92, 0xB266, 0xCF93, + 0xB267, 0xCF94, 0xB268, 0xCF95, 0xB269, 0xCF96, 0xB26A, 0xCF97, + 0xB26B, 0xCF98, 0xB26C, 0xCF99, 0xB26D, 0xCF9A, 0xB26E, 0xCF9B, + 0xB26F, 0xCF9C, 0xB270, 0xCF9D, 0xB271, 0xCF9E, 0xB272, 0xCF9F, + 0xB273, 0xCFA0, 0xB274, 0xCFA2, 0xB275, 0xCFA3, 0xB276, 0xCFA4, + 0xB277, 0xCFA5, 0xB278, 0xCFA6, 0xB279, 0xCFA7, 0xB27A, 0xCFA9, + 0xB281, 0xCFAA, 0xB282, 0xCFAB, 0xB283, 0xCFAC, 0xB284, 0xCFAD, + 0xB285, 0xCFAE, 0xB286, 0xCFAF, 0xB287, 0xCFB1, 0xB288, 0xCFB2, + 0xB289, 0xCFB3, 0xB28A, 0xCFB4, 0xB28B, 0xCFB5, 0xB28C, 0xCFB6, + 0xB28D, 0xCFB7, 0xB28E, 0xCFB8, 0xB28F, 0xCFB9, 0xB290, 0xCFBA, + 0xB291, 0xCFBB, 0xB292, 0xCFBC, 0xB293, 0xCFBD, 0xB294, 0xCFBE, + 0xB295, 0xCFBF, 0xB296, 0xCFC0, 0xB297, 0xCFC1, 0xB298, 0xCFC2, + 0xB299, 0xCFC3, 0xB29A, 0xCFC5, 0xB29B, 0xCFC6, 0xB29C, 0xCFC7, + 0xB29D, 0xCFC8, 0xB29E, 0xCFC9, 0xB29F, 0xCFCA, 0xB2A0, 0xCFCB, + 0xB2A1, 0xAE79, 0xB2A2, 0xAE7B, 0xB2A3, 0xAE7C, 0xB2A4, 0xAE7D, + 0xB2A5, 0xAE84, 0xB2A6, 0xAE85, 0xB2A7, 0xAE8C, 0xB2A8, 0xAEBC, + 0xB2A9, 0xAEBD, 0xB2AA, 0xAEBE, 0xB2AB, 0xAEC0, 0xB2AC, 0xAEC4, + 0xB2AD, 0xAECC, 0xB2AE, 0xAECD, 0xB2AF, 0xAECF, 0xB2B0, 0xAED0, + 0xB2B1, 0xAED1, 0xB2B2, 0xAED8, 0xB2B3, 0xAED9, 0xB2B4, 0xAEDC, + 0xB2B5, 0xAEE8, 0xB2B6, 0xAEEB, 0xB2B7, 0xAEED, 0xB2B8, 0xAEF4, + 0xB2B9, 0xAEF8, 0xB2BA, 0xAEFC, 0xB2BB, 0xAF07, 0xB2BC, 0xAF08, + 0xB2BD, 0xAF0D, 0xB2BE, 0xAF10, 0xB2BF, 0xAF2C, 0xB2C0, 0xAF2D, + 0xB2C1, 0xAF30, 0xB2C2, 0xAF32, 0xB2C3, 0xAF34, 0xB2C4, 0xAF3C, + 0xB2C5, 0xAF3D, 0xB2C6, 0xAF3F, 0xB2C7, 0xAF41, 0xB2C8, 0xAF42, + 0xB2C9, 0xAF43, 0xB2CA, 0xAF48, 0xB2CB, 0xAF49, 0xB2CC, 0xAF50, + 0xB2CD, 0xAF5C, 0xB2CE, 0xAF5D, 0xB2CF, 0xAF64, 0xB2D0, 0xAF65, + 0xB2D1, 0xAF79, 0xB2D2, 0xAF80, 0xB2D3, 0xAF84, 0xB2D4, 0xAF88, + 0xB2D5, 0xAF90, 0xB2D6, 0xAF91, 0xB2D7, 0xAF95, 0xB2D8, 0xAF9C, + 0xB2D9, 0xAFB8, 0xB2DA, 0xAFB9, 0xB2DB, 0xAFBC, 0xB2DC, 0xAFC0, + 0xB2DD, 0xAFC7, 0xB2DE, 0xAFC8, 0xB2DF, 0xAFC9, 0xB2E0, 0xAFCB, + 0xB2E1, 0xAFCD, 0xB2E2, 0xAFCE, 0xB2E3, 0xAFD4, 0xB2E4, 0xAFDC, + 0xB2E5, 0xAFE8, 0xB2E6, 0xAFE9, 0xB2E7, 0xAFF0, 0xB2E8, 0xAFF1, + 0xB2E9, 0xAFF4, 0xB2EA, 0xAFF8, 0xB2EB, 0xB000, 0xB2EC, 0xB001, + 0xB2ED, 0xB004, 0xB2EE, 0xB00C, 0xB2EF, 0xB010, 0xB2F0, 0xB014, + 0xB2F1, 0xB01C, 0xB2F2, 0xB01D, 0xB2F3, 0xB028, 0xB2F4, 0xB044, + 0xB2F5, 0xB045, 0xB2F6, 0xB048, 0xB2F7, 0xB04A, 0xB2F8, 0xB04C, + 0xB2F9, 0xB04E, 0xB2FA, 0xB053, 0xB2FB, 0xB054, 0xB2FC, 0xB055, + 0xB2FD, 0xB057, 0xB2FE, 0xB059, 0xB341, 0xCFCC, 0xB342, 0xCFCD, + 0xB343, 0xCFCE, 0xB344, 0xCFCF, 0xB345, 0xCFD0, 0xB346, 0xCFD1, + 0xB347, 0xCFD2, 0xB348, 0xCFD3, 0xB349, 0xCFD4, 0xB34A, 0xCFD5, + 0xB34B, 0xCFD6, 0xB34C, 0xCFD7, 0xB34D, 0xCFD8, 0xB34E, 0xCFD9, + 0xB34F, 0xCFDA, 0xB350, 0xCFDB, 0xB351, 0xCFDC, 0xB352, 0xCFDD, + 0xB353, 0xCFDE, 0xB354, 0xCFDF, 0xB355, 0xCFE2, 0xB356, 0xCFE3, + 0xB357, 0xCFE5, 0xB358, 0xCFE6, 0xB359, 0xCFE7, 0xB35A, 0xCFE9, + 0xB361, 0xCFEA, 0xB362, 0xCFEB, 0xB363, 0xCFEC, 0xB364, 0xCFED, + 0xB365, 0xCFEE, 0xB366, 0xCFEF, 0xB367, 0xCFF2, 0xB368, 0xCFF4, + 0xB369, 0xCFF6, 0xB36A, 0xCFF7, 0xB36B, 0xCFF8, 0xB36C, 0xCFF9, + 0xB36D, 0xCFFA, 0xB36E, 0xCFFB, 0xB36F, 0xCFFD, 0xB370, 0xCFFE, + 0xB371, 0xCFFF, 0xB372, 0xD001, 0xB373, 0xD002, 0xB374, 0xD003, + 0xB375, 0xD005, 0xB376, 0xD006, 0xB377, 0xD007, 0xB378, 0xD008, + 0xB379, 0xD009, 0xB37A, 0xD00A, 0xB381, 0xD00B, 0xB382, 0xD00C, + 0xB383, 0xD00D, 0xB384, 0xD00E, 0xB385, 0xD00F, 0xB386, 0xD010, + 0xB387, 0xD012, 0xB388, 0xD013, 0xB389, 0xD014, 0xB38A, 0xD015, + 0xB38B, 0xD016, 0xB38C, 0xD017, 0xB38D, 0xD019, 0xB38E, 0xD01A, + 0xB38F, 0xD01B, 0xB390, 0xD01C, 0xB391, 0xD01D, 0xB392, 0xD01E, + 0xB393, 0xD01F, 0xB394, 0xD020, 0xB395, 0xD021, 0xB396, 0xD022, + 0xB397, 0xD023, 0xB398, 0xD024, 0xB399, 0xD025, 0xB39A, 0xD026, + 0xB39B, 0xD027, 0xB39C, 0xD028, 0xB39D, 0xD029, 0xB39E, 0xD02A, + 0xB39F, 0xD02B, 0xB3A0, 0xD02C, 0xB3A1, 0xB05D, 0xB3A2, 0xB07C, + 0xB3A3, 0xB07D, 0xB3A4, 0xB080, 0xB3A5, 0xB084, 0xB3A6, 0xB08C, + 0xB3A7, 0xB08D, 0xB3A8, 0xB08F, 0xB3A9, 0xB091, 0xB3AA, 0xB098, + 0xB3AB, 0xB099, 0xB3AC, 0xB09A, 0xB3AD, 0xB09C, 0xB3AE, 0xB09F, + 0xB3AF, 0xB0A0, 0xB3B0, 0xB0A1, 0xB3B1, 0xB0A2, 0xB3B2, 0xB0A8, + 0xB3B3, 0xB0A9, 0xB3B4, 0xB0AB, 0xB3B5, 0xB0AC, 0xB3B6, 0xB0AD, + 0xB3B7, 0xB0AE, 0xB3B8, 0xB0AF, 0xB3B9, 0xB0B1, 0xB3BA, 0xB0B3, + 0xB3BB, 0xB0B4, 0xB3BC, 0xB0B5, 0xB3BD, 0xB0B8, 0xB3BE, 0xB0BC, + 0xB3BF, 0xB0C4, 0xB3C0, 0xB0C5, 0xB3C1, 0xB0C7, 0xB3C2, 0xB0C8, + 0xB3C3, 0xB0C9, 0xB3C4, 0xB0D0, 0xB3C5, 0xB0D1, 0xB3C6, 0xB0D4, + 0xB3C7, 0xB0D8, 0xB3C8, 0xB0E0, 0xB3C9, 0xB0E5, 0xB3CA, 0xB108, + 0xB3CB, 0xB109, 0xB3CC, 0xB10B, 0xB3CD, 0xB10C, 0xB3CE, 0xB110, + 0xB3CF, 0xB112, 0xB3D0, 0xB113, 0xB3D1, 0xB118, 0xB3D2, 0xB119, + 0xB3D3, 0xB11B, 0xB3D4, 0xB11C, 0xB3D5, 0xB11D, 0xB3D6, 0xB123, + 0xB3D7, 0xB124, 0xB3D8, 0xB125, 0xB3D9, 0xB128, 0xB3DA, 0xB12C, + 0xB3DB, 0xB134, 0xB3DC, 0xB135, 0xB3DD, 0xB137, 0xB3DE, 0xB138, + 0xB3DF, 0xB139, 0xB3E0, 0xB140, 0xB3E1, 0xB141, 0xB3E2, 0xB144, + 0xB3E3, 0xB148, 0xB3E4, 0xB150, 0xB3E5, 0xB151, 0xB3E6, 0xB154, + 0xB3E7, 0xB155, 0xB3E8, 0xB158, 0xB3E9, 0xB15C, 0xB3EA, 0xB160, + 0xB3EB, 0xB178, 0xB3EC, 0xB179, 0xB3ED, 0xB17C, 0xB3EE, 0xB180, + 0xB3EF, 0xB182, 0xB3F0, 0xB188, 0xB3F1, 0xB189, 0xB3F2, 0xB18B, + 0xB3F3, 0xB18D, 0xB3F4, 0xB192, 0xB3F5, 0xB193, 0xB3F6, 0xB194, + 0xB3F7, 0xB198, 0xB3F8, 0xB19C, 0xB3F9, 0xB1A8, 0xB3FA, 0xB1CC, + 0xB3FB, 0xB1D0, 0xB3FC, 0xB1D4, 0xB3FD, 0xB1DC, 0xB3FE, 0xB1DD, + 0xB441, 0xD02E, 0xB442, 0xD02F, 0xB443, 0xD030, 0xB444, 0xD031, + 0xB445, 0xD032, 0xB446, 0xD033, 0xB447, 0xD036, 0xB448, 0xD037, + 0xB449, 0xD039, 0xB44A, 0xD03A, 0xB44B, 0xD03B, 0xB44C, 0xD03D, + 0xB44D, 0xD03E, 0xB44E, 0xD03F, 0xB44F, 0xD040, 0xB450, 0xD041, + 0xB451, 0xD042, 0xB452, 0xD043, 0xB453, 0xD046, 0xB454, 0xD048, + 0xB455, 0xD04A, 0xB456, 0xD04B, 0xB457, 0xD04C, 0xB458, 0xD04D, + 0xB459, 0xD04E, 0xB45A, 0xD04F, 0xB461, 0xD051, 0xB462, 0xD052, + 0xB463, 0xD053, 0xB464, 0xD055, 0xB465, 0xD056, 0xB466, 0xD057, + 0xB467, 0xD059, 0xB468, 0xD05A, 0xB469, 0xD05B, 0xB46A, 0xD05C, + 0xB46B, 0xD05D, 0xB46C, 0xD05E, 0xB46D, 0xD05F, 0xB46E, 0xD061, + 0xB46F, 0xD062, 0xB470, 0xD063, 0xB471, 0xD064, 0xB472, 0xD065, + 0xB473, 0xD066, 0xB474, 0xD067, 0xB475, 0xD068, 0xB476, 0xD069, + 0xB477, 0xD06A, 0xB478, 0xD06B, 0xB479, 0xD06E, 0xB47A, 0xD06F, + 0xB481, 0xD071, 0xB482, 0xD072, 0xB483, 0xD073, 0xB484, 0xD075, + 0xB485, 0xD076, 0xB486, 0xD077, 0xB487, 0xD078, 0xB488, 0xD079, + 0xB489, 0xD07A, 0xB48A, 0xD07B, 0xB48B, 0xD07E, 0xB48C, 0xD07F, + 0xB48D, 0xD080, 0xB48E, 0xD082, 0xB48F, 0xD083, 0xB490, 0xD084, + 0xB491, 0xD085, 0xB492, 0xD086, 0xB493, 0xD087, 0xB494, 0xD088, + 0xB495, 0xD089, 0xB496, 0xD08A, 0xB497, 0xD08B, 0xB498, 0xD08C, + 0xB499, 0xD08D, 0xB49A, 0xD08E, 0xB49B, 0xD08F, 0xB49C, 0xD090, + 0xB49D, 0xD091, 0xB49E, 0xD092, 0xB49F, 0xD093, 0xB4A0, 0xD094, + 0xB4A1, 0xB1DF, 0xB4A2, 0xB1E8, 0xB4A3, 0xB1E9, 0xB4A4, 0xB1EC, + 0xB4A5, 0xB1F0, 0xB4A6, 0xB1F9, 0xB4A7, 0xB1FB, 0xB4A8, 0xB1FD, + 0xB4A9, 0xB204, 0xB4AA, 0xB205, 0xB4AB, 0xB208, 0xB4AC, 0xB20B, + 0xB4AD, 0xB20C, 0xB4AE, 0xB214, 0xB4AF, 0xB215, 0xB4B0, 0xB217, + 0xB4B1, 0xB219, 0xB4B2, 0xB220, 0xB4B3, 0xB234, 0xB4B4, 0xB23C, + 0xB4B5, 0xB258, 0xB4B6, 0xB25C, 0xB4B7, 0xB260, 0xB4B8, 0xB268, + 0xB4B9, 0xB269, 0xB4BA, 0xB274, 0xB4BB, 0xB275, 0xB4BC, 0xB27C, + 0xB4BD, 0xB284, 0xB4BE, 0xB285, 0xB4BF, 0xB289, 0xB4C0, 0xB290, + 0xB4C1, 0xB291, 0xB4C2, 0xB294, 0xB4C3, 0xB298, 0xB4C4, 0xB299, + 0xB4C5, 0xB29A, 0xB4C6, 0xB2A0, 0xB4C7, 0xB2A1, 0xB4C8, 0xB2A3, + 0xB4C9, 0xB2A5, 0xB4CA, 0xB2A6, 0xB4CB, 0xB2AA, 0xB4CC, 0xB2AC, + 0xB4CD, 0xB2B0, 0xB4CE, 0xB2B4, 0xB4CF, 0xB2C8, 0xB4D0, 0xB2C9, + 0xB4D1, 0xB2CC, 0xB4D2, 0xB2D0, 0xB4D3, 0xB2D2, 0xB4D4, 0xB2D8, + 0xB4D5, 0xB2D9, 0xB4D6, 0xB2DB, 0xB4D7, 0xB2DD, 0xB4D8, 0xB2E2, + 0xB4D9, 0xB2E4, 0xB4DA, 0xB2E5, 0xB4DB, 0xB2E6, 0xB4DC, 0xB2E8, + 0xB4DD, 0xB2EB, 0xB4DE, 0xB2EC, 0xB4DF, 0xB2ED, 0xB4E0, 0xB2EE, + 0xB4E1, 0xB2EF, 0xB4E2, 0xB2F3, 0xB4E3, 0xB2F4, 0xB4E4, 0xB2F5, + 0xB4E5, 0xB2F7, 0xB4E6, 0xB2F8, 0xB4E7, 0xB2F9, 0xB4E8, 0xB2FA, + 0xB4E9, 0xB2FB, 0xB4EA, 0xB2FF, 0xB4EB, 0xB300, 0xB4EC, 0xB301, + 0xB4ED, 0xB304, 0xB4EE, 0xB308, 0xB4EF, 0xB310, 0xB4F0, 0xB311, + 0xB4F1, 0xB313, 0xB4F2, 0xB314, 0xB4F3, 0xB315, 0xB4F4, 0xB31C, + 0xB4F5, 0xB354, 0xB4F6, 0xB355, 0xB4F7, 0xB356, 0xB4F8, 0xB358, + 0xB4F9, 0xB35B, 0xB4FA, 0xB35C, 0xB4FB, 0xB35E, 0xB4FC, 0xB35F, + 0xB4FD, 0xB364, 0xB4FE, 0xB365, 0xB541, 0xD095, 0xB542, 0xD096, + 0xB543, 0xD097, 0xB544, 0xD098, 0xB545, 0xD099, 0xB546, 0xD09A, + 0xB547, 0xD09B, 0xB548, 0xD09C, 0xB549, 0xD09D, 0xB54A, 0xD09E, + 0xB54B, 0xD09F, 0xB54C, 0xD0A0, 0xB54D, 0xD0A1, 0xB54E, 0xD0A2, + 0xB54F, 0xD0A3, 0xB550, 0xD0A6, 0xB551, 0xD0A7, 0xB552, 0xD0A9, + 0xB553, 0xD0AA, 0xB554, 0xD0AB, 0xB555, 0xD0AD, 0xB556, 0xD0AE, + 0xB557, 0xD0AF, 0xB558, 0xD0B0, 0xB559, 0xD0B1, 0xB55A, 0xD0B2, + 0xB561, 0xD0B3, 0xB562, 0xD0B6, 0xB563, 0xD0B8, 0xB564, 0xD0BA, + 0xB565, 0xD0BB, 0xB566, 0xD0BC, 0xB567, 0xD0BD, 0xB568, 0xD0BE, + 0xB569, 0xD0BF, 0xB56A, 0xD0C2, 0xB56B, 0xD0C3, 0xB56C, 0xD0C5, + 0xB56D, 0xD0C6, 0xB56E, 0xD0C7, 0xB56F, 0xD0CA, 0xB570, 0xD0CB, + 0xB571, 0xD0CC, 0xB572, 0xD0CD, 0xB573, 0xD0CE, 0xB574, 0xD0CF, + 0xB575, 0xD0D2, 0xB576, 0xD0D6, 0xB577, 0xD0D7, 0xB578, 0xD0D8, + 0xB579, 0xD0D9, 0xB57A, 0xD0DA, 0xB581, 0xD0DB, 0xB582, 0xD0DE, + 0xB583, 0xD0DF, 0xB584, 0xD0E1, 0xB585, 0xD0E2, 0xB586, 0xD0E3, + 0xB587, 0xD0E5, 0xB588, 0xD0E6, 0xB589, 0xD0E7, 0xB58A, 0xD0E8, + 0xB58B, 0xD0E9, 0xB58C, 0xD0EA, 0xB58D, 0xD0EB, 0xB58E, 0xD0EE, + 0xB58F, 0xD0F2, 0xB590, 0xD0F3, 0xB591, 0xD0F4, 0xB592, 0xD0F5, + 0xB593, 0xD0F6, 0xB594, 0xD0F7, 0xB595, 0xD0F9, 0xB596, 0xD0FA, + 0xB597, 0xD0FB, 0xB598, 0xD0FC, 0xB599, 0xD0FD, 0xB59A, 0xD0FE, + 0xB59B, 0xD0FF, 0xB59C, 0xD100, 0xB59D, 0xD101, 0xB59E, 0xD102, + 0xB59F, 0xD103, 0xB5A0, 0xD104, 0xB5A1, 0xB367, 0xB5A2, 0xB369, + 0xB5A3, 0xB36B, 0xB5A4, 0xB36E, 0xB5A5, 0xB370, 0xB5A6, 0xB371, + 0xB5A7, 0xB374, 0xB5A8, 0xB378, 0xB5A9, 0xB380, 0xB5AA, 0xB381, + 0xB5AB, 0xB383, 0xB5AC, 0xB384, 0xB5AD, 0xB385, 0xB5AE, 0xB38C, + 0xB5AF, 0xB390, 0xB5B0, 0xB394, 0xB5B1, 0xB3A0, 0xB5B2, 0xB3A1, + 0xB5B3, 0xB3A8, 0xB5B4, 0xB3AC, 0xB5B5, 0xB3C4, 0xB5B6, 0xB3C5, + 0xB5B7, 0xB3C8, 0xB5B8, 0xB3CB, 0xB5B9, 0xB3CC, 0xB5BA, 0xB3CE, + 0xB5BB, 0xB3D0, 0xB5BC, 0xB3D4, 0xB5BD, 0xB3D5, 0xB5BE, 0xB3D7, + 0xB5BF, 0xB3D9, 0xB5C0, 0xB3DB, 0xB5C1, 0xB3DD, 0xB5C2, 0xB3E0, + 0xB5C3, 0xB3E4, 0xB5C4, 0xB3E8, 0xB5C5, 0xB3FC, 0xB5C6, 0xB410, + 0xB5C7, 0xB418, 0xB5C8, 0xB41C, 0xB5C9, 0xB420, 0xB5CA, 0xB428, + 0xB5CB, 0xB429, 0xB5CC, 0xB42B, 0xB5CD, 0xB434, 0xB5CE, 0xB450, + 0xB5CF, 0xB451, 0xB5D0, 0xB454, 0xB5D1, 0xB458, 0xB5D2, 0xB460, + 0xB5D3, 0xB461, 0xB5D4, 0xB463, 0xB5D5, 0xB465, 0xB5D6, 0xB46C, + 0xB5D7, 0xB480, 0xB5D8, 0xB488, 0xB5D9, 0xB49D, 0xB5DA, 0xB4A4, + 0xB5DB, 0xB4A8, 0xB5DC, 0xB4AC, 0xB5DD, 0xB4B5, 0xB5DE, 0xB4B7, + 0xB5DF, 0xB4B9, 0xB5E0, 0xB4C0, 0xB5E1, 0xB4C4, 0xB5E2, 0xB4C8, + 0xB5E3, 0xB4D0, 0xB5E4, 0xB4D5, 0xB5E5, 0xB4DC, 0xB5E6, 0xB4DD, + 0xB5E7, 0xB4E0, 0xB5E8, 0xB4E3, 0xB5E9, 0xB4E4, 0xB5EA, 0xB4E6, + 0xB5EB, 0xB4EC, 0xB5EC, 0xB4ED, 0xB5ED, 0xB4EF, 0xB5EE, 0xB4F1, + 0xB5EF, 0xB4F8, 0xB5F0, 0xB514, 0xB5F1, 0xB515, 0xB5F2, 0xB518, + 0xB5F3, 0xB51B, 0xB5F4, 0xB51C, 0xB5F5, 0xB524, 0xB5F6, 0xB525, + 0xB5F7, 0xB527, 0xB5F8, 0xB528, 0xB5F9, 0xB529, 0xB5FA, 0xB52A, + 0xB5FB, 0xB530, 0xB5FC, 0xB531, 0xB5FD, 0xB534, 0xB5FE, 0xB538, + 0xB641, 0xD105, 0xB642, 0xD106, 0xB643, 0xD107, 0xB644, 0xD108, + 0xB645, 0xD109, 0xB646, 0xD10A, 0xB647, 0xD10B, 0xB648, 0xD10C, + 0xB649, 0xD10E, 0xB64A, 0xD10F, 0xB64B, 0xD110, 0xB64C, 0xD111, + 0xB64D, 0xD112, 0xB64E, 0xD113, 0xB64F, 0xD114, 0xB650, 0xD115, + 0xB651, 0xD116, 0xB652, 0xD117, 0xB653, 0xD118, 0xB654, 0xD119, + 0xB655, 0xD11A, 0xB656, 0xD11B, 0xB657, 0xD11C, 0xB658, 0xD11D, + 0xB659, 0xD11E, 0xB65A, 0xD11F, 0xB661, 0xD120, 0xB662, 0xD121, + 0xB663, 0xD122, 0xB664, 0xD123, 0xB665, 0xD124, 0xB666, 0xD125, + 0xB667, 0xD126, 0xB668, 0xD127, 0xB669, 0xD128, 0xB66A, 0xD129, + 0xB66B, 0xD12A, 0xB66C, 0xD12B, 0xB66D, 0xD12C, 0xB66E, 0xD12D, + 0xB66F, 0xD12E, 0xB670, 0xD12F, 0xB671, 0xD132, 0xB672, 0xD133, + 0xB673, 0xD135, 0xB674, 0xD136, 0xB675, 0xD137, 0xB676, 0xD139, + 0xB677, 0xD13B, 0xB678, 0xD13C, 0xB679, 0xD13D, 0xB67A, 0xD13E, + 0xB681, 0xD13F, 0xB682, 0xD142, 0xB683, 0xD146, 0xB684, 0xD147, + 0xB685, 0xD148, 0xB686, 0xD149, 0xB687, 0xD14A, 0xB688, 0xD14B, + 0xB689, 0xD14E, 0xB68A, 0xD14F, 0xB68B, 0xD151, 0xB68C, 0xD152, + 0xB68D, 0xD153, 0xB68E, 0xD155, 0xB68F, 0xD156, 0xB690, 0xD157, + 0xB691, 0xD158, 0xB692, 0xD159, 0xB693, 0xD15A, 0xB694, 0xD15B, + 0xB695, 0xD15E, 0xB696, 0xD160, 0xB697, 0xD162, 0xB698, 0xD163, + 0xB699, 0xD164, 0xB69A, 0xD165, 0xB69B, 0xD166, 0xB69C, 0xD167, + 0xB69D, 0xD169, 0xB69E, 0xD16A, 0xB69F, 0xD16B, 0xB6A0, 0xD16D, + 0xB6A1, 0xB540, 0xB6A2, 0xB541, 0xB6A3, 0xB543, 0xB6A4, 0xB544, + 0xB6A5, 0xB545, 0xB6A6, 0xB54B, 0xB6A7, 0xB54C, 0xB6A8, 0xB54D, + 0xB6A9, 0xB550, 0xB6AA, 0xB554, 0xB6AB, 0xB55C, 0xB6AC, 0xB55D, + 0xB6AD, 0xB55F, 0xB6AE, 0xB560, 0xB6AF, 0xB561, 0xB6B0, 0xB5A0, + 0xB6B1, 0xB5A1, 0xB6B2, 0xB5A4, 0xB6B3, 0xB5A8, 0xB6B4, 0xB5AA, + 0xB6B5, 0xB5AB, 0xB6B6, 0xB5B0, 0xB6B7, 0xB5B1, 0xB6B8, 0xB5B3, + 0xB6B9, 0xB5B4, 0xB6BA, 0xB5B5, 0xB6BB, 0xB5BB, 0xB6BC, 0xB5BC, + 0xB6BD, 0xB5BD, 0xB6BE, 0xB5C0, 0xB6BF, 0xB5C4, 0xB6C0, 0xB5CC, + 0xB6C1, 0xB5CD, 0xB6C2, 0xB5CF, 0xB6C3, 0xB5D0, 0xB6C4, 0xB5D1, + 0xB6C5, 0xB5D8, 0xB6C6, 0xB5EC, 0xB6C7, 0xB610, 0xB6C8, 0xB611, + 0xB6C9, 0xB614, 0xB6CA, 0xB618, 0xB6CB, 0xB625, 0xB6CC, 0xB62C, + 0xB6CD, 0xB634, 0xB6CE, 0xB648, 0xB6CF, 0xB664, 0xB6D0, 0xB668, + 0xB6D1, 0xB69C, 0xB6D2, 0xB69D, 0xB6D3, 0xB6A0, 0xB6D4, 0xB6A4, + 0xB6D5, 0xB6AB, 0xB6D6, 0xB6AC, 0xB6D7, 0xB6B1, 0xB6D8, 0xB6D4, + 0xB6D9, 0xB6F0, 0xB6DA, 0xB6F4, 0xB6DB, 0xB6F8, 0xB6DC, 0xB700, + 0xB6DD, 0xB701, 0xB6DE, 0xB705, 0xB6DF, 0xB728, 0xB6E0, 0xB729, + 0xB6E1, 0xB72C, 0xB6E2, 0xB72F, 0xB6E3, 0xB730, 0xB6E4, 0xB738, + 0xB6E5, 0xB739, 0xB6E6, 0xB73B, 0xB6E7, 0xB744, 0xB6E8, 0xB748, + 0xB6E9, 0xB74C, 0xB6EA, 0xB754, 0xB6EB, 0xB755, 0xB6EC, 0xB760, + 0xB6ED, 0xB764, 0xB6EE, 0xB768, 0xB6EF, 0xB770, 0xB6F0, 0xB771, + 0xB6F1, 0xB773, 0xB6F2, 0xB775, 0xB6F3, 0xB77C, 0xB6F4, 0xB77D, + 0xB6F5, 0xB780, 0xB6F6, 0xB784, 0xB6F7, 0xB78C, 0xB6F8, 0xB78D, + 0xB6F9, 0xB78F, 0xB6FA, 0xB790, 0xB6FB, 0xB791, 0xB6FC, 0xB792, + 0xB6FD, 0xB796, 0xB6FE, 0xB797, 0xB741, 0xD16E, 0xB742, 0xD16F, + 0xB743, 0xD170, 0xB744, 0xD171, 0xB745, 0xD172, 0xB746, 0xD173, + 0xB747, 0xD174, 0xB748, 0xD175, 0xB749, 0xD176, 0xB74A, 0xD177, + 0xB74B, 0xD178, 0xB74C, 0xD179, 0xB74D, 0xD17A, 0xB74E, 0xD17B, + 0xB74F, 0xD17D, 0xB750, 0xD17E, 0xB751, 0xD17F, 0xB752, 0xD180, + 0xB753, 0xD181, 0xB754, 0xD182, 0xB755, 0xD183, 0xB756, 0xD185, + 0xB757, 0xD186, 0xB758, 0xD187, 0xB759, 0xD189, 0xB75A, 0xD18A, + 0xB761, 0xD18B, 0xB762, 0xD18C, 0xB763, 0xD18D, 0xB764, 0xD18E, + 0xB765, 0xD18F, 0xB766, 0xD190, 0xB767, 0xD191, 0xB768, 0xD192, + 0xB769, 0xD193, 0xB76A, 0xD194, 0xB76B, 0xD195, 0xB76C, 0xD196, + 0xB76D, 0xD197, 0xB76E, 0xD198, 0xB76F, 0xD199, 0xB770, 0xD19A, + 0xB771, 0xD19B, 0xB772, 0xD19C, 0xB773, 0xD19D, 0xB774, 0xD19E, + 0xB775, 0xD19F, 0xB776, 0xD1A2, 0xB777, 0xD1A3, 0xB778, 0xD1A5, + 0xB779, 0xD1A6, 0xB77A, 0xD1A7, 0xB781, 0xD1A9, 0xB782, 0xD1AA, + 0xB783, 0xD1AB, 0xB784, 0xD1AC, 0xB785, 0xD1AD, 0xB786, 0xD1AE, + 0xB787, 0xD1AF, 0xB788, 0xD1B2, 0xB789, 0xD1B4, 0xB78A, 0xD1B6, + 0xB78B, 0xD1B7, 0xB78C, 0xD1B8, 0xB78D, 0xD1B9, 0xB78E, 0xD1BB, + 0xB78F, 0xD1BD, 0xB790, 0xD1BE, 0xB791, 0xD1BF, 0xB792, 0xD1C1, + 0xB793, 0xD1C2, 0xB794, 0xD1C3, 0xB795, 0xD1C4, 0xB796, 0xD1C5, + 0xB797, 0xD1C6, 0xB798, 0xD1C7, 0xB799, 0xD1C8, 0xB79A, 0xD1C9, + 0xB79B, 0xD1CA, 0xB79C, 0xD1CB, 0xB79D, 0xD1CC, 0xB79E, 0xD1CD, + 0xB79F, 0xD1CE, 0xB7A0, 0xD1CF, 0xB7A1, 0xB798, 0xB7A2, 0xB799, + 0xB7A3, 0xB79C, 0xB7A4, 0xB7A0, 0xB7A5, 0xB7A8, 0xB7A6, 0xB7A9, + 0xB7A7, 0xB7AB, 0xB7A8, 0xB7AC, 0xB7A9, 0xB7AD, 0xB7AA, 0xB7B4, + 0xB7AB, 0xB7B5, 0xB7AC, 0xB7B8, 0xB7AD, 0xB7C7, 0xB7AE, 0xB7C9, + 0xB7AF, 0xB7EC, 0xB7B0, 0xB7ED, 0xB7B1, 0xB7F0, 0xB7B2, 0xB7F4, + 0xB7B3, 0xB7FC, 0xB7B4, 0xB7FD, 0xB7B5, 0xB7FF, 0xB7B6, 0xB800, + 0xB7B7, 0xB801, 0xB7B8, 0xB807, 0xB7B9, 0xB808, 0xB7BA, 0xB809, + 0xB7BB, 0xB80C, 0xB7BC, 0xB810, 0xB7BD, 0xB818, 0xB7BE, 0xB819, + 0xB7BF, 0xB81B, 0xB7C0, 0xB81D, 0xB7C1, 0xB824, 0xB7C2, 0xB825, + 0xB7C3, 0xB828, 0xB7C4, 0xB82C, 0xB7C5, 0xB834, 0xB7C6, 0xB835, + 0xB7C7, 0xB837, 0xB7C8, 0xB838, 0xB7C9, 0xB839, 0xB7CA, 0xB840, + 0xB7CB, 0xB844, 0xB7CC, 0xB851, 0xB7CD, 0xB853, 0xB7CE, 0xB85C, + 0xB7CF, 0xB85D, 0xB7D0, 0xB860, 0xB7D1, 0xB864, 0xB7D2, 0xB86C, + 0xB7D3, 0xB86D, 0xB7D4, 0xB86F, 0xB7D5, 0xB871, 0xB7D6, 0xB878, + 0xB7D7, 0xB87C, 0xB7D8, 0xB88D, 0xB7D9, 0xB8A8, 0xB7DA, 0xB8B0, + 0xB7DB, 0xB8B4, 0xB7DC, 0xB8B8, 0xB7DD, 0xB8C0, 0xB7DE, 0xB8C1, + 0xB7DF, 0xB8C3, 0xB7E0, 0xB8C5, 0xB7E1, 0xB8CC, 0xB7E2, 0xB8D0, + 0xB7E3, 0xB8D4, 0xB7E4, 0xB8DD, 0xB7E5, 0xB8DF, 0xB7E6, 0xB8E1, + 0xB7E7, 0xB8E8, 0xB7E8, 0xB8E9, 0xB7E9, 0xB8EC, 0xB7EA, 0xB8F0, + 0xB7EB, 0xB8F8, 0xB7EC, 0xB8F9, 0xB7ED, 0xB8FB, 0xB7EE, 0xB8FD, + 0xB7EF, 0xB904, 0xB7F0, 0xB918, 0xB7F1, 0xB920, 0xB7F2, 0xB93C, + 0xB7F3, 0xB93D, 0xB7F4, 0xB940, 0xB7F5, 0xB944, 0xB7F6, 0xB94C, + 0xB7F7, 0xB94F, 0xB7F8, 0xB951, 0xB7F9, 0xB958, 0xB7FA, 0xB959, + 0xB7FB, 0xB95C, 0xB7FC, 0xB960, 0xB7FD, 0xB968, 0xB7FE, 0xB969, + 0xB841, 0xD1D0, 0xB842, 0xD1D1, 0xB843, 0xD1D2, 0xB844, 0xD1D3, + 0xB845, 0xD1D4, 0xB846, 0xD1D5, 0xB847, 0xD1D6, 0xB848, 0xD1D7, + 0xB849, 0xD1D9, 0xB84A, 0xD1DA, 0xB84B, 0xD1DB, 0xB84C, 0xD1DC, + 0xB84D, 0xD1DD, 0xB84E, 0xD1DE, 0xB84F, 0xD1DF, 0xB850, 0xD1E0, + 0xB851, 0xD1E1, 0xB852, 0xD1E2, 0xB853, 0xD1E3, 0xB854, 0xD1E4, + 0xB855, 0xD1E5, 0xB856, 0xD1E6, 0xB857, 0xD1E7, 0xB858, 0xD1E8, + 0xB859, 0xD1E9, 0xB85A, 0xD1EA, 0xB861, 0xD1EB, 0xB862, 0xD1EC, + 0xB863, 0xD1ED, 0xB864, 0xD1EE, 0xB865, 0xD1EF, 0xB866, 0xD1F0, + 0xB867, 0xD1F1, 0xB868, 0xD1F2, 0xB869, 0xD1F3, 0xB86A, 0xD1F5, + 0xB86B, 0xD1F6, 0xB86C, 0xD1F7, 0xB86D, 0xD1F9, 0xB86E, 0xD1FA, + 0xB86F, 0xD1FB, 0xB870, 0xD1FC, 0xB871, 0xD1FD, 0xB872, 0xD1FE, + 0xB873, 0xD1FF, 0xB874, 0xD200, 0xB875, 0xD201, 0xB876, 0xD202, + 0xB877, 0xD203, 0xB878, 0xD204, 0xB879, 0xD205, 0xB87A, 0xD206, + 0xB881, 0xD208, 0xB882, 0xD20A, 0xB883, 0xD20B, 0xB884, 0xD20C, + 0xB885, 0xD20D, 0xB886, 0xD20E, 0xB887, 0xD20F, 0xB888, 0xD211, + 0xB889, 0xD212, 0xB88A, 0xD213, 0xB88B, 0xD214, 0xB88C, 0xD215, + 0xB88D, 0xD216, 0xB88E, 0xD217, 0xB88F, 0xD218, 0xB890, 0xD219, + 0xB891, 0xD21A, 0xB892, 0xD21B, 0xB893, 0xD21C, 0xB894, 0xD21D, + 0xB895, 0xD21E, 0xB896, 0xD21F, 0xB897, 0xD220, 0xB898, 0xD221, + 0xB899, 0xD222, 0xB89A, 0xD223, 0xB89B, 0xD224, 0xB89C, 0xD225, + 0xB89D, 0xD226, 0xB89E, 0xD227, 0xB89F, 0xD228, 0xB8A0, 0xD229, + 0xB8A1, 0xB96B, 0xB8A2, 0xB96D, 0xB8A3, 0xB974, 0xB8A4, 0xB975, + 0xB8A5, 0xB978, 0xB8A6, 0xB97C, 0xB8A7, 0xB984, 0xB8A8, 0xB985, + 0xB8A9, 0xB987, 0xB8AA, 0xB989, 0xB8AB, 0xB98A, 0xB8AC, 0xB98D, + 0xB8AD, 0xB98E, 0xB8AE, 0xB9AC, 0xB8AF, 0xB9AD, 0xB8B0, 0xB9B0, + 0xB8B1, 0xB9B4, 0xB8B2, 0xB9BC, 0xB8B3, 0xB9BD, 0xB8B4, 0xB9BF, + 0xB8B5, 0xB9C1, 0xB8B6, 0xB9C8, 0xB8B7, 0xB9C9, 0xB8B8, 0xB9CC, + 0xB8B9, 0xB9CE, 0xB8BA, 0xB9CF, 0xB8BB, 0xB9D0, 0xB8BC, 0xB9D1, + 0xB8BD, 0xB9D2, 0xB8BE, 0xB9D8, 0xB8BF, 0xB9D9, 0xB8C0, 0xB9DB, + 0xB8C1, 0xB9DD, 0xB8C2, 0xB9DE, 0xB8C3, 0xB9E1, 0xB8C4, 0xB9E3, + 0xB8C5, 0xB9E4, 0xB8C6, 0xB9E5, 0xB8C7, 0xB9E8, 0xB8C8, 0xB9EC, + 0xB8C9, 0xB9F4, 0xB8CA, 0xB9F5, 0xB8CB, 0xB9F7, 0xB8CC, 0xB9F8, + 0xB8CD, 0xB9F9, 0xB8CE, 0xB9FA, 0xB8CF, 0xBA00, 0xB8D0, 0xBA01, + 0xB8D1, 0xBA08, 0xB8D2, 0xBA15, 0xB8D3, 0xBA38, 0xB8D4, 0xBA39, + 0xB8D5, 0xBA3C, 0xB8D6, 0xBA40, 0xB8D7, 0xBA42, 0xB8D8, 0xBA48, + 0xB8D9, 0xBA49, 0xB8DA, 0xBA4B, 0xB8DB, 0xBA4D, 0xB8DC, 0xBA4E, + 0xB8DD, 0xBA53, 0xB8DE, 0xBA54, 0xB8DF, 0xBA55, 0xB8E0, 0xBA58, + 0xB8E1, 0xBA5C, 0xB8E2, 0xBA64, 0xB8E3, 0xBA65, 0xB8E4, 0xBA67, + 0xB8E5, 0xBA68, 0xB8E6, 0xBA69, 0xB8E7, 0xBA70, 0xB8E8, 0xBA71, + 0xB8E9, 0xBA74, 0xB8EA, 0xBA78, 0xB8EB, 0xBA83, 0xB8EC, 0xBA84, + 0xB8ED, 0xBA85, 0xB8EE, 0xBA87, 0xB8EF, 0xBA8C, 0xB8F0, 0xBAA8, + 0xB8F1, 0xBAA9, 0xB8F2, 0xBAAB, 0xB8F3, 0xBAAC, 0xB8F4, 0xBAB0, + 0xB8F5, 0xBAB2, 0xB8F6, 0xBAB8, 0xB8F7, 0xBAB9, 0xB8F8, 0xBABB, + 0xB8F9, 0xBABD, 0xB8FA, 0xBAC4, 0xB8FB, 0xBAC8, 0xB8FC, 0xBAD8, + 0xB8FD, 0xBAD9, 0xB8FE, 0xBAFC, 0xB941, 0xD22A, 0xB942, 0xD22B, + 0xB943, 0xD22E, 0xB944, 0xD22F, 0xB945, 0xD231, 0xB946, 0xD232, + 0xB947, 0xD233, 0xB948, 0xD235, 0xB949, 0xD236, 0xB94A, 0xD237, + 0xB94B, 0xD238, 0xB94C, 0xD239, 0xB94D, 0xD23A, 0xB94E, 0xD23B, + 0xB94F, 0xD23E, 0xB950, 0xD240, 0xB951, 0xD242, 0xB952, 0xD243, + 0xB953, 0xD244, 0xB954, 0xD245, 0xB955, 0xD246, 0xB956, 0xD247, + 0xB957, 0xD249, 0xB958, 0xD24A, 0xB959, 0xD24B, 0xB95A, 0xD24C, + 0xB961, 0xD24D, 0xB962, 0xD24E, 0xB963, 0xD24F, 0xB964, 0xD250, + 0xB965, 0xD251, 0xB966, 0xD252, 0xB967, 0xD253, 0xB968, 0xD254, + 0xB969, 0xD255, 0xB96A, 0xD256, 0xB96B, 0xD257, 0xB96C, 0xD258, + 0xB96D, 0xD259, 0xB96E, 0xD25A, 0xB96F, 0xD25B, 0xB970, 0xD25D, + 0xB971, 0xD25E, 0xB972, 0xD25F, 0xB973, 0xD260, 0xB974, 0xD261, + 0xB975, 0xD262, 0xB976, 0xD263, 0xB977, 0xD265, 0xB978, 0xD266, + 0xB979, 0xD267, 0xB97A, 0xD268, 0xB981, 0xD269, 0xB982, 0xD26A, + 0xB983, 0xD26B, 0xB984, 0xD26C, 0xB985, 0xD26D, 0xB986, 0xD26E, + 0xB987, 0xD26F, 0xB988, 0xD270, 0xB989, 0xD271, 0xB98A, 0xD272, + 0xB98B, 0xD273, 0xB98C, 0xD274, 0xB98D, 0xD275, 0xB98E, 0xD276, + 0xB98F, 0xD277, 0xB990, 0xD278, 0xB991, 0xD279, 0xB992, 0xD27A, + 0xB993, 0xD27B, 0xB994, 0xD27C, 0xB995, 0xD27D, 0xB996, 0xD27E, + 0xB997, 0xD27F, 0xB998, 0xD282, 0xB999, 0xD283, 0xB99A, 0xD285, + 0xB99B, 0xD286, 0xB99C, 0xD287, 0xB99D, 0xD289, 0xB99E, 0xD28A, + 0xB99F, 0xD28B, 0xB9A0, 0xD28C, 0xB9A1, 0xBB00, 0xB9A2, 0xBB04, + 0xB9A3, 0xBB0D, 0xB9A4, 0xBB0F, 0xB9A5, 0xBB11, 0xB9A6, 0xBB18, + 0xB9A7, 0xBB1C, 0xB9A8, 0xBB20, 0xB9A9, 0xBB29, 0xB9AA, 0xBB2B, + 0xB9AB, 0xBB34, 0xB9AC, 0xBB35, 0xB9AD, 0xBB36, 0xB9AE, 0xBB38, + 0xB9AF, 0xBB3B, 0xB9B0, 0xBB3C, 0xB9B1, 0xBB3D, 0xB9B2, 0xBB3E, + 0xB9B3, 0xBB44, 0xB9B4, 0xBB45, 0xB9B5, 0xBB47, 0xB9B6, 0xBB49, + 0xB9B7, 0xBB4D, 0xB9B8, 0xBB4F, 0xB9B9, 0xBB50, 0xB9BA, 0xBB54, + 0xB9BB, 0xBB58, 0xB9BC, 0xBB61, 0xB9BD, 0xBB63, 0xB9BE, 0xBB6C, + 0xB9BF, 0xBB88, 0xB9C0, 0xBB8C, 0xB9C1, 0xBB90, 0xB9C2, 0xBBA4, + 0xB9C3, 0xBBA8, 0xB9C4, 0xBBAC, 0xB9C5, 0xBBB4, 0xB9C6, 0xBBB7, + 0xB9C7, 0xBBC0, 0xB9C8, 0xBBC4, 0xB9C9, 0xBBC8, 0xB9CA, 0xBBD0, + 0xB9CB, 0xBBD3, 0xB9CC, 0xBBF8, 0xB9CD, 0xBBF9, 0xB9CE, 0xBBFC, + 0xB9CF, 0xBBFF, 0xB9D0, 0xBC00, 0xB9D1, 0xBC02, 0xB9D2, 0xBC08, + 0xB9D3, 0xBC09, 0xB9D4, 0xBC0B, 0xB9D5, 0xBC0C, 0xB9D6, 0xBC0D, + 0xB9D7, 0xBC0F, 0xB9D8, 0xBC11, 0xB9D9, 0xBC14, 0xB9DA, 0xBC15, + 0xB9DB, 0xBC16, 0xB9DC, 0xBC17, 0xB9DD, 0xBC18, 0xB9DE, 0xBC1B, + 0xB9DF, 0xBC1C, 0xB9E0, 0xBC1D, 0xB9E1, 0xBC1E, 0xB9E2, 0xBC1F, + 0xB9E3, 0xBC24, 0xB9E4, 0xBC25, 0xB9E5, 0xBC27, 0xB9E6, 0xBC29, + 0xB9E7, 0xBC2D, 0xB9E8, 0xBC30, 0xB9E9, 0xBC31, 0xB9EA, 0xBC34, + 0xB9EB, 0xBC38, 0xB9EC, 0xBC40, 0xB9ED, 0xBC41, 0xB9EE, 0xBC43, + 0xB9EF, 0xBC44, 0xB9F0, 0xBC45, 0xB9F1, 0xBC49, 0xB9F2, 0xBC4C, + 0xB9F3, 0xBC4D, 0xB9F4, 0xBC50, 0xB9F5, 0xBC5D, 0xB9F6, 0xBC84, + 0xB9F7, 0xBC85, 0xB9F8, 0xBC88, 0xB9F9, 0xBC8B, 0xB9FA, 0xBC8C, + 0xB9FB, 0xBC8E, 0xB9FC, 0xBC94, 0xB9FD, 0xBC95, 0xB9FE, 0xBC97, + 0xBA41, 0xD28D, 0xBA42, 0xD28E, 0xBA43, 0xD28F, 0xBA44, 0xD292, + 0xBA45, 0xD293, 0xBA46, 0xD294, 0xBA47, 0xD296, 0xBA48, 0xD297, + 0xBA49, 0xD298, 0xBA4A, 0xD299, 0xBA4B, 0xD29A, 0xBA4C, 0xD29B, + 0xBA4D, 0xD29D, 0xBA4E, 0xD29E, 0xBA4F, 0xD29F, 0xBA50, 0xD2A1, + 0xBA51, 0xD2A2, 0xBA52, 0xD2A3, 0xBA53, 0xD2A5, 0xBA54, 0xD2A6, + 0xBA55, 0xD2A7, 0xBA56, 0xD2A8, 0xBA57, 0xD2A9, 0xBA58, 0xD2AA, + 0xBA59, 0xD2AB, 0xBA5A, 0xD2AD, 0xBA61, 0xD2AE, 0xBA62, 0xD2AF, + 0xBA63, 0xD2B0, 0xBA64, 0xD2B2, 0xBA65, 0xD2B3, 0xBA66, 0xD2B4, + 0xBA67, 0xD2B5, 0xBA68, 0xD2B6, 0xBA69, 0xD2B7, 0xBA6A, 0xD2BA, + 0xBA6B, 0xD2BB, 0xBA6C, 0xD2BD, 0xBA6D, 0xD2BE, 0xBA6E, 0xD2C1, + 0xBA6F, 0xD2C3, 0xBA70, 0xD2C4, 0xBA71, 0xD2C5, 0xBA72, 0xD2C6, + 0xBA73, 0xD2C7, 0xBA74, 0xD2CA, 0xBA75, 0xD2CC, 0xBA76, 0xD2CD, + 0xBA77, 0xD2CE, 0xBA78, 0xD2CF, 0xBA79, 0xD2D0, 0xBA7A, 0xD2D1, + 0xBA81, 0xD2D2, 0xBA82, 0xD2D3, 0xBA83, 0xD2D5, 0xBA84, 0xD2D6, + 0xBA85, 0xD2D7, 0xBA86, 0xD2D9, 0xBA87, 0xD2DA, 0xBA88, 0xD2DB, + 0xBA89, 0xD2DD, 0xBA8A, 0xD2DE, 0xBA8B, 0xD2DF, 0xBA8C, 0xD2E0, + 0xBA8D, 0xD2E1, 0xBA8E, 0xD2E2, 0xBA8F, 0xD2E3, 0xBA90, 0xD2E6, + 0xBA91, 0xD2E7, 0xBA92, 0xD2E8, 0xBA93, 0xD2E9, 0xBA94, 0xD2EA, + 0xBA95, 0xD2EB, 0xBA96, 0xD2EC, 0xBA97, 0xD2ED, 0xBA98, 0xD2EE, + 0xBA99, 0xD2EF, 0xBA9A, 0xD2F2, 0xBA9B, 0xD2F3, 0xBA9C, 0xD2F5, + 0xBA9D, 0xD2F6, 0xBA9E, 0xD2F7, 0xBA9F, 0xD2F9, 0xBAA0, 0xD2FA, + 0xBAA1, 0xBC99, 0xBAA2, 0xBC9A, 0xBAA3, 0xBCA0, 0xBAA4, 0xBCA1, + 0xBAA5, 0xBCA4, 0xBAA6, 0xBCA7, 0xBAA7, 0xBCA8, 0xBAA8, 0xBCB0, + 0xBAA9, 0xBCB1, 0xBAAA, 0xBCB3, 0xBAAB, 0xBCB4, 0xBAAC, 0xBCB5, + 0xBAAD, 0xBCBC, 0xBAAE, 0xBCBD, 0xBAAF, 0xBCC0, 0xBAB0, 0xBCC4, + 0xBAB1, 0xBCCD, 0xBAB2, 0xBCCF, 0xBAB3, 0xBCD0, 0xBAB4, 0xBCD1, + 0xBAB5, 0xBCD5, 0xBAB6, 0xBCD8, 0xBAB7, 0xBCDC, 0xBAB8, 0xBCF4, + 0xBAB9, 0xBCF5, 0xBABA, 0xBCF6, 0xBABB, 0xBCF8, 0xBABC, 0xBCFC, + 0xBABD, 0xBD04, 0xBABE, 0xBD05, 0xBABF, 0xBD07, 0xBAC0, 0xBD09, + 0xBAC1, 0xBD10, 0xBAC2, 0xBD14, 0xBAC3, 0xBD24, 0xBAC4, 0xBD2C, + 0xBAC5, 0xBD40, 0xBAC6, 0xBD48, 0xBAC7, 0xBD49, 0xBAC8, 0xBD4C, + 0xBAC9, 0xBD50, 0xBACA, 0xBD58, 0xBACB, 0xBD59, 0xBACC, 0xBD64, + 0xBACD, 0xBD68, 0xBACE, 0xBD80, 0xBACF, 0xBD81, 0xBAD0, 0xBD84, + 0xBAD1, 0xBD87, 0xBAD2, 0xBD88, 0xBAD3, 0xBD89, 0xBAD4, 0xBD8A, + 0xBAD5, 0xBD90, 0xBAD6, 0xBD91, 0xBAD7, 0xBD93, 0xBAD8, 0xBD95, + 0xBAD9, 0xBD99, 0xBADA, 0xBD9A, 0xBADB, 0xBD9C, 0xBADC, 0xBDA4, + 0xBADD, 0xBDB0, 0xBADE, 0xBDB8, 0xBADF, 0xBDD4, 0xBAE0, 0xBDD5, + 0xBAE1, 0xBDD8, 0xBAE2, 0xBDDC, 0xBAE3, 0xBDE9, 0xBAE4, 0xBDF0, + 0xBAE5, 0xBDF4, 0xBAE6, 0xBDF8, 0xBAE7, 0xBE00, 0xBAE8, 0xBE03, + 0xBAE9, 0xBE05, 0xBAEA, 0xBE0C, 0xBAEB, 0xBE0D, 0xBAEC, 0xBE10, + 0xBAED, 0xBE14, 0xBAEE, 0xBE1C, 0xBAEF, 0xBE1D, 0xBAF0, 0xBE1F, + 0xBAF1, 0xBE44, 0xBAF2, 0xBE45, 0xBAF3, 0xBE48, 0xBAF4, 0xBE4C, + 0xBAF5, 0xBE4E, 0xBAF6, 0xBE54, 0xBAF7, 0xBE55, 0xBAF8, 0xBE57, + 0xBAF9, 0xBE59, 0xBAFA, 0xBE5A, 0xBAFB, 0xBE5B, 0xBAFC, 0xBE60, + 0xBAFD, 0xBE61, 0xBAFE, 0xBE64, 0xBB41, 0xD2FB, 0xBB42, 0xD2FC, + 0xBB43, 0xD2FD, 0xBB44, 0xD2FE, 0xBB45, 0xD2FF, 0xBB46, 0xD302, + 0xBB47, 0xD304, 0xBB48, 0xD306, 0xBB49, 0xD307, 0xBB4A, 0xD308, + 0xBB4B, 0xD309, 0xBB4C, 0xD30A, 0xBB4D, 0xD30B, 0xBB4E, 0xD30F, + 0xBB4F, 0xD311, 0xBB50, 0xD312, 0xBB51, 0xD313, 0xBB52, 0xD315, + 0xBB53, 0xD317, 0xBB54, 0xD318, 0xBB55, 0xD319, 0xBB56, 0xD31A, + 0xBB57, 0xD31B, 0xBB58, 0xD31E, 0xBB59, 0xD322, 0xBB5A, 0xD323, + 0xBB61, 0xD324, 0xBB62, 0xD326, 0xBB63, 0xD327, 0xBB64, 0xD32A, + 0xBB65, 0xD32B, 0xBB66, 0xD32D, 0xBB67, 0xD32E, 0xBB68, 0xD32F, + 0xBB69, 0xD331, 0xBB6A, 0xD332, 0xBB6B, 0xD333, 0xBB6C, 0xD334, + 0xBB6D, 0xD335, 0xBB6E, 0xD336, 0xBB6F, 0xD337, 0xBB70, 0xD33A, + 0xBB71, 0xD33E, 0xBB72, 0xD33F, 0xBB73, 0xD340, 0xBB74, 0xD341, + 0xBB75, 0xD342, 0xBB76, 0xD343, 0xBB77, 0xD346, 0xBB78, 0xD347, + 0xBB79, 0xD348, 0xBB7A, 0xD349, 0xBB81, 0xD34A, 0xBB82, 0xD34B, + 0xBB83, 0xD34C, 0xBB84, 0xD34D, 0xBB85, 0xD34E, 0xBB86, 0xD34F, + 0xBB87, 0xD350, 0xBB88, 0xD351, 0xBB89, 0xD352, 0xBB8A, 0xD353, + 0xBB8B, 0xD354, 0xBB8C, 0xD355, 0xBB8D, 0xD356, 0xBB8E, 0xD357, + 0xBB8F, 0xD358, 0xBB90, 0xD359, 0xBB91, 0xD35A, 0xBB92, 0xD35B, + 0xBB93, 0xD35C, 0xBB94, 0xD35D, 0xBB95, 0xD35E, 0xBB96, 0xD35F, + 0xBB97, 0xD360, 0xBB98, 0xD361, 0xBB99, 0xD362, 0xBB9A, 0xD363, + 0xBB9B, 0xD364, 0xBB9C, 0xD365, 0xBB9D, 0xD366, 0xBB9E, 0xD367, + 0xBB9F, 0xD368, 0xBBA0, 0xD369, 0xBBA1, 0xBE68, 0xBBA2, 0xBE6A, + 0xBBA3, 0xBE70, 0xBBA4, 0xBE71, 0xBBA5, 0xBE73, 0xBBA6, 0xBE74, + 0xBBA7, 0xBE75, 0xBBA8, 0xBE7B, 0xBBA9, 0xBE7C, 0xBBAA, 0xBE7D, + 0xBBAB, 0xBE80, 0xBBAC, 0xBE84, 0xBBAD, 0xBE8C, 0xBBAE, 0xBE8D, + 0xBBAF, 0xBE8F, 0xBBB0, 0xBE90, 0xBBB1, 0xBE91, 0xBBB2, 0xBE98, + 0xBBB3, 0xBE99, 0xBBB4, 0xBEA8, 0xBBB5, 0xBED0, 0xBBB6, 0xBED1, + 0xBBB7, 0xBED4, 0xBBB8, 0xBED7, 0xBBB9, 0xBED8, 0xBBBA, 0xBEE0, + 0xBBBB, 0xBEE3, 0xBBBC, 0xBEE4, 0xBBBD, 0xBEE5, 0xBBBE, 0xBEEC, + 0xBBBF, 0xBF01, 0xBBC0, 0xBF08, 0xBBC1, 0xBF09, 0xBBC2, 0xBF18, + 0xBBC3, 0xBF19, 0xBBC4, 0xBF1B, 0xBBC5, 0xBF1C, 0xBBC6, 0xBF1D, + 0xBBC7, 0xBF40, 0xBBC8, 0xBF41, 0xBBC9, 0xBF44, 0xBBCA, 0xBF48, + 0xBBCB, 0xBF50, 0xBBCC, 0xBF51, 0xBBCD, 0xBF55, 0xBBCE, 0xBF94, + 0xBBCF, 0xBFB0, 0xBBD0, 0xBFC5, 0xBBD1, 0xBFCC, 0xBBD2, 0xBFCD, + 0xBBD3, 0xBFD0, 0xBBD4, 0xBFD4, 0xBBD5, 0xBFDC, 0xBBD6, 0xBFDF, + 0xBBD7, 0xBFE1, 0xBBD8, 0xC03C, 0xBBD9, 0xC051, 0xBBDA, 0xC058, + 0xBBDB, 0xC05C, 0xBBDC, 0xC060, 0xBBDD, 0xC068, 0xBBDE, 0xC069, + 0xBBDF, 0xC090, 0xBBE0, 0xC091, 0xBBE1, 0xC094, 0xBBE2, 0xC098, + 0xBBE3, 0xC0A0, 0xBBE4, 0xC0A1, 0xBBE5, 0xC0A3, 0xBBE6, 0xC0A5, + 0xBBE7, 0xC0AC, 0xBBE8, 0xC0AD, 0xBBE9, 0xC0AF, 0xBBEA, 0xC0B0, + 0xBBEB, 0xC0B3, 0xBBEC, 0xC0B4, 0xBBED, 0xC0B5, 0xBBEE, 0xC0B6, + 0xBBEF, 0xC0BC, 0xBBF0, 0xC0BD, 0xBBF1, 0xC0BF, 0xBBF2, 0xC0C0, + 0xBBF3, 0xC0C1, 0xBBF4, 0xC0C5, 0xBBF5, 0xC0C8, 0xBBF6, 0xC0C9, + 0xBBF7, 0xC0CC, 0xBBF8, 0xC0D0, 0xBBF9, 0xC0D8, 0xBBFA, 0xC0D9, + 0xBBFB, 0xC0DB, 0xBBFC, 0xC0DC, 0xBBFD, 0xC0DD, 0xBBFE, 0xC0E4, + 0xBC41, 0xD36A, 0xBC42, 0xD36B, 0xBC43, 0xD36C, 0xBC44, 0xD36D, + 0xBC45, 0xD36E, 0xBC46, 0xD36F, 0xBC47, 0xD370, 0xBC48, 0xD371, + 0xBC49, 0xD372, 0xBC4A, 0xD373, 0xBC4B, 0xD374, 0xBC4C, 0xD375, + 0xBC4D, 0xD376, 0xBC4E, 0xD377, 0xBC4F, 0xD378, 0xBC50, 0xD379, + 0xBC51, 0xD37A, 0xBC52, 0xD37B, 0xBC53, 0xD37E, 0xBC54, 0xD37F, + 0xBC55, 0xD381, 0xBC56, 0xD382, 0xBC57, 0xD383, 0xBC58, 0xD385, + 0xBC59, 0xD386, 0xBC5A, 0xD387, 0xBC61, 0xD388, 0xBC62, 0xD389, + 0xBC63, 0xD38A, 0xBC64, 0xD38B, 0xBC65, 0xD38E, 0xBC66, 0xD392, + 0xBC67, 0xD393, 0xBC68, 0xD394, 0xBC69, 0xD395, 0xBC6A, 0xD396, + 0xBC6B, 0xD397, 0xBC6C, 0xD39A, 0xBC6D, 0xD39B, 0xBC6E, 0xD39D, + 0xBC6F, 0xD39E, 0xBC70, 0xD39F, 0xBC71, 0xD3A1, 0xBC72, 0xD3A2, + 0xBC73, 0xD3A3, 0xBC74, 0xD3A4, 0xBC75, 0xD3A5, 0xBC76, 0xD3A6, + 0xBC77, 0xD3A7, 0xBC78, 0xD3AA, 0xBC79, 0xD3AC, 0xBC7A, 0xD3AE, + 0xBC81, 0xD3AF, 0xBC82, 0xD3B0, 0xBC83, 0xD3B1, 0xBC84, 0xD3B2, + 0xBC85, 0xD3B3, 0xBC86, 0xD3B5, 0xBC87, 0xD3B6, 0xBC88, 0xD3B7, + 0xBC89, 0xD3B9, 0xBC8A, 0xD3BA, 0xBC8B, 0xD3BB, 0xBC8C, 0xD3BD, + 0xBC8D, 0xD3BE, 0xBC8E, 0xD3BF, 0xBC8F, 0xD3C0, 0xBC90, 0xD3C1, + 0xBC91, 0xD3C2, 0xBC92, 0xD3C3, 0xBC93, 0xD3C6, 0xBC94, 0xD3C7, + 0xBC95, 0xD3CA, 0xBC96, 0xD3CB, 0xBC97, 0xD3CC, 0xBC98, 0xD3CD, + 0xBC99, 0xD3CE, 0xBC9A, 0xD3CF, 0xBC9B, 0xD3D1, 0xBC9C, 0xD3D2, + 0xBC9D, 0xD3D3, 0xBC9E, 0xD3D4, 0xBC9F, 0xD3D5, 0xBCA0, 0xD3D6, + 0xBCA1, 0xC0E5, 0xBCA2, 0xC0E8, 0xBCA3, 0xC0EC, 0xBCA4, 0xC0F4, + 0xBCA5, 0xC0F5, 0xBCA6, 0xC0F7, 0xBCA7, 0xC0F9, 0xBCA8, 0xC100, + 0xBCA9, 0xC104, 0xBCAA, 0xC108, 0xBCAB, 0xC110, 0xBCAC, 0xC115, + 0xBCAD, 0xC11C, 0xBCAE, 0xC11D, 0xBCAF, 0xC11E, 0xBCB0, 0xC11F, + 0xBCB1, 0xC120, 0xBCB2, 0xC123, 0xBCB3, 0xC124, 0xBCB4, 0xC126, + 0xBCB5, 0xC127, 0xBCB6, 0xC12C, 0xBCB7, 0xC12D, 0xBCB8, 0xC12F, + 0xBCB9, 0xC130, 0xBCBA, 0xC131, 0xBCBB, 0xC136, 0xBCBC, 0xC138, + 0xBCBD, 0xC139, 0xBCBE, 0xC13C, 0xBCBF, 0xC140, 0xBCC0, 0xC148, + 0xBCC1, 0xC149, 0xBCC2, 0xC14B, 0xBCC3, 0xC14C, 0xBCC4, 0xC14D, + 0xBCC5, 0xC154, 0xBCC6, 0xC155, 0xBCC7, 0xC158, 0xBCC8, 0xC15C, + 0xBCC9, 0xC164, 0xBCCA, 0xC165, 0xBCCB, 0xC167, 0xBCCC, 0xC168, + 0xBCCD, 0xC169, 0xBCCE, 0xC170, 0xBCCF, 0xC174, 0xBCD0, 0xC178, + 0xBCD1, 0xC185, 0xBCD2, 0xC18C, 0xBCD3, 0xC18D, 0xBCD4, 0xC18E, + 0xBCD5, 0xC190, 0xBCD6, 0xC194, 0xBCD7, 0xC196, 0xBCD8, 0xC19C, + 0xBCD9, 0xC19D, 0xBCDA, 0xC19F, 0xBCDB, 0xC1A1, 0xBCDC, 0xC1A5, + 0xBCDD, 0xC1A8, 0xBCDE, 0xC1A9, 0xBCDF, 0xC1AC, 0xBCE0, 0xC1B0, + 0xBCE1, 0xC1BD, 0xBCE2, 0xC1C4, 0xBCE3, 0xC1C8, 0xBCE4, 0xC1CC, + 0xBCE5, 0xC1D4, 0xBCE6, 0xC1D7, 0xBCE7, 0xC1D8, 0xBCE8, 0xC1E0, + 0xBCE9, 0xC1E4, 0xBCEA, 0xC1E8, 0xBCEB, 0xC1F0, 0xBCEC, 0xC1F1, + 0xBCED, 0xC1F3, 0xBCEE, 0xC1FC, 0xBCEF, 0xC1FD, 0xBCF0, 0xC200, + 0xBCF1, 0xC204, 0xBCF2, 0xC20C, 0xBCF3, 0xC20D, 0xBCF4, 0xC20F, + 0xBCF5, 0xC211, 0xBCF6, 0xC218, 0xBCF7, 0xC219, 0xBCF8, 0xC21C, + 0xBCF9, 0xC21F, 0xBCFA, 0xC220, 0xBCFB, 0xC228, 0xBCFC, 0xC229, + 0xBCFD, 0xC22B, 0xBCFE, 0xC22D, 0xBD41, 0xD3D7, 0xBD42, 0xD3D9, + 0xBD43, 0xD3DA, 0xBD44, 0xD3DB, 0xBD45, 0xD3DC, 0xBD46, 0xD3DD, + 0xBD47, 0xD3DE, 0xBD48, 0xD3DF, 0xBD49, 0xD3E0, 0xBD4A, 0xD3E2, + 0xBD4B, 0xD3E4, 0xBD4C, 0xD3E5, 0xBD4D, 0xD3E6, 0xBD4E, 0xD3E7, + 0xBD4F, 0xD3E8, 0xBD50, 0xD3E9, 0xBD51, 0xD3EA, 0xBD52, 0xD3EB, + 0xBD53, 0xD3EE, 0xBD54, 0xD3EF, 0xBD55, 0xD3F1, 0xBD56, 0xD3F2, + 0xBD57, 0xD3F3, 0xBD58, 0xD3F5, 0xBD59, 0xD3F6, 0xBD5A, 0xD3F7, + 0xBD61, 0xD3F8, 0xBD62, 0xD3F9, 0xBD63, 0xD3FA, 0xBD64, 0xD3FB, + 0xBD65, 0xD3FE, 0xBD66, 0xD400, 0xBD67, 0xD402, 0xBD68, 0xD403, + 0xBD69, 0xD404, 0xBD6A, 0xD405, 0xBD6B, 0xD406, 0xBD6C, 0xD407, + 0xBD6D, 0xD409, 0xBD6E, 0xD40A, 0xBD6F, 0xD40B, 0xBD70, 0xD40C, + 0xBD71, 0xD40D, 0xBD72, 0xD40E, 0xBD73, 0xD40F, 0xBD74, 0xD410, + 0xBD75, 0xD411, 0xBD76, 0xD412, 0xBD77, 0xD413, 0xBD78, 0xD414, + 0xBD79, 0xD415, 0xBD7A, 0xD416, 0xBD81, 0xD417, 0xBD82, 0xD418, + 0xBD83, 0xD419, 0xBD84, 0xD41A, 0xBD85, 0xD41B, 0xBD86, 0xD41C, + 0xBD87, 0xD41E, 0xBD88, 0xD41F, 0xBD89, 0xD420, 0xBD8A, 0xD421, + 0xBD8B, 0xD422, 0xBD8C, 0xD423, 0xBD8D, 0xD424, 0xBD8E, 0xD425, + 0xBD8F, 0xD426, 0xBD90, 0xD427, 0xBD91, 0xD428, 0xBD92, 0xD429, + 0xBD93, 0xD42A, 0xBD94, 0xD42B, 0xBD95, 0xD42C, 0xBD96, 0xD42D, + 0xBD97, 0xD42E, 0xBD98, 0xD42F, 0xBD99, 0xD430, 0xBD9A, 0xD431, + 0xBD9B, 0xD432, 0xBD9C, 0xD433, 0xBD9D, 0xD434, 0xBD9E, 0xD435, + 0xBD9F, 0xD436, 0xBDA0, 0xD437, 0xBDA1, 0xC22F, 0xBDA2, 0xC231, + 0xBDA3, 0xC232, 0xBDA4, 0xC234, 0xBDA5, 0xC248, 0xBDA6, 0xC250, + 0xBDA7, 0xC251, 0xBDA8, 0xC254, 0xBDA9, 0xC258, 0xBDAA, 0xC260, + 0xBDAB, 0xC265, 0xBDAC, 0xC26C, 0xBDAD, 0xC26D, 0xBDAE, 0xC270, + 0xBDAF, 0xC274, 0xBDB0, 0xC27C, 0xBDB1, 0xC27D, 0xBDB2, 0xC27F, + 0xBDB3, 0xC281, 0xBDB4, 0xC288, 0xBDB5, 0xC289, 0xBDB6, 0xC290, + 0xBDB7, 0xC298, 0xBDB8, 0xC29B, 0xBDB9, 0xC29D, 0xBDBA, 0xC2A4, + 0xBDBB, 0xC2A5, 0xBDBC, 0xC2A8, 0xBDBD, 0xC2AC, 0xBDBE, 0xC2AD, + 0xBDBF, 0xC2B4, 0xBDC0, 0xC2B5, 0xBDC1, 0xC2B7, 0xBDC2, 0xC2B9, + 0xBDC3, 0xC2DC, 0xBDC4, 0xC2DD, 0xBDC5, 0xC2E0, 0xBDC6, 0xC2E3, + 0xBDC7, 0xC2E4, 0xBDC8, 0xC2EB, 0xBDC9, 0xC2EC, 0xBDCA, 0xC2ED, + 0xBDCB, 0xC2EF, 0xBDCC, 0xC2F1, 0xBDCD, 0xC2F6, 0xBDCE, 0xC2F8, + 0xBDCF, 0xC2F9, 0xBDD0, 0xC2FB, 0xBDD1, 0xC2FC, 0xBDD2, 0xC300, + 0xBDD3, 0xC308, 0xBDD4, 0xC309, 0xBDD5, 0xC30C, 0xBDD6, 0xC30D, + 0xBDD7, 0xC313, 0xBDD8, 0xC314, 0xBDD9, 0xC315, 0xBDDA, 0xC318, + 0xBDDB, 0xC31C, 0xBDDC, 0xC324, 0xBDDD, 0xC325, 0xBDDE, 0xC328, + 0xBDDF, 0xC329, 0xBDE0, 0xC345, 0xBDE1, 0xC368, 0xBDE2, 0xC369, + 0xBDE3, 0xC36C, 0xBDE4, 0xC370, 0xBDE5, 0xC372, 0xBDE6, 0xC378, + 0xBDE7, 0xC379, 0xBDE8, 0xC37C, 0xBDE9, 0xC37D, 0xBDEA, 0xC384, + 0xBDEB, 0xC388, 0xBDEC, 0xC38C, 0xBDED, 0xC3C0, 0xBDEE, 0xC3D8, + 0xBDEF, 0xC3D9, 0xBDF0, 0xC3DC, 0xBDF1, 0xC3DF, 0xBDF2, 0xC3E0, + 0xBDF3, 0xC3E2, 0xBDF4, 0xC3E8, 0xBDF5, 0xC3E9, 0xBDF6, 0xC3ED, + 0xBDF7, 0xC3F4, 0xBDF8, 0xC3F5, 0xBDF9, 0xC3F8, 0xBDFA, 0xC408, + 0xBDFB, 0xC410, 0xBDFC, 0xC424, 0xBDFD, 0xC42C, 0xBDFE, 0xC430, + 0xBE41, 0xD438, 0xBE42, 0xD439, 0xBE43, 0xD43A, 0xBE44, 0xD43B, + 0xBE45, 0xD43C, 0xBE46, 0xD43D, 0xBE47, 0xD43E, 0xBE48, 0xD43F, + 0xBE49, 0xD441, 0xBE4A, 0xD442, 0xBE4B, 0xD443, 0xBE4C, 0xD445, + 0xBE4D, 0xD446, 0xBE4E, 0xD447, 0xBE4F, 0xD448, 0xBE50, 0xD449, + 0xBE51, 0xD44A, 0xBE52, 0xD44B, 0xBE53, 0xD44C, 0xBE54, 0xD44D, + 0xBE55, 0xD44E, 0xBE56, 0xD44F, 0xBE57, 0xD450, 0xBE58, 0xD451, + 0xBE59, 0xD452, 0xBE5A, 0xD453, 0xBE61, 0xD454, 0xBE62, 0xD455, + 0xBE63, 0xD456, 0xBE64, 0xD457, 0xBE65, 0xD458, 0xBE66, 0xD459, + 0xBE67, 0xD45A, 0xBE68, 0xD45B, 0xBE69, 0xD45D, 0xBE6A, 0xD45E, + 0xBE6B, 0xD45F, 0xBE6C, 0xD461, 0xBE6D, 0xD462, 0xBE6E, 0xD463, + 0xBE6F, 0xD465, 0xBE70, 0xD466, 0xBE71, 0xD467, 0xBE72, 0xD468, + 0xBE73, 0xD469, 0xBE74, 0xD46A, 0xBE75, 0xD46B, 0xBE76, 0xD46C, + 0xBE77, 0xD46E, 0xBE78, 0xD470, 0xBE79, 0xD471, 0xBE7A, 0xD472, + 0xBE81, 0xD473, 0xBE82, 0xD474, 0xBE83, 0xD475, 0xBE84, 0xD476, + 0xBE85, 0xD477, 0xBE86, 0xD47A, 0xBE87, 0xD47B, 0xBE88, 0xD47D, + 0xBE89, 0xD47E, 0xBE8A, 0xD481, 0xBE8B, 0xD483, 0xBE8C, 0xD484, + 0xBE8D, 0xD485, 0xBE8E, 0xD486, 0xBE8F, 0xD487, 0xBE90, 0xD48A, + 0xBE91, 0xD48C, 0xBE92, 0xD48E, 0xBE93, 0xD48F, 0xBE94, 0xD490, + 0xBE95, 0xD491, 0xBE96, 0xD492, 0xBE97, 0xD493, 0xBE98, 0xD495, + 0xBE99, 0xD496, 0xBE9A, 0xD497, 0xBE9B, 0xD498, 0xBE9C, 0xD499, + 0xBE9D, 0xD49A, 0xBE9E, 0xD49B, 0xBE9F, 0xD49C, 0xBEA0, 0xD49D, + 0xBEA1, 0xC434, 0xBEA2, 0xC43C, 0xBEA3, 0xC43D, 0xBEA4, 0xC448, + 0xBEA5, 0xC464, 0xBEA6, 0xC465, 0xBEA7, 0xC468, 0xBEA8, 0xC46C, + 0xBEA9, 0xC474, 0xBEAA, 0xC475, 0xBEAB, 0xC479, 0xBEAC, 0xC480, + 0xBEAD, 0xC494, 0xBEAE, 0xC49C, 0xBEAF, 0xC4B8, 0xBEB0, 0xC4BC, + 0xBEB1, 0xC4E9, 0xBEB2, 0xC4F0, 0xBEB3, 0xC4F1, 0xBEB4, 0xC4F4, + 0xBEB5, 0xC4F8, 0xBEB6, 0xC4FA, 0xBEB7, 0xC4FF, 0xBEB8, 0xC500, + 0xBEB9, 0xC501, 0xBEBA, 0xC50C, 0xBEBB, 0xC510, 0xBEBC, 0xC514, + 0xBEBD, 0xC51C, 0xBEBE, 0xC528, 0xBEBF, 0xC529, 0xBEC0, 0xC52C, + 0xBEC1, 0xC530, 0xBEC2, 0xC538, 0xBEC3, 0xC539, 0xBEC4, 0xC53B, + 0xBEC5, 0xC53D, 0xBEC6, 0xC544, 0xBEC7, 0xC545, 0xBEC8, 0xC548, + 0xBEC9, 0xC549, 0xBECA, 0xC54A, 0xBECB, 0xC54C, 0xBECC, 0xC54D, + 0xBECD, 0xC54E, 0xBECE, 0xC553, 0xBECF, 0xC554, 0xBED0, 0xC555, + 0xBED1, 0xC557, 0xBED2, 0xC558, 0xBED3, 0xC559, 0xBED4, 0xC55D, + 0xBED5, 0xC55E, 0xBED6, 0xC560, 0xBED7, 0xC561, 0xBED8, 0xC564, + 0xBED9, 0xC568, 0xBEDA, 0xC570, 0xBEDB, 0xC571, 0xBEDC, 0xC573, + 0xBEDD, 0xC574, 0xBEDE, 0xC575, 0xBEDF, 0xC57C, 0xBEE0, 0xC57D, + 0xBEE1, 0xC580, 0xBEE2, 0xC584, 0xBEE3, 0xC587, 0xBEE4, 0xC58C, + 0xBEE5, 0xC58D, 0xBEE6, 0xC58F, 0xBEE7, 0xC591, 0xBEE8, 0xC595, + 0xBEE9, 0xC597, 0xBEEA, 0xC598, 0xBEEB, 0xC59C, 0xBEEC, 0xC5A0, + 0xBEED, 0xC5A9, 0xBEEE, 0xC5B4, 0xBEEF, 0xC5B5, 0xBEF0, 0xC5B8, + 0xBEF1, 0xC5B9, 0xBEF2, 0xC5BB, 0xBEF3, 0xC5BC, 0xBEF4, 0xC5BD, + 0xBEF5, 0xC5BE, 0xBEF6, 0xC5C4, 0xBEF7, 0xC5C5, 0xBEF8, 0xC5C6, + 0xBEF9, 0xC5C7, 0xBEFA, 0xC5C8, 0xBEFB, 0xC5C9, 0xBEFC, 0xC5CA, + 0xBEFD, 0xC5CC, 0xBEFE, 0xC5CE, 0xBF41, 0xD49E, 0xBF42, 0xD49F, + 0xBF43, 0xD4A0, 0xBF44, 0xD4A1, 0xBF45, 0xD4A2, 0xBF46, 0xD4A3, + 0xBF47, 0xD4A4, 0xBF48, 0xD4A5, 0xBF49, 0xD4A6, 0xBF4A, 0xD4A7, + 0xBF4B, 0xD4A8, 0xBF4C, 0xD4AA, 0xBF4D, 0xD4AB, 0xBF4E, 0xD4AC, + 0xBF4F, 0xD4AD, 0xBF50, 0xD4AE, 0xBF51, 0xD4AF, 0xBF52, 0xD4B0, + 0xBF53, 0xD4B1, 0xBF54, 0xD4B2, 0xBF55, 0xD4B3, 0xBF56, 0xD4B4, + 0xBF57, 0xD4B5, 0xBF58, 0xD4B6, 0xBF59, 0xD4B7, 0xBF5A, 0xD4B8, + 0xBF61, 0xD4B9, 0xBF62, 0xD4BA, 0xBF63, 0xD4BB, 0xBF64, 0xD4BC, + 0xBF65, 0xD4BD, 0xBF66, 0xD4BE, 0xBF67, 0xD4BF, 0xBF68, 0xD4C0, + 0xBF69, 0xD4C1, 0xBF6A, 0xD4C2, 0xBF6B, 0xD4C3, 0xBF6C, 0xD4C4, + 0xBF6D, 0xD4C5, 0xBF6E, 0xD4C6, 0xBF6F, 0xD4C7, 0xBF70, 0xD4C8, + 0xBF71, 0xD4C9, 0xBF72, 0xD4CA, 0xBF73, 0xD4CB, 0xBF74, 0xD4CD, + 0xBF75, 0xD4CE, 0xBF76, 0xD4CF, 0xBF77, 0xD4D1, 0xBF78, 0xD4D2, + 0xBF79, 0xD4D3, 0xBF7A, 0xD4D5, 0xBF81, 0xD4D6, 0xBF82, 0xD4D7, + 0xBF83, 0xD4D8, 0xBF84, 0xD4D9, 0xBF85, 0xD4DA, 0xBF86, 0xD4DB, + 0xBF87, 0xD4DD, 0xBF88, 0xD4DE, 0xBF89, 0xD4E0, 0xBF8A, 0xD4E1, + 0xBF8B, 0xD4E2, 0xBF8C, 0xD4E3, 0xBF8D, 0xD4E4, 0xBF8E, 0xD4E5, + 0xBF8F, 0xD4E6, 0xBF90, 0xD4E7, 0xBF91, 0xD4E9, 0xBF92, 0xD4EA, + 0xBF93, 0xD4EB, 0xBF94, 0xD4ED, 0xBF95, 0xD4EE, 0xBF96, 0xD4EF, + 0xBF97, 0xD4F1, 0xBF98, 0xD4F2, 0xBF99, 0xD4F3, 0xBF9A, 0xD4F4, + 0xBF9B, 0xD4F5, 0xBF9C, 0xD4F6, 0xBF9D, 0xD4F7, 0xBF9E, 0xD4F9, + 0xBF9F, 0xD4FA, 0xBFA0, 0xD4FC, 0xBFA1, 0xC5D0, 0xBFA2, 0xC5D1, + 0xBFA3, 0xC5D4, 0xBFA4, 0xC5D8, 0xBFA5, 0xC5E0, 0xBFA6, 0xC5E1, + 0xBFA7, 0xC5E3, 0xBFA8, 0xC5E5, 0xBFA9, 0xC5EC, 0xBFAA, 0xC5ED, + 0xBFAB, 0xC5EE, 0xBFAC, 0xC5F0, 0xBFAD, 0xC5F4, 0xBFAE, 0xC5F6, + 0xBFAF, 0xC5F7, 0xBFB0, 0xC5FC, 0xBFB1, 0xC5FD, 0xBFB2, 0xC5FE, + 0xBFB3, 0xC5FF, 0xBFB4, 0xC600, 0xBFB5, 0xC601, 0xBFB6, 0xC605, + 0xBFB7, 0xC606, 0xBFB8, 0xC607, 0xBFB9, 0xC608, 0xBFBA, 0xC60C, + 0xBFBB, 0xC610, 0xBFBC, 0xC618, 0xBFBD, 0xC619, 0xBFBE, 0xC61B, + 0xBFBF, 0xC61C, 0xBFC0, 0xC624, 0xBFC1, 0xC625, 0xBFC2, 0xC628, + 0xBFC3, 0xC62C, 0xBFC4, 0xC62D, 0xBFC5, 0xC62E, 0xBFC6, 0xC630, + 0xBFC7, 0xC633, 0xBFC8, 0xC634, 0xBFC9, 0xC635, 0xBFCA, 0xC637, + 0xBFCB, 0xC639, 0xBFCC, 0xC63B, 0xBFCD, 0xC640, 0xBFCE, 0xC641, + 0xBFCF, 0xC644, 0xBFD0, 0xC648, 0xBFD1, 0xC650, 0xBFD2, 0xC651, + 0xBFD3, 0xC653, 0xBFD4, 0xC654, 0xBFD5, 0xC655, 0xBFD6, 0xC65C, + 0xBFD7, 0xC65D, 0xBFD8, 0xC660, 0xBFD9, 0xC66C, 0xBFDA, 0xC66F, + 0xBFDB, 0xC671, 0xBFDC, 0xC678, 0xBFDD, 0xC679, 0xBFDE, 0xC67C, + 0xBFDF, 0xC680, 0xBFE0, 0xC688, 0xBFE1, 0xC689, 0xBFE2, 0xC68B, + 0xBFE3, 0xC68D, 0xBFE4, 0xC694, 0xBFE5, 0xC695, 0xBFE6, 0xC698, + 0xBFE7, 0xC69C, 0xBFE8, 0xC6A4, 0xBFE9, 0xC6A5, 0xBFEA, 0xC6A7, + 0xBFEB, 0xC6A9, 0xBFEC, 0xC6B0, 0xBFED, 0xC6B1, 0xBFEE, 0xC6B4, + 0xBFEF, 0xC6B8, 0xBFF0, 0xC6B9, 0xBFF1, 0xC6BA, 0xBFF2, 0xC6C0, + 0xBFF3, 0xC6C1, 0xBFF4, 0xC6C3, 0xBFF5, 0xC6C5, 0xBFF6, 0xC6CC, + 0xBFF7, 0xC6CD, 0xBFF8, 0xC6D0, 0xBFF9, 0xC6D4, 0xBFFA, 0xC6DC, + 0xBFFB, 0xC6DD, 0xBFFC, 0xC6E0, 0xBFFD, 0xC6E1, 0xBFFE, 0xC6E8, + 0xC041, 0xD4FE, 0xC042, 0xD4FF, 0xC043, 0xD500, 0xC044, 0xD501, + 0xC045, 0xD502, 0xC046, 0xD503, 0xC047, 0xD505, 0xC048, 0xD506, + 0xC049, 0xD507, 0xC04A, 0xD509, 0xC04B, 0xD50A, 0xC04C, 0xD50B, + 0xC04D, 0xD50D, 0xC04E, 0xD50E, 0xC04F, 0xD50F, 0xC050, 0xD510, + 0xC051, 0xD511, 0xC052, 0xD512, 0xC053, 0xD513, 0xC054, 0xD516, + 0xC055, 0xD518, 0xC056, 0xD519, 0xC057, 0xD51A, 0xC058, 0xD51B, + 0xC059, 0xD51C, 0xC05A, 0xD51D, 0xC061, 0xD51E, 0xC062, 0xD51F, + 0xC063, 0xD520, 0xC064, 0xD521, 0xC065, 0xD522, 0xC066, 0xD523, + 0xC067, 0xD524, 0xC068, 0xD525, 0xC069, 0xD526, 0xC06A, 0xD527, + 0xC06B, 0xD528, 0xC06C, 0xD529, 0xC06D, 0xD52A, 0xC06E, 0xD52B, + 0xC06F, 0xD52C, 0xC070, 0xD52D, 0xC071, 0xD52E, 0xC072, 0xD52F, + 0xC073, 0xD530, 0xC074, 0xD531, 0xC075, 0xD532, 0xC076, 0xD533, + 0xC077, 0xD534, 0xC078, 0xD535, 0xC079, 0xD536, 0xC07A, 0xD537, + 0xC081, 0xD538, 0xC082, 0xD539, 0xC083, 0xD53A, 0xC084, 0xD53B, + 0xC085, 0xD53E, 0xC086, 0xD53F, 0xC087, 0xD541, 0xC088, 0xD542, + 0xC089, 0xD543, 0xC08A, 0xD545, 0xC08B, 0xD546, 0xC08C, 0xD547, + 0xC08D, 0xD548, 0xC08E, 0xD549, 0xC08F, 0xD54A, 0xC090, 0xD54B, + 0xC091, 0xD54E, 0xC092, 0xD550, 0xC093, 0xD552, 0xC094, 0xD553, + 0xC095, 0xD554, 0xC096, 0xD555, 0xC097, 0xD556, 0xC098, 0xD557, + 0xC099, 0xD55A, 0xC09A, 0xD55B, 0xC09B, 0xD55D, 0xC09C, 0xD55E, + 0xC09D, 0xD55F, 0xC09E, 0xD561, 0xC09F, 0xD562, 0xC0A0, 0xD563, + 0xC0A1, 0xC6E9, 0xC0A2, 0xC6EC, 0xC0A3, 0xC6F0, 0xC0A4, 0xC6F8, + 0xC0A5, 0xC6F9, 0xC0A6, 0xC6FD, 0xC0A7, 0xC704, 0xC0A8, 0xC705, + 0xC0A9, 0xC708, 0xC0AA, 0xC70C, 0xC0AB, 0xC714, 0xC0AC, 0xC715, + 0xC0AD, 0xC717, 0xC0AE, 0xC719, 0xC0AF, 0xC720, 0xC0B0, 0xC721, + 0xC0B1, 0xC724, 0xC0B2, 0xC728, 0xC0B3, 0xC730, 0xC0B4, 0xC731, + 0xC0B5, 0xC733, 0xC0B6, 0xC735, 0xC0B7, 0xC737, 0xC0B8, 0xC73C, + 0xC0B9, 0xC73D, 0xC0BA, 0xC740, 0xC0BB, 0xC744, 0xC0BC, 0xC74A, + 0xC0BD, 0xC74C, 0xC0BE, 0xC74D, 0xC0BF, 0xC74F, 0xC0C0, 0xC751, + 0xC0C1, 0xC752, 0xC0C2, 0xC753, 0xC0C3, 0xC754, 0xC0C4, 0xC755, + 0xC0C5, 0xC756, 0xC0C6, 0xC757, 0xC0C7, 0xC758, 0xC0C8, 0xC75C, + 0xC0C9, 0xC760, 0xC0CA, 0xC768, 0xC0CB, 0xC76B, 0xC0CC, 0xC774, + 0xC0CD, 0xC775, 0xC0CE, 0xC778, 0xC0CF, 0xC77C, 0xC0D0, 0xC77D, + 0xC0D1, 0xC77E, 0xC0D2, 0xC783, 0xC0D3, 0xC784, 0xC0D4, 0xC785, + 0xC0D5, 0xC787, 0xC0D6, 0xC788, 0xC0D7, 0xC789, 0xC0D8, 0xC78A, + 0xC0D9, 0xC78E, 0xC0DA, 0xC790, 0xC0DB, 0xC791, 0xC0DC, 0xC794, + 0xC0DD, 0xC796, 0xC0DE, 0xC797, 0xC0DF, 0xC798, 0xC0E0, 0xC79A, + 0xC0E1, 0xC7A0, 0xC0E2, 0xC7A1, 0xC0E3, 0xC7A3, 0xC0E4, 0xC7A4, + 0xC0E5, 0xC7A5, 0xC0E6, 0xC7A6, 0xC0E7, 0xC7AC, 0xC0E8, 0xC7AD, + 0xC0E9, 0xC7B0, 0xC0EA, 0xC7B4, 0xC0EB, 0xC7BC, 0xC0EC, 0xC7BD, + 0xC0ED, 0xC7BF, 0xC0EE, 0xC7C0, 0xC0EF, 0xC7C1, 0xC0F0, 0xC7C8, + 0xC0F1, 0xC7C9, 0xC0F2, 0xC7CC, 0xC0F3, 0xC7CE, 0xC0F4, 0xC7D0, + 0xC0F5, 0xC7D8, 0xC0F6, 0xC7DD, 0xC0F7, 0xC7E4, 0xC0F8, 0xC7E8, + 0xC0F9, 0xC7EC, 0xC0FA, 0xC800, 0xC0FB, 0xC801, 0xC0FC, 0xC804, + 0xC0FD, 0xC808, 0xC0FE, 0xC80A, 0xC141, 0xD564, 0xC142, 0xD566, + 0xC143, 0xD567, 0xC144, 0xD56A, 0xC145, 0xD56C, 0xC146, 0xD56E, + 0xC147, 0xD56F, 0xC148, 0xD570, 0xC149, 0xD571, 0xC14A, 0xD572, + 0xC14B, 0xD573, 0xC14C, 0xD576, 0xC14D, 0xD577, 0xC14E, 0xD579, + 0xC14F, 0xD57A, 0xC150, 0xD57B, 0xC151, 0xD57D, 0xC152, 0xD57E, + 0xC153, 0xD57F, 0xC154, 0xD580, 0xC155, 0xD581, 0xC156, 0xD582, + 0xC157, 0xD583, 0xC158, 0xD586, 0xC159, 0xD58A, 0xC15A, 0xD58B, + 0xC161, 0xD58C, 0xC162, 0xD58D, 0xC163, 0xD58E, 0xC164, 0xD58F, + 0xC165, 0xD591, 0xC166, 0xD592, 0xC167, 0xD593, 0xC168, 0xD594, + 0xC169, 0xD595, 0xC16A, 0xD596, 0xC16B, 0xD597, 0xC16C, 0xD598, + 0xC16D, 0xD599, 0xC16E, 0xD59A, 0xC16F, 0xD59B, 0xC170, 0xD59C, + 0xC171, 0xD59D, 0xC172, 0xD59E, 0xC173, 0xD59F, 0xC174, 0xD5A0, + 0xC175, 0xD5A1, 0xC176, 0xD5A2, 0xC177, 0xD5A3, 0xC178, 0xD5A4, + 0xC179, 0xD5A6, 0xC17A, 0xD5A7, 0xC181, 0xD5A8, 0xC182, 0xD5A9, + 0xC183, 0xD5AA, 0xC184, 0xD5AB, 0xC185, 0xD5AC, 0xC186, 0xD5AD, + 0xC187, 0xD5AE, 0xC188, 0xD5AF, 0xC189, 0xD5B0, 0xC18A, 0xD5B1, + 0xC18B, 0xD5B2, 0xC18C, 0xD5B3, 0xC18D, 0xD5B4, 0xC18E, 0xD5B5, + 0xC18F, 0xD5B6, 0xC190, 0xD5B7, 0xC191, 0xD5B8, 0xC192, 0xD5B9, + 0xC193, 0xD5BA, 0xC194, 0xD5BB, 0xC195, 0xD5BC, 0xC196, 0xD5BD, + 0xC197, 0xD5BE, 0xC198, 0xD5BF, 0xC199, 0xD5C0, 0xC19A, 0xD5C1, + 0xC19B, 0xD5C2, 0xC19C, 0xD5C3, 0xC19D, 0xD5C4, 0xC19E, 0xD5C5, + 0xC19F, 0xD5C6, 0xC1A0, 0xD5C7, 0xC1A1, 0xC810, 0xC1A2, 0xC811, + 0xC1A3, 0xC813, 0xC1A4, 0xC815, 0xC1A5, 0xC816, 0xC1A6, 0xC81C, + 0xC1A7, 0xC81D, 0xC1A8, 0xC820, 0xC1A9, 0xC824, 0xC1AA, 0xC82C, + 0xC1AB, 0xC82D, 0xC1AC, 0xC82F, 0xC1AD, 0xC831, 0xC1AE, 0xC838, + 0xC1AF, 0xC83C, 0xC1B0, 0xC840, 0xC1B1, 0xC848, 0xC1B2, 0xC849, + 0xC1B3, 0xC84C, 0xC1B4, 0xC84D, 0xC1B5, 0xC854, 0xC1B6, 0xC870, + 0xC1B7, 0xC871, 0xC1B8, 0xC874, 0xC1B9, 0xC878, 0xC1BA, 0xC87A, + 0xC1BB, 0xC880, 0xC1BC, 0xC881, 0xC1BD, 0xC883, 0xC1BE, 0xC885, + 0xC1BF, 0xC886, 0xC1C0, 0xC887, 0xC1C1, 0xC88B, 0xC1C2, 0xC88C, + 0xC1C3, 0xC88D, 0xC1C4, 0xC894, 0xC1C5, 0xC89D, 0xC1C6, 0xC89F, + 0xC1C7, 0xC8A1, 0xC1C8, 0xC8A8, 0xC1C9, 0xC8BC, 0xC1CA, 0xC8BD, + 0xC1CB, 0xC8C4, 0xC1CC, 0xC8C8, 0xC1CD, 0xC8CC, 0xC1CE, 0xC8D4, + 0xC1CF, 0xC8D5, 0xC1D0, 0xC8D7, 0xC1D1, 0xC8D9, 0xC1D2, 0xC8E0, + 0xC1D3, 0xC8E1, 0xC1D4, 0xC8E4, 0xC1D5, 0xC8F5, 0xC1D6, 0xC8FC, + 0xC1D7, 0xC8FD, 0xC1D8, 0xC900, 0xC1D9, 0xC904, 0xC1DA, 0xC905, + 0xC1DB, 0xC906, 0xC1DC, 0xC90C, 0xC1DD, 0xC90D, 0xC1DE, 0xC90F, + 0xC1DF, 0xC911, 0xC1E0, 0xC918, 0xC1E1, 0xC92C, 0xC1E2, 0xC934, + 0xC1E3, 0xC950, 0xC1E4, 0xC951, 0xC1E5, 0xC954, 0xC1E6, 0xC958, + 0xC1E7, 0xC960, 0xC1E8, 0xC961, 0xC1E9, 0xC963, 0xC1EA, 0xC96C, + 0xC1EB, 0xC970, 0xC1EC, 0xC974, 0xC1ED, 0xC97C, 0xC1EE, 0xC988, + 0xC1EF, 0xC989, 0xC1F0, 0xC98C, 0xC1F1, 0xC990, 0xC1F2, 0xC998, + 0xC1F3, 0xC999, 0xC1F4, 0xC99B, 0xC1F5, 0xC99D, 0xC1F6, 0xC9C0, + 0xC1F7, 0xC9C1, 0xC1F8, 0xC9C4, 0xC1F9, 0xC9C7, 0xC1FA, 0xC9C8, + 0xC1FB, 0xC9CA, 0xC1FC, 0xC9D0, 0xC1FD, 0xC9D1, 0xC1FE, 0xC9D3, + 0xC241, 0xD5CA, 0xC242, 0xD5CB, 0xC243, 0xD5CD, 0xC244, 0xD5CE, + 0xC245, 0xD5CF, 0xC246, 0xD5D1, 0xC247, 0xD5D3, 0xC248, 0xD5D4, + 0xC249, 0xD5D5, 0xC24A, 0xD5D6, 0xC24B, 0xD5D7, 0xC24C, 0xD5DA, + 0xC24D, 0xD5DC, 0xC24E, 0xD5DE, 0xC24F, 0xD5DF, 0xC250, 0xD5E0, + 0xC251, 0xD5E1, 0xC252, 0xD5E2, 0xC253, 0xD5E3, 0xC254, 0xD5E6, + 0xC255, 0xD5E7, 0xC256, 0xD5E9, 0xC257, 0xD5EA, 0xC258, 0xD5EB, + 0xC259, 0xD5ED, 0xC25A, 0xD5EE, 0xC261, 0xD5EF, 0xC262, 0xD5F0, + 0xC263, 0xD5F1, 0xC264, 0xD5F2, 0xC265, 0xD5F3, 0xC266, 0xD5F6, + 0xC267, 0xD5F8, 0xC268, 0xD5FA, 0xC269, 0xD5FB, 0xC26A, 0xD5FC, + 0xC26B, 0xD5FD, 0xC26C, 0xD5FE, 0xC26D, 0xD5FF, 0xC26E, 0xD602, + 0xC26F, 0xD603, 0xC270, 0xD605, 0xC271, 0xD606, 0xC272, 0xD607, + 0xC273, 0xD609, 0xC274, 0xD60A, 0xC275, 0xD60B, 0xC276, 0xD60C, + 0xC277, 0xD60D, 0xC278, 0xD60E, 0xC279, 0xD60F, 0xC27A, 0xD612, + 0xC281, 0xD616, 0xC282, 0xD617, 0xC283, 0xD618, 0xC284, 0xD619, + 0xC285, 0xD61A, 0xC286, 0xD61B, 0xC287, 0xD61D, 0xC288, 0xD61E, + 0xC289, 0xD61F, 0xC28A, 0xD621, 0xC28B, 0xD622, 0xC28C, 0xD623, + 0xC28D, 0xD625, 0xC28E, 0xD626, 0xC28F, 0xD627, 0xC290, 0xD628, + 0xC291, 0xD629, 0xC292, 0xD62A, 0xC293, 0xD62B, 0xC294, 0xD62C, + 0xC295, 0xD62E, 0xC296, 0xD62F, 0xC297, 0xD630, 0xC298, 0xD631, + 0xC299, 0xD632, 0xC29A, 0xD633, 0xC29B, 0xD634, 0xC29C, 0xD635, + 0xC29D, 0xD636, 0xC29E, 0xD637, 0xC29F, 0xD63A, 0xC2A0, 0xD63B, + 0xC2A1, 0xC9D5, 0xC2A2, 0xC9D6, 0xC2A3, 0xC9D9, 0xC2A4, 0xC9DA, + 0xC2A5, 0xC9DC, 0xC2A6, 0xC9DD, 0xC2A7, 0xC9E0, 0xC2A8, 0xC9E2, + 0xC2A9, 0xC9E4, 0xC2AA, 0xC9E7, 0xC2AB, 0xC9EC, 0xC2AC, 0xC9ED, + 0xC2AD, 0xC9EF, 0xC2AE, 0xC9F0, 0xC2AF, 0xC9F1, 0xC2B0, 0xC9F8, + 0xC2B1, 0xC9F9, 0xC2B2, 0xC9FC, 0xC2B3, 0xCA00, 0xC2B4, 0xCA08, + 0xC2B5, 0xCA09, 0xC2B6, 0xCA0B, 0xC2B7, 0xCA0C, 0xC2B8, 0xCA0D, + 0xC2B9, 0xCA14, 0xC2BA, 0xCA18, 0xC2BB, 0xCA29, 0xC2BC, 0xCA4C, + 0xC2BD, 0xCA4D, 0xC2BE, 0xCA50, 0xC2BF, 0xCA54, 0xC2C0, 0xCA5C, + 0xC2C1, 0xCA5D, 0xC2C2, 0xCA5F, 0xC2C3, 0xCA60, 0xC2C4, 0xCA61, + 0xC2C5, 0xCA68, 0xC2C6, 0xCA7D, 0xC2C7, 0xCA84, 0xC2C8, 0xCA98, + 0xC2C9, 0xCABC, 0xC2CA, 0xCABD, 0xC2CB, 0xCAC0, 0xC2CC, 0xCAC4, + 0xC2CD, 0xCACC, 0xC2CE, 0xCACD, 0xC2CF, 0xCACF, 0xC2D0, 0xCAD1, + 0xC2D1, 0xCAD3, 0xC2D2, 0xCAD8, 0xC2D3, 0xCAD9, 0xC2D4, 0xCAE0, + 0xC2D5, 0xCAEC, 0xC2D6, 0xCAF4, 0xC2D7, 0xCB08, 0xC2D8, 0xCB10, + 0xC2D9, 0xCB14, 0xC2DA, 0xCB18, 0xC2DB, 0xCB20, 0xC2DC, 0xCB21, + 0xC2DD, 0xCB41, 0xC2DE, 0xCB48, 0xC2DF, 0xCB49, 0xC2E0, 0xCB4C, + 0xC2E1, 0xCB50, 0xC2E2, 0xCB58, 0xC2E3, 0xCB59, 0xC2E4, 0xCB5D, + 0xC2E5, 0xCB64, 0xC2E6, 0xCB78, 0xC2E7, 0xCB79, 0xC2E8, 0xCB9C, + 0xC2E9, 0xCBB8, 0xC2EA, 0xCBD4, 0xC2EB, 0xCBE4, 0xC2EC, 0xCBE7, + 0xC2ED, 0xCBE9, 0xC2EE, 0xCC0C, 0xC2EF, 0xCC0D, 0xC2F0, 0xCC10, + 0xC2F1, 0xCC14, 0xC2F2, 0xCC1C, 0xC2F3, 0xCC1D, 0xC2F4, 0xCC21, + 0xC2F5, 0xCC22, 0xC2F6, 0xCC27, 0xC2F7, 0xCC28, 0xC2F8, 0xCC29, + 0xC2F9, 0xCC2C, 0xC2FA, 0xCC2E, 0xC2FB, 0xCC30, 0xC2FC, 0xCC38, + 0xC2FD, 0xCC39, 0xC2FE, 0xCC3B, 0xC341, 0xD63D, 0xC342, 0xD63E, + 0xC343, 0xD63F, 0xC344, 0xD641, 0xC345, 0xD642, 0xC346, 0xD643, + 0xC347, 0xD644, 0xC348, 0xD646, 0xC349, 0xD647, 0xC34A, 0xD64A, + 0xC34B, 0xD64C, 0xC34C, 0xD64E, 0xC34D, 0xD64F, 0xC34E, 0xD650, + 0xC34F, 0xD652, 0xC350, 0xD653, 0xC351, 0xD656, 0xC352, 0xD657, + 0xC353, 0xD659, 0xC354, 0xD65A, 0xC355, 0xD65B, 0xC356, 0xD65D, + 0xC357, 0xD65E, 0xC358, 0xD65F, 0xC359, 0xD660, 0xC35A, 0xD661, + 0xC361, 0xD662, 0xC362, 0xD663, 0xC363, 0xD664, 0xC364, 0xD665, + 0xC365, 0xD666, 0xC366, 0xD668, 0xC367, 0xD66A, 0xC368, 0xD66B, + 0xC369, 0xD66C, 0xC36A, 0xD66D, 0xC36B, 0xD66E, 0xC36C, 0xD66F, + 0xC36D, 0xD672, 0xC36E, 0xD673, 0xC36F, 0xD675, 0xC370, 0xD676, + 0xC371, 0xD677, 0xC372, 0xD678, 0xC373, 0xD679, 0xC374, 0xD67A, + 0xC375, 0xD67B, 0xC376, 0xD67C, 0xC377, 0xD67D, 0xC378, 0xD67E, + 0xC379, 0xD67F, 0xC37A, 0xD680, 0xC381, 0xD681, 0xC382, 0xD682, + 0xC383, 0xD684, 0xC384, 0xD686, 0xC385, 0xD687, 0xC386, 0xD688, + 0xC387, 0xD689, 0xC388, 0xD68A, 0xC389, 0xD68B, 0xC38A, 0xD68E, + 0xC38B, 0xD68F, 0xC38C, 0xD691, 0xC38D, 0xD692, 0xC38E, 0xD693, + 0xC38F, 0xD695, 0xC390, 0xD696, 0xC391, 0xD697, 0xC392, 0xD698, + 0xC393, 0xD699, 0xC394, 0xD69A, 0xC395, 0xD69B, 0xC396, 0xD69C, + 0xC397, 0xD69E, 0xC398, 0xD6A0, 0xC399, 0xD6A2, 0xC39A, 0xD6A3, + 0xC39B, 0xD6A4, 0xC39C, 0xD6A5, 0xC39D, 0xD6A6, 0xC39E, 0xD6A7, + 0xC39F, 0xD6A9, 0xC3A0, 0xD6AA, 0xC3A1, 0xCC3C, 0xC3A2, 0xCC3D, + 0xC3A3, 0xCC3E, 0xC3A4, 0xCC44, 0xC3A5, 0xCC45, 0xC3A6, 0xCC48, + 0xC3A7, 0xCC4C, 0xC3A8, 0xCC54, 0xC3A9, 0xCC55, 0xC3AA, 0xCC57, + 0xC3AB, 0xCC58, 0xC3AC, 0xCC59, 0xC3AD, 0xCC60, 0xC3AE, 0xCC64, + 0xC3AF, 0xCC66, 0xC3B0, 0xCC68, 0xC3B1, 0xCC70, 0xC3B2, 0xCC75, + 0xC3B3, 0xCC98, 0xC3B4, 0xCC99, 0xC3B5, 0xCC9C, 0xC3B6, 0xCCA0, + 0xC3B7, 0xCCA8, 0xC3B8, 0xCCA9, 0xC3B9, 0xCCAB, 0xC3BA, 0xCCAC, + 0xC3BB, 0xCCAD, 0xC3BC, 0xCCB4, 0xC3BD, 0xCCB5, 0xC3BE, 0xCCB8, + 0xC3BF, 0xCCBC, 0xC3C0, 0xCCC4, 0xC3C1, 0xCCC5, 0xC3C2, 0xCCC7, + 0xC3C3, 0xCCC9, 0xC3C4, 0xCCD0, 0xC3C5, 0xCCD4, 0xC3C6, 0xCCE4, + 0xC3C7, 0xCCEC, 0xC3C8, 0xCCF0, 0xC3C9, 0xCD01, 0xC3CA, 0xCD08, + 0xC3CB, 0xCD09, 0xC3CC, 0xCD0C, 0xC3CD, 0xCD10, 0xC3CE, 0xCD18, + 0xC3CF, 0xCD19, 0xC3D0, 0xCD1B, 0xC3D1, 0xCD1D, 0xC3D2, 0xCD24, + 0xC3D3, 0xCD28, 0xC3D4, 0xCD2C, 0xC3D5, 0xCD39, 0xC3D6, 0xCD5C, + 0xC3D7, 0xCD60, 0xC3D8, 0xCD64, 0xC3D9, 0xCD6C, 0xC3DA, 0xCD6D, + 0xC3DB, 0xCD6F, 0xC3DC, 0xCD71, 0xC3DD, 0xCD78, 0xC3DE, 0xCD88, + 0xC3DF, 0xCD94, 0xC3E0, 0xCD95, 0xC3E1, 0xCD98, 0xC3E2, 0xCD9C, + 0xC3E3, 0xCDA4, 0xC3E4, 0xCDA5, 0xC3E5, 0xCDA7, 0xC3E6, 0xCDA9, + 0xC3E7, 0xCDB0, 0xC3E8, 0xCDC4, 0xC3E9, 0xCDCC, 0xC3EA, 0xCDD0, + 0xC3EB, 0xCDE8, 0xC3EC, 0xCDEC, 0xC3ED, 0xCDF0, 0xC3EE, 0xCDF8, + 0xC3EF, 0xCDF9, 0xC3F0, 0xCDFB, 0xC3F1, 0xCDFD, 0xC3F2, 0xCE04, + 0xC3F3, 0xCE08, 0xC3F4, 0xCE0C, 0xC3F5, 0xCE14, 0xC3F6, 0xCE19, + 0xC3F7, 0xCE20, 0xC3F8, 0xCE21, 0xC3F9, 0xCE24, 0xC3FA, 0xCE28, + 0xC3FB, 0xCE30, 0xC3FC, 0xCE31, 0xC3FD, 0xCE33, 0xC3FE, 0xCE35, + 0xC441, 0xD6AB, 0xC442, 0xD6AD, 0xC443, 0xD6AE, 0xC444, 0xD6AF, + 0xC445, 0xD6B1, 0xC446, 0xD6B2, 0xC447, 0xD6B3, 0xC448, 0xD6B4, + 0xC449, 0xD6B5, 0xC44A, 0xD6B6, 0xC44B, 0xD6B7, 0xC44C, 0xD6B8, + 0xC44D, 0xD6BA, 0xC44E, 0xD6BC, 0xC44F, 0xD6BD, 0xC450, 0xD6BE, + 0xC451, 0xD6BF, 0xC452, 0xD6C0, 0xC453, 0xD6C1, 0xC454, 0xD6C2, + 0xC455, 0xD6C3, 0xC456, 0xD6C6, 0xC457, 0xD6C7, 0xC458, 0xD6C9, + 0xC459, 0xD6CA, 0xC45A, 0xD6CB, 0xC461, 0xD6CD, 0xC462, 0xD6CE, + 0xC463, 0xD6CF, 0xC464, 0xD6D0, 0xC465, 0xD6D2, 0xC466, 0xD6D3, + 0xC467, 0xD6D5, 0xC468, 0xD6D6, 0xC469, 0xD6D8, 0xC46A, 0xD6DA, + 0xC46B, 0xD6DB, 0xC46C, 0xD6DC, 0xC46D, 0xD6DD, 0xC46E, 0xD6DE, + 0xC46F, 0xD6DF, 0xC470, 0xD6E1, 0xC471, 0xD6E2, 0xC472, 0xD6E3, + 0xC473, 0xD6E5, 0xC474, 0xD6E6, 0xC475, 0xD6E7, 0xC476, 0xD6E9, + 0xC477, 0xD6EA, 0xC478, 0xD6EB, 0xC479, 0xD6EC, 0xC47A, 0xD6ED, + 0xC481, 0xD6EE, 0xC482, 0xD6EF, 0xC483, 0xD6F1, 0xC484, 0xD6F2, + 0xC485, 0xD6F3, 0xC486, 0xD6F4, 0xC487, 0xD6F6, 0xC488, 0xD6F7, + 0xC489, 0xD6F8, 0xC48A, 0xD6F9, 0xC48B, 0xD6FA, 0xC48C, 0xD6FB, + 0xC48D, 0xD6FE, 0xC48E, 0xD6FF, 0xC48F, 0xD701, 0xC490, 0xD702, + 0xC491, 0xD703, 0xC492, 0xD705, 0xC493, 0xD706, 0xC494, 0xD707, + 0xC495, 0xD708, 0xC496, 0xD709, 0xC497, 0xD70A, 0xC498, 0xD70B, + 0xC499, 0xD70C, 0xC49A, 0xD70D, 0xC49B, 0xD70E, 0xC49C, 0xD70F, + 0xC49D, 0xD710, 0xC49E, 0xD712, 0xC49F, 0xD713, 0xC4A0, 0xD714, + 0xC4A1, 0xCE58, 0xC4A2, 0xCE59, 0xC4A3, 0xCE5C, 0xC4A4, 0xCE5F, + 0xC4A5, 0xCE60, 0xC4A6, 0xCE61, 0xC4A7, 0xCE68, 0xC4A8, 0xCE69, + 0xC4A9, 0xCE6B, 0xC4AA, 0xCE6D, 0xC4AB, 0xCE74, 0xC4AC, 0xCE75, + 0xC4AD, 0xCE78, 0xC4AE, 0xCE7C, 0xC4AF, 0xCE84, 0xC4B0, 0xCE85, + 0xC4B1, 0xCE87, 0xC4B2, 0xCE89, 0xC4B3, 0xCE90, 0xC4B4, 0xCE91, + 0xC4B5, 0xCE94, 0xC4B6, 0xCE98, 0xC4B7, 0xCEA0, 0xC4B8, 0xCEA1, + 0xC4B9, 0xCEA3, 0xC4BA, 0xCEA4, 0xC4BB, 0xCEA5, 0xC4BC, 0xCEAC, + 0xC4BD, 0xCEAD, 0xC4BE, 0xCEC1, 0xC4BF, 0xCEE4, 0xC4C0, 0xCEE5, + 0xC4C1, 0xCEE8, 0xC4C2, 0xCEEB, 0xC4C3, 0xCEEC, 0xC4C4, 0xCEF4, + 0xC4C5, 0xCEF5, 0xC4C6, 0xCEF7, 0xC4C7, 0xCEF8, 0xC4C8, 0xCEF9, + 0xC4C9, 0xCF00, 0xC4CA, 0xCF01, 0xC4CB, 0xCF04, 0xC4CC, 0xCF08, + 0xC4CD, 0xCF10, 0xC4CE, 0xCF11, 0xC4CF, 0xCF13, 0xC4D0, 0xCF15, + 0xC4D1, 0xCF1C, 0xC4D2, 0xCF20, 0xC4D3, 0xCF24, 0xC4D4, 0xCF2C, + 0xC4D5, 0xCF2D, 0xC4D6, 0xCF2F, 0xC4D7, 0xCF30, 0xC4D8, 0xCF31, + 0xC4D9, 0xCF38, 0xC4DA, 0xCF54, 0xC4DB, 0xCF55, 0xC4DC, 0xCF58, + 0xC4DD, 0xCF5C, 0xC4DE, 0xCF64, 0xC4DF, 0xCF65, 0xC4E0, 0xCF67, + 0xC4E1, 0xCF69, 0xC4E2, 0xCF70, 0xC4E3, 0xCF71, 0xC4E4, 0xCF74, + 0xC4E5, 0xCF78, 0xC4E6, 0xCF80, 0xC4E7, 0xCF85, 0xC4E8, 0xCF8C, + 0xC4E9, 0xCFA1, 0xC4EA, 0xCFA8, 0xC4EB, 0xCFB0, 0xC4EC, 0xCFC4, + 0xC4ED, 0xCFE0, 0xC4EE, 0xCFE1, 0xC4EF, 0xCFE4, 0xC4F0, 0xCFE8, + 0xC4F1, 0xCFF0, 0xC4F2, 0xCFF1, 0xC4F3, 0xCFF3, 0xC4F4, 0xCFF5, + 0xC4F5, 0xCFFC, 0xC4F6, 0xD000, 0xC4F7, 0xD004, 0xC4F8, 0xD011, + 0xC4F9, 0xD018, 0xC4FA, 0xD02D, 0xC4FB, 0xD034, 0xC4FC, 0xD035, + 0xC4FD, 0xD038, 0xC4FE, 0xD03C, 0xC541, 0xD715, 0xC542, 0xD716, + 0xC543, 0xD717, 0xC544, 0xD71A, 0xC545, 0xD71B, 0xC546, 0xD71D, + 0xC547, 0xD71E, 0xC548, 0xD71F, 0xC549, 0xD721, 0xC54A, 0xD722, + 0xC54B, 0xD723, 0xC54C, 0xD724, 0xC54D, 0xD725, 0xC54E, 0xD726, + 0xC54F, 0xD727, 0xC550, 0xD72A, 0xC551, 0xD72C, 0xC552, 0xD72E, + 0xC553, 0xD72F, 0xC554, 0xD730, 0xC555, 0xD731, 0xC556, 0xD732, + 0xC557, 0xD733, 0xC558, 0xD736, 0xC559, 0xD737, 0xC55A, 0xD739, + 0xC561, 0xD73A, 0xC562, 0xD73B, 0xC563, 0xD73D, 0xC564, 0xD73E, + 0xC565, 0xD73F, 0xC566, 0xD740, 0xC567, 0xD741, 0xC568, 0xD742, + 0xC569, 0xD743, 0xC56A, 0xD745, 0xC56B, 0xD746, 0xC56C, 0xD748, + 0xC56D, 0xD74A, 0xC56E, 0xD74B, 0xC56F, 0xD74C, 0xC570, 0xD74D, + 0xC571, 0xD74E, 0xC572, 0xD74F, 0xC573, 0xD752, 0xC574, 0xD753, + 0xC575, 0xD755, 0xC576, 0xD75A, 0xC577, 0xD75B, 0xC578, 0xD75C, + 0xC579, 0xD75D, 0xC57A, 0xD75E, 0xC581, 0xD75F, 0xC582, 0xD762, + 0xC583, 0xD764, 0xC584, 0xD766, 0xC585, 0xD767, 0xC586, 0xD768, + 0xC587, 0xD76A, 0xC588, 0xD76B, 0xC589, 0xD76D, 0xC58A, 0xD76E, + 0xC58B, 0xD76F, 0xC58C, 0xD771, 0xC58D, 0xD772, 0xC58E, 0xD773, + 0xC58F, 0xD775, 0xC590, 0xD776, 0xC591, 0xD777, 0xC592, 0xD778, + 0xC593, 0xD779, 0xC594, 0xD77A, 0xC595, 0xD77B, 0xC596, 0xD77E, + 0xC597, 0xD77F, 0xC598, 0xD780, 0xC599, 0xD782, 0xC59A, 0xD783, + 0xC59B, 0xD784, 0xC59C, 0xD785, 0xC59D, 0xD786, 0xC59E, 0xD787, + 0xC59F, 0xD78A, 0xC5A0, 0xD78B, 0xC5A1, 0xD044, 0xC5A2, 0xD045, + 0xC5A3, 0xD047, 0xC5A4, 0xD049, 0xC5A5, 0xD050, 0xC5A6, 0xD054, + 0xC5A7, 0xD058, 0xC5A8, 0xD060, 0xC5A9, 0xD06C, 0xC5AA, 0xD06D, + 0xC5AB, 0xD070, 0xC5AC, 0xD074, 0xC5AD, 0xD07C, 0xC5AE, 0xD07D, + 0xC5AF, 0xD081, 0xC5B0, 0xD0A4, 0xC5B1, 0xD0A5, 0xC5B2, 0xD0A8, + 0xC5B3, 0xD0AC, 0xC5B4, 0xD0B4, 0xC5B5, 0xD0B5, 0xC5B6, 0xD0B7, + 0xC5B7, 0xD0B9, 0xC5B8, 0xD0C0, 0xC5B9, 0xD0C1, 0xC5BA, 0xD0C4, + 0xC5BB, 0xD0C8, 0xC5BC, 0xD0C9, 0xC5BD, 0xD0D0, 0xC5BE, 0xD0D1, + 0xC5BF, 0xD0D3, 0xC5C0, 0xD0D4, 0xC5C1, 0xD0D5, 0xC5C2, 0xD0DC, + 0xC5C3, 0xD0DD, 0xC5C4, 0xD0E0, 0xC5C5, 0xD0E4, 0xC5C6, 0xD0EC, + 0xC5C7, 0xD0ED, 0xC5C8, 0xD0EF, 0xC5C9, 0xD0F0, 0xC5CA, 0xD0F1, + 0xC5CB, 0xD0F8, 0xC5CC, 0xD10D, 0xC5CD, 0xD130, 0xC5CE, 0xD131, + 0xC5CF, 0xD134, 0xC5D0, 0xD138, 0xC5D1, 0xD13A, 0xC5D2, 0xD140, + 0xC5D3, 0xD141, 0xC5D4, 0xD143, 0xC5D5, 0xD144, 0xC5D6, 0xD145, + 0xC5D7, 0xD14C, 0xC5D8, 0xD14D, 0xC5D9, 0xD150, 0xC5DA, 0xD154, + 0xC5DB, 0xD15C, 0xC5DC, 0xD15D, 0xC5DD, 0xD15F, 0xC5DE, 0xD161, + 0xC5DF, 0xD168, 0xC5E0, 0xD16C, 0xC5E1, 0xD17C, 0xC5E2, 0xD184, + 0xC5E3, 0xD188, 0xC5E4, 0xD1A0, 0xC5E5, 0xD1A1, 0xC5E6, 0xD1A4, + 0xC5E7, 0xD1A8, 0xC5E8, 0xD1B0, 0xC5E9, 0xD1B1, 0xC5EA, 0xD1B3, + 0xC5EB, 0xD1B5, 0xC5EC, 0xD1BA, 0xC5ED, 0xD1BC, 0xC5EE, 0xD1C0, + 0xC5EF, 0xD1D8, 0xC5F0, 0xD1F4, 0xC5F1, 0xD1F8, 0xC5F2, 0xD207, + 0xC5F3, 0xD209, 0xC5F4, 0xD210, 0xC5F5, 0xD22C, 0xC5F6, 0xD22D, + 0xC5F7, 0xD230, 0xC5F8, 0xD234, 0xC5F9, 0xD23C, 0xC5FA, 0xD23D, + 0xC5FB, 0xD23F, 0xC5FC, 0xD241, 0xC5FD, 0xD248, 0xC5FE, 0xD25C, + 0xC641, 0xD78D, 0xC642, 0xD78E, 0xC643, 0xD78F, 0xC644, 0xD791, + 0xC645, 0xD792, 0xC646, 0xD793, 0xC647, 0xD794, 0xC648, 0xD795, + 0xC649, 0xD796, 0xC64A, 0xD797, 0xC64B, 0xD79A, 0xC64C, 0xD79C, + 0xC64D, 0xD79E, 0xC64E, 0xD79F, 0xC64F, 0xD7A0, 0xC650, 0xD7A1, + 0xC651, 0xD7A2, 0xC652, 0xD7A3, 0xC6A1, 0xD264, 0xC6A2, 0xD280, + 0xC6A3, 0xD281, 0xC6A4, 0xD284, 0xC6A5, 0xD288, 0xC6A6, 0xD290, + 0xC6A7, 0xD291, 0xC6A8, 0xD295, 0xC6A9, 0xD29C, 0xC6AA, 0xD2A0, + 0xC6AB, 0xD2A4, 0xC6AC, 0xD2AC, 0xC6AD, 0xD2B1, 0xC6AE, 0xD2B8, + 0xC6AF, 0xD2B9, 0xC6B0, 0xD2BC, 0xC6B1, 0xD2BF, 0xC6B2, 0xD2C0, + 0xC6B3, 0xD2C2, 0xC6B4, 0xD2C8, 0xC6B5, 0xD2C9, 0xC6B6, 0xD2CB, + 0xC6B7, 0xD2D4, 0xC6B8, 0xD2D8, 0xC6B9, 0xD2DC, 0xC6BA, 0xD2E4, + 0xC6BB, 0xD2E5, 0xC6BC, 0xD2F0, 0xC6BD, 0xD2F1, 0xC6BE, 0xD2F4, + 0xC6BF, 0xD2F8, 0xC6C0, 0xD300, 0xC6C1, 0xD301, 0xC6C2, 0xD303, + 0xC6C3, 0xD305, 0xC6C4, 0xD30C, 0xC6C5, 0xD30D, 0xC6C6, 0xD30E, + 0xC6C7, 0xD310, 0xC6C8, 0xD314, 0xC6C9, 0xD316, 0xC6CA, 0xD31C, + 0xC6CB, 0xD31D, 0xC6CC, 0xD31F, 0xC6CD, 0xD320, 0xC6CE, 0xD321, + 0xC6CF, 0xD325, 0xC6D0, 0xD328, 0xC6D1, 0xD329, 0xC6D2, 0xD32C, + 0xC6D3, 0xD330, 0xC6D4, 0xD338, 0xC6D5, 0xD339, 0xC6D6, 0xD33B, + 0xC6D7, 0xD33C, 0xC6D8, 0xD33D, 0xC6D9, 0xD344, 0xC6DA, 0xD345, + 0xC6DB, 0xD37C, 0xC6DC, 0xD37D, 0xC6DD, 0xD380, 0xC6DE, 0xD384, + 0xC6DF, 0xD38C, 0xC6E0, 0xD38D, 0xC6E1, 0xD38F, 0xC6E2, 0xD390, + 0xC6E3, 0xD391, 0xC6E4, 0xD398, 0xC6E5, 0xD399, 0xC6E6, 0xD39C, + 0xC6E7, 0xD3A0, 0xC6E8, 0xD3A8, 0xC6E9, 0xD3A9, 0xC6EA, 0xD3AB, + 0xC6EB, 0xD3AD, 0xC6EC, 0xD3B4, 0xC6ED, 0xD3B8, 0xC6EE, 0xD3BC, + 0xC6EF, 0xD3C4, 0xC6F0, 0xD3C5, 0xC6F1, 0xD3C8, 0xC6F2, 0xD3C9, + 0xC6F3, 0xD3D0, 0xC6F4, 0xD3D8, 0xC6F5, 0xD3E1, 0xC6F6, 0xD3E3, + 0xC6F7, 0xD3EC, 0xC6F8, 0xD3ED, 0xC6F9, 0xD3F0, 0xC6FA, 0xD3F4, + 0xC6FB, 0xD3FC, 0xC6FC, 0xD3FD, 0xC6FD, 0xD3FF, 0xC6FE, 0xD401, + 0xC7A1, 0xD408, 0xC7A2, 0xD41D, 0xC7A3, 0xD440, 0xC7A4, 0xD444, + 0xC7A5, 0xD45C, 0xC7A6, 0xD460, 0xC7A7, 0xD464, 0xC7A8, 0xD46D, + 0xC7A9, 0xD46F, 0xC7AA, 0xD478, 0xC7AB, 0xD479, 0xC7AC, 0xD47C, + 0xC7AD, 0xD47F, 0xC7AE, 0xD480, 0xC7AF, 0xD482, 0xC7B0, 0xD488, + 0xC7B1, 0xD489, 0xC7B2, 0xD48B, 0xC7B3, 0xD48D, 0xC7B4, 0xD494, + 0xC7B5, 0xD4A9, 0xC7B6, 0xD4CC, 0xC7B7, 0xD4D0, 0xC7B8, 0xD4D4, + 0xC7B9, 0xD4DC, 0xC7BA, 0xD4DF, 0xC7BB, 0xD4E8, 0xC7BC, 0xD4EC, + 0xC7BD, 0xD4F0, 0xC7BE, 0xD4F8, 0xC7BF, 0xD4FB, 0xC7C0, 0xD4FD, + 0xC7C1, 0xD504, 0xC7C2, 0xD508, 0xC7C3, 0xD50C, 0xC7C4, 0xD514, + 0xC7C5, 0xD515, 0xC7C6, 0xD517, 0xC7C7, 0xD53C, 0xC7C8, 0xD53D, + 0xC7C9, 0xD540, 0xC7CA, 0xD544, 0xC7CB, 0xD54C, 0xC7CC, 0xD54D, + 0xC7CD, 0xD54F, 0xC7CE, 0xD551, 0xC7CF, 0xD558, 0xC7D0, 0xD559, + 0xC7D1, 0xD55C, 0xC7D2, 0xD560, 0xC7D3, 0xD565, 0xC7D4, 0xD568, + 0xC7D5, 0xD569, 0xC7D6, 0xD56B, 0xC7D7, 0xD56D, 0xC7D8, 0xD574, + 0xC7D9, 0xD575, 0xC7DA, 0xD578, 0xC7DB, 0xD57C, 0xC7DC, 0xD584, + 0xC7DD, 0xD585, 0xC7DE, 0xD587, 0xC7DF, 0xD588, 0xC7E0, 0xD589, + 0xC7E1, 0xD590, 0xC7E2, 0xD5A5, 0xC7E3, 0xD5C8, 0xC7E4, 0xD5C9, + 0xC7E5, 0xD5CC, 0xC7E6, 0xD5D0, 0xC7E7, 0xD5D2, 0xC7E8, 0xD5D8, + 0xC7E9, 0xD5D9, 0xC7EA, 0xD5DB, 0xC7EB, 0xD5DD, 0xC7EC, 0xD5E4, + 0xC7ED, 0xD5E5, 0xC7EE, 0xD5E8, 0xC7EF, 0xD5EC, 0xC7F0, 0xD5F4, + 0xC7F1, 0xD5F5, 0xC7F2, 0xD5F7, 0xC7F3, 0xD5F9, 0xC7F4, 0xD600, + 0xC7F5, 0xD601, 0xC7F6, 0xD604, 0xC7F7, 0xD608, 0xC7F8, 0xD610, + 0xC7F9, 0xD611, 0xC7FA, 0xD613, 0xC7FB, 0xD614, 0xC7FC, 0xD615, + 0xC7FD, 0xD61C, 0xC7FE, 0xD620, 0xC8A1, 0xD624, 0xC8A2, 0xD62D, + 0xC8A3, 0xD638, 0xC8A4, 0xD639, 0xC8A5, 0xD63C, 0xC8A6, 0xD640, + 0xC8A7, 0xD645, 0xC8A8, 0xD648, 0xC8A9, 0xD649, 0xC8AA, 0xD64B, + 0xC8AB, 0xD64D, 0xC8AC, 0xD651, 0xC8AD, 0xD654, 0xC8AE, 0xD655, + 0xC8AF, 0xD658, 0xC8B0, 0xD65C, 0xC8B1, 0xD667, 0xC8B2, 0xD669, + 0xC8B3, 0xD670, 0xC8B4, 0xD671, 0xC8B5, 0xD674, 0xC8B6, 0xD683, + 0xC8B7, 0xD685, 0xC8B8, 0xD68C, 0xC8B9, 0xD68D, 0xC8BA, 0xD690, + 0xC8BB, 0xD694, 0xC8BC, 0xD69D, 0xC8BD, 0xD69F, 0xC8BE, 0xD6A1, + 0xC8BF, 0xD6A8, 0xC8C0, 0xD6AC, 0xC8C1, 0xD6B0, 0xC8C2, 0xD6B9, + 0xC8C3, 0xD6BB, 0xC8C4, 0xD6C4, 0xC8C5, 0xD6C5, 0xC8C6, 0xD6C8, + 0xC8C7, 0xD6CC, 0xC8C8, 0xD6D1, 0xC8C9, 0xD6D4, 0xC8CA, 0xD6D7, + 0xC8CB, 0xD6D9, 0xC8CC, 0xD6E0, 0xC8CD, 0xD6E4, 0xC8CE, 0xD6E8, + 0xC8CF, 0xD6F0, 0xC8D0, 0xD6F5, 0xC8D1, 0xD6FC, 0xC8D2, 0xD6FD, + 0xC8D3, 0xD700, 0xC8D4, 0xD704, 0xC8D5, 0xD711, 0xC8D6, 0xD718, + 0xC8D7, 0xD719, 0xC8D8, 0xD71C, 0xC8D9, 0xD720, 0xC8DA, 0xD728, + 0xC8DB, 0xD729, 0xC8DC, 0xD72B, 0xC8DD, 0xD72D, 0xC8DE, 0xD734, + 0xC8DF, 0xD735, 0xC8E0, 0xD738, 0xC8E1, 0xD73C, 0xC8E2, 0xD744, + 0xC8E3, 0xD747, 0xC8E4, 0xD749, 0xC8E5, 0xD750, 0xC8E6, 0xD751, + 0xC8E7, 0xD754, 0xC8E8, 0xD756, 0xC8E9, 0xD757, 0xC8EA, 0xD758, + 0xC8EB, 0xD759, 0xC8EC, 0xD760, 0xC8ED, 0xD761, 0xC8EE, 0xD763, + 0xC8EF, 0xD765, 0xC8F0, 0xD769, 0xC8F1, 0xD76C, 0xC8F2, 0xD770, + 0xC8F3, 0xD774, 0xC8F4, 0xD77C, 0xC8F5, 0xD77D, 0xC8F6, 0xD781, + 0xC8F7, 0xD788, 0xC8F8, 0xD789, 0xC8F9, 0xD78C, 0xC8FA, 0xD790, + 0xC8FB, 0xD798, 0xC8FC, 0xD799, 0xC8FD, 0xD79B, 0xC8FE, 0xD79D, + 0xCAA1, 0x4F3D, 0xCAA2, 0x4F73, 0xCAA3, 0x5047, 0xCAA4, 0x50F9, + 0xCAA5, 0x52A0, 0xCAA6, 0x53EF, 0xCAA7, 0x5475, 0xCAA8, 0x54E5, + 0xCAA9, 0x5609, 0xCAAA, 0x5AC1, 0xCAAB, 0x5BB6, 0xCAAC, 0x6687, + 0xCAAD, 0x67B6, 0xCAAE, 0x67B7, 0xCAAF, 0x67EF, 0xCAB0, 0x6B4C, + 0xCAB1, 0x73C2, 0xCAB2, 0x75C2, 0xCAB3, 0x7A3C, 0xCAB4, 0x82DB, + 0xCAB5, 0x8304, 0xCAB6, 0x8857, 0xCAB7, 0x8888, 0xCAB8, 0x8A36, + 0xCAB9, 0x8CC8, 0xCABA, 0x8DCF, 0xCABB, 0x8EFB, 0xCABC, 0x8FE6, + 0xCABD, 0x99D5, 0xCABE, 0x523B, 0xCABF, 0x5374, 0xCAC0, 0x5404, + 0xCAC1, 0x606A, 0xCAC2, 0x6164, 0xCAC3, 0x6BBC, 0xCAC4, 0x73CF, + 0xCAC5, 0x811A, 0xCAC6, 0x89BA, 0xCAC7, 0x89D2, 0xCAC8, 0x95A3, + 0xCAC9, 0x4F83, 0xCACA, 0x520A, 0xCACB, 0x58BE, 0xCACC, 0x5978, + 0xCACD, 0x59E6, 0xCACE, 0x5E72, 0xCACF, 0x5E79, 0xCAD0, 0x61C7, + 0xCAD1, 0x63C0, 0xCAD2, 0x6746, 0xCAD3, 0x67EC, 0xCAD4, 0x687F, + 0xCAD5, 0x6F97, 0xCAD6, 0x764E, 0xCAD7, 0x770B, 0xCAD8, 0x78F5, + 0xCAD9, 0x7A08, 0xCADA, 0x7AFF, 0xCADB, 0x7C21, 0xCADC, 0x809D, + 0xCADD, 0x826E, 0xCADE, 0x8271, 0xCADF, 0x8AEB, 0xCAE0, 0x9593, + 0xCAE1, 0x4E6B, 0xCAE2, 0x559D, 0xCAE3, 0x66F7, 0xCAE4, 0x6E34, + 0xCAE5, 0x78A3, 0xCAE6, 0x7AED, 0xCAE7, 0x845B, 0xCAE8, 0x8910, + 0xCAE9, 0x874E, 0xCAEA, 0x97A8, 0xCAEB, 0x52D8, 0xCAEC, 0x574E, + 0xCAED, 0x582A, 0xCAEE, 0x5D4C, 0xCAEF, 0x611F, 0xCAF0, 0x61BE, + 0xCAF1, 0x6221, 0xCAF2, 0x6562, 0xCAF3, 0x67D1, 0xCAF4, 0x6A44, + 0xCAF5, 0x6E1B, 0xCAF6, 0x7518, 0xCAF7, 0x75B3, 0xCAF8, 0x76E3, + 0xCAF9, 0x77B0, 0xCAFA, 0x7D3A, 0xCAFB, 0x90AF, 0xCAFC, 0x9451, + 0xCAFD, 0x9452, 0xCAFE, 0x9F95, 0xCBA1, 0x5323, 0xCBA2, 0x5CAC, + 0xCBA3, 0x7532, 0xCBA4, 0x80DB, 0xCBA5, 0x9240, 0xCBA6, 0x9598, + 0xCBA7, 0x525B, 0xCBA8, 0x5808, 0xCBA9, 0x59DC, 0xCBAA, 0x5CA1, + 0xCBAB, 0x5D17, 0xCBAC, 0x5EB7, 0xCBAD, 0x5F3A, 0xCBAE, 0x5F4A, + 0xCBAF, 0x6177, 0xCBB0, 0x6C5F, 0xCBB1, 0x757A, 0xCBB2, 0x7586, + 0xCBB3, 0x7CE0, 0xCBB4, 0x7D73, 0xCBB5, 0x7DB1, 0xCBB6, 0x7F8C, + 0xCBB7, 0x8154, 0xCBB8, 0x8221, 0xCBB9, 0x8591, 0xCBBA, 0x8941, + 0xCBBB, 0x8B1B, 0xCBBC, 0x92FC, 0xCBBD, 0x964D, 0xCBBE, 0x9C47, + 0xCBBF, 0x4ECB, 0xCBC0, 0x4EF7, 0xCBC1, 0x500B, 0xCBC2, 0x51F1, + 0xCBC3, 0x584F, 0xCBC4, 0x6137, 0xCBC5, 0x613E, 0xCBC6, 0x6168, + 0xCBC7, 0x6539, 0xCBC8, 0x69EA, 0xCBC9, 0x6F11, 0xCBCA, 0x75A5, + 0xCBCB, 0x7686, 0xCBCC, 0x76D6, 0xCBCD, 0x7B87, 0xCBCE, 0x82A5, + 0xCBCF, 0x84CB, 0xCBD0, 0xF900, 0xCBD1, 0x93A7, 0xCBD2, 0x958B, + 0xCBD3, 0x5580, 0xCBD4, 0x5BA2, 0xCBD5, 0x5751, 0xCBD6, 0xF901, + 0xCBD7, 0x7CB3, 0xCBD8, 0x7FB9, 0xCBD9, 0x91B5, 0xCBDA, 0x5028, + 0xCBDB, 0x53BB, 0xCBDC, 0x5C45, 0xCBDD, 0x5DE8, 0xCBDE, 0x62D2, + 0xCBDF, 0x636E, 0xCBE0, 0x64DA, 0xCBE1, 0x64E7, 0xCBE2, 0x6E20, + 0xCBE3, 0x70AC, 0xCBE4, 0x795B, 0xCBE5, 0x8DDD, 0xCBE6, 0x8E1E, + 0xCBE7, 0xF902, 0xCBE8, 0x907D, 0xCBE9, 0x9245, 0xCBEA, 0x92F8, + 0xCBEB, 0x4E7E, 0xCBEC, 0x4EF6, 0xCBED, 0x5065, 0xCBEE, 0x5DFE, + 0xCBEF, 0x5EFA, 0xCBF0, 0x6106, 0xCBF1, 0x6957, 0xCBF2, 0x8171, + 0xCBF3, 0x8654, 0xCBF4, 0x8E47, 0xCBF5, 0x9375, 0xCBF6, 0x9A2B, + 0xCBF7, 0x4E5E, 0xCBF8, 0x5091, 0xCBF9, 0x6770, 0xCBFA, 0x6840, + 0xCBFB, 0x5109, 0xCBFC, 0x528D, 0xCBFD, 0x5292, 0xCBFE, 0x6AA2, + 0xCCA1, 0x77BC, 0xCCA2, 0x9210, 0xCCA3, 0x9ED4, 0xCCA4, 0x52AB, + 0xCCA5, 0x602F, 0xCCA6, 0x8FF2, 0xCCA7, 0x5048, 0xCCA8, 0x61A9, + 0xCCA9, 0x63ED, 0xCCAA, 0x64CA, 0xCCAB, 0x683C, 0xCCAC, 0x6A84, + 0xCCAD, 0x6FC0, 0xCCAE, 0x8188, 0xCCAF, 0x89A1, 0xCCB0, 0x9694, + 0xCCB1, 0x5805, 0xCCB2, 0x727D, 0xCCB3, 0x72AC, 0xCCB4, 0x7504, + 0xCCB5, 0x7D79, 0xCCB6, 0x7E6D, 0xCCB7, 0x80A9, 0xCCB8, 0x898B, + 0xCCB9, 0x8B74, 0xCCBA, 0x9063, 0xCCBB, 0x9D51, 0xCCBC, 0x6289, + 0xCCBD, 0x6C7A, 0xCCBE, 0x6F54, 0xCCBF, 0x7D50, 0xCCC0, 0x7F3A, + 0xCCC1, 0x8A23, 0xCCC2, 0x517C, 0xCCC3, 0x614A, 0xCCC4, 0x7B9D, + 0xCCC5, 0x8B19, 0xCCC6, 0x9257, 0xCCC7, 0x938C, 0xCCC8, 0x4EAC, + 0xCCC9, 0x4FD3, 0xCCCA, 0x501E, 0xCCCB, 0x50BE, 0xCCCC, 0x5106, + 0xCCCD, 0x52C1, 0xCCCE, 0x52CD, 0xCCCF, 0x537F, 0xCCD0, 0x5770, + 0xCCD1, 0x5883, 0xCCD2, 0x5E9A, 0xCCD3, 0x5F91, 0xCCD4, 0x6176, + 0xCCD5, 0x61AC, 0xCCD6, 0x64CE, 0xCCD7, 0x656C, 0xCCD8, 0x666F, + 0xCCD9, 0x66BB, 0xCCDA, 0x66F4, 0xCCDB, 0x6897, 0xCCDC, 0x6D87, + 0xCCDD, 0x7085, 0xCCDE, 0x70F1, 0xCCDF, 0x749F, 0xCCE0, 0x74A5, + 0xCCE1, 0x74CA, 0xCCE2, 0x75D9, 0xCCE3, 0x786C, 0xCCE4, 0x78EC, + 0xCCE5, 0x7ADF, 0xCCE6, 0x7AF6, 0xCCE7, 0x7D45, 0xCCE8, 0x7D93, + 0xCCE9, 0x8015, 0xCCEA, 0x803F, 0xCCEB, 0x811B, 0xCCEC, 0x8396, + 0xCCED, 0x8B66, 0xCCEE, 0x8F15, 0xCCEF, 0x9015, 0xCCF0, 0x93E1, + 0xCCF1, 0x9803, 0xCCF2, 0x9838, 0xCCF3, 0x9A5A, 0xCCF4, 0x9BE8, + 0xCCF5, 0x4FC2, 0xCCF6, 0x5553, 0xCCF7, 0x583A, 0xCCF8, 0x5951, + 0xCCF9, 0x5B63, 0xCCFA, 0x5C46, 0xCCFB, 0x60B8, 0xCCFC, 0x6212, + 0xCCFD, 0x6842, 0xCCFE, 0x68B0, 0xCDA1, 0x68E8, 0xCDA2, 0x6EAA, + 0xCDA3, 0x754C, 0xCDA4, 0x7678, 0xCDA5, 0x78CE, 0xCDA6, 0x7A3D, + 0xCDA7, 0x7CFB, 0xCDA8, 0x7E6B, 0xCDA9, 0x7E7C, 0xCDAA, 0x8A08, + 0xCDAB, 0x8AA1, 0xCDAC, 0x8C3F, 0xCDAD, 0x968E, 0xCDAE, 0x9DC4, + 0xCDAF, 0x53E4, 0xCDB0, 0x53E9, 0xCDB1, 0x544A, 0xCDB2, 0x5471, + 0xCDB3, 0x56FA, 0xCDB4, 0x59D1, 0xCDB5, 0x5B64, 0xCDB6, 0x5C3B, + 0xCDB7, 0x5EAB, 0xCDB8, 0x62F7, 0xCDB9, 0x6537, 0xCDBA, 0x6545, + 0xCDBB, 0x6572, 0xCDBC, 0x66A0, 0xCDBD, 0x67AF, 0xCDBE, 0x69C1, + 0xCDBF, 0x6CBD, 0xCDC0, 0x75FC, 0xCDC1, 0x7690, 0xCDC2, 0x777E, + 0xCDC3, 0x7A3F, 0xCDC4, 0x7F94, 0xCDC5, 0x8003, 0xCDC6, 0x80A1, + 0xCDC7, 0x818F, 0xCDC8, 0x82E6, 0xCDC9, 0x82FD, 0xCDCA, 0x83F0, + 0xCDCB, 0x85C1, 0xCDCC, 0x8831, 0xCDCD, 0x88B4, 0xCDCE, 0x8AA5, + 0xCDCF, 0xF903, 0xCDD0, 0x8F9C, 0xCDD1, 0x932E, 0xCDD2, 0x96C7, + 0xCDD3, 0x9867, 0xCDD4, 0x9AD8, 0xCDD5, 0x9F13, 0xCDD6, 0x54ED, + 0xCDD7, 0x659B, 0xCDD8, 0x66F2, 0xCDD9, 0x688F, 0xCDDA, 0x7A40, + 0xCDDB, 0x8C37, 0xCDDC, 0x9D60, 0xCDDD, 0x56F0, 0xCDDE, 0x5764, + 0xCDDF, 0x5D11, 0xCDE0, 0x6606, 0xCDE1, 0x68B1, 0xCDE2, 0x68CD, + 0xCDE3, 0x6EFE, 0xCDE4, 0x7428, 0xCDE5, 0x889E, 0xCDE6, 0x9BE4, + 0xCDE7, 0x6C68, 0xCDE8, 0xF904, 0xCDE9, 0x9AA8, 0xCDEA, 0x4F9B, + 0xCDEB, 0x516C, 0xCDEC, 0x5171, 0xCDED, 0x529F, 0xCDEE, 0x5B54, + 0xCDEF, 0x5DE5, 0xCDF0, 0x6050, 0xCDF1, 0x606D, 0xCDF2, 0x62F1, + 0xCDF3, 0x63A7, 0xCDF4, 0x653B, 0xCDF5, 0x73D9, 0xCDF6, 0x7A7A, + 0xCDF7, 0x86A3, 0xCDF8, 0x8CA2, 0xCDF9, 0x978F, 0xCDFA, 0x4E32, + 0xCDFB, 0x5BE1, 0xCDFC, 0x6208, 0xCDFD, 0x679C, 0xCDFE, 0x74DC, + 0xCEA1, 0x79D1, 0xCEA2, 0x83D3, 0xCEA3, 0x8A87, 0xCEA4, 0x8AB2, + 0xCEA5, 0x8DE8, 0xCEA6, 0x904E, 0xCEA7, 0x934B, 0xCEA8, 0x9846, + 0xCEA9, 0x5ED3, 0xCEAA, 0x69E8, 0xCEAB, 0x85FF, 0xCEAC, 0x90ED, + 0xCEAD, 0xF905, 0xCEAE, 0x51A0, 0xCEAF, 0x5B98, 0xCEB0, 0x5BEC, + 0xCEB1, 0x6163, 0xCEB2, 0x68FA, 0xCEB3, 0x6B3E, 0xCEB4, 0x704C, + 0xCEB5, 0x742F, 0xCEB6, 0x74D8, 0xCEB7, 0x7BA1, 0xCEB8, 0x7F50, + 0xCEB9, 0x83C5, 0xCEBA, 0x89C0, 0xCEBB, 0x8CAB, 0xCEBC, 0x95DC, + 0xCEBD, 0x9928, 0xCEBE, 0x522E, 0xCEBF, 0x605D, 0xCEC0, 0x62EC, + 0xCEC1, 0x9002, 0xCEC2, 0x4F8A, 0xCEC3, 0x5149, 0xCEC4, 0x5321, + 0xCEC5, 0x58D9, 0xCEC6, 0x5EE3, 0xCEC7, 0x66E0, 0xCEC8, 0x6D38, + 0xCEC9, 0x709A, 0xCECA, 0x72C2, 0xCECB, 0x73D6, 0xCECC, 0x7B50, + 0xCECD, 0x80F1, 0xCECE, 0x945B, 0xCECF, 0x5366, 0xCED0, 0x639B, + 0xCED1, 0x7F6B, 0xCED2, 0x4E56, 0xCED3, 0x5080, 0xCED4, 0x584A, + 0xCED5, 0x58DE, 0xCED6, 0x602A, 0xCED7, 0x6127, 0xCED8, 0x62D0, + 0xCED9, 0x69D0, 0xCEDA, 0x9B41, 0xCEDB, 0x5B8F, 0xCEDC, 0x7D18, + 0xCEDD, 0x80B1, 0xCEDE, 0x8F5F, 0xCEDF, 0x4EA4, 0xCEE0, 0x50D1, + 0xCEE1, 0x54AC, 0xCEE2, 0x55AC, 0xCEE3, 0x5B0C, 0xCEE4, 0x5DA0, + 0xCEE5, 0x5DE7, 0xCEE6, 0x652A, 0xCEE7, 0x654E, 0xCEE8, 0x6821, + 0xCEE9, 0x6A4B, 0xCEEA, 0x72E1, 0xCEEB, 0x768E, 0xCEEC, 0x77EF, + 0xCEED, 0x7D5E, 0xCEEE, 0x7FF9, 0xCEEF, 0x81A0, 0xCEF0, 0x854E, + 0xCEF1, 0x86DF, 0xCEF2, 0x8F03, 0xCEF3, 0x8F4E, 0xCEF4, 0x90CA, + 0xCEF5, 0x9903, 0xCEF6, 0x9A55, 0xCEF7, 0x9BAB, 0xCEF8, 0x4E18, + 0xCEF9, 0x4E45, 0xCEFA, 0x4E5D, 0xCEFB, 0x4EC7, 0xCEFC, 0x4FF1, + 0xCEFD, 0x5177, 0xCEFE, 0x52FE, 0xCFA1, 0x5340, 0xCFA2, 0x53E3, + 0xCFA3, 0x53E5, 0xCFA4, 0x548E, 0xCFA5, 0x5614, 0xCFA6, 0x5775, + 0xCFA7, 0x57A2, 0xCFA8, 0x5BC7, 0xCFA9, 0x5D87, 0xCFAA, 0x5ED0, + 0xCFAB, 0x61FC, 0xCFAC, 0x62D8, 0xCFAD, 0x6551, 0xCFAE, 0x67B8, + 0xCFAF, 0x67E9, 0xCFB0, 0x69CB, 0xCFB1, 0x6B50, 0xCFB2, 0x6BC6, + 0xCFB3, 0x6BEC, 0xCFB4, 0x6C42, 0xCFB5, 0x6E9D, 0xCFB6, 0x7078, + 0xCFB7, 0x72D7, 0xCFB8, 0x7396, 0xCFB9, 0x7403, 0xCFBA, 0x77BF, + 0xCFBB, 0x77E9, 0xCFBC, 0x7A76, 0xCFBD, 0x7D7F, 0xCFBE, 0x8009, + 0xCFBF, 0x81FC, 0xCFC0, 0x8205, 0xCFC1, 0x820A, 0xCFC2, 0x82DF, + 0xCFC3, 0x8862, 0xCFC4, 0x8B33, 0xCFC5, 0x8CFC, 0xCFC6, 0x8EC0, + 0xCFC7, 0x9011, 0xCFC8, 0x90B1, 0xCFC9, 0x9264, 0xCFCA, 0x92B6, + 0xCFCB, 0x99D2, 0xCFCC, 0x9A45, 0xCFCD, 0x9CE9, 0xCFCE, 0x9DD7, + 0xCFCF, 0x9F9C, 0xCFD0, 0x570B, 0xCFD1, 0x5C40, 0xCFD2, 0x83CA, + 0xCFD3, 0x97A0, 0xCFD4, 0x97AB, 0xCFD5, 0x9EB4, 0xCFD6, 0x541B, + 0xCFD7, 0x7A98, 0xCFD8, 0x7FA4, 0xCFD9, 0x88D9, 0xCFDA, 0x8ECD, + 0xCFDB, 0x90E1, 0xCFDC, 0x5800, 0xCFDD, 0x5C48, 0xCFDE, 0x6398, + 0xCFDF, 0x7A9F, 0xCFE0, 0x5BAE, 0xCFE1, 0x5F13, 0xCFE2, 0x7A79, + 0xCFE3, 0x7AAE, 0xCFE4, 0x828E, 0xCFE5, 0x8EAC, 0xCFE6, 0x5026, + 0xCFE7, 0x5238, 0xCFE8, 0x52F8, 0xCFE9, 0x5377, 0xCFEA, 0x5708, + 0xCFEB, 0x62F3, 0xCFEC, 0x6372, 0xCFED, 0x6B0A, 0xCFEE, 0x6DC3, + 0xCFEF, 0x7737, 0xCFF0, 0x53A5, 0xCFF1, 0x7357, 0xCFF2, 0x8568, + 0xCFF3, 0x8E76, 0xCFF4, 0x95D5, 0xCFF5, 0x673A, 0xCFF6, 0x6AC3, + 0xCFF7, 0x6F70, 0xCFF8, 0x8A6D, 0xCFF9, 0x8ECC, 0xCFFA, 0x994B, + 0xCFFB, 0xF906, 0xCFFC, 0x6677, 0xCFFD, 0x6B78, 0xCFFE, 0x8CB4, + 0xD0A1, 0x9B3C, 0xD0A2, 0xF907, 0xD0A3, 0x53EB, 0xD0A4, 0x572D, + 0xD0A5, 0x594E, 0xD0A6, 0x63C6, 0xD0A7, 0x69FB, 0xD0A8, 0x73EA, + 0xD0A9, 0x7845, 0xD0AA, 0x7ABA, 0xD0AB, 0x7AC5, 0xD0AC, 0x7CFE, + 0xD0AD, 0x8475, 0xD0AE, 0x898F, 0xD0AF, 0x8D73, 0xD0B0, 0x9035, + 0xD0B1, 0x95A8, 0xD0B2, 0x52FB, 0xD0B3, 0x5747, 0xD0B4, 0x7547, + 0xD0B5, 0x7B60, 0xD0B6, 0x83CC, 0xD0B7, 0x921E, 0xD0B8, 0xF908, + 0xD0B9, 0x6A58, 0xD0BA, 0x514B, 0xD0BB, 0x524B, 0xD0BC, 0x5287, + 0xD0BD, 0x621F, 0xD0BE, 0x68D8, 0xD0BF, 0x6975, 0xD0C0, 0x9699, + 0xD0C1, 0x50C5, 0xD0C2, 0x52A4, 0xD0C3, 0x52E4, 0xD0C4, 0x61C3, + 0xD0C5, 0x65A4, 0xD0C6, 0x6839, 0xD0C7, 0x69FF, 0xD0C8, 0x747E, + 0xD0C9, 0x7B4B, 0xD0CA, 0x82B9, 0xD0CB, 0x83EB, 0xD0CC, 0x89B2, + 0xD0CD, 0x8B39, 0xD0CE, 0x8FD1, 0xD0CF, 0x9949, 0xD0D0, 0xF909, + 0xD0D1, 0x4ECA, 0xD0D2, 0x5997, 0xD0D3, 0x64D2, 0xD0D4, 0x6611, + 0xD0D5, 0x6A8E, 0xD0D6, 0x7434, 0xD0D7, 0x7981, 0xD0D8, 0x79BD, + 0xD0D9, 0x82A9, 0xD0DA, 0x887E, 0xD0DB, 0x887F, 0xD0DC, 0x895F, + 0xD0DD, 0xF90A, 0xD0DE, 0x9326, 0xD0DF, 0x4F0B, 0xD0E0, 0x53CA, + 0xD0E1, 0x6025, 0xD0E2, 0x6271, 0xD0E3, 0x6C72, 0xD0E4, 0x7D1A, + 0xD0E5, 0x7D66, 0xD0E6, 0x4E98, 0xD0E7, 0x5162, 0xD0E8, 0x77DC, + 0xD0E9, 0x80AF, 0xD0EA, 0x4F01, 0xD0EB, 0x4F0E, 0xD0EC, 0x5176, + 0xD0ED, 0x5180, 0xD0EE, 0x55DC, 0xD0EF, 0x5668, 0xD0F0, 0x573B, + 0xD0F1, 0x57FA, 0xD0F2, 0x57FC, 0xD0F3, 0x5914, 0xD0F4, 0x5947, + 0xD0F5, 0x5993, 0xD0F6, 0x5BC4, 0xD0F7, 0x5C90, 0xD0F8, 0x5D0E, + 0xD0F9, 0x5DF1, 0xD0FA, 0x5E7E, 0xD0FB, 0x5FCC, 0xD0FC, 0x6280, + 0xD0FD, 0x65D7, 0xD0FE, 0x65E3, 0xD1A1, 0x671E, 0xD1A2, 0x671F, + 0xD1A3, 0x675E, 0xD1A4, 0x68CB, 0xD1A5, 0x68C4, 0xD1A6, 0x6A5F, + 0xD1A7, 0x6B3A, 0xD1A8, 0x6C23, 0xD1A9, 0x6C7D, 0xD1AA, 0x6C82, + 0xD1AB, 0x6DC7, 0xD1AC, 0x7398, 0xD1AD, 0x7426, 0xD1AE, 0x742A, + 0xD1AF, 0x7482, 0xD1B0, 0x74A3, 0xD1B1, 0x7578, 0xD1B2, 0x757F, + 0xD1B3, 0x7881, 0xD1B4, 0x78EF, 0xD1B5, 0x7941, 0xD1B6, 0x7947, + 0xD1B7, 0x7948, 0xD1B8, 0x797A, 0xD1B9, 0x7B95, 0xD1BA, 0x7D00, + 0xD1BB, 0x7DBA, 0xD1BC, 0x7F88, 0xD1BD, 0x8006, 0xD1BE, 0x802D, + 0xD1BF, 0x808C, 0xD1C0, 0x8A18, 0xD1C1, 0x8B4F, 0xD1C2, 0x8C48, + 0xD1C3, 0x8D77, 0xD1C4, 0x9321, 0xD1C5, 0x9324, 0xD1C6, 0x98E2, + 0xD1C7, 0x9951, 0xD1C8, 0x9A0E, 0xD1C9, 0x9A0F, 0xD1CA, 0x9A65, + 0xD1CB, 0x9E92, 0xD1CC, 0x7DCA, 0xD1CD, 0x4F76, 0xD1CE, 0x5409, + 0xD1CF, 0x62EE, 0xD1D0, 0x6854, 0xD1D1, 0x91D1, 0xD1D2, 0x55AB, + 0xD1D3, 0x513A, 0xD1D4, 0xF90B, 0xD1D5, 0xF90C, 0xD1D6, 0x5A1C, + 0xD1D7, 0x61E6, 0xD1D8, 0xF90D, 0xD1D9, 0x62CF, 0xD1DA, 0x62FF, + 0xD1DB, 0xF90E, 0xD1DC, 0xF90F, 0xD1DD, 0xF910, 0xD1DE, 0xF911, + 0xD1DF, 0xF912, 0xD1E0, 0xF913, 0xD1E1, 0x90A3, 0xD1E2, 0xF914, + 0xD1E3, 0xF915, 0xD1E4, 0xF916, 0xD1E5, 0xF917, 0xD1E6, 0xF918, + 0xD1E7, 0x8AFE, 0xD1E8, 0xF919, 0xD1E9, 0xF91A, 0xD1EA, 0xF91B, + 0xD1EB, 0xF91C, 0xD1EC, 0x6696, 0xD1ED, 0xF91D, 0xD1EE, 0x7156, + 0xD1EF, 0xF91E, 0xD1F0, 0xF91F, 0xD1F1, 0x96E3, 0xD1F2, 0xF920, + 0xD1F3, 0x634F, 0xD1F4, 0x637A, 0xD1F5, 0x5357, 0xD1F6, 0xF921, + 0xD1F7, 0x678F, 0xD1F8, 0x6960, 0xD1F9, 0x6E73, 0xD1FA, 0xF922, + 0xD1FB, 0x7537, 0xD1FC, 0xF923, 0xD1FD, 0xF924, 0xD1FE, 0xF925, + 0xD2A1, 0x7D0D, 0xD2A2, 0xF926, 0xD2A3, 0xF927, 0xD2A4, 0x8872, + 0xD2A5, 0x56CA, 0xD2A6, 0x5A18, 0xD2A7, 0xF928, 0xD2A8, 0xF929, + 0xD2A9, 0xF92A, 0xD2AA, 0xF92B, 0xD2AB, 0xF92C, 0xD2AC, 0x4E43, + 0xD2AD, 0xF92D, 0xD2AE, 0x5167, 0xD2AF, 0x5948, 0xD2B0, 0x67F0, + 0xD2B1, 0x8010, 0xD2B2, 0xF92E, 0xD2B3, 0x5973, 0xD2B4, 0x5E74, + 0xD2B5, 0x649A, 0xD2B6, 0x79CA, 0xD2B7, 0x5FF5, 0xD2B8, 0x606C, + 0xD2B9, 0x62C8, 0xD2BA, 0x637B, 0xD2BB, 0x5BE7, 0xD2BC, 0x5BD7, + 0xD2BD, 0x52AA, 0xD2BE, 0xF92F, 0xD2BF, 0x5974, 0xD2C0, 0x5F29, + 0xD2C1, 0x6012, 0xD2C2, 0xF930, 0xD2C3, 0xF931, 0xD2C4, 0xF932, + 0xD2C5, 0x7459, 0xD2C6, 0xF933, 0xD2C7, 0xF934, 0xD2C8, 0xF935, + 0xD2C9, 0xF936, 0xD2CA, 0xF937, 0xD2CB, 0xF938, 0xD2CC, 0x99D1, + 0xD2CD, 0xF939, 0xD2CE, 0xF93A, 0xD2CF, 0xF93B, 0xD2D0, 0xF93C, + 0xD2D1, 0xF93D, 0xD2D2, 0xF93E, 0xD2D3, 0xF93F, 0xD2D4, 0xF940, + 0xD2D5, 0xF941, 0xD2D6, 0xF942, 0xD2D7, 0xF943, 0xD2D8, 0x6FC3, + 0xD2D9, 0xF944, 0xD2DA, 0xF945, 0xD2DB, 0x81BF, 0xD2DC, 0x8FB2, + 0xD2DD, 0x60F1, 0xD2DE, 0xF946, 0xD2DF, 0xF947, 0xD2E0, 0x8166, + 0xD2E1, 0xF948, 0xD2E2, 0xF949, 0xD2E3, 0x5C3F, 0xD2E4, 0xF94A, + 0xD2E5, 0xF94B, 0xD2E6, 0xF94C, 0xD2E7, 0xF94D, 0xD2E8, 0xF94E, + 0xD2E9, 0xF94F, 0xD2EA, 0xF950, 0xD2EB, 0xF951, 0xD2EC, 0x5AE9, + 0xD2ED, 0x8A25, 0xD2EE, 0x677B, 0xD2EF, 0x7D10, 0xD2F0, 0xF952, + 0xD2F1, 0xF953, 0xD2F2, 0xF954, 0xD2F3, 0xF955, 0xD2F4, 0xF956, + 0xD2F5, 0xF957, 0xD2F6, 0x80FD, 0xD2F7, 0xF958, 0xD2F8, 0xF959, + 0xD2F9, 0x5C3C, 0xD2FA, 0x6CE5, 0xD2FB, 0x533F, 0xD2FC, 0x6EBA, + 0xD2FD, 0x591A, 0xD2FE, 0x8336, 0xD3A1, 0x4E39, 0xD3A2, 0x4EB6, + 0xD3A3, 0x4F46, 0xD3A4, 0x55AE, 0xD3A5, 0x5718, 0xD3A6, 0x58C7, + 0xD3A7, 0x5F56, 0xD3A8, 0x65B7, 0xD3A9, 0x65E6, 0xD3AA, 0x6A80, + 0xD3AB, 0x6BB5, 0xD3AC, 0x6E4D, 0xD3AD, 0x77ED, 0xD3AE, 0x7AEF, + 0xD3AF, 0x7C1E, 0xD3B0, 0x7DDE, 0xD3B1, 0x86CB, 0xD3B2, 0x8892, + 0xD3B3, 0x9132, 0xD3B4, 0x935B, 0xD3B5, 0x64BB, 0xD3B6, 0x6FBE, + 0xD3B7, 0x737A, 0xD3B8, 0x75B8, 0xD3B9, 0x9054, 0xD3BA, 0x5556, + 0xD3BB, 0x574D, 0xD3BC, 0x61BA, 0xD3BD, 0x64D4, 0xD3BE, 0x66C7, + 0xD3BF, 0x6DE1, 0xD3C0, 0x6E5B, 0xD3C1, 0x6F6D, 0xD3C2, 0x6FB9, + 0xD3C3, 0x75F0, 0xD3C4, 0x8043, 0xD3C5, 0x81BD, 0xD3C6, 0x8541, + 0xD3C7, 0x8983, 0xD3C8, 0x8AC7, 0xD3C9, 0x8B5A, 0xD3CA, 0x931F, + 0xD3CB, 0x6C93, 0xD3CC, 0x7553, 0xD3CD, 0x7B54, 0xD3CE, 0x8E0F, + 0xD3CF, 0x905D, 0xD3D0, 0x5510, 0xD3D1, 0x5802, 0xD3D2, 0x5858, + 0xD3D3, 0x5E62, 0xD3D4, 0x6207, 0xD3D5, 0x649E, 0xD3D6, 0x68E0, + 0xD3D7, 0x7576, 0xD3D8, 0x7CD6, 0xD3D9, 0x87B3, 0xD3DA, 0x9EE8, + 0xD3DB, 0x4EE3, 0xD3DC, 0x5788, 0xD3DD, 0x576E, 0xD3DE, 0x5927, + 0xD3DF, 0x5C0D, 0xD3E0, 0x5CB1, 0xD3E1, 0x5E36, 0xD3E2, 0x5F85, + 0xD3E3, 0x6234, 0xD3E4, 0x64E1, 0xD3E5, 0x73B3, 0xD3E6, 0x81FA, + 0xD3E7, 0x888B, 0xD3E8, 0x8CB8, 0xD3E9, 0x968A, 0xD3EA, 0x9EDB, + 0xD3EB, 0x5B85, 0xD3EC, 0x5FB7, 0xD3ED, 0x60B3, 0xD3EE, 0x5012, + 0xD3EF, 0x5200, 0xD3F0, 0x5230, 0xD3F1, 0x5716, 0xD3F2, 0x5835, + 0xD3F3, 0x5857, 0xD3F4, 0x5C0E, 0xD3F5, 0x5C60, 0xD3F6, 0x5CF6, + 0xD3F7, 0x5D8B, 0xD3F8, 0x5EA6, 0xD3F9, 0x5F92, 0xD3FA, 0x60BC, + 0xD3FB, 0x6311, 0xD3FC, 0x6389, 0xD3FD, 0x6417, 0xD3FE, 0x6843, + 0xD4A1, 0x68F9, 0xD4A2, 0x6AC2, 0xD4A3, 0x6DD8, 0xD4A4, 0x6E21, + 0xD4A5, 0x6ED4, 0xD4A6, 0x6FE4, 0xD4A7, 0x71FE, 0xD4A8, 0x76DC, + 0xD4A9, 0x7779, 0xD4AA, 0x79B1, 0xD4AB, 0x7A3B, 0xD4AC, 0x8404, + 0xD4AD, 0x89A9, 0xD4AE, 0x8CED, 0xD4AF, 0x8DF3, 0xD4B0, 0x8E48, + 0xD4B1, 0x9003, 0xD4B2, 0x9014, 0xD4B3, 0x9053, 0xD4B4, 0x90FD, + 0xD4B5, 0x934D, 0xD4B6, 0x9676, 0xD4B7, 0x97DC, 0xD4B8, 0x6BD2, + 0xD4B9, 0x7006, 0xD4BA, 0x7258, 0xD4BB, 0x72A2, 0xD4BC, 0x7368, + 0xD4BD, 0x7763, 0xD4BE, 0x79BF, 0xD4BF, 0x7BE4, 0xD4C0, 0x7E9B, + 0xD4C1, 0x8B80, 0xD4C2, 0x58A9, 0xD4C3, 0x60C7, 0xD4C4, 0x6566, + 0xD4C5, 0x65FD, 0xD4C6, 0x66BE, 0xD4C7, 0x6C8C, 0xD4C8, 0x711E, + 0xD4C9, 0x71C9, 0xD4CA, 0x8C5A, 0xD4CB, 0x9813, 0xD4CC, 0x4E6D, + 0xD4CD, 0x7A81, 0xD4CE, 0x4EDD, 0xD4CF, 0x51AC, 0xD4D0, 0x51CD, + 0xD4D1, 0x52D5, 0xD4D2, 0x540C, 0xD4D3, 0x61A7, 0xD4D4, 0x6771, + 0xD4D5, 0x6850, 0xD4D6, 0x68DF, 0xD4D7, 0x6D1E, 0xD4D8, 0x6F7C, + 0xD4D9, 0x75BC, 0xD4DA, 0x77B3, 0xD4DB, 0x7AE5, 0xD4DC, 0x80F4, + 0xD4DD, 0x8463, 0xD4DE, 0x9285, 0xD4DF, 0x515C, 0xD4E0, 0x6597, + 0xD4E1, 0x675C, 0xD4E2, 0x6793, 0xD4E3, 0x75D8, 0xD4E4, 0x7AC7, + 0xD4E5, 0x8373, 0xD4E6, 0xF95A, 0xD4E7, 0x8C46, 0xD4E8, 0x9017, + 0xD4E9, 0x982D, 0xD4EA, 0x5C6F, 0xD4EB, 0x81C0, 0xD4EC, 0x829A, + 0xD4ED, 0x9041, 0xD4EE, 0x906F, 0xD4EF, 0x920D, 0xD4F0, 0x5F97, + 0xD4F1, 0x5D9D, 0xD4F2, 0x6A59, 0xD4F3, 0x71C8, 0xD4F4, 0x767B, + 0xD4F5, 0x7B49, 0xD4F6, 0x85E4, 0xD4F7, 0x8B04, 0xD4F8, 0x9127, + 0xD4F9, 0x9A30, 0xD4FA, 0x5587, 0xD4FB, 0x61F6, 0xD4FC, 0xF95B, + 0xD4FD, 0x7669, 0xD4FE, 0x7F85, 0xD5A1, 0x863F, 0xD5A2, 0x87BA, + 0xD5A3, 0x88F8, 0xD5A4, 0x908F, 0xD5A5, 0xF95C, 0xD5A6, 0x6D1B, + 0xD5A7, 0x70D9, 0xD5A8, 0x73DE, 0xD5A9, 0x7D61, 0xD5AA, 0x843D, + 0xD5AB, 0xF95D, 0xD5AC, 0x916A, 0xD5AD, 0x99F1, 0xD5AE, 0xF95E, + 0xD5AF, 0x4E82, 0xD5B0, 0x5375, 0xD5B1, 0x6B04, 0xD5B2, 0x6B12, + 0xD5B3, 0x703E, 0xD5B4, 0x721B, 0xD5B5, 0x862D, 0xD5B6, 0x9E1E, + 0xD5B7, 0x524C, 0xD5B8, 0x8FA3, 0xD5B9, 0x5D50, 0xD5BA, 0x64E5, + 0xD5BB, 0x652C, 0xD5BC, 0x6B16, 0xD5BD, 0x6FEB, 0xD5BE, 0x7C43, + 0xD5BF, 0x7E9C, 0xD5C0, 0x85CD, 0xD5C1, 0x8964, 0xD5C2, 0x89BD, + 0xD5C3, 0x62C9, 0xD5C4, 0x81D8, 0xD5C5, 0x881F, 0xD5C6, 0x5ECA, + 0xD5C7, 0x6717, 0xD5C8, 0x6D6A, 0xD5C9, 0x72FC, 0xD5CA, 0x7405, + 0xD5CB, 0x746F, 0xD5CC, 0x8782, 0xD5CD, 0x90DE, 0xD5CE, 0x4F86, + 0xD5CF, 0x5D0D, 0xD5D0, 0x5FA0, 0xD5D1, 0x840A, 0xD5D2, 0x51B7, + 0xD5D3, 0x63A0, 0xD5D4, 0x7565, 0xD5D5, 0x4EAE, 0xD5D6, 0x5006, + 0xD5D7, 0x5169, 0xD5D8, 0x51C9, 0xD5D9, 0x6881, 0xD5DA, 0x6A11, + 0xD5DB, 0x7CAE, 0xD5DC, 0x7CB1, 0xD5DD, 0x7CE7, 0xD5DE, 0x826F, + 0xD5DF, 0x8AD2, 0xD5E0, 0x8F1B, 0xD5E1, 0x91CF, 0xD5E2, 0x4FB6, + 0xD5E3, 0x5137, 0xD5E4, 0x52F5, 0xD5E5, 0x5442, 0xD5E6, 0x5EEC, + 0xD5E7, 0x616E, 0xD5E8, 0x623E, 0xD5E9, 0x65C5, 0xD5EA, 0x6ADA, + 0xD5EB, 0x6FFE, 0xD5EC, 0x792A, 0xD5ED, 0x85DC, 0xD5EE, 0x8823, + 0xD5EF, 0x95AD, 0xD5F0, 0x9A62, 0xD5F1, 0x9A6A, 0xD5F2, 0x9E97, + 0xD5F3, 0x9ECE, 0xD5F4, 0x529B, 0xD5F5, 0x66C6, 0xD5F6, 0x6B77, + 0xD5F7, 0x701D, 0xD5F8, 0x792B, 0xD5F9, 0x8F62, 0xD5FA, 0x9742, + 0xD5FB, 0x6190, 0xD5FC, 0x6200, 0xD5FD, 0x6523, 0xD5FE, 0x6F23, + 0xD6A1, 0x7149, 0xD6A2, 0x7489, 0xD6A3, 0x7DF4, 0xD6A4, 0x806F, + 0xD6A5, 0x84EE, 0xD6A6, 0x8F26, 0xD6A7, 0x9023, 0xD6A8, 0x934A, + 0xD6A9, 0x51BD, 0xD6AA, 0x5217, 0xD6AB, 0x52A3, 0xD6AC, 0x6D0C, + 0xD6AD, 0x70C8, 0xD6AE, 0x88C2, 0xD6AF, 0x5EC9, 0xD6B0, 0x6582, + 0xD6B1, 0x6BAE, 0xD6B2, 0x6FC2, 0xD6B3, 0x7C3E, 0xD6B4, 0x7375, + 0xD6B5, 0x4EE4, 0xD6B6, 0x4F36, 0xD6B7, 0x56F9, 0xD6B8, 0xF95F, + 0xD6B9, 0x5CBA, 0xD6BA, 0x5DBA, 0xD6BB, 0x601C, 0xD6BC, 0x73B2, + 0xD6BD, 0x7B2D, 0xD6BE, 0x7F9A, 0xD6BF, 0x7FCE, 0xD6C0, 0x8046, + 0xD6C1, 0x901E, 0xD6C2, 0x9234, 0xD6C3, 0x96F6, 0xD6C4, 0x9748, + 0xD6C5, 0x9818, 0xD6C6, 0x9F61, 0xD6C7, 0x4F8B, 0xD6C8, 0x6FA7, + 0xD6C9, 0x79AE, 0xD6CA, 0x91B4, 0xD6CB, 0x96B7, 0xD6CC, 0x52DE, + 0xD6CD, 0xF960, 0xD6CE, 0x6488, 0xD6CF, 0x64C4, 0xD6D0, 0x6AD3, + 0xD6D1, 0x6F5E, 0xD6D2, 0x7018, 0xD6D3, 0x7210, 0xD6D4, 0x76E7, + 0xD6D5, 0x8001, 0xD6D6, 0x8606, 0xD6D7, 0x865C, 0xD6D8, 0x8DEF, + 0xD6D9, 0x8F05, 0xD6DA, 0x9732, 0xD6DB, 0x9B6F, 0xD6DC, 0x9DFA, + 0xD6DD, 0x9E75, 0xD6DE, 0x788C, 0xD6DF, 0x797F, 0xD6E0, 0x7DA0, + 0xD6E1, 0x83C9, 0xD6E2, 0x9304, 0xD6E3, 0x9E7F, 0xD6E4, 0x9E93, + 0xD6E5, 0x8AD6, 0xD6E6, 0x58DF, 0xD6E7, 0x5F04, 0xD6E8, 0x6727, + 0xD6E9, 0x7027, 0xD6EA, 0x74CF, 0xD6EB, 0x7C60, 0xD6EC, 0x807E, + 0xD6ED, 0x5121, 0xD6EE, 0x7028, 0xD6EF, 0x7262, 0xD6F0, 0x78CA, + 0xD6F1, 0x8CC2, 0xD6F2, 0x8CDA, 0xD6F3, 0x8CF4, 0xD6F4, 0x96F7, + 0xD6F5, 0x4E86, 0xD6F6, 0x50DA, 0xD6F7, 0x5BEE, 0xD6F8, 0x5ED6, + 0xD6F9, 0x6599, 0xD6FA, 0x71CE, 0xD6FB, 0x7642, 0xD6FC, 0x77AD, + 0xD6FD, 0x804A, 0xD6FE, 0x84FC, 0xD7A1, 0x907C, 0xD7A2, 0x9B27, + 0xD7A3, 0x9F8D, 0xD7A4, 0x58D8, 0xD7A5, 0x5A41, 0xD7A6, 0x5C62, + 0xD7A7, 0x6A13, 0xD7A8, 0x6DDA, 0xD7A9, 0x6F0F, 0xD7AA, 0x763B, + 0xD7AB, 0x7D2F, 0xD7AC, 0x7E37, 0xD7AD, 0x851E, 0xD7AE, 0x8938, + 0xD7AF, 0x93E4, 0xD7B0, 0x964B, 0xD7B1, 0x5289, 0xD7B2, 0x65D2, + 0xD7B3, 0x67F3, 0xD7B4, 0x69B4, 0xD7B5, 0x6D41, 0xD7B6, 0x6E9C, + 0xD7B7, 0x700F, 0xD7B8, 0x7409, 0xD7B9, 0x7460, 0xD7BA, 0x7559, + 0xD7BB, 0x7624, 0xD7BC, 0x786B, 0xD7BD, 0x8B2C, 0xD7BE, 0x985E, + 0xD7BF, 0x516D, 0xD7C0, 0x622E, 0xD7C1, 0x9678, 0xD7C2, 0x4F96, + 0xD7C3, 0x502B, 0xD7C4, 0x5D19, 0xD7C5, 0x6DEA, 0xD7C6, 0x7DB8, + 0xD7C7, 0x8F2A, 0xD7C8, 0x5F8B, 0xD7C9, 0x6144, 0xD7CA, 0x6817, + 0xD7CB, 0xF961, 0xD7CC, 0x9686, 0xD7CD, 0x52D2, 0xD7CE, 0x808B, + 0xD7CF, 0x51DC, 0xD7D0, 0x51CC, 0xD7D1, 0x695E, 0xD7D2, 0x7A1C, + 0xD7D3, 0x7DBE, 0xD7D4, 0x83F1, 0xD7D5, 0x9675, 0xD7D6, 0x4FDA, + 0xD7D7, 0x5229, 0xD7D8, 0x5398, 0xD7D9, 0x540F, 0xD7DA, 0x550E, + 0xD7DB, 0x5C65, 0xD7DC, 0x60A7, 0xD7DD, 0x674E, 0xD7DE, 0x68A8, + 0xD7DF, 0x6D6C, 0xD7E0, 0x7281, 0xD7E1, 0x72F8, 0xD7E2, 0x7406, + 0xD7E3, 0x7483, 0xD7E4, 0xF962, 0xD7E5, 0x75E2, 0xD7E6, 0x7C6C, + 0xD7E7, 0x7F79, 0xD7E8, 0x7FB8, 0xD7E9, 0x8389, 0xD7EA, 0x88CF, + 0xD7EB, 0x88E1, 0xD7EC, 0x91CC, 0xD7ED, 0x91D0, 0xD7EE, 0x96E2, + 0xD7EF, 0x9BC9, 0xD7F0, 0x541D, 0xD7F1, 0x6F7E, 0xD7F2, 0x71D0, + 0xD7F3, 0x7498, 0xD7F4, 0x85FA, 0xD7F5, 0x8EAA, 0xD7F6, 0x96A3, + 0xD7F7, 0x9C57, 0xD7F8, 0x9E9F, 0xD7F9, 0x6797, 0xD7FA, 0x6DCB, + 0xD7FB, 0x7433, 0xD7FC, 0x81E8, 0xD7FD, 0x9716, 0xD7FE, 0x782C, + 0xD8A1, 0x7ACB, 0xD8A2, 0x7B20, 0xD8A3, 0x7C92, 0xD8A4, 0x6469, + 0xD8A5, 0x746A, 0xD8A6, 0x75F2, 0xD8A7, 0x78BC, 0xD8A8, 0x78E8, + 0xD8A9, 0x99AC, 0xD8AA, 0x9B54, 0xD8AB, 0x9EBB, 0xD8AC, 0x5BDE, + 0xD8AD, 0x5E55, 0xD8AE, 0x6F20, 0xD8AF, 0x819C, 0xD8B0, 0x83AB, + 0xD8B1, 0x9088, 0xD8B2, 0x4E07, 0xD8B3, 0x534D, 0xD8B4, 0x5A29, + 0xD8B5, 0x5DD2, 0xD8B6, 0x5F4E, 0xD8B7, 0x6162, 0xD8B8, 0x633D, + 0xD8B9, 0x6669, 0xD8BA, 0x66FC, 0xD8BB, 0x6EFF, 0xD8BC, 0x6F2B, + 0xD8BD, 0x7063, 0xD8BE, 0x779E, 0xD8BF, 0x842C, 0xD8C0, 0x8513, + 0xD8C1, 0x883B, 0xD8C2, 0x8F13, 0xD8C3, 0x9945, 0xD8C4, 0x9C3B, + 0xD8C5, 0x551C, 0xD8C6, 0x62B9, 0xD8C7, 0x672B, 0xD8C8, 0x6CAB, + 0xD8C9, 0x8309, 0xD8CA, 0x896A, 0xD8CB, 0x977A, 0xD8CC, 0x4EA1, + 0xD8CD, 0x5984, 0xD8CE, 0x5FD8, 0xD8CF, 0x5FD9, 0xD8D0, 0x671B, + 0xD8D1, 0x7DB2, 0xD8D2, 0x7F54, 0xD8D3, 0x8292, 0xD8D4, 0x832B, + 0xD8D5, 0x83BD, 0xD8D6, 0x8F1E, 0xD8D7, 0x9099, 0xD8D8, 0x57CB, + 0xD8D9, 0x59B9, 0xD8DA, 0x5A92, 0xD8DB, 0x5BD0, 0xD8DC, 0x6627, + 0xD8DD, 0x679A, 0xD8DE, 0x6885, 0xD8DF, 0x6BCF, 0xD8E0, 0x7164, + 0xD8E1, 0x7F75, 0xD8E2, 0x8CB7, 0xD8E3, 0x8CE3, 0xD8E4, 0x9081, + 0xD8E5, 0x9B45, 0xD8E6, 0x8108, 0xD8E7, 0x8C8A, 0xD8E8, 0x964C, + 0xD8E9, 0x9A40, 0xD8EA, 0x9EA5, 0xD8EB, 0x5B5F, 0xD8EC, 0x6C13, + 0xD8ED, 0x731B, 0xD8EE, 0x76F2, 0xD8EF, 0x76DF, 0xD8F0, 0x840C, + 0xD8F1, 0x51AA, 0xD8F2, 0x8993, 0xD8F3, 0x514D, 0xD8F4, 0x5195, + 0xD8F5, 0x52C9, 0xD8F6, 0x68C9, 0xD8F7, 0x6C94, 0xD8F8, 0x7704, + 0xD8F9, 0x7720, 0xD8FA, 0x7DBF, 0xD8FB, 0x7DEC, 0xD8FC, 0x9762, + 0xD8FD, 0x9EB5, 0xD8FE, 0x6EC5, 0xD9A1, 0x8511, 0xD9A2, 0x51A5, + 0xD9A3, 0x540D, 0xD9A4, 0x547D, 0xD9A5, 0x660E, 0xD9A6, 0x669D, + 0xD9A7, 0x6927, 0xD9A8, 0x6E9F, 0xD9A9, 0x76BF, 0xD9AA, 0x7791, + 0xD9AB, 0x8317, 0xD9AC, 0x84C2, 0xD9AD, 0x879F, 0xD9AE, 0x9169, + 0xD9AF, 0x9298, 0xD9B0, 0x9CF4, 0xD9B1, 0x8882, 0xD9B2, 0x4FAE, + 0xD9B3, 0x5192, 0xD9B4, 0x52DF, 0xD9B5, 0x59C6, 0xD9B6, 0x5E3D, + 0xD9B7, 0x6155, 0xD9B8, 0x6478, 0xD9B9, 0x6479, 0xD9BA, 0x66AE, + 0xD9BB, 0x67D0, 0xD9BC, 0x6A21, 0xD9BD, 0x6BCD, 0xD9BE, 0x6BDB, + 0xD9BF, 0x725F, 0xD9C0, 0x7261, 0xD9C1, 0x7441, 0xD9C2, 0x7738, + 0xD9C3, 0x77DB, 0xD9C4, 0x8017, 0xD9C5, 0x82BC, 0xD9C6, 0x8305, + 0xD9C7, 0x8B00, 0xD9C8, 0x8B28, 0xD9C9, 0x8C8C, 0xD9CA, 0x6728, + 0xD9CB, 0x6C90, 0xD9CC, 0x7267, 0xD9CD, 0x76EE, 0xD9CE, 0x7766, + 0xD9CF, 0x7A46, 0xD9D0, 0x9DA9, 0xD9D1, 0x6B7F, 0xD9D2, 0x6C92, + 0xD9D3, 0x5922, 0xD9D4, 0x6726, 0xD9D5, 0x8499, 0xD9D6, 0x536F, + 0xD9D7, 0x5893, 0xD9D8, 0x5999, 0xD9D9, 0x5EDF, 0xD9DA, 0x63CF, + 0xD9DB, 0x6634, 0xD9DC, 0x6773, 0xD9DD, 0x6E3A, 0xD9DE, 0x732B, + 0xD9DF, 0x7AD7, 0xD9E0, 0x82D7, 0xD9E1, 0x9328, 0xD9E2, 0x52D9, + 0xD9E3, 0x5DEB, 0xD9E4, 0x61AE, 0xD9E5, 0x61CB, 0xD9E6, 0x620A, + 0xD9E7, 0x62C7, 0xD9E8, 0x64AB, 0xD9E9, 0x65E0, 0xD9EA, 0x6959, + 0xD9EB, 0x6B66, 0xD9EC, 0x6BCB, 0xD9ED, 0x7121, 0xD9EE, 0x73F7, + 0xD9EF, 0x755D, 0xD9F0, 0x7E46, 0xD9F1, 0x821E, 0xD9F2, 0x8302, + 0xD9F3, 0x856A, 0xD9F4, 0x8AA3, 0xD9F5, 0x8CBF, 0xD9F6, 0x9727, + 0xD9F7, 0x9D61, 0xD9F8, 0x58A8, 0xD9F9, 0x9ED8, 0xD9FA, 0x5011, + 0xD9FB, 0x520E, 0xD9FC, 0x543B, 0xD9FD, 0x554F, 0xD9FE, 0x6587, + 0xDAA1, 0x6C76, 0xDAA2, 0x7D0A, 0xDAA3, 0x7D0B, 0xDAA4, 0x805E, + 0xDAA5, 0x868A, 0xDAA6, 0x9580, 0xDAA7, 0x96EF, 0xDAA8, 0x52FF, + 0xDAA9, 0x6C95, 0xDAAA, 0x7269, 0xDAAB, 0x5473, 0xDAAC, 0x5A9A, + 0xDAAD, 0x5C3E, 0xDAAE, 0x5D4B, 0xDAAF, 0x5F4C, 0xDAB0, 0x5FAE, + 0xDAB1, 0x672A, 0xDAB2, 0x68B6, 0xDAB3, 0x6963, 0xDAB4, 0x6E3C, + 0xDAB5, 0x6E44, 0xDAB6, 0x7709, 0xDAB7, 0x7C73, 0xDAB8, 0x7F8E, + 0xDAB9, 0x8587, 0xDABA, 0x8B0E, 0xDABB, 0x8FF7, 0xDABC, 0x9761, + 0xDABD, 0x9EF4, 0xDABE, 0x5CB7, 0xDABF, 0x60B6, 0xDAC0, 0x610D, + 0xDAC1, 0x61AB, 0xDAC2, 0x654F, 0xDAC3, 0x65FB, 0xDAC4, 0x65FC, + 0xDAC5, 0x6C11, 0xDAC6, 0x6CEF, 0xDAC7, 0x739F, 0xDAC8, 0x73C9, + 0xDAC9, 0x7DE1, 0xDACA, 0x9594, 0xDACB, 0x5BC6, 0xDACC, 0x871C, + 0xDACD, 0x8B10, 0xDACE, 0x525D, 0xDACF, 0x535A, 0xDAD0, 0x62CD, + 0xDAD1, 0x640F, 0xDAD2, 0x64B2, 0xDAD3, 0x6734, 0xDAD4, 0x6A38, + 0xDAD5, 0x6CCA, 0xDAD6, 0x73C0, 0xDAD7, 0x749E, 0xDAD8, 0x7B94, + 0xDAD9, 0x7C95, 0xDADA, 0x7E1B, 0xDADB, 0x818A, 0xDADC, 0x8236, + 0xDADD, 0x8584, 0xDADE, 0x8FEB, 0xDADF, 0x96F9, 0xDAE0, 0x99C1, + 0xDAE1, 0x4F34, 0xDAE2, 0x534A, 0xDAE3, 0x53CD, 0xDAE4, 0x53DB, + 0xDAE5, 0x62CC, 0xDAE6, 0x642C, 0xDAE7, 0x6500, 0xDAE8, 0x6591, + 0xDAE9, 0x69C3, 0xDAEA, 0x6CEE, 0xDAEB, 0x6F58, 0xDAEC, 0x73ED, + 0xDAED, 0x7554, 0xDAEE, 0x7622, 0xDAEF, 0x76E4, 0xDAF0, 0x76FC, + 0xDAF1, 0x78D0, 0xDAF2, 0x78FB, 0xDAF3, 0x792C, 0xDAF4, 0x7D46, + 0xDAF5, 0x822C, 0xDAF6, 0x87E0, 0xDAF7, 0x8FD4, 0xDAF8, 0x9812, + 0xDAF9, 0x98EF, 0xDAFA, 0x52C3, 0xDAFB, 0x62D4, 0xDAFC, 0x64A5, + 0xDAFD, 0x6E24, 0xDAFE, 0x6F51, 0xDBA1, 0x767C, 0xDBA2, 0x8DCB, + 0xDBA3, 0x91B1, 0xDBA4, 0x9262, 0xDBA5, 0x9AEE, 0xDBA6, 0x9B43, + 0xDBA7, 0x5023, 0xDBA8, 0x508D, 0xDBA9, 0x574A, 0xDBAA, 0x59A8, + 0xDBAB, 0x5C28, 0xDBAC, 0x5E47, 0xDBAD, 0x5F77, 0xDBAE, 0x623F, + 0xDBAF, 0x653E, 0xDBB0, 0x65B9, 0xDBB1, 0x65C1, 0xDBB2, 0x6609, + 0xDBB3, 0x678B, 0xDBB4, 0x699C, 0xDBB5, 0x6EC2, 0xDBB6, 0x78C5, + 0xDBB7, 0x7D21, 0xDBB8, 0x80AA, 0xDBB9, 0x8180, 0xDBBA, 0x822B, + 0xDBBB, 0x82B3, 0xDBBC, 0x84A1, 0xDBBD, 0x868C, 0xDBBE, 0x8A2A, + 0xDBBF, 0x8B17, 0xDBC0, 0x90A6, 0xDBC1, 0x9632, 0xDBC2, 0x9F90, + 0xDBC3, 0x500D, 0xDBC4, 0x4FF3, 0xDBC5, 0xF963, 0xDBC6, 0x57F9, + 0xDBC7, 0x5F98, 0xDBC8, 0x62DC, 0xDBC9, 0x6392, 0xDBCA, 0x676F, + 0xDBCB, 0x6E43, 0xDBCC, 0x7119, 0xDBCD, 0x76C3, 0xDBCE, 0x80CC, + 0xDBCF, 0x80DA, 0xDBD0, 0x88F4, 0xDBD1, 0x88F5, 0xDBD2, 0x8919, + 0xDBD3, 0x8CE0, 0xDBD4, 0x8F29, 0xDBD5, 0x914D, 0xDBD6, 0x966A, + 0xDBD7, 0x4F2F, 0xDBD8, 0x4F70, 0xDBD9, 0x5E1B, 0xDBDA, 0x67CF, + 0xDBDB, 0x6822, 0xDBDC, 0x767D, 0xDBDD, 0x767E, 0xDBDE, 0x9B44, + 0xDBDF, 0x5E61, 0xDBE0, 0x6A0A, 0xDBE1, 0x7169, 0xDBE2, 0x71D4, + 0xDBE3, 0x756A, 0xDBE4, 0xF964, 0xDBE5, 0x7E41, 0xDBE6, 0x8543, + 0xDBE7, 0x85E9, 0xDBE8, 0x98DC, 0xDBE9, 0x4F10, 0xDBEA, 0x7B4F, + 0xDBEB, 0x7F70, 0xDBEC, 0x95A5, 0xDBED, 0x51E1, 0xDBEE, 0x5E06, + 0xDBEF, 0x68B5, 0xDBF0, 0x6C3E, 0xDBF1, 0x6C4E, 0xDBF2, 0x6CDB, + 0xDBF3, 0x72AF, 0xDBF4, 0x7BC4, 0xDBF5, 0x8303, 0xDBF6, 0x6CD5, + 0xDBF7, 0x743A, 0xDBF8, 0x50FB, 0xDBF9, 0x5288, 0xDBFA, 0x58C1, + 0xDBFB, 0x64D8, 0xDBFC, 0x6A97, 0xDBFD, 0x74A7, 0xDBFE, 0x7656, + 0xDCA1, 0x78A7, 0xDCA2, 0x8617, 0xDCA3, 0x95E2, 0xDCA4, 0x9739, + 0xDCA5, 0xF965, 0xDCA6, 0x535E, 0xDCA7, 0x5F01, 0xDCA8, 0x8B8A, + 0xDCA9, 0x8FA8, 0xDCAA, 0x8FAF, 0xDCAB, 0x908A, 0xDCAC, 0x5225, + 0xDCAD, 0x77A5, 0xDCAE, 0x9C49, 0xDCAF, 0x9F08, 0xDCB0, 0x4E19, + 0xDCB1, 0x5002, 0xDCB2, 0x5175, 0xDCB3, 0x5C5B, 0xDCB4, 0x5E77, + 0xDCB5, 0x661E, 0xDCB6, 0x663A, 0xDCB7, 0x67C4, 0xDCB8, 0x68C5, + 0xDCB9, 0x70B3, 0xDCBA, 0x7501, 0xDCBB, 0x75C5, 0xDCBC, 0x79C9, + 0xDCBD, 0x7ADD, 0xDCBE, 0x8F27, 0xDCBF, 0x9920, 0xDCC0, 0x9A08, + 0xDCC1, 0x4FDD, 0xDCC2, 0x5821, 0xDCC3, 0x5831, 0xDCC4, 0x5BF6, + 0xDCC5, 0x666E, 0xDCC6, 0x6B65, 0xDCC7, 0x6D11, 0xDCC8, 0x6E7A, + 0xDCC9, 0x6F7D, 0xDCCA, 0x73E4, 0xDCCB, 0x752B, 0xDCCC, 0x83E9, + 0xDCCD, 0x88DC, 0xDCCE, 0x8913, 0xDCCF, 0x8B5C, 0xDCD0, 0x8F14, + 0xDCD1, 0x4F0F, 0xDCD2, 0x50D5, 0xDCD3, 0x5310, 0xDCD4, 0x535C, + 0xDCD5, 0x5B93, 0xDCD6, 0x5FA9, 0xDCD7, 0x670D, 0xDCD8, 0x798F, + 0xDCD9, 0x8179, 0xDCDA, 0x832F, 0xDCDB, 0x8514, 0xDCDC, 0x8907, + 0xDCDD, 0x8986, 0xDCDE, 0x8F39, 0xDCDF, 0x8F3B, 0xDCE0, 0x99A5, + 0xDCE1, 0x9C12, 0xDCE2, 0x672C, 0xDCE3, 0x4E76, 0xDCE4, 0x4FF8, + 0xDCE5, 0x5949, 0xDCE6, 0x5C01, 0xDCE7, 0x5CEF, 0xDCE8, 0x5CF0, + 0xDCE9, 0x6367, 0xDCEA, 0x68D2, 0xDCEB, 0x70FD, 0xDCEC, 0x71A2, + 0xDCED, 0x742B, 0xDCEE, 0x7E2B, 0xDCEF, 0x84EC, 0xDCF0, 0x8702, + 0xDCF1, 0x9022, 0xDCF2, 0x92D2, 0xDCF3, 0x9CF3, 0xDCF4, 0x4E0D, + 0xDCF5, 0x4ED8, 0xDCF6, 0x4FEF, 0xDCF7, 0x5085, 0xDCF8, 0x5256, + 0xDCF9, 0x526F, 0xDCFA, 0x5426, 0xDCFB, 0x5490, 0xDCFC, 0x57E0, + 0xDCFD, 0x592B, 0xDCFE, 0x5A66, 0xDDA1, 0x5B5A, 0xDDA2, 0x5B75, + 0xDDA3, 0x5BCC, 0xDDA4, 0x5E9C, 0xDDA5, 0xF966, 0xDDA6, 0x6276, + 0xDDA7, 0x6577, 0xDDA8, 0x65A7, 0xDDA9, 0x6D6E, 0xDDAA, 0x6EA5, + 0xDDAB, 0x7236, 0xDDAC, 0x7B26, 0xDDAD, 0x7C3F, 0xDDAE, 0x7F36, + 0xDDAF, 0x8150, 0xDDB0, 0x8151, 0xDDB1, 0x819A, 0xDDB2, 0x8240, + 0xDDB3, 0x8299, 0xDDB4, 0x83A9, 0xDDB5, 0x8A03, 0xDDB6, 0x8CA0, + 0xDDB7, 0x8CE6, 0xDDB8, 0x8CFB, 0xDDB9, 0x8D74, 0xDDBA, 0x8DBA, + 0xDDBB, 0x90E8, 0xDDBC, 0x91DC, 0xDDBD, 0x961C, 0xDDBE, 0x9644, + 0xDDBF, 0x99D9, 0xDDC0, 0x9CE7, 0xDDC1, 0x5317, 0xDDC2, 0x5206, + 0xDDC3, 0x5429, 0xDDC4, 0x5674, 0xDDC5, 0x58B3, 0xDDC6, 0x5954, + 0xDDC7, 0x596E, 0xDDC8, 0x5FFF, 0xDDC9, 0x61A4, 0xDDCA, 0x626E, + 0xDDCB, 0x6610, 0xDDCC, 0x6C7E, 0xDDCD, 0x711A, 0xDDCE, 0x76C6, + 0xDDCF, 0x7C89, 0xDDD0, 0x7CDE, 0xDDD1, 0x7D1B, 0xDDD2, 0x82AC, + 0xDDD3, 0x8CC1, 0xDDD4, 0x96F0, 0xDDD5, 0xF967, 0xDDD6, 0x4F5B, + 0xDDD7, 0x5F17, 0xDDD8, 0x5F7F, 0xDDD9, 0x62C2, 0xDDDA, 0x5D29, + 0xDDDB, 0x670B, 0xDDDC, 0x68DA, 0xDDDD, 0x787C, 0xDDDE, 0x7E43, + 0xDDDF, 0x9D6C, 0xDDE0, 0x4E15, 0xDDE1, 0x5099, 0xDDE2, 0x5315, + 0xDDE3, 0x532A, 0xDDE4, 0x5351, 0xDDE5, 0x5983, 0xDDE6, 0x5A62, + 0xDDE7, 0x5E87, 0xDDE8, 0x60B2, 0xDDE9, 0x618A, 0xDDEA, 0x6249, + 0xDDEB, 0x6279, 0xDDEC, 0x6590, 0xDDED, 0x6787, 0xDDEE, 0x69A7, + 0xDDEF, 0x6BD4, 0xDDF0, 0x6BD6, 0xDDF1, 0x6BD7, 0xDDF2, 0x6BD8, + 0xDDF3, 0x6CB8, 0xDDF4, 0xF968, 0xDDF5, 0x7435, 0xDDF6, 0x75FA, + 0xDDF7, 0x7812, 0xDDF8, 0x7891, 0xDDF9, 0x79D5, 0xDDFA, 0x79D8, + 0xDDFB, 0x7C83, 0xDDFC, 0x7DCB, 0xDDFD, 0x7FE1, 0xDDFE, 0x80A5, + 0xDEA1, 0x813E, 0xDEA2, 0x81C2, 0xDEA3, 0x83F2, 0xDEA4, 0x871A, + 0xDEA5, 0x88E8, 0xDEA6, 0x8AB9, 0xDEA7, 0x8B6C, 0xDEA8, 0x8CBB, + 0xDEA9, 0x9119, 0xDEAA, 0x975E, 0xDEAB, 0x98DB, 0xDEAC, 0x9F3B, + 0xDEAD, 0x56AC, 0xDEAE, 0x5B2A, 0xDEAF, 0x5F6C, 0xDEB0, 0x658C, + 0xDEB1, 0x6AB3, 0xDEB2, 0x6BAF, 0xDEB3, 0x6D5C, 0xDEB4, 0x6FF1, + 0xDEB5, 0x7015, 0xDEB6, 0x725D, 0xDEB7, 0x73AD, 0xDEB8, 0x8CA7, + 0xDEB9, 0x8CD3, 0xDEBA, 0x983B, 0xDEBB, 0x6191, 0xDEBC, 0x6C37, + 0xDEBD, 0x8058, 0xDEBE, 0x9A01, 0xDEBF, 0x4E4D, 0xDEC0, 0x4E8B, + 0xDEC1, 0x4E9B, 0xDEC2, 0x4ED5, 0xDEC3, 0x4F3A, 0xDEC4, 0x4F3C, + 0xDEC5, 0x4F7F, 0xDEC6, 0x4FDF, 0xDEC7, 0x50FF, 0xDEC8, 0x53F2, + 0xDEC9, 0x53F8, 0xDECA, 0x5506, 0xDECB, 0x55E3, 0xDECC, 0x56DB, + 0xDECD, 0x58EB, 0xDECE, 0x5962, 0xDECF, 0x5A11, 0xDED0, 0x5BEB, + 0xDED1, 0x5BFA, 0xDED2, 0x5C04, 0xDED3, 0x5DF3, 0xDED4, 0x5E2B, + 0xDED5, 0x5F99, 0xDED6, 0x601D, 0xDED7, 0x6368, 0xDED8, 0x659C, + 0xDED9, 0x65AF, 0xDEDA, 0x67F6, 0xDEDB, 0x67FB, 0xDEDC, 0x68AD, + 0xDEDD, 0x6B7B, 0xDEDE, 0x6C99, 0xDEDF, 0x6CD7, 0xDEE0, 0x6E23, + 0xDEE1, 0x7009, 0xDEE2, 0x7345, 0xDEE3, 0x7802, 0xDEE4, 0x793E, + 0xDEE5, 0x7940, 0xDEE6, 0x7960, 0xDEE7, 0x79C1, 0xDEE8, 0x7BE9, + 0xDEE9, 0x7D17, 0xDEEA, 0x7D72, 0xDEEB, 0x8086, 0xDEEC, 0x820D, + 0xDEED, 0x838E, 0xDEEE, 0x84D1, 0xDEEF, 0x86C7, 0xDEF0, 0x88DF, + 0xDEF1, 0x8A50, 0xDEF2, 0x8A5E, 0xDEF3, 0x8B1D, 0xDEF4, 0x8CDC, + 0xDEF5, 0x8D66, 0xDEF6, 0x8FAD, 0xDEF7, 0x90AA, 0xDEF8, 0x98FC, + 0xDEF9, 0x99DF, 0xDEFA, 0x9E9D, 0xDEFB, 0x524A, 0xDEFC, 0xF969, + 0xDEFD, 0x6714, 0xDEFE, 0xF96A, 0xDFA1, 0x5098, 0xDFA2, 0x522A, + 0xDFA3, 0x5C71, 0xDFA4, 0x6563, 0xDFA5, 0x6C55, 0xDFA6, 0x73CA, + 0xDFA7, 0x7523, 0xDFA8, 0x759D, 0xDFA9, 0x7B97, 0xDFAA, 0x849C, + 0xDFAB, 0x9178, 0xDFAC, 0x9730, 0xDFAD, 0x4E77, 0xDFAE, 0x6492, + 0xDFAF, 0x6BBA, 0xDFB0, 0x715E, 0xDFB1, 0x85A9, 0xDFB2, 0x4E09, + 0xDFB3, 0xF96B, 0xDFB4, 0x6749, 0xDFB5, 0x68EE, 0xDFB6, 0x6E17, + 0xDFB7, 0x829F, 0xDFB8, 0x8518, 0xDFB9, 0x886B, 0xDFBA, 0x63F7, + 0xDFBB, 0x6F81, 0xDFBC, 0x9212, 0xDFBD, 0x98AF, 0xDFBE, 0x4E0A, + 0xDFBF, 0x50B7, 0xDFC0, 0x50CF, 0xDFC1, 0x511F, 0xDFC2, 0x5546, + 0xDFC3, 0x55AA, 0xDFC4, 0x5617, 0xDFC5, 0x5B40, 0xDFC6, 0x5C19, + 0xDFC7, 0x5CE0, 0xDFC8, 0x5E38, 0xDFC9, 0x5E8A, 0xDFCA, 0x5EA0, + 0xDFCB, 0x5EC2, 0xDFCC, 0x60F3, 0xDFCD, 0x6851, 0xDFCE, 0x6A61, + 0xDFCF, 0x6E58, 0xDFD0, 0x723D, 0xDFD1, 0x7240, 0xDFD2, 0x72C0, + 0xDFD3, 0x76F8, 0xDFD4, 0x7965, 0xDFD5, 0x7BB1, 0xDFD6, 0x7FD4, + 0xDFD7, 0x88F3, 0xDFD8, 0x89F4, 0xDFD9, 0x8A73, 0xDFDA, 0x8C61, + 0xDFDB, 0x8CDE, 0xDFDC, 0x971C, 0xDFDD, 0x585E, 0xDFDE, 0x74BD, + 0xDFDF, 0x8CFD, 0xDFE0, 0x55C7, 0xDFE1, 0xF96C, 0xDFE2, 0x7A61, + 0xDFE3, 0x7D22, 0xDFE4, 0x8272, 0xDFE5, 0x7272, 0xDFE6, 0x751F, + 0xDFE7, 0x7525, 0xDFE8, 0xF96D, 0xDFE9, 0x7B19, 0xDFEA, 0x5885, + 0xDFEB, 0x58FB, 0xDFEC, 0x5DBC, 0xDFED, 0x5E8F, 0xDFEE, 0x5EB6, + 0xDFEF, 0x5F90, 0xDFF0, 0x6055, 0xDFF1, 0x6292, 0xDFF2, 0x637F, + 0xDFF3, 0x654D, 0xDFF4, 0x6691, 0xDFF5, 0x66D9, 0xDFF6, 0x66F8, + 0xDFF7, 0x6816, 0xDFF8, 0x68F2, 0xDFF9, 0x7280, 0xDFFA, 0x745E, + 0xDFFB, 0x7B6E, 0xDFFC, 0x7D6E, 0xDFFD, 0x7DD6, 0xDFFE, 0x7F72, + 0xE0A1, 0x80E5, 0xE0A2, 0x8212, 0xE0A3, 0x85AF, 0xE0A4, 0x897F, + 0xE0A5, 0x8A93, 0xE0A6, 0x901D, 0xE0A7, 0x92E4, 0xE0A8, 0x9ECD, + 0xE0A9, 0x9F20, 0xE0AA, 0x5915, 0xE0AB, 0x596D, 0xE0AC, 0x5E2D, + 0xE0AD, 0x60DC, 0xE0AE, 0x6614, 0xE0AF, 0x6673, 0xE0B0, 0x6790, + 0xE0B1, 0x6C50, 0xE0B2, 0x6DC5, 0xE0B3, 0x6F5F, 0xE0B4, 0x77F3, + 0xE0B5, 0x78A9, 0xE0B6, 0x84C6, 0xE0B7, 0x91CB, 0xE0B8, 0x932B, + 0xE0B9, 0x4ED9, 0xE0BA, 0x50CA, 0xE0BB, 0x5148, 0xE0BC, 0x5584, + 0xE0BD, 0x5B0B, 0xE0BE, 0x5BA3, 0xE0BF, 0x6247, 0xE0C0, 0x657E, + 0xE0C1, 0x65CB, 0xE0C2, 0x6E32, 0xE0C3, 0x717D, 0xE0C4, 0x7401, + 0xE0C5, 0x7444, 0xE0C6, 0x7487, 0xE0C7, 0x74BF, 0xE0C8, 0x766C, + 0xE0C9, 0x79AA, 0xE0CA, 0x7DDA, 0xE0CB, 0x7E55, 0xE0CC, 0x7FA8, + 0xE0CD, 0x817A, 0xE0CE, 0x81B3, 0xE0CF, 0x8239, 0xE0D0, 0x861A, + 0xE0D1, 0x87EC, 0xE0D2, 0x8A75, 0xE0D3, 0x8DE3, 0xE0D4, 0x9078, + 0xE0D5, 0x9291, 0xE0D6, 0x9425, 0xE0D7, 0x994D, 0xE0D8, 0x9BAE, + 0xE0D9, 0x5368, 0xE0DA, 0x5C51, 0xE0DB, 0x6954, 0xE0DC, 0x6CC4, + 0xE0DD, 0x6D29, 0xE0DE, 0x6E2B, 0xE0DF, 0x820C, 0xE0E0, 0x859B, + 0xE0E1, 0x893B, 0xE0E2, 0x8A2D, 0xE0E3, 0x8AAA, 0xE0E4, 0x96EA, + 0xE0E5, 0x9F67, 0xE0E6, 0x5261, 0xE0E7, 0x66B9, 0xE0E8, 0x6BB2, + 0xE0E9, 0x7E96, 0xE0EA, 0x87FE, 0xE0EB, 0x8D0D, 0xE0EC, 0x9583, + 0xE0ED, 0x965D, 0xE0EE, 0x651D, 0xE0EF, 0x6D89, 0xE0F0, 0x71EE, + 0xE0F1, 0xF96E, 0xE0F2, 0x57CE, 0xE0F3, 0x59D3, 0xE0F4, 0x5BAC, + 0xE0F5, 0x6027, 0xE0F6, 0x60FA, 0xE0F7, 0x6210, 0xE0F8, 0x661F, + 0xE0F9, 0x665F, 0xE0FA, 0x7329, 0xE0FB, 0x73F9, 0xE0FC, 0x76DB, + 0xE0FD, 0x7701, 0xE0FE, 0x7B6C, 0xE1A1, 0x8056, 0xE1A2, 0x8072, + 0xE1A3, 0x8165, 0xE1A4, 0x8AA0, 0xE1A5, 0x9192, 0xE1A6, 0x4E16, + 0xE1A7, 0x52E2, 0xE1A8, 0x6B72, 0xE1A9, 0x6D17, 0xE1AA, 0x7A05, + 0xE1AB, 0x7B39, 0xE1AC, 0x7D30, 0xE1AD, 0xF96F, 0xE1AE, 0x8CB0, + 0xE1AF, 0x53EC, 0xE1B0, 0x562F, 0xE1B1, 0x5851, 0xE1B2, 0x5BB5, + 0xE1B3, 0x5C0F, 0xE1B4, 0x5C11, 0xE1B5, 0x5DE2, 0xE1B6, 0x6240, + 0xE1B7, 0x6383, 0xE1B8, 0x6414, 0xE1B9, 0x662D, 0xE1BA, 0x68B3, + 0xE1BB, 0x6CBC, 0xE1BC, 0x6D88, 0xE1BD, 0x6EAF, 0xE1BE, 0x701F, + 0xE1BF, 0x70A4, 0xE1C0, 0x71D2, 0xE1C1, 0x7526, 0xE1C2, 0x758F, + 0xE1C3, 0x758E, 0xE1C4, 0x7619, 0xE1C5, 0x7B11, 0xE1C6, 0x7BE0, + 0xE1C7, 0x7C2B, 0xE1C8, 0x7D20, 0xE1C9, 0x7D39, 0xE1CA, 0x852C, + 0xE1CB, 0x856D, 0xE1CC, 0x8607, 0xE1CD, 0x8A34, 0xE1CE, 0x900D, + 0xE1CF, 0x9061, 0xE1D0, 0x90B5, 0xE1D1, 0x92B7, 0xE1D2, 0x97F6, + 0xE1D3, 0x9A37, 0xE1D4, 0x4FD7, 0xE1D5, 0x5C6C, 0xE1D6, 0x675F, + 0xE1D7, 0x6D91, 0xE1D8, 0x7C9F, 0xE1D9, 0x7E8C, 0xE1DA, 0x8B16, + 0xE1DB, 0x8D16, 0xE1DC, 0x901F, 0xE1DD, 0x5B6B, 0xE1DE, 0x5DFD, + 0xE1DF, 0x640D, 0xE1E0, 0x84C0, 0xE1E1, 0x905C, 0xE1E2, 0x98E1, + 0xE1E3, 0x7387, 0xE1E4, 0x5B8B, 0xE1E5, 0x609A, 0xE1E6, 0x677E, + 0xE1E7, 0x6DDE, 0xE1E8, 0x8A1F, 0xE1E9, 0x8AA6, 0xE1EA, 0x9001, + 0xE1EB, 0x980C, 0xE1EC, 0x5237, 0xE1ED, 0xF970, 0xE1EE, 0x7051, + 0xE1EF, 0x788E, 0xE1F0, 0x9396, 0xE1F1, 0x8870, 0xE1F2, 0x91D7, + 0xE1F3, 0x4FEE, 0xE1F4, 0x53D7, 0xE1F5, 0x55FD, 0xE1F6, 0x56DA, + 0xE1F7, 0x5782, 0xE1F8, 0x58FD, 0xE1F9, 0x5AC2, 0xE1FA, 0x5B88, + 0xE1FB, 0x5CAB, 0xE1FC, 0x5CC0, 0xE1FD, 0x5E25, 0xE1FE, 0x6101, + 0xE2A1, 0x620D, 0xE2A2, 0x624B, 0xE2A3, 0x6388, 0xE2A4, 0x641C, + 0xE2A5, 0x6536, 0xE2A6, 0x6578, 0xE2A7, 0x6A39, 0xE2A8, 0x6B8A, + 0xE2A9, 0x6C34, 0xE2AA, 0x6D19, 0xE2AB, 0x6F31, 0xE2AC, 0x71E7, + 0xE2AD, 0x72E9, 0xE2AE, 0x7378, 0xE2AF, 0x7407, 0xE2B0, 0x74B2, + 0xE2B1, 0x7626, 0xE2B2, 0x7761, 0xE2B3, 0x79C0, 0xE2B4, 0x7A57, + 0xE2B5, 0x7AEA, 0xE2B6, 0x7CB9, 0xE2B7, 0x7D8F, 0xE2B8, 0x7DAC, + 0xE2B9, 0x7E61, 0xE2BA, 0x7F9E, 0xE2BB, 0x8129, 0xE2BC, 0x8331, + 0xE2BD, 0x8490, 0xE2BE, 0x84DA, 0xE2BF, 0x85EA, 0xE2C0, 0x8896, + 0xE2C1, 0x8AB0, 0xE2C2, 0x8B90, 0xE2C3, 0x8F38, 0xE2C4, 0x9042, + 0xE2C5, 0x9083, 0xE2C6, 0x916C, 0xE2C7, 0x9296, 0xE2C8, 0x92B9, + 0xE2C9, 0x968B, 0xE2CA, 0x96A7, 0xE2CB, 0x96A8, 0xE2CC, 0x96D6, + 0xE2CD, 0x9700, 0xE2CE, 0x9808, 0xE2CF, 0x9996, 0xE2D0, 0x9AD3, + 0xE2D1, 0x9B1A, 0xE2D2, 0x53D4, 0xE2D3, 0x587E, 0xE2D4, 0x5919, + 0xE2D5, 0x5B70, 0xE2D6, 0x5BBF, 0xE2D7, 0x6DD1, 0xE2D8, 0x6F5A, + 0xE2D9, 0x719F, 0xE2DA, 0x7421, 0xE2DB, 0x74B9, 0xE2DC, 0x8085, + 0xE2DD, 0x83FD, 0xE2DE, 0x5DE1, 0xE2DF, 0x5F87, 0xE2E0, 0x5FAA, + 0xE2E1, 0x6042, 0xE2E2, 0x65EC, 0xE2E3, 0x6812, 0xE2E4, 0x696F, + 0xE2E5, 0x6A53, 0xE2E6, 0x6B89, 0xE2E7, 0x6D35, 0xE2E8, 0x6DF3, + 0xE2E9, 0x73E3, 0xE2EA, 0x76FE, 0xE2EB, 0x77AC, 0xE2EC, 0x7B4D, + 0xE2ED, 0x7D14, 0xE2EE, 0x8123, 0xE2EF, 0x821C, 0xE2F0, 0x8340, + 0xE2F1, 0x84F4, 0xE2F2, 0x8563, 0xE2F3, 0x8A62, 0xE2F4, 0x8AC4, + 0xE2F5, 0x9187, 0xE2F6, 0x931E, 0xE2F7, 0x9806, 0xE2F8, 0x99B4, + 0xE2F9, 0x620C, 0xE2FA, 0x8853, 0xE2FB, 0x8FF0, 0xE2FC, 0x9265, + 0xE2FD, 0x5D07, 0xE2FE, 0x5D27, 0xE3A1, 0x5D69, 0xE3A2, 0x745F, + 0xE3A3, 0x819D, 0xE3A4, 0x8768, 0xE3A5, 0x6FD5, 0xE3A6, 0x62FE, + 0xE3A7, 0x7FD2, 0xE3A8, 0x8936, 0xE3A9, 0x8972, 0xE3AA, 0x4E1E, + 0xE3AB, 0x4E58, 0xE3AC, 0x50E7, 0xE3AD, 0x52DD, 0xE3AE, 0x5347, + 0xE3AF, 0x627F, 0xE3B0, 0x6607, 0xE3B1, 0x7E69, 0xE3B2, 0x8805, + 0xE3B3, 0x965E, 0xE3B4, 0x4F8D, 0xE3B5, 0x5319, 0xE3B6, 0x5636, + 0xE3B7, 0x59CB, 0xE3B8, 0x5AA4, 0xE3B9, 0x5C38, 0xE3BA, 0x5C4E, + 0xE3BB, 0x5C4D, 0xE3BC, 0x5E02, 0xE3BD, 0x5F11, 0xE3BE, 0x6043, + 0xE3BF, 0x65BD, 0xE3C0, 0x662F, 0xE3C1, 0x6642, 0xE3C2, 0x67BE, + 0xE3C3, 0x67F4, 0xE3C4, 0x731C, 0xE3C5, 0x77E2, 0xE3C6, 0x793A, + 0xE3C7, 0x7FC5, 0xE3C8, 0x8494, 0xE3C9, 0x84CD, 0xE3CA, 0x8996, + 0xE3CB, 0x8A66, 0xE3CC, 0x8A69, 0xE3CD, 0x8AE1, 0xE3CE, 0x8C55, + 0xE3CF, 0x8C7A, 0xE3D0, 0x57F4, 0xE3D1, 0x5BD4, 0xE3D2, 0x5F0F, + 0xE3D3, 0x606F, 0xE3D4, 0x62ED, 0xE3D5, 0x690D, 0xE3D6, 0x6B96, + 0xE3D7, 0x6E5C, 0xE3D8, 0x7184, 0xE3D9, 0x7BD2, 0xE3DA, 0x8755, + 0xE3DB, 0x8B58, 0xE3DC, 0x8EFE, 0xE3DD, 0x98DF, 0xE3DE, 0x98FE, + 0xE3DF, 0x4F38, 0xE3E0, 0x4F81, 0xE3E1, 0x4FE1, 0xE3E2, 0x547B, + 0xE3E3, 0x5A20, 0xE3E4, 0x5BB8, 0xE3E5, 0x613C, 0xE3E6, 0x65B0, + 0xE3E7, 0x6668, 0xE3E8, 0x71FC, 0xE3E9, 0x7533, 0xE3EA, 0x795E, + 0xE3EB, 0x7D33, 0xE3EC, 0x814E, 0xE3ED, 0x81E3, 0xE3EE, 0x8398, + 0xE3EF, 0x85AA, 0xE3F0, 0x85CE, 0xE3F1, 0x8703, 0xE3F2, 0x8A0A, + 0xE3F3, 0x8EAB, 0xE3F4, 0x8F9B, 0xE3F5, 0xF971, 0xE3F6, 0x8FC5, + 0xE3F7, 0x5931, 0xE3F8, 0x5BA4, 0xE3F9, 0x5BE6, 0xE3FA, 0x6089, + 0xE3FB, 0x5BE9, 0xE3FC, 0x5C0B, 0xE3FD, 0x5FC3, 0xE3FE, 0x6C81, + 0xE4A1, 0xF972, 0xE4A2, 0x6DF1, 0xE4A3, 0x700B, 0xE4A4, 0x751A, + 0xE4A5, 0x82AF, 0xE4A6, 0x8AF6, 0xE4A7, 0x4EC0, 0xE4A8, 0x5341, + 0xE4A9, 0xF973, 0xE4AA, 0x96D9, 0xE4AB, 0x6C0F, 0xE4AC, 0x4E9E, + 0xE4AD, 0x4FC4, 0xE4AE, 0x5152, 0xE4AF, 0x555E, 0xE4B0, 0x5A25, + 0xE4B1, 0x5CE8, 0xE4B2, 0x6211, 0xE4B3, 0x7259, 0xE4B4, 0x82BD, + 0xE4B5, 0x83AA, 0xE4B6, 0x86FE, 0xE4B7, 0x8859, 0xE4B8, 0x8A1D, + 0xE4B9, 0x963F, 0xE4BA, 0x96C5, 0xE4BB, 0x9913, 0xE4BC, 0x9D09, + 0xE4BD, 0x9D5D, 0xE4BE, 0x580A, 0xE4BF, 0x5CB3, 0xE4C0, 0x5DBD, + 0xE4C1, 0x5E44, 0xE4C2, 0x60E1, 0xE4C3, 0x6115, 0xE4C4, 0x63E1, + 0xE4C5, 0x6A02, 0xE4C6, 0x6E25, 0xE4C7, 0x9102, 0xE4C8, 0x9354, + 0xE4C9, 0x984E, 0xE4CA, 0x9C10, 0xE4CB, 0x9F77, 0xE4CC, 0x5B89, + 0xE4CD, 0x5CB8, 0xE4CE, 0x6309, 0xE4CF, 0x664F, 0xE4D0, 0x6848, + 0xE4D1, 0x773C, 0xE4D2, 0x96C1, 0xE4D3, 0x978D, 0xE4D4, 0x9854, + 0xE4D5, 0x9B9F, 0xE4D6, 0x65A1, 0xE4D7, 0x8B01, 0xE4D8, 0x8ECB, + 0xE4D9, 0x95BC, 0xE4DA, 0x5535, 0xE4DB, 0x5CA9, 0xE4DC, 0x5DD6, + 0xE4DD, 0x5EB5, 0xE4DE, 0x6697, 0xE4DF, 0x764C, 0xE4E0, 0x83F4, + 0xE4E1, 0x95C7, 0xE4E2, 0x58D3, 0xE4E3, 0x62BC, 0xE4E4, 0x72CE, + 0xE4E5, 0x9D28, 0xE4E6, 0x4EF0, 0xE4E7, 0x592E, 0xE4E8, 0x600F, + 0xE4E9, 0x663B, 0xE4EA, 0x6B83, 0xE4EB, 0x79E7, 0xE4EC, 0x9D26, + 0xE4ED, 0x5393, 0xE4EE, 0x54C0, 0xE4EF, 0x57C3, 0xE4F0, 0x5D16, + 0xE4F1, 0x611B, 0xE4F2, 0x66D6, 0xE4F3, 0x6DAF, 0xE4F4, 0x788D, + 0xE4F5, 0x827E, 0xE4F6, 0x9698, 0xE4F7, 0x9744, 0xE4F8, 0x5384, + 0xE4F9, 0x627C, 0xE4FA, 0x6396, 0xE4FB, 0x6DB2, 0xE4FC, 0x7E0A, + 0xE4FD, 0x814B, 0xE4FE, 0x984D, 0xE5A1, 0x6AFB, 0xE5A2, 0x7F4C, + 0xE5A3, 0x9DAF, 0xE5A4, 0x9E1A, 0xE5A5, 0x4E5F, 0xE5A6, 0x503B, + 0xE5A7, 0x51B6, 0xE5A8, 0x591C, 0xE5A9, 0x60F9, 0xE5AA, 0x63F6, + 0xE5AB, 0x6930, 0xE5AC, 0x723A, 0xE5AD, 0x8036, 0xE5AE, 0xF974, + 0xE5AF, 0x91CE, 0xE5B0, 0x5F31, 0xE5B1, 0xF975, 0xE5B2, 0xF976, + 0xE5B3, 0x7D04, 0xE5B4, 0x82E5, 0xE5B5, 0x846F, 0xE5B6, 0x84BB, + 0xE5B7, 0x85E5, 0xE5B8, 0x8E8D, 0xE5B9, 0xF977, 0xE5BA, 0x4F6F, + 0xE5BB, 0xF978, 0xE5BC, 0xF979, 0xE5BD, 0x58E4, 0xE5BE, 0x5B43, + 0xE5BF, 0x6059, 0xE5C0, 0x63DA, 0xE5C1, 0x6518, 0xE5C2, 0x656D, + 0xE5C3, 0x6698, 0xE5C4, 0xF97A, 0xE5C5, 0x694A, 0xE5C6, 0x6A23, + 0xE5C7, 0x6D0B, 0xE5C8, 0x7001, 0xE5C9, 0x716C, 0xE5CA, 0x75D2, + 0xE5CB, 0x760D, 0xE5CC, 0x79B3, 0xE5CD, 0x7A70, 0xE5CE, 0xF97B, + 0xE5CF, 0x7F8A, 0xE5D0, 0xF97C, 0xE5D1, 0x8944, 0xE5D2, 0xF97D, + 0xE5D3, 0x8B93, 0xE5D4, 0x91C0, 0xE5D5, 0x967D, 0xE5D6, 0xF97E, + 0xE5D7, 0x990A, 0xE5D8, 0x5704, 0xE5D9, 0x5FA1, 0xE5DA, 0x65BC, + 0xE5DB, 0x6F01, 0xE5DC, 0x7600, 0xE5DD, 0x79A6, 0xE5DE, 0x8A9E, + 0xE5DF, 0x99AD, 0xE5E0, 0x9B5A, 0xE5E1, 0x9F6C, 0xE5E2, 0x5104, + 0xE5E3, 0x61B6, 0xE5E4, 0x6291, 0xE5E5, 0x6A8D, 0xE5E6, 0x81C6, + 0xE5E7, 0x5043, 0xE5E8, 0x5830, 0xE5E9, 0x5F66, 0xE5EA, 0x7109, + 0xE5EB, 0x8A00, 0xE5EC, 0x8AFA, 0xE5ED, 0x5B7C, 0xE5EE, 0x8616, + 0xE5EF, 0x4FFA, 0xE5F0, 0x513C, 0xE5F1, 0x56B4, 0xE5F2, 0x5944, + 0xE5F3, 0x63A9, 0xE5F4, 0x6DF9, 0xE5F5, 0x5DAA, 0xE5F6, 0x696D, + 0xE5F7, 0x5186, 0xE5F8, 0x4E88, 0xE5F9, 0x4F59, 0xE5FA, 0xF97F, + 0xE5FB, 0xF980, 0xE5FC, 0xF981, 0xE5FD, 0x5982, 0xE5FE, 0xF982, + 0xE6A1, 0xF983, 0xE6A2, 0x6B5F, 0xE6A3, 0x6C5D, 0xE6A4, 0xF984, + 0xE6A5, 0x74B5, 0xE6A6, 0x7916, 0xE6A7, 0xF985, 0xE6A8, 0x8207, + 0xE6A9, 0x8245, 0xE6AA, 0x8339, 0xE6AB, 0x8F3F, 0xE6AC, 0x8F5D, + 0xE6AD, 0xF986, 0xE6AE, 0x9918, 0xE6AF, 0xF987, 0xE6B0, 0xF988, + 0xE6B1, 0xF989, 0xE6B2, 0x4EA6, 0xE6B3, 0xF98A, 0xE6B4, 0x57DF, + 0xE6B5, 0x5F79, 0xE6B6, 0x6613, 0xE6B7, 0xF98B, 0xE6B8, 0xF98C, + 0xE6B9, 0x75AB, 0xE6BA, 0x7E79, 0xE6BB, 0x8B6F, 0xE6BC, 0xF98D, + 0xE6BD, 0x9006, 0xE6BE, 0x9A5B, 0xE6BF, 0x56A5, 0xE6C0, 0x5827, + 0xE6C1, 0x59F8, 0xE6C2, 0x5A1F, 0xE6C3, 0x5BB4, 0xE6C4, 0xF98E, + 0xE6C5, 0x5EF6, 0xE6C6, 0xF98F, 0xE6C7, 0xF990, 0xE6C8, 0x6350, + 0xE6C9, 0x633B, 0xE6CA, 0xF991, 0xE6CB, 0x693D, 0xE6CC, 0x6C87, + 0xE6CD, 0x6CBF, 0xE6CE, 0x6D8E, 0xE6CF, 0x6D93, 0xE6D0, 0x6DF5, + 0xE6D1, 0x6F14, 0xE6D2, 0xF992, 0xE6D3, 0x70DF, 0xE6D4, 0x7136, + 0xE6D5, 0x7159, 0xE6D6, 0xF993, 0xE6D7, 0x71C3, 0xE6D8, 0x71D5, + 0xE6D9, 0xF994, 0xE6DA, 0x784F, 0xE6DB, 0x786F, 0xE6DC, 0xF995, + 0xE6DD, 0x7B75, 0xE6DE, 0x7DE3, 0xE6DF, 0xF996, 0xE6E0, 0x7E2F, + 0xE6E1, 0xF997, 0xE6E2, 0x884D, 0xE6E3, 0x8EDF, 0xE6E4, 0xF998, + 0xE6E5, 0xF999, 0xE6E6, 0xF99A, 0xE6E7, 0x925B, 0xE6E8, 0xF99B, + 0xE6E9, 0x9CF6, 0xE6EA, 0xF99C, 0xE6EB, 0xF99D, 0xE6EC, 0xF99E, + 0xE6ED, 0x6085, 0xE6EE, 0x6D85, 0xE6EF, 0xF99F, 0xE6F0, 0x71B1, + 0xE6F1, 0xF9A0, 0xE6F2, 0xF9A1, 0xE6F3, 0x95B1, 0xE6F4, 0x53AD, + 0xE6F5, 0xF9A2, 0xE6F6, 0xF9A3, 0xE6F7, 0xF9A4, 0xE6F8, 0x67D3, + 0xE6F9, 0xF9A5, 0xE6FA, 0x708E, 0xE6FB, 0x7130, 0xE6FC, 0x7430, + 0xE6FD, 0x8276, 0xE6FE, 0x82D2, 0xE7A1, 0xF9A6, 0xE7A2, 0x95BB, + 0xE7A3, 0x9AE5, 0xE7A4, 0x9E7D, 0xE7A5, 0x66C4, 0xE7A6, 0xF9A7, + 0xE7A7, 0x71C1, 0xE7A8, 0x8449, 0xE7A9, 0xF9A8, 0xE7AA, 0xF9A9, + 0xE7AB, 0x584B, 0xE7AC, 0xF9AA, 0xE7AD, 0xF9AB, 0xE7AE, 0x5DB8, + 0xE7AF, 0x5F71, 0xE7B0, 0xF9AC, 0xE7B1, 0x6620, 0xE7B2, 0x668E, + 0xE7B3, 0x6979, 0xE7B4, 0x69AE, 0xE7B5, 0x6C38, 0xE7B6, 0x6CF3, + 0xE7B7, 0x6E36, 0xE7B8, 0x6F41, 0xE7B9, 0x6FDA, 0xE7BA, 0x701B, + 0xE7BB, 0x702F, 0xE7BC, 0x7150, 0xE7BD, 0x71DF, 0xE7BE, 0x7370, + 0xE7BF, 0xF9AD, 0xE7C0, 0x745B, 0xE7C1, 0xF9AE, 0xE7C2, 0x74D4, + 0xE7C3, 0x76C8, 0xE7C4, 0x7A4E, 0xE7C5, 0x7E93, 0xE7C6, 0xF9AF, + 0xE7C7, 0xF9B0, 0xE7C8, 0x82F1, 0xE7C9, 0x8A60, 0xE7CA, 0x8FCE, + 0xE7CB, 0xF9B1, 0xE7CC, 0x9348, 0xE7CD, 0xF9B2, 0xE7CE, 0x9719, + 0xE7CF, 0xF9B3, 0xE7D0, 0xF9B4, 0xE7D1, 0x4E42, 0xE7D2, 0x502A, + 0xE7D3, 0xF9B5, 0xE7D4, 0x5208, 0xE7D5, 0x53E1, 0xE7D6, 0x66F3, + 0xE7D7, 0x6C6D, 0xE7D8, 0x6FCA, 0xE7D9, 0x730A, 0xE7DA, 0x777F, + 0xE7DB, 0x7A62, 0xE7DC, 0x82AE, 0xE7DD, 0x85DD, 0xE7DE, 0x8602, + 0xE7DF, 0xF9B6, 0xE7E0, 0x88D4, 0xE7E1, 0x8A63, 0xE7E2, 0x8B7D, + 0xE7E3, 0x8C6B, 0xE7E4, 0xF9B7, 0xE7E5, 0x92B3, 0xE7E6, 0xF9B8, + 0xE7E7, 0x9713, 0xE7E8, 0x9810, 0xE7E9, 0x4E94, 0xE7EA, 0x4F0D, + 0xE7EB, 0x4FC9, 0xE7EC, 0x50B2, 0xE7ED, 0x5348, 0xE7EE, 0x543E, + 0xE7EF, 0x5433, 0xE7F0, 0x55DA, 0xE7F1, 0x5862, 0xE7F2, 0x58BA, + 0xE7F3, 0x5967, 0xE7F4, 0x5A1B, 0xE7F5, 0x5BE4, 0xE7F6, 0x609F, + 0xE7F7, 0xF9B9, 0xE7F8, 0x61CA, 0xE7F9, 0x6556, 0xE7FA, 0x65FF, + 0xE7FB, 0x6664, 0xE7FC, 0x68A7, 0xE7FD, 0x6C5A, 0xE7FE, 0x6FB3, + 0xE8A1, 0x70CF, 0xE8A2, 0x71AC, 0xE8A3, 0x7352, 0xE8A4, 0x7B7D, + 0xE8A5, 0x8708, 0xE8A6, 0x8AA4, 0xE8A7, 0x9C32, 0xE8A8, 0x9F07, + 0xE8A9, 0x5C4B, 0xE8AA, 0x6C83, 0xE8AB, 0x7344, 0xE8AC, 0x7389, + 0xE8AD, 0x923A, 0xE8AE, 0x6EAB, 0xE8AF, 0x7465, 0xE8B0, 0x761F, + 0xE8B1, 0x7A69, 0xE8B2, 0x7E15, 0xE8B3, 0x860A, 0xE8B4, 0x5140, + 0xE8B5, 0x58C5, 0xE8B6, 0x64C1, 0xE8B7, 0x74EE, 0xE8B8, 0x7515, + 0xE8B9, 0x7670, 0xE8BA, 0x7FC1, 0xE8BB, 0x9095, 0xE8BC, 0x96CD, + 0xE8BD, 0x9954, 0xE8BE, 0x6E26, 0xE8BF, 0x74E6, 0xE8C0, 0x7AA9, + 0xE8C1, 0x7AAA, 0xE8C2, 0x81E5, 0xE8C3, 0x86D9, 0xE8C4, 0x8778, + 0xE8C5, 0x8A1B, 0xE8C6, 0x5A49, 0xE8C7, 0x5B8C, 0xE8C8, 0x5B9B, + 0xE8C9, 0x68A1, 0xE8CA, 0x6900, 0xE8CB, 0x6D63, 0xE8CC, 0x73A9, + 0xE8CD, 0x7413, 0xE8CE, 0x742C, 0xE8CF, 0x7897, 0xE8D0, 0x7DE9, + 0xE8D1, 0x7FEB, 0xE8D2, 0x8118, 0xE8D3, 0x8155, 0xE8D4, 0x839E, + 0xE8D5, 0x8C4C, 0xE8D6, 0x962E, 0xE8D7, 0x9811, 0xE8D8, 0x66F0, + 0xE8D9, 0x5F80, 0xE8DA, 0x65FA, 0xE8DB, 0x6789, 0xE8DC, 0x6C6A, + 0xE8DD, 0x738B, 0xE8DE, 0x502D, 0xE8DF, 0x5A03, 0xE8E0, 0x6B6A, + 0xE8E1, 0x77EE, 0xE8E2, 0x5916, 0xE8E3, 0x5D6C, 0xE8E4, 0x5DCD, + 0xE8E5, 0x7325, 0xE8E6, 0x754F, 0xE8E7, 0xF9BA, 0xE8E8, 0xF9BB, + 0xE8E9, 0x50E5, 0xE8EA, 0x51F9, 0xE8EB, 0x582F, 0xE8EC, 0x592D, + 0xE8ED, 0x5996, 0xE8EE, 0x59DA, 0xE8EF, 0x5BE5, 0xE8F0, 0xF9BC, + 0xE8F1, 0xF9BD, 0xE8F2, 0x5DA2, 0xE8F3, 0x62D7, 0xE8F4, 0x6416, + 0xE8F5, 0x6493, 0xE8F6, 0x64FE, 0xE8F7, 0xF9BE, 0xE8F8, 0x66DC, + 0xE8F9, 0xF9BF, 0xE8FA, 0x6A48, 0xE8FB, 0xF9C0, 0xE8FC, 0x71FF, + 0xE8FD, 0x7464, 0xE8FE, 0xF9C1, 0xE9A1, 0x7A88, 0xE9A2, 0x7AAF, + 0xE9A3, 0x7E47, 0xE9A4, 0x7E5E, 0xE9A5, 0x8000, 0xE9A6, 0x8170, + 0xE9A7, 0xF9C2, 0xE9A8, 0x87EF, 0xE9A9, 0x8981, 0xE9AA, 0x8B20, + 0xE9AB, 0x9059, 0xE9AC, 0xF9C3, 0xE9AD, 0x9080, 0xE9AE, 0x9952, + 0xE9AF, 0x617E, 0xE9B0, 0x6B32, 0xE9B1, 0x6D74, 0xE9B2, 0x7E1F, + 0xE9B3, 0x8925, 0xE9B4, 0x8FB1, 0xE9B5, 0x4FD1, 0xE9B6, 0x50AD, + 0xE9B7, 0x5197, 0xE9B8, 0x52C7, 0xE9B9, 0x57C7, 0xE9BA, 0x5889, + 0xE9BB, 0x5BB9, 0xE9BC, 0x5EB8, 0xE9BD, 0x6142, 0xE9BE, 0x6995, + 0xE9BF, 0x6D8C, 0xE9C0, 0x6E67, 0xE9C1, 0x6EB6, 0xE9C2, 0x7194, + 0xE9C3, 0x7462, 0xE9C4, 0x7528, 0xE9C5, 0x752C, 0xE9C6, 0x8073, + 0xE9C7, 0x8338, 0xE9C8, 0x84C9, 0xE9C9, 0x8E0A, 0xE9CA, 0x9394, + 0xE9CB, 0x93DE, 0xE9CC, 0xF9C4, 0xE9CD, 0x4E8E, 0xE9CE, 0x4F51, + 0xE9CF, 0x5076, 0xE9D0, 0x512A, 0xE9D1, 0x53C8, 0xE9D2, 0x53CB, + 0xE9D3, 0x53F3, 0xE9D4, 0x5B87, 0xE9D5, 0x5BD3, 0xE9D6, 0x5C24, + 0xE9D7, 0x611A, 0xE9D8, 0x6182, 0xE9D9, 0x65F4, 0xE9DA, 0x725B, + 0xE9DB, 0x7397, 0xE9DC, 0x7440, 0xE9DD, 0x76C2, 0xE9DE, 0x7950, + 0xE9DF, 0x7991, 0xE9E0, 0x79B9, 0xE9E1, 0x7D06, 0xE9E2, 0x7FBD, + 0xE9E3, 0x828B, 0xE9E4, 0x85D5, 0xE9E5, 0x865E, 0xE9E6, 0x8FC2, + 0xE9E7, 0x9047, 0xE9E8, 0x90F5, 0xE9E9, 0x91EA, 0xE9EA, 0x9685, + 0xE9EB, 0x96E8, 0xE9EC, 0x96E9, 0xE9ED, 0x52D6, 0xE9EE, 0x5F67, + 0xE9EF, 0x65ED, 0xE9F0, 0x6631, 0xE9F1, 0x682F, 0xE9F2, 0x715C, + 0xE9F3, 0x7A36, 0xE9F4, 0x90C1, 0xE9F5, 0x980A, 0xE9F6, 0x4E91, + 0xE9F7, 0xF9C5, 0xE9F8, 0x6A52, 0xE9F9, 0x6B9E, 0xE9FA, 0x6F90, + 0xE9FB, 0x7189, 0xE9FC, 0x8018, 0xE9FD, 0x82B8, 0xE9FE, 0x8553, + 0xEAA1, 0x904B, 0xEAA2, 0x9695, 0xEAA3, 0x96F2, 0xEAA4, 0x97FB, + 0xEAA5, 0x851A, 0xEAA6, 0x9B31, 0xEAA7, 0x4E90, 0xEAA8, 0x718A, + 0xEAA9, 0x96C4, 0xEAAA, 0x5143, 0xEAAB, 0x539F, 0xEAAC, 0x54E1, + 0xEAAD, 0x5713, 0xEAAE, 0x5712, 0xEAAF, 0x57A3, 0xEAB0, 0x5A9B, + 0xEAB1, 0x5AC4, 0xEAB2, 0x5BC3, 0xEAB3, 0x6028, 0xEAB4, 0x613F, + 0xEAB5, 0x63F4, 0xEAB6, 0x6C85, 0xEAB7, 0x6D39, 0xEAB8, 0x6E72, + 0xEAB9, 0x6E90, 0xEABA, 0x7230, 0xEABB, 0x733F, 0xEABC, 0x7457, + 0xEABD, 0x82D1, 0xEABE, 0x8881, 0xEABF, 0x8F45, 0xEAC0, 0x9060, + 0xEAC1, 0xF9C6, 0xEAC2, 0x9662, 0xEAC3, 0x9858, 0xEAC4, 0x9D1B, + 0xEAC5, 0x6708, 0xEAC6, 0x8D8A, 0xEAC7, 0x925E, 0xEAC8, 0x4F4D, + 0xEAC9, 0x5049, 0xEACA, 0x50DE, 0xEACB, 0x5371, 0xEACC, 0x570D, + 0xEACD, 0x59D4, 0xEACE, 0x5A01, 0xEACF, 0x5C09, 0xEAD0, 0x6170, + 0xEAD1, 0x6690, 0xEAD2, 0x6E2D, 0xEAD3, 0x7232, 0xEAD4, 0x744B, + 0xEAD5, 0x7DEF, 0xEAD6, 0x80C3, 0xEAD7, 0x840E, 0xEAD8, 0x8466, + 0xEAD9, 0x853F, 0xEADA, 0x875F, 0xEADB, 0x885B, 0xEADC, 0x8918, + 0xEADD, 0x8B02, 0xEADE, 0x9055, 0xEADF, 0x97CB, 0xEAE0, 0x9B4F, + 0xEAE1, 0x4E73, 0xEAE2, 0x4F91, 0xEAE3, 0x5112, 0xEAE4, 0x516A, + 0xEAE5, 0xF9C7, 0xEAE6, 0x552F, 0xEAE7, 0x55A9, 0xEAE8, 0x5B7A, + 0xEAE9, 0x5BA5, 0xEAEA, 0x5E7C, 0xEAEB, 0x5E7D, 0xEAEC, 0x5EBE, + 0xEAED, 0x60A0, 0xEAEE, 0x60DF, 0xEAEF, 0x6108, 0xEAF0, 0x6109, + 0xEAF1, 0x63C4, 0xEAF2, 0x6538, 0xEAF3, 0x6709, 0xEAF4, 0xF9C8, + 0xEAF5, 0x67D4, 0xEAF6, 0x67DA, 0xEAF7, 0xF9C9, 0xEAF8, 0x6961, + 0xEAF9, 0x6962, 0xEAFA, 0x6CB9, 0xEAFB, 0x6D27, 0xEAFC, 0xF9CA, + 0xEAFD, 0x6E38, 0xEAFE, 0xF9CB, 0xEBA1, 0x6FE1, 0xEBA2, 0x7336, + 0xEBA3, 0x7337, 0xEBA4, 0xF9CC, 0xEBA5, 0x745C, 0xEBA6, 0x7531, + 0xEBA7, 0xF9CD, 0xEBA8, 0x7652, 0xEBA9, 0xF9CE, 0xEBAA, 0xF9CF, + 0xEBAB, 0x7DAD, 0xEBAC, 0x81FE, 0xEBAD, 0x8438, 0xEBAE, 0x88D5, + 0xEBAF, 0x8A98, 0xEBB0, 0x8ADB, 0xEBB1, 0x8AED, 0xEBB2, 0x8E30, + 0xEBB3, 0x8E42, 0xEBB4, 0x904A, 0xEBB5, 0x903E, 0xEBB6, 0x907A, + 0xEBB7, 0x9149, 0xEBB8, 0x91C9, 0xEBB9, 0x936E, 0xEBBA, 0xF9D0, + 0xEBBB, 0xF9D1, 0xEBBC, 0x5809, 0xEBBD, 0xF9D2, 0xEBBE, 0x6BD3, + 0xEBBF, 0x8089, 0xEBC0, 0x80B2, 0xEBC1, 0xF9D3, 0xEBC2, 0xF9D4, + 0xEBC3, 0x5141, 0xEBC4, 0x596B, 0xEBC5, 0x5C39, 0xEBC6, 0xF9D5, + 0xEBC7, 0xF9D6, 0xEBC8, 0x6F64, 0xEBC9, 0x73A7, 0xEBCA, 0x80E4, + 0xEBCB, 0x8D07, 0xEBCC, 0xF9D7, 0xEBCD, 0x9217, 0xEBCE, 0x958F, + 0xEBCF, 0xF9D8, 0xEBD0, 0xF9D9, 0xEBD1, 0xF9DA, 0xEBD2, 0xF9DB, + 0xEBD3, 0x807F, 0xEBD4, 0x620E, 0xEBD5, 0x701C, 0xEBD6, 0x7D68, + 0xEBD7, 0x878D, 0xEBD8, 0xF9DC, 0xEBD9, 0x57A0, 0xEBDA, 0x6069, + 0xEBDB, 0x6147, 0xEBDC, 0x6BB7, 0xEBDD, 0x8ABE, 0xEBDE, 0x9280, + 0xEBDF, 0x96B1, 0xEBE0, 0x4E59, 0xEBE1, 0x541F, 0xEBE2, 0x6DEB, + 0xEBE3, 0x852D, 0xEBE4, 0x9670, 0xEBE5, 0x97F3, 0xEBE6, 0x98EE, + 0xEBE7, 0x63D6, 0xEBE8, 0x6CE3, 0xEBE9, 0x9091, 0xEBEA, 0x51DD, + 0xEBEB, 0x61C9, 0xEBEC, 0x81BA, 0xEBED, 0x9DF9, 0xEBEE, 0x4F9D, + 0xEBEF, 0x501A, 0xEBF0, 0x5100, 0xEBF1, 0x5B9C, 0xEBF2, 0x610F, + 0xEBF3, 0x61FF, 0xEBF4, 0x64EC, 0xEBF5, 0x6905, 0xEBF6, 0x6BC5, + 0xEBF7, 0x7591, 0xEBF8, 0x77E3, 0xEBF9, 0x7FA9, 0xEBFA, 0x8264, + 0xEBFB, 0x858F, 0xEBFC, 0x87FB, 0xEBFD, 0x8863, 0xEBFE, 0x8ABC, + 0xECA1, 0x8B70, 0xECA2, 0x91AB, 0xECA3, 0x4E8C, 0xECA4, 0x4EE5, + 0xECA5, 0x4F0A, 0xECA6, 0xF9DD, 0xECA7, 0xF9DE, 0xECA8, 0x5937, + 0xECA9, 0x59E8, 0xECAA, 0xF9DF, 0xECAB, 0x5DF2, 0xECAC, 0x5F1B, + 0xECAD, 0x5F5B, 0xECAE, 0x6021, 0xECAF, 0xF9E0, 0xECB0, 0xF9E1, + 0xECB1, 0xF9E2, 0xECB2, 0xF9E3, 0xECB3, 0x723E, 0xECB4, 0x73E5, + 0xECB5, 0xF9E4, 0xECB6, 0x7570, 0xECB7, 0x75CD, 0xECB8, 0xF9E5, + 0xECB9, 0x79FB, 0xECBA, 0xF9E6, 0xECBB, 0x800C, 0xECBC, 0x8033, + 0xECBD, 0x8084, 0xECBE, 0x82E1, 0xECBF, 0x8351, 0xECC0, 0xF9E7, + 0xECC1, 0xF9E8, 0xECC2, 0x8CBD, 0xECC3, 0x8CB3, 0xECC4, 0x9087, + 0xECC5, 0xF9E9, 0xECC6, 0xF9EA, 0xECC7, 0x98F4, 0xECC8, 0x990C, + 0xECC9, 0xF9EB, 0xECCA, 0xF9EC, 0xECCB, 0x7037, 0xECCC, 0x76CA, + 0xECCD, 0x7FCA, 0xECCE, 0x7FCC, 0xECCF, 0x7FFC, 0xECD0, 0x8B1A, + 0xECD1, 0x4EBA, 0xECD2, 0x4EC1, 0xECD3, 0x5203, 0xECD4, 0x5370, + 0xECD5, 0xF9ED, 0xECD6, 0x54BD, 0xECD7, 0x56E0, 0xECD8, 0x59FB, + 0xECD9, 0x5BC5, 0xECDA, 0x5F15, 0xECDB, 0x5FCD, 0xECDC, 0x6E6E, + 0xECDD, 0xF9EE, 0xECDE, 0xF9EF, 0xECDF, 0x7D6A, 0xECE0, 0x8335, + 0xECE1, 0xF9F0, 0xECE2, 0x8693, 0xECE3, 0x8A8D, 0xECE4, 0xF9F1, + 0xECE5, 0x976D, 0xECE6, 0x9777, 0xECE7, 0xF9F2, 0xECE8, 0xF9F3, + 0xECE9, 0x4E00, 0xECEA, 0x4F5A, 0xECEB, 0x4F7E, 0xECEC, 0x58F9, + 0xECED, 0x65E5, 0xECEE, 0x6EA2, 0xECEF, 0x9038, 0xECF0, 0x93B0, + 0xECF1, 0x99B9, 0xECF2, 0x4EFB, 0xECF3, 0x58EC, 0xECF4, 0x598A, + 0xECF5, 0x59D9, 0xECF6, 0x6041, 0xECF7, 0xF9F4, 0xECF8, 0xF9F5, + 0xECF9, 0x7A14, 0xECFA, 0xF9F6, 0xECFB, 0x834F, 0xECFC, 0x8CC3, + 0xECFD, 0x5165, 0xECFE, 0x5344, 0xEDA1, 0xF9F7, 0xEDA2, 0xF9F8, + 0xEDA3, 0xF9F9, 0xEDA4, 0x4ECD, 0xEDA5, 0x5269, 0xEDA6, 0x5B55, + 0xEDA7, 0x82BF, 0xEDA8, 0x4ED4, 0xEDA9, 0x523A, 0xEDAA, 0x54A8, + 0xEDAB, 0x59C9, 0xEDAC, 0x59FF, 0xEDAD, 0x5B50, 0xEDAE, 0x5B57, + 0xEDAF, 0x5B5C, 0xEDB0, 0x6063, 0xEDB1, 0x6148, 0xEDB2, 0x6ECB, + 0xEDB3, 0x7099, 0xEDB4, 0x716E, 0xEDB5, 0x7386, 0xEDB6, 0x74F7, + 0xEDB7, 0x75B5, 0xEDB8, 0x78C1, 0xEDB9, 0x7D2B, 0xEDBA, 0x8005, + 0xEDBB, 0x81EA, 0xEDBC, 0x8328, 0xEDBD, 0x8517, 0xEDBE, 0x85C9, + 0xEDBF, 0x8AEE, 0xEDC0, 0x8CC7, 0xEDC1, 0x96CC, 0xEDC2, 0x4F5C, + 0xEDC3, 0x52FA, 0xEDC4, 0x56BC, 0xEDC5, 0x65AB, 0xEDC6, 0x6628, + 0xEDC7, 0x707C, 0xEDC8, 0x70B8, 0xEDC9, 0x7235, 0xEDCA, 0x7DBD, + 0xEDCB, 0x828D, 0xEDCC, 0x914C, 0xEDCD, 0x96C0, 0xEDCE, 0x9D72, + 0xEDCF, 0x5B71, 0xEDD0, 0x68E7, 0xEDD1, 0x6B98, 0xEDD2, 0x6F7A, + 0xEDD3, 0x76DE, 0xEDD4, 0x5C91, 0xEDD5, 0x66AB, 0xEDD6, 0x6F5B, + 0xEDD7, 0x7BB4, 0xEDD8, 0x7C2A, 0xEDD9, 0x8836, 0xEDDA, 0x96DC, + 0xEDDB, 0x4E08, 0xEDDC, 0x4ED7, 0xEDDD, 0x5320, 0xEDDE, 0x5834, + 0xEDDF, 0x58BB, 0xEDE0, 0x58EF, 0xEDE1, 0x596C, 0xEDE2, 0x5C07, + 0xEDE3, 0x5E33, 0xEDE4, 0x5E84, 0xEDE5, 0x5F35, 0xEDE6, 0x638C, + 0xEDE7, 0x66B2, 0xEDE8, 0x6756, 0xEDE9, 0x6A1F, 0xEDEA, 0x6AA3, + 0xEDEB, 0x6B0C, 0xEDEC, 0x6F3F, 0xEDED, 0x7246, 0xEDEE, 0xF9FA, + 0xEDEF, 0x7350, 0xEDF0, 0x748B, 0xEDF1, 0x7AE0, 0xEDF2, 0x7CA7, + 0xEDF3, 0x8178, 0xEDF4, 0x81DF, 0xEDF5, 0x81E7, 0xEDF6, 0x838A, + 0xEDF7, 0x846C, 0xEDF8, 0x8523, 0xEDF9, 0x8594, 0xEDFA, 0x85CF, + 0xEDFB, 0x88DD, 0xEDFC, 0x8D13, 0xEDFD, 0x91AC, 0xEDFE, 0x9577, + 0xEEA1, 0x969C, 0xEEA2, 0x518D, 0xEEA3, 0x54C9, 0xEEA4, 0x5728, + 0xEEA5, 0x5BB0, 0xEEA6, 0x624D, 0xEEA7, 0x6750, 0xEEA8, 0x683D, + 0xEEA9, 0x6893, 0xEEAA, 0x6E3D, 0xEEAB, 0x6ED3, 0xEEAC, 0x707D, + 0xEEAD, 0x7E21, 0xEEAE, 0x88C1, 0xEEAF, 0x8CA1, 0xEEB0, 0x8F09, + 0xEEB1, 0x9F4B, 0xEEB2, 0x9F4E, 0xEEB3, 0x722D, 0xEEB4, 0x7B8F, + 0xEEB5, 0x8ACD, 0xEEB6, 0x931A, 0xEEB7, 0x4F47, 0xEEB8, 0x4F4E, + 0xEEB9, 0x5132, 0xEEBA, 0x5480, 0xEEBB, 0x59D0, 0xEEBC, 0x5E95, + 0xEEBD, 0x62B5, 0xEEBE, 0x6775, 0xEEBF, 0x696E, 0xEEC0, 0x6A17, + 0xEEC1, 0x6CAE, 0xEEC2, 0x6E1A, 0xEEC3, 0x72D9, 0xEEC4, 0x732A, + 0xEEC5, 0x75BD, 0xEEC6, 0x7BB8, 0xEEC7, 0x7D35, 0xEEC8, 0x82E7, + 0xEEC9, 0x83F9, 0xEECA, 0x8457, 0xEECB, 0x85F7, 0xEECC, 0x8A5B, + 0xEECD, 0x8CAF, 0xEECE, 0x8E87, 0xEECF, 0x9019, 0xEED0, 0x90B8, + 0xEED1, 0x96CE, 0xEED2, 0x9F5F, 0xEED3, 0x52E3, 0xEED4, 0x540A, + 0xEED5, 0x5AE1, 0xEED6, 0x5BC2, 0xEED7, 0x6458, 0xEED8, 0x6575, + 0xEED9, 0x6EF4, 0xEEDA, 0x72C4, 0xEEDB, 0xF9FB, 0xEEDC, 0x7684, + 0xEEDD, 0x7A4D, 0xEEDE, 0x7B1B, 0xEEDF, 0x7C4D, 0xEEE0, 0x7E3E, + 0xEEE1, 0x7FDF, 0xEEE2, 0x837B, 0xEEE3, 0x8B2B, 0xEEE4, 0x8CCA, + 0xEEE5, 0x8D64, 0xEEE6, 0x8DE1, 0xEEE7, 0x8E5F, 0xEEE8, 0x8FEA, + 0xEEE9, 0x8FF9, 0xEEEA, 0x9069, 0xEEEB, 0x93D1, 0xEEEC, 0x4F43, + 0xEEED, 0x4F7A, 0xEEEE, 0x50B3, 0xEEEF, 0x5168, 0xEEF0, 0x5178, + 0xEEF1, 0x524D, 0xEEF2, 0x526A, 0xEEF3, 0x5861, 0xEEF4, 0x587C, + 0xEEF5, 0x5960, 0xEEF6, 0x5C08, 0xEEF7, 0x5C55, 0xEEF8, 0x5EDB, + 0xEEF9, 0x609B, 0xEEFA, 0x6230, 0xEEFB, 0x6813, 0xEEFC, 0x6BBF, + 0xEEFD, 0x6C08, 0xEEFE, 0x6FB1, 0xEFA1, 0x714E, 0xEFA2, 0x7420, + 0xEFA3, 0x7530, 0xEFA4, 0x7538, 0xEFA5, 0x7551, 0xEFA6, 0x7672, + 0xEFA7, 0x7B4C, 0xEFA8, 0x7B8B, 0xEFA9, 0x7BAD, 0xEFAA, 0x7BC6, + 0xEFAB, 0x7E8F, 0xEFAC, 0x8A6E, 0xEFAD, 0x8F3E, 0xEFAE, 0x8F49, + 0xEFAF, 0x923F, 0xEFB0, 0x9293, 0xEFB1, 0x9322, 0xEFB2, 0x942B, + 0xEFB3, 0x96FB, 0xEFB4, 0x985A, 0xEFB5, 0x986B, 0xEFB6, 0x991E, + 0xEFB7, 0x5207, 0xEFB8, 0x622A, 0xEFB9, 0x6298, 0xEFBA, 0x6D59, + 0xEFBB, 0x7664, 0xEFBC, 0x7ACA, 0xEFBD, 0x7BC0, 0xEFBE, 0x7D76, + 0xEFBF, 0x5360, 0xEFC0, 0x5CBE, 0xEFC1, 0x5E97, 0xEFC2, 0x6F38, + 0xEFC3, 0x70B9, 0xEFC4, 0x7C98, 0xEFC5, 0x9711, 0xEFC6, 0x9B8E, + 0xEFC7, 0x9EDE, 0xEFC8, 0x63A5, 0xEFC9, 0x647A, 0xEFCA, 0x8776, + 0xEFCB, 0x4E01, 0xEFCC, 0x4E95, 0xEFCD, 0x4EAD, 0xEFCE, 0x505C, + 0xEFCF, 0x5075, 0xEFD0, 0x5448, 0xEFD1, 0x59C3, 0xEFD2, 0x5B9A, + 0xEFD3, 0x5E40, 0xEFD4, 0x5EAD, 0xEFD5, 0x5EF7, 0xEFD6, 0x5F81, + 0xEFD7, 0x60C5, 0xEFD8, 0x633A, 0xEFD9, 0x653F, 0xEFDA, 0x6574, + 0xEFDB, 0x65CC, 0xEFDC, 0x6676, 0xEFDD, 0x6678, 0xEFDE, 0x67FE, + 0xEFDF, 0x6968, 0xEFE0, 0x6A89, 0xEFE1, 0x6B63, 0xEFE2, 0x6C40, + 0xEFE3, 0x6DC0, 0xEFE4, 0x6DE8, 0xEFE5, 0x6E1F, 0xEFE6, 0x6E5E, + 0xEFE7, 0x701E, 0xEFE8, 0x70A1, 0xEFE9, 0x738E, 0xEFEA, 0x73FD, + 0xEFEB, 0x753A, 0xEFEC, 0x775B, 0xEFED, 0x7887, 0xEFEE, 0x798E, + 0xEFEF, 0x7A0B, 0xEFF0, 0x7A7D, 0xEFF1, 0x7CBE, 0xEFF2, 0x7D8E, + 0xEFF3, 0x8247, 0xEFF4, 0x8A02, 0xEFF5, 0x8AEA, 0xEFF6, 0x8C9E, + 0xEFF7, 0x912D, 0xEFF8, 0x914A, 0xEFF9, 0x91D8, 0xEFFA, 0x9266, + 0xEFFB, 0x92CC, 0xEFFC, 0x9320, 0xEFFD, 0x9706, 0xEFFE, 0x9756, + 0xF0A1, 0x975C, 0xF0A2, 0x9802, 0xF0A3, 0x9F0E, 0xF0A4, 0x5236, + 0xF0A5, 0x5291, 0xF0A6, 0x557C, 0xF0A7, 0x5824, 0xF0A8, 0x5E1D, + 0xF0A9, 0x5F1F, 0xF0AA, 0x608C, 0xF0AB, 0x63D0, 0xF0AC, 0x68AF, + 0xF0AD, 0x6FDF, 0xF0AE, 0x796D, 0xF0AF, 0x7B2C, 0xF0B0, 0x81CD, + 0xF0B1, 0x85BA, 0xF0B2, 0x88FD, 0xF0B3, 0x8AF8, 0xF0B4, 0x8E44, + 0xF0B5, 0x918D, 0xF0B6, 0x9664, 0xF0B7, 0x969B, 0xF0B8, 0x973D, + 0xF0B9, 0x984C, 0xF0BA, 0x9F4A, 0xF0BB, 0x4FCE, 0xF0BC, 0x5146, + 0xF0BD, 0x51CB, 0xF0BE, 0x52A9, 0xF0BF, 0x5632, 0xF0C0, 0x5F14, + 0xF0C1, 0x5F6B, 0xF0C2, 0x63AA, 0xF0C3, 0x64CD, 0xF0C4, 0x65E9, + 0xF0C5, 0x6641, 0xF0C6, 0x66FA, 0xF0C7, 0x66F9, 0xF0C8, 0x671D, + 0xF0C9, 0x689D, 0xF0CA, 0x68D7, 0xF0CB, 0x69FD, 0xF0CC, 0x6F15, + 0xF0CD, 0x6F6E, 0xF0CE, 0x7167, 0xF0CF, 0x71E5, 0xF0D0, 0x722A, + 0xF0D1, 0x74AA, 0xF0D2, 0x773A, 0xF0D3, 0x7956, 0xF0D4, 0x795A, + 0xF0D5, 0x79DF, 0xF0D6, 0x7A20, 0xF0D7, 0x7A95, 0xF0D8, 0x7C97, + 0xF0D9, 0x7CDF, 0xF0DA, 0x7D44, 0xF0DB, 0x7E70, 0xF0DC, 0x8087, + 0xF0DD, 0x85FB, 0xF0DE, 0x86A4, 0xF0DF, 0x8A54, 0xF0E0, 0x8ABF, + 0xF0E1, 0x8D99, 0xF0E2, 0x8E81, 0xF0E3, 0x9020, 0xF0E4, 0x906D, + 0xF0E5, 0x91E3, 0xF0E6, 0x963B, 0xF0E7, 0x96D5, 0xF0E8, 0x9CE5, + 0xF0E9, 0x65CF, 0xF0EA, 0x7C07, 0xF0EB, 0x8DB3, 0xF0EC, 0x93C3, + 0xF0ED, 0x5B58, 0xF0EE, 0x5C0A, 0xF0EF, 0x5352, 0xF0F0, 0x62D9, + 0xF0F1, 0x731D, 0xF0F2, 0x5027, 0xF0F3, 0x5B97, 0xF0F4, 0x5F9E, + 0xF0F5, 0x60B0, 0xF0F6, 0x616B, 0xF0F7, 0x68D5, 0xF0F8, 0x6DD9, + 0xF0F9, 0x742E, 0xF0FA, 0x7A2E, 0xF0FB, 0x7D42, 0xF0FC, 0x7D9C, + 0xF0FD, 0x7E31, 0xF0FE, 0x816B, 0xF1A1, 0x8E2A, 0xF1A2, 0x8E35, + 0xF1A3, 0x937E, 0xF1A4, 0x9418, 0xF1A5, 0x4F50, 0xF1A6, 0x5750, + 0xF1A7, 0x5DE6, 0xF1A8, 0x5EA7, 0xF1A9, 0x632B, 0xF1AA, 0x7F6A, + 0xF1AB, 0x4E3B, 0xF1AC, 0x4F4F, 0xF1AD, 0x4F8F, 0xF1AE, 0x505A, + 0xF1AF, 0x59DD, 0xF1B0, 0x80C4, 0xF1B1, 0x546A, 0xF1B2, 0x5468, + 0xF1B3, 0x55FE, 0xF1B4, 0x594F, 0xF1B5, 0x5B99, 0xF1B6, 0x5DDE, + 0xF1B7, 0x5EDA, 0xF1B8, 0x665D, 0xF1B9, 0x6731, 0xF1BA, 0x67F1, + 0xF1BB, 0x682A, 0xF1BC, 0x6CE8, 0xF1BD, 0x6D32, 0xF1BE, 0x6E4A, + 0xF1BF, 0x6F8D, 0xF1C0, 0x70B7, 0xF1C1, 0x73E0, 0xF1C2, 0x7587, + 0xF1C3, 0x7C4C, 0xF1C4, 0x7D02, 0xF1C5, 0x7D2C, 0xF1C6, 0x7DA2, + 0xF1C7, 0x821F, 0xF1C8, 0x86DB, 0xF1C9, 0x8A3B, 0xF1CA, 0x8A85, + 0xF1CB, 0x8D70, 0xF1CC, 0x8E8A, 0xF1CD, 0x8F33, 0xF1CE, 0x9031, + 0xF1CF, 0x914E, 0xF1D0, 0x9152, 0xF1D1, 0x9444, 0xF1D2, 0x99D0, + 0xF1D3, 0x7AF9, 0xF1D4, 0x7CA5, 0xF1D5, 0x4FCA, 0xF1D6, 0x5101, + 0xF1D7, 0x51C6, 0xF1D8, 0x57C8, 0xF1D9, 0x5BEF, 0xF1DA, 0x5CFB, + 0xF1DB, 0x6659, 0xF1DC, 0x6A3D, 0xF1DD, 0x6D5A, 0xF1DE, 0x6E96, + 0xF1DF, 0x6FEC, 0xF1E0, 0x710C, 0xF1E1, 0x756F, 0xF1E2, 0x7AE3, + 0xF1E3, 0x8822, 0xF1E4, 0x9021, 0xF1E5, 0x9075, 0xF1E6, 0x96CB, + 0xF1E7, 0x99FF, 0xF1E8, 0x8301, 0xF1E9, 0x4E2D, 0xF1EA, 0x4EF2, + 0xF1EB, 0x8846, 0xF1EC, 0x91CD, 0xF1ED, 0x537D, 0xF1EE, 0x6ADB, + 0xF1EF, 0x696B, 0xF1F0, 0x6C41, 0xF1F1, 0x847A, 0xF1F2, 0x589E, + 0xF1F3, 0x618E, 0xF1F4, 0x66FE, 0xF1F5, 0x62EF, 0xF1F6, 0x70DD, + 0xF1F7, 0x7511, 0xF1F8, 0x75C7, 0xF1F9, 0x7E52, 0xF1FA, 0x84B8, + 0xF1FB, 0x8B49, 0xF1FC, 0x8D08, 0xF1FD, 0x4E4B, 0xF1FE, 0x53EA, + 0xF2A1, 0x54AB, 0xF2A2, 0x5730, 0xF2A3, 0x5740, 0xF2A4, 0x5FD7, + 0xF2A5, 0x6301, 0xF2A6, 0x6307, 0xF2A7, 0x646F, 0xF2A8, 0x652F, + 0xF2A9, 0x65E8, 0xF2AA, 0x667A, 0xF2AB, 0x679D, 0xF2AC, 0x67B3, + 0xF2AD, 0x6B62, 0xF2AE, 0x6C60, 0xF2AF, 0x6C9A, 0xF2B0, 0x6F2C, + 0xF2B1, 0x77E5, 0xF2B2, 0x7825, 0xF2B3, 0x7949, 0xF2B4, 0x7957, + 0xF2B5, 0x7D19, 0xF2B6, 0x80A2, 0xF2B7, 0x8102, 0xF2B8, 0x81F3, + 0xF2B9, 0x829D, 0xF2BA, 0x82B7, 0xF2BB, 0x8718, 0xF2BC, 0x8A8C, + 0xF2BD, 0xF9FC, 0xF2BE, 0x8D04, 0xF2BF, 0x8DBE, 0xF2C0, 0x9072, + 0xF2C1, 0x76F4, 0xF2C2, 0x7A19, 0xF2C3, 0x7A37, 0xF2C4, 0x7E54, + 0xF2C5, 0x8077, 0xF2C6, 0x5507, 0xF2C7, 0x55D4, 0xF2C8, 0x5875, + 0xF2C9, 0x632F, 0xF2CA, 0x6422, 0xF2CB, 0x6649, 0xF2CC, 0x664B, + 0xF2CD, 0x686D, 0xF2CE, 0x699B, 0xF2CF, 0x6B84, 0xF2D0, 0x6D25, + 0xF2D1, 0x6EB1, 0xF2D2, 0x73CD, 0xF2D3, 0x7468, 0xF2D4, 0x74A1, + 0xF2D5, 0x755B, 0xF2D6, 0x75B9, 0xF2D7, 0x76E1, 0xF2D8, 0x771E, + 0xF2D9, 0x778B, 0xF2DA, 0x79E6, 0xF2DB, 0x7E09, 0xF2DC, 0x7E1D, + 0xF2DD, 0x81FB, 0xF2DE, 0x852F, 0xF2DF, 0x8897, 0xF2E0, 0x8A3A, + 0xF2E1, 0x8CD1, 0xF2E2, 0x8EEB, 0xF2E3, 0x8FB0, 0xF2E4, 0x9032, + 0xF2E5, 0x93AD, 0xF2E6, 0x9663, 0xF2E7, 0x9673, 0xF2E8, 0x9707, + 0xF2E9, 0x4F84, 0xF2EA, 0x53F1, 0xF2EB, 0x59EA, 0xF2EC, 0x5AC9, + 0xF2ED, 0x5E19, 0xF2EE, 0x684E, 0xF2EF, 0x74C6, 0xF2F0, 0x75BE, + 0xF2F1, 0x79E9, 0xF2F2, 0x7A92, 0xF2F3, 0x81A3, 0xF2F4, 0x86ED, + 0xF2F5, 0x8CEA, 0xF2F6, 0x8DCC, 0xF2F7, 0x8FED, 0xF2F8, 0x659F, + 0xF2F9, 0x6715, 0xF2FA, 0xF9FD, 0xF2FB, 0x57F7, 0xF2FC, 0x6F57, + 0xF2FD, 0x7DDD, 0xF2FE, 0x8F2F, 0xF3A1, 0x93F6, 0xF3A2, 0x96C6, + 0xF3A3, 0x5FB5, 0xF3A4, 0x61F2, 0xF3A5, 0x6F84, 0xF3A6, 0x4E14, + 0xF3A7, 0x4F98, 0xF3A8, 0x501F, 0xF3A9, 0x53C9, 0xF3AA, 0x55DF, + 0xF3AB, 0x5D6F, 0xF3AC, 0x5DEE, 0xF3AD, 0x6B21, 0xF3AE, 0x6B64, + 0xF3AF, 0x78CB, 0xF3B0, 0x7B9A, 0xF3B1, 0xF9FE, 0xF3B2, 0x8E49, + 0xF3B3, 0x8ECA, 0xF3B4, 0x906E, 0xF3B5, 0x6349, 0xF3B6, 0x643E, + 0xF3B7, 0x7740, 0xF3B8, 0x7A84, 0xF3B9, 0x932F, 0xF3BA, 0x947F, + 0xF3BB, 0x9F6A, 0xF3BC, 0x64B0, 0xF3BD, 0x6FAF, 0xF3BE, 0x71E6, + 0xF3BF, 0x74A8, 0xF3C0, 0x74DA, 0xF3C1, 0x7AC4, 0xF3C2, 0x7C12, + 0xF3C3, 0x7E82, 0xF3C4, 0x7CB2, 0xF3C5, 0x7E98, 0xF3C6, 0x8B9A, + 0xF3C7, 0x8D0A, 0xF3C8, 0x947D, 0xF3C9, 0x9910, 0xF3CA, 0x994C, + 0xF3CB, 0x5239, 0xF3CC, 0x5BDF, 0xF3CD, 0x64E6, 0xF3CE, 0x672D, + 0xF3CF, 0x7D2E, 0xF3D0, 0x50ED, 0xF3D1, 0x53C3, 0xF3D2, 0x5879, + 0xF3D3, 0x6158, 0xF3D4, 0x6159, 0xF3D5, 0x61FA, 0xF3D6, 0x65AC, + 0xF3D7, 0x7AD9, 0xF3D8, 0x8B92, 0xF3D9, 0x8B96, 0xF3DA, 0x5009, + 0xF3DB, 0x5021, 0xF3DC, 0x5275, 0xF3DD, 0x5531, 0xF3DE, 0x5A3C, + 0xF3DF, 0x5EE0, 0xF3E0, 0x5F70, 0xF3E1, 0x6134, 0xF3E2, 0x655E, + 0xF3E3, 0x660C, 0xF3E4, 0x6636, 0xF3E5, 0x66A2, 0xF3E6, 0x69CD, + 0xF3E7, 0x6EC4, 0xF3E8, 0x6F32, 0xF3E9, 0x7316, 0xF3EA, 0x7621, + 0xF3EB, 0x7A93, 0xF3EC, 0x8139, 0xF3ED, 0x8259, 0xF3EE, 0x83D6, + 0xF3EF, 0x84BC, 0xF3F0, 0x50B5, 0xF3F1, 0x57F0, 0xF3F2, 0x5BC0, + 0xF3F3, 0x5BE8, 0xF3F4, 0x5F69, 0xF3F5, 0x63A1, 0xF3F6, 0x7826, + 0xF3F7, 0x7DB5, 0xF3F8, 0x83DC, 0xF3F9, 0x8521, 0xF3FA, 0x91C7, + 0xF3FB, 0x91F5, 0xF3FC, 0x518A, 0xF3FD, 0x67F5, 0xF3FE, 0x7B56, + 0xF4A1, 0x8CAC, 0xF4A2, 0x51C4, 0xF4A3, 0x59BB, 0xF4A4, 0x60BD, + 0xF4A5, 0x8655, 0xF4A6, 0x501C, 0xF4A7, 0xF9FF, 0xF4A8, 0x5254, + 0xF4A9, 0x5C3A, 0xF4AA, 0x617D, 0xF4AB, 0x621A, 0xF4AC, 0x62D3, + 0xF4AD, 0x64F2, 0xF4AE, 0x65A5, 0xF4AF, 0x6ECC, 0xF4B0, 0x7620, + 0xF4B1, 0x810A, 0xF4B2, 0x8E60, 0xF4B3, 0x965F, 0xF4B4, 0x96BB, + 0xF4B5, 0x4EDF, 0xF4B6, 0x5343, 0xF4B7, 0x5598, 0xF4B8, 0x5929, + 0xF4B9, 0x5DDD, 0xF4BA, 0x64C5, 0xF4BB, 0x6CC9, 0xF4BC, 0x6DFA, + 0xF4BD, 0x7394, 0xF4BE, 0x7A7F, 0xF4BF, 0x821B, 0xF4C0, 0x85A6, + 0xF4C1, 0x8CE4, 0xF4C2, 0x8E10, 0xF4C3, 0x9077, 0xF4C4, 0x91E7, + 0xF4C5, 0x95E1, 0xF4C6, 0x9621, 0xF4C7, 0x97C6, 0xF4C8, 0x51F8, + 0xF4C9, 0x54F2, 0xF4CA, 0x5586, 0xF4CB, 0x5FB9, 0xF4CC, 0x64A4, + 0xF4CD, 0x6F88, 0xF4CE, 0x7DB4, 0xF4CF, 0x8F1F, 0xF4D0, 0x8F4D, + 0xF4D1, 0x9435, 0xF4D2, 0x50C9, 0xF4D3, 0x5C16, 0xF4D4, 0x6CBE, + 0xF4D5, 0x6DFB, 0xF4D6, 0x751B, 0xF4D7, 0x77BB, 0xF4D8, 0x7C3D, + 0xF4D9, 0x7C64, 0xF4DA, 0x8A79, 0xF4DB, 0x8AC2, 0xF4DC, 0x581E, + 0xF4DD, 0x59BE, 0xF4DE, 0x5E16, 0xF4DF, 0x6377, 0xF4E0, 0x7252, + 0xF4E1, 0x758A, 0xF4E2, 0x776B, 0xF4E3, 0x8ADC, 0xF4E4, 0x8CBC, + 0xF4E5, 0x8F12, 0xF4E6, 0x5EF3, 0xF4E7, 0x6674, 0xF4E8, 0x6DF8, + 0xF4E9, 0x807D, 0xF4EA, 0x83C1, 0xF4EB, 0x8ACB, 0xF4EC, 0x9751, + 0xF4ED, 0x9BD6, 0xF4EE, 0xFA00, 0xF4EF, 0x5243, 0xF4F0, 0x66FF, + 0xF4F1, 0x6D95, 0xF4F2, 0x6EEF, 0xF4F3, 0x7DE0, 0xF4F4, 0x8AE6, + 0xF4F5, 0x902E, 0xF4F6, 0x905E, 0xF4F7, 0x9AD4, 0xF4F8, 0x521D, + 0xF4F9, 0x527F, 0xF4FA, 0x54E8, 0xF4FB, 0x6194, 0xF4FC, 0x6284, + 0xF4FD, 0x62DB, 0xF4FE, 0x68A2, 0xF5A1, 0x6912, 0xF5A2, 0x695A, + 0xF5A3, 0x6A35, 0xF5A4, 0x7092, 0xF5A5, 0x7126, 0xF5A6, 0x785D, + 0xF5A7, 0x7901, 0xF5A8, 0x790E, 0xF5A9, 0x79D2, 0xF5AA, 0x7A0D, + 0xF5AB, 0x8096, 0xF5AC, 0x8278, 0xF5AD, 0x82D5, 0xF5AE, 0x8349, + 0xF5AF, 0x8549, 0xF5B0, 0x8C82, 0xF5B1, 0x8D85, 0xF5B2, 0x9162, + 0xF5B3, 0x918B, 0xF5B4, 0x91AE, 0xF5B5, 0x4FC3, 0xF5B6, 0x56D1, + 0xF5B7, 0x71ED, 0xF5B8, 0x77D7, 0xF5B9, 0x8700, 0xF5BA, 0x89F8, + 0xF5BB, 0x5BF8, 0xF5BC, 0x5FD6, 0xF5BD, 0x6751, 0xF5BE, 0x90A8, + 0xF5BF, 0x53E2, 0xF5C0, 0x585A, 0xF5C1, 0x5BF5, 0xF5C2, 0x60A4, + 0xF5C3, 0x6181, 0xF5C4, 0x6460, 0xF5C5, 0x7E3D, 0xF5C6, 0x8070, + 0xF5C7, 0x8525, 0xF5C8, 0x9283, 0xF5C9, 0x64AE, 0xF5CA, 0x50AC, + 0xF5CB, 0x5D14, 0xF5CC, 0x6700, 0xF5CD, 0x589C, 0xF5CE, 0x62BD, + 0xF5CF, 0x63A8, 0xF5D0, 0x690E, 0xF5D1, 0x6978, 0xF5D2, 0x6A1E, + 0xF5D3, 0x6E6B, 0xF5D4, 0x76BA, 0xF5D5, 0x79CB, 0xF5D6, 0x82BB, + 0xF5D7, 0x8429, 0xF5D8, 0x8ACF, 0xF5D9, 0x8DA8, 0xF5DA, 0x8FFD, + 0xF5DB, 0x9112, 0xF5DC, 0x914B, 0xF5DD, 0x919C, 0xF5DE, 0x9310, + 0xF5DF, 0x9318, 0xF5E0, 0x939A, 0xF5E1, 0x96DB, 0xF5E2, 0x9A36, + 0xF5E3, 0x9C0D, 0xF5E4, 0x4E11, 0xF5E5, 0x755C, 0xF5E6, 0x795D, + 0xF5E7, 0x7AFA, 0xF5E8, 0x7B51, 0xF5E9, 0x7BC9, 0xF5EA, 0x7E2E, + 0xF5EB, 0x84C4, 0xF5EC, 0x8E59, 0xF5ED, 0x8E74, 0xF5EE, 0x8EF8, + 0xF5EF, 0x9010, 0xF5F0, 0x6625, 0xF5F1, 0x693F, 0xF5F2, 0x7443, + 0xF5F3, 0x51FA, 0xF5F4, 0x672E, 0xF5F5, 0x9EDC, 0xF5F6, 0x5145, + 0xF5F7, 0x5FE0, 0xF5F8, 0x6C96, 0xF5F9, 0x87F2, 0xF5FA, 0x885D, + 0xF5FB, 0x8877, 0xF5FC, 0x60B4, 0xF5FD, 0x81B5, 0xF5FE, 0x8403, + 0xF6A1, 0x8D05, 0xF6A2, 0x53D6, 0xF6A3, 0x5439, 0xF6A4, 0x5634, + 0xF6A5, 0x5A36, 0xF6A6, 0x5C31, 0xF6A7, 0x708A, 0xF6A8, 0x7FE0, + 0xF6A9, 0x805A, 0xF6AA, 0x8106, 0xF6AB, 0x81ED, 0xF6AC, 0x8DA3, + 0xF6AD, 0x9189, 0xF6AE, 0x9A5F, 0xF6AF, 0x9DF2, 0xF6B0, 0x5074, + 0xF6B1, 0x4EC4, 0xF6B2, 0x53A0, 0xF6B3, 0x60FB, 0xF6B4, 0x6E2C, + 0xF6B5, 0x5C64, 0xF6B6, 0x4F88, 0xF6B7, 0x5024, 0xF6B8, 0x55E4, + 0xF6B9, 0x5CD9, 0xF6BA, 0x5E5F, 0xF6BB, 0x6065, 0xF6BC, 0x6894, + 0xF6BD, 0x6CBB, 0xF6BE, 0x6DC4, 0xF6BF, 0x71BE, 0xF6C0, 0x75D4, + 0xF6C1, 0x75F4, 0xF6C2, 0x7661, 0xF6C3, 0x7A1A, 0xF6C4, 0x7A49, + 0xF6C5, 0x7DC7, 0xF6C6, 0x7DFB, 0xF6C7, 0x7F6E, 0xF6C8, 0x81F4, + 0xF6C9, 0x86A9, 0xF6CA, 0x8F1C, 0xF6CB, 0x96C9, 0xF6CC, 0x99B3, + 0xF6CD, 0x9F52, 0xF6CE, 0x5247, 0xF6CF, 0x52C5, 0xF6D0, 0x98ED, + 0xF6D1, 0x89AA, 0xF6D2, 0x4E03, 0xF6D3, 0x67D2, 0xF6D4, 0x6F06, + 0xF6D5, 0x4FB5, 0xF6D6, 0x5BE2, 0xF6D7, 0x6795, 0xF6D8, 0x6C88, + 0xF6D9, 0x6D78, 0xF6DA, 0x741B, 0xF6DB, 0x7827, 0xF6DC, 0x91DD, + 0xF6DD, 0x937C, 0xF6DE, 0x87C4, 0xF6DF, 0x79E4, 0xF6E0, 0x7A31, + 0xF6E1, 0x5FEB, 0xF6E2, 0x4ED6, 0xF6E3, 0x54A4, 0xF6E4, 0x553E, + 0xF6E5, 0x58AE, 0xF6E6, 0x59A5, 0xF6E7, 0x60F0, 0xF6E8, 0x6253, + 0xF6E9, 0x62D6, 0xF6EA, 0x6736, 0xF6EB, 0x6955, 0xF6EC, 0x8235, + 0xF6ED, 0x9640, 0xF6EE, 0x99B1, 0xF6EF, 0x99DD, 0xF6F0, 0x502C, + 0xF6F1, 0x5353, 0xF6F2, 0x5544, 0xF6F3, 0x577C, 0xF6F4, 0xFA01, + 0xF6F5, 0x6258, 0xF6F6, 0xFA02, 0xF6F7, 0x64E2, 0xF6F8, 0x666B, + 0xF6F9, 0x67DD, 0xF6FA, 0x6FC1, 0xF6FB, 0x6FEF, 0xF6FC, 0x7422, + 0xF6FD, 0x7438, 0xF6FE, 0x8A17, 0xF7A1, 0x9438, 0xF7A2, 0x5451, + 0xF7A3, 0x5606, 0xF7A4, 0x5766, 0xF7A5, 0x5F48, 0xF7A6, 0x619A, + 0xF7A7, 0x6B4E, 0xF7A8, 0x7058, 0xF7A9, 0x70AD, 0xF7AA, 0x7DBB, + 0xF7AB, 0x8A95, 0xF7AC, 0x596A, 0xF7AD, 0x812B, 0xF7AE, 0x63A2, + 0xF7AF, 0x7708, 0xF7B0, 0x803D, 0xF7B1, 0x8CAA, 0xF7B2, 0x5854, + 0xF7B3, 0x642D, 0xF7B4, 0x69BB, 0xF7B5, 0x5B95, 0xF7B6, 0x5E11, + 0xF7B7, 0x6E6F, 0xF7B8, 0xFA03, 0xF7B9, 0x8569, 0xF7BA, 0x514C, + 0xF7BB, 0x53F0, 0xF7BC, 0x592A, 0xF7BD, 0x6020, 0xF7BE, 0x614B, + 0xF7BF, 0x6B86, 0xF7C0, 0x6C70, 0xF7C1, 0x6CF0, 0xF7C2, 0x7B1E, + 0xF7C3, 0x80CE, 0xF7C4, 0x82D4, 0xF7C5, 0x8DC6, 0xF7C6, 0x90B0, + 0xF7C7, 0x98B1, 0xF7C8, 0xFA04, 0xF7C9, 0x64C7, 0xF7CA, 0x6FA4, + 0xF7CB, 0x6491, 0xF7CC, 0x6504, 0xF7CD, 0x514E, 0xF7CE, 0x5410, + 0xF7CF, 0x571F, 0xF7D0, 0x8A0E, 0xF7D1, 0x615F, 0xF7D2, 0x6876, + 0xF7D3, 0xFA05, 0xF7D4, 0x75DB, 0xF7D5, 0x7B52, 0xF7D6, 0x7D71, + 0xF7D7, 0x901A, 0xF7D8, 0x5806, 0xF7D9, 0x69CC, 0xF7DA, 0x817F, + 0xF7DB, 0x892A, 0xF7DC, 0x9000, 0xF7DD, 0x9839, 0xF7DE, 0x5078, + 0xF7DF, 0x5957, 0xF7E0, 0x59AC, 0xF7E1, 0x6295, 0xF7E2, 0x900F, + 0xF7E3, 0x9B2A, 0xF7E4, 0x615D, 0xF7E5, 0x7279, 0xF7E6, 0x95D6, + 0xF7E7, 0x5761, 0xF7E8, 0x5A46, 0xF7E9, 0x5DF4, 0xF7EA, 0x628A, + 0xF7EB, 0x64AD, 0xF7EC, 0x64FA, 0xF7ED, 0x6777, 0xF7EE, 0x6CE2, + 0xF7EF, 0x6D3E, 0xF7F0, 0x722C, 0xF7F1, 0x7436, 0xF7F2, 0x7834, + 0xF7F3, 0x7F77, 0xF7F4, 0x82AD, 0xF7F5, 0x8DDB, 0xF7F6, 0x9817, + 0xF7F7, 0x5224, 0xF7F8, 0x5742, 0xF7F9, 0x677F, 0xF7FA, 0x7248, + 0xF7FB, 0x74E3, 0xF7FC, 0x8CA9, 0xF7FD, 0x8FA6, 0xF7FE, 0x9211, + 0xF8A1, 0x962A, 0xF8A2, 0x516B, 0xF8A3, 0x53ED, 0xF8A4, 0x634C, + 0xF8A5, 0x4F69, 0xF8A6, 0x5504, 0xF8A7, 0x6096, 0xF8A8, 0x6557, + 0xF8A9, 0x6C9B, 0xF8AA, 0x6D7F, 0xF8AB, 0x724C, 0xF8AC, 0x72FD, + 0xF8AD, 0x7A17, 0xF8AE, 0x8987, 0xF8AF, 0x8C9D, 0xF8B0, 0x5F6D, + 0xF8B1, 0x6F8E, 0xF8B2, 0x70F9, 0xF8B3, 0x81A8, 0xF8B4, 0x610E, + 0xF8B5, 0x4FBF, 0xF8B6, 0x504F, 0xF8B7, 0x6241, 0xF8B8, 0x7247, + 0xF8B9, 0x7BC7, 0xF8BA, 0x7DE8, 0xF8BB, 0x7FE9, 0xF8BC, 0x904D, + 0xF8BD, 0x97AD, 0xF8BE, 0x9A19, 0xF8BF, 0x8CB6, 0xF8C0, 0x576A, + 0xF8C1, 0x5E73, 0xF8C2, 0x67B0, 0xF8C3, 0x840D, 0xF8C4, 0x8A55, + 0xF8C5, 0x5420, 0xF8C6, 0x5B16, 0xF8C7, 0x5E63, 0xF8C8, 0x5EE2, + 0xF8C9, 0x5F0A, 0xF8CA, 0x6583, 0xF8CB, 0x80BA, 0xF8CC, 0x853D, + 0xF8CD, 0x9589, 0xF8CE, 0x965B, 0xF8CF, 0x4F48, 0xF8D0, 0x5305, + 0xF8D1, 0x530D, 0xF8D2, 0x530F, 0xF8D3, 0x5486, 0xF8D4, 0x54FA, + 0xF8D5, 0x5703, 0xF8D6, 0x5E03, 0xF8D7, 0x6016, 0xF8D8, 0x629B, + 0xF8D9, 0x62B1, 0xF8DA, 0x6355, 0xF8DB, 0xFA06, 0xF8DC, 0x6CE1, + 0xF8DD, 0x6D66, 0xF8DE, 0x75B1, 0xF8DF, 0x7832, 0xF8E0, 0x80DE, + 0xF8E1, 0x812F, 0xF8E2, 0x82DE, 0xF8E3, 0x8461, 0xF8E4, 0x84B2, + 0xF8E5, 0x888D, 0xF8E6, 0x8912, 0xF8E7, 0x900B, 0xF8E8, 0x92EA, + 0xF8E9, 0x98FD, 0xF8EA, 0x9B91, 0xF8EB, 0x5E45, 0xF8EC, 0x66B4, + 0xF8ED, 0x66DD, 0xF8EE, 0x7011, 0xF8EF, 0x7206, 0xF8F0, 0xFA07, + 0xF8F1, 0x4FF5, 0xF8F2, 0x527D, 0xF8F3, 0x5F6A, 0xF8F4, 0x6153, + 0xF8F5, 0x6753, 0xF8F6, 0x6A19, 0xF8F7, 0x6F02, 0xF8F8, 0x74E2, + 0xF8F9, 0x7968, 0xF8FA, 0x8868, 0xF8FB, 0x8C79, 0xF8FC, 0x98C7, + 0xF8FD, 0x98C4, 0xF8FE, 0x9A43, 0xF9A1, 0x54C1, 0xF9A2, 0x7A1F, + 0xF9A3, 0x6953, 0xF9A4, 0x8AF7, 0xF9A5, 0x8C4A, 0xF9A6, 0x98A8, + 0xF9A7, 0x99AE, 0xF9A8, 0x5F7C, 0xF9A9, 0x62AB, 0xF9AA, 0x75B2, + 0xF9AB, 0x76AE, 0xF9AC, 0x88AB, 0xF9AD, 0x907F, 0xF9AE, 0x9642, + 0xF9AF, 0x5339, 0xF9B0, 0x5F3C, 0xF9B1, 0x5FC5, 0xF9B2, 0x6CCC, + 0xF9B3, 0x73CC, 0xF9B4, 0x7562, 0xF9B5, 0x758B, 0xF9B6, 0x7B46, + 0xF9B7, 0x82FE, 0xF9B8, 0x999D, 0xF9B9, 0x4E4F, 0xF9BA, 0x903C, + 0xF9BB, 0x4E0B, 0xF9BC, 0x4F55, 0xF9BD, 0x53A6, 0xF9BE, 0x590F, + 0xF9BF, 0x5EC8, 0xF9C0, 0x6630, 0xF9C1, 0x6CB3, 0xF9C2, 0x7455, + 0xF9C3, 0x8377, 0xF9C4, 0x8766, 0xF9C5, 0x8CC0, 0xF9C6, 0x9050, + 0xF9C7, 0x971E, 0xF9C8, 0x9C15, 0xF9C9, 0x58D1, 0xF9CA, 0x5B78, + 0xF9CB, 0x8650, 0xF9CC, 0x8B14, 0xF9CD, 0x9DB4, 0xF9CE, 0x5BD2, + 0xF9CF, 0x6068, 0xF9D0, 0x608D, 0xF9D1, 0x65F1, 0xF9D2, 0x6C57, + 0xF9D3, 0x6F22, 0xF9D4, 0x6FA3, 0xF9D5, 0x701A, 0xF9D6, 0x7F55, + 0xF9D7, 0x7FF0, 0xF9D8, 0x9591, 0xF9D9, 0x9592, 0xF9DA, 0x9650, + 0xF9DB, 0x97D3, 0xF9DC, 0x5272, 0xF9DD, 0x8F44, 0xF9DE, 0x51FD, + 0xF9DF, 0x542B, 0xF9E0, 0x54B8, 0xF9E1, 0x5563, 0xF9E2, 0x558A, + 0xF9E3, 0x6ABB, 0xF9E4, 0x6DB5, 0xF9E5, 0x7DD8, 0xF9E6, 0x8266, + 0xF9E7, 0x929C, 0xF9E8, 0x9677, 0xF9E9, 0x9E79, 0xF9EA, 0x5408, + 0xF9EB, 0x54C8, 0xF9EC, 0x76D2, 0xF9ED, 0x86E4, 0xF9EE, 0x95A4, + 0xF9EF, 0x95D4, 0xF9F0, 0x965C, 0xF9F1, 0x4EA2, 0xF9F2, 0x4F09, + 0xF9F3, 0x59EE, 0xF9F4, 0x5AE6, 0xF9F5, 0x5DF7, 0xF9F6, 0x6052, + 0xF9F7, 0x6297, 0xF9F8, 0x676D, 0xF9F9, 0x6841, 0xF9FA, 0x6C86, + 0xF9FB, 0x6E2F, 0xF9FC, 0x7F38, 0xF9FD, 0x809B, 0xF9FE, 0x822A, + 0xFAA1, 0xFA08, 0xFAA2, 0xFA09, 0xFAA3, 0x9805, 0xFAA4, 0x4EA5, + 0xFAA5, 0x5055, 0xFAA6, 0x54B3, 0xFAA7, 0x5793, 0xFAA8, 0x595A, + 0xFAA9, 0x5B69, 0xFAAA, 0x5BB3, 0xFAAB, 0x61C8, 0xFAAC, 0x6977, + 0xFAAD, 0x6D77, 0xFAAE, 0x7023, 0xFAAF, 0x87F9, 0xFAB0, 0x89E3, + 0xFAB1, 0x8A72, 0xFAB2, 0x8AE7, 0xFAB3, 0x9082, 0xFAB4, 0x99ED, + 0xFAB5, 0x9AB8, 0xFAB6, 0x52BE, 0xFAB7, 0x6838, 0xFAB8, 0x5016, + 0xFAB9, 0x5E78, 0xFABA, 0x674F, 0xFABB, 0x8347, 0xFABC, 0x884C, + 0xFABD, 0x4EAB, 0xFABE, 0x5411, 0xFABF, 0x56AE, 0xFAC0, 0x73E6, + 0xFAC1, 0x9115, 0xFAC2, 0x97FF, 0xFAC3, 0x9909, 0xFAC4, 0x9957, + 0xFAC5, 0x9999, 0xFAC6, 0x5653, 0xFAC7, 0x589F, 0xFAC8, 0x865B, + 0xFAC9, 0x8A31, 0xFACA, 0x61B2, 0xFACB, 0x6AF6, 0xFACC, 0x737B, + 0xFACD, 0x8ED2, 0xFACE, 0x6B47, 0xFACF, 0x96AA, 0xFAD0, 0x9A57, + 0xFAD1, 0x5955, 0xFAD2, 0x7200, 0xFAD3, 0x8D6B, 0xFAD4, 0x9769, + 0xFAD5, 0x4FD4, 0xFAD6, 0x5CF4, 0xFAD7, 0x5F26, 0xFAD8, 0x61F8, + 0xFAD9, 0x665B, 0xFADA, 0x6CEB, 0xFADB, 0x70AB, 0xFADC, 0x7384, + 0xFADD, 0x73B9, 0xFADE, 0x73FE, 0xFADF, 0x7729, 0xFAE0, 0x774D, + 0xFAE1, 0x7D43, 0xFAE2, 0x7D62, 0xFAE3, 0x7E23, 0xFAE4, 0x8237, + 0xFAE5, 0x8852, 0xFAE6, 0xFA0A, 0xFAE7, 0x8CE2, 0xFAE8, 0x9249, + 0xFAE9, 0x986F, 0xFAEA, 0x5B51, 0xFAEB, 0x7A74, 0xFAEC, 0x8840, + 0xFAED, 0x9801, 0xFAEE, 0x5ACC, 0xFAEF, 0x4FE0, 0xFAF0, 0x5354, + 0xFAF1, 0x593E, 0xFAF2, 0x5CFD, 0xFAF3, 0x633E, 0xFAF4, 0x6D79, + 0xFAF5, 0x72F9, 0xFAF6, 0x8105, 0xFAF7, 0x8107, 0xFAF8, 0x83A2, + 0xFAF9, 0x92CF, 0xFAFA, 0x9830, 0xFAFB, 0x4EA8, 0xFAFC, 0x5144, + 0xFAFD, 0x5211, 0xFAFE, 0x578B, 0xFBA1, 0x5F62, 0xFBA2, 0x6CC2, + 0xFBA3, 0x6ECE, 0xFBA4, 0x7005, 0xFBA5, 0x7050, 0xFBA6, 0x70AF, + 0xFBA7, 0x7192, 0xFBA8, 0x73E9, 0xFBA9, 0x7469, 0xFBAA, 0x834A, + 0xFBAB, 0x87A2, 0xFBAC, 0x8861, 0xFBAD, 0x9008, 0xFBAE, 0x90A2, + 0xFBAF, 0x93A3, 0xFBB0, 0x99A8, 0xFBB1, 0x516E, 0xFBB2, 0x5F57, + 0xFBB3, 0x60E0, 0xFBB4, 0x6167, 0xFBB5, 0x66B3, 0xFBB6, 0x8559, + 0xFBB7, 0x8E4A, 0xFBB8, 0x91AF, 0xFBB9, 0x978B, 0xFBBA, 0x4E4E, + 0xFBBB, 0x4E92, 0xFBBC, 0x547C, 0xFBBD, 0x58D5, 0xFBBE, 0x58FA, + 0xFBBF, 0x597D, 0xFBC0, 0x5CB5, 0xFBC1, 0x5F27, 0xFBC2, 0x6236, + 0xFBC3, 0x6248, 0xFBC4, 0x660A, 0xFBC5, 0x6667, 0xFBC6, 0x6BEB, + 0xFBC7, 0x6D69, 0xFBC8, 0x6DCF, 0xFBC9, 0x6E56, 0xFBCA, 0x6EF8, + 0xFBCB, 0x6F94, 0xFBCC, 0x6FE0, 0xFBCD, 0x6FE9, 0xFBCE, 0x705D, + 0xFBCF, 0x72D0, 0xFBD0, 0x7425, 0xFBD1, 0x745A, 0xFBD2, 0x74E0, + 0xFBD3, 0x7693, 0xFBD4, 0x795C, 0xFBD5, 0x7CCA, 0xFBD6, 0x7E1E, + 0xFBD7, 0x80E1, 0xFBD8, 0x82A6, 0xFBD9, 0x846B, 0xFBDA, 0x84BF, + 0xFBDB, 0x864E, 0xFBDC, 0x865F, 0xFBDD, 0x8774, 0xFBDE, 0x8B77, + 0xFBDF, 0x8C6A, 0xFBE0, 0x93AC, 0xFBE1, 0x9800, 0xFBE2, 0x9865, + 0xFBE3, 0x60D1, 0xFBE4, 0x6216, 0xFBE5, 0x9177, 0xFBE6, 0x5A5A, + 0xFBE7, 0x660F, 0xFBE8, 0x6DF7, 0xFBE9, 0x6E3E, 0xFBEA, 0x743F, + 0xFBEB, 0x9B42, 0xFBEC, 0x5FFD, 0xFBED, 0x60DA, 0xFBEE, 0x7B0F, + 0xFBEF, 0x54C4, 0xFBF0, 0x5F18, 0xFBF1, 0x6C5E, 0xFBF2, 0x6CD3, + 0xFBF3, 0x6D2A, 0xFBF4, 0x70D8, 0xFBF5, 0x7D05, 0xFBF6, 0x8679, + 0xFBF7, 0x8A0C, 0xFBF8, 0x9D3B, 0xFBF9, 0x5316, 0xFBFA, 0x548C, + 0xFBFB, 0x5B05, 0xFBFC, 0x6A3A, 0xFBFD, 0x706B, 0xFBFE, 0x7575, + 0xFCA1, 0x798D, 0xFCA2, 0x79BE, 0xFCA3, 0x82B1, 0xFCA4, 0x83EF, + 0xFCA5, 0x8A71, 0xFCA6, 0x8B41, 0xFCA7, 0x8CA8, 0xFCA8, 0x9774, + 0xFCA9, 0xFA0B, 0xFCAA, 0x64F4, 0xFCAB, 0x652B, 0xFCAC, 0x78BA, + 0xFCAD, 0x78BB, 0xFCAE, 0x7A6B, 0xFCAF, 0x4E38, 0xFCB0, 0x559A, + 0xFCB1, 0x5950, 0xFCB2, 0x5BA6, 0xFCB3, 0x5E7B, 0xFCB4, 0x60A3, + 0xFCB5, 0x63DB, 0xFCB6, 0x6B61, 0xFCB7, 0x6665, 0xFCB8, 0x6853, + 0xFCB9, 0x6E19, 0xFCBA, 0x7165, 0xFCBB, 0x74B0, 0xFCBC, 0x7D08, + 0xFCBD, 0x9084, 0xFCBE, 0x9A69, 0xFCBF, 0x9C25, 0xFCC0, 0x6D3B, + 0xFCC1, 0x6ED1, 0xFCC2, 0x733E, 0xFCC3, 0x8C41, 0xFCC4, 0x95CA, + 0xFCC5, 0x51F0, 0xFCC6, 0x5E4C, 0xFCC7, 0x5FA8, 0xFCC8, 0x604D, + 0xFCC9, 0x60F6, 0xFCCA, 0x6130, 0xFCCB, 0x614C, 0xFCCC, 0x6643, + 0xFCCD, 0x6644, 0xFCCE, 0x69A5, 0xFCCF, 0x6CC1, 0xFCD0, 0x6E5F, + 0xFCD1, 0x6EC9, 0xFCD2, 0x6F62, 0xFCD3, 0x714C, 0xFCD4, 0x749C, + 0xFCD5, 0x7687, 0xFCD6, 0x7BC1, 0xFCD7, 0x7C27, 0xFCD8, 0x8352, + 0xFCD9, 0x8757, 0xFCDA, 0x9051, 0xFCDB, 0x968D, 0xFCDC, 0x9EC3, + 0xFCDD, 0x532F, 0xFCDE, 0x56DE, 0xFCDF, 0x5EFB, 0xFCE0, 0x5F8A, + 0xFCE1, 0x6062, 0xFCE2, 0x6094, 0xFCE3, 0x61F7, 0xFCE4, 0x6666, + 0xFCE5, 0x6703, 0xFCE6, 0x6A9C, 0xFCE7, 0x6DEE, 0xFCE8, 0x6FAE, + 0xFCE9, 0x7070, 0xFCEA, 0x736A, 0xFCEB, 0x7E6A, 0xFCEC, 0x81BE, + 0xFCED, 0x8334, 0xFCEE, 0x86D4, 0xFCEF, 0x8AA8, 0xFCF0, 0x8CC4, + 0xFCF1, 0x5283, 0xFCF2, 0x7372, 0xFCF3, 0x5B96, 0xFCF4, 0x6A6B, + 0xFCF5, 0x9404, 0xFCF6, 0x54EE, 0xFCF7, 0x5686, 0xFCF8, 0x5B5D, + 0xFCF9, 0x6548, 0xFCFA, 0x6585, 0xFCFB, 0x66C9, 0xFCFC, 0x689F, + 0xFCFD, 0x6D8D, 0xFCFE, 0x6DC6, 0xFDA1, 0x723B, 0xFDA2, 0x80B4, + 0xFDA3, 0x9175, 0xFDA4, 0x9A4D, 0xFDA5, 0x4FAF, 0xFDA6, 0x5019, + 0xFDA7, 0x539A, 0xFDA8, 0x540E, 0xFDA9, 0x543C, 0xFDAA, 0x5589, + 0xFDAB, 0x55C5, 0xFDAC, 0x5E3F, 0xFDAD, 0x5F8C, 0xFDAE, 0x673D, + 0xFDAF, 0x7166, 0xFDB0, 0x73DD, 0xFDB1, 0x9005, 0xFDB2, 0x52DB, + 0xFDB3, 0x52F3, 0xFDB4, 0x5864, 0xFDB5, 0x58CE, 0xFDB6, 0x7104, + 0xFDB7, 0x718F, 0xFDB8, 0x71FB, 0xFDB9, 0x85B0, 0xFDBA, 0x8A13, + 0xFDBB, 0x6688, 0xFDBC, 0x85A8, 0xFDBD, 0x55A7, 0xFDBE, 0x6684, + 0xFDBF, 0x714A, 0xFDC0, 0x8431, 0xFDC1, 0x5349, 0xFDC2, 0x5599, + 0xFDC3, 0x6BC1, 0xFDC4, 0x5F59, 0xFDC5, 0x5FBD, 0xFDC6, 0x63EE, + 0xFDC7, 0x6689, 0xFDC8, 0x7147, 0xFDC9, 0x8AF1, 0xFDCA, 0x8F1D, + 0xFDCB, 0x9EBE, 0xFDCC, 0x4F11, 0xFDCD, 0x643A, 0xFDCE, 0x70CB, + 0xFDCF, 0x7566, 0xFDD0, 0x8667, 0xFDD1, 0x6064, 0xFDD2, 0x8B4E, + 0xFDD3, 0x9DF8, 0xFDD4, 0x5147, 0xFDD5, 0x51F6, 0xFDD6, 0x5308, + 0xFDD7, 0x6D36, 0xFDD8, 0x80F8, 0xFDD9, 0x9ED1, 0xFDDA, 0x6615, + 0xFDDB, 0x6B23, 0xFDDC, 0x7098, 0xFDDD, 0x75D5, 0xFDDE, 0x5403, + 0xFDDF, 0x5C79, 0xFDE0, 0x7D07, 0xFDE1, 0x8A16, 0xFDE2, 0x6B20, + 0xFDE3, 0x6B3D, 0xFDE4, 0x6B46, 0xFDE5, 0x5438, 0xFDE6, 0x6070, + 0xFDE7, 0x6D3D, 0xFDE8, 0x7FD5, 0xFDE9, 0x8208, 0xFDEA, 0x50D6, + 0xFDEB, 0x51DE, 0xFDEC, 0x559C, 0xFDED, 0x566B, 0xFDEE, 0x56CD, + 0xFDEF, 0x59EC, 0xFDF0, 0x5B09, 0xFDF1, 0x5E0C, 0xFDF2, 0x6199, + 0xFDF3, 0x6198, 0xFDF4, 0x6231, 0xFDF5, 0x665E, 0xFDF6, 0x66E6, + 0xFDF7, 0x7199, 0xFDF8, 0x71B9, 0xFDF9, 0x71BA, 0xFDFA, 0x72A7, + 0xFDFB, 0x79A7, 0xFDFC, 0x7A00, 0xFDFD, 0x7FB2, 0xFDFE, 0x8A70, + 0, 0 +}; + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR chr, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (chr < 0x80) { /* ASCII */ + c = chr; + } else { + if (dir) { /* OEMCP to unicode */ + p = oem2uni; + hi = sizeof(oem2uni) / 4 - 1; + } else { /* Unicode to OEMCP */ + p = uni2oem; + hi = sizeof(uni2oem) / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (chr == p[i * 2]) break; + if (chr > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; + } + + return c; +} + + + + +WCHAR ff_wtoupper ( /* Upper converted character */ + WCHAR chr /* Input character */ +) +{ + static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; + static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; + int i; + + + for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + + return tbl_lower[i] ? tbl_upper[i] : chr; +} diff --git a/third_party/fatfs/src/option/cc950.c b/third_party/fatfs/src/option/cc950.c new file mode 100644 index 0000000..a3c9c44 --- /dev/null +++ b/third_party/fatfs/src/option/cc950.c @@ -0,0 +1,6829 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - OEM code bidirectional converter (C)ChaN, 2009 */ +/* */ +/* CP950 (Traditional Chinese Big5) */ +/*------------------------------------------------------------------------*/ + +#include "../ff.h" + + +#if !_USE_LFN || _CODE_PAGE != 950 +#error This file is not needed in current configuration. Remove from the project. +#endif + + +static +const WCHAR uni2oem[] = { +/* Unicode - OEM, Unicode - OEM, Unicode - OEM, Unicode - OEM */ + 0x00A7, 0xA1B1, 0x00AF, 0xA1C2, 0x00B0, 0xA258, 0x00B1, 0xA1D3, + 0x00B7, 0xA150, 0x00D7, 0xA1D1, 0x00F7, 0xA1D2, 0x02C7, 0xA3BE, + 0x02C9, 0xA3BC, 0x02CA, 0xA3BD, 0x02CB, 0xA3BF, 0x02CD, 0xA1C5, + 0x02D9, 0xA3BB, 0x0391, 0xA344, 0x0392, 0xA345, 0x0393, 0xA346, + 0x0394, 0xA347, 0x0395, 0xA348, 0x0396, 0xA349, 0x0397, 0xA34A, + 0x0398, 0xA34B, 0x0399, 0xA34C, 0x039A, 0xA34D, 0x039B, 0xA34E, + 0x039C, 0xA34F, 0x039D, 0xA350, 0x039E, 0xA351, 0x039F, 0xA352, + 0x03A0, 0xA353, 0x03A1, 0xA354, 0x03A3, 0xA355, 0x03A4, 0xA356, + 0x03A5, 0xA357, 0x03A6, 0xA358, 0x03A7, 0xA359, 0x03A8, 0xA35A, + 0x03A9, 0xA35B, 0x03B1, 0xA35C, 0x03B2, 0xA35D, 0x03B3, 0xA35E, + 0x03B4, 0xA35F, 0x03B5, 0xA360, 0x03B6, 0xA361, 0x03B7, 0xA362, + 0x03B8, 0xA363, 0x03B9, 0xA364, 0x03BA, 0xA365, 0x03BB, 0xA366, + 0x03BC, 0xA367, 0x03BD, 0xA368, 0x03BE, 0xA369, 0x03BF, 0xA36A, + 0x03C0, 0xA36B, 0x03C1, 0xA36C, 0x03C3, 0xA36D, 0x03C4, 0xA36E, + 0x03C5, 0xA36F, 0x03C6, 0xA370, 0x03C7, 0xA371, 0x03C8, 0xA372, + 0x03C9, 0xA373, 0x2013, 0xA156, 0x2014, 0xA158, 0x2018, 0xA1A5, + 0x2019, 0xA1A6, 0x201C, 0xA1A7, 0x201D, 0xA1A8, 0x2025, 0xA14C, + 0x2026, 0xA14B, 0x2027, 0xA145, 0x2032, 0xA1AC, 0x2035, 0xA1AB, + 0x203B, 0xA1B0, 0x20AC, 0xA3E1, 0x2103, 0xA24A, 0x2105, 0xA1C1, + 0x2109, 0xA24B, 0x2160, 0xA2B9, 0x2161, 0xA2BA, 0x2162, 0xA2BB, + 0x2163, 0xA2BC, 0x2164, 0xA2BD, 0x2165, 0xA2BE, 0x2166, 0xA2BF, + 0x2167, 0xA2C0, 0x2168, 0xA2C1, 0x2169, 0xA2C2, 0x2190, 0xA1F6, + 0x2191, 0xA1F4, 0x2192, 0xA1F7, 0x2193, 0xA1F5, 0x2196, 0xA1F8, + 0x2197, 0xA1F9, 0x2198, 0xA1FB, 0x2199, 0xA1FA, 0x2215, 0xA241, + 0x221A, 0xA1D4, 0x221E, 0xA1DB, 0x221F, 0xA1E8, 0x2220, 0xA1E7, + 0x2223, 0xA1FD, 0x2225, 0xA1FC, 0x2229, 0xA1E4, 0x222A, 0xA1E5, + 0x222B, 0xA1EC, 0x222E, 0xA1ED, 0x2234, 0xA1EF, 0x2235, 0xA1EE, + 0x2252, 0xA1DC, 0x2260, 0xA1DA, 0x2261, 0xA1DD, 0x2266, 0xA1D8, + 0x2267, 0xA1D9, 0x2295, 0xA1F2, 0x2299, 0xA1F3, 0x22A5, 0xA1E6, + 0x22BF, 0xA1E9, 0x2500, 0xA277, 0x2502, 0xA278, 0x250C, 0xA27A, + 0x2510, 0xA27B, 0x2514, 0xA27C, 0x2518, 0xA27D, 0x251C, 0xA275, + 0x2524, 0xA274, 0x252C, 0xA273, 0x2534, 0xA272, 0x253C, 0xA271, + 0x2550, 0xA2A4, 0x2550, 0xF9F9, 0x2551, 0xF9F8, 0x2552, 0xF9E6, + 0x2553, 0xF9EF, 0x2554, 0xF9DD, 0x2555, 0xF9E8, 0x2556, 0xF9F1, + 0x2557, 0xF9DF, 0x2558, 0xF9EC, 0x2559, 0xF9F5, 0x255A, 0xF9E3, + 0x255B, 0xF9EE, 0x255C, 0xF9F7, 0x255D, 0xF9E5, 0x255E, 0xA2A5, + 0x255E, 0xF9E9, 0x255F, 0xF9F2, 0x2560, 0xF9E0, 0x2561, 0xA2A7, + 0x2561, 0xF9EB, 0x2562, 0xF9F4, 0x2563, 0xF9E2, 0x2564, 0xF9E7, + 0x2565, 0xF9F0, 0x2566, 0xF9DE, 0x2567, 0xF9ED, 0x2568, 0xF9F6, + 0x2569, 0xF9E4, 0x256A, 0xA2A6, 0x256A, 0xF9EA, 0x256B, 0xF9F3, + 0x256C, 0xF9E1, 0x256D, 0xA27E, 0x256D, 0xF9FA, 0x256E, 0xA2A1, + 0x256E, 0xF9FB, 0x256F, 0xA2A3, 0x256F, 0xF9FD, 0x2570, 0xA2A2, + 0x2570, 0xF9FC, 0x2571, 0xA2AC, 0x2572, 0xA2AD, 0x2573, 0xA2AE, + 0x2574, 0xA15A, 0x2581, 0xA262, 0x2582, 0xA263, 0x2583, 0xA264, + 0x2584, 0xA265, 0x2585, 0xA266, 0x2586, 0xA267, 0x2587, 0xA268, + 0x2588, 0xA269, 0x2589, 0xA270, 0x258A, 0xA26F, 0x258B, 0xA26E, + 0x258C, 0xA26D, 0x258D, 0xA26C, 0x258E, 0xA26B, 0x258F, 0xA26A, + 0x2593, 0xF9FE, 0x2594, 0xA276, 0x2595, 0xA279, 0x25A0, 0xA1BD, + 0x25A1, 0xA1BC, 0x25B2, 0xA1B6, 0x25B3, 0xA1B5, 0x25BC, 0xA1BF, + 0x25BD, 0xA1BE, 0x25C6, 0xA1BB, 0x25C7, 0xA1BA, 0x25CB, 0xA1B3, + 0x25CE, 0xA1B7, 0x25CF, 0xA1B4, 0x25E2, 0xA2A8, 0x25E3, 0xA2A9, + 0x25E4, 0xA2AB, 0x25E5, 0xA2AA, 0x2605, 0xA1B9, 0x2606, 0xA1B8, + 0x2640, 0xA1F0, 0x2642, 0xA1F1, 0x3000, 0xA140, 0x3001, 0xA142, + 0x3002, 0xA143, 0x3003, 0xA1B2, 0x3008, 0xA171, 0x3009, 0xA172, + 0x300A, 0xA16D, 0x300B, 0xA16E, 0x300C, 0xA175, 0x300D, 0xA176, + 0x300E, 0xA179, 0x300F, 0xA17A, 0x3010, 0xA169, 0x3011, 0xA16A, + 0x3012, 0xA245, 0x3014, 0xA165, 0x3015, 0xA166, 0x301D, 0xA1A9, + 0x301E, 0xA1AA, 0x3021, 0xA2C3, 0x3022, 0xA2C4, 0x3023, 0xA2C5, + 0x3024, 0xA2C6, 0x3025, 0xA2C7, 0x3026, 0xA2C8, 0x3027, 0xA2C9, + 0x3028, 0xA2CA, 0x3029, 0xA2CB, 0x3105, 0xA374, 0x3106, 0xA375, + 0x3107, 0xA376, 0x3108, 0xA377, 0x3109, 0xA378, 0x310A, 0xA379, + 0x310B, 0xA37A, 0x310C, 0xA37B, 0x310D, 0xA37C, 0x310E, 0xA37D, + 0x310F, 0xA37E, 0x3110, 0xA3A1, 0x3111, 0xA3A2, 0x3112, 0xA3A3, + 0x3113, 0xA3A4, 0x3114, 0xA3A5, 0x3115, 0xA3A6, 0x3116, 0xA3A7, + 0x3117, 0xA3A8, 0x3118, 0xA3A9, 0x3119, 0xA3AA, 0x311A, 0xA3AB, + 0x311B, 0xA3AC, 0x311C, 0xA3AD, 0x311D, 0xA3AE, 0x311E, 0xA3AF, + 0x311F, 0xA3B0, 0x3120, 0xA3B1, 0x3121, 0xA3B2, 0x3122, 0xA3B3, + 0x3123, 0xA3B4, 0x3124, 0xA3B5, 0x3125, 0xA3B6, 0x3126, 0xA3B7, + 0x3127, 0xA3B8, 0x3128, 0xA3B9, 0x3129, 0xA3BA, 0x32A3, 0xA1C0, + 0x338E, 0xA255, 0x338F, 0xA256, 0x339C, 0xA250, 0x339D, 0xA251, + 0x339E, 0xA252, 0x33A1, 0xA254, 0x33C4, 0xA257, 0x33CE, 0xA253, + 0x33D1, 0xA1EB, 0x33D2, 0xA1EA, 0x33D5, 0xA24F, 0x4E00, 0xA440, + 0x4E01, 0xA442, 0x4E03, 0xA443, 0x4E07, 0xC945, 0x4E08, 0xA456, + 0x4E09, 0xA454, 0x4E0A, 0xA457, 0x4E0B, 0xA455, 0x4E0C, 0xC946, + 0x4E0D, 0xA4A3, 0x4E0E, 0xC94F, 0x4E0F, 0xC94D, 0x4E10, 0xA4A2, + 0x4E11, 0xA4A1, 0x4E14, 0xA542, 0x4E15, 0xA541, 0x4E16, 0xA540, + 0x4E18, 0xA543, 0x4E19, 0xA4FE, 0x4E1E, 0xA5E0, 0x4E1F, 0xA5E1, + 0x4E26, 0xA8C3, 0x4E2B, 0xA458, 0x4E2D, 0xA4A4, 0x4E2E, 0xC950, + 0x4E30, 0xA4A5, 0x4E31, 0xC963, 0x4E32, 0xA6EA, 0x4E33, 0xCBB1, + 0x4E38, 0xA459, 0x4E39, 0xA4A6, 0x4E3B, 0xA544, 0x4E3C, 0xC964, + 0x4E42, 0xC940, 0x4E43, 0xA444, 0x4E45, 0xA45B, 0x4E47, 0xC947, + 0x4E48, 0xA45C, 0x4E4B, 0xA4A7, 0x4E4D, 0xA545, 0x4E4E, 0xA547, + 0x4E4F, 0xA546, 0x4E52, 0xA5E2, 0x4E53, 0xA5E3, 0x4E56, 0xA8C4, + 0x4E58, 0xADBC, 0x4E59, 0xA441, 0x4E5C, 0xC941, 0x4E5D, 0xA445, + 0x4E5E, 0xA45E, 0x4E5F, 0xA45D, 0x4E69, 0xA5E4, 0x4E73, 0xA8C5, + 0x4E7E, 0xB0AE, 0x4E7F, 0xD44B, 0x4E82, 0xB6C3, 0x4E83, 0xDCB1, + 0x4E84, 0xDCB2, 0x4E86, 0xA446, 0x4E88, 0xA4A9, 0x4E8B, 0xA8C6, + 0x4E8C, 0xA447, 0x4E8D, 0xC948, 0x4E8E, 0xA45F, 0x4E91, 0xA4AA, + 0x4E92, 0xA4AC, 0x4E93, 0xC951, 0x4E94, 0xA4AD, 0x4E95, 0xA4AB, + 0x4E99, 0xA5E5, 0x4E9B, 0xA8C7, 0x4E9E, 0xA8C8, 0x4E9F, 0xAB45, + 0x4EA1, 0xA460, 0x4EA2, 0xA4AE, 0x4EA4, 0xA5E6, 0x4EA5, 0xA5E8, + 0x4EA6, 0xA5E7, 0x4EA8, 0xA6EB, 0x4EAB, 0xA8C9, 0x4EAC, 0xA8CA, + 0x4EAD, 0xAB46, 0x4EAE, 0xAB47, 0x4EB3, 0xADBD, 0x4EB6, 0xDCB3, + 0x4EB9, 0xF6D6, 0x4EBA, 0xA448, 0x4EC0, 0xA4B0, 0x4EC1, 0xA4AF, + 0x4EC2, 0xC952, 0x4EC3, 0xA4B1, 0x4EC4, 0xA4B7, 0x4EC6, 0xA4B2, + 0x4EC7, 0xA4B3, 0x4EC8, 0xC954, 0x4EC9, 0xC953, 0x4ECA, 0xA4B5, + 0x4ECB, 0xA4B6, 0x4ECD, 0xA4B4, 0x4ED4, 0xA54A, 0x4ED5, 0xA54B, + 0x4ED6, 0xA54C, 0x4ED7, 0xA54D, 0x4ED8, 0xA549, 0x4ED9, 0xA550, + 0x4EDA, 0xC96A, 0x4EDC, 0xC966, 0x4EDD, 0xC969, 0x4EDE, 0xA551, + 0x4EDF, 0xA561, 0x4EE1, 0xC968, 0x4EE3, 0xA54E, 0x4EE4, 0xA54F, + 0x4EE5, 0xA548, 0x4EE8, 0xC965, 0x4EE9, 0xC967, 0x4EF0, 0xA5F5, + 0x4EF1, 0xC9B0, 0x4EF2, 0xA5F2, 0x4EF3, 0xA5F6, 0x4EF4, 0xC9BA, + 0x4EF5, 0xC9AE, 0x4EF6, 0xA5F3, 0x4EF7, 0xC9B2, 0x4EFB, 0xA5F4, + 0x4EFD, 0xA5F7, 0x4EFF, 0xA5E9, 0x4F00, 0xC9B1, 0x4F01, 0xA5F8, + 0x4F02, 0xC9B5, 0x4F04, 0xC9B9, 0x4F05, 0xC9B6, 0x4F08, 0xC9B3, + 0x4F09, 0xA5EA, 0x4F0A, 0xA5EC, 0x4F0B, 0xA5F9, 0x4F0D, 0xA5EE, + 0x4F0E, 0xC9AB, 0x4F0F, 0xA5F1, 0x4F10, 0xA5EF, 0x4F11, 0xA5F0, + 0x4F12, 0xC9BB, 0x4F13, 0xC9B8, 0x4F14, 0xC9AF, 0x4F15, 0xA5ED, + 0x4F18, 0xC9AC, 0x4F19, 0xA5EB, 0x4F1D, 0xC9B4, 0x4F22, 0xC9B7, + 0x4F2C, 0xC9AD, 0x4F2D, 0xCA66, 0x4F2F, 0xA742, 0x4F30, 0xA6F4, + 0x4F33, 0xCA67, 0x4F34, 0xA6F1, 0x4F36, 0xA744, 0x4F38, 0xA6F9, + 0x4F3A, 0xA6F8, 0x4F3B, 0xCA5B, 0x4F3C, 0xA6FC, 0x4F3D, 0xA6F7, + 0x4F3E, 0xCA60, 0x4F3F, 0xCA68, 0x4F41, 0xCA64, 0x4F43, 0xA6FA, + 0x4F46, 0xA6FD, 0x4F47, 0xA6EE, 0x4F48, 0xA747, 0x4F49, 0xCA5D, + 0x4F4C, 0xCBBD, 0x4F4D, 0xA6EC, 0x4F4E, 0xA743, 0x4F4F, 0xA6ED, + 0x4F50, 0xA6F5, 0x4F51, 0xA6F6, 0x4F52, 0xCA62, 0x4F53, 0xCA5E, + 0x4F54, 0xA6FB, 0x4F55, 0xA6F3, 0x4F56, 0xCA5A, 0x4F57, 0xA6EF, + 0x4F58, 0xCA65, 0x4F59, 0xA745, 0x4F5A, 0xA748, 0x4F5B, 0xA6F2, + 0x4F5C, 0xA740, 0x4F5D, 0xA746, 0x4F5E, 0xA6F0, 0x4F5F, 0xCA63, + 0x4F60, 0xA741, 0x4F61, 0xCA69, 0x4F62, 0xCA5C, 0x4F63, 0xA6FE, + 0x4F64, 0xCA5F, 0x4F67, 0xCA61, 0x4F69, 0xA8D8, 0x4F6A, 0xCBBF, + 0x4F6B, 0xCBCB, 0x4F6C, 0xA8D0, 0x4F6E, 0xCBCC, 0x4F6F, 0xA8CB, + 0x4F70, 0xA8D5, 0x4F73, 0xA8CE, 0x4F74, 0xCBB9, 0x4F75, 0xA8D6, + 0x4F76, 0xCBB8, 0x4F77, 0xCBBC, 0x4F78, 0xCBC3, 0x4F79, 0xCBC1, + 0x4F7A, 0xA8DE, 0x4F7B, 0xA8D9, 0x4F7C, 0xCBB3, 0x4F7D, 0xCBB5, + 0x4F7E, 0xA8DB, 0x4F7F, 0xA8CF, 0x4F80, 0xCBB6, 0x4F81, 0xCBC2, + 0x4F82, 0xCBC9, 0x4F83, 0xA8D4, 0x4F84, 0xCBBB, 0x4F85, 0xCBB4, + 0x4F86, 0xA8D3, 0x4F87, 0xCBB7, 0x4F88, 0xA8D7, 0x4F89, 0xCBBA, + 0x4F8B, 0xA8D2, 0x4F8D, 0xA8CD, 0x4F8F, 0xA8DC, 0x4F90, 0xCBC4, + 0x4F91, 0xA8DD, 0x4F92, 0xCBC8, 0x4F94, 0xCBC6, 0x4F95, 0xCBCA, + 0x4F96, 0xA8DA, 0x4F97, 0xCBBE, 0x4F98, 0xCBB2, 0x4F9A, 0xCBC0, + 0x4F9B, 0xA8D1, 0x4F9C, 0xCBC5, 0x4F9D, 0xA8CC, 0x4F9E, 0xCBC7, + 0x4FAE, 0xAB56, 0x4FAF, 0xAB4A, 0x4FB2, 0xCDE0, 0x4FB3, 0xCDE8, + 0x4FB5, 0xAB49, 0x4FB6, 0xAB51, 0x4FB7, 0xAB5D, 0x4FB9, 0xCDEE, + 0x4FBA, 0xCDEC, 0x4FBB, 0xCDE7, 0x4FBF, 0xAB4B, 0x4FC0, 0xCDED, + 0x4FC1, 0xCDE3, 0x4FC2, 0xAB59, 0x4FC3, 0xAB50, 0x4FC4, 0xAB58, + 0x4FC5, 0xCDDE, 0x4FC7, 0xCDEA, 0x4FC9, 0xCDE1, 0x4FCA, 0xAB54, + 0x4FCB, 0xCDE2, 0x4FCD, 0xCDDD, 0x4FCE, 0xAB5B, 0x4FCF, 0xAB4E, + 0x4FD0, 0xAB57, 0x4FD1, 0xAB4D, 0x4FD3, 0xCDDF, 0x4FD4, 0xCDE4, + 0x4FD6, 0xCDEB, 0x4FD7, 0xAB55, 0x4FD8, 0xAB52, 0x4FD9, 0xCDE6, + 0x4FDA, 0xAB5A, 0x4FDB, 0xCDE9, 0x4FDC, 0xCDE5, 0x4FDD, 0xAB4F, + 0x4FDE, 0xAB5C, 0x4FDF, 0xAB53, 0x4FE0, 0xAB4C, 0x4FE1, 0xAB48, + 0x4FEC, 0xCDEF, 0x4FEE, 0xADD7, 0x4FEF, 0xADC1, 0x4FF1, 0xADD1, + 0x4FF3, 0xADD6, 0x4FF4, 0xD0D0, 0x4FF5, 0xD0CF, 0x4FF6, 0xD0D4, + 0x4FF7, 0xD0D5, 0x4FF8, 0xADC4, 0x4FFA, 0xADCD, 0x4FFE, 0xADDA, + 0x5000, 0xADCE, 0x5005, 0xD0C9, 0x5006, 0xADC7, 0x5007, 0xD0CA, + 0x5009, 0xADDC, 0x500B, 0xADD3, 0x500C, 0xADBE, 0x500D, 0xADBF, + 0x500E, 0xD0DD, 0x500F, 0xB0BF, 0x5011, 0xADCC, 0x5012, 0xADCB, + 0x5013, 0xD0CB, 0x5014, 0xADCF, 0x5015, 0xD45B, 0x5016, 0xADC6, + 0x5017, 0xD0D6, 0x5018, 0xADD5, 0x5019, 0xADD4, 0x501A, 0xADCA, + 0x501B, 0xD0CE, 0x501C, 0xD0D7, 0x501E, 0xD0C8, 0x501F, 0xADC9, + 0x5020, 0xD0D8, 0x5021, 0xADD2, 0x5022, 0xD0CC, 0x5023, 0xADC0, + 0x5025, 0xADC3, 0x5026, 0xADC2, 0x5027, 0xD0D9, 0x5028, 0xADD0, + 0x5029, 0xADC5, 0x502A, 0xADD9, 0x502B, 0xADDB, 0x502C, 0xD0D3, + 0x502D, 0xADD8, 0x502F, 0xD0DB, 0x5030, 0xD0CD, 0x5031, 0xD0DC, + 0x5033, 0xD0D1, 0x5035, 0xD0DA, 0x5037, 0xD0D2, 0x503C, 0xADC8, + 0x5040, 0xD463, 0x5041, 0xD457, 0x5043, 0xB0B3, 0x5045, 0xD45C, + 0x5046, 0xD462, 0x5047, 0xB0B2, 0x5048, 0xD455, 0x5049, 0xB0B6, + 0x504A, 0xD459, 0x504B, 0xD452, 0x504C, 0xB0B4, 0x504D, 0xD456, + 0x504E, 0xB0B9, 0x504F, 0xB0BE, 0x5051, 0xD467, 0x5053, 0xD451, + 0x5055, 0xB0BA, 0x5057, 0xD466, 0x505A, 0xB0B5, 0x505B, 0xD458, + 0x505C, 0xB0B1, 0x505D, 0xD453, 0x505E, 0xD44F, 0x505F, 0xD45D, + 0x5060, 0xD450, 0x5061, 0xD44E, 0x5062, 0xD45A, 0x5063, 0xD460, + 0x5064, 0xD461, 0x5065, 0xB0B7, 0x5068, 0xD85B, 0x5069, 0xD45E, + 0x506A, 0xD44D, 0x506B, 0xD45F, 0x506D, 0xB0C1, 0x506E, 0xD464, + 0x506F, 0xB0C0, 0x5070, 0xD44C, 0x5072, 0xD454, 0x5073, 0xD465, + 0x5074, 0xB0BC, 0x5075, 0xB0BB, 0x5076, 0xB0B8, 0x5077, 0xB0BD, + 0x507A, 0xB0AF, 0x507D, 0xB0B0, 0x5080, 0xB3C8, 0x5082, 0xD85E, + 0x5083, 0xD857, 0x5085, 0xB3C5, 0x5087, 0xD85F, 0x508B, 0xD855, + 0x508C, 0xD858, 0x508D, 0xB3C4, 0x508E, 0xD859, 0x5091, 0xB3C7, + 0x5092, 0xD85D, 0x5094, 0xD853, 0x5095, 0xD852, 0x5096, 0xB3C9, + 0x5098, 0xB3CA, 0x5099, 0xB3C6, 0x509A, 0xB3CB, 0x509B, 0xD851, + 0x509C, 0xD85C, 0x509D, 0xD85A, 0x509E, 0xD854, 0x50A2, 0xB3C3, + 0x50A3, 0xD856, 0x50AC, 0xB6CA, 0x50AD, 0xB6C4, 0x50AE, 0xDCB7, + 0x50AF, 0xB6CD, 0x50B0, 0xDCBD, 0x50B1, 0xDCC0, 0x50B2, 0xB6C6, + 0x50B3, 0xB6C7, 0x50B4, 0xDCBA, 0x50B5, 0xB6C5, 0x50B6, 0xDCC3, + 0x50B7, 0xB6CB, 0x50B8, 0xDCC4, 0x50BA, 0xDCBF, 0x50BB, 0xB6CC, + 0x50BD, 0xDCB4, 0x50BE, 0xB6C9, 0x50BF, 0xDCB5, 0x50C1, 0xDCBE, + 0x50C2, 0xDCBC, 0x50C4, 0xDCB8, 0x50C5, 0xB6C8, 0x50C6, 0xDCB6, + 0x50C7, 0xB6CE, 0x50C8, 0xDCBB, 0x50C9, 0xDCC2, 0x50CA, 0xDCB9, + 0x50CB, 0xDCC1, 0x50CE, 0xB9B6, 0x50CF, 0xB9B3, 0x50D1, 0xB9B4, + 0x50D3, 0xE0F9, 0x50D4, 0xE0F1, 0x50D5, 0xB9B2, 0x50D6, 0xB9AF, + 0x50D7, 0xE0F2, 0x50DA, 0xB9B1, 0x50DB, 0xE0F5, 0x50DD, 0xE0F7, + 0x50E0, 0xE0FE, 0x50E3, 0xE0FD, 0x50E4, 0xE0F8, 0x50E5, 0xB9AE, + 0x50E6, 0xE0F0, 0x50E7, 0xB9AC, 0x50E8, 0xE0F3, 0x50E9, 0xB9B7, + 0x50EA, 0xE0F6, 0x50EC, 0xE0FA, 0x50ED, 0xB9B0, 0x50EE, 0xB9AD, + 0x50EF, 0xE0FC, 0x50F0, 0xE0FB, 0x50F1, 0xB9B5, 0x50F3, 0xE0F4, + 0x50F5, 0xBBF8, 0x50F6, 0xE4EC, 0x50F8, 0xE4E9, 0x50F9, 0xBBF9, + 0x50FB, 0xBBF7, 0x50FD, 0xE4F0, 0x50FE, 0xE4ED, 0x50FF, 0xE4E6, + 0x5100, 0xBBF6, 0x5102, 0xBBFA, 0x5103, 0xE4E7, 0x5104, 0xBBF5, + 0x5105, 0xBBFD, 0x5106, 0xE4EA, 0x5107, 0xE4EB, 0x5108, 0xBBFB, + 0x5109, 0xBBFC, 0x510A, 0xE4F1, 0x510B, 0xE4EE, 0x510C, 0xE4EF, + 0x5110, 0xBEAA, 0x5111, 0xE8F8, 0x5112, 0xBEA7, 0x5113, 0xE8F5, + 0x5114, 0xBEA9, 0x5115, 0xBEAB, 0x5117, 0xE8F6, 0x5118, 0xBEA8, + 0x511A, 0xE8F7, 0x511C, 0xE8F4, 0x511F, 0xC076, 0x5120, 0xECBD, + 0x5121, 0xC077, 0x5122, 0xECBB, 0x5124, 0xECBC, 0x5125, 0xECBA, + 0x5126, 0xECB9, 0x5129, 0xECBE, 0x512A, 0xC075, 0x512D, 0xEFB8, + 0x512E, 0xEFB9, 0x5130, 0xE4E8, 0x5131, 0xEFB7, 0x5132, 0xC078, + 0x5133, 0xC35F, 0x5134, 0xF1EB, 0x5135, 0xF1EC, 0x5137, 0xC4D7, + 0x5138, 0xC4D8, 0x5139, 0xF5C1, 0x513A, 0xF5C0, 0x513B, 0xC56C, + 0x513C, 0xC56B, 0x513D, 0xF7D0, 0x513F, 0xA449, 0x5140, 0xA461, + 0x5141, 0xA4B9, 0x5143, 0xA4B8, 0x5144, 0xA553, 0x5145, 0xA552, + 0x5146, 0xA5FC, 0x5147, 0xA5FB, 0x5148, 0xA5FD, 0x5149, 0xA5FA, + 0x514B, 0xA74A, 0x514C, 0xA749, 0x514D, 0xA74B, 0x5152, 0xA8E0, + 0x5154, 0xA8DF, 0x5155, 0xA8E1, 0x5157, 0xAB5E, 0x5159, 0xA259, + 0x515A, 0xD0DE, 0x515B, 0xA25A, 0x515C, 0xB0C2, 0x515D, 0xA25C, + 0x515E, 0xA25B, 0x515F, 0xD860, 0x5161, 0xA25D, 0x5162, 0xB9B8, + 0x5163, 0xA25E, 0x5165, 0xA44A, 0x5167, 0xA4BA, 0x5168, 0xA5FE, + 0x5169, 0xA8E2, 0x516B, 0xA44B, 0x516C, 0xA4BD, 0x516D, 0xA4BB, + 0x516E, 0xA4BC, 0x5171, 0xA640, 0x5175, 0xA74C, 0x5176, 0xA8E4, + 0x5177, 0xA8E3, 0x5178, 0xA8E5, 0x517C, 0xADDD, 0x5180, 0xBEAC, + 0x5187, 0xC94E, 0x5189, 0xA554, 0x518A, 0xA555, 0x518D, 0xA641, + 0x518F, 0xCA6A, 0x5191, 0xAB60, 0x5192, 0xAB5F, 0x5193, 0xD0E0, + 0x5194, 0xD0DF, 0x5195, 0xB0C3, 0x5197, 0xA4BE, 0x5198, 0xC955, + 0x519E, 0xCBCD, 0x51A0, 0xAB61, 0x51A2, 0xADE0, 0x51A4, 0xADDE, + 0x51A5, 0xADDF, 0x51AA, 0xBEAD, 0x51AC, 0xA556, 0x51B0, 0xA642, + 0x51B1, 0xC9BC, 0x51B6, 0xA74D, 0x51B7, 0xA74E, 0x51B9, 0xCA6B, + 0x51BC, 0xCBCE, 0x51BD, 0xA8E6, 0x51BE, 0xCBCF, 0x51C4, 0xD0E2, + 0x51C5, 0xD0E3, 0x51C6, 0xADE3, 0x51C8, 0xD0E4, 0x51CA, 0xD0E1, + 0x51CB, 0xADE4, 0x51CC, 0xADE2, 0x51CD, 0xADE1, 0x51CE, 0xD0E5, + 0x51D0, 0xD468, 0x51D4, 0xD861, 0x51D7, 0xDCC5, 0x51D8, 0xE140, + 0x51DC, 0xBBFE, 0x51DD, 0xBEAE, 0x51DE, 0xE8F9, 0x51E0, 0xA44C, + 0x51E1, 0xA45A, 0x51F0, 0xB0C4, 0x51F1, 0xB3CD, 0x51F3, 0xB9B9, + 0x51F5, 0xC942, 0x51F6, 0xA4BF, 0x51F8, 0xA559, 0x51F9, 0xA557, + 0x51FA, 0xA558, 0x51FD, 0xA8E7, 0x5200, 0xA44D, 0x5201, 0xA44E, + 0x5203, 0xA462, 0x5206, 0xA4C0, 0x5207, 0xA4C1, 0x5208, 0xA4C2, + 0x5209, 0xC9BE, 0x520A, 0xA55A, 0x520C, 0xC96B, 0x520E, 0xA646, + 0x5210, 0xC9BF, 0x5211, 0xA644, 0x5212, 0xA645, 0x5213, 0xC9BD, + 0x5216, 0xA647, 0x5217, 0xA643, 0x521C, 0xCA6C, 0x521D, 0xAAEC, + 0x521E, 0xCA6D, 0x5221, 0xCA6E, 0x5224, 0xA750, 0x5225, 0xA74F, + 0x5228, 0xA753, 0x5229, 0xA751, 0x522A, 0xA752, 0x522E, 0xA8ED, + 0x5230, 0xA8EC, 0x5231, 0xCBD4, 0x5232, 0xCBD1, 0x5233, 0xCBD2, + 0x5235, 0xCBD0, 0x5236, 0xA8EE, 0x5237, 0xA8EA, 0x5238, 0xA8E9, + 0x523A, 0xA8EB, 0x523B, 0xA8E8, 0x5241, 0xA8EF, 0x5243, 0xAB63, + 0x5244, 0xCDF0, 0x5246, 0xCBD3, 0x5247, 0xAB68, 0x5249, 0xCDF1, + 0x524A, 0xAB64, 0x524B, 0xAB67, 0x524C, 0xAB66, 0x524D, 0xAB65, + 0x524E, 0xAB62, 0x5252, 0xD0E8, 0x5254, 0xADE7, 0x5255, 0xD0EB, + 0x5256, 0xADE5, 0x525A, 0xD0E7, 0x525B, 0xADE8, 0x525C, 0xADE6, + 0x525D, 0xADE9, 0x525E, 0xD0E9, 0x525F, 0xD0EA, 0x5261, 0xD0E6, + 0x5262, 0xD0EC, 0x5269, 0xB3D1, 0x526A, 0xB0C5, 0x526B, 0xD469, + 0x526C, 0xD46B, 0x526D, 0xD46A, 0x526E, 0xD46C, 0x526F, 0xB0C6, + 0x5272, 0xB3CE, 0x5274, 0xB3CF, 0x5275, 0xB3D0, 0x5277, 0xB6D0, + 0x5278, 0xDCC7, 0x527A, 0xDCC6, 0x527B, 0xDCC8, 0x527C, 0xDCC9, + 0x527D, 0xB6D1, 0x527F, 0xB6CF, 0x5280, 0xE141, 0x5281, 0xE142, + 0x5282, 0xB9BB, 0x5283, 0xB9BA, 0x5284, 0xE35A, 0x5287, 0xBC40, + 0x5288, 0xBC41, 0x5289, 0xBC42, 0x528A, 0xBC44, 0x528B, 0xE4F2, + 0x528C, 0xE4F3, 0x528D, 0xBC43, 0x5291, 0xBEAF, 0x5293, 0xBEB0, + 0x5296, 0xF1ED, 0x5297, 0xF5C3, 0x5298, 0xF5C2, 0x5299, 0xF7D1, + 0x529B, 0xA44F, 0x529F, 0xA55C, 0x52A0, 0xA55B, 0x52A3, 0xA648, + 0x52A6, 0xC9C0, 0x52A9, 0xA755, 0x52AA, 0xA756, 0x52AB, 0xA754, + 0x52AC, 0xA757, 0x52AD, 0xCA6F, 0x52AE, 0xCA70, 0x52BB, 0xA8F1, + 0x52BC, 0xCBD5, 0x52BE, 0xA8F0, 0x52C0, 0xCDF2, 0x52C1, 0xAB6C, + 0x52C2, 0xCDF3, 0x52C3, 0xAB6B, 0x52C7, 0xAB69, 0x52C9, 0xAB6A, + 0x52CD, 0xD0ED, 0x52D2, 0xB0C7, 0x52D3, 0xD46E, 0x52D5, 0xB0CA, + 0x52D6, 0xD46D, 0x52D7, 0xB1E5, 0x52D8, 0xB0C9, 0x52D9, 0xB0C8, + 0x52DB, 0xB3D4, 0x52DD, 0xB3D3, 0x52DE, 0xB3D2, 0x52DF, 0xB6D2, + 0x52E2, 0xB6D5, 0x52E3, 0xB6D6, 0x52E4, 0xB6D4, 0x52E6, 0xB6D3, + 0x52E9, 0xE143, 0x52EB, 0xE144, 0x52EF, 0xE4F5, 0x52F0, 0xBC45, + 0x52F1, 0xE4F4, 0x52F3, 0xBEB1, 0x52F4, 0xECBF, 0x52F5, 0xC079, + 0x52F7, 0xF1EE, 0x52F8, 0xC455, 0x52FA, 0xA463, 0x52FB, 0xA4C3, + 0x52FC, 0xC956, 0x52FE, 0xA4C4, 0x52FF, 0xA4C5, 0x5305, 0xA55D, + 0x5306, 0xA55E, 0x5308, 0xA649, 0x5309, 0xCA71, 0x530A, 0xCBD6, + 0x530B, 0xCBD7, 0x530D, 0xAB6D, 0x530E, 0xD0EE, 0x530F, 0xB0CC, + 0x5310, 0xB0CB, 0x5311, 0xD863, 0x5312, 0xD862, 0x5315, 0xA450, + 0x5316, 0xA4C6, 0x5317, 0xA55F, 0x5319, 0xB0CD, 0x531A, 0xC943, + 0x531C, 0xC96C, 0x531D, 0xA560, 0x531F, 0xC9C2, 0x5320, 0xA64B, + 0x5321, 0xA64A, 0x5322, 0xC9C1, 0x5323, 0xA758, 0x532A, 0xADEA, + 0x532D, 0xD46F, 0x532F, 0xB6D7, 0x5330, 0xE145, 0x5331, 0xB9BC, + 0x5334, 0xE8FA, 0x5337, 0xF3FD, 0x5339, 0xA4C7, 0x533C, 0xCBD8, + 0x533D, 0xCDF4, 0x533E, 0xB0D0, 0x533F, 0xB0CE, 0x5340, 0xB0CF, + 0x5341, 0xA2CC, 0x5341, 0xA451, 0x5343, 0xA464, 0x5344, 0xA2CD, + 0x5345, 0xA2CE, 0x5345, 0xA4CA, 0x5347, 0xA4C9, 0x5348, 0xA4C8, + 0x5349, 0xA563, 0x534A, 0xA562, 0x534C, 0xC96D, 0x534D, 0xC9C3, + 0x5351, 0xA8F5, 0x5352, 0xA8F2, 0x5353, 0xA8F4, 0x5354, 0xA8F3, + 0x5357, 0xAB6E, 0x535A, 0xB3D5, 0x535C, 0xA452, 0x535E, 0xA4CB, + 0x5360, 0xA565, 0x5361, 0xA564, 0x5363, 0xCA72, 0x5366, 0xA8F6, + 0x536C, 0xC957, 0x536E, 0xA567, 0x536F, 0xA566, 0x5370, 0xA64C, + 0x5371, 0xA64D, 0x5372, 0xCA73, 0x5373, 0xA759, 0x5375, 0xA75A, + 0x5377, 0xA8F7, 0x5378, 0xA8F8, 0x5379, 0xA8F9, 0x537B, 0xAB6F, + 0x537C, 0xCDF5, 0x537F, 0xADEB, 0x5382, 0xC944, 0x5384, 0xA4CC, + 0x538A, 0xC9C4, 0x538E, 0xCA74, 0x538F, 0xCA75, 0x5392, 0xCBD9, + 0x5394, 0xCBDA, 0x5396, 0xCDF7, 0x5397, 0xCDF6, 0x5398, 0xCDF9, + 0x5399, 0xCDF8, 0x539A, 0xAB70, 0x539C, 0xD470, 0x539D, 0xADED, + 0x539E, 0xD0EF, 0x539F, 0xADEC, 0x53A4, 0xD864, 0x53A5, 0xB3D6, + 0x53A7, 0xD865, 0x53AC, 0xE146, 0x53AD, 0xB9BD, 0x53B2, 0xBC46, + 0x53B4, 0xF1EF, 0x53B9, 0xC958, 0x53BB, 0xA568, 0x53C3, 0xB0D1, + 0x53C8, 0xA453, 0x53C9, 0xA465, 0x53CA, 0xA4CE, 0x53CB, 0xA4CD, + 0x53CD, 0xA4CF, 0x53D4, 0xA8FB, 0x53D6, 0xA8FA, 0x53D7, 0xA8FC, + 0x53DB, 0xAB71, 0x53DF, 0xADEE, 0x53E1, 0xE8FB, 0x53E2, 0xC24F, + 0x53E3, 0xA466, 0x53E4, 0xA56A, 0x53E5, 0xA579, 0x53E6, 0xA574, + 0x53E8, 0xA56F, 0x53E9, 0xA56E, 0x53EA, 0xA575, 0x53EB, 0xA573, + 0x53EC, 0xA56C, 0x53ED, 0xA57A, 0x53EE, 0xA56D, 0x53EF, 0xA569, + 0x53F0, 0xA578, 0x53F1, 0xA577, 0x53F2, 0xA576, 0x53F3, 0xA56B, + 0x53F5, 0xA572, 0x53F8, 0xA571, 0x53FB, 0xA57B, 0x53FC, 0xA570, + 0x5401, 0xA653, 0x5403, 0xA659, 0x5404, 0xA655, 0x5406, 0xA65B, + 0x5407, 0xC9C5, 0x5408, 0xA658, 0x5409, 0xA64E, 0x540A, 0xA651, + 0x540B, 0xA654, 0x540C, 0xA650, 0x540D, 0xA657, 0x540E, 0xA65A, + 0x540F, 0xA64F, 0x5410, 0xA652, 0x5411, 0xA656, 0x5412, 0xA65C, + 0x5418, 0xCA7E, 0x5419, 0xCA7B, 0x541B, 0xA767, 0x541C, 0xCA7C, + 0x541D, 0xA75B, 0x541E, 0xA75D, 0x541F, 0xA775, 0x5420, 0xA770, + 0x5424, 0xCAA5, 0x5425, 0xCA7D, 0x5426, 0xA75F, 0x5427, 0xA761, + 0x5428, 0xCAA4, 0x5429, 0xA768, 0x542A, 0xCA78, 0x542B, 0xA774, + 0x542C, 0xA776, 0x542D, 0xA75C, 0x542E, 0xA76D, 0x5430, 0xCA76, + 0x5431, 0xA773, 0x5433, 0xA764, 0x5435, 0xA76E, 0x5436, 0xA76F, + 0x5437, 0xCA77, 0x5438, 0xA76C, 0x5439, 0xA76A, 0x543B, 0xA76B, + 0x543C, 0xA771, 0x543D, 0xCAA1, 0x543E, 0xA75E, 0x5440, 0xA772, + 0x5441, 0xCAA3, 0x5442, 0xA766, 0x5443, 0xA763, 0x5445, 0xCA7A, + 0x5446, 0xA762, 0x5447, 0xCAA6, 0x5448, 0xA765, 0x544A, 0xA769, + 0x544E, 0xA760, 0x544F, 0xCAA2, 0x5454, 0xCA79, 0x5460, 0xCBEB, + 0x5461, 0xCBEA, 0x5462, 0xA94F, 0x5463, 0xCBED, 0x5464, 0xCBEF, + 0x5465, 0xCBE4, 0x5466, 0xCBE7, 0x5467, 0xCBEE, 0x5468, 0xA950, + 0x546B, 0xCBE1, 0x546C, 0xCBE5, 0x546F, 0xCBE9, 0x5470, 0xCE49, + 0x5471, 0xA94B, 0x5472, 0xCE4D, 0x5473, 0xA8FD, 0x5474, 0xCBE6, + 0x5475, 0xA8FE, 0x5476, 0xA94C, 0x5477, 0xA945, 0x5478, 0xA941, + 0x547A, 0xCBE2, 0x547B, 0xA944, 0x547C, 0xA949, 0x547D, 0xA952, + 0x547E, 0xCBE3, 0x547F, 0xCBDC, 0x5480, 0xA943, 0x5481, 0xCBDD, + 0x5482, 0xCBDF, 0x5484, 0xA946, 0x5486, 0xA948, 0x5487, 0xCBDB, + 0x5488, 0xCBE0, 0x548B, 0xA951, 0x548C, 0xA94D, 0x548D, 0xCBE8, + 0x548E, 0xA953, 0x5490, 0xA94A, 0x5491, 0xCBDE, 0x5492, 0xA947, + 0x5495, 0xA942, 0x5496, 0xA940, 0x5498, 0xCBEC, 0x549A, 0xA94E, + 0x54A0, 0xCE48, 0x54A1, 0xCDFB, 0x54A2, 0xCE4B, 0x54A5, 0xCDFD, + 0x54A6, 0xAB78, 0x54A7, 0xABA8, 0x54A8, 0xAB74, 0x54A9, 0xABA7, + 0x54AA, 0xAB7D, 0x54AB, 0xABA4, 0x54AC, 0xAB72, 0x54AD, 0xCDFC, + 0x54AE, 0xCE43, 0x54AF, 0xABA3, 0x54B0, 0xCE4F, 0x54B1, 0xABA5, + 0x54B3, 0xAB79, 0x54B6, 0xCE45, 0x54B7, 0xCE42, 0x54B8, 0xAB77, + 0x54BA, 0xCDFA, 0x54BB, 0xABA6, 0x54BC, 0xCE4A, 0x54BD, 0xAB7C, + 0x54BE, 0xCE4C, 0x54BF, 0xABA9, 0x54C0, 0xAB73, 0x54C1, 0xAB7E, + 0x54C2, 0xAB7B, 0x54C3, 0xCE40, 0x54C4, 0xABA1, 0x54C5, 0xCE46, + 0x54C6, 0xCE47, 0x54C7, 0xAB7A, 0x54C8, 0xABA2, 0x54C9, 0xAB76, + 0x54CE, 0xAB75, 0x54CF, 0xCDFE, 0x54D6, 0xCE44, 0x54DE, 0xCE4E, + 0x54E0, 0xD144, 0x54E1, 0xADFB, 0x54E2, 0xD0F1, 0x54E4, 0xD0F6, + 0x54E5, 0xADF4, 0x54E6, 0xAE40, 0x54E7, 0xD0F4, 0x54E8, 0xADEF, + 0x54E9, 0xADF9, 0x54EA, 0xADFE, 0x54EB, 0xD0FB, 0x54ED, 0xADFA, + 0x54EE, 0xADFD, 0x54F1, 0xD0FE, 0x54F2, 0xADF5, 0x54F3, 0xD0F5, + 0x54F7, 0xD142, 0x54F8, 0xD143, 0x54FA, 0xADF7, 0x54FB, 0xD141, + 0x54FC, 0xADF3, 0x54FD, 0xAE43, 0x54FF, 0xD0F8, 0x5501, 0xADF1, + 0x5503, 0xD146, 0x5504, 0xD0F9, 0x5505, 0xD0FD, 0x5506, 0xADF6, + 0x5507, 0xAE42, 0x5508, 0xD0FA, 0x5509, 0xADFC, 0x550A, 0xD140, + 0x550B, 0xD147, 0x550C, 0xD4A1, 0x550E, 0xD145, 0x550F, 0xAE44, + 0x5510, 0xADF0, 0x5511, 0xD0FC, 0x5512, 0xD0F3, 0x5514, 0xADF8, + 0x5517, 0xD0F2, 0x551A, 0xD0F7, 0x5526, 0xD0F0, 0x5527, 0xAE41, + 0x552A, 0xD477, 0x552C, 0xB0E4, 0x552D, 0xD4A7, 0x552E, 0xB0E2, + 0x552F, 0xB0DF, 0x5530, 0xD47C, 0x5531, 0xB0DB, 0x5532, 0xD4A2, + 0x5533, 0xB0E6, 0x5534, 0xD476, 0x5535, 0xD47B, 0x5536, 0xD47A, + 0x5537, 0xADF2, 0x5538, 0xB0E1, 0x5539, 0xD4A5, 0x553B, 0xD4A8, + 0x553C, 0xD473, 0x553E, 0xB3E8, 0x5540, 0xD4A9, 0x5541, 0xB0E7, + 0x5543, 0xB0D9, 0x5544, 0xB0D6, 0x5545, 0xD47E, 0x5546, 0xB0D3, + 0x5548, 0xD4A6, 0x554A, 0xB0DA, 0x554B, 0xD4AA, 0x554D, 0xD474, + 0x554E, 0xD4A4, 0x554F, 0xB0DD, 0x5550, 0xD475, 0x5551, 0xD478, + 0x5552, 0xD47D, 0x5555, 0xB0DE, 0x5556, 0xB0DC, 0x5557, 0xB0E8, + 0x555C, 0xB0E3, 0x555E, 0xB0D7, 0x555F, 0xB1D2, 0x5561, 0xB0D8, + 0x5562, 0xD479, 0x5563, 0xB0E5, 0x5564, 0xB0E0, 0x5565, 0xD4A3, + 0x5566, 0xB0D5, 0x556A, 0xB0D4, 0x5575, 0xD471, 0x5576, 0xD472, + 0x5577, 0xD86A, 0x557B, 0xB3D7, 0x557C, 0xB3DA, 0x557D, 0xD875, + 0x557E, 0xB3EE, 0x557F, 0xD878, 0x5580, 0xB3D8, 0x5581, 0xD871, + 0x5582, 0xB3DE, 0x5583, 0xB3E4, 0x5584, 0xB5BD, 0x5587, 0xB3E2, + 0x5588, 0xD86E, 0x5589, 0xB3EF, 0x558A, 0xB3DB, 0x558B, 0xB3E3, + 0x558C, 0xD876, 0x558D, 0xDCD7, 0x558E, 0xD87B, 0x558F, 0xD86F, + 0x5591, 0xD866, 0x5592, 0xD873, 0x5593, 0xD86D, 0x5594, 0xB3E1, + 0x5595, 0xD879, 0x5598, 0xB3DD, 0x5599, 0xB3F1, 0x559A, 0xB3EA, + 0x559C, 0xB3DF, 0x559D, 0xB3DC, 0x559F, 0xB3E7, 0x55A1, 0xD87A, + 0x55A2, 0xD86C, 0x55A3, 0xD872, 0x55A4, 0xD874, 0x55A5, 0xD868, + 0x55A6, 0xD877, 0x55A7, 0xB3D9, 0x55A8, 0xD867, 0x55AA, 0xB3E0, + 0x55AB, 0xB3F0, 0x55AC, 0xB3EC, 0x55AD, 0xD869, 0x55AE, 0xB3E6, + 0x55B1, 0xB3ED, 0x55B2, 0xB3E9, 0x55B3, 0xB3E5, 0x55B5, 0xD870, + 0x55BB, 0xB3EB, 0x55BF, 0xDCD5, 0x55C0, 0xDCD1, 0x55C2, 0xDCE0, + 0x55C3, 0xDCCA, 0x55C4, 0xDCD3, 0x55C5, 0xB6E5, 0x55C6, 0xB6E6, + 0x55C7, 0xB6DE, 0x55C8, 0xDCDC, 0x55C9, 0xB6E8, 0x55CA, 0xDCCF, + 0x55CB, 0xDCCE, 0x55CC, 0xDCCC, 0x55CD, 0xDCDE, 0x55CE, 0xB6DC, + 0x55CF, 0xDCD8, 0x55D0, 0xDCCD, 0x55D1, 0xB6DF, 0x55D2, 0xDCD6, + 0x55D3, 0xB6DA, 0x55D4, 0xDCD2, 0x55D5, 0xDCD9, 0x55D6, 0xDCDB, + 0x55D9, 0xDCDF, 0x55DA, 0xB6E3, 0x55DB, 0xDCCB, 0x55DC, 0xB6DD, + 0x55DD, 0xDCD0, 0x55DF, 0xB6D8, 0x55E1, 0xB6E4, 0x55E2, 0xDCDA, + 0x55E3, 0xB6E0, 0x55E4, 0xB6E1, 0x55E5, 0xB6E7, 0x55E6, 0xB6DB, + 0x55E7, 0xA25F, 0x55E8, 0xB6D9, 0x55E9, 0xDCD4, 0x55EF, 0xB6E2, + 0x55F2, 0xDCDD, 0x55F6, 0xB9CD, 0x55F7, 0xB9C8, 0x55F9, 0xE155, + 0x55FA, 0xE151, 0x55FC, 0xE14B, 0x55FD, 0xB9C2, 0x55FE, 0xB9BE, + 0x55FF, 0xE154, 0x5600, 0xB9BF, 0x5601, 0xE14E, 0x5602, 0xE150, + 0x5604, 0xE153, 0x5606, 0xB9C4, 0x5608, 0xB9CB, 0x5609, 0xB9C5, + 0x560C, 0xE149, 0x560D, 0xB9C6, 0x560E, 0xB9C7, 0x560F, 0xE14C, + 0x5610, 0xB9CC, 0x5612, 0xE14A, 0x5613, 0xE14F, 0x5614, 0xB9C3, + 0x5615, 0xE148, 0x5616, 0xB9C9, 0x5617, 0xB9C1, 0x561B, 0xB9C0, + 0x561C, 0xE14D, 0x561D, 0xE152, 0x561F, 0xB9CA, 0x5627, 0xE147, + 0x5629, 0xBC4D, 0x562A, 0xE547, 0x562C, 0xE544, 0x562E, 0xBC47, + 0x562F, 0xBC53, 0x5630, 0xBC54, 0x5632, 0xBC4A, 0x5633, 0xE542, + 0x5634, 0xBC4C, 0x5635, 0xE4F9, 0x5636, 0xBC52, 0x5638, 0xE546, + 0x5639, 0xBC49, 0x563A, 0xE548, 0x563B, 0xBC48, 0x563D, 0xE543, + 0x563E, 0xE545, 0x563F, 0xBC4B, 0x5640, 0xE541, 0x5641, 0xE4FA, + 0x5642, 0xE4F7, 0x5645, 0xD86B, 0x5646, 0xE4FD, 0x5648, 0xE4F6, + 0x5649, 0xE4FC, 0x564A, 0xE4FB, 0x564C, 0xE4F8, 0x564E, 0xBC4F, + 0x5653, 0xBC4E, 0x5657, 0xBC50, 0x5658, 0xE4FE, 0x5659, 0xBEB2, + 0x565A, 0xE540, 0x565E, 0xE945, 0x5660, 0xE8FD, 0x5662, 0xBEBE, + 0x5663, 0xE942, 0x5664, 0xBEB6, 0x5665, 0xBEBA, 0x5666, 0xE941, + 0x5668, 0xBEB9, 0x5669, 0xBEB5, 0x566A, 0xBEB8, 0x566B, 0xBEB3, + 0x566C, 0xBEBD, 0x566D, 0xE943, 0x566E, 0xE8FE, 0x566F, 0xBEBC, + 0x5670, 0xE8FC, 0x5671, 0xBEBB, 0x5672, 0xE944, 0x5673, 0xE940, + 0x5674, 0xBC51, 0x5676, 0xBEBF, 0x5677, 0xE946, 0x5678, 0xBEB7, + 0x5679, 0xBEB4, 0x567E, 0xECC6, 0x567F, 0xECC8, 0x5680, 0xC07B, + 0x5681, 0xECC9, 0x5682, 0xECC7, 0x5683, 0xECC5, 0x5684, 0xECC4, + 0x5685, 0xC07D, 0x5686, 0xECC3, 0x5687, 0xC07E, 0x568C, 0xECC1, + 0x568D, 0xECC2, 0x568E, 0xC07A, 0x568F, 0xC0A1, 0x5690, 0xC07C, + 0x5693, 0xECC0, 0x5695, 0xC250, 0x5697, 0xEFBC, 0x5698, 0xEFBA, + 0x5699, 0xEFBF, 0x569A, 0xEFBD, 0x569C, 0xEFBB, 0x569D, 0xEFBE, + 0x56A5, 0xC360, 0x56A6, 0xF1F2, 0x56A7, 0xF1F3, 0x56A8, 0xC456, + 0x56AA, 0xF1F4, 0x56AB, 0xF1F0, 0x56AC, 0xF1F5, 0x56AD, 0xF1F1, + 0x56AE, 0xC251, 0x56B2, 0xF3FE, 0x56B3, 0xF441, 0x56B4, 0xC459, + 0x56B5, 0xF440, 0x56B6, 0xC458, 0x56B7, 0xC457, 0x56BC, 0xC45A, + 0x56BD, 0xF5C5, 0x56BE, 0xF5C6, 0x56C0, 0xC4DA, 0x56C1, 0xC4D9, + 0x56C2, 0xC4DB, 0x56C3, 0xF5C4, 0x56C5, 0xF6D8, 0x56C6, 0xF6D7, + 0x56C8, 0xC56D, 0x56C9, 0xC56F, 0x56CA, 0xC56E, 0x56CB, 0xF6D9, + 0x56CC, 0xC5C8, 0x56CD, 0xF8A6, 0x56D1, 0xC5F1, 0x56D3, 0xF8A5, + 0x56D4, 0xF8EE, 0x56D7, 0xC949, 0x56DA, 0xA57D, 0x56DB, 0xA57C, + 0x56DD, 0xA65F, 0x56DE, 0xA65E, 0x56DF, 0xC9C7, 0x56E0, 0xA65D, + 0x56E1, 0xC9C6, 0x56E4, 0xA779, 0x56E5, 0xCAA9, 0x56E7, 0xCAA8, + 0x56EA, 0xA777, 0x56EB, 0xA77A, 0x56EE, 0xCAA7, 0x56F0, 0xA778, + 0x56F7, 0xCBF0, 0x56F9, 0xCBF1, 0x56FA, 0xA954, 0x56FF, 0xABAA, + 0x5701, 0xD148, 0x5702, 0xD149, 0x5703, 0xAE45, 0x5704, 0xAE46, + 0x5707, 0xD4AC, 0x5708, 0xB0E9, 0x5709, 0xB0EB, 0x570A, 0xD4AB, + 0x570B, 0xB0EA, 0x570C, 0xD87C, 0x570D, 0xB3F2, 0x5712, 0xB6E9, + 0x5713, 0xB6EA, 0x5714, 0xDCE1, 0x5716, 0xB9CF, 0x5718, 0xB9CE, + 0x571A, 0xE549, 0x571B, 0xE948, 0x571C, 0xE947, 0x571E, 0xF96B, + 0x571F, 0xA467, 0x5720, 0xC959, 0x5722, 0xC96E, 0x5723, 0xC96F, + 0x5728, 0xA662, 0x5729, 0xA666, 0x572A, 0xC9C9, 0x572C, 0xA664, + 0x572D, 0xA663, 0x572E, 0xC9C8, 0x572F, 0xA665, 0x5730, 0xA661, + 0x5733, 0xA660, 0x5734, 0xC9CA, 0x573B, 0xA7A6, 0x573E, 0xA7A3, + 0x5740, 0xA77D, 0x5741, 0xCAAA, 0x5745, 0xCAAB, 0x5747, 0xA7A1, + 0x5749, 0xCAAD, 0x574A, 0xA77B, 0x574B, 0xCAAE, 0x574C, 0xCAAC, + 0x574D, 0xA77E, 0x574E, 0xA7A2, 0x574F, 0xA7A5, 0x5750, 0xA7A4, + 0x5751, 0xA77C, 0x5752, 0xCAAF, 0x5761, 0xA959, 0x5762, 0xCBFE, + 0x5764, 0xA95B, 0x5766, 0xA95A, 0x5768, 0xCC40, 0x5769, 0xA958, + 0x576A, 0xA957, 0x576B, 0xCBF5, 0x576D, 0xCBF4, 0x576F, 0xCBF2, + 0x5770, 0xCBF7, 0x5771, 0xCBF6, 0x5772, 0xCBF3, 0x5773, 0xCBFC, + 0x5774, 0xCBFD, 0x5775, 0xCBFA, 0x5776, 0xCBF8, 0x5777, 0xA956, + 0x577B, 0xCBFB, 0x577C, 0xA95C, 0x577D, 0xCC41, 0x5780, 0xCBF9, + 0x5782, 0xABAB, 0x5783, 0xA955, 0x578B, 0xABAC, 0x578C, 0xCE54, + 0x578F, 0xCE5A, 0x5793, 0xABB2, 0x5794, 0xCE58, 0x5795, 0xCE5E, + 0x5797, 0xCE55, 0x5798, 0xCE59, 0x5799, 0xCE5B, 0x579A, 0xCE5D, + 0x579B, 0xCE57, 0x579D, 0xCE56, 0x579E, 0xCE51, 0x579F, 0xCE52, + 0x57A0, 0xABAD, 0x57A2, 0xABAF, 0x57A3, 0xABAE, 0x57A4, 0xCE53, + 0x57A5, 0xCE5C, 0x57AE, 0xABB1, 0x57B5, 0xCE50, 0x57B6, 0xD153, + 0x57B8, 0xD152, 0x57B9, 0xD157, 0x57BA, 0xD14E, 0x57BC, 0xD151, + 0x57BD, 0xD150, 0x57BF, 0xD154, 0x57C1, 0xD158, 0x57C2, 0xAE47, + 0x57C3, 0xAE4A, 0x57C6, 0xD14F, 0x57C7, 0xD155, 0x57CB, 0xAE49, + 0x57CC, 0xD14A, 0x57CE, 0xABB0, 0x57CF, 0xD4BA, 0x57D0, 0xD156, + 0x57D2, 0xD14D, 0x57D4, 0xAE48, 0x57D5, 0xD14C, 0x57DC, 0xD4B1, + 0x57DF, 0xB0EC, 0x57E0, 0xB0F0, 0x57E1, 0xD4C1, 0x57E2, 0xD4AF, + 0x57E3, 0xD4BD, 0x57E4, 0xB0F1, 0x57E5, 0xD4BF, 0x57E7, 0xD4C5, + 0x57E9, 0xD4C9, 0x57EC, 0xD4C0, 0x57ED, 0xD4B4, 0x57EE, 0xD4BC, + 0x57F0, 0xD4CA, 0x57F1, 0xD4C8, 0x57F2, 0xD4BE, 0x57F3, 0xD4B9, + 0x57F4, 0xD4B2, 0x57F5, 0xD8A6, 0x57F6, 0xD4B0, 0x57F7, 0xB0F5, + 0x57F8, 0xD4B7, 0x57F9, 0xB0F6, 0x57FA, 0xB0F2, 0x57FB, 0xD4AD, + 0x57FC, 0xD4C3, 0x57FD, 0xD4B5, 0x5800, 0xD4B3, 0x5801, 0xD4C6, + 0x5802, 0xB0F3, 0x5804, 0xD4CC, 0x5805, 0xB0ED, 0x5806, 0xB0EF, + 0x5807, 0xD4BB, 0x5808, 0xD4B6, 0x5809, 0xAE4B, 0x580A, 0xB0EE, + 0x580B, 0xD4B8, 0x580C, 0xD4C7, 0x580D, 0xD4CB, 0x580E, 0xD4C2, + 0x5810, 0xD4C4, 0x5814, 0xD4AE, 0x5819, 0xD8A1, 0x581B, 0xD8AA, + 0x581C, 0xD8A9, 0x581D, 0xB3FA, 0x581E, 0xD8A2, 0x5820, 0xB3FB, + 0x5821, 0xB3F9, 0x5823, 0xD8A4, 0x5824, 0xB3F6, 0x5825, 0xD8A8, + 0x5827, 0xD8A3, 0x5828, 0xD8A5, 0x5829, 0xD87D, 0x582A, 0xB3F4, + 0x582C, 0xD8B2, 0x582D, 0xD8B1, 0x582E, 0xD8AE, 0x582F, 0xB3F3, + 0x5830, 0xB3F7, 0x5831, 0xB3F8, 0x5832, 0xD14B, 0x5833, 0xD8AB, + 0x5834, 0xB3F5, 0x5835, 0xB0F4, 0x5836, 0xD8AD, 0x5837, 0xD87E, + 0x5838, 0xD8B0, 0x5839, 0xD8AF, 0x583B, 0xD8B3, 0x583D, 0xDCEF, + 0x583F, 0xD8AC, 0x5848, 0xD8A7, 0x5849, 0xDCE7, 0x584A, 0xB6F4, + 0x584B, 0xB6F7, 0x584C, 0xB6F2, 0x584D, 0xDCE6, 0x584E, 0xDCEA, + 0x584F, 0xDCE5, 0x5851, 0xB6EC, 0x5852, 0xB6F6, 0x5853, 0xDCE2, + 0x5854, 0xB6F0, 0x5855, 0xDCE9, 0x5857, 0xB6EE, 0x5858, 0xB6ED, + 0x5859, 0xDCEC, 0x585A, 0xB6EF, 0x585B, 0xDCEE, 0x585D, 0xDCEB, + 0x585E, 0xB6EB, 0x5862, 0xB6F5, 0x5863, 0xDCF0, 0x5864, 0xDCE4, + 0x5865, 0xDCED, 0x5868, 0xDCE3, 0x586B, 0xB6F1, 0x586D, 0xB6F3, + 0x586F, 0xDCE8, 0x5871, 0xDCF1, 0x5874, 0xE15D, 0x5875, 0xB9D0, + 0x5876, 0xE163, 0x5879, 0xB9D5, 0x587A, 0xE15F, 0x587B, 0xE166, + 0x587C, 0xE157, 0x587D, 0xB9D7, 0x587E, 0xB9D1, 0x587F, 0xE15C, + 0x5880, 0xBC55, 0x5881, 0xE15B, 0x5882, 0xE164, 0x5883, 0xB9D2, + 0x5885, 0xB9D6, 0x5886, 0xE15A, 0x5887, 0xE160, 0x5888, 0xE165, + 0x5889, 0xE156, 0x588A, 0xB9D4, 0x588B, 0xE15E, 0x588E, 0xE162, + 0x588F, 0xE168, 0x5890, 0xE158, 0x5891, 0xE161, 0x5893, 0xB9D3, + 0x5894, 0xE167, 0x5898, 0xE159, 0x589C, 0xBC59, 0x589D, 0xE54B, + 0x589E, 0xBC57, 0x589F, 0xBC56, 0x58A0, 0xE54D, 0x58A1, 0xE552, + 0x58A3, 0xE54E, 0x58A5, 0xE551, 0x58A6, 0xBC5C, 0x58A8, 0xBEA5, + 0x58A9, 0xBC5B, 0x58AB, 0xE54A, 0x58AC, 0xE550, 0x58AE, 0xBC5A, + 0x58AF, 0xE54F, 0x58B1, 0xE54C, 0x58B3, 0xBC58, 0x58BA, 0xE94D, + 0x58BB, 0xF9D9, 0x58BC, 0xE94F, 0x58BD, 0xE94A, 0x58BE, 0xBEC1, + 0x58BF, 0xE94C, 0x58C1, 0xBEC0, 0x58C2, 0xE94E, 0x58C5, 0xBEC3, + 0x58C6, 0xE950, 0x58C7, 0xBEC2, 0x58C8, 0xE949, 0x58C9, 0xE94B, + 0x58CE, 0xC0A5, 0x58CF, 0xECCC, 0x58D1, 0xC0A4, 0x58D2, 0xECCD, + 0x58D3, 0xC0A3, 0x58D4, 0xECCB, 0x58D5, 0xC0A2, 0x58D6, 0xECCA, + 0x58D8, 0xC253, 0x58D9, 0xC252, 0x58DA, 0xF1F6, 0x58DB, 0xF1F8, + 0x58DD, 0xF1F7, 0x58DE, 0xC361, 0x58DF, 0xC362, 0x58E2, 0xC363, + 0x58E3, 0xF442, 0x58E4, 0xC45B, 0x58E7, 0xF7D3, 0x58E8, 0xF7D2, + 0x58E9, 0xC5F2, 0x58EB, 0xA468, 0x58EC, 0xA4D0, 0x58EF, 0xA7A7, + 0x58F4, 0xCE5F, 0x58F9, 0xB3FC, 0x58FA, 0xB3FD, 0x58FC, 0xDCF2, + 0x58FD, 0xB9D8, 0x58FE, 0xE169, 0x58FF, 0xE553, 0x5903, 0xC95A, + 0x5906, 0xCAB0, 0x590C, 0xCC42, 0x590D, 0xCE60, 0x590E, 0xD159, + 0x590F, 0xAE4C, 0x5912, 0xF1F9, 0x5914, 0xC4DC, 0x5915, 0xA469, + 0x5916, 0xA57E, 0x5917, 0xC970, 0x5919, 0xA667, 0x591A, 0xA668, + 0x591C, 0xA95D, 0x5920, 0xB0F7, 0x5922, 0xB9DA, 0x5924, 0xB9DB, + 0x5925, 0xB9D9, 0x5927, 0xA46A, 0x5929, 0xA4D1, 0x592A, 0xA4D3, + 0x592B, 0xA4D2, 0x592C, 0xC95B, 0x592D, 0xA4D4, 0x592E, 0xA5A1, + 0x592F, 0xC971, 0x5931, 0xA5A2, 0x5937, 0xA669, 0x5938, 0xA66A, + 0x593C, 0xC9CB, 0x593E, 0xA7A8, 0x5940, 0xCAB1, 0x5944, 0xA961, + 0x5945, 0xCC43, 0x5947, 0xA95F, 0x5948, 0xA960, 0x5949, 0xA95E, + 0x594A, 0xD15A, 0x594E, 0xABB6, 0x594F, 0xABB5, 0x5950, 0xABB7, + 0x5951, 0xABB4, 0x5953, 0xCE61, 0x5954, 0xA962, 0x5955, 0xABB3, + 0x5957, 0xAE4D, 0x5958, 0xAE4E, 0x595A, 0xAE4F, 0x595C, 0xD4CD, + 0x5960, 0xB3FE, 0x5961, 0xD8B4, 0x5962, 0xB0F8, 0x5967, 0xB6F8, + 0x5969, 0xB9DD, 0x596A, 0xB9DC, 0x596B, 0xE16A, 0x596D, 0xBC5D, + 0x596E, 0xBEC4, 0x5970, 0xEFC0, 0x5971, 0xF6DA, 0x5972, 0xF7D4, + 0x5973, 0xA46B, 0x5974, 0xA5A3, 0x5976, 0xA5A4, 0x5977, 0xC9D1, + 0x5978, 0xA66C, 0x5979, 0xA66F, 0x597B, 0xC9CF, 0x597C, 0xC9CD, + 0x597D, 0xA66E, 0x597E, 0xC9D0, 0x597F, 0xC9D2, 0x5980, 0xC9CC, + 0x5981, 0xA671, 0x5982, 0xA670, 0x5983, 0xA66D, 0x5984, 0xA66B, + 0x5985, 0xC9CE, 0x598A, 0xA7B3, 0x598D, 0xA7B0, 0x598E, 0xCAB6, + 0x598F, 0xCAB9, 0x5990, 0xCAB8, 0x5992, 0xA7AA, 0x5993, 0xA7B2, + 0x5996, 0xA7AF, 0x5997, 0xCAB5, 0x5998, 0xCAB3, 0x5999, 0xA7AE, + 0x599D, 0xA7A9, 0x599E, 0xA7AC, 0x59A0, 0xCAB4, 0x59A1, 0xCABB, + 0x59A2, 0xCAB7, 0x59A3, 0xA7AD, 0x59A4, 0xA7B1, 0x59A5, 0xA7B4, + 0x59A6, 0xCAB2, 0x59A7, 0xCABA, 0x59A8, 0xA7AB, 0x59AE, 0xA967, + 0x59AF, 0xA96F, 0x59B1, 0xCC4F, 0x59B2, 0xCC48, 0x59B3, 0xA970, + 0x59B4, 0xCC53, 0x59B5, 0xCC44, 0x59B6, 0xCC4B, 0x59B9, 0xA966, + 0x59BA, 0xCC45, 0x59BB, 0xA964, 0x59BC, 0xCC4C, 0x59BD, 0xCC50, + 0x59BE, 0xA963, 0x59C0, 0xCC51, 0x59C1, 0xCC4A, 0x59C3, 0xCC4D, + 0x59C5, 0xA972, 0x59C6, 0xA969, 0x59C7, 0xCC54, 0x59C8, 0xCC52, + 0x59CA, 0xA96E, 0x59CB, 0xA96C, 0x59CC, 0xCC49, 0x59CD, 0xA96B, + 0x59CE, 0xCC47, 0x59CF, 0xCC46, 0x59D0, 0xA96A, 0x59D1, 0xA968, + 0x59D2, 0xA971, 0x59D3, 0xA96D, 0x59D4, 0xA965, 0x59D6, 0xCC4E, + 0x59D8, 0xABB9, 0x59DA, 0xABC0, 0x59DB, 0xCE6F, 0x59DC, 0xABB8, + 0x59DD, 0xCE67, 0x59DE, 0xCE63, 0x59E0, 0xCE73, 0x59E1, 0xCE62, + 0x59E3, 0xABBB, 0x59E4, 0xCE6C, 0x59E5, 0xABBE, 0x59E6, 0xABC1, + 0x59E8, 0xABBC, 0x59E9, 0xCE70, 0x59EA, 0xABBF, 0x59EC, 0xAE56, + 0x59ED, 0xCE76, 0x59EE, 0xCE64, 0x59F1, 0xCE66, 0x59F2, 0xCE6D, + 0x59F3, 0xCE71, 0x59F4, 0xCE75, 0x59F5, 0xCE72, 0x59F6, 0xCE6B, + 0x59F7, 0xCE6E, 0x59FA, 0xCE68, 0x59FB, 0xABC3, 0x59FC, 0xCE6A, + 0x59FD, 0xCE69, 0x59FE, 0xCE74, 0x59FF, 0xABBA, 0x5A00, 0xCE65, + 0x5A01, 0xABC2, 0x5A03, 0xABBD, 0x5A09, 0xAE5C, 0x5A0A, 0xD162, + 0x5A0C, 0xAE5B, 0x5A0F, 0xD160, 0x5A11, 0xAE50, 0x5A13, 0xAE55, + 0x5A15, 0xD15F, 0x5A16, 0xD15C, 0x5A17, 0xD161, 0x5A18, 0xAE51, + 0x5A19, 0xD15B, 0x5A1B, 0xAE54, 0x5A1C, 0xAE52, 0x5A1E, 0xD163, + 0x5A1F, 0xAE53, 0x5A20, 0xAE57, 0x5A23, 0xAE58, 0x5A25, 0xAE5A, + 0x5A29, 0xAE59, 0x5A2D, 0xD15D, 0x5A2E, 0xD15E, 0x5A33, 0xD164, + 0x5A35, 0xD4D4, 0x5A36, 0xB0F9, 0x5A37, 0xD8C2, 0x5A38, 0xD4D3, + 0x5A39, 0xD4E6, 0x5A3C, 0xB140, 0x5A3E, 0xD4E4, 0x5A40, 0xB0FE, + 0x5A41, 0xB0FA, 0x5A42, 0xD4ED, 0x5A43, 0xD4DD, 0x5A44, 0xD4E0, + 0x5A46, 0xB143, 0x5A47, 0xD4EA, 0x5A48, 0xD4E2, 0x5A49, 0xB0FB, + 0x5A4A, 0xB144, 0x5A4C, 0xD4E7, 0x5A4D, 0xD4E5, 0x5A50, 0xD4D6, + 0x5A51, 0xD4EB, 0x5A52, 0xD4DF, 0x5A53, 0xD4DA, 0x5A55, 0xD4D0, + 0x5A56, 0xD4EC, 0x5A57, 0xD4DC, 0x5A58, 0xD4CF, 0x5A5A, 0xB142, + 0x5A5B, 0xD4E1, 0x5A5C, 0xD4EE, 0x5A5D, 0xD4DE, 0x5A5E, 0xD4D2, + 0x5A5F, 0xD4D7, 0x5A60, 0xD4CE, 0x5A62, 0xB141, 0x5A64, 0xD4DB, + 0x5A65, 0xD4D8, 0x5A66, 0xB0FC, 0x5A67, 0xD4D1, 0x5A69, 0xD4E9, + 0x5A6A, 0xB0FD, 0x5A6C, 0xD4D9, 0x5A6D, 0xD4D5, 0x5A70, 0xD4E8, + 0x5A77, 0xB440, 0x5A78, 0xD8BB, 0x5A7A, 0xD8B8, 0x5A7B, 0xD8C9, + 0x5A7C, 0xD8BD, 0x5A7D, 0xD8CA, 0x5A7F, 0xB442, 0x5A83, 0xD8C6, + 0x5A84, 0xD8C3, 0x5A8A, 0xD8C4, 0x5A8B, 0xD8C7, 0x5A8C, 0xD8CB, + 0x5A8E, 0xD4E3, 0x5A8F, 0xD8CD, 0x5A90, 0xDD47, 0x5A92, 0xB443, + 0x5A93, 0xD8CE, 0x5A94, 0xD8B6, 0x5A95, 0xD8C0, 0x5A97, 0xD8C5, + 0x5A9A, 0xB441, 0x5A9B, 0xB444, 0x5A9C, 0xD8CC, 0x5A9D, 0xD8CF, + 0x5A9E, 0xD8BA, 0x5A9F, 0xD8B7, 0x5AA2, 0xD8B9, 0x5AA5, 0xD8BE, + 0x5AA6, 0xD8BC, 0x5AA7, 0xB445, 0x5AA9, 0xD8C8, 0x5AAC, 0xD8BF, + 0x5AAE, 0xD8C1, 0x5AAF, 0xD8B5, 0x5AB0, 0xDCFA, 0x5AB1, 0xDCF8, + 0x5AB2, 0xB742, 0x5AB3, 0xB740, 0x5AB4, 0xDD43, 0x5AB5, 0xDCF9, + 0x5AB6, 0xDD44, 0x5AB7, 0xDD40, 0x5AB8, 0xDCF7, 0x5AB9, 0xDD46, + 0x5ABA, 0xDCF6, 0x5ABB, 0xDCFD, 0x5ABC, 0xB6FE, 0x5ABD, 0xB6FD, + 0x5ABE, 0xB6FC, 0x5ABF, 0xDCFB, 0x5AC0, 0xDD41, 0x5AC1, 0xB6F9, + 0x5AC2, 0xB741, 0x5AC4, 0xDCF4, 0x5AC6, 0xDCFE, 0x5AC7, 0xDCF3, + 0x5AC8, 0xDCFC, 0x5AC9, 0xB6FA, 0x5ACA, 0xDD42, 0x5ACB, 0xDCF5, + 0x5ACC, 0xB6FB, 0x5ACD, 0xDD45, 0x5AD5, 0xE16E, 0x5AD6, 0xB9E2, + 0x5AD7, 0xB9E1, 0x5AD8, 0xB9E3, 0x5AD9, 0xE17A, 0x5ADA, 0xE170, + 0x5ADB, 0xE176, 0x5ADC, 0xE16B, 0x5ADD, 0xE179, 0x5ADE, 0xE178, + 0x5ADF, 0xE17C, 0x5AE0, 0xE175, 0x5AE1, 0xB9DE, 0x5AE2, 0xE174, + 0x5AE3, 0xB9E4, 0x5AE5, 0xE16D, 0x5AE6, 0xB9DF, 0x5AE8, 0xE17B, + 0x5AE9, 0xB9E0, 0x5AEA, 0xE16F, 0x5AEB, 0xE172, 0x5AEC, 0xE177, + 0x5AED, 0xE171, 0x5AEE, 0xE16C, 0x5AF3, 0xE173, 0x5AF4, 0xE555, + 0x5AF5, 0xBC61, 0x5AF6, 0xE558, 0x5AF7, 0xE557, 0x5AF8, 0xE55A, + 0x5AF9, 0xE55C, 0x5AFA, 0xF9DC, 0x5AFB, 0xBC5F, 0x5AFD, 0xE556, + 0x5AFF, 0xE554, 0x5B01, 0xE55D, 0x5B02, 0xE55B, 0x5B03, 0xE559, + 0x5B05, 0xE55F, 0x5B07, 0xE55E, 0x5B08, 0xBC63, 0x5B09, 0xBC5E, + 0x5B0B, 0xBC60, 0x5B0C, 0xBC62, 0x5B0F, 0xE560, 0x5B10, 0xE957, + 0x5B13, 0xE956, 0x5B14, 0xE955, 0x5B16, 0xE958, 0x5B17, 0xE951, + 0x5B19, 0xE952, 0x5B1A, 0xE95A, 0x5B1B, 0xE953, 0x5B1D, 0xBEC5, + 0x5B1E, 0xE95C, 0x5B20, 0xE95B, 0x5B21, 0xE954, 0x5B23, 0xECD1, + 0x5B24, 0xC0A8, 0x5B25, 0xECCF, 0x5B26, 0xECD4, 0x5B27, 0xECD3, + 0x5B28, 0xE959, 0x5B2A, 0xC0A7, 0x5B2C, 0xECD2, 0x5B2D, 0xECCE, + 0x5B2E, 0xECD6, 0x5B2F, 0xECD5, 0x5B30, 0xC0A6, 0x5B32, 0xECD0, + 0x5B34, 0xBEC6, 0x5B38, 0xC254, 0x5B3C, 0xEFC1, 0x5B3D, 0xF1FA, + 0x5B3E, 0xF1FB, 0x5B3F, 0xF1FC, 0x5B40, 0xC45C, 0x5B43, 0xC45D, + 0x5B45, 0xF443, 0x5B47, 0xF5C8, 0x5B48, 0xF5C7, 0x5B4B, 0xF6DB, + 0x5B4C, 0xF6DC, 0x5B4D, 0xF7D5, 0x5B4E, 0xF8A7, 0x5B50, 0xA46C, + 0x5B51, 0xA46D, 0x5B53, 0xA46E, 0x5B54, 0xA4D5, 0x5B55, 0xA5A5, + 0x5B56, 0xC9D3, 0x5B57, 0xA672, 0x5B58, 0xA673, 0x5B5A, 0xA7B7, + 0x5B5B, 0xA7B8, 0x5B5C, 0xA7B6, 0x5B5D, 0xA7B5, 0x5B5F, 0xA973, + 0x5B62, 0xCC55, 0x5B63, 0xA975, 0x5B64, 0xA974, 0x5B65, 0xCC56, + 0x5B69, 0xABC4, 0x5B6B, 0xAE5D, 0x5B6C, 0xD165, 0x5B6E, 0xD4F0, + 0x5B70, 0xB145, 0x5B71, 0xB447, 0x5B72, 0xD4EF, 0x5B73, 0xB446, + 0x5B75, 0xB9E5, 0x5B77, 0xE17D, 0x5B78, 0xBEC7, 0x5B7A, 0xC0A9, + 0x5B7B, 0xECD7, 0x5B7D, 0xC45E, 0x5B7F, 0xC570, 0x5B81, 0xC972, + 0x5B83, 0xA5A6, 0x5B84, 0xC973, 0x5B85, 0xA676, 0x5B87, 0xA674, + 0x5B88, 0xA675, 0x5B89, 0xA677, 0x5B8B, 0xA7BA, 0x5B8C, 0xA7B9, + 0x5B8E, 0xCABC, 0x5B8F, 0xA7BB, 0x5B92, 0xCABD, 0x5B93, 0xCC57, + 0x5B95, 0xCC58, 0x5B97, 0xA976, 0x5B98, 0xA978, 0x5B99, 0xA97A, + 0x5B9A, 0xA977, 0x5B9B, 0xA97B, 0x5B9C, 0xA979, 0x5BA2, 0xABC8, + 0x5BA3, 0xABC5, 0x5BA4, 0xABC7, 0x5BA5, 0xABC9, 0x5BA6, 0xABC6, + 0x5BA7, 0xD166, 0x5BA8, 0xCE77, 0x5BAC, 0xD168, 0x5BAD, 0xD167, + 0x5BAE, 0xAE63, 0x5BB0, 0xAE5F, 0x5BB3, 0xAE60, 0x5BB4, 0xAE62, + 0x5BB5, 0xAE64, 0x5BB6, 0xAE61, 0x5BB8, 0xAE66, 0x5BB9, 0xAE65, + 0x5BBF, 0xB14A, 0x5BC0, 0xD4F2, 0x5BC1, 0xD4F1, 0x5BC2, 0xB149, + 0x5BC4, 0xB148, 0x5BC5, 0xB147, 0x5BC6, 0xB14B, 0x5BC7, 0xB146, + 0x5BCA, 0xD8D5, 0x5BCB, 0xD8D2, 0x5BCC, 0xB449, 0x5BCD, 0xD8D1, + 0x5BCE, 0xD8D6, 0x5BD0, 0xB44B, 0x5BD1, 0xD8D4, 0x5BD2, 0xB448, + 0x5BD3, 0xB44A, 0x5BD4, 0xD8D3, 0x5BD6, 0xDD48, 0x5BD8, 0xDD49, + 0x5BD9, 0xDD4A, 0x5BDE, 0xB9E6, 0x5BDF, 0xB9EE, 0x5BE0, 0xE17E, + 0x5BE1, 0xB9E8, 0x5BE2, 0xB9EC, 0x5BE3, 0xE1A1, 0x5BE4, 0xB9ED, + 0x5BE5, 0xB9E9, 0x5BE6, 0xB9EA, 0x5BE7, 0xB9E7, 0x5BE8, 0xB9EB, + 0x5BE9, 0xBC66, 0x5BEA, 0xD8D0, 0x5BEB, 0xBC67, 0x5BEC, 0xBC65, + 0x5BEE, 0xBC64, 0x5BEF, 0xE95D, 0x5BF0, 0xBEC8, 0x5BF1, 0xECD8, + 0x5BF2, 0xECD9, 0x5BF5, 0xC364, 0x5BF6, 0xC45F, 0x5BF8, 0xA46F, + 0x5BFA, 0xA678, 0x5C01, 0xABCA, 0x5C03, 0xD169, 0x5C04, 0xAE67, + 0x5C07, 0xB14E, 0x5C08, 0xB14D, 0x5C09, 0xB14C, 0x5C0A, 0xB44C, + 0x5C0B, 0xB44D, 0x5C0C, 0xD8D7, 0x5C0D, 0xB9EF, 0x5C0E, 0xBEC9, + 0x5C0F, 0xA470, 0x5C10, 0xC95C, 0x5C11, 0xA4D6, 0x5C12, 0xC974, + 0x5C15, 0xC9D4, 0x5C16, 0xA679, 0x5C1A, 0xA97C, 0x5C1F, 0xDD4B, + 0x5C22, 0xA471, 0x5C24, 0xA4D7, 0x5C25, 0xC9D5, 0x5C28, 0xCABE, + 0x5C2A, 0xCABF, 0x5C2C, 0xA7BC, 0x5C30, 0xD8D8, 0x5C31, 0xB44E, + 0x5C33, 0xDD4C, 0x5C37, 0xC0AA, 0x5C38, 0xA472, 0x5C39, 0xA4A8, + 0x5C3A, 0xA4D8, 0x5C3B, 0xC975, 0x5C3C, 0xA5A7, 0x5C3E, 0xA7C0, + 0x5C3F, 0xA7BF, 0x5C40, 0xA7BD, 0x5C41, 0xA7BE, 0x5C44, 0xCC59, + 0x5C45, 0xA97E, 0x5C46, 0xA9A1, 0x5C47, 0xCC5A, 0x5C48, 0xA97D, + 0x5C4B, 0xABCE, 0x5C4C, 0xCE78, 0x5C4D, 0xABCD, 0x5C4E, 0xABCB, + 0x5C4F, 0xABCC, 0x5C50, 0xAE6A, 0x5C51, 0xAE68, 0x5C54, 0xD16B, + 0x5C55, 0xAE69, 0x5C56, 0xD16A, 0x5C58, 0xAE5E, 0x5C59, 0xD4F3, + 0x5C5C, 0xB150, 0x5C5D, 0xB151, 0x5C60, 0xB14F, 0x5C62, 0xB9F0, + 0x5C63, 0xE1A2, 0x5C64, 0xBC68, 0x5C65, 0xBC69, 0x5C67, 0xE561, + 0x5C68, 0xC0AB, 0x5C69, 0xEFC2, 0x5C6A, 0xEFC3, 0x5C6C, 0xC4DD, + 0x5C6D, 0xF8A8, 0x5C6E, 0xC94B, 0x5C6F, 0xA4D9, 0x5C71, 0xA473, + 0x5C73, 0xC977, 0x5C74, 0xC976, 0x5C79, 0xA67A, 0x5C7A, 0xC9D7, + 0x5C7B, 0xC9D8, 0x5C7C, 0xC9D6, 0x5C7E, 0xC9D9, 0x5C86, 0xCAC7, + 0x5C88, 0xCAC2, 0x5C89, 0xCAC4, 0x5C8A, 0xCAC6, 0x5C8B, 0xCAC3, + 0x5C8C, 0xA7C4, 0x5C8D, 0xCAC0, 0x5C8F, 0xCAC1, 0x5C90, 0xA7C1, + 0x5C91, 0xA7C2, 0x5C92, 0xCAC5, 0x5C93, 0xCAC8, 0x5C94, 0xA7C3, + 0x5C95, 0xCAC9, 0x5C9D, 0xCC68, 0x5C9F, 0xCC62, 0x5CA0, 0xCC5D, + 0x5CA1, 0xA9A3, 0x5CA2, 0xCC65, 0x5CA3, 0xCC63, 0x5CA4, 0xCC5C, + 0x5CA5, 0xCC69, 0x5CA6, 0xCC6C, 0x5CA7, 0xCC67, 0x5CA8, 0xCC60, + 0x5CA9, 0xA9A5, 0x5CAA, 0xCC66, 0x5CAB, 0xA9A6, 0x5CAC, 0xCC61, + 0x5CAD, 0xCC64, 0x5CAE, 0xCC5B, 0x5CAF, 0xCC5F, 0x5CB0, 0xCC6B, + 0x5CB1, 0xA9A7, 0x5CB3, 0xA9A8, 0x5CB5, 0xCC5E, 0x5CB6, 0xCC6A, + 0x5CB7, 0xA9A2, 0x5CB8, 0xA9A4, 0x5CC6, 0xCEAB, 0x5CC7, 0xCEA4, + 0x5CC8, 0xCEAA, 0x5CC9, 0xCEA3, 0x5CCA, 0xCEA5, 0x5CCB, 0xCE7D, + 0x5CCC, 0xCE7B, 0x5CCE, 0xCEAC, 0x5CCF, 0xCEA9, 0x5CD0, 0xCE79, + 0x5CD2, 0xABD0, 0x5CD3, 0xCEA7, 0x5CD4, 0xCEA8, 0x5CD6, 0xCEA6, + 0x5CD7, 0xCE7C, 0x5CD8, 0xCE7A, 0x5CD9, 0xABCF, 0x5CDA, 0xCEA2, + 0x5CDB, 0xCE7E, 0x5CDE, 0xCEA1, 0x5CDF, 0xCEAD, 0x5CE8, 0xAE6F, + 0x5CEA, 0xAE6E, 0x5CEC, 0xD16C, 0x5CED, 0xAE6B, 0x5CEE, 0xD16E, + 0x5CF0, 0xAE70, 0x5CF1, 0xD16F, 0x5CF4, 0xAE73, 0x5CF6, 0xAE71, + 0x5CF7, 0xD170, 0x5CF8, 0xCEAE, 0x5CF9, 0xD172, 0x5CFB, 0xAE6D, + 0x5CFD, 0xAE6C, 0x5CFF, 0xD16D, 0x5D00, 0xD171, 0x5D01, 0xAE72, + 0x5D06, 0xB153, 0x5D07, 0xB152, 0x5D0B, 0xD4F5, 0x5D0C, 0xD4F9, + 0x5D0D, 0xD4FB, 0x5D0E, 0xB154, 0x5D0F, 0xD4FE, 0x5D11, 0xB158, + 0x5D12, 0xD541, 0x5D14, 0xB15A, 0x5D16, 0xB156, 0x5D17, 0xB15E, + 0x5D19, 0xB15B, 0x5D1A, 0xD4F7, 0x5D1B, 0xB155, 0x5D1D, 0xD4F6, + 0x5D1E, 0xD4F4, 0x5D1F, 0xD543, 0x5D20, 0xD4F8, 0x5D22, 0xB157, + 0x5D23, 0xD542, 0x5D24, 0xB15C, 0x5D25, 0xD4FD, 0x5D26, 0xD4FC, + 0x5D27, 0xB15D, 0x5D28, 0xD4FA, 0x5D29, 0xB159, 0x5D2E, 0xD544, + 0x5D30, 0xD540, 0x5D31, 0xD8E7, 0x5D32, 0xD8EE, 0x5D33, 0xD8E3, + 0x5D34, 0xB451, 0x5D35, 0xD8DF, 0x5D36, 0xD8EF, 0x5D37, 0xD8D9, + 0x5D38, 0xD8EC, 0x5D39, 0xD8EA, 0x5D3A, 0xD8E4, 0x5D3C, 0xD8ED, + 0x5D3D, 0xD8E6, 0x5D3F, 0xD8DE, 0x5D40, 0xD8F0, 0x5D41, 0xD8DC, + 0x5D42, 0xD8E9, 0x5D43, 0xD8DA, 0x5D45, 0xD8F1, 0x5D47, 0xB452, + 0x5D49, 0xD8EB, 0x5D4A, 0xDD4F, 0x5D4B, 0xD8DD, 0x5D4C, 0xB44F, + 0x5D4E, 0xD8E1, 0x5D50, 0xB450, 0x5D51, 0xD8E0, 0x5D52, 0xD8E5, + 0x5D55, 0xD8E2, 0x5D59, 0xD8E8, 0x5D5E, 0xDD53, 0x5D62, 0xDD56, + 0x5D63, 0xDD4E, 0x5D65, 0xDD50, 0x5D67, 0xDD55, 0x5D68, 0xDD54, + 0x5D69, 0xB743, 0x5D6B, 0xD8DB, 0x5D6C, 0xDD52, 0x5D6F, 0xB744, + 0x5D71, 0xDD4D, 0x5D72, 0xDD51, 0x5D77, 0xE1A9, 0x5D79, 0xE1B0, + 0x5D7A, 0xE1A7, 0x5D7C, 0xE1AE, 0x5D7D, 0xE1A5, 0x5D7E, 0xE1AD, + 0x5D7F, 0xE1B1, 0x5D80, 0xE1A4, 0x5D81, 0xE1A8, 0x5D82, 0xE1A3, + 0x5D84, 0xB9F1, 0x5D86, 0xE1A6, 0x5D87, 0xB9F2, 0x5D88, 0xE1AC, + 0x5D89, 0xE1AB, 0x5D8A, 0xE1AA, 0x5D8D, 0xE1AF, 0x5D92, 0xE565, + 0x5D93, 0xE567, 0x5D94, 0xBC6B, 0x5D95, 0xE568, 0x5D97, 0xE563, + 0x5D99, 0xE562, 0x5D9A, 0xE56C, 0x5D9C, 0xE56A, 0x5D9D, 0xBC6A, + 0x5D9E, 0xE56D, 0x5D9F, 0xE564, 0x5DA0, 0xE569, 0x5DA1, 0xE56B, + 0x5DA2, 0xE566, 0x5DA7, 0xE961, 0x5DA8, 0xE966, 0x5DA9, 0xE960, + 0x5DAA, 0xE965, 0x5DAC, 0xE95E, 0x5DAD, 0xE968, 0x5DAE, 0xE964, + 0x5DAF, 0xE969, 0x5DB0, 0xE963, 0x5DB1, 0xE95F, 0x5DB2, 0xE967, + 0x5DB4, 0xE96A, 0x5DB5, 0xE962, 0x5DB7, 0xECDA, 0x5DB8, 0xC0AF, + 0x5DBA, 0xC0AD, 0x5DBC, 0xC0AC, 0x5DBD, 0xC0AE, 0x5DC0, 0xEFC4, + 0x5DC2, 0xF172, 0x5DC3, 0xF1FD, 0x5DC6, 0xF444, 0x5DC7, 0xF445, + 0x5DC9, 0xC460, 0x5DCB, 0xF5C9, 0x5DCD, 0xC4DE, 0x5DCF, 0xF5CA, + 0x5DD1, 0xF6DE, 0x5DD2, 0xC572, 0x5DD4, 0xC571, 0x5DD5, 0xF6DD, + 0x5DD6, 0xC5C9, 0x5DD8, 0xF7D6, 0x5DDD, 0xA474, 0x5DDE, 0xA67B, + 0x5DDF, 0xC9DA, 0x5DE0, 0xCACA, 0x5DE1, 0xA8B5, 0x5DE2, 0xB15F, + 0x5DE5, 0xA475, 0x5DE6, 0xA5AA, 0x5DE7, 0xA5A9, 0x5DE8, 0xA5A8, + 0x5DEB, 0xA7C5, 0x5DEE, 0xAE74, 0x5DF0, 0xDD57, 0x5DF1, 0xA476, + 0x5DF2, 0xA477, 0x5DF3, 0xA478, 0x5DF4, 0xA4DA, 0x5DF7, 0xABD1, + 0x5DF9, 0xCEAF, 0x5DFD, 0xB453, 0x5DFE, 0xA479, 0x5DFF, 0xC95D, + 0x5E02, 0xA5AB, 0x5E03, 0xA5AC, 0x5E04, 0xC978, 0x5E06, 0xA67C, + 0x5E0A, 0xCACB, 0x5E0C, 0xA7C6, 0x5E0E, 0xCACC, 0x5E11, 0xA9AE, + 0x5E14, 0xCC6E, 0x5E15, 0xA9AC, 0x5E16, 0xA9AB, 0x5E17, 0xCC6D, + 0x5E18, 0xA9A9, 0x5E19, 0xCC6F, 0x5E1A, 0xA9AA, 0x5E1B, 0xA9AD, + 0x5E1D, 0xABD2, 0x5E1F, 0xABD4, 0x5E20, 0xCEB3, 0x5E21, 0xCEB0, + 0x5E22, 0xCEB1, 0x5E23, 0xCEB2, 0x5E24, 0xCEB4, 0x5E25, 0xABD3, + 0x5E28, 0xD174, 0x5E29, 0xD173, 0x5E2B, 0xAE76, 0x5E2D, 0xAE75, + 0x5E33, 0xB162, 0x5E34, 0xD546, 0x5E36, 0xB161, 0x5E37, 0xB163, + 0x5E38, 0xB160, 0x5E3D, 0xB455, 0x5E3E, 0xD545, 0x5E40, 0xB456, + 0x5E41, 0xD8F3, 0x5E43, 0xB457, 0x5E44, 0xD8F2, 0x5E45, 0xB454, + 0x5E4A, 0xDD5A, 0x5E4B, 0xDD5C, 0x5E4C, 0xB745, 0x5E4D, 0xDD5B, + 0x5E4E, 0xDD59, 0x5E4F, 0xDD58, 0x5E53, 0xE1B4, 0x5E54, 0xB9F7, + 0x5E55, 0xB9F5, 0x5E57, 0xB9F6, 0x5E58, 0xE1B2, 0x5E59, 0xE1B3, + 0x5E5B, 0xB9F3, 0x5E5C, 0xE571, 0x5E5D, 0xE56F, 0x5E5F, 0xBC6D, + 0x5E60, 0xE570, 0x5E61, 0xBC6E, 0x5E62, 0xBC6C, 0x5E63, 0xB9F4, + 0x5E66, 0xE96D, 0x5E67, 0xE96B, 0x5E68, 0xE96C, 0x5E69, 0xE56E, + 0x5E6A, 0xECDC, 0x5E6B, 0xC0B0, 0x5E6C, 0xECDB, 0x5E6D, 0xEFC5, + 0x5E6E, 0xEFC6, 0x5E6F, 0xE96E, 0x5E70, 0xF1FE, 0x5E72, 0xA47A, + 0x5E73, 0xA5AD, 0x5E74, 0xA67E, 0x5E75, 0xC9DB, 0x5E76, 0xA67D, + 0x5E78, 0xA9AF, 0x5E79, 0xB746, 0x5E7B, 0xA4DB, 0x5E7C, 0xA5AE, + 0x5E7D, 0xABD5, 0x5E7E, 0xB458, 0x5E80, 0xC979, 0x5E82, 0xC97A, + 0x5E84, 0xC9DC, 0x5E87, 0xA7C8, 0x5E88, 0xCAD0, 0x5E89, 0xCACE, + 0x5E8A, 0xA7C9, 0x5E8B, 0xCACD, 0x5E8C, 0xCACF, 0x5E8D, 0xCAD1, + 0x5E8F, 0xA7C7, 0x5E95, 0xA9B3, 0x5E96, 0xA9B4, 0x5E97, 0xA9B1, + 0x5E9A, 0xA9B0, 0x5E9B, 0xCEB8, 0x5E9C, 0xA9B2, 0x5EA0, 0xABD6, + 0x5EA2, 0xCEB7, 0x5EA3, 0xCEB9, 0x5EA4, 0xCEB6, 0x5EA5, 0xCEBA, + 0x5EA6, 0xABD7, 0x5EA7, 0xAE79, 0x5EA8, 0xD175, 0x5EAA, 0xD177, + 0x5EAB, 0xAE77, 0x5EAC, 0xD178, 0x5EAD, 0xAE78, 0x5EAE, 0xD176, + 0x5EB0, 0xCEB5, 0x5EB1, 0xD547, 0x5EB2, 0xD54A, 0x5EB3, 0xD54B, + 0x5EB4, 0xD548, 0x5EB5, 0xB167, 0x5EB6, 0xB166, 0x5EB7, 0xB164, + 0x5EB8, 0xB165, 0x5EB9, 0xD549, 0x5EBE, 0xB168, 0x5EC1, 0xB45A, + 0x5EC2, 0xB45B, 0x5EC4, 0xB45C, 0x5EC5, 0xDD5D, 0x5EC6, 0xDD5F, + 0x5EC7, 0xDD61, 0x5EC8, 0xB748, 0x5EC9, 0xB747, 0x5ECA, 0xB459, + 0x5ECB, 0xDD60, 0x5ECC, 0xDD5E, 0x5ECE, 0xE1B8, 0x5ED1, 0xE1B6, + 0x5ED2, 0xE1BC, 0x5ED3, 0xB9F8, 0x5ED4, 0xE1BD, 0x5ED5, 0xE1BA, + 0x5ED6, 0xB9F9, 0x5ED7, 0xE1B7, 0x5ED8, 0xE1B5, 0x5ED9, 0xE1BB, + 0x5EDA, 0xBC70, 0x5EDB, 0xE573, 0x5EDC, 0xE1B9, 0x5EDD, 0xBC72, + 0x5EDE, 0xE574, 0x5EDF, 0xBC71, 0x5EE0, 0xBC74, 0x5EE1, 0xE575, + 0x5EE2, 0xBC6F, 0x5EE3, 0xBC73, 0x5EE5, 0xE973, 0x5EE6, 0xE971, + 0x5EE7, 0xE970, 0x5EE8, 0xE972, 0x5EE9, 0xE96F, 0x5EEC, 0xC366, + 0x5EEE, 0xF446, 0x5EEF, 0xF447, 0x5EF1, 0xF5CB, 0x5EF2, 0xF6DF, + 0x5EF3, 0xC655, 0x5EF6, 0xA9B5, 0x5EF7, 0xA7CA, 0x5EFA, 0xABD8, + 0x5EFE, 0xA47B, 0x5EFF, 0xA4DC, 0x5F01, 0xA5AF, 0x5F02, 0xC9DD, + 0x5F04, 0xA7CB, 0x5F05, 0xCAD2, 0x5F07, 0xCEBB, 0x5F08, 0xABD9, + 0x5F0A, 0xB9FA, 0x5F0B, 0xA47C, 0x5F0F, 0xA6A1, 0x5F12, 0xB749, + 0x5F13, 0xA47D, 0x5F14, 0xA4DD, 0x5F15, 0xA4DE, 0x5F17, 0xA5B1, + 0x5F18, 0xA5B0, 0x5F1A, 0xC9DE, 0x5F1B, 0xA6A2, 0x5F1D, 0xCAD3, + 0x5F1F, 0xA7CC, 0x5F22, 0xCC71, 0x5F23, 0xCC72, 0x5F24, 0xCC73, + 0x5F26, 0xA9B6, 0x5F27, 0xA9B7, 0x5F28, 0xCC70, 0x5F29, 0xA9B8, + 0x5F2D, 0xABDA, 0x5F2E, 0xCEBC, 0x5F30, 0xD17A, 0x5F31, 0xAE7A, + 0x5F33, 0xD179, 0x5F35, 0xB169, 0x5F36, 0xD54C, 0x5F37, 0xB16A, + 0x5F38, 0xD54D, 0x5F3C, 0xB45D, 0x5F40, 0xDD62, 0x5F43, 0xE1BF, + 0x5F44, 0xE1BE, 0x5F46, 0xB9FB, 0x5F48, 0xBC75, 0x5F49, 0xE576, + 0x5F4A, 0xBECA, 0x5F4B, 0xE974, 0x5F4C, 0xC0B1, 0x5F4E, 0xC573, + 0x5F4F, 0xF7D8, 0x5F54, 0xCC74, 0x5F56, 0xCEBD, 0x5F57, 0xB16B, + 0x5F58, 0xD8F4, 0x5F59, 0xB74A, 0x5F5D, 0xC255, 0x5F62, 0xA7CE, + 0x5F64, 0xA7CD, 0x5F65, 0xABDB, 0x5F67, 0xD17B, 0x5F69, 0xB16D, + 0x5F6A, 0xB343, 0x5F6B, 0xB16E, 0x5F6C, 0xB16C, 0x5F6D, 0xB45E, + 0x5F6F, 0xE1C0, 0x5F70, 0xB9FC, 0x5F71, 0xBC76, 0x5F73, 0xC94C, + 0x5F74, 0xC9DF, 0x5F76, 0xCAD5, 0x5F77, 0xA7CF, 0x5F78, 0xCAD4, + 0x5F79, 0xA7D0, 0x5F7C, 0xA9BC, 0x5F7D, 0xCC77, 0x5F7E, 0xCC76, + 0x5F7F, 0xA9BB, 0x5F80, 0xA9B9, 0x5F81, 0xA9BA, 0x5F82, 0xCC75, + 0x5F85, 0xABDD, 0x5F86, 0xCEBE, 0x5F87, 0xABE0, 0x5F88, 0xABDC, + 0x5F89, 0xABE2, 0x5F8A, 0xABDE, 0x5F8B, 0xABDF, 0x5F8C, 0xABE1, + 0x5F90, 0xAE7D, 0x5F91, 0xAE7C, 0x5F92, 0xAE7B, 0x5F96, 0xD54F, + 0x5F97, 0xB16F, 0x5F98, 0xB172, 0x5F99, 0xB170, 0x5F9B, 0xD54E, + 0x5F9C, 0xB175, 0x5F9E, 0xB171, 0x5F9F, 0xD550, 0x5FA0, 0xB174, + 0x5FA1, 0xB173, 0x5FA5, 0xD8F6, 0x5FA6, 0xD8F5, 0x5FA8, 0xB461, + 0x5FA9, 0xB45F, 0x5FAA, 0xB460, 0x5FAB, 0xD8F7, 0x5FAC, 0xB74B, + 0x5FAD, 0xDD64, 0x5FAE, 0xB74C, 0x5FAF, 0xDD63, 0x5FB2, 0xE577, + 0x5FB5, 0xBC78, 0x5FB6, 0xE1C1, 0x5FB7, 0xBC77, 0x5FB9, 0xB9FD, + 0x5FBB, 0xECDE, 0x5FBC, 0xE975, 0x5FBD, 0xC0B2, 0x5FBE, 0xECDD, + 0x5FBF, 0xF240, 0x5FC0, 0xF448, 0x5FC1, 0xF449, 0x5FC3, 0xA4DF, + 0x5FC5, 0xA5B2, 0x5FC9, 0xC97B, 0x5FCC, 0xA7D2, 0x5FCD, 0xA7D4, + 0x5FCF, 0xC9E2, 0x5FD0, 0xCAD8, 0x5FD1, 0xCAD7, 0x5FD2, 0xCAD6, + 0x5FD4, 0xC9E1, 0x5FD5, 0xC9E0, 0x5FD6, 0xA6A4, 0x5FD7, 0xA7D3, + 0x5FD8, 0xA7D1, 0x5FD9, 0xA6A3, 0x5FDD, 0xA9BD, 0x5FDE, 0xCC78, + 0x5FE0, 0xA9BE, 0x5FE1, 0xCADD, 0x5FE3, 0xCADF, 0x5FE4, 0xCADE, + 0x5FE5, 0xCC79, 0x5FE8, 0xCADA, 0x5FEA, 0xA7D8, 0x5FEB, 0xA7D6, + 0x5FED, 0xCAD9, 0x5FEE, 0xCADB, 0x5FEF, 0xCAE1, 0x5FF1, 0xA7D5, + 0x5FF3, 0xCADC, 0x5FF4, 0xCAE5, 0x5FF5, 0xA9C0, 0x5FF7, 0xCAE2, + 0x5FF8, 0xA7D7, 0x5FFA, 0xCAE0, 0x5FFB, 0xCAE3, 0x5FFD, 0xA9BF, + 0x5FFF, 0xA9C1, 0x6000, 0xCAE4, 0x6009, 0xCCAF, 0x600A, 0xCCA2, + 0x600B, 0xCC7E, 0x600C, 0xCCAE, 0x600D, 0xCCA9, 0x600E, 0xABE7, + 0x600F, 0xA9C2, 0x6010, 0xCCAA, 0x6011, 0xCCAD, 0x6012, 0xABE3, + 0x6013, 0xCCAC, 0x6014, 0xA9C3, 0x6015, 0xA9C8, 0x6016, 0xA9C6, + 0x6017, 0xCCA3, 0x6019, 0xCC7C, 0x601A, 0xCCA5, 0x601B, 0xA9CD, + 0x601C, 0xCCB0, 0x601D, 0xABE4, 0x601E, 0xCCA6, 0x6020, 0xABE5, + 0x6021, 0xA9C9, 0x6022, 0xCCA8, 0x6024, 0xCECD, 0x6025, 0xABE6, + 0x6026, 0xCC7B, 0x6027, 0xA9CA, 0x6028, 0xABE8, 0x6029, 0xA9CB, + 0x602A, 0xA9C7, 0x602B, 0xA9CC, 0x602C, 0xCCA7, 0x602D, 0xCC7A, + 0x602E, 0xCCAB, 0x602F, 0xA9C4, 0x6032, 0xCC7D, 0x6033, 0xCCA4, + 0x6034, 0xCCA1, 0x6035, 0xA9C5, 0x6037, 0xCEBF, 0x6039, 0xCEC0, + 0x6040, 0xCECA, 0x6041, 0xD1A1, 0x6042, 0xCECB, 0x6043, 0xABEE, + 0x6044, 0xCECE, 0x6045, 0xCEC4, 0x6046, 0xABED, 0x6047, 0xCEC6, + 0x6049, 0xCEC7, 0x604C, 0xCEC9, 0x604D, 0xABE9, 0x6050, 0xAEA3, + 0x6052, 0xF9DA, 0x6053, 0xCEC5, 0x6054, 0xCEC1, 0x6055, 0xAEA4, + 0x6058, 0xCECF, 0x6059, 0xAE7E, 0x605A, 0xD17D, 0x605B, 0xCEC8, + 0x605D, 0xD17C, 0x605E, 0xCEC3, 0x605F, 0xCECC, 0x6062, 0xABEC, + 0x6063, 0xAEA1, 0x6064, 0xABF2, 0x6065, 0xAEA2, 0x6066, 0xCED0, + 0x6067, 0xD17E, 0x6068, 0xABEB, 0x6069, 0xAEA6, 0x606A, 0xABF1, + 0x606B, 0xABF0, 0x606C, 0xABEF, 0x606D, 0xAEA5, 0x606E, 0xCED1, + 0x606F, 0xAEA7, 0x6070, 0xABEA, 0x6072, 0xCEC2, 0x607F, 0xB176, + 0x6080, 0xD1A4, 0x6081, 0xD1A6, 0x6083, 0xD1A8, 0x6084, 0xAEA8, + 0x6085, 0xAEAE, 0x6086, 0xD553, 0x6087, 0xD1AC, 0x6088, 0xD1A3, + 0x6089, 0xB178, 0x608A, 0xD551, 0x608C, 0xAEAD, 0x608D, 0xAEAB, + 0x608E, 0xD1AE, 0x6090, 0xD552, 0x6092, 0xD1A5, 0x6094, 0xAEAC, + 0x6095, 0xD1A9, 0x6096, 0xAEAF, 0x6097, 0xD1AB, 0x609A, 0xAEAA, + 0x609B, 0xD1AA, 0x609C, 0xD1AD, 0x609D, 0xD1A7, 0x609F, 0xAEA9, + 0x60A0, 0xB179, 0x60A2, 0xD1A2, 0x60A3, 0xB177, 0x60A8, 0xB17A, + 0x60B0, 0xD555, 0x60B1, 0xD55E, 0x60B2, 0xB464, 0x60B4, 0xB17C, + 0x60B5, 0xB1A3, 0x60B6, 0xB465, 0x60B7, 0xD560, 0x60B8, 0xB1AA, + 0x60B9, 0xD8F9, 0x60BA, 0xD556, 0x60BB, 0xB1A2, 0x60BC, 0xB1A5, + 0x60BD, 0xB17E, 0x60BE, 0xD554, 0x60BF, 0xD562, 0x60C0, 0xD565, + 0x60C1, 0xD949, 0x60C3, 0xD563, 0x60C4, 0xD8FD, 0x60C5, 0xB1A1, + 0x60C6, 0xB1A8, 0x60C7, 0xB1AC, 0x60C8, 0xD55D, 0x60C9, 0xD8F8, + 0x60CA, 0xD561, 0x60CB, 0xB17B, 0x60CC, 0xD8FA, 0x60CD, 0xD564, + 0x60CE, 0xD8FC, 0x60CF, 0xD559, 0x60D1, 0xB462, 0x60D3, 0xD557, + 0x60D4, 0xD558, 0x60D5, 0xB1A7, 0x60D8, 0xB1A6, 0x60D9, 0xD55B, + 0x60DA, 0xB1AB, 0x60DB, 0xD55F, 0x60DC, 0xB1A4, 0x60DD, 0xD55C, + 0x60DF, 0xB1A9, 0x60E0, 0xB466, 0x60E1, 0xB463, 0x60E2, 0xD8FB, + 0x60E4, 0xD55A, 0x60E6, 0xB17D, 0x60F0, 0xB46B, 0x60F1, 0xB46F, + 0x60F2, 0xD940, 0x60F3, 0xB751, 0x60F4, 0xB46D, 0x60F5, 0xD944, + 0x60F6, 0xB471, 0x60F7, 0xDD65, 0x60F8, 0xD946, 0x60F9, 0xB753, + 0x60FA, 0xB469, 0x60FB, 0xB46C, 0x60FC, 0xD947, 0x60FE, 0xD948, + 0x60FF, 0xD94E, 0x6100, 0xB473, 0x6101, 0xB754, 0x6103, 0xD94A, + 0x6104, 0xD94F, 0x6105, 0xD943, 0x6106, 0xB75E, 0x6108, 0xB755, + 0x6109, 0xB472, 0x610A, 0xD941, 0x610B, 0xD950, 0x610D, 0xB75D, + 0x610E, 0xB470, 0x610F, 0xB74E, 0x6110, 0xD94D, 0x6112, 0xB474, + 0x6113, 0xD945, 0x6114, 0xD8FE, 0x6115, 0xB46A, 0x6116, 0xD942, + 0x6118, 0xD94B, 0x611A, 0xB74D, 0x611B, 0xB752, 0x611C, 0xB467, + 0x611D, 0xD94C, 0x611F, 0xB750, 0x6123, 0xB468, 0x6127, 0xB75C, + 0x6128, 0xE1C3, 0x6129, 0xDD70, 0x612B, 0xDD68, 0x612C, 0xE1C2, + 0x612E, 0xDD6C, 0x612F, 0xDD6E, 0x6132, 0xDD6B, 0x6134, 0xB75B, + 0x6136, 0xDD6A, 0x6137, 0xB75F, 0x613B, 0xE1D2, 0x613E, 0xB75A, + 0x613F, 0xBA40, 0x6140, 0xDD71, 0x6141, 0xE1C4, 0x6144, 0xB758, + 0x6145, 0xDD69, 0x6146, 0xDD6D, 0x6147, 0xB9FE, 0x6148, 0xB74F, + 0x6149, 0xDD66, 0x614A, 0xDD67, 0x614B, 0xBA41, 0x614C, 0xB757, + 0x614D, 0xB759, 0x614E, 0xB756, 0x614F, 0xDD6F, 0x6152, 0xE1C8, + 0x6153, 0xE1C9, 0x6154, 0xE1CE, 0x6155, 0xBC7D, 0x6156, 0xE1D5, + 0x6158, 0xBA47, 0x615A, 0xBA46, 0x615B, 0xE1D0, 0x615D, 0xBC7C, + 0x615E, 0xE1C5, 0x615F, 0xBA45, 0x6161, 0xE1D4, 0x6162, 0xBA43, + 0x6163, 0xBA44, 0x6165, 0xE1D1, 0x6166, 0xE5AA, 0x6167, 0xBC7A, + 0x6168, 0xB46E, 0x616A, 0xE1D3, 0x616B, 0xBCA3, 0x616C, 0xE1CB, + 0x616E, 0xBC7B, 0x6170, 0xBCA2, 0x6171, 0xE1C6, 0x6172, 0xE1CA, + 0x6173, 0xE1C7, 0x6174, 0xE1CD, 0x6175, 0xBA48, 0x6176, 0xBC79, + 0x6177, 0xBA42, 0x6179, 0xE57A, 0x617A, 0xE1CF, 0x617C, 0xBCA1, + 0x617E, 0xBCA4, 0x6180, 0xE1CC, 0x6182, 0xBC7E, 0x6183, 0xE579, + 0x6189, 0xE57E, 0x618A, 0xBECE, 0x618B, 0xE578, 0x618C, 0xE9A3, + 0x618D, 0xE5A9, 0x618E, 0xBCA8, 0x6190, 0xBCA6, 0x6191, 0xBECC, + 0x6192, 0xE5A6, 0x6193, 0xE5A2, 0x6194, 0xBCAC, 0x6196, 0xE978, + 0x619A, 0xBCAA, 0x619B, 0xE5A1, 0x619D, 0xE976, 0x619F, 0xE5A5, + 0x61A1, 0xE5A8, 0x61A2, 0xE57D, 0x61A4, 0xBCAB, 0x61A7, 0xBCA5, + 0x61A8, 0xE977, 0x61A9, 0xBECD, 0x61AA, 0xE5A7, 0x61AB, 0xBCA7, + 0x61AC, 0xBCA9, 0x61AD, 0xE5A4, 0x61AE, 0xBCAD, 0x61AF, 0xE5A3, + 0x61B0, 0xE57C, 0x61B1, 0xE57B, 0x61B2, 0xBECB, 0x61B3, 0xE5AB, + 0x61B4, 0xE97A, 0x61B5, 0xECE0, 0x61B6, 0xBED0, 0x61B8, 0xE9A2, + 0x61BA, 0xE97E, 0x61BC, 0xECE1, 0x61BE, 0xBED1, 0x61BF, 0xE9A1, + 0x61C1, 0xE97C, 0x61C2, 0xC0B4, 0x61C3, 0xECDF, 0x61C5, 0xE979, + 0x61C6, 0xE97B, 0x61C7, 0xC0B5, 0x61C8, 0xBED3, 0x61C9, 0xC0B3, + 0x61CA, 0xBED2, 0x61CB, 0xC0B7, 0x61CC, 0xE97D, 0x61CD, 0xBECF, + 0x61D6, 0xEFCF, 0x61D8, 0xEFC7, 0x61DE, 0xECE7, 0x61DF, 0xEFC8, + 0x61E0, 0xECE3, 0x61E3, 0xC256, 0x61E4, 0xECE5, 0x61E5, 0xECE4, + 0x61E6, 0xC0B6, 0x61E7, 0xECE2, 0x61E8, 0xECE6, 0x61E9, 0xEFD0, + 0x61EA, 0xEFCC, 0x61EB, 0xEFCE, 0x61ED, 0xEFC9, 0x61EE, 0xEFCA, + 0x61F0, 0xEFCD, 0x61F1, 0xEFCB, 0x61F2, 0xC367, 0x61F5, 0xC36A, + 0x61F6, 0xC369, 0x61F7, 0xC368, 0x61F8, 0xC461, 0x61F9, 0xF44A, + 0x61FA, 0xC462, 0x61FB, 0xF241, 0x61FC, 0xC4DF, 0x61FD, 0xF5CC, + 0x61FE, 0xC4E0, 0x61FF, 0xC574, 0x6200, 0xC5CA, 0x6201, 0xF7D9, + 0x6203, 0xF7DA, 0x6204, 0xF7DB, 0x6207, 0xF9BA, 0x6208, 0xA4E0, + 0x6209, 0xC97C, 0x620A, 0xA5B3, 0x620C, 0xA6A6, 0x620D, 0xA6A7, + 0x620E, 0xA6A5, 0x6210, 0xA6A8, 0x6211, 0xA7DA, 0x6212, 0xA7D9, + 0x6214, 0xCCB1, 0x6215, 0xA9CF, 0x6216, 0xA9CE, 0x6219, 0xD1AF, + 0x621A, 0xB1AD, 0x621B, 0xB1AE, 0x621F, 0xB475, 0x6220, 0xDD72, + 0x6221, 0xB760, 0x6222, 0xB761, 0x6223, 0xDD74, 0x6224, 0xDD76, + 0x6225, 0xDD75, 0x6227, 0xE1D7, 0x6229, 0xE1D6, 0x622A, 0xBA49, + 0x622B, 0xE1D8, 0x622D, 0xE5AC, 0x622E, 0xBCAE, 0x6230, 0xBED4, + 0x6232, 0xC0B8, 0x6233, 0xC257, 0x6234, 0xC0B9, 0x6236, 0xA4E1, + 0x623A, 0xCAE6, 0x623D, 0xCCB2, 0x623E, 0xA9D1, 0x623F, 0xA9D0, + 0x6240, 0xA9D2, 0x6241, 0xABF3, 0x6242, 0xCED2, 0x6243, 0xCED3, + 0x6246, 0xD1B0, 0x6247, 0xAEB0, 0x6248, 0xB1AF, 0x6249, 0xB476, + 0x624A, 0xD951, 0x624B, 0xA4E2, 0x624D, 0xA47E, 0x624E, 0xA4E3, + 0x6250, 0xC97D, 0x6251, 0xA5B7, 0x6252, 0xA5B6, 0x6253, 0xA5B4, + 0x6254, 0xA5B5, 0x6258, 0xA6AB, 0x6259, 0xC9E9, 0x625A, 0xC9EB, + 0x625B, 0xA6AA, 0x625C, 0xC9E3, 0x625E, 0xC9E4, 0x6260, 0xC9EA, + 0x6261, 0xC9E6, 0x6262, 0xC9E8, 0x6263, 0xA6A9, 0x6264, 0xC9E5, + 0x6265, 0xC9EC, 0x6266, 0xC9E7, 0x626D, 0xA7E1, 0x626E, 0xA7EA, + 0x626F, 0xA7E8, 0x6270, 0xCAF0, 0x6271, 0xCAED, 0x6272, 0xCAF5, + 0x6273, 0xA7E6, 0x6274, 0xCAF6, 0x6276, 0xA7DF, 0x6277, 0xCAF3, + 0x6279, 0xA7E5, 0x627A, 0xCAEF, 0x627B, 0xCAEE, 0x627C, 0xA7E3, + 0x627D, 0xCAF4, 0x627E, 0xA7E4, 0x627F, 0xA9D3, 0x6280, 0xA7DE, + 0x6281, 0xCAF1, 0x6283, 0xCAE7, 0x6284, 0xA7DB, 0x6286, 0xA7EE, + 0x6287, 0xCAEC, 0x6288, 0xCAF2, 0x6289, 0xA7E0, 0x628A, 0xA7E2, + 0x628C, 0xCAE8, 0x628E, 0xCAE9, 0x628F, 0xCAEA, 0x6291, 0xA7ED, + 0x6292, 0xA7E7, 0x6293, 0xA7EC, 0x6294, 0xCAEB, 0x6295, 0xA7EB, + 0x6296, 0xA7DD, 0x6297, 0xA7DC, 0x6298, 0xA7E9, 0x62A8, 0xA9E1, + 0x62A9, 0xCCBE, 0x62AA, 0xCCB7, 0x62AB, 0xA9DC, 0x62AC, 0xA9EF, + 0x62AD, 0xCCB3, 0x62AE, 0xCCBA, 0x62AF, 0xCCBC, 0x62B0, 0xCCBF, + 0x62B1, 0xA9EA, 0x62B3, 0xCCBB, 0x62B4, 0xCCB4, 0x62B5, 0xA9E8, + 0x62B6, 0xCCB8, 0x62B8, 0xCCC0, 0x62B9, 0xA9D9, 0x62BB, 0xCCBD, + 0x62BC, 0xA9E3, 0x62BD, 0xA9E2, 0x62BE, 0xCCB6, 0x62BF, 0xA9D7, + 0x62C2, 0xA9D8, 0x62C4, 0xA9D6, 0x62C6, 0xA9EE, 0x62C7, 0xA9E6, + 0x62C8, 0xA9E0, 0x62C9, 0xA9D4, 0x62CA, 0xCCB9, 0x62CB, 0xA9DF, + 0x62CC, 0xA9D5, 0x62CD, 0xA9E7, 0x62CE, 0xA9F0, 0x62CF, 0xCED4, + 0x62D0, 0xA9E4, 0x62D1, 0xCCB5, 0x62D2, 0xA9DA, 0x62D3, 0xA9DD, + 0x62D4, 0xA9DE, 0x62D6, 0xA9EC, 0x62D7, 0xA9ED, 0x62D8, 0xA9EB, + 0x62D9, 0xA9E5, 0x62DA, 0xA9E9, 0x62DB, 0xA9DB, 0x62DC, 0xABF4, + 0x62EB, 0xCEDA, 0x62EC, 0xAC41, 0x62ED, 0xABF8, 0x62EE, 0xABFA, + 0x62EF, 0xAC40, 0x62F0, 0xCEE6, 0x62F1, 0xABFD, 0x62F2, 0xD1B1, + 0x62F3, 0xAEB1, 0x62F4, 0xAC43, 0x62F5, 0xCED7, 0x62F6, 0xCEDF, + 0x62F7, 0xABFE, 0x62F8, 0xCEDE, 0x62F9, 0xCEDB, 0x62FA, 0xCEE3, + 0x62FB, 0xCEE5, 0x62FC, 0xABF7, 0x62FD, 0xABFB, 0x62FE, 0xAC42, + 0x62FF, 0xAEB3, 0x6300, 0xCEE0, 0x6301, 0xABF9, 0x6302, 0xAC45, + 0x6303, 0xCED9, 0x6307, 0xABFC, 0x6308, 0xAEB2, 0x6309, 0xABF6, + 0x630B, 0xCED6, 0x630C, 0xCEDD, 0x630D, 0xCED5, 0x630E, 0xCED8, + 0x630F, 0xCEDC, 0x6310, 0xD1B2, 0x6311, 0xAC44, 0x6313, 0xCEE1, + 0x6314, 0xCEE2, 0x6315, 0xCEE4, 0x6316, 0xABF5, 0x6328, 0xAEC1, + 0x6329, 0xD1BE, 0x632A, 0xAEBF, 0x632B, 0xAEC0, 0x632C, 0xD1B4, + 0x632D, 0xD1C4, 0x632F, 0xAEB6, 0x6332, 0xD566, 0x6333, 0xD1C6, + 0x6334, 0xD1C0, 0x6336, 0xD1B7, 0x6338, 0xD1C9, 0x6339, 0xD1BA, + 0x633A, 0xAEBC, 0x633B, 0xD57D, 0x633C, 0xD1BD, 0x633D, 0xAEBE, + 0x633E, 0xAEB5, 0x6340, 0xD1CB, 0x6341, 0xD1BF, 0x6342, 0xAEB8, + 0x6343, 0xD1B8, 0x6344, 0xD1B5, 0x6345, 0xD1B6, 0x6346, 0xAEB9, + 0x6347, 0xD1C5, 0x6348, 0xD1CC, 0x6349, 0xAEBB, 0x634A, 0xD1BC, + 0x634B, 0xD1BB, 0x634C, 0xAEC3, 0x634D, 0xAEC2, 0x634E, 0xAEB4, + 0x634F, 0xAEBA, 0x6350, 0xAEBD, 0x6351, 0xD1C8, 0x6354, 0xD1C2, + 0x6355, 0xAEB7, 0x6356, 0xD1B3, 0x6357, 0xD1CA, 0x6358, 0xD1C1, + 0x6359, 0xD1C3, 0x635A, 0xD1C7, 0x6365, 0xD567, 0x6367, 0xB1B7, + 0x6368, 0xB1CB, 0x6369, 0xB1CA, 0x636B, 0xB1BF, 0x636D, 0xD579, + 0x636E, 0xD575, 0x636F, 0xD572, 0x6370, 0xD5A6, 0x6371, 0xB1BA, + 0x6372, 0xB1B2, 0x6375, 0xD577, 0x6376, 0xB4A8, 0x6377, 0xB1B6, + 0x6378, 0xD5A1, 0x637A, 0xB1CC, 0x637B, 0xB1C9, 0x637C, 0xD57B, + 0x637D, 0xD56A, 0x6380, 0xB1C8, 0x6381, 0xD5A3, 0x6382, 0xD569, + 0x6383, 0xB1BD, 0x6384, 0xB1C1, 0x6385, 0xD5A2, 0x6387, 0xD573, + 0x6388, 0xB1C2, 0x6389, 0xB1BC, 0x638A, 0xD568, 0x638C, 0xB478, + 0x638D, 0xD5A5, 0x638E, 0xD571, 0x638F, 0xB1C7, 0x6390, 0xD574, + 0x6391, 0xD5A4, 0x6392, 0xB1C6, 0x6394, 0xD952, 0x6396, 0xB1B3, + 0x6397, 0xD56F, 0x6398, 0xB1B8, 0x6399, 0xB1C3, 0x639B, 0xB1BE, + 0x639C, 0xD578, 0x639D, 0xD56E, 0x639E, 0xD56C, 0x639F, 0xD57E, + 0x63A0, 0xB1B0, 0x63A1, 0xB1C4, 0x63A2, 0xB1B4, 0x63A3, 0xB477, + 0x63A4, 0xD57C, 0x63A5, 0xB1B5, 0x63A7, 0xB1B1, 0x63A8, 0xB1C0, + 0x63A9, 0xB1BB, 0x63AA, 0xB1B9, 0x63AB, 0xD570, 0x63AC, 0xB1C5, + 0x63AD, 0xD56D, 0x63AE, 0xD57A, 0x63AF, 0xD576, 0x63B0, 0xD954, + 0x63B1, 0xD953, 0x63BD, 0xD56B, 0x63BE, 0xD964, 0x63C0, 0xB47A, + 0x63C2, 0xD96A, 0x63C3, 0xD959, 0x63C4, 0xD967, 0x63C5, 0xDD77, + 0x63C6, 0xB47D, 0x63C7, 0xD96B, 0x63C8, 0xD96E, 0x63C9, 0xB47C, + 0x63CA, 0xD95C, 0x63CB, 0xD96D, 0x63CC, 0xD96C, 0x63CD, 0xB47E, + 0x63CE, 0xD955, 0x63CF, 0xB479, 0x63D0, 0xB4A3, 0x63D2, 0xB4A1, + 0x63D3, 0xD969, 0x63D5, 0xD95F, 0x63D6, 0xB4A5, 0x63D7, 0xD970, + 0x63D8, 0xD968, 0x63D9, 0xD971, 0x63DA, 0xB4AD, 0x63DB, 0xB4AB, + 0x63DC, 0xD966, 0x63DD, 0xD965, 0x63DF, 0xD963, 0x63E0, 0xD95D, + 0x63E1, 0xB4A4, 0x63E3, 0xB4A2, 0x63E4, 0xD1B9, 0x63E5, 0xD956, + 0x63E7, 0xDDB7, 0x63E8, 0xD957, 0x63E9, 0xB47B, 0x63EA, 0xB4AA, + 0x63EB, 0xDD79, 0x63ED, 0xB4A6, 0x63EE, 0xB4A7, 0x63EF, 0xD958, + 0x63F0, 0xD96F, 0x63F1, 0xDD78, 0x63F2, 0xD960, 0x63F3, 0xD95B, + 0x63F4, 0xB4A9, 0x63F5, 0xD961, 0x63F6, 0xD95E, 0x63F9, 0xB4AE, + 0x6406, 0xB770, 0x6409, 0xDD7C, 0x640A, 0xDDB1, 0x640B, 0xDDB6, + 0x640C, 0xDDAA, 0x640D, 0xB76C, 0x640E, 0xDDBB, 0x640F, 0xB769, + 0x6410, 0xDD7A, 0x6412, 0xDD7B, 0x6413, 0xB762, 0x6414, 0xB76B, + 0x6415, 0xDDA4, 0x6416, 0xB76E, 0x6417, 0xB76F, 0x6418, 0xDDA5, + 0x641A, 0xDDB2, 0x641B, 0xDDB8, 0x641C, 0xB76A, 0x641E, 0xB764, + 0x641F, 0xDDA3, 0x6420, 0xDD7D, 0x6421, 0xDDBA, 0x6422, 0xDDA8, + 0x6423, 0xDDA9, 0x6424, 0xDD7E, 0x6425, 0xDDB4, 0x6426, 0xDDAB, + 0x6427, 0xDDB5, 0x6428, 0xDDAD, 0x642A, 0xB765, 0x642B, 0xE1D9, + 0x642C, 0xB768, 0x642D, 0xB766, 0x642E, 0xDDB9, 0x642F, 0xDDB0, + 0x6430, 0xDDAC, 0x6433, 0xDDA1, 0x6434, 0xBA53, 0x6435, 0xDDAF, + 0x6436, 0xB76D, 0x6437, 0xDDA7, 0x6439, 0xDDA6, 0x643D, 0xB767, + 0x643E, 0xB763, 0x643F, 0xE1EE, 0x6440, 0xDDB3, 0x6441, 0xDDAE, + 0x6443, 0xDDA2, 0x644B, 0xE1E9, 0x644D, 0xE1DA, 0x644E, 0xE1E5, + 0x6450, 0xE1EC, 0x6451, 0xBA51, 0x6452, 0xB4AC, 0x6453, 0xE1EA, + 0x6454, 0xBA4C, 0x6458, 0xBA4B, 0x6459, 0xE1F1, 0x645B, 0xE1DB, + 0x645C, 0xE1E8, 0x645D, 0xE1DC, 0x645E, 0xE1E7, 0x645F, 0xBA4F, + 0x6460, 0xE1EB, 0x6461, 0xD962, 0x6465, 0xE1F2, 0x6466, 0xE1E3, + 0x6467, 0xBA52, 0x6468, 0xE5BA, 0x6469, 0xBCAF, 0x646B, 0xE1F0, + 0x646C, 0xE1EF, 0x646D, 0xBA54, 0x646E, 0xE5AD, 0x646F, 0xBCB0, + 0x6470, 0xE5AE, 0x6472, 0xE1DF, 0x6473, 0xE1E0, 0x6474, 0xE1DD, + 0x6475, 0xE1E2, 0x6476, 0xE1DE, 0x6477, 0xE1F3, 0x6478, 0xBA4E, + 0x6479, 0xBCB1, 0x647A, 0xBA50, 0x647B, 0xBA55, 0x647D, 0xE1E1, + 0x647F, 0xE1ED, 0x6482, 0xE1E6, 0x6485, 0xE5B1, 0x6487, 0xBA4A, + 0x6488, 0xBCB4, 0x6489, 0xE9AA, 0x648A, 0xE5B6, 0x648B, 0xE5B5, + 0x648C, 0xE5B7, 0x648F, 0xE5B4, 0x6490, 0xBCB5, 0x6492, 0xBCBB, + 0x6493, 0xBCB8, 0x6495, 0xBCB9, 0x6496, 0xE5AF, 0x6497, 0xE5B2, + 0x6498, 0xE5BC, 0x6499, 0xBCC1, 0x649A, 0xBCBF, 0x649C, 0xE5B3, + 0x649D, 0xD95A, 0x649E, 0xBCB2, 0x649F, 0xE5B9, 0x64A0, 0xE5B0, + 0x64A2, 0xBCC2, 0x64A3, 0xE5B8, 0x64A4, 0xBA4D, 0x64A5, 0xBCB7, + 0x64A6, 0xE1E4, 0x64A9, 0xBCBA, 0x64AB, 0xBCBE, 0x64AC, 0xBCC0, + 0x64AD, 0xBCBD, 0x64AE, 0xBCBC, 0x64B0, 0xBCB6, 0x64B1, 0xE5BB, + 0x64B2, 0xBCB3, 0x64B3, 0xBCC3, 0x64BB, 0xBED8, 0x64BC, 0xBED9, + 0x64BD, 0xE9A9, 0x64BE, 0xBEE2, 0x64BF, 0xBEDF, 0x64C1, 0xBED6, + 0x64C2, 0xBEDD, 0x64C3, 0xE9AB, 0x64C4, 0xBEDB, 0x64C5, 0xBED5, + 0x64C7, 0xBEDC, 0x64C9, 0xE9A8, 0x64CA, 0xC0BB, 0x64CB, 0xBED7, + 0x64CD, 0xBEDE, 0x64CE, 0xC0BA, 0x64CF, 0xE9A7, 0x64D0, 0xE9A6, + 0x64D2, 0xBEE0, 0x64D4, 0xBEE1, 0x64D6, 0xE9A5, 0x64D7, 0xE9A4, + 0x64D8, 0xC0BC, 0x64D9, 0xE9AE, 0x64DA, 0xBEDA, 0x64DB, 0xE9AC, + 0x64E0, 0xC0BD, 0x64E2, 0xC0C2, 0x64E3, 0xECEA, 0x64E4, 0xECEC, + 0x64E6, 0xC0BF, 0x64E8, 0xECED, 0x64E9, 0xECE9, 0x64EB, 0xECEB, + 0x64EC, 0xC0C0, 0x64ED, 0xC0C3, 0x64EF, 0xECE8, 0x64F0, 0xC0BE, + 0x64F1, 0xC0C1, 0x64F2, 0xC259, 0x64F3, 0xE9AD, 0x64F4, 0xC258, + 0x64F7, 0xC25E, 0x64F8, 0xEFD4, 0x64FA, 0xC25C, 0x64FB, 0xC25D, + 0x64FC, 0xEFD7, 0x64FD, 0xEFD3, 0x64FE, 0xC25A, 0x64FF, 0xEFD1, + 0x6500, 0xC36B, 0x6501, 0xEFD5, 0x6503, 0xEFD6, 0x6504, 0xEFD2, + 0x6506, 0xC25B, 0x6507, 0xF242, 0x6509, 0xF245, 0x650C, 0xF246, + 0x650D, 0xF244, 0x650E, 0xF247, 0x650F, 0xC36C, 0x6510, 0xF243, + 0x6513, 0xF44E, 0x6514, 0xC464, 0x6515, 0xF44D, 0x6516, 0xF44C, + 0x6517, 0xF44B, 0x6518, 0xC463, 0x6519, 0xC465, 0x651B, 0xF5CD, + 0x651C, 0xC4E2, 0x651D, 0xC4E1, 0x6520, 0xF6E1, 0x6521, 0xF6E0, + 0x6522, 0xF6E3, 0x6523, 0xC5CB, 0x6524, 0xC575, 0x6525, 0xF7DD, + 0x6526, 0xF6E2, 0x6529, 0xF7DC, 0x652A, 0xC5CD, 0x652B, 0xC5CC, + 0x652C, 0xC5F3, 0x652D, 0xF8A9, 0x652E, 0xF8EF, 0x652F, 0xA4E4, + 0x6532, 0xD972, 0x6533, 0xE9AF, 0x6536, 0xA6AC, 0x6537, 0xCAF7, + 0x6538, 0xA7F1, 0x6539, 0xA7EF, 0x653B, 0xA7F0, 0x653D, 0xCCC1, + 0x653E, 0xA9F1, 0x653F, 0xAC46, 0x6541, 0xCEE7, 0x6543, 0xCEE8, + 0x6545, 0xAC47, 0x6546, 0xD1CE, 0x6548, 0xAEC4, 0x6549, 0xAEC5, + 0x654A, 0xD1CD, 0x654F, 0xB1D3, 0x6551, 0xB1CF, 0x6553, 0xD5A7, + 0x6554, 0xB1D6, 0x6555, 0xB1D5, 0x6556, 0xB1CE, 0x6557, 0xB1D1, + 0x6558, 0xB1D4, 0x6559, 0xB1D0, 0x655C, 0xD976, 0x655D, 0xB1CD, + 0x655E, 0xB4AF, 0x6562, 0xB4B1, 0x6563, 0xB4B2, 0x6564, 0xD975, + 0x6565, 0xD978, 0x6566, 0xB4B0, 0x6567, 0xD973, 0x6568, 0xD977, + 0x656A, 0xD974, 0x656C, 0xB771, 0x656F, 0xDDBC, 0x6572, 0xBA56, + 0x6573, 0xE1F4, 0x6574, 0xBEE3, 0x6575, 0xBCC4, 0x6576, 0xE5BD, + 0x6577, 0xBCC5, 0x6578, 0xBCC6, 0x6579, 0xE5BF, 0x657A, 0xE5BE, + 0x657B, 0xE5C0, 0x657C, 0xE9B1, 0x657F, 0xE9B0, 0x6580, 0xECEF, + 0x6581, 0xECEE, 0x6582, 0xC0C4, 0x6583, 0xC0C5, 0x6584, 0xF248, + 0x6587, 0xA4E5, 0x658C, 0xD979, 0x6590, 0xB4B4, 0x6591, 0xB4B3, + 0x6592, 0xDDBD, 0x6594, 0xEFD8, 0x6595, 0xC4E3, 0x6596, 0xF7DE, + 0x6597, 0xA4E6, 0x6599, 0xAEC6, 0x659B, 0xB1D8, 0x659C, 0xB1D7, + 0x659D, 0xD97A, 0x659E, 0xD97B, 0x659F, 0xB772, 0x65A0, 0xE1F5, + 0x65A1, 0xBA57, 0x65A2, 0xE9B2, 0x65A4, 0xA4E7, 0x65A5, 0xA5B8, + 0x65A7, 0xA9F2, 0x65A8, 0xCCC2, 0x65AA, 0xCEE9, 0x65AB, 0xAC48, + 0x65AC, 0xB1D9, 0x65AE, 0xD97C, 0x65AF, 0xB4B5, 0x65B0, 0xB773, + 0x65B2, 0xE5C1, 0x65B3, 0xE5C2, 0x65B6, 0xECF0, 0x65B7, 0xC25F, + 0x65B8, 0xF8F0, 0x65B9, 0xA4E8, 0x65BB, 0xCCC3, 0x65BC, 0xA9F3, + 0x65BD, 0xAC49, 0x65BF, 0xCEEA, 0x65C1, 0xAEC7, 0x65C2, 0xD1D2, + 0x65C3, 0xD1D0, 0x65C4, 0xD1D1, 0x65C5, 0xAEC8, 0x65C6, 0xD1CF, + 0x65CB, 0xB1DB, 0x65CC, 0xB1DC, 0x65CD, 0xD5A8, 0x65CE, 0xB1DD, + 0x65CF, 0xB1DA, 0x65D0, 0xD97D, 0x65D2, 0xD97E, 0x65D3, 0xDDBE, + 0x65D6, 0xBA59, 0x65D7, 0xBA58, 0x65DA, 0xECF1, 0x65DB, 0xEFD9, + 0x65DD, 0xF24A, 0x65DE, 0xF249, 0x65DF, 0xF44F, 0x65E1, 0xC95E, + 0x65E2, 0xAC4A, 0x65E5, 0xA4E9, 0x65E6, 0xA5B9, 0x65E8, 0xA6AE, + 0x65E9, 0xA6AD, 0x65EC, 0xA6AF, 0x65ED, 0xA6B0, 0x65EE, 0xC9EE, + 0x65EF, 0xC9ED, 0x65F0, 0xCAF8, 0x65F1, 0xA7F2, 0x65F2, 0xCAFB, + 0x65F3, 0xCAFA, 0x65F4, 0xCAF9, 0x65F5, 0xCAFC, 0x65FA, 0xA9F4, + 0x65FB, 0xCCC9, 0x65FC, 0xCCC5, 0x65FD, 0xCCCE, 0x6600, 0xA9FB, + 0x6602, 0xA9F9, 0x6603, 0xCCCA, 0x6604, 0xCCC6, 0x6605, 0xCCCD, + 0x6606, 0xA9F8, 0x6607, 0xAA40, 0x6608, 0xCCC8, 0x6609, 0xCCC4, + 0x660A, 0xA9FE, 0x660B, 0xCCCB, 0x660C, 0xA9F7, 0x660D, 0xCCCC, + 0x660E, 0xA9FA, 0x660F, 0xA9FC, 0x6610, 0xCCD0, 0x6611, 0xCCCF, + 0x6612, 0xCCC7, 0x6613, 0xA9F6, 0x6614, 0xA9F5, 0x6615, 0xA9FD, + 0x661C, 0xCEEF, 0x661D, 0xCEF5, 0x661F, 0xAC50, 0x6620, 0xAC4D, + 0x6621, 0xCEEC, 0x6622, 0xCEF1, 0x6624, 0xAC53, 0x6625, 0xAC4B, + 0x6626, 0xCEF0, 0x6627, 0xAC4E, 0x6628, 0xAC51, 0x662B, 0xCEF3, + 0x662D, 0xAC4C, 0x662E, 0xCEF8, 0x662F, 0xAC4F, 0x6631, 0xAC52, + 0x6632, 0xCEED, 0x6633, 0xCEF2, 0x6634, 0xCEF6, 0x6635, 0xCEEE, + 0x6636, 0xCEEB, 0x6639, 0xCEF7, 0x663A, 0xCEF4, 0x6641, 0xAED0, + 0x6642, 0xAEC9, 0x6643, 0xAECC, 0x6645, 0xAECF, 0x6647, 0xD1D5, + 0x6649, 0xAECA, 0x664A, 0xD1D3, 0x664C, 0xAECE, 0x664F, 0xAECB, + 0x6651, 0xD1D6, 0x6652, 0xAECD, 0x6659, 0xD5AC, 0x665A, 0xB1DF, + 0x665B, 0xD5AB, 0x665C, 0xD5AD, 0x665D, 0xB1DE, 0x665E, 0xB1E3, + 0x665F, 0xD1D4, 0x6661, 0xD5AA, 0x6662, 0xD5AE, 0x6664, 0xB1E0, + 0x6665, 0xD5A9, 0x6666, 0xB1E2, 0x6668, 0xB1E1, 0x666A, 0xD9A7, + 0x666C, 0xD9A2, 0x666E, 0xB4B6, 0x666F, 0xB4BA, 0x6670, 0xB4B7, + 0x6671, 0xD9A5, 0x6672, 0xD9A8, 0x6674, 0xB4B8, 0x6676, 0xB4B9, + 0x6677, 0xB4BE, 0x6678, 0xDDC7, 0x6679, 0xD9A6, 0x667A, 0xB4BC, + 0x667B, 0xD9A3, 0x667C, 0xD9A1, 0x667E, 0xB4BD, 0x6680, 0xD9A4, + 0x6684, 0xB779, 0x6686, 0xDDBF, 0x6687, 0xB776, 0x6688, 0xB777, + 0x6689, 0xB775, 0x668A, 0xDDC4, 0x668B, 0xDDC3, 0x668C, 0xDDC0, + 0x668D, 0xB77B, 0x6690, 0xDDC2, 0x6691, 0xB4BB, 0x6694, 0xDDC6, + 0x6695, 0xDDC1, 0x6696, 0xB778, 0x6697, 0xB774, 0x6698, 0xB77A, + 0x6699, 0xDDC5, 0x669D, 0xBA5C, 0x669F, 0xE1F8, 0x66A0, 0xE1F7, + 0x66A1, 0xE1F6, 0x66A2, 0xBA5A, 0x66A8, 0xBA5B, 0x66A9, 0xE5C5, + 0x66AA, 0xE5C8, 0x66AB, 0xBCC8, 0x66AE, 0xBCC7, 0x66AF, 0xE5C9, + 0x66B0, 0xE5C4, 0x66B1, 0xBCCA, 0x66B2, 0xE5C6, 0x66B4, 0xBCC9, + 0x66B5, 0xE5C3, 0x66B7, 0xE5C7, 0x66B8, 0xBEE9, 0x66B9, 0xBEE6, + 0x66BA, 0xE9BB, 0x66BB, 0xE9BA, 0x66BD, 0xE9B9, 0x66BE, 0xE9B4, + 0x66C0, 0xE9B5, 0x66C4, 0xBEE7, 0x66C6, 0xBEE4, 0x66C7, 0xBEE8, + 0x66C8, 0xE9B3, 0x66C9, 0xBEE5, 0x66CA, 0xE9B6, 0x66CB, 0xE9B7, + 0x66CC, 0xE9BC, 0x66CF, 0xE9B8, 0x66D2, 0xECF2, 0x66D6, 0xC0C7, + 0x66D8, 0xEFDC, 0x66D9, 0xC0C6, 0x66DA, 0xEFDA, 0x66DB, 0xEFDB, + 0x66DC, 0xC260, 0x66DD, 0xC36E, 0x66DE, 0xF24B, 0x66E0, 0xC36D, + 0x66E3, 0xF451, 0x66E4, 0xF452, 0x66E6, 0xC466, 0x66E8, 0xF450, + 0x66E9, 0xC4E4, 0x66EB, 0xF7DF, 0x66EC, 0xC5CE, 0x66ED, 0xF8AA, + 0x66EE, 0xF8AB, 0x66F0, 0xA4EA, 0x66F2, 0xA6B1, 0x66F3, 0xA6B2, + 0x66F4, 0xA7F3, 0x66F6, 0xCCD1, 0x66F7, 0xAC54, 0x66F8, 0xAED1, + 0x66F9, 0xB1E4, 0x66FC, 0xB0D2, 0x66FE, 0xB4BF, 0x66FF, 0xB4C0, + 0x6700, 0xB3CC, 0x6701, 0xD9A9, 0x6703, 0xB77C, 0x6704, 0xE1FA, + 0x6705, 0xE1F9, 0x6708, 0xA4EB, 0x6709, 0xA6B3, 0x670A, 0xCCD2, + 0x670B, 0xAA42, 0x670D, 0xAA41, 0x670F, 0xCEF9, 0x6710, 0xCEFA, + 0x6712, 0xD1D7, 0x6713, 0xD1D8, 0x6714, 0xAED2, 0x6715, 0xAED3, + 0x6717, 0xAED4, 0x6718, 0xD5AF, 0x671B, 0xB1E6, 0x671D, 0xB4C2, + 0x671F, 0xB4C1, 0x6720, 0xDDC8, 0x6721, 0xDF7A, 0x6722, 0xE1FB, + 0x6723, 0xE9BD, 0x6726, 0xC261, 0x6727, 0xC467, 0x6728, 0xA4EC, + 0x672A, 0xA5BC, 0x672B, 0xA5BD, 0x672C, 0xA5BB, 0x672D, 0xA5BE, + 0x672E, 0xA5BA, 0x6731, 0xA6B6, 0x6733, 0xC9F6, 0x6734, 0xA6B5, + 0x6735, 0xA6B7, 0x6738, 0xC9F1, 0x6739, 0xC9F0, 0x673A, 0xC9F3, + 0x673B, 0xC9F2, 0x673C, 0xC9F5, 0x673D, 0xA6B4, 0x673E, 0xC9EF, + 0x673F, 0xC9F4, 0x6745, 0xCAFD, 0x6746, 0xA7FD, 0x6747, 0xCAFE, + 0x6748, 0xCB43, 0x6749, 0xA7FC, 0x674B, 0xCB47, 0x674C, 0xCB42, + 0x674D, 0xCB45, 0x674E, 0xA7F5, 0x674F, 0xA7F6, 0x6750, 0xA7F7, + 0x6751, 0xA7F8, 0x6753, 0xA840, 0x6755, 0xCB41, 0x6756, 0xA7FA, + 0x6757, 0xA841, 0x6759, 0xCB40, 0x675A, 0xCB46, 0x675C, 0xA7F9, + 0x675D, 0xCB44, 0x675E, 0xA7FB, 0x675F, 0xA7F4, 0x6760, 0xA7FE, + 0x676A, 0xAA57, 0x676C, 0xCCD4, 0x676D, 0xAA43, 0x676F, 0xAA4D, + 0x6770, 0xAA4E, 0x6771, 0xAA46, 0x6772, 0xAA58, 0x6773, 0xAA48, + 0x6774, 0xCCDC, 0x6775, 0xAA53, 0x6776, 0xCCD7, 0x6777, 0xAA49, + 0x6778, 0xCCE6, 0x6779, 0xCCE7, 0x677A, 0xCCDF, 0x677B, 0xCCD8, + 0x677C, 0xAA56, 0x677D, 0xCCE4, 0x677E, 0xAA51, 0x677F, 0xAA4F, + 0x6781, 0xCCE5, 0x6783, 0xCCE3, 0x6784, 0xCCDB, 0x6785, 0xCCD3, + 0x6786, 0xCCDA, 0x6787, 0xAA4A, 0x6789, 0xAA50, 0x678B, 0xAA44, + 0x678C, 0xCCDE, 0x678D, 0xCCDD, 0x678E, 0xCCD5, 0x6790, 0xAA52, + 0x6791, 0xCCE1, 0x6792, 0xCCD6, 0x6793, 0xAA55, 0x6794, 0xCCE8, + 0x6795, 0xAA45, 0x6797, 0xAA4C, 0x6798, 0xCCD9, 0x6799, 0xCCE2, + 0x679A, 0xAA54, 0x679C, 0xAA47, 0x679D, 0xAA4B, 0x679F, 0xCCE0, + 0x67AE, 0xCF5B, 0x67AF, 0xAC5C, 0x67B0, 0xAC69, 0x67B2, 0xCF56, + 0x67B3, 0xCF4C, 0x67B4, 0xAC62, 0x67B5, 0xCF4A, 0x67B6, 0xAC5B, + 0x67B7, 0xCF45, 0x67B8, 0xAC65, 0x67B9, 0xCF52, 0x67BA, 0xCEFE, + 0x67BB, 0xCF41, 0x67C0, 0xCF44, 0x67C1, 0xCEFB, 0x67C2, 0xCF51, + 0x67C3, 0xCF61, 0x67C4, 0xAC60, 0x67C5, 0xCF46, 0x67C6, 0xCF58, + 0x67C8, 0xCEFD, 0x67C9, 0xCF5F, 0x67CA, 0xCF60, 0x67CB, 0xCF63, + 0x67CC, 0xCF5A, 0x67CD, 0xCF4B, 0x67CE, 0xCF53, 0x67CF, 0xAC66, + 0x67D0, 0xAC59, 0x67D1, 0xAC61, 0x67D2, 0xAC6D, 0x67D3, 0xAC56, + 0x67D4, 0xAC58, 0x67D8, 0xCF43, 0x67D9, 0xAC6A, 0x67DA, 0xAC63, + 0x67DB, 0xCF5D, 0x67DC, 0xCF40, 0x67DD, 0xAC6C, 0x67DE, 0xAC67, + 0x67DF, 0xCF49, 0x67E2, 0xAC6B, 0x67E3, 0xCF50, 0x67E4, 0xCF48, + 0x67E5, 0xAC64, 0x67E6, 0xCF5C, 0x67E7, 0xCF54, 0x67E9, 0xAC5E, + 0x67EA, 0xCF62, 0x67EB, 0xCF47, 0x67EC, 0xAC5A, 0x67ED, 0xCF59, + 0x67EE, 0xCF4F, 0x67EF, 0xAC5F, 0x67F0, 0xCF55, 0x67F1, 0xAC57, + 0x67F2, 0xCEFC, 0x67F3, 0xAC68, 0x67F4, 0xAEE3, 0x67F5, 0xAC5D, + 0x67F6, 0xCF4E, 0x67F7, 0xCF4D, 0x67F8, 0xCF42, 0x67FA, 0xCF5E, + 0x67FC, 0xCF57, 0x67FF, 0xAC55, 0x6812, 0xD1EC, 0x6813, 0xAEEA, + 0x6814, 0xD1ED, 0x6816, 0xD1E1, 0x6817, 0xAEDF, 0x6818, 0xAEEB, + 0x681A, 0xD1DA, 0x681C, 0xD1E3, 0x681D, 0xD1EB, 0x681F, 0xD1D9, + 0x6820, 0xD1F4, 0x6821, 0xAED5, 0x6825, 0xD1F3, 0x6826, 0xD1EE, + 0x6828, 0xD1EF, 0x6829, 0xAEDD, 0x682A, 0xAEE8, 0x682B, 0xD1E5, + 0x682D, 0xD1E6, 0x682E, 0xD1F0, 0x682F, 0xD1E7, 0x6831, 0xD1E2, + 0x6832, 0xD1DC, 0x6833, 0xD1DD, 0x6834, 0xD1EA, 0x6835, 0xD1E4, + 0x6838, 0xAED6, 0x6839, 0xAEDA, 0x683A, 0xD1F2, 0x683B, 0xD1DE, + 0x683C, 0xAEE6, 0x683D, 0xAEE2, 0x6840, 0xAEE5, 0x6841, 0xAEEC, + 0x6842, 0xAEDB, 0x6843, 0xAEE7, 0x6844, 0xD1E9, 0x6845, 0xAEE9, + 0x6846, 0xAED8, 0x6848, 0xAED7, 0x6849, 0xD1DB, 0x684B, 0xD1DF, + 0x684C, 0xAEE0, 0x684D, 0xD1F1, 0x684E, 0xD1E8, 0x684F, 0xD1E0, + 0x6850, 0xAEE4, 0x6851, 0xAEE1, 0x6853, 0xAED9, 0x6854, 0xAEDC, + 0x686B, 0xD5C4, 0x686D, 0xD5B4, 0x686E, 0xD5B5, 0x686F, 0xD5B9, + 0x6871, 0xD5C8, 0x6872, 0xD5C5, 0x6874, 0xD5BE, 0x6875, 0xD5BD, + 0x6876, 0xB1ED, 0x6877, 0xD5C1, 0x6878, 0xD5D0, 0x6879, 0xD5B0, + 0x687B, 0xD5D1, 0x687C, 0xD5C3, 0x687D, 0xD5D5, 0x687E, 0xD5C9, + 0x687F, 0xB1EC, 0x6880, 0xD5C7, 0x6881, 0xB1E7, 0x6882, 0xB1FC, + 0x6883, 0xB1F2, 0x6885, 0xB1F6, 0x6886, 0xB1F5, 0x6887, 0xD5B1, + 0x6889, 0xD5CE, 0x688A, 0xD5D4, 0x688B, 0xD5CC, 0x688C, 0xD5D3, + 0x688F, 0xD5C0, 0x6890, 0xD5B2, 0x6891, 0xD5D2, 0x6892, 0xD5C2, + 0x6893, 0xB1EA, 0x6894, 0xB1F7, 0x6896, 0xD5CB, 0x6897, 0xB1F0, + 0x689B, 0xD5CA, 0x689C, 0xD5B3, 0x689D, 0xB1F8, 0x689F, 0xB1FA, + 0x68A0, 0xD5CD, 0x68A1, 0xB1FB, 0x68A2, 0xB1E9, 0x68A3, 0xD5BA, + 0x68A4, 0xD5CF, 0x68A7, 0xB1EF, 0x68A8, 0xB1F9, 0x68A9, 0xD5BC, + 0x68AA, 0xD5C6, 0x68AB, 0xD5B7, 0x68AC, 0xD5BB, 0x68AD, 0xB1F4, + 0x68AE, 0xD5B6, 0x68AF, 0xB1E8, 0x68B0, 0xB1F1, 0x68B1, 0xB1EE, + 0x68B2, 0xD5BF, 0x68B3, 0xAEDE, 0x68B4, 0xD9C0, 0x68B5, 0xB1EB, + 0x68C4, 0xB1F3, 0x68C6, 0xD9C3, 0x68C7, 0xD9D9, 0x68C8, 0xD9CE, + 0x68C9, 0xB4D6, 0x68CB, 0xB4D1, 0x68CC, 0xD9BD, 0x68CD, 0xB4D2, + 0x68CE, 0xD9CD, 0x68D0, 0xD9C6, 0x68D1, 0xD9D3, 0x68D2, 0xB4CE, + 0x68D3, 0xD9AB, 0x68D4, 0xD9D5, 0x68D5, 0xB4C4, 0x68D6, 0xD9B3, + 0x68D7, 0xB4C7, 0x68D8, 0xB4C6, 0x68DA, 0xB4D7, 0x68DC, 0xD9AD, + 0x68DD, 0xD9CF, 0x68DE, 0xD9D0, 0x68DF, 0xB4C9, 0x68E0, 0xB4C5, + 0x68E1, 0xD9BB, 0x68E3, 0xB4D0, 0x68E4, 0xD9B6, 0x68E6, 0xD9D1, + 0x68E7, 0xB4CC, 0x68E8, 0xD9C9, 0x68E9, 0xD9D6, 0x68EA, 0xD9B0, + 0x68EB, 0xD9B5, 0x68EC, 0xD9AF, 0x68EE, 0xB4CB, 0x68EF, 0xD9C2, + 0x68F0, 0xDDDE, 0x68F1, 0xD9B1, 0x68F2, 0xB4CF, 0x68F3, 0xD9BA, + 0x68F4, 0xD9D2, 0x68F5, 0xB4CA, 0x68F6, 0xD9B7, 0x68F7, 0xD9B4, + 0x68F8, 0xD9C5, 0x68F9, 0xB4CD, 0x68FA, 0xB4C3, 0x68FB, 0xB4D9, + 0x68FC, 0xD9C8, 0x68FD, 0xD9C7, 0x6904, 0xD9AC, 0x6905, 0xB4C8, + 0x6906, 0xD9D4, 0x6907, 0xD9BC, 0x6908, 0xD9BE, 0x690A, 0xD9CB, + 0x690B, 0xD9CA, 0x690C, 0xD9AA, 0x690D, 0xB4D3, 0x690E, 0xB4D5, + 0x690F, 0xD9B2, 0x6910, 0xD9B9, 0x6911, 0xD9C1, 0x6912, 0xB4D4, + 0x6913, 0xD9B8, 0x6914, 0xD9C4, 0x6915, 0xD9D7, 0x6917, 0xD9CC, + 0x6925, 0xD9D8, 0x692A, 0xD9AE, 0x692F, 0xDDF2, 0x6930, 0xB7A6, + 0x6932, 0xDDF0, 0x6933, 0xDDDB, 0x6934, 0xDDE0, 0x6935, 0xDDD9, + 0x6937, 0xDDEC, 0x6938, 0xDDCB, 0x6939, 0xDDD2, 0x693B, 0xDDEA, + 0x693C, 0xDDF4, 0x693D, 0xDDDC, 0x693F, 0xDDCF, 0x6940, 0xDDE2, + 0x6941, 0xDDE7, 0x6942, 0xDDD3, 0x6944, 0xDDE4, 0x6945, 0xDDD0, + 0x6948, 0xDDD7, 0x6949, 0xDDD8, 0x694A, 0xB7A8, 0x694B, 0xDDEB, + 0x694C, 0xDDE9, 0x694E, 0xDDCC, 0x694F, 0xDDEE, 0x6951, 0xDDEF, + 0x6952, 0xDDF1, 0x6953, 0xB7AC, 0x6954, 0xB7A4, 0x6956, 0xD5B8, + 0x6957, 0xDDD4, 0x6958, 0xDDE6, 0x6959, 0xDDD5, 0x695A, 0xB7A1, + 0x695B, 0xB7B1, 0x695C, 0xDDED, 0x695D, 0xB7AF, 0x695E, 0xB7AB, + 0x695F, 0xDDCA, 0x6960, 0xB7A3, 0x6962, 0xDDCD, 0x6963, 0xB7B0, + 0x6965, 0xDDDD, 0x6966, 0xDDC9, 0x6968, 0xB7A9, 0x6969, 0xDDE1, + 0x696A, 0xDDD1, 0x696B, 0xB7AA, 0x696C, 0xDDDA, 0x696D, 0xB77E, + 0x696E, 0xB4D8, 0x696F, 0xDDE3, 0x6970, 0xD9BF, 0x6971, 0xDDCE, + 0x6974, 0xDDE8, 0x6975, 0xB7A5, 0x6976, 0xDDE5, 0x6977, 0xB7A2, + 0x6978, 0xDDDF, 0x6979, 0xB7AD, 0x697A, 0xDDD6, 0x697B, 0xDDF3, + 0x6982, 0xB7A7, 0x6983, 0xDEC6, 0x6986, 0xB7AE, 0x698D, 0xE24A, + 0x698E, 0xE248, 0x6990, 0xE25E, 0x6991, 0xE246, 0x6993, 0xE258, + 0x6994, 0xB77D, 0x6995, 0xBA5F, 0x6996, 0xE242, 0x6997, 0xE25D, + 0x6999, 0xE247, 0x699A, 0xE255, 0x699B, 0xBA64, 0x699C, 0xBA5D, + 0x699E, 0xE25B, 0x69A0, 0xE240, 0x69A1, 0xE25A, 0x69A3, 0xBA6F, + 0x69A4, 0xE251, 0x69A5, 0xE261, 0x69A6, 0xBA6D, 0x69A7, 0xE249, + 0x69A8, 0xBA5E, 0x69A9, 0xE24B, 0x69AA, 0xE259, 0x69AB, 0xBA67, + 0x69AC, 0xE244, 0x69AD, 0xBA6B, 0x69AE, 0xBA61, 0x69AF, 0xE24D, + 0x69B0, 0xE243, 0x69B1, 0xE1FC, 0x69B3, 0xE257, 0x69B4, 0xBA68, + 0x69B5, 0xE260, 0x69B6, 0xE1FD, 0x69B7, 0xBA65, 0x69B9, 0xE253, + 0x69BB, 0xBA66, 0x69BC, 0xE245, 0x69BD, 0xE250, 0x69BE, 0xE24C, + 0x69BF, 0xE24E, 0x69C1, 0xBA60, 0x69C2, 0xE25F, 0x69C3, 0xBA6E, + 0x69C4, 0xE24F, 0x69C6, 0xE262, 0x69C9, 0xE1FE, 0x69CA, 0xE254, + 0x69CB, 0xBA63, 0x69CC, 0xBA6C, 0x69CD, 0xBA6A, 0x69CE, 0xE241, + 0x69CF, 0xE256, 0x69D0, 0xBA69, 0x69D3, 0xBA62, 0x69D4, 0xE252, + 0x69D9, 0xE25C, 0x69E2, 0xE5D5, 0x69E4, 0xE5D1, 0x69E5, 0xE5CD, + 0x69E6, 0xE5E1, 0x69E7, 0xE5DE, 0x69E8, 0xBCCD, 0x69EB, 0xE5E5, + 0x69EC, 0xE5D4, 0x69ED, 0xBCD8, 0x69EE, 0xE5DB, 0x69F1, 0xE5D0, + 0x69F2, 0xE5DA, 0x69F3, 0xBCD5, 0x69F4, 0xE5EE, 0x69F6, 0xE5EB, + 0x69F7, 0xE5DD, 0x69F8, 0xE5CE, 0x69FB, 0xE5E2, 0x69FC, 0xE5E4, + 0x69FD, 0xBCD1, 0x69FE, 0xE5D8, 0x69FF, 0xE5D3, 0x6A00, 0xE5CA, + 0x6A01, 0xBCCE, 0x6A02, 0xBCD6, 0x6A04, 0xE5E7, 0x6A05, 0xBCD7, + 0x6A06, 0xE5CB, 0x6A07, 0xE5ED, 0x6A08, 0xE5E0, 0x6A09, 0xE5E6, + 0x6A0A, 0xBCD4, 0x6A0D, 0xE5E3, 0x6A0F, 0xE5EA, 0x6A11, 0xBCD9, + 0x6A13, 0xBCD3, 0x6A14, 0xE5DC, 0x6A15, 0xE5CF, 0x6A16, 0xE5EF, + 0x6A17, 0xE5CC, 0x6A18, 0xE5E8, 0x6A19, 0xBCD0, 0x6A1B, 0xE5D6, + 0x6A1D, 0xE5D7, 0x6A1E, 0xBCCF, 0x6A1F, 0xBCCC, 0x6A20, 0xE5D2, + 0x6A21, 0xBCD2, 0x6A23, 0xBCCB, 0x6A25, 0xE5E9, 0x6A26, 0xE5EC, + 0x6A27, 0xE5D9, 0x6A28, 0xE9CA, 0x6A32, 0xE9C2, 0x6A34, 0xE9BE, + 0x6A35, 0xBEF6, 0x6A38, 0xBEEB, 0x6A39, 0xBEF0, 0x6A3A, 0xBEEC, + 0x6A3B, 0xE9CC, 0x6A3C, 0xE9D7, 0x6A3D, 0xBEEA, 0x6A3E, 0xE9C4, + 0x6A3F, 0xE9CD, 0x6A40, 0xE5DF, 0x6A41, 0xE9CE, 0x6A44, 0xBEF1, + 0x6A46, 0xE9DD, 0x6A47, 0xBEF5, 0x6A48, 0xBEF8, 0x6A49, 0xE9C0, + 0x6A4B, 0xBEF4, 0x6A4D, 0xE9DB, 0x6A4E, 0xE9DC, 0x6A4F, 0xE9D2, + 0x6A50, 0xE9D1, 0x6A51, 0xE9C9, 0x6A54, 0xE9D3, 0x6A55, 0xE9DA, + 0x6A56, 0xE9D9, 0x6A58, 0xBEEF, 0x6A59, 0xBEED, 0x6A5A, 0xE9CB, + 0x6A5B, 0xE9C8, 0x6A5D, 0xE9C5, 0x6A5E, 0xE9D8, 0x6A5F, 0xBEF7, + 0x6A60, 0xE9D6, 0x6A61, 0xBEF3, 0x6A62, 0xBEF2, 0x6A64, 0xE9D0, + 0x6A66, 0xE9BF, 0x6A67, 0xE9C1, 0x6A68, 0xE9C3, 0x6A69, 0xE9D5, + 0x6A6A, 0xE9CF, 0x6A6B, 0xBEEE, 0x6A6D, 0xE9C6, 0x6A6F, 0xE9D4, + 0x6A76, 0xE9C7, 0x6A7E, 0xC0CF, 0x6A7F, 0xED45, 0x6A80, 0xC0C8, + 0x6A81, 0xECF5, 0x6A83, 0xED41, 0x6A84, 0xC0CA, 0x6A85, 0xED48, + 0x6A87, 0xECFC, 0x6A89, 0xECF7, 0x6A8C, 0xED49, 0x6A8D, 0xECF3, + 0x6A8E, 0xECFE, 0x6A90, 0xC0D1, 0x6A91, 0xED44, 0x6A92, 0xED4A, + 0x6A93, 0xECFD, 0x6A94, 0xC0C9, 0x6A95, 0xED40, 0x6A96, 0xECF4, + 0x6A97, 0xC0D0, 0x6A9A, 0xED47, 0x6A9B, 0xECF9, 0x6A9C, 0xC0CC, + 0x6A9E, 0xECFB, 0x6A9F, 0xECF8, 0x6AA0, 0xC0D2, 0x6AA1, 0xECFA, + 0x6AA2, 0xC0CB, 0x6AA3, 0xC0CE, 0x6AA4, 0xED43, 0x6AA5, 0xECF6, + 0x6AA6, 0xED46, 0x6AA8, 0xED42, 0x6AAC, 0xC263, 0x6AAD, 0xEFE7, + 0x6AAE, 0xC268, 0x6AAF, 0xC269, 0x6AB3, 0xC262, 0x6AB4, 0xEFE6, + 0x6AB6, 0xEFE3, 0x6AB7, 0xEFE4, 0x6AB8, 0xC266, 0x6AB9, 0xEFDE, + 0x6ABA, 0xEFE2, 0x6ABB, 0xC265, 0x6ABD, 0xEFDF, 0x6AC2, 0xC267, + 0x6AC3, 0xC264, 0x6AC5, 0xEFDD, 0x6AC6, 0xEFE1, 0x6AC7, 0xEFE5, + 0x6ACB, 0xF251, 0x6ACC, 0xF24E, 0x6ACD, 0xF257, 0x6ACF, 0xF256, + 0x6AD0, 0xF254, 0x6AD1, 0xF24F, 0x6AD3, 0xC372, 0x6AD9, 0xF250, + 0x6ADA, 0xC371, 0x6ADB, 0xC0CD, 0x6ADC, 0xF253, 0x6ADD, 0xC370, + 0x6ADE, 0xF258, 0x6ADF, 0xF252, 0x6AE0, 0xF24D, 0x6AE1, 0xEFE0, + 0x6AE5, 0xC36F, 0x6AE7, 0xF24C, 0x6AE8, 0xF456, 0x6AEA, 0xF455, + 0x6AEB, 0xF255, 0x6AEC, 0xC468, 0x6AEE, 0xF459, 0x6AEF, 0xF45A, + 0x6AF0, 0xF454, 0x6AF1, 0xF458, 0x6AF3, 0xF453, 0x6AF8, 0xF5D1, + 0x6AF9, 0xF457, 0x6AFA, 0xC4E7, 0x6AFB, 0xC4E5, 0x6AFC, 0xF5CF, + 0x6B00, 0xF5D2, 0x6B02, 0xF5CE, 0x6B03, 0xF5D0, 0x6B04, 0xC4E6, + 0x6B08, 0xF6E5, 0x6B09, 0xF6E6, 0x6B0A, 0xC576, 0x6B0B, 0xF6E4, + 0x6B0F, 0xF7E2, 0x6B10, 0xC5CF, 0x6B11, 0xF7E0, 0x6B12, 0xF7E1, + 0x6B13, 0xF8AC, 0x6B16, 0xC656, 0x6B17, 0xF8F3, 0x6B18, 0xF8F1, + 0x6B19, 0xF8F2, 0x6B1A, 0xF8F4, 0x6B1E, 0xF9BB, 0x6B20, 0xA4ED, + 0x6B21, 0xA6B8, 0x6B23, 0xAA59, 0x6B25, 0xCCE9, 0x6B28, 0xCF64, + 0x6B2C, 0xD1F5, 0x6B2D, 0xD1F7, 0x6B2F, 0xD1F6, 0x6B31, 0xD1F8, + 0x6B32, 0xB1FD, 0x6B33, 0xD5D7, 0x6B34, 0xD1F9, 0x6B36, 0xD5D6, + 0x6B37, 0xD5D8, 0x6B38, 0xD5D9, 0x6B39, 0xD9DA, 0x6B3A, 0xB4DB, + 0x6B3B, 0xD9DB, 0x6B3C, 0xD9DD, 0x6B3D, 0xB4DC, 0x6B3E, 0xB4DA, + 0x6B3F, 0xD9DC, 0x6B41, 0xDDFA, 0x6B42, 0xDDF8, 0x6B43, 0xDDF7, + 0x6B45, 0xDDF6, 0x6B46, 0xDDF5, 0x6B47, 0xB7B2, 0x6B48, 0xDDF9, + 0x6B49, 0xBA70, 0x6B4A, 0xE263, 0x6B4B, 0xE265, 0x6B4C, 0xBA71, + 0x6B4D, 0xE264, 0x6B4E, 0xBCDB, 0x6B50, 0xBCDA, 0x6B51, 0xE5F0, + 0x6B54, 0xE9DF, 0x6B55, 0xE9DE, 0x6B56, 0xE9E0, 0x6B59, 0xBEF9, + 0x6B5B, 0xED4B, 0x6B5C, 0xC0D3, 0x6B5E, 0xEFE8, 0x6B5F, 0xC26A, + 0x6B60, 0xF259, 0x6B61, 0xC577, 0x6B62, 0xA4EE, 0x6B63, 0xA5BF, + 0x6B64, 0xA6B9, 0x6B65, 0xA842, 0x6B66, 0xAA5A, 0x6B67, 0xAA5B, + 0x6B6A, 0xAC6E, 0x6B6D, 0xD1FA, 0x6B72, 0xB7B3, 0x6B76, 0xE6D1, + 0x6B77, 0xBEFA, 0x6B78, 0xC26B, 0x6B79, 0xA4EF, 0x6B7B, 0xA6BA, + 0x6B7E, 0xCCEB, 0x6B7F, 0xAA5C, 0x6B80, 0xCCEA, 0x6B82, 0xCF65, + 0x6B83, 0xAC6F, 0x6B84, 0xCF66, 0x6B86, 0xAC70, 0x6B88, 0xD1FC, + 0x6B89, 0xAEEE, 0x6B8A, 0xAEED, 0x6B8C, 0xD5DE, 0x6B8D, 0xD5DC, + 0x6B8E, 0xD5DD, 0x6B8F, 0xD5DB, 0x6B91, 0xD5DA, 0x6B94, 0xD9DE, + 0x6B95, 0xD9E1, 0x6B96, 0xB4DE, 0x6B97, 0xD9DF, 0x6B98, 0xB4DD, + 0x6B99, 0xD9E0, 0x6B9B, 0xDDFB, 0x6B9E, 0xE266, 0x6B9F, 0xE267, + 0x6BA0, 0xE268, 0x6BA2, 0xE5F3, 0x6BA3, 0xE5F2, 0x6BA4, 0xBCDC, + 0x6BA5, 0xE5F1, 0x6BA6, 0xE5F4, 0x6BA7, 0xE9E1, 0x6BAA, 0xE9E2, + 0x6BAB, 0xE9E3, 0x6BAD, 0xED4C, 0x6BAE, 0xC0D4, 0x6BAF, 0xC26C, + 0x6BB0, 0xF25A, 0x6BB2, 0xC4E8, 0x6BB3, 0xC95F, 0x6BB5, 0xAC71, + 0x6BB6, 0xCF67, 0x6BB7, 0xAEEF, 0x6BBA, 0xB1FE, 0x6BBC, 0xB4DF, + 0x6BBD, 0xD9E2, 0x6BBF, 0xB7B5, 0x6BC0, 0xB7B4, 0x6BC3, 0xE269, + 0x6BC4, 0xE26A, 0x6BC5, 0xBCDD, 0x6BC6, 0xBCDE, 0x6BC7, 0xE9E5, + 0x6BC8, 0xE9E4, 0x6BC9, 0xEFE9, 0x6BCA, 0xF7E3, 0x6BCB, 0xA4F0, + 0x6BCC, 0xC960, 0x6BCD, 0xA5C0, 0x6BCF, 0xA843, 0x6BD0, 0xCB48, + 0x6BD2, 0xAC72, 0x6BD3, 0xB7B6, 0x6BD4, 0xA4F1, 0x6BD6, 0xCF68, + 0x6BD7, 0xAC73, 0x6BD8, 0xCF69, 0x6BDA, 0xC0D5, 0x6BDB, 0xA4F2, + 0x6BDE, 0xCCEC, 0x6BE0, 0xCF6A, 0x6BE2, 0xD242, 0x6BE3, 0xD241, + 0x6BE4, 0xD1FE, 0x6BE6, 0xD1FD, 0x6BE7, 0xD243, 0x6BE8, 0xD240, + 0x6BEB, 0xB240, 0x6BEC, 0xB241, 0x6BEF, 0xB4E0, 0x6BF0, 0xD9E3, + 0x6BF2, 0xD9E4, 0x6BF3, 0xD9E5, 0x6BF7, 0xDE41, 0x6BF8, 0xDE42, + 0x6BF9, 0xDE40, 0x6BFB, 0xDDFD, 0x6BFC, 0xDDFE, 0x6BFD, 0xB7B7, + 0x6BFE, 0xE26B, 0x6BFF, 0xE5F7, 0x6C00, 0xE5F6, 0x6C01, 0xE5F5, + 0x6C02, 0xE5F8, 0x6C03, 0xE9E7, 0x6C04, 0xE9E6, 0x6C05, 0xBEFB, + 0x6C06, 0xE9E8, 0x6C08, 0xC0D6, 0x6C09, 0xED4D, 0x6C0B, 0xEFEA, + 0x6C0C, 0xF25B, 0x6C0D, 0xF6E7, 0x6C0F, 0xA4F3, 0x6C10, 0xA5C2, + 0x6C11, 0xA5C1, 0x6C13, 0xAA5D, 0x6C14, 0xC961, 0x6C15, 0xC97E, + 0x6C16, 0xA6BB, 0x6C18, 0xC9F7, 0x6C19, 0xCB49, 0x6C1A, 0xCB4A, + 0x6C1B, 0xAA5E, 0x6C1D, 0xCCED, 0x6C1F, 0xAC74, 0x6C20, 0xCF6B, + 0x6C21, 0xCF6C, 0x6C23, 0xAEF0, 0x6C24, 0xAEF4, 0x6C25, 0xD244, + 0x6C26, 0xAEF3, 0x6C27, 0xAEF1, 0x6C28, 0xAEF2, 0x6C2A, 0xD5DF, + 0x6C2B, 0xB242, 0x6C2C, 0xB4E3, 0x6C2E, 0xB4E1, 0x6C2F, 0xB4E2, + 0x6C30, 0xD9E6, 0x6C33, 0xBA72, 0x6C34, 0xA4F4, 0x6C36, 0xC9A1, + 0x6C38, 0xA5C3, 0x6C3B, 0xC9A4, 0x6C3E, 0xA5C6, 0x6C3F, 0xC9A3, + 0x6C40, 0xA5C5, 0x6C41, 0xA5C4, 0x6C42, 0xA844, 0x6C43, 0xC9A2, + 0x6C46, 0xC9F8, 0x6C4A, 0xC9FC, 0x6C4B, 0xC9FE, 0x6C4C, 0xCA40, + 0x6C4D, 0xA6C5, 0x6C4E, 0xA6C6, 0x6C4F, 0xC9FB, 0x6C50, 0xA6C1, + 0x6C52, 0xC9F9, 0x6C54, 0xC9FD, 0x6C55, 0xA6C2, 0x6C57, 0xA6BD, + 0x6C59, 0xA6BE, 0x6C5B, 0xA6C4, 0x6C5C, 0xC9FA, 0x6C5D, 0xA6BC, + 0x6C5E, 0xA845, 0x6C5F, 0xA6BF, 0x6C60, 0xA6C0, 0x6C61, 0xA6C3, + 0x6C65, 0xCB5B, 0x6C66, 0xCB59, 0x6C67, 0xCB4C, 0x6C68, 0xA851, + 0x6C69, 0xCB53, 0x6C6A, 0xA84C, 0x6C6B, 0xCB4D, 0x6C6D, 0xCB55, + 0x6C6F, 0xCB52, 0x6C70, 0xA84F, 0x6C71, 0xCB51, 0x6C72, 0xA856, + 0x6C73, 0xCB5A, 0x6C74, 0xA858, 0x6C76, 0xA85A, 0x6C78, 0xCB4B, + 0x6C7A, 0xA84D, 0x6C7B, 0xCB5C, 0x6C7D, 0xA854, 0x6C7E, 0xA857, + 0x6C80, 0xCD45, 0x6C81, 0xA847, 0x6C82, 0xA85E, 0x6C83, 0xA855, + 0x6C84, 0xCB4E, 0x6C85, 0xA84A, 0x6C86, 0xA859, 0x6C87, 0xCB56, + 0x6C88, 0xA848, 0x6C89, 0xA849, 0x6C8A, 0xCD43, 0x6C8B, 0xCB4F, + 0x6C8C, 0xA850, 0x6C8D, 0xA85B, 0x6C8E, 0xCB5D, 0x6C8F, 0xCB50, + 0x6C90, 0xA84E, 0x6C92, 0xA853, 0x6C93, 0xCCEE, 0x6C94, 0xA85C, + 0x6C95, 0xCB57, 0x6C96, 0xA852, 0x6C98, 0xA85D, 0x6C99, 0xA846, + 0x6C9A, 0xCB54, 0x6C9B, 0xA84B, 0x6C9C, 0xCB58, 0x6C9D, 0xCD44, + 0x6CAB, 0xAA6A, 0x6CAC, 0xAA7A, 0x6CAD, 0xCCF5, 0x6CAE, 0xAA71, + 0x6CB0, 0xCD4B, 0x6CB1, 0xAA62, 0x6CB3, 0xAA65, 0x6CB4, 0xCD42, + 0x6CB6, 0xCCF3, 0x6CB7, 0xCCF7, 0x6CB8, 0xAA6D, 0x6CB9, 0xAA6F, + 0x6CBA, 0xCCFA, 0x6CBB, 0xAA76, 0x6CBC, 0xAA68, 0x6CBD, 0xAA66, + 0x6CBE, 0xAA67, 0x6CBF, 0xAA75, 0x6CC0, 0xCD47, 0x6CC1, 0xAA70, + 0x6CC2, 0xCCF9, 0x6CC3, 0xCCFB, 0x6CC4, 0xAA6E, 0x6CC5, 0xAA73, + 0x6CC6, 0xCCFC, 0x6CC7, 0xCD4A, 0x6CC9, 0xAC75, 0x6CCA, 0xAA79, + 0x6CCC, 0xAA63, 0x6CCD, 0xCD49, 0x6CCF, 0xCD4D, 0x6CD0, 0xCCF8, + 0x6CD1, 0xCD4F, 0x6CD2, 0xCD40, 0x6CD3, 0xAA6C, 0x6CD4, 0xCCF4, + 0x6CD5, 0xAA6B, 0x6CD6, 0xAA7D, 0x6CD7, 0xAA72, 0x6CD9, 0xCCF2, + 0x6CDA, 0xCF75, 0x6CDB, 0xAA78, 0x6CDC, 0xAA7C, 0x6CDD, 0xCD41, + 0x6CDE, 0xCD46, 0x6CE0, 0xAA7E, 0x6CE1, 0xAA77, 0x6CE2, 0xAA69, + 0x6CE3, 0xAA5F, 0x6CE5, 0xAA64, 0x6CE7, 0xCCF6, 0x6CE8, 0xAA60, + 0x6CE9, 0xCD4E, 0x6CEB, 0xCCF0, 0x6CEC, 0xCCEF, 0x6CED, 0xCCFD, + 0x6CEE, 0xCCF1, 0x6CEF, 0xAA7B, 0x6CF0, 0xAEF5, 0x6CF1, 0xAA74, + 0x6CF2, 0xCCFE, 0x6CF3, 0xAA61, 0x6CF5, 0xACA6, 0x6CF9, 0xCD4C, + 0x6D00, 0xCF7C, 0x6D01, 0xCFA1, 0x6D03, 0xCFA4, 0x6D04, 0xCF77, + 0x6D07, 0xCFA7, 0x6D08, 0xCFAA, 0x6D09, 0xCFAC, 0x6D0A, 0xCF74, + 0x6D0B, 0xAC76, 0x6D0C, 0xAC7B, 0x6D0D, 0xD249, 0x6D0E, 0xACAD, + 0x6D0F, 0xCFA5, 0x6D10, 0xCFAD, 0x6D11, 0xCF7B, 0x6D12, 0xCF73, + 0x6D16, 0xD264, 0x6D17, 0xAC7E, 0x6D18, 0xCFA2, 0x6D19, 0xCF78, + 0x6D1A, 0xCF7A, 0x6D1B, 0xACA5, 0x6D1D, 0xCF7D, 0x6D1E, 0xAC7D, + 0x6D1F, 0xCF70, 0x6D20, 0xCFA8, 0x6D22, 0xCFAB, 0x6D25, 0xAC7A, + 0x6D27, 0xACA8, 0x6D28, 0xCF6D, 0x6D29, 0xACAA, 0x6D2A, 0xAC78, + 0x6D2B, 0xACAE, 0x6D2C, 0xCFA9, 0x6D2D, 0xCF6F, 0x6D2E, 0xACAB, + 0x6D2F, 0xD25E, 0x6D30, 0xCD48, 0x6D31, 0xAC7C, 0x6D32, 0xAC77, + 0x6D33, 0xCF76, 0x6D34, 0xCF6E, 0x6D35, 0xACAC, 0x6D36, 0xACA4, + 0x6D37, 0xCFA3, 0x6D38, 0xACA9, 0x6D39, 0xACA7, 0x6D3A, 0xCF79, + 0x6D3B, 0xACA1, 0x6D3C, 0xCF71, 0x6D3D, 0xACA2, 0x6D3E, 0xACA3, + 0x6D3F, 0xCF72, 0x6D40, 0xCFA6, 0x6D41, 0xAC79, 0x6D42, 0xCF7E, + 0x6D58, 0xD24C, 0x6D59, 0xAEFD, 0x6D5A, 0xAF43, 0x6D5E, 0xD255, + 0x6D5F, 0xD25B, 0x6D60, 0xD257, 0x6D61, 0xD24A, 0x6D62, 0xD24D, + 0x6D63, 0xD246, 0x6D64, 0xD247, 0x6D65, 0xAF4A, 0x6D66, 0xAEFA, + 0x6D67, 0xD256, 0x6D68, 0xD25F, 0x6D69, 0xAF45, 0x6D6A, 0xAEF6, + 0x6D6C, 0xAF40, 0x6D6D, 0xD24E, 0x6D6E, 0xAF42, 0x6D6F, 0xD24F, + 0x6D70, 0xD259, 0x6D74, 0xAF44, 0x6D75, 0xD268, 0x6D76, 0xD248, + 0x6D77, 0xAEFC, 0x6D78, 0xAEFB, 0x6D79, 0xAF48, 0x6D7A, 0xD245, + 0x6D7B, 0xD266, 0x6D7C, 0xD25A, 0x6D7D, 0xD267, 0x6D7E, 0xD261, + 0x6D7F, 0xD253, 0x6D80, 0xD262, 0x6D82, 0xD25C, 0x6D83, 0xD265, + 0x6D84, 0xD263, 0x6D85, 0xAF49, 0x6D86, 0xD254, 0x6D87, 0xAEF9, + 0x6D88, 0xAEF8, 0x6D89, 0xAF41, 0x6D8A, 0xAF47, 0x6D8B, 0xD260, + 0x6D8C, 0xAF46, 0x6D8D, 0xD251, 0x6D8E, 0xB243, 0x6D90, 0xD269, + 0x6D91, 0xD250, 0x6D92, 0xD24B, 0x6D93, 0xAEFE, 0x6D94, 0xAF4B, + 0x6D95, 0xAEF7, 0x6D97, 0xD258, 0x6D98, 0xD25D, 0x6DAA, 0xB265, + 0x6DAB, 0xD5E1, 0x6DAC, 0xD5E5, 0x6DAE, 0xB252, 0x6DAF, 0xB250, + 0x6DB2, 0xB247, 0x6DB3, 0xD5E3, 0x6DB4, 0xD5E2, 0x6DB5, 0xB25B, + 0x6DB7, 0xD5E8, 0x6DB8, 0xB255, 0x6DBA, 0xD5FA, 0x6DBB, 0xD647, + 0x6DBC, 0xB244, 0x6DBD, 0xD5F7, 0x6DBE, 0xD5F0, 0x6DBF, 0xB267, + 0x6DC0, 0xD5E0, 0x6DC2, 0xD5FC, 0x6DC4, 0xB264, 0x6DC5, 0xB258, + 0x6DC6, 0xB263, 0x6DC7, 0xB24E, 0x6DC8, 0xD5EC, 0x6DC9, 0xD5FE, + 0x6DCA, 0xD5F6, 0x6DCB, 0xB24F, 0x6DCC, 0xB249, 0x6DCD, 0xD645, + 0x6DCF, 0xD5FD, 0x6DD0, 0xD640, 0x6DD1, 0xB251, 0x6DD2, 0xB259, + 0x6DD3, 0xD642, 0x6DD4, 0xD5EA, 0x6DD5, 0xD5FB, 0x6DD6, 0xD5EF, + 0x6DD7, 0xD644, 0x6DD8, 0xB25E, 0x6DD9, 0xB246, 0x6DDA, 0xB25C, + 0x6DDB, 0xD5F4, 0x6DDC, 0xD5F2, 0x6DDD, 0xD5F3, 0x6DDE, 0xB253, + 0x6DDF, 0xD5EE, 0x6DE0, 0xD5ED, 0x6DE1, 0xB248, 0x6DE2, 0xD5E7, + 0x6DE3, 0xD646, 0x6DE4, 0xB24A, 0x6DE5, 0xD5F1, 0x6DE6, 0xB268, + 0x6DE8, 0xB262, 0x6DE9, 0xD5E6, 0x6DEA, 0xB25F, 0x6DEB, 0xB25D, + 0x6DEC, 0xB266, 0x6DED, 0xD5F8, 0x6DEE, 0xB261, 0x6DEF, 0xD252, + 0x6DF0, 0xD5F9, 0x6DF1, 0xB260, 0x6DF2, 0xD641, 0x6DF3, 0xB245, + 0x6DF4, 0xD5F5, 0x6DF5, 0xB257, 0x6DF6, 0xD5E9, 0x6DF7, 0xB256, + 0x6DF9, 0xB254, 0x6DFA, 0xB24C, 0x6DFB, 0xB24B, 0x6DFC, 0xD9E7, + 0x6DFD, 0xD643, 0x6E00, 0xD5EB, 0x6E03, 0xD9FC, 0x6E05, 0xB24D, + 0x6E19, 0xB541, 0x6E1A, 0xB25A, 0x6E1B, 0xB4EE, 0x6E1C, 0xD9F6, + 0x6E1D, 0xB4FC, 0x6E1F, 0xD9EA, 0x6E20, 0xB4EB, 0x6E21, 0xB4E7, + 0x6E22, 0xDA49, 0x6E23, 0xB4ED, 0x6E24, 0xB4F1, 0x6E25, 0xB4EC, + 0x6E26, 0xB4F5, 0x6E27, 0xDA4D, 0x6E28, 0xDA44, 0x6E2B, 0xD9F1, + 0x6E2C, 0xB4FA, 0x6E2D, 0xB4F4, 0x6E2E, 0xD9FD, 0x6E2F, 0xB4E4, + 0x6E30, 0xDA4A, 0x6E31, 0xDA43, 0x6E32, 0xB4E8, 0x6E33, 0xD9F7, + 0x6E34, 0xB4F7, 0x6E35, 0xDA55, 0x6E36, 0xDA56, 0x6E38, 0xB4E5, + 0x6E39, 0xDA48, 0x6E3A, 0xB4F9, 0x6E3B, 0xD9FB, 0x6E3C, 0xD9ED, + 0x6E3D, 0xD9EE, 0x6E3E, 0xB4FD, 0x6E3F, 0xD9F2, 0x6E40, 0xD9F9, + 0x6E41, 0xD9F3, 0x6E43, 0xB4FB, 0x6E44, 0xB544, 0x6E45, 0xD9EF, + 0x6E46, 0xD9E8, 0x6E47, 0xD9E9, 0x6E49, 0xD9EB, 0x6E4A, 0xB4EA, + 0x6E4B, 0xD9F8, 0x6E4D, 0xB4F8, 0x6E4E, 0xB542, 0x6E51, 0xD9FA, + 0x6E52, 0xDA53, 0x6E53, 0xDA4B, 0x6E54, 0xB4E6, 0x6E55, 0xDA51, + 0x6E56, 0xB4F2, 0x6E58, 0xB4F0, 0x6E5A, 0xDA57, 0x6E5B, 0xB4EF, + 0x6E5C, 0xDA41, 0x6E5D, 0xD9F4, 0x6E5E, 0xD9FE, 0x6E5F, 0xB547, + 0x6E60, 0xDA45, 0x6E61, 0xDA42, 0x6E62, 0xD9F0, 0x6E63, 0xB543, + 0x6E64, 0xDA4F, 0x6E65, 0xDA4C, 0x6E66, 0xDA54, 0x6E67, 0xB4E9, + 0x6E68, 0xDA40, 0x6E69, 0xB546, 0x6E6B, 0xDA47, 0x6E6E, 0xB4F3, + 0x6E6F, 0xB4F6, 0x6E71, 0xDA46, 0x6E72, 0xB545, 0x6E73, 0xD9F5, + 0x6E74, 0xD5E4, 0x6E77, 0xDA50, 0x6E78, 0xDA4E, 0x6E79, 0xDA52, + 0x6E88, 0xD9EC, 0x6E89, 0xB540, 0x6E8D, 0xDE61, 0x6E8E, 0xDE60, + 0x6E8F, 0xDE46, 0x6E90, 0xB7BD, 0x6E92, 0xDE5F, 0x6E93, 0xDE49, + 0x6E94, 0xDE4A, 0x6E96, 0xB7C7, 0x6E97, 0xDE68, 0x6E98, 0xB7C2, + 0x6E99, 0xDE5E, 0x6E9B, 0xDE43, 0x6E9C, 0xB7C8, 0x6E9D, 0xB7BE, + 0x6E9E, 0xDE52, 0x6E9F, 0xDE48, 0x6EA0, 0xDE4B, 0x6EA1, 0xDE63, + 0x6EA2, 0xB7B8, 0x6EA3, 0xDE6A, 0x6EA4, 0xDE62, 0x6EA5, 0xB7C1, + 0x6EA6, 0xDE57, 0x6EA7, 0xB7CC, 0x6EAA, 0xB7CB, 0x6EAB, 0xB7C5, + 0x6EAE, 0xDE69, 0x6EAF, 0xB7B9, 0x6EB0, 0xDE55, 0x6EB1, 0xDE4C, + 0x6EB2, 0xDE59, 0x6EB3, 0xDE65, 0x6EB4, 0xB7CD, 0x6EB6, 0xB7BB, + 0x6EB7, 0xDE54, 0x6EB9, 0xDE4D, 0x6EBA, 0xB7C4, 0x6EBC, 0xB7C3, + 0x6EBD, 0xDE50, 0x6EBE, 0xDE5A, 0x6EBF, 0xDE64, 0x6EC0, 0xDE47, + 0x6EC1, 0xDE51, 0x6EC2, 0xB7BC, 0x6EC3, 0xDE5B, 0x6EC4, 0xB7C9, + 0x6EC5, 0xB7C0, 0x6EC6, 0xDE4E, 0x6EC7, 0xB7BF, 0x6EC8, 0xDE45, + 0x6EC9, 0xDE53, 0x6ECA, 0xDE67, 0x6ECB, 0xB4FE, 0x6ECC, 0xBAB0, + 0x6ECD, 0xDE56, 0x6ECE, 0xE26C, 0x6ECF, 0xDE58, 0x6ED0, 0xDE66, + 0x6ED1, 0xB7C6, 0x6ED2, 0xDE4F, 0x6ED3, 0xB7BA, 0x6ED4, 0xB7CA, + 0x6ED5, 0xBCF0, 0x6ED6, 0xDE44, 0x6ED8, 0xDE5D, 0x6EDC, 0xDE5C, + 0x6EEB, 0xE2AA, 0x6EEC, 0xBAAD, 0x6EED, 0xE27D, 0x6EEE, 0xE2A4, + 0x6EEF, 0xBAA2, 0x6EF1, 0xE26E, 0x6EF2, 0xBAAF, 0x6EF4, 0xBA77, + 0x6EF5, 0xE26D, 0x6EF6, 0xE2B0, 0x6EF7, 0xBAB1, 0x6EF8, 0xE271, + 0x6EF9, 0xE2A3, 0x6EFB, 0xE273, 0x6EFC, 0xE2B3, 0x6EFD, 0xE2AF, + 0x6EFE, 0xBA75, 0x6EFF, 0xBAA1, 0x6F00, 0xE653, 0x6F01, 0xBAAE, + 0x6F02, 0xBA7D, 0x6F03, 0xE26F, 0x6F05, 0xE2AE, 0x6F06, 0xBAA3, + 0x6F07, 0xE2AB, 0x6F08, 0xE2B8, 0x6F09, 0xE275, 0x6F0A, 0xE27E, + 0x6F0D, 0xE2B6, 0x6F0E, 0xE2AC, 0x6F0F, 0xBA7C, 0x6F12, 0xE27C, + 0x6F13, 0xBA76, 0x6F14, 0xBA74, 0x6F15, 0xBAA8, 0x6F18, 0xE27A, + 0x6F19, 0xE277, 0x6F1A, 0xE278, 0x6F1C, 0xE2B2, 0x6F1E, 0xE2B7, + 0x6F1F, 0xE2B5, 0x6F20, 0xBA7A, 0x6F21, 0xE2B9, 0x6F22, 0xBA7E, + 0x6F23, 0xBAA7, 0x6F25, 0xE270, 0x6F26, 0xE5FA, 0x6F27, 0xE279, + 0x6F29, 0xBA78, 0x6F2A, 0xBAAC, 0x6F2B, 0xBAA9, 0x6F2C, 0xBA7B, + 0x6F2D, 0xE2A5, 0x6F2E, 0xE274, 0x6F2F, 0xBAAA, 0x6F30, 0xE2A7, + 0x6F31, 0xBAA4, 0x6F32, 0xBAA6, 0x6F33, 0xBA73, 0x6F35, 0xE2A9, + 0x6F36, 0xE2A1, 0x6F37, 0xE272, 0x6F38, 0xBAA5, 0x6F39, 0xE2B1, + 0x6F3A, 0xE2B4, 0x6F3B, 0xE27B, 0x6F3C, 0xE2A8, 0x6F3E, 0xBA79, + 0x6F3F, 0xBCDF, 0x6F40, 0xE2A6, 0x6F41, 0xE5F9, 0x6F43, 0xE2AD, + 0x6F4E, 0xE276, 0x6F4F, 0xE644, 0x6F50, 0xE64E, 0x6F51, 0xBCE2, + 0x6F52, 0xE64D, 0x6F53, 0xE659, 0x6F54, 0xBCE4, 0x6F55, 0xE64B, + 0x6F57, 0xE64F, 0x6F58, 0xBCEF, 0x6F5A, 0xE646, 0x6F5B, 0xBCE7, + 0x6F5D, 0xE652, 0x6F5E, 0xE9F0, 0x6F5F, 0xBCF3, 0x6F60, 0xBCF2, + 0x6F61, 0xE654, 0x6F62, 0xE643, 0x6F63, 0xE65E, 0x6F64, 0xBCED, + 0x6F66, 0xBCE3, 0x6F67, 0xE657, 0x6F69, 0xE65B, 0x6F6A, 0xE660, + 0x6F6B, 0xE655, 0x6F6C, 0xE649, 0x6F6D, 0xBCE6, 0x6F6E, 0xBCE9, + 0x6F6F, 0xBCF1, 0x6F70, 0xBCEC, 0x6F72, 0xE64C, 0x6F73, 0xE2A2, + 0x6F76, 0xE648, 0x6F77, 0xE65F, 0x6F78, 0xBCE8, 0x6F7A, 0xBCEB, + 0x6F7B, 0xE661, 0x6F7C, 0xBCE0, 0x6F7D, 0xE656, 0x6F7E, 0xE5FB, + 0x6F7F, 0xE65C, 0x6F80, 0xC0DF, 0x6F82, 0xE64A, 0x6F84, 0xBCE1, + 0x6F85, 0xE645, 0x6F86, 0xBCE5, 0x6F87, 0xE5FC, 0x6F88, 0xBAAB, + 0x6F89, 0xE641, 0x6F8B, 0xE65A, 0x6F8C, 0xE642, 0x6F8D, 0xE640, + 0x6F8E, 0xBCEA, 0x6F90, 0xE658, 0x6F92, 0xE5FE, 0x6F93, 0xE651, + 0x6F94, 0xE650, 0x6F95, 0xE65D, 0x6F96, 0xE647, 0x6F97, 0xBCEE, + 0x6F9E, 0xE9F3, 0x6FA0, 0xBF49, 0x6FA1, 0xBEFE, 0x6FA2, 0xEA40, + 0x6FA3, 0xE9EB, 0x6FA4, 0xBF41, 0x6FA5, 0xE9F7, 0x6FA6, 0xBF48, + 0x6FA7, 0xBF43, 0x6FA8, 0xE9F5, 0x6FA9, 0xED4F, 0x6FAA, 0xE9FB, + 0x6FAB, 0xEA42, 0x6FAC, 0xE9FA, 0x6FAD, 0xE9E9, 0x6FAE, 0xE9F8, + 0x6FAF, 0xEA44, 0x6FB0, 0xEA46, 0x6FB1, 0xBEFD, 0x6FB2, 0xEA45, + 0x6FB3, 0xBF44, 0x6FB4, 0xBF4A, 0x6FB6, 0xBF47, 0x6FB8, 0xE9FE, + 0x6FB9, 0xBF46, 0x6FBA, 0xE9F9, 0x6FBC, 0xE9ED, 0x6FBD, 0xE9F2, + 0x6FBF, 0xE9FD, 0x6FC0, 0xBF45, 0x6FC1, 0xBF42, 0x6FC2, 0xBEFC, + 0x6FC3, 0xBF40, 0x6FC4, 0xE9F1, 0x6FC6, 0xE5FD, 0x6FC7, 0xE9EC, + 0x6FC8, 0xE9EF, 0x6FC9, 0xEA41, 0x6FCA, 0xE9F4, 0x6FCB, 0xE9EA, + 0x6FCC, 0xED4E, 0x6FCD, 0xEA43, 0x6FCE, 0xE9EE, 0x6FCF, 0xE9FC, + 0x6FD4, 0xED51, 0x6FD5, 0xC0E3, 0x6FD8, 0xC0D7, 0x6FDB, 0xC0DB, + 0x6FDC, 0xED53, 0x6FDD, 0xED59, 0x6FDE, 0xED57, 0x6FDF, 0xC0D9, + 0x6FE0, 0xC0DA, 0x6FE1, 0xC0E1, 0x6FE2, 0xED5A, 0x6FE3, 0xED52, + 0x6FE4, 0xC0DC, 0x6FE6, 0xED56, 0x6FE7, 0xED55, 0x6FE8, 0xED5B, + 0x6FE9, 0xC0E2, 0x6FEB, 0xC0DD, 0x6FEC, 0xC0E0, 0x6FED, 0xED54, + 0x6FEE, 0xC0E4, 0x6FEF, 0xC0DE, 0x6FF0, 0xC0E5, 0x6FF1, 0xC0D8, + 0x6FF2, 0xED58, 0x6FF4, 0xED50, 0x6FF7, 0xEFF7, 0x6FFA, 0xC271, + 0x6FFB, 0xEFF4, 0x6FFC, 0xEFF6, 0x6FFE, 0xC26F, 0x6FFF, 0xEFF2, + 0x7000, 0xEFF3, 0x7001, 0xEFEE, 0x7004, 0xE9F6, 0x7005, 0xEFEF, + 0x7006, 0xC270, 0x7007, 0xEFEB, 0x7009, 0xC26D, 0x700A, 0xEFF8, + 0x700B, 0xC26E, 0x700C, 0xEFEC, 0x700D, 0xEFED, 0x700E, 0xEFF1, + 0x700F, 0xC273, 0x7011, 0xC272, 0x7014, 0xEFF0, 0x7015, 0xC378, + 0x7016, 0xF25F, 0x7017, 0xF265, 0x7018, 0xC379, 0x7019, 0xF25C, + 0x701A, 0xC376, 0x701B, 0xC373, 0x701C, 0xF267, 0x701D, 0xC377, + 0x701F, 0xC374, 0x7020, 0xF25E, 0x7021, 0xF261, 0x7022, 0xF262, + 0x7023, 0xF263, 0x7024, 0xF266, 0x7026, 0xEFF5, 0x7027, 0xF25D, + 0x7028, 0xC375, 0x7029, 0xF264, 0x702A, 0xF268, 0x702B, 0xF260, + 0x702F, 0xF45D, 0x7030, 0xC46A, 0x7031, 0xF460, 0x7032, 0xC46B, + 0x7033, 0xF468, 0x7034, 0xF45F, 0x7035, 0xF45C, 0x7037, 0xF45E, + 0x7038, 0xF462, 0x7039, 0xF465, 0x703A, 0xF464, 0x703B, 0xF467, + 0x703C, 0xF45B, 0x703E, 0xC469, 0x703F, 0xF463, 0x7040, 0xF466, + 0x7041, 0xF469, 0x7042, 0xF461, 0x7043, 0xF5D3, 0x7044, 0xF5D4, + 0x7045, 0xF5D8, 0x7046, 0xF5D9, 0x7048, 0xF5D6, 0x7049, 0xF5D7, + 0x704A, 0xF5D5, 0x704C, 0xC4E9, 0x7051, 0xC578, 0x7052, 0xF6EB, + 0x7055, 0xF6E8, 0x7056, 0xF6E9, 0x7057, 0xF6EA, 0x7058, 0xC579, + 0x705A, 0xF7E5, 0x705B, 0xF7E4, 0x705D, 0xF8AF, 0x705E, 0xC5F4, + 0x705F, 0xF8AD, 0x7060, 0xF8B0, 0x7061, 0xF8AE, 0x7062, 0xF8F5, + 0x7063, 0xC657, 0x7064, 0xC665, 0x7065, 0xF9A3, 0x7066, 0xF96C, + 0x7068, 0xF9A2, 0x7069, 0xF9D0, 0x706A, 0xF9D1, 0x706B, 0xA4F5, + 0x7070, 0xA6C7, 0x7071, 0xCA41, 0x7074, 0xCB5E, 0x7076, 0xA85F, + 0x7078, 0xA862, 0x707A, 0xCB5F, 0x707C, 0xA860, 0x707D, 0xA861, + 0x7082, 0xCD58, 0x7083, 0xCD5A, 0x7084, 0xCD55, 0x7085, 0xCD52, + 0x7086, 0xCD54, 0x708A, 0xAAA4, 0x708E, 0xAAA2, 0x7091, 0xCD56, + 0x7092, 0xAAA3, 0x7093, 0xCD53, 0x7094, 0xCD50, 0x7095, 0xAAA1, + 0x7096, 0xCD57, 0x7098, 0xCD51, 0x7099, 0xAAA5, 0x709A, 0xCD59, + 0x709F, 0xCFAF, 0x70A1, 0xCFB3, 0x70A4, 0xACB7, 0x70A9, 0xCFB6, + 0x70AB, 0xACAF, 0x70AC, 0xACB2, 0x70AD, 0xACB4, 0x70AE, 0xACB6, + 0x70AF, 0xACB3, 0x70B0, 0xCFB2, 0x70B1, 0xCFB1, 0x70B3, 0xACB1, + 0x70B4, 0xCFB4, 0x70B5, 0xCFB5, 0x70B7, 0xCFAE, 0x70B8, 0xACB5, + 0x70BA, 0xACB0, 0x70BE, 0xCFB0, 0x70C5, 0xD277, 0x70C6, 0xD278, + 0x70C7, 0xD279, 0x70C8, 0xAF50, 0x70CA, 0xAF4C, 0x70CB, 0xD26E, + 0x70CD, 0xD276, 0x70CE, 0xD27B, 0x70CF, 0xAF51, 0x70D1, 0xD26C, + 0x70D2, 0xD272, 0x70D3, 0xD26B, 0x70D4, 0xD275, 0x70D7, 0xD271, + 0x70D8, 0xAF4D, 0x70D9, 0xAF4F, 0x70DA, 0xD27A, 0x70DC, 0xD26A, + 0x70DD, 0xD26D, 0x70DE, 0xD273, 0x70E0, 0xD274, 0x70E1, 0xD27C, + 0x70E2, 0xD270, 0x70E4, 0xAF4E, 0x70EF, 0xB26D, 0x70F0, 0xD64E, + 0x70F3, 0xD650, 0x70F4, 0xD64C, 0x70F6, 0xD658, 0x70F7, 0xD64A, + 0x70F8, 0xD657, 0x70F9, 0xB269, 0x70FA, 0xD648, 0x70FB, 0xDA5B, + 0x70FC, 0xD652, 0x70FD, 0xB26C, 0x70FF, 0xD653, 0x7100, 0xD656, + 0x7102, 0xD65A, 0x7104, 0xD64F, 0x7106, 0xD654, 0x7109, 0xB26A, + 0x710A, 0xB26B, 0x710B, 0xD659, 0x710C, 0xD64D, 0x710D, 0xD649, + 0x710E, 0xD65B, 0x7110, 0xD651, 0x7113, 0xD655, 0x7117, 0xD64B, + 0x7119, 0xB548, 0x711A, 0xB549, 0x711B, 0xDA65, 0x711C, 0xB54F, + 0x711E, 0xDA59, 0x711F, 0xDA62, 0x7120, 0xDA58, 0x7121, 0xB54C, + 0x7122, 0xDA60, 0x7123, 0xDA5E, 0x7125, 0xDA5F, 0x7126, 0xB54A, + 0x7128, 0xDA63, 0x712E, 0xDA5C, 0x712F, 0xDA5A, 0x7130, 0xB54B, + 0x7131, 0xDA5D, 0x7132, 0xDA61, 0x7136, 0xB54D, 0x713A, 0xDA64, + 0x7141, 0xDE70, 0x7142, 0xDE77, 0x7143, 0xDE79, 0x7144, 0xDEA1, + 0x7146, 0xB7DA, 0x7147, 0xDE6B, 0x7149, 0xB7D2, 0x714B, 0xDE7A, + 0x714C, 0xB7D7, 0x714D, 0xDEA2, 0x714E, 0xB7CE, 0x7150, 0xDE7D, + 0x7152, 0xDE6D, 0x7153, 0xDE7E, 0x7154, 0xDE6C, 0x7156, 0xB7DC, + 0x7158, 0xDE78, 0x7159, 0xB7CF, 0x715A, 0xDEA3, 0x715C, 0xB7D4, + 0x715D, 0xDE71, 0x715E, 0xB7D9, 0x715F, 0xDE7C, 0x7160, 0xDE6F, + 0x7161, 0xDE76, 0x7162, 0xDE72, 0x7163, 0xDE6E, 0x7164, 0xB7D1, + 0x7165, 0xB7D8, 0x7166, 0xB7D6, 0x7167, 0xB7D3, 0x7168, 0xB7DB, + 0x7169, 0xB7D0, 0x716A, 0xDE75, 0x716C, 0xB7D5, 0x716E, 0xB54E, + 0x7170, 0xDE7B, 0x7172, 0xDE73, 0x7178, 0xDE74, 0x717B, 0xE2C1, + 0x717D, 0xBAB4, 0x7180, 0xE2BD, 0x7181, 0xE2C3, 0x7182, 0xE2BF, + 0x7184, 0xBAB6, 0x7185, 0xE2BE, 0x7186, 0xE2C2, 0x7187, 0xE2BA, + 0x7189, 0xE2BC, 0x718A, 0xBAB5, 0x718F, 0xE2C0, 0x7190, 0xE2BB, + 0x7192, 0xBAB7, 0x7194, 0xBAB2, 0x7197, 0xE2C4, 0x7199, 0xBAB3, + 0x719A, 0xE667, 0x719B, 0xE664, 0x719C, 0xE670, 0x719D, 0xE66A, + 0x719E, 0xE66C, 0x719F, 0xBCF4, 0x71A0, 0xE666, 0x71A1, 0xE66E, + 0x71A4, 0xE66D, 0x71A5, 0xE66B, 0x71A7, 0xE671, 0x71A8, 0xBCF7, + 0x71A9, 0xE668, 0x71AA, 0xE66F, 0x71AC, 0xBCF5, 0x71AF, 0xE663, + 0x71B0, 0xE665, 0x71B1, 0xBCF6, 0x71B2, 0xE662, 0x71B3, 0xE672, + 0x71B5, 0xE669, 0x71B8, 0xEA4A, 0x71B9, 0xBF51, 0x71BC, 0xEA55, + 0x71BD, 0xEA53, 0x71BE, 0xBF4B, 0x71BF, 0xEA49, 0x71C0, 0xEA4C, + 0x71C1, 0xEA4D, 0x71C2, 0xEA48, 0x71C3, 0xBF55, 0x71C4, 0xBF56, + 0x71C5, 0xEA47, 0x71C6, 0xEA56, 0x71C7, 0xEA51, 0x71C8, 0xBF4F, + 0x71C9, 0xBF4C, 0x71CA, 0xEA50, 0x71CB, 0xEA4E, 0x71CE, 0xBF52, + 0x71CF, 0xEA52, 0x71D0, 0xBF4D, 0x71D2, 0xBF4E, 0x71D4, 0xEA4F, + 0x71D5, 0xBF50, 0x71D6, 0xEA4B, 0x71D8, 0xEA54, 0x71D9, 0xBF53, + 0x71DA, 0xEA57, 0x71DB, 0xEA58, 0x71DC, 0xBF54, 0x71DF, 0xC0E7, + 0x71E0, 0xC0EE, 0x71E1, 0xED5C, 0x71E2, 0xED62, 0x71E4, 0xED60, + 0x71E5, 0xC0EA, 0x71E6, 0xC0E9, 0x71E7, 0xC0E6, 0x71E8, 0xED5E, + 0x71EC, 0xC0EC, 0x71ED, 0xC0EB, 0x71EE, 0xC0E8, 0x71F0, 0xED61, + 0x71F1, 0xED5D, 0x71F2, 0xED5F, 0x71F4, 0xC0ED, 0x71F8, 0xC277, + 0x71F9, 0xEFFB, 0x71FB, 0xC274, 0x71FC, 0xC275, 0x71FD, 0xEFFD, + 0x71FE, 0xC276, 0x71FF, 0xEFFA, 0x7201, 0xEFF9, 0x7202, 0xF26C, + 0x7203, 0xEFFC, 0x7205, 0xF26D, 0x7206, 0xC37A, 0x7207, 0xF26B, + 0x720A, 0xF26A, 0x720C, 0xF269, 0x720D, 0xC37B, 0x7210, 0xC46C, + 0x7213, 0xF46A, 0x7214, 0xF46B, 0x7219, 0xF5DC, 0x721A, 0xF5DB, + 0x721B, 0xC4EA, 0x721D, 0xF5DA, 0x721E, 0xF6EC, 0x721F, 0xF6ED, + 0x7222, 0xF7E6, 0x7223, 0xF8B1, 0x7226, 0xF8F6, 0x7227, 0xF9BC, + 0x7228, 0xC679, 0x7229, 0xF9C6, 0x722A, 0xA4F6, 0x722C, 0xAAA6, + 0x722D, 0xAAA7, 0x7230, 0xACB8, 0x7235, 0xC0EF, 0x7236, 0xA4F7, + 0x7238, 0xAAA8, 0x7239, 0xAF52, 0x723A, 0xB7DD, 0x723B, 0xA4F8, + 0x723D, 0xB26E, 0x723E, 0xBAB8, 0x723F, 0xC962, 0x7241, 0xCFB7, + 0x7242, 0xD27D, 0x7244, 0xE2C5, 0x7246, 0xC0F0, 0x7247, 0xA4F9, + 0x7248, 0xAAA9, 0x7249, 0xCFB8, 0x724A, 0xCFB9, 0x724B, 0xDA66, + 0x724C, 0xB550, 0x724F, 0xDEA4, 0x7252, 0xB7DE, 0x7253, 0xE2C6, + 0x7256, 0xBCF8, 0x7258, 0xC37C, 0x7259, 0xA4FA, 0x725A, 0xDA67, + 0x725B, 0xA4FB, 0x725D, 0xA6C9, 0x725E, 0xCA42, 0x725F, 0xA6C8, + 0x7260, 0xA865, 0x7261, 0xA864, 0x7262, 0xA863, 0x7263, 0xCB60, + 0x7267, 0xAAAA, 0x7269, 0xAAAB, 0x726A, 0xCD5B, 0x726C, 0xCFBA, + 0x726E, 0xCFBD, 0x726F, 0xACBA, 0x7270, 0xCFBB, 0x7272, 0xACB9, + 0x7273, 0xCFBC, 0x7274, 0xACBB, 0x7276, 0xD2A2, 0x7277, 0xD2A1, + 0x7278, 0xD27E, 0x7279, 0xAF53, 0x727B, 0xD65D, 0x727C, 0xD65E, + 0x727D, 0xB26F, 0x727E, 0xD65C, 0x727F, 0xD65F, 0x7280, 0xB552, + 0x7281, 0xB270, 0x7284, 0xB551, 0x7285, 0xDA6B, 0x7286, 0xDA6A, + 0x7288, 0xDA68, 0x7289, 0xDA69, 0x728B, 0xDA6C, 0x728C, 0xDEA6, + 0x728D, 0xDEA5, 0x728E, 0xDEA9, 0x7290, 0xDEA8, 0x7291, 0xDEA7, + 0x7292, 0xBAB9, 0x7293, 0xE2C9, 0x7295, 0xE2C8, 0x7296, 0xBABA, + 0x7297, 0xE2C7, 0x7298, 0xE673, 0x729A, 0xE674, 0x729B, 0xBCF9, + 0x729D, 0xEA59, 0x729E, 0xEA5A, 0x72A1, 0xF272, 0x72A2, 0xC37D, + 0x72A3, 0xF271, 0x72A4, 0xF270, 0x72A5, 0xF26E, 0x72A6, 0xF26F, + 0x72A7, 0xC4EB, 0x72A8, 0xF46C, 0x72A9, 0xF6EE, 0x72AA, 0xF8F7, + 0x72AC, 0xA4FC, 0x72AE, 0xC9A5, 0x72AF, 0xA5C7, 0x72B0, 0xC9A6, + 0x72B4, 0xCA43, 0x72B5, 0xCA44, 0x72BA, 0xCB66, 0x72BD, 0xCB62, + 0x72BF, 0xCB61, 0x72C0, 0xAAAC, 0x72C1, 0xCB65, 0x72C2, 0xA867, + 0x72C3, 0xCB63, 0x72C4, 0xA866, 0x72C5, 0xCB67, 0x72C6, 0xCB64, + 0x72C9, 0xCD5F, 0x72CA, 0xCFBE, 0x72CB, 0xCD5D, 0x72CC, 0xCD64, + 0x72CE, 0xAAAD, 0x72D0, 0xAAB0, 0x72D1, 0xCD65, 0x72D2, 0xCD61, + 0x72D4, 0xCD62, 0x72D6, 0xCD5C, 0x72D7, 0xAAAF, 0x72D8, 0xCD5E, + 0x72D9, 0xAAAE, 0x72DA, 0xCD63, 0x72DC, 0xCD60, 0x72DF, 0xCFC2, + 0x72E0, 0xACBD, 0x72E1, 0xACBE, 0x72E3, 0xCFC5, 0x72E4, 0xCFBF, + 0x72E6, 0xCFC4, 0x72E8, 0xCFC0, 0x72E9, 0xACBC, 0x72EA, 0xCFC3, + 0x72EB, 0xCFC1, 0x72F3, 0xD2A8, 0x72F4, 0xD2A5, 0x72F6, 0xD2A7, + 0x72F7, 0xAF58, 0x72F8, 0xAF57, 0x72F9, 0xAF55, 0x72FA, 0xD2A4, + 0x72FB, 0xD2A9, 0x72FC, 0xAF54, 0x72FD, 0xAF56, 0x72FE, 0xD2A6, + 0x72FF, 0xD667, 0x7300, 0xD2A3, 0x7301, 0xD2AA, 0x7307, 0xD662, + 0x7308, 0xD666, 0x730A, 0xD665, 0x730B, 0xDA6E, 0x730C, 0xDA79, + 0x730F, 0xD668, 0x7311, 0xD663, 0x7312, 0xDA6D, 0x7313, 0xB274, + 0x7316, 0xB273, 0x7317, 0xD661, 0x7318, 0xD664, 0x7319, 0xB275, + 0x731B, 0xB272, 0x731C, 0xB271, 0x731D, 0xD660, 0x731E, 0xD669, + 0x7322, 0xDA70, 0x7323, 0xDA77, 0x7325, 0xB554, 0x7326, 0xDA76, + 0x7327, 0xDA73, 0x7329, 0xB556, 0x732D, 0xDA75, 0x7330, 0xDA6F, + 0x7331, 0xDA71, 0x7332, 0xDA74, 0x7333, 0xDA72, 0x7334, 0xB555, + 0x7335, 0xDA78, 0x7336, 0xB553, 0x7337, 0xB7DF, 0x733A, 0xDEAD, + 0x733B, 0xDEAC, 0x733C, 0xDEAA, 0x733E, 0xB7E2, 0x733F, 0xB7E1, + 0x7340, 0xDEAE, 0x7342, 0xDEAB, 0x7343, 0xE2CA, 0x7344, 0xBABB, + 0x7345, 0xB7E0, 0x7349, 0xDEB0, 0x734A, 0xDEAF, 0x734C, 0xE2CD, + 0x734D, 0xE2CB, 0x734E, 0xBCFA, 0x7350, 0xBABC, 0x7351, 0xE2CC, + 0x7352, 0xE676, 0x7357, 0xBCFB, 0x7358, 0xE675, 0x7359, 0xE67E, + 0x735A, 0xE67D, 0x735B, 0xE67B, 0x735D, 0xE67A, 0x735E, 0xE677, + 0x735F, 0xE678, 0x7360, 0xE679, 0x7361, 0xE67C, 0x7362, 0xE6A1, + 0x7365, 0xEA5F, 0x7366, 0xEA5C, 0x7367, 0xEA5D, 0x7368, 0xBF57, + 0x7369, 0xEA5B, 0x736A, 0xEA61, 0x736B, 0xEA60, 0x736C, 0xEA5E, + 0x736E, 0xED64, 0x736F, 0xED65, 0x7370, 0xC0F1, 0x7372, 0xC0F2, + 0x7373, 0xED63, 0x7375, 0xC279, 0x7376, 0xEFFE, 0x7377, 0xC278, + 0x7378, 0xC37E, 0x737A, 0xC3A1, 0x737B, 0xC46D, 0x737C, 0xF46E, + 0x737D, 0xF46D, 0x737E, 0xF5DD, 0x737F, 0xF6EF, 0x7380, 0xC57A, + 0x7381, 0xF7E8, 0x7382, 0xF7E7, 0x7383, 0xF7E9, 0x7384, 0xA5C8, + 0x7385, 0xCFC6, 0x7386, 0xAF59, 0x7387, 0xB276, 0x7388, 0xD66A, + 0x7389, 0xA5C9, 0x738A, 0xC9A7, 0x738B, 0xA4FD, 0x738E, 0xCA45, + 0x7392, 0xCB6C, 0x7393, 0xCB6A, 0x7394, 0xCB6B, 0x7395, 0xCB68, + 0x7396, 0xA868, 0x7397, 0xCB69, 0x739D, 0xCD6D, 0x739F, 0xAAB3, + 0x73A0, 0xCD6B, 0x73A1, 0xCD67, 0x73A2, 0xCD6A, 0x73A4, 0xCD66, + 0x73A5, 0xAAB5, 0x73A6, 0xCD69, 0x73A8, 0xAAB2, 0x73A9, 0xAAB1, + 0x73AB, 0xAAB4, 0x73AC, 0xCD6C, 0x73AD, 0xCD68, 0x73B2, 0xACC2, + 0x73B3, 0xACC5, 0x73B4, 0xCFCE, 0x73B5, 0xCFCD, 0x73B6, 0xCFCC, + 0x73B7, 0xACBF, 0x73B8, 0xCFD5, 0x73B9, 0xCFCB, 0x73BB, 0xACC1, + 0x73BC, 0xD2AF, 0x73BE, 0xCFD2, 0x73BF, 0xCFD0, 0x73C0, 0xACC4, + 0x73C2, 0xCFC8, 0x73C3, 0xCFD3, 0x73C5, 0xCFCA, 0x73C6, 0xCFD4, + 0x73C7, 0xCFD1, 0x73C8, 0xCFC9, 0x73CA, 0xACC0, 0x73CB, 0xCFD6, + 0x73CC, 0xCFC7, 0x73CD, 0xACC3, 0x73D2, 0xD2B4, 0x73D3, 0xD2AB, + 0x73D4, 0xD2B6, 0x73D6, 0xD2AE, 0x73D7, 0xD2B9, 0x73D8, 0xD2BA, + 0x73D9, 0xD2AC, 0x73DA, 0xD2B8, 0x73DB, 0xD2B5, 0x73DC, 0xD2B3, + 0x73DD, 0xD2B7, 0x73DE, 0xAF5F, 0x73E0, 0xAF5D, 0x73E3, 0xD2B1, + 0x73E5, 0xD2AD, 0x73E7, 0xD2B0, 0x73E8, 0xD2BB, 0x73E9, 0xD2B2, + 0x73EA, 0xAF5E, 0x73EB, 0xCFCF, 0x73ED, 0xAF5A, 0x73EE, 0xAF5C, + 0x73F4, 0xD678, 0x73F5, 0xD66D, 0x73F6, 0xD66B, 0x73F8, 0xD66C, + 0x73FA, 0xD673, 0x73FC, 0xD674, 0x73FD, 0xD670, 0x73FE, 0xB27B, + 0x73FF, 0xD675, 0x7400, 0xD672, 0x7401, 0xD66F, 0x7403, 0xB279, + 0x7404, 0xD66E, 0x7405, 0xB277, 0x7406, 0xB27A, 0x7407, 0xD671, + 0x7408, 0xD679, 0x7409, 0xAF5B, 0x740A, 0xB278, 0x740B, 0xD677, + 0x740C, 0xD676, 0x740D, 0xB27C, 0x7416, 0xDA7E, 0x741A, 0xDAA1, + 0x741B, 0xB560, 0x741D, 0xDAA7, 0x7420, 0xDAA9, 0x7421, 0xDAA2, + 0x7422, 0xB55A, 0x7423, 0xDAA6, 0x7424, 0xDAA5, 0x7425, 0xB55B, + 0x7426, 0xB561, 0x7428, 0xB562, 0x7429, 0xDAA8, 0x742A, 0xB558, + 0x742B, 0xDA7D, 0x742C, 0xDA7B, 0x742D, 0xDAA3, 0x742E, 0xDA7A, + 0x742F, 0xB55F, 0x7430, 0xDA7C, 0x7431, 0xDAA4, 0x7432, 0xDAAA, + 0x7433, 0xB559, 0x7434, 0xB55E, 0x7435, 0xB55C, 0x7436, 0xB55D, + 0x743A, 0xB557, 0x743F, 0xB7E9, 0x7440, 0xDEB7, 0x7441, 0xB7E8, + 0x7442, 0xDEBB, 0x7444, 0xDEB1, 0x7446, 0xDEBC, 0x744A, 0xDEB2, + 0x744B, 0xDEB3, 0x744D, 0xDEBD, 0x744E, 0xDEBA, 0x744F, 0xDEB8, + 0x7450, 0xDEB9, 0x7451, 0xDEB5, 0x7452, 0xDEB4, 0x7454, 0xDEBE, + 0x7455, 0xB7E5, 0x7457, 0xDEB6, 0x7459, 0xB7EA, 0x745A, 0xB7E4, + 0x745B, 0xB7EB, 0x745C, 0xB7EC, 0x745E, 0xB7E7, 0x745F, 0xB7E6, + 0x7462, 0xE2CE, 0x7463, 0xBABE, 0x7464, 0xBABD, 0x7467, 0xE2D3, + 0x7469, 0xBCFC, 0x746A, 0xBABF, 0x746D, 0xBAC1, 0x746E, 0xE2D4, + 0x746F, 0xB7E3, 0x7470, 0xBAC0, 0x7471, 0xE2D0, 0x7472, 0xE2D2, + 0x7473, 0xE2CF, 0x7475, 0xE2D1, 0x7479, 0xE6AB, 0x747C, 0xE6AA, + 0x747D, 0xE6A7, 0x747E, 0xBD40, 0x747F, 0xEA62, 0x7480, 0xBD41, + 0x7481, 0xE6A6, 0x7483, 0xBCFE, 0x7485, 0xE6A8, 0x7486, 0xE6A5, + 0x7487, 0xE6A2, 0x7488, 0xE6A9, 0x7489, 0xE6A3, 0x748A, 0xE6A4, + 0x748B, 0xBCFD, 0x7490, 0xED69, 0x7492, 0xEA66, 0x7494, 0xEA65, + 0x7495, 0xEA67, 0x7497, 0xED66, 0x7498, 0xBF5A, 0x749A, 0xEA63, + 0x749C, 0xBF58, 0x749E, 0xBF5C, 0x749F, 0xBF5B, 0x74A0, 0xEA64, + 0x74A1, 0xEA68, 0x74A3, 0xBF59, 0x74A5, 0xED6D, 0x74A6, 0xC0F5, + 0x74A7, 0xC27A, 0x74A8, 0xC0F6, 0x74A9, 0xC0F3, 0x74AA, 0xED6A, + 0x74AB, 0xED68, 0x74AD, 0xED6B, 0x74AF, 0xED6E, 0x74B0, 0xC0F4, + 0x74B1, 0xED6C, 0x74B2, 0xED67, 0x74B5, 0xF042, 0x74B6, 0xF045, + 0x74B7, 0xF275, 0x74B8, 0xF040, 0x74BA, 0xF46F, 0x74BB, 0xF046, + 0x74BD, 0xC3A2, 0x74BE, 0xF044, 0x74BF, 0xC27B, 0x74C0, 0xF041, + 0x74C1, 0xF043, 0x74C2, 0xF047, 0x74C3, 0xF276, 0x74C5, 0xF274, + 0x74CA, 0xC3A3, 0x74CB, 0xF273, 0x74CF, 0xC46E, 0x74D4, 0xC4ED, + 0x74D5, 0xF6F1, 0x74D6, 0xC4EC, 0x74D7, 0xF6F3, 0x74D8, 0xF6F0, + 0x74D9, 0xF6F2, 0x74DA, 0xC5D0, 0x74DB, 0xF8B2, 0x74DC, 0xA5CA, + 0x74DD, 0xCD6E, 0x74DE, 0xD2BC, 0x74DF, 0xD2BD, 0x74E0, 0xB27D, + 0x74E1, 0xDEBF, 0x74E2, 0xBF5D, 0x74E3, 0xC3A4, 0x74E4, 0xC57B, + 0x74E5, 0xF8B3, 0x74E6, 0xA5CB, 0x74E8, 0xCD6F, 0x74E9, 0xA260, + 0x74EC, 0xCFD7, 0x74EE, 0xCFD8, 0x74F4, 0xD2BE, 0x74F5, 0xD2BF, + 0x74F6, 0xB27E, 0x74F7, 0xB2A1, 0x74FB, 0xDAAB, 0x74FD, 0xDEC2, + 0x74FE, 0xDEC1, 0x74FF, 0xDEC0, 0x7500, 0xE2D5, 0x7502, 0xE2D6, + 0x7503, 0xE2D7, 0x7504, 0xBAC2, 0x7507, 0xE6AD, 0x7508, 0xE6AC, + 0x750B, 0xEA69, 0x750C, 0xBF5E, 0x750D, 0xBF5F, 0x750F, 0xED72, + 0x7510, 0xED6F, 0x7511, 0xED70, 0x7512, 0xED71, 0x7513, 0xF049, + 0x7514, 0xF048, 0x7515, 0xC27C, 0x7516, 0xF277, 0x7517, 0xF5DE, + 0x7518, 0xA5CC, 0x751A, 0xACC6, 0x751C, 0xB2A2, 0x751D, 0xDEC3, + 0x751F, 0xA5CD, 0x7521, 0xD2C0, 0x7522, 0xB2A3, 0x7525, 0xB563, + 0x7526, 0xB564, 0x7528, 0xA5CE, 0x7529, 0xA5CF, 0x752A, 0xCA46, + 0x752B, 0xA86A, 0x752C, 0xA869, 0x752D, 0xACC7, 0x752E, 0xCFD9, + 0x752F, 0xDAAC, 0x7530, 0xA5D0, 0x7531, 0xA5D1, 0x7532, 0xA5D2, + 0x7533, 0xA5D3, 0x7537, 0xA86B, 0x7538, 0xA86C, 0x7539, 0xCB6E, + 0x753A, 0xCB6D, 0x753D, 0xAAB6, 0x753E, 0xCD72, 0x753F, 0xCD70, + 0x7540, 0xCD71, 0x7547, 0xCFDA, 0x7548, 0xCFDB, 0x754B, 0xACCB, + 0x754C, 0xACC9, 0x754E, 0xACCA, 0x754F, 0xACC8, 0x7554, 0xAF60, + 0x7559, 0xAF64, 0x755A, 0xAF63, 0x755B, 0xD2C1, 0x755C, 0xAF62, + 0x755D, 0xAF61, 0x755F, 0xD2C2, 0x7562, 0xB2A6, 0x7563, 0xD67B, + 0x7564, 0xD67A, 0x7565, 0xB2A4, 0x7566, 0xB2A5, 0x756A, 0xB566, + 0x756B, 0xB565, 0x756C, 0xDAAE, 0x756F, 0xDAAD, 0x7570, 0xB2A7, + 0x7576, 0xB7ED, 0x7577, 0xDEC5, 0x7578, 0xB7EE, 0x7579, 0xDEC4, + 0x757D, 0xE2D8, 0x757E, 0xE6AE, 0x757F, 0xBD42, 0x7580, 0xEA6A, + 0x7584, 0xED73, 0x7586, 0xC3A6, 0x7587, 0xC3A5, 0x758A, 0xC57C, + 0x758B, 0xA5D4, 0x758C, 0xCD73, 0x758F, 0xB2A8, 0x7590, 0xE2D9, + 0x7591, 0xBAC3, 0x7594, 0xCB6F, 0x7595, 0xCB70, 0x7598, 0xCD74, + 0x7599, 0xAAB8, 0x759A, 0xAAB9, 0x759D, 0xAAB7, 0x75A2, 0xACCF, + 0x75A3, 0xACD0, 0x75A4, 0xACCD, 0x75A5, 0xACCE, 0x75A7, 0xCFDC, + 0x75AA, 0xCFDD, 0x75AB, 0xACCC, 0x75B0, 0xD2C3, 0x75B2, 0xAF68, + 0x75B3, 0xAF69, 0x75B5, 0xB2AB, 0x75B6, 0xD2C9, 0x75B8, 0xAF6E, + 0x75B9, 0xAF6C, 0x75BA, 0xD2CA, 0x75BB, 0xD2C5, 0x75BC, 0xAF6B, + 0x75BD, 0xAF6A, 0x75BE, 0xAF65, 0x75BF, 0xD2C8, 0x75C0, 0xD2C7, + 0x75C1, 0xD2C4, 0x75C2, 0xAF6D, 0x75C4, 0xD2C6, 0x75C5, 0xAF66, + 0x75C7, 0xAF67, 0x75CA, 0xB2AC, 0x75CB, 0xD6A1, 0x75CC, 0xD6A2, + 0x75CD, 0xB2AD, 0x75CE, 0xD67C, 0x75CF, 0xD67E, 0x75D0, 0xD6A4, + 0x75D1, 0xD6A3, 0x75D2, 0xD67D, 0x75D4, 0xB2A9, 0x75D5, 0xB2AA, + 0x75D7, 0xDAB6, 0x75D8, 0xB56B, 0x75D9, 0xB56A, 0x75DA, 0xDAB0, + 0x75DB, 0xB568, 0x75DD, 0xDAB3, 0x75DE, 0xB56C, 0x75DF, 0xDAB4, + 0x75E0, 0xB56D, 0x75E1, 0xDAB1, 0x75E2, 0xB567, 0x75E3, 0xB569, + 0x75E4, 0xDAB5, 0x75E6, 0xDAB2, 0x75E7, 0xDAAF, 0x75ED, 0xDED2, + 0x75EF, 0xDEC7, 0x75F0, 0xB7F0, 0x75F1, 0xB7F3, 0x75F2, 0xB7F2, + 0x75F3, 0xB7F7, 0x75F4, 0xB7F6, 0x75F5, 0xDED3, 0x75F6, 0xDED1, + 0x75F7, 0xDECA, 0x75F8, 0xDECE, 0x75F9, 0xDECD, 0x75FA, 0xB7F4, + 0x75FB, 0xDED0, 0x75FC, 0xDECC, 0x75FD, 0xDED4, 0x75FE, 0xDECB, + 0x75FF, 0xB7F5, 0x7600, 0xB7EF, 0x7601, 0xB7F1, 0x7603, 0xDEC9, + 0x7608, 0xE2DB, 0x7609, 0xBAC7, 0x760A, 0xE2DF, 0x760B, 0xBAC6, + 0x760C, 0xE2DC, 0x760D, 0xBAC5, 0x760F, 0xDEC8, 0x7610, 0xDECF, + 0x7611, 0xE2DE, 0x7613, 0xBAC8, 0x7614, 0xE2E0, 0x7615, 0xE2DD, + 0x7616, 0xE2DA, 0x7619, 0xE6B1, 0x761A, 0xE6B5, 0x761B, 0xE6B7, + 0x761C, 0xE6B3, 0x761D, 0xE6B2, 0x761E, 0xE6B0, 0x761F, 0xBD45, + 0x7620, 0xBD43, 0x7621, 0xBD48, 0x7622, 0xBD49, 0x7623, 0xE6B4, + 0x7624, 0xBD46, 0x7625, 0xE6AF, 0x7626, 0xBD47, 0x7627, 0xBAC4, + 0x7628, 0xE6B6, 0x7629, 0xBD44, 0x762D, 0xEA6C, 0x762F, 0xEA6B, + 0x7630, 0xEA73, 0x7631, 0xEA6D, 0x7632, 0xEA72, 0x7633, 0xEA6F, + 0x7634, 0xBF60, 0x7635, 0xEA71, 0x7638, 0xBF61, 0x763A, 0xBF62, + 0x763C, 0xEA70, 0x763D, 0xEA6E, 0x7642, 0xC0F8, 0x7643, 0xED74, + 0x7646, 0xC0F7, 0x7647, 0xED77, 0x7648, 0xED75, 0x7649, 0xED76, + 0x764C, 0xC0F9, 0x7650, 0xF04D, 0x7652, 0xC2A1, 0x7653, 0xF04E, + 0x7656, 0xC27D, 0x7657, 0xF04F, 0x7658, 0xC27E, 0x7659, 0xF04C, + 0x765A, 0xF050, 0x765C, 0xF04A, 0x765F, 0xC3A7, 0x7660, 0xF278, + 0x7661, 0xC3A8, 0x7662, 0xC46F, 0x7664, 0xF04B, 0x7665, 0xC470, + 0x7669, 0xC4EE, 0x766A, 0xF5DF, 0x766C, 0xC57E, 0x766D, 0xF6F4, + 0x766E, 0xC57D, 0x7670, 0xF7EA, 0x7671, 0xC5F5, 0x7672, 0xC5F6, + 0x7675, 0xF9CC, 0x7678, 0xACD1, 0x7679, 0xCFDE, 0x767B, 0xB56E, + 0x767C, 0xB56F, 0x767D, 0xA5D5, 0x767E, 0xA6CA, 0x767F, 0xCA47, + 0x7681, 0xCB71, 0x7682, 0xA86D, 0x7684, 0xAABA, 0x7686, 0xACD2, + 0x7687, 0xACD3, 0x7688, 0xACD4, 0x7689, 0xD6A6, 0x768A, 0xD2CB, + 0x768B, 0xAF6F, 0x768E, 0xB2AE, 0x768F, 0xD6A5, 0x7692, 0xDAB8, + 0x7693, 0xB571, 0x7695, 0xDAB7, 0x7696, 0xB570, 0x7699, 0xDED5, + 0x769A, 0xBD4A, 0x769B, 0xE6BB, 0x769C, 0xE6B8, 0x769D, 0xE6B9, + 0x769E, 0xE6BA, 0x76A4, 0xED78, 0x76A6, 0xF051, 0x76AA, 0xF471, + 0x76AB, 0xF470, 0x76AD, 0xF6F5, 0x76AE, 0xA5D6, 0x76AF, 0xCD75, + 0x76B0, 0xAF70, 0x76B4, 0xB572, 0x76B5, 0xDED6, 0x76B8, 0xE2E1, + 0x76BA, 0xBD4B, 0x76BB, 0xEA74, 0x76BD, 0xF052, 0x76BE, 0xF472, + 0x76BF, 0xA5D7, 0x76C2, 0xAABB, 0x76C3, 0xACD7, 0x76C4, 0xCFDF, + 0x76C5, 0xACD8, 0x76C6, 0xACD6, 0x76C8, 0xACD5, 0x76C9, 0xD2CC, + 0x76CA, 0xAF71, 0x76CD, 0xAF72, 0x76CE, 0xAF73, 0x76D2, 0xB2B0, + 0x76D3, 0xD6A7, 0x76D4, 0xB2AF, 0x76DA, 0xDAB9, 0x76DB, 0xB2B1, + 0x76DC, 0xB573, 0x76DD, 0xDED7, 0x76DE, 0xB7F8, 0x76DF, 0xB7F9, + 0x76E1, 0xBAC9, 0x76E3, 0xBACA, 0x76E4, 0xBD4C, 0x76E5, 0xBF64, + 0x76E6, 0xEA75, 0x76E7, 0xBF63, 0x76E9, 0xED79, 0x76EA, 0xC0FA, + 0x76EC, 0xF053, 0x76ED, 0xF473, 0x76EE, 0xA5D8, 0x76EF, 0xA86E, + 0x76F0, 0xCD78, 0x76F1, 0xCD77, 0x76F2, 0xAABC, 0x76F3, 0xCD76, + 0x76F4, 0xAABD, 0x76F5, 0xCD79, 0x76F7, 0xCFE5, 0x76F8, 0xACDB, + 0x76F9, 0xACDA, 0x76FA, 0xCFE7, 0x76FB, 0xCFE6, 0x76FC, 0xACDF, + 0x76FE, 0xACDE, 0x7701, 0xACD9, 0x7703, 0xCFE1, 0x7704, 0xCFE2, + 0x7705, 0xCFE3, 0x7707, 0xACE0, 0x7708, 0xCFE0, 0x7709, 0xACDC, + 0x770A, 0xCFE4, 0x770B, 0xACDD, 0x7710, 0xD2CF, 0x7711, 0xD2D3, + 0x7712, 0xD2D1, 0x7713, 0xD2D0, 0x7715, 0xD2D4, 0x7719, 0xD2D5, + 0x771A, 0xD2D6, 0x771B, 0xD2CE, 0x771D, 0xD2CD, 0x771F, 0xAF75, + 0x7720, 0xAF76, 0x7722, 0xD2D7, 0x7723, 0xD2D2, 0x7725, 0xD6B0, + 0x7727, 0xD2D8, 0x7728, 0xAF77, 0x7729, 0xAF74, 0x772D, 0xD6AA, + 0x772F, 0xD6A9, 0x7731, 0xD6AB, 0x7732, 0xD6AC, 0x7733, 0xD6AE, + 0x7734, 0xD6AD, 0x7735, 0xD6B2, 0x7736, 0xB2B5, 0x7737, 0xB2B2, + 0x7738, 0xB2B6, 0x7739, 0xD6A8, 0x773A, 0xB2B7, 0x773B, 0xD6B1, + 0x773C, 0xB2B4, 0x773D, 0xD6AF, 0x773E, 0xB2B3, 0x7744, 0xDABC, + 0x7745, 0xDABE, 0x7746, 0xDABA, 0x7747, 0xDABB, 0x774A, 0xDABF, + 0x774B, 0xDAC1, 0x774C, 0xDAC2, 0x774D, 0xDABD, 0x774E, 0xDAC0, + 0x774F, 0xB574, 0x7752, 0xDEDB, 0x7754, 0xDEE0, 0x7755, 0xDED8, + 0x7756, 0xDEDC, 0x7759, 0xDEE1, 0x775A, 0xDEDD, 0x775B, 0xB7FA, + 0x775C, 0xB843, 0x775E, 0xB7FD, 0x775F, 0xDED9, 0x7760, 0xDEDA, + 0x7761, 0xBACE, 0x7762, 0xB846, 0x7763, 0xB7FE, 0x7765, 0xB844, + 0x7766, 0xB7FC, 0x7767, 0xDEDF, 0x7768, 0xB845, 0x7769, 0xDEDE, + 0x776A, 0xB841, 0x776B, 0xB7FB, 0x776C, 0xB842, 0x776D, 0xDEE2, + 0x776E, 0xE2E6, 0x776F, 0xE2E8, 0x7779, 0xB840, 0x777C, 0xE2E3, + 0x777D, 0xBACC, 0x777E, 0xE2E9, 0x777F, 0xBACD, 0x7780, 0xE2E7, + 0x7781, 0xE2E2, 0x7782, 0xE2E5, 0x7783, 0xE2EA, 0x7784, 0xBACB, + 0x7785, 0xE2E4, 0x7787, 0xBD4E, 0x7788, 0xE6BF, 0x7789, 0xE6BE, + 0x778B, 0xBD51, 0x778C, 0xBD4F, 0x778D, 0xE6BC, 0x778E, 0xBD4D, + 0x778F, 0xE6BD, 0x7791, 0xBD50, 0x7795, 0xEA7D, 0x7797, 0xEAA1, + 0x7799, 0xEA7E, 0x779A, 0xEA76, 0x779B, 0xEA7A, 0x779C, 0xEA79, + 0x779D, 0xEA77, 0x779E, 0xBF66, 0x779F, 0xBF67, 0x77A0, 0xBF65, + 0x77A1, 0xEA78, 0x77A2, 0xEA7B, 0x77A3, 0xEA7C, 0x77A5, 0xBF68, + 0x77A7, 0xC140, 0x77A8, 0xEDA3, 0x77AA, 0xC0FC, 0x77AB, 0xED7B, + 0x77AC, 0xC0FE, 0x77AD, 0xC141, 0x77B0, 0xC0FD, 0x77B1, 0xEDA2, + 0x77B2, 0xED7C, 0x77B3, 0xC0FB, 0x77B4, 0xEDA1, 0x77B5, 0xED7A, + 0x77B6, 0xED7E, 0x77B7, 0xED7D, 0x77BA, 0xF055, 0x77BB, 0xC2A4, + 0x77BC, 0xC2A5, 0x77BD, 0xC2A2, 0x77BF, 0xC2A3, 0x77C2, 0xF054, + 0x77C4, 0xF27B, 0x77C7, 0xC3A9, 0x77C9, 0xF279, 0x77CA, 0xF27A, + 0x77CC, 0xF474, 0x77CD, 0xF477, 0x77CE, 0xF475, 0x77CF, 0xF476, + 0x77D0, 0xF5E0, 0x77D3, 0xC4EF, 0x77D4, 0xF7EB, 0x77D5, 0xF8B4, + 0x77D7, 0xC5F7, 0x77D8, 0xF8F8, 0x77D9, 0xF8F9, 0x77DA, 0xC666, + 0x77DB, 0xA5D9, 0x77DC, 0xACE1, 0x77DE, 0xDAC3, 0x77E0, 0xDEE3, + 0x77E2, 0xA5DA, 0x77E3, 0xA86F, 0x77E5, 0xAABE, 0x77E7, 0xCFE8, + 0x77E8, 0xCFE9, 0x77E9, 0xAF78, 0x77EC, 0xDAC4, 0x77ED, 0xB575, + 0x77EE, 0xB847, 0x77EF, 0xC142, 0x77F0, 0xEDA4, 0x77F1, 0xF27C, + 0x77F2, 0xF478, 0x77F3, 0xA5DB, 0x77F7, 0xCDA1, 0x77F8, 0xCD7A, + 0x77F9, 0xCD7C, 0x77FA, 0xCD7E, 0x77FB, 0xCD7D, 0x77FC, 0xCD7B, + 0x77FD, 0xAABF, 0x7802, 0xACE2, 0x7803, 0xCFF2, 0x7805, 0xCFED, + 0x7806, 0xCFEA, 0x7809, 0xCFF1, 0x780C, 0xACE4, 0x780D, 0xACE5, + 0x780E, 0xCFF0, 0x780F, 0xCFEF, 0x7810, 0xCFEE, 0x7811, 0xCFEB, + 0x7812, 0xCFEC, 0x7813, 0xCFF3, 0x7814, 0xACE3, 0x781D, 0xAF7C, + 0x781F, 0xAFA4, 0x7820, 0xAFA3, 0x7821, 0xD2E1, 0x7822, 0xD2DB, + 0x7823, 0xD2D9, 0x7825, 0xAFA1, 0x7826, 0xD6B9, 0x7827, 0xAF7A, + 0x7828, 0xD2DE, 0x7829, 0xD2E2, 0x782A, 0xD2E4, 0x782B, 0xD2E0, + 0x782C, 0xD2DA, 0x782D, 0xAFA2, 0x782E, 0xD2DF, 0x782F, 0xD2DD, + 0x7830, 0xAF79, 0x7831, 0xD2E5, 0x7832, 0xAFA5, 0x7833, 0xD2E3, + 0x7834, 0xAF7D, 0x7835, 0xD2DC, 0x7837, 0xAF7E, 0x7838, 0xAF7B, + 0x7843, 0xB2B9, 0x7845, 0xD6BA, 0x7848, 0xD6B3, 0x7849, 0xD6B5, + 0x784A, 0xD6B7, 0x784C, 0xD6B8, 0x784D, 0xD6B6, 0x784E, 0xB2BA, + 0x7850, 0xD6BB, 0x7852, 0xD6B4, 0x785C, 0xDAC8, 0x785D, 0xB576, + 0x785E, 0xDAD0, 0x7860, 0xDAC5, 0x7862, 0xDAD1, 0x7864, 0xDAC6, + 0x7865, 0xDAC7, 0x7868, 0xDACF, 0x7869, 0xDACE, 0x786A, 0xDACB, + 0x786B, 0xB2B8, 0x786C, 0xB577, 0x786D, 0xDAC9, 0x786E, 0xDACC, + 0x786F, 0xB578, 0x7870, 0xDACD, 0x7871, 0xDACA, 0x7879, 0xDEEE, + 0x787B, 0xDEF2, 0x787C, 0xB84E, 0x787E, 0xE2F0, 0x787F, 0xB851, + 0x7880, 0xDEF0, 0x7881, 0xF9D6, 0x7883, 0xDEED, 0x7884, 0xDEE8, + 0x7885, 0xDEEA, 0x7886, 0xDEEB, 0x7887, 0xDEE4, 0x7889, 0xB84D, + 0x788C, 0xB84C, 0x788E, 0xB848, 0x788F, 0xDEE7, 0x7891, 0xB84F, + 0x7893, 0xB850, 0x7894, 0xDEE6, 0x7895, 0xDEE9, 0x7896, 0xDEF1, + 0x7897, 0xB84A, 0x7898, 0xB84B, 0x7899, 0xDEEF, 0x789A, 0xDEE5, + 0x789E, 0xE2F2, 0x789F, 0xBAD0, 0x78A0, 0xE2F4, 0x78A1, 0xDEEC, + 0x78A2, 0xE2F6, 0x78A3, 0xBAD4, 0x78A4, 0xE2F7, 0x78A5, 0xE2F3, + 0x78A7, 0xBAD1, 0x78A8, 0xE2EF, 0x78A9, 0xBAD3, 0x78AA, 0xE2EC, + 0x78AB, 0xE2F1, 0x78AC, 0xE2F5, 0x78AD, 0xE2EE, 0x78B0, 0xB849, + 0x78B2, 0xE2EB, 0x78B3, 0xBAD2, 0x78B4, 0xE2ED, 0x78BA, 0xBD54, + 0x78BB, 0xE6C1, 0x78BC, 0xBD58, 0x78BE, 0xBD56, 0x78C1, 0xBACF, + 0x78C3, 0xE6C8, 0x78C4, 0xE6C9, 0x78C5, 0xBD53, 0x78C8, 0xE6C7, + 0x78C9, 0xE6CA, 0x78CA, 0xBD55, 0x78CB, 0xBD52, 0x78CC, 0xE6C3, + 0x78CD, 0xE6C0, 0x78CE, 0xE6C5, 0x78CF, 0xE6C2, 0x78D0, 0xBD59, + 0x78D1, 0xE6C4, 0x78D4, 0xE6C6, 0x78D5, 0xBD57, 0x78DA, 0xBF6A, + 0x78DB, 0xEAA8, 0x78DD, 0xEAA2, 0x78DE, 0xEAA6, 0x78DF, 0xEAAC, + 0x78E0, 0xEAAD, 0x78E1, 0xEAA9, 0x78E2, 0xEAAA, 0x78E3, 0xEAA7, + 0x78E5, 0xEAA4, 0x78E7, 0xBF6C, 0x78E8, 0xBF69, 0x78E9, 0xEAA3, + 0x78EA, 0xEAA5, 0x78EC, 0xBF6B, 0x78ED, 0xEAAB, 0x78EF, 0xC146, + 0x78F2, 0xEDAA, 0x78F3, 0xEDA5, 0x78F4, 0xC145, 0x78F7, 0xC143, + 0x78F9, 0xEDAC, 0x78FA, 0xC144, 0x78FB, 0xEDA8, 0x78FC, 0xEDA9, + 0x78FD, 0xEDA6, 0x78FE, 0xEDAD, 0x78FF, 0xF056, 0x7901, 0xC147, + 0x7902, 0xEDA7, 0x7904, 0xEDAE, 0x7905, 0xEDAB, 0x7909, 0xF05A, + 0x790C, 0xF057, 0x790E, 0xC2A6, 0x7910, 0xF05B, 0x7911, 0xF05D, + 0x7912, 0xF05C, 0x7913, 0xF058, 0x7914, 0xF059, 0x7917, 0xF2A3, + 0x7919, 0xC3AA, 0x791B, 0xF27E, 0x791C, 0xF2A2, 0x791D, 0xF27D, + 0x791E, 0xF2A4, 0x7921, 0xF2A1, 0x7923, 0xF47A, 0x7924, 0xF47D, + 0x7925, 0xF479, 0x7926, 0xC471, 0x7927, 0xF47B, 0x7928, 0xF47C, + 0x7929, 0xF47E, 0x792A, 0xC472, 0x792B, 0xC474, 0x792C, 0xC473, + 0x792D, 0xF5E1, 0x792F, 0xF5E3, 0x7931, 0xF5E2, 0x7935, 0xF6F6, + 0x7938, 0xF8B5, 0x7939, 0xF8FA, 0x793A, 0xA5DC, 0x793D, 0xCB72, + 0x793E, 0xAAC0, 0x793F, 0xCDA3, 0x7940, 0xAAC1, 0x7941, 0xAAC2, + 0x7942, 0xCDA2, 0x7944, 0xCFF8, 0x7945, 0xCFF7, 0x7946, 0xACE6, + 0x7947, 0xACE9, 0x7948, 0xACE8, 0x7949, 0xACE7, 0x794A, 0xCFF4, + 0x794B, 0xCFF6, 0x794C, 0xCFF5, 0x794F, 0xD2E8, 0x7950, 0xAFA7, + 0x7951, 0xD2EC, 0x7952, 0xD2EB, 0x7953, 0xD2EA, 0x7954, 0xD2E6, + 0x7955, 0xAFA6, 0x7956, 0xAFAA, 0x7957, 0xAFAD, 0x795A, 0xAFAE, + 0x795B, 0xD2E7, 0x795C, 0xD2E9, 0x795D, 0xAFAC, 0x795E, 0xAFAB, + 0x795F, 0xAFA9, 0x7960, 0xAFA8, 0x7961, 0xD6C2, 0x7963, 0xD6C0, + 0x7964, 0xD6BC, 0x7965, 0xB2BB, 0x7967, 0xD6BD, 0x7968, 0xB2BC, + 0x7969, 0xD6BE, 0x796A, 0xD6BF, 0x796B, 0xD6C1, 0x796D, 0xB2BD, + 0x7970, 0xDAD5, 0x7972, 0xDAD4, 0x7973, 0xDAD3, 0x7974, 0xDAD2, + 0x7979, 0xDEF6, 0x797A, 0xB852, 0x797C, 0xDEF3, 0x797D, 0xDEF5, + 0x797F, 0xB853, 0x7981, 0xB854, 0x7982, 0xDEF4, 0x7988, 0xE341, + 0x798A, 0xE2F9, 0x798B, 0xE2FA, 0x798D, 0xBAD7, 0x798E, 0xBAD5, + 0x798F, 0xBAD6, 0x7990, 0xE343, 0x7992, 0xE342, 0x7993, 0xE2FE, + 0x7994, 0xE2FD, 0x7995, 0xE2FC, 0x7996, 0xE2FB, 0x7997, 0xE340, + 0x7998, 0xE2F8, 0x799A, 0xE6CB, 0x799B, 0xE6D0, 0x799C, 0xE6CE, + 0x79A0, 0xE6CD, 0x79A1, 0xE6CC, 0x79A2, 0xE6CF, 0x79A4, 0xEAAE, + 0x79A6, 0xBF6D, 0x79A7, 0xC148, 0x79A8, 0xEDB0, 0x79AA, 0xC149, + 0x79AB, 0xEDAF, 0x79AC, 0xF05F, 0x79AD, 0xF05E, 0x79AE, 0xC2A7, + 0x79B0, 0xF2A5, 0x79B1, 0xC3AB, 0x79B2, 0xF4A1, 0x79B3, 0xC5A1, + 0x79B4, 0xF6F7, 0x79B6, 0xF8B7, 0x79B7, 0xF8B6, 0x79B8, 0xC9A8, + 0x79B9, 0xACEA, 0x79BA, 0xACEB, 0x79BB, 0xD6C3, 0x79BD, 0xB856, + 0x79BE, 0xA5DD, 0x79BF, 0xA872, 0x79C0, 0xA871, 0x79C1, 0xA870, + 0x79C5, 0xCDA4, 0x79C8, 0xAAC4, 0x79C9, 0xAAC3, 0x79CB, 0xACEE, + 0x79CD, 0xCFFA, 0x79CE, 0xCFFD, 0x79CF, 0xCFFB, 0x79D1, 0xACEC, + 0x79D2, 0xACED, 0x79D5, 0xCFF9, 0x79D6, 0xCFFC, 0x79D8, 0xAFB5, + 0x79DC, 0xD2F3, 0x79DD, 0xD2F5, 0x79DE, 0xD2F4, 0x79DF, 0xAFB2, + 0x79E0, 0xD2EF, 0x79E3, 0xAFB0, 0x79E4, 0xAFAF, 0x79E6, 0xAFB3, + 0x79E7, 0xAFB1, 0x79E9, 0xAFB4, 0x79EA, 0xD2F2, 0x79EB, 0xD2ED, + 0x79EC, 0xD2EE, 0x79ED, 0xD2F1, 0x79EE, 0xD2F0, 0x79F6, 0xD6C6, + 0x79F7, 0xD6C7, 0x79F8, 0xD6C5, 0x79FA, 0xD6C4, 0x79FB, 0xB2BE, + 0x7A00, 0xB57D, 0x7A02, 0xDAD6, 0x7A03, 0xDAD8, 0x7A04, 0xDADA, + 0x7A05, 0xB57C, 0x7A08, 0xB57A, 0x7A0A, 0xDAD7, 0x7A0B, 0xB57B, + 0x7A0C, 0xDAD9, 0x7A0D, 0xB579, 0x7A10, 0xDF41, 0x7A11, 0xDEF7, + 0x7A12, 0xDEFA, 0x7A13, 0xDEFE, 0x7A14, 0xB85A, 0x7A15, 0xDEFC, + 0x7A17, 0xDEFB, 0x7A18, 0xDEF8, 0x7A19, 0xDEF9, 0x7A1A, 0xB858, + 0x7A1B, 0xDF40, 0x7A1C, 0xB857, 0x7A1E, 0xB85C, 0x7A1F, 0xB85B, + 0x7A20, 0xB859, 0x7A22, 0xDEFD, 0x7A26, 0xE349, 0x7A28, 0xE348, + 0x7A2B, 0xE344, 0x7A2E, 0xBAD8, 0x7A2F, 0xE347, 0x7A30, 0xE346, + 0x7A31, 0xBAD9, 0x7A37, 0xBD5E, 0x7A39, 0xE6D2, 0x7A3B, 0xBD5F, + 0x7A3C, 0xBD5B, 0x7A3D, 0xBD5D, 0x7A3F, 0xBD5A, 0x7A40, 0xBD5C, + 0x7A44, 0xEAAF, 0x7A46, 0xBF70, 0x7A47, 0xEAB1, 0x7A48, 0xEAB0, + 0x7A4A, 0xE345, 0x7A4B, 0xBF72, 0x7A4C, 0xBF71, 0x7A4D, 0xBF6E, + 0x7A4E, 0xBF6F, 0x7A54, 0xEDB5, 0x7A56, 0xEDB3, 0x7A57, 0xC14A, + 0x7A58, 0xEDB4, 0x7A5A, 0xEDB6, 0x7A5B, 0xEDB2, 0x7A5C, 0xEDB1, + 0x7A5F, 0xF060, 0x7A60, 0xC2AA, 0x7A61, 0xC2A8, 0x7A62, 0xC2A9, + 0x7A67, 0xF2A6, 0x7A68, 0xF2A7, 0x7A69, 0xC3AD, 0x7A6B, 0xC3AC, + 0x7A6C, 0xF4A3, 0x7A6D, 0xF4A4, 0x7A6E, 0xF4A2, 0x7A70, 0xF6F8, + 0x7A71, 0xF6F9, 0x7A74, 0xA5DE, 0x7A75, 0xCA48, 0x7A76, 0xA873, + 0x7A78, 0xCDA5, 0x7A79, 0xAAC6, 0x7A7A, 0xAAC5, 0x7A7B, 0xCDA6, + 0x7A7E, 0xD040, 0x7A7F, 0xACEF, 0x7A80, 0xCFFE, 0x7A81, 0xACF0, + 0x7A84, 0xAFB6, 0x7A85, 0xD2F8, 0x7A86, 0xD2F6, 0x7A87, 0xD2FC, + 0x7A88, 0xAFB7, 0x7A89, 0xD2F7, 0x7A8A, 0xD2FB, 0x7A8B, 0xD2F9, + 0x7A8C, 0xD2FA, 0x7A8F, 0xD6C8, 0x7A90, 0xD6CA, 0x7A92, 0xB2BF, + 0x7A94, 0xD6C9, 0x7A95, 0xB2C0, 0x7A96, 0xB5A2, 0x7A97, 0xB5A1, + 0x7A98, 0xB57E, 0x7A99, 0xDADB, 0x7A9E, 0xDF44, 0x7A9F, 0xB85D, + 0x7AA0, 0xB85E, 0x7AA2, 0xDF43, 0x7AA3, 0xDF42, 0x7AA8, 0xE34A, + 0x7AA9, 0xBADB, 0x7AAA, 0xBADA, 0x7AAB, 0xE34B, 0x7AAC, 0xE34C, + 0x7AAE, 0xBD61, 0x7AAF, 0xBD60, 0x7AB1, 0xEAB5, 0x7AB2, 0xE6D3, + 0x7AB3, 0xE6D5, 0x7AB4, 0xE6D4, 0x7AB5, 0xEAB4, 0x7AB6, 0xEAB2, + 0x7AB7, 0xEAB6, 0x7AB8, 0xEAB3, 0x7ABA, 0xBF73, 0x7ABE, 0xEDB7, + 0x7ABF, 0xC14B, 0x7AC0, 0xEDB8, 0x7AC1, 0xEDB9, 0x7AC4, 0xC2AB, + 0x7AC5, 0xC2AC, 0x7AC7, 0xC475, 0x7ACA, 0xC5D1, 0x7ACB, 0xA5DF, + 0x7AD1, 0xD041, 0x7AD8, 0xD2FD, 0x7AD9, 0xAFB8, 0x7ADF, 0xB3BA, + 0x7AE0, 0xB3B9, 0x7AE3, 0xB5A4, 0x7AE4, 0xDADD, 0x7AE5, 0xB5A3, + 0x7AE6, 0xDADC, 0x7AEB, 0xDF45, 0x7AED, 0xBADC, 0x7AEE, 0xE34D, + 0x7AEF, 0xBADD, 0x7AF6, 0xC476, 0x7AF7, 0xF4A5, 0x7AF9, 0xA6CB, + 0x7AFA, 0xAAC7, 0x7AFB, 0xCDA7, 0x7AFD, 0xACF2, 0x7AFF, 0xACF1, + 0x7B00, 0xD042, 0x7B01, 0xD043, 0x7B04, 0xD340, 0x7B05, 0xD342, + 0x7B06, 0xAFB9, 0x7B08, 0xD344, 0x7B09, 0xD347, 0x7B0A, 0xD345, + 0x7B0E, 0xD346, 0x7B0F, 0xD343, 0x7B10, 0xD2FE, 0x7B11, 0xAFBA, + 0x7B12, 0xD348, 0x7B13, 0xD341, 0x7B18, 0xD6D3, 0x7B19, 0xB2C6, + 0x7B1A, 0xD6DC, 0x7B1B, 0xB2C3, 0x7B1D, 0xD6D5, 0x7B1E, 0xB2C7, + 0x7B20, 0xB2C1, 0x7B22, 0xD6D0, 0x7B23, 0xD6DD, 0x7B24, 0xD6D1, + 0x7B25, 0xD6CE, 0x7B26, 0xB2C5, 0x7B28, 0xB2C2, 0x7B2A, 0xD6D4, + 0x7B2B, 0xD6D7, 0x7B2C, 0xB2C4, 0x7B2D, 0xD6D8, 0x7B2E, 0xB2C8, + 0x7B2F, 0xD6D9, 0x7B30, 0xD6CF, 0x7B31, 0xD6D6, 0x7B32, 0xD6DA, + 0x7B33, 0xD6D2, 0x7B34, 0xD6CD, 0x7B35, 0xD6CB, 0x7B38, 0xD6DB, + 0x7B3B, 0xDADF, 0x7B40, 0xDAE4, 0x7B44, 0xDAE0, 0x7B45, 0xDAE6, + 0x7B46, 0xB5A7, 0x7B47, 0xD6CC, 0x7B48, 0xDAE1, 0x7B49, 0xB5A5, + 0x7B4A, 0xDADE, 0x7B4B, 0xB5AC, 0x7B4C, 0xDAE2, 0x7B4D, 0xB5AB, + 0x7B4E, 0xDAE3, 0x7B4F, 0xB5AD, 0x7B50, 0xB5A8, 0x7B51, 0xB5AE, + 0x7B52, 0xB5A9, 0x7B54, 0xB5AA, 0x7B56, 0xB5A6, 0x7B58, 0xDAE5, + 0x7B60, 0xB861, 0x7B61, 0xDF50, 0x7B63, 0xDF53, 0x7B64, 0xDF47, + 0x7B65, 0xDF4C, 0x7B66, 0xDF46, 0x7B67, 0xB863, 0x7B69, 0xDF4A, + 0x7B6D, 0xDF48, 0x7B6E, 0xB862, 0x7B70, 0xDF4F, 0x7B71, 0xDF4E, + 0x7B72, 0xDF4B, 0x7B73, 0xDF4D, 0x7B74, 0xDF49, 0x7B75, 0xBAE1, + 0x7B76, 0xDF52, 0x7B77, 0xB85F, 0x7B78, 0xDF51, 0x7B82, 0xE35D, + 0x7B84, 0xBAE8, 0x7B85, 0xE358, 0x7B87, 0xBAE7, 0x7B88, 0xE34E, + 0x7B8A, 0xE350, 0x7B8B, 0xBAE0, 0x7B8C, 0xE355, 0x7B8D, 0xE354, + 0x7B8E, 0xE357, 0x7B8F, 0xBAE5, 0x7B90, 0xE352, 0x7B91, 0xE351, + 0x7B94, 0xBAE4, 0x7B95, 0xBADF, 0x7B96, 0xE353, 0x7B97, 0xBAE2, + 0x7B98, 0xE359, 0x7B99, 0xE35B, 0x7B9B, 0xE356, 0x7B9C, 0xE34F, + 0x7B9D, 0xBAE3, 0x7BA0, 0xBD69, 0x7BA1, 0xBADE, 0x7BA4, 0xE35C, + 0x7BAC, 0xE6D9, 0x7BAD, 0xBD62, 0x7BAF, 0xE6DB, 0x7BB1, 0xBD63, + 0x7BB4, 0xBD65, 0x7BB5, 0xE6DE, 0x7BB7, 0xE6D6, 0x7BB8, 0xBAE6, + 0x7BB9, 0xE6DC, 0x7BBE, 0xE6D8, 0x7BC0, 0xB860, 0x7BC1, 0xBD68, + 0x7BC4, 0xBD64, 0x7BC6, 0xBD66, 0x7BC7, 0xBD67, 0x7BC9, 0xBF76, + 0x7BCA, 0xE6DD, 0x7BCB, 0xE6D7, 0x7BCC, 0xBD6A, 0x7BCE, 0xE6DA, + 0x7BD4, 0xEAC0, 0x7BD5, 0xEABB, 0x7BD8, 0xEAC5, 0x7BD9, 0xBF74, + 0x7BDA, 0xEABD, 0x7BDB, 0xBF78, 0x7BDC, 0xEAC3, 0x7BDD, 0xEABA, + 0x7BDE, 0xEAB7, 0x7BDF, 0xEAC6, 0x7BE0, 0xC151, 0x7BE1, 0xBF79, + 0x7BE2, 0xEAC2, 0x7BE3, 0xEAB8, 0x7BE4, 0xBF77, 0x7BE5, 0xEABC, + 0x7BE6, 0xBF7B, 0x7BE7, 0xEAB9, 0x7BE8, 0xEABE, 0x7BE9, 0xBF7A, + 0x7BEA, 0xEAC1, 0x7BEB, 0xEAC4, 0x7BF0, 0xEDCB, 0x7BF1, 0xEDCC, + 0x7BF2, 0xEDBC, 0x7BF3, 0xEDC3, 0x7BF4, 0xEDC1, 0x7BF7, 0xC14F, + 0x7BF8, 0xEDC8, 0x7BF9, 0xEABF, 0x7BFB, 0xEDBF, 0x7BFD, 0xEDC9, + 0x7BFE, 0xC14E, 0x7BFF, 0xEDBE, 0x7C00, 0xEDBD, 0x7C01, 0xEDC7, + 0x7C02, 0xEDC4, 0x7C03, 0xEDC6, 0x7C05, 0xEDBA, 0x7C06, 0xEDCA, + 0x7C07, 0xC14C, 0x7C09, 0xEDC5, 0x7C0A, 0xEDCE, 0x7C0B, 0xEDC2, + 0x7C0C, 0xC150, 0x7C0D, 0xC14D, 0x7C0E, 0xEDC0, 0x7C0F, 0xEDBB, + 0x7C10, 0xEDCD, 0x7C11, 0xBF75, 0x7C19, 0xF063, 0x7C1C, 0xF061, + 0x7C1D, 0xF067, 0x7C1E, 0xC2B0, 0x7C1F, 0xF065, 0x7C20, 0xF064, + 0x7C21, 0xC2B2, 0x7C22, 0xF06A, 0x7C23, 0xC2B1, 0x7C25, 0xF06B, + 0x7C26, 0xF068, 0x7C27, 0xC2AE, 0x7C28, 0xF069, 0x7C29, 0xF062, + 0x7C2A, 0xC2AF, 0x7C2B, 0xC2AD, 0x7C2C, 0xF2AB, 0x7C2D, 0xF066, + 0x7C30, 0xF06C, 0x7C33, 0xF2A8, 0x7C37, 0xC3B2, 0x7C38, 0xC3B0, + 0x7C39, 0xF2AA, 0x7C3B, 0xF2AC, 0x7C3C, 0xF2A9, 0x7C3D, 0xC3B1, + 0x7C3E, 0xC3AE, 0x7C3F, 0xC3AF, 0x7C40, 0xC3B3, 0x7C43, 0xC478, + 0x7C45, 0xF4AA, 0x7C47, 0xF4A9, 0x7C48, 0xF4A7, 0x7C49, 0xF4A6, + 0x7C4A, 0xF4A8, 0x7C4C, 0xC477, 0x7C4D, 0xC479, 0x7C50, 0xC4F0, + 0x7C53, 0xF5E5, 0x7C54, 0xF5E4, 0x7C57, 0xF6FA, 0x7C59, 0xF6FC, + 0x7C5A, 0xF6FE, 0x7C5B, 0xF6FD, 0x7C5C, 0xF6FB, 0x7C5F, 0xC5A3, + 0x7C60, 0xC5A2, 0x7C63, 0xC5D3, 0x7C64, 0xC5D2, 0x7C65, 0xC5D4, + 0x7C66, 0xF7ED, 0x7C67, 0xF7EC, 0x7C69, 0xF8FB, 0x7C6A, 0xF8B8, + 0x7C6B, 0xF8FC, 0x7C6C, 0xC658, 0x7C6E, 0xC659, 0x7C6F, 0xF96D, + 0x7C72, 0xC67E, 0x7C73, 0xA6CC, 0x7C75, 0xCDA8, 0x7C78, 0xD045, + 0x7C79, 0xD046, 0x7C7A, 0xD044, 0x7C7D, 0xACF3, 0x7C7F, 0xD047, + 0x7C80, 0xD048, 0x7C81, 0xD049, 0x7C84, 0xD349, 0x7C85, 0xD34F, + 0x7C88, 0xD34D, 0x7C89, 0xAFBB, 0x7C8A, 0xD34B, 0x7C8C, 0xD34C, + 0x7C8D, 0xD34E, 0x7C91, 0xD34A, 0x7C92, 0xB2C9, 0x7C94, 0xD6DE, + 0x7C95, 0xB2CB, 0x7C96, 0xD6E0, 0x7C97, 0xB2CA, 0x7C98, 0xD6DF, + 0x7C9E, 0xDAE8, 0x7C9F, 0xB5AF, 0x7CA1, 0xDAEA, 0x7CA2, 0xDAE7, + 0x7CA3, 0xD6E1, 0x7CA5, 0xB5B0, 0x7CA7, 0xF9DB, 0x7CA8, 0xDAE9, + 0x7CAF, 0xDF56, 0x7CB1, 0xB864, 0x7CB2, 0xDF54, 0x7CB3, 0xB865, + 0x7CB4, 0xDF55, 0x7CB5, 0xB866, 0x7CB9, 0xBAE9, 0x7CBA, 0xE361, + 0x7CBB, 0xE35E, 0x7CBC, 0xE360, 0x7CBD, 0xBAEA, 0x7CBE, 0xBAEB, + 0x7CBF, 0xE35F, 0x7CC5, 0xE6DF, 0x7CC8, 0xE6E0, 0x7CCA, 0xBD6B, + 0x7CCB, 0xE6E2, 0x7CCC, 0xE6E1, 0x7CCE, 0xA261, 0x7CD0, 0xEACA, + 0x7CD1, 0xEACB, 0x7CD2, 0xEAC7, 0x7CD4, 0xEAC8, 0x7CD5, 0xBF7C, + 0x7CD6, 0xBF7D, 0x7CD7, 0xEAC9, 0x7CD9, 0xC157, 0x7CDC, 0xC153, + 0x7CDD, 0xC158, 0x7CDE, 0xC154, 0x7CDF, 0xC156, 0x7CE0, 0xC152, + 0x7CE2, 0xC155, 0x7CE7, 0xC2B3, 0x7CE8, 0xEDCF, 0x7CEA, 0xF2AE, + 0x7CEC, 0xF2AD, 0x7CEE, 0xF4AB, 0x7CEF, 0xC47A, 0x7CF0, 0xC47B, + 0x7CF1, 0xF741, 0x7CF2, 0xF5E6, 0x7CF4, 0xF740, 0x7CF6, 0xF8FD, + 0x7CF7, 0xF9A4, 0x7CF8, 0xA6CD, 0x7CFB, 0xA874, 0x7CFD, 0xCDA9, + 0x7CFE, 0xAAC8, 0x7D00, 0xACF6, 0x7D01, 0xD04C, 0x7D02, 0xACF4, + 0x7D03, 0xD04A, 0x7D04, 0xACF9, 0x7D05, 0xACF5, 0x7D06, 0xACFA, + 0x7D07, 0xACF8, 0x7D08, 0xD04B, 0x7D09, 0xACF7, 0x7D0A, 0xAFBF, + 0x7D0B, 0xAFBE, 0x7D0C, 0xD35A, 0x7D0D, 0xAFC7, 0x7D0E, 0xD353, + 0x7D0F, 0xD359, 0x7D10, 0xAFC3, 0x7D11, 0xD352, 0x7D12, 0xD358, + 0x7D13, 0xD356, 0x7D14, 0xAFC2, 0x7D15, 0xAFC4, 0x7D16, 0xD355, + 0x7D17, 0xAFBD, 0x7D18, 0xD354, 0x7D19, 0xAFC8, 0x7D1A, 0xAFC5, + 0x7D1B, 0xAFC9, 0x7D1C, 0xAFC6, 0x7D1D, 0xD351, 0x7D1E, 0xD350, + 0x7D1F, 0xD357, 0x7D20, 0xAFC0, 0x7D21, 0xAFBC, 0x7D22, 0xAFC1, + 0x7D28, 0xD6F0, 0x7D29, 0xD6E9, 0x7D2B, 0xB5B5, 0x7D2C, 0xD6E8, + 0x7D2E, 0xB2CF, 0x7D2F, 0xB2D6, 0x7D30, 0xB2D3, 0x7D31, 0xB2D9, + 0x7D32, 0xB2D8, 0x7D33, 0xB2D4, 0x7D35, 0xD6E2, 0x7D36, 0xD6E5, + 0x7D38, 0xD6E4, 0x7D39, 0xB2D0, 0x7D3A, 0xD6E6, 0x7D3B, 0xD6EF, + 0x7D3C, 0xB2D1, 0x7D3D, 0xD6E3, 0x7D3E, 0xD6EC, 0x7D3F, 0xD6ED, + 0x7D40, 0xB2D2, 0x7D41, 0xD6EA, 0x7D42, 0xB2D7, 0x7D43, 0xB2CD, + 0x7D44, 0xB2D5, 0x7D45, 0xD6E7, 0x7D46, 0xB2CC, 0x7D47, 0xD6EB, + 0x7D4A, 0xD6EE, 0x7D4E, 0xDAFB, 0x7D4F, 0xDAF2, 0x7D50, 0xB5B2, + 0x7D51, 0xDAF9, 0x7D52, 0xDAF6, 0x7D53, 0xDAEE, 0x7D54, 0xDAF7, + 0x7D55, 0xB5B4, 0x7D56, 0xDAEF, 0x7D58, 0xDAEB, 0x7D5B, 0xB86C, + 0x7D5C, 0xDAF4, 0x7D5E, 0xB5B1, 0x7D5F, 0xDAFA, 0x7D61, 0xB5B8, + 0x7D62, 0xB5BA, 0x7D63, 0xDAED, 0x7D66, 0xB5B9, 0x7D67, 0xDAF0, + 0x7D68, 0xB5B3, 0x7D69, 0xDAF8, 0x7D6A, 0xDAF1, 0x7D6B, 0xDAF5, + 0x7D6D, 0xDAF3, 0x7D6E, 0xB5B6, 0x7D6F, 0xDAEC, 0x7D70, 0xB5BB, + 0x7D71, 0xB2CE, 0x7D72, 0xB5B7, 0x7D73, 0xB5BC, 0x7D79, 0xB868, + 0x7D7A, 0xDF5D, 0x7D7B, 0xDF5F, 0x7D7C, 0xDF61, 0x7D7D, 0xDF65, + 0x7D7F, 0xDF5B, 0x7D80, 0xDF59, 0x7D81, 0xB86A, 0x7D83, 0xDF60, + 0x7D84, 0xDF64, 0x7D85, 0xDF5C, 0x7D86, 0xDF58, 0x7D88, 0xDF57, + 0x7D8C, 0xDF62, 0x7D8D, 0xDF5A, 0x7D8E, 0xDF5E, 0x7D8F, 0xB86B, + 0x7D91, 0xB869, 0x7D92, 0xDF66, 0x7D93, 0xB867, 0x7D94, 0xDF63, + 0x7D96, 0xE372, 0x7D9C, 0xBAEE, 0x7D9D, 0xE36A, 0x7D9E, 0xBD78, + 0x7D9F, 0xE374, 0x7DA0, 0xBAF1, 0x7DA1, 0xE378, 0x7DA2, 0xBAF7, + 0x7DA3, 0xE365, 0x7DA6, 0xE375, 0x7DA7, 0xE362, 0x7DA9, 0xE377, + 0x7DAA, 0xE366, 0x7DAC, 0xBAFE, 0x7DAD, 0xBAFB, 0x7DAE, 0xE376, + 0x7DAF, 0xE370, 0x7DB0, 0xBAED, 0x7DB1, 0xBAF5, 0x7DB2, 0xBAF4, + 0x7DB4, 0xBAF3, 0x7DB5, 0xBAF9, 0x7DB7, 0xE363, 0x7DB8, 0xBAFA, + 0x7DB9, 0xE371, 0x7DBA, 0xBAF6, 0x7DBB, 0xBAEC, 0x7DBC, 0xE373, + 0x7DBD, 0xBAEF, 0x7DBE, 0xBAF0, 0x7DBF, 0xBAF8, 0x7DC0, 0xE368, + 0x7DC1, 0xE367, 0x7DC2, 0xE364, 0x7DC4, 0xE36C, 0x7DC5, 0xE369, + 0x7DC6, 0xE36D, 0x7DC7, 0xBAFD, 0x7DC9, 0xE379, 0x7DCA, 0xBAF2, + 0x7DCB, 0xE36E, 0x7DCC, 0xE36F, 0x7DCE, 0xE36B, 0x7DD2, 0xBAFC, + 0x7DD7, 0xE6E7, 0x7DD8, 0xBD70, 0x7DD9, 0xBD79, 0x7DDA, 0xBD75, + 0x7DDB, 0xE6E4, 0x7DDD, 0xBD72, 0x7DDE, 0xBD76, 0x7DDF, 0xE6F0, + 0x7DE0, 0xBD6C, 0x7DE1, 0xE6E8, 0x7DE3, 0xBD74, 0x7DE6, 0xE6EB, + 0x7DE7, 0xE6E6, 0x7DE8, 0xBD73, 0x7DE9, 0xBD77, 0x7DEA, 0xE6E5, + 0x7DEC, 0xBD71, 0x7DEE, 0xE6EF, 0x7DEF, 0xBD6E, 0x7DF0, 0xE6EE, + 0x7DF1, 0xE6ED, 0x7DF2, 0xBD7A, 0x7DF3, 0xE572, 0x7DF4, 0xBD6D, + 0x7DF6, 0xE6EC, 0x7DF7, 0xE6E3, 0x7DF9, 0xBD7B, 0x7DFA, 0xE6EA, + 0x7DFB, 0xBD6F, 0x7E03, 0xE6E9, 0x7E08, 0xBFA2, 0x7E09, 0xBFA7, + 0x7E0A, 0xBF7E, 0x7E0B, 0xEAD8, 0x7E0C, 0xEACF, 0x7E0D, 0xEADB, + 0x7E0E, 0xEAD3, 0x7E0F, 0xEAD9, 0x7E10, 0xBFA8, 0x7E11, 0xBFA1, + 0x7E12, 0xEACC, 0x7E13, 0xEAD2, 0x7E14, 0xEADC, 0x7E15, 0xEAD5, + 0x7E16, 0xEADA, 0x7E17, 0xEACE, 0x7E1A, 0xEAD6, 0x7E1B, 0xBFA3, + 0x7E1C, 0xEAD4, 0x7E1D, 0xBFA6, 0x7E1E, 0xBFA5, 0x7E1F, 0xEAD0, + 0x7E20, 0xEAD1, 0x7E21, 0xEACD, 0x7E22, 0xEAD7, 0x7E23, 0xBFA4, + 0x7E24, 0xEADE, 0x7E25, 0xEADD, 0x7E29, 0xEDDA, 0x7E2A, 0xEDD6, + 0x7E2B, 0xC15F, 0x7E2D, 0xEDD0, 0x7E2E, 0xC159, 0x7E2F, 0xC169, + 0x7E30, 0xEDDC, 0x7E31, 0xC161, 0x7E32, 0xC15D, 0x7E33, 0xEDD3, + 0x7E34, 0xC164, 0x7E35, 0xC167, 0x7E36, 0xEDDE, 0x7E37, 0xC15C, + 0x7E38, 0xEDD5, 0x7E39, 0xC165, 0x7E3A, 0xEDE0, 0x7E3B, 0xEDDD, + 0x7E3C, 0xEDD1, 0x7E3D, 0xC160, 0x7E3E, 0xC15A, 0x7E3F, 0xC168, + 0x7E40, 0xEDD8, 0x7E41, 0xC163, 0x7E42, 0xEDD2, 0x7E43, 0xC15E, + 0x7E44, 0xEDDF, 0x7E45, 0xC162, 0x7E46, 0xC15B, 0x7E47, 0xEDD9, + 0x7E48, 0xC166, 0x7E49, 0xEDD7, 0x7E4C, 0xEDDB, 0x7E50, 0xF06E, + 0x7E51, 0xF074, 0x7E52, 0xC2B9, 0x7E53, 0xF077, 0x7E54, 0xC2B4, + 0x7E55, 0xC2B5, 0x7E56, 0xF06F, 0x7E57, 0xF076, 0x7E58, 0xF071, + 0x7E59, 0xC2BA, 0x7E5A, 0xC2B7, 0x7E5C, 0xF06D, 0x7E5E, 0xC2B6, + 0x7E5F, 0xF073, 0x7E60, 0xF075, 0x7E61, 0xC2B8, 0x7E62, 0xF072, + 0x7E63, 0xF070, 0x7E68, 0xF2B8, 0x7E69, 0xC3B7, 0x7E6A, 0xC3B8, + 0x7E6B, 0xC3B4, 0x7E6D, 0xC3B5, 0x7E6F, 0xF2B4, 0x7E70, 0xF2B2, + 0x7E72, 0xF2B6, 0x7E73, 0xC3BA, 0x7E74, 0xF2B7, 0x7E75, 0xF2B0, + 0x7E76, 0xF2AF, 0x7E77, 0xF2B3, 0x7E78, 0xF2B1, 0x7E79, 0xC3B6, + 0x7E7A, 0xF2B5, 0x7E7B, 0xF4AC, 0x7E7C, 0xC47E, 0x7E7D, 0xC47D, + 0x7E7E, 0xF4AD, 0x7E80, 0xF4AF, 0x7E81, 0xF4AE, 0x7E82, 0xC4A1, + 0x7E86, 0xF5EB, 0x7E87, 0xF5E8, 0x7E88, 0xF5E9, 0x7E8A, 0xF5E7, + 0x7E8B, 0xF5EA, 0x7E8C, 0xC4F2, 0x7E8D, 0xF5EC, 0x7E8F, 0xC4F1, + 0x7E91, 0xF742, 0x7E93, 0xC5D5, 0x7E94, 0xC5D7, 0x7E95, 0xF7EE, + 0x7E96, 0xC5D6, 0x7E97, 0xF8B9, 0x7E98, 0xF940, 0x7E99, 0xF942, + 0x7E9A, 0xF8FE, 0x7E9B, 0xF941, 0x7E9C, 0xC66C, 0x7F36, 0xA6CE, + 0x7F38, 0xACFB, 0x7F39, 0xD26F, 0x7F3A, 0xAFCA, 0x7F3D, 0xB2DA, + 0x7F3E, 0xDAFC, 0x7F3F, 0xDAFD, 0x7F43, 0xEADF, 0x7F44, 0xC16A, + 0x7F45, 0xEDE1, 0x7F48, 0xC2BB, 0x7F4A, 0xF2BA, 0x7F4B, 0xF2B9, + 0x7F4C, 0xC4A2, 0x7F4D, 0xF5ED, 0x7F4F, 0xF743, 0x7F50, 0xC5F8, + 0x7F51, 0xCA49, 0x7F54, 0xAAC9, 0x7F55, 0xA875, 0x7F58, 0xD04D, + 0x7F5B, 0xD360, 0x7F5C, 0xD35B, 0x7F5D, 0xD35F, 0x7F5E, 0xD35D, + 0x7F5F, 0xAFCB, 0x7F60, 0xD35E, 0x7F61, 0xD35C, 0x7F63, 0xD6F1, + 0x7F65, 0xDAFE, 0x7F66, 0xDB40, 0x7F67, 0xDF69, 0x7F68, 0xDF6A, + 0x7F69, 0xB86E, 0x7F6A, 0xB86F, 0x7F6B, 0xDF68, 0x7F6C, 0xDF6B, + 0x7F6D, 0xDF67, 0x7F6E, 0xB86D, 0x7F70, 0xBB40, 0x7F72, 0xB870, + 0x7F73, 0xE37A, 0x7F75, 0xBD7C, 0x7F76, 0xE6F1, 0x7F77, 0xBD7D, + 0x7F79, 0xBFA9, 0x7F7A, 0xEAE2, 0x7F7B, 0xEAE0, 0x7F7C, 0xEAE1, + 0x7F7D, 0xEDE4, 0x7F7E, 0xEDE3, 0x7F7F, 0xEDE2, 0x7F83, 0xF2BB, + 0x7F85, 0xC3B9, 0x7F86, 0xF2BC, 0x7F87, 0xF744, 0x7F88, 0xC5F9, + 0x7F89, 0xF8BA, 0x7F8A, 0xA6CF, 0x7F8B, 0xAACB, 0x7F8C, 0xAACA, + 0x7F8D, 0xD04F, 0x7F8E, 0xACFC, 0x7F91, 0xD04E, 0x7F92, 0xD362, + 0x7F94, 0xAFCC, 0x7F95, 0xD6F2, 0x7F96, 0xD361, 0x7F9A, 0xB2DC, + 0x7F9B, 0xD6F5, 0x7F9C, 0xD6F3, 0x7F9D, 0xD6F4, 0x7F9E, 0xB2DB, + 0x7FA0, 0xDB42, 0x7FA1, 0xDB43, 0x7FA2, 0xDB41, 0x7FA4, 0xB873, + 0x7FA5, 0xDF6D, 0x7FA6, 0xDF6C, 0x7FA7, 0xDF6E, 0x7FA8, 0xB872, + 0x7FA9, 0xB871, 0x7FAC, 0xE6F2, 0x7FAD, 0xE6F4, 0x7FAF, 0xBD7E, + 0x7FB0, 0xE6F3, 0x7FB1, 0xEAE3, 0x7FB2, 0xBFAA, 0x7FB3, 0xF079, + 0x7FB5, 0xF078, 0x7FB6, 0xC3BB, 0x7FB7, 0xF2BD, 0x7FB8, 0xC3BD, + 0x7FB9, 0xC3BC, 0x7FBA, 0xF4B0, 0x7FBB, 0xF5EE, 0x7FBC, 0xC4F3, + 0x7FBD, 0xA6D0, 0x7FBE, 0xD050, 0x7FBF, 0xACFD, 0x7FC0, 0xD365, + 0x7FC1, 0xAFCE, 0x7FC2, 0xD364, 0x7FC3, 0xD363, 0x7FC5, 0xAFCD, + 0x7FC7, 0xD6FB, 0x7FC9, 0xD6FD, 0x7FCA, 0xD6F6, 0x7FCB, 0xD6F7, + 0x7FCC, 0xB2DD, 0x7FCD, 0xD6F8, 0x7FCE, 0xB2DE, 0x7FCF, 0xD6FC, + 0x7FD0, 0xD6F9, 0x7FD1, 0xD6FA, 0x7FD2, 0xB2DF, 0x7FD4, 0xB5BE, + 0x7FD5, 0xB5BF, 0x7FD7, 0xDB44, 0x7FDB, 0xDF6F, 0x7FDC, 0xDF70, + 0x7FDE, 0xE37E, 0x7FDF, 0xBB43, 0x7FE0, 0xBB41, 0x7FE1, 0xBB42, + 0x7FE2, 0xE37B, 0x7FE3, 0xE37C, 0x7FE5, 0xE37D, 0x7FE6, 0xE6F9, + 0x7FE8, 0xE6FA, 0x7FE9, 0xBDA1, 0x7FEA, 0xE6F7, 0x7FEB, 0xE6F6, + 0x7FEC, 0xE6F8, 0x7FED, 0xE6F5, 0x7FEE, 0xBFAD, 0x7FEF, 0xEAE4, + 0x7FF0, 0xBFAB, 0x7FF1, 0xBFAC, 0x7FF2, 0xEDE6, 0x7FF3, 0xC16B, + 0x7FF4, 0xEDE5, 0x7FF5, 0xEFA8, 0x7FF7, 0xF07A, 0x7FF8, 0xF07B, + 0x7FF9, 0xC2BC, 0x7FFB, 0xC2BD, 0x7FFC, 0xC16C, 0x7FFD, 0xF2BE, + 0x7FFE, 0xF2BF, 0x7FFF, 0xF4B1, 0x8000, 0xC4A3, 0x8001, 0xA6D1, + 0x8003, 0xA6D2, 0x8004, 0xACFE, 0x8005, 0xAACC, 0x8006, 0xAFCF, + 0x8007, 0xD051, 0x800B, 0xB5C0, 0x800C, 0xA6D3, 0x800D, 0xAD41, + 0x800E, 0xD052, 0x800F, 0xD053, 0x8010, 0xAD40, 0x8011, 0xAD42, + 0x8012, 0xA6D4, 0x8014, 0xD054, 0x8015, 0xAFD1, 0x8016, 0xD366, + 0x8017, 0xAFD3, 0x8018, 0xAFD0, 0x8019, 0xAFD2, 0x801B, 0xD741, + 0x801C, 0xB2E0, 0x801E, 0xD740, 0x801F, 0xD6FE, 0x8021, 0xDF71, + 0x8024, 0xE3A1, 0x8026, 0xBDA2, 0x8028, 0xBFAE, 0x8029, 0xEAE6, + 0x802A, 0xEAE5, 0x802C, 0xEDE7, 0x8030, 0xF5EF, 0x8033, 0xA6D5, + 0x8034, 0xCB73, 0x8035, 0xCDAA, 0x8036, 0xAD43, 0x8037, 0xD055, + 0x8039, 0xD368, 0x803D, 0xAFD4, 0x803E, 0xD367, 0x803F, 0xAFD5, + 0x8043, 0xD743, 0x8046, 0xB2E2, 0x8047, 0xD742, 0x8048, 0xD744, + 0x804A, 0xB2E1, 0x804F, 0xDB46, 0x8050, 0xDB47, 0x8051, 0xDB45, + 0x8052, 0xB5C1, 0x8056, 0xB874, 0x8058, 0xB875, 0x805A, 0xBB45, + 0x805C, 0xE3A3, 0x805D, 0xE3A2, 0x805E, 0xBB44, 0x8064, 0xE6FB, + 0x8067, 0xE6FC, 0x806C, 0xEAE7, 0x806F, 0xC170, 0x8070, 0xC16F, + 0x8071, 0xC16D, 0x8072, 0xC16E, 0x8073, 0xC171, 0x8075, 0xF07C, + 0x8076, 0xC2BF, 0x8077, 0xC2BE, 0x8078, 0xF2C0, 0x8079, 0xF4B2, + 0x807D, 0xC5A5, 0x807E, 0xC5A4, 0x807F, 0xA6D6, 0x8082, 0xD1FB, + 0x8084, 0xB877, 0x8085, 0xB5C2, 0x8086, 0xB876, 0x8087, 0xBB46, + 0x8089, 0xA6D7, 0x808A, 0xC9A9, 0x808B, 0xA6D8, 0x808C, 0xA6D9, + 0x808F, 0xCDAB, 0x8090, 0xCB76, 0x8092, 0xCB77, 0x8093, 0xA877, + 0x8095, 0xCB74, 0x8096, 0xA876, 0x8098, 0xA879, 0x8099, 0xCB75, + 0x809A, 0xA87B, 0x809B, 0xA87A, 0x809C, 0xCB78, 0x809D, 0xA878, + 0x80A1, 0xAAD1, 0x80A2, 0xAACF, 0x80A3, 0xCDAD, 0x80A5, 0xAACE, + 0x80A9, 0xAAD3, 0x80AA, 0xAAD5, 0x80AB, 0xAAD2, 0x80AD, 0xCDB0, + 0x80AE, 0xCDAC, 0x80AF, 0xAAD6, 0x80B1, 0xAAD0, 0x80B2, 0xA87C, + 0x80B4, 0xAAD4, 0x80B5, 0xCDAF, 0x80B8, 0xCDAE, 0x80BA, 0xAACD, + 0x80C2, 0xD05B, 0x80C3, 0xAD47, 0x80C4, 0xAD48, 0x80C5, 0xD05D, + 0x80C7, 0xD057, 0x80C8, 0xD05A, 0x80C9, 0xD063, 0x80CA, 0xD061, + 0x80CC, 0xAD49, 0x80CD, 0xD067, 0x80CE, 0xAD4C, 0x80CF, 0xD064, + 0x80D0, 0xD05C, 0x80D1, 0xD059, 0x80D4, 0xDB49, 0x80D5, 0xD062, + 0x80D6, 0xAD44, 0x80D7, 0xD065, 0x80D8, 0xD056, 0x80D9, 0xD05F, + 0x80DA, 0xAD46, 0x80DB, 0xAD4B, 0x80DC, 0xD060, 0x80DD, 0xAD4F, + 0x80DE, 0xAD4D, 0x80E0, 0xD058, 0x80E1, 0xAD4A, 0x80E3, 0xD05E, + 0x80E4, 0xAD4E, 0x80E5, 0xAD45, 0x80E6, 0xD066, 0x80ED, 0xAFDA, + 0x80EF, 0xAFE3, 0x80F0, 0xAFD8, 0x80F1, 0xAFD6, 0x80F2, 0xD36A, + 0x80F3, 0xAFDE, 0x80F4, 0xAFDB, 0x80F5, 0xD36C, 0x80F8, 0xAFDD, + 0x80F9, 0xD36B, 0x80FA, 0xD369, 0x80FB, 0xD36E, 0x80FC, 0xAFE2, + 0x80FD, 0xAFE0, 0x80FE, 0xDB48, 0x8100, 0xD36F, 0x8101, 0xD36D, + 0x8102, 0xAFD7, 0x8105, 0xAFD9, 0x8106, 0xAFDC, 0x8108, 0xAFDF, + 0x810A, 0xAFE1, 0x8115, 0xD74E, 0x8116, 0xB2E4, 0x8118, 0xD745, + 0x8119, 0xD747, 0x811B, 0xD748, 0x811D, 0xD750, 0x811E, 0xD74C, + 0x811F, 0xD74A, 0x8121, 0xD74D, 0x8122, 0xD751, 0x8123, 0xB2E5, + 0x8124, 0xB2E9, 0x8125, 0xD746, 0x8127, 0xD74F, 0x8129, 0xB2E7, + 0x812B, 0xB2E6, 0x812C, 0xD74B, 0x812D, 0xD749, 0x812F, 0xB2E3, + 0x8130, 0xB2E8, 0x8139, 0xB5C8, 0x813A, 0xDB51, 0x813D, 0xDB4F, + 0x813E, 0xB5CA, 0x8143, 0xDB4A, 0x8144, 0xDFA1, 0x8146, 0xB5C9, + 0x8147, 0xDB4E, 0x814A, 0xDB4B, 0x814B, 0xB5C5, 0x814C, 0xB5CB, + 0x814D, 0xDB50, 0x814E, 0xB5C7, 0x814F, 0xDB4D, 0x8150, 0xBB47, + 0x8151, 0xB5C6, 0x8152, 0xDB4C, 0x8153, 0xB5CC, 0x8154, 0xB5C4, + 0x8155, 0xB5C3, 0x815B, 0xDF77, 0x815C, 0xDF75, 0x815E, 0xDF7B, + 0x8160, 0xDF73, 0x8161, 0xDFA2, 0x8162, 0xDF78, 0x8164, 0xDF72, + 0x8165, 0xB87B, 0x8166, 0xB8A3, 0x8167, 0xDF7D, 0x8169, 0xDF76, + 0x816B, 0xB87E, 0x816E, 0xB87C, 0x816F, 0xDF7E, 0x8170, 0xB879, + 0x8171, 0xB878, 0x8172, 0xDF79, 0x8173, 0xB87D, 0x8174, 0xB5CD, + 0x8176, 0xDF7C, 0x8177, 0xDF74, 0x8178, 0xB87A, 0x8179, 0xB8A1, + 0x817A, 0xB8A2, 0x817F, 0xBB4C, 0x8180, 0xBB48, 0x8182, 0xBB4D, + 0x8183, 0xE3A6, 0x8186, 0xE3A5, 0x8187, 0xE3A7, 0x8188, 0xBB4A, + 0x8189, 0xE3A4, 0x818A, 0xBB4B, 0x818B, 0xE3AA, 0x818C, 0xE3A9, + 0x818D, 0xE3A8, 0x818F, 0xBB49, 0x8195, 0xE741, 0x8197, 0xE744, + 0x8198, 0xBDA8, 0x8199, 0xE743, 0x819A, 0xBDA7, 0x819B, 0xBDA3, + 0x819C, 0xBDA4, 0x819D, 0xBDA5, 0x819E, 0xE740, 0x819F, 0xE6FE, + 0x81A0, 0xBDA6, 0x81A2, 0xE742, 0x81A3, 0xE6FD, 0x81A6, 0xEAE9, + 0x81A7, 0xEAF3, 0x81A8, 0xBFB1, 0x81A9, 0xBFB0, 0x81AB, 0xEAED, + 0x81AC, 0xEAEF, 0x81AE, 0xEAEA, 0x81B0, 0xEAEE, 0x81B1, 0xEAE8, + 0x81B2, 0xEAF1, 0x81B3, 0xBFAF, 0x81B4, 0xEAF0, 0x81B5, 0xEAEC, + 0x81B7, 0xEAF2, 0x81B9, 0xEAEB, 0x81BA, 0xC174, 0x81BB, 0xEDE8, + 0x81BC, 0xEDEE, 0x81BD, 0xC178, 0x81BE, 0xC17A, 0x81BF, 0xC177, + 0x81C0, 0xC176, 0x81C2, 0xC175, 0x81C3, 0xC173, 0x81C4, 0xEDE9, + 0x81C5, 0xEDEC, 0x81C6, 0xC172, 0x81C7, 0xEDED, 0x81C9, 0xC179, + 0x81CA, 0xEDEB, 0x81CC, 0xEDEA, 0x81CD, 0xC2C0, 0x81CF, 0xC2C1, + 0x81D0, 0xF0A1, 0x81D1, 0xF07D, 0x81D2, 0xF07E, 0x81D5, 0xF2C2, + 0x81D7, 0xF2C1, 0x81D8, 0xC3BE, 0x81D9, 0xF4B4, 0x81DA, 0xC4A4, + 0x81DB, 0xF4B3, 0x81DD, 0xF5F0, 0x81DE, 0xF745, 0x81DF, 0xC5A6, + 0x81E0, 0xF943, 0x81E1, 0xF944, 0x81E2, 0xC5D8, 0x81E3, 0xA6DA, + 0x81E5, 0xAAD7, 0x81E6, 0xDB52, 0x81E7, 0xBB4E, 0x81E8, 0xC17B, + 0x81E9, 0xEDEF, 0x81EA, 0xA6DB, 0x81EC, 0xAFE5, 0x81ED, 0xAFE4, + 0x81EE, 0xDB53, 0x81F2, 0xEAF4, 0x81F3, 0xA6DC, 0x81F4, 0xAD50, + 0x81F7, 0xDB54, 0x81F8, 0xDB55, 0x81F9, 0xDB56, 0x81FA, 0xBB4F, + 0x81FB, 0xBFB2, 0x81FC, 0xA6DD, 0x81FE, 0xAAD8, 0x81FF, 0xD068, + 0x8200, 0xAFE6, 0x8201, 0xD370, 0x8202, 0xB2EA, 0x8204, 0xDB57, + 0x8205, 0xB8A4, 0x8207, 0xBB50, 0x8208, 0xBFB3, 0x8209, 0xC17C, + 0x820A, 0xC2C2, 0x820B, 0xF4B5, 0x820C, 0xA6DE, 0x820D, 0xAAD9, + 0x8210, 0xAFE7, 0x8211, 0xD752, 0x8212, 0xB5CE, 0x8214, 0xBB51, + 0x8215, 0xE3AB, 0x8216, 0xE745, 0x821B, 0xA6DF, 0x821C, 0xB5CF, + 0x821D, 0xDFA3, 0x821E, 0xBB52, 0x821F, 0xA6E0, 0x8220, 0xCDB1, + 0x8221, 0xD069, 0x8222, 0xAD51, 0x8225, 0xD372, 0x8228, 0xAFEA, + 0x822A, 0xAFE8, 0x822B, 0xAFE9, 0x822C, 0xAFEB, 0x822F, 0xD371, + 0x8232, 0xD757, 0x8233, 0xD754, 0x8234, 0xD756, 0x8235, 0xB2EB, + 0x8236, 0xB2ED, 0x8237, 0xB2EC, 0x8238, 0xD753, 0x8239, 0xB2EE, + 0x823A, 0xD755, 0x823C, 0xDB58, 0x823D, 0xDB59, 0x823F, 0xDB5A, + 0x8240, 0xDFA6, 0x8242, 0xDFA7, 0x8244, 0xDFA5, 0x8245, 0xDFA8, + 0x8247, 0xB8A5, 0x8249, 0xDFA4, 0x824B, 0xBB53, 0x824E, 0xE74A, + 0x824F, 0xE746, 0x8250, 0xE749, 0x8251, 0xE74B, 0x8252, 0xE748, + 0x8253, 0xE747, 0x8255, 0xEAF5, 0x8256, 0xEAF6, 0x8257, 0xEAF7, + 0x8258, 0xBFB4, 0x8259, 0xBFB5, 0x825A, 0xEDF1, 0x825B, 0xEDF0, + 0x825C, 0xEDF2, 0x825E, 0xF0A3, 0x825F, 0xF0A2, 0x8261, 0xF2C4, + 0x8263, 0xF2C5, 0x8264, 0xF2C3, 0x8266, 0xC4A5, 0x8268, 0xF4B6, + 0x8269, 0xF4B7, 0x826B, 0xF746, 0x826C, 0xF7EF, 0x826D, 0xF8BB, + 0x826E, 0xA6E1, 0x826F, 0xA87D, 0x8271, 0xC17D, 0x8272, 0xA6E2, + 0x8274, 0xD758, 0x8275, 0xDB5B, 0x8277, 0xC641, 0x8278, 0xCA4A, + 0x827C, 0xCA4B, 0x827D, 0xCA4D, 0x827E, 0xA6E3, 0x827F, 0xCA4E, + 0x8280, 0xCA4C, 0x8283, 0xCBA2, 0x8284, 0xCBA3, 0x8285, 0xCB7B, + 0x828A, 0xCBA1, 0x828B, 0xA8A1, 0x828D, 0xA8A2, 0x828E, 0xCB7C, + 0x828F, 0xCB7A, 0x8290, 0xCB79, 0x8291, 0xCB7D, 0x8292, 0xA87E, + 0x8293, 0xCB7E, 0x8294, 0xD06A, 0x8298, 0xCDB6, 0x8299, 0xAADC, + 0x829A, 0xCDB5, 0x829B, 0xCDB7, 0x829D, 0xAADB, 0x829E, 0xCDBC, + 0x829F, 0xAADF, 0x82A0, 0xCDB2, 0x82A1, 0xCDC0, 0x82A2, 0xCDC6, + 0x82A3, 0xAAE6, 0x82A4, 0xCDC3, 0x82A5, 0xAAE3, 0x82A7, 0xCDB9, + 0x82A8, 0xCDBF, 0x82A9, 0xCDC1, 0x82AB, 0xCDB4, 0x82AC, 0xAAE2, + 0x82AD, 0xAADD, 0x82AE, 0xCDBA, 0x82AF, 0xAAE4, 0x82B0, 0xAAE7, + 0x82B1, 0xAAE1, 0x82B3, 0xAADA, 0x82B4, 0xCDBE, 0x82B5, 0xCDB8, + 0x82B6, 0xCDC5, 0x82B7, 0xAAE9, 0x82B8, 0xAAE5, 0x82B9, 0xAAE0, + 0x82BA, 0xCDBD, 0x82BB, 0xAFEC, 0x82BC, 0xCDBB, 0x82BD, 0xAADE, + 0x82BE, 0xAAE8, 0x82C0, 0xCDB3, 0x82C2, 0xCDC2, 0x82C3, 0xCDC4, + 0x82D1, 0xAD62, 0x82D2, 0xAD5C, 0x82D3, 0xAD64, 0x82D4, 0xAD61, + 0x82D5, 0xD071, 0x82D6, 0xD074, 0x82D7, 0xAD5D, 0x82D9, 0xD06B, + 0x82DB, 0xAD56, 0x82DC, 0xAD60, 0x82DE, 0xAD63, 0x82DF, 0xAD65, + 0x82E0, 0xD0A2, 0x82E1, 0xD077, 0x82E3, 0xAD55, 0x82E4, 0xD0A1, + 0x82E5, 0xAD59, 0x82E6, 0xAD57, 0x82E7, 0xAD52, 0x82E8, 0xD06F, + 0x82EA, 0xD07E, 0x82EB, 0xD073, 0x82EC, 0xD076, 0x82ED, 0xD0A5, + 0x82EF, 0xAD66, 0x82F0, 0xD07D, 0x82F1, 0xAD5E, 0x82F2, 0xD078, + 0x82F3, 0xD0A4, 0x82F4, 0xD075, 0x82F5, 0xD079, 0x82F6, 0xD07C, + 0x82F9, 0xD06D, 0x82FA, 0xD0A3, 0x82FB, 0xD07B, 0x82FE, 0xD06C, + 0x8300, 0xD070, 0x8301, 0xAD5F, 0x8302, 0xAD5A, 0x8303, 0xAD53, + 0x8304, 0xAD58, 0x8305, 0xAD54, 0x8306, 0xAD67, 0x8307, 0xD06E, + 0x8308, 0xD3A5, 0x8309, 0xAD5B, 0x830C, 0xD07A, 0x830D, 0xCE41, + 0x8316, 0xD3A8, 0x8317, 0xAFFA, 0x8319, 0xD376, 0x831B, 0xD3A3, + 0x831C, 0xD37D, 0x831E, 0xD3B2, 0x8320, 0xD3AA, 0x8322, 0xD37E, + 0x8324, 0xD3A9, 0x8325, 0xD378, 0x8326, 0xD37C, 0x8327, 0xD3B5, + 0x8328, 0xAFFD, 0x8329, 0xD3AD, 0x832A, 0xD3A4, 0x832B, 0xAFED, + 0x832C, 0xD3B3, 0x832D, 0xD374, 0x832F, 0xD3AC, 0x8331, 0xAFFC, + 0x8332, 0xAFF7, 0x8333, 0xD373, 0x8334, 0xAFF5, 0x8335, 0xAFF4, + 0x8336, 0xAFF9, 0x8337, 0xD3AB, 0x8338, 0xAFF1, 0x8339, 0xAFF8, + 0x833A, 0xD072, 0x833B, 0xDB5C, 0x833C, 0xD3A6, 0x833F, 0xD37A, + 0x8340, 0xAFFB, 0x8341, 0xD37B, 0x8342, 0xD3A1, 0x8343, 0xAFFE, + 0x8344, 0xD375, 0x8345, 0xD3AF, 0x8347, 0xD3AE, 0x8348, 0xD3B6, + 0x8349, 0xAFF3, 0x834A, 0xAFF0, 0x834B, 0xD3B4, 0x834C, 0xD3B0, + 0x834D, 0xD3A7, 0x834E, 0xD3A2, 0x834F, 0xAFF6, 0x8350, 0xAFF2, + 0x8351, 0xD377, 0x8352, 0xAFEE, 0x8353, 0xD3B1, 0x8354, 0xAFEF, + 0x8356, 0xD379, 0x8373, 0xD75E, 0x8374, 0xD760, 0x8375, 0xD765, + 0x8376, 0xD779, 0x8377, 0xB2FC, 0x8378, 0xB2F2, 0x837A, 0xD75D, + 0x837B, 0xB2FD, 0x837C, 0xB2FE, 0x837D, 0xD768, 0x837E, 0xD76F, + 0x837F, 0xD775, 0x8381, 0xD762, 0x8383, 0xD769, 0x8386, 0xB340, + 0x8387, 0xD777, 0x8388, 0xD772, 0x8389, 0xB2FA, 0x838A, 0xB2F8, + 0x838B, 0xD76E, 0x838C, 0xD76A, 0x838D, 0xD75C, 0x838E, 0xB2EF, + 0x838F, 0xD761, 0x8390, 0xD759, 0x8392, 0xB2F7, 0x8393, 0xB2F9, + 0x8394, 0xD766, 0x8395, 0xD763, 0x8396, 0xB2F4, 0x8397, 0xD773, + 0x8398, 0xB2F1, 0x8399, 0xD764, 0x839A, 0xD77A, 0x839B, 0xD76C, + 0x839D, 0xD76B, 0x839E, 0xB2F0, 0x83A0, 0xB2FB, 0x83A2, 0xB2F3, + 0x83A3, 0xD75A, 0x83A4, 0xD75F, 0x83A5, 0xD770, 0x83A6, 0xD776, + 0x83A7, 0xB341, 0x83A8, 0xD75B, 0x83A9, 0xD767, 0x83AA, 0xD76D, + 0x83AB, 0xB2F6, 0x83AE, 0xD778, 0x83AF, 0xD771, 0x83B0, 0xD774, + 0x83BD, 0xB2F5, 0x83BF, 0xDB6C, 0x83C0, 0xDB60, 0x83C1, 0xB5D7, + 0x83C2, 0xDB7D, 0x83C3, 0xDBA7, 0x83C4, 0xDBAA, 0x83C5, 0xB5D5, + 0x83C6, 0xDB68, 0x83C7, 0xDBA3, 0x83C8, 0xDB69, 0x83C9, 0xDB77, + 0x83CA, 0xB5E2, 0x83CB, 0xDB73, 0x83CC, 0xB5DF, 0x83CE, 0xDB74, + 0x83CF, 0xDB5D, 0x83D1, 0xDBA4, 0x83D4, 0xB5E8, 0x83D5, 0xDBA1, + 0x83D6, 0xDB75, 0x83D7, 0xDBAC, 0x83D8, 0xDB70, 0x83D9, 0xDFC8, + 0x83DB, 0xDBAF, 0x83DC, 0xB5E6, 0x83DD, 0xDB6E, 0x83DE, 0xDB7A, + 0x83DF, 0xB5E9, 0x83E0, 0xB5D4, 0x83E1, 0xDB72, 0x83E2, 0xDBAD, + 0x83E3, 0xDB6B, 0x83E4, 0xDB64, 0x83E5, 0xDB6F, 0x83E7, 0xDB63, + 0x83E8, 0xDB61, 0x83E9, 0xB5D0, 0x83EA, 0xDBA5, 0x83EB, 0xDB6A, + 0x83EC, 0xDBA8, 0x83EE, 0xDBA9, 0x83EF, 0xB5D8, 0x83F0, 0xB5DD, + 0x83F1, 0xB5D9, 0x83F2, 0xB5E1, 0x83F3, 0xDB7E, 0x83F4, 0xB5DA, + 0x83F5, 0xDB76, 0x83F6, 0xDB66, 0x83F8, 0xB5D2, 0x83F9, 0xDB5E, + 0x83FA, 0xDBA2, 0x83FB, 0xDBAB, 0x83FC, 0xDB65, 0x83FD, 0xB5E0, + 0x83FE, 0xDBB0, 0x83FF, 0xDB71, 0x8401, 0xDB6D, 0x8403, 0xB5D1, + 0x8404, 0xB5E5, 0x8406, 0xDB7C, 0x8407, 0xB5E7, 0x8409, 0xDB78, + 0x840A, 0xB5DC, 0x840B, 0xB5D6, 0x840C, 0xB5DE, 0x840D, 0xB5D3, + 0x840E, 0xB5E4, 0x840F, 0xDB79, 0x8410, 0xDB67, 0x8411, 0xDB7B, + 0x8412, 0xDB62, 0x8413, 0xDBA6, 0x841B, 0xDBAE, 0x8423, 0xDB5F, + 0x8429, 0xDFC7, 0x842B, 0xDFDD, 0x842C, 0xB855, 0x842D, 0xDFCC, + 0x842F, 0xDFCA, 0x8430, 0xDFB5, 0x8431, 0xB8A9, 0x8432, 0xDFC5, + 0x8433, 0xDFD9, 0x8434, 0xDFC1, 0x8435, 0xB8B1, 0x8436, 0xDFD8, + 0x8437, 0xDFBF, 0x8438, 0xB5E3, 0x8439, 0xDFCF, 0x843A, 0xDFC0, + 0x843B, 0xDFD6, 0x843C, 0xB8B0, 0x843D, 0xB8A8, 0x843F, 0xDFAA, + 0x8440, 0xDFB2, 0x8442, 0xDFCB, 0x8443, 0xDFC3, 0x8444, 0xDFDC, + 0x8445, 0xDFC6, 0x8446, 0xB8B6, 0x8447, 0xDFD7, 0x8449, 0xB8AD, + 0x844B, 0xDFC9, 0x844C, 0xDFD1, 0x844D, 0xDFB6, 0x844E, 0xDFD0, + 0x8450, 0xDFE1, 0x8451, 0xDFB1, 0x8452, 0xDFD2, 0x8454, 0xDFDF, + 0x8456, 0xDFAB, 0x8457, 0xB5DB, 0x8459, 0xDFB9, 0x845A, 0xDFB8, + 0x845B, 0xB8AF, 0x845D, 0xDFBC, 0x845E, 0xDFBE, 0x845F, 0xDFCD, + 0x8460, 0xDFDE, 0x8461, 0xB8B2, 0x8463, 0xB8B3, 0x8465, 0xDFB0, + 0x8466, 0xB8AB, 0x8467, 0xDFB4, 0x8468, 0xDFDA, 0x8469, 0xB8B4, + 0x846B, 0xB8AC, 0x846C, 0xB8AE, 0x846D, 0xB8B5, 0x846E, 0xDFE0, + 0x846F, 0xDFD3, 0x8470, 0xDFCE, 0x8473, 0xDFBB, 0x8474, 0xDFBA, + 0x8475, 0xB8AA, 0x8476, 0xDFAC, 0x8477, 0xB8A7, 0x8478, 0xDFC4, + 0x8479, 0xDFAD, 0x847A, 0xDFC2, 0x847D, 0xDFB7, 0x847E, 0xDFDB, + 0x8482, 0xB8A6, 0x8486, 0xDFB3, 0x848D, 0xDFAF, 0x848E, 0xDFD5, + 0x848F, 0xDFAE, 0x8490, 0xBB60, 0x8491, 0xE3D3, 0x8494, 0xE3C2, + 0x8497, 0xE3AC, 0x8498, 0xE3CA, 0x8499, 0xBB58, 0x849A, 0xE3BB, + 0x849B, 0xE3C5, 0x849C, 0xBB5B, 0x849D, 0xE3BE, 0x849E, 0xBB59, + 0x849F, 0xE3AF, 0x84A0, 0xE3CD, 0x84A1, 0xE3AE, 0x84A2, 0xE3C1, + 0x84A4, 0xE3AD, 0x84A7, 0xE3BF, 0x84A8, 0xE3C8, 0x84A9, 0xE3C6, + 0x84AA, 0xE3BA, 0x84AB, 0xE3B5, 0x84AC, 0xE3B3, 0x84AE, 0xE3B4, + 0x84AF, 0xE3C7, 0x84B0, 0xE3D2, 0x84B1, 0xE3BC, 0x84B2, 0xBB5A, + 0x84B4, 0xE3B7, 0x84B6, 0xE3CB, 0x84B8, 0xBB5D, 0x84B9, 0xE3B6, + 0x84BA, 0xE3B0, 0x84BB, 0xE3C0, 0x84BC, 0xBB61, 0x84BF, 0xBB55, + 0x84C0, 0xBB5E, 0x84C1, 0xE3B8, 0x84C2, 0xE3B2, 0x84C4, 0xBB57, + 0x84C5, 0xDFD4, 0x84C6, 0xBB56, 0x84C7, 0xE3C3, 0x84C9, 0xBB54, + 0x84CA, 0xBB63, 0x84CB, 0xBB5C, 0x84CC, 0xE3C4, 0x84CD, 0xE3B9, + 0x84CE, 0xE3B1, 0x84CF, 0xE3CC, 0x84D0, 0xE3BD, 0x84D1, 0xBB62, + 0x84D2, 0xE3D0, 0x84D3, 0xBB5F, 0x84D4, 0xE3CF, 0x84D6, 0xE3C9, + 0x84D7, 0xE3CE, 0x84DB, 0xE3D1, 0x84E7, 0xE773, 0x84E8, 0xE774, + 0x84E9, 0xE767, 0x84EA, 0xE766, 0x84EB, 0xE762, 0x84EC, 0xBDB4, + 0x84EE, 0xBDAC, 0x84EF, 0xE776, 0x84F0, 0xE775, 0x84F1, 0xDFA9, + 0x84F2, 0xE75F, 0x84F3, 0xE763, 0x84F4, 0xE75D, 0x84F6, 0xE770, + 0x84F7, 0xE761, 0x84F9, 0xE777, 0x84FA, 0xE75A, 0x84FB, 0xE758, + 0x84FC, 0xE764, 0x84FD, 0xE76E, 0x84FE, 0xE769, 0x84FF, 0xBDB6, + 0x8500, 0xE74F, 0x8502, 0xE76D, 0x8506, 0xBDB7, 0x8507, 0xDFBD, + 0x8508, 0xE75B, 0x8509, 0xE752, 0x850A, 0xE755, 0x850B, 0xE77B, + 0x850C, 0xE75C, 0x850D, 0xE753, 0x850E, 0xE751, 0x850F, 0xE74E, + 0x8511, 0xBDB0, 0x8512, 0xE765, 0x8513, 0xBDAF, 0x8514, 0xBDB3, + 0x8515, 0xE760, 0x8516, 0xE768, 0x8517, 0xBDA9, 0x8518, 0xE778, + 0x8519, 0xE77C, 0x851A, 0xBDAB, 0x851C, 0xE757, 0x851D, 0xE76B, + 0x851E, 0xE76F, 0x851F, 0xE754, 0x8520, 0xE779, 0x8521, 0xBDB2, + 0x8523, 0xBDB1, 0x8524, 0xE74C, 0x8525, 0xBDB5, 0x8526, 0xE772, + 0x8527, 0xE756, 0x8528, 0xE76A, 0x8529, 0xE750, 0x852A, 0xE75E, + 0x852B, 0xE759, 0x852C, 0xBDAD, 0x852D, 0xBDAE, 0x852E, 0xE76C, + 0x852F, 0xE77D, 0x8530, 0xE77A, 0x8531, 0xE771, 0x853B, 0xE74D, + 0x853D, 0xBDAA, 0x853E, 0xEB49, 0x8540, 0xEB40, 0x8541, 0xEB43, + 0x8543, 0xBFBB, 0x8544, 0xEB45, 0x8545, 0xEAF9, 0x8546, 0xEB41, + 0x8547, 0xEB47, 0x8548, 0xBFB8, 0x8549, 0xBFBC, 0x854A, 0xBFB6, + 0x854D, 0xEAFB, 0x854E, 0xEB4C, 0x8551, 0xEB46, 0x8553, 0xEAFC, + 0x8554, 0xEB55, 0x8555, 0xEB4F, 0x8556, 0xEAF8, 0x8557, 0xEE46, + 0x8558, 0xEAFE, 0x8559, 0xBFB7, 0x855B, 0xEB4A, 0x855D, 0xEB54, + 0x855E, 0xBFBF, 0x8560, 0xEB51, 0x8561, 0xEAFD, 0x8562, 0xEB44, + 0x8563, 0xEB48, 0x8564, 0xEB42, 0x8565, 0xEB56, 0x8566, 0xEB53, + 0x8567, 0xEB50, 0x8568, 0xBFB9, 0x8569, 0xBFBA, 0x856A, 0xBFBE, + 0x856B, 0xEAFA, 0x856C, 0xEB57, 0x856D, 0xBFBD, 0x856E, 0xEB4D, + 0x8571, 0xEB4B, 0x8575, 0xEB4E, 0x8576, 0xEE53, 0x8577, 0xEE40, + 0x8578, 0xEE45, 0x8579, 0xEE52, 0x857A, 0xEE44, 0x857B, 0xEDFB, + 0x857C, 0xEE41, 0x857E, 0xC1A2, 0x8580, 0xEDF4, 0x8581, 0xEE4D, + 0x8582, 0xEE4F, 0x8583, 0xEDF3, 0x8584, 0xC1A1, 0x8585, 0xEE51, + 0x8586, 0xEE49, 0x8587, 0xC1A8, 0x8588, 0xEE50, 0x8589, 0xEE42, + 0x858A, 0xC1AA, 0x858B, 0xEDF9, 0x858C, 0xEB52, 0x858D, 0xEE4A, + 0x858E, 0xEE47, 0x858F, 0xEDF5, 0x8590, 0xEE55, 0x8591, 0xC1A4, + 0x8594, 0xC1A5, 0x8595, 0xEDF7, 0x8596, 0xEE48, 0x8598, 0xEE54, + 0x8599, 0xEE4B, 0x859A, 0xEDFD, 0x859B, 0xC1A7, 0x859C, 0xC1A3, + 0x859D, 0xEE4C, 0x859E, 0xEDFE, 0x859F, 0xEE56, 0x85A0, 0xEDF8, + 0x85A1, 0xEE43, 0x85A2, 0xEE4E, 0x85A3, 0xEDFA, 0x85A4, 0xEDFC, + 0x85A6, 0xC2CB, 0x85A7, 0xEDF6, 0x85A8, 0xC1A9, 0x85A9, 0xC2C4, + 0x85AA, 0xC17E, 0x85AF, 0xC1A6, 0x85B0, 0xC2C8, 0x85B1, 0xF0B3, + 0x85B3, 0xF0A9, 0x85B4, 0xF0A4, 0x85B5, 0xF0AA, 0x85B6, 0xF0B4, + 0x85B7, 0xF0B8, 0x85B8, 0xF0B7, 0x85B9, 0xC2CA, 0x85BA, 0xC2C9, + 0x85BD, 0xF0AB, 0x85BE, 0xF0B9, 0x85BF, 0xF0AE, 0x85C0, 0xF0A6, + 0x85C2, 0xF0A8, 0x85C3, 0xF0A7, 0x85C4, 0xF0AD, 0x85C5, 0xF0B2, + 0x85C6, 0xF0A5, 0x85C7, 0xF0AC, 0x85C8, 0xF0B1, 0x85C9, 0xC2C7, + 0x85CB, 0xF0AF, 0x85CD, 0xC2C5, 0x85CE, 0xF0B0, 0x85CF, 0xC2C3, + 0x85D0, 0xC2C6, 0x85D1, 0xF2D5, 0x85D2, 0xF0B5, 0x85D5, 0xC3C2, + 0x85D7, 0xF2CD, 0x85D8, 0xF2D1, 0x85D9, 0xF2C9, 0x85DA, 0xF2CC, + 0x85DC, 0xF2D4, 0x85DD, 0xC3C0, 0x85DE, 0xF2D9, 0x85DF, 0xF2D2, + 0x85E1, 0xF2CA, 0x85E2, 0xF2DA, 0x85E3, 0xF2D3, 0x85E4, 0xC3C3, + 0x85E5, 0xC3C4, 0x85E6, 0xF2D7, 0x85E8, 0xF2CB, 0x85E9, 0xC3BF, + 0x85EA, 0xC3C1, 0x85EB, 0xF2C6, 0x85EC, 0xF2CE, 0x85ED, 0xF2C8, + 0x85EF, 0xF2D8, 0x85F0, 0xF2D6, 0x85F1, 0xF2C7, 0x85F2, 0xF2CF, + 0x85F6, 0xF4BE, 0x85F7, 0xC3C5, 0x85F8, 0xF2D0, 0x85F9, 0xC4A7, + 0x85FA, 0xC4A9, 0x85FB, 0xC4A6, 0x85FD, 0xF4C3, 0x85FE, 0xF4BB, + 0x85FF, 0xF4B9, 0x8600, 0xF4BD, 0x8601, 0xF4BA, 0x8604, 0xF4BF, + 0x8605, 0xF4C1, 0x8606, 0xC4AA, 0x8607, 0xC4AC, 0x8609, 0xF4C0, + 0x860A, 0xC4AD, 0x860B, 0xC4AB, 0x860C, 0xF4C2, 0x8611, 0xC4A8, + 0x8617, 0xC4F4, 0x8618, 0xF5F1, 0x8619, 0xF5F7, 0x861A, 0xC4F6, + 0x861B, 0xF4BC, 0x861C, 0xF5F6, 0x861E, 0xF5FD, 0x861F, 0xF5F4, + 0x8620, 0xF5FB, 0x8621, 0xF5FA, 0x8622, 0xF4B8, 0x8623, 0xF5F5, + 0x8624, 0xF0B6, 0x8625, 0xF5FE, 0x8626, 0xF5F3, 0x8627, 0xF5F8, + 0x8629, 0xF5FC, 0x862A, 0xF5F2, 0x862C, 0xF74A, 0x862D, 0xC4F5, + 0x862E, 0xF5F9, 0x8631, 0xF7F4, 0x8632, 0xF74B, 0x8633, 0xF749, + 0x8634, 0xF747, 0x8635, 0xF748, 0x8636, 0xF74C, 0x8638, 0xC5D9, + 0x8639, 0xF7F2, 0x863A, 0xF7F0, 0x863B, 0xF7F5, 0x863C, 0xF7F3, + 0x863E, 0xF7F6, 0x863F, 0xC5DA, 0x8640, 0xF7F1, 0x8643, 0xF8BC, + 0x8646, 0xF945, 0x8647, 0xF946, 0x8648, 0xF947, 0x864B, 0xF9C7, + 0x864C, 0xF9BD, 0x864D, 0xCA4F, 0x864E, 0xAAEA, 0x8650, 0xAD68, + 0x8652, 0xD3B8, 0x8653, 0xD3B7, 0x8654, 0xB040, 0x8655, 0xB342, + 0x8656, 0xD77C, 0x8659, 0xD77B, 0x865B, 0xB5EA, 0x865C, 0xB8B8, + 0x865E, 0xB8B7, 0x865F, 0xB8B9, 0x8661, 0xE3D4, 0x8662, 0xE77E, + 0x8663, 0xEB58, 0x8664, 0xEB5A, 0x8665, 0xEB59, 0x8667, 0xC1AB, + 0x8668, 0xEE57, 0x8669, 0xF0BA, 0x866A, 0xF9A5, 0x866B, 0xA6E4, + 0x866D, 0xCDC9, 0x866E, 0xCDCA, 0x866F, 0xCDC8, 0x8670, 0xCDC7, + 0x8671, 0xAAEB, 0x8673, 0xD0A9, 0x8674, 0xD0A7, 0x8677, 0xD0A6, + 0x8679, 0xAD69, 0x867A, 0xAD6B, 0x867B, 0xAD6A, 0x867C, 0xD0A8, + 0x8685, 0xD3C4, 0x8686, 0xD3C1, 0x8687, 0xD3BF, 0x868A, 0xB041, + 0x868B, 0xD3C2, 0x868C, 0xB046, 0x868D, 0xD3BC, 0x868E, 0xD3CB, + 0x8690, 0xD3CD, 0x8691, 0xD3BD, 0x8693, 0xB043, 0x8694, 0xD3CE, + 0x8695, 0xD3C9, 0x8696, 0xD3BB, 0x8697, 0xD3C0, 0x8698, 0xD3CA, + 0x8699, 0xD3C6, 0x869A, 0xD3C3, 0x869C, 0xB048, 0x869D, 0xD3CC, + 0x869E, 0xD3BE, 0x86A1, 0xD3C7, 0x86A2, 0xD3B9, 0x86A3, 0xB047, + 0x86A4, 0xB044, 0x86A5, 0xD3C5, 0x86A7, 0xD3C8, 0x86A8, 0xD3BA, + 0x86A9, 0xB045, 0x86AA, 0xB042, 0x86AF, 0xB34C, 0x86B0, 0xD7A5, + 0x86B1, 0xB34B, 0x86B3, 0xD7A8, 0x86B4, 0xD7AB, 0x86B5, 0xB348, + 0x86B6, 0xB346, 0x86B7, 0xD77E, 0x86B8, 0xD7A9, 0x86B9, 0xD7A7, + 0x86BA, 0xD7A4, 0x86BB, 0xD7AC, 0x86BC, 0xD7AD, 0x86BD, 0xD7AF, + 0x86BE, 0xD7B0, 0x86BF, 0xD77D, 0x86C0, 0xB345, 0x86C1, 0xD7A2, + 0x86C2, 0xD7A1, 0x86C3, 0xD7AE, 0x86C4, 0xB347, 0x86C5, 0xD7A3, + 0x86C6, 0xB349, 0x86C7, 0xB344, 0x86C8, 0xD7A6, 0x86C9, 0xB34D, + 0x86CB, 0xB34A, 0x86CC, 0xD7AA, 0x86D0, 0xB5F1, 0x86D1, 0xDBBF, + 0x86D3, 0xDBB4, 0x86D4, 0xB5EE, 0x86D6, 0xDFE7, 0x86D7, 0xDBBD, + 0x86D8, 0xDBB1, 0x86D9, 0xB5EC, 0x86DA, 0xDBB6, 0x86DB, 0xB5EF, + 0x86DC, 0xDBBA, 0x86DD, 0xDBB8, 0x86DE, 0xB5F2, 0x86DF, 0xB5EB, + 0x86E2, 0xDBB2, 0x86E3, 0xDBB5, 0x86E4, 0xB5F0, 0x86E6, 0xDBB3, + 0x86E8, 0xDBBE, 0x86E9, 0xDBBC, 0x86EA, 0xDBB7, 0x86EB, 0xDBB9, + 0x86EC, 0xDBBB, 0x86ED, 0xB5ED, 0x86F5, 0xDFE8, 0x86F6, 0xDFEE, + 0x86F7, 0xDFE4, 0x86F8, 0xDFEA, 0x86F9, 0xB8BA, 0x86FA, 0xDFE6, + 0x86FB, 0xB8C0, 0x86FE, 0xB8BF, 0x8700, 0xB8BE, 0x8701, 0xDFED, + 0x8702, 0xB8C1, 0x8703, 0xB8C2, 0x8704, 0xDFE3, 0x8705, 0xDFF0, + 0x8706, 0xB8C3, 0x8707, 0xB8BD, 0x8708, 0xB8BC, 0x8709, 0xDFEC, + 0x870A, 0xB8C4, 0x870B, 0xDFE2, 0x870C, 0xDFE5, 0x870D, 0xDFEF, + 0x870E, 0xDFEB, 0x8711, 0xE3F4, 0x8712, 0xE3E9, 0x8713, 0xB8BB, + 0x8718, 0xBB6A, 0x8719, 0xE3DD, 0x871A, 0xE3F2, 0x871B, 0xE3DE, + 0x871C, 0xBB65, 0x871E, 0xE3DB, 0x8720, 0xE3E4, 0x8721, 0xE3DC, + 0x8722, 0xBB67, 0x8723, 0xE3D6, 0x8724, 0xE3F1, 0x8725, 0xBB68, + 0x8726, 0xE3EE, 0x8727, 0xE3EF, 0x8728, 0xE3D7, 0x8729, 0xBB6D, + 0x872A, 0xE3E6, 0x872C, 0xE3E0, 0x872D, 0xE3E7, 0x872E, 0xE3DA, + 0x8730, 0xE3F3, 0x8731, 0xE3EB, 0x8732, 0xE3E5, 0x8733, 0xE3D5, + 0x8734, 0xBB69, 0x8735, 0xE3EC, 0x8737, 0xBB6C, 0x8738, 0xE3F0, + 0x873A, 0xE3EA, 0x873B, 0xBB66, 0x873C, 0xE3E8, 0x873E, 0xE3E2, + 0x873F, 0xBB64, 0x8740, 0xE3D9, 0x8741, 0xE3E1, 0x8742, 0xE3ED, + 0x8743, 0xE3DF, 0x8746, 0xE3E3, 0x874C, 0xBDC1, 0x874D, 0xDFE9, + 0x874E, 0xE7B2, 0x874F, 0xE7BB, 0x8750, 0xE7B1, 0x8751, 0xE7AD, + 0x8752, 0xE7AA, 0x8753, 0xBDC2, 0x8754, 0xE7A8, 0x8755, 0xBB6B, + 0x8756, 0xE7A1, 0x8757, 0xBDC0, 0x8758, 0xE7A7, 0x8759, 0xBDBF, + 0x875A, 0xE7AC, 0x875B, 0xE7A9, 0x875C, 0xE7B9, 0x875D, 0xE7B4, + 0x875E, 0xE7AE, 0x875F, 0xE7B3, 0x8760, 0xBDBB, 0x8761, 0xE7AB, + 0x8762, 0xE7BE, 0x8763, 0xE7A2, 0x8764, 0xE7A3, 0x8765, 0xE7BA, + 0x8766, 0xBDBC, 0x8767, 0xE7BF, 0x8768, 0xBDBE, 0x8769, 0xE7C0, + 0x876A, 0xE7B0, 0x876B, 0xE3D8, 0x876C, 0xE7B6, 0x876D, 0xE7AF, + 0x876E, 0xE7B8, 0x876F, 0xE7B5, 0x8773, 0xE7A6, 0x8774, 0xBDB9, + 0x8775, 0xE7BD, 0x8776, 0xBDBA, 0x8777, 0xE7A4, 0x8778, 0xBDBD, + 0x8779, 0xEB64, 0x877A, 0xE7B7, 0x877B, 0xE7BC, 0x8781, 0xEB61, + 0x8782, 0xBDB8, 0x8783, 0xBFC0, 0x8784, 0xEB6B, 0x8785, 0xEB67, + 0x8787, 0xEB65, 0x8788, 0xEB60, 0x8789, 0xEB6F, 0x878D, 0xBFC4, + 0x878F, 0xEB5C, 0x8790, 0xEB68, 0x8791, 0xEB69, 0x8792, 0xEB5F, + 0x8793, 0xEB5E, 0x8794, 0xEB6C, 0x8796, 0xEB62, 0x8797, 0xEB5D, + 0x8798, 0xEB63, 0x879A, 0xEB6E, 0x879B, 0xEB5B, 0x879C, 0xEB6D, + 0x879D, 0xEB6A, 0x879E, 0xBFC2, 0x879F, 0xBFC1, 0x87A2, 0xBFC3, + 0x87A3, 0xEB66, 0x87A4, 0xF0CB, 0x87AA, 0xEE59, 0x87AB, 0xC1B1, + 0x87AC, 0xEE5D, 0x87AD, 0xEE5A, 0x87AE, 0xEE61, 0x87AF, 0xEE67, + 0x87B0, 0xEE5C, 0x87B2, 0xEE70, 0x87B3, 0xC1AE, 0x87B4, 0xEE6A, + 0x87B5, 0xEE5F, 0x87B6, 0xEE6B, 0x87B7, 0xEE66, 0x87B8, 0xEE6D, + 0x87B9, 0xEE5E, 0x87BA, 0xC1B3, 0x87BB, 0xC1B2, 0x87BC, 0xEE60, + 0x87BD, 0xEE6E, 0x87BE, 0xEE58, 0x87BF, 0xEE6C, 0x87C0, 0xC1AC, + 0x87C2, 0xEE64, 0x87C3, 0xEE63, 0x87C4, 0xEE68, 0x87C5, 0xEE5B, + 0x87C6, 0xC1B0, 0x87C8, 0xC1B4, 0x87C9, 0xEE62, 0x87CA, 0xEE69, + 0x87CB, 0xC1B5, 0x87CC, 0xEE65, 0x87D1, 0xC1AD, 0x87D2, 0xC1AF, + 0x87D3, 0xF0C7, 0x87D4, 0xF0C5, 0x87D7, 0xF0CC, 0x87D8, 0xF0C9, + 0x87D9, 0xF0CD, 0x87DB, 0xF0BE, 0x87DC, 0xF0C6, 0x87DD, 0xF0D1, + 0x87DE, 0xEE6F, 0x87DF, 0xF0C2, 0x87E0, 0xC2CF, 0x87E1, 0xE7A5, + 0x87E2, 0xF0BD, 0x87E3, 0xF0CA, 0x87E4, 0xF0C4, 0x87E5, 0xF0C1, + 0x87E6, 0xF0BC, 0x87E7, 0xF0BB, 0x87E8, 0xF0D0, 0x87EA, 0xF0C0, + 0x87EB, 0xF0BF, 0x87EC, 0xC2CD, 0x87ED, 0xF0C8, 0x87EF, 0xC2CC, + 0x87F2, 0xC2CE, 0x87F3, 0xF0C3, 0x87F4, 0xF0CF, 0x87F6, 0xF2DE, + 0x87F7, 0xF2DF, 0x87F9, 0xC3C9, 0x87FA, 0xF2DC, 0x87FB, 0xC3C6, + 0x87FC, 0xF2E4, 0x87FE, 0xC3CA, 0x87FF, 0xF2E6, 0x8800, 0xF2DB, + 0x8801, 0xF0CE, 0x8802, 0xF2E8, 0x8803, 0xF2DD, 0x8805, 0xC3C7, + 0x8806, 0xF2E3, 0x8808, 0xF2E5, 0x8809, 0xF2E0, 0x880A, 0xF2E7, + 0x880B, 0xF2E2, 0x880C, 0xF2E1, 0x880D, 0xC3C8, 0x8810, 0xF4C5, + 0x8811, 0xF4C6, 0x8813, 0xF4C8, 0x8814, 0xC4AE, 0x8815, 0xC4AF, + 0x8816, 0xF4C9, 0x8817, 0xF4C7, 0x8819, 0xF4C4, 0x881B, 0xF642, + 0x881C, 0xF645, 0x881D, 0xF641, 0x881F, 0xC4FA, 0x8820, 0xF643, + 0x8821, 0xC4F9, 0x8822, 0xC4F8, 0x8823, 0xC4F7, 0x8824, 0xF644, + 0x8825, 0xF751, 0x8826, 0xF74F, 0x8828, 0xF74E, 0x8829, 0xF640, + 0x882A, 0xF750, 0x882B, 0xF646, 0x882C, 0xF74D, 0x882E, 0xF7F9, + 0x882F, 0xF7D7, 0x8830, 0xF7F7, 0x8831, 0xC5DB, 0x8832, 0xF7F8, + 0x8833, 0xF7FA, 0x8835, 0xF8BF, 0x8836, 0xC5FA, 0x8837, 0xF8BE, + 0x8838, 0xF8BD, 0x8839, 0xC5FB, 0x883B, 0xC65A, 0x883C, 0xF96E, + 0x883D, 0xF9A7, 0x883E, 0xF9A6, 0x883F, 0xF9A8, 0x8840, 0xA6E5, + 0x8841, 0xD0AA, 0x8843, 0xD3CF, 0x8844, 0xD3D0, 0x8848, 0xDBC0, + 0x884A, 0xF647, 0x884B, 0xF8C0, 0x884C, 0xA6E6, 0x884D, 0xAD6C, + 0x884E, 0xD0AB, 0x8852, 0xD7B1, 0x8853, 0xB34E, 0x8855, 0xDBC2, + 0x8856, 0xDBC1, 0x8857, 0xB5F3, 0x8859, 0xB8C5, 0x885A, 0xE7C1, + 0x885B, 0xBDC3, 0x885D, 0xBDC4, 0x8861, 0xBFC5, 0x8862, 0xC5FC, + 0x8863, 0xA6E7, 0x8867, 0xD0AC, 0x8868, 0xAAED, 0x8869, 0xD0AE, + 0x886A, 0xD0AD, 0x886B, 0xAD6D, 0x886D, 0xD3D1, 0x886F, 0xD3D8, + 0x8870, 0xB049, 0x8871, 0xD3D6, 0x8872, 0xD3D4, 0x8874, 0xD3DB, + 0x8875, 0xD3D2, 0x8876, 0xD3D3, 0x8877, 0xB04A, 0x8879, 0xB04E, + 0x887C, 0xD3DC, 0x887D, 0xB04D, 0x887E, 0xD3DA, 0x887F, 0xD3D7, + 0x8880, 0xD3D5, 0x8881, 0xB04B, 0x8882, 0xB04C, 0x8883, 0xD3D9, + 0x8888, 0xB350, 0x8889, 0xD7B2, 0x888B, 0xB355, 0x888C, 0xD7C2, + 0x888D, 0xB354, 0x888E, 0xD7C4, 0x8891, 0xD7B8, 0x8892, 0xB352, + 0x8893, 0xD7C3, 0x8895, 0xD7B3, 0x8896, 0xB353, 0x8897, 0xD7BF, + 0x8898, 0xD7BB, 0x8899, 0xD7BD, 0x889A, 0xD7B7, 0x889B, 0xD7BE, + 0x889E, 0xB34F, 0x889F, 0xD7BA, 0x88A1, 0xD7B9, 0x88A2, 0xD7B5, + 0x88A4, 0xD7C0, 0x88A7, 0xD7BC, 0x88A8, 0xD7B4, 0x88AA, 0xD7B6, + 0x88AB, 0xB351, 0x88AC, 0xD7C1, 0x88B1, 0xB5F6, 0x88B2, 0xDBCD, + 0x88B6, 0xDBC9, 0x88B7, 0xDBCB, 0x88B8, 0xDBC6, 0x88B9, 0xDBC5, + 0x88BA, 0xDBC3, 0x88BC, 0xDBCA, 0x88BD, 0xDBCC, 0x88BE, 0xDBC8, + 0x88C0, 0xDBC7, 0x88C1, 0xB5F4, 0x88C2, 0xB5F5, 0x88C9, 0xDBCF, + 0x88CA, 0xB8CD, 0x88CB, 0xDFF2, 0x88CC, 0xDFF8, 0x88CD, 0xDFF3, + 0x88CE, 0xDFF4, 0x88CF, 0xF9D8, 0x88D0, 0xDFF9, 0x88D2, 0xB8CF, + 0x88D4, 0xB8C7, 0x88D5, 0xB8CE, 0x88D6, 0xDFF1, 0x88D7, 0xDBC4, + 0x88D8, 0xB8CA, 0x88D9, 0xB8C8, 0x88DA, 0xDFF7, 0x88DB, 0xDFF6, + 0x88DC, 0xB8C9, 0x88DD, 0xB8CB, 0x88DE, 0xDFF5, 0x88DF, 0xB8C6, + 0x88E1, 0xB8CC, 0x88E7, 0xE3F6, 0x88E8, 0xBB74, 0x88EB, 0xE442, + 0x88EC, 0xE441, 0x88EE, 0xE3FB, 0x88EF, 0xBB76, 0x88F0, 0xE440, + 0x88F1, 0xE3F7, 0x88F2, 0xE3F8, 0x88F3, 0xBB6E, 0x88F4, 0xBB70, + 0x88F6, 0xE3FD, 0x88F7, 0xE3F5, 0x88F8, 0xBB72, 0x88F9, 0xBB71, + 0x88FA, 0xE3F9, 0x88FB, 0xE3FE, 0x88FC, 0xE3FC, 0x88FD, 0xBB73, + 0x88FE, 0xE3FA, 0x8901, 0xDBCE, 0x8902, 0xBB6F, 0x8905, 0xE7C2, + 0x8906, 0xE7C9, 0x8907, 0xBDC6, 0x8909, 0xE7CD, 0x890A, 0xBDCA, + 0x890B, 0xE7C5, 0x890C, 0xE7C3, 0x890E, 0xE7CC, 0x8910, 0xBDC5, + 0x8911, 0xE7CB, 0x8912, 0xBDC7, 0x8913, 0xBDC8, 0x8914, 0xE7C4, + 0x8915, 0xBDC9, 0x8916, 0xE7CA, 0x8917, 0xE7C6, 0x8918, 0xE7C7, + 0x8919, 0xE7C8, 0x891A, 0xBB75, 0x891E, 0xEB70, 0x891F, 0xEB7C, + 0x8921, 0xBFCA, 0x8922, 0xEB77, 0x8923, 0xEB79, 0x8925, 0xBFC8, + 0x8926, 0xEB71, 0x8927, 0xEB75, 0x8929, 0xEB78, 0x892A, 0xBFC6, + 0x892B, 0xBFC9, 0x892C, 0xEB7B, 0x892D, 0xEB73, 0x892E, 0xEB74, + 0x892F, 0xEB7A, 0x8930, 0xEB72, 0x8931, 0xEB76, 0x8932, 0xBFC7, + 0x8933, 0xEE72, 0x8935, 0xEE71, 0x8936, 0xC1B7, 0x8937, 0xEE77, + 0x8938, 0xC1B9, 0x893B, 0xC1B6, 0x893C, 0xEE73, 0x893D, 0xC1BA, + 0x893E, 0xEE74, 0x8941, 0xEE75, 0x8942, 0xEE78, 0x8944, 0xC1B8, + 0x8946, 0xF0D6, 0x8949, 0xF0D9, 0x894B, 0xF0D3, 0x894C, 0xF0D5, + 0x894F, 0xF0D4, 0x8950, 0xF0D7, 0x8951, 0xF0D8, 0x8952, 0xEE76, + 0x8953, 0xF0D2, 0x8956, 0xC3CD, 0x8957, 0xF2EC, 0x8958, 0xF2EF, + 0x8959, 0xF2F1, 0x895A, 0xF2EA, 0x895B, 0xF2EB, 0x895C, 0xF2EE, + 0x895D, 0xF2F0, 0x895E, 0xC3CE, 0x895F, 0xC3CC, 0x8960, 0xC3CB, + 0x8961, 0xF2ED, 0x8962, 0xF2E9, 0x8963, 0xF4CA, 0x8964, 0xC4B0, + 0x8966, 0xF4CB, 0x8969, 0xF649, 0x896A, 0xC4FB, 0x896B, 0xF64B, + 0x896C, 0xC4FC, 0x896D, 0xF648, 0x896E, 0xF64A, 0x896F, 0xC5A8, + 0x8971, 0xF752, 0x8972, 0xC5A7, 0x8973, 0xF7FD, 0x8974, 0xF7FC, + 0x8976, 0xF7FB, 0x8979, 0xF948, 0x897A, 0xF949, 0x897B, 0xF94B, + 0x897C, 0xF94A, 0x897E, 0xCA50, 0x897F, 0xA6E8, 0x8981, 0xAD6E, + 0x8982, 0xD7C5, 0x8983, 0xB5F7, 0x8985, 0xDFFA, 0x8986, 0xC2D0, + 0x8988, 0xF2F2, 0x898B, 0xA8A3, 0x898F, 0xB357, 0x8993, 0xB356, + 0x8995, 0xDBD0, 0x8996, 0xB5F8, 0x8997, 0xDBD2, 0x8998, 0xDBD1, + 0x899B, 0xDFFB, 0x899C, 0xB8D0, 0x899D, 0xE443, 0x899E, 0xE446, + 0x899F, 0xE445, 0x89A1, 0xE444, 0x89A2, 0xE7CE, 0x89A3, 0xE7D0, + 0x89A4, 0xE7CF, 0x89A6, 0xBFCC, 0x89AA, 0xBFCB, 0x89AC, 0xC1BB, + 0x89AD, 0xEE79, 0x89AE, 0xEE7B, 0x89AF, 0xEE7A, 0x89B2, 0xC2D1, + 0x89B6, 0xF2F4, 0x89B7, 0xF2F3, 0x89B9, 0xF4CC, 0x89BA, 0xC4B1, + 0x89BD, 0xC4FD, 0x89BE, 0xF754, 0x89BF, 0xF753, 0x89C0, 0xC65B, + 0x89D2, 0xA8A4, 0x89D3, 0xD0AF, 0x89D4, 0xAD6F, 0x89D5, 0xD7C8, + 0x89D6, 0xD7C6, 0x89D9, 0xD7C7, 0x89DA, 0xDBD4, 0x89DB, 0xDBD5, + 0x89DC, 0xE043, 0x89DD, 0xDBD3, 0x89DF, 0xDFFC, 0x89E0, 0xE041, + 0x89E1, 0xE040, 0x89E2, 0xE042, 0x89E3, 0xB8D1, 0x89E4, 0xDFFE, + 0x89E5, 0xDFFD, 0x89E6, 0xE044, 0x89E8, 0xE449, 0x89E9, 0xE447, + 0x89EB, 0xE448, 0x89EC, 0xE7D3, 0x89ED, 0xE7D1, 0x89F0, 0xE7D2, + 0x89F1, 0xEB7D, 0x89F2, 0xEE7C, 0x89F3, 0xEE7D, 0x89F4, 0xC2D2, + 0x89F6, 0xF2F5, 0x89F7, 0xF4CD, 0x89F8, 0xC4B2, 0x89FA, 0xF64C, + 0x89FB, 0xF755, 0x89FC, 0xC5A9, 0x89FE, 0xF7FE, 0x89FF, 0xF94C, + 0x8A00, 0xA8A5, 0x8A02, 0xAD71, 0x8A03, 0xAD72, 0x8A04, 0xD0B0, + 0x8A07, 0xD0B1, 0x8A08, 0xAD70, 0x8A0A, 0xB054, 0x8A0C, 0xB052, + 0x8A0E, 0xB051, 0x8A0F, 0xB058, 0x8A10, 0xB050, 0x8A11, 0xB059, + 0x8A12, 0xD3DD, 0x8A13, 0xB056, 0x8A15, 0xB053, 0x8A16, 0xB057, + 0x8A17, 0xB055, 0x8A18, 0xB04F, 0x8A1B, 0xB35F, 0x8A1D, 0xB359, + 0x8A1E, 0xD7CC, 0x8A1F, 0xB35E, 0x8A22, 0xB360, 0x8A23, 0xB35A, + 0x8A25, 0xB35B, 0x8A27, 0xD7CA, 0x8A2A, 0xB358, 0x8A2C, 0xD7CB, + 0x8A2D, 0xB35D, 0x8A30, 0xD7C9, 0x8A31, 0xB35C, 0x8A34, 0xB644, + 0x8A36, 0xB646, 0x8A39, 0xDBD8, 0x8A3A, 0xB645, 0x8A3B, 0xB5F9, + 0x8A3C, 0xB5FD, 0x8A3E, 0xB8E4, 0x8A3F, 0xE049, 0x8A40, 0xDBDA, + 0x8A41, 0xB5FE, 0x8A44, 0xDBDD, 0x8A45, 0xDBDE, 0x8A46, 0xB643, + 0x8A48, 0xDBE0, 0x8A4A, 0xDBE2, 0x8A4C, 0xDBE3, 0x8A4D, 0xDBD7, + 0x8A4E, 0xDBD6, 0x8A4F, 0xDBE4, 0x8A50, 0xB642, 0x8A51, 0xDBE1, + 0x8A52, 0xDBDF, 0x8A54, 0xB640, 0x8A55, 0xB5FB, 0x8A56, 0xB647, + 0x8A57, 0xDBDB, 0x8A58, 0xDBDC, 0x8A59, 0xDBD9, 0x8A5B, 0xB641, + 0x8A5E, 0xB5FC, 0x8A60, 0xB5FA, 0x8A61, 0xE048, 0x8A62, 0xB8DF, + 0x8A63, 0xB8DA, 0x8A66, 0xB8D5, 0x8A68, 0xB8E5, 0x8A69, 0xB8D6, + 0x8A6B, 0xB8D2, 0x8A6C, 0xB8E1, 0x8A6D, 0xB8DE, 0x8A6E, 0xB8E0, + 0x8A70, 0xB8D7, 0x8A71, 0xB8DC, 0x8A72, 0xB8D3, 0x8A73, 0xB8D4, + 0x8A74, 0xE050, 0x8A75, 0xE04D, 0x8A76, 0xE045, 0x8A77, 0xE04A, + 0x8A79, 0xB8E2, 0x8A7A, 0xE051, 0x8A7B, 0xB8E3, 0x8A7C, 0xB8D9, + 0x8A7F, 0xE047, 0x8A81, 0xE04F, 0x8A82, 0xE04B, 0x8A83, 0xE04E, + 0x8A84, 0xE04C, 0x8A85, 0xB8DD, 0x8A86, 0xE046, 0x8A87, 0xB8D8, + 0x8A8B, 0xE44C, 0x8A8C, 0xBB78, 0x8A8D, 0xBB7B, 0x8A8F, 0xE44E, + 0x8A91, 0xBBA5, 0x8A92, 0xE44D, 0x8A93, 0xBB7D, 0x8A95, 0xBDCF, + 0x8A96, 0xE44F, 0x8A98, 0xBBA4, 0x8A99, 0xE44B, 0x8A9A, 0xBBA6, + 0x8A9E, 0xBB79, 0x8AA0, 0xB8DB, 0x8AA1, 0xBB7C, 0x8AA3, 0xBB7A, + 0x8AA4, 0xBB7E, 0x8AA5, 0xBBA2, 0x8AA6, 0xBB77, 0x8AA7, 0xBBA7, + 0x8AA8, 0xBBA3, 0x8AAA, 0xBBA1, 0x8AAB, 0xE44A, 0x8AB0, 0xBDD6, + 0x8AB2, 0xBDD2, 0x8AB6, 0xBDD9, 0x8AB8, 0xE7D6, 0x8AB9, 0xBDDA, + 0x8ABA, 0xE7E2, 0x8ABB, 0xE7DB, 0x8ABC, 0xBDCB, 0x8ABD, 0xE7E3, + 0x8ABE, 0xE7DD, 0x8ABF, 0xBDD5, 0x8AC0, 0xE7DE, 0x8AC2, 0xBDD4, + 0x8AC3, 0xE7E1, 0x8AC4, 0xBDCE, 0x8AC5, 0xE7DF, 0x8AC6, 0xE7D5, + 0x8AC7, 0xBDCD, 0x8AC8, 0xEBAA, 0x8AC9, 0xBDD3, 0x8ACB, 0xBDD0, + 0x8ACD, 0xBDD8, 0x8ACF, 0xE7D4, 0x8AD1, 0xE7D8, 0x8AD2, 0xBDCC, + 0x8AD3, 0xE7D7, 0x8AD4, 0xE7D9, 0x8AD5, 0xE7DA, 0x8AD6, 0xBDD7, + 0x8AD7, 0xE7DC, 0x8AD8, 0xE7E0, 0x8AD9, 0xE7E4, 0x8ADB, 0xBDDB, + 0x8ADC, 0xBFD2, 0x8ADD, 0xEBA5, 0x8ADE, 0xEBAB, 0x8ADF, 0xEBA8, + 0x8AE0, 0xEB7E, 0x8AE1, 0xEBAC, 0x8AE2, 0xEBA1, 0x8AE4, 0xEBA7, + 0x8AE6, 0xBFCD, 0x8AE7, 0xBFD3, 0x8AE8, 0xEBAD, 0x8AEB, 0xBFCF, + 0x8AED, 0xBFD9, 0x8AEE, 0xBFD4, 0x8AEF, 0xEBAF, 0x8AF0, 0xEBA9, + 0x8AF1, 0xBFD0, 0x8AF2, 0xEBA2, 0x8AF3, 0xBFDA, 0x8AF4, 0xEBA3, + 0x8AF5, 0xEBA4, 0x8AF6, 0xBFDB, 0x8AF7, 0xBFD8, 0x8AF8, 0xBDD1, + 0x8AFA, 0xBFCE, 0x8AFB, 0xEBB0, 0x8AFC, 0xBFDC, 0x8AFE, 0xBFD5, + 0x8AFF, 0xEBAE, 0x8B00, 0xBFD1, 0x8B01, 0xBFD6, 0x8B02, 0xBFD7, + 0x8B04, 0xC1C3, 0x8B05, 0xEEA4, 0x8B06, 0xEEAD, 0x8B07, 0xEEAA, + 0x8B08, 0xEEAC, 0x8B0A, 0xC1C0, 0x8B0B, 0xEEA5, 0x8B0D, 0xEEAB, + 0x8B0E, 0xC1BC, 0x8B0F, 0xEEA7, 0x8B10, 0xC1C4, 0x8B11, 0xEEA3, + 0x8B12, 0xEEA8, 0x8B13, 0xEEAF, 0x8B14, 0xEBA6, 0x8B15, 0xEEA9, + 0x8B16, 0xEEA2, 0x8B17, 0xC1BD, 0x8B18, 0xEEA1, 0x8B19, 0xC1BE, + 0x8B1A, 0xEEB0, 0x8B1B, 0xC1BF, 0x8B1C, 0xEEAE, 0x8B1D, 0xC1C2, + 0x8B1E, 0xEE7E, 0x8B20, 0xC1C1, 0x8B22, 0xEEA6, 0x8B23, 0xF0DC, + 0x8B24, 0xF0EA, 0x8B25, 0xF0E5, 0x8B26, 0xF0E7, 0x8B27, 0xF0DB, + 0x8B28, 0xC2D3, 0x8B2A, 0xF0DA, 0x8B2B, 0xC2D6, 0x8B2C, 0xC2D5, + 0x8B2E, 0xF0E9, 0x8B2F, 0xF0E1, 0x8B30, 0xF0DE, 0x8B31, 0xF0E4, + 0x8B33, 0xF0DD, 0x8B35, 0xF0DF, 0x8B36, 0xF0E8, 0x8B37, 0xF0E6, + 0x8B39, 0xC2D4, 0x8B3A, 0xF0ED, 0x8B3B, 0xF0EB, 0x8B3C, 0xF0E2, + 0x8B3D, 0xF0EC, 0x8B3E, 0xF0E3, 0x8B40, 0xF2F9, 0x8B41, 0xC3CF, + 0x8B42, 0xF341, 0x8B45, 0xF64F, 0x8B46, 0xC3D6, 0x8B47, 0xF0E0, + 0x8B48, 0xF2F7, 0x8B49, 0xC3D2, 0x8B4A, 0xF2F8, 0x8B4B, 0xF2FD, + 0x8B4E, 0xC3D4, 0x8B4F, 0xC3D5, 0x8B50, 0xF2F6, 0x8B51, 0xF340, + 0x8B52, 0xF342, 0x8B53, 0xF2FA, 0x8B54, 0xF2FC, 0x8B55, 0xF2FE, + 0x8B56, 0xF2FB, 0x8B57, 0xF343, 0x8B58, 0xC3D1, 0x8B59, 0xC3D7, + 0x8B5A, 0xC3D3, 0x8B5C, 0xC3D0, 0x8B5D, 0xF4D0, 0x8B5F, 0xC4B7, + 0x8B60, 0xF4CE, 0x8B63, 0xF4D2, 0x8B65, 0xF4D3, 0x8B66, 0xC4B5, + 0x8B67, 0xF4D4, 0x8B68, 0xF4D1, 0x8B6A, 0xF4CF, 0x8B6B, 0xC4B8, + 0x8B6C, 0xC4B4, 0x8B6D, 0xF4D5, 0x8B6F, 0xC4B6, 0x8B70, 0xC4B3, + 0x8B74, 0xC4FE, 0x8B77, 0xC540, 0x8B78, 0xF64E, 0x8B79, 0xF64D, + 0x8B7A, 0xF650, 0x8B7B, 0xF651, 0x8B7D, 0xC541, 0x8B7E, 0xF756, + 0x8B7F, 0xF75B, 0x8B80, 0xC5AA, 0x8B82, 0xF758, 0x8B84, 0xF757, + 0x8B85, 0xF75A, 0x8B86, 0xF759, 0x8B88, 0xF843, 0x8B8A, 0xC5DC, + 0x8B8B, 0xF842, 0x8B8C, 0xF840, 0x8B8E, 0xF841, 0x8B92, 0xC5FE, + 0x8B93, 0xC5FD, 0x8B94, 0xF8C1, 0x8B95, 0xF8C2, 0x8B96, 0xC640, + 0x8B98, 0xF94D, 0x8B99, 0xF94E, 0x8B9A, 0xC667, 0x8B9C, 0xC66D, + 0x8B9E, 0xF9A9, 0x8B9F, 0xF9C8, 0x8C37, 0xA8A6, 0x8C39, 0xD7CD, + 0x8C3B, 0xD7CE, 0x8C3C, 0xE052, 0x8C3D, 0xE450, 0x8C3E, 0xE7E5, + 0x8C3F, 0xC1C6, 0x8C41, 0xC1C5, 0x8C42, 0xF0EE, 0x8C43, 0xF344, + 0x8C45, 0xF844, 0x8C46, 0xA8A7, 0x8C47, 0xD3DE, 0x8C48, 0xB05A, + 0x8C49, 0xB361, 0x8C4A, 0xE054, 0x8C4B, 0xE053, 0x8C4C, 0xBDDC, + 0x8C4D, 0xE7E6, 0x8C4E, 0xBDDD, 0x8C4F, 0xEEB1, 0x8C50, 0xC2D7, + 0x8C54, 0xC676, 0x8C55, 0xA8A8, 0x8C56, 0xCDCB, 0x8C57, 0xD3DF, + 0x8C5A, 0xB362, 0x8C5C, 0xD7CF, 0x8C5D, 0xD7D0, 0x8C5F, 0xDBE5, + 0x8C61, 0xB648, 0x8C62, 0xB8E6, 0x8C64, 0xE056, 0x8C65, 0xE055, + 0x8C66, 0xE057, 0x8C68, 0xE451, 0x8C69, 0xE452, 0x8C6A, 0xBBA8, + 0x8C6B, 0xBFDD, 0x8C6C, 0xBDDE, 0x8C6D, 0xBFDE, 0x8C6F, 0xEEB5, + 0x8C70, 0xEEB2, 0x8C71, 0xEEB4, 0x8C72, 0xEEB3, 0x8C73, 0xC1C7, + 0x8C75, 0xF0EF, 0x8C76, 0xF346, 0x8C77, 0xF345, 0x8C78, 0xCBA4, + 0x8C79, 0xB05C, 0x8C7A, 0xB05B, 0x8C7B, 0xD3E0, 0x8C7D, 0xD7D1, + 0x8C80, 0xDBE7, 0x8C81, 0xDBE6, 0x8C82, 0xB649, 0x8C84, 0xE059, + 0x8C85, 0xE05A, 0x8C86, 0xE058, 0x8C89, 0xB8E8, 0x8C8A, 0xB8E7, + 0x8C8C, 0xBBAA, 0x8C8D, 0xBBA9, 0x8C8F, 0xE7E7, 0x8C90, 0xEBB3, + 0x8C91, 0xEBB1, 0x8C92, 0xEBB2, 0x8C93, 0xBFDF, 0x8C94, 0xEEB7, + 0x8C95, 0xEEB6, 0x8C97, 0xF0F2, 0x8C98, 0xF0F1, 0x8C99, 0xF0F0, + 0x8C9A, 0xF347, 0x8C9C, 0xF9AA, 0x8C9D, 0xA8A9, 0x8C9E, 0xAD73, + 0x8CA0, 0xAD74, 0x8CA1, 0xB05D, 0x8CA2, 0xB05E, 0x8CA3, 0xD3E2, + 0x8CA4, 0xD3E1, 0x8CA5, 0xD7D2, 0x8CA7, 0xB368, 0x8CA8, 0xB366, + 0x8CA9, 0xB363, 0x8CAA, 0xB367, 0x8CAB, 0xB365, 0x8CAC, 0xB364, + 0x8CAF, 0xB64A, 0x8CB0, 0xDBEA, 0x8CB2, 0xB8ED, 0x8CB3, 0xB64C, + 0x8CB4, 0xB651, 0x8CB5, 0xDBEC, 0x8CB6, 0xB653, 0x8CB7, 0xB652, + 0x8CB8, 0xB655, 0x8CB9, 0xDBEB, 0x8CBA, 0xDBE8, 0x8CBB, 0xB64F, + 0x8CBC, 0xB64B, 0x8CBD, 0xB64D, 0x8CBE, 0xDBE9, 0x8CBF, 0xB654, + 0x8CC0, 0xB650, 0x8CC1, 0xB64E, 0x8CC2, 0xB8EF, 0x8CC3, 0xB8EE, + 0x8CC4, 0xB8EC, 0x8CC5, 0xB8F0, 0x8CC7, 0xB8EA, 0x8CC8, 0xB8EB, + 0x8CCA, 0xB8E9, 0x8CCC, 0xE05B, 0x8CCF, 0xE454, 0x8CD1, 0xBBAC, + 0x8CD2, 0xBBAD, 0x8CD3, 0xBBAB, 0x8CD5, 0xE453, 0x8CD7, 0xE455, + 0x8CD9, 0xE7EA, 0x8CDA, 0xE7EC, 0x8CDC, 0xBDE7, 0x8CDD, 0xE7ED, + 0x8CDE, 0xBDE0, 0x8CDF, 0xE7E9, 0x8CE0, 0xBDDF, 0x8CE1, 0xBDE9, + 0x8CE2, 0xBDE5, 0x8CE3, 0xBDE6, 0x8CE4, 0xBDE2, 0x8CE5, 0xE7E8, + 0x8CE6, 0xBDE1, 0x8CE7, 0xE7EE, 0x8CE8, 0xE7EB, 0x8CEA, 0xBDE8, + 0x8CEC, 0xBDE3, 0x8CED, 0xBDE4, 0x8CEE, 0xEBB5, 0x8CF0, 0xEBB7, + 0x8CF1, 0xEBB6, 0x8CF3, 0xEBB8, 0x8CF4, 0xBFE0, 0x8CF5, 0xEBB4, + 0x8CF8, 0xC1CB, 0x8CF9, 0xEEB8, 0x8CFA, 0xC1C8, 0x8CFB, 0xC1CC, + 0x8CFC, 0xC1CA, 0x8CFD, 0xC1C9, 0x8CFE, 0xF0F3, 0x8D00, 0xF0F6, + 0x8D02, 0xF0F5, 0x8D04, 0xF0F4, 0x8D05, 0xC2D8, 0x8D06, 0xF348, + 0x8D07, 0xF349, 0x8D08, 0xC3D8, 0x8D09, 0xF34A, 0x8D0A, 0xC3D9, + 0x8D0D, 0xC4BA, 0x8D0F, 0xC4B9, 0x8D10, 0xF652, 0x8D13, 0xC542, + 0x8D14, 0xF653, 0x8D15, 0xF75C, 0x8D16, 0xC5AB, 0x8D17, 0xC5AC, + 0x8D19, 0xF845, 0x8D1B, 0xC642, 0x8D64, 0xA8AA, 0x8D66, 0xB36A, + 0x8D67, 0xB369, 0x8D68, 0xE05C, 0x8D69, 0xE05D, 0x8D6B, 0xBBAE, + 0x8D6C, 0xEBB9, 0x8D6D, 0xBDEA, 0x8D6E, 0xEBBA, 0x8D6F, 0xEEB9, + 0x8D70, 0xA8AB, 0x8D72, 0xD0B2, 0x8D73, 0xAD76, 0x8D74, 0xAD75, + 0x8D76, 0xD3E3, 0x8D77, 0xB05F, 0x8D78, 0xD3E4, 0x8D79, 0xD7D5, + 0x8D7B, 0xD7D4, 0x8D7D, 0xD7D3, 0x8D80, 0xDBEE, 0x8D81, 0xB658, + 0x8D84, 0xDBED, 0x8D85, 0xB657, 0x8D89, 0xDBEF, 0x8D8A, 0xB656, + 0x8D8C, 0xE05F, 0x8D8D, 0xE062, 0x8D8E, 0xE060, 0x8D8F, 0xE061, + 0x8D90, 0xE065, 0x8D91, 0xE05E, 0x8D92, 0xE066, 0x8D93, 0xE063, + 0x8D94, 0xE064, 0x8D95, 0xBBB0, 0x8D96, 0xE456, 0x8D99, 0xBBAF, + 0x8D9B, 0xE7F2, 0x8D9C, 0xE7F0, 0x8D9F, 0xBDEB, 0x8DA0, 0xE7EF, + 0x8DA1, 0xE7F1, 0x8DA3, 0xBDEC, 0x8DA5, 0xEBBB, 0x8DA7, 0xEBBC, + 0x8DA8, 0xC1CD, 0x8DAA, 0xF34C, 0x8DAB, 0xF34E, 0x8DAC, 0xF34B, + 0x8DAD, 0xF34D, 0x8DAE, 0xF4D6, 0x8DAF, 0xF654, 0x8DB2, 0xF96F, + 0x8DB3, 0xA8AC, 0x8DB4, 0xAD77, 0x8DB5, 0xD3E5, 0x8DB6, 0xD3E7, + 0x8DB7, 0xD3E6, 0x8DB9, 0xD7D8, 0x8DBA, 0xB36C, 0x8DBC, 0xD7D6, + 0x8DBE, 0xB36B, 0x8DBF, 0xD7D9, 0x8DC1, 0xD7DA, 0x8DC2, 0xD7D7, + 0x8DC5, 0xDBFB, 0x8DC6, 0xB660, 0x8DC7, 0xDBF3, 0x8DC8, 0xDBF9, + 0x8DCB, 0xB65B, 0x8DCC, 0xB65E, 0x8DCD, 0xDBF2, 0x8DCE, 0xB659, + 0x8DCF, 0xDBF6, 0x8DD0, 0xE06C, 0x8DD1, 0xB65D, 0x8DD3, 0xDBF1, + 0x8DD5, 0xDBF7, 0x8DD6, 0xDBF4, 0x8DD7, 0xDBFA, 0x8DD8, 0xDBF0, + 0x8DD9, 0xDBF8, 0x8DDA, 0xB65C, 0x8DDB, 0xB65F, 0x8DDC, 0xDBF5, + 0x8DDD, 0xB65A, 0x8DDF, 0xB8F2, 0x8DE0, 0xE068, 0x8DE1, 0xB8F1, + 0x8DE2, 0xE06F, 0x8DE3, 0xE06E, 0x8DE4, 0xB8F8, 0x8DE6, 0xB8F9, + 0x8DE7, 0xE070, 0x8DE8, 0xB8F3, 0x8DE9, 0xE06D, 0x8DEA, 0xB8F7, + 0x8DEB, 0xE072, 0x8DEC, 0xE069, 0x8DEE, 0xE06B, 0x8DEF, 0xB8F4, + 0x8DF0, 0xE067, 0x8DF1, 0xE06A, 0x8DF2, 0xE071, 0x8DF3, 0xB8F5, + 0x8DF4, 0xE073, 0x8DFA, 0xB8F6, 0x8DFC, 0xBBB1, 0x8DFD, 0xE45B, + 0x8DFE, 0xE461, 0x8DFF, 0xE459, 0x8E00, 0xE462, 0x8E02, 0xE458, + 0x8E03, 0xE45D, 0x8E04, 0xE463, 0x8E05, 0xE460, 0x8E06, 0xE45F, + 0x8E07, 0xE45E, 0x8E09, 0xE457, 0x8E0A, 0xE45C, 0x8E0D, 0xE45A, + 0x8E0F, 0xBDF1, 0x8E10, 0xBDEE, 0x8E11, 0xE7FB, 0x8E12, 0xE841, + 0x8E13, 0xE843, 0x8E14, 0xE840, 0x8E15, 0xE7F8, 0x8E16, 0xE7FA, + 0x8E17, 0xE845, 0x8E18, 0xE842, 0x8E19, 0xE7FC, 0x8E1A, 0xE846, + 0x8E1B, 0xE7F9, 0x8E1C, 0xE844, 0x8E1D, 0xBDEF, 0x8E1E, 0xBDF5, + 0x8E1F, 0xBDF3, 0x8E20, 0xE7F3, 0x8E21, 0xBDF4, 0x8E22, 0xBDF0, + 0x8E23, 0xE7F4, 0x8E24, 0xE7F6, 0x8E25, 0xE7F5, 0x8E26, 0xE7FD, + 0x8E27, 0xE7FE, 0x8E29, 0xBDF2, 0x8E2B, 0xBDED, 0x8E2E, 0xE7F7, + 0x8E30, 0xEBC6, 0x8E31, 0xBFE2, 0x8E33, 0xEBBD, 0x8E34, 0xBFE3, + 0x8E35, 0xBFE6, 0x8E36, 0xEBC2, 0x8E38, 0xEBBF, 0x8E39, 0xBFE5, + 0x8E3C, 0xEBC3, 0x8E3D, 0xEBC4, 0x8E3E, 0xEBBE, 0x8E3F, 0xEBC7, + 0x8E40, 0xEBC0, 0x8E41, 0xEBC5, 0x8E42, 0xBFE4, 0x8E44, 0xBFE1, + 0x8E45, 0xEBC1, 0x8E47, 0xEEBF, 0x8E48, 0xC1D0, 0x8E49, 0xC1CE, + 0x8E4A, 0xC1D1, 0x8E4B, 0xC1CF, 0x8E4C, 0xEEBE, 0x8E4D, 0xEEBB, + 0x8E4E, 0xEEBA, 0x8E50, 0xEEBD, 0x8E53, 0xEEBC, 0x8E54, 0xF145, + 0x8E55, 0xC2DE, 0x8E56, 0xF0FB, 0x8E57, 0xF0FA, 0x8E59, 0xC2D9, + 0x8E5A, 0xF141, 0x8E5B, 0xF140, 0x8E5C, 0xF0F7, 0x8E5D, 0xF143, + 0x8E5E, 0xF0FC, 0x8E5F, 0xC2DD, 0x8E60, 0xF0F9, 0x8E61, 0xF142, + 0x8E62, 0xF0F8, 0x8E63, 0xC2DA, 0x8E64, 0xC2DC, 0x8E65, 0xF0FD, + 0x8E66, 0xC2DB, 0x8E67, 0xF0FE, 0x8E69, 0xF144, 0x8E6A, 0xF352, + 0x8E6C, 0xC3DE, 0x8E6D, 0xF34F, 0x8E6F, 0xF353, 0x8E72, 0xC3DB, + 0x8E73, 0xF351, 0x8E74, 0xC3E0, 0x8E76, 0xC3DD, 0x8E78, 0xF350, + 0x8E7A, 0xC3DF, 0x8E7B, 0xF354, 0x8E7C, 0xC3DA, 0x8E81, 0xC4BC, + 0x8E82, 0xC4BE, 0x8E84, 0xF4D9, 0x8E85, 0xC4BD, 0x8E86, 0xF4D7, + 0x8E87, 0xC3DC, 0x8E88, 0xF4D8, 0x8E89, 0xC4BB, 0x8E8A, 0xC543, + 0x8E8B, 0xC545, 0x8E8C, 0xF656, 0x8E8D, 0xC544, 0x8E8E, 0xF655, + 0x8E90, 0xF761, 0x8E91, 0xC5AD, 0x8E92, 0xF760, 0x8E93, 0xC5AE, + 0x8E94, 0xF75E, 0x8E95, 0xF75D, 0x8E96, 0xF762, 0x8E97, 0xF763, + 0x8E98, 0xF846, 0x8E9A, 0xF75F, 0x8E9D, 0xF8C6, 0x8E9E, 0xF8C3, + 0x8E9F, 0xF8C4, 0x8EA0, 0xF8C5, 0x8EA1, 0xC65C, 0x8EA3, 0xF951, + 0x8EA4, 0xF950, 0x8EA5, 0xF94F, 0x8EA6, 0xF970, 0x8EA8, 0xF9BE, + 0x8EA9, 0xF9AB, 0x8EAA, 0xC66E, 0x8EAB, 0xA8AD, 0x8EAC, 0xB060, + 0x8EB2, 0xB8FA, 0x8EBA, 0xBDF6, 0x8EBD, 0xEBC8, 0x8EC0, 0xC2DF, + 0x8EC2, 0xF355, 0x8EC9, 0xF9AC, 0x8ECA, 0xA8AE, 0x8ECB, 0xAAEE, + 0x8ECC, 0xAD79, 0x8ECD, 0xAD78, 0x8ECF, 0xB063, 0x8ED1, 0xD3E8, + 0x8ED2, 0xB061, 0x8ED3, 0xD3E9, 0x8ED4, 0xB062, 0x8ED7, 0xD7DF, + 0x8ED8, 0xD7DB, 0x8EDB, 0xB36D, 0x8EDC, 0xD7DE, 0x8EDD, 0xD7DD, + 0x8EDE, 0xD7DC, 0x8EDF, 0xB36E, 0x8EE0, 0xD7E0, 0x8EE1, 0xD7E1, + 0x8EE5, 0xDC43, 0x8EE6, 0xDC41, 0x8EE7, 0xDC45, 0x8EE8, 0xDC46, + 0x8EE9, 0xDC4C, 0x8EEB, 0xDC48, 0x8EEC, 0xDC4A, 0x8EEE, 0xDC42, + 0x8EEF, 0xDBFC, 0x8EF1, 0xDC49, 0x8EF4, 0xDC4B, 0x8EF5, 0xDC44, + 0x8EF6, 0xDC47, 0x8EF7, 0xDBFD, 0x8EF8, 0xB662, 0x8EF9, 0xDC40, + 0x8EFA, 0xDBFE, 0x8EFB, 0xB661, 0x8EFC, 0xB663, 0x8EFE, 0xB8FD, + 0x8EFF, 0xE075, 0x8F00, 0xE077, 0x8F01, 0xE076, 0x8F02, 0xE07B, + 0x8F03, 0xB8FB, 0x8F05, 0xE078, 0x8F06, 0xE074, 0x8F07, 0xE079, + 0x8F08, 0xE07A, 0x8F09, 0xB8FC, 0x8F0A, 0xB8FE, 0x8F0B, 0xE07C, + 0x8F0D, 0xE467, 0x8F0E, 0xE466, 0x8F10, 0xE464, 0x8F11, 0xE465, + 0x8F12, 0xBBB3, 0x8F13, 0xBBB5, 0x8F14, 0xBBB2, 0x8F15, 0xBBB4, + 0x8F16, 0xE84D, 0x8F17, 0xE84E, 0x8F18, 0xE849, 0x8F1A, 0xE84A, + 0x8F1B, 0xBDF8, 0x8F1C, 0xBDFD, 0x8F1D, 0xBDF7, 0x8F1E, 0xBDFE, + 0x8F1F, 0xBDF9, 0x8F20, 0xE84B, 0x8F23, 0xE84C, 0x8F24, 0xE848, + 0x8F25, 0xBE40, 0x8F26, 0xBDFB, 0x8F29, 0xBDFA, 0x8F2A, 0xBDFC, + 0x8F2C, 0xE847, 0x8F2E, 0xEBCA, 0x8F2F, 0xBFE8, 0x8F32, 0xEBCC, + 0x8F33, 0xBFEA, 0x8F34, 0xEBCF, 0x8F35, 0xEBCB, 0x8F36, 0xEBC9, + 0x8F37, 0xEBCE, 0x8F38, 0xBFE9, 0x8F39, 0xEBCD, 0x8F3B, 0xBFE7, + 0x8F3E, 0xC1D3, 0x8F3F, 0xC1D6, 0x8F40, 0xEEC1, 0x8F42, 0xC1D4, + 0x8F43, 0xEEC0, 0x8F44, 0xC1D2, 0x8F45, 0xC1D5, 0x8F46, 0xF146, + 0x8F47, 0xF147, 0x8F48, 0xF148, 0x8F49, 0xC2E0, 0x8F4B, 0xF149, + 0x8F4D, 0xC2E1, 0x8F4E, 0xC3E2, 0x8F4F, 0xF358, 0x8F50, 0xF359, + 0x8F51, 0xF357, 0x8F52, 0xF356, 0x8F53, 0xF35A, 0x8F54, 0xC3E1, + 0x8F55, 0xF4DD, 0x8F56, 0xF4DB, 0x8F57, 0xF4DC, 0x8F58, 0xF4DE, + 0x8F59, 0xF4DA, 0x8F5A, 0xF4DF, 0x8F5B, 0xF658, 0x8F5D, 0xF659, + 0x8F5E, 0xF657, 0x8F5F, 0xC546, 0x8F60, 0xF764, 0x8F61, 0xC5AF, + 0x8F62, 0xF765, 0x8F63, 0xF848, 0x8F64, 0xF847, 0x8F9B, 0xA8AF, + 0x8F9C, 0xB664, 0x8F9F, 0xB940, 0x8FA3, 0xBBB6, 0x8FA6, 0xBFEC, + 0x8FA8, 0xBFEB, 0x8FAD, 0xC3E3, 0x8FAE, 0xC47C, 0x8FAF, 0xC547, + 0x8FB0, 0xA8B0, 0x8FB1, 0xB064, 0x8FB2, 0xB941, 0x8FB4, 0xF35B, + 0x8FBF, 0xCBA6, 0x8FC2, 0xA8B1, 0x8FC4, 0xA8B4, 0x8FC5, 0xA8B3, + 0x8FC6, 0xA8B2, 0x8FC9, 0xCBA5, 0x8FCB, 0xCDCD, 0x8FCD, 0xCDCF, + 0x8FCE, 0xAAEF, 0x8FD1, 0xAAF1, 0x8FD2, 0xCDCC, 0x8FD3, 0xCDCE, + 0x8FD4, 0xAAF0, 0x8FD5, 0xCDD1, 0x8FD6, 0xCDD0, 0x8FD7, 0xCDD2, + 0x8FE0, 0xD0B6, 0x8FE1, 0xD0B4, 0x8FE2, 0xAD7C, 0x8FE3, 0xD0B3, + 0x8FE4, 0xADA3, 0x8FE5, 0xAD7E, 0x8FE6, 0xAD7B, 0x8FE8, 0xADA4, + 0x8FEA, 0xAD7D, 0x8FEB, 0xADA2, 0x8FED, 0xADA1, 0x8FEE, 0xD0B5, + 0x8FF0, 0xAD7A, 0x8FF4, 0xB06A, 0x8FF5, 0xD3EB, 0x8FF6, 0xD3F1, + 0x8FF7, 0xB067, 0x8FF8, 0xB06E, 0x8FFA, 0xB069, 0x8FFB, 0xD3EE, + 0x8FFC, 0xD3F0, 0x8FFD, 0xB06C, 0x8FFE, 0xD3EA, 0x8FFF, 0xD3ED, + 0x9000, 0xB068, 0x9001, 0xB065, 0x9002, 0xD3EC, 0x9003, 0xB06B, + 0x9004, 0xD3EF, 0x9005, 0xB06D, 0x9006, 0xB066, 0x900B, 0xD7E3, + 0x900C, 0xD7E6, 0x900D, 0xB370, 0x900F, 0xB37A, 0x9010, 0xB376, + 0x9011, 0xD7E4, 0x9014, 0xB37E, 0x9015, 0xB377, 0x9016, 0xB37C, + 0x9017, 0xB372, 0x9019, 0xB36F, 0x901A, 0xB371, 0x901B, 0xB37D, + 0x901C, 0xD7E5, 0x901D, 0xB375, 0x901E, 0xB378, 0x901F, 0xB374, + 0x9020, 0xB379, 0x9021, 0xD7E7, 0x9022, 0xB37B, 0x9023, 0xB373, + 0x9024, 0xD7E2, 0x902D, 0xDC4D, 0x902E, 0xB665, 0x902F, 0xDC4F, + 0x9031, 0xB667, 0x9032, 0xB669, 0x9034, 0xDC4E, 0x9035, 0xB666, + 0x9036, 0xB66A, 0x9038, 0xB668, 0x903C, 0xB947, 0x903D, 0xE0A3, + 0x903E, 0xB94F, 0x903F, 0xE07E, 0x9041, 0xB950, 0x9042, 0xB945, + 0x9044, 0xE0A1, 0x9047, 0xB94A, 0x9049, 0xE0A2, 0x904A, 0xB943, + 0x904B, 0xB942, 0x904D, 0xB94D, 0x904E, 0xB94C, 0x904F, 0xB94B, + 0x9050, 0xB949, 0x9051, 0xB94E, 0x9052, 0xE07D, 0x9053, 0xB944, + 0x9054, 0xB946, 0x9055, 0xB948, 0x9058, 0xBBB8, 0x9059, 0xBBBB, + 0x905B, 0xBBBF, 0x905C, 0xBBB9, 0x905D, 0xBBBE, 0x905E, 0xBBBC, + 0x9060, 0xBBB7, 0x9062, 0xBBBD, 0x9063, 0xBBBA, 0x9067, 0xE852, + 0x9068, 0xBE43, 0x9069, 0xBE41, 0x906B, 0xE853, 0x906D, 0xBE44, + 0x906E, 0xBE42, 0x906F, 0xE851, 0x9070, 0xE850, 0x9072, 0xBFF0, + 0x9073, 0xE84F, 0x9074, 0xBFEE, 0x9075, 0xBFED, 0x9076, 0xEBD0, + 0x9077, 0xBE45, 0x9078, 0xBFEF, 0x9079, 0xEBD1, 0x907A, 0xBFF2, + 0x907B, 0xEBD2, 0x907C, 0xBFF1, 0x907D, 0xC1D8, 0x907E, 0xEEC3, + 0x907F, 0xC1D7, 0x9080, 0xC1DC, 0x9081, 0xC1DA, 0x9082, 0xC1DB, + 0x9083, 0xC2E3, 0x9084, 0xC1D9, 0x9085, 0xEEC2, 0x9086, 0xEBD3, + 0x9087, 0xC2E2, 0x9088, 0xC2E4, 0x908A, 0xC3E4, 0x908B, 0xC3E5, + 0x908D, 0xF4E0, 0x908F, 0xC5DE, 0x9090, 0xC5DD, 0x9091, 0xA8B6, + 0x9094, 0xCA55, 0x9095, 0xB06F, 0x9097, 0xCA52, 0x9098, 0xCA53, + 0x9099, 0xCA51, 0x909B, 0xCA54, 0x909E, 0xCBAA, 0x909F, 0xCBA7, + 0x90A0, 0xCBAC, 0x90A1, 0xCBA8, 0x90A2, 0xA8B7, 0x90A3, 0xA8BA, + 0x90A5, 0xCBA9, 0x90A6, 0xA8B9, 0x90A7, 0xCBAB, 0x90AA, 0xA8B8, + 0x90AF, 0xCDD5, 0x90B0, 0xCDD7, 0x90B1, 0xAAF4, 0x90B2, 0xCDD3, + 0x90B3, 0xCDD6, 0x90B4, 0xCDD4, 0x90B5, 0xAAF2, 0x90B6, 0xAAF5, + 0x90B8, 0xAAF3, 0x90BD, 0xD0B8, 0x90BE, 0xD0BC, 0x90BF, 0xD0B9, + 0x90C1, 0xADA7, 0x90C3, 0xADA8, 0x90C5, 0xD0BB, 0x90C7, 0xD0BD, + 0x90C8, 0xD0BF, 0x90CA, 0xADA5, 0x90CB, 0xD0BE, 0x90CE, 0xADA6, + 0x90D4, 0xD7EE, 0x90D5, 0xD0BA, 0x90D6, 0xD3F2, 0x90D7, 0xD3FB, + 0x90D8, 0xD3F9, 0x90D9, 0xD3F4, 0x90DA, 0xD3F5, 0x90DB, 0xD3FA, + 0x90DC, 0xD3FC, 0x90DD, 0xB071, 0x90DF, 0xD3F7, 0x90E0, 0xD3F3, + 0x90E1, 0xB070, 0x90E2, 0xB072, 0x90E3, 0xD3F6, 0x90E4, 0xD3FD, + 0x90E5, 0xD3F8, 0x90E8, 0xB3A1, 0x90E9, 0xD7F1, 0x90EA, 0xD7E9, + 0x90EB, 0xD7EF, 0x90EC, 0xD7F0, 0x90ED, 0xB3A2, 0x90EF, 0xD7E8, + 0x90F0, 0xD7EA, 0x90F1, 0xD0B7, 0x90F2, 0xD7EC, 0x90F3, 0xD7ED, + 0x90F4, 0xD7EB, 0x90F5, 0xB66C, 0x90F9, 0xDC56, 0x90FA, 0xEBD4, + 0x90FB, 0xDC57, 0x90FC, 0xDC54, 0x90FD, 0xB3A3, 0x90FE, 0xB66E, + 0x90FF, 0xDC53, 0x9100, 0xDC59, 0x9101, 0xDC58, 0x9102, 0xB66B, + 0x9103, 0xDC5C, 0x9104, 0xDC52, 0x9105, 0xDC5B, 0x9106, 0xDC50, + 0x9107, 0xDC5A, 0x9108, 0xDC55, 0x9109, 0xB66D, 0x910B, 0xE0AA, + 0x910D, 0xE0A5, 0x910E, 0xE0AB, 0x910F, 0xE0A6, 0x9110, 0xE0A4, + 0x9111, 0xE0A7, 0x9112, 0xB951, 0x9114, 0xE0A9, 0x9116, 0xE0A8, + 0x9117, 0xB952, 0x9118, 0xBBC1, 0x9119, 0xBBC0, 0x911A, 0xE46E, + 0x911B, 0xE471, 0x911C, 0xE469, 0x911D, 0xE46D, 0x911E, 0xBBC2, + 0x911F, 0xE46C, 0x9120, 0xE46A, 0x9121, 0xE470, 0x9122, 0xE46B, + 0x9123, 0xE468, 0x9124, 0xE46F, 0x9126, 0xE859, 0x9127, 0xBE48, + 0x9128, 0xF14A, 0x9129, 0xE856, 0x912A, 0xE857, 0x912B, 0xE855, + 0x912C, 0xDC51, 0x912D, 0xBE47, 0x912E, 0xE85A, 0x912F, 0xE854, + 0x9130, 0xBE46, 0x9131, 0xBE49, 0x9132, 0xE858, 0x9133, 0xEBD5, + 0x9134, 0xBFF3, 0x9135, 0xEBD6, 0x9136, 0xEBD7, 0x9138, 0xEEC4, + 0x9139, 0xC1DD, 0x913A, 0xF14B, 0x913B, 0xF14C, 0x913E, 0xF14D, + 0x913F, 0xF35D, 0x9140, 0xF35C, 0x9141, 0xF4E2, 0x9143, 0xF4E1, + 0x9144, 0xF65B, 0x9145, 0xF65C, 0x9146, 0xF65A, 0x9147, 0xF766, + 0x9148, 0xC5B0, 0x9149, 0xA8BB, 0x914A, 0xADAA, 0x914B, 0xADA9, + 0x914C, 0xB075, 0x914D, 0xB074, 0x914E, 0xD440, 0x914F, 0xD441, + 0x9150, 0xD3FE, 0x9152, 0xB073, 0x9153, 0xD7F5, 0x9155, 0xD7F6, + 0x9156, 0xD7F2, 0x9157, 0xB3A4, 0x9158, 0xD7F3, 0x915A, 0xD7F4, + 0x915F, 0xDC5F, 0x9160, 0xDC61, 0x9161, 0xDC5D, 0x9162, 0xDC60, + 0x9163, 0xB66F, 0x9164, 0xDC5E, 0x9165, 0xB670, 0x9168, 0xDD73, + 0x9169, 0xB955, 0x916A, 0xB954, 0x916C, 0xB953, 0x916E, 0xE0AC, + 0x916F, 0xE0AD, 0x9172, 0xE473, 0x9173, 0xE475, 0x9174, 0xBBC6, + 0x9175, 0xBBC3, 0x9177, 0xBBC5, 0x9178, 0xBBC4, 0x9179, 0xE474, + 0x917A, 0xE472, 0x9180, 0xE861, 0x9181, 0xE85E, 0x9182, 0xE85F, + 0x9183, 0xBE4D, 0x9184, 0xE860, 0x9185, 0xE85B, 0x9186, 0xE85C, + 0x9187, 0xBE4A, 0x9189, 0xBE4B, 0x918A, 0xE85D, 0x918B, 0xBE4C, + 0x918D, 0xEBDB, 0x918F, 0xEBDC, 0x9190, 0xEBD9, 0x9191, 0xEBDA, + 0x9192, 0xBFF4, 0x9193, 0xEBD8, 0x9199, 0xEEC8, 0x919A, 0xEEC5, + 0x919B, 0xEEC7, 0x919C, 0xC1E0, 0x919D, 0xEECB, 0x919E, 0xC1DF, + 0x919F, 0xEEC9, 0x91A0, 0xEECC, 0x91A1, 0xEECA, 0x91A2, 0xEEC6, + 0x91A3, 0xC1DE, 0x91A5, 0xF14F, 0x91A7, 0xF150, 0x91A8, 0xF14E, + 0x91AA, 0xF152, 0x91AB, 0xC2E5, 0x91AC, 0xC2E6, 0x91AD, 0xF35F, + 0x91AE, 0xC3E7, 0x91AF, 0xF151, 0x91B0, 0xF35E, 0x91B1, 0xC3E6, + 0x91B2, 0xF4E5, 0x91B3, 0xF4E6, 0x91B4, 0xC4BF, 0x91B5, 0xF4E4, + 0x91B7, 0xF4E3, 0x91B9, 0xF65D, 0x91BA, 0xC548, 0x91BC, 0xF849, + 0x91BD, 0xF8C8, 0x91BE, 0xF8C7, 0x91C0, 0xC643, 0x91C1, 0xC65D, + 0x91C2, 0xF8C9, 0x91C3, 0xF971, 0x91C5, 0xC66F, 0x91C6, 0xA8BC, + 0x91C7, 0xAAF6, 0x91C9, 0xB956, 0x91CB, 0xC4C0, 0x91CC, 0xA8BD, + 0x91CD, 0xADAB, 0x91CE, 0xB3A5, 0x91CF, 0xB671, 0x91D0, 0xC2E7, + 0x91D1, 0xAAF7, 0x91D3, 0xD0C1, 0x91D4, 0xD0C0, 0x91D5, 0xD442, + 0x91D7, 0xB078, 0x91D8, 0xB076, 0x91D9, 0xB07A, 0x91DA, 0xD444, + 0x91DC, 0xB079, 0x91DD, 0xB077, 0x91E2, 0xD443, 0x91E3, 0xB3A8, + 0x91E4, 0xD7FC, 0x91E6, 0xB3A7, 0x91E7, 0xB3A9, 0x91E8, 0xD842, + 0x91E9, 0xB3AB, 0x91EA, 0xD7FE, 0x91EB, 0xD840, 0x91EC, 0xD7F7, + 0x91ED, 0xB3AA, 0x91EE, 0xD843, 0x91F1, 0xD7F9, 0x91F3, 0xD7FA, + 0x91F4, 0xD7F8, 0x91F5, 0xB3A6, 0x91F7, 0xD841, 0x91F8, 0xD7FB, + 0x91F9, 0xD7FD, 0x91FD, 0xDC6D, 0x91FF, 0xDC6C, 0x9200, 0xDC6A, + 0x9201, 0xDC62, 0x9202, 0xDC71, 0x9203, 0xDC65, 0x9204, 0xDC6F, + 0x9205, 0xDC76, 0x9206, 0xDC6E, 0x9207, 0xB679, 0x9209, 0xB675, + 0x920A, 0xDC63, 0x920C, 0xDC69, 0x920D, 0xB677, 0x920F, 0xDC68, + 0x9210, 0xB678, 0x9211, 0xB67A, 0x9212, 0xDC6B, 0x9214, 0xB672, + 0x9215, 0xB673, 0x9216, 0xDC77, 0x9217, 0xDC75, 0x9219, 0xDC74, + 0x921A, 0xDC66, 0x921C, 0xDC72, 0x921E, 0xB676, 0x9223, 0xB674, + 0x9224, 0xDC73, 0x9225, 0xDC64, 0x9226, 0xDC67, 0x9227, 0xDC70, + 0x922D, 0xE4BA, 0x922E, 0xE0B7, 0x9230, 0xE0B0, 0x9231, 0xE0C3, + 0x9232, 0xE0CC, 0x9233, 0xE0B3, 0x9234, 0xB961, 0x9236, 0xE0C0, + 0x9237, 0xB957, 0x9238, 0xB959, 0x9239, 0xB965, 0x923A, 0xE0B1, + 0x923D, 0xB95A, 0x923E, 0xB95C, 0x923F, 0xB966, 0x9240, 0xB95B, + 0x9245, 0xB964, 0x9246, 0xE0B9, 0x9248, 0xE0AE, 0x9249, 0xB962, + 0x924A, 0xE0B8, 0x924B, 0xB95E, 0x924C, 0xE0CA, 0x924D, 0xB963, + 0x924E, 0xE0C8, 0x924F, 0xE0BC, 0x9250, 0xE0C6, 0x9251, 0xB960, + 0x9252, 0xE0AF, 0x9253, 0xE0C9, 0x9254, 0xE0C4, 0x9256, 0xE0CB, + 0x9257, 0xB958, 0x925A, 0xB967, 0x925B, 0xB95D, 0x925E, 0xE0B5, + 0x9260, 0xE0BD, 0x9261, 0xE0C1, 0x9263, 0xE0C5, 0x9264, 0xB95F, + 0x9265, 0xE0B4, 0x9266, 0xE0B2, 0x9267, 0xE0BE, 0x926C, 0xE0BB, + 0x926D, 0xE0BA, 0x926F, 0xE0BF, 0x9270, 0xE0C2, 0x9272, 0xE0C7, + 0x9276, 0xE478, 0x9278, 0xBBC7, 0x9279, 0xE4A4, 0x927A, 0xE47A, + 0x927B, 0xBBCC, 0x927C, 0xBBD0, 0x927D, 0xE4AD, 0x927E, 0xE4B5, + 0x927F, 0xE4A6, 0x9280, 0xBBC8, 0x9282, 0xE4AA, 0x9283, 0xE0B6, + 0x9285, 0xBBC9, 0x9286, 0xE4B1, 0x9287, 0xE4B6, 0x9288, 0xE4AE, + 0x928A, 0xE4B0, 0x928B, 0xE4B9, 0x928C, 0xE4B2, 0x928D, 0xE47E, + 0x928E, 0xE4A9, 0x9291, 0xBBD1, 0x9293, 0xBBCD, 0x9294, 0xE47C, + 0x9295, 0xE4AB, 0x9296, 0xBBCB, 0x9297, 0xE4A5, 0x9298, 0xBBCA, + 0x9299, 0xE4B3, 0x929A, 0xE4A2, 0x929B, 0xE479, 0x929C, 0xBBCE, + 0x929D, 0xE4B8, 0x92A0, 0xE47B, 0x92A1, 0xE4AF, 0x92A2, 0xE4AC, + 0x92A3, 0xE4A7, 0x92A4, 0xE477, 0x92A5, 0xE476, 0x92A6, 0xE4A1, + 0x92A7, 0xE4B4, 0x92A8, 0xBBCF, 0x92A9, 0xE4B7, 0x92AA, 0xE47D, + 0x92AB, 0xE4A3, 0x92AC, 0xBE52, 0x92B2, 0xBE5A, 0x92B3, 0xBE55, + 0x92B4, 0xE8A4, 0x92B5, 0xE8A1, 0x92B6, 0xE867, 0x92B7, 0xBE50, + 0x92B9, 0xF9D7, 0x92BB, 0xBE4F, 0x92BC, 0xBE56, 0x92C0, 0xE865, + 0x92C1, 0xBE54, 0x92C2, 0xE871, 0x92C3, 0xE863, 0x92C4, 0xE864, + 0x92C5, 0xBE4E, 0x92C6, 0xE8A3, 0x92C7, 0xBE58, 0x92C8, 0xE874, + 0x92C9, 0xE879, 0x92CA, 0xE873, 0x92CB, 0xEBEE, 0x92CC, 0xE86F, + 0x92CD, 0xE877, 0x92CE, 0xE875, 0x92CF, 0xE868, 0x92D0, 0xE862, + 0x92D1, 0xE87D, 0x92D2, 0xBE57, 0x92D3, 0xE87E, 0x92D5, 0xE878, + 0x92D7, 0xE86D, 0x92D8, 0xE86B, 0x92D9, 0xE866, 0x92DD, 0xE86E, + 0x92DE, 0xE87B, 0x92DF, 0xE86A, 0x92E0, 0xE87A, 0x92E1, 0xE8A2, + 0x92E4, 0xBE53, 0x92E6, 0xE876, 0x92E7, 0xE87C, 0x92E8, 0xE872, + 0x92E9, 0xE86C, 0x92EA, 0xBE51, 0x92EE, 0xE4A8, 0x92EF, 0xE870, + 0x92F0, 0xBE59, 0x92F1, 0xE869, 0x92F7, 0xEBF4, 0x92F8, 0xBFF7, + 0x92F9, 0xEBF3, 0x92FA, 0xEBF0, 0x92FB, 0xEC44, 0x92FC, 0xBFFB, + 0x92FE, 0xEC41, 0x92FF, 0xEBF8, 0x9300, 0xEC43, 0x9301, 0xEBE9, + 0x9302, 0xEBF6, 0x9304, 0xBFFD, 0x9306, 0xEBE1, 0x9308, 0xEBDF, + 0x9309, 0xEC42, 0x930B, 0xEC40, 0x930C, 0xEBFE, 0x930D, 0xEBED, + 0x930E, 0xEBEC, 0x930F, 0xEBE2, 0x9310, 0xC040, 0x9312, 0xEBE8, + 0x9313, 0xEBF2, 0x9314, 0xEBFD, 0x9315, 0xC043, 0x9316, 0xEC45, + 0x9318, 0xC1E8, 0x9319, 0xC045, 0x931A, 0xBFFE, 0x931B, 0xEBE6, + 0x931D, 0xEBEF, 0x931E, 0xEBDE, 0x931F, 0xEBE0, 0x9320, 0xBFF5, + 0x9321, 0xC042, 0x9322, 0xBFFA, 0x9323, 0xEBE7, 0x9324, 0xEBF7, + 0x9325, 0xEBF1, 0x9326, 0xC041, 0x9327, 0xEBDD, 0x9328, 0xC1E3, + 0x9329, 0xEBF9, 0x932A, 0xEBFC, 0x932B, 0xBFFC, 0x932D, 0xEBEB, + 0x932E, 0xC044, 0x932F, 0xBFF9, 0x9333, 0xBFF8, 0x9334, 0xEBF5, + 0x9335, 0xEBFB, 0x9336, 0xBFF6, 0x9338, 0xEBE4, 0x9339, 0xEBFA, + 0x933C, 0xEBE5, 0x9346, 0xEBEA, 0x9347, 0xEED2, 0x9349, 0xEED7, + 0x934A, 0xC1E5, 0x934B, 0xC1E7, 0x934C, 0xEEDD, 0x934D, 0xC1E1, + 0x934E, 0xEEEC, 0x934F, 0xEEE3, 0x9350, 0xEED8, 0x9351, 0xEED9, + 0x9352, 0xEEE2, 0x9354, 0xC1EE, 0x9355, 0xEEE1, 0x9356, 0xEED1, + 0x9357, 0xEEE0, 0x9358, 0xEED4, 0x9359, 0xEEED, 0x935A, 0xC1ED, + 0x935B, 0xC1EB, 0x935C, 0xEED5, 0x935E, 0xEEE8, 0x9360, 0xEEDA, + 0x9361, 0xEEE7, 0x9363, 0xEEE9, 0x9364, 0xEED0, 0x9365, 0xC1E6, + 0x9367, 0xEEEA, 0x936A, 0xEEDE, 0x936C, 0xC1EA, 0x936D, 0xEEDB, + 0x9370, 0xC1EC, 0x9371, 0xEEE4, 0x9375, 0xC1E4, 0x9376, 0xEED6, + 0x9377, 0xEEE5, 0x9379, 0xEEDF, 0x937A, 0xEBE3, 0x937B, 0xEEE6, + 0x937C, 0xEED3, 0x937E, 0xC1E9, 0x9380, 0xEEEB, 0x9382, 0xC1E2, + 0x9383, 0xEECE, 0x9388, 0xF160, 0x9389, 0xF159, 0x938A, 0xC2E9, + 0x938C, 0xF154, 0x938D, 0xF163, 0x938E, 0xF15B, 0x938F, 0xEEDC, + 0x9391, 0xF165, 0x9392, 0xF155, 0x9394, 0xC2E8, 0x9395, 0xF15F, + 0x9396, 0xC2EA, 0x9397, 0xC2F2, 0x9398, 0xC2F0, 0x9399, 0xF161, + 0x939A, 0xC2F1, 0x939B, 0xF157, 0x939D, 0xF158, 0x939E, 0xF15D, + 0x939F, 0xF162, 0x93A1, 0xEECD, 0x93A2, 0xC2EB, 0x93A3, 0xF16A, + 0x93A4, 0xF167, 0x93A5, 0xF16B, 0x93A6, 0xF15E, 0x93A7, 0xF15A, + 0x93A8, 0xF168, 0x93A9, 0xF36A, 0x93AA, 0xF15C, 0x93AC, 0xC2EE, + 0x93AE, 0xC2ED, 0x93AF, 0xEECF, 0x93B0, 0xC2EF, 0x93B1, 0xF164, + 0x93B2, 0xF166, 0x93B3, 0xC2EC, 0x93B4, 0xF169, 0x93B5, 0xF153, + 0x93B7, 0xF156, 0x93C0, 0xF373, 0x93C2, 0xF363, 0x93C3, 0xC3EB, + 0x93C4, 0xF371, 0x93C7, 0xF361, 0x93C8, 0xC3EC, 0x93CA, 0xF36C, + 0x93CC, 0xF368, 0x93CD, 0xC3F1, 0x93CE, 0xF372, 0x93CF, 0xF362, + 0x93D0, 0xF365, 0x93D1, 0xC3E9, 0x93D2, 0xF374, 0x93D4, 0xF36D, + 0x93D5, 0xF370, 0x93D6, 0xC3EF, 0x93D7, 0xC3F4, 0x93D8, 0xC3F2, + 0x93D9, 0xF369, 0x93DA, 0xF364, 0x93DC, 0xC3ED, 0x93DD, 0xC3EE, + 0x93DE, 0xF360, 0x93DF, 0xC3EA, 0x93E1, 0xC3E8, 0x93E2, 0xC3F0, + 0x93E3, 0xF36F, 0x93E4, 0xC3F3, 0x93E6, 0xF36B, 0x93E7, 0xF375, + 0x93E8, 0xC3F5, 0x93EC, 0xF367, 0x93EE, 0xF36E, 0x93F5, 0xF4F3, + 0x93F6, 0xF542, 0x93F7, 0xF4F5, 0x93F8, 0xF4FC, 0x93F9, 0xF366, + 0x93FA, 0xF4FA, 0x93FB, 0xF4E9, 0x93FC, 0xF540, 0x93FD, 0xC4C3, + 0x93FE, 0xF4ED, 0x93FF, 0xF4FE, 0x9400, 0xF4F4, 0x9403, 0xC4C2, + 0x9406, 0xF544, 0x9407, 0xF4F6, 0x9409, 0xF4FB, 0x940A, 0xF4FD, + 0x940B, 0xF4E7, 0x940C, 0xF541, 0x940D, 0xF4F2, 0x940E, 0xF4F7, + 0x940F, 0xF4EB, 0x9410, 0xF4EF, 0x9411, 0xF543, 0x9412, 0xF4F9, + 0x9413, 0xF4E8, 0x9414, 0xF4EC, 0x9415, 0xF4EE, 0x9416, 0xF4F8, + 0x9418, 0xC4C1, 0x9419, 0xF4F1, 0x9420, 0xF4EA, 0x9428, 0xF4F0, + 0x9429, 0xF661, 0x942A, 0xF666, 0x942B, 0xC54F, 0x942C, 0xF668, + 0x942E, 0xC549, 0x9430, 0xF664, 0x9431, 0xF66A, 0x9432, 0xC54E, + 0x9433, 0xC54A, 0x9435, 0xC54B, 0x9436, 0xF660, 0x9437, 0xF667, + 0x9438, 0xC54D, 0x9439, 0xF665, 0x943A, 0xC54C, 0x943B, 0xF65F, + 0x943C, 0xF663, 0x943D, 0xF662, 0x943F, 0xF65E, 0x9440, 0xF669, + 0x9444, 0xC5B1, 0x9445, 0xF76D, 0x9446, 0xF770, 0x9447, 0xF76C, + 0x9448, 0xF76E, 0x9449, 0xF76F, 0x944A, 0xF769, 0x944B, 0xF76A, + 0x944C, 0xF767, 0x944F, 0xF76B, 0x9450, 0xF768, 0x9451, 0xC5B2, + 0x9452, 0xC5B3, 0x9455, 0xF84B, 0x9457, 0xF84D, 0x945D, 0xF84C, + 0x945E, 0xF84E, 0x9460, 0xC5E0, 0x9462, 0xF84A, 0x9463, 0xC5DF, + 0x9464, 0xC5E1, 0x9468, 0xF8CB, 0x9469, 0xF8CC, 0x946A, 0xC644, + 0x946B, 0xF8CA, 0x946D, 0xF953, 0x946E, 0xF952, 0x946F, 0xF954, + 0x9470, 0xC65F, 0x9471, 0xF955, 0x9472, 0xC65E, 0x9473, 0xF956, + 0x9474, 0xF972, 0x9475, 0xF975, 0x9476, 0xF974, 0x9477, 0xC668, + 0x9478, 0xF973, 0x947C, 0xC672, 0x947D, 0xC670, 0x947E, 0xC671, + 0x947F, 0xC677, 0x9480, 0xF9C0, 0x9481, 0xF9C1, 0x9482, 0xF9BF, + 0x9483, 0xF9C9, 0x9577, 0xAAF8, 0x957A, 0xD844, 0x957B, 0xDC78, + 0x957C, 0xE8A5, 0x957D, 0xF376, 0x9580, 0xAAF9, 0x9582, 0xADAC, + 0x9583, 0xB07B, 0x9586, 0xD845, 0x9588, 0xD846, 0x9589, 0xB3AC, + 0x958B, 0xB67D, 0x958C, 0xDC7A, 0x958D, 0xDC79, 0x958E, 0xB6A3, + 0x958F, 0xB67C, 0x9590, 0xDC7B, 0x9591, 0xB67E, 0x9592, 0xB6A2, + 0x9593, 0xB6A1, 0x9594, 0xB67B, 0x9598, 0xB968, 0x959B, 0xE0D0, + 0x959C, 0xE0CE, 0x959E, 0xE0CF, 0x959F, 0xE0CD, 0x95A1, 0xBBD2, + 0x95A3, 0xBBD5, 0x95A4, 0xBBD7, 0x95A5, 0xBBD6, 0x95A8, 0xBBD3, + 0x95A9, 0xBBD4, 0x95AB, 0xE8A7, 0x95AC, 0xE8A6, 0x95AD, 0xBE5B, + 0x95AE, 0xE8A8, 0x95B0, 0xE8A9, 0x95B1, 0xBE5C, 0x95B5, 0xEC4D, + 0x95B6, 0xEC4B, 0x95B7, 0xEEF3, 0x95B9, 0xEC49, 0x95BA, 0xEC4A, + 0x95BB, 0xC046, 0x95BC, 0xEC46, 0x95BD, 0xEC4E, 0x95BE, 0xEC48, + 0x95BF, 0xEC4C, 0x95C0, 0xEEEF, 0x95C3, 0xEEF1, 0x95C5, 0xEEF2, + 0x95C6, 0xC1F3, 0x95C7, 0xEEEE, 0x95C8, 0xC1F2, 0x95C9, 0xEEF0, + 0x95CA, 0xC1EF, 0x95CB, 0xC1F0, 0x95CC, 0xC1F1, 0x95CD, 0xEC47, + 0x95D0, 0xC2F5, 0x95D1, 0xF16E, 0x95D2, 0xF16C, 0x95D3, 0xF16D, + 0x95D4, 0xC2F3, 0x95D5, 0xC2F6, 0x95D6, 0xC2F4, 0x95DA, 0xF377, + 0x95DB, 0xF378, 0x95DC, 0xC3F6, 0x95DE, 0xF545, 0x95DF, 0xF547, + 0x95E0, 0xF546, 0x95E1, 0xC4C4, 0x95E2, 0xC550, 0x95E3, 0xF66D, + 0x95E4, 0xF66C, 0x95E5, 0xF66B, 0x961C, 0xAAFA, 0x961E, 0xC9AA, + 0x9620, 0xCA58, 0x9621, 0xA6E9, 0x9622, 0xCA56, 0x9623, 0xCA59, + 0x9624, 0xCA57, 0x9628, 0xCBAE, 0x962A, 0xA8C1, 0x962C, 0xA8C2, + 0x962D, 0xCBB0, 0x962E, 0xA8BF, 0x962F, 0xCBAF, 0x9630, 0xCBAD, + 0x9631, 0xA8C0, 0x9632, 0xA8BE, 0x9639, 0xCDD8, 0x963A, 0xCDDB, + 0x963B, 0xAAFD, 0x963C, 0xCDDA, 0x963D, 0xCDD9, 0x963F, 0xAAFC, + 0x9640, 0xAAFB, 0x9642, 0xAB40, 0x9643, 0xCDDC, 0x9644, 0xAAFE, + 0x964A, 0xD0C6, 0x964B, 0xADAE, 0x964C, 0xADAF, 0x964D, 0xADB0, + 0x964E, 0xD0C7, 0x964F, 0xD0C3, 0x9650, 0xADAD, 0x9651, 0xD0C4, + 0x9653, 0xD0C5, 0x9654, 0xD0C2, 0x9658, 0xB0A4, 0x965B, 0xB0A1, + 0x965C, 0xD445, 0x965D, 0xB0A2, 0x965E, 0xB0A5, 0x965F, 0xD446, + 0x9661, 0xB07E, 0x9662, 0xB07C, 0x9663, 0xB07D, 0x9664, 0xB0A3, + 0x966A, 0xB3AD, 0x966B, 0xD849, 0x966C, 0xB3B5, 0x966D, 0xD848, + 0x966F, 0xD84B, 0x9670, 0xB3B1, 0x9671, 0xD84A, 0x9672, 0xB6AB, + 0x9673, 0xB3AF, 0x9674, 0xB3B2, 0x9675, 0xB3AE, 0x9676, 0xB3B3, + 0x9677, 0xB3B4, 0x9678, 0xB3B0, 0x967C, 0xD847, 0x967D, 0xB6A7, + 0x967E, 0xDC7D, 0x9680, 0xDCA3, 0x9683, 0xDCA2, 0x9684, 0xB6AC, + 0x9685, 0xB6A8, 0x9686, 0xB6A9, 0x9687, 0xDC7C, 0x9688, 0xDC7E, + 0x9689, 0xDCA1, 0x968A, 0xB6A4, 0x968B, 0xB6A6, 0x968D, 0xB6AA, + 0x968E, 0xB6A5, 0x9691, 0xE0D3, 0x9692, 0xE0D1, 0x9693, 0xE0D2, + 0x9694, 0xB96A, 0x9695, 0xB96B, 0x9697, 0xE0D4, 0x9698, 0xB969, + 0x9699, 0xBBD8, 0x969B, 0xBBDA, 0x969C, 0xBBD9, 0x969E, 0xE4BB, + 0x96A1, 0xE4BC, 0x96A2, 0xE8AB, 0x96A4, 0xE8AA, 0x96A7, 0xC047, + 0x96A8, 0xC048, 0x96A9, 0xEC4F, 0x96AA, 0xC049, 0x96AC, 0xEEF6, + 0x96AE, 0xEEF4, 0x96B0, 0xEEF5, 0x96B1, 0xC1F4, 0x96B3, 0xF16F, + 0x96B4, 0xC3F7, 0x96B8, 0xC1F5, 0x96B9, 0xAB41, 0x96BB, 0xB0A6, + 0x96BC, 0xD447, 0x96BF, 0xD84C, 0x96C0, 0xB3B6, 0x96C1, 0xB6AD, + 0x96C2, 0xDCA4, 0x96C3, 0xDCA6, 0x96C4, 0xB6AF, 0x96C5, 0xB6AE, + 0x96C6, 0xB6B0, 0x96C7, 0xB6B1, 0x96C8, 0xDCA5, 0x96C9, 0xB96E, + 0x96CA, 0xB96F, 0x96CB, 0xB96D, 0x96CC, 0xBBDB, 0x96CD, 0xB96C, + 0x96CE, 0xE0D5, 0x96D2, 0xBBDC, 0x96D3, 0xE8AC, 0x96D4, 0xEC50, + 0x96D5, 0xC04A, 0x96D6, 0xC1F6, 0x96D7, 0xF170, 0x96D8, 0xF174, + 0x96D9, 0xC2F9, 0x96DA, 0xF171, 0x96DB, 0xC2FA, 0x96DC, 0xC2F8, + 0x96DD, 0xF175, 0x96DE, 0xC2FB, 0x96DF, 0xF173, 0x96E1, 0xF379, + 0x96E2, 0xC2F7, 0x96E3, 0xC3F8, 0x96E5, 0xF8CD, 0x96E8, 0xAB42, + 0x96E9, 0xB3B8, 0x96EA, 0xB3B7, 0x96EF, 0xB6B2, 0x96F0, 0xDCA8, + 0x96F1, 0xDCA7, 0x96F2, 0xB6B3, 0x96F5, 0xE0D9, 0x96F6, 0xB973, + 0x96F7, 0xB970, 0x96F8, 0xE0D8, 0x96F9, 0xB972, 0x96FA, 0xE0D6, + 0x96FB, 0xB971, 0x96FD, 0xE0D7, 0x96FF, 0xE4BD, 0x9700, 0xBBDD, + 0x9702, 0xE8AF, 0x9704, 0xBE5D, 0x9705, 0xE8AD, 0x9706, 0xBE5E, + 0x9707, 0xBE5F, 0x9708, 0xE8AE, 0x9709, 0xBE60, 0x970B, 0xEC51, + 0x970D, 0xC04E, 0x970E, 0xC04B, 0x970F, 0xC050, 0x9710, 0xEC53, + 0x9711, 0xC04C, 0x9712, 0xEC52, 0x9713, 0xC04F, 0x9716, 0xC04D, + 0x9718, 0xEEF9, 0x9719, 0xEEFB, 0x971C, 0xC1F7, 0x971D, 0xEEFA, + 0x971E, 0xC1F8, 0x971F, 0xEEF8, 0x9720, 0xEEF7, 0x9722, 0xF177, + 0x9723, 0xF176, 0x9724, 0xC2FC, 0x9725, 0xF178, 0x9726, 0xF37E, + 0x9727, 0xC3FA, 0x9728, 0xF37D, 0x9729, 0xF37A, 0x972A, 0xC3F9, + 0x972B, 0xF37B, 0x972C, 0xF37C, 0x972E, 0xF548, 0x972F, 0xF549, + 0x9730, 0xC4C5, 0x9732, 0xC553, 0x9735, 0xF66E, 0x9738, 0xC551, + 0x9739, 0xC552, 0x973A, 0xF66F, 0x973D, 0xC5B4, 0x973E, 0xC5B5, + 0x973F, 0xF771, 0x9742, 0xC645, 0x9743, 0xF8CF, 0x9744, 0xC647, + 0x9746, 0xF8CE, 0x9747, 0xF8D0, 0x9748, 0xC646, 0x9749, 0xF957, + 0x974B, 0xF9AD, 0x9752, 0xAB43, 0x9756, 0xB974, 0x9758, 0xE4BE, + 0x975A, 0xE8B0, 0x975B, 0xC051, 0x975C, 0xC052, 0x975E, 0xAB44, + 0x9760, 0xBE61, 0x9761, 0xC3FB, 0x9762, 0xADB1, 0x9766, 0xC053, + 0x9768, 0xC5E2, 0x9769, 0xADB2, 0x976A, 0xD84D, 0x976C, 0xDCA9, + 0x976E, 0xDCAB, 0x9770, 0xDCAA, 0x9772, 0xE0DD, 0x9773, 0xE0DA, + 0x9774, 0xB975, 0x9776, 0xB976, 0x9777, 0xE0DB, 0x9778, 0xE0DC, + 0x977A, 0xE4C0, 0x977B, 0xE4C5, 0x977C, 0xBBDE, 0x977D, 0xE4BF, + 0x977E, 0xE4C1, 0x977F, 0xE4C8, 0x9780, 0xE4C3, 0x9781, 0xE4C7, + 0x9782, 0xE4C4, 0x9783, 0xE4C2, 0x9784, 0xE4C6, 0x9785, 0xBBDF, + 0x9788, 0xE8B3, 0x978A, 0xE8B1, 0x978B, 0xBE63, 0x978D, 0xBE62, + 0x978E, 0xE8B2, 0x978F, 0xBE64, 0x9794, 0xEC56, 0x9797, 0xEC55, + 0x9798, 0xC054, 0x9799, 0xEC54, 0x979A, 0xEEFC, 0x979C, 0xEEFE, + 0x979D, 0xEF41, 0x979E, 0xEF40, 0x97A0, 0xC1F9, 0x97A1, 0xEEFD, + 0x97A2, 0xF1A1, 0x97A3, 0xC2FD, 0x97A4, 0xF17D, 0x97A5, 0xF1A2, + 0x97A6, 0xC2FE, 0x97A8, 0xF17B, 0x97AA, 0xF17E, 0x97AB, 0xF17C, + 0x97AC, 0xF179, 0x97AD, 0xC340, 0x97AE, 0xF17A, 0x97B3, 0xF3A1, + 0x97B6, 0xF3A3, 0x97B7, 0xF3A2, 0x97B9, 0xF54A, 0x97BB, 0xF54B, + 0x97BF, 0xF670, 0x97C1, 0xC5B7, 0x97C3, 0xC5B6, 0x97C4, 0xF84F, + 0x97C5, 0xF850, 0x97C6, 0xC648, 0x97C7, 0xF8D1, 0x97C9, 0xC669, + 0x97CB, 0xADB3, 0x97CC, 0xB6B4, 0x97CD, 0xE4CA, 0x97CE, 0xE4C9, + 0x97CF, 0xE8B5, 0x97D0, 0xE8B4, 0x97D3, 0xC1FA, 0x97D4, 0xEF43, + 0x97D5, 0xEF42, 0x97D6, 0xF1A5, 0x97D7, 0xF1A3, 0x97D8, 0xF1A6, + 0x97D9, 0xF1A4, 0x97DC, 0xC3FC, 0x97DD, 0xF3A4, 0x97DE, 0xF3A5, + 0x97DF, 0xF3A6, 0x97E1, 0xF671, 0x97E3, 0xF772, 0x97E5, 0xF8D2, + 0x97ED, 0xADB4, 0x97F0, 0xEC57, 0x97F1, 0xEF44, 0x97F3, 0xADB5, + 0x97F6, 0xBBE0, 0x97F8, 0xEC58, 0x97F9, 0xC341, 0x97FA, 0xF1A7, + 0x97FB, 0xC3FD, 0x97FD, 0xF54C, 0x97FE, 0xF54D, 0x97FF, 0xC554, + 0x9800, 0xF851, 0x9801, 0xADB6, 0x9802, 0xB3BB, 0x9803, 0xB3BC, + 0x9804, 0xD84E, 0x9805, 0xB6B5, 0x9806, 0xB6B6, 0x9807, 0xDCAC, + 0x9808, 0xB6B7, 0x980A, 0xB97A, 0x980C, 0xB97C, 0x980D, 0xE0DF, + 0x980E, 0xE0E0, 0x980F, 0xE0DE, 0x9810, 0xB977, 0x9811, 0xB978, + 0x9812, 0xB97B, 0x9813, 0xB979, 0x9816, 0xE4CB, 0x9817, 0xBBE1, + 0x9818, 0xBBE2, 0x981B, 0xE8BC, 0x981C, 0xBE67, 0x981D, 0xE8B7, + 0x981E, 0xE8B6, 0x9820, 0xE8BB, 0x9821, 0xBE65, 0x9824, 0xC05B, + 0x9826, 0xE8B8, 0x9827, 0xE8BD, 0x9828, 0xE8BA, 0x9829, 0xE8B9, + 0x982B, 0xBE66, 0x982D, 0xC059, 0x982F, 0xEC5A, 0x9830, 0xC055, + 0x9832, 0xEC5B, 0x9835, 0xEC59, 0x9837, 0xC058, 0x9838, 0xC056, + 0x9839, 0xC05A, 0x983B, 0xC057, 0x9841, 0xEF45, 0x9843, 0xEF4A, + 0x9844, 0xEF46, 0x9845, 0xEF49, 0x9846, 0xC1FB, 0x9848, 0xEDD4, + 0x9849, 0xEF48, 0x984A, 0xEF47, 0x984C, 0xC344, 0x984D, 0xC342, + 0x984E, 0xC345, 0x984F, 0xC343, 0x9850, 0xF1A8, 0x9851, 0xF1A9, + 0x9852, 0xF1AA, 0x9853, 0xC346, 0x9857, 0xF3AA, 0x9858, 0xC440, + 0x9859, 0xF3A8, 0x985B, 0xC441, 0x985C, 0xF3A7, 0x985D, 0xF3A9, + 0x985E, 0xC3FE, 0x985F, 0xF551, 0x9860, 0xF54E, 0x9862, 0xF54F, + 0x9863, 0xF550, 0x9864, 0xF672, 0x9865, 0xC556, 0x9867, 0xC555, + 0x9869, 0xF774, 0x986A, 0xF773, 0x986B, 0xC5B8, 0x986F, 0xC5E3, + 0x9870, 0xC649, 0x9871, 0xC660, 0x9872, 0xF958, 0x9873, 0xF9AE, + 0x9874, 0xF9AF, 0x98A8, 0xADB7, 0x98A9, 0xDCAD, 0x98AC, 0xE0E1, + 0x98AD, 0xE4CC, 0x98AE, 0xE4CD, 0x98AF, 0xBBE3, 0x98B1, 0xBBE4, + 0x98B2, 0xE8BE, 0x98B3, 0xBE68, 0x98B6, 0xC1FC, 0x98B8, 0xF1AB, + 0x98BA, 0xC347, 0x98BB, 0xF3AD, 0x98BC, 0xC442, 0x98BD, 0xF3AC, + 0x98BE, 0xF3AE, 0x98BF, 0xF3AB, 0x98C0, 0xF675, 0x98C1, 0xF552, + 0x98C2, 0xF553, 0x98C4, 0xC4C6, 0x98C6, 0xF674, 0x98C9, 0xF673, + 0x98CB, 0xF775, 0x98CC, 0xF9B0, 0x98DB, 0xADB8, 0x98DF, 0xADB9, + 0x98E2, 0xB0A7, 0x98E3, 0xD448, 0x98E5, 0xD84F, 0x98E7, 0xB6B8, + 0x98E9, 0xB6BB, 0x98EA, 0xB6B9, 0x98EB, 0xDCAE, 0x98ED, 0xB6BD, + 0x98EF, 0xB6BA, 0x98F2, 0xB6BC, 0x98F4, 0xB97E, 0x98F6, 0xE0E2, + 0x98F9, 0xE0E3, 0x98FA, 0xE8C0, 0x98FC, 0xB97D, 0x98FD, 0xB9A1, + 0x98FE, 0xB9A2, 0x9900, 0xE4CF, 0x9902, 0xE4CE, 0x9903, 0xBBE5, + 0x9905, 0xBBE6, 0x9907, 0xE4D0, 0x9908, 0xE8BF, 0x9909, 0xBBE8, + 0x990A, 0xBE69, 0x990C, 0xBBE7, 0x9910, 0xC05C, 0x9911, 0xE8C1, + 0x9912, 0xBE6B, 0x9913, 0xBE6A, 0x9914, 0xE8C2, 0x9915, 0xE8C5, + 0x9916, 0xE8C3, 0x9917, 0xE8C4, 0x9918, 0xBE6C, 0x991A, 0xC061, + 0x991B, 0xC05F, 0x991E, 0xC05E, 0x991F, 0xEC5D, 0x9921, 0xC060, + 0x9924, 0xEC5C, 0x9925, 0xEF4B, 0x9927, 0xEC5E, 0x9928, 0xC05D, + 0x9929, 0xEC5F, 0x992A, 0xEF4E, 0x992B, 0xEF4C, 0x992C, 0xEF4D, + 0x992D, 0xEF52, 0x992E, 0xC34B, 0x992F, 0xEF51, 0x9930, 0xEF54, + 0x9931, 0xEF53, 0x9932, 0xEF50, 0x9933, 0xEF4F, 0x9935, 0xC1FD, + 0x993A, 0xF1AE, 0x993C, 0xF1AD, 0x993D, 0xC34A, 0x993E, 0xC348, + 0x993F, 0xC349, 0x9941, 0xF1AC, 0x9943, 0xF3B1, 0x9945, 0xC443, + 0x9947, 0xF3B0, 0x9948, 0xF3AF, 0x9949, 0xC444, 0x994B, 0xF558, + 0x994C, 0xF557, 0x994E, 0xF555, 0x9950, 0xF554, 0x9951, 0xC4C8, + 0x9952, 0xC4C7, 0x9953, 0xF559, 0x9954, 0xF776, 0x9955, 0xC5B9, + 0x9956, 0xF677, 0x9957, 0xC557, 0x9958, 0xF676, 0x9959, 0xF556, + 0x995B, 0xF777, 0x995C, 0xC5E4, 0x995E, 0xC661, 0x995F, 0xF959, + 0x9961, 0xF9B1, 0x9996, 0xADBA, 0x9997, 0xD850, 0x9998, 0xEF55, + 0x9999, 0xADBB, 0x999C, 0xE4D2, 0x999D, 0xE4D1, 0x999E, 0xEC60, + 0x99A1, 0xEF57, 0x99A3, 0xEF56, 0x99A5, 0xC34C, 0x99A6, 0xF3B2, + 0x99A7, 0xF3B3, 0x99A8, 0xC4C9, 0x99AB, 0xF9B2, 0x99AC, 0xB0A8, + 0x99AD, 0xB6BF, 0x99AE, 0xB6BE, 0x99AF, 0xE0E4, 0x99B0, 0xE0E6, + 0x99B1, 0xB9A4, 0x99B2, 0xE0E5, 0x99B3, 0xB9A3, 0x99B4, 0xB9A5, + 0x99B5, 0xE0E7, 0x99B9, 0xE4D4, 0x99BA, 0xE4D6, 0x99BB, 0xE4D5, + 0x99BD, 0xE4D8, 0x99C1, 0xBBE9, 0x99C2, 0xE4D7, 0x99C3, 0xE4D3, + 0x99C7, 0xE4D9, 0x99C9, 0xE8CC, 0x99CB, 0xE8CF, 0x99CC, 0xE8D1, + 0x99CD, 0xE8C7, 0x99CE, 0xE8CB, 0x99CF, 0xE8C8, 0x99D0, 0xBE6E, + 0x99D1, 0xBE71, 0x99D2, 0xBE73, 0x99D3, 0xE8C9, 0x99D4, 0xE8CA, + 0x99D5, 0xBE72, 0x99D6, 0xE8CD, 0x99D7, 0xE8D0, 0x99D8, 0xE8CE, + 0x99D9, 0xBE74, 0x99DB, 0xBE70, 0x99DC, 0xE8C6, 0x99DD, 0xBE6D, + 0x99DF, 0xBE6F, 0x99E2, 0xC063, 0x99E3, 0xEC66, 0x99E4, 0xEC64, + 0x99E5, 0xEC63, 0x99E7, 0xEC69, 0x99E9, 0xEC68, 0x99EA, 0xEC67, + 0x99EC, 0xEC62, 0x99ED, 0xC062, 0x99EE, 0xEC61, 0x99F0, 0xEC65, + 0x99F1, 0xC064, 0x99F4, 0xEF5A, 0x99F6, 0xEF5E, 0x99F7, 0xEF5B, + 0x99F8, 0xEF5D, 0x99F9, 0xEF5C, 0x99FA, 0xEF59, 0x99FB, 0xEF5F, + 0x99FC, 0xEF62, 0x99FD, 0xEF60, 0x99FE, 0xEF61, 0x99FF, 0xC240, + 0x9A01, 0xC1FE, 0x9A02, 0xEF58, 0x9A03, 0xEF63, 0x9A04, 0xF1B3, + 0x9A05, 0xF1B6, 0x9A06, 0xF1B8, 0x9A07, 0xF1B7, 0x9A09, 0xF1B1, + 0x9A0A, 0xF1B5, 0x9A0B, 0xF1B0, 0x9A0D, 0xF1B2, 0x9A0E, 0xC34D, + 0x9A0F, 0xF1AF, 0x9A11, 0xF1B4, 0x9A14, 0xF3C0, 0x9A15, 0xF3B5, + 0x9A16, 0xC445, 0x9A19, 0xC446, 0x9A1A, 0xF3B4, 0x9A1B, 0xF3B9, + 0x9A1C, 0xF3BF, 0x9A1D, 0xF3B7, 0x9A1E, 0xF3BE, 0x9A20, 0xF3BB, + 0x9A22, 0xF3BA, 0x9A23, 0xF3BD, 0x9A24, 0xF3B8, 0x9A25, 0xF3B6, + 0x9A27, 0xF3BC, 0x9A29, 0xF560, 0x9A2A, 0xF55E, 0x9A2B, 0xC4CA, + 0x9A2C, 0xF55D, 0x9A2D, 0xF563, 0x9A2E, 0xF561, 0x9A30, 0xC4CB, + 0x9A31, 0xF55C, 0x9A32, 0xF55A, 0x9A34, 0xF55B, 0x9A35, 0xC4CD, + 0x9A36, 0xF55F, 0x9A37, 0xC4CC, 0x9A38, 0xF562, 0x9A39, 0xF678, + 0x9A3A, 0xF67E, 0x9A3D, 0xF679, 0x9A3E, 0xC55B, 0x9A3F, 0xF6A1, + 0x9A40, 0xC55A, 0x9A41, 0xF67D, 0x9A42, 0xF67C, 0x9A43, 0xC559, + 0x9A44, 0xF67B, 0x9A45, 0xC558, 0x9A46, 0xF67A, 0x9A48, 0xF77D, + 0x9A49, 0xF7A1, 0x9A4A, 0xF77E, 0x9A4C, 0xF77B, 0x9A4D, 0xC5BB, + 0x9A4E, 0xF778, 0x9A4F, 0xF77C, 0x9A50, 0xF7A3, 0x9A52, 0xF7A2, + 0x9A53, 0xF779, 0x9A54, 0xF77A, 0x9A55, 0xC5BA, 0x9A56, 0xF852, + 0x9A57, 0xC5E7, 0x9A59, 0xF853, 0x9A5A, 0xC5E5, 0x9A5B, 0xC5E6, + 0x9A5E, 0xF8D3, 0x9A5F, 0xC64A, 0x9A60, 0xF976, 0x9A62, 0xC66A, + 0x9A64, 0xF9B3, 0x9A65, 0xC66B, 0x9A66, 0xF9B4, 0x9A67, 0xF9B5, + 0x9A68, 0xF9C3, 0x9A69, 0xF9C2, 0x9A6A, 0xC67A, 0x9A6B, 0xF9CD, + 0x9AA8, 0xB0A9, 0x9AAB, 0xE0E9, 0x9AAD, 0xE0E8, 0x9AAF, 0xBBEA, + 0x9AB0, 0xBBEB, 0x9AB1, 0xE4DA, 0x9AB3, 0xE8D2, 0x9AB4, 0xEC6C, + 0x9AB7, 0xBE75, 0x9AB8, 0xC065, 0x9AB9, 0xEC6A, 0x9ABB, 0xEC6D, + 0x9ABC, 0xC066, 0x9ABE, 0xEF64, 0x9ABF, 0xEC6B, 0x9AC0, 0xF1B9, + 0x9AC1, 0xC34E, 0x9AC2, 0xF3C1, 0x9AC6, 0xF566, 0x9AC7, 0xF564, + 0x9ACA, 0xF565, 0x9ACD, 0xF6A2, 0x9ACF, 0xC55C, 0x9AD0, 0xF7A4, + 0x9AD1, 0xC5EA, 0x9AD2, 0xC5BC, 0x9AD3, 0xC5E8, 0x9AD4, 0xC5E9, + 0x9AD5, 0xF8D4, 0x9AD6, 0xC662, 0x9AD8, 0xB0AA, 0x9ADC, 0xF1BA, + 0x9ADF, 0xD449, 0x9AE1, 0xB9A6, 0x9AE3, 0xE4DB, 0x9AE6, 0xBBEC, + 0x9AE7, 0xE4DC, 0x9AEB, 0xE8D4, 0x9AEC, 0xE8D3, 0x9AED, 0xC068, + 0x9AEE, 0xBE76, 0x9AEF, 0xBE77, 0x9AF1, 0xE8D7, 0x9AF2, 0xE8D6, + 0x9AF3, 0xE8D5, 0x9AF6, 0xEC6E, 0x9AF7, 0xEC71, 0x9AF9, 0xEC70, + 0x9AFA, 0xEC6F, 0x9AFB, 0xC067, 0x9AFC, 0xEF68, 0x9AFD, 0xEF66, + 0x9AFE, 0xEF65, 0x9B01, 0xEF67, 0x9B03, 0xC34F, 0x9B04, 0xF1BC, + 0x9B05, 0xF1BD, 0x9B06, 0xC350, 0x9B08, 0xF1BB, 0x9B0A, 0xF3C3, + 0x9B0B, 0xF3C2, 0x9B0C, 0xF3C5, 0x9B0D, 0xC447, 0x9B0E, 0xF3C4, + 0x9B10, 0xF567, 0x9B11, 0xF569, 0x9B12, 0xF568, 0x9B15, 0xF6A3, + 0x9B16, 0xF6A6, 0x9B17, 0xF6A4, 0x9B18, 0xF6A5, 0x9B19, 0xF7A5, + 0x9B1A, 0xC5BD, 0x9B1E, 0xF854, 0x9B1F, 0xF855, 0x9B20, 0xF856, + 0x9B22, 0xC64B, 0x9B23, 0xC663, 0x9B24, 0xF9B6, 0x9B25, 0xB0AB, + 0x9B27, 0xBE78, 0x9B28, 0xC069, 0x9B29, 0xF1BE, 0x9B2B, 0xF7A6, + 0x9B2E, 0xF9C4, 0x9B2F, 0xD44A, 0x9B31, 0xC67B, 0x9B32, 0xB0AC, + 0x9B33, 0xEC72, 0x9B35, 0xF1BF, 0x9B37, 0xF3C6, 0x9B3A, 0xF6A7, + 0x9B3B, 0xF7A7, 0x9B3C, 0xB0AD, 0x9B3E, 0xE4DD, 0x9B3F, 0xE4DE, + 0x9B41, 0xBBED, 0x9B42, 0xBBEE, 0x9B43, 0xE8D9, 0x9B44, 0xBE7A, + 0x9B45, 0xBE79, 0x9B46, 0xE8D8, 0x9B48, 0xEF69, 0x9B4A, 0xF1C0, + 0x9B4B, 0xF1C2, 0x9B4C, 0xF1C1, 0x9B4D, 0xC353, 0x9B4E, 0xC352, + 0x9B4F, 0xC351, 0x9B51, 0xC55E, 0x9B52, 0xF6A8, 0x9B54, 0xC55D, + 0x9B55, 0xF7A9, 0x9B56, 0xF7A8, 0x9B58, 0xC64C, 0x9B59, 0xF8D5, + 0x9B5A, 0xB3BD, 0x9B5B, 0xE0EA, 0x9B5F, 0xE4E1, 0x9B60, 0xE4DF, + 0x9B61, 0xE4E0, 0x9B64, 0xE8E2, 0x9B66, 0xE8DD, 0x9B67, 0xE8DA, + 0x9B68, 0xE8E1, 0x9B6C, 0xE8E3, 0x9B6F, 0xBE7C, 0x9B70, 0xE8E0, + 0x9B71, 0xE8DC, 0x9B74, 0xE8DB, 0x9B75, 0xE8DF, 0x9B76, 0xE8DE, + 0x9B77, 0xBE7B, 0x9B7A, 0xEC7D, 0x9B7B, 0xEC78, 0x9B7C, 0xEC76, + 0x9B7D, 0xECA1, 0x9B7E, 0xEC77, 0x9B80, 0xEC73, 0x9B82, 0xEC79, + 0x9B85, 0xEC74, 0x9B86, 0xEF72, 0x9B87, 0xEC75, 0x9B88, 0xECA2, + 0x9B90, 0xEC7C, 0x9B91, 0xC06A, 0x9B92, 0xEC7B, 0x9B93, 0xEC7A, + 0x9B95, 0xEC7E, 0x9B9A, 0xEF6A, 0x9B9B, 0xEF6D, 0x9B9E, 0xEF6C, + 0x9BA0, 0xEF74, 0x9BA1, 0xEF6F, 0x9BA2, 0xEF73, 0x9BA4, 0xEF71, + 0x9BA5, 0xEF70, 0x9BA6, 0xEF6E, 0x9BA8, 0xEF6B, 0x9BAA, 0xC243, + 0x9BAB, 0xC242, 0x9BAD, 0xC244, 0x9BAE, 0xC241, 0x9BAF, 0xEF75, + 0x9BB5, 0xF1C8, 0x9BB6, 0xF1CB, 0x9BB8, 0xF1C9, 0x9BB9, 0xF1CD, + 0x9BBD, 0xF1CE, 0x9BBF, 0xF1C6, 0x9BC0, 0xC358, 0x9BC1, 0xF1C7, + 0x9BC3, 0xF1C5, 0x9BC4, 0xF1CC, 0x9BC6, 0xF1C4, 0x9BC7, 0xF1C3, + 0x9BC8, 0xC357, 0x9BC9, 0xC355, 0x9BCA, 0xC354, 0x9BD3, 0xF1CA, + 0x9BD4, 0xF3CF, 0x9BD5, 0xF3D5, 0x9BD6, 0xC44A, 0x9BD7, 0xF3D0, + 0x9BD9, 0xF3D3, 0x9BDA, 0xF3D7, 0x9BDB, 0xC44B, 0x9BDC, 0xF3D2, + 0x9BDE, 0xF3CA, 0x9BE0, 0xF3C9, 0x9BE1, 0xF3D6, 0x9BE2, 0xF3CD, + 0x9BE4, 0xF3CB, 0x9BE5, 0xF3D4, 0x9BE6, 0xF3CC, 0x9BE7, 0xC449, + 0x9BE8, 0xC448, 0x9BEA, 0xF3C7, 0x9BEB, 0xF3C8, 0x9BEC, 0xF3D1, + 0x9BF0, 0xF3CE, 0x9BF7, 0xF56C, 0x9BF8, 0xF56F, 0x9BFD, 0xC356, + 0x9C05, 0xF56D, 0x9C06, 0xF573, 0x9C07, 0xF571, 0x9C08, 0xF56B, + 0x9C09, 0xF576, 0x9C0B, 0xF56A, 0x9C0D, 0xC4CF, 0x9C0E, 0xF572, + 0x9C12, 0xF56E, 0x9C13, 0xC4CE, 0x9C14, 0xF575, 0x9C17, 0xF574, + 0x9C1C, 0xF6AB, 0x9C1D, 0xF6AA, 0x9C21, 0xF6B1, 0x9C23, 0xF6AD, + 0x9C24, 0xF6B0, 0x9C25, 0xC560, 0x9C28, 0xF6AE, 0x9C29, 0xF6AF, + 0x9C2B, 0xF6A9, 0x9C2C, 0xF6AC, 0x9C2D, 0xC55F, 0x9C31, 0xC5BF, + 0x9C32, 0xF7B4, 0x9C33, 0xF7AF, 0x9C34, 0xF7B3, 0x9C36, 0xF7B6, + 0x9C37, 0xF7B2, 0x9C39, 0xF7AE, 0x9C3B, 0xC5C1, 0x9C3C, 0xF7B1, + 0x9C3D, 0xF7B5, 0x9C3E, 0xC5C0, 0x9C3F, 0xF7AC, 0x9C40, 0xF570, + 0x9C41, 0xF7B0, 0x9C44, 0xF7AD, 0x9C46, 0xF7AA, 0x9C48, 0xF7AB, + 0x9C49, 0xC5BE, 0x9C4A, 0xF85A, 0x9C4B, 0xF85C, 0x9C4C, 0xF85F, + 0x9C4D, 0xF85B, 0x9C4E, 0xF860, 0x9C50, 0xF859, 0x9C52, 0xF857, + 0x9C54, 0xC5EB, 0x9C55, 0xF85D, 0x9C56, 0xC5ED, 0x9C57, 0xC5EC, + 0x9C58, 0xF858, 0x9C59, 0xF85E, 0x9C5E, 0xF8DA, 0x9C5F, 0xC64D, + 0x9C60, 0xF8DB, 0x9C62, 0xF8D9, 0x9C63, 0xF8D6, 0x9C66, 0xF8D8, + 0x9C67, 0xF8D7, 0x9C68, 0xF95A, 0x9C6D, 0xF95C, 0x9C6E, 0xF95B, + 0x9C71, 0xF979, 0x9C73, 0xF978, 0x9C74, 0xF977, 0x9C75, 0xF97A, + 0x9C77, 0xC673, 0x9C78, 0xC674, 0x9C79, 0xF9CA, 0x9C7A, 0xF9CE, + 0x9CE5, 0xB3BE, 0x9CE6, 0xDCAF, 0x9CE7, 0xE0ED, 0x9CE9, 0xB9A7, + 0x9CEA, 0xE0EB, 0x9CED, 0xE0EC, 0x9CF1, 0xE4E2, 0x9CF2, 0xE4E3, + 0x9CF3, 0xBBF1, 0x9CF4, 0xBBEF, 0x9CF5, 0xE4E4, 0x9CF6, 0xBBF0, + 0x9CF7, 0xE8E8, 0x9CF9, 0xE8EB, 0x9CFA, 0xE8E5, 0x9CFB, 0xE8EC, + 0x9CFC, 0xE8E4, 0x9CFD, 0xE8E6, 0x9CFF, 0xE8E7, 0x9D00, 0xE8EA, + 0x9D03, 0xBEA1, 0x9D04, 0xE8EF, 0x9D05, 0xE8EE, 0x9D06, 0xBE7D, + 0x9D07, 0xE8E9, 0x9D08, 0xE8ED, 0x9D09, 0xBE7E, 0x9D10, 0xECAC, + 0x9D12, 0xC06F, 0x9D14, 0xECA7, 0x9D15, 0xC06B, 0x9D17, 0xECA4, + 0x9D18, 0xECAA, 0x9D19, 0xECAD, 0x9D1B, 0xC070, 0x9D1D, 0xECA9, + 0x9D1E, 0xECA6, 0x9D1F, 0xECAE, 0x9D20, 0xECA5, 0x9D22, 0xECAB, + 0x9D23, 0xC06C, 0x9D25, 0xECA3, 0x9D26, 0xC06D, 0x9D28, 0xC06E, + 0x9D29, 0xECA8, 0x9D2D, 0xEFA9, 0x9D2E, 0xEF7A, 0x9D2F, 0xEF7B, + 0x9D30, 0xEF7E, 0x9D31, 0xEF7C, 0x9D33, 0xEF76, 0x9D36, 0xEF79, + 0x9D37, 0xEFA5, 0x9D38, 0xEF7D, 0x9D3B, 0xC245, 0x9D3D, 0xEFA7, + 0x9D3E, 0xEFA4, 0x9D3F, 0xC246, 0x9D40, 0xEFA6, 0x9D41, 0xEF77, + 0x9D42, 0xEFA2, 0x9D43, 0xEFA3, 0x9D45, 0xEFA1, 0x9D4A, 0xF1D2, + 0x9D4B, 0xF1D4, 0x9D4C, 0xF1D7, 0x9D4F, 0xF1D1, 0x9D51, 0xC359, + 0x9D52, 0xF1D9, 0x9D53, 0xF1D0, 0x9D54, 0xF1DA, 0x9D56, 0xF1D6, + 0x9D57, 0xF1D8, 0x9D58, 0xF1DC, 0x9D59, 0xF1D5, 0x9D5A, 0xF1DD, + 0x9D5B, 0xF1D3, 0x9D5C, 0xF1CF, 0x9D5D, 0xC35A, 0x9D5F, 0xF1DB, + 0x9D60, 0xC35B, 0x9D61, 0xC44D, 0x9D67, 0xEF78, 0x9D68, 0xF3F1, + 0x9D69, 0xF3E8, 0x9D6A, 0xC44F, 0x9D6B, 0xF3E4, 0x9D6C, 0xC450, + 0x9D6F, 0xF3ED, 0x9D70, 0xF3E7, 0x9D71, 0xF3DD, 0x9D72, 0xC44E, + 0x9D73, 0xF3EA, 0x9D74, 0xF3E5, 0x9D75, 0xF3E6, 0x9D77, 0xF3D8, + 0x9D78, 0xF3DF, 0x9D79, 0xF3EE, 0x9D7B, 0xF3EB, 0x9D7D, 0xF3E3, + 0x9D7F, 0xF3EF, 0x9D80, 0xF3DE, 0x9D81, 0xF3D9, 0x9D82, 0xF3EC, + 0x9D84, 0xF3DB, 0x9D85, 0xF3E9, 0x9D86, 0xF3E0, 0x9D87, 0xF3F0, + 0x9D88, 0xF3DC, 0x9D89, 0xC44C, 0x9D8A, 0xF3DA, 0x9D8B, 0xF3E1, + 0x9D8C, 0xF3E2, 0x9D90, 0xF57D, 0x9D92, 0xF57B, 0x9D94, 0xF5A2, + 0x9D96, 0xF5AE, 0x9D97, 0xF5A5, 0x9D98, 0xF57C, 0x9D99, 0xF578, + 0x9D9A, 0xF5A7, 0x9D9B, 0xF57E, 0x9D9C, 0xF5A3, 0x9D9D, 0xF57A, + 0x9D9E, 0xF5AA, 0x9D9F, 0xF577, 0x9DA0, 0xF5A1, 0x9DA1, 0xF5A6, + 0x9DA2, 0xF5A8, 0x9DA3, 0xF5AB, 0x9DA4, 0xF579, 0x9DA6, 0xF5AF, + 0x9DA7, 0xF5B0, 0x9DA8, 0xF5A9, 0x9DA9, 0xF5AD, 0x9DAA, 0xF5A4, + 0x9DAC, 0xF6C1, 0x9DAD, 0xF6C4, 0x9DAF, 0xC561, 0x9DB1, 0xF6C3, + 0x9DB2, 0xF6C8, 0x9DB3, 0xF6C6, 0x9DB4, 0xC562, 0x9DB5, 0xF6BD, + 0x9DB6, 0xF6B3, 0x9DB7, 0xF6B2, 0x9DB8, 0xC564, 0x9DB9, 0xF6BF, + 0x9DBA, 0xF6C0, 0x9DBB, 0xF6BC, 0x9DBC, 0xF6B4, 0x9DBE, 0xF6B9, + 0x9DBF, 0xF5AC, 0x9DC1, 0xF6B5, 0x9DC2, 0xC563, 0x9DC3, 0xF6BB, + 0x9DC5, 0xF6BA, 0x9DC7, 0xF6B6, 0x9DC8, 0xF6C2, 0x9DCA, 0xF6B7, + 0x9DCB, 0xF7BB, 0x9DCC, 0xF6C5, 0x9DCD, 0xF6C7, 0x9DCE, 0xF6BE, + 0x9DCF, 0xF6B8, 0x9DD0, 0xF7BC, 0x9DD1, 0xF7BE, 0x9DD2, 0xF7B8, + 0x9DD3, 0xC5C2, 0x9DD5, 0xF7C5, 0x9DD6, 0xF7C3, 0x9DD7, 0xC5C3, + 0x9DD8, 0xF7C2, 0x9DD9, 0xF7C1, 0x9DDA, 0xF7BA, 0x9DDB, 0xF7B7, + 0x9DDC, 0xF7BD, 0x9DDD, 0xF7C6, 0x9DDE, 0xF7B9, 0x9DDF, 0xF7BF, + 0x9DE1, 0xF869, 0x9DE2, 0xF86E, 0x9DE3, 0xF864, 0x9DE4, 0xF867, + 0x9DE5, 0xC5EE, 0x9DE6, 0xF86B, 0x9DE8, 0xF872, 0x9DE9, 0xF7C0, + 0x9DEB, 0xF865, 0x9DEC, 0xF86F, 0x9DED, 0xF873, 0x9DEE, 0xF86A, + 0x9DEF, 0xF863, 0x9DF0, 0xF86D, 0x9DF2, 0xF86C, 0x9DF3, 0xF871, + 0x9DF4, 0xF870, 0x9DF5, 0xF7C4, 0x9DF6, 0xF868, 0x9DF7, 0xF862, + 0x9DF8, 0xF866, 0x9DF9, 0xC64E, 0x9DFA, 0xC64F, 0x9DFB, 0xF861, + 0x9DFD, 0xF8E6, 0x9DFE, 0xF8DD, 0x9DFF, 0xF8E5, 0x9E00, 0xF8E2, + 0x9E01, 0xF8E3, 0x9E02, 0xF8DC, 0x9E03, 0xF8DF, 0x9E04, 0xF8E7, + 0x9E05, 0xF8E1, 0x9E06, 0xF8E0, 0x9E07, 0xF8DE, 0x9E09, 0xF8E4, + 0x9E0B, 0xF95D, 0x9E0D, 0xF95E, 0x9E0F, 0xF960, 0x9E10, 0xF95F, + 0x9E11, 0xF962, 0x9E12, 0xF961, 0x9E13, 0xF97C, 0x9E14, 0xF97B, + 0x9E15, 0xF9B7, 0x9E17, 0xF9B8, 0x9E19, 0xF9C5, 0x9E1A, 0xC678, + 0x9E1B, 0xC67C, 0x9E1D, 0xF9CF, 0x9E1E, 0xC67D, 0x9E75, 0xB3BF, + 0x9E79, 0xC4D0, 0x9E7A, 0xF6C9, 0x9E7C, 0xC650, 0x9E7D, 0xC651, + 0x9E7F, 0xB3C0, 0x9E80, 0xE0EE, 0x9E82, 0xB9A8, 0x9E83, 0xE8F0, + 0x9E86, 0xECB0, 0x9E87, 0xECB1, 0x9E88, 0xECAF, 0x9E89, 0xEFAB, + 0x9E8A, 0xEFAA, 0x9E8B, 0xC247, 0x9E8C, 0xF1DF, 0x9E8D, 0xEFAC, + 0x9E8E, 0xF1DE, 0x9E91, 0xF3F3, 0x9E92, 0xC451, 0x9E93, 0xC453, + 0x9E94, 0xF3F2, 0x9E97, 0xC452, 0x9E99, 0xF5B1, 0x9E9A, 0xF5B3, + 0x9E9B, 0xF5B2, 0x9E9C, 0xF6CA, 0x9E9D, 0xC565, 0x9E9F, 0xC5EF, + 0x9EA0, 0xF8E8, 0x9EA1, 0xF963, 0x9EA4, 0xF9D2, 0x9EA5, 0xB3C1, + 0x9EA7, 0xE4E5, 0x9EA9, 0xBEA2, 0x9EAD, 0xECB3, 0x9EAE, 0xECB2, + 0x9EB0, 0xEFAD, 0x9EB4, 0xC454, 0x9EB5, 0xC4D1, 0x9EB6, 0xF7C7, + 0x9EB7, 0xF9CB, 0x9EBB, 0xB3C2, 0x9EBC, 0xBBF2, 0x9EBE, 0xBEA3, + 0x9EC0, 0xF3F4, 0x9EC2, 0xF874, 0x9EC3, 0xB6C0, 0x9EC8, 0xEFAE, + 0x9ECC, 0xC664, 0x9ECD, 0xB6C1, 0x9ECE, 0xBEA4, 0x9ECF, 0xC248, + 0x9ED0, 0xF875, 0x9ED1, 0xB6C2, 0x9ED3, 0xE8F1, 0x9ED4, 0xC072, + 0x9ED5, 0xECB4, 0x9ED6, 0xECB5, 0x9ED8, 0xC071, 0x9EDA, 0xEFAF, + 0x9EDB, 0xC24C, 0x9EDC, 0xC24A, 0x9EDD, 0xC24B, 0x9EDE, 0xC249, + 0x9EDF, 0xF1E0, 0x9EE0, 0xC35C, 0x9EE4, 0xF5B5, 0x9EE5, 0xF5B4, + 0x9EE6, 0xF5B7, 0x9EE7, 0xF5B6, 0x9EE8, 0xC4D2, 0x9EEB, 0xF6CB, + 0x9EED, 0xF6CD, 0x9EEE, 0xF6CC, 0x9EEF, 0xC566, 0x9EF0, 0xF7C8, + 0x9EF2, 0xF876, 0x9EF3, 0xF877, 0x9EF4, 0xC5F0, 0x9EF5, 0xF964, + 0x9EF6, 0xF97D, 0x9EF7, 0xC675, 0x9EF9, 0xDCB0, 0x9EFA, 0xECB6, + 0x9EFB, 0xEFB0, 0x9EFC, 0xF3F5, 0x9EFD, 0xE0EF, 0x9EFF, 0xEFB1, + 0x9F00, 0xF1E2, 0x9F01, 0xF1E1, 0x9F06, 0xF878, 0x9F07, 0xC652, + 0x9F09, 0xF965, 0x9F0A, 0xF97E, 0x9F0E, 0xB9A9, 0x9F0F, 0xE8F2, + 0x9F10, 0xE8F3, 0x9F12, 0xECB7, 0x9F13, 0xB9AA, 0x9F15, 0xC35D, + 0x9F16, 0xF1E3, 0x9F18, 0xF6CF, 0x9F19, 0xC567, 0x9F1A, 0xF6D0, + 0x9F1B, 0xF6CE, 0x9F1C, 0xF879, 0x9F1E, 0xF8E9, 0x9F20, 0xB9AB, + 0x9F22, 0xEFB4, 0x9F23, 0xEFB3, 0x9F24, 0xEFB2, 0x9F25, 0xF1E4, + 0x9F28, 0xF1E8, 0x9F29, 0xF1E7, 0x9F2A, 0xF1E6, 0x9F2B, 0xF1E5, + 0x9F2C, 0xC35E, 0x9F2D, 0xF3F6, 0x9F2E, 0xF5B9, 0x9F2F, 0xC4D3, + 0x9F30, 0xF5B8, 0x9F31, 0xF6D1, 0x9F32, 0xF7CB, 0x9F33, 0xF7CA, + 0x9F34, 0xC5C4, 0x9F35, 0xF7C9, 0x9F36, 0xF87C, 0x9F37, 0xF87B, + 0x9F38, 0xF87A, 0x9F3B, 0xBBF3, 0x9F3D, 0xECB8, 0x9F3E, 0xC24D, + 0x9F40, 0xF3F7, 0x9F41, 0xF3F8, 0x9F42, 0xF7CC, 0x9F43, 0xF87D, + 0x9F46, 0xF8EA, 0x9F47, 0xF966, 0x9F48, 0xF9B9, 0x9F49, 0xF9D4, + 0x9F4A, 0xBBF4, 0x9F4B, 0xC24E, 0x9F4C, 0xF1E9, 0x9F4D, 0xF3F9, + 0x9F4E, 0xF6D2, 0x9F4F, 0xF87E, 0x9F52, 0xBEA6, 0x9F54, 0xEFB5, + 0x9F55, 0xF1EA, 0x9F56, 0xF3FA, 0x9F57, 0xF3FB, 0x9F58, 0xF3FC, + 0x9F59, 0xF5BE, 0x9F5B, 0xF5BA, 0x9F5C, 0xC568, 0x9F5D, 0xF5BD, + 0x9F5E, 0xF5BC, 0x9F5F, 0xC4D4, 0x9F60, 0xF5BB, 0x9F61, 0xC4D6, + 0x9F63, 0xC4D5, 0x9F64, 0xF6D4, 0x9F65, 0xF6D3, 0x9F66, 0xC569, + 0x9F67, 0xC56A, 0x9F6A, 0xC5C6, 0x9F6B, 0xF7CD, 0x9F6C, 0xC5C5, + 0x9F6E, 0xF8A3, 0x9F6F, 0xF8A4, 0x9F70, 0xF8A2, 0x9F71, 0xF8A1, + 0x9F72, 0xC654, 0x9F74, 0xF8EB, 0x9F75, 0xF8EC, 0x9F76, 0xF8ED, + 0x9F77, 0xC653, 0x9F78, 0xF967, 0x9F79, 0xF96A, 0x9F7A, 0xF969, + 0x9F7B, 0xF968, 0x9F7E, 0xF9D3, 0x9F8D, 0xC073, 0x9F90, 0xC365, + 0x9F91, 0xF5BF, 0x9F92, 0xF6D5, 0x9F94, 0xC5C7, 0x9F95, 0xF7CE, + 0x9F98, 0xF9D5, 0x9F9C, 0xC074, 0x9FA0, 0xEFB6, 0x9FA2, 0xF7CF, + 0x9FA4, 0xF9A1, 0xFA0C, 0xC94A, 0xFA0D, 0xDDFC, 0xFE30, 0xA14A, + 0xFE31, 0xA157, 0xFE33, 0xA159, 0xFE34, 0xA15B, 0xFE35, 0xA15F, + 0xFE36, 0xA160, 0xFE37, 0xA163, 0xFE38, 0xA164, 0xFE39, 0xA167, + 0xFE3A, 0xA168, 0xFE3B, 0xA16B, 0xFE3C, 0xA16C, 0xFE3D, 0xA16F, + 0xFE3E, 0xA170, 0xFE3F, 0xA173, 0xFE40, 0xA174, 0xFE41, 0xA177, + 0xFE42, 0xA178, 0xFE43, 0xA17B, 0xFE44, 0xA17C, 0xFE49, 0xA1C6, + 0xFE4A, 0xA1C7, 0xFE4B, 0xA1CA, 0xFE4C, 0xA1CB, 0xFE4D, 0xA1C8, + 0xFE4E, 0xA1C9, 0xFE4F, 0xA15C, 0xFE50, 0xA14D, 0xFE51, 0xA14E, + 0xFE52, 0xA14F, 0xFE54, 0xA151, 0xFE55, 0xA152, 0xFE56, 0xA153, + 0xFE57, 0xA154, 0xFE59, 0xA17D, 0xFE5A, 0xA17E, 0xFE5B, 0xA1A1, + 0xFE5C, 0xA1A2, 0xFE5D, 0xA1A3, 0xFE5E, 0xA1A4, 0xFE5F, 0xA1CC, + 0xFE60, 0xA1CD, 0xFE61, 0xA1CE, 0xFE62, 0xA1DE, 0xFE63, 0xA1DF, + 0xFE64, 0xA1E0, 0xFE65, 0xA1E1, 0xFE66, 0xA1E2, 0xFE68, 0xA242, + 0xFE69, 0xA24C, 0xFE6A, 0xA24D, 0xFE6B, 0xA24E, 0xFF01, 0xA149, + 0xFF03, 0xA1AD, 0xFF04, 0xA243, 0xFF05, 0xA248, 0xFF06, 0xA1AE, + 0xFF08, 0xA15D, 0xFF09, 0xA15E, 0xFF0A, 0xA1AF, 0xFF0B, 0xA1CF, + 0xFF0C, 0xA141, 0xFF0D, 0xA1D0, 0xFF0E, 0xA144, 0xFF0F, 0xA1FE, + 0xFF10, 0xA2AF, 0xFF11, 0xA2B0, 0xFF12, 0xA2B1, 0xFF13, 0xA2B2, + 0xFF14, 0xA2B3, 0xFF15, 0xA2B4, 0xFF16, 0xA2B5, 0xFF17, 0xA2B6, + 0xFF18, 0xA2B7, 0xFF19, 0xA2B8, 0xFF1A, 0xA147, 0xFF1B, 0xA146, + 0xFF1C, 0xA1D5, 0xFF1D, 0xA1D7, 0xFF1E, 0xA1D6, 0xFF1F, 0xA148, + 0xFF20, 0xA249, 0xFF21, 0xA2CF, 0xFF22, 0xA2D0, 0xFF23, 0xA2D1, + 0xFF24, 0xA2D2, 0xFF25, 0xA2D3, 0xFF26, 0xA2D4, 0xFF27, 0xA2D5, + 0xFF28, 0xA2D6, 0xFF29, 0xA2D7, 0xFF2A, 0xA2D8, 0xFF2B, 0xA2D9, + 0xFF2C, 0xA2DA, 0xFF2D, 0xA2DB, 0xFF2E, 0xA2DC, 0xFF2F, 0xA2DD, + 0xFF30, 0xA2DE, 0xFF31, 0xA2DF, 0xFF32, 0xA2E0, 0xFF33, 0xA2E1, + 0xFF34, 0xA2E2, 0xFF35, 0xA2E3, 0xFF36, 0xA2E4, 0xFF37, 0xA2E5, + 0xFF38, 0xA2E6, 0xFF39, 0xA2E7, 0xFF3A, 0xA2E8, 0xFF3C, 0xA240, + 0xFF3F, 0xA1C4, 0xFF41, 0xA2E9, 0xFF42, 0xA2EA, 0xFF43, 0xA2EB, + 0xFF44, 0xA2EC, 0xFF45, 0xA2ED, 0xFF46, 0xA2EE, 0xFF47, 0xA2EF, + 0xFF48, 0xA2F0, 0xFF49, 0xA2F1, 0xFF4A, 0xA2F2, 0xFF4B, 0xA2F3, + 0xFF4C, 0xA2F4, 0xFF4D, 0xA2F5, 0xFF4E, 0xA2F6, 0xFF4F, 0xA2F7, + 0xFF50, 0xA2F8, 0xFF51, 0xA2F9, 0xFF52, 0xA2FA, 0xFF53, 0xA2FB, + 0xFF54, 0xA2FC, 0xFF55, 0xA2FD, 0xFF56, 0xA2FE, 0xFF57, 0xA340, + 0xFF58, 0xA341, 0xFF59, 0xA342, 0xFF5A, 0xA343, 0xFF5B, 0xA161, + 0xFF5C, 0xA155, 0xFF5D, 0xA162, 0xFF5E, 0xA1E3, 0xFFE0, 0xA246, + 0xFFE1, 0xA247, 0xFFE3, 0xA1C3, 0xFFE5, 0xA244, 0, 0 +}; + +static +const WCHAR oem2uni[] = { +/* OEM - Unicode, OEM - Unicode, OEM - Unicode, OEM - Unicode */ + 0xA140, 0x3000, 0xA141, 0xFF0C, 0xA142, 0x3001, 0xA143, 0x3002, + 0xA144, 0xFF0E, 0xA145, 0x2027, 0xA146, 0xFF1B, 0xA147, 0xFF1A, + 0xA148, 0xFF1F, 0xA149, 0xFF01, 0xA14A, 0xFE30, 0xA14B, 0x2026, + 0xA14C, 0x2025, 0xA14D, 0xFE50, 0xA14E, 0xFE51, 0xA14F, 0xFE52, + 0xA150, 0x00B7, 0xA151, 0xFE54, 0xA152, 0xFE55, 0xA153, 0xFE56, + 0xA154, 0xFE57, 0xA155, 0xFF5C, 0xA156, 0x2013, 0xA157, 0xFE31, + 0xA158, 0x2014, 0xA159, 0xFE33, 0xA15A, 0x2574, 0xA15B, 0xFE34, + 0xA15C, 0xFE4F, 0xA15D, 0xFF08, 0xA15E, 0xFF09, 0xA15F, 0xFE35, + 0xA160, 0xFE36, 0xA161, 0xFF5B, 0xA162, 0xFF5D, 0xA163, 0xFE37, + 0xA164, 0xFE38, 0xA165, 0x3014, 0xA166, 0x3015, 0xA167, 0xFE39, + 0xA168, 0xFE3A, 0xA169, 0x3010, 0xA16A, 0x3011, 0xA16B, 0xFE3B, + 0xA16C, 0xFE3C, 0xA16D, 0x300A, 0xA16E, 0x300B, 0xA16F, 0xFE3D, + 0xA170, 0xFE3E, 0xA171, 0x3008, 0xA172, 0x3009, 0xA173, 0xFE3F, + 0xA174, 0xFE40, 0xA175, 0x300C, 0xA176, 0x300D, 0xA177, 0xFE41, + 0xA178, 0xFE42, 0xA179, 0x300E, 0xA17A, 0x300F, 0xA17B, 0xFE43, + 0xA17C, 0xFE44, 0xA17D, 0xFE59, 0xA17E, 0xFE5A, 0xA1A1, 0xFE5B, + 0xA1A2, 0xFE5C, 0xA1A3, 0xFE5D, 0xA1A4, 0xFE5E, 0xA1A5, 0x2018, + 0xA1A6, 0x2019, 0xA1A7, 0x201C, 0xA1A8, 0x201D, 0xA1A9, 0x301D, + 0xA1AA, 0x301E, 0xA1AB, 0x2035, 0xA1AC, 0x2032, 0xA1AD, 0xFF03, + 0xA1AE, 0xFF06, 0xA1AF, 0xFF0A, 0xA1B0, 0x203B, 0xA1B1, 0x00A7, + 0xA1B2, 0x3003, 0xA1B3, 0x25CB, 0xA1B4, 0x25CF, 0xA1B5, 0x25B3, + 0xA1B6, 0x25B2, 0xA1B7, 0x25CE, 0xA1B8, 0x2606, 0xA1B9, 0x2605, + 0xA1BA, 0x25C7, 0xA1BB, 0x25C6, 0xA1BC, 0x25A1, 0xA1BD, 0x25A0, + 0xA1BE, 0x25BD, 0xA1BF, 0x25BC, 0xA1C0, 0x32A3, 0xA1C1, 0x2105, + 0xA1C2, 0x00AF, 0xA1C3, 0xFFE3, 0xA1C4, 0xFF3F, 0xA1C5, 0x02CD, + 0xA1C6, 0xFE49, 0xA1C7, 0xFE4A, 0xA1C8, 0xFE4D, 0xA1C9, 0xFE4E, + 0xA1CA, 0xFE4B, 0xA1CB, 0xFE4C, 0xA1CC, 0xFE5F, 0xA1CD, 0xFE60, + 0xA1CE, 0xFE61, 0xA1CF, 0xFF0B, 0xA1D0, 0xFF0D, 0xA1D1, 0x00D7, + 0xA1D2, 0x00F7, 0xA1D3, 0x00B1, 0xA1D4, 0x221A, 0xA1D5, 0xFF1C, + 0xA1D6, 0xFF1E, 0xA1D7, 0xFF1D, 0xA1D8, 0x2266, 0xA1D9, 0x2267, + 0xA1DA, 0x2260, 0xA1DB, 0x221E, 0xA1DC, 0x2252, 0xA1DD, 0x2261, + 0xA1DE, 0xFE62, 0xA1DF, 0xFE63, 0xA1E0, 0xFE64, 0xA1E1, 0xFE65, + 0xA1E2, 0xFE66, 0xA1E3, 0xFF5E, 0xA1E4, 0x2229, 0xA1E5, 0x222A, + 0xA1E6, 0x22A5, 0xA1E7, 0x2220, 0xA1E8, 0x221F, 0xA1E9, 0x22BF, + 0xA1EA, 0x33D2, 0xA1EB, 0x33D1, 0xA1EC, 0x222B, 0xA1ED, 0x222E, + 0xA1EE, 0x2235, 0xA1EF, 0x2234, 0xA1F0, 0x2640, 0xA1F1, 0x2642, + 0xA1F2, 0x2295, 0xA1F3, 0x2299, 0xA1F4, 0x2191, 0xA1F5, 0x2193, + 0xA1F6, 0x2190, 0xA1F7, 0x2192, 0xA1F8, 0x2196, 0xA1F9, 0x2197, + 0xA1FA, 0x2199, 0xA1FB, 0x2198, 0xA1FC, 0x2225, 0xA1FD, 0x2223, + 0xA1FE, 0xFF0F, 0xA240, 0xFF3C, 0xA241, 0x2215, 0xA242, 0xFE68, + 0xA243, 0xFF04, 0xA244, 0xFFE5, 0xA245, 0x3012, 0xA246, 0xFFE0, + 0xA247, 0xFFE1, 0xA248, 0xFF05, 0xA249, 0xFF20, 0xA24A, 0x2103, + 0xA24B, 0x2109, 0xA24C, 0xFE69, 0xA24D, 0xFE6A, 0xA24E, 0xFE6B, + 0xA24F, 0x33D5, 0xA250, 0x339C, 0xA251, 0x339D, 0xA252, 0x339E, + 0xA253, 0x33CE, 0xA254, 0x33A1, 0xA255, 0x338E, 0xA256, 0x338F, + 0xA257, 0x33C4, 0xA258, 0x00B0, 0xA259, 0x5159, 0xA25A, 0x515B, + 0xA25B, 0x515E, 0xA25C, 0x515D, 0xA25D, 0x5161, 0xA25E, 0x5163, + 0xA25F, 0x55E7, 0xA260, 0x74E9, 0xA261, 0x7CCE, 0xA262, 0x2581, + 0xA263, 0x2582, 0xA264, 0x2583, 0xA265, 0x2584, 0xA266, 0x2585, + 0xA267, 0x2586, 0xA268, 0x2587, 0xA269, 0x2588, 0xA26A, 0x258F, + 0xA26B, 0x258E, 0xA26C, 0x258D, 0xA26D, 0x258C, 0xA26E, 0x258B, + 0xA26F, 0x258A, 0xA270, 0x2589, 0xA271, 0x253C, 0xA272, 0x2534, + 0xA273, 0x252C, 0xA274, 0x2524, 0xA275, 0x251C, 0xA276, 0x2594, + 0xA277, 0x2500, 0xA278, 0x2502, 0xA279, 0x2595, 0xA27A, 0x250C, + 0xA27B, 0x2510, 0xA27C, 0x2514, 0xA27D, 0x2518, 0xA27E, 0x256D, + 0xA2A1, 0x256E, 0xA2A2, 0x2570, 0xA2A3, 0x256F, 0xA2A4, 0x2550, + 0xA2A5, 0x255E, 0xA2A6, 0x256A, 0xA2A7, 0x2561, 0xA2A8, 0x25E2, + 0xA2A9, 0x25E3, 0xA2AA, 0x25E5, 0xA2AB, 0x25E4, 0xA2AC, 0x2571, + 0xA2AD, 0x2572, 0xA2AE, 0x2573, 0xA2AF, 0xFF10, 0xA2B0, 0xFF11, + 0xA2B1, 0xFF12, 0xA2B2, 0xFF13, 0xA2B3, 0xFF14, 0xA2B4, 0xFF15, + 0xA2B5, 0xFF16, 0xA2B6, 0xFF17, 0xA2B7, 0xFF18, 0xA2B8, 0xFF19, + 0xA2B9, 0x2160, 0xA2BA, 0x2161, 0xA2BB, 0x2162, 0xA2BC, 0x2163, + 0xA2BD, 0x2164, 0xA2BE, 0x2165, 0xA2BF, 0x2166, 0xA2C0, 0x2167, + 0xA2C1, 0x2168, 0xA2C2, 0x2169, 0xA2C3, 0x3021, 0xA2C4, 0x3022, + 0xA2C5, 0x3023, 0xA2C6, 0x3024, 0xA2C7, 0x3025, 0xA2C8, 0x3026, + 0xA2C9, 0x3027, 0xA2CA, 0x3028, 0xA2CB, 0x3029, 0xA2CC, 0x5341, + 0xA2CD, 0x5344, 0xA2CE, 0x5345, 0xA2CF, 0xFF21, 0xA2D0, 0xFF22, + 0xA2D1, 0xFF23, 0xA2D2, 0xFF24, 0xA2D3, 0xFF25, 0xA2D4, 0xFF26, + 0xA2D5, 0xFF27, 0xA2D6, 0xFF28, 0xA2D7, 0xFF29, 0xA2D8, 0xFF2A, + 0xA2D9, 0xFF2B, 0xA2DA, 0xFF2C, 0xA2DB, 0xFF2D, 0xA2DC, 0xFF2E, + 0xA2DD, 0xFF2F, 0xA2DE, 0xFF30, 0xA2DF, 0xFF31, 0xA2E0, 0xFF32, + 0xA2E1, 0xFF33, 0xA2E2, 0xFF34, 0xA2E3, 0xFF35, 0xA2E4, 0xFF36, + 0xA2E5, 0xFF37, 0xA2E6, 0xFF38, 0xA2E7, 0xFF39, 0xA2E8, 0xFF3A, + 0xA2E9, 0xFF41, 0xA2EA, 0xFF42, 0xA2EB, 0xFF43, 0xA2EC, 0xFF44, + 0xA2ED, 0xFF45, 0xA2EE, 0xFF46, 0xA2EF, 0xFF47, 0xA2F0, 0xFF48, + 0xA2F1, 0xFF49, 0xA2F2, 0xFF4A, 0xA2F3, 0xFF4B, 0xA2F4, 0xFF4C, + 0xA2F5, 0xFF4D, 0xA2F6, 0xFF4E, 0xA2F7, 0xFF4F, 0xA2F8, 0xFF50, + 0xA2F9, 0xFF51, 0xA2FA, 0xFF52, 0xA2FB, 0xFF53, 0xA2FC, 0xFF54, + 0xA2FD, 0xFF55, 0xA2FE, 0xFF56, 0xA340, 0xFF57, 0xA341, 0xFF58, + 0xA342, 0xFF59, 0xA343, 0xFF5A, 0xA344, 0x0391, 0xA345, 0x0392, + 0xA346, 0x0393, 0xA347, 0x0394, 0xA348, 0x0395, 0xA349, 0x0396, + 0xA34A, 0x0397, 0xA34B, 0x0398, 0xA34C, 0x0399, 0xA34D, 0x039A, + 0xA34E, 0x039B, 0xA34F, 0x039C, 0xA350, 0x039D, 0xA351, 0x039E, + 0xA352, 0x039F, 0xA353, 0x03A0, 0xA354, 0x03A1, 0xA355, 0x03A3, + 0xA356, 0x03A4, 0xA357, 0x03A5, 0xA358, 0x03A6, 0xA359, 0x03A7, + 0xA35A, 0x03A8, 0xA35B, 0x03A9, 0xA35C, 0x03B1, 0xA35D, 0x03B2, + 0xA35E, 0x03B3, 0xA35F, 0x03B4, 0xA360, 0x03B5, 0xA361, 0x03B6, + 0xA362, 0x03B7, 0xA363, 0x03B8, 0xA364, 0x03B9, 0xA365, 0x03BA, + 0xA366, 0x03BB, 0xA367, 0x03BC, 0xA368, 0x03BD, 0xA369, 0x03BE, + 0xA36A, 0x03BF, 0xA36B, 0x03C0, 0xA36C, 0x03C1, 0xA36D, 0x03C3, + 0xA36E, 0x03C4, 0xA36F, 0x03C5, 0xA370, 0x03C6, 0xA371, 0x03C7, + 0xA372, 0x03C8, 0xA373, 0x03C9, 0xA374, 0x3105, 0xA375, 0x3106, + 0xA376, 0x3107, 0xA377, 0x3108, 0xA378, 0x3109, 0xA379, 0x310A, + 0xA37A, 0x310B, 0xA37B, 0x310C, 0xA37C, 0x310D, 0xA37D, 0x310E, + 0xA37E, 0x310F, 0xA3A1, 0x3110, 0xA3A2, 0x3111, 0xA3A3, 0x3112, + 0xA3A4, 0x3113, 0xA3A5, 0x3114, 0xA3A6, 0x3115, 0xA3A7, 0x3116, + 0xA3A8, 0x3117, 0xA3A9, 0x3118, 0xA3AA, 0x3119, 0xA3AB, 0x311A, + 0xA3AC, 0x311B, 0xA3AD, 0x311C, 0xA3AE, 0x311D, 0xA3AF, 0x311E, + 0xA3B0, 0x311F, 0xA3B1, 0x3120, 0xA3B2, 0x3121, 0xA3B3, 0x3122, + 0xA3B4, 0x3123, 0xA3B5, 0x3124, 0xA3B6, 0x3125, 0xA3B7, 0x3126, + 0xA3B8, 0x3127, 0xA3B9, 0x3128, 0xA3BA, 0x3129, 0xA3BB, 0x02D9, + 0xA3BC, 0x02C9, 0xA3BD, 0x02CA, 0xA3BE, 0x02C7, 0xA3BF, 0x02CB, + 0xA3E1, 0x20AC, 0xA440, 0x4E00, 0xA441, 0x4E59, 0xA442, 0x4E01, + 0xA443, 0x4E03, 0xA444, 0x4E43, 0xA445, 0x4E5D, 0xA446, 0x4E86, + 0xA447, 0x4E8C, 0xA448, 0x4EBA, 0xA449, 0x513F, 0xA44A, 0x5165, + 0xA44B, 0x516B, 0xA44C, 0x51E0, 0xA44D, 0x5200, 0xA44E, 0x5201, + 0xA44F, 0x529B, 0xA450, 0x5315, 0xA451, 0x5341, 0xA452, 0x535C, + 0xA453, 0x53C8, 0xA454, 0x4E09, 0xA455, 0x4E0B, 0xA456, 0x4E08, + 0xA457, 0x4E0A, 0xA458, 0x4E2B, 0xA459, 0x4E38, 0xA45A, 0x51E1, + 0xA45B, 0x4E45, 0xA45C, 0x4E48, 0xA45D, 0x4E5F, 0xA45E, 0x4E5E, + 0xA45F, 0x4E8E, 0xA460, 0x4EA1, 0xA461, 0x5140, 0xA462, 0x5203, + 0xA463, 0x52FA, 0xA464, 0x5343, 0xA465, 0x53C9, 0xA466, 0x53E3, + 0xA467, 0x571F, 0xA468, 0x58EB, 0xA469, 0x5915, 0xA46A, 0x5927, + 0xA46B, 0x5973, 0xA46C, 0x5B50, 0xA46D, 0x5B51, 0xA46E, 0x5B53, + 0xA46F, 0x5BF8, 0xA470, 0x5C0F, 0xA471, 0x5C22, 0xA472, 0x5C38, + 0xA473, 0x5C71, 0xA474, 0x5DDD, 0xA475, 0x5DE5, 0xA476, 0x5DF1, + 0xA477, 0x5DF2, 0xA478, 0x5DF3, 0xA479, 0x5DFE, 0xA47A, 0x5E72, + 0xA47B, 0x5EFE, 0xA47C, 0x5F0B, 0xA47D, 0x5F13, 0xA47E, 0x624D, + 0xA4A1, 0x4E11, 0xA4A2, 0x4E10, 0xA4A3, 0x4E0D, 0xA4A4, 0x4E2D, + 0xA4A5, 0x4E30, 0xA4A6, 0x4E39, 0xA4A7, 0x4E4B, 0xA4A8, 0x5C39, + 0xA4A9, 0x4E88, 0xA4AA, 0x4E91, 0xA4AB, 0x4E95, 0xA4AC, 0x4E92, + 0xA4AD, 0x4E94, 0xA4AE, 0x4EA2, 0xA4AF, 0x4EC1, 0xA4B0, 0x4EC0, + 0xA4B1, 0x4EC3, 0xA4B2, 0x4EC6, 0xA4B3, 0x4EC7, 0xA4B4, 0x4ECD, + 0xA4B5, 0x4ECA, 0xA4B6, 0x4ECB, 0xA4B7, 0x4EC4, 0xA4B8, 0x5143, + 0xA4B9, 0x5141, 0xA4BA, 0x5167, 0xA4BB, 0x516D, 0xA4BC, 0x516E, + 0xA4BD, 0x516C, 0xA4BE, 0x5197, 0xA4BF, 0x51F6, 0xA4C0, 0x5206, + 0xA4C1, 0x5207, 0xA4C2, 0x5208, 0xA4C3, 0x52FB, 0xA4C4, 0x52FE, + 0xA4C5, 0x52FF, 0xA4C6, 0x5316, 0xA4C7, 0x5339, 0xA4C8, 0x5348, + 0xA4C9, 0x5347, 0xA4CA, 0x5345, 0xA4CB, 0x535E, 0xA4CC, 0x5384, + 0xA4CD, 0x53CB, 0xA4CE, 0x53CA, 0xA4CF, 0x53CD, 0xA4D0, 0x58EC, + 0xA4D1, 0x5929, 0xA4D2, 0x592B, 0xA4D3, 0x592A, 0xA4D4, 0x592D, + 0xA4D5, 0x5B54, 0xA4D6, 0x5C11, 0xA4D7, 0x5C24, 0xA4D8, 0x5C3A, + 0xA4D9, 0x5C6F, 0xA4DA, 0x5DF4, 0xA4DB, 0x5E7B, 0xA4DC, 0x5EFF, + 0xA4DD, 0x5F14, 0xA4DE, 0x5F15, 0xA4DF, 0x5FC3, 0xA4E0, 0x6208, + 0xA4E1, 0x6236, 0xA4E2, 0x624B, 0xA4E3, 0x624E, 0xA4E4, 0x652F, + 0xA4E5, 0x6587, 0xA4E6, 0x6597, 0xA4E7, 0x65A4, 0xA4E8, 0x65B9, + 0xA4E9, 0x65E5, 0xA4EA, 0x66F0, 0xA4EB, 0x6708, 0xA4EC, 0x6728, + 0xA4ED, 0x6B20, 0xA4EE, 0x6B62, 0xA4EF, 0x6B79, 0xA4F0, 0x6BCB, + 0xA4F1, 0x6BD4, 0xA4F2, 0x6BDB, 0xA4F3, 0x6C0F, 0xA4F4, 0x6C34, + 0xA4F5, 0x706B, 0xA4F6, 0x722A, 0xA4F7, 0x7236, 0xA4F8, 0x723B, + 0xA4F9, 0x7247, 0xA4FA, 0x7259, 0xA4FB, 0x725B, 0xA4FC, 0x72AC, + 0xA4FD, 0x738B, 0xA4FE, 0x4E19, 0xA540, 0x4E16, 0xA541, 0x4E15, + 0xA542, 0x4E14, 0xA543, 0x4E18, 0xA544, 0x4E3B, 0xA545, 0x4E4D, + 0xA546, 0x4E4F, 0xA547, 0x4E4E, 0xA548, 0x4EE5, 0xA549, 0x4ED8, + 0xA54A, 0x4ED4, 0xA54B, 0x4ED5, 0xA54C, 0x4ED6, 0xA54D, 0x4ED7, + 0xA54E, 0x4EE3, 0xA54F, 0x4EE4, 0xA550, 0x4ED9, 0xA551, 0x4EDE, + 0xA552, 0x5145, 0xA553, 0x5144, 0xA554, 0x5189, 0xA555, 0x518A, + 0xA556, 0x51AC, 0xA557, 0x51F9, 0xA558, 0x51FA, 0xA559, 0x51F8, + 0xA55A, 0x520A, 0xA55B, 0x52A0, 0xA55C, 0x529F, 0xA55D, 0x5305, + 0xA55E, 0x5306, 0xA55F, 0x5317, 0xA560, 0x531D, 0xA561, 0x4EDF, + 0xA562, 0x534A, 0xA563, 0x5349, 0xA564, 0x5361, 0xA565, 0x5360, + 0xA566, 0x536F, 0xA567, 0x536E, 0xA568, 0x53BB, 0xA569, 0x53EF, + 0xA56A, 0x53E4, 0xA56B, 0x53F3, 0xA56C, 0x53EC, 0xA56D, 0x53EE, + 0xA56E, 0x53E9, 0xA56F, 0x53E8, 0xA570, 0x53FC, 0xA571, 0x53F8, + 0xA572, 0x53F5, 0xA573, 0x53EB, 0xA574, 0x53E6, 0xA575, 0x53EA, + 0xA576, 0x53F2, 0xA577, 0x53F1, 0xA578, 0x53F0, 0xA579, 0x53E5, + 0xA57A, 0x53ED, 0xA57B, 0x53FB, 0xA57C, 0x56DB, 0xA57D, 0x56DA, + 0xA57E, 0x5916, 0xA5A1, 0x592E, 0xA5A2, 0x5931, 0xA5A3, 0x5974, + 0xA5A4, 0x5976, 0xA5A5, 0x5B55, 0xA5A6, 0x5B83, 0xA5A7, 0x5C3C, + 0xA5A8, 0x5DE8, 0xA5A9, 0x5DE7, 0xA5AA, 0x5DE6, 0xA5AB, 0x5E02, + 0xA5AC, 0x5E03, 0xA5AD, 0x5E73, 0xA5AE, 0x5E7C, 0xA5AF, 0x5F01, + 0xA5B0, 0x5F18, 0xA5B1, 0x5F17, 0xA5B2, 0x5FC5, 0xA5B3, 0x620A, + 0xA5B4, 0x6253, 0xA5B5, 0x6254, 0xA5B6, 0x6252, 0xA5B7, 0x6251, + 0xA5B8, 0x65A5, 0xA5B9, 0x65E6, 0xA5BA, 0x672E, 0xA5BB, 0x672C, + 0xA5BC, 0x672A, 0xA5BD, 0x672B, 0xA5BE, 0x672D, 0xA5BF, 0x6B63, + 0xA5C0, 0x6BCD, 0xA5C1, 0x6C11, 0xA5C2, 0x6C10, 0xA5C3, 0x6C38, + 0xA5C4, 0x6C41, 0xA5C5, 0x6C40, 0xA5C6, 0x6C3E, 0xA5C7, 0x72AF, + 0xA5C8, 0x7384, 0xA5C9, 0x7389, 0xA5CA, 0x74DC, 0xA5CB, 0x74E6, + 0xA5CC, 0x7518, 0xA5CD, 0x751F, 0xA5CE, 0x7528, 0xA5CF, 0x7529, + 0xA5D0, 0x7530, 0xA5D1, 0x7531, 0xA5D2, 0x7532, 0xA5D3, 0x7533, + 0xA5D4, 0x758B, 0xA5D5, 0x767D, 0xA5D6, 0x76AE, 0xA5D7, 0x76BF, + 0xA5D8, 0x76EE, 0xA5D9, 0x77DB, 0xA5DA, 0x77E2, 0xA5DB, 0x77F3, + 0xA5DC, 0x793A, 0xA5DD, 0x79BE, 0xA5DE, 0x7A74, 0xA5DF, 0x7ACB, + 0xA5E0, 0x4E1E, 0xA5E1, 0x4E1F, 0xA5E2, 0x4E52, 0xA5E3, 0x4E53, + 0xA5E4, 0x4E69, 0xA5E5, 0x4E99, 0xA5E6, 0x4EA4, 0xA5E7, 0x4EA6, + 0xA5E8, 0x4EA5, 0xA5E9, 0x4EFF, 0xA5EA, 0x4F09, 0xA5EB, 0x4F19, + 0xA5EC, 0x4F0A, 0xA5ED, 0x4F15, 0xA5EE, 0x4F0D, 0xA5EF, 0x4F10, + 0xA5F0, 0x4F11, 0xA5F1, 0x4F0F, 0xA5F2, 0x4EF2, 0xA5F3, 0x4EF6, + 0xA5F4, 0x4EFB, 0xA5F5, 0x4EF0, 0xA5F6, 0x4EF3, 0xA5F7, 0x4EFD, + 0xA5F8, 0x4F01, 0xA5F9, 0x4F0B, 0xA5FA, 0x5149, 0xA5FB, 0x5147, + 0xA5FC, 0x5146, 0xA5FD, 0x5148, 0xA5FE, 0x5168, 0xA640, 0x5171, + 0xA641, 0x518D, 0xA642, 0x51B0, 0xA643, 0x5217, 0xA644, 0x5211, + 0xA645, 0x5212, 0xA646, 0x520E, 0xA647, 0x5216, 0xA648, 0x52A3, + 0xA649, 0x5308, 0xA64A, 0x5321, 0xA64B, 0x5320, 0xA64C, 0x5370, + 0xA64D, 0x5371, 0xA64E, 0x5409, 0xA64F, 0x540F, 0xA650, 0x540C, + 0xA651, 0x540A, 0xA652, 0x5410, 0xA653, 0x5401, 0xA654, 0x540B, + 0xA655, 0x5404, 0xA656, 0x5411, 0xA657, 0x540D, 0xA658, 0x5408, + 0xA659, 0x5403, 0xA65A, 0x540E, 0xA65B, 0x5406, 0xA65C, 0x5412, + 0xA65D, 0x56E0, 0xA65E, 0x56DE, 0xA65F, 0x56DD, 0xA660, 0x5733, + 0xA661, 0x5730, 0xA662, 0x5728, 0xA663, 0x572D, 0xA664, 0x572C, + 0xA665, 0x572F, 0xA666, 0x5729, 0xA667, 0x5919, 0xA668, 0x591A, + 0xA669, 0x5937, 0xA66A, 0x5938, 0xA66B, 0x5984, 0xA66C, 0x5978, + 0xA66D, 0x5983, 0xA66E, 0x597D, 0xA66F, 0x5979, 0xA670, 0x5982, + 0xA671, 0x5981, 0xA672, 0x5B57, 0xA673, 0x5B58, 0xA674, 0x5B87, + 0xA675, 0x5B88, 0xA676, 0x5B85, 0xA677, 0x5B89, 0xA678, 0x5BFA, + 0xA679, 0x5C16, 0xA67A, 0x5C79, 0xA67B, 0x5DDE, 0xA67C, 0x5E06, + 0xA67D, 0x5E76, 0xA67E, 0x5E74, 0xA6A1, 0x5F0F, 0xA6A2, 0x5F1B, + 0xA6A3, 0x5FD9, 0xA6A4, 0x5FD6, 0xA6A5, 0x620E, 0xA6A6, 0x620C, + 0xA6A7, 0x620D, 0xA6A8, 0x6210, 0xA6A9, 0x6263, 0xA6AA, 0x625B, + 0xA6AB, 0x6258, 0xA6AC, 0x6536, 0xA6AD, 0x65E9, 0xA6AE, 0x65E8, + 0xA6AF, 0x65EC, 0xA6B0, 0x65ED, 0xA6B1, 0x66F2, 0xA6B2, 0x66F3, + 0xA6B3, 0x6709, 0xA6B4, 0x673D, 0xA6B5, 0x6734, 0xA6B6, 0x6731, + 0xA6B7, 0x6735, 0xA6B8, 0x6B21, 0xA6B9, 0x6B64, 0xA6BA, 0x6B7B, + 0xA6BB, 0x6C16, 0xA6BC, 0x6C5D, 0xA6BD, 0x6C57, 0xA6BE, 0x6C59, + 0xA6BF, 0x6C5F, 0xA6C0, 0x6C60, 0xA6C1, 0x6C50, 0xA6C2, 0x6C55, + 0xA6C3, 0x6C61, 0xA6C4, 0x6C5B, 0xA6C5, 0x6C4D, 0xA6C6, 0x6C4E, + 0xA6C7, 0x7070, 0xA6C8, 0x725F, 0xA6C9, 0x725D, 0xA6CA, 0x767E, + 0xA6CB, 0x7AF9, 0xA6CC, 0x7C73, 0xA6CD, 0x7CF8, 0xA6CE, 0x7F36, + 0xA6CF, 0x7F8A, 0xA6D0, 0x7FBD, 0xA6D1, 0x8001, 0xA6D2, 0x8003, + 0xA6D3, 0x800C, 0xA6D4, 0x8012, 0xA6D5, 0x8033, 0xA6D6, 0x807F, + 0xA6D7, 0x8089, 0xA6D8, 0x808B, 0xA6D9, 0x808C, 0xA6DA, 0x81E3, + 0xA6DB, 0x81EA, 0xA6DC, 0x81F3, 0xA6DD, 0x81FC, 0xA6DE, 0x820C, + 0xA6DF, 0x821B, 0xA6E0, 0x821F, 0xA6E1, 0x826E, 0xA6E2, 0x8272, + 0xA6E3, 0x827E, 0xA6E4, 0x866B, 0xA6E5, 0x8840, 0xA6E6, 0x884C, + 0xA6E7, 0x8863, 0xA6E8, 0x897F, 0xA6E9, 0x9621, 0xA6EA, 0x4E32, + 0xA6EB, 0x4EA8, 0xA6EC, 0x4F4D, 0xA6ED, 0x4F4F, 0xA6EE, 0x4F47, + 0xA6EF, 0x4F57, 0xA6F0, 0x4F5E, 0xA6F1, 0x4F34, 0xA6F2, 0x4F5B, + 0xA6F3, 0x4F55, 0xA6F4, 0x4F30, 0xA6F5, 0x4F50, 0xA6F6, 0x4F51, + 0xA6F7, 0x4F3D, 0xA6F8, 0x4F3A, 0xA6F9, 0x4F38, 0xA6FA, 0x4F43, + 0xA6FB, 0x4F54, 0xA6FC, 0x4F3C, 0xA6FD, 0x4F46, 0xA6FE, 0x4F63, + 0xA740, 0x4F5C, 0xA741, 0x4F60, 0xA742, 0x4F2F, 0xA743, 0x4F4E, + 0xA744, 0x4F36, 0xA745, 0x4F59, 0xA746, 0x4F5D, 0xA747, 0x4F48, + 0xA748, 0x4F5A, 0xA749, 0x514C, 0xA74A, 0x514B, 0xA74B, 0x514D, + 0xA74C, 0x5175, 0xA74D, 0x51B6, 0xA74E, 0x51B7, 0xA74F, 0x5225, + 0xA750, 0x5224, 0xA751, 0x5229, 0xA752, 0x522A, 0xA753, 0x5228, + 0xA754, 0x52AB, 0xA755, 0x52A9, 0xA756, 0x52AA, 0xA757, 0x52AC, + 0xA758, 0x5323, 0xA759, 0x5373, 0xA75A, 0x5375, 0xA75B, 0x541D, + 0xA75C, 0x542D, 0xA75D, 0x541E, 0xA75E, 0x543E, 0xA75F, 0x5426, + 0xA760, 0x544E, 0xA761, 0x5427, 0xA762, 0x5446, 0xA763, 0x5443, + 0xA764, 0x5433, 0xA765, 0x5448, 0xA766, 0x5442, 0xA767, 0x541B, + 0xA768, 0x5429, 0xA769, 0x544A, 0xA76A, 0x5439, 0xA76B, 0x543B, + 0xA76C, 0x5438, 0xA76D, 0x542E, 0xA76E, 0x5435, 0xA76F, 0x5436, + 0xA770, 0x5420, 0xA771, 0x543C, 0xA772, 0x5440, 0xA773, 0x5431, + 0xA774, 0x542B, 0xA775, 0x541F, 0xA776, 0x542C, 0xA777, 0x56EA, + 0xA778, 0x56F0, 0xA779, 0x56E4, 0xA77A, 0x56EB, 0xA77B, 0x574A, + 0xA77C, 0x5751, 0xA77D, 0x5740, 0xA77E, 0x574D, 0xA7A1, 0x5747, + 0xA7A2, 0x574E, 0xA7A3, 0x573E, 0xA7A4, 0x5750, 0xA7A5, 0x574F, + 0xA7A6, 0x573B, 0xA7A7, 0x58EF, 0xA7A8, 0x593E, 0xA7A9, 0x599D, + 0xA7AA, 0x5992, 0xA7AB, 0x59A8, 0xA7AC, 0x599E, 0xA7AD, 0x59A3, + 0xA7AE, 0x5999, 0xA7AF, 0x5996, 0xA7B0, 0x598D, 0xA7B1, 0x59A4, + 0xA7B2, 0x5993, 0xA7B3, 0x598A, 0xA7B4, 0x59A5, 0xA7B5, 0x5B5D, + 0xA7B6, 0x5B5C, 0xA7B7, 0x5B5A, 0xA7B8, 0x5B5B, 0xA7B9, 0x5B8C, + 0xA7BA, 0x5B8B, 0xA7BB, 0x5B8F, 0xA7BC, 0x5C2C, 0xA7BD, 0x5C40, + 0xA7BE, 0x5C41, 0xA7BF, 0x5C3F, 0xA7C0, 0x5C3E, 0xA7C1, 0x5C90, + 0xA7C2, 0x5C91, 0xA7C3, 0x5C94, 0xA7C4, 0x5C8C, 0xA7C5, 0x5DEB, + 0xA7C6, 0x5E0C, 0xA7C7, 0x5E8F, 0xA7C8, 0x5E87, 0xA7C9, 0x5E8A, + 0xA7CA, 0x5EF7, 0xA7CB, 0x5F04, 0xA7CC, 0x5F1F, 0xA7CD, 0x5F64, + 0xA7CE, 0x5F62, 0xA7CF, 0x5F77, 0xA7D0, 0x5F79, 0xA7D1, 0x5FD8, + 0xA7D2, 0x5FCC, 0xA7D3, 0x5FD7, 0xA7D4, 0x5FCD, 0xA7D5, 0x5FF1, + 0xA7D6, 0x5FEB, 0xA7D7, 0x5FF8, 0xA7D8, 0x5FEA, 0xA7D9, 0x6212, + 0xA7DA, 0x6211, 0xA7DB, 0x6284, 0xA7DC, 0x6297, 0xA7DD, 0x6296, + 0xA7DE, 0x6280, 0xA7DF, 0x6276, 0xA7E0, 0x6289, 0xA7E1, 0x626D, + 0xA7E2, 0x628A, 0xA7E3, 0x627C, 0xA7E4, 0x627E, 0xA7E5, 0x6279, + 0xA7E6, 0x6273, 0xA7E7, 0x6292, 0xA7E8, 0x626F, 0xA7E9, 0x6298, + 0xA7EA, 0x626E, 0xA7EB, 0x6295, 0xA7EC, 0x6293, 0xA7ED, 0x6291, + 0xA7EE, 0x6286, 0xA7EF, 0x6539, 0xA7F0, 0x653B, 0xA7F1, 0x6538, + 0xA7F2, 0x65F1, 0xA7F3, 0x66F4, 0xA7F4, 0x675F, 0xA7F5, 0x674E, + 0xA7F6, 0x674F, 0xA7F7, 0x6750, 0xA7F8, 0x6751, 0xA7F9, 0x675C, + 0xA7FA, 0x6756, 0xA7FB, 0x675E, 0xA7FC, 0x6749, 0xA7FD, 0x6746, + 0xA7FE, 0x6760, 0xA840, 0x6753, 0xA841, 0x6757, 0xA842, 0x6B65, + 0xA843, 0x6BCF, 0xA844, 0x6C42, 0xA845, 0x6C5E, 0xA846, 0x6C99, + 0xA847, 0x6C81, 0xA848, 0x6C88, 0xA849, 0x6C89, 0xA84A, 0x6C85, + 0xA84B, 0x6C9B, 0xA84C, 0x6C6A, 0xA84D, 0x6C7A, 0xA84E, 0x6C90, + 0xA84F, 0x6C70, 0xA850, 0x6C8C, 0xA851, 0x6C68, 0xA852, 0x6C96, + 0xA853, 0x6C92, 0xA854, 0x6C7D, 0xA855, 0x6C83, 0xA856, 0x6C72, + 0xA857, 0x6C7E, 0xA858, 0x6C74, 0xA859, 0x6C86, 0xA85A, 0x6C76, + 0xA85B, 0x6C8D, 0xA85C, 0x6C94, 0xA85D, 0x6C98, 0xA85E, 0x6C82, + 0xA85F, 0x7076, 0xA860, 0x707C, 0xA861, 0x707D, 0xA862, 0x7078, + 0xA863, 0x7262, 0xA864, 0x7261, 0xA865, 0x7260, 0xA866, 0x72C4, + 0xA867, 0x72C2, 0xA868, 0x7396, 0xA869, 0x752C, 0xA86A, 0x752B, + 0xA86B, 0x7537, 0xA86C, 0x7538, 0xA86D, 0x7682, 0xA86E, 0x76EF, + 0xA86F, 0x77E3, 0xA870, 0x79C1, 0xA871, 0x79C0, 0xA872, 0x79BF, + 0xA873, 0x7A76, 0xA874, 0x7CFB, 0xA875, 0x7F55, 0xA876, 0x8096, + 0xA877, 0x8093, 0xA878, 0x809D, 0xA879, 0x8098, 0xA87A, 0x809B, + 0xA87B, 0x809A, 0xA87C, 0x80B2, 0xA87D, 0x826F, 0xA87E, 0x8292, + 0xA8A1, 0x828B, 0xA8A2, 0x828D, 0xA8A3, 0x898B, 0xA8A4, 0x89D2, + 0xA8A5, 0x8A00, 0xA8A6, 0x8C37, 0xA8A7, 0x8C46, 0xA8A8, 0x8C55, + 0xA8A9, 0x8C9D, 0xA8AA, 0x8D64, 0xA8AB, 0x8D70, 0xA8AC, 0x8DB3, + 0xA8AD, 0x8EAB, 0xA8AE, 0x8ECA, 0xA8AF, 0x8F9B, 0xA8B0, 0x8FB0, + 0xA8B1, 0x8FC2, 0xA8B2, 0x8FC6, 0xA8B3, 0x8FC5, 0xA8B4, 0x8FC4, + 0xA8B5, 0x5DE1, 0xA8B6, 0x9091, 0xA8B7, 0x90A2, 0xA8B8, 0x90AA, + 0xA8B9, 0x90A6, 0xA8BA, 0x90A3, 0xA8BB, 0x9149, 0xA8BC, 0x91C6, + 0xA8BD, 0x91CC, 0xA8BE, 0x9632, 0xA8BF, 0x962E, 0xA8C0, 0x9631, + 0xA8C1, 0x962A, 0xA8C2, 0x962C, 0xA8C3, 0x4E26, 0xA8C4, 0x4E56, + 0xA8C5, 0x4E73, 0xA8C6, 0x4E8B, 0xA8C7, 0x4E9B, 0xA8C8, 0x4E9E, + 0xA8C9, 0x4EAB, 0xA8CA, 0x4EAC, 0xA8CB, 0x4F6F, 0xA8CC, 0x4F9D, + 0xA8CD, 0x4F8D, 0xA8CE, 0x4F73, 0xA8CF, 0x4F7F, 0xA8D0, 0x4F6C, + 0xA8D1, 0x4F9B, 0xA8D2, 0x4F8B, 0xA8D3, 0x4F86, 0xA8D4, 0x4F83, + 0xA8D5, 0x4F70, 0xA8D6, 0x4F75, 0xA8D7, 0x4F88, 0xA8D8, 0x4F69, + 0xA8D9, 0x4F7B, 0xA8DA, 0x4F96, 0xA8DB, 0x4F7E, 0xA8DC, 0x4F8F, + 0xA8DD, 0x4F91, 0xA8DE, 0x4F7A, 0xA8DF, 0x5154, 0xA8E0, 0x5152, + 0xA8E1, 0x5155, 0xA8E2, 0x5169, 0xA8E3, 0x5177, 0xA8E4, 0x5176, + 0xA8E5, 0x5178, 0xA8E6, 0x51BD, 0xA8E7, 0x51FD, 0xA8E8, 0x523B, + 0xA8E9, 0x5238, 0xA8EA, 0x5237, 0xA8EB, 0x523A, 0xA8EC, 0x5230, + 0xA8ED, 0x522E, 0xA8EE, 0x5236, 0xA8EF, 0x5241, 0xA8F0, 0x52BE, + 0xA8F1, 0x52BB, 0xA8F2, 0x5352, 0xA8F3, 0x5354, 0xA8F4, 0x5353, + 0xA8F5, 0x5351, 0xA8F6, 0x5366, 0xA8F7, 0x5377, 0xA8F8, 0x5378, + 0xA8F9, 0x5379, 0xA8FA, 0x53D6, 0xA8FB, 0x53D4, 0xA8FC, 0x53D7, + 0xA8FD, 0x5473, 0xA8FE, 0x5475, 0xA940, 0x5496, 0xA941, 0x5478, + 0xA942, 0x5495, 0xA943, 0x5480, 0xA944, 0x547B, 0xA945, 0x5477, + 0xA946, 0x5484, 0xA947, 0x5492, 0xA948, 0x5486, 0xA949, 0x547C, + 0xA94A, 0x5490, 0xA94B, 0x5471, 0xA94C, 0x5476, 0xA94D, 0x548C, + 0xA94E, 0x549A, 0xA94F, 0x5462, 0xA950, 0x5468, 0xA951, 0x548B, + 0xA952, 0x547D, 0xA953, 0x548E, 0xA954, 0x56FA, 0xA955, 0x5783, + 0xA956, 0x5777, 0xA957, 0x576A, 0xA958, 0x5769, 0xA959, 0x5761, + 0xA95A, 0x5766, 0xA95B, 0x5764, 0xA95C, 0x577C, 0xA95D, 0x591C, + 0xA95E, 0x5949, 0xA95F, 0x5947, 0xA960, 0x5948, 0xA961, 0x5944, + 0xA962, 0x5954, 0xA963, 0x59BE, 0xA964, 0x59BB, 0xA965, 0x59D4, + 0xA966, 0x59B9, 0xA967, 0x59AE, 0xA968, 0x59D1, 0xA969, 0x59C6, + 0xA96A, 0x59D0, 0xA96B, 0x59CD, 0xA96C, 0x59CB, 0xA96D, 0x59D3, + 0xA96E, 0x59CA, 0xA96F, 0x59AF, 0xA970, 0x59B3, 0xA971, 0x59D2, + 0xA972, 0x59C5, 0xA973, 0x5B5F, 0xA974, 0x5B64, 0xA975, 0x5B63, + 0xA976, 0x5B97, 0xA977, 0x5B9A, 0xA978, 0x5B98, 0xA979, 0x5B9C, + 0xA97A, 0x5B99, 0xA97B, 0x5B9B, 0xA97C, 0x5C1A, 0xA97D, 0x5C48, + 0xA97E, 0x5C45, 0xA9A1, 0x5C46, 0xA9A2, 0x5CB7, 0xA9A3, 0x5CA1, + 0xA9A4, 0x5CB8, 0xA9A5, 0x5CA9, 0xA9A6, 0x5CAB, 0xA9A7, 0x5CB1, + 0xA9A8, 0x5CB3, 0xA9A9, 0x5E18, 0xA9AA, 0x5E1A, 0xA9AB, 0x5E16, + 0xA9AC, 0x5E15, 0xA9AD, 0x5E1B, 0xA9AE, 0x5E11, 0xA9AF, 0x5E78, + 0xA9B0, 0x5E9A, 0xA9B1, 0x5E97, 0xA9B2, 0x5E9C, 0xA9B3, 0x5E95, + 0xA9B4, 0x5E96, 0xA9B5, 0x5EF6, 0xA9B6, 0x5F26, 0xA9B7, 0x5F27, + 0xA9B8, 0x5F29, 0xA9B9, 0x5F80, 0xA9BA, 0x5F81, 0xA9BB, 0x5F7F, + 0xA9BC, 0x5F7C, 0xA9BD, 0x5FDD, 0xA9BE, 0x5FE0, 0xA9BF, 0x5FFD, + 0xA9C0, 0x5FF5, 0xA9C1, 0x5FFF, 0xA9C2, 0x600F, 0xA9C3, 0x6014, + 0xA9C4, 0x602F, 0xA9C5, 0x6035, 0xA9C6, 0x6016, 0xA9C7, 0x602A, + 0xA9C8, 0x6015, 0xA9C9, 0x6021, 0xA9CA, 0x6027, 0xA9CB, 0x6029, + 0xA9CC, 0x602B, 0xA9CD, 0x601B, 0xA9CE, 0x6216, 0xA9CF, 0x6215, + 0xA9D0, 0x623F, 0xA9D1, 0x623E, 0xA9D2, 0x6240, 0xA9D3, 0x627F, + 0xA9D4, 0x62C9, 0xA9D5, 0x62CC, 0xA9D6, 0x62C4, 0xA9D7, 0x62BF, + 0xA9D8, 0x62C2, 0xA9D9, 0x62B9, 0xA9DA, 0x62D2, 0xA9DB, 0x62DB, + 0xA9DC, 0x62AB, 0xA9DD, 0x62D3, 0xA9DE, 0x62D4, 0xA9DF, 0x62CB, + 0xA9E0, 0x62C8, 0xA9E1, 0x62A8, 0xA9E2, 0x62BD, 0xA9E3, 0x62BC, + 0xA9E4, 0x62D0, 0xA9E5, 0x62D9, 0xA9E6, 0x62C7, 0xA9E7, 0x62CD, + 0xA9E8, 0x62B5, 0xA9E9, 0x62DA, 0xA9EA, 0x62B1, 0xA9EB, 0x62D8, + 0xA9EC, 0x62D6, 0xA9ED, 0x62D7, 0xA9EE, 0x62C6, 0xA9EF, 0x62AC, + 0xA9F0, 0x62CE, 0xA9F1, 0x653E, 0xA9F2, 0x65A7, 0xA9F3, 0x65BC, + 0xA9F4, 0x65FA, 0xA9F5, 0x6614, 0xA9F6, 0x6613, 0xA9F7, 0x660C, + 0xA9F8, 0x6606, 0xA9F9, 0x6602, 0xA9FA, 0x660E, 0xA9FB, 0x6600, + 0xA9FC, 0x660F, 0xA9FD, 0x6615, 0xA9FE, 0x660A, 0xAA40, 0x6607, + 0xAA41, 0x670D, 0xAA42, 0x670B, 0xAA43, 0x676D, 0xAA44, 0x678B, + 0xAA45, 0x6795, 0xAA46, 0x6771, 0xAA47, 0x679C, 0xAA48, 0x6773, + 0xAA49, 0x6777, 0xAA4A, 0x6787, 0xAA4B, 0x679D, 0xAA4C, 0x6797, + 0xAA4D, 0x676F, 0xAA4E, 0x6770, 0xAA4F, 0x677F, 0xAA50, 0x6789, + 0xAA51, 0x677E, 0xAA52, 0x6790, 0xAA53, 0x6775, 0xAA54, 0x679A, + 0xAA55, 0x6793, 0xAA56, 0x677C, 0xAA57, 0x676A, 0xAA58, 0x6772, + 0xAA59, 0x6B23, 0xAA5A, 0x6B66, 0xAA5B, 0x6B67, 0xAA5C, 0x6B7F, + 0xAA5D, 0x6C13, 0xAA5E, 0x6C1B, 0xAA5F, 0x6CE3, 0xAA60, 0x6CE8, + 0xAA61, 0x6CF3, 0xAA62, 0x6CB1, 0xAA63, 0x6CCC, 0xAA64, 0x6CE5, + 0xAA65, 0x6CB3, 0xAA66, 0x6CBD, 0xAA67, 0x6CBE, 0xAA68, 0x6CBC, + 0xAA69, 0x6CE2, 0xAA6A, 0x6CAB, 0xAA6B, 0x6CD5, 0xAA6C, 0x6CD3, + 0xAA6D, 0x6CB8, 0xAA6E, 0x6CC4, 0xAA6F, 0x6CB9, 0xAA70, 0x6CC1, + 0xAA71, 0x6CAE, 0xAA72, 0x6CD7, 0xAA73, 0x6CC5, 0xAA74, 0x6CF1, + 0xAA75, 0x6CBF, 0xAA76, 0x6CBB, 0xAA77, 0x6CE1, 0xAA78, 0x6CDB, + 0xAA79, 0x6CCA, 0xAA7A, 0x6CAC, 0xAA7B, 0x6CEF, 0xAA7C, 0x6CDC, + 0xAA7D, 0x6CD6, 0xAA7E, 0x6CE0, 0xAAA1, 0x7095, 0xAAA2, 0x708E, + 0xAAA3, 0x7092, 0xAAA4, 0x708A, 0xAAA5, 0x7099, 0xAAA6, 0x722C, + 0xAAA7, 0x722D, 0xAAA8, 0x7238, 0xAAA9, 0x7248, 0xAAAA, 0x7267, + 0xAAAB, 0x7269, 0xAAAC, 0x72C0, 0xAAAD, 0x72CE, 0xAAAE, 0x72D9, + 0xAAAF, 0x72D7, 0xAAB0, 0x72D0, 0xAAB1, 0x73A9, 0xAAB2, 0x73A8, + 0xAAB3, 0x739F, 0xAAB4, 0x73AB, 0xAAB5, 0x73A5, 0xAAB6, 0x753D, + 0xAAB7, 0x759D, 0xAAB8, 0x7599, 0xAAB9, 0x759A, 0xAABA, 0x7684, + 0xAABB, 0x76C2, 0xAABC, 0x76F2, 0xAABD, 0x76F4, 0xAABE, 0x77E5, + 0xAABF, 0x77FD, 0xAAC0, 0x793E, 0xAAC1, 0x7940, 0xAAC2, 0x7941, + 0xAAC3, 0x79C9, 0xAAC4, 0x79C8, 0xAAC5, 0x7A7A, 0xAAC6, 0x7A79, + 0xAAC7, 0x7AFA, 0xAAC8, 0x7CFE, 0xAAC9, 0x7F54, 0xAACA, 0x7F8C, + 0xAACB, 0x7F8B, 0xAACC, 0x8005, 0xAACD, 0x80BA, 0xAACE, 0x80A5, + 0xAACF, 0x80A2, 0xAAD0, 0x80B1, 0xAAD1, 0x80A1, 0xAAD2, 0x80AB, + 0xAAD3, 0x80A9, 0xAAD4, 0x80B4, 0xAAD5, 0x80AA, 0xAAD6, 0x80AF, + 0xAAD7, 0x81E5, 0xAAD8, 0x81FE, 0xAAD9, 0x820D, 0xAADA, 0x82B3, + 0xAADB, 0x829D, 0xAADC, 0x8299, 0xAADD, 0x82AD, 0xAADE, 0x82BD, + 0xAADF, 0x829F, 0xAAE0, 0x82B9, 0xAAE1, 0x82B1, 0xAAE2, 0x82AC, + 0xAAE3, 0x82A5, 0xAAE4, 0x82AF, 0xAAE5, 0x82B8, 0xAAE6, 0x82A3, + 0xAAE7, 0x82B0, 0xAAE8, 0x82BE, 0xAAE9, 0x82B7, 0xAAEA, 0x864E, + 0xAAEB, 0x8671, 0xAAEC, 0x521D, 0xAAED, 0x8868, 0xAAEE, 0x8ECB, + 0xAAEF, 0x8FCE, 0xAAF0, 0x8FD4, 0xAAF1, 0x8FD1, 0xAAF2, 0x90B5, + 0xAAF3, 0x90B8, 0xAAF4, 0x90B1, 0xAAF5, 0x90B6, 0xAAF6, 0x91C7, + 0xAAF7, 0x91D1, 0xAAF8, 0x9577, 0xAAF9, 0x9580, 0xAAFA, 0x961C, + 0xAAFB, 0x9640, 0xAAFC, 0x963F, 0xAAFD, 0x963B, 0xAAFE, 0x9644, + 0xAB40, 0x9642, 0xAB41, 0x96B9, 0xAB42, 0x96E8, 0xAB43, 0x9752, + 0xAB44, 0x975E, 0xAB45, 0x4E9F, 0xAB46, 0x4EAD, 0xAB47, 0x4EAE, + 0xAB48, 0x4FE1, 0xAB49, 0x4FB5, 0xAB4A, 0x4FAF, 0xAB4B, 0x4FBF, + 0xAB4C, 0x4FE0, 0xAB4D, 0x4FD1, 0xAB4E, 0x4FCF, 0xAB4F, 0x4FDD, + 0xAB50, 0x4FC3, 0xAB51, 0x4FB6, 0xAB52, 0x4FD8, 0xAB53, 0x4FDF, + 0xAB54, 0x4FCA, 0xAB55, 0x4FD7, 0xAB56, 0x4FAE, 0xAB57, 0x4FD0, + 0xAB58, 0x4FC4, 0xAB59, 0x4FC2, 0xAB5A, 0x4FDA, 0xAB5B, 0x4FCE, + 0xAB5C, 0x4FDE, 0xAB5D, 0x4FB7, 0xAB5E, 0x5157, 0xAB5F, 0x5192, + 0xAB60, 0x5191, 0xAB61, 0x51A0, 0xAB62, 0x524E, 0xAB63, 0x5243, + 0xAB64, 0x524A, 0xAB65, 0x524D, 0xAB66, 0x524C, 0xAB67, 0x524B, + 0xAB68, 0x5247, 0xAB69, 0x52C7, 0xAB6A, 0x52C9, 0xAB6B, 0x52C3, + 0xAB6C, 0x52C1, 0xAB6D, 0x530D, 0xAB6E, 0x5357, 0xAB6F, 0x537B, + 0xAB70, 0x539A, 0xAB71, 0x53DB, 0xAB72, 0x54AC, 0xAB73, 0x54C0, + 0xAB74, 0x54A8, 0xAB75, 0x54CE, 0xAB76, 0x54C9, 0xAB77, 0x54B8, + 0xAB78, 0x54A6, 0xAB79, 0x54B3, 0xAB7A, 0x54C7, 0xAB7B, 0x54C2, + 0xAB7C, 0x54BD, 0xAB7D, 0x54AA, 0xAB7E, 0x54C1, 0xABA1, 0x54C4, + 0xABA2, 0x54C8, 0xABA3, 0x54AF, 0xABA4, 0x54AB, 0xABA5, 0x54B1, + 0xABA6, 0x54BB, 0xABA7, 0x54A9, 0xABA8, 0x54A7, 0xABA9, 0x54BF, + 0xABAA, 0x56FF, 0xABAB, 0x5782, 0xABAC, 0x578B, 0xABAD, 0x57A0, + 0xABAE, 0x57A3, 0xABAF, 0x57A2, 0xABB0, 0x57CE, 0xABB1, 0x57AE, + 0xABB2, 0x5793, 0xABB3, 0x5955, 0xABB4, 0x5951, 0xABB5, 0x594F, + 0xABB6, 0x594E, 0xABB7, 0x5950, 0xABB8, 0x59DC, 0xABB9, 0x59D8, + 0xABBA, 0x59FF, 0xABBB, 0x59E3, 0xABBC, 0x59E8, 0xABBD, 0x5A03, + 0xABBE, 0x59E5, 0xABBF, 0x59EA, 0xABC0, 0x59DA, 0xABC1, 0x59E6, + 0xABC2, 0x5A01, 0xABC3, 0x59FB, 0xABC4, 0x5B69, 0xABC5, 0x5BA3, + 0xABC6, 0x5BA6, 0xABC7, 0x5BA4, 0xABC8, 0x5BA2, 0xABC9, 0x5BA5, + 0xABCA, 0x5C01, 0xABCB, 0x5C4E, 0xABCC, 0x5C4F, 0xABCD, 0x5C4D, + 0xABCE, 0x5C4B, 0xABCF, 0x5CD9, 0xABD0, 0x5CD2, 0xABD1, 0x5DF7, + 0xABD2, 0x5E1D, 0xABD3, 0x5E25, 0xABD4, 0x5E1F, 0xABD5, 0x5E7D, + 0xABD6, 0x5EA0, 0xABD7, 0x5EA6, 0xABD8, 0x5EFA, 0xABD9, 0x5F08, + 0xABDA, 0x5F2D, 0xABDB, 0x5F65, 0xABDC, 0x5F88, 0xABDD, 0x5F85, + 0xABDE, 0x5F8A, 0xABDF, 0x5F8B, 0xABE0, 0x5F87, 0xABE1, 0x5F8C, + 0xABE2, 0x5F89, 0xABE3, 0x6012, 0xABE4, 0x601D, 0xABE5, 0x6020, + 0xABE6, 0x6025, 0xABE7, 0x600E, 0xABE8, 0x6028, 0xABE9, 0x604D, + 0xABEA, 0x6070, 0xABEB, 0x6068, 0xABEC, 0x6062, 0xABED, 0x6046, + 0xABEE, 0x6043, 0xABEF, 0x606C, 0xABF0, 0x606B, 0xABF1, 0x606A, + 0xABF2, 0x6064, 0xABF3, 0x6241, 0xABF4, 0x62DC, 0xABF5, 0x6316, + 0xABF6, 0x6309, 0xABF7, 0x62FC, 0xABF8, 0x62ED, 0xABF9, 0x6301, + 0xABFA, 0x62EE, 0xABFB, 0x62FD, 0xABFC, 0x6307, 0xABFD, 0x62F1, + 0xABFE, 0x62F7, 0xAC40, 0x62EF, 0xAC41, 0x62EC, 0xAC42, 0x62FE, + 0xAC43, 0x62F4, 0xAC44, 0x6311, 0xAC45, 0x6302, 0xAC46, 0x653F, + 0xAC47, 0x6545, 0xAC48, 0x65AB, 0xAC49, 0x65BD, 0xAC4A, 0x65E2, + 0xAC4B, 0x6625, 0xAC4C, 0x662D, 0xAC4D, 0x6620, 0xAC4E, 0x6627, + 0xAC4F, 0x662F, 0xAC50, 0x661F, 0xAC51, 0x6628, 0xAC52, 0x6631, + 0xAC53, 0x6624, 0xAC54, 0x66F7, 0xAC55, 0x67FF, 0xAC56, 0x67D3, + 0xAC57, 0x67F1, 0xAC58, 0x67D4, 0xAC59, 0x67D0, 0xAC5A, 0x67EC, + 0xAC5B, 0x67B6, 0xAC5C, 0x67AF, 0xAC5D, 0x67F5, 0xAC5E, 0x67E9, + 0xAC5F, 0x67EF, 0xAC60, 0x67C4, 0xAC61, 0x67D1, 0xAC62, 0x67B4, + 0xAC63, 0x67DA, 0xAC64, 0x67E5, 0xAC65, 0x67B8, 0xAC66, 0x67CF, + 0xAC67, 0x67DE, 0xAC68, 0x67F3, 0xAC69, 0x67B0, 0xAC6A, 0x67D9, + 0xAC6B, 0x67E2, 0xAC6C, 0x67DD, 0xAC6D, 0x67D2, 0xAC6E, 0x6B6A, + 0xAC6F, 0x6B83, 0xAC70, 0x6B86, 0xAC71, 0x6BB5, 0xAC72, 0x6BD2, + 0xAC73, 0x6BD7, 0xAC74, 0x6C1F, 0xAC75, 0x6CC9, 0xAC76, 0x6D0B, + 0xAC77, 0x6D32, 0xAC78, 0x6D2A, 0xAC79, 0x6D41, 0xAC7A, 0x6D25, + 0xAC7B, 0x6D0C, 0xAC7C, 0x6D31, 0xAC7D, 0x6D1E, 0xAC7E, 0x6D17, + 0xACA1, 0x6D3B, 0xACA2, 0x6D3D, 0xACA3, 0x6D3E, 0xACA4, 0x6D36, + 0xACA5, 0x6D1B, 0xACA6, 0x6CF5, 0xACA7, 0x6D39, 0xACA8, 0x6D27, + 0xACA9, 0x6D38, 0xACAA, 0x6D29, 0xACAB, 0x6D2E, 0xACAC, 0x6D35, + 0xACAD, 0x6D0E, 0xACAE, 0x6D2B, 0xACAF, 0x70AB, 0xACB0, 0x70BA, + 0xACB1, 0x70B3, 0xACB2, 0x70AC, 0xACB3, 0x70AF, 0xACB4, 0x70AD, + 0xACB5, 0x70B8, 0xACB6, 0x70AE, 0xACB7, 0x70A4, 0xACB8, 0x7230, + 0xACB9, 0x7272, 0xACBA, 0x726F, 0xACBB, 0x7274, 0xACBC, 0x72E9, + 0xACBD, 0x72E0, 0xACBE, 0x72E1, 0xACBF, 0x73B7, 0xACC0, 0x73CA, + 0xACC1, 0x73BB, 0xACC2, 0x73B2, 0xACC3, 0x73CD, 0xACC4, 0x73C0, + 0xACC5, 0x73B3, 0xACC6, 0x751A, 0xACC7, 0x752D, 0xACC8, 0x754F, + 0xACC9, 0x754C, 0xACCA, 0x754E, 0xACCB, 0x754B, 0xACCC, 0x75AB, + 0xACCD, 0x75A4, 0xACCE, 0x75A5, 0xACCF, 0x75A2, 0xACD0, 0x75A3, + 0xACD1, 0x7678, 0xACD2, 0x7686, 0xACD3, 0x7687, 0xACD4, 0x7688, + 0xACD5, 0x76C8, 0xACD6, 0x76C6, 0xACD7, 0x76C3, 0xACD8, 0x76C5, + 0xACD9, 0x7701, 0xACDA, 0x76F9, 0xACDB, 0x76F8, 0xACDC, 0x7709, + 0xACDD, 0x770B, 0xACDE, 0x76FE, 0xACDF, 0x76FC, 0xACE0, 0x7707, + 0xACE1, 0x77DC, 0xACE2, 0x7802, 0xACE3, 0x7814, 0xACE4, 0x780C, + 0xACE5, 0x780D, 0xACE6, 0x7946, 0xACE7, 0x7949, 0xACE8, 0x7948, + 0xACE9, 0x7947, 0xACEA, 0x79B9, 0xACEB, 0x79BA, 0xACEC, 0x79D1, + 0xACED, 0x79D2, 0xACEE, 0x79CB, 0xACEF, 0x7A7F, 0xACF0, 0x7A81, + 0xACF1, 0x7AFF, 0xACF2, 0x7AFD, 0xACF3, 0x7C7D, 0xACF4, 0x7D02, + 0xACF5, 0x7D05, 0xACF6, 0x7D00, 0xACF7, 0x7D09, 0xACF8, 0x7D07, + 0xACF9, 0x7D04, 0xACFA, 0x7D06, 0xACFB, 0x7F38, 0xACFC, 0x7F8E, + 0xACFD, 0x7FBF, 0xACFE, 0x8004, 0xAD40, 0x8010, 0xAD41, 0x800D, + 0xAD42, 0x8011, 0xAD43, 0x8036, 0xAD44, 0x80D6, 0xAD45, 0x80E5, + 0xAD46, 0x80DA, 0xAD47, 0x80C3, 0xAD48, 0x80C4, 0xAD49, 0x80CC, + 0xAD4A, 0x80E1, 0xAD4B, 0x80DB, 0xAD4C, 0x80CE, 0xAD4D, 0x80DE, + 0xAD4E, 0x80E4, 0xAD4F, 0x80DD, 0xAD50, 0x81F4, 0xAD51, 0x8222, + 0xAD52, 0x82E7, 0xAD53, 0x8303, 0xAD54, 0x8305, 0xAD55, 0x82E3, + 0xAD56, 0x82DB, 0xAD57, 0x82E6, 0xAD58, 0x8304, 0xAD59, 0x82E5, + 0xAD5A, 0x8302, 0xAD5B, 0x8309, 0xAD5C, 0x82D2, 0xAD5D, 0x82D7, + 0xAD5E, 0x82F1, 0xAD5F, 0x8301, 0xAD60, 0x82DC, 0xAD61, 0x82D4, + 0xAD62, 0x82D1, 0xAD63, 0x82DE, 0xAD64, 0x82D3, 0xAD65, 0x82DF, + 0xAD66, 0x82EF, 0xAD67, 0x8306, 0xAD68, 0x8650, 0xAD69, 0x8679, + 0xAD6A, 0x867B, 0xAD6B, 0x867A, 0xAD6C, 0x884D, 0xAD6D, 0x886B, + 0xAD6E, 0x8981, 0xAD6F, 0x89D4, 0xAD70, 0x8A08, 0xAD71, 0x8A02, + 0xAD72, 0x8A03, 0xAD73, 0x8C9E, 0xAD74, 0x8CA0, 0xAD75, 0x8D74, + 0xAD76, 0x8D73, 0xAD77, 0x8DB4, 0xAD78, 0x8ECD, 0xAD79, 0x8ECC, + 0xAD7A, 0x8FF0, 0xAD7B, 0x8FE6, 0xAD7C, 0x8FE2, 0xAD7D, 0x8FEA, + 0xAD7E, 0x8FE5, 0xADA1, 0x8FED, 0xADA2, 0x8FEB, 0xADA3, 0x8FE4, + 0xADA4, 0x8FE8, 0xADA5, 0x90CA, 0xADA6, 0x90CE, 0xADA7, 0x90C1, + 0xADA8, 0x90C3, 0xADA9, 0x914B, 0xADAA, 0x914A, 0xADAB, 0x91CD, + 0xADAC, 0x9582, 0xADAD, 0x9650, 0xADAE, 0x964B, 0xADAF, 0x964C, + 0xADB0, 0x964D, 0xADB1, 0x9762, 0xADB2, 0x9769, 0xADB3, 0x97CB, + 0xADB4, 0x97ED, 0xADB5, 0x97F3, 0xADB6, 0x9801, 0xADB7, 0x98A8, + 0xADB8, 0x98DB, 0xADB9, 0x98DF, 0xADBA, 0x9996, 0xADBB, 0x9999, + 0xADBC, 0x4E58, 0xADBD, 0x4EB3, 0xADBE, 0x500C, 0xADBF, 0x500D, + 0xADC0, 0x5023, 0xADC1, 0x4FEF, 0xADC2, 0x5026, 0xADC3, 0x5025, + 0xADC4, 0x4FF8, 0xADC5, 0x5029, 0xADC6, 0x5016, 0xADC7, 0x5006, + 0xADC8, 0x503C, 0xADC9, 0x501F, 0xADCA, 0x501A, 0xADCB, 0x5012, + 0xADCC, 0x5011, 0xADCD, 0x4FFA, 0xADCE, 0x5000, 0xADCF, 0x5014, + 0xADD0, 0x5028, 0xADD1, 0x4FF1, 0xADD2, 0x5021, 0xADD3, 0x500B, + 0xADD4, 0x5019, 0xADD5, 0x5018, 0xADD6, 0x4FF3, 0xADD7, 0x4FEE, + 0xADD8, 0x502D, 0xADD9, 0x502A, 0xADDA, 0x4FFE, 0xADDB, 0x502B, + 0xADDC, 0x5009, 0xADDD, 0x517C, 0xADDE, 0x51A4, 0xADDF, 0x51A5, + 0xADE0, 0x51A2, 0xADE1, 0x51CD, 0xADE2, 0x51CC, 0xADE3, 0x51C6, + 0xADE4, 0x51CB, 0xADE5, 0x5256, 0xADE6, 0x525C, 0xADE7, 0x5254, + 0xADE8, 0x525B, 0xADE9, 0x525D, 0xADEA, 0x532A, 0xADEB, 0x537F, + 0xADEC, 0x539F, 0xADED, 0x539D, 0xADEE, 0x53DF, 0xADEF, 0x54E8, + 0xADF0, 0x5510, 0xADF1, 0x5501, 0xADF2, 0x5537, 0xADF3, 0x54FC, + 0xADF4, 0x54E5, 0xADF5, 0x54F2, 0xADF6, 0x5506, 0xADF7, 0x54FA, + 0xADF8, 0x5514, 0xADF9, 0x54E9, 0xADFA, 0x54ED, 0xADFB, 0x54E1, + 0xADFC, 0x5509, 0xADFD, 0x54EE, 0xADFE, 0x54EA, 0xAE40, 0x54E6, + 0xAE41, 0x5527, 0xAE42, 0x5507, 0xAE43, 0x54FD, 0xAE44, 0x550F, + 0xAE45, 0x5703, 0xAE46, 0x5704, 0xAE47, 0x57C2, 0xAE48, 0x57D4, + 0xAE49, 0x57CB, 0xAE4A, 0x57C3, 0xAE4B, 0x5809, 0xAE4C, 0x590F, + 0xAE4D, 0x5957, 0xAE4E, 0x5958, 0xAE4F, 0x595A, 0xAE50, 0x5A11, + 0xAE51, 0x5A18, 0xAE52, 0x5A1C, 0xAE53, 0x5A1F, 0xAE54, 0x5A1B, + 0xAE55, 0x5A13, 0xAE56, 0x59EC, 0xAE57, 0x5A20, 0xAE58, 0x5A23, + 0xAE59, 0x5A29, 0xAE5A, 0x5A25, 0xAE5B, 0x5A0C, 0xAE5C, 0x5A09, + 0xAE5D, 0x5B6B, 0xAE5E, 0x5C58, 0xAE5F, 0x5BB0, 0xAE60, 0x5BB3, + 0xAE61, 0x5BB6, 0xAE62, 0x5BB4, 0xAE63, 0x5BAE, 0xAE64, 0x5BB5, + 0xAE65, 0x5BB9, 0xAE66, 0x5BB8, 0xAE67, 0x5C04, 0xAE68, 0x5C51, + 0xAE69, 0x5C55, 0xAE6A, 0x5C50, 0xAE6B, 0x5CED, 0xAE6C, 0x5CFD, + 0xAE6D, 0x5CFB, 0xAE6E, 0x5CEA, 0xAE6F, 0x5CE8, 0xAE70, 0x5CF0, + 0xAE71, 0x5CF6, 0xAE72, 0x5D01, 0xAE73, 0x5CF4, 0xAE74, 0x5DEE, + 0xAE75, 0x5E2D, 0xAE76, 0x5E2B, 0xAE77, 0x5EAB, 0xAE78, 0x5EAD, + 0xAE79, 0x5EA7, 0xAE7A, 0x5F31, 0xAE7B, 0x5F92, 0xAE7C, 0x5F91, + 0xAE7D, 0x5F90, 0xAE7E, 0x6059, 0xAEA1, 0x6063, 0xAEA2, 0x6065, + 0xAEA3, 0x6050, 0xAEA4, 0x6055, 0xAEA5, 0x606D, 0xAEA6, 0x6069, + 0xAEA7, 0x606F, 0xAEA8, 0x6084, 0xAEA9, 0x609F, 0xAEAA, 0x609A, + 0xAEAB, 0x608D, 0xAEAC, 0x6094, 0xAEAD, 0x608C, 0xAEAE, 0x6085, + 0xAEAF, 0x6096, 0xAEB0, 0x6247, 0xAEB1, 0x62F3, 0xAEB2, 0x6308, + 0xAEB3, 0x62FF, 0xAEB4, 0x634E, 0xAEB5, 0x633E, 0xAEB6, 0x632F, + 0xAEB7, 0x6355, 0xAEB8, 0x6342, 0xAEB9, 0x6346, 0xAEBA, 0x634F, + 0xAEBB, 0x6349, 0xAEBC, 0x633A, 0xAEBD, 0x6350, 0xAEBE, 0x633D, + 0xAEBF, 0x632A, 0xAEC0, 0x632B, 0xAEC1, 0x6328, 0xAEC2, 0x634D, + 0xAEC3, 0x634C, 0xAEC4, 0x6548, 0xAEC5, 0x6549, 0xAEC6, 0x6599, + 0xAEC7, 0x65C1, 0xAEC8, 0x65C5, 0xAEC9, 0x6642, 0xAECA, 0x6649, + 0xAECB, 0x664F, 0xAECC, 0x6643, 0xAECD, 0x6652, 0xAECE, 0x664C, + 0xAECF, 0x6645, 0xAED0, 0x6641, 0xAED1, 0x66F8, 0xAED2, 0x6714, + 0xAED3, 0x6715, 0xAED4, 0x6717, 0xAED5, 0x6821, 0xAED6, 0x6838, + 0xAED7, 0x6848, 0xAED8, 0x6846, 0xAED9, 0x6853, 0xAEDA, 0x6839, + 0xAEDB, 0x6842, 0xAEDC, 0x6854, 0xAEDD, 0x6829, 0xAEDE, 0x68B3, + 0xAEDF, 0x6817, 0xAEE0, 0x684C, 0xAEE1, 0x6851, 0xAEE2, 0x683D, + 0xAEE3, 0x67F4, 0xAEE4, 0x6850, 0xAEE5, 0x6840, 0xAEE6, 0x683C, + 0xAEE7, 0x6843, 0xAEE8, 0x682A, 0xAEE9, 0x6845, 0xAEEA, 0x6813, + 0xAEEB, 0x6818, 0xAEEC, 0x6841, 0xAEED, 0x6B8A, 0xAEEE, 0x6B89, + 0xAEEF, 0x6BB7, 0xAEF0, 0x6C23, 0xAEF1, 0x6C27, 0xAEF2, 0x6C28, + 0xAEF3, 0x6C26, 0xAEF4, 0x6C24, 0xAEF5, 0x6CF0, 0xAEF6, 0x6D6A, + 0xAEF7, 0x6D95, 0xAEF8, 0x6D88, 0xAEF9, 0x6D87, 0xAEFA, 0x6D66, + 0xAEFB, 0x6D78, 0xAEFC, 0x6D77, 0xAEFD, 0x6D59, 0xAEFE, 0x6D93, + 0xAF40, 0x6D6C, 0xAF41, 0x6D89, 0xAF42, 0x6D6E, 0xAF43, 0x6D5A, + 0xAF44, 0x6D74, 0xAF45, 0x6D69, 0xAF46, 0x6D8C, 0xAF47, 0x6D8A, + 0xAF48, 0x6D79, 0xAF49, 0x6D85, 0xAF4A, 0x6D65, 0xAF4B, 0x6D94, + 0xAF4C, 0x70CA, 0xAF4D, 0x70D8, 0xAF4E, 0x70E4, 0xAF4F, 0x70D9, + 0xAF50, 0x70C8, 0xAF51, 0x70CF, 0xAF52, 0x7239, 0xAF53, 0x7279, + 0xAF54, 0x72FC, 0xAF55, 0x72F9, 0xAF56, 0x72FD, 0xAF57, 0x72F8, + 0xAF58, 0x72F7, 0xAF59, 0x7386, 0xAF5A, 0x73ED, 0xAF5B, 0x7409, + 0xAF5C, 0x73EE, 0xAF5D, 0x73E0, 0xAF5E, 0x73EA, 0xAF5F, 0x73DE, + 0xAF60, 0x7554, 0xAF61, 0x755D, 0xAF62, 0x755C, 0xAF63, 0x755A, + 0xAF64, 0x7559, 0xAF65, 0x75BE, 0xAF66, 0x75C5, 0xAF67, 0x75C7, + 0xAF68, 0x75B2, 0xAF69, 0x75B3, 0xAF6A, 0x75BD, 0xAF6B, 0x75BC, + 0xAF6C, 0x75B9, 0xAF6D, 0x75C2, 0xAF6E, 0x75B8, 0xAF6F, 0x768B, + 0xAF70, 0x76B0, 0xAF71, 0x76CA, 0xAF72, 0x76CD, 0xAF73, 0x76CE, + 0xAF74, 0x7729, 0xAF75, 0x771F, 0xAF76, 0x7720, 0xAF77, 0x7728, + 0xAF78, 0x77E9, 0xAF79, 0x7830, 0xAF7A, 0x7827, 0xAF7B, 0x7838, + 0xAF7C, 0x781D, 0xAF7D, 0x7834, 0xAF7E, 0x7837, 0xAFA1, 0x7825, + 0xAFA2, 0x782D, 0xAFA3, 0x7820, 0xAFA4, 0x781F, 0xAFA5, 0x7832, + 0xAFA6, 0x7955, 0xAFA7, 0x7950, 0xAFA8, 0x7960, 0xAFA9, 0x795F, + 0xAFAA, 0x7956, 0xAFAB, 0x795E, 0xAFAC, 0x795D, 0xAFAD, 0x7957, + 0xAFAE, 0x795A, 0xAFAF, 0x79E4, 0xAFB0, 0x79E3, 0xAFB1, 0x79E7, + 0xAFB2, 0x79DF, 0xAFB3, 0x79E6, 0xAFB4, 0x79E9, 0xAFB5, 0x79D8, + 0xAFB6, 0x7A84, 0xAFB7, 0x7A88, 0xAFB8, 0x7AD9, 0xAFB9, 0x7B06, + 0xAFBA, 0x7B11, 0xAFBB, 0x7C89, 0xAFBC, 0x7D21, 0xAFBD, 0x7D17, + 0xAFBE, 0x7D0B, 0xAFBF, 0x7D0A, 0xAFC0, 0x7D20, 0xAFC1, 0x7D22, + 0xAFC2, 0x7D14, 0xAFC3, 0x7D10, 0xAFC4, 0x7D15, 0xAFC5, 0x7D1A, + 0xAFC6, 0x7D1C, 0xAFC7, 0x7D0D, 0xAFC8, 0x7D19, 0xAFC9, 0x7D1B, + 0xAFCA, 0x7F3A, 0xAFCB, 0x7F5F, 0xAFCC, 0x7F94, 0xAFCD, 0x7FC5, + 0xAFCE, 0x7FC1, 0xAFCF, 0x8006, 0xAFD0, 0x8018, 0xAFD1, 0x8015, + 0xAFD2, 0x8019, 0xAFD3, 0x8017, 0xAFD4, 0x803D, 0xAFD5, 0x803F, + 0xAFD6, 0x80F1, 0xAFD7, 0x8102, 0xAFD8, 0x80F0, 0xAFD9, 0x8105, + 0xAFDA, 0x80ED, 0xAFDB, 0x80F4, 0xAFDC, 0x8106, 0xAFDD, 0x80F8, + 0xAFDE, 0x80F3, 0xAFDF, 0x8108, 0xAFE0, 0x80FD, 0xAFE1, 0x810A, + 0xAFE2, 0x80FC, 0xAFE3, 0x80EF, 0xAFE4, 0x81ED, 0xAFE5, 0x81EC, + 0xAFE6, 0x8200, 0xAFE7, 0x8210, 0xAFE8, 0x822A, 0xAFE9, 0x822B, + 0xAFEA, 0x8228, 0xAFEB, 0x822C, 0xAFEC, 0x82BB, 0xAFED, 0x832B, + 0xAFEE, 0x8352, 0xAFEF, 0x8354, 0xAFF0, 0x834A, 0xAFF1, 0x8338, + 0xAFF2, 0x8350, 0xAFF3, 0x8349, 0xAFF4, 0x8335, 0xAFF5, 0x8334, + 0xAFF6, 0x834F, 0xAFF7, 0x8332, 0xAFF8, 0x8339, 0xAFF9, 0x8336, + 0xAFFA, 0x8317, 0xAFFB, 0x8340, 0xAFFC, 0x8331, 0xAFFD, 0x8328, + 0xAFFE, 0x8343, 0xB040, 0x8654, 0xB041, 0x868A, 0xB042, 0x86AA, + 0xB043, 0x8693, 0xB044, 0x86A4, 0xB045, 0x86A9, 0xB046, 0x868C, + 0xB047, 0x86A3, 0xB048, 0x869C, 0xB049, 0x8870, 0xB04A, 0x8877, + 0xB04B, 0x8881, 0xB04C, 0x8882, 0xB04D, 0x887D, 0xB04E, 0x8879, + 0xB04F, 0x8A18, 0xB050, 0x8A10, 0xB051, 0x8A0E, 0xB052, 0x8A0C, + 0xB053, 0x8A15, 0xB054, 0x8A0A, 0xB055, 0x8A17, 0xB056, 0x8A13, + 0xB057, 0x8A16, 0xB058, 0x8A0F, 0xB059, 0x8A11, 0xB05A, 0x8C48, + 0xB05B, 0x8C7A, 0xB05C, 0x8C79, 0xB05D, 0x8CA1, 0xB05E, 0x8CA2, + 0xB05F, 0x8D77, 0xB060, 0x8EAC, 0xB061, 0x8ED2, 0xB062, 0x8ED4, + 0xB063, 0x8ECF, 0xB064, 0x8FB1, 0xB065, 0x9001, 0xB066, 0x9006, + 0xB067, 0x8FF7, 0xB068, 0x9000, 0xB069, 0x8FFA, 0xB06A, 0x8FF4, + 0xB06B, 0x9003, 0xB06C, 0x8FFD, 0xB06D, 0x9005, 0xB06E, 0x8FF8, + 0xB06F, 0x9095, 0xB070, 0x90E1, 0xB071, 0x90DD, 0xB072, 0x90E2, + 0xB073, 0x9152, 0xB074, 0x914D, 0xB075, 0x914C, 0xB076, 0x91D8, + 0xB077, 0x91DD, 0xB078, 0x91D7, 0xB079, 0x91DC, 0xB07A, 0x91D9, + 0xB07B, 0x9583, 0xB07C, 0x9662, 0xB07D, 0x9663, 0xB07E, 0x9661, + 0xB0A1, 0x965B, 0xB0A2, 0x965D, 0xB0A3, 0x9664, 0xB0A4, 0x9658, + 0xB0A5, 0x965E, 0xB0A6, 0x96BB, 0xB0A7, 0x98E2, 0xB0A8, 0x99AC, + 0xB0A9, 0x9AA8, 0xB0AA, 0x9AD8, 0xB0AB, 0x9B25, 0xB0AC, 0x9B32, + 0xB0AD, 0x9B3C, 0xB0AE, 0x4E7E, 0xB0AF, 0x507A, 0xB0B0, 0x507D, + 0xB0B1, 0x505C, 0xB0B2, 0x5047, 0xB0B3, 0x5043, 0xB0B4, 0x504C, + 0xB0B5, 0x505A, 0xB0B6, 0x5049, 0xB0B7, 0x5065, 0xB0B8, 0x5076, + 0xB0B9, 0x504E, 0xB0BA, 0x5055, 0xB0BB, 0x5075, 0xB0BC, 0x5074, + 0xB0BD, 0x5077, 0xB0BE, 0x504F, 0xB0BF, 0x500F, 0xB0C0, 0x506F, + 0xB0C1, 0x506D, 0xB0C2, 0x515C, 0xB0C3, 0x5195, 0xB0C4, 0x51F0, + 0xB0C5, 0x526A, 0xB0C6, 0x526F, 0xB0C7, 0x52D2, 0xB0C8, 0x52D9, + 0xB0C9, 0x52D8, 0xB0CA, 0x52D5, 0xB0CB, 0x5310, 0xB0CC, 0x530F, + 0xB0CD, 0x5319, 0xB0CE, 0x533F, 0xB0CF, 0x5340, 0xB0D0, 0x533E, + 0xB0D1, 0x53C3, 0xB0D2, 0x66FC, 0xB0D3, 0x5546, 0xB0D4, 0x556A, + 0xB0D5, 0x5566, 0xB0D6, 0x5544, 0xB0D7, 0x555E, 0xB0D8, 0x5561, + 0xB0D9, 0x5543, 0xB0DA, 0x554A, 0xB0DB, 0x5531, 0xB0DC, 0x5556, + 0xB0DD, 0x554F, 0xB0DE, 0x5555, 0xB0DF, 0x552F, 0xB0E0, 0x5564, + 0xB0E1, 0x5538, 0xB0E2, 0x552E, 0xB0E3, 0x555C, 0xB0E4, 0x552C, + 0xB0E5, 0x5563, 0xB0E6, 0x5533, 0xB0E7, 0x5541, 0xB0E8, 0x5557, + 0xB0E9, 0x5708, 0xB0EA, 0x570B, 0xB0EB, 0x5709, 0xB0EC, 0x57DF, + 0xB0ED, 0x5805, 0xB0EE, 0x580A, 0xB0EF, 0x5806, 0xB0F0, 0x57E0, + 0xB0F1, 0x57E4, 0xB0F2, 0x57FA, 0xB0F3, 0x5802, 0xB0F4, 0x5835, + 0xB0F5, 0x57F7, 0xB0F6, 0x57F9, 0xB0F7, 0x5920, 0xB0F8, 0x5962, + 0xB0F9, 0x5A36, 0xB0FA, 0x5A41, 0xB0FB, 0x5A49, 0xB0FC, 0x5A66, + 0xB0FD, 0x5A6A, 0xB0FE, 0x5A40, 0xB140, 0x5A3C, 0xB141, 0x5A62, + 0xB142, 0x5A5A, 0xB143, 0x5A46, 0xB144, 0x5A4A, 0xB145, 0x5B70, + 0xB146, 0x5BC7, 0xB147, 0x5BC5, 0xB148, 0x5BC4, 0xB149, 0x5BC2, + 0xB14A, 0x5BBF, 0xB14B, 0x5BC6, 0xB14C, 0x5C09, 0xB14D, 0x5C08, + 0xB14E, 0x5C07, 0xB14F, 0x5C60, 0xB150, 0x5C5C, 0xB151, 0x5C5D, + 0xB152, 0x5D07, 0xB153, 0x5D06, 0xB154, 0x5D0E, 0xB155, 0x5D1B, + 0xB156, 0x5D16, 0xB157, 0x5D22, 0xB158, 0x5D11, 0xB159, 0x5D29, + 0xB15A, 0x5D14, 0xB15B, 0x5D19, 0xB15C, 0x5D24, 0xB15D, 0x5D27, + 0xB15E, 0x5D17, 0xB15F, 0x5DE2, 0xB160, 0x5E38, 0xB161, 0x5E36, + 0xB162, 0x5E33, 0xB163, 0x5E37, 0xB164, 0x5EB7, 0xB165, 0x5EB8, + 0xB166, 0x5EB6, 0xB167, 0x5EB5, 0xB168, 0x5EBE, 0xB169, 0x5F35, + 0xB16A, 0x5F37, 0xB16B, 0x5F57, 0xB16C, 0x5F6C, 0xB16D, 0x5F69, + 0xB16E, 0x5F6B, 0xB16F, 0x5F97, 0xB170, 0x5F99, 0xB171, 0x5F9E, + 0xB172, 0x5F98, 0xB173, 0x5FA1, 0xB174, 0x5FA0, 0xB175, 0x5F9C, + 0xB176, 0x607F, 0xB177, 0x60A3, 0xB178, 0x6089, 0xB179, 0x60A0, + 0xB17A, 0x60A8, 0xB17B, 0x60CB, 0xB17C, 0x60B4, 0xB17D, 0x60E6, + 0xB17E, 0x60BD, 0xB1A1, 0x60C5, 0xB1A2, 0x60BB, 0xB1A3, 0x60B5, + 0xB1A4, 0x60DC, 0xB1A5, 0x60BC, 0xB1A6, 0x60D8, 0xB1A7, 0x60D5, + 0xB1A8, 0x60C6, 0xB1A9, 0x60DF, 0xB1AA, 0x60B8, 0xB1AB, 0x60DA, + 0xB1AC, 0x60C7, 0xB1AD, 0x621A, 0xB1AE, 0x621B, 0xB1AF, 0x6248, + 0xB1B0, 0x63A0, 0xB1B1, 0x63A7, 0xB1B2, 0x6372, 0xB1B3, 0x6396, + 0xB1B4, 0x63A2, 0xB1B5, 0x63A5, 0xB1B6, 0x6377, 0xB1B7, 0x6367, + 0xB1B8, 0x6398, 0xB1B9, 0x63AA, 0xB1BA, 0x6371, 0xB1BB, 0x63A9, + 0xB1BC, 0x6389, 0xB1BD, 0x6383, 0xB1BE, 0x639B, 0xB1BF, 0x636B, + 0xB1C0, 0x63A8, 0xB1C1, 0x6384, 0xB1C2, 0x6388, 0xB1C3, 0x6399, + 0xB1C4, 0x63A1, 0xB1C5, 0x63AC, 0xB1C6, 0x6392, 0xB1C7, 0x638F, + 0xB1C8, 0x6380, 0xB1C9, 0x637B, 0xB1CA, 0x6369, 0xB1CB, 0x6368, + 0xB1CC, 0x637A, 0xB1CD, 0x655D, 0xB1CE, 0x6556, 0xB1CF, 0x6551, + 0xB1D0, 0x6559, 0xB1D1, 0x6557, 0xB1D2, 0x555F, 0xB1D3, 0x654F, + 0xB1D4, 0x6558, 0xB1D5, 0x6555, 0xB1D6, 0x6554, 0xB1D7, 0x659C, + 0xB1D8, 0x659B, 0xB1D9, 0x65AC, 0xB1DA, 0x65CF, 0xB1DB, 0x65CB, + 0xB1DC, 0x65CC, 0xB1DD, 0x65CE, 0xB1DE, 0x665D, 0xB1DF, 0x665A, + 0xB1E0, 0x6664, 0xB1E1, 0x6668, 0xB1E2, 0x6666, 0xB1E3, 0x665E, + 0xB1E4, 0x66F9, 0xB1E5, 0x52D7, 0xB1E6, 0x671B, 0xB1E7, 0x6881, + 0xB1E8, 0x68AF, 0xB1E9, 0x68A2, 0xB1EA, 0x6893, 0xB1EB, 0x68B5, + 0xB1EC, 0x687F, 0xB1ED, 0x6876, 0xB1EE, 0x68B1, 0xB1EF, 0x68A7, + 0xB1F0, 0x6897, 0xB1F1, 0x68B0, 0xB1F2, 0x6883, 0xB1F3, 0x68C4, + 0xB1F4, 0x68AD, 0xB1F5, 0x6886, 0xB1F6, 0x6885, 0xB1F7, 0x6894, + 0xB1F8, 0x689D, 0xB1F9, 0x68A8, 0xB1FA, 0x689F, 0xB1FB, 0x68A1, + 0xB1FC, 0x6882, 0xB1FD, 0x6B32, 0xB1FE, 0x6BBA, 0xB240, 0x6BEB, + 0xB241, 0x6BEC, 0xB242, 0x6C2B, 0xB243, 0x6D8E, 0xB244, 0x6DBC, + 0xB245, 0x6DF3, 0xB246, 0x6DD9, 0xB247, 0x6DB2, 0xB248, 0x6DE1, + 0xB249, 0x6DCC, 0xB24A, 0x6DE4, 0xB24B, 0x6DFB, 0xB24C, 0x6DFA, + 0xB24D, 0x6E05, 0xB24E, 0x6DC7, 0xB24F, 0x6DCB, 0xB250, 0x6DAF, + 0xB251, 0x6DD1, 0xB252, 0x6DAE, 0xB253, 0x6DDE, 0xB254, 0x6DF9, + 0xB255, 0x6DB8, 0xB256, 0x6DF7, 0xB257, 0x6DF5, 0xB258, 0x6DC5, + 0xB259, 0x6DD2, 0xB25A, 0x6E1A, 0xB25B, 0x6DB5, 0xB25C, 0x6DDA, + 0xB25D, 0x6DEB, 0xB25E, 0x6DD8, 0xB25F, 0x6DEA, 0xB260, 0x6DF1, + 0xB261, 0x6DEE, 0xB262, 0x6DE8, 0xB263, 0x6DC6, 0xB264, 0x6DC4, + 0xB265, 0x6DAA, 0xB266, 0x6DEC, 0xB267, 0x6DBF, 0xB268, 0x6DE6, + 0xB269, 0x70F9, 0xB26A, 0x7109, 0xB26B, 0x710A, 0xB26C, 0x70FD, + 0xB26D, 0x70EF, 0xB26E, 0x723D, 0xB26F, 0x727D, 0xB270, 0x7281, + 0xB271, 0x731C, 0xB272, 0x731B, 0xB273, 0x7316, 0xB274, 0x7313, + 0xB275, 0x7319, 0xB276, 0x7387, 0xB277, 0x7405, 0xB278, 0x740A, + 0xB279, 0x7403, 0xB27A, 0x7406, 0xB27B, 0x73FE, 0xB27C, 0x740D, + 0xB27D, 0x74E0, 0xB27E, 0x74F6, 0xB2A1, 0x74F7, 0xB2A2, 0x751C, + 0xB2A3, 0x7522, 0xB2A4, 0x7565, 0xB2A5, 0x7566, 0xB2A6, 0x7562, + 0xB2A7, 0x7570, 0xB2A8, 0x758F, 0xB2A9, 0x75D4, 0xB2AA, 0x75D5, + 0xB2AB, 0x75B5, 0xB2AC, 0x75CA, 0xB2AD, 0x75CD, 0xB2AE, 0x768E, + 0xB2AF, 0x76D4, 0xB2B0, 0x76D2, 0xB2B1, 0x76DB, 0xB2B2, 0x7737, + 0xB2B3, 0x773E, 0xB2B4, 0x773C, 0xB2B5, 0x7736, 0xB2B6, 0x7738, + 0xB2B7, 0x773A, 0xB2B8, 0x786B, 0xB2B9, 0x7843, 0xB2BA, 0x784E, + 0xB2BB, 0x7965, 0xB2BC, 0x7968, 0xB2BD, 0x796D, 0xB2BE, 0x79FB, + 0xB2BF, 0x7A92, 0xB2C0, 0x7A95, 0xB2C1, 0x7B20, 0xB2C2, 0x7B28, + 0xB2C3, 0x7B1B, 0xB2C4, 0x7B2C, 0xB2C5, 0x7B26, 0xB2C6, 0x7B19, + 0xB2C7, 0x7B1E, 0xB2C8, 0x7B2E, 0xB2C9, 0x7C92, 0xB2CA, 0x7C97, + 0xB2CB, 0x7C95, 0xB2CC, 0x7D46, 0xB2CD, 0x7D43, 0xB2CE, 0x7D71, + 0xB2CF, 0x7D2E, 0xB2D0, 0x7D39, 0xB2D1, 0x7D3C, 0xB2D2, 0x7D40, + 0xB2D3, 0x7D30, 0xB2D4, 0x7D33, 0xB2D5, 0x7D44, 0xB2D6, 0x7D2F, + 0xB2D7, 0x7D42, 0xB2D8, 0x7D32, 0xB2D9, 0x7D31, 0xB2DA, 0x7F3D, + 0xB2DB, 0x7F9E, 0xB2DC, 0x7F9A, 0xB2DD, 0x7FCC, 0xB2DE, 0x7FCE, + 0xB2DF, 0x7FD2, 0xB2E0, 0x801C, 0xB2E1, 0x804A, 0xB2E2, 0x8046, + 0xB2E3, 0x812F, 0xB2E4, 0x8116, 0xB2E5, 0x8123, 0xB2E6, 0x812B, + 0xB2E7, 0x8129, 0xB2E8, 0x8130, 0xB2E9, 0x8124, 0xB2EA, 0x8202, + 0xB2EB, 0x8235, 0xB2EC, 0x8237, 0xB2ED, 0x8236, 0xB2EE, 0x8239, + 0xB2EF, 0x838E, 0xB2F0, 0x839E, 0xB2F1, 0x8398, 0xB2F2, 0x8378, + 0xB2F3, 0x83A2, 0xB2F4, 0x8396, 0xB2F5, 0x83BD, 0xB2F6, 0x83AB, + 0xB2F7, 0x8392, 0xB2F8, 0x838A, 0xB2F9, 0x8393, 0xB2FA, 0x8389, + 0xB2FB, 0x83A0, 0xB2FC, 0x8377, 0xB2FD, 0x837B, 0xB2FE, 0x837C, + 0xB340, 0x8386, 0xB341, 0x83A7, 0xB342, 0x8655, 0xB343, 0x5F6A, + 0xB344, 0x86C7, 0xB345, 0x86C0, 0xB346, 0x86B6, 0xB347, 0x86C4, + 0xB348, 0x86B5, 0xB349, 0x86C6, 0xB34A, 0x86CB, 0xB34B, 0x86B1, + 0xB34C, 0x86AF, 0xB34D, 0x86C9, 0xB34E, 0x8853, 0xB34F, 0x889E, + 0xB350, 0x8888, 0xB351, 0x88AB, 0xB352, 0x8892, 0xB353, 0x8896, + 0xB354, 0x888D, 0xB355, 0x888B, 0xB356, 0x8993, 0xB357, 0x898F, + 0xB358, 0x8A2A, 0xB359, 0x8A1D, 0xB35A, 0x8A23, 0xB35B, 0x8A25, + 0xB35C, 0x8A31, 0xB35D, 0x8A2D, 0xB35E, 0x8A1F, 0xB35F, 0x8A1B, + 0xB360, 0x8A22, 0xB361, 0x8C49, 0xB362, 0x8C5A, 0xB363, 0x8CA9, + 0xB364, 0x8CAC, 0xB365, 0x8CAB, 0xB366, 0x8CA8, 0xB367, 0x8CAA, + 0xB368, 0x8CA7, 0xB369, 0x8D67, 0xB36A, 0x8D66, 0xB36B, 0x8DBE, + 0xB36C, 0x8DBA, 0xB36D, 0x8EDB, 0xB36E, 0x8EDF, 0xB36F, 0x9019, + 0xB370, 0x900D, 0xB371, 0x901A, 0xB372, 0x9017, 0xB373, 0x9023, + 0xB374, 0x901F, 0xB375, 0x901D, 0xB376, 0x9010, 0xB377, 0x9015, + 0xB378, 0x901E, 0xB379, 0x9020, 0xB37A, 0x900F, 0xB37B, 0x9022, + 0xB37C, 0x9016, 0xB37D, 0x901B, 0xB37E, 0x9014, 0xB3A1, 0x90E8, + 0xB3A2, 0x90ED, 0xB3A3, 0x90FD, 0xB3A4, 0x9157, 0xB3A5, 0x91CE, + 0xB3A6, 0x91F5, 0xB3A7, 0x91E6, 0xB3A8, 0x91E3, 0xB3A9, 0x91E7, + 0xB3AA, 0x91ED, 0xB3AB, 0x91E9, 0xB3AC, 0x9589, 0xB3AD, 0x966A, + 0xB3AE, 0x9675, 0xB3AF, 0x9673, 0xB3B0, 0x9678, 0xB3B1, 0x9670, + 0xB3B2, 0x9674, 0xB3B3, 0x9676, 0xB3B4, 0x9677, 0xB3B5, 0x966C, + 0xB3B6, 0x96C0, 0xB3B7, 0x96EA, 0xB3B8, 0x96E9, 0xB3B9, 0x7AE0, + 0xB3BA, 0x7ADF, 0xB3BB, 0x9802, 0xB3BC, 0x9803, 0xB3BD, 0x9B5A, + 0xB3BE, 0x9CE5, 0xB3BF, 0x9E75, 0xB3C0, 0x9E7F, 0xB3C1, 0x9EA5, + 0xB3C2, 0x9EBB, 0xB3C3, 0x50A2, 0xB3C4, 0x508D, 0xB3C5, 0x5085, + 0xB3C6, 0x5099, 0xB3C7, 0x5091, 0xB3C8, 0x5080, 0xB3C9, 0x5096, + 0xB3CA, 0x5098, 0xB3CB, 0x509A, 0xB3CC, 0x6700, 0xB3CD, 0x51F1, + 0xB3CE, 0x5272, 0xB3CF, 0x5274, 0xB3D0, 0x5275, 0xB3D1, 0x5269, + 0xB3D2, 0x52DE, 0xB3D3, 0x52DD, 0xB3D4, 0x52DB, 0xB3D5, 0x535A, + 0xB3D6, 0x53A5, 0xB3D7, 0x557B, 0xB3D8, 0x5580, 0xB3D9, 0x55A7, + 0xB3DA, 0x557C, 0xB3DB, 0x558A, 0xB3DC, 0x559D, 0xB3DD, 0x5598, + 0xB3DE, 0x5582, 0xB3DF, 0x559C, 0xB3E0, 0x55AA, 0xB3E1, 0x5594, + 0xB3E2, 0x5587, 0xB3E3, 0x558B, 0xB3E4, 0x5583, 0xB3E5, 0x55B3, + 0xB3E6, 0x55AE, 0xB3E7, 0x559F, 0xB3E8, 0x553E, 0xB3E9, 0x55B2, + 0xB3EA, 0x559A, 0xB3EB, 0x55BB, 0xB3EC, 0x55AC, 0xB3ED, 0x55B1, + 0xB3EE, 0x557E, 0xB3EF, 0x5589, 0xB3F0, 0x55AB, 0xB3F1, 0x5599, + 0xB3F2, 0x570D, 0xB3F3, 0x582F, 0xB3F4, 0x582A, 0xB3F5, 0x5834, + 0xB3F6, 0x5824, 0xB3F7, 0x5830, 0xB3F8, 0x5831, 0xB3F9, 0x5821, + 0xB3FA, 0x581D, 0xB3FB, 0x5820, 0xB3FC, 0x58F9, 0xB3FD, 0x58FA, + 0xB3FE, 0x5960, 0xB440, 0x5A77, 0xB441, 0x5A9A, 0xB442, 0x5A7F, + 0xB443, 0x5A92, 0xB444, 0x5A9B, 0xB445, 0x5AA7, 0xB446, 0x5B73, + 0xB447, 0x5B71, 0xB448, 0x5BD2, 0xB449, 0x5BCC, 0xB44A, 0x5BD3, + 0xB44B, 0x5BD0, 0xB44C, 0x5C0A, 0xB44D, 0x5C0B, 0xB44E, 0x5C31, + 0xB44F, 0x5D4C, 0xB450, 0x5D50, 0xB451, 0x5D34, 0xB452, 0x5D47, + 0xB453, 0x5DFD, 0xB454, 0x5E45, 0xB455, 0x5E3D, 0xB456, 0x5E40, + 0xB457, 0x5E43, 0xB458, 0x5E7E, 0xB459, 0x5ECA, 0xB45A, 0x5EC1, + 0xB45B, 0x5EC2, 0xB45C, 0x5EC4, 0xB45D, 0x5F3C, 0xB45E, 0x5F6D, + 0xB45F, 0x5FA9, 0xB460, 0x5FAA, 0xB461, 0x5FA8, 0xB462, 0x60D1, + 0xB463, 0x60E1, 0xB464, 0x60B2, 0xB465, 0x60B6, 0xB466, 0x60E0, + 0xB467, 0x611C, 0xB468, 0x6123, 0xB469, 0x60FA, 0xB46A, 0x6115, + 0xB46B, 0x60F0, 0xB46C, 0x60FB, 0xB46D, 0x60F4, 0xB46E, 0x6168, + 0xB46F, 0x60F1, 0xB470, 0x610E, 0xB471, 0x60F6, 0xB472, 0x6109, + 0xB473, 0x6100, 0xB474, 0x6112, 0xB475, 0x621F, 0xB476, 0x6249, + 0xB477, 0x63A3, 0xB478, 0x638C, 0xB479, 0x63CF, 0xB47A, 0x63C0, + 0xB47B, 0x63E9, 0xB47C, 0x63C9, 0xB47D, 0x63C6, 0xB47E, 0x63CD, + 0xB4A1, 0x63D2, 0xB4A2, 0x63E3, 0xB4A3, 0x63D0, 0xB4A4, 0x63E1, + 0xB4A5, 0x63D6, 0xB4A6, 0x63ED, 0xB4A7, 0x63EE, 0xB4A8, 0x6376, + 0xB4A9, 0x63F4, 0xB4AA, 0x63EA, 0xB4AB, 0x63DB, 0xB4AC, 0x6452, + 0xB4AD, 0x63DA, 0xB4AE, 0x63F9, 0xB4AF, 0x655E, 0xB4B0, 0x6566, + 0xB4B1, 0x6562, 0xB4B2, 0x6563, 0xB4B3, 0x6591, 0xB4B4, 0x6590, + 0xB4B5, 0x65AF, 0xB4B6, 0x666E, 0xB4B7, 0x6670, 0xB4B8, 0x6674, + 0xB4B9, 0x6676, 0xB4BA, 0x666F, 0xB4BB, 0x6691, 0xB4BC, 0x667A, + 0xB4BD, 0x667E, 0xB4BE, 0x6677, 0xB4BF, 0x66FE, 0xB4C0, 0x66FF, + 0xB4C1, 0x671F, 0xB4C2, 0x671D, 0xB4C3, 0x68FA, 0xB4C4, 0x68D5, + 0xB4C5, 0x68E0, 0xB4C6, 0x68D8, 0xB4C7, 0x68D7, 0xB4C8, 0x6905, + 0xB4C9, 0x68DF, 0xB4CA, 0x68F5, 0xB4CB, 0x68EE, 0xB4CC, 0x68E7, + 0xB4CD, 0x68F9, 0xB4CE, 0x68D2, 0xB4CF, 0x68F2, 0xB4D0, 0x68E3, + 0xB4D1, 0x68CB, 0xB4D2, 0x68CD, 0xB4D3, 0x690D, 0xB4D4, 0x6912, + 0xB4D5, 0x690E, 0xB4D6, 0x68C9, 0xB4D7, 0x68DA, 0xB4D8, 0x696E, + 0xB4D9, 0x68FB, 0xB4DA, 0x6B3E, 0xB4DB, 0x6B3A, 0xB4DC, 0x6B3D, + 0xB4DD, 0x6B98, 0xB4DE, 0x6B96, 0xB4DF, 0x6BBC, 0xB4E0, 0x6BEF, + 0xB4E1, 0x6C2E, 0xB4E2, 0x6C2F, 0xB4E3, 0x6C2C, 0xB4E4, 0x6E2F, + 0xB4E5, 0x6E38, 0xB4E6, 0x6E54, 0xB4E7, 0x6E21, 0xB4E8, 0x6E32, + 0xB4E9, 0x6E67, 0xB4EA, 0x6E4A, 0xB4EB, 0x6E20, 0xB4EC, 0x6E25, + 0xB4ED, 0x6E23, 0xB4EE, 0x6E1B, 0xB4EF, 0x6E5B, 0xB4F0, 0x6E58, + 0xB4F1, 0x6E24, 0xB4F2, 0x6E56, 0xB4F3, 0x6E6E, 0xB4F4, 0x6E2D, + 0xB4F5, 0x6E26, 0xB4F6, 0x6E6F, 0xB4F7, 0x6E34, 0xB4F8, 0x6E4D, + 0xB4F9, 0x6E3A, 0xB4FA, 0x6E2C, 0xB4FB, 0x6E43, 0xB4FC, 0x6E1D, + 0xB4FD, 0x6E3E, 0xB4FE, 0x6ECB, 0xB540, 0x6E89, 0xB541, 0x6E19, + 0xB542, 0x6E4E, 0xB543, 0x6E63, 0xB544, 0x6E44, 0xB545, 0x6E72, + 0xB546, 0x6E69, 0xB547, 0x6E5F, 0xB548, 0x7119, 0xB549, 0x711A, + 0xB54A, 0x7126, 0xB54B, 0x7130, 0xB54C, 0x7121, 0xB54D, 0x7136, + 0xB54E, 0x716E, 0xB54F, 0x711C, 0xB550, 0x724C, 0xB551, 0x7284, + 0xB552, 0x7280, 0xB553, 0x7336, 0xB554, 0x7325, 0xB555, 0x7334, + 0xB556, 0x7329, 0xB557, 0x743A, 0xB558, 0x742A, 0xB559, 0x7433, + 0xB55A, 0x7422, 0xB55B, 0x7425, 0xB55C, 0x7435, 0xB55D, 0x7436, + 0xB55E, 0x7434, 0xB55F, 0x742F, 0xB560, 0x741B, 0xB561, 0x7426, + 0xB562, 0x7428, 0xB563, 0x7525, 0xB564, 0x7526, 0xB565, 0x756B, + 0xB566, 0x756A, 0xB567, 0x75E2, 0xB568, 0x75DB, 0xB569, 0x75E3, + 0xB56A, 0x75D9, 0xB56B, 0x75D8, 0xB56C, 0x75DE, 0xB56D, 0x75E0, + 0xB56E, 0x767B, 0xB56F, 0x767C, 0xB570, 0x7696, 0xB571, 0x7693, + 0xB572, 0x76B4, 0xB573, 0x76DC, 0xB574, 0x774F, 0xB575, 0x77ED, + 0xB576, 0x785D, 0xB577, 0x786C, 0xB578, 0x786F, 0xB579, 0x7A0D, + 0xB57A, 0x7A08, 0xB57B, 0x7A0B, 0xB57C, 0x7A05, 0xB57D, 0x7A00, + 0xB57E, 0x7A98, 0xB5A1, 0x7A97, 0xB5A2, 0x7A96, 0xB5A3, 0x7AE5, + 0xB5A4, 0x7AE3, 0xB5A5, 0x7B49, 0xB5A6, 0x7B56, 0xB5A7, 0x7B46, + 0xB5A8, 0x7B50, 0xB5A9, 0x7B52, 0xB5AA, 0x7B54, 0xB5AB, 0x7B4D, + 0xB5AC, 0x7B4B, 0xB5AD, 0x7B4F, 0xB5AE, 0x7B51, 0xB5AF, 0x7C9F, + 0xB5B0, 0x7CA5, 0xB5B1, 0x7D5E, 0xB5B2, 0x7D50, 0xB5B3, 0x7D68, + 0xB5B4, 0x7D55, 0xB5B5, 0x7D2B, 0xB5B6, 0x7D6E, 0xB5B7, 0x7D72, + 0xB5B8, 0x7D61, 0xB5B9, 0x7D66, 0xB5BA, 0x7D62, 0xB5BB, 0x7D70, + 0xB5BC, 0x7D73, 0xB5BD, 0x5584, 0xB5BE, 0x7FD4, 0xB5BF, 0x7FD5, + 0xB5C0, 0x800B, 0xB5C1, 0x8052, 0xB5C2, 0x8085, 0xB5C3, 0x8155, + 0xB5C4, 0x8154, 0xB5C5, 0x814B, 0xB5C6, 0x8151, 0xB5C7, 0x814E, + 0xB5C8, 0x8139, 0xB5C9, 0x8146, 0xB5CA, 0x813E, 0xB5CB, 0x814C, + 0xB5CC, 0x8153, 0xB5CD, 0x8174, 0xB5CE, 0x8212, 0xB5CF, 0x821C, + 0xB5D0, 0x83E9, 0xB5D1, 0x8403, 0xB5D2, 0x83F8, 0xB5D3, 0x840D, + 0xB5D4, 0x83E0, 0xB5D5, 0x83C5, 0xB5D6, 0x840B, 0xB5D7, 0x83C1, + 0xB5D8, 0x83EF, 0xB5D9, 0x83F1, 0xB5DA, 0x83F4, 0xB5DB, 0x8457, + 0xB5DC, 0x840A, 0xB5DD, 0x83F0, 0xB5DE, 0x840C, 0xB5DF, 0x83CC, + 0xB5E0, 0x83FD, 0xB5E1, 0x83F2, 0xB5E2, 0x83CA, 0xB5E3, 0x8438, + 0xB5E4, 0x840E, 0xB5E5, 0x8404, 0xB5E6, 0x83DC, 0xB5E7, 0x8407, + 0xB5E8, 0x83D4, 0xB5E9, 0x83DF, 0xB5EA, 0x865B, 0xB5EB, 0x86DF, + 0xB5EC, 0x86D9, 0xB5ED, 0x86ED, 0xB5EE, 0x86D4, 0xB5EF, 0x86DB, + 0xB5F0, 0x86E4, 0xB5F1, 0x86D0, 0xB5F2, 0x86DE, 0xB5F3, 0x8857, + 0xB5F4, 0x88C1, 0xB5F5, 0x88C2, 0xB5F6, 0x88B1, 0xB5F7, 0x8983, + 0xB5F8, 0x8996, 0xB5F9, 0x8A3B, 0xB5FA, 0x8A60, 0xB5FB, 0x8A55, + 0xB5FC, 0x8A5E, 0xB5FD, 0x8A3C, 0xB5FE, 0x8A41, 0xB640, 0x8A54, + 0xB641, 0x8A5B, 0xB642, 0x8A50, 0xB643, 0x8A46, 0xB644, 0x8A34, + 0xB645, 0x8A3A, 0xB646, 0x8A36, 0xB647, 0x8A56, 0xB648, 0x8C61, + 0xB649, 0x8C82, 0xB64A, 0x8CAF, 0xB64B, 0x8CBC, 0xB64C, 0x8CB3, + 0xB64D, 0x8CBD, 0xB64E, 0x8CC1, 0xB64F, 0x8CBB, 0xB650, 0x8CC0, + 0xB651, 0x8CB4, 0xB652, 0x8CB7, 0xB653, 0x8CB6, 0xB654, 0x8CBF, + 0xB655, 0x8CB8, 0xB656, 0x8D8A, 0xB657, 0x8D85, 0xB658, 0x8D81, + 0xB659, 0x8DCE, 0xB65A, 0x8DDD, 0xB65B, 0x8DCB, 0xB65C, 0x8DDA, + 0xB65D, 0x8DD1, 0xB65E, 0x8DCC, 0xB65F, 0x8DDB, 0xB660, 0x8DC6, + 0xB661, 0x8EFB, 0xB662, 0x8EF8, 0xB663, 0x8EFC, 0xB664, 0x8F9C, + 0xB665, 0x902E, 0xB666, 0x9035, 0xB667, 0x9031, 0xB668, 0x9038, + 0xB669, 0x9032, 0xB66A, 0x9036, 0xB66B, 0x9102, 0xB66C, 0x90F5, + 0xB66D, 0x9109, 0xB66E, 0x90FE, 0xB66F, 0x9163, 0xB670, 0x9165, + 0xB671, 0x91CF, 0xB672, 0x9214, 0xB673, 0x9215, 0xB674, 0x9223, + 0xB675, 0x9209, 0xB676, 0x921E, 0xB677, 0x920D, 0xB678, 0x9210, + 0xB679, 0x9207, 0xB67A, 0x9211, 0xB67B, 0x9594, 0xB67C, 0x958F, + 0xB67D, 0x958B, 0xB67E, 0x9591, 0xB6A1, 0x9593, 0xB6A2, 0x9592, + 0xB6A3, 0x958E, 0xB6A4, 0x968A, 0xB6A5, 0x968E, 0xB6A6, 0x968B, + 0xB6A7, 0x967D, 0xB6A8, 0x9685, 0xB6A9, 0x9686, 0xB6AA, 0x968D, + 0xB6AB, 0x9672, 0xB6AC, 0x9684, 0xB6AD, 0x96C1, 0xB6AE, 0x96C5, + 0xB6AF, 0x96C4, 0xB6B0, 0x96C6, 0xB6B1, 0x96C7, 0xB6B2, 0x96EF, + 0xB6B3, 0x96F2, 0xB6B4, 0x97CC, 0xB6B5, 0x9805, 0xB6B6, 0x9806, + 0xB6B7, 0x9808, 0xB6B8, 0x98E7, 0xB6B9, 0x98EA, 0xB6BA, 0x98EF, + 0xB6BB, 0x98E9, 0xB6BC, 0x98F2, 0xB6BD, 0x98ED, 0xB6BE, 0x99AE, + 0xB6BF, 0x99AD, 0xB6C0, 0x9EC3, 0xB6C1, 0x9ECD, 0xB6C2, 0x9ED1, + 0xB6C3, 0x4E82, 0xB6C4, 0x50AD, 0xB6C5, 0x50B5, 0xB6C6, 0x50B2, + 0xB6C7, 0x50B3, 0xB6C8, 0x50C5, 0xB6C9, 0x50BE, 0xB6CA, 0x50AC, + 0xB6CB, 0x50B7, 0xB6CC, 0x50BB, 0xB6CD, 0x50AF, 0xB6CE, 0x50C7, + 0xB6CF, 0x527F, 0xB6D0, 0x5277, 0xB6D1, 0x527D, 0xB6D2, 0x52DF, + 0xB6D3, 0x52E6, 0xB6D4, 0x52E4, 0xB6D5, 0x52E2, 0xB6D6, 0x52E3, + 0xB6D7, 0x532F, 0xB6D8, 0x55DF, 0xB6D9, 0x55E8, 0xB6DA, 0x55D3, + 0xB6DB, 0x55E6, 0xB6DC, 0x55CE, 0xB6DD, 0x55DC, 0xB6DE, 0x55C7, + 0xB6DF, 0x55D1, 0xB6E0, 0x55E3, 0xB6E1, 0x55E4, 0xB6E2, 0x55EF, + 0xB6E3, 0x55DA, 0xB6E4, 0x55E1, 0xB6E5, 0x55C5, 0xB6E6, 0x55C6, + 0xB6E7, 0x55E5, 0xB6E8, 0x55C9, 0xB6E9, 0x5712, 0xB6EA, 0x5713, + 0xB6EB, 0x585E, 0xB6EC, 0x5851, 0xB6ED, 0x5858, 0xB6EE, 0x5857, + 0xB6EF, 0x585A, 0xB6F0, 0x5854, 0xB6F1, 0x586B, 0xB6F2, 0x584C, + 0xB6F3, 0x586D, 0xB6F4, 0x584A, 0xB6F5, 0x5862, 0xB6F6, 0x5852, + 0xB6F7, 0x584B, 0xB6F8, 0x5967, 0xB6F9, 0x5AC1, 0xB6FA, 0x5AC9, + 0xB6FB, 0x5ACC, 0xB6FC, 0x5ABE, 0xB6FD, 0x5ABD, 0xB6FE, 0x5ABC, + 0xB740, 0x5AB3, 0xB741, 0x5AC2, 0xB742, 0x5AB2, 0xB743, 0x5D69, + 0xB744, 0x5D6F, 0xB745, 0x5E4C, 0xB746, 0x5E79, 0xB747, 0x5EC9, + 0xB748, 0x5EC8, 0xB749, 0x5F12, 0xB74A, 0x5F59, 0xB74B, 0x5FAC, + 0xB74C, 0x5FAE, 0xB74D, 0x611A, 0xB74E, 0x610F, 0xB74F, 0x6148, + 0xB750, 0x611F, 0xB751, 0x60F3, 0xB752, 0x611B, 0xB753, 0x60F9, + 0xB754, 0x6101, 0xB755, 0x6108, 0xB756, 0x614E, 0xB757, 0x614C, + 0xB758, 0x6144, 0xB759, 0x614D, 0xB75A, 0x613E, 0xB75B, 0x6134, + 0xB75C, 0x6127, 0xB75D, 0x610D, 0xB75E, 0x6106, 0xB75F, 0x6137, + 0xB760, 0x6221, 0xB761, 0x6222, 0xB762, 0x6413, 0xB763, 0x643E, + 0xB764, 0x641E, 0xB765, 0x642A, 0xB766, 0x642D, 0xB767, 0x643D, + 0xB768, 0x642C, 0xB769, 0x640F, 0xB76A, 0x641C, 0xB76B, 0x6414, + 0xB76C, 0x640D, 0xB76D, 0x6436, 0xB76E, 0x6416, 0xB76F, 0x6417, + 0xB770, 0x6406, 0xB771, 0x656C, 0xB772, 0x659F, 0xB773, 0x65B0, + 0xB774, 0x6697, 0xB775, 0x6689, 0xB776, 0x6687, 0xB777, 0x6688, + 0xB778, 0x6696, 0xB779, 0x6684, 0xB77A, 0x6698, 0xB77B, 0x668D, + 0xB77C, 0x6703, 0xB77D, 0x6994, 0xB77E, 0x696D, 0xB7A1, 0x695A, + 0xB7A2, 0x6977, 0xB7A3, 0x6960, 0xB7A4, 0x6954, 0xB7A5, 0x6975, + 0xB7A6, 0x6930, 0xB7A7, 0x6982, 0xB7A8, 0x694A, 0xB7A9, 0x6968, + 0xB7AA, 0x696B, 0xB7AB, 0x695E, 0xB7AC, 0x6953, 0xB7AD, 0x6979, + 0xB7AE, 0x6986, 0xB7AF, 0x695D, 0xB7B0, 0x6963, 0xB7B1, 0x695B, + 0xB7B2, 0x6B47, 0xB7B3, 0x6B72, 0xB7B4, 0x6BC0, 0xB7B5, 0x6BBF, + 0xB7B6, 0x6BD3, 0xB7B7, 0x6BFD, 0xB7B8, 0x6EA2, 0xB7B9, 0x6EAF, + 0xB7BA, 0x6ED3, 0xB7BB, 0x6EB6, 0xB7BC, 0x6EC2, 0xB7BD, 0x6E90, + 0xB7BE, 0x6E9D, 0xB7BF, 0x6EC7, 0xB7C0, 0x6EC5, 0xB7C1, 0x6EA5, + 0xB7C2, 0x6E98, 0xB7C3, 0x6EBC, 0xB7C4, 0x6EBA, 0xB7C5, 0x6EAB, + 0xB7C6, 0x6ED1, 0xB7C7, 0x6E96, 0xB7C8, 0x6E9C, 0xB7C9, 0x6EC4, + 0xB7CA, 0x6ED4, 0xB7CB, 0x6EAA, 0xB7CC, 0x6EA7, 0xB7CD, 0x6EB4, + 0xB7CE, 0x714E, 0xB7CF, 0x7159, 0xB7D0, 0x7169, 0xB7D1, 0x7164, + 0xB7D2, 0x7149, 0xB7D3, 0x7167, 0xB7D4, 0x715C, 0xB7D5, 0x716C, + 0xB7D6, 0x7166, 0xB7D7, 0x714C, 0xB7D8, 0x7165, 0xB7D9, 0x715E, + 0xB7DA, 0x7146, 0xB7DB, 0x7168, 0xB7DC, 0x7156, 0xB7DD, 0x723A, + 0xB7DE, 0x7252, 0xB7DF, 0x7337, 0xB7E0, 0x7345, 0xB7E1, 0x733F, + 0xB7E2, 0x733E, 0xB7E3, 0x746F, 0xB7E4, 0x745A, 0xB7E5, 0x7455, + 0xB7E6, 0x745F, 0xB7E7, 0x745E, 0xB7E8, 0x7441, 0xB7E9, 0x743F, + 0xB7EA, 0x7459, 0xB7EB, 0x745B, 0xB7EC, 0x745C, 0xB7ED, 0x7576, + 0xB7EE, 0x7578, 0xB7EF, 0x7600, 0xB7F0, 0x75F0, 0xB7F1, 0x7601, + 0xB7F2, 0x75F2, 0xB7F3, 0x75F1, 0xB7F4, 0x75FA, 0xB7F5, 0x75FF, + 0xB7F6, 0x75F4, 0xB7F7, 0x75F3, 0xB7F8, 0x76DE, 0xB7F9, 0x76DF, + 0xB7FA, 0x775B, 0xB7FB, 0x776B, 0xB7FC, 0x7766, 0xB7FD, 0x775E, + 0xB7FE, 0x7763, 0xB840, 0x7779, 0xB841, 0x776A, 0xB842, 0x776C, + 0xB843, 0x775C, 0xB844, 0x7765, 0xB845, 0x7768, 0xB846, 0x7762, + 0xB847, 0x77EE, 0xB848, 0x788E, 0xB849, 0x78B0, 0xB84A, 0x7897, + 0xB84B, 0x7898, 0xB84C, 0x788C, 0xB84D, 0x7889, 0xB84E, 0x787C, + 0xB84F, 0x7891, 0xB850, 0x7893, 0xB851, 0x787F, 0xB852, 0x797A, + 0xB853, 0x797F, 0xB854, 0x7981, 0xB855, 0x842C, 0xB856, 0x79BD, + 0xB857, 0x7A1C, 0xB858, 0x7A1A, 0xB859, 0x7A20, 0xB85A, 0x7A14, + 0xB85B, 0x7A1F, 0xB85C, 0x7A1E, 0xB85D, 0x7A9F, 0xB85E, 0x7AA0, + 0xB85F, 0x7B77, 0xB860, 0x7BC0, 0xB861, 0x7B60, 0xB862, 0x7B6E, + 0xB863, 0x7B67, 0xB864, 0x7CB1, 0xB865, 0x7CB3, 0xB866, 0x7CB5, + 0xB867, 0x7D93, 0xB868, 0x7D79, 0xB869, 0x7D91, 0xB86A, 0x7D81, + 0xB86B, 0x7D8F, 0xB86C, 0x7D5B, 0xB86D, 0x7F6E, 0xB86E, 0x7F69, + 0xB86F, 0x7F6A, 0xB870, 0x7F72, 0xB871, 0x7FA9, 0xB872, 0x7FA8, + 0xB873, 0x7FA4, 0xB874, 0x8056, 0xB875, 0x8058, 0xB876, 0x8086, + 0xB877, 0x8084, 0xB878, 0x8171, 0xB879, 0x8170, 0xB87A, 0x8178, + 0xB87B, 0x8165, 0xB87C, 0x816E, 0xB87D, 0x8173, 0xB87E, 0x816B, + 0xB8A1, 0x8179, 0xB8A2, 0x817A, 0xB8A3, 0x8166, 0xB8A4, 0x8205, + 0xB8A5, 0x8247, 0xB8A6, 0x8482, 0xB8A7, 0x8477, 0xB8A8, 0x843D, + 0xB8A9, 0x8431, 0xB8AA, 0x8475, 0xB8AB, 0x8466, 0xB8AC, 0x846B, + 0xB8AD, 0x8449, 0xB8AE, 0x846C, 0xB8AF, 0x845B, 0xB8B0, 0x843C, + 0xB8B1, 0x8435, 0xB8B2, 0x8461, 0xB8B3, 0x8463, 0xB8B4, 0x8469, + 0xB8B5, 0x846D, 0xB8B6, 0x8446, 0xB8B7, 0x865E, 0xB8B8, 0x865C, + 0xB8B9, 0x865F, 0xB8BA, 0x86F9, 0xB8BB, 0x8713, 0xB8BC, 0x8708, + 0xB8BD, 0x8707, 0xB8BE, 0x8700, 0xB8BF, 0x86FE, 0xB8C0, 0x86FB, + 0xB8C1, 0x8702, 0xB8C2, 0x8703, 0xB8C3, 0x8706, 0xB8C4, 0x870A, + 0xB8C5, 0x8859, 0xB8C6, 0x88DF, 0xB8C7, 0x88D4, 0xB8C8, 0x88D9, + 0xB8C9, 0x88DC, 0xB8CA, 0x88D8, 0xB8CB, 0x88DD, 0xB8CC, 0x88E1, + 0xB8CD, 0x88CA, 0xB8CE, 0x88D5, 0xB8CF, 0x88D2, 0xB8D0, 0x899C, + 0xB8D1, 0x89E3, 0xB8D2, 0x8A6B, 0xB8D3, 0x8A72, 0xB8D4, 0x8A73, + 0xB8D5, 0x8A66, 0xB8D6, 0x8A69, 0xB8D7, 0x8A70, 0xB8D8, 0x8A87, + 0xB8D9, 0x8A7C, 0xB8DA, 0x8A63, 0xB8DB, 0x8AA0, 0xB8DC, 0x8A71, + 0xB8DD, 0x8A85, 0xB8DE, 0x8A6D, 0xB8DF, 0x8A62, 0xB8E0, 0x8A6E, + 0xB8E1, 0x8A6C, 0xB8E2, 0x8A79, 0xB8E3, 0x8A7B, 0xB8E4, 0x8A3E, + 0xB8E5, 0x8A68, 0xB8E6, 0x8C62, 0xB8E7, 0x8C8A, 0xB8E8, 0x8C89, + 0xB8E9, 0x8CCA, 0xB8EA, 0x8CC7, 0xB8EB, 0x8CC8, 0xB8EC, 0x8CC4, + 0xB8ED, 0x8CB2, 0xB8EE, 0x8CC3, 0xB8EF, 0x8CC2, 0xB8F0, 0x8CC5, + 0xB8F1, 0x8DE1, 0xB8F2, 0x8DDF, 0xB8F3, 0x8DE8, 0xB8F4, 0x8DEF, + 0xB8F5, 0x8DF3, 0xB8F6, 0x8DFA, 0xB8F7, 0x8DEA, 0xB8F8, 0x8DE4, + 0xB8F9, 0x8DE6, 0xB8FA, 0x8EB2, 0xB8FB, 0x8F03, 0xB8FC, 0x8F09, + 0xB8FD, 0x8EFE, 0xB8FE, 0x8F0A, 0xB940, 0x8F9F, 0xB941, 0x8FB2, + 0xB942, 0x904B, 0xB943, 0x904A, 0xB944, 0x9053, 0xB945, 0x9042, + 0xB946, 0x9054, 0xB947, 0x903C, 0xB948, 0x9055, 0xB949, 0x9050, + 0xB94A, 0x9047, 0xB94B, 0x904F, 0xB94C, 0x904E, 0xB94D, 0x904D, + 0xB94E, 0x9051, 0xB94F, 0x903E, 0xB950, 0x9041, 0xB951, 0x9112, + 0xB952, 0x9117, 0xB953, 0x916C, 0xB954, 0x916A, 0xB955, 0x9169, + 0xB956, 0x91C9, 0xB957, 0x9237, 0xB958, 0x9257, 0xB959, 0x9238, + 0xB95A, 0x923D, 0xB95B, 0x9240, 0xB95C, 0x923E, 0xB95D, 0x925B, + 0xB95E, 0x924B, 0xB95F, 0x9264, 0xB960, 0x9251, 0xB961, 0x9234, + 0xB962, 0x9249, 0xB963, 0x924D, 0xB964, 0x9245, 0xB965, 0x9239, + 0xB966, 0x923F, 0xB967, 0x925A, 0xB968, 0x9598, 0xB969, 0x9698, + 0xB96A, 0x9694, 0xB96B, 0x9695, 0xB96C, 0x96CD, 0xB96D, 0x96CB, + 0xB96E, 0x96C9, 0xB96F, 0x96CA, 0xB970, 0x96F7, 0xB971, 0x96FB, + 0xB972, 0x96F9, 0xB973, 0x96F6, 0xB974, 0x9756, 0xB975, 0x9774, + 0xB976, 0x9776, 0xB977, 0x9810, 0xB978, 0x9811, 0xB979, 0x9813, + 0xB97A, 0x980A, 0xB97B, 0x9812, 0xB97C, 0x980C, 0xB97D, 0x98FC, + 0xB97E, 0x98F4, 0xB9A1, 0x98FD, 0xB9A2, 0x98FE, 0xB9A3, 0x99B3, + 0xB9A4, 0x99B1, 0xB9A5, 0x99B4, 0xB9A6, 0x9AE1, 0xB9A7, 0x9CE9, + 0xB9A8, 0x9E82, 0xB9A9, 0x9F0E, 0xB9AA, 0x9F13, 0xB9AB, 0x9F20, + 0xB9AC, 0x50E7, 0xB9AD, 0x50EE, 0xB9AE, 0x50E5, 0xB9AF, 0x50D6, + 0xB9B0, 0x50ED, 0xB9B1, 0x50DA, 0xB9B2, 0x50D5, 0xB9B3, 0x50CF, + 0xB9B4, 0x50D1, 0xB9B5, 0x50F1, 0xB9B6, 0x50CE, 0xB9B7, 0x50E9, + 0xB9B8, 0x5162, 0xB9B9, 0x51F3, 0xB9BA, 0x5283, 0xB9BB, 0x5282, + 0xB9BC, 0x5331, 0xB9BD, 0x53AD, 0xB9BE, 0x55FE, 0xB9BF, 0x5600, + 0xB9C0, 0x561B, 0xB9C1, 0x5617, 0xB9C2, 0x55FD, 0xB9C3, 0x5614, + 0xB9C4, 0x5606, 0xB9C5, 0x5609, 0xB9C6, 0x560D, 0xB9C7, 0x560E, + 0xB9C8, 0x55F7, 0xB9C9, 0x5616, 0xB9CA, 0x561F, 0xB9CB, 0x5608, + 0xB9CC, 0x5610, 0xB9CD, 0x55F6, 0xB9CE, 0x5718, 0xB9CF, 0x5716, + 0xB9D0, 0x5875, 0xB9D1, 0x587E, 0xB9D2, 0x5883, 0xB9D3, 0x5893, + 0xB9D4, 0x588A, 0xB9D5, 0x5879, 0xB9D6, 0x5885, 0xB9D7, 0x587D, + 0xB9D8, 0x58FD, 0xB9D9, 0x5925, 0xB9DA, 0x5922, 0xB9DB, 0x5924, + 0xB9DC, 0x596A, 0xB9DD, 0x5969, 0xB9DE, 0x5AE1, 0xB9DF, 0x5AE6, + 0xB9E0, 0x5AE9, 0xB9E1, 0x5AD7, 0xB9E2, 0x5AD6, 0xB9E3, 0x5AD8, + 0xB9E4, 0x5AE3, 0xB9E5, 0x5B75, 0xB9E6, 0x5BDE, 0xB9E7, 0x5BE7, + 0xB9E8, 0x5BE1, 0xB9E9, 0x5BE5, 0xB9EA, 0x5BE6, 0xB9EB, 0x5BE8, + 0xB9EC, 0x5BE2, 0xB9ED, 0x5BE4, 0xB9EE, 0x5BDF, 0xB9EF, 0x5C0D, + 0xB9F0, 0x5C62, 0xB9F1, 0x5D84, 0xB9F2, 0x5D87, 0xB9F3, 0x5E5B, + 0xB9F4, 0x5E63, 0xB9F5, 0x5E55, 0xB9F6, 0x5E57, 0xB9F7, 0x5E54, + 0xB9F8, 0x5ED3, 0xB9F9, 0x5ED6, 0xB9FA, 0x5F0A, 0xB9FB, 0x5F46, + 0xB9FC, 0x5F70, 0xB9FD, 0x5FB9, 0xB9FE, 0x6147, 0xBA40, 0x613F, + 0xBA41, 0x614B, 0xBA42, 0x6177, 0xBA43, 0x6162, 0xBA44, 0x6163, + 0xBA45, 0x615F, 0xBA46, 0x615A, 0xBA47, 0x6158, 0xBA48, 0x6175, + 0xBA49, 0x622A, 0xBA4A, 0x6487, 0xBA4B, 0x6458, 0xBA4C, 0x6454, + 0xBA4D, 0x64A4, 0xBA4E, 0x6478, 0xBA4F, 0x645F, 0xBA50, 0x647A, + 0xBA51, 0x6451, 0xBA52, 0x6467, 0xBA53, 0x6434, 0xBA54, 0x646D, + 0xBA55, 0x647B, 0xBA56, 0x6572, 0xBA57, 0x65A1, 0xBA58, 0x65D7, + 0xBA59, 0x65D6, 0xBA5A, 0x66A2, 0xBA5B, 0x66A8, 0xBA5C, 0x669D, + 0xBA5D, 0x699C, 0xBA5E, 0x69A8, 0xBA5F, 0x6995, 0xBA60, 0x69C1, + 0xBA61, 0x69AE, 0xBA62, 0x69D3, 0xBA63, 0x69CB, 0xBA64, 0x699B, + 0xBA65, 0x69B7, 0xBA66, 0x69BB, 0xBA67, 0x69AB, 0xBA68, 0x69B4, + 0xBA69, 0x69D0, 0xBA6A, 0x69CD, 0xBA6B, 0x69AD, 0xBA6C, 0x69CC, + 0xBA6D, 0x69A6, 0xBA6E, 0x69C3, 0xBA6F, 0x69A3, 0xBA70, 0x6B49, + 0xBA71, 0x6B4C, 0xBA72, 0x6C33, 0xBA73, 0x6F33, 0xBA74, 0x6F14, + 0xBA75, 0x6EFE, 0xBA76, 0x6F13, 0xBA77, 0x6EF4, 0xBA78, 0x6F29, + 0xBA79, 0x6F3E, 0xBA7A, 0x6F20, 0xBA7B, 0x6F2C, 0xBA7C, 0x6F0F, + 0xBA7D, 0x6F02, 0xBA7E, 0x6F22, 0xBAA1, 0x6EFF, 0xBAA2, 0x6EEF, + 0xBAA3, 0x6F06, 0xBAA4, 0x6F31, 0xBAA5, 0x6F38, 0xBAA6, 0x6F32, + 0xBAA7, 0x6F23, 0xBAA8, 0x6F15, 0xBAA9, 0x6F2B, 0xBAAA, 0x6F2F, + 0xBAAB, 0x6F88, 0xBAAC, 0x6F2A, 0xBAAD, 0x6EEC, 0xBAAE, 0x6F01, + 0xBAAF, 0x6EF2, 0xBAB0, 0x6ECC, 0xBAB1, 0x6EF7, 0xBAB2, 0x7194, + 0xBAB3, 0x7199, 0xBAB4, 0x717D, 0xBAB5, 0x718A, 0xBAB6, 0x7184, + 0xBAB7, 0x7192, 0xBAB8, 0x723E, 0xBAB9, 0x7292, 0xBABA, 0x7296, + 0xBABB, 0x7344, 0xBABC, 0x7350, 0xBABD, 0x7464, 0xBABE, 0x7463, + 0xBABF, 0x746A, 0xBAC0, 0x7470, 0xBAC1, 0x746D, 0xBAC2, 0x7504, + 0xBAC3, 0x7591, 0xBAC4, 0x7627, 0xBAC5, 0x760D, 0xBAC6, 0x760B, + 0xBAC7, 0x7609, 0xBAC8, 0x7613, 0xBAC9, 0x76E1, 0xBACA, 0x76E3, + 0xBACB, 0x7784, 0xBACC, 0x777D, 0xBACD, 0x777F, 0xBACE, 0x7761, + 0xBACF, 0x78C1, 0xBAD0, 0x789F, 0xBAD1, 0x78A7, 0xBAD2, 0x78B3, + 0xBAD3, 0x78A9, 0xBAD4, 0x78A3, 0xBAD5, 0x798E, 0xBAD6, 0x798F, + 0xBAD7, 0x798D, 0xBAD8, 0x7A2E, 0xBAD9, 0x7A31, 0xBADA, 0x7AAA, + 0xBADB, 0x7AA9, 0xBADC, 0x7AED, 0xBADD, 0x7AEF, 0xBADE, 0x7BA1, + 0xBADF, 0x7B95, 0xBAE0, 0x7B8B, 0xBAE1, 0x7B75, 0xBAE2, 0x7B97, + 0xBAE3, 0x7B9D, 0xBAE4, 0x7B94, 0xBAE5, 0x7B8F, 0xBAE6, 0x7BB8, + 0xBAE7, 0x7B87, 0xBAE8, 0x7B84, 0xBAE9, 0x7CB9, 0xBAEA, 0x7CBD, + 0xBAEB, 0x7CBE, 0xBAEC, 0x7DBB, 0xBAED, 0x7DB0, 0xBAEE, 0x7D9C, + 0xBAEF, 0x7DBD, 0xBAF0, 0x7DBE, 0xBAF1, 0x7DA0, 0xBAF2, 0x7DCA, + 0xBAF3, 0x7DB4, 0xBAF4, 0x7DB2, 0xBAF5, 0x7DB1, 0xBAF6, 0x7DBA, + 0xBAF7, 0x7DA2, 0xBAF8, 0x7DBF, 0xBAF9, 0x7DB5, 0xBAFA, 0x7DB8, + 0xBAFB, 0x7DAD, 0xBAFC, 0x7DD2, 0xBAFD, 0x7DC7, 0xBAFE, 0x7DAC, + 0xBB40, 0x7F70, 0xBB41, 0x7FE0, 0xBB42, 0x7FE1, 0xBB43, 0x7FDF, + 0xBB44, 0x805E, 0xBB45, 0x805A, 0xBB46, 0x8087, 0xBB47, 0x8150, + 0xBB48, 0x8180, 0xBB49, 0x818F, 0xBB4A, 0x8188, 0xBB4B, 0x818A, + 0xBB4C, 0x817F, 0xBB4D, 0x8182, 0xBB4E, 0x81E7, 0xBB4F, 0x81FA, + 0xBB50, 0x8207, 0xBB51, 0x8214, 0xBB52, 0x821E, 0xBB53, 0x824B, + 0xBB54, 0x84C9, 0xBB55, 0x84BF, 0xBB56, 0x84C6, 0xBB57, 0x84C4, + 0xBB58, 0x8499, 0xBB59, 0x849E, 0xBB5A, 0x84B2, 0xBB5B, 0x849C, + 0xBB5C, 0x84CB, 0xBB5D, 0x84B8, 0xBB5E, 0x84C0, 0xBB5F, 0x84D3, + 0xBB60, 0x8490, 0xBB61, 0x84BC, 0xBB62, 0x84D1, 0xBB63, 0x84CA, + 0xBB64, 0x873F, 0xBB65, 0x871C, 0xBB66, 0x873B, 0xBB67, 0x8722, + 0xBB68, 0x8725, 0xBB69, 0x8734, 0xBB6A, 0x8718, 0xBB6B, 0x8755, + 0xBB6C, 0x8737, 0xBB6D, 0x8729, 0xBB6E, 0x88F3, 0xBB6F, 0x8902, + 0xBB70, 0x88F4, 0xBB71, 0x88F9, 0xBB72, 0x88F8, 0xBB73, 0x88FD, + 0xBB74, 0x88E8, 0xBB75, 0x891A, 0xBB76, 0x88EF, 0xBB77, 0x8AA6, + 0xBB78, 0x8A8C, 0xBB79, 0x8A9E, 0xBB7A, 0x8AA3, 0xBB7B, 0x8A8D, + 0xBB7C, 0x8AA1, 0xBB7D, 0x8A93, 0xBB7E, 0x8AA4, 0xBBA1, 0x8AAA, + 0xBBA2, 0x8AA5, 0xBBA3, 0x8AA8, 0xBBA4, 0x8A98, 0xBBA5, 0x8A91, + 0xBBA6, 0x8A9A, 0xBBA7, 0x8AA7, 0xBBA8, 0x8C6A, 0xBBA9, 0x8C8D, + 0xBBAA, 0x8C8C, 0xBBAB, 0x8CD3, 0xBBAC, 0x8CD1, 0xBBAD, 0x8CD2, + 0xBBAE, 0x8D6B, 0xBBAF, 0x8D99, 0xBBB0, 0x8D95, 0xBBB1, 0x8DFC, + 0xBBB2, 0x8F14, 0xBBB3, 0x8F12, 0xBBB4, 0x8F15, 0xBBB5, 0x8F13, + 0xBBB6, 0x8FA3, 0xBBB7, 0x9060, 0xBBB8, 0x9058, 0xBBB9, 0x905C, + 0xBBBA, 0x9063, 0xBBBB, 0x9059, 0xBBBC, 0x905E, 0xBBBD, 0x9062, + 0xBBBE, 0x905D, 0xBBBF, 0x905B, 0xBBC0, 0x9119, 0xBBC1, 0x9118, + 0xBBC2, 0x911E, 0xBBC3, 0x9175, 0xBBC4, 0x9178, 0xBBC5, 0x9177, + 0xBBC6, 0x9174, 0xBBC7, 0x9278, 0xBBC8, 0x9280, 0xBBC9, 0x9285, + 0xBBCA, 0x9298, 0xBBCB, 0x9296, 0xBBCC, 0x927B, 0xBBCD, 0x9293, + 0xBBCE, 0x929C, 0xBBCF, 0x92A8, 0xBBD0, 0x927C, 0xBBD1, 0x9291, + 0xBBD2, 0x95A1, 0xBBD3, 0x95A8, 0xBBD4, 0x95A9, 0xBBD5, 0x95A3, + 0xBBD6, 0x95A5, 0xBBD7, 0x95A4, 0xBBD8, 0x9699, 0xBBD9, 0x969C, + 0xBBDA, 0x969B, 0xBBDB, 0x96CC, 0xBBDC, 0x96D2, 0xBBDD, 0x9700, + 0xBBDE, 0x977C, 0xBBDF, 0x9785, 0xBBE0, 0x97F6, 0xBBE1, 0x9817, + 0xBBE2, 0x9818, 0xBBE3, 0x98AF, 0xBBE4, 0x98B1, 0xBBE5, 0x9903, + 0xBBE6, 0x9905, 0xBBE7, 0x990C, 0xBBE8, 0x9909, 0xBBE9, 0x99C1, + 0xBBEA, 0x9AAF, 0xBBEB, 0x9AB0, 0xBBEC, 0x9AE6, 0xBBED, 0x9B41, + 0xBBEE, 0x9B42, 0xBBEF, 0x9CF4, 0xBBF0, 0x9CF6, 0xBBF1, 0x9CF3, + 0xBBF2, 0x9EBC, 0xBBF3, 0x9F3B, 0xBBF4, 0x9F4A, 0xBBF5, 0x5104, + 0xBBF6, 0x5100, 0xBBF7, 0x50FB, 0xBBF8, 0x50F5, 0xBBF9, 0x50F9, + 0xBBFA, 0x5102, 0xBBFB, 0x5108, 0xBBFC, 0x5109, 0xBBFD, 0x5105, + 0xBBFE, 0x51DC, 0xBC40, 0x5287, 0xBC41, 0x5288, 0xBC42, 0x5289, + 0xBC43, 0x528D, 0xBC44, 0x528A, 0xBC45, 0x52F0, 0xBC46, 0x53B2, + 0xBC47, 0x562E, 0xBC48, 0x563B, 0xBC49, 0x5639, 0xBC4A, 0x5632, + 0xBC4B, 0x563F, 0xBC4C, 0x5634, 0xBC4D, 0x5629, 0xBC4E, 0x5653, + 0xBC4F, 0x564E, 0xBC50, 0x5657, 0xBC51, 0x5674, 0xBC52, 0x5636, + 0xBC53, 0x562F, 0xBC54, 0x5630, 0xBC55, 0x5880, 0xBC56, 0x589F, + 0xBC57, 0x589E, 0xBC58, 0x58B3, 0xBC59, 0x589C, 0xBC5A, 0x58AE, + 0xBC5B, 0x58A9, 0xBC5C, 0x58A6, 0xBC5D, 0x596D, 0xBC5E, 0x5B09, + 0xBC5F, 0x5AFB, 0xBC60, 0x5B0B, 0xBC61, 0x5AF5, 0xBC62, 0x5B0C, + 0xBC63, 0x5B08, 0xBC64, 0x5BEE, 0xBC65, 0x5BEC, 0xBC66, 0x5BE9, + 0xBC67, 0x5BEB, 0xBC68, 0x5C64, 0xBC69, 0x5C65, 0xBC6A, 0x5D9D, + 0xBC6B, 0x5D94, 0xBC6C, 0x5E62, 0xBC6D, 0x5E5F, 0xBC6E, 0x5E61, + 0xBC6F, 0x5EE2, 0xBC70, 0x5EDA, 0xBC71, 0x5EDF, 0xBC72, 0x5EDD, + 0xBC73, 0x5EE3, 0xBC74, 0x5EE0, 0xBC75, 0x5F48, 0xBC76, 0x5F71, + 0xBC77, 0x5FB7, 0xBC78, 0x5FB5, 0xBC79, 0x6176, 0xBC7A, 0x6167, + 0xBC7B, 0x616E, 0xBC7C, 0x615D, 0xBC7D, 0x6155, 0xBC7E, 0x6182, + 0xBCA1, 0x617C, 0xBCA2, 0x6170, 0xBCA3, 0x616B, 0xBCA4, 0x617E, + 0xBCA5, 0x61A7, 0xBCA6, 0x6190, 0xBCA7, 0x61AB, 0xBCA8, 0x618E, + 0xBCA9, 0x61AC, 0xBCAA, 0x619A, 0xBCAB, 0x61A4, 0xBCAC, 0x6194, + 0xBCAD, 0x61AE, 0xBCAE, 0x622E, 0xBCAF, 0x6469, 0xBCB0, 0x646F, + 0xBCB1, 0x6479, 0xBCB2, 0x649E, 0xBCB3, 0x64B2, 0xBCB4, 0x6488, + 0xBCB5, 0x6490, 0xBCB6, 0x64B0, 0xBCB7, 0x64A5, 0xBCB8, 0x6493, + 0xBCB9, 0x6495, 0xBCBA, 0x64A9, 0xBCBB, 0x6492, 0xBCBC, 0x64AE, + 0xBCBD, 0x64AD, 0xBCBE, 0x64AB, 0xBCBF, 0x649A, 0xBCC0, 0x64AC, + 0xBCC1, 0x6499, 0xBCC2, 0x64A2, 0xBCC3, 0x64B3, 0xBCC4, 0x6575, + 0xBCC5, 0x6577, 0xBCC6, 0x6578, 0xBCC7, 0x66AE, 0xBCC8, 0x66AB, + 0xBCC9, 0x66B4, 0xBCCA, 0x66B1, 0xBCCB, 0x6A23, 0xBCCC, 0x6A1F, + 0xBCCD, 0x69E8, 0xBCCE, 0x6A01, 0xBCCF, 0x6A1E, 0xBCD0, 0x6A19, + 0xBCD1, 0x69FD, 0xBCD2, 0x6A21, 0xBCD3, 0x6A13, 0xBCD4, 0x6A0A, + 0xBCD5, 0x69F3, 0xBCD6, 0x6A02, 0xBCD7, 0x6A05, 0xBCD8, 0x69ED, + 0xBCD9, 0x6A11, 0xBCDA, 0x6B50, 0xBCDB, 0x6B4E, 0xBCDC, 0x6BA4, + 0xBCDD, 0x6BC5, 0xBCDE, 0x6BC6, 0xBCDF, 0x6F3F, 0xBCE0, 0x6F7C, + 0xBCE1, 0x6F84, 0xBCE2, 0x6F51, 0xBCE3, 0x6F66, 0xBCE4, 0x6F54, + 0xBCE5, 0x6F86, 0xBCE6, 0x6F6D, 0xBCE7, 0x6F5B, 0xBCE8, 0x6F78, + 0xBCE9, 0x6F6E, 0xBCEA, 0x6F8E, 0xBCEB, 0x6F7A, 0xBCEC, 0x6F70, + 0xBCED, 0x6F64, 0xBCEE, 0x6F97, 0xBCEF, 0x6F58, 0xBCF0, 0x6ED5, + 0xBCF1, 0x6F6F, 0xBCF2, 0x6F60, 0xBCF3, 0x6F5F, 0xBCF4, 0x719F, + 0xBCF5, 0x71AC, 0xBCF6, 0x71B1, 0xBCF7, 0x71A8, 0xBCF8, 0x7256, + 0xBCF9, 0x729B, 0xBCFA, 0x734E, 0xBCFB, 0x7357, 0xBCFC, 0x7469, + 0xBCFD, 0x748B, 0xBCFE, 0x7483, 0xBD40, 0x747E, 0xBD41, 0x7480, + 0xBD42, 0x757F, 0xBD43, 0x7620, 0xBD44, 0x7629, 0xBD45, 0x761F, + 0xBD46, 0x7624, 0xBD47, 0x7626, 0xBD48, 0x7621, 0xBD49, 0x7622, + 0xBD4A, 0x769A, 0xBD4B, 0x76BA, 0xBD4C, 0x76E4, 0xBD4D, 0x778E, + 0xBD4E, 0x7787, 0xBD4F, 0x778C, 0xBD50, 0x7791, 0xBD51, 0x778B, + 0xBD52, 0x78CB, 0xBD53, 0x78C5, 0xBD54, 0x78BA, 0xBD55, 0x78CA, + 0xBD56, 0x78BE, 0xBD57, 0x78D5, 0xBD58, 0x78BC, 0xBD59, 0x78D0, + 0xBD5A, 0x7A3F, 0xBD5B, 0x7A3C, 0xBD5C, 0x7A40, 0xBD5D, 0x7A3D, + 0xBD5E, 0x7A37, 0xBD5F, 0x7A3B, 0xBD60, 0x7AAF, 0xBD61, 0x7AAE, + 0xBD62, 0x7BAD, 0xBD63, 0x7BB1, 0xBD64, 0x7BC4, 0xBD65, 0x7BB4, + 0xBD66, 0x7BC6, 0xBD67, 0x7BC7, 0xBD68, 0x7BC1, 0xBD69, 0x7BA0, + 0xBD6A, 0x7BCC, 0xBD6B, 0x7CCA, 0xBD6C, 0x7DE0, 0xBD6D, 0x7DF4, + 0xBD6E, 0x7DEF, 0xBD6F, 0x7DFB, 0xBD70, 0x7DD8, 0xBD71, 0x7DEC, + 0xBD72, 0x7DDD, 0xBD73, 0x7DE8, 0xBD74, 0x7DE3, 0xBD75, 0x7DDA, + 0xBD76, 0x7DDE, 0xBD77, 0x7DE9, 0xBD78, 0x7D9E, 0xBD79, 0x7DD9, + 0xBD7A, 0x7DF2, 0xBD7B, 0x7DF9, 0xBD7C, 0x7F75, 0xBD7D, 0x7F77, + 0xBD7E, 0x7FAF, 0xBDA1, 0x7FE9, 0xBDA2, 0x8026, 0xBDA3, 0x819B, + 0xBDA4, 0x819C, 0xBDA5, 0x819D, 0xBDA6, 0x81A0, 0xBDA7, 0x819A, + 0xBDA8, 0x8198, 0xBDA9, 0x8517, 0xBDAA, 0x853D, 0xBDAB, 0x851A, + 0xBDAC, 0x84EE, 0xBDAD, 0x852C, 0xBDAE, 0x852D, 0xBDAF, 0x8513, + 0xBDB0, 0x8511, 0xBDB1, 0x8523, 0xBDB2, 0x8521, 0xBDB3, 0x8514, + 0xBDB4, 0x84EC, 0xBDB5, 0x8525, 0xBDB6, 0x84FF, 0xBDB7, 0x8506, + 0xBDB8, 0x8782, 0xBDB9, 0x8774, 0xBDBA, 0x8776, 0xBDBB, 0x8760, + 0xBDBC, 0x8766, 0xBDBD, 0x8778, 0xBDBE, 0x8768, 0xBDBF, 0x8759, + 0xBDC0, 0x8757, 0xBDC1, 0x874C, 0xBDC2, 0x8753, 0xBDC3, 0x885B, + 0xBDC4, 0x885D, 0xBDC5, 0x8910, 0xBDC6, 0x8907, 0xBDC7, 0x8912, + 0xBDC8, 0x8913, 0xBDC9, 0x8915, 0xBDCA, 0x890A, 0xBDCB, 0x8ABC, + 0xBDCC, 0x8AD2, 0xBDCD, 0x8AC7, 0xBDCE, 0x8AC4, 0xBDCF, 0x8A95, + 0xBDD0, 0x8ACB, 0xBDD1, 0x8AF8, 0xBDD2, 0x8AB2, 0xBDD3, 0x8AC9, + 0xBDD4, 0x8AC2, 0xBDD5, 0x8ABF, 0xBDD6, 0x8AB0, 0xBDD7, 0x8AD6, + 0xBDD8, 0x8ACD, 0xBDD9, 0x8AB6, 0xBDDA, 0x8AB9, 0xBDDB, 0x8ADB, + 0xBDDC, 0x8C4C, 0xBDDD, 0x8C4E, 0xBDDE, 0x8C6C, 0xBDDF, 0x8CE0, + 0xBDE0, 0x8CDE, 0xBDE1, 0x8CE6, 0xBDE2, 0x8CE4, 0xBDE3, 0x8CEC, + 0xBDE4, 0x8CED, 0xBDE5, 0x8CE2, 0xBDE6, 0x8CE3, 0xBDE7, 0x8CDC, + 0xBDE8, 0x8CEA, 0xBDE9, 0x8CE1, 0xBDEA, 0x8D6D, 0xBDEB, 0x8D9F, + 0xBDEC, 0x8DA3, 0xBDED, 0x8E2B, 0xBDEE, 0x8E10, 0xBDEF, 0x8E1D, + 0xBDF0, 0x8E22, 0xBDF1, 0x8E0F, 0xBDF2, 0x8E29, 0xBDF3, 0x8E1F, + 0xBDF4, 0x8E21, 0xBDF5, 0x8E1E, 0xBDF6, 0x8EBA, 0xBDF7, 0x8F1D, + 0xBDF8, 0x8F1B, 0xBDF9, 0x8F1F, 0xBDFA, 0x8F29, 0xBDFB, 0x8F26, + 0xBDFC, 0x8F2A, 0xBDFD, 0x8F1C, 0xBDFE, 0x8F1E, 0xBE40, 0x8F25, + 0xBE41, 0x9069, 0xBE42, 0x906E, 0xBE43, 0x9068, 0xBE44, 0x906D, + 0xBE45, 0x9077, 0xBE46, 0x9130, 0xBE47, 0x912D, 0xBE48, 0x9127, + 0xBE49, 0x9131, 0xBE4A, 0x9187, 0xBE4B, 0x9189, 0xBE4C, 0x918B, + 0xBE4D, 0x9183, 0xBE4E, 0x92C5, 0xBE4F, 0x92BB, 0xBE50, 0x92B7, + 0xBE51, 0x92EA, 0xBE52, 0x92AC, 0xBE53, 0x92E4, 0xBE54, 0x92C1, + 0xBE55, 0x92B3, 0xBE56, 0x92BC, 0xBE57, 0x92D2, 0xBE58, 0x92C7, + 0xBE59, 0x92F0, 0xBE5A, 0x92B2, 0xBE5B, 0x95AD, 0xBE5C, 0x95B1, + 0xBE5D, 0x9704, 0xBE5E, 0x9706, 0xBE5F, 0x9707, 0xBE60, 0x9709, + 0xBE61, 0x9760, 0xBE62, 0x978D, 0xBE63, 0x978B, 0xBE64, 0x978F, + 0xBE65, 0x9821, 0xBE66, 0x982B, 0xBE67, 0x981C, 0xBE68, 0x98B3, + 0xBE69, 0x990A, 0xBE6A, 0x9913, 0xBE6B, 0x9912, 0xBE6C, 0x9918, + 0xBE6D, 0x99DD, 0xBE6E, 0x99D0, 0xBE6F, 0x99DF, 0xBE70, 0x99DB, + 0xBE71, 0x99D1, 0xBE72, 0x99D5, 0xBE73, 0x99D2, 0xBE74, 0x99D9, + 0xBE75, 0x9AB7, 0xBE76, 0x9AEE, 0xBE77, 0x9AEF, 0xBE78, 0x9B27, + 0xBE79, 0x9B45, 0xBE7A, 0x9B44, 0xBE7B, 0x9B77, 0xBE7C, 0x9B6F, + 0xBE7D, 0x9D06, 0xBE7E, 0x9D09, 0xBEA1, 0x9D03, 0xBEA2, 0x9EA9, + 0xBEA3, 0x9EBE, 0xBEA4, 0x9ECE, 0xBEA5, 0x58A8, 0xBEA6, 0x9F52, + 0xBEA7, 0x5112, 0xBEA8, 0x5118, 0xBEA9, 0x5114, 0xBEAA, 0x5110, + 0xBEAB, 0x5115, 0xBEAC, 0x5180, 0xBEAD, 0x51AA, 0xBEAE, 0x51DD, + 0xBEAF, 0x5291, 0xBEB0, 0x5293, 0xBEB1, 0x52F3, 0xBEB2, 0x5659, + 0xBEB3, 0x566B, 0xBEB4, 0x5679, 0xBEB5, 0x5669, 0xBEB6, 0x5664, + 0xBEB7, 0x5678, 0xBEB8, 0x566A, 0xBEB9, 0x5668, 0xBEBA, 0x5665, + 0xBEBB, 0x5671, 0xBEBC, 0x566F, 0xBEBD, 0x566C, 0xBEBE, 0x5662, + 0xBEBF, 0x5676, 0xBEC0, 0x58C1, 0xBEC1, 0x58BE, 0xBEC2, 0x58C7, + 0xBEC3, 0x58C5, 0xBEC4, 0x596E, 0xBEC5, 0x5B1D, 0xBEC6, 0x5B34, + 0xBEC7, 0x5B78, 0xBEC8, 0x5BF0, 0xBEC9, 0x5C0E, 0xBECA, 0x5F4A, + 0xBECB, 0x61B2, 0xBECC, 0x6191, 0xBECD, 0x61A9, 0xBECE, 0x618A, + 0xBECF, 0x61CD, 0xBED0, 0x61B6, 0xBED1, 0x61BE, 0xBED2, 0x61CA, + 0xBED3, 0x61C8, 0xBED4, 0x6230, 0xBED5, 0x64C5, 0xBED6, 0x64C1, + 0xBED7, 0x64CB, 0xBED8, 0x64BB, 0xBED9, 0x64BC, 0xBEDA, 0x64DA, + 0xBEDB, 0x64C4, 0xBEDC, 0x64C7, 0xBEDD, 0x64C2, 0xBEDE, 0x64CD, + 0xBEDF, 0x64BF, 0xBEE0, 0x64D2, 0xBEE1, 0x64D4, 0xBEE2, 0x64BE, + 0xBEE3, 0x6574, 0xBEE4, 0x66C6, 0xBEE5, 0x66C9, 0xBEE6, 0x66B9, + 0xBEE7, 0x66C4, 0xBEE8, 0x66C7, 0xBEE9, 0x66B8, 0xBEEA, 0x6A3D, + 0xBEEB, 0x6A38, 0xBEEC, 0x6A3A, 0xBEED, 0x6A59, 0xBEEE, 0x6A6B, + 0xBEEF, 0x6A58, 0xBEF0, 0x6A39, 0xBEF1, 0x6A44, 0xBEF2, 0x6A62, + 0xBEF3, 0x6A61, 0xBEF4, 0x6A4B, 0xBEF5, 0x6A47, 0xBEF6, 0x6A35, + 0xBEF7, 0x6A5F, 0xBEF8, 0x6A48, 0xBEF9, 0x6B59, 0xBEFA, 0x6B77, + 0xBEFB, 0x6C05, 0xBEFC, 0x6FC2, 0xBEFD, 0x6FB1, 0xBEFE, 0x6FA1, + 0xBF40, 0x6FC3, 0xBF41, 0x6FA4, 0xBF42, 0x6FC1, 0xBF43, 0x6FA7, + 0xBF44, 0x6FB3, 0xBF45, 0x6FC0, 0xBF46, 0x6FB9, 0xBF47, 0x6FB6, + 0xBF48, 0x6FA6, 0xBF49, 0x6FA0, 0xBF4A, 0x6FB4, 0xBF4B, 0x71BE, + 0xBF4C, 0x71C9, 0xBF4D, 0x71D0, 0xBF4E, 0x71D2, 0xBF4F, 0x71C8, + 0xBF50, 0x71D5, 0xBF51, 0x71B9, 0xBF52, 0x71CE, 0xBF53, 0x71D9, + 0xBF54, 0x71DC, 0xBF55, 0x71C3, 0xBF56, 0x71C4, 0xBF57, 0x7368, + 0xBF58, 0x749C, 0xBF59, 0x74A3, 0xBF5A, 0x7498, 0xBF5B, 0x749F, + 0xBF5C, 0x749E, 0xBF5D, 0x74E2, 0xBF5E, 0x750C, 0xBF5F, 0x750D, + 0xBF60, 0x7634, 0xBF61, 0x7638, 0xBF62, 0x763A, 0xBF63, 0x76E7, + 0xBF64, 0x76E5, 0xBF65, 0x77A0, 0xBF66, 0x779E, 0xBF67, 0x779F, + 0xBF68, 0x77A5, 0xBF69, 0x78E8, 0xBF6A, 0x78DA, 0xBF6B, 0x78EC, + 0xBF6C, 0x78E7, 0xBF6D, 0x79A6, 0xBF6E, 0x7A4D, 0xBF6F, 0x7A4E, + 0xBF70, 0x7A46, 0xBF71, 0x7A4C, 0xBF72, 0x7A4B, 0xBF73, 0x7ABA, + 0xBF74, 0x7BD9, 0xBF75, 0x7C11, 0xBF76, 0x7BC9, 0xBF77, 0x7BE4, + 0xBF78, 0x7BDB, 0xBF79, 0x7BE1, 0xBF7A, 0x7BE9, 0xBF7B, 0x7BE6, + 0xBF7C, 0x7CD5, 0xBF7D, 0x7CD6, 0xBF7E, 0x7E0A, 0xBFA1, 0x7E11, + 0xBFA2, 0x7E08, 0xBFA3, 0x7E1B, 0xBFA4, 0x7E23, 0xBFA5, 0x7E1E, + 0xBFA6, 0x7E1D, 0xBFA7, 0x7E09, 0xBFA8, 0x7E10, 0xBFA9, 0x7F79, + 0xBFAA, 0x7FB2, 0xBFAB, 0x7FF0, 0xBFAC, 0x7FF1, 0xBFAD, 0x7FEE, + 0xBFAE, 0x8028, 0xBFAF, 0x81B3, 0xBFB0, 0x81A9, 0xBFB1, 0x81A8, + 0xBFB2, 0x81FB, 0xBFB3, 0x8208, 0xBFB4, 0x8258, 0xBFB5, 0x8259, + 0xBFB6, 0x854A, 0xBFB7, 0x8559, 0xBFB8, 0x8548, 0xBFB9, 0x8568, + 0xBFBA, 0x8569, 0xBFBB, 0x8543, 0xBFBC, 0x8549, 0xBFBD, 0x856D, + 0xBFBE, 0x856A, 0xBFBF, 0x855E, 0xBFC0, 0x8783, 0xBFC1, 0x879F, + 0xBFC2, 0x879E, 0xBFC3, 0x87A2, 0xBFC4, 0x878D, 0xBFC5, 0x8861, + 0xBFC6, 0x892A, 0xBFC7, 0x8932, 0xBFC8, 0x8925, 0xBFC9, 0x892B, + 0xBFCA, 0x8921, 0xBFCB, 0x89AA, 0xBFCC, 0x89A6, 0xBFCD, 0x8AE6, + 0xBFCE, 0x8AFA, 0xBFCF, 0x8AEB, 0xBFD0, 0x8AF1, 0xBFD1, 0x8B00, + 0xBFD2, 0x8ADC, 0xBFD3, 0x8AE7, 0xBFD4, 0x8AEE, 0xBFD5, 0x8AFE, + 0xBFD6, 0x8B01, 0xBFD7, 0x8B02, 0xBFD8, 0x8AF7, 0xBFD9, 0x8AED, + 0xBFDA, 0x8AF3, 0xBFDB, 0x8AF6, 0xBFDC, 0x8AFC, 0xBFDD, 0x8C6B, + 0xBFDE, 0x8C6D, 0xBFDF, 0x8C93, 0xBFE0, 0x8CF4, 0xBFE1, 0x8E44, + 0xBFE2, 0x8E31, 0xBFE3, 0x8E34, 0xBFE4, 0x8E42, 0xBFE5, 0x8E39, + 0xBFE6, 0x8E35, 0xBFE7, 0x8F3B, 0xBFE8, 0x8F2F, 0xBFE9, 0x8F38, + 0xBFEA, 0x8F33, 0xBFEB, 0x8FA8, 0xBFEC, 0x8FA6, 0xBFED, 0x9075, + 0xBFEE, 0x9074, 0xBFEF, 0x9078, 0xBFF0, 0x9072, 0xBFF1, 0x907C, + 0xBFF2, 0x907A, 0xBFF3, 0x9134, 0xBFF4, 0x9192, 0xBFF5, 0x9320, + 0xBFF6, 0x9336, 0xBFF7, 0x92F8, 0xBFF8, 0x9333, 0xBFF9, 0x932F, + 0xBFFA, 0x9322, 0xBFFB, 0x92FC, 0xBFFC, 0x932B, 0xBFFD, 0x9304, + 0xBFFE, 0x931A, 0xC040, 0x9310, 0xC041, 0x9326, 0xC042, 0x9321, + 0xC043, 0x9315, 0xC044, 0x932E, 0xC045, 0x9319, 0xC046, 0x95BB, + 0xC047, 0x96A7, 0xC048, 0x96A8, 0xC049, 0x96AA, 0xC04A, 0x96D5, + 0xC04B, 0x970E, 0xC04C, 0x9711, 0xC04D, 0x9716, 0xC04E, 0x970D, + 0xC04F, 0x9713, 0xC050, 0x970F, 0xC051, 0x975B, 0xC052, 0x975C, + 0xC053, 0x9766, 0xC054, 0x9798, 0xC055, 0x9830, 0xC056, 0x9838, + 0xC057, 0x983B, 0xC058, 0x9837, 0xC059, 0x982D, 0xC05A, 0x9839, + 0xC05B, 0x9824, 0xC05C, 0x9910, 0xC05D, 0x9928, 0xC05E, 0x991E, + 0xC05F, 0x991B, 0xC060, 0x9921, 0xC061, 0x991A, 0xC062, 0x99ED, + 0xC063, 0x99E2, 0xC064, 0x99F1, 0xC065, 0x9AB8, 0xC066, 0x9ABC, + 0xC067, 0x9AFB, 0xC068, 0x9AED, 0xC069, 0x9B28, 0xC06A, 0x9B91, + 0xC06B, 0x9D15, 0xC06C, 0x9D23, 0xC06D, 0x9D26, 0xC06E, 0x9D28, + 0xC06F, 0x9D12, 0xC070, 0x9D1B, 0xC071, 0x9ED8, 0xC072, 0x9ED4, + 0xC073, 0x9F8D, 0xC074, 0x9F9C, 0xC075, 0x512A, 0xC076, 0x511F, + 0xC077, 0x5121, 0xC078, 0x5132, 0xC079, 0x52F5, 0xC07A, 0x568E, + 0xC07B, 0x5680, 0xC07C, 0x5690, 0xC07D, 0x5685, 0xC07E, 0x5687, + 0xC0A1, 0x568F, 0xC0A2, 0x58D5, 0xC0A3, 0x58D3, 0xC0A4, 0x58D1, + 0xC0A5, 0x58CE, 0xC0A6, 0x5B30, 0xC0A7, 0x5B2A, 0xC0A8, 0x5B24, + 0xC0A9, 0x5B7A, 0xC0AA, 0x5C37, 0xC0AB, 0x5C68, 0xC0AC, 0x5DBC, + 0xC0AD, 0x5DBA, 0xC0AE, 0x5DBD, 0xC0AF, 0x5DB8, 0xC0B0, 0x5E6B, + 0xC0B1, 0x5F4C, 0xC0B2, 0x5FBD, 0xC0B3, 0x61C9, 0xC0B4, 0x61C2, + 0xC0B5, 0x61C7, 0xC0B6, 0x61E6, 0xC0B7, 0x61CB, 0xC0B8, 0x6232, + 0xC0B9, 0x6234, 0xC0BA, 0x64CE, 0xC0BB, 0x64CA, 0xC0BC, 0x64D8, + 0xC0BD, 0x64E0, 0xC0BE, 0x64F0, 0xC0BF, 0x64E6, 0xC0C0, 0x64EC, + 0xC0C1, 0x64F1, 0xC0C2, 0x64E2, 0xC0C3, 0x64ED, 0xC0C4, 0x6582, + 0xC0C5, 0x6583, 0xC0C6, 0x66D9, 0xC0C7, 0x66D6, 0xC0C8, 0x6A80, + 0xC0C9, 0x6A94, 0xC0CA, 0x6A84, 0xC0CB, 0x6AA2, 0xC0CC, 0x6A9C, + 0xC0CD, 0x6ADB, 0xC0CE, 0x6AA3, 0xC0CF, 0x6A7E, 0xC0D0, 0x6A97, + 0xC0D1, 0x6A90, 0xC0D2, 0x6AA0, 0xC0D3, 0x6B5C, 0xC0D4, 0x6BAE, + 0xC0D5, 0x6BDA, 0xC0D6, 0x6C08, 0xC0D7, 0x6FD8, 0xC0D8, 0x6FF1, + 0xC0D9, 0x6FDF, 0xC0DA, 0x6FE0, 0xC0DB, 0x6FDB, 0xC0DC, 0x6FE4, + 0xC0DD, 0x6FEB, 0xC0DE, 0x6FEF, 0xC0DF, 0x6F80, 0xC0E0, 0x6FEC, + 0xC0E1, 0x6FE1, 0xC0E2, 0x6FE9, 0xC0E3, 0x6FD5, 0xC0E4, 0x6FEE, + 0xC0E5, 0x6FF0, 0xC0E6, 0x71E7, 0xC0E7, 0x71DF, 0xC0E8, 0x71EE, + 0xC0E9, 0x71E6, 0xC0EA, 0x71E5, 0xC0EB, 0x71ED, 0xC0EC, 0x71EC, + 0xC0ED, 0x71F4, 0xC0EE, 0x71E0, 0xC0EF, 0x7235, 0xC0F0, 0x7246, + 0xC0F1, 0x7370, 0xC0F2, 0x7372, 0xC0F3, 0x74A9, 0xC0F4, 0x74B0, + 0xC0F5, 0x74A6, 0xC0F6, 0x74A8, 0xC0F7, 0x7646, 0xC0F8, 0x7642, + 0xC0F9, 0x764C, 0xC0FA, 0x76EA, 0xC0FB, 0x77B3, 0xC0FC, 0x77AA, + 0xC0FD, 0x77B0, 0xC0FE, 0x77AC, 0xC140, 0x77A7, 0xC141, 0x77AD, + 0xC142, 0x77EF, 0xC143, 0x78F7, 0xC144, 0x78FA, 0xC145, 0x78F4, + 0xC146, 0x78EF, 0xC147, 0x7901, 0xC148, 0x79A7, 0xC149, 0x79AA, + 0xC14A, 0x7A57, 0xC14B, 0x7ABF, 0xC14C, 0x7C07, 0xC14D, 0x7C0D, + 0xC14E, 0x7BFE, 0xC14F, 0x7BF7, 0xC150, 0x7C0C, 0xC151, 0x7BE0, + 0xC152, 0x7CE0, 0xC153, 0x7CDC, 0xC154, 0x7CDE, 0xC155, 0x7CE2, + 0xC156, 0x7CDF, 0xC157, 0x7CD9, 0xC158, 0x7CDD, 0xC159, 0x7E2E, + 0xC15A, 0x7E3E, 0xC15B, 0x7E46, 0xC15C, 0x7E37, 0xC15D, 0x7E32, + 0xC15E, 0x7E43, 0xC15F, 0x7E2B, 0xC160, 0x7E3D, 0xC161, 0x7E31, + 0xC162, 0x7E45, 0xC163, 0x7E41, 0xC164, 0x7E34, 0xC165, 0x7E39, + 0xC166, 0x7E48, 0xC167, 0x7E35, 0xC168, 0x7E3F, 0xC169, 0x7E2F, + 0xC16A, 0x7F44, 0xC16B, 0x7FF3, 0xC16C, 0x7FFC, 0xC16D, 0x8071, + 0xC16E, 0x8072, 0xC16F, 0x8070, 0xC170, 0x806F, 0xC171, 0x8073, + 0xC172, 0x81C6, 0xC173, 0x81C3, 0xC174, 0x81BA, 0xC175, 0x81C2, + 0xC176, 0x81C0, 0xC177, 0x81BF, 0xC178, 0x81BD, 0xC179, 0x81C9, + 0xC17A, 0x81BE, 0xC17B, 0x81E8, 0xC17C, 0x8209, 0xC17D, 0x8271, + 0xC17E, 0x85AA, 0xC1A1, 0x8584, 0xC1A2, 0x857E, 0xC1A3, 0x859C, + 0xC1A4, 0x8591, 0xC1A5, 0x8594, 0xC1A6, 0x85AF, 0xC1A7, 0x859B, + 0xC1A8, 0x8587, 0xC1A9, 0x85A8, 0xC1AA, 0x858A, 0xC1AB, 0x8667, + 0xC1AC, 0x87C0, 0xC1AD, 0x87D1, 0xC1AE, 0x87B3, 0xC1AF, 0x87D2, + 0xC1B0, 0x87C6, 0xC1B1, 0x87AB, 0xC1B2, 0x87BB, 0xC1B3, 0x87BA, + 0xC1B4, 0x87C8, 0xC1B5, 0x87CB, 0xC1B6, 0x893B, 0xC1B7, 0x8936, + 0xC1B8, 0x8944, 0xC1B9, 0x8938, 0xC1BA, 0x893D, 0xC1BB, 0x89AC, + 0xC1BC, 0x8B0E, 0xC1BD, 0x8B17, 0xC1BE, 0x8B19, 0xC1BF, 0x8B1B, + 0xC1C0, 0x8B0A, 0xC1C1, 0x8B20, 0xC1C2, 0x8B1D, 0xC1C3, 0x8B04, + 0xC1C4, 0x8B10, 0xC1C5, 0x8C41, 0xC1C6, 0x8C3F, 0xC1C7, 0x8C73, + 0xC1C8, 0x8CFA, 0xC1C9, 0x8CFD, 0xC1CA, 0x8CFC, 0xC1CB, 0x8CF8, + 0xC1CC, 0x8CFB, 0xC1CD, 0x8DA8, 0xC1CE, 0x8E49, 0xC1CF, 0x8E4B, + 0xC1D0, 0x8E48, 0xC1D1, 0x8E4A, 0xC1D2, 0x8F44, 0xC1D3, 0x8F3E, + 0xC1D4, 0x8F42, 0xC1D5, 0x8F45, 0xC1D6, 0x8F3F, 0xC1D7, 0x907F, + 0xC1D8, 0x907D, 0xC1D9, 0x9084, 0xC1DA, 0x9081, 0xC1DB, 0x9082, + 0xC1DC, 0x9080, 0xC1DD, 0x9139, 0xC1DE, 0x91A3, 0xC1DF, 0x919E, + 0xC1E0, 0x919C, 0xC1E1, 0x934D, 0xC1E2, 0x9382, 0xC1E3, 0x9328, + 0xC1E4, 0x9375, 0xC1E5, 0x934A, 0xC1E6, 0x9365, 0xC1E7, 0x934B, + 0xC1E8, 0x9318, 0xC1E9, 0x937E, 0xC1EA, 0x936C, 0xC1EB, 0x935B, + 0xC1EC, 0x9370, 0xC1ED, 0x935A, 0xC1EE, 0x9354, 0xC1EF, 0x95CA, + 0xC1F0, 0x95CB, 0xC1F1, 0x95CC, 0xC1F2, 0x95C8, 0xC1F3, 0x95C6, + 0xC1F4, 0x96B1, 0xC1F5, 0x96B8, 0xC1F6, 0x96D6, 0xC1F7, 0x971C, + 0xC1F8, 0x971E, 0xC1F9, 0x97A0, 0xC1FA, 0x97D3, 0xC1FB, 0x9846, + 0xC1FC, 0x98B6, 0xC1FD, 0x9935, 0xC1FE, 0x9A01, 0xC240, 0x99FF, + 0xC241, 0x9BAE, 0xC242, 0x9BAB, 0xC243, 0x9BAA, 0xC244, 0x9BAD, + 0xC245, 0x9D3B, 0xC246, 0x9D3F, 0xC247, 0x9E8B, 0xC248, 0x9ECF, + 0xC249, 0x9EDE, 0xC24A, 0x9EDC, 0xC24B, 0x9EDD, 0xC24C, 0x9EDB, + 0xC24D, 0x9F3E, 0xC24E, 0x9F4B, 0xC24F, 0x53E2, 0xC250, 0x5695, + 0xC251, 0x56AE, 0xC252, 0x58D9, 0xC253, 0x58D8, 0xC254, 0x5B38, + 0xC255, 0x5F5D, 0xC256, 0x61E3, 0xC257, 0x6233, 0xC258, 0x64F4, + 0xC259, 0x64F2, 0xC25A, 0x64FE, 0xC25B, 0x6506, 0xC25C, 0x64FA, + 0xC25D, 0x64FB, 0xC25E, 0x64F7, 0xC25F, 0x65B7, 0xC260, 0x66DC, + 0xC261, 0x6726, 0xC262, 0x6AB3, 0xC263, 0x6AAC, 0xC264, 0x6AC3, + 0xC265, 0x6ABB, 0xC266, 0x6AB8, 0xC267, 0x6AC2, 0xC268, 0x6AAE, + 0xC269, 0x6AAF, 0xC26A, 0x6B5F, 0xC26B, 0x6B78, 0xC26C, 0x6BAF, + 0xC26D, 0x7009, 0xC26E, 0x700B, 0xC26F, 0x6FFE, 0xC270, 0x7006, + 0xC271, 0x6FFA, 0xC272, 0x7011, 0xC273, 0x700F, 0xC274, 0x71FB, + 0xC275, 0x71FC, 0xC276, 0x71FE, 0xC277, 0x71F8, 0xC278, 0x7377, + 0xC279, 0x7375, 0xC27A, 0x74A7, 0xC27B, 0x74BF, 0xC27C, 0x7515, + 0xC27D, 0x7656, 0xC27E, 0x7658, 0xC2A1, 0x7652, 0xC2A2, 0x77BD, + 0xC2A3, 0x77BF, 0xC2A4, 0x77BB, 0xC2A5, 0x77BC, 0xC2A6, 0x790E, + 0xC2A7, 0x79AE, 0xC2A8, 0x7A61, 0xC2A9, 0x7A62, 0xC2AA, 0x7A60, + 0xC2AB, 0x7AC4, 0xC2AC, 0x7AC5, 0xC2AD, 0x7C2B, 0xC2AE, 0x7C27, + 0xC2AF, 0x7C2A, 0xC2B0, 0x7C1E, 0xC2B1, 0x7C23, 0xC2B2, 0x7C21, + 0xC2B3, 0x7CE7, 0xC2B4, 0x7E54, 0xC2B5, 0x7E55, 0xC2B6, 0x7E5E, + 0xC2B7, 0x7E5A, 0xC2B8, 0x7E61, 0xC2B9, 0x7E52, 0xC2BA, 0x7E59, + 0xC2BB, 0x7F48, 0xC2BC, 0x7FF9, 0xC2BD, 0x7FFB, 0xC2BE, 0x8077, + 0xC2BF, 0x8076, 0xC2C0, 0x81CD, 0xC2C1, 0x81CF, 0xC2C2, 0x820A, + 0xC2C3, 0x85CF, 0xC2C4, 0x85A9, 0xC2C5, 0x85CD, 0xC2C6, 0x85D0, + 0xC2C7, 0x85C9, 0xC2C8, 0x85B0, 0xC2C9, 0x85BA, 0xC2CA, 0x85B9, + 0xC2CB, 0x85A6, 0xC2CC, 0x87EF, 0xC2CD, 0x87EC, 0xC2CE, 0x87F2, + 0xC2CF, 0x87E0, 0xC2D0, 0x8986, 0xC2D1, 0x89B2, 0xC2D2, 0x89F4, + 0xC2D3, 0x8B28, 0xC2D4, 0x8B39, 0xC2D5, 0x8B2C, 0xC2D6, 0x8B2B, + 0xC2D7, 0x8C50, 0xC2D8, 0x8D05, 0xC2D9, 0x8E59, 0xC2DA, 0x8E63, + 0xC2DB, 0x8E66, 0xC2DC, 0x8E64, 0xC2DD, 0x8E5F, 0xC2DE, 0x8E55, + 0xC2DF, 0x8EC0, 0xC2E0, 0x8F49, 0xC2E1, 0x8F4D, 0xC2E2, 0x9087, + 0xC2E3, 0x9083, 0xC2E4, 0x9088, 0xC2E5, 0x91AB, 0xC2E6, 0x91AC, + 0xC2E7, 0x91D0, 0xC2E8, 0x9394, 0xC2E9, 0x938A, 0xC2EA, 0x9396, + 0xC2EB, 0x93A2, 0xC2EC, 0x93B3, 0xC2ED, 0x93AE, 0xC2EE, 0x93AC, + 0xC2EF, 0x93B0, 0xC2F0, 0x9398, 0xC2F1, 0x939A, 0xC2F2, 0x9397, + 0xC2F3, 0x95D4, 0xC2F4, 0x95D6, 0xC2F5, 0x95D0, 0xC2F6, 0x95D5, + 0xC2F7, 0x96E2, 0xC2F8, 0x96DC, 0xC2F9, 0x96D9, 0xC2FA, 0x96DB, + 0xC2FB, 0x96DE, 0xC2FC, 0x9724, 0xC2FD, 0x97A3, 0xC2FE, 0x97A6, + 0xC340, 0x97AD, 0xC341, 0x97F9, 0xC342, 0x984D, 0xC343, 0x984F, + 0xC344, 0x984C, 0xC345, 0x984E, 0xC346, 0x9853, 0xC347, 0x98BA, + 0xC348, 0x993E, 0xC349, 0x993F, 0xC34A, 0x993D, 0xC34B, 0x992E, + 0xC34C, 0x99A5, 0xC34D, 0x9A0E, 0xC34E, 0x9AC1, 0xC34F, 0x9B03, + 0xC350, 0x9B06, 0xC351, 0x9B4F, 0xC352, 0x9B4E, 0xC353, 0x9B4D, + 0xC354, 0x9BCA, 0xC355, 0x9BC9, 0xC356, 0x9BFD, 0xC357, 0x9BC8, + 0xC358, 0x9BC0, 0xC359, 0x9D51, 0xC35A, 0x9D5D, 0xC35B, 0x9D60, + 0xC35C, 0x9EE0, 0xC35D, 0x9F15, 0xC35E, 0x9F2C, 0xC35F, 0x5133, + 0xC360, 0x56A5, 0xC361, 0x58DE, 0xC362, 0x58DF, 0xC363, 0x58E2, + 0xC364, 0x5BF5, 0xC365, 0x9F90, 0xC366, 0x5EEC, 0xC367, 0x61F2, + 0xC368, 0x61F7, 0xC369, 0x61F6, 0xC36A, 0x61F5, 0xC36B, 0x6500, + 0xC36C, 0x650F, 0xC36D, 0x66E0, 0xC36E, 0x66DD, 0xC36F, 0x6AE5, + 0xC370, 0x6ADD, 0xC371, 0x6ADA, 0xC372, 0x6AD3, 0xC373, 0x701B, + 0xC374, 0x701F, 0xC375, 0x7028, 0xC376, 0x701A, 0xC377, 0x701D, + 0xC378, 0x7015, 0xC379, 0x7018, 0xC37A, 0x7206, 0xC37B, 0x720D, + 0xC37C, 0x7258, 0xC37D, 0x72A2, 0xC37E, 0x7378, 0xC3A1, 0x737A, + 0xC3A2, 0x74BD, 0xC3A3, 0x74CA, 0xC3A4, 0x74E3, 0xC3A5, 0x7587, + 0xC3A6, 0x7586, 0xC3A7, 0x765F, 0xC3A8, 0x7661, 0xC3A9, 0x77C7, + 0xC3AA, 0x7919, 0xC3AB, 0x79B1, 0xC3AC, 0x7A6B, 0xC3AD, 0x7A69, + 0xC3AE, 0x7C3E, 0xC3AF, 0x7C3F, 0xC3B0, 0x7C38, 0xC3B1, 0x7C3D, + 0xC3B2, 0x7C37, 0xC3B3, 0x7C40, 0xC3B4, 0x7E6B, 0xC3B5, 0x7E6D, + 0xC3B6, 0x7E79, 0xC3B7, 0x7E69, 0xC3B8, 0x7E6A, 0xC3B9, 0x7F85, + 0xC3BA, 0x7E73, 0xC3BB, 0x7FB6, 0xC3BC, 0x7FB9, 0xC3BD, 0x7FB8, + 0xC3BE, 0x81D8, 0xC3BF, 0x85E9, 0xC3C0, 0x85DD, 0xC3C1, 0x85EA, + 0xC3C2, 0x85D5, 0xC3C3, 0x85E4, 0xC3C4, 0x85E5, 0xC3C5, 0x85F7, + 0xC3C6, 0x87FB, 0xC3C7, 0x8805, 0xC3C8, 0x880D, 0xC3C9, 0x87F9, + 0xC3CA, 0x87FE, 0xC3CB, 0x8960, 0xC3CC, 0x895F, 0xC3CD, 0x8956, + 0xC3CE, 0x895E, 0xC3CF, 0x8B41, 0xC3D0, 0x8B5C, 0xC3D1, 0x8B58, + 0xC3D2, 0x8B49, 0xC3D3, 0x8B5A, 0xC3D4, 0x8B4E, 0xC3D5, 0x8B4F, + 0xC3D6, 0x8B46, 0xC3D7, 0x8B59, 0xC3D8, 0x8D08, 0xC3D9, 0x8D0A, + 0xC3DA, 0x8E7C, 0xC3DB, 0x8E72, 0xC3DC, 0x8E87, 0xC3DD, 0x8E76, + 0xC3DE, 0x8E6C, 0xC3DF, 0x8E7A, 0xC3E0, 0x8E74, 0xC3E1, 0x8F54, + 0xC3E2, 0x8F4E, 0xC3E3, 0x8FAD, 0xC3E4, 0x908A, 0xC3E5, 0x908B, + 0xC3E6, 0x91B1, 0xC3E7, 0x91AE, 0xC3E8, 0x93E1, 0xC3E9, 0x93D1, + 0xC3EA, 0x93DF, 0xC3EB, 0x93C3, 0xC3EC, 0x93C8, 0xC3ED, 0x93DC, + 0xC3EE, 0x93DD, 0xC3EF, 0x93D6, 0xC3F0, 0x93E2, 0xC3F1, 0x93CD, + 0xC3F2, 0x93D8, 0xC3F3, 0x93E4, 0xC3F4, 0x93D7, 0xC3F5, 0x93E8, + 0xC3F6, 0x95DC, 0xC3F7, 0x96B4, 0xC3F8, 0x96E3, 0xC3F9, 0x972A, + 0xC3FA, 0x9727, 0xC3FB, 0x9761, 0xC3FC, 0x97DC, 0xC3FD, 0x97FB, + 0xC3FE, 0x985E, 0xC440, 0x9858, 0xC441, 0x985B, 0xC442, 0x98BC, + 0xC443, 0x9945, 0xC444, 0x9949, 0xC445, 0x9A16, 0xC446, 0x9A19, + 0xC447, 0x9B0D, 0xC448, 0x9BE8, 0xC449, 0x9BE7, 0xC44A, 0x9BD6, + 0xC44B, 0x9BDB, 0xC44C, 0x9D89, 0xC44D, 0x9D61, 0xC44E, 0x9D72, + 0xC44F, 0x9D6A, 0xC450, 0x9D6C, 0xC451, 0x9E92, 0xC452, 0x9E97, + 0xC453, 0x9E93, 0xC454, 0x9EB4, 0xC455, 0x52F8, 0xC456, 0x56A8, + 0xC457, 0x56B7, 0xC458, 0x56B6, 0xC459, 0x56B4, 0xC45A, 0x56BC, + 0xC45B, 0x58E4, 0xC45C, 0x5B40, 0xC45D, 0x5B43, 0xC45E, 0x5B7D, + 0xC45F, 0x5BF6, 0xC460, 0x5DC9, 0xC461, 0x61F8, 0xC462, 0x61FA, + 0xC463, 0x6518, 0xC464, 0x6514, 0xC465, 0x6519, 0xC466, 0x66E6, + 0xC467, 0x6727, 0xC468, 0x6AEC, 0xC469, 0x703E, 0xC46A, 0x7030, + 0xC46B, 0x7032, 0xC46C, 0x7210, 0xC46D, 0x737B, 0xC46E, 0x74CF, + 0xC46F, 0x7662, 0xC470, 0x7665, 0xC471, 0x7926, 0xC472, 0x792A, + 0xC473, 0x792C, 0xC474, 0x792B, 0xC475, 0x7AC7, 0xC476, 0x7AF6, + 0xC477, 0x7C4C, 0xC478, 0x7C43, 0xC479, 0x7C4D, 0xC47A, 0x7CEF, + 0xC47B, 0x7CF0, 0xC47C, 0x8FAE, 0xC47D, 0x7E7D, 0xC47E, 0x7E7C, + 0xC4A1, 0x7E82, 0xC4A2, 0x7F4C, 0xC4A3, 0x8000, 0xC4A4, 0x81DA, + 0xC4A5, 0x8266, 0xC4A6, 0x85FB, 0xC4A7, 0x85F9, 0xC4A8, 0x8611, + 0xC4A9, 0x85FA, 0xC4AA, 0x8606, 0xC4AB, 0x860B, 0xC4AC, 0x8607, + 0xC4AD, 0x860A, 0xC4AE, 0x8814, 0xC4AF, 0x8815, 0xC4B0, 0x8964, + 0xC4B1, 0x89BA, 0xC4B2, 0x89F8, 0xC4B3, 0x8B70, 0xC4B4, 0x8B6C, + 0xC4B5, 0x8B66, 0xC4B6, 0x8B6F, 0xC4B7, 0x8B5F, 0xC4B8, 0x8B6B, + 0xC4B9, 0x8D0F, 0xC4BA, 0x8D0D, 0xC4BB, 0x8E89, 0xC4BC, 0x8E81, + 0xC4BD, 0x8E85, 0xC4BE, 0x8E82, 0xC4BF, 0x91B4, 0xC4C0, 0x91CB, + 0xC4C1, 0x9418, 0xC4C2, 0x9403, 0xC4C3, 0x93FD, 0xC4C4, 0x95E1, + 0xC4C5, 0x9730, 0xC4C6, 0x98C4, 0xC4C7, 0x9952, 0xC4C8, 0x9951, + 0xC4C9, 0x99A8, 0xC4CA, 0x9A2B, 0xC4CB, 0x9A30, 0xC4CC, 0x9A37, + 0xC4CD, 0x9A35, 0xC4CE, 0x9C13, 0xC4CF, 0x9C0D, 0xC4D0, 0x9E79, + 0xC4D1, 0x9EB5, 0xC4D2, 0x9EE8, 0xC4D3, 0x9F2F, 0xC4D4, 0x9F5F, + 0xC4D5, 0x9F63, 0xC4D6, 0x9F61, 0xC4D7, 0x5137, 0xC4D8, 0x5138, + 0xC4D9, 0x56C1, 0xC4DA, 0x56C0, 0xC4DB, 0x56C2, 0xC4DC, 0x5914, + 0xC4DD, 0x5C6C, 0xC4DE, 0x5DCD, 0xC4DF, 0x61FC, 0xC4E0, 0x61FE, + 0xC4E1, 0x651D, 0xC4E2, 0x651C, 0xC4E3, 0x6595, 0xC4E4, 0x66E9, + 0xC4E5, 0x6AFB, 0xC4E6, 0x6B04, 0xC4E7, 0x6AFA, 0xC4E8, 0x6BB2, + 0xC4E9, 0x704C, 0xC4EA, 0x721B, 0xC4EB, 0x72A7, 0xC4EC, 0x74D6, + 0xC4ED, 0x74D4, 0xC4EE, 0x7669, 0xC4EF, 0x77D3, 0xC4F0, 0x7C50, + 0xC4F1, 0x7E8F, 0xC4F2, 0x7E8C, 0xC4F3, 0x7FBC, 0xC4F4, 0x8617, + 0xC4F5, 0x862D, 0xC4F6, 0x861A, 0xC4F7, 0x8823, 0xC4F8, 0x8822, + 0xC4F9, 0x8821, 0xC4FA, 0x881F, 0xC4FB, 0x896A, 0xC4FC, 0x896C, + 0xC4FD, 0x89BD, 0xC4FE, 0x8B74, 0xC540, 0x8B77, 0xC541, 0x8B7D, + 0xC542, 0x8D13, 0xC543, 0x8E8A, 0xC544, 0x8E8D, 0xC545, 0x8E8B, + 0xC546, 0x8F5F, 0xC547, 0x8FAF, 0xC548, 0x91BA, 0xC549, 0x942E, + 0xC54A, 0x9433, 0xC54B, 0x9435, 0xC54C, 0x943A, 0xC54D, 0x9438, + 0xC54E, 0x9432, 0xC54F, 0x942B, 0xC550, 0x95E2, 0xC551, 0x9738, + 0xC552, 0x9739, 0xC553, 0x9732, 0xC554, 0x97FF, 0xC555, 0x9867, + 0xC556, 0x9865, 0xC557, 0x9957, 0xC558, 0x9A45, 0xC559, 0x9A43, + 0xC55A, 0x9A40, 0xC55B, 0x9A3E, 0xC55C, 0x9ACF, 0xC55D, 0x9B54, + 0xC55E, 0x9B51, 0xC55F, 0x9C2D, 0xC560, 0x9C25, 0xC561, 0x9DAF, + 0xC562, 0x9DB4, 0xC563, 0x9DC2, 0xC564, 0x9DB8, 0xC565, 0x9E9D, + 0xC566, 0x9EEF, 0xC567, 0x9F19, 0xC568, 0x9F5C, 0xC569, 0x9F66, + 0xC56A, 0x9F67, 0xC56B, 0x513C, 0xC56C, 0x513B, 0xC56D, 0x56C8, + 0xC56E, 0x56CA, 0xC56F, 0x56C9, 0xC570, 0x5B7F, 0xC571, 0x5DD4, + 0xC572, 0x5DD2, 0xC573, 0x5F4E, 0xC574, 0x61FF, 0xC575, 0x6524, + 0xC576, 0x6B0A, 0xC577, 0x6B61, 0xC578, 0x7051, 0xC579, 0x7058, + 0xC57A, 0x7380, 0xC57B, 0x74E4, 0xC57C, 0x758A, 0xC57D, 0x766E, + 0xC57E, 0x766C, 0xC5A1, 0x79B3, 0xC5A2, 0x7C60, 0xC5A3, 0x7C5F, + 0xC5A4, 0x807E, 0xC5A5, 0x807D, 0xC5A6, 0x81DF, 0xC5A7, 0x8972, + 0xC5A8, 0x896F, 0xC5A9, 0x89FC, 0xC5AA, 0x8B80, 0xC5AB, 0x8D16, + 0xC5AC, 0x8D17, 0xC5AD, 0x8E91, 0xC5AE, 0x8E93, 0xC5AF, 0x8F61, + 0xC5B0, 0x9148, 0xC5B1, 0x9444, 0xC5B2, 0x9451, 0xC5B3, 0x9452, + 0xC5B4, 0x973D, 0xC5B5, 0x973E, 0xC5B6, 0x97C3, 0xC5B7, 0x97C1, + 0xC5B8, 0x986B, 0xC5B9, 0x9955, 0xC5BA, 0x9A55, 0xC5BB, 0x9A4D, + 0xC5BC, 0x9AD2, 0xC5BD, 0x9B1A, 0xC5BE, 0x9C49, 0xC5BF, 0x9C31, + 0xC5C0, 0x9C3E, 0xC5C1, 0x9C3B, 0xC5C2, 0x9DD3, 0xC5C3, 0x9DD7, + 0xC5C4, 0x9F34, 0xC5C5, 0x9F6C, 0xC5C6, 0x9F6A, 0xC5C7, 0x9F94, + 0xC5C8, 0x56CC, 0xC5C9, 0x5DD6, 0xC5CA, 0x6200, 0xC5CB, 0x6523, + 0xC5CC, 0x652B, 0xC5CD, 0x652A, 0xC5CE, 0x66EC, 0xC5CF, 0x6B10, + 0xC5D0, 0x74DA, 0xC5D1, 0x7ACA, 0xC5D2, 0x7C64, 0xC5D3, 0x7C63, + 0xC5D4, 0x7C65, 0xC5D5, 0x7E93, 0xC5D6, 0x7E96, 0xC5D7, 0x7E94, + 0xC5D8, 0x81E2, 0xC5D9, 0x8638, 0xC5DA, 0x863F, 0xC5DB, 0x8831, + 0xC5DC, 0x8B8A, 0xC5DD, 0x9090, 0xC5DE, 0x908F, 0xC5DF, 0x9463, + 0xC5E0, 0x9460, 0xC5E1, 0x9464, 0xC5E2, 0x9768, 0xC5E3, 0x986F, + 0xC5E4, 0x995C, 0xC5E5, 0x9A5A, 0xC5E6, 0x9A5B, 0xC5E7, 0x9A57, + 0xC5E8, 0x9AD3, 0xC5E9, 0x9AD4, 0xC5EA, 0x9AD1, 0xC5EB, 0x9C54, + 0xC5EC, 0x9C57, 0xC5ED, 0x9C56, 0xC5EE, 0x9DE5, 0xC5EF, 0x9E9F, + 0xC5F0, 0x9EF4, 0xC5F1, 0x56D1, 0xC5F2, 0x58E9, 0xC5F3, 0x652C, + 0xC5F4, 0x705E, 0xC5F5, 0x7671, 0xC5F6, 0x7672, 0xC5F7, 0x77D7, + 0xC5F8, 0x7F50, 0xC5F9, 0x7F88, 0xC5FA, 0x8836, 0xC5FB, 0x8839, + 0xC5FC, 0x8862, 0xC5FD, 0x8B93, 0xC5FE, 0x8B92, 0xC640, 0x8B96, + 0xC641, 0x8277, 0xC642, 0x8D1B, 0xC643, 0x91C0, 0xC644, 0x946A, + 0xC645, 0x9742, 0xC646, 0x9748, 0xC647, 0x9744, 0xC648, 0x97C6, + 0xC649, 0x9870, 0xC64A, 0x9A5F, 0xC64B, 0x9B22, 0xC64C, 0x9B58, + 0xC64D, 0x9C5F, 0xC64E, 0x9DF9, 0xC64F, 0x9DFA, 0xC650, 0x9E7C, + 0xC651, 0x9E7D, 0xC652, 0x9F07, 0xC653, 0x9F77, 0xC654, 0x9F72, + 0xC655, 0x5EF3, 0xC656, 0x6B16, 0xC657, 0x7063, 0xC658, 0x7C6C, + 0xC659, 0x7C6E, 0xC65A, 0x883B, 0xC65B, 0x89C0, 0xC65C, 0x8EA1, + 0xC65D, 0x91C1, 0xC65E, 0x9472, 0xC65F, 0x9470, 0xC660, 0x9871, + 0xC661, 0x995E, 0xC662, 0x9AD6, 0xC663, 0x9B23, 0xC664, 0x9ECC, + 0xC665, 0x7064, 0xC666, 0x77DA, 0xC667, 0x8B9A, 0xC668, 0x9477, + 0xC669, 0x97C9, 0xC66A, 0x9A62, 0xC66B, 0x9A65, 0xC66C, 0x7E9C, + 0xC66D, 0x8B9C, 0xC66E, 0x8EAA, 0xC66F, 0x91C5, 0xC670, 0x947D, + 0xC671, 0x947E, 0xC672, 0x947C, 0xC673, 0x9C77, 0xC674, 0x9C78, + 0xC675, 0x9EF7, 0xC676, 0x8C54, 0xC677, 0x947F, 0xC678, 0x9E1A, + 0xC679, 0x7228, 0xC67A, 0x9A6A, 0xC67B, 0x9B31, 0xC67C, 0x9E1B, + 0xC67D, 0x9E1E, 0xC67E, 0x7C72, 0xC940, 0x4E42, 0xC941, 0x4E5C, + 0xC942, 0x51F5, 0xC943, 0x531A, 0xC944, 0x5382, 0xC945, 0x4E07, + 0xC946, 0x4E0C, 0xC947, 0x4E47, 0xC948, 0x4E8D, 0xC949, 0x56D7, + 0xC94A, 0xFA0C, 0xC94B, 0x5C6E, 0xC94C, 0x5F73, 0xC94D, 0x4E0F, + 0xC94E, 0x5187, 0xC94F, 0x4E0E, 0xC950, 0x4E2E, 0xC951, 0x4E93, + 0xC952, 0x4EC2, 0xC953, 0x4EC9, 0xC954, 0x4EC8, 0xC955, 0x5198, + 0xC956, 0x52FC, 0xC957, 0x536C, 0xC958, 0x53B9, 0xC959, 0x5720, + 0xC95A, 0x5903, 0xC95B, 0x592C, 0xC95C, 0x5C10, 0xC95D, 0x5DFF, + 0xC95E, 0x65E1, 0xC95F, 0x6BB3, 0xC960, 0x6BCC, 0xC961, 0x6C14, + 0xC962, 0x723F, 0xC963, 0x4E31, 0xC964, 0x4E3C, 0xC965, 0x4EE8, + 0xC966, 0x4EDC, 0xC967, 0x4EE9, 0xC968, 0x4EE1, 0xC969, 0x4EDD, + 0xC96A, 0x4EDA, 0xC96B, 0x520C, 0xC96C, 0x531C, 0xC96D, 0x534C, + 0xC96E, 0x5722, 0xC96F, 0x5723, 0xC970, 0x5917, 0xC971, 0x592F, + 0xC972, 0x5B81, 0xC973, 0x5B84, 0xC974, 0x5C12, 0xC975, 0x5C3B, + 0xC976, 0x5C74, 0xC977, 0x5C73, 0xC978, 0x5E04, 0xC979, 0x5E80, + 0xC97A, 0x5E82, 0xC97B, 0x5FC9, 0xC97C, 0x6209, 0xC97D, 0x6250, + 0xC97E, 0x6C15, 0xC9A1, 0x6C36, 0xC9A2, 0x6C43, 0xC9A3, 0x6C3F, + 0xC9A4, 0x6C3B, 0xC9A5, 0x72AE, 0xC9A6, 0x72B0, 0xC9A7, 0x738A, + 0xC9A8, 0x79B8, 0xC9A9, 0x808A, 0xC9AA, 0x961E, 0xC9AB, 0x4F0E, + 0xC9AC, 0x4F18, 0xC9AD, 0x4F2C, 0xC9AE, 0x4EF5, 0xC9AF, 0x4F14, + 0xC9B0, 0x4EF1, 0xC9B1, 0x4F00, 0xC9B2, 0x4EF7, 0xC9B3, 0x4F08, + 0xC9B4, 0x4F1D, 0xC9B5, 0x4F02, 0xC9B6, 0x4F05, 0xC9B7, 0x4F22, + 0xC9B8, 0x4F13, 0xC9B9, 0x4F04, 0xC9BA, 0x4EF4, 0xC9BB, 0x4F12, + 0xC9BC, 0x51B1, 0xC9BD, 0x5213, 0xC9BE, 0x5209, 0xC9BF, 0x5210, + 0xC9C0, 0x52A6, 0xC9C1, 0x5322, 0xC9C2, 0x531F, 0xC9C3, 0x534D, + 0xC9C4, 0x538A, 0xC9C5, 0x5407, 0xC9C6, 0x56E1, 0xC9C7, 0x56DF, + 0xC9C8, 0x572E, 0xC9C9, 0x572A, 0xC9CA, 0x5734, 0xC9CB, 0x593C, + 0xC9CC, 0x5980, 0xC9CD, 0x597C, 0xC9CE, 0x5985, 0xC9CF, 0x597B, + 0xC9D0, 0x597E, 0xC9D1, 0x5977, 0xC9D2, 0x597F, 0xC9D3, 0x5B56, + 0xC9D4, 0x5C15, 0xC9D5, 0x5C25, 0xC9D6, 0x5C7C, 0xC9D7, 0x5C7A, + 0xC9D8, 0x5C7B, 0xC9D9, 0x5C7E, 0xC9DA, 0x5DDF, 0xC9DB, 0x5E75, + 0xC9DC, 0x5E84, 0xC9DD, 0x5F02, 0xC9DE, 0x5F1A, 0xC9DF, 0x5F74, + 0xC9E0, 0x5FD5, 0xC9E1, 0x5FD4, 0xC9E2, 0x5FCF, 0xC9E3, 0x625C, + 0xC9E4, 0x625E, 0xC9E5, 0x6264, 0xC9E6, 0x6261, 0xC9E7, 0x6266, + 0xC9E8, 0x6262, 0xC9E9, 0x6259, 0xC9EA, 0x6260, 0xC9EB, 0x625A, + 0xC9EC, 0x6265, 0xC9ED, 0x65EF, 0xC9EE, 0x65EE, 0xC9EF, 0x673E, + 0xC9F0, 0x6739, 0xC9F1, 0x6738, 0xC9F2, 0x673B, 0xC9F3, 0x673A, + 0xC9F4, 0x673F, 0xC9F5, 0x673C, 0xC9F6, 0x6733, 0xC9F7, 0x6C18, + 0xC9F8, 0x6C46, 0xC9F9, 0x6C52, 0xC9FA, 0x6C5C, 0xC9FB, 0x6C4F, + 0xC9FC, 0x6C4A, 0xC9FD, 0x6C54, 0xC9FE, 0x6C4B, 0xCA40, 0x6C4C, + 0xCA41, 0x7071, 0xCA42, 0x725E, 0xCA43, 0x72B4, 0xCA44, 0x72B5, + 0xCA45, 0x738E, 0xCA46, 0x752A, 0xCA47, 0x767F, 0xCA48, 0x7A75, + 0xCA49, 0x7F51, 0xCA4A, 0x8278, 0xCA4B, 0x827C, 0xCA4C, 0x8280, + 0xCA4D, 0x827D, 0xCA4E, 0x827F, 0xCA4F, 0x864D, 0xCA50, 0x897E, + 0xCA51, 0x9099, 0xCA52, 0x9097, 0xCA53, 0x9098, 0xCA54, 0x909B, + 0xCA55, 0x9094, 0xCA56, 0x9622, 0xCA57, 0x9624, 0xCA58, 0x9620, + 0xCA59, 0x9623, 0xCA5A, 0x4F56, 0xCA5B, 0x4F3B, 0xCA5C, 0x4F62, + 0xCA5D, 0x4F49, 0xCA5E, 0x4F53, 0xCA5F, 0x4F64, 0xCA60, 0x4F3E, + 0xCA61, 0x4F67, 0xCA62, 0x4F52, 0xCA63, 0x4F5F, 0xCA64, 0x4F41, + 0xCA65, 0x4F58, 0xCA66, 0x4F2D, 0xCA67, 0x4F33, 0xCA68, 0x4F3F, + 0xCA69, 0x4F61, 0xCA6A, 0x518F, 0xCA6B, 0x51B9, 0xCA6C, 0x521C, + 0xCA6D, 0x521E, 0xCA6E, 0x5221, 0xCA6F, 0x52AD, 0xCA70, 0x52AE, + 0xCA71, 0x5309, 0xCA72, 0x5363, 0xCA73, 0x5372, 0xCA74, 0x538E, + 0xCA75, 0x538F, 0xCA76, 0x5430, 0xCA77, 0x5437, 0xCA78, 0x542A, + 0xCA79, 0x5454, 0xCA7A, 0x5445, 0xCA7B, 0x5419, 0xCA7C, 0x541C, + 0xCA7D, 0x5425, 0xCA7E, 0x5418, 0xCAA1, 0x543D, 0xCAA2, 0x544F, + 0xCAA3, 0x5441, 0xCAA4, 0x5428, 0xCAA5, 0x5424, 0xCAA6, 0x5447, + 0xCAA7, 0x56EE, 0xCAA8, 0x56E7, 0xCAA9, 0x56E5, 0xCAAA, 0x5741, + 0xCAAB, 0x5745, 0xCAAC, 0x574C, 0xCAAD, 0x5749, 0xCAAE, 0x574B, + 0xCAAF, 0x5752, 0xCAB0, 0x5906, 0xCAB1, 0x5940, 0xCAB2, 0x59A6, + 0xCAB3, 0x5998, 0xCAB4, 0x59A0, 0xCAB5, 0x5997, 0xCAB6, 0x598E, + 0xCAB7, 0x59A2, 0xCAB8, 0x5990, 0xCAB9, 0x598F, 0xCABA, 0x59A7, + 0xCABB, 0x59A1, 0xCABC, 0x5B8E, 0xCABD, 0x5B92, 0xCABE, 0x5C28, + 0xCABF, 0x5C2A, 0xCAC0, 0x5C8D, 0xCAC1, 0x5C8F, 0xCAC2, 0x5C88, + 0xCAC3, 0x5C8B, 0xCAC4, 0x5C89, 0xCAC5, 0x5C92, 0xCAC6, 0x5C8A, + 0xCAC7, 0x5C86, 0xCAC8, 0x5C93, 0xCAC9, 0x5C95, 0xCACA, 0x5DE0, + 0xCACB, 0x5E0A, 0xCACC, 0x5E0E, 0xCACD, 0x5E8B, 0xCACE, 0x5E89, + 0xCACF, 0x5E8C, 0xCAD0, 0x5E88, 0xCAD1, 0x5E8D, 0xCAD2, 0x5F05, + 0xCAD3, 0x5F1D, 0xCAD4, 0x5F78, 0xCAD5, 0x5F76, 0xCAD6, 0x5FD2, + 0xCAD7, 0x5FD1, 0xCAD8, 0x5FD0, 0xCAD9, 0x5FED, 0xCADA, 0x5FE8, + 0xCADB, 0x5FEE, 0xCADC, 0x5FF3, 0xCADD, 0x5FE1, 0xCADE, 0x5FE4, + 0xCADF, 0x5FE3, 0xCAE0, 0x5FFA, 0xCAE1, 0x5FEF, 0xCAE2, 0x5FF7, + 0xCAE3, 0x5FFB, 0xCAE4, 0x6000, 0xCAE5, 0x5FF4, 0xCAE6, 0x623A, + 0xCAE7, 0x6283, 0xCAE8, 0x628C, 0xCAE9, 0x628E, 0xCAEA, 0x628F, + 0xCAEB, 0x6294, 0xCAEC, 0x6287, 0xCAED, 0x6271, 0xCAEE, 0x627B, + 0xCAEF, 0x627A, 0xCAF0, 0x6270, 0xCAF1, 0x6281, 0xCAF2, 0x6288, + 0xCAF3, 0x6277, 0xCAF4, 0x627D, 0xCAF5, 0x6272, 0xCAF6, 0x6274, + 0xCAF7, 0x6537, 0xCAF8, 0x65F0, 0xCAF9, 0x65F4, 0xCAFA, 0x65F3, + 0xCAFB, 0x65F2, 0xCAFC, 0x65F5, 0xCAFD, 0x6745, 0xCAFE, 0x6747, + 0xCB40, 0x6759, 0xCB41, 0x6755, 0xCB42, 0x674C, 0xCB43, 0x6748, + 0xCB44, 0x675D, 0xCB45, 0x674D, 0xCB46, 0x675A, 0xCB47, 0x674B, + 0xCB48, 0x6BD0, 0xCB49, 0x6C19, 0xCB4A, 0x6C1A, 0xCB4B, 0x6C78, + 0xCB4C, 0x6C67, 0xCB4D, 0x6C6B, 0xCB4E, 0x6C84, 0xCB4F, 0x6C8B, + 0xCB50, 0x6C8F, 0xCB51, 0x6C71, 0xCB52, 0x6C6F, 0xCB53, 0x6C69, + 0xCB54, 0x6C9A, 0xCB55, 0x6C6D, 0xCB56, 0x6C87, 0xCB57, 0x6C95, + 0xCB58, 0x6C9C, 0xCB59, 0x6C66, 0xCB5A, 0x6C73, 0xCB5B, 0x6C65, + 0xCB5C, 0x6C7B, 0xCB5D, 0x6C8E, 0xCB5E, 0x7074, 0xCB5F, 0x707A, + 0xCB60, 0x7263, 0xCB61, 0x72BF, 0xCB62, 0x72BD, 0xCB63, 0x72C3, + 0xCB64, 0x72C6, 0xCB65, 0x72C1, 0xCB66, 0x72BA, 0xCB67, 0x72C5, + 0xCB68, 0x7395, 0xCB69, 0x7397, 0xCB6A, 0x7393, 0xCB6B, 0x7394, + 0xCB6C, 0x7392, 0xCB6D, 0x753A, 0xCB6E, 0x7539, 0xCB6F, 0x7594, + 0xCB70, 0x7595, 0xCB71, 0x7681, 0xCB72, 0x793D, 0xCB73, 0x8034, + 0xCB74, 0x8095, 0xCB75, 0x8099, 0xCB76, 0x8090, 0xCB77, 0x8092, + 0xCB78, 0x809C, 0xCB79, 0x8290, 0xCB7A, 0x828F, 0xCB7B, 0x8285, + 0xCB7C, 0x828E, 0xCB7D, 0x8291, 0xCB7E, 0x8293, 0xCBA1, 0x828A, + 0xCBA2, 0x8283, 0xCBA3, 0x8284, 0xCBA4, 0x8C78, 0xCBA5, 0x8FC9, + 0xCBA6, 0x8FBF, 0xCBA7, 0x909F, 0xCBA8, 0x90A1, 0xCBA9, 0x90A5, + 0xCBAA, 0x909E, 0xCBAB, 0x90A7, 0xCBAC, 0x90A0, 0xCBAD, 0x9630, + 0xCBAE, 0x9628, 0xCBAF, 0x962F, 0xCBB0, 0x962D, 0xCBB1, 0x4E33, + 0xCBB2, 0x4F98, 0xCBB3, 0x4F7C, 0xCBB4, 0x4F85, 0xCBB5, 0x4F7D, + 0xCBB6, 0x4F80, 0xCBB7, 0x4F87, 0xCBB8, 0x4F76, 0xCBB9, 0x4F74, + 0xCBBA, 0x4F89, 0xCBBB, 0x4F84, 0xCBBC, 0x4F77, 0xCBBD, 0x4F4C, + 0xCBBE, 0x4F97, 0xCBBF, 0x4F6A, 0xCBC0, 0x4F9A, 0xCBC1, 0x4F79, + 0xCBC2, 0x4F81, 0xCBC3, 0x4F78, 0xCBC4, 0x4F90, 0xCBC5, 0x4F9C, + 0xCBC6, 0x4F94, 0xCBC7, 0x4F9E, 0xCBC8, 0x4F92, 0xCBC9, 0x4F82, + 0xCBCA, 0x4F95, 0xCBCB, 0x4F6B, 0xCBCC, 0x4F6E, 0xCBCD, 0x519E, + 0xCBCE, 0x51BC, 0xCBCF, 0x51BE, 0xCBD0, 0x5235, 0xCBD1, 0x5232, + 0xCBD2, 0x5233, 0xCBD3, 0x5246, 0xCBD4, 0x5231, 0xCBD5, 0x52BC, + 0xCBD6, 0x530A, 0xCBD7, 0x530B, 0xCBD8, 0x533C, 0xCBD9, 0x5392, + 0xCBDA, 0x5394, 0xCBDB, 0x5487, 0xCBDC, 0x547F, 0xCBDD, 0x5481, + 0xCBDE, 0x5491, 0xCBDF, 0x5482, 0xCBE0, 0x5488, 0xCBE1, 0x546B, + 0xCBE2, 0x547A, 0xCBE3, 0x547E, 0xCBE4, 0x5465, 0xCBE5, 0x546C, + 0xCBE6, 0x5474, 0xCBE7, 0x5466, 0xCBE8, 0x548D, 0xCBE9, 0x546F, + 0xCBEA, 0x5461, 0xCBEB, 0x5460, 0xCBEC, 0x5498, 0xCBED, 0x5463, + 0xCBEE, 0x5467, 0xCBEF, 0x5464, 0xCBF0, 0x56F7, 0xCBF1, 0x56F9, + 0xCBF2, 0x576F, 0xCBF3, 0x5772, 0xCBF4, 0x576D, 0xCBF5, 0x576B, + 0xCBF6, 0x5771, 0xCBF7, 0x5770, 0xCBF8, 0x5776, 0xCBF9, 0x5780, + 0xCBFA, 0x5775, 0xCBFB, 0x577B, 0xCBFC, 0x5773, 0xCBFD, 0x5774, + 0xCBFE, 0x5762, 0xCC40, 0x5768, 0xCC41, 0x577D, 0xCC42, 0x590C, + 0xCC43, 0x5945, 0xCC44, 0x59B5, 0xCC45, 0x59BA, 0xCC46, 0x59CF, + 0xCC47, 0x59CE, 0xCC48, 0x59B2, 0xCC49, 0x59CC, 0xCC4A, 0x59C1, + 0xCC4B, 0x59B6, 0xCC4C, 0x59BC, 0xCC4D, 0x59C3, 0xCC4E, 0x59D6, + 0xCC4F, 0x59B1, 0xCC50, 0x59BD, 0xCC51, 0x59C0, 0xCC52, 0x59C8, + 0xCC53, 0x59B4, 0xCC54, 0x59C7, 0xCC55, 0x5B62, 0xCC56, 0x5B65, + 0xCC57, 0x5B93, 0xCC58, 0x5B95, 0xCC59, 0x5C44, 0xCC5A, 0x5C47, + 0xCC5B, 0x5CAE, 0xCC5C, 0x5CA4, 0xCC5D, 0x5CA0, 0xCC5E, 0x5CB5, + 0xCC5F, 0x5CAF, 0xCC60, 0x5CA8, 0xCC61, 0x5CAC, 0xCC62, 0x5C9F, + 0xCC63, 0x5CA3, 0xCC64, 0x5CAD, 0xCC65, 0x5CA2, 0xCC66, 0x5CAA, + 0xCC67, 0x5CA7, 0xCC68, 0x5C9D, 0xCC69, 0x5CA5, 0xCC6A, 0x5CB6, + 0xCC6B, 0x5CB0, 0xCC6C, 0x5CA6, 0xCC6D, 0x5E17, 0xCC6E, 0x5E14, + 0xCC6F, 0x5E19, 0xCC70, 0x5F28, 0xCC71, 0x5F22, 0xCC72, 0x5F23, + 0xCC73, 0x5F24, 0xCC74, 0x5F54, 0xCC75, 0x5F82, 0xCC76, 0x5F7E, + 0xCC77, 0x5F7D, 0xCC78, 0x5FDE, 0xCC79, 0x5FE5, 0xCC7A, 0x602D, + 0xCC7B, 0x6026, 0xCC7C, 0x6019, 0xCC7D, 0x6032, 0xCC7E, 0x600B, + 0xCCA1, 0x6034, 0xCCA2, 0x600A, 0xCCA3, 0x6017, 0xCCA4, 0x6033, + 0xCCA5, 0x601A, 0xCCA6, 0x601E, 0xCCA7, 0x602C, 0xCCA8, 0x6022, + 0xCCA9, 0x600D, 0xCCAA, 0x6010, 0xCCAB, 0x602E, 0xCCAC, 0x6013, + 0xCCAD, 0x6011, 0xCCAE, 0x600C, 0xCCAF, 0x6009, 0xCCB0, 0x601C, + 0xCCB1, 0x6214, 0xCCB2, 0x623D, 0xCCB3, 0x62AD, 0xCCB4, 0x62B4, + 0xCCB5, 0x62D1, 0xCCB6, 0x62BE, 0xCCB7, 0x62AA, 0xCCB8, 0x62B6, + 0xCCB9, 0x62CA, 0xCCBA, 0x62AE, 0xCCBB, 0x62B3, 0xCCBC, 0x62AF, + 0xCCBD, 0x62BB, 0xCCBE, 0x62A9, 0xCCBF, 0x62B0, 0xCCC0, 0x62B8, + 0xCCC1, 0x653D, 0xCCC2, 0x65A8, 0xCCC3, 0x65BB, 0xCCC4, 0x6609, + 0xCCC5, 0x65FC, 0xCCC6, 0x6604, 0xCCC7, 0x6612, 0xCCC8, 0x6608, + 0xCCC9, 0x65FB, 0xCCCA, 0x6603, 0xCCCB, 0x660B, 0xCCCC, 0x660D, + 0xCCCD, 0x6605, 0xCCCE, 0x65FD, 0xCCCF, 0x6611, 0xCCD0, 0x6610, + 0xCCD1, 0x66F6, 0xCCD2, 0x670A, 0xCCD3, 0x6785, 0xCCD4, 0x676C, + 0xCCD5, 0x678E, 0xCCD6, 0x6792, 0xCCD7, 0x6776, 0xCCD8, 0x677B, + 0xCCD9, 0x6798, 0xCCDA, 0x6786, 0xCCDB, 0x6784, 0xCCDC, 0x6774, + 0xCCDD, 0x678D, 0xCCDE, 0x678C, 0xCCDF, 0x677A, 0xCCE0, 0x679F, + 0xCCE1, 0x6791, 0xCCE2, 0x6799, 0xCCE3, 0x6783, 0xCCE4, 0x677D, + 0xCCE5, 0x6781, 0xCCE6, 0x6778, 0xCCE7, 0x6779, 0xCCE8, 0x6794, + 0xCCE9, 0x6B25, 0xCCEA, 0x6B80, 0xCCEB, 0x6B7E, 0xCCEC, 0x6BDE, + 0xCCED, 0x6C1D, 0xCCEE, 0x6C93, 0xCCEF, 0x6CEC, 0xCCF0, 0x6CEB, + 0xCCF1, 0x6CEE, 0xCCF2, 0x6CD9, 0xCCF3, 0x6CB6, 0xCCF4, 0x6CD4, + 0xCCF5, 0x6CAD, 0xCCF6, 0x6CE7, 0xCCF7, 0x6CB7, 0xCCF8, 0x6CD0, + 0xCCF9, 0x6CC2, 0xCCFA, 0x6CBA, 0xCCFB, 0x6CC3, 0xCCFC, 0x6CC6, + 0xCCFD, 0x6CED, 0xCCFE, 0x6CF2, 0xCD40, 0x6CD2, 0xCD41, 0x6CDD, + 0xCD42, 0x6CB4, 0xCD43, 0x6C8A, 0xCD44, 0x6C9D, 0xCD45, 0x6C80, + 0xCD46, 0x6CDE, 0xCD47, 0x6CC0, 0xCD48, 0x6D30, 0xCD49, 0x6CCD, + 0xCD4A, 0x6CC7, 0xCD4B, 0x6CB0, 0xCD4C, 0x6CF9, 0xCD4D, 0x6CCF, + 0xCD4E, 0x6CE9, 0xCD4F, 0x6CD1, 0xCD50, 0x7094, 0xCD51, 0x7098, + 0xCD52, 0x7085, 0xCD53, 0x7093, 0xCD54, 0x7086, 0xCD55, 0x7084, + 0xCD56, 0x7091, 0xCD57, 0x7096, 0xCD58, 0x7082, 0xCD59, 0x709A, + 0xCD5A, 0x7083, 0xCD5B, 0x726A, 0xCD5C, 0x72D6, 0xCD5D, 0x72CB, + 0xCD5E, 0x72D8, 0xCD5F, 0x72C9, 0xCD60, 0x72DC, 0xCD61, 0x72D2, + 0xCD62, 0x72D4, 0xCD63, 0x72DA, 0xCD64, 0x72CC, 0xCD65, 0x72D1, + 0xCD66, 0x73A4, 0xCD67, 0x73A1, 0xCD68, 0x73AD, 0xCD69, 0x73A6, + 0xCD6A, 0x73A2, 0xCD6B, 0x73A0, 0xCD6C, 0x73AC, 0xCD6D, 0x739D, + 0xCD6E, 0x74DD, 0xCD6F, 0x74E8, 0xCD70, 0x753F, 0xCD71, 0x7540, + 0xCD72, 0x753E, 0xCD73, 0x758C, 0xCD74, 0x7598, 0xCD75, 0x76AF, + 0xCD76, 0x76F3, 0xCD77, 0x76F1, 0xCD78, 0x76F0, 0xCD79, 0x76F5, + 0xCD7A, 0x77F8, 0xCD7B, 0x77FC, 0xCD7C, 0x77F9, 0xCD7D, 0x77FB, + 0xCD7E, 0x77FA, 0xCDA1, 0x77F7, 0xCDA2, 0x7942, 0xCDA3, 0x793F, + 0xCDA4, 0x79C5, 0xCDA5, 0x7A78, 0xCDA6, 0x7A7B, 0xCDA7, 0x7AFB, + 0xCDA8, 0x7C75, 0xCDA9, 0x7CFD, 0xCDAA, 0x8035, 0xCDAB, 0x808F, + 0xCDAC, 0x80AE, 0xCDAD, 0x80A3, 0xCDAE, 0x80B8, 0xCDAF, 0x80B5, + 0xCDB0, 0x80AD, 0xCDB1, 0x8220, 0xCDB2, 0x82A0, 0xCDB3, 0x82C0, + 0xCDB4, 0x82AB, 0xCDB5, 0x829A, 0xCDB6, 0x8298, 0xCDB7, 0x829B, + 0xCDB8, 0x82B5, 0xCDB9, 0x82A7, 0xCDBA, 0x82AE, 0xCDBB, 0x82BC, + 0xCDBC, 0x829E, 0xCDBD, 0x82BA, 0xCDBE, 0x82B4, 0xCDBF, 0x82A8, + 0xCDC0, 0x82A1, 0xCDC1, 0x82A9, 0xCDC2, 0x82C2, 0xCDC3, 0x82A4, + 0xCDC4, 0x82C3, 0xCDC5, 0x82B6, 0xCDC6, 0x82A2, 0xCDC7, 0x8670, + 0xCDC8, 0x866F, 0xCDC9, 0x866D, 0xCDCA, 0x866E, 0xCDCB, 0x8C56, + 0xCDCC, 0x8FD2, 0xCDCD, 0x8FCB, 0xCDCE, 0x8FD3, 0xCDCF, 0x8FCD, + 0xCDD0, 0x8FD6, 0xCDD1, 0x8FD5, 0xCDD2, 0x8FD7, 0xCDD3, 0x90B2, + 0xCDD4, 0x90B4, 0xCDD5, 0x90AF, 0xCDD6, 0x90B3, 0xCDD7, 0x90B0, + 0xCDD8, 0x9639, 0xCDD9, 0x963D, 0xCDDA, 0x963C, 0xCDDB, 0x963A, + 0xCDDC, 0x9643, 0xCDDD, 0x4FCD, 0xCDDE, 0x4FC5, 0xCDDF, 0x4FD3, + 0xCDE0, 0x4FB2, 0xCDE1, 0x4FC9, 0xCDE2, 0x4FCB, 0xCDE3, 0x4FC1, + 0xCDE4, 0x4FD4, 0xCDE5, 0x4FDC, 0xCDE6, 0x4FD9, 0xCDE7, 0x4FBB, + 0xCDE8, 0x4FB3, 0xCDE9, 0x4FDB, 0xCDEA, 0x4FC7, 0xCDEB, 0x4FD6, + 0xCDEC, 0x4FBA, 0xCDED, 0x4FC0, 0xCDEE, 0x4FB9, 0xCDEF, 0x4FEC, + 0xCDF0, 0x5244, 0xCDF1, 0x5249, 0xCDF2, 0x52C0, 0xCDF3, 0x52C2, + 0xCDF4, 0x533D, 0xCDF5, 0x537C, 0xCDF6, 0x5397, 0xCDF7, 0x5396, + 0xCDF8, 0x5399, 0xCDF9, 0x5398, 0xCDFA, 0x54BA, 0xCDFB, 0x54A1, + 0xCDFC, 0x54AD, 0xCDFD, 0x54A5, 0xCDFE, 0x54CF, 0xCE40, 0x54C3, + 0xCE41, 0x830D, 0xCE42, 0x54B7, 0xCE43, 0x54AE, 0xCE44, 0x54D6, + 0xCE45, 0x54B6, 0xCE46, 0x54C5, 0xCE47, 0x54C6, 0xCE48, 0x54A0, + 0xCE49, 0x5470, 0xCE4A, 0x54BC, 0xCE4B, 0x54A2, 0xCE4C, 0x54BE, + 0xCE4D, 0x5472, 0xCE4E, 0x54DE, 0xCE4F, 0x54B0, 0xCE50, 0x57B5, + 0xCE51, 0x579E, 0xCE52, 0x579F, 0xCE53, 0x57A4, 0xCE54, 0x578C, + 0xCE55, 0x5797, 0xCE56, 0x579D, 0xCE57, 0x579B, 0xCE58, 0x5794, + 0xCE59, 0x5798, 0xCE5A, 0x578F, 0xCE5B, 0x5799, 0xCE5C, 0x57A5, + 0xCE5D, 0x579A, 0xCE5E, 0x5795, 0xCE5F, 0x58F4, 0xCE60, 0x590D, + 0xCE61, 0x5953, 0xCE62, 0x59E1, 0xCE63, 0x59DE, 0xCE64, 0x59EE, + 0xCE65, 0x5A00, 0xCE66, 0x59F1, 0xCE67, 0x59DD, 0xCE68, 0x59FA, + 0xCE69, 0x59FD, 0xCE6A, 0x59FC, 0xCE6B, 0x59F6, 0xCE6C, 0x59E4, + 0xCE6D, 0x59F2, 0xCE6E, 0x59F7, 0xCE6F, 0x59DB, 0xCE70, 0x59E9, + 0xCE71, 0x59F3, 0xCE72, 0x59F5, 0xCE73, 0x59E0, 0xCE74, 0x59FE, + 0xCE75, 0x59F4, 0xCE76, 0x59ED, 0xCE77, 0x5BA8, 0xCE78, 0x5C4C, + 0xCE79, 0x5CD0, 0xCE7A, 0x5CD8, 0xCE7B, 0x5CCC, 0xCE7C, 0x5CD7, + 0xCE7D, 0x5CCB, 0xCE7E, 0x5CDB, 0xCEA1, 0x5CDE, 0xCEA2, 0x5CDA, + 0xCEA3, 0x5CC9, 0xCEA4, 0x5CC7, 0xCEA5, 0x5CCA, 0xCEA6, 0x5CD6, + 0xCEA7, 0x5CD3, 0xCEA8, 0x5CD4, 0xCEA9, 0x5CCF, 0xCEAA, 0x5CC8, + 0xCEAB, 0x5CC6, 0xCEAC, 0x5CCE, 0xCEAD, 0x5CDF, 0xCEAE, 0x5CF8, + 0xCEAF, 0x5DF9, 0xCEB0, 0x5E21, 0xCEB1, 0x5E22, 0xCEB2, 0x5E23, + 0xCEB3, 0x5E20, 0xCEB4, 0x5E24, 0xCEB5, 0x5EB0, 0xCEB6, 0x5EA4, + 0xCEB7, 0x5EA2, 0xCEB8, 0x5E9B, 0xCEB9, 0x5EA3, 0xCEBA, 0x5EA5, + 0xCEBB, 0x5F07, 0xCEBC, 0x5F2E, 0xCEBD, 0x5F56, 0xCEBE, 0x5F86, + 0xCEBF, 0x6037, 0xCEC0, 0x6039, 0xCEC1, 0x6054, 0xCEC2, 0x6072, + 0xCEC3, 0x605E, 0xCEC4, 0x6045, 0xCEC5, 0x6053, 0xCEC6, 0x6047, + 0xCEC7, 0x6049, 0xCEC8, 0x605B, 0xCEC9, 0x604C, 0xCECA, 0x6040, + 0xCECB, 0x6042, 0xCECC, 0x605F, 0xCECD, 0x6024, 0xCECE, 0x6044, + 0xCECF, 0x6058, 0xCED0, 0x6066, 0xCED1, 0x606E, 0xCED2, 0x6242, + 0xCED3, 0x6243, 0xCED4, 0x62CF, 0xCED5, 0x630D, 0xCED6, 0x630B, + 0xCED7, 0x62F5, 0xCED8, 0x630E, 0xCED9, 0x6303, 0xCEDA, 0x62EB, + 0xCEDB, 0x62F9, 0xCEDC, 0x630F, 0xCEDD, 0x630C, 0xCEDE, 0x62F8, + 0xCEDF, 0x62F6, 0xCEE0, 0x6300, 0xCEE1, 0x6313, 0xCEE2, 0x6314, + 0xCEE3, 0x62FA, 0xCEE4, 0x6315, 0xCEE5, 0x62FB, 0xCEE6, 0x62F0, + 0xCEE7, 0x6541, 0xCEE8, 0x6543, 0xCEE9, 0x65AA, 0xCEEA, 0x65BF, + 0xCEEB, 0x6636, 0xCEEC, 0x6621, 0xCEED, 0x6632, 0xCEEE, 0x6635, + 0xCEEF, 0x661C, 0xCEF0, 0x6626, 0xCEF1, 0x6622, 0xCEF2, 0x6633, + 0xCEF3, 0x662B, 0xCEF4, 0x663A, 0xCEF5, 0x661D, 0xCEF6, 0x6634, + 0xCEF7, 0x6639, 0xCEF8, 0x662E, 0xCEF9, 0x670F, 0xCEFA, 0x6710, + 0xCEFB, 0x67C1, 0xCEFC, 0x67F2, 0xCEFD, 0x67C8, 0xCEFE, 0x67BA, + 0xCF40, 0x67DC, 0xCF41, 0x67BB, 0xCF42, 0x67F8, 0xCF43, 0x67D8, + 0xCF44, 0x67C0, 0xCF45, 0x67B7, 0xCF46, 0x67C5, 0xCF47, 0x67EB, + 0xCF48, 0x67E4, 0xCF49, 0x67DF, 0xCF4A, 0x67B5, 0xCF4B, 0x67CD, + 0xCF4C, 0x67B3, 0xCF4D, 0x67F7, 0xCF4E, 0x67F6, 0xCF4F, 0x67EE, + 0xCF50, 0x67E3, 0xCF51, 0x67C2, 0xCF52, 0x67B9, 0xCF53, 0x67CE, + 0xCF54, 0x67E7, 0xCF55, 0x67F0, 0xCF56, 0x67B2, 0xCF57, 0x67FC, + 0xCF58, 0x67C6, 0xCF59, 0x67ED, 0xCF5A, 0x67CC, 0xCF5B, 0x67AE, + 0xCF5C, 0x67E6, 0xCF5D, 0x67DB, 0xCF5E, 0x67FA, 0xCF5F, 0x67C9, + 0xCF60, 0x67CA, 0xCF61, 0x67C3, 0xCF62, 0x67EA, 0xCF63, 0x67CB, + 0xCF64, 0x6B28, 0xCF65, 0x6B82, 0xCF66, 0x6B84, 0xCF67, 0x6BB6, + 0xCF68, 0x6BD6, 0xCF69, 0x6BD8, 0xCF6A, 0x6BE0, 0xCF6B, 0x6C20, + 0xCF6C, 0x6C21, 0xCF6D, 0x6D28, 0xCF6E, 0x6D34, 0xCF6F, 0x6D2D, + 0xCF70, 0x6D1F, 0xCF71, 0x6D3C, 0xCF72, 0x6D3F, 0xCF73, 0x6D12, + 0xCF74, 0x6D0A, 0xCF75, 0x6CDA, 0xCF76, 0x6D33, 0xCF77, 0x6D04, + 0xCF78, 0x6D19, 0xCF79, 0x6D3A, 0xCF7A, 0x6D1A, 0xCF7B, 0x6D11, + 0xCF7C, 0x6D00, 0xCF7D, 0x6D1D, 0xCF7E, 0x6D42, 0xCFA1, 0x6D01, + 0xCFA2, 0x6D18, 0xCFA3, 0x6D37, 0xCFA4, 0x6D03, 0xCFA5, 0x6D0F, + 0xCFA6, 0x6D40, 0xCFA7, 0x6D07, 0xCFA8, 0x6D20, 0xCFA9, 0x6D2C, + 0xCFAA, 0x6D08, 0xCFAB, 0x6D22, 0xCFAC, 0x6D09, 0xCFAD, 0x6D10, + 0xCFAE, 0x70B7, 0xCFAF, 0x709F, 0xCFB0, 0x70BE, 0xCFB1, 0x70B1, + 0xCFB2, 0x70B0, 0xCFB3, 0x70A1, 0xCFB4, 0x70B4, 0xCFB5, 0x70B5, + 0xCFB6, 0x70A9, 0xCFB7, 0x7241, 0xCFB8, 0x7249, 0xCFB9, 0x724A, + 0xCFBA, 0x726C, 0xCFBB, 0x7270, 0xCFBC, 0x7273, 0xCFBD, 0x726E, + 0xCFBE, 0x72CA, 0xCFBF, 0x72E4, 0xCFC0, 0x72E8, 0xCFC1, 0x72EB, + 0xCFC2, 0x72DF, 0xCFC3, 0x72EA, 0xCFC4, 0x72E6, 0xCFC5, 0x72E3, + 0xCFC6, 0x7385, 0xCFC7, 0x73CC, 0xCFC8, 0x73C2, 0xCFC9, 0x73C8, + 0xCFCA, 0x73C5, 0xCFCB, 0x73B9, 0xCFCC, 0x73B6, 0xCFCD, 0x73B5, + 0xCFCE, 0x73B4, 0xCFCF, 0x73EB, 0xCFD0, 0x73BF, 0xCFD1, 0x73C7, + 0xCFD2, 0x73BE, 0xCFD3, 0x73C3, 0xCFD4, 0x73C6, 0xCFD5, 0x73B8, + 0xCFD6, 0x73CB, 0xCFD7, 0x74EC, 0xCFD8, 0x74EE, 0xCFD9, 0x752E, + 0xCFDA, 0x7547, 0xCFDB, 0x7548, 0xCFDC, 0x75A7, 0xCFDD, 0x75AA, + 0xCFDE, 0x7679, 0xCFDF, 0x76C4, 0xCFE0, 0x7708, 0xCFE1, 0x7703, + 0xCFE2, 0x7704, 0xCFE3, 0x7705, 0xCFE4, 0x770A, 0xCFE5, 0x76F7, + 0xCFE6, 0x76FB, 0xCFE7, 0x76FA, 0xCFE8, 0x77E7, 0xCFE9, 0x77E8, + 0xCFEA, 0x7806, 0xCFEB, 0x7811, 0xCFEC, 0x7812, 0xCFED, 0x7805, + 0xCFEE, 0x7810, 0xCFEF, 0x780F, 0xCFF0, 0x780E, 0xCFF1, 0x7809, + 0xCFF2, 0x7803, 0xCFF3, 0x7813, 0xCFF4, 0x794A, 0xCFF5, 0x794C, + 0xCFF6, 0x794B, 0xCFF7, 0x7945, 0xCFF8, 0x7944, 0xCFF9, 0x79D5, + 0xCFFA, 0x79CD, 0xCFFB, 0x79CF, 0xCFFC, 0x79D6, 0xCFFD, 0x79CE, + 0xCFFE, 0x7A80, 0xD040, 0x7A7E, 0xD041, 0x7AD1, 0xD042, 0x7B00, + 0xD043, 0x7B01, 0xD044, 0x7C7A, 0xD045, 0x7C78, 0xD046, 0x7C79, + 0xD047, 0x7C7F, 0xD048, 0x7C80, 0xD049, 0x7C81, 0xD04A, 0x7D03, + 0xD04B, 0x7D08, 0xD04C, 0x7D01, 0xD04D, 0x7F58, 0xD04E, 0x7F91, + 0xD04F, 0x7F8D, 0xD050, 0x7FBE, 0xD051, 0x8007, 0xD052, 0x800E, + 0xD053, 0x800F, 0xD054, 0x8014, 0xD055, 0x8037, 0xD056, 0x80D8, + 0xD057, 0x80C7, 0xD058, 0x80E0, 0xD059, 0x80D1, 0xD05A, 0x80C8, + 0xD05B, 0x80C2, 0xD05C, 0x80D0, 0xD05D, 0x80C5, 0xD05E, 0x80E3, + 0xD05F, 0x80D9, 0xD060, 0x80DC, 0xD061, 0x80CA, 0xD062, 0x80D5, + 0xD063, 0x80C9, 0xD064, 0x80CF, 0xD065, 0x80D7, 0xD066, 0x80E6, + 0xD067, 0x80CD, 0xD068, 0x81FF, 0xD069, 0x8221, 0xD06A, 0x8294, + 0xD06B, 0x82D9, 0xD06C, 0x82FE, 0xD06D, 0x82F9, 0xD06E, 0x8307, + 0xD06F, 0x82E8, 0xD070, 0x8300, 0xD071, 0x82D5, 0xD072, 0x833A, + 0xD073, 0x82EB, 0xD074, 0x82D6, 0xD075, 0x82F4, 0xD076, 0x82EC, + 0xD077, 0x82E1, 0xD078, 0x82F2, 0xD079, 0x82F5, 0xD07A, 0x830C, + 0xD07B, 0x82FB, 0xD07C, 0x82F6, 0xD07D, 0x82F0, 0xD07E, 0x82EA, + 0xD0A1, 0x82E4, 0xD0A2, 0x82E0, 0xD0A3, 0x82FA, 0xD0A4, 0x82F3, + 0xD0A5, 0x82ED, 0xD0A6, 0x8677, 0xD0A7, 0x8674, 0xD0A8, 0x867C, + 0xD0A9, 0x8673, 0xD0AA, 0x8841, 0xD0AB, 0x884E, 0xD0AC, 0x8867, + 0xD0AD, 0x886A, 0xD0AE, 0x8869, 0xD0AF, 0x89D3, 0xD0B0, 0x8A04, + 0xD0B1, 0x8A07, 0xD0B2, 0x8D72, 0xD0B3, 0x8FE3, 0xD0B4, 0x8FE1, + 0xD0B5, 0x8FEE, 0xD0B6, 0x8FE0, 0xD0B7, 0x90F1, 0xD0B8, 0x90BD, + 0xD0B9, 0x90BF, 0xD0BA, 0x90D5, 0xD0BB, 0x90C5, 0xD0BC, 0x90BE, + 0xD0BD, 0x90C7, 0xD0BE, 0x90CB, 0xD0BF, 0x90C8, 0xD0C0, 0x91D4, + 0xD0C1, 0x91D3, 0xD0C2, 0x9654, 0xD0C3, 0x964F, 0xD0C4, 0x9651, + 0xD0C5, 0x9653, 0xD0C6, 0x964A, 0xD0C7, 0x964E, 0xD0C8, 0x501E, + 0xD0C9, 0x5005, 0xD0CA, 0x5007, 0xD0CB, 0x5013, 0xD0CC, 0x5022, + 0xD0CD, 0x5030, 0xD0CE, 0x501B, 0xD0CF, 0x4FF5, 0xD0D0, 0x4FF4, + 0xD0D1, 0x5033, 0xD0D2, 0x5037, 0xD0D3, 0x502C, 0xD0D4, 0x4FF6, + 0xD0D5, 0x4FF7, 0xD0D6, 0x5017, 0xD0D7, 0x501C, 0xD0D8, 0x5020, + 0xD0D9, 0x5027, 0xD0DA, 0x5035, 0xD0DB, 0x502F, 0xD0DC, 0x5031, + 0xD0DD, 0x500E, 0xD0DE, 0x515A, 0xD0DF, 0x5194, 0xD0E0, 0x5193, + 0xD0E1, 0x51CA, 0xD0E2, 0x51C4, 0xD0E3, 0x51C5, 0xD0E4, 0x51C8, + 0xD0E5, 0x51CE, 0xD0E6, 0x5261, 0xD0E7, 0x525A, 0xD0E8, 0x5252, + 0xD0E9, 0x525E, 0xD0EA, 0x525F, 0xD0EB, 0x5255, 0xD0EC, 0x5262, + 0xD0ED, 0x52CD, 0xD0EE, 0x530E, 0xD0EF, 0x539E, 0xD0F0, 0x5526, + 0xD0F1, 0x54E2, 0xD0F2, 0x5517, 0xD0F3, 0x5512, 0xD0F4, 0x54E7, + 0xD0F5, 0x54F3, 0xD0F6, 0x54E4, 0xD0F7, 0x551A, 0xD0F8, 0x54FF, + 0xD0F9, 0x5504, 0xD0FA, 0x5508, 0xD0FB, 0x54EB, 0xD0FC, 0x5511, + 0xD0FD, 0x5505, 0xD0FE, 0x54F1, 0xD140, 0x550A, 0xD141, 0x54FB, + 0xD142, 0x54F7, 0xD143, 0x54F8, 0xD144, 0x54E0, 0xD145, 0x550E, + 0xD146, 0x5503, 0xD147, 0x550B, 0xD148, 0x5701, 0xD149, 0x5702, + 0xD14A, 0x57CC, 0xD14B, 0x5832, 0xD14C, 0x57D5, 0xD14D, 0x57D2, + 0xD14E, 0x57BA, 0xD14F, 0x57C6, 0xD150, 0x57BD, 0xD151, 0x57BC, + 0xD152, 0x57B8, 0xD153, 0x57B6, 0xD154, 0x57BF, 0xD155, 0x57C7, + 0xD156, 0x57D0, 0xD157, 0x57B9, 0xD158, 0x57C1, 0xD159, 0x590E, + 0xD15A, 0x594A, 0xD15B, 0x5A19, 0xD15C, 0x5A16, 0xD15D, 0x5A2D, + 0xD15E, 0x5A2E, 0xD15F, 0x5A15, 0xD160, 0x5A0F, 0xD161, 0x5A17, + 0xD162, 0x5A0A, 0xD163, 0x5A1E, 0xD164, 0x5A33, 0xD165, 0x5B6C, + 0xD166, 0x5BA7, 0xD167, 0x5BAD, 0xD168, 0x5BAC, 0xD169, 0x5C03, + 0xD16A, 0x5C56, 0xD16B, 0x5C54, 0xD16C, 0x5CEC, 0xD16D, 0x5CFF, + 0xD16E, 0x5CEE, 0xD16F, 0x5CF1, 0xD170, 0x5CF7, 0xD171, 0x5D00, + 0xD172, 0x5CF9, 0xD173, 0x5E29, 0xD174, 0x5E28, 0xD175, 0x5EA8, + 0xD176, 0x5EAE, 0xD177, 0x5EAA, 0xD178, 0x5EAC, 0xD179, 0x5F33, + 0xD17A, 0x5F30, 0xD17B, 0x5F67, 0xD17C, 0x605D, 0xD17D, 0x605A, + 0xD17E, 0x6067, 0xD1A1, 0x6041, 0xD1A2, 0x60A2, 0xD1A3, 0x6088, + 0xD1A4, 0x6080, 0xD1A5, 0x6092, 0xD1A6, 0x6081, 0xD1A7, 0x609D, + 0xD1A8, 0x6083, 0xD1A9, 0x6095, 0xD1AA, 0x609B, 0xD1AB, 0x6097, + 0xD1AC, 0x6087, 0xD1AD, 0x609C, 0xD1AE, 0x608E, 0xD1AF, 0x6219, + 0xD1B0, 0x6246, 0xD1B1, 0x62F2, 0xD1B2, 0x6310, 0xD1B3, 0x6356, + 0xD1B4, 0x632C, 0xD1B5, 0x6344, 0xD1B6, 0x6345, 0xD1B7, 0x6336, + 0xD1B8, 0x6343, 0xD1B9, 0x63E4, 0xD1BA, 0x6339, 0xD1BB, 0x634B, + 0xD1BC, 0x634A, 0xD1BD, 0x633C, 0xD1BE, 0x6329, 0xD1BF, 0x6341, + 0xD1C0, 0x6334, 0xD1C1, 0x6358, 0xD1C2, 0x6354, 0xD1C3, 0x6359, + 0xD1C4, 0x632D, 0xD1C5, 0x6347, 0xD1C6, 0x6333, 0xD1C7, 0x635A, + 0xD1C8, 0x6351, 0xD1C9, 0x6338, 0xD1CA, 0x6357, 0xD1CB, 0x6340, + 0xD1CC, 0x6348, 0xD1CD, 0x654A, 0xD1CE, 0x6546, 0xD1CF, 0x65C6, + 0xD1D0, 0x65C3, 0xD1D1, 0x65C4, 0xD1D2, 0x65C2, 0xD1D3, 0x664A, + 0xD1D4, 0x665F, 0xD1D5, 0x6647, 0xD1D6, 0x6651, 0xD1D7, 0x6712, + 0xD1D8, 0x6713, 0xD1D9, 0x681F, 0xD1DA, 0x681A, 0xD1DB, 0x6849, + 0xD1DC, 0x6832, 0xD1DD, 0x6833, 0xD1DE, 0x683B, 0xD1DF, 0x684B, + 0xD1E0, 0x684F, 0xD1E1, 0x6816, 0xD1E2, 0x6831, 0xD1E3, 0x681C, + 0xD1E4, 0x6835, 0xD1E5, 0x682B, 0xD1E6, 0x682D, 0xD1E7, 0x682F, + 0xD1E8, 0x684E, 0xD1E9, 0x6844, 0xD1EA, 0x6834, 0xD1EB, 0x681D, + 0xD1EC, 0x6812, 0xD1ED, 0x6814, 0xD1EE, 0x6826, 0xD1EF, 0x6828, + 0xD1F0, 0x682E, 0xD1F1, 0x684D, 0xD1F2, 0x683A, 0xD1F3, 0x6825, + 0xD1F4, 0x6820, 0xD1F5, 0x6B2C, 0xD1F6, 0x6B2F, 0xD1F7, 0x6B2D, + 0xD1F8, 0x6B31, 0xD1F9, 0x6B34, 0xD1FA, 0x6B6D, 0xD1FB, 0x8082, + 0xD1FC, 0x6B88, 0xD1FD, 0x6BE6, 0xD1FE, 0x6BE4, 0xD240, 0x6BE8, + 0xD241, 0x6BE3, 0xD242, 0x6BE2, 0xD243, 0x6BE7, 0xD244, 0x6C25, + 0xD245, 0x6D7A, 0xD246, 0x6D63, 0xD247, 0x6D64, 0xD248, 0x6D76, + 0xD249, 0x6D0D, 0xD24A, 0x6D61, 0xD24B, 0x6D92, 0xD24C, 0x6D58, + 0xD24D, 0x6D62, 0xD24E, 0x6D6D, 0xD24F, 0x6D6F, 0xD250, 0x6D91, + 0xD251, 0x6D8D, 0xD252, 0x6DEF, 0xD253, 0x6D7F, 0xD254, 0x6D86, + 0xD255, 0x6D5E, 0xD256, 0x6D67, 0xD257, 0x6D60, 0xD258, 0x6D97, + 0xD259, 0x6D70, 0xD25A, 0x6D7C, 0xD25B, 0x6D5F, 0xD25C, 0x6D82, + 0xD25D, 0x6D98, 0xD25E, 0x6D2F, 0xD25F, 0x6D68, 0xD260, 0x6D8B, + 0xD261, 0x6D7E, 0xD262, 0x6D80, 0xD263, 0x6D84, 0xD264, 0x6D16, + 0xD265, 0x6D83, 0xD266, 0x6D7B, 0xD267, 0x6D7D, 0xD268, 0x6D75, + 0xD269, 0x6D90, 0xD26A, 0x70DC, 0xD26B, 0x70D3, 0xD26C, 0x70D1, + 0xD26D, 0x70DD, 0xD26E, 0x70CB, 0xD26F, 0x7F39, 0xD270, 0x70E2, + 0xD271, 0x70D7, 0xD272, 0x70D2, 0xD273, 0x70DE, 0xD274, 0x70E0, + 0xD275, 0x70D4, 0xD276, 0x70CD, 0xD277, 0x70C5, 0xD278, 0x70C6, + 0xD279, 0x70C7, 0xD27A, 0x70DA, 0xD27B, 0x70CE, 0xD27C, 0x70E1, + 0xD27D, 0x7242, 0xD27E, 0x7278, 0xD2A1, 0x7277, 0xD2A2, 0x7276, + 0xD2A3, 0x7300, 0xD2A4, 0x72FA, 0xD2A5, 0x72F4, 0xD2A6, 0x72FE, + 0xD2A7, 0x72F6, 0xD2A8, 0x72F3, 0xD2A9, 0x72FB, 0xD2AA, 0x7301, + 0xD2AB, 0x73D3, 0xD2AC, 0x73D9, 0xD2AD, 0x73E5, 0xD2AE, 0x73D6, + 0xD2AF, 0x73BC, 0xD2B0, 0x73E7, 0xD2B1, 0x73E3, 0xD2B2, 0x73E9, + 0xD2B3, 0x73DC, 0xD2B4, 0x73D2, 0xD2B5, 0x73DB, 0xD2B6, 0x73D4, + 0xD2B7, 0x73DD, 0xD2B8, 0x73DA, 0xD2B9, 0x73D7, 0xD2BA, 0x73D8, + 0xD2BB, 0x73E8, 0xD2BC, 0x74DE, 0xD2BD, 0x74DF, 0xD2BE, 0x74F4, + 0xD2BF, 0x74F5, 0xD2C0, 0x7521, 0xD2C1, 0x755B, 0xD2C2, 0x755F, + 0xD2C3, 0x75B0, 0xD2C4, 0x75C1, 0xD2C5, 0x75BB, 0xD2C6, 0x75C4, + 0xD2C7, 0x75C0, 0xD2C8, 0x75BF, 0xD2C9, 0x75B6, 0xD2CA, 0x75BA, + 0xD2CB, 0x768A, 0xD2CC, 0x76C9, 0xD2CD, 0x771D, 0xD2CE, 0x771B, + 0xD2CF, 0x7710, 0xD2D0, 0x7713, 0xD2D1, 0x7712, 0xD2D2, 0x7723, + 0xD2D3, 0x7711, 0xD2D4, 0x7715, 0xD2D5, 0x7719, 0xD2D6, 0x771A, + 0xD2D7, 0x7722, 0xD2D8, 0x7727, 0xD2D9, 0x7823, 0xD2DA, 0x782C, + 0xD2DB, 0x7822, 0xD2DC, 0x7835, 0xD2DD, 0x782F, 0xD2DE, 0x7828, + 0xD2DF, 0x782E, 0xD2E0, 0x782B, 0xD2E1, 0x7821, 0xD2E2, 0x7829, + 0xD2E3, 0x7833, 0xD2E4, 0x782A, 0xD2E5, 0x7831, 0xD2E6, 0x7954, + 0xD2E7, 0x795B, 0xD2E8, 0x794F, 0xD2E9, 0x795C, 0xD2EA, 0x7953, + 0xD2EB, 0x7952, 0xD2EC, 0x7951, 0xD2ED, 0x79EB, 0xD2EE, 0x79EC, + 0xD2EF, 0x79E0, 0xD2F0, 0x79EE, 0xD2F1, 0x79ED, 0xD2F2, 0x79EA, + 0xD2F3, 0x79DC, 0xD2F4, 0x79DE, 0xD2F5, 0x79DD, 0xD2F6, 0x7A86, + 0xD2F7, 0x7A89, 0xD2F8, 0x7A85, 0xD2F9, 0x7A8B, 0xD2FA, 0x7A8C, + 0xD2FB, 0x7A8A, 0xD2FC, 0x7A87, 0xD2FD, 0x7AD8, 0xD2FE, 0x7B10, + 0xD340, 0x7B04, 0xD341, 0x7B13, 0xD342, 0x7B05, 0xD343, 0x7B0F, + 0xD344, 0x7B08, 0xD345, 0x7B0A, 0xD346, 0x7B0E, 0xD347, 0x7B09, + 0xD348, 0x7B12, 0xD349, 0x7C84, 0xD34A, 0x7C91, 0xD34B, 0x7C8A, + 0xD34C, 0x7C8C, 0xD34D, 0x7C88, 0xD34E, 0x7C8D, 0xD34F, 0x7C85, + 0xD350, 0x7D1E, 0xD351, 0x7D1D, 0xD352, 0x7D11, 0xD353, 0x7D0E, + 0xD354, 0x7D18, 0xD355, 0x7D16, 0xD356, 0x7D13, 0xD357, 0x7D1F, + 0xD358, 0x7D12, 0xD359, 0x7D0F, 0xD35A, 0x7D0C, 0xD35B, 0x7F5C, + 0xD35C, 0x7F61, 0xD35D, 0x7F5E, 0xD35E, 0x7F60, 0xD35F, 0x7F5D, + 0xD360, 0x7F5B, 0xD361, 0x7F96, 0xD362, 0x7F92, 0xD363, 0x7FC3, + 0xD364, 0x7FC2, 0xD365, 0x7FC0, 0xD366, 0x8016, 0xD367, 0x803E, + 0xD368, 0x8039, 0xD369, 0x80FA, 0xD36A, 0x80F2, 0xD36B, 0x80F9, + 0xD36C, 0x80F5, 0xD36D, 0x8101, 0xD36E, 0x80FB, 0xD36F, 0x8100, + 0xD370, 0x8201, 0xD371, 0x822F, 0xD372, 0x8225, 0xD373, 0x8333, + 0xD374, 0x832D, 0xD375, 0x8344, 0xD376, 0x8319, 0xD377, 0x8351, + 0xD378, 0x8325, 0xD379, 0x8356, 0xD37A, 0x833F, 0xD37B, 0x8341, + 0xD37C, 0x8326, 0xD37D, 0x831C, 0xD37E, 0x8322, 0xD3A1, 0x8342, + 0xD3A2, 0x834E, 0xD3A3, 0x831B, 0xD3A4, 0x832A, 0xD3A5, 0x8308, + 0xD3A6, 0x833C, 0xD3A7, 0x834D, 0xD3A8, 0x8316, 0xD3A9, 0x8324, + 0xD3AA, 0x8320, 0xD3AB, 0x8337, 0xD3AC, 0x832F, 0xD3AD, 0x8329, + 0xD3AE, 0x8347, 0xD3AF, 0x8345, 0xD3B0, 0x834C, 0xD3B1, 0x8353, + 0xD3B2, 0x831E, 0xD3B3, 0x832C, 0xD3B4, 0x834B, 0xD3B5, 0x8327, + 0xD3B6, 0x8348, 0xD3B7, 0x8653, 0xD3B8, 0x8652, 0xD3B9, 0x86A2, + 0xD3BA, 0x86A8, 0xD3BB, 0x8696, 0xD3BC, 0x868D, 0xD3BD, 0x8691, + 0xD3BE, 0x869E, 0xD3BF, 0x8687, 0xD3C0, 0x8697, 0xD3C1, 0x8686, + 0xD3C2, 0x868B, 0xD3C3, 0x869A, 0xD3C4, 0x8685, 0xD3C5, 0x86A5, + 0xD3C6, 0x8699, 0xD3C7, 0x86A1, 0xD3C8, 0x86A7, 0xD3C9, 0x8695, + 0xD3CA, 0x8698, 0xD3CB, 0x868E, 0xD3CC, 0x869D, 0xD3CD, 0x8690, + 0xD3CE, 0x8694, 0xD3CF, 0x8843, 0xD3D0, 0x8844, 0xD3D1, 0x886D, + 0xD3D2, 0x8875, 0xD3D3, 0x8876, 0xD3D4, 0x8872, 0xD3D5, 0x8880, + 0xD3D6, 0x8871, 0xD3D7, 0x887F, 0xD3D8, 0x886F, 0xD3D9, 0x8883, + 0xD3DA, 0x887E, 0xD3DB, 0x8874, 0xD3DC, 0x887C, 0xD3DD, 0x8A12, + 0xD3DE, 0x8C47, 0xD3DF, 0x8C57, 0xD3E0, 0x8C7B, 0xD3E1, 0x8CA4, + 0xD3E2, 0x8CA3, 0xD3E3, 0x8D76, 0xD3E4, 0x8D78, 0xD3E5, 0x8DB5, + 0xD3E6, 0x8DB7, 0xD3E7, 0x8DB6, 0xD3E8, 0x8ED1, 0xD3E9, 0x8ED3, + 0xD3EA, 0x8FFE, 0xD3EB, 0x8FF5, 0xD3EC, 0x9002, 0xD3ED, 0x8FFF, + 0xD3EE, 0x8FFB, 0xD3EF, 0x9004, 0xD3F0, 0x8FFC, 0xD3F1, 0x8FF6, + 0xD3F2, 0x90D6, 0xD3F3, 0x90E0, 0xD3F4, 0x90D9, 0xD3F5, 0x90DA, + 0xD3F6, 0x90E3, 0xD3F7, 0x90DF, 0xD3F8, 0x90E5, 0xD3F9, 0x90D8, + 0xD3FA, 0x90DB, 0xD3FB, 0x90D7, 0xD3FC, 0x90DC, 0xD3FD, 0x90E4, + 0xD3FE, 0x9150, 0xD440, 0x914E, 0xD441, 0x914F, 0xD442, 0x91D5, + 0xD443, 0x91E2, 0xD444, 0x91DA, 0xD445, 0x965C, 0xD446, 0x965F, + 0xD447, 0x96BC, 0xD448, 0x98E3, 0xD449, 0x9ADF, 0xD44A, 0x9B2F, + 0xD44B, 0x4E7F, 0xD44C, 0x5070, 0xD44D, 0x506A, 0xD44E, 0x5061, + 0xD44F, 0x505E, 0xD450, 0x5060, 0xD451, 0x5053, 0xD452, 0x504B, + 0xD453, 0x505D, 0xD454, 0x5072, 0xD455, 0x5048, 0xD456, 0x504D, + 0xD457, 0x5041, 0xD458, 0x505B, 0xD459, 0x504A, 0xD45A, 0x5062, + 0xD45B, 0x5015, 0xD45C, 0x5045, 0xD45D, 0x505F, 0xD45E, 0x5069, + 0xD45F, 0x506B, 0xD460, 0x5063, 0xD461, 0x5064, 0xD462, 0x5046, + 0xD463, 0x5040, 0xD464, 0x506E, 0xD465, 0x5073, 0xD466, 0x5057, + 0xD467, 0x5051, 0xD468, 0x51D0, 0xD469, 0x526B, 0xD46A, 0x526D, + 0xD46B, 0x526C, 0xD46C, 0x526E, 0xD46D, 0x52D6, 0xD46E, 0x52D3, + 0xD46F, 0x532D, 0xD470, 0x539C, 0xD471, 0x5575, 0xD472, 0x5576, + 0xD473, 0x553C, 0xD474, 0x554D, 0xD475, 0x5550, 0xD476, 0x5534, + 0xD477, 0x552A, 0xD478, 0x5551, 0xD479, 0x5562, 0xD47A, 0x5536, + 0xD47B, 0x5535, 0xD47C, 0x5530, 0xD47D, 0x5552, 0xD47E, 0x5545, + 0xD4A1, 0x550C, 0xD4A2, 0x5532, 0xD4A3, 0x5565, 0xD4A4, 0x554E, + 0xD4A5, 0x5539, 0xD4A6, 0x5548, 0xD4A7, 0x552D, 0xD4A8, 0x553B, + 0xD4A9, 0x5540, 0xD4AA, 0x554B, 0xD4AB, 0x570A, 0xD4AC, 0x5707, + 0xD4AD, 0x57FB, 0xD4AE, 0x5814, 0xD4AF, 0x57E2, 0xD4B0, 0x57F6, + 0xD4B1, 0x57DC, 0xD4B2, 0x57F4, 0xD4B3, 0x5800, 0xD4B4, 0x57ED, + 0xD4B5, 0x57FD, 0xD4B6, 0x5808, 0xD4B7, 0x57F8, 0xD4B8, 0x580B, + 0xD4B9, 0x57F3, 0xD4BA, 0x57CF, 0xD4BB, 0x5807, 0xD4BC, 0x57EE, + 0xD4BD, 0x57E3, 0xD4BE, 0x57F2, 0xD4BF, 0x57E5, 0xD4C0, 0x57EC, + 0xD4C1, 0x57E1, 0xD4C2, 0x580E, 0xD4C3, 0x57FC, 0xD4C4, 0x5810, + 0xD4C5, 0x57E7, 0xD4C6, 0x5801, 0xD4C7, 0x580C, 0xD4C8, 0x57F1, + 0xD4C9, 0x57E9, 0xD4CA, 0x57F0, 0xD4CB, 0x580D, 0xD4CC, 0x5804, + 0xD4CD, 0x595C, 0xD4CE, 0x5A60, 0xD4CF, 0x5A58, 0xD4D0, 0x5A55, + 0xD4D1, 0x5A67, 0xD4D2, 0x5A5E, 0xD4D3, 0x5A38, 0xD4D4, 0x5A35, + 0xD4D5, 0x5A6D, 0xD4D6, 0x5A50, 0xD4D7, 0x5A5F, 0xD4D8, 0x5A65, + 0xD4D9, 0x5A6C, 0xD4DA, 0x5A53, 0xD4DB, 0x5A64, 0xD4DC, 0x5A57, + 0xD4DD, 0x5A43, 0xD4DE, 0x5A5D, 0xD4DF, 0x5A52, 0xD4E0, 0x5A44, + 0xD4E1, 0x5A5B, 0xD4E2, 0x5A48, 0xD4E3, 0x5A8E, 0xD4E4, 0x5A3E, + 0xD4E5, 0x5A4D, 0xD4E6, 0x5A39, 0xD4E7, 0x5A4C, 0xD4E8, 0x5A70, + 0xD4E9, 0x5A69, 0xD4EA, 0x5A47, 0xD4EB, 0x5A51, 0xD4EC, 0x5A56, + 0xD4ED, 0x5A42, 0xD4EE, 0x5A5C, 0xD4EF, 0x5B72, 0xD4F0, 0x5B6E, + 0xD4F1, 0x5BC1, 0xD4F2, 0x5BC0, 0xD4F3, 0x5C59, 0xD4F4, 0x5D1E, + 0xD4F5, 0x5D0B, 0xD4F6, 0x5D1D, 0xD4F7, 0x5D1A, 0xD4F8, 0x5D20, + 0xD4F9, 0x5D0C, 0xD4FA, 0x5D28, 0xD4FB, 0x5D0D, 0xD4FC, 0x5D26, + 0xD4FD, 0x5D25, 0xD4FE, 0x5D0F, 0xD540, 0x5D30, 0xD541, 0x5D12, + 0xD542, 0x5D23, 0xD543, 0x5D1F, 0xD544, 0x5D2E, 0xD545, 0x5E3E, + 0xD546, 0x5E34, 0xD547, 0x5EB1, 0xD548, 0x5EB4, 0xD549, 0x5EB9, + 0xD54A, 0x5EB2, 0xD54B, 0x5EB3, 0xD54C, 0x5F36, 0xD54D, 0x5F38, + 0xD54E, 0x5F9B, 0xD54F, 0x5F96, 0xD550, 0x5F9F, 0xD551, 0x608A, + 0xD552, 0x6090, 0xD553, 0x6086, 0xD554, 0x60BE, 0xD555, 0x60B0, + 0xD556, 0x60BA, 0xD557, 0x60D3, 0xD558, 0x60D4, 0xD559, 0x60CF, + 0xD55A, 0x60E4, 0xD55B, 0x60D9, 0xD55C, 0x60DD, 0xD55D, 0x60C8, + 0xD55E, 0x60B1, 0xD55F, 0x60DB, 0xD560, 0x60B7, 0xD561, 0x60CA, + 0xD562, 0x60BF, 0xD563, 0x60C3, 0xD564, 0x60CD, 0xD565, 0x60C0, + 0xD566, 0x6332, 0xD567, 0x6365, 0xD568, 0x638A, 0xD569, 0x6382, + 0xD56A, 0x637D, 0xD56B, 0x63BD, 0xD56C, 0x639E, 0xD56D, 0x63AD, + 0xD56E, 0x639D, 0xD56F, 0x6397, 0xD570, 0x63AB, 0xD571, 0x638E, + 0xD572, 0x636F, 0xD573, 0x6387, 0xD574, 0x6390, 0xD575, 0x636E, + 0xD576, 0x63AF, 0xD577, 0x6375, 0xD578, 0x639C, 0xD579, 0x636D, + 0xD57A, 0x63AE, 0xD57B, 0x637C, 0xD57C, 0x63A4, 0xD57D, 0x633B, + 0xD57E, 0x639F, 0xD5A1, 0x6378, 0xD5A2, 0x6385, 0xD5A3, 0x6381, + 0xD5A4, 0x6391, 0xD5A5, 0x638D, 0xD5A6, 0x6370, 0xD5A7, 0x6553, + 0xD5A8, 0x65CD, 0xD5A9, 0x6665, 0xD5AA, 0x6661, 0xD5AB, 0x665B, + 0xD5AC, 0x6659, 0xD5AD, 0x665C, 0xD5AE, 0x6662, 0xD5AF, 0x6718, + 0xD5B0, 0x6879, 0xD5B1, 0x6887, 0xD5B2, 0x6890, 0xD5B3, 0x689C, + 0xD5B4, 0x686D, 0xD5B5, 0x686E, 0xD5B6, 0x68AE, 0xD5B7, 0x68AB, + 0xD5B8, 0x6956, 0xD5B9, 0x686F, 0xD5BA, 0x68A3, 0xD5BB, 0x68AC, + 0xD5BC, 0x68A9, 0xD5BD, 0x6875, 0xD5BE, 0x6874, 0xD5BF, 0x68B2, + 0xD5C0, 0x688F, 0xD5C1, 0x6877, 0xD5C2, 0x6892, 0xD5C3, 0x687C, + 0xD5C4, 0x686B, 0xD5C5, 0x6872, 0xD5C6, 0x68AA, 0xD5C7, 0x6880, + 0xD5C8, 0x6871, 0xD5C9, 0x687E, 0xD5CA, 0x689B, 0xD5CB, 0x6896, + 0xD5CC, 0x688B, 0xD5CD, 0x68A0, 0xD5CE, 0x6889, 0xD5CF, 0x68A4, + 0xD5D0, 0x6878, 0xD5D1, 0x687B, 0xD5D2, 0x6891, 0xD5D3, 0x688C, + 0xD5D4, 0x688A, 0xD5D5, 0x687D, 0xD5D6, 0x6B36, 0xD5D7, 0x6B33, + 0xD5D8, 0x6B37, 0xD5D9, 0x6B38, 0xD5DA, 0x6B91, 0xD5DB, 0x6B8F, + 0xD5DC, 0x6B8D, 0xD5DD, 0x6B8E, 0xD5DE, 0x6B8C, 0xD5DF, 0x6C2A, + 0xD5E0, 0x6DC0, 0xD5E1, 0x6DAB, 0xD5E2, 0x6DB4, 0xD5E3, 0x6DB3, + 0xD5E4, 0x6E74, 0xD5E5, 0x6DAC, 0xD5E6, 0x6DE9, 0xD5E7, 0x6DE2, + 0xD5E8, 0x6DB7, 0xD5E9, 0x6DF6, 0xD5EA, 0x6DD4, 0xD5EB, 0x6E00, + 0xD5EC, 0x6DC8, 0xD5ED, 0x6DE0, 0xD5EE, 0x6DDF, 0xD5EF, 0x6DD6, + 0xD5F0, 0x6DBE, 0xD5F1, 0x6DE5, 0xD5F2, 0x6DDC, 0xD5F3, 0x6DDD, + 0xD5F4, 0x6DDB, 0xD5F5, 0x6DF4, 0xD5F6, 0x6DCA, 0xD5F7, 0x6DBD, + 0xD5F8, 0x6DED, 0xD5F9, 0x6DF0, 0xD5FA, 0x6DBA, 0xD5FB, 0x6DD5, + 0xD5FC, 0x6DC2, 0xD5FD, 0x6DCF, 0xD5FE, 0x6DC9, 0xD640, 0x6DD0, + 0xD641, 0x6DF2, 0xD642, 0x6DD3, 0xD643, 0x6DFD, 0xD644, 0x6DD7, + 0xD645, 0x6DCD, 0xD646, 0x6DE3, 0xD647, 0x6DBB, 0xD648, 0x70FA, + 0xD649, 0x710D, 0xD64A, 0x70F7, 0xD64B, 0x7117, 0xD64C, 0x70F4, + 0xD64D, 0x710C, 0xD64E, 0x70F0, 0xD64F, 0x7104, 0xD650, 0x70F3, + 0xD651, 0x7110, 0xD652, 0x70FC, 0xD653, 0x70FF, 0xD654, 0x7106, + 0xD655, 0x7113, 0xD656, 0x7100, 0xD657, 0x70F8, 0xD658, 0x70F6, + 0xD659, 0x710B, 0xD65A, 0x7102, 0xD65B, 0x710E, 0xD65C, 0x727E, + 0xD65D, 0x727B, 0xD65E, 0x727C, 0xD65F, 0x727F, 0xD660, 0x731D, + 0xD661, 0x7317, 0xD662, 0x7307, 0xD663, 0x7311, 0xD664, 0x7318, + 0xD665, 0x730A, 0xD666, 0x7308, 0xD667, 0x72FF, 0xD668, 0x730F, + 0xD669, 0x731E, 0xD66A, 0x7388, 0xD66B, 0x73F6, 0xD66C, 0x73F8, + 0xD66D, 0x73F5, 0xD66E, 0x7404, 0xD66F, 0x7401, 0xD670, 0x73FD, + 0xD671, 0x7407, 0xD672, 0x7400, 0xD673, 0x73FA, 0xD674, 0x73FC, + 0xD675, 0x73FF, 0xD676, 0x740C, 0xD677, 0x740B, 0xD678, 0x73F4, + 0xD679, 0x7408, 0xD67A, 0x7564, 0xD67B, 0x7563, 0xD67C, 0x75CE, + 0xD67D, 0x75D2, 0xD67E, 0x75CF, 0xD6A1, 0x75CB, 0xD6A2, 0x75CC, + 0xD6A3, 0x75D1, 0xD6A4, 0x75D0, 0xD6A5, 0x768F, 0xD6A6, 0x7689, + 0xD6A7, 0x76D3, 0xD6A8, 0x7739, 0xD6A9, 0x772F, 0xD6AA, 0x772D, + 0xD6AB, 0x7731, 0xD6AC, 0x7732, 0xD6AD, 0x7734, 0xD6AE, 0x7733, + 0xD6AF, 0x773D, 0xD6B0, 0x7725, 0xD6B1, 0x773B, 0xD6B2, 0x7735, + 0xD6B3, 0x7848, 0xD6B4, 0x7852, 0xD6B5, 0x7849, 0xD6B6, 0x784D, + 0xD6B7, 0x784A, 0xD6B8, 0x784C, 0xD6B9, 0x7826, 0xD6BA, 0x7845, + 0xD6BB, 0x7850, 0xD6BC, 0x7964, 0xD6BD, 0x7967, 0xD6BE, 0x7969, + 0xD6BF, 0x796A, 0xD6C0, 0x7963, 0xD6C1, 0x796B, 0xD6C2, 0x7961, + 0xD6C3, 0x79BB, 0xD6C4, 0x79FA, 0xD6C5, 0x79F8, 0xD6C6, 0x79F6, + 0xD6C7, 0x79F7, 0xD6C8, 0x7A8F, 0xD6C9, 0x7A94, 0xD6CA, 0x7A90, + 0xD6CB, 0x7B35, 0xD6CC, 0x7B47, 0xD6CD, 0x7B34, 0xD6CE, 0x7B25, + 0xD6CF, 0x7B30, 0xD6D0, 0x7B22, 0xD6D1, 0x7B24, 0xD6D2, 0x7B33, + 0xD6D3, 0x7B18, 0xD6D4, 0x7B2A, 0xD6D5, 0x7B1D, 0xD6D6, 0x7B31, + 0xD6D7, 0x7B2B, 0xD6D8, 0x7B2D, 0xD6D9, 0x7B2F, 0xD6DA, 0x7B32, + 0xD6DB, 0x7B38, 0xD6DC, 0x7B1A, 0xD6DD, 0x7B23, 0xD6DE, 0x7C94, + 0xD6DF, 0x7C98, 0xD6E0, 0x7C96, 0xD6E1, 0x7CA3, 0xD6E2, 0x7D35, + 0xD6E3, 0x7D3D, 0xD6E4, 0x7D38, 0xD6E5, 0x7D36, 0xD6E6, 0x7D3A, + 0xD6E7, 0x7D45, 0xD6E8, 0x7D2C, 0xD6E9, 0x7D29, 0xD6EA, 0x7D41, + 0xD6EB, 0x7D47, 0xD6EC, 0x7D3E, 0xD6ED, 0x7D3F, 0xD6EE, 0x7D4A, + 0xD6EF, 0x7D3B, 0xD6F0, 0x7D28, 0xD6F1, 0x7F63, 0xD6F2, 0x7F95, + 0xD6F3, 0x7F9C, 0xD6F4, 0x7F9D, 0xD6F5, 0x7F9B, 0xD6F6, 0x7FCA, + 0xD6F7, 0x7FCB, 0xD6F8, 0x7FCD, 0xD6F9, 0x7FD0, 0xD6FA, 0x7FD1, + 0xD6FB, 0x7FC7, 0xD6FC, 0x7FCF, 0xD6FD, 0x7FC9, 0xD6FE, 0x801F, + 0xD740, 0x801E, 0xD741, 0x801B, 0xD742, 0x8047, 0xD743, 0x8043, + 0xD744, 0x8048, 0xD745, 0x8118, 0xD746, 0x8125, 0xD747, 0x8119, + 0xD748, 0x811B, 0xD749, 0x812D, 0xD74A, 0x811F, 0xD74B, 0x812C, + 0xD74C, 0x811E, 0xD74D, 0x8121, 0xD74E, 0x8115, 0xD74F, 0x8127, + 0xD750, 0x811D, 0xD751, 0x8122, 0xD752, 0x8211, 0xD753, 0x8238, + 0xD754, 0x8233, 0xD755, 0x823A, 0xD756, 0x8234, 0xD757, 0x8232, + 0xD758, 0x8274, 0xD759, 0x8390, 0xD75A, 0x83A3, 0xD75B, 0x83A8, + 0xD75C, 0x838D, 0xD75D, 0x837A, 0xD75E, 0x8373, 0xD75F, 0x83A4, + 0xD760, 0x8374, 0xD761, 0x838F, 0xD762, 0x8381, 0xD763, 0x8395, + 0xD764, 0x8399, 0xD765, 0x8375, 0xD766, 0x8394, 0xD767, 0x83A9, + 0xD768, 0x837D, 0xD769, 0x8383, 0xD76A, 0x838C, 0xD76B, 0x839D, + 0xD76C, 0x839B, 0xD76D, 0x83AA, 0xD76E, 0x838B, 0xD76F, 0x837E, + 0xD770, 0x83A5, 0xD771, 0x83AF, 0xD772, 0x8388, 0xD773, 0x8397, + 0xD774, 0x83B0, 0xD775, 0x837F, 0xD776, 0x83A6, 0xD777, 0x8387, + 0xD778, 0x83AE, 0xD779, 0x8376, 0xD77A, 0x839A, 0xD77B, 0x8659, + 0xD77C, 0x8656, 0xD77D, 0x86BF, 0xD77E, 0x86B7, 0xD7A1, 0x86C2, + 0xD7A2, 0x86C1, 0xD7A3, 0x86C5, 0xD7A4, 0x86BA, 0xD7A5, 0x86B0, + 0xD7A6, 0x86C8, 0xD7A7, 0x86B9, 0xD7A8, 0x86B3, 0xD7A9, 0x86B8, + 0xD7AA, 0x86CC, 0xD7AB, 0x86B4, 0xD7AC, 0x86BB, 0xD7AD, 0x86BC, + 0xD7AE, 0x86C3, 0xD7AF, 0x86BD, 0xD7B0, 0x86BE, 0xD7B1, 0x8852, + 0xD7B2, 0x8889, 0xD7B3, 0x8895, 0xD7B4, 0x88A8, 0xD7B5, 0x88A2, + 0xD7B6, 0x88AA, 0xD7B7, 0x889A, 0xD7B8, 0x8891, 0xD7B9, 0x88A1, + 0xD7BA, 0x889F, 0xD7BB, 0x8898, 0xD7BC, 0x88A7, 0xD7BD, 0x8899, + 0xD7BE, 0x889B, 0xD7BF, 0x8897, 0xD7C0, 0x88A4, 0xD7C1, 0x88AC, + 0xD7C2, 0x888C, 0xD7C3, 0x8893, 0xD7C4, 0x888E, 0xD7C5, 0x8982, + 0xD7C6, 0x89D6, 0xD7C7, 0x89D9, 0xD7C8, 0x89D5, 0xD7C9, 0x8A30, + 0xD7CA, 0x8A27, 0xD7CB, 0x8A2C, 0xD7CC, 0x8A1E, 0xD7CD, 0x8C39, + 0xD7CE, 0x8C3B, 0xD7CF, 0x8C5C, 0xD7D0, 0x8C5D, 0xD7D1, 0x8C7D, + 0xD7D2, 0x8CA5, 0xD7D3, 0x8D7D, 0xD7D4, 0x8D7B, 0xD7D5, 0x8D79, + 0xD7D6, 0x8DBC, 0xD7D7, 0x8DC2, 0xD7D8, 0x8DB9, 0xD7D9, 0x8DBF, + 0xD7DA, 0x8DC1, 0xD7DB, 0x8ED8, 0xD7DC, 0x8EDE, 0xD7DD, 0x8EDD, + 0xD7DE, 0x8EDC, 0xD7DF, 0x8ED7, 0xD7E0, 0x8EE0, 0xD7E1, 0x8EE1, + 0xD7E2, 0x9024, 0xD7E3, 0x900B, 0xD7E4, 0x9011, 0xD7E5, 0x901C, + 0xD7E6, 0x900C, 0xD7E7, 0x9021, 0xD7E8, 0x90EF, 0xD7E9, 0x90EA, + 0xD7EA, 0x90F0, 0xD7EB, 0x90F4, 0xD7EC, 0x90F2, 0xD7ED, 0x90F3, + 0xD7EE, 0x90D4, 0xD7EF, 0x90EB, 0xD7F0, 0x90EC, 0xD7F1, 0x90E9, + 0xD7F2, 0x9156, 0xD7F3, 0x9158, 0xD7F4, 0x915A, 0xD7F5, 0x9153, + 0xD7F6, 0x9155, 0xD7F7, 0x91EC, 0xD7F8, 0x91F4, 0xD7F9, 0x91F1, + 0xD7FA, 0x91F3, 0xD7FB, 0x91F8, 0xD7FC, 0x91E4, 0xD7FD, 0x91F9, + 0xD7FE, 0x91EA, 0xD840, 0x91EB, 0xD841, 0x91F7, 0xD842, 0x91E8, + 0xD843, 0x91EE, 0xD844, 0x957A, 0xD845, 0x9586, 0xD846, 0x9588, + 0xD847, 0x967C, 0xD848, 0x966D, 0xD849, 0x966B, 0xD84A, 0x9671, + 0xD84B, 0x966F, 0xD84C, 0x96BF, 0xD84D, 0x976A, 0xD84E, 0x9804, + 0xD84F, 0x98E5, 0xD850, 0x9997, 0xD851, 0x509B, 0xD852, 0x5095, + 0xD853, 0x5094, 0xD854, 0x509E, 0xD855, 0x508B, 0xD856, 0x50A3, + 0xD857, 0x5083, 0xD858, 0x508C, 0xD859, 0x508E, 0xD85A, 0x509D, + 0xD85B, 0x5068, 0xD85C, 0x509C, 0xD85D, 0x5092, 0xD85E, 0x5082, + 0xD85F, 0x5087, 0xD860, 0x515F, 0xD861, 0x51D4, 0xD862, 0x5312, + 0xD863, 0x5311, 0xD864, 0x53A4, 0xD865, 0x53A7, 0xD866, 0x5591, + 0xD867, 0x55A8, 0xD868, 0x55A5, 0xD869, 0x55AD, 0xD86A, 0x5577, + 0xD86B, 0x5645, 0xD86C, 0x55A2, 0xD86D, 0x5593, 0xD86E, 0x5588, + 0xD86F, 0x558F, 0xD870, 0x55B5, 0xD871, 0x5581, 0xD872, 0x55A3, + 0xD873, 0x5592, 0xD874, 0x55A4, 0xD875, 0x557D, 0xD876, 0x558C, + 0xD877, 0x55A6, 0xD878, 0x557F, 0xD879, 0x5595, 0xD87A, 0x55A1, + 0xD87B, 0x558E, 0xD87C, 0x570C, 0xD87D, 0x5829, 0xD87E, 0x5837, + 0xD8A1, 0x5819, 0xD8A2, 0x581E, 0xD8A3, 0x5827, 0xD8A4, 0x5823, + 0xD8A5, 0x5828, 0xD8A6, 0x57F5, 0xD8A7, 0x5848, 0xD8A8, 0x5825, + 0xD8A9, 0x581C, 0xD8AA, 0x581B, 0xD8AB, 0x5833, 0xD8AC, 0x583F, + 0xD8AD, 0x5836, 0xD8AE, 0x582E, 0xD8AF, 0x5839, 0xD8B0, 0x5838, + 0xD8B1, 0x582D, 0xD8B2, 0x582C, 0xD8B3, 0x583B, 0xD8B4, 0x5961, + 0xD8B5, 0x5AAF, 0xD8B6, 0x5A94, 0xD8B7, 0x5A9F, 0xD8B8, 0x5A7A, + 0xD8B9, 0x5AA2, 0xD8BA, 0x5A9E, 0xD8BB, 0x5A78, 0xD8BC, 0x5AA6, + 0xD8BD, 0x5A7C, 0xD8BE, 0x5AA5, 0xD8BF, 0x5AAC, 0xD8C0, 0x5A95, + 0xD8C1, 0x5AAE, 0xD8C2, 0x5A37, 0xD8C3, 0x5A84, 0xD8C4, 0x5A8A, + 0xD8C5, 0x5A97, 0xD8C6, 0x5A83, 0xD8C7, 0x5A8B, 0xD8C8, 0x5AA9, + 0xD8C9, 0x5A7B, 0xD8CA, 0x5A7D, 0xD8CB, 0x5A8C, 0xD8CC, 0x5A9C, + 0xD8CD, 0x5A8F, 0xD8CE, 0x5A93, 0xD8CF, 0x5A9D, 0xD8D0, 0x5BEA, + 0xD8D1, 0x5BCD, 0xD8D2, 0x5BCB, 0xD8D3, 0x5BD4, 0xD8D4, 0x5BD1, + 0xD8D5, 0x5BCA, 0xD8D6, 0x5BCE, 0xD8D7, 0x5C0C, 0xD8D8, 0x5C30, + 0xD8D9, 0x5D37, 0xD8DA, 0x5D43, 0xD8DB, 0x5D6B, 0xD8DC, 0x5D41, + 0xD8DD, 0x5D4B, 0xD8DE, 0x5D3F, 0xD8DF, 0x5D35, 0xD8E0, 0x5D51, + 0xD8E1, 0x5D4E, 0xD8E2, 0x5D55, 0xD8E3, 0x5D33, 0xD8E4, 0x5D3A, + 0xD8E5, 0x5D52, 0xD8E6, 0x5D3D, 0xD8E7, 0x5D31, 0xD8E8, 0x5D59, + 0xD8E9, 0x5D42, 0xD8EA, 0x5D39, 0xD8EB, 0x5D49, 0xD8EC, 0x5D38, + 0xD8ED, 0x5D3C, 0xD8EE, 0x5D32, 0xD8EF, 0x5D36, 0xD8F0, 0x5D40, + 0xD8F1, 0x5D45, 0xD8F2, 0x5E44, 0xD8F3, 0x5E41, 0xD8F4, 0x5F58, + 0xD8F5, 0x5FA6, 0xD8F6, 0x5FA5, 0xD8F7, 0x5FAB, 0xD8F8, 0x60C9, + 0xD8F9, 0x60B9, 0xD8FA, 0x60CC, 0xD8FB, 0x60E2, 0xD8FC, 0x60CE, + 0xD8FD, 0x60C4, 0xD8FE, 0x6114, 0xD940, 0x60F2, 0xD941, 0x610A, + 0xD942, 0x6116, 0xD943, 0x6105, 0xD944, 0x60F5, 0xD945, 0x6113, + 0xD946, 0x60F8, 0xD947, 0x60FC, 0xD948, 0x60FE, 0xD949, 0x60C1, + 0xD94A, 0x6103, 0xD94B, 0x6118, 0xD94C, 0x611D, 0xD94D, 0x6110, + 0xD94E, 0x60FF, 0xD94F, 0x6104, 0xD950, 0x610B, 0xD951, 0x624A, + 0xD952, 0x6394, 0xD953, 0x63B1, 0xD954, 0x63B0, 0xD955, 0x63CE, + 0xD956, 0x63E5, 0xD957, 0x63E8, 0xD958, 0x63EF, 0xD959, 0x63C3, + 0xD95A, 0x649D, 0xD95B, 0x63F3, 0xD95C, 0x63CA, 0xD95D, 0x63E0, + 0xD95E, 0x63F6, 0xD95F, 0x63D5, 0xD960, 0x63F2, 0xD961, 0x63F5, + 0xD962, 0x6461, 0xD963, 0x63DF, 0xD964, 0x63BE, 0xD965, 0x63DD, + 0xD966, 0x63DC, 0xD967, 0x63C4, 0xD968, 0x63D8, 0xD969, 0x63D3, + 0xD96A, 0x63C2, 0xD96B, 0x63C7, 0xD96C, 0x63CC, 0xD96D, 0x63CB, + 0xD96E, 0x63C8, 0xD96F, 0x63F0, 0xD970, 0x63D7, 0xD971, 0x63D9, + 0xD972, 0x6532, 0xD973, 0x6567, 0xD974, 0x656A, 0xD975, 0x6564, + 0xD976, 0x655C, 0xD977, 0x6568, 0xD978, 0x6565, 0xD979, 0x658C, + 0xD97A, 0x659D, 0xD97B, 0x659E, 0xD97C, 0x65AE, 0xD97D, 0x65D0, + 0xD97E, 0x65D2, 0xD9A1, 0x667C, 0xD9A2, 0x666C, 0xD9A3, 0x667B, + 0xD9A4, 0x6680, 0xD9A5, 0x6671, 0xD9A6, 0x6679, 0xD9A7, 0x666A, + 0xD9A8, 0x6672, 0xD9A9, 0x6701, 0xD9AA, 0x690C, 0xD9AB, 0x68D3, + 0xD9AC, 0x6904, 0xD9AD, 0x68DC, 0xD9AE, 0x692A, 0xD9AF, 0x68EC, + 0xD9B0, 0x68EA, 0xD9B1, 0x68F1, 0xD9B2, 0x690F, 0xD9B3, 0x68D6, + 0xD9B4, 0x68F7, 0xD9B5, 0x68EB, 0xD9B6, 0x68E4, 0xD9B7, 0x68F6, + 0xD9B8, 0x6913, 0xD9B9, 0x6910, 0xD9BA, 0x68F3, 0xD9BB, 0x68E1, + 0xD9BC, 0x6907, 0xD9BD, 0x68CC, 0xD9BE, 0x6908, 0xD9BF, 0x6970, + 0xD9C0, 0x68B4, 0xD9C1, 0x6911, 0xD9C2, 0x68EF, 0xD9C3, 0x68C6, + 0xD9C4, 0x6914, 0xD9C5, 0x68F8, 0xD9C6, 0x68D0, 0xD9C7, 0x68FD, + 0xD9C8, 0x68FC, 0xD9C9, 0x68E8, 0xD9CA, 0x690B, 0xD9CB, 0x690A, + 0xD9CC, 0x6917, 0xD9CD, 0x68CE, 0xD9CE, 0x68C8, 0xD9CF, 0x68DD, + 0xD9D0, 0x68DE, 0xD9D1, 0x68E6, 0xD9D2, 0x68F4, 0xD9D3, 0x68D1, + 0xD9D4, 0x6906, 0xD9D5, 0x68D4, 0xD9D6, 0x68E9, 0xD9D7, 0x6915, + 0xD9D8, 0x6925, 0xD9D9, 0x68C7, 0xD9DA, 0x6B39, 0xD9DB, 0x6B3B, + 0xD9DC, 0x6B3F, 0xD9DD, 0x6B3C, 0xD9DE, 0x6B94, 0xD9DF, 0x6B97, + 0xD9E0, 0x6B99, 0xD9E1, 0x6B95, 0xD9E2, 0x6BBD, 0xD9E3, 0x6BF0, + 0xD9E4, 0x6BF2, 0xD9E5, 0x6BF3, 0xD9E6, 0x6C30, 0xD9E7, 0x6DFC, + 0xD9E8, 0x6E46, 0xD9E9, 0x6E47, 0xD9EA, 0x6E1F, 0xD9EB, 0x6E49, + 0xD9EC, 0x6E88, 0xD9ED, 0x6E3C, 0xD9EE, 0x6E3D, 0xD9EF, 0x6E45, + 0xD9F0, 0x6E62, 0xD9F1, 0x6E2B, 0xD9F2, 0x6E3F, 0xD9F3, 0x6E41, + 0xD9F4, 0x6E5D, 0xD9F5, 0x6E73, 0xD9F6, 0x6E1C, 0xD9F7, 0x6E33, + 0xD9F8, 0x6E4B, 0xD9F9, 0x6E40, 0xD9FA, 0x6E51, 0xD9FB, 0x6E3B, + 0xD9FC, 0x6E03, 0xD9FD, 0x6E2E, 0xD9FE, 0x6E5E, 0xDA40, 0x6E68, + 0xDA41, 0x6E5C, 0xDA42, 0x6E61, 0xDA43, 0x6E31, 0xDA44, 0x6E28, + 0xDA45, 0x6E60, 0xDA46, 0x6E71, 0xDA47, 0x6E6B, 0xDA48, 0x6E39, + 0xDA49, 0x6E22, 0xDA4A, 0x6E30, 0xDA4B, 0x6E53, 0xDA4C, 0x6E65, + 0xDA4D, 0x6E27, 0xDA4E, 0x6E78, 0xDA4F, 0x6E64, 0xDA50, 0x6E77, + 0xDA51, 0x6E55, 0xDA52, 0x6E79, 0xDA53, 0x6E52, 0xDA54, 0x6E66, + 0xDA55, 0x6E35, 0xDA56, 0x6E36, 0xDA57, 0x6E5A, 0xDA58, 0x7120, + 0xDA59, 0x711E, 0xDA5A, 0x712F, 0xDA5B, 0x70FB, 0xDA5C, 0x712E, + 0xDA5D, 0x7131, 0xDA5E, 0x7123, 0xDA5F, 0x7125, 0xDA60, 0x7122, + 0xDA61, 0x7132, 0xDA62, 0x711F, 0xDA63, 0x7128, 0xDA64, 0x713A, + 0xDA65, 0x711B, 0xDA66, 0x724B, 0xDA67, 0x725A, 0xDA68, 0x7288, + 0xDA69, 0x7289, 0xDA6A, 0x7286, 0xDA6B, 0x7285, 0xDA6C, 0x728B, + 0xDA6D, 0x7312, 0xDA6E, 0x730B, 0xDA6F, 0x7330, 0xDA70, 0x7322, + 0xDA71, 0x7331, 0xDA72, 0x7333, 0xDA73, 0x7327, 0xDA74, 0x7332, + 0xDA75, 0x732D, 0xDA76, 0x7326, 0xDA77, 0x7323, 0xDA78, 0x7335, + 0xDA79, 0x730C, 0xDA7A, 0x742E, 0xDA7B, 0x742C, 0xDA7C, 0x7430, + 0xDA7D, 0x742B, 0xDA7E, 0x7416, 0xDAA1, 0x741A, 0xDAA2, 0x7421, + 0xDAA3, 0x742D, 0xDAA4, 0x7431, 0xDAA5, 0x7424, 0xDAA6, 0x7423, + 0xDAA7, 0x741D, 0xDAA8, 0x7429, 0xDAA9, 0x7420, 0xDAAA, 0x7432, + 0xDAAB, 0x74FB, 0xDAAC, 0x752F, 0xDAAD, 0x756F, 0xDAAE, 0x756C, + 0xDAAF, 0x75E7, 0xDAB0, 0x75DA, 0xDAB1, 0x75E1, 0xDAB2, 0x75E6, + 0xDAB3, 0x75DD, 0xDAB4, 0x75DF, 0xDAB5, 0x75E4, 0xDAB6, 0x75D7, + 0xDAB7, 0x7695, 0xDAB8, 0x7692, 0xDAB9, 0x76DA, 0xDABA, 0x7746, + 0xDABB, 0x7747, 0xDABC, 0x7744, 0xDABD, 0x774D, 0xDABE, 0x7745, + 0xDABF, 0x774A, 0xDAC0, 0x774E, 0xDAC1, 0x774B, 0xDAC2, 0x774C, + 0xDAC3, 0x77DE, 0xDAC4, 0x77EC, 0xDAC5, 0x7860, 0xDAC6, 0x7864, + 0xDAC7, 0x7865, 0xDAC8, 0x785C, 0xDAC9, 0x786D, 0xDACA, 0x7871, + 0xDACB, 0x786A, 0xDACC, 0x786E, 0xDACD, 0x7870, 0xDACE, 0x7869, + 0xDACF, 0x7868, 0xDAD0, 0x785E, 0xDAD1, 0x7862, 0xDAD2, 0x7974, + 0xDAD3, 0x7973, 0xDAD4, 0x7972, 0xDAD5, 0x7970, 0xDAD6, 0x7A02, + 0xDAD7, 0x7A0A, 0xDAD8, 0x7A03, 0xDAD9, 0x7A0C, 0xDADA, 0x7A04, + 0xDADB, 0x7A99, 0xDADC, 0x7AE6, 0xDADD, 0x7AE4, 0xDADE, 0x7B4A, + 0xDADF, 0x7B3B, 0xDAE0, 0x7B44, 0xDAE1, 0x7B48, 0xDAE2, 0x7B4C, + 0xDAE3, 0x7B4E, 0xDAE4, 0x7B40, 0xDAE5, 0x7B58, 0xDAE6, 0x7B45, + 0xDAE7, 0x7CA2, 0xDAE8, 0x7C9E, 0xDAE9, 0x7CA8, 0xDAEA, 0x7CA1, + 0xDAEB, 0x7D58, 0xDAEC, 0x7D6F, 0xDAED, 0x7D63, 0xDAEE, 0x7D53, + 0xDAEF, 0x7D56, 0xDAF0, 0x7D67, 0xDAF1, 0x7D6A, 0xDAF2, 0x7D4F, + 0xDAF3, 0x7D6D, 0xDAF4, 0x7D5C, 0xDAF5, 0x7D6B, 0xDAF6, 0x7D52, + 0xDAF7, 0x7D54, 0xDAF8, 0x7D69, 0xDAF9, 0x7D51, 0xDAFA, 0x7D5F, + 0xDAFB, 0x7D4E, 0xDAFC, 0x7F3E, 0xDAFD, 0x7F3F, 0xDAFE, 0x7F65, + 0xDB40, 0x7F66, 0xDB41, 0x7FA2, 0xDB42, 0x7FA0, 0xDB43, 0x7FA1, + 0xDB44, 0x7FD7, 0xDB45, 0x8051, 0xDB46, 0x804F, 0xDB47, 0x8050, + 0xDB48, 0x80FE, 0xDB49, 0x80D4, 0xDB4A, 0x8143, 0xDB4B, 0x814A, + 0xDB4C, 0x8152, 0xDB4D, 0x814F, 0xDB4E, 0x8147, 0xDB4F, 0x813D, + 0xDB50, 0x814D, 0xDB51, 0x813A, 0xDB52, 0x81E6, 0xDB53, 0x81EE, + 0xDB54, 0x81F7, 0xDB55, 0x81F8, 0xDB56, 0x81F9, 0xDB57, 0x8204, + 0xDB58, 0x823C, 0xDB59, 0x823D, 0xDB5A, 0x823F, 0xDB5B, 0x8275, + 0xDB5C, 0x833B, 0xDB5D, 0x83CF, 0xDB5E, 0x83F9, 0xDB5F, 0x8423, + 0xDB60, 0x83C0, 0xDB61, 0x83E8, 0xDB62, 0x8412, 0xDB63, 0x83E7, + 0xDB64, 0x83E4, 0xDB65, 0x83FC, 0xDB66, 0x83F6, 0xDB67, 0x8410, + 0xDB68, 0x83C6, 0xDB69, 0x83C8, 0xDB6A, 0x83EB, 0xDB6B, 0x83E3, + 0xDB6C, 0x83BF, 0xDB6D, 0x8401, 0xDB6E, 0x83DD, 0xDB6F, 0x83E5, + 0xDB70, 0x83D8, 0xDB71, 0x83FF, 0xDB72, 0x83E1, 0xDB73, 0x83CB, + 0xDB74, 0x83CE, 0xDB75, 0x83D6, 0xDB76, 0x83F5, 0xDB77, 0x83C9, + 0xDB78, 0x8409, 0xDB79, 0x840F, 0xDB7A, 0x83DE, 0xDB7B, 0x8411, + 0xDB7C, 0x8406, 0xDB7D, 0x83C2, 0xDB7E, 0x83F3, 0xDBA1, 0x83D5, + 0xDBA2, 0x83FA, 0xDBA3, 0x83C7, 0xDBA4, 0x83D1, 0xDBA5, 0x83EA, + 0xDBA6, 0x8413, 0xDBA7, 0x83C3, 0xDBA8, 0x83EC, 0xDBA9, 0x83EE, + 0xDBAA, 0x83C4, 0xDBAB, 0x83FB, 0xDBAC, 0x83D7, 0xDBAD, 0x83E2, + 0xDBAE, 0x841B, 0xDBAF, 0x83DB, 0xDBB0, 0x83FE, 0xDBB1, 0x86D8, + 0xDBB2, 0x86E2, 0xDBB3, 0x86E6, 0xDBB4, 0x86D3, 0xDBB5, 0x86E3, + 0xDBB6, 0x86DA, 0xDBB7, 0x86EA, 0xDBB8, 0x86DD, 0xDBB9, 0x86EB, + 0xDBBA, 0x86DC, 0xDBBB, 0x86EC, 0xDBBC, 0x86E9, 0xDBBD, 0x86D7, + 0xDBBE, 0x86E8, 0xDBBF, 0x86D1, 0xDBC0, 0x8848, 0xDBC1, 0x8856, + 0xDBC2, 0x8855, 0xDBC3, 0x88BA, 0xDBC4, 0x88D7, 0xDBC5, 0x88B9, + 0xDBC6, 0x88B8, 0xDBC7, 0x88C0, 0xDBC8, 0x88BE, 0xDBC9, 0x88B6, + 0xDBCA, 0x88BC, 0xDBCB, 0x88B7, 0xDBCC, 0x88BD, 0xDBCD, 0x88B2, + 0xDBCE, 0x8901, 0xDBCF, 0x88C9, 0xDBD0, 0x8995, 0xDBD1, 0x8998, + 0xDBD2, 0x8997, 0xDBD3, 0x89DD, 0xDBD4, 0x89DA, 0xDBD5, 0x89DB, + 0xDBD6, 0x8A4E, 0xDBD7, 0x8A4D, 0xDBD8, 0x8A39, 0xDBD9, 0x8A59, + 0xDBDA, 0x8A40, 0xDBDB, 0x8A57, 0xDBDC, 0x8A58, 0xDBDD, 0x8A44, + 0xDBDE, 0x8A45, 0xDBDF, 0x8A52, 0xDBE0, 0x8A48, 0xDBE1, 0x8A51, + 0xDBE2, 0x8A4A, 0xDBE3, 0x8A4C, 0xDBE4, 0x8A4F, 0xDBE5, 0x8C5F, + 0xDBE6, 0x8C81, 0xDBE7, 0x8C80, 0xDBE8, 0x8CBA, 0xDBE9, 0x8CBE, + 0xDBEA, 0x8CB0, 0xDBEB, 0x8CB9, 0xDBEC, 0x8CB5, 0xDBED, 0x8D84, + 0xDBEE, 0x8D80, 0xDBEF, 0x8D89, 0xDBF0, 0x8DD8, 0xDBF1, 0x8DD3, + 0xDBF2, 0x8DCD, 0xDBF3, 0x8DC7, 0xDBF4, 0x8DD6, 0xDBF5, 0x8DDC, + 0xDBF6, 0x8DCF, 0xDBF7, 0x8DD5, 0xDBF8, 0x8DD9, 0xDBF9, 0x8DC8, + 0xDBFA, 0x8DD7, 0xDBFB, 0x8DC5, 0xDBFC, 0x8EEF, 0xDBFD, 0x8EF7, + 0xDBFE, 0x8EFA, 0xDC40, 0x8EF9, 0xDC41, 0x8EE6, 0xDC42, 0x8EEE, + 0xDC43, 0x8EE5, 0xDC44, 0x8EF5, 0xDC45, 0x8EE7, 0xDC46, 0x8EE8, + 0xDC47, 0x8EF6, 0xDC48, 0x8EEB, 0xDC49, 0x8EF1, 0xDC4A, 0x8EEC, + 0xDC4B, 0x8EF4, 0xDC4C, 0x8EE9, 0xDC4D, 0x902D, 0xDC4E, 0x9034, + 0xDC4F, 0x902F, 0xDC50, 0x9106, 0xDC51, 0x912C, 0xDC52, 0x9104, + 0xDC53, 0x90FF, 0xDC54, 0x90FC, 0xDC55, 0x9108, 0xDC56, 0x90F9, + 0xDC57, 0x90FB, 0xDC58, 0x9101, 0xDC59, 0x9100, 0xDC5A, 0x9107, + 0xDC5B, 0x9105, 0xDC5C, 0x9103, 0xDC5D, 0x9161, 0xDC5E, 0x9164, + 0xDC5F, 0x915F, 0xDC60, 0x9162, 0xDC61, 0x9160, 0xDC62, 0x9201, + 0xDC63, 0x920A, 0xDC64, 0x9225, 0xDC65, 0x9203, 0xDC66, 0x921A, + 0xDC67, 0x9226, 0xDC68, 0x920F, 0xDC69, 0x920C, 0xDC6A, 0x9200, + 0xDC6B, 0x9212, 0xDC6C, 0x91FF, 0xDC6D, 0x91FD, 0xDC6E, 0x9206, + 0xDC6F, 0x9204, 0xDC70, 0x9227, 0xDC71, 0x9202, 0xDC72, 0x921C, + 0xDC73, 0x9224, 0xDC74, 0x9219, 0xDC75, 0x9217, 0xDC76, 0x9205, + 0xDC77, 0x9216, 0xDC78, 0x957B, 0xDC79, 0x958D, 0xDC7A, 0x958C, + 0xDC7B, 0x9590, 0xDC7C, 0x9687, 0xDC7D, 0x967E, 0xDC7E, 0x9688, + 0xDCA1, 0x9689, 0xDCA2, 0x9683, 0xDCA3, 0x9680, 0xDCA4, 0x96C2, + 0xDCA5, 0x96C8, 0xDCA6, 0x96C3, 0xDCA7, 0x96F1, 0xDCA8, 0x96F0, + 0xDCA9, 0x976C, 0xDCAA, 0x9770, 0xDCAB, 0x976E, 0xDCAC, 0x9807, + 0xDCAD, 0x98A9, 0xDCAE, 0x98EB, 0xDCAF, 0x9CE6, 0xDCB0, 0x9EF9, + 0xDCB1, 0x4E83, 0xDCB2, 0x4E84, 0xDCB3, 0x4EB6, 0xDCB4, 0x50BD, + 0xDCB5, 0x50BF, 0xDCB6, 0x50C6, 0xDCB7, 0x50AE, 0xDCB8, 0x50C4, + 0xDCB9, 0x50CA, 0xDCBA, 0x50B4, 0xDCBB, 0x50C8, 0xDCBC, 0x50C2, + 0xDCBD, 0x50B0, 0xDCBE, 0x50C1, 0xDCBF, 0x50BA, 0xDCC0, 0x50B1, + 0xDCC1, 0x50CB, 0xDCC2, 0x50C9, 0xDCC3, 0x50B6, 0xDCC4, 0x50B8, + 0xDCC5, 0x51D7, 0xDCC6, 0x527A, 0xDCC7, 0x5278, 0xDCC8, 0x527B, + 0xDCC9, 0x527C, 0xDCCA, 0x55C3, 0xDCCB, 0x55DB, 0xDCCC, 0x55CC, + 0xDCCD, 0x55D0, 0xDCCE, 0x55CB, 0xDCCF, 0x55CA, 0xDCD0, 0x55DD, + 0xDCD1, 0x55C0, 0xDCD2, 0x55D4, 0xDCD3, 0x55C4, 0xDCD4, 0x55E9, + 0xDCD5, 0x55BF, 0xDCD6, 0x55D2, 0xDCD7, 0x558D, 0xDCD8, 0x55CF, + 0xDCD9, 0x55D5, 0xDCDA, 0x55E2, 0xDCDB, 0x55D6, 0xDCDC, 0x55C8, + 0xDCDD, 0x55F2, 0xDCDE, 0x55CD, 0xDCDF, 0x55D9, 0xDCE0, 0x55C2, + 0xDCE1, 0x5714, 0xDCE2, 0x5853, 0xDCE3, 0x5868, 0xDCE4, 0x5864, + 0xDCE5, 0x584F, 0xDCE6, 0x584D, 0xDCE7, 0x5849, 0xDCE8, 0x586F, + 0xDCE9, 0x5855, 0xDCEA, 0x584E, 0xDCEB, 0x585D, 0xDCEC, 0x5859, + 0xDCED, 0x5865, 0xDCEE, 0x585B, 0xDCEF, 0x583D, 0xDCF0, 0x5863, + 0xDCF1, 0x5871, 0xDCF2, 0x58FC, 0xDCF3, 0x5AC7, 0xDCF4, 0x5AC4, + 0xDCF5, 0x5ACB, 0xDCF6, 0x5ABA, 0xDCF7, 0x5AB8, 0xDCF8, 0x5AB1, + 0xDCF9, 0x5AB5, 0xDCFA, 0x5AB0, 0xDCFB, 0x5ABF, 0xDCFC, 0x5AC8, + 0xDCFD, 0x5ABB, 0xDCFE, 0x5AC6, 0xDD40, 0x5AB7, 0xDD41, 0x5AC0, + 0xDD42, 0x5ACA, 0xDD43, 0x5AB4, 0xDD44, 0x5AB6, 0xDD45, 0x5ACD, + 0xDD46, 0x5AB9, 0xDD47, 0x5A90, 0xDD48, 0x5BD6, 0xDD49, 0x5BD8, + 0xDD4A, 0x5BD9, 0xDD4B, 0x5C1F, 0xDD4C, 0x5C33, 0xDD4D, 0x5D71, + 0xDD4E, 0x5D63, 0xDD4F, 0x5D4A, 0xDD50, 0x5D65, 0xDD51, 0x5D72, + 0xDD52, 0x5D6C, 0xDD53, 0x5D5E, 0xDD54, 0x5D68, 0xDD55, 0x5D67, + 0xDD56, 0x5D62, 0xDD57, 0x5DF0, 0xDD58, 0x5E4F, 0xDD59, 0x5E4E, + 0xDD5A, 0x5E4A, 0xDD5B, 0x5E4D, 0xDD5C, 0x5E4B, 0xDD5D, 0x5EC5, + 0xDD5E, 0x5ECC, 0xDD5F, 0x5EC6, 0xDD60, 0x5ECB, 0xDD61, 0x5EC7, + 0xDD62, 0x5F40, 0xDD63, 0x5FAF, 0xDD64, 0x5FAD, 0xDD65, 0x60F7, + 0xDD66, 0x6149, 0xDD67, 0x614A, 0xDD68, 0x612B, 0xDD69, 0x6145, + 0xDD6A, 0x6136, 0xDD6B, 0x6132, 0xDD6C, 0x612E, 0xDD6D, 0x6146, + 0xDD6E, 0x612F, 0xDD6F, 0x614F, 0xDD70, 0x6129, 0xDD71, 0x6140, + 0xDD72, 0x6220, 0xDD73, 0x9168, 0xDD74, 0x6223, 0xDD75, 0x6225, + 0xDD76, 0x6224, 0xDD77, 0x63C5, 0xDD78, 0x63F1, 0xDD79, 0x63EB, + 0xDD7A, 0x6410, 0xDD7B, 0x6412, 0xDD7C, 0x6409, 0xDD7D, 0x6420, + 0xDD7E, 0x6424, 0xDDA1, 0x6433, 0xDDA2, 0x6443, 0xDDA3, 0x641F, + 0xDDA4, 0x6415, 0xDDA5, 0x6418, 0xDDA6, 0x6439, 0xDDA7, 0x6437, + 0xDDA8, 0x6422, 0xDDA9, 0x6423, 0xDDAA, 0x640C, 0xDDAB, 0x6426, + 0xDDAC, 0x6430, 0xDDAD, 0x6428, 0xDDAE, 0x6441, 0xDDAF, 0x6435, + 0xDDB0, 0x642F, 0xDDB1, 0x640A, 0xDDB2, 0x641A, 0xDDB3, 0x6440, + 0xDDB4, 0x6425, 0xDDB5, 0x6427, 0xDDB6, 0x640B, 0xDDB7, 0x63E7, + 0xDDB8, 0x641B, 0xDDB9, 0x642E, 0xDDBA, 0x6421, 0xDDBB, 0x640E, + 0xDDBC, 0x656F, 0xDDBD, 0x6592, 0xDDBE, 0x65D3, 0xDDBF, 0x6686, + 0xDDC0, 0x668C, 0xDDC1, 0x6695, 0xDDC2, 0x6690, 0xDDC3, 0x668B, + 0xDDC4, 0x668A, 0xDDC5, 0x6699, 0xDDC6, 0x6694, 0xDDC7, 0x6678, + 0xDDC8, 0x6720, 0xDDC9, 0x6966, 0xDDCA, 0x695F, 0xDDCB, 0x6938, + 0xDDCC, 0x694E, 0xDDCD, 0x6962, 0xDDCE, 0x6971, 0xDDCF, 0x693F, + 0xDDD0, 0x6945, 0xDDD1, 0x696A, 0xDDD2, 0x6939, 0xDDD3, 0x6942, + 0xDDD4, 0x6957, 0xDDD5, 0x6959, 0xDDD6, 0x697A, 0xDDD7, 0x6948, + 0xDDD8, 0x6949, 0xDDD9, 0x6935, 0xDDDA, 0x696C, 0xDDDB, 0x6933, + 0xDDDC, 0x693D, 0xDDDD, 0x6965, 0xDDDE, 0x68F0, 0xDDDF, 0x6978, + 0xDDE0, 0x6934, 0xDDE1, 0x6969, 0xDDE2, 0x6940, 0xDDE3, 0x696F, + 0xDDE4, 0x6944, 0xDDE5, 0x6976, 0xDDE6, 0x6958, 0xDDE7, 0x6941, + 0xDDE8, 0x6974, 0xDDE9, 0x694C, 0xDDEA, 0x693B, 0xDDEB, 0x694B, + 0xDDEC, 0x6937, 0xDDED, 0x695C, 0xDDEE, 0x694F, 0xDDEF, 0x6951, + 0xDDF0, 0x6932, 0xDDF1, 0x6952, 0xDDF2, 0x692F, 0xDDF3, 0x697B, + 0xDDF4, 0x693C, 0xDDF5, 0x6B46, 0xDDF6, 0x6B45, 0xDDF7, 0x6B43, + 0xDDF8, 0x6B42, 0xDDF9, 0x6B48, 0xDDFA, 0x6B41, 0xDDFB, 0x6B9B, + 0xDDFC, 0xFA0D, 0xDDFD, 0x6BFB, 0xDDFE, 0x6BFC, 0xDE40, 0x6BF9, + 0xDE41, 0x6BF7, 0xDE42, 0x6BF8, 0xDE43, 0x6E9B, 0xDE44, 0x6ED6, + 0xDE45, 0x6EC8, 0xDE46, 0x6E8F, 0xDE47, 0x6EC0, 0xDE48, 0x6E9F, + 0xDE49, 0x6E93, 0xDE4A, 0x6E94, 0xDE4B, 0x6EA0, 0xDE4C, 0x6EB1, + 0xDE4D, 0x6EB9, 0xDE4E, 0x6EC6, 0xDE4F, 0x6ED2, 0xDE50, 0x6EBD, + 0xDE51, 0x6EC1, 0xDE52, 0x6E9E, 0xDE53, 0x6EC9, 0xDE54, 0x6EB7, + 0xDE55, 0x6EB0, 0xDE56, 0x6ECD, 0xDE57, 0x6EA6, 0xDE58, 0x6ECF, + 0xDE59, 0x6EB2, 0xDE5A, 0x6EBE, 0xDE5B, 0x6EC3, 0xDE5C, 0x6EDC, + 0xDE5D, 0x6ED8, 0xDE5E, 0x6E99, 0xDE5F, 0x6E92, 0xDE60, 0x6E8E, + 0xDE61, 0x6E8D, 0xDE62, 0x6EA4, 0xDE63, 0x6EA1, 0xDE64, 0x6EBF, + 0xDE65, 0x6EB3, 0xDE66, 0x6ED0, 0xDE67, 0x6ECA, 0xDE68, 0x6E97, + 0xDE69, 0x6EAE, 0xDE6A, 0x6EA3, 0xDE6B, 0x7147, 0xDE6C, 0x7154, + 0xDE6D, 0x7152, 0xDE6E, 0x7163, 0xDE6F, 0x7160, 0xDE70, 0x7141, + 0xDE71, 0x715D, 0xDE72, 0x7162, 0xDE73, 0x7172, 0xDE74, 0x7178, + 0xDE75, 0x716A, 0xDE76, 0x7161, 0xDE77, 0x7142, 0xDE78, 0x7158, + 0xDE79, 0x7143, 0xDE7A, 0x714B, 0xDE7B, 0x7170, 0xDE7C, 0x715F, + 0xDE7D, 0x7150, 0xDE7E, 0x7153, 0xDEA1, 0x7144, 0xDEA2, 0x714D, + 0xDEA3, 0x715A, 0xDEA4, 0x724F, 0xDEA5, 0x728D, 0xDEA6, 0x728C, + 0xDEA7, 0x7291, 0xDEA8, 0x7290, 0xDEA9, 0x728E, 0xDEAA, 0x733C, + 0xDEAB, 0x7342, 0xDEAC, 0x733B, 0xDEAD, 0x733A, 0xDEAE, 0x7340, + 0xDEAF, 0x734A, 0xDEB0, 0x7349, 0xDEB1, 0x7444, 0xDEB2, 0x744A, + 0xDEB3, 0x744B, 0xDEB4, 0x7452, 0xDEB5, 0x7451, 0xDEB6, 0x7457, + 0xDEB7, 0x7440, 0xDEB8, 0x744F, 0xDEB9, 0x7450, 0xDEBA, 0x744E, + 0xDEBB, 0x7442, 0xDEBC, 0x7446, 0xDEBD, 0x744D, 0xDEBE, 0x7454, + 0xDEBF, 0x74E1, 0xDEC0, 0x74FF, 0xDEC1, 0x74FE, 0xDEC2, 0x74FD, + 0xDEC3, 0x751D, 0xDEC4, 0x7579, 0xDEC5, 0x7577, 0xDEC6, 0x6983, + 0xDEC7, 0x75EF, 0xDEC8, 0x760F, 0xDEC9, 0x7603, 0xDECA, 0x75F7, + 0xDECB, 0x75FE, 0xDECC, 0x75FC, 0xDECD, 0x75F9, 0xDECE, 0x75F8, + 0xDECF, 0x7610, 0xDED0, 0x75FB, 0xDED1, 0x75F6, 0xDED2, 0x75ED, + 0xDED3, 0x75F5, 0xDED4, 0x75FD, 0xDED5, 0x7699, 0xDED6, 0x76B5, + 0xDED7, 0x76DD, 0xDED8, 0x7755, 0xDED9, 0x775F, 0xDEDA, 0x7760, + 0xDEDB, 0x7752, 0xDEDC, 0x7756, 0xDEDD, 0x775A, 0xDEDE, 0x7769, + 0xDEDF, 0x7767, 0xDEE0, 0x7754, 0xDEE1, 0x7759, 0xDEE2, 0x776D, + 0xDEE3, 0x77E0, 0xDEE4, 0x7887, 0xDEE5, 0x789A, 0xDEE6, 0x7894, + 0xDEE7, 0x788F, 0xDEE8, 0x7884, 0xDEE9, 0x7895, 0xDEEA, 0x7885, + 0xDEEB, 0x7886, 0xDEEC, 0x78A1, 0xDEED, 0x7883, 0xDEEE, 0x7879, + 0xDEEF, 0x7899, 0xDEF0, 0x7880, 0xDEF1, 0x7896, 0xDEF2, 0x787B, + 0xDEF3, 0x797C, 0xDEF4, 0x7982, 0xDEF5, 0x797D, 0xDEF6, 0x7979, + 0xDEF7, 0x7A11, 0xDEF8, 0x7A18, 0xDEF9, 0x7A19, 0xDEFA, 0x7A12, + 0xDEFB, 0x7A17, 0xDEFC, 0x7A15, 0xDEFD, 0x7A22, 0xDEFE, 0x7A13, + 0xDF40, 0x7A1B, 0xDF41, 0x7A10, 0xDF42, 0x7AA3, 0xDF43, 0x7AA2, + 0xDF44, 0x7A9E, 0xDF45, 0x7AEB, 0xDF46, 0x7B66, 0xDF47, 0x7B64, + 0xDF48, 0x7B6D, 0xDF49, 0x7B74, 0xDF4A, 0x7B69, 0xDF4B, 0x7B72, + 0xDF4C, 0x7B65, 0xDF4D, 0x7B73, 0xDF4E, 0x7B71, 0xDF4F, 0x7B70, + 0xDF50, 0x7B61, 0xDF51, 0x7B78, 0xDF52, 0x7B76, 0xDF53, 0x7B63, + 0xDF54, 0x7CB2, 0xDF55, 0x7CB4, 0xDF56, 0x7CAF, 0xDF57, 0x7D88, + 0xDF58, 0x7D86, 0xDF59, 0x7D80, 0xDF5A, 0x7D8D, 0xDF5B, 0x7D7F, + 0xDF5C, 0x7D85, 0xDF5D, 0x7D7A, 0xDF5E, 0x7D8E, 0xDF5F, 0x7D7B, + 0xDF60, 0x7D83, 0xDF61, 0x7D7C, 0xDF62, 0x7D8C, 0xDF63, 0x7D94, + 0xDF64, 0x7D84, 0xDF65, 0x7D7D, 0xDF66, 0x7D92, 0xDF67, 0x7F6D, + 0xDF68, 0x7F6B, 0xDF69, 0x7F67, 0xDF6A, 0x7F68, 0xDF6B, 0x7F6C, + 0xDF6C, 0x7FA6, 0xDF6D, 0x7FA5, 0xDF6E, 0x7FA7, 0xDF6F, 0x7FDB, + 0xDF70, 0x7FDC, 0xDF71, 0x8021, 0xDF72, 0x8164, 0xDF73, 0x8160, + 0xDF74, 0x8177, 0xDF75, 0x815C, 0xDF76, 0x8169, 0xDF77, 0x815B, + 0xDF78, 0x8162, 0xDF79, 0x8172, 0xDF7A, 0x6721, 0xDF7B, 0x815E, + 0xDF7C, 0x8176, 0xDF7D, 0x8167, 0xDF7E, 0x816F, 0xDFA1, 0x8144, + 0xDFA2, 0x8161, 0xDFA3, 0x821D, 0xDFA4, 0x8249, 0xDFA5, 0x8244, + 0xDFA6, 0x8240, 0xDFA7, 0x8242, 0xDFA8, 0x8245, 0xDFA9, 0x84F1, + 0xDFAA, 0x843F, 0xDFAB, 0x8456, 0xDFAC, 0x8476, 0xDFAD, 0x8479, + 0xDFAE, 0x848F, 0xDFAF, 0x848D, 0xDFB0, 0x8465, 0xDFB1, 0x8451, + 0xDFB2, 0x8440, 0xDFB3, 0x8486, 0xDFB4, 0x8467, 0xDFB5, 0x8430, + 0xDFB6, 0x844D, 0xDFB7, 0x847D, 0xDFB8, 0x845A, 0xDFB9, 0x8459, + 0xDFBA, 0x8474, 0xDFBB, 0x8473, 0xDFBC, 0x845D, 0xDFBD, 0x8507, + 0xDFBE, 0x845E, 0xDFBF, 0x8437, 0xDFC0, 0x843A, 0xDFC1, 0x8434, + 0xDFC2, 0x847A, 0xDFC3, 0x8443, 0xDFC4, 0x8478, 0xDFC5, 0x8432, + 0xDFC6, 0x8445, 0xDFC7, 0x8429, 0xDFC8, 0x83D9, 0xDFC9, 0x844B, + 0xDFCA, 0x842F, 0xDFCB, 0x8442, 0xDFCC, 0x842D, 0xDFCD, 0x845F, + 0xDFCE, 0x8470, 0xDFCF, 0x8439, 0xDFD0, 0x844E, 0xDFD1, 0x844C, + 0xDFD2, 0x8452, 0xDFD3, 0x846F, 0xDFD4, 0x84C5, 0xDFD5, 0x848E, + 0xDFD6, 0x843B, 0xDFD7, 0x8447, 0xDFD8, 0x8436, 0xDFD9, 0x8433, + 0xDFDA, 0x8468, 0xDFDB, 0x847E, 0xDFDC, 0x8444, 0xDFDD, 0x842B, + 0xDFDE, 0x8460, 0xDFDF, 0x8454, 0xDFE0, 0x846E, 0xDFE1, 0x8450, + 0xDFE2, 0x870B, 0xDFE3, 0x8704, 0xDFE4, 0x86F7, 0xDFE5, 0x870C, + 0xDFE6, 0x86FA, 0xDFE7, 0x86D6, 0xDFE8, 0x86F5, 0xDFE9, 0x874D, + 0xDFEA, 0x86F8, 0xDFEB, 0x870E, 0xDFEC, 0x8709, 0xDFED, 0x8701, + 0xDFEE, 0x86F6, 0xDFEF, 0x870D, 0xDFF0, 0x8705, 0xDFF1, 0x88D6, + 0xDFF2, 0x88CB, 0xDFF3, 0x88CD, 0xDFF4, 0x88CE, 0xDFF5, 0x88DE, + 0xDFF6, 0x88DB, 0xDFF7, 0x88DA, 0xDFF8, 0x88CC, 0xDFF9, 0x88D0, + 0xDFFA, 0x8985, 0xDFFB, 0x899B, 0xDFFC, 0x89DF, 0xDFFD, 0x89E5, + 0xDFFE, 0x89E4, 0xE040, 0x89E1, 0xE041, 0x89E0, 0xE042, 0x89E2, + 0xE043, 0x89DC, 0xE044, 0x89E6, 0xE045, 0x8A76, 0xE046, 0x8A86, + 0xE047, 0x8A7F, 0xE048, 0x8A61, 0xE049, 0x8A3F, 0xE04A, 0x8A77, + 0xE04B, 0x8A82, 0xE04C, 0x8A84, 0xE04D, 0x8A75, 0xE04E, 0x8A83, + 0xE04F, 0x8A81, 0xE050, 0x8A74, 0xE051, 0x8A7A, 0xE052, 0x8C3C, + 0xE053, 0x8C4B, 0xE054, 0x8C4A, 0xE055, 0x8C65, 0xE056, 0x8C64, + 0xE057, 0x8C66, 0xE058, 0x8C86, 0xE059, 0x8C84, 0xE05A, 0x8C85, + 0xE05B, 0x8CCC, 0xE05C, 0x8D68, 0xE05D, 0x8D69, 0xE05E, 0x8D91, + 0xE05F, 0x8D8C, 0xE060, 0x8D8E, 0xE061, 0x8D8F, 0xE062, 0x8D8D, + 0xE063, 0x8D93, 0xE064, 0x8D94, 0xE065, 0x8D90, 0xE066, 0x8D92, + 0xE067, 0x8DF0, 0xE068, 0x8DE0, 0xE069, 0x8DEC, 0xE06A, 0x8DF1, + 0xE06B, 0x8DEE, 0xE06C, 0x8DD0, 0xE06D, 0x8DE9, 0xE06E, 0x8DE3, + 0xE06F, 0x8DE2, 0xE070, 0x8DE7, 0xE071, 0x8DF2, 0xE072, 0x8DEB, + 0xE073, 0x8DF4, 0xE074, 0x8F06, 0xE075, 0x8EFF, 0xE076, 0x8F01, + 0xE077, 0x8F00, 0xE078, 0x8F05, 0xE079, 0x8F07, 0xE07A, 0x8F08, + 0xE07B, 0x8F02, 0xE07C, 0x8F0B, 0xE07D, 0x9052, 0xE07E, 0x903F, + 0xE0A1, 0x9044, 0xE0A2, 0x9049, 0xE0A3, 0x903D, 0xE0A4, 0x9110, + 0xE0A5, 0x910D, 0xE0A6, 0x910F, 0xE0A7, 0x9111, 0xE0A8, 0x9116, + 0xE0A9, 0x9114, 0xE0AA, 0x910B, 0xE0AB, 0x910E, 0xE0AC, 0x916E, + 0xE0AD, 0x916F, 0xE0AE, 0x9248, 0xE0AF, 0x9252, 0xE0B0, 0x9230, + 0xE0B1, 0x923A, 0xE0B2, 0x9266, 0xE0B3, 0x9233, 0xE0B4, 0x9265, + 0xE0B5, 0x925E, 0xE0B6, 0x9283, 0xE0B7, 0x922E, 0xE0B8, 0x924A, + 0xE0B9, 0x9246, 0xE0BA, 0x926D, 0xE0BB, 0x926C, 0xE0BC, 0x924F, + 0xE0BD, 0x9260, 0xE0BE, 0x9267, 0xE0BF, 0x926F, 0xE0C0, 0x9236, + 0xE0C1, 0x9261, 0xE0C2, 0x9270, 0xE0C3, 0x9231, 0xE0C4, 0x9254, + 0xE0C5, 0x9263, 0xE0C6, 0x9250, 0xE0C7, 0x9272, 0xE0C8, 0x924E, + 0xE0C9, 0x9253, 0xE0CA, 0x924C, 0xE0CB, 0x9256, 0xE0CC, 0x9232, + 0xE0CD, 0x959F, 0xE0CE, 0x959C, 0xE0CF, 0x959E, 0xE0D0, 0x959B, + 0xE0D1, 0x9692, 0xE0D2, 0x9693, 0xE0D3, 0x9691, 0xE0D4, 0x9697, + 0xE0D5, 0x96CE, 0xE0D6, 0x96FA, 0xE0D7, 0x96FD, 0xE0D8, 0x96F8, + 0xE0D9, 0x96F5, 0xE0DA, 0x9773, 0xE0DB, 0x9777, 0xE0DC, 0x9778, + 0xE0DD, 0x9772, 0xE0DE, 0x980F, 0xE0DF, 0x980D, 0xE0E0, 0x980E, + 0xE0E1, 0x98AC, 0xE0E2, 0x98F6, 0xE0E3, 0x98F9, 0xE0E4, 0x99AF, + 0xE0E5, 0x99B2, 0xE0E6, 0x99B0, 0xE0E7, 0x99B5, 0xE0E8, 0x9AAD, + 0xE0E9, 0x9AAB, 0xE0EA, 0x9B5B, 0xE0EB, 0x9CEA, 0xE0EC, 0x9CED, + 0xE0ED, 0x9CE7, 0xE0EE, 0x9E80, 0xE0EF, 0x9EFD, 0xE0F0, 0x50E6, + 0xE0F1, 0x50D4, 0xE0F2, 0x50D7, 0xE0F3, 0x50E8, 0xE0F4, 0x50F3, + 0xE0F5, 0x50DB, 0xE0F6, 0x50EA, 0xE0F7, 0x50DD, 0xE0F8, 0x50E4, + 0xE0F9, 0x50D3, 0xE0FA, 0x50EC, 0xE0FB, 0x50F0, 0xE0FC, 0x50EF, + 0xE0FD, 0x50E3, 0xE0FE, 0x50E0, 0xE140, 0x51D8, 0xE141, 0x5280, + 0xE142, 0x5281, 0xE143, 0x52E9, 0xE144, 0x52EB, 0xE145, 0x5330, + 0xE146, 0x53AC, 0xE147, 0x5627, 0xE148, 0x5615, 0xE149, 0x560C, + 0xE14A, 0x5612, 0xE14B, 0x55FC, 0xE14C, 0x560F, 0xE14D, 0x561C, + 0xE14E, 0x5601, 0xE14F, 0x5613, 0xE150, 0x5602, 0xE151, 0x55FA, + 0xE152, 0x561D, 0xE153, 0x5604, 0xE154, 0x55FF, 0xE155, 0x55F9, + 0xE156, 0x5889, 0xE157, 0x587C, 0xE158, 0x5890, 0xE159, 0x5898, + 0xE15A, 0x5886, 0xE15B, 0x5881, 0xE15C, 0x587F, 0xE15D, 0x5874, + 0xE15E, 0x588B, 0xE15F, 0x587A, 0xE160, 0x5887, 0xE161, 0x5891, + 0xE162, 0x588E, 0xE163, 0x5876, 0xE164, 0x5882, 0xE165, 0x5888, + 0xE166, 0x587B, 0xE167, 0x5894, 0xE168, 0x588F, 0xE169, 0x58FE, + 0xE16A, 0x596B, 0xE16B, 0x5ADC, 0xE16C, 0x5AEE, 0xE16D, 0x5AE5, + 0xE16E, 0x5AD5, 0xE16F, 0x5AEA, 0xE170, 0x5ADA, 0xE171, 0x5AED, + 0xE172, 0x5AEB, 0xE173, 0x5AF3, 0xE174, 0x5AE2, 0xE175, 0x5AE0, + 0xE176, 0x5ADB, 0xE177, 0x5AEC, 0xE178, 0x5ADE, 0xE179, 0x5ADD, + 0xE17A, 0x5AD9, 0xE17B, 0x5AE8, 0xE17C, 0x5ADF, 0xE17D, 0x5B77, + 0xE17E, 0x5BE0, 0xE1A1, 0x5BE3, 0xE1A2, 0x5C63, 0xE1A3, 0x5D82, + 0xE1A4, 0x5D80, 0xE1A5, 0x5D7D, 0xE1A6, 0x5D86, 0xE1A7, 0x5D7A, + 0xE1A8, 0x5D81, 0xE1A9, 0x5D77, 0xE1AA, 0x5D8A, 0xE1AB, 0x5D89, + 0xE1AC, 0x5D88, 0xE1AD, 0x5D7E, 0xE1AE, 0x5D7C, 0xE1AF, 0x5D8D, + 0xE1B0, 0x5D79, 0xE1B1, 0x5D7F, 0xE1B2, 0x5E58, 0xE1B3, 0x5E59, + 0xE1B4, 0x5E53, 0xE1B5, 0x5ED8, 0xE1B6, 0x5ED1, 0xE1B7, 0x5ED7, + 0xE1B8, 0x5ECE, 0xE1B9, 0x5EDC, 0xE1BA, 0x5ED5, 0xE1BB, 0x5ED9, + 0xE1BC, 0x5ED2, 0xE1BD, 0x5ED4, 0xE1BE, 0x5F44, 0xE1BF, 0x5F43, + 0xE1C0, 0x5F6F, 0xE1C1, 0x5FB6, 0xE1C2, 0x612C, 0xE1C3, 0x6128, + 0xE1C4, 0x6141, 0xE1C5, 0x615E, 0xE1C6, 0x6171, 0xE1C7, 0x6173, + 0xE1C8, 0x6152, 0xE1C9, 0x6153, 0xE1CA, 0x6172, 0xE1CB, 0x616C, + 0xE1CC, 0x6180, 0xE1CD, 0x6174, 0xE1CE, 0x6154, 0xE1CF, 0x617A, + 0xE1D0, 0x615B, 0xE1D1, 0x6165, 0xE1D2, 0x613B, 0xE1D3, 0x616A, + 0xE1D4, 0x6161, 0xE1D5, 0x6156, 0xE1D6, 0x6229, 0xE1D7, 0x6227, + 0xE1D8, 0x622B, 0xE1D9, 0x642B, 0xE1DA, 0x644D, 0xE1DB, 0x645B, + 0xE1DC, 0x645D, 0xE1DD, 0x6474, 0xE1DE, 0x6476, 0xE1DF, 0x6472, + 0xE1E0, 0x6473, 0xE1E1, 0x647D, 0xE1E2, 0x6475, 0xE1E3, 0x6466, + 0xE1E4, 0x64A6, 0xE1E5, 0x644E, 0xE1E6, 0x6482, 0xE1E7, 0x645E, + 0xE1E8, 0x645C, 0xE1E9, 0x644B, 0xE1EA, 0x6453, 0xE1EB, 0x6460, + 0xE1EC, 0x6450, 0xE1ED, 0x647F, 0xE1EE, 0x643F, 0xE1EF, 0x646C, + 0xE1F0, 0x646B, 0xE1F1, 0x6459, 0xE1F2, 0x6465, 0xE1F3, 0x6477, + 0xE1F4, 0x6573, 0xE1F5, 0x65A0, 0xE1F6, 0x66A1, 0xE1F7, 0x66A0, + 0xE1F8, 0x669F, 0xE1F9, 0x6705, 0xE1FA, 0x6704, 0xE1FB, 0x6722, + 0xE1FC, 0x69B1, 0xE1FD, 0x69B6, 0xE1FE, 0x69C9, 0xE240, 0x69A0, + 0xE241, 0x69CE, 0xE242, 0x6996, 0xE243, 0x69B0, 0xE244, 0x69AC, + 0xE245, 0x69BC, 0xE246, 0x6991, 0xE247, 0x6999, 0xE248, 0x698E, + 0xE249, 0x69A7, 0xE24A, 0x698D, 0xE24B, 0x69A9, 0xE24C, 0x69BE, + 0xE24D, 0x69AF, 0xE24E, 0x69BF, 0xE24F, 0x69C4, 0xE250, 0x69BD, + 0xE251, 0x69A4, 0xE252, 0x69D4, 0xE253, 0x69B9, 0xE254, 0x69CA, + 0xE255, 0x699A, 0xE256, 0x69CF, 0xE257, 0x69B3, 0xE258, 0x6993, + 0xE259, 0x69AA, 0xE25A, 0x69A1, 0xE25B, 0x699E, 0xE25C, 0x69D9, + 0xE25D, 0x6997, 0xE25E, 0x6990, 0xE25F, 0x69C2, 0xE260, 0x69B5, + 0xE261, 0x69A5, 0xE262, 0x69C6, 0xE263, 0x6B4A, 0xE264, 0x6B4D, + 0xE265, 0x6B4B, 0xE266, 0x6B9E, 0xE267, 0x6B9F, 0xE268, 0x6BA0, + 0xE269, 0x6BC3, 0xE26A, 0x6BC4, 0xE26B, 0x6BFE, 0xE26C, 0x6ECE, + 0xE26D, 0x6EF5, 0xE26E, 0x6EF1, 0xE26F, 0x6F03, 0xE270, 0x6F25, + 0xE271, 0x6EF8, 0xE272, 0x6F37, 0xE273, 0x6EFB, 0xE274, 0x6F2E, + 0xE275, 0x6F09, 0xE276, 0x6F4E, 0xE277, 0x6F19, 0xE278, 0x6F1A, + 0xE279, 0x6F27, 0xE27A, 0x6F18, 0xE27B, 0x6F3B, 0xE27C, 0x6F12, + 0xE27D, 0x6EED, 0xE27E, 0x6F0A, 0xE2A1, 0x6F36, 0xE2A2, 0x6F73, + 0xE2A3, 0x6EF9, 0xE2A4, 0x6EEE, 0xE2A5, 0x6F2D, 0xE2A6, 0x6F40, + 0xE2A7, 0x6F30, 0xE2A8, 0x6F3C, 0xE2A9, 0x6F35, 0xE2AA, 0x6EEB, + 0xE2AB, 0x6F07, 0xE2AC, 0x6F0E, 0xE2AD, 0x6F43, 0xE2AE, 0x6F05, + 0xE2AF, 0x6EFD, 0xE2B0, 0x6EF6, 0xE2B1, 0x6F39, 0xE2B2, 0x6F1C, + 0xE2B3, 0x6EFC, 0xE2B4, 0x6F3A, 0xE2B5, 0x6F1F, 0xE2B6, 0x6F0D, + 0xE2B7, 0x6F1E, 0xE2B8, 0x6F08, 0xE2B9, 0x6F21, 0xE2BA, 0x7187, + 0xE2BB, 0x7190, 0xE2BC, 0x7189, 0xE2BD, 0x7180, 0xE2BE, 0x7185, + 0xE2BF, 0x7182, 0xE2C0, 0x718F, 0xE2C1, 0x717B, 0xE2C2, 0x7186, + 0xE2C3, 0x7181, 0xE2C4, 0x7197, 0xE2C5, 0x7244, 0xE2C6, 0x7253, + 0xE2C7, 0x7297, 0xE2C8, 0x7295, 0xE2C9, 0x7293, 0xE2CA, 0x7343, + 0xE2CB, 0x734D, 0xE2CC, 0x7351, 0xE2CD, 0x734C, 0xE2CE, 0x7462, + 0xE2CF, 0x7473, 0xE2D0, 0x7471, 0xE2D1, 0x7475, 0xE2D2, 0x7472, + 0xE2D3, 0x7467, 0xE2D4, 0x746E, 0xE2D5, 0x7500, 0xE2D6, 0x7502, + 0xE2D7, 0x7503, 0xE2D8, 0x757D, 0xE2D9, 0x7590, 0xE2DA, 0x7616, + 0xE2DB, 0x7608, 0xE2DC, 0x760C, 0xE2DD, 0x7615, 0xE2DE, 0x7611, + 0xE2DF, 0x760A, 0xE2E0, 0x7614, 0xE2E1, 0x76B8, 0xE2E2, 0x7781, + 0xE2E3, 0x777C, 0xE2E4, 0x7785, 0xE2E5, 0x7782, 0xE2E6, 0x776E, + 0xE2E7, 0x7780, 0xE2E8, 0x776F, 0xE2E9, 0x777E, 0xE2EA, 0x7783, + 0xE2EB, 0x78B2, 0xE2EC, 0x78AA, 0xE2ED, 0x78B4, 0xE2EE, 0x78AD, + 0xE2EF, 0x78A8, 0xE2F0, 0x787E, 0xE2F1, 0x78AB, 0xE2F2, 0x789E, + 0xE2F3, 0x78A5, 0xE2F4, 0x78A0, 0xE2F5, 0x78AC, 0xE2F6, 0x78A2, + 0xE2F7, 0x78A4, 0xE2F8, 0x7998, 0xE2F9, 0x798A, 0xE2FA, 0x798B, + 0xE2FB, 0x7996, 0xE2FC, 0x7995, 0xE2FD, 0x7994, 0xE2FE, 0x7993, + 0xE340, 0x7997, 0xE341, 0x7988, 0xE342, 0x7992, 0xE343, 0x7990, + 0xE344, 0x7A2B, 0xE345, 0x7A4A, 0xE346, 0x7A30, 0xE347, 0x7A2F, + 0xE348, 0x7A28, 0xE349, 0x7A26, 0xE34A, 0x7AA8, 0xE34B, 0x7AAB, + 0xE34C, 0x7AAC, 0xE34D, 0x7AEE, 0xE34E, 0x7B88, 0xE34F, 0x7B9C, + 0xE350, 0x7B8A, 0xE351, 0x7B91, 0xE352, 0x7B90, 0xE353, 0x7B96, + 0xE354, 0x7B8D, 0xE355, 0x7B8C, 0xE356, 0x7B9B, 0xE357, 0x7B8E, + 0xE358, 0x7B85, 0xE359, 0x7B98, 0xE35A, 0x5284, 0xE35B, 0x7B99, + 0xE35C, 0x7BA4, 0xE35D, 0x7B82, 0xE35E, 0x7CBB, 0xE35F, 0x7CBF, + 0xE360, 0x7CBC, 0xE361, 0x7CBA, 0xE362, 0x7DA7, 0xE363, 0x7DB7, + 0xE364, 0x7DC2, 0xE365, 0x7DA3, 0xE366, 0x7DAA, 0xE367, 0x7DC1, + 0xE368, 0x7DC0, 0xE369, 0x7DC5, 0xE36A, 0x7D9D, 0xE36B, 0x7DCE, + 0xE36C, 0x7DC4, 0xE36D, 0x7DC6, 0xE36E, 0x7DCB, 0xE36F, 0x7DCC, + 0xE370, 0x7DAF, 0xE371, 0x7DB9, 0xE372, 0x7D96, 0xE373, 0x7DBC, + 0xE374, 0x7D9F, 0xE375, 0x7DA6, 0xE376, 0x7DAE, 0xE377, 0x7DA9, + 0xE378, 0x7DA1, 0xE379, 0x7DC9, 0xE37A, 0x7F73, 0xE37B, 0x7FE2, + 0xE37C, 0x7FE3, 0xE37D, 0x7FE5, 0xE37E, 0x7FDE, 0xE3A1, 0x8024, + 0xE3A2, 0x805D, 0xE3A3, 0x805C, 0xE3A4, 0x8189, 0xE3A5, 0x8186, + 0xE3A6, 0x8183, 0xE3A7, 0x8187, 0xE3A8, 0x818D, 0xE3A9, 0x818C, + 0xE3AA, 0x818B, 0xE3AB, 0x8215, 0xE3AC, 0x8497, 0xE3AD, 0x84A4, + 0xE3AE, 0x84A1, 0xE3AF, 0x849F, 0xE3B0, 0x84BA, 0xE3B1, 0x84CE, + 0xE3B2, 0x84C2, 0xE3B3, 0x84AC, 0xE3B4, 0x84AE, 0xE3B5, 0x84AB, + 0xE3B6, 0x84B9, 0xE3B7, 0x84B4, 0xE3B8, 0x84C1, 0xE3B9, 0x84CD, + 0xE3BA, 0x84AA, 0xE3BB, 0x849A, 0xE3BC, 0x84B1, 0xE3BD, 0x84D0, + 0xE3BE, 0x849D, 0xE3BF, 0x84A7, 0xE3C0, 0x84BB, 0xE3C1, 0x84A2, + 0xE3C2, 0x8494, 0xE3C3, 0x84C7, 0xE3C4, 0x84CC, 0xE3C5, 0x849B, + 0xE3C6, 0x84A9, 0xE3C7, 0x84AF, 0xE3C8, 0x84A8, 0xE3C9, 0x84D6, + 0xE3CA, 0x8498, 0xE3CB, 0x84B6, 0xE3CC, 0x84CF, 0xE3CD, 0x84A0, + 0xE3CE, 0x84D7, 0xE3CF, 0x84D4, 0xE3D0, 0x84D2, 0xE3D1, 0x84DB, + 0xE3D2, 0x84B0, 0xE3D3, 0x8491, 0xE3D4, 0x8661, 0xE3D5, 0x8733, + 0xE3D6, 0x8723, 0xE3D7, 0x8728, 0xE3D8, 0x876B, 0xE3D9, 0x8740, + 0xE3DA, 0x872E, 0xE3DB, 0x871E, 0xE3DC, 0x8721, 0xE3DD, 0x8719, + 0xE3DE, 0x871B, 0xE3DF, 0x8743, 0xE3E0, 0x872C, 0xE3E1, 0x8741, + 0xE3E2, 0x873E, 0xE3E3, 0x8746, 0xE3E4, 0x8720, 0xE3E5, 0x8732, + 0xE3E6, 0x872A, 0xE3E7, 0x872D, 0xE3E8, 0x873C, 0xE3E9, 0x8712, + 0xE3EA, 0x873A, 0xE3EB, 0x8731, 0xE3EC, 0x8735, 0xE3ED, 0x8742, + 0xE3EE, 0x8726, 0xE3EF, 0x8727, 0xE3F0, 0x8738, 0xE3F1, 0x8724, + 0xE3F2, 0x871A, 0xE3F3, 0x8730, 0xE3F4, 0x8711, 0xE3F5, 0x88F7, + 0xE3F6, 0x88E7, 0xE3F7, 0x88F1, 0xE3F8, 0x88F2, 0xE3F9, 0x88FA, + 0xE3FA, 0x88FE, 0xE3FB, 0x88EE, 0xE3FC, 0x88FC, 0xE3FD, 0x88F6, + 0xE3FE, 0x88FB, 0xE440, 0x88F0, 0xE441, 0x88EC, 0xE442, 0x88EB, + 0xE443, 0x899D, 0xE444, 0x89A1, 0xE445, 0x899F, 0xE446, 0x899E, + 0xE447, 0x89E9, 0xE448, 0x89EB, 0xE449, 0x89E8, 0xE44A, 0x8AAB, + 0xE44B, 0x8A99, 0xE44C, 0x8A8B, 0xE44D, 0x8A92, 0xE44E, 0x8A8F, + 0xE44F, 0x8A96, 0xE450, 0x8C3D, 0xE451, 0x8C68, 0xE452, 0x8C69, + 0xE453, 0x8CD5, 0xE454, 0x8CCF, 0xE455, 0x8CD7, 0xE456, 0x8D96, + 0xE457, 0x8E09, 0xE458, 0x8E02, 0xE459, 0x8DFF, 0xE45A, 0x8E0D, + 0xE45B, 0x8DFD, 0xE45C, 0x8E0A, 0xE45D, 0x8E03, 0xE45E, 0x8E07, + 0xE45F, 0x8E06, 0xE460, 0x8E05, 0xE461, 0x8DFE, 0xE462, 0x8E00, + 0xE463, 0x8E04, 0xE464, 0x8F10, 0xE465, 0x8F11, 0xE466, 0x8F0E, + 0xE467, 0x8F0D, 0xE468, 0x9123, 0xE469, 0x911C, 0xE46A, 0x9120, + 0xE46B, 0x9122, 0xE46C, 0x911F, 0xE46D, 0x911D, 0xE46E, 0x911A, + 0xE46F, 0x9124, 0xE470, 0x9121, 0xE471, 0x911B, 0xE472, 0x917A, + 0xE473, 0x9172, 0xE474, 0x9179, 0xE475, 0x9173, 0xE476, 0x92A5, + 0xE477, 0x92A4, 0xE478, 0x9276, 0xE479, 0x929B, 0xE47A, 0x927A, + 0xE47B, 0x92A0, 0xE47C, 0x9294, 0xE47D, 0x92AA, 0xE47E, 0x928D, + 0xE4A1, 0x92A6, 0xE4A2, 0x929A, 0xE4A3, 0x92AB, 0xE4A4, 0x9279, + 0xE4A5, 0x9297, 0xE4A6, 0x927F, 0xE4A7, 0x92A3, 0xE4A8, 0x92EE, + 0xE4A9, 0x928E, 0xE4AA, 0x9282, 0xE4AB, 0x9295, 0xE4AC, 0x92A2, + 0xE4AD, 0x927D, 0xE4AE, 0x9288, 0xE4AF, 0x92A1, 0xE4B0, 0x928A, + 0xE4B1, 0x9286, 0xE4B2, 0x928C, 0xE4B3, 0x9299, 0xE4B4, 0x92A7, + 0xE4B5, 0x927E, 0xE4B6, 0x9287, 0xE4B7, 0x92A9, 0xE4B8, 0x929D, + 0xE4B9, 0x928B, 0xE4BA, 0x922D, 0xE4BB, 0x969E, 0xE4BC, 0x96A1, + 0xE4BD, 0x96FF, 0xE4BE, 0x9758, 0xE4BF, 0x977D, 0xE4C0, 0x977A, + 0xE4C1, 0x977E, 0xE4C2, 0x9783, 0xE4C3, 0x9780, 0xE4C4, 0x9782, + 0xE4C5, 0x977B, 0xE4C6, 0x9784, 0xE4C7, 0x9781, 0xE4C8, 0x977F, + 0xE4C9, 0x97CE, 0xE4CA, 0x97CD, 0xE4CB, 0x9816, 0xE4CC, 0x98AD, + 0xE4CD, 0x98AE, 0xE4CE, 0x9902, 0xE4CF, 0x9900, 0xE4D0, 0x9907, + 0xE4D1, 0x999D, 0xE4D2, 0x999C, 0xE4D3, 0x99C3, 0xE4D4, 0x99B9, + 0xE4D5, 0x99BB, 0xE4D6, 0x99BA, 0xE4D7, 0x99C2, 0xE4D8, 0x99BD, + 0xE4D9, 0x99C7, 0xE4DA, 0x9AB1, 0xE4DB, 0x9AE3, 0xE4DC, 0x9AE7, + 0xE4DD, 0x9B3E, 0xE4DE, 0x9B3F, 0xE4DF, 0x9B60, 0xE4E0, 0x9B61, + 0xE4E1, 0x9B5F, 0xE4E2, 0x9CF1, 0xE4E3, 0x9CF2, 0xE4E4, 0x9CF5, + 0xE4E5, 0x9EA7, 0xE4E6, 0x50FF, 0xE4E7, 0x5103, 0xE4E8, 0x5130, + 0xE4E9, 0x50F8, 0xE4EA, 0x5106, 0xE4EB, 0x5107, 0xE4EC, 0x50F6, + 0xE4ED, 0x50FE, 0xE4EE, 0x510B, 0xE4EF, 0x510C, 0xE4F0, 0x50FD, + 0xE4F1, 0x510A, 0xE4F2, 0x528B, 0xE4F3, 0x528C, 0xE4F4, 0x52F1, + 0xE4F5, 0x52EF, 0xE4F6, 0x5648, 0xE4F7, 0x5642, 0xE4F8, 0x564C, + 0xE4F9, 0x5635, 0xE4FA, 0x5641, 0xE4FB, 0x564A, 0xE4FC, 0x5649, + 0xE4FD, 0x5646, 0xE4FE, 0x5658, 0xE540, 0x565A, 0xE541, 0x5640, + 0xE542, 0x5633, 0xE543, 0x563D, 0xE544, 0x562C, 0xE545, 0x563E, + 0xE546, 0x5638, 0xE547, 0x562A, 0xE548, 0x563A, 0xE549, 0x571A, + 0xE54A, 0x58AB, 0xE54B, 0x589D, 0xE54C, 0x58B1, 0xE54D, 0x58A0, + 0xE54E, 0x58A3, 0xE54F, 0x58AF, 0xE550, 0x58AC, 0xE551, 0x58A5, + 0xE552, 0x58A1, 0xE553, 0x58FF, 0xE554, 0x5AFF, 0xE555, 0x5AF4, + 0xE556, 0x5AFD, 0xE557, 0x5AF7, 0xE558, 0x5AF6, 0xE559, 0x5B03, + 0xE55A, 0x5AF8, 0xE55B, 0x5B02, 0xE55C, 0x5AF9, 0xE55D, 0x5B01, + 0xE55E, 0x5B07, 0xE55F, 0x5B05, 0xE560, 0x5B0F, 0xE561, 0x5C67, + 0xE562, 0x5D99, 0xE563, 0x5D97, 0xE564, 0x5D9F, 0xE565, 0x5D92, + 0xE566, 0x5DA2, 0xE567, 0x5D93, 0xE568, 0x5D95, 0xE569, 0x5DA0, + 0xE56A, 0x5D9C, 0xE56B, 0x5DA1, 0xE56C, 0x5D9A, 0xE56D, 0x5D9E, + 0xE56E, 0x5E69, 0xE56F, 0x5E5D, 0xE570, 0x5E60, 0xE571, 0x5E5C, + 0xE572, 0x7DF3, 0xE573, 0x5EDB, 0xE574, 0x5EDE, 0xE575, 0x5EE1, + 0xE576, 0x5F49, 0xE577, 0x5FB2, 0xE578, 0x618B, 0xE579, 0x6183, + 0xE57A, 0x6179, 0xE57B, 0x61B1, 0xE57C, 0x61B0, 0xE57D, 0x61A2, + 0xE57E, 0x6189, 0xE5A1, 0x619B, 0xE5A2, 0x6193, 0xE5A3, 0x61AF, + 0xE5A4, 0x61AD, 0xE5A5, 0x619F, 0xE5A6, 0x6192, 0xE5A7, 0x61AA, + 0xE5A8, 0x61A1, 0xE5A9, 0x618D, 0xE5AA, 0x6166, 0xE5AB, 0x61B3, + 0xE5AC, 0x622D, 0xE5AD, 0x646E, 0xE5AE, 0x6470, 0xE5AF, 0x6496, + 0xE5B0, 0x64A0, 0xE5B1, 0x6485, 0xE5B2, 0x6497, 0xE5B3, 0x649C, + 0xE5B4, 0x648F, 0xE5B5, 0x648B, 0xE5B6, 0x648A, 0xE5B7, 0x648C, + 0xE5B8, 0x64A3, 0xE5B9, 0x649F, 0xE5BA, 0x6468, 0xE5BB, 0x64B1, + 0xE5BC, 0x6498, 0xE5BD, 0x6576, 0xE5BE, 0x657A, 0xE5BF, 0x6579, + 0xE5C0, 0x657B, 0xE5C1, 0x65B2, 0xE5C2, 0x65B3, 0xE5C3, 0x66B5, + 0xE5C4, 0x66B0, 0xE5C5, 0x66A9, 0xE5C6, 0x66B2, 0xE5C7, 0x66B7, + 0xE5C8, 0x66AA, 0xE5C9, 0x66AF, 0xE5CA, 0x6A00, 0xE5CB, 0x6A06, + 0xE5CC, 0x6A17, 0xE5CD, 0x69E5, 0xE5CE, 0x69F8, 0xE5CF, 0x6A15, + 0xE5D0, 0x69F1, 0xE5D1, 0x69E4, 0xE5D2, 0x6A20, 0xE5D3, 0x69FF, + 0xE5D4, 0x69EC, 0xE5D5, 0x69E2, 0xE5D6, 0x6A1B, 0xE5D7, 0x6A1D, + 0xE5D8, 0x69FE, 0xE5D9, 0x6A27, 0xE5DA, 0x69F2, 0xE5DB, 0x69EE, + 0xE5DC, 0x6A14, 0xE5DD, 0x69F7, 0xE5DE, 0x69E7, 0xE5DF, 0x6A40, + 0xE5E0, 0x6A08, 0xE5E1, 0x69E6, 0xE5E2, 0x69FB, 0xE5E3, 0x6A0D, + 0xE5E4, 0x69FC, 0xE5E5, 0x69EB, 0xE5E6, 0x6A09, 0xE5E7, 0x6A04, + 0xE5E8, 0x6A18, 0xE5E9, 0x6A25, 0xE5EA, 0x6A0F, 0xE5EB, 0x69F6, + 0xE5EC, 0x6A26, 0xE5ED, 0x6A07, 0xE5EE, 0x69F4, 0xE5EF, 0x6A16, + 0xE5F0, 0x6B51, 0xE5F1, 0x6BA5, 0xE5F2, 0x6BA3, 0xE5F3, 0x6BA2, + 0xE5F4, 0x6BA6, 0xE5F5, 0x6C01, 0xE5F6, 0x6C00, 0xE5F7, 0x6BFF, + 0xE5F8, 0x6C02, 0xE5F9, 0x6F41, 0xE5FA, 0x6F26, 0xE5FB, 0x6F7E, + 0xE5FC, 0x6F87, 0xE5FD, 0x6FC6, 0xE5FE, 0x6F92, 0xE640, 0x6F8D, + 0xE641, 0x6F89, 0xE642, 0x6F8C, 0xE643, 0x6F62, 0xE644, 0x6F4F, + 0xE645, 0x6F85, 0xE646, 0x6F5A, 0xE647, 0x6F96, 0xE648, 0x6F76, + 0xE649, 0x6F6C, 0xE64A, 0x6F82, 0xE64B, 0x6F55, 0xE64C, 0x6F72, + 0xE64D, 0x6F52, 0xE64E, 0x6F50, 0xE64F, 0x6F57, 0xE650, 0x6F94, + 0xE651, 0x6F93, 0xE652, 0x6F5D, 0xE653, 0x6F00, 0xE654, 0x6F61, + 0xE655, 0x6F6B, 0xE656, 0x6F7D, 0xE657, 0x6F67, 0xE658, 0x6F90, + 0xE659, 0x6F53, 0xE65A, 0x6F8B, 0xE65B, 0x6F69, 0xE65C, 0x6F7F, + 0xE65D, 0x6F95, 0xE65E, 0x6F63, 0xE65F, 0x6F77, 0xE660, 0x6F6A, + 0xE661, 0x6F7B, 0xE662, 0x71B2, 0xE663, 0x71AF, 0xE664, 0x719B, + 0xE665, 0x71B0, 0xE666, 0x71A0, 0xE667, 0x719A, 0xE668, 0x71A9, + 0xE669, 0x71B5, 0xE66A, 0x719D, 0xE66B, 0x71A5, 0xE66C, 0x719E, + 0xE66D, 0x71A4, 0xE66E, 0x71A1, 0xE66F, 0x71AA, 0xE670, 0x719C, + 0xE671, 0x71A7, 0xE672, 0x71B3, 0xE673, 0x7298, 0xE674, 0x729A, + 0xE675, 0x7358, 0xE676, 0x7352, 0xE677, 0x735E, 0xE678, 0x735F, + 0xE679, 0x7360, 0xE67A, 0x735D, 0xE67B, 0x735B, 0xE67C, 0x7361, + 0xE67D, 0x735A, 0xE67E, 0x7359, 0xE6A1, 0x7362, 0xE6A2, 0x7487, + 0xE6A3, 0x7489, 0xE6A4, 0x748A, 0xE6A5, 0x7486, 0xE6A6, 0x7481, + 0xE6A7, 0x747D, 0xE6A8, 0x7485, 0xE6A9, 0x7488, 0xE6AA, 0x747C, + 0xE6AB, 0x7479, 0xE6AC, 0x7508, 0xE6AD, 0x7507, 0xE6AE, 0x757E, + 0xE6AF, 0x7625, 0xE6B0, 0x761E, 0xE6B1, 0x7619, 0xE6B2, 0x761D, + 0xE6B3, 0x761C, 0xE6B4, 0x7623, 0xE6B5, 0x761A, 0xE6B6, 0x7628, + 0xE6B7, 0x761B, 0xE6B8, 0x769C, 0xE6B9, 0x769D, 0xE6BA, 0x769E, + 0xE6BB, 0x769B, 0xE6BC, 0x778D, 0xE6BD, 0x778F, 0xE6BE, 0x7789, + 0xE6BF, 0x7788, 0xE6C0, 0x78CD, 0xE6C1, 0x78BB, 0xE6C2, 0x78CF, + 0xE6C3, 0x78CC, 0xE6C4, 0x78D1, 0xE6C5, 0x78CE, 0xE6C6, 0x78D4, + 0xE6C7, 0x78C8, 0xE6C8, 0x78C3, 0xE6C9, 0x78C4, 0xE6CA, 0x78C9, + 0xE6CB, 0x799A, 0xE6CC, 0x79A1, 0xE6CD, 0x79A0, 0xE6CE, 0x799C, + 0xE6CF, 0x79A2, 0xE6D0, 0x799B, 0xE6D1, 0x6B76, 0xE6D2, 0x7A39, + 0xE6D3, 0x7AB2, 0xE6D4, 0x7AB4, 0xE6D5, 0x7AB3, 0xE6D6, 0x7BB7, + 0xE6D7, 0x7BCB, 0xE6D8, 0x7BBE, 0xE6D9, 0x7BAC, 0xE6DA, 0x7BCE, + 0xE6DB, 0x7BAF, 0xE6DC, 0x7BB9, 0xE6DD, 0x7BCA, 0xE6DE, 0x7BB5, + 0xE6DF, 0x7CC5, 0xE6E0, 0x7CC8, 0xE6E1, 0x7CCC, 0xE6E2, 0x7CCB, + 0xE6E3, 0x7DF7, 0xE6E4, 0x7DDB, 0xE6E5, 0x7DEA, 0xE6E6, 0x7DE7, + 0xE6E7, 0x7DD7, 0xE6E8, 0x7DE1, 0xE6E9, 0x7E03, 0xE6EA, 0x7DFA, + 0xE6EB, 0x7DE6, 0xE6EC, 0x7DF6, 0xE6ED, 0x7DF1, 0xE6EE, 0x7DF0, + 0xE6EF, 0x7DEE, 0xE6F0, 0x7DDF, 0xE6F1, 0x7F76, 0xE6F2, 0x7FAC, + 0xE6F3, 0x7FB0, 0xE6F4, 0x7FAD, 0xE6F5, 0x7FED, 0xE6F6, 0x7FEB, + 0xE6F7, 0x7FEA, 0xE6F8, 0x7FEC, 0xE6F9, 0x7FE6, 0xE6FA, 0x7FE8, + 0xE6FB, 0x8064, 0xE6FC, 0x8067, 0xE6FD, 0x81A3, 0xE6FE, 0x819F, + 0xE740, 0x819E, 0xE741, 0x8195, 0xE742, 0x81A2, 0xE743, 0x8199, + 0xE744, 0x8197, 0xE745, 0x8216, 0xE746, 0x824F, 0xE747, 0x8253, + 0xE748, 0x8252, 0xE749, 0x8250, 0xE74A, 0x824E, 0xE74B, 0x8251, + 0xE74C, 0x8524, 0xE74D, 0x853B, 0xE74E, 0x850F, 0xE74F, 0x8500, + 0xE750, 0x8529, 0xE751, 0x850E, 0xE752, 0x8509, 0xE753, 0x850D, + 0xE754, 0x851F, 0xE755, 0x850A, 0xE756, 0x8527, 0xE757, 0x851C, + 0xE758, 0x84FB, 0xE759, 0x852B, 0xE75A, 0x84FA, 0xE75B, 0x8508, + 0xE75C, 0x850C, 0xE75D, 0x84F4, 0xE75E, 0x852A, 0xE75F, 0x84F2, + 0xE760, 0x8515, 0xE761, 0x84F7, 0xE762, 0x84EB, 0xE763, 0x84F3, + 0xE764, 0x84FC, 0xE765, 0x8512, 0xE766, 0x84EA, 0xE767, 0x84E9, + 0xE768, 0x8516, 0xE769, 0x84FE, 0xE76A, 0x8528, 0xE76B, 0x851D, + 0xE76C, 0x852E, 0xE76D, 0x8502, 0xE76E, 0x84FD, 0xE76F, 0x851E, + 0xE770, 0x84F6, 0xE771, 0x8531, 0xE772, 0x8526, 0xE773, 0x84E7, + 0xE774, 0x84E8, 0xE775, 0x84F0, 0xE776, 0x84EF, 0xE777, 0x84F9, + 0xE778, 0x8518, 0xE779, 0x8520, 0xE77A, 0x8530, 0xE77B, 0x850B, + 0xE77C, 0x8519, 0xE77D, 0x852F, 0xE77E, 0x8662, 0xE7A1, 0x8756, + 0xE7A2, 0x8763, 0xE7A3, 0x8764, 0xE7A4, 0x8777, 0xE7A5, 0x87E1, + 0xE7A6, 0x8773, 0xE7A7, 0x8758, 0xE7A8, 0x8754, 0xE7A9, 0x875B, + 0xE7AA, 0x8752, 0xE7AB, 0x8761, 0xE7AC, 0x875A, 0xE7AD, 0x8751, + 0xE7AE, 0x875E, 0xE7AF, 0x876D, 0xE7B0, 0x876A, 0xE7B1, 0x8750, + 0xE7B2, 0x874E, 0xE7B3, 0x875F, 0xE7B4, 0x875D, 0xE7B5, 0x876F, + 0xE7B6, 0x876C, 0xE7B7, 0x877A, 0xE7B8, 0x876E, 0xE7B9, 0x875C, + 0xE7BA, 0x8765, 0xE7BB, 0x874F, 0xE7BC, 0x877B, 0xE7BD, 0x8775, + 0xE7BE, 0x8762, 0xE7BF, 0x8767, 0xE7C0, 0x8769, 0xE7C1, 0x885A, + 0xE7C2, 0x8905, 0xE7C3, 0x890C, 0xE7C4, 0x8914, 0xE7C5, 0x890B, + 0xE7C6, 0x8917, 0xE7C7, 0x8918, 0xE7C8, 0x8919, 0xE7C9, 0x8906, + 0xE7CA, 0x8916, 0xE7CB, 0x8911, 0xE7CC, 0x890E, 0xE7CD, 0x8909, + 0xE7CE, 0x89A2, 0xE7CF, 0x89A4, 0xE7D0, 0x89A3, 0xE7D1, 0x89ED, + 0xE7D2, 0x89F0, 0xE7D3, 0x89EC, 0xE7D4, 0x8ACF, 0xE7D5, 0x8AC6, + 0xE7D6, 0x8AB8, 0xE7D7, 0x8AD3, 0xE7D8, 0x8AD1, 0xE7D9, 0x8AD4, + 0xE7DA, 0x8AD5, 0xE7DB, 0x8ABB, 0xE7DC, 0x8AD7, 0xE7DD, 0x8ABE, + 0xE7DE, 0x8AC0, 0xE7DF, 0x8AC5, 0xE7E0, 0x8AD8, 0xE7E1, 0x8AC3, + 0xE7E2, 0x8ABA, 0xE7E3, 0x8ABD, 0xE7E4, 0x8AD9, 0xE7E5, 0x8C3E, + 0xE7E6, 0x8C4D, 0xE7E7, 0x8C8F, 0xE7E8, 0x8CE5, 0xE7E9, 0x8CDF, + 0xE7EA, 0x8CD9, 0xE7EB, 0x8CE8, 0xE7EC, 0x8CDA, 0xE7ED, 0x8CDD, + 0xE7EE, 0x8CE7, 0xE7EF, 0x8DA0, 0xE7F0, 0x8D9C, 0xE7F1, 0x8DA1, + 0xE7F2, 0x8D9B, 0xE7F3, 0x8E20, 0xE7F4, 0x8E23, 0xE7F5, 0x8E25, + 0xE7F6, 0x8E24, 0xE7F7, 0x8E2E, 0xE7F8, 0x8E15, 0xE7F9, 0x8E1B, + 0xE7FA, 0x8E16, 0xE7FB, 0x8E11, 0xE7FC, 0x8E19, 0xE7FD, 0x8E26, + 0xE7FE, 0x8E27, 0xE840, 0x8E14, 0xE841, 0x8E12, 0xE842, 0x8E18, + 0xE843, 0x8E13, 0xE844, 0x8E1C, 0xE845, 0x8E17, 0xE846, 0x8E1A, + 0xE847, 0x8F2C, 0xE848, 0x8F24, 0xE849, 0x8F18, 0xE84A, 0x8F1A, + 0xE84B, 0x8F20, 0xE84C, 0x8F23, 0xE84D, 0x8F16, 0xE84E, 0x8F17, + 0xE84F, 0x9073, 0xE850, 0x9070, 0xE851, 0x906F, 0xE852, 0x9067, + 0xE853, 0x906B, 0xE854, 0x912F, 0xE855, 0x912B, 0xE856, 0x9129, + 0xE857, 0x912A, 0xE858, 0x9132, 0xE859, 0x9126, 0xE85A, 0x912E, + 0xE85B, 0x9185, 0xE85C, 0x9186, 0xE85D, 0x918A, 0xE85E, 0x9181, + 0xE85F, 0x9182, 0xE860, 0x9184, 0xE861, 0x9180, 0xE862, 0x92D0, + 0xE863, 0x92C3, 0xE864, 0x92C4, 0xE865, 0x92C0, 0xE866, 0x92D9, + 0xE867, 0x92B6, 0xE868, 0x92CF, 0xE869, 0x92F1, 0xE86A, 0x92DF, + 0xE86B, 0x92D8, 0xE86C, 0x92E9, 0xE86D, 0x92D7, 0xE86E, 0x92DD, + 0xE86F, 0x92CC, 0xE870, 0x92EF, 0xE871, 0x92C2, 0xE872, 0x92E8, + 0xE873, 0x92CA, 0xE874, 0x92C8, 0xE875, 0x92CE, 0xE876, 0x92E6, + 0xE877, 0x92CD, 0xE878, 0x92D5, 0xE879, 0x92C9, 0xE87A, 0x92E0, + 0xE87B, 0x92DE, 0xE87C, 0x92E7, 0xE87D, 0x92D1, 0xE87E, 0x92D3, + 0xE8A1, 0x92B5, 0xE8A2, 0x92E1, 0xE8A3, 0x92C6, 0xE8A4, 0x92B4, + 0xE8A5, 0x957C, 0xE8A6, 0x95AC, 0xE8A7, 0x95AB, 0xE8A8, 0x95AE, + 0xE8A9, 0x95B0, 0xE8AA, 0x96A4, 0xE8AB, 0x96A2, 0xE8AC, 0x96D3, + 0xE8AD, 0x9705, 0xE8AE, 0x9708, 0xE8AF, 0x9702, 0xE8B0, 0x975A, + 0xE8B1, 0x978A, 0xE8B2, 0x978E, 0xE8B3, 0x9788, 0xE8B4, 0x97D0, + 0xE8B5, 0x97CF, 0xE8B6, 0x981E, 0xE8B7, 0x981D, 0xE8B8, 0x9826, + 0xE8B9, 0x9829, 0xE8BA, 0x9828, 0xE8BB, 0x9820, 0xE8BC, 0x981B, + 0xE8BD, 0x9827, 0xE8BE, 0x98B2, 0xE8BF, 0x9908, 0xE8C0, 0x98FA, + 0xE8C1, 0x9911, 0xE8C2, 0x9914, 0xE8C3, 0x9916, 0xE8C4, 0x9917, + 0xE8C5, 0x9915, 0xE8C6, 0x99DC, 0xE8C7, 0x99CD, 0xE8C8, 0x99CF, + 0xE8C9, 0x99D3, 0xE8CA, 0x99D4, 0xE8CB, 0x99CE, 0xE8CC, 0x99C9, + 0xE8CD, 0x99D6, 0xE8CE, 0x99D8, 0xE8CF, 0x99CB, 0xE8D0, 0x99D7, + 0xE8D1, 0x99CC, 0xE8D2, 0x9AB3, 0xE8D3, 0x9AEC, 0xE8D4, 0x9AEB, + 0xE8D5, 0x9AF3, 0xE8D6, 0x9AF2, 0xE8D7, 0x9AF1, 0xE8D8, 0x9B46, + 0xE8D9, 0x9B43, 0xE8DA, 0x9B67, 0xE8DB, 0x9B74, 0xE8DC, 0x9B71, + 0xE8DD, 0x9B66, 0xE8DE, 0x9B76, 0xE8DF, 0x9B75, 0xE8E0, 0x9B70, + 0xE8E1, 0x9B68, 0xE8E2, 0x9B64, 0xE8E3, 0x9B6C, 0xE8E4, 0x9CFC, + 0xE8E5, 0x9CFA, 0xE8E6, 0x9CFD, 0xE8E7, 0x9CFF, 0xE8E8, 0x9CF7, + 0xE8E9, 0x9D07, 0xE8EA, 0x9D00, 0xE8EB, 0x9CF9, 0xE8EC, 0x9CFB, + 0xE8ED, 0x9D08, 0xE8EE, 0x9D05, 0xE8EF, 0x9D04, 0xE8F0, 0x9E83, + 0xE8F1, 0x9ED3, 0xE8F2, 0x9F0F, 0xE8F3, 0x9F10, 0xE8F4, 0x511C, + 0xE8F5, 0x5113, 0xE8F6, 0x5117, 0xE8F7, 0x511A, 0xE8F8, 0x5111, + 0xE8F9, 0x51DE, 0xE8FA, 0x5334, 0xE8FB, 0x53E1, 0xE8FC, 0x5670, + 0xE8FD, 0x5660, 0xE8FE, 0x566E, 0xE940, 0x5673, 0xE941, 0x5666, + 0xE942, 0x5663, 0xE943, 0x566D, 0xE944, 0x5672, 0xE945, 0x565E, + 0xE946, 0x5677, 0xE947, 0x571C, 0xE948, 0x571B, 0xE949, 0x58C8, + 0xE94A, 0x58BD, 0xE94B, 0x58C9, 0xE94C, 0x58BF, 0xE94D, 0x58BA, + 0xE94E, 0x58C2, 0xE94F, 0x58BC, 0xE950, 0x58C6, 0xE951, 0x5B17, + 0xE952, 0x5B19, 0xE953, 0x5B1B, 0xE954, 0x5B21, 0xE955, 0x5B14, + 0xE956, 0x5B13, 0xE957, 0x5B10, 0xE958, 0x5B16, 0xE959, 0x5B28, + 0xE95A, 0x5B1A, 0xE95B, 0x5B20, 0xE95C, 0x5B1E, 0xE95D, 0x5BEF, + 0xE95E, 0x5DAC, 0xE95F, 0x5DB1, 0xE960, 0x5DA9, 0xE961, 0x5DA7, + 0xE962, 0x5DB5, 0xE963, 0x5DB0, 0xE964, 0x5DAE, 0xE965, 0x5DAA, + 0xE966, 0x5DA8, 0xE967, 0x5DB2, 0xE968, 0x5DAD, 0xE969, 0x5DAF, + 0xE96A, 0x5DB4, 0xE96B, 0x5E67, 0xE96C, 0x5E68, 0xE96D, 0x5E66, + 0xE96E, 0x5E6F, 0xE96F, 0x5EE9, 0xE970, 0x5EE7, 0xE971, 0x5EE6, + 0xE972, 0x5EE8, 0xE973, 0x5EE5, 0xE974, 0x5F4B, 0xE975, 0x5FBC, + 0xE976, 0x619D, 0xE977, 0x61A8, 0xE978, 0x6196, 0xE979, 0x61C5, + 0xE97A, 0x61B4, 0xE97B, 0x61C6, 0xE97C, 0x61C1, 0xE97D, 0x61CC, + 0xE97E, 0x61BA, 0xE9A1, 0x61BF, 0xE9A2, 0x61B8, 0xE9A3, 0x618C, + 0xE9A4, 0x64D7, 0xE9A5, 0x64D6, 0xE9A6, 0x64D0, 0xE9A7, 0x64CF, + 0xE9A8, 0x64C9, 0xE9A9, 0x64BD, 0xE9AA, 0x6489, 0xE9AB, 0x64C3, + 0xE9AC, 0x64DB, 0xE9AD, 0x64F3, 0xE9AE, 0x64D9, 0xE9AF, 0x6533, + 0xE9B0, 0x657F, 0xE9B1, 0x657C, 0xE9B2, 0x65A2, 0xE9B3, 0x66C8, + 0xE9B4, 0x66BE, 0xE9B5, 0x66C0, 0xE9B6, 0x66CA, 0xE9B7, 0x66CB, + 0xE9B8, 0x66CF, 0xE9B9, 0x66BD, 0xE9BA, 0x66BB, 0xE9BB, 0x66BA, + 0xE9BC, 0x66CC, 0xE9BD, 0x6723, 0xE9BE, 0x6A34, 0xE9BF, 0x6A66, + 0xE9C0, 0x6A49, 0xE9C1, 0x6A67, 0xE9C2, 0x6A32, 0xE9C3, 0x6A68, + 0xE9C4, 0x6A3E, 0xE9C5, 0x6A5D, 0xE9C6, 0x6A6D, 0xE9C7, 0x6A76, + 0xE9C8, 0x6A5B, 0xE9C9, 0x6A51, 0xE9CA, 0x6A28, 0xE9CB, 0x6A5A, + 0xE9CC, 0x6A3B, 0xE9CD, 0x6A3F, 0xE9CE, 0x6A41, 0xE9CF, 0x6A6A, + 0xE9D0, 0x6A64, 0xE9D1, 0x6A50, 0xE9D2, 0x6A4F, 0xE9D3, 0x6A54, + 0xE9D4, 0x6A6F, 0xE9D5, 0x6A69, 0xE9D6, 0x6A60, 0xE9D7, 0x6A3C, + 0xE9D8, 0x6A5E, 0xE9D9, 0x6A56, 0xE9DA, 0x6A55, 0xE9DB, 0x6A4D, + 0xE9DC, 0x6A4E, 0xE9DD, 0x6A46, 0xE9DE, 0x6B55, 0xE9DF, 0x6B54, + 0xE9E0, 0x6B56, 0xE9E1, 0x6BA7, 0xE9E2, 0x6BAA, 0xE9E3, 0x6BAB, + 0xE9E4, 0x6BC8, 0xE9E5, 0x6BC7, 0xE9E6, 0x6C04, 0xE9E7, 0x6C03, + 0xE9E8, 0x6C06, 0xE9E9, 0x6FAD, 0xE9EA, 0x6FCB, 0xE9EB, 0x6FA3, + 0xE9EC, 0x6FC7, 0xE9ED, 0x6FBC, 0xE9EE, 0x6FCE, 0xE9EF, 0x6FC8, + 0xE9F0, 0x6F5E, 0xE9F1, 0x6FC4, 0xE9F2, 0x6FBD, 0xE9F3, 0x6F9E, + 0xE9F4, 0x6FCA, 0xE9F5, 0x6FA8, 0xE9F6, 0x7004, 0xE9F7, 0x6FA5, + 0xE9F8, 0x6FAE, 0xE9F9, 0x6FBA, 0xE9FA, 0x6FAC, 0xE9FB, 0x6FAA, + 0xE9FC, 0x6FCF, 0xE9FD, 0x6FBF, 0xE9FE, 0x6FB8, 0xEA40, 0x6FA2, + 0xEA41, 0x6FC9, 0xEA42, 0x6FAB, 0xEA43, 0x6FCD, 0xEA44, 0x6FAF, + 0xEA45, 0x6FB2, 0xEA46, 0x6FB0, 0xEA47, 0x71C5, 0xEA48, 0x71C2, + 0xEA49, 0x71BF, 0xEA4A, 0x71B8, 0xEA4B, 0x71D6, 0xEA4C, 0x71C0, + 0xEA4D, 0x71C1, 0xEA4E, 0x71CB, 0xEA4F, 0x71D4, 0xEA50, 0x71CA, + 0xEA51, 0x71C7, 0xEA52, 0x71CF, 0xEA53, 0x71BD, 0xEA54, 0x71D8, + 0xEA55, 0x71BC, 0xEA56, 0x71C6, 0xEA57, 0x71DA, 0xEA58, 0x71DB, + 0xEA59, 0x729D, 0xEA5A, 0x729E, 0xEA5B, 0x7369, 0xEA5C, 0x7366, + 0xEA5D, 0x7367, 0xEA5E, 0x736C, 0xEA5F, 0x7365, 0xEA60, 0x736B, + 0xEA61, 0x736A, 0xEA62, 0x747F, 0xEA63, 0x749A, 0xEA64, 0x74A0, + 0xEA65, 0x7494, 0xEA66, 0x7492, 0xEA67, 0x7495, 0xEA68, 0x74A1, + 0xEA69, 0x750B, 0xEA6A, 0x7580, 0xEA6B, 0x762F, 0xEA6C, 0x762D, + 0xEA6D, 0x7631, 0xEA6E, 0x763D, 0xEA6F, 0x7633, 0xEA70, 0x763C, + 0xEA71, 0x7635, 0xEA72, 0x7632, 0xEA73, 0x7630, 0xEA74, 0x76BB, + 0xEA75, 0x76E6, 0xEA76, 0x779A, 0xEA77, 0x779D, 0xEA78, 0x77A1, + 0xEA79, 0x779C, 0xEA7A, 0x779B, 0xEA7B, 0x77A2, 0xEA7C, 0x77A3, + 0xEA7D, 0x7795, 0xEA7E, 0x7799, 0xEAA1, 0x7797, 0xEAA2, 0x78DD, + 0xEAA3, 0x78E9, 0xEAA4, 0x78E5, 0xEAA5, 0x78EA, 0xEAA6, 0x78DE, + 0xEAA7, 0x78E3, 0xEAA8, 0x78DB, 0xEAA9, 0x78E1, 0xEAAA, 0x78E2, + 0xEAAB, 0x78ED, 0xEAAC, 0x78DF, 0xEAAD, 0x78E0, 0xEAAE, 0x79A4, + 0xEAAF, 0x7A44, 0xEAB0, 0x7A48, 0xEAB1, 0x7A47, 0xEAB2, 0x7AB6, + 0xEAB3, 0x7AB8, 0xEAB4, 0x7AB5, 0xEAB5, 0x7AB1, 0xEAB6, 0x7AB7, + 0xEAB7, 0x7BDE, 0xEAB8, 0x7BE3, 0xEAB9, 0x7BE7, 0xEABA, 0x7BDD, + 0xEABB, 0x7BD5, 0xEABC, 0x7BE5, 0xEABD, 0x7BDA, 0xEABE, 0x7BE8, + 0xEABF, 0x7BF9, 0xEAC0, 0x7BD4, 0xEAC1, 0x7BEA, 0xEAC2, 0x7BE2, + 0xEAC3, 0x7BDC, 0xEAC4, 0x7BEB, 0xEAC5, 0x7BD8, 0xEAC6, 0x7BDF, + 0xEAC7, 0x7CD2, 0xEAC8, 0x7CD4, 0xEAC9, 0x7CD7, 0xEACA, 0x7CD0, + 0xEACB, 0x7CD1, 0xEACC, 0x7E12, 0xEACD, 0x7E21, 0xEACE, 0x7E17, + 0xEACF, 0x7E0C, 0xEAD0, 0x7E1F, 0xEAD1, 0x7E20, 0xEAD2, 0x7E13, + 0xEAD3, 0x7E0E, 0xEAD4, 0x7E1C, 0xEAD5, 0x7E15, 0xEAD6, 0x7E1A, + 0xEAD7, 0x7E22, 0xEAD8, 0x7E0B, 0xEAD9, 0x7E0F, 0xEADA, 0x7E16, + 0xEADB, 0x7E0D, 0xEADC, 0x7E14, 0xEADD, 0x7E25, 0xEADE, 0x7E24, + 0xEADF, 0x7F43, 0xEAE0, 0x7F7B, 0xEAE1, 0x7F7C, 0xEAE2, 0x7F7A, + 0xEAE3, 0x7FB1, 0xEAE4, 0x7FEF, 0xEAE5, 0x802A, 0xEAE6, 0x8029, + 0xEAE7, 0x806C, 0xEAE8, 0x81B1, 0xEAE9, 0x81A6, 0xEAEA, 0x81AE, + 0xEAEB, 0x81B9, 0xEAEC, 0x81B5, 0xEAED, 0x81AB, 0xEAEE, 0x81B0, + 0xEAEF, 0x81AC, 0xEAF0, 0x81B4, 0xEAF1, 0x81B2, 0xEAF2, 0x81B7, + 0xEAF3, 0x81A7, 0xEAF4, 0x81F2, 0xEAF5, 0x8255, 0xEAF6, 0x8256, + 0xEAF7, 0x8257, 0xEAF8, 0x8556, 0xEAF9, 0x8545, 0xEAFA, 0x856B, + 0xEAFB, 0x854D, 0xEAFC, 0x8553, 0xEAFD, 0x8561, 0xEAFE, 0x8558, + 0xEB40, 0x8540, 0xEB41, 0x8546, 0xEB42, 0x8564, 0xEB43, 0x8541, + 0xEB44, 0x8562, 0xEB45, 0x8544, 0xEB46, 0x8551, 0xEB47, 0x8547, + 0xEB48, 0x8563, 0xEB49, 0x853E, 0xEB4A, 0x855B, 0xEB4B, 0x8571, + 0xEB4C, 0x854E, 0xEB4D, 0x856E, 0xEB4E, 0x8575, 0xEB4F, 0x8555, + 0xEB50, 0x8567, 0xEB51, 0x8560, 0xEB52, 0x858C, 0xEB53, 0x8566, + 0xEB54, 0x855D, 0xEB55, 0x8554, 0xEB56, 0x8565, 0xEB57, 0x856C, + 0xEB58, 0x8663, 0xEB59, 0x8665, 0xEB5A, 0x8664, 0xEB5B, 0x879B, + 0xEB5C, 0x878F, 0xEB5D, 0x8797, 0xEB5E, 0x8793, 0xEB5F, 0x8792, + 0xEB60, 0x8788, 0xEB61, 0x8781, 0xEB62, 0x8796, 0xEB63, 0x8798, + 0xEB64, 0x8779, 0xEB65, 0x8787, 0xEB66, 0x87A3, 0xEB67, 0x8785, + 0xEB68, 0x8790, 0xEB69, 0x8791, 0xEB6A, 0x879D, 0xEB6B, 0x8784, + 0xEB6C, 0x8794, 0xEB6D, 0x879C, 0xEB6E, 0x879A, 0xEB6F, 0x8789, + 0xEB70, 0x891E, 0xEB71, 0x8926, 0xEB72, 0x8930, 0xEB73, 0x892D, + 0xEB74, 0x892E, 0xEB75, 0x8927, 0xEB76, 0x8931, 0xEB77, 0x8922, + 0xEB78, 0x8929, 0xEB79, 0x8923, 0xEB7A, 0x892F, 0xEB7B, 0x892C, + 0xEB7C, 0x891F, 0xEB7D, 0x89F1, 0xEB7E, 0x8AE0, 0xEBA1, 0x8AE2, + 0xEBA2, 0x8AF2, 0xEBA3, 0x8AF4, 0xEBA4, 0x8AF5, 0xEBA5, 0x8ADD, + 0xEBA6, 0x8B14, 0xEBA7, 0x8AE4, 0xEBA8, 0x8ADF, 0xEBA9, 0x8AF0, + 0xEBAA, 0x8AC8, 0xEBAB, 0x8ADE, 0xEBAC, 0x8AE1, 0xEBAD, 0x8AE8, + 0xEBAE, 0x8AFF, 0xEBAF, 0x8AEF, 0xEBB0, 0x8AFB, 0xEBB1, 0x8C91, + 0xEBB2, 0x8C92, 0xEBB3, 0x8C90, 0xEBB4, 0x8CF5, 0xEBB5, 0x8CEE, + 0xEBB6, 0x8CF1, 0xEBB7, 0x8CF0, 0xEBB8, 0x8CF3, 0xEBB9, 0x8D6C, + 0xEBBA, 0x8D6E, 0xEBBB, 0x8DA5, 0xEBBC, 0x8DA7, 0xEBBD, 0x8E33, + 0xEBBE, 0x8E3E, 0xEBBF, 0x8E38, 0xEBC0, 0x8E40, 0xEBC1, 0x8E45, + 0xEBC2, 0x8E36, 0xEBC3, 0x8E3C, 0xEBC4, 0x8E3D, 0xEBC5, 0x8E41, + 0xEBC6, 0x8E30, 0xEBC7, 0x8E3F, 0xEBC8, 0x8EBD, 0xEBC9, 0x8F36, + 0xEBCA, 0x8F2E, 0xEBCB, 0x8F35, 0xEBCC, 0x8F32, 0xEBCD, 0x8F39, + 0xEBCE, 0x8F37, 0xEBCF, 0x8F34, 0xEBD0, 0x9076, 0xEBD1, 0x9079, + 0xEBD2, 0x907B, 0xEBD3, 0x9086, 0xEBD4, 0x90FA, 0xEBD5, 0x9133, + 0xEBD6, 0x9135, 0xEBD7, 0x9136, 0xEBD8, 0x9193, 0xEBD9, 0x9190, + 0xEBDA, 0x9191, 0xEBDB, 0x918D, 0xEBDC, 0x918F, 0xEBDD, 0x9327, + 0xEBDE, 0x931E, 0xEBDF, 0x9308, 0xEBE0, 0x931F, 0xEBE1, 0x9306, + 0xEBE2, 0x930F, 0xEBE3, 0x937A, 0xEBE4, 0x9338, 0xEBE5, 0x933C, + 0xEBE6, 0x931B, 0xEBE7, 0x9323, 0xEBE8, 0x9312, 0xEBE9, 0x9301, + 0xEBEA, 0x9346, 0xEBEB, 0x932D, 0xEBEC, 0x930E, 0xEBED, 0x930D, + 0xEBEE, 0x92CB, 0xEBEF, 0x931D, 0xEBF0, 0x92FA, 0xEBF1, 0x9325, + 0xEBF2, 0x9313, 0xEBF3, 0x92F9, 0xEBF4, 0x92F7, 0xEBF5, 0x9334, + 0xEBF6, 0x9302, 0xEBF7, 0x9324, 0xEBF8, 0x92FF, 0xEBF9, 0x9329, + 0xEBFA, 0x9339, 0xEBFB, 0x9335, 0xEBFC, 0x932A, 0xEBFD, 0x9314, + 0xEBFE, 0x930C, 0xEC40, 0x930B, 0xEC41, 0x92FE, 0xEC42, 0x9309, + 0xEC43, 0x9300, 0xEC44, 0x92FB, 0xEC45, 0x9316, 0xEC46, 0x95BC, + 0xEC47, 0x95CD, 0xEC48, 0x95BE, 0xEC49, 0x95B9, 0xEC4A, 0x95BA, + 0xEC4B, 0x95B6, 0xEC4C, 0x95BF, 0xEC4D, 0x95B5, 0xEC4E, 0x95BD, + 0xEC4F, 0x96A9, 0xEC50, 0x96D4, 0xEC51, 0x970B, 0xEC52, 0x9712, + 0xEC53, 0x9710, 0xEC54, 0x9799, 0xEC55, 0x9797, 0xEC56, 0x9794, + 0xEC57, 0x97F0, 0xEC58, 0x97F8, 0xEC59, 0x9835, 0xEC5A, 0x982F, + 0xEC5B, 0x9832, 0xEC5C, 0x9924, 0xEC5D, 0x991F, 0xEC5E, 0x9927, + 0xEC5F, 0x9929, 0xEC60, 0x999E, 0xEC61, 0x99EE, 0xEC62, 0x99EC, + 0xEC63, 0x99E5, 0xEC64, 0x99E4, 0xEC65, 0x99F0, 0xEC66, 0x99E3, + 0xEC67, 0x99EA, 0xEC68, 0x99E9, 0xEC69, 0x99E7, 0xEC6A, 0x9AB9, + 0xEC6B, 0x9ABF, 0xEC6C, 0x9AB4, 0xEC6D, 0x9ABB, 0xEC6E, 0x9AF6, + 0xEC6F, 0x9AFA, 0xEC70, 0x9AF9, 0xEC71, 0x9AF7, 0xEC72, 0x9B33, + 0xEC73, 0x9B80, 0xEC74, 0x9B85, 0xEC75, 0x9B87, 0xEC76, 0x9B7C, + 0xEC77, 0x9B7E, 0xEC78, 0x9B7B, 0xEC79, 0x9B82, 0xEC7A, 0x9B93, + 0xEC7B, 0x9B92, 0xEC7C, 0x9B90, 0xEC7D, 0x9B7A, 0xEC7E, 0x9B95, + 0xECA1, 0x9B7D, 0xECA2, 0x9B88, 0xECA3, 0x9D25, 0xECA4, 0x9D17, + 0xECA5, 0x9D20, 0xECA6, 0x9D1E, 0xECA7, 0x9D14, 0xECA8, 0x9D29, + 0xECA9, 0x9D1D, 0xECAA, 0x9D18, 0xECAB, 0x9D22, 0xECAC, 0x9D10, + 0xECAD, 0x9D19, 0xECAE, 0x9D1F, 0xECAF, 0x9E88, 0xECB0, 0x9E86, + 0xECB1, 0x9E87, 0xECB2, 0x9EAE, 0xECB3, 0x9EAD, 0xECB4, 0x9ED5, + 0xECB5, 0x9ED6, 0xECB6, 0x9EFA, 0xECB7, 0x9F12, 0xECB8, 0x9F3D, + 0xECB9, 0x5126, 0xECBA, 0x5125, 0xECBB, 0x5122, 0xECBC, 0x5124, + 0xECBD, 0x5120, 0xECBE, 0x5129, 0xECBF, 0x52F4, 0xECC0, 0x5693, + 0xECC1, 0x568C, 0xECC2, 0x568D, 0xECC3, 0x5686, 0xECC4, 0x5684, + 0xECC5, 0x5683, 0xECC6, 0x567E, 0xECC7, 0x5682, 0xECC8, 0x567F, + 0xECC9, 0x5681, 0xECCA, 0x58D6, 0xECCB, 0x58D4, 0xECCC, 0x58CF, + 0xECCD, 0x58D2, 0xECCE, 0x5B2D, 0xECCF, 0x5B25, 0xECD0, 0x5B32, + 0xECD1, 0x5B23, 0xECD2, 0x5B2C, 0xECD3, 0x5B27, 0xECD4, 0x5B26, + 0xECD5, 0x5B2F, 0xECD6, 0x5B2E, 0xECD7, 0x5B7B, 0xECD8, 0x5BF1, + 0xECD9, 0x5BF2, 0xECDA, 0x5DB7, 0xECDB, 0x5E6C, 0xECDC, 0x5E6A, + 0xECDD, 0x5FBE, 0xECDE, 0x5FBB, 0xECDF, 0x61C3, 0xECE0, 0x61B5, + 0xECE1, 0x61BC, 0xECE2, 0x61E7, 0xECE3, 0x61E0, 0xECE4, 0x61E5, + 0xECE5, 0x61E4, 0xECE6, 0x61E8, 0xECE7, 0x61DE, 0xECE8, 0x64EF, + 0xECE9, 0x64E9, 0xECEA, 0x64E3, 0xECEB, 0x64EB, 0xECEC, 0x64E4, + 0xECED, 0x64E8, 0xECEE, 0x6581, 0xECEF, 0x6580, 0xECF0, 0x65B6, + 0xECF1, 0x65DA, 0xECF2, 0x66D2, 0xECF3, 0x6A8D, 0xECF4, 0x6A96, + 0xECF5, 0x6A81, 0xECF6, 0x6AA5, 0xECF7, 0x6A89, 0xECF8, 0x6A9F, + 0xECF9, 0x6A9B, 0xECFA, 0x6AA1, 0xECFB, 0x6A9E, 0xECFC, 0x6A87, + 0xECFD, 0x6A93, 0xECFE, 0x6A8E, 0xED40, 0x6A95, 0xED41, 0x6A83, + 0xED42, 0x6AA8, 0xED43, 0x6AA4, 0xED44, 0x6A91, 0xED45, 0x6A7F, + 0xED46, 0x6AA6, 0xED47, 0x6A9A, 0xED48, 0x6A85, 0xED49, 0x6A8C, + 0xED4A, 0x6A92, 0xED4B, 0x6B5B, 0xED4C, 0x6BAD, 0xED4D, 0x6C09, + 0xED4E, 0x6FCC, 0xED4F, 0x6FA9, 0xED50, 0x6FF4, 0xED51, 0x6FD4, + 0xED52, 0x6FE3, 0xED53, 0x6FDC, 0xED54, 0x6FED, 0xED55, 0x6FE7, + 0xED56, 0x6FE6, 0xED57, 0x6FDE, 0xED58, 0x6FF2, 0xED59, 0x6FDD, + 0xED5A, 0x6FE2, 0xED5B, 0x6FE8, 0xED5C, 0x71E1, 0xED5D, 0x71F1, + 0xED5E, 0x71E8, 0xED5F, 0x71F2, 0xED60, 0x71E4, 0xED61, 0x71F0, + 0xED62, 0x71E2, 0xED63, 0x7373, 0xED64, 0x736E, 0xED65, 0x736F, + 0xED66, 0x7497, 0xED67, 0x74B2, 0xED68, 0x74AB, 0xED69, 0x7490, + 0xED6A, 0x74AA, 0xED6B, 0x74AD, 0xED6C, 0x74B1, 0xED6D, 0x74A5, + 0xED6E, 0x74AF, 0xED6F, 0x7510, 0xED70, 0x7511, 0xED71, 0x7512, + 0xED72, 0x750F, 0xED73, 0x7584, 0xED74, 0x7643, 0xED75, 0x7648, + 0xED76, 0x7649, 0xED77, 0x7647, 0xED78, 0x76A4, 0xED79, 0x76E9, + 0xED7A, 0x77B5, 0xED7B, 0x77AB, 0xED7C, 0x77B2, 0xED7D, 0x77B7, + 0xED7E, 0x77B6, 0xEDA1, 0x77B4, 0xEDA2, 0x77B1, 0xEDA3, 0x77A8, + 0xEDA4, 0x77F0, 0xEDA5, 0x78F3, 0xEDA6, 0x78FD, 0xEDA7, 0x7902, + 0xEDA8, 0x78FB, 0xEDA9, 0x78FC, 0xEDAA, 0x78F2, 0xEDAB, 0x7905, + 0xEDAC, 0x78F9, 0xEDAD, 0x78FE, 0xEDAE, 0x7904, 0xEDAF, 0x79AB, + 0xEDB0, 0x79A8, 0xEDB1, 0x7A5C, 0xEDB2, 0x7A5B, 0xEDB3, 0x7A56, + 0xEDB4, 0x7A58, 0xEDB5, 0x7A54, 0xEDB6, 0x7A5A, 0xEDB7, 0x7ABE, + 0xEDB8, 0x7AC0, 0xEDB9, 0x7AC1, 0xEDBA, 0x7C05, 0xEDBB, 0x7C0F, + 0xEDBC, 0x7BF2, 0xEDBD, 0x7C00, 0xEDBE, 0x7BFF, 0xEDBF, 0x7BFB, + 0xEDC0, 0x7C0E, 0xEDC1, 0x7BF4, 0xEDC2, 0x7C0B, 0xEDC3, 0x7BF3, + 0xEDC4, 0x7C02, 0xEDC5, 0x7C09, 0xEDC6, 0x7C03, 0xEDC7, 0x7C01, + 0xEDC8, 0x7BF8, 0xEDC9, 0x7BFD, 0xEDCA, 0x7C06, 0xEDCB, 0x7BF0, + 0xEDCC, 0x7BF1, 0xEDCD, 0x7C10, 0xEDCE, 0x7C0A, 0xEDCF, 0x7CE8, + 0xEDD0, 0x7E2D, 0xEDD1, 0x7E3C, 0xEDD2, 0x7E42, 0xEDD3, 0x7E33, + 0xEDD4, 0x9848, 0xEDD5, 0x7E38, 0xEDD6, 0x7E2A, 0xEDD7, 0x7E49, + 0xEDD8, 0x7E40, 0xEDD9, 0x7E47, 0xEDDA, 0x7E29, 0xEDDB, 0x7E4C, + 0xEDDC, 0x7E30, 0xEDDD, 0x7E3B, 0xEDDE, 0x7E36, 0xEDDF, 0x7E44, + 0xEDE0, 0x7E3A, 0xEDE1, 0x7F45, 0xEDE2, 0x7F7F, 0xEDE3, 0x7F7E, + 0xEDE4, 0x7F7D, 0xEDE5, 0x7FF4, 0xEDE6, 0x7FF2, 0xEDE7, 0x802C, + 0xEDE8, 0x81BB, 0xEDE9, 0x81C4, 0xEDEA, 0x81CC, 0xEDEB, 0x81CA, + 0xEDEC, 0x81C5, 0xEDED, 0x81C7, 0xEDEE, 0x81BC, 0xEDEF, 0x81E9, + 0xEDF0, 0x825B, 0xEDF1, 0x825A, 0xEDF2, 0x825C, 0xEDF3, 0x8583, + 0xEDF4, 0x8580, 0xEDF5, 0x858F, 0xEDF6, 0x85A7, 0xEDF7, 0x8595, + 0xEDF8, 0x85A0, 0xEDF9, 0x858B, 0xEDFA, 0x85A3, 0xEDFB, 0x857B, + 0xEDFC, 0x85A4, 0xEDFD, 0x859A, 0xEDFE, 0x859E, 0xEE40, 0x8577, + 0xEE41, 0x857C, 0xEE42, 0x8589, 0xEE43, 0x85A1, 0xEE44, 0x857A, + 0xEE45, 0x8578, 0xEE46, 0x8557, 0xEE47, 0x858E, 0xEE48, 0x8596, + 0xEE49, 0x8586, 0xEE4A, 0x858D, 0xEE4B, 0x8599, 0xEE4C, 0x859D, + 0xEE4D, 0x8581, 0xEE4E, 0x85A2, 0xEE4F, 0x8582, 0xEE50, 0x8588, + 0xEE51, 0x8585, 0xEE52, 0x8579, 0xEE53, 0x8576, 0xEE54, 0x8598, + 0xEE55, 0x8590, 0xEE56, 0x859F, 0xEE57, 0x8668, 0xEE58, 0x87BE, + 0xEE59, 0x87AA, 0xEE5A, 0x87AD, 0xEE5B, 0x87C5, 0xEE5C, 0x87B0, + 0xEE5D, 0x87AC, 0xEE5E, 0x87B9, 0xEE5F, 0x87B5, 0xEE60, 0x87BC, + 0xEE61, 0x87AE, 0xEE62, 0x87C9, 0xEE63, 0x87C3, 0xEE64, 0x87C2, + 0xEE65, 0x87CC, 0xEE66, 0x87B7, 0xEE67, 0x87AF, 0xEE68, 0x87C4, + 0xEE69, 0x87CA, 0xEE6A, 0x87B4, 0xEE6B, 0x87B6, 0xEE6C, 0x87BF, + 0xEE6D, 0x87B8, 0xEE6E, 0x87BD, 0xEE6F, 0x87DE, 0xEE70, 0x87B2, + 0xEE71, 0x8935, 0xEE72, 0x8933, 0xEE73, 0x893C, 0xEE74, 0x893E, + 0xEE75, 0x8941, 0xEE76, 0x8952, 0xEE77, 0x8937, 0xEE78, 0x8942, + 0xEE79, 0x89AD, 0xEE7A, 0x89AF, 0xEE7B, 0x89AE, 0xEE7C, 0x89F2, + 0xEE7D, 0x89F3, 0xEE7E, 0x8B1E, 0xEEA1, 0x8B18, 0xEEA2, 0x8B16, + 0xEEA3, 0x8B11, 0xEEA4, 0x8B05, 0xEEA5, 0x8B0B, 0xEEA6, 0x8B22, + 0xEEA7, 0x8B0F, 0xEEA8, 0x8B12, 0xEEA9, 0x8B15, 0xEEAA, 0x8B07, + 0xEEAB, 0x8B0D, 0xEEAC, 0x8B08, 0xEEAD, 0x8B06, 0xEEAE, 0x8B1C, + 0xEEAF, 0x8B13, 0xEEB0, 0x8B1A, 0xEEB1, 0x8C4F, 0xEEB2, 0x8C70, + 0xEEB3, 0x8C72, 0xEEB4, 0x8C71, 0xEEB5, 0x8C6F, 0xEEB6, 0x8C95, + 0xEEB7, 0x8C94, 0xEEB8, 0x8CF9, 0xEEB9, 0x8D6F, 0xEEBA, 0x8E4E, + 0xEEBB, 0x8E4D, 0xEEBC, 0x8E53, 0xEEBD, 0x8E50, 0xEEBE, 0x8E4C, + 0xEEBF, 0x8E47, 0xEEC0, 0x8F43, 0xEEC1, 0x8F40, 0xEEC2, 0x9085, + 0xEEC3, 0x907E, 0xEEC4, 0x9138, 0xEEC5, 0x919A, 0xEEC6, 0x91A2, + 0xEEC7, 0x919B, 0xEEC8, 0x9199, 0xEEC9, 0x919F, 0xEECA, 0x91A1, + 0xEECB, 0x919D, 0xEECC, 0x91A0, 0xEECD, 0x93A1, 0xEECE, 0x9383, + 0xEECF, 0x93AF, 0xEED0, 0x9364, 0xEED1, 0x9356, 0xEED2, 0x9347, + 0xEED3, 0x937C, 0xEED4, 0x9358, 0xEED5, 0x935C, 0xEED6, 0x9376, + 0xEED7, 0x9349, 0xEED8, 0x9350, 0xEED9, 0x9351, 0xEEDA, 0x9360, + 0xEEDB, 0x936D, 0xEEDC, 0x938F, 0xEEDD, 0x934C, 0xEEDE, 0x936A, + 0xEEDF, 0x9379, 0xEEE0, 0x9357, 0xEEE1, 0x9355, 0xEEE2, 0x9352, + 0xEEE3, 0x934F, 0xEEE4, 0x9371, 0xEEE5, 0x9377, 0xEEE6, 0x937B, + 0xEEE7, 0x9361, 0xEEE8, 0x935E, 0xEEE9, 0x9363, 0xEEEA, 0x9367, + 0xEEEB, 0x9380, 0xEEEC, 0x934E, 0xEEED, 0x9359, 0xEEEE, 0x95C7, + 0xEEEF, 0x95C0, 0xEEF0, 0x95C9, 0xEEF1, 0x95C3, 0xEEF2, 0x95C5, + 0xEEF3, 0x95B7, 0xEEF4, 0x96AE, 0xEEF5, 0x96B0, 0xEEF6, 0x96AC, + 0xEEF7, 0x9720, 0xEEF8, 0x971F, 0xEEF9, 0x9718, 0xEEFA, 0x971D, + 0xEEFB, 0x9719, 0xEEFC, 0x979A, 0xEEFD, 0x97A1, 0xEEFE, 0x979C, + 0xEF40, 0x979E, 0xEF41, 0x979D, 0xEF42, 0x97D5, 0xEF43, 0x97D4, + 0xEF44, 0x97F1, 0xEF45, 0x9841, 0xEF46, 0x9844, 0xEF47, 0x984A, + 0xEF48, 0x9849, 0xEF49, 0x9845, 0xEF4A, 0x9843, 0xEF4B, 0x9925, + 0xEF4C, 0x992B, 0xEF4D, 0x992C, 0xEF4E, 0x992A, 0xEF4F, 0x9933, + 0xEF50, 0x9932, 0xEF51, 0x992F, 0xEF52, 0x992D, 0xEF53, 0x9931, + 0xEF54, 0x9930, 0xEF55, 0x9998, 0xEF56, 0x99A3, 0xEF57, 0x99A1, + 0xEF58, 0x9A02, 0xEF59, 0x99FA, 0xEF5A, 0x99F4, 0xEF5B, 0x99F7, + 0xEF5C, 0x99F9, 0xEF5D, 0x99F8, 0xEF5E, 0x99F6, 0xEF5F, 0x99FB, + 0xEF60, 0x99FD, 0xEF61, 0x99FE, 0xEF62, 0x99FC, 0xEF63, 0x9A03, + 0xEF64, 0x9ABE, 0xEF65, 0x9AFE, 0xEF66, 0x9AFD, 0xEF67, 0x9B01, + 0xEF68, 0x9AFC, 0xEF69, 0x9B48, 0xEF6A, 0x9B9A, 0xEF6B, 0x9BA8, + 0xEF6C, 0x9B9E, 0xEF6D, 0x9B9B, 0xEF6E, 0x9BA6, 0xEF6F, 0x9BA1, + 0xEF70, 0x9BA5, 0xEF71, 0x9BA4, 0xEF72, 0x9B86, 0xEF73, 0x9BA2, + 0xEF74, 0x9BA0, 0xEF75, 0x9BAF, 0xEF76, 0x9D33, 0xEF77, 0x9D41, + 0xEF78, 0x9D67, 0xEF79, 0x9D36, 0xEF7A, 0x9D2E, 0xEF7B, 0x9D2F, + 0xEF7C, 0x9D31, 0xEF7D, 0x9D38, 0xEF7E, 0x9D30, 0xEFA1, 0x9D45, + 0xEFA2, 0x9D42, 0xEFA3, 0x9D43, 0xEFA4, 0x9D3E, 0xEFA5, 0x9D37, + 0xEFA6, 0x9D40, 0xEFA7, 0x9D3D, 0xEFA8, 0x7FF5, 0xEFA9, 0x9D2D, + 0xEFAA, 0x9E8A, 0xEFAB, 0x9E89, 0xEFAC, 0x9E8D, 0xEFAD, 0x9EB0, + 0xEFAE, 0x9EC8, 0xEFAF, 0x9EDA, 0xEFB0, 0x9EFB, 0xEFB1, 0x9EFF, + 0xEFB2, 0x9F24, 0xEFB3, 0x9F23, 0xEFB4, 0x9F22, 0xEFB5, 0x9F54, + 0xEFB6, 0x9FA0, 0xEFB7, 0x5131, 0xEFB8, 0x512D, 0xEFB9, 0x512E, + 0xEFBA, 0x5698, 0xEFBB, 0x569C, 0xEFBC, 0x5697, 0xEFBD, 0x569A, + 0xEFBE, 0x569D, 0xEFBF, 0x5699, 0xEFC0, 0x5970, 0xEFC1, 0x5B3C, + 0xEFC2, 0x5C69, 0xEFC3, 0x5C6A, 0xEFC4, 0x5DC0, 0xEFC5, 0x5E6D, + 0xEFC6, 0x5E6E, 0xEFC7, 0x61D8, 0xEFC8, 0x61DF, 0xEFC9, 0x61ED, + 0xEFCA, 0x61EE, 0xEFCB, 0x61F1, 0xEFCC, 0x61EA, 0xEFCD, 0x61F0, + 0xEFCE, 0x61EB, 0xEFCF, 0x61D6, 0xEFD0, 0x61E9, 0xEFD1, 0x64FF, + 0xEFD2, 0x6504, 0xEFD3, 0x64FD, 0xEFD4, 0x64F8, 0xEFD5, 0x6501, + 0xEFD6, 0x6503, 0xEFD7, 0x64FC, 0xEFD8, 0x6594, 0xEFD9, 0x65DB, + 0xEFDA, 0x66DA, 0xEFDB, 0x66DB, 0xEFDC, 0x66D8, 0xEFDD, 0x6AC5, + 0xEFDE, 0x6AB9, 0xEFDF, 0x6ABD, 0xEFE0, 0x6AE1, 0xEFE1, 0x6AC6, + 0xEFE2, 0x6ABA, 0xEFE3, 0x6AB6, 0xEFE4, 0x6AB7, 0xEFE5, 0x6AC7, + 0xEFE6, 0x6AB4, 0xEFE7, 0x6AAD, 0xEFE8, 0x6B5E, 0xEFE9, 0x6BC9, + 0xEFEA, 0x6C0B, 0xEFEB, 0x7007, 0xEFEC, 0x700C, 0xEFED, 0x700D, + 0xEFEE, 0x7001, 0xEFEF, 0x7005, 0xEFF0, 0x7014, 0xEFF1, 0x700E, + 0xEFF2, 0x6FFF, 0xEFF3, 0x7000, 0xEFF4, 0x6FFB, 0xEFF5, 0x7026, + 0xEFF6, 0x6FFC, 0xEFF7, 0x6FF7, 0xEFF8, 0x700A, 0xEFF9, 0x7201, + 0xEFFA, 0x71FF, 0xEFFB, 0x71F9, 0xEFFC, 0x7203, 0xEFFD, 0x71FD, + 0xEFFE, 0x7376, 0xF040, 0x74B8, 0xF041, 0x74C0, 0xF042, 0x74B5, + 0xF043, 0x74C1, 0xF044, 0x74BE, 0xF045, 0x74B6, 0xF046, 0x74BB, + 0xF047, 0x74C2, 0xF048, 0x7514, 0xF049, 0x7513, 0xF04A, 0x765C, + 0xF04B, 0x7664, 0xF04C, 0x7659, 0xF04D, 0x7650, 0xF04E, 0x7653, + 0xF04F, 0x7657, 0xF050, 0x765A, 0xF051, 0x76A6, 0xF052, 0x76BD, + 0xF053, 0x76EC, 0xF054, 0x77C2, 0xF055, 0x77BA, 0xF056, 0x78FF, + 0xF057, 0x790C, 0xF058, 0x7913, 0xF059, 0x7914, 0xF05A, 0x7909, + 0xF05B, 0x7910, 0xF05C, 0x7912, 0xF05D, 0x7911, 0xF05E, 0x79AD, + 0xF05F, 0x79AC, 0xF060, 0x7A5F, 0xF061, 0x7C1C, 0xF062, 0x7C29, + 0xF063, 0x7C19, 0xF064, 0x7C20, 0xF065, 0x7C1F, 0xF066, 0x7C2D, + 0xF067, 0x7C1D, 0xF068, 0x7C26, 0xF069, 0x7C28, 0xF06A, 0x7C22, + 0xF06B, 0x7C25, 0xF06C, 0x7C30, 0xF06D, 0x7E5C, 0xF06E, 0x7E50, + 0xF06F, 0x7E56, 0xF070, 0x7E63, 0xF071, 0x7E58, 0xF072, 0x7E62, + 0xF073, 0x7E5F, 0xF074, 0x7E51, 0xF075, 0x7E60, 0xF076, 0x7E57, + 0xF077, 0x7E53, 0xF078, 0x7FB5, 0xF079, 0x7FB3, 0xF07A, 0x7FF7, + 0xF07B, 0x7FF8, 0xF07C, 0x8075, 0xF07D, 0x81D1, 0xF07E, 0x81D2, + 0xF0A1, 0x81D0, 0xF0A2, 0x825F, 0xF0A3, 0x825E, 0xF0A4, 0x85B4, + 0xF0A5, 0x85C6, 0xF0A6, 0x85C0, 0xF0A7, 0x85C3, 0xF0A8, 0x85C2, + 0xF0A9, 0x85B3, 0xF0AA, 0x85B5, 0xF0AB, 0x85BD, 0xF0AC, 0x85C7, + 0xF0AD, 0x85C4, 0xF0AE, 0x85BF, 0xF0AF, 0x85CB, 0xF0B0, 0x85CE, + 0xF0B1, 0x85C8, 0xF0B2, 0x85C5, 0xF0B3, 0x85B1, 0xF0B4, 0x85B6, + 0xF0B5, 0x85D2, 0xF0B6, 0x8624, 0xF0B7, 0x85B8, 0xF0B8, 0x85B7, + 0xF0B9, 0x85BE, 0xF0BA, 0x8669, 0xF0BB, 0x87E7, 0xF0BC, 0x87E6, + 0xF0BD, 0x87E2, 0xF0BE, 0x87DB, 0xF0BF, 0x87EB, 0xF0C0, 0x87EA, + 0xF0C1, 0x87E5, 0xF0C2, 0x87DF, 0xF0C3, 0x87F3, 0xF0C4, 0x87E4, + 0xF0C5, 0x87D4, 0xF0C6, 0x87DC, 0xF0C7, 0x87D3, 0xF0C8, 0x87ED, + 0xF0C9, 0x87D8, 0xF0CA, 0x87E3, 0xF0CB, 0x87A4, 0xF0CC, 0x87D7, + 0xF0CD, 0x87D9, 0xF0CE, 0x8801, 0xF0CF, 0x87F4, 0xF0D0, 0x87E8, + 0xF0D1, 0x87DD, 0xF0D2, 0x8953, 0xF0D3, 0x894B, 0xF0D4, 0x894F, + 0xF0D5, 0x894C, 0xF0D6, 0x8946, 0xF0D7, 0x8950, 0xF0D8, 0x8951, + 0xF0D9, 0x8949, 0xF0DA, 0x8B2A, 0xF0DB, 0x8B27, 0xF0DC, 0x8B23, + 0xF0DD, 0x8B33, 0xF0DE, 0x8B30, 0xF0DF, 0x8B35, 0xF0E0, 0x8B47, + 0xF0E1, 0x8B2F, 0xF0E2, 0x8B3C, 0xF0E3, 0x8B3E, 0xF0E4, 0x8B31, + 0xF0E5, 0x8B25, 0xF0E6, 0x8B37, 0xF0E7, 0x8B26, 0xF0E8, 0x8B36, + 0xF0E9, 0x8B2E, 0xF0EA, 0x8B24, 0xF0EB, 0x8B3B, 0xF0EC, 0x8B3D, + 0xF0ED, 0x8B3A, 0xF0EE, 0x8C42, 0xF0EF, 0x8C75, 0xF0F0, 0x8C99, + 0xF0F1, 0x8C98, 0xF0F2, 0x8C97, 0xF0F3, 0x8CFE, 0xF0F4, 0x8D04, + 0xF0F5, 0x8D02, 0xF0F6, 0x8D00, 0xF0F7, 0x8E5C, 0xF0F8, 0x8E62, + 0xF0F9, 0x8E60, 0xF0FA, 0x8E57, 0xF0FB, 0x8E56, 0xF0FC, 0x8E5E, + 0xF0FD, 0x8E65, 0xF0FE, 0x8E67, 0xF140, 0x8E5B, 0xF141, 0x8E5A, + 0xF142, 0x8E61, 0xF143, 0x8E5D, 0xF144, 0x8E69, 0xF145, 0x8E54, + 0xF146, 0x8F46, 0xF147, 0x8F47, 0xF148, 0x8F48, 0xF149, 0x8F4B, + 0xF14A, 0x9128, 0xF14B, 0x913A, 0xF14C, 0x913B, 0xF14D, 0x913E, + 0xF14E, 0x91A8, 0xF14F, 0x91A5, 0xF150, 0x91A7, 0xF151, 0x91AF, + 0xF152, 0x91AA, 0xF153, 0x93B5, 0xF154, 0x938C, 0xF155, 0x9392, + 0xF156, 0x93B7, 0xF157, 0x939B, 0xF158, 0x939D, 0xF159, 0x9389, + 0xF15A, 0x93A7, 0xF15B, 0x938E, 0xF15C, 0x93AA, 0xF15D, 0x939E, + 0xF15E, 0x93A6, 0xF15F, 0x9395, 0xF160, 0x9388, 0xF161, 0x9399, + 0xF162, 0x939F, 0xF163, 0x938D, 0xF164, 0x93B1, 0xF165, 0x9391, + 0xF166, 0x93B2, 0xF167, 0x93A4, 0xF168, 0x93A8, 0xF169, 0x93B4, + 0xF16A, 0x93A3, 0xF16B, 0x93A5, 0xF16C, 0x95D2, 0xF16D, 0x95D3, + 0xF16E, 0x95D1, 0xF16F, 0x96B3, 0xF170, 0x96D7, 0xF171, 0x96DA, + 0xF172, 0x5DC2, 0xF173, 0x96DF, 0xF174, 0x96D8, 0xF175, 0x96DD, + 0xF176, 0x9723, 0xF177, 0x9722, 0xF178, 0x9725, 0xF179, 0x97AC, + 0xF17A, 0x97AE, 0xF17B, 0x97A8, 0xF17C, 0x97AB, 0xF17D, 0x97A4, + 0xF17E, 0x97AA, 0xF1A1, 0x97A2, 0xF1A2, 0x97A5, 0xF1A3, 0x97D7, + 0xF1A4, 0x97D9, 0xF1A5, 0x97D6, 0xF1A6, 0x97D8, 0xF1A7, 0x97FA, + 0xF1A8, 0x9850, 0xF1A9, 0x9851, 0xF1AA, 0x9852, 0xF1AB, 0x98B8, + 0xF1AC, 0x9941, 0xF1AD, 0x993C, 0xF1AE, 0x993A, 0xF1AF, 0x9A0F, + 0xF1B0, 0x9A0B, 0xF1B1, 0x9A09, 0xF1B2, 0x9A0D, 0xF1B3, 0x9A04, + 0xF1B4, 0x9A11, 0xF1B5, 0x9A0A, 0xF1B6, 0x9A05, 0xF1B7, 0x9A07, + 0xF1B8, 0x9A06, 0xF1B9, 0x9AC0, 0xF1BA, 0x9ADC, 0xF1BB, 0x9B08, + 0xF1BC, 0x9B04, 0xF1BD, 0x9B05, 0xF1BE, 0x9B29, 0xF1BF, 0x9B35, + 0xF1C0, 0x9B4A, 0xF1C1, 0x9B4C, 0xF1C2, 0x9B4B, 0xF1C3, 0x9BC7, + 0xF1C4, 0x9BC6, 0xF1C5, 0x9BC3, 0xF1C6, 0x9BBF, 0xF1C7, 0x9BC1, + 0xF1C8, 0x9BB5, 0xF1C9, 0x9BB8, 0xF1CA, 0x9BD3, 0xF1CB, 0x9BB6, + 0xF1CC, 0x9BC4, 0xF1CD, 0x9BB9, 0xF1CE, 0x9BBD, 0xF1CF, 0x9D5C, + 0xF1D0, 0x9D53, 0xF1D1, 0x9D4F, 0xF1D2, 0x9D4A, 0xF1D3, 0x9D5B, + 0xF1D4, 0x9D4B, 0xF1D5, 0x9D59, 0xF1D6, 0x9D56, 0xF1D7, 0x9D4C, + 0xF1D8, 0x9D57, 0xF1D9, 0x9D52, 0xF1DA, 0x9D54, 0xF1DB, 0x9D5F, + 0xF1DC, 0x9D58, 0xF1DD, 0x9D5A, 0xF1DE, 0x9E8E, 0xF1DF, 0x9E8C, + 0xF1E0, 0x9EDF, 0xF1E1, 0x9F01, 0xF1E2, 0x9F00, 0xF1E3, 0x9F16, + 0xF1E4, 0x9F25, 0xF1E5, 0x9F2B, 0xF1E6, 0x9F2A, 0xF1E7, 0x9F29, + 0xF1E8, 0x9F28, 0xF1E9, 0x9F4C, 0xF1EA, 0x9F55, 0xF1EB, 0x5134, + 0xF1EC, 0x5135, 0xF1ED, 0x5296, 0xF1EE, 0x52F7, 0xF1EF, 0x53B4, + 0xF1F0, 0x56AB, 0xF1F1, 0x56AD, 0xF1F2, 0x56A6, 0xF1F3, 0x56A7, + 0xF1F4, 0x56AA, 0xF1F5, 0x56AC, 0xF1F6, 0x58DA, 0xF1F7, 0x58DD, + 0xF1F8, 0x58DB, 0xF1F9, 0x5912, 0xF1FA, 0x5B3D, 0xF1FB, 0x5B3E, + 0xF1FC, 0x5B3F, 0xF1FD, 0x5DC3, 0xF1FE, 0x5E70, 0xF240, 0x5FBF, + 0xF241, 0x61FB, 0xF242, 0x6507, 0xF243, 0x6510, 0xF244, 0x650D, + 0xF245, 0x6509, 0xF246, 0x650C, 0xF247, 0x650E, 0xF248, 0x6584, + 0xF249, 0x65DE, 0xF24A, 0x65DD, 0xF24B, 0x66DE, 0xF24C, 0x6AE7, + 0xF24D, 0x6AE0, 0xF24E, 0x6ACC, 0xF24F, 0x6AD1, 0xF250, 0x6AD9, + 0xF251, 0x6ACB, 0xF252, 0x6ADF, 0xF253, 0x6ADC, 0xF254, 0x6AD0, + 0xF255, 0x6AEB, 0xF256, 0x6ACF, 0xF257, 0x6ACD, 0xF258, 0x6ADE, + 0xF259, 0x6B60, 0xF25A, 0x6BB0, 0xF25B, 0x6C0C, 0xF25C, 0x7019, + 0xF25D, 0x7027, 0xF25E, 0x7020, 0xF25F, 0x7016, 0xF260, 0x702B, + 0xF261, 0x7021, 0xF262, 0x7022, 0xF263, 0x7023, 0xF264, 0x7029, + 0xF265, 0x7017, 0xF266, 0x7024, 0xF267, 0x701C, 0xF268, 0x702A, + 0xF269, 0x720C, 0xF26A, 0x720A, 0xF26B, 0x7207, 0xF26C, 0x7202, + 0xF26D, 0x7205, 0xF26E, 0x72A5, 0xF26F, 0x72A6, 0xF270, 0x72A4, + 0xF271, 0x72A3, 0xF272, 0x72A1, 0xF273, 0x74CB, 0xF274, 0x74C5, + 0xF275, 0x74B7, 0xF276, 0x74C3, 0xF277, 0x7516, 0xF278, 0x7660, + 0xF279, 0x77C9, 0xF27A, 0x77CA, 0xF27B, 0x77C4, 0xF27C, 0x77F1, + 0xF27D, 0x791D, 0xF27E, 0x791B, 0xF2A1, 0x7921, 0xF2A2, 0x791C, + 0xF2A3, 0x7917, 0xF2A4, 0x791E, 0xF2A5, 0x79B0, 0xF2A6, 0x7A67, + 0xF2A7, 0x7A68, 0xF2A8, 0x7C33, 0xF2A9, 0x7C3C, 0xF2AA, 0x7C39, + 0xF2AB, 0x7C2C, 0xF2AC, 0x7C3B, 0xF2AD, 0x7CEC, 0xF2AE, 0x7CEA, + 0xF2AF, 0x7E76, 0xF2B0, 0x7E75, 0xF2B1, 0x7E78, 0xF2B2, 0x7E70, + 0xF2B3, 0x7E77, 0xF2B4, 0x7E6F, 0xF2B5, 0x7E7A, 0xF2B6, 0x7E72, + 0xF2B7, 0x7E74, 0xF2B8, 0x7E68, 0xF2B9, 0x7F4B, 0xF2BA, 0x7F4A, + 0xF2BB, 0x7F83, 0xF2BC, 0x7F86, 0xF2BD, 0x7FB7, 0xF2BE, 0x7FFD, + 0xF2BF, 0x7FFE, 0xF2C0, 0x8078, 0xF2C1, 0x81D7, 0xF2C2, 0x81D5, + 0xF2C3, 0x8264, 0xF2C4, 0x8261, 0xF2C5, 0x8263, 0xF2C6, 0x85EB, + 0xF2C7, 0x85F1, 0xF2C8, 0x85ED, 0xF2C9, 0x85D9, 0xF2CA, 0x85E1, + 0xF2CB, 0x85E8, 0xF2CC, 0x85DA, 0xF2CD, 0x85D7, 0xF2CE, 0x85EC, + 0xF2CF, 0x85F2, 0xF2D0, 0x85F8, 0xF2D1, 0x85D8, 0xF2D2, 0x85DF, + 0xF2D3, 0x85E3, 0xF2D4, 0x85DC, 0xF2D5, 0x85D1, 0xF2D6, 0x85F0, + 0xF2D7, 0x85E6, 0xF2D8, 0x85EF, 0xF2D9, 0x85DE, 0xF2DA, 0x85E2, + 0xF2DB, 0x8800, 0xF2DC, 0x87FA, 0xF2DD, 0x8803, 0xF2DE, 0x87F6, + 0xF2DF, 0x87F7, 0xF2E0, 0x8809, 0xF2E1, 0x880C, 0xF2E2, 0x880B, + 0xF2E3, 0x8806, 0xF2E4, 0x87FC, 0xF2E5, 0x8808, 0xF2E6, 0x87FF, + 0xF2E7, 0x880A, 0xF2E8, 0x8802, 0xF2E9, 0x8962, 0xF2EA, 0x895A, + 0xF2EB, 0x895B, 0xF2EC, 0x8957, 0xF2ED, 0x8961, 0xF2EE, 0x895C, + 0xF2EF, 0x8958, 0xF2F0, 0x895D, 0xF2F1, 0x8959, 0xF2F2, 0x8988, + 0xF2F3, 0x89B7, 0xF2F4, 0x89B6, 0xF2F5, 0x89F6, 0xF2F6, 0x8B50, + 0xF2F7, 0x8B48, 0xF2F8, 0x8B4A, 0xF2F9, 0x8B40, 0xF2FA, 0x8B53, + 0xF2FB, 0x8B56, 0xF2FC, 0x8B54, 0xF2FD, 0x8B4B, 0xF2FE, 0x8B55, + 0xF340, 0x8B51, 0xF341, 0x8B42, 0xF342, 0x8B52, 0xF343, 0x8B57, + 0xF344, 0x8C43, 0xF345, 0x8C77, 0xF346, 0x8C76, 0xF347, 0x8C9A, + 0xF348, 0x8D06, 0xF349, 0x8D07, 0xF34A, 0x8D09, 0xF34B, 0x8DAC, + 0xF34C, 0x8DAA, 0xF34D, 0x8DAD, 0xF34E, 0x8DAB, 0xF34F, 0x8E6D, + 0xF350, 0x8E78, 0xF351, 0x8E73, 0xF352, 0x8E6A, 0xF353, 0x8E6F, + 0xF354, 0x8E7B, 0xF355, 0x8EC2, 0xF356, 0x8F52, 0xF357, 0x8F51, + 0xF358, 0x8F4F, 0xF359, 0x8F50, 0xF35A, 0x8F53, 0xF35B, 0x8FB4, + 0xF35C, 0x9140, 0xF35D, 0x913F, 0xF35E, 0x91B0, 0xF35F, 0x91AD, + 0xF360, 0x93DE, 0xF361, 0x93C7, 0xF362, 0x93CF, 0xF363, 0x93C2, + 0xF364, 0x93DA, 0xF365, 0x93D0, 0xF366, 0x93F9, 0xF367, 0x93EC, + 0xF368, 0x93CC, 0xF369, 0x93D9, 0xF36A, 0x93A9, 0xF36B, 0x93E6, + 0xF36C, 0x93CA, 0xF36D, 0x93D4, 0xF36E, 0x93EE, 0xF36F, 0x93E3, + 0xF370, 0x93D5, 0xF371, 0x93C4, 0xF372, 0x93CE, 0xF373, 0x93C0, + 0xF374, 0x93D2, 0xF375, 0x93E7, 0xF376, 0x957D, 0xF377, 0x95DA, + 0xF378, 0x95DB, 0xF379, 0x96E1, 0xF37A, 0x9729, 0xF37B, 0x972B, + 0xF37C, 0x972C, 0xF37D, 0x9728, 0xF37E, 0x9726, 0xF3A1, 0x97B3, + 0xF3A2, 0x97B7, 0xF3A3, 0x97B6, 0xF3A4, 0x97DD, 0xF3A5, 0x97DE, + 0xF3A6, 0x97DF, 0xF3A7, 0x985C, 0xF3A8, 0x9859, 0xF3A9, 0x985D, + 0xF3AA, 0x9857, 0xF3AB, 0x98BF, 0xF3AC, 0x98BD, 0xF3AD, 0x98BB, + 0xF3AE, 0x98BE, 0xF3AF, 0x9948, 0xF3B0, 0x9947, 0xF3B1, 0x9943, + 0xF3B2, 0x99A6, 0xF3B3, 0x99A7, 0xF3B4, 0x9A1A, 0xF3B5, 0x9A15, + 0xF3B6, 0x9A25, 0xF3B7, 0x9A1D, 0xF3B8, 0x9A24, 0xF3B9, 0x9A1B, + 0xF3BA, 0x9A22, 0xF3BB, 0x9A20, 0xF3BC, 0x9A27, 0xF3BD, 0x9A23, + 0xF3BE, 0x9A1E, 0xF3BF, 0x9A1C, 0xF3C0, 0x9A14, 0xF3C1, 0x9AC2, + 0xF3C2, 0x9B0B, 0xF3C3, 0x9B0A, 0xF3C4, 0x9B0E, 0xF3C5, 0x9B0C, + 0xF3C6, 0x9B37, 0xF3C7, 0x9BEA, 0xF3C8, 0x9BEB, 0xF3C9, 0x9BE0, + 0xF3CA, 0x9BDE, 0xF3CB, 0x9BE4, 0xF3CC, 0x9BE6, 0xF3CD, 0x9BE2, + 0xF3CE, 0x9BF0, 0xF3CF, 0x9BD4, 0xF3D0, 0x9BD7, 0xF3D1, 0x9BEC, + 0xF3D2, 0x9BDC, 0xF3D3, 0x9BD9, 0xF3D4, 0x9BE5, 0xF3D5, 0x9BD5, + 0xF3D6, 0x9BE1, 0xF3D7, 0x9BDA, 0xF3D8, 0x9D77, 0xF3D9, 0x9D81, + 0xF3DA, 0x9D8A, 0xF3DB, 0x9D84, 0xF3DC, 0x9D88, 0xF3DD, 0x9D71, + 0xF3DE, 0x9D80, 0xF3DF, 0x9D78, 0xF3E0, 0x9D86, 0xF3E1, 0x9D8B, + 0xF3E2, 0x9D8C, 0xF3E3, 0x9D7D, 0xF3E4, 0x9D6B, 0xF3E5, 0x9D74, + 0xF3E6, 0x9D75, 0xF3E7, 0x9D70, 0xF3E8, 0x9D69, 0xF3E9, 0x9D85, + 0xF3EA, 0x9D73, 0xF3EB, 0x9D7B, 0xF3EC, 0x9D82, 0xF3ED, 0x9D6F, + 0xF3EE, 0x9D79, 0xF3EF, 0x9D7F, 0xF3F0, 0x9D87, 0xF3F1, 0x9D68, + 0xF3F2, 0x9E94, 0xF3F3, 0x9E91, 0xF3F4, 0x9EC0, 0xF3F5, 0x9EFC, + 0xF3F6, 0x9F2D, 0xF3F7, 0x9F40, 0xF3F8, 0x9F41, 0xF3F9, 0x9F4D, + 0xF3FA, 0x9F56, 0xF3FB, 0x9F57, 0xF3FC, 0x9F58, 0xF3FD, 0x5337, + 0xF3FE, 0x56B2, 0xF440, 0x56B5, 0xF441, 0x56B3, 0xF442, 0x58E3, + 0xF443, 0x5B45, 0xF444, 0x5DC6, 0xF445, 0x5DC7, 0xF446, 0x5EEE, + 0xF447, 0x5EEF, 0xF448, 0x5FC0, 0xF449, 0x5FC1, 0xF44A, 0x61F9, + 0xF44B, 0x6517, 0xF44C, 0x6516, 0xF44D, 0x6515, 0xF44E, 0x6513, + 0xF44F, 0x65DF, 0xF450, 0x66E8, 0xF451, 0x66E3, 0xF452, 0x66E4, + 0xF453, 0x6AF3, 0xF454, 0x6AF0, 0xF455, 0x6AEA, 0xF456, 0x6AE8, + 0xF457, 0x6AF9, 0xF458, 0x6AF1, 0xF459, 0x6AEE, 0xF45A, 0x6AEF, + 0xF45B, 0x703C, 0xF45C, 0x7035, 0xF45D, 0x702F, 0xF45E, 0x7037, + 0xF45F, 0x7034, 0xF460, 0x7031, 0xF461, 0x7042, 0xF462, 0x7038, + 0xF463, 0x703F, 0xF464, 0x703A, 0xF465, 0x7039, 0xF466, 0x7040, + 0xF467, 0x703B, 0xF468, 0x7033, 0xF469, 0x7041, 0xF46A, 0x7213, + 0xF46B, 0x7214, 0xF46C, 0x72A8, 0xF46D, 0x737D, 0xF46E, 0x737C, + 0xF46F, 0x74BA, 0xF470, 0x76AB, 0xF471, 0x76AA, 0xF472, 0x76BE, + 0xF473, 0x76ED, 0xF474, 0x77CC, 0xF475, 0x77CE, 0xF476, 0x77CF, + 0xF477, 0x77CD, 0xF478, 0x77F2, 0xF479, 0x7925, 0xF47A, 0x7923, + 0xF47B, 0x7927, 0xF47C, 0x7928, 0xF47D, 0x7924, 0xF47E, 0x7929, + 0xF4A1, 0x79B2, 0xF4A2, 0x7A6E, 0xF4A3, 0x7A6C, 0xF4A4, 0x7A6D, + 0xF4A5, 0x7AF7, 0xF4A6, 0x7C49, 0xF4A7, 0x7C48, 0xF4A8, 0x7C4A, + 0xF4A9, 0x7C47, 0xF4AA, 0x7C45, 0xF4AB, 0x7CEE, 0xF4AC, 0x7E7B, + 0xF4AD, 0x7E7E, 0xF4AE, 0x7E81, 0xF4AF, 0x7E80, 0xF4B0, 0x7FBA, + 0xF4B1, 0x7FFF, 0xF4B2, 0x8079, 0xF4B3, 0x81DB, 0xF4B4, 0x81D9, + 0xF4B5, 0x820B, 0xF4B6, 0x8268, 0xF4B7, 0x8269, 0xF4B8, 0x8622, + 0xF4B9, 0x85FF, 0xF4BA, 0x8601, 0xF4BB, 0x85FE, 0xF4BC, 0x861B, + 0xF4BD, 0x8600, 0xF4BE, 0x85F6, 0xF4BF, 0x8604, 0xF4C0, 0x8609, + 0xF4C1, 0x8605, 0xF4C2, 0x860C, 0xF4C3, 0x85FD, 0xF4C4, 0x8819, + 0xF4C5, 0x8810, 0xF4C6, 0x8811, 0xF4C7, 0x8817, 0xF4C8, 0x8813, + 0xF4C9, 0x8816, 0xF4CA, 0x8963, 0xF4CB, 0x8966, 0xF4CC, 0x89B9, + 0xF4CD, 0x89F7, 0xF4CE, 0x8B60, 0xF4CF, 0x8B6A, 0xF4D0, 0x8B5D, + 0xF4D1, 0x8B68, 0xF4D2, 0x8B63, 0xF4D3, 0x8B65, 0xF4D4, 0x8B67, + 0xF4D5, 0x8B6D, 0xF4D6, 0x8DAE, 0xF4D7, 0x8E86, 0xF4D8, 0x8E88, + 0xF4D9, 0x8E84, 0xF4DA, 0x8F59, 0xF4DB, 0x8F56, 0xF4DC, 0x8F57, + 0xF4DD, 0x8F55, 0xF4DE, 0x8F58, 0xF4DF, 0x8F5A, 0xF4E0, 0x908D, + 0xF4E1, 0x9143, 0xF4E2, 0x9141, 0xF4E3, 0x91B7, 0xF4E4, 0x91B5, + 0xF4E5, 0x91B2, 0xF4E6, 0x91B3, 0xF4E7, 0x940B, 0xF4E8, 0x9413, + 0xF4E9, 0x93FB, 0xF4EA, 0x9420, 0xF4EB, 0x940F, 0xF4EC, 0x9414, + 0xF4ED, 0x93FE, 0xF4EE, 0x9415, 0xF4EF, 0x9410, 0xF4F0, 0x9428, + 0xF4F1, 0x9419, 0xF4F2, 0x940D, 0xF4F3, 0x93F5, 0xF4F4, 0x9400, + 0xF4F5, 0x93F7, 0xF4F6, 0x9407, 0xF4F7, 0x940E, 0xF4F8, 0x9416, + 0xF4F9, 0x9412, 0xF4FA, 0x93FA, 0xF4FB, 0x9409, 0xF4FC, 0x93F8, + 0xF4FD, 0x940A, 0xF4FE, 0x93FF, 0xF540, 0x93FC, 0xF541, 0x940C, + 0xF542, 0x93F6, 0xF543, 0x9411, 0xF544, 0x9406, 0xF545, 0x95DE, + 0xF546, 0x95E0, 0xF547, 0x95DF, 0xF548, 0x972E, 0xF549, 0x972F, + 0xF54A, 0x97B9, 0xF54B, 0x97BB, 0xF54C, 0x97FD, 0xF54D, 0x97FE, + 0xF54E, 0x9860, 0xF54F, 0x9862, 0xF550, 0x9863, 0xF551, 0x985F, + 0xF552, 0x98C1, 0xF553, 0x98C2, 0xF554, 0x9950, 0xF555, 0x994E, + 0xF556, 0x9959, 0xF557, 0x994C, 0xF558, 0x994B, 0xF559, 0x9953, + 0xF55A, 0x9A32, 0xF55B, 0x9A34, 0xF55C, 0x9A31, 0xF55D, 0x9A2C, + 0xF55E, 0x9A2A, 0xF55F, 0x9A36, 0xF560, 0x9A29, 0xF561, 0x9A2E, + 0xF562, 0x9A38, 0xF563, 0x9A2D, 0xF564, 0x9AC7, 0xF565, 0x9ACA, + 0xF566, 0x9AC6, 0xF567, 0x9B10, 0xF568, 0x9B12, 0xF569, 0x9B11, + 0xF56A, 0x9C0B, 0xF56B, 0x9C08, 0xF56C, 0x9BF7, 0xF56D, 0x9C05, + 0xF56E, 0x9C12, 0xF56F, 0x9BF8, 0xF570, 0x9C40, 0xF571, 0x9C07, + 0xF572, 0x9C0E, 0xF573, 0x9C06, 0xF574, 0x9C17, 0xF575, 0x9C14, + 0xF576, 0x9C09, 0xF577, 0x9D9F, 0xF578, 0x9D99, 0xF579, 0x9DA4, + 0xF57A, 0x9D9D, 0xF57B, 0x9D92, 0xF57C, 0x9D98, 0xF57D, 0x9D90, + 0xF57E, 0x9D9B, 0xF5A1, 0x9DA0, 0xF5A2, 0x9D94, 0xF5A3, 0x9D9C, + 0xF5A4, 0x9DAA, 0xF5A5, 0x9D97, 0xF5A6, 0x9DA1, 0xF5A7, 0x9D9A, + 0xF5A8, 0x9DA2, 0xF5A9, 0x9DA8, 0xF5AA, 0x9D9E, 0xF5AB, 0x9DA3, + 0xF5AC, 0x9DBF, 0xF5AD, 0x9DA9, 0xF5AE, 0x9D96, 0xF5AF, 0x9DA6, + 0xF5B0, 0x9DA7, 0xF5B1, 0x9E99, 0xF5B2, 0x9E9B, 0xF5B3, 0x9E9A, + 0xF5B4, 0x9EE5, 0xF5B5, 0x9EE4, 0xF5B6, 0x9EE7, 0xF5B7, 0x9EE6, + 0xF5B8, 0x9F30, 0xF5B9, 0x9F2E, 0xF5BA, 0x9F5B, 0xF5BB, 0x9F60, + 0xF5BC, 0x9F5E, 0xF5BD, 0x9F5D, 0xF5BE, 0x9F59, 0xF5BF, 0x9F91, + 0xF5C0, 0x513A, 0xF5C1, 0x5139, 0xF5C2, 0x5298, 0xF5C3, 0x5297, + 0xF5C4, 0x56C3, 0xF5C5, 0x56BD, 0xF5C6, 0x56BE, 0xF5C7, 0x5B48, + 0xF5C8, 0x5B47, 0xF5C9, 0x5DCB, 0xF5CA, 0x5DCF, 0xF5CB, 0x5EF1, + 0xF5CC, 0x61FD, 0xF5CD, 0x651B, 0xF5CE, 0x6B02, 0xF5CF, 0x6AFC, + 0xF5D0, 0x6B03, 0xF5D1, 0x6AF8, 0xF5D2, 0x6B00, 0xF5D3, 0x7043, + 0xF5D4, 0x7044, 0xF5D5, 0x704A, 0xF5D6, 0x7048, 0xF5D7, 0x7049, + 0xF5D8, 0x7045, 0xF5D9, 0x7046, 0xF5DA, 0x721D, 0xF5DB, 0x721A, + 0xF5DC, 0x7219, 0xF5DD, 0x737E, 0xF5DE, 0x7517, 0xF5DF, 0x766A, + 0xF5E0, 0x77D0, 0xF5E1, 0x792D, 0xF5E2, 0x7931, 0xF5E3, 0x792F, + 0xF5E4, 0x7C54, 0xF5E5, 0x7C53, 0xF5E6, 0x7CF2, 0xF5E7, 0x7E8A, + 0xF5E8, 0x7E87, 0xF5E9, 0x7E88, 0xF5EA, 0x7E8B, 0xF5EB, 0x7E86, + 0xF5EC, 0x7E8D, 0xF5ED, 0x7F4D, 0xF5EE, 0x7FBB, 0xF5EF, 0x8030, + 0xF5F0, 0x81DD, 0xF5F1, 0x8618, 0xF5F2, 0x862A, 0xF5F3, 0x8626, + 0xF5F4, 0x861F, 0xF5F5, 0x8623, 0xF5F6, 0x861C, 0xF5F7, 0x8619, + 0xF5F8, 0x8627, 0xF5F9, 0x862E, 0xF5FA, 0x8621, 0xF5FB, 0x8620, + 0xF5FC, 0x8629, 0xF5FD, 0x861E, 0xF5FE, 0x8625, 0xF640, 0x8829, + 0xF641, 0x881D, 0xF642, 0x881B, 0xF643, 0x8820, 0xF644, 0x8824, + 0xF645, 0x881C, 0xF646, 0x882B, 0xF647, 0x884A, 0xF648, 0x896D, + 0xF649, 0x8969, 0xF64A, 0x896E, 0xF64B, 0x896B, 0xF64C, 0x89FA, + 0xF64D, 0x8B79, 0xF64E, 0x8B78, 0xF64F, 0x8B45, 0xF650, 0x8B7A, + 0xF651, 0x8B7B, 0xF652, 0x8D10, 0xF653, 0x8D14, 0xF654, 0x8DAF, + 0xF655, 0x8E8E, 0xF656, 0x8E8C, 0xF657, 0x8F5E, 0xF658, 0x8F5B, + 0xF659, 0x8F5D, 0xF65A, 0x9146, 0xF65B, 0x9144, 0xF65C, 0x9145, + 0xF65D, 0x91B9, 0xF65E, 0x943F, 0xF65F, 0x943B, 0xF660, 0x9436, + 0xF661, 0x9429, 0xF662, 0x943D, 0xF663, 0x943C, 0xF664, 0x9430, + 0xF665, 0x9439, 0xF666, 0x942A, 0xF667, 0x9437, 0xF668, 0x942C, + 0xF669, 0x9440, 0xF66A, 0x9431, 0xF66B, 0x95E5, 0xF66C, 0x95E4, + 0xF66D, 0x95E3, 0xF66E, 0x9735, 0xF66F, 0x973A, 0xF670, 0x97BF, + 0xF671, 0x97E1, 0xF672, 0x9864, 0xF673, 0x98C9, 0xF674, 0x98C6, + 0xF675, 0x98C0, 0xF676, 0x9958, 0xF677, 0x9956, 0xF678, 0x9A39, + 0xF679, 0x9A3D, 0xF67A, 0x9A46, 0xF67B, 0x9A44, 0xF67C, 0x9A42, + 0xF67D, 0x9A41, 0xF67E, 0x9A3A, 0xF6A1, 0x9A3F, 0xF6A2, 0x9ACD, + 0xF6A3, 0x9B15, 0xF6A4, 0x9B17, 0xF6A5, 0x9B18, 0xF6A6, 0x9B16, + 0xF6A7, 0x9B3A, 0xF6A8, 0x9B52, 0xF6A9, 0x9C2B, 0xF6AA, 0x9C1D, + 0xF6AB, 0x9C1C, 0xF6AC, 0x9C2C, 0xF6AD, 0x9C23, 0xF6AE, 0x9C28, + 0xF6AF, 0x9C29, 0xF6B0, 0x9C24, 0xF6B1, 0x9C21, 0xF6B2, 0x9DB7, + 0xF6B3, 0x9DB6, 0xF6B4, 0x9DBC, 0xF6B5, 0x9DC1, 0xF6B6, 0x9DC7, + 0xF6B7, 0x9DCA, 0xF6B8, 0x9DCF, 0xF6B9, 0x9DBE, 0xF6BA, 0x9DC5, + 0xF6BB, 0x9DC3, 0xF6BC, 0x9DBB, 0xF6BD, 0x9DB5, 0xF6BE, 0x9DCE, + 0xF6BF, 0x9DB9, 0xF6C0, 0x9DBA, 0xF6C1, 0x9DAC, 0xF6C2, 0x9DC8, + 0xF6C3, 0x9DB1, 0xF6C4, 0x9DAD, 0xF6C5, 0x9DCC, 0xF6C6, 0x9DB3, + 0xF6C7, 0x9DCD, 0xF6C8, 0x9DB2, 0xF6C9, 0x9E7A, 0xF6CA, 0x9E9C, + 0xF6CB, 0x9EEB, 0xF6CC, 0x9EEE, 0xF6CD, 0x9EED, 0xF6CE, 0x9F1B, + 0xF6CF, 0x9F18, 0xF6D0, 0x9F1A, 0xF6D1, 0x9F31, 0xF6D2, 0x9F4E, + 0xF6D3, 0x9F65, 0xF6D4, 0x9F64, 0xF6D5, 0x9F92, 0xF6D6, 0x4EB9, + 0xF6D7, 0x56C6, 0xF6D8, 0x56C5, 0xF6D9, 0x56CB, 0xF6DA, 0x5971, + 0xF6DB, 0x5B4B, 0xF6DC, 0x5B4C, 0xF6DD, 0x5DD5, 0xF6DE, 0x5DD1, + 0xF6DF, 0x5EF2, 0xF6E0, 0x6521, 0xF6E1, 0x6520, 0xF6E2, 0x6526, + 0xF6E3, 0x6522, 0xF6E4, 0x6B0B, 0xF6E5, 0x6B08, 0xF6E6, 0x6B09, + 0xF6E7, 0x6C0D, 0xF6E8, 0x7055, 0xF6E9, 0x7056, 0xF6EA, 0x7057, + 0xF6EB, 0x7052, 0xF6EC, 0x721E, 0xF6ED, 0x721F, 0xF6EE, 0x72A9, + 0xF6EF, 0x737F, 0xF6F0, 0x74D8, 0xF6F1, 0x74D5, 0xF6F2, 0x74D9, + 0xF6F3, 0x74D7, 0xF6F4, 0x766D, 0xF6F5, 0x76AD, 0xF6F6, 0x7935, + 0xF6F7, 0x79B4, 0xF6F8, 0x7A70, 0xF6F9, 0x7A71, 0xF6FA, 0x7C57, + 0xF6FB, 0x7C5C, 0xF6FC, 0x7C59, 0xF6FD, 0x7C5B, 0xF6FE, 0x7C5A, + 0xF740, 0x7CF4, 0xF741, 0x7CF1, 0xF742, 0x7E91, 0xF743, 0x7F4F, + 0xF744, 0x7F87, 0xF745, 0x81DE, 0xF746, 0x826B, 0xF747, 0x8634, + 0xF748, 0x8635, 0xF749, 0x8633, 0xF74A, 0x862C, 0xF74B, 0x8632, + 0xF74C, 0x8636, 0xF74D, 0x882C, 0xF74E, 0x8828, 0xF74F, 0x8826, + 0xF750, 0x882A, 0xF751, 0x8825, 0xF752, 0x8971, 0xF753, 0x89BF, + 0xF754, 0x89BE, 0xF755, 0x89FB, 0xF756, 0x8B7E, 0xF757, 0x8B84, + 0xF758, 0x8B82, 0xF759, 0x8B86, 0xF75A, 0x8B85, 0xF75B, 0x8B7F, + 0xF75C, 0x8D15, 0xF75D, 0x8E95, 0xF75E, 0x8E94, 0xF75F, 0x8E9A, + 0xF760, 0x8E92, 0xF761, 0x8E90, 0xF762, 0x8E96, 0xF763, 0x8E97, + 0xF764, 0x8F60, 0xF765, 0x8F62, 0xF766, 0x9147, 0xF767, 0x944C, + 0xF768, 0x9450, 0xF769, 0x944A, 0xF76A, 0x944B, 0xF76B, 0x944F, + 0xF76C, 0x9447, 0xF76D, 0x9445, 0xF76E, 0x9448, 0xF76F, 0x9449, + 0xF770, 0x9446, 0xF771, 0x973F, 0xF772, 0x97E3, 0xF773, 0x986A, + 0xF774, 0x9869, 0xF775, 0x98CB, 0xF776, 0x9954, 0xF777, 0x995B, + 0xF778, 0x9A4E, 0xF779, 0x9A53, 0xF77A, 0x9A54, 0xF77B, 0x9A4C, + 0xF77C, 0x9A4F, 0xF77D, 0x9A48, 0xF77E, 0x9A4A, 0xF7A1, 0x9A49, + 0xF7A2, 0x9A52, 0xF7A3, 0x9A50, 0xF7A4, 0x9AD0, 0xF7A5, 0x9B19, + 0xF7A6, 0x9B2B, 0xF7A7, 0x9B3B, 0xF7A8, 0x9B56, 0xF7A9, 0x9B55, + 0xF7AA, 0x9C46, 0xF7AB, 0x9C48, 0xF7AC, 0x9C3F, 0xF7AD, 0x9C44, + 0xF7AE, 0x9C39, 0xF7AF, 0x9C33, 0xF7B0, 0x9C41, 0xF7B1, 0x9C3C, + 0xF7B2, 0x9C37, 0xF7B3, 0x9C34, 0xF7B4, 0x9C32, 0xF7B5, 0x9C3D, + 0xF7B6, 0x9C36, 0xF7B7, 0x9DDB, 0xF7B8, 0x9DD2, 0xF7B9, 0x9DDE, + 0xF7BA, 0x9DDA, 0xF7BB, 0x9DCB, 0xF7BC, 0x9DD0, 0xF7BD, 0x9DDC, + 0xF7BE, 0x9DD1, 0xF7BF, 0x9DDF, 0xF7C0, 0x9DE9, 0xF7C1, 0x9DD9, + 0xF7C2, 0x9DD8, 0xF7C3, 0x9DD6, 0xF7C4, 0x9DF5, 0xF7C5, 0x9DD5, + 0xF7C6, 0x9DDD, 0xF7C7, 0x9EB6, 0xF7C8, 0x9EF0, 0xF7C9, 0x9F35, + 0xF7CA, 0x9F33, 0xF7CB, 0x9F32, 0xF7CC, 0x9F42, 0xF7CD, 0x9F6B, + 0xF7CE, 0x9F95, 0xF7CF, 0x9FA2, 0xF7D0, 0x513D, 0xF7D1, 0x5299, + 0xF7D2, 0x58E8, 0xF7D3, 0x58E7, 0xF7D4, 0x5972, 0xF7D5, 0x5B4D, + 0xF7D6, 0x5DD8, 0xF7D7, 0x882F, 0xF7D8, 0x5F4F, 0xF7D9, 0x6201, + 0xF7DA, 0x6203, 0xF7DB, 0x6204, 0xF7DC, 0x6529, 0xF7DD, 0x6525, + 0xF7DE, 0x6596, 0xF7DF, 0x66EB, 0xF7E0, 0x6B11, 0xF7E1, 0x6B12, + 0xF7E2, 0x6B0F, 0xF7E3, 0x6BCA, 0xF7E4, 0x705B, 0xF7E5, 0x705A, + 0xF7E6, 0x7222, 0xF7E7, 0x7382, 0xF7E8, 0x7381, 0xF7E9, 0x7383, + 0xF7EA, 0x7670, 0xF7EB, 0x77D4, 0xF7EC, 0x7C67, 0xF7ED, 0x7C66, + 0xF7EE, 0x7E95, 0xF7EF, 0x826C, 0xF7F0, 0x863A, 0xF7F1, 0x8640, + 0xF7F2, 0x8639, 0xF7F3, 0x863C, 0xF7F4, 0x8631, 0xF7F5, 0x863B, + 0xF7F6, 0x863E, 0xF7F7, 0x8830, 0xF7F8, 0x8832, 0xF7F9, 0x882E, + 0xF7FA, 0x8833, 0xF7FB, 0x8976, 0xF7FC, 0x8974, 0xF7FD, 0x8973, + 0xF7FE, 0x89FE, 0xF840, 0x8B8C, 0xF841, 0x8B8E, 0xF842, 0x8B8B, + 0xF843, 0x8B88, 0xF844, 0x8C45, 0xF845, 0x8D19, 0xF846, 0x8E98, + 0xF847, 0x8F64, 0xF848, 0x8F63, 0xF849, 0x91BC, 0xF84A, 0x9462, + 0xF84B, 0x9455, 0xF84C, 0x945D, 0xF84D, 0x9457, 0xF84E, 0x945E, + 0xF84F, 0x97C4, 0xF850, 0x97C5, 0xF851, 0x9800, 0xF852, 0x9A56, + 0xF853, 0x9A59, 0xF854, 0x9B1E, 0xF855, 0x9B1F, 0xF856, 0x9B20, + 0xF857, 0x9C52, 0xF858, 0x9C58, 0xF859, 0x9C50, 0xF85A, 0x9C4A, + 0xF85B, 0x9C4D, 0xF85C, 0x9C4B, 0xF85D, 0x9C55, 0xF85E, 0x9C59, + 0xF85F, 0x9C4C, 0xF860, 0x9C4E, 0xF861, 0x9DFB, 0xF862, 0x9DF7, + 0xF863, 0x9DEF, 0xF864, 0x9DE3, 0xF865, 0x9DEB, 0xF866, 0x9DF8, + 0xF867, 0x9DE4, 0xF868, 0x9DF6, 0xF869, 0x9DE1, 0xF86A, 0x9DEE, + 0xF86B, 0x9DE6, 0xF86C, 0x9DF2, 0xF86D, 0x9DF0, 0xF86E, 0x9DE2, + 0xF86F, 0x9DEC, 0xF870, 0x9DF4, 0xF871, 0x9DF3, 0xF872, 0x9DE8, + 0xF873, 0x9DED, 0xF874, 0x9EC2, 0xF875, 0x9ED0, 0xF876, 0x9EF2, + 0xF877, 0x9EF3, 0xF878, 0x9F06, 0xF879, 0x9F1C, 0xF87A, 0x9F38, + 0xF87B, 0x9F37, 0xF87C, 0x9F36, 0xF87D, 0x9F43, 0xF87E, 0x9F4F, + 0xF8A1, 0x9F71, 0xF8A2, 0x9F70, 0xF8A3, 0x9F6E, 0xF8A4, 0x9F6F, + 0xF8A5, 0x56D3, 0xF8A6, 0x56CD, 0xF8A7, 0x5B4E, 0xF8A8, 0x5C6D, + 0xF8A9, 0x652D, 0xF8AA, 0x66ED, 0xF8AB, 0x66EE, 0xF8AC, 0x6B13, + 0xF8AD, 0x705F, 0xF8AE, 0x7061, 0xF8AF, 0x705D, 0xF8B0, 0x7060, + 0xF8B1, 0x7223, 0xF8B2, 0x74DB, 0xF8B3, 0x74E5, 0xF8B4, 0x77D5, + 0xF8B5, 0x7938, 0xF8B6, 0x79B7, 0xF8B7, 0x79B6, 0xF8B8, 0x7C6A, + 0xF8B9, 0x7E97, 0xF8BA, 0x7F89, 0xF8BB, 0x826D, 0xF8BC, 0x8643, + 0xF8BD, 0x8838, 0xF8BE, 0x8837, 0xF8BF, 0x8835, 0xF8C0, 0x884B, + 0xF8C1, 0x8B94, 0xF8C2, 0x8B95, 0xF8C3, 0x8E9E, 0xF8C4, 0x8E9F, + 0xF8C5, 0x8EA0, 0xF8C6, 0x8E9D, 0xF8C7, 0x91BE, 0xF8C8, 0x91BD, + 0xF8C9, 0x91C2, 0xF8CA, 0x946B, 0xF8CB, 0x9468, 0xF8CC, 0x9469, + 0xF8CD, 0x96E5, 0xF8CE, 0x9746, 0xF8CF, 0x9743, 0xF8D0, 0x9747, + 0xF8D1, 0x97C7, 0xF8D2, 0x97E5, 0xF8D3, 0x9A5E, 0xF8D4, 0x9AD5, + 0xF8D5, 0x9B59, 0xF8D6, 0x9C63, 0xF8D7, 0x9C67, 0xF8D8, 0x9C66, + 0xF8D9, 0x9C62, 0xF8DA, 0x9C5E, 0xF8DB, 0x9C60, 0xF8DC, 0x9E02, + 0xF8DD, 0x9DFE, 0xF8DE, 0x9E07, 0xF8DF, 0x9E03, 0xF8E0, 0x9E06, + 0xF8E1, 0x9E05, 0xF8E2, 0x9E00, 0xF8E3, 0x9E01, 0xF8E4, 0x9E09, + 0xF8E5, 0x9DFF, 0xF8E6, 0x9DFD, 0xF8E7, 0x9E04, 0xF8E8, 0x9EA0, + 0xF8E9, 0x9F1E, 0xF8EA, 0x9F46, 0xF8EB, 0x9F74, 0xF8EC, 0x9F75, + 0xF8ED, 0x9F76, 0xF8EE, 0x56D4, 0xF8EF, 0x652E, 0xF8F0, 0x65B8, + 0xF8F1, 0x6B18, 0xF8F2, 0x6B19, 0xF8F3, 0x6B17, 0xF8F4, 0x6B1A, + 0xF8F5, 0x7062, 0xF8F6, 0x7226, 0xF8F7, 0x72AA, 0xF8F8, 0x77D8, + 0xF8F9, 0x77D9, 0xF8FA, 0x7939, 0xF8FB, 0x7C69, 0xF8FC, 0x7C6B, + 0xF8FD, 0x7CF6, 0xF8FE, 0x7E9A, 0xF940, 0x7E98, 0xF941, 0x7E9B, + 0xF942, 0x7E99, 0xF943, 0x81E0, 0xF944, 0x81E1, 0xF945, 0x8646, + 0xF946, 0x8647, 0xF947, 0x8648, 0xF948, 0x8979, 0xF949, 0x897A, + 0xF94A, 0x897C, 0xF94B, 0x897B, 0xF94C, 0x89FF, 0xF94D, 0x8B98, + 0xF94E, 0x8B99, 0xF94F, 0x8EA5, 0xF950, 0x8EA4, 0xF951, 0x8EA3, + 0xF952, 0x946E, 0xF953, 0x946D, 0xF954, 0x946F, 0xF955, 0x9471, + 0xF956, 0x9473, 0xF957, 0x9749, 0xF958, 0x9872, 0xF959, 0x995F, + 0xF95A, 0x9C68, 0xF95B, 0x9C6E, 0xF95C, 0x9C6D, 0xF95D, 0x9E0B, + 0xF95E, 0x9E0D, 0xF95F, 0x9E10, 0xF960, 0x9E0F, 0xF961, 0x9E12, + 0xF962, 0x9E11, 0xF963, 0x9EA1, 0xF964, 0x9EF5, 0xF965, 0x9F09, + 0xF966, 0x9F47, 0xF967, 0x9F78, 0xF968, 0x9F7B, 0xF969, 0x9F7A, + 0xF96A, 0x9F79, 0xF96B, 0x571E, 0xF96C, 0x7066, 0xF96D, 0x7C6F, + 0xF96E, 0x883C, 0xF96F, 0x8DB2, 0xF970, 0x8EA6, 0xF971, 0x91C3, + 0xF972, 0x9474, 0xF973, 0x9478, 0xF974, 0x9476, 0xF975, 0x9475, + 0xF976, 0x9A60, 0xF977, 0x9C74, 0xF978, 0x9C73, 0xF979, 0x9C71, + 0xF97A, 0x9C75, 0xF97B, 0x9E14, 0xF97C, 0x9E13, 0xF97D, 0x9EF6, + 0xF97E, 0x9F0A, 0xF9A1, 0x9FA4, 0xF9A2, 0x7068, 0xF9A3, 0x7065, + 0xF9A4, 0x7CF7, 0xF9A5, 0x866A, 0xF9A6, 0x883E, 0xF9A7, 0x883D, + 0xF9A8, 0x883F, 0xF9A9, 0x8B9E, 0xF9AA, 0x8C9C, 0xF9AB, 0x8EA9, + 0xF9AC, 0x8EC9, 0xF9AD, 0x974B, 0xF9AE, 0x9873, 0xF9AF, 0x9874, + 0xF9B0, 0x98CC, 0xF9B1, 0x9961, 0xF9B2, 0x99AB, 0xF9B3, 0x9A64, + 0xF9B4, 0x9A66, 0xF9B5, 0x9A67, 0xF9B6, 0x9B24, 0xF9B7, 0x9E15, + 0xF9B8, 0x9E17, 0xF9B9, 0x9F48, 0xF9BA, 0x6207, 0xF9BB, 0x6B1E, + 0xF9BC, 0x7227, 0xF9BD, 0x864C, 0xF9BE, 0x8EA8, 0xF9BF, 0x9482, + 0xF9C0, 0x9480, 0xF9C1, 0x9481, 0xF9C2, 0x9A69, 0xF9C3, 0x9A68, + 0xF9C4, 0x9B2E, 0xF9C5, 0x9E19, 0xF9C6, 0x7229, 0xF9C7, 0x864B, + 0xF9C8, 0x8B9F, 0xF9C9, 0x9483, 0xF9CA, 0x9C79, 0xF9CB, 0x9EB7, + 0xF9CC, 0x7675, 0xF9CD, 0x9A6B, 0xF9CE, 0x9C7A, 0xF9CF, 0x9E1D, + 0xF9D0, 0x7069, 0xF9D1, 0x706A, 0xF9D2, 0x9EA4, 0xF9D3, 0x9F7E, + 0xF9D4, 0x9F49, 0xF9D5, 0x9F98, 0xF9D6, 0x7881, 0xF9D7, 0x92B9, + 0xF9D8, 0x88CF, 0xF9D9, 0x58BB, 0xF9DA, 0x6052, 0xF9DB, 0x7CA7, + 0xF9DC, 0x5AFA, 0xF9DD, 0x2554, 0xF9DE, 0x2566, 0xF9DF, 0x2557, + 0xF9E0, 0x2560, 0xF9E1, 0x256C, 0xF9E2, 0x2563, 0xF9E3, 0x255A, + 0xF9E4, 0x2569, 0xF9E5, 0x255D, 0xF9E6, 0x2552, 0xF9E7, 0x2564, + 0xF9E8, 0x2555, 0xF9E9, 0x255E, 0xF9EA, 0x256A, 0xF9EB, 0x2561, + 0xF9EC, 0x2558, 0xF9ED, 0x2567, 0xF9EE, 0x255B, 0xF9EF, 0x2553, + 0xF9F0, 0x2565, 0xF9F1, 0x2556, 0xF9F2, 0x255F, 0xF9F3, 0x256B, + 0xF9F4, 0x2562, 0xF9F5, 0x2559, 0xF9F6, 0x2568, 0xF9F7, 0x255C, + 0xF9F8, 0x2551, 0xF9F9, 0x2550, 0xF9FA, 0x256D, 0xF9FB, 0x256E, + 0xF9FC, 0x2570, 0xF9FD, 0x256F, 0xF9FE, 0x2593, 0, 0 +}; + + + +WCHAR ff_convert ( /* Converted code, 0 means conversion error */ + WCHAR chr, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + const WCHAR *p; + WCHAR c; + int i, n, li, hi; + + + if (chr < 0x80) { /* ASCII */ + c = chr; + } else { + if (dir) { /* OEMCP to unicode */ + p = oem2uni; + hi = sizeof(oem2uni) / 4 - 1; + } else { /* Unicode to OEMCP */ + p = uni2oem; + hi = sizeof(uni2oem) / 4 - 1; + } + li = 0; + for (n = 16; n; n--) { + i = li + (hi - li) / 2; + if (chr == p[i * 2]) break; + if (chr > p[i * 2]) + li = i; + else + hi = i; + } + c = n ? p[i * 2 + 1] : 0; + } + + return c; +} + + + + +WCHAR ff_wtoupper ( /* Upper converted character */ + WCHAR chr /* Input character */ +) +{ + static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; + static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; + int i; + + + for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + + return tbl_lower[i] ? tbl_upper[i] : chr; +} diff --git a/third_party/fatfs/src/option/ccsbcs.c b/third_party/fatfs/src/option/ccsbcs.c new file mode 100644 index 0000000..d6897bc --- /dev/null +++ b/third_party/fatfs/src/option/ccsbcs.c @@ -0,0 +1,540 @@ +/*------------------------------------------------------------------------*/ +/* Unicode - Local code bidirectional converter (C)ChaN, 2012 */ +/* (SBCS code pages) */ +/*------------------------------------------------------------------------*/ +/* 437 U.S. (OEM) +/ 720 Arabic (OEM) +/ 1256 Arabic (Windows) +/ 737 Greek (OEM) +/ 1253 Greek (Windows) +/ 1250 Central Europe (Windows) +/ 775 Baltic (OEM) +/ 1257 Baltic (Windows) +/ 850 Multilingual Latin 1 (OEM) +/ 852 Latin 2 (OEM) +/ 1252 Latin 1 (Windows) +/ 855 Cyrillic (OEM) +/ 1251 Cyrillic (Windows) +/ 866 Russian (OEM) +/ 857 Turkish (OEM) +/ 1254 Turkish (Windows) +/ 858 Multilingual Latin 1 + Euro (OEM) +/ 862 Hebrew (OEM) +/ 1255 Hebrew (Windows) +/ 874 Thai (OEM, Windows) +/ 1258 Vietnam (OEM, Windows) +*/ + +#include "../ff.h" + + +#if _CODE_PAGE == 437 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP437(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, + 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 720 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP720(0x80-0xFF) to Unicode conversion table */ + 0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, + 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, + 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, + 0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 737 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP737(0x80-0xFF) to Unicode conversion table */ + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, + 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0, + 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, + 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, + 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, + 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, + 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E, + 0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 775 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP775(0x80-0xFF) to Unicode conversion table */ + 0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, + 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, + 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4, + 0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, + 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, + 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D, + 0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, + 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, + 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019, + 0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, + 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 850 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP850(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, + 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 852 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP852(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, + 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106, + 0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, + 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, + 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, + 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, + 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, + 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4, + 0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 855 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP855(0x80-0xFF) to Unicode conversion table */ + 0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, + 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408, + 0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, + 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A, + 0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, + 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, + 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, + 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580, + 0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, + 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116, + 0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, + 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 857 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP857(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, + 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 858 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP858(0x80-0xFF) to Unicode conversion table */ + 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, + 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5, + 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, + 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, + 0x00A9, 0x2563, 0x2551, 0x2557, 0x2550, 0x00A2, 0x00A5, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4, + 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x20AC, 0x00CD, 0x00CE, + 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00C6, 0x00CC, 0x2580, + 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, + 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4, + 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, + 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 862 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP862(0x80-0xFF) to Unicode conversion table */ + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192, + 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, + 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, + 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229, + 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 866 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP866(0x80-0xFF) to Unicode conversion table */ + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, + 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510, + 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, + 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567, + 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, + 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, + 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0 +}; + +#elif _CODE_PAGE == 874 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP874(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x0000, 0x0000, 0x0000, 0x2026, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, + 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, + 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, + 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, + 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, + 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, + 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, + 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F, + 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, + 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, + 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, + 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +#elif _CODE_PAGE == 1250 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1250(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, + 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, + 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, + 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, + 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 +}; + +#elif _CODE_PAGE == 1251 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1251(0x80-0xFF) to Unicode conversion table */ + 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, + 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, + 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2111, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, + 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, + 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, + 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, + 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F +}; + +#elif _CODE_PAGE == 1252 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1252(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF +}; + +#elif _CODE_PAGE == 1253 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1253(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x000C, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, + 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, + 0x03A8, 0x03A9, 0x03AA, 0x03AD, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000 +}; + +#elif _CODE_PAGE == 1254 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1254(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x210A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00BD, 0x00DC, 0x0130, 0x015E, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF +}; + +#elif _CODE_PAGE == 1255 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1255(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, + 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, + 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, + 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000 +}; + +#elif _CODE_PAGE == 1256 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1256(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, + 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, + 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, + 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, + 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0640, 0x0642, 0x0643, + 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, + 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, + 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2 +} + +#elif _CODE_PAGE == 1257 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1257(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000, + 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, + 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, + 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, + 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, + 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, + 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, + 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, + 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, + 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, + 0x0173, 0x014E, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9 +}; + +#elif _CODE_PAGE == 1258 +#define _TBLDEF 1 +static +const WCHAR Tbl[] = { /* CP1258(0x80-0xFF) to Unicode conversion table */ + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, + 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF, + 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF +}; + +#endif + + +#if !_TBLDEF || !_USE_LFN +#error This file is not needed in current configuration. Remove from the project. +#endif + + +WCHAR ff_convert ( /* Converted character, Returns zero on error */ + WCHAR chr, /* Character code to be converted */ + UINT dir /* 0: Unicode to OEMCP, 1: OEMCP to Unicode */ +) +{ + WCHAR c; + + + if (chr < 0x80) { /* ASCII */ + c = chr; + + } else { + if (dir) { /* OEMCP to Unicode */ + c = (chr >= 0x100) ? 0 : Tbl[chr - 0x80]; + + } else { /* Unicode to OEMCP */ + for (c = 0; c < 0x80; c++) { + if (chr == Tbl[c]) break; + } + c = (c + 0x80) & 0xFF; + } + } + + return c; +} + + +WCHAR ff_wtoupper ( /* Upper converted character */ + WCHAR chr /* Input character */ +) +{ + static const WCHAR tbl_lower[] = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xA1, 0x00A2, 0x00A3, 0x00A5, 0x00AC, 0x00AF, 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x0FF, 0x101, 0x103, 0x105, 0x107, 0x109, 0x10B, 0x10D, 0x10F, 0x111, 0x113, 0x115, 0x117, 0x119, 0x11B, 0x11D, 0x11F, 0x121, 0x123, 0x125, 0x127, 0x129, 0x12B, 0x12D, 0x12F, 0x131, 0x133, 0x135, 0x137, 0x13A, 0x13C, 0x13E, 0x140, 0x142, 0x144, 0x146, 0x148, 0x14B, 0x14D, 0x14F, 0x151, 0x153, 0x155, 0x157, 0x159, 0x15B, 0x15D, 0x15F, 0x161, 0x163, 0x165, 0x167, 0x169, 0x16B, 0x16D, 0x16F, 0x171, 0x173, 0x175, 0x177, 0x17A, 0x17C, 0x17E, 0x192, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x3CA, 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45E, 0x45F, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0 }; + static const WCHAR tbl_upper[] = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x21, 0xFFE0, 0xFFE1, 0xFFE5, 0xFFE2, 0xFFE3, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0x178, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, 0x130, 0x132, 0x134, 0x136, 0x139, 0x13B, 0x13D, 0x13F, 0x141, 0x143, 0x145, 0x147, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, 0x170, 0x172, 0x174, 0x176, 0x179, 0x17B, 0x17D, 0x191, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3AA, 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40E, 0x40F, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, 0x216C, 0x216D, 0x216E, 0x216F, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39, 0xFF3A, 0 }; + int i; + + + for (i = 0; tbl_lower[i] && chr != tbl_lower[i]; i++) ; + + return tbl_lower[i] ? tbl_upper[i] : chr; +} diff --git a/third_party/fatfs/src/option/syscall.c b/third_party/fatfs/src/option/syscall.c new file mode 100644 index 0000000..5a8839e --- /dev/null +++ b/third_party/fatfs/src/option/syscall.c @@ -0,0 +1,155 @@ +/*------------------------------------------------------------------------*/ +/* Sample code of OS dependent controls for FatFs */ +/* (C)ChaN, 2012 */ +/*------------------------------------------------------------------------*/ + +#include /* ANSI memory controls */ +#include /* ANSI memory controls */ + +#include "../ff.h" + + +#if _FS_REENTRANT +/*------------------------------------------------------------------------*/ +/* Create a Synchronization Object +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount function to create a new +/ synchronization object, such as semaphore and mutex. When a FALSE is +/ returned, the f_mount function fails with FR_INT_ERR. +*/ + +int ff_cre_syncobj ( /* 1:Function succeeded, 0:Could not create due to any error */ + BYTE vol, /* Corresponding logical drive being processed */ + _SYNC_t *sobj /* Pointer to return the created sync object */ +) +{ + int ret; +// static _SYNC_t sem[_VOLUMES]; /* FreeRTOS */ + + + *sobj = CreateMutex(NULL, FALSE, NULL); /* Win32 */ + ret = (*sobj != INVALID_HANDLE_VALUE); + +// *sobj = SyncObjects[vol]; /* uITRON (give a static created sync object) */ +// ret = 1; /* The initial value of the semaphore must be 1. */ + +// *sobj = OSMutexCreate(0, &err); /* uC/OS-II */ +// ret = (err == OS_NO_ERR); + +// if (!sem[vol]) /* FreeRTOS */ +// sem[vol] = xSemaphoreCreateMutex(); +// *sobj = sem[vol]; +// ret = (*sobj != NULL); + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Delete a Synchronization Object */ +/*------------------------------------------------------------------------*/ +/* This function is called in f_mount function to delete a synchronization +/ object that created with ff_cre_syncobj function. When a FALSE is +/ returned, the f_mount function fails with FR_INT_ERR. +*/ + +int ff_del_syncobj ( /* 1:Function succeeded, 0:Could not delete due to any error */ + _SYNC_t sobj /* Sync object tied to the logical drive to be deleted */ +) +{ + int ret; + + + ret = CloseHandle(sobj); /* Win32 */ + +// ret = 1; /* uITRON (nothing to do) */ + +// OSMutexDel(sobj, OS_DEL_ALWAYS, &err); /* uC/OS-II */ +// ret = (err == OS_NO_ERR); + +// ret = 1; /* FreeRTOS (nothing to do) */ + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Request Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on entering file functions to lock the volume. +/ When a FALSE is returned, the file function fails with FR_TIMEOUT. +*/ + +int ff_req_grant ( /* TRUE:Got a grant to access the volume, FALSE:Could not get a grant */ + _SYNC_t sobj /* Sync object to wait */ +) +{ + int ret; + + ret = (WaitForSingleObject(sobj, _FS_TIMEOUT) == WAIT_OBJECT_0); /* Win32 */ + +// ret = (wai_sem(sobj) == E_OK); /* uITRON */ + +// OSMutexPend(sobj, _FS_TIMEOUT, &err)); /* uC/OS-II */ +// ret = (err == OS_NO_ERR); + +// ret = (xSemaphoreTake(sobj, _FS_TIMEOUT) == pdTRUE); /* FreeRTOS */ + + return ret; +} + + + +/*------------------------------------------------------------------------*/ +/* Release Grant to Access the Volume */ +/*------------------------------------------------------------------------*/ +/* This function is called on leaving file functions to unlock the volume. +*/ + +void ff_rel_grant ( + _SYNC_t sobj /* Sync object to be signaled */ +) +{ + ReleaseMutex(sobj); /* Win32 */ + +// sig_sem(sobj); /* uITRON */ + +// OSMutexPost(sobj); /* uC/OS-II */ + +// xSemaphoreGive(sobj); /* FreeRTOS */ +} + +#endif + + + + +#if _USE_LFN == 3 /* LFN with a working buffer on the heap */ +/*------------------------------------------------------------------------*/ +/* Allocate a memory block */ +/*------------------------------------------------------------------------*/ +/* If a NULL is returned, the file function fails with FR_NOT_ENOUGH_CORE. +*/ + +void* ff_memalloc ( /* Returns pointer to the allocated memory block */ + UINT msize /* Number of bytes to allocate */ +) +{ + return malloc(msize); +} + + +/*------------------------------------------------------------------------*/ +/* Free a memory block */ +/*------------------------------------------------------------------------*/ + +void ff_memfree ( + void* mblock /* Pointer to the memory block to free */ +) +{ + free(mblock); +} + +#endif diff --git a/third_party/fatfs/src/option/unicode.c b/third_party/fatfs/src/option/unicode.c new file mode 100644 index 0000000..16a8d96 --- /dev/null +++ b/third_party/fatfs/src/option/unicode.c @@ -0,0 +1,17 @@ +#include "../ff.h" + +#if _USE_LFN != 0 + +#if _CODE_PAGE == 932 +#include "cc932.c" +#elif _CODE_PAGE == 936 +#include "cc936.c" +#elif _CODE_PAGE == 949 +#include "cc949.c" +#elif _CODE_PAGE == 950 +#include "cc950.c" +#else +#include "ccsbcs.c" +#endif + +#endif diff --git a/third_party/fonts/apl/AUTHORS b/third_party/fonts/apl/AUTHORS new file mode 100644 index 0000000..3f81410 --- /dev/null +++ b/third_party/fonts/apl/AUTHORS @@ -0,0 +1,14 @@ +AR PL New Sung +============================================= + +Current Maintainer(s): +------------------ +FireFly (firefly@firefly.idv.tw) - Design of the embedded bitmap fonts. + +Original Author/Designer: +------------------- +ARPHIC TECHNOLOGY CO., LTD - Develop of the original truetype font +TEL: 886-2-23512577 +FAX: 886-2-23511730 +ADDRESS: 13Fl.-1301, No. 88, Sec. 2, Jungshiau E. Rd., Taipei, 100 Taiwan + diff --git a/third_party/fonts/apl/COPYRIGHT b/third_party/fonts/apl/COPYRIGHT new file mode 100644 index 0000000..ec4fa2e --- /dev/null +++ b/third_party/fonts/apl/COPYRIGHT @@ -0,0 +1,172 @@ + Copyright (C) 1994-1999, Arphic Technology Co., Ltd. + Copyright (C) 1999-2004, Firefly and Arphic Technology Co., Ltd. + +Author/Designer: + Original author: + Arphic Technology Co., Ltd. + http://www.arphic.com.tw/ + + Modified by: + Firefly + http://firefly.idv.tw + +NOTICE: This Truetype font contains embedded bitmap fonts made + by firefly and is released as a whole + under the ARPHIC PUBLIC LICENSE. + There are also seperate bitmap fonts made by Firefly and + released under the GENERAL PUBLIC LICENSE (GPL): + http://www.study-area.org/apt/firefly-font/bitmaps/ + +Copyright: + (Copied from 'license/english/ARPHICPL.TXT'. + See 'license/big5/ARPHICPL.TXT' or 'license/gb/ARPHICPL.TXT' + for the Chinese version.) + +========================================================================== + +ARPHIC PUBLIC LICENSE + +Copyright (C) 1999 Arphic Technology Co., Ltd. +11Fl. No.168, Yung Chi Rd., Taipei, 110 Taiwan +All rights reserved except as specified below. + +Everyone is permitted to copy and distribute verbatim copies of this +license document, but changing it is forbidden. + +Preamble + + The licenses for most software are designed to take away your freedom +to share and change it. By contrast, the ARPHIC PUBLIC LICENSE +specifically permits and encourages you to use this software, provided +that you give the recipients all the rights that we gave you and make +sure they can get the modifications of this software. + +Legal Terms + +0. Definitions: + Throughout this License, "Font" means the TrueType fonts "AR PL +Mingti2L Big5", "AR PL KaitiM Big5" (BIG-5 character set) and "AR PL +SungtiL GB", "AR PL KaitiM GB" (GB character set) which are originally +distributed by Arphic, and the derivatives of those fonts created +through any modification including modifying glyph, reordering glyph, +converting format, changing font name, or adding/deleting some +characters in/from glyph table. + + "PL" means "Public License". + + "Copyright Holder" means whoever is named in the copyright or +copyrights for the Font. + + "You" means the licensee, or person copying, redistributing or +modifying the Font. + + "Freely Available" means that you have the freedom to copy or modify +the Font as well as redistribute copies of the Font under the same +conditions you received, not price. If you wish, you can charge for this +service. + +1. Copying & Distribution + You may copy and distribute verbatim copies of this Font in any +medium, without restriction, provided that you retain this license file +(ARPHICPL.TXT) unaltered in all copies. + +2. Modification + You may otherwise modify your copy of this Font in any way, including +modifying glyph, reordering glyph, converting format, changing font +name, or adding/deleting some characters in/from glyph table, and copy +and distribute such modifications under the terms of Section 1 above, +provided that the following conditions are met: + + a) You must insert a prominent notice in each modified file stating +how and when you changed that file. + + b) You must make such modifications Freely Available as a whole to +all third parties under the terms of this License, such as by offering +access to copy the modifications from a designated place, or +distributing the modifications on a medium customarily used for software +interchange. + + c) If the modified fonts normally reads commands interactively when +run, you must cause it, when started running for such interactive use in +the most ordinary way, to print or display an announcement including an +appropriate copyright notice and a notice that there is no warranty (or +else, saying that you provide a warranty) and that users may +redistribute the Font under these conditions, and telling the user how +to view a copy of this License. + + These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Font, and +can be reasonably considered independent and separate works in +themselves, then this License and its terms, do not apply to those +sections when you distribute them as separate works. Therefore, mere +aggregation of another work not based on the Font with the Font on a +volume of a storage or distribution medium does not bring the other work +under the scope of this License. + +3. Condition Subsequent + You may not copy, modify, sublicense, or distribute the Font except +as expressly provided under this License. Any attempt otherwise to copy, +modify, sublicense or distribute the Font will automatically +retroactively void your rights under this License. However, parties who +have received copies or rights from you under this License will keep +their licenses valid so long as such parties remain in full compliance. + +4. Acceptance + You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to copy, modify, +sublicense or distribute the Font. These actions are prohibited by law +if you do not accept this License. Therefore, by copying, modifying, +sublicensing or distributing the Font, you indicate your acceptance of +this License and all its terms and conditions. + +5. Automatic Receipt + Each time you redistribute the Font, the recipient automatically +receives a license from the original licensor to copy, distribute or +modify the Font subject to these terms and conditions. You may not +impose any further restrictions on the recipients' exercise of the +rights granted herein. You are not responsible for enforcing compliance +by third parties to this License. + +6. Contradiction + If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 distribute +so as to satisfy simultaneously your obligations under this License and +any other pertinent obligations, then as a consequence you may not +distribute the Font at all. For example, if a patent license would not +permit royalty-free redistribution of the Font by all those who receive +copies directly or indirectly through you, then the only way you could +satisfy both it and this License would be to refrain entirely from +distribution of the Font. + + If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +7. NO WARRANTY + BECAUSE THE FONT IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE FONT, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS OR OTHER PARTIES +PROVIDE THE FONT "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 FONT IS WITH YOU. SHOULD THE FONT +PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR +OR CORRECTION. + +8. DAMAGES WAIVER + UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, IN NO +EVENT WILL ANY COPYRIGHTT HOLDERS, OR OTHER PARTIES WHO MAY COPY, MODIFY +OR REDISTRIBUTE THE FONT AS PERMITTED ABOVE, BE LIABLE TO YOU FOR ANY +DIRECT, INDIRECT, CONSEQUENTIAL, INCIDENTAL, SPECIAL OR EXEMPLARY +DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE FONT (INCLUDING +BUT NOT LIMITED TO PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +USE, DATA OR PROFITS; OR BUSINESS INTERRUPTION), EVEN IF SUCH HOLDERS OR +OTHER PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +====================================================================== + + diff --git a/third_party/fonts/apl/Changelog b/third_party/fonts/apl/Changelog new file mode 100644 index 0000000..d75053e --- /dev/null +++ b/third_party/fonts/apl/Changelog @@ -0,0 +1,80 @@ +Filefly embedded bitmap font -- Public GPL version +Version 1.3.0: +-------------- + March 27, 2005 + * Finished 14-pixel(10.5 point) embedded bitmap font + + March 2, 2005 + *Added an outline glyph U+79CA and its corresponding bitmap word + *Corrected U+79BF(禿) error of ARPHIC. Proper is (上(禾) + 下(ㄦ)),original was (上(禾) + 下(几)) + *Corrected U+7B3B(笻) error of ARPHIC. Proper is (上(竹) + 左下(å·¥) + å³ä¸‹(ã„—)),origianl was (上(竹) + 左下(å·¥) + å³ä¸‹(é‚‘)) + + March 1, 2005 + *Corrected U+7921(礡) error of ARPHIC. Proper is (石 + 'è–„' take out æ°´),original was (石 + è–„) + + February 28, 2005 + *Added an outline glyph U+74E7 and its corresponding bitmap word + *Added an outline glyph U+751B and its corresponding bitmap word + *Added an outline glyph U+7523 and its corresponding bitmap word + *Added an outline glyph U+77B9 and its corresponding bitmap word + + February 26, 2005 + *Added an outline glyph U+7232 and its corresponding bitmap word + + February 24, 2005 + *Added an outline glyph U+5586 and its corresponding bitmap word + + February 23, 2005 + *Corrected U+4E1F(丟). The top is horizontal,not apostrophe character + *Added an outline glyph U+5803 and its corresponding bitmap word + * Merge COPYING and COPYRIGHT, and made the licese statement + clearly. + * Provide the url for GPLed version of firefly's bitmap fonts + in COPYRIGHT file. + * Added English and Chinese version APL files in license/ + + February 21, 2005 + *Added words U+FFE0ã€U+FFE1ã€U+FFE3ã€U+FFE4 + + February 20, 2005 + *Corrected U+6541(æ•) error of ARPHIC.Proper is (å  + æ”´),original was (å  + 支) + + February 15, 2005 + *Added words from U+F900 to U+FA6A. The total is 363 word (include TrueType and Bitmap ) + + February 14, 2005 + *Added words from U+2F00 to U+2FD5. The total is 214 word (include TrueType and Bitmap )。 + +Version 1.2.6: +-------------- + February 10, 2005 + * Addition U+02c9 TrueType glyph,GB2312 characters ,avoiding Fontconfig missing zh-cn Language tag. + * Add AUTHORS, COPYING, COPYRIGHT, Changelog, Changelog.big5 and fireflysung.ttf to a tarball file. + +Version 1.2.5: +-------------- + February 4, 2005 + * Perfect 12, 13, 14, 15, 16 pixel range from U+20 ~ U+7e to match the shape and width of TrueType + * Readjust 12-pixel(9-point) embedded bitmap font ( befort version 1.2.0 , the height of the font beyond one line) + * Corrected U+9462(é‘¢) error of ARPHIC, revised is (金 + æ…®), original was (金 + ç›§) + * Perfect other embedded bitmap font in detail + * Removed Vertical Metrics attribute to reduce the file to 16 Mbytes. Installer can easy to assemble + +Version 1.2.0: +-------------- + October 26, 2004 + * Finished 16-pixel(12-point) embedded bitmap font + * Use 13-pixel(10-point) embedded bitmap font to show 14-pixel(10.5-point) embedded bitmap font + * Fix the bug of the 20th bit of OS/2 table CodePageRange1 + +Version 1.1.0: +-------------- + September 1, 2004 + * Finished 15-pixel(11-point) embedded bitmap font + +Version 1.0.0: +-------------- + August 5, 2004 + * Finished 12-pixel(9-point) and 13-pixel(10-point) embedded bitmap fonts + +Firefly (firefly@firefly.idv.tw) diff --git a/third_party/fonts/apl/Changelog.big5 b/third_party/fonts/apl/Changelog.big5 new file mode 100644 index 0000000..d871fb1 --- /dev/null +++ b/third_party/fonts/apl/Changelog.big5 @@ -0,0 +1,71 @@ +¿Ã¤õ­¸»s§@¤º´OÂI°}¦r ¢w¢w GPL ¤½²³±ÂÅv + +Version 1.3.0: +-------------- + 2005 ¦~ 3 ¤ë 27 ¤é ¬P´Á¤é + * ¤º´O 14 ÂI(10.5pt) ÂI°}¦r»s§@§¹¦¨¡C + 2005 ¦~ 3 ¤ë 2 ¤é ¬P´Á¤T + * ·s¼W¤@­Ó¦V¶q¦r U+79CA¡A¥H¤Î¹ïÀ³ªºÂI°}¦r¡C + * ­×¥¿¤å¹©¿ù¦r U+79BF(¨r)¡A¥¿½TÀ³¬°(¤W(¥Ý) + ¤U(£·))¡A¤幩¼g¦¨ (¤W(¥Ý) + ¤U(¤L))¡C + * ­×¥¿¤å¹©¿ù¦r U+7B3B(Úß)¡A¥¿½TÀ³¬°(¤W(¦Ë) + ¥ª¤U(¤u) + ¥k¤U(£¨))¡A¤幩¼g¦¨ (¤W(¦Ë) + ¥ª¤U(¤u) + ¥k¤U(¨¶))¡C + 2005 ¦~ 3 ¤ë 1 ¤é ¬P´Á¤G + * ­×¥¿¤å¹©¿ù¦r U+7921(ò¡)¡A¥¿½TÀ³¬°(¥Û + 'Á¡'¥h±¼¤ô¦rÃä)¡A¤幩¼g¦¨ (¥Û + Á¡)¡C + 2005 ¦~ 2 ¤ë 28 ¤é ¬P´Á¤@ + * ·s¼W¤@­Ó¦V¶q¦r U+74E7¡A¥H¤Î¹ïÀ³ªºÂI°}¦r¡C + * ·s¼W¤@­Ó¦V¶q¦r U+751B¡A¥H¤Î¹ïÀ³ªºÂI°}¦r¡C + * ·s¼W¤@­Ó¦V¶q¦r U+7523¡A¥H¤Î¹ïÀ³ªºÂI°}¦r¡C + * ·s¼W¤@­Ó¦V¶q¦r U+77B9¡A¥H¤Î¹ïÀ³ªºÂI°}¦r¡C + 2005 ¦~ 2 ¤ë 26 ¤é ¬P´Á¤» + * ·s¼W¤@­Ó¦V¶q¦r U+7232¡A¥H¤Î¹ïÀ³ªºÂI°}¦r¡C + 2005 ¦~ 2 ¤ë 24 ¤é ¬P´Á¥| + * ·s¼W¤@­Ó¦V¶q¦r U+5586¡A¥H¤Î¹ïÀ³ªºÂI°}¦r¡C + 2005 ¦~ 2 ¤ë 23 ¤é ¬P´Á¤T + * ­×¥¿ U+4E1F(¥á)¡A³Ì¤W¤è¬O¤@¾î¡A¦Ó¤£¬O¤@ºJ¡C + * ·s¼W¤@­Ó¦V¶q¦r U+5803¡A¥H¤Î¹ïÀ³ªºÂI°}¦r¡C + * ±N COPYING¡BCOPYRIGHT ¦X¨Ö¨Ã¥B²M·¡»¡©ú±ÂÅv¤è¦¡¡C + * «ü¥X GPL ª© Firefly ÂI°}¦r¤U¸üºô§}¡C + * ¦b license/ ¥[¤J APL ­^¤åª©¡B¥¿Å餤¤åª©¡B²Å餤¤åª© + 2005 ¦~ 2 ¤ë 21 ¤é ¬P´Á¤@ + * 1.2.6 ª©º|±¼¤F U+FFE0¡BU+FFE1¡BU+FFE3¡BU+FFE4¡A³o¦^¸É¤W¡C + 2005 ¦~ 2 ¤ë 20 ¤é ¬P´Á¤é + * ­×¥¿¤å¹©¿ù¦r U+6541(Îç)¡A¥¿½TÀ³¬°(¥e + ÆÒ)¡A¤幩¼g¦¨ (¥e + ¤ä)¡C + 2005 ¦~ 2 ¤ë 15 ¤é ¬P´Á¤G + * ±q²{¦³¦r«¬¤º³¡¡A¬D¥X¦P§Î¦r¡A¸É¨¬ U+F900 ¡ã U+FA6A ¦@ 363 ­Ó¦r(¥]§t TrueType »P Bitmaps )¡C + 2005 ¦~ 2 ¤ë 14 ¤é ¬P´Á¤@ + * ±q²{¦³¦r«¬¤º³¡¡A¬D¥X¦P§Î¦r¡A¸É¨¬ U+2F00 ¡ã U+2FD5 ¦@ 214 ­Ó¦r(¥]§t TrueType »P Bitmaps )¡C + +Version 1.2.6: +-------------- + 2005 ¦~ 2 ¤ë 10 ¤é ¬P´Á¥| + * ¥[¤J U+02c9 TrueType ¦r²Å¡A¸É¨¬ GB2312 ½s½X¡AÁ×§K Fontconfig §ä¤£¨ì zh-cn ªº Language tag¡C + * ±N AUTHORS¡BCOPYING¡BCOPYRIGHT¡BChangelog¡BChangelog.big5 »P fireflysung.ttf ¥]¸Ë¦¨³æ¤@À£ÁYÀÉ¡A¤è«K¦U Linux µo¦æª©¥]¸Ë¡C + + Version 1.2.5: +-------------- + 2005 ¦~ 2 ¤ë 4 ¤é ¬P´Á¤­ + * ¥þ­±­×§ï 12¡B13¡B14¡B15¡B16 px ªº¥b§Î­^¼Æ¦r¡A¥H²Å¦X TrueType §Îª¬»P¼e«×¡C + * ­«·s»s§@ 12px ¤¤¤å¦r¡A1.2.0 ª©¤§«eªº 12px °ª«×¦h¤@¦C¡A©Ò¥H¬Ý°_¨Óªøªøªº¡A²{¤w­×¥¿¡C + * ­×¥¿¤å¹©¿ù¦r U+9462(øJ)¡A¥¿½TÀ³¬°(ª÷ + ¼{)¡A¤幩¼g¦¨ (ª÷ + ¿c)¡C + * ­×¥¿¨ä¥L¤@¨Ç¬Ý°_¨Ó¤ñ¨Ò¤£¤Ó¹ïºÙ©Î¤ÓÁ઺ÂI°}¦r¡C + * ²¾°£ Vertical Metrics ÄݩʡA¥HÁY´îÀɮפp©ó 16 Mbytes¡A¤è«KÅý Installer ¨Ï¥Î¡C + +Version 1.2.0: +-------------- + 2004 ¦~ 10 ¤ë 26 ¤é ¬P´Á¤G + * ¤º´O 16ÂI(12pt) ÂI°}¦r»s§@§¹¦¨¡C + * ¤º´O 14ÂI(10.5pt) ÂI°}¦r¥Î13ÂI(10pt)©è¥Î¡C + * ­×¥¿­ì¦r«¬¤º OS/2 table CodePageRange1 ²Ä 20 bit °ÝÃD¡C + +Version 1.1.0: +-------------- + 2004 ¦~ 9 ¤ë 1 ¤é ¬P´Á¤T + * ¤º´O 15ÂI(11pt) ÂI°}¦r»s§@§¹¦¨¡C + +Version 1.0.0: +-------------- + 2004 ¦~ 8 ¤ë 5 ¤é ¬P´Á¥| + * ¤º´O 12ÂI(9pt)¡B13ÂI(10pt) ÂI°}¦r»s§@§¹¦¨¡C + + +Firefly (firefly@firefly.idv.tw) + diff --git a/third_party/fonts/apl/apl_fonts.h b/third_party/fonts/apl/apl_fonts.h new file mode 100644 index 0000000..21987f6 --- /dev/null +++ b/third_party/fonts/apl/apl_fonts.h @@ -0,0 +1,27 @@ +//***************************************************************************** +// +// apl_fonts.h - Public header declaring prototypes for the various extended +// fonts found under third_party/fonts/apl. +// +//***************************************************************************** +#ifndef __APL_FONTS_H__ +#define __APL_FONTS_H__ + +//***************************************************************************** +// +// Unified Chinese/Japanese/Korean ideagraphs + ASCII. These fonts contain +// the first 256 ideographs from Unicode U+4E00 to U+0x4EFF range and are +// intended for format illustration purposes only. Binary fonts containing +// glyphs between U+4E00 and U+9FFF can be found in the binfonts subdirectory. +// +//***************************************************************************** +extern const unsigned char g_pucFireflysung6x12[]; +#define g_pFireflysung6x12 (const tFont *)g_pucFireflysung6x12 +extern const unsigned char g_pucFireflysung6x14[]; +#define g_pFireflysung6x14 (const tFont *)g_pucFireflysung6x14 +extern const unsigned char g_pucFireflysung7x14[]; +#define g_pFireflysung7x14 (const tFont *)g_pucFireflysung7x14 +extern const unsigned char g_pucFireflysung7x15[]; +#define g_pFireflysung7x15 (const tFont *)g_pucFireflysung7x15 + +#endif // __APL_FONTS_H__ diff --git a/third_party/fonts/apl/binfonts/fontfireflysung6x12.bin b/third_party/fonts/apl/binfonts/fontfireflysung6x12.bin new file mode 100644 index 0000000..3cce36c Binary files /dev/null and b/third_party/fonts/apl/binfonts/fontfireflysung6x12.bin differ diff --git a/third_party/fonts/apl/binfonts/fontfireflysung6x14.bin b/third_party/fonts/apl/binfonts/fontfireflysung6x14.bin new file mode 100644 index 0000000..0d2e0c0 Binary files /dev/null and b/third_party/fonts/apl/binfonts/fontfireflysung6x14.bin differ diff --git a/third_party/fonts/apl/binfonts/fontfireflysung7x14.bin b/third_party/fonts/apl/binfonts/fontfireflysung7x14.bin new file mode 100644 index 0000000..4ac7460 Binary files /dev/null and b/third_party/fonts/apl/binfonts/fontfireflysung7x14.bin differ diff --git a/third_party/fonts/apl/binfonts/fontfireflysung7x15.bin b/third_party/fonts/apl/binfonts/fontfireflysung7x15.bin new file mode 100644 index 0000000..0eae5bb Binary files /dev/null and b/third_party/fonts/apl/binfonts/fontfireflysung7x15.bin differ diff --git a/third_party/fonts/apl/fonts/fontfireflysung6x12.c b/third_party/fonts/apl/fonts/fontfireflysung6x12.c new file mode 100644 index 0000000..3e8b534 --- /dev/null +++ b/third_party/fonts/apl/fonts/fontfireflysung6x12.c @@ -0,0 +1,964 @@ +//***************************************************************************** +// +// fontfireflysung6x12.c - Font definition for the 6x12 Fireflysung font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from fireflysung-1.3.0 +// +// Copyright (C) 1994-1999, Arphic Technology Co., Ltd. +// Copyright (C) 1999-2004, Firefly and Arphic Technology Co., Ltd. +// +// Author/Designer: +// Original author: +// Arphic Technology Co., Ltd. +// http://www.arphic.com.tw/ +// +// Modified by: +// Firefly +// http://firefly.idv.tw +// +// Modified by: +// Texas Instruments Incorporated for use with TivaWare Graphics Library +// http://www.ti.com/tivaware +// +// NOTICE: This font contains embedded bitmap fonts made +// by firefly and is released as a whole +// under the ARPHIC PUBLIC LICENSE. +// +// Copyright: +// See 'license/english/ARPHICPL.TXT', 'license/big5/ARPHICPL.TXT' or +// 'license/gb/ARPHICPL.TXT'. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 351 in 2 blocks +// Style: fireflysung +// Size: 6x12 +// Bold: no +// Italic: no +// Memory usage: 7352 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Fireflysung6x12[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 11, + + // + // The height of the font. + // + 13, + + // + // The baseline of the font. + // + 11, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x4e00 - 0x4eff + // + 0x00, 0x4e, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, + 0x3c, 0x07, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x85, 0x01, 0x00, 0x00, // Offset 389 (0x185) + 0x8f, 0x01, 0x00, 0x00, // Offset 399 (0x18f) + 0xa5, 0x01, 0x00, 0x00, // Offset 421 (0x1a5) + 0xbb, 0x01, 0x00, 0x00, // Offset 443 (0x1bb) + 0xd8, 0x01, 0x00, 0x00, // Offset 472 (0x1d8) + 0xec, 0x01, 0x00, 0x00, // Offset 492 (0x1ec) + 0xf2, 0x01, 0x00, 0x00, // Offset 498 (0x1f2) + 0x01, 0x02, 0x00, 0x00, // Offset 513 (0x201) + 0x10, 0x02, 0x00, 0x00, // Offset 528 (0x210) + 0x1f, 0x02, 0x00, 0x00, // Offset 543 (0x21f) + 0x2a, 0x02, 0x00, 0x00, // Offset 554 (0x22a) + 0x30, 0x02, 0x00, 0x00, // Offset 560 (0x230) + 0x36, 0x02, 0x00, 0x00, // Offset 566 (0x236) + 0x3a, 0x02, 0x00, 0x00, // Offset 570 (0x23a) + 0x49, 0x02, 0x00, 0x00, // Offset 585 (0x249) + 0x59, 0x02, 0x00, 0x00, // Offset 601 (0x259) + 0x67, 0x02, 0x00, 0x00, // Offset 615 (0x267) + 0x75, 0x02, 0x00, 0x00, // Offset 629 (0x275) + 0x83, 0x02, 0x00, 0x00, // Offset 643 (0x283) + 0x95, 0x02, 0x00, 0x00, // Offset 661 (0x295) + 0xa3, 0x02, 0x00, 0x00, // Offset 675 (0x2a3) + 0xb3, 0x02, 0x00, 0x00, // Offset 691 (0x2b3) + 0xc0, 0x02, 0x00, 0x00, // Offset 704 (0x2c0) + 0xd1, 0x02, 0x00, 0x00, // Offset 721 (0x2d1) + 0xe1, 0x02, 0x00, 0x00, // Offset 737 (0x2e1) + 0xe6, 0x02, 0x00, 0x00, // Offset 742 (0x2e6) + 0xec, 0x02, 0x00, 0x00, // Offset 748 (0x2ec) + 0xfa, 0x02, 0x00, 0x00, // Offset 762 (0x2fa) + 0x01, 0x03, 0x00, 0x00, // Offset 769 (0x301) + 0x0f, 0x03, 0x00, 0x00, // Offset 783 (0x30f) + 0x1e, 0x03, 0x00, 0x00, // Offset 798 (0x31e) + 0x3a, 0x03, 0x00, 0x00, // Offset 826 (0x33a) + 0x4a, 0x03, 0x00, 0x00, // Offset 842 (0x34a) + 0x5d, 0x03, 0x00, 0x00, // Offset 861 (0x35d) + 0x6d, 0x03, 0x00, 0x00, // Offset 877 (0x36d) + 0x82, 0x03, 0x00, 0x00, // Offset 898 (0x382) + 0x92, 0x03, 0x00, 0x00, // Offset 914 (0x392) + 0xa2, 0x03, 0x00, 0x00, // Offset 930 (0x3a2) + 0xb3, 0x03, 0x00, 0x00, // Offset 947 (0x3b3) + 0xc9, 0x03, 0x00, 0x00, // Offset 969 (0x3c9) + 0xd6, 0x03, 0x00, 0x00, // Offset 982 (0x3d6) + 0xe5, 0x03, 0x00, 0x00, // Offset 997 (0x3e5) + 0xfb, 0x03, 0x00, 0x00, // Offset 1019 (0x3fb) + 0x09, 0x04, 0x00, 0x00, // Offset 1033 (0x409) + 0x23, 0x04, 0x00, 0x00, // Offset 1059 (0x423) + 0x35, 0x04, 0x00, 0x00, // Offset 1077 (0x435) + 0x43, 0x04, 0x00, 0x00, // Offset 1091 (0x443) + 0x53, 0x04, 0x00, 0x00, // Offset 1107 (0x453) + 0x62, 0x04, 0x00, 0x00, // Offset 1122 (0x462) + 0x76, 0x04, 0x00, 0x00, // Offset 1142 (0x476) + 0x83, 0x04, 0x00, 0x00, // Offset 1155 (0x483) + 0x92, 0x04, 0x00, 0x00, // Offset 1170 (0x492) + 0xa9, 0x04, 0x00, 0x00, // Offset 1193 (0x4a9) + 0xbe, 0x04, 0x00, 0x00, // Offset 1214 (0x4be) + 0xd6, 0x04, 0x00, 0x00, // Offset 1238 (0x4d6) + 0xeb, 0x04, 0x00, 0x00, // Offset 1259 (0x4eb) + 0xfe, 0x04, 0x00, 0x00, // Offset 1278 (0x4fe) + 0x0b, 0x05, 0x00, 0x00, // Offset 1291 (0x50b) + 0x19, 0x05, 0x00, 0x00, // Offset 1305 (0x519) + 0x26, 0x05, 0x00, 0x00, // Offset 1318 (0x526) + 0x34, 0x05, 0x00, 0x00, // Offset 1332 (0x534) + 0x3e, 0x05, 0x00, 0x00, // Offset 1342 (0x53e) + 0x43, 0x05, 0x00, 0x00, // Offset 1347 (0x543) + 0x4a, 0x05, 0x00, 0x00, // Offset 1354 (0x54a) + 0x59, 0x05, 0x00, 0x00, // Offset 1369 (0x559) + 0x6b, 0x05, 0x00, 0x00, // Offset 1387 (0x56b) + 0x77, 0x05, 0x00, 0x00, // Offset 1399 (0x577) + 0x89, 0x05, 0x00, 0x00, // Offset 1417 (0x589) + 0x94, 0x05, 0x00, 0x00, // Offset 1428 (0x594) + 0xa3, 0x05, 0x00, 0x00, // Offset 1443 (0x5a3) + 0xb5, 0x05, 0x00, 0x00, // Offset 1461 (0x5b5) + 0xca, 0x05, 0x00, 0x00, // Offset 1482 (0x5ca) + 0xd5, 0x05, 0x00, 0x00, // Offset 1493 (0x5d5) + 0xe2, 0x05, 0x00, 0x00, // Offset 1506 (0x5e2) + 0xf6, 0x05, 0x00, 0x00, // Offset 1526 (0x5f6) + 0x03, 0x06, 0x00, 0x00, // Offset 1539 (0x603) + 0x1c, 0x06, 0x00, 0x00, // Offset 1564 (0x61c) + 0x2e, 0x06, 0x00, 0x00, // Offset 1582 (0x62e) + 0x3c, 0x06, 0x00, 0x00, // Offset 1596 (0x63c) + 0x50, 0x06, 0x00, 0x00, // Offset 1616 (0x650) + 0x62, 0x06, 0x00, 0x00, // Offset 1634 (0x662) + 0x6f, 0x06, 0x00, 0x00, // Offset 1647 (0x66f) + 0x7a, 0x06, 0x00, 0x00, // Offset 1658 (0x67a) + 0x87, 0x06, 0x00, 0x00, // Offset 1671 (0x687) + 0x99, 0x06, 0x00, 0x00, // Offset 1689 (0x699) + 0xaa, 0x06, 0x00, 0x00, // Offset 1706 (0x6aa) + 0xc1, 0x06, 0x00, 0x00, // Offset 1729 (0x6c1) + 0xd2, 0x06, 0x00, 0x00, // Offset 1746 (0x6d2) + 0xe4, 0x06, 0x00, 0x00, // Offset 1764 (0x6e4) + 0xef, 0x06, 0x00, 0x00, // Offset 1775 (0x6ef) + 0xfe, 0x06, 0x00, 0x00, // Offset 1790 (0x6fe) + 0x01, 0x07, 0x00, 0x00, // Offset 1793 (0x701) + 0x11, 0x07, 0x00, 0x00, // Offset 1809 (0x711) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 7, 0, 11, 48, 4, 1, 23, 34, 10, 5, 2, + 18, 17, 34, 33, 0, 6, 48, 22, 6, 17, 33, 33, + 33, 33, 33, 22, 17, 33, 33, 33, 33, 33, 23, 33, + 33, 33, 33, 33, 224, 22, 6, 33, 68, 17, 17, 34, + 17, 49, 17, 67, 65, 17, 49, 34, 17, 34, 17, 33, + 20, 49, 144, 29, 6, 17, 50, 17, 34, 17, 17, 17, + 17, 17, 17, 18, 49, 17, 65, 17, 50, 17, 17, 17, + 17, 17, 17, 18, 33, 18, 49, 112, 20, 6, 130, 49, + 33, 33, 33, 33, 17, 65, 66, 49, 33, 18, 49, 17, + 49, 35, 17, 192, 6, 2, 2, 18, 240, 96, 15, 4, + 49, 33, 33, 49, 33, 49, 49, 49, 65, 49, 65, 65, + 64, 15, 4, 1, 65, 65, 49, 65, 49, 49, 49, 33, + 49, 33, 33, 112, 15, 5, 193, 33, 17, 17, 19, 49, + 51, 17, 17, 17, 33, 240, 112, 11, 5, 193, 65, 65, + 37, 33, 65, 65, 240, 112, 6, 2, 240, 20, 18, 48, + 6, 3, 240, 51, 240, 48, 4, 1, 146, 32, 15, 6, + 81, 81, 65, 81, 65, 81, 65, 81, 65, 81, 65, 81, + 176, 16, 6, 130, 49, 33, 17, 66, 66, 66, 66, 66, + 65, 17, 33, 50, 224, 14, 5, 113, 50, 33, 17, 65, + 65, 65, 65, 65, 65, 37, 160, 14, 6, 116, 17, 66, + 65, 81, 65, 65, 65, 65, 65, 71, 192, 14, 6, 116, + 17, 66, 65, 65, 50, 97, 98, 66, 65, 20, 208, 18, + 6, 161, 66, 49, 17, 49, 17, 33, 33, 33, 33, 17, + 49, 22, 65, 67, 192, 14, 5, 86, 65, 65, 18, 18, + 33, 65, 66, 50, 49, 19, 176, 16, 6, 131, 33, 50, + 81, 81, 19, 18, 50, 66, 65, 17, 49, 35, 208, 13, + 6, 103, 65, 81, 65, 81, 65, 81, 81, 81, 81, 224, + 17, 6, 116, 17, 66, 65, 17, 33, 50, 49, 33, 17, + 66, 66, 65, 20, 208, 16, 6, 115, 33, 49, 17, 66, + 66, 50, 19, 17, 82, 66, 49, 35, 224, 5, 1, 50, + 50, 48, 6, 2, 100, 100, 18, 48, 14, 6, 177, 65, + 65, 65, 65, 65, 97, 97, 97, 97, 97, 96, 7, 6, + 240, 150, 198, 240, 240, 14, 6, 97, 97, 97, 97, 97, + 97, 65, 65, 65, 65, 65, 176, 15, 6, 20, 17, 66, + 66, 65, 65, 65, 81, 65, 81, 177, 81, 144, 28, 7, + 35, 49, 49, 33, 18, 18, 17, 17, 19, 33, 19, 33, + 19, 33, 19, 33, 19, 17, 17, 17, 17, 17, 49, 49, + 51, 144, 16, 6, 130, 66, 66, 49, 33, 33, 33, 33, + 33, 23, 66, 67, 34, 192, 19, 6, 101, 33, 49, 17, + 49, 17, 49, 20, 33, 49, 17, 49, 17, 49, 17, 54, + 208, 16, 6, 130, 17, 17, 35, 66, 81, 81, 81, 81, + 65, 17, 49, 35, 208, 21, 6, 100, 49, 33, 33, 49, + 17, 49, 17, 49, 17, 49, 17, 49, 17, 49, 17, 33, + 20, 224, 16, 6, 102, 17, 49, 17, 81, 33, 36, 33, + 33, 33, 81, 81, 55, 192, 16, 6, 102, 17, 49, 17, + 81, 33, 36, 33, 33, 33, 81, 81, 67, 240, 17, 6, + 130, 17, 17, 35, 66, 81, 81, 51, 66, 65, 17, 34, + 34, 17, 192, 22, 7, 115, 19, 17, 49, 33, 49, 33, + 49, 37, 33, 49, 33, 49, 33, 49, 33, 49, 19, 19, + 224, 13, 3, 51, 17, 33, 33, 33, 33, 33, 33, 33, + 19, 96, 15, 6, 132, 65, 81, 81, 81, 81, 81, 17, + 49, 17, 49, 35, 224, 22, 7, 115, 18, 33, 33, 49, + 33, 49, 17, 67, 65, 17, 65, 33, 49, 33, 49, 49, + 19, 19, 224, 14, 6, 99, 65, 81, 81, 81, 81, 81, + 81, 49, 17, 55, 192, 26, 7, 129, 49, 33, 49, 33, + 49, 34, 18, 34, 18, 33, 17, 17, 33, 17, 17, 33, + 17, 17, 33, 49, 18, 35, 224, 18, 6, 97, 52, 51, + 50, 17, 34, 17, 34, 33, 18, 33, 18, 51, 52, 49, + 192, 14, 6, 116, 17, 66, 66, 66, 66, 66, 66, 66, + 65, 20, 208, 16, 6, 101, 33, 49, 17, 49, 17, 49, + 20, 33, 81, 81, 81, 67, 240, 15, 6, 116, 17, 66, + 66, 66, 66, 66, 69, 18, 50, 20, 97, 96, 20, 6, + 101, 33, 49, 17, 49, 17, 49, 20, 33, 17, 49, 33, + 33, 33, 33, 52, 33, 192, 13, 6, 116, 17, 66, 66, + 98, 98, 98, 66, 65, 20, 208, 15, 7, 120, 33, 33, + 49, 97, 97, 97, 97, 97, 97, 83, 240, 16, 23, 7, + 115, 19, 17, 49, 33, 49, 33, 49, 33, 49, 33, 49, + 33, 49, 33, 49, 33, 49, 51, 240, 16, 21, 7, 114, + 50, 17, 49, 33, 49, 33, 49, 49, 17, 65, 17, 65, + 17, 81, 97, 97, 240, 32, 24, 7, 114, 51, 82, 33, + 34, 33, 34, 17, 17, 18, 17, 17, 17, 17, 49, 33, + 49, 33, 49, 33, 49, 240, 21, 7, 114, 50, 17, 49, + 49, 17, 65, 17, 81, 97, 81, 17, 65, 17, 49, 49, + 18, 50, 224, 19, 7, 114, 50, 17, 49, 33, 49, 49, + 17, 65, 17, 81, 97, 97, 97, 83, 240, 16, 13, 6, + 103, 65, 81, 65, 65, 65, 65, 65, 66, 71, 192, 14, + 3, 4, 33, 33, 33, 33, 33, 33, 33, 33, 33, 35, + 48, 13, 5, 81, 65, 81, 65, 81, 65, 81, 65, 81, + 65, 160, 14, 3, 3, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 36, 48, 10, 5, 33, 49, 17, 17, 49, 0, + 6, 32, 5, 6, 0, 9, 6, 7, 3, 50, 33, 49, + 240, 192, 15, 6, 240, 163, 33, 49, 81, 36, 17, 49, + 17, 49, 35, 17, 192, 18, 6, 1, 81, 81, 81, 81, + 18, 34, 33, 17, 66, 66, 67, 33, 17, 18, 224, 12, + 6, 240, 179, 33, 50, 81, 81, 97, 49, 35, 208, 18, + 6, 81, 81, 81, 81, 34, 17, 17, 35, 66, 66, 65, + 17, 34, 34, 17, 192, 11, 6, 240, 164, 17, 66, 72, + 81, 65, 20, 208, 15, 6, 50, 49, 33, 33, 81, 53, + 49, 81, 81, 81, 81, 67, 224, 18, 7, 240, 242, 18, + 17, 33, 49, 33, 66, 65, 100, 33, 65, 17, 65, 36, + 32, 21, 7, 2, 97, 97, 97, 97, 18, 50, 33, 33, + 49, 33, 49, 33, 49, 33, 49, 19, 19, 224, 11, 3, + 65, 114, 33, 33, 33, 33, 33, 19, 96, 13, 4, 113, + 49, 98, 49, 49, 49, 49, 50, 34, 33, 18, 20, 6, + 2, 81, 81, 81, 81, 34, 17, 33, 33, 17, 50, 65, + 17, 49, 33, 19, 18, 192, 13, 3, 50, 33, 33, 33, + 33, 33, 33, 33, 33, 19, 96, 25, 6, 240, 145, 17, + 17, 33, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 192, 18, 7, 240, 210, + 18, 50, 33, 33, 49, 33, 49, 33, 49, 33, 49, 19, + 19, 224, 14, 6, 240, 178, 49, 33, 17, 66, 66, 65, + 17, 33, 50, 224, 20, 6, 240, 146, 18, 34, 33, 17, + 49, 17, 49, 17, 49, 18, 33, 17, 18, 33, 67, 48, + 18, 6, 240, 162, 19, 34, 17, 49, 17, 49, 17, 49, + 17, 34, 34, 17, 81, 67, 13, 6, 240, 146, 18, 34, + 33, 17, 81, 81, 81, 67, 240, 11, 5, 240, 99, 17, + 50, 83, 82, 49, 19, 176, 13, 6, 225, 81, 53, 49, + 81, 81, 81, 81, 33, 50, 208, 18, 7, 240, 210, 34, + 33, 49, 33, 49, 33, 49, 33, 49, 33, 34, 50, 18, + 224, 17, 7, 240, 211, 19, 17, 49, 33, 49, 49, 17, + 65, 17, 81, 97, 240, 32, 23, 7, 240, 210, 17, 18, + 17, 17, 17, 33, 17, 17, 33, 17, 17, 49, 17, 65, + 17, 65, 17, 240, 16, 17, 7, 240, 211, 19, 17, 49, + 49, 17, 81, 81, 17, 49, 49, 19, 19, 224, 18, 6, + 240, 146, 34, 17, 49, 17, 49, 33, 17, 49, 17, 65, + 81, 65, 50, 64, 11, 6, 240, 151, 65, 65, 65, 65, + 65, 55, 192, 15, 3, 33, 17, 33, 33, 33, 33, 17, + 33, 49, 33, 33, 33, 49, 3, 1, 13, 16, 3, 1, + 49, 33, 33, 33, 33, 49, 33, 17, 33, 33, 33, 17, + 32, 11, 5, 240, 97, 49, 17, 17, 49, 240, 240, 16, + // + // Block 1 Offsets: Codepoints 0x4e00 - 0x4eff + // + 0x00, 0x04, 0x00, 0x00, // Offset 1024 (0x400) + 0x09, 0x04, 0x00, 0x00, // Offset 1033 (0x409) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x1a, 0x04, 0x00, 0x00, // Offset 1050 (0x41a) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x2c, 0x04, 0x00, 0x00, // Offset 1068 (0x42c) + 0x43, 0x04, 0x00, 0x00, // Offset 1091 (0x443) + 0x59, 0x04, 0x00, 0x00, // Offset 1113 (0x459) + 0x66, 0x04, 0x00, 0x00, // Offset 1126 (0x466) + 0x77, 0x04, 0x00, 0x00, // Offset 1143 (0x477) + 0x8a, 0x04, 0x00, 0x00, // Offset 1162 (0x48a) + 0xa3, 0x04, 0x00, 0x00, // Offset 1187 (0x4a3) + 0xbb, 0x04, 0x00, 0x00, // Offset 1211 (0x4bb) + 0xcd, 0x04, 0x00, 0x00, // Offset 1229 (0x4cd) + 0xe3, 0x04, 0x00, 0x00, // Offset 1251 (0x4e3) + 0xf8, 0x04, 0x00, 0x00, // Offset 1272 (0x4f8) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x0f, 0x05, 0x00, 0x00, // Offset 1295 (0x50f) + 0x20, 0x05, 0x00, 0x00, // Offset 1312 (0x520) + 0x38, 0x05, 0x00, 0x00, // Offset 1336 (0x538) + 0x4f, 0x05, 0x00, 0x00, // Offset 1359 (0x54f) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x6d, 0x05, 0x00, 0x00, // Offset 1389 (0x56d) + 0x83, 0x05, 0x00, 0x00, // Offset 1411 (0x583) + 0xa0, 0x05, 0x00, 0x00, // Offset 1440 (0x5a0) + 0xc5, 0x05, 0x00, 0x00, // Offset 1477 (0x5c5) + 0xe1, 0x05, 0x00, 0x00, // Offset 1505 (0x5e1) + 0xfd, 0x05, 0x00, 0x00, // Offset 1533 (0x5fd) + 0x1a, 0x06, 0x00, 0x00, // Offset 1562 (0x61a) + 0x35, 0x06, 0x00, 0x00, // Offset 1589 (0x635) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x46, 0x06, 0x00, 0x00, // Offset 1606 (0x646) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x57, 0x06, 0x00, 0x00, // Offset 1623 (0x657) + 0x79, 0x06, 0x00, 0x00, // Offset 1657 (0x679) + 0x92, 0x06, 0x00, 0x00, // Offset 1682 (0x692) + 0xb2, 0x06, 0x00, 0x00, // Offset 1714 (0x6b2) + 0xd1, 0x06, 0x00, 0x00, // Offset 1745 (0x6d1) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xd4, 0x06, 0x00, 0x00, // Offset 1748 (0x6d4) + 0xe7, 0x06, 0x00, 0x00, // Offset 1767 (0x6e7) + 0xfa, 0x06, 0x00, 0x00, // Offset 1786 (0x6fa) + 0x0d, 0x07, 0x00, 0x00, // Offset 1805 (0x70d) + 0x26, 0x07, 0x00, 0x00, // Offset 1830 (0x726) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x40, 0x07, 0x00, 0x00, // Offset 1856 (0x740) + 0x52, 0x07, 0x00, 0x00, // Offset 1874 (0x752) + 0x72, 0x07, 0x00, 0x00, // Offset 1906 (0x772) + 0x89, 0x07, 0x00, 0x00, // Offset 1929 (0x789) + 0xa3, 0x07, 0x00, 0x00, // Offset 1955 (0x7a3) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xcc, 0x07, 0x00, 0x00, // Offset 1996 (0x7cc) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xd5, 0x07, 0x00, 0x00, // Offset 2005 (0x7d5) + 0xf0, 0x07, 0x00, 0x00, // Offset 2032 (0x7f0) + 0x0a, 0x08, 0x00, 0x00, // Offset 2058 (0x80a) + 0x25, 0x08, 0x00, 0x00, // Offset 2085 (0x825) + 0x37, 0x08, 0x00, 0x00, // Offset 2103 (0x837) + 0x52, 0x08, 0x00, 0x00, // Offset 2130 (0x852) + 0x79, 0x08, 0x00, 0x00, // Offset 2169 (0x879) + 0x96, 0x08, 0x00, 0x00, // Offset 2198 (0x896) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xa5, 0x08, 0x00, 0x00, // Offset 2213 (0x8a5) + 0xbe, 0x08, 0x00, 0x00, // Offset 2238 (0x8be) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xd9, 0x08, 0x00, 0x00, // Offset 2265 (0x8d9) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xf0, 0x08, 0x00, 0x00, // Offset 2288 (0x8f0) + 0x02, 0x09, 0x00, 0x00, // Offset 2306 (0x902) + 0x18, 0x09, 0x00, 0x00, // Offset 2328 (0x918) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x34, 0x09, 0x00, 0x00, // Offset 2356 (0x934) + 0x46, 0x09, 0x00, 0x00, // Offset 2374 (0x946) + 0x58, 0x09, 0x00, 0x00, // Offset 2392 (0x958) + 0x6d, 0x09, 0x00, 0x00, // Offset 2413 (0x96d) + 0x84, 0x09, 0x00, 0x00, // Offset 2436 (0x984) + 0x95, 0x09, 0x00, 0x00, // Offset 2453 (0x995) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xb1, 0x09, 0x00, 0x00, // Offset 2481 (0x9b1) + 0xc6, 0x09, 0x00, 0x00, // Offset 2502 (0x9c6) + 0xda, 0x09, 0x00, 0x00, // Offset 2522 (0x9da) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xf4, 0x09, 0x00, 0x00, // Offset 2548 (0x9f4) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x13, 0x0a, 0x00, 0x00, // Offset 2579 (0xa13) + 0x32, 0x0a, 0x00, 0x00, // Offset 2610 (0xa32) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x44, 0x0a, 0x00, 0x00, // Offset 2628 (0xa44) + 0x5e, 0x0a, 0x00, 0x00, // Offset 2654 (0xa5e) + 0x78, 0x0a, 0x00, 0x00, // Offset 2680 (0xa78) + 0x8b, 0x0a, 0x00, 0x00, // Offset 2699 (0xa8b) + 0xa8, 0x0a, 0x00, 0x00, // Offset 2728 (0xaa8) + 0xc0, 0x0a, 0x00, 0x00, // Offset 2752 (0xac0) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xd6, 0x0a, 0x00, 0x00, // Offset 2774 (0xad6) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xee, 0x0a, 0x00, 0x00, // Offset 2798 (0xaee) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x0e, 0x0b, 0x00, 0x00, // Offset 2830 (0xb0e) + 0x29, 0x0b, 0x00, 0x00, // Offset 2857 (0xb29) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x49, 0x0b, 0x00, 0x00, // Offset 2889 (0xb49) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x6b, 0x0b, 0x00, 0x00, // Offset 2923 (0xb6b) + 0x87, 0x0b, 0x00, 0x00, // Offset 2951 (0xb87) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xb0, 0x0b, 0x00, 0x00, // Offset 2992 (0xbb0) + 0xda, 0x0b, 0x00, 0x00, // Offset 3034 (0xbda) + 0x04, 0x0c, 0x00, 0x00, // Offset 3076 (0xc04) + 0x24, 0x0c, 0x00, 0x00, // Offset 3108 (0xc24) + 0x33, 0x0c, 0x00, 0x00, // Offset 3123 (0xc33) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x43, 0x0c, 0x00, 0x00, // Offset 3139 (0xc43) + 0x58, 0x0c, 0x00, 0x00, // Offset 3160 (0xc58) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x6e, 0x0c, 0x00, 0x00, // Offset 3182 (0xc6e) + 0x82, 0x0c, 0x00, 0x00, // Offset 3202 (0xc82) + 0x8b, 0x0c, 0x00, 0x00, // Offset 3211 (0xc8b) + 0x9c, 0x0c, 0x00, 0x00, // Offset 3228 (0xc9c) + 0xae, 0x0c, 0x00, 0x00, // Offset 3246 (0xcae) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xbe, 0x0c, 0x00, 0x00, // Offset 3262 (0xcbe) + 0xd2, 0x0c, 0x00, 0x00, // Offset 3282 (0xcd2) + 0xe5, 0x0c, 0x00, 0x00, // Offset 3301 (0xce5) + 0xfb, 0x0c, 0x00, 0x00, // Offset 3323 (0xcfb) + 0x10, 0x0d, 0x00, 0x00, // Offset 3344 (0xd10) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x29, 0x0d, 0x00, 0x00, // Offset 3369 (0xd29) + 0x3c, 0x0d, 0x00, 0x00, // Offset 3388 (0xd3c) + 0x56, 0x0d, 0x00, 0x00, // Offset 3414 (0xd56) + 0x78, 0x0d, 0x00, 0x00, // Offset 3448 (0xd78) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x95, 0x0d, 0x00, 0x00, // Offset 3477 (0xd95) + 0xb0, 0x0d, 0x00, 0x00, // Offset 3504 (0xdb0) + 0xd0, 0x0d, 0x00, 0x00, // Offset 3536 (0xdd0) + 0xdb, 0x0d, 0x00, 0x00, // Offset 3547 (0xddb) + 0xec, 0x0d, 0x00, 0x00, // Offset 3564 (0xdec) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x02, 0x0e, 0x00, 0x00, // Offset 3586 (0xe02) + 0x1c, 0x0e, 0x00, 0x00, // Offset 3612 (0xe1c) + 0x35, 0x0e, 0x00, 0x00, // Offset 3637 (0xe35) + 0x56, 0x0e, 0x00, 0x00, // Offset 3670 (0xe56) + 0x69, 0x0e, 0x00, 0x00, // Offset 3689 (0xe69) + 0x78, 0x0e, 0x00, 0x00, // Offset 3704 (0xe78) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x90, 0x0e, 0x00, 0x00, // Offset 3728 (0xe90) + 0xa0, 0x0e, 0x00, 0x00, // Offset 3744 (0xea0) + 0xb7, 0x0e, 0x00, 0x00, // Offset 3767 (0xeb7) + 0xc8, 0x0e, 0x00, 0x00, // Offset 3784 (0xec8) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xdd, 0x0e, 0x00, 0x00, // Offset 3805 (0xedd) + 0xf6, 0x0e, 0x00, 0x00, // Offset 3830 (0xef6) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x07, 0x0f, 0x00, 0x00, // Offset 3847 (0xf07) + 0x29, 0x0f, 0x00, 0x00, // Offset 3881 (0xf29) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x3f, 0x0f, 0x00, 0x00, // Offset 3903 (0xf3f) + 0x5b, 0x0f, 0x00, 0x00, // Offset 3931 (0xf5b) + 0x6e, 0x0f, 0x00, 0x00, // Offset 3950 (0xf6e) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x7e, 0x0f, 0x00, 0x00, // Offset 3966 (0xf7e) + 0x9c, 0x0f, 0x00, 0x00, // Offset 3996 (0xf9c) + 0xb7, 0x0f, 0x00, 0x00, // Offset 4023 (0xfb7) + 0xcb, 0x0f, 0x00, 0x00, // Offset 4043 (0xfcb) + 0xf1, 0x0f, 0x00, 0x00, // Offset 4081 (0xff1) + 0x0e, 0x10, 0x00, 0x00, // Offset 4110 (0x100e) + 0x2a, 0x10, 0x00, 0x00, // Offset 4138 (0x102a) + 0x4c, 0x10, 0x00, 0x00, // Offset 4172 (0x104c) + 0x6d, 0x10, 0x00, 0x00, // Offset 4205 (0x106d) + 0x93, 0x10, 0x00, 0x00, // Offset 4243 (0x1093) + 0xb8, 0x10, 0x00, 0x00, // Offset 4280 (0x10b8) + 0xdf, 0x10, 0x00, 0x00, // Offset 4319 (0x10df) + 0xf5, 0x10, 0x00, 0x00, // Offset 4341 (0x10f5) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x10, 0x11, 0x00, 0x00, // Offset 4368 (0x1110) + 0x38, 0x11, 0x00, 0x00, // Offset 4408 (0x1138) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x57, 0x11, 0x00, 0x00, // Offset 4439 (0x1157) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x70, 0x11, 0x00, 0x00, // Offset 4464 (0x1170) + 0x8a, 0x11, 0x00, 0x00, // Offset 4490 (0x118a) + 0xa8, 0x11, 0x00, 0x00, // Offset 4520 (0x11a8) + 0xc4, 0x11, 0x00, 0x00, // Offset 4548 (0x11c4) + 0xed, 0x11, 0x00, 0x00, // Offset 4589 (0x11ed) + 0x0f, 0x12, 0x00, 0x00, // Offset 4623 (0x120f) + 0x2f, 0x12, 0x00, 0x00, // Offset 4655 (0x122f) + 0x59, 0x12, 0x00, 0x00, // Offset 4697 (0x1259) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x75, 0x12, 0x00, 0x00, // Offset 4725 (0x1275) + 0x91, 0x12, 0x00, 0x00, // Offset 4753 (0x1291) + 0xa4, 0x12, 0x00, 0x00, // Offset 4772 (0x12a4) + 0xcc, 0x12, 0x00, 0x00, // Offset 4812 (0x12cc) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xe8, 0x12, 0x00, 0x00, // Offset 4840 (0x12e8) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x07, 0x13, 0x00, 0x00, // Offset 4871 (0x1307) + 0x28, 0x13, 0x00, 0x00, // Offset 4904 (0x1328) + 0x3c, 0x13, 0x00, 0x00, // Offset 4924 (0x133c) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x5d, 0x13, 0x00, 0x00, // Offset 4957 (0x135d) + 0x70, 0x13, 0x00, 0x00, // Offset 4976 (0x1370) + 0x8b, 0x13, 0x00, 0x00, // Offset 5003 (0x138b) + 0xb2, 0x13, 0x00, 0x00, // Offset 5042 (0x13b2) + 0xd4, 0x13, 0x00, 0x00, // Offset 5076 (0x13d4) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xfb, 0x13, 0x00, 0x00, // Offset 5115 (0x13fb) + 0x27, 0x14, 0x00, 0x00, // Offset 5159 (0x1427) + 0x47, 0x14, 0x00, 0x00, // Offset 5191 (0x1447) + 0x6a, 0x14, 0x00, 0x00, // Offset 5226 (0x146a) + 0x93, 0x14, 0x00, 0x00, // Offset 5267 (0x1493) + 0xb6, 0x14, 0x00, 0x00, // Offset 5302 (0x14b6) + 0xd3, 0x14, 0x00, 0x00, // Offset 5331 (0x14d3) + 0xf2, 0x14, 0x00, 0x00, // Offset 5362 (0x14f2) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x17, 0x15, 0x00, 0x00, // Offset 5399 (0x1517) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x34, 0x15, 0x00, 0x00, // Offset 5428 (0x1534) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x59, 0x15, 0x00, 0x00, // Offset 5465 (0x1559) + + // + // Block 1 Data: Codepoints 0x4e00 - 0x4eff + // + 9, 12, 0, 7, 33, 28, 0, 10, 64, 17, 12, 161, + 28, 97, 177, 177, 177, 177, 177, 177, 129, 33, 147, 161, + 240, 48, 18, 12, 81, 177, 177, 177, 51, 84, 54, 177, + 177, 177, 177, 81, 81, 81, 102, 192, 23, 12, 161, 28, + 65, 177, 183, 81, 81, 81, 81, 81, 81, 65, 97, 49, + 49, 49, 33, 83, 33, 113, 240, 22, 12, 113, 177, 177, + 33, 28, 113, 113, 49, 113, 49, 129, 17, 161, 161, 17, + 114, 50, 50, 115, 192, 13, 12, 145, 58, 240, 240, 241, + 88, 0, 6, 1, 28, 192, 17, 12, 81, 177, 177, 177, + 49, 118, 97, 177, 177, 177, 177, 177, 65, 28, 192, 19, + 12, 161, 28, 81, 177, 178, 161, 18, 129, 34, 113, 49, + 113, 177, 177, 177, 240, 48, 25, 12, 161, 28, 65, 49, + 113, 49, 113, 49, 113, 49, 113, 49, 113, 49, 97, 65, + 97, 65, 81, 81, 50, 97, 240, 24, 12, 161, 28, 97, + 161, 177, 33, 114, 49, 81, 17, 65, 49, 33, 66, 17, + 49, 82, 65, 177, 177, 240, 48, 18, 12, 49, 177, 97, + 73, 33, 177, 170, 177, 24, 33, 177, 113, 49, 131, 161, + 240, 22, 12, 12, 81, 177, 65, 49, 39, 33, 33, 65, + 33, 49, 65, 42, 177, 177, 97, 65, 116, 161, 240, 21, + 12, 12, 97, 129, 33, 129, 37, 65, 33, 113, 49, 49, + 43, 161, 177, 113, 49, 131, 161, 240, 23, 12, 129, 73, + 97, 49, 113, 49, 113, 49, 113, 49, 72, 97, 65, 97, + 65, 97, 65, 97, 65, 60, 192, 17, 12, 81, 49, 58, + 97, 177, 65, 28, 65, 167, 161, 161, 131, 193, 193, 240, + 24, 12, 39, 81, 81, 81, 81, 81, 81, 87, 81, 81, + 81, 81, 87, 81, 81, 81, 81, 81, 81, 17, 28, 192, + 23, 12, 145, 43, 97, 177, 162, 145, 17, 33, 81, 33, + 49, 49, 49, 65, 97, 65, 97, 177, 65, 28, 192, 30, + 12, 81, 49, 65, 33, 49, 65, 33, 49, 44, 33, 33, + 49, 65, 33, 49, 65, 33, 49, 65, 37, 65, 33, 49, + 65, 177, 113, 73, 192, 22, 12, 129, 81, 67, 69, 113, + 177, 97, 73, 49, 65, 97, 65, 97, 65, 97, 65, 97, + 65, 76, 192, 29, 12, 161, 28, 97, 177, 107, 17, 65, + 65, 17, 66, 49, 17, 49, 33, 33, 17, 33, 65, 17, + 17, 17, 113, 17, 115, 17, 129, 208, 37, 12, 65, 33, + 129, 33, 129, 33, 65, 49, 33, 33, 17, 49, 33, 33, + 33, 33, 33, 17, 49, 33, 33, 17, 65, 17, 34, 81, + 17, 33, 129, 33, 129, 33, 33, 28, 192, 28, 12, 49, + 65, 97, 65, 97, 65, 97, 65, 98, 49, 81, 33, 33, + 81, 50, 17, 65, 65, 33, 33, 65, 66, 50, 81, 204, + 192, 28, 12, 65, 177, 81, 28, 49, 33, 113, 49, 33, + 58, 113, 129, 33, 33, 81, 33, 33, 65, 49, 49, 33, + 35, 51, 65, 81, 192, 29, 12, 49, 81, 65, 81, 81, + 81, 65, 33, 33, 33, 33, 17, 49, 17, 36, 36, 65, + 81, 65, 81, 81, 18, 33, 37, 52, 236, 192, 27, 12, + 26, 161, 161, 53, 18, 33, 65, 33, 33, 81, 33, 17, + 97, 33, 17, 81, 49, 34, 33, 35, 51, 65, 81, 204, + 192, 17, 12, 161, 43, 97, 177, 121, 113, 177, 92, 81, + 161, 81, 28, 18, 129, 192, 17, 12, 131, 39, 161, 177, + 106, 113, 177, 92, 65, 161, 97, 28, 18, 129, 192, 34, + 12, 161, 28, 65, 33, 90, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 34, 18, 17, 33, 17, 34, 18, 34, 49, + 49, 33, 49, 65, 33, 99, 33, 113, 224, 25, 12, 27, + 33, 33, 17, 33, 65, 17, 17, 33, 65, 17, 17, 17, + 59, 17, 177, 177, 177, 177, 177, 161, 240, 128, 32, 12, + 33, 82, 82, 49, 113, 33, 76, 65, 33, 129, 33, 33, + 33, 33, 33, 33, 49, 17, 33, 17, 65, 17, 33, 17, + 97, 33, 129, 33, 76, 192, 31, 12, 81, 177, 49, 43, + 49, 33, 33, 97, 17, 17, 76, 33, 33, 65, 49, 33, + 49, 65, 49, 17, 81, 33, 17, 97, 17, 50, 36, 98, + 192, 3, 1, 12, 19, 12, 82, 145, 33, 98, 66, 34, + 130, 97, 177, 177, 177, 177, 177, 177, 177, 240, 32, 19, + 10, 1, 114, 17, 97, 49, 65, 65, 49, 129, 145, 145, + 145, 145, 145, 145, 145, 224, 19, 5, 65, 17, 33, 33, + 17, 33, 17, 65, 65, 33, 19, 34, 49, 65, 65, 65, + 80, 25, 12, 81, 177, 97, 65, 65, 29, 65, 65, 17, + 65, 65, 17, 65, 65, 27, 17, 65, 65, 97, 177, 177, + 240, 48, 26, 12, 9, 97, 65, 97, 65, 97, 65, 70, + 17, 97, 65, 97, 65, 57, 81, 81, 33, 33, 97, 17, + 17, 131, 161, 192, 18, 11, 81, 161, 49, 27, 81, 161, + 105, 97, 161, 49, 27, 81, 161, 161, 240, 16, 32, 10, + 49, 33, 97, 33, 49, 33, 33, 34, 33, 33, 34, 33, + 33, 34, 33, 33, 37, 37, 33, 33, 33, 49, 33, 81, + 49, 65, 65, 49, 81, 208, 23, 12, 81, 177, 49, 58, + 33, 49, 49, 57, 113, 65, 29, 65, 65, 27, 17, 65, + 65, 97, 177, 240, 48, 26, 11, 65, 17, 129, 17, 89, + 33, 33, 17, 33, 41, 81, 17, 76, 49, 17, 61, 49, + 17, 49, 49, 33, 82, 49, 240, 41, 12, 33, 49, 113, + 33, 65, 17, 17, 40, 17, 17, 113, 18, 49, 65, 17, + 81, 49, 17, 23, 17, 17, 17, 33, 33, 17, 17, 17, + 33, 33, 49, 17, 33, 33, 49, 23, 49, 17, 81, 208, + 9, 4, 193, 65, 65, 65, 49, 240, 80, 27, 12, 65, + 177, 177, 33, 88, 113, 33, 97, 17, 33, 114, 33, 129, + 33, 113, 17, 17, 97, 65, 49, 17, 81, 50, 116, 192, + 26, 12, 145, 88, 65, 81, 81, 33, 33, 81, 49, 17, + 81, 81, 59, 49, 81, 81, 81, 81, 81, 65, 97, 34, + 82, 240, 27, 11, 81, 113, 33, 129, 17, 161, 49, 27, + 65, 65, 81, 65, 81, 17, 33, 65, 49, 17, 65, 81, + 49, 97, 18, 82, 208, 18, 11, 65, 177, 49, 27, 81, + 161, 161, 33, 57, 97, 161, 161, 161, 49, 27, 176, 27, + 12, 49, 65, 97, 65, 60, 49, 65, 97, 17, 33, 97, + 33, 17, 97, 65, 60, 33, 81, 81, 81, 65, 97, 49, + 113, 240, 39, 11, 145, 27, 196, 20, 33, 33, 17, 33, + 33, 33, 17, 33, 34, 17, 18, 17, 33, 18, 17, 18, + 33, 33, 17, 33, 33, 33, 17, 33, 33, 33, 17, 33, + 33, 18, 17, 18, 192, 29, 12, 17, 33, 49, 65, 33, + 49, 81, 33, 17, 75, 65, 17, 17, 97, 33, 33, 65, + 21, 20, 65, 177, 49, 43, 97, 177, 240, 48, 15, 5, + 65, 65, 65, 65, 65, 65, 65, 65, 49, 65, 49, 34, + 128, 25, 12, 145, 81, 81, 81, 81, 81, 65, 97, 65, + 113, 49, 113, 33, 145, 17, 161, 161, 17, 114, 50, 35, + 114, 192, 27, 12, 129, 58, 97, 49, 113, 33, 129, 33, + 33, 81, 37, 49, 97, 65, 97, 49, 113, 49, 49, 49, + 33, 83, 33, 113, 240, 23, 12, 65, 177, 49, 118, 81, + 65, 81, 81, 65, 97, 49, 97, 162, 145, 33, 113, 66, + 50, 100, 145, 192, 18, 12, 130, 115, 85, 177, 177, 177, + 51, 84, 54, 177, 177, 81, 81, 81, 102, 192, 22, 12, + 81, 177, 161, 177, 50, 81, 65, 81, 65, 81, 65, 161, + 161, 65, 81, 97, 28, 18, 129, 192, 28, 12, 81, 49, + 81, 33, 33, 81, 33, 33, 81, 65, 97, 65, 113, 49, + 113, 33, 145, 17, 161, 161, 17, 114, 50, 35, 114, 192, + 18, 12, 81, 193, 177, 33, 58, 145, 161, 161, 161, 161, + 146, 130, 33, 98, 70, 208, 18, 12, 66, 161, 152, 65, + 97, 65, 51, 81, 186, 186, 33, 113, 49, 131, 161, 224, + 21, 12, 49, 177, 97, 73, 33, 33, 113, 49, 97, 70, + 97, 177, 65, 103, 81, 177, 177, 240, 48, 23, 12, 115, + 54, 113, 49, 34, 65, 33, 33, 81, 33, 17, 145, 92, + 97, 177, 129, 33, 147, 161, 240, 48, 17, 12, 115, 54, + 161, 193, 105, 161, 161, 161, 146, 130, 130, 34, 67, 84, + 224, 28, 12, 49, 51, 84, 129, 161, 49, 113, 49, 49, + 28, 97, 129, 33, 17, 97, 33, 17, 81, 49, 34, 33, + 35, 51, 65, 81, 192, 21, 12, 33, 82, 70, 97, 185, + 49, 65, 97, 65, 97, 65, 33, 28, 240, 17, 146, 130, + 240, 112, 20, 12, 33, 82, 70, 97, 185, 49, 65, 97, + 65, 97, 65, 33, 28, 240, 65, 194, 194, 192, 26, 12, + 115, 54, 145, 81, 28, 49, 65, 81, 97, 34, 17, 65, + 18, 49, 65, 97, 65, 97, 65, 81, 81, 50, 97, 240, + 31, 12, 115, 54, 161, 65, 28, 49, 17, 17, 68, 17, + 17, 33, 65, 17, 19, 81, 17, 17, 49, 34, 17, 17, + 51, 49, 36, 81, 177, 240, 48, 31, 12, 99, 69, 177, + 108, 49, 17, 33, 17, 20, 17, 34, 81, 17, 33, 36, + 19, 20, 49, 17, 17, 97, 33, 33, 65, 49, 52, 65, + 65, 208, 18, 12, 97, 88, 161, 161, 161, 161, 161, 161, + 177, 129, 17, 145, 17, 146, 26, 208, 26, 12, 49, 177, + 177, 81, 81, 52, 65, 18, 33, 82, 65, 36, 81, 49, + 17, 81, 81, 65, 97, 113, 49, 113, 72, 192, 26, 12, + 65, 177, 177, 49, 58, 97, 49, 113, 49, 113, 49, 113, + 49, 97, 65, 33, 49, 65, 33, 33, 81, 35, 115, 192, + 19, 12, 33, 177, 113, 58, 17, 161, 214, 145, 161, 161, + 97, 49, 113, 49, 114, 56, 208, 29, 12, 97, 177, 129, + 33, 49, 65, 33, 20, 49, 34, 33, 68, 49, 20, 33, + 49, 65, 33, 18, 81, 33, 129, 113, 49, 113, 72, 192, + 24, 12, 161, 43, 161, 65, 97, 81, 81, 81, 81, 129, + 33, 98, 49, 66, 81, 19, 49, 49, 33, 83, 161, 240, + 22, 11, 65, 161, 145, 50, 81, 49, 70, 34, 81, 49, + 81, 49, 56, 65, 65, 145, 130, 84, 240, 48, 24, 12, + 81, 49, 113, 66, 81, 81, 25, 113, 49, 113, 49, 44, + 81, 81, 81, 81, 81, 35, 97, 177, 240, 48, 32, 12, + 33, 81, 81, 81, 81, 33, 33, 85, 17, 81, 81, 81, + 81, 54, 33, 49, 65, 33, 49, 65, 33, 34, 65, 33, + 39, 33, 34, 65, 51, 192, 27, 12, 12, 177, 65, 33, + 33, 97, 17, 97, 33, 17, 113, 49, 113, 49, 33, 28, + 81, 17, 129, 49, 82, 81, 34, 130, 192, 32, 12, 50, + 17, 83, 49, 113, 49, 113, 49, 87, 113, 49, 85, 17, + 81, 49, 17, 81, 49, 17, 49, 17, 49, 17, 49, 21, + 17, 51, 49, 36, 208, 34, 12, 66, 17, 68, 49, 65, + 17, 50, 81, 17, 17, 17, 85, 17, 129, 33, 113, 49, + 70, 17, 81, 17, 49, 33, 65, 49, 33, 35, 49, 34, + 33, 83, 208, 28, 12, 49, 49, 70, 17, 113, 60, 81, + 65, 20, 22, 65, 17, 65, 49, 38, 33, 97, 65, 56, + 49, 49, 49, 49, 49, 68, 192, 41, 12, 66, 33, 52, + 33, 17, 49, 33, 33, 17, 65, 17, 17, 33, 81, 33, + 33, 68, 49, 81, 49, 17, 54, 18, 113, 49, 33, 33, + 18, 33, 33, 17, 33, 17, 17, 34, 34, 33, 19, 192, + 42, 12, 66, 33, 52, 33, 17, 65, 17, 17, 33, 54, + 33, 97, 65, 55, 17, 49, 17, 17, 17, 17, 55, 17, + 49, 17, 17, 17, 17, 34, 33, 33, 17, 34, 17, 17, + 17, 17, 34, 66, 35, 192, 42, 12, 1, 33, 33, 17, + 65, 17, 17, 33, 55, 17, 65, 17, 17, 33, 49, 33, + 33, 17, 65, 97, 72, 49, 33, 33, 17, 65, 18, 17, + 17, 33, 33, 21, 33, 17, 65, 17, 34, 81, 35, 192, + 32, 12, 49, 65, 57, 97, 65, 55, 17, 49, 81, 17, + 49, 19, 17, 17, 177, 69, 33, 65, 49, 33, 33, 21, + 33, 33, 33, 17, 49, 40, 35, 192, 15, 4, 49, 49, + 49, 49, 49, 49, 49, 49, 50, 33, 19, 33, 80, 16, + 10, 10, 129, 129, 114, 129, 145, 145, 145, 145, 97, 33, + 115, 129, 240, 21, 12, 26, 145, 114, 17, 161, 49, 28, + 97, 49, 113, 33, 129, 177, 129, 33, 147, 161, 240, 48, + 22, 12, 49, 49, 118, 81, 65, 89, 113, 49, 44, 81, + 49, 57, 113, 49, 65, 33, 147, 161, 240, 64, 20, 12, + 81, 108, 81, 135, 81, 33, 33, 73, 113, 49, 44, 81, + 49, 57, 113, 147, 240, 48, 9, 12, 129, 88, 0, 13, + 65, 28, 192, 17, 12, 129, 88, 240, 145, 28, 97, 177, + 177, 177, 129, 33, 147, 161, 240, 48, 18, 12, 145, 73, + 113, 177, 177, 49, 28, 97, 177, 177, 129, 33, 147, 161, + 240, 48, 16, 12, 40, 240, 188, 81, 161, 167, 177, 177, + 113, 49, 131, 161, 240, 16, 20, 12, 129, 88, 240, 240, + 97, 28, 81, 161, 49, 97, 81, 65, 53, 22, 81, 17, + 145, 192, 19, 12, 12, 49, 177, 177, 65, 103, 65, 81, + 81, 81, 87, 81, 65, 177, 177, 76, 192, 22, 12, 129, + 88, 240, 145, 28, 65, 49, 113, 49, 113, 49, 113, 49, + 97, 65, 81, 81, 50, 97, 240, 21, 12, 145, 43, 97, + 177, 177, 49, 58, 81, 65, 97, 65, 97, 65, 81, 81, + 81, 81, 44, 192, 25, 12, 49, 65, 97, 65, 97, 65, + 74, 65, 65, 97, 65, 97, 65, 60, 49, 65, 97, 65, + 81, 81, 50, 97, 240, 19, 12, 12, 247, 81, 81, 81, + 81, 87, 81, 81, 81, 81, 87, 81, 81, 193, 28, 192, + 26, 12, 12, 65, 177, 182, 81, 81, 81, 17, 49, 81, + 33, 17, 81, 17, 17, 17, 81, 33, 33, 129, 17, 177, + 76, 192, 34, 12, 27, 65, 33, 129, 33, 129, 33, 81, + 33, 33, 33, 33, 33, 33, 33, 49, 17, 33, 17, 65, + 17, 33, 17, 97, 33, 129, 33, 129, 33, 33, 28, 192, + 29, 12, 49, 49, 113, 49, 49, 17, 19, 17, 33, 33, + 17, 51, 49, 17, 49, 49, 17, 19, 17, 53, 68, 17, + 200, 240, 145, 28, 192, 27, 12, 12, 65, 33, 129, 33, + 129, 33, 84, 36, 33, 129, 33, 129, 36, 36, 33, 33, + 33, 33, 81, 33, 129, 33, 76, 192, 32, 12, 26, 97, + 161, 164, 99, 33, 19, 33, 17, 33, 17, 17, 33, 17, + 33, 17, 17, 35, 33, 33, 49, 17, 33, 17, 17, 84, + 49, 81, 108, 192, 11, 12, 240, 225, 193, 177, 49, 28, + 0, 10, 64, 17, 12, 81, 193, 177, 49, 28, 49, 177, + 177, 177, 177, 177, 177, 81, 88, 208, 22, 12, 82, 177, + 92, 246, 97, 65, 97, 65, 97, 65, 97, 65, 97, 65, + 33, 33, 81, 35, 115, 192, 26, 12, 82, 177, 49, 28, + 65, 49, 97, 81, 65, 81, 20, 33, 49, 33, 81, 17, + 161, 161, 17, 114, 50, 35, 114, 192, 25, 12, 82, 177, + 49, 28, 65, 161, 65, 86, 33, 113, 33, 113, 33, 98, + 33, 82, 49, 17, 114, 50, 20, 98, 192, 33, 12, 82, + 177, 92, 65, 49, 113, 49, 81, 17, 49, 17, 49, 17, + 49, 17, 33, 33, 49, 34, 49, 49, 33, 49, 65, 33, + 33, 51, 50, 81, 240, 16, 19, 12, 82, 177, 49, 43, + 65, 65, 113, 33, 90, 33, 177, 177, 177, 161, 161, 240, + 128, 15, 12, 97, 92, 247, 81, 81, 87, 250, 129, 161, + 147, 161, 240, 48, 24, 12, 82, 177, 49, 28, 218, 33, + 65, 49, 33, 65, 49, 42, 33, 65, 49, 33, 65, 49, + 42, 33, 129, 208, 16, 12, 97, 92, 247, 81, 81, 87, + 240, 24, 145, 76, 97, 147, 240, 32, 23, 12, 97, 92, + 247, 81, 81, 81, 81, 87, 129, 129, 33, 17, 81, 49, + 34, 33, 35, 51, 65, 81, 192, 17, 12, 97, 92, 49, + 81, 87, 237, 161, 40, 129, 129, 33, 147, 161, 240, 48, + 21, 12, 81, 108, 49, 81, 87, 237, 162, 38, 33, 49, + 65, 97, 65, 33, 33, 81, 35, 115, 192, 25, 12, 97, + 106, 65, 65, 113, 49, 129, 17, 76, 97, 106, 65, 33, + 17, 97, 33, 34, 49, 49, 52, 50, 65, 192, 17, 12, + 97, 92, 246, 97, 65, 61, 161, 39, 129, 121, 17, 81, + 81, 102, 192, 34, 12, 81, 108, 33, 65, 74, 65, 33, + 17, 17, 36, 34, 17, 17, 33, 33, 33, 18, 18, 18, + 49, 17, 49, 33, 17, 52, 49, 113, 17, 34, 67, 82, + 192, 22, 12, 97, 92, 33, 17, 49, 17, 49, 21, 17, + 49, 113, 57, 65, 81, 87, 81, 81, 87, 236, 192, 28, + 12, 97, 92, 17, 33, 49, 17, 42, 33, 33, 49, 17, + 42, 33, 33, 17, 17, 17, 29, 17, 97, 17, 40, 65, + 97, 44, 192, 19, 12, 97, 177, 177, 177, 177, 177, 177, + 161, 17, 129, 49, 97, 82, 49, 116, 145, 192, 16, 4, + 49, 49, 33, 49, 34, 17, 17, 49, 49, 49, 49, 49, + 49, 80, 30, 12, 49, 177, 22, 49, 97, 65, 81, 66, + 65, 65, 17, 49, 113, 49, 113, 33, 129, 33, 81, 33, + 17, 97, 33, 17, 97, 33, 39, 192, 27, 12, 49, 65, + 97, 65, 81, 81, 81, 81, 66, 25, 17, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 240, 20, + 12, 49, 177, 81, 65, 38, 49, 162, 145, 17, 177, 177, + 177, 177, 177, 113, 49, 24, 192, 38, 12, 49, 49, 113, + 49, 113, 49, 33, 49, 24, 33, 65, 33, 34, 65, 33, + 17, 17, 65, 33, 49, 65, 33, 49, 49, 49, 49, 49, + 49, 49, 33, 33, 17, 49, 17, 65, 224, 29, 12, 49, + 97, 73, 33, 81, 81, 81, 66, 81, 49, 17, 81, 81, + 81, 81, 81, 81, 81, 81, 33, 33, 81, 51, 81, 65, + 240, 16, 28, 12, 33, 113, 58, 33, 177, 49, 113, 49, + 113, 49, 113, 49, 113, 50, 97, 33, 33, 65, 33, 66, + 17, 33, 98, 33, 129, 192, 34, 12, 49, 97, 73, 33, + 33, 65, 49, 33, 65, 34, 49, 33, 33, 17, 49, 33, + 65, 66, 81, 66, 81, 49, 33, 65, 33, 65, 49, 17, + 82, 34, 113, 192, 33, 12, 65, 33, 129, 33, 113, 49, + 113, 49, 98, 50, 65, 17, 49, 18, 17, 33, 49, 34, + 49, 49, 49, 49, 49, 113, 49, 113, 49, 113, 49, 240, + 16, 38, 12, 49, 33, 129, 33, 113, 49, 33, 65, 23, + 34, 49, 33, 33, 17, 49, 33, 65, 49, 33, 65, 49, + 33, 65, 49, 33, 65, 33, 49, 17, 33, 17, 65, 17, + 34, 98, 192, 37, 12, 49, 65, 97, 33, 17, 81, 49, + 17, 81, 49, 17, 66, 49, 17, 49, 17, 33, 33, 81, + 33, 49, 65, 33, 49, 65, 17, 65, 65, 17, 81, 50, + 97, 49, 129, 192, 39, 12, 49, 81, 81, 37, 49, 49, + 33, 65, 49, 33, 50, 49, 33, 33, 17, 49, 33, 65, + 49, 33, 65, 49, 33, 65, 33, 49, 65, 33, 49, 17, + 33, 17, 65, 17, 34, 83, 192, 22, 11, 81, 161, 145, + 17, 113, 49, 81, 33, 33, 34, 49, 50, 129, 57, 129, + 161, 145, 145, 240, 16, 27, 12, 82, 145, 33, 113, 65, + 81, 97, 49, 131, 33, 65, 33, 49, 65, 97, 65, 97, + 65, 97, 65, 81, 81, 50, 97, 240, 40, 12, 49, 22, + 65, 33, 49, 49, 49, 49, 49, 49, 33, 50, 49, 33, + 33, 17, 49, 20, 33, 49, 65, 33, 49, 65, 33, 49, + 65, 33, 33, 81, 33, 33, 33, 33, 33, 17, 66, 208, + 31, 12, 49, 49, 113, 49, 113, 49, 113, 49, 113, 49, + 113, 49, 114, 33, 113, 17, 17, 97, 49, 17, 65, 49, + 50, 17, 49, 82, 49, 113, 192, 25, 11, 81, 145, 17, + 113, 49, 81, 81, 49, 113, 17, 33, 97, 49, 50, 81, + 18, 114, 145, 81, 65, 81, 86, 192, 26, 11, 81, 145, + 17, 113, 49, 81, 81, 49, 113, 17, 38, 17, 49, 65, + 81, 65, 81, 34, 97, 97, 49, 97, 71, 176, 30, 12, + 49, 23, 49, 97, 49, 97, 65, 81, 66, 81, 49, 17, + 24, 33, 81, 81, 81, 81, 81, 81, 33, 33, 81, 51, + 81, 65, 240, 16, 28, 12, 49, 49, 113, 49, 97, 65, + 97, 65, 33, 34, 25, 17, 65, 97, 65, 97, 65, 97, + 65, 97, 65, 97, 65, 97, 38, 208, 41, 12, 49, 49, + 113, 49, 97, 33, 17, 33, 49, 33, 21, 18, 35, 33, + 17, 20, 17, 33, 49, 33, 17, 33, 49, 33, 17, 18, + 49, 33, 17, 97, 33, 17, 49, 33, 33, 81, 33, 54, + 192, 34, 12, 49, 65, 97, 65, 81, 81, 17, 49, 24, + 18, 81, 49, 17, 33, 33, 81, 49, 17, 81, 49, 17, + 81, 65, 97, 66, 81, 49, 33, 65, 18, 66, 192, 32, + 12, 49, 81, 81, 81, 65, 97, 65, 24, 18, 97, 33, + 17, 33, 49, 65, 49, 33, 65, 49, 33, 65, 97, 65, + 49, 33, 65, 67, 65, 81, 240, 42, 12, 49, 65, 97, + 65, 81, 81, 81, 33, 33, 33, 18, 33, 33, 34, 17, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 39, 33, 33, 81, + 192, 28, 11, 81, 161, 145, 17, 113, 49, 81, 33, 33, + 34, 49, 50, 81, 97, 49, 49, 33, 49, 49, 33, 49, + 49, 41, 33, 113, 192, 28, 12, 49, 177, 81, 65, 38, + 49, 65, 82, 65, 65, 17, 65, 97, 65, 97, 65, 97, + 65, 97, 65, 97, 65, 33, 49, 24, 192, 19, 12, 97, + 161, 17, 129, 49, 82, 81, 34, 130, 232, 129, 177, 177, + 177, 49, 28, 192, 40, 12, 49, 177, 23, 33, 81, 33, + 33, 81, 33, 18, 33, 33, 34, 17, 33, 33, 33, 33, + 33, 33, 33, 33, 17, 33, 49, 33, 65, 49, 33, 49, + 65, 33, 33, 81, 33, 17, 66, 208, 28, 12, 49, 97, + 65, 36, 65, 81, 81, 81, 66, 81, 49, 17, 24, 33, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 240, + 31, 12, 49, 33, 129, 33, 49, 49, 54, 33, 33, 114, + 17, 113, 17, 38, 49, 97, 65, 81, 81, 65, 97, 49, + 65, 33, 33, 81, 33, 54, 192, 33, 12, 49, 33, 17, + 97, 33, 33, 65, 49, 113, 49, 49, 34, 22, 33, 17, + 49, 113, 49, 113, 49, 113, 65, 97, 65, 49, 33, 81, + 33, 33, 99, 192, 20, 12, 82, 145, 33, 98, 66, 34, + 49, 66, 97, 177, 106, 161, 161, 114, 17, 161, 194, 240, + 33, 12, 145, 65, 97, 65, 33, 49, 65, 49, 33, 65, + 49, 33, 65, 97, 65, 97, 65, 49, 33, 65, 18, 34, + 36, 49, 33, 33, 65, 50, 66, 81, 192, 19, 12, 49, + 97, 73, 33, 177, 162, 145, 17, 177, 53, 49, 177, 177, + 177, 177, 24, 192, 27, 12, 49, 49, 113, 49, 97, 65, + 97, 65, 82, 70, 17, 65, 97, 65, 97, 65, 97, 65, + 97, 65, 97, 65, 97, 24, 192, 39, 12, 49, 33, 129, + 49, 33, 49, 33, 17, 33, 49, 33, 65, 34, 33, 49, + 33, 17, 33, 49, 65, 49, 17, 81, 49, 17, 81, 65, + 97, 49, 17, 81, 33, 49, 65, 17, 82, 192, 34, 12, + 49, 49, 113, 49, 97, 49, 113, 49, 98, 33, 33, 49, + 17, 17, 49, 81, 65, 97, 65, 97, 49, 33, 65, 33, + 65, 49, 22, 17, 33, 33, 81, 192, 39, 12, 49, 17, + 36, 49, 33, 65, 33, 129, 33, 33, 81, 18, 33, 82, + 17, 33, 81, 33, 33, 81, 33, 33, 81, 33, 33, 81, + 33, 33, 33, 33, 33, 33, 51, 33, 33, 65, 208, 44, + 12, 49, 49, 113, 33, 20, 33, 33, 33, 33, 33, 33, + 33, 33, 18, 33, 33, 34, 17, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 18, 33, 33, 34, 17, 33, 33, 17, + 49, 18, 33, 81, 81, 81, 240, 32, 12, 49, 49, 113, + 49, 97, 49, 17, 81, 33, 49, 65, 17, 33, 33, 34, + 81, 34, 17, 177, 38, 49, 97, 65, 81, 81, 81, 81, + 65, 240, 16, 35, 12, 49, 65, 97, 65, 81, 81, 81, + 39, 18, 33, 33, 34, 17, 33, 33, 33, 33, 33, 33, + 33, 33, 39, 33, 33, 33, 33, 33, 81, 81, 81, 81, + 81, 240, 41, 12, 49, 17, 33, 97, 17, 33, 81, 33, + 33, 81, 33, 33, 18, 18, 37, 33, 17, 33, 33, 81, + 33, 33, 81, 33, 33, 81, 33, 33, 81, 33, 18, 81, + 34, 17, 33, 33, 33, 51, 192, 35, 11, 49, 22, 49, + 17, 65, 33, 33, 65, 33, 38, 18, 33, 66, 17, 33, + 65, 33, 38, 33, 33, 65, 33, 33, 65, 33, 33, 65, + 33, 17, 51, 34, 81, 192, 29, 12, 49, 33, 129, 33, + 113, 54, 33, 33, 33, 66, 81, 49, 17, 81, 81, 24, + 33, 81, 81, 81, 81, 81, 81, 81, 81, 81, 240, 31, + 12, 49, 65, 97, 17, 33, 81, 33, 33, 81, 38, 34, + 17, 49, 49, 17, 81, 81, 81, 81, 24, 33, 81, 81, + 81, 81, 81, 81, 81, 240, 37, 12, 49, 49, 113, 49, + 97, 49, 17, 81, 33, 49, 50, 17, 83, 17, 49, 33, + 65, 49, 33, 65, 49, 33, 65, 49, 33, 65, 49, 33, + 65, 33, 49, 65, 17, 65, 224, 29, 12, 49, 82, 65, + 50, 81, 20, 97, 65, 82, 65, 65, 17, 65, 33, 49, + 24, 33, 65, 97, 65, 97, 65, 97, 65, 97, 38, 208, + 37, 12, 49, 65, 97, 33, 17, 81, 33, 49, 65, 33, + 65, 34, 17, 98, 17, 38, 49, 65, 33, 49, 65, 33, + 49, 65, 33, 49, 49, 49, 49, 33, 65, 49, 17, 50, + 224, 35, 12, 49, 33, 129, 50, 81, 81, 81, 24, 18, + 65, 65, 17, 68, 49, 65, 33, 49, 65, 33, 49, 49, + 49, 49, 49, 49, 49, 33, 33, 17, 49, 17, 65, 224, +}; + +tFont *g_psFontWFireflysung6x12 = (tFont *)g_pui8Fireflysung6x12; diff --git a/third_party/fonts/apl/fonts/fontfireflysung6x14.c b/third_party/fonts/apl/fonts/fontfireflysung6x14.c new file mode 100644 index 0000000..a66d6d5 --- /dev/null +++ b/third_party/fonts/apl/fonts/fontfireflysung6x14.c @@ -0,0 +1,1005 @@ +//***************************************************************************** +// +// fontfireflysung6x14.c - Font definition for the 6x14 Fireflysung font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from fireflysung-1.3.0 +// +// Copyright (C) 1994-1999, Arphic Technology Co., Ltd. +// Copyright (C) 1999-2004, Firefly and Arphic Technology Co., Ltd. +// +// Author/Designer: +// Original author: +// Arphic Technology Co., Ltd. +// http://www.arphic.com.tw/ +// +// Modified by: +// Firefly +// http://firefly.idv.tw +// +// Modified by: +// Texas Instruments Incorporated for use with TivaWare Graphics Library +// http://www.ti.com/tivaware +// +// NOTICE: This font contains embedded bitmap fonts made +// by firefly and is released as a whole +// under the ARPHIC PUBLIC LICENSE. +// +// Copyright: +// See 'license/english/ARPHICPL.TXT', 'license/big5/ARPHICPL.TXT' or +// 'license/gb/ARPHICPL.TXT'. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 351 in 2 blocks +// Style: fireflysung +// Size: 6x14 +// Bold: no +// Italic: no +// Memory usage: 7783 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Fireflysung6x14[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 12, + + // + // The height of the font. + // + 14, + + // + // The baseline of the font. + // + 12, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x4e00 - 0x4eff + // + 0x00, 0x4e, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, + 0x50, 0x07, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x85, 0x01, 0x00, 0x00, // Offset 389 (0x185) + 0x8e, 0x01, 0x00, 0x00, // Offset 398 (0x18e) + 0xa4, 0x01, 0x00, 0x00, // Offset 420 (0x1a4) + 0xba, 0x01, 0x00, 0x00, // Offset 442 (0x1ba) + 0xd7, 0x01, 0x00, 0x00, // Offset 471 (0x1d7) + 0xeb, 0x01, 0x00, 0x00, // Offset 491 (0x1eb) + 0xf1, 0x01, 0x00, 0x00, // Offset 497 (0x1f1) + 0x00, 0x02, 0x00, 0x00, // Offset 512 (0x200) + 0x10, 0x02, 0x00, 0x00, // Offset 528 (0x210) + 0x20, 0x02, 0x00, 0x00, // Offset 544 (0x220) + 0x2c, 0x02, 0x00, 0x00, // Offset 556 (0x22c) + 0x32, 0x02, 0x00, 0x00, // Offset 562 (0x232) + 0x38, 0x02, 0x00, 0x00, // Offset 568 (0x238) + 0x3d, 0x02, 0x00, 0x00, // Offset 573 (0x23d) + 0x4c, 0x02, 0x00, 0x00, // Offset 588 (0x24c) + 0x5c, 0x02, 0x00, 0x00, // Offset 604 (0x25c) + 0x6a, 0x02, 0x00, 0x00, // Offset 618 (0x26a) + 0x78, 0x02, 0x00, 0x00, // Offset 632 (0x278) + 0x86, 0x02, 0x00, 0x00, // Offset 646 (0x286) + 0x99, 0x02, 0x00, 0x00, // Offset 665 (0x299) + 0xa7, 0x02, 0x00, 0x00, // Offset 679 (0x2a7) + 0xb7, 0x02, 0x00, 0x00, // Offset 695 (0x2b7) + 0xc4, 0x02, 0x00, 0x00, // Offset 708 (0x2c4) + 0xd5, 0x02, 0x00, 0x00, // Offset 725 (0x2d5) + 0xe5, 0x02, 0x00, 0x00, // Offset 741 (0x2e5) + 0xea, 0x02, 0x00, 0x00, // Offset 746 (0x2ea) + 0xf0, 0x02, 0x00, 0x00, // Offset 752 (0x2f0) + 0xff, 0x02, 0x00, 0x00, // Offset 767 (0x2ff) + 0x06, 0x03, 0x00, 0x00, // Offset 774 (0x306) + 0x14, 0x03, 0x00, 0x00, // Offset 788 (0x314) + 0x23, 0x03, 0x00, 0x00, // Offset 803 (0x323) + 0x3f, 0x03, 0x00, 0x00, // Offset 831 (0x33f) + 0x4f, 0x03, 0x00, 0x00, // Offset 847 (0x34f) + 0x62, 0x03, 0x00, 0x00, // Offset 866 (0x362) + 0x72, 0x03, 0x00, 0x00, // Offset 882 (0x372) + 0x87, 0x03, 0x00, 0x00, // Offset 903 (0x387) + 0x97, 0x03, 0x00, 0x00, // Offset 919 (0x397) + 0xa7, 0x03, 0x00, 0x00, // Offset 935 (0x3a7) + 0xb8, 0x03, 0x00, 0x00, // Offset 952 (0x3b8) + 0xce, 0x03, 0x00, 0x00, // Offset 974 (0x3ce) + 0xdb, 0x03, 0x00, 0x00, // Offset 987 (0x3db) + 0xea, 0x03, 0x00, 0x00, // Offset 1002 (0x3ea) + 0x00, 0x04, 0x00, 0x00, // Offset 1024 (0x400) + 0x0e, 0x04, 0x00, 0x00, // Offset 1038 (0x40e) + 0x28, 0x04, 0x00, 0x00, // Offset 1064 (0x428) + 0x3a, 0x04, 0x00, 0x00, // Offset 1082 (0x43a) + 0x48, 0x04, 0x00, 0x00, // Offset 1096 (0x448) + 0x58, 0x04, 0x00, 0x00, // Offset 1112 (0x458) + 0x67, 0x04, 0x00, 0x00, // Offset 1127 (0x467) + 0x7b, 0x04, 0x00, 0x00, // Offset 1147 (0x47b) + 0x88, 0x04, 0x00, 0x00, // Offset 1160 (0x488) + 0x97, 0x04, 0x00, 0x00, // Offset 1175 (0x497) + 0xae, 0x04, 0x00, 0x00, // Offset 1198 (0x4ae) + 0xc3, 0x04, 0x00, 0x00, // Offset 1219 (0x4c3) + 0xdb, 0x04, 0x00, 0x00, // Offset 1243 (0x4db) + 0xf0, 0x04, 0x00, 0x00, // Offset 1264 (0x4f0) + 0x03, 0x05, 0x00, 0x00, // Offset 1283 (0x503) + 0x10, 0x05, 0x00, 0x00, // Offset 1296 (0x510) + 0x1e, 0x05, 0x00, 0x00, // Offset 1310 (0x51e) + 0x2b, 0x05, 0x00, 0x00, // Offset 1323 (0x52b) + 0x39, 0x05, 0x00, 0x00, // Offset 1337 (0x539) + 0x43, 0x05, 0x00, 0x00, // Offset 1347 (0x543) + 0x48, 0x05, 0x00, 0x00, // Offset 1352 (0x548) + 0x4f, 0x05, 0x00, 0x00, // Offset 1359 (0x54f) + 0x5f, 0x05, 0x00, 0x00, // Offset 1375 (0x55f) + 0x71, 0x05, 0x00, 0x00, // Offset 1393 (0x571) + 0x7e, 0x05, 0x00, 0x00, // Offset 1406 (0x57e) + 0x90, 0x05, 0x00, 0x00, // Offset 1424 (0x590) + 0x9c, 0x05, 0x00, 0x00, // Offset 1436 (0x59c) + 0xab, 0x05, 0x00, 0x00, // Offset 1451 (0x5ab) + 0xbe, 0x05, 0x00, 0x00, // Offset 1470 (0x5be) + 0xd3, 0x05, 0x00, 0x00, // Offset 1491 (0x5d3) + 0xde, 0x05, 0x00, 0x00, // Offset 1502 (0x5de) + 0xeb, 0x05, 0x00, 0x00, // Offset 1515 (0x5eb) + 0xff, 0x05, 0x00, 0x00, // Offset 1535 (0x5ff) + 0x0c, 0x06, 0x00, 0x00, // Offset 1548 (0x60c) + 0x25, 0x06, 0x00, 0x00, // Offset 1573 (0x625) + 0x38, 0x06, 0x00, 0x00, // Offset 1592 (0x638) + 0x47, 0x06, 0x00, 0x00, // Offset 1607 (0x647) + 0x5b, 0x06, 0x00, 0x00, // Offset 1627 (0x65b) + 0x6e, 0x06, 0x00, 0x00, // Offset 1646 (0x66e) + 0x7b, 0x06, 0x00, 0x00, // Offset 1659 (0x67b) + 0x86, 0x06, 0x00, 0x00, // Offset 1670 (0x686) + 0x94, 0x06, 0x00, 0x00, // Offset 1684 (0x694) + 0xa7, 0x06, 0x00, 0x00, // Offset 1703 (0x6a7) + 0xb9, 0x06, 0x00, 0x00, // Offset 1721 (0x6b9) + 0xd1, 0x06, 0x00, 0x00, // Offset 1745 (0x6d1) + 0xe3, 0x06, 0x00, 0x00, // Offset 1763 (0x6e3) + 0xf5, 0x06, 0x00, 0x00, // Offset 1781 (0x6f5) + 0x00, 0x07, 0x00, 0x00, // Offset 1792 (0x700) + 0x10, 0x07, 0x00, 0x00, // Offset 1808 (0x710) + 0x13, 0x07, 0x00, 0x00, // Offset 1811 (0x713) + 0x23, 0x07, 0x00, 0x00, // Offset 1827 (0x723) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 7, 0, 12, 32, 4, 1, 24, 34, 9, 5, 2, + 18, 17, 34, 33, 0, 7, 22, 6, 113, 33, 33, 33, + 33, 33, 22, 17, 33, 33, 33, 33, 33, 23, 33, 33, + 33, 33, 33, 224, 22, 6, 129, 68, 17, 17, 34, 17, + 49, 17, 67, 65, 17, 49, 34, 17, 34, 17, 33, 20, + 49, 144, 29, 6, 113, 50, 17, 34, 17, 17, 17, 17, + 17, 17, 18, 49, 17, 65, 17, 50, 17, 17, 17, 17, + 17, 17, 18, 33, 18, 49, 112, 20, 6, 226, 49, 33, + 33, 33, 33, 17, 65, 66, 49, 33, 18, 49, 17, 49, + 35, 17, 192, 6, 2, 2, 18, 240, 128, 15, 4, 113, + 33, 33, 49, 33, 49, 49, 49, 49, 65, 49, 65, 65, + 16, 4, 65, 65, 65, 49, 65, 49, 49, 49, 49, 33, + 49, 33, 33, 48, 16, 5, 240, 33, 33, 17, 17, 19, + 49, 51, 17, 17, 17, 33, 240, 112, 12, 5, 240, 33, + 65, 65, 37, 33, 65, 65, 240, 112, 6, 2, 240, 52, + 18, 48, 6, 3, 240, 51, 240, 96, 5, 2, 240, 84, + 64, 15, 6, 177, 81, 65, 81, 65, 81, 65, 81, 65, + 81, 65, 81, 176, 16, 6, 226, 49, 33, 17, 66, 66, + 66, 66, 66, 65, 17, 33, 50, 224, 14, 5, 193, 50, + 33, 17, 65, 65, 65, 65, 65, 65, 37, 160, 14, 6, + 212, 17, 66, 65, 81, 65, 65, 65, 65, 65, 71, 192, + 14, 6, 212, 17, 66, 65, 65, 50, 97, 98, 66, 65, + 20, 208, 19, 6, 240, 17, 66, 49, 17, 49, 17, 33, + 33, 33, 33, 17, 49, 22, 65, 67, 192, 14, 5, 166, + 65, 65, 18, 18, 33, 65, 66, 50, 49, 19, 176, 16, + 6, 227, 33, 50, 81, 81, 19, 18, 50, 66, 65, 17, + 49, 35, 208, 13, 6, 199, 65, 81, 65, 81, 65, 81, + 81, 81, 81, 224, 17, 6, 212, 17, 66, 65, 17, 33, + 50, 49, 33, 17, 66, 66, 65, 20, 208, 16, 6, 211, + 33, 49, 17, 66, 66, 50, 19, 17, 82, 66, 49, 35, + 224, 5, 2, 132, 100, 96, 6, 2, 132, 100, 18, 48, + 15, 6, 240, 33, 65, 65, 65, 65, 65, 97, 97, 97, + 97, 97, 96, 7, 6, 240, 246, 198, 240, 240, 14, 6, + 193, 97, 97, 97, 97, 97, 65, 65, 65, 65, 65, 176, + 15, 6, 116, 17, 66, 66, 65, 65, 65, 81, 65, 81, + 177, 81, 144, 28, 7, 147, 49, 49, 33, 18, 18, 17, + 17, 19, 33, 19, 33, 19, 33, 19, 33, 19, 17, 17, + 17, 17, 17, 49, 49, 51, 144, 16, 6, 226, 66, 66, + 49, 33, 33, 33, 33, 33, 23, 66, 67, 34, 192, 19, + 6, 197, 33, 49, 17, 49, 17, 49, 20, 33, 49, 17, + 49, 17, 49, 17, 54, 208, 16, 6, 226, 17, 17, 35, + 66, 81, 81, 81, 81, 65, 17, 49, 35, 208, 21, 6, + 196, 49, 33, 33, 49, 17, 49, 17, 49, 17, 49, 17, + 49, 17, 49, 17, 33, 20, 224, 16, 6, 198, 17, 49, + 17, 81, 33, 36, 33, 33, 33, 81, 81, 55, 192, 16, + 6, 198, 17, 49, 17, 81, 33, 36, 33, 33, 33, 81, + 81, 67, 240, 17, 6, 226, 17, 17, 35, 66, 81, 81, + 51, 66, 65, 17, 34, 34, 17, 192, 22, 7, 227, 19, + 17, 49, 33, 49, 33, 49, 37, 33, 49, 33, 49, 33, + 49, 33, 49, 19, 19, 224, 13, 3, 99, 17, 33, 33, + 33, 33, 33, 33, 33, 19, 96, 15, 6, 228, 65, 81, + 81, 81, 81, 81, 17, 49, 17, 49, 35, 224, 22, 7, + 227, 18, 33, 33, 49, 33, 49, 17, 67, 65, 17, 65, + 33, 49, 33, 49, 49, 19, 19, 224, 14, 6, 195, 65, + 81, 81, 81, 81, 81, 81, 49, 17, 55, 192, 26, 7, + 241, 49, 33, 49, 33, 49, 34, 18, 34, 18, 33, 17, + 17, 33, 17, 17, 33, 17, 17, 33, 49, 18, 35, 224, + 18, 6, 193, 52, 51, 50, 17, 34, 17, 34, 33, 18, + 33, 18, 51, 52, 49, 192, 14, 6, 212, 17, 66, 66, + 66, 66, 66, 66, 66, 65, 20, 208, 16, 6, 197, 33, + 49, 17, 49, 17, 49, 20, 33, 81, 81, 81, 67, 240, + 15, 6, 212, 17, 66, 66, 66, 66, 66, 69, 18, 50, + 20, 97, 96, 20, 6, 197, 33, 49, 17, 49, 17, 49, + 20, 33, 17, 49, 33, 33, 33, 33, 52, 33, 192, 13, + 6, 212, 17, 66, 66, 98, 98, 98, 66, 65, 20, 208, + 15, 7, 232, 33, 33, 49, 97, 97, 97, 97, 97, 97, + 83, 240, 16, 23, 7, 227, 19, 17, 49, 33, 49, 33, + 49, 33, 49, 33, 49, 33, 49, 33, 49, 33, 49, 51, + 240, 16, 21, 7, 226, 50, 17, 49, 33, 49, 33, 49, + 49, 17, 65, 17, 65, 17, 81, 97, 97, 240, 32, 24, + 7, 226, 51, 82, 33, 34, 33, 34, 17, 17, 18, 17, + 17, 17, 17, 49, 33, 49, 33, 49, 33, 49, 240, 21, + 7, 226, 50, 17, 49, 49, 17, 65, 17, 81, 97, 81, + 17, 65, 17, 49, 49, 18, 50, 224, 19, 7, 226, 50, + 17, 49, 33, 49, 49, 17, 65, 17, 81, 97, 97, 97, + 83, 240, 16, 13, 6, 199, 65, 81, 65, 65, 65, 65, + 65, 66, 71, 192, 14, 3, 52, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 35, 48, 13, 5, 161, 65, 81, 65, + 81, 65, 81, 65, 81, 65, 160, 14, 3, 51, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 36, 48, 10, 5, 33, + 49, 17, 17, 49, 0, 6, 112, 5, 6, 0, 9, 102, + 7, 3, 98, 33, 49, 240, 192, 16, 6, 240, 240, 19, + 33, 49, 81, 36, 17, 49, 17, 49, 35, 17, 192, 18, + 6, 97, 81, 81, 81, 81, 18, 34, 33, 17, 66, 66, + 67, 33, 17, 18, 224, 13, 6, 240, 240, 35, 33, 50, + 81, 81, 97, 49, 35, 208, 18, 6, 177, 81, 81, 81, + 34, 17, 17, 35, 66, 66, 65, 17, 34, 34, 17, 192, + 12, 6, 240, 240, 20, 17, 66, 72, 81, 65, 20, 208, + 15, 6, 146, 49, 33, 33, 81, 53, 49, 81, 81, 81, + 81, 67, 224, 19, 7, 240, 240, 114, 18, 17, 33, 49, + 33, 66, 65, 100, 33, 65, 17, 65, 36, 32, 21, 7, + 114, 97, 97, 97, 97, 18, 50, 33, 33, 49, 33, 49, + 33, 49, 33, 49, 19, 19, 224, 11, 3, 113, 114, 33, + 33, 33, 33, 33, 19, 96, 13, 4, 177, 49, 98, 49, + 49, 49, 49, 50, 34, 33, 18, 20, 6, 98, 81, 81, + 81, 81, 34, 17, 33, 33, 17, 50, 65, 17, 49, 33, + 19, 18, 192, 13, 3, 98, 33, 33, 33, 33, 33, 33, + 33, 33, 19, 96, 25, 6, 240, 241, 17, 17, 33, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 192, 19, 7, 240, 240, 82, 18, 50, + 33, 33, 49, 33, 49, 33, 49, 33, 49, 19, 19, 224, + 15, 6, 240, 240, 34, 49, 33, 17, 66, 66, 65, 17, + 33, 50, 224, 20, 6, 240, 242, 18, 34, 33, 17, 49, + 17, 49, 17, 49, 18, 33, 17, 18, 33, 67, 48, 19, + 6, 240, 240, 18, 19, 34, 17, 49, 17, 49, 17, 49, + 17, 34, 34, 17, 81, 67, 13, 6, 240, 242, 18, 34, + 33, 17, 81, 81, 81, 67, 240, 11, 5, 240, 179, 17, + 50, 83, 82, 49, 19, 176, 14, 6, 240, 81, 81, 53, + 49, 81, 81, 81, 81, 33, 50, 208, 19, 7, 240, 240, + 82, 34, 33, 49, 33, 49, 33, 49, 33, 49, 33, 34, + 50, 18, 224, 18, 7, 240, 240, 83, 19, 17, 49, 33, + 49, 49, 17, 65, 17, 81, 97, 240, 32, 24, 7, 240, + 240, 82, 17, 18, 17, 17, 17, 33, 17, 17, 33, 17, + 17, 49, 17, 65, 17, 65, 17, 240, 16, 18, 7, 240, + 240, 83, 19, 17, 49, 49, 17, 81, 81, 17, 49, 49, + 19, 19, 224, 18, 6, 240, 242, 34, 17, 49, 17, 49, + 33, 17, 49, 17, 65, 81, 65, 50, 64, 11, 6, 240, + 247, 65, 65, 65, 65, 65, 55, 192, 16, 3, 33, 17, + 33, 33, 33, 33, 17, 33, 49, 33, 33, 33, 49, 48, + 3, 1, 14, 16, 3, 1, 49, 33, 33, 33, 33, 49, + 33, 17, 33, 33, 33, 17, 80, 11, 5, 240, 177, 49, + 17, 17, 49, 240, 240, 16, + 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x4e00 - 0x4eff + // + 0x00, 0x04, 0x00, 0x00, // Offset 1024 (0x400) + 0x09, 0x04, 0x00, 0x00, // Offset 1033 (0x409) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x1b, 0x04, 0x00, 0x00, // Offset 1051 (0x41b) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x32, 0x04, 0x00, 0x00, // Offset 1074 (0x432) + 0x4c, 0x04, 0x00, 0x00, // Offset 1100 (0x44c) + 0x63, 0x04, 0x00, 0x00, // Offset 1123 (0x463) + 0x71, 0x04, 0x00, 0x00, // Offset 1137 (0x471) + 0x83, 0x04, 0x00, 0x00, // Offset 1155 (0x483) + 0x97, 0x04, 0x00, 0x00, // Offset 1175 (0x497) + 0xb2, 0x04, 0x00, 0x00, // Offset 1202 (0x4b2) + 0xcb, 0x04, 0x00, 0x00, // Offset 1227 (0x4cb) + 0xdf, 0x04, 0x00, 0x00, // Offset 1247 (0x4df) + 0xf8, 0x04, 0x00, 0x00, // Offset 1272 (0x4f8) + 0x0e, 0x05, 0x00, 0x00, // Offset 1294 (0x50e) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x27, 0x05, 0x00, 0x00, // Offset 1319 (0x527) + 0x38, 0x05, 0x00, 0x00, // Offset 1336 (0x538) + 0x51, 0x05, 0x00, 0x00, // Offset 1361 (0x551) + 0x6a, 0x05, 0x00, 0x00, // Offset 1386 (0x56a) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x8b, 0x05, 0x00, 0x00, // Offset 1419 (0x58b) + 0xa2, 0x05, 0x00, 0x00, // Offset 1442 (0x5a2) + 0xc3, 0x05, 0x00, 0x00, // Offset 1475 (0x5c3) + 0xe9, 0x05, 0x00, 0x00, // Offset 1513 (0x5e9) + 0x07, 0x06, 0x00, 0x00, // Offset 1543 (0x607) + 0x23, 0x06, 0x00, 0x00, // Offset 1571 (0x623) + 0x43, 0x06, 0x00, 0x00, // Offset 1603 (0x643) + 0x5f, 0x06, 0x00, 0x00, // Offset 1631 (0x65f) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x73, 0x06, 0x00, 0x00, // Offset 1651 (0x673) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x87, 0x06, 0x00, 0x00, // Offset 1671 (0x687) + 0xab, 0x06, 0x00, 0x00, // Offset 1707 (0x6ab) + 0xc3, 0x06, 0x00, 0x00, // Offset 1731 (0x6c3) + 0xe6, 0x06, 0x00, 0x00, // Offset 1766 (0x6e6) + 0x04, 0x07, 0x00, 0x00, // Offset 1796 (0x704) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x13, 0x07, 0x00, 0x00, // Offset 1811 (0x713) + 0x29, 0x07, 0x00, 0x00, // Offset 1833 (0x729) + 0x3d, 0x07, 0x00, 0x00, // Offset 1853 (0x73d) + 0x52, 0x07, 0x00, 0x00, // Offset 1874 (0x752) + 0x6c, 0x07, 0x00, 0x00, // Offset 1900 (0x76c) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x89, 0x07, 0x00, 0x00, // Offset 1929 (0x789) + 0x9d, 0x07, 0x00, 0x00, // Offset 1949 (0x79d) + 0xc5, 0x07, 0x00, 0x00, // Offset 1989 (0x7c5) + 0xdf, 0x07, 0x00, 0x00, // Offset 2015 (0x7df) + 0x02, 0x08, 0x00, 0x00, // Offset 2050 (0x802) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x2d, 0x08, 0x00, 0x00, // Offset 2093 (0x82d) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x37, 0x08, 0x00, 0x00, // Offset 2103 (0x837) + 0x56, 0x08, 0x00, 0x00, // Offset 2134 (0x856) + 0x75, 0x08, 0x00, 0x00, // Offset 2165 (0x875) + 0x93, 0x08, 0x00, 0x00, // Offset 2195 (0x893) + 0xa6, 0x08, 0x00, 0x00, // Offset 2214 (0x8a6) + 0xc4, 0x08, 0x00, 0x00, // Offset 2244 (0x8c4) + 0xf3, 0x08, 0x00, 0x00, // Offset 2291 (0x8f3) + 0x0f, 0x09, 0x00, 0x00, // Offset 2319 (0x90f) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x1f, 0x09, 0x00, 0x00, // Offset 2335 (0x91f) + 0x38, 0x09, 0x00, 0x00, // Offset 2360 (0x938) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x54, 0x09, 0x00, 0x00, // Offset 2388 (0x954) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x6c, 0x09, 0x00, 0x00, // Offset 2412 (0x96c) + 0x80, 0x09, 0x00, 0x00, // Offset 2432 (0x980) + 0x9a, 0x09, 0x00, 0x00, // Offset 2458 (0x99a) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xb7, 0x09, 0x00, 0x00, // Offset 2487 (0x9b7) + 0xca, 0x09, 0x00, 0x00, // Offset 2506 (0x9ca) + 0xdf, 0x09, 0x00, 0x00, // Offset 2527 (0x9df) + 0xf7, 0x09, 0x00, 0x00, // Offset 2551 (0x9f7) + 0x0f, 0x0a, 0x00, 0x00, // Offset 2575 (0xa0f) + 0x21, 0x0a, 0x00, 0x00, // Offset 2593 (0xa21) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x3f, 0x0a, 0x00, 0x00, // Offset 2623 (0xa3f) + 0x54, 0x0a, 0x00, 0x00, // Offset 2644 (0xa54) + 0x68, 0x0a, 0x00, 0x00, // Offset 2664 (0xa68) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x84, 0x0a, 0x00, 0x00, // Offset 2692 (0xa84) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xa5, 0x0a, 0x00, 0x00, // Offset 2725 (0xaa5) + 0xc8, 0x0a, 0x00, 0x00, // Offset 2760 (0xac8) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xdb, 0x0a, 0x00, 0x00, // Offset 2779 (0xadb) + 0xf8, 0x0a, 0x00, 0x00, // Offset 2808 (0xaf8) + 0x14, 0x0b, 0x00, 0x00, // Offset 2836 (0xb14) + 0x29, 0x0b, 0x00, 0x00, // Offset 2857 (0xb29) + 0x4b, 0x0b, 0x00, 0x00, // Offset 2891 (0xb4b) + 0x63, 0x0b, 0x00, 0x00, // Offset 2915 (0xb63) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x7a, 0x0b, 0x00, 0x00, // Offset 2938 (0xb7a) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x95, 0x0b, 0x00, 0x00, // Offset 2965 (0xb95) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xb9, 0x0b, 0x00, 0x00, // Offset 3001 (0xbb9) + 0xd5, 0x0b, 0x00, 0x00, // Offset 3029 (0xbd5) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xf7, 0x0b, 0x00, 0x00, // Offset 3063 (0xbf7) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x1c, 0x0c, 0x00, 0x00, // Offset 3100 (0xc1c) + 0x3c, 0x0c, 0x00, 0x00, // Offset 3132 (0xc3c) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x6b, 0x0c, 0x00, 0x00, // Offset 3179 (0xc6b) + 0x9b, 0x0c, 0x00, 0x00, // Offset 3227 (0xc9b) + 0xc5, 0x0c, 0x00, 0x00, // Offset 3269 (0xcc5) + 0xe6, 0x0c, 0x00, 0x00, // Offset 3302 (0xce6) + 0xf6, 0x0c, 0x00, 0x00, // Offset 3318 (0xcf6) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x08, 0x0d, 0x00, 0x00, // Offset 3336 (0xd08) + 0x1e, 0x0d, 0x00, 0x00, // Offset 3358 (0xd1e) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x35, 0x0d, 0x00, 0x00, // Offset 3381 (0xd35) + 0x4b, 0x0d, 0x00, 0x00, // Offset 3403 (0xd4b) + 0x56, 0x0d, 0x00, 0x00, // Offset 3414 (0xd56) + 0x68, 0x0d, 0x00, 0x00, // Offset 3432 (0xd68) + 0x7b, 0x0d, 0x00, 0x00, // Offset 3451 (0xd7b) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x8d, 0x0d, 0x00, 0x00, // Offset 3469 (0xd8d) + 0xa2, 0x0d, 0x00, 0x00, // Offset 3490 (0xda2) + 0xb7, 0x0d, 0x00, 0x00, // Offset 3511 (0xdb7) + 0xcf, 0x0d, 0x00, 0x00, // Offset 3535 (0xdcf) + 0xe5, 0x0d, 0x00, 0x00, // Offset 3557 (0xde5) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x01, 0x0e, 0x00, 0x00, // Offset 3585 (0xe01) + 0x15, 0x0e, 0x00, 0x00, // Offset 3605 (0xe15) + 0x30, 0x0e, 0x00, 0x00, // Offset 3632 (0xe30) + 0x51, 0x0e, 0x00, 0x00, // Offset 3665 (0xe51) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x72, 0x0e, 0x00, 0x00, // Offset 3698 (0xe72) + 0x8e, 0x0e, 0x00, 0x00, // Offset 3726 (0xe8e) + 0xae, 0x0e, 0x00, 0x00, // Offset 3758 (0xeae) + 0xba, 0x0e, 0x00, 0x00, // Offset 3770 (0xeba) + 0xcd, 0x0e, 0x00, 0x00, // Offset 3789 (0xecd) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xe6, 0x0e, 0x00, 0x00, // Offset 3814 (0xee6) + 0x03, 0x0f, 0x00, 0x00, // Offset 3843 (0xf03) + 0x1d, 0x0f, 0x00, 0x00, // Offset 3869 (0xf1d) + 0x40, 0x0f, 0x00, 0x00, // Offset 3904 (0xf40) + 0x54, 0x0f, 0x00, 0x00, // Offset 3924 (0xf54) + 0x64, 0x0f, 0x00, 0x00, // Offset 3940 (0xf64) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x7e, 0x0f, 0x00, 0x00, // Offset 3966 (0xf7e) + 0x8e, 0x0f, 0x00, 0x00, // Offset 3982 (0xf8e) + 0xa8, 0x0f, 0x00, 0x00, // Offset 4008 (0xfa8) + 0xbb, 0x0f, 0x00, 0x00, // Offset 4027 (0xfbb) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xd5, 0x0f, 0x00, 0x00, // Offset 4053 (0xfd5) + 0xee, 0x0f, 0x00, 0x00, // Offset 4078 (0xfee) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x06, 0x10, 0x00, 0x00, // Offset 4102 (0x1006) + 0x29, 0x10, 0x00, 0x00, // Offset 4137 (0x1029) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x40, 0x10, 0x00, 0x00, // Offset 4160 (0x1040) + 0x63, 0x10, 0x00, 0x00, // Offset 4195 (0x1063) + 0x78, 0x10, 0x00, 0x00, // Offset 4216 (0x1078) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x89, 0x10, 0x00, 0x00, // Offset 4233 (0x1089) + 0xa9, 0x10, 0x00, 0x00, // Offset 4265 (0x10a9) + 0xc7, 0x10, 0x00, 0x00, // Offset 4295 (0x10c7) + 0xdd, 0x10, 0x00, 0x00, // Offset 4317 (0x10dd) + 0x03, 0x11, 0x00, 0x00, // Offset 4355 (0x1103) + 0x22, 0x11, 0x00, 0x00, // Offset 4386 (0x1122) + 0x42, 0x11, 0x00, 0x00, // Offset 4418 (0x1142) + 0x69, 0x11, 0x00, 0x00, // Offset 4457 (0x1169) + 0x8b, 0x11, 0x00, 0x00, // Offset 4491 (0x118b) + 0xb4, 0x11, 0x00, 0x00, // Offset 4532 (0x11b4) + 0xdc, 0x11, 0x00, 0x00, // Offset 4572 (0x11dc) + 0x08, 0x12, 0x00, 0x00, // Offset 4616 (0x1208) + 0x1e, 0x12, 0x00, 0x00, // Offset 4638 (0x121e) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x3b, 0x12, 0x00, 0x00, // Offset 4667 (0x123b) + 0x64, 0x12, 0x00, 0x00, // Offset 4708 (0x1264) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x85, 0x12, 0x00, 0x00, // Offset 4741 (0x1285) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x9e, 0x12, 0x00, 0x00, // Offset 4766 (0x129e) + 0xb9, 0x12, 0x00, 0x00, // Offset 4793 (0x12b9) + 0xda, 0x12, 0x00, 0x00, // Offset 4826 (0x12da) + 0xf8, 0x12, 0x00, 0x00, // Offset 4856 (0x12f8) + 0x27, 0x13, 0x00, 0x00, // Offset 4903 (0x1327) + 0x4c, 0x13, 0x00, 0x00, // Offset 4940 (0x134c) + 0x6f, 0x13, 0x00, 0x00, // Offset 4975 (0x136f) + 0x9d, 0x13, 0x00, 0x00, // Offset 5021 (0x139d) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xba, 0x13, 0x00, 0x00, // Offset 5050 (0x13ba) + 0xd8, 0x13, 0x00, 0x00, // Offset 5080 (0x13d8) + 0xec, 0x13, 0x00, 0x00, // Offset 5100 (0x13ec) + 0x17, 0x14, 0x00, 0x00, // Offset 5143 (0x1417) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x37, 0x14, 0x00, 0x00, // Offset 5175 (0x1437) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x5a, 0x14, 0x00, 0x00, // Offset 5210 (0x145a) + 0x7e, 0x14, 0x00, 0x00, // Offset 5246 (0x147e) + 0x95, 0x14, 0x00, 0x00, // Offset 5269 (0x1495) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xb9, 0x14, 0x00, 0x00, // Offset 5305 (0x14b9) + 0xd0, 0x14, 0x00, 0x00, // Offset 5328 (0x14d0) + 0xf0, 0x14, 0x00, 0x00, // Offset 5360 (0x14f0) + 0x1a, 0x15, 0x00, 0x00, // Offset 5402 (0x151a) + 0x40, 0x15, 0x00, 0x00, // Offset 5440 (0x1540) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x69, 0x15, 0x00, 0x00, // Offset 5481 (0x1569) + 0x9a, 0x15, 0x00, 0x00, // Offset 5530 (0x159a) + 0xbd, 0x15, 0x00, 0x00, // Offset 5565 (0x15bd) + 0xe6, 0x15, 0x00, 0x00, // Offset 5606 (0x15e6) + 0x15, 0x16, 0x00, 0x00, // Offset 5653 (0x1615) + 0x3e, 0x16, 0x00, 0x00, // Offset 5694 (0x163e) + 0x5f, 0x16, 0x00, 0x00, // Offset 5727 (0x165f) + 0x80, 0x16, 0x00, 0x00, // Offset 5760 (0x1680) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xaa, 0x16, 0x00, 0x00, // Offset 5802 (0x16aa) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xc9, 0x16, 0x00, 0x00, // Offset 5833 (0x16c9) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xf2, 0x16, 0x00, 0x00, // Offset 5874 (0x16f2) + + // + // Block 1 Data: Codepoints 0x4e00 - 0x4eff + // + 9, 12, 0, 8, 97, 28, 0, 10, 64, 18, 12, 161, + 28, 97, 177, 177, 177, 177, 177, 177, 177, 129, 33, 147, + 161, 240, 48, 23, 13, 81, 193, 193, 193, 66, 97, 34, + 116, 84, 17, 129, 49, 193, 193, 81, 97, 81, 97, 82, + 102, 224, 26, 12, 161, 28, 65, 177, 177, 65, 103, 81, + 65, 97, 65, 81, 81, 81, 81, 65, 33, 49, 49, 67, + 49, 97, 240, 16, 23, 13, 113, 193, 193, 49, 29, 113, + 193, 129, 49, 145, 33, 161, 17, 177, 177, 17, 130, 50, + 51, 115, 208, 14, 12, 145, 58, 240, 240, 241, 88, 0, + 6, 1, 28, 240, 144, 18, 12, 81, 177, 177, 177, 177, + 49, 118, 97, 177, 177, 177, 177, 177, 65, 28, 192, 20, + 12, 161, 28, 81, 177, 178, 161, 18, 129, 34, 113, 49, + 113, 177, 177, 177, 177, 240, 48, 27, 12, 161, 28, 49, + 65, 97, 65, 97, 65, 97, 65, 97, 65, 97, 65, 97, + 65, 81, 81, 81, 81, 65, 97, 49, 113, 240, 25, 12, + 161, 28, 97, 177, 161, 162, 33, 97, 17, 49, 65, 33, + 65, 33, 49, 67, 65, 81, 81, 177, 177, 240, 48, 20, + 12, 49, 177, 97, 73, 33, 177, 170, 177, 113, 49, 24, + 33, 177, 113, 49, 131, 161, 240, 25, 12, 161, 28, 81, + 129, 33, 49, 65, 38, 33, 49, 49, 49, 49, 49, 42, + 177, 177, 113, 49, 131, 161, 240, 16, 22, 12, 161, 28, + 81, 129, 33, 49, 65, 38, 33, 49, 113, 49, 107, 177, + 177, 113, 49, 131, 161, 240, 25, 12, 145, 58, 97, 49, + 113, 49, 113, 49, 113, 49, 57, 97, 65, 97, 65, 97, + 65, 81, 81, 81, 81, 44, 192, 17, 12, 81, 177, 122, + 81, 177, 124, 49, 168, 161, 113, 33, 146, 194, 177, 240, + 25, 13, 49, 81, 104, 81, 81, 97, 81, 103, 97, 81, + 97, 81, 97, 81, 103, 97, 81, 97, 81, 97, 81, 61, + 208, 25, 12, 145, 58, 113, 177, 161, 162, 17, 113, 17, + 34, 65, 33, 50, 33, 49, 65, 17, 65, 177, 240, 17, + 28, 192, 33, 13, 81, 49, 81, 33, 49, 81, 33, 49, + 81, 33, 49, 61, 33, 33, 49, 81, 33, 49, 81, 33, + 49, 81, 37, 81, 33, 49, 81, 193, 129, 59, 208, 23, + 13, 145, 97, 67, 85, 129, 193, 201, 65, 65, 113, 65, + 113, 65, 113, 65, 113, 65, 113, 65, 77, 208, 33, 12, + 161, 28, 81, 177, 65, 43, 17, 49, 65, 33, 50, 49, + 33, 49, 17, 33, 33, 33, 49, 17, 33, 17, 65, 17, + 34, 113, 33, 129, 33, 99, 208, 38, 12, 65, 33, 129, + 33, 129, 33, 129, 33, 65, 49, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 17, 65, 17, 33, 17, 65, 17, 34, + 81, 17, 33, 129, 33, 129, 33, 76, 192, 30, 12, 113, + 113, 49, 113, 49, 113, 49, 113, 49, 114, 33, 113, 17, + 17, 97, 33, 18, 81, 49, 33, 49, 49, 65, 17, 49, + 97, 204, 192, 28, 12, 65, 177, 81, 28, 49, 177, 33, + 113, 49, 33, 58, 113, 129, 33, 17, 81, 49, 34, 33, + 65, 51, 51, 65, 81, 240, 48, 32, 12, 49, 81, 81, + 81, 65, 81, 81, 33, 33, 33, 17, 33, 33, 33, 20, + 36, 81, 81, 65, 81, 65, 34, 17, 38, 36, 49, 81, + 240, 28, 192, 28, 12, 145, 58, 145, 146, 54, 17, 49, + 65, 34, 17, 81, 33, 17, 97, 33, 33, 65, 49, 49, + 33, 35, 51, 65, 81, 204, 192, 20, 13, 161, 59, 113, + 193, 137, 129, 193, 109, 82, 161, 81, 81, 53, 23, 81, + 18, 145, 208, 20, 12, 129, 163, 54, 161, 121, 113, 177, + 108, 81, 161, 65, 81, 37, 22, 81, 17, 145, 192, 36, + 13, 177, 29, 65, 49, 129, 49, 91, 33, 33, 49, 33, + 33, 33, 49, 33, 33, 34, 34, 17, 33, 17, 34, 34, + 34, 49, 65, 33, 49, 81, 33, 145, 33, 115, 224, 24, + 13, 177, 59, 49, 33, 17, 33, 81, 17, 17, 17, 129, + 17, 107, 33, 193, 193, 193, 193, 177, 177, 240, 160, 35, + 12, 33, 82, 82, 49, 113, 33, 90, 81, 33, 129, 33, + 81, 33, 33, 33, 33, 33, 33, 33, 49, 17, 33, 17, + 65, 17, 33, 17, 97, 33, 129, 33, 76, 192, 30, 12, + 97, 177, 106, 49, 49, 33, 81, 33, 17, 145, 92, 33, + 49, 49, 49, 49, 33, 65, 66, 81, 33, 33, 81, 17, + 67, 19, 97, 208, 15, 2, 1, 19, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 48, 22, 13, 97, 193, 177, + 17, 145, 49, 98, 82, 34, 65, 66, 97, 193, 193, 193, + 193, 193, 193, 240, 64, 20, 10, 1, 114, 17, 97, 50, + 49, 81, 33, 129, 129, 145, 145, 145, 145, 145, 145, 145, + 240, 21, 6, 81, 81, 33, 33, 49, 17, 49, 17, 81, + 66, 49, 20, 33, 17, 49, 81, 81, 81, 96, 26, 12, + 81, 177, 97, 65, 65, 29, 65, 65, 17, 65, 65, 17, + 65, 65, 27, 17, 65, 65, 97, 177, 177, 177, 240, 48, + 29, 12, 145, 43, 81, 65, 97, 65, 55, 17, 97, 65, + 97, 65, 40, 17, 97, 65, 17, 49, 81, 17, 33, 97, + 17, 17, 131, 161, 192, 20, 12, 81, 177, 49, 58, 97, + 177, 33, 88, 113, 177, 65, 28, 81, 177, 177, 177, 240, + 48, 40, 11, 65, 33, 113, 33, 65, 33, 33, 33, 17, + 33, 33, 33, 17, 33, 33, 33, 17, 33, 33, 33, 17, + 33, 33, 33, 20, 36, 65, 33, 33, 65, 33, 97, 49, + 81, 65, 50, 81, 224, 26, 12, 81, 113, 49, 49, 58, + 33, 49, 49, 57, 113, 97, 65, 65, 29, 65, 65, 27, + 17, 65, 65, 97, 177, 240, 48, 35, 12, 65, 33, 81, + 33, 33, 17, 58, 33, 33, 33, 17, 57, 97, 33, 65, + 49, 33, 33, 29, 49, 33, 33, 27, 17, 33, 49, 33, + 49, 65, 66, 81, 240, 16, 43, 13, 49, 49, 129, 49, + 49, 65, 55, 33, 33, 97, 33, 17, 33, 65, 33, 81, + 49, 33, 40, 33, 33, 33, 34, 33, 33, 33, 34, 33, + 33, 33, 33, 49, 33, 33, 33, 49, 39, 49, 33, 81, + 208, 10, 4, 240, 17, 65, 65, 50, 49, 240, 80, 31, + 13, 65, 193, 193, 49, 74, 113, 49, 129, 49, 97, 17, + 49, 114, 49, 130, 33, 113, 18, 17, 33, 49, 49, 17, + 33, 33, 97, 35, 131, 224, 31, 12, 49, 81, 88, 65, + 81, 81, 17, 49, 81, 33, 33, 81, 33, 33, 44, 49, + 81, 81, 81, 81, 81, 65, 49, 33, 49, 83, 33, 113, + 240, 30, 12, 81, 129, 34, 129, 17, 177, 65, 28, 81, + 65, 97, 65, 97, 17, 33, 81, 49, 17, 81, 81, 65, + 49, 33, 49, 83, 18, 113, 224, 19, 13, 81, 209, 193, + 49, 59, 113, 193, 193, 33, 89, 129, 193, 193, 193, 65, + 29, 208, 30, 12, 49, 65, 97, 65, 97, 65, 74, 65, + 17, 33, 97, 33, 17, 97, 33, 17, 60, 49, 65, 97, + 65, 81, 81, 65, 97, 49, 113, 240, 47, 13, 177, 29, + 229, 21, 33, 49, 17, 49, 33, 49, 17, 49, 34, 33, + 18, 33, 33, 17, 17, 17, 17, 17, 33, 17, 17, 17, + 17, 17, 33, 49, 17, 49, 33, 49, 17, 49, 33, 19, + 17, 19, 33, 33, 33, 33, 240, 28, 13, 81, 65, 65, + 49, 49, 81, 33, 33, 97, 65, 92, 49, 81, 81, 49, + 49, 34, 23, 18, 97, 123, 113, 193, 193, 240, 64, 16, + 5, 65, 65, 65, 65, 65, 65, 65, 65, 49, 65, 49, + 49, 49, 144, 25, 12, 225, 81, 81, 81, 81, 81, 81, + 81, 97, 65, 97, 49, 129, 33, 146, 162, 145, 33, 98, + 66, 34, 130, 192, 28, 12, 129, 73, 97, 49, 113, 49, + 113, 33, 129, 37, 65, 97, 65, 97, 49, 113, 49, 113, + 33, 65, 49, 17, 99, 17, 129, 224, 24, 12, 65, 177, + 177, 33, 133, 97, 49, 97, 65, 81, 65, 177, 161, 17, + 129, 49, 97, 82, 49, 116, 145, 192, 20, 13, 129, 179, + 70, 177, 193, 193, 51, 100, 70, 193, 193, 81, 97, 81, + 97, 82, 102, 224, 26, 12, 65, 177, 177, 161, 49, 113, + 49, 97, 49, 97, 65, 81, 65, 177, 49, 97, 81, 65, + 53, 22, 65, 33, 129, 192, 29, 12, 65, 129, 49, 49, + 49, 50, 33, 65, 49, 33, 65, 81, 97, 65, 97, 49, + 129, 33, 146, 162, 145, 33, 98, 66, 34, 130, 192, 19, + 12, 65, 193, 177, 33, 58, 161, 161, 161, 161, 161, 161, + 161, 146, 18, 83, 69, 224, 21, 12, 66, 161, 49, 88, + 65, 81, 81, 33, 33, 81, 50, 97, 186, 186, 33, 177, + 131, 161, 224, 24, 13, 65, 193, 97, 89, 49, 33, 129, + 49, 113, 65, 49, 33, 86, 113, 193, 65, 119, 97, 193, + 193, 240, 64, 24, 12, 129, 163, 54, 113, 49, 49, 65, + 33, 33, 81, 33, 17, 145, 92, 97, 177, 129, 33, 147, + 161, 240, 48, 18, 12, 129, 163, 54, 161, 193, 105, 161, + 146, 145, 146, 146, 130, 34, 67, 84, 224, 30, 13, 145, + 97, 67, 85, 129, 177, 65, 113, 65, 49, 44, 113, 145, + 33, 17, 97, 49, 33, 65, 17, 33, 49, 33, 51, 51, + 81, 81, 208, 21, 13, 145, 97, 67, 85, 129, 201, 65, + 65, 113, 65, 113, 65, 77, 240, 34, 146, 146, 240, 144, + 20, 13, 145, 97, 67, 85, 129, 201, 65, 65, 113, 65, + 113, 65, 77, 240, 82, 210, 210, 208, 28, 12, 115, 54, + 161, 65, 28, 65, 33, 113, 65, 81, 97, 34, 17, 65, + 18, 49, 65, 97, 65, 97, 65, 81, 81, 50, 97, 240, + 33, 13, 131, 70, 177, 65, 29, 97, 145, 33, 33, 33, + 19, 33, 33, 17, 65, 33, 34, 81, 33, 33, 52, 33, + 33, 33, 49, 33, 51, 97, 193, 240, 64, 35, 13, 131, + 70, 177, 109, 49, 33, 33, 37, 33, 33, 17, 65, 33, + 34, 66, 33, 33, 35, 17, 19, 35, 65, 17, 17, 113, + 33, 33, 81, 49, 53, 65, 65, 224, 19, 12, 113, 88, + 161, 161, 161, 161, 161, 161, 161, 129, 17, 145, 17, 146, + 26, 240, 160, 29, 13, 33, 193, 193, 97, 81, 83, 65, + 35, 17, 83, 65, 51, 97, 81, 97, 81, 49, 33, 81, + 66, 33, 49, 129, 49, 130, 57, 224, 28, 13, 65, 193, + 193, 49, 74, 113, 49, 129, 49, 129, 49, 129, 49, 113, + 65, 113, 65, 33, 49, 81, 33, 33, 97, 35, 131, 224, + 21, 13, 49, 193, 97, 89, 49, 177, 177, 22, 177, 177, + 177, 177, 113, 49, 129, 49, 130, 57, 224, 34, 13, 97, + 193, 129, 49, 49, 65, 49, 20, 49, 35, 33, 67, 17, + 49, 35, 49, 49, 65, 49, 49, 65, 49, 18, 81, 49, + 65, 49, 129, 49, 130, 57, 224, 24, 11, 145, 27, 145, + 49, 97, 65, 81, 65, 81, 161, 98, 33, 66, 65, 19, + 97, 33, 49, 49, 115, 145, 224, 23, 11, 66, 145, 145, + 50, 65, 65, 70, 145, 50, 65, 65, 65, 35, 53, 17, + 145, 145, 130, 99, 240, 64, 27, 12, 81, 49, 113, 66, + 81, 81, 25, 113, 49, 113, 49, 44, 81, 81, 81, 81, + 81, 33, 33, 81, 50, 97, 177, 240, 48, 36, 13, 33, + 65, 113, 65, 113, 33, 17, 118, 113, 65, 113, 65, 86, + 17, 81, 65, 17, 81, 65, 17, 81, 65, 17, 49, 17, + 65, 17, 49, 22, 17, 51, 65, 36, 224, 28, 12, 161, + 28, 49, 97, 81, 17, 33, 49, 33, 17, 113, 49, 113, + 49, 49, 28, 97, 161, 17, 129, 50, 66, 82, 18, 129, + 208, 34, 13, 66, 17, 84, 49, 129, 49, 129, 49, 88, + 129, 49, 129, 49, 86, 17, 81, 65, 17, 81, 65, 17, + 49, 17, 65, 17, 49, 22, 17, 51, 65, 36, 224, 37, + 13, 66, 33, 68, 65, 97, 49, 17, 65, 33, 17, 33, + 81, 33, 49, 70, 33, 129, 49, 113, 65, 100, 33, 66, + 17, 65, 33, 65, 65, 33, 20, 65, 34, 33, 99, 224, + 32, 13, 49, 65, 113, 65, 71, 21, 49, 49, 102, 113, + 49, 21, 37, 81, 33, 49, 65, 53, 49, 97, 81, 40, + 17, 49, 49, 65, 49, 49, 84, 208, 47, 13, 82, 33, + 53, 33, 17, 65, 33, 33, 17, 81, 17, 17, 33, 97, + 81, 81, 33, 49, 68, 65, 97, 33, 33, 54, 17, 17, + 81, 17, 17, 33, 33, 33, 17, 17, 33, 33, 17, 33, + 33, 17, 34, 34, 33, 35, 208, 48, 13, 83, 17, 53, + 33, 17, 81, 17, 17, 33, 71, 17, 97, 17, 49, 71, + 17, 65, 17, 17, 17, 17, 68, 18, 17, 65, 81, 17, + 69, 17, 17, 33, 17, 17, 17, 17, 17, 33, 17, 33, + 33, 17, 33, 19, 19, 35, 208, 42, 13, 65, 65, 65, + 33, 33, 17, 81, 17, 17, 33, 58, 81, 17, 17, 33, + 50, 33, 35, 81, 49, 33, 88, 65, 17, 18, 33, 49, + 19, 17, 33, 33, 55, 33, 33, 49, 33, 35, 65, 51, + 208, 33, 13, 65, 65, 71, 17, 113, 65, 85, 33, 193, + 73, 49, 97, 17, 71, 17, 81, 49, 33, 85, 33, 33, + 33, 49, 33, 33, 49, 17, 49, 41, 35, 208, 16, 4, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 33, 19, + 33, 80, 18, 11, 145, 27, 129, 145, 130, 145, 161, 161, + 161, 161, 113, 33, 131, 145, 240, 32, 22, 12, 145, 58, + 145, 114, 17, 161, 49, 28, 97, 49, 113, 33, 129, 177, + 129, 33, 147, 161, 240, 48, 23, 12, 49, 181, 97, 49, + 97, 49, 106, 113, 49, 44, 81, 49, 57, 113, 49, 65, + 33, 147, 161, 240, 64, 22, 13, 97, 109, 49, 33, 49, + 88, 129, 137, 129, 49, 60, 97, 49, 73, 129, 49, 84, + 177, 240, 80, 11, 12, 240, 97, 58, 0, 11, 113, 28, + 240, 144, 18, 12, 145, 58, 240, 240, 81, 28, 97, 177, + 177, 177, 129, 33, 147, 161, 240, 48, 19, 13, 161, 74, + 113, 193, 193, 65, 29, 97, 193, 193, 193, 145, 33, 163, + 177, 240, 80, 18, 12, 129, 88, 240, 145, 28, 65, 161, + 168, 177, 177, 113, 49, 131, 161, 240, 16, 21, 12, 129, + 88, 240, 240, 97, 28, 81, 177, 161, 49, 97, 81, 65, + 68, 23, 49, 33, 129, 208, 21, 12, 161, 28, 49, 177, + 65, 103, 81, 65, 81, 81, 81, 81, 71, 177, 177, 177, + 33, 28, 192, 24, 12, 145, 58, 240, 129, 28, 49, 65, + 97, 65, 97, 65, 97, 65, 97, 65, 81, 81, 65, 97, + 49, 113, 240, 22, 12, 145, 58, 97, 177, 161, 177, 49, + 73, 97, 49, 113, 49, 113, 49, 97, 65, 97, 65, 60, + 192, 28, 13, 65, 49, 129, 49, 129, 49, 91, 81, 49, + 129, 49, 129, 49, 77, 65, 49, 129, 49, 113, 65, 97, + 81, 81, 97, 240, 32, 20, 12, 161, 28, 232, 65, 97, + 65, 97, 72, 65, 97, 65, 97, 72, 65, 97, 193, 28, + 192, 27, 12, 161, 28, 49, 177, 65, 103, 81, 65, 81, + 33, 33, 81, 49, 17, 65, 33, 33, 81, 49, 17, 161, + 177, 49, 28, 192, 33, 12, 161, 28, 65, 33, 129, 33, + 129, 33, 81, 33, 33, 33, 33, 33, 33, 33, 49, 17, + 33, 17, 65, 17, 33, 17, 97, 33, 129, 33, 76, 240, + 144, 33, 13, 65, 49, 129, 49, 97, 17, 49, 33, 49, + 19, 17, 17, 65, 17, 50, 33, 33, 17, 49, 49, 33, + 19, 17, 53, 84, 17, 232, 240, 177, 44, 208, 28, 12, + 161, 28, 65, 33, 129, 33, 84, 36, 33, 129, 33, 129, + 33, 129, 36, 36, 33, 33, 33, 33, 81, 33, 129, 33, + 76, 192, 32, 12, 145, 43, 81, 164, 181, 20, 33, 49, + 17, 33, 34, 33, 17, 33, 33, 17, 17, 20, 33, 33, + 33, 33, 33, 17, 17, 84, 33, 97, 108, 192, 12, 12, + 240, 240, 161, 194, 177, 49, 28, 0, 10, 64, 19, 12, + 81, 193, 177, 49, 28, 33, 177, 177, 177, 177, 177, 177, + 113, 58, 33, 240, 96, 25, 13, 82, 193, 49, 44, 240, + 245, 129, 49, 129, 49, 129, 49, 129, 49, 49, 49, 65, + 49, 33, 81, 51, 116, 224, 29, 12, 82, 177, 49, 28, + 49, 65, 97, 81, 65, 65, 33, 18, 17, 49, 33, 65, + 33, 145, 17, 161, 161, 17, 114, 50, 50, 115, 192, 26, + 12, 82, 177, 49, 28, 65, 161, 65, 81, 65, 86, 49, + 97, 49, 82, 49, 51, 65, 146, 17, 98, 66, 19, 113, + 208, 35, 12, 81, 193, 177, 49, 28, 65, 33, 97, 17, + 33, 97, 17, 33, 17, 49, 33, 33, 33, 17, 49, 33, + 34, 49, 49, 49, 50, 33, 97, 35, 66, 65, 240, 32, + 20, 13, 98, 193, 49, 59, 65, 65, 129, 33, 107, 33, + 193, 193, 193, 193, 177, 177, 240, 160, 16, 12, 81, 108, + 232, 65, 97, 72, 250, 129, 161, 177, 132, 161, 240, 48, + 26, 13, 82, 193, 65, 29, 241, 113, 74, 49, 49, 49, + 65, 49, 49, 73, 65, 49, 49, 65, 49, 49, 73, 65, + 113, 240, 16, 12, 81, 108, 232, 65, 97, 72, 250, 129, + 76, 97, 132, 161, 240, 48, 26, 13, 98, 193, 49, 44, + 240, 24, 81, 97, 81, 97, 88, 145, 145, 33, 17, 97, + 49, 33, 65, 35, 52, 65, 81, 208, 19, 12, 66, 177, + 65, 28, 231, 81, 81, 61, 145, 41, 129, 129, 33, 147, + 161, 240, 48, 26, 12, 82, 177, 49, 28, 246, 97, 65, + 75, 17, 129, 17, 37, 17, 81, 49, 49, 49, 49, 49, + 33, 65, 51, 100, 192, 25, 13, 82, 193, 123, 65, 81, + 113, 49, 77, 97, 137, 129, 161, 17, 17, 113, 33, 33, + 81, 19, 53, 49, 81, 224, 24, 13, 98, 193, 49, 44, + 240, 39, 97, 81, 60, 17, 113, 34, 23, 33, 113, 34, + 56, 49, 97, 81, 118, 208, 35, 12, 81, 65, 28, 33, + 81, 53, 20, 65, 65, 17, 67, 18, 17, 20, 49, 18, + 17, 33, 19, 53, 34, 49, 81, 33, 17, 36, 65, 97, + 18, 35, 35, 81, 208, 23, 12, 82, 177, 92, 33, 17, + 49, 17, 49, 21, 17, 49, 113, 57, 65, 81, 87, 81, + 81, 87, 236, 192, 35, 13, 97, 65, 29, 17, 33, 49, + 33, 40, 18, 33, 33, 49, 33, 40, 18, 33, 33, 17, + 17, 33, 30, 49, 65, 34, 52, 17, 33, 65, 20, 113, + 65, 76, 208, 21, 13, 97, 193, 193, 193, 193, 193, 193, + 177, 17, 161, 33, 129, 65, 97, 98, 49, 132, 161, 208, + 17, 4, 49, 49, 33, 49, 49, 34, 17, 17, 49, 49, + 49, 49, 49, 49, 80, 32, 13, 49, 193, 97, 81, 23, + 49, 113, 65, 97, 66, 81, 65, 17, 65, 113, 65, 113, + 49, 129, 49, 81, 33, 33, 97, 33, 33, 97, 33, 55, + 208, 30, 13, 49, 65, 113, 65, 113, 65, 97, 81, 97, + 81, 82, 26, 17, 81, 97, 81, 97, 81, 97, 81, 97, + 81, 97, 81, 97, 81, 240, 32, 22, 13, 49, 193, 193, + 97, 65, 39, 49, 178, 161, 17, 193, 193, 193, 193, 129, + 49, 25, 33, 240, 128, 38, 13, 49, 65, 113, 65, 113, + 65, 97, 81, 97, 40, 18, 81, 50, 17, 81, 49, 33, + 81, 49, 33, 65, 65, 33, 65, 65, 33, 49, 17, 49, + 33, 33, 51, 49, 17, 81, 240, 31, 13, 49, 193, 113, + 65, 24, 33, 97, 81, 97, 66, 97, 49, 17, 97, 81, + 97, 81, 97, 81, 97, 81, 49, 33, 81, 67, 81, 81, + 240, 32, 32, 13, 33, 129, 59, 33, 193, 65, 113, 65, + 113, 65, 113, 65, 113, 65, 113, 49, 17, 97, 49, 33, + 65, 49, 65, 49, 33, 97, 17, 18, 129, 208, 39, 13, + 49, 113, 65, 24, 49, 33, 65, 49, 49, 65, 49, 49, + 65, 34, 65, 33, 33, 17, 65, 33, 65, 65, 33, 65, + 82, 81, 82, 81, 65, 33, 65, 49, 65, 49, 18, 97, + 208, 34, 13, 49, 65, 113, 65, 113, 65, 97, 81, 97, + 82, 66, 81, 17, 33, 17, 81, 34, 33, 81, 49, 33, + 81, 97, 81, 97, 81, 97, 81, 97, 81, 240, 32, 41, + 13, 49, 33, 145, 33, 145, 33, 129, 49, 33, 81, 23, + 50, 49, 33, 49, 17, 49, 33, 81, 49, 33, 81, 49, + 33, 81, 33, 49, 33, 33, 33, 49, 33, 33, 17, 65, + 33, 34, 99, 208, 40, 13, 49, 81, 97, 81, 97, 33, + 33, 81, 49, 33, 81, 49, 33, 66, 49, 33, 49, 17, + 49, 49, 65, 49, 49, 65, 33, 65, 65, 33, 81, 49, + 17, 97, 49, 17, 113, 34, 129, 208, 44, 13, 49, 33, + 33, 97, 37, 81, 33, 33, 81, 49, 33, 81, 49, 33, + 66, 49, 33, 49, 17, 49, 33, 81, 49, 33, 81, 49, + 33, 81, 33, 49, 33, 33, 33, 49, 33, 33, 17, 65, + 33, 34, 99, 208, 22, 13, 97, 194, 161, 33, 129, 65, + 82, 33, 53, 81, 49, 129, 121, 177, 193, 177, 193, 177, + 240, 48, 29, 13, 97, 194, 161, 33, 129, 65, 82, 101, + 33, 65, 17, 81, 65, 113, 65, 113, 65, 113, 65, 97, + 81, 81, 97, 65, 113, 240, 16, 41, 13, 49, 113, 65, + 24, 49, 49, 49, 49, 65, 33, 65, 65, 33, 50, 65, + 21, 17, 65, 65, 33, 65, 65, 33, 65, 65, 33, 49, + 81, 33, 49, 17, 49, 33, 33, 51, 49, 17, 81, 240, + 33, 13, 129, 129, 49, 129, 49, 129, 49, 129, 49, 129, + 49, 130, 33, 129, 17, 17, 113, 33, 17, 113, 49, 17, + 81, 49, 50, 33, 49, 83, 49, 113, 208, 25, 13, 113, + 178, 161, 33, 129, 65, 82, 101, 33, 97, 81, 65, 113, + 34, 131, 161, 97, 81, 97, 81, 98, 87, 224, 27, 13, + 113, 178, 161, 33, 129, 65, 82, 101, 38, 17, 81, 65, + 113, 65, 113, 20, 113, 49, 33, 81, 97, 81, 98, 87, + 224, 33, 13, 49, 97, 81, 23, 65, 97, 65, 97, 81, + 81, 82, 81, 33, 17, 17, 25, 33, 81, 97, 81, 97, + 81, 97, 33, 33, 97, 51, 97, 65, 240, 48, 30, 13, + 49, 65, 113, 65, 113, 65, 97, 81, 97, 81, 33, 34, + 26, 17, 81, 97, 81, 97, 81, 97, 81, 97, 81, 97, + 39, 49, 240, 128, 47, 13, 49, 65, 113, 65, 113, 17, + 33, 33, 49, 33, 33, 19, 33, 33, 19, 17, 34, 34, + 17, 33, 17, 20, 33, 33, 49, 33, 33, 33, 49, 33, + 33, 17, 65, 33, 33, 49, 33, 33, 97, 33, 33, 97, + 33, 55, 208, 37, 13, 49, 81, 97, 81, 97, 81, 81, + 25, 33, 97, 66, 49, 33, 49, 17, 49, 33, 81, 65, + 17, 81, 65, 17, 81, 81, 97, 65, 17, 81, 49, 51, + 33, 18, 81, 224, 35, 13, 49, 97, 81, 97, 81, 97, + 65, 40, 33, 113, 50, 113, 33, 17, 49, 49, 65, 65, + 33, 65, 65, 33, 65, 113, 65, 65, 33, 65, 83, 65, + 97, 240, 16, 46, 13, 49, 65, 113, 65, 113, 65, 97, + 33, 33, 49, 33, 33, 33, 49, 18, 33, 33, 50, 17, + 33, 33, 49, 33, 33, 33, 49, 33, 33, 33, 49, 33, + 33, 33, 49, 33, 33, 33, 49, 33, 40, 33, 33, 97, + 208, 29, 13, 97, 194, 161, 33, 129, 65, 82, 101, 65, + 65, 113, 129, 49, 49, 65, 49, 49, 65, 49, 49, 65, + 49, 49, 73, 65, 113, 240, 30, 13, 49, 193, 97, 81, + 23, 49, 81, 97, 81, 82, 81, 65, 17, 81, 97, 81, + 97, 81, 97, 81, 97, 81, 33, 49, 25, 33, 240, 128, + 20, 13, 97, 194, 161, 33, 129, 65, 82, 101, 145, 72, + 129, 193, 193, 193, 193, 65, 44, 208, 43, 13, 49, 193, + 24, 49, 65, 49, 33, 81, 49, 33, 49, 17, 49, 18, + 49, 17, 50, 17, 49, 17, 49, 33, 33, 33, 49, 33, + 81, 49, 33, 65, 65, 33, 65, 65, 33, 49, 35, 49, + 18, 65, 240, 32, 13, 49, 97, 81, 83, 65, 20, 97, + 81, 97, 81, 82, 81, 33, 17, 17, 25, 33, 81, 97, + 81, 97, 81, 97, 81, 97, 81, 97, 81, 240, 32, 35, + 13, 49, 49, 129, 49, 129, 33, 65, 49, 55, 33, 33, + 130, 17, 21, 33, 17, 97, 81, 81, 97, 65, 113, 49, + 81, 33, 33, 97, 33, 33, 97, 33, 55, 208, 36, 13, + 49, 49, 33, 81, 49, 49, 65, 49, 49, 49, 65, 113, + 70, 18, 20, 81, 17, 65, 113, 65, 113, 81, 97, 81, + 49, 33, 97, 33, 33, 113, 17, 33, 130, 208, 23, 13, + 97, 194, 161, 33, 129, 65, 82, 33, 53, 81, 49, 240, + 40, 177, 177, 130, 17, 178, 210, 240, 16, 36, 12, 145, + 49, 33, 65, 49, 49, 49, 49, 50, 33, 49, 65, 33, + 49, 113, 49, 113, 49, 113, 49, 50, 17, 65, 18, 50, + 35, 65, 33, 33, 50, 50, 50, 97, 192, 23, 13, 49, + 193, 113, 65, 24, 33, 193, 178, 161, 17, 113, 65, 54, + 49, 193, 193, 193, 129, 49, 25, 208, 32, 13, 49, 49, + 129, 49, 129, 49, 113, 65, 113, 65, 33, 50, 69, 17, + 17, 65, 113, 65, 113, 65, 113, 65, 113, 65, 113, 65, + 49, 49, 25, 208, 42, 13, 49, 193, 49, 49, 65, 17, + 33, 33, 49, 33, 33, 33, 49, 33, 81, 34, 49, 49, + 33, 17, 49, 49, 65, 65, 17, 81, 81, 97, 65, 17, + 81, 49, 49, 65, 33, 81, 49, 17, 113, 208, 38, 13, + 49, 65, 113, 65, 113, 49, 113, 65, 113, 49, 33, 66, + 33, 49, 49, 17, 17, 49, 97, 81, 97, 65, 33, 65, + 49, 65, 49, 33, 52, 33, 21, 49, 33, 33, 97, 208, + 41, 13, 49, 17, 161, 33, 21, 49, 129, 33, 33, 97, + 33, 33, 97, 18, 33, 98, 17, 33, 97, 33, 33, 97, + 33, 33, 97, 33, 33, 97, 33, 33, 49, 33, 33, 33, + 67, 33, 33, 81, 224, 49, 13, 49, 49, 129, 18, 36, + 49, 17, 49, 33, 33, 33, 49, 33, 33, 33, 49, 33, + 18, 33, 49, 34, 17, 33, 49, 33, 33, 33, 49, 33, + 33, 33, 17, 17, 33, 33, 19, 36, 33, 33, 49, 17, + 49, 97, 81, 97, 240, 16, 35, 13, 49, 65, 113, 65, + 113, 49, 17, 81, 49, 49, 65, 33, 17, 49, 34, 17, + 49, 50, 17, 193, 39, 49, 113, 65, 113, 65, 97, 81, + 97, 81, 81, 240, 32, 41, 13, 49, 65, 113, 65, 113, + 17, 33, 33, 49, 40, 33, 33, 33, 33, 34, 33, 33, + 33, 17, 17, 33, 33, 33, 49, 39, 49, 33, 33, 33, + 49, 81, 97, 81, 97, 81, 97, 81, 240, 32, 47, 13, + 49, 81, 97, 17, 49, 97, 17, 49, 81, 33, 49, 33, + 33, 33, 49, 17, 34, 35, 18, 33, 17, 33, 49, 81, + 33, 49, 81, 33, 49, 81, 33, 49, 81, 33, 17, 17, + 33, 33, 19, 33, 33, 33, 33, 67, 208, 41, 13, 49, + 33, 65, 65, 39, 49, 33, 65, 49, 49, 65, 49, 54, + 34, 49, 65, 17, 17, 49, 65, 49, 54, 49, 49, 65, + 49, 49, 65, 49, 49, 17, 33, 49, 33, 51, 49, 17, + 81, 240, 33, 13, 49, 49, 129, 49, 129, 53, 49, 49, + 33, 81, 33, 49, 66, 97, 49, 17, 97, 81, 40, 33, + 97, 81, 97, 81, 97, 81, 97, 81, 97, 240, 16, 33, + 13, 49, 65, 113, 17, 33, 113, 17, 33, 97, 39, 49, + 17, 49, 82, 81, 65, 17, 81, 107, 33, 81, 97, 81, + 97, 81, 97, 81, 97, 81, 240, 32, 42, 13, 49, 65, + 113, 65, 113, 49, 17, 81, 49, 49, 65, 33, 81, 34, + 17, 17, 49, 18, 17, 49, 49, 65, 49, 49, 65, 49, + 49, 65, 49, 49, 65, 49, 49, 65, 33, 65, 65, 17, + 81, 240, 31, 13, 49, 97, 81, 83, 65, 20, 97, 81, + 97, 81, 82, 81, 33, 17, 17, 25, 33, 81, 97, 81, + 97, 81, 97, 81, 97, 81, 97, 39, 224, 41, 13, 49, + 81, 97, 33, 33, 97, 33, 33, 81, 49, 49, 65, 33, + 81, 34, 17, 114, 18, 22, 65, 65, 33, 65, 65, 33, + 65, 65, 33, 65, 49, 49, 65, 33, 35, 65, 17, 65, + 240, 16, 39, 13, 49, 49, 129, 65, 113, 65, 33, 49, + 25, 33, 65, 98, 65, 49, 17, 17, 70, 33, 65, 49, + 49, 65, 49, 49, 49, 65, 49, 49, 17, 33, 49, 33, + 51, 49, 17, 81, 240, + 0, 0, 0, // Padding + +}; + +tFont *g_psFontWFireflysung6x14 = (tFont *)g_pui8Fireflysung6x14; diff --git a/third_party/fonts/apl/fonts/fontfireflysung7x14.c b/third_party/fonts/apl/fonts/fontfireflysung7x14.c new file mode 100644 index 0000000..23c4c58 --- /dev/null +++ b/third_party/fonts/apl/fonts/fontfireflysung7x14.c @@ -0,0 +1,1047 @@ +//***************************************************************************** +// +// fontfireflysung7x14.c - Font definition for the 7x14 Fireflysung font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from fireflysung-1.3.0 +// +// Copyright (C) 1994-1999, Arphic Technology Co., Ltd. +// Copyright (C) 1999-2004, Firefly and Arphic Technology Co., Ltd. +// +// Author/Designer: +// Original author: +// Arphic Technology Co., Ltd. +// http://www.arphic.com.tw/ +// +// Modified by: +// Firefly +// http://firefly.idv.tw +// +// Modified by: +// Texas Instruments Incorporated for use with TivaWare Graphics Library +// http://www.ti.com/tivaware +// +// NOTICE: This font contains embedded bitmap fonts made +// by firefly and is released as a whole +// under the ARPHIC PUBLIC LICENSE. +// +// Copyright: +// See 'license/english/ARPHICPL.TXT', 'license/big5/ARPHICPL.TXT' or +// 'license/gb/ARPHICPL.TXT'. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 351 in 2 blocks +// Style: fireflysung +// Size: 7x14 +// Bold: no +// Italic: no +// Memory usage: 8309 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Fireflysung7x14[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 13, + + // + // The height of the font. + // + 15, + + // + // The baseline of the font. + // + 13, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x4e00 - 0x4eff + // + 0x00, 0x4e, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, + 0xec, 0x07, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x84, 0x01, 0x00, 0x00, // Offset 388 (0x184) + 0x8e, 0x01, 0x00, 0x00, // Offset 398 (0x18e) + 0xa9, 0x01, 0x00, 0x00, // Offset 425 (0x1a9) + 0xc1, 0x01, 0x00, 0x00, // Offset 449 (0x1c1) + 0xe1, 0x01, 0x00, 0x00, // Offset 481 (0x1e1) + 0xfd, 0x01, 0x00, 0x00, // Offset 509 (0x1fd) + 0x03, 0x02, 0x00, 0x00, // Offset 515 (0x203) + 0x14, 0x02, 0x00, 0x00, // Offset 532 (0x214) + 0x25, 0x02, 0x00, 0x00, // Offset 549 (0x225) + 0x3a, 0x02, 0x00, 0x00, // Offset 570 (0x23a) + 0x48, 0x02, 0x00, 0x00, // Offset 584 (0x248) + 0x4e, 0x02, 0x00, 0x00, // Offset 590 (0x24e) + 0x54, 0x02, 0x00, 0x00, // Offset 596 (0x254) + 0x59, 0x02, 0x00, 0x00, // Offset 601 (0x259) + 0x69, 0x02, 0x00, 0x00, // Offset 617 (0x269) + 0x7a, 0x02, 0x00, 0x00, // Offset 634 (0x27a) + 0x89, 0x02, 0x00, 0x00, // Offset 649 (0x289) + 0x9a, 0x02, 0x00, 0x00, // Offset 666 (0x29a) + 0xae, 0x02, 0x00, 0x00, // Offset 686 (0x2ae) + 0xc2, 0x02, 0x00, 0x00, // Offset 706 (0x2c2) + 0xd3, 0x02, 0x00, 0x00, // Offset 723 (0x2d3) + 0xe7, 0x02, 0x00, 0x00, // Offset 743 (0x2e7) + 0xf6, 0x02, 0x00, 0x00, // Offset 758 (0x2f6) + 0x0c, 0x03, 0x00, 0x00, // Offset 780 (0x30c) + 0x21, 0x03, 0x00, 0x00, // Offset 801 (0x321) + 0x26, 0x03, 0x00, 0x00, // Offset 806 (0x326) + 0x2c, 0x03, 0x00, 0x00, // Offset 812 (0x32c) + 0x3c, 0x03, 0x00, 0x00, // Offset 828 (0x33c) + 0x45, 0x03, 0x00, 0x00, // Offset 837 (0x345) + 0x55, 0x03, 0x00, 0x00, // Offset 853 (0x355) + 0x64, 0x03, 0x00, 0x00, // Offset 868 (0x364) + 0x79, 0x03, 0x00, 0x00, // Offset 889 (0x379) + 0x8e, 0x03, 0x00, 0x00, // Offset 910 (0x38e) + 0xa5, 0x03, 0x00, 0x00, // Offset 933 (0x3a5) + 0xba, 0x03, 0x00, 0x00, // Offset 954 (0x3ba) + 0xd2, 0x03, 0x00, 0x00, // Offset 978 (0x3d2) + 0xe4, 0x03, 0x00, 0x00, // Offset 996 (0x3e4) + 0xf7, 0x03, 0x00, 0x00, // Offset 1015 (0x3f7) + 0x0c, 0x04, 0x00, 0x00, // Offset 1036 (0x40c) + 0x26, 0x04, 0x00, 0x00, // Offset 1062 (0x426) + 0x34, 0x04, 0x00, 0x00, // Offset 1076 (0x434) + 0x44, 0x04, 0x00, 0x00, // Offset 1092 (0x444) + 0x5c, 0x04, 0x00, 0x00, // Offset 1116 (0x45c) + 0x6b, 0x04, 0x00, 0x00, // Offset 1131 (0x46b) + 0x83, 0x04, 0x00, 0x00, // Offset 1155 (0x483) + 0x98, 0x04, 0x00, 0x00, // Offset 1176 (0x498) + 0xab, 0x04, 0x00, 0x00, // Offset 1195 (0x4ab) + 0xbf, 0x04, 0x00, 0x00, // Offset 1215 (0x4bf) + 0xd5, 0x04, 0x00, 0x00, // Offset 1237 (0x4d5) + 0xee, 0x04, 0x00, 0x00, // Offset 1262 (0x4ee) + 0x03, 0x05, 0x00, 0x00, // Offset 1283 (0x503) + 0x13, 0x05, 0x00, 0x00, // Offset 1299 (0x513) + 0x2d, 0x05, 0x00, 0x00, // Offset 1325 (0x52d) + 0x41, 0x05, 0x00, 0x00, // Offset 1345 (0x541) + 0x5b, 0x05, 0x00, 0x00, // Offset 1371 (0x55b) + 0x73, 0x05, 0x00, 0x00, // Offset 1395 (0x573) + 0x87, 0x05, 0x00, 0x00, // Offset 1415 (0x587) + 0x95, 0x05, 0x00, 0x00, // Offset 1429 (0x595) + 0xa4, 0x05, 0x00, 0x00, // Offset 1444 (0x5a4) + 0xb5, 0x05, 0x00, 0x00, // Offset 1461 (0x5b5) + 0xc4, 0x05, 0x00, 0x00, // Offset 1476 (0x5c4) + 0xd0, 0x05, 0x00, 0x00, // Offset 1488 (0x5d0) + 0xd5, 0x05, 0x00, 0x00, // Offset 1493 (0x5d5) + 0xdc, 0x05, 0x00, 0x00, // Offset 1500 (0x5dc) + 0xed, 0x05, 0x00, 0x00, // Offset 1517 (0x5ed) + 0x02, 0x06, 0x00, 0x00, // Offset 1538 (0x602) + 0x10, 0x06, 0x00, 0x00, // Offset 1552 (0x610) + 0x25, 0x06, 0x00, 0x00, // Offset 1573 (0x625) + 0x32, 0x06, 0x00, 0x00, // Offset 1586 (0x632) + 0x43, 0x06, 0x00, 0x00, // Offset 1603 (0x643) + 0x56, 0x06, 0x00, 0x00, // Offset 1622 (0x656) + 0x6d, 0x06, 0x00, 0x00, // Offset 1645 (0x66d) + 0x79, 0x06, 0x00, 0x00, // Offset 1657 (0x679) + 0x86, 0x06, 0x00, 0x00, // Offset 1670 (0x686) + 0x9b, 0x06, 0x00, 0x00, // Offset 1691 (0x69b) + 0xa9, 0x06, 0x00, 0x00, // Offset 1705 (0x6a9) + 0xbe, 0x06, 0x00, 0x00, // Offset 1726 (0x6be) + 0xd1, 0x06, 0x00, 0x00, // Offset 1745 (0x6d1) + 0xe1, 0x06, 0x00, 0x00, // Offset 1761 (0x6e1) + 0xf3, 0x06, 0x00, 0x00, // Offset 1779 (0x6f3) + 0x04, 0x07, 0x00, 0x00, // Offset 1796 (0x704) + 0x13, 0x07, 0x00, 0x00, // Offset 1811 (0x713) + 0x1f, 0x07, 0x00, 0x00, // Offset 1823 (0x71f) + 0x2f, 0x07, 0x00, 0x00, // Offset 1839 (0x72f) + 0x42, 0x07, 0x00, 0x00, // Offset 1858 (0x742) + 0x54, 0x07, 0x00, 0x00, // Offset 1876 (0x754) + 0x6a, 0x07, 0x00, 0x00, // Offset 1898 (0x76a) + 0x7c, 0x07, 0x00, 0x00, // Offset 1916 (0x77c) + 0x8e, 0x07, 0x00, 0x00, // Offset 1934 (0x78e) + 0x9a, 0x07, 0x00, 0x00, // Offset 1946 (0x79a) + 0xaa, 0x07, 0x00, 0x00, // Offset 1962 (0x7aa) + 0xad, 0x07, 0x00, 0x00, // Offset 1965 (0x7ad) + 0xbd, 0x07, 0x00, 0x00, // Offset 1981 (0x7bd) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 4, 8, 0, 15, 4, 1, 25, 34, 10, 5, 2, 18, + 17, 34, 33, 0, 7, 80, 27, 8, 177, 33, 65, 33, + 65, 33, 39, 33, 33, 65, 33, 65, 33, 65, 33, 65, + 33, 39, 33, 33, 65, 33, 65, 33, 176, 24, 7, 161, + 69, 17, 33, 34, 33, 34, 33, 65, 17, 83, 81, 17, + 65, 34, 33, 34, 33, 33, 21, 65, 160, 32, 7, 130, + 50, 33, 17, 17, 33, 17, 17, 33, 17, 17, 34, 50, + 17, 81, 81, 18, 50, 33, 17, 17, 33, 17, 17, 33, + 17, 17, 34, 50, 128, 28, 7, 146, 65, 33, 49, 33, + 49, 17, 81, 97, 19, 17, 17, 17, 33, 17, 17, 17, + 33, 17, 17, 49, 33, 50, 35, 33, 224, 6, 2, 2, + 18, 240, 160, 17, 4, 49, 33, 33, 49, 33, 49, 49, + 49, 49, 49, 65, 49, 65, 65, 64, 17, 4, 1, 65, + 65, 49, 65, 49, 49, 49, 49, 49, 33, 49, 33, 33, + 112, 21, 7, 240, 145, 49, 33, 33, 17, 17, 17, 51, + 49, 17, 17, 17, 33, 33, 49, 240, 240, 128, 14, 7, + 240, 145, 97, 97, 97, 55, 49, 97, 97, 97, 240, 144, + 6, 2, 240, 84, 18, 48, 6, 4, 240, 212, 240, 208, + 5, 2, 240, 116, 64, 16, 6, 177, 81, 65, 81, 65, + 81, 65, 81, 65, 81, 65, 81, 240, 32, 17, 6, 226, + 49, 33, 17, 66, 66, 66, 66, 66, 66, 65, 17, 33, + 50, 224, 15, 5, 193, 50, 33, 17, 65, 65, 65, 65, + 65, 65, 65, 37, 160, 17, 7, 240, 19, 49, 49, 17, + 82, 81, 81, 81, 81, 81, 81, 66, 88, 224, 20, 7, + 240, 19, 49, 49, 17, 82, 81, 81, 51, 113, 17, 82, + 81, 17, 49, 51, 240, 16, 20, 7, 240, 65, 82, 65, + 17, 49, 33, 49, 33, 33, 49, 17, 65, 23, 81, 97, + 83, 224, 17, 7, 230, 17, 97, 97, 97, 19, 34, 49, + 113, 98, 82, 65, 36, 240, 16, 20, 7, 240, 20, 33, + 66, 97, 97, 19, 34, 49, 17, 82, 82, 81, 17, 49, + 51, 240, 16, 15, 7, 232, 82, 81, 81, 97, 81, 97, + 81, 97, 97, 97, 240, 32, 22, 7, 240, 19, 49, 49, + 17, 82, 81, 17, 49, 51, 49, 49, 17, 82, 81, 17, + 49, 51, 240, 16, 21, 7, 240, 19, 49, 49, 17, 82, + 82, 81, 17, 50, 35, 17, 98, 81, 17, 49, 51, 240, + 16, 5, 2, 164, 100, 96, 6, 2, 164, 100, 18, 48, + 16, 7, 209, 81, 81, 81, 81, 81, 81, 113, 113, 113, + 113, 113, 113, 112, 9, 7, 240, 240, 199, 231, 240, 240, + 80, 16, 7, 113, 113, 113, 113, 113, 113, 113, 81, 81, + 81, 81, 81, 81, 208, 15, 6, 212, 17, 66, 65, 81, + 65, 65, 65, 81, 240, 33, 81, 144, 21, 7, 244, 33, + 65, 17, 82, 34, 18, 17, 35, 17, 50, 17, 35, 34, + 18, 113, 65, 36, 240, 21, 7, 240, 33, 97, 81, 17, + 65, 17, 65, 17, 49, 49, 33, 49, 37, 17, 82, 83, + 50, 224, 23, 7, 229, 49, 49, 33, 65, 17, 65, 17, + 49, 36, 49, 49, 33, 65, 17, 65, 17, 49, 21, 240, + 16, 21, 7, 240, 19, 17, 17, 50, 17, 66, 97, 97, + 97, 97, 81, 17, 65, 17, 49, 51, 240, 16, 24, 7, + 229, 49, 49, 33, 49, 33, 65, 17, 65, 17, 65, 17, + 65, 17, 65, 17, 49, 33, 49, 21, 240, 16, 18, 7, + 231, 17, 65, 17, 97, 97, 33, 52, 49, 33, 49, 97, + 65, 17, 72, 224, 19, 7, 231, 17, 65, 17, 65, 17, + 97, 33, 52, 49, 33, 49, 97, 97, 83, 240, 48, 21, + 7, 240, 19, 17, 17, 50, 17, 66, 97, 97, 52, 82, + 81, 17, 65, 18, 34, 50, 17, 224, 26, 8, 240, 19, + 35, 17, 65, 33, 65, 33, 65, 33, 65, 38, 33, 65, + 33, 65, 33, 65, 33, 65, 19, 35, 240, 16, 14, 3, + 99, 17, 33, 33, 33, 33, 33, 33, 33, 33, 19, 96, + 16, 6, 228, 65, 81, 81, 81, 81, 81, 81, 17, 49, + 17, 49, 35, 224, 24, 7, 227, 34, 17, 49, 33, 33, + 49, 17, 66, 81, 17, 65, 17, 65, 33, 49, 33, 49, + 49, 19, 34, 224, 15, 7, 227, 81, 97, 97, 97, 97, + 97, 97, 97, 65, 17, 72, 224, 24, 7, 225, 83, 51, + 17, 17, 18, 17, 17, 18, 17, 17, 18, 33, 34, 33, + 34, 33, 34, 82, 83, 50, 224, 21, 7, 225, 68, 67, + 66, 17, 50, 17, 50, 33, 34, 33, 34, 49, 18, 49, + 18, 68, 65, 224, 19, 7, 240, 19, 49, 49, 17, 82, + 82, 82, 82, 82, 82, 81, 17, 49, 51, 240, 16, 20, + 7, 229, 49, 49, 33, 65, 17, 65, 17, 65, 17, 49, + 36, 49, 97, 97, 83, 240, 48, 22, 7, 240, 19, 49, + 49, 33, 49, 17, 82, 82, 82, 19, 17, 17, 49, 33, + 49, 51, 97, 114, 112, 25, 8, 240, 21, 65, 49, 49, + 65, 33, 65, 33, 49, 52, 65, 33, 65, 49, 49, 49, + 49, 65, 19, 50, 240, 16, 21, 7, 240, 18, 17, 33, + 34, 17, 65, 17, 97, 116, 113, 17, 82, 83, 49, 17, + 19, 240, 16, 16, 7, 232, 33, 34, 33, 33, 49, 97, + 97, 97, 97, 97, 97, 69, 240, 26, 8, 240, 19, 35, + 17, 65, 33, 65, 33, 65, 33, 65, 33, 65, 33, 65, + 33, 65, 33, 65, 33, 65, 52, 240, 48, 20, 7, 226, + 51, 82, 82, 82, 81, 17, 49, 33, 49, 49, 17, 65, + 17, 81, 97, 240, 32, 26, 7, 226, 51, 82, 82, 33, + 34, 33, 34, 17, 17, 18, 17, 17, 18, 17, 17, 17, + 17, 49, 33, 49, 33, 49, 240, 24, 7, 227, 19, 17, + 49, 33, 49, 49, 17, 65, 17, 81, 81, 17, 65, 17, + 49, 49, 33, 49, 18, 35, 224, 20, 7, 226, 51, 82, + 81, 17, 49, 33, 49, 49, 17, 65, 17, 81, 97, 97, + 83, 240, 16, 14, 7, 232, 65, 81, 97, 81, 97, 81, + 97, 81, 66, 88, 224, 15, 3, 52, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 35, 48, 17, 7, 1, 97, + 113, 97, 113, 97, 113, 97, 113, 97, 113, 97, 113, 97, + 112, 15, 3, 51, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 36, 48, 12, 7, 49, 81, 17, 49, 49, 17, + 81, 0, 9, 80, 5, 7, 0, 12, 39, 7, 3, 98, + 33, 49, 240, 240, 17, 8, 0, 6, 36, 49, 65, 113, + 38, 17, 81, 17, 66, 36, 18, 240, 16, 21, 7, 226, + 97, 97, 97, 100, 49, 49, 33, 65, 17, 65, 17, 65, + 18, 33, 33, 18, 240, 16, 14, 7, 240, 240, 227, 17, + 17, 51, 82, 97, 113, 65, 36, 240, 21, 7, 240, 65, + 97, 97, 97, 52, 33, 49, 17, 65, 17, 65, 17, 65, + 33, 34, 50, 18, 224, 13, 7, 240, 240, 227, 49, 49, + 17, 89, 113, 65, 36, 240, 17, 7, 240, 35, 49, 49, + 33, 97, 70, 49, 97, 97, 97, 97, 83, 240, 32, 19, + 8, 0, 6, 35, 18, 17, 49, 49, 49, 67, 65, 116, + 49, 65, 33, 81, 37, 32, 23, 8, 240, 18, 113, 113, + 113, 113, 19, 50, 49, 33, 65, 33, 65, 33, 65, 33, + 65, 19, 35, 240, 16, 12, 3, 113, 33, 114, 33, 33, + 33, 33, 33, 19, 96, 13, 4, 162, 34, 162, 49, 49, + 49, 49, 50, 34, 33, 18, 21, 7, 226, 97, 97, 97, + 50, 17, 49, 33, 33, 51, 65, 33, 49, 33, 49, 49, + 19, 34, 224, 14, 3, 98, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 19, 96, 21, 7, 240, 240, 193, 17, 18, + 18, 17, 34, 33, 34, 33, 34, 33, 34, 33, 34, 33, + 33, 224, 19, 7, 240, 240, 194, 18, 50, 33, 33, 49, + 33, 49, 33, 49, 33, 49, 19, 19, 224, 16, 7, 240, + 240, 227, 49, 49, 17, 82, 82, 81, 17, 49, 51, 240, + 16, 18, 7, 240, 240, 197, 49, 49, 33, 65, 17, 65, + 17, 49, 36, 49, 97, 83, 64, 17, 7, 240, 240, 229, + 17, 49, 17, 65, 17, 65, 33, 49, 52, 97, 97, 83, + 15, 6, 240, 240, 98, 18, 34, 33, 17, 49, 17, 81, + 81, 67, 240, 12, 6, 240, 240, 116, 17, 66, 100, 98, + 65, 20, 208, 16, 7, 240, 129, 97, 97, 70, 49, 97, + 97, 97, 49, 33, 49, 51, 240, 19, 7, 240, 240, 194, + 50, 17, 65, 17, 65, 17, 65, 17, 65, 17, 50, 35, + 17, 224, 18, 7, 240, 240, 194, 51, 81, 17, 49, 33, + 49, 49, 17, 65, 17, 81, 240, 32, 22, 7, 240, 240, + 193, 33, 34, 33, 34, 17, 17, 18, 17, 17, 17, 17, + 49, 33, 49, 33, 49, 240, 18, 7, 240, 240, 195, 19, + 17, 49, 49, 17, 81, 81, 17, 49, 49, 19, 19, 224, + 18, 7, 240, 240, 195, 19, 17, 49, 49, 33, 49, 17, + 82, 81, 97, 81, 66, 80, 12, 7, 240, 240, 200, 65, + 81, 81, 81, 81, 72, 224, 16, 3, 81, 17, 33, 33, + 33, 33, 17, 33, 49, 33, 33, 33, 49, 48, 3, 1, + 15, 16, 3, 49, 49, 33, 33, 33, 33, 49, 17, 33, + 33, 33, 33, 17, 80, 12, 7, 240, 240, 98, 65, 33, + 33, 66, 0, 6, 32, + 0, 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x4e00 - 0x4eff + // + 0x00, 0x04, 0x00, 0x00, // Offset 1024 (0x400) + 0x08, 0x04, 0x00, 0x00, // Offset 1032 (0x408) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x1b, 0x04, 0x00, 0x00, // Offset 1051 (0x41b) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x31, 0x04, 0x00, 0x00, // Offset 1073 (0x431) + 0x4d, 0x04, 0x00, 0x00, // Offset 1101 (0x44d) + 0x66, 0x04, 0x00, 0x00, // Offset 1126 (0x466) + 0x75, 0x04, 0x00, 0x00, // Offset 1141 (0x475) + 0x88, 0x04, 0x00, 0x00, // Offset 1160 (0x488) + 0x9e, 0x04, 0x00, 0x00, // Offset 1182 (0x49e) + 0xbc, 0x04, 0x00, 0x00, // Offset 1212 (0x4bc) + 0xd7, 0x04, 0x00, 0x00, // Offset 1239 (0x4d7) + 0xee, 0x04, 0x00, 0x00, // Offset 1262 (0x4ee) + 0x08, 0x05, 0x00, 0x00, // Offset 1288 (0x508) + 0x1f, 0x05, 0x00, 0x00, // Offset 1311 (0x51f) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x3a, 0x05, 0x00, 0x00, // Offset 1338 (0x53a) + 0x4f, 0x05, 0x00, 0x00, // Offset 1359 (0x54f) + 0x6a, 0x05, 0x00, 0x00, // Offset 1386 (0x56a) + 0x84, 0x05, 0x00, 0x00, // Offset 1412 (0x584) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xa6, 0x05, 0x00, 0x00, // Offset 1446 (0x5a6) + 0xbf, 0x05, 0x00, 0x00, // Offset 1471 (0x5bf) + 0xe3, 0x05, 0x00, 0x00, // Offset 1507 (0x5e3) + 0x0c, 0x06, 0x00, 0x00, // Offset 1548 (0x60c) + 0x2e, 0x06, 0x00, 0x00, // Offset 1582 (0x62e) + 0x4b, 0x06, 0x00, 0x00, // Offset 1611 (0x64b) + 0x6b, 0x06, 0x00, 0x00, // Offset 1643 (0x66b) + 0x8b, 0x06, 0x00, 0x00, // Offset 1675 (0x68b) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xa0, 0x06, 0x00, 0x00, // Offset 1696 (0x6a0) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xb5, 0x06, 0x00, 0x00, // Offset 1717 (0x6b5) + 0xe0, 0x06, 0x00, 0x00, // Offset 1760 (0x6e0) + 0xfc, 0x06, 0x00, 0x00, // Offset 1788 (0x6fc) + 0x26, 0x07, 0x00, 0x00, // Offset 1830 (0x726) + 0x45, 0x07, 0x00, 0x00, // Offset 1861 (0x745) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x55, 0x07, 0x00, 0x00, // Offset 1877 (0x755) + 0x6e, 0x07, 0x00, 0x00, // Offset 1902 (0x76e) + 0x82, 0x07, 0x00, 0x00, // Offset 1922 (0x782) + 0x97, 0x07, 0x00, 0x00, // Offset 1943 (0x797) + 0xb2, 0x07, 0x00, 0x00, // Offset 1970 (0x7b2) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xd1, 0x07, 0x00, 0x00, // Offset 2001 (0x7d1) + 0xe6, 0x07, 0x00, 0x00, // Offset 2022 (0x7e6) + 0x11, 0x08, 0x00, 0x00, // Offset 2065 (0x811) + 0x2b, 0x08, 0x00, 0x00, // Offset 2091 (0x82b) + 0x52, 0x08, 0x00, 0x00, // Offset 2130 (0x852) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x81, 0x08, 0x00, 0x00, // Offset 2177 (0x881) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x8b, 0x08, 0x00, 0x00, // Offset 2187 (0x88b) + 0xaa, 0x08, 0x00, 0x00, // Offset 2218 (0x8aa) + 0xcc, 0x08, 0x00, 0x00, // Offset 2252 (0x8cc) + 0xee, 0x08, 0x00, 0x00, // Offset 2286 (0x8ee) + 0x02, 0x09, 0x00, 0x00, // Offset 2306 (0x902) + 0x22, 0x09, 0x00, 0x00, // Offset 2338 (0x922) + 0x52, 0x09, 0x00, 0x00, // Offset 2386 (0x952) + 0x71, 0x09, 0x00, 0x00, // Offset 2417 (0x971) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x82, 0x09, 0x00, 0x00, // Offset 2434 (0x982) + 0x9e, 0x09, 0x00, 0x00, // Offset 2462 (0x99e) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xbe, 0x09, 0x00, 0x00, // Offset 2494 (0x9be) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xd7, 0x09, 0x00, 0x00, // Offset 2519 (0x9d7) + 0xed, 0x09, 0x00, 0x00, // Offset 2541 (0x9ed) + 0x08, 0x0a, 0x00, 0x00, // Offset 2568 (0xa08) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x28, 0x0a, 0x00, 0x00, // Offset 2600 (0xa28) + 0x3c, 0x0a, 0x00, 0x00, // Offset 2620 (0xa3c) + 0x55, 0x0a, 0x00, 0x00, // Offset 2645 (0xa55) + 0x6b, 0x0a, 0x00, 0x00, // Offset 2667 (0xa6b) + 0x84, 0x0a, 0x00, 0x00, // Offset 2692 (0xa84) + 0x98, 0x0a, 0x00, 0x00, // Offset 2712 (0xa98) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xba, 0x0a, 0x00, 0x00, // Offset 2746 (0xaba) + 0xd2, 0x0a, 0x00, 0x00, // Offset 2770 (0xad2) + 0xe9, 0x0a, 0x00, 0x00, // Offset 2793 (0xae9) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x07, 0x0b, 0x00, 0x00, // Offset 2823 (0xb07) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x2b, 0x0b, 0x00, 0x00, // Offset 2859 (0xb2b) + 0x4f, 0x0b, 0x00, 0x00, // Offset 2895 (0xb4f) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x63, 0x0b, 0x00, 0x00, // Offset 2915 (0xb63) + 0x80, 0x0b, 0x00, 0x00, // Offset 2944 (0xb80) + 0x9d, 0x0b, 0x00, 0x00, // Offset 2973 (0xb9d) + 0xb2, 0x0b, 0x00, 0x00, // Offset 2994 (0xbb2) + 0xd5, 0x0b, 0x00, 0x00, // Offset 3029 (0xbd5) + 0xee, 0x0b, 0x00, 0x00, // Offset 3054 (0xbee) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x06, 0x0c, 0x00, 0x00, // Offset 3078 (0xc06) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x23, 0x0c, 0x00, 0x00, // Offset 3107 (0xc23) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x47, 0x0c, 0x00, 0x00, // Offset 3143 (0xc47) + 0x60, 0x0c, 0x00, 0x00, // Offset 3168 (0xc60) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x86, 0x0c, 0x00, 0x00, // Offset 3206 (0xc86) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xaf, 0x0c, 0x00, 0x00, // Offset 3247 (0xcaf) + 0xd2, 0x0c, 0x00, 0x00, // Offset 3282 (0xcd2) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x0d, 0x00, 0x00, // Offset 3328 (0xd00) + 0x31, 0x0d, 0x00, 0x00, // Offset 3377 (0xd31) + 0x67, 0x0d, 0x00, 0x00, // Offset 3431 (0xd67) + 0x89, 0x0d, 0x00, 0x00, // Offset 3465 (0xd89) + 0x99, 0x0d, 0x00, 0x00, // Offset 3481 (0xd99) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xac, 0x0d, 0x00, 0x00, // Offset 3500 (0xdac) + 0xc3, 0x0d, 0x00, 0x00, // Offset 3523 (0xdc3) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xde, 0x0d, 0x00, 0x00, // Offset 3550 (0xdde) + 0xf5, 0x0d, 0x00, 0x00, // Offset 3573 (0xdf5) + 0x01, 0x0e, 0x00, 0x00, // Offset 3585 (0xe01) + 0x14, 0x0e, 0x00, 0x00, // Offset 3604 (0xe14) + 0x28, 0x0e, 0x00, 0x00, // Offset 3624 (0xe28) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x3c, 0x0e, 0x00, 0x00, // Offset 3644 (0xe3c) + 0x52, 0x0e, 0x00, 0x00, // Offset 3666 (0xe52) + 0x69, 0x0e, 0x00, 0x00, // Offset 3689 (0xe69) + 0x83, 0x0e, 0x00, 0x00, // Offset 3715 (0xe83) + 0x9b, 0x0e, 0x00, 0x00, // Offset 3739 (0xe9b) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xbb, 0x0e, 0x00, 0x00, // Offset 3771 (0xebb) + 0xd1, 0x0e, 0x00, 0x00, // Offset 3793 (0xed1) + 0xee, 0x0e, 0x00, 0x00, // Offset 3822 (0xeee) + 0x14, 0x0f, 0x00, 0x00, // Offset 3860 (0xf14) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x36, 0x0f, 0x00, 0x00, // Offset 3894 (0xf36) + 0x53, 0x0f, 0x00, 0x00, // Offset 3923 (0xf53) + 0x78, 0x0f, 0x00, 0x00, // Offset 3960 (0xf78) + 0x85, 0x0f, 0x00, 0x00, // Offset 3973 (0xf85) + 0x99, 0x0f, 0x00, 0x00, // Offset 3993 (0xf99) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xb4, 0x0f, 0x00, 0x00, // Offset 4020 (0xfb4) + 0xd1, 0x0f, 0x00, 0x00, // Offset 4049 (0xfd1) + 0xec, 0x0f, 0x00, 0x00, // Offset 4076 (0xfec) + 0x13, 0x10, 0x00, 0x00, // Offset 4115 (0x1013) + 0x28, 0x10, 0x00, 0x00, // Offset 4136 (0x1028) + 0x3c, 0x10, 0x00, 0x00, // Offset 4156 (0x103c) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x58, 0x10, 0x00, 0x00, // Offset 4184 (0x1058) + 0x6c, 0x10, 0x00, 0x00, // Offset 4204 (0x106c) + 0x89, 0x10, 0x00, 0x00, // Offset 4233 (0x1089) + 0x9d, 0x10, 0x00, 0x00, // Offset 4253 (0x109d) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xb4, 0x10, 0x00, 0x00, // Offset 4276 (0x10b4) + 0xd0, 0x10, 0x00, 0x00, // Offset 4304 (0x10d0) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xe6, 0x10, 0x00, 0x00, // Offset 4326 (0x10e6) + 0x0d, 0x11, 0x00, 0x00, // Offset 4365 (0x110d) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x2c, 0x11, 0x00, 0x00, // Offset 4396 (0x112c) + 0x4c, 0x11, 0x00, 0x00, // Offset 4428 (0x114c) + 0x61, 0x11, 0x00, 0x00, // Offset 4449 (0x1161) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x74, 0x11, 0x00, 0x00, // Offset 4468 (0x1174) + 0x95, 0x11, 0x00, 0x00, // Offset 4501 (0x1195) + 0xb8, 0x11, 0x00, 0x00, // Offset 4536 (0x11b8) + 0xd0, 0x11, 0x00, 0x00, // Offset 4560 (0x11d0) + 0xfc, 0x11, 0x00, 0x00, // Offset 4604 (0x11fc) + 0x1e, 0x12, 0x00, 0x00, // Offset 4638 (0x121e) + 0x3e, 0x12, 0x00, 0x00, // Offset 4670 (0x123e) + 0x66, 0x12, 0x00, 0x00, // Offset 4710 (0x1266) + 0x89, 0x12, 0x00, 0x00, // Offset 4745 (0x1289) + 0xb5, 0x12, 0x00, 0x00, // Offset 4789 (0x12b5) + 0xdf, 0x12, 0x00, 0x00, // Offset 4831 (0x12df) + 0x0e, 0x13, 0x00, 0x00, // Offset 4878 (0x130e) + 0x28, 0x13, 0x00, 0x00, // Offset 4904 (0x1328) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x47, 0x13, 0x00, 0x00, // Offset 4935 (0x1347) + 0x73, 0x13, 0x00, 0x00, // Offset 4979 (0x1373) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x98, 0x13, 0x00, 0x00, // Offset 5016 (0x1398) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xb5, 0x13, 0x00, 0x00, // Offset 5045 (0x13b5) + 0xd2, 0x13, 0x00, 0x00, // Offset 5074 (0x13d2) + 0xf5, 0x13, 0x00, 0x00, // Offset 5109 (0x13f5) + 0x16, 0x14, 0x00, 0x00, // Offset 5142 (0x1416) + 0x46, 0x14, 0x00, 0x00, // Offset 5190 (0x1446) + 0x6e, 0x14, 0x00, 0x00, // Offset 5230 (0x146e) + 0x94, 0x14, 0x00, 0x00, // Offset 5268 (0x1494) + 0xc4, 0x14, 0x00, 0x00, // Offset 5316 (0x14c4) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xe5, 0x14, 0x00, 0x00, // Offset 5349 (0x14e5) + 0x06, 0x15, 0x00, 0x00, // Offset 5382 (0x1506) + 0x1e, 0x15, 0x00, 0x00, // Offset 5406 (0x151e) + 0x4d, 0x15, 0x00, 0x00, // Offset 5453 (0x154d) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x6f, 0x15, 0x00, 0x00, // Offset 5487 (0x156f) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x94, 0x15, 0x00, 0x00, // Offset 5524 (0x1594) + 0xbc, 0x15, 0x00, 0x00, // Offset 5564 (0x15bc) + 0xd5, 0x15, 0x00, 0x00, // Offset 5589 (0x15d5) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xfb, 0x15, 0x00, 0x00, // Offset 5627 (0x15fb) + 0x15, 0x16, 0x00, 0x00, // Offset 5653 (0x1615) + 0x38, 0x16, 0x00, 0x00, // Offset 5688 (0x1638) + 0x64, 0x16, 0x00, 0x00, // Offset 5732 (0x1664) + 0x8a, 0x16, 0x00, 0x00, // Offset 5770 (0x168a) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xb8, 0x16, 0x00, 0x00, // Offset 5816 (0x16b8) + 0xec, 0x16, 0x00, 0x00, // Offset 5868 (0x16ec) + 0x12, 0x17, 0x00, 0x00, // Offset 5906 (0x1712) + 0x3d, 0x17, 0x00, 0x00, // Offset 5949 (0x173d) + 0x70, 0x17, 0x00, 0x00, // Offset 6000 (0x1770) + 0x9c, 0x17, 0x00, 0x00, // Offset 6044 (0x179c) + 0xc2, 0x17, 0x00, 0x00, // Offset 6082 (0x17c2) + 0xe7, 0x17, 0x00, 0x00, // Offset 6119 (0x17e7) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x14, 0x18, 0x00, 0x00, // Offset 6164 (0x1814) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x35, 0x18, 0x00, 0x00, // Offset 6197 (0x1835) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x62, 0x18, 0x00, 0x00, // Offset 6242 (0x1862) + + // + // Block 1 Data: Codepoints 0x4e00 - 0x4eff + // + 8, 13, 0, 9, 65, 29, 0, 13, 19, 13, 177, 29, + 97, 193, 193, 193, 193, 193, 193, 193, 193, 145, 33, 163, + 177, 240, 80, 22, 13, 81, 193, 193, 193, 193, 81, 97, + 52, 84, 70, 193, 193, 193, 81, 97, 81, 97, 82, 102, + 224, 28, 13, 177, 29, 65, 193, 193, 81, 104, 81, 81, + 97, 81, 97, 81, 97, 81, 81, 97, 65, 49, 49, 49, + 83, 49, 113, 240, 32, 25, 13, 113, 193, 193, 49, 29, + 113, 193, 129, 49, 129, 49, 145, 17, 161, 17, 178, 177, + 17, 130, 50, 51, 115, 208, 15, 13, 240, 129, 59, 0, + 6, 17, 89, 0, 6, 65, 29, 240, 176, 19, 13, 81, + 193, 193, 193, 193, 65, 119, 97, 193, 193, 193, 193, 193, + 193, 81, 29, 208, 22, 13, 177, 29, 97, 193, 193, 194, + 177, 17, 161, 33, 145, 49, 129, 49, 129, 193, 193, 193, + 240, 64, 30, 14, 193, 30, 81, 65, 129, 65, 129, 65, + 129, 65, 129, 65, 129, 65, 129, 65, 129, 65, 113, 81, + 113, 81, 97, 97, 66, 113, 240, 32, 27, 13, 177, 29, + 113, 177, 178, 178, 17, 129, 17, 33, 97, 33, 50, 49, + 49, 66, 17, 65, 82, 81, 193, 193, 193, 240, 64, 23, + 13, 49, 193, 113, 74, 49, 177, 193, 129, 44, 177, 129, + 49, 25, 33, 193, 129, 49, 147, 177, 240, 16, 26, 13, + 177, 29, 97, 193, 145, 37, 81, 33, 49, 65, 49, 49, + 65, 49, 49, 58, 193, 193, 113, 65, 132, 177, 240, 32, + 23, 13, 177, 29, 97, 193, 49, 65, 54, 49, 49, 113, + 65, 123, 193, 193, 193, 129, 33, 163, 177, 240, 16, 27, + 13, 161, 59, 97, 65, 113, 65, 113, 65, 113, 65, 113, + 65, 58, 97, 81, 97, 81, 97, 81, 97, 81, 97, 81, + 45, 208, 21, 13, 81, 193, 65, 59, 81, 193, 97, 29, + 49, 185, 177, 177, 130, 17, 178, 210, 193, 240, 16, 27, + 13, 49, 81, 104, 81, 81, 97, 81, 97, 81, 103, 97, + 81, 97, 81, 97, 81, 103, 97, 81, 97, 81, 97, 81, + 61, 208, 26, 13, 177, 44, 113, 193, 177, 178, 161, 17, + 33, 97, 33, 49, 65, 49, 50, 33, 65, 65, 113, 193, + 193, 65, 29, 208, 34, 13, 161, 129, 49, 65, 49, 49, + 65, 49, 49, 45, 33, 49, 49, 65, 49, 49, 65, 49, + 49, 65, 49, 49, 65, 53, 65, 49, 49, 65, 193, 129, + 74, 208, 25, 13, 146, 86, 113, 193, 193, 193, 113, 74, + 49, 65, 113, 65, 113, 65, 113, 65, 113, 65, 113, 65, + 33, 29, 208, 36, 13, 177, 29, 97, 193, 113, 65, 65, + 44, 17, 65, 65, 33, 65, 65, 33, 49, 18, 33, 33, + 49, 34, 17, 33, 33, 65, 17, 33, 17, 113, 33, 145, + 33, 115, 224, 41, 13, 65, 49, 129, 49, 129, 49, 129, + 49, 65, 49, 49, 33, 33, 33, 49, 33, 33, 33, 49, + 17, 65, 17, 49, 17, 65, 17, 50, 81, 17, 49, 129, + 49, 129, 49, 129, 49, 33, 29, 208, 34, 13, 49, 65, + 113, 65, 113, 65, 113, 65, 113, 65, 114, 49, 113, 17, + 33, 97, 33, 17, 17, 81, 65, 17, 65, 65, 49, 129, + 65, 82, 240, 49, 29, 208, 29, 13, 81, 193, 125, 65, + 177, 33, 145, 33, 129, 49, 137, 129, 145, 33, 33, 81, + 49, 49, 49, 65, 50, 17, 81, 65, 98, 240, 64, 32, + 13, 49, 81, 97, 81, 81, 81, 97, 81, 81, 49, 17, + 34, 33, 33, 33, 33, 36, 36, 97, 81, 81, 81, 97, + 65, 101, 21, 240, 161, 29, 208, 32, 13, 41, 177, 177, + 177, 85, 17, 65, 81, 18, 33, 97, 17, 18, 97, 33, + 17, 97, 49, 33, 65, 65, 49, 33, 81, 65, 83, 240, + 33, 29, 208, 21, 14, 177, 45, 129, 209, 209, 139, 129, + 209, 110, 97, 193, 49, 129, 81, 58, 18, 34, 145, 240, + 21, 14, 161, 195, 71, 193, 209, 139, 129, 209, 125, 97, + 193, 65, 113, 97, 43, 18, 18, 161, 224, 43, 13, 177, + 29, 65, 49, 129, 49, 91, 33, 33, 33, 49, 33, 33, + 33, 49, 33, 33, 34, 33, 33, 17, 17, 17, 17, 17, + 33, 17, 33, 33, 17, 34, 49, 65, 33, 49, 81, 33, + 145, 33, 115, 224, 28, 14, 44, 97, 33, 113, 33, 33, + 33, 81, 17, 33, 17, 97, 17, 33, 17, 76, 33, 209, + 209, 209, 209, 209, 193, 193, 240, 192, 42, 14, 49, 98, + 97, 81, 129, 49, 145, 33, 94, 81, 33, 97, 49, 33, + 49, 33, 49, 33, 49, 49, 33, 33, 33, 65, 33, 33, + 33, 81, 17, 33, 17, 97, 17, 33, 17, 129, 33, 49, + 30, 224, 31, 13, 97, 193, 123, 113, 145, 33, 49, 97, + 17, 33, 145, 17, 77, 49, 33, 145, 33, 50, 65, 49, + 17, 97, 65, 113, 18, 34, 67, 98, 208, 16, 2, 1, + 19, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 48, 25, 13, 97, 193, 177, 17, 145, 49, 113, 81, 81, + 49, 49, 34, 65, 66, 97, 193, 193, 193, 193, 193, 193, + 240, 64, 20, 9, 145, 113, 17, 81, 49, 49, 65, 33, + 113, 129, 129, 129, 129, 129, 129, 129, 129, 208, 21, 6, + 81, 81, 17, 49, 34, 17, 49, 17, 81, 81, 66, 34, + 19, 49, 81, 81, 81, 81, 96, 27, 12, 81, 177, 97, + 65, 65, 29, 65, 65, 17, 65, 65, 17, 65, 65, 27, + 17, 65, 65, 97, 177, 177, 177, 177, 240, 48, 31, 13, + 161, 44, 81, 81, 97, 81, 97, 17, 49, 55, 33, 97, + 81, 97, 33, 33, 41, 17, 97, 81, 97, 81, 17, 49, + 114, 33, 147, 161, 208, 21, 13, 97, 193, 49, 59, 113, + 193, 193, 33, 89, 129, 193, 193, 65, 29, 97, 193, 193, + 240, 64, 43, 12, 65, 49, 113, 49, 65, 33, 49, 33, + 17, 33, 49, 33, 17, 33, 49, 33, 17, 33, 49, 33, + 17, 33, 49, 33, 20, 52, 17, 33, 49, 33, 65, 49, + 113, 49, 97, 65, 81, 81, 50, 97, 240, 26, 11, 81, + 97, 49, 49, 42, 17, 49, 49, 33, 49, 49, 41, 97, + 92, 65, 66, 65, 77, 65, 65, 81, 161, 240, 16, 39, + 12, 49, 49, 65, 33, 49, 33, 29, 33, 49, 33, 17, + 33, 49, 33, 27, 65, 49, 75, 17, 33, 49, 33, 17, + 33, 49, 33, 27, 17, 17, 65, 33, 33, 81, 65, 97, + 240, 16, 47, 13, 97, 145, 33, 145, 40, 33, 33, 97, + 33, 17, 33, 65, 34, 65, 49, 33, 81, 49, 33, 23, + 17, 33, 17, 33, 33, 17, 33, 17, 33, 33, 17, 33, + 17, 33, 33, 65, 17, 33, 33, 65, 23, 65, 17, 81, + 224, 10, 4, 240, 17, 65, 65, 65, 49, 240, 144, 31, + 14, 65, 210, 193, 209, 49, 90, 129, 49, 145, 49, 113, + 17, 49, 130, 49, 147, 17, 129, 33, 17, 49, 49, 81, + 49, 33, 97, 51, 132, 240, 34, 13, 55, 97, 81, 97, + 81, 97, 17, 49, 97, 34, 17, 97, 49, 17, 97, 81, + 61, 49, 81, 97, 81, 81, 97, 81, 49, 33, 65, 83, + 49, 113, 240, 32, 34, 13, 97, 129, 49, 145, 33, 145, + 33, 193, 65, 29, 97, 65, 113, 65, 97, 17, 49, 97, + 33, 33, 81, 49, 33, 65, 49, 49, 49, 83, 34, 113, + 240, 16, 20, 14, 97, 225, 209, 49, 60, 129, 209, 209, + 209, 33, 105, 145, 209, 209, 209, 65, 30, 224, 32, 14, + 65, 65, 129, 65, 129, 65, 92, 81, 65, 129, 17, 33, + 129, 33, 17, 129, 65, 78, 65, 65, 113, 81, 113, 81, + 97, 97, 81, 113, 240, 48, 48, 13, 13, 240, 240, 165, + 21, 33, 49, 17, 49, 33, 49, 17, 49, 34, 33, 18, + 33, 33, 17, 17, 17, 17, 17, 33, 17, 17, 17, 17, + 17, 33, 49, 17, 49, 33, 49, 17, 49, 33, 19, 17, + 19, 33, 49, 17, 49, 224, 31, 13, 161, 65, 33, 49, + 97, 33, 33, 97, 33, 17, 77, 65, 49, 113, 33, 33, + 81, 49, 49, 34, 23, 18, 97, 123, 113, 193, 193, 240, + 64, 17, 4, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 33, 49, 33, 33, 112, 28, 13, 161, 65, 113, 65, + 97, 81, 97, 97, 81, 97, 65, 113, 65, 129, 33, 161, + 17, 177, 178, 161, 34, 98, 82, 34, 146, 208, 32, 13, + 145, 74, 113, 49, 129, 49, 129, 33, 145, 33, 33, 97, + 37, 65, 97, 81, 97, 65, 113, 65, 113, 49, 65, 49, + 33, 99, 33, 129, 240, 16, 25, 13, 66, 177, 193, 49, + 134, 97, 65, 97, 81, 81, 81, 193, 193, 177, 17, 145, + 49, 113, 81, 66, 116, 161, 208, 22, 13, 145, 179, 115, + 101, 193, 193, 81, 97, 52, 84, 70, 193, 193, 97, 81, + 97, 81, 97, 103, 208, 27, 12, 82, 161, 161, 177, 161, + 50, 97, 49, 97, 65, 81, 65, 81, 81, 161, 49, 97, + 81, 65, 38, 21, 81, 33, 129, 192, 32, 13, 65, 81, + 65, 33, 65, 65, 49, 33, 81, 49, 33, 81, 97, 97, + 65, 113, 65, 129, 33, 161, 17, 177, 178, 161, 34, 98, + 82, 34, 146, 208, 20, 13, 65, 210, 193, 33, 74, 177, + 177, 177, 177, 177, 177, 177, 178, 146, 33, 99, 71, 224, + 25, 12, 81, 161, 151, 81, 81, 81, 81, 81, 51, 81, + 65, 33, 58, 33, 113, 113, 49, 24, 33, 177, 132, 161, + 224, 22, 13, 50, 177, 193, 113, 59, 17, 49, 113, 65, + 198, 113, 193, 193, 65, 119, 97, 193, 193, 240, 80, 25, + 13, 146, 149, 38, 193, 129, 49, 34, 81, 33, 33, 97, + 33, 17, 77, 97, 193, 193, 145, 33, 163, 178, 240, 64, + 20, 12, 145, 148, 38, 161, 193, 177, 33, 58, 145, 161, + 146, 145, 146, 130, 33, 113, 71, 192, 34, 13, 145, 81, + 83, 70, 113, 49, 113, 65, 113, 65, 65, 29, 97, 146, + 17, 17, 113, 33, 33, 81, 49, 49, 49, 17, 33, 50, + 17, 51, 65, 97, 240, 80, 24, 13, 145, 97, 67, 85, + 129, 193, 97, 89, 65, 65, 113, 65, 113, 65, 33, 29, + 240, 18, 146, 162, 240, 144, 23, 13, 145, 97, 67, 85, + 129, 193, 97, 89, 65, 65, 113, 65, 113, 65, 33, 29, + 240, 98, 210, 194, 208, 30, 14, 147, 71, 177, 209, 81, + 30, 65, 49, 129, 82, 81, 17, 65, 21, 33, 65, 129, + 65, 129, 65, 129, 65, 113, 81, 97, 97, 240, 48, 36, + 13, 145, 147, 86, 193, 109, 49, 33, 33, 97, 33, 33, + 33, 19, 33, 33, 17, 65, 33, 34, 81, 33, 33, 33, + 34, 33, 33, 35, 17, 33, 51, 97, 193, 240, 64, 36, + 13, 130, 71, 177, 109, 97, 33, 97, 33, 33, 37, 33, + 35, 65, 33, 33, 33, 34, 19, 22, 33, 17, 17, 113, + 33, 33, 81, 49, 49, 34, 65, 66, 97, 240, 64, 20, + 12, 113, 73, 161, 161, 161, 161, 161, 161, 161, 161, 145, + 17, 145, 17, 146, 26, 240, 160, 29, 13, 240, 17, 193, + 97, 81, 98, 65, 52, 84, 49, 36, 97, 81, 97, 81, + 97, 81, 97, 81, 66, 33, 49, 129, 49, 129, 73, 208, + 29, 14, 65, 209, 209, 209, 49, 90, 129, 49, 145, 49, + 145, 49, 145, 49, 129, 65, 129, 65, 49, 49, 81, 49, + 33, 97, 51, 132, 240, 21, 13, 49, 193, 97, 89, 49, + 177, 177, 231, 161, 177, 177, 177, 113, 49, 129, 49, 130, + 57, 224, 35, 13, 97, 193, 129, 49, 49, 65, 49, 50, + 49, 53, 69, 49, 35, 49, 49, 65, 49, 49, 65, 49, + 49, 65, 49, 33, 81, 49, 65, 49, 129, 49, 130, 57, + 224, 25, 12, 161, 28, 161, 49, 113, 66, 81, 81, 81, + 177, 114, 33, 67, 65, 19, 113, 33, 129, 129, 33, 147, + 161, 224, 24, 10, 225, 129, 129, 65, 49, 65, 69, 49, + 65, 65, 34, 65, 33, 52, 21, 33, 129, 129, 114, 83, + 240, 32, 29, 12, 81, 49, 113, 66, 81, 81, 25, 113, + 49, 113, 49, 113, 49, 44, 81, 81, 81, 81, 81, 81, + 81, 51, 81, 65, 97, 240, 48, 36, 13, 49, 65, 113, + 65, 113, 65, 116, 17, 113, 65, 113, 65, 113, 65, 71, + 17, 65, 81, 17, 65, 81, 17, 65, 81, 17, 50, 81, + 17, 56, 17, 50, 81, 36, 208, 25, 13, 221, 177, 81, + 33, 33, 113, 17, 113, 65, 129, 49, 193, 49, 29, 97, + 194, 161, 34, 98, 82, 34, 129, 224, 38, 14, 97, 178, + 49, 68, 81, 113, 81, 113, 33, 33, 72, 17, 113, 81, + 113, 81, 86, 33, 81, 65, 33, 81, 65, 33, 49, 17, + 65, 33, 49, 22, 33, 49, 17, 65, 52, 224, 41, 13, + 82, 17, 69, 49, 65, 17, 49, 17, 81, 17, 17, 33, + 81, 17, 17, 33, 71, 17, 129, 49, 113, 65, 116, 17, + 68, 65, 113, 65, 33, 17, 33, 65, 33, 35, 65, 34, + 33, 99, 224, 35, 14, 49, 81, 113, 81, 71, 33, 33, + 65, 70, 21, 17, 113, 49, 149, 37, 33, 49, 97, 37, + 81, 81, 97, 55, 33, 113, 65, 49, 65, 65, 50, 49, + 84, 240, 46, 14, 82, 33, 84, 65, 129, 33, 17, 81, + 33, 17, 33, 113, 81, 97, 33, 49, 81, 33, 65, 83, + 33, 33, 97, 49, 33, 85, 17, 17, 97, 17, 65, 81, + 33, 33, 17, 49, 17, 33, 33, 17, 50, 19, 69, 224, + 49, 13, 82, 33, 53, 17, 33, 65, 17, 17, 49, 55, + 33, 81, 33, 49, 98, 33, 17, 56, 17, 49, 17, 33, + 17, 17, 54, 17, 17, 49, 97, 17, 54, 17, 17, 34, + 17, 33, 17, 17, 34, 34, 33, 17, 34, 17, 35, 35, + 208, 54, 14, 17, 33, 33, 33, 81, 17, 17, 49, 113, + 81, 72, 17, 98, 17, 49, 81, 17, 33, 33, 66, 17, + 33, 33, 87, 17, 65, 17, 49, 33, 65, 17, 17, 17, + 33, 49, 18, 17, 17, 33, 33, 49, 20, 17, 33, 33, + 65, 33, 33, 17, 81, 51, 224, 34, 13, 65, 65, 56, + 17, 113, 65, 70, 33, 193, 56, 17, 49, 97, 17, 70, + 33, 193, 70, 33, 65, 65, 33, 33, 22, 33, 33, 33, + 33, 49, 41, 35, 208, 16, 3, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 36, 33, 48, 19, 11, 145, + 27, 129, 145, 130, 145, 161, 161, 161, 161, 161, 113, 33, + 131, 145, 240, 32, 23, 13, 145, 74, 177, 114, 18, 161, + 65, 29, 97, 65, 113, 49, 129, 193, 193, 145, 33, 163, + 177, 240, 80, 27, 13, 49, 49, 134, 97, 65, 97, 65, + 49, 33, 26, 97, 65, 113, 65, 45, 81, 65, 58, 113, + 65, 113, 148, 177, 240, 96, 23, 14, 113, 65, 30, 113, + 153, 81, 49, 49, 89, 145, 138, 145, 49, 46, 113, 49, + 74, 145, 164, 240, 80, 12, 13, 240, 240, 81, 89, 0, + 13, 1, 29, 240, 176, 19, 13, 145, 89, 240, 240, 145, + 29, 97, 193, 193, 193, 193, 145, 33, 163, 177, 240, 80, + 20, 13, 161, 59, 113, 193, 193, 193, 65, 29, 97, 193, + 193, 193, 145, 33, 163, 177, 240, 80, 20, 13, 145, 89, + 240, 177, 29, 81, 177, 81, 89, 177, 193, 193, 113, 49, + 147, 177, 240, 48, 22, 14, 240, 145, 105, 240, 240, 193, + 30, 97, 193, 209, 49, 129, 81, 97, 53, 54, 66, 49, + 145, 240, 23, 13, 177, 29, 65, 193, 193, 65, 104, 81, + 81, 97, 81, 97, 81, 88, 97, 65, 193, 193, 33, 29, + 208, 26, 13, 145, 74, 240, 240, 145, 29, 49, 65, 113, + 65, 113, 65, 113, 65, 113, 65, 97, 81, 97, 81, 66, + 97, 240, 32, 24, 13, 161, 59, 97, 193, 193, 193, 49, + 89, 97, 65, 113, 65, 113, 65, 113, 65, 113, 65, 113, + 65, 61, 208, 32, 13, 65, 49, 129, 49, 129, 49, 129, + 49, 33, 29, 65, 49, 129, 49, 129, 49, 33, 29, 65, + 49, 129, 49, 113, 65, 113, 65, 82, 81, 240, 32, 22, + 13, 161, 44, 240, 129, 89, 65, 97, 81, 97, 88, 81, + 97, 81, 97, 88, 81, 97, 225, 29, 208, 29, 13, 161, + 59, 81, 193, 65, 119, 81, 81, 97, 17, 49, 97, 33, + 33, 81, 97, 81, 33, 33, 97, 49, 17, 193, 193, 33, + 29, 208, 38, 13, 177, 44, 65, 49, 129, 49, 129, 49, + 81, 33, 49, 33, 33, 33, 49, 33, 49, 17, 49, 17, + 65, 17, 49, 17, 65, 17, 49, 17, 97, 49, 129, 49, + 33, 29, 240, 176, 34, 13, 65, 49, 129, 49, 81, 33, + 49, 33, 33, 35, 17, 17, 49, 33, 50, 65, 33, 49, + 49, 17, 35, 17, 54, 68, 17, 240, 81, 89, 240, 177, + 29, 208, 29, 13, 177, 29, 65, 49, 129, 49, 129, 49, + 33, 36, 53, 17, 145, 33, 145, 33, 145, 36, 52, 81, + 49, 129, 49, 129, 49, 77, 208, 37, 13, 161, 44, 81, + 193, 17, 148, 100, 33, 20, 17, 33, 33, 49, 33, 33, + 33, 34, 33, 33, 33, 49, 36, 33, 33, 17, 17, 33, + 33, 17, 33, 113, 162, 81, 29, 208, 13, 13, 240, 240, + 225, 209, 193, 240, 33, 29, 0, 11, 48, 20, 14, 97, + 225, 209, 65, 30, 65, 209, 209, 209, 209, 209, 209, 209, + 113, 75, 65, 240, 128, 27, 14, 81, 225, 209, 65, 45, + 240, 129, 135, 113, 65, 129, 65, 129, 65, 129, 65, 49, + 65, 65, 49, 49, 81, 52, 116, 240, 29, 14, 98, 209, + 65, 45, 240, 49, 81, 97, 114, 49, 17, 65, 33, 33, + 49, 49, 145, 33, 178, 209, 193, 17, 146, 50, 52, 115, + 224, 27, 13, 81, 209, 193, 65, 29, 81, 177, 49, 113, + 49, 117, 49, 113, 49, 113, 49, 98, 49, 177, 18, 114, + 66, 35, 113, 224, 39, 14, 98, 209, 209, 65, 45, 81, + 49, 145, 49, 113, 17, 49, 17, 81, 17, 49, 33, 49, + 33, 49, 33, 33, 49, 49, 50, 65, 49, 49, 65, 17, + 33, 113, 51, 82, 81, 240, 64, 21, 13, 97, 209, 49, + 44, 65, 65, 129, 33, 107, 33, 193, 193, 193, 193, 193, + 177, 177, 240, 160, 20, 13, 81, 209, 65, 29, 240, 24, + 81, 97, 88, 193, 59, 145, 162, 193, 193, 163, 240, 48, + 28, 13, 81, 209, 193, 65, 29, 249, 65, 49, 49, 65, + 49, 49, 73, 65, 49, 49, 65, 49, 49, 65, 49, 49, + 73, 65, 113, 240, 20, 13, 97, 65, 29, 248, 81, 97, + 88, 240, 41, 161, 177, 65, 29, 97, 193, 163, 240, 64, + 29, 14, 98, 209, 65, 30, 240, 41, 81, 113, 81, 113, + 89, 81, 49, 49, 145, 161, 33, 33, 97, 49, 50, 49, + 35, 68, 65, 97, 224, 20, 13, 97, 65, 29, 240, 23, + 97, 81, 103, 65, 205, 161, 57, 129, 193, 148, 177, 240, + 80, 23, 13, 81, 209, 65, 29, 240, 23, 97, 81, 103, + 240, 45, 161, 85, 129, 49, 49, 49, 65, 52, 100, 208, + 28, 13, 81, 209, 49, 59, 240, 49, 49, 145, 17, 49, + 29, 97, 138, 113, 145, 33, 33, 81, 49, 50, 18, 35, + 65, 113, 240, 64, 22, 13, 97, 65, 29, 240, 23, 97, + 81, 103, 65, 205, 129, 17, 40, 145, 123, 17, 81, 97, + 103, 208, 39, 13, 81, 209, 65, 29, 33, 81, 75, 65, + 49, 17, 17, 37, 34, 17, 17, 33, 49, 33, 21, 33, + 17, 65, 33, 17, 33, 33, 66, 49, 17, 50, 17, 65, + 116, 34, 66, 114, 208, 31, 13, 97, 65, 29, 33, 113, + 65, 21, 17, 65, 17, 49, 17, 65, 21, 17, 65, 113, + 73, 81, 81, 103, 97, 81, 103, 97, 81, 17, 29, 208, + 32, 13, 97, 109, 17, 33, 49, 33, 43, 33, 33, 49, + 33, 43, 33, 33, 17, 17, 33, 30, 33, 81, 34, 39, + 33, 49, 81, 103, 97, 81, 61, 208, 21, 13, 97, 193, + 193, 193, 193, 193, 193, 193, 193, 177, 17, 145, 49, 113, + 81, 81, 117, 145, 224, 19, 5, 65, 65, 65, 49, 65, + 50, 33, 17, 17, 33, 65, 65, 65, 65, 65, 65, 96, + 33, 14, 65, 209, 216, 81, 97, 97, 81, 98, 65, 97, + 17, 65, 81, 33, 49, 145, 33, 161, 33, 161, 17, 97, + 65, 17, 97, 65, 17, 98, 49, 39, 240, 35, 14, 65, + 65, 129, 65, 129, 65, 113, 81, 113, 81, 33, 50, 25, + 17, 17, 81, 65, 33, 81, 113, 81, 113, 81, 113, 81, + 113, 81, 113, 81, 113, 81, 240, 48, 24, 14, 65, 209, + 209, 97, 81, 39, 65, 194, 177, 17, 161, 33, 209, 209, + 209, 209, 129, 65, 25, 49, 240, 144, 44, 14, 65, 49, + 145, 49, 145, 49, 129, 65, 49, 65, 25, 34, 65, 49, + 33, 17, 65, 49, 17, 33, 65, 49, 65, 65, 49, 65, + 65, 49, 65, 49, 65, 65, 49, 65, 65, 33, 36, 65, + 17, 81, 240, 16, 34, 14, 65, 209, 113, 81, 24, 49, + 97, 97, 97, 82, 97, 65, 17, 97, 49, 33, 97, 97, + 97, 97, 97, 97, 97, 97, 49, 33, 97, 67, 97, 81, + 240, 48, 32, 14, 193, 60, 33, 209, 65, 129, 65, 129, + 65, 129, 65, 129, 65, 129, 65, 129, 65, 129, 49, 17, + 97, 49, 49, 81, 33, 82, 33, 18, 130, 224, 40, 14, + 65, 209, 113, 90, 49, 49, 65, 65, 49, 49, 66, 49, + 49, 49, 17, 49, 49, 33, 33, 65, 17, 97, 65, 17, + 97, 81, 113, 82, 97, 65, 18, 81, 49, 50, 65, 18, + 82, 224, 35, 14, 65, 65, 129, 65, 129, 65, 113, 81, + 113, 81, 98, 83, 49, 17, 81, 35, 33, 81, 49, 49, + 81, 113, 81, 113, 81, 113, 81, 113, 81, 113, 81, 240, + 48, 44, 14, 49, 33, 161, 33, 161, 33, 145, 49, 33, + 97, 23, 81, 49, 33, 82, 49, 33, 65, 17, 49, 33, + 97, 49, 33, 97, 49, 33, 97, 33, 49, 33, 49, 33, + 49, 33, 49, 17, 65, 34, 34, 99, 240, 42, 14, 65, + 209, 81, 113, 81, 97, 49, 33, 97, 49, 33, 82, 49, + 33, 65, 17, 49, 33, 49, 33, 33, 49, 97, 33, 65, + 81, 33, 65, 81, 17, 81, 81, 17, 97, 65, 17, 97, + 66, 129, 224, 47, 14, 65, 81, 113, 37, 97, 33, 33, + 97, 49, 33, 97, 49, 33, 82, 49, 33, 65, 17, 49, + 33, 49, 33, 49, 33, 97, 49, 33, 97, 49, 33, 97, + 33, 49, 33, 49, 33, 49, 33, 49, 17, 65, 33, 50, + 99, 224, 26, 13, 98, 177, 177, 17, 145, 49, 113, 17, + 49, 81, 49, 49, 34, 65, 66, 145, 89, 177, 177, 193, + 177, 193, 240, 48, 31, 13, 97, 193, 177, 17, 145, 49, + 113, 81, 81, 117, 17, 65, 33, 65, 65, 113, 65, 113, + 65, 113, 65, 113, 65, 97, 81, 66, 97, 240, 32, 44, + 14, 65, 97, 105, 81, 33, 49, 81, 49, 49, 81, 49, + 49, 66, 49, 33, 65, 17, 49, 22, 33, 49, 81, 49, + 49, 81, 49, 49, 81, 49, 33, 97, 49, 33, 33, 49, + 49, 17, 67, 66, 97, 240, 16, 37, 13, 49, 65, 113, + 65, 113, 65, 113, 65, 113, 65, 113, 65, 114, 49, 113, + 17, 33, 113, 33, 17, 97, 65, 17, 81, 65, 17, 65, + 65, 49, 33, 65, 81, 81, 113, 208, 29, 13, 97, 193, + 177, 17, 145, 49, 98, 82, 34, 131, 49, 66, 97, 65, + 113, 49, 129, 33, 49, 83, 65, 81, 97, 81, 98, 87, + 240, 29, 13, 97, 193, 177, 17, 145, 49, 113, 81, 81, + 117, 23, 17, 65, 81, 97, 81, 97, 81, 97, 50, 33, + 65, 113, 65, 114, 72, 224, 35, 14, 65, 97, 97, 23, + 81, 97, 81, 97, 97, 81, 98, 81, 81, 17, 81, 65, + 33, 25, 49, 81, 113, 81, 113, 81, 113, 33, 33, 113, + 51, 113, 65, 240, 64, 33, 14, 65, 209, 65, 129, 65, + 113, 81, 113, 81, 33, 50, 25, 17, 17, 81, 65, 33, + 81, 113, 81, 113, 81, 113, 81, 113, 81, 113, 39, 65, + 240, 144, 48, 14, 49, 65, 129, 65, 129, 65, 33, 65, + 33, 33, 34, 49, 33, 36, 65, 36, 33, 53, 33, 33, + 33, 17, 33, 33, 33, 65, 33, 33, 33, 65, 33, 33, + 17, 81, 33, 33, 49, 49, 33, 97, 49, 33, 98, 33, + 55, 240, 40, 14, 65, 81, 113, 81, 113, 81, 97, 97, + 17, 65, 25, 34, 97, 65, 17, 33, 49, 49, 33, 49, + 33, 97, 49, 33, 97, 66, 113, 81, 113, 65, 17, 97, + 49, 50, 65, 18, 82, 224, 38, 14, 65, 97, 97, 97, + 97, 97, 81, 113, 81, 25, 34, 113, 49, 17, 49, 49, + 33, 33, 65, 33, 81, 65, 33, 81, 113, 81, 113, 81, + 65, 33, 81, 83, 81, 97, 240, 32, 48, 13, 65, 193, + 65, 113, 65, 97, 81, 97, 33, 33, 33, 34, 33, 33, + 33, 17, 17, 33, 33, 34, 33, 33, 33, 33, 49, 33, + 33, 33, 49, 33, 33, 33, 49, 33, 33, 33, 49, 33, + 33, 33, 49, 39, 49, 33, 81, 208, 33, 12, 81, 177, + 161, 17, 129, 49, 97, 81, 65, 49, 50, 17, 65, 66, + 81, 113, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 57, 49, 113, 224, 33, 14, 65, 209, 97, 97, 23, + 65, 81, 113, 81, 98, 81, 81, 17, 81, 65, 33, 81, + 113, 81, 113, 81, 113, 81, 113, 81, 33, 65, 25, 49, + 240, 144, 24, 13, 97, 193, 177, 17, 145, 49, 113, 81, + 81, 114, 18, 113, 18, 41, 129, 193, 193, 193, 193, 65, + 29, 208, 47, 14, 65, 209, 209, 24, 49, 81, 49, 49, + 81, 49, 34, 33, 33, 49, 17, 17, 33, 33, 50, 33, + 33, 33, 49, 49, 17, 49, 49, 49, 65, 65, 49, 65, + 65, 49, 49, 17, 49, 49, 33, 51, 65, 17, 81, 240, + 16, 34, 14, 65, 98, 81, 66, 113, 20, 113, 81, 113, + 81, 98, 81, 33, 33, 17, 26, 33, 81, 113, 81, 113, + 81, 113, 81, 113, 81, 113, 81, 113, 81, 240, 48, 37, + 14, 65, 33, 161, 33, 161, 33, 65, 65, 55, 49, 33, + 146, 17, 145, 17, 37, 49, 33, 81, 113, 65, 129, 65, + 129, 49, 65, 65, 33, 81, 65, 33, 82, 49, 54, 240, + 40, 14, 65, 49, 17, 113, 49, 34, 81, 49, 49, 65, + 65, 129, 65, 49, 50, 70, 17, 17, 20, 81, 33, 65, + 129, 65, 129, 81, 113, 81, 49, 49, 97, 33, 49, 113, + 17, 49, 130, 224, 25, 14, 113, 209, 193, 17, 161, 49, + 129, 17, 49, 82, 50, 37, 97, 49, 177, 105, 177, 193, + 163, 211, 210, 240, 32, 38, 13, 161, 65, 113, 65, 33, + 65, 65, 49, 49, 65, 50, 33, 65, 65, 33, 65, 113, + 65, 113, 65, 49, 49, 65, 33, 49, 83, 66, 35, 81, + 33, 49, 50, 50, 66, 97, 208, 26, 14, 65, 209, 209, + 113, 65, 40, 49, 194, 177, 17, 113, 33, 33, 54, 65, + 209, 209, 209, 129, 65, 25, 49, 240, 144, 35, 14, 65, + 49, 145, 49, 145, 49, 129, 65, 129, 65, 33, 66, 69, + 33, 17, 65, 81, 33, 65, 129, 65, 129, 65, 129, 65, + 129, 65, 129, 65, 49, 65, 25, 224, 44, 14, 65, 33, + 161, 49, 145, 65, 17, 81, 33, 33, 17, 81, 33, 65, + 66, 33, 65, 49, 17, 49, 49, 33, 33, 49, 33, 97, + 65, 17, 97, 81, 113, 81, 113, 65, 17, 97, 49, 49, + 81, 18, 82, 224, 38, 14, 65, 209, 65, 129, 65, 113, + 65, 129, 65, 114, 49, 33, 65, 17, 33, 50, 33, 33, + 17, 49, 113, 81, 113, 65, 129, 49, 49, 81, 33, 81, + 65, 25, 49, 33, 97, 224, 46, 14, 49, 129, 65, 33, + 37, 49, 49, 65, 49, 145, 49, 33, 97, 34, 33, 97, + 17, 17, 33, 97, 49, 33, 97, 49, 33, 97, 49, 33, + 97, 49, 33, 97, 49, 33, 49, 33, 49, 33, 67, 49, + 33, 81, 240, 16, 52, 14, 65, 209, 49, 145, 18, 36, + 49, 33, 49, 33, 49, 33, 49, 33, 34, 33, 49, 33, + 17, 17, 33, 49, 34, 33, 33, 49, 33, 49, 33, 49, + 33, 49, 33, 17, 17, 33, 49, 34, 33, 33, 49, 33, + 49, 17, 65, 97, 97, 97, 240, 32, 38, 14, 65, 49, + 145, 49, 145, 33, 17, 113, 33, 49, 97, 17, 17, 49, + 67, 50, 34, 17, 17, 81, 65, 33, 209, 24, 65, 113, + 81, 97, 97, 97, 97, 81, 113, 81, 240, 48, 43, 13, + 65, 65, 113, 65, 113, 65, 97, 39, 49, 33, 33, 33, + 34, 33, 33, 33, 17, 17, 33, 33, 34, 33, 33, 33, + 33, 49, 39, 49, 33, 33, 33, 49, 81, 97, 81, 97, + 81, 97, 81, 240, 16, 51, 14, 65, 209, 17, 49, 113, + 17, 49, 97, 33, 49, 97, 33, 49, 33, 34, 33, 49, + 17, 33, 17, 35, 18, 33, 33, 33, 49, 97, 33, 49, + 97, 33, 49, 97, 33, 34, 33, 49, 33, 17, 17, 33, + 49, 34, 33, 33, 49, 18, 67, 224, 44, 14, 65, 113, + 81, 39, 65, 33, 65, 65, 49, 65, 65, 54, 50, 49, + 65, 33, 17, 49, 65, 17, 33, 49, 65, 65, 54, 65, + 49, 65, 65, 49, 65, 65, 49, 65, 65, 33, 36, 65, + 17, 81, 240, 16, 38, 14, 65, 33, 161, 33, 161, 33, + 65, 65, 40, 49, 33, 33, 98, 17, 49, 81, 17, 81, + 33, 17, 33, 25, 49, 81, 113, 81, 113, 81, 113, 81, + 113, 81, 113, 81, 240, 48, 37, 14, 65, 65, 129, 65, + 129, 17, 33, 113, 33, 33, 113, 39, 50, 17, 49, 81, + 18, 65, 65, 33, 81, 33, 75, 49, 81, 113, 81, 113, + 81, 113, 81, 113, 81, 240, 48, 45, 14, 65, 209, 65, + 129, 65, 113, 65, 17, 97, 49, 49, 66, 33, 81, 33, + 17, 17, 17, 49, 18, 33, 49, 49, 81, 49, 49, 81, + 49, 49, 81, 49, 49, 81, 49, 49, 81, 33, 65, 81, + 17, 81, 240, 16, 33, 14, 65, 97, 97, 83, 81, 20, + 113, 81, 113, 81, 113, 81, 98, 81, 33, 33, 17, 26, + 33, 81, 113, 81, 113, 81, 113, 81, 113, 81, 113, 39, + 240, 45, 14, 65, 81, 113, 33, 33, 113, 33, 33, 97, + 49, 49, 81, 33, 65, 66, 17, 98, 17, 18, 22, 18, + 33, 65, 33, 81, 65, 33, 81, 65, 33, 81, 49, 49, + 81, 50, 33, 81, 33, 35, 83, 65, 240, 32, 42, 14, + 65, 49, 145, 66, 113, 81, 97, 129, 65, 25, 34, 65, + 97, 17, 69, 17, 33, 65, 49, 65, 65, 49, 65, 49, + 65, 65, 49, 65, 65, 33, 33, 33, 65, 33, 51, 65, + 17, 81, 240, 16, +}; + +tFont *g_psFontWFireflysung7x14 = (tFont *)g_pui8Fireflysung7x14; diff --git a/third_party/fonts/apl/fonts/fontfireflysung7x15.c b/third_party/fonts/apl/fonts/fontfireflysung7x15.c new file mode 100644 index 0000000..41ea7d8 --- /dev/null +++ b/third_party/fonts/apl/fonts/fontfireflysung7x15.c @@ -0,0 +1,1093 @@ +//***************************************************************************** +// +// fontfireflysung7x15.c - Font definition for the 7x15 Fireflysung font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from fireflysung-1.3.0 +// +// Copyright (C) 1994-1999, Arphic Technology Co., Ltd. +// Copyright (C) 1999-2004, Firefly and Arphic Technology Co., Ltd. +// +// Author/Designer: +// Original author: +// Arphic Technology Co., Ltd. +// http://www.arphic.com.tw/ +// +// Modified by: +// Firefly +// http://firefly.idv.tw +// +// Modified by: +// Texas Instruments Incorporated for use with TivaWare Graphics Library +// http://www.ti.com/tivaware +// +// NOTICE: This font contains embedded bitmap fonts made +// by firefly and is released as a whole +// under the ARPHIC PUBLIC LICENSE. +// +// Copyright: +// See 'license/english/ARPHICPL.TXT', 'license/big5/ARPHICPL.TXT' or +// 'license/gb/ARPHICPL.TXT'. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 351 in 2 blocks +// Style: fireflysung +// Size: 7x15 +// Bold: no +// Italic: no +// Memory usage: 8871 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Fireflysung7x15[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 14, + + // + // The height of the font. + // + 16, + + // + // The baseline of the font. + // + 14, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x4e00 - 0x4eff + // + 0x00, 0x4e, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, + 0xa0, 0x08, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x84, 0x01, 0x00, 0x00, // Offset 388 (0x184) + 0x8e, 0x01, 0x00, 0x00, // Offset 398 (0x18e) + 0xaa, 0x01, 0x00, 0x00, // Offset 426 (0x1aa) + 0xc5, 0x01, 0x00, 0x00, // Offset 453 (0x1c5) + 0xe4, 0x01, 0x00, 0x00, // Offset 484 (0x1e4) + 0x02, 0x02, 0x00, 0x00, // Offset 514 (0x202) + 0x08, 0x02, 0x00, 0x00, // Offset 520 (0x208) + 0x1a, 0x02, 0x00, 0x00, // Offset 538 (0x21a) + 0x2d, 0x02, 0x00, 0x00, // Offset 557 (0x22d) + 0x44, 0x02, 0x00, 0x00, // Offset 580 (0x244) + 0x53, 0x02, 0x00, 0x00, // Offset 595 (0x253) + 0x59, 0x02, 0x00, 0x00, // Offset 601 (0x259) + 0x60, 0x02, 0x00, 0x00, // Offset 608 (0x260) + 0x65, 0x02, 0x00, 0x00, // Offset 613 (0x265) + 0x76, 0x02, 0x00, 0x00, // Offset 630 (0x276) + 0x89, 0x02, 0x00, 0x00, // Offset 649 (0x289) + 0x9a, 0x02, 0x00, 0x00, // Offset 666 (0x29a) + 0xac, 0x02, 0x00, 0x00, // Offset 684 (0x2ac) + 0xc0, 0x02, 0x00, 0x00, // Offset 704 (0x2c0) + 0xd6, 0x02, 0x00, 0x00, // Offset 726 (0x2d6) + 0xea, 0x02, 0x00, 0x00, // Offset 746 (0x2ea) + 0xff, 0x02, 0x00, 0x00, // Offset 767 (0x2ff) + 0x10, 0x03, 0x00, 0x00, // Offset 784 (0x310) + 0x27, 0x03, 0x00, 0x00, // Offset 807 (0x327) + 0x3d, 0x03, 0x00, 0x00, // Offset 829 (0x33d) + 0x42, 0x03, 0x00, 0x00, // Offset 834 (0x342) + 0x48, 0x03, 0x00, 0x00, // Offset 840 (0x348) + 0x59, 0x03, 0x00, 0x00, // Offset 857 (0x359) + 0x62, 0x03, 0x00, 0x00, // Offset 866 (0x362) + 0x72, 0x03, 0x00, 0x00, // Offset 882 (0x372) + 0x82, 0x03, 0x00, 0x00, // Offset 898 (0x382) + 0x9c, 0x03, 0x00, 0x00, // Offset 924 (0x39c) + 0xb3, 0x03, 0x00, 0x00, // Offset 947 (0x3b3) + 0xce, 0x03, 0x00, 0x00, // Offset 974 (0x3ce) + 0xe4, 0x03, 0x00, 0x00, // Offset 996 (0x3e4) + 0x00, 0x04, 0x00, 0x00, // Offset 1024 (0x400) + 0x14, 0x04, 0x00, 0x00, // Offset 1044 (0x414) + 0x29, 0x04, 0x00, 0x00, // Offset 1065 (0x429) + 0x40, 0x04, 0x00, 0x00, // Offset 1088 (0x440) + 0x5d, 0x04, 0x00, 0x00, // Offset 1117 (0x45d) + 0x6d, 0x04, 0x00, 0x00, // Offset 1133 (0x46d) + 0x7f, 0x04, 0x00, 0x00, // Offset 1151 (0x47f) + 0x9b, 0x04, 0x00, 0x00, // Offset 1179 (0x49b) + 0xac, 0x04, 0x00, 0x00, // Offset 1196 (0x4ac) + 0xc6, 0x04, 0x00, 0x00, // Offset 1222 (0x4c6) + 0xdd, 0x04, 0x00, 0x00, // Offset 1245 (0x4dd) + 0xf1, 0x04, 0x00, 0x00, // Offset 1265 (0x4f1) + 0x08, 0x05, 0x00, 0x00, // Offset 1288 (0x508) + 0x1f, 0x05, 0x00, 0x00, // Offset 1311 (0x51f) + 0x3b, 0x05, 0x00, 0x00, // Offset 1339 (0x53b) + 0x50, 0x05, 0x00, 0x00, // Offset 1360 (0x550) + 0x62, 0x05, 0x00, 0x00, // Offset 1378 (0x562) + 0x7f, 0x05, 0x00, 0x00, // Offset 1407 (0x57f) + 0x97, 0x05, 0x00, 0x00, // Offset 1431 (0x597) + 0xb5, 0x05, 0x00, 0x00, // Offset 1461 (0x5b5) + 0xd1, 0x05, 0x00, 0x00, // Offset 1489 (0x5d1) + 0xe7, 0x05, 0x00, 0x00, // Offset 1511 (0x5e7) + 0xf8, 0x05, 0x00, 0x00, // Offset 1528 (0x5f8) + 0x08, 0x06, 0x00, 0x00, // Offset 1544 (0x608) + 0x19, 0x06, 0x00, 0x00, // Offset 1561 (0x619) + 0x29, 0x06, 0x00, 0x00, // Offset 1577 (0x629) + 0x35, 0x06, 0x00, 0x00, // Offset 1589 (0x635) + 0x3a, 0x06, 0x00, 0x00, // Offset 1594 (0x63a) + 0x43, 0x06, 0x00, 0x00, // Offset 1603 (0x643) + 0x58, 0x06, 0x00, 0x00, // Offset 1624 (0x658) + 0x71, 0x06, 0x00, 0x00, // Offset 1649 (0x671) + 0x81, 0x06, 0x00, 0x00, // Offset 1665 (0x681) + 0x99, 0x06, 0x00, 0x00, // Offset 1689 (0x699) + 0xa8, 0x06, 0x00, 0x00, // Offset 1704 (0x6a8) + 0xba, 0x06, 0x00, 0x00, // Offset 1722 (0x6ba) + 0xd1, 0x06, 0x00, 0x00, // Offset 1745 (0x6d1) + 0xeb, 0x06, 0x00, 0x00, // Offset 1771 (0x6eb) + 0xf9, 0x06, 0x00, 0x00, // Offset 1785 (0x6f9) + 0x08, 0x07, 0x00, 0x00, // Offset 1800 (0x708) + 0x21, 0x07, 0x00, 0x00, // Offset 1825 (0x721) + 0x31, 0x07, 0x00, 0x00, // Offset 1841 (0x731) + 0x4a, 0x07, 0x00, 0x00, // Offset 1866 (0x74a) + 0x61, 0x07, 0x00, 0x00, // Offset 1889 (0x761) + 0x73, 0x07, 0x00, 0x00, // Offset 1907 (0x773) + 0x89, 0x07, 0x00, 0x00, // Offset 1929 (0x789) + 0x9e, 0x07, 0x00, 0x00, // Offset 1950 (0x79e) + 0xae, 0x07, 0x00, 0x00, // Offset 1966 (0x7ae) + 0xbc, 0x07, 0x00, 0x00, // Offset 1980 (0x7bc) + 0xcd, 0x07, 0x00, 0x00, // Offset 1997 (0x7cd) + 0xe4, 0x07, 0x00, 0x00, // Offset 2020 (0x7e4) + 0xf8, 0x07, 0x00, 0x00, // Offset 2040 (0x7f8) + 0x13, 0x08, 0x00, 0x00, // Offset 2067 (0x813) + 0x29, 0x08, 0x00, 0x00, // Offset 2089 (0x829) + 0x40, 0x08, 0x00, 0x00, // Offset 2112 (0x840) + 0x4e, 0x08, 0x00, 0x00, // Offset 2126 (0x84e) + 0x5f, 0x08, 0x00, 0x00, // Offset 2143 (0x85f) + 0x63, 0x08, 0x00, 0x00, // Offset 2147 (0x863) + 0x74, 0x08, 0x00, 0x00, // Offset 2164 (0x874) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 4, 8, 0, 16, 4, 1, 26, 34, 10, 5, 82, 18, + 17, 34, 33, 0, 7, 80, 28, 8, 177, 33, 65, 33, + 65, 33, 39, 33, 33, 65, 33, 65, 33, 65, 33, 65, + 33, 39, 33, 33, 65, 33, 65, 33, 240, 64, 27, 7, + 161, 69, 17, 33, 34, 33, 34, 33, 33, 17, 17, 83, + 81, 17, 65, 34, 33, 34, 33, 34, 33, 33, 21, 65, + 160, 31, 7, 130, 50, 33, 34, 33, 17, 17, 33, 17, + 17, 34, 50, 17, 81, 97, 81, 18, 50, 33, 17, 17, + 33, 17, 17, 34, 33, 34, 50, 128, 30, 7, 146, 65, + 33, 49, 33, 49, 33, 49, 17, 81, 97, 19, 17, 17, + 17, 33, 17, 17, 17, 33, 17, 17, 49, 33, 50, 35, + 33, 224, 6, 2, 34, 18, 240, 160, 18, 5, 65, 49, + 49, 49, 65, 49, 65, 65, 65, 65, 65, 81, 65, 81, + 81, 81, 19, 5, 1, 81, 81, 81, 65, 81, 65, 65, + 65, 65, 65, 49, 65, 49, 49, 49, 64, 23, 7, 240, + 145, 97, 49, 33, 33, 17, 17, 17, 51, 49, 17, 17, + 17, 33, 33, 49, 97, 240, 240, 16, 15, 7, 240, 145, + 97, 97, 97, 55, 49, 97, 97, 97, 97, 240, 144, 6, + 2, 240, 116, 18, 48, 7, 4, 240, 212, 240, 240, 32, + 5, 2, 240, 148, 64, 17, 6, 240, 33, 81, 65, 81, + 65, 81, 65, 81, 65, 81, 65, 81, 240, 32, 19, 6, + 130, 49, 33, 17, 66, 66, 66, 66, 66, 66, 66, 66, + 65, 17, 33, 50, 224, 17, 5, 113, 50, 33, 17, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 37, 160, 18, 7, + 147, 49, 49, 17, 82, 81, 97, 97, 81, 81, 81, 81, + 81, 66, 88, 224, 20, 7, 147, 49, 49, 17, 82, 81, + 81, 51, 113, 113, 98, 82, 81, 17, 49, 51, 240, 16, + 22, 7, 193, 82, 82, 65, 17, 65, 17, 49, 33, 49, + 33, 33, 49, 17, 65, 23, 81, 97, 83, 224, 20, 7, + 118, 17, 97, 97, 97, 97, 19, 34, 49, 113, 97, 98, + 81, 17, 49, 51, 240, 16, 21, 7, 148, 33, 66, 97, + 97, 97, 19, 34, 49, 17, 82, 82, 82, 81, 17, 49, + 51, 240, 16, 17, 7, 120, 82, 81, 81, 97, 97, 81, + 97, 97, 81, 97, 97, 97, 240, 32, 23, 7, 147, 49, + 49, 17, 82, 82, 81, 17, 49, 51, 49, 49, 17, 82, + 82, 81, 17, 49, 51, 240, 16, 22, 7, 147, 49, 49, + 17, 82, 82, 82, 81, 17, 50, 35, 17, 97, 98, 81, + 17, 49, 51, 240, 16, 5, 2, 132, 132, 128, 6, 2, + 132, 164, 18, 48, 17, 7, 240, 81, 81, 81, 81, 81, + 81, 81, 113, 113, 113, 113, 113, 113, 112, 9, 7, 240, + 240, 199, 231, 240, 240, 192, 16, 7, 225, 113, 113, 113, + 113, 113, 113, 81, 81, 81, 81, 81, 81, 208, 16, 6, + 116, 17, 66, 66, 65, 81, 65, 65, 65, 81, 240, 34, + 66, 224, 26, 7, 147, 49, 49, 17, 82, 34, 18, 17, + 35, 17, 35, 17, 35, 17, 35, 17, 17, 18, 33, 19, + 113, 65, 36, 240, 23, 7, 161, 97, 81, 17, 65, 17, + 65, 17, 49, 49, 33, 49, 33, 49, 37, 17, 82, 82, + 83, 50, 224, 27, 7, 117, 49, 49, 33, 65, 17, 65, + 17, 65, 17, 49, 36, 49, 49, 33, 65, 17, 65, 17, + 65, 17, 49, 21, 240, 16, 22, 7, 147, 17, 17, 50, + 17, 66, 97, 97, 97, 97, 97, 97, 81, 17, 65, 17, + 49, 51, 240, 16, 28, 7, 117, 49, 49, 33, 49, 33, + 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, + 65, 17, 49, 33, 49, 21, 240, 16, 20, 7, 119, 17, + 65, 17, 97, 97, 97, 49, 37, 33, 49, 33, 97, 97, + 65, 17, 72, 224, 21, 7, 119, 17, 65, 17, 65, 17, + 97, 97, 49, 37, 33, 49, 33, 97, 97, 97, 83, 240, + 48, 23, 7, 162, 17, 33, 34, 17, 65, 17, 81, 97, + 97, 97, 52, 82, 81, 17, 65, 18, 34, 50, 17, 224, + 29, 8, 131, 35, 17, 65, 33, 65, 33, 65, 33, 65, + 33, 65, 38, 33, 65, 33, 65, 33, 65, 33, 65, 33, + 65, 19, 35, 240, 16, 16, 3, 51, 17, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 19, 96, 18, 6, 132, + 65, 81, 81, 81, 81, 81, 81, 81, 81, 17, 49, 17, + 49, 35, 224, 28, 7, 115, 34, 17, 49, 33, 33, 49, + 33, 49, 17, 66, 81, 17, 65, 17, 65, 33, 49, 33, + 49, 49, 33, 49, 19, 34, 224, 17, 7, 115, 81, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 65, 17, 72, 224, + 26, 7, 113, 82, 83, 51, 17, 17, 18, 17, 17, 18, + 17, 17, 18, 33, 34, 33, 34, 33, 34, 82, 82, 83, + 50, 224, 23, 7, 113, 67, 83, 67, 66, 17, 50, 17, + 50, 33, 34, 33, 34, 49, 18, 49, 18, 67, 68, 65, + 224, 20, 7, 147, 49, 49, 17, 82, 82, 82, 82, 82, + 82, 82, 82, 81, 17, 49, 51, 240, 16, 23, 7, 117, + 49, 49, 33, 65, 17, 65, 17, 65, 17, 65, 17, 49, + 36, 49, 97, 97, 97, 83, 240, 48, 23, 7, 147, 49, + 49, 33, 49, 17, 82, 82, 82, 82, 82, 19, 17, 17, + 49, 33, 49, 51, 97, 114, 112, 28, 8, 133, 65, 49, + 49, 65, 33, 65, 33, 65, 33, 49, 52, 65, 33, 65, + 33, 65, 49, 49, 49, 49, 65, 19, 50, 240, 16, 21, + 7, 146, 17, 33, 34, 17, 65, 17, 97, 114, 114, 113, + 114, 82, 83, 49, 17, 19, 240, 16, 18, 7, 120, 33, + 34, 33, 33, 49, 97, 97, 97, 97, 97, 97, 97, 97, + 69, 240, 29, 8, 131, 35, 17, 65, 33, 65, 33, 65, + 33, 65, 33, 65, 33, 65, 33, 65, 33, 65, 33, 65, + 33, 65, 33, 65, 52, 240, 48, 24, 7, 114, 51, 82, + 82, 82, 81, 17, 49, 33, 49, 33, 49, 49, 17, 65, + 17, 65, 17, 81, 97, 240, 32, 30, 7, 114, 51, 82, + 82, 33, 34, 33, 34, 33, 34, 33, 34, 17, 17, 18, + 17, 17, 18, 17, 17, 17, 17, 49, 33, 49, 33, 49, + 240, 28, 7, 115, 19, 17, 49, 33, 49, 49, 17, 65, + 17, 65, 17, 81, 81, 17, 65, 17, 65, 17, 49, 49, + 33, 49, 18, 35, 224, 22, 7, 114, 51, 82, 81, 17, + 49, 33, 49, 49, 17, 65, 17, 81, 97, 97, 97, 97, + 83, 240, 16, 17, 7, 120, 65, 17, 65, 81, 97, 81, + 97, 81, 97, 81, 97, 66, 88, 224, 16, 3, 52, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 35, 48, + 17, 7, 113, 97, 113, 97, 113, 97, 113, 97, 113, 97, + 113, 97, 113, 97, 112, 16, 3, 51, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 36, 48, 12, 7, 49, + 81, 17, 49, 49, 17, 81, 0, 10, 64, 5, 7, 0, + 13, 23, 9, 4, 130, 49, 65, 65, 240, 240, 160, 21, + 8, 240, 240, 196, 49, 65, 113, 53, 33, 65, 17, 81, + 17, 81, 17, 66, 36, 18, 240, 16, 25, 7, 114, 97, + 97, 97, 100, 49, 49, 33, 65, 17, 65, 17, 65, 17, + 65, 17, 65, 18, 33, 33, 18, 240, 16, 16, 7, 240, + 240, 115, 17, 17, 51, 82, 97, 97, 97, 113, 65, 36, + 240, 24, 7, 178, 97, 97, 97, 52, 33, 49, 17, 65, + 17, 65, 17, 65, 17, 65, 17, 65, 33, 34, 50, 18, + 224, 15, 7, 240, 240, 115, 49, 49, 17, 82, 89, 97, + 113, 65, 36, 240, 18, 7, 163, 49, 49, 33, 97, 70, + 49, 97, 97, 97, 97, 97, 97, 83, 240, 32, 23, 8, + 240, 240, 195, 18, 17, 49, 49, 49, 49, 49, 67, 65, + 116, 49, 65, 33, 81, 17, 81, 37, 32, 26, 8, 130, + 113, 113, 113, 113, 19, 50, 49, 33, 65, 33, 65, 33, + 65, 33, 65, 33, 65, 33, 65, 19, 35, 240, 16, 14, + 3, 65, 33, 114, 33, 33, 33, 33, 33, 33, 33, 19, + 96, 15, 5, 130, 50, 210, 65, 65, 65, 65, 65, 65, + 66, 50, 49, 19, 25, 8, 130, 113, 113, 113, 113, 35, + 33, 49, 49, 33, 65, 17, 83, 81, 33, 65, 49, 49, + 65, 19, 35, 240, 16, 16, 3, 50, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 19, 96, 25, 7, 240, + 240, 81, 17, 18, 18, 17, 34, 33, 34, 33, 34, 33, + 34, 33, 34, 33, 34, 33, 34, 33, 33, 224, 23, 7, + 240, 240, 82, 18, 50, 33, 33, 49, 33, 49, 33, 49, + 33, 49, 33, 49, 33, 49, 19, 19, 224, 18, 7, 240, + 240, 115, 49, 49, 17, 82, 82, 82, 82, 81, 17, 49, + 51, 240, 16, 22, 7, 240, 240, 85, 49, 49, 33, 65, + 17, 65, 17, 65, 17, 65, 17, 49, 36, 49, 97, 83, + 64, 21, 7, 240, 240, 117, 17, 49, 17, 65, 17, 65, + 17, 65, 17, 65, 33, 49, 52, 97, 97, 83, 16, 6, + 240, 242, 18, 34, 33, 17, 49, 17, 81, 81, 81, 81, + 67, 240, 14, 6, 240, 240, 20, 17, 66, 98, 98, 98, + 66, 65, 20, 208, 17, 7, 240, 129, 97, 70, 49, 97, + 97, 97, 97, 97, 49, 33, 49, 51, 240, 23, 7, 240, + 240, 82, 50, 17, 65, 17, 65, 17, 65, 17, 65, 17, + 65, 17, 65, 17, 50, 35, 17, 224, 20, 7, 240, 240, + 82, 51, 82, 81, 17, 49, 33, 49, 49, 17, 65, 17, + 81, 97, 240, 32, 27, 7, 240, 240, 81, 33, 34, 33, + 34, 33, 34, 17, 17, 18, 17, 17, 18, 17, 17, 17, + 17, 49, 33, 49, 33, 49, 240, 22, 7, 240, 240, 83, + 19, 17, 49, 49, 17, 65, 17, 81, 81, 17, 65, 17, + 49, 49, 19, 19, 224, 23, 7, 240, 240, 83, 34, 17, + 65, 33, 49, 33, 49, 49, 17, 65, 17, 81, 97, 97, + 33, 33, 66, 64, 14, 7, 240, 240, 88, 81, 81, 81, + 81, 81, 81, 81, 88, 224, 17, 3, 81, 17, 33, 33, + 33, 33, 17, 33, 49, 33, 33, 33, 33, 49, 48, 4, + 1, 15, 1, 17, 3, 49, 49, 33, 33, 33, 33, 49, + 33, 17, 33, 33, 33, 33, 17, 80, 12, 7, 240, 240, + 210, 65, 33, 33, 66, 0, 6, 32, + // + // Block 1 Offsets: Codepoints 0x4e00 - 0x4eff + // + 0x00, 0x04, 0x00, 0x00, // Offset 1024 (0x400) + 0x08, 0x04, 0x00, 0x00, // Offset 1032 (0x408) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x1c, 0x04, 0x00, 0x00, // Offset 1052 (0x41c) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x34, 0x04, 0x00, 0x00, // Offset 1076 (0x434) + 0x51, 0x04, 0x00, 0x00, // Offset 1105 (0x451) + 0x6c, 0x04, 0x00, 0x00, // Offset 1132 (0x46c) + 0x7b, 0x04, 0x00, 0x00, // Offset 1147 (0x47b) + 0x8f, 0x04, 0x00, 0x00, // Offset 1167 (0x48f) + 0xa6, 0x04, 0x00, 0x00, // Offset 1190 (0x4a6) + 0xc6, 0x04, 0x00, 0x00, // Offset 1222 (0x4c6) + 0xe2, 0x04, 0x00, 0x00, // Offset 1250 (0x4e2) + 0xfa, 0x04, 0x00, 0x00, // Offset 1274 (0x4fa) + 0x15, 0x05, 0x00, 0x00, // Offset 1301 (0x515) + 0x2e, 0x05, 0x00, 0x00, // Offset 1326 (0x52e) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x4b, 0x05, 0x00, 0x00, // Offset 1355 (0x54b) + 0x62, 0x05, 0x00, 0x00, // Offset 1378 (0x562) + 0x7e, 0x05, 0x00, 0x00, // Offset 1406 (0x57e) + 0x9a, 0x05, 0x00, 0x00, // Offset 1434 (0x59a) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xc2, 0x05, 0x00, 0x00, // Offset 1474 (0x5c2) + 0xdc, 0x05, 0x00, 0x00, // Offset 1500 (0x5dc) + 0x04, 0x06, 0x00, 0x00, // Offset 1540 (0x604) + 0x30, 0x06, 0x00, 0x00, // Offset 1584 (0x630) + 0x54, 0x06, 0x00, 0x00, // Offset 1620 (0x654) + 0x73, 0x06, 0x00, 0x00, // Offset 1651 (0x673) + 0x9b, 0x06, 0x00, 0x00, // Offset 1691 (0x69b) + 0xbd, 0x06, 0x00, 0x00, // Offset 1725 (0x6bd) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xd6, 0x06, 0x00, 0x00, // Offset 1750 (0x6d6) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xef, 0x06, 0x00, 0x00, // Offset 1775 (0x6ef) + 0x20, 0x07, 0x00, 0x00, // Offset 1824 (0x720) + 0x3c, 0x07, 0x00, 0x00, // Offset 1852 (0x73c) + 0x68, 0x07, 0x00, 0x00, // Offset 1896 (0x768) + 0x8b, 0x07, 0x00, 0x00, // Offset 1931 (0x78b) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x9c, 0x07, 0x00, 0x00, // Offset 1948 (0x79c) + 0xb5, 0x07, 0x00, 0x00, // Offset 1973 (0x7b5) + 0xcd, 0x07, 0x00, 0x00, // Offset 1997 (0x7cd) + 0xe5, 0x07, 0x00, 0x00, // Offset 2021 (0x7e5) + 0x00, 0x08, 0x00, 0x00, // Offset 2048 (0x800) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x21, 0x08, 0x00, 0x00, // Offset 2081 (0x821) + 0x37, 0x08, 0x00, 0x00, // Offset 2103 (0x837) + 0x5f, 0x08, 0x00, 0x00, // Offset 2143 (0x85f) + 0x7f, 0x08, 0x00, 0x00, // Offset 2175 (0x87f) + 0xaa, 0x08, 0x00, 0x00, // Offset 2218 (0x8aa) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xde, 0x08, 0x00, 0x00, // Offset 2270 (0x8de) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xe9, 0x08, 0x00, 0x00, // Offset 2281 (0x8e9) + 0x0c, 0x09, 0x00, 0x00, // Offset 2316 (0x90c) + 0x2f, 0x09, 0x00, 0x00, // Offset 2351 (0x92f) + 0x52, 0x09, 0x00, 0x00, // Offset 2386 (0x952) + 0x67, 0x09, 0x00, 0x00, // Offset 2407 (0x967) + 0x8a, 0x09, 0x00, 0x00, // Offset 2442 (0x98a) + 0xb8, 0x09, 0x00, 0x00, // Offset 2488 (0x9b8) + 0xd8, 0x09, 0x00, 0x00, // Offset 2520 (0x9d8) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xea, 0x09, 0x00, 0x00, // Offset 2538 (0x9ea) + 0x08, 0x0a, 0x00, 0x00, // Offset 2568 (0xa08) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x2a, 0x0a, 0x00, 0x00, // Offset 2602 (0xa2a) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x44, 0x0a, 0x00, 0x00, // Offset 2628 (0xa44) + 0x5b, 0x0a, 0x00, 0x00, // Offset 2651 (0xa5b) + 0x77, 0x0a, 0x00, 0x00, // Offset 2679 (0xa77) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x9a, 0x0a, 0x00, 0x00, // Offset 2714 (0xa9a) + 0xaf, 0x0a, 0x00, 0x00, // Offset 2735 (0xaaf) + 0xca, 0x0a, 0x00, 0x00, // Offset 2762 (0xaca) + 0xe3, 0x0a, 0x00, 0x00, // Offset 2787 (0xae3) + 0xfd, 0x0a, 0x00, 0x00, // Offset 2813 (0xafd) + 0x13, 0x0b, 0x00, 0x00, // Offset 2835 (0xb13) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x34, 0x0b, 0x00, 0x00, // Offset 2868 (0xb34) + 0x4d, 0x0b, 0x00, 0x00, // Offset 2893 (0xb4d) + 0x65, 0x0b, 0x00, 0x00, // Offset 2917 (0xb65) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x85, 0x0b, 0x00, 0x00, // Offset 2949 (0xb85) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xa7, 0x0b, 0x00, 0x00, // Offset 2983 (0xba7) + 0xd1, 0x0b, 0x00, 0x00, // Offset 3025 (0xbd1) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xe6, 0x0b, 0x00, 0x00, // Offset 3046 (0xbe6) + 0x04, 0x0c, 0x00, 0x00, // Offset 3076 (0xc04) + 0x24, 0x0c, 0x00, 0x00, // Offset 3108 (0xc24) + 0x3c, 0x0c, 0x00, 0x00, // Offset 3132 (0xc3c) + 0x66, 0x0c, 0x00, 0x00, // Offset 3174 (0xc66) + 0x82, 0x0c, 0x00, 0x00, // Offset 3202 (0xc82) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x9d, 0x0c, 0x00, 0x00, // Offset 3229 (0xc9d) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xbc, 0x0c, 0x00, 0x00, // Offset 3260 (0xcbc) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xe3, 0x0c, 0x00, 0x00, // Offset 3299 (0xce3) + 0xff, 0x0c, 0x00, 0x00, // Offset 3327 (0xcff) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x27, 0x0d, 0x00, 0x00, // Offset 3367 (0xd27) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x52, 0x0d, 0x00, 0x00, // Offset 3410 (0xd52) + 0x7b, 0x0d, 0x00, 0x00, // Offset 3451 (0xd7b) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xab, 0x0d, 0x00, 0x00, // Offset 3499 (0xdab) + 0xe4, 0x0d, 0x00, 0x00, // Offset 3556 (0xde4) + 0x1e, 0x0e, 0x00, 0x00, // Offset 3614 (0xe1e) + 0x43, 0x0e, 0x00, 0x00, // Offset 3651 (0xe43) + 0x53, 0x0e, 0x00, 0x00, // Offset 3667 (0xe53) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x67, 0x0e, 0x00, 0x00, // Offset 3687 (0xe67) + 0x7f, 0x0e, 0x00, 0x00, // Offset 3711 (0xe7f) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x9a, 0x0e, 0x00, 0x00, // Offset 3738 (0xe9a) + 0xb2, 0x0e, 0x00, 0x00, // Offset 3762 (0xeb2) + 0xbe, 0x0e, 0x00, 0x00, // Offset 3774 (0xebe) + 0xd2, 0x0e, 0x00, 0x00, // Offset 3794 (0xed2) + 0xe7, 0x0e, 0x00, 0x00, // Offset 3815 (0xee7) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xfc, 0x0e, 0x00, 0x00, // Offset 3836 (0xefc) + 0x12, 0x0f, 0x00, 0x00, // Offset 3858 (0xf12) + 0x2a, 0x0f, 0x00, 0x00, // Offset 3882 (0xf2a) + 0x46, 0x0f, 0x00, 0x00, // Offset 3910 (0xf46) + 0x5f, 0x0f, 0x00, 0x00, // Offset 3935 (0xf5f) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x7f, 0x0f, 0x00, 0x00, // Offset 3967 (0xf7f) + 0x97, 0x0f, 0x00, 0x00, // Offset 3991 (0xf97) + 0xb6, 0x0f, 0x00, 0x00, // Offset 4022 (0xfb6) + 0xe2, 0x0f, 0x00, 0x00, // Offset 4066 (0xfe2) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x06, 0x10, 0x00, 0x00, // Offset 4102 (0x1006) + 0x27, 0x10, 0x00, 0x00, // Offset 4135 (0x1027) + 0x4c, 0x10, 0x00, 0x00, // Offset 4172 (0x104c) + 0x57, 0x10, 0x00, 0x00, // Offset 4183 (0x1057) + 0x6c, 0x10, 0x00, 0x00, // Offset 4204 (0x106c) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x8a, 0x10, 0x00, 0x00, // Offset 4234 (0x108a) + 0xa9, 0x10, 0x00, 0x00, // Offset 4265 (0x10a9) + 0xc6, 0x10, 0x00, 0x00, // Offset 4294 (0x10c6) + 0xee, 0x10, 0x00, 0x00, // Offset 4334 (0x10ee) + 0x05, 0x11, 0x00, 0x00, // Offset 4357 (0x1105) + 0x1b, 0x11, 0x00, 0x00, // Offset 4379 (0x111b) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x3a, 0x11, 0x00, 0x00, // Offset 4410 (0x113a) + 0x4f, 0x11, 0x00, 0x00, // Offset 4431 (0x114f) + 0x6e, 0x11, 0x00, 0x00, // Offset 4462 (0x116e) + 0x85, 0x11, 0x00, 0x00, // Offset 4485 (0x1185) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xa0, 0x11, 0x00, 0x00, // Offset 4512 (0x11a0) + 0xbd, 0x11, 0x00, 0x00, // Offset 4541 (0x11bd) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xd5, 0x11, 0x00, 0x00, // Offset 4565 (0x11d5) + 0xfe, 0x11, 0x00, 0x00, // Offset 4606 (0x11fe) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x1b, 0x12, 0x00, 0x00, // Offset 4635 (0x121b) + 0x45, 0x12, 0x00, 0x00, // Offset 4677 (0x1245) + 0x5c, 0x12, 0x00, 0x00, // Offset 4700 (0x125c) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x70, 0x12, 0x00, 0x00, // Offset 4720 (0x1270) + 0x96, 0x12, 0x00, 0x00, // Offset 4758 (0x1296) + 0xb9, 0x12, 0x00, 0x00, // Offset 4793 (0x12b9) + 0xd2, 0x12, 0x00, 0x00, // Offset 4818 (0x12d2) + 0x02, 0x13, 0x00, 0x00, // Offset 4866 (0x1302) + 0x26, 0x13, 0x00, 0x00, // Offset 4902 (0x1326) + 0x48, 0x13, 0x00, 0x00, // Offset 4936 (0x1348) + 0x73, 0x13, 0x00, 0x00, // Offset 4979 (0x1373) + 0x9b, 0x13, 0x00, 0x00, // Offset 5019 (0x139b) + 0xcb, 0x13, 0x00, 0x00, // Offset 5067 (0x13cb) + 0xf8, 0x13, 0x00, 0x00, // Offset 5112 (0x13f8) + 0x28, 0x14, 0x00, 0x00, // Offset 5160 (0x1428) + 0x43, 0x14, 0x00, 0x00, // Offset 5187 (0x1443) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x66, 0x14, 0x00, 0x00, // Offset 5222 (0x1466) + 0x95, 0x14, 0x00, 0x00, // Offset 5269 (0x1495) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xbb, 0x14, 0x00, 0x00, // Offset 5307 (0x14bb) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xd9, 0x14, 0x00, 0x00, // Offset 5337 (0x14d9) + 0xfb, 0x14, 0x00, 0x00, // Offset 5371 (0x14fb) + 0x1f, 0x15, 0x00, 0x00, // Offset 5407 (0x151f) + 0x42, 0x15, 0x00, 0x00, // Offset 5442 (0x1542) + 0x76, 0x15, 0x00, 0x00, // Offset 5494 (0x1576) + 0x9f, 0x15, 0x00, 0x00, // Offset 5535 (0x159f) + 0xc8, 0x15, 0x00, 0x00, // Offset 5576 (0x15c8) + 0xfd, 0x15, 0x00, 0x00, // Offset 5629 (0x15fd) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x22, 0x16, 0x00, 0x00, // Offset 5666 (0x1622) + 0x43, 0x16, 0x00, 0x00, // Offset 5699 (0x1643) + 0x5c, 0x16, 0x00, 0x00, // Offset 5724 (0x165c) + 0x8f, 0x16, 0x00, 0x00, // Offset 5775 (0x168f) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xb2, 0x16, 0x00, 0x00, // Offset 5810 (0x16b2) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xda, 0x16, 0x00, 0x00, // Offset 5850 (0x16da) + 0x03, 0x17, 0x00, 0x00, // Offset 5891 (0x1703) + 0x20, 0x17, 0x00, 0x00, // Offset 5920 (0x1720) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x49, 0x17, 0x00, 0x00, // Offset 5961 (0x1749) + 0x64, 0x17, 0x00, 0x00, // Offset 5988 (0x1764) + 0x87, 0x17, 0x00, 0x00, // Offset 6023 (0x1787) + 0xb5, 0x17, 0x00, 0x00, // Offset 6069 (0x17b5) + 0xe0, 0x17, 0x00, 0x00, // Offset 6112 (0x17e0) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x11, 0x18, 0x00, 0x00, // Offset 6161 (0x1811) + 0x47, 0x18, 0x00, 0x00, // Offset 6215 (0x1847) + 0x71, 0x18, 0x00, 0x00, // Offset 6257 (0x1871) + 0x9c, 0x18, 0x00, 0x00, // Offset 6300 (0x189c) + 0xd4, 0x18, 0x00, 0x00, // Offset 6356 (0x18d4) + 0x04, 0x19, 0x00, 0x00, // Offset 6404 (0x1904) + 0x2b, 0x19, 0x00, 0x00, // Offset 6443 (0x192b) + 0x53, 0x19, 0x00, 0x00, // Offset 6483 (0x1953) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x85, 0x19, 0x00, 0x00, // Offset 6533 (0x1985) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xa9, 0x19, 0x00, 0x00, // Offset 6569 (0x19a9) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xdb, 0x19, 0x00, 0x00, // Offset 6619 (0x19db) + + // + // Block 1 Data: Codepoints 0x4e00 - 0x4eff + // + 8, 14, 0, 12, 1, 30, 0, 14, 20, 14, 193, 30, + 113, 209, 209, 209, 209, 209, 209, 209, 209, 209, 161, 33, + 179, 193, 240, 96, 24, 15, 97, 225, 225, 225, 225, 82, + 113, 53, 100, 87, 225, 225, 225, 225, 97, 113, 97, 113, + 98, 119, 240, 16, 29, 14, 193, 30, 81, 209, 209, 209, + 81, 120, 97, 81, 113, 81, 97, 97, 97, 97, 81, 113, + 65, 65, 49, 49, 99, 49, 129, 240, 48, 27, 14, 129, + 209, 209, 209, 49, 30, 129, 129, 65, 129, 65, 145, 49, + 145, 33, 177, 17, 193, 193, 18, 130, 66, 51, 131, 224, + 15, 14, 240, 161, 60, 0, 6, 81, 90, 0, 8, 97, + 30, 240, 208, 20, 14, 97, 209, 209, 209, 209, 209, 65, + 135, 113, 209, 209, 209, 209, 209, 209, 81, 30, 224, 23, + 14, 193, 30, 97, 209, 209, 210, 193, 17, 177, 34, 145, + 50, 129, 65, 129, 209, 209, 209, 209, 240, 96, 32, 14, + 193, 30, 65, 65, 129, 65, 129, 65, 129, 65, 129, 65, + 129, 65, 129, 65, 129, 65, 129, 65, 113, 81, 113, 81, + 97, 97, 66, 113, 240, 48, 28, 14, 193, 30, 113, 209, + 193, 194, 177, 17, 33, 113, 33, 49, 81, 49, 66, 33, + 65, 83, 81, 97, 97, 209, 209, 209, 240, 96, 24, 13, + 50, 177, 193, 113, 74, 33, 193, 129, 44, 177, 193, 129, + 49, 25, 33, 193, 129, 33, 163, 177, 240, 16, 27, 14, + 193, 30, 97, 209, 161, 33, 65, 81, 39, 49, 49, 65, + 65, 49, 65, 59, 209, 209, 209, 145, 49, 163, 193, 240, + 48, 25, 14, 193, 30, 97, 209, 146, 33, 145, 54, 49, + 65, 129, 65, 65, 45, 193, 209, 209, 145, 49, 163, 193, + 240, 48, 29, 14, 161, 75, 113, 65, 129, 65, 129, 65, + 129, 65, 129, 65, 74, 129, 65, 129, 65, 129, 65, 129, + 65, 129, 65, 129, 65, 62, 224, 23, 14, 82, 193, 209, + 81, 60, 81, 209, 113, 30, 49, 209, 81, 105, 193, 131, + 17, 193, 226, 209, 240, 48, 28, 14, 161, 105, 81, 97, + 97, 97, 97, 97, 104, 97, 97, 97, 97, 97, 97, 97, + 97, 104, 97, 97, 97, 97, 97, 97, 62, 224, 28, 14, + 177, 60, 129, 209, 193, 209, 194, 33, 129, 17, 49, 97, + 33, 65, 65, 49, 66, 33, 65, 81, 113, 209, 240, 65, + 30, 224, 40, 14, 97, 49, 81, 49, 49, 81, 49, 49, + 81, 49, 49, 81, 49, 49, 62, 33, 49, 49, 81, 49, + 49, 81, 49, 49, 81, 49, 49, 81, 53, 81, 49, 49, + 81, 145, 60, 33, 240, 160, 26, 14, 161, 97, 83, 86, + 129, 209, 209, 209, 113, 90, 65, 81, 113, 81, 113, 81, + 113, 81, 113, 81, 113, 81, 78, 224, 40, 14, 193, 30, + 97, 209, 209, 81, 45, 17, 65, 81, 33, 66, 65, 33, + 65, 17, 49, 33, 49, 50, 17, 33, 49, 65, 17, 33, + 33, 113, 33, 17, 81, 33, 33, 131, 33, 145, 240, 16, + 44, 14, 81, 33, 161, 33, 161, 33, 161, 33, 161, 33, + 97, 49, 33, 50, 17, 49, 33, 49, 49, 33, 33, 33, + 65, 33, 33, 33, 81, 17, 33, 17, 97, 17, 33, 17, + 129, 34, 145, 33, 161, 33, 94, 224, 36, 14, 49, 81, + 113, 81, 113, 81, 113, 81, 113, 81, 114, 65, 113, 17, + 49, 113, 33, 33, 113, 33, 34, 81, 81, 34, 33, 81, + 67, 81, 97, 81, 240, 81, 30, 224, 31, 14, 82, 193, + 209, 97, 30, 65, 209, 33, 145, 49, 138, 145, 161, 33, + 161, 33, 33, 97, 49, 49, 65, 17, 33, 68, 51, 81, + 97, 240, 96, 40, 14, 161, 97, 97, 97, 81, 97, 97, + 97, 34, 17, 34, 33, 49, 33, 33, 49, 18, 33, 33, + 51, 17, 21, 97, 81, 97, 97, 97, 18, 33, 19, 20, + 36, 81, 81, 240, 49, 30, 224, 34, 14, 161, 90, 193, + 178, 177, 66, 21, 17, 65, 81, 33, 49, 97, 34, 17, + 97, 49, 17, 113, 49, 33, 81, 17, 33, 49, 49, 51, + 67, 81, 97, 238, 224, 25, 15, 193, 61, 129, 225, 225, + 49, 91, 145, 225, 81, 31, 113, 209, 209, 65, 129, 37, + 55, 82, 34, 161, 240, 16, 25, 14, 161, 195, 56, 177, + 209, 49, 90, 129, 209, 81, 30, 97, 193, 33, 145, 65, + 113, 52, 70, 66, 49, 145, 240, 49, 14, 193, 30, 65, + 49, 145, 49, 145, 49, 49, 45, 17, 33, 49, 49, 33, + 33, 49, 49, 33, 34, 34, 33, 33, 17, 33, 17, 17, + 17, 33, 17, 49, 33, 17, 34, 65, 65, 33, 65, 33, + 33, 33, 49, 67, 33, 145, 240, 16, 28, 15, 193, 76, + 113, 33, 129, 33, 33, 33, 97, 17, 33, 17, 81, 49, + 33, 125, 33, 225, 225, 225, 225, 225, 209, 209, 240, 224, + 44, 14, 50, 66, 113, 65, 145, 33, 161, 33, 108, 97, + 33, 97, 49, 33, 49, 33, 49, 33, 49, 49, 33, 33, + 33, 65, 33, 33, 33, 81, 17, 33, 17, 97, 17, 33, + 17, 129, 33, 161, 33, 49, 30, 224, 35, 14, 113, 209, + 49, 60, 129, 145, 49, 49, 97, 33, 33, 113, 33, 33, + 62, 49, 33, 161, 49, 50, 65, 49, 33, 97, 66, 113, + 17, 49, 114, 82, 66, 130, 224, 17, 2, 1, 19, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 48, + 25, 12, 240, 33, 178, 145, 33, 113, 65, 81, 98, 33, + 49, 67, 65, 81, 81, 177, 177, 177, 177, 177, 177, 240, + 48, 24, 12, 1, 146, 17, 129, 50, 81, 82, 49, 113, + 33, 161, 161, 177, 177, 177, 177, 177, 177, 177, 177, 240, + 48, 24, 6, 65, 83, 49, 33, 33, 49, 17, 49, 17, + 81, 66, 49, 17, 18, 33, 17, 49, 81, 81, 81, 81, + 112, 27, 14, 98, 193, 209, 209, 81, 31, 81, 81, 17, + 81, 81, 17, 81, 81, 29, 17, 81, 81, 113, 209, 209, + 209, 209, 240, 96, 33, 14, 161, 60, 97, 81, 113, 81, + 113, 81, 71, 33, 113, 81, 113, 81, 113, 81, 57, 17, + 113, 81, 97, 97, 33, 33, 113, 33, 17, 145, 18, 178, + 224, 22, 14, 97, 209, 65, 60, 113, 209, 209, 49, 90, + 129, 209, 209, 81, 30, 97, 209, 209, 209, 240, 96, 40, + 12, 65, 33, 129, 33, 129, 33, 65, 49, 33, 50, 49, + 33, 50, 49, 33, 50, 49, 33, 50, 49, 33, 54, 38, + 49, 33, 49, 65, 33, 113, 49, 97, 65, 81, 81, 65, + 97, 240, 16, 32, 14, 97, 209, 65, 60, 33, 65, 65, + 49, 65, 65, 59, 49, 65, 65, 129, 81, 31, 81, 81, + 17, 81, 81, 29, 17, 81, 81, 113, 209, 240, 96, 43, + 14, 81, 33, 161, 33, 33, 60, 33, 49, 33, 33, 49, + 49, 33, 33, 59, 49, 49, 33, 33, 113, 33, 49, 31, + 65, 33, 49, 17, 65, 33, 49, 29, 17, 49, 49, 49, + 50, 65, 82, 97, 240, 64, 52, 14, 49, 49, 145, 49, + 145, 49, 65, 17, 33, 41, 33, 33, 17, 81, 33, 17, + 50, 49, 34, 81, 49, 33, 129, 17, 33, 41, 33, 33, + 33, 33, 17, 33, 33, 33, 33, 17, 33, 33, 33, 33, + 65, 33, 33, 33, 65, 39, 65, 33, 81, 240, 11, 5, + 240, 81, 81, 81, 81, 81, 65, 240, 240, 35, 14, 81, + 209, 209, 209, 49, 90, 129, 49, 145, 49, 113, 17, 49, + 130, 49, 145, 49, 129, 17, 33, 129, 33, 17, 49, 49, + 49, 17, 49, 33, 97, 51, 132, 224, 35, 14, 161, 105, + 81, 97, 97, 97, 97, 33, 49, 97, 49, 33, 97, 49, + 33, 97, 97, 62, 49, 97, 97, 97, 81, 113, 81, 65, + 33, 65, 99, 49, 129, 240, 48, 35, 14, 97, 145, 49, + 162, 17, 177, 17, 209, 81, 30, 97, 81, 113, 81, 113, + 17, 49, 97, 49, 33, 97, 49, 33, 81, 113, 65, 129, + 49, 84, 49, 129, 240, 32, 21, 14, 65, 225, 225, 209, + 65, 60, 113, 209, 209, 209, 49, 90, 129, 209, 209, 209, + 81, 30, 224, 35, 14, 65, 65, 129, 65, 129, 65, 92, + 81, 65, 129, 17, 33, 129, 33, 17, 129, 33, 17, 129, + 65, 78, 65, 65, 129, 65, 113, 81, 97, 97, 81, 113, + 240, 48, 46, 14, 193, 30, 240, 214, 39, 65, 33, 66, + 65, 33, 66, 17, 33, 33, 17, 34, 33, 17, 33, 33, + 18, 33, 17, 33, 33, 18, 65, 33, 66, 65, 33, 66, + 17, 33, 33, 17, 34, 35, 33, 36, 49, 49, 49, 240, + 32, 14, 81, 65, 65, 66, 33, 82, 49, 33, 97, 81, + 193, 94, 49, 97, 81, 49, 65, 49, 65, 83, 39, 49, + 97, 209, 49, 75, 129, 209, 240, 96, 18, 5, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 49, 65, 49, 49, + 49, 144, 30, 14, 162, 65, 113, 81, 113, 97, 97, 97, + 81, 113, 81, 129, 49, 145, 49, 161, 17, 177, 17, 193, + 210, 162, 34, 98, 98, 34, 162, 224, 34, 14, 161, 75, + 113, 65, 129, 65, 129, 49, 145, 49, 33, 97, 38, 81, + 97, 81, 113, 81, 113, 65, 129, 65, 129, 49, 81, 49, + 33, 115, 33, 145, 240, 32, 26, 14, 65, 209, 209, 209, + 65, 135, 97, 81, 97, 97, 81, 97, 209, 193, 193, 17, + 161, 49, 129, 81, 82, 117, 161, 240, 23, 14, 161, 195, + 131, 101, 209, 209, 209, 82, 97, 68, 85, 70, 209, 209, + 97, 97, 97, 97, 98, 103, 240, 28, 13, 81, 194, 177, + 177, 193, 177, 50, 113, 49, 113, 65, 97, 65, 97, 81, + 177, 65, 97, 97, 65, 39, 21, 97, 33, 145, 208, 35, + 14, 65, 82, 65, 33, 65, 81, 49, 49, 97, 34, 33, + 97, 49, 17, 113, 81, 129, 49, 145, 49, 161, 17, 177, + 17, 193, 210, 162, 34, 98, 98, 34, 162, 224, 21, 14, + 65, 225, 210, 209, 49, 75, 177, 193, 193, 193, 193, 193, + 193, 194, 162, 34, 129, 88, 224, 27, 14, 98, 193, 193, + 65, 105, 81, 97, 97, 97, 97, 51, 113, 129, 75, 49, + 129, 209, 26, 33, 145, 49, 163, 193, 240, 32, 25, 14, + 65, 209, 209, 113, 75, 33, 49, 129, 65, 113, 81, 65, + 135, 113, 209, 209, 81, 120, 97, 209, 209, 240, 96, 26, + 14, 161, 180, 55, 209, 49, 81, 49, 49, 97, 33, 33, + 113, 33, 17, 177, 110, 113, 209, 209, 209, 164, 193, 240, + 96, 22, 14, 161, 180, 55, 193, 225, 209, 33, 75, 177, + 193, 193, 178, 162, 177, 17, 146, 50, 113, 103, 224, 33, + 14, 161, 81, 84, 70, 129, 209, 65, 113, 81, 113, 81, + 65, 30, 113, 209, 146, 33, 33, 97, 49, 49, 65, 17, + 33, 65, 33, 51, 67, 81, 97, 224, 25, 14, 161, 97, + 83, 86, 129, 209, 113, 90, 65, 65, 129, 65, 129, 65, + 129, 65, 94, 240, 50, 162, 162, 240, 176, 24, 14, 161, + 97, 83, 86, 129, 209, 113, 90, 65, 65, 129, 65, 129, + 65, 129, 65, 94, 240, 114, 226, 226, 224, 32, 14, 146, + 165, 54, 209, 81, 30, 81, 33, 145, 65, 98, 98, 34, + 33, 65, 34, 65, 65, 129, 65, 129, 65, 129, 65, 113, + 81, 97, 97, 240, 48, 34, 14, 161, 180, 70, 193, 126, + 97, 177, 17, 33, 69, 17, 33, 33, 81, 17, 35, 97, + 17, 33, 49, 35, 17, 33, 51, 33, 17, 52, 97, 209, + 209, 240, 96, 42, 14, 148, 40, 193, 209, 110, 65, 33, + 17, 33, 21, 33, 17, 17, 97, 33, 18, 33, 35, 33, + 17, 51, 33, 19, 20, 81, 17, 17, 129, 33, 33, 97, + 49, 50, 49, 65, 66, 17, 81, 81, 224, 21, 13, 240, + 81, 89, 177, 177, 177, 177, 177, 177, 177, 177, 161, 17, + 161, 17, 162, 27, 240, 192, 30, 14, 240, 34, 193, 209, + 113, 81, 84, 65, 35, 33, 83, 81, 36, 113, 81, 113, + 81, 68, 81, 97, 97, 129, 65, 129, 65, 130, 73, 240, + 32, 15, 81, 225, 225, 225, 49, 91, 145, 49, 161, 49, + 161, 49, 161, 49, 145, 65, 145, 65, 129, 81, 49, 65, + 81, 49, 49, 97, 52, 132, 240, 16, 24, 14, 65, 209, + 209, 113, 75, 33, 193, 97, 81, 39, 193, 193, 193, 193, + 193, 113, 65, 129, 65, 130, 73, 240, 42, 14, 113, 145, + 49, 145, 49, 49, 81, 49, 35, 65, 49, 17, 17, 81, + 35, 33, 83, 17, 49, 36, 49, 49, 81, 49, 49, 81, + 49, 19, 81, 49, 33, 97, 49, 65, 65, 129, 65, 130, + 73, 240, 28, 13, 177, 29, 177, 193, 65, 113, 81, 97, + 97, 81, 97, 81, 146, 17, 99, 49, 36, 97, 49, 129, + 129, 49, 147, 177, 240, 16, 27, 12, 66, 161, 161, 161, + 66, 65, 35, 84, 17, 161, 82, 49, 97, 49, 37, 37, + 49, 65, 81, 161, 161, 146, 115, 240, 96, 31, 14, 97, + 49, 145, 66, 113, 81, 113, 49, 75, 129, 49, 145, 49, + 145, 49, 17, 30, 97, 81, 113, 81, 113, 36, 113, 65, + 129, 209, 240, 96, 39, 14, 49, 81, 113, 81, 113, 81, + 113, 81, 117, 17, 113, 81, 113, 81, 113, 33, 33, 72, + 17, 65, 81, 33, 65, 81, 33, 65, 81, 33, 50, 81, + 33, 56, 33, 50, 81, 52, 224, 28, 14, 193, 30, 193, + 65, 49, 49, 98, 17, 113, 49, 17, 130, 49, 145, 49, + 209, 110, 113, 194, 162, 34, 98, 98, 34, 162, 224, 40, + 14, 81, 49, 131, 33, 68, 81, 113, 81, 113, 81, 72, + 17, 113, 81, 113, 81, 71, 33, 65, 81, 33, 65, 81, + 33, 65, 81, 33, 33, 17, 81, 33, 33, 23, 33, 35, + 81, 51, 240, 43, 14, 81, 49, 131, 34, 52, 49, 17, + 65, 33, 49, 17, 81, 33, 17, 33, 81, 33, 65, 72, + 17, 145, 49, 129, 65, 132, 17, 69, 65, 81, 33, 65, + 33, 81, 65, 33, 36, 65, 34, 49, 99, 240, 41, 15, + 65, 81, 129, 81, 72, 33, 129, 70, 22, 17, 113, 65, + 81, 54, 37, 33, 65, 81, 54, 65, 65, 33, 17, 65, + 113, 81, 72, 33, 33, 81, 65, 49, 81, 65, 50, 65, + 84, 240, 16, 48, 15, 97, 49, 147, 33, 84, 49, 17, + 81, 33, 49, 17, 97, 33, 17, 33, 97, 17, 81, 113, + 33, 49, 85, 65, 129, 81, 113, 49, 33, 87, 33, 145, + 65, 49, 33, 33, 17, 33, 49, 17, 19, 35, 50, 49, + 65, 20, 240, 57, 15, 83, 33, 69, 33, 33, 65, 33, + 49, 33, 81, 33, 17, 49, 72, 33, 113, 17, 65, 73, + 17, 65, 33, 33, 17, 17, 65, 20, 18, 17, 65, 113, + 17, 65, 21, 17, 17, 65, 33, 17, 33, 17, 50, 50, + 33, 17, 50, 33, 33, 17, 17, 50, 17, 51, 36, 240, + 58, 15, 17, 49, 33, 33, 81, 33, 33, 33, 97, 17, + 17, 49, 58, 17, 97, 17, 17, 49, 81, 33, 33, 33, + 50, 49, 49, 17, 81, 65, 49, 88, 17, 65, 33, 33, + 49, 50, 34, 17, 49, 82, 17, 17, 49, 33, 49, 21, + 17, 33, 33, 65, 49, 33, 17, 81, 67, 240, 37, 15, + 65, 65, 90, 145, 65, 103, 17, 225, 88, 17, 81, 97, + 17, 102, 33, 225, 102, 33, 97, 65, 33, 102, 33, 49, + 33, 65, 33, 49, 49, 33, 49, 58, 36, 240, 16, 16, + 4, 113, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 53, 49, 64, 20, 12, 161, 28, 161, 161, 161, 146, 161, + 177, 177, 177, 177, 177, 113, 49, 132, 161, 240, 48, 24, + 14, 161, 90, 177, 145, 33, 178, 209, 65, 30, 113, 49, + 145, 33, 161, 209, 209, 161, 33, 179, 193, 240, 96, 27, + 14, 49, 209, 65, 135, 97, 65, 113, 65, 65, 33, 26, + 129, 65, 46, 97, 65, 129, 65, 59, 129, 209, 164, 193, + 240, 112, 24, 14, 97, 126, 97, 153, 81, 49, 49, 89, + 145, 139, 129, 65, 46, 97, 65, 59, 129, 65, 84, 193, + 240, 112, 12, 14, 240, 240, 129, 90, 0, 15, 97, 30, + 240, 208, 20, 14, 161, 90, 240, 240, 193, 30, 113, 209, + 209, 209, 209, 209, 161, 33, 179, 193, 240, 96, 21, 14, + 177, 60, 113, 209, 209, 209, 81, 30, 97, 209, 209, 209, + 209, 161, 33, 179, 193, 240, 112, 21, 14, 161, 90, 240, + 240, 193, 30, 65, 193, 97, 90, 193, 209, 209, 145, 49, + 163, 193, 240, 64, 22, 14, 161, 90, 0, 7, 1, 30, + 97, 209, 193, 193, 65, 113, 97, 81, 54, 38, 97, 33, + 161, 240, 24, 14, 193, 30, 65, 209, 209, 65, 135, 113, + 65, 129, 65, 129, 65, 129, 65, 119, 209, 209, 209, 33, + 30, 224, 28, 14, 161, 90, 240, 240, 193, 30, 65, 65, + 129, 65, 129, 65, 129, 65, 129, 65, 113, 81, 113, 81, + 97, 97, 66, 113, 240, 48, 25, 14, 177, 60, 113, 209, + 209, 209, 209, 49, 90, 113, 65, 129, 65, 129, 65, 113, + 81, 113, 81, 113, 81, 62, 224, 32, 14, 65, 65, 129, + 65, 129, 65, 129, 65, 92, 81, 65, 129, 65, 129, 65, + 129, 65, 78, 65, 65, 129, 65, 113, 81, 97, 97, 81, + 113, 240, 48, 24, 14, 177, 60, 240, 161, 105, 81, 97, + 97, 97, 97, 97, 104, 97, 97, 97, 97, 104, 97, 97, + 241, 30, 224, 31, 14, 177, 45, 81, 209, 81, 120, 81, + 97, 97, 33, 49, 97, 49, 33, 81, 65, 17, 97, 33, + 49, 97, 49, 33, 161, 17, 209, 209, 94, 224, 44, 14, + 177, 45, 81, 49, 145, 49, 81, 49, 49, 49, 17, 49, + 49, 49, 33, 33, 49, 33, 49, 33, 49, 33, 65, 17, + 49, 17, 81, 17, 49, 17, 81, 17, 49, 17, 113, 49, + 145, 49, 145, 49, 94, 224, 36, 14, 65, 49, 145, 49, + 145, 49, 34, 33, 33, 49, 18, 49, 35, 18, 81, 33, + 49, 97, 33, 49, 65, 17, 35, 17, 65, 20, 71, 240, + 113, 105, 240, 209, 30, 224, 33, 14, 193, 30, 81, 33, + 161, 33, 161, 33, 101, 37, 33, 161, 33, 161, 33, 161, + 37, 37, 33, 49, 33, 49, 97, 33, 161, 33, 161, 33, + 49, 30, 224, 37, 14, 177, 60, 97, 193, 197, 214, 36, + 33, 49, 49, 33, 33, 49, 49, 33, 33, 18, 65, 33, + 33, 34, 52, 33, 17, 33, 33, 51, 17, 33, 113, 17, + 240, 33, 30, 224, 11, 14, 0, 7, 97, 225, 209, 65, + 30, 0, 14, 21, 14, 97, 225, 209, 65, 30, 49, 209, + 209, 209, 209, 209, 209, 209, 209, 113, 90, 65, 240, 144, + 30, 14, 97, 225, 209, 65, 30, 240, 129, 135, 113, 65, + 129, 65, 129, 65, 129, 65, 113, 81, 33, 65, 81, 33, + 49, 97, 34, 17, 131, 240, 31, 14, 81, 225, 209, 81, + 30, 65, 65, 113, 97, 81, 130, 33, 33, 50, 33, 81, + 49, 145, 49, 161, 17, 193, 178, 18, 114, 82, 50, 147, + 224, 29, 14, 97, 225, 209, 65, 30, 81, 193, 50, 113, + 65, 118, 34, 129, 49, 129, 49, 129, 49, 114, 49, 193, + 49, 114, 82, 35, 129, 240, 40, 14, 97, 225, 209, 65, + 30, 81, 49, 145, 49, 97, 33, 49, 97, 33, 49, 17, + 49, 49, 49, 33, 33, 49, 49, 50, 49, 65, 49, 65, + 65, 113, 33, 33, 97, 67, 66, 97, 240, 64, 23, 14, + 97, 225, 49, 60, 81, 65, 145, 49, 145, 33, 124, 33, + 209, 209, 209, 209, 209, 193, 193, 240, 192, 22, 14, 97, + 225, 65, 30, 240, 40, 97, 97, 104, 240, 59, 177, 178, + 193, 161, 33, 179, 193, 240, 96, 31, 14, 81, 225, 209, + 81, 30, 240, 161, 60, 33, 65, 65, 49, 65, 65, 59, + 49, 65, 65, 49, 65, 65, 49, 65, 65, 59, 49, 145, + 240, 16, 21, 14, 97, 225, 65, 30, 240, 40, 97, 97, + 104, 240, 74, 161, 193, 110, 113, 164, 193, 240, 96, 31, + 15, 113, 241, 65, 46, 240, 177, 121, 97, 97, 113, 97, + 120, 113, 49, 33, 177, 177, 33, 17, 129, 49, 33, 82, + 35, 53, 81, 81, 240, 16, 23, 14, 81, 225, 81, 30, + 240, 40, 97, 97, 104, 240, 61, 17, 178, 25, 17, 129, + 209, 164, 193, 240, 96, 27, 14, 81, 225, 81, 30, 240, + 40, 97, 97, 104, 240, 61, 17, 178, 53, 49, 81, 49, + 145, 49, 65, 34, 65, 67, 117, 224, 29, 15, 97, 241, + 65, 76, 240, 97, 65, 161, 33, 110, 113, 225, 170, 145, + 193, 17, 17, 145, 33, 33, 98, 19, 50, 34, 65, 98, + 240, 24, 15, 113, 241, 126, 240, 72, 113, 97, 120, 240, + 78, 17, 129, 50, 39, 49, 129, 139, 33, 113, 97, 135, + 240, 41, 14, 97, 225, 110, 33, 81, 85, 22, 65, 81, + 33, 67, 34, 33, 35, 65, 17, 17, 17, 33, 49, 82, + 18, 49, 97, 66, 17, 49, 66, 65, 17, 50, 17, 81, + 113, 18, 50, 67, 114, 224, 29, 14, 97, 225, 110, 33, + 129, 65, 36, 33, 65, 33, 33, 33, 65, 36, 33, 65, + 129, 74, 81, 97, 104, 97, 97, 104, 240, 46, 224, 42, + 15, 113, 127, 33, 33, 49, 49, 33, 53, 49, 35, 17, + 49, 19, 33, 53, 49, 35, 17, 17, 17, 19, 33, 49, + 17, 17, 49, 31, 1, 33, 113, 34, 41, 33, 49, 113, + 105, 97, 113, 63, 240, 23, 14, 97, 209, 209, 209, 209, + 209, 209, 209, 209, 193, 17, 161, 49, 129, 81, 97, 113, + 65, 148, 177, 240, 20, 5, 65, 65, 65, 49, 65, 50, + 33, 17, 17, 33, 65, 65, 65, 65, 65, 65, 65, 96, + 38, 15, 65, 225, 113, 97, 24, 65, 129, 81, 113, 82, + 97, 81, 17, 81, 81, 33, 81, 129, 65, 145, 49, 161, + 49, 161, 33, 97, 65, 33, 97, 65, 33, 98, 49, 55, + 240, 16, 35, 15, 65, 65, 145, 65, 145, 65, 129, 81, + 129, 81, 114, 81, 97, 17, 27, 33, 81, 129, 81, 129, + 81, 129, 81, 129, 81, 129, 81, 129, 81, 129, 81, 240, + 80, 25, 15, 65, 225, 225, 113, 81, 40, 65, 210, 193, + 17, 177, 33, 225, 225, 225, 225, 225, 145, 65, 26, 49, + 240, 176, 48, 15, 65, 65, 145, 65, 145, 65, 129, 81, + 49, 65, 41, 49, 81, 49, 50, 81, 49, 33, 17, 81, + 49, 17, 33, 81, 49, 65, 81, 49, 65, 65, 65, 65, + 65, 65, 65, 49, 33, 33, 65, 33, 67, 65, 17, 97, + 240, 32, 36, 15, 65, 225, 129, 81, 25, 49, 97, 113, + 97, 113, 97, 98, 97, 81, 17, 97, 65, 33, 97, 113, + 97, 113, 97, 113, 97, 113, 49, 33, 113, 67, 113, 81, + 240, 80, 34, 15, 240, 209, 76, 49, 65, 145, 65, 145, + 65, 145, 65, 145, 65, 145, 65, 145, 66, 129, 49, 33, + 97, 49, 65, 81, 33, 98, 33, 33, 131, 33, 161, 240, + 43, 15, 65, 225, 113, 97, 24, 65, 49, 65, 81, 49, + 65, 81, 49, 65, 66, 65, 49, 49, 17, 65, 33, 49, + 33, 65, 33, 97, 82, 113, 97, 113, 82, 113, 65, 33, + 97, 49, 66, 65, 18, 98, 240, 40, 14, 65, 49, 145, + 49, 145, 49, 129, 65, 129, 65, 129, 66, 98, 65, 17, + 65, 17, 65, 34, 17, 33, 65, 50, 49, 65, 65, 49, + 65, 129, 65, 129, 65, 129, 65, 129, 65, 240, 64, 48, + 15, 65, 49, 161, 49, 161, 49, 145, 65, 33, 97, 24, + 81, 65, 33, 82, 65, 33, 65, 17, 65, 33, 49, 33, + 65, 33, 97, 65, 33, 97, 49, 49, 97, 49, 49, 33, + 49, 33, 65, 33, 49, 17, 81, 33, 50, 115, 240, 45, + 15, 65, 66, 129, 81, 129, 81, 113, 50, 17, 113, 49, + 33, 113, 49, 33, 98, 49, 33, 81, 17, 49, 49, 49, + 33, 49, 49, 97, 33, 81, 81, 33, 81, 81, 17, 113, + 65, 17, 113, 66, 145, 49, 161, 240, 48, 15, 65, 225, + 97, 113, 38, 81, 49, 49, 97, 49, 49, 97, 49, 49, + 82, 49, 49, 65, 17, 49, 49, 49, 33, 49, 49, 97, + 49, 49, 97, 49, 49, 97, 33, 65, 33, 49, 33, 65, + 33, 49, 17, 81, 33, 50, 115, 240, 27, 14, 113, 194, + 177, 33, 145, 65, 113, 97, 81, 49, 65, 34, 81, 66, + 113, 240, 17, 90, 193, 193, 193, 193, 193, 240, 96, 35, + 14, 97, 210, 177, 33, 145, 65, 113, 97, 81, 129, 49, + 33, 65, 35, 49, 65, 49, 65, 65, 129, 65, 129, 65, + 113, 81, 113, 81, 97, 97, 66, 113, 240, 48, 47, 15, + 65, 225, 113, 97, 24, 65, 65, 49, 81, 65, 49, 81, + 65, 33, 82, 65, 21, 17, 17, 65, 82, 33, 65, 81, + 49, 65, 81, 49, 49, 97, 49, 49, 97, 49, 33, 49, + 49, 49, 33, 67, 65, 17, 97, 240, 32, 38, 14, 146, + 98, 65, 113, 81, 113, 81, 113, 81, 113, 81, 114, 65, + 113, 17, 49, 113, 18, 33, 113, 33, 33, 97, 82, 97, + 65, 33, 65, 65, 66, 33, 49, 99, 49, 129, 224, 30, + 14, 113, 193, 17, 161, 49, 129, 81, 97, 113, 65, 148, + 177, 65, 66, 113, 65, 129, 34, 147, 177, 97, 97, 97, + 97, 98, 103, 240, 16, 34, 14, 113, 193, 17, 161, 49, + 129, 81, 97, 113, 65, 97, 34, 17, 24, 34, 33, 81, + 113, 81, 113, 81, 113, 81, 113, 50, 49, 65, 129, 65, + 130, 73, 240, 36, 15, 65, 113, 97, 24, 81, 113, 81, + 113, 97, 97, 113, 97, 98, 97, 81, 17, 27, 33, 97, + 113, 97, 113, 97, 113, 97, 113, 49, 33, 113, 67, 113, + 81, 240, 80, 35, 15, 65, 65, 145, 65, 145, 65, 129, + 81, 129, 81, 114, 81, 49, 33, 17, 27, 33, 81, 129, + 81, 129, 81, 129, 81, 129, 81, 129, 81, 129, 40, 65, + 240, 176, 52, 15, 49, 225, 65, 145, 65, 129, 33, 33, + 49, 65, 33, 33, 20, 49, 37, 33, 53, 33, 49, 33, + 17, 33, 33, 49, 65, 33, 33, 49, 65, 33, 33, 19, + 65, 33, 33, 33, 81, 33, 33, 65, 49, 33, 113, 49, + 33, 114, 33, 56, 240, 16, 41, 15, 65, 81, 129, 81, + 129, 81, 113, 97, 113, 26, 49, 97, 98, 49, 33, 81, + 17, 49, 33, 65, 33, 65, 17, 113, 65, 17, 113, 81, + 129, 81, 129, 65, 17, 113, 34, 50, 83, 114, 240, 41, + 15, 65, 97, 113, 97, 113, 97, 97, 113, 97, 26, 49, + 113, 82, 113, 65, 17, 49, 49, 49, 33, 65, 33, 97, + 65, 33, 97, 65, 33, 97, 113, 97, 65, 33, 97, 83, + 97, 97, 240, 64, 53, 15, 65, 81, 129, 81, 129, 81, + 113, 97, 113, 33, 49, 49, 49, 33, 49, 49, 34, 33, + 49, 49, 17, 17, 33, 49, 50, 33, 33, 49, 49, 49, + 33, 49, 49, 49, 33, 49, 49, 49, 33, 49, 49, 49, + 33, 49, 49, 49, 41, 49, 33, 113, 240, 37, 14, 97, + 210, 177, 33, 145, 65, 113, 97, 81, 129, 49, 65, 83, + 81, 97, 17, 65, 65, 49, 65, 65, 49, 65, 65, 49, + 65, 65, 49, 65, 65, 59, 49, 145, 240, 16, 33, 15, + 65, 225, 225, 113, 81, 40, 65, 97, 98, 97, 81, 17, + 97, 65, 33, 97, 113, 97, 113, 97, 113, 97, 113, 97, + 113, 97, 113, 26, 49, 240, 176, 25, 14, 97, 210, 177, + 33, 145, 65, 113, 97, 81, 129, 49, 163, 145, 33, 42, + 129, 209, 209, 209, 209, 81, 30, 224, 51, 15, 65, 225, + 145, 65, 25, 49, 97, 49, 49, 97, 49, 49, 49, 33, + 49, 34, 49, 33, 49, 17, 17, 49, 33, 50, 33, 33, + 49, 49, 49, 81, 65, 49, 81, 65, 49, 65, 81, 49, + 65, 17, 49, 49, 49, 51, 65, 33, 81, 240, 32, 35, + 15, 65, 113, 97, 99, 81, 21, 113, 97, 113, 97, 113, + 97, 98, 97, 81, 17, 27, 33, 97, 113, 97, 113, 97, + 113, 97, 113, 97, 113, 97, 113, 97, 240, 64, 40, 15, + 65, 33, 177, 33, 177, 33, 65, 81, 55, 65, 33, 177, + 17, 178, 38, 65, 17, 97, 65, 33, 81, 129, 65, 145, + 65, 145, 49, 81, 65, 33, 97, 65, 33, 98, 49, 55, + 240, 16, 41, 15, 65, 65, 145, 65, 17, 113, 65, 34, + 65, 81, 49, 65, 81, 129, 86, 34, 21, 97, 17, 81, + 81, 33, 81, 129, 81, 129, 97, 113, 97, 49, 49, 113, + 33, 49, 129, 17, 49, 146, 240, 29, 14, 113, 194, 177, + 33, 145, 65, 113, 33, 49, 81, 65, 49, 49, 81, 67, + 145, 33, 42, 193, 193, 130, 33, 178, 210, 209, 240, 64, + 41, 14, 177, 65, 130, 49, 33, 81, 65, 49, 65, 65, + 50, 49, 65, 65, 49, 65, 129, 65, 129, 65, 129, 65, + 49, 49, 81, 33, 65, 83, 65, 17, 35, 81, 49, 33, + 66, 66, 66, 113, 224, 27, 15, 65, 225, 225, 113, 81, + 40, 65, 225, 210, 193, 17, 113, 49, 33, 54, 81, 225, + 225, 225, 145, 65, 26, 49, 240, 176, 35, 15, 65, 65, + 145, 65, 145, 65, 129, 81, 129, 81, 129, 81, 114, 86, + 17, 17, 81, 81, 33, 81, 129, 81, 129, 81, 129, 81, + 129, 81, 129, 81, 129, 26, 240, 46, 15, 65, 225, 49, + 161, 65, 33, 81, 33, 33, 33, 81, 33, 81, 81, 33, + 81, 66, 33, 81, 49, 17, 49, 49, 49, 33, 49, 49, + 97, 65, 17, 113, 81, 129, 82, 113, 65, 33, 97, 49, + 65, 81, 18, 98, 240, 43, 15, 65, 225, 66, 129, 65, + 129, 65, 145, 65, 145, 49, 50, 66, 49, 49, 65, 17, + 33, 49, 65, 33, 17, 65, 113, 81, 129, 65, 49, 81, + 65, 65, 65, 49, 52, 49, 22, 49, 49, 33, 113, 240, + 49, 15, 65, 17, 193, 34, 21, 65, 49, 81, 49, 161, + 49, 33, 113, 49, 33, 113, 34, 33, 113, 17, 17, 33, + 114, 33, 33, 113, 49, 33, 113, 49, 33, 113, 49, 33, + 113, 49, 33, 65, 33, 49, 33, 83, 49, 33, 97, 240, + 16, 54, 15, 65, 225, 65, 145, 19, 81, 49, 33, 53, + 49, 33, 49, 49, 49, 33, 49, 49, 34, 33, 49, 49, + 17, 17, 33, 49, 50, 33, 33, 49, 49, 49, 33, 17, + 17, 49, 49, 34, 33, 49, 49, 18, 49, 19, 49, 97, + 33, 65, 97, 113, 97, 240, 64, 42, 15, 65, 65, 145, + 65, 145, 49, 17, 113, 49, 49, 97, 33, 81, 81, 17, + 33, 66, 34, 81, 65, 17, 17, 81, 81, 33, 129, 81, + 40, 65, 129, 81, 113, 97, 97, 113, 81, 129, 65, 240, + 96, 43, 15, 65, 81, 129, 81, 129, 81, 113, 97, 113, + 41, 49, 33, 49, 49, 34, 33, 49, 49, 17, 17, 33, + 49, 50, 33, 41, 49, 33, 49, 49, 49, 97, 113, 97, + 113, 97, 113, 97, 113, 97, 240, 64, 56, 15, 65, 97, + 113, 17, 65, 113, 17, 65, 97, 33, 65, 97, 33, 65, + 18, 49, 33, 65, 17, 50, 36, 18, 49, 17, 33, 65, + 49, 33, 33, 65, 97, 33, 65, 97, 33, 65, 97, 33, + 33, 17, 33, 49, 33, 17, 33, 33, 49, 19, 49, 33, + 49, 33, 83, 240, 48, 15, 65, 129, 81, 40, 65, 33, + 81, 65, 49, 81, 65, 49, 81, 65, 55, 50, 49, 81, + 33, 17, 49, 81, 17, 33, 49, 81, 65, 55, 65, 49, + 81, 65, 49, 81, 65, 33, 49, 33, 65, 33, 67, 65, + 17, 97, 240, 32, 39, 15, 65, 33, 177, 33, 177, 33, + 65, 81, 55, 65, 49, 33, 113, 33, 49, 98, 97, 81, + 17, 97, 65, 33, 26, 49, 97, 113, 97, 113, 97, 113, + 97, 113, 97, 113, 97, 240, 64, 40, 15, 65, 81, 129, + 81, 129, 33, 33, 113, 49, 33, 113, 55, 65, 33, 49, + 98, 33, 49, 81, 17, 97, 65, 33, 97, 113, 26, 49, + 97, 113, 97, 113, 97, 113, 97, 113, 97, 240, 64, 50, + 15, 65, 65, 145, 65, 145, 49, 17, 113, 49, 49, 97, + 33, 82, 65, 17, 114, 35, 33, 49, 33, 17, 17, 49, + 49, 49, 33, 49, 49, 97, 49, 49, 97, 49, 49, 97, + 49, 49, 97, 49, 49, 97, 33, 65, 97, 17, 81, 240, + 48, 36, 15, 65, 113, 97, 99, 81, 21, 113, 97, 113, + 97, 113, 97, 98, 97, 33, 33, 17, 27, 33, 97, 113, + 97, 113, 97, 113, 97, 113, 97, 113, 97, 33, 65, 41, + 240, 50, 15, 65, 97, 113, 49, 33, 113, 49, 33, 97, + 49, 65, 81, 49, 65, 81, 33, 98, 34, 17, 129, 17, + 18, 23, 33, 33, 65, 49, 81, 65, 49, 81, 65, 49, + 81, 49, 65, 81, 49, 17, 33, 81, 33, 51, 81, 17, + 81, 240, 48, 44, 15, 65, 65, 145, 81, 129, 81, 113, + 145, 65, 26, 49, 65, 130, 65, 65, 33, 17, 72, 33, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 49, 81, 65, + 49, 33, 33, 65, 33, 67, 65, 17, 97, 240, 32, + 0, // Padding + +}; + +tFont *g_psFontWFireflysung7x15 = (tFont *)g_pui8Fireflysung7x15; diff --git a/third_party/fonts/apl/license/big5/ARPHICPL.TXT b/third_party/fonts/apl/license/big5/ARPHICPL.TXT new file mode 100644 index 0000000..4ecb156 --- /dev/null +++ b/third_party/fonts/apl/license/big5/ARPHICPL.TXT @@ -0,0 +1,58 @@ +¤å¹©¤½²³±ÂÅv®Ñ + +µÛ§@Åv©Ò¦³(C) 1999 ¤å¹©¬ì§Þ¶}µoªÑ¥÷¦³­­¤½¥q +¥xÆW110¥x¥_¥«¥Ã¦N¸ô168¸¹11¼Ó +°£«D¥H¤U³W©w¡A«O¯d©Ò¦³Åv§Q¡C + +¥ô¦ó¤H§¡¥i­«»s¤Î´²¥¬¥»±ÂÅv®Ñ­ì©l¤å¥ó¤§½Æ¥»¡A¦ý¸T¤î­×§ï¤§¡C + +«e¨¥ + +¡@¡@¤j¦h¼Æ³nÅ餧±ÂÅv®Ñ«Y¥Î¨Ó­é¹Ü±z¦@¨É©M­×§ï³nÅ餧¦Û¥Ñ¡C¬Û§Î¤§¤U¡A¦pªG±z±N§Ú­Ì©Ò±Â»P±zªº¤@¤ÁÅv§Q±Â»P±zªº±µ¨üªÌ¡A¨Ã¥B½T«O¥L­Ì¯à±o¨ì¥»³nÅ餧­×§ïª«¡A¤å¹©¤½²³±ÂÅv®Ñ¯S§O³\¥i¨Ã¹ªÀy±z¨Ï¥Î¥»³nÅé¡C + +ªk«ß©Ê±ø´Ú + +0.¡@©w¸q +¡@¡@¥»±ÂÅv®Ñ¤¤¡A¡u¦r«¬¡v«Y«ü¡u¤å¹©PL²Ó¤W®ü§º¡v¡B¡u¤å¹©PL¤¤·¢¡v¡]BIG-5½X¡^©M¡u¤å¹©PL²³ø§º¡v¡B¡u¤å¹©PL²¤¤·¢¡v¡]GB½X¡^µ¥TrueType¦r«¬¡A¥H¤Î¸g­×§ï¦Ó²£¥Í¤§¸Óµ¥¦r«¬ªº­l¥Íª«¡A¥]¬A­×§ï¦r«¬¼Ë¦¡¡B§ó°Ê½s½X¶¶§Ç¡BÂà´«®æ¦¡¡BÅܧó¦r«¬¦WºÙ¡A©ÎªÌ¦bglyph table¤¤¼W´î¤@¨Ç¤å¦r¡C + +¡@¡@¡uPL¡v«Y«ü¡uPublic License¡v¡]¤½²³±ÂÅv¡^¡C + +¡@¡@¡uµÛ§@Åv¤H¡v«Y«ü¦b¦r«¬µÛ§@ÅvÁn©ú¤¤³QºÙ¬°µÛ§@ÅvªÌ¤§¤H¡C + +¡@¡@¡u±z¡v«Y«ü³Q±ÂÅvªÌ©Î­«»s¡B¦A´²¥¬¡B­×§ï¦r«¬¤§¤H¡C + +¡@¡@¡u¦Û¥Ñ¨Ï¥Î¡v«Y«ü±z¦b©Ò±µ¨ü¤§¬Û¦P±ø¥ó¤U¡A¦³­«»s¡B­×§ï¦r«¬¤Î´²¥¬¦r«¬½Æ¥»¤§¦Û¥Ñ¡A¦Ó«D«ü»ù®æ¡C¦pªG±zÄ@·N¡A¥i¥H¹ï¦¹¶µªA°È¦¬¨ú¶O¥Î¡C + +1.¡@­«»s¤Î´²¥¬ +¡@¡@¦pªG¦b©Ò¦³½Æ¥»ºû«ù¥»±ÂÅv®ÑÀɮס]ARPHICPL.TXT¡^¤£ÅÜ¡A±z¥i¥H¥ô¦ó´CÅéµL­­¨î­«»s¤Î´²¥¬¥»¦r«¬¤§½Æ¥»¡C + +2.¡@­×§ï +¡@¡@¦pªGº¡¨¬¥H¤U±ø¥ó¡A±z¥i¥H¥ô¦ó¤è¦¡­×§ï¥»¦r«¬¤§½Æ¥»¡A¥]¬A­×§ï¦r«¬¼Ë¦¡¡B§ó°Ê½s½X¶¶§Ç¡BÂà´«®æ¦¡¡BÅܧó¦r«¬¦WºÙ¡A©ÎªÌ¦bglyph table¤¤¼W´î¤@¨Ç¤å¦r¡A¨Ã¥B¨Ì¾Ú¤W­z²Ä¤@±ø¤§³W©w­«»s¤Î´²¥¬¸Ó­×§ïª«¡C + +¡@a)±z¥²¶·¦b¨C­Ó­×§ï¹LªºÀɮפ¤´¡¤J©úÅ㪺Án©ú¡Aªí¥Ü±z¦p¦ó¤Î¦ó®É­×§ï¤F¸ÓÀɮסC + +¡@b)±z¥²¶·¤¹³\©Ò¦³²Ä¤T¤H¦b¥»±ÂÅv®Ñ±ø´Ú¤U¡A±o¥H¡u¦Û¥Ñ¨Ï¥Î¡v¸Ó­×§ïª«¤§¥þ³¡¡A¨Ò¦p³z¹L«ü©w¦aÂI­«»s¸ô®|ªº´£¨Ñ¡A©Î¦b³q±`§@¬°³nÅ饿´«ªº´CÅé¤W´²¥¬¸Ó­×§ïª«¡C + +¡@c)¦pªG­×§ï¹L¤§¦r«¬¦b°õ¦æ®É¥H¥æ½Í¤è¦¡Åª¨ú©R¥O¡A±z¥²¶·¨Ï¥¦¦b¶}©l¶i¤J¤@¯ë¤§¥æ½Í¨Ï¥Î¤è¦¡®É¦C¦L©ÎÅã¥ÜÁn©ú¡A¥]¬A¾A·íªºµÛ§@ÅvÁn©ú¡BµL¾á«OÁn©ú¡]©ÎªÌ¨ä¥L±z´£¨Ñ¾á«OªºÁn©ú¡^¡A¥H¤Î¨Ï¥ÎªÌ¥i¥H¨Ì¾Ú³o¨Ç±ø¥ó¦A´²¥¬¥»¦r«¬ªºÁn©ú¡A¨Ã¥B§iª¾¨Ï¥ÎªÌ¦p¦ó¬Ý¨ì¥»±ÂÅv®Ñ¤§½Æ¥»¡C + +¡@¡@³o¨Ç­n¨D¾A¥Î©ó¾ã­Ó­×§ï¹L¤§µÛ§@¡C¦pªGµÛ§@ªº¥i¿ëÃѳ¡¤À¨Ã«D­l¥Í¦Û¥»¦r«¬¡A¥B¥i¥H¦X²z¦a»{¨ä¬°¿W¥ß¦Ó­Ó§O¤§µÛ§@¡A«h·í±z±N¥¦·í§@­Ó§OµÛ§@´²¥¬®É¡A¥»±ÂÅv®Ñ¤Î¨ä±ø´Ú±N¤£¾A¥Î©ó¸Ó³¡¤À¡C¦]¦¹¡A¶È±N«D°ò©ó¥»¦r«¬¤§¨ä¥LµÛ§@©M¥»¦r«¬¤@°_©ñ¤J¶J¦s©Î´²¥¬´CÅ骺¦P¤@¨÷¤W¡A¨Ã¤£·|¨Ï¸Ó¨ä¥LµÛ§@¯Ç¤J¥»±ÂÅv®Ñªº¾A¥Î½d³ò¡C + +3.¡@¸Ñ°£±ø¥ó +¡@¡@°£«D¨Ì·Ó¥»±ÂÅv®Ñ¤§©ú¥Ü³W©w¡A§_«h±z¤£¯à­«»s¡B­×§ï¡B¦A±ÂÅv©Î´²¥¬¥»¦r«¬¡C¥ô¦ó¥Î¨ä¥L¤è¦¡­«»s¡B­×§ï¡B¦A±ÂÅv©Î´²¥¬¥»¦r«¬¤§·N¹Ï¡A±N¨Ï¥»±ÂÅv®Ñ©Ò±Â»P±z¤§Åv§Q¦Û°Ê·¹¤Î¦a¥¢®Ä¡C¤£¹L±q±z¨ºùب̾ڥ»±ÂÅv®Ñ¨ú±o½Æ¥»©MÅv§Qªº¤H¡A¥u­n¥L­Ì§¹¥þ¿í¦æ±ø´Ú¡A¨äÅv§Q±Nºû«ù¦³®Ä¡C + +4.¡@¦P·N +¡@¡@¦]±z¥¼Ã±­q¥»±ÂÅv®Ñ¡A©Ò¥H¨S¥²­n¿í¦æ¤§¡CµM¦Ó¡A¨S¦³¥ô¦ó¨ä¥L¤å¥ó±Â»P±z­«»s¡B­×§ï¡B¦A±ÂÅv©Î´²¥¬¥»¦r«¬¤§Åv§Q¡A¦pªG±z¤£¦P·N¥»±ÂÅv®Ñ¡A³o¨Ç¦æ¬°¬Oªk«ß©Ò¸T¤îªº¡C¦]¦¹¤@¥¹­«»s¡B­×§ï¡B¦A±ÂÅv©Î´²¥¬¥»¦r«¬¡A´Nªí¥Ü±z±µ¨ü¥»±ÂÅv®Ñ¤Î¨ä¤@¤Á±ø´Ú©M±ø¥ó¡C + +5.¡@¦Û°Ê¨ú±o±ÂÅv +¡@¡@¨C·í±z¦A´²¥¬¥»¦r«¬®É¡A¦¬¨üªÌ«K¦Û°Ê±q­ì©l±ÂÅvªÌ³B¨ú±o¨Ì¾Ú³o¨Ç±ø´Ú©M±ø¥ó­«»s¡B´²¥¬©Î­×§ï¥»¦r«¬¤§±ÂÅv¡C±z¤£¥i¹ï¦b¦¹©Ò±Â»P¦¬¨üªÌ¤§Åv§Q¹ê¦æ±j¥[¨ä¥L­­¨î¡A±z¤]¨S¦³¨Ï²Ä¤T¤H¿í¦æ¥»±ÂÅv®Ñªº¸q°È¡C + +6.¡@©èIJ +¡@¡@­Y¦]ªk°|§P¨M¡B¹H¤Ï±M§Q«ÅºÙ©Î¥ô¦ó¨ä¥L­ì¦]¡]¤£­­©ó±M§QªÈ¯É¡^ªºµ²ªG¡A¨Ï±j¥[©ó±z¤§±ø¥ó¡]¤£½×¬Oªk°|©R¥O¡B¨óij©Î¨ä¥L¡^©M±ÂÅv®Ñ¤§±ø¥ó¦³©Ò½Ä¬ð®É¡A¤]¤£¯àÅý±z¹H­I±ÂÅv®Ñ¤§±ø¥ó¡C¦pªG±z¤£¯à¦P®Éº¡¨¬¥»±ÂÅv®Ñ©Ò©w¤§¸q°È¤Î¨ä¥L¬ÛÃö¸q°È¨Ó´²¥¬®É¡A¨º»ò±z®Ú¥»¤£¥i´²¥¬¥»¦r«¬¡C¨Ò¦p¡A¦pªG±M§Q±ÂÅv¤£³\©Ò¦³ª½±µ©Î¶¡±µ±q±z¨º¸Ì¨ú±o½Æ¥»ªÌ¡A¦b§K±ÂÅv¶Oªº±¡ªp¤U¦A´²¥¬¥»¦r«¬®É¡A°ß¤@¯à¦P®Éº¡¨¬Âù¤è­n¨Dªº¤èªk¬O§¹¥þÁ×§K´²¥¬¥»¦r«¬¡C + +¡@¡@¦pªG¥»±ø´Ú¤§¥ô¦ó³¡¤À¦b¯S©w±¡ªp¤UµL®Ä©ÎµLªk¹ê¬I¡A±ø´Ú¤§¨ä¥L³¡¤À±NÄ~Äò¾A¥Î¡A¨Ã§@¬°¾ãÅé¾A¥Î©ó¨ä¥L±¡ªp¡C + +7.¡@µL¾á«O +¡@¡@¥Ñ©ó¥»¦r«¬«Y§K¶O±ÂÅv¡A¦b·Ç¾Úªk¤¹³\¤§½d³ò¤º¡A¥»¦r«¬±N¤£ªþ±a¥ô¦ó¾á«O¡C°£«D¥t¦³®Ñ­±»¡©ú¡AµÛ§@Åv¤H©Î¨ä¥L´£¨Ñ¥»¦r«¬ªÌ¡u¦P¼Ë¡v¤£´£¨Ñ¥ô¦óºØÃþ¤§¾á«O¡A¤£½×«Y©ú¥ÜÁÙ¬O·t¥Ü¡A¥]¬A¦ý¤£­­©ó¾P°â©Ê©M¾A©ó¯S©w¥Øªº¤§·t¥Ü¾á«O¡C¦³Ãö¥»¦r«¬«~½è©M°õ¦æ¤§¤@¤Á¦MÀI§¡¥Ñ±z©Ó¾á¡C¦pªG¥»¦r«¬¥X²{·å²«¡A±zÀ³©Ó¾á¤@¤Á©Ò»ÝªA°È¡B­×´_©M§ï¥¿ªº¶O¥Î¡C + +8.¡@·l®`½ßÀv½Ð¨DÅv¤§©ñ±ó +¡@¡@°£«D·Ç¾Úªk³W©w©Î¥H®Ñ­±¦P·N¡A¦b¥ô¦ó±¡ªp¤U¡A¥ô¦óµÛ§@Åv¤H©Î¥H¤W³Q¤¹³\±o¥H­«»s¡B­×§ï©Î¦A´²¥¬¥»¦r«¬ªÌ¡A§¡¤£¹ï±z¦]¨Ï¥Î©Î¤£¯à¨Ï¥Î¥»¦r«¬¡]¥]¬A¦ý¤£­­©ó´À¥N°Ó«~©ÎªA°È¤§±ÄÁÊ¡F¨Ï¥Î¡B¼Æ¾Ú©Î§Q¯q¤§·l¥¢¡F©ÎªÌÀç·~§«Ãª¡^©Ò¤Þ­P¤§¥ô¦óª½±µ¡B¶¡±µ¡B¥²µM¡B°¸µM¡B¯S®í©ÎÃg»@©Ê·l¥¢­t³d¡A§Y¨ÏµÛ§@Åv¤H©Î¨ä¥L¤H¤wª¾¸Ó·l¥¢¤§¥i¯à©Ê®É¥ç¤£¨Ò¥~¡C diff --git a/third_party/fonts/apl/license/english/ARPHICPL.TXT b/third_party/fonts/apl/license/english/ARPHICPL.TXT new file mode 100644 index 0000000..7e38aa5 --- /dev/null +++ b/third_party/fonts/apl/license/english/ARPHICPL.TXT @@ -0,0 +1,58 @@ +ARPHIC PUBLIC LICENSE + +Copyright (C) 1999 Arphic Technology Co., Ltd. +11Fl. No.168, Yung Chi Rd., Taipei, 110 Taiwan +All rights reserved except as specified below. + +Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is forbidden. + +Preamble + + The licenses for most software are designed to take away your freedom to share and change it. By contrast, the ARPHIC PUBLIC LICENSE specifically permits and encourages you to use this software, provided that you give the recipients all the rights that we gave you and make sure they can get the modifications of this software. + +Legal Terms + +0. Definitions: + Throughout this License, "Font" means the TrueType fonts "AR PL Mingti2L Big5", "AR PL KaitiM Big5" (BIG-5 character set) and "AR PL SungtiL GB", "AR PL KaitiM GB" (GB character set) which are originally distributed by Arphic, and the derivatives of those fonts created through any modification including modifying glyph, reordering glyph, converting format, changing font name, or adding/deleting some characters in/from glyph table. + + "PL" means "Public License". + + "Copyright Holder" means whoever is named in the copyright or copyrights for the Font. + + "You" means the licensee, or person copying, redistributing or modifying the Font. + + "Freely Available" means that you have the freedom to copy or modify the Font as well as redistribute copies of the Font under the same conditions you received, not price. If you wish, you can charge for this service. + +1. Copying & Distribution + You may copy and distribute verbatim copies of this Font in any medium, without restriction, provided that you retain this license file (ARPHICPL.TXT) unaltered in all copies. + +2. Modification + You may otherwise modify your copy of this Font in any way, including modifying glyph, reordering glyph, converting format, changing font name, or adding/deleting some characters in/from glyph table, and copy and distribute such modifications under the terms of Section 1 above, provided that the following conditions are met: + + a) You must insert a prominent notice in each modified file stating how and when you changed that file. + + b) You must make such modifications Freely Available as a whole to all third parties under the terms of this License, such as by offering access to copy the modifications from a designated place, or distributing the modifications on a medium customarily used for software interchange. + + c) If the modified fonts normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the Font under these conditions, and telling the user how to view a copy of this License. + + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Font, and can be reasonably considered independent and separate works in themselves, then this License and its terms, do not apply to those sections when you distribute them as separate works. Therefore, mere aggregation of another work not based on the Font with the Font on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. Condition Subsequent + You may not copy, modify, sublicense, or distribute the Font except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Font will automatically retroactively void your rights under this License. However, parties who have received copies or rights from you under this License will keep their licenses valid so long as such parties remain in full compliance. + +4. Acceptance + You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to copy, modify, sublicense or distribute the Font. These actions are prohibited by law if you do not accept this License. Therefore, by copying, modifying, sublicensing or distributing the Font, you indicate your acceptance of this License and all its terms and conditions. + +5. Automatic Receipt + Each time you redistribute the Font, the recipient automatically receives a license from the original licensor to copy, distribute or modify the Font subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +6. Contradiction + If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Font at all. For example, if a patent license would not permit royalty-free redistribution of the Font by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Font. + + If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +7. NO WARRANTY + BECAUSE THE FONT IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE FONT, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS OR OTHER PARTIES PROVIDE THE FONT "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 FONT IS WITH YOU. SHOULD THE FONT PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +8. DAMAGES WAIVER + UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, IN NO EVENT WILL ANY COPYRIGHTT HOLDERS, OR OTHER PARTIES WHO MAY COPY, MODIFY OR REDISTRIBUTE THE FONT AS PERMITTED ABOVE, BE LIABLE TO YOU FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, INCIDENTAL, SPECIAL OR EXEMPLARY DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE FONT (INCLUDING BUT NOT LIMITED TO PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA OR PROFITS; OR BUSINESS INTERRUPTION), EVEN IF SUCH HOLDERS OR OTHER PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. diff --git a/third_party/fonts/apl/license/gb/ARPHICPL.TXT b/third_party/fonts/apl/license/gb/ARPHICPL.TXT new file mode 100644 index 0000000..bb760bc --- /dev/null +++ b/third_party/fonts/apl/license/gb/ARPHICPL.TXT @@ -0,0 +1,58 @@ +Îͦ¹«ÖÚÊÚȨÊé + +°æÈ¨ËùÓÐ(C) 1999 Îͦ¿Æ¼¼¿ª·¢¹É·ÝÓÐÏÞ¹«Ë¾ +̨Íå110̨±±ÊÐÓÀ¼ªÂ·168ºÅ11Â¥ +³ýÒÔϹ涨Í⣬±£ÁôËùÓÐȨÀû¡£ + +ÈκÎÈ˾ù¿ÉÒÔ¸´ÖƼ°·Ö·¢±¾ÊÚȨÊéԭʼÎļþµÄ¸´±¾£¬µ«½ûÖ¹ÐÞ¸ÄÖ®¡£ + +ǰÑÔ + +¡¡¡¡¾ø´ó¶àÊýÈí¼þµÄÊÚȨÊéÊÇÓÃÀ´°þ¶áÄú¹²ÏíºÍÐÞ¸ÄÈí¼þµÄ×ÔÓÉ¡£Ïà·´£¬Èç¹ûÄú½«ÎÒÃÇËùÊÚÓëÄúµÄÒ»ÇÐȨÀûÊÚÓëÄúµÄ½ÓÊÜÕߣ¬²¢ÇÒÈ·±£ËûÃÇÄܵõ½±¾Èí¼þµÄÐÞ¸ÄÎÎͦ¹«ÖÚÊÚȨÊéÌØ±ðÐí¿É²¢¹ÄÀøÄúʹÓñ¾Èí¼þ¡£ + +·¨ÂÉÐÔÌõ¿î + +0.¡¡¶¨Òå +¡¡¡¡±¾ÊÚȨÊéÖУ¬¡¸×ÖÐÍ¡¹ÊÇÖ¸¡¸ÎͦPLϸÉϺ£ËΡ¹¡¢¡¸ÎͦPLÖп¬¡¹£¨BIG-5Â룩ºÍ¡¸ÎͦPL¼ò±¨ËΡ¹¡¢¡¸ÎͦPL¼òÖп¬¡¹£¨GBÂ룩µÈTrueType×ÖÐÍ£¬ÒÔ¼°¾­Ð޸Ķø²úÉúµÄ¸ÃµÈ×ÖÐ͵ÄÑÜÉúÎ°üÀ¨ÐÞ¸Ä×ÖÐÍÑùʽ¡¢¸ü¶¯±àÂë˳Ðò¡¢×ª»»¸ñʽ¡¢±ä¸ü×ÖÐÍÃû³Æ£¬»òÕßÔÚglyph tableÖÐÔö¼õһЩÎÄ×Ö¡£ + +¡¡¡¡¡¸PL¡¹ÊÇÖ¸¡¸Public License¡¹£¨¹«ÖÚÊÚȨ£©¡£ + +¡¡¡¡¡¸°æÈ¨ÈË¡¹ÊÇÖ¸ÔÚ×ÖÐͰæÈ¨ÉùÃ÷Öб»³ÆÎª°æÈ¨ËùÓÐÕßÖ®ÈË¡£ + +¡¡¡¡¡¸Äú¡¹ÊÇÖ¸±»ÊÚȨÕß»ò¸´ÖÆ¡¢ÔÙÉ¢²¼¡¢ÐÞ¸Ä×ÖÐ͵ÄÈË¡£ + +¡¡¡¡¡¸×ÔÓÉʹÓá¹ÊÇÖ¸ÄúÔÚËù½ÓÊܵÄÏàͬÌõ¼þÏ£¬Óи´ÖÆ¡¢ÐÞ¸Ä×ÖÐͼ°É¢²¼×ÖÐ͸´ÖÆÆ·µÄ×ÔÓÉ£¬¶ø·ÇÖ¸¼Û¸ñ¡£Èç¹ûÄúÔ¸Ò⣬¿ÉÒÔ¶Ô´ËÏî·þÎñÊÕÈ¡·ÑÓᣠ+ +1.¡¡¸´ÖƼ°·Ö·¢ +¡¡¡¡Èç¹ûÔÚËùÓи´ÖÆÆ·Î¬³Ö±¾ÊÚȨÊéÎļþ£¨ARPHICPL.TXT£©²»±ä£¬Äú¿ÉÒÔÔÚÈκÎýÌåÎÞÏÞÖÆ¸´ÖƼ°·Ö·¢±¾×ÖÐÍÖ®¸´ÖÆÆ·¡£ + +2.¡¡ÐÞ¸Ä +¡¡¡¡Èç¹ûÂú×ãÒÔÏÂÌõ¼þ£¬Äú¿ÉÒÔÓÃÈκη½Ê½Ð޸ı¾×ÖÐ͵ĸ´ÖÆÆ·£¬°üÀ¨ÐÞ¸Ä×ÖÐÍÑùʽ¡¢¸ü»»±àÂë˳Ðò¡¢×ª»»¸ñʽ¡¢±ä¸ü×ÖÐÍÃû³Æ£¬»òÕßÔÚglyph tableÖÐÔö¼õһЩÎÄ×Ö£¬²¢ÇÒÒÀ¾ÝÉÏÊöµÚÒ»ÌõµÄ¹æ¶¨¸´ÖƼ°·Ö·¢¸ÃÐÞ¸ÄÎï¡£ + +¡¡a)Äú±ØÐëÔÚÿ¸öÐ޸ĹýµÄÎļþÖвåÈëÃ÷ÏÔµÄÉùÃ÷£¬±íʾÄúÈçºÎ¼°ºÎʱÐÞ¸ÄÁ˸ÃÎļþ¡£ + +¡¡b)Äú±ØÐëÔÊÐíËùÓеÚÈý·½ÔÚ±¾ÊÚȨÊéÌõ¿îÏ£¬µÃÒÔ¡¸×ÔÓÉʹÓṸÃÐÞ¸ÄÎïµÄÈ«²¿£¬ÀýÈçͨ¹ýÌṩָ¶¨µØµãµÄ¸´ÖÆÂ·¾¶£¬»òÔÚͨ³£×÷ΪÈí¼þ½»»»µÄýÌåÉÏ·¢²¼¸ÃÐÞ¸ÄÎï¡£ + +¡¡c)Èç¹ûÐ޸ĹýµÄ×ÖÐÍÔÚÖ´ÐÐʱÒÔ½»Ì¸·½Ê½¶ÁÈ¡ÃüÁÄú±ØÐëʹËüÔÚ¿ªÊ¼½øÈëÒ»°ãµÄ½»Ì¸Ê¹Ó÷½Ê½Ê±´òÓ¡»òÏÔʾÉùÃ÷£¬°üÀ¨Êʵ±µÄ°æÈ¨ÉùÃ÷¡¢ÎÞµ£±£ÉùÃ÷£¨»òÕ߯äËûÄúÌṩµ£±£µÄÉùÃ÷£©£¬ÒÔ¼°Ê¹ÓÃÕß¿ÉÒÔÒÀ¾ÝÕâЩÌõ¼þÔÙ·Ö·¢±¾×ÖÐ͵ÄÉùÃ÷£¬²¢ÇÒ¸æÖªÊ¹ÓÃÕßÈçºÎ¿´µ½±¾ÊÚȨÊéµÄ¸´±¾¡£ + +¡¡¡¡ÕâЩҪÇóÊÊÓÃÓÚÕû¸öÐ޸ĹýµÄ×÷Æ·¡£Èç¹û×÷Æ·µÄ¿É±æÊ¶²¿·Ö²¢·ÇÑÜÉú×Ô±¾×ÖÐÍ£¬ÇÒ¿ÉÒÔºÏÀíµØÈÏÆäΪ¶ÀÁ¢¶ø¸ö±ðµÄ×÷Æ·£¬Ôòµ±Äú½«Ëüµ±×÷¸ö±ð×÷Æ··Ö·¢Ê±£¬±¾ÊÚȨÊé¼°ÆäÌõ¿î½«²»ÊÊÓÃÓڸò¿·Ö¡£Òò´Ë£¬½ö½«·Ç»ùÓÚ±¾×ÖÐÍÖ®ÆäËû×÷Æ·ºÍ±¾×ÖÐÍÒ»Æð·ÅÈëÖü´æ»ò·Ö·¢Ã½ÌåµÄͬһ¾íÉÏ£¬²¢²»»áʹ¸ÃÆäËû×÷Æ·ÄÉÈë±¾ÊÚȨÊéµÄÊÊÓ÷¶Î§¡£ + +3.¡¡½â³ýÌõ¼þ +¡¡¡¡³ý·ÇÒÀÕÕ±¾ÊÚȨÊéµÄ¹æ¶¨£¬·ñÔòÄú²»Äܸ´ÖÆ¡¢Ð޸ġ¢ÔÙÊÚȨ»ò·Ö·¢±¾×ÖÐÍ¡£ÈκÎÓÃÆäËû·½Ê½¸´ÖÆ¡¢Ð޸ġ¢ÔÙÊÚȨ»ò·Ö·¢±¾×ÖÐ͵ÄÒâͼ£¬½«Ê¹±¾ÊÚȨÊéËùÊÚÓëÄúµÄȨÀû×Ô¶¯Ê§Ð§¡£²»¹ý£¬´ÓÄúÄÇÒÀ¾Ý±¾ÊÚȨÊéÈ¡µÃ¸´ÖÆÆ·ºÍȨÀûµÄÈË£¬Ö»ÒªËûÃÇÍêÈ«×ñÐÐÌõ¿î£¬ÆäȨÀû½«Î¬³ÖÓÐЧ¡£ + +4.¡¡Í¬Òâ +¡¡¡¡ÒòÄúδǩ¶©±¾ÊÚȨÊ飬ËùÒÔû±ØÒª×ñÐÐËü¡£È»¶ø£¬Ã»ÓÐÈÎºÎÆäËûÎļþÊÚÓëÄú¸´ÖÆ¡¢Ð޸ġ¢ÔÙÊÚȨ»ò·Ö·¢±¾×ÖÐÍ֮ȨÀû£¬Èç¹ûÄú²»Í¬Òâ±¾ÊÚȨÊ飬ÕâЩÐÐΪÊÇ·¨ÂÉËù½ûÖ¹µÄ¡£Òò´ËÒ»µ©¸´ÖÆ¡¢Ð޸ġ¢ÔÙÊÚȨ»ò·Ö·¢±¾×ÖÐÍ£¬¾Í±íʾÄú½ÓÊܱ¾ÊÚȨÊé¼°ÆäÒ»ÇÐÌõ¿îºÍÌõ¼þ¡£ + +5.¡¡×Ô¶¯È¡µÃÊÚȨ +¡¡¡¡Ã¿µ±ÄúÔÙÉ¢²¼±¾×ÖÐÍʱ£¬ÊÕÊÜÕß±ã×Ô¶¯´ÓԭʼÊÚȨÕß´¦È¡µÃÒÀ¾ÝÕâЩÌõ¿îºÍÌõ¼þ¸´ÖÆ¡¢·Ö·¢»òÐ޸ı¾×ÖÐ͵ÄÊÚȨ¡£Äú²»¿É¶ÔÔÚ´ËËùÊÚÓëÊÕÊÜÕß֮ȨÀûʵÐÐÇ¿¼ÓÆäËûÏÞÖÆ£¬ÄúҲûÓÐʹµÚÈý·½×ñÐб¾ÊÚȨÊéµÄÒåÎñ¡£ + +6.¡¡µÖ´¥ +¡¡¡¡ÈôÒò·¨ÔºÅоö¡¢Î¥·´×¨ÀûÐû³Æ»òÈÎºÎÆäËûÔ­Òò£¨²»ÏÞÓÚרÀû¾À·×£©µÄ½á¹û£¬Ê¹Ç¿¼ÓÓÚÄúµÄÌõ¼þ£¨²»ÂÛÊÇ·¨ÔºÃüÁЭÒé»òÆäËû£©ºÍÊÚȨÊéµÄÌõ¼þÓÐËù³åͻʱ£¬Ò²²»ÄÜÈÃÄúÎ¥±³ÊÚȨÊéµÄÌõ¼þ¡£Èç¹ûÄú²»ÄÜͬʱÂú×ã±¾ÊÚȨÊéËù¶¨µÄÒåÎñ¼°ÆäËûÏà¹ØÒåÎñÀ´·Ö·¢Ê±£¬ÄÇ÷áÄú¸ù±¾²»¿É·Ö·¢±¾×ÖÐÍ¡£ÀýÈ磬Èç¹ûרÀûÊÚȨ²»ÐíËùÓÐÖ±½Ó»ò¼ä½Ó´ÓÄúÄÇÀïÈ¡µÃ¸´ÖÆÆ·Õߣ¬ÔÚÃâÊÚȨ·ÑµÄÇé¿öÏÂÔÙ·Ö·¢±¾×ÖÐÍʱ£¬Î¨Ò»ÄÜͬʱÂú×ãË«·½ÒªÇóµÄ·½·¨ÊÇÍêÈ«±ÜÃâ·Ö·¢±¾×ÖÐÍ¡£ + +¡¡¡¡Èç¹û±¾Ìõ¿îÖ®Èκβ¿·ÖÔÚÌØ¶¨Çé¿öÏÂÎÞЧ»òÎÞ·¨ÊµÊ©£¬Ìõ¿îµÄÆäËû²¿·Ö½«¼ÌÐøÊÊÓ㬲¢×÷ΪÕûÌåÊÊÓÃÓÚÆäËûÇé¿ö¡£ + +7.¡¡ÎÞµ£±£ +¡¡¡¡ÓÉÓÚ±¾×ÖÐÍÊÇÃâ·ÑÊÚȨ£¬ÔÚ·¨ÂÉÔÊÐíµÄ·¶Î§ÄÚ£¬±¾×ÖÐͽ«²»¸½´øÈκε£±£¡£³ý·ÇÁíÓÐÊéÃæËµÃ÷£¬°æÈ¨ÈË»òÆäËûÌṩ±¾×ÖÐÍÕß¡¸Í¬Ñù¡¹²»ÌṩÈκÎÖÖÀàµÄµ£±££¬²»ÂÛÊÇÃ÷ʾ»¹ÊǰµÊ¾£¬°üÀ¨µ«²»ÏÞÓÚÏúÊÛÐÔºÍÊÊÓÚÌØ¶¨Ä¿µÄµÄ°µÊ¾µ£±£¡£Óйر¾×ÖÐÍÆ·ÖʺÍÖ´ÐеÄÒ»ÇÐΣÏÕ¾ùÓÉÄú³Ðµ£¡£Èç¹û±¾×ÖÐͳöÏÖ覴ã¬ÄúÓ¦³Ðµ£Ò»ÇÐËùÐè·þÎñ¡¢ÐÞ¸´ºÍ¸ÄÕýµÄ·ÑÓᣠ+ +8.¡¡Ëðº¦Åâ³¥ÇëÇóȨµÄ·ÅÆú +¡¡¡¡³ý·Ç·¨Âɹ涨»òÒÔÊéÃæÐÎʽͬÒ⣬ÔÚÈκÎÇé¿öÏ£¬ÈκΰæÈ¨ÈË»òÒÔÉϱ»ÔÊÐíµÃÒÔ¸´ÖÆ¡¢Ð޸ĻòÔÙ·Ö·¢±¾×ÖÐÍÕߣ¬¾ù²»¶ÔÄúÒòʹÓûò²»ÄÜʹÓñ¾×ÖÐÍ£¨°üÀ¨µ«²»ÏÞÓÚÌæ´úÉÌÆ·»ò·þÎñµÄ²É¹º£»Ê¹Óá¢Êý¾Ý»òÀûÒæÖ®Ëðʧ£»»òÕßÓªÒµ·Á°­£©ËùÒýÖµÄÈκÎÖ±½Ó¡¢¼ä½Ó¡¢±ØÈ»¡¢Å¼È»¡¢ÌØÊâ»ò³Í·£ÐÔËðʧ¸ºÔ𣬼´Ê¹°æÈ¨ÈË»òÆäËûÈËÒÑÖª¸ÃËðʧµÄ¿ÉÄÜÐÔʱÒ಻ÀýÍâ¡£ diff --git a/third_party/fonts/apl/readme.txt b/third_party/fonts/apl/readme.txt new file mode 100644 index 0000000..da54c50 --- /dev/null +++ b/third_party/fonts/apl/readme.txt @@ -0,0 +1,5 @@ +The fonts in this directory are covered under the Arphic Public License. + +Specific sources: + +fireflysung - http://www.study-area.org/apt/firefly-font/ diff --git a/third_party/fonts/apl/ttf/fireflysung.ttf b/third_party/fonts/apl/ttf/fireflysung.ttf new file mode 100644 index 0000000..d91b989 Binary files /dev/null and b/third_party/fonts/apl/ttf/fireflysung.ttf differ diff --git a/third_party/fonts/lang_demo/Makefile b/third_party/fonts/lang_demo/Makefile new file mode 100644 index 0000000..958e8a4 --- /dev/null +++ b/third_party/fonts/lang_demo/Makefile @@ -0,0 +1,91 @@ +#****************************************************************************** +# +# Makefile - Makefile rules to build the custom font required by the +# lang_demo example application. +# +# Copyright (c) 2008 Texas Instruments Incorporated. All rights reserved. +# TI Information - Selective Disclosure +# +#****************************************************************************** + +# +# Build the C version of the images and the language table. +# +all: language.c langremap.c fontcustom14pt.c fontcustomr14pt.c fontcustom20pt.c fontcustomr20pt.c + +# +# Build binary versions of each of the fonts used by the application. This is +# purely for test purposes since these can be placed on an SDCard (renamed to +# FONT.BIN) to allow their contents to be viewed using the fontview application. +# +binfonts: fontcustom14pt.bin fontcustomr14pt.bin fontcustom20pt.bin fontcustomr20pt.bin + +# +# Build our string table from the CSV file. +# +language.c: language.csv + ../../../tools/bin/mkstringtable -u -f language.csv -b language -s utf8 -t + +# +# Build our remapped string table from the CSV file. +# +langremap.c: language.csv + ../../../tools/bin/mkstringtable -u -c 0x8000 -f language.csv -b langremap -s utf8 -r + +# +# Build the custom font used by the application based on the output of the +# mkstringtable step. We build 2 fonts, one for use with the remapped +# string table and the other indexed using normal Unicode codepoints. +# +fontcustom14pt.c: language.c AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + ../../../tools/bin/ftrasterize -u -c language.txt -r -f custom -s 14 AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + +fontcustomr14pt.c: langremap.c AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + ../../../tools/bin/ftrasterize -u -c langremap.txt -r -z 0x8000 -f customr -s 14 AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + +fontcustom20pt.c: language.c AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + ../../../tools/bin/ftrasterize -u -c language.txt -r -f custom -s 20 AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + +fontcustomr20pt.c: langremap.c AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + ../../../tools/bin/ftrasterize -u -c langremap.txt -r -z 0x8000 -f customr -s 20 AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + +# +# Build binary versions of the custom fonts for test purposes. This allows us +# to check the contents of the font by placing the file on an SDCard and running +# the fontview application. +# +fontcustom14pt.bin: language.c AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + ../../../tools/bin/ftrasterize -u -c language.txt -r -f custom -s 14 -y AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + +fontcustomr14pt.bin: langremap.c AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + ../../../tools/bin/ftrasterize -u -c langremap.txt -r -z 0x8000 -f customr -s 14 -y AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + +fontcustom20pt.bin: language.c AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + ../../../tools/bin/ftrasterize -u -c language.txt -r -f custom -s 20 -y AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + +fontcustomr20pt.bin: langremap.c AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + ../../../tools/bin/ftrasterize -u -c langremap.txt -r -z 0x8000 -f customr -s 20 -y AndBasR.ttf fireflysung.ttf NanumMyeongjo.ttf sazanami-gothic.ttf + + +# +# Copy font files into the local directory if needed. +# +fireflysung.ttf: + cp ../apl/ttf/fireflysung.ttf . + +sazanami-gothic.ttf: + cp ../other/ttf/sazanami-gothic.ttf . + +NanumMyeongjo.ttf: + cp ../ofl/ttf/NanumMyeongjo.ttf . + +AndBasR.ttf: + cp ../ofl/ttf/AndBasR.ttf . +# +# Clean out the things produced by this makefile. +# +clean: + @rm -f language.c language.h language.txt fontcustom14pt.c fontcustom20pt.c + @rm -f langremap.c langremap.h langremap.txt fontcustomr14pt.c fontcustomr20pt.c + @rm -f fontcustom14pt.bin fontcustom20pt.bin f fontcustomr14pt.bin fontcustomr20pt.bin + diff --git a/third_party/fonts/lang_demo/fontcustom14pt.c b/third_party/fonts/lang_demo/fontcustom14pt.c new file mode 100644 index 0000000..9efdedf --- /dev/null +++ b/third_party/fonts/lang_demo/fontcustom14pt.c @@ -0,0 +1,4975 @@ +//***************************************************************************** +// +// fontcustom14pt.c - Font definition for the 14ptpt Custom font. +// +// Copyright (c) 2011 Texas Instruments Incorporated. All rights reserved. +// TI Information - Selective Disclosure +// +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 323 in 241 blocks +// Style: custom +// Size: 14pt +// Bold: no +// Italic: no +// Memory usage: 12943 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Custom14pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 13, + + // + // The height of the font. + // + 16, + + // + // The baseline of the font. + // + 13, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (241). + // + 241, 0, + + // + // Block header 0: Codepoints 0x20 - 0x20 + // + 0x20, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x54, 0x0b, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x27 - 0x27 + // + 0x27, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x5c, 0x0b, 0x00, 0x00, + + // + // Block header 2: Codepoints 0x2b - 0x2e + // + 0x2b, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, + 0x68, 0x0b, 0x00, 0x00, + + // + // Block header 3: Codepoints 0x30 - 0x3a + // + 0x30, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, + 0x9c, 0x0b, 0x00, 0x00, + + // + // Block header 4: Codepoints 0x41 - 0x47 + // + 0x41, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, + 0x88, 0x0c, 0x00, 0x00, + + // + // Block header 5: Codepoints 0x49 - 0x49 + // + 0x49, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x30, 0x0d, 0x00, 0x00, + + // + // Block header 6: Codepoints 0x4b - 0x55 + // + 0x4b, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, + 0x44, 0x0d, 0x00, 0x00, + + // + // Block header 7: Codepoints 0x57 - 0x57 + // + 0x57, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x6c, 0x0e, 0x00, 0x00, + + // + // Block header 8: Codepoints 0x59 - 0x59 + // + 0x59, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x98, 0x0e, 0x00, 0x00, + + // + // Block header 9: Codepoints 0x5b - 0x5b + // + 0x5b, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb0, 0x0e, 0x00, 0x00, + + // + // Block header 10: Codepoints 0x5d - 0x5d + // + 0x5d, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc4, 0x0e, 0x00, 0x00, + + // + // Block header 11: Codepoints 0x5f - 0x5f + // + 0x5f, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd8, 0x0e, 0x00, 0x00, + + // + // Block header 12: Codepoints 0x61 - 0x69 + // + 0x61, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, + 0xe4, 0x0e, 0x00, 0x00, + + // + // Block header 13: Codepoints 0x6b - 0x77 + // + 0x6b, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, + 0xa8, 0x0f, 0x00, 0x00, + + // + // Block header 14: Codepoints 0x79 - 0x7a + // + 0x79, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xd4, 0x10, 0x00, 0x00, + + // + // Block header 15: Codepoints 0xc4 - 0xc4 + // + 0xc4, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x00, 0x11, 0x00, 0x00, + + // + // Block header 16: Codepoints 0xe4 - 0xe4 + // + 0xe4, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x20, 0x11, 0x00, 0x00, + + // + // Block header 17: Codepoints 0xe9 - 0xe9 + // + 0xe9, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x3c, 0x11, 0x00, 0x00, + + // + // Block header 18: Codepoints 0xf1 - 0xf1 + // + 0xf1, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x54, 0x11, 0x00, 0x00, + + // + // Block header 19: Codepoints 0xf3 - 0xf3 + // + 0xf3, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x70, 0x11, 0x00, 0x00, + + // + // Block header 20: Codepoints 0xf6 - 0xf6 + // + 0xf6, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x88, 0x11, 0x00, 0x00, + + // + // Block header 21: Codepoints 0xfc - 0xfc + // + 0xfc, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa4, 0x11, 0x00, 0x00, + + // + // Block header 22: Codepoints 0x201c - 0x201d + // + 0x1c, 0x20, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xc0, 0x11, 0x00, 0x00, + + // + // Block header 23: Codepoints 0x3001 - 0x3002 + // + 0x01, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xe0, 0x11, 0x00, 0x00, + + // + // Block header 24: Codepoints 0x3042 - 0x3042 + // + 0x42, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x00, + + // + // Block header 25: Codepoints 0x3044 - 0x3044 + // + 0x44, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x28, 0x12, 0x00, 0x00, + + // + // Block header 26: Codepoints 0x3048 - 0x3048 + // + 0x48, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x44, 0x12, 0x00, 0x00, + + // + // Block header 27: Codepoints 0x304c - 0x304d + // + 0x4c, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x60, 0x12, 0x00, 0x00, + + // + // Block header 28: Codepoints 0x304f - 0x3050 + // + 0x4f, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xa4, 0x12, 0x00, 0x00, + + // + // Block header 29: Codepoints 0x3053 - 0x3053 + // + 0x53, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd4, 0x12, 0x00, 0x00, + + // + // Block header 30: Codepoints 0x3055 - 0x3055 + // + 0x55, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe8, 0x12, 0x00, 0x00, + + // + // Block header 31: Codepoints 0x3057 - 0x3059 + // + 0x57, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x04, 0x13, 0x00, 0x00, + + // + // Block header 32: Codepoints 0x305f - 0x3060 + // + 0x5f, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x54, 0x13, 0x00, 0x00, + + // + // Block header 33: Codepoints 0x3066 - 0x3068 + // + 0x66, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x90, 0x13, 0x00, 0x00, + + // + // Block header 34: Codepoints 0x306a - 0x306b + // + 0x6a, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xdc, 0x13, 0x00, 0x00, + + // + // Block header 35: Codepoints 0x306e - 0x306f + // + 0x6e, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x1c, 0x14, 0x00, 0x00, + + // + // Block header 36: Codepoints 0x307e - 0x307e + // + 0x7e, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x6c, 0x14, 0x00, 0x00, + + // + // Block header 37: Codepoints 0x3081 - 0x3081 + // + 0x81, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x88, 0x14, 0x00, 0x00, + + // + // Block header 38: Codepoints 0x3089 - 0x308c + // + 0x89, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, + 0xb4, 0x14, 0x00, 0x00, + + // + // Block header 39: Codepoints 0x3092 - 0x3092 + // + 0x92, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x30, 0x15, 0x00, 0x00, + + // + // Block header 40: Codepoints 0x30a2 - 0x30a4 + // + 0xa2, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x50, 0x15, 0x00, 0x00, + + // + // Block header 41: Codepoints 0x30a6 - 0x30a7 + // + 0xa6, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x94, 0x15, 0x00, 0x00, + + // + // Block header 42: Codepoints 0x30af - 0x30b1 + // + 0xaf, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0xc4, 0x15, 0x00, 0x00, + + // + // Block header 43: Codepoints 0x30b5 - 0x30b5 + // + 0xb5, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x20, 0x16, 0x00, 0x00, + + // + // Block header 44: Codepoints 0x30b7 - 0x30b9 + // + 0xb7, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x40, 0x16, 0x00, 0x00, + + // + // Block header 45: Codepoints 0x30bd - 0x30bd + // + 0xbd, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x90, 0x16, 0x00, 0x00, + + // + // Block header 46: Codepoints 0x30bf - 0x30bf + // + 0xbf, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xac, 0x16, 0x00, 0x00, + + // + // Block header 47: Codepoints 0x30c3 - 0x30c3 + // + 0xc3, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc8, 0x16, 0x00, 0x00, + + // + // Block header 48: Codepoints 0x30c6 - 0x30c6 + // + 0xc6, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe0, 0x16, 0x00, 0x00, + + // + // Block header 49: Codepoints 0x30c8 - 0x30c8 + // + 0xc8, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xfc, 0x16, 0x00, 0x00, + + // + // Block header 50: Codepoints 0x30cd - 0x30cd + // + 0xcd, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x14, 0x17, 0x00, 0x00, + + // + // Block header 51: Codepoints 0x30d1 - 0x30d1 + // + 0xd1, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x30, 0x17, 0x00, 0x00, + + // + // Block header 52: Codepoints 0x30d5 - 0x30d7 + // + 0xd5, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x50, 0x17, 0x00, 0x00, + + // + // Block header 53: Codepoints 0x30dc - 0x30dd + // + 0xdc, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xa0, 0x17, 0x00, 0x00, + + // + // Block header 54: Codepoints 0x30e1 - 0x30e1 + // + 0xe1, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xec, 0x17, 0x00, 0x00, + + // + // Block header 55: Codepoints 0x30e5 - 0x30e7 + // + 0xe5, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x08, 0x18, 0x00, 0x00, + + // + // Block header 56: Codepoints 0x30e9 - 0x30eb + // + 0xe9, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x48, 0x18, 0x00, 0x00, + + // + // Block header 57: Codepoints 0x30f3 - 0x30f3 + // + 0xf3, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa4, 0x18, 0x00, 0x00, + + // + // Block header 58: Codepoints 0x30fc - 0x30fc + // + 0xfc, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xbc, 0x18, 0x00, 0x00, + + // + // Block header 59: Codepoints 0x4e0b - 0x4e0b + // + 0x0b, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xcc, 0x18, 0x00, 0x00, + + // + // Block header 60: Codepoints 0x4e0e - 0x4e0e + // + 0x0e, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe8, 0x18, 0x00, 0x00, + + // + // Block header 61: Codepoints 0x4e2d - 0x4e2d + // + 0x2d, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x04, 0x19, 0x00, 0x00, + + // + // Block header 62: Codepoints 0x4e4b - 0x4e4b + // + 0x4b, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x28, 0x19, 0x00, 0x00, + + // + // Block header 63: Codepoints 0x4ecb - 0x4ecb + // + 0xcb, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x44, 0x19, 0x00, 0x00, + + // + // Block header 64: Codepoints 0x4ee3 - 0x4ee3 + // + 0xe3, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x68, 0x19, 0x00, 0x00, + + // + // Block header 65: Codepoints 0x4ee5 - 0x4ee5 + // + 0xe5, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x94, 0x19, 0x00, 0x00, + + // + // Block header 66: Codepoints 0x4ef6 - 0x4ef6 + // + 0xf6, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc0, 0x19, 0x00, 0x00, + + // + // Block header 67: Codepoints 0x4f1a - 0x4f1a + // + 0x1a, 0x4f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe8, 0x19, 0x00, 0x00, + + // + // Block header 68: Codepoints 0x4f9b - 0x4f9b + // + 0x9b, 0x4f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x08, 0x1a, 0x00, 0x00, + + // + // Block header 69: Codepoints 0x4fe1 - 0x4fe1 + // + 0xe1, 0x4f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x34, 0x1a, 0x00, 0x00, + + // + // Block header 70: Codepoints 0x50cf - 0x50cf + // + 0xcf, 0x50, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x58, 0x1a, 0x00, 0x00, + + // + // Block header 71: Codepoints 0x5141 - 0x5141 + // + 0x41, 0x51, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x8c, 0x1a, 0x00, 0x00, + + // + // Block header 72: Codepoints 0x5207 - 0x5207 + // + 0x07, 0x52, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb4, 0x1a, 0x00, 0x00, + + // + // Block header 73: Codepoints 0x529b - 0x529b + // + 0x9b, 0x52, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe4, 0x1a, 0x00, 0x00, + + // + // Block header 74: Codepoints 0x52a8 - 0x52a8 + // + 0xa8, 0x52, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x08, 0x1b, 0x00, 0x00, + + // + // Block header 75: Codepoints 0x52b9 - 0x52b9 + // + 0xb9, 0x52, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x34, 0x1b, 0x00, 0x00, + + // + // Block header 76: Codepoints 0x52d5 - 0x52d5 + // + 0xd5, 0x52, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x68, 0x1b, 0x00, 0x00, + + // + // Block header 77: Codepoints 0x5373 - 0x5373 + // + 0x73, 0x53, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x98, 0x1b, 0x00, 0x00, + + // + // Block header 78: Codepoints 0x53d6 - 0x53d6 + // + 0xd6, 0x53, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd0, 0x1b, 0x00, 0x00, + + // + // Block header 79: Codepoints 0x53ef - 0x53ef + // + 0xef, 0x53, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x00, 0x00, + + // + // Block header 80: Codepoints 0x540e - 0x540e + // + 0x0e, 0x54, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x24, 0x1c, 0x00, 0x00, + + // + // Block header 81: Codepoints 0x548c - 0x548c + // + 0x8c, 0x54, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x48, 0x1c, 0x00, 0x00, + + // + // Block header 82: Codepoints 0x54cd - 0x54cd + // + 0xcd, 0x54, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x74, 0x1c, 0x00, 0x00, + + // + // Block header 83: Codepoints 0x56fd - 0x56fe + // + 0xfd, 0x56, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xac, 0x1c, 0x00, 0x00, + + // + // Block header 84: Codepoints 0x5728 - 0x5728 + // + 0x28, 0x57, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x00, 0x1d, 0x00, 0x00, + + // + // Block header 85: Codepoints 0x5831 - 0x5831 + // + 0x31, 0x58, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x24, 0x1d, 0x00, 0x00, + + // + // Block header 86: Codepoints 0x5b9a - 0x5b9a + // + 0x9a, 0x5b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x54, 0x1d, 0x00, 0x00, + + // + // Block header 87: Codepoints 0x5b9e - 0x5b9e + // + 0x9e, 0x5b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x78, 0x1d, 0x00, 0x00, + + // + // Block header 88: Codepoints 0x5c06 - 0x5c06 + // + 0x06, 0x5c, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x9c, 0x1d, 0x00, 0x00, + + // + // Block header 89: Codepoints 0x5c4f - 0x5c4f + // + 0x4f, 0x5c, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xcc, 0x1d, 0x00, 0x00, + + // + // Block header 90: Codepoints 0x5e55 - 0x5e55 + // + 0x55, 0x5e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf4, 0x1d, 0x00, 0x00, + + // + // Block header 91: Codepoints 0x5e8f - 0x5e8f + // + 0x8f, 0x5e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x18, 0x1e, 0x00, 0x00, + + // + // Block header 92: Codepoints 0x5e93 - 0x5e95 + // + 0x93, 0x5e, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x40, 0x1e, 0x00, 0x00, + + // + // Block header 93: Codepoints 0x5f62 - 0x5f62 + // + 0x62, 0x5f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc0, 0x1e, 0x00, 0x00, + + // + // Block header 94: Codepoints 0x5f71 - 0x5f71 + // + 0x71, 0x5f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf0, 0x1e, 0x00, 0x00, + + // + // Block header 95: Codepoints 0x5f8c - 0x5f8c + // + 0x8c, 0x5f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x1c, 0x1f, 0x00, 0x00, + + // + // Block header 96: Codepoints 0x606f - 0x606f + // + 0x6f, 0x60, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x4c, 0x1f, 0x00, 0x00, + + // + // Block header 97: Codepoints 0x60a8 - 0x60a8 + // + 0xa8, 0x60, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x78, 0x1f, 0x00, 0x00, + + // + // Block header 98: Codepoints 0x60c5 - 0x60c5 + // + 0xc5, 0x60, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb0, 0x1f, 0x00, 0x00, + + // + // Block header 99: Codepoints 0x6210 - 0x6210 + // + 0x10, 0x62, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe0, 0x1f, 0x00, 0x00, + + // + // Block header 100: Codepoints 0x62bc - 0x62bc + // + 0xbc, 0x62, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x10, 0x20, 0x00, 0x00, + + // + // Block header 101: Codepoints 0x6301 - 0x6301 + // + 0x01, 0x63, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x40, 0x20, 0x00, 0x00, + + // + // Block header 102: Codepoints 0x6309 - 0x6309 + // + 0x09, 0x63, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x68, 0x20, 0x00, 0x00, + + // + // Block header 103: Codepoints 0x6362 - 0x6362 + // + 0x62, 0x63, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x94, 0x20, 0x00, 0x00, + + // + // Block header 104: Codepoints 0x63d0 - 0x63d0 + // + 0xd0, 0x63, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc4, 0x20, 0x00, 0x00, + + // + // Block header 105: Codepoints 0x63db - 0x63db + // + 0xdb, 0x63, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf0, 0x20, 0x00, 0x00, + + // + // Block header 106: Codepoints 0x652f - 0x652f + // + 0x2f, 0x65, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x20, 0x21, 0x00, 0x00, + + // + // Block header 107: Codepoints 0x65b0 - 0x65b0 + // + 0xb0, 0x65, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x40, 0x21, 0x00, 0x00, + + // + // Block header 108: Codepoints 0x65e5 - 0x65e5 + // + 0xe5, 0x65, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x70, 0x21, 0x00, 0x00, + + // + // Block header 109: Codepoints 0x6620 - 0x6620 + // + 0x20, 0x66, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x90, 0x21, 0x00, 0x00, + + // + // Block header 110: Codepoints 0x662f - 0x662f + // + 0x2f, 0x66, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc4, 0x21, 0x00, 0x00, + + // + // Block header 111: Codepoints 0x66f4 - 0x66f4 + // + 0xf4, 0x66, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe4, 0x21, 0x00, 0x00, + + // + // Block header 112: Codepoints 0x66ff - 0x66ff + // + 0xff, 0x66, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x04, 0x22, 0x00, 0x00, + + // + // Block header 113: Codepoints 0x672c - 0x672c + // + 0x2c, 0x67, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x2c, 0x22, 0x00, 0x00, + + // + // Block header 114: Codepoints 0x677f - 0x677f + // + 0x7f, 0x67, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x50, 0x22, 0x00, 0x00, + + // + // Block header 115: Codepoints 0x679c - 0x679c + // + 0x9c, 0x67, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x80, 0x22, 0x00, 0x00, + + // + // Block header 116: Codepoints 0x69cb - 0x69cb + // + 0xcb, 0x69, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa4, 0x22, 0x00, 0x00, + + // + // Block header 117: Codepoints 0x6a5f - 0x6a5f + // + 0x5f, 0x6a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd4, 0x22, 0x00, 0x00, + + // + // Block header 118: Codepoints 0x6b21 - 0x6b21 + // + 0x21, 0x6b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x14, 0x23, 0x00, 0x00, + + // + // Block header 119: Codepoints 0x6b64 - 0x6b64 + // + 0x64, 0x6b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x40, 0x23, 0x00, 0x00, + + // + // Block header 120: Codepoints 0x6f14 - 0x6f14 + // + 0x14, 0x6f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x70, 0x23, 0x00, 0x00, + + // + // Block header 121: Codepoints 0x73b0 - 0x73b0 + // + 0xb0, 0x73, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x9c, 0x23, 0x00, 0x00, + + // + // Block header 122: Codepoints 0x7528 - 0x7528 + // + 0x28, 0x75, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd0, 0x23, 0x00, 0x00, + + // + // Block header 123: Codepoints 0x753b - 0x753b + // + 0x3b, 0x75, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xfc, 0x23, 0x00, 0x00, + + // + // Block header 124: Codepoints 0x7684 - 0x7684 + // + 0x84, 0x76, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x28, 0x24, 0x00, 0x00, + + // + // Block header 125: Codepoints 0x793a - 0x793a + // + 0x3a, 0x79, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x58, 0x24, 0x00, 0x00, + + // + // Block header 126: Codepoints 0x79fb - 0x79fb + // + 0xfb, 0x79, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x7c, 0x24, 0x00, 0x00, + + // + // Block header 127: Codepoints 0x7a0b - 0x7a0b + // + 0x0b, 0x7a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xac, 0x24, 0x00, 0x00, + + // + // Block header 128: Codepoints 0x7acb - 0x7acb + // + 0xcb, 0x7a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd4, 0x24, 0x00, 0x00, + + // + // Block header 129: Codepoints 0x7b80 - 0x7b80 + // + 0x80, 0x7b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf4, 0x24, 0x00, 0x00, + + // + // Block header 130: Codepoints 0x7f6e - 0x7f6e + // + 0x6e, 0x7f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x24, 0x25, 0x00, 0x00, + + // + // Block header 131: Codepoints 0x80fd - 0x80fd + // + 0xfd, 0x80, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x40, 0x25, 0x00, 0x00, + + // + // Block header 132: Codepoints 0x898b - 0x898b + // + 0x8b, 0x89, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x74, 0x25, 0x00, 0x00, + + // + // Block header 133: Codepoints 0x89c1 - 0x89c1 + // + 0xc1, 0x89, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x98, 0x25, 0x00, 0x00, + + // + // Block header 134: Codepoints 0x8a00 - 0x8a00 + // + 0x00, 0x8a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc8, 0x25, 0x00, 0x00, + + // + // Block header 135: Codepoints 0x8a2d - 0x8a2d + // + 0x2d, 0x8a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe4, 0x25, 0x00, 0x00, + + // + // Block header 136: Codepoints 0x8a9e - 0x8a9e + // + 0x9e, 0x8a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x10, 0x26, 0x00, 0x00, + + // + // Block header 137: Codepoints 0x8bb8 - 0x8bb8 + // + 0xb8, 0x8b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x38, 0x26, 0x00, 0x00, + + // + // Block header 138: Codepoints 0x8bbe - 0x8bbe + // + 0xbe, 0x8b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x5c, 0x26, 0x00, 0x00, + + // + // Block header 139: Codepoints 0x8bed - 0x8bed + // + 0xed, 0x8b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x88, 0x26, 0x00, 0x00, + + // + // Block header 140: Codepoints 0x8f6f - 0x8f6f + // + 0x6f, 0x8f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb0, 0x26, 0x00, 0x00, + + // + // Block header 141: Codepoints 0x90e8 - 0x90e8 + // + 0xe8, 0x90, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xdc, 0x26, 0x00, 0x00, + + // + // Block header 142: Codepoints 0x914d - 0x914d + // + 0x4d, 0x91, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x10, 0x27, 0x00, 0x00, + + // + // Block header 143: Codepoints 0x94ae - 0x94ae + // + 0xae, 0x94, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x44, 0x27, 0x00, 0x00, + + // + // Block header 144: Codepoints 0x9593 - 0x9593 + // + 0x93, 0x95, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x70, 0x27, 0x00, 0x00, + + // + // Block header 145: Codepoints 0x95ea - 0x95ea + // + 0xea, 0x95, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa0, 0x27, 0x00, 0x00, + + // + // Block header 146: Codepoints 0x95f4 - 0x95f4 + // + 0xf4, 0x95, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd0, 0x27, 0x00, 0x00, + + // + // Block header 147: Codepoints 0x9762 - 0x9762 + // + 0x62, 0x97, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x00, 0x28, 0x00, 0x00, + + // + // Block header 148: Codepoints 0xac00 - 0xac00 + // + 0x00, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x2c, 0x28, 0x00, 0x00, + + // + // Block header 149: Codepoints 0xac19 - 0xac19 + // + 0x19, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x4c, 0x28, 0x00, 0x00, + + // + // Block header 150: Codepoints 0xac1c - 0xac1c + // + 0x1c, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x68, 0x28, 0x00, 0x00, + + // + // Block header 151: Codepoints 0xac83 - 0xac83 + // + 0x83, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x94, 0x28, 0x00, 0x00, + + // + // Block header 152: Codepoints 0xac8c - 0xac8c + // + 0x8c, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb8, 0x28, 0x00, 0x00, + + // + // Block header 153: Codepoints 0xacf5 - 0xacf5 + // + 0xf5, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe0, 0x28, 0x00, 0x00, + + // + // Block header 154: Codepoints 0xacfc - 0xacfc + // + 0xfc, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xfc, 0x28, 0x00, 0x00, + + // + // Block header 155: Codepoints 0xad6c - 0xad6d + // + 0x6c, 0xad, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x1c, 0x29, 0x00, 0x00, + + // + // Block header 156: Codepoints 0xadf8 - 0xadf8 + // + 0xf8, 0xad, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x48, 0x29, 0x00, 0x00, + + // + // Block header 157: Codepoints 0xae30 - 0xae30 + // + 0x30, 0xae, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x5c, 0x29, 0x00, 0x00, + + // + // Block header 158: Codepoints 0xaed8 - 0xaed8 + // + 0xd8, 0xae, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x7c, 0x29, 0x00, 0x00, + + // + // Block header 159: Codepoints 0xb110 - 0xb110 + // + 0x10, 0xb1, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb0, 0x29, 0x00, 0x00, + + // + // Block header 160: Codepoints 0xb204 - 0xb204 + // + 0x04, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xcc, 0x29, 0x00, 0x00, + + // + // Block header 161: Codepoints 0xb20c - 0xb20c + // + 0x0c, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe4, 0x29, 0x00, 0x00, + + // + // Block header 162: Codepoints 0xb294 - 0xb294 + // + 0x94, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xfc, 0x29, 0x00, 0x00, + + // + // Block header 163: Codepoints 0xb2a5 - 0xb2a5 + // + 0xa5, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x14, 0x2a, 0x00, 0x00, + + // + // Block header 164: Codepoints 0xb2c8 - 0xb2c8 + // + 0xc8, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x30, 0x2a, 0x00, 0x00, + + // + // Block header 165: Codepoints 0xb2e4 - 0xb2e4 + // + 0xe4, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x50, 0x2a, 0x00, 0x00, + + // + // Block header 166: Codepoints 0xb2e8 - 0xb2e8 + // + 0xe8, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x70, 0x2a, 0x00, 0x00, + + // + // Block header 167: Codepoints 0xb300 - 0xb300 + // + 0x00, 0xb3, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x90, 0x2a, 0x00, 0x00, + + // + // Block header 168: Codepoints 0xb370 - 0xb370 + // + 0x70, 0xb3, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb8, 0x2a, 0x00, 0x00, + + // + // Block header 169: Codepoints 0xb3d9 - 0xb3d9 + // + 0xd9, 0xb3, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe4, 0x2a, 0x00, 0x00, + + // + // Block header 170: Codepoints 0xb418 - 0xb418 + // + 0x18, 0xb4, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x00, 0x2b, 0x00, 0x00, + + // + // Block header 171: Codepoints 0xb77c - 0xb77c + // + 0x7c, 0xb7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x20, 0x2b, 0x00, 0x00, + + // + // Block header 172: Codepoints 0xb798 - 0xb798 + // + 0x98, 0xb7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x40, 0x2b, 0x00, 0x00, + + // + // Block header 173: Codepoints 0xb7a8 - 0xb7a8 + // + 0xa8, 0xb7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x6c, 0x2b, 0x00, 0x00, + + // + // Block header 174: Codepoints 0xb7ec - 0xb7ec + // + 0xec, 0xb7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x94, 0x2b, 0x00, 0x00, + + // + // Block header 175: Codepoints 0xb85c - 0xb85c + // + 0x5c, 0xb8, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb4, 0x2b, 0x00, 0x00, + + // + // Block header 176: Codepoints 0xb86d - 0xb86d + // + 0x6d, 0xb8, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xcc, 0x2b, 0x00, 0x00, + + // + // Block header 177: Codepoints 0xb974 - 0xb974 + // + 0x74, 0xb9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe4, 0x2b, 0x00, 0x00, + + // + // Block header 178: Codepoints 0xb97c - 0xb97c + // + 0x7c, 0xb9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf8, 0x2b, 0x00, 0x00, + + // + // Block header 179: Codepoints 0xb9ac - 0xb9ac + // + 0xac, 0xb9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x10, 0x2c, 0x00, 0x00, + + // + // Block header 180: Codepoints 0xb9cc - 0xb9cc + // + 0xcc, 0xb9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x30, 0x2c, 0x00, 0x00, + + // + // Block header 181: Codepoints 0xba70 - 0xba70 + // + 0x70, 0xba, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x54, 0x2c, 0x00, 0x00, + + // + // Block header 182: Codepoints 0xba74 - 0xba74 + // + 0x74, 0xba, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x74, 0x2c, 0x00, 0x00, + + // + // Block header 183: Codepoints 0xbbf8 - 0xbbf8 + // + 0xf8, 0xbb, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x94, 0x2c, 0x00, 0x00, + + // + // Block header 184: Codepoints 0xbc84 - 0xbc84 + // + 0x84, 0xbc, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb8, 0x2c, 0x00, 0x00, + + // + // Block header 185: Codepoints 0xbcf4 - 0xbcf4 + // + 0xf4, 0xbc, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd8, 0x2c, 0x00, 0x00, + + // + // Block header 186: Codepoints 0xbe0c - 0xbe0c + // + 0x0c, 0xbe, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf4, 0x2c, 0x00, 0x00, + + // + // Block header 187: Codepoints 0xc0ac - 0xc0ac + // + 0xac, 0xc0, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x10, 0x2d, 0x00, 0x00, + + // + // Block header 188: Codepoints 0xc0c8 - 0xc0c8 + // + 0xc8, 0xc0, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x34, 0x2d, 0x00, 0x00, + + // + // Block header 189: Codepoints 0xc124 - 0xc124 + // + 0x24, 0xc1, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x60, 0x2d, 0x00, 0x00, + + // + // Block header 190: Codepoints 0xc131 - 0xc131 + // + 0x31, 0xc1, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x80, 0x2d, 0x00, 0x00, + + // + // Block header 191: Codepoints 0xc18c - 0xc18c + // + 0x8c, 0xc1, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa4, 0x2d, 0x00, 0x00, + + // + // Block header 192: Codepoints 0xc218 - 0xc218 + // + 0x18, 0xc2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xbc, 0x2d, 0x00, 0x00, + + // + // Block header 193: Codepoints 0xc2dc - 0xc2dc + // + 0xdc, 0xc2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd8, 0x2d, 0x00, 0x00, + + // + // Block header 194: Codepoints 0xc2ed - 0xc2ed + // + 0xed, 0xc2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xfc, 0x2d, 0x00, 0x00, + + // + // Block header 195: Codepoints 0xc5b4 - 0xc5b4 + // + 0xb4, 0xc5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x20, 0x2e, 0x00, 0x00, + + // + // Block header 196: Codepoints 0xc5b8 - 0xc5b8 + // + 0xb8, 0xc5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x40, 0x2e, 0x00, 0x00, + + // + // Block header 197: Codepoints 0xc5c5 - 0xc5c5 + // + 0xc5, 0xc5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x64, 0x2e, 0x00, 0x00, + + // + // Block header 198: Codepoints 0xc5c8 - 0xc5c8 + // + 0xc8, 0xc5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x88, 0x2e, 0x00, 0x00, + + // + // Block header 199: Codepoints 0xc5d0 - 0xc5d0 + // + 0xd0, 0xc5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb0, 0x2e, 0x00, 0x00, + + // + // Block header 200: Codepoints 0xc5ec - 0xc5ec + // + 0xec, 0xc5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe0, 0x2e, 0x00, 0x00, + + // + // Block header 201: Codepoints 0xc624 - 0xc624 + // + 0x24, 0xc6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x00, 0x2f, 0x00, 0x00, + + // + // Block header 202: Codepoints 0xc640 - 0xc640 + // + 0x40, 0xc6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x1c, 0x2f, 0x00, 0x00, + + // + // Block header 203: Codepoints 0xc6a9 - 0xc6a9 + // + 0xa9, 0xc6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x40, 0x2f, 0x00, 0x00, + + // + // Block header 204: Codepoints 0xc6d0 - 0xc6d0 + // + 0xd0, 0xc6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x60, 0x2f, 0x00, 0x00, + + // + // Block header 205: Codepoints 0xc6e8 - 0xc6e8 + // + 0xe8, 0xc6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x84, 0x2f, 0x00, 0x00, + + // + // Block header 206: Codepoints 0xc720 - 0xc720 + // + 0x20, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb8, 0x2f, 0x00, 0x00, + + // + // Block header 207: Codepoints 0xc73c - 0xc73c + // + 0x3c, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd8, 0x2f, 0x00, 0x00, + + // + // Block header 208: Codepoints 0xc740 - 0xc740 + // + 0x40, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf4, 0x2f, 0x00, 0x00, + + // + // Block header 209: Codepoints 0xc744 - 0xc744 + // + 0x44, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x10, 0x30, 0x00, 0x00, + + // + // Block header 210: Codepoints 0xc74c - 0xc74c + // + 0x4c, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x2c, 0x30, 0x00, 0x00, + + // + // Block header 211: Codepoints 0xc751 - 0xc751 + // + 0x51, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x48, 0x30, 0x00, 0x00, + + // + // Block header 212: Codepoints 0xc758 - 0xc758 + // + 0x58, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x68, 0x30, 0x00, 0x00, + + // + // Block header 213: Codepoints 0xc774 - 0xc774 + // + 0x74, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x8c, 0x30, 0x00, 0x00, + + // + // Block header 214: Codepoints 0xc785 - 0xc785 + // + 0x85, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb0, 0x30, 0x00, 0x00, + + // + // Block header 215: Codepoints 0xc788 - 0xc788 + // + 0x88, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd4, 0x30, 0x00, 0x00, + + // + // Block header 216: Codepoints 0xc804 - 0xc804 + // + 0x04, 0xc8, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xfc, 0x30, 0x00, 0x00, + + // + // Block header 217: Codepoints 0xc815 - 0xc815 + // + 0x15, 0xc8, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x1c, 0x31, 0x00, 0x00, + + // + // Block header 218: Codepoints 0xc81c - 0xc81c + // + 0x1c, 0xc8, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x40, 0x31, 0x00, 0x00, + + // + // Block header 219: Codepoints 0xc904 - 0xc904 + // + 0x04, 0xc9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x6c, 0x31, 0x00, 0x00, + + // + // Block header 220: Codepoints 0xc90d - 0xc90d + // + 0x0d, 0xc9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x84, 0x31, 0x00, 0x00, + + // + // Block header 221: Codepoints 0xc989 - 0xc989 + // + 0x89, 0xc9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa0, 0x31, 0x00, 0x00, + + // + // Block header 222: Codepoints 0xc9c0 - 0xc9c0 + // + 0xc0, 0xc9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb8, 0x31, 0x00, 0x00, + + // + // Block header 223: Codepoints 0xccb4 - 0xccb4 + // + 0xb4, 0xcc, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd8, 0x31, 0x00, 0x00, + + // + // Block header 224: Codepoints 0xd2b8 - 0xd2b8 + // + 0xb8, 0xd2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x04, 0x32, 0x00, 0x00, + + // + // Block header 225: Codepoints 0xd2bc - 0xd2bc + // + 0xbc, 0xd2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x18, 0x32, 0x00, 0x00, + + // + // Block header 226: Codepoints 0xd2f0 - 0xd2f0 + // + 0xf0, 0xd2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x30, 0x32, 0x00, 0x00, + + // + // Block header 227: Codepoints 0xd2f8 - 0xd2f8 + // + 0xf8, 0xd2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x50, 0x32, 0x00, 0x00, + + // + // Block header 228: Codepoints 0xd328 - 0xd328 + // + 0x28, 0xd3, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x6c, 0x32, 0x00, 0x00, + + // + // Block header 229: Codepoints 0xd504 - 0xd504 + // + 0x04, 0xd5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x98, 0x32, 0x00, 0x00, + + // + // Block header 230: Codepoints 0xd53d - 0xd53d + // + 0x3d, 0xd5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb0, 0x32, 0x00, 0x00, + + // + // Block header 231: Codepoints 0xd558 - 0xd558 + // + 0x58, 0xd5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd0, 0x32, 0x00, 0x00, + + // + // Block header 232: Codepoints 0xd55c - 0xd55c + // + 0x5c, 0xd5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf4, 0x32, 0x00, 0x00, + + // + // Block header 233: Codepoints 0xd560 - 0xd560 + // + 0x60, 0xd5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x18, 0x33, 0x00, 0x00, + + // + // Block header 234: Codepoints 0xd568 - 0xd568 + // + 0x68, 0xd5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x3c, 0x33, 0x00, 0x00, + + // + // Block header 235: Codepoints 0xd654 - 0xd654 + // + 0x54, 0xd6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x60, 0x33, 0x00, 0x00, + + // + // Block header 236: Codepoints 0xd658 - 0xd658 + // + 0x58, 0xd6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x84, 0x33, 0x00, 0x00, + + // + // Block header 237: Codepoints 0xd6a8 - 0xd6a8 + // + 0xa8, 0xd6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa8, 0x33, 0x00, 0x00, + + // + // Block header 238: Codepoints 0xd6c4 - 0xd6c4 + // + 0xc4, 0xd6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc4, 0x33, 0x00, 0x00, + + // + // Block header 239: Codepoints 0xff0c - 0xff0c + // + 0x0c, 0xff, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe0, 0x33, 0x00, 0x00, + + // + // Block header 240: Codepoints 0xff1a - 0xff1a + // + 0x1a, 0xff, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf0, 0x33, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x20 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 0 Data: Codepoints 0x20 - 0x20 + // + 4, 6, 0, 12, + // + // Block 1 Offsets: Codepoints 0x27 - 0x27 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 1 Data: Codepoints 0x27 - 0x27 + // + 7, 2, 65, 17, 17, 240, 128, + 0, // Padding + + // + // Block 2 Offsets: Codepoints 0x2b - 0x2e + // + 0x10, 0x00, 0x00, 0x00, // Offset 16 (0x10) + 0x1d, 0x00, 0x00, 0x00, // Offset 29 (0x1d) + 0x25, 0x00, 0x00, 0x00, // Offset 37 (0x25) + 0x2d, 0x00, 0x00, 0x00, // Offset 45 (0x2d) + + // + // Block 2 Data: Codepoints 0x2b - 0x2e + // + 13, 7, 240, 240, 129, 97, 54, 65, 97, 97, 240, 240, + 128, 8, 3, 240, 240, 50, 33, 17, 128, 8, 6, 0, + 6, 5, 240, 240, 208, 7, 3, 240, 240, 50, 18, 160, + // + // Block 3 Offsets: Codepoints 0x30 - 0x3a + // + 0x2c, 0x00, 0x00, 0x00, // Offset 44 (0x2c) + 0x43, 0x00, 0x00, 0x00, // Offset 67 (0x43) + 0x52, 0x00, 0x00, 0x00, // Offset 82 (0x52) + 0x62, 0x00, 0x00, 0x00, // Offset 98 (0x62) + 0x72, 0x00, 0x00, 0x00, // Offset 114 (0x72) + 0x85, 0x00, 0x00, 0x00, // Offset 133 (0x85) + 0x94, 0x00, 0x00, 0x00, // Offset 148 (0x94) + 0xa8, 0x00, 0x00, 0x00, // Offset 168 (0xa8) + 0xb7, 0x00, 0x00, 0x00, // Offset 183 (0xb7) + 0xcd, 0x00, 0x00, 0x00, // Offset 205 (0xcd) + 0xe1, 0x00, 0x00, 0x00, // Offset 225 (0xe1) + + // + // Block 3 Data: Codepoints 0x30 - 0x3a + // + 23, 8, 240, 179, 65, 49, 33, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 17, 81, 33, 49, 67, 240, 192, 15, + 7, 240, 114, 67, 97, 97, 97, 97, 97, 97, 97, 70, + 240, 112, 16, 8, 240, 164, 49, 50, 113, 113, 98, 97, + 97, 98, 82, 87, 240, 160, 16, 7, 240, 116, 113, 97, + 82, 50, 114, 97, 97, 17, 50, 35, 240, 144, 19, 8, + 240, 225, 98, 81, 17, 65, 33, 50, 33, 34, 49, 39, + 97, 113, 113, 240, 176, 15, 7, 240, 102, 17, 97, 97, + 100, 114, 97, 97, 82, 20, 240, 144, 20, 8, 240, 181, + 33, 113, 97, 113, 20, 34, 50, 17, 81, 17, 81, 33, + 50, 51, 240, 192, 15, 8, 240, 151, 98, 82, 97, 98, + 97, 98, 97, 113, 98, 240, 224, 22, 8, 240, 179, 65, + 49, 49, 49, 49, 49, 67, 65, 49, 33, 81, 17, 81, + 18, 50, 51, 240, 192, 20, 8, 240, 179, 50, 49, 33, + 81, 17, 81, 18, 50, 36, 17, 113, 97, 113, 37, 240, + 192, 8, 3, 240, 98, 18, 114, 18, 160, + 0, 0, 0, // Padding + + // + // Block 4 Offsets: Codepoints 0x41 - 0x47 + // + 0x1c, 0x00, 0x00, 0x00, // Offset 28 (0x1c) + 0x34, 0x00, 0x00, 0x00, // Offset 52 (0x34) + 0x4a, 0x00, 0x00, 0x00, // Offset 74 (0x4a) + 0x5b, 0x00, 0x00, 0x00, // Offset 91 (0x5b) + 0x73, 0x00, 0x00, 0x00, // Offset 115 (0x73) + 0x82, 0x00, 0x00, 0x00, // Offset 130 (0x82) + 0x91, 0x00, 0x00, 0x00, // Offset 145 (0x91) + + // + // Block 4 Data: Codepoints 0x41 - 0x47 + // + 24, 10, 240, 240, 66, 115, 113, 17, 113, 33, 82, 33, + 81, 49, 86, 49, 81, 49, 81, 34, 97, 240, 240, 16, + 22, 7, 240, 101, 33, 65, 17, 65, 17, 50, 21, 33, + 50, 17, 65, 17, 65, 17, 50, 21, 240, 128, 17, 8, + 240, 181, 34, 49, 33, 97, 113, 113, 113, 114, 114, 49, + 53, 240, 160, 24, 9, 240, 198, 49, 66, 33, 82, 17, + 97, 17, 97, 17, 97, 17, 97, 17, 81, 33, 66, 37, + 240, 240, 16, 15, 7, 240, 101, 33, 97, 97, 101, 33, + 97, 97, 97, 102, 240, 112, 15, 7, 240, 102, 17, 97, + 97, 101, 33, 97, 97, 97, 97, 240, 192, 20, 9, 240, + 244, 50, 65, 33, 113, 129, 129, 52, 17, 97, 18, 81, + 34, 65, 53, 240, 224, + 0, 0, 0, // Padding + + // + // Block 5 Offsets: Codepoints 0x49 - 0x49 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 5 Data: Codepoints 0x49 - 0x49 + // + 15, 6, 240, 53, 49, 81, 81, 81, 81, 81, 81, 81, + 53, 240, 64, + 0, // Padding + + // + // Block 6 Offsets: Codepoints 0x4b - 0x55 + // + 0x2c, 0x00, 0x00, 0x00, // Offset 44 (0x2c) + 0x43, 0x00, 0x00, 0x00, // Offset 67 (0x43) + 0x52, 0x00, 0x00, 0x00, // Offset 82 (0x52) + 0x79, 0x00, 0x00, 0x00, // Offset 121 (0x79) + 0x96, 0x00, 0x00, 0x00, // Offset 150 (0x96) + 0xad, 0x00, 0x00, 0x00, // Offset 173 (0xad) + 0xc0, 0x00, 0x00, 0x00, // Offset 192 (0xc0) + 0xd9, 0x00, 0x00, 0x00, // Offset 217 (0xd9) + 0xf0, 0x00, 0x00, 0x00, // Offset 240 (0xf0) + 0x01, 0x01, 0x00, 0x00, // Offset 257 (0x101) + 0x10, 0x01, 0x00, 0x00, // Offset 272 (0x110) + + // + // Block 6 Data: Codepoints 0x4b - 0x55 + // + 23, 7, 240, 97, 50, 17, 49, 33, 33, 49, 17, 67, + 67, 65, 18, 49, 34, 33, 50, 17, 65, 240, 112, 15, + 7, 240, 97, 97, 97, 97, 97, 97, 97, 97, 97, 102, + 240, 112, 39, 10, 240, 242, 82, 18, 82, 18, 82, 17, + 17, 49, 17, 17, 17, 49, 17, 17, 17, 49, 17, 17, + 33, 17, 33, 17, 33, 17, 33, 17, 33, 17, 33, 17, + 49, 49, 240, 240, 16, 29, 9, 240, 193, 97, 18, 81, + 19, 65, 17, 18, 49, 17, 33, 49, 17, 49, 33, 17, + 50, 17, 17, 67, 17, 82, 17, 97, 240, 208, 23, 9, + 240, 228, 65, 65, 49, 66, 17, 97, 17, 97, 17, 97, + 17, 97, 18, 65, 49, 65, 68, 240, 240, 19, 7, 240, + 101, 33, 50, 17, 65, 17, 65, 17, 50, 21, 33, 97, + 97, 97, 240, 192, 25, 10, 240, 240, 36, 81, 65, 65, + 66, 33, 97, 33, 97, 33, 97, 33, 97, 34, 66, 49, + 65, 85, 147, 240, 96, 23, 8, 240, 149, 49, 50, 33, + 65, 33, 65, 33, 50, 37, 49, 33, 65, 49, 49, 50, + 33, 66, 240, 160, 17, 7, 240, 117, 17, 65, 17, 98, + 99, 99, 97, 97, 17, 50, 21, 240, 128, 15, 8, 240, + 151, 65, 113, 113, 113, 113, 113, 113, 113, 113, 240, 208, + 24, 8, 240, 145, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 18, 50, 37, 240, 176, + // + // Block 7 Offsets: Codepoints 0x57 - 0x57 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 7 Data: Codepoints 0x57 - 0x57 + // + 37, 15, 240, 240, 242, 66, 66, 33, 66, 65, 49, 66, + 65, 50, 36, 34, 65, 33, 33, 33, 81, 33, 33, 33, + 81, 33, 34, 17, 83, 67, 98, 66, 114, 66, 0, 6, + 16, + 0, 0, 0, // Padding + + // + // Block 8 Offsets: Codepoints 0x59 - 0x59 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 8 Data: Codepoints 0x59 - 0x59 + // + 19, 8, 240, 145, 81, 18, 50, 33, 49, 65, 17, 83, + 97, 113, 113, 113, 113, 240, 208, + 0, // Padding + + // + // Block 9 Offsets: Codepoints 0x5b - 0x5b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 9 Data: Codepoints 0x5b - 0x5b + // + 16, 4, 131, 17, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 51, + // + // Block 10 Offsets: Codepoints 0x5d - 0x5d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 10 Data: Codepoints 0x5d - 0x5d + // + 16, 4, 131, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 19, + // + // Block 11 Offsets: Codepoints 0x5f - 0x5f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 11 Data: Codepoints 0x5f - 0x5f + // + 6, 10, 0, 17, 73, 176, + 0, 0, // Padding + + // + // Block 12 Offsets: Codepoints 0x61 - 0x69 + // + 0x24, 0x00, 0x00, 0x00, // Offset 36 (0x24) + 0x37, 0x00, 0x00, 0x00, // Offset 55 (0x37) + 0x4c, 0x00, 0x00, 0x00, // Offset 76 (0x4c) + 0x59, 0x00, 0x00, 0x00, // Offset 89 (0x59) + 0x6f, 0x00, 0x00, 0x00, // Offset 111 (0x6f) + 0x7e, 0x00, 0x00, 0x00, // Offset 126 (0x7e) + 0x8d, 0x00, 0x00, 0x00, // Offset 141 (0x8d) + 0xa2, 0x00, 0x00, 0x00, // Offset 162 (0xa2) + 0xb8, 0x00, 0x00, 0x00, // Offset 184 (0xb8) + + // + // Block 12 Data: Codepoints 0x61 - 0x69 + // + 19, 7, 240, 240, 228, 33, 49, 17, 65, 17, 65, 17, + 65, 17, 50, 35, 17, 240, 112, 21, 7, 225, 97, 97, + 97, 97, 19, 34, 34, 17, 65, 17, 65, 17, 65, 17, + 49, 37, 240, 128, 13, 6, 240, 240, 131, 33, 65, 81, + 81, 82, 84, 240, 64, 22, 7, 240, 65, 97, 97, 97, + 52, 33, 49, 17, 65, 17, 65, 17, 65, 18, 34, 35, + 17, 240, 112, 15, 7, 240, 240, 212, 34, 33, 33, 65, + 22, 17, 98, 101, 240, 112, 15, 6, 227, 33, 81, 81, + 68, 49, 81, 81, 81, 81, 81, 240, 112, 21, 7, 240, + 240, 228, 33, 49, 17, 65, 17, 65, 17, 65, 17, 50, + 35, 17, 97, 82, 36, 32, 22, 7, 225, 97, 97, 97, + 97, 19, 34, 49, 17, 65, 17, 65, 17, 65, 17, 65, + 17, 65, 240, 112, 12, 3, 146, 18, 65, 33, 33, 33, + 33, 33, 33, 176, + // + // Block 13 Offsets: Codepoints 0x6b - 0x77 + // + 0x34, 0x00, 0x00, 0x00, // Offset 52 (0x34) + 0x48, 0x00, 0x00, 0x00, // Offset 72 (0x48) + 0x56, 0x00, 0x00, 0x00, // Offset 86 (0x56) + 0x70, 0x00, 0x00, 0x00, // Offset 112 (0x70) + 0x84, 0x00, 0x00, 0x00, // Offset 132 (0x84) + 0x96, 0x00, 0x00, 0x00, // Offset 150 (0x96) + 0xab, 0x00, 0x00, 0x00, // Offset 171 (0xab) + 0xbf, 0x00, 0x00, 0x00, // Offset 191 (0xbf) + 0xce, 0x00, 0x00, 0x00, // Offset 206 (0xce) + 0xdc, 0x00, 0x00, 0x00, // Offset 220 (0xdc) + 0xea, 0x00, 0x00, 0x00, // Offset 234 (0xea) + 0xfe, 0x00, 0x00, 0x00, // Offset 254 (0xfe) + 0x10, 0x01, 0x00, 0x00, // Offset 272 (0x110) + + // + // Block 13 Data: Codepoints 0x6b - 0x77 + // + 20, 6, 193, 81, 81, 81, 81, 34, 17, 18, 35, 50, + 65, 17, 49, 33, 33, 49, 240, 64, 14, 2, 65, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 112, 26, 10, + 0, 7, 72, 34, 34, 33, 17, 49, 49, 17, 49, 49, + 17, 49, 49, 17, 49, 49, 17, 49, 49, 240, 240, 16, + 20, 7, 240, 240, 193, 19, 34, 49, 17, 65, 17, 65, + 17, 65, 17, 65, 17, 65, 240, 112, 18, 7, 240, 240, + 212, 34, 34, 17, 65, 17, 65, 17, 65, 18, 34, 36, + 240, 128, 21, 7, 240, 240, 193, 19, 34, 34, 17, 65, + 17, 65, 17, 65, 17, 49, 37, 33, 97, 97, 96, 20, + 7, 240, 240, 228, 33, 49, 17, 65, 17, 65, 17, 65, + 18, 34, 35, 17, 97, 97, 97, 15, 6, 240, 240, 97, + 34, 17, 17, 50, 66, 65, 81, 81, 240, 128, 14, 6, + 240, 240, 116, 17, 82, 83, 82, 17, 49, 20, 240, 80, + 14, 5, 240, 97, 65, 52, 33, 65, 65, 65, 65, 67, + 240, 16, 20, 7, 240, 240, 193, 65, 17, 65, 17, 65, + 17, 65, 17, 65, 17, 50, 35, 17, 240, 112, 18, 8, + 0, 6, 2, 65, 33, 50, 34, 33, 65, 18, 65, 17, + 83, 98, 240, 192, 28, 11, 0, 8, 34, 49, 49, 33, + 34, 49, 33, 33, 17, 18, 33, 33, 17, 17, 66, 33, + 17, 66, 50, 66, 49, 240, 240, 96, + // + // Block 14 Offsets: Codepoints 0x79 - 0x7a + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x1c, 0x00, 0x00, 0x00, // Offset 28 (0x1c) + + // + // Block 14 Data: Codepoints 0x79 - 0x7a + // + 20, 8, 0, 6, 2, 65, 33, 49, 50, 33, 65, 18, + 65, 17, 98, 98, 97, 98, 67, 80, 13, 7, 240, 240, + 198, 81, 82, 66, 66, 81, 86, 240, 112, + 0, 0, 0, // Padding + + // + // Block 15 Offsets: Codepoints 0xc4 - 0xc4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 15 Data: Codepoints 0xc4 - 0xc4 + // + 27, 10, 34, 18, 97, 18, 240, 34, 115, 113, 17, 113, + 33, 82, 33, 81, 49, 86, 49, 81, 49, 81, 34, 97, + 240, 240, 16, + 0, // Padding + + // + // Block 16 Offsets: Codepoints 0xe4 - 0xe4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 16 Data: Codepoints 0xe4 - 0xe4 + // + 22, 7, 240, 114, 17, 50, 17, 180, 33, 49, 17, 65, + 17, 65, 17, 65, 17, 50, 35, 17, 240, 112, + 0, 0, // Padding + + // + // Block 17 Offsets: Codepoints 0xe9 - 0xe9 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 17 Data: Codepoints 0xe9 - 0xe9 + // + 17, 7, 240, 49, 81, 81, 196, 34, 33, 33, 65, 22, + 17, 98, 101, 240, 112, + 0, 0, 0, // Padding + + // + // Block 18 Offsets: Codepoints 0xf1 - 0xf1 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 18 Data: Codepoints 0xf1 - 0xf1 + // + 21, 7, 240, 114, 114, 145, 19, 34, 49, 17, 65, 17, + 65, 17, 65, 17, 65, 17, 65, 240, 112, + 0, 0, 0, // Padding + + // + // Block 19 Offsets: Codepoints 0xf3 - 0xf3 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 19 Data: Codepoints 0xf3 - 0xf3 + // + 20, 7, 240, 49, 81, 81, 196, 34, 34, 17, 65, 17, + 65, 17, 65, 18, 34, 36, 240, 128, + // + // Block 20 Offsets: Codepoints 0xf6 - 0xf6 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 20 Data: Codepoints 0xf6 - 0xf6 + // + 21, 7, 240, 113, 33, 49, 33, 164, 34, 34, 17, 65, + 17, 65, 17, 65, 18, 34, 36, 240, 128, + 0, 0, 0, // Padding + + // + // Block 21 Offsets: Codepoints 0xfc - 0xfc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 21 Data: Codepoints 0xfc - 0xfc + // + 23, 7, 240, 113, 33, 49, 33, 145, 65, 17, 65, 17, + 65, 17, 65, 17, 65, 17, 50, 35, 17, 240, 112, + 0, // Padding + + // + // Block 22 Offsets: Codepoints 0x201c - 0x201d + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x14, 0x00, 0x00, 0x00, // Offset 20 (0x14) + + // + // Block 22 Data: Codepoints 0x201c - 0x201d + // + 12, 6, 240, 65, 33, 17, 33, 34, 18, 0, 7, 80, + 11, 6, 194, 18, 33, 33, 17, 33, 0, 8, 64, + 0, // Padding + + // + // Block 23 Offsets: Codepoints 0x3001 - 0x3002 + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x10, 0x00, 0x00, 0x00, // Offset 16 (0x10) + + // + // Block 23 Data: Codepoints 0x3001 - 0x3002 + // + 8, 4, 240, 145, 66, 49, 240, 224, 13, 5, 240, 240, + 18, 33, 33, 17, 33, 34, 240, 240, 32, + 0, 0, 0, // Padding + + // + // Block 24 Offsets: Codepoints 0x3042 - 0x3042 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 24 Data: Codepoints 0x3042 - 0x3042 + // + 33, 12, 241, 193, 177, 18, 85, 145, 33, 129, 33, 134, + 82, 17, 49, 49, 17, 17, 65, 17, 49, 81, 17, 34, + 81, 17, 17, 17, 65, 49, 82, 240, 192, + 0, 0, 0, // Padding + + // + // Block 25 Offsets: Codepoints 0x3044 - 0x3044 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 25 Data: Codepoints 0x3044 - 0x3044 + // + 24, 13, 0, 6, 65, 209, 98, 65, 129, 49, 145, 33, + 49, 81, 33, 33, 82, 49, 17, 97, 50, 193, 0, 6, + // + // Block 26 Offsets: Codepoints 0x3048 - 0x3048 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 26 Data: Codepoints 0x3048 - 0x3048 + // + 21, 12, 241, 195, 240, 241, 51, 99, 17, 161, 161, 161, + 163, 129, 49, 97, 65, 97, 85, 240, 160, + 0, 0, 0, // Padding + + // + // Block 27 Offsets: Codepoints 0x304c - 0x304d + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x2d, 0x00, 0x00, 0x00, // Offset 45 (0x2d) + + // + // Block 27 Data: Codepoints 0x304c - 0x304d + // + 37, 14, 240, 161, 81, 81, 33, 81, 81, 113, 49, 81, + 51, 33, 84, 33, 33, 97, 49, 49, 81, 49, 34, 81, + 49, 129, 65, 129, 49, 129, 33, 17, 129, 49, 240, 240, + 96, 20, 10, 209, 161, 145, 18, 53, 145, 148, 21, 17, + 161, 145, 71, 33, 97, 33, 162, 163, 208, + 0, 0, 0, // Padding + + // + // Block 28 Offsets: Codepoints 0x304f - 0x3050 + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x19, 0x00, 0x00, 0x00, // Offset 25 (0x19) + + // + // Block 28 Data: Codepoints 0x304f - 0x3050 + // + 17, 7, 177, 113, 97, 81, 81, 66, 65, 97, 113, 113, + 113, 113, 113, 97, 128, 22, 11, 241, 177, 161, 145, 49, + 81, 33, 33, 34, 65, 49, 161, 177, 177, 177, 177, 177, + 161, 240, 16, + 0, // Padding + + // + // Block 29 Offsets: Codepoints 0x3053 - 0x3053 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 29 Data: Codepoints 0x3053 - 0x3053 + // + 16, 11, 240, 145, 182, 129, 145, 0, 6, 17, 161, 177, + 113, 55, 240, 144, + // + // Block 30 Offsets: Codepoints 0x3055 - 0x3055 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 30 Data: Codepoints 0x3055 - 0x3055 + // + 21, 11, 225, 177, 177, 34, 17, 67, 68, 17, 177, 161, + 102, 65, 81, 49, 161, 178, 180, 240, 160, + 0, 0, 0, // Padding + + // + // Block 31 Offsets: Codepoints 0x3057 - 0x3059 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x20, 0x00, 0x00, 0x00, // Offset 32 (0x20) + 0x38, 0x00, 0x00, 0x00, // Offset 56 (0x38) + + // + // Block 31 Data: Codepoints 0x3057 - 0x3059 + // + 20, 11, 240, 113, 177, 161, 161, 161, 161, 161, 161, 161, + 113, 33, 97, 65, 50, 99, 240, 192, 24, 11, 240, 113, + 97, 65, 49, 33, 49, 65, 81, 161, 161, 161, 161, 161, + 113, 33, 97, 65, 50, 99, 240, 192, 22, 13, 240, 65, + 209, 81, 101, 39, 193, 163, 145, 34, 129, 49, 148, 193, + 177, 193, 177, 177, 240, 80, + 0, 0, // Padding + + // + // Block 32 Offsets: Codepoints 0x305f - 0x3060 + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x20, 0x00, 0x00, 0x00, // Offset 32 (0x20) + + // + // Block 32 Data: Codepoints 0x305f - 0x3060 + // + 24, 12, 240, 177, 193, 33, 131, 100, 161, 52, 65, 98, + 49, 81, 65, 177, 177, 49, 97, 65, 97, 85, 240, 160, + 28, 13, 240, 129, 65, 81, 33, 65, 33, 33, 99, 116, + 177, 52, 81, 98, 65, 81, 81, 193, 193, 49, 113, 65, + 113, 85, 240, 208, + // + // Block 33 Offsets: Codepoints 0x3066 - 0x3068 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x20, 0x00, 0x00, 0x00, // Offset 32 (0x20) + 0x39, 0x00, 0x00, 0x00, // Offset 57 (0x39) + + // + // Block 33 Data: Codepoints 0x3066 - 0x3068 + // + 20, 13, 240, 240, 83, 17, 68, 84, 33, 177, 193, 177, + 193, 193, 193, 193, 209, 211, 240, 224, 25, 14, 240, 240, + 115, 33, 68, 100, 33, 49, 129, 33, 33, 113, 49, 129, + 209, 209, 209, 209, 225, 227, 240, 240, 32, 18, 10, 240, + 113, 161, 145, 145, 145, 35, 67, 98, 113, 129, 145, 161, + 167, 240, 96, + 0, // Padding + + // + // Block 34 Offsets: Codepoints 0x306a - 0x306b + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x24, 0x00, 0x00, 0x00, // Offset 36 (0x24) + + // + // Block 34 Data: Codepoints 0x306a - 0x306b + // + 28, 12, 241, 193, 177, 17, 86, 145, 51, 65, 98, 49, + 81, 65, 81, 81, 81, 65, 97, 132, 113, 50, 97, 49, + 17, 99, 240, 32, 26, 12, 240, 145, 193, 177, 68, 49, + 34, 50, 17, 113, 49, 177, 177, 177, 49, 113, 17, 17, + 129, 54, 33, 177, 240, 112, + 0, 0, // Padding + + // + // Block 35 Offsets: Codepoints 0x306e - 0x306f + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x2a, 0x00, 0x00, 0x00, // Offset 42 (0x2a) + + // + // Block 35 Data: Codepoints 0x306e - 0x306f + // + 34, 12, 240, 240, 164, 98, 17, 33, 65, 49, 49, 49, + 49, 65, 17, 49, 81, 17, 49, 81, 17, 33, 97, 17, + 33, 81, 33, 17, 97, 49, 82, 130, 240, 224, 35, 12, + 240, 65, 65, 113, 65, 97, 65, 17, 67, 33, 37, 49, + 113, 49, 113, 49, 113, 49, 113, 49, 17, 36, 65, 33, + 50, 49, 33, 49, 17, 33, 51, 240, 208, + 0, 0, 0, // Padding + + // + // Block 36 Offsets: Codepoints 0x307e - 0x307e + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 36 Data: Codepoints 0x307e - 0x307e + // + 22, 10, 225, 161, 65, 68, 37, 145, 65, 67, 53, 145, + 145, 85, 65, 67, 33, 65, 33, 36, 240, 160, + 0, 0, // Padding + + // + // Block 37 Offsets: Codepoints 0x3081 - 0x3081 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 37 Data: Codepoints 0x3081 - 0x3081 + // + 38, 13, 240, 240, 33, 209, 113, 65, 113, 36, 99, 33, + 17, 81, 49, 49, 49, 17, 33, 65, 33, 17, 17, 81, + 17, 50, 81, 17, 49, 97, 17, 33, 17, 65, 50, 82, + 240, 224, + 0, 0, // Padding + + // + // Block 38 Offsets: Codepoints 0x3089 - 0x308c + // + 0x10, 0x00, 0x00, 0x00, // Offset 16 (0x10) + 0x25, 0x00, 0x00, 0x00, // Offset 37 (0x25) + 0x3f, 0x00, 0x00, 0x00, // Offset 63 (0x3f) + 0x58, 0x00, 0x00, 0x00, // Offset 88 (0x58) + + // + // Block 38 Data: Codepoints 0x3089 - 0x308c + // + 21, 9, 177, 145, 131, 66, 97, 129, 129, 129, 36, 35, + 65, 17, 97, 17, 97, 113, 98, 82, 224, 26, 9, 145, + 145, 34, 65, 17, 33, 50, 65, 34, 65, 33, 81, 33, + 81, 33, 81, 33, 81, 113, 129, 113, 113, 113, 224, 25, + 11, 240, 145, 50, 99, 17, 145, 145, 145, 149, 82, 65, + 49, 113, 17, 129, 83, 33, 65, 50, 81, 49, 115, 240, + 33, 14, 240, 241, 225, 209, 35, 129, 17, 49, 99, 65, + 66, 18, 65, 113, 81, 98, 81, 98, 81, 81, 17, 81, + 65, 33, 81, 33, 50, 98, 81, 240, 144, + 0, 0, 0, // Padding + + // + // Block 39 Offsets: Codepoints 0x3092 - 0x3092 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 39 Data: Codepoints 0x3092 - 0x3092 + // + 25, 12, 241, 193, 129, 33, 18, 100, 145, 177, 65, 84, + 35, 34, 50, 65, 66, 145, 17, 129, 33, 113, 177, 198, + 240, + 0, 0, 0, // Padding + + // + // Block 40 Offsets: Codepoints 0x30a2 - 0x30a4 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x21, 0x00, 0x00, 0x00, // Offset 33 (0x21) + 0x31, 0x00, 0x00, 0x00, // Offset 49 (0x31) + + // + // Block 40 Data: Codepoints 0x30a2 - 0x30a4 + // + 21, 11, 240, 240, 49, 69, 36, 65, 145, 97, 33, 130, + 145, 161, 161, 145, 161, 145, 145, 240, 64, 16, 9, 0, + 6, 65, 113, 113, 99, 51, 33, 129, 129, 129, 129, 129, + 192, 19, 10, 240, 209, 145, 129, 129, 114, 98, 17, 66, + 65, 145, 145, 145, 145, 145, 145, 208, + // + // Block 41 Offsets: Codepoints 0x30a6 - 0x30a7 + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x1f, 0x00, 0x00, 0x00, // Offset 31 (0x1f) + + // + // Block 41 Data: Codepoints 0x30a6 - 0x30a7 + // + 23, 11, 240, 177, 177, 161, 165, 21, 65, 33, 113, 33, + 97, 65, 81, 65, 65, 161, 145, 145, 145, 240, 32, 14, + 10, 0, 9, 51, 52, 145, 145, 145, 148, 36, 65, 240, + 96, + 0, 0, 0, // Padding + + // + // Block 42 Offsets: Codepoints 0x30af - 0x30b1 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x25, 0x00, 0x00, 0x00, // Offset 37 (0x25) + 0x44, 0x00, 0x00, 0x00, // Offset 68 (0x44) + + // + // Block 42 Data: Codepoints 0x30af - 0x30b1 + // + 25, 10, 240, 113, 161, 35, 67, 33, 65, 49, 65, 65, + 65, 49, 65, 65, 49, 65, 145, 129, 129, 129, 129, 240, + 48, 31, 13, 240, 129, 65, 81, 33, 65, 34, 17, 17, + 67, 17, 17, 97, 49, 113, 65, 113, 49, 113, 65, 97, + 65, 193, 177, 177, 177, 177, 240, 144, 22, 12, 240, 177, + 193, 177, 177, 67, 54, 97, 33, 113, 65, 81, 81, 177, + 161, 177, 161, 161, 240, 80, + 0, 0, // Padding + + // + // Block 43 Offsets: Codepoints 0x30b5 - 0x30b5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 43 Data: Codepoints 0x30b5 - 0x30b5 + // + 27, 12, 240, 241, 113, 65, 113, 49, 113, 49, 65, 33, + 37, 37, 17, 113, 49, 113, 49, 113, 49, 161, 177, 161, + 161, 240, 64, + 0, // Padding + + // + // Block 44 Offsets: Codepoints 0x30b7 - 0x30b9 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x1f, 0x00, 0x00, 0x00, // Offset 31 (0x1f) + 0x38, 0x00, 0x00, 0x00, // Offset 56 (0x38) + + // + // Block 44 Data: Codepoints 0x30b7 - 0x30b9 + // + 19, 11, 240, 240, 66, 177, 240, 50, 177, 97, 145, 145, + 145, 145, 81, 34, 114, 240, 240, 25, 12, 240, 240, 49, + 50, 65, 33, 65, 65, 17, 145, 50, 193, 97, 161, 161, + 161, 161, 97, 34, 130, 240, 240, 48, 23, 11, 240, 240, + 65, 67, 68, 33, 145, 161, 145, 161, 145, 17, 113, 49, + 66, 81, 18, 113, 240, 240, 64, + 0, // Padding + + // + // Block 45 Offsets: Codepoints 0x30bd - 0x30bd + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 45 Data: Codepoints 0x30bd - 0x30bd + // + 23, 10, 240, 193, 33, 113, 33, 97, 49, 81, 49, 65, + 65, 65, 129, 145, 129, 145, 129, 129, 129, 240, 32, + 0, // Padding + + // + // Block 46 Offsets: Codepoints 0x30bf - 0x30bf + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 46 Data: Codepoints 0x30bf - 0x30bf + // + 24, 11, 240, 177, 177, 165, 81, 65, 81, 49, 81, 17, + 33, 65, 50, 65, 81, 145, 145, 145, 130, 114, 240, 80, + // + // Block 47 Offsets: Codepoints 0x30c3 - 0x30c3 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 47 Data: Codepoints 0x30c3 - 0x30c3 + // + 19, 9, 0, 8, 17, 49, 33, 33, 49, 33, 17, 49, + 33, 65, 129, 113, 113, 113, 224, + 0, // Padding + + // + // Block 48 Offsets: Codepoints 0x30c6 - 0x30c6 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 48 Data: Codepoints 0x30c6 - 0x30c6 + // + 21, 12, 240, 240, 113, 52, 83, 240, 180, 17, 51, 99, + 33, 177, 161, 177, 161, 161, 161, 240, 96, + 0, 0, 0, // Padding + + // + // Block 49 Offsets: Codepoints 0x30c8 - 0x30c8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 49 Data: Codepoints 0x30c8 - 0x30c8 + // + 19, 8, 240, 17, 129, 113, 113, 113, 115, 81, 34, 49, + 65, 33, 113, 113, 113, 113, 224, + 0, // Padding + + // + // Block 50 Offsets: Codepoints 0x30cd - 0x30cd + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 50 Data: Codepoints 0x30cd - 0x30cd + // + 24, 12, 240, 209, 193, 180, 68, 49, 161, 161, 161, 162, + 17, 98, 17, 34, 34, 49, 65, 97, 177, 177, 240, 48, + // + // Block 51 Offsets: Codepoints 0x30d1 - 0x30d1 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 51 Data: Codepoints 0x30d1 - 0x30d1 + // + 28, 14, 240, 146, 177, 33, 161, 33, 178, 81, 49, 161, + 49, 145, 65, 113, 97, 97, 97, 81, 129, 49, 145, 33, + 161, 240, 240, 224, + // + // Block 52 Offsets: Codepoints 0x30d5 - 0x30d7 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x1e, 0x00, 0x00, 0x00, // Offset 30 (0x1e) + 0x37, 0x00, 0x00, 0x00, // Offset 55 (0x37) + + // + // Block 52 Data: Codepoints 0x30d5 - 0x30d7 + // + 18, 10, 240, 241, 68, 36, 49, 145, 129, 145, 129, 145, + 129, 129, 129, 129, 240, 192, 25, 13, 240, 129, 161, 33, + 17, 52, 17, 17, 35, 49, 17, 161, 177, 193, 177, 193, + 177, 177, 177, 177, 240, 240, 112, 24, 13, 240, 114, 161, + 33, 17, 53, 33, 35, 49, 18, 145, 177, 193, 177, 193, + 177, 177, 177, 177, 240, 240, 112, + 0, // Padding + + // + // Block 53 Offsets: Codepoints 0x30dc - 0x30dd + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x29, 0x00, 0x00, 0x00, // Offset 41 (0x29) + + // + // Block 53 Data: Codepoints 0x30dc - 0x30dd + // + 33, 13, 240, 129, 97, 49, 33, 97, 49, 17, 97, 49, + 49, 69, 69, 193, 193, 17, 113, 33, 33, 97, 33, 49, + 65, 49, 49, 49, 65, 178, 193, 240, 80, 33, 13, 240, + 114, 97, 49, 33, 97, 33, 33, 97, 50, 33, 69, 69, + 193, 193, 17, 113, 33, 33, 97, 33, 49, 65, 49, 49, + 49, 65, 178, 193, 240, 80, + 0, 0, // Padding + + // + // Block 54 Offsets: Codepoints 0x30e1 - 0x30e1 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 54 Data: Codepoints 0x30e1 - 0x30e1 + // + 21, 11, 240, 225, 177, 161, 161, 82, 49, 115, 161, 145, + 17, 129, 33, 97, 145, 130, 114, 240, 80, + 0, 0, 0, // Padding + + // + // Block 55 Offsets: Codepoints 0x30e5 - 0x30e7 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x1b, 0x00, 0x00, 0x00, // Offset 27 (0x1b) + 0x2c, 0x00, 0x00, 0x00, // Offset 44 (0x2c) + + // + // Block 55 Data: Codepoints 0x30e5 - 0x30e7 + // + 15, 10, 0, 9, 35, 67, 33, 145, 129, 132, 36, 65, + 240, 240, 16, 17, 12, 0, 7, 81, 51, 99, 33, 177, + 161, 177, 165, 37, 81, 0, 6, 16, 17, 8, 0, 6, + 52, 19, 49, 113, 68, 19, 33, 113, 83, 35, 49, 240, + 32, + 0, 0, 0, // Padding + + // + // Block 56 Offsets: Codepoints 0x30e9 - 0x30eb + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x22, 0x00, 0x00, 0x00, // Offset 34 (0x22) + 0x3a, 0x00, 0x00, 0x00, // Offset 58 (0x3a) + + // + // Block 56 Data: Codepoints 0x30e9 - 0x30eb + // + 22, 11, 240, 240, 65, 51, 83, 211, 17, 51, 33, 35, + 81, 161, 145, 161, 145, 145, 130, 114, 240, 48, 24, 8, + 240, 97, 33, 81, 33, 65, 33, 65, 33, 65, 33, 65, + 33, 65, 33, 65, 97, 113, 97, 97, 97, 208, 32, 12, + 240, 240, 177, 129, 49, 129, 33, 129, 33, 129, 33, 49, + 65, 33, 49, 65, 33, 33, 65, 49, 33, 65, 49, 17, + 65, 66, 65, 81, 240, 224, + 0, 0, // Padding + + // + // Block 57 Offsets: Codepoints 0x30f3 - 0x30f3 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 57 Data: Codepoints 0x30f3 - 0x30f3 + // + 19, 11, 240, 240, 226, 177, 97, 65, 81, 145, 161, 145, + 145, 145, 81, 34, 114, 240, 240, + 0, // Padding + + // + // Block 58 Offsets: Codepoints 0x30fc - 0x30fc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 58 Data: Codepoints 0x30fc - 0x30fc + // + 9, 12, 0, 10, 65, 202, 0, 10, 80, + 0, 0, 0, // Padding + + // + // Block 59 Offsets: Codepoints 0x4e0b - 0x4e0b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 59 Data: Codepoints 0x4e0b - 0x4e0b + // + 22, 13, 240, 129, 44, 97, 193, 194, 177, 18, 145, 34, + 129, 49, 129, 193, 193, 193, 193, 240, 240, 48, + 0, 0, // Padding + + // + // Block 60 Offsets: Codepoints 0x4e0e - 0x4e0e + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 60 Data: Codepoints 0x4e0e - 0x4e0e + // + 22, 13, 240, 17, 193, 97, 89, 49, 193, 186, 193, 129, + 49, 40, 33, 193, 129, 49, 147, 177, 240, 240, + 0, 0, // Padding + + // + // Block 61 Offsets: Codepoints 0x4e2d - 0x4e2d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 61 Data: Codepoints 0x4e2d - 0x4e2d + // + 29, 13, 240, 49, 193, 113, 65, 65, 44, 17, 65, 65, + 33, 65, 65, 33, 65, 65, 43, 33, 65, 65, 113, 193, + 193, 193, 240, 240, 48, + 0, 0, 0, // Padding + + // + // Block 62 Offsets: Codepoints 0x4e4b - 0x4e4b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 62 Data: Codepoints 0x4e4b - 0x4e4b + // + 22, 13, 240, 33, 209, 193, 33, 74, 177, 177, 177, 177, + 177, 177, 177, 162, 18, 82, 17, 69, 240, 224, + 0, 0, // Padding + + // + // Block 63 Offsets: Codepoints 0x4ecb - 0x4ecb + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 63 Data: Codepoints 0x4ecb - 0x4ecb + // + 32, 14, 240, 81, 210, 177, 33, 145, 65, 98, 99, 18, + 33, 65, 17, 97, 65, 129, 65, 129, 65, 129, 65, 113, + 81, 97, 97, 81, 113, 240, 240, 32, + // + // Block 64 Offsets: Codepoints 0x4ee3 - 0x4ee3 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 64 Data: Codepoints 0x4ee3 - 0x4ee3 + // + 38, 14, 240, 33, 49, 33, 97, 49, 49, 81, 49, 49, + 65, 65, 129, 70, 34, 20, 97, 17, 65, 129, 65, 129, + 81, 113, 81, 49, 49, 97, 33, 49, 113, 17, 49, 130, + 240, 224, + 0, 0, // Padding + + // + // Block 65 Offsets: Codepoints 0x4ee5 - 0x4ee5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 65 Data: Codepoints 0x4ee5 - 0x4ee5 + // + 38, 13, 240, 113, 65, 33, 65, 65, 49, 49, 65, 50, + 33, 65, 65, 33, 65, 113, 65, 113, 65, 113, 65, 50, + 17, 81, 18, 50, 51, 65, 33, 49, 50, 50, 66, 97, + 240, 192, + 0, 0, // Padding + + // + // Block 66 Offsets: Codepoints 0x4ef6 - 0x4ef6 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 66 Data: Codepoints 0x4ef6 - 0x4ef6 + // + 35, 14, 240, 33, 65, 129, 17, 33, 129, 17, 33, 113, + 39, 65, 17, 49, 98, 81, 81, 17, 81, 123, 49, 81, + 113, 81, 113, 81, 113, 81, 113, 81, 240, 240, 48, + 0, // Padding + + // + // Block 67 Offsets: Codepoints 0x4f1a - 0x4f1a + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 67 Data: Codepoints 0x4f1a - 0x4f1a + // + 27, 14, 240, 81, 210, 177, 33, 145, 65, 98, 99, 18, + 37, 33, 240, 43, 129, 193, 49, 129, 81, 88, 17, 81, + 113, 240, 240, + 0, // Padding + + // + // Block 68 Offsets: Codepoints 0x4f9b - 0x4f9b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 68 Data: Codepoints 0x4f9b - 0x4f9b + // + 39, 14, 240, 33, 33, 33, 113, 33, 33, 113, 33, 33, + 97, 25, 49, 49, 33, 82, 49, 33, 65, 17, 49, 33, + 97, 49, 33, 107, 49, 209, 65, 17, 97, 34, 51, 51, + 97, 240, 240, + 0, // Padding + + // + // Block 69 Offsets: Codepoints 0x4fe1 - 0x4fe1 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 69 Data: Codepoints 0x4fe1 - 0x4fe1 + // + 31, 14, 240, 33, 50, 129, 65, 138, 49, 209, 39, 50, + 177, 17, 39, 65, 209, 39, 65, 33, 81, 65, 33, 81, + 65, 39, 65, 33, 81, 240, 240, + 0, // Padding + + // + // Block 70 Offsets: Codepoints 0x50cf - 0x50cf + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 70 Data: Codepoints 0x50cf - 0x50cf + // + 47, 14, 240, 33, 49, 145, 52, 97, 33, 33, 97, 25, + 49, 33, 33, 49, 34, 40, 17, 17, 65, 49, 65, 49, + 17, 17, 81, 18, 17, 17, 97, 49, 19, 81, 18, 17, + 17, 17, 65, 52, 33, 49, 18, 33, 49, 240, 224, + 0, // Padding + + // + // Block 71 Offsets: Codepoints 0x5141 - 0x5141 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 71 Data: Codepoints 0x5141 - 0x5141 + // + 33, 14, 240, 65, 209, 193, 49, 129, 81, 97, 38, 68, + 33, 33, 113, 33, 161, 33, 161, 33, 145, 49, 49, 81, + 49, 49, 65, 65, 50, 18, 100, 240, 240, + 0, 0, 0, // Padding + + // + // Block 72 Offsets: Codepoints 0x5207 - 0x5207 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 72 Data: Codepoints 0x5207 - 0x5207 + // + 43, 14, 240, 17, 209, 55, 49, 81, 49, 49, 33, 33, + 49, 51, 49, 49, 19, 81, 49, 49, 81, 49, 49, 33, + 33, 49, 49, 17, 49, 49, 35, 49, 65, 49, 66, 49, + 113, 35, 98, 65, 240, 240, 16, + 0, // Padding + + // + // Block 73 Offsets: Codepoints 0x529b - 0x529b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 73 Data: Codepoints 0x529b - 0x529b + // + 30, 14, 240, 81, 209, 209, 65, 45, 113, 65, 129, 65, + 129, 65, 129, 65, 113, 81, 113, 81, 97, 33, 49, 66, + 67, 50, 113, 240, 240, 32, + 0, 0, // Padding + + // + // Block 74 Offsets: Codepoints 0x52a8 - 0x52a8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 74 Data: Codepoints 0x52a8 - 0x52a8 + // + 39, 14, 240, 49, 65, 85, 49, 209, 209, 145, 22, 23, + 33, 33, 65, 81, 33, 49, 97, 33, 49, 33, 49, 33, + 33, 35, 17, 49, 20, 33, 17, 49, 33, 81, 35, 98, + 65, 240, 240, + 0, // Padding + + // + // Block 75 Offsets: Codepoints 0x52b9 - 0x52b9 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 75 Data: Codepoints 0x52b9 - 0x52b9 + // + 48, 13, 240, 17, 65, 113, 65, 113, 65, 71, 17, 97, + 17, 37, 49, 33, 33, 33, 33, 50, 17, 33, 17, 17, + 33, 33, 33, 66, 49, 33, 81, 49, 33, 65, 17, 17, + 49, 49, 33, 17, 49, 33, 65, 65, 17, 65, 50, 240, + // + // Block 76 Offsets: Codepoints 0x52d5 - 0x52d5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 76 Data: Codepoints 0x52d5 - 0x52d5 + // + 41, 14, 240, 65, 49, 131, 33, 84, 65, 129, 65, 77, + 33, 33, 17, 33, 33, 38, 33, 33, 33, 33, 17, 33, + 33, 38, 33, 33, 81, 49, 49, 53, 17, 49, 81, 33, + 35, 24, 49, 240, 240, + 0, 0, 0, // Padding + + // + // Block 77 Offsets: Codepoints 0x5373 - 0x5373 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 77 Data: Codepoints 0x5373 - 0x5373 + // + 50, 14, 241, 49, 33, 49, 38, 21, 33, 49, 33, 49, + 37, 33, 49, 33, 49, 33, 49, 33, 49, 33, 49, 37, + 33, 49, 33, 97, 49, 33, 33, 49, 49, 33, 49, 33, + 19, 33, 18, 17, 17, 33, 35, 49, 17, 97, 97, 240, + 240, 48, + 0, 0, // Padding + + // + // Block 78 Offsets: Codepoints 0x53d6 - 0x53d6 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 78 Data: Codepoints 0x53d6 - 0x53d6 + // + 43, 14, 240, 81, 120, 129, 33, 81, 68, 22, 49, 33, + 33, 33, 65, 33, 33, 33, 68, 33, 33, 65, 33, 33, + 33, 65, 36, 17, 81, 18, 49, 68, 17, 33, 17, 65, + 49, 17, 49, 114, 81, 240, 224, + 0, // Padding + + // + // Block 79 Offsets: Codepoints 0x53ef - 0x53ef + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 79 Data: Codepoints 0x53ef - 0x53ef + // + 30, 14, 240, 161, 45, 177, 209, 84, 65, 81, 33, 65, + 81, 33, 65, 81, 33, 65, 84, 65, 81, 33, 65, 161, + 33, 179, 193, 240, 240, 32, + 0, 0, // Padding + + // + // Block 80 Offsets: Codepoints 0x540e - 0x540e + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 80 Data: Codepoints 0x540e - 0x540e + // + 32, 14, 240, 33, 83, 86, 129, 209, 113, 90, 65, 209, + 17, 81, 81, 24, 65, 17, 81, 65, 33, 81, 65, 33, + 81, 49, 55, 33, 65, 81, 240, 240, + // + // Block 81 Offsets: Codepoints 0x548c - 0x548c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 81 Data: Codepoints 0x548c - 0x548c + // + 40, 14, 240, 65, 195, 132, 53, 81, 49, 49, 25, 49, + 81, 49, 49, 82, 33, 49, 66, 17, 17, 49, 49, 17, + 34, 49, 33, 33, 49, 49, 17, 49, 53, 81, 49, 49, + 81, 240, 240, 112, + // + // Block 82 Offsets: Codepoints 0x54cd - 0x54cd + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 82 Data: Codepoints 0x54cd - 0x54cd + // + 51, 14, 240, 114, 65, 33, 65, 93, 17, 33, 17, 97, + 17, 33, 17, 97, 17, 33, 17, 20, 17, 17, 33, 17, + 17, 33, 17, 17, 33, 17, 17, 33, 17, 20, 17, 20, + 17, 17, 33, 17, 17, 33, 17, 97, 97, 97, 67, 97, + 81, 240, 240, + 0, // Padding + + // + // Block 83 Offsets: Codepoints 0x56fd - 0x56fe + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x29, 0x00, 0x00, 0x00, // Offset 41 (0x29) + + // + // Block 83 Data: Codepoints 0x56fd - 0x56fe + // + 33, 13, 209, 145, 44, 17, 145, 43, 33, 65, 65, 33, + 65, 65, 33, 23, 17, 33, 65, 17, 33, 33, 65, 33, + 17, 43, 33, 145, 43, 33, 145, 240, 208, 43, 13, 220, + 17, 161, 17, 49, 49, 33, 17, 53, 33, 17, 34, 33, + 49, 17, 17, 34, 65, 17, 49, 33, 49, 17, 18, 17, + 34, 17, 17, 82, 49, 17, 50, 81, 17, 82, 49, 17, + 161, 28, 240, 192, + // + // Block 84 Offsets: Codepoints 0x5728 - 0x5728 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 84 Data: Codepoints 0x5728 - 0x5728 + // + 30, 14, 240, 81, 209, 65, 60, 97, 193, 49, 129, 65, + 129, 65, 114, 23, 49, 17, 65, 81, 33, 65, 129, 65, + 129, 65, 33, 90, 240, 224, + 0, 0, // Padding + + // + // Block 85 Offsets: Codepoints 0x5831 - 0x5831 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 85 Data: Codepoints 0x5831 - 0x5831 + // + 43, 14, 240, 33, 49, 49, 81, 54, 37, 17, 49, 81, + 49, 49, 40, 18, 65, 49, 17, 129, 17, 38, 37, 17, + 49, 81, 50, 33, 40, 17, 17, 81, 49, 33, 97, 49, + 17, 17, 81, 50, 49, 240, 224, + 0, // Padding + + // + // Block 86 Offsets: Codepoints 0x5b9a - 0x5b9a + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 86 Data: Codepoints 0x5b9a - 0x5b9a + // + 30, 14, 240, 82, 113, 81, 65, 44, 33, 161, 17, 161, + 74, 145, 145, 49, 145, 53, 81, 49, 129, 17, 33, 113, + 49, 17, 97, 87, 240, 224, + 0, 0, // Padding + + // + // Block 87 Offsets: Codepoints 0x5b9e - 0x5b9e + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 87 Data: Codepoints 0x5b9e - 0x5b9e + // + 32, 14, 240, 82, 113, 81, 65, 44, 33, 33, 113, 17, + 65, 17, 49, 81, 49, 161, 33, 161, 33, 49, 45, 114, + 177, 33, 130, 66, 51, 130, 240, 224, + // + // Block 88 Offsets: Codepoints 0x5c06 - 0x5c06 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 88 Data: Codepoints 0x5c06 - 0x5c06 + // + 44, 14, 240, 49, 33, 49, 97, 38, 33, 33, 18, 49, + 65, 18, 33, 17, 81, 17, 50, 129, 33, 33, 113, 17, + 49, 106, 19, 17, 17, 49, 65, 33, 33, 33, 113, 33, + 33, 113, 51, 113, 65, 240, 240, 32, + // + // Block 89 Offsets: Codepoints 0x5c4f - 0x5c4f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 89 Data: Codepoints 0x5c4f - 0x5c4f + // + 36, 14, 240, 17, 129, 75, 49, 129, 74, 65, 33, 49, + 97, 49, 17, 113, 24, 65, 49, 33, 107, 49, 49, 33, + 81, 65, 33, 81, 49, 49, 65, 34, 65, 240, 240, 32, + // + // Block 90 Offsets: Codepoints 0x5e55 - 0x5e55 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 90 Data: Codepoints 0x5e55 - 0x5e55 + // + 31, 14, 240, 49, 49, 93, 81, 49, 135, 113, 81, 119, + 113, 81, 77, 49, 49, 49, 75, 33, 17, 49, 49, 17, + 49, 49, 19, 145, 240, 240, 80, + 0, // Padding + + // + // Block 91 Offsets: Codepoints 0x5e8f - 0x5e8f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 91 Data: Codepoints 0x5e8f - 0x5e8f + // + 34, 14, 240, 82, 129, 65, 49, 75, 49, 209, 24, 65, + 65, 33, 81, 82, 97, 25, 49, 81, 49, 49, 81, 33, + 49, 49, 33, 97, 67, 81, 97, 240, 240, 64, + 0, 0, // Padding + + // + // Block 92 Offsets: Codepoints 0x5e93 - 0x5e95 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x2d, 0x00, 0x00, 0x00, // Offset 45 (0x2d) + 0x51, 0x00, 0x00, 0x00, // Offset 81 (0x51) + + // + // Block 92 Data: Codepoints 0x5e93 - 0x5e95 + // + 33, 14, 240, 82, 129, 65, 49, 75, 49, 49, 145, 25, + 49, 49, 145, 33, 33, 113, 24, 65, 81, 113, 81, 33, + 49, 41, 33, 97, 81, 113, 240, 240, 48, 36, 14, 240, + 82, 129, 65, 49, 75, 49, 209, 209, 49, 65, 66, 49, + 49, 65, 17, 33, 33, 81, 33, 17, 33, 81, 33, 49, + 81, 49, 49, 81, 97, 81, 42, 240, 224, 44, 14, 240, + 82, 129, 65, 49, 75, 49, 113, 81, 22, 97, 17, 49, + 33, 65, 25, 49, 17, 49, 113, 17, 49, 113, 17, 33, + 17, 81, 33, 17, 33, 33, 33, 19, 18, 17, 17, 17, + 49, 49, 34, 240, 224, + 0, 0, 0, // Padding + + // + // Block 93 Offsets: Codepoints 0x5f62 - 0x5f62 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 93 Data: Codepoints 0x5f62 - 0x5f62 + // + 42, 14, 240, 97, 50, 40, 33, 81, 33, 49, 97, 33, + 33, 113, 33, 66, 25, 33, 81, 33, 49, 97, 33, 33, + 113, 33, 17, 34, 49, 49, 65, 65, 49, 49, 65, 65, + 33, 65, 98, 240, 240, 48, + 0, 0, // Padding + + // + // Block 94 Offsets: Codepoints 0x5f71 - 0x5f71 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 94 Data: Codepoints 0x5f71 - 0x5f71 + // + 39, 14, 240, 21, 66, 49, 49, 65, 69, 49, 81, 49, + 33, 101, 17, 34, 81, 97, 40, 33, 193, 101, 17, 34, + 49, 49, 65, 69, 49, 65, 33, 33, 17, 65, 34, 34, + 240, 240, 48, + 0, // Padding + + // + // Block 95 Offsets: Codepoints 0x5f8c - 0x5f8c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 95 Data: Codepoints 0x5f8c - 0x5f8c + // + 41, 14, 240, 18, 50, 113, 65, 113, 65, 49, 49, 69, + 113, 49, 49, 65, 25, 34, 65, 65, 17, 17, 69, 65, + 49, 65, 65, 33, 17, 33, 81, 17, 50, 97, 50, 35, + 49, 18, 81, 240, 240, + 0, 0, 0, // Padding + + // + // Block 96 Offsets: Codepoints 0x606f - 0x606f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 96 Data: Codepoints 0x606f - 0x606f + // + 37, 14, 240, 33, 33, 49, 105, 81, 97, 104, 97, 97, + 104, 97, 97, 104, 97, 33, 49, 81, 17, 33, 49, 65, + 17, 33, 17, 33, 33, 33, 66, 17, 17, 69, 240, 240, + 32, + 0, 0, 0, // Padding + + // + // Block 97 Offsets: Codepoints 0x60a8 - 0x60a8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 97 Data: Codepoints 0x60a8 - 0x60a8 + // + 49, 14, 240, 33, 33, 161, 33, 145, 55, 49, 33, 49, + 33, 34, 17, 18, 17, 65, 17, 49, 33, 17, 65, 33, + 49, 33, 49, 17, 35, 33, 113, 145, 17, 33, 49, 65, + 17, 33, 17, 33, 33, 33, 66, 17, 17, 69, 240, 240, + 32, + 0, 0, 0, // Padding + + // + // Block 98 Offsets: Codepoints 0x60c5 - 0x60c5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 98 Data: Codepoints 0x60c5 - 0x60c5 + // + 42, 14, 240, 17, 81, 113, 40, 49, 81, 81, 18, 38, + 33, 17, 17, 49, 81, 17, 40, 17, 17, 49, 65, 65, + 54, 65, 49, 65, 65, 54, 65, 49, 65, 65, 49, 35, + 65, 49, 49, 240, 240, 16, + 0, 0, // Padding + + // + // Block 99 Offsets: Codepoints 0x6210 - 0x6210 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 99 Data: Codepoints 0x6210 - 0x6210 + // + 44, 14, 240, 97, 17, 177, 33, 81, 65, 49, 75, 49, + 65, 129, 65, 49, 68, 17, 49, 65, 33, 17, 33, 81, + 33, 33, 17, 81, 33, 49, 33, 52, 33, 17, 17, 33, + 33, 33, 50, 17, 81, 81, 240, 224, + // + // Block 100 Offsets: Codepoints 0x62bc - 0x62bc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 100 Data: Codepoints 0x62bc - 0x62bc + // + 43, 14, 240, 33, 39, 65, 33, 33, 33, 65, 33, 33, + 33, 29, 65, 33, 33, 33, 65, 18, 33, 33, 66, 23, + 20, 33, 33, 33, 33, 17, 81, 113, 81, 65, 33, 81, + 83, 81, 97, 97, 240, 240, 32, + 0, // Padding + + // + // Block 101 Offsets: Codepoints 0x6301 - 0x6301 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 101 Data: Codepoints 0x6301 - 0x6301 + // + 36, 14, 240, 33, 65, 129, 65, 129, 38, 38, 33, 129, + 39, 65, 17, 178, 81, 52, 24, 33, 17, 33, 49, 97, + 49, 33, 49, 33, 97, 67, 67, 81, 97, 240, 240, 32, + // + // Block 102 Offsets: Codepoints 0x6309 - 0x6309 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 102 Data: Codepoints 0x6309 - 0x6309 + // + 39, 14, 240, 33, 66, 113, 81, 113, 24, 22, 97, 65, + 65, 33, 81, 17, 33, 138, 20, 49, 33, 65, 17, 49, + 33, 97, 34, 33, 49, 33, 66, 83, 34, 33, 81, 18, + 82, 240, 224, + 0, // Padding + + // + // Block 103 Offsets: Codepoints 0x6362 - 0x6362 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 103 Data: Codepoints 0x6362 - 0x6362 + // + 41, 14, 240, 17, 49, 145, 49, 33, 97, 53, 54, 49, + 97, 39, 65, 18, 33, 33, 66, 17, 33, 33, 35, 33, + 33, 33, 65, 25, 49, 81, 113, 65, 17, 67, 49, 51, + 33, 34, 81, 240, 240, + 0, 0, 0, // Padding + + // + // Block 104 Offsets: Codepoints 0x63d0 - 0x63d0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 104 Data: Codepoints 0x63d0 - 0x63d0 + // + 40, 14, 240, 33, 38, 81, 33, 65, 81, 38, 39, 65, + 81, 38, 81, 18, 65, 67, 146, 17, 24, 65, 33, 33, + 113, 33, 36, 17, 33, 33, 33, 83, 17, 17, 17, 97, + 17, 53, 240, 224, + // + // Block 105 Offsets: Codepoints 0x63db - 0x63db + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 105 Data: Codepoints 0x63db - 0x63db + // + 43, 14, 240, 33, 49, 145, 52, 97, 33, 33, 76, 81, + 17, 17, 17, 17, 83, 17, 17, 17, 66, 17, 17, 19, + 34, 17, 18, 65, 81, 65, 138, 17, 33, 49, 17, 83, + 33, 51, 49, 18, 81, 240, 240, + 0, // Padding + + // + // Block 106 Offsets: Codepoints 0x652f - 0x652f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 106 Data: Codepoints 0x652f - 0x652f + // + 25, 14, 240, 81, 209, 65, 45, 113, 209, 153, 113, 65, + 129, 65, 145, 33, 178, 177, 33, 130, 66, 51, 130, 240, + 224, + 0, 0, 0, // Padding + + // + // Block 107 Offsets: Codepoints 0x65b0 - 0x65b0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 107 Data: Codepoints 0x65b0 - 0x65b0 + // + 44, 14, 240, 18, 65, 33, 81, 67, 55, 17, 97, 49, + 33, 113, 17, 49, 93, 65, 65, 33, 39, 17, 33, 81, + 65, 33, 49, 18, 49, 33, 33, 33, 17, 33, 33, 51, + 17, 17, 49, 65, 49, 65, 240, 240, + // + // Block 108 Offsets: Codepoints 0x65e5 - 0x65e5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 108 Data: Codepoints 0x65e5 - 0x65e5 + // + 27, 11, 177, 113, 42, 17, 113, 33, 113, 33, 113, 33, + 113, 41, 33, 113, 33, 113, 33, 113, 33, 113, 41, 33, + 113, 240, 144, + 0, // Padding + + // + // Block 109 Offsets: Codepoints 0x6620 - 0x6620 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 109 Data: Codepoints 0x6620 - 0x6620 + // + 45, 14, 240, 113, 81, 33, 65, 92, 33, 33, 17, 33, + 33, 33, 33, 17, 33, 33, 36, 17, 33, 33, 33, 33, + 17, 33, 33, 33, 42, 17, 33, 65, 84, 49, 17, 65, + 33, 33, 49, 129, 81, 97, 113, 240, 224, + 0, 0, 0, // Padding + + // + // Block 110 Offsets: Codepoints 0x662f - 0x662f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 110 Data: Codepoints 0x662f - 0x662f + // + 27, 14, 240, 40, 97, 97, 104, 97, 97, 104, 240, 45, + 129, 145, 49, 33, 97, 53, 82, 33, 129, 33, 17, 98, + 71, 240, 224, + 0, // Padding + + // + // Block 111 Offsets: Codepoints 0x66f4 - 0x66f4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 111 Data: Codepoints 0x66f4 - 0x66f4 + // + 27, 14, 240, 161, 45, 113, 153, 81, 49, 49, 89, 81, + 49, 49, 89, 81, 49, 49, 113, 17, 193, 178, 19, 83, + 100, 240, 224, + 0, // Padding + + // + // Block 112 Offsets: Codepoints 0x66ff - 0x66ff + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 112 Data: Codepoints 0x66ff - 0x66ff + // + 35, 14, 240, 33, 81, 113, 81, 85, 21, 81, 81, 70, + 22, 49, 17, 49, 17, 65, 49, 17, 49, 33, 25, 17, + 49, 113, 89, 81, 113, 89, 81, 113, 240, 240, 16, + 0, // Padding + + // + // Block 113 Offsets: Codepoints 0x672c - 0x672c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 113 Data: Codepoints 0x672c - 0x672c + // + 32, 14, 240, 81, 209, 209, 65, 45, 113, 177, 17, 17, + 145, 17, 17, 129, 33, 33, 97, 49, 49, 65, 65, 65, + 33, 39, 33, 113, 209, 240, 240, 80, + // + // Block 114 Offsets: Codepoints 0x677f - 0x677f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 114 Data: Codepoints 0x677f - 0x677f + // + 43, 14, 240, 33, 33, 50, 81, 36, 113, 33, 119, 161, + 38, 82, 17, 65, 81, 18, 65, 66, 34, 33, 65, 17, + 33, 17, 17, 49, 33, 33, 33, 113, 17, 33, 17, 98, + 33, 49, 81, 33, 81, 240, 224, + 0, // Padding + + // + // Block 115 Offsets: Codepoints 0x679c - 0x679c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 115 Data: Codepoints 0x679c - 0x679c + // + 30, 14, 240, 17, 113, 90, 65, 49, 49, 89, 81, 49, + 49, 89, 145, 125, 113, 177, 17, 17, 114, 33, 34, 50, + 65, 66, 113, 240, 240, 80, + 0, 0, // Padding + + // + // Block 116 Offsets: Codepoints 0x69cb - 0x69cb + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 116 Data: Codepoints 0x69cb - 0x69cb + // + 44, 14, 240, 17, 65, 33, 81, 40, 49, 65, 33, 53, + 22, 65, 65, 33, 81, 40, 50, 33, 17, 33, 50, 17, + 22, 33, 17, 49, 17, 33, 65, 25, 49, 49, 65, 65, + 49, 35, 65, 49, 49, 240, 240, 16, + // + // Block 117 Offsets: Codepoints 0x6a5f - 0x6a5f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 117 Data: Codepoints 0x6a5f - 0x6a5f + // + 58, 14, 240, 17, 33, 33, 17, 81, 33, 33, 17, 17, + 49, 17, 35, 17, 36, 18, 17, 17, 81, 33, 18, 17, + 17, 49, 21, 19, 50, 65, 33, 50, 25, 17, 17, 49, + 33, 33, 17, 17, 49, 33, 17, 65, 33, 17, 33, 17, + 49, 17, 33, 17, 18, 50, 65, 49, 240, 224, + 0, 0, // Padding + + // + // Block 118 Offsets: Codepoints 0x6b21 - 0x6b21 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 118 Data: Codepoints 0x6b21 - 0x6b21 + // + 39, 14, 241, 65, 145, 49, 145, 17, 17, 65, 97, 23, + 65, 33, 65, 81, 17, 33, 17, 98, 49, 113, 81, 83, + 81, 113, 65, 17, 97, 49, 49, 81, 33, 81, 65, 17, + 113, 240, 224, + 0, // Padding + + // + // Block 119 Offsets: Codepoints 0x6b64 - 0x6b64 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 119 Data: Codepoints 0x6b64 - 0x6b64 + // + 43, 14, 240, 49, 49, 145, 49, 145, 49, 113, 17, 49, + 34, 49, 17, 49, 33, 65, 21, 17, 81, 17, 50, 97, + 17, 49, 113, 17, 49, 113, 17, 19, 113, 18, 33, 49, + 20, 65, 49, 33, 116, 240, 224, + 0, // Padding + + // + // Block 120 Offsets: Codepoints 0x6f14 - 0x6f14 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 120 Data: Codepoints 0x6f14 - 0x6f14 + // + 37, 14, 241, 97, 113, 25, 81, 113, 17, 33, 23, 49, + 17, 65, 129, 23, 65, 33, 33, 33, 65, 39, 35, 33, + 33, 33, 65, 39, 65, 209, 50, 18, 81, 18, 82, 240, + 224, + 0, 0, 0, // Padding + + // + // Block 121 Offsets: Codepoints 0x73b0 - 0x73b0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 121 Data: Codepoints 0x73b0 - 0x73b0 + // + 47, 14, 240, 49, 17, 65, 45, 49, 49, 65, 65, 49, + 33, 17, 65, 49, 33, 17, 39, 33, 17, 65, 49, 33, + 17, 65, 49, 33, 17, 65, 19, 33, 17, 66, 66, 67, + 65, 17, 33, 33, 65, 33, 33, 82, 67, 240, 224, + 0, // Padding + + // + // Block 122 Offsets: Codepoints 0x7528 - 0x7528 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 122 Data: Codepoints 0x7528 - 0x7528 + // + 39, 14, 240, 17, 129, 75, 49, 49, 65, 65, 49, 65, + 74, 65, 49, 65, 65, 49, 65, 74, 65, 49, 65, 65, + 49, 65, 65, 49, 17, 33, 49, 65, 35, 33, 81, 49, + 240, 240, 16, + 0, // Padding + + // + // Block 123 Offsets: Codepoints 0x753b - 0x753b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 123 Data: Codepoints 0x753b - 0x753b + // + 40, 14, 240, 161, 45, 240, 55, 65, 33, 33, 33, 33, + 17, 33, 33, 33, 33, 17, 39, 33, 17, 33, 33, 33, + 33, 17, 33, 33, 33, 33, 17, 39, 33, 17, 177, 29, + 17, 177, 240, 224, + // + // Block 124 Offsets: Codepoints 0x7684 - 0x7684 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 124 Data: Codepoints 0x7684 - 0x7684 + // + 44, 14, 240, 17, 81, 113, 81, 97, 97, 86, 37, 17, + 65, 17, 65, 17, 66, 81, 17, 65, 33, 49, 22, 49, + 33, 17, 65, 49, 33, 17, 65, 97, 17, 65, 33, 49, + 22, 51, 33, 65, 65, 240, 240, 16, + // + // Block 125 Offsets: Codepoints 0x793a - 0x793a + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 125 Data: Codepoints 0x793a - 0x793a + // + 29, 14, 240, 129, 105, 240, 240, 193, 45, 113, 162, 17, + 17, 129, 33, 33, 97, 49, 50, 49, 65, 66, 17, 51, + 81, 97, 240, 240, 96, + 0, 0, 0, // Padding + + // + // Block 126 Offsets: Codepoints 0x79fb - 0x79fb + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 126 Data: Codepoints 0x79fb - 0x79fb + // + 42, 14, 240, 49, 49, 99, 65, 33, 81, 54, 65, 34, + 49, 38, 33, 17, 97, 66, 113, 34, 17, 99, 53, 33, + 17, 17, 17, 65, 17, 33, 33, 17, 33, 81, 82, 97, + 66, 113, 19, 240, 240, 64, + 0, 0, // Padding + + // + // Block 127 Offsets: Codepoints 0x7a0b - 0x7a0b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 127 Data: Codepoints 0x7a0b - 0x7a0b + // + 36, 14, 240, 49, 33, 49, 51, 54, 65, 49, 49, 81, + 49, 49, 38, 21, 81, 209, 39, 51, 65, 81, 17, 17, + 49, 65, 33, 53, 81, 81, 113, 81, 113, 24, 240, 224, + // + // Block 128 Offsets: Codepoints 0x7acb - 0x7acb + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 128 Data: Codepoints 0x7acb - 0x7acb + // + 25, 14, 240, 65, 225, 209, 49, 75, 240, 65, 81, 129, + 65, 129, 49, 161, 33, 161, 33, 193, 209, 49, 45, 240, + 224, + 0, 0, 0, // Padding + + // + // Block 129 Offsets: Codepoints 0x7b80 - 0x7b80 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 129 Data: Codepoints 0x7b80 - 0x7b80 + // + 44, 14, 240, 17, 81, 117, 21, 33, 17, 49, 33, 49, + 49, 17, 65, 81, 38, 49, 33, 97, 49, 37, 33, 49, + 33, 49, 33, 49, 37, 33, 49, 33, 49, 33, 49, 37, + 33, 49, 115, 49, 129, 240, 240, 16, + // + // Block 130 Offsets: Codepoints 0x7f6e - 0x7f6e + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 130 Data: Codepoints 0x7f6e - 0x7f6e + // + 23, 14, 251, 49, 33, 49, 33, 59, 129, 125, 113, 168, + 97, 97, 104, 97, 97, 104, 97, 97, 61, 240, 224, + 0, // Padding + + // + // Block 131 Offsets: Codepoints 0x80fd - 0x80fd + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 131 Data: Codepoints 0x80fd - 0x80fd + // + 46, 14, 240, 17, 81, 113, 33, 33, 33, 49, 49, 33, + 17, 53, 17, 18, 33, 113, 17, 49, 37, 37, 33, 49, + 149, 33, 33, 49, 49, 33, 17, 69, 34, 81, 49, 33, + 49, 33, 19, 33, 49, 33, 33, 68, 240, 224, + 0, 0, // Padding + + // + // Block 132 Offsets: Codepoints 0x898b - 0x898b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 132 Data: Codepoints 0x898b - 0x898b + // + 32, 14, 240, 17, 97, 105, 81, 97, 104, 97, 97, 104, + 97, 97, 104, 97, 17, 33, 17, 129, 33, 49, 81, 49, + 49, 65, 65, 50, 18, 100, 240, 240, + // + // Block 133 Offsets: Codepoints 0x89c1 - 0x89c1 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 133 Data: Codepoints 0x89c1 - 0x89c1 + // + 41, 14, 240, 17, 97, 105, 81, 97, 97, 33, 49, 97, + 33, 49, 97, 33, 49, 97, 33, 49, 97, 33, 17, 17, + 97, 33, 17, 17, 145, 17, 49, 97, 33, 49, 66, 49, + 50, 18, 100, 240, 240, + 0, 0, 0, // Padding + + // + // Block 134 Offsets: Codepoints 0x8a00 - 0x8a00 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 134 Data: Codepoints 0x8a00 - 0x8a00 + // + 23, 14, 240, 65, 225, 65, 45, 240, 40, 240, 88, 240, + 88, 97, 97, 97, 97, 104, 97, 97, 240, 240, 32, + 0, // Padding + + // + // Block 135 Offsets: Codepoints 0x8a2d - 0x8a2d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 135 Data: Codepoints 0x8a2d - 0x8a2d + // + 38, 14, 242, 49, 49, 81, 54, 37, 17, 49, 145, 49, + 53, 17, 51, 97, 133, 22, 129, 65, 37, 17, 65, 33, + 49, 33, 33, 49, 49, 50, 69, 33, 35, 17, 51, 65, + 240, 240, + 0, 0, // Padding + + // + // Block 136 Offsets: Codepoints 0x8a9e - 0x8a9e + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 136 Data: Codepoints 0x8a9e - 0x8a9e + // + 34, 14, 242, 54, 65, 81, 85, 49, 182, 37, 33, 49, + 145, 49, 37, 23, 245, 22, 33, 49, 17, 65, 33, 49, + 17, 65, 37, 22, 33, 49, 17, 65, 240, 240, + 0, 0, // Padding + + // + // Block 137 Offsets: Codepoints 0x8bb8 - 0x8bb8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 137 Data: Codepoints 0x8bb8 - 0x8bb8 + // + 31, 14, 241, 65, 146, 33, 161, 33, 214, 35, 33, 33, + 113, 81, 113, 81, 113, 25, 49, 81, 113, 17, 49, 99, + 65, 113, 81, 209, 240, 240, 48, + 0, // Padding + + // + // Block 138 Offsets: Codepoints 0x8bbe - 0x8bbe + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 138 Data: Codepoints 0x8bbe - 0x8bbe + // + 37, 14, 241, 84, 82, 49, 33, 97, 49, 33, 161, 33, + 51, 49, 51, 49, 33, 161, 54, 65, 65, 33, 81, 65, + 33, 81, 17, 50, 83, 66, 97, 50, 35, 82, 81, 240, + 240, + 0, 0, 0, // Padding + + // + // Block 139 Offsets: Codepoints 0x8bed - 0x8bed + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 139 Data: Codepoints 0x8bed - 0x8bed + // + 33, 14, 225, 161, 50, 40, 49, 81, 167, 35, 65, 49, + 65, 65, 49, 65, 25, 49, 209, 54, 65, 17, 17, 65, + 51, 33, 65, 65, 54, 129, 65, 240, 240, + 0, 0, 0, // Padding + + // + // Block 140 Offsets: Codepoints 0x8f6f - 0x8f6f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 140 Data: Codepoints 0x8f6f - 0x8f6f + // + 39, 14, 240, 33, 65, 129, 65, 86, 37, 49, 65, 65, + 33, 65, 33, 17, 49, 17, 81, 70, 49, 113, 81, 113, + 81, 115, 49, 68, 65, 18, 49, 17, 49, 50, 65, 33, + 81, 240, 224, + 0, // Padding + + // + // Block 141 Offsets: Codepoints 0x90e8 - 0x90e8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 141 Data: Codepoints 0x90e8 - 0x90e8 + // + 46, 14, 240, 34, 53, 81, 49, 49, 25, 49, 33, 65, + 17, 33, 65, 33, 33, 33, 41, 17, 177, 33, 54, 17, + 49, 33, 65, 17, 49, 33, 65, 18, 33, 33, 65, 17, + 19, 38, 17, 33, 49, 65, 17, 240, 240, 48, + 0, 0, // Padding + + // + // Block 142 Offsets: Codepoints 0x914d - 0x914d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 142 Data: Codepoints 0x914d - 0x914d + // + 47, 14, 240, 65, 37, 23, 81, 49, 17, 113, 49, 17, + 113, 23, 17, 49, 17, 17, 17, 17, 21, 17, 17, 17, + 17, 17, 49, 18, 35, 17, 81, 81, 17, 87, 17, 81, + 81, 17, 49, 23, 17, 49, 17, 81, 36, 240, 224, + 0, // Padding + + // + // Block 143 Offsets: Codepoints 0x94ae - 0x94ae + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 143 Data: Codepoints 0x94ae - 0x94ae + // + 40, 14, 241, 145, 49, 71, 36, 49, 33, 33, 113, 33, + 52, 49, 33, 65, 81, 33, 65, 54, 37, 33, 49, 65, + 65, 49, 65, 65, 49, 65, 17, 33, 49, 51, 49, 49, + 65, 40, 240, 224, + // + // Block 144 Offsets: Codepoints 0x9593 - 0x9593 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 144 Data: Codepoints 0x9593 - 0x9593 + // + 42, 14, 230, 22, 17, 65, 17, 65, 22, 22, 17, 65, + 17, 65, 22, 22, 17, 177, 17, 39, 33, 17, 33, 81, + 33, 17, 39, 33, 17, 33, 81, 33, 17, 39, 33, 17, + 33, 84, 17, 161, 240, 240, + 0, 0, // Padding + + // + // Block 145 Offsets: Codepoints 0x95ea - 0x95ea + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 145 Data: Codepoints 0x95ea - 0x95ea + // + 43, 14, 241, 56, 50, 129, 17, 33, 129, 17, 81, 81, + 17, 81, 81, 17, 81, 81, 17, 81, 81, 17, 65, 17, + 65, 17, 49, 49, 49, 17, 33, 81, 33, 17, 17, 97, + 33, 17, 147, 17, 161, 240, 240, + 0, // Padding + + // + // Block 146 Offsets: Codepoints 0x95f4 - 0x95f4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 146 Data: Codepoints 0x95f4 - 0x95f4 + // + 43, 14, 241, 56, 49, 145, 17, 177, 17, 38, 49, 17, + 33, 65, 49, 17, 33, 65, 49, 17, 38, 49, 17, 33, + 65, 49, 17, 33, 65, 49, 17, 38, 49, 17, 33, 66, + 33, 17, 147, 17, 161, 240, 240, + 0, // Padding + + // + // Block 147 Offsets: Codepoints 0x9762 - 0x9762 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 147 Data: Codepoints 0x9762 - 0x9762 + // + 38, 14, 240, 161, 45, 113, 139, 49, 33, 49, 33, 49, + 33, 49, 33, 49, 37, 33, 49, 33, 49, 33, 49, 37, + 33, 49, 33, 49, 33, 49, 33, 49, 33, 59, 49, 145, + 240, 240, + 0, 0, // Padding + + // + // Block 148 Offsets: Codepoints 0xac00 - 0xac00 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 148 Data: Codepoints 0xac00 - 0xac00 + // + 26, 13, 240, 66, 209, 193, 70, 33, 129, 49, 129, 49, + 113, 68, 49, 81, 81, 97, 65, 113, 193, 193, 193, 193, + 240, 32, + 0, 0, // Padding + + // + // Block 149 Offsets: Codepoints 0xac19 - 0xac19 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 149 Data: Codepoints 0xac19 - 0xac19 + // + 24, 14, 240, 98, 225, 70, 49, 145, 49, 129, 68, 65, + 81, 97, 97, 66, 232, 113, 215, 113, 216, 240, 240, 16, + // + // Block 150 Offsets: Codepoints 0xac1c - 0xac1c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 150 Data: Codepoints 0xac1c - 0xac1c + // + 37, 12, 240, 98, 129, 33, 129, 33, 22, 17, 33, 81, + 33, 33, 81, 33, 33, 65, 52, 65, 49, 33, 49, 65, + 33, 33, 81, 33, 17, 97, 33, 129, 33, 129, 33, 177, + 208, + 0, 0, 0, // Padding + + // + // Block 151 Offsets: Codepoints 0xac83 - 0xac83 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 151 Data: Codepoints 0xac83 - 0xac83 + // + 30, 11, 240, 66, 161, 22, 49, 97, 49, 81, 65, 65, + 21, 65, 81, 49, 97, 33, 49, 49, 113, 33, 98, 129, + 33, 97, 66, 49, 240, 64, + 0, 0, // Padding + + // + // Block 152 Offsets: Codepoints 0xac8c - 0xac8c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 152 Data: Codepoints 0xac8c - 0xac8c + // + 36, 12, 240, 83, 129, 33, 129, 33, 21, 33, 33, 81, + 33, 33, 65, 49, 33, 69, 33, 49, 65, 33, 33, 81, + 33, 17, 97, 33, 129, 33, 129, 33, 129, 33, 177, 208, + // + // Block 153 Offsets: Codepoints 0xacf5 - 0xacf5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 153 Data: Codepoints 0xacf5 - 0xacf5 + // + 23, 13, 240, 216, 193, 129, 49, 129, 33, 145, 124, 240, + 66, 164, 130, 34, 113, 65, 113, 50, 132, 240, 48, + 0, // Padding + + // + // Block 154 Offsets: Codepoints 0xacfc - 0xacfc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 154 Data: Codepoints 0xacfc - 0xacfc + // + 28, 14, 240, 114, 209, 86, 33, 161, 33, 161, 33, 98, + 33, 33, 113, 33, 36, 65, 81, 113, 81, 74, 209, 209, + 209, 209, 240, 48, + // + // Block 155 Offsets: Codepoints 0xad6c - 0xad6d + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x1a, 0x00, 0x00, 0x00, // Offset 26 (0x1a) + + // + // Block 155 Data: Codepoints 0xad6c - 0xad6d + // + 18, 14, 240, 248, 209, 209, 209, 209, 193, 93, 113, 209, + 209, 209, 209, 209, 240, 96, 18, 14, 240, 248, 209, 209, + 209, 193, 93, 113, 209, 152, 209, 209, 209, 209, 240, 48, + // + // Block 156 Offsets: Codepoints 0xadf8 - 0xadf8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 156 Data: Codepoints 0xadf8 - 0xadf8 + // + 16, 13, 240, 240, 169, 193, 193, 177, 193, 193, 193, 177, + 92, 0, 6, 80, + // + // Block 157 Offsets: Codepoints 0xae30 - 0xae30 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 157 Data: Codepoints 0xae30 - 0xae30 + // + 26, 11, 240, 50, 177, 161, 22, 49, 97, 49, 97, 49, + 81, 65, 65, 81, 49, 97, 33, 113, 17, 129, 161, 161, + 161, 192, + 0, 0, // Padding + + // + // Block 158 Offsets: Codepoints 0xaed8 - 0xaed8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 158 Data: Codepoints 0xaed8 - 0xaed8 + // + 46, 12, 240, 65, 18, 145, 17, 17, 33, 18, 17, 17, + 36, 17, 17, 17, 65, 17, 33, 17, 49, 33, 33, 17, + 49, 36, 17, 33, 33, 49, 17, 17, 49, 49, 17, 65, + 65, 17, 145, 17, 145, 17, 145, 17, 240, 160, + 0, 0, // Padding + + // + // Block 159 Offsets: Codepoints 0xb110 - 0xb110 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 159 Data: Codepoints 0xb110 - 0xb110 + // + 23, 11, 240, 35, 161, 33, 113, 33, 53, 33, 113, 33, + 81, 17, 38, 33, 247, 161, 56, 65, 168, 240, 128, + 0, // Padding + + // + // Block 160 Offsets: Codepoints 0xb204 - 0xb204 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 160 Data: Codepoints 0xb204 - 0xb204 + // + 18, 13, 240, 194, 193, 193, 193, 200, 240, 28, 97, 193, + 193, 193, 193, 193, 240, 80, + 0, 0, // Padding + + // + // Block 161 Offsets: Codepoints 0xb20c - 0xb20c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 161 Data: Codepoints 0xb20c - 0xb20c + // + 19, 14, 240, 240, 17, 209, 209, 216, 240, 45, 113, 167, + 209, 119, 113, 216, 240, 240, 16, + 0, // Padding + + // + // Block 162 Offsets: Codepoints 0xb294 - 0xb294 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 162 Data: Codepoints 0xb294 - 0xb294 + // + 18, 14, 240, 242, 209, 209, 209, 216, 240, 45, 240, 34, + 209, 209, 216, 240, 240, 16, + 0, 0, // Padding + + // + // Block 163 Offsets: Codepoints 0xb2a5 - 0xb2a5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 163 Data: Codepoints 0xb2a5 - 0xb2a5 + // + 22, 14, 240, 17, 225, 209, 209, 216, 240, 240, 29, 113, + 196, 146, 34, 129, 65, 130, 34, 148, 240, 64, + 0, 0, // Padding + + // + // Block 164 Offsets: Codepoints 0xb2c8 - 0xb2c8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 164 Data: Codepoints 0xb2c8 - 0xb2c8 + // + 26, 10, 240, 17, 162, 145, 17, 113, 17, 113, 17, 113, + 17, 113, 17, 98, 17, 21, 17, 33, 97, 145, 145, 145, + 145, 176, + 0, 0, // Padding + + // + // Block 165 Offsets: Codepoints 0xb2e4 - 0xb2e4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 165 Data: Codepoints 0xb2e4 - 0xb2e4 + // + 26, 14, 240, 98, 225, 209, 71, 33, 81, 113, 81, 113, + 81, 116, 33, 113, 81, 83, 86, 33, 209, 209, 209, 209, + 240, 48, + 0, 0, // Padding + + // + // Block 166 Offsets: Codepoints 0xb2e8 - 0xb2e8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 166 Data: Codepoints 0xb2e8 - 0xb2e8 + // + 26, 14, 240, 114, 209, 70, 49, 81, 113, 81, 113, 81, + 116, 33, 83, 86, 33, 209, 113, 81, 113, 209, 216, 240, + 240, 16, + 0, 0, // Padding + + // + // Block 167 Offsets: Codepoints 0xb300 - 0xb300 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 167 Data: Codepoints 0xb300 - 0xb300 + // + 36, 11, 240, 66, 129, 17, 129, 17, 22, 17, 17, 33, + 81, 17, 33, 81, 17, 33, 83, 33, 81, 17, 33, 51, + 17, 36, 33, 17, 129, 17, 129, 17, 129, 17, 161, 192, + // + // Block 168 Offsets: Codepoints 0xb370 - 0xb370 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 168 Data: Codepoints 0xb370 - 0xb370 + // + 38, 11, 240, 66, 129, 17, 129, 17, 21, 33, 17, 33, + 81, 17, 33, 36, 17, 33, 81, 17, 33, 81, 17, 33, + 34, 17, 17, 50, 49, 17, 129, 17, 129, 17, 129, 17, + 161, 192, + 0, 0, // Padding + + // + // Block 169 Offsets: Codepoints 0xb3d9 - 0xb3d9 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 169 Data: Codepoints 0xb3d9 - 0xb3d9 + // + 21, 14, 240, 249, 97, 209, 216, 145, 209, 125, 240, 84, + 146, 34, 129, 65, 130, 34, 148, 240, 64, + 0, 0, 0, // Padding + + // + // Block 170 Offsets: Codepoints 0xb418 - 0xb418 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 170 Data: Codepoints 0xb418 - 0xb418 + // + 26, 11, 240, 66, 161, 23, 33, 33, 113, 33, 113, 33, + 113, 38, 33, 81, 65, 81, 65, 86, 20, 81, 161, 161, + 161, 192, + 0, 0, // Padding + + // + // Block 171 Offsets: Codepoints 0xb77c - 0xb77c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 171 Data: Codepoints 0xb77c - 0xb77c + // + 28, 14, 240, 114, 209, 71, 33, 145, 49, 145, 49, 145, + 49, 71, 36, 33, 113, 81, 113, 81, 68, 85, 49, 209, + 209, 209, 240, 48, + // + // Block 172 Offsets: Codepoints 0xb798 - 0xb798 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 172 Data: Codepoints 0xb798 - 0xb798 + // + 37, 12, 240, 81, 146, 18, 129, 33, 21, 33, 33, 81, + 33, 33, 81, 33, 33, 37, 20, 33, 81, 33, 33, 81, + 33, 33, 21, 33, 49, 65, 33, 129, 33, 129, 33, 177, + 208, + 0, 0, 0, // Padding + + // + // Block 173 Offsets: Codepoints 0xb7a8 - 0xb7a8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 173 Data: Codepoints 0xb7a8 - 0xb7a8 + // + 35, 12, 240, 98, 129, 33, 21, 33, 33, 81, 33, 33, + 17, 50, 20, 37, 17, 33, 33, 81, 33, 33, 51, 33, + 36, 33, 120, 81, 81, 81, 81, 87, 81, 240, 64, + 0, // Padding + + // + // Block 174 Offsets: Codepoints 0xb7ec - 0xb7ec + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 174 Data: Codepoints 0xb7ec - 0xb7ec + // + 28, 11, 240, 66, 161, 22, 49, 97, 49, 97, 49, 97, + 49, 22, 19, 33, 113, 33, 113, 33, 65, 33, 37, 49, + 161, 161, 161, 192, + // + // Block 175 Offsets: Codepoints 0xb85c - 0xb85c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 175 Data: Codepoints 0xb85c - 0xb85c + // + 17, 13, 240, 240, 169, 193, 193, 73, 81, 193, 200, 145, + 193, 108, 240, 240, 160, + 0, 0, 0, // Padding + + // + // Block 176 Offsets: Codepoints 0xb86d - 0xb86d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 176 Data: Codepoints 0xb86d - 0xb86d + // + 20, 14, 240, 248, 209, 104, 113, 215, 161, 125, 145, 130, + 65, 134, 129, 65, 134, 129, 240, 128, + // + // Block 177 Offsets: Codepoints 0xb974 - 0xb974 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 177 Data: Codepoints 0xb974 - 0xb974 + // + 16, 13, 240, 240, 168, 193, 193, 89, 81, 193, 200, 240, + 236, 240, 240, 160, + // + // Block 178 Offsets: Codepoints 0xb97c - 0xb97c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 178 Data: Codepoints 0xb97c - 0xb97c + // + 17, 13, 240, 216, 193, 88, 97, 199, 60, 240, 39, 193, + 88, 97, 200, 240, 208, + 0, 0, 0, // Padding + + // + // Block 179 Offsets: Codepoints 0xb9ac - 0xb9ac + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 179 Data: Codepoints 0xb9ac - 0xb9ac + // + 27, 11, 240, 66, 161, 22, 49, 97, 49, 97, 49, 97, + 49, 22, 49, 33, 113, 33, 113, 33, 68, 37, 49, 161, + 161, 161, 192, + 0, // Padding + + // + // Block 180 Offsets: Codepoints 0xb9cc - 0xb9cc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 180 Data: Codepoints 0xb9cc - 0xb9cc + // + 31, 14, 240, 114, 209, 71, 33, 81, 65, 33, 81, 49, + 49, 81, 49, 52, 33, 49, 49, 86, 33, 81, 113, 113, + 81, 129, 209, 215, 240, 240, 16, + 0, // Padding + + // + // Block 181 Offsets: Codepoints 0xba70 - 0xba70 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 181 Data: Codepoints 0xba70 - 0xba70 + // + 27, 11, 240, 50, 177, 161, 22, 49, 33, 53, 33, 49, + 49, 33, 49, 49, 33, 53, 37, 49, 33, 113, 161, 161, + 161, 161, 192, + 0, // Padding + + // + // Block 182 Offsets: Codepoints 0xba74 - 0xba74 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 182 Data: Codepoints 0xba74 - 0xba74 + // + 28, 12, 240, 82, 177, 38, 49, 49, 53, 49, 49, 49, + 49, 49, 49, 49, 53, 53, 49, 49, 113, 82, 65, 97, + 177, 183, 240, 160, + // + // Block 183 Offsets: Codepoints 0xbbf8 - 0xbbf8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 183 Data: Codepoints 0xbbf8 - 0xbbf8 + // + 29, 11, 240, 50, 177, 161, 22, 49, 33, 49, 49, 33, + 49, 49, 33, 49, 49, 33, 49, 49, 37, 49, 33, 113, + 161, 161, 161, 161, 192, + 0, 0, 0, // Padding + + // + // Block 184 Offsets: Codepoints 0xbc84 - 0xbc84 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 184 Data: Codepoints 0xbc84 - 0xbc84 + // + 28, 10, 240, 209, 82, 33, 17, 65, 33, 17, 65, 33, + 25, 17, 65, 33, 17, 65, 33, 22, 33, 17, 113, 145, + 145, 145, 145, 176, + // + // Block 185 Offsets: Codepoints 0xbcf4 - 0xbcf4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 185 Data: Codepoints 0xbcf4 - 0xbcf4 + // + 23, 14, 240, 240, 98, 113, 81, 113, 81, 119, 113, 81, + 113, 81, 119, 113, 33, 209, 209, 125, 240, 240, 208, + 0, // Padding + + // + // Block 186 Offsets: Codepoints 0xbe0c - 0xbe0c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 186 Data: Codepoints 0xbe0c - 0xbe0c + // + 22, 14, 240, 240, 98, 113, 81, 113, 81, 119, 113, 81, + 113, 81, 119, 113, 240, 240, 141, 240, 240, 208, + 0, 0, // Padding + + // + // Block 187 Offsets: Codepoints 0xc0ac - 0xc0ac + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 187 Data: Codepoints 0xc0ac - 0xc0ac + // + 30, 14, 240, 98, 225, 114, 65, 129, 65, 113, 81, 113, + 81, 97, 17, 68, 49, 33, 49, 81, 65, 33, 65, 129, + 209, 209, 209, 209, 240, 48, + 0, 0, // Padding + + // + // Block 188 Offsets: Codepoints 0xc0c8 - 0xc0c8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 188 Data: Codepoints 0xc0c8 - 0xc0c8 + // + 40, 13, 240, 114, 146, 33, 66, 49, 33, 81, 49, 33, + 81, 49, 33, 65, 65, 33, 66, 52, 49, 33, 33, 33, + 33, 65, 17, 33, 17, 81, 17, 33, 145, 33, 145, 33, + 145, 33, 193, 224, + // + // Block 189 Offsets: Codepoints 0xc124 - 0xc124 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 189 Data: Codepoints 0xc124 - 0xc124 + // + 25, 11, 240, 50, 81, 65, 81, 65, 65, 36, 66, 65, + 49, 33, 49, 33, 65, 33, 247, 161, 71, 81, 167, 240, + 128, + 0, 0, 0, // Padding + + // + // Block 190 Offsets: Codepoints 0xc131 - 0xc131 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 190 Data: Codepoints 0xc131 - 0xc131 + // + 29, 11, 240, 50, 177, 66, 65, 65, 81, 65, 36, 50, + 81, 33, 34, 49, 17, 129, 113, 33, 100, 98, 34, 81, + 65, 81, 50, 100, 208, + 0, 0, 0, // Padding + + // + // Block 191 Offsets: Codepoints 0xc18c - 0xc18c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 191 Data: Codepoints 0xc18c - 0xc18c + // + 20, 13, 240, 240, 241, 193, 178, 161, 34, 113, 82, 50, + 33, 209, 193, 193, 108, 240, 240, 160, + // + // Block 192 Offsets: Codepoints 0xc218 - 0xc218 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 192 Data: Codepoints 0xc218 - 0xc218 + // + 21, 14, 240, 66, 209, 194, 177, 34, 114, 82, 240, 240, + 29, 113, 209, 209, 209, 209, 209, 240, 96, + 0, 0, 0, // Padding + + // + // Block 193 Offsets: Codepoints 0xc2dc - 0xc2dc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 193 Data: Codepoints 0xc2dc - 0xc2dc + // + 29, 12, 240, 81, 194, 82, 65, 97, 65, 81, 81, 81, + 81, 65, 17, 65, 49, 49, 49, 33, 81, 33, 17, 145, + 177, 177, 177, 177, 208, + 0, 0, 0, // Padding + + // + // Block 194 Offsets: Codepoints 0xc2ed - 0xc2ed + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 194 Data: Codepoints 0xc2ed - 0xc2ed + // + 30, 11, 240, 161, 66, 81, 65, 81, 65, 65, 81, 49, + 18, 49, 33, 65, 33, 17, 129, 65, 66, 81, 65, 86, + 81, 65, 86, 81, 240, 32, + 0, 0, // Padding + + // + // Block 195 Offsets: Codepoints 0xc5b4 - 0xc5b4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 195 Data: Codepoints 0xc5b4 - 0xc5b4 + // + 28, 11, 240, 51, 161, 50, 81, 36, 65, 18, 49, 49, + 17, 69, 17, 65, 49, 18, 49, 49, 36, 65, 161, 161, + 161, 161, 161, 192, + // + // Block 196 Offsets: Codepoints 0xc5b8 - 0xc5b8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 196 Data: Codepoints 0xc5b8 - 0xc5b8 + // + 29, 12, 240, 82, 65, 97, 52, 65, 34, 49, 49, 33, + 69, 33, 65, 49, 34, 49, 49, 52, 65, 177, 66, 81, + 81, 177, 184, 240, 160, + 0, 0, 0, // Padding + + // + // Block 197 Offsets: Codepoints 0xc5c5 - 0xc5c5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 197 Data: Codepoints 0xc5c5 - 0xc5c5 + // + 30, 11, 240, 50, 65, 97, 36, 65, 18, 49, 49, 17, + 69, 18, 49, 49, 36, 65, 161, 50, 81, 65, 81, 71, + 65, 81, 71, 65, 240, 48, + 0, 0, // Padding + + // + // Block 198 Offsets: Codepoints 0xc5c8 - 0xc5c8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 198 Data: Codepoints 0xc5c8 - 0xc5c8 + // + 34, 13, 240, 82, 98, 81, 68, 65, 50, 49, 49, 49, + 69, 50, 49, 49, 68, 65, 193, 98, 50, 113, 49, 129, + 49, 113, 17, 17, 17, 81, 49, 50, 240, 192, + 0, 0, // Padding + + // + // Block 199 Offsets: Codepoints 0xc5d0 - 0xc5d0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 199 Data: Codepoints 0xc5d0 - 0xc5d0 + // + 42, 12, 240, 49, 19, 129, 33, 49, 65, 33, 35, 49, + 33, 18, 33, 33, 33, 17, 52, 33, 17, 49, 33, 33, + 18, 33, 33, 33, 35, 49, 33, 129, 33, 129, 33, 129, + 33, 129, 33, 129, 33, 208, + 0, 0, // Padding + + // + // Block 200 Offsets: Codepoints 0xc5ec - 0xc5ec + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 200 Data: Codepoints 0xc5ec - 0xc5ec + // + 28, 11, 240, 51, 161, 50, 81, 36, 65, 18, 38, 17, + 65, 49, 17, 65, 49, 18, 33, 20, 36, 65, 161, 161, + 161, 161, 161, 192, + // + // Block 201 Offsets: Codepoints 0xc624 - 0xc624 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 201 Data: Codepoints 0xc624 - 0xc624 + // + 23, 14, 240, 240, 65, 180, 146, 50, 113, 81, 113, 81, + 113, 81, 130, 18, 177, 209, 209, 125, 240, 240, 208, + 0, // Padding + + // + // Block 202 Offsets: Codepoints 0xc640 - 0xc640 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 202 Data: Codepoints 0xc640 - 0xc640 + // + 30, 14, 240, 99, 129, 65, 100, 49, 82, 34, 33, 81, + 65, 33, 82, 34, 33, 100, 52, 81, 65, 129, 65, 74, + 209, 209, 209, 240, 240, 32, + 0, 0, // Padding + + // + // Block 203 Offsets: Codepoints 0xc6a9 - 0xc6a9 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 203 Data: Codepoints 0xc6a9 - 0xc6a9 + // + 26, 13, 240, 50, 164, 130, 34, 113, 65, 113, 49, 149, + 129, 49, 76, 98, 164, 130, 34, 113, 65, 114, 34, 132, + 240, 48, + 0, 0, // Padding + + // + // Block 204 Offsets: Codepoints 0xc6d0 - 0xc6d0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 204 Data: Codepoints 0xc6d0 - 0xc6d0 + // + 30, 12, 241, 66, 67, 65, 50, 34, 33, 49, 65, 33, + 50, 34, 33, 68, 49, 145, 17, 39, 33, 81, 36, 81, + 81, 81, 177, 184, 240, 160, + 0, 0, // Padding + + // + // Block 205 Offsets: Codepoints 0xc6e8 - 0xc6e8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 205 Data: Codepoints 0xc6e8 - 0xc6e8 + // + 45, 12, 240, 97, 81, 50, 17, 52, 33, 17, 34, 49, + 17, 17, 33, 65, 17, 17, 33, 50, 17, 17, 52, 33, + 17, 21, 49, 17, 65, 65, 17, 65, 20, 17, 65, 65, + 17, 65, 65, 17, 65, 65, 17, 177, 208, + 0, 0, 0, // Padding + + // + // Block 206 Offsets: Codepoints 0xc720 - 0xc720 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 206 Data: Codepoints 0xc720 - 0xc720 + // + 26, 13, 240, 65, 164, 130, 34, 113, 65, 113, 50, 132, + 240, 60, 81, 49, 129, 49, 129, 49, 129, 49, 129, 49, + 240, 240, + 0, 0, // Padding + + // + // Block 207 Offsets: Codepoints 0xc73c - 0xc73c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 207 Data: Codepoints 0xc73c - 0xc73c + // + 21, 14, 240, 240, 65, 180, 146, 50, 113, 81, 113, 81, + 114, 50, 133, 0, 5, 125, 240, 240, 208, + 0, 0, 0, // Padding + + // + // Block 208 Offsets: Codepoints 0xc740 - 0xc740 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 208 Data: Codepoints 0xc740 - 0xc740 + // + 22, 14, 240, 81, 181, 130, 50, 113, 81, 114, 50, 133, + 240, 77, 240, 34, 209, 209, 216, 240, 240, 16, + 0, 0, // Padding + + // + // Block 209 Offsets: Codepoints 0xc744 - 0xc744 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 209 Data: Codepoints 0xc744 - 0xc744 + // + 21, 13, 240, 50, 164, 130, 34, 113, 65, 114, 34, 132, + 240, 60, 56, 177, 104, 97, 199, 240, 224, + 0, 0, 0, // Padding + + // + // Block 210 Offsets: Codepoints 0xc74c - 0xc74c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 210 Data: Codepoints 0xc74c - 0xc74c + // + 24, 13, 240, 50, 164, 130, 34, 113, 65, 113, 50, 132, + 240, 60, 240, 23, 113, 65, 113, 65, 119, 97, 240, 112, + // + // Block 211 Offsets: Codepoints 0xc751 - 0xc751 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 211 Data: Codepoints 0xc751 - 0xc751 + // + 25, 13, 240, 49, 180, 130, 34, 113, 65, 113, 50, 132, + 240, 60, 97, 180, 130, 34, 113, 65, 114, 34, 132, 240, + 48, + 0, 0, 0, // Padding + + // + // Block 212 Offsets: Codepoints 0xc758 - 0xc758 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 212 Data: Codepoints 0xc758 - 0xc758 + // + 30, 11, 240, 51, 66, 65, 52, 49, 34, 34, 33, 33, + 65, 33, 33, 65, 33, 34, 34, 33, 52, 49, 161, 146, + 24, 17, 161, 161, 161, 192, + 0, 0, // Padding + + // + // Block 213 Offsets: Codepoints 0xc774 - 0xc774 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 213 Data: Codepoints 0xc774 - 0xc774 + // + 29, 11, 240, 51, 161, 50, 81, 36, 65, 18, 34, 49, + 17, 65, 49, 17, 65, 49, 18, 34, 49, 36, 65, 161, + 161, 161, 161, 161, 192, + 0, 0, 0, // Padding + + // + // Block 214 Offsets: Codepoints 0xc785 - 0xc785 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 214 Data: Codepoints 0xc785 - 0xc785 + // + 30, 11, 240, 50, 65, 97, 36, 65, 18, 34, 49, 17, + 65, 49, 18, 34, 49, 36, 65, 226, 81, 65, 81, 71, + 65, 81, 71, 65, 240, 48, + 0, 0, // Padding + + // + // Block 215 Offsets: Codepoints 0xc788 - 0xc788 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 215 Data: Codepoints 0xc788 - 0xc788 + // + 35, 13, 240, 82, 98, 81, 68, 65, 50, 34, 49, 49, + 65, 49, 50, 34, 49, 68, 65, 193, 98, 50, 113, 49, + 113, 65, 97, 18, 17, 17, 145, 50, 97, 240, 80, + 0, // Padding + + // + // Block 216 Offsets: Codepoints 0xc804 - 0xc804 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 216 Data: Codepoints 0xc804 - 0xc804 + // + 27, 12, 240, 82, 177, 53, 49, 113, 49, 98, 49, 97, + 20, 82, 65, 65, 34, 33, 34, 113, 82, 65, 97, 177, + 183, 240, 160, + 0, // Padding + + // + // Block 217 Offsets: Codepoints 0xc815 - 0xc815 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 217 Data: Codepoints 0xc815 - 0xc815 + // + 30, 11, 240, 50, 177, 22, 49, 81, 65, 81, 20, 66, + 65, 49, 33, 49, 18, 65, 33, 114, 17, 100, 98, 34, + 81, 65, 82, 34, 100, 208, + 0, 0, // Padding + + // + // Block 218 Offsets: Codepoints 0xc81c - 0xc81c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 218 Data: Codepoints 0xc81c - 0xc81c + // + 40, 11, 240, 65, 130, 17, 129, 17, 21, 33, 17, 81, + 33, 17, 65, 49, 17, 65, 19, 17, 50, 49, 17, 33, + 33, 33, 17, 17, 65, 17, 17, 129, 17, 129, 17, 129, + 17, 129, 17, 192, + // + // Block 219 Offsets: Codepoints 0xc904 - 0xc904 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 219 Data: Codepoints 0xc904 - 0xc904 + // + 19, 14, 240, 248, 177, 193, 163, 20, 81, 189, 113, 152, + 209, 104, 113, 216, 240, 240, 16, + 0, // Padding + + // + // Block 220 Offsets: Codepoints 0xc90d - 0xc90d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 220 Data: Codepoints 0xc90d - 0xc90d + // + 23, 14, 240, 248, 177, 193, 163, 20, 81, 189, 113, 145, + 49, 18, 113, 81, 119, 113, 81, 119, 113, 240, 144, + 0, // Padding + + // + // Block 221 Offsets: Codepoints 0xc989 - 0xc989 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 221 Data: Codepoints 0xc989 - 0xc989 + // + 18, 13, 240, 215, 177, 177, 162, 19, 67, 97, 252, 240, + 24, 193, 193, 193, 240, 224, + 0, 0, // Padding + + // + // Block 222 Offsets: Codepoints 0xc9c0 - 0xc9c0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 222 Data: Codepoints 0xc9c0 - 0xc9c0 + // + 27, 11, 240, 227, 161, 22, 49, 97, 49, 81, 65, 81, + 65, 66, 65, 49, 33, 49, 33, 65, 33, 17, 129, 161, + 161, 161, 192, + 0, // Padding + + // + // Block 223 Offsets: Codepoints 0xccb4 - 0xccb4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 223 Data: Codepoints 0xccb4 - 0xccb4 + // + 39, 12, 240, 82, 130, 33, 35, 49, 33, 129, 33, 21, + 33, 33, 65, 49, 33, 65, 19, 33, 50, 49, 33, 33, + 33, 33, 33, 17, 65, 17, 33, 129, 33, 129, 33, 129, + 33, 177, 208, + 0, // Padding + + // + // Block 224 Offsets: Codepoints 0xd2b8 - 0xd2b8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 224 Data: Codepoints 0xd2b8 - 0xd2b8 + // + 16, 13, 240, 240, 169, 81, 193, 200, 81, 193, 200, 240, + 236, 240, 240, 160, + // + // Block 225 Offsets: Codepoints 0xd2bc - 0xd2bc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 225 Data: Codepoints 0xd2bc - 0xd2bc + // + 18, 14, 240, 248, 113, 215, 113, 215, 240, 240, 45, 240, + 49, 209, 216, 240, 240, 16, + 0, 0, // Padding + + // + // Block 226 Offsets: Codepoints 0xd2f0 - 0xd2f0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 226 Data: Codepoints 0xd2f0 - 0xd2f0 + // + 26, 11, 240, 49, 178, 161, 23, 33, 33, 113, 33, 113, + 38, 33, 33, 113, 33, 113, 33, 38, 35, 81, 161, 161, + 161, 192, + 0, 0, // Padding + + // + // Block 227 Offsets: Codepoints 0xd2f8 - 0xd2f8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 227 Data: Codepoints 0xd2f8 - 0xd2f8 + // + 22, 12, 240, 66, 193, 38, 49, 49, 113, 53, 49, 49, + 113, 57, 240, 39, 177, 72, 81, 184, 240, 160, + 0, 0, // Padding + + // + // Block 228 Offsets: Codepoints 0xd328 - 0xd328 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 228 Data: Codepoints 0xd328 - 0xd328 + // + 39, 12, 240, 83, 129, 33, 129, 33, 24, 33, 81, 33, + 33, 49, 33, 17, 33, 49, 33, 20, 49, 33, 17, 33, + 49, 33, 17, 33, 21, 18, 33, 129, 33, 129, 33, 129, + 33, 177, 208, + 0, // Padding + + // + // Block 229 Offsets: Codepoints 0xd504 - 0xd504 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 229 Data: Codepoints 0xd504 - 0xd504 + // + 19, 13, 240, 240, 185, 146, 129, 49, 129, 49, 129, 49, + 105, 240, 240, 188, 240, 240, 160, + 0, // Padding + + // + // Block 230 Offsets: Codepoints 0xd53d - 0xd53d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 230 Data: Codepoints 0xd53d - 0xd53d + // + 25, 11, 240, 51, 161, 23, 33, 81, 65, 49, 33, 49, + 49, 33, 49, 49, 33, 49, 26, 232, 161, 161, 161, 161, + 192, + 0, 0, 0, // Padding + + // + // Block 231 Offsets: Codepoints 0xd558 - 0xd558 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 231 Data: Codepoints 0xd558 - 0xd558 + // + 29, 14, 240, 240, 98, 100, 49, 209, 72, 17, 100, 49, + 82, 34, 36, 33, 65, 33, 82, 34, 33, 100, 49, 209, + 209, 209, 209, 240, 48, + 0, 0, 0, // Padding + + // + // Block 232 Offsets: Codepoints 0xd55c - 0xd55c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 232 Data: Codepoints 0xd55c - 0xd55c + // + 29, 14, 240, 114, 99, 65, 209, 71, 33, 99, 65, 81, + 49, 52, 33, 49, 49, 81, 49, 49, 99, 65, 209, 114, + 209, 215, 240, 240, 16, + 0, 0, 0, // Padding + + // + // Block 233 Offsets: Codepoints 0xd560 - 0xd560 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 233 Data: Codepoints 0xd560 - 0xd560 + // + 29, 14, 240, 99, 99, 65, 71, 33, 99, 65, 81, 49, + 49, 81, 49, 52, 33, 49, 49, 99, 65, 119, 209, 104, + 113, 216, 240, 240, 16, + 0, 0, 0, // Padding + + // + // Block 234 Offsets: Codepoints 0xd568 - 0xd568 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 234 Data: Codepoints 0xd568 - 0xd568 + // + 31, 14, 240, 99, 99, 65, 209, 71, 33, 99, 65, 81, + 49, 52, 33, 49, 49, 81, 49, 49, 99, 65, 119, 113, + 81, 113, 81, 119, 113, 240, 144, + 0, // Padding + + // + // Block 235 Offsets: Codepoints 0xd654 - 0xd654 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 235 Data: Codepoints 0xd654 - 0xd654 + // + 32, 14, 240, 114, 100, 49, 209, 72, 17, 100, 49, 81, + 65, 33, 81, 65, 36, 49, 33, 49, 114, 65, 113, 36, + 67, 18, 49, 209, 209, 240, 240, 32, + // + // Block 236 Offsets: Codepoints 0xd658 - 0xd658 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 236 Data: Codepoints 0xd658 - 0xd658 + // + 29, 14, 240, 114, 115, 49, 87, 17, 115, 49, 97, 49, + 33, 97, 49, 33, 113, 17, 52, 81, 65, 74, 209, 129, + 209, 215, 240, 240, 16, + 0, 0, 0, // Padding + + // + // Block 237 Offsets: Codepoints 0xd6a8 - 0xd6a8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 237 Data: Codepoints 0xd6a8 - 0xd6a8 + // + 22, 13, 240, 244, 240, 74, 100, 130, 34, 113, 65, 114, + 34, 133, 129, 49, 129, 49, 76, 240, 240, 160, + 0, 0, // Padding + + // + // Block 238 Offsets: Codepoints 0xd6c4 - 0xd6c4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 238 Data: Codepoints 0xd6c4 - 0xd6c4 + // + 21, 13, 240, 244, 106, 100, 130, 34, 113, 65, 114, 34, + 132, 92, 113, 193, 193, 193, 193, 240, 64, + 0, 0, 0, // Padding + + // + // Block 239 Offsets: Codepoints 0xff0c - 0xff0c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 239 Data: Codepoints 0xff0c - 0xff0c + // + 9, 3, 240, 50, 18, 33, 17, 240, 80, + 0, 0, 0, // Padding + + // + // Block 240 Offsets: Codepoints 0xff1a - 0xff1a + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 240 Data: Codepoints 0xff1a - 0xff1a + // + 8, 3, 194, 18, 162, 18, 240, 16, +}; + +tFont *g_psFontWCustom14pt = (tFont *)g_pui8Custom14pt; diff --git a/third_party/fonts/lang_demo/fontcustom20pt.c b/third_party/fonts/lang_demo/fontcustom20pt.c new file mode 100644 index 0000000..5c1db11 --- /dev/null +++ b/third_party/fonts/lang_demo/fontcustom20pt.c @@ -0,0 +1,5265 @@ +//***************************************************************************** +// +// fontcustom20pt.c - Font definition for the 20ptpt Custom font. +// +// Copyright (c) 2011 Texas Instruments Incorporated. All rights reserved. +// TI Information - Selective Disclosure +// +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 323 in 241 blocks +// Style: custom +// Size: 20pt +// Bold: no +// Italic: no +// Memory usage: 16804 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Custom20pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 18, + + // + // The height of the font. + // + 23, + + // + // The baseline of the font. + // + 18, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (241). + // + 241, 0, + + // + // Block header 0: Codepoints 0x20 - 0x20 + // + 0x20, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x54, 0x0b, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x27 - 0x27 + // + 0x27, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x60, 0x0b, 0x00, 0x00, + + // + // Block header 2: Codepoints 0x2b - 0x2e + // + 0x2b, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, + 0x70, 0x0b, 0x00, 0x00, + + // + // Block header 3: Codepoints 0x30 - 0x3a + // + 0x30, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, + 0xa8, 0x0b, 0x00, 0x00, + + // + // Block header 4: Codepoints 0x41 - 0x47 + // + 0x41, 0x00, 0x00, 0x00, + 0x07, 0x00, 0x00, 0x00, + 0xe4, 0x0c, 0x00, 0x00, + + // + // Block header 5: Codepoints 0x49 - 0x49 + // + 0x49, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xbc, 0x0d, 0x00, 0x00, + + // + // Block header 6: Codepoints 0x4b - 0x55 + // + 0x4b, 0x00, 0x00, 0x00, + 0x0b, 0x00, 0x00, 0x00, + 0xd8, 0x0d, 0x00, 0x00, + + // + // Block header 7: Codepoints 0x57 - 0x57 + // + 0x57, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x64, 0x0f, 0x00, 0x00, + + // + // Block header 8: Codepoints 0x59 - 0x59 + // + 0x59, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa0, 0x0f, 0x00, 0x00, + + // + // Block header 9: Codepoints 0x5b - 0x5b + // + 0x5b, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc0, 0x0f, 0x00, 0x00, + + // + // Block header 10: Codepoints 0x5d - 0x5d + // + 0x5d, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xdc, 0x0f, 0x00, 0x00, + + // + // Block header 11: Codepoints 0x5f - 0x5f + // + 0x5f, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf8, 0x0f, 0x00, 0x00, + + // + // Block header 12: Codepoints 0x61 - 0x69 + // + 0x61, 0x00, 0x00, 0x00, + 0x09, 0x00, 0x00, 0x00, + 0x04, 0x10, 0x00, 0x00, + + // + // Block header 13: Codepoints 0x6b - 0x77 + // + 0x6b, 0x00, 0x00, 0x00, + 0x0d, 0x00, 0x00, 0x00, + 0x0c, 0x11, 0x00, 0x00, + + // + // Block header 14: Codepoints 0x79 - 0x7a + // + 0x79, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x98, 0x12, 0x00, 0x00, + + // + // Block header 15: Codepoints 0xc4 - 0xc4 + // + 0xc4, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd0, 0x12, 0x00, 0x00, + + // + // Block header 16: Codepoints 0xe4 - 0xe4 + // + 0xe4, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf4, 0x12, 0x00, 0x00, + + // + // Block header 17: Codepoints 0xe9 - 0xe9 + // + 0xe9, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x18, 0x13, 0x00, 0x00, + + // + // Block header 18: Codepoints 0xf1 - 0xf1 + // + 0xf1, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x38, 0x13, 0x00, 0x00, + + // + // Block header 19: Codepoints 0xf3 - 0xf3 + // + 0xf3, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x5c, 0x13, 0x00, 0x00, + + // + // Block header 20: Codepoints 0xf6 - 0xf6 + // + 0xf6, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x80, 0x13, 0x00, 0x00, + + // + // Block header 21: Codepoints 0xfc - 0xfc + // + 0xfc, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa4, 0x13, 0x00, 0x00, + + // + // Block header 22: Codepoints 0x201c - 0x201d + // + 0x1c, 0x20, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xc8, 0x13, 0x00, 0x00, + + // + // Block header 23: Codepoints 0x3001 - 0x3002 + // + 0x01, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xec, 0x13, 0x00, 0x00, + + // + // Block header 24: Codepoints 0x3042 - 0x3042 + // + 0x42, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x10, 0x14, 0x00, 0x00, + + // + // Block header 25: Codepoints 0x3044 - 0x3044 + // + 0x44, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x44, 0x14, 0x00, 0x00, + + // + // Block header 26: Codepoints 0x3048 - 0x3048 + // + 0x48, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x6c, 0x14, 0x00, 0x00, + + // + // Block header 27: Codepoints 0x304c - 0x304d + // + 0x4c, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x90, 0x14, 0x00, 0x00, + + // + // Block header 28: Codepoints 0x304f - 0x3050 + // + 0x4f, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xe0, 0x14, 0x00, 0x00, + + // + // Block header 29: Codepoints 0x3053 - 0x3053 + // + 0x53, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x1c, 0x15, 0x00, 0x00, + + // + // Block header 30: Codepoints 0x3055 - 0x3055 + // + 0x55, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x34, 0x15, 0x00, 0x00, + + // + // Block header 31: Codepoints 0x3057 - 0x3059 + // + 0x57, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x54, 0x15, 0x00, 0x00, + + // + // Block header 32: Codepoints 0x305f - 0x3060 + // + 0x5f, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xb8, 0x15, 0x00, 0x00, + + // + // Block header 33: Codepoints 0x3066 - 0x3068 + // + 0x66, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x04, 0x16, 0x00, 0x00, + + // + // Block header 34: Codepoints 0x306a - 0x306b + // + 0x6a, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x64, 0x16, 0x00, 0x00, + + // + // Block header 35: Codepoints 0x306e - 0x306f + // + 0x6e, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xac, 0x16, 0x00, 0x00, + + // + // Block header 36: Codepoints 0x307e - 0x307e + // + 0x7e, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x04, 0x17, 0x00, 0x00, + + // + // Block header 37: Codepoints 0x3081 - 0x3081 + // + 0x81, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x24, 0x17, 0x00, 0x00, + + // + // Block header 38: Codepoints 0x3089 - 0x308c + // + 0x89, 0x30, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, + 0x58, 0x17, 0x00, 0x00, + + // + // Block header 39: Codepoints 0x3092 - 0x3092 + // + 0x92, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf8, 0x17, 0x00, 0x00, + + // + // Block header 40: Codepoints 0x30a2 - 0x30a4 + // + 0xa2, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x24, 0x18, 0x00, 0x00, + + // + // Block header 41: Codepoints 0x30a6 - 0x30a7 + // + 0xa6, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x78, 0x18, 0x00, 0x00, + + // + // Block header 42: Codepoints 0x30af - 0x30b1 + // + 0xaf, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0xac, 0x18, 0x00, 0x00, + + // + // Block header 43: Codepoints 0x30b5 - 0x30b5 + // + 0xb5, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x08, 0x19, 0x00, 0x00, + + // + // Block header 44: Codepoints 0x30b7 - 0x30b9 + // + 0xb7, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x2c, 0x19, 0x00, 0x00, + + // + // Block header 45: Codepoints 0x30bd - 0x30bd + // + 0xbd, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x80, 0x19, 0x00, 0x00, + + // + // Block header 46: Codepoints 0x30bf - 0x30bf + // + 0xbf, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x9c, 0x19, 0x00, 0x00, + + // + // Block header 47: Codepoints 0x30c3 - 0x30c3 + // + 0xc3, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xbc, 0x19, 0x00, 0x00, + + // + // Block header 48: Codepoints 0x30c6 - 0x30c6 + // + 0xc6, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd8, 0x19, 0x00, 0x00, + + // + // Block header 49: Codepoints 0x30c8 - 0x30c8 + // + 0xc8, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf4, 0x19, 0x00, 0x00, + + // + // Block header 50: Codepoints 0x30cd - 0x30cd + // + 0xcd, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x10, 0x1a, 0x00, 0x00, + + // + // Block header 51: Codepoints 0x30d1 - 0x30d1 + // + 0xd1, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x34, 0x1a, 0x00, 0x00, + + // + // Block header 52: Codepoints 0x30d5 - 0x30d7 + // + 0xd5, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x58, 0x1a, 0x00, 0x00, + + // + // Block header 53: Codepoints 0x30dc - 0x30dd + // + 0xdc, 0x30, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0xa8, 0x1a, 0x00, 0x00, + + // + // Block header 54: Codepoints 0x30e1 - 0x30e1 + // + 0xe1, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf4, 0x1a, 0x00, 0x00, + + // + // Block header 55: Codepoints 0x30e5 - 0x30e7 + // + 0xe5, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x10, 0x1b, 0x00, 0x00, + + // + // Block header 56: Codepoints 0x30e9 - 0x30eb + // + 0xe9, 0x30, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0x4c, 0x1b, 0x00, 0x00, + + // + // Block header 57: Codepoints 0x30f3 - 0x30f3 + // + 0xf3, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb0, 0x1b, 0x00, 0x00, + + // + // Block header 58: Codepoints 0x30fc - 0x30fc + // + 0xfc, 0x30, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc8, 0x1b, 0x00, 0x00, + + // + // Block header 59: Codepoints 0x4e0b - 0x4e0b + // + 0x0b, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd8, 0x1b, 0x00, 0x00, + + // + // Block header 60: Codepoints 0x4e0e - 0x4e0e + // + 0x0e, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x08, 0x1c, 0x00, 0x00, + + // + // Block header 61: Codepoints 0x4e2d - 0x4e2d + // + 0x2d, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x34, 0x1c, 0x00, 0x00, + + // + // Block header 62: Codepoints 0x4e4b - 0x4e4b + // + 0x4b, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x68, 0x1c, 0x00, 0x00, + + // + // Block header 63: Codepoints 0x4ecb - 0x4ecb + // + 0xcb, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x98, 0x1c, 0x00, 0x00, + + // + // Block header 64: Codepoints 0x4ee3 - 0x4ee3 + // + 0xe3, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xcc, 0x1c, 0x00, 0x00, + + // + // Block header 65: Codepoints 0x4ee5 - 0x4ee5 + // + 0xe5, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x04, 0x1d, 0x00, 0x00, + + // + // Block header 66: Codepoints 0x4ef6 - 0x4ef6 + // + 0xf6, 0x4e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x3c, 0x1d, 0x00, 0x00, + + // + // Block header 67: Codepoints 0x4f1a - 0x4f1a + // + 0x1a, 0x4f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x78, 0x1d, 0x00, 0x00, + + // + // Block header 68: Codepoints 0x4f9b - 0x4f9b + // + 0x9b, 0x4f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa8, 0x1d, 0x00, 0x00, + + // + // Block header 69: Codepoints 0x4fe1 - 0x4fe1 + // + 0xe1, 0x4f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xec, 0x1d, 0x00, 0x00, + + // + // Block header 70: Codepoints 0x50cf - 0x50cf + // + 0xcf, 0x50, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x24, 0x1e, 0x00, 0x00, + + // + // Block header 71: Codepoints 0x5141 - 0x5141 + // + 0x41, 0x51, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x70, 0x1e, 0x00, 0x00, + + // + // Block header 72: Codepoints 0x5207 - 0x5207 + // + 0x07, 0x52, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa4, 0x1e, 0x00, 0x00, + + // + // Block header 73: Codepoints 0x529b - 0x529b + // + 0x9b, 0x52, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe4, 0x1e, 0x00, 0x00, + + // + // Block header 74: Codepoints 0x52a8 - 0x52a8 + // + 0xa8, 0x52, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x14, 0x1f, 0x00, 0x00, + + // + // Block header 75: Codepoints 0x52b9 - 0x52b9 + // + 0xb9, 0x52, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x54, 0x1f, 0x00, 0x00, + + // + // Block header 76: Codepoints 0x52d5 - 0x52d5 + // + 0xd5, 0x52, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa0, 0x1f, 0x00, 0x00, + + // + // Block header 77: Codepoints 0x5373 - 0x5373 + // + 0x73, 0x53, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe8, 0x1f, 0x00, 0x00, + + // + // Block header 78: Codepoints 0x53d6 - 0x53d6 + // + 0xd6, 0x53, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x34, 0x20, 0x00, 0x00, + + // + // Block header 79: Codepoints 0x53ef - 0x53ef + // + 0xef, 0x53, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x78, 0x20, 0x00, 0x00, + + // + // Block header 80: Codepoints 0x540e - 0x540e + // + 0x0e, 0x54, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xac, 0x20, 0x00, 0x00, + + // + // Block header 81: Codepoints 0x548c - 0x548c + // + 0x8c, 0x54, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe0, 0x20, 0x00, 0x00, + + // + // Block header 82: Codepoints 0x54cd - 0x54cd + // + 0xcd, 0x54, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x24, 0x21, 0x00, 0x00, + + // + // Block header 83: Codepoints 0x56fd - 0x56fe + // + 0xfd, 0x56, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x74, 0x21, 0x00, 0x00, + + // + // Block header 84: Codepoints 0x5728 - 0x5728 + // + 0x28, 0x57, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf4, 0x21, 0x00, 0x00, + + // + // Block header 85: Codepoints 0x5831 - 0x5831 + // + 0x31, 0x58, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x28, 0x22, 0x00, 0x00, + + // + // Block header 86: Codepoints 0x5b9a - 0x5b9a + // + 0x9a, 0x5b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x74, 0x22, 0x00, 0x00, + + // + // Block header 87: Codepoints 0x5b9e - 0x5b9e + // + 0x9e, 0x5b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa4, 0x22, 0x00, 0x00, + + // + // Block header 88: Codepoints 0x5c06 - 0x5c06 + // + 0x06, 0x5c, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd8, 0x22, 0x00, 0x00, + + // + // Block header 89: Codepoints 0x5c4f - 0x5c4f + // + 0x4f, 0x5c, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x1c, 0x23, 0x00, 0x00, + + // + // Block header 90: Codepoints 0x5e55 - 0x5e55 + // + 0x55, 0x5e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x58, 0x23, 0x00, 0x00, + + // + // Block header 91: Codepoints 0x5e8f - 0x5e8f + // + 0x8f, 0x5e, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x90, 0x23, 0x00, 0x00, + + // + // Block header 92: Codepoints 0x5e93 - 0x5e95 + // + 0x93, 0x5e, 0x00, 0x00, + 0x03, 0x00, 0x00, 0x00, + 0xc4, 0x23, 0x00, 0x00, + + // + // Block header 93: Codepoints 0x5f62 - 0x5f62 + // + 0x62, 0x5f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x78, 0x24, 0x00, 0x00, + + // + // Block header 94: Codepoints 0x5f71 - 0x5f71 + // + 0x71, 0x5f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb4, 0x24, 0x00, 0x00, + + // + // Block header 95: Codepoints 0x5f8c - 0x5f8c + // + 0x8c, 0x5f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf4, 0x24, 0x00, 0x00, + + // + // Block header 96: Codepoints 0x606f - 0x606f + // + 0x6f, 0x60, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x38, 0x25, 0x00, 0x00, + + // + // Block header 97: Codepoints 0x60a8 - 0x60a8 + // + 0xa8, 0x60, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x6c, 0x25, 0x00, 0x00, + + // + // Block header 98: Codepoints 0x60c5 - 0x60c5 + // + 0xc5, 0x60, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb0, 0x25, 0x00, 0x00, + + // + // Block header 99: Codepoints 0x6210 - 0x6210 + // + 0x10, 0x62, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf0, 0x25, 0x00, 0x00, + + // + // Block header 100: Codepoints 0x62bc - 0x62bc + // + 0xbc, 0x62, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x38, 0x26, 0x00, 0x00, + + // + // Block header 101: Codepoints 0x6301 - 0x6301 + // + 0x01, 0x63, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x7c, 0x26, 0x00, 0x00, + + // + // Block header 102: Codepoints 0x6309 - 0x6309 + // + 0x09, 0x63, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb4, 0x26, 0x00, 0x00, + + // + // Block header 103: Codepoints 0x6362 - 0x6362 + // + 0x62, 0x63, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf4, 0x26, 0x00, 0x00, + + // + // Block header 104: Codepoints 0x63d0 - 0x63d0 + // + 0xd0, 0x63, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x3c, 0x27, 0x00, 0x00, + + // + // Block header 105: Codepoints 0x63db - 0x63db + // + 0xdb, 0x63, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x7c, 0x27, 0x00, 0x00, + + // + // Block header 106: Codepoints 0x652f - 0x652f + // + 0x2f, 0x65, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc8, 0x27, 0x00, 0x00, + + // + // Block header 107: Codepoints 0x65b0 - 0x65b0 + // + 0xb0, 0x65, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf8, 0x27, 0x00, 0x00, + + // + // Block header 108: Codepoints 0x65e5 - 0x65e5 + // + 0xe5, 0x65, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x44, 0x28, 0x00, 0x00, + + // + // Block header 109: Codepoints 0x6620 - 0x6620 + // + 0x20, 0x66, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x70, 0x28, 0x00, 0x00, + + // + // Block header 110: Codepoints 0x662f - 0x662f + // + 0x2f, 0x66, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xbc, 0x28, 0x00, 0x00, + + // + // Block header 111: Codepoints 0x66f4 - 0x66f4 + // + 0xf4, 0x66, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xec, 0x28, 0x00, 0x00, + + // + // Block header 112: Codepoints 0x66ff - 0x66ff + // + 0xff, 0x66, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x20, 0x29, 0x00, 0x00, + + // + // Block header 113: Codepoints 0x672c - 0x672c + // + 0x2c, 0x67, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x58, 0x29, 0x00, 0x00, + + // + // Block header 114: Codepoints 0x677f - 0x677f + // + 0x7f, 0x67, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x90, 0x29, 0x00, 0x00, + + // + // Block header 115: Codepoints 0x679c - 0x679c + // + 0x9c, 0x67, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd8, 0x29, 0x00, 0x00, + + // + // Block header 116: Codepoints 0x69cb - 0x69cb + // + 0xcb, 0x69, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x10, 0x2a, 0x00, 0x00, + + // + // Block header 117: Codepoints 0x6a5f - 0x6a5f + // + 0x5f, 0x6a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x58, 0x2a, 0x00, 0x00, + + // + // Block header 118: Codepoints 0x6b21 - 0x6b21 + // + 0x21, 0x6b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb8, 0x2a, 0x00, 0x00, + + // + // Block header 119: Codepoints 0x6b64 - 0x6b64 + // + 0x64, 0x6b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf8, 0x2a, 0x00, 0x00, + + // + // Block header 120: Codepoints 0x6f14 - 0x6f14 + // + 0x14, 0x6f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x38, 0x2b, 0x00, 0x00, + + // + // Block header 121: Codepoints 0x73b0 - 0x73b0 + // + 0xb0, 0x73, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x78, 0x2b, 0x00, 0x00, + + // + // Block header 122: Codepoints 0x7528 - 0x7528 + // + 0x28, 0x75, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc4, 0x2b, 0x00, 0x00, + + // + // Block header 123: Codepoints 0x753b - 0x753b + // + 0x3b, 0x75, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xfc, 0x2b, 0x00, 0x00, + + // + // Block header 124: Codepoints 0x7684 - 0x7684 + // + 0x84, 0x76, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x40, 0x2c, 0x00, 0x00, + + // + // Block header 125: Codepoints 0x793a - 0x793a + // + 0x3a, 0x79, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x84, 0x2c, 0x00, 0x00, + + // + // Block header 126: Codepoints 0x79fb - 0x79fb + // + 0xfb, 0x79, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb0, 0x2c, 0x00, 0x00, + + // + // Block header 127: Codepoints 0x7a0b - 0x7a0b + // + 0x0b, 0x7a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf4, 0x2c, 0x00, 0x00, + + // + // Block header 128: Codepoints 0x7acb - 0x7acb + // + 0xcb, 0x7a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x34, 0x2d, 0x00, 0x00, + + // + // Block header 129: Codepoints 0x7b80 - 0x7b80 + // + 0x80, 0x7b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x64, 0x2d, 0x00, 0x00, + + // + // Block header 130: Codepoints 0x7f6e - 0x7f6e + // + 0x6e, 0x7f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xac, 0x2d, 0x00, 0x00, + + // + // Block header 131: Codepoints 0x80fd - 0x80fd + // + 0xfd, 0x80, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xdc, 0x2d, 0x00, 0x00, + + // + // Block header 132: Codepoints 0x898b - 0x898b + // + 0x8b, 0x89, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x20, 0x2e, 0x00, 0x00, + + // + // Block header 133: Codepoints 0x89c1 - 0x89c1 + // + 0xc1, 0x89, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x50, 0x2e, 0x00, 0x00, + + // + // Block header 134: Codepoints 0x8a00 - 0x8a00 + // + 0x00, 0x8a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x8c, 0x2e, 0x00, 0x00, + + // + // Block header 135: Codepoints 0x8a2d - 0x8a2d + // + 0x2d, 0x8a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb4, 0x2e, 0x00, 0x00, + + // + // Block header 136: Codepoints 0x8a9e - 0x8a9e + // + 0x9e, 0x8a, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf4, 0x2e, 0x00, 0x00, + + // + // Block header 137: Codepoints 0x8bb8 - 0x8bb8 + // + 0xb8, 0x8b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x30, 0x2f, 0x00, 0x00, + + // + // Block header 138: Codepoints 0x8bbe - 0x8bbe + // + 0xbe, 0x8b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x68, 0x2f, 0x00, 0x00, + + // + // Block header 139: Codepoints 0x8bed - 0x8bed + // + 0xed, 0x8b, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa4, 0x2f, 0x00, 0x00, + + // + // Block header 140: Codepoints 0x8f6f - 0x8f6f + // + 0x6f, 0x8f, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe0, 0x2f, 0x00, 0x00, + + // + // Block header 141: Codepoints 0x90e8 - 0x90e8 + // + 0xe8, 0x90, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x24, 0x30, 0x00, 0x00, + + // + // Block header 142: Codepoints 0x914d - 0x914d + // + 0x4d, 0x91, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x6c, 0x30, 0x00, 0x00, + + // + // Block header 143: Codepoints 0x94ae - 0x94ae + // + 0xae, 0x94, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb4, 0x30, 0x00, 0x00, + + // + // Block header 144: Codepoints 0x9593 - 0x9593 + // + 0x93, 0x95, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf8, 0x30, 0x00, 0x00, + + // + // Block header 145: Codepoints 0x95ea - 0x95ea + // + 0xea, 0x95, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x3c, 0x31, 0x00, 0x00, + + // + // Block header 146: Codepoints 0x95f4 - 0x95f4 + // + 0xf4, 0x95, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x7c, 0x31, 0x00, 0x00, + + // + // Block header 147: Codepoints 0x9762 - 0x9762 + // + 0x62, 0x97, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc0, 0x31, 0x00, 0x00, + + // + // Block header 148: Codepoints 0xac00 - 0xac00 + // + 0x00, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x00, 0x32, 0x00, 0x00, + + // + // Block header 149: Codepoints 0xac19 - 0xac19 + // + 0x19, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x30, 0x32, 0x00, 0x00, + + // + // Block header 150: Codepoints 0xac1c - 0xac1c + // + 0x1c, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x5c, 0x32, 0x00, 0x00, + + // + // Block header 151: Codepoints 0xac83 - 0xac83 + // + 0x83, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x98, 0x32, 0x00, 0x00, + + // + // Block header 152: Codepoints 0xac8c - 0xac8c + // + 0x8c, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc8, 0x32, 0x00, 0x00, + + // + // Block header 153: Codepoints 0xacf5 - 0xacf5 + // + 0xf5, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x04, 0x33, 0x00, 0x00, + + // + // Block header 154: Codepoints 0xacfc - 0xacfc + // + 0xfc, 0xac, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x2c, 0x33, 0x00, 0x00, + + // + // Block header 155: Codepoints 0xad6c - 0xad6d + // + 0x6c, 0xad, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, + 0x60, 0x33, 0x00, 0x00, + + // + // Block header 156: Codepoints 0xadf8 - 0xadf8 + // + 0xf8, 0xad, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb8, 0x33, 0x00, 0x00, + + // + // Block header 157: Codepoints 0xae30 - 0xae30 + // + 0x30, 0xae, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xdc, 0x33, 0x00, 0x00, + + // + // Block header 158: Codepoints 0xaed8 - 0xaed8 + // + 0xd8, 0xae, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x04, 0x34, 0x00, 0x00, + + // + // Block header 159: Codepoints 0xb110 - 0xb110 + // + 0x10, 0xb1, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x48, 0x34, 0x00, 0x00, + + // + // Block header 160: Codepoints 0xb204 - 0xb204 + // + 0x04, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x74, 0x34, 0x00, 0x00, + + // + // Block header 161: Codepoints 0xb20c - 0xb20c + // + 0x0c, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa0, 0x34, 0x00, 0x00, + + // + // Block header 162: Codepoints 0xb294 - 0xb294 + // + 0x94, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xcc, 0x34, 0x00, 0x00, + + // + // Block header 163: Codepoints 0xb2a5 - 0xb2a5 + // + 0xa5, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf8, 0x34, 0x00, 0x00, + + // + // Block header 164: Codepoints 0xb2c8 - 0xb2c8 + // + 0xc8, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x20, 0x35, 0x00, 0x00, + + // + // Block header 165: Codepoints 0xb2e4 - 0xb2e4 + // + 0xe4, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x48, 0x35, 0x00, 0x00, + + // + // Block header 166: Codepoints 0xb2e8 - 0xb2e8 + // + 0xe8, 0xb2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x78, 0x35, 0x00, 0x00, + + // + // Block header 167: Codepoints 0xb300 - 0xb300 + // + 0x00, 0xb3, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa8, 0x35, 0x00, 0x00, + + // + // Block header 168: Codepoints 0xb370 - 0xb370 + // + 0x70, 0xb3, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe4, 0x35, 0x00, 0x00, + + // + // Block header 169: Codepoints 0xb3d9 - 0xb3d9 + // + 0xd9, 0xb3, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x20, 0x36, 0x00, 0x00, + + // + // Block header 170: Codepoints 0xb418 - 0xb418 + // + 0x18, 0xb4, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x4c, 0x36, 0x00, 0x00, + + // + // Block header 171: Codepoints 0xb77c - 0xb77c + // + 0x7c, 0xb7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x78, 0x36, 0x00, 0x00, + + // + // Block header 172: Codepoints 0xb798 - 0xb798 + // + 0x98, 0xb7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa8, 0x36, 0x00, 0x00, + + // + // Block header 173: Codepoints 0xb7a8 - 0xb7a8 + // + 0xa8, 0xb7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe4, 0x36, 0x00, 0x00, + + // + // Block header 174: Codepoints 0xb7ec - 0xb7ec + // + 0xec, 0xb7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x18, 0x37, 0x00, 0x00, + + // + // Block header 175: Codepoints 0xb85c - 0xb85c + // + 0x5c, 0xb8, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x44, 0x37, 0x00, 0x00, + + // + // Block header 176: Codepoints 0xb86d - 0xb86d + // + 0x6d, 0xb8, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x68, 0x37, 0x00, 0x00, + + // + // Block header 177: Codepoints 0xb974 - 0xb974 + // + 0x74, 0xb9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x90, 0x37, 0x00, 0x00, + + // + // Block header 178: Codepoints 0xb97c - 0xb97c + // + 0x7c, 0xb9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb0, 0x37, 0x00, 0x00, + + // + // Block header 179: Codepoints 0xb9ac - 0xb9ac + // + 0xac, 0xb9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd8, 0x37, 0x00, 0x00, + + // + // Block header 180: Codepoints 0xb9cc - 0xb9cc + // + 0xcc, 0xb9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x00, 0x38, 0x00, 0x00, + + // + // Block header 181: Codepoints 0xba70 - 0xba70 + // + 0x70, 0xba, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x34, 0x38, 0x00, 0x00, + + // + // Block header 182: Codepoints 0xba74 - 0xba74 + // + 0x74, 0xba, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x60, 0x38, 0x00, 0x00, + + // + // Block header 183: Codepoints 0xbbf8 - 0xbbf8 + // + 0xf8, 0xbb, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x94, 0x38, 0x00, 0x00, + + // + // Block header 184: Codepoints 0xbc84 - 0xbc84 + // + 0x84, 0xbc, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc0, 0x38, 0x00, 0x00, + + // + // Block header 185: Codepoints 0xbcf4 - 0xbcf4 + // + 0xf4, 0xbc, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf0, 0x38, 0x00, 0x00, + + // + // Block header 186: Codepoints 0xbe0c - 0xbe0c + // + 0x0c, 0xbe, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x14, 0x39, 0x00, 0x00, + + // + // Block header 187: Codepoints 0xc0ac - 0xc0ac + // + 0xac, 0xc0, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x34, 0x39, 0x00, 0x00, + + // + // Block header 188: Codepoints 0xc0c8 - 0xc0c8 + // + 0xc8, 0xc0, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x6c, 0x39, 0x00, 0x00, + + // + // Block header 189: Codepoints 0xc124 - 0xc124 + // + 0x24, 0xc1, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xac, 0x39, 0x00, 0x00, + + // + // Block header 190: Codepoints 0xc131 - 0xc131 + // + 0x31, 0xc1, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xdc, 0x39, 0x00, 0x00, + + // + // Block header 191: Codepoints 0xc18c - 0xc18c + // + 0x8c, 0xc1, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x0c, 0x3a, 0x00, 0x00, + + // + // Block header 192: Codepoints 0xc218 - 0xc218 + // + 0x18, 0xc2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x34, 0x3a, 0x00, 0x00, + + // + // Block header 193: Codepoints 0xc2dc - 0xc2dc + // + 0xdc, 0xc2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x60, 0x3a, 0x00, 0x00, + + // + // Block header 194: Codepoints 0xc2ed - 0xc2ed + // + 0xed, 0xc2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x94, 0x3a, 0x00, 0x00, + + // + // Block header 195: Codepoints 0xc5b4 - 0xc5b4 + // + 0xb4, 0xc5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc4, 0x3a, 0x00, 0x00, + + // + // Block header 196: Codepoints 0xc5b8 - 0xc5b8 + // + 0xb8, 0xc5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xf0, 0x3a, 0x00, 0x00, + + // + // Block header 197: Codepoints 0xc5c5 - 0xc5c5 + // + 0xc5, 0xc5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x20, 0x3b, 0x00, 0x00, + + // + // Block header 198: Codepoints 0xc5c8 - 0xc5c8 + // + 0xc8, 0xc5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x50, 0x3b, 0x00, 0x00, + + // + // Block header 199: Codepoints 0xc5d0 - 0xc5d0 + // + 0xd0, 0xc5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x84, 0x3b, 0x00, 0x00, + + // + // Block header 200: Codepoints 0xc5ec - 0xc5ec + // + 0xec, 0xc5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc0, 0x3b, 0x00, 0x00, + + // + // Block header 201: Codepoints 0xc624 - 0xc624 + // + 0x24, 0xc6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xec, 0x3b, 0x00, 0x00, + + // + // Block header 202: Codepoints 0xc640 - 0xc640 + // + 0x40, 0xc6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x14, 0x3c, 0x00, 0x00, + + // + // Block header 203: Codepoints 0xc6a9 - 0xc6a9 + // + 0xa9, 0xc6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x48, 0x3c, 0x00, 0x00, + + // + // Block header 204: Codepoints 0xc6d0 - 0xc6d0 + // + 0xd0, 0xc6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x74, 0x3c, 0x00, 0x00, + + // + // Block header 205: Codepoints 0xc6e8 - 0xc6e8 + // + 0xe8, 0xc6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa8, 0x3c, 0x00, 0x00, + + // + // Block header 206: Codepoints 0xc720 - 0xc720 + // + 0x20, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xec, 0x3c, 0x00, 0x00, + + // + // Block header 207: Codepoints 0xc73c - 0xc73c + // + 0x3c, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x1c, 0x3d, 0x00, 0x00, + + // + // Block header 208: Codepoints 0xc740 - 0xc740 + // + 0x40, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x3c, 0x3d, 0x00, 0x00, + + // + // Block header 209: Codepoints 0xc744 - 0xc744 + // + 0x44, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x64, 0x3d, 0x00, 0x00, + + // + // Block header 210: Codepoints 0xc74c - 0xc74c + // + 0x4c, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x8c, 0x3d, 0x00, 0x00, + + // + // Block header 211: Codepoints 0xc751 - 0xc751 + // + 0x51, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb4, 0x3d, 0x00, 0x00, + + // + // Block header 212: Codepoints 0xc758 - 0xc758 + // + 0x58, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe0, 0x3d, 0x00, 0x00, + + // + // Block header 213: Codepoints 0xc774 - 0xc774 + // + 0x74, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x14, 0x3e, 0x00, 0x00, + + // + // Block header 214: Codepoints 0xc785 - 0xc785 + // + 0x85, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x40, 0x3e, 0x00, 0x00, + + // + // Block header 215: Codepoints 0xc788 - 0xc788 + // + 0x88, 0xc7, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x70, 0x3e, 0x00, 0x00, + + // + // Block header 216: Codepoints 0xc804 - 0xc804 + // + 0x04, 0xc8, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa8, 0x3e, 0x00, 0x00, + + // + // Block header 217: Codepoints 0xc815 - 0xc815 + // + 0x15, 0xc8, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xd8, 0x3e, 0x00, 0x00, + + // + // Block header 218: Codepoints 0xc81c - 0xc81c + // + 0x1c, 0xc8, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x08, 0x3f, 0x00, 0x00, + + // + // Block header 219: Codepoints 0xc904 - 0xc904 + // + 0x04, 0xc9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x44, 0x3f, 0x00, 0x00, + + // + // Block header 220: Codepoints 0xc90d - 0xc90d + // + 0x0d, 0xc9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x6c, 0x3f, 0x00, 0x00, + + // + // Block header 221: Codepoints 0xc989 - 0xc989 + // + 0x89, 0xc9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x98, 0x3f, 0x00, 0x00, + + // + // Block header 222: Codepoints 0xc9c0 - 0xc9c0 + // + 0xc0, 0xc9, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc0, 0x3f, 0x00, 0x00, + + // + // Block header 223: Codepoints 0xccb4 - 0xccb4 + // + 0xb4, 0xcc, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xec, 0x3f, 0x00, 0x00, + + // + // Block header 224: Codepoints 0xd2b8 - 0xd2b8 + // + 0xb8, 0xd2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x2c, 0x40, 0x00, 0x00, + + // + // Block header 225: Codepoints 0xd2bc - 0xd2bc + // + 0xbc, 0xd2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x4c, 0x40, 0x00, 0x00, + + // + // Block header 226: Codepoints 0xd2f0 - 0xd2f0 + // + 0xf0, 0xd2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x70, 0x40, 0x00, 0x00, + + // + // Block header 227: Codepoints 0xd2f8 - 0xd2f8 + // + 0xf8, 0xd2, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x98, 0x40, 0x00, 0x00, + + // + // Block header 228: Codepoints 0xd328 - 0xd328 + // + 0x28, 0xd3, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xc0, 0x40, 0x00, 0x00, + + // + // Block header 229: Codepoints 0xd504 - 0xd504 + // + 0x04, 0xd5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xfc, 0x40, 0x00, 0x00, + + // + // Block header 230: Codepoints 0xd53d - 0xd53d + // + 0x3d, 0xd5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x1c, 0x41, 0x00, 0x00, + + // + // Block header 231: Codepoints 0xd558 - 0xd558 + // + 0x58, 0xd5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x4c, 0x41, 0x00, 0x00, + + // + // Block header 232: Codepoints 0xd55c - 0xd55c + // + 0x5c, 0xd5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x80, 0x41, 0x00, 0x00, + + // + // Block header 233: Codepoints 0xd560 - 0xd560 + // + 0x60, 0xd5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xb4, 0x41, 0x00, 0x00, + + // + // Block header 234: Codepoints 0xd568 - 0xd568 + // + 0x68, 0xd5, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe4, 0x41, 0x00, 0x00, + + // + // Block header 235: Codepoints 0xd654 - 0xd654 + // + 0x54, 0xd6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x14, 0x42, 0x00, 0x00, + + // + // Block header 236: Codepoints 0xd658 - 0xd658 + // + 0x58, 0xd6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x48, 0x42, 0x00, 0x00, + + // + // Block header 237: Codepoints 0xd6a8 - 0xd6a8 + // + 0xa8, 0xd6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0x78, 0x42, 0x00, 0x00, + + // + // Block header 238: Codepoints 0xd6c4 - 0xd6c4 + // + 0xc4, 0xd6, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xa0, 0x42, 0x00, 0x00, + + // + // Block header 239: Codepoints 0xff0c - 0xff0c + // + 0x0c, 0xff, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xcc, 0x42, 0x00, 0x00, + + // + // Block header 240: Codepoints 0xff1a - 0xff1a + // + 0x1a, 0xff, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, + 0xe0, 0x42, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x20 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 0 Data: Codepoints 0x20 - 0x20 + // + 5, 9, 0, 25, 112, + 0, 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x27 - 0x27 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 1 Data: Codepoints 0x27 - 0x27 + // + 10, 4, 194, 34, 34, 34, 34, 0, 7, 96, + 0, 0, // Padding + + // + // Block 2 Offsets: Codepoints 0x2b - 0x2e + // + 0x10, 0x00, 0x00, 0x00, // Offset 16 (0x10) + 0x1f, 0x00, 0x00, 0x00, // Offset 31 (0x1f) + 0x29, 0x00, 0x00, 0x00, // Offset 41 (0x29) + 0x31, 0x00, 0x00, 0x00, // Offset 49 (0x31) + + // + // Block 2 Data: Codepoints 0x2b - 0x2e + // + 15, 11, 0, 10, 2, 146, 146, 105, 82, 146, 146, 146, + 0, 11, 96, 10, 5, 0, 10, 3, 65, 50, 34, 240, + 48, 8, 9, 0, 12, 55, 0, 12, 80, 7, 4, 0, + 8, 66, 240, 112, + // + // Block 3 Offsets: Codepoints 0x30 - 0x3a + // + 0x2c, 0x00, 0x00, 0x00, // Offset 44 (0x2c) + 0x4d, 0x00, 0x00, 0x00, // Offset 77 (0x4d) + 0x64, 0x00, 0x00, 0x00, // Offset 100 (0x64) + 0x7b, 0x00, 0x00, 0x00, // Offset 123 (0x7b) + 0x92, 0x00, 0x00, 0x00, // Offset 146 (0x92) + 0xac, 0x00, 0x00, 0x00, // Offset 172 (0xac) + 0xc3, 0x00, 0x00, 0x00, // Offset 195 (0xc3) + 0xe1, 0x00, 0x00, 0x00, // Offset 225 (0xe1) + 0xf6, 0x00, 0x00, 0x00, // Offset 246 (0xf6) + 0x16, 0x01, 0x00, 0x00, // Offset 278 (0x116) + 0x33, 0x01, 0x00, 0x00, // Offset 307 (0x133) + + // + // Block 3 Data: Codepoints 0x30 - 0x3a + // + 33, 12, 0, 6, 52, 114, 35, 66, 66, 50, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 50, 66, 67, 35, 100, 0, 8, 16, 23, 10, 240, + 240, 195, 100, 82, 18, 81, 34, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 88, 0, 6, 64, 23, 11, 240, 240, + 246, 66, 66, 49, 98, 146, 146, 146, 130, 131, 130, 130, + 130, 130, 130, 137, 0, 7, 16, 23, 11, 240, 240, 246, + 66, 66, 162, 146, 131, 115, 84, 163, 162, 146, 146, 146, + 34, 66, 69, 0, 7, 64, 26, 12, 0, 6, 98, 147, + 132, 129, 18, 114, 18, 98, 34, 97, 50, 82, 50, 66, + 66, 74, 130, 162, 162, 162, 0, 8, 23, 12, 0, 6, + 24, 66, 162, 162, 162, 166, 97, 67, 163, 162, 162, 162, + 146, 50, 67, 70, 0, 8, 16, 30, 12, 0, 6, 69, + 82, 65, 66, 161, 162, 162, 21, 67, 66, 50, 98, 34, + 98, 34, 98, 34, 98, 50, 81, 67, 50, 100, 0, 8, + 16, 21, 12, 0, 6, 10, 147, 146, 146, 162, 146, 162, + 146, 162, 146, 162, 161, 162, 162, 0, 8, 64, 32, 12, + 0, 6, 52, 114, 34, 82, 66, 66, 66, 66, 66, 82, + 34, 116, 98, 66, 50, 98, 34, 98, 34, 98, 34, 98, + 50, 66, 100, 0, 8, 16, 29, 12, 0, 6, 52, 98, + 50, 66, 82, 50, 98, 34, 98, 34, 98, 50, 67, 69, + 18, 162, 162, 146, 162, 65, 66, 85, 0, 8, 32, 9, + 4, 240, 240, 162, 240, 178, 240, 112, + // + // Block 4 Offsets: Codepoints 0x41 - 0x47 + // + 0x1c, 0x00, 0x00, 0x00, // Offset 28 (0x1c) + 0x3b, 0x00, 0x00, 0x00, // Offset 59 (0x3b) + 0x5a, 0x00, 0x00, 0x00, // Offset 90 (0x5a) + 0x72, 0x00, 0x00, 0x00, // Offset 114 (0x72) + 0x93, 0x00, 0x00, 0x00, // Offset 147 (0x93) + 0xa8, 0x00, 0x00, 0x00, // Offset 168 (0xa8) + 0xbc, 0x00, 0x00, 0x00, // Offset 188 (0xbc) + + // + // Block 4 Data: Codepoints 0x41 - 0x47 + // + 31, 14, 0, 7, 67, 179, 177, 18, 146, 18, 146, 33, + 145, 50, 114, 50, 114, 66, 97, 82, 89, 82, 98, 50, + 114, 50, 129, 50, 130, 0, 9, 31, 12, 0, 6, 7, + 82, 67, 50, 82, 50, 82, 50, 82, 50, 66, 71, 82, + 82, 50, 98, 34, 98, 34, 98, 34, 98, 34, 82, 56, + 0, 8, 24, 13, 0, 7, 6, 83, 66, 50, 178, 162, + 178, 178, 178, 178, 178, 194, 178, 113, 67, 66, 102, 0, + 8, 64, 33, 13, 0, 6, 71, 98, 67, 66, 98, 50, + 98, 50, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 98, 50, 98, 50, 67, 71, 0, 8, 112, 21, + 11, 240, 240, 232, 50, 146, 146, 146, 146, 152, 50, 146, + 146, 146, 146, 146, 153, 0, 7, 16, 20, 11, 240, 240, + 233, 34, 146, 146, 146, 146, 152, 50, 146, 146, 146, 146, + 146, 146, 0, 8, 28, 14, 0, 7, 71, 83, 67, 50, + 194, 178, 194, 194, 194, 70, 34, 130, 34, 130, 50, 114, + 50, 114, 67, 67, 102, 0, 9, 32, + // + // Block 5 Offsets: Codepoints 0x49 - 0x49 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 5 Data: Codepoints 0x49 - 0x49 + // + 21, 9, 240, 240, 103, 66, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 87, 0, 5, 112, + 0, 0, 0, // Padding + + // + // Block 6 Offsets: Codepoints 0x4b - 0x55 + // + 0x2c, 0x00, 0x00, 0x00, // Offset 44 (0x2c) + 0x4d, 0x00, 0x00, 0x00, // Offset 77 (0x4d) + 0x62, 0x00, 0x00, 0x00, // Offset 98 (0x62) + 0x96, 0x00, 0x00, 0x00, // Offset 150 (0x96) + 0xbf, 0x00, 0x00, 0x00, // Offset 191 (0xbf) + 0xe0, 0x00, 0x00, 0x00, // Offset 224 (0xe0) + 0xfa, 0x00, 0x00, 0x00, // Offset 250 (0xfa) + 0x1c, 0x01, 0x00, 0x00, // Offset 284 (0x11c) + 0x3d, 0x01, 0x00, 0x00, // Offset 317 (0x13d) + 0x54, 0x01, 0x00, 0x00, // Offset 340 (0x154) + 0x69, 0x01, 0x00, 0x00, // Offset 361 (0x169) + + // + // Block 6 Data: Codepoints 0x4b - 0x55 + // + 33, 12, 0, 6, 2, 82, 50, 66, 66, 51, 66, 35, + 82, 34, 98, 18, 116, 133, 114, 19, 98, 34, 98, 50, + 82, 66, 66, 82, 50, 98, 0, 7, 96, 21, 11, 240, + 240, 226, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 153, 0, 7, 16, 52, 16, 0, 8, 3, 131, + 35, 131, 36, 100, 36, 100, 34, 17, 97, 18, 34, 18, + 66, 18, 34, 18, 66, 18, 34, 33, 65, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 49, 33, 50, 34, 52, + 50, 34, 67, 50, 34, 66, 66, 0, 10, 32, 41, 13, + 0, 6, 66, 114, 35, 98, 36, 82, 36, 82, 34, 18, + 66, 34, 33, 66, 34, 34, 50, 34, 50, 34, 34, 65, + 34, 34, 66, 18, 34, 84, 34, 84, 34, 99, 34, 114, + 0, 8, 48, 33, 14, 0, 7, 68, 130, 66, 82, 98, + 66, 98, 50, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 50, 98, 66, 98, 82, 66, 132, 0, 9, 64, + 26, 11, 240, 240, 231, 66, 66, 50, 82, 34, 82, 34, + 82, 34, 82, 34, 66, 55, 66, 146, 146, 146, 146, 146, + 0, 8, 34, 15, 0, 8, 4, 146, 66, 98, 98, 82, + 98, 66, 130, 50, 130, 50, 130, 50, 130, 50, 130, 50, + 130, 66, 98, 82, 98, 98, 66, 150, 228, 194, 0, 6, + 33, 12, 0, 6, 7, 82, 66, 66, 82, 50, 82, 50, + 82, 50, 82, 50, 66, 71, 82, 34, 98, 50, 82, 66, + 66, 66, 66, 82, 50, 98, 0, 7, 96, 23, 11, 0, + 5, 102, 66, 65, 50, 146, 147, 133, 118, 117, 132, 146, + 146, 146, 34, 66, 54, 0, 7, 64, 21, 14, 0, 7, + 12, 114, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 0, 9, 80, 33, 12, 0, 6, 2, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 50, 66, 101, + 0, 8, + 0, 0, // Padding + + // + // Block 7 Offsets: Codepoints 0x57 - 0x57 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 7 Data: Codepoints 0x57 - 0x57 + // + 55, 20, 0, 10, 2, 98, 98, 34, 98, 98, 34, 84, + 82, 49, 84, 82, 50, 66, 17, 66, 66, 65, 34, 50, + 66, 50, 34, 50, 81, 50, 34, 49, 98, 33, 65, 34, + 98, 18, 66, 18, 113, 18, 66, 18, 113, 17, 97, 17, + 131, 99, 131, 99, 0, 13, 16, + 0, // Padding + + // + // Block 8 Offsets: Codepoints 0x59 - 0x59 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 8 Data: Codepoints 0x59 - 0x59 + // + 27, 14, 0, 7, 3, 99, 50, 98, 82, 66, 98, 66, + 114, 34, 131, 18, 148, 178, 194, 194, 194, 194, 194, 194, + 0, 9, 80, + 0, // Padding + + // + // Block 9 Offsets: Codepoints 0x5b - 0x5b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 9 Data: Codepoints 0x5b - 0x5b + // + 23, 6, 240, 52, 34, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 68, 128, + 0, // Padding + + // + // Block 10 Offsets: Codepoints 0x5d - 0x5d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 10 Data: Codepoints 0x5d - 0x5d + // + 23, 6, 240, 52, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 36, 128, + 0, // Padding + + // + // Block 11 Offsets: Codepoints 0x5f - 0x5f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 11 Data: Codepoints 0x5f - 0x5f + // + 7, 14, 0, 35, 12, 240, 240, + 0, // Padding + + // + // Block 12 Offsets: Codepoints 0x61 - 0x69 + // + 0x24, 0x00, 0x00, 0x00, // Offset 36 (0x24) + 0x3e, 0x00, 0x00, 0x00, // Offset 62 (0x3e) + 0x5d, 0x00, 0x00, 0x00, // Offset 93 (0x5d) + 0x70, 0x00, 0x00, 0x00, // Offset 112 (0x70) + 0x8f, 0x00, 0x00, 0x00, // Offset 143 (0x8f) + 0xa4, 0x00, 0x00, 0x00, // Offset 164 (0xa4) + 0xb9, 0x00, 0x00, 0x00, // Offset 185 (0xb9) + 0xd8, 0x00, 0x00, 0x00, // Offset 216 (0xd8) + 0xf8, 0x00, 0x00, 0x00, // Offset 248 (0xf8) + + // + // Block 12 Data: Codepoints 0x61 - 0x69 + // + 26, 12, 0, 12, 54, 82, 50, 66, 66, 50, 82, 50, + 82, 50, 82, 50, 82, 50, 67, 66, 36, 83, 50, 0, + 7, 96, 31, 11, 240, 240, 50, 146, 146, 146, 146, 146, + 20, 68, 34, 51, 66, 34, 82, 34, 82, 34, 82, 34, + 82, 34, 66, 50, 66, 54, 0, 7, 64, 19, 10, 0, + 10, 53, 51, 49, 50, 114, 130, 130, 130, 146, 130, 65, + 85, 0, 6, 64, 31, 12, 240, 240, 210, 162, 162, 162, + 162, 102, 66, 51, 66, 66, 50, 82, 50, 82, 50, 82, + 50, 82, 50, 67, 66, 36, 84, 34, 0, 7, 96, 21, + 11, 0, 11, 52, 82, 50, 65, 82, 34, 82, 41, 34, + 146, 162, 146, 81, 86, 0, 7, 16, 21, 9, 240, 244, + 66, 114, 114, 114, 86, 82, 114, 114, 114, 114, 114, 114, + 114, 114, 0, 6, 32, 31, 11, 0, 11, 54, 50, 66, + 50, 66, 34, 82, 34, 82, 34, 82, 34, 82, 34, 67, + 50, 36, 68, 18, 146, 146, 49, 82, 50, 50, 85, 64, + 32, 11, 240, 240, 50, 146, 146, 146, 146, 146, 21, 52, + 34, 51, 66, 34, 82, 34, 82, 34, 82, 34, 82, 34, + 82, 34, 82, 34, 82, 0, 7, 16, 16, 4, 240, 18, + 226, 34, 34, 34, 34, 34, 34, 34, 34, 34, 240, 112, + // + // Block 13 Offsets: Codepoints 0x6b - 0x77 + // + 0x34, 0x00, 0x00, 0x00, // Offset 52 (0x34) + 0x52, 0x00, 0x00, 0x00, // Offset 82 (0x52) + 0x65, 0x00, 0x00, 0x00, // Offset 101 (0x65) + 0x8a, 0x00, 0x00, 0x00, // Offset 138 (0x8a) + 0xa5, 0x00, 0x00, 0x00, // Offset 165 (0xa5) + 0xbe, 0x00, 0x00, 0x00, // Offset 190 (0xbe) + 0xdb, 0x00, 0x00, 0x00, // Offset 219 (0xdb) + 0xf8, 0x00, 0x00, 0x00, // Offset 248 (0xf8) + 0x0c, 0x01, 0x00, 0x00, // Offset 268 (0x10c) + 0x1e, 0x01, 0x00, 0x00, // Offset 286 (0x11e) + 0x33, 0x01, 0x00, 0x00, // Offset 307 (0x133) + 0x4e, 0x01, 0x00, 0x00, // Offset 334 (0x14e) + 0x66, 0x01, 0x00, 0x00, // Offset 358 (0x166) + + // + // Block 13 Data: Codepoints 0x6b - 0x77 + // + 30, 10, 240, 242, 130, 130, 130, 130, 130, 51, 34, 35, + 50, 34, 66, 18, 84, 98, 18, 82, 18, 82, 34, 66, + 50, 50, 66, 0, 6, 64, 19, 4, 194, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 240, + 112, 37, 16, 0, 16, 2, 20, 36, 51, 51, 50, 34, + 66, 66, 34, 66, 66, 34, 66, 66, 34, 66, 66, 34, + 66, 66, 34, 66, 66, 34, 66, 66, 34, 66, 66, 0, + 10, 32, 27, 11, 0, 11, 2, 21, 52, 34, 51, 66, + 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 82, 0, 7, 16, 25, 11, 0, 11, 37, 82, 50, + 66, 51, 34, 82, 34, 82, 34, 82, 34, 82, 34, 66, + 66, 50, 85, 0, 7, 48, 29, 11, 0, 11, 2, 20, + 68, 34, 51, 66, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 66, 51, 50, 55, 66, 146, 146, 146, 146, 144, 29, + 11, 0, 11, 54, 51, 50, 50, 66, 34, 82, 34, 82, + 34, 82, 34, 82, 34, 67, 50, 36, 68, 18, 146, 146, + 146, 146, 146, 32, 20, 9, 0, 9, 2, 35, 34, 18, + 66, 17, 83, 99, 99, 98, 114, 114, 114, 0, 6, 64, + 18, 9, 0, 9, 37, 49, 65, 34, 115, 102, 85, 114, + 129, 34, 50, 38, 0, 6, 21, 9, 0, 5, 114, 114, + 114, 87, 66, 114, 114, 114, 114, 114, 114, 114, 33, 84, + 0, 5, 112, 27, 12, 0, 12, 2, 82, 50, 82, 50, + 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, 67, 51, + 36, 69, 34, 0, 7, 96, 24, 12, 0, 12, 2, 98, + 50, 82, 50, 66, 82, 50, 82, 49, 98, 34, 114, 18, + 116, 147, 146, 0, 8, 32, 38, 16, 0, 16, 1, 81, + 82, 34, 51, 50, 50, 51, 50, 50, 49, 17, 50, 65, + 34, 18, 33, 82, 18, 33, 18, 82, 17, 49, 18, 99, + 52, 99, 66, 114, 82, 0, 10, 80, + // + // Block 14 Offsets: Codepoints 0x79 - 0x7a + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x25, 0x00, 0x00, 0x00, // Offset 37 (0x25) + + // + // Block 14 Data: Codepoints 0x79 - 0x7a + // + 29, 12, 0, 12, 17, 98, 50, 82, 50, 66, 82, 50, + 82, 49, 113, 34, 114, 18, 114, 17, 147, 147, 146, 162, + 161, 113, 34, 116, 128, 17, 10, 0, 10, 8, 114, 115, + 114, 114, 115, 114, 114, 129, 136, 0, 6, 64, + 0, 0, // Padding + + // + // Block 15 Offsets: Codepoints 0xc4 - 0xc4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 15 Data: Codepoints 0xc4 - 0xc4 + // + 32, 14, 50, 34, 0, 6, 66, 180, 164, 161, 33, 146, + 34, 130, 34, 129, 65, 114, 66, 98, 66, 104, 82, 98, + 66, 98, 65, 129, 50, 130, 0, 9, + // + // Block 16 Offsets: Codepoints 0xe4 - 0xe4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 16 Data: Codepoints 0xe4 - 0xe4 + // + 30, 12, 0, 6, 34, 34, 240, 240, 214, 82, 50, 66, + 66, 50, 82, 50, 82, 50, 82, 50, 82, 50, 67, 66, + 36, 83, 35, 0, 7, 96, + 0, 0, // Padding + + // + // Block 17 Offsets: Codepoints 0xe9 - 0xe9 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 17 Data: Codepoints 0xe9 - 0xe9 + // + 26, 11, 240, 240, 146, 130, 130, 130, 240, 84, 82, 50, + 65, 82, 34, 82, 41, 34, 146, 162, 146, 81, 86, 0, + 7, 16, + 0, 0, // Padding + + // + // Block 18 Offsets: Codepoints 0xf1 - 0xf1 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 18 Data: Codepoints 0xf1 - 0xf1 + // + 32, 11, 0, 5, 98, 49, 65, 35, 240, 178, 21, 52, + 34, 51, 66, 34, 82, 34, 82, 34, 82, 34, 82, 34, + 82, 34, 82, 34, 82, 0, 7, 16, + // + // Block 19 Offsets: Codepoints 0xf3 - 0xf3 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 19 Data: Codepoints 0xf3 - 0xf3 + // + 30, 11, 240, 240, 146, 130, 130, 130, 240, 69, 82, 50, + 66, 51, 34, 82, 34, 82, 34, 82, 34, 82, 34, 66, + 66, 50, 85, 0, 7, 48, + 0, 0, // Padding + + // + // Block 20 Offsets: Codepoints 0xf6 - 0xf6 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 20 Data: Codepoints 0xf6 - 0xf6 + // + 29, 11, 0, 5, 98, 34, 240, 240, 133, 82, 50, 66, + 51, 34, 82, 34, 82, 34, 82, 34, 82, 34, 66, 66, + 50, 85, 0, 7, 48, + 0, 0, 0, // Padding + + // + // Block 21 Offsets: Codepoints 0xfc - 0xfc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 21 Data: Codepoints 0xfc - 0xfc + // + 31, 12, 0, 6, 18, 34, 240, 240, 178, 82, 50, 82, + 50, 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, 67, + 51, 36, 68, 35, 0, 7, 96, + 0, // Padding + + // + // Block 22 Offsets: Codepoints 0x201c - 0x201d + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x16, 0x00, 0x00, 0x00, // Offset 22 (0x16) + + // + // Block 22 Data: Codepoints 0x201c - 0x201d + // + 14, 9, 240, 209, 50, 34, 34, 49, 49, 67, 19, 0, + 18, 32, 14, 9, 240, 195, 19, 65, 49, 50, 34, 34, + 49, 0, 18, 48, + // + // Block 23 Offsets: Codepoints 0x3001 - 0x3002 + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x13, 0x00, 0x00, 0x00, // Offset 19 (0x13) + + // + // Block 23 Data: Codepoints 0x3001 - 0x3002 + // + 11, 6, 0, 6, 1, 98, 82, 81, 0, 8, 64, 15, + 7, 0, 7, 19, 49, 49, 33, 49, 33, 49, 51, 0, + 9, 16, + 0, 0, // Padding + + // + // Block 24 Offsets: Codepoints 0x3042 - 0x3042 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 24 Data: Codepoints 0x3042 - 0x3042 + // + 48, 16, 240, 240, 129, 241, 241, 226, 34, 119, 193, 33, + 193, 34, 182, 146, 33, 34, 83, 49, 49, 66, 17, 33, + 81, 49, 33, 33, 81, 33, 66, 97, 33, 66, 97, 33, + 66, 81, 49, 49, 17, 65, 83, 82, 179, 0, 6, 112, + // + // Block 25 Offsets: Codepoints 0x3044 - 0x3044 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 25 Data: Codepoints 0x3044 - 0x3044 + // + 33, 17, 0, 6, 49, 240, 34, 113, 129, 129, 97, 161, + 81, 177, 65, 177, 65, 193, 49, 193, 49, 33, 85, 49, + 17, 161, 66, 242, 240, 17, 0, 16, 64, + 0, 0, 0, // Padding + + // + // Block 26 Offsets: Codepoints 0x3048 - 0x3048 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 26 Data: Codepoints 0x3048 - 0x3048 + // + 32, 14, 0, 5, 97, 228, 161, 240, 17, 97, 68, 100, + 18, 113, 65, 193, 193, 193, 18, 145, 49, 129, 65, 113, + 81, 98, 81, 49, 163, 0, 9, 16, + // + // Block 27 Offsets: Codepoints 0x304c - 0x304d + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x32, 0x00, 0x00, 0x00, // Offset 50 (0x32) + + // + // Block 27 Data: Codepoints 0x304c - 0x304d + // + 42, 16, 0, 6, 65, 114, 113, 81, 17, 113, 97, 129, + 97, 113, 97, 65, 22, 65, 50, 17, 65, 65, 81, 65, + 65, 65, 65, 51, 65, 65, 81, 49, 81, 145, 81, 129, + 49, 17, 225, 0, 13, 32, 29, 12, 240, 195, 177, 177, + 18, 49, 67, 84, 17, 177, 18, 49, 66, 100, 17, 193, + 100, 17, 81, 66, 65, 177, 178, 184, 0, 9, 32, + 0, // Padding + + // + // Block 28 Offsets: Codepoints 0x304f - 0x3050 + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x1f, 0x00, 0x00, 0x00, // Offset 31 (0x1f) + + // + // Block 28 Data: Codepoints 0x304f - 0x3050 + // + 23, 10, 240, 240, 97, 146, 113, 129, 129, 114, 113, 145, + 161, 161, 161, 161, 161, 146, 145, 145, 240, 240, 208, 28, + 13, 240, 240, 241, 196, 129, 65, 97, 49, 17, 81, 81, + 66, 97, 49, 193, 209, 209, 209, 209, 209, 194, 193, 193, + 0, 7, 32, + 0, // Padding + + // + // Block 29 Offsets: Codepoints 0x3053 - 0x3053 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 29 Data: Codepoints 0x3053 - 0x3053 + // + 18, 13, 0, 6, 81, 216, 146, 161, 177, 0, 6, 1, + 177, 193, 193, 218, 0, 10, + 0, 0, // Padding + + // + // Block 30 Offsets: Codepoints 0x3055 - 0x3055 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 30 Data: Codepoints 0x3055 - 0x3055 + // + 26, 11, 240, 240, 66, 177, 161, 162, 34, 99, 114, 99, + 33, 161, 177, 102, 65, 81, 49, 161, 161, 162, 182, 0, + 5, 112, + 0, 0, // Padding + + // + // Block 31 Offsets: Codepoints 0x3057 - 0x3059 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x24, 0x00, 0x00, 0x00, // Offset 36 (0x24) + 0x40, 0x00, 0x00, 0x00, // Offset 64 (0x40) + + // + // Block 31 Data: Codepoints 0x3057 - 0x3059 + // + 24, 13, 0, 6, 66, 193, 193, 193, 193, 193, 193, 193, + 193, 193, 129, 49, 113, 65, 97, 81, 66, 116, 0, 9, + 28, 13, 0, 6, 1, 50, 129, 49, 97, 81, 113, 65, + 193, 193, 193, 193, 193, 193, 129, 49, 113, 65, 97, 81, + 66, 116, 0, 9, 36, 17, 240, 240, 161, 240, 34, 240, + 17, 240, 17, 240, 17, 51, 104, 84, 65, 212, 194, 33, + 193, 49, 193, 49, 193, 34, 212, 240, 17, 241, 241, 241, + 241, 0, 7, 112, + // + // Block 32 Offsets: Codepoints 0x305f - 0x3060 + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x25, 0x00, 0x00, 0x00, // Offset 37 (0x25) + + // + // Block 32 Data: Codepoints 0x305f - 0x3060 + // + 29, 16, 0, 6, 66, 242, 226, 225, 33, 113, 67, 148, + 241, 39, 97, 81, 129, 241, 225, 49, 177, 49, 161, 65, + 161, 86, 0, 12, 48, 37, 17, 0, 5, 97, 130, 114, + 114, 81, 146, 97, 129, 33, 129, 67, 164, 240, 17, 53, + 129, 99, 97, 97, 145, 241, 240, 17, 49, 177, 65, 177, + 66, 240, 22, 0, 11, 16, + 0, 0, // Padding + + // + // Block 33 Offsets: Codepoints 0x3066 - 0x3068 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x24, 0x00, 0x00, 0x00, // Offset 36 (0x24) + 0x46, 0x00, 0x00, 0x00, // Offset 70 (0x46) + + // + // Block 33 Data: Codepoints 0x3066 - 0x3068 + // + 24, 16, 0, 9, 6, 33, 37, 18, 98, 81, 225, 225, + 241, 225, 241, 241, 241, 242, 242, 240, 19, 0, 12, 80, + 34, 17, 0, 9, 70, 49, 37, 18, 114, 81, 66, 145, + 65, 17, 129, 97, 145, 97, 129, 240, 17, 240, 17, 240, + 17, 240, 18, 240, 18, 240, 35, 0, 13, 64, 24, 13, + 240, 240, 178, 194, 177, 193, 193, 81, 97, 82, 86, 115, + 145, 177, 177, 193, 193, 209, 216, 0, 8, 64, + 0, 0, // Padding + + // + // Block 34 Offsets: Codepoints 0x306a - 0x306b + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x2b, 0x00, 0x00, 0x00, // Offset 43 (0x2b) + + // + // Block 34 Data: Codepoints 0x306a - 0x306b + // + 35, 16, 0, 6, 97, 241, 225, 18, 129, 35, 179, 52, + 129, 84, 81, 81, 145, 81, 129, 97, 113, 113, 113, 113, + 97, 55, 129, 83, 114, 65, 33, 117, 0, 10, 112, 27, + 15, 0, 7, 97, 225, 49, 51, 49, 84, 81, 225, 209, + 225, 225, 17, 194, 210, 49, 146, 65, 130, 86, 49, 0, + 12, 112, + 0, 0, // Padding + + // + // Block 35 Offsets: Codepoints 0x306e - 0x306f + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x30, 0x00, 0x00, 0x00, // Offset 48 (0x30) + + // + // Block 35 Data: Codepoints 0x306e - 0x306f + // + 40, 17, 0, 7, 49, 196, 19, 114, 49, 66, 66, 49, + 97, 65, 65, 113, 34, 65, 113, 33, 81, 113, 33, 65, + 129, 33, 65, 129, 33, 49, 129, 50, 33, 114, 67, 114, + 195, 0, 15, 80, 40, 17, 0, 8, 97, 114, 113, 114, + 113, 113, 129, 33, 68, 65, 69, 113, 129, 113, 129, 113, + 129, 97, 145, 97, 17, 113, 98, 70, 97, 49, 68, 65, + 49, 65, 34, 49, 68, 0, 11, 64, + // + // Block 36 Offsets: Codepoints 0x307e - 0x307e + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 36 Data: Codepoints 0x307e - 0x307e + // + 28, 14, 0, 6, 2, 209, 209, 97, 101, 55, 209, 113, + 81, 19, 72, 177, 209, 209, 136, 81, 81, 34, 50, 50, + 133, 0, 9, 80, + // + // Block 37 Offsets: Codepoints 0x3081 - 0x3081 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 37 Data: Codepoints 0x3081 - 0x3081 + // + 45, 16, 0, 8, 17, 113, 129, 97, 129, 81, 145, 53, + 113, 18, 33, 34, 97, 49, 65, 82, 49, 81, 49, 17, + 33, 97, 33, 49, 17, 97, 33, 50, 113, 33, 50, 97, + 49, 33, 129, 51, 114, 194, 209, 0, 9, + 0, 0, 0, // Padding + + // + // Block 38 Offsets: Codepoints 0x3089 - 0x308c + // + 0x10, 0x00, 0x00, 0x00, // Offset 16 (0x10) + 0x2c, 0x00, 0x00, 0x00, // Offset 44 (0x2c) + 0x50, 0x00, 0x00, 0x00, // Offset 80 (0x50) + 0x73, 0x00, 0x00, 0x00, // Offset 115 (0x73) + + // + // Block 38 Data: Codepoints 0x3089 - 0x308c + // + 28, 12, 240, 240, 130, 195, 115, 129, 177, 161, 177, 177, + 38, 49, 17, 97, 34, 113, 33, 129, 177, 161, 146, 115, + 129, 0, 7, 16, 36, 11, 240, 113, 177, 161, 51, 49, + 49, 33, 49, 33, 65, 33, 17, 81, 33, 17, 81, 34, + 97, 34, 97, 34, 97, 34, 97, 34, 81, 161, 145, 146, + 129, 0, 7, 80, 35, 13, 0, 6, 81, 67, 100, 18, + 161, 177, 177, 177, 20, 99, 65, 66, 113, 34, 129, 33, + 145, 83, 65, 65, 49, 49, 65, 65, 17, 82, 50, 131, + 0, 7, 32, 45, 19, 240, 240, 194, 240, 49, 240, 49, + 240, 33, 240, 49, 18, 177, 36, 35, 130, 18, 18, 49, + 163, 65, 178, 81, 162, 97, 147, 97, 145, 17, 97, 65, + 49, 33, 97, 49, 113, 115, 114, 240, 49, 0, 13, 80, + // + // Block 39 Offsets: Codepoints 0x3092 - 0x3092 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 39 Data: Codepoints 0x3092 - 0x3092 + // + 39, 14, 240, 240, 33, 225, 209, 193, 34, 81, 36, 131, + 209, 193, 18, 81, 51, 33, 50, 49, 69, 49, 67, 97, + 49, 17, 161, 33, 145, 49, 145, 49, 145, 227, 19, 161, + 0, 6, 16, + 0, // Padding + + // + // Block 40 Offsets: Codepoints 0x30a2 - 0x30a4 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x23, 0x00, 0x00, 0x00, // Offset 35 (0x23) + 0x38, 0x00, 0x00, 0x00, // Offset 56 (0x38) + + // + // Block 40 Data: Codepoints 0x30a2 - 0x30a4 + // + 23, 13, 0, 6, 105, 34, 114, 97, 50, 129, 18, 146, + 177, 177, 193, 177, 193, 177, 177, 177, 0, 11, 32, 21, + 9, 0, 7, 65, 114, 113, 113, 114, 97, 17, 66, 33, + 129, 129, 129, 129, 129, 0, 6, 16, 25, 10, 240, 240, + 113, 145, 129, 130, 129, 130, 113, 17, 82, 33, 65, 65, + 145, 145, 145, 145, 145, 145, 0, 6, 96, + 0, 0, 0, // Padding + + // + // Block 41 Offsets: Codepoints 0x30a6 - 0x30a7 + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x21, 0x00, 0x00, 0x00, // Offset 33 (0x21) + + // + // Block 41 Data: Codepoints 0x30a6 - 0x30a7 + // + 25, 13, 0, 7, 17, 193, 193, 123, 34, 114, 33, 130, + 33, 129, 49, 129, 177, 193, 177, 162, 161, 147, 0, 9, + 32, 17, 13, 0, 12, 49, 102, 161, 193, 193, 193, 193, + 19, 55, 49, 0, 13, 32, + 0, 0, // Padding + + // + // Block 42 Offsets: Codepoints 0x30af - 0x30b1 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x24, 0x00, 0x00, 0x00, // Offset 36 (0x24) + 0x40, 0x00, 0x00, 0x00, // Offset 64 (0x40) + + // + // Block 42 Data: Codepoints 0x30af - 0x30b1 + // + 24, 13, 0, 7, 17, 193, 177, 199, 81, 81, 81, 97, + 65, 97, 65, 113, 177, 178, 162, 162, 146, 0, 10, 112, + 28, 16, 240, 240, 225, 240, 17, 225, 129, 98, 97, 246, + 145, 81, 129, 97, 113, 97, 113, 113, 225, 226, 210, 209, + 210, 0, 13, 64, 27, 14, 0, 9, 33, 209, 209, 82, + 81, 21, 97, 81, 113, 81, 97, 81, 97, 97, 209, 193, + 193, 209, 178, 177, 0, 8, 48, + 0, // Padding + + // + // Block 43 Offsets: Codepoints 0x30b5 - 0x30b5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 43 Data: Codepoints 0x30b5 - 0x30b5 + // + 29, 16, 0, 9, 17, 161, 65, 161, 65, 161, 65, 170, + 37, 65, 161, 65, 161, 65, 161, 65, 225, 241, 225, 225, + 225, 225, 0, 9, 48, + 0, 0, 0, // Padding + + // + // Block 44 Offsets: Codepoints 0x30b7 - 0x30b9 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x22, 0x00, 0x00, 0x00, // Offset 34 (0x22) + 0x3c, 0x00, 0x00, 0x00, // Offset 60 (0x3c) + + // + // Block 44 Data: Codepoints 0x30b7 - 0x30b9 + // + 22, 14, 0, 7, 17, 226, 240, 240, 130, 145, 65, 113, + 193, 193, 193, 193, 193, 178, 163, 0, 11, 96, 26, 15, + 0, 7, 1, 65, 113, 33, 66, 98, 240, 240, 50, 145, + 81, 113, 209, 209, 209, 209, 209, 194, 179, 0, 12, 80, + 22, 13, 0, 10, 53, 83, 50, 177, 177, 193, 177, 179, + 161, 33, 114, 65, 81, 98, 34, 129, 0, 10, + 0, 0, // Padding + + // + // Block 45 Offsets: Codepoints 0x30bd - 0x30bd + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 45 Data: Codepoints 0x30bd - 0x30bd + // + 22, 12, 0, 10, 2, 33, 129, 34, 113, 49, 97, 177, + 162, 161, 161, 162, 145, 161, 146, 0, 8, 80, + 0, 0, // Padding + + // + // Block 46 Offsets: Codepoints 0x30bf - 0x30bf + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 46 Data: Codepoints 0x30bf - 0x30bf + // + 27, 13, 0, 8, 97, 198, 97, 66, 81, 81, 98, 50, + 81, 34, 17, 81, 66, 179, 161, 17, 145, 162, 161, 162, + 0, 9, 64, + 0, // Padding + + // + // Block 47 Offsets: Codepoints 0x30c3 - 0x30c3 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 47 Data: Codepoints 0x30c3 - 0x30c3 + // + 21, 11, 0, 11, 113, 97, 65, 33, 49, 34, 49, 81, + 161, 145, 146, 145, 130, 129, 0, 7, 112, + 0, 0, 0, // Padding + + // + // Block 48 Offsets: Codepoints 0x30c6 - 0x30c6 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 48 Data: Codepoints 0x30c6 - 0x30c6 + // + 22, 14, 0, 7, 115, 101, 240, 240, 152, 36, 33, 209, + 209, 193, 209, 193, 209, 193, 178, 0, 10, 16, + 0, 0, // Padding + + // + // Block 49 Offsets: Codepoints 0x30c8 - 0x30c8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 49 Data: Codepoints 0x30c8 - 0x30c8 + // + 21, 8, 240, 145, 129, 113, 113, 113, 113, 116, 65, 49, + 49, 113, 113, 113, 113, 113, 0, 6, 96, + 0, 0, 0, // Padding + + // + // Block 50 Offsets: Codepoints 0x30cd - 0x30cd + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 50 Data: Codepoints 0x30cd - 0x30cd + // + 29, 14, 0, 5, 113, 225, 240, 180, 115, 49, 193, 179, + 178, 179, 33, 114, 17, 49, 81, 49, 50, 34, 65, 209, + 209, 209, 0, 9, 80, + 0, 0, 0, // Padding + + // + // Block 51 Offsets: Codepoints 0x30d1 - 0x30d1 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 51 Data: Codepoints 0x30d1 - 0x30d1 + // + 32, 19, 0, 6, 66, 240, 17, 33, 241, 33, 97, 146, + 114, 81, 193, 97, 161, 129, 145, 130, 113, 161, 113, 162, + 81, 178, 65, 240, 33, 0, 21, 32, + // + // Block 52 Offsets: Codepoints 0x30d5 - 0x30d7 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x1e, 0x00, 0x00, 0x00, // Offset 30 (0x1e) + 0x34, 0x00, 0x00, 0x00, // Offset 52 (0x34) + + // + // Block 52 Data: Codepoints 0x30d5 - 0x30d7 + // + 18, 12, 0, 9, 10, 162, 161, 177, 162, 161, 161, 162, + 146, 145, 146, 0, 10, 16, 22, 16, 0, 7, 65, 209, + 33, 210, 58, 226, 225, 241, 225, 241, 225, 226, 209, 210, + 194, 0, 13, 96, 26, 16, 240, 240, 210, 209, 33, 193, + 33, 86, 34, 52, 66, 241, 225, 241, 226, 225, 225, 226, + 210, 209, 210, 0, 13, 80, + 0, 0, // Padding + + // + // Block 53 Offsets: Codepoints 0x30dc - 0x30dd + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x28, 0x00, 0x00, 0x00, // Offset 40 (0x28) + + // + // Block 53 Data: Codepoints 0x30dc - 0x30dd + // + 32, 16, 0, 7, 50, 130, 49, 33, 129, 65, 161, 241, + 156, 66, 65, 241, 241, 241, 33, 113, 65, 50, 66, 65, + 65, 65, 81, 211, 225, 0, 11, 32, 35, 16, 240, 240, + 210, 209, 33, 129, 49, 33, 129, 66, 145, 241, 156, 66, + 65, 241, 241, 241, 33, 113, 65, 49, 82, 65, 65, 65, + 81, 65, 131, 225, 0, 11, 32, + 0, // Padding + + // + // Block 54 Offsets: Codepoints 0x30e1 - 0x30e1 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 54 Data: Codepoints 0x30e1 - 0x30e1 + // + 23, 13, 0, 9, 49, 193, 177, 113, 65, 130, 17, 178, + 178, 161, 33, 129, 49, 98, 146, 161, 0, 11, 32, + 0, // Padding + + // + // Block 55 Offsets: Codepoints 0x30e5 - 0x30e7 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x1b, 0x00, 0x00, 0x00, // Offset 27 (0x1b) + 0x2b, 0x00, 0x00, 0x00, // Offset 43 (0x2b) + + // + // Block 55 Data: Codepoints 0x30e5 - 0x30e7 + // + 15, 12, 0, 12, 38, 161, 177, 177, 177, 164, 53, 65, + 0, 12, 32, 16, 15, 0, 11, 88, 209, 225, 225, 225, + 209, 225, 184, 37, 0, 16, 32, 15, 9, 0, 9, 7, + 129, 129, 129, 39, 129, 129, 39, 0, 8, 16, + 0, 0, // Padding + + // + // Block 56 Offsets: Codepoints 0x30e9 - 0x30eb + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x24, 0x00, 0x00, 0x00, // Offset 36 (0x24) + 0x42, 0x00, 0x00, 0x00, // Offset 66 (0x42) + + // + // Block 56 Data: Codepoints 0x30e9 - 0x30eb + // + 24, 13, 240, 240, 177, 35, 130, 240, 98, 24, 50, 98, + 177, 193, 193, 177, 178, 177, 162, 161, 162, 0, 10, 112, + 30, 9, 240, 240, 34, 33, 81, 33, 81, 33, 81, 33, + 81, 33, 81, 33, 81, 33, 81, 33, 81, 113, 129, 113, + 129, 113, 98, 0, 6, 48, 34, 18, 0, 11, 97, 49, + 210, 33, 209, 49, 209, 49, 209, 49, 209, 49, 97, 97, + 49, 81, 97, 65, 50, 113, 65, 18, 129, 82, 145, 240, + 17, 0, 15, 80, + // + // Block 57 Offsets: Codepoints 0x30f3 - 0x30f3 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 57 Data: Codepoints 0x30f3 - 0x30f3 + // + 20, 13, 0, 8, 33, 209, 193, 113, 177, 177, 177, 177, + 177, 177, 177, 147, 162, 0, 11, 16, + // + // Block 58 Offsets: Codepoints 0x30fc - 0x30fc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 58 Data: Codepoints 0x30fc - 0x30fc + // + 10, 18, 0, 20, 33, 240, 63, 0, 27, 32, + 0, 0, // Padding + + // + // Block 59 Offsets: Codepoints 0x4e0b - 0x4e0b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 59 Data: Codepoints 0x4e0b - 0x4e0b + // + 42, 20, 0, 7, 1, 63, 3, 161, 240, 65, 240, 65, + 240, 65, 240, 66, 240, 49, 18, 240, 17, 50, 225, 66, + 209, 81, 209, 240, 65, 240, 65, 240, 65, 240, 65, 240, + 65, 240, 65, 0, 8, 112, + 0, 0, // Padding + + // + // Block 60 Offsets: Codepoints 0x4e0e - 0x4e0e + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 60 Data: Codepoints 0x4e0e - 0x4e0e + // + 39, 19, 240, 130, 240, 33, 240, 49, 161, 110, 81, 240, + 49, 240, 33, 177, 110, 240, 33, 240, 49, 240, 49, 225, + 49, 76, 33, 240, 49, 240, 49, 240, 49, 240, 33, 244, + 0, 10, 16, + 0, // Padding + + // + // Block 61 Offsets: Codepoints 0x4e2d - 0x4e2d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 61 Data: Codepoints 0x4e2d - 0x4e2d + // + 47, 18, 240, 162, 240, 17, 240, 33, 240, 33, 97, 63, + 1, 33, 97, 97, 49, 97, 97, 49, 97, 97, 49, 97, + 97, 49, 97, 97, 63, 49, 97, 97, 161, 240, 33, 240, + 33, 240, 33, 240, 33, 240, 33, 240, 33, 0, 8, + 0, // Padding + + // + // Block 62 Offsets: Codepoints 0x4e4b - 0x4e4b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 62 Data: Codepoints 0x4e4b - 0x4e4b + // + 41, 19, 240, 177, 240, 65, 240, 49, 240, 49, 190, 240, + 18, 240, 18, 240, 33, 240, 33, 240, 33, 240, 33, 240, + 33, 240, 33, 240, 33, 240, 18, 240, 17, 17, 226, 50, + 240, 74, 0, 9, 96, + 0, 0, 0, // Padding + + // + // Block 63 Offsets: Codepoints 0x4ecb - 0x4ecb + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 63 Data: Codepoints 0x4ecb - 0x4ecb + // + 48, 20, 240, 225, 240, 50, 240, 49, 17, 240, 17, 49, + 225, 81, 193, 98, 161, 145, 129, 33, 81, 34, 81, 50, + 65, 50, 34, 65, 81, 209, 81, 209, 81, 209, 81, 209, + 81, 193, 97, 193, 97, 177, 113, 161, 129, 0, 10, 112, + // + // Block 64 Offsets: Codepoints 0x4ee3 - 0x4ee3 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 64 Data: Codepoints 0x4ee3 - 0x4ee3 + // + 52, 20, 240, 145, 81, 209, 81, 33, 161, 81, 50, 113, + 97, 65, 113, 97, 194, 81, 81, 82, 29, 49, 17, 97, + 145, 33, 97, 145, 33, 97, 193, 97, 193, 98, 177, 113, + 177, 113, 177, 129, 65, 81, 145, 49, 81, 146, 33, 81, + 179, 0, 10, 32, + // + // Block 65 Offsets: Codepoints 0x4ee5 - 0x4ee5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 65 Data: Codepoints 0x4ee5 - 0x4ee5 + // + 50, 17, 240, 240, 242, 65, 161, 81, 50, 81, 81, 81, + 65, 81, 81, 65, 81, 81, 65, 81, 161, 81, 161, 81, + 161, 81, 145, 97, 81, 49, 97, 50, 65, 97, 33, 81, + 17, 83, 81, 49, 65, 97, 81, 130, 98, 97, 145, 66, + 0, 8, + 0, 0, // Padding + + // + // Block 66 Offsets: Codepoints 0x4ef6 - 0x4ef6 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 66 Data: Codepoints 0x4ef6 - 0x4ef6 + // + 54, 20, 240, 145, 98, 177, 97, 193, 49, 33, 177, 49, + 49, 177, 49, 49, 49, 113, 58, 82, 49, 49, 145, 17, + 33, 65, 145, 17, 33, 65, 129, 33, 113, 65, 97, 29, + 81, 113, 177, 113, 177, 113, 177, 113, 177, 113, 177, 113, + 177, 113, 177, 0, 9, 64, + 0, 0, // Padding + + // + // Block 67 Offsets: Codepoints 0x4f1a - 0x4f1a + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 67 Data: Codepoints 0x4f1a - 0x4f1a + // + 44, 20, 240, 210, 240, 35, 240, 18, 17, 240, 17, 49, + 225, 81, 193, 113, 161, 113, 18, 98, 40, 20, 33, 241, + 240, 34, 110, 193, 240, 49, 240, 50, 240, 49, 81, 193, + 113, 161, 25, 131, 129, 0, 10, 80, + // + // Block 68 Offsets: Codepoints 0x4f9b - 0x4f9b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 68 Data: Codepoints 0x4f9b - 0x4f9b + // + 62, 21, 240, 162, 49, 65, 161, 65, 65, 161, 65, 65, + 145, 81, 65, 145, 81, 65, 33, 98, 28, 82, 81, 65, + 113, 17, 81, 65, 113, 17, 81, 65, 97, 33, 81, 65, + 145, 81, 65, 49, 81, 30, 81, 240, 81, 81, 225, 65, + 82, 129, 50, 113, 113, 34, 145, 97, 17, 177, 98, 0, + 9, 112, + 0, 0, // Padding + + // + // Block 69 Offsets: Codepoints 0x4fe1 - 0x4fe1 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 69 Data: Codepoints 0x4fe1 - 0x4fe1 + // + 50, 21, 0, 5, 98, 81, 209, 113, 193, 113, 65, 97, + 45, 82, 161, 114, 73, 81, 17, 240, 33, 33, 177, 81, + 33, 73, 113, 240, 81, 177, 129, 73, 113, 65, 97, 129, + 65, 97, 129, 65, 97, 129, 72, 129, 65, 97, 209, 0, + 9, 48, + 0, 0, // Padding + + // + // Block 70 Offsets: Codepoints 0x50cf - 0x50cf + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 70 Data: Codepoints 0x50cf - 0x50cf + // + 69, 21, 240, 161, 66, 225, 65, 65, 161, 55, 145, 50, + 65, 33, 113, 59, 98, 18, 65, 49, 98, 49, 49, 65, + 81, 17, 58, 65, 33, 49, 33, 81, 113, 82, 209, 65, + 33, 34, 129, 34, 33, 18, 161, 81, 34, 161, 50, 34, + 17, 145, 33, 49, 17, 33, 129, 66, 33, 34, 113, 49, + 65, 51, 81, 18, 21, 177, 113, 0, 9, + 0, 0, 0, // Padding + + // + // Block 71 Offsets: Codepoints 0x5141 - 0x5141 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 71 Data: Codepoints 0x5141 - 0x5141 + // + 48, 20, 240, 209, 240, 49, 240, 50, 240, 49, 81, 193, + 113, 161, 145, 129, 42, 117, 33, 65, 161, 49, 65, 161, + 49, 241, 49, 241, 49, 241, 49, 225, 65, 225, 65, 81, + 113, 81, 81, 98, 81, 82, 65, 119, 50, 0, 9, 96, + // + // Block 72 Offsets: Codepoints 0x5207 - 0x5207 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 72 Data: Codepoints 0x5207 - 0x5207 + // + 59, 20, 240, 240, 209, 193, 97, 74, 81, 113, 65, 97, + 113, 65, 97, 50, 33, 65, 97, 19, 49, 65, 53, 97, + 65, 97, 113, 65, 97, 113, 65, 97, 97, 81, 97, 65, + 17, 81, 97, 34, 33, 81, 99, 49, 97, 98, 65, 97, + 97, 65, 113, 161, 113, 161, 84, 130, 0, 9, 32, + 0, // Padding + + // + // Block 73 Offsets: Codepoints 0x529b - 0x529b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 73 Data: Codepoints 0x529b - 0x529b + // + 43, 18, 240, 177, 240, 33, 240, 33, 240, 33, 240, 33, + 81, 79, 161, 81, 177, 81, 177, 81, 162, 81, 161, 97, + 161, 97, 145, 113, 145, 113, 129, 129, 113, 145, 97, 161, + 81, 101, 66, 161, 0, 7, 48, + 0, // Padding + + // + // Block 74 Offsets: Codepoints 0x52a8 - 0x52a8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 74 Data: Codepoints 0x52a8 - 0x52a8 + // + 58, 20, 240, 240, 34, 193, 81, 150, 65, 240, 65, 240, + 65, 49, 216, 146, 49, 49, 57, 49, 49, 98, 113, 49, + 97, 129, 49, 97, 129, 49, 97, 33, 65, 65, 81, 65, + 49, 65, 81, 65, 49, 65, 65, 20, 17, 17, 81, 66, + 82, 97, 177, 97, 177, 83, 161, 0, 9, 16, + 0, 0, // Padding + + // + // Block 75 Offsets: Codepoints 0x52b9 - 0x52b9 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 75 Data: Codepoints 0x52b9 - 0x52b9 + // + 70, 20, 240, 145, 129, 161, 129, 161, 129, 106, 49, 240, + 65, 129, 49, 56, 65, 65, 81, 49, 49, 97, 65, 49, + 49, 97, 65, 49, 33, 81, 97, 49, 65, 49, 97, 49, + 81, 33, 81, 65, 98, 97, 65, 113, 97, 65, 97, 17, + 65, 81, 97, 33, 49, 81, 81, 49, 33, 81, 81, 113, + 81, 65, 113, 97, 49, 113, 82, 240, 240, 224, + 0, 0, // Padding + + // + // Block 76 Offsets: Codepoints 0x52d5 - 0x52d5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 76 Data: Codepoints 0x52d5 - 0x52d5 + // + 67, 20, 240, 164, 49, 133, 97, 193, 49, 33, 122, 33, + 193, 97, 49, 65, 49, 33, 24, 57, 33, 49, 65, 49, + 33, 49, 49, 72, 49, 49, 65, 49, 33, 49, 49, 65, + 49, 33, 49, 49, 72, 33, 65, 65, 49, 33, 33, 65, + 129, 33, 33, 65, 74, 81, 129, 65, 81, 133, 82, 68, + 49, 52, 240, 49, 0, 8, 16, + 0, // Padding + + // + // Block 77 Offsets: Codepoints 0x5373 - 0x5373 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 77 Data: Codepoints 0x5373 - 0x5373 + // + 70, 18, 240, 129, 129, 55, 39, 33, 65, 49, 65, 49, + 65, 49, 65, 49, 65, 49, 65, 54, 49, 65, 49, 65, + 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, 54, 49, + 65, 49, 65, 49, 65, 49, 129, 65, 49, 49, 65, 65, + 49, 65, 49, 65, 49, 51, 33, 35, 49, 18, 33, 33, + 130, 65, 33, 129, 129, 240, 33, 0, 7, 96, + 0, 0, // Padding + + // + // Block 78 Offsets: Codepoints 0x53d6 - 0x53d6 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 78 Data: Codepoints 0x53d6 - 0x53d6 + // + 62, 20, 240, 226, 155, 177, 65, 225, 65, 129, 81, 65, + 25, 70, 33, 65, 97, 65, 33, 65, 97, 65, 33, 65, + 97, 65, 49, 49, 102, 49, 33, 113, 65, 49, 33, 113, + 65, 65, 17, 113, 67, 34, 129, 35, 81, 116, 33, 66, + 98, 81, 65, 17, 193, 49, 49, 177, 18, 67, 146, 0, + 8, 112, + 0, 0, // Padding + + // + // Block 79 Offsets: Codepoints 0x53ef - 0x53ef + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 79 Data: Codepoints 0x53ef - 0x53ef + // + 46, 19, 0, 6, 82, 47, 2, 241, 240, 49, 209, 65, + 135, 49, 129, 65, 65, 129, 65, 65, 129, 65, 65, 129, + 65, 65, 129, 65, 65, 134, 65, 129, 65, 65, 129, 145, + 240, 49, 240, 49, 240, 49, 244, 0, 7, 96, + 0, 0, // Padding + + // + // Block 80 Offsets: Codepoints 0x540e - 0x540e + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 80 Data: Codepoints 0x540e - 0x540e + // + 47, 19, 240, 240, 49, 230, 103, 193, 240, 49, 240, 49, + 178, 94, 81, 240, 49, 240, 49, 161, 113, 42, 97, 33, + 113, 113, 33, 113, 97, 49, 113, 97, 49, 113, 97, 49, + 113, 81, 73, 65, 81, 113, 161, 113, 0, 7, 80, + 0, // Padding + + // + // Block 81 Offsets: Codepoints 0x548c - 0x548c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 81 Data: Codepoints 0x548c - 0x548c + // + 62, 20, 240, 209, 240, 21, 181, 161, 129, 87, 113, 81, + 65, 129, 33, 33, 65, 58, 17, 65, 114, 81, 65, 114, + 81, 65, 115, 65, 65, 97, 17, 18, 33, 65, 97, 17, + 33, 33, 65, 81, 33, 81, 65, 65, 49, 81, 65, 49, + 65, 86, 129, 81, 65, 129, 81, 65, 129, 81, 209, 0, + 9, 32, + 0, 0, // Padding + + // + // Block 82 Offsets: Codepoints 0x54cd - 0x54cd + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 82 Data: Codepoints 0x54cd - 0x54cd + // + 75, 20, 240, 242, 240, 49, 240, 49, 97, 113, 43, 37, + 33, 129, 49, 49, 33, 129, 49, 49, 33, 81, 33, 49, + 49, 33, 22, 17, 49, 49, 33, 17, 49, 33, 49, 49, + 33, 17, 49, 33, 49, 49, 33, 17, 49, 33, 49, 49, + 33, 17, 49, 33, 53, 33, 21, 33, 49, 49, 33, 17, + 49, 33, 49, 97, 129, 49, 97, 129, 161, 129, 161, 99, + 0, 10, 48, + 0, // Padding + + // + // Block 83 Offsets: Codepoints 0x56fd - 0x56fe + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x42, 0x00, 0x00, 0x00, // Offset 66 (0x42) + + // + // Block 83 Data: Codepoints 0x56fd - 0x56fe + // + 58, 17, 240, 240, 17, 47, 33, 209, 33, 162, 17, 33, + 27, 17, 33, 97, 97, 33, 97, 97, 33, 97, 49, 33, + 33, 41, 33, 33, 97, 97, 33, 97, 97, 33, 97, 18, + 49, 33, 97, 33, 49, 33, 97, 65, 17, 33, 27, 17, + 33, 209, 47, 33, 209, 240, 17, 0, 6, 80, 59, 17, + 240, 240, 17, 47, 33, 209, 33, 82, 33, 49, 33, 71, + 33, 33, 65, 65, 49, 33, 50, 49, 65, 33, 33, 33, + 33, 65, 33, 17, 66, 81, 33, 84, 65, 33, 50, 54, + 36, 34, 97, 33, 113, 81, 33, 50, 129, 33, 83, 81, + 33, 114, 65, 47, 33, 209, 0, 8, 96, + 0, 0, 0, // Padding + + // + // Block 84 Offsets: Codepoints 0x5728 - 0x5728 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 84 Data: Codepoints 0x5728 - 0x5728 + // + 48, 20, 240, 210, 240, 49, 240, 49, 129, 79, 2, 145, + 240, 49, 65, 225, 65, 194, 81, 193, 97, 178, 97, 49, + 97, 17, 42, 65, 33, 97, 129, 49, 97, 193, 97, 193, + 97, 193, 97, 193, 97, 65, 113, 28, 97, 0, 9, 48, + // + // Block 85 Offsets: Codepoints 0x5831 - 0x5831 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 85 Data: Codepoints 0x5831 - 0x5831 + // + 69, 20, 240, 130, 161, 113, 49, 24, 56, 17, 81, 113, + 81, 81, 113, 49, 17, 81, 74, 66, 145, 49, 50, 98, + 33, 49, 193, 33, 56, 113, 33, 17, 17, 49, 72, 17, + 17, 49, 113, 81, 17, 49, 113, 49, 17, 33, 17, 90, + 33, 17, 129, 81, 50, 129, 81, 50, 129, 81, 33, 18, + 113, 81, 17, 51, 81, 82, 0, 8, 80, + 0, 0, 0, // Padding + + // + // Block 86 Offsets: Codepoints 0x5b9a - 0x5b9a + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 86 Data: Codepoints 0x5b9a - 0x5b9a + // + 43, 20, 240, 209, 240, 81, 193, 97, 207, 81, 193, 81, + 240, 65, 209, 111, 193, 240, 65, 225, 65, 225, 65, 65, + 145, 71, 113, 17, 49, 209, 17, 49, 193, 49, 33, 193, + 67, 177, 121, 33, 0, 9, 112, + 0, // Padding + + // + // Block 87 Offsets: Codepoints 0x5b9e - 0x5b9e + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 87 Data: Codepoints 0x5b9e - 0x5b9e + // + 47, 20, 240, 209, 240, 66, 177, 113, 97, 95, 1, 49, + 210, 65, 129, 65, 66, 50, 49, 240, 17, 33, 193, 97, + 210, 49, 241, 49, 97, 63, 3, 177, 240, 50, 240, 49, + 18, 241, 66, 178, 114, 114, 161, 97, 0, 9, 80, + 0, // Padding + + // + // Block 88 Offsets: Codepoints 0x5c06 - 0x5c06 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 88 Data: Codepoints 0x5c06 - 0x5c06 + // + 62, 19, 240, 225, 193, 66, 65, 113, 72, 33, 49, 49, + 81, 81, 33, 35, 49, 113, 17, 17, 34, 17, 129, 17, + 97, 177, 66, 34, 129, 49, 65, 145, 18, 81, 18, 67, + 27, 34, 33, 129, 81, 49, 34, 65, 145, 50, 49, 145, + 66, 33, 145, 65, 49, 145, 129, 145, 99, 145, 113, 0, + 7, 112, + 0, 0, // Padding + + // + // Block 89 Offsets: Codepoints 0x5c4f - 0x5c4f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 89 Data: Codepoints 0x5c4f - 0x5c4f + // + 56, 20, 240, 240, 81, 111, 81, 193, 97, 193, 110, 97, + 65, 65, 33, 97, 81, 49, 145, 81, 33, 49, 97, 44, + 81, 81, 49, 145, 81, 49, 145, 81, 49, 49, 81, 30, + 49, 97, 49, 129, 81, 65, 129, 81, 65, 113, 81, 81, + 113, 65, 97, 177, 113, 0, 8, 48, + // + // Block 90 Offsets: Codepoints 0x5e55 - 0x5e55 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 90 Data: Codepoints 0x5e55 - 0x5e55 + // + 50, 20, 240, 193, 49, 65, 79, 2, 145, 49, 240, 97, + 171, 145, 129, 170, 161, 129, 170, 161, 33, 81, 33, 79, + 2, 114, 33, 33, 162, 65, 50, 113, 30, 34, 33, 65, + 49, 161, 65, 49, 161, 65, 49, 161, 65, 34, 241, 0, + 8, 96, + 0, 0, // Padding + + // + // Block 91 Offsets: Codepoints 0x5e8f - 0x5e8f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 91 Data: Codepoints 0x5e8f - 0x5e8f + // + 45, 20, 240, 241, 240, 65, 82, 79, 1, 65, 240, 65, + 193, 97, 44, 81, 81, 81, 113, 98, 18, 129, 129, 161, + 45, 65, 129, 65, 81, 129, 49, 97, 129, 161, 129, 145, + 145, 145, 145, 145, 145, 129, 116, 0, 11, + 0, 0, 0, // Padding + + // + // Block 92 Offsets: Codepoints 0x5e93 - 0x5e95 + // + 0x0c, 0x00, 0x00, 0x00, // Offset 12 (0xc) + 0x3d, 0x00, 0x00, 0x00, // Offset 61 (0x3d) + 0x74, 0x00, 0x00, 0x00, // Offset 116 (0x74) + + // + // Block 92 Data: Codepoints 0x5e93 - 0x5e95 + // + 49, 20, 240, 225, 240, 81, 240, 65, 82, 79, 1, 65, + 97, 193, 82, 97, 81, 45, 65, 81, 209, 65, 50, 145, + 65, 49, 49, 97, 59, 81, 129, 161, 129, 161, 129, 66, + 50, 30, 49, 145, 145, 145, 129, 161, 240, 65, 0, 8, + 64, 55, 20, 240, 225, 240, 81, 240, 65, 81, 95, 1, + 65, 240, 65, 240, 65, 65, 225, 81, 97, 97, 97, 66, + 97, 17, 66, 49, 113, 33, 65, 49, 113, 49, 49, 49, + 113, 49, 49, 33, 129, 50, 81, 113, 81, 65, 129, 161, + 129, 145, 65, 49, 47, 0, 10, 32, 62, 20, 240, 225, + 240, 81, 81, 95, 1, 65, 240, 65, 177, 113, 118, 97, + 37, 17, 161, 33, 81, 161, 33, 81, 65, 81, 44, 81, + 33, 81, 161, 33, 81, 161, 33, 82, 129, 49, 97, 129, + 49, 33, 50, 49, 49, 49, 17, 81, 33, 49, 66, 50, + 35, 49, 65, 81, 50, 240, 81, 0, 7, 96, + 0, 0, // Padding + + // + // Block 93 Offsets: Codepoints 0x5f62 - 0x5f62 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 93 Data: Codepoints 0x5f62 - 0x5f62 + // + 56, 19, 240, 210, 65, 59, 50, 97, 49, 97, 113, 49, + 81, 129, 49, 65, 145, 49, 225, 49, 33, 66, 44, 34, + 97, 49, 82, 113, 49, 65, 145, 49, 49, 161, 49, 129, + 65, 65, 129, 65, 65, 113, 81, 65, 97, 81, 81, 66, + 97, 81, 49, 113, 130, 0, 10, 64, + // + // Block 94 Offsets: Codepoints 0x5f71 - 0x5f71 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 94 Data: Codepoints 0x5f71 - 0x5f71 + // + 59, 20, 240, 225, 201, 66, 81, 97, 66, 104, 65, 113, + 97, 49, 136, 33, 145, 33, 66, 50, 60, 49, 193, 81, + 120, 49, 129, 81, 49, 145, 81, 33, 65, 87, 114, 65, + 33, 33, 98, 81, 33, 18, 81, 113, 33, 34, 49, 113, + 49, 49, 33, 113, 65, 66, 179, 34, 0, 8, 96, + 0, // Padding + + // + // Block 95 Offsets: Codepoints 0x5f8c - 0x5f8c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 95 Data: Codepoints 0x5f8c - 0x5f8c + // + 62, 20, 240, 129, 113, 178, 82, 177, 81, 65, 113, 81, + 66, 97, 49, 23, 97, 49, 33, 49, 193, 81, 65, 113, + 81, 97, 98, 28, 66, 82, 161, 17, 81, 81, 65, 33, + 87, 113, 66, 65, 129, 49, 17, 50, 129, 33, 49, 33, + 145, 17, 82, 161, 115, 145, 82, 35, 113, 35, 99, 0, + 7, 96, + 0, 0, // Padding + + // + // Block 96 Offsets: Codepoints 0x606f - 0x606f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 96 Data: Codepoints 0x606f - 0x606f + // + 46, 19, 240, 178, 240, 33, 81, 140, 113, 145, 129, 145, + 139, 129, 145, 129, 145, 139, 129, 145, 139, 129, 145, 161, + 33, 177, 49, 49, 66, 65, 49, 65, 33, 33, 49, 49, + 113, 33, 33, 65, 113, 33, 121, 0, 10, 16, + 0, 0, // Padding + + // + // Block 97 Offsets: Codepoints 0x60a8 - 0x60a8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 97 Data: Codepoints 0x60a8 - 0x60a8 + // + 63, 19, 240, 129, 49, 210, 49, 209, 49, 209, 59, 51, + 33, 49, 65, 66, 33, 65, 49, 65, 17, 17, 33, 33, + 161, 65, 33, 34, 97, 49, 49, 50, 81, 33, 65, 66, + 65, 17, 36, 161, 97, 240, 18, 225, 49, 81, 81, 33, + 113, 33, 65, 33, 113, 49, 33, 49, 113, 49, 33, 57, + 0, 10, 32, + 0, // Padding + + // + // Block 98 Offsets: Codepoints 0x60c5 - 0x60c5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 98 Data: Codepoints 0x60c5 - 0x60c5 + // + 59, 21, 240, 146, 98, 177, 113, 65, 113, 59, 97, 113, + 161, 19, 81, 49, 97, 17, 18, 25, 81, 17, 113, 81, + 65, 17, 45, 33, 33, 240, 81, 73, 113, 65, 97, 129, + 72, 129, 65, 97, 129, 72, 129, 65, 97, 129, 65, 97, + 129, 65, 97, 129, 65, 52, 129, 161, 0, 8, 80, + 0, // Padding + + // + // Block 99 Offsets: Codepoints 0x6210 - 0x6210 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 99 Data: Codepoints 0x6210 - 0x6210 + // + 67, 20, 240, 241, 240, 65, 18, 240, 17, 49, 241, 49, + 17, 95, 1, 65, 113, 177, 113, 177, 113, 65, 97, 65, + 33, 50, 103, 17, 49, 113, 65, 33, 49, 113, 65, 49, + 17, 129, 65, 49, 17, 129, 65, 49, 17, 129, 65, 65, + 129, 81, 51, 49, 49, 35, 49, 33, 49, 33, 129, 66, + 17, 33, 98, 114, 0, 7, 96, + 0, // Padding + + // + // Block 100 Offsets: Codepoints 0x62bc - 0x62bc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 100 Data: Codepoints 0x62bc - 0x62bc + // + 62, 20, 240, 130, 177, 97, 74, 81, 65, 49, 49, 97, + 33, 17, 49, 49, 55, 17, 49, 49, 97, 65, 49, 49, + 97, 73, 97, 33, 17, 49, 49, 99, 33, 49, 49, 82, + 65, 49, 49, 50, 17, 73, 97, 65, 49, 49, 97, 129, + 161, 129, 161, 129, 161, 129, 161, 129, 116, 129, 145, 0, + 9, 80, + 0, 0, // Padding + + // + // Block 101 Offsets: Codepoints 0x6301 - 0x6301 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 101 Data: Codepoints 0x6301 - 0x6301 + // + 52, 20, 240, 129, 113, 177, 113, 177, 113, 49, 113, 42, + 71, 65, 177, 113, 65, 97, 44, 81, 240, 65, 17, 114, + 115, 129, 33, 50, 17, 44, 81, 145, 145, 49, 81, 145, + 66, 49, 145, 81, 49, 145, 145, 145, 145, 100, 100, 129, + 145, 0, 8, 48, + // + // Block 102 Offsets: Codepoints 0x6309 - 0x6309 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 102 Data: Codepoints 0x6309 - 0x6309 + // + 58, 20, 240, 129, 113, 177, 129, 161, 129, 161, 17, 42, + 40, 129, 97, 49, 50, 33, 113, 113, 177, 33, 65, 179, + 65, 82, 81, 44, 51, 97, 49, 82, 17, 81, 65, 129, + 81, 49, 145, 65, 65, 145, 82, 17, 161, 115, 145, 98, + 34, 113, 81, 82, 67, 20, 113, 0, 7, 112, + 0, 0, // Padding + + // + // Block 103 Offsets: Codepoints 0x6362 - 0x6362 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 103 Data: Codepoints 0x6362 - 0x6362 + // + 67, 21, 240, 146, 82, 193, 97, 209, 86, 145, 17, 49, + 49, 118, 33, 49, 177, 49, 65, 33, 129, 33, 25, 113, + 65, 49, 33, 129, 65, 49, 33, 129, 17, 33, 49, 33, + 115, 49, 49, 33, 97, 17, 65, 49, 33, 17, 97, 30, + 81, 114, 177, 113, 17, 161, 97, 49, 145, 66, 81, 99, + 49, 131, 65, 34, 0, 9, 80, + 0, // Padding + + // + // Block 104 Offsets: Codepoints 0x63d0 - 0x63d0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 104 Data: Codepoints 0x63d0 - 0x63d0 + // + 59, 20, 240, 129, 161, 129, 72, 113, 65, 81, 129, 33, + 17, 81, 87, 23, 129, 65, 81, 129, 65, 81, 129, 71, + 131, 33, 113, 82, 29, 34, 17, 129, 161, 65, 49, 161, + 49, 65, 33, 113, 50, 53, 97, 50, 49, 161, 33, 33, + 33, 161, 33, 51, 131, 17, 86, 113, 0, 9, 48, + 0, // Padding + + // + // Block 105 Offsets: Codepoints 0x63db - 0x63db + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 105 Data: Codepoints 0x63db - 0x63db + // + 70, 20, 240, 129, 82, 193, 82, 33, 145, 85, 145, 17, + 33, 49, 118, 17, 49, 49, 113, 58, 97, 34, 33, 17, + 33, 113, 49, 33, 17, 33, 113, 17, 17, 33, 17, 33, + 114, 33, 17, 36, 83, 50, 97, 66, 17, 49, 49, 49, + 113, 113, 81, 81, 29, 81, 98, 177, 97, 17, 161, 81, + 49, 145, 65, 84, 51, 34, 129, 0, 7, 112, + 0, 0, // Padding + + // + // Block 106 Offsets: Codepoints 0x652f - 0x652f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 106 Data: Codepoints 0x652f - 0x652f + // + 43, 19, 240, 193, 240, 49, 240, 49, 97, 63, 2, 161, + 240, 49, 240, 49, 240, 49, 49, 139, 161, 97, 193, 81, + 193, 65, 225, 49, 241, 17, 240, 19, 240, 19, 241, 34, + 194, 83, 84, 162, 0, 7, 64, + 0, // Padding + + // + // Block 107 Offsets: Codepoints 0x65b0 - 0x65b0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 107 Data: Codepoints 0x65b0 - 0x65b0 + // + 70, 20, 65, 240, 81, 147, 113, 34, 17, 18, 105, 18, + 145, 65, 49, 177, 49, 49, 177, 33, 65, 225, 33, 17, + 66, 47, 3, 113, 81, 49, 145, 33, 33, 49, 89, 17, + 49, 145, 81, 49, 98, 17, 17, 49, 49, 97, 33, 33, + 17, 65, 97, 33, 33, 17, 65, 81, 49, 65, 65, 65, + 65, 49, 81, 115, 33, 97, 240, 65, 0, 8, + 0, 0, // Padding + + // + // Block 108 Offsets: Codepoints 0x65e5 - 0x65e5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 108 Data: Codepoints 0x65e5 - 0x65e5 + // + 37, 14, 240, 240, 129, 60, 33, 145, 49, 145, 49, 145, + 49, 145, 49, 145, 59, 49, 145, 49, 145, 49, 145, 49, + 145, 49, 145, 49, 145, 59, 49, 145, 49, 145, 0, 7, + 48, + 0, 0, 0, // Padding + + // + // Block 109 Offsets: Codepoints 0x6620 - 0x6620 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 109 Data: Codepoints 0x6620 - 0x6620 + // + 70, 20, 240, 240, 18, 177, 97, 134, 81, 129, 49, 97, + 33, 81, 49, 41, 65, 49, 33, 49, 33, 81, 49, 33, + 49, 33, 81, 49, 33, 49, 33, 85, 33, 49, 33, 81, + 49, 33, 49, 33, 17, 49, 62, 33, 49, 97, 129, 49, + 82, 129, 49, 81, 17, 117, 65, 33, 113, 49, 49, 65, + 97, 97, 82, 177, 114, 130, 161, 0, 7, 112, + 0, 0, // Padding + + // + // Block 110 Offsets: Codepoints 0x662f - 0x662f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 110 Data: Codepoints 0x662f - 0x662f + // + 42, 19, 240, 240, 17, 170, 145, 113, 161, 113, 169, 161, + 113, 161, 113, 169, 161, 162, 47, 2, 161, 226, 33, 225, + 49, 66, 113, 71, 114, 49, 193, 33, 33, 193, 49, 17, + 177, 90, 33, 0, 9, 48, + 0, 0, // Padding + + // + // Block 111 Offsets: Codepoints 0x66f4 - 0x66f4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 111 Data: Codepoints 0x66f4 - 0x66f4 + // + 46, 20, 240, 240, 97, 63, 3, 177, 240, 65, 65, 141, + 113, 81, 65, 129, 81, 65, 140, 129, 81, 65, 129, 81, + 65, 140, 129, 81, 65, 225, 240, 17, 17, 240, 50, 240, + 36, 241, 66, 178, 118, 35, 194, 0, 7, 112, + 0, 0, // Padding + + // + // Block 112 Offsets: Codepoints 0x66ff - 0x66ff + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 112 Data: Codepoints 0x66ff - 0x66ff + // + 50, 20, 240, 146, 98, 161, 33, 65, 49, 71, 24, 113, + 113, 177, 33, 65, 49, 56, 25, 97, 114, 145, 18, 65, + 33, 129, 49, 33, 65, 97, 97, 49, 19, 34, 43, 145, + 129, 161, 129, 170, 161, 129, 161, 129, 170, 161, 129, 0, + 10, 96, + 0, 0, // Padding + + // + // Block 113 Offsets: Codepoints 0x672c - 0x672c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 113 Data: Codepoints 0x672c - 0x672c + // + 50, 20, 240, 225, 240, 65, 240, 65, 240, 65, 97, 79, + 2, 148, 240, 17, 18, 240, 17, 17, 17, 225, 33, 17, + 209, 49, 33, 193, 49, 49, 161, 65, 50, 129, 81, 51, + 97, 44, 65, 113, 98, 33, 129, 240, 65, 240, 65, 0, + 11, 32, + 0, 0, // Padding + + // + // Block 114 Offsets: Codepoints 0x677f - 0x677f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 114 Data: Codepoints 0x677f - 0x677f + // + 68, 20, 240, 129, 240, 65, 162, 113, 65, 20, 145, 66, + 209, 17, 33, 183, 17, 225, 72, 98, 65, 17, 66, 83, + 49, 17, 65, 98, 17, 33, 17, 50, 81, 17, 33, 17, + 33, 33, 97, 17, 65, 33, 33, 81, 33, 65, 50, 145, + 49, 66, 145, 49, 66, 145, 49, 49, 18, 129, 33, 49, + 50, 113, 17, 34, 83, 145, 0, 9, + // + // Block 115 Offsets: Codepoints 0x679c - 0x679c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 115 Data: Codepoints 0x679c - 0x679c + // + 51, 20, 240, 240, 49, 156, 129, 65, 65, 145, 65, 65, + 155, 145, 65, 65, 145, 65, 65, 155, 145, 65, 65, 225, + 98, 63, 2, 145, 18, 240, 17, 17, 17, 225, 33, 33, + 193, 49, 49, 146, 65, 66, 97, 97, 99, 161, 240, 65, + 0, 8, 112, + 0, // Padding + + // + // Block 116 Offsets: Codepoints 0x69cb - 0x69cb + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 116 Data: Codepoints 0x69cb - 0x69cb + // + 67, 20, 240, 129, 81, 49, 145, 81, 49, 33, 97, 59, + 81, 17, 49, 49, 17, 71, 25, 97, 81, 49, 145, 81, + 49, 34, 66, 44, 67, 97, 162, 17, 41, 65, 17, 65, + 33, 49, 81, 17, 72, 65, 33, 65, 33, 49, 113, 65, + 33, 49, 17, 81, 29, 81, 65, 97, 113, 65, 97, 113, + 65, 52, 113, 65, 82, 0, 8, + 0, // Padding + + // + // Block 117 Offsets: Codepoints 0x6a5f - 0x6a5f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 117 Data: Codepoints 0x6a5f - 0x6a5f + // + 90, 20, 240, 130, 49, 34, 17, 129, 65, 33, 33, 129, + 49, 19, 17, 18, 97, 49, 17, 17, 17, 17, 113, 17, + 18, 33, 34, 70, 33, 33, 33, 129, 49, 49, 17, 33, + 97, 33, 20, 19, 17, 67, 33, 49, 33, 114, 17, 97, + 17, 17, 82, 44, 49, 17, 65, 49, 129, 17, 65, 49, + 34, 49, 33, 66, 49, 17, 113, 49, 33, 34, 129, 49, + 33, 34, 33, 81, 33, 84, 17, 81, 33, 65, 51, 81, + 17, 50, 97, 0, 7, 96, + 0, 0, // Padding + + // + // Block 118 Offsets: Codepoints 0x6b21 - 0x6b21 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 118 Data: Codepoints 0x6b21 - 0x6b21 + // + 58, 20, 240, 226, 240, 49, 177, 113, 194, 17, 33, 113, + 97, 17, 42, 97, 49, 113, 113, 33, 34, 49, 129, 17, + 50, 33, 129, 33, 50, 177, 98, 161, 114, 131, 113, 17, + 145, 97, 33, 145, 97, 49, 129, 82, 49, 129, 81, 81, + 113, 65, 114, 81, 34, 146, 82, 0, 9, 48, + 0, 0, // Padding + + // + // Block 119 Offsets: Codepoints 0x6b64 - 0x6b64 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 119 Data: Codepoints 0x6b64 - 0x6b64 + // + 60, 19, 240, 240, 210, 49, 209, 65, 209, 65, 209, 65, + 65, 66, 33, 65, 65, 65, 49, 33, 17, 49, 81, 54, + 33, 97, 49, 65, 17, 113, 49, 66, 129, 49, 65, 145, + 49, 65, 145, 49, 65, 145, 49, 65, 145, 49, 18, 17, + 145, 35, 49, 81, 36, 97, 81, 33, 151, 0, 9, 96, + // + // Block 120 Offsets: Codepoints 0x6f14 - 0x6f14 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 120 Data: Codepoints 0x6f14 - 0x6f14 + // + 60, 21, 240, 113, 145, 178, 113, 81, 97, 60, 82, 17, + 145, 129, 17, 130, 141, 65, 33, 113, 161, 17, 113, 65, + 81, 17, 59, 97, 49, 49, 65, 97, 74, 97, 65, 49, + 65, 67, 65, 49, 65, 82, 74, 97, 65, 129, 97, 98, + 34, 129, 66, 98, 82, 49, 146, 114, 177, 0, 8, 32, + // + // Block 121 Offsets: Codepoints 0x73b0 - 0x73b0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 121 Data: Codepoints 0x73b0 - 0x73b0 + // + 70, 20, 240, 240, 97, 129, 41, 55, 17, 113, 97, 65, + 113, 97, 65, 49, 49, 97, 65, 49, 49, 97, 65, 49, + 49, 97, 17, 33, 49, 49, 55, 17, 49, 49, 97, 65, + 49, 49, 97, 65, 51, 17, 97, 65, 50, 33, 97, 65, + 33, 17, 33, 97, 18, 65, 17, 131, 81, 33, 98, 113, + 49, 49, 161, 65, 49, 130, 85, 0, 10, 32, + 0, 0, // Padding + + // + // Block 122 Offsets: Codepoints 0x7528 - 0x7528 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 122 Data: Codepoints 0x7528 - 0x7528 + // + 52, 18, 240, 240, 33, 94, 65, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 93, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 93, 81, 81, 81, 65, 97, 81, 65, + 97, 81, 65, 97, 81, 49, 113, 81, 49, 113, 81, 177, + 36, 0, 9, 48, + // + // Block 123 Offsets: Codepoints 0x753b - 0x753b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 123 Data: Codepoints 0x753b - 0x753b + // + 61, 19, 0, 6, 81, 63, 2, 240, 240, 49, 169, 34, + 50, 17, 49, 49, 33, 65, 33, 49, 49, 33, 65, 33, + 49, 49, 33, 65, 41, 33, 65, 33, 49, 49, 33, 65, + 33, 49, 49, 33, 65, 33, 49, 49, 33, 65, 41, 33, + 65, 33, 113, 33, 65, 33, 161, 79, 65, 209, 0, 9, + 112, + 0, 0, 0, // Padding + + // + // Block 124 Offsets: Codepoints 0x7684 - 0x7684 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 124 Data: Codepoints 0x7684 - 0x7684 + // + 61, 19, 240, 114, 82, 161, 97, 161, 97, 177, 33, 49, + 81, 55, 40, 33, 65, 33, 97, 49, 65, 33, 97, 49, + 65, 17, 113, 49, 65, 17, 17, 81, 54, 65, 65, 49, + 65, 66, 49, 49, 65, 81, 49, 49, 65, 145, 49, 65, + 145, 49, 65, 145, 54, 145, 49, 65, 129, 65, 164, 0, + 10, + 0, 0, 0, // Padding + + // + // Block 125 Offsets: Codepoints 0x793a - 0x793a + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 125 Data: Codepoints 0x793a - 0x793a + // + 39, 19, 0, 6, 49, 125, 0, 9, 66, 47, 2, 161, + 240, 49, 225, 49, 33, 162, 49, 49, 145, 65, 65, 113, + 81, 81, 81, 97, 97, 49, 113, 97, 177, 240, 34, 244, + 0, 8, 48, + 0, // Padding + + // + // Block 126 Offsets: Codepoints 0x79fb - 0x79fb + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 126 Data: Codepoints 0x79fb - 0x79fb + // + 63, 20, 240, 240, 243, 50, 147, 97, 65, 113, 87, 113, + 81, 81, 113, 33, 17, 17, 49, 88, 34, 17, 145, 129, + 146, 113, 163, 66, 18, 130, 17, 18, 38, 65, 17, 33, + 49, 66, 49, 33, 82, 65, 65, 33, 65, 33, 34, 49, + 49, 34, 49, 33, 129, 145, 145, 114, 161, 82, 193, 35, + 0, 8, 96, + 0, // Padding + + // + // Block 127 Offsets: Codepoints 0x7a0b - 0x7a0b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 127 Data: Codepoints 0x7a0b - 0x7a0b + // + 58, 21, 240, 193, 145, 117, 25, 66, 17, 65, 97, 129, + 65, 97, 129, 65, 97, 129, 33, 17, 97, 87, 24, 129, + 65, 113, 99, 43, 82, 17, 97, 145, 17, 18, 81, 145, + 17, 129, 129, 33, 129, 33, 81, 33, 58, 49, 49, 129, + 177, 129, 177, 129, 49, 113, 44, 0, 10, 96, + 0, 0, // Padding + + // + // Block 128 Offsets: Codepoints 0x7acb - 0x7acb + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 128 Data: Codepoints 0x7acb - 0x7acb + // + 41, 19, 240, 177, 240, 49, 240, 65, 240, 49, 81, 95, + 240, 240, 65, 145, 129, 161, 97, 177, 97, 193, 81, 193, + 65, 209, 65, 210, 49, 209, 49, 240, 49, 240, 33, 97, + 63, 2, 0, 9, 96, + 0, 0, 0, // Padding + + // + // Block 129 Offsets: Codepoints 0x7b80 - 0x7b80 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 129 Data: Codepoints 0x7b80 - 0x7b80 + // + 65, 20, 240, 129, 113, 177, 65, 33, 66, 79, 1, 65, + 33, 65, 33, 113, 65, 33, 65, 81, 33, 65, 242, 41, + 225, 49, 97, 54, 49, 97, 49, 65, 49, 97, 49, 65, + 49, 97, 54, 49, 97, 49, 65, 49, 97, 49, 65, 49, + 97, 54, 49, 97, 49, 65, 49, 97, 49, 129, 97, 148, + 97, 177, 0, 8, 16, + 0, 0, 0, // Padding + + // + // Block 130 Offsets: Codepoints 0x7f6e - 0x7f6e + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 130 Data: Codepoints 0x7f6e - 0x7f6e + // + 41, 19, 240, 240, 49, 110, 81, 49, 49, 49, 97, 49, + 49, 49, 109, 97, 81, 81, 193, 97, 63, 2, 161, 235, + 129, 129, 154, 145, 129, 154, 145, 129, 154, 145, 129, 33, + 47, 2, 0, 9, 96, + 0, 0, 0, // Padding + + // + // Block 131 Offsets: Codepoints 0x80fd - 0x80fd + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 131 Data: Codepoints 0x80fd - 0x80fd + // + 62, 21, 240, 240, 242, 97, 65, 113, 49, 49, 50, 97, + 81, 33, 33, 98, 23, 19, 115, 129, 81, 161, 49, 81, + 87, 39, 81, 65, 241, 65, 49, 182, 49, 65, 97, 65, + 49, 50, 97, 65, 49, 33, 134, 51, 145, 65, 49, 177, + 65, 49, 81, 81, 65, 49, 82, 65, 35, 55, 145, 0, + 9, 80, + 0, 0, // Padding + + // + // Block 132 Offsets: Codepoints 0x898b - 0x898b + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 132 Data: Codepoints 0x898b - 0x898b + // + 43, 19, 240, 240, 33, 140, 113, 145, 129, 145, 139, 129, + 145, 129, 145, 139, 129, 145, 129, 145, 139, 129, 33, 33, + 49, 177, 33, 225, 49, 225, 49, 209, 65, 81, 97, 81, + 82, 50, 103, 49, 0, 9, 48, + 0, // Padding + + // + // Block 133 Offsets: Codepoints 0x89c1 - 0x89c1 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 133 Data: Codepoints 0x89c1 - 0x89c1 + // + 56, 19, 240, 240, 17, 154, 145, 129, 145, 129, 145, 65, + 49, 145, 65, 49, 145, 65, 49, 145, 65, 49, 145, 65, + 49, 145, 66, 33, 145, 49, 17, 33, 145, 49, 17, 33, + 209, 17, 240, 17, 17, 241, 33, 97, 113, 49, 97, 82, + 65, 82, 50, 103, 49, 0, 9, 48, + // + // Block 134 Offsets: Codepoints 0x8a00 - 0x8a00 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 134 Data: Codepoints 0x8a00 - 0x8a00 + // + 36, 20, 0, 6, 2, 240, 65, 97, 63, 3, 240, 240, + 81, 171, 240, 240, 129, 171, 240, 240, 129, 171, 145, 129, + 161, 129, 161, 129, 170, 161, 129, 161, 129, 0, 8, 32, + // + // Block 135 Offsets: Codepoints 0x8a2d - 0x8a2d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 135 Data: Codepoints 0x8a2d - 0x8a2d + // + 59, 20, 240, 240, 49, 130, 86, 129, 81, 49, 145, 33, + 33, 49, 104, 17, 49, 177, 49, 49, 117, 33, 69, 145, + 240, 34, 113, 101, 25, 209, 65, 161, 49, 49, 118, 49, + 33, 113, 49, 65, 17, 129, 49, 82, 129, 49, 82, 133, + 50, 34, 97, 49, 18, 83, 130, 145, 0, 7, 112, + 0, // Padding + + // + // Block 136 Offsets: Codepoints 0x8a9e - 0x8a9e + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 136 Data: Codepoints 0x8a9e - 0x8a9e + // + 55, 20, 240, 129, 178, 113, 57, 113, 97, 225, 65, 135, + 65, 49, 145, 41, 69, 81, 49, 225, 65, 145, 65, 65, + 17, 53, 27, 240, 193, 145, 85, 55, 81, 49, 49, 81, + 81, 49, 49, 81, 81, 49, 49, 81, 85, 55, 81, 49, + 49, 81, 81, 113, 81, 0, 8, + 0, // Padding + + // + // Block 137 Offsets: Codepoints 0x8bb8 - 0x8bb8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 137 Data: Codepoints 0x8bb8 - 0x8bb8 + // + 49, 21, 240, 241, 209, 97, 226, 65, 241, 49, 113, 129, + 58, 161, 65, 177, 49, 65, 133, 17, 81, 177, 129, 177, + 129, 65, 97, 45, 81, 129, 177, 129, 177, 129, 177, 33, + 81, 177, 17, 97, 178, 113, 162, 129, 240, 81, 0, 8, + 112, + 0, 0, 0, // Padding + + // + // Block 138 Offsets: Codepoints 0x8bbe - 0x8bbe + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 138 Data: Codepoints 0x8bbe - 0x8bbe + // + 55, 20, 240, 240, 49, 129, 102, 129, 81, 49, 145, 81, + 49, 241, 49, 241, 49, 145, 65, 69, 37, 33, 241, 161, + 129, 57, 113, 81, 65, 129, 81, 49, 145, 97, 33, 145, + 33, 49, 17, 161, 17, 82, 162, 98, 146, 82, 33, 225, + 82, 162, 114, 129, 0, 6, 96, + 0, // Padding + + // + // Block 139 Offsets: Codepoints 0x8bed - 0x8bed + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 139 Data: Codepoints 0x8bed - 0x8bed + // + 53, 21, 240, 240, 113, 98, 43, 114, 81, 240, 81, 49, + 217, 129, 97, 49, 101, 81, 49, 145, 81, 65, 145, 81, + 65, 33, 97, 30, 81, 240, 81, 177, 129, 73, 113, 17, + 33, 97, 130, 49, 97, 129, 65, 97, 129, 72, 209, 97, + 209, 97, 0, 8, 64, + 0, 0, 0, // Padding + + // + // Block 140 Offsets: Codepoints 0x8f6f - 0x8f6f + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 140 Data: Codepoints 0x8f6f - 0x8f6f + // + 61, 19, 240, 113, 113, 161, 113, 145, 65, 49, 121, 17, + 81, 65, 119, 65, 113, 65, 65, 34, 49, 65, 81, 33, + 49, 81, 81, 33, 33, 65, 104, 65, 161, 113, 161, 113, + 161, 33, 50, 133, 65, 17, 82, 33, 97, 17, 145, 81, + 49, 129, 65, 66, 113, 49, 98, 97, 33, 129, 0, 7, + 48, + 0, 0, 0, // Padding + + // + // Block 141 Offsets: Codepoints 0x90e8 - 0x90e8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 141 Data: Codepoints 0x90e8 - 0x90e8 + // + 68, 20, 65, 240, 81, 240, 65, 102, 113, 49, 33, 49, + 74, 17, 49, 97, 129, 33, 113, 50, 49, 33, 129, 33, + 65, 17, 145, 17, 34, 17, 17, 93, 33, 240, 17, 49, + 177, 49, 65, 72, 33, 65, 65, 81, 49, 65, 65, 81, + 49, 50, 65, 81, 49, 19, 81, 81, 49, 151, 49, 145, + 81, 49, 145, 81, 49, 0, 8, 48, + // + // Block 142 Offsets: Codepoints 0x914d - 0x914d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 142 Data: Codepoints 0x914d - 0x914d + // + 68, 20, 240, 209, 113, 58, 23, 81, 33, 145, 97, 33, + 145, 97, 33, 17, 113, 73, 97, 65, 17, 33, 17, 113, + 65, 17, 33, 17, 38, 65, 17, 33, 17, 33, 65, 65, + 17, 33, 17, 33, 146, 51, 33, 146, 81, 33, 145, 97, + 33, 152, 33, 145, 97, 33, 81, 49, 97, 33, 81, 56, + 33, 81, 49, 97, 39, 0, 10, 32, + // + // Block 143 Offsets: Codepoints 0x94ae - 0x94ae + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 143 Data: Codepoints 0x94ae - 0x94ae + // + 61, 20, 240, 113, 240, 65, 193, 97, 33, 41, 85, 65, + 49, 81, 145, 49, 81, 50, 65, 49, 86, 65, 49, 65, + 33, 113, 49, 113, 113, 49, 113, 33, 24, 71, 49, 65, + 113, 97, 65, 113, 97, 65, 113, 97, 65, 113, 33, 49, + 65, 115, 65, 65, 114, 81, 65, 17, 81, 44, 0, 10, + 32, + 0, 0, 0, // Padding + + // + // Block 144 Offsets: Codepoints 0x9593 - 0x9593 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 144 Data: Codepoints 0x9593 - 0x9593 + // + 64, 19, 240, 145, 145, 55, 40, 33, 65, 49, 81, 54, + 55, 49, 65, 49, 81, 49, 65, 49, 81, 54, 55, 49, + 65, 49, 81, 49, 145, 65, 49, 56, 49, 49, 49, 81, + 65, 49, 55, 65, 49, 49, 81, 65, 49, 49, 81, 65, + 49, 55, 65, 49, 49, 81, 65, 49, 225, 49, 180, 240, + 33, 0, 7, 80, + // + // Block 145 Offsets: Codepoints 0x95ea - 0x95ea + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 145 Data: Codepoints 0x95ea - 0x95ea + // + 57, 18, 240, 240, 33, 82, 42, 81, 161, 49, 209, 49, + 98, 81, 49, 97, 97, 49, 97, 97, 49, 97, 97, 49, + 82, 97, 49, 81, 17, 81, 49, 81, 33, 65, 49, 65, + 65, 49, 49, 49, 97, 33, 49, 33, 113, 33, 49, 209, + 49, 209, 49, 209, 49, 179, 0, 9, 48, + 0, 0, 0, // Padding + + // + // Block 146 Offsets: Codepoints 0x95f4 - 0x95f4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 146 Data: Codepoints 0x95f4 - 0x95f4 + // + 61, 18, 240, 65, 193, 81, 58, 81, 161, 240, 33, 50, + 129, 49, 49, 55, 49, 49, 49, 81, 49, 49, 49, 81, + 49, 49, 49, 81, 49, 49, 55, 49, 49, 49, 81, 49, + 49, 49, 81, 49, 49, 49, 81, 49, 49, 55, 49, 49, + 49, 81, 49, 49, 209, 49, 209, 49, 179, 49, 0, 8, + 112, + 0, 0, 0, // Padding + + // + // Block 147 Offsets: Codepoints 0x9762 - 0x9762 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 147 Data: Codepoints 0x9762 - 0x9762 + // + 58, 20, 240, 240, 97, 63, 3, 161, 240, 65, 240, 49, + 113, 111, 81, 49, 65, 49, 97, 49, 65, 49, 97, 49, + 65, 49, 97, 54, 49, 97, 49, 65, 49, 97, 49, 65, + 49, 97, 54, 49, 97, 49, 65, 49, 97, 49, 65, 49, + 97, 49, 65, 49, 110, 97, 193, 0, 10, 64, + 0, 0, // Padding + + // + // Block 148 Offsets: Codepoints 0xac00 - 0xac00 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 148 Data: Codepoints 0xac00 - 0xac00 + // + 44, 20, 240, 240, 18, 240, 66, 240, 65, 240, 65, 121, + 49, 225, 65, 210, 65, 209, 81, 194, 81, 193, 101, 113, + 113, 161, 129, 145, 145, 129, 161, 98, 177, 240, 65, 240, + 65, 240, 65, 240, 65, 0, 8, 32, + // + // Block 149 Offsets: Codepoints 0xac19 - 0xac19 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 149 Data: Codepoints 0xac19 - 0xac19 + // + 39, 19, 0, 6, 3, 240, 49, 104, 65, 194, 65, 193, + 81, 178, 85, 113, 97, 161, 113, 145, 129, 114, 145, 97, + 240, 106, 161, 240, 49, 240, 57, 161, 240, 49, 240, 58, + 0, 7, 96, + 0, // Padding + + // + // Block 150 Offsets: Codepoints 0xac1c - 0xac1c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 150 Data: Codepoints 0xac1c - 0xac1c + // + 54, 16, 240, 195, 162, 49, 177, 49, 177, 49, 39, 33, + 49, 114, 33, 49, 113, 49, 49, 113, 49, 49, 97, 65, + 49, 97, 69, 81, 81, 49, 65, 97, 49, 65, 97, 49, + 49, 113, 49, 33, 129, 49, 177, 49, 177, 49, 177, 49, + 177, 49, 241, 240, 240, 64, + 0, 0, // Padding + + // + // Block 151 Offsets: Codepoints 0xac83 - 0xac83 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 151 Data: Codepoints 0xac83 - 0xac83 + // + 44, 17, 240, 210, 240, 33, 240, 17, 72, 65, 162, 65, + 161, 81, 145, 97, 130, 22, 114, 113, 98, 129, 82, 145, + 65, 97, 65, 49, 130, 33, 178, 49, 178, 225, 33, 193, + 66, 145, 114, 82, 145, 0, 6, 80, + // + // Block 152 Offsets: Codepoints 0xac8c - 0xac8c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 152 Data: Codepoints 0xac8c - 0xac8c + // + 54, 17, 240, 212, 178, 49, 193, 49, 193, 49, 40, 33, + 49, 129, 49, 49, 129, 49, 49, 113, 65, 49, 113, 65, + 49, 97, 21, 49, 82, 81, 49, 81, 97, 49, 65, 113, + 49, 49, 129, 49, 33, 145, 49, 193, 49, 193, 49, 193, + 49, 193, 49, 0, 6, 80, + 0, 0, // Padding + + // + // Block 153 Offsets: Codepoints 0xacf5 - 0xacf5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 153 Data: Codepoints 0xacf5 - 0xacf5 + // + 36, 20, 0, 7, 124, 240, 49, 240, 65, 210, 65, 225, + 49, 241, 49, 241, 191, 3, 240, 242, 240, 36, 241, 65, + 209, 97, 193, 97, 193, 97, 209, 65, 244, 0, 8, 80, + // + // Block 154 Offsets: Codepoints 0xacfc - 0xacfc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 154 Data: Codepoints 0xacfc - 0xacfc + // + 48, 20, 240, 240, 19, 240, 65, 240, 65, 137, 33, 242, + 33, 241, 49, 241, 49, 241, 49, 162, 49, 49, 177, 33, + 69, 113, 33, 65, 177, 113, 177, 98, 98, 55, 17, 116, + 129, 240, 65, 240, 65, 240, 65, 240, 65, 0, 8, 32, + // + // Block 155 Offsets: Codepoints 0xad6c - 0xad6d + // + 0x08, 0x00, 0x00, 0x00, // Offset 8 (0x8) + 0x30, 0x00, 0x00, 0x00, // Offset 48 (0x30) + + // + // Block 155 Data: Codepoints 0xad6c - 0xad6d + // + 40, 19, 0, 7, 60, 240, 34, 240, 34, 240, 33, 240, + 49, 240, 49, 240, 33, 240, 49, 127, 2, 161, 240, 49, + 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, + 240, 49, 0, 6, 38, 20, 0, 8, 11, 240, 49, 240, + 65, 240, 65, 240, 65, 240, 49, 127, 3, 177, 240, 65, + 240, 65, 219, 240, 65, 240, 65, 240, 65, 240, 65, 240, + 65, 240, 65, 0, 8, 32, + 0, 0, // Padding + + // + // Block 156 Offsets: Codepoints 0xadf8 - 0xadf8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 156 Data: Codepoints 0xadf8 - 0xadf8 + // + 32, 19, 0, 9, 109, 240, 34, 240, 33, 240, 49, 240, + 49, 240, 49, 240, 34, 240, 33, 240, 49, 240, 49, 240, + 49, 240, 33, 127, 2, 0, 14, 64, + // + // Block 157 Offsets: Codepoints 0xae30 - 0xae30 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 157 Data: Codepoints 0xae30 - 0xae30 + // + 36, 16, 240, 194, 242, 241, 241, 57, 49, 161, 65, 146, + 65, 145, 81, 129, 97, 114, 97, 113, 113, 97, 129, 81, + 145, 50, 161, 33, 193, 241, 241, 241, 241, 0, 6, 32, + // + // Block 158 Offsets: Codepoints 0xaed8 - 0xaed8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 158 Data: Codepoints 0xaed8 - 0xaed8 + // + 61, 17, 240, 226, 195, 33, 209, 33, 209, 33, 42, 17, + 33, 97, 49, 33, 33, 97, 49, 33, 33, 82, 34, 33, + 33, 81, 49, 49, 33, 66, 53, 33, 65, 49, 65, 33, + 49, 65, 65, 33, 33, 65, 81, 33, 97, 97, 33, 81, + 113, 33, 209, 33, 209, 33, 209, 33, 209, 33, 0, 6, + 80, + 0, 0, 0, // Padding + + // + // Block 159 Offsets: Codepoints 0xb110 - 0xb110 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 159 Data: Codepoints 0xb110 - 0xb110 + // + 39, 17, 240, 240, 243, 240, 17, 51, 161, 81, 161, 81, + 71, 81, 161, 81, 161, 81, 67, 49, 85, 97, 240, 154, + 240, 17, 240, 17, 122, 129, 240, 17, 240, 17, 240, 26, + 0, 6, 80, + 0, // Padding + + // + // Block 160 Offsets: Codepoints 0xb204 - 0xb204 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 160 Data: Codepoints 0xb204 - 0xb204 + // + 39, 20, 240, 240, 194, 240, 81, 240, 65, 240, 65, 240, + 65, 240, 65, 240, 75, 240, 240, 255, 3, 177, 240, 65, + 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, + 0, 8, 96, + 0, // Padding + + // + // Block 161 Offsets: Codepoints 0xb20c - 0xb20c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 161 Data: Codepoints 0xb20c - 0xb20c + // + 38, 20, 240, 240, 194, 240, 81, 240, 65, 240, 65, 240, + 65, 240, 75, 240, 175, 3, 33, 129, 240, 65, 240, 65, + 234, 240, 65, 240, 65, 155, 177, 240, 65, 240, 74, 0, + 8, 16, + 0, 0, // Padding + + // + // Block 162 Offsets: Codepoints 0xb294 - 0xb294 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 162 Data: Codepoints 0xb294 - 0xb294 + // + 37, 19, 240, 240, 161, 240, 66, 240, 49, 240, 49, 240, + 49, 240, 49, 240, 58, 240, 240, 223, 2, 240, 240, 210, + 240, 49, 240, 49, 240, 49, 240, 49, 240, 59, 0, 7, + 80, + 0, 0, 0, // Padding + + // + // Block 163 Offsets: Codepoints 0xb2a5 - 0xb2a5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 163 Data: Codepoints 0xb2a5 - 0xb2a5 + // + 36, 20, 240, 240, 210, 240, 65, 240, 65, 240, 65, 240, + 65, 240, 74, 0, 7, 113, 47, 2, 240, 244, 241, 65, + 209, 97, 193, 97, 193, 97, 209, 65, 244, 0, 8, 80, + // + // Block 164 Offsets: Codepoints 0xb2c8 - 0xb2c8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 164 Data: Codepoints 0xb2c8 - 0xb2c8 + // + 35, 15, 240, 240, 163, 225, 225, 34, 161, 49, 161, 49, + 161, 49, 161, 49, 161, 49, 161, 49, 146, 49, 84, 17, + 54, 81, 225, 225, 225, 225, 225, 225, 0, 5, 112, + 0, // Padding + + // + // Block 165 Offsets: Codepoints 0xb2e4 - 0xb2e4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 165 Data: Codepoints 0xb2e4 - 0xb2e4 + // + 44, 19, 240, 211, 240, 65, 240, 49, 240, 49, 105, 49, + 113, 161, 113, 161, 113, 161, 113, 165, 49, 161, 113, 146, + 113, 84, 17, 118, 81, 240, 49, 240, 49, 240, 49, 240, + 49, 240, 49, 240, 49, 0, 7, 112, + // + // Block 166 Offsets: Codepoints 0xb2e8 - 0xb2e8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 166 Data: Codepoints 0xb2e8 - 0xb2e8 + // + 42, 19, 0, 6, 3, 240, 49, 240, 49, 105, 49, 113, + 161, 113, 161, 113, 161, 113, 165, 49, 131, 113, 53, 33, + 116, 113, 240, 49, 145, 129, 162, 97, 177, 240, 49, 240, + 49, 240, 57, 0, 7, 96, + 0, 0, // Padding + + // + // Block 167 Offsets: Codepoints 0xb300 - 0xb300 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 167 Data: Codepoints 0xb300 - 0xb300 + // + 54, 17, 240, 227, 178, 49, 193, 49, 193, 49, 40, 33, + 49, 65, 113, 49, 65, 113, 49, 65, 113, 49, 65, 113, + 49, 65, 117, 65, 113, 49, 65, 113, 49, 65, 53, 49, + 68, 65, 49, 193, 49, 193, 49, 193, 49, 193, 49, 193, + 49, 240, 17, 240, 240, 96, + 0, 0, // Padding + + // + // Block 168 Offsets: Codepoints 0xb370 - 0xb370 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 168 Data: Codepoints 0xb370 - 0xb370 + // + 56, 17, 240, 227, 178, 49, 193, 49, 193, 49, 40, 33, + 49, 65, 113, 49, 65, 113, 49, 65, 113, 49, 65, 53, + 49, 65, 113, 49, 65, 113, 49, 65, 113, 49, 65, 50, + 33, 49, 68, 65, 49, 193, 49, 193, 49, 193, 49, 193, + 49, 193, 49, 240, 17, 240, 240, 96, + // + // Block 169 Offsets: Codepoints 0xb3d9 - 0xb3d9 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 169 Data: Codepoints 0xb3d9 - 0xb3d9 + // + 37, 20, 0, 7, 123, 161, 240, 65, 240, 65, 240, 74, + 241, 240, 65, 240, 65, 113, 47, 3, 161, 240, 52, 241, + 65, 209, 97, 193, 97, 193, 97, 209, 65, 244, 0, 8, + 80, + 0, 0, 0, // Padding + + // + // Block 170 Offsets: Codepoints 0xb418 - 0xb418 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 170 Data: Codepoints 0xb418 - 0xb418 + // + 39, 16, 240, 194, 240, 17, 241, 57, 49, 65, 161, 65, + 161, 65, 161, 65, 161, 65, 161, 72, 49, 129, 97, 129, + 97, 129, 82, 134, 17, 38, 113, 241, 241, 241, 241, 241, + 240, 240, 64, + 0, // Padding + + // + // Block 171 Offsets: Codepoints 0xb77c - 0xb77c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 171 Data: Codepoints 0xb77c - 0xb77c + // + 43, 19, 240, 227, 240, 49, 240, 49, 105, 49, 209, 65, + 209, 65, 209, 65, 209, 65, 105, 53, 49, 161, 113, 161, + 113, 161, 113, 101, 119, 65, 240, 49, 240, 49, 240, 49, + 240, 49, 240, 49, 0, 7, 112, + 0, // Padding + + // + // Block 172 Offsets: Codepoints 0xb798 - 0xb798 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 172 Data: Codepoints 0xb798 - 0xb798 + // + 55, 16, 240, 193, 178, 50, 177, 49, 177, 49, 39, 33, + 49, 114, 33, 49, 113, 49, 49, 113, 49, 49, 39, 33, + 49, 49, 117, 49, 113, 49, 49, 113, 49, 49, 98, 49, + 49, 36, 17, 49, 51, 81, 49, 177, 49, 177, 49, 177, + 49, 177, 49, 241, 240, 240, 64, + 0, // Padding + + // + // Block 173 Offsets: Codepoints 0xb7a8 - 0xb7a8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 173 Data: Codepoints 0xb7a8 - 0xb7a8 + // + 47, 16, 240, 194, 163, 49, 177, 49, 39, 33, 49, 114, + 33, 49, 113, 49, 49, 114, 37, 54, 33, 49, 49, 113, + 49, 49, 113, 49, 49, 68, 49, 53, 49, 49, 240, 122, + 113, 113, 113, 113, 113, 113, 121, 113, 0, 7, 32, + 0, // Padding + + // + // Block 174 Offsets: Codepoints 0xb7ec - 0xb7ec + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 174 Data: Codepoints 0xb7ec - 0xb7ec + // + 37, 15, 240, 163, 225, 225, 40, 65, 130, 65, 130, 65, + 129, 81, 129, 81, 40, 20, 49, 161, 49, 161, 49, 161, + 49, 97, 49, 55, 65, 225, 225, 225, 225, 225, 0, 5, + 112, + 0, 0, 0, // Padding + + // + // Block 175 Offsets: Codepoints 0xb85c - 0xb85c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 175 Data: Codepoints 0xb85c - 0xb85c + // + 29, 19, 0, 9, 107, 240, 49, 240, 49, 240, 49, 139, + 145, 240, 49, 240, 49, 240, 59, 209, 240, 49, 240, 49, + 175, 2, 0, 14, 64, + 0, 0, 0, // Padding + + // + // Block 176 Offsets: Codepoints 0xb86d - 0xb86d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 176 Data: Codepoints 0xb86d - 0xb86d + // + 36, 20, 240, 240, 219, 240, 65, 240, 65, 155, 161, 240, + 65, 240, 75, 225, 240, 65, 175, 3, 240, 163, 98, 177, + 113, 185, 177, 113, 177, 113, 185, 177, 113, 0, 8, 32, + // + // Block 177 Offsets: Codepoints 0xb974 - 0xb974 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 177 Data: Codepoints 0xb974 - 0xb974 + // + 26, 19, 0, 9, 107, 240, 49, 240, 49, 240, 49, 139, + 145, 240, 49, 240, 49, 240, 59, 0, 7, 111, 2, 0, + 14, 64, + 0, 0, // Padding + + // + // Block 178 Offsets: Codepoints 0xb97c - 0xb97c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 178 Data: Codepoints 0xb97c - 0xb97c + // + 34, 19, 240, 240, 186, 240, 49, 240, 49, 154, 161, 240, + 49, 240, 58, 240, 159, 2, 240, 240, 234, 240, 33, 240, + 49, 155, 145, 240, 49, 240, 58, 0, 7, 96, + 0, 0, // Padding + + // + // Block 179 Offsets: Codepoints 0xb9ac - 0xb9ac + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 179 Data: Codepoints 0xb9ac - 0xb9ac + // + 36, 15, 240, 163, 225, 225, 40, 65, 145, 65, 145, 65, + 145, 65, 145, 65, 40, 65, 49, 161, 49, 161, 49, 161, + 49, 101, 55, 65, 225, 225, 225, 225, 225, 0, 5, 112, + // + // Block 180 Offsets: Codepoints 0xb9cc - 0xb9cc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 180 Data: Codepoints 0xb9cc - 0xb9cc + // + 48, 19, 240, 227, 240, 49, 240, 49, 105, 49, 113, 82, + 49, 113, 81, 65, 113, 81, 65, 113, 81, 69, 49, 81, + 65, 113, 81, 65, 120, 49, 113, 161, 240, 49, 145, 129, + 162, 97, 177, 240, 49, 240, 49, 129, 153, 0, 7, 96, + // + // Block 181 Offsets: Codepoints 0xba70 - 0xba70 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 181 Data: Codepoints 0xba70 - 0xba70 + // + 38, 16, 240, 195, 241, 241, 241, 41, 65, 49, 87, 49, + 82, 65, 49, 82, 65, 49, 82, 65, 49, 81, 81, 49, + 87, 56, 65, 49, 177, 241, 241, 241, 241, 241, 241, 0, + 6, 32, + 0, 0, // Padding + + // + // Block 182 Offsets: Codepoints 0xba74 - 0xba74 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 182 Data: Codepoints 0xba74 - 0xba74 + // + 46, 17, 240, 211, 240, 17, 240, 17, 57, 65, 65, 102, + 65, 97, 65, 65, 97, 65, 65, 97, 65, 65, 102, 65, + 97, 65, 72, 65, 65, 177, 240, 17, 98, 129, 129, 113, + 129, 240, 17, 240, 17, 240, 26, 0, 6, 80, + 0, 0, // Padding + + // + // Block 183 Offsets: Codepoints 0xbbf8 - 0xbbf8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 183 Data: Codepoints 0xbbf8 - 0xbbf8 + // + 40, 16, 240, 195, 241, 241, 241, 41, 65, 49, 97, 65, + 49, 97, 65, 49, 97, 65, 49, 97, 65, 49, 97, 65, + 49, 97, 65, 56, 65, 49, 177, 241, 241, 241, 241, 241, + 241, 0, 6, 32, + // + // Block 184 Offsets: Codepoints 0xbc84 - 0xbc84 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 184 Data: Codepoints 0xbc84 - 0xbc84 + // + 41, 16, 240, 240, 211, 241, 131, 65, 34, 97, 65, 49, + 97, 65, 49, 97, 65, 61, 49, 97, 65, 49, 97, 65, + 49, 97, 65, 56, 65, 49, 97, 65, 241, 241, 241, 241, + 241, 241, 0, 6, 32, + 0, 0, 0, // Padding + + // + // Block 185 Offsets: Codepoints 0xbcf4 - 0xbcf4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 185 Data: Codepoints 0xbcf4 - 0xbcf4 + // + 32, 20, 0, 8, 115, 146, 129, 161, 129, 161, 129, 170, + 161, 129, 161, 129, 161, 129, 170, 161, 49, 65, 225, 240, + 65, 240, 65, 191, 3, 0, 15, 32, + // + // Block 186 Offsets: Codepoints 0xbe0c - 0xbe0c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 186 Data: Codepoints 0xbe0c - 0xbe0c + // + 28, 20, 0, 8, 115, 146, 129, 161, 129, 161, 129, 170, + 161, 129, 161, 129, 161, 129, 170, 161, 129, 0, 8, 47, + 3, 0, 15, 32, + // + // Block 187 Offsets: Codepoints 0xc0ac - 0xc0ac + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 187 Data: Codepoints 0xc0ac - 0xc0ac + // + 49, 20, 0, 6, 51, 240, 65, 162, 113, 194, 81, 178, + 97, 178, 97, 177, 113, 162, 113, 161, 17, 101, 81, 49, + 81, 129, 81, 65, 113, 114, 33, 97, 129, 49, 240, 65, + 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, 0, 5, + 96, + 0, 0, 0, // Padding + + // + // Block 188 Offsets: Codepoints 0xc0c8 - 0xc0c8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 188 Data: Codepoints 0xc0c8 - 0xc0c8 + // + 58, 18, 0, 6, 19, 194, 49, 97, 97, 49, 114, 65, + 49, 114, 65, 49, 114, 65, 49, 113, 81, 49, 98, 81, + 49, 97, 17, 69, 81, 49, 49, 49, 65, 66, 33, 49, + 49, 98, 17, 49, 33, 161, 49, 209, 49, 209, 49, 209, + 49, 209, 49, 209, 49, 240, 33, 240, 240, 128, + 0, 0, // Padding + + // + // Block 189 Offsets: Codepoints 0xc124 - 0xc124 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 189 Data: Codepoints 0xc124 - 0xc124 + // + 42, 17, 240, 194, 240, 34, 130, 97, 129, 113, 114, 113, + 113, 54, 99, 113, 82, 33, 97, 65, 82, 65, 49, 113, + 65, 240, 154, 240, 17, 240, 17, 122, 129, 240, 17, 240, + 17, 240, 26, 0, 6, 80, + 0, 0, // Padding + + // + // Block 190 Offsets: Codepoints 0xc131 - 0xc131 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 190 Data: Codepoints 0xc131 - 0xc131 + // + 42, 17, 0, 5, 99, 113, 129, 130, 97, 129, 113, 114, + 113, 114, 38, 99, 113, 82, 34, 81, 65, 82, 65, 34, + 193, 194, 33, 180, 193, 65, 161, 97, 145, 97, 145, 97, + 161, 65, 196, 0, 6, 112, + 0, 0, // Padding + + // + // Block 191 Offsets: Codepoints 0xc18c - 0xc18c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 191 Data: Codepoints 0xc18c - 0xc18c + // + 35, 19, 0, 8, 2, 240, 49, 240, 34, 240, 19, 240, + 17, 34, 209, 82, 146, 115, 97, 177, 163, 240, 49, 240, + 49, 240, 49, 240, 49, 113, 47, 2, 0, 14, 64, + 0, // Padding + + // + // Block 192 Offsets: Codepoints 0xc218 - 0xc218 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 192 Data: Codepoints 0xc218 - 0xc218 + // + 40, 20, 240, 209, 240, 82, 240, 34, 240, 50, 240, 33, + 34, 210, 82, 161, 146, 98, 0, 7, 15, 3, 177, 240, + 65, 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, 240, + 65, 0, 8, 96, + // + // Block 193 Offsets: Codepoints 0xc2dc - 0xc2dc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 193 Data: Codepoints 0xc2dc - 0xc2dc + // + 46, 17, 0, 5, 99, 240, 17, 130, 97, 130, 97, 130, + 97, 129, 113, 114, 113, 114, 113, 97, 33, 97, 81, 66, + 65, 66, 82, 49, 49, 129, 49, 33, 209, 240, 17, 240, + 17, 240, 17, 240, 17, 240, 17, 0, 6, 80, + 0, 0, // Padding + + // + // Block 194 Offsets: Codepoints 0xc2ed - 0xc2ed + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 194 Data: Codepoints 0xc2ed - 0xc2ed + // + 42, 17, 240, 209, 240, 35, 115, 97, 129, 113, 129, 113, + 113, 129, 99, 113, 82, 33, 97, 66, 65, 81, 49, 113, + 65, 33, 209, 212, 114, 97, 145, 97, 152, 145, 97, 145, + 97, 152, 145, 0, 7, 80, + 0, 0, // Padding + + // + // Block 195 Offsets: Codepoints 0xc5b4 - 0xc5b4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 195 Data: Codepoints 0xc5b4 - 0xc5b4 + // + 39, 16, 240, 195, 241, 241, 97, 129, 68, 113, 50, 50, + 81, 33, 97, 81, 33, 113, 65, 33, 118, 33, 98, 65, + 49, 67, 65, 69, 97, 241, 241, 241, 241, 241, 241, 241, + 0, 6, 32, + 0, // Padding + + // + // Block 196 Offsets: Codepoints 0xc5b8 - 0xc5b8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 196 Data: Codepoints 0xc5b8 - 0xc5b8 + // + 41, 16, 240, 179, 241, 113, 113, 85, 81, 65, 51, 65, + 49, 82, 65, 49, 102, 49, 97, 65, 49, 82, 65, 65, + 65, 81, 84, 97, 241, 241, 98, 113, 129, 97, 129, 241, + 241, 249, 0, 6, 32, + 0, 0, 0, // Padding + + // + // Block 197 Offsets: Codepoints 0xc5c5 - 0xc5c5 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 197 Data: Codepoints 0xc5c5 - 0xc5c5 + // + 42, 15, 240, 240, 178, 82, 113, 68, 97, 49, 66, 65, + 33, 97, 65, 33, 102, 33, 97, 65, 49, 66, 65, 69, + 81, 225, 195, 98, 97, 113, 97, 120, 113, 97, 113, 97, + 120, 113, 97, 0, 5, 112, + 0, 0, // Padding + + // + // Block 198 Offsets: Codepoints 0xc5c8 - 0xc5c8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 198 Data: Codepoints 0xc5c8 - 0xc5c8 + // + 47, 18, 0, 6, 2, 129, 129, 101, 97, 81, 66, 81, + 65, 98, 65, 65, 118, 65, 98, 65, 81, 67, 65, 101, + 97, 240, 33, 240, 195, 66, 161, 81, 162, 81, 162, 66, + 145, 34, 18, 18, 97, 67, 50, 50, 193, 0, 7, + 0, // Padding + + // + // Block 199 Offsets: Codepoints 0xc5d0 - 0xc5d0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 199 Data: Codepoints 0xc5d0 - 0xc5d0 + // + 55, 17, 240, 209, 210, 35, 193, 49, 193, 49, 81, 97, + 49, 68, 65, 49, 49, 50, 49, 49, 33, 82, 33, 49, + 33, 85, 49, 33, 82, 33, 49, 49, 50, 49, 49, 68, + 65, 49, 193, 49, 193, 49, 193, 49, 193, 49, 193, 49, + 193, 49, 240, 17, 0, 6, 80, + 0, // Padding + + // + // Block 200 Offsets: Codepoints 0xc5ec - 0xc5ec + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 200 Data: Codepoints 0xc5ec - 0xc5ec + // + 40, 16, 240, 195, 241, 241, 97, 129, 69, 97, 50, 50, + 21, 33, 113, 65, 33, 113, 65, 33, 113, 65, 33, 113, + 65, 50, 65, 21, 69, 97, 241, 241, 241, 241, 241, 241, + 241, 0, 6, 32, + // + // Block 201 Offsets: Codepoints 0xc624 - 0xc624 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 201 Data: Codepoints 0xc624 - 0xc624 + // + 33, 19, 0, 8, 17, 240, 21, 210, 50, 178, 82, 161, + 113, 161, 113, 161, 113, 177, 81, 213, 240, 17, 240, 49, + 240, 49, 240, 49, 175, 2, 0, 14, 64, + 0, 0, 0, // Padding + + // + // Block 202 Offsets: Codepoints 0xc640 - 0xc640 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 202 Data: Codepoints 0xc640 - 0xc640 + // + 48, 20, 240, 241, 240, 83, 177, 113, 148, 97, 129, 65, + 81, 113, 97, 65, 113, 97, 65, 113, 97, 65, 129, 65, + 81, 148, 101, 113, 113, 177, 113, 177, 68, 106, 49, 240, + 65, 240, 65, 240, 65, 240, 65, 240, 65, 0, 8, 32, + // + // Block 203 Offsets: Codepoints 0xc6a9 - 0xc6a9 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 203 Data: Codepoints 0xc6a9 - 0xc6a9 + // + 40, 21, 240, 226, 240, 53, 241, 81, 209, 113, 193, 113, + 193, 113, 209, 81, 247, 194, 82, 209, 82, 65, 47, 3, + 178, 240, 53, 241, 81, 209, 113, 193, 113, 193, 113, 209, + 81, 245, 0, 9, + // + // Block 204 Offsets: Codepoints 0xc6d0 - 0xc6d0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 204 Data: Codepoints 0xc6d0 - 0xc6d0 + // + 46, 18, 240, 227, 145, 114, 116, 97, 97, 65, 81, 81, + 97, 65, 81, 97, 65, 81, 97, 65, 97, 65, 81, 116, + 97, 226, 17, 59, 49, 129, 129, 129, 54, 129, 129, 240, + 33, 114, 240, 33, 240, 33, 240, 43, 0, 7, + 0, 0, // Padding + + // + // Block 205 Offsets: Codepoints 0xc6e8 - 0xc6e8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 205 Data: Codepoints 0xc6e8 - 0xc6e8 + // + 64, 17, 240, 240, 244, 97, 66, 49, 68, 65, 49, 50, + 50, 33, 49, 49, 81, 33, 49, 49, 81, 33, 49, 50, + 50, 33, 49, 69, 49, 49, 193, 49, 40, 33, 49, 97, + 81, 49, 97, 81, 49, 97, 21, 49, 97, 81, 49, 97, + 81, 49, 97, 81, 49, 97, 81, 49, 97, 81, 49, 240, + 17, 240, 240, 96, + // + // Block 206 Offsets: Codepoints 0xc720 - 0xc720 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 206 Data: Codepoints 0xc720 - 0xc720 + // + 41, 19, 240, 240, 242, 240, 21, 209, 81, 177, 113, 161, + 113, 161, 113, 177, 81, 213, 0, 5, 111, 2, 113, 81, + 193, 81, 193, 81, 193, 81, 193, 81, 193, 81, 193, 81, + 240, 49, 240, 240, 240, + 0, 0, 0, // Padding + + // + // Block 207 Offsets: Codepoints 0xc73c - 0xc73c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 207 Data: Codepoints 0xc73c - 0xc73c + // + 27, 19, 0, 8, 17, 240, 21, 210, 50, 177, 113, 161, + 113, 161, 113, 161, 113, 177, 66, 213, 0, 10, 79, 2, + 0, 14, 64, + 0, // Padding + + // + // Block 208 Offsets: Codepoints 0xc740 - 0xc740 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 208 Data: Codepoints 0xc740 - 0xc740 + // + 36, 19, 0, 5, 97, 240, 21, 209, 81, 177, 113, 161, + 113, 161, 113, 177, 81, 213, 0, 5, 111, 2, 240, 240, + 210, 240, 49, 240, 49, 240, 49, 240, 59, 0, 7, 80, + // + // Block 209 Offsets: Codepoints 0xc744 - 0xc744 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 209 Data: Codepoints 0xc744 - 0xc744 + // + 35, 20, 240, 225, 240, 37, 225, 81, 193, 113, 177, 113, + 177, 113, 193, 81, 229, 240, 223, 3, 0, 5, 107, 240, + 65, 240, 65, 155, 161, 240, 65, 240, 75, 0, 8, + 0, // Padding + + // + // Block 210 Offsets: Codepoints 0xc74c - 0xc74c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 210 Data: Codepoints 0xc74c - 0xc74c + // + 36, 21, 240, 241, 240, 53, 241, 81, 209, 113, 193, 113, + 193, 113, 209, 81, 245, 0, 6, 1, 47, 3, 0, 6, + 27, 177, 113, 193, 113, 193, 113, 202, 177, 0, 9, 96, + // + // Block 211 Offsets: Codepoints 0xc751 - 0xc751 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 211 Data: Codepoints 0xc751 - 0xc751 + // + 38, 21, 240, 226, 240, 53, 241, 81, 209, 113, 193, 113, + 193, 113, 209, 81, 245, 0, 6, 1, 47, 3, 177, 240, + 69, 241, 81, 209, 113, 193, 113, 193, 113, 209, 81, 245, + 0, 9, + 0, 0, // Padding + + // + // Block 212 Offsets: Codepoints 0xc758 - 0xc758 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 212 Data: Codepoints 0xc758 - 0xc758 + // + 47, 17, 240, 210, 240, 34, 114, 113, 100, 97, 81, 65, + 81, 65, 97, 65, 65, 97, 65, 65, 97, 65, 81, 65, + 81, 100, 97, 240, 17, 240, 17, 197, 42, 65, 240, 17, + 240, 17, 240, 17, 240, 17, 240, 17, 0, 6, 80, + 0, // Padding + + // + // Block 213 Offsets: Codepoints 0xc774 - 0xc774 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 213 Data: Codepoints 0xc774 - 0xc774 + // + 40, 16, 240, 195, 241, 241, 97, 129, 69, 97, 50, 50, + 81, 33, 113, 65, 33, 113, 65, 33, 113, 65, 33, 113, + 65, 50, 65, 81, 69, 97, 241, 241, 241, 241, 241, 241, + 241, 0, 6, 32, + // + // Block 214 Offsets: Codepoints 0xc785 - 0xc785 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 214 Data: Codepoints 0xc785 - 0xc785 + // + 43, 15, 240, 240, 163, 82, 113, 68, 97, 49, 65, 81, + 33, 97, 65, 33, 97, 65, 33, 97, 65, 49, 65, 81, + 68, 97, 225, 195, 98, 97, 113, 97, 120, 113, 97, 113, + 97, 120, 113, 97, 0, 5, 112, + 0, // Padding + + // + // Block 215 Offsets: Codepoints 0xc788 - 0xc788 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 215 Data: Codepoints 0xc788 - 0xc788 + // + 50, 17, 240, 240, 227, 114, 113, 100, 97, 81, 65, 81, + 65, 97, 65, 65, 97, 65, 65, 97, 65, 81, 65, 81, + 100, 97, 240, 17, 240, 178, 66, 146, 65, 161, 66, 145, + 17, 50, 130, 18, 17, 33, 97, 67, 50, 49, 193, 0, + 6, 80, + 0, 0, // Padding + + // + // Block 216 Offsets: Codepoints 0xc804 - 0xc804 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 216 Data: Codepoints 0xc804 - 0xc804 + // + 44, 18, 240, 227, 240, 34, 240, 33, 72, 81, 162, 81, + 161, 97, 146, 97, 130, 38, 130, 113, 113, 34, 81, 97, + 66, 65, 66, 98, 49, 49, 209, 113, 145, 130, 113, 145, + 240, 33, 240, 33, 240, 42, 0, 7, + // + // Block 217 Offsets: Codepoints 0xc815 - 0xc815 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 217 Data: Codepoints 0xc815 - 0xc815 + // + 41, 16, 240, 240, 211, 241, 56, 65, 130, 81, 129, 97, + 114, 22, 99, 97, 82, 33, 81, 65, 82, 49, 34, 177, + 178, 33, 164, 177, 65, 145, 97, 129, 97, 129, 97, 145, + 65, 180, 0, 6, 64, + 0, 0, 0, // Padding + + // + // Block 218 Offsets: Codepoints 0xc81c - 0xc81c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 218 Data: Codepoints 0xc81c - 0xc81c + // + 56, 17, 240, 211, 179, 49, 193, 49, 193, 49, 39, 49, + 49, 114, 49, 49, 113, 65, 49, 113, 65, 49, 97, 36, + 49, 82, 81, 49, 81, 17, 65, 49, 65, 49, 49, 49, + 49, 82, 17, 49, 33, 145, 49, 193, 49, 193, 49, 193, + 49, 193, 49, 193, 49, 0, 6, 80, + // + // Block 219 Offsets: Codepoints 0xc904 - 0xc904 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 219 Data: Codepoints 0xc904 - 0xc904 + // + 35, 20, 0, 8, 10, 240, 34, 240, 33, 240, 35, 227, + 53, 99, 240, 240, 95, 3, 177, 240, 65, 234, 240, 65, + 240, 65, 170, 177, 240, 65, 240, 74, 0, 8, 16, + 0, // Padding + + // + // Block 220 Offsets: Codepoints 0xc90d - 0xc90d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 220 Data: Codepoints 0xc90d - 0xc90d + // + 38, 20, 0, 8, 10, 240, 34, 240, 33, 240, 35, 227, + 53, 99, 240, 240, 95, 3, 177, 240, 65, 18, 178, 49, + 49, 177, 113, 185, 177, 113, 177, 113, 185, 177, 113, 0, + 8, 32, + 0, 0, // Padding + + // + // Block 221 Offsets: Codepoints 0xc989 - 0xc989 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 221 Data: Codepoints 0xc989 - 0xc989 + // + 36, 19, 0, 7, 74, 240, 33, 240, 33, 240, 18, 242, + 36, 131, 129, 97, 240, 240, 95, 2, 240, 240, 219, 240, + 49, 240, 49, 240, 49, 240, 49, 240, 49, 0, 7, 96, + // + // Block 222 Offsets: Codepoints 0xc9c0 - 0xc9c0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 222 Data: Codepoints 0xc9c0 - 0xc9c0 + // + 40, 16, 240, 240, 211, 241, 241, 56, 65, 146, 65, 145, + 81, 130, 81, 129, 97, 113, 113, 99, 97, 82, 34, 65, + 65, 82, 49, 49, 114, 33, 33, 193, 241, 241, 241, 241, + 241, 240, 240, 64, + // + // Block 223 Offsets: Codepoints 0xccb4 - 0xccb4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 223 Data: Codepoints 0xccb4 - 0xccb4 + // + 59, 18, 240, 240, 241, 36, 194, 49, 84, 65, 49, 209, + 49, 55, 49, 49, 130, 49, 49, 129, 65, 49, 114, 65, + 49, 113, 36, 49, 98, 81, 49, 82, 17, 65, 49, 66, + 50, 33, 49, 49, 98, 17, 49, 33, 161, 49, 209, 49, + 209, 49, 209, 49, 209, 49, 240, 33, 240, 240, 128, + 0, // Padding + + // + // Block 224 Offsets: Codepoints 0xd2b8 - 0xd2b8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 224 Data: Codepoints 0xd2b8 - 0xd2b8 + // + 26, 19, 0, 9, 108, 129, 240, 49, 240, 49, 240, 58, + 145, 240, 49, 240, 49, 240, 59, 0, 7, 111, 2, 0, + 14, 64, + 0, 0, // Padding + + // + // Block 225 Offsets: Codepoints 0xd2bc - 0xd2bc + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 225 Data: Codepoints 0xd2bc - 0xd2bc + // + 32, 20, 0, 7, 124, 145, 240, 65, 240, 74, 161, 240, + 65, 240, 75, 240, 240, 255, 3, 240, 240, 243, 240, 65, + 240, 65, 240, 65, 240, 75, 0, 8, + // + // Block 226 Offsets: Codepoints 0xd2f0 - 0xd2f0 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 226 Data: Codepoints 0xd2f0 - 0xd2f0 + // + 36, 15, 240, 161, 242, 225, 225, 41, 49, 49, 161, 49, + 161, 49, 161, 55, 65, 49, 161, 49, 161, 49, 131, 49, + 68, 33, 53, 97, 225, 225, 225, 225, 225, 0, 5, 112, + // + // Block 227 Offsets: Codepoints 0xd2f8 - 0xd2f8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 227 Data: Codepoints 0xd2f8 - 0xd2f8 + // + 33, 16, 240, 240, 210, 241, 57, 49, 65, 161, 65, 161, + 72, 49, 65, 161, 65, 131, 73, 33, 67, 129, 240, 137, + 241, 241, 106, 129, 241, 249, 0, 6, 32, + 0, 0, 0, // Padding + + // + // Block 228 Offsets: Codepoints 0xd328 - 0xd328 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 228 Data: Codepoints 0xd328 - 0xd328 + // + 56, 16, 240, 195, 178, 33, 193, 33, 161, 17, 33, 40, + 33, 33, 193, 33, 50, 49, 49, 33, 65, 49, 49, 33, + 65, 49, 52, 65, 49, 49, 33, 65, 49, 49, 33, 65, + 49, 34, 33, 41, 17, 33, 193, 33, 193, 33, 193, 33, + 193, 33, 193, 33, 241, 0, 6, 32, + // + // Block 229 Offsets: Codepoints 0xd504 - 0xd504 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 229 Data: Codepoints 0xd504 - 0xd504 + // + 26, 19, 0, 9, 108, 145, 67, 193, 66, 193, 66, 193, + 66, 193, 65, 209, 65, 34, 109, 0, 10, 15, 2, 0, + 14, 64, + 0, 0, // Padding + + // + // Block 230 Offsets: Codepoints 0xd53d - 0xd53d + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 230 Data: Codepoints 0xd53d - 0xd53d + // + 41, 16, 240, 193, 240, 18, 193, 33, 58, 33, 241, 67, + 49, 65, 97, 49, 65, 97, 49, 65, 97, 49, 65, 97, + 49, 50, 44, 17, 49, 177, 240, 122, 241, 241, 241, 241, + 241, 241, 240, 240, 64, + 0, 0, 0, // Padding + + // + // Block 231 Offsets: Codepoints 0xd558 - 0xd558 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 231 Data: Codepoints 0xd558 - 0xd558 + // + 47, 19, 0, 6, 3, 240, 49, 134, 65, 240, 49, 106, + 33, 240, 49, 148, 81, 129, 65, 65, 113, 97, 53, 49, + 97, 49, 113, 97, 49, 129, 65, 65, 148, 81, 240, 49, + 240, 49, 240, 49, 240, 49, 240, 49, 0, 7, 112, + 0, // Padding + + // + // Block 232 Offsets: Codepoints 0xd55c - 0xd55c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 232 Data: Codepoints 0xd55c - 0xd55c + // + 47, 20, 240, 241, 240, 83, 149, 81, 240, 65, 107, 33, + 240, 65, 163, 97, 145, 49, 81, 129, 81, 69, 65, 81, + 65, 129, 81, 65, 145, 49, 81, 163, 97, 240, 65, 163, + 97, 193, 240, 65, 240, 65, 240, 73, 0, 8, 16, + 0, // Padding + + // + // Block 233 Offsets: Codepoints 0xd560 - 0xd560 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 233 Data: Codepoints 0xd560 - 0xd560 + // + 42, 20, 0, 6, 51, 149, 81, 107, 33, 240, 65, 163, + 97, 130, 50, 65, 129, 81, 69, 65, 81, 65, 130, 50, + 65, 163, 97, 240, 250, 240, 65, 240, 65, 170, 177, 240, + 65, 240, 74, 0, 8, 16, + 0, 0, // Padding + + // + // Block 234 Offsets: Codepoints 0xd568 - 0xd568 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 234 Data: Codepoints 0xd568 - 0xd568 + // + 43, 20, 0, 6, 51, 149, 81, 240, 65, 107, 33, 163, + 97, 145, 49, 81, 129, 81, 69, 65, 81, 65, 129, 81, + 65, 145, 49, 81, 163, 97, 240, 250, 177, 113, 177, 113, + 177, 113, 185, 177, 0, 9, 32, + 0, // Padding + + // + // Block 235 Offsets: Codepoints 0xd654 - 0xd654 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 235 Data: Codepoints 0xd654 - 0xd654 + // + 48, 20, 240, 240, 17, 240, 82, 150, 65, 240, 65, 107, + 33, 240, 65, 164, 81, 130, 65, 65, 129, 97, 49, 129, + 97, 53, 81, 65, 65, 164, 81, 177, 113, 177, 68, 106, + 49, 240, 65, 240, 65, 240, 65, 240, 65, 0, 8, 32, + // + // Block 236 Offsets: Codepoints 0xd658 - 0xd658 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 236 Data: Codepoints 0xd658 - 0xd658 + // + 44, 20, 0, 6, 51, 149, 81, 240, 65, 107, 33, 163, + 97, 130, 49, 81, 129, 81, 65, 129, 81, 65, 130, 50, + 69, 99, 97, 177, 113, 185, 101, 129, 145, 145, 162, 240, + 65, 240, 65, 240, 74, 0, 8, 16, + // + // Block 237 Offsets: Codepoints 0xd6a8 - 0xd6a8 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 237 Data: Codepoints 0xd6a8 - 0xd6a8 + // + 33, 19, 0, 7, 102, 240, 237, 165, 209, 66, 177, 98, + 161, 98, 161, 98, 177, 66, 213, 209, 66, 193, 81, 193, + 81, 193, 81, 65, 47, 2, 0, 12, 16, + 0, 0, 0, // Padding + + // + // Block 238 Offsets: Codepoints 0xd6c4 - 0xd6c4 + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 238 Data: Codepoints 0xd6c4 - 0xd6c4 + // + 38, 20, 0, 5, 102, 240, 254, 180, 241, 65, 209, 97, + 193, 97, 193, 97, 209, 65, 244, 240, 239, 3, 177, 240, + 65, 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, 0, + 6, 32, + 0, 0, // Padding + + // + // Block 239 Offsets: Codepoints 0xff0c - 0xff0c + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 239 Data: Codepoints 0xff0c - 0xff0c + // + 13, 5, 240, 240, 162, 51, 35, 65, 49, 49, 0, 6, + 16, + 0, 0, 0, // Padding + + // + // Block 240 Offsets: Codepoints 0xff1a - 0xff1a + // + 0x04, 0x00, 0x00, 0x00, // Offset 4 (0x4) + + // + // Block 240 Data: Codepoints 0xff1a - 0xff1a + // + 12, 5, 240, 243, 35, 240, 240, 35, 35, 240, 240, 112, +}; + +tFont *g_psFontWCustom20pt = (tFont *)g_pui8Custom20pt; diff --git a/third_party/fonts/lang_demo/fontcustomr14pt.c b/third_party/fonts/lang_demo/fontcustomr14pt.c new file mode 100644 index 0000000..338c063 --- /dev/null +++ b/third_party/fonts/lang_demo/fontcustomr14pt.c @@ -0,0 +1,1134 @@ +//***************************************************************************** +// +// fontcustomr14pt.c - Font definition for the 14ptpt Customr font. +// +// Copyright (c) 2011 Texas Instruments Incorporated. All rights reserved. +// TI Information - Selective Disclosure +// +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 323 in 305 blocks +// Style: customr +// Size: 14pt +// Bold: no +// Italic: no +// Memory usage: 10063 bytes +// Glyphs remapped. Custom codepage 0x8000. +// +//***************************************************************************** + +const uint8_t g_pui8Customr14pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 13, + + // + // The height of the font. + // + 16, + + // + // The baseline of the font. + // + 13, + + // + // The font codepage (CUSTOM). + // + 0, 128, + + // + // The number of blocks of characters (1). + // + 1, 0, + + // + // Block header 1: Codepoints 0x0001 - 0x143 + // + 0x01, 0x00, 0x00, 0x00, + 0x43, 0x01, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, + + // + // Block 1 Offsets: Codepoints 0x0001 - 0x143 + // + 0x0c, 0x05, 0x00, 0x00, // Offset 1292 (0x50c) + 0x10, 0x05, 0x00, 0x00, // Offset 1296 (0x510) + 0x1f, 0x05, 0x00, 0x00, // Offset 1311 (0x51f) + 0x32, 0x05, 0x00, 0x00, // Offset 1330 (0x532) + 0x3e, 0x05, 0x00, 0x00, // Offset 1342 (0x53e) + 0x52, 0x05, 0x00, 0x00, // Offset 1362 (0x552) + 0x60, 0x05, 0x00, 0x00, // Offset 1376 (0x560) + 0x6e, 0x05, 0x00, 0x00, // Offset 1390 (0x56e) + 0x80, 0x05, 0x00, 0x00, // Offset 1408 (0x580) + 0x8f, 0x05, 0x00, 0x00, // Offset 1423 (0x58f) + 0x9d, 0x05, 0x00, 0x00, // Offset 1437 (0x59d) + 0xb3, 0x05, 0x00, 0x00, // Offset 1459 (0x5b3) + 0xc7, 0x05, 0x00, 0x00, // Offset 1479 (0x5c7) + 0xd4, 0x05, 0x00, 0x00, // Offset 1492 (0x5d4) + 0xe9, 0x05, 0x00, 0x00, // Offset 1513 (0x5e9) + 0xff, 0x05, 0x00, 0x00, // Offset 1535 (0x5ff) + 0x14, 0x06, 0x00, 0x00, // Offset 1556 (0x614) + 0x2e, 0x06, 0x00, 0x00, // Offset 1582 (0x62e) + 0x3d, 0x06, 0x00, 0x00, // Offset 1597 (0x63d) + 0x45, 0x06, 0x00, 0x00, // Offset 1605 (0x645) + 0x54, 0x06, 0x00, 0x00, // Offset 1620 (0x654) + 0x69, 0x06, 0x00, 0x00, // Offset 1641 (0x669) + 0x81, 0x06, 0x00, 0x00, // Offset 1665 (0x681) + 0x98, 0x06, 0x00, 0x00, // Offset 1688 (0x698) + 0xa0, 0x06, 0x00, 0x00, // Offset 1696 (0x6a0) + 0xaf, 0x06, 0x00, 0x00, // Offset 1711 (0x6af) + 0xbc, 0x06, 0x00, 0x00, // Offset 1724 (0x6bc) + 0xc3, 0x06, 0x00, 0x00, // Offset 1731 (0x6c3) + 0xd2, 0x06, 0x00, 0x00, // Offset 1746 (0x6d2) + 0xee, 0x06, 0x00, 0x00, // Offset 1774 (0x6ee) + 0xfb, 0x06, 0x00, 0x00, // Offset 1787 (0x6fb) + 0x0b, 0x07, 0x00, 0x00, // Offset 1803 (0x70b) + 0x1a, 0x07, 0x00, 0x00, // Offset 1818 (0x71a) + 0x30, 0x07, 0x00, 0x00, // Offset 1840 (0x730) + 0x3f, 0x07, 0x00, 0x00, // Offset 1855 (0x73f) + 0x66, 0x07, 0x00, 0x00, // Offset 1894 (0x766) + 0x7e, 0x07, 0x00, 0x00, // Offset 1918 (0x77e) + 0x8d, 0x07, 0x00, 0x00, // Offset 1933 (0x78d) + 0x9f, 0x07, 0x00, 0x00, // Offset 1951 (0x79f) + 0xb7, 0x07, 0x00, 0x00, // Offset 1975 (0x7b7) + 0xcb, 0x07, 0x00, 0x00, // Offset 1995 (0x7cb) + 0xe7, 0x07, 0x00, 0x00, // Offset 2023 (0x7e7) + 0xf8, 0x07, 0x00, 0x00, // Offset 2040 (0x7f8) + 0x0c, 0x08, 0x00, 0x00, // Offset 2060 (0x80c) + 0x1d, 0x08, 0x00, 0x00, // Offset 2077 (0x81d) + 0x36, 0x08, 0x00, 0x00, // Offset 2102 (0x836) + 0x53, 0x08, 0x00, 0x00, // Offset 2131 (0x853) + 0x63, 0x08, 0x00, 0x00, // Offset 2147 (0x863) + 0x76, 0x08, 0x00, 0x00, // Offset 2166 (0x876) + 0x8a, 0x08, 0x00, 0x00, // Offset 2186 (0x88a) + 0x99, 0x08, 0x00, 0x00, // Offset 2201 (0x899) + 0xad, 0x08, 0x00, 0x00, // Offset 2221 (0x8ad) + 0xbc, 0x08, 0x00, 0x00, // Offset 2236 (0x8bc) + 0xd9, 0x08, 0x00, 0x00, // Offset 2265 (0x8d9) + 0xf0, 0x08, 0x00, 0x00, // Offset 2288 (0x8f0) + 0xf6, 0x08, 0x00, 0x00, // Offset 2294 (0x8f6) + 0x0b, 0x09, 0x00, 0x00, // Offset 2315 (0x90b) + 0x1f, 0x09, 0x00, 0x00, // Offset 2335 (0x91f) + 0x27, 0x09, 0x00, 0x00, // Offset 2343 (0x927) + 0x34, 0x09, 0x00, 0x00, // Offset 2356 (0x934) + 0x56, 0x09, 0x00, 0x00, // Offset 2390 (0x956) + 0x73, 0x09, 0x00, 0x00, // Offset 2419 (0x973) + 0x94, 0x09, 0x00, 0x00, // Offset 2452 (0x994) + 0xaf, 0x09, 0x00, 0x00, // Offset 2479 (0x9af) + 0xcf, 0x09, 0x00, 0x00, // Offset 2511 (0x9cf) + 0xfb, 0x09, 0x00, 0x00, // Offset 2555 (0x9fb) + 0x0d, 0x0a, 0x00, 0x00, // Offset 2573 (0xa0d) + 0x2a, 0x0a, 0x00, 0x00, // Offset 2602 (0xa2a) + 0x4f, 0x0a, 0x00, 0x00, // Offset 2639 (0xa4f) + 0x65, 0x0a, 0x00, 0x00, // Offset 2661 (0xa65) + 0x91, 0x0a, 0x00, 0x00, // Offset 2705 (0xa91) + 0xac, 0x0a, 0x00, 0x00, // Offset 2732 (0xaac) + 0xc3, 0x0a, 0x00, 0x00, // Offset 2755 (0xac3) + 0xd7, 0x0a, 0x00, 0x00, // Offset 2775 (0xad7) + 0xf0, 0x0a, 0x00, 0x00, // Offset 2800 (0xaf0) + 0x13, 0x0b, 0x00, 0x00, // Offset 2835 (0xb13) + 0x2c, 0x0b, 0x00, 0x00, // Offset 2860 (0xb2c) + 0x42, 0x0b, 0x00, 0x00, // Offset 2882 (0xb42) + 0x53, 0x0b, 0x00, 0x00, // Offset 2899 (0xb53) + 0x5b, 0x0b, 0x00, 0x00, // Offset 2907 (0xb5b) + 0x71, 0x0b, 0x00, 0x00, // Offset 2929 (0xb71) + 0x85, 0x0b, 0x00, 0x00, // Offset 2949 (0xb85) + 0x9b, 0x0b, 0x00, 0x00, // Offset 2971 (0xb9b) + 0xa4, 0x0b, 0x00, 0x00, // Offset 2980 (0xba4) + 0xcb, 0x0b, 0x00, 0x00, // Offset 3019 (0xbcb) + 0xe5, 0x0b, 0x00, 0x00, // Offset 3045 (0xbe5) + 0xec, 0x0b, 0x00, 0x00, // Offset 3052 (0xbec) + 0x11, 0x0c, 0x00, 0x00, // Offset 3089 (0xc11) + 0x25, 0x0c, 0x00, 0x00, // Offset 3109 (0xc25) + 0x35, 0x0c, 0x00, 0x00, // Offset 3125 (0xc35) + 0x49, 0x0c, 0x00, 0x00, // Offset 3145 (0xc49) + 0x5b, 0x0c, 0x00, 0x00, // Offset 3163 (0xc5b) + 0x75, 0x0c, 0x00, 0x00, // Offset 3189 (0xc75) + 0x85, 0x0c, 0x00, 0x00, // Offset 3205 (0xc85) + 0x9a, 0x0c, 0x00, 0x00, // Offset 3226 (0xc9a) + 0xac, 0x0c, 0x00, 0x00, // Offset 3244 (0xcac) + 0xc4, 0x0c, 0x00, 0x00, // Offset 3268 (0xcc4) + 0xd7, 0x0c, 0x00, 0x00, // Offset 3287 (0xcd7) + 0xee, 0x0c, 0x00, 0x00, // Offset 3310 (0xcee) + 0x1c, 0x0d, 0x00, 0x00, // Offset 3356 (0xd1c) + 0x3e, 0x0d, 0x00, 0x00, // Offset 3390 (0xd3e) + 0x5f, 0x0d, 0x00, 0x00, // Offset 3423 (0xd5f) + 0x85, 0x0d, 0x00, 0x00, // Offset 3461 (0xd85) + 0x97, 0x0d, 0x00, 0x00, // Offset 3479 (0xd97) + 0xae, 0x0d, 0x00, 0x00, // Offset 3502 (0xdae) + 0xcb, 0x0d, 0x00, 0x00, // Offset 3531 (0xdcb) + 0xe1, 0x0d, 0x00, 0x00, // Offset 3553 (0xde1) + 0xfc, 0x0d, 0x00, 0x00, // Offset 3580 (0xdfc) + 0x0c, 0x0e, 0x00, 0x00, // Offset 3596 (0xe0c) + 0x23, 0x0e, 0x00, 0x00, // Offset 3619 (0xe23) + 0x36, 0x0e, 0x00, 0x00, // Offset 3638 (0xe36) + 0x4b, 0x0e, 0x00, 0x00, // Offset 3659 (0xe4b) + 0x62, 0x0e, 0x00, 0x00, // Offset 3682 (0xe62) + 0x83, 0x0e, 0x00, 0x00, // Offset 3715 (0xe83) + 0x9b, 0x0e, 0x00, 0x00, // Offset 3739 (0xe9b) + 0xb0, 0x0e, 0x00, 0x00, // Offset 3760 (0xeb0) + 0xc5, 0x0e, 0x00, 0x00, // Offset 3781 (0xec5) + 0xdd, 0x0e, 0x00, 0x00, // Offset 3805 (0xedd) + 0xfe, 0x0e, 0x00, 0x00, // Offset 3838 (0xefe) + 0x13, 0x0f, 0x00, 0x00, // Offset 3859 (0xf13) + 0x26, 0x0f, 0x00, 0x00, // Offset 3878 (0xf26) + 0x39, 0x0f, 0x00, 0x00, // Offset 3897 (0xf39) + 0x51, 0x0f, 0x00, 0x00, // Offset 3921 (0xf51) + 0x64, 0x0f, 0x00, 0x00, // Offset 3940 (0xf64) + 0x77, 0x0f, 0x00, 0x00, // Offset 3959 (0xf77) + 0x8f, 0x0f, 0x00, 0x00, // Offset 3983 (0xf8f) + 0xab, 0x0f, 0x00, 0x00, // Offset 4011 (0xfab) + 0xcc, 0x0f, 0x00, 0x00, // Offset 4044 (0xfcc) + 0xec, 0x0f, 0x00, 0x00, // Offset 4076 (0xfec) + 0x02, 0x10, 0x00, 0x00, // Offset 4098 (0x1002) + 0x29, 0x10, 0x00, 0x00, // Offset 4137 (0x1029) + 0x54, 0x10, 0x00, 0x00, // Offset 4180 (0x1054) + 0x72, 0x10, 0x00, 0x00, // Offset 4210 (0x1072) + 0x90, 0x10, 0x00, 0x00, // Offset 4240 (0x1090) + 0xb2, 0x10, 0x00, 0x00, // Offset 4274 (0x10b2) + 0xdd, 0x10, 0x00, 0x00, // Offset 4317 (0x10dd) + 0x05, 0x11, 0x00, 0x00, // Offset 4357 (0x1105) + 0x30, 0x11, 0x00, 0x00, // Offset 4400 (0x1130) + 0x57, 0x11, 0x00, 0x00, // Offset 4439 (0x1157) + 0x74, 0x11, 0x00, 0x00, // Offset 4468 (0x1174) + 0x9e, 0x11, 0x00, 0x00, // Offset 4510 (0x119e) + 0xc2, 0x11, 0x00, 0x00, // Offset 4546 (0x11c2) + 0xdb, 0x11, 0x00, 0x00, // Offset 4571 (0x11db) + 0x01, 0x12, 0x00, 0x00, // Offset 4609 (0x1201) + 0x2f, 0x12, 0x00, 0x00, // Offset 4655 (0x122f) + 0x5e, 0x12, 0x00, 0x00, // Offset 4702 (0x125e) + 0x86, 0x12, 0x00, 0x00, // Offset 4742 (0x1286) + 0xa2, 0x12, 0x00, 0x00, // Offset 4770 (0x12a2) + 0xb4, 0x12, 0x00, 0x00, // Offset 4788 (0x12b4) + 0xc4, 0x12, 0x00, 0x00, // Offset 4804 (0x12c4) + 0xdb, 0x12, 0x00, 0x00, // Offset 4827 (0x12db) + 0xf5, 0x12, 0x00, 0x00, // Offset 4853 (0x12f5) + 0x1b, 0x13, 0x00, 0x00, // Offset 4891 (0x131b) + 0x37, 0x13, 0x00, 0x00, // Offset 4919 (0x1337) + 0x52, 0x13, 0x00, 0x00, // Offset 4946 (0x1352) + 0x6e, 0x13, 0x00, 0x00, // Offset 4974 (0x136e) + 0x8b, 0x13, 0x00, 0x00, // Offset 5003 (0x138b) + 0x9f, 0x13, 0x00, 0x00, // Offset 5023 (0x139f) + 0xb4, 0x13, 0x00, 0x00, // Offset 5044 (0x13b4) + 0xd1, 0x13, 0x00, 0x00, // Offset 5073 (0x13d1) + 0xef, 0x13, 0x00, 0x00, // Offset 5103 (0x13ef) + 0x0b, 0x14, 0x00, 0x00, // Offset 5131 (0x140b) + 0x29, 0x14, 0x00, 0x00, // Offset 5161 (0x1429) + 0x3e, 0x14, 0x00, 0x00, // Offset 5182 (0x143e) + 0x61, 0x14, 0x00, 0x00, // Offset 5217 (0x1461) + 0x7f, 0x14, 0x00, 0x00, // Offset 5247 (0x147f) + 0x91, 0x14, 0x00, 0x00, // Offset 5265 (0x1491) + 0xb8, 0x14, 0x00, 0x00, // Offset 5304 (0x14b8) + 0xcb, 0x14, 0x00, 0x00, // Offset 5323 (0x14cb) + 0xe8, 0x14, 0x00, 0x00, // Offset 5352 (0x14e8) + 0xff, 0x14, 0x00, 0x00, // Offset 5375 (0x14ff) + 0x18, 0x15, 0x00, 0x00, // Offset 5400 (0x1518) + 0x2b, 0x15, 0x00, 0x00, // Offset 5419 (0x152b) + 0x3b, 0x15, 0x00, 0x00, // Offset 5435 (0x153b) + 0x4b, 0x15, 0x00, 0x00, // Offset 5451 (0x154b) + 0x5f, 0x15, 0x00, 0x00, // Offset 5471 (0x155f) + 0x7a, 0x15, 0x00, 0x00, // Offset 5498 (0x157a) + 0x90, 0x15, 0x00, 0x00, // Offset 5520 (0x1590) + 0xa1, 0x15, 0x00, 0x00, // Offset 5537 (0x15a1) + 0xad, 0x15, 0x00, 0x00, // Offset 5549 (0x15ad) + 0xb8, 0x15, 0x00, 0x00, // Offset 5560 (0x15b8) + 0xc9, 0x15, 0x00, 0x00, // Offset 5577 (0x15c9) + 0xdf, 0x15, 0x00, 0x00, // Offset 5599 (0x15df) + 0xf7, 0x15, 0x00, 0x00, // Offset 5623 (0x15f7) + 0x13, 0x16, 0x00, 0x00, // Offset 5651 (0x1613) + 0x2f, 0x16, 0x00, 0x00, // Offset 5679 (0x162f) + 0x55, 0x16, 0x00, 0x00, // Offset 5717 (0x1655) + 0x6a, 0x16, 0x00, 0x00, // Offset 5738 (0x166a) + 0x84, 0x16, 0x00, 0x00, // Offset 5764 (0x1684) + 0x9b, 0x16, 0x00, 0x00, // Offset 5787 (0x169b) + 0xa9, 0x16, 0x00, 0x00, // Offset 5801 (0x16a9) + 0xc2, 0x16, 0x00, 0x00, // Offset 5826 (0x16c2) + 0xe1, 0x16, 0x00, 0x00, // Offset 5857 (0x16e1) + 0xf7, 0x16, 0x00, 0x00, // Offset 5879 (0x16f7) + 0x12, 0x17, 0x00, 0x00, // Offset 5906 (0x1712) + 0x2b, 0x17, 0x00, 0x00, // Offset 5931 (0x172b) + 0x42, 0x17, 0x00, 0x00, // Offset 5954 (0x1742) + 0x59, 0x17, 0x00, 0x00, // Offset 5977 (0x1759) + 0x72, 0x17, 0x00, 0x00, // Offset 6002 (0x1772) + 0x8a, 0x17, 0x00, 0x00, // Offset 6026 (0x178a) + 0xab, 0x17, 0x00, 0x00, // Offset 6059 (0x17ab) + 0xc0, 0x17, 0x00, 0x00, // Offset 6080 (0x17c0) + 0xcf, 0x17, 0x00, 0x00, // Offset 6095 (0x17cf) + 0xe0, 0x17, 0x00, 0x00, // Offset 6112 (0x17e0) + 0xf1, 0x17, 0x00, 0x00, // Offset 6129 (0x17f1) + 0x07, 0x18, 0x00, 0x00, // Offset 6151 (0x1807) + 0x1d, 0x18, 0x00, 0x00, // Offset 6173 (0x181d) + 0x3d, 0x18, 0x00, 0x00, // Offset 6205 (0x183d) + 0x63, 0x18, 0x00, 0x00, // Offset 6243 (0x1863) + 0x89, 0x18, 0x00, 0x00, // Offset 6281 (0x1889) + 0xac, 0x18, 0x00, 0x00, // Offset 6316 (0x18ac) + 0xc7, 0x18, 0x00, 0x00, // Offset 6343 (0x18c7) + 0xe6, 0x18, 0x00, 0x00, // Offset 6374 (0x18e6) + 0x15, 0x19, 0x00, 0x00, // Offset 6421 (0x1915) + 0x36, 0x19, 0x00, 0x00, // Offset 6454 (0x1936) + 0x54, 0x19, 0x00, 0x00, // Offset 6484 (0x1954) + 0x7b, 0x19, 0x00, 0x00, // Offset 6523 (0x197b) + 0xab, 0x19, 0x00, 0x00, // Offset 6571 (0x19ab) + 0xd4, 0x19, 0x00, 0x00, // Offset 6612 (0x19d4) + 0x06, 0x1a, 0x00, 0x00, // Offset 6662 (0x1a06) + 0x31, 0x1a, 0x00, 0x00, // Offset 6705 (0x1a31) + 0x51, 0x1a, 0x00, 0x00, // Offset 6737 (0x1a51) + 0x79, 0x1a, 0x00, 0x00, // Offset 6777 (0x1a79) + 0xac, 0x1a, 0x00, 0x00, // Offset 6828 (0x1aac) + 0xd7, 0x1a, 0x00, 0x00, // Offset 6871 (0x1ad7) + 0xf5, 0x1a, 0x00, 0x00, // Offset 6901 (0x1af5) + 0x20, 0x1b, 0x00, 0x00, // Offset 6944 (0x1b20) + 0x40, 0x1b, 0x00, 0x00, // Offset 6976 (0x1b40) + 0x6c, 0x1b, 0x00, 0x00, // Offset 7020 (0x1b6c) + 0x90, 0x1b, 0x00, 0x00, // Offset 7056 (0x1b90) + 0xaf, 0x1b, 0x00, 0x00, // Offset 7087 (0x1baf) + 0xd0, 0x1b, 0x00, 0x00, // Offset 7120 (0x1bd0) + 0xf4, 0x1b, 0x00, 0x00, // Offset 7156 (0x1bf4) + 0x20, 0x1c, 0x00, 0x00, // Offset 7200 (0x1c20) + 0x4a, 0x1c, 0x00, 0x00, // Offset 7242 (0x1c4a) + 0x71, 0x1c, 0x00, 0x00, // Offset 7281 (0x1c71) + 0x9a, 0x1c, 0x00, 0x00, // Offset 7322 (0x1c9a) + 0xbf, 0x1c, 0x00, 0x00, // Offset 7359 (0x1cbf) + 0xf0, 0x1c, 0x00, 0x00, // Offset 7408 (0x1cf0) + 0x1a, 0x1d, 0x00, 0x00, // Offset 7450 (0x1d1a) + 0x46, 0x1d, 0x00, 0x00, // Offset 7494 (0x1d46) + 0x6a, 0x1d, 0x00, 0x00, // Offset 7530 (0x1d6a) + 0x93, 0x1d, 0x00, 0x00, // Offset 7571 (0x1d93) + 0xbe, 0x1d, 0x00, 0x00, // Offset 7614 (0x1dbe) + 0xd7, 0x1d, 0x00, 0x00, // Offset 7639 (0x1dd7) + 0x04, 0x1e, 0x00, 0x00, // Offset 7684 (0x1e04) + 0x1f, 0x1e, 0x00, 0x00, // Offset 7711 (0x1e1f) + 0x42, 0x1e, 0x00, 0x00, // Offset 7746 (0x1e42) + 0x60, 0x1e, 0x00, 0x00, // Offset 7776 (0x1e60) + 0x8c, 0x1e, 0x00, 0x00, // Offset 7820 (0x1e8c) + 0xc6, 0x1e, 0x00, 0x00, // Offset 7878 (0x1ec6) + 0xed, 0x1e, 0x00, 0x00, // Offset 7917 (0x1eed) + 0x18, 0x1f, 0x00, 0x00, // Offset 7960 (0x1f18) + 0x3d, 0x1f, 0x00, 0x00, // Offset 7997 (0x1f3d) + 0x6c, 0x1f, 0x00, 0x00, // Offset 8044 (0x1f6c) + 0x94, 0x1f, 0x00, 0x00, // Offset 8084 (0x1f94) + 0xc0, 0x1f, 0x00, 0x00, // Offset 8128 (0x1fc0) + 0xe0, 0x1f, 0x00, 0x00, // Offset 8160 (0x1fe0) + 0x09, 0x20, 0x00, 0x00, // Offset 8201 (0x2009) + 0x28, 0x20, 0x00, 0x00, // Offset 8232 (0x2028) + 0x4d, 0x20, 0x00, 0x00, // Offset 8269 (0x204d) + 0x74, 0x20, 0x00, 0x00, // Offset 8308 (0x2074) + 0x9e, 0x20, 0x00, 0x00, // Offset 8350 (0x209e) + 0xc9, 0x20, 0x00, 0x00, // Offset 8393 (0x20c9) + 0xf4, 0x20, 0x00, 0x00, // Offset 8436 (0x20f4) + 0x0e, 0x21, 0x00, 0x00, // Offset 8462 (0x210e) + 0x26, 0x21, 0x00, 0x00, // Offset 8486 (0x2126) + 0x4b, 0x21, 0x00, 0x00, // Offset 8523 (0x214b) + 0x69, 0x21, 0x00, 0x00, // Offset 8553 (0x2169) + 0x8d, 0x21, 0x00, 0x00, // Offset 8589 (0x218d) + 0xa4, 0x21, 0x00, 0x00, // Offset 8612 (0x21a4) + 0xbe, 0x21, 0x00, 0x00, // Offset 8638 (0x21be) + 0xec, 0x21, 0x00, 0x00, // Offset 8684 (0x21ec) + 0xfe, 0x21, 0x00, 0x00, // Offset 8702 (0x21fe) + 0x11, 0x22, 0x00, 0x00, // Offset 8721 (0x2211) + 0x27, 0x22, 0x00, 0x00, // Offset 8743 (0x2227) + 0x41, 0x22, 0x00, 0x00, // Offset 8769 (0x2241) + 0x65, 0x22, 0x00, 0x00, // Offset 8805 (0x2265) + 0x7a, 0x22, 0x00, 0x00, // Offset 8826 (0x227a) + 0x94, 0x22, 0x00, 0x00, // Offset 8852 (0x2294) + 0xb0, 0x22, 0x00, 0x00, // Offset 8880 (0x22b0) + 0xd5, 0x22, 0x00, 0x00, // Offset 8917 (0x22d5) + 0xf8, 0x22, 0x00, 0x00, // Offset 8952 (0x22f8) + 0x09, 0x23, 0x00, 0x00, // Offset 8969 (0x2309) + 0x1d, 0x23, 0x00, 0x00, // Offset 8989 (0x231d) + 0x2d, 0x23, 0x00, 0x00, // Offset 9005 (0x232d) + 0x4c, 0x23, 0x00, 0x00, // Offset 9036 (0x234c) + 0x67, 0x23, 0x00, 0x00, // Offset 9063 (0x2367) + 0x83, 0x23, 0x00, 0x00, // Offset 9091 (0x2383) + 0xa0, 0x23, 0x00, 0x00, // Offset 9120 (0x23a0) + 0xb6, 0x23, 0x00, 0x00, // Offset 9142 (0x23b6) + 0xd4, 0x23, 0x00, 0x00, // Offset 9172 (0x23d4) + 0xfc, 0x23, 0x00, 0x00, // Offset 9212 (0x23fc) + 0x15, 0x24, 0x00, 0x00, // Offset 9237 (0x2415) + 0x33, 0x24, 0x00, 0x00, // Offset 9267 (0x2433) + 0x55, 0x24, 0x00, 0x00, // Offset 9301 (0x2455) + 0x7f, 0x24, 0x00, 0x00, // Offset 9343 (0x247f) + 0x96, 0x24, 0x00, 0x00, // Offset 9366 (0x2496) + 0xb0, 0x24, 0x00, 0x00, // Offset 9392 (0x24b0) + 0xce, 0x24, 0x00, 0x00, // Offset 9422 (0x24ce) + 0xfb, 0x24, 0x00, 0x00, // Offset 9467 (0x24fb) + 0x15, 0x25, 0x00, 0x00, // Offset 9493 (0x2515) + 0x2a, 0x25, 0x00, 0x00, // Offset 9514 (0x252a) + 0x42, 0x25, 0x00, 0x00, // Offset 9538 (0x2542) + 0x5b, 0x25, 0x00, 0x00, // Offset 9563 (0x255b) + 0x79, 0x25, 0x00, 0x00, // Offset 9593 (0x2579) + 0x97, 0x25, 0x00, 0x00, // Offset 9623 (0x2597) + 0xb2, 0x25, 0x00, 0x00, // Offset 9650 (0x25b2) + 0xda, 0x25, 0x00, 0x00, // Offset 9690 (0x25da) + 0xed, 0x25, 0x00, 0x00, // Offset 9709 (0x25ed) + 0x04, 0x26, 0x00, 0x00, // Offset 9732 (0x2604) + 0x16, 0x26, 0x00, 0x00, // Offset 9750 (0x2616) + 0x3d, 0x26, 0x00, 0x00, // Offset 9789 (0x263d) + 0x57, 0x26, 0x00, 0x00, // Offset 9815 (0x2657) + 0x6d, 0x26, 0x00, 0x00, // Offset 9837 (0x266d) + 0x86, 0x26, 0x00, 0x00, // Offset 9862 (0x2686) + 0xa3, 0x26, 0x00, 0x00, // Offset 9891 (0x26a3) + 0xc2, 0x26, 0x00, 0x00, // Offset 9922 (0x26c2) + 0xe2, 0x26, 0x00, 0x00, // Offset 9954 (0x26e2) + 0xff, 0x26, 0x00, 0x00, // Offset 9983 (0x26ff) + 0x15, 0x27, 0x00, 0x00, // Offset 10005 (0x2715) + 0x2a, 0x27, 0x00, 0x00, // Offset 10026 (0x272a) + 0x33, 0x27, 0x00, 0x00, // Offset 10035 (0x2733) + + // + // Block 1 Data: Codepoints 1 - 0x143 + // + 4, 6, 0, 12, 15, 7, 240, 240, 212, 34, 33, 33, + 65, 22, 17, 98, 101, 240, 112, 19, 7, 240, 240, 228, + 33, 49, 17, 65, 17, 65, 17, 65, 17, 50, 35, 17, + 240, 112, 12, 3, 146, 18, 65, 33, 33, 33, 33, 33, + 33, 176, 20, 7, 240, 240, 193, 19, 34, 49, 17, 65, + 17, 65, 17, 65, 17, 65, 17, 65, 240, 112, 14, 5, + 240, 97, 65, 52, 33, 65, 65, 65, 65, 67, 240, 16, + 14, 2, 65, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 112, 18, 7, 240, 240, 212, 34, 34, 17, 65, 17, + 65, 17, 65, 18, 34, 36, 240, 128, 15, 6, 240, 240, + 97, 34, 17, 17, 50, 66, 65, 81, 81, 240, 128, 14, + 6, 240, 240, 116, 17, 82, 83, 82, 17, 49, 20, 240, + 80, 22, 7, 240, 65, 97, 97, 97, 52, 33, 49, 17, + 65, 17, 65, 17, 65, 18, 34, 35, 17, 240, 112, 20, + 7, 240, 240, 193, 65, 17, 65, 17, 65, 17, 65, 17, + 65, 17, 50, 35, 17, 240, 112, 13, 6, 240, 240, 131, + 33, 65, 81, 81, 82, 84, 240, 64, 21, 7, 240, 240, + 228, 33, 49, 17, 65, 17, 65, 17, 65, 17, 50, 35, + 17, 97, 82, 36, 32, 22, 7, 225, 97, 97, 97, 97, + 19, 34, 49, 17, 65, 17, 65, 17, 65, 17, 65, 17, + 65, 240, 112, 21, 7, 240, 240, 193, 19, 34, 34, 17, + 65, 17, 65, 17, 65, 17, 49, 37, 33, 97, 97, 96, + 26, 10, 0, 7, 72, 34, 34, 33, 17, 49, 49, 17, + 49, 49, 17, 49, 49, 17, 49, 49, 17, 49, 49, 240, + 240, 16, 15, 6, 227, 33, 81, 81, 68, 49, 81, 81, + 81, 81, 81, 240, 112, 8, 6, 0, 6, 5, 240, 240, + 208, 15, 7, 240, 114, 67, 97, 97, 97, 97, 97, 97, + 97, 70, 240, 112, 21, 7, 225, 97, 97, 97, 97, 19, + 34, 34, 17, 65, 17, 65, 17, 65, 17, 49, 37, 240, + 128, 24, 10, 240, 240, 66, 115, 113, 17, 113, 33, 82, + 33, 81, 49, 86, 49, 81, 49, 81, 34, 97, 240, 240, + 16, 23, 8, 240, 179, 65, 49, 33, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 33, 49, 67, 240, 192, + 8, 3, 240, 98, 18, 114, 18, 160, 15, 7, 240, 101, + 33, 97, 97, 101, 33, 97, 97, 97, 102, 240, 112, 13, + 7, 240, 240, 198, 81, 82, 66, 66, 81, 86, 240, 112, + 7, 3, 240, 240, 50, 18, 160, 15, 8, 240, 151, 65, + 113, 113, 113, 113, 113, 113, 113, 113, 240, 208, 28, 11, + 0, 8, 34, 49, 49, 33, 34, 49, 33, 33, 17, 18, + 33, 33, 17, 17, 66, 33, 17, 66, 50, 66, 49, 240, + 240, 96, 13, 7, 240, 240, 129, 97, 54, 65, 97, 97, + 240, 240, 128, 16, 8, 240, 164, 49, 50, 113, 113, 98, + 97, 97, 98, 82, 87, 240, 160, 15, 7, 240, 102, 17, + 97, 97, 100, 114, 97, 97, 82, 20, 240, 144, 22, 8, + 240, 179, 65, 49, 49, 49, 49, 49, 67, 65, 49, 33, + 81, 17, 81, 18, 50, 51, 240, 192, 15, 6, 240, 53, + 49, 81, 81, 81, 81, 81, 81, 81, 53, 240, 64, 39, + 10, 240, 242, 82, 18, 82, 18, 82, 17, 17, 49, 17, + 17, 17, 49, 17, 17, 17, 49, 17, 17, 33, 17, 33, + 17, 33, 17, 33, 17, 33, 17, 33, 17, 49, 49, 240, + 240, 16, 24, 9, 240, 198, 49, 66, 33, 82, 17, 97, + 17, 97, 17, 97, 17, 97, 17, 81, 33, 66, 37, 240, + 240, 16, 15, 7, 240, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 102, 240, 112, 18, 8, 0, 6, 2, 65, 33, + 50, 34, 33, 65, 18, 65, 17, 83, 98, 240, 192, 24, + 8, 240, 145, 81, 17, 81, 17, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 17, 81, 18, 50, 37, 240, 176, 20, + 8, 0, 6, 2, 65, 33, 49, 50, 33, 65, 18, 65, + 17, 98, 98, 97, 98, 67, 80, 28, 11, 240, 51, 161, + 50, 81, 36, 65, 18, 49, 49, 17, 69, 17, 65, 49, + 18, 49, 49, 36, 65, 161, 161, 161, 161, 161, 192, 17, + 8, 240, 181, 34, 49, 33, 97, 113, 113, 113, 114, 114, + 49, 53, 240, 160, 20, 6, 193, 81, 81, 81, 81, 34, + 17, 18, 35, 50, 65, 17, 49, 33, 33, 49, 240, 64, + 17, 7, 240, 117, 17, 65, 17, 98, 99, 99, 97, 97, + 17, 50, 21, 240, 128, 25, 12, 241, 193, 129, 33, 18, + 100, 145, 177, 65, 84, 35, 34, 50, 65, 66, 145, 17, + 129, 33, 113, 177, 198, 240, 29, 11, 240, 51, 161, 50, + 81, 36, 65, 18, 34, 49, 17, 65, 49, 17, 65, 49, + 18, 34, 49, 36, 65, 161, 161, 161, 161, 161, 192, 16, + 7, 240, 116, 113, 97, 82, 50, 114, 97, 97, 17, 50, + 35, 240, 144, 19, 8, 240, 225, 98, 81, 17, 65, 33, + 50, 33, 34, 49, 39, 97, 113, 113, 240, 176, 20, 8, + 240, 181, 33, 113, 97, 113, 20, 34, 50, 17, 81, 17, + 81, 33, 50, 51, 240, 192, 15, 8, 240, 151, 98, 82, + 97, 98, 97, 98, 97, 113, 98, 240, 224, 20, 8, 240, + 179, 50, 49, 33, 81, 17, 81, 18, 50, 36, 17, 113, + 97, 113, 37, 240, 192, 15, 7, 240, 102, 17, 97, 97, + 101, 33, 97, 97, 97, 97, 240, 192, 29, 9, 240, 193, + 97, 18, 81, 19, 65, 17, 18, 49, 17, 33, 49, 17, + 49, 33, 17, 50, 17, 17, 67, 17, 82, 17, 97, 240, + 208, 23, 8, 240, 149, 49, 50, 33, 65, 33, 65, 33, + 50, 37, 49, 33, 65, 49, 49, 50, 33, 66, 240, 160, + 6, 10, 0, 17, 73, 176, 21, 7, 240, 114, 114, 145, + 19, 34, 49, 17, 65, 17, 65, 17, 65, 17, 65, 17, + 65, 240, 112, 20, 7, 240, 49, 81, 81, 196, 34, 34, + 17, 65, 17, 65, 17, 65, 18, 34, 36, 240, 128, 8, + 4, 240, 145, 66, 49, 240, 224, 13, 5, 240, 240, 18, + 33, 33, 17, 33, 34, 240, 240, 32, 34, 12, 240, 240, + 164, 98, 17, 33, 65, 49, 49, 49, 49, 65, 17, 49, + 81, 17, 49, 81, 17, 33, 97, 17, 33, 81, 33, 17, + 97, 49, 82, 130, 240, 224, 29, 13, 240, 49, 193, 113, + 65, 65, 44, 17, 65, 65, 33, 65, 65, 33, 65, 65, + 43, 33, 65, 65, 113, 193, 193, 193, 240, 240, 48, 33, + 13, 209, 145, 44, 17, 145, 43, 33, 65, 65, 33, 65, + 65, 33, 23, 17, 33, 65, 17, 33, 33, 65, 33, 17, + 43, 33, 145, 43, 33, 145, 240, 208, 27, 11, 177, 113, + 42, 17, 113, 33, 113, 33, 113, 33, 113, 41, 33, 113, + 33, 113, 33, 113, 33, 113, 41, 33, 113, 240, 144, 32, + 14, 240, 81, 209, 209, 65, 45, 113, 177, 17, 17, 145, + 17, 17, 129, 33, 33, 97, 49, 49, 65, 65, 65, 33, + 39, 33, 113, 209, 240, 240, 80, 44, 14, 240, 17, 81, + 113, 81, 97, 97, 86, 37, 17, 65, 17, 65, 17, 66, + 81, 17, 65, 33, 49, 22, 49, 33, 17, 65, 49, 33, + 17, 65, 97, 17, 65, 33, 49, 22, 51, 33, 65, 65, + 240, 240, 16, 18, 14, 240, 248, 209, 209, 209, 193, 93, + 113, 209, 152, 209, 209, 209, 209, 240, 48, 29, 14, 240, + 114, 99, 65, 209, 71, 33, 99, 65, 81, 49, 52, 33, + 49, 49, 81, 49, 49, 99, 65, 209, 114, 209, 215, 240, + 240, 16, 37, 15, 240, 240, 242, 66, 66, 33, 66, 65, + 49, 66, 65, 50, 36, 34, 65, 33, 33, 33, 81, 33, + 33, 33, 81, 33, 34, 17, 83, 67, 98, 66, 114, 66, + 0, 6, 16, 22, 13, 240, 65, 209, 81, 101, 39, 193, + 163, 145, 34, 129, 49, 148, 193, 177, 193, 177, 177, 240, + 80, 44, 14, 240, 18, 65, 33, 81, 67, 55, 17, 97, + 49, 33, 113, 17, 49, 93, 65, 65, 33, 39, 17, 33, + 81, 65, 33, 49, 18, 49, 33, 33, 33, 17, 33, 33, + 51, 17, 17, 49, 65, 49, 65, 240, 240, 27, 14, 240, + 161, 45, 113, 153, 81, 49, 49, 89, 81, 49, 49, 89, + 81, 49, 49, 113, 17, 193, 178, 19, 83, 100, 240, 224, + 23, 14, 240, 65, 225, 65, 45, 240, 40, 240, 88, 240, + 88, 97, 97, 97, 97, 104, 97, 97, 240, 240, 32, 20, + 11, 240, 113, 177, 161, 161, 161, 161, 161, 161, 161, 113, + 33, 97, 65, 50, 99, 240, 192, 25, 14, 240, 240, 115, + 33, 68, 100, 33, 49, 129, 33, 33, 113, 49, 129, 209, + 209, 209, 209, 225, 227, 240, 240, 32, 35, 12, 240, 65, + 65, 113, 65, 97, 65, 17, 67, 33, 37, 49, 113, 49, + 113, 49, 113, 49, 113, 49, 17, 36, 65, 33, 50, 49, + 33, 49, 17, 33, 51, 240, 208, 25, 11, 240, 145, 50, + 99, 17, 145, 145, 145, 149, 82, 65, 49, 113, 17, 129, + 83, 33, 65, 50, 81, 49, 115, 240, 22, 11, 240, 240, + 65, 51, 83, 211, 17, 51, 33, 35, 81, 161, 145, 161, + 145, 145, 130, 114, 240, 48, 17, 13, 240, 216, 193, 88, + 97, 199, 60, 240, 39, 193, 88, 97, 200, 240, 208, 8, + 3, 240, 240, 50, 33, 17, 128, 22, 7, 240, 101, 33, + 65, 17, 65, 17, 50, 21, 33, 50, 17, 65, 17, 65, + 17, 50, 21, 240, 128, 20, 9, 240, 244, 50, 65, 33, + 113, 129, 129, 52, 17, 97, 18, 81, 34, 65, 53, 240, + 224, 22, 10, 225, 161, 65, 68, 37, 145, 65, 67, 53, + 145, 145, 85, 65, 67, 33, 65, 33, 36, 240, 160, 9, + 12, 0, 10, 65, 202, 0, 10, 80, 39, 14, 240, 33, + 66, 113, 81, 113, 24, 22, 97, 65, 65, 33, 81, 17, + 33, 138, 20, 49, 33, 65, 17, 49, 33, 97, 34, 33, + 49, 33, 66, 83, 34, 33, 81, 18, 82, 240, 224, 26, + 14, 240, 98, 225, 209, 71, 33, 81, 113, 81, 113, 81, + 116, 33, 113, 81, 83, 86, 33, 209, 209, 209, 209, 240, + 48, 7, 2, 65, 17, 17, 240, 128, 37, 14, 240, 161, + 81, 81, 33, 81, 81, 113, 49, 81, 51, 33, 84, 33, + 33, 97, 49, 49, 81, 49, 34, 81, 49, 129, 65, 129, + 49, 129, 33, 17, 129, 49, 240, 240, 96, 20, 10, 209, + 161, 145, 18, 53, 145, 148, 21, 17, 161, 145, 71, 33, + 97, 33, 162, 163, 208, 16, 11, 240, 145, 182, 129, 145, + 0, 6, 17, 161, 177, 113, 55, 240, 144, 20, 13, 240, + 240, 83, 17, 68, 84, 33, 177, 193, 177, 193, 193, 193, + 193, 209, 211, 240, 224, 18, 10, 240, 113, 161, 145, 145, + 145, 35, 67, 98, 113, 129, 145, 161, 167, 240, 96, 26, + 12, 240, 145, 193, 177, 68, 49, 34, 50, 17, 113, 49, + 177, 177, 177, 49, 113, 17, 17, 129, 54, 33, 177, 240, + 112, 16, 9, 0, 6, 65, 113, 113, 99, 51, 33, 129, + 129, 129, 129, 129, 192, 21, 12, 240, 240, 113, 52, 83, + 240, 180, 17, 51, 99, 33, 177, 161, 177, 161, 161, 161, + 240, 96, 18, 10, 240, 241, 68, 36, 49, 145, 129, 145, + 129, 145, 129, 129, 129, 129, 240, 192, 24, 8, 240, 97, + 33, 81, 33, 65, 33, 65, 33, 65, 33, 65, 33, 65, + 33, 65, 97, 113, 97, 97, 97, 208, 19, 11, 240, 240, + 226, 177, 97, 65, 81, 145, 161, 145, 145, 145, 81, 34, + 114, 240, 240, 23, 14, 251, 49, 33, 49, 33, 59, 129, + 125, 113, 168, 97, 97, 104, 97, 97, 104, 97, 97, 61, + 240, 224, 46, 14, 240, 17, 81, 113, 33, 33, 33, 49, + 49, 33, 17, 53, 17, 18, 33, 113, 17, 49, 37, 37, + 33, 49, 149, 33, 33, 49, 49, 33, 17, 69, 34, 81, + 49, 33, 49, 33, 19, 33, 49, 33, 33, 68, 240, 224, + 34, 14, 242, 54, 65, 81, 85, 49, 182, 37, 33, 49, + 145, 49, 37, 23, 245, 22, 33, 49, 17, 65, 33, 49, + 17, 65, 37, 22, 33, 49, 17, 65, 240, 240, 33, 14, + 225, 161, 50, 40, 49, 81, 167, 35, 65, 49, 65, 65, + 49, 65, 25, 49, 209, 54, 65, 17, 17, 65, 51, 33, + 65, 65, 54, 129, 65, 240, 240, 38, 14, 240, 161, 45, + 113, 139, 49, 33, 49, 33, 49, 33, 49, 33, 49, 37, + 33, 49, 33, 49, 33, 49, 37, 33, 49, 33, 49, 33, + 49, 33, 49, 33, 59, 49, 145, 240, 240, 18, 14, 240, + 242, 209, 209, 209, 216, 240, 45, 240, 34, 209, 209, 216, + 240, 240, 16, 23, 14, 240, 240, 98, 113, 81, 113, 81, + 119, 113, 81, 113, 81, 119, 113, 33, 209, 209, 125, 240, + 240, 208, 29, 12, 240, 82, 65, 97, 52, 65, 34, 49, + 49, 33, 69, 33, 65, 49, 34, 49, 49, 52, 65, 177, + 66, 81, 81, 177, 184, 240, 160, 22, 14, 240, 81, 181, + 130, 50, 113, 81, 114, 50, 133, 240, 77, 240, 34, 209, + 209, 216, 240, 240, 16, 27, 11, 240, 227, 161, 22, 49, + 97, 49, 81, 65, 81, 65, 66, 65, 49, 33, 49, 33, + 65, 33, 17, 129, 161, 161, 161, 192, 16, 13, 240, 240, + 169, 81, 193, 200, 81, 193, 200, 240, 236, 240, 240, 160, + 23, 7, 240, 97, 50, 17, 49, 33, 33, 49, 17, 67, + 67, 65, 18, 49, 34, 33, 50, 17, 65, 240, 112, 19, + 7, 240, 101, 33, 50, 17, 65, 17, 65, 17, 50, 21, + 33, 97, 97, 97, 240, 192, 21, 7, 240, 113, 33, 49, + 33, 164, 34, 34, 17, 65, 17, 65, 17, 65, 18, 34, + 36, 240, 128, 23, 7, 240, 113, 33, 49, 33, 145, 65, + 17, 65, 17, 65, 17, 65, 17, 65, 17, 50, 35, 17, + 240, 112, 33, 12, 241, 193, 177, 18, 85, 145, 33, 129, + 33, 134, 82, 17, 49, 49, 17, 17, 65, 17, 49, 81, + 17, 34, 81, 17, 17, 17, 65, 49, 82, 240, 192, 24, + 13, 0, 6, 65, 209, 98, 65, 129, 49, 145, 33, 49, + 81, 33, 33, 82, 49, 17, 97, 50, 193, 0, 6, 21, + 12, 241, 195, 240, 241, 51, 99, 17, 161, 161, 161, 163, + 129, 49, 97, 65, 97, 85, 240, 160, 21, 11, 225, 177, + 177, 34, 17, 67, 68, 17, 177, 161, 102, 65, 81, 49, + 161, 178, 180, 240, 160, 24, 12, 240, 177, 193, 33, 131, + 100, 161, 52, 65, 98, 49, 81, 65, 177, 177, 49, 97, + 65, 97, 85, 240, 160, 33, 14, 240, 241, 225, 209, 35, + 129, 17, 49, 99, 65, 66, 18, 65, 113, 81, 98, 81, + 98, 81, 81, 17, 81, 65, 33, 81, 33, 50, 98, 81, + 240, 144, 21, 11, 240, 240, 49, 69, 36, 65, 145, 97, + 33, 130, 145, 161, 161, 145, 161, 145, 145, 240, 64, 19, + 10, 240, 209, 145, 129, 129, 114, 98, 17, 66, 65, 145, + 145, 145, 145, 145, 145, 208, 19, 11, 240, 240, 66, 177, + 240, 50, 177, 97, 145, 145, 145, 145, 81, 34, 114, 240, + 240, 24, 11, 240, 177, 177, 165, 81, 65, 81, 49, 81, + 17, 33, 65, 50, 65, 81, 145, 145, 145, 130, 114, 240, + 80, 19, 9, 0, 8, 17, 49, 33, 33, 49, 33, 17, + 49, 33, 65, 129, 113, 113, 113, 224, 19, 8, 240, 17, + 129, 113, 113, 113, 115, 81, 34, 49, 65, 33, 113, 113, + 113, 113, 224, 24, 12, 240, 209, 193, 180, 68, 49, 161, + 161, 161, 162, 17, 98, 17, 34, 34, 49, 65, 97, 177, + 177, 240, 48, 28, 14, 240, 146, 177, 33, 161, 33, 178, + 81, 49, 161, 49, 145, 65, 113, 97, 97, 97, 81, 129, + 49, 145, 33, 161, 240, 240, 224, 33, 13, 240, 129, 97, + 49, 33, 97, 49, 17, 97, 49, 49, 69, 69, 193, 193, + 17, 113, 33, 33, 97, 33, 49, 65, 49, 49, 49, 65, + 178, 193, 240, 80, 32, 12, 240, 240, 177, 129, 49, 129, + 33, 129, 33, 129, 33, 49, 65, 33, 49, 65, 33, 33, + 65, 49, 33, 65, 49, 17, 65, 66, 65, 81, 240, 224, + 22, 13, 240, 129, 44, 97, 193, 194, 177, 18, 145, 34, + 129, 49, 129, 193, 193, 193, 193, 240, 240, 48, 39, 14, + 240, 33, 33, 33, 113, 33, 33, 113, 33, 33, 97, 25, + 49, 49, 33, 82, 49, 33, 65, 17, 49, 33, 97, 49, + 33, 107, 49, 209, 65, 17, 97, 34, 51, 51, 97, 240, + 240, 43, 14, 240, 17, 209, 55, 49, 81, 49, 49, 33, + 33, 49, 51, 49, 49, 19, 81, 49, 49, 81, 49, 49, + 33, 33, 49, 49, 17, 49, 49, 35, 49, 65, 49, 66, + 49, 113, 35, 98, 65, 240, 240, 16, 30, 14, 240, 161, + 45, 177, 209, 84, 65, 81, 33, 65, 81, 33, 65, 81, + 33, 65, 84, 65, 81, 33, 65, 161, 33, 179, 193, 240, + 240, 32, 30, 14, 240, 82, 113, 81, 65, 44, 33, 161, + 17, 161, 74, 145, 145, 49, 145, 53, 81, 49, 129, 17, + 33, 113, 49, 17, 97, 87, 240, 224, 34, 14, 240, 82, + 129, 65, 49, 75, 49, 209, 24, 65, 65, 33, 81, 82, + 97, 25, 49, 81, 49, 49, 81, 33, 49, 49, 33, 97, + 67, 81, 97, 240, 240, 64, 43, 14, 240, 33, 39, 65, + 33, 33, 33, 65, 33, 33, 33, 29, 65, 33, 33, 33, + 65, 18, 33, 33, 66, 23, 20, 33, 33, 33, 33, 17, + 81, 113, 81, 65, 33, 81, 83, 81, 97, 97, 240, 240, + 32, 40, 14, 240, 33, 38, 81, 33, 65, 81, 38, 39, + 65, 81, 38, 81, 18, 65, 67, 146, 17, 24, 65, 33, + 33, 113, 33, 36, 17, 33, 33, 33, 83, 17, 17, 17, + 97, 17, 53, 240, 224, 43, 14, 240, 33, 33, 50, 81, + 36, 113, 33, 119, 161, 38, 82, 17, 65, 81, 18, 65, + 66, 34, 33, 65, 17, 33, 17, 17, 49, 33, 33, 33, + 113, 17, 33, 17, 98, 33, 49, 81, 33, 81, 240, 224, + 39, 14, 240, 17, 129, 75, 49, 49, 65, 65, 49, 65, + 74, 65, 49, 65, 65, 49, 65, 74, 65, 49, 65, 65, + 49, 65, 65, 49, 17, 33, 49, 65, 35, 33, 81, 49, + 240, 240, 16, 29, 14, 240, 129, 105, 240, 240, 193, 45, + 113, 162, 17, 17, 129, 33, 33, 97, 49, 50, 49, 65, + 66, 17, 51, 81, 97, 240, 240, 96, 42, 14, 240, 49, + 49, 99, 65, 33, 81, 54, 65, 34, 49, 38, 33, 17, + 97, 66, 113, 34, 17, 99, 53, 33, 17, 17, 17, 65, + 17, 33, 33, 17, 33, 81, 82, 97, 66, 113, 19, 240, + 240, 64, 36, 14, 240, 49, 33, 49, 51, 54, 65, 49, + 49, 81, 49, 49, 38, 21, 81, 209, 39, 51, 65, 81, + 17, 17, 49, 65, 33, 53, 81, 81, 113, 81, 113, 24, + 240, 224, 25, 14, 240, 65, 225, 209, 49, 75, 240, 65, + 81, 129, 65, 129, 49, 161, 33, 161, 33, 193, 209, 49, + 45, 240, 224, 38, 14, 242, 49, 49, 81, 54, 37, 17, + 49, 145, 49, 53, 17, 51, 97, 133, 22, 129, 65, 37, + 17, 65, 33, 49, 33, 33, 49, 49, 50, 69, 33, 35, + 17, 51, 65, 240, 240, 46, 14, 240, 34, 53, 81, 49, + 49, 25, 49, 33, 65, 17, 33, 65, 33, 33, 33, 41, + 17, 177, 33, 54, 17, 49, 33, 65, 17, 49, 33, 65, + 18, 33, 33, 65, 17, 19, 38, 17, 33, 49, 65, 17, + 240, 240, 48, 47, 14, 240, 65, 37, 23, 81, 49, 17, + 113, 49, 17, 113, 23, 17, 49, 17, 17, 17, 17, 21, + 17, 17, 17, 17, 17, 49, 18, 35, 17, 81, 81, 17, + 87, 17, 81, 81, 17, 49, 23, 17, 49, 17, 81, 36, + 240, 224, 40, 14, 241, 145, 49, 71, 36, 49, 33, 33, + 113, 33, 52, 49, 33, 65, 81, 33, 65, 54, 37, 33, + 49, 65, 65, 49, 65, 65, 49, 65, 17, 33, 49, 51, + 49, 49, 65, 40, 240, 224, 28, 14, 240, 114, 209, 86, + 33, 161, 33, 161, 33, 98, 33, 33, 113, 33, 36, 65, + 81, 113, 81, 74, 209, 209, 209, 209, 240, 48, 18, 14, + 240, 248, 209, 209, 209, 209, 193, 93, 113, 209, 209, 209, + 209, 209, 240, 96, 16, 13, 240, 240, 169, 193, 193, 177, + 193, 193, 193, 177, 92, 0, 6, 80, 23, 11, 240, 35, + 161, 33, 113, 33, 53, 33, 113, 33, 81, 17, 38, 33, + 247, 161, 56, 65, 168, 240, 128, 26, 10, 240, 17, 162, + 145, 17, 113, 17, 113, 17, 113, 17, 113, 17, 98, 17, + 21, 17, 33, 97, 145, 145, 145, 145, 176, 38, 11, 240, + 66, 129, 17, 129, 17, 21, 33, 17, 33, 81, 17, 33, + 36, 17, 33, 81, 17, 33, 81, 17, 33, 34, 17, 17, + 50, 49, 17, 129, 17, 129, 17, 129, 17, 161, 192, 28, + 11, 240, 66, 161, 22, 49, 97, 49, 97, 49, 97, 49, + 22, 19, 33, 113, 33, 113, 33, 65, 33, 37, 49, 161, + 161, 161, 192, 27, 11, 240, 66, 161, 22, 49, 97, 49, + 97, 49, 97, 49, 22, 49, 33, 113, 33, 113, 33, 68, + 37, 49, 161, 161, 161, 192, 28, 10, 240, 209, 82, 33, + 17, 65, 33, 17, 65, 33, 25, 17, 65, 33, 17, 65, + 33, 22, 33, 17, 113, 145, 145, 145, 145, 176, 29, 11, + 240, 50, 177, 66, 65, 65, 81, 65, 36, 50, 81, 33, + 34, 49, 17, 129, 113, 33, 100, 98, 34, 81, 65, 81, + 50, 100, 208, 20, 13, 240, 240, 241, 193, 178, 161, 34, + 113, 82, 50, 33, 209, 193, 193, 108, 240, 240, 160, 21, + 14, 240, 66, 209, 194, 177, 34, 114, 82, 240, 240, 29, + 113, 209, 209, 209, 209, 209, 240, 96, 29, 12, 240, 81, + 194, 82, 65, 97, 65, 81, 81, 81, 81, 65, 17, 65, + 49, 49, 49, 33, 81, 33, 17, 145, 177, 177, 177, 177, + 208, 30, 11, 240, 50, 65, 97, 36, 65, 18, 49, 49, + 17, 69, 18, 49, 49, 36, 65, 161, 50, 81, 65, 81, + 71, 65, 81, 71, 65, 240, 48, 28, 11, 240, 51, 161, + 50, 81, 36, 65, 18, 38, 17, 65, 49, 17, 65, 49, + 18, 33, 20, 36, 65, 161, 161, 161, 161, 161, 192, 30, + 14, 240, 99, 129, 65, 100, 49, 82, 34, 33, 81, 65, + 33, 82, 34, 33, 100, 52, 81, 65, 129, 65, 74, 209, + 209, 209, 240, 240, 32, 21, 13, 240, 50, 164, 130, 34, + 113, 65, 114, 34, 132, 240, 60, 56, 177, 104, 97, 199, + 240, 224, 35, 13, 240, 82, 98, 81, 68, 65, 50, 34, + 49, 49, 65, 49, 50, 34, 49, 68, 65, 193, 98, 50, + 113, 49, 113, 65, 97, 18, 17, 17, 145, 50, 97, 240, + 80, 30, 11, 240, 50, 177, 22, 49, 81, 65, 81, 20, + 66, 65, 49, 33, 49, 18, 65, 33, 114, 17, 100, 98, + 34, 81, 65, 82, 34, 100, 208, 18, 14, 240, 248, 113, + 215, 113, 215, 240, 240, 45, 240, 49, 209, 216, 240, 240, + 16, 39, 12, 240, 83, 129, 33, 129, 33, 24, 33, 81, + 33, 33, 49, 33, 17, 33, 49, 33, 20, 49, 33, 17, + 33, 49, 33, 17, 33, 21, 18, 33, 129, 33, 129, 33, + 129, 33, 177, 208, 19, 13, 240, 240, 185, 146, 129, 49, + 129, 49, 129, 49, 105, 240, 240, 188, 240, 240, 160, 29, + 14, 240, 240, 98, 100, 49, 209, 72, 17, 100, 49, 82, + 34, 36, 33, 65, 33, 82, 34, 33, 100, 49, 209, 209, + 209, 209, 240, 48, 23, 9, 240, 228, 65, 65, 49, 66, + 17, 97, 17, 97, 17, 97, 17, 97, 18, 65, 49, 65, + 68, 240, 240, 25, 10, 240, 240, 36, 81, 65, 65, 66, + 33, 97, 33, 97, 33, 97, 33, 97, 34, 66, 49, 65, + 85, 147, 240, 96, 19, 8, 240, 145, 81, 18, 50, 33, + 49, 65, 17, 83, 97, 113, 113, 113, 113, 240, 208, 16, + 4, 131, 17, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 51, 16, 4, 131, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 19, 20, 7, 240, 240, 228, + 33, 49, 17, 65, 17, 65, 17, 65, 18, 34, 35, 17, + 97, 97, 97, 27, 10, 34, 18, 97, 18, 240, 34, 115, + 113, 17, 113, 33, 82, 33, 81, 49, 86, 49, 81, 49, + 81, 34, 97, 240, 240, 16, 22, 7, 240, 114, 17, 50, + 17, 180, 33, 49, 17, 65, 17, 65, 17, 65, 17, 50, + 35, 17, 240, 112, 17, 7, 240, 49, 81, 81, 196, 34, + 33, 33, 65, 22, 17, 98, 101, 240, 112, 12, 6, 240, + 65, 33, 17, 33, 34, 18, 0, 7, 80, 11, 6, 194, + 18, 33, 33, 17, 33, 0, 8, 64, 17, 7, 177, 113, + 97, 81, 81, 66, 65, 97, 113, 113, 113, 113, 113, 97, + 128, 22, 11, 241, 177, 161, 145, 49, 81, 33, 33, 34, + 65, 49, 161, 177, 177, 177, 177, 177, 161, 240, 16, 24, + 11, 240, 113, 97, 65, 49, 33, 49, 65, 81, 161, 161, + 161, 161, 161, 113, 33, 97, 65, 50, 99, 240, 192, 28, + 13, 240, 129, 65, 81, 33, 65, 33, 33, 99, 116, 177, + 52, 81, 98, 65, 81, 81, 193, 193, 49, 113, 65, 113, + 85, 240, 208, 28, 12, 241, 193, 177, 17, 86, 145, 51, + 65, 98, 49, 81, 65, 81, 81, 81, 65, 97, 132, 113, + 50, 97, 49, 17, 99, 240, 32, 38, 13, 240, 240, 33, + 209, 113, 65, 113, 36, 99, 33, 17, 81, 49, 49, 49, + 17, 33, 65, 33, 17, 17, 81, 17, 50, 81, 17, 49, + 97, 17, 33, 17, 65, 50, 82, 240, 224, 21, 9, 177, + 145, 131, 66, 97, 129, 129, 129, 36, 35, 65, 17, 97, + 17, 97, 113, 98, 82, 224, 26, 9, 145, 145, 34, 65, + 17, 33, 50, 65, 34, 65, 33, 81, 33, 81, 33, 81, + 33, 81, 113, 129, 113, 113, 113, 224, 23, 11, 240, 177, + 177, 161, 165, 21, 65, 33, 113, 33, 97, 65, 81, 65, + 65, 161, 145, 145, 145, 240, 32, 14, 10, 0, 9, 51, + 52, 145, 145, 145, 148, 36, 65, 240, 96, 25, 10, 240, + 113, 161, 35, 67, 33, 65, 49, 65, 65, 65, 49, 65, + 65, 49, 65, 145, 129, 129, 129, 129, 240, 48, 31, 13, + 240, 129, 65, 81, 33, 65, 34, 17, 17, 67, 17, 17, + 97, 49, 113, 65, 113, 49, 113, 65, 97, 65, 193, 177, + 177, 177, 177, 240, 144, 22, 12, 240, 177, 193, 177, 177, + 67, 54, 97, 33, 113, 65, 81, 81, 177, 161, 177, 161, + 161, 240, 80, 27, 12, 240, 241, 113, 65, 113, 49, 113, + 49, 65, 33, 37, 37, 17, 113, 49, 113, 49, 113, 49, + 161, 177, 161, 161, 240, 64, 25, 12, 240, 240, 49, 50, + 65, 33, 65, 65, 17, 145, 50, 193, 97, 161, 161, 161, + 161, 97, 34, 130, 240, 240, 48, 23, 11, 240, 240, 65, + 67, 68, 33, 145, 161, 145, 161, 145, 17, 113, 49, 66, + 81, 18, 113, 240, 240, 64, 23, 10, 240, 193, 33, 113, + 33, 97, 49, 81, 49, 65, 65, 65, 129, 145, 129, 145, + 129, 129, 129, 240, 32, 25, 13, 240, 129, 161, 33, 17, + 52, 17, 17, 35, 49, 17, 161, 177, 193, 177, 193, 177, + 177, 177, 177, 240, 240, 112, 24, 13, 240, 114, 161, 33, + 17, 53, 33, 35, 49, 18, 145, 177, 193, 177, 193, 177, + 177, 177, 177, 240, 240, 112, 33, 13, 240, 114, 97, 49, + 33, 97, 33, 33, 97, 50, 33, 69, 69, 193, 193, 17, + 113, 33, 33, 97, 33, 49, 65, 49, 49, 49, 65, 178, + 193, 240, 80, 21, 11, 240, 225, 177, 161, 161, 82, 49, + 115, 161, 145, 17, 129, 33, 97, 145, 130, 114, 240, 80, + 15, 10, 0, 9, 35, 67, 33, 145, 129, 132, 36, 65, + 240, 240, 16, 17, 12, 0, 7, 81, 51, 99, 33, 177, + 161, 177, 165, 37, 81, 0, 6, 16, 17, 8, 0, 6, + 52, 19, 49, 113, 68, 19, 33, 113, 83, 35, 49, 240, + 32, 22, 13, 240, 17, 193, 97, 89, 49, 193, 186, 193, + 129, 49, 40, 33, 193, 129, 49, 147, 177, 240, 240, 22, + 13, 240, 33, 209, 193, 33, 74, 177, 177, 177, 177, 177, + 177, 177, 162, 18, 82, 17, 69, 240, 224, 32, 14, 240, + 81, 210, 177, 33, 145, 65, 98, 99, 18, 33, 65, 17, + 97, 65, 129, 65, 129, 65, 129, 65, 113, 81, 97, 97, + 81, 113, 240, 240, 32, 38, 14, 240, 33, 49, 33, 97, + 49, 49, 81, 49, 49, 65, 65, 129, 70, 34, 20, 97, + 17, 65, 129, 65, 129, 81, 113, 81, 49, 49, 97, 33, + 49, 113, 17, 49, 130, 240, 224, 38, 13, 240, 113, 65, + 33, 65, 65, 49, 49, 65, 50, 33, 65, 65, 33, 65, + 113, 65, 113, 65, 113, 65, 50, 17, 81, 18, 50, 51, + 65, 33, 49, 50, 50, 66, 97, 240, 192, 35, 14, 240, + 33, 65, 129, 17, 33, 129, 17, 33, 113, 39, 65, 17, + 49, 98, 81, 81, 17, 81, 123, 49, 81, 113, 81, 113, + 81, 113, 81, 113, 81, 240, 240, 48, 27, 14, 240, 81, + 210, 177, 33, 145, 65, 98, 99, 18, 37, 33, 240, 43, + 129, 193, 49, 129, 81, 88, 17, 81, 113, 240, 240, 31, + 14, 240, 33, 50, 129, 65, 138, 49, 209, 39, 50, 177, + 17, 39, 65, 209, 39, 65, 33, 81, 65, 33, 81, 65, + 39, 65, 33, 81, 240, 240, 47, 14, 240, 33, 49, 145, + 52, 97, 33, 33, 97, 25, 49, 33, 33, 49, 34, 40, + 17, 17, 65, 49, 65, 49, 17, 17, 81, 18, 17, 17, + 97, 49, 19, 81, 18, 17, 17, 17, 65, 52, 33, 49, + 18, 33, 49, 240, 224, 33, 14, 240, 65, 209, 193, 49, + 129, 81, 97, 38, 68, 33, 33, 113, 33, 161, 33, 161, + 33, 145, 49, 49, 81, 49, 49, 65, 65, 50, 18, 100, + 240, 240, 30, 14, 240, 81, 209, 209, 65, 45, 113, 65, + 129, 65, 129, 65, 129, 65, 113, 81, 113, 81, 97, 33, + 49, 66, 67, 50, 113, 240, 240, 32, 39, 14, 240, 49, + 65, 85, 49, 209, 209, 145, 22, 23, 33, 33, 65, 81, + 33, 49, 97, 33, 49, 33, 49, 33, 33, 35, 17, 49, + 20, 33, 17, 49, 33, 81, 35, 98, 65, 240, 240, 48, + 13, 240, 17, 65, 113, 65, 113, 65, 71, 17, 97, 17, + 37, 49, 33, 33, 33, 33, 50, 17, 33, 17, 17, 33, + 33, 33, 66, 49, 33, 81, 49, 33, 65, 17, 17, 49, + 49, 33, 17, 49, 33, 65, 65, 17, 65, 50, 240, 41, + 14, 240, 65, 49, 131, 33, 84, 65, 129, 65, 77, 33, + 33, 17, 33, 33, 38, 33, 33, 33, 33, 17, 33, 33, + 38, 33, 33, 81, 49, 49, 53, 17, 49, 81, 33, 35, + 24, 49, 240, 240, 50, 14, 241, 49, 33, 49, 38, 21, + 33, 49, 33, 49, 37, 33, 49, 33, 49, 33, 49, 33, + 49, 33, 49, 37, 33, 49, 33, 97, 49, 33, 33, 49, + 49, 33, 49, 33, 19, 33, 18, 17, 17, 33, 35, 49, + 17, 97, 97, 240, 240, 48, 43, 14, 240, 81, 120, 129, + 33, 81, 68, 22, 49, 33, 33, 33, 65, 33, 33, 33, + 68, 33, 33, 65, 33, 33, 33, 65, 36, 17, 81, 18, + 49, 68, 17, 33, 17, 65, 49, 17, 49, 114, 81, 240, + 224, 32, 14, 240, 33, 83, 86, 129, 209, 113, 90, 65, + 209, 17, 81, 81, 24, 65, 17, 81, 65, 33, 81, 65, + 33, 81, 49, 55, 33, 65, 81, 240, 240, 40, 14, 240, + 65, 195, 132, 53, 81, 49, 49, 25, 49, 81, 49, 49, + 82, 33, 49, 66, 17, 17, 49, 49, 17, 34, 49, 33, + 33, 49, 49, 17, 49, 53, 81, 49, 49, 81, 240, 240, + 112, 51, 14, 240, 114, 65, 33, 65, 93, 17, 33, 17, + 97, 17, 33, 17, 97, 17, 33, 17, 20, 17, 17, 33, + 17, 17, 33, 17, 17, 33, 17, 17, 33, 17, 20, 17, + 20, 17, 17, 33, 17, 17, 33, 17, 97, 97, 97, 67, + 97, 81, 240, 240, 43, 13, 220, 17, 161, 17, 49, 49, + 33, 17, 53, 33, 17, 34, 33, 49, 17, 17, 34, 65, + 17, 49, 33, 49, 17, 18, 17, 34, 17, 17, 82, 49, + 17, 50, 81, 17, 82, 49, 17, 161, 28, 240, 192, 30, + 14, 240, 81, 209, 65, 60, 97, 193, 49, 129, 65, 129, + 65, 114, 23, 49, 17, 65, 81, 33, 65, 129, 65, 129, + 65, 33, 90, 240, 224, 43, 14, 240, 33, 49, 49, 81, + 54, 37, 17, 49, 81, 49, 49, 40, 18, 65, 49, 17, + 129, 17, 38, 37, 17, 49, 81, 50, 33, 40, 17, 17, + 81, 49, 33, 97, 49, 17, 17, 81, 50, 49, 240, 224, + 32, 14, 240, 82, 113, 81, 65, 44, 33, 33, 113, 17, + 65, 17, 49, 81, 49, 161, 33, 161, 33, 49, 45, 114, + 177, 33, 130, 66, 51, 130, 240, 224, 44, 14, 240, 49, + 33, 49, 97, 38, 33, 33, 18, 49, 65, 18, 33, 17, + 81, 17, 50, 129, 33, 33, 113, 17, 49, 106, 19, 17, + 17, 49, 65, 33, 33, 33, 113, 33, 33, 113, 51, 113, + 65, 240, 240, 32, 36, 14, 240, 17, 129, 75, 49, 129, + 74, 65, 33, 49, 97, 49, 17, 113, 24, 65, 49, 33, + 107, 49, 49, 33, 81, 65, 33, 81, 49, 49, 65, 34, + 65, 240, 240, 32, 31, 14, 240, 49, 49, 93, 81, 49, + 135, 113, 81, 119, 113, 81, 77, 49, 49, 49, 75, 33, + 17, 49, 49, 17, 49, 49, 19, 145, 240, 240, 80, 33, + 14, 240, 82, 129, 65, 49, 75, 49, 49, 145, 25, 49, + 49, 145, 33, 33, 113, 24, 65, 81, 113, 81, 33, 49, + 41, 33, 97, 81, 113, 240, 240, 48, 36, 14, 240, 82, + 129, 65, 49, 75, 49, 209, 209, 49, 65, 66, 49, 49, + 65, 17, 33, 33, 81, 33, 17, 33, 81, 33, 49, 81, + 49, 49, 81, 97, 81, 42, 240, 224, 44, 14, 240, 82, + 129, 65, 49, 75, 49, 113, 81, 22, 97, 17, 49, 33, + 65, 25, 49, 17, 49, 113, 17, 49, 113, 17, 33, 17, + 81, 33, 17, 33, 33, 33, 19, 18, 17, 17, 17, 49, + 49, 34, 240, 224, 42, 14, 240, 97, 50, 40, 33, 81, + 33, 49, 97, 33, 33, 113, 33, 66, 25, 33, 81, 33, + 49, 97, 33, 33, 113, 33, 17, 34, 49, 49, 65, 65, + 49, 49, 65, 65, 33, 65, 98, 240, 240, 48, 39, 14, + 240, 21, 66, 49, 49, 65, 69, 49, 81, 49, 33, 101, + 17, 34, 81, 97, 40, 33, 193, 101, 17, 34, 49, 49, + 65, 69, 49, 65, 33, 33, 17, 65, 34, 34, 240, 240, + 48, 41, 14, 240, 18, 50, 113, 65, 113, 65, 49, 49, + 69, 113, 49, 49, 65, 25, 34, 65, 65, 17, 17, 69, + 65, 49, 65, 65, 33, 17, 33, 81, 17, 50, 97, 50, + 35, 49, 18, 81, 240, 240, 37, 14, 240, 33, 33, 49, + 105, 81, 97, 104, 97, 97, 104, 97, 97, 104, 97, 33, + 49, 81, 17, 33, 49, 65, 17, 33, 17, 33, 33, 33, + 66, 17, 17, 69, 240, 240, 32, 49, 14, 240, 33, 33, + 161, 33, 145, 55, 49, 33, 49, 33, 34, 17, 18, 17, + 65, 17, 49, 33, 17, 65, 33, 49, 33, 49, 17, 35, + 33, 113, 145, 17, 33, 49, 65, 17, 33, 17, 33, 33, + 33, 66, 17, 17, 69, 240, 240, 32, 42, 14, 240, 17, + 81, 113, 40, 49, 81, 81, 18, 38, 33, 17, 17, 49, + 81, 17, 40, 17, 17, 49, 65, 65, 54, 65, 49, 65, + 65, 54, 65, 49, 65, 65, 49, 35, 65, 49, 49, 240, + 240, 16, 44, 14, 240, 97, 17, 177, 33, 81, 65, 49, + 75, 49, 65, 129, 65, 49, 68, 17, 49, 65, 33, 17, + 33, 81, 33, 33, 17, 81, 33, 49, 33, 52, 33, 17, + 17, 33, 33, 33, 50, 17, 81, 81, 240, 224, 36, 14, + 240, 33, 65, 129, 65, 129, 38, 38, 33, 129, 39, 65, + 17, 178, 81, 52, 24, 33, 17, 33, 49, 97, 49, 33, + 49, 33, 97, 67, 67, 81, 97, 240, 240, 32, 41, 14, + 240, 17, 49, 145, 49, 33, 97, 53, 54, 49, 97, 39, + 65, 18, 33, 33, 66, 17, 33, 33, 35, 33, 33, 33, + 65, 25, 49, 81, 113, 65, 17, 67, 49, 51, 33, 34, + 81, 240, 240, 43, 14, 240, 33, 49, 145, 52, 97, 33, + 33, 76, 81, 17, 17, 17, 17, 83, 17, 17, 17, 66, + 17, 17, 19, 34, 17, 18, 65, 81, 65, 138, 17, 33, + 49, 17, 83, 33, 51, 49, 18, 81, 240, 240, 25, 14, + 240, 81, 209, 65, 45, 113, 209, 153, 113, 65, 129, 65, + 145, 33, 178, 177, 33, 130, 66, 51, 130, 240, 224, 45, + 14, 240, 113, 81, 33, 65, 92, 33, 33, 17, 33, 33, + 33, 33, 17, 33, 33, 36, 17, 33, 33, 33, 33, 17, + 33, 33, 33, 42, 17, 33, 65, 84, 49, 17, 65, 33, + 33, 49, 129, 81, 97, 113, 240, 224, 27, 14, 240, 40, + 97, 97, 104, 97, 97, 104, 240, 45, 129, 145, 49, 33, + 97, 53, 82, 33, 129, 33, 17, 98, 71, 240, 224, 35, + 14, 240, 33, 81, 113, 81, 85, 21, 81, 81, 70, 22, + 49, 17, 49, 17, 65, 49, 17, 49, 33, 25, 17, 49, + 113, 89, 81, 113, 89, 81, 113, 240, 240, 16, 30, 14, + 240, 17, 113, 90, 65, 49, 49, 89, 81, 49, 49, 89, + 145, 125, 113, 177, 17, 17, 114, 33, 34, 50, 65, 66, + 113, 240, 240, 80, 44, 14, 240, 17, 65, 33, 81, 40, + 49, 65, 33, 53, 22, 65, 65, 33, 81, 40, 50, 33, + 17, 33, 50, 17, 22, 33, 17, 49, 17, 33, 65, 25, + 49, 49, 65, 65, 49, 35, 65, 49, 49, 240, 240, 16, + 58, 14, 240, 17, 33, 33, 17, 81, 33, 33, 17, 17, + 49, 17, 35, 17, 36, 18, 17, 17, 81, 33, 18, 17, + 17, 49, 21, 19, 50, 65, 33, 50, 25, 17, 17, 49, + 33, 33, 17, 17, 49, 33, 17, 65, 33, 17, 33, 17, + 49, 17, 33, 17, 18, 50, 65, 49, 240, 224, 39, 14, + 241, 65, 145, 49, 145, 17, 17, 65, 97, 23, 65, 33, + 65, 81, 17, 33, 17, 98, 49, 113, 81, 83, 81, 113, + 65, 17, 97, 49, 49, 81, 33, 81, 65, 17, 113, 240, + 224, 43, 14, 240, 49, 49, 145, 49, 145, 49, 113, 17, + 49, 34, 49, 17, 49, 33, 65, 21, 17, 81, 17, 50, + 97, 17, 49, 113, 17, 49, 113, 17, 19, 113, 18, 33, + 49, 20, 65, 49, 33, 116, 240, 224, 37, 14, 241, 97, + 113, 25, 81, 113, 17, 33, 23, 49, 17, 65, 129, 23, + 65, 33, 33, 33, 65, 39, 35, 33, 33, 33, 65, 39, + 65, 209, 50, 18, 81, 18, 82, 240, 224, 47, 14, 240, + 49, 17, 65, 45, 49, 49, 65, 65, 49, 33, 17, 65, + 49, 33, 17, 39, 33, 17, 65, 49, 33, 17, 65, 49, + 33, 17, 65, 19, 33, 17, 66, 66, 67, 65, 17, 33, + 33, 65, 33, 33, 82, 67, 240, 224, 40, 14, 240, 161, + 45, 240, 55, 65, 33, 33, 33, 33, 17, 33, 33, 33, + 33, 17, 39, 33, 17, 33, 33, 33, 33, 17, 33, 33, + 33, 33, 17, 39, 33, 17, 177, 29, 17, 177, 240, 224, + 44, 14, 240, 17, 81, 117, 21, 33, 17, 49, 33, 49, + 49, 17, 65, 81, 38, 49, 33, 97, 49, 37, 33, 49, + 33, 49, 33, 49, 37, 33, 49, 33, 49, 33, 49, 37, + 33, 49, 115, 49, 129, 240, 240, 16, 32, 14, 240, 17, + 97, 105, 81, 97, 104, 97, 97, 104, 97, 97, 104, 97, + 17, 33, 17, 129, 33, 49, 81, 49, 49, 65, 65, 50, + 18, 100, 240, 240, 41, 14, 240, 17, 97, 105, 81, 97, + 97, 33, 49, 97, 33, 49, 97, 33, 49, 97, 33, 49, + 97, 33, 17, 17, 97, 33, 17, 17, 145, 17, 49, 97, + 33, 49, 66, 49, 50, 18, 100, 240, 240, 31, 14, 241, + 65, 146, 33, 161, 33, 214, 35, 33, 33, 113, 81, 113, + 81, 113, 25, 49, 81, 113, 17, 49, 99, 65, 113, 81, + 209, 240, 240, 48, 37, 14, 241, 84, 82, 49, 33, 97, + 49, 33, 161, 33, 51, 49, 51, 49, 33, 161, 54, 65, + 65, 33, 81, 65, 33, 81, 17, 50, 83, 66, 97, 50, + 35, 82, 81, 240, 240, 39, 14, 240, 33, 65, 129, 65, + 86, 37, 49, 65, 65, 33, 65, 33, 17, 49, 17, 81, + 70, 49, 113, 81, 113, 81, 115, 49, 68, 65, 18, 49, + 17, 49, 50, 65, 33, 81, 240, 224, 42, 14, 230, 22, + 17, 65, 17, 65, 22, 22, 17, 65, 17, 65, 22, 22, + 17, 177, 17, 39, 33, 17, 33, 81, 33, 17, 39, 33, + 17, 33, 81, 33, 17, 39, 33, 17, 33, 84, 17, 161, + 240, 240, 43, 14, 241, 56, 50, 129, 17, 33, 129, 17, + 81, 81, 17, 81, 81, 17, 81, 81, 17, 81, 81, 17, + 65, 17, 65, 17, 49, 49, 49, 17, 33, 81, 33, 17, + 17, 97, 33, 17, 147, 17, 161, 240, 240, 43, 14, 241, + 56, 49, 145, 17, 177, 17, 38, 49, 17, 33, 65, 49, + 17, 33, 65, 49, 17, 38, 49, 17, 33, 65, 49, 17, + 33, 65, 49, 17, 38, 49, 17, 33, 66, 33, 17, 147, + 17, 161, 240, 240, 26, 13, 240, 66, 209, 193, 70, 33, + 129, 49, 129, 49, 113, 68, 49, 81, 81, 97, 65, 113, + 193, 193, 193, 193, 240, 32, 24, 14, 240, 98, 225, 70, + 49, 145, 49, 129, 68, 65, 81, 97, 97, 66, 232, 113, + 215, 113, 216, 240, 240, 16, 37, 12, 240, 98, 129, 33, + 129, 33, 22, 17, 33, 81, 33, 33, 81, 33, 33, 65, + 52, 65, 49, 33, 49, 65, 33, 33, 81, 33, 17, 97, + 33, 129, 33, 129, 33, 177, 208, 30, 11, 240, 66, 161, + 22, 49, 97, 49, 81, 65, 65, 21, 65, 81, 49, 97, + 33, 49, 49, 113, 33, 98, 129, 33, 97, 66, 49, 240, + 64, 36, 12, 240, 83, 129, 33, 129, 33, 21, 33, 33, + 81, 33, 33, 65, 49, 33, 69, 33, 49, 65, 33, 33, + 81, 33, 17, 97, 33, 129, 33, 129, 33, 129, 33, 177, + 208, 23, 13, 240, 216, 193, 129, 49, 129, 33, 145, 124, + 240, 66, 164, 130, 34, 113, 65, 113, 50, 132, 240, 48, + 26, 11, 240, 50, 177, 161, 22, 49, 97, 49, 97, 49, + 81, 65, 65, 81, 49, 97, 33, 113, 17, 129, 161, 161, + 161, 192, 46, 12, 240, 65, 18, 145, 17, 17, 33, 18, + 17, 17, 36, 17, 17, 17, 65, 17, 33, 17, 49, 33, + 33, 17, 49, 36, 17, 33, 33, 49, 17, 17, 49, 49, + 17, 65, 65, 17, 145, 17, 145, 17, 145, 17, 240, 160, + 18, 13, 240, 194, 193, 193, 193, 200, 240, 28, 97, 193, + 193, 193, 193, 193, 240, 80, 19, 14, 240, 240, 17, 209, + 209, 216, 240, 45, 113, 167, 209, 119, 113, 216, 240, 240, + 16, 22, 14, 240, 17, 225, 209, 209, 216, 240, 240, 29, + 113, 196, 146, 34, 129, 65, 130, 34, 148, 240, 64, 26, + 14, 240, 114, 209, 70, 49, 81, 113, 81, 113, 81, 116, + 33, 83, 86, 33, 209, 113, 81, 113, 209, 216, 240, 240, + 16, 36, 11, 240, 66, 129, 17, 129, 17, 22, 17, 17, + 33, 81, 17, 33, 81, 17, 33, 83, 33, 81, 17, 33, + 51, 17, 36, 33, 17, 129, 17, 129, 17, 129, 17, 161, + 192, 21, 14, 240, 249, 97, 209, 216, 145, 209, 125, 240, + 84, 146, 34, 129, 65, 130, 34, 148, 240, 64, 26, 11, + 240, 66, 161, 23, 33, 33, 113, 33, 113, 33, 113, 38, + 33, 81, 65, 81, 65, 86, 20, 81, 161, 161, 161, 192, + 28, 14, 240, 114, 209, 71, 33, 145, 49, 145, 49, 145, + 49, 71, 36, 33, 113, 81, 113, 81, 68, 85, 49, 209, + 209, 209, 240, 48, 37, 12, 240, 81, 146, 18, 129, 33, + 21, 33, 33, 81, 33, 33, 81, 33, 33, 37, 20, 33, + 81, 33, 33, 81, 33, 33, 21, 33, 49, 65, 33, 129, + 33, 129, 33, 177, 208, 35, 12, 240, 98, 129, 33, 21, + 33, 33, 81, 33, 33, 17, 50, 20, 37, 17, 33, 33, + 81, 33, 33, 51, 33, 36, 33, 120, 81, 81, 81, 81, + 87, 81, 240, 64, 17, 13, 240, 240, 169, 193, 193, 73, + 81, 193, 200, 145, 193, 108, 240, 240, 160, 20, 14, 240, + 248, 209, 104, 113, 215, 161, 125, 145, 130, 65, 134, 129, + 65, 134, 129, 240, 128, 16, 13, 240, 240, 168, 193, 193, + 89, 81, 193, 200, 240, 236, 240, 240, 160, 31, 14, 240, + 114, 209, 71, 33, 81, 65, 33, 81, 49, 49, 81, 49, + 52, 33, 49, 49, 86, 33, 81, 113, 113, 81, 129, 209, + 215, 240, 240, 16, 27, 11, 240, 50, 177, 161, 22, 49, + 33, 53, 33, 49, 49, 33, 49, 49, 33, 53, 37, 49, + 33, 113, 161, 161, 161, 161, 192, 28, 12, 240, 82, 177, + 38, 49, 49, 53, 49, 49, 49, 49, 49, 49, 49, 53, + 53, 49, 49, 113, 82, 65, 97, 177, 183, 240, 160, 29, + 11, 240, 50, 177, 161, 22, 49, 33, 49, 49, 33, 49, + 49, 33, 49, 49, 33, 49, 49, 37, 49, 33, 113, 161, + 161, 161, 161, 192, 22, 14, 240, 240, 98, 113, 81, 113, + 81, 119, 113, 81, 113, 81, 119, 113, 240, 240, 141, 240, + 240, 208, 30, 14, 240, 98, 225, 114, 65, 129, 65, 113, + 81, 113, 81, 97, 17, 68, 49, 33, 49, 81, 65, 33, + 65, 129, 209, 209, 209, 209, 240, 48, 40, 13, 240, 114, + 146, 33, 66, 49, 33, 81, 49, 33, 81, 49, 33, 65, + 65, 33, 66, 52, 49, 33, 33, 33, 33, 65, 17, 33, + 17, 81, 17, 33, 145, 33, 145, 33, 145, 33, 193, 224, + 25, 11, 240, 50, 81, 65, 81, 65, 65, 36, 66, 65, + 49, 33, 49, 33, 65, 33, 247, 161, 71, 81, 167, 240, + 128, 30, 11, 240, 161, 66, 81, 65, 81, 65, 65, 81, + 49, 18, 49, 33, 65, 33, 17, 129, 65, 66, 81, 65, + 86, 81, 65, 86, 81, 240, 32, 34, 13, 240, 82, 98, + 81, 68, 65, 50, 49, 49, 49, 69, 50, 49, 49, 68, + 65, 193, 98, 50, 113, 49, 129, 49, 113, 17, 17, 17, + 81, 49, 50, 240, 192, 42, 12, 240, 49, 19, 129, 33, + 49, 65, 33, 35, 49, 33, 18, 33, 33, 33, 17, 52, + 33, 17, 49, 33, 33, 18, 33, 33, 33, 35, 49, 33, + 129, 33, 129, 33, 129, 33, 129, 33, 129, 33, 208, 23, + 14, 240, 240, 65, 180, 146, 50, 113, 81, 113, 81, 113, + 81, 130, 18, 177, 209, 209, 125, 240, 240, 208, 26, 13, + 240, 50, 164, 130, 34, 113, 65, 113, 49, 149, 129, 49, + 76, 98, 164, 130, 34, 113, 65, 114, 34, 132, 240, 48, + 30, 12, 241, 66, 67, 65, 50, 34, 33, 49, 65, 33, + 50, 34, 33, 68, 49, 145, 17, 39, 33, 81, 36, 81, + 81, 81, 177, 184, 240, 160, 45, 12, 240, 97, 81, 50, + 17, 52, 33, 17, 34, 49, 17, 17, 33, 65, 17, 17, + 33, 50, 17, 17, 52, 33, 17, 21, 49, 17, 65, 65, + 17, 65, 20, 17, 65, 65, 17, 65, 65, 17, 65, 65, + 17, 177, 208, 26, 13, 240, 65, 164, 130, 34, 113, 65, + 113, 50, 132, 240, 60, 81, 49, 129, 49, 129, 49, 129, + 49, 129, 49, 240, 240, 21, 14, 240, 240, 65, 180, 146, + 50, 113, 81, 113, 81, 114, 50, 133, 0, 5, 125, 240, + 240, 208, 24, 13, 240, 50, 164, 130, 34, 113, 65, 113, + 50, 132, 240, 60, 240, 23, 113, 65, 113, 65, 119, 97, + 240, 112, 25, 13, 240, 49, 180, 130, 34, 113, 65, 113, + 50, 132, 240, 60, 97, 180, 130, 34, 113, 65, 114, 34, + 132, 240, 48, 30, 11, 240, 51, 66, 65, 52, 49, 34, + 34, 33, 33, 65, 33, 33, 65, 33, 34, 34, 33, 52, + 49, 161, 146, 24, 17, 161, 161, 161, 192, 30, 11, 240, + 50, 65, 97, 36, 65, 18, 34, 49, 17, 65, 49, 18, + 34, 49, 36, 65, 226, 81, 65, 81, 71, 65, 81, 71, + 65, 240, 48, 27, 12, 240, 82, 177, 53, 49, 113, 49, + 98, 49, 97, 20, 82, 65, 65, 34, 33, 34, 113, 82, + 65, 97, 177, 183, 240, 160, 40, 11, 240, 65, 130, 17, + 129, 17, 21, 33, 17, 81, 33, 17, 65, 49, 17, 65, + 19, 17, 50, 49, 17, 33, 33, 33, 17, 17, 65, 17, + 17, 129, 17, 129, 17, 129, 17, 129, 17, 192, 19, 14, + 240, 248, 177, 193, 163, 20, 81, 189, 113, 152, 209, 104, + 113, 216, 240, 240, 16, 23, 14, 240, 248, 177, 193, 163, + 20, 81, 189, 113, 145, 49, 18, 113, 81, 119, 113, 81, + 119, 113, 240, 144, 18, 13, 240, 215, 177, 177, 162, 19, + 67, 97, 252, 240, 24, 193, 193, 193, 240, 224, 39, 12, + 240, 82, 130, 33, 35, 49, 33, 129, 33, 21, 33, 33, + 65, 49, 33, 65, 19, 33, 50, 49, 33, 33, 33, 33, + 33, 17, 65, 17, 33, 129, 33, 129, 33, 129, 33, 177, + 208, 26, 11, 240, 49, 178, 161, 23, 33, 33, 113, 33, + 113, 38, 33, 33, 113, 33, 113, 33, 38, 35, 81, 161, + 161, 161, 192, 22, 12, 240, 66, 193, 38, 49, 49, 113, + 53, 49, 49, 113, 57, 240, 39, 177, 72, 81, 184, 240, + 160, 25, 11, 240, 51, 161, 23, 33, 81, 65, 49, 33, + 49, 49, 33, 49, 49, 33, 49, 26, 232, 161, 161, 161, + 161, 192, 29, 14, 240, 99, 99, 65, 71, 33, 99, 65, + 81, 49, 49, 81, 49, 52, 33, 49, 49, 99, 65, 119, + 209, 104, 113, 216, 240, 240, 16, 31, 14, 240, 99, 99, + 65, 209, 71, 33, 99, 65, 81, 49, 52, 33, 49, 49, + 81, 49, 49, 99, 65, 119, 113, 81, 113, 81, 119, 113, + 240, 144, 32, 14, 240, 114, 100, 49, 209, 72, 17, 100, + 49, 81, 65, 33, 81, 65, 36, 49, 33, 49, 114, 65, + 113, 36, 67, 18, 49, 209, 209, 240, 240, 32, 29, 14, + 240, 114, 115, 49, 87, 17, 115, 49, 97, 49, 33, 97, + 49, 33, 113, 17, 52, 81, 65, 74, 209, 129, 209, 215, + 240, 240, 16, 22, 13, 240, 244, 240, 74, 100, 130, 34, + 113, 65, 114, 34, 133, 129, 49, 129, 49, 76, 240, 240, + 160, 21, 13, 240, 244, 106, 100, 130, 34, 113, 65, 114, + 34, 132, 92, 113, 193, 193, 193, 193, 240, 64, 9, 3, + 240, 50, 18, 33, 17, 240, 80, 8, 3, 194, 18, 162, + 18, 240, 16, +}; + +tFont *g_psFontWCustomr14pt = (tFont *)g_pui8Customr14pt; diff --git a/third_party/fonts/lang_demo/fontcustomr20pt.c b/third_party/fonts/lang_demo/fontcustomr20pt.c new file mode 100644 index 0000000..9fb5dde --- /dev/null +++ b/third_party/fonts/lang_demo/fontcustomr20pt.c @@ -0,0 +1,1455 @@ +//***************************************************************************** +// +// fontcustomr20pt.c - Font definition for the 20ptpt Customr font. +// +// Copyright (c) 2011 Texas Instruments Incorporated. All rights reserved. +// TI Information - Selective Disclosure +// +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 323 in 305 blocks +// Style: customr +// Size: 20pt +// Bold: no +// Italic: no +// Memory usage: 13924 bytes +// Glyphs remapped. Custom codepage 0x8000. +// +//***************************************************************************** + +const uint8_t g_pui8Customr20pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 18, + + // + // The height of the font. + // + 23, + + // + // The baseline of the font. + // + 18, + + // + // The font codepage (CUSTOM). + // + 0, 128, + + // + // The number of blocks of characters (1). + // + 1, 0, + + // + // Block header 1: Codepoints 0x0001 - 0x143 + // + 0x01, 0x00, 0x00, 0x00, + 0x43, 0x01, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x00, + + // + // Block 1 Offsets: Codepoints 0x0001 - 0x143 + // + 0x0c, 0x05, 0x00, 0x00, // Offset 1292 (0x50c) + 0x11, 0x05, 0x00, 0x00, // Offset 1297 (0x511) + 0x26, 0x05, 0x00, 0x00, // Offset 1318 (0x526) + 0x40, 0x05, 0x00, 0x00, // Offset 1344 (0x540) + 0x50, 0x05, 0x00, 0x00, // Offset 1360 (0x550) + 0x6b, 0x05, 0x00, 0x00, // Offset 1387 (0x56b) + 0x80, 0x05, 0x00, 0x00, // Offset 1408 (0x580) + 0x93, 0x05, 0x00, 0x00, // Offset 1427 (0x593) + 0xac, 0x05, 0x00, 0x00, // Offset 1452 (0x5ac) + 0xc0, 0x05, 0x00, 0x00, // Offset 1472 (0x5c0) + 0xd2, 0x05, 0x00, 0x00, // Offset 1490 (0x5d2) + 0xf1, 0x05, 0x00, 0x00, // Offset 1521 (0x5f1) + 0x0c, 0x06, 0x00, 0x00, // Offset 1548 (0x60c) + 0x1f, 0x06, 0x00, 0x00, // Offset 1567 (0x61f) + 0x3e, 0x06, 0x00, 0x00, // Offset 1598 (0x63e) + 0x5e, 0x06, 0x00, 0x00, // Offset 1630 (0x65e) + 0x7b, 0x06, 0x00, 0x00, // Offset 1659 (0x67b) + 0xa0, 0x06, 0x00, 0x00, // Offset 1696 (0x6a0) + 0xb5, 0x06, 0x00, 0x00, // Offset 1717 (0x6b5) + 0xbd, 0x06, 0x00, 0x00, // Offset 1725 (0x6bd) + 0xd4, 0x06, 0x00, 0x00, // Offset 1748 (0x6d4) + 0xf3, 0x06, 0x00, 0x00, // Offset 1779 (0x6f3) + 0x12, 0x07, 0x00, 0x00, // Offset 1810 (0x712) + 0x33, 0x07, 0x00, 0x00, // Offset 1843 (0x733) + 0x3c, 0x07, 0x00, 0x00, // Offset 1852 (0x73c) + 0x51, 0x07, 0x00, 0x00, // Offset 1873 (0x751) + 0x62, 0x07, 0x00, 0x00, // Offset 1890 (0x762) + 0x69, 0x07, 0x00, 0x00, // Offset 1897 (0x769) + 0x7e, 0x07, 0x00, 0x00, // Offset 1918 (0x77e) + 0xa4, 0x07, 0x00, 0x00, // Offset 1956 (0x7a4) + 0xb3, 0x07, 0x00, 0x00, // Offset 1971 (0x7b3) + 0xca, 0x07, 0x00, 0x00, // Offset 1994 (0x7ca) + 0xe1, 0x07, 0x00, 0x00, // Offset 2017 (0x7e1) + 0x01, 0x08, 0x00, 0x00, // Offset 2049 (0x801) + 0x16, 0x08, 0x00, 0x00, // Offset 2070 (0x816) + 0x4a, 0x08, 0x00, 0x00, // Offset 2122 (0x84a) + 0x6b, 0x08, 0x00, 0x00, // Offset 2155 (0x86b) + 0x80, 0x08, 0x00, 0x00, // Offset 2176 (0x880) + 0x98, 0x08, 0x00, 0x00, // Offset 2200 (0x898) + 0xb9, 0x08, 0x00, 0x00, // Offset 2233 (0x8b9) + 0xd6, 0x08, 0x00, 0x00, // Offset 2262 (0x8d6) + 0xfd, 0x08, 0x00, 0x00, // Offset 2301 (0x8fd) + 0x15, 0x09, 0x00, 0x00, // Offset 2325 (0x915) + 0x33, 0x09, 0x00, 0x00, // Offset 2355 (0x933) + 0x4a, 0x09, 0x00, 0x00, // Offset 2378 (0x94a) + 0x71, 0x09, 0x00, 0x00, // Offset 2417 (0x971) + 0x99, 0x09, 0x00, 0x00, // Offset 2457 (0x999) + 0xb0, 0x09, 0x00, 0x00, // Offset 2480 (0x9b0) + 0xca, 0x09, 0x00, 0x00, // Offset 2506 (0x9ca) + 0xe8, 0x09, 0x00, 0x00, // Offset 2536 (0x9e8) + 0xfd, 0x09, 0x00, 0x00, // Offset 2557 (0x9fd) + 0x1a, 0x0a, 0x00, 0x00, // Offset 2586 (0xa1a) + 0x2e, 0x0a, 0x00, 0x00, // Offset 2606 (0xa2e) + 0x57, 0x0a, 0x00, 0x00, // Offset 2647 (0xa57) + 0x78, 0x0a, 0x00, 0x00, // Offset 2680 (0xa78) + 0x7f, 0x0a, 0x00, 0x00, // Offset 2687 (0xa7f) + 0x9f, 0x0a, 0x00, 0x00, // Offset 2719 (0xa9f) + 0xbd, 0x0a, 0x00, 0x00, // Offset 2749 (0xabd) + 0xc8, 0x0a, 0x00, 0x00, // Offset 2760 (0xac8) + 0xd7, 0x0a, 0x00, 0x00, // Offset 2775 (0xad7) + 0xff, 0x0a, 0x00, 0x00, // Offset 2815 (0xaff) + 0x2e, 0x0b, 0x00, 0x00, // Offset 2862 (0xb2e) + 0x68, 0x0b, 0x00, 0x00, // Offset 2920 (0xb68) + 0x8d, 0x0b, 0x00, 0x00, // Offset 2957 (0xb8d) + 0xbf, 0x0b, 0x00, 0x00, // Offset 3007 (0xbbf) + 0xfc, 0x0b, 0x00, 0x00, // Offset 3068 (0xbfc) + 0x22, 0x0c, 0x00, 0x00, // Offset 3106 (0xc22) + 0x51, 0x0c, 0x00, 0x00, // Offset 3153 (0xc51) + 0x88, 0x0c, 0x00, 0x00, // Offset 3208 (0xc88) + 0xac, 0x0c, 0x00, 0x00, // Offset 3244 (0xcac) + 0xf2, 0x0c, 0x00, 0x00, // Offset 3314 (0xcf2) + 0x20, 0x0d, 0x00, 0x00, // Offset 3360 (0xd20) + 0x44, 0x0d, 0x00, 0x00, // Offset 3396 (0xd44) + 0x5c, 0x0d, 0x00, 0x00, // Offset 3420 (0xd5c) + 0x7e, 0x0d, 0x00, 0x00, // Offset 3454 (0xd7e) + 0xa6, 0x0d, 0x00, 0x00, // Offset 3494 (0xda6) + 0xc9, 0x0d, 0x00, 0x00, // Offset 3529 (0xdc9) + 0xe1, 0x0d, 0x00, 0x00, // Offset 3553 (0xde1) + 0x03, 0x0e, 0x00, 0x00, // Offset 3587 (0xe03) + 0x0d, 0x0e, 0x00, 0x00, // Offset 3597 (0xe0d) + 0x2c, 0x0e, 0x00, 0x00, // Offset 3628 (0xe2c) + 0x48, 0x0e, 0x00, 0x00, // Offset 3656 (0xe48) + 0x64, 0x0e, 0x00, 0x00, // Offset 3684 (0xe64) + 0x6e, 0x0e, 0x00, 0x00, // Offset 3694 (0xe6e) + 0xa8, 0x0e, 0x00, 0x00, // Offset 3752 (0xea8) + 0xd4, 0x0e, 0x00, 0x00, // Offset 3796 (0xed4) + 0xde, 0x0e, 0x00, 0x00, // Offset 3806 (0xede) + 0x08, 0x0f, 0x00, 0x00, // Offset 3848 (0xf08) + 0x25, 0x0f, 0x00, 0x00, // Offset 3877 (0xf25) + 0x37, 0x0f, 0x00, 0x00, // Offset 3895 (0xf37) + 0x4f, 0x0f, 0x00, 0x00, // Offset 3919 (0xf4f) + 0x67, 0x0f, 0x00, 0x00, // Offset 3943 (0xf67) + 0x82, 0x0f, 0x00, 0x00, // Offset 3970 (0xf82) + 0x97, 0x0f, 0x00, 0x00, // Offset 3991 (0xf97) + 0xad, 0x0f, 0x00, 0x00, // Offset 4013 (0xfad) + 0xbf, 0x0f, 0x00, 0x00, // Offset 4031 (0xfbf) + 0xdd, 0x0f, 0x00, 0x00, // Offset 4061 (0xfdd) + 0xf1, 0x0f, 0x00, 0x00, // Offset 4081 (0xff1) + 0x1a, 0x10, 0x00, 0x00, // Offset 4122 (0x101a) + 0x58, 0x10, 0x00, 0x00, // Offset 4184 (0x1058) + 0x8f, 0x10, 0x00, 0x00, // Offset 4239 (0x108f) + 0xc4, 0x10, 0x00, 0x00, // Offset 4292 (0x10c4) + 0xfe, 0x10, 0x00, 0x00, // Offset 4350 (0x10fe) + 0x23, 0x11, 0x00, 0x00, // Offset 4387 (0x1123) + 0x43, 0x11, 0x00, 0x00, // Offset 4419 (0x1143) + 0x6c, 0x11, 0x00, 0x00, // Offset 4460 (0x116c) + 0x90, 0x11, 0x00, 0x00, // Offset 4496 (0x1190) + 0xb8, 0x11, 0x00, 0x00, // Offset 4536 (0x11b8) + 0xd2, 0x11, 0x00, 0x00, // Offset 4562 (0x11d2) + 0xf3, 0x11, 0x00, 0x00, // Offset 4595 (0x11f3) + 0x0d, 0x12, 0x00, 0x00, // Offset 4621 (0x120d) + 0x2a, 0x12, 0x00, 0x00, // Offset 4650 (0x122a) + 0x49, 0x12, 0x00, 0x00, // Offset 4681 (0x1249) + 0x79, 0x12, 0x00, 0x00, // Offset 4729 (0x1279) + 0x9a, 0x12, 0x00, 0x00, // Offset 4762 (0x129a) + 0xba, 0x12, 0x00, 0x00, // Offset 4794 (0x12ba) + 0xd4, 0x12, 0x00, 0x00, // Offset 4820 (0x12d4) + 0xf1, 0x12, 0x00, 0x00, // Offset 4849 (0x12f1) + 0x1e, 0x13, 0x00, 0x00, // Offset 4894 (0x131e) + 0x35, 0x13, 0x00, 0x00, // Offset 4917 (0x1335) + 0x4e, 0x13, 0x00, 0x00, // Offset 4942 (0x134e) + 0x64, 0x13, 0x00, 0x00, // Offset 4964 (0x1364) + 0x7f, 0x13, 0x00, 0x00, // Offset 4991 (0x137f) + 0x94, 0x13, 0x00, 0x00, // Offset 5012 (0x1394) + 0xa9, 0x13, 0x00, 0x00, // Offset 5033 (0x13a9) + 0xc6, 0x13, 0x00, 0x00, // Offset 5062 (0x13c6) + 0xe6, 0x13, 0x00, 0x00, // Offset 5094 (0x13e6) + 0x06, 0x14, 0x00, 0x00, // Offset 5126 (0x1406) + 0x28, 0x14, 0x00, 0x00, // Offset 5160 (0x1428) + 0x52, 0x14, 0x00, 0x00, // Offset 5202 (0x1452) + 0x90, 0x14, 0x00, 0x00, // Offset 5264 (0x1490) + 0xcb, 0x14, 0x00, 0x00, // Offset 5323 (0x14cb) + 0xf9, 0x14, 0x00, 0x00, // Offset 5369 (0x14f9) + 0x24, 0x15, 0x00, 0x00, // Offset 5412 (0x1524) + 0x51, 0x15, 0x00, 0x00, // Offset 5457 (0x1551) + 0x8f, 0x15, 0x00, 0x00, // Offset 5519 (0x158f) + 0xca, 0x15, 0x00, 0x00, // Offset 5578 (0x15ca) + 0x0e, 0x16, 0x00, 0x00, // Offset 5646 (0x160e) + 0x42, 0x16, 0x00, 0x00, // Offset 5698 (0x1642) + 0x69, 0x16, 0x00, 0x00, // Offset 5737 (0x1669) + 0xa8, 0x16, 0x00, 0x00, // Offset 5800 (0x16a8) + 0xe2, 0x16, 0x00, 0x00, // Offset 5858 (0x16e2) + 0x0b, 0x17, 0x00, 0x00, // Offset 5899 (0x170b) + 0x46, 0x17, 0x00, 0x00, // Offset 5958 (0x1746) + 0x8a, 0x17, 0x00, 0x00, // Offset 6026 (0x178a) + 0xce, 0x17, 0x00, 0x00, // Offset 6094 (0x17ce) + 0x0b, 0x18, 0x00, 0x00, // Offset 6155 (0x180b) + 0x3b, 0x18, 0x00, 0x00, // Offset 6203 (0x183b) + 0x63, 0x18, 0x00, 0x00, // Offset 6243 (0x1863) + 0x83, 0x18, 0x00, 0x00, // Offset 6275 (0x1883) + 0xaa, 0x18, 0x00, 0x00, // Offset 6314 (0x18aa) + 0xcd, 0x18, 0x00, 0x00, // Offset 6349 (0x18cd) + 0x05, 0x19, 0x00, 0x00, // Offset 6405 (0x1905) + 0x2a, 0x19, 0x00, 0x00, // Offset 6442 (0x192a) + 0x4e, 0x19, 0x00, 0x00, // Offset 6478 (0x194e) + 0x77, 0x19, 0x00, 0x00, // Offset 6519 (0x1977) + 0xa1, 0x19, 0x00, 0x00, // Offset 6561 (0x19a1) + 0xc4, 0x19, 0x00, 0x00, // Offset 6596 (0x19c4) + 0xec, 0x19, 0x00, 0x00, // Offset 6636 (0x19ec) + 0x1a, 0x1a, 0x00, 0x00, // Offset 6682 (0x1a1a) + 0x44, 0x1a, 0x00, 0x00, // Offset 6724 (0x1a44) + 0x6c, 0x1a, 0x00, 0x00, // Offset 6764 (0x1a6c) + 0x9c, 0x1a, 0x00, 0x00, // Offset 6812 (0x1a9c) + 0xbf, 0x1a, 0x00, 0x00, // Offset 6847 (0x1abf) + 0xf1, 0x1a, 0x00, 0x00, // Offset 6897 (0x1af1) + 0x1a, 0x1b, 0x00, 0x00, // Offset 6938 (0x1b1a) + 0x3a, 0x1b, 0x00, 0x00, // Offset 6970 (0x1b3a) + 0x72, 0x1b, 0x00, 0x00, // Offset 7026 (0x1b72) + 0x8c, 0x1b, 0x00, 0x00, // Offset 7052 (0x1b8c) + 0xbb, 0x1b, 0x00, 0x00, // Offset 7099 (0x1bbb) + 0xdc, 0x1b, 0x00, 0x00, // Offset 7132 (0x1bdc) + 0xfe, 0x1b, 0x00, 0x00, // Offset 7166 (0x1bfe) + 0x19, 0x1c, 0x00, 0x00, // Offset 7193 (0x1c19) + 0x30, 0x1c, 0x00, 0x00, // Offset 7216 (0x1c30) + 0x47, 0x1c, 0x00, 0x00, // Offset 7239 (0x1c47) + 0x64, 0x1c, 0x00, 0x00, // Offset 7268 (0x1c64) + 0x84, 0x1c, 0x00, 0x00, // Offset 7300 (0x1c84) + 0xa2, 0x1c, 0x00, 0x00, // Offset 7330 (0x1ca2) + 0xbc, 0x1c, 0x00, 0x00, // Offset 7356 (0x1cbc) + 0xca, 0x1c, 0x00, 0x00, // Offset 7370 (0x1cca) + 0xd8, 0x1c, 0x00, 0x00, // Offset 7384 (0x1cd8) + 0xef, 0x1c, 0x00, 0x00, // Offset 7407 (0x1cef) + 0x0b, 0x1d, 0x00, 0x00, // Offset 7435 (0x1d0b) + 0x27, 0x1d, 0x00, 0x00, // Offset 7463 (0x1d27) + 0x4c, 0x1d, 0x00, 0x00, // Offset 7500 (0x1d4c) + 0x6f, 0x1d, 0x00, 0x00, // Offset 7535 (0x1d6f) + 0x9c, 0x1d, 0x00, 0x00, // Offset 7580 (0x1d9c) + 0xb8, 0x1d, 0x00, 0x00, // Offset 7608 (0x1db8) + 0xdc, 0x1d, 0x00, 0x00, // Offset 7644 (0x1ddc) + 0xf5, 0x1d, 0x00, 0x00, // Offset 7669 (0x1df5) + 0x06, 0x1e, 0x00, 0x00, // Offset 7686 (0x1e06) + 0x1e, 0x1e, 0x00, 0x00, // Offset 7710 (0x1e1e) + 0x3a, 0x1e, 0x00, 0x00, // Offset 7738 (0x1e3a) + 0x55, 0x1e, 0x00, 0x00, // Offset 7765 (0x1e55) + 0x72, 0x1e, 0x00, 0x00, // Offset 7794 (0x1e72) + 0x8c, 0x1e, 0x00, 0x00, // Offset 7820 (0x1e8c) + 0xa2, 0x1e, 0x00, 0x00, // Offset 7842 (0x1ea2) + 0xb8, 0x1e, 0x00, 0x00, // Offset 7864 (0x1eb8) + 0xce, 0x1e, 0x00, 0x00, // Offset 7886 (0x1ece) + 0xe8, 0x1e, 0x00, 0x00, // Offset 7912 (0x1ee8) + 0x0b, 0x1f, 0x00, 0x00, // Offset 7947 (0x1f0b) + 0x22, 0x1f, 0x00, 0x00, // Offset 7970 (0x1f22) + 0x31, 0x1f, 0x00, 0x00, // Offset 7985 (0x1f31) + 0x41, 0x1f, 0x00, 0x00, // Offset 8001 (0x1f41) + 0x50, 0x1f, 0x00, 0x00, // Offset 8016 (0x1f50) + 0x77, 0x1f, 0x00, 0x00, // Offset 8055 (0x1f77) + 0xa0, 0x1f, 0x00, 0x00, // Offset 8096 (0x1fa0) + 0xd0, 0x1f, 0x00, 0x00, // Offset 8144 (0x1fd0) + 0x04, 0x20, 0x00, 0x00, // Offset 8196 (0x2004) + 0x36, 0x20, 0x00, 0x00, // Offset 8246 (0x2036) + 0x6c, 0x20, 0x00, 0x00, // Offset 8300 (0x206c) + 0x98, 0x20, 0x00, 0x00, // Offset 8344 (0x2098) + 0xca, 0x20, 0x00, 0x00, // Offset 8394 (0x20ca) + 0x0f, 0x21, 0x00, 0x00, // Offset 8463 (0x210f) + 0x3f, 0x21, 0x00, 0x00, // Offset 8511 (0x213f) + 0x6a, 0x21, 0x00, 0x00, // Offset 8554 (0x216a) + 0xa4, 0x21, 0x00, 0x00, // Offset 8612 (0x21a4) + 0xea, 0x21, 0x00, 0x00, // Offset 8682 (0x21ea) + 0x2d, 0x22, 0x00, 0x00, // Offset 8749 (0x222d) + 0x73, 0x22, 0x00, 0x00, // Offset 8819 (0x2273) + 0xb1, 0x22, 0x00, 0x00, // Offset 8881 (0x22b1) + 0xe0, 0x22, 0x00, 0x00, // Offset 8928 (0x22e0) + 0x1e, 0x23, 0x00, 0x00, // Offset 8990 (0x231e) + 0x69, 0x23, 0x00, 0x00, // Offset 9065 (0x2369) + 0xa4, 0x23, 0x00, 0x00, // Offset 9124 (0x23a4) + 0xd4, 0x23, 0x00, 0x00, // Offset 9172 (0x23d4) + 0x19, 0x24, 0x00, 0x00, // Offset 9241 (0x2419) + 0x48, 0x24, 0x00, 0x00, // Offset 9288 (0x2448) + 0x86, 0x24, 0x00, 0x00, // Offset 9350 (0x2486) + 0xbe, 0x24, 0x00, 0x00, // Offset 9406 (0x24be) + 0xf0, 0x24, 0x00, 0x00, // Offset 9456 (0x24f0) + 0x21, 0x25, 0x00, 0x00, // Offset 9505 (0x2521) + 0x58, 0x25, 0x00, 0x00, // Offset 9560 (0x2558) + 0x96, 0x25, 0x00, 0x00, // Offset 9622 (0x2596) + 0xce, 0x25, 0x00, 0x00, // Offset 9678 (0x25ce) + 0x09, 0x26, 0x00, 0x00, // Offset 9737 (0x2609) + 0x47, 0x26, 0x00, 0x00, // Offset 9799 (0x2647) + 0x75, 0x26, 0x00, 0x00, // Offset 9845 (0x2675) + 0xb4, 0x26, 0x00, 0x00, // Offset 9908 (0x26b4) + 0xef, 0x26, 0x00, 0x00, // Offset 9967 (0x26ef) + 0x32, 0x27, 0x00, 0x00, // Offset 10034 (0x2732) + 0x66, 0x27, 0x00, 0x00, // Offset 10086 (0x2766) + 0xa9, 0x27, 0x00, 0x00, // Offset 10153 (0x27a9) + 0xef, 0x27, 0x00, 0x00, // Offset 10223 (0x27ef) + 0x1a, 0x28, 0x00, 0x00, // Offset 10266 (0x281a) + 0x60, 0x28, 0x00, 0x00, // Offset 10336 (0x2860) + 0x8a, 0x28, 0x00, 0x00, // Offset 10378 (0x288a) + 0xbc, 0x28, 0x00, 0x00, // Offset 10428 (0x28bc) + 0xef, 0x28, 0x00, 0x00, // Offset 10479 (0x28ef) + 0x32, 0x29, 0x00, 0x00, // Offset 10546 (0x2932) + 0x8c, 0x29, 0x00, 0x00, // Offset 10636 (0x298c) + 0xc6, 0x29, 0x00, 0x00, // Offset 10694 (0x29c6) + 0x02, 0x2a, 0x00, 0x00, // Offset 10754 (0x2a02) + 0x3e, 0x2a, 0x00, 0x00, // Offset 10814 (0x2a3e) + 0x84, 0x2a, 0x00, 0x00, // Offset 10884 (0x2a84) + 0xc1, 0x2a, 0x00, 0x00, // Offset 10945 (0x2ac1) + 0x02, 0x2b, 0x00, 0x00, // Offset 11010 (0x2b02) + 0x2d, 0x2b, 0x00, 0x00, // Offset 11053 (0x2b2d) + 0x65, 0x2b, 0x00, 0x00, // Offset 11109 (0x2b65) + 0x96, 0x2b, 0x00, 0x00, // Offset 11158 (0x2b96) + 0xcd, 0x2b, 0x00, 0x00, // Offset 11213 (0x2bcd) + 0x0a, 0x2c, 0x00, 0x00, // Offset 11274 (0x2c0a) + 0x4a, 0x2c, 0x00, 0x00, // Offset 11338 (0x2c4a) + 0x83, 0x2c, 0x00, 0x00, // Offset 11395 (0x2c83) + 0xc0, 0x2c, 0x00, 0x00, // Offset 11456 (0x2cc0) + 0xec, 0x2c, 0x00, 0x00, // Offset 11500 (0x2cec) + 0x13, 0x2d, 0x00, 0x00, // Offset 11539 (0x2d13) + 0x49, 0x2d, 0x00, 0x00, // Offset 11593 (0x2d49) + 0x75, 0x2d, 0x00, 0x00, // Offset 11637 (0x2d75) + 0xab, 0x2d, 0x00, 0x00, // Offset 11691 (0x2dab) + 0xcf, 0x2d, 0x00, 0x00, // Offset 11727 (0x2dcf) + 0xf3, 0x2d, 0x00, 0x00, // Offset 11763 (0x2df3) + 0x30, 0x2e, 0x00, 0x00, // Offset 11824 (0x2e30) + 0x57, 0x2e, 0x00, 0x00, // Offset 11863 (0x2e57) + 0x7d, 0x2e, 0x00, 0x00, // Offset 11901 (0x2e7d) + 0xa1, 0x2e, 0x00, 0x00, // Offset 11937 (0x2ea1) + 0xcb, 0x2e, 0x00, 0x00, // Offset 11979 (0x2ecb) + 0x01, 0x2f, 0x00, 0x00, // Offset 12033 (0x2f01) + 0x26, 0x2f, 0x00, 0x00, // Offset 12070 (0x2f26) + 0x4d, 0x2f, 0x00, 0x00, // Offset 12109 (0x2f4d) + 0x78, 0x2f, 0x00, 0x00, // Offset 12152 (0x2f78) + 0xaf, 0x2f, 0x00, 0x00, // Offset 12207 (0x2faf) + 0xde, 0x2f, 0x00, 0x00, // Offset 12254 (0x2fde) + 0xfb, 0x2f, 0x00, 0x00, // Offset 12283 (0x2ffb) + 0x1f, 0x30, 0x00, 0x00, // Offset 12319 (0x301f) + 0x39, 0x30, 0x00, 0x00, // Offset 12345 (0x3039) + 0x69, 0x30, 0x00, 0x00, // Offset 12393 (0x3069) + 0x8f, 0x30, 0x00, 0x00, // Offset 12431 (0x308f) + 0xbd, 0x30, 0x00, 0x00, // Offset 12477 (0x30bd) + 0xe5, 0x30, 0x00, 0x00, // Offset 12517 (0x30e5) + 0x01, 0x31, 0x00, 0x00, // Offset 12545 (0x3101) + 0x32, 0x31, 0x00, 0x00, // Offset 12594 (0x3132) + 0x6c, 0x31, 0x00, 0x00, // Offset 12652 (0x316c) + 0x96, 0x31, 0x00, 0x00, // Offset 12694 (0x3196) + 0xc0, 0x31, 0x00, 0x00, // Offset 12736 (0x31c0) + 0xef, 0x31, 0x00, 0x00, // Offset 12783 (0x31ef) + 0x26, 0x32, 0x00, 0x00, // Offset 12838 (0x3226) + 0x47, 0x32, 0x00, 0x00, // Offset 12871 (0x3247) + 0x6f, 0x32, 0x00, 0x00, // Offset 12911 (0x326f) + 0x9d, 0x32, 0x00, 0x00, // Offset 12957 (0x329d) + 0xdd, 0x32, 0x00, 0x00, // Offset 13021 (0x32dd) + 0x06, 0x33, 0x00, 0x00, // Offset 13062 (0x3306) + 0x21, 0x33, 0x00, 0x00, // Offset 13089 (0x3321) + 0x45, 0x33, 0x00, 0x00, // Offset 13125 (0x3345) + 0x6b, 0x33, 0x00, 0x00, // Offset 13163 (0x336b) + 0x9a, 0x33, 0x00, 0x00, // Offset 13210 (0x339a) + 0xc5, 0x33, 0x00, 0x00, // Offset 13253 (0x33c5) + 0xf1, 0x33, 0x00, 0x00, // Offset 13297 (0x33f1) + 0x29, 0x34, 0x00, 0x00, // Offset 13353 (0x3429) + 0x4c, 0x34, 0x00, 0x00, // Offset 13388 (0x344c) + 0x72, 0x34, 0x00, 0x00, // Offset 13426 (0x3472) + 0x96, 0x34, 0x00, 0x00, // Offset 13462 (0x3496) + 0xd1, 0x34, 0x00, 0x00, // Offset 13521 (0x34d1) + 0xf5, 0x34, 0x00, 0x00, // Offset 13557 (0x34f5) + 0x16, 0x35, 0x00, 0x00, // Offset 13590 (0x3516) + 0x3f, 0x35, 0x00, 0x00, // Offset 13631 (0x353f) + 0x69, 0x35, 0x00, 0x00, // Offset 13673 (0x3569) + 0x94, 0x35, 0x00, 0x00, // Offset 13716 (0x3594) + 0xc4, 0x35, 0x00, 0x00, // Offset 13764 (0x35c4) + 0xf0, 0x35, 0x00, 0x00, // Offset 13808 (0x35f0) + 0x11, 0x36, 0x00, 0x00, // Offset 13841 (0x3611) + 0x37, 0x36, 0x00, 0x00, // Offset 13879 (0x3637) + 0x44, 0x36, 0x00, 0x00, // Offset 13892 (0x3644) + + // + // Block 1 Data: Codepoints 1 - 0x143 + // + 5, 9, 0, 25, 112, 21, 11, 0, 11, 52, 82, 50, + 65, 82, 34, 82, 41, 34, 146, 162, 146, 81, 86, 0, + 7, 16, 26, 12, 0, 12, 54, 82, 50, 66, 66, 50, + 82, 50, 82, 50, 82, 50, 82, 50, 67, 66, 36, 83, + 50, 0, 7, 96, 16, 4, 240, 18, 226, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 240, 112, 27, 11, 0, 11, + 2, 21, 52, 34, 51, 66, 34, 82, 34, 82, 34, 82, + 34, 82, 34, 82, 34, 82, 34, 82, 0, 7, 16, 21, + 9, 0, 5, 114, 114, 114, 87, 66, 114, 114, 114, 114, + 114, 114, 114, 33, 84, 0, 5, 112, 19, 4, 194, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 240, 112, 25, 11, 0, 11, 37, 82, 50, 66, 51, + 34, 82, 34, 82, 34, 82, 34, 82, 34, 66, 66, 50, + 85, 0, 7, 48, 20, 9, 0, 9, 2, 35, 34, 18, + 66, 17, 83, 99, 99, 98, 114, 114, 114, 0, 6, 64, + 18, 9, 0, 9, 37, 49, 65, 34, 115, 102, 85, 114, + 129, 34, 50, 38, 0, 6, 31, 12, 240, 240, 210, 162, + 162, 162, 162, 102, 66, 51, 66, 66, 50, 82, 50, 82, + 50, 82, 50, 82, 50, 67, 66, 36, 84, 34, 0, 7, + 96, 27, 12, 0, 12, 2, 82, 50, 82, 50, 82, 50, + 82, 50, 82, 50, 82, 50, 82, 50, 67, 51, 36, 69, + 34, 0, 7, 96, 19, 10, 0, 10, 53, 51, 49, 50, + 114, 130, 130, 130, 146, 130, 65, 85, 0, 6, 64, 31, + 11, 0, 11, 54, 50, 66, 50, 66, 34, 82, 34, 82, + 34, 82, 34, 82, 34, 67, 50, 36, 68, 18, 146, 146, + 49, 82, 50, 50, 85, 64, 32, 11, 240, 240, 50, 146, + 146, 146, 146, 146, 21, 52, 34, 51, 66, 34, 82, 34, + 82, 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, 0, + 7, 16, 29, 11, 0, 11, 2, 20, 68, 34, 51, 66, + 34, 82, 34, 82, 34, 82, 34, 82, 34, 66, 51, 50, + 55, 66, 146, 146, 146, 146, 144, 37, 16, 0, 16, 2, + 20, 36, 51, 51, 50, 34, 66, 66, 34, 66, 66, 34, + 66, 66, 34, 66, 66, 34, 66, 66, 34, 66, 66, 34, + 66, 66, 34, 66, 66, 0, 10, 32, 21, 9, 240, 244, + 66, 114, 114, 114, 86, 82, 114, 114, 114, 114, 114, 114, + 114, 114, 0, 6, 32, 8, 9, 0, 12, 55, 0, 12, + 80, 23, 10, 240, 240, 195, 100, 82, 18, 81, 34, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 88, 0, 6, 64, + 31, 11, 240, 240, 50, 146, 146, 146, 146, 146, 20, 68, + 34, 51, 66, 34, 82, 34, 82, 34, 82, 34, 82, 34, + 66, 50, 66, 54, 0, 7, 64, 31, 14, 0, 7, 67, + 179, 177, 18, 146, 18, 146, 33, 145, 50, 114, 50, 114, + 66, 97, 82, 89, 82, 98, 50, 114, 50, 129, 50, 130, + 0, 9, 33, 12, 0, 6, 52, 114, 35, 66, 66, 50, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 50, 66, 67, 35, 100, 0, 8, 16, 9, + 4, 240, 240, 162, 240, 178, 240, 112, 21, 11, 240, 240, + 232, 50, 146, 146, 146, 146, 152, 50, 146, 146, 146, 146, + 146, 153, 0, 7, 16, 17, 10, 0, 10, 8, 114, 115, + 114, 114, 115, 114, 114, 129, 136, 0, 6, 64, 7, 4, + 0, 8, 66, 240, 112, 21, 14, 0, 7, 12, 114, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 0, + 9, 80, 38, 16, 0, 16, 1, 81, 82, 34, 51, 50, + 50, 51, 50, 50, 49, 17, 50, 65, 34, 18, 33, 82, + 18, 33, 18, 82, 17, 49, 18, 99, 52, 99, 66, 114, + 82, 0, 10, 80, 15, 11, 0, 10, 2, 146, 146, 105, + 82, 146, 146, 146, 0, 11, 96, 23, 11, 240, 240, 246, + 66, 66, 49, 98, 146, 146, 146, 130, 131, 130, 130, 130, + 130, 130, 137, 0, 7, 16, 23, 12, 0, 6, 24, 66, + 162, 162, 162, 166, 97, 67, 163, 162, 162, 162, 146, 50, + 67, 70, 0, 8, 16, 32, 12, 0, 6, 52, 114, 34, + 82, 66, 66, 66, 66, 66, 82, 34, 116, 98, 66, 50, + 98, 34, 98, 34, 98, 34, 98, 50, 66, 100, 0, 8, + 16, 21, 9, 240, 240, 103, 66, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 87, 0, 5, 112, 52, 16, + 0, 8, 3, 131, 35, 131, 36, 100, 36, 100, 34, 17, + 97, 18, 34, 18, 66, 18, 34, 18, 66, 18, 34, 33, + 65, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 49, + 33, 50, 34, 52, 50, 34, 67, 50, 34, 66, 66, 0, + 10, 32, 33, 13, 0, 6, 71, 98, 67, 66, 98, 50, + 98, 50, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 98, 50, 98, 50, 67, 71, 0, 8, 112, 21, + 11, 240, 240, 226, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 153, 0, 7, 16, 24, 12, 0, 12, + 2, 98, 50, 82, 50, 66, 82, 50, 82, 49, 98, 34, + 114, 18, 116, 147, 146, 0, 8, 32, 33, 12, 0, 6, + 2, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 50, 66, 101, 0, 8, 29, 12, 0, 12, 17, 98, 50, + 82, 50, 66, 82, 50, 82, 49, 113, 34, 114, 18, 114, + 17, 147, 147, 146, 162, 161, 113, 34, 116, 128, 39, 16, + 240, 195, 241, 241, 97, 129, 68, 113, 50, 50, 81, 33, + 97, 81, 33, 113, 65, 33, 118, 33, 98, 65, 49, 67, + 65, 69, 97, 241, 241, 241, 241, 241, 241, 241, 0, 6, + 32, 24, 13, 0, 7, 6, 83, 66, 50, 178, 162, 178, + 178, 178, 178, 178, 194, 178, 113, 67, 66, 102, 0, 8, + 64, 30, 10, 240, 242, 130, 130, 130, 130, 130, 51, 34, + 35, 50, 34, 66, 18, 84, 98, 18, 82, 18, 82, 34, + 66, 50, 50, 66, 0, 6, 64, 23, 11, 0, 5, 102, + 66, 65, 50, 146, 147, 133, 118, 117, 132, 146, 146, 146, + 34, 66, 54, 0, 7, 64, 39, 14, 240, 240, 33, 225, + 209, 193, 34, 81, 36, 131, 209, 193, 18, 81, 51, 33, + 50, 49, 69, 49, 67, 97, 49, 17, 161, 33, 145, 49, + 145, 49, 145, 227, 19, 161, 0, 6, 16, 40, 16, 240, + 195, 241, 241, 97, 129, 69, 97, 50, 50, 81, 33, 113, + 65, 33, 113, 65, 33, 113, 65, 33, 113, 65, 50, 65, + 81, 69, 97, 241, 241, 241, 241, 241, 241, 241, 0, 6, + 32, 23, 11, 240, 240, 246, 66, 66, 162, 146, 131, 115, + 84, 163, 162, 146, 146, 146, 34, 66, 69, 0, 7, 64, + 26, 12, 0, 6, 98, 147, 132, 129, 18, 114, 18, 98, + 34, 97, 50, 82, 50, 66, 66, 74, 130, 162, 162, 162, + 0, 8, 30, 12, 0, 6, 69, 82, 65, 66, 161, 162, + 162, 21, 67, 66, 50, 98, 34, 98, 34, 98, 34, 98, + 50, 81, 67, 50, 100, 0, 8, 16, 21, 12, 0, 6, + 10, 147, 146, 146, 162, 146, 162, 146, 162, 146, 162, 161, + 162, 162, 0, 8, 64, 29, 12, 0, 6, 52, 98, 50, + 66, 82, 50, 98, 34, 98, 34, 98, 50, 67, 69, 18, + 162, 162, 146, 162, 65, 66, 85, 0, 8, 32, 20, 11, + 240, 240, 233, 34, 146, 146, 146, 146, 152, 50, 146, 146, + 146, 146, 146, 146, 0, 8, 41, 13, 0, 6, 66, 114, + 35, 98, 36, 82, 36, 82, 34, 18, 66, 34, 33, 66, + 34, 34, 50, 34, 50, 34, 34, 65, 34, 34, 66, 18, + 34, 84, 34, 84, 34, 99, 34, 114, 0, 8, 48, 33, + 12, 0, 6, 7, 82, 66, 66, 82, 50, 82, 50, 82, + 50, 82, 50, 66, 71, 82, 34, 98, 50, 82, 66, 66, + 66, 66, 82, 50, 98, 0, 7, 96, 7, 14, 0, 35, + 12, 240, 240, 32, 11, 0, 5, 98, 49, 65, 35, 240, + 178, 21, 52, 34, 51, 66, 34, 82, 34, 82, 34, 82, + 34, 82, 34, 82, 34, 82, 34, 82, 0, 7, 16, 30, + 11, 240, 240, 146, 130, 130, 130, 240, 69, 82, 50, 66, + 51, 34, 82, 34, 82, 34, 82, 34, 82, 34, 66, 66, + 50, 85, 0, 7, 48, 11, 6, 0, 6, 1, 98, 82, + 81, 0, 8, 64, 15, 7, 0, 7, 19, 49, 49, 33, + 49, 33, 49, 51, 0, 9, 16, 40, 17, 0, 7, 49, + 196, 19, 114, 49, 66, 66, 49, 97, 65, 65, 113, 34, + 65, 113, 33, 81, 113, 33, 65, 129, 33, 65, 129, 33, + 49, 129, 50, 33, 114, 67, 114, 195, 0, 15, 80, 47, + 18, 240, 162, 240, 17, 240, 33, 240, 33, 97, 63, 1, + 33, 97, 97, 49, 97, 97, 49, 97, 97, 49, 97, 97, + 49, 97, 97, 63, 49, 97, 97, 161, 240, 33, 240, 33, + 240, 33, 240, 33, 240, 33, 240, 33, 0, 8, 58, 17, + 240, 240, 17, 47, 33, 209, 33, 162, 17, 33, 27, 17, + 33, 97, 97, 33, 97, 97, 33, 97, 49, 33, 33, 41, + 33, 33, 97, 97, 33, 97, 97, 33, 97, 18, 49, 33, + 97, 33, 49, 33, 97, 65, 17, 33, 27, 17, 33, 209, + 47, 33, 209, 240, 17, 0, 6, 80, 37, 14, 240, 240, + 129, 60, 33, 145, 49, 145, 49, 145, 49, 145, 49, 145, + 59, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, + 145, 59, 49, 145, 49, 145, 0, 7, 48, 50, 20, 240, + 225, 240, 65, 240, 65, 240, 65, 97, 79, 2, 148, 240, + 17, 18, 240, 17, 17, 17, 225, 33, 17, 209, 49, 33, + 193, 49, 49, 161, 65, 50, 129, 81, 51, 97, 44, 65, + 113, 98, 33, 129, 240, 65, 240, 65, 0, 11, 32, 61, + 19, 240, 114, 82, 161, 97, 161, 97, 177, 33, 49, 81, + 55, 40, 33, 65, 33, 97, 49, 65, 33, 97, 49, 65, + 17, 113, 49, 65, 17, 17, 81, 54, 65, 65, 49, 65, + 66, 49, 49, 65, 81, 49, 49, 65, 145, 49, 65, 145, + 49, 65, 145, 54, 145, 49, 65, 129, 65, 164, 0, 10, + 38, 20, 0, 8, 11, 240, 49, 240, 65, 240, 65, 240, + 65, 240, 49, 127, 3, 177, 240, 65, 240, 65, 219, 240, + 65, 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, 0, + 8, 32, 47, 20, 240, 241, 240, 83, 149, 81, 240, 65, + 107, 33, 240, 65, 163, 97, 145, 49, 81, 129, 81, 69, + 65, 81, 65, 129, 81, 65, 145, 49, 81, 163, 97, 240, + 65, 163, 97, 193, 240, 65, 240, 65, 240, 73, 0, 8, + 16, 55, 20, 0, 10, 2, 98, 98, 34, 98, 98, 34, + 84, 82, 49, 84, 82, 50, 66, 17, 66, 66, 65, 34, + 50, 66, 50, 34, 50, 81, 50, 34, 49, 98, 33, 65, + 34, 98, 18, 66, 18, 113, 18, 66, 18, 113, 17, 97, + 17, 131, 99, 131, 99, 0, 13, 16, 36, 17, 240, 240, + 161, 240, 34, 240, 17, 240, 17, 240, 17, 51, 104, 84, + 65, 212, 194, 33, 193, 49, 193, 49, 193, 34, 212, 240, + 17, 241, 241, 241, 241, 0, 7, 112, 70, 20, 65, 240, + 81, 147, 113, 34, 17, 18, 105, 18, 145, 65, 49, 177, + 49, 49, 177, 33, 65, 225, 33, 17, 66, 47, 3, 113, + 81, 49, 145, 33, 33, 49, 89, 17, 49, 145, 81, 49, + 98, 17, 17, 49, 49, 97, 33, 33, 17, 65, 97, 33, + 33, 17, 65, 81, 49, 65, 65, 65, 65, 49, 81, 115, + 33, 97, 240, 65, 0, 8, 46, 20, 240, 240, 97, 63, + 3, 177, 240, 65, 65, 141, 113, 81, 65, 129, 81, 65, + 140, 129, 81, 65, 129, 81, 65, 140, 129, 81, 65, 225, + 240, 17, 17, 240, 50, 240, 36, 241, 66, 178, 118, 35, + 194, 0, 7, 112, 36, 20, 0, 6, 2, 240, 65, 97, + 63, 3, 240, 240, 81, 171, 240, 240, 129, 171, 240, 240, + 129, 171, 145, 129, 161, 129, 161, 129, 170, 161, 129, 161, + 129, 0, 8, 32, 24, 13, 0, 6, 66, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 129, 49, 113, 65, 97, 81, + 66, 116, 0, 9, 34, 17, 0, 9, 70, 49, 37, 18, + 114, 81, 66, 145, 65, 17, 129, 97, 145, 97, 129, 240, + 17, 240, 17, 240, 17, 240, 18, 240, 18, 240, 35, 0, + 13, 64, 40, 17, 0, 8, 97, 114, 113, 114, 113, 113, + 129, 33, 68, 65, 69, 113, 129, 113, 129, 113, 129, 97, + 145, 97, 17, 113, 98, 70, 97, 49, 68, 65, 49, 65, + 34, 49, 68, 0, 11, 64, 35, 13, 0, 6, 81, 67, + 100, 18, 161, 177, 177, 177, 20, 99, 65, 66, 113, 34, + 129, 33, 145, 83, 65, 65, 49, 49, 65, 65, 17, 82, + 50, 131, 0, 7, 32, 24, 13, 240, 240, 177, 35, 130, + 240, 98, 24, 50, 98, 177, 193, 193, 177, 178, 177, 162, + 161, 162, 0, 10, 112, 34, 19, 240, 240, 186, 240, 49, + 240, 49, 154, 161, 240, 49, 240, 58, 240, 159, 2, 240, + 240, 234, 240, 33, 240, 49, 155, 145, 240, 49, 240, 58, + 0, 7, 96, 10, 5, 0, 10, 3, 65, 50, 34, 240, + 48, 31, 12, 0, 6, 7, 82, 67, 50, 82, 50, 82, + 50, 82, 50, 66, 71, 82, 82, 50, 98, 34, 98, 34, + 98, 34, 98, 34, 82, 56, 0, 8, 28, 14, 0, 7, + 71, 83, 67, 50, 194, 178, 194, 194, 194, 70, 34, 130, + 34, 130, 50, 114, 50, 114, 67, 67, 102, 0, 9, 32, + 28, 14, 0, 6, 2, 209, 209, 97, 101, 55, 209, 113, + 81, 19, 72, 177, 209, 209, 136, 81, 81, 34, 50, 50, + 133, 0, 9, 80, 10, 18, 0, 20, 33, 240, 63, 0, + 27, 32, 58, 20, 240, 129, 113, 177, 129, 161, 129, 161, + 17, 42, 40, 129, 97, 49, 50, 33, 113, 113, 177, 33, + 65, 179, 65, 82, 81, 44, 51, 97, 49, 82, 17, 81, + 65, 129, 81, 49, 145, 65, 65, 145, 82, 17, 161, 115, + 145, 98, 34, 113, 81, 82, 67, 20, 113, 0, 7, 112, + 44, 19, 240, 211, 240, 65, 240, 49, 240, 49, 105, 49, + 113, 161, 113, 161, 113, 161, 113, 165, 49, 161, 113, 146, + 113, 84, 17, 118, 81, 240, 49, 240, 49, 240, 49, 240, + 49, 240, 49, 240, 49, 0, 7, 112, 10, 4, 194, 34, + 34, 34, 34, 0, 7, 96, 42, 16, 0, 6, 65, 114, + 113, 81, 17, 113, 97, 129, 97, 113, 97, 65, 22, 65, + 50, 17, 65, 65, 81, 65, 65, 65, 65, 51, 65, 65, + 81, 49, 81, 145, 81, 129, 49, 17, 225, 0, 13, 32, + 29, 12, 240, 195, 177, 177, 18, 49, 67, 84, 17, 177, + 18, 49, 66, 100, 17, 193, 100, 17, 81, 66, 65, 177, + 178, 184, 0, 9, 32, 18, 13, 0, 6, 81, 216, 146, + 161, 177, 0, 6, 1, 177, 193, 193, 218, 0, 10, 24, + 16, 0, 9, 6, 33, 37, 18, 98, 81, 225, 225, 241, + 225, 241, 241, 241, 242, 242, 240, 19, 0, 12, 80, 24, + 13, 240, 240, 178, 194, 177, 193, 193, 81, 97, 82, 86, + 115, 145, 177, 177, 193, 193, 209, 216, 0, 8, 64, 27, + 15, 0, 7, 97, 225, 49, 51, 49, 84, 81, 225, 209, + 225, 225, 17, 194, 210, 49, 146, 65, 130, 86, 49, 0, + 12, 112, 21, 9, 0, 7, 65, 114, 113, 113, 114, 97, + 17, 66, 33, 129, 129, 129, 129, 129, 0, 6, 16, 22, + 14, 0, 7, 115, 101, 240, 240, 152, 36, 33, 209, 209, + 193, 209, 193, 209, 193, 178, 0, 10, 16, 18, 12, 0, + 9, 10, 162, 161, 177, 162, 161, 161, 162, 146, 145, 146, + 0, 10, 16, 30, 9, 240, 240, 34, 33, 81, 33, 81, + 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, + 113, 129, 113, 129, 113, 98, 0, 6, 48, 20, 13, 0, + 8, 33, 209, 193, 113, 177, 177, 177, 177, 177, 177, 177, + 147, 162, 0, 11, 16, 41, 19, 240, 240, 49, 110, 81, + 49, 49, 49, 97, 49, 49, 49, 109, 97, 81, 81, 193, + 97, 63, 2, 161, 235, 129, 129, 154, 145, 129, 154, 145, + 129, 154, 145, 129, 33, 47, 2, 0, 9, 96, 62, 21, + 240, 240, 242, 97, 65, 113, 49, 49, 50, 97, 81, 33, + 33, 98, 23, 19, 115, 129, 81, 161, 49, 81, 87, 39, + 81, 65, 241, 65, 49, 182, 49, 65, 97, 65, 49, 50, + 97, 65, 49, 33, 134, 51, 145, 65, 49, 177, 65, 49, + 81, 81, 65, 49, 82, 65, 35, 55, 145, 0, 9, 80, + 55, 20, 240, 129, 178, 113, 57, 113, 97, 225, 65, 135, + 65, 49, 145, 41, 69, 81, 49, 225, 65, 145, 65, 65, + 17, 53, 27, 240, 193, 145, 85, 55, 81, 49, 49, 81, + 81, 49, 49, 81, 81, 49, 49, 81, 85, 55, 81, 49, + 49, 81, 81, 113, 81, 0, 8, 53, 21, 240, 240, 113, + 98, 43, 114, 81, 240, 81, 49, 217, 129, 97, 49, 101, + 81, 49, 145, 81, 65, 145, 81, 65, 33, 97, 30, 81, + 240, 81, 177, 129, 73, 113, 17, 33, 97, 130, 49, 97, + 129, 65, 97, 129, 72, 209, 97, 209, 97, 0, 8, 64, + 58, 20, 240, 240, 97, 63, 3, 161, 240, 65, 240, 49, + 113, 111, 81, 49, 65, 49, 97, 49, 65, 49, 97, 49, + 65, 49, 97, 54, 49, 97, 49, 65, 49, 97, 49, 65, + 49, 97, 54, 49, 97, 49, 65, 49, 97, 49, 65, 49, + 97, 49, 65, 49, 110, 97, 193, 0, 10, 64, 37, 19, + 240, 240, 161, 240, 66, 240, 49, 240, 49, 240, 49, 240, + 49, 240, 58, 240, 240, 223, 2, 240, 240, 210, 240, 49, + 240, 49, 240, 49, 240, 49, 240, 59, 0, 7, 80, 32, + 20, 0, 8, 115, 146, 129, 161, 129, 161, 129, 170, 161, + 129, 161, 129, 161, 129, 170, 161, 49, 65, 225, 240, 65, + 240, 65, 191, 3, 0, 15, 32, 41, 16, 240, 179, 241, + 113, 113, 85, 81, 65, 51, 65, 49, 82, 65, 49, 102, + 49, 97, 65, 49, 82, 65, 65, 65, 81, 84, 97, 241, + 241, 98, 113, 129, 97, 129, 241, 241, 249, 0, 6, 32, + 36, 19, 0, 5, 97, 240, 21, 209, 81, 177, 113, 161, + 113, 161, 113, 177, 81, 213, 0, 5, 111, 2, 240, 240, + 210, 240, 49, 240, 49, 240, 49, 240, 59, 0, 7, 80, + 40, 16, 240, 240, 211, 241, 241, 56, 65, 146, 65, 145, + 81, 130, 81, 129, 97, 113, 113, 99, 97, 82, 34, 65, + 65, 82, 49, 49, 114, 33, 33, 193, 241, 241, 241, 241, + 241, 240, 240, 64, 26, 19, 0, 9, 108, 129, 240, 49, + 240, 49, 240, 58, 145, 240, 49, 240, 49, 240, 59, 0, + 7, 111, 2, 0, 14, 64, 33, 12, 0, 6, 2, 82, + 50, 66, 66, 51, 66, 35, 82, 34, 98, 18, 116, 133, + 114, 19, 98, 34, 98, 50, 82, 66, 66, 82, 50, 98, + 0, 7, 96, 26, 11, 240, 240, 231, 66, 66, 50, 82, + 34, 82, 34, 82, 34, 82, 34, 66, 55, 66, 146, 146, + 146, 146, 146, 0, 8, 29, 11, 0, 5, 98, 34, 240, + 240, 133, 82, 50, 66, 51, 34, 82, 34, 82, 34, 82, + 34, 82, 34, 66, 66, 50, 85, 0, 7, 48, 31, 12, + 0, 6, 18, 34, 240, 240, 178, 82, 50, 82, 50, 82, + 50, 82, 50, 82, 50, 82, 50, 82, 50, 67, 51, 36, + 68, 35, 0, 7, 96, 48, 16, 240, 240, 129, 241, 241, + 226, 34, 119, 193, 33, 193, 34, 182, 146, 33, 34, 83, + 49, 49, 66, 17, 33, 81, 49, 33, 33, 81, 33, 66, + 97, 33, 66, 97, 33, 66, 81, 49, 49, 17, 65, 83, + 82, 179, 0, 6, 112, 33, 17, 0, 6, 49, 240, 34, + 113, 129, 129, 97, 161, 81, 177, 65, 177, 65, 193, 49, + 193, 49, 33, 85, 49, 17, 161, 66, 242, 240, 17, 0, + 16, 64, 32, 14, 0, 5, 97, 228, 161, 240, 17, 97, + 68, 100, 18, 113, 65, 193, 193, 193, 18, 145, 49, 129, + 65, 113, 81, 98, 81, 49, 163, 0, 9, 16, 26, 11, + 240, 240, 66, 177, 161, 162, 34, 99, 114, 99, 33, 161, + 177, 102, 65, 81, 49, 161, 161, 162, 182, 0, 5, 112, + 29, 16, 0, 6, 66, 242, 226, 225, 33, 113, 67, 148, + 241, 39, 97, 81, 129, 241, 225, 49, 177, 49, 161, 65, + 161, 86, 0, 12, 48, 45, 19, 240, 240, 194, 240, 49, + 240, 49, 240, 33, 240, 49, 18, 177, 36, 35, 130, 18, + 18, 49, 163, 65, 178, 81, 162, 97, 147, 97, 145, 17, + 97, 65, 49, 33, 97, 49, 113, 115, 114, 240, 49, 0, + 13, 80, 23, 13, 0, 6, 105, 34, 114, 97, 50, 129, + 18, 146, 177, 177, 193, 177, 193, 177, 177, 177, 0, 11, + 32, 25, 10, 240, 240, 113, 145, 129, 130, 129, 130, 113, + 17, 82, 33, 65, 65, 145, 145, 145, 145, 145, 145, 0, + 6, 96, 22, 14, 0, 7, 17, 226, 240, 240, 130, 145, + 65, 113, 193, 193, 193, 193, 193, 178, 163, 0, 11, 96, + 27, 13, 0, 8, 97, 198, 97, 66, 81, 81, 98, 50, + 81, 34, 17, 81, 66, 179, 161, 17, 145, 162, 161, 162, + 0, 9, 64, 21, 11, 0, 11, 113, 97, 65, 33, 49, + 34, 49, 81, 161, 145, 146, 145, 130, 129, 0, 7, 112, + 21, 8, 240, 145, 129, 113, 113, 113, 113, 116, 65, 49, + 49, 113, 113, 113, 113, 113, 0, 6, 96, 29, 14, 0, + 5, 113, 225, 240, 180, 115, 49, 193, 179, 178, 179, 33, + 114, 17, 49, 81, 49, 50, 34, 65, 209, 209, 209, 0, + 9, 80, 32, 19, 0, 6, 66, 240, 17, 33, 241, 33, + 97, 146, 114, 81, 193, 97, 161, 129, 145, 130, 113, 161, + 113, 162, 81, 178, 65, 240, 33, 0, 21, 32, 32, 16, + 0, 7, 50, 130, 49, 33, 129, 65, 161, 241, 156, 66, + 65, 241, 241, 241, 33, 113, 65, 50, 66, 65, 65, 65, + 81, 211, 225, 0, 11, 32, 34, 18, 0, 11, 97, 49, + 210, 33, 209, 49, 209, 49, 209, 49, 209, 49, 97, 97, + 49, 81, 97, 65, 50, 113, 65, 18, 129, 82, 145, 240, + 17, 0, 15, 80, 42, 20, 0, 7, 1, 63, 3, 161, + 240, 65, 240, 65, 240, 65, 240, 66, 240, 49, 18, 240, + 17, 50, 225, 66, 209, 81, 209, 240, 65, 240, 65, 240, + 65, 240, 65, 240, 65, 240, 65, 0, 8, 112, 62, 21, + 240, 162, 49, 65, 161, 65, 65, 161, 65, 65, 145, 81, + 65, 145, 81, 65, 33, 98, 28, 82, 81, 65, 113, 17, + 81, 65, 113, 17, 81, 65, 97, 33, 81, 65, 145, 81, + 65, 49, 81, 30, 81, 240, 81, 81, 225, 65, 82, 129, + 50, 113, 113, 34, 145, 97, 17, 177, 98, 0, 9, 112, + 59, 20, 240, 240, 209, 193, 97, 74, 81, 113, 65, 97, + 113, 65, 97, 50, 33, 65, 97, 19, 49, 65, 53, 97, + 65, 97, 113, 65, 97, 113, 65, 97, 97, 81, 97, 65, + 17, 81, 97, 34, 33, 81, 99, 49, 97, 98, 65, 97, + 97, 65, 113, 161, 113, 161, 84, 130, 0, 9, 32, 46, + 19, 0, 6, 82, 47, 2, 241, 240, 49, 209, 65, 135, + 49, 129, 65, 65, 129, 65, 65, 129, 65, 65, 129, 65, + 65, 129, 65, 65, 134, 65, 129, 65, 65, 129, 145, 240, + 49, 240, 49, 240, 49, 244, 0, 7, 96, 43, 20, 240, + 209, 240, 81, 193, 97, 207, 81, 193, 81, 240, 65, 209, + 111, 193, 240, 65, 225, 65, 225, 65, 65, 145, 71, 113, + 17, 49, 209, 17, 49, 193, 49, 33, 193, 67, 177, 121, + 33, 0, 9, 112, 45, 20, 240, 241, 240, 65, 82, 79, + 1, 65, 240, 65, 193, 97, 44, 81, 81, 81, 113, 98, + 18, 129, 129, 161, 45, 65, 129, 65, 81, 129, 49, 97, + 129, 161, 129, 145, 145, 145, 145, 145, 145, 129, 116, 0, + 11, 62, 20, 240, 130, 177, 97, 74, 81, 65, 49, 49, + 97, 33, 17, 49, 49, 55, 17, 49, 49, 97, 65, 49, + 49, 97, 73, 97, 33, 17, 49, 49, 99, 33, 49, 49, + 82, 65, 49, 49, 50, 17, 73, 97, 65, 49, 49, 97, + 129, 161, 129, 161, 129, 161, 129, 161, 129, 116, 129, 145, + 0, 9, 80, 59, 20, 240, 129, 161, 129, 72, 113, 65, + 81, 129, 33, 17, 81, 87, 23, 129, 65, 81, 129, 65, + 81, 129, 71, 131, 33, 113, 82, 29, 34, 17, 129, 161, + 65, 49, 161, 49, 65, 33, 113, 50, 53, 97, 50, 49, + 161, 33, 33, 33, 161, 33, 51, 131, 17, 86, 113, 0, + 9, 48, 68, 20, 240, 129, 240, 65, 162, 113, 65, 20, + 145, 66, 209, 17, 33, 183, 17, 225, 72, 98, 65, 17, + 66, 83, 49, 17, 65, 98, 17, 33, 17, 50, 81, 17, + 33, 17, 33, 33, 97, 17, 65, 33, 33, 81, 33, 65, + 50, 145, 49, 66, 145, 49, 66, 145, 49, 49, 18, 129, + 33, 49, 50, 113, 17, 34, 83, 145, 0, 9, 52, 18, + 240, 240, 33, 94, 65, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 93, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 93, 81, 81, 81, 65, 97, 81, 65, 97, 81, + 65, 97, 81, 49, 113, 81, 49, 113, 81, 177, 36, 0, + 9, 48, 39, 19, 0, 6, 49, 125, 0, 9, 66, 47, + 2, 161, 240, 49, 225, 49, 33, 162, 49, 49, 145, 65, + 65, 113, 81, 81, 81, 97, 97, 49, 113, 97, 177, 240, + 34, 244, 0, 8, 48, 63, 20, 240, 240, 243, 50, 147, + 97, 65, 113, 87, 113, 81, 81, 113, 33, 17, 17, 49, + 88, 34, 17, 145, 129, 146, 113, 163, 66, 18, 130, 17, + 18, 38, 65, 17, 33, 49, 66, 49, 33, 82, 65, 65, + 33, 65, 33, 34, 49, 49, 34, 49, 33, 129, 145, 145, + 114, 161, 82, 193, 35, 0, 8, 96, 58, 21, 240, 193, + 145, 117, 25, 66, 17, 65, 97, 129, 65, 97, 129, 65, + 97, 129, 33, 17, 97, 87, 24, 129, 65, 113, 99, 43, + 82, 17, 97, 145, 17, 18, 81, 145, 17, 129, 129, 33, + 129, 33, 81, 33, 58, 49, 49, 129, 177, 129, 177, 129, + 49, 113, 44, 0, 10, 96, 41, 19, 240, 177, 240, 49, + 240, 65, 240, 49, 81, 95, 240, 240, 65, 145, 129, 161, + 97, 177, 97, 193, 81, 193, 65, 209, 65, 210, 49, 209, + 49, 240, 49, 240, 33, 97, 63, 2, 0, 9, 96, 59, + 20, 240, 240, 49, 130, 86, 129, 81, 49, 145, 33, 33, + 49, 104, 17, 49, 177, 49, 49, 117, 33, 69, 145, 240, + 34, 113, 101, 25, 209, 65, 161, 49, 49, 118, 49, 33, + 113, 49, 65, 17, 129, 49, 82, 129, 49, 82, 133, 50, + 34, 97, 49, 18, 83, 130, 145, 0, 7, 112, 68, 20, + 65, 240, 81, 240, 65, 102, 113, 49, 33, 49, 74, 17, + 49, 97, 129, 33, 113, 50, 49, 33, 129, 33, 65, 17, + 145, 17, 34, 17, 17, 93, 33, 240, 17, 49, 177, 49, + 65, 72, 33, 65, 65, 81, 49, 65, 65, 81, 49, 50, + 65, 81, 49, 19, 81, 81, 49, 151, 49, 145, 81, 49, + 145, 81, 49, 0, 8, 48, 68, 20, 240, 209, 113, 58, + 23, 81, 33, 145, 97, 33, 145, 97, 33, 17, 113, 73, + 97, 65, 17, 33, 17, 113, 65, 17, 33, 17, 38, 65, + 17, 33, 17, 33, 65, 65, 17, 33, 17, 33, 146, 51, + 33, 146, 81, 33, 145, 97, 33, 152, 33, 145, 97, 33, + 81, 49, 97, 33, 81, 56, 33, 81, 49, 97, 39, 0, + 10, 32, 61, 20, 240, 113, 240, 65, 193, 97, 33, 41, + 85, 65, 49, 81, 145, 49, 81, 50, 65, 49, 86, 65, + 49, 65, 33, 113, 49, 113, 113, 49, 113, 33, 24, 71, + 49, 65, 113, 97, 65, 113, 97, 65, 113, 97, 65, 113, + 33, 49, 65, 115, 65, 65, 114, 81, 65, 17, 81, 44, + 0, 10, 32, 48, 20, 240, 240, 19, 240, 65, 240, 65, + 137, 33, 242, 33, 241, 49, 241, 49, 241, 49, 162, 49, + 49, 177, 33, 69, 113, 33, 65, 177, 113, 177, 98, 98, + 55, 17, 116, 129, 240, 65, 240, 65, 240, 65, 240, 65, + 0, 8, 32, 40, 19, 0, 7, 60, 240, 34, 240, 34, + 240, 33, 240, 49, 240, 49, 240, 33, 240, 49, 127, 2, + 161, 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, 240, + 49, 240, 49, 240, 49, 0, 6, 32, 19, 0, 9, 109, + 240, 34, 240, 33, 240, 49, 240, 49, 240, 49, 240, 34, + 240, 33, 240, 49, 240, 49, 240, 49, 240, 33, 127, 2, + 0, 14, 64, 39, 17, 240, 240, 243, 240, 17, 51, 161, + 81, 161, 81, 71, 81, 161, 81, 161, 81, 67, 49, 85, + 97, 240, 154, 240, 17, 240, 17, 122, 129, 240, 17, 240, + 17, 240, 26, 0, 6, 80, 35, 15, 240, 240, 163, 225, + 225, 34, 161, 49, 161, 49, 161, 49, 161, 49, 161, 49, + 161, 49, 146, 49, 84, 17, 54, 81, 225, 225, 225, 225, + 225, 225, 0, 5, 112, 56, 17, 240, 227, 178, 49, 193, + 49, 193, 49, 40, 33, 49, 65, 113, 49, 65, 113, 49, + 65, 113, 49, 65, 53, 49, 65, 113, 49, 65, 113, 49, + 65, 113, 49, 65, 50, 33, 49, 68, 65, 49, 193, 49, + 193, 49, 193, 49, 193, 49, 193, 49, 240, 17, 240, 240, + 96, 37, 15, 240, 163, 225, 225, 40, 65, 130, 65, 130, + 65, 129, 81, 129, 81, 40, 20, 49, 161, 49, 161, 49, + 161, 49, 97, 49, 55, 65, 225, 225, 225, 225, 225, 0, + 5, 112, 36, 15, 240, 163, 225, 225, 40, 65, 145, 65, + 145, 65, 145, 65, 145, 65, 40, 65, 49, 161, 49, 161, + 49, 161, 49, 101, 55, 65, 225, 225, 225, 225, 225, 0, + 5, 112, 41, 16, 240, 240, 211, 241, 131, 65, 34, 97, + 65, 49, 97, 65, 49, 97, 65, 61, 49, 97, 65, 49, + 97, 65, 49, 97, 65, 56, 65, 49, 97, 65, 241, 241, + 241, 241, 241, 241, 0, 6, 32, 42, 17, 0, 5, 99, + 113, 129, 130, 97, 129, 113, 114, 113, 114, 38, 99, 113, + 82, 34, 81, 65, 82, 65, 34, 193, 194, 33, 180, 193, + 65, 161, 97, 145, 97, 145, 97, 161, 65, 196, 0, 6, + 112, 35, 19, 0, 8, 2, 240, 49, 240, 34, 240, 19, + 240, 17, 34, 209, 82, 146, 115, 97, 177, 163, 240, 49, + 240, 49, 240, 49, 240, 49, 113, 47, 2, 0, 14, 64, + 40, 20, 240, 209, 240, 82, 240, 34, 240, 50, 240, 33, + 34, 210, 82, 161, 146, 98, 0, 7, 15, 3, 177, 240, + 65, 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, 240, + 65, 0, 8, 96, 46, 17, 0, 5, 99, 240, 17, 130, + 97, 130, 97, 130, 97, 129, 113, 114, 113, 114, 113, 97, + 33, 97, 81, 66, 65, 66, 82, 49, 49, 129, 49, 33, + 209, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 0, + 6, 80, 42, 15, 240, 240, 178, 82, 113, 68, 97, 49, + 66, 65, 33, 97, 65, 33, 102, 33, 97, 65, 49, 66, + 65, 69, 81, 225, 195, 98, 97, 113, 97, 120, 113, 97, + 113, 97, 120, 113, 97, 0, 5, 112, 40, 16, 240, 195, + 241, 241, 97, 129, 69, 97, 50, 50, 21, 33, 113, 65, + 33, 113, 65, 33, 113, 65, 33, 113, 65, 50, 65, 21, + 69, 97, 241, 241, 241, 241, 241, 241, 241, 0, 6, 32, + 48, 20, 240, 241, 240, 83, 177, 113, 148, 97, 129, 65, + 81, 113, 97, 65, 113, 97, 65, 113, 97, 65, 129, 65, + 81, 148, 101, 113, 113, 177, 113, 177, 68, 106, 49, 240, + 65, 240, 65, 240, 65, 240, 65, 240, 65, 0, 8, 32, + 35, 20, 240, 225, 240, 37, 225, 81, 193, 113, 177, 113, + 177, 113, 193, 81, 229, 240, 223, 3, 0, 5, 107, 240, + 65, 240, 65, 155, 161, 240, 65, 240, 75, 0, 8, 50, + 17, 240, 240, 227, 114, 113, 100, 97, 81, 65, 81, 65, + 97, 65, 65, 97, 65, 65, 97, 65, 81, 65, 81, 100, + 97, 240, 17, 240, 178, 66, 146, 65, 161, 66, 145, 17, + 50, 130, 18, 17, 33, 97, 67, 50, 49, 193, 0, 6, + 80, 41, 16, 240, 240, 211, 241, 56, 65, 130, 81, 129, + 97, 114, 22, 99, 97, 82, 33, 81, 65, 82, 49, 34, + 177, 178, 33, 164, 177, 65, 145, 97, 129, 97, 129, 97, + 145, 65, 180, 0, 6, 64, 32, 20, 0, 7, 124, 145, + 240, 65, 240, 74, 161, 240, 65, 240, 75, 240, 240, 255, + 3, 240, 240, 243, 240, 65, 240, 65, 240, 65, 240, 75, + 0, 8, 56, 16, 240, 195, 178, 33, 193, 33, 161, 17, + 33, 40, 33, 33, 193, 33, 50, 49, 49, 33, 65, 49, + 49, 33, 65, 49, 52, 65, 49, 49, 33, 65, 49, 49, + 33, 65, 49, 34, 33, 41, 17, 33, 193, 33, 193, 33, + 193, 33, 193, 33, 193, 33, 241, 0, 6, 32, 26, 19, + 0, 9, 108, 145, 67, 193, 66, 193, 66, 193, 66, 193, + 65, 209, 65, 34, 109, 0, 10, 15, 2, 0, 14, 64, + 47, 19, 0, 6, 3, 240, 49, 134, 65, 240, 49, 106, + 33, 240, 49, 148, 81, 129, 65, 65, 113, 97, 53, 49, + 97, 49, 113, 97, 49, 129, 65, 65, 148, 81, 240, 49, + 240, 49, 240, 49, 240, 49, 240, 49, 0, 7, 112, 33, + 14, 0, 7, 68, 130, 66, 82, 98, 66, 98, 50, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 50, 98, + 66, 98, 82, 66, 132, 0, 9, 64, 34, 15, 0, 8, + 4, 146, 66, 98, 98, 82, 98, 66, 130, 50, 130, 50, + 130, 50, 130, 50, 130, 50, 130, 66, 98, 82, 98, 98, + 66, 150, 228, 194, 0, 6, 27, 14, 0, 7, 3, 99, + 50, 98, 82, 66, 98, 66, 114, 34, 131, 18, 148, 178, + 194, 194, 194, 194, 194, 194, 0, 9, 80, 23, 6, 240, + 52, 34, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 68, 128, 23, 6, 240, 52, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 36, 128, 29, 11, 0, 11, 54, + 51, 50, 50, 66, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 67, 50, 36, 68, 18, 146, 146, 146, 146, 146, 32, + 32, 14, 50, 34, 0, 6, 66, 180, 164, 161, 33, 146, + 34, 130, 34, 129, 65, 114, 66, 98, 66, 104, 82, 98, + 66, 98, 65, 129, 50, 130, 0, 9, 30, 12, 0, 6, + 34, 34, 240, 240, 214, 82, 50, 66, 66, 50, 82, 50, + 82, 50, 82, 50, 82, 50, 67, 66, 36, 83, 35, 0, + 7, 96, 26, 11, 240, 240, 146, 130, 130, 130, 240, 84, + 82, 50, 65, 82, 34, 82, 41, 34, 146, 162, 146, 81, + 86, 0, 7, 16, 14, 9, 240, 209, 50, 34, 34, 49, + 49, 67, 19, 0, 18, 32, 14, 9, 240, 195, 19, 65, + 49, 50, 34, 34, 49, 0, 18, 48, 23, 10, 240, 240, + 97, 146, 113, 129, 129, 114, 113, 145, 161, 161, 161, 161, + 161, 146, 145, 145, 240, 240, 208, 28, 13, 240, 240, 241, + 196, 129, 65, 97, 49, 17, 81, 81, 66, 97, 49, 193, + 209, 209, 209, 209, 209, 194, 193, 193, 0, 7, 32, 28, + 13, 0, 6, 1, 50, 129, 49, 97, 81, 113, 65, 193, + 193, 193, 193, 193, 193, 129, 49, 113, 65, 97, 81, 66, + 116, 0, 9, 37, 17, 0, 5, 97, 130, 114, 114, 81, + 146, 97, 129, 33, 129, 67, 164, 240, 17, 53, 129, 99, + 97, 97, 145, 241, 240, 17, 49, 177, 65, 177, 66, 240, + 22, 0, 11, 16, 35, 16, 0, 6, 97, 241, 225, 18, + 129, 35, 179, 52, 129, 84, 81, 81, 145, 81, 129, 97, + 113, 113, 113, 113, 97, 55, 129, 83, 114, 65, 33, 117, + 0, 10, 112, 45, 16, 0, 8, 17, 113, 129, 97, 129, + 81, 145, 53, 113, 18, 33, 34, 97, 49, 65, 82, 49, + 81, 49, 17, 33, 97, 33, 49, 17, 97, 33, 50, 113, + 33, 50, 97, 49, 33, 129, 51, 114, 194, 209, 0, 9, + 28, 12, 240, 240, 130, 195, 115, 129, 177, 161, 177, 177, + 38, 49, 17, 97, 34, 113, 33, 129, 177, 161, 146, 115, + 129, 0, 7, 16, 36, 11, 240, 113, 177, 161, 51, 49, + 49, 33, 49, 33, 65, 33, 17, 81, 33, 17, 81, 34, + 97, 34, 97, 34, 97, 34, 97, 34, 81, 161, 145, 146, + 129, 0, 7, 80, 25, 13, 0, 7, 17, 193, 193, 123, + 34, 114, 33, 130, 33, 129, 49, 129, 177, 193, 177, 162, + 161, 147, 0, 9, 32, 17, 13, 0, 12, 49, 102, 161, + 193, 193, 193, 193, 19, 55, 49, 0, 13, 32, 24, 13, + 0, 7, 17, 193, 177, 199, 81, 81, 81, 97, 65, 97, + 65, 113, 177, 178, 162, 162, 146, 0, 10, 112, 28, 16, + 240, 240, 225, 240, 17, 225, 129, 98, 97, 246, 145, 81, + 129, 97, 113, 97, 113, 113, 225, 226, 210, 209, 210, 0, + 13, 64, 27, 14, 0, 9, 33, 209, 209, 82, 81, 21, + 97, 81, 113, 81, 97, 81, 97, 97, 209, 193, 193, 209, + 178, 177, 0, 8, 48, 29, 16, 0, 9, 17, 161, 65, + 161, 65, 161, 65, 170, 37, 65, 161, 65, 161, 65, 161, + 65, 225, 241, 225, 225, 225, 225, 0, 9, 48, 26, 15, + 0, 7, 1, 65, 113, 33, 66, 98, 240, 240, 50, 145, + 81, 113, 209, 209, 209, 209, 209, 194, 179, 0, 12, 80, + 22, 13, 0, 10, 53, 83, 50, 177, 177, 193, 177, 179, + 161, 33, 114, 65, 81, 98, 34, 129, 0, 10, 22, 12, + 0, 10, 2, 33, 129, 34, 113, 49, 97, 177, 162, 161, + 161, 162, 145, 161, 146, 0, 8, 80, 22, 16, 0, 7, + 65, 209, 33, 210, 58, 226, 225, 241, 225, 241, 225, 226, + 209, 210, 194, 0, 13, 96, 26, 16, 240, 240, 210, 209, + 33, 193, 33, 86, 34, 52, 66, 241, 225, 241, 226, 225, + 225, 226, 210, 209, 210, 0, 13, 80, 35, 16, 240, 240, + 210, 209, 33, 129, 49, 33, 129, 66, 145, 241, 156, 66, + 65, 241, 241, 241, 33, 113, 65, 49, 82, 65, 65, 65, + 81, 65, 131, 225, 0, 11, 32, 23, 13, 0, 9, 49, + 193, 177, 113, 65, 130, 17, 178, 178, 161, 33, 129, 49, + 98, 146, 161, 0, 11, 32, 15, 12, 0, 12, 38, 161, + 177, 177, 177, 164, 53, 65, 0, 12, 32, 16, 15, 0, + 11, 88, 209, 225, 225, 225, 209, 225, 184, 37, 0, 16, + 32, 15, 9, 0, 9, 7, 129, 129, 129, 39, 129, 129, + 39, 0, 8, 16, 39, 19, 240, 130, 240, 33, 240, 49, + 161, 110, 81, 240, 49, 240, 33, 177, 110, 240, 33, 240, + 49, 240, 49, 225, 49, 76, 33, 240, 49, 240, 49, 240, + 49, 240, 33, 244, 0, 10, 16, 41, 19, 240, 177, 240, + 65, 240, 49, 240, 49, 190, 240, 18, 240, 18, 240, 33, + 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, + 240, 18, 240, 17, 17, 226, 50, 240, 74, 0, 9, 96, + 48, 20, 240, 225, 240, 50, 240, 49, 17, 240, 17, 49, + 225, 81, 193, 98, 161, 145, 129, 33, 81, 34, 81, 50, + 65, 50, 34, 65, 81, 209, 81, 209, 81, 209, 81, 209, + 81, 193, 97, 193, 97, 177, 113, 161, 129, 0, 10, 112, + 52, 20, 240, 145, 81, 209, 81, 33, 161, 81, 50, 113, + 97, 65, 113, 97, 194, 81, 81, 82, 29, 49, 17, 97, + 145, 33, 97, 145, 33, 97, 193, 97, 193, 98, 177, 113, + 177, 113, 177, 129, 65, 81, 145, 49, 81, 146, 33, 81, + 179, 0, 10, 32, 50, 17, 240, 240, 242, 65, 161, 81, + 50, 81, 81, 81, 65, 81, 81, 65, 81, 81, 65, 81, + 161, 81, 161, 81, 161, 81, 145, 97, 81, 49, 97, 50, + 65, 97, 33, 81, 17, 83, 81, 49, 65, 97, 81, 130, + 98, 97, 145, 66, 0, 8, 54, 20, 240, 145, 98, 177, + 97, 193, 49, 33, 177, 49, 49, 177, 49, 49, 49, 113, + 58, 82, 49, 49, 145, 17, 33, 65, 145, 17, 33, 65, + 129, 33, 113, 65, 97, 29, 81, 113, 177, 113, 177, 113, + 177, 113, 177, 113, 177, 113, 177, 113, 177, 0, 9, 64, + 44, 20, 240, 210, 240, 35, 240, 18, 17, 240, 17, 49, + 225, 81, 193, 113, 161, 113, 18, 98, 40, 20, 33, 241, + 240, 34, 110, 193, 240, 49, 240, 50, 240, 49, 81, 193, + 113, 161, 25, 131, 129, 0, 10, 80, 50, 21, 0, 5, + 98, 81, 209, 113, 193, 113, 65, 97, 45, 82, 161, 114, + 73, 81, 17, 240, 33, 33, 177, 81, 33, 73, 113, 240, + 81, 177, 129, 73, 113, 65, 97, 129, 65, 97, 129, 65, + 97, 129, 72, 129, 65, 97, 209, 0, 9, 48, 69, 21, + 240, 161, 66, 225, 65, 65, 161, 55, 145, 50, 65, 33, + 113, 59, 98, 18, 65, 49, 98, 49, 49, 65, 81, 17, + 58, 65, 33, 49, 33, 81, 113, 82, 209, 65, 33, 34, + 129, 34, 33, 18, 161, 81, 34, 161, 50, 34, 17, 145, + 33, 49, 17, 33, 129, 66, 33, 34, 113, 49, 65, 51, + 81, 18, 21, 177, 113, 0, 9, 48, 20, 240, 209, 240, + 49, 240, 50, 240, 49, 81, 193, 113, 161, 145, 129, 42, + 117, 33, 65, 161, 49, 65, 161, 49, 241, 49, 241, 49, + 241, 49, 225, 65, 225, 65, 81, 113, 81, 81, 98, 81, + 82, 65, 119, 50, 0, 9, 96, 43, 18, 240, 177, 240, + 33, 240, 33, 240, 33, 240, 33, 81, 79, 161, 81, 177, + 81, 177, 81, 162, 81, 161, 97, 161, 97, 145, 113, 145, + 113, 129, 129, 113, 145, 97, 161, 81, 101, 66, 161, 0, + 7, 48, 58, 20, 240, 240, 34, 193, 81, 150, 65, 240, + 65, 240, 65, 49, 216, 146, 49, 49, 57, 49, 49, 98, + 113, 49, 97, 129, 49, 97, 129, 49, 97, 33, 65, 65, + 81, 65, 49, 65, 81, 65, 49, 65, 65, 20, 17, 17, + 81, 66, 82, 97, 177, 97, 177, 83, 161, 0, 9, 16, + 70, 20, 240, 145, 129, 161, 129, 161, 129, 106, 49, 240, + 65, 129, 49, 56, 65, 65, 81, 49, 49, 97, 65, 49, + 49, 97, 65, 49, 33, 81, 97, 49, 65, 49, 97, 49, + 81, 33, 81, 65, 98, 97, 65, 113, 97, 65, 97, 17, + 65, 81, 97, 33, 49, 81, 81, 49, 33, 81, 81, 113, + 81, 65, 113, 97, 49, 113, 82, 240, 240, 224, 67, 20, + 240, 164, 49, 133, 97, 193, 49, 33, 122, 33, 193, 97, + 49, 65, 49, 33, 24, 57, 33, 49, 65, 49, 33, 49, + 49, 72, 49, 49, 65, 49, 33, 49, 49, 65, 49, 33, + 49, 49, 72, 33, 65, 65, 49, 33, 33, 65, 129, 33, + 33, 65, 74, 81, 129, 65, 81, 133, 82, 68, 49, 52, + 240, 49, 0, 8, 16, 70, 18, 240, 129, 129, 55, 39, + 33, 65, 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, + 54, 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, 49, + 65, 49, 65, 54, 49, 65, 49, 65, 49, 65, 49, 129, + 65, 49, 49, 65, 65, 49, 65, 49, 65, 49, 51, 33, + 35, 49, 18, 33, 33, 130, 65, 33, 129, 129, 240, 33, + 0, 7, 96, 62, 20, 240, 226, 155, 177, 65, 225, 65, + 129, 81, 65, 25, 70, 33, 65, 97, 65, 33, 65, 97, + 65, 33, 65, 97, 65, 49, 49, 102, 49, 33, 113, 65, + 49, 33, 113, 65, 65, 17, 113, 67, 34, 129, 35, 81, + 116, 33, 66, 98, 81, 65, 17, 193, 49, 49, 177, 18, + 67, 146, 0, 8, 112, 47, 19, 240, 240, 49, 230, 103, + 193, 240, 49, 240, 49, 178, 94, 81, 240, 49, 240, 49, + 161, 113, 42, 97, 33, 113, 113, 33, 113, 97, 49, 113, + 97, 49, 113, 97, 49, 113, 81, 73, 65, 81, 113, 161, + 113, 0, 7, 80, 62, 20, 240, 209, 240, 21, 181, 161, + 129, 87, 113, 81, 65, 129, 33, 33, 65, 58, 17, 65, + 114, 81, 65, 114, 81, 65, 115, 65, 65, 97, 17, 18, + 33, 65, 97, 17, 33, 33, 65, 81, 33, 81, 65, 65, + 49, 81, 65, 49, 65, 86, 129, 81, 65, 129, 81, 65, + 129, 81, 209, 0, 9, 32, 75, 20, 240, 242, 240, 49, + 240, 49, 97, 113, 43, 37, 33, 129, 49, 49, 33, 129, + 49, 49, 33, 81, 33, 49, 49, 33, 22, 17, 49, 49, + 33, 17, 49, 33, 49, 49, 33, 17, 49, 33, 49, 49, + 33, 17, 49, 33, 49, 49, 33, 17, 49, 33, 53, 33, + 21, 33, 49, 49, 33, 17, 49, 33, 49, 97, 129, 49, + 97, 129, 161, 129, 161, 99, 0, 10, 48, 59, 17, 240, + 240, 17, 47, 33, 209, 33, 82, 33, 49, 33, 71, 33, + 33, 65, 65, 49, 33, 50, 49, 65, 33, 33, 33, 33, + 65, 33, 17, 66, 81, 33, 84, 65, 33, 50, 54, 36, + 34, 97, 33, 113, 81, 33, 50, 129, 33, 83, 81, 33, + 114, 65, 47, 33, 209, 0, 8, 96, 48, 20, 240, 210, + 240, 49, 240, 49, 129, 79, 2, 145, 240, 49, 65, 225, + 65, 194, 81, 193, 97, 178, 97, 49, 97, 17, 42, 65, + 33, 97, 129, 49, 97, 193, 97, 193, 97, 193, 97, 193, + 97, 65, 113, 28, 97, 0, 9, 48, 69, 20, 240, 130, + 161, 113, 49, 24, 56, 17, 81, 113, 81, 81, 113, 49, + 17, 81, 74, 66, 145, 49, 50, 98, 33, 49, 193, 33, + 56, 113, 33, 17, 17, 49, 72, 17, 17, 49, 113, 81, + 17, 49, 113, 49, 17, 33, 17, 90, 33, 17, 129, 81, + 50, 129, 81, 50, 129, 81, 33, 18, 113, 81, 17, 51, + 81, 82, 0, 8, 80, 47, 20, 240, 209, 240, 66, 177, + 113, 97, 95, 1, 49, 210, 65, 129, 65, 66, 50, 49, + 240, 17, 33, 193, 97, 210, 49, 241, 49, 97, 63, 3, + 177, 240, 50, 240, 49, 18, 241, 66, 178, 114, 114, 161, + 97, 0, 9, 80, 62, 19, 240, 225, 193, 66, 65, 113, + 72, 33, 49, 49, 81, 81, 33, 35, 49, 113, 17, 17, + 34, 17, 129, 17, 97, 177, 66, 34, 129, 49, 65, 145, + 18, 81, 18, 67, 27, 34, 33, 129, 81, 49, 34, 65, + 145, 50, 49, 145, 66, 33, 145, 65, 49, 145, 129, 145, + 99, 145, 113, 0, 7, 112, 56, 20, 240, 240, 81, 111, + 81, 193, 97, 193, 110, 97, 65, 65, 33, 97, 81, 49, + 145, 81, 33, 49, 97, 44, 81, 81, 49, 145, 81, 49, + 145, 81, 49, 49, 81, 30, 49, 97, 49, 129, 81, 65, + 129, 81, 65, 113, 81, 81, 113, 65, 97, 177, 113, 0, + 8, 48, 50, 20, 240, 193, 49, 65, 79, 2, 145, 49, + 240, 97, 171, 145, 129, 170, 161, 129, 170, 161, 33, 81, + 33, 79, 2, 114, 33, 33, 162, 65, 50, 113, 30, 34, + 33, 65, 49, 161, 65, 49, 161, 65, 49, 161, 65, 34, + 241, 0, 8, 96, 49, 20, 240, 225, 240, 81, 240, 65, + 82, 79, 1, 65, 97, 193, 82, 97, 81, 45, 65, 81, + 209, 65, 50, 145, 65, 49, 49, 97, 59, 81, 129, 161, + 129, 161, 129, 66, 50, 30, 49, 145, 145, 145, 129, 161, + 240, 65, 0, 8, 64, 55, 20, 240, 225, 240, 81, 240, + 65, 81, 95, 1, 65, 240, 65, 240, 65, 65, 225, 81, + 97, 97, 97, 66, 97, 17, 66, 49, 113, 33, 65, 49, + 113, 49, 49, 49, 113, 49, 49, 33, 129, 50, 81, 113, + 81, 65, 129, 161, 129, 145, 65, 49, 47, 0, 10, 32, + 62, 20, 240, 225, 240, 81, 81, 95, 1, 65, 240, 65, + 177, 113, 118, 97, 37, 17, 161, 33, 81, 161, 33, 81, + 65, 81, 44, 81, 33, 81, 161, 33, 81, 161, 33, 82, + 129, 49, 97, 129, 49, 33, 50, 49, 49, 49, 17, 81, + 33, 49, 66, 50, 35, 49, 65, 81, 50, 240, 81, 0, + 7, 96, 56, 19, 240, 210, 65, 59, 50, 97, 49, 97, + 113, 49, 81, 129, 49, 65, 145, 49, 225, 49, 33, 66, + 44, 34, 97, 49, 82, 113, 49, 65, 145, 49, 49, 161, + 49, 129, 65, 65, 129, 65, 65, 113, 81, 65, 97, 81, + 81, 66, 97, 81, 49, 113, 130, 0, 10, 64, 59, 20, + 240, 225, 201, 66, 81, 97, 66, 104, 65, 113, 97, 49, + 136, 33, 145, 33, 66, 50, 60, 49, 193, 81, 120, 49, + 129, 81, 49, 145, 81, 33, 65, 87, 114, 65, 33, 33, + 98, 81, 33, 18, 81, 113, 33, 34, 49, 113, 49, 49, + 33, 113, 65, 66, 179, 34, 0, 8, 96, 62, 20, 240, + 129, 113, 178, 82, 177, 81, 65, 113, 81, 66, 97, 49, + 23, 97, 49, 33, 49, 193, 81, 65, 113, 81, 97, 98, + 28, 66, 82, 161, 17, 81, 81, 65, 33, 87, 113, 66, + 65, 129, 49, 17, 50, 129, 33, 49, 33, 145, 17, 82, + 161, 115, 145, 82, 35, 113, 35, 99, 0, 7, 96, 46, + 19, 240, 178, 240, 33, 81, 140, 113, 145, 129, 145, 139, + 129, 145, 129, 145, 139, 129, 145, 139, 129, 145, 161, 33, + 177, 49, 49, 66, 65, 49, 65, 33, 33, 49, 49, 113, + 33, 33, 65, 113, 33, 121, 0, 10, 16, 63, 19, 240, + 129, 49, 210, 49, 209, 49, 209, 59, 51, 33, 49, 65, + 66, 33, 65, 49, 65, 17, 17, 33, 33, 161, 65, 33, + 34, 97, 49, 49, 50, 81, 33, 65, 66, 65, 17, 36, + 161, 97, 240, 18, 225, 49, 81, 81, 33, 113, 33, 65, + 33, 113, 49, 33, 49, 113, 49, 33, 57, 0, 10, 32, + 59, 21, 240, 146, 98, 177, 113, 65, 113, 59, 97, 113, + 161, 19, 81, 49, 97, 17, 18, 25, 81, 17, 113, 81, + 65, 17, 45, 33, 33, 240, 81, 73, 113, 65, 97, 129, + 72, 129, 65, 97, 129, 72, 129, 65, 97, 129, 65, 97, + 129, 65, 97, 129, 65, 52, 129, 161, 0, 8, 80, 67, + 20, 240, 241, 240, 65, 18, 240, 17, 49, 241, 49, 17, + 95, 1, 65, 113, 177, 113, 177, 113, 65, 97, 65, 33, + 50, 103, 17, 49, 113, 65, 33, 49, 113, 65, 49, 17, + 129, 65, 49, 17, 129, 65, 49, 17, 129, 65, 65, 129, + 81, 51, 49, 49, 35, 49, 33, 49, 33, 129, 66, 17, + 33, 98, 114, 0, 7, 96, 52, 20, 240, 129, 113, 177, + 113, 177, 113, 49, 113, 42, 71, 65, 177, 113, 65, 97, + 44, 81, 240, 65, 17, 114, 115, 129, 33, 50, 17, 44, + 81, 145, 145, 49, 81, 145, 66, 49, 145, 81, 49, 145, + 145, 145, 145, 100, 100, 129, 145, 0, 8, 48, 67, 21, + 240, 146, 82, 193, 97, 209, 86, 145, 17, 49, 49, 118, + 33, 49, 177, 49, 65, 33, 129, 33, 25, 113, 65, 49, + 33, 129, 65, 49, 33, 129, 17, 33, 49, 33, 115, 49, + 49, 33, 97, 17, 65, 49, 33, 17, 97, 30, 81, 114, + 177, 113, 17, 161, 97, 49, 145, 66, 81, 99, 49, 131, + 65, 34, 0, 9, 80, 70, 20, 240, 129, 82, 193, 82, + 33, 145, 85, 145, 17, 33, 49, 118, 17, 49, 49, 113, + 58, 97, 34, 33, 17, 33, 113, 49, 33, 17, 33, 113, + 17, 17, 33, 17, 33, 114, 33, 17, 36, 83, 50, 97, + 66, 17, 49, 49, 49, 113, 113, 81, 81, 29, 81, 98, + 177, 97, 17, 161, 81, 49, 145, 65, 84, 51, 34, 129, + 0, 7, 112, 43, 19, 240, 193, 240, 49, 240, 49, 97, + 63, 2, 161, 240, 49, 240, 49, 240, 49, 49, 139, 161, + 97, 193, 81, 193, 65, 225, 49, 241, 17, 240, 19, 240, + 19, 241, 34, 194, 83, 84, 162, 0, 7, 64, 70, 20, + 240, 240, 18, 177, 97, 134, 81, 129, 49, 97, 33, 81, + 49, 41, 65, 49, 33, 49, 33, 81, 49, 33, 49, 33, + 81, 49, 33, 49, 33, 85, 33, 49, 33, 81, 49, 33, + 49, 33, 17, 49, 62, 33, 49, 97, 129, 49, 82, 129, + 49, 81, 17, 117, 65, 33, 113, 49, 49, 65, 97, 97, + 82, 177, 114, 130, 161, 0, 7, 112, 42, 19, 240, 240, + 17, 170, 145, 113, 161, 113, 169, 161, 113, 161, 113, 169, + 161, 162, 47, 2, 161, 226, 33, 225, 49, 66, 113, 71, + 114, 49, 193, 33, 33, 193, 49, 17, 177, 90, 33, 0, + 9, 48, 50, 20, 240, 146, 98, 161, 33, 65, 49, 71, + 24, 113, 113, 177, 33, 65, 49, 56, 25, 97, 114, 145, + 18, 65, 33, 129, 49, 33, 65, 97, 97, 49, 19, 34, + 43, 145, 129, 161, 129, 170, 161, 129, 161, 129, 170, 161, + 129, 0, 10, 96, 51, 20, 240, 240, 49, 156, 129, 65, + 65, 145, 65, 65, 155, 145, 65, 65, 145, 65, 65, 155, + 145, 65, 65, 225, 98, 63, 2, 145, 18, 240, 17, 17, + 17, 225, 33, 33, 193, 49, 49, 146, 65, 66, 97, 97, + 99, 161, 240, 65, 0, 8, 112, 67, 20, 240, 129, 81, + 49, 145, 81, 49, 33, 97, 59, 81, 17, 49, 49, 17, + 71, 25, 97, 81, 49, 145, 81, 49, 34, 66, 44, 67, + 97, 162, 17, 41, 65, 17, 65, 33, 49, 81, 17, 72, + 65, 33, 65, 33, 49, 113, 65, 33, 49, 17, 81, 29, + 81, 65, 97, 113, 65, 97, 113, 65, 52, 113, 65, 82, + 0, 8, 90, 20, 240, 130, 49, 34, 17, 129, 65, 33, + 33, 129, 49, 19, 17, 18, 97, 49, 17, 17, 17, 17, + 113, 17, 18, 33, 34, 70, 33, 33, 33, 129, 49, 49, + 17, 33, 97, 33, 20, 19, 17, 67, 33, 49, 33, 114, + 17, 97, 17, 17, 82, 44, 49, 17, 65, 49, 129, 17, + 65, 49, 34, 49, 33, 66, 49, 17, 113, 49, 33, 34, + 129, 49, 33, 34, 33, 81, 33, 84, 17, 81, 33, 65, + 51, 81, 17, 50, 97, 0, 7, 96, 58, 20, 240, 226, + 240, 49, 177, 113, 194, 17, 33, 113, 97, 17, 42, 97, + 49, 113, 113, 33, 34, 49, 129, 17, 50, 33, 129, 33, + 50, 177, 98, 161, 114, 131, 113, 17, 145, 97, 33, 145, + 97, 49, 129, 82, 49, 129, 81, 81, 113, 65, 114, 81, + 34, 146, 82, 0, 9, 48, 60, 19, 240, 240, 210, 49, + 209, 65, 209, 65, 209, 65, 65, 66, 33, 65, 65, 65, + 49, 33, 17, 49, 81, 54, 33, 97, 49, 65, 17, 113, + 49, 66, 129, 49, 65, 145, 49, 65, 145, 49, 65, 145, + 49, 65, 145, 49, 18, 17, 145, 35, 49, 81, 36, 97, + 81, 33, 151, 0, 9, 96, 60, 21, 240, 113, 145, 178, + 113, 81, 97, 60, 82, 17, 145, 129, 17, 130, 141, 65, + 33, 113, 161, 17, 113, 65, 81, 17, 59, 97, 49, 49, + 65, 97, 74, 97, 65, 49, 65, 67, 65, 49, 65, 82, + 74, 97, 65, 129, 97, 98, 34, 129, 66, 98, 82, 49, + 146, 114, 177, 0, 8, 32, 70, 20, 240, 240, 97, 129, + 41, 55, 17, 113, 97, 65, 113, 97, 65, 49, 49, 97, + 65, 49, 49, 97, 65, 49, 49, 97, 17, 33, 49, 49, + 55, 17, 49, 49, 97, 65, 49, 49, 97, 65, 51, 17, + 97, 65, 50, 33, 97, 65, 33, 17, 33, 97, 18, 65, + 17, 131, 81, 33, 98, 113, 49, 49, 161, 65, 49, 130, + 85, 0, 10, 32, 61, 19, 0, 6, 81, 63, 2, 240, + 240, 49, 169, 34, 50, 17, 49, 49, 33, 65, 33, 49, + 49, 33, 65, 33, 49, 49, 33, 65, 41, 33, 65, 33, + 49, 49, 33, 65, 33, 49, 49, 33, 65, 33, 49, 49, + 33, 65, 41, 33, 65, 33, 113, 33, 65, 33, 161, 79, + 65, 209, 0, 9, 112, 65, 20, 240, 129, 113, 177, 65, + 33, 66, 79, 1, 65, 33, 65, 33, 113, 65, 33, 65, + 81, 33, 65, 242, 41, 225, 49, 97, 54, 49, 97, 49, + 65, 49, 97, 49, 65, 49, 97, 54, 49, 97, 49, 65, + 49, 97, 49, 65, 49, 97, 54, 49, 97, 49, 65, 49, + 97, 49, 129, 97, 148, 97, 177, 0, 8, 16, 43, 19, + 240, 240, 33, 140, 113, 145, 129, 145, 139, 129, 145, 129, + 145, 139, 129, 145, 129, 145, 139, 129, 33, 33, 49, 177, + 33, 225, 49, 225, 49, 209, 65, 81, 97, 81, 82, 50, + 103, 49, 0, 9, 48, 56, 19, 240, 240, 17, 154, 145, + 129, 145, 129, 145, 65, 49, 145, 65, 49, 145, 65, 49, + 145, 65, 49, 145, 65, 49, 145, 66, 33, 145, 49, 17, + 33, 145, 49, 17, 33, 209, 17, 240, 17, 17, 241, 33, + 97, 113, 49, 97, 82, 65, 82, 50, 103, 49, 0, 9, + 48, 49, 21, 240, 241, 209, 97, 226, 65, 241, 49, 113, + 129, 58, 161, 65, 177, 49, 65, 133, 17, 81, 177, 129, + 177, 129, 65, 97, 45, 81, 129, 177, 129, 177, 129, 177, + 33, 81, 177, 17, 97, 178, 113, 162, 129, 240, 81, 0, + 8, 112, 55, 20, 240, 240, 49, 129, 102, 129, 81, 49, + 145, 81, 49, 241, 49, 241, 49, 145, 65, 69, 37, 33, + 241, 161, 129, 57, 113, 81, 65, 129, 81, 49, 145, 97, + 33, 145, 33, 49, 17, 161, 17, 82, 162, 98, 146, 82, + 33, 225, 82, 162, 114, 129, 0, 6, 96, 61, 19, 240, + 113, 113, 161, 113, 145, 65, 49, 121, 17, 81, 65, 119, + 65, 113, 65, 65, 34, 49, 65, 81, 33, 49, 81, 81, + 33, 33, 65, 104, 65, 161, 113, 161, 113, 161, 33, 50, + 133, 65, 17, 82, 33, 97, 17, 145, 81, 49, 129, 65, + 66, 113, 49, 98, 97, 33, 129, 0, 7, 48, 64, 19, + 240, 145, 145, 55, 40, 33, 65, 49, 81, 54, 55, 49, + 65, 49, 81, 49, 65, 49, 81, 54, 55, 49, 65, 49, + 81, 49, 145, 65, 49, 56, 49, 49, 49, 81, 65, 49, + 55, 65, 49, 49, 81, 65, 49, 49, 81, 65, 49, 55, + 65, 49, 49, 81, 65, 49, 225, 49, 180, 240, 33, 0, + 7, 80, 57, 18, 240, 240, 33, 82, 42, 81, 161, 49, + 209, 49, 98, 81, 49, 97, 97, 49, 97, 97, 49, 97, + 97, 49, 82, 97, 49, 81, 17, 81, 49, 81, 33, 65, + 49, 65, 65, 49, 49, 49, 97, 33, 49, 33, 113, 33, + 49, 209, 49, 209, 49, 209, 49, 179, 0, 9, 48, 61, + 18, 240, 65, 193, 81, 58, 81, 161, 240, 33, 50, 129, + 49, 49, 55, 49, 49, 49, 81, 49, 49, 49, 81, 49, + 49, 49, 81, 49, 49, 55, 49, 49, 49, 81, 49, 49, + 49, 81, 49, 49, 49, 81, 49, 49, 55, 49, 49, 49, + 81, 49, 49, 209, 49, 209, 49, 179, 49, 0, 8, 112, + 44, 20, 240, 240, 18, 240, 66, 240, 65, 240, 65, 121, + 49, 225, 65, 210, 65, 209, 81, 194, 81, 193, 101, 113, + 113, 161, 129, 145, 145, 129, 161, 98, 177, 240, 65, 240, + 65, 240, 65, 240, 65, 0, 8, 32, 39, 19, 0, 6, + 3, 240, 49, 104, 65, 194, 65, 193, 81, 178, 85, 113, + 97, 161, 113, 145, 129, 114, 145, 97, 240, 106, 161, 240, + 49, 240, 57, 161, 240, 49, 240, 58, 0, 7, 96, 54, + 16, 240, 195, 162, 49, 177, 49, 177, 49, 39, 33, 49, + 114, 33, 49, 113, 49, 49, 113, 49, 49, 97, 65, 49, + 97, 69, 81, 81, 49, 65, 97, 49, 65, 97, 49, 49, + 113, 49, 33, 129, 49, 177, 49, 177, 49, 177, 49, 177, + 49, 241, 240, 240, 64, 44, 17, 240, 210, 240, 33, 240, + 17, 72, 65, 162, 65, 161, 81, 145, 97, 130, 22, 114, + 113, 98, 129, 82, 145, 65, 97, 65, 49, 130, 33, 178, + 49, 178, 225, 33, 193, 66, 145, 114, 82, 145, 0, 6, + 80, 54, 17, 240, 212, 178, 49, 193, 49, 193, 49, 40, + 33, 49, 129, 49, 49, 129, 49, 49, 113, 65, 49, 113, + 65, 49, 97, 21, 49, 82, 81, 49, 81, 97, 49, 65, + 113, 49, 49, 129, 49, 33, 145, 49, 193, 49, 193, 49, + 193, 49, 193, 49, 0, 6, 80, 36, 20, 0, 7, 124, + 240, 49, 240, 65, 210, 65, 225, 49, 241, 49, 241, 191, + 3, 240, 242, 240, 36, 241, 65, 209, 97, 193, 97, 193, + 97, 209, 65, 244, 0, 8, 80, 36, 16, 240, 194, 242, + 241, 241, 57, 49, 161, 65, 146, 65, 145, 81, 129, 97, + 114, 97, 113, 113, 97, 129, 81, 145, 50, 161, 33, 193, + 241, 241, 241, 241, 0, 6, 32, 61, 17, 240, 226, 195, + 33, 209, 33, 209, 33, 42, 17, 33, 97, 49, 33, 33, + 97, 49, 33, 33, 82, 34, 33, 33, 81, 49, 49, 33, + 66, 53, 33, 65, 49, 65, 33, 49, 65, 65, 33, 33, + 65, 81, 33, 97, 97, 33, 81, 113, 33, 209, 33, 209, + 33, 209, 33, 209, 33, 0, 6, 80, 39, 20, 240, 240, + 194, 240, 81, 240, 65, 240, 65, 240, 65, 240, 65, 240, + 75, 240, 240, 255, 3, 177, 240, 65, 240, 65, 240, 65, + 240, 65, 240, 65, 240, 65, 240, 65, 0, 8, 96, 38, + 20, 240, 240, 194, 240, 81, 240, 65, 240, 65, 240, 65, + 240, 75, 240, 175, 3, 33, 129, 240, 65, 240, 65, 234, + 240, 65, 240, 65, 155, 177, 240, 65, 240, 74, 0, 8, + 16, 36, 20, 240, 240, 210, 240, 65, 240, 65, 240, 65, + 240, 65, 240, 74, 0, 7, 113, 47, 2, 240, 244, 241, + 65, 209, 97, 193, 97, 193, 97, 209, 65, 244, 0, 8, + 80, 42, 19, 0, 6, 3, 240, 49, 240, 49, 105, 49, + 113, 161, 113, 161, 113, 161, 113, 165, 49, 131, 113, 53, + 33, 116, 113, 240, 49, 145, 129, 162, 97, 177, 240, 49, + 240, 49, 240, 57, 0, 7, 96, 54, 17, 240, 227, 178, + 49, 193, 49, 193, 49, 40, 33, 49, 65, 113, 49, 65, + 113, 49, 65, 113, 49, 65, 113, 49, 65, 117, 65, 113, + 49, 65, 113, 49, 65, 53, 49, 68, 65, 49, 193, 49, + 193, 49, 193, 49, 193, 49, 193, 49, 240, 17, 240, 240, + 96, 37, 20, 0, 7, 123, 161, 240, 65, 240, 65, 240, + 74, 241, 240, 65, 240, 65, 113, 47, 3, 161, 240, 52, + 241, 65, 209, 97, 193, 97, 193, 97, 209, 65, 244, 0, + 8, 80, 39, 16, 240, 194, 240, 17, 241, 57, 49, 65, + 161, 65, 161, 65, 161, 65, 161, 65, 161, 72, 49, 129, + 97, 129, 97, 129, 82, 134, 17, 38, 113, 241, 241, 241, + 241, 241, 240, 240, 64, 43, 19, 240, 227, 240, 49, 240, + 49, 105, 49, 209, 65, 209, 65, 209, 65, 209, 65, 105, + 53, 49, 161, 113, 161, 113, 161, 113, 101, 119, 65, 240, + 49, 240, 49, 240, 49, 240, 49, 240, 49, 0, 7, 112, + 55, 16, 240, 193, 178, 50, 177, 49, 177, 49, 39, 33, + 49, 114, 33, 49, 113, 49, 49, 113, 49, 49, 39, 33, + 49, 49, 117, 49, 113, 49, 49, 113, 49, 49, 98, 49, + 49, 36, 17, 49, 51, 81, 49, 177, 49, 177, 49, 177, + 49, 177, 49, 241, 240, 240, 64, 47, 16, 240, 194, 163, + 49, 177, 49, 39, 33, 49, 114, 33, 49, 113, 49, 49, + 114, 37, 54, 33, 49, 49, 113, 49, 49, 113, 49, 49, + 68, 49, 53, 49, 49, 240, 122, 113, 113, 113, 113, 113, + 113, 121, 113, 0, 7, 32, 29, 19, 0, 9, 107, 240, + 49, 240, 49, 240, 49, 139, 145, 240, 49, 240, 49, 240, + 59, 209, 240, 49, 240, 49, 175, 2, 0, 14, 64, 36, + 20, 240, 240, 219, 240, 65, 240, 65, 155, 161, 240, 65, + 240, 75, 225, 240, 65, 175, 3, 240, 163, 98, 177, 113, + 185, 177, 113, 177, 113, 185, 177, 113, 0, 8, 32, 26, + 19, 0, 9, 107, 240, 49, 240, 49, 240, 49, 139, 145, + 240, 49, 240, 49, 240, 59, 0, 7, 111, 2, 0, 14, + 64, 48, 19, 240, 227, 240, 49, 240, 49, 105, 49, 113, + 82, 49, 113, 81, 65, 113, 81, 65, 113, 81, 69, 49, + 81, 65, 113, 81, 65, 120, 49, 113, 161, 240, 49, 145, + 129, 162, 97, 177, 240, 49, 240, 49, 129, 153, 0, 7, + 96, 38, 16, 240, 195, 241, 241, 241, 41, 65, 49, 87, + 49, 82, 65, 49, 82, 65, 49, 82, 65, 49, 81, 81, + 49, 87, 56, 65, 49, 177, 241, 241, 241, 241, 241, 241, + 0, 6, 32, 46, 17, 240, 211, 240, 17, 240, 17, 57, + 65, 65, 102, 65, 97, 65, 65, 97, 65, 65, 97, 65, + 65, 102, 65, 97, 65, 72, 65, 65, 177, 240, 17, 98, + 129, 129, 113, 129, 240, 17, 240, 17, 240, 26, 0, 6, + 80, 40, 16, 240, 195, 241, 241, 241, 41, 65, 49, 97, + 65, 49, 97, 65, 49, 97, 65, 49, 97, 65, 49, 97, + 65, 49, 97, 65, 56, 65, 49, 177, 241, 241, 241, 241, + 241, 241, 0, 6, 32, 28, 20, 0, 8, 115, 146, 129, + 161, 129, 161, 129, 170, 161, 129, 161, 129, 161, 129, 170, + 161, 129, 0, 8, 47, 3, 0, 15, 32, 49, 20, 0, + 6, 51, 240, 65, 162, 113, 194, 81, 178, 97, 178, 97, + 177, 113, 162, 113, 161, 17, 101, 81, 49, 81, 129, 81, + 65, 113, 114, 33, 97, 129, 49, 240, 65, 240, 65, 240, + 65, 240, 65, 240, 65, 240, 65, 0, 5, 96, 58, 18, + 0, 6, 19, 194, 49, 97, 97, 49, 114, 65, 49, 114, + 65, 49, 114, 65, 49, 113, 81, 49, 98, 81, 49, 97, + 17, 69, 81, 49, 49, 49, 65, 66, 33, 49, 49, 98, + 17, 49, 33, 161, 49, 209, 49, 209, 49, 209, 49, 209, + 49, 209, 49, 240, 33, 240, 240, 128, 42, 17, 240, 194, + 240, 34, 130, 97, 129, 113, 114, 113, 113, 54, 99, 113, + 82, 33, 97, 65, 82, 65, 49, 113, 65, 240, 154, 240, + 17, 240, 17, 122, 129, 240, 17, 240, 17, 240, 26, 0, + 6, 80, 42, 17, 240, 209, 240, 35, 115, 97, 129, 113, + 129, 113, 113, 129, 99, 113, 82, 33, 97, 66, 65, 81, + 49, 113, 65, 33, 209, 212, 114, 97, 145, 97, 152, 145, + 97, 145, 97, 152, 145, 0, 7, 80, 47, 18, 0, 6, + 2, 129, 129, 101, 97, 81, 66, 81, 65, 98, 65, 65, + 118, 65, 98, 65, 81, 67, 65, 101, 97, 240, 33, 240, + 195, 66, 161, 81, 162, 81, 162, 66, 145, 34, 18, 18, + 97, 67, 50, 50, 193, 0, 7, 55, 17, 240, 209, 210, + 35, 193, 49, 193, 49, 81, 97, 49, 68, 65, 49, 49, + 50, 49, 49, 33, 82, 33, 49, 33, 85, 49, 33, 82, + 33, 49, 49, 50, 49, 49, 68, 65, 49, 193, 49, 193, + 49, 193, 49, 193, 49, 193, 49, 193, 49, 240, 17, 0, + 6, 80, 33, 19, 0, 8, 17, 240, 21, 210, 50, 178, + 82, 161, 113, 161, 113, 161, 113, 177, 81, 213, 240, 17, + 240, 49, 240, 49, 240, 49, 175, 2, 0, 14, 64, 40, + 21, 240, 226, 240, 53, 241, 81, 209, 113, 193, 113, 193, + 113, 209, 81, 247, 194, 82, 209, 82, 65, 47, 3, 178, + 240, 53, 241, 81, 209, 113, 193, 113, 193, 113, 209, 81, + 245, 0, 9, 46, 18, 240, 227, 145, 114, 116, 97, 97, + 65, 81, 81, 97, 65, 81, 97, 65, 81, 97, 65, 97, + 65, 81, 116, 97, 226, 17, 59, 49, 129, 129, 129, 54, + 129, 129, 240, 33, 114, 240, 33, 240, 33, 240, 43, 0, + 7, 64, 17, 240, 240, 244, 97, 66, 49, 68, 65, 49, + 50, 50, 33, 49, 49, 81, 33, 49, 49, 81, 33, 49, + 50, 50, 33, 49, 69, 49, 49, 193, 49, 40, 33, 49, + 97, 81, 49, 97, 81, 49, 97, 21, 49, 97, 81, 49, + 97, 81, 49, 97, 81, 49, 97, 81, 49, 97, 81, 49, + 240, 17, 240, 240, 96, 41, 19, 240, 240, 242, 240, 21, + 209, 81, 177, 113, 161, 113, 161, 113, 177, 81, 213, 0, + 5, 111, 2, 113, 81, 193, 81, 193, 81, 193, 81, 193, + 81, 193, 81, 193, 81, 240, 49, 240, 240, 240, 27, 19, + 0, 8, 17, 240, 21, 210, 50, 177, 113, 161, 113, 161, + 113, 161, 113, 177, 66, 213, 0, 10, 79, 2, 0, 14, + 64, 36, 21, 240, 241, 240, 53, 241, 81, 209, 113, 193, + 113, 193, 113, 209, 81, 245, 0, 6, 1, 47, 3, 0, + 6, 27, 177, 113, 193, 113, 193, 113, 202, 177, 0, 9, + 96, 38, 21, 240, 226, 240, 53, 241, 81, 209, 113, 193, + 113, 193, 113, 209, 81, 245, 0, 6, 1, 47, 3, 177, + 240, 69, 241, 81, 209, 113, 193, 113, 193, 113, 209, 81, + 245, 0, 9, 47, 17, 240, 210, 240, 34, 114, 113, 100, + 97, 81, 65, 81, 65, 97, 65, 65, 97, 65, 65, 97, + 65, 81, 65, 81, 100, 97, 240, 17, 240, 17, 197, 42, + 65, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 0, + 6, 80, 43, 15, 240, 240, 163, 82, 113, 68, 97, 49, + 65, 81, 33, 97, 65, 33, 97, 65, 33, 97, 65, 49, + 65, 81, 68, 97, 225, 195, 98, 97, 113, 97, 120, 113, + 97, 113, 97, 120, 113, 97, 0, 5, 112, 44, 18, 240, + 227, 240, 34, 240, 33, 72, 81, 162, 81, 161, 97, 146, + 97, 130, 38, 130, 113, 113, 34, 81, 97, 66, 65, 66, + 98, 49, 49, 209, 113, 145, 130, 113, 145, 240, 33, 240, + 33, 240, 42, 0, 7, 56, 17, 240, 211, 179, 49, 193, + 49, 193, 49, 39, 49, 49, 114, 49, 49, 113, 65, 49, + 113, 65, 49, 97, 36, 49, 82, 81, 49, 81, 17, 65, + 49, 65, 49, 49, 49, 49, 82, 17, 49, 33, 145, 49, + 193, 49, 193, 49, 193, 49, 193, 49, 193, 49, 0, 6, + 80, 35, 20, 0, 8, 10, 240, 34, 240, 33, 240, 35, + 227, 53, 99, 240, 240, 95, 3, 177, 240, 65, 234, 240, + 65, 240, 65, 170, 177, 240, 65, 240, 74, 0, 8, 16, + 38, 20, 0, 8, 10, 240, 34, 240, 33, 240, 35, 227, + 53, 99, 240, 240, 95, 3, 177, 240, 65, 18, 178, 49, + 49, 177, 113, 185, 177, 113, 177, 113, 185, 177, 113, 0, + 8, 32, 36, 19, 0, 7, 74, 240, 33, 240, 33, 240, + 18, 242, 36, 131, 129, 97, 240, 240, 95, 2, 240, 240, + 219, 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, 0, + 7, 96, 59, 18, 240, 240, 241, 36, 194, 49, 84, 65, + 49, 209, 49, 55, 49, 49, 130, 49, 49, 129, 65, 49, + 114, 65, 49, 113, 36, 49, 98, 81, 49, 82, 17, 65, + 49, 66, 50, 33, 49, 49, 98, 17, 49, 33, 161, 49, + 209, 49, 209, 49, 209, 49, 209, 49, 240, 33, 240, 240, + 128, 36, 15, 240, 161, 242, 225, 225, 41, 49, 49, 161, + 49, 161, 49, 161, 55, 65, 49, 161, 49, 161, 49, 131, + 49, 68, 33, 53, 97, 225, 225, 225, 225, 225, 0, 5, + 112, 33, 16, 240, 240, 210, 241, 57, 49, 65, 161, 65, + 161, 72, 49, 65, 161, 65, 131, 73, 33, 67, 129, 240, + 137, 241, 241, 106, 129, 241, 249, 0, 6, 32, 41, 16, + 240, 193, 240, 18, 193, 33, 58, 33, 241, 67, 49, 65, + 97, 49, 65, 97, 49, 65, 97, 49, 65, 97, 49, 50, + 44, 17, 49, 177, 240, 122, 241, 241, 241, 241, 241, 241, + 240, 240, 64, 42, 20, 0, 6, 51, 149, 81, 107, 33, + 240, 65, 163, 97, 130, 50, 65, 129, 81, 69, 65, 81, + 65, 130, 50, 65, 163, 97, 240, 250, 240, 65, 240, 65, + 170, 177, 240, 65, 240, 74, 0, 8, 16, 43, 20, 0, + 6, 51, 149, 81, 240, 65, 107, 33, 163, 97, 145, 49, + 81, 129, 81, 69, 65, 81, 65, 129, 81, 65, 145, 49, + 81, 163, 97, 240, 250, 177, 113, 177, 113, 177, 113, 185, + 177, 0, 9, 32, 48, 20, 240, 240, 17, 240, 82, 150, + 65, 240, 65, 107, 33, 240, 65, 164, 81, 130, 65, 65, + 129, 97, 49, 129, 97, 53, 81, 65, 65, 164, 81, 177, + 113, 177, 68, 106, 49, 240, 65, 240, 65, 240, 65, 240, + 65, 0, 8, 32, 44, 20, 0, 6, 51, 149, 81, 240, + 65, 107, 33, 163, 97, 130, 49, 81, 129, 81, 65, 129, + 81, 65, 130, 50, 69, 99, 97, 177, 113, 185, 101, 129, + 145, 145, 162, 240, 65, 240, 65, 240, 74, 0, 8, 16, + 33, 19, 0, 7, 102, 240, 237, 165, 209, 66, 177, 98, + 161, 98, 161, 98, 177, 66, 213, 209, 66, 193, 81, 193, + 81, 193, 81, 65, 47, 2, 0, 12, 16, 38, 20, 0, + 5, 102, 240, 254, 180, 241, 65, 209, 97, 193, 97, 193, + 97, 209, 65, 244, 240, 239, 3, 177, 240, 65, 240, 65, + 240, 65, 240, 65, 240, 65, 240, 65, 0, 6, 32, 13, + 5, 240, 240, 162, 51, 35, 65, 49, 49, 0, 6, 16, + 12, 5, 240, 243, 35, 240, 240, 35, 35, 240, 240, 112, +}; + +tFont *g_psFontWCustomr20pt = (tFont *)g_pui8Customr20pt; diff --git a/third_party/fonts/lang_demo/langremap.c b/third_party/fonts/lang_demo/langremap.c new file mode 100644 index 0000000..abd02d6 --- /dev/null +++ b/third_party/fonts/lang_demo/langremap.c @@ -0,0 +1,548 @@ +//***************************************************************************** +// +// langremap.c - Source file for a compressed string table. +// +// Copyright (c) 2008 Texas Instruments Incorporated. All rights reserved. +// TI Information - Selective Disclosure +// +// This is an auto-generated file. Do not edit by hand. +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +// +// The auto-generated string table and associated data. +// +const uint8_t g_pui8Tablelangremap[] = +{ + // + // Number of Strings + // + 0x16, 0x00, + + // + // Number of Languages + // + 0x07, 0x00, + + // + // Language Identifier Table + // + ((GrLangEnUS) & 0xff), ((GrLangEnUS) >> 8) & 0xff, + ((GrLangDe) & 0xff), ((GrLangDe) >> 8) & 0xff, + ((GrLangEsSP) & 0xff), ((GrLangEsSP) >> 8) & 0xff, + ((GrLangIt) & 0xff), ((GrLangIt) >> 8) & 0xff, + ((GrLangZhPRC) & 0xff), ((GrLangZhPRC) >> 8) & 0xff, + ((GrLangKo) & 0xff), ((GrLangKo) >> 8) & 0xff, + ((GrLangJp) & 0xff), ((GrLangJp) >> 8) & 0xff, + + // + // Language GrLangEnUS + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x21, 0x00, 0x00, 0x00, // STR_CHINESE + 0x24, 0x00, 0x00, 0x00, // STR_KOREAN + 0x28, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x2b, 0x00, 0x00, 0x00, // STR_APPNAME + 0x35, 0x00, 0x00, 0x00, // STR_PLUS + 0x37, 0x00, 0x00, 0x00, // STR_MINUS + 0x39, 0x00, 0x00, 0x00, // STR_CONFIG + 0x81, 0x00, 0x00, 0x00, // STR_INTRO + 0xc3, 0x00, 0x00, 0x00, // STR_UPDATE + 0x02, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0x2a, 0x01, 0x00, 0x00, // STR_INTRO_1 + 0x92, 0x03, 0x0e, 0x10, // STR_INTRO_2 + 0xcb, 0x05, 0x00, 0x00, // STR_INTRO_3 + 0xca, 0x07, 0x00, 0x00, // STR_UPDATE_TEXT + 0x61, 0x0b, 0x0c, 0x28, // STR_UPDATING + 0x69, 0x0b, 0x00, 0x00, // STR_UART + 0x7c, 0x0b, 0x00, 0x00, // STR_MAC + 0x81, 0x0b, 0x00, 0x00, // STR_HEXDIGITS + + // + // Language GrLangDe + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x21, 0x00, 0x00, 0x00, // STR_CHINESE + 0x24, 0x00, 0x00, 0x00, // STR_KOREAN + 0x28, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x2b, 0x00, 0x00, 0x00, // STR_APPNAME + 0x35, 0x00, 0x00, 0x00, // STR_PLUS + 0x37, 0x00, 0x00, 0x00, // STR_MINUS + 0x47, 0x00, 0x00, 0x00, // STR_CONFIG + 0x8e, 0x00, 0x00, 0x00, // STR_INTRO + 0xca, 0x00, 0x00, 0x00, // STR_UPDATE + 0x0b, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0x9e, 0x01, 0x00, 0x00, // STR_INTRO_1 + 0xf5, 0x03, 0x02, 0x10, // STR_INTRO_2 + 0x1d, 0x06, 0x00, 0x00, // STR_INTRO_3 + 0x59, 0x08, 0x00, 0x00, // STR_UPDATE_TEXT + 0xff, 0xff, 0x0c, 0x70, // STR_UPDATING + 0x69, 0x0b, 0x00, 0x00, // STR_UART + 0x7c, 0x0b, 0x00, 0x00, // STR_MAC + 0x81, 0x0b, 0x00, 0x00, // STR_HEXDIGITS + + // + // Language GrLangEsSP + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x21, 0x00, 0x00, 0x00, // STR_CHINESE + 0x24, 0x00, 0x00, 0x00, // STR_KOREAN + 0x28, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x2b, 0x00, 0x00, 0x00, // STR_APPNAME + 0x35, 0x00, 0x00, 0x00, // STR_PLUS + 0x37, 0x00, 0x00, 0x00, // STR_MINUS + 0x55, 0x00, 0x00, 0x00, // STR_CONFIG + 0x99, 0x00, 0x00, 0x00, // STR_INTRO + 0xd9, 0x00, 0x00, 0x00, // STR_UPDATE + 0x13, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0x14, 0x02, 0x03, 0x10, // STR_INTRO_1 + 0x74, 0x04, 0x00, 0x00, // STR_INTRO_2 + 0x81, 0x06, 0x00, 0x00, // STR_INTRO_3 + 0x13, 0x09, 0x00, 0x00, // STR_UPDATE_TEXT + 0x65, 0x0b, 0x0c, 0x48, // STR_UPDATING + 0x69, 0x0b, 0x00, 0x00, // STR_UART + 0x7c, 0x0b, 0x00, 0x00, // STR_MAC + 0x81, 0x0b, 0x00, 0x00, // STR_HEXDIGITS + + // + // Language GrLangIt + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x21, 0x00, 0x00, 0x00, // STR_CHINESE + 0x24, 0x00, 0x00, 0x00, // STR_KOREAN + 0x28, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x2b, 0x00, 0x00, 0x00, // STR_APPNAME + 0x35, 0x00, 0x00, 0x00, // STR_PLUS + 0x37, 0x00, 0x00, 0x00, // STR_MINUS + 0x63, 0x00, 0x00, 0x00, // STR_CONFIG + 0xa6, 0x00, 0x00, 0x00, // STR_INTRO + 0xe7, 0x00, 0x00, 0x00, // STR_UPDATE + 0x1a, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0x64, 0x02, 0x00, 0x00, // STR_INTRO_1 + 0xd8, 0x04, 0x00, 0x00, // STR_INTRO_2 + 0xd5, 0x06, 0x00, 0x00, // STR_INTRO_3 + 0xba, 0x09, 0x00, 0x00, // STR_UPDATE_TEXT + 0xff, 0xff, 0x0c, 0x68, // STR_UPDATING + 0x69, 0x0b, 0x00, 0x00, // STR_UART + 0x7c, 0x0b, 0x00, 0x00, // STR_MAC + 0x81, 0x0b, 0x00, 0x00, // STR_HEXDIGITS + + // + // Language GrLangZhPRC + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x21, 0x00, 0x00, 0x00, // STR_CHINESE + 0x24, 0x00, 0x00, 0x00, // STR_KOREAN + 0x28, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x2b, 0x00, 0x00, 0x00, // STR_APPNAME + 0x35, 0x00, 0x00, 0x00, // STR_PLUS + 0x37, 0x00, 0x00, 0x00, // STR_MINUS + 0x72, 0x00, 0x00, 0x00, // STR_CONFIG + 0xb3, 0x00, 0x00, 0x00, // STR_INTRO + 0xf5, 0x00, 0x00, 0x00, // STR_UPDATE + 0x21, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0xd0, 0x02, 0x00, 0x00, // STR_INTRO_1 + 0x44, 0x05, 0x0a, 0x18, // STR_INTRO_2 + 0x40, 0x07, 0x00, 0x00, // STR_INTRO_3 + 0x63, 0x0a, 0x00, 0x00, // STR_UPDATE_TEXT + 0xff, 0xff, 0x0c, 0x10, // STR_UPDATING + 0x69, 0x0b, 0x00, 0x00, // STR_UART + 0x7c, 0x0b, 0x00, 0x00, // STR_MAC + 0x81, 0x0b, 0x00, 0x00, // STR_HEXDIGITS + + // + // Language GrLangKo + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x21, 0x00, 0x00, 0x00, // STR_CHINESE + 0x24, 0x00, 0x00, 0x00, // STR_KOREAN + 0x28, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x2b, 0x00, 0x00, 0x00, // STR_APPNAME + 0x35, 0x00, 0x00, 0x00, // STR_PLUS + 0x37, 0x00, 0x00, 0x00, // STR_MINUS + 0x76, 0x00, 0x00, 0x00, // STR_CONFIG + 0xb8, 0x00, 0x00, 0x00, // STR_INTRO + 0xf8, 0x00, 0x00, 0x00, // STR_UPDATE + 0x24, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0xff, 0x02, 0x00, 0x00, // STR_INTRO_1 + 0x65, 0x05, 0x0a, 0x20, // STR_INTRO_2 + 0x63, 0x07, 0x00, 0x00, // STR_INTRO_3 + 0xa7, 0x0a, 0x00, 0x00, // STR_UPDATE_TEXT + 0xd0, 0x0a, 0x06, 0x00, // STR_UPDATING + 0x69, 0x0b, 0x00, 0x00, // STR_UART + 0x7c, 0x0b, 0x00, 0x00, // STR_MAC + 0x81, 0x0b, 0x00, 0x00, // STR_HEXDIGITS + + // + // Language GrLangJp + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x21, 0x00, 0x00, 0x00, // STR_CHINESE + 0x24, 0x00, 0x00, 0x00, // STR_KOREAN + 0x28, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x2b, 0x00, 0x00, 0x00, // STR_APPNAME + 0x35, 0x00, 0x00, 0x00, // STR_PLUS + 0x37, 0x00, 0x00, 0x00, // STR_MINUS + 0x7b, 0x00, 0x00, 0x00, // STR_CONFIG + 0xbd, 0x00, 0x00, 0x00, // STR_INTRO + 0xf5, 0x00, 0x00, 0x00, // STR_UPDATE + 0x27, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0x51, 0x03, 0x00, 0x00, // STR_INTRO_1 + 0x9a, 0x05, 0x00, 0x00, // STR_INTRO_2 + 0x9a, 0x07, 0x00, 0x00, // STR_INTRO_3 + 0x05, 0x0b, 0x00, 0x00, // STR_UPDATE_TEXT + 0xff, 0xff, 0x0c, 0x10, // STR_UPDATING + 0x69, 0x0b, 0x00, 0x00, // STR_UART + 0x7c, 0x0b, 0x00, 0x00, // STR_MAC + 0x81, 0x0b, 0x00, 0x00, // STR_HEXDIGITS + + // + // Compressed String Table + // + 0x19, 0x05, 0x0e, 0x07, 0x04, 0x0a, 0x0f, 0x00, '"', 0x06, + 0x03, 0x07, 0x04, 0x03, 0x05, 0x08, 0x00, '$', 0x02, 0x0c, + 0x06, 0x0a, 0x0d, 0x0f, 0x00, 0x19, 0x0a, 0x10, 0x03, '8', + 0x08, 0x07, 0x00, '=', '>', 0x00, 'C', 'B', ')', 0x00, + '?', '@', 0x00, 0x07, 0x03, 0x05, 0x0e, '7', 0x0b, 0x02, + 0x11, 0x08, 0x00, 0x1e, 0x00, 0x13, 0x00, '*', 0x08, 0x05, + 0x12, 0x04, 0x0e, 0x0c, 0x09, 0x03, 0x06, 0x04, 0x08, 0x05, + 0x00, 'm', 0x08, 0x05, 0x12, 0x04, 0x0e, 0x0c, 0x09, 0x03, + 0x06, 0x04, 0x08, 0x05, 0x00, '*', 0x08, 0x05, 0x12, 0x04, + 0x0e, 0x0c, 0x09, 0x03, 0x0d, 0x04, '9', 0x05, 0x00, '*', + 0x08, 0x05, 0x12, 0x04, 0x0e, 0x0c, 0x09, 0x03, 0x1a, 0x04, + 0x08, 0x05, 0x02, 0x00, 0xc2, 0x91, 'b', 0x00, 0xc2, 0x94, + 0xc2, 0x9c, 0x00, '<', 0xc3, 0xb9, 0xc3, 0xb0, 0x00, '"', + 0x05, 0x06, 0x09, 0x08, 0x0b, 0x0c, 0x0d, 0x06, 0x04, 0x08, + 0x05, 0x00, 0x19, 0x04, 0x05, 0x12, 'p', 0x0f, 0x09, 0x0c, + 0x05, 0x0e, 0x00, '"', 0x05, 0x06, 0x09, 0x08, 0x0b, 0x0c, + 0x0d, 0x0d, 0x04, '9', 0x05, 0x00, '"', 0x05, 0x06, 0x09, + 0x08, 0x0b, 0x0c, 0x1a, 0x04, 0x08, 0x05, 0x02, 0x00, 0xc4, + 0x80, 0xc3, 0x8f, 0x00, 0xc2, 0x9d, 0xc4, 0x8b, 0x00, 'K', + 0xc2, 0xb7, 0xc2, 0xba, 0x00, 0x27, 0x10, 0x0b, 0x03, 0x06, + 0x02, 0x00, 0x16, '+', 0x06, 0x0c, 0x03, 0x07, 0x04, 0x0a, + 0x04, 0x02, 0x09, 0x0c, 0x05, 0x0e, 0x00, 0x16, 0x0d, 0x06, + 0x0c, 0x03, 0x07, 0x04, 0x1a, 0x03, 0x0d, 0x04, '9', 0x05, + 0x00, 0x16, 0x0e, 0x0e, 0x04, 0x08, 0x09, 0x05, 0x03, 0x11, + 0x02, 0x05, 0x06, 0x08, 0x00, 'G', 'F', 0x00, 0xc4, 0xa4, + 0xc4, 0x9c, 0xc4, 0x8d, 0xc2, 0xa9, 'U', 0x00, '%', 0x03, + 0x05, 0x0e, 0x0c, 0x03, 0x0e, 0x02, 0x00, ',', 0x10, 0x09, + 0x03, 0x0d, 0x0f, 0x02, 0x00, '"', 0x0b, 0x04, 0x08, 0x11, + 0x03, 0x00, '%', 0x04, 0x05, 0x0e, 0x0c, 0x03, 0x00, 'e', + 'H', 0x00, 'i', ')', 0x00, 'H', 'd', 0x00, 0x1c, 0x0f, + 0x04, 0x0a, 0x01, 0x03, 0x10, 0x10, 0x07, 0x04, 0x0d, 0x03, + 0x06, 0x04, 0x08, 0x05, 0x01, 0x0b, 0x02, 0x11, 0x08, 0x05, + 0x0a, 0x06, 0x09, 0x03, 0x06, 0x02, 0x0a, 0x01, 0x06, 0x0f, + 0x02, 0x01, 0x0d, 0x03, 0x10, 0x03, 0x15, 0x04, 0x07, 0x04, + 0x06, 0x04, 0x02, 0x0a, 0x01, 0x08, 0x12, 0x01, 0x06, 0x0f, + 0x02, 0x01, 0x07, 0x03, 0x05, 0x0e, 0x0c, 0x03, 0x0e, 0x02, + 0x01, 0x0a, 0x0c, 0x10, 0x10, 0x08, 0x09, 0x06, 0x01, 0x10, + 0x09, 0x08, '&', 0x04, 0x0b, 0x02, 0x0b, 0x01, 0x1d, 0x04, + 0x06, 0x0f, 0x01, 0x06, 0x0f, 0x02, 0x01, 0x1c, 0x04, '&', + 0x03, 'D', 0x03, 0x09, 0x02, 0x01, 'Q', 0x09, 0x03, 0x10, + 0x0f, 0x04, 0x0d, 0x0a, 0x01, '%', 0x04, 0x15, 0x09, 0x03, + 0x09, '(', 0x1b, 0x00, '$', 0x04, 0x02, 0x0a, 0x02, 0x01, + 0x16, 0x05, 0x1d, 0x02, 0x05, 0x0b, 0x0c, 0x05, 0x0e, 0x01, + 0x1a, 0x02, 0x04, 0x0e, 0x06, 0x01, 0x0b, 0x04, 0x02, 0x01, + '4', 0xc2, 0xb1, 0x0f, 0x04, 0x0e, '+', 0x02, 0x04, 0x06, + 0x02, 0x05, 0x01, 0x0b, 0x02, 0x09, 0x01, ',', 0x10, 0x09, + 0x03, 0x0d, 0x0f, 0x0c, 0x05, 0x06, 0x02, 0x09, 0x0a, 0x06, + 'p', 0x06, 0x1a, 0x0c, 0x05, 0x0e, 'O', 0x01, 0x0b, 0x04, + 0x02, 0x01, 0x11, 0x04, 0x06, 0x01, 0x0b, 0x02, 0x09, 0x01, + 0x1c, 0x04, '&', 0x03, 'D', 0x03, 0x09, 0x02, 0x01, 'Q', + 0x09, 0x03, 0x10, 0x0f, 0x04, 0x0d, 0x0a, 0x01, '%', 0x04, + 0x15, 0x09, 0x03, 0x09, '(', 0x01, 0x0e, 0x02, 0x07, 0x04, + 0x02, 0x12, 0x02, 0x09, 0x06, 0x01, 0x1d, 0x04, 0x09, 0x0b, + 0x1b, 0x00, 0x06, 0x03, 0x01, 0x03, 0x10, 0x07, 0x04, 0x0d, + 0x03, 0x0d, 0x04, '9', 0x05, 0x01, 0x0b, 0x02, 0x11, 0x0c, + 0x02, 0x0a, 0x06, 0x09, 0x03, 0x01, 0x07, 0x03, 0x0a, 0x01, + 0x12, 0x0c, 0x05, 0x0d, 0x04, 0x08, 0x05, 0x02, 0x0a, 0x01, + 0xc2, 0xaf, 0x0c, 0x02, 0x01, 0x08, 0x12, 0x09, 0x02, 0x0d, + 0x02, 0x01, 0x07, 0x03, 0x01, 0x1c, 0x04, '&', 0x03, 'D', + 0x03, 0x09, 0x02, 0x01, 'Q', 0x09, 0x03, 0x10, 0x0f, 0x04, + 0x0d, 0x0a, 0x01, '%', 0x04, 0x15, 0x09, 0x03, 0x09, '(', + 0x1b, 0x00, 0xc2, 0xab, 0x0c, 0x02, 0x0a, 0x06, 0x03, 0x01, + 0x03, 0x10, 0x10, 0x07, 0x04, 0x0d, 0x03, 0x1a, 0x04, 0x08, + 0x05, 0x02, 0x01, 0x12, 0x08, 0x09, 0x05, 0x04, 0x0a, 0x0d, + 0x02, 0x01, 0x07, 0x02, 0x01, 0x12, 0x0c, 0x05, 0x1a, 0x04, + 0x08, 0x05, 0x03, 0x07, 0x04, 0x06, 0x03, 0x01, 0x0b, 0x04, + 0x01, 0x0a, 0x0c, 0x10, 0x10, 0x08, 0x09, 0x06, 0x08, 0x01, + 0x07, 0x04, 0x05, 0x0e, 0x0c, 0x04, 0x0a, 0x06, 0x04, 0x0d, + 0x08, 0x01, 0x04, 0x05, 0x0d, 0x07, 0x0c, 0x0a, 0x02, 0x01, + 0x04, 0x05, 0x01, 0x1c, 0x04, '&', 0x03, 'D', 0x03, 0x09, + 0x02, 0x01, 'Q', 0x09, 0x03, 0x10, 0x0f, 0x04, 0x0d, 0x0a, + 0x01, '%', 0x04, 0x15, 0x09, 0x03, 0x09, '(', 0x1b, 0x00, + 0xc3, 0xbc, 0xc3, 0xa8, 0xc2, 0x8a, 0xc2, 0x8d, 0xc2, 0x86, + 0xc3, 0xbd, 0xc2, 0x8b, 0xc3, 0x8d, 0x1c, 0x04, '&', 0x03, + 'D', 0x03, 0x09, 0x02, 0xc3, 0xa0, 0xc3, 0xaa, 0xc3, 0xa7, + 0xc2, 0x88, 0xc2, 0x82, 'A', 'e', 'H', 0xc3, 0xb4, 0xc3, + 0xb1, 'A', 'c', 0xc3, 0x97, ';', 0x00, '.', 0x01, 0xc4, + 0xb0, 0xc4, 0xaa, 0x01, 0xc2, 0xa8, 0xc4, 0x9b, 0xc2, 0x95, + 0xc4, 0x9a, 'j', 0x01, 0x1c, 0x04, '&', 0x03, 'D', 0x03, + 0x09, 0x02, 0x01, 0xc2, 0x95, 0xc4, 0x99, 0xc4, 0xbb, 0x01, + 0xc4, 0x98, '.', 0xc4, 0xa2, 0xc2, 0x99, 0xc2, 0x9a, 0xc2, + 0xa2, 0x01, 0xc4, 0xbd, 0xc4, 0x90, 0x01, 0xc4, 0xb4, 0xc4, + 0x8e, 0xc4, 0x97, 'g', 0x01, 'i', ')', 0x01, 'k', 0xc4, + 0xab, 0x01, 0xc4, 0x8f, 0xc4, 0x93, 0xc2, 0xa3, 0x01, 'h', + 0xc2, 0xa1, 0xc4, 0xb6, 0xc2, 0x97, 'U', 0x1b, 0x00, 'Y', + '<', 'w', 0xc3, 0x87, '`', 0xc3, 0x81, 'S', 'y', 0xc3, + 0x8c, 'a', 'J', 'K', ':', 0xc3, 0x84, '^', 'M', '<', + 0xc3, 0x80, 'M', '_', ']', '{', 0xc2, 0xbf, 'M', 'x', + 0xc3, 0x86, 'M', '`', 'J', 0xc2, 0x88, 0xc2, 0x82, 't', + 'v', 'L', 'H', 'd', 0xc3, 0x82, 0xc3, 0x88, 'S', '|', + '<', 0xc3, 0xba, 'c', '-', 0xc2, 0x8b, 'I', 'Z', 'r', + 'R', 'E', ';', 0x00, 0x02, 0x01, 0x0d, 0x08, 0x05, 0x12, + 0x04, 0x0e, 0x0c, 0x09, 0x03, 0x06, 0x04, 0x08, 0x05, 0x01, + 0x10, 0x03, 0x05, 0x02, 0x07, 0x01, 0x03, 0x07, 0x07, 0x08, + 0x1d, 0x0a, 0x01, 0x06, 0x0f, 0x02, 0x01, 0x07, 0x03, 0x05, + 0x0e, 0x0c, 0x03, 0x0e, 0x02, 0x01, 0x06, 0x08, 0x01, 0x15, + 0x02, 0x01, 0x0a, 0x1d, 0x04, 0x06, 0x0d, 0x0f, 0x02, 0x0b, + 0x01, 0x03, 0x05, 0x0b, 0x01, 0x06, 0x0f, 0x02, 0x01, 0x02, + 0x12, 0x12, 0x02, 0x0d, 0x06, 0x0a, 0x01, 0x1d, 0x04, 0x07, + 0x07, 0x01, 0x15, 0x02, 0x01, 0x0a, 0x02, 0x02, 0x05, 0x01, + 0x04, 0x11, 0x11, 0x02, 0x0b, 0x04, 0x03, 0x06, 0x02, 0x07, + '(', 0x1b, 0x00, 0x09, 0x01, 'm', 0x08, 0x05, 0x12, 0x04, + 0x0e, 0x0c, 0x09, 0x03, 0x06, 0x04, 0x08, 0x05, 0x0a, 0x15, + 0x02, 0x09, 0x02, 0x04, 0x0d, 0x0f, 0x01, 0x02, 0x09, 0x11, + 'o', 0x0e, 0x07, 0x04, 0x0d, 0x0f, 0x06, 0x01, 0x0b, 0x02, + 0x11, 0x01, 'P', 0x02, 0x05, 0x0c, 0x06, 0x1a, 0x02, 0x09, + 0x01, 0x02, 0x04, 0x05, 0x02, 0x01, 0x0a, 0x08, 0x12, 0x08, + 0x09, 0x06, 0x04, 0x0e, 0x02, 0x01, 0xc2, 0xb0, 0x05, 0x0b, + 0x02, 0x09, 0x0c, 0x05, 0x0e, 0x01, 0x0b, 0x02, 0x09, 0x01, + ',', 0x10, 0x09, 0x03, 0x0d, 0x0f, 0x02, 0x1b, 0x01, '$', + 0x04, 0x02, 0x01, 0x16, 0x05, 0x0b, 0x02, 0x09, 0x0c, 0x05, + 0x0e, 0x01, '+', 0x03, 0x05, 0x05, 0x01, 0x0a, 0x08, 0x12, + 0x08, 0x09, 0x06, 0x01, 0x0e, 0x02, 0x0a, 0x02, 0x0f, 0x02, + 0x05, 0x01, 0x1d, 0x02, 0x09, 0x0b, 0x02, 0x05, 0x1b, 0x00, + 0x19, 0x07, 0x01, 0x10, 0x03, 0x05, 0x02, 0x07, 0x01, 0x0b, + 0x02, 0x01, 0x0d, 0x08, 0x05, 0x12, 0x04, 0x0e, 0x0c, 0x09, + 0x03, 0x0d, 0x04, '9', 0x05, 0x01, 0x07, 0x02, 0x01, 0x10, + 0x02, 0x09, 0x11, 0x04, 0x06, 0x02, 0x01, 0x03, 0x07, 0x01, + 0x0c, 0x0a, 0x0c, 0x03, 0x09, 0x04, 0x08, 0x01, 0x0d, 0x03, + 0x11, 0x15, 0x04, 0x03, 0x09, 0x01, 0x02, 0x07, 0x01, 0x04, + 0x0b, 0x04, 0x08, 0x11, 0x03, 0x01, '(', 0x01, '&', 0x02, + 0x09, 0x01, 0x07, 0x08, 0x0a, 0x01, 0x0d, 0x03, 0x11, 0x15, + 0x04, 0x08, 0x0a, 0x01, 0x04, 0x05, 0x11, 0x02, 0x0b, 0x04, + 0x03, 0x06, 0x03, 0x11, 0x02, 0x05, 0x06, 0x02, 0x1b, 0x00, + '"', 0x07, 0x01, 0x10, 0x03, 0x05, 0x05, 0x02, 0x07, 0x07, + 0x08, 0x01, 0x0b, 0x04, 0x01, 0x0d, 0x08, 0x05, 0x12, 0x04, + 0x0e, 0x0c, 0x09, 0x03, 0x1a, 0x04, 0x08, 0x05, 0x02, 0x01, + 0x0d, 0x08, 0x05, 0x0a, 0x02, 0x05, 0x06, 0x02, 0x01, 0x03, + 0x07, 0x07, 'V', 0x0c, 0x06, 0x02, 0x05, 0x06, 0x02, 0x01, + 0x0b, 0x04, 0x01, 0x0d, 0x03, 0x11, 0x15, 0x04, 0x03, 0x09, + 0x02, 0x01, 0x07, 0x03, 0x01, 0x07, 0x04, 0x05, 0x0e, 0x0c, + 0x03, 0x01, 0x02, 0x01, '&', 0x04, 0x0a, 0x0c, 0x03, 0x07, + 0x04, 0x1a, 0x1a, 0x03, 0x09, 0x02, 0x01, 0x0a, 0x0c, 0x15, + 0x04, 0x06, 0x08, 0x01, 0x07, 0x02, 0x01, 0x11, 0x08, 0x0b, + 0x04, 0x12, 0x04, 0x0d, 0x0f, 0x02, 0x1b, 0x00, 'f', 0xc2, + 0x89, 0xc3, 0x96, 0xc4, 0x83, 'A', 'e', 'H', 0xc2, 0x83, + 0xc3, 0xb2, 'A', 0xc3, 0xab, 0xc3, 0x9f, 0xc3, 0xa4, 0xc3, + 0xb6, 0xc2, 0x8e, 0xc3, 0x9b, 0xc2, 0x84, 0xc4, 0x82, ';', + 0x00, 0x01, 0xc2, 0xa7, 0xc2, 0x96, 'j', 0x01, 'i', ')', + 0xc4, 0x89, 0x01, 0xc4, 0xb3, 0xc4, 0xbf, 0x01, 0xc2, 0x9e, + 0x01, 0xc2, 0xa4, 0xc4, 0xae, 0xc4, 0x9f, 0x01, 0xc5, 0x80, + 0xc2, 0x93, 'g', 0x01, 0xc4, 0xb7, 0xc2, 0x9f, 0x01, 'h', + 0xc2, 0xa1, 0xc4, 0xb5, 0x01, 0xc4, 0x8c, 0xc4, 0xb2, 0xc2, + 0x97, 'U', 0x1b, 0x00, 0xc2, 0x8f, 0xc2, 0x85, 0x7e, '}', + 0xc2, 0x80, 'J', 'K', ':', 'H', 'd', '-', 0xc2, 0x83, + 0xc2, 0xbc, 0xc3, 0xb7, 's', 'L', 'Y', '[', 'W', 'J', + 'X', 'R', 'E', 'I', ':', 0xc3, 0x99, 0xc3, 0xb8, 'W', + 'E', 0xc2, 0xb6, 0x5c, 0xc4, 0x81, 0xc2, 0xbb, 'v', 'R', + 'E', ';', 0x00, 'n', 0x09, 0x02, 0x0a, 0x0a, 0x01, 0x06, + 0x0f, 0x02, 0x01, 0x1e, 0x01, 0x03, 0x05, 0x0b, 0x01, 0x13, + 0x01, 0x15, 0x0c, 0x06, 0x06, 0x08, 0x05, 0x0a, 0x01, 0x03, + 0x06, 0x01, 0x06, 0x0f, 0x02, 0x01, 0x15, 0x08, 0x06, 0x06, + 0x08, 0x11, 0x01, 0x08, 0x12, 0x01, 0x06, 0x0f, 0x02, 0x01, + 0x0a, 0x0d, 0x09, 0x02, 0x02, 0x05, 0x01, 0x06, 0x08, 0x01, + 0x11, 0x08, '&', 0x02, 0x01, 0x15, 0x02, 0x06, 0x1d, 0x02, + 0x02, 0x05, 0x01, 0x06, 0x0f, 0x02, 0x01, 0x10, 0x03, 0x05, + 0x02, 0x07, 0x0a, 0x1b, 0x00, '$', 0x09, 0x0c, 0x0d, '+', + 0x02, 0x05, 0x01, ',', 0x04, 0x02, 0x01, 0x03, 0x0c, 0x12, + 0x01, 0x0b, 0x04, 0x02, 0x01, 0x1c, 0x03, 0x0a, 0x06, 0x02, + 0x05, 0x01, 0x1e, 0x01, 0x0c, 0x05, 0x0b, 0x01, 0x13, 0x01, + 0x0c, 0x05, 0x06, 0x02, 0x05, 0x01, 0x03, 0x0c, 0x12, 0x01, + 0x0b, 0x02, 0x11, 0x01, 'P', 0x04, 0x07, 0x0b, 0x0a, 0x0d, + 0x0f, 0x04, 0x09, 0x11, 'O', 0x01, 0x0c, 0x11, 0x01, 0x1a, + 0x1d, 0x04, 0x0a, 0x0d, 0x0f, 0x02, 0x05, 0x01, 0x0b, 0x02, + 0x05, 0x01, 'P', 0x02, 0x09, 0x02, 0x04, 0x0d, 0x0f, 0x02, + 0x05, 0x01, 0x1a, 0x0c, 0x01, 0x1d, 0x02, 0x0d, 0x0f, 0x0a, + 0x02, 0x07, 0x05, 0x1b, 0x00, 0xc2, 0xaa, 0x10, 0x09, 0x04, + 0x11, 0x03, 0x01, 0x07, 0x03, 0x0a, 0x01, 0x06, 0x02, 0x0d, + 0x07, 0x03, 0x0a, 0x01, 0x0b, 0x02, 0x01, 0x1e, 0x01, '(', + 0x01, 0x13, 0x01, 0x03, 0x07, 0x01, 0x12, 0x04, 0x05, 0x03, + 0x07, 0x01, 0x0b, 0x02, 0x01, 0x07, 0x03, 0x01, 0x10, 0x03, + 0x05, 0x06, 0x03, 0x07, 0x07, 0x03, 0x01, 0x10, 0x03, 0x09, + 0x03, 0x01, 0x11, 0x08, '&', 0x02, 0x09, 0x0a, 0x02, 0x01, + 0x02, 0x05, 0x06, 0x09, 0x02, 0x01, 0x07, 0x08, 0x0a, 0x01, + 0x10, 0x03, 0x05, 0x02, 0x07, 0x02, 0x0a, 0x1b, 0x00, 'n', + 0x09, 0x02, 0x11, 0x02, 0x09, 0x02, 0x01, 0x04, 0x01, 0x10, + 0x0c, 0x07, 0x0a, 0x03, 0x05, 0x06, 0x04, 0x01, 0x1e, 0x01, + 0x02, 0x01, 0x13, 0x01, 0x10, 0x08, 0x0a, 0x06, 0x04, 0x01, + 0x05, 0x02, 0x07, 0x07, 0x03, 0x01, 0x10, 0x03, 0x09, 0x06, + 0x02, 0x01, 0x04, 0x05, 0x12, 0x02, 0x09, 0x04, 0x08, 0x09, + 0x02, 0x01, 0x0b, 0x02, 0x07, 0x07, 0x08, 0x01, 0x0a, 0x0d, + 0x0f, 0x02, 0x09, 0x11, 0x08, 0x01, 0x10, 0x02, 0x09, 0x01, + 0x0a, 0x10, 0x08, 0x0a, 0x06, 0x03, 0x09, 0x0a, 0x04, 0x01, + 0x0b, 0x03, 0x01, 0x0c, 0x05, 0x01, 0x10, 0x03, 0x05, 0x05, + 0x02, 0x07, 0x07, 0x08, 0x01, 0x03, 0x07, 0x07, 'V', 0x03, + 0x07, 0x06, 0x09, 0x08, 0x1b, 0x00, 'T', 0x1e, 0xc3, 0x9e, + 0x01, 0x13, 0x01, 'T', 0xc2, 0x92, 0xc3, 0xa1, 0xc3, 0xa5, + 0xc3, 0xa6, 'A', 0xc3, 0xa9, 0xc2, 0x90, 0xc3, 0x8e, 0xc4, + 0x88, 0xc2, 0x8c, 0xc3, 0x98, 'A', 'f', 0xc2, 0x89, ';', + 0x00, 0xc2, 0xa7, 0xc2, 0x96, 0x01, 0xc4, 0xa3, '.', 'N', + 0x01, '.', 0xc4, 0x96, 0x01, 0xc4, 0xbe, 0xc4, 0xa0, 0xc4, + 0xb1, 0x01, 0xc2, 0xa9, 0xc4, 0x94, 0xc4, 0xa8, 0xc2, 0xa4, + 'g', 0x01, 0xc2, 0x9b, 0xc2, 0xa6, 0x01, 0x13, 0x01, 0x1e, + 0xc2, 0xa2, 'N', 0x01, 0xc4, 0x91, 0xc4, 0x9d, 0xc4, 0xa6, + 0xc2, 0x9f, 0xc4, 0xa9, 0x1b, 0x00, 0x7e, '}', 0xc2, 0x80, + 0xc4, 0x86, '-', 0xc2, 0x8c, 0xc3, 0x9a, 'E', 'L', 0x5c, + 'K', ':', 0xc3, 0xbf, 'f', '<', 0xc2, 0x81, 0xc2, 0x90, + 0x5c, 'q', 'L', 0x7f, 'z', 'a', 0x01, 0x13, 0x01, 0x1e, + '[', '-', 0xc2, 0x87, 'I', 'Z', 0xc2, 0xb5, 0xc2, 0xb8, + 't', 'r', ';', 0x00, 0xc2, 0xac, 0x08, 0x0c, 0x01, 0x11, + 0x03, '(', 0x01, 0x09, 0x02, 0x10, 0x07, 0x03, 0x0d, 0x02, + 0x01, 0x06, 0x0f, 0x02, 0x01, 0x0a, 0x08, 0x12, 0x06, 0x1d, + 0x03, 0x09, 0x02, 0x01, 0x04, 0x11, 0x03, 0x0e, 0x02, 0x01, + 0x12, 0x07, 0x03, 0x0a, 0x0f, 0x02, 0x0b, 0x01, 0x15, '(', + 0x01, 0x10, 0x09, 0x02, 0x0a, 0x0a, 0x04, 0x05, 0x0e, 0x01, + 0x06, 0x0f, 0x02, 0x01, 0x27, 0x10, 0x0b, 0x03, 0x06, 0x02, + 0x01, 0x15, 0x0c, 0x06, 0x06, 0x08, 0x05, 0x01, 0x03, 0x12, + 0x06, 0x02, 0x09, 0x01, 0x0a, 0x02, 0x06, 0x06, 0x04, 0x05, + 0x0e, 0x01, 0x0c, 0x10, 0x01, 0x06, 0x0f, 0x02, 0x01, '%', + '#', '4', 0x07, 0x03, 0x0a, 0x0f, 0x01, 0x0c, 0x06, 0x04, + 0x07, 0x04, 0x06, '(', 0x01, 0x1d, 0x04, 0x06, 0x0f, 0x01, + 0x06, 0x0f, 0x02, 0x01, 0x12, 0x08, 0x07, 0x07, 0x08, 0x1d, + 0x04, 0x05, 0x0e, 0x01, 0x04, 0x05, 0x12, 0x08, 0x09, 0x11, + 0x03, 0x06, 0x04, 0x08, 0x05, 0x18, 0x00, ',', 0x04, 0x02, + 0x01, '+', 'o', 0x05, 0x05, 0x02, 0x05, 0x01, 0x0b, 0x03, + 0x0a, 0x01, 0x15, 0x07, 0x04, 0x05, '+', 0x02, 0x05, 0x0b, + 0x02, 0x01, ',', 0x08, 0x12, 0x06, 0x1d, 0x03, 0x09, 0x02, + 0x13, 'P', 0x04, 0x07, 0x0b, 0x01, 0x02, 0x09, 0x0a, 0x02, + 0x06, 0x1a, 0x02, 0x05, 'O', 0x01, 0x04, 0x05, 0x0b, 0x02, + 0x11, 0x01, ',', 0x04, 0x02, 0x01, 0x03, 0x0c, 0x12, 0x01, + 0x0b, 0x04, 0x02, 0x01, ',', 0x0d, 0x0f, 0x03, 0x07, 0x06, + 0x12, 0x07, 0x03, 0x0d, 0x0f, 0x02, 0x01, 0x16, '+', 0x06, + 0x0c, 0x03, 0x07, 0x04, 0x0a, 0x04, 0x02, 0x09, 0x02, 0x05, + 0x01, '+', 0x07, 0x04, 0x0d, '+', 0x02, 0x05, 'O', 0x01, + 0x05, 0x03, 0x0d, 0x0f, 0x0b, 0x02, 0x11, 0x01, ',', 0x04, + 0x02, 0x01, 0x0b, 0x03, 0x0a, 0x01, '$', 0x04, 0x02, 0x05, + 0x0a, 0x06, 0x10, 0x09, 0x08, 0x0e, 0x09, 0x03, 0x11, 0x11, + 0x01, 0x11, 0x04, 0x06, 0x01, 0x0b, 0x02, 0x05, 0x01, 0x12, + 0x08, 0x07, 0x0e, 0x02, 0x05, 0x0b, 0x02, 0x05, 0x01, '"', + 0x05, 0x12, 0x08, 0x09, 0x11, 0x03, 0x06, 0x04, 0x08, 0x05, + 0x02, 0x05, 0x01, 0x02, 0x04, 0x05, 0x0e, 0x02, 0x09, 0x04, + 0x0d, 0x0f, 0x06, 0x02, 0x06, 0x01, 0x0f, 0x03, 0x15, 0x02, + 0x05, 0x18, 0x00, 0x27, 0x0a, 0x06, 0x02, 0x0b, 0x01, 0x10, + 0x0c, 0x02, 0x0b, 0x02, 0x01, 0x09, 0x02, 0x02, 0x11, 0x10, + 0x07, 0x03, 0x1a, 0x03, 0x09, 0x01, 0x07, 0x03, 0x01, 0x04, + 0x11, 0x03, 0x0e, 0x02, 0x05, 0x01, 0x0b, 0x02, 0x07, 0x01, + 0x0a, 0x08, 0x12, 0x06, 0x1d, 0x03, 0x09, 0x02, 0x01, 0x10, + 0x09, 0x08, '(', 0x02, 0x0d, 0x06, 0x03, 0x0b, 0x03, 0x01, + 0x03, 0x07, 0x01, 0x08, 0x10, 0x09, 0x04, 0x11, 0x04, 0x09, + 0x01, 0x02, 0x07, 0x01, 0x15, 0x08, 0x06, '9', 0x05, 0x01, + 0x0b, 0x02, 0x01, 0x16, 0x0d, 0x06, 0x0c, 0x03, 0x07, 0x04, + 0x1a, 0x03, 0x09, 0x01, 0x0b, 0x02, 0x0a, 0x10, 0x0c, 0xc2, + 0xb2, 0x0a, 0x01, 0x0b, 0x02, 0x01, 0x0d, 0x08, 0x05, 0x12, + 0x04, 0x0e, 0x0c, 0x09, 0x03, 0x09, 0x01, 0x07, 0x03, 0x01, + 0x0c, 0x06, 0x04, 0x07, 0x04, 0x0b, 0x03, 0x0b, 0x01, 0x0b, + 0x02, 0x01, '%', '#', '4', 0x07, 0x03, 0x0a, 0x0f, 0x01, + 0x0d, 0x08, 0x05, 0x01, 0x07, 0x03, 0x01, 0x0a, 0x04, 0x0e, + 0x0c, 0x04, 0x02, 0x05, 0x06, 0x02, 0x01, 0x04, 0x05, 0x12, + 0x08, 0x09, 0x11, 0x03, 0x0d, 0x04, '9', 0x05, 0x18, 0x00, + 0x19, 0x01, 0x10, 0x08, 0x0a, 0x0a, 0x04, 0x15, 0x04, 0x07, + 0x02, 0x01, 0x0a, 0x08, 0x0a, 0x06, 0x04, 0x06, 0x0c, 0x04, + 0x09, 0x02, 0x01, 0x07, 'V', 0x04, 0x11, 0x11, 0x03, 0x0e, + 0x04, 0x05, 0x02, 0x01, 0x0a, 0x08, 0x12, 0x06, 0x1d, 0x03, + 0x09, 0x02, 0x01, 0x08, 0x06, 0x06, 0x02, 0x05, 0x0c, 0x06, + 0x03, 0x01, 0x10, 0x09, 0x02, 0x11, 0x02, 0x05, 0x0b, 0x08, + 0x01, 0x04, 0x07, 0x01, 0x10, 0x0c, 0x07, 0x0a, 0x03, 0x05, + 0x06, 0x02, 0x01, 0x16, 0x0e, 0x0e, 0x04, 0x08, 0x09, 0x05, + 0x03, 0x11, 0x02, 0x05, 0x06, 0x08, 0x01, 0x0b, 0x08, 0x10, + 0x08, 0x01, 0x03, '&', 0x02, 0x09, 0x01, 0x04, 0x11, 0x10, + 0x08, 0x0a, 0x06, 0x03, 0x06, 0x08, 0x01, 0x04, 0x07, 0x01, + 0x10, 0x09, 0x08, 0x0e, 0x09, 0x03, 0x11, 0x11, 0x03, 0x01, + 0x0b, 0x04, 0x01, 0x0c, 0x06, 0x04, 0x07, 0x04, 0x06, 0x03, + 0x01, '%', '#', '4', 0x07, 0x03, 0x0a, 0x0f, 0x01, 0x0d, + 0x08, 0x05, 0x01, 0x07, 0x02, 0x01, 0x0a, 0x02, 0x0e, 0x0c, + 0x02, 0x05, 0x06, 0x04, 0x01, 0x04, 0x05, 0x12, 0x08, 0x09, + 0x11, 0x03, 0x1a, 0x04, 0x08, 0x05, 0x04, 0x1b, 0x00, 0xc3, + 0xae, 0xc2, 0x84, 'c', 0xc3, 0x93, 0xc3, 0x9c, 0xc3, 0x90, + 0xc4, 0x84, 0xc2, 0x8e, 0xc3, 0x91, 0xc2, 0x81, 0xc3, 0x94, + 0xc3, 0xad, '%', '#', '4', 0x07, 0x03, 0x0a, 0x0f, 0xc3, + 0xa3, 0xc2, 0x8a, 0xc2, 0x8d, 0xc2, 0x86, 0xc3, 0x9d, 0xc5, + 0x82, 'T', 0xc2, 0xb3, 'G', 'F', 0xc2, 0xb4, 'T', 0xc2, + 0x92, 0xc4, 0x87, 0xc3, 0xbe, 'A', 0xc4, 0x85, 0xc3, 0x92, + 0xc3, 0xb5, 0xc3, 0x95, 0xc5, 0x83, 0x00, 'U', 0xc4, 0xaf, + 0xc2, 0x93, 0x01, 0xc4, 0x8a, 'j', 0x01, 0xc2, 0xa5, 'h', + 'N', 0x01, '%', '#', '4', 0x07, 0x03, 0x0a, 0x0f, 0x01, + 0xc4, 0xad, 0xc4, 0xba, 0xc2, 0x9a, 0xc4, 0xb9, 'N', 0x01, + 0xc4, 0xa5, 0xc2, 0xa5, 0x01, 0xc5, 0x81, 0x01, 0xc2, 0xa0, + 0xc2, 0x98, '.', 'l', 0x01, 0xc2, 0x9b, 0xc2, 0xa6, 0xc2, + 0xa3, 0x01, 0xc4, 0x92, 0xc2, 0x99, 0x01, '.', 0xc4, 0xa7, + 'k', 0xc4, 0x9e, 0x01, 0xc2, 0x9d, 0xc2, 0xa8, 'l', 0xc4, + 0xac, ')', 0x01, '.', 0xc4, 0xa1, 'k', 'N', 0x01, 0xc4, + 0x95, 0xc4, 0xb8, 0xc4, 0xbc, 0x01, 0xc2, 0x9e, 0x01, 0x18, + 0x00, 'q', 0xc2, 0xb9, 'u', 'K', ':', 0xc3, 0xbb, '<', + 0xc3, 0xaf, 0xc3, 0xa2, '-', '%', '#', '4', 0x07, 0x03, + 0x0a, 0x0f, 0xc3, 0x8b, 'S', '^', ']', '`', '^', ']', + '-', 0xc2, 0x8f, 0xc2, 0x85, 'I', 'u', 0xc3, 0xac, ':', + 0xc2, 0xad, 'G', 'F', 0xc2, 0xae, 0x7f, 'z', 'a', '-', + 0xc2, 0x87, 'I', 'Z', ':', '_', 'M', '{', 'y', 0xc3, + 0x8a, '<', 0xc3, 0x85, '_', '|', 0xc2, 0xbd, 0xc2, 0xbe, + 'w', 'x', 0xc3, 0x89, 'S', 0xc3, 0x83, '-', 'b', 'X', + 0xc3, 0xb3, 's', 'L', 'Y', '[', 'W', 'J', 'X', 'R', + 'E', ';', 0x00, 0x04, 0x05, 0x0e, 0x00, 0x05, 0x0b, 0x08, + 0x00, 0x27, 0x16, '6', 0x1c, 0x18, 0x01, 0x14, 0x14, ' ', + 0x1f, 0x17, 0x17, 0x01, '5', 0x13, '!', 0x13, 0x14, 0x00, + '#', 0x16, '*', 0x18, 0x00, 0x17, 0x14, 0x1f, '/', '0', + ' ', '1', '2', '!', '3', 0x03, 0x15, 0x0d, 0x0b, 0x02, + 0x12, 0x00, +}; + +//***************************************************************************** +// +// The following global variables and #defines are intended to aid in setting +// up codepage mapping tables for use with this string table and an appropriate +// font. To use only this string table, GrLibInit may be called with a pointer +// to the g_GrLibDefaultlangremap structure. +// +//***************************************************************************** +tCodePointMap g_psCodePointMap_langremap[] = +{ + {0x8000, 0x8000, GrMapUTF8_Unicode} +}; + +#define NUM_CODEPOINT_MAPS (sizeof(g_psCodePointMap_langremap) / sizeof(tCodePointMap)) + +tGrLibDefaults g_sGrLibDefaultlangremap = +{ + GrDefaultStringRenderer, + g_psCodePointMap_langremap, + 0x8000, + NUM_CODEPOINT_MAPS, + 0 +}; diff --git a/third_party/fonts/lang_demo/langremap.h b/third_party/fonts/lang_demo/langremap.h new file mode 100644 index 0000000..8a5d6cf --- /dev/null +++ b/third_party/fonts/lang_demo/langremap.h @@ -0,0 +1,389 @@ +//***************************************************************************** +// +// langremap.h - header file for a compressed string table. +// +// Copyright (c) 2008 Texas Instruments Incorporated. All rights reserved. +// TI Information - Selective Disclosure +// +// This is an auto-generated file. Do not edit by hand. +// +//***************************************************************************** + +#define SCOMP_MAX_STRLEN 202 // The maximum size of any string. + +extern const uint8_t g_pui8Tablelangremap[]; + +//***************************************************************************** +// +// SCOMP_STR_INDEX is an enumeration list that is used to select a string +// from the string table using the GrStringGet() function. +// +//***************************************************************************** +enum SCOMP_STR_INDEX +{ + STR_ENGLISH, + STR_ITALIANO, + STR_DEUTSCH, + STR_ESPANOL, + STR_CHINESE, + STR_KOREAN, + STR_JAPANESE, + STR_APPNAME, + STR_PLUS, + STR_MINUS, + STR_CONFIG, + STR_INTRO, + STR_UPDATE, + STR_LANGUAGE, + STR_INTRO_1, + STR_INTRO_2, + STR_INTRO_3, + STR_UPDATE_TEXT, + STR_UPDATING, + STR_UART, + STR_MAC, + STR_HEXDIGITS, +}; + +//***************************************************************************** +// +// Mappings from original codepage to remapped character codes. +// +//***************************************************************************** +#define MAP8000_CHAR_000020 0x1 +#define MAP8000_CHAR_000065 0x2 +#define MAP8000_CHAR_000061 0x3 +#define MAP8000_CHAR_000069 0x4 +#define MAP8000_CHAR_00006e 0x5 +#define MAP8000_CHAR_000074 0x6 +#define MAP8000_CHAR_00006c 0x7 +#define MAP8000_CHAR_00006f 0x8 +#define MAP8000_CHAR_000072 0x9 +#define MAP8000_CHAR_000073 0xa +#define MAP8000_CHAR_000064 0xb +#define MAP8000_CHAR_000075 0xc +#define MAP8000_CHAR_000063 0xd +#define MAP8000_CHAR_000067 0xe +#define MAP8000_CHAR_000068 0xf +#define MAP8000_CHAR_000070 0x10 +#define MAP8000_CHAR_00006d 0x11 +#define MAP8000_CHAR_000066 0x12 +#define MAP8000_CHAR_00002d 0x13 +#define MAP8000_CHAR_000031 0x14 +#define MAP8000_CHAR_000062 0x15 +#define MAP8000_CHAR_000041 0x16 +#define MAP8000_CHAR_000030 0x17 +#define MAP8000_CHAR_00003a 0x18 +#define MAP8000_CHAR_000045 0x19 +#define MAP8000_CHAR_00007a 0x1a +#define MAP8000_CHAR_00002e 0x1b +#define MAP8000_CHAR_000054 0x1c +#define MAP8000_CHAR_000077 0x1d +#define MAP8000_CHAR_00002b 0x1e +#define MAP8000_CHAR_000032 0x1f +#define MAP8000_CHAR_000035 0x20 +#define MAP8000_CHAR_000038 0x21 +#define MAP8000_CHAR_000049 0x22 +#define MAP8000_CHAR_00004d 0x23 +#define MAP8000_CHAR_000044 0x24 +#define MAP8000_CHAR_00004c 0x25 +#define MAP8000_CHAR_000076 0x26 +#define MAP8000_CHAR_000055 0x27 +#define MAP8000_CHAR_000079 0x28 +#define MAP8000_CHAR_00c5b4 0x29 +#define MAP8000_CHAR_000043 0x2a +#define MAP8000_CHAR_00006b 0x2b +#define MAP8000_CHAR_000053 0x2c +#define MAP8000_CHAR_003092 0x2d +#define MAP8000_CHAR_00c774 0x2e +#define MAP8000_CHAR_000033 0x2f +#define MAP8000_CHAR_000034 0x30 +#define MAP8000_CHAR_000036 0x31 +#define MAP8000_CHAR_000037 0x32 +#define MAP8000_CHAR_000039 0x33 +#define MAP8000_CHAR_000046 0x34 +#define MAP8000_CHAR_00004e 0x35 +#define MAP8000_CHAR_000052 0x36 +#define MAP8000_CHAR_00005f 0x37 +#define MAP8000_CHAR_0000f1 0x38 +#define MAP8000_CHAR_0000f3 0x39 +#define MAP8000_CHAR_003001 0x3a +#define MAP8000_CHAR_003002 0x3b +#define MAP8000_CHAR_00306e 0x3c +#define MAP8000_CHAR_004e2d 0x3d +#define MAP8000_CHAR_0056fd 0x3e +#define MAP8000_CHAR_0065e5 0x3f +#define MAP8000_CHAR_00672c 0x40 +#define MAP8000_CHAR_007684 0x41 +#define MAP8000_CHAR_00ad6d 0x42 +#define MAP8000_CHAR_00d55c 0x43 +#define MAP8000_CHAR_000057 0x44 +#define MAP8000_CHAR_003059 0x45 +#define MAP8000_CHAR_0065b0 0x46 +#define MAP8000_CHAR_0066f4 0x47 +#define MAP8000_CHAR_008a00 0x48 +#define MAP8000_CHAR_003057 0x49 +#define MAP8000_CHAR_003067 0x4a +#define MAP8000_CHAR_00306f 0x4b +#define MAP8000_CHAR_00308b 0x4c +#define MAP8000_CHAR_0030e9 0x4d +#define MAP8000_CHAR_00b97c 0x4e +#define MAP8000_CHAR_00002c 0x4f +#define MAP8000_CHAR_000042 0x50 +#define MAP8000_CHAR_000047 0x51 +#define MAP8000_CHAR_00307e 0x52 +#define MAP8000_CHAR_0030fc 0x53 +#define MAP8000_CHAR_006309 0x54 +#define MAP8000_CHAR_00b2e4 0x55 +#define MAP8000_CHAR_000027 0x56 +#define MAP8000_CHAR_00304c 0x57 +#define MAP8000_CHAR_00304d 0x58 +#define MAP8000_CHAR_003053 0x59 +#define MAP8000_CHAR_003066 0x5a +#define MAP8000_CHAR_003068 0x5b +#define MAP8000_CHAR_00306b 0x5c +#define MAP8000_CHAR_0030a3 0x5d +#define MAP8000_CHAR_0030c6 0x5e +#define MAP8000_CHAR_0030d5 0x5f +#define MAP8000_CHAR_0030ea 0x60 +#define MAP8000_CHAR_0030f3 0x61 +#define MAP8000_CHAR_007f6e 0x62 +#define MAP8000_CHAR_0080fd 0x63 +#define MAP8000_CHAR_008a9e 0x64 +#define MAP8000_CHAR_008bed 0x65 +#define MAP8000_CHAR_009762 0x66 +#define MAP8000_CHAR_00b294 0x67 +#define MAP8000_CHAR_00bcf4 0x68 +#define MAP8000_CHAR_00c5b8 0x69 +#define MAP8000_CHAR_00c740 0x6a +#define MAP8000_CHAR_00c9c0 0x6b +#define MAP8000_CHAR_00d2b8 0x6c +#define MAP8000_CHAR_00004b 0x6d +#define MAP8000_CHAR_000050 0x6e +#define MAP8000_CHAR_0000f6 0x6f +#define MAP8000_CHAR_0000fc 0x70 +#define MAP8000_CHAR_003042 0x71 +#define MAP8000_CHAR_003044 0x72 +#define MAP8000_CHAR_003048 0x73 +#define MAP8000_CHAR_003055 0x74 +#define MAP8000_CHAR_00305f 0x75 +#define MAP8000_CHAR_00308c 0x76 +#define MAP8000_CHAR_0030a2 0x77 +#define MAP8000_CHAR_0030a4 0x78 +#define MAP8000_CHAR_0030b7 0x79 +#define MAP8000_CHAR_0030bf 0x7a +#define MAP8000_CHAR_0030c3 0x7b +#define MAP8000_CHAR_0030c8 0x7c +#define MAP8000_CHAR_0030cd 0x7d +#define MAP8000_CHAR_0030d1 0x7e +#define MAP8000_CHAR_0030dc 0x7f +#define MAP8000_CHAR_0030eb 0x80 +#define MAP8000_CHAR_004e0b 0x81 +#define MAP8000_CHAR_004f9b 0x82 +#define MAP8000_CHAR_005207 0x83 +#define MAP8000_CHAR_0053ef 0x84 +#define MAP8000_CHAR_005b9a 0x85 +#define MAP8000_CHAR_005e8f 0x86 +#define MAP8000_CHAR_0062bc 0x87 +#define MAP8000_CHAR_0063d0 0x88 +#define MAP8000_CHAR_00677f 0x89 +#define MAP8000_CHAR_007528 0x8a +#define MAP8000_CHAR_00793a 0x8b +#define MAP8000_CHAR_0079fb 0x8c +#define MAP8000_CHAR_007a0b 0x8d +#define MAP8000_CHAR_007acb 0x8e +#define MAP8000_CHAR_008a2d 0x8f +#define MAP8000_CHAR_0090e8 0x90 +#define MAP8000_CHAR_00914d 0x91 +#define MAP8000_CHAR_0094ae 0x92 +#define MAP8000_CHAR_00acfc 0x93 +#define MAP8000_CHAR_00ad6c 0x94 +#define MAP8000_CHAR_00adf8 0x95 +#define MAP8000_CHAR_00b110 0x96 +#define MAP8000_CHAR_00b2c8 0x97 +#define MAP8000_CHAR_00b370 0x98 +#define MAP8000_CHAR_00b7ec 0x99 +#define MAP8000_CHAR_00b9ac 0x9a +#define MAP8000_CHAR_00bc84 0x9b +#define MAP8000_CHAR_00c131 0x9c +#define MAP8000_CHAR_00c18c 0x9d +#define MAP8000_CHAR_00c218 0x9e +#define MAP8000_CHAR_00c2dc 0x9f +#define MAP8000_CHAR_00c5c5 0xa0 +#define MAP8000_CHAR_00c5ec 0xa1 +#define MAP8000_CHAR_00c640 0xa2 +#define MAP8000_CHAR_00c744 0xa3 +#define MAP8000_CHAR_00c788 0xa4 +#define MAP8000_CHAR_00c815 0xa5 +#define MAP8000_CHAR_00d2bc 0xa6 +#define MAP8000_CHAR_00d328 0xa7 +#define MAP8000_CHAR_00d504 0xa8 +#define MAP8000_CHAR_00d558 0xa9 +#define MAP8000_CHAR_00004f 0xaa +#define MAP8000_CHAR_000051 0xab +#define MAP8000_CHAR_000059 0xac +#define MAP8000_CHAR_00005b 0xad +#define MAP8000_CHAR_00005d 0xae +#define MAP8000_CHAR_000071 0xaf +#define MAP8000_CHAR_0000c4 0xb0 +#define MAP8000_CHAR_0000e4 0xb1 +#define MAP8000_CHAR_0000e9 0xb2 +#define MAP8000_CHAR_00201c 0xb3 +#define MAP8000_CHAR_00201d 0xb4 +#define MAP8000_CHAR_00304f 0xb5 +#define MAP8000_CHAR_003050 0xb6 +#define MAP8000_CHAR_003058 0xb7 +#define MAP8000_CHAR_003060 0xb8 +#define MAP8000_CHAR_00306a 0xb9 +#define MAP8000_CHAR_003081 0xba +#define MAP8000_CHAR_003089 0xbb +#define MAP8000_CHAR_00308a 0xbc +#define MAP8000_CHAR_0030a6 0xbd +#define MAP8000_CHAR_0030a7 0xbe +#define MAP8000_CHAR_0030af 0xbf +#define MAP8000_CHAR_0030b0 0xc0 +#define MAP8000_CHAR_0030b1 0xc1 +#define MAP8000_CHAR_0030b5 0xc2 +#define MAP8000_CHAR_0030b8 0xc3 +#define MAP8000_CHAR_0030b9 0xc4 +#define MAP8000_CHAR_0030bd 0xc5 +#define MAP8000_CHAR_0030d6 0xc6 +#define MAP8000_CHAR_0030d7 0xc7 +#define MAP8000_CHAR_0030dd 0xc8 +#define MAP8000_CHAR_0030e1 0xc9 +#define MAP8000_CHAR_0030e5 0xca +#define MAP8000_CHAR_0030e6 0xcb +#define MAP8000_CHAR_0030e7 0xcc +#define MAP8000_CHAR_004e0e 0xcd +#define MAP8000_CHAR_004e4b 0xce +#define MAP8000_CHAR_004ecb 0xcf +#define MAP8000_CHAR_004ee3 0xd0 +#define MAP8000_CHAR_004ee5 0xd1 +#define MAP8000_CHAR_004ef6 0xd2 +#define MAP8000_CHAR_004f1a 0xd3 +#define MAP8000_CHAR_004fe1 0xd4 +#define MAP8000_CHAR_0050cf 0xd5 +#define MAP8000_CHAR_005141 0xd6 +#define MAP8000_CHAR_00529b 0xd7 +#define MAP8000_CHAR_0052a8 0xd8 +#define MAP8000_CHAR_0052b9 0xd9 +#define MAP8000_CHAR_0052d5 0xda +#define MAP8000_CHAR_005373 0xdb +#define MAP8000_CHAR_0053d6 0xdc +#define MAP8000_CHAR_00540e 0xdd +#define MAP8000_CHAR_00548c 0xde +#define MAP8000_CHAR_0054cd 0xdf +#define MAP8000_CHAR_0056fe 0xe0 +#define MAP8000_CHAR_005728 0xe1 +#define MAP8000_CHAR_005831 0xe2 +#define MAP8000_CHAR_005b9e 0xe3 +#define MAP8000_CHAR_005c06 0xe4 +#define MAP8000_CHAR_005c4f 0xe5 +#define MAP8000_CHAR_005e55 0xe6 +#define MAP8000_CHAR_005e93 0xe7 +#define MAP8000_CHAR_005e94 0xe8 +#define MAP8000_CHAR_005e95 0xe9 +#define MAP8000_CHAR_005f62 0xea +#define MAP8000_CHAR_005f71 0xeb +#define MAP8000_CHAR_005f8c 0xec +#define MAP8000_CHAR_00606f 0xed +#define MAP8000_CHAR_0060a8 0xee +#define MAP8000_CHAR_0060c5 0xef +#define MAP8000_CHAR_006210 0xf0 +#define MAP8000_CHAR_006301 0xf1 +#define MAP8000_CHAR_006362 0xf2 +#define MAP8000_CHAR_0063db 0xf3 +#define MAP8000_CHAR_00652f 0xf4 +#define MAP8000_CHAR_006620 0xf5 +#define MAP8000_CHAR_00662f 0xf6 +#define MAP8000_CHAR_0066ff 0xf7 +#define MAP8000_CHAR_00679c 0xf8 +#define MAP8000_CHAR_0069cb 0xf9 +#define MAP8000_CHAR_006a5f 0xfa +#define MAP8000_CHAR_006b21 0xfb +#define MAP8000_CHAR_006b64 0xfc +#define MAP8000_CHAR_006f14 0xfd +#define MAP8000_CHAR_0073b0 0xfe +#define MAP8000_CHAR_00753b 0xff +#define MAP8000_CHAR_007b80 0x100 +#define MAP8000_CHAR_00898b 0x101 +#define MAP8000_CHAR_0089c1 0x102 +#define MAP8000_CHAR_008bb8 0x103 +#define MAP8000_CHAR_008bbe 0x104 +#define MAP8000_CHAR_008f6f 0x105 +#define MAP8000_CHAR_009593 0x106 +#define MAP8000_CHAR_0095ea 0x107 +#define MAP8000_CHAR_0095f4 0x108 +#define MAP8000_CHAR_00ac00 0x109 +#define MAP8000_CHAR_00ac19 0x10a +#define MAP8000_CHAR_00ac1c 0x10b +#define MAP8000_CHAR_00ac83 0x10c +#define MAP8000_CHAR_00ac8c 0x10d +#define MAP8000_CHAR_00acf5 0x10e +#define MAP8000_CHAR_00ae30 0x10f +#define MAP8000_CHAR_00aed8 0x110 +#define MAP8000_CHAR_00b204 0x111 +#define MAP8000_CHAR_00b20c 0x112 +#define MAP8000_CHAR_00b2a5 0x113 +#define MAP8000_CHAR_00b2e8 0x114 +#define MAP8000_CHAR_00b300 0x115 +#define MAP8000_CHAR_00b3d9 0x116 +#define MAP8000_CHAR_00b418 0x117 +#define MAP8000_CHAR_00b77c 0x118 +#define MAP8000_CHAR_00b798 0x119 +#define MAP8000_CHAR_00b7a8 0x11a +#define MAP8000_CHAR_00b85c 0x11b +#define MAP8000_CHAR_00b86d 0x11c +#define MAP8000_CHAR_00b974 0x11d +#define MAP8000_CHAR_00b9cc 0x11e +#define MAP8000_CHAR_00ba70 0x11f +#define MAP8000_CHAR_00ba74 0x120 +#define MAP8000_CHAR_00bbf8 0x121 +#define MAP8000_CHAR_00be0c 0x122 +#define MAP8000_CHAR_00c0ac 0x123 +#define MAP8000_CHAR_00c0c8 0x124 +#define MAP8000_CHAR_00c124 0x125 +#define MAP8000_CHAR_00c2ed 0x126 +#define MAP8000_CHAR_00c5c8 0x127 +#define MAP8000_CHAR_00c5d0 0x128 +#define MAP8000_CHAR_00c624 0x129 +#define MAP8000_CHAR_00c6a9 0x12a +#define MAP8000_CHAR_00c6d0 0x12b +#define MAP8000_CHAR_00c6e8 0x12c +#define MAP8000_CHAR_00c720 0x12d +#define MAP8000_CHAR_00c73c 0x12e +#define MAP8000_CHAR_00c74c 0x12f +#define MAP8000_CHAR_00c751 0x130 +#define MAP8000_CHAR_00c758 0x131 +#define MAP8000_CHAR_00c785 0x132 +#define MAP8000_CHAR_00c804 0x133 +#define MAP8000_CHAR_00c81c 0x134 +#define MAP8000_CHAR_00c904 0x135 +#define MAP8000_CHAR_00c90d 0x136 +#define MAP8000_CHAR_00c989 0x137 +#define MAP8000_CHAR_00ccb4 0x138 +#define MAP8000_CHAR_00d2f0 0x139 +#define MAP8000_CHAR_00d2f8 0x13a +#define MAP8000_CHAR_00d53d 0x13b +#define MAP8000_CHAR_00d560 0x13c +#define MAP8000_CHAR_00d568 0x13d +#define MAP8000_CHAR_00d654 0x13e +#define MAP8000_CHAR_00d658 0x13f +#define MAP8000_CHAR_00d6a8 0x140 +#define MAP8000_CHAR_00d6c4 0x141 +#define MAP8000_CHAR_00ff0c 0x142 +#define MAP8000_CHAR_00ff1a 0x143 + +//***************************************************************************** +// +// The following global variables and #defines are intended to aid in setting +// up codepage mapping tables for use with this string table and an appropriate +// font. To use only this string table, GrLibInit may be called with a pointer +// to the g_GrLibDefaultlangremap structure. +// +//***************************************************************************** +extern tCodePointMap g_psCodePointMap_langremap[]; + +#define GRLIB_CUSTOM_MAP_langremap {0x8000, 0x8000, GrMapUTF8_Unicode} + +extern tGrLibDefaults g_sGrLibDefaultlangremap; diff --git a/third_party/fonts/lang_demo/language.c b/third_party/fonts/lang_demo/language.c new file mode 100644 index 0000000..fbe8960 --- /dev/null +++ b/third_party/fonts/lang_demo/language.c @@ -0,0 +1,612 @@ +//***************************************************************************** +// +// language.c - Source file for a compressed string table. +// +// Copyright (c) 2008 Texas Instruments Incorporated. All rights reserved. +// TI Information - Selective Disclosure +// +// This is an auto-generated file. Do not edit by hand. +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +// +// The auto-generated string table and associated data. +// +const uint8_t g_pui8Tablelanguage[] = +{ + // + // Number of Strings + // + 0x16, 0x00, + + // + // Number of Languages + // + 0x07, 0x00, + + // + // Language Identifier Table + // + ((GrLangEnUS) & 0xff), ((GrLangEnUS) >> 8) & 0xff, + ((GrLangDe) & 0xff), ((GrLangDe) >> 8) & 0xff, + ((GrLangEsSP) & 0xff), ((GrLangEsSP) >> 8) & 0xff, + ((GrLangIt) & 0xff), ((GrLangIt) >> 8) & 0xff, + ((GrLangZhPRC) & 0xff), ((GrLangZhPRC) >> 8) & 0xff, + ((GrLangKo) & 0xff), ((GrLangKo) >> 8) & 0xff, + ((GrLangJp) & 0xff), ((GrLangJp) >> 8) & 0xff, + + // + // Language GrLangEnUS + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x22, 0x00, 0x00, 0x00, // STR_CHINESE + 0x29, 0x00, 0x00, 0x00, // STR_KOREAN + 0x33, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x3a, 0x00, 0x00, 0x00, // STR_APPNAME + 0x44, 0x00, 0x00, 0x00, // STR_PLUS + 0x46, 0x00, 0x00, 0x00, // STR_MINUS + 0x48, 0x00, 0x00, 0x00, // STR_CONFIG + 0x9a, 0x00, 0x00, 0x00, // STR_INTRO + 0xe4, 0x00, 0x00, 0x00, // STR_UPDATE + 0x2e, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0x62, 0x01, 0x00, 0x00, // STR_INTRO_1 + 0x69, 0x04, 0x0e, 0x10, // STR_INTRO_2 + 0x18, 0x07, 0x00, 0x00, // STR_INTRO_3 + 0x83, 0x09, 0x00, 0x00, // STR_UPDATE_TEXT + 0xe7, 0x0d, 0x0c, 0x28, // STR_UPDATING + 0xef, 0x0d, 0x00, 0x00, // STR_UART + 0x02, 0x0e, 0x00, 0x00, // STR_MAC + 0x07, 0x0e, 0x00, 0x00, // STR_HEXDIGITS + + // + // Language GrLangDe + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x22, 0x00, 0x00, 0x00, // STR_CHINESE + 0x29, 0x00, 0x00, 0x00, // STR_KOREAN + 0x33, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x3a, 0x00, 0x00, 0x00, // STR_APPNAME + 0x44, 0x00, 0x00, 0x00, // STR_PLUS + 0x46, 0x00, 0x00, 0x00, // STR_MINUS + 0x56, 0x00, 0x00, 0x00, // STR_CONFIG + 0xa7, 0x00, 0x00, 0x00, // STR_INTRO + 0xeb, 0x00, 0x00, 0x00, // STR_UPDATE + 0x37, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0xd6, 0x01, 0x00, 0x00, // STR_INTRO_1 + 0xcc, 0x04, 0x02, 0x10, // STR_INTRO_2 + 0x6a, 0x07, 0x00, 0x00, // STR_INTRO_3 + 0x11, 0x0a, 0x00, 0x00, // STR_UPDATE_TEXT + 0xff, 0xff, 0x0c, 0x70, // STR_UPDATING + 0xef, 0x0d, 0x00, 0x00, // STR_UART + 0x02, 0x0e, 0x00, 0x00, // STR_MAC + 0x07, 0x0e, 0x00, 0x00, // STR_HEXDIGITS + + // + // Language GrLangEsSP + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x22, 0x00, 0x00, 0x00, // STR_CHINESE + 0x29, 0x00, 0x00, 0x00, // STR_KOREAN + 0x33, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x3a, 0x00, 0x00, 0x00, // STR_APPNAME + 0x44, 0x00, 0x00, 0x00, // STR_PLUS + 0x46, 0x00, 0x00, 0x00, // STR_MINUS + 0x64, 0x00, 0x00, 0x00, // STR_CONFIG + 0xb3, 0x00, 0x00, 0x00, // STR_INTRO + 0xfa, 0x00, 0x00, 0x00, // STR_UPDATE + 0x3f, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0x4d, 0x02, 0x03, 0x10, // STR_INTRO_1 + 0x4c, 0x05, 0x00, 0x00, // STR_INTRO_2 + 0xce, 0x07, 0x00, 0x00, // STR_INTRO_3 + 0xcc, 0x0a, 0x00, 0x00, // STR_UPDATE_TEXT + 0xeb, 0x0d, 0x0c, 0x48, // STR_UPDATING + 0xef, 0x0d, 0x00, 0x00, // STR_UART + 0x02, 0x0e, 0x00, 0x00, // STR_MAC + 0x07, 0x0e, 0x00, 0x00, // STR_HEXDIGITS + + // + // Language GrLangIt + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x22, 0x00, 0x00, 0x00, // STR_CHINESE + 0x29, 0x00, 0x00, 0x00, // STR_KOREAN + 0x33, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x3a, 0x00, 0x00, 0x00, // STR_APPNAME + 0x44, 0x00, 0x00, 0x00, // STR_PLUS + 0x46, 0x00, 0x00, 0x00, // STR_MINUS + 0x73, 0x00, 0x00, 0x00, // STR_CONFIG + 0xc1, 0x00, 0x00, 0x00, // STR_INTRO + 0x09, 0x01, 0x00, 0x00, // STR_UPDATE + 0x46, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0x9d, 0x02, 0x00, 0x00, // STR_INTRO_1 + 0xb1, 0x05, 0x00, 0x00, // STR_INTRO_2 + 0x21, 0x08, 0x00, 0x00, // STR_INTRO_3 + 0x75, 0x0b, 0x00, 0x00, // STR_UPDATE_TEXT + 0xff, 0xff, 0x0c, 0x68, // STR_UPDATING + 0xef, 0x0d, 0x00, 0x00, // STR_UART + 0x02, 0x0e, 0x00, 0x00, // STR_MAC + 0x07, 0x0e, 0x00, 0x00, // STR_HEXDIGITS + + // + // Language GrLangZhPRC + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x22, 0x00, 0x00, 0x00, // STR_CHINESE + 0x29, 0x00, 0x00, 0x00, // STR_KOREAN + 0x33, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x3a, 0x00, 0x00, 0x00, // STR_APPNAME + 0x44, 0x00, 0x00, 0x00, // STR_PLUS + 0x46, 0x00, 0x00, 0x00, // STR_MINUS + 0x82, 0x00, 0x00, 0x00, // STR_CONFIG + 0xce, 0x00, 0x00, 0x00, // STR_INTRO + 0x17, 0x01, 0x00, 0x00, // STR_UPDATE + 0x4d, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0x08, 0x03, 0x00, 0x00, // STR_INTRO_1 + 0x1d, 0x06, 0x0a, 0x30, // STR_INTRO_2 + 0x8c, 0x08, 0x00, 0x00, // STR_INTRO_3 + 0x1e, 0x0c, 0x00, 0x00, // STR_UPDATE_TEXT + 0xff, 0xff, 0x0c, 0x30, // STR_UPDATING + 0xef, 0x0d, 0x00, 0x00, // STR_UART + 0x02, 0x0e, 0x00, 0x00, // STR_MAC + 0x07, 0x0e, 0x00, 0x00, // STR_HEXDIGITS + + // + // Language GrLangKo + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x22, 0x00, 0x00, 0x00, // STR_CHINESE + 0x29, 0x00, 0x00, 0x00, // STR_KOREAN + 0x33, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x3a, 0x00, 0x00, 0x00, // STR_APPNAME + 0x44, 0x00, 0x00, 0x00, // STR_PLUS + 0x46, 0x00, 0x00, 0x00, // STR_MINUS + 0x89, 0x00, 0x00, 0x00, // STR_CONFIG + 0xd5, 0x00, 0x00, 0x00, // STR_INTRO + 0x1e, 0x01, 0x00, 0x00, // STR_UPDATE + 0x54, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0x53, 0x03, 0x00, 0x00, // STR_INTRO_1 + 0x57, 0x06, 0x0a, 0x30, // STR_INTRO_2 + 0xc7, 0x08, 0x00, 0x00, // STR_INTRO_3 + 0x89, 0x0c, 0x00, 0x00, // STR_UPDATE_TEXT + 0xc7, 0x0c, 0x0c, 0x00, // STR_UPDATING + 0xef, 0x0d, 0x00, 0x00, // STR_UART + 0x02, 0x0e, 0x00, 0x00, // STR_MAC + 0x07, 0x0e, 0x00, 0x00, // STR_HEXDIGITS + + // + // Language GrLangJp + // + 0x00, 0x00, 0x00, 0x00, // STR_ENGLISH + 0x08, 0x00, 0x00, 0x00, // STR_ITALIANO + 0x11, 0x00, 0x00, 0x00, // STR_DEUTSCH + 0x19, 0x00, 0x00, 0x00, // STR_ESPANOL + 0x22, 0x00, 0x00, 0x00, // STR_CHINESE + 0x29, 0x00, 0x00, 0x00, // STR_KOREAN + 0x33, 0x00, 0x00, 0x00, // STR_JAPANESE + 0x3a, 0x00, 0x00, 0x00, // STR_APPNAME + 0x44, 0x00, 0x00, 0x00, // STR_PLUS + 0x46, 0x00, 0x00, 0x00, // STR_MINUS + 0x90, 0x00, 0x00, 0x00, // STR_CONFIG + 0xdc, 0x00, 0x0a, 0x10, // STR_INTRO + 0x17, 0x01, 0x00, 0x00, // STR_UPDATE + 0x5b, 0x01, 0x00, 0x00, // STR_LANGUAGE + 0xd1, 0x03, 0x0a, 0x10, // STR_INTRO_1 + 0xaa, 0x06, 0x0d, 0x10, // STR_INTRO_2 + 0x1b, 0x09, 0x00, 0x00, // STR_INTRO_3 + 0x1f, 0x0d, 0x0a, 0x10, // STR_UPDATE_TEXT + 0xff, 0xff, 0x0c, 0x30, // STR_UPDATING + 0xef, 0x0d, 0x00, 0x00, // STR_UART + 0x02, 0x0e, 0x00, 0x00, // STR_MAC + 0x07, 0x0e, 0x00, 0x00, // STR_HEXDIGITS + + // + // Compressed String Table + // + 'E', 'n', 'g', 'l', 'i', 's', 'h', 0x00, 'I', 't', + 'a', 'l', 'i', 'a', 'n', 'o', 0x00, 'D', 'e', 'u', + 't', 's', 'c', 'h', 0x00, 'E', 's', 'p', 'a', 0xc3, + 0xb1, 'o', 'l', 0x00, 0xe4, 0xb8, 0xad, 0xe5, 0x9b, 0xbd, + 0x00, 0xed, 0x95, 0x9c, 0xea, 0xb5, 0xad, 0xec, 0x96, 0xb4, + 0x00, 0xe6, 0x97, 0xa5, 0xe6, 0x9c, 0xac, 0x00, 'l', 'a', + 'n', 'g', '_', 'd', 'e', 'm', 'o', 0x00, '+', 0x00, + '-', 0x00, 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', + 'a', 't', 'i', 'o', 'n', 0x00, 'K', 'o', 'n', 'f', + 'i', 'g', 'u', 'r', 'a', 't', 'i', 'o', 'n', 0x00, + 'C', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 'c', + 'i', 0xc3, 0xb3, 'n', 0x00, 'C', 'o', 'n', 'f', 'i', + 'g', 'u', 'r', 'a', 'z', 'i', 'o', 'n', 'e', 0x00, + 0xe9, 0x85, 0x8d, 0xe7, 0xbd, 0xae, 0x00, 0xea, 0xb5, 0xac, + 0xec, 0x84, 0xb1, 0x00, 0xe3, 0x81, 0xae, 0xe6, 0xa7, 0x8b, + 0xe6, 0x88, 0x90, 0x00, 'I', 'n', 't', 'r', 'o', 'd', + 'u', 'c', 't', 'i', 'o', 'n', 0x00, 'E', 'i', 'n', + 'f', 0xc3, 0xbc, 'h', 'r', 'u', 'n', 'g', 0x00, 'I', + 'n', 't', 'r', 'o', 'd', 'u', 'c', 'c', 'i', 0xc3, + 0xb3, 'n', 0x00, 'I', 'n', 't', 'r', 'o', 'd', 'u', + 'z', 'i', 'o', 'n', 'e', 0x00, 0xe7, 0xae, 0x80, 0xe4, + 0xbb, 0x8b, 0x00, 0xec, 0x86, 0x8c, 0xea, 0xb0, 0x9c, 0x00, + 0xaf, 0xe3, 0x81, 0x98, 0xe3, 0x82, 0x81, 0x00, 'U', 'p', + 'd', 'a', 't', 'e', 0x00, 'A', 'k', 't', 'u', 'a', + 'l', 'i', 's', 'i', 'e', 'r', 'u', 'n', 'g', 0x00, + 'A', 'c', 't', 'u', 'a', 'l', 'i', 'z', 'a', 'c', + 'i', 0xc3, 0xb3, 'n', 0x00, 'A', 'g', 'g', 'i', 'o', + 'r', 'n', 'a', 'm', 'e', 'n', 't', 'o', 0x00, 0xe6, + 0x9b, 0xb4, 0xe6, 0x96, 0xb0, 0x00, 0xec, 0x83, 0x88, 0xeb, + 0xa1, 0xad, 0xea, 0xb2, 0x8c, 0xed, 0x95, 0x98, 0xeb, 0x8b, + 0xa4, 0x00, 'L', 'a', 'n', 'g', 'u', 'a', 'g', 'e', + 0x00, 'S', 'p', 'r', 'a', 'c', 'h', 'e', 0x00, 'I', + 'd', 'i', 'o', 'm', 'a', 0x00, 'L', 'i', 'n', 'g', + 'u', 'a', 0x00, 0xe8, 0xaf, 0xad, 0xe8, 0xa8, 0x80, 0x00, + 0xec, 0x96, 0xb8, 0xec, 0x96, 0xb4, 0x00, 0xe8, 0xa8, 0x80, + 0xe8, 0xaa, 0x9e, 0x00, 'T', 'h', 'i', 's', ' ', 'a', + 'p', 'p', 'l', 'i', 'c', 'a', 't', 'i', 'o', 'n', + ' ', 'd', 'e', 'm', 'o', 'n', 's', 't', 'r', 'a', + 't', 'e', 's', ' ', 't', 'h', 'e', ' ', 'c', 'a', + 'p', 'a', 'b', 'i', 'l', 'i', 't', 'i', 'e', 's', + ' ', 'o', 'f', ' ', 't', 'h', 'e', ' ', 'l', 'a', + 'n', 'g', 'u', 'a', 'g', 'e', ' ', 's', 'u', 'p', + 'p', 'o', 'r', 't', ' ', 'p', 'r', 'o', 'v', 'i', + 'd', 'e', 'd', ' ', 'w', 'i', 't', 'h', ' ', 't', + 'h', 'e', ' ', 'T', 'i', 'v', 'a', 'W', 'a', 'r', + 'e', ' ', 'G', 'r', 'a', 'p', 'h', 'i', 'c', 's', + ' ', 'L', 'i', 'b', 'r', 'a', 'r', 'y', '.', 0x00, + 'D', 'i', 'e', 's', 'e', ' ', 'A', 'n', 'w', 'e', + 'n', 'd', 'u', 'n', 'g', ' ', 'z', 'e', 'i', 'g', + 't', ' ', 'd', 'i', 'e', ' ', 'F', 0xc3, 0xa4, 'h', + 'i', 'g', 'k', 'e', 'i', 't', 'e', 'n', ' ', 'd', + 'e', 'r', ' ', 'S', 'p', 'r', 'a', 'c', 'h', 'u', + 'n', 't', 'e', 'r', 's', 't', 0xc3, 0xbc, 't', 'z', + 'u', 'n', 'g', ',', ' ', 'd', 'i', 'e', ' ', 'm', + 'i', 't', ' ', 'd', 'e', 'r', ' ', 'T', 'i', 'v', + 'a', 'W', 'a', 'r', 'e', ' ', 'G', 'r', 'a', 'p', + 'h', 'i', 'c', 's', ' ', 'L', 'i', 'b', 'r', 'a', + 'r', 'y', ' ', 'g', 'e', 'l', 'i', 'e', 'f', 'e', + 'r', 't', ' ', 'w', 'i', 'r', 'd', '.', 0x00, 't', + 'a', ' ', 'a', 'p', 'l', 'i', 'c', 'a', 'c', 'i', + 0xc3, 0xb3, 'n', ' ', 'd', 'e', 'm', 'u', 'e', 's', + 't', 'r', 'a', ' ', 'l', 'a', 's', ' ', 'f', 'u', + 'n', 'c', 'i', 'o', 'n', 'e', 's', ' ', 'q', 'u', + 'e', ' ', 'o', 'f', 'r', 'e', 'c', 'e', ' ', 'l', + 'a', ' ', 'T', 'i', 'v', 'a', 'W', 'a', 'r', 'e', + ' ', 'G', 'r', 'a', 'p', 'h', 'i', 'c', 's', ' ', + 'L', 'i', 'b', 'r', 'a', 'r', 'y', '.', 0x00, 'Q', + 'u', 'e', 's', 't', 'a', ' ', 'a', 'p', 'p', 'l', + 'i', 'c', 'a', 'z', 'i', 'o', 'n', 'e', ' ', 'f', + 'o', 'r', 'n', 'i', 's', 'c', 'e', ' ', 'l', 'e', + ' ', 'f', 'u', 'n', 'z', 'i', 'o', 'n', 'a', 'l', + 'i', 't', 'a', ' ', 'd', 'i', ' ', 's', 'u', 'p', + 'p', 'o', 'r', 't', 'o', ' ', 'l', 'i', 'n', 'g', + 'u', 'i', 's', 't', 'i', 'c', 'o', ' ', 'i', 'n', + 'c', 'l', 'u', 's', 'e', ' ', 'i', 'n', ' ', 'T', + 'i', 'v', 'a', 'W', 'a', 'r', 'e', ' ', 'G', 'r', + 'a', 'p', 'h', 'i', 'c', 's', ' ', 'L', 'i', 'b', + 'r', 'a', 'r', 'y', '.', 0x00, 0xe6, 0xad, 0xa4, 0xe5, + 0xba, 0x94, 0xe7, 0x94, 0xa8, 0xe7, 0xa8, 0x8b, 0xe5, 0xba, + 0x8f, 0xe6, 0xbc, 0x94, 0xe7, 0xa4, 0xba, 0xe4, 0xb8, 0x8e, + 'T', 'i', 'v', 'a', 'W', 'a', 'r', 'e', 0xe5, 0x9b, + 0xbe, 0xe5, 0xbd, 0xa2, 0xe5, 0xba, 0x93, 0xe6, 0x8f, 0x90, + 0xe4, 0xbe, 0x9b, 0xe7, 0x9a, 0x84, 0xe8, 0xaf, 0xad, 0xe8, + 0xa8, 0x80, 0xe6, 0x94, 0xaf, 0xe6, 0x8c, 0x81, 0xe7, 0x9a, + 0x84, 0xe8, 0x83, 0xbd, 0xe5, 0x8a, 0x9b, 0xe3, 0x80, 0x82, + 0x00, 0xec, 0x9d, 0xb4, ' ', 0xec, 0x9d, 0x91, 0xec, 0x9a, + 0xa9, ' ', 0xed, 0x94, 0x84, 0xeb, 0xa1, 0x9c, 0xea, 0xb7, + 0xb8, 0xeb, 0x9e, 0xa8, 0xec, 0x9d, 0x80, ' ', 'T', 'i', + 'v', 'a', 'W', 'a', 'r', 'e', ' ', 0xea, 0xb7, 0xb8, + 0xeb, 0x9e, 0x98, 0xed, 0x94, 0xbd, ' ', 0xeb, 0x9d, 0xbc, + 0xec, 0x9d, 0xb4, 0xeb, 0xb8, 0x8c, 0xeb, 0x9f, 0xac, 0xeb, + 0xa6, 0xac, 0xec, 0x99, 0x80, ' ', 0xed, 0x95, 0xa8, 0xea, + 0xbb, 0x98, ' ', 0xec, 0xa0, 0x9c, 0xea, 0xb3, 0xb5, 0xeb, + 0x90, 0x98, 0xeb, 0x8a, 0x94, ' ', 0xec, 0x96, 0xb8, 0xec, + 0x96, 0xb4, ' ', 0xec, 0xa7, 0x80, 0xec, 0x9b, 0x90, ' ', + 0xea, 0xb8, 0xb0, 0xeb, 0x8a, 0xa5, 0xec, 0x9d, 0x84, ' ', + 0xeb, 0xb3, 0xb4, 0xec, 0x97, 0xac, 0xec, 0xa4, 0x8d, 0xeb, + 0x8b, 0x88, 0xeb, 0x8b, 0xa4, '.', 0x00, 0x93, 0xe3, 0x81, + 0xae, 0xe3, 0x82, 0xa2, 0xe3, 0x83, 0x97, 0xe3, 0x83, 0xaa, + 0xe3, 0x82, 0xb1, 0xe3, 0x83, 0xbc, 0xe3, 0x82, 0xb7, 0xe3, + 0x83, 0xa7, 0xe3, 0x83, 0xb3, 0xe3, 0x81, 0xa7, 0xe3, 0x81, + 0xaf, 0xe3, 0x80, 0x81, 0xe3, 0x82, 0xb9, 0xe3, 0x83, 0x86, + 0xe3, 0x83, 0xa9, 0xe3, 0x81, 0xae, 0xe3, 0x82, 0xb0, 0xe3, + 0x83, 0xa9, 0xe3, 0x83, 0x95, 0xe3, 0x82, 0xa3, 0xe3, 0x83, + 0x83, 0xe3, 0x82, 0xaf, 0xe3, 0x83, 0xa9, 0xe3, 0x82, 0xa4, + 0xe3, 0x83, 0x96, 0xe3, 0x83, 0xa9, 0xe3, 0x83, 0xaa, 0xe3, + 0x81, 0xa7, 0xe6, 0x8f, 0x90, 0xe4, 0xbe, 0x9b, 0xe3, 0x81, + 0x95, 0xe3, 0x82, 0x8c, 0xe3, 0x82, 0x8b, 0xe8, 0xa8, 0x80, + 0xe8, 0xaa, 0x9e, 0xe3, 0x82, 0xb5, 0xe3, 0x83, 0x9d, 0xe3, + 0x83, 0xbc, 0xe3, 0x83, 0x88, 0xe3, 0x81, 0xae, 0xe6, 0xa9, + 0x9f, 0xe8, 0x83, 0xbd, 0xe3, 0x82, 0x92, 0xe7, 0xa4, 0xba, + 0xe3, 0x81, 0x97, 0xe3, 0x81, 0xa6, 0xe3, 0x81, 0x84, 0xe3, + 0x81, 0xbe, 0xe3, 0x81, 0x99, 0xe3, 0x80, 0x82, 0x00, 'e', + ' ', 'c', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', + 't', 'i', 'o', 'n', ' ', 'p', 'a', 'n', 'e', 'l', + ' ', 'a', 'l', 'l', 'o', 'w', 's', ' ', 't', 'h', + 'e', ' ', 'l', 'a', 'n', 'g', 'u', 'a', 'g', 'e', + ' ', 't', 'o', ' ', 'b', 'e', ' ', 's', 'w', 'i', + 't', 'c', 'h', 'e', 'd', ' ', 'a', 'n', 'd', ' ', + 't', 'h', 'e', ' ', 'e', 'f', 'f', 'e', 'c', 't', + 's', ' ', 'w', 'i', 'l', 'l', ' ', 'b', 'e', ' ', + 's', 'e', 'e', 'n', ' ', 'i', 'm', 'm', 'e', 'd', + 'i', 'a', 't', 'e', 'l', 'y', '.', 0x00, 'r', ' ', + 'K', 'o', 'n', 'f', 'i', 'g', 'u', 'r', 'a', 't', + 'i', 'o', 'n', 's', 'b', 'e', 'r', 'e', 'i', 'c', + 'h', ' ', 'e', 'r', 'm', 0xc3, 0xb6, 'g', 'l', 'i', + 'c', 'h', 't', ' ', 'd', 'e', 'm', ' ', 'B', 'e', + 'n', 'u', 't', 'z', 'e', 'r', ' ', 'e', 'i', 'n', + 'e', ' ', 's', 'o', 'f', 'o', 'r', 't', 'i', 'g', + 'e', ' ', 0xc3, 0x84, 'n', 'd', 'e', 'r', 'u', 'n', + 'g', ' ', 'd', 'e', 'r', ' ', 'S', 'p', 'r', 'a', + 'c', 'h', 'e', '.', ' ', 'D', 'i', 'e', ' ', 'A', + 'n', 'd', 'e', 'r', 'u', 'n', 'g', ' ', 'k', 'a', + 'n', 'n', ' ', 's', 'o', 'f', 'o', 'r', 't', ' ', + 'g', 'e', 's', 'e', 'h', 'e', 'n', ' ', 'w', 'e', + 'r', 'd', 'e', 'n', '.', 0x00, 'E', 'l', ' ', 'p', + 'a', 'n', 'e', 'l', ' ', 'd', 'e', ' ', 'c', 'o', + 'n', 'f', 'i', 'g', 'u', 'r', 'a', 'c', 'i', 0xc3, + 0xb3, 'n', ' ', 'l', 'e', ' ', 'p', 'e', 'r', 'm', + 'i', 't', 'e', ' ', 'a', 'l', ' ', 'u', 's', 'u', + 'a', 'r', 'i', 'o', ' ', 'c', 'a', 'm', 'b', 'i', + 'a', 'r', ' ', 'e', 'l', ' ', 'i', 'd', 'i', 'o', + 'm', 'a', ' ', 'y', ' ', 'v', 'e', 'r', ' ', 'l', + 'o', 's', ' ', 'c', 'a', 'm', 'b', 'i', 'o', 's', + ' ', 'i', 'n', 'm', 'e', 'd', 'i', 'a', 't', 'a', + 'm', 'e', 'n', 't', 'e', '.', 0x00, 'I', 'l', ' ', + 'p', 'a', 'n', 'n', 'e', 'l', 'l', 'o', ' ', 'd', + 'i', ' ', 'c', 'o', 'n', 'f', 'i', 'g', 'u', 'r', + 'a', 'z', 'i', 'o', 'n', 'e', ' ', 'c', 'o', 'n', + 's', 'e', 'n', 't', 'e', ' ', 'a', 'l', 'l', 0x27, + 'u', 't', 'e', 'n', 't', 'e', ' ', 'd', 'i', ' ', + 'c', 'a', 'm', 'b', 'i', 'a', 'r', 'e', ' ', 'l', + 'a', ' ', 'l', 'i', 'n', 'g', 'u', 'a', ' ', 'e', + ' ', 'v', 'i', 's', 'u', 'a', 'l', 'i', 'z', 'z', + 'a', 'r', 'e', ' ', 's', 'u', 'b', 'i', 't', 'o', + ' ', 'l', 'e', ' ', 'm', 'o', 'd', 'i', 'f', 'i', + 'c', 'h', 'e', '.', 0x00, 0xe9, 0x9d, 0xa2, 0xe6, 0x9d, + 0xbf, 0xe5, 0x85, 0x81, 0xe8, 0xae, 0xb8, 0xe7, 0x9a, 0x84, + 0xe8, 0xaf, 0xad, 0xe8, 0xa8, 0x80, 0xe5, 0x88, 0x87, 0xe6, + 0x8d, 0xa2, 0xe7, 0x9a, 0x84, 0xe5, 0xbd, 0xb1, 0xe5, 0x93, + 0x8d, 0xe5, 0xb0, 0x86, 0xe6, 0x98, 0xaf, 0xe7, 0xab, 0x8b, + 0xe5, 0x8d, 0xb3, 0xe5, 0x8f, 0xaf, 0xe8, 0xa7, 0x81, 0xe3, + 0x80, 0x82, 0x00, ' ', 0xed, 0x8c, 0xa8, 0xeb, 0x84, 0x90, + 0xec, 0x9d, 0x80, ' ', 0xec, 0x96, 0xb8, 0xec, 0x96, 0xb4, + 0xea, 0xb0, 0x80, ' ', 0xec, 0xa0, 0x84, 0xed, 0x99, 0x98, + ' ', 0xec, 0x88, 0x98, ' ', 0xec, 0x9e, 0x88, 0xec, 0x9c, + 0xbc, 0xeb, 0xa9, 0xb0, ' ', 0xed, 0x9a, 0xa8, 0xea, 0xb3, + 0xbc, 0xeb, 0x8a, 0x94, ' ', 0xec, 0xa6, 0x89, 0xec, 0x8b, + 0x9c, ' ', 0xeb, 0xb3, 0xb4, 0xec, 0x97, 0xac, 0xec, 0xa4, + 0x84, ' ', 0xea, 0xb2, 0x83, 0xec, 0x9e, 0x85, 0xeb, 0x8b, + 0x88, 0xeb, 0x8b, 0xa4, '.', 0x00, 0xad, 0xe5, 0xae, 0x9a, + 0xe3, 0x83, 0x91, 0xe3, 0x83, 0x8d, 0xe3, 0x83, 0xab, 0xe3, + 0x81, 0xa7, 0xe3, 0x81, 0xaf, 0xe3, 0x80, 0x81, 0xe8, 0xa8, + 0x80, 0xe8, 0xaa, 0x9e, 0xe3, 0x82, 0x92, 0xe5, 0x88, 0x87, + 0xe3, 0x82, 0x8a, 0xe6, 0x9b, 0xbf, 0xe3, 0x81, 0x88, 0xe3, + 0x82, 0x8b, 0xe3, 0x81, 0x93, 0xe3, 0x81, 0xa8, 0xe3, 0x81, + 0x8c, 0xe3, 0x81, 0xa7, 0xe3, 0x81, 0x8d, 0xe3, 0x81, 0xbe, + 0xe3, 0x81, 0x99, 0xe3, 0x81, 0x97, 0xe3, 0x80, 0x81, 0xe5, + 0x8a, 0xb9, 0xe6, 0x9e, 0x9c, 0xe3, 0x81, 0x8c, 0xe3, 0x81, + 0x99, 0xe3, 0x81, 0x90, 0xe3, 0x81, 0xab, 0xe8, 0xa6, 0x8b, + 0xe3, 0x82, 0x89, 0xe3, 0x82, 0x8c, 0xe3, 0x81, 0xbe, 0xe3, + 0x81, 0x99, 0xe3, 0x80, 0x82, 0x00, 'P', 'r', 'e', 's', + 's', ' ', 't', 'h', 'e', ' ', '+', ' ', 'a', 'n', + 'd', ' ', '-', ' ', 'b', 'u', 't', 't', 'o', 'n', + 's', ' ', 'a', 't', ' ', 't', 'h', 'e', ' ', 'b', + 'o', 't', 't', 'o', 'm', ' ', 'o', 'f', ' ', 't', + 'h', 'e', ' ', 's', 'c', 'r', 'e', 'e', 'n', ' ', + 't', 'o', ' ', 'm', 'o', 'v', 'e', ' ', 'b', 'e', + 't', 'w', 'e', 'e', 'n', ' ', 't', 'h', 'e', ' ', + 'p', 'a', 'n', 'e', 'l', 's', '.', 0x00, 'D', 'r', + 'u', 'c', 'k', 'e', 'n', ' ', 'S', 'i', 'e', ' ', + 'a', 'u', 'f', ' ', 'd', 'i', 'e', ' ', 'T', 'a', + 's', 't', 'e', 'n', ' ', '+', ' ', 'u', 'n', 'd', + ' ', '-', ' ', 'u', 'n', 't', 'e', 'n', ' ', 'a', + 'u', 'f', ' ', 'd', 'e', 'm', ' ', 'B', 'i', 'l', + 'd', 's', 'c', 'h', 'i', 'r', 'm', ',', ' ', 'u', + 'm', ' ', 'z', 'w', 'i', 's', 'c', 'h', 'e', 'n', + ' ', 'd', 'e', 'n', ' ', 'B', 'e', 'r', 'e', 'i', + 'c', 'h', 'e', 'n', ' ', 'z', 'u', ' ', 'w', 'e', + 'c', 'h', 's', 'e', 'l', 'n', '.', 0x00, 'O', 'p', + 'r', 'i', 'm', 'a', ' ', 'l', 'a', 's', ' ', 't', + 'e', 'c', 'l', 'a', 's', ' ', 'd', 'e', ' ', '+', + ' ', 'y', ' ', '-', ' ', 'a', 'l', ' ', 'f', 'i', + 'n', 'a', 'l', ' ', 'd', 'e', ' ', 'l', 'a', ' ', + 'p', 'a', 'n', 't', 'a', 'l', 'l', 'a', ' ', 'p', + 'a', 'r', 'a', ' ', 'm', 'o', 'v', 'e', 'r', 's', + 'e', ' ', 'e', 'n', 't', 'r', 'e', ' ', 'l', 'o', + 's', ' ', 'p', 'a', 'n', 'e', 'l', 'e', 's', '.', + 0x00, 'P', 'r', 'e', 'm', 'e', 'r', 'e', ' ', 'i', + ' ', 'p', 'u', 'l', 's', 'a', 'n', 't', 'i', ' ', + '+', ' ', 'e', ' ', '-', ' ', 'p', 'o', 's', 't', + 'i', ' ', 'n', 'e', 'l', 'l', 'a', ' ', 'p', 'a', + 'r', 't', 'e', ' ', 'i', 'n', 'f', 'e', 'r', 'i', + 'o', 'r', 'e', ' ', 'd', 'e', 'l', 'l', 'o', ' ', + 's', 'c', 'h', 'e', 'r', 'm', 'o', ' ', 'p', 'e', + 'r', ' ', 's', 'p', 'o', 's', 't', 'a', 'r', 's', + 'i', ' ', 'd', 'a', ' ', 'u', 'n', ' ', 'p', 'a', + 'n', 'n', 'e', 'l', 'l', 'o', ' ', 'a', 'l', 'l', + 0x27, 'a', 'l', 't', 'r', 'o', '.', 0x00, 0xe6, 0x8c, + 0x89, '+', 0xe5, 0x92, 0x8c, ' ', '-', ' ', 0xe6, 0x8c, + 0x89, 0xe9, 0x92, 0xae, 0xe5, 0x9c, 0xa8, 0xe5, 0xb1, 0x8f, + 0xe5, 0xb9, 0x95, 0xe7, 0x9a, 0x84, 0xe5, 0xba, 0x95, 0xe9, + 0x83, 0xa8, 0xe4, 0xb9, 0x8b, 0xe9, 0x97, 0xb4, 0xe7, 0xa7, + 0xbb, 0xe5, 0x8a, 0xa8, 0xe7, 0x9a, 0x84, 0xe9, 0x9d, 0xa2, + 0xe6, 0x9d, 0xbf, 0xe3, 0x80, 0x82, 0x00, 0xed, 0x8c, 0xa8, + 0xeb, 0x84, 0x90, ' ', 0xec, 0x82, 0xac, 0xec, 0x9d, 0xb4, + 0xeb, 0xa5, 0xbc, ' ', 0xec, 0x9d, 0xb4, 0xeb, 0x8f, 0x99, + ' ', 0xed, 0x99, 0x94, 0xeb, 0xa9, 0xb4, 0xec, 0x9d, 0x98, + ' ', 0xed, 0x95, 0x98, 0xeb, 0x8b, 0xa8, 0xec, 0x97, 0x90, + 0xec, 0x9e, 0x88, 0xeb, 0x8a, 0x94, ' ', 0xeb, 0xb2, 0x84, + 0xed, 0x8a, 0xbc, ' ', '-', ' ', '+', 0xec, 0x99, 0x80, + 0xeb, 0xa5, 0xbc, ' ', 0xeb, 0x88, 0x84, 0xeb, 0xa5, 0xb4, + 0xec, 0x8b, 0xad, 0xec, 0x8b, 0x9c, 0xec, 0x98, 0xa4, '.', + 0x00, 0xe3, 0x83, 0x91, 0xe3, 0x83, 0x8d, 0xe3, 0x83, 0xab, + 0xe9, 0x96, 0x93, 0xe3, 0x82, 0x92, 0xe7, 0xa7, 0xbb, 0xe5, + 0x8b, 0x95, 0xe3, 0x81, 0x99, 0xe3, 0x82, 0x8b, 0xe3, 0x81, + 0xab, 0xe3, 0x81, 0xaf, 0xe3, 0x80, 0x81, 0xe7, 0x94, 0xbb, + 0xe9, 0x9d, 0xa2, 0xe3, 0x81, 0xae, 0xe4, 0xb8, 0x8b, 0xe9, + 0x83, 0xa8, 0xe3, 0x81, 0xab, 0xe3, 0x81, 0x82, 0xe3, 0x82, + 0x8b, 0xe3, 0x83, 0x9c, 0xe3, 0x82, 0xbf, 0xe3, 0x83, 0xb3, + ' ', '-', ' ', '+', 0xe3, 0x81, 0xa8, 0xe3, 0x82, 0x92, + 0xe6, 0x8a, 0xbc, 0xe3, 0x81, 0x97, 0xe3, 0x81, 0xa6, 0xe3, + 0x81, 0x8f, 0xe3, 0x81, 0xa0, 0xe3, 0x81, 0x95, 0xe3, 0x81, + 0x84, 0xe3, 0x80, 0x82, 0x00, 'Y', 'o', 'u', ' ', 'm', + 'a', 'y', ' ', 'r', 'e', 'p', 'l', 'a', 'c', 'e', + ' ', 't', 'h', 'e', ' ', 's', 'o', 'f', 't', 'w', + 'a', 'r', 'e', ' ', 'i', 'm', 'a', 'g', 'e', ' ', + 'f', 'l', 'a', 's', 'h', 'e', 'd', ' ', 'b', 'y', + ' ', 'p', 'r', 'e', 's', 's', 'i', 'n', 'g', ' ', + 't', 'h', 'e', ' ', 'U', 'p', 'd', 'a', 't', 'e', + ' ', 'b', 'u', 't', 't', 'o', 'n', ' ', 'a', 'f', + 't', 'e', 'r', ' ', 's', 'e', 't', 't', 'i', 'n', + 'g', ' ', 'u', 'p', ' ', 't', 'h', 'e', ' ', 'L', + 'M', 'F', 'l', 'a', 's', 'h', ' ', 'u', 't', 'i', + 'l', 'i', 't', 'y', ' ', 'w', 'i', 't', 'h', ' ', + 't', 'h', 'e', ' ', 'f', 'o', 'l', 'l', 'o', 'w', + 'i', 'n', 'g', ' ', 'i', 'n', 'f', 'o', 'r', 'm', + 'a', 't', 'i', 'o', 'n', ':', 0x00, 'S', 'i', 'e', + ' ', 'k', 0xc3, 0xb6, 'n', 'n', 'e', 'n', ' ', 'd', + 'a', 's', ' ', 'b', 'l', 'i', 'n', 'k', 'e', 'n', + 'd', 'e', ' ', 'S', 'o', 'f', 't', 'w', 'a', 'r', + 'e', '-', 'B', 'i', 'l', 'd', ' ', 'e', 'r', 's', + 'e', 't', 'z', 'e', 'n', ',', ' ', 'i', 'n', 'd', + 'e', 'm', ' ', 'S', 'i', 'e', ' ', 'a', 'u', 'f', + ' ', 'd', 'i', 'e', ' ', 'S', 'c', 'h', 'a', 'l', + 't', 'f', 'l', 'a', 'c', 'h', 'e', ' ', 'A', 'k', + 't', 'u', 'a', 'l', 'i', 's', 'i', 'e', 'r', 'e', + 'n', ' ', 'k', 'l', 'i', 'c', 'k', 'e', 'n', ',', + ' ', 'n', 'a', 'c', 'h', 'd', 'e', 'm', ' ', 'S', + 'i', 'e', ' ', 'd', 'a', 's', ' ', 'D', 'i', 'e', + 'n', 's', 't', 'p', 'r', 'o', 'g', 'r', 'a', 'm', + 'm', ' ', 'm', 'i', 't', ' ', 'd', 'e', 'n', ' ', + 'f', 'o', 'l', 'g', 'e', 'n', 'd', 'e', 'n', ' ', + 'I', 'n', 'f', 'o', 'r', 'm', 'a', 't', 'i', 'o', + 'n', 'e', 'n', ' ', 'e', 'i', 'n', 'g', 'e', 'r', + 'i', 'c', 'h', 't', 'e', 't', ' ', 'h', 'a', 'b', + 'e', 'n', ':', 0x00, 'U', 's', 't', 'e', 'd', ' ', + 'p', 'u', 'e', 'd', 'e', ' ', 'r', 'e', 'e', 'm', + 'p', 'l', 'a', 'z', 'a', 'r', ' ', 'l', 'a', ' ', + 'i', 'm', 'a', 'g', 'e', 'n', ' ', 'd', 'e', 'l', + ' ', 's', 'o', 'f', 't', 'w', 'a', 'r', 'e', ' ', + 'p', 'r', 'o', 'y', 'e', 'c', 't', 'a', 'd', 'a', + ' ', 'a', 'l', ' ', 'o', 'p', 'r', 'i', 'm', 'i', + 'r', ' ', 'e', 'l', ' ', 'b', 'o', 't', 0xc3, 0xb3, + 'n', ' ', 'd', 'e', ' ', 'A', 'c', 't', 'u', 'a', + 'l', 'i', 'z', 'a', 'r', ' ', 'd', 'e', 's', 'p', + 'u', 0xc3, 0xa9, 's', ' ', 'd', 'e', ' ', 'c', 'o', + 'n', 'f', 'i', 'g', 'u', 'r', 'a', 'r', ' ', 'l', + 'a', ' ', 'u', 't', 'i', 'l', 'i', 'd', 'a', 'd', + ' ', 'd', 'e', ' ', 'L', 'M', 'F', 'l', 'a', 's', + 'h', ' ', 'c', 'o', 'n', ' ', 'l', 'a', ' ', 's', + 'i', 'g', 'u', 'i', 'e', 'n', 't', 'e', ' ', 'i', + 'n', 'f', 'o', 'r', 'm', 'a', 'c', 'i', 0xc3, 0xb3, + 'n', ':', 0x00, 'E', ' ', 'p', 'o', 's', 's', 'i', + 'b', 'i', 'l', 'e', ' ', 's', 'o', 's', 't', 'i', + 't', 'u', 'i', 'r', 'e', ' ', 'l', 0x27, 'i', 'm', + 'm', 'a', 'g', 'i', 'n', 'e', ' ', 's', 'o', 'f', + 't', 'w', 'a', 'r', 'e', ' ', 'o', 't', 't', 'e', + 'n', 'u', 't', 'a', ' ', 'p', 'r', 'e', 'm', 'e', + 'n', 'd', 'o', ' ', 'i', 'l', ' ', 'p', 'u', 'l', + 's', 'a', 'n', 't', 'e', ' ', 'A', 'g', 'g', 'i', + 'o', 'r', 'n', 'a', 'm', 'e', 'n', 't', 'o', ' ', + 'd', 'o', 'p', 'o', ' ', 'a', 'v', 'e', 'r', ' ', + 'i', 'm', 'p', 'o', 's', 't', 'a', 't', 'o', ' ', + 'i', 'l', ' ', 'p', 'r', 'o', 'g', 'r', 'a', 'm', + 'm', 'a', ' ', 'd', 'i', ' ', 'u', 't', 'i', 'l', + 'i', 't', 'a', ' ', 'L', 'M', 'F', 'l', 'a', 's', + 'h', ' ', 'c', 'o', 'n', ' ', 'l', 'e', ' ', 's', + 'e', 'g', 'u', 'e', 'n', 't', 'i', ' ', 'i', 'n', + 'f', 'o', 'r', 'm', 'a', 'z', 'i', 'o', 'n', 'i', + '.', 0x00, 0xe6, 0x82, 0xa8, 0xe5, 0x8f, 0xaf, 0xe8, 0x83, + 0xbd, 0xe4, 0xbc, 0x9a, 0xe5, 0x8f, 0x96, 0xe4, 0xbb, 0xa3, + 0xe8, 0xae, 0xbe, 0xe7, 0xab, 0x8b, 0xe4, 0xbb, 0xa5, 0xe4, + 0xb8, 0x8b, 0xe4, 0xbf, 0xa1, 0xe6, 0x81, 0xaf, 'L', 'M', + 'F', 'l', 'a', 's', 'h', 0xe5, 0xae, 0x9e, 0xe7, 0x94, + 0xa8, 0xe7, 0xa8, 0x8b, 0xe5, 0xba, 0x8f, 0xe5, 0x90, 0x8e, + 0xef, 0xbc, 0x8c, 0xe6, 0x8c, 0x89, 0xe2, 0x80, 0x9c, 0xe6, + 0x9b, 0xb4, 0xe6, 0x96, 0xb0, 0xe2, 0x80, 0x9d, 0xe6, 0x8c, + 0x89, 0xe9, 0x92, 0xae, 0xe9, 0x97, 0xaa, 0xe7, 0x8e, 0xb0, + 0xe7, 0x9a, 0x84, 0xe8, 0xbd, 0xaf, 0xe4, 0xbb, 0xb6, 0xe6, + 0x98, 0xa0, 0xe5, 0x83, 0x8f, 0xef, 0xbc, 0x9a, 0x00, 0xeb, + 0x8b, 0xa4, 0xec, 0x9d, 0x8c, 0xea, 0xb3, 0xbc, ' ', 0xea, + 0xb0, 0x99, 0xec, 0x9d, 0x80, ' ', 0xec, 0xa0, 0x95, 0xeb, + 0xb3, 0xb4, 0xeb, 0xa5, 0xbc, ' ', 'L', 'M', 'F', 'l', + 'a', 's', 'h', ' ', 0xec, 0x9c, 0xa0, 0xed, 0x8b, 0xb8, + 0xeb, 0xa6, 0xac, 0xed, 0x8b, 0xb0, 0xeb, 0xa5, 0xbc, ' ', + 0xec, 0x84, 0xa4, 0xec, 0xa0, 0x95, ' ', 0xed, 0x9b, 0x84, + ' ', 0xec, 0x97, 0x85, 0xeb, 0x8d, 0xb0, 0xec, 0x9d, 0xb4, + 0xed, 0x8a, 0xb8, ' ', 0xeb, 0xb2, 0x84, 0xed, 0x8a, 0xbc, + 0xec, 0x9d, 0x84, ' ', 0xeb, 0x88, 0x8c, 0xeb, 0x9f, 0xac, + ' ', 0xec, 0x9d, 0xb4, 0xec, 0x97, 0x88, 0xec, 0xa7, 0x80, + 0xeb, 0xa7, 0x8c, ' ', 0xec, 0x86, 0x8c, 0xed, 0x94, 0x84, + 0xed, 0x8a, 0xb8, 0xec, 0x9b, 0xa8, 0xec, 0x96, 0xb4, ' ', + 0xec, 0x9d, 0xb4, 0xeb, 0xaf, 0xb8, 0xec, 0xa7, 0x80, 0xeb, + 0xa5, 0xbc, ' ', 0xeb, 0x8c, 0x80, 0xec, 0xb2, 0xb4, 0xed, + 0x95, 0xa0, ' ', 0xec, 0x88, 0x98, ' ', ':', 0x00, 0x82, + 0xe3, 0x81, 0xaa, 0xe3, 0x81, 0x9f, 0xe3, 0x81, 0xaf, 0xe3, + 0x80, 0x81, 0xe6, 0xac, 0xa1, 0xe3, 0x81, 0xae, 0xe6, 0x83, + 0x85, 0xe5, 0xa0, 0xb1, 0xe3, 0x82, 0x92, 'L', 'M', 'F', + 'l', 'a', 's', 'h', 0xe3, 0x83, 0xa6, 0xe3, 0x83, 0xbc, + 0xe3, 0x83, 0x86, 0xe3, 0x82, 0xa3, 0xe3, 0x83, 0xaa, 0xe3, + 0x83, 0x86, 0xe3, 0x82, 0xa3, 0xe3, 0x82, 0x92, 0xe8, 0xa8, + 0xad, 0xe5, 0xae, 0x9a, 0xe3, 0x81, 0x97, 0xe3, 0x81, 0x9f, + 0xe5, 0xbe, 0x8c, 0xe3, 0x80, 0x81, '[', 0xe6, 0x9b, 0xb4, + 0xe6, 0x96, 0xb0, ']', 0xe3, 0x83, 0x9c, 0xe3, 0x82, 0xbf, + 0xe3, 0x83, 0xb3, 0xe3, 0x82, 0x92, 0xe6, 0x8a, 0xbc, 0xe3, + 0x81, 0x97, 0xe3, 0x81, 0xa6, 0xe3, 0x80, 0x81, 0xe3, 0x83, + 0x95, 0xe3, 0x83, 0xa9, 0xe3, 0x83, 0x83, 0xe3, 0x82, 0xb7, + 0xe3, 0x83, 0xa5, 0xe3, 0x81, 0xae, 0xe3, 0x82, 0xbd, 0xe3, + 0x83, 0x95, 0xe3, 0x83, 0x88, 0xe3, 0x82, 0xa6, 0xe3, 0x82, + 0xa7, 0xe3, 0x82, 0xa2, 0xe3, 0x82, 0xa4, 0xe3, 0x83, 0xa1, + 0xe3, 0x83, 0xbc, 0xe3, 0x82, 0xb8, 0xe3, 0x82, 0x92, 0xe7, + 0xbd, 0xae, 0xe3, 0x81, 0x8d, 0xe6, 0x8f, 0x9b, 0xe3, 0x81, + 0x88, 0xe3, 0x82, 0x8b, 0xe3, 0x81, 0x93, 0xe3, 0x81, 0xa8, + 0xe3, 0x81, 0x8c, 0xe3, 0x81, 0xa7, 0xe3, 0x81, 0x8d, 0xe3, + 0x81, 0xbe, 0xe3, 0x81, 0x99, 0xe3, 0x80, 0x82, 0x00, 'i', + 'n', 'g', 0x00, 'n', 'd', 'o', 0x00, 'U', 'A', 'R', + 'T', ':', ' ', '1', '1', '5', '2', '0', '0', ' ', + 'N', '-', '8', '-', '1', 0x00, 'M', 'A', 'C', ':', + 0x00, '0', '1', '2', '3', '4', '5', '6', '7', '8', + '9', 'a', 'b', 'c', 'd', 'e', 'f', 0x00, +}; + +//***************************************************************************** +// +// The following global variables and #defines are intended to aid in setting +// up codepage mapping tables for use with this string table and an appropriate +// font. To use only this string table, GrLibInit may be called with a pointer +// to the g_GrLibDefaultlanguage structure. +// +//***************************************************************************** +tCodePointMap g_psCodePointMap_language[] = +{ + {CODEPAGE_UTF_8, CODEPAGE_UNICODE, GrMapUTF8_Unicode} +}; + +#define NUM_CODEPOINT_MAPS (sizeof(g_psCodePointMap_language) / sizeof(tCodePointMap)) + +tGrLibDefaults g_sGrLibDefaultlanguage = +{ + GrDefaultStringRenderer, + g_psCodePointMap_language, + CODEPAGE_UTF_8, + NUM_CODEPOINT_MAPS, + 0 +}; diff --git a/third_party/fonts/lang_demo/language.csv b/third_party/fonts/lang_demo/language.csv new file mode 100644 index 0000000..2199ed2 --- /dev/null +++ b/third_party/fonts/lang_demo/language.csv @@ -0,0 +1,23 @@ +Unused,GrLangEnUS,GrLangDe,GrLangEsSP,GrLangIt,GrLangZhPRC,GrLangKo,GrLangJp +STR_ENGLISH,English,English,English,English,English,English,English +STR_ITALIANO,Italiano,Italiano,Italiano,Italiano,Italiano,Italiano,Italiano, +STR_DEUTSCH,Deutsch,Deutsch,Deutsch,Deutsch,Deutsch,Deutsch,Deutsch, +STR_ESPANOL,Español,Español,Español,Español,Español,Español,Español, +STR_CHINESE,中国,中国,中国,中国,中国,中国,中国 +STR_KOREAN,한국어,한국어,한국어,한국어,한국어,한국어,한국어 +STR_JAPANESE,日本,日本,日本,日本,日本,日本,日本 +STR_APPNAME,lang_demo,lang_demo,lang_demo,lang_demo,lang_demo,lang_demo,lang_demo +STR_PLUS,+,+,+,+,+,+,+ +STR_MINUS,-,-,-,-,-,-,- +STR_CONFIG,Configuration,Konfiguration,Configuración,Configurazione,é…ç½®,구성,ã®æ§‹æˆ +STR_INTRO,Introduction,Einführung,Introducción,Introduzione,简介,소개,ã¯ã˜ã‚ +STR_UPDATE,Update,Aktualisierung,Actualización,Aggiornamento,æ›´æ–°,새롭게하다,æ›´æ–° +STR_LANGUAGE,Language,Sprache,Idioma,Lingua,语言,언어,言語 +STR_INTRO_1,This application demonstrates the capabilities of the language support provided with the TivaWare Graphics Library.,"Diese Anwendung zeigt die Fähigkeiten der Sprachunterstützung, die mit der TivaWare Graphics Library geliefert wird.",Esta aplicación demuestra las funciones que ofrece la TivaWare Graphics Library.,Questa applicazione fornisce le funzionalita di supporto linguistico incluse in TivaWare Graphics Library.,æ­¤åº”ç”¨ç¨‹åºæ¼”示与TivaWare图形库æä¾›çš„语言支æŒçš„能力。,ì´ ì‘ìš© í”„ë¡œê·¸ëž¨ì€ TivaWare 그래픽 ë¼ì´ë¸ŒëŸ¬ë¦¬ì™€ 함께 제공ë˜ëŠ” 언어 ì§€ì› ê¸°ëŠ¥ì„ ë³´ì—¬ì¤ë‹ˆë‹¤.,ã“ã®ã‚¢ãƒ—リケーションã§ã¯ã€ã‚¹ãƒ†ãƒ©ã®ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ãƒ©ã‚¤ãƒ–ãƒ©ãƒªã§æä¾›ã•れる言語サãƒãƒ¼ãƒˆã®æ©Ÿèƒ½ã‚’示ã—ã¦ã„ã¾ã™ã€‚ +STR_INTRO_2,The configuration panel allows the language to be switched and the effects will be seen immediately.,Der Konfigurationsbereich ermöglicht dem Benutzer eine sofortige Änderung der Sprache. Die Anderung kann sofort gesehen werden.,El panel de configuración le permite al usuario cambiar el idioma y ver los cambios inmediatamente.,Il pannello di configurazione consente all'utente di cambiare la lingua e visualizzare subito le modifiche.,é…ç½®é¢æ¿å…许的语言切æ¢çš„å½±å“将是立å³å¯è§ã€‚,구성 패ë„ì€ ì–¸ì–´ê°€ 전환 수 있으며 효과는 즉시 보여줄 것입니다.,設定パãƒãƒ«ã§ã¯ã€è¨€èªžã‚’切り替ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã—ã€åŠ¹æžœãŒã™ãã«è¦‹ã‚‰ã‚Œã¾ã™ã€‚ +STR_INTRO_3,Press the + and - buttons at the bottom of the screen to move between the panels.,"Drucken Sie auf die Tasten + und - unten auf dem Bildschirm, um zwischen den Bereichen zu wechseln.",Oprima las teclas de + y - al final de la pantalla para moverse entre los paneles.,Premere i pulsanti + e - posti nella parte inferiore dello schermo per spostarsi da un pannello all'altro.,按+å’Œ - 按钮在å±å¹•çš„åº•éƒ¨ä¹‹é—´ç§»åŠ¨çš„é¢æ¿ã€‚,íŒ¨ë„ ì‚¬ì´ë¥¼ ì´ë™ í™”ë©´ì˜ í•˜ë‹¨ì—있는 버튼 - +와를 누르십시오.,パãƒãƒ«é–“を移動ã™ã‚‹ã«ã¯ã€ç”»é¢ã®ä¸‹éƒ¨ã«ã‚るボタン - +ã¨ã‚’押ã—ã¦ãã ã•ã„。 +STR_UPDATE_TEXT,You may replace the software image flashed by pressing the Update button after setting up the LMFlash utility with the following information:,"Sie können das blinkende Software-Bild ersetzen, indem Sie auf die Schaltflache Aktualisieren klicken, nachdem Sie das Dienstprogramm mit den folgenden Informationen eingerichtet haben:",Usted puede reemplazar la imagen del software proyectada al oprimir el botón de Actualizar después de configurar la utilidad de LMFlash con la siguiente información:,E possibile sostituire l'immagine software ottenuta premendo il pulsante Aggiornamento dopo aver impostato il programma di utilita LMFlash con le seguenti informazioni.,您å¯èƒ½ä¼šå–代设立以下信æ¯LMFlash实用程åºåŽï¼ŒæŒ‰â€œæ›´æ–°â€æŒ‰é’®é—ªçŽ°çš„è½¯ä»¶æ˜ åƒï¼š,다ìŒê³¼ ê°™ì€ ì •ë³´ë¥¼ LMFlash 유틸리티를 설정 후 ì—…ë°ì´íЏ ë²„íŠ¼ì„ ëˆŒëŸ¬ ì´ì—ˆì§€ë§Œ 소프트웨어 ì´ë¯¸ì§€ë¥¼ 대체할 수 :,ã‚ãªãŸã¯ã€æ¬¡ã®æƒ…報をLMFlashユーティリティを設定ã—ãŸå¾Œã€[æ›´æ–°]ボタンを押ã—ã¦ã€ãƒ•ラッシュã®ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’ç½®ãæ›ãˆã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ +STR_UPDATING,Updating,Aktualisierung,Actualizando,Aggiornamento,æ›´æ–°,ì—…ë°ì´íЏ,æ›´æ–° +STR_UART,UART: 115200 N-8-1,UART: 115200 N-8-1,UART: 115200 N-8-1,UART: 115200 N-8-1,UART: 115200 N-8-1,UART: 115200 N-8-1,UART: 115200 N-8-1 +STR_MAC,MAC:,MAC:,MAC:,MAC:,MAC:,MAC:,MAC: +STR_HEXDIGITS,0123456789abcdef,0123456789abcdef,0123456789abcdef,0123456789abcdef,0123456789abcdef,0123456789abcdef,0123456789abcdef diff --git a/third_party/fonts/lang_demo/language.h b/third_party/fonts/lang_demo/language.h new file mode 100644 index 0000000..670fb5e --- /dev/null +++ b/third_party/fonts/lang_demo/language.h @@ -0,0 +1,59 @@ +//***************************************************************************** +// +// language.h - header file for a compressed string table. +// +// Copyright (c) 2008 Texas Instruments Incorporated. All rights reserved. +// TI Information - Selective Disclosure +// +// This is an auto-generated file. Do not edit by hand. +// +//***************************************************************************** + +#define SCOMP_MAX_STRLEN 202 // The maximum size of any string. + +extern const uint8_t g_pui8Tablelanguage[]; + +//***************************************************************************** +// +// SCOMP_STR_INDEX is an enumeration list that is used to select a string +// from the string table using the GrStringGet() function. +// +//***************************************************************************** +enum SCOMP_STR_INDEX +{ + STR_ENGLISH, + STR_ITALIANO, + STR_DEUTSCH, + STR_ESPANOL, + STR_CHINESE, + STR_KOREAN, + STR_JAPANESE, + STR_APPNAME, + STR_PLUS, + STR_MINUS, + STR_CONFIG, + STR_INTRO, + STR_UPDATE, + STR_LANGUAGE, + STR_INTRO_1, + STR_INTRO_2, + STR_INTRO_3, + STR_UPDATE_TEXT, + STR_UPDATING, + STR_UART, + STR_MAC, + STR_HEXDIGITS, +}; +//***************************************************************************** +// +// The following global variables and #defines are intended to aid in setting +// up codepage mapping tables for use with this string table and an appropriate +// font. To use only this string table, GrLibInit may be called with a pointer +// to the g_GrLibDefaultlanguage structure. +// +//***************************************************************************** +extern tCodePointMap g_psCodePointMap_language[]; + +#define GRLIB_UNICODE_MAP_language {CODEPAGE_UTF_8, CODEPAGE_UNICODE, GrMapUTF8_Unicode} + +extern tGrLibDefaults g_sGrLibDefaultlanguage; diff --git a/third_party/fonts/lang_demo/readme.txt b/third_party/fonts/lang_demo/readme.txt new file mode 100644 index 0000000..265f396 --- /dev/null +++ b/third_party/fonts/lang_demo/readme.txt @@ -0,0 +1,43 @@ +Custom Font for lang_demo +------------------------- + +This directory contains files illustrating how to generate an +application-specific font containing only the minimum set of +characters required to display the contents of a given string +table in multiple languages. The fonts and string tables +built here are used by the lang_demo example found in the +TivaWare releases for several boards. + +Input files to this process are: + +1. language.csv - a comma-separated-value file containing UTF8 + strings in each of the 7 supported languages. This file is + application-specific. + +2. Font files containing the characters required to render the + strings in langauge.csv. In this example, we require a total + of 3 fonts, one for basic western characters, one for + simplified Chinese ideographs and another for Korean and + Japanese. + +Run "make" to generate the following files from language.csv: + +1. language.c and langremap.c - Two versions of the output + string table, one encoded using the original UTF8 text and + the other with the codepage remapped to minimize the size of + the strings. +2. language.h and langremap.h - Header files containing string + IDs for the appropriate string tables. +3. fontcustom16pt.c - A custom font encoding only the characters + found in the language.csv string table. This version creates + a font indexed using the Unicode codepage. This should be used + with the language.c and language.h versions of the string + table. +4. fontcustomr16pt.c - Another cusom font encoding only the + characters found in the language.csv string table. This font + is indexed using an optimized custom codepage and should be + used with the langremap.c and langremap.h versions of the + string table output. + + +2. font diff --git a/third_party/fonts/ofl/OFL.txt b/third_party/fonts/ofl/OFL.txt new file mode 100644 index 0000000..cf9a3d1 --- /dev/null +++ b/third_party/fonts/ofl/OFL.txt @@ -0,0 +1,94 @@ +Copyright (c) 2004-2008, SIL International (http://scripts.sil.org), +with Reserved Font Names 'Andika' and 'SIL'. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/third_party/fonts/ofl/binfonts/fonthandwriting14pt.bin b/third_party/fonts/ofl/binfonts/fonthandwriting14pt.bin new file mode 100644 index 0000000..eb252e3 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthandwriting14pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthandwriting16pt.bin b/third_party/fonts/ofl/binfonts/fonthandwriting16pt.bin new file mode 100644 index 0000000..937bde7 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthandwriting16pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthandwriting18pt.bin b/third_party/fonts/ofl/binfonts/fonthandwriting18pt.bin new file mode 100644 index 0000000..460e49a Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthandwriting18pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthandwriting20pt.bin b/third_party/fonts/ofl/binfonts/fonthandwriting20pt.bin new file mode 100644 index 0000000..120d697 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthandwriting20pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthandwriting22pt.bin b/third_party/fonts/ofl/binfonts/fonthandwriting22pt.bin new file mode 100644 index 0000000..5f5702f Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthandwriting22pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthandwriting24pt.bin b/third_party/fonts/ofl/binfonts/fonthandwriting24pt.bin new file mode 100644 index 0000000..f00a66c Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthandwriting24pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthandwriting26pt.bin b/third_party/fonts/ofl/binfonts/fonthandwriting26pt.bin new file mode 100644 index 0000000..793a3ce Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthandwriting26pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthandwriting28pt.bin b/third_party/fonts/ofl/binfonts/fonthandwriting28pt.bin new file mode 100644 index 0000000..2642fe3 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthandwriting28pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthandwriting30pt.bin b/third_party/fonts/ofl/binfonts/fonthandwriting30pt.bin new file mode 100644 index 0000000..f123c9f Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthandwriting30pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulgothic16pt.bin b/third_party/fonts/ofl/binfonts/fonthangulgothic16pt.bin new file mode 100644 index 0000000..b88755e Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulgothic16pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulgothic16ptb.bin b/third_party/fonts/ofl/binfonts/fonthangulgothic16ptb.bin new file mode 100644 index 0000000..702583c Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulgothic16ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulgothic18pt.bin b/third_party/fonts/ofl/binfonts/fonthangulgothic18pt.bin new file mode 100644 index 0000000..29486ec Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulgothic18pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulgothic18ptb.bin b/third_party/fonts/ofl/binfonts/fonthangulgothic18ptb.bin new file mode 100644 index 0000000..9968ab5 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulgothic18ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulgothic20pt.bin b/third_party/fonts/ofl/binfonts/fonthangulgothic20pt.bin new file mode 100644 index 0000000..d73884a Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulgothic20pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulgothic20ptb.bin b/third_party/fonts/ofl/binfonts/fonthangulgothic20ptb.bin new file mode 100644 index 0000000..ef4aa6a Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulgothic20ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulgothic22pt.bin b/third_party/fonts/ofl/binfonts/fonthangulgothic22pt.bin new file mode 100644 index 0000000..b5dc946 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulgothic22pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulgothic22ptb.bin b/third_party/fonts/ofl/binfonts/fonthangulgothic22ptb.bin new file mode 100644 index 0000000..c7c673d Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulgothic22ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulgothic24pt.bin b/third_party/fonts/ofl/binfonts/fonthangulgothic24pt.bin new file mode 100644 index 0000000..b910d65 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulgothic24pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulgothic24ptb.bin b/third_party/fonts/ofl/binfonts/fonthangulgothic24ptb.bin new file mode 100644 index 0000000..80f2b85 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulgothic24ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulmyeongjo16pt.bin b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo16pt.bin new file mode 100644 index 0000000..d35b4a1 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo16pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulmyeongjo16ptb.bin b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo16ptb.bin new file mode 100644 index 0000000..679d1f9 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo16ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulmyeongjo18pt.bin b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo18pt.bin new file mode 100644 index 0000000..e6848b5 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo18pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulmyeongjo18ptb.bin b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo18ptb.bin new file mode 100644 index 0000000..65fef61 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo18ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulmyeongjo20pt.bin b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo20pt.bin new file mode 100644 index 0000000..64182ee Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo20pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulmyeongjo20ptb.bin b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo20ptb.bin new file mode 100644 index 0000000..81791e8 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo20ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulmyeongjo22pt.bin b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo22pt.bin new file mode 100644 index 0000000..ab34ed7 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo22pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulmyeongjo22ptb.bin b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo22ptb.bin new file mode 100644 index 0000000..0ecd1d5 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo22ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulmyeongjo24pt.bin b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo24pt.bin new file mode 100644 index 0000000..40b8b38 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo24pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonthangulmyeongjo24ptb.bin b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo24ptb.bin new file mode 100644 index 0000000..8b7dc3e Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonthangulmyeongjo24ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard14pt.bin b/third_party/fonts/ofl/binfonts/fontoldstandard14pt.bin new file mode 100644 index 0000000..b0c5e83 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard14pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard14ptb.bin b/third_party/fonts/ofl/binfonts/fontoldstandard14ptb.bin new file mode 100644 index 0000000..410ef13 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard14ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard14pti.bin b/third_party/fonts/ofl/binfonts/fontoldstandard14pti.bin new file mode 100644 index 0000000..0732ea6 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard14pti.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard16pt.bin b/third_party/fonts/ofl/binfonts/fontoldstandard16pt.bin new file mode 100644 index 0000000..18d2923 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard16pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard16ptb.bin b/third_party/fonts/ofl/binfonts/fontoldstandard16ptb.bin new file mode 100644 index 0000000..813046d Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard16ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard16pti.bin b/third_party/fonts/ofl/binfonts/fontoldstandard16pti.bin new file mode 100644 index 0000000..2a5905c Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard16pti.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard18pt.bin b/third_party/fonts/ofl/binfonts/fontoldstandard18pt.bin new file mode 100644 index 0000000..f61c10e Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard18pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard18ptb.bin b/third_party/fonts/ofl/binfonts/fontoldstandard18ptb.bin new file mode 100644 index 0000000..218806a Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard18ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard18pti.bin b/third_party/fonts/ofl/binfonts/fontoldstandard18pti.bin new file mode 100644 index 0000000..b451f9d Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard18pti.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard20pt.bin b/third_party/fonts/ofl/binfonts/fontoldstandard20pt.bin new file mode 100644 index 0000000..284e7f6 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard20pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard20ptb.bin b/third_party/fonts/ofl/binfonts/fontoldstandard20ptb.bin new file mode 100644 index 0000000..16faad7 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard20ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard20pti.bin b/third_party/fonts/ofl/binfonts/fontoldstandard20pti.bin new file mode 100644 index 0000000..44b2c86 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard20pti.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard22pt.bin b/third_party/fonts/ofl/binfonts/fontoldstandard22pt.bin new file mode 100644 index 0000000..c455cc6 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard22pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard22ptb.bin b/third_party/fonts/ofl/binfonts/fontoldstandard22ptb.bin new file mode 100644 index 0000000..dd8c37e Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard22ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard22pti.bin b/third_party/fonts/ofl/binfonts/fontoldstandard22pti.bin new file mode 100644 index 0000000..db0192a Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard22pti.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard24pt.bin b/third_party/fonts/ofl/binfonts/fontoldstandard24pt.bin new file mode 100644 index 0000000..380a077 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard24pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard24ptb.bin b/third_party/fonts/ofl/binfonts/fontoldstandard24ptb.bin new file mode 100644 index 0000000..3cac649 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard24ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard24pti.bin b/third_party/fonts/ofl/binfonts/fontoldstandard24pti.bin new file mode 100644 index 0000000..ca9f3db Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard24pti.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard26pt.bin b/third_party/fonts/ofl/binfonts/fontoldstandard26pt.bin new file mode 100644 index 0000000..515f2f3 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard26pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard26ptb.bin b/third_party/fonts/ofl/binfonts/fontoldstandard26ptb.bin new file mode 100644 index 0000000..6928f36 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard26ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard26pti.bin b/third_party/fonts/ofl/binfonts/fontoldstandard26pti.bin new file mode 100644 index 0000000..c7e078e Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard26pti.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard28pt.bin b/third_party/fonts/ofl/binfonts/fontoldstandard28pt.bin new file mode 100644 index 0000000..afc8c69 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard28pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard28ptb.bin b/third_party/fonts/ofl/binfonts/fontoldstandard28ptb.bin new file mode 100644 index 0000000..eac0827 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard28ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard28pti.bin b/third_party/fonts/ofl/binfonts/fontoldstandard28pti.bin new file mode 100644 index 0000000..f82645e Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard28pti.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard30pt.bin b/third_party/fonts/ofl/binfonts/fontoldstandard30pt.bin new file mode 100644 index 0000000..1b250f9 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard30pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard30ptb.bin b/third_party/fonts/ofl/binfonts/fontoldstandard30ptb.bin new file mode 100644 index 0000000..ec83a0f Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard30ptb.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontoldstandard30pti.bin b/third_party/fonts/ofl/binfonts/fontoldstandard30pti.bin new file mode 100644 index 0000000..97280c9 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontoldstandard30pti.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontsansand14pt.bin b/third_party/fonts/ofl/binfonts/fontsansand14pt.bin new file mode 100644 index 0000000..ebc18ea Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontsansand14pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontsansand16pt.bin b/third_party/fonts/ofl/binfonts/fontsansand16pt.bin new file mode 100644 index 0000000..8379950 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontsansand16pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontsansand18pt.bin b/third_party/fonts/ofl/binfonts/fontsansand18pt.bin new file mode 100644 index 0000000..155efcb Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontsansand18pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontsansand20pt.bin b/third_party/fonts/ofl/binfonts/fontsansand20pt.bin new file mode 100644 index 0000000..7b2f3f2 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontsansand20pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontsansand22pt.bin b/third_party/fonts/ofl/binfonts/fontsansand22pt.bin new file mode 100644 index 0000000..0d66577 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontsansand22pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontsansand24pt.bin b/third_party/fonts/ofl/binfonts/fontsansand24pt.bin new file mode 100644 index 0000000..30df880 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontsansand24pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontsansand26pt.bin b/third_party/fonts/ofl/binfonts/fontsansand26pt.bin new file mode 100644 index 0000000..13d80a3 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontsansand26pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontsansand28pt.bin b/third_party/fonts/ofl/binfonts/fontsansand28pt.bin new file mode 100644 index 0000000..37e6023 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontsansand28pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fontsansand30pt.bin b/third_party/fonts/ofl/binfonts/fontsansand30pt.bin new file mode 100644 index 0000000..b2e7aad Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fontsansand30pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanodidot14pt.bin b/third_party/fonts/ofl/binfonts/fonttheanodidot14pt.bin new file mode 100644 index 0000000..b7c4471 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanodidot14pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanodidot16pt.bin b/third_party/fonts/ofl/binfonts/fonttheanodidot16pt.bin new file mode 100644 index 0000000..efa9e43 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanodidot16pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanodidot18pt.bin b/third_party/fonts/ofl/binfonts/fonttheanodidot18pt.bin new file mode 100644 index 0000000..83b8fbd Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanodidot18pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanodidot20pt.bin b/third_party/fonts/ofl/binfonts/fonttheanodidot20pt.bin new file mode 100644 index 0000000..2a703d4 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanodidot20pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanodidot22pt.bin b/third_party/fonts/ofl/binfonts/fonttheanodidot22pt.bin new file mode 100644 index 0000000..ad785d1 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanodidot22pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanodidot24pt.bin b/third_party/fonts/ofl/binfonts/fonttheanodidot24pt.bin new file mode 100644 index 0000000..69f427a Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanodidot24pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanodidot26pt.bin b/third_party/fonts/ofl/binfonts/fonttheanodidot26pt.bin new file mode 100644 index 0000000..0ae371d Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanodidot26pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanodidot28pt.bin b/third_party/fonts/ofl/binfonts/fonttheanodidot28pt.bin new file mode 100644 index 0000000..f063c05 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanodidot28pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanodidot30pt.bin b/third_party/fonts/ofl/binfonts/fonttheanodidot30pt.bin new file mode 100644 index 0000000..3cf0cad Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanodidot30pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanomodern14pt.bin b/third_party/fonts/ofl/binfonts/fonttheanomodern14pt.bin new file mode 100644 index 0000000..f88baf2 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanomodern14pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanomodern16pt.bin b/third_party/fonts/ofl/binfonts/fonttheanomodern16pt.bin new file mode 100644 index 0000000..cb2c1c9 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanomodern16pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanomodern18pt.bin b/third_party/fonts/ofl/binfonts/fonttheanomodern18pt.bin new file mode 100644 index 0000000..fbce492 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanomodern18pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanomodern20pt.bin b/third_party/fonts/ofl/binfonts/fonttheanomodern20pt.bin new file mode 100644 index 0000000..10bef0e Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanomodern20pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanomodern22pt.bin b/third_party/fonts/ofl/binfonts/fonttheanomodern22pt.bin new file mode 100644 index 0000000..64c74bd Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanomodern22pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanomodern24pt.bin b/third_party/fonts/ofl/binfonts/fonttheanomodern24pt.bin new file mode 100644 index 0000000..313de6e Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanomodern24pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanomodern26pt.bin b/third_party/fonts/ofl/binfonts/fonttheanomodern26pt.bin new file mode 100644 index 0000000..3eed4f2 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanomodern26pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanomodern28pt.bin b/third_party/fonts/ofl/binfonts/fonttheanomodern28pt.bin new file mode 100644 index 0000000..0d1b2d8 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanomodern28pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanomodern30pt.bin b/third_party/fonts/ofl/binfonts/fonttheanomodern30pt.bin new file mode 100644 index 0000000..a07ec9b Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanomodern30pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanooldstyle14pt.bin b/third_party/fonts/ofl/binfonts/fonttheanooldstyle14pt.bin new file mode 100644 index 0000000..4097180 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanooldstyle14pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanooldstyle16pt.bin b/third_party/fonts/ofl/binfonts/fonttheanooldstyle16pt.bin new file mode 100644 index 0000000..400eb98 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanooldstyle16pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanooldstyle18pt.bin b/third_party/fonts/ofl/binfonts/fonttheanooldstyle18pt.bin new file mode 100644 index 0000000..27dd05d Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanooldstyle18pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanooldstyle20pt.bin b/third_party/fonts/ofl/binfonts/fonttheanooldstyle20pt.bin new file mode 100644 index 0000000..e22cb21 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanooldstyle20pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanooldstyle22pt.bin b/third_party/fonts/ofl/binfonts/fonttheanooldstyle22pt.bin new file mode 100644 index 0000000..5c1c7bd Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanooldstyle22pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanooldstyle24pt.bin b/third_party/fonts/ofl/binfonts/fonttheanooldstyle24pt.bin new file mode 100644 index 0000000..fedb551 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanooldstyle24pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanooldstyle26pt.bin b/third_party/fonts/ofl/binfonts/fonttheanooldstyle26pt.bin new file mode 100644 index 0000000..2dbf616 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanooldstyle26pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanooldstyle28pt.bin b/third_party/fonts/ofl/binfonts/fonttheanooldstyle28pt.bin new file mode 100644 index 0000000..10c8ef1 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanooldstyle28pt.bin differ diff --git a/third_party/fonts/ofl/binfonts/fonttheanooldstyle30pt.bin b/third_party/fonts/ofl/binfonts/fonttheanooldstyle30pt.bin new file mode 100644 index 0000000..fd54de2 Binary files /dev/null and b/third_party/fonts/ofl/binfonts/fonttheanooldstyle30pt.bin differ diff --git a/third_party/fonts/ofl/fonts/fontcjktest20pt.c b/third_party/fonts/ofl/fonts/fontcjktest20pt.c new file mode 100644 index 0000000..af10c82 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontcjktest20pt.c @@ -0,0 +1,2027 @@ +//***************************************************************************** +// +// fontcjktest20pt.c - Font definition for the 20ptpt Cjktest font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 510 in 4 blocks +// Style: cjktest +// Size: 20pt +// Bold: no +// Italic: no +// Memory usage: 17571 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Cjktest20pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 19, + + // + // The height of the font. + // + 20, + + // + // The baseline of the font. + // + 16, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (4). + // + 4, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3041 - 0x30ff + // + 0x41, 0x30, 0x00, 0x00, + 0xbf, 0x00, 0x00, 0x00, + 0x34, 0x0b, 0x00, 0x00, + + // + // Block header 2: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0xfc, 0x20, 0x00, 0x00, + + // + // Block header 3: Codepoints 0xac00 - 0xac7f + // + 0x00, 0xac, 0x00, 0x00, + 0x80, 0x00, 0x00, 0x00, + 0x00, 0x2d, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x91, 0x01, 0x00, 0x00, // Offset 401 (0x191) + 0x9e, 0x01, 0x00, 0x00, // Offset 414 (0x19e) + 0xc0, 0x01, 0x00, 0x00, // Offset 448 (0x1c0) + 0xdf, 0x01, 0x00, 0x00, // Offset 479 (0x1df) + 0x11, 0x02, 0x00, 0x00, // Offset 529 (0x211) + 0x38, 0x02, 0x00, 0x00, // Offset 568 (0x238) + 0x41, 0x02, 0x00, 0x00, // Offset 577 (0x241) + 0x56, 0x02, 0x00, 0x00, // Offset 598 (0x256) + 0x6b, 0x02, 0x00, 0x00, // Offset 619 (0x26b) + 0x7d, 0x02, 0x00, 0x00, // Offset 637 (0x27d) + 0x8d, 0x02, 0x00, 0x00, // Offset 653 (0x28d) + 0x96, 0x02, 0x00, 0x00, // Offset 662 (0x296) + 0x9d, 0x02, 0x00, 0x00, // Offset 669 (0x29d) + 0xa4, 0x02, 0x00, 0x00, // Offset 676 (0x2a4) + 0xba, 0x02, 0x00, 0x00, // Offset 698 (0x2ba) + 0xdc, 0x02, 0x00, 0x00, // Offset 732 (0x2dc) + 0xf1, 0x02, 0x00, 0x00, // Offset 753 (0x2f1) + 0x07, 0x03, 0x00, 0x00, // Offset 775 (0x307) + 0x1e, 0x03, 0x00, 0x00, // Offset 798 (0x31e) + 0x3c, 0x03, 0x00, 0x00, // Offset 828 (0x33c) + 0x52, 0x03, 0x00, 0x00, // Offset 850 (0x352) + 0x6f, 0x03, 0x00, 0x00, // Offset 879 (0x36f) + 0x84, 0x03, 0x00, 0x00, // Offset 900 (0x384) + 0xa4, 0x03, 0x00, 0x00, // Offset 932 (0x3a4) + 0xc1, 0x03, 0x00, 0x00, // Offset 961 (0x3c1) + 0xcb, 0x03, 0x00, 0x00, // Offset 971 (0x3cb) + 0xd6, 0x03, 0x00, 0x00, // Offset 982 (0x3d6) + 0xeb, 0x03, 0x00, 0x00, // Offset 1003 (0x3eb) + 0xf6, 0x03, 0x00, 0x00, // Offset 1014 (0x3f6) + 0x0c, 0x04, 0x00, 0x00, // Offset 1036 (0x40c) + 0x20, 0x04, 0x00, 0x00, // Offset 1056 (0x420) + 0x53, 0x04, 0x00, 0x00, // Offset 1107 (0x453) + 0x75, 0x04, 0x00, 0x00, // Offset 1141 (0x475) + 0x96, 0x04, 0x00, 0x00, // Offset 1174 (0x496) + 0xac, 0x04, 0x00, 0x00, // Offset 1196 (0x4ac) + 0xce, 0x04, 0x00, 0x00, // Offset 1230 (0x4ce) + 0xe3, 0x04, 0x00, 0x00, // Offset 1251 (0x4e3) + 0xf8, 0x04, 0x00, 0x00, // Offset 1272 (0x4f8) + 0x15, 0x05, 0x00, 0x00, // Offset 1301 (0x515) + 0x38, 0x05, 0x00, 0x00, // Offset 1336 (0x538) + 0x4a, 0x05, 0x00, 0x00, // Offset 1354 (0x54a) + 0x5e, 0x05, 0x00, 0x00, // Offset 1374 (0x55e) + 0x81, 0x05, 0x00, 0x00, // Offset 1409 (0x581) + 0x95, 0x05, 0x00, 0x00, // Offset 1429 (0x595) + 0xd1, 0x05, 0x00, 0x00, // Offset 1489 (0x5d1) + 0xff, 0x05, 0x00, 0x00, // Offset 1535 (0x5ff) + 0x22, 0x06, 0x00, 0x00, // Offset 1570 (0x622) + 0x3e, 0x06, 0x00, 0x00, // Offset 1598 (0x63e) + 0x62, 0x06, 0x00, 0x00, // Offset 1634 (0x662) + 0x84, 0x06, 0x00, 0x00, // Offset 1668 (0x684) + 0x9a, 0x06, 0x00, 0x00, // Offset 1690 (0x69a) + 0xaf, 0x06, 0x00, 0x00, // Offset 1711 (0x6af) + 0xd2, 0x06, 0x00, 0x00, // Offset 1746 (0x6d2) + 0xf4, 0x06, 0x00, 0x00, // Offset 1780 (0x6f4) + 0x30, 0x07, 0x00, 0x00, // Offset 1840 (0x730) + 0x51, 0x07, 0x00, 0x00, // Offset 1873 (0x751) + 0x6d, 0x07, 0x00, 0x00, // Offset 1901 (0x76d) + 0x82, 0x07, 0x00, 0x00, // Offset 1922 (0x782) + 0x98, 0x07, 0x00, 0x00, // Offset 1944 (0x798) + 0xcb, 0x07, 0x00, 0x00, // Offset 1995 (0x7cb) + 0xe1, 0x07, 0x00, 0x00, // Offset 2017 (0x7e1) + 0xf7, 0x07, 0x00, 0x00, // Offset 2039 (0x7f7) + 0xfd, 0x07, 0x00, 0x00, // Offset 2045 (0x7fd) + 0x05, 0x08, 0x00, 0x00, // Offset 2053 (0x805) + 0x1e, 0x08, 0x00, 0x00, // Offset 2078 (0x81e) + 0x3e, 0x08, 0x00, 0x00, // Offset 2110 (0x83e) + 0x50, 0x08, 0x00, 0x00, // Offset 2128 (0x850) + 0x71, 0x08, 0x00, 0x00, // Offset 2161 (0x871) + 0x87, 0x08, 0x00, 0x00, // Offset 2183 (0x887) + 0x9c, 0x08, 0x00, 0x00, // Offset 2204 (0x89c) + 0xba, 0x08, 0x00, 0x00, // Offset 2234 (0x8ba) + 0xda, 0x08, 0x00, 0x00, // Offset 2266 (0x8da) + 0xea, 0x08, 0x00, 0x00, // Offset 2282 (0x8ea) + 0xfe, 0x08, 0x00, 0x00, // Offset 2302 (0x8fe) + 0x1c, 0x09, 0x00, 0x00, // Offset 2332 (0x91c) + 0x2f, 0x09, 0x00, 0x00, // Offset 2351 (0x92f) + 0x58, 0x09, 0x00, 0x00, // Offset 2392 (0x958) + 0x75, 0x09, 0x00, 0x00, // Offset 2421 (0x975) + 0x90, 0x09, 0x00, 0x00, // Offset 2448 (0x990) + 0xae, 0x09, 0x00, 0x00, // Offset 2478 (0x9ae) + 0xcc, 0x09, 0x00, 0x00, // Offset 2508 (0x9cc) + 0xde, 0x09, 0x00, 0x00, // Offset 2526 (0x9de) + 0xf0, 0x09, 0x00, 0x00, // Offset 2544 (0x9f0) + 0x03, 0x0a, 0x00, 0x00, // Offset 2563 (0xa03) + 0x20, 0x0a, 0x00, 0x00, // Offset 2592 (0xa20) + 0x3a, 0x0a, 0x00, 0x00, // Offset 2618 (0xa3a) + 0x67, 0x0a, 0x00, 0x00, // Offset 2663 (0xa67) + 0x81, 0x0a, 0x00, 0x00, // Offset 2689 (0xa81) + 0x9c, 0x0a, 0x00, 0x00, // Offset 2716 (0xa9c) + 0xae, 0x0a, 0x00, 0x00, // Offset 2734 (0xaae) + 0xc4, 0x0a, 0x00, 0x00, // Offset 2756 (0xac4) + 0xd8, 0x0a, 0x00, 0x00, // Offset 2776 (0xad8) + 0xee, 0x0a, 0x00, 0x00, // Offset 2798 (0xaee) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 9, 0, 22, 64, 16, 3, 97, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 129, 33, 176, 13, 6, 193, + 33, 33, 33, 33, 33, 33, 33, 0, 10, 96, 34, 12, + 240, 194, 49, 97, 50, 97, 50, 97, 50, 97, 49, 74, + 66, 49, 98, 49, 97, 50, 74, 65, 50, 97, 49, 98, + 49, 98, 49, 98, 49, 240, 240, 176, 31, 10, 225, 118, + 50, 17, 81, 49, 81, 49, 81, 49, 98, 17, 115, 131, + 131, 113, 18, 97, 33, 97, 33, 97, 33, 97, 17, 54, + 129, 145, 240, 50, 19, 240, 242, 131, 97, 129, 49, 66, + 113, 81, 49, 129, 81, 33, 145, 81, 33, 145, 81, 17, + 177, 49, 18, 195, 33, 67, 162, 49, 49, 145, 49, 81, + 114, 49, 81, 113, 65, 81, 98, 65, 81, 97, 97, 49, + 97, 131, 0, 7, 80, 39, 15, 240, 240, 68, 161, 50, + 129, 81, 129, 81, 129, 81, 145, 49, 164, 164, 81, 66, + 34, 65, 50, 66, 49, 49, 98, 17, 65, 115, 65, 115, + 82, 66, 18, 86, 50, 0, 5, 112, 9, 3, 97, 33, + 33, 33, 240, 240, 224, 21, 6, 241, 65, 81, 65, 81, + 66, 65, 81, 81, 81, 81, 81, 81, 97, 81, 97, 81, + 97, 32, 21, 6, 193, 97, 81, 97, 81, 82, 81, 81, + 81, 81, 81, 81, 66, 65, 81, 65, 81, 65, 80, 18, + 9, 0, 7, 17, 129, 81, 33, 33, 39, 67, 97, 17, + 81, 49, 0, 8, 32, 16, 13, 0, 8, 97, 193, 193, + 193, 123, 113, 193, 193, 193, 193, 0, 9, 9, 4, 0, + 8, 2, 34, 33, 49, 48, 7, 7, 0, 7, 117, 0, + 9, 7, 4, 0, 8, 2, 34, 160, 22, 9, 240, 145, + 129, 114, 113, 114, 114, 113, 114, 114, 113, 114, 114, 113, + 114, 113, 129, 113, 240, 32, 34, 12, 240, 196, 113, 65, + 81, 97, 65, 97, 49, 129, 33, 129, 33, 129, 33, 129, + 33, 129, 33, 129, 33, 129, 34, 98, 49, 97, 81, 65, + 116, 240, 240, 176, 21, 6, 241, 51, 34, 17, 33, 33, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 240, + 80, 22, 11, 240, 133, 97, 65, 177, 161, 161, 161, 145, + 146, 145, 145, 146, 130, 130, 130, 153, 240, 240, 80, 23, + 11, 240, 134, 81, 81, 177, 161, 161, 146, 130, 84, 178, + 177, 161, 161, 146, 33, 82, 70, 240, 240, 112, 30, 13, + 240, 240, 34, 163, 161, 17, 146, 17, 130, 33, 129, 49, + 114, 49, 98, 65, 97, 81, 82, 81, 91, 145, 193, 193, + 193, 240, 240, 224, 22, 10, 240, 87, 49, 145, 145, 145, + 145, 150, 146, 161, 145, 145, 145, 130, 33, 66, 53, 240, + 240, 80, 29, 11, 240, 181, 66, 130, 145, 145, 161, 161, + 36, 67, 65, 50, 97, 33, 113, 33, 113, 33, 113, 49, + 82, 50, 50, 85, 240, 240, 112, 21, 11, 240, 121, 146, + 145, 161, 146, 145, 146, 145, 146, 146, 145, 146, 145, 146, + 145, 240, 240, 176, 32, 12, 240, 196, 113, 65, 81, 97, + 65, 97, 65, 97, 81, 65, 116, 132, 99, 35, 50, 98, + 33, 129, 33, 129, 33, 129, 50, 66, 101, 240, 240, 160, + 29, 11, 240, 149, 82, 50, 50, 81, 49, 113, 33, 113, + 33, 113, 33, 98, 49, 67, 69, 17, 161, 161, 145, 146, + 130, 69, 240, 240, 144, 10, 4, 240, 18, 34, 240, 242, + 34, 240, 112, 11, 4, 240, 18, 34, 240, 242, 34, 33, + 49, 240, 21, 11, 240, 226, 130, 130, 130, 130, 130, 130, + 130, 146, 162, 162, 162, 162, 162, 162, 161, 177, 208, 11, + 13, 0, 11, 59, 240, 240, 187, 0, 13, 32, 22, 11, + 240, 113, 177, 177, 177, 178, 162, 162, 161, 162, 130, 130, + 130, 130, 130, 130, 130, 145, 240, 96, 20, 9, 240, 53, + 145, 145, 129, 129, 114, 113, 113, 113, 113, 129, 240, 178, + 114, 240, 240, 32, 51, 17, 240, 240, 150, 146, 82, 113, + 146, 65, 83, 49, 65, 65, 50, 33, 33, 65, 66, 33, + 33, 49, 82, 33, 33, 49, 81, 49, 33, 49, 66, 49, + 33, 49, 66, 33, 65, 33, 50, 33, 81, 51, 19, 113, + 161, 98, 98, 150, 0, 7, 16, 34, 15, 240, 240, 83, + 195, 193, 17, 178, 18, 161, 34, 146, 49, 145, 66, 114, + 81, 114, 82, 97, 98, 90, 81, 130, 50, 145, 50, 146, + 33, 162, 0, 5, 112, 33, 11, 240, 118, 81, 81, 65, + 97, 49, 97, 49, 97, 49, 97, 49, 66, 70, 81, 82, + 49, 113, 33, 113, 33, 113, 33, 113, 33, 82, 54, 240, + 240, 128, 22, 13, 240, 240, 22, 82, 161, 177, 178, 177, + 193, 193, 193, 193, 194, 193, 209, 210, 199, 240, 240, 176, + 34, 13, 240, 183, 97, 83, 65, 114, 49, 129, 49, 145, + 33, 145, 33, 145, 33, 145, 33, 145, 33, 145, 33, 130, + 33, 129, 49, 113, 65, 82, 86, 0, 5, 96, 21, 10, + 240, 87, 49, 145, 145, 145, 145, 145, 151, 49, 145, 145, + 145, 145, 145, 152, 240, 240, 32, 21, 9, 240, 55, 33, + 129, 129, 129, 129, 129, 135, 33, 129, 129, 129, 129, 129, + 129, 240, 240, 80, 29, 14, 240, 240, 39, 83, 162, 193, + 194, 193, 209, 209, 101, 33, 161, 33, 161, 34, 145, 49, + 145, 65, 129, 82, 97, 103, 240, 240, 240, 35, 12, 240, + 145, 129, 33, 129, 33, 129, 33, 129, 33, 129, 33, 129, + 33, 129, 42, 33, 129, 33, 129, 33, 129, 33, 129, 33, + 129, 33, 129, 33, 129, 240, 240, 128, 18, 3, 97, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 176, 20, 7, 240, 49, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 81, 52, 240, 144, 35, 11, + 240, 113, 98, 33, 82, 49, 66, 65, 65, 81, 50, 81, + 34, 97, 18, 117, 98, 33, 97, 50, 81, 66, 65, 81, + 65, 82, 49, 98, 33, 113, 240, 240, 80, 20, 9, 240, + 49, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 135, 240, 224, 60, 17, 240, 240, 66, 178, 35, + 147, 33, 17, 147, 33, 18, 114, 17, 33, 18, 114, 17, + 33, 33, 113, 33, 33, 34, 82, 33, 33, 49, 81, 49, + 33, 50, 50, 49, 33, 65, 50, 49, 33, 65, 49, 65, + 33, 66, 18, 65, 33, 81, 17, 81, 33, 83, 81, 33, + 97, 97, 0, 6, 80, 46, 13, 240, 178, 129, 35, 113, + 35, 113, 33, 18, 97, 33, 34, 81, 33, 34, 81, 33, + 50, 65, 33, 50, 65, 33, 66, 49, 33, 82, 33, 33, + 82, 33, 33, 98, 17, 33, 98, 17, 33, 115, 33, 130, + 240, 240, 176, 35, 15, 240, 240, 69, 130, 82, 82, 114, + 65, 145, 50, 146, 33, 177, 33, 177, 33, 177, 33, 177, + 33, 177, 34, 146, 49, 145, 66, 114, 82, 82, 133, 0, + 6, 48, 28, 11, 240, 119, 65, 97, 49, 113, 33, 113, + 33, 113, 33, 113, 33, 98, 33, 82, 54, 81, 161, 161, + 161, 161, 161, 240, 240, 208, 36, 15, 240, 240, 69, 130, + 82, 82, 114, 65, 145, 50, 146, 33, 177, 33, 177, 33, + 177, 33, 177, 33, 177, 34, 146, 49, 145, 66, 114, 82, + 82, 134, 210, 226, 226, 48, 34, 12, 240, 151, 81, 82, + 65, 113, 49, 113, 49, 113, 49, 113, 49, 98, 49, 82, + 71, 81, 81, 81, 82, 65, 97, 65, 98, 49, 113, 49, + 114, 240, 240, 128, 22, 10, 240, 117, 65, 129, 145, 145, + 161, 162, 147, 146, 146, 145, 145, 145, 33, 81, 54, 240, + 240, 64, 21, 12, 240, 154, 113, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 240, 240, 192, 35, + 13, 240, 177, 145, 33, 145, 33, 145, 33, 145, 33, 145, + 33, 145, 33, 145, 33, 145, 33, 145, 33, 145, 33, 145, + 33, 145, 49, 113, 66, 82, 101, 240, 240, 224, 34, 15, + 240, 242, 146, 49, 146, 50, 129, 81, 114, 81, 113, 98, + 97, 113, 82, 114, 65, 130, 65, 145, 50, 146, 33, 177, + 18, 177, 17, 195, 210, 0, 6, 64, 60, 21, 240, 240, + 193, 114, 129, 33, 115, 98, 34, 97, 17, 97, 50, 82, + 17, 97, 65, 81, 34, 66, 65, 81, 34, 66, 66, 65, + 49, 65, 97, 50, 49, 65, 97, 49, 66, 34, 98, 33, + 81, 33, 114, 18, 81, 33, 129, 17, 97, 18, 129, 17, + 100, 131, 114, 162, 114, 0, 8, 80, 33, 14, 240, 210, + 129, 66, 98, 81, 82, 98, 65, 130, 34, 145, 18, 163, + 194, 180, 146, 33, 130, 50, 113, 82, 82, 97, 66, 114, + 49, 146, 240, 240, 224, 28, 13, 240, 177, 145, 34, 114, + 50, 82, 81, 81, 98, 50, 113, 34, 145, 17, 163, 177, + 193, 193, 193, 193, 193, 193, 0, 5, 96, 21, 12, 240, + 153, 162, 161, 162, 146, 162, 146, 161, 162, 146, 162, 146, + 161, 162, 170, 240, 240, 128, 22, 5, 83, 33, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 67, 32, 51, 19, 0, 7, 34, 82, 81, 81, + 82, 81, 81, 65, 17, 66, 81, 65, 17, 65, 98, 49, + 18, 49, 79, 2, 81, 33, 49, 34, 113, 33, 49, 33, + 129, 33, 49, 33, 130, 17, 50, 17, 147, 67, 146, 82, + 162, 82, 162, 82, 0, 7, 112, 22, 5, 83, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 35, 32, 22, 12, 240, 210, 147, 145, 18, + 114, 33, 113, 50, 82, 65, 81, 82, 50, 97, 49, 114, + 0, 13, 96, 6, 13, 0, 30, 123, 32, 8, 5, 161, + 66, 66, 0, 9, 80, 25, 10, 0, 7, 101, 65, 66, + 145, 145, 70, 50, 65, 33, 97, 33, 97, 33, 82, 34, + 51, 53, 17, 240, 240, 32, 32, 11, 177, 161, 161, 161, + 161, 161, 21, 67, 50, 50, 82, 33, 113, 33, 113, 33, + 113, 33, 113, 33, 113, 34, 81, 51, 50, 49, 21, 240, + 240, 112, 18, 10, 0, 7, 117, 50, 129, 129, 145, 145, + 145, 145, 161, 146, 165, 240, 240, 32, 33, 11, 240, 65, + 161, 161, 161, 161, 69, 17, 50, 51, 34, 82, 33, 113, + 33, 113, 33, 113, 33, 113, 33, 113, 49, 82, 50, 51, + 69, 17, 240, 240, 80, 22, 11, 0, 8, 84, 82, 50, + 65, 81, 49, 113, 33, 113, 41, 33, 161, 177, 162, 181, + 240, 240, 96, 21, 9, 196, 66, 113, 129, 129, 102, 81, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 240, 240, 48, + 30, 11, 0, 8, 69, 17, 50, 51, 34, 82, 33, 113, + 33, 113, 33, 113, 33, 113, 33, 113, 49, 82, 50, 51, + 84, 17, 145, 146, 69, 80, 32, 10, 161, 145, 145, 145, + 145, 145, 20, 66, 65, 49, 97, 33, 97, 33, 97, 33, + 97, 33, 97, 33, 97, 33, 97, 33, 97, 33, 97, 240, + 240, 32, 16, 3, 49, 33, 177, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 176, 20, 6, 130, 66, 240, 113, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 50, 64, 30, 9, 145, 129, 129, 129, 129, 129, 66, 33, + 65, 49, 49, 65, 33, 81, 18, 84, 82, 17, 81, 49, + 65, 50, 49, 66, 33, 81, 240, 224, 19, 3, 49, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 176, 41, 17, 0, 12, 97, 20, 52, 66, 65, + 18, 49, 49, 98, 81, 33, 97, 97, 33, 97, 97, 33, + 97, 97, 33, 97, 97, 33, 97, 97, 33, 97, 97, 33, + 97, 97, 33, 97, 97, 0, 6, 80, 29, 10, 0, 7, + 65, 20, 66, 65, 49, 97, 33, 97, 33, 97, 33, 97, + 33, 97, 33, 97, 33, 97, 33, 97, 33, 97, 240, 240, + 32, 27, 12, 0, 9, 52, 98, 66, 65, 97, 49, 129, + 33, 129, 33, 129, 33, 129, 33, 129, 49, 97, 66, 66, + 100, 240, 240, 176, 30, 11, 0, 8, 33, 21, 67, 50, + 50, 81, 49, 113, 33, 113, 33, 113, 33, 113, 33, 113, + 34, 81, 51, 50, 49, 21, 65, 161, 161, 160, 30, 11, + 0, 8, 69, 17, 50, 51, 34, 82, 33, 113, 33, 113, + 33, 113, 33, 113, 33, 113, 49, 82, 50, 51, 69, 17, + 161, 161, 161, 32, 18, 7, 240, 240, 193, 19, 34, 82, + 81, 97, 97, 97, 97, 97, 97, 97, 240, 192, 18, 9, + 0, 7, 5, 50, 113, 129, 146, 131, 130, 129, 129, 33, + 66, 53, 240, 240, 19, 9, 240, 225, 129, 129, 102, 81, + 129, 129, 129, 129, 129, 129, 129, 129, 148, 240, 224, 29, + 10, 0, 7, 65, 97, 33, 97, 33, 97, 33, 97, 33, + 97, 33, 97, 33, 97, 33, 97, 33, 82, 49, 51, 68, + 17, 240, 240, 32, 26, 10, 0, 7, 65, 97, 33, 97, + 34, 66, 49, 65, 65, 65, 66, 34, 81, 33, 97, 33, + 100, 114, 130, 240, 240, 80, 45, 19, 0, 14, 34, 98, + 82, 49, 83, 81, 66, 65, 17, 66, 66, 65, 17, 66, + 81, 50, 18, 49, 97, 49, 49, 49, 98, 33, 49, 34, + 113, 18, 50, 17, 129, 17, 81, 17, 131, 83, 146, 82, + 0, 7, 112, 26, 10, 0, 7, 66, 66, 49, 65, 81, + 34, 82, 17, 114, 130, 116, 97, 33, 82, 49, 50, 66, + 33, 97, 240, 240, 32, 27, 10, 0, 7, 65, 82, 33, + 82, 34, 65, 65, 50, 65, 49, 82, 33, 97, 18, 97, + 17, 115, 130, 129, 145, 129, 115, 112, 18, 10, 0, 7, + 72, 130, 114, 129, 130, 114, 114, 129, 129, 130, 136, 240, + 240, 32, 22, 7, 162, 65, 97, 97, 97, 97, 97, 97, + 82, 66, 98, 97, 97, 97, 97, 97, 97, 97, 114, 32, + 20, 3, 49, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 128, 22, 7, 114, 113, + 97, 97, 97, 97, 97, 97, 98, 98, 66, 81, 97, 97, + 97, 97, 97, 97, 66, 80, 13, 12, 0, 12, 19, 129, + 35, 34, 33, 68, 0, 13, 112, + 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3041 - 0x30ff + // + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x1f, 0x03, 0x00, 0x00, // Offset 799 (0x31f) + 0x46, 0x03, 0x00, 0x00, // Offset 838 (0x346) + 0x5c, 0x03, 0x00, 0x00, // Offset 860 (0x35c) + 0x76, 0x03, 0x00, 0x00, // Offset 886 (0x376) + 0x8a, 0x03, 0x00, 0x00, // Offset 906 (0x38a) + 0xa1, 0x03, 0x00, 0x00, // Offset 929 (0x3a1) + 0xba, 0x03, 0x00, 0x00, // Offset 954 (0x3ba) + 0xd6, 0x03, 0x00, 0x00, // Offset 982 (0x3d6) + 0xf6, 0x03, 0x00, 0x00, // Offset 1014 (0x3f6) + 0x1b, 0x04, 0x00, 0x00, // Offset 1051 (0x41b) + 0x41, 0x04, 0x00, 0x00, // Offset 1089 (0x441) + 0x69, 0x04, 0x00, 0x00, // Offset 1129 (0x469) + 0x83, 0x04, 0x00, 0x00, // Offset 1155 (0x483) + 0xa3, 0x04, 0x00, 0x00, // Offset 1187 (0x4a3) + 0xb8, 0x04, 0x00, 0x00, // Offset 1208 (0x4b8) + 0xd4, 0x04, 0x00, 0x00, // Offset 1236 (0x4d4) + 0xf8, 0x04, 0x00, 0x00, // Offset 1272 (0x4f8) + 0x21, 0x05, 0x00, 0x00, // Offset 1313 (0x521) + 0x31, 0x05, 0x00, 0x00, // Offset 1329 (0x531) + 0x46, 0x05, 0x00, 0x00, // Offset 1350 (0x546) + 0x60, 0x05, 0x00, 0x00, // Offset 1376 (0x560) + 0x7e, 0x05, 0x00, 0x00, // Offset 1406 (0x57e) + 0x97, 0x05, 0x00, 0x00, // Offset 1431 (0x597) + 0xb4, 0x05, 0x00, 0x00, // Offset 1460 (0x5b4) + 0xd0, 0x05, 0x00, 0x00, // Offset 1488 (0x5d0) + 0xf1, 0x05, 0x00, 0x00, // Offset 1521 (0x5f1) + 0x0f, 0x06, 0x00, 0x00, // Offset 1551 (0x60f) + 0x33, 0x06, 0x00, 0x00, // Offset 1587 (0x633) + 0x4b, 0x06, 0x00, 0x00, // Offset 1611 (0x64b) + 0x6b, 0x06, 0x00, 0x00, // Offset 1643 (0x66b) + 0x85, 0x06, 0x00, 0x00, // Offset 1669 (0x685) + 0xa6, 0x06, 0x00, 0x00, // Offset 1702 (0x6a6) + 0xbf, 0x06, 0x00, 0x00, // Offset 1727 (0x6bf) + 0xdc, 0x06, 0x00, 0x00, // Offset 1756 (0x6dc) + 0xed, 0x06, 0x00, 0x00, // Offset 1773 (0x6ed) + 0x00, 0x07, 0x00, 0x00, // Offset 1792 (0x700) + 0x1e, 0x07, 0x00, 0x00, // Offset 1822 (0x71e) + 0x33, 0x07, 0x00, 0x00, // Offset 1843 (0x733) + 0x54, 0x07, 0x00, 0x00, // Offset 1876 (0x754) + 0x6c, 0x07, 0x00, 0x00, // Offset 1900 (0x76c) + 0x89, 0x07, 0x00, 0x00, // Offset 1929 (0x789) + 0xab, 0x07, 0x00, 0x00, // Offset 1963 (0x7ab) + 0xc5, 0x07, 0x00, 0x00, // Offset 1989 (0x7c5) + 0xef, 0x07, 0x00, 0x00, // Offset 2031 (0x7ef) + 0x18, 0x08, 0x00, 0x00, // Offset 2072 (0x818) + 0x3e, 0x08, 0x00, 0x00, // Offset 2110 (0x83e) + 0x69, 0x08, 0x00, 0x00, // Offset 2153 (0x869) + 0x94, 0x08, 0x00, 0x00, // Offset 2196 (0x894) + 0xc4, 0x08, 0x00, 0x00, // Offset 2244 (0x8c4) + 0xe6, 0x08, 0x00, 0x00, // Offset 2278 (0x8e6) + 0x0e, 0x09, 0x00, 0x00, // Offset 2318 (0x90e) + 0x38, 0x09, 0x00, 0x00, // Offset 2360 (0x938) + 0x59, 0x09, 0x00, 0x00, // Offset 2393 (0x959) + 0x7f, 0x09, 0x00, 0x00, // Offset 2431 (0x97f) + 0xa8, 0x09, 0x00, 0x00, // Offset 2472 (0x9a8) + 0xb9, 0x09, 0x00, 0x00, // Offset 2489 (0x9b9) + 0xce, 0x09, 0x00, 0x00, // Offset 2510 (0x9ce) + 0xe8, 0x09, 0x00, 0x00, // Offset 2536 (0x9e8) + 0x14, 0x0a, 0x00, 0x00, // Offset 2580 (0xa14) + 0x43, 0x0a, 0x00, 0x00, // Offset 2627 (0xa43) + 0x75, 0x0a, 0x00, 0x00, // Offset 2677 (0xa75) + 0x94, 0x0a, 0x00, 0x00, // Offset 2708 (0xa94) + 0xb7, 0x0a, 0x00, 0x00, // Offset 2743 (0xab7) + 0xd9, 0x0a, 0x00, 0x00, // Offset 2777 (0xad9) + 0x02, 0x0b, 0x00, 0x00, // Offset 2818 (0xb02) + 0x20, 0x0b, 0x00, 0x00, // Offset 2848 (0xb20) + 0x3d, 0x0b, 0x00, 0x00, // Offset 2877 (0xb3d) + 0x62, 0x0b, 0x00, 0x00, // Offset 2914 (0xb62) + 0x89, 0x0b, 0x00, 0x00, // Offset 2953 (0xb89) + 0xb7, 0x0b, 0x00, 0x00, // Offset 2999 (0xbb7) + 0xce, 0x0b, 0x00, 0x00, // Offset 3022 (0xbce) + 0xeb, 0x0b, 0x00, 0x00, // Offset 3051 (0xbeb) + 0x03, 0x0c, 0x00, 0x00, // Offset 3075 (0xc03) + 0x23, 0x0c, 0x00, 0x00, // Offset 3107 (0xc23) + 0x43, 0x0c, 0x00, 0x00, // Offset 3139 (0xc43) + 0x6b, 0x0c, 0x00, 0x00, // Offset 3179 (0xc6b) + 0x86, 0x0c, 0x00, 0x00, // Offset 3206 (0xc86) + 0xa4, 0x0c, 0x00, 0x00, // Offset 3236 (0xca4) + 0xc8, 0x0c, 0x00, 0x00, // Offset 3272 (0xcc8) + 0xee, 0x0c, 0x00, 0x00, // Offset 3310 (0xcee) + 0x11, 0x0d, 0x00, 0x00, // Offset 3345 (0xd11) + 0x2f, 0x0d, 0x00, 0x00, // Offset 3375 (0xd2f) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x4d, 0x0d, 0x00, 0x00, // Offset 3405 (0xd4d) + 0x60, 0x0d, 0x00, 0x00, // Offset 3424 (0xd60) + 0x77, 0x0d, 0x00, 0x00, // Offset 3447 (0xd77) + 0x8c, 0x0d, 0x00, 0x00, // Offset 3468 (0xd8c) + 0xa5, 0x0d, 0x00, 0x00, // Offset 3493 (0xda5) + 0xbb, 0x0d, 0x00, 0x00, // Offset 3515 (0xdbb) + 0xd5, 0x0d, 0x00, 0x00, // Offset 3541 (0xdd5) + 0xe4, 0x0d, 0x00, 0x00, // Offset 3556 (0xde4) + 0xf5, 0x0d, 0x00, 0x00, // Offset 3573 (0xdf5) + 0x0c, 0x0e, 0x00, 0x00, // Offset 3596 (0xe0c) + 0x27, 0x0e, 0x00, 0x00, // Offset 3623 (0xe27) + 0x46, 0x0e, 0x00, 0x00, // Offset 3654 (0xe46) + 0x68, 0x0e, 0x00, 0x00, // Offset 3688 (0xe68) + 0x82, 0x0e, 0x00, 0x00, // Offset 3714 (0xe82) + 0x9f, 0x0e, 0x00, 0x00, // Offset 3743 (0xe9f) + 0xb8, 0x0e, 0x00, 0x00, // Offset 3768 (0xeb8) + 0xd4, 0x0e, 0x00, 0x00, // Offset 3796 (0xed4) + 0xed, 0x0e, 0x00, 0x00, // Offset 3821 (0xeed) + 0x0d, 0x0f, 0x00, 0x00, // Offset 3853 (0xf0d) + 0x1f, 0x0f, 0x00, 0x00, // Offset 3871 (0xf1f) + 0x35, 0x0f, 0x00, 0x00, // Offset 3893 (0xf35) + 0x51, 0x0f, 0x00, 0x00, // Offset 3921 (0xf51) + 0x73, 0x0f, 0x00, 0x00, // Offset 3955 (0xf73) + 0x8a, 0x0f, 0x00, 0x00, // Offset 3978 (0xf8a) + 0xa5, 0x0f, 0x00, 0x00, // Offset 4005 (0xfa5) + 0xbc, 0x0f, 0x00, 0x00, // Offset 4028 (0xfbc) + 0xd6, 0x0f, 0x00, 0x00, // Offset 4054 (0xfd6) + 0xf1, 0x0f, 0x00, 0x00, // Offset 4081 (0xff1) + 0x14, 0x10, 0x00, 0x00, // Offset 4116 (0x1014) + 0x2d, 0x10, 0x00, 0x00, // Offset 4141 (0x102d) + 0x4e, 0x10, 0x00, 0x00, // Offset 4174 (0x104e) + 0x6a, 0x10, 0x00, 0x00, // Offset 4202 (0x106a) + 0x8a, 0x10, 0x00, 0x00, // Offset 4234 (0x108a) + 0x9f, 0x10, 0x00, 0x00, // Offset 4255 (0x109f) + 0xbf, 0x10, 0x00, 0x00, // Offset 4287 (0x10bf) + 0xd6, 0x10, 0x00, 0x00, // Offset 4310 (0x10d6) + 0xf3, 0x10, 0x00, 0x00, // Offset 4339 (0x10f3) + 0x12, 0x11, 0x00, 0x00, // Offset 4370 (0x1112) + 0x25, 0x11, 0x00, 0x00, // Offset 4389 (0x1125) + 0x41, 0x11, 0x00, 0x00, // Offset 4417 (0x1141) + 0x57, 0x11, 0x00, 0x00, // Offset 4439 (0x1157) + 0x71, 0x11, 0x00, 0x00, // Offset 4465 (0x1171) + 0x87, 0x11, 0x00, 0x00, // Offset 4487 (0x1187) + 0x92, 0x11, 0x00, 0x00, // Offset 4498 (0x1192) + 0xab, 0x11, 0x00, 0x00, // Offset 4523 (0x11ab) + 0xc7, 0x11, 0x00, 0x00, // Offset 4551 (0x11c7) + 0xdc, 0x11, 0x00, 0x00, // Offset 4572 (0x11dc) + 0xf5, 0x11, 0x00, 0x00, // Offset 4597 (0x11f5) + 0x12, 0x12, 0x00, 0x00, // Offset 4626 (0x1212) + 0x31, 0x12, 0x00, 0x00, // Offset 4657 (0x1231) + 0x48, 0x12, 0x00, 0x00, // Offset 4680 (0x1248) + 0x63, 0x12, 0x00, 0x00, // Offset 4707 (0x1263) + 0x80, 0x12, 0x00, 0x00, // Offset 4736 (0x1280) + 0x93, 0x12, 0x00, 0x00, // Offset 4755 (0x1293) + 0xa9, 0x12, 0x00, 0x00, // Offset 4777 (0x12a9) + 0xc5, 0x12, 0x00, 0x00, // Offset 4805 (0x12c5) + 0xd8, 0x12, 0x00, 0x00, // Offset 4824 (0x12d8) + 0xef, 0x12, 0x00, 0x00, // Offset 4847 (0x12ef) + 0x09, 0x13, 0x00, 0x00, // Offset 4873 (0x1309) + 0x29, 0x13, 0x00, 0x00, // Offset 4905 (0x1329) + 0x4d, 0x13, 0x00, 0x00, // Offset 4941 (0x134d) + 0x74, 0x13, 0x00, 0x00, // Offset 4980 (0x1374) + 0x87, 0x13, 0x00, 0x00, // Offset 4999 (0x1387) + 0x9c, 0x13, 0x00, 0x00, // Offset 5020 (0x139c) + 0xb4, 0x13, 0x00, 0x00, // Offset 5044 (0x13b4) + 0xcb, 0x13, 0x00, 0x00, // Offset 5067 (0x13cb) + 0xde, 0x13, 0x00, 0x00, // Offset 5086 (0x13de) + 0xf7, 0x13, 0x00, 0x00, // Offset 5111 (0x13f7) + 0x12, 0x14, 0x00, 0x00, // Offset 5138 (0x1412) + 0x21, 0x14, 0x00, 0x00, // Offset 5153 (0x1421) + 0x32, 0x14, 0x00, 0x00, // Offset 5170 (0x1432) + 0x43, 0x14, 0x00, 0x00, // Offset 5187 (0x1443) + 0x56, 0x14, 0x00, 0x00, // Offset 5206 (0x1456) + 0x6a, 0x14, 0x00, 0x00, // Offset 5226 (0x146a) + 0x87, 0x14, 0x00, 0x00, // Offset 5255 (0x1487) + 0xae, 0x14, 0x00, 0x00, // Offset 5294 (0x14ae) + 0xc9, 0x14, 0x00, 0x00, // Offset 5321 (0x14c9) + 0xe4, 0x14, 0x00, 0x00, // Offset 5348 (0x14e4) + 0xfa, 0x14, 0x00, 0x00, // Offset 5370 (0x14fa) + 0x13, 0x15, 0x00, 0x00, // Offset 5395 (0x1513) + 0x2e, 0x15, 0x00, 0x00, // Offset 5422 (0x152e) + 0x42, 0x15, 0x00, 0x00, // Offset 5442 (0x1542) + 0x55, 0x15, 0x00, 0x00, // Offset 5461 (0x1555) + 0x68, 0x15, 0x00, 0x00, // Offset 5480 (0x1568) + 0x85, 0x15, 0x00, 0x00, // Offset 5509 (0x1585) + 0xa0, 0x15, 0x00, 0x00, // Offset 5536 (0x15a0) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xb6, 0x15, 0x00, 0x00, // Offset 5558 (0x15b6) + 0xbf, 0x15, 0x00, 0x00, // Offset 5567 (0x15bf) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3041 - 0x30ff + // + 35, 13, 0, 8, 66, 177, 49, 102, 145, 193, 49, 134, + 98, 33, 33, 65, 17, 18, 49, 33, 33, 17, 65, 33, + 34, 81, 33, 34, 66, 35, 17, 50, 162, 240, 240, 39, + 16, 240, 240, 113, 226, 226, 18, 135, 193, 241, 49, 183, + 131, 18, 19, 83, 33, 51, 49, 33, 18, 66, 34, 35, + 82, 33, 50, 98, 33, 50, 82, 67, 17, 66, 195, 0, + 6, 80, 22, 13, 0, 11, 49, 193, 113, 65, 113, 65, + 129, 49, 129, 49, 130, 34, 193, 33, 162, 0, 7, 80, + 26, 17, 0, 8, 66, 242, 242, 130, 82, 146, 66, 161, + 66, 162, 50, 162, 66, 162, 50, 49, 178, 34, 196, 226, + 0, 10, 20, 9, 0, 6, 2, 129, 244, 51, 49, 33, + 81, 129, 129, 114, 113, 114, 98, 240, 240, 16, 23, 10, + 240, 115, 147, 129, 240, 21, 51, 49, 49, 97, 145, 145, + 145, 130, 129, 130, 114, 115, 240, 240, 64, 25, 12, 0, + 6, 49, 178, 193, 240, 99, 99, 18, 161, 161, 164, 129, + 33, 113, 49, 97, 66, 81, 84, 240, 240, 128, 28, 15, + 240, 240, 81, 227, 210, 240, 240, 135, 131, 34, 209, 210, + 194, 197, 162, 33, 146, 49, 130, 65, 114, 86, 180, 240, + 240, 32, 32, 13, 0, 8, 65, 193, 193, 17, 49, 68, + 81, 81, 198, 98, 66, 65, 17, 81, 49, 33, 81, 49, + 33, 81, 49, 33, 65, 83, 49, 240, 240, 224, 37, 16, + 240, 240, 97, 241, 241, 81, 148, 50, 70, 82, 97, 129, + 97, 247, 131, 66, 84, 98, 65, 33, 98, 49, 49, 98, + 49, 49, 82, 81, 33, 82, 99, 50, 0, 6, 96, 38, + 17, 0, 7, 2, 241, 240, 17, 81, 149, 49, 85, 49, + 34, 65, 33, 65, 50, 82, 65, 50, 82, 65, 161, 81, + 146, 81, 145, 97, 130, 81, 145, 97, 130, 66, 0, 7, + 64, 40, 18, 0, 6, 33, 130, 82, 17, 114, 98, 129, + 81, 150, 34, 101, 49, 34, 81, 33, 65, 49, 129, 65, + 50, 98, 65, 177, 81, 162, 81, 162, 81, 161, 81, 162, + 81, 146, 66, 0, 8, 26, 12, 242, 162, 180, 86, 97, + 49, 178, 18, 101, 71, 177, 178, 70, 18, 35, 67, 34, + 97, 50, 162, 179, 181, 240, 208, 32, 16, 240, 66, 113, + 98, 81, 18, 100, 49, 86, 161, 49, 242, 18, 165, 135, + 241, 242, 134, 18, 99, 67, 98, 97, 114, 226, 243, 245, + 240, 240, 160, 21, 9, 240, 129, 114, 114, 98, 98, 98, + 98, 114, 130, 115, 114, 130, 130, 114, 130, 129, 240, 80, + 28, 13, 240, 240, 17, 178, 178, 49, 98, 33, 33, 66, + 65, 17, 50, 162, 178, 179, 179, 178, 194, 194, 178, 194, + 193, 240, 240, 32, 36, 16, 240, 240, 178, 97, 114, 97, + 114, 82, 117, 33, 72, 49, 130, 81, 130, 81, 130, 81, + 130, 81, 17, 98, 81, 17, 83, 82, 98, 113, 98, 113, + 82, 210, 0, 7, 41, 18, 0, 6, 33, 65, 98, 33, + 33, 49, 98, 49, 66, 98, 129, 116, 97, 56, 97, 114, + 129, 114, 129, 114, 129, 17, 82, 130, 98, 130, 82, 146, + 82, 161, 67, 227, 240, 17, 0, 5, 112, 16, 13, 0, + 6, 88, 193, 0, 10, 33, 193, 209, 114, 73, 0, 6, + 96, 21, 16, 240, 240, 225, 225, 17, 56, 33, 193, 0, + 12, 113, 241, 240, 17, 114, 121, 0, 8, 80, 26, 12, + 240, 194, 177, 178, 49, 117, 40, 82, 49, 178, 177, 178, + 70, 17, 51, 67, 34, 97, 50, 162, 179, 180, 240, 224, + 30, 15, 240, 240, 50, 81, 17, 97, 97, 114, 229, 88, + 130, 34, 226, 225, 226, 118, 17, 99, 67, 82, 97, 98, + 210, 227, 228, 240, 240, 128, 25, 12, 240, 240, 97, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 177, 113, 49, 99, + 33, 98, 65, 51, 100, 240, 240, 29, 12, 240, 145, 178, + 97, 50, 66, 17, 34, 81, 66, 162, 162, 162, 162, 162, + 162, 162, 113, 34, 98, 34, 82, 66, 51, 85, 240, 224, + 28, 15, 240, 240, 113, 225, 225, 125, 49, 81, 225, 180, + 162, 33, 161, 49, 161, 49, 161, 34, 180, 210, 209, 210, + 194, 240, 240, 144, 33, 18, 240, 241, 17, 162, 50, 17, + 146, 65, 178, 158, 81, 82, 240, 18, 213, 194, 34, 193, + 50, 193, 50, 193, 50, 213, 242, 240, 18, 227, 242, 0, + 6, 30, 18, 0, 10, 49, 162, 81, 162, 81, 162, 81, + 172, 38, 81, 162, 81, 162, 81, 162, 50, 178, 240, 18, + 240, 34, 81, 183, 0, 7, 48, 36, 18, 0, 10, 17, + 33, 17, 98, 65, 49, 17, 82, 65, 49, 114, 65, 172, + 66, 18, 65, 178, 65, 178, 65, 178, 50, 178, 240, 18, + 240, 34, 65, 198, 0, 7, 80, 24, 13, 240, 184, 103, + 177, 162, 162, 162, 162, 23, 36, 35, 65, 66, 162, 162, + 178, 178, 178, 194, 211, 240, 240, 32, 16, 240, 240, 40, + 151, 65, 145, 50, 17, 98, 81, 17, 82, 210, 210, 23, + 84, 35, 113, 66, 210, 210, 226, 226, 226, 242, 240, 19, + 240, 240, 144, 26, 15, 240, 240, 50, 210, 210, 212, 134, + 193, 225, 210, 53, 82, 209, 210, 210, 209, 210, 49, 97, + 34, 71, 0, 5, 112, 33, 17, 240, 240, 129, 240, 17, + 129, 113, 98, 17, 99, 81, 70, 226, 241, 240, 17, 54, + 98, 242, 241, 240, 17, 242, 242, 34, 97, 50, 72, 0, + 6, 96, 25, 14, 240, 240, 242, 194, 198, 88, 145, 209, + 194, 194, 36, 100, 50, 82, 98, 194, 194, 179, 163, 147, + 240, 240, 48, 29, 16, 240, 240, 225, 98, 81, 33, 82, + 97, 118, 120, 177, 241, 241, 226, 226, 36, 132, 51, 113, + 98, 226, 226, 195, 179, 240, 240, 144, 17, 13, 0, 13, + 69, 68, 81, 50, 129, 193, 193, 177, 178, 131, 0, 7, + 16, 19, 17, 0, 13, 70, 87, 82, 66, 162, 242, 242, + 242, 226, 227, 196, 180, 0, 9, 32, 30, 19, 0, 9, + 1, 240, 18, 17, 240, 18, 150, 119, 82, 98, 162, 240, + 34, 240, 34, 240, 34, 240, 18, 240, 19, 213, 212, 0, + 10, 64, 21, 15, 0, 8, 24, 40, 18, 66, 82, 209, + 210, 194, 210, 210, 210, 226, 212, 212, 195, 0, 6, 33, + 18, 0, 9, 88, 88, 18, 114, 82, 240, 17, 65, 17, + 146, 81, 17, 114, 97, 146, 240, 18, 240, 18, 240, 34, + 240, 20, 240, 20, 243, 0, 7, 64, 24, 12, 240, 240, + 114, 162, 177, 177, 81, 81, 36, 85, 115, 130, 146, 161, + 177, 177, 193, 113, 72, 240, 240, 128, 29, 15, 0, 5, + 98, 97, 17, 66, 113, 17, 65, 113, 97, 81, 129, 36, + 133, 163, 178, 194, 209, 225, 225, 241, 113, 120, 0, 6, + 32, 34, 15, 240, 240, 65, 225, 225, 213, 118, 66, 97, + 114, 66, 65, 129, 81, 114, 81, 114, 81, 98, 97, 196, + 146, 36, 113, 49, 33, 113, 49, 179, 240, 240, 112, 26, + 15, 0, 7, 81, 225, 55, 50, 209, 225, 225, 225, 225, + 225, 17, 193, 17, 194, 49, 97, 34, 71, 49, 0, 7, + 32, 42, 17, 0, 7, 18, 242, 242, 161, 67, 145, 25, + 114, 34, 50, 82, 34, 82, 67, 18, 82, 49, 33, 17, + 113, 49, 35, 113, 49, 50, 53, 49, 36, 17, 51, 51, + 17, 33, 34, 17, 179, 0, 7, 41, 18, 0, 7, 18, + 240, 18, 240, 19, 228, 52, 85, 34, 50, 116, 98, 84, + 114, 83, 130, 68, 130, 65, 18, 55, 50, 18, 33, 67, + 98, 33, 68, 82, 33, 50, 18, 82, 52, 49, 0, 7, + 38, 17, 0, 9, 22, 146, 34, 19, 97, 65, 66, 65, + 81, 67, 34, 66, 82, 33, 81, 98, 33, 66, 98, 33, + 65, 114, 33, 50, 98, 65, 33, 99, 82, 84, 225, 0, + 9, 32, 43, 15, 240, 240, 145, 98, 97, 97, 113, 82, + 113, 18, 34, 55, 49, 129, 81, 129, 81, 129, 81, 129, + 81, 129, 81, 17, 97, 81, 17, 53, 67, 33, 49, 18, + 50, 33, 49, 33, 49, 67, 0, 6, 48, 43, 17, 0, + 6, 1, 177, 33, 17, 50, 97, 129, 113, 129, 113, 18, + 66, 55, 81, 129, 113, 129, 113, 129, 113, 129, 113, 33, + 81, 113, 17, 53, 99, 33, 49, 18, 81, 49, 49, 129, + 67, 0, 7, 48, 48, 18, 240, 240, 18, 241, 33, 49, + 113, 33, 33, 49, 113, 50, 65, 113, 145, 113, 18, 82, + 56, 81, 129, 129, 129, 129, 129, 129, 129, 129, 33, 81, + 129, 17, 54, 99, 33, 49, 19, 82, 33, 49, 49, 81, + 67, 0, 7, 112, 34, 16, 0, 7, 33, 130, 66, 85, + 82, 98, 98, 97, 116, 65, 113, 18, 49, 129, 97, 129, + 97, 129, 97, 113, 113, 113, 114, 81, 146, 50, 164, 0, + 7, 16, 40, 18, 0, 6, 33, 209, 33, 17, 82, 66, + 33, 69, 82, 130, 98, 129, 115, 113, 113, 18, 82, 113, + 129, 129, 129, 129, 129, 113, 145, 113, 145, 113, 161, 81, + 178, 50, 196, 0, 5, 112, 42, 18, 240, 240, 18, 241, + 33, 178, 17, 33, 82, 66, 34, 53, 82, 130, 98, 129, + 115, 113, 113, 18, 82, 113, 129, 129, 129, 129, 129, 113, + 145, 113, 145, 113, 161, 81, 178, 50, 196, 0, 5, 112, + 33, 17, 240, 240, 161, 240, 19, 240, 18, 225, 0, 6, + 17, 240, 19, 243, 242, 34, 50, 33, 66, 34, 52, 66, + 49, 50, 98, 177, 50, 181, 0, 7, 32, 38, 18, 240, + 240, 193, 113, 147, 49, 18, 147, 49, 177, 0, 6, 65, + 240, 35, 240, 19, 240, 18, 34, 66, 33, 66, 34, 68, + 66, 49, 66, 98, 145, 33, 50, 197, 0, 7, 96, 41, + 18, 240, 240, 18, 241, 33, 131, 49, 33, 147, 50, 162, + 240, 17, 240, 240, 65, 240, 34, 240, 35, 240, 18, 49, + 66, 114, 34, 68, 66, 50, 51, 82, 49, 81, 33, 50, + 197, 0, 7, 96, 17, 17, 0, 15, 50, 210, 34, 162, + 66, 130, 99, 97, 147, 244, 242, 0, 13, 21, 17, 0, + 12, 17, 241, 17, 114, 97, 98, 34, 162, 66, 130, 99, + 97, 147, 244, 242, 0, 13, 26, 18, 0, 10, 66, 241, + 33, 225, 33, 115, 82, 113, 34, 178, 81, 146, 114, 114, + 131, 240, 36, 240, 18, 0, 13, 96, 44, 16, 240, 240, + 209, 82, 54, 81, 113, 98, 113, 98, 113, 97, 129, 18, + 49, 72, 49, 129, 97, 129, 97, 33, 81, 97, 17, 53, + 83, 34, 33, 18, 51, 33, 49, 34, 50, 33, 49, 113, + 67, 0, 6, 112, 47, 18, 0, 6, 113, 69, 129, 69, + 49, 50, 113, 49, 17, 34, 113, 50, 49, 129, 18, 81, + 72, 81, 129, 129, 129, 129, 33, 81, 129, 17, 53, 115, + 34, 33, 18, 83, 33, 49, 34, 82, 33, 49, 145, 67, + 0, 7, 112, 50, 19, 0, 7, 33, 99, 50, 66, 53, + 33, 33, 34, 113, 49, 33, 34, 113, 66, 50, 113, 33, + 97, 72, 97, 129, 145, 129, 145, 33, 81, 145, 17, 53, + 131, 34, 33, 18, 99, 33, 49, 35, 82, 33, 49, 49, + 97, 67, 0, 8, 48, 31, 13, 240, 240, 17, 193, 193, + 19, 57, 145, 193, 193, 33, 88, 145, 193, 178, 135, 82, + 49, 19, 49, 65, 35, 33, 65, 49, 68, 240, 240, 64, + 35, 17, 0, 8, 102, 182, 242, 241, 66, 146, 65, 161, + 81, 120, 17, 98, 17, 67, 81, 49, 84, 49, 34, 66, + 19, 33, 33, 82, 33, 66, 82, 241, 0, 7, 48, 34, + 17, 240, 240, 129, 240, 18, 242, 200, 49, 130, 114, 98, + 129, 98, 197, 178, 34, 177, 50, 177, 50, 177, 35, 196, + 114, 113, 113, 130, 82, 151, 240, 240, 144, 41, 17, 0, + 7, 34, 242, 242, 161, 38, 132, 17, 20, 98, 34, 51, + 67, 33, 83, 49, 17, 18, 98, 33, 35, 114, 33, 50, + 114, 33, 50, 99, 33, 36, 82, 67, 33, 51, 225, 0, + 7, 16, 30, 13, 240, 240, 194, 178, 129, 34, 135, 145, + 178, 145, 18, 150, 133, 34, 81, 98, 65, 98, 65, 98, + 66, 82, 66, 66, 116, 240, 240, 16, 29, 14, 0, 9, + 50, 129, 65, 130, 53, 81, 35, 49, 67, 34, 33, 51, + 113, 34, 18, 82, 97, 51, 113, 210, 209, 210, 0, 6, + 16, 37, 17, 240, 240, 161, 240, 18, 162, 66, 146, 70, + 97, 37, 34, 85, 18, 50, 67, 49, 66, 37, 130, 34, + 33, 114, 114, 52, 130, 240, 18, 242, 240, 18, 242, 0, + 7, 64, 39, 13, 0, 8, 113, 97, 81, 97, 67, 81, + 49, 17, 18, 49, 18, 33, 49, 33, 17, 49, 49, 34, + 65, 49, 34, 65, 49, 33, 49, 17, 33, 49, 68, 145, + 178, 177, 240, 240, 64, 46, 15, 240, 240, 114, 97, 98, + 98, 82, 98, 54, 65, 50, 18, 18, 49, 33, 50, 34, + 33, 17, 66, 34, 35, 66, 34, 34, 82, 34, 34, 82, + 34, 34, 34, 18, 18, 50, 54, 66, 66, 195, 194, 209, + 240, 240, 144, 23, 11, 0, 7, 49, 161, 161, 164, 113, + 161, 161, 161, 117, 81, 49, 18, 49, 49, 34, 51, 240, + 240, 160, 29, 13, 240, 240, 17, 193, 193, 193, 49, 133, + 129, 193, 193, 193, 193, 149, 98, 49, 18, 65, 65, 35, + 33, 65, 49, 68, 0, 5, 112, 24, 12, 240, 178, 178, + 177, 240, 66, 162, 162, 162, 161, 37, 67, 66, 50, 98, + 162, 162, 131, 101, 240, 240, 160, 32, 11, 240, 240, 50, + 97, 34, 97, 33, 113, 33, 113, 33, 113, 33, 18, 65, + 35, 81, 34, 97, 34, 82, 34, 81, 161, 146, 145, 146, + 145, 240, 192, 32, 14, 240, 240, 230, 130, 33, 194, 178, + 193, 199, 99, 66, 67, 98, 34, 130, 34, 130, 99, 50, + 81, 34, 19, 81, 52, 98, 35, 133, 240, 240, 48, 40, + 18, 0, 7, 18, 240, 18, 240, 20, 212, 36, 102, 17, + 49, 97, 36, 65, 147, 81, 131, 97, 131, 97, 116, 97, + 98, 18, 97, 97, 34, 97, 34, 82, 97, 33, 98, 114, + 0, 7, 32, 27, 14, 240, 240, 81, 134, 130, 33, 194, + 178, 193, 199, 99, 66, 66, 114, 34, 130, 33, 146, 194, + 178, 164, 132, 0, 5, 112, 30, 13, 0, 8, 49, 193, + 194, 148, 35, 97, 18, 49, 82, 97, 50, 113, 50, 113, + 33, 17, 113, 33, 17, 97, 81, 67, 81, 0, 6, 16, + 36, 17, 0, 6, 98, 242, 242, 244, 166, 37, 65, 34, + 18, 66, 99, 99, 67, 130, 67, 130, 52, 130, 34, 18, + 130, 33, 34, 114, 98, 84, 98, 83, 114, 0, 5, 96, + 38, 16, 0, 6, 113, 166, 241, 226, 225, 230, 131, 67, + 81, 33, 83, 49, 34, 98, 34, 33, 114, 33, 34, 35, + 34, 33, 33, 33, 36, 49, 18, 33, 50, 82, 68, 0, + 6, 80, 35, 16, 240, 240, 162, 151, 225, 210, 214, 147, + 50, 99, 97, 98, 35, 33, 145, 33, 33, 145, 33, 17, + 180, 162, 194, 68, 82, 20, 50, 50, 66, 66, 0, 6, + 32, 30, 14, 240, 240, 33, 209, 194, 18, 119, 145, 194, + 193, 19, 131, 34, 34, 50, 69, 34, 67, 164, 146, 18, + 130, 193, 210, 229, 240, 240, 32, 30, 15, 0, 6, 50, + 194, 209, 210, 209, 225, 209, 228, 162, 33, 161, 65, 130, + 65, 65, 49, 81, 50, 34, 97, 18, 49, 115, 0, 6, + 16, 19, 12, 0, 9, 10, 162, 161, 113, 34, 115, 146, + 161, 177, 162, 161, 161, 240, 240, 240, 23, 15, 240, 240, + 253, 210, 195, 114, 50, 130, 19, 148, 179, 194, 209, 210, + 210, 194, 194, 209, 0, 7, 16, 21, 10, 0, 7, 17, + 130, 114, 114, 114, 100, 82, 33, 81, 49, 145, 145, 145, + 145, 240, 240, 80, 25, 13, 0, 6, 2, 163, 147, 146, + 162, 148, 130, 18, 99, 34, 97, 66, 178, 178, 178, 178, + 178, 178, 240, 240, 32, 22, 12, 0, 8, 1, 177, 122, + 33, 114, 33, 114, 33, 114, 146, 162, 146, 147, 130, 161, + 240, 240, 208, 26, 14, 240, 240, 50, 194, 194, 124, 34, + 130, 34, 130, 34, 130, 34, 130, 178, 194, 178, 179, 163, + 163, 162, 0, 6, 32, 15, 13, 0, 13, 25, 130, 178, + 178, 178, 178, 178, 107, 0, 6, 96, 17, 15, 0, 9, + 75, 130, 210, 210, 210, 210, 210, 210, 210, 141, 0, 9, + 80, 23, 12, 0, 8, 33, 177, 177, 90, 114, 147, 130, + 17, 114, 33, 83, 49, 81, 81, 177, 146, 240, 240, 192, + 27, 15, 0, 6, 66, 210, 210, 124, 131, 180, 162, 18, + 162, 18, 146, 34, 130, 50, 99, 66, 113, 82, 210, 179, + 0, 6, 64, 31, 14, 0, 5, 98, 194, 194, 140, 98, + 66, 98, 66, 98, 66, 82, 82, 82, 82, 67, 82, 66, + 98, 50, 98, 50, 84, 49, 99, 0, 5, 96, 34, 18, + 0, 6, 18, 114, 97, 33, 98, 113, 130, 204, 162, 66, + 162, 66, 162, 66, 146, 82, 146, 82, 131, 82, 130, 98, + 114, 98, 114, 84, 227, 0, 7, 96, 26, 14, 240, 240, + 34, 194, 209, 209, 50, 104, 70, 194, 194, 209, 20, 74, + 37, 17, 210, 194, 194, 194, 194, 240, 240, 64, 29, 16, + 240, 240, 113, 81, 17, 98, 82, 129, 241, 50, 136, 102, + 226, 226, 226, 20, 106, 69, 17, 242, 226, 226, 226, 226, + 240, 240, 160, 25, 14, 0, 5, 114, 178, 200, 82, 82, + 66, 98, 35, 98, 65, 114, 178, 178, 179, 163, 162, 163, + 178, 0, 6, 64, 28, 17, 0, 5, 114, 98, 97, 17, + 98, 113, 104, 130, 98, 98, 98, 98, 114, 226, 226, 227, + 211, 211, 211, 195, 226, 0, 8, 16, 25, 16, 0, 6, + 66, 226, 210, 235, 66, 66, 114, 82, 98, 98, 226, 210, + 226, 210, 226, 210, 210, 225, 240, 240, 208, 32, 18, 0, + 6, 34, 98, 113, 17, 98, 242, 252, 97, 82, 146, 82, + 130, 98, 240, 18, 242, 240, 18, 242, 240, 18, 242, 227, + 240, 17, 0, 6, 16, 18, 13, 0, 8, 27, 178, 178, + 178, 178, 178, 178, 178, 178, 43, 178, 0, 6, 96, 22, + 16, 240, 209, 225, 17, 225, 240, 75, 226, 226, 226, 226, + 226, 226, 226, 226, 91, 226, 0, 8, 80, 28, 16, 0, + 6, 50, 66, 130, 66, 130, 66, 130, 66, 94, 82, 66, + 130, 66, 130, 66, 130, 51, 210, 226, 210, 210, 211, 0, + 7, 34, 18, 0, 6, 49, 82, 66, 33, 17, 82, 66, + 49, 98, 66, 162, 66, 126, 114, 66, 162, 66, 162, 66, + 162, 51, 242, 240, 18, 242, 242, 242, 0, 8, 16, 23, + 15, 0, 5, 113, 242, 225, 240, 161, 242, 130, 65, 114, + 194, 194, 179, 163, 164, 163, 193, 0, 7, 32, 27, 15, + 0, 5, 113, 129, 83, 81, 17, 97, 81, 240, 65, 227, + 130, 65, 114, 194, 194, 179, 163, 164, 163, 193, 0, 7, + 32, 23, 14, 0, 8, 104, 210, 194, 178, 194, 179, 162, + 18, 130, 50, 83, 82, 51, 99, 33, 145, 0, 7, 48, + 26, 15, 240, 240, 177, 209, 17, 209, 71, 226, 210, 194, + 210, 195, 178, 18, 146, 50, 114, 82, 67, 114, 49, 145, + 0, 8, 27, 15, 0, 7, 114, 210, 210, 97, 98, 23, + 70, 50, 37, 98, 82, 82, 98, 66, 114, 65, 130, 210, + 210, 233, 0, 5, 112, 35, 18, 0, 6, 33, 241, 33, + 82, 129, 114, 240, 18, 97, 146, 23, 118, 50, 85, 98, + 130, 82, 146, 66, 162, 65, 178, 240, 18, 240, 18, 240, + 41, 0, 7, 48, 25, 15, 0, 7, 66, 146, 50, 114, + 66, 114, 82, 97, 97, 98, 209, 210, 194, 210, 194, 194, + 179, 194, 0, 6, 112, 33, 18, 240, 240, 34, 241, 17, + 240, 17, 50, 145, 114, 114, 114, 114, 130, 97, 145, 98, + 240, 17, 240, 18, 242, 240, 18, 242, 242, 227, 242, 0, + 8, 48, 28, 14, 0, 5, 114, 178, 200, 82, 82, 51, + 98, 35, 98, 65, 49, 50, 130, 18, 163, 179, 165, 130, + 35, 83, 163, 0, 6, 64, 32, 17, 0, 6, 1, 98, + 97, 17, 98, 113, 104, 130, 98, 98, 98, 98, 113, 177, + 50, 178, 18, 211, 227, 213, 179, 34, 131, 65, 131, 0, + 8, 16, 21, 16, 0, 6, 117, 102, 226, 226, 226, 142, + 130, 226, 226, 210, 226, 210, 210, 210, 0, 7, 64, 32, + 19, 0, 6, 2, 184, 150, 81, 18, 130, 97, 162, 240, + 34, 190, 178, 240, 34, 240, 34, 240, 18, 240, 34, 240, + 18, 240, 18, 240, 18, 0, 9, 23, 13, 0, 10, 33, + 129, 49, 66, 34, 34, 50, 49, 113, 178, 162, 177, 178, + 162, 162, 162, 0, 5, 112, 29, 15, 0, 6, 33, 145, + 65, 97, 34, 50, 66, 34, 50, 65, 66, 114, 65, 129, + 210, 194, 210, 194, 194, 194, 179, 194, 0, 6, 112, 31, + 18, 0, 6, 17, 17, 240, 17, 129, 194, 50, 66, 97, + 65, 66, 98, 114, 113, 130, 242, 240, 18, 242, 242, 243, + 227, 227, 241, 0, 8, 48, 19, 15, 0, 5, 121, 0, + 6, 29, 130, 210, 210, 210, 194, 210, 194, 194, 194, 0, + 7, 28, 18, 240, 240, 33, 241, 33, 73, 33, 0, 7, + 45, 178, 240, 18, 240, 18, 240, 18, 242, 240, 18, 242, + 242, 242, 0, 8, 64, 22, 9, 240, 194, 114, 114, 114, + 114, 117, 66, 35, 34, 50, 34, 114, 114, 114, 114, 114, + 240, 240, 64, 26, 11, 240, 225, 50, 49, 33, 34, 65, + 66, 146, 146, 149, 98, 34, 82, 50, 66, 146, 146, 146, + 146, 146, 240, 240, 192, 22, 16, 0, 6, 98, 226, 226, + 226, 142, 130, 226, 226, 226, 210, 226, 211, 210, 195, 225, + 240, 240, 224, 11, 15, 0, 9, 89, 0, 15, 77, 0, + 9, 80, 25, 13, 240, 240, 169, 194, 162, 178, 97, 50, + 115, 18, 132, 163, 149, 115, 19, 83, 51, 51, 81, 50, + 0, 7, 112, 28, 16, 240, 240, 130, 226, 226, 169, 242, + 210, 210, 210, 195, 34, 117, 50, 52, 34, 66, 49, 66, + 226, 226, 226, 226, 240, 240, 160, 21, 13, 0, 6, 1, + 194, 162, 178, 162, 178, 162, 177, 178, 162, 162, 162, 147, + 177, 0, 6, 32, 25, 16, 0, 11, 33, 146, 65, 146, + 66, 129, 98, 98, 98, 82, 130, 66, 130, 50, 161, 34, + 177, 49, 0, 11, 96, 29, 18, 0, 8, 81, 241, 17, + 193, 49, 129, 66, 162, 66, 162, 82, 130, 113, 130, 114, + 98, 130, 82, 162, 51, 162, 65, 0, 13, 32, 31, 18, + 0, 6, 18, 241, 33, 225, 33, 177, 50, 113, 66, 162, + 81, 162, 82, 130, 113, 130, 114, 98, 145, 98, 146, 66, + 162, 65, 0, 13, 48, 23, 13, 0, 6, 66, 178, 178, + 98, 50, 67, 66, 20, 101, 130, 178, 178, 178, 178, 178, + 202, 240, 240, 176, 27, 15, 240, 240, 177, 209, 17, 34, + 145, 50, 210, 98, 82, 83, 82, 36, 117, 162, 210, 210, + 210, 210, 210, 234, 0, 6, 16, 29, 16, 240, 194, 209, + 33, 34, 129, 33, 34, 146, 50, 226, 98, 98, 68, 98, + 36, 133, 178, 226, 226, 226, 226, 226, 250, 0, 6, 80, + 19, 14, 0, 7, 12, 194, 194, 194, 178, 194, 178, 178, + 178, 179, 162, 163, 0, 8, 16, 22, 17, 240, 241, 226, + 17, 225, 75, 240, 18, 241, 242, 242, 226, 226, 242, 226, + 226, 211, 211, 0, 10, 28, 18, 210, 241, 33, 225, 33, + 225, 33, 44, 18, 210, 240, 18, 240, 18, 242, 240, 18, + 242, 242, 243, 227, 211, 227, 0, 10, 80, 19, 17, 0, + 13, 33, 244, 194, 34, 162, 66, 130, 114, 97, 147, 243, + 240, 18, 0, 13, 23, 17, 0, 12, 33, 113, 97, 132, + 81, 98, 34, 162, 66, 130, 99, 97, 146, 240, 19, 240, + 18, 0, 13, 26, 18, 0, 10, 66, 241, 33, 225, 33, + 114, 98, 113, 34, 193, 66, 162, 98, 114, 131, 240, 35, + 240, 19, 0, 13, 96, 32, 17, 0, 7, 34, 242, 242, + 157, 162, 242, 177, 50, 33, 129, 50, 34, 98, 50, 50, + 66, 66, 65, 51, 66, 66, 49, 82, 242, 211, 0, 7, + 64, 36, 17, 240, 241, 240, 33, 146, 50, 162, 65, 162, + 157, 162, 242, 177, 50, 33, 129, 50, 34, 98, 50, 50, + 66, 66, 65, 51, 66, 66, 49, 82, 242, 211, 0, 7, + 64, 39, 18, 240, 240, 18, 241, 33, 146, 49, 33, 146, + 66, 162, 173, 178, 240, 18, 193, 50, 33, 145, 50, 34, + 114, 50, 50, 82, 66, 65, 67, 66, 66, 65, 82, 240, + 18, 227, 0, 8, 19, 15, 0, 9, 60, 226, 194, 194, + 210, 114, 35, 149, 178, 226, 226, 209, 0, 8, 48, 21, + 11, 240, 240, 82, 164, 146, 240, 17, 164, 163, 145, 240, + 33, 149, 148, 148, 145, 240, 240, 96, 24, 17, 0, 9, + 34, 242, 226, 242, 242, 226, 242, 226, 82, 130, 98, 98, + 130, 82, 100, 58, 50, 0, 8, 96, 23, 13, 0, 7, + 82, 178, 162, 98, 50, 117, 162, 164, 131, 18, 99, 34, + 83, 132, 146, 177, 0, 6, 48, 19, 15, 0, 7, 90, + 146, 210, 210, 210, 141, 114, 210, 210, 210, 210, 210, 230, + 0, 6, 25, 13, 0, 8, 65, 178, 193, 81, 97, 22, + 53, 50, 34, 18, 50, 98, 49, 129, 193, 193, 194, 178, + 0, 5, 96, 27, 15, 0, 6, 2, 210, 210, 82, 106, + 55, 50, 38, 66, 114, 66, 114, 50, 130, 225, 226, 210, + 210, 210, 225, 240, 240, 128, 15, 14, 0, 14, 40, 193, + 209, 209, 209, 209, 194, 92, 0, 7, 32, 17, 17, 0, + 10, 122, 242, 242, 242, 242, 242, 226, 242, 242, 111, 0, + 10, 112, 17, 11, 0, 9, 89, 146, 146, 146, 41, 146, + 146, 146, 41, 146, 240, 240, 80, 19, 13, 0, 8, 27, + 178, 178, 178, 43, 178, 178, 178, 178, 43, 178, 178, 240, + 240, 176, 20, 14, 240, 240, 232, 0, 5, 107, 210, 194, + 178, 194, 178, 178, 178, 163, 178, 0, 6, 32, 29, 11, + 240, 240, 50, 82, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 82, 34, 82, 34, 82, 130, 146, 131, 130, 130, 130, + 240, 240, 144, 39, 18, 0, 7, 82, 194, 34, 194, 34, + 194, 34, 194, 34, 194, 34, 194, 34, 82, 82, 34, 66, + 98, 34, 66, 82, 50, 50, 98, 50, 34, 98, 69, 99, + 67, 129, 113, 0, 7, 112, 27, 14, 240, 240, 194, 194, + 194, 194, 194, 194, 194, 129, 50, 115, 34, 99, 50, 83, + 66, 51, 98, 20, 117, 162, 0, 6, 80, 27, 13, 0, + 8, 27, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 34, 114, 34, 114, 43, 34, 114, 0, 6, 96, + 22, 12, 0, 10, 74, 33, 114, 33, 114, 33, 114, 33, + 114, 146, 162, 146, 162, 131, 145, 240, 240, 16, 25, 14, + 240, 240, 204, 34, 130, 34, 130, 34, 130, 34, 130, 34, + 130, 178, 194, 179, 178, 178, 178, 178, 0, 7, 112, 27, + 16, 0, 7, 2, 226, 226, 124, 82, 66, 130, 66, 130, + 66, 130, 66, 130, 66, 110, 162, 226, 226, 226, 226, 240, + 240, 128, 20, 16, 0, 8, 43, 226, 226, 210, 225, 178, + 18, 180, 194, 226, 226, 226, 142, 0, 8, 32, 19, 13, + 0, 6, 74, 194, 178, 178, 42, 178, 162, 163, 147, 147, + 147, 131, 0, 7, 80, 19, 15, 0, 7, 66, 226, 226, + 240, 114, 194, 194, 194, 194, 179, 163, 164, 163, 0, 9, + 29, 17, 240, 241, 130, 81, 17, 114, 82, 130, 172, 82, + 130, 82, 130, 82, 130, 82, 130, 226, 242, 226, 227, 211, + 211, 210, 0, 7, 96, 27, 11, 0, 7, 33, 161, 161, + 121, 81, 65, 81, 65, 81, 65, 66, 65, 65, 81, 50, + 81, 34, 81, 49, 67, 240, 240, 96, 22, 12, 0, 9, + 49, 162, 168, 49, 65, 82, 65, 81, 81, 177, 161, 177, + 161, 162, 161, 240, 240, 32, 9, 4, 240, 240, 98, 34, + 240, 240, 128, 8, 19, 0, 21, 63, 2, 0, 24, + 0, // Padding + + // + // Block 2 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x90, 0x01, 0x00, 0x00, // Offset 400 (0x190) + 0xa8, 0x01, 0x00, 0x00, // Offset 424 (0x1a8) + 0xc6, 0x01, 0x00, 0x00, // Offset 454 (0x1c6) + 0xd5, 0x01, 0x00, 0x00, // Offset 469 (0x1d5) + 0xed, 0x01, 0x00, 0x00, // Offset 493 (0x1ed) + 0x06, 0x02, 0x00, 0x00, // Offset 518 (0x206) + 0x15, 0x02, 0x00, 0x00, // Offset 533 (0x215) + 0x2c, 0x02, 0x00, 0x00, // Offset 556 (0x22c) + 0x3c, 0x02, 0x00, 0x00, // Offset 572 (0x23c) + 0x52, 0x02, 0x00, 0x00, // Offset 594 (0x252) + 0x6d, 0x02, 0x00, 0x00, // Offset 621 (0x26d) + 0x89, 0x02, 0x00, 0x00, // Offset 649 (0x289) + 0xa4, 0x02, 0x00, 0x00, // Offset 676 (0x2a4) + 0xb9, 0x02, 0x00, 0x00, // Offset 697 (0x2b9) + 0xd9, 0x02, 0x00, 0x00, // Offset 729 (0x2d9) + 0xf3, 0x02, 0x00, 0x00, // Offset 755 (0x2f3) + 0x08, 0x03, 0x00, 0x00, // Offset 776 (0x308) + 0x1d, 0x03, 0x00, 0x00, // Offset 797 (0x31d) + 0x43, 0x03, 0x00, 0x00, // Offset 835 (0x343) + 0x67, 0x03, 0x00, 0x00, // Offset 871 (0x367) + 0x79, 0x03, 0x00, 0x00, // Offset 889 (0x379) + 0x97, 0x03, 0x00, 0x00, // Offset 919 (0x397) + 0xae, 0x03, 0x00, 0x00, // Offset 942 (0x3ae) + 0xc1, 0x03, 0x00, 0x00, // Offset 961 (0x3c1) + 0xdb, 0x03, 0x00, 0x00, // Offset 987 (0x3db) + 0xef, 0x03, 0x00, 0x00, // Offset 1007 (0x3ef) + 0xff, 0x03, 0x00, 0x00, // Offset 1023 (0x3ff) + 0x0e, 0x04, 0x00, 0x00, // Offset 1038 (0x40e) + 0x24, 0x04, 0x00, 0x00, // Offset 1060 (0x424) + 0x39, 0x04, 0x00, 0x00, // Offset 1081 (0x439) + 0x4e, 0x04, 0x00, 0x00, // Offset 1102 (0x44e) + 0x73, 0x04, 0x00, 0x00, // Offset 1139 (0x473) + 0x88, 0x04, 0x00, 0x00, // Offset 1160 (0x488) + 0xac, 0x04, 0x00, 0x00, // Offset 1196 (0x4ac) + 0xc1, 0x04, 0x00, 0x00, // Offset 1217 (0x4c1) + 0xe7, 0x04, 0x00, 0x00, // Offset 1255 (0x4e7) + 0xfc, 0x04, 0x00, 0x00, // Offset 1276 (0x4fc) + 0x22, 0x05, 0x00, 0x00, // Offset 1314 (0x522) + 0x36, 0x05, 0x00, 0x00, // Offset 1334 (0x536) + 0x60, 0x05, 0x00, 0x00, // Offset 1376 (0x560) + 0x8e, 0x05, 0x00, 0x00, // Offset 1422 (0x58e) + 0xad, 0x05, 0x00, 0x00, // Offset 1453 (0x5ad) + 0xc2, 0x05, 0x00, 0x00, // Offset 1474 (0x5c2) + 0xda, 0x05, 0x00, 0x00, // Offset 1498 (0x5da) + 0x04, 0x06, 0x00, 0x00, // Offset 1540 (0x604) + 0x36, 0x06, 0x00, 0x00, // Offset 1590 (0x636) + 0x5f, 0x06, 0x00, 0x00, // Offset 1631 (0x65f) + 0x78, 0x06, 0x00, 0x00, // Offset 1656 (0x678) + 0x81, 0x06, 0x00, 0x00, // Offset 1665 (0x681) + 0xaa, 0x06, 0x00, 0x00, // Offset 1706 (0x6aa) + 0xbf, 0x06, 0x00, 0x00, // Offset 1727 (0x6bf) + 0xc3, 0x06, 0x00, 0x00, // Offset 1731 (0x6c3) + 0xd8, 0x06, 0x00, 0x00, // Offset 1752 (0x6d8) + 0xed, 0x06, 0x00, 0x00, // Offset 1773 (0x6ed) + 0x0a, 0x07, 0x00, 0x00, // Offset 1802 (0x70a) + 0x23, 0x07, 0x00, 0x00, // Offset 1827 (0x723) + 0x47, 0x07, 0x00, 0x00, // Offset 1863 (0x747) + 0x5e, 0x07, 0x00, 0x00, // Offset 1886 (0x75e) + 0x8b, 0x07, 0x00, 0x00, // Offset 1931 (0x78b) + 0xa4, 0x07, 0x00, 0x00, // Offset 1956 (0x7a4) + 0xc0, 0x07, 0x00, 0x00, // Offset 1984 (0x7c0) + 0xe3, 0x07, 0x00, 0x00, // Offset 2019 (0x7e3) + 0x06, 0x08, 0x00, 0x00, // Offset 2054 (0x806) + 0x26, 0x08, 0x00, 0x00, // Offset 2086 (0x826) + 0x40, 0x08, 0x00, 0x00, // Offset 2112 (0x840) + 0x5c, 0x08, 0x00, 0x00, // Offset 2140 (0x85c) + 0x79, 0x08, 0x00, 0x00, // Offset 2169 (0x879) + 0xa4, 0x08, 0x00, 0x00, // Offset 2212 (0x8a4) + 0xcd, 0x08, 0x00, 0x00, // Offset 2253 (0x8cd) + 0xef, 0x08, 0x00, 0x00, // Offset 2287 (0x8ef) + 0x0c, 0x09, 0x00, 0x00, // Offset 2316 (0x90c) + 0x28, 0x09, 0x00, 0x00, // Offset 2344 (0x928) + 0x50, 0x09, 0x00, 0x00, // Offset 2384 (0x950) + 0x6d, 0x09, 0x00, 0x00, // Offset 2413 (0x96d) + 0x89, 0x09, 0x00, 0x00, // Offset 2441 (0x989) + 0xa4, 0x09, 0x00, 0x00, // Offset 2468 (0x9a4) + 0xc7, 0x09, 0x00, 0x00, // Offset 2503 (0x9c7) + 0xe4, 0x09, 0x00, 0x00, // Offset 2532 (0x9e4) + 0xf9, 0x09, 0x00, 0x00, // Offset 2553 (0x9f9) + 0x1c, 0x0a, 0x00, 0x00, // Offset 2588 (0xa1c) + 0x34, 0x0a, 0x00, 0x00, // Offset 2612 (0xa34) + 0x59, 0x0a, 0x00, 0x00, // Offset 2649 (0xa59) + 0x7b, 0x0a, 0x00, 0x00, // Offset 2683 (0xa7b) + 0x98, 0x0a, 0x00, 0x00, // Offset 2712 (0xa98) + 0xb8, 0x0a, 0x00, 0x00, // Offset 2744 (0xab8) + 0xcf, 0x0a, 0x00, 0x00, // Offset 2767 (0xacf) + 0xfb, 0x0a, 0x00, 0x00, // Offset 2811 (0xafb) + 0x35, 0x0b, 0x00, 0x00, // Offset 2869 (0xb35) + 0x59, 0x0b, 0x00, 0x00, // Offset 2905 (0xb59) + 0x82, 0x0b, 0x00, 0x00, // Offset 2946 (0xb82) + 0xbd, 0x0b, 0x00, 0x00, // Offset 3005 (0xbbd) + 0xe4, 0x0b, 0x00, 0x00, // Offset 3044 (0xbe4) + 0xed, 0x0b, 0x00, 0x00, // Offset 3053 (0xbed) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 2 Data: Codepoints 0x3130 - 0x318f + // + 16, 11, 0, 8, 41, 161, 161, 161, 161, 161, 161, 161, + 161, 0, 7, 16, 24, 14, 0, 10, 69, 37, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 0, 9, 30, 15, 0, 11, 37, 65, 145, 65, + 145, 65, 145, 50, 145, 49, 17, 129, 49, 17, 129, 34, + 18, 113, 18, 50, 97, 17, 81, 0, 9, 80, 15, 11, + 0, 8, 33, 161, 161, 161, 161, 161, 161, 169, 0, 8, + 64, 24, 16, 0, 12, 1, 86, 65, 161, 65, 146, 65, + 130, 81, 130, 81, 116, 65, 98, 34, 56, 66, 0, 12, + 32, 25, 15, 0, 10, 21, 65, 225, 72, 33, 225, 100, + 65, 81, 65, 49, 81, 65, 49, 81, 65, 54, 20, 0, + 11, 96, 15, 11, 0, 8, 41, 33, 161, 161, 161, 161, + 161, 169, 0, 8, 64, 23, 14, 0, 10, 69, 22, 33, + 81, 113, 81, 113, 81, 113, 81, 113, 81, 113, 81, 117, + 22, 0, 10, 96, 16, 12, 0, 7, 73, 177, 177, 177, + 57, 49, 177, 177, 186, 0, 9, 32, 22, 13, 0, 9, + 101, 21, 97, 81, 97, 81, 37, 81, 33, 145, 33, 145, + 33, 145, 38, 65, 0, 10, 27, 13, 0, 9, 101, 21, + 97, 17, 49, 97, 17, 49, 37, 17, 49, 33, 81, 49, + 33, 81, 49, 33, 81, 49, 43, 0, 10, 28, 14, 0, + 10, 69, 17, 65, 97, 17, 65, 97, 17, 65, 37, 22, + 33, 81, 65, 33, 81, 65, 33, 81, 65, 44, 0, 10, + 96, 27, 15, 0, 11, 37, 65, 145, 65, 145, 65, 85, + 50, 81, 113, 17, 65, 98, 18, 49, 82, 50, 37, 17, + 81, 0, 11, 64, 21, 13, 0, 9, 101, 21, 97, 17, + 161, 17, 101, 21, 33, 81, 97, 81, 97, 81, 107, 0, + 10, 32, 15, 0, 9, 53, 23, 97, 33, 33, 129, 33, + 33, 129, 33, 33, 69, 33, 33, 65, 97, 33, 65, 97, + 33, 65, 97, 33, 69, 23, 0, 11, 64, 26, 15, 0, + 9, 53, 37, 113, 225, 23, 97, 165, 52, 49, 97, 65, + 33, 97, 65, 33, 97, 65, 38, 36, 0, 11, 80, 21, + 11, 0, 8, 41, 33, 113, 33, 113, 33, 113, 33, 113, + 33, 113, 33, 113, 41, 0, 8, 64, 21, 11, 0, 8, + 33, 113, 33, 113, 33, 113, 41, 33, 113, 33, 113, 33, + 113, 41, 0, 8, 64, 38, 13, 0, 8, 17, 49, 17, + 49, 33, 49, 17, 49, 33, 49, 17, 49, 33, 49, 17, + 49, 37, 21, 33, 49, 17, 49, 33, 49, 17, 49, 33, + 49, 17, 49, 37, 21, 0, 10, 36, 15, 0, 9, 49, + 49, 65, 81, 49, 65, 81, 49, 65, 81, 49, 65, 85, + 65, 81, 49, 49, 17, 65, 49, 49, 17, 65, 49, 33, + 49, 53, 18, 50, 0, 11, 64, 18, 13, 0, 10, 49, + 193, 178, 178, 162, 17, 145, 34, 113, 66, 66, 99, 0, + 10, 30, 15, 0, 9, 113, 65, 145, 65, 145, 65, 131, + 49, 129, 17, 35, 98, 18, 17, 18, 66, 51, 34, 34, + 66, 65, 114, 209, 0, 10, 64, 23, 12, 0, 7, 116, + 98, 66, 50, 98, 33, 129, 33, 129, 33, 129, 34, 98, + 50, 66, 100, 0, 9, 80, 19, 15, 0, 9, 74, 210, + 194, 194, 194, 180, 162, 50, 99, 83, 50, 146, 0, 11, + 64, 26, 16, 0, 10, 22, 21, 130, 66, 129, 81, 130, + 66, 115, 50, 114, 34, 19, 82, 66, 50, 34, 82, 65, + 130, 0, 13, 20, 14, 0, 7, 53, 240, 240, 89, 210, + 178, 162, 179, 146, 35, 67, 99, 33, 0, 10, 48, 16, + 11, 0, 6, 121, 161, 161, 161, 161, 41, 161, 161, 161, + 0, 8, 64, 15, 12, 0, 9, 9, 49, 177, 185, 49, + 177, 177, 186, 0, 9, 32, 22, 13, 0, 8, 26, 97, + 49, 129, 49, 129, 49, 129, 49, 129, 49, 129, 49, 129, + 49, 91, 0, 10, 21, 13, 0, 8, 54, 240, 59, 240, + 53, 113, 81, 81, 113, 65, 113, 81, 81, 117, 0, 8, + 96, 21, 6, 97, 81, 81, 81, 81, 81, 81, 81, 84, + 33, 81, 81, 81, 81, 81, 81, 81, 81, 176, 37, 8, + 129, 65, 33, 65, 33, 65, 33, 65, 33, 65, 33, 65, + 33, 65, 33, 65, 38, 33, 65, 33, 65, 33, 65, 33, + 65, 33, 65, 33, 65, 33, 65, 33, 65, 113, 160, 21, + 6, 97, 81, 81, 81, 81, 84, 33, 81, 81, 81, 84, + 33, 81, 81, 81, 81, 81, 81, 176, 36, 8, 129, 65, + 33, 65, 33, 65, 33, 65, 33, 65, 38, 33, 65, 33, + 65, 33, 65, 33, 65, 38, 33, 65, 33, 65, 33, 65, + 33, 65, 33, 65, 33, 65, 113, 160, 21, 7, 177, 97, + 97, 97, 97, 97, 97, 37, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 144, 38, 10, 209, 49, 81, 49, 81, + 49, 81, 49, 81, 49, 81, 49, 81, 49, 36, 49, 81, + 49, 81, 49, 81, 49, 81, 49, 81, 49, 81, 49, 81, + 49, 81, 49, 81, 49, 145, 192, 21, 7, 177, 97, 97, + 97, 97, 37, 97, 97, 97, 97, 37, 97, 97, 97, 97, + 97, 97, 97, 144, 38, 10, 209, 49, 81, 49, 81, 49, + 81, 49, 81, 49, 36, 49, 81, 49, 81, 49, 81, 49, + 81, 49, 36, 49, 81, 49, 81, 49, 81, 49, 81, 49, + 81, 49, 81, 49, 145, 192, 20, 19, 0, 20, 1, 240, + 49, 240, 49, 240, 49, 240, 49, 240, 49, 175, 2, 0, + 12, 16, 42, 19, 240, 240, 33, 240, 49, 240, 49, 240, + 49, 240, 49, 240, 49, 240, 49, 161, 113, 161, 116, 113, + 113, 161, 113, 161, 113, 161, 81, 17, 91, 33, 240, 49, + 240, 49, 240, 49, 240, 49, 240, 144, 46, 18, 240, 225, + 49, 209, 49, 209, 49, 209, 49, 209, 49, 209, 49, 209, + 49, 113, 85, 113, 81, 49, 113, 81, 49, 113, 81, 49, + 113, 81, 49, 42, 17, 49, 209, 49, 209, 49, 209, 49, + 209, 49, 240, 33, 240, 80, 31, 16, 240, 225, 241, 241, + 241, 241, 241, 241, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 65, 33, 43, 33, 241, 241, 241, 241, 240, + 48, 21, 19, 0, 19, 81, 81, 193, 81, 193, 81, 193, + 81, 193, 81, 193, 81, 127, 2, 0, 12, 16, 24, 19, + 0, 16, 95, 2, 161, 240, 49, 240, 49, 240, 49, 240, + 49, 240, 49, 240, 49, 240, 49, 0, 10, 96, 42, 17, + 240, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, + 17, 240, 17, 240, 17, 38, 97, 17, 134, 33, 129, 113, + 129, 113, 129, 53, 129, 113, 129, 113, 129, 113, 129, 113, + 240, 17, 240, 64, 50, 17, 240, 209, 33, 209, 33, 209, + 33, 209, 33, 209, 33, 209, 33, 209, 33, 209, 33, 41, + 33, 33, 97, 97, 33, 97, 97, 33, 97, 97, 33, 97, + 52, 33, 97, 97, 33, 97, 97, 33, 97, 97, 33, 97, + 97, 33, 240, 17, 240, 64, 41, 17, 240, 240, 17, 240, + 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 225, + 17, 45, 17, 129, 113, 129, 113, 129, 113, 129, 113, 129, + 113, 129, 113, 129, 113, 240, 17, 240, 17, 240, 64, 25, + 19, 0, 16, 95, 2, 113, 81, 193, 81, 193, 81, 193, + 81, 193, 81, 193, 81, 193, 81, 193, 81, 0, 10, 48, + 9, 19, 0, 23, 111, 2, 0, 21, 80, 41, 17, 240, + 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, + 240, 17, 240, 17, 240, 17, 240, 17, 225, 17, 45, 17, + 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, + 240, 64, 21, 3, 49, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 80, 4, + 22, 0, 55, 21, 13, 0, 9, 97, 81, 97, 81, 97, + 81, 97, 81, 97, 81, 97, 81, 97, 81, 107, 0, 10, + 21, 13, 0, 9, 97, 85, 33, 81, 97, 81, 97, 81, + 97, 81, 97, 81, 97, 81, 107, 0, 10, 29, 15, 0, + 10, 65, 81, 129, 81, 129, 81, 129, 81, 114, 81, 113, + 17, 65, 113, 17, 65, 97, 49, 53, 18, 50, 129, 0, + 10, 48, 25, 13, 0, 9, 97, 113, 65, 98, 65, 98, + 65, 82, 17, 49, 82, 17, 49, 81, 33, 49, 66, 49, + 43, 0, 10, 36, 19, 0, 14, 36, 20, 65, 129, 65, + 65, 129, 65, 65, 84, 65, 65, 81, 113, 49, 17, 65, + 113, 49, 17, 65, 113, 34, 18, 53, 49, 33, 50, 194, + 0, 12, 96, 23, 14, 0, 10, 69, 37, 97, 33, 161, + 33, 101, 33, 97, 97, 97, 97, 97, 97, 102, 21, 0, + 10, 96, 45, 19, 0, 11, 116, 33, 17, 65, 129, 33, + 17, 65, 129, 33, 17, 65, 129, 33, 17, 65, 84, 35, + 50, 81, 81, 17, 49, 17, 65, 81, 17, 49, 17, 65, + 81, 17, 34, 18, 53, 19, 18, 50, 0, 14, 64, 25, + 15, 0, 11, 37, 65, 145, 65, 145, 51, 69, 51, 65, + 97, 33, 65, 97, 34, 49, 81, 50, 61, 0, 11, 64, + 28, 15, 0, 11, 37, 23, 97, 225, 51, 69, 34, 18, + 49, 97, 49, 49, 97, 49, 49, 97, 49, 54, 17, 34, + 179, 0, 9, 112, 35, 14, 0, 10, 69, 33, 49, 33, + 49, 33, 49, 33, 49, 33, 49, 33, 49, 37, 33, 49, + 33, 49, 33, 49, 33, 49, 33, 49, 33, 49, 37, 37, + 0, 10, 96, 35, 15, 0, 11, 37, 65, 81, 49, 65, + 81, 49, 65, 81, 49, 65, 81, 49, 49, 17, 65, 49, + 49, 17, 65, 49, 34, 18, 53, 33, 50, 129, 81, 0, + 9, 80, 32, 15, 0, 11, 37, 65, 81, 49, 65, 81, + 49, 51, 65, 49, 51, 65, 49, 33, 33, 65, 49, 33, + 34, 49, 49, 17, 50, 53, 23, 0, 11, 64, 26, 12, + 0, 6, 10, 33, 129, 33, 129, 33, 129, 33, 129, 42, + 240, 227, 129, 49, 113, 49, 113, 49, 131, 240, 240, 192, + 28, 13, 0, 9, 97, 49, 21, 33, 49, 81, 33, 49, + 81, 37, 81, 33, 49, 81, 33, 49, 81, 33, 49, 81, + 37, 81, 0, 10, 29, 14, 0, 10, 65, 49, 37, 33, + 49, 33, 97, 49, 33, 101, 33, 97, 49, 33, 97, 49, + 33, 97, 49, 33, 101, 37, 0, 10, 96, 43, 16, 0, + 10, 1, 49, 49, 113, 49, 49, 20, 33, 49, 49, 65, + 33, 49, 49, 65, 37, 34, 65, 33, 49, 34, 65, 33, + 49, 33, 17, 49, 33, 49, 17, 34, 33, 39, 49, 33, + 193, 0, 10, 80, 41, 17, 0, 12, 97, 49, 49, 36, + 33, 49, 49, 33, 81, 49, 49, 33, 85, 49, 33, 81, + 49, 34, 33, 81, 49, 33, 17, 17, 81, 49, 33, 17, + 17, 85, 18, 37, 129, 49, 0, 11, 48, 34, 16, 0, + 10, 1, 49, 177, 49, 22, 65, 49, 82, 65, 49, 81, + 85, 66, 81, 49, 51, 81, 49, 49, 18, 65, 49, 18, + 50, 53, 17, 82, 0, 12, 32, 29, 14, 0, 10, 65, + 49, 22, 33, 49, 18, 97, 49, 18, 101, 22, 33, 49, + 18, 97, 49, 18, 97, 49, 18, 101, 22, 0, 10, 96, + 28, 11, 240, 240, 49, 113, 33, 113, 33, 113, 41, 33, + 113, 33, 113, 41, 240, 195, 113, 49, 97, 49, 97, 49, + 115, 240, 240, 128, 40, 13, 0, 6, 65, 49, 17, 49, + 33, 49, 17, 49, 37, 21, 33, 49, 17, 49, 33, 49, + 17, 49, 33, 49, 17, 49, 37, 21, 240, 67, 145, 49, + 129, 49, 129, 49, 147, 240, 240, 240, 29, 13, 0, 10, + 17, 37, 81, 97, 81, 97, 66, 97, 65, 17, 81, 65, + 17, 81, 50, 33, 65, 34, 50, 49, 33, 145, 0, 8, + 48, 28, 15, 0, 11, 81, 65, 145, 65, 145, 65, 130, + 65, 129, 17, 49, 129, 17, 49, 114, 18, 33, 98, 50, + 21, 33, 0, 11, 16, 27, 14, 0, 10, 113, 53, 81, + 49, 145, 49, 145, 49, 129, 17, 33, 129, 17, 33, 114, + 18, 17, 98, 55, 33, 0, 10, 48, 35, 15, 0, 9, + 97, 49, 65, 81, 49, 65, 81, 49, 65, 81, 49, 65, + 66, 54, 65, 17, 33, 65, 50, 17, 33, 65, 49, 49, + 17, 65, 33, 72, 0, 11, 64, 29, 17, 0, 11, 1, + 240, 17, 54, 113, 129, 113, 114, 99, 82, 113, 17, 82, + 113, 17, 68, 81, 49, 34, 34, 50, 52, 66, 0, 13, + 21, 10, 0, 6, 97, 145, 131, 113, 17, 97, 34, 81, + 49, 66, 49, 65, 81, 40, 0, 7, 96, 35, 15, 0, + 11, 52, 52, 65, 33, 49, 33, 49, 65, 17, 65, 33, + 65, 17, 65, 33, 65, 17, 65, 33, 65, 17, 65, 49, + 33, 49, 33, 82, 82, 0, 11, 96, 24, 11, 0, 7, + 49, 133, 82, 50, 50, 82, 33, 113, 33, 113, 33, 113, + 34, 82, 50, 50, 84, 0, 7, 64, 37, 16, 0, 10, + 49, 97, 115, 81, 97, 49, 65, 81, 81, 49, 81, 81, + 35, 65, 81, 33, 17, 65, 81, 33, 18, 49, 81, 17, + 50, 49, 49, 18, 65, 67, 33, 0, 11, 34, 15, 0, + 9, 97, 211, 65, 97, 49, 50, 65, 81, 34, 65, 81, + 18, 17, 49, 81, 17, 33, 49, 83, 33, 49, 83, 49, + 49, 49, 22, 67, 0, 10, 80, 29, 14, 240, 240, 218, + 71, 18, 97, 65, 129, 65, 129, 65, 129, 65, 88, 19, + 44, 240, 84, 145, 65, 129, 65, 129, 65, 148, 0, 6, + 32, 16, 0, 10, 36, 52, 240, 78, 240, 83, 68, 65, + 49, 34, 34, 49, 49, 33, 65, 49, 49, 33, 65, 49, + 49, 34, 34, 67, 68, 0, 10, 48, 23, 13, 0, 8, + 27, 240, 53, 113, 81, 81, 113, 65, 113, 65, 113, 65, + 113, 82, 50, 117, 0, 8, 96, 44, 19, 194, 240, 34, + 240, 34, 240, 34, 240, 34, 240, 34, 240, 37, 226, 129, + 65, 50, 129, 65, 50, 129, 65, 50, 129, 65, 50, 129, + 65, 53, 46, 89, 50, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 144, 58, 18, 240, 226, 18, 210, 18, 210, 18, + 210, 18, 210, 18, 209, 17, 17, 81, 49, 49, 17, 17, + 81, 49, 50, 18, 81, 49, 50, 18, 81, 49, 50, 18, + 81, 49, 50, 18, 81, 49, 49, 17, 17, 42, 18, 18, + 42, 18, 18, 210, 18, 210, 18, 210, 18, 240, 18, 240, + 80, 36, 16, 240, 225, 241, 241, 241, 241, 241, 241, 81, + 65, 65, 81, 65, 65, 81, 65, 65, 81, 65, 65, 81, + 65, 33, 17, 44, 17, 41, 65, 241, 241, 241, 241, 240, + 48, 41, 16, 209, 241, 241, 241, 241, 241, 241, 241, 44, + 17, 42, 49, 81, 49, 81, 81, 49, 21, 81, 49, 81, + 81, 49, 81, 81, 49, 21, 81, 49, 81, 81, 49, 81, + 81, 49, 81, 241, 240, 48, 59, 17, 240, 210, 17, 210, + 17, 210, 17, 210, 17, 210, 17, 210, 17, 210, 17, 42, + 18, 17, 41, 34, 17, 81, 33, 66, 17, 81, 33, 21, + 17, 81, 33, 66, 17, 81, 33, 66, 17, 81, 33, 21, + 17, 81, 33, 66, 17, 81, 33, 66, 17, 81, 33, 66, + 17, 240, 17, 240, 64, 39, 16, 240, 225, 241, 241, 241, + 241, 241, 241, 241, 44, 17, 42, 49, 81, 65, 65, 81, + 65, 65, 81, 65, 65, 81, 65, 65, 81, 65, 65, 81, + 65, 65, 81, 65, 65, 241, 240, 48, 9, 4, 240, 240, + 98, 34, 240, 240, 128, 23, 8, 209, 113, 113, 113, 113, + 113, 113, 113, 34, 49, 34, 49, 113, 113, 113, 113, 113, + 113, 113, 113, 160, + // + // Block 3 Offsets: Codepoints 0xac00 - 0xac7f + // + 0x00, 0x02, 0x00, 0x00, // Offset 512 (0x200) + 0x28, 0x02, 0x00, 0x00, // Offset 552 (0x228) + 0x4f, 0x02, 0x00, 0x00, // Offset 591 (0x24f) + 0x76, 0x02, 0x00, 0x00, // Offset 630 (0x276) + 0xa0, 0x02, 0x00, 0x00, // Offset 672 (0x2a0) + 0xc7, 0x02, 0x00, 0x00, // Offset 711 (0x2c7) + 0xf1, 0x02, 0x00, 0x00, // Offset 753 (0x2f1) + 0x1a, 0x03, 0x00, 0x00, // Offset 794 (0x31a) + 0x40, 0x03, 0x00, 0x00, // Offset 832 (0x340) + 0x65, 0x03, 0x00, 0x00, // Offset 869 (0x365) + 0x8c, 0x03, 0x00, 0x00, // Offset 908 (0x38c) + 0xba, 0x03, 0x00, 0x00, // Offset 954 (0x3ba) + 0xe7, 0x03, 0x00, 0x00, // Offset 999 (0x3e7) + 0x12, 0x04, 0x00, 0x00, // Offset 1042 (0x412) + 0x3b, 0x04, 0x00, 0x00, // Offset 1083 (0x43b) + 0x67, 0x04, 0x00, 0x00, // Offset 1127 (0x467) + 0x91, 0x04, 0x00, 0x00, // Offset 1169 (0x491) + 0xb7, 0x04, 0x00, 0x00, // Offset 1207 (0x4b7) + 0xdc, 0x04, 0x00, 0x00, // Offset 1244 (0x4dc) + 0x0b, 0x05, 0x00, 0x00, // Offset 1291 (0x50b) + 0x31, 0x05, 0x00, 0x00, // Offset 1329 (0x531) + 0x5d, 0x05, 0x00, 0x00, // Offset 1373 (0x55d) + 0x83, 0x05, 0x00, 0x00, // Offset 1411 (0x583) + 0xa8, 0x05, 0x00, 0x00, // Offset 1448 (0x5a8) + 0xca, 0x05, 0x00, 0x00, // Offset 1482 (0x5ca) + 0xf0, 0x05, 0x00, 0x00, // Offset 1520 (0x5f0) + 0x15, 0x06, 0x00, 0x00, // Offset 1557 (0x615) + 0x3b, 0x06, 0x00, 0x00, // Offset 1595 (0x63b) + 0x5e, 0x06, 0x00, 0x00, // Offset 1630 (0x65e) + 0x92, 0x06, 0x00, 0x00, // Offset 1682 (0x692) + 0xc0, 0x06, 0x00, 0x00, // Offset 1728 (0x6c0) + 0xee, 0x06, 0x00, 0x00, // Offset 1774 (0x6ee) + 0x21, 0x07, 0x00, 0x00, // Offset 1825 (0x721) + 0x52, 0x07, 0x00, 0x00, // Offset 1874 (0x752) + 0x84, 0x07, 0x00, 0x00, // Offset 1924 (0x784) + 0xb5, 0x07, 0x00, 0x00, // Offset 1973 (0x7b5) + 0xe3, 0x07, 0x00, 0x00, // Offset 2019 (0x7e3) + 0x10, 0x08, 0x00, 0x00, // Offset 2064 (0x810) + 0x3f, 0x08, 0x00, 0x00, // Offset 2111 (0x83f) + 0x74, 0x08, 0x00, 0x00, // Offset 2164 (0x874) + 0xaa, 0x08, 0x00, 0x00, // Offset 2218 (0x8aa) + 0xdc, 0x08, 0x00, 0x00, // Offset 2268 (0x8dc) + 0x0b, 0x09, 0x00, 0x00, // Offset 2315 (0x90b) + 0x3f, 0x09, 0x00, 0x00, // Offset 2367 (0x93f) + 0x71, 0x09, 0x00, 0x00, // Offset 2417 (0x971) + 0x9f, 0x09, 0x00, 0x00, // Offset 2463 (0x99f) + 0xcc, 0x09, 0x00, 0x00, // Offset 2508 (0x9cc) + 0x05, 0x0a, 0x00, 0x00, // Offset 2565 (0xa05) + 0x35, 0x0a, 0x00, 0x00, // Offset 2613 (0xa35) + 0x6a, 0x0a, 0x00, 0x00, // Offset 2666 (0xa6a) + 0x98, 0x0a, 0x00, 0x00, // Offset 2712 (0xa98) + 0xc4, 0x0a, 0x00, 0x00, // Offset 2756 (0xac4) + 0xef, 0x0a, 0x00, 0x00, // Offset 2799 (0xaef) + 0x1d, 0x0b, 0x00, 0x00, // Offset 2845 (0xb1d) + 0x4a, 0x0b, 0x00, 0x00, // Offset 2890 (0xb4a) + 0x78, 0x0b, 0x00, 0x00, // Offset 2936 (0xb78) + 0xa3, 0x0b, 0x00, 0x00, // Offset 2979 (0xba3) + 0xcb, 0x0b, 0x00, 0x00, // Offset 3019 (0xbcb) + 0xf2, 0x0b, 0x00, 0x00, // Offset 3058 (0xbf2) + 0x19, 0x0c, 0x00, 0x00, // Offset 3097 (0xc19) + 0x43, 0x0c, 0x00, 0x00, // Offset 3139 (0xc43) + 0x6a, 0x0c, 0x00, 0x00, // Offset 3178 (0xc6a) + 0x93, 0x0c, 0x00, 0x00, // Offset 3219 (0xc93) + 0xbc, 0x0c, 0x00, 0x00, // Offset 3260 (0xcbc) + 0xe2, 0x0c, 0x00, 0x00, // Offset 3298 (0xce2) + 0x07, 0x0d, 0x00, 0x00, // Offset 3335 (0xd07) + 0x2e, 0x0d, 0x00, 0x00, // Offset 3374 (0xd2e) + 0x5c, 0x0d, 0x00, 0x00, // Offset 3420 (0xd5c) + 0x89, 0x0d, 0x00, 0x00, // Offset 3465 (0xd89) + 0xb4, 0x0d, 0x00, 0x00, // Offset 3508 (0xdb4) + 0xdd, 0x0d, 0x00, 0x00, // Offset 3549 (0xddd) + 0x09, 0x0e, 0x00, 0x00, // Offset 3593 (0xe09) + 0x33, 0x0e, 0x00, 0x00, // Offset 3635 (0xe33) + 0x59, 0x0e, 0x00, 0x00, // Offset 3673 (0xe59) + 0x7f, 0x0e, 0x00, 0x00, // Offset 3711 (0xe7f) + 0xae, 0x0e, 0x00, 0x00, // Offset 3758 (0xeae) + 0xd4, 0x0e, 0x00, 0x00, // Offset 3796 (0xed4) + 0x00, 0x0f, 0x00, 0x00, // Offset 3840 (0xf00) + 0x26, 0x0f, 0x00, 0x00, // Offset 3878 (0xf26) + 0x4a, 0x0f, 0x00, 0x00, // Offset 3914 (0xf4a) + 0x6d, 0x0f, 0x00, 0x00, // Offset 3949 (0xf6d) + 0x93, 0x0f, 0x00, 0x00, // Offset 3987 (0xf93) + 0xb8, 0x0f, 0x00, 0x00, // Offset 4024 (0xfb8) + 0xde, 0x0f, 0x00, 0x00, // Offset 4062 (0xfde) + 0x01, 0x10, 0x00, 0x00, // Offset 4097 (0x1001) + 0x34, 0x10, 0x00, 0x00, // Offset 4148 (0x1034) + 0x61, 0x10, 0x00, 0x00, // Offset 4193 (0x1061) + 0x8e, 0x10, 0x00, 0x00, // Offset 4238 (0x108e) + 0xc0, 0x10, 0x00, 0x00, // Offset 4288 (0x10c0) + 0xf0, 0x10, 0x00, 0x00, // Offset 4336 (0x10f0) + 0x21, 0x11, 0x00, 0x00, // Offset 4385 (0x1121) + 0x51, 0x11, 0x00, 0x00, // Offset 4433 (0x1151) + 0x7e, 0x11, 0x00, 0x00, // Offset 4478 (0x117e) + 0xaa, 0x11, 0x00, 0x00, // Offset 4522 (0x11aa) + 0xd8, 0x11, 0x00, 0x00, // Offset 4568 (0x11d8) + 0x0c, 0x12, 0x00, 0x00, // Offset 4620 (0x120c) + 0x41, 0x12, 0x00, 0x00, // Offset 4673 (0x1241) + 0x72, 0x12, 0x00, 0x00, // Offset 4722 (0x1272) + 0xa0, 0x12, 0x00, 0x00, // Offset 4768 (0x12a0) + 0xd3, 0x12, 0x00, 0x00, // Offset 4819 (0x12d3) + 0x04, 0x13, 0x00, 0x00, // Offset 4868 (0x1304) + 0x31, 0x13, 0x00, 0x00, // Offset 4913 (0x1331) + 0x5e, 0x13, 0x00, 0x00, // Offset 4958 (0x135e) + 0x96, 0x13, 0x00, 0x00, // Offset 5014 (0x1396) + 0xc4, 0x13, 0x00, 0x00, // Offset 5060 (0x13c4) + 0xf8, 0x13, 0x00, 0x00, // Offset 5112 (0x13f8) + 0x25, 0x14, 0x00, 0x00, // Offset 5157 (0x1425) + 0x50, 0x14, 0x00, 0x00, // Offset 5200 (0x1450) + 0x7a, 0x14, 0x00, 0x00, // Offset 5242 (0x147a) + 0xa7, 0x14, 0x00, 0x00, // Offset 5287 (0x14a7) + 0xd3, 0x14, 0x00, 0x00, // Offset 5331 (0x14d3) + 0x00, 0x15, 0x00, 0x00, // Offset 5376 (0x1500) + 0x2a, 0x15, 0x00, 0x00, // Offset 5418 (0x152a) + 0x4e, 0x15, 0x00, 0x00, // Offset 5454 (0x154e) + 0x6f, 0x15, 0x00, 0x00, // Offset 5487 (0x156f) + 0x95, 0x15, 0x00, 0x00, // Offset 5525 (0x1595) + 0xc0, 0x15, 0x00, 0x00, // Offset 5568 (0x15c0) + 0xe6, 0x15, 0x00, 0x00, // Offset 5606 (0x15e6) + 0x0f, 0x16, 0x00, 0x00, // Offset 5647 (0x160f) + 0x38, 0x16, 0x00, 0x00, // Offset 5688 (0x1638) + 0x59, 0x16, 0x00, 0x00, // Offset 5721 (0x1659) + 0x79, 0x16, 0x00, 0x00, // Offset 5753 (0x1679) + 0xa1, 0x16, 0x00, 0x00, // Offset 5793 (0x16a1) + 0xcf, 0x16, 0x00, 0x00, // Offset 5839 (0x16cf) + 0xfd, 0x16, 0x00, 0x00, // Offset 5885 (0x16fd) + 0x28, 0x17, 0x00, 0x00, // Offset 5928 (0x1728) + 0x4f, 0x17, 0x00, 0x00, // Offset 5967 (0x174f) + 0x7b, 0x17, 0x00, 0x00, // Offset 6011 (0x177b) + + // + // Block 3 Data: Codepoints 0xac00 - 0xac7f + // + 40, 18, 240, 241, 88, 65, 193, 65, 193, 65, 178, 65, + 177, 81, 177, 81, 162, 84, 98, 97, 145, 113, 130, 113, + 114, 129, 82, 161, 81, 177, 240, 33, 240, 33, 240, 33, + 240, 33, 240, 128, 39, 18, 240, 56, 65, 193, 65, 193, + 65, 178, 65, 162, 81, 161, 100, 82, 113, 114, 129, 83, + 145, 81, 177, 240, 171, 240, 33, 240, 33, 240, 33, 240, + 33, 240, 33, 240, 33, 240, 128, 39, 18, 240, 56, 65, + 193, 65, 178, 65, 178, 65, 162, 81, 161, 100, 82, 113, + 114, 129, 83, 145, 81, 177, 240, 150, 21, 177, 81, 177, + 81, 177, 81, 177, 81, 177, 81, 240, 240, 176, 42, 18, + 240, 56, 65, 193, 65, 178, 65, 178, 65, 162, 81, 161, + 100, 82, 113, 114, 129, 83, 145, 81, 177, 240, 150, 65, + 193, 65, 193, 50, 193, 51, 177, 34, 18, 161, 18, 50, + 145, 17, 240, 192, 39, 19, 240, 240, 33, 104, 65, 209, + 65, 194, 65, 194, 65, 178, 81, 178, 84, 114, 97, 131, + 113, 114, 145, 83, 161, 240, 49, 129, 145, 129, 240, 49, + 240, 49, 240, 60, 240, 240, 192, 42, 18, 240, 56, 65, + 193, 65, 178, 65, 178, 65, 162, 81, 161, 100, 82, 113, + 114, 129, 83, 145, 81, 177, 240, 145, 102, 81, 162, 81, + 161, 97, 146, 97, 132, 81, 114, 34, 70, 17, 81, 240, + 96, 41, 19, 209, 104, 65, 209, 65, 194, 65, 194, 65, + 178, 84, 114, 97, 146, 113, 115, 129, 83, 161, 240, 177, + 101, 113, 240, 49, 72, 97, 101, 113, 82, 50, 97, 81, + 81, 104, 50, 213, 240, 144, 38, 18, 240, 56, 65, 193, + 65, 193, 65, 178, 65, 162, 81, 161, 100, 82, 113, 114, + 129, 83, 145, 81, 177, 240, 171, 113, 240, 33, 240, 33, + 240, 33, 240, 33, 240, 43, 240, 128, 37, 19, 240, 88, + 65, 209, 65, 194, 65, 194, 65, 178, 84, 114, 97, 146, + 113, 115, 129, 83, 161, 240, 203, 240, 49, 240, 49, 139, + 129, 240, 49, 240, 49, 240, 59, 240, 144, 39, 19, 209, + 104, 65, 209, 65, 194, 65, 194, 65, 178, 84, 114, 97, + 146, 113, 114, 145, 83, 161, 240, 188, 193, 81, 193, 81, + 193, 81, 118, 81, 113, 161, 113, 161, 118, 81, 240, 144, + 46, 19, 209, 104, 65, 209, 65, 194, 65, 194, 65, 178, + 84, 114, 97, 146, 113, 114, 145, 83, 161, 240, 182, 21, + 193, 17, 49, 193, 17, 49, 193, 17, 49, 118, 17, 49, + 113, 97, 49, 113, 97, 49, 118, 21, 240, 144, 45, 19, + 209, 104, 65, 209, 65, 194, 65, 194, 65, 178, 84, 114, + 97, 146, 113, 115, 129, 83, 161, 240, 182, 17, 49, 193, + 17, 49, 193, 17, 49, 193, 21, 118, 17, 49, 113, 97, + 49, 113, 97, 49, 124, 240, 144, 43, 19, 209, 104, 65, + 209, 65, 194, 65, 194, 65, 178, 84, 114, 97, 146, 113, + 115, 129, 83, 161, 240, 182, 65, 209, 65, 209, 65, 209, + 65, 134, 51, 113, 129, 17, 113, 113, 49, 102, 18, 65, + 240, 112, 41, 19, 209, 104, 65, 209, 65, 194, 65, 194, + 65, 178, 84, 114, 97, 146, 113, 115, 129, 83, 161, 240, + 182, 21, 193, 17, 240, 17, 17, 240, 17, 17, 182, 21, + 113, 97, 177, 97, 189, 240, 128, 44, 19, 209, 104, 65, + 209, 65, 194, 65, 194, 65, 178, 84, 114, 97, 146, 113, + 115, 129, 83, 161, 240, 240, 246, 23, 161, 33, 33, 193, + 33, 33, 118, 33, 33, 113, 113, 33, 113, 113, 33, 118, + 23, 240, 112, 42, 19, 209, 104, 65, 209, 65, 194, 65, + 194, 65, 178, 84, 114, 97, 146, 113, 115, 129, 83, 161, + 240, 182, 21, 193, 240, 56, 102, 36, 113, 97, 65, 97, + 97, 65, 97, 97, 65, 102, 36, 240, 144, 38, 18, 240, + 56, 65, 193, 65, 193, 65, 178, 65, 162, 81, 161, 100, + 82, 113, 114, 129, 83, 145, 81, 177, 240, 171, 113, 145, + 113, 145, 113, 145, 113, 145, 113, 145, 123, 240, 128, 37, + 19, 209, 104, 65, 209, 65, 194, 65, 194, 65, 178, 84, + 114, 97, 146, 113, 115, 129, 83, 161, 0, 5, 97, 145, + 129, 145, 139, 129, 145, 129, 145, 129, 145, 139, 240, 144, + 47, 19, 209, 104, 65, 209, 65, 194, 65, 194, 65, 178, + 84, 114, 97, 146, 113, 115, 129, 83, 161, 240, 240, 241, + 65, 65, 129, 65, 65, 134, 65, 129, 65, 51, 113, 65, + 34, 18, 97, 65, 18, 50, 86, 17, 81, 240, 112, 38, + 18, 240, 241, 88, 65, 193, 65, 178, 65, 178, 65, 162, + 84, 113, 97, 146, 97, 115, 113, 83, 145, 81, 177, 194, + 240, 18, 244, 210, 34, 178, 66, 115, 116, 65, 193, 240, + 96, 44, 18, 240, 56, 65, 193, 65, 193, 65, 178, 65, + 162, 84, 113, 97, 130, 113, 114, 129, 83, 145, 81, 177, + 240, 193, 97, 161, 97, 161, 97, 147, 67, 114, 17, 50, + 17, 98, 52, 50, 50, 82, 81, 240, 96, 38, 18, 193, + 88, 65, 193, 65, 193, 65, 178, 65, 162, 81, 161, 100, + 82, 113, 114, 129, 83, 145, 81, 177, 240, 198, 178, 82, + 129, 145, 113, 145, 113, 145, 130, 82, 166, 240, 176, 37, + 19, 240, 88, 65, 209, 65, 194, 65, 194, 65, 178, 84, + 114, 97, 146, 113, 115, 129, 83, 161, 240, 49, 240, 218, + 240, 34, 240, 18, 242, 227, 20, 132, 99, 240, 240, 176, + 34, 19, 209, 104, 65, 209, 65, 194, 65, 194, 65, 178, + 84, 114, 97, 146, 113, 115, 129, 83, 161, 240, 246, 240, + 235, 240, 34, 243, 227, 202, 115, 116, 240, 112, 38, 18, + 240, 56, 65, 193, 65, 178, 65, 178, 65, 162, 81, 161, + 100, 82, 113, 114, 129, 83, 145, 81, 177, 240, 171, 240, + 33, 240, 33, 123, 240, 33, 240, 33, 240, 33, 240, 128, + 37, 19, 209, 104, 65, 209, 65, 194, 65, 194, 65, 178, + 84, 114, 97, 146, 113, 115, 129, 83, 161, 240, 203, 129, + 240, 49, 240, 49, 240, 59, 129, 240, 49, 240, 59, 240, + 144, 38, 18, 240, 56, 65, 193, 65, 193, 65, 178, 65, + 162, 84, 113, 97, 130, 113, 114, 129, 83, 145, 81, 177, + 240, 156, 145, 81, 177, 81, 177, 81, 177, 81, 177, 81, + 141, 240, 112, 35, 19, 209, 104, 65, 209, 65, 194, 65, + 194, 65, 178, 84, 114, 97, 146, 113, 115, 129, 83, 161, + 240, 246, 240, 236, 180, 210, 66, 177, 97, 178, 66, 212, + 240, 192, 52, 17, 240, 193, 49, 54, 49, 49, 130, 33, + 49, 129, 49, 49, 129, 49, 49, 129, 49, 49, 114, 49, + 49, 113, 69, 97, 81, 49, 82, 81, 49, 66, 97, 49, + 50, 113, 49, 34, 129, 49, 193, 49, 193, 49, 193, 49, + 193, 49, 240, 17, 240, 64, 46, 17, 225, 193, 49, 55, + 33, 49, 130, 33, 49, 129, 49, 49, 129, 53, 114, 49, + 49, 98, 65, 49, 82, 81, 49, 51, 97, 49, 34, 129, + 49, 240, 124, 240, 17, 240, 17, 240, 17, 240, 17, 240, + 17, 240, 240, 96, 46, 17, 240, 55, 33, 49, 130, 33, + 49, 129, 49, 49, 114, 49, 49, 114, 53, 98, 65, 49, + 82, 81, 49, 51, 97, 49, 34, 129, 49, 193, 49, 240, + 124, 161, 81, 161, 81, 161, 81, 161, 81, 161, 81, 240, + 240, 96, 51, 18, 240, 71, 33, 49, 146, 33, 49, 145, + 49, 49, 130, 49, 49, 130, 53, 114, 65, 49, 98, 81, + 49, 67, 97, 49, 50, 129, 49, 209, 49, 240, 134, 65, + 193, 65, 193, 50, 193, 49, 17, 177, 34, 18, 161, 18, + 50, 145, 17, 240, 176, 49, 17, 240, 193, 49, 39, 49, + 49, 129, 49, 49, 129, 49, 49, 114, 49, 49, 113, 69, + 98, 65, 49, 82, 81, 49, 66, 97, 49, 35, 113, 49, + 33, 145, 49, 81, 97, 49, 81, 161, 81, 240, 17, 240, + 17, 240, 28, 240, 240, 96, 50, 17, 240, 55, 33, 33, + 146, 33, 33, 145, 49, 33, 130, 49, 33, 130, 52, 114, + 65, 33, 98, 81, 33, 67, 97, 33, 50, 129, 33, 209, + 33, 240, 113, 101, 81, 161, 81, 146, 81, 145, 97, 131, + 81, 113, 34, 70, 17, 65, 240, 64, 49, 17, 225, 55, + 33, 49, 130, 33, 49, 129, 49, 49, 114, 49, 49, 113, + 69, 98, 65, 49, 67, 81, 49, 35, 113, 49, 33, 145, + 49, 240, 97, 116, 81, 240, 17, 72, 65, 101, 81, 82, + 50, 65, 81, 81, 72, 50, 181, 240, 80, 46, 17, 240, + 55, 33, 49, 130, 33, 49, 129, 49, 49, 114, 49, 49, + 114, 53, 98, 65, 49, 82, 81, 49, 51, 97, 49, 34, + 129, 49, 193, 49, 240, 124, 81, 240, 17, 240, 17, 240, + 17, 240, 17, 240, 28, 240, 64, 45, 17, 225, 55, 33, + 49, 130, 33, 49, 129, 49, 49, 114, 49, 49, 113, 69, + 98, 65, 49, 67, 81, 49, 35, 113, 49, 33, 145, 49, + 240, 124, 240, 17, 240, 17, 240, 17, 92, 81, 240, 17, + 240, 28, 240, 64, 47, 17, 225, 55, 33, 49, 130, 33, + 49, 129, 49, 49, 114, 49, 49, 113, 69, 98, 65, 49, + 67, 81, 49, 35, 113, 49, 33, 145, 49, 240, 124, 161, + 81, 161, 81, 86, 81, 81, 161, 81, 161, 81, 161, 87, + 65, 240, 64, 53, 16, 209, 55, 33, 33, 130, 33, 33, + 129, 49, 33, 114, 49, 33, 113, 68, 98, 65, 33, 67, + 81, 33, 35, 113, 33, 33, 145, 33, 240, 86, 21, 145, + 17, 49, 145, 17, 49, 70, 17, 49, 65, 97, 49, 65, + 97, 49, 65, 97, 49, 76, 240, 48, 54, 17, 225, 55, + 33, 49, 130, 33, 49, 129, 49, 49, 114, 49, 49, 113, + 69, 98, 65, 49, 67, 81, 49, 35, 113, 49, 33, 145, + 49, 240, 117, 33, 49, 145, 33, 49, 145, 33, 49, 145, + 37, 85, 33, 49, 81, 97, 49, 81, 97, 49, 86, 21, + 240, 64, 50, 18, 225, 71, 33, 49, 146, 33, 49, 145, + 49, 49, 130, 49, 49, 129, 69, 114, 65, 49, 83, 81, + 49, 51, 113, 49, 49, 145, 49, 240, 134, 65, 193, 65, + 193, 65, 193, 65, 118, 51, 97, 129, 17, 97, 113, 49, + 89, 65, 240, 80, 47, 18, 225, 71, 33, 49, 146, 33, + 49, 145, 49, 49, 130, 49, 49, 129, 69, 114, 65, 49, + 83, 81, 49, 51, 113, 49, 49, 145, 49, 240, 150, 21, + 177, 17, 241, 17, 241, 17, 166, 21, 97, 97, 161, 97, + 173, 240, 80, 52, 18, 225, 71, 33, 49, 146, 33, 49, + 145, 49, 49, 130, 49, 49, 129, 69, 114, 65, 49, 83, + 81, 49, 51, 113, 49, 49, 145, 49, 240, 240, 182, 23, + 145, 33, 33, 177, 33, 33, 102, 33, 33, 97, 113, 33, + 97, 113, 33, 102, 23, 240, 80, 50, 17, 225, 55, 33, + 49, 130, 33, 49, 129, 49, 49, 114, 49, 49, 113, 69, + 98, 65, 49, 67, 81, 49, 35, 113, 49, 33, 145, 49, + 240, 102, 36, 161, 240, 24, 70, 36, 81, 97, 65, 65, + 97, 65, 65, 97, 65, 70, 36, 240, 80, 46, 17, 225, + 55, 33, 49, 130, 33, 49, 129, 49, 49, 129, 49, 49, + 114, 53, 98, 65, 49, 82, 81, 49, 51, 97, 49, 34, + 129, 49, 193, 49, 240, 124, 81, 161, 81, 161, 81, 161, + 81, 161, 81, 161, 92, 240, 64, 45, 17, 225, 55, 33, + 49, 130, 33, 49, 129, 49, 49, 129, 49, 49, 114, 53, + 98, 65, 49, 82, 81, 49, 51, 97, 49, 34, 129, 49, + 240, 240, 145, 161, 81, 161, 92, 81, 161, 81, 161, 81, + 161, 92, 240, 64, 57, 18, 240, 71, 33, 49, 146, 33, + 49, 145, 49, 49, 130, 49, 49, 130, 53, 114, 65, 49, + 98, 81, 49, 67, 97, 49, 50, 129, 49, 209, 49, 240, + 129, 65, 65, 113, 65, 65, 118, 65, 113, 65, 49, 17, + 97, 65, 34, 18, 81, 65, 18, 50, 70, 17, 81, 240, + 80, 48, 18, 225, 209, 49, 71, 33, 49, 146, 33, 49, + 145, 49, 49, 145, 49, 49, 130, 53, 114, 65, 49, 98, + 81, 49, 82, 97, 49, 51, 113, 49, 49, 113, 81, 177, + 240, 19, 226, 18, 194, 50, 147, 98, 98, 147, 240, 240, + 128, 53, 18, 240, 71, 33, 49, 146, 33, 49, 145, 49, + 49, 145, 49, 49, 130, 53, 114, 65, 49, 98, 81, 49, + 67, 97, 49, 50, 129, 49, 209, 49, 240, 177, 97, 161, + 97, 161, 82, 147, 65, 17, 114, 18, 34, 18, 82, 52, + 50, 50, 82, 81, 240, 80, 46, 17, 225, 55, 33, 49, + 130, 33, 49, 129, 49, 49, 129, 49, 49, 114, 53, 98, + 65, 49, 82, 81, 49, 51, 97, 49, 34, 129, 49, 193, + 49, 240, 166, 146, 98, 97, 161, 81, 161, 81, 161, 98, + 98, 150, 240, 112, 44, 18, 240, 71, 33, 49, 146, 33, + 49, 145, 49, 49, 130, 49, 49, 130, 53, 114, 65, 49, + 98, 81, 49, 67, 97, 49, 50, 129, 49, 209, 49, 240, + 171, 240, 17, 242, 226, 211, 20, 116, 114, 240, 240, 128, + 43, 18, 225, 71, 33, 49, 146, 33, 49, 145, 49, 49, + 130, 49, 49, 129, 69, 114, 65, 49, 83, 81, 49, 51, + 113, 49, 49, 145, 49, 240, 198, 240, 203, 240, 18, 226, + 212, 180, 52, 83, 146, 240, 80, 46, 17, 240, 55, 33, + 49, 130, 33, 49, 129, 49, 49, 114, 49, 49, 114, 53, + 98, 65, 49, 82, 81, 49, 51, 97, 49, 34, 129, 49, + 193, 49, 240, 124, 240, 17, 240, 17, 107, 240, 17, 240, + 17, 240, 17, 240, 64, 45, 17, 225, 55, 33, 49, 130, + 33, 49, 129, 49, 49, 114, 49, 49, 113, 69, 98, 65, + 49, 67, 81, 49, 35, 113, 49, 33, 145, 49, 240, 124, + 81, 240, 17, 240, 17, 240, 28, 81, 240, 17, 240, 28, + 240, 64, 46, 18, 240, 71, 33, 49, 146, 33, 49, 145, + 49, 49, 130, 49, 49, 130, 53, 114, 65, 49, 98, 81, + 49, 67, 97, 49, 50, 129, 49, 209, 49, 240, 156, 145, + 81, 177, 81, 177, 81, 177, 81, 177, 81, 141, 240, 80, + 43, 17, 225, 55, 33, 49, 130, 33, 49, 129, 49, 49, + 114, 49, 49, 113, 69, 98, 65, 49, 67, 81, 49, 35, + 113, 49, 33, 145, 49, 240, 166, 240, 172, 134, 162, 66, + 145, 97, 146, 66, 180, 240, 128, 40, 18, 240, 241, 88, + 65, 193, 65, 193, 65, 178, 68, 129, 81, 177, 81, 162, + 81, 146, 97, 145, 113, 130, 116, 66, 129, 82, 161, 81, + 177, 240, 33, 240, 33, 240, 33, 240, 33, 240, 128, 39, + 18, 240, 56, 65, 193, 65, 193, 65, 178, 68, 114, 81, + 161, 97, 130, 113, 114, 132, 35, 145, 81, 177, 240, 171, + 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, + 240, 128, 39, 18, 240, 56, 65, 193, 65, 178, 65, 178, + 68, 114, 81, 161, 97, 130, 116, 66, 129, 83, 145, 81, + 177, 240, 150, 21, 177, 81, 177, 81, 177, 81, 177, 81, + 177, 81, 240, 240, 176, 42, 18, 240, 56, 65, 193, 65, + 178, 65, 178, 68, 114, 81, 161, 97, 130, 116, 66, 129, + 83, 145, 81, 177, 240, 150, 65, 193, 65, 193, 50, 193, + 51, 177, 34, 18, 161, 18, 50, 145, 17, 240, 192, 39, + 19, 240, 240, 33, 104, 65, 209, 65, 194, 68, 146, 65, + 178, 81, 178, 81, 162, 97, 131, 116, 66, 145, 83, 161, + 240, 49, 129, 145, 129, 240, 49, 240, 49, 240, 60, 240, + 240, 192, 41, 18, 240, 56, 65, 193, 65, 178, 65, 178, + 68, 114, 81, 161, 97, 130, 116, 66, 129, 83, 145, 81, + 177, 240, 145, 102, 81, 162, 81, 161, 97, 146, 97, 132, + 81, 114, 34, 69, 33, 240, 192, 41, 19, 240, 88, 65, + 209, 65, 194, 65, 194, 68, 130, 81, 162, 97, 146, 116, + 67, 129, 83, 161, 240, 177, 101, 113, 240, 49, 72, 97, + 101, 113, 82, 50, 97, 81, 81, 104, 50, 213, 240, 144, + 38, 18, 240, 56, 65, 193, 65, 178, 65, 178, 68, 114, + 81, 161, 97, 130, 116, 66, 129, 83, 145, 81, 177, 240, + 171, 113, 240, 33, 240, 33, 240, 33, 240, 33, 240, 43, + 240, 128, 37, 19, 209, 104, 65, 209, 65, 194, 65, 194, + 68, 130, 81, 162, 97, 146, 116, 67, 129, 83, 161, 240, + 203, 240, 49, 240, 49, 139, 129, 240, 49, 240, 49, 240, + 59, 240, 144, 39, 19, 240, 88, 65, 209, 65, 194, 65, + 194, 68, 130, 81, 162, 97, 146, 116, 67, 129, 83, 161, + 240, 188, 193, 81, 193, 81, 118, 81, 113, 161, 113, 161, + 113, 161, 119, 65, 240, 144, 46, 19, 240, 88, 65, 209, + 65, 194, 65, 194, 68, 130, 81, 162, 97, 146, 116, 67, + 129, 83, 161, 240, 182, 21, 193, 17, 49, 193, 17, 49, + 193, 17, 49, 118, 17, 49, 113, 97, 49, 113, 97, 49, + 118, 21, 240, 144, 45, 19, 240, 88, 65, 209, 65, 194, + 65, 194, 68, 130, 81, 162, 97, 146, 116, 67, 129, 83, + 161, 240, 182, 17, 49, 193, 17, 49, 193, 17, 49, 193, + 21, 118, 17, 49, 113, 97, 49, 113, 97, 49, 124, 240, + 144, 43, 19, 240, 88, 65, 209, 65, 194, 65, 194, 68, + 130, 81, 162, 97, 146, 116, 67, 129, 83, 161, 240, 182, + 65, 209, 65, 209, 65, 209, 65, 134, 51, 113, 129, 17, + 113, 113, 49, 102, 18, 65, 240, 112, 41, 19, 240, 88, + 65, 209, 65, 194, 65, 194, 68, 130, 81, 162, 97, 146, + 116, 67, 129, 83, 161, 240, 182, 21, 193, 17, 240, 17, + 17, 240, 17, 17, 182, 21, 113, 97, 177, 97, 189, 240, + 128, 44, 19, 240, 88, 65, 209, 65, 194, 65, 194, 68, + 130, 81, 162, 97, 146, 116, 67, 129, 83, 161, 240, 240, + 246, 23, 161, 33, 33, 193, 33, 33, 118, 33, 33, 113, + 113, 33, 113, 113, 33, 118, 23, 240, 112, 42, 19, 240, + 88, 65, 209, 65, 194, 65, 194, 68, 130, 81, 162, 97, + 146, 116, 67, 129, 83, 161, 240, 182, 21, 193, 240, 56, + 102, 36, 113, 97, 65, 97, 97, 65, 97, 97, 65, 102, + 36, 240, 144, 38, 18, 240, 56, 65, 193, 65, 193, 65, + 178, 68, 114, 81, 161, 97, 130, 116, 66, 129, 83, 145, + 81, 177, 240, 171, 113, 145, 113, 145, 113, 145, 113, 145, + 113, 145, 123, 240, 128, 38, 18, 240, 56, 65, 193, 65, + 178, 65, 178, 68, 114, 81, 161, 97, 130, 116, 66, 129, + 83, 145, 81, 177, 240, 161, 145, 113, 145, 123, 113, 145, + 113, 145, 113, 145, 123, 240, 128, 47, 18, 240, 56, 65, + 193, 65, 178, 65, 178, 68, 114, 81, 161, 97, 130, 116, + 66, 129, 83, 145, 81, 177, 240, 145, 65, 65, 113, 65, + 65, 118, 65, 113, 65, 51, 97, 65, 34, 18, 81, 65, + 18, 50, 70, 17, 240, 192, 38, 18, 240, 241, 88, 65, + 193, 65, 178, 68, 130, 65, 162, 81, 161, 97, 146, 100, + 67, 113, 83, 145, 81, 177, 194, 240, 18, 244, 210, 34, + 178, 66, 115, 116, 65, 193, 240, 96, 44, 18, 240, 56, + 65, 193, 65, 178, 65, 178, 68, 114, 81, 161, 97, 130, + 116, 66, 129, 83, 145, 81, 177, 240, 193, 97, 161, 97, + 161, 97, 147, 67, 114, 18, 34, 18, 82, 52, 50, 49, + 97, 97, 240, 96, 38, 18, 193, 88, 65, 193, 65, 193, + 65, 178, 68, 114, 81, 161, 97, 130, 116, 66, 129, 83, + 145, 81, 177, 240, 198, 178, 82, 129, 145, 113, 145, 113, + 145, 130, 82, 166, 240, 176, 36, 18, 240, 56, 65, 193, + 65, 178, 65, 178, 68, 114, 81, 161, 97, 130, 116, 66, + 129, 83, 145, 81, 177, 240, 186, 240, 18, 242, 226, 211, + 20, 116, 99, 240, 240, 144, 35, 19, 240, 88, 65, 209, + 65, 194, 65, 194, 68, 130, 81, 162, 97, 146, 116, 67, + 129, 83, 161, 240, 246, 240, 235, 240, 34, 243, 212, 196, + 22, 99, 131, 240, 112, 38, 18, 240, 56, 65, 193, 65, + 178, 65, 178, 68, 114, 81, 161, 97, 130, 116, 66, 129, + 83, 145, 81, 177, 240, 171, 240, 33, 240, 33, 123, 240, + 33, 240, 33, 240, 33, 240, 128, 37, 19, 240, 88, 65, + 209, 65, 194, 65, 194, 68, 130, 81, 162, 97, 146, 116, + 67, 129, 83, 161, 240, 203, 129, 240, 49, 240, 49, 240, + 59, 129, 240, 49, 240, 59, 240, 144, 38, 18, 240, 56, + 65, 193, 65, 178, 65, 178, 68, 114, 81, 161, 97, 130, + 116, 66, 129, 83, 145, 81, 177, 240, 156, 145, 81, 177, + 81, 177, 81, 177, 81, 177, 81, 141, 240, 112, 35, 19, + 240, 88, 65, 209, 65, 194, 65, 194, 68, 130, 81, 162, + 97, 146, 116, 67, 129, 83, 161, 240, 246, 240, 236, 166, + 194, 66, 177, 97, 178, 66, 212, 240, 192, 51, 17, 240, + 193, 49, 54, 49, 49, 130, 33, 49, 129, 49, 49, 129, + 49, 49, 129, 53, 114, 49, 49, 113, 65, 49, 97, 81, + 49, 82, 81, 49, 66, 101, 50, 113, 49, 34, 129, 49, + 193, 49, 193, 49, 193, 49, 193, 49, 240, 17, 240, 64, + 45, 17, 240, 55, 33, 49, 130, 33, 49, 129, 49, 49, + 114, 53, 114, 49, 49, 98, 65, 49, 82, 85, 51, 97, + 49, 34, 129, 49, 193, 49, 240, 124, 240, 17, 240, 17, + 240, 17, 240, 17, 240, 17, 240, 240, 96, 45, 17, 240, + 55, 33, 49, 130, 33, 49, 129, 49, 49, 114, 53, 114, + 49, 49, 98, 65, 49, 82, 85, 51, 97, 49, 34, 129, + 49, 193, 49, 240, 124, 161, 81, 161, 81, 161, 81, 161, + 81, 161, 81, 240, 240, 96, 50, 18, 240, 71, 33, 49, + 146, 33, 49, 145, 49, 49, 130, 53, 130, 49, 49, 114, + 65, 49, 98, 85, 67, 97, 49, 50, 129, 49, 209, 49, + 240, 134, 65, 193, 65, 193, 50, 193, 49, 17, 177, 34, + 18, 161, 18, 50, 145, 17, 240, 176, 48, 17, 240, 193, + 49, 55, 33, 49, 130, 33, 49, 129, 49, 49, 129, 53, + 114, 49, 49, 98, 65, 49, 82, 81, 49, 66, 101, 35, + 113, 49, 33, 145, 49, 81, 97, 49, 81, 161, 81, 240, + 17, 240, 17, 240, 28, 240, 240, 96, 49, 17, 240, 55, + 33, 33, 146, 33, 33, 145, 49, 33, 130, 52, 130, 49, + 33, 114, 65, 33, 98, 84, 67, 97, 33, 50, 129, 33, + 209, 33, 240, 113, 101, 81, 161, 81, 146, 81, 145, 97, + 131, 81, 113, 34, 70, 17, 65, 240, 64, 48, 17, 225, + 39, 34, 49, 129, 34, 49, 129, 38, 114, 34, 49, 98, + 50, 49, 82, 66, 49, 66, 86, 35, 98, 49, 33, 130, + 49, 240, 97, 101, 81, 240, 17, 72, 65, 101, 81, 82, + 50, 65, 81, 81, 72, 50, 181, 240, 80, 45, 17, 240, + 55, 33, 49, 130, 33, 49, 129, 49, 49, 114, 53, 114, + 49, 49, 98, 65, 49, 82, 85, 51, 97, 49, 34, 129, + 49, 193, 49, 240, 124, 81, 240, 17, 240, 17, 240, 17, + 240, 17, 240, 28, 240, 64, 44, 17, 225, 55, 33, 49, + 130, 33, 49, 129, 53, 114, 49, 49, 113, 65, 49, 98, + 65, 49, 67, 85, 35, 113, 49, 33, 145, 49, 240, 124, + 240, 17, 240, 17, 240, 17, 92, 81, 240, 17, 240, 28, + 240, 64, 46, 17, 225, 55, 33, 49, 130, 33, 49, 129, + 53, 114, 49, 49, 113, 65, 49, 98, 65, 49, 67, 85, + 35, 113, 49, 33, 145, 49, 240, 124, 161, 81, 161, 81, + 86, 81, 81, 161, 81, 161, 81, 161, 87, 65, 240, 64, + 52, 16, 209, 55, 33, 33, 130, 33, 33, 129, 52, 114, + 49, 33, 113, 65, 33, 98, 65, 33, 67, 84, 35, 113, + 33, 33, 145, 33, 240, 86, 21, 145, 17, 49, 145, 17, + 49, 70, 17, 49, 65, 97, 49, 65, 97, 49, 65, 97, + 49, 76, 240, 48, 53, 17, 225, 55, 33, 49, 130, 33, + 49, 129, 53, 114, 49, 49, 113, 65, 49, 98, 65, 49, + 67, 85, 35, 113, 49, 33, 145, 49, 240, 117, 33, 49, + 145, 33, 49, 145, 33, 49, 145, 37, 85, 33, 49, 81, + 97, 49, 81, 97, 49, 86, 21, 240, 64, 49, 18, 225, + 71, 33, 49, 146, 33, 49, 145, 53, 130, 49, 49, 129, + 65, 49, 114, 65, 49, 83, 85, 51, 113, 49, 49, 145, + 49, 240, 134, 65, 193, 65, 193, 65, 193, 65, 118, 51, + 97, 129, 17, 97, 113, 49, 89, 65, 240, 80, 46, 18, + 225, 71, 33, 49, 146, 33, 49, 145, 53, 130, 49, 49, + 129, 65, 49, 114, 65, 49, 83, 85, 51, 113, 49, 49, + 145, 49, 240, 150, 21, 177, 17, 241, 17, 241, 17, 166, + 21, 97, 97, 161, 97, 173, 240, 80, 51, 18, 225, 71, + 33, 49, 146, 33, 49, 145, 53, 130, 49, 49, 129, 65, + 49, 114, 65, 49, 83, 85, 51, 113, 49, 49, 145, 49, + 240, 240, 182, 23, 145, 33, 33, 177, 33, 33, 102, 33, + 33, 97, 113, 33, 97, 113, 33, 102, 23, 240, 80, 49, + 17, 225, 55, 33, 49, 130, 33, 49, 130, 37, 129, 49, + 49, 114, 49, 49, 98, 65, 49, 67, 85, 50, 113, 49, + 33, 145, 49, 240, 102, 21, 161, 240, 24, 70, 36, 81, + 97, 65, 65, 97, 65, 65, 97, 65, 70, 36, 240, 80, + 45, 17, 240, 55, 33, 49, 130, 33, 49, 129, 49, 49, + 114, 53, 114, 49, 49, 98, 65, 49, 82, 85, 51, 97, + 49, 34, 129, 49, 193, 49, 240, 124, 81, 161, 81, 161, + 81, 161, 81, 161, 81, 161, 92, 240, 64, 45, 17, 240, + 55, 33, 49, 130, 33, 49, 129, 49, 49, 114, 53, 114, + 49, 49, 98, 65, 49, 82, 85, 51, 97, 49, 34, 129, + 49, 193, 49, 240, 113, 161, 81, 161, 92, 81, 161, 81, + 161, 81, 161, 92, 240, 64, 56, 18, 240, 71, 33, 49, + 146, 33, 49, 145, 49, 49, 130, 53, 130, 49, 49, 114, + 65, 49, 98, 85, 67, 97, 49, 50, 129, 49, 209, 49, + 240, 129, 65, 65, 113, 65, 65, 118, 65, 113, 65, 49, + 17, 97, 65, 34, 18, 81, 65, 18, 50, 70, 17, 81, + 240, 80, 46, 18, 240, 71, 33, 49, 146, 33, 49, 145, + 49, 49, 130, 53, 130, 49, 49, 114, 65, 49, 98, 85, + 67, 97, 49, 50, 129, 49, 209, 49, 240, 225, 240, 19, + 241, 18, 210, 34, 162, 83, 99, 131, 65, 240, 240, 48, + 52, 18, 240, 71, 33, 49, 146, 33, 49, 145, 49, 49, + 130, 53, 130, 49, 49, 114, 65, 49, 98, 85, 67, 97, + 49, 50, 129, 49, 209, 49, 240, 177, 97, 161, 97, 146, + 82, 145, 17, 65, 17, 114, 18, 34, 18, 67, 52, 50, + 49, 240, 240, 64, 45, 17, 240, 55, 33, 49, 130, 33, + 49, 129, 49, 49, 114, 53, 114, 49, 49, 98, 65, 49, + 82, 85, 51, 97, 49, 34, 129, 49, 193, 49, 240, 166, + 146, 98, 97, 161, 81, 161, 81, 161, 98, 98, 150, 240, + 112, 43, 18, 240, 71, 33, 49, 146, 33, 49, 145, 49, + 49, 130, 53, 130, 49, 49, 114, 65, 49, 98, 85, 67, + 97, 49, 50, 129, 49, 209, 49, 240, 171, 240, 17, 242, + 226, 211, 20, 116, 114, 240, 240, 128, 42, 18, 225, 71, + 33, 49, 146, 33, 49, 145, 53, 130, 49, 49, 129, 65, + 49, 114, 65, 49, 83, 85, 51, 113, 49, 49, 145, 49, + 240, 198, 240, 203, 240, 18, 226, 212, 180, 52, 83, 146, + 240, 80, 45, 17, 240, 55, 33, 49, 130, 33, 49, 129, + 49, 49, 114, 53, 114, 49, 49, 98, 65, 49, 82, 85, + 51, 97, 49, 34, 129, 49, 193, 49, 240, 124, 240, 17, + 240, 17, 107, 240, 17, 240, 17, 240, 17, 240, 64, 44, + 17, 225, 55, 33, 49, 130, 33, 49, 129, 53, 114, 49, + 49, 113, 65, 49, 98, 65, 49, 67, 85, 35, 113, 49, + 33, 145, 49, 240, 124, 81, 240, 17, 240, 17, 240, 28, + 81, 240, 17, 240, 28, 240, 64, 45, 18, 240, 71, 33, + 49, 146, 33, 49, 145, 49, 49, 130, 53, 130, 49, 49, + 114, 65, 49, 98, 85, 67, 97, 49, 50, 129, 49, 209, + 49, 240, 156, 145, 81, 177, 81, 177, 81, 177, 81, 177, + 81, 141, 240, 80, 42, 17, 225, 55, 33, 49, 130, 33, + 49, 129, 53, 114, 49, 49, 113, 65, 49, 98, 65, 49, + 67, 85, 35, 113, 49, 33, 145, 49, 240, 166, 240, 172, + 134, 162, 66, 145, 97, 146, 66, 180, 240, 128, 36, 16, + 240, 225, 40, 81, 145, 81, 145, 81, 130, 81, 129, 97, + 129, 97, 114, 37, 113, 113, 97, 129, 82, 129, 66, 145, + 34, 177, 33, 193, 241, 241, 241, 241, 240, 48, 33, 16, + 240, 225, 56, 65, 161, 65, 146, 65, 145, 81, 130, 21, + 114, 97, 98, 113, 82, 129, 51, 145, 34, 240, 43, 241, + 241, 241, 241, 241, 241, 240, 48, 38, 15, 248, 65, 145, + 65, 130, 65, 129, 81, 114, 81, 98, 37, 82, 113, 66, + 129, 35, 145, 33, 177, 240, 54, 21, 129, 81, 129, 81, + 129, 81, 129, 81, 129, 81, 240, 240, 32, 43, 17, 240, + 40, 65, 177, 65, 162, 65, 161, 81, 146, 81, 130, 37, + 114, 113, 98, 129, 67, 145, 65, 177, 240, 118, 65, 177, + 65, 177, 50, 177, 49, 17, 161, 34, 18, 145, 18, 50, + 129, 17, 240, 160, 38, 17, 240, 241, 72, 65, 177, 65, + 162, 65, 161, 81, 146, 21, 145, 97, 130, 97, 99, 113, + 82, 145, 51, 161, 97, 145, 97, 145, 97, 240, 17, 240, + 17, 240, 28, 240, 240, 96, 41, 17, 240, 40, 65, 177, + 65, 162, 65, 161, 81, 146, 81, 130, 37, 114, 113, 98, + 129, 67, 145, 65, 177, 240, 113, 102, 65, 161, 81, 146, + 81, 145, 97, 131, 81, 98, 34, 72, 81, 240, 64, 41, + 17, 240, 56, 65, 177, 65, 162, 65, 161, 81, 146, 81, + 130, 37, 114, 113, 83, 129, 51, 161, 240, 113, 101, 81, + 240, 17, 72, 65, 101, 81, 82, 50, 65, 81, 81, 72, + 50, 181, 240, 80, 33, 16, 240, 40, 65, 161, 65, 146, + 65, 145, 81, 130, 81, 114, 37, 98, 113, 82, 129, 51, + 145, 34, 177, 240, 107, 81, 241, 241, 241, 241, 251, 240, + 48, 32, 16, 209, 56, 65, 161, 65, 146, 65, 145, 81, + 130, 21, 114, 97, 98, 113, 67, 129, 35, 161, 240, 107, + 241, 241, 91, 81, 241, 241, 251, 240, 48, 40, 16, 240, + 40, 65, 161, 65, 146, 65, 145, 81, 130, 81, 114, 37, + 98, 113, 67, 129, 35, 161, 240, 86, 21, 145, 81, 145, + 81, 70, 81, 65, 161, 65, 161, 65, 161, 71, 65, 240, + 48, 46, 16, 209, 56, 65, 161, 65, 146, 65, 145, 81, + 130, 21, 114, 97, 83, 113, 66, 145, 35, 161, 240, 86, + 21, 145, 17, 49, 145, 17, 49, 145, 17, 49, 70, 17, + 49, 65, 97, 49, 65, 97, 49, 70, 21, 240, 48, 46, + 16, 240, 40, 65, 161, 65, 146, 65, 145, 81, 130, 81, + 114, 37, 98, 113, 67, 129, 35, 161, 240, 85, 33, 49, + 129, 33, 49, 129, 33, 49, 129, 37, 69, 33, 49, 65, + 97, 49, 65, 97, 49, 70, 21, 240, 48, 43, 18, 240, + 72, 65, 193, 65, 178, 65, 177, 81, 162, 81, 146, 37, + 130, 113, 99, 129, 67, 161, 240, 150, 65, 193, 65, 193, + 65, 193, 65, 118, 51, 97, 129, 17, 97, 113, 49, 86, + 18, 65, 240, 80, 39, 17, 240, 56, 65, 177, 65, 162, + 65, 161, 81, 146, 81, 130, 37, 114, 113, 83, 129, 51, + 161, 240, 118, 21, 161, 17, 225, 17, 225, 17, 150, 21, + 81, 97, 145, 97, 157, 240, 64, 44, 17, 240, 56, 65, + 177, 65, 162, 65, 161, 81, 146, 81, 130, 37, 114, 113, + 83, 129, 51, 161, 240, 240, 134, 23, 129, 33, 33, 161, + 33, 33, 86, 33, 33, 81, 113, 33, 81, 113, 33, 86, + 23, 240, 64, 42, 17, 240, 56, 65, 177, 65, 162, 65, + 161, 81, 146, 81, 130, 37, 114, 113, 83, 129, 51, 161, + 240, 118, 21, 161, 240, 24, 70, 36, 81, 97, 65, 65, + 97, 65, 65, 97, 65, 70, 36, 240, 80, + 0, 0, 0, // Padding + +}; + +tFont *g_psFontWCjktest20pt = (tFont *)g_pui8Cjktest20pt; diff --git a/third_party/fonts/ofl/fonts/fonthandwriting14.c b/third_party/fonts/ofl/fonts/fonthandwriting14.c new file mode 100644 index 0000000..29ddb31 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthandwriting14.c @@ -0,0 +1,500 @@ +//***************************************************************************** +// +// fonthandwriting14.c - Font definition for the 14pt Handwriting font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://helloalan.com/projects/breip/ +// +// This Font Software is Copyright (c) 2008, Alan Hussey and Adam Breipohl. +// All Rights Reserved. +// +// "Breip" is a Reserved Font Name for this Font Software. +// +// This Font Software is licensed under the SIL Open Font License, +// Version 1.0. No modification of the license is permitted, only verbatim +// copy is allowed. This license is copied below, and is also available with +// a FAQ at: http://scripts.sil.org/OFL +// ------------------------------------------------------------------------ +// +// SIL OPEN FONT LICENSE +// +// Version 1.0 - 22 November 2005 +// PREAMBLE +// +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of cooperative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide an open +// framework in which fonts may be shared and improved in partnership with +// others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and sold with any software provided that the font names of +// derivative works are changed. The fonts and derivatives, however, cannot +// be released under any other type of license. +// +// DEFINITIONS +// +// "Font Software" refers to any and all of the following: +// +// * font files +// * data files +// * source code +// * build scripts +// * documentation +// +// "Reserved Font Name" refers to the Font Software name as seen by users +// and any other names as specified after the copyright statement. +// +// "Standard Version" refers to the collection of Font Software components +// as distributed by the Copyright Holder. +// +// "Modified Version" refers to any derivative font software made by adding +// to, deleting, or substituting -- in part or in whole -- any of the +// components of the Standard Version, by changing formats or by porting +// the Font Software to a new environment. +// +// "Author" refers to any designer, engineer, programmer, technical writer +// or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, in +// Standard or Modified Versions, may be sold by itself. +// +// 2) Standard or Modified Versions of the Font Software may be bundled, +// redistributed and sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or in +// the appropriate machine-readable metadata fields within text or binary +// files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s), in part or in whole, unless explicit written permission is +// granted by the Copyright Holder. This restriction applies to all +// references stored in the Font Software, such as the font menu name and +// other font description fields, which are used to differentiate the font +// from others. +// +// 4) The name(s) of the Copyright Holder or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any Modified +// Version, except to acknowledge the contribution(s) of the Copyright Holder +// and the Author(s) or with their explicit written permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, must +// be distributed using this license, and may not be distributed under any +// other license. +// +// TERMINATION +// +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER +// DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: handwriting +// Size: 14 point +// Bold: no +// Italic: no +// Memory usage: 3420 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 14 point Handwriting font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Handwriting14Data[3217] = +{ + 5, 6, 0, 12, 96, 12, 4, 161, 33, 49, 49, 49, + 49, 49, 161, 240, 128, 8, 3, 49, 33, 34, 240, 240, + 160, 24, 10, 240, 241, 81, 65, 65, 56, 49, 65, 65, + 65, 65, 65, 56, 49, 65, 17, 33, 81, 145, 240, 240, + 192, 25, 8, 240, 81, 65, 19, 65, 17, 66, 17, 49, + 17, 17, 70, 49, 17, 17, 49, 34, 52, 49, 49, 240, + 240, 192, 26, 10, 240, 177, 49, 33, 17, 82, 33, 129, + 145, 129, 145, 34, 65, 33, 97, 33, 33, 49, 33, 17, + 129, 240, 240, 208, 27, 9, 240, 66, 97, 33, 81, 33, + 81, 33, 98, 129, 49, 66, 33, 49, 33, 17, 49, 50, + 49, 49, 17, 51, 240, 240, 160, 7, 2, 65, 17, 17, + 240, 160, 15, 5, 209, 49, 49, 65, 65, 49, 65, 65, + 81, 65, 82, 240, 96, 14, 4, 129, 65, 49, 49, 65, + 49, 49, 49, 33, 49, 240, 112, 8, 3, 113, 18, 33, + 240, 240, 112, 15, 6, 240, 65, 81, 97, 81, 53, 49, + 81, 81, 81, 240, 240, 48, 7, 2, 240, 113, 17, 17, + 112, 8, 6, 240, 240, 197, 0, 6, 112, 5, 2, 240, + 145, 144, 15, 7, 240, 177, 81, 81, 97, 81, 97, 81, + 81, 97, 240, 240, 176, 25, 11, 240, 146, 129, 17, 113, + 161, 113, 33, 129, 17, 129, 17, 129, 17, 113, 33, 113, + 49, 66, 84, 0, 6, 16, 13, 2, 65, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 176, 20, 11, 240, 147, 98, + 33, 145, 161, 161, 161, 161, 66, 65, 49, 97, 33, 130, + 0, 7, 64, 18, 9, 240, 70, 33, 81, 129, 113, 113, + 146, 130, 129, 129, 113, 83, 240, 240, 144, 21, 11, 240, + 194, 131, 113, 33, 97, 49, 81, 65, 65, 81, 18, 39, + 145, 161, 161, 161, 0, 6, 19, 6, 212, 17, 81, 81, + 81, 18, 34, 33, 17, 49, 81, 81, 65, 65, 65, 240, + 112, 19, 8, 240, 81, 113, 97, 97, 113, 97, 97, 113, + 113, 66, 17, 81, 37, 240, 240, 64, 15, 7, 230, 97, + 97, 81, 97, 97, 81, 97, 81, 97, 240, 240, 144, 23, + 6, 161, 81, 49, 17, 33, 33, 17, 33, 33, 33, 50, + 81, 65, 17, 33, 49, 17, 33, 50, 240, 192, 23, 9, + 194, 82, 50, 17, 82, 17, 65, 17, 33, 49, 17, 51, + 33, 129, 129, 129, 129, 129, 0, 5, 96, 6, 3, 209, + 209, 240, 128, 7, 3, 240, 97, 193, 33, 208, 15, 8, + 240, 240, 113, 82, 66, 82, 129, 130, 129, 129, 240, 240, + 176, 10, 7, 240, 240, 86, 240, 21, 0, 7, 16, 15, + 8, 240, 240, 34, 130, 130, 114, 81, 82, 81, 97, 0, + 5, 112, 19, 7, 240, 19, 49, 49, 17, 65, 17, 65, + 17, 65, 66, 240, 240, 49, 240, 240, 16, 35, 13, 240, + 244, 114, 65, 81, 97, 81, 49, 33, 65, 34, 49, 33, + 17, 33, 50, 33, 17, 17, 66, 33, 34, 49, 17, 17, + 49, 19, 65, 65, 97, 102, 0, 7, 23, 7, 240, 130, + 82, 65, 33, 49, 33, 49, 33, 49, 33, 33, 20, 17, + 65, 17, 65, 17, 65, 240, 224, 22, 7, 229, 33, 65, + 17, 49, 33, 18, 51, 65, 34, 33, 65, 17, 49, 97, + 81, 51, 240, 240, 32, 17, 10, 240, 130, 113, 129, 145, + 129, 145, 145, 145, 145, 98, 38, 0, 6, 80, 26, 8, + 240, 19, 81, 34, 49, 66, 17, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 17, 65, 34, 33, 82, 240, 240, 96, + 21, 8, 240, 33, 20, 33, 34, 49, 113, 97, 66, 17, + 34, 49, 113, 113, 65, 52, 240, 240, 208, 19, 10, 240, + 49, 39, 49, 145, 145, 50, 65, 18, 97, 145, 145, 145, + 129, 0, 7, 48, 21, 9, 240, 241, 113, 113, 129, 113, + 97, 17, 97, 17, 97, 17, 97, 33, 81, 53, 240, 240, + 128, 26, 9, 240, 193, 65, 49, 81, 33, 81, 33, 81, + 33, 34, 17, 35, 49, 33, 81, 33, 81, 33, 97, 17, + 240, 240, 224, 14, 3, 97, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 49, 208, 17, 9, 240, 198, 82, 145, 146, + 145, 129, 129, 129, 49, 49, 83, 240, 240, 144, 25, 9, + 240, 49, 129, 129, 66, 33, 50, 49, 49, 65, 33, 81, + 17, 97, 17, 97, 33, 81, 52, 33, 240, 240, 208, 17, + 10, 240, 81, 145, 145, 145, 145, 145, 145, 161, 161, 66, + 68, 0, 6, 80, 30, 13, 240, 209, 193, 82, 66, 65, + 17, 65, 17, 49, 33, 49, 17, 33, 49, 33, 51, 49, + 33, 145, 33, 145, 33, 161, 193, 0, 8, 32, 27, 13, + 240, 240, 177, 129, 50, 113, 50, 113, 50, 113, 49, 17, + 97, 49, 17, 81, 49, 49, 50, 49, 68, 65, 177, 0, + 8, 25, 11, 240, 146, 129, 82, 33, 113, 33, 129, 17, + 129, 17, 129, 17, 129, 17, 129, 33, 97, 49, 81, 85, + 0, 6, 18, 5, 164, 17, 33, 17, 33, 17, 33, 19, + 33, 65, 65, 65, 65, 65, 240, 144, 24, 10, 240, 130, + 114, 129, 129, 145, 97, 17, 113, 17, 113, 17, 97, 33, + 82, 34, 50, 83, 19, 240, 240, 176, 25, 10, 240, 101, + 65, 65, 65, 49, 81, 33, 97, 33, 97, 33, 97, 33, + 97, 50, 65, 83, 17, 145, 0, 6, 16, 18, 8, 240, + 82, 51, 65, 113, 129, 130, 130, 129, 113, 33, 49, 67, + 240, 240, 80, 17, 8, 240, 98, 36, 49, 17, 113, 129, + 113, 113, 129, 113, 113, 240, 240, 208, 25, 12, 240, 240, + 113, 177, 129, 17, 145, 17, 145, 17, 145, 33, 129, 33, + 113, 65, 81, 97, 34, 130, 0, 6, 96, 21, 12, 0, + 7, 33, 17, 129, 49, 113, 49, 97, 81, 81, 81, 65, + 113, 33, 132, 0, 8, 16, 35, 13, 240, 240, 97, 193, + 209, 17, 51, 65, 17, 49, 17, 65, 17, 49, 33, 49, + 17, 33, 65, 33, 17, 33, 65, 33, 33, 17, 81, 17, + 34, 113, 0, 8, 48, 24, 8, 240, 113, 17, 81, 33, + 49, 49, 34, 65, 17, 97, 114, 81, 17, 81, 33, 49, + 49, 49, 240, 240, 128, 19, 10, 240, 209, 17, 97, 49, + 81, 65, 65, 84, 145, 145, 129, 145, 145, 0, 6, 96, + 20, 14, 240, 240, 22, 83, 66, 193, 193, 209, 193, 209, + 193, 209, 210, 52, 101, 0, 7, 64, 18, 8, 240, 33, + 65, 37, 49, 113, 97, 113, 113, 113, 113, 113, 116, 240, + 240, 96, 15, 7, 240, 97, 113, 113, 97, 113, 113, 97, + 113, 97, 240, 240, 96, 17, 8, 240, 22, 113, 113, 113, + 113, 113, 113, 129, 113, 113, 53, 240, 240, 48, 12, 6, + 226, 49, 17, 49, 17, 33, 49, 0, 8, 48, 7, 6, + 0, 9, 5, 240, 160, 5, 2, 65, 240, 224, 15, 6, + 0, 6, 17, 65, 33, 33, 17, 17, 18, 33, 18, 240, + 208, 18, 6, 240, 49, 81, 81, 81, 81, 81, 81, 49, + 17, 49, 18, 17, 65, 240, 192, 12, 5, 240, 240, 114, + 33, 49, 65, 65, 83, 240, 96, 21, 8, 240, 113, 113, + 113, 113, 113, 113, 49, 49, 33, 65, 17, 81, 33, 50, + 36, 240, 240, 80, 14, 9, 0, 8, 51, 81, 33, 38, + 81, 129, 149, 240, 240, 112, 16, 7, 240, 117, 33, 97, + 97, 97, 33, 36, 65, 97, 113, 240, 240, 144, 16, 7, + 0, 6, 49, 81, 81, 97, 50, 35, 17, 97, 97, 81, + 82, 144, 19, 9, 0, 6, 97, 129, 129, 129, 50, 65, + 17, 33, 50, 49, 65, 65, 240, 240, 112, 11, 3, 240, + 17, 65, 33, 33, 33, 33, 49, 208, 16, 7, 240, 240, + 129, 81, 240, 97, 113, 113, 97, 97, 17, 65, 36, 144, + 18, 7, 113, 97, 97, 97, 97, 33, 49, 17, 66, 81, + 97, 102, 33, 240, 240, 160, 14, 3, 97, 33, 33, 33, + 33, 33, 33, 33, 33, 49, 33, 208, 15, 7, 0, 6, + 82, 35, 17, 18, 49, 18, 97, 97, 240, 240, 48, 13, + 6, 0, 6, 34, 34, 17, 34, 33, 18, 81, 240, 208, + 13, 6, 0, 6, 33, 65, 65, 49, 17, 49, 36, 240, + 160, 16, 4, 240, 240, 49, 33, 17, 17, 17, 17, 17, + 18, 33, 49, 49, 112, 17, 8, 0, 8, 18, 81, 113, + 33, 65, 33, 68, 113, 113, 114, 17, 97, 32, 14, 6, + 240, 240, 115, 33, 49, 17, 81, 81, 81, 81, 240, 224, + 12, 5, 240, 240, 113, 34, 65, 82, 65, 34, 240, 112, + 17, 8, 240, 161, 113, 113, 113, 129, 34, 21, 81, 113, + 113, 129, 240, 240, 96, 13, 6, 0, 6, 97, 49, 17, + 49, 17, 33, 50, 240, 192, 14, 5, 240, 240, 129, 65, + 17, 33, 17, 17, 50, 49, 240, 128, 18, 7, 0, 7, + 1, 65, 17, 65, 17, 33, 17, 17, 17, 18, 33, 240, + 240, 48, 11, 4, 240, 240, 33, 51, 33, 33, 17, 240, + 96, 13, 6, 0, 6, 97, 49, 33, 33, 51, 65, 81, + 81, 224, 12, 7, 0, 7, 35, 34, 33, 81, 97, 99, + 240, 224, 17, 8, 240, 38, 33, 113, 113, 97, 114, 113, + 129, 113, 113, 117, 240, 240, 48, 14, 2, 65, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 144, 17, 8, 240, + 21, 113, 113, 113, 113, 130, 98, 81, 113, 113, 52, 240, + 240, 96, 11, 7, 0, 6, 33, 49, 17, 19, 0, 7, + 32, 12, 2, 65, 81, 17, 17, 17, 17, 17, 17, 17, + 144, 18, 5, 193, 65, 49, 17, 34, 33, 17, 33, 33, + 17, 33, 35, 65, 65, 240, 176, 17, 7, 147, 49, 97, + 97, 97, 113, 83, 81, 97, 67, 66, 17, 114, 240, 224, + 12, 6, 240, 240, 97, 19, 35, 51, 37, 240, 240, 208, + 23, 11, 240, 115, 67, 33, 177, 65, 81, 65, 97, 33, + 129, 17, 130, 148, 129, 161, 240, 84, 240, 240, 96, 10, + 2, 97, 17, 17, 17, 81, 17, 17, 176, 20, 8, 240, + 82, 51, 66, 97, 18, 81, 33, 82, 17, 99, 113, 113, + 97, 67, 240, 240, 80, 7, 7, 226, 34, 0, 12, 48, + 25, 10, 240, 146, 113, 114, 129, 33, 81, 33, 97, 17, + 81, 17, 33, 65, 17, 49, 33, 49, 81, 69, 0, 6, + 80, 11, 5, 177, 49, 17, 34, 17, 17, 0, 7, 48, + 22, 9, 240, 240, 161, 33, 50, 33, 49, 34, 49, 33, + 97, 33, 97, 33, 97, 34, 81, 0, 6, 16, 13, 7, + 240, 240, 85, 113, 97, 97, 97, 97, 240, 240, 208, 8, + 6, 240, 240, 197, 0, 6, 112, 28, 10, 240, 146, 113, + 114, 17, 99, 17, 65, 17, 17, 81, 18, 65, 17, 17, + 18, 33, 17, 17, 65, 33, 97, 54, 0, 6, 80, 7, + 6, 240, 149, 0, 9, 16, 10, 5, 177, 49, 65, 33, + 34, 0, 7, 16, 13, 7, 240, 241, 113, 97, 69, 65, + 97, 97, 166, 240, 224, 10, 5, 162, 65, 65, 65, 67, + 0, 6, 48, 10, 5, 163, 65, 65, 81, 49, 0, 6, + 64, 7, 4, 161, 18, 0, 6, 96, 21, 11, 0, 7, + 17, 65, 81, 65, 66, 65, 66, 66, 49, 20, 17, 33, + 129, 17, 0, 8, 16, 25, 11, 240, 122, 81, 17, 84, + 17, 65, 49, 17, 65, 49, 17, 84, 17, 129, 17, 145, + 161, 161, 131, 0, 6, 16, 6, 3, 240, 98, 240, 208, + 8, 3, 240, 240, 17, 33, 18, 208, 8, 2, 65, 17, + 17, 17, 240, 128, 10, 6, 209, 65, 81, 49, 35, 0, + 8, 64, 24, 10, 240, 240, 17, 34, 97, 49, 97, 49, + 97, 49, 81, 34, 65, 33, 81, 33, 81, 33, 81, 0, + 7, 48, 24, 8, 240, 113, 17, 65, 33, 49, 49, 49, + 97, 97, 33, 68, 50, 33, 33, 36, 17, 65, 113, 240, + 240, 64, 21, 7, 240, 97, 49, 33, 33, 49, 17, 65, + 17, 66, 99, 49, 33, 81, 97, 33, 66, 240, 240, 29, + 9, 240, 50, 65, 49, 49, 49, 49, 81, 33, 81, 17, + 83, 34, 65, 17, 17, 49, 17, 33, 49, 17, 34, 83, + 129, 240, 240, 128, 19, 7, 240, 33, 240, 240, 34, 65, + 65, 17, 65, 17, 65, 18, 33, 66, 240, 240, 16, 22, + 7, 145, 113, 194, 65, 17, 65, 17, 65, 17, 65, 33, + 38, 17, 49, 33, 49, 33, 240, 240, 64, 23, 7, 161, + 81, 98, 82, 65, 17, 65, 17, 65, 33, 49, 33, 38, + 17, 49, 33, 49, 33, 65, 240, 224, 21, 6, 210, 81, + 66, 65, 17, 49, 17, 49, 17, 33, 33, 37, 17, 49, + 17, 49, 17, 240, 224, 22, 6, 209, 65, 18, 65, 66, + 65, 17, 49, 17, 49, 17, 37, 17, 49, 17, 49, 17, + 49, 240, 160, 23, 7, 241, 113, 98, 65, 17, 65, 17, + 65, 17, 65, 33, 33, 20, 17, 49, 33, 49, 33, 240, + 240, 64, 21, 6, 226, 161, 81, 65, 17, 49, 17, 49, + 17, 33, 19, 17, 49, 17, 49, 17, 49, 240, 160, 26, + 11, 240, 193, 149, 81, 17, 129, 17, 113, 33, 113, 37, + 33, 19, 98, 33, 97, 49, 81, 65, 81, 69, 240, 240, + 240, 16, 8, 240, 178, 81, 97, 113, 113, 113, 113, 134, + 65, 129, 97, 240, 208, 18, 7, 240, 33, 177, 19, 33, + 97, 97, 81, 34, 33, 97, 97, 65, 36, 240, 240, 20, + 7, 240, 49, 49, 97, 19, 33, 97, 81, 97, 34, 33, + 97, 65, 17, 65, 36, 240, 240, 18, 6, 241, 65, 65, + 84, 33, 65, 81, 34, 17, 17, 49, 81, 49, 35, 240, + 176, 19, 7, 240, 113, 101, 33, 97, 81, 65, 17, 34, + 33, 97, 65, 17, 65, 36, 240, 240, 11, 2, 129, 17, + 17, 17, 17, 17, 17, 17, 176, 13, 3, 97, 97, 33, + 33, 33, 33, 33, 33, 33, 240, 16, 15, 4, 129, 65, + 49, 49, 49, 49, 49, 49, 49, 49, 65, 240, 32, 13, + 3, 97, 97, 33, 33, 33, 33, 33, 33, 33, 240, 16, + 24, 11, 240, 161, 164, 113, 50, 81, 81, 65, 81, 20, + 81, 65, 81, 65, 65, 81, 65, 82, 33, 130, 0, 6, + 27, 12, 240, 209, 161, 19, 225, 49, 113, 50, 97, 50, + 97, 50, 81, 49, 33, 65, 49, 34, 33, 65, 66, 65, + 0, 7, 48, 25, 10, 225, 240, 49, 114, 65, 49, 97, + 17, 113, 17, 113, 17, 113, 17, 113, 33, 81, 65, 49, + 99, 240, 240, 224, 26, 10, 240, 17, 240, 17, 114, 65, + 49, 81, 33, 113, 17, 113, 17, 113, 17, 113, 33, 81, + 65, 49, 99, 240, 240, 224, 25, 10, 240, 146, 113, 114, + 65, 49, 81, 33, 113, 17, 113, 17, 113, 17, 113, 33, + 81, 65, 49, 99, 240, 240, 224, 27, 10, 240, 115, 17, + 97, 17, 82, 65, 49, 81, 33, 113, 17, 113, 17, 113, + 17, 113, 33, 81, 65, 49, 99, 240, 240, 224, 26, 10, + 240, 113, 66, 65, 114, 65, 49, 81, 33, 113, 17, 113, + 17, 113, 17, 113, 33, 81, 65, 49, 99, 240, 240, 224, + 17, 6, 240, 209, 17, 33, 49, 17, 65, 65, 17, 49, + 17, 97, 240, 240, 112, 31, 11, 240, 146, 49, 65, 67, + 49, 49, 33, 33, 65, 49, 17, 49, 65, 17, 33, 81, + 17, 33, 81, 34, 81, 50, 81, 50, 65, 100, 0, 6, + 22, 11, 240, 240, 241, 161, 113, 17, 129, 17, 129, 17, + 129, 33, 113, 33, 97, 65, 65, 100, 0, 6, 23, 11, + 240, 240, 241, 145, 129, 17, 129, 17, 129, 17, 129, 33, + 97, 49, 97, 65, 50, 99, 0, 6, 16, 23, 11, 240, + 178, 240, 33, 161, 113, 17, 129, 17, 129, 17, 129, 33, + 97, 49, 97, 65, 65, 100, 0, 6, 23, 11, 240, 161, + 34, 240, 161, 129, 17, 129, 17, 129, 17, 129, 17, 129, + 33, 97, 49, 81, 85, 0, 6, 18, 9, 240, 97, 193, + 17, 97, 33, 65, 69, 113, 129, 129, 113, 129, 0, 6, + 16, 17, 6, 197, 17, 81, 84, 33, 49, 17, 49, 20, + 33, 81, 81, 99, 240, 176, 24, 7, 230, 17, 65, 17, + 65, 17, 34, 33, 17, 65, 34, 33, 65, 17, 65, 17, + 65, 17, 65, 51, 240, 240, 16, 7, 240, 240, 113, 240, + 177, 81, 33, 49, 17, 17, 34, 49, 240, 224, 12, 5, + 240, 240, 177, 49, 65, 18, 18, 49, 240, 144, 12, 5, + 240, 240, 34, 178, 49, 18, 18, 50, 240, 128, 14, 6, + 240, 240, 99, 17, 65, 130, 65, 18, 34, 66, 240, 208, + 13, 5, 240, 240, 17, 145, 49, 65, 18, 18, 49, 240, + 144, 15, 6, 240, 240, 34, 66, 241, 65, 33, 33, 17, + 17, 33, 240, 208, 19, 10, 0, 9, 66, 98, 17, 49, + 20, 49, 34, 83, 33, 18, 18, 65, 240, 240, 208, 12, + 5, 240, 240, 193, 49, 49, 65, 83, 49, 65, 192, 14, + 8, 0, 6, 65, 226, 81, 17, 52, 81, 133, 240, 240, + 48, 16, 8, 240, 240, 225, 240, 115, 65, 33, 37, 81, + 129, 18, 240, 240, 48, 16, 8, 240, 240, 210, 240, 100, + 65, 33, 37, 65, 129, 34, 240, 240, 48, 16, 8, 0, + 6, 33, 17, 212, 65, 17, 52, 81, 129, 19, 240, 240, + 48, 10, 3, 240, 97, 33, 33, 33, 33, 49, 208, 9, + 3, 209, 113, 33, 33, 33, 240, 80, 10, 3, 240, 50, + 65, 33, 33, 33, 240, 32, 10, 3, 240, 49, 97, 33, + 33, 33, 240, 16, 13, 6, 240, 240, 97, 98, 193, 97, + 17, 49, 35, 240, 176, 16, 6, 240, 242, 33, 50, 131, + 50, 17, 33, 33, 49, 33, 240, 240, 16, 14, 6, 240, + 240, 241, 65, 65, 65, 49, 17, 49, 35, 240, 176, 14, + 6, 240, 240, 129, 177, 65, 65, 49, 17, 49, 35, 240, + 176, 14, 6, 240, 240, 129, 177, 65, 65, 49, 17, 49, + 35, 240, 176, 16, 7, 240, 240, 195, 33, 66, 81, 81, + 81, 49, 33, 49, 51, 240, 240, 15, 7, 240, 240, 209, + 33, 177, 81, 81, 49, 33, 65, 36, 240, 240, 8, 7, + 240, 240, 129, 166, 0, 8, 15, 6, 240, 240, 241, 66, + 50, 49, 17, 17, 18, 33, 36, 240, 160, 14, 6, 0, + 6, 1, 81, 49, 17, 49, 18, 33, 35, 240, 176, 14, + 6, 240, 240, 145, 225, 49, 17, 49, 17, 49, 35, 240, + 176, 17, 6, 240, 240, 129, 65, 17, 33, 81, 49, 17, + 49, 17, 49, 35, 240, 176, 13, 7, 0, 7, 113, 65, + 17, 65, 33, 34, 51, 240, 240, 13, 6, 240, 240, 225, + 209, 17, 49, 35, 81, 81, 65, 240, 15, 5, 244, 17, + 65, 68, 17, 33, 19, 33, 65, 65, 68, 240, 96, 14, + 6, 240, 240, 209, 17, 193, 17, 49, 35, 81, 81, 65, + 240, +}; + +//***************************************************************************** +// +// The glyph offset table for the 14 point Handwriting font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetHandwriting14[] = +{ + 0, 5, 17, 25, 49, 74, 100, 127, + 134, 149, 163, 171, 186, 193, 201, 206, + 221, 246, 259, 279, 297, 318, 337, 356, + 371, 394, 417, 423, 430, 445, 455, 470, + 489, 524, 547, 569, 586, 612, 633, 652, + 673, 699, 713, 730, 755, 772, 802, 829, + 854, 872, 896, 921, 939, 956, 981, 1002, + 1037, 1061, 1080, 1100, 1118, 1133, 1150, 1162, + 1169, 1174, 1189, 1207, 1219, 1240, 1254, 1270, + 1286, 1305, 1316, 1332, 1350, 1364, 1379, 1392, + 1405, 1421, 1438, 1452, 1464, 1481, 1494, 1508, + 1526, 1537, 1550, 1562, 1579, 1593, 1610, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1621, 1633, 1651, 1668, 1680, 1703, 1713, + 1733, 1740, 1765, 1776, 1798, 1811, 1819, 1847, + 1854, 1864, 1877, 1887, 1897, 1904, 1925, 1950, + 1956, 1964, 1972, 1982, 2006, 2030, 2051, 2080, + 2099, 2121, 2144, 2165, 2187, 2210, 2231, 2257, + 2273, 2291, 2311, 2329, 2348, 2359, 2372, 2387, + 2400, 2424, 2451, 2476, 2502, 2527, 2554, 2580, + 2597, 2628, 2650, 2673, 2696, 2719, 2737, 2754, + 2778, 2794, 2806, 2818, 2832, 2845, 2860, 2879, + 2891, 2905, 2921, 2937, 2953, 2963, 2972, 2982, + 2992, 3005, 3021, 3035, 3049, 3063, 3079, 3094, + 3102, 3117, 3131, 3145, 3162, 3175, 3188, 3203, +}; + +//***************************************************************************** +// +// The font definition for the 14 point Handwriting font. +// +//***************************************************************************** +const tFontEx g_sFontExHandwriting14 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 12, + + // + // The height of the font. + // + 17, + + // + // The baseline of the font. + // + 13, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetHandwriting14, + + // + // A pointer to the actual font data + // + g_pui8Handwriting14Data +}; diff --git a/third_party/fonts/ofl/fonts/fonthandwriting16.c b/third_party/fonts/ofl/fonts/fonthandwriting16.c new file mode 100644 index 0000000..d655baf --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthandwriting16.c @@ -0,0 +1,544 @@ +//***************************************************************************** +// +// fonthandwriting16.c - Font definition for the 16pt Handwriting font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://helloalan.com/projects/breip/ +// +// This Font Software is Copyright (c) 2008, Alan Hussey and Adam Breipohl. +// All Rights Reserved. +// +// "Breip" is a Reserved Font Name for this Font Software. +// +// This Font Software is licensed under the SIL Open Font License, +// Version 1.0. No modification of the license is permitted, only verbatim +// copy is allowed. This license is copied below, and is also available with +// a FAQ at: http://scripts.sil.org/OFL +// ------------------------------------------------------------------------ +// +// SIL OPEN FONT LICENSE +// +// Version 1.0 - 22 November 2005 +// PREAMBLE +// +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of cooperative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide an open +// framework in which fonts may be shared and improved in partnership with +// others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and sold with any software provided that the font names of +// derivative works are changed. The fonts and derivatives, however, cannot +// be released under any other type of license. +// +// DEFINITIONS +// +// "Font Software" refers to any and all of the following: +// +// * font files +// * data files +// * source code +// * build scripts +// * documentation +// +// "Reserved Font Name" refers to the Font Software name as seen by users +// and any other names as specified after the copyright statement. +// +// "Standard Version" refers to the collection of Font Software components +// as distributed by the Copyright Holder. +// +// "Modified Version" refers to any derivative font software made by adding +// to, deleting, or substituting -- in part or in whole -- any of the +// components of the Standard Version, by changing formats or by porting +// the Font Software to a new environment. +// +// "Author" refers to any designer, engineer, programmer, technical writer +// or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, in +// Standard or Modified Versions, may be sold by itself. +// +// 2) Standard or Modified Versions of the Font Software may be bundled, +// redistributed and sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or in +// the appropriate machine-readable metadata fields within text or binary +// files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s), in part or in whole, unless explicit written permission is +// granted by the Copyright Holder. This restriction applies to all +// references stored in the Font Software, such as the font menu name and +// other font description fields, which are used to differentiate the font +// from others. +// +// 4) The name(s) of the Copyright Holder or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any Modified +// Version, except to acknowledge the contribution(s) of the Copyright Holder +// and the Author(s) or with their explicit written permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, must +// be distributed using this license, and may not be distributed under any +// other license. +// +// TERMINATION +// +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER +// DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: handwriting +// Size: 16 point +// Bold: no +// Italic: no +// Memory usage: 3968 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 16 point Handwriting font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Handwriting16Data[3768] = +{ + 4, 6, 0, 15, 14, 3, 161, 33, 33, 18, 18, 18, + 17, 33, 129, 33, 240, 32, 8, 3, 145, 34, 18, 240, + 240, 208, 30, 12, 240, 240, 113, 177, 81, 97, 65, 73, + 81, 65, 17, 65, 65, 97, 65, 97, 65, 89, 65, 65, + 33, 49, 81, 81, 81, 0, 7, 112, 33, 8, 240, 161, + 33, 65, 19, 65, 17, 66, 17, 49, 17, 17, 49, 17, + 17, 70, 49, 17, 17, 49, 17, 17, 49, 18, 36, 17, + 113, 129, 240, 240, 48, 29, 12, 240, 240, 209, 66, 33, + 17, 99, 33, 161, 177, 161, 177, 177, 35, 81, 33, 129, + 33, 49, 49, 49, 49, 49, 67, 0, 7, 96, 32, 10, + 240, 240, 18, 113, 33, 97, 33, 97, 33, 97, 17, 130, + 145, 49, 82, 33, 65, 33, 17, 65, 50, 65, 66, 49, + 49, 33, 51, 240, 240, 240, 7, 2, 97, 17, 17, 240, + 224, 19, 5, 240, 49, 49, 49, 49, 65, 65, 65, 65, + 65, 65, 65, 65, 33, 34, 240, 112, 16, 4, 193, 65, + 49, 49, 65, 49, 49, 49, 49, 33, 49, 49, 240, 112, + 8, 3, 146, 17, 34, 240, 240, 208, 17, 8, 240, 240, + 193, 113, 129, 113, 71, 65, 113, 113, 113, 113, 240, 240, + 224, 8, 2, 240, 177, 17, 17, 17, 112, 8, 7, 0, + 7, 118, 0, 8, 112, 5, 2, 240, 241, 144, 19, 9, + 240, 240, 65, 113, 113, 129, 113, 113, 129, 113, 129, 113, + 113, 129, 0, 6, 80, 30, 13, 240, 241, 163, 161, 17, + 145, 193, 145, 17, 161, 17, 161, 17, 161, 17, 161, 33, + 129, 49, 129, 65, 82, 98, 19, 145, 0, 7, 48, 15, + 2, 97, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 176, 25, 13, 240, 240, 195, 130, 33, 113, 65, 177, + 193, 193, 193, 193, 82, 81, 65, 113, 49, 129, 33, 162, + 0, 8, 112, 21, 11, 240, 240, 101, 66, 81, 33, 113, + 146, 130, 130, 178, 162, 161, 161, 161, 130, 114, 0, 6, + 28, 12, 240, 240, 178, 145, 17, 129, 33, 113, 49, 97, + 65, 81, 81, 49, 17, 81, 18, 55, 161, 177, 177, 177, + 177, 0, 6, 80, 23, 8, 240, 181, 33, 113, 113, 113, + 113, 19, 33, 17, 49, 33, 65, 113, 113, 97, 113, 67, + 240, 240, 80, 21, 9, 0, 6, 17, 113, 129, 113, 113, + 129, 113, 129, 65, 49, 82, 17, 97, 38, 240, 240, 128, + 18, 7, 240, 102, 97, 97, 97, 81, 97, 81, 97, 97, + 81, 97, 97, 240, 240, 144, 27, 8, 240, 113, 113, 65, + 17, 50, 33, 33, 49, 49, 49, 65, 17, 97, 114, 81, + 33, 65, 49, 49, 33, 67, 240, 240, 224, 28, 10, 240, + 240, 51, 82, 66, 17, 98, 17, 81, 17, 17, 81, 17, + 33, 49, 33, 51, 49, 145, 145, 145, 145, 145, 0, 6, + 48, 8, 3, 240, 65, 240, 18, 240, 112, 7, 2, 240, + 49, 177, 17, 112, 16, 9, 0, 6, 50, 98, 82, 82, + 98, 146, 130, 145, 146, 0, 6, 112, 10, 8, 0, 8, + 7, 240, 54, 0, 8, 16, 16, 9, 240, 240, 241, 146, + 146, 146, 130, 98, 82, 98, 82, 0, 7, 80, 20, 8, + 240, 65, 85, 33, 81, 17, 81, 17, 81, 17, 65, 98, + 240, 240, 226, 240, 240, 224, 43, 14, 0, 5, 100, 130, + 65, 97, 113, 81, 113, 65, 50, 49, 65, 33, 81, 33, + 17, 17, 97, 33, 17, 17, 65, 17, 33, 17, 17, 49, + 17, 49, 33, 19, 81, 49, 145, 66, 82, 117, 0, 7, + 80, 29, 8, 240, 193, 113, 97, 17, 81, 17, 81, 17, + 65, 49, 49, 49, 49, 49, 54, 33, 49, 33, 81, 17, + 81, 17, 81, 240, 240, 48, 27, 9, 240, 214, 49, 81, + 33, 65, 49, 34, 67, 97, 19, 65, 65, 49, 65, 49, + 65, 33, 65, 129, 98, 97, 240, 240, 192, 20, 11, 240, + 240, 129, 130, 129, 145, 161, 145, 161, 161, 161, 161, 177, + 83, 53, 0, 7, 48, 29, 9, 240, 49, 132, 81, 50, + 49, 82, 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 17, 81, 33, 17, 33, 99, 0, 6, 23, 8, + 240, 161, 113, 20, 33, 113, 113, 97, 66, 17, 34, 49, + 113, 113, 81, 17, 66, 37, 240, 240, 192, 21, 11, 240, + 240, 133, 37, 97, 161, 161, 161, 21, 65, 161, 161, 161, + 161, 145, 161, 0, 6, 96, 25, 10, 240, 240, 65, 129, + 129, 145, 129, 145, 129, 145, 113, 17, 113, 17, 113, 17, + 113, 33, 82, 53, 240, 240, 208, 32, 10, 240, 241, 81, + 49, 81, 49, 81, 49, 82, 33, 82, 33, 65, 17, 33, + 34, 33, 35, 65, 33, 97, 33, 97, 33, 113, 17, 113, + 0, 6, 48, 16, 3, 145, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 49, 33, 208, 20, 10, 240, 240, 22, + 49, 178, 162, 161, 161, 145, 161, 129, 145, 65, 49, 99, + 0, 6, 96, 28, 11, 240, 240, 49, 161, 97, 49, 82, + 49, 66, 65, 50, 81, 34, 97, 33, 113, 33, 113, 33, + 113, 34, 97, 69, 33, 0, 8, 21, 11, 240, 240, 49, + 161, 161, 161, 161, 161, 161, 162, 161, 161, 113, 50, 65, + 100, 0, 7, 32, 36, 14, 240, 240, 225, 209, 98, 66, + 81, 17, 66, 81, 33, 49, 17, 49, 49, 49, 17, 49, + 49, 33, 51, 65, 33, 161, 33, 161, 33, 177, 17, 177, + 209, 0, 8, 112, 34, 15, 0, 9, 17, 50, 145, 50, + 145, 49, 17, 129, 49, 17, 114, 49, 17, 113, 65, 33, + 97, 65, 33, 81, 66, 34, 50, 65, 84, 81, 209, 0, + 9, 32, 31, 13, 240, 240, 194, 161, 97, 65, 129, 49, + 145, 33, 145, 17, 161, 17, 161, 33, 145, 33, 129, 49, + 129, 65, 97, 97, 50, 131, 0, 7, 32, 22, 6, 240, + 52, 33, 49, 17, 49, 17, 49, 17, 33, 35, 49, 81, + 81, 81, 81, 81, 82, 240, 208, 30, 11, 240, 240, 113, + 146, 145, 145, 145, 161, 113, 17, 129, 17, 129, 17, 129, + 17, 65, 33, 33, 65, 17, 65, 65, 100, 19, 240, 240, + 240, 28, 11, 240, 240, 70, 65, 81, 65, 65, 81, 49, + 97, 33, 113, 33, 113, 33, 113, 49, 97, 66, 65, 99, + 17, 161, 0, 8, 16, 21, 9, 240, 240, 49, 83, 66, + 97, 129, 145, 146, 146, 145, 145, 129, 33, 50, 67, 240, + 240, 160, 20, 10, 240, 240, 114, 68, 51, 17, 145, 145, + 145, 161, 145, 145, 161, 145, 161, 0, 6, 64, 28, 13, + 0, 8, 33, 145, 17, 161, 17, 161, 17, 161, 17, 161, + 17, 161, 33, 129, 49, 129, 65, 82, 98, 18, 161, 0, + 7, 48, 24, 14, 0, 10, 33, 193, 33, 161, 49, 129, + 65, 114, 81, 97, 97, 81, 129, 65, 130, 33, 163, 0, + 9, 80, 38, 15, 0, 7, 17, 225, 225, 241, 114, 81, + 17, 65, 18, 65, 17, 65, 33, 65, 17, 49, 65, 49, + 17, 49, 81, 33, 33, 33, 81, 33, 33, 33, 99, 50, + 114, 0, 9, 80, 26, 9, 240, 240, 97, 97, 18, 65, + 49, 65, 65, 33, 84, 98, 114, 115, 81, 33, 66, 49, + 49, 65, 49, 240, 240, 208, 22, 11, 240, 240, 193, 161, + 17, 113, 49, 97, 66, 65, 100, 161, 161, 145, 161, 161, + 145, 0, 7, 64, 25, 17, 0, 7, 5, 118, 34, 241, + 242, 241, 242, 241, 242, 241, 240, 17, 240, 17, 130, 98, + 23, 133, 0, 9, 32, 21, 9, 240, 209, 66, 37, 65, + 129, 129, 113, 129, 129, 129, 129, 129, 129, 49, 69, 240, + 240, 160, 18, 8, 240, 240, 33, 129, 113, 129, 129, 113, + 129, 129, 113, 129, 113, 240, 240, 176, 19, 8, 240, 150, + 113, 113, 113, 113, 113, 113, 113, 113, 129, 113, 113, 38, + 240, 240, 48, 14, 6, 240, 97, 66, 49, 17, 49, 17, + 33, 49, 0, 9, 16, 7, 7, 0, 13, 22, 240, 224, + 7, 4, 194, 65, 0, 7, 80, 18, 7, 0, 9, 1, + 81, 81, 34, 33, 17, 17, 33, 17, 33, 18, 240, 240, + 48, 20, 6, 240, 241, 81, 81, 81, 81, 81, 81, 34, + 17, 49, 17, 49, 33, 33, 35, 240, 176, 13, 6, 0, + 7, 17, 50, 65, 65, 81, 82, 84, 240, 160, 26, 9, + 240, 240, 65, 129, 129, 129, 129, 129, 129, 49, 65, 33, + 81, 33, 81, 17, 82, 33, 49, 17, 51, 240, 240, 160, + 15, 9, 0, 10, 67, 81, 49, 68, 50, 129, 145, 149, + 240, 240, 112, 19, 8, 240, 240, 54, 33, 113, 113, 113, + 97, 17, 100, 81, 113, 113, 113, 240, 240, 240, 18, 8, + 0, 9, 34, 81, 113, 97, 129, 50, 51, 17, 113, 97, + 81, 17, 97, 176, 22, 10, 0, 10, 1, 145, 145, 145, + 81, 65, 35, 65, 17, 49, 49, 17, 49, 65, 81, 240, + 240, 176, 12, 3, 240, 113, 65, 33, 33, 33, 33, 33, + 49, 208, 16, 8, 0, 7, 33, 240, 129, 129, 129, 129, + 129, 113, 113, 97, 37, 176, 23, 7, 240, 97, 97, 97, + 97, 97, 49, 33, 33, 49, 17, 66, 81, 98, 81, 20, + 33, 97, 240, 240, 48, 16, 3, 145, 33, 33, 33, 33, + 33, 33, 33, 33, 34, 18, 33, 240, 16, 20, 9, 0, + 9, 81, 81, 17, 17, 51, 33, 34, 65, 34, 65, 34, + 81, 33, 0, 6, 64, 16, 7, 0, 9, 2, 53, 34, + 33, 34, 33, 34, 49, 33, 240, 240, 48, 15, 7, 0, + 9, 1, 81, 81, 97, 65, 18, 34, 50, 240, 240, 16, + 16, 5, 0, 6, 115, 33, 33, 17, 33, 17, 17, 34, + 49, 65, 65, 144, 19, 9, 0, 11, 66, 97, 113, 49, + 65, 49, 65, 34, 68, 129, 129, 145, 33, 98, 32, 15, + 6, 0, 6, 19, 49, 33, 17, 81, 81, 81, 81, 81, + 240, 224, 13, 5, 0, 6, 1, 34, 33, 82, 81, 65, + 34, 240, 112, 20, 9, 0, 5, 97, 129, 129, 130, 129, + 35, 19, 17, 97, 129, 145, 129, 129, 240, 240, 176, 13, + 7, 0, 10, 65, 65, 17, 65, 33, 33, 67, 240, 240, + 15, 5, 0, 6, 1, 65, 65, 49, 33, 17, 33, 17, + 49, 240, 128, 18, 8, 0, 11, 1, 81, 17, 81, 17, + 34, 17, 17, 17, 34, 34, 240, 240, 112, 14, 5, 0, + 6, 33, 33, 17, 17, 49, 66, 65, 81, 240, 96, 15, + 7, 0, 10, 33, 17, 65, 33, 33, 67, 97, 97, 81, + 97, 160, 14, 8, 0, 10, 36, 34, 49, 97, 113, 97, + 116, 240, 240, 48, 20, 11, 240, 240, 87, 65, 161, 161, + 146, 130, 162, 162, 161, 161, 161, 161, 167, 240, 240, 240, + 16, 2, 97, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 144, 20, 9, 240, 213, 129, 129, 129, 129, + 130, 130, 114, 97, 129, 129, 49, 50, 67, 240, 240, 176, + 13, 8, 0, 9, 17, 65, 17, 17, 33, 82, 0, 8, + 48, 14, 3, 161, 33, 129, 33, 33, 33, 33, 33, 18, + 18, 18, 208, 23, 6, 225, 81, 81, 82, 66, 49, 17, + 33, 33, 33, 33, 49, 17, 50, 17, 66, 81, 81, 240, + 240, 16, 21, 12, 240, 210, 130, 161, 177, 177, 177, 193, + 164, 145, 177, 177, 132, 131, 18, 197, 0, 6, 16, 13, + 7, 0, 7, 1, 18, 68, 52, 52, 113, 0, 6, 32, + 27, 10, 240, 240, 99, 17, 97, 33, 81, 65, 65, 65, + 65, 81, 33, 113, 17, 116, 113, 132, 113, 145, 240, 52, + 240, 240, 48, 12, 2, 129, 17, 17, 17, 17, 81, 17, + 17, 17, 176, 26, 9, 240, 240, 34, 83, 66, 97, 17, + 97, 34, 82, 33, 82, 33, 98, 17, 114, 129, 129, 33, + 50, 68, 240, 240, 144, 9, 7, 240, 177, 18, 49, 0, + 13, 32, 28, 11, 0, 6, 3, 98, 129, 161, 49, 81, + 34, 97, 33, 81, 17, 33, 81, 17, 51, 33, 17, 113, + 49, 81, 85, 0, 7, 48, 11, 5, 240, 17, 49, 18, + 18, 49, 0, 8, 80, 23, 10, 0, 8, 1, 34, 50, + 34, 49, 49, 65, 49, 97, 34, 97, 49, 97, 49, 97, + 49, 0, 7, 80, 13, 8, 0, 7, 5, 130, 113, 113, + 113, 113, 0, 7, 16, 8, 7, 0, 7, 118, 0, 8, + 112, 33, 11, 0, 6, 3, 113, 130, 33, 98, 18, 81, + 17, 17, 97, 17, 17, 65, 17, 17, 33, 49, 17, 17, + 50, 17, 17, 113, 49, 81, 85, 0, 7, 48, 8, 7, + 240, 240, 86, 0, 12, 48, 11, 6, 225, 65, 65, 49, + 17, 49, 35, 0, 10, 17, 8, 240, 240, 193, 113, 129, + 113, 85, 81, 113, 113, 113, 199, 240, 240, 48, 14, 7, + 240, 99, 81, 97, 97, 49, 33, 18, 50, 0, 10, 16, + 11, 5, 244, 65, 49, 81, 65, 49, 0, 7, 16, 7, + 3, 161, 17, 0, 5, 112, 25, 12, 0, 10, 97, 81, + 81, 81, 66, 81, 66, 82, 49, 17, 49, 17, 33, 51, + 33, 33, 145, 17, 0, 8, 112, 28, 13, 240, 240, 171, + 97, 163, 33, 82, 33, 33, 65, 65, 33, 81, 49, 33, + 100, 33, 145, 33, 161, 193, 193, 193, 165, 0, 7, 9, + 4, 240, 240, 99, 18, 240, 240, 128, 8, 3, 240, 240, + 161, 33, 18, 208, 9, 2, 97, 17, 17, 17, 17, 240, + 160, 11, 6, 225, 65, 65, 49, 17, 49, 35, 0, 10, + 28, 11, 240, 240, 225, 49, 113, 50, 98, 34, 98, 49, + 98, 49, 97, 49, 81, 49, 81, 49, 81, 49, 81, 49, + 81, 0, 8, 16, 29, 9, 240, 49, 129, 81, 33, 65, + 49, 49, 65, 49, 65, 33, 113, 33, 81, 18, 67, 17, + 65, 49, 17, 17, 21, 113, 129, 0, 6, 27, 7, 240, + 209, 65, 17, 49, 33, 49, 33, 33, 49, 17, 65, 17, + 66, 17, 65, 17, 49, 33, 97, 97, 17, 81, 240, 240, + 32, 11, 240, 240, 51, 65, 81, 49, 81, 65, 97, 33, + 113, 17, 129, 17, 115, 49, 81, 35, 81, 17, 33, 65, + 17, 51, 33, 36, 161, 0, 7, 32, 19, 8, 240, 193, + 240, 240, 241, 113, 65, 17, 81, 17, 81, 33, 49, 53, + 240, 240, 192, 27, 8, 240, 49, 129, 113, 98, 98, 81, + 33, 65, 33, 65, 33, 65, 33, 70, 17, 65, 33, 65, + 33, 65, 33, 240, 240, 144, 28, 8, 240, 81, 82, 113, + 98, 97, 17, 81, 17, 65, 33, 65, 33, 65, 49, 54, + 17, 65, 33, 65, 33, 65, 33, 240, 240, 144, 25, 7, + 240, 130, 194, 82, 65, 17, 65, 33, 49, 33, 49, 33, + 33, 20, 17, 49, 33, 49, 33, 65, 97, 240, 224, 26, + 7, 240, 113, 81, 19, 178, 82, 65, 17, 65, 17, 65, + 33, 49, 33, 33, 20, 17, 49, 33, 49, 33, 65, 240, + 224, 26, 8, 240, 161, 33, 210, 98, 97, 17, 65, 33, + 65, 33, 65, 33, 70, 17, 65, 33, 65, 33, 65, 33, + 240, 240, 144, 25, 7, 240, 130, 82, 194, 65, 17, 65, + 17, 65, 17, 65, 33, 49, 33, 38, 17, 49, 33, 49, + 33, 65, 240, 224, 29, 13, 0, 7, 23, 81, 17, 161, + 17, 145, 33, 145, 33, 129, 54, 49, 49, 133, 113, 65, + 113, 65, 97, 81, 97, 86, 0, 6, 80, 21, 9, 240, + 240, 17, 98, 97, 129, 113, 129, 129, 129, 129, 97, 38, + 81, 145, 114, 240, 240, 160, 22, 8, 240, 193, 209, 113, + 20, 33, 113, 113, 97, 50, 33, 33, 65, 113, 113, 65, + 52, 240, 240, 80, 21, 7, 240, 177, 145, 97, 19, 33, + 97, 97, 81, 35, 17, 33, 49, 97, 97, 65, 36, 240, + 240, 23, 7, 240, 240, 18, 161, 19, 33, 34, 33, 97, + 81, 65, 17, 34, 33, 97, 65, 17, 65, 36, 240, 240, + 23, 8, 240, 177, 33, 177, 113, 20, 33, 113, 113, 97, + 35, 33, 33, 65, 113, 113, 65, 52, 240, 240, 80, 15, + 3, 145, 81, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 49, 208, 14, 3, 241, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 49, 208, 16, 4, 194, 113, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 65, 240, 32, 16, 4, 193, 129, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 65, 240, 32, + 29, 13, 0, 7, 4, 145, 50, 113, 81, 97, 97, 81, + 97, 21, 97, 81, 81, 97, 81, 97, 81, 97, 65, 113, + 17, 33, 162, 0, 7, 33, 13, 240, 240, 209, 65, 97, + 18, 17, 177, 113, 129, 49, 129, 50, 113, 50, 113, 33, + 17, 97, 49, 33, 81, 49, 33, 65, 65, 52, 81, 177, + 0, 8, 28, 11, 240, 193, 177, 240, 34, 129, 82, 49, + 97, 33, 129, 17, 129, 17, 129, 17, 129, 17, 129, 33, + 97, 65, 65, 100, 0, 6, 28, 11, 240, 225, 145, 240, + 34, 129, 82, 49, 97, 33, 129, 17, 129, 17, 129, 17, + 129, 17, 113, 49, 97, 65, 65, 100, 0, 6, 28, 11, + 240, 240, 129, 145, 130, 129, 82, 49, 97, 33, 129, 17, + 129, 17, 129, 17, 129, 17, 129, 33, 97, 65, 65, 100, + 0, 6, 28, 11, 240, 240, 98, 179, 82, 129, 82, 49, + 97, 33, 129, 17, 129, 17, 129, 17, 129, 17, 129, 33, + 97, 65, 65, 100, 0, 6, 28, 11, 240, 240, 66, 66, + 242, 129, 82, 49, 97, 33, 129, 17, 129, 17, 129, 17, + 129, 17, 129, 33, 97, 65, 65, 100, 0, 6, 18, 7, + 240, 240, 193, 49, 49, 33, 51, 82, 82, 65, 33, 97, + 113, 240, 240, 208, 37, 12, 240, 240, 130, 49, 81, 82, + 65, 65, 33, 33, 65, 65, 17, 65, 65, 17, 49, 81, + 17, 33, 97, 17, 33, 97, 17, 17, 97, 50, 97, 50, + 66, 100, 0, 8, 16, 28, 12, 240, 240, 177, 193, 240, + 49, 161, 145, 17, 145, 17, 145, 17, 145, 17, 145, 33, + 113, 49, 98, 65, 66, 100, 0, 6, 80, 27, 12, 0, + 6, 66, 240, 65, 161, 145, 17, 145, 17, 145, 17, 145, + 17, 145, 33, 113, 49, 98, 65, 65, 116, 0, 6, 80, + 29, 12, 240, 240, 177, 161, 17, 240, 49, 161, 145, 17, + 145, 17, 145, 17, 145, 17, 145, 33, 113, 49, 98, 65, + 65, 116, 0, 6, 80, 29, 12, 240, 240, 129, 50, 240, + 209, 145, 17, 145, 17, 145, 17, 145, 17, 145, 17, 145, + 17, 129, 49, 98, 50, 66, 100, 0, 6, 80, 22, 10, + 240, 240, 65, 209, 145, 18, 81, 50, 65, 85, 129, 145, + 145, 129, 145, 145, 145, 240, 240, 224, 19, 6, 240, 149, + 17, 81, 85, 17, 49, 17, 49, 20, 33, 81, 81, 81, + 85, 240, 160, 29, 8, 240, 150, 33, 81, 17, 81, 17, + 65, 33, 19, 49, 17, 81, 34, 49, 65, 33, 65, 33, + 81, 17, 81, 97, 67, 240, 240, 80, 18, 8, 0, 7, + 49, 129, 240, 81, 97, 34, 49, 17, 17, 50, 50, 240, + 240, 176, 17, 6, 0, 6, 49, 241, 65, 33, 33, 17, + 17, 17, 17, 17, 18, 240, 208, 17, 6, 0, 6, 34, + 241, 65, 33, 33, 17, 17, 17, 17, 17, 18, 240, 208, + 19, 6, 0, 6, 3, 17, 65, 145, 65, 33, 33, 17, + 17, 17, 17, 17, 18, 240, 208, 18, 6, 0, 6, 17, + 240, 33, 65, 33, 33, 17, 17, 17, 17, 17, 18, 240, + 208, 18, 7, 0, 6, 50, 82, 193, 81, 81, 34, 33, + 17, 17, 34, 49, 240, 240, 96, 22, 11, 0, 13, 19, + 65, 33, 18, 49, 20, 65, 34, 97, 17, 18, 82, 33, + 20, 17, 0, 6, 96, 14, 4, 240, 240, 193, 33, 33, + 49, 49, 66, 49, 49, 33, 96, 15, 9, 0, 9, 81, + 243, 81, 33, 53, 97, 129, 149, 240, 240, 112, 17, 9, + 0, 7, 49, 113, 240, 164, 65, 34, 37, 97, 129, 149, + 240, 240, 112, 17, 9, 0, 7, 33, 113, 240, 180, 65, + 33, 53, 97, 129, 149, 240, 240, 112, 14, 9, 0, 11, + 84, 65, 33, 53, 81, 145, 149, 240, 240, 112, 15, 4, + 240, 145, 65, 65, 33, 49, 49, 49, 49, 49, 65, 240, + 32, 11, 3, 240, 98, 113, 33, 33, 33, 33, 240, 32, + 12, 3, 240, 97, 49, 65, 33, 33, 33, 33, 49, 208, + 14, 5, 240, 240, 161, 33, 113, 65, 65, 65, 65, 81, + 240, 112, 16, 7, 0, 8, 3, 209, 113, 49, 49, 17, + 65, 18, 34, 50, 240, 144, 22, 7, 0, 6, 33, 49, + 17, 17, 17, 81, 81, 68, 50, 33, 34, 33, 34, 49, + 33, 240, 240, 48, 16, 7, 0, 7, 33, 113, 193, 81, + 81, 97, 65, 18, 34, 50, 240, 144, 16, 7, 0, 7, + 33, 209, 81, 81, 97, 65, 18, 34, 50, 240, 240, 16, + 17, 7, 0, 6, 50, 240, 65, 81, 81, 97, 65, 18, + 34, 50, 240, 240, 16, 21, 8, 0, 8, 33, 49, 18, + 17, 17, 97, 97, 97, 97, 49, 49, 65, 34, 34, 66, + 240, 192, 17, 7, 0, 7, 17, 33, 177, 81, 81, 65, + 17, 65, 18, 49, 51, 240, 240, 11, 8, 0, 7, 49, + 199, 240, 81, 0, 7, 64, 20, 7, 0, 7, 65, 97, + 66, 65, 17, 49, 17, 65, 17, 33, 18, 34, 35, 240, + 240, 16, 16, 7, 0, 7, 33, 113, 161, 97, 65, 17, + 65, 33, 34, 51, 240, 240, 16, 7, 0, 7, 49, 240, + 33, 97, 65, 17, 65, 33, 34, 51, 240, 240, 16, 7, + 0, 7, 34, 240, 33, 97, 65, 17, 65, 33, 34, 51, + 240, 240, 18, 7, 0, 8, 1, 33, 145, 65, 17, 65, + 17, 65, 18, 33, 51, 240, 240, 16, 16, 7, 0, 8, + 33, 241, 17, 49, 49, 33, 67, 81, 97, 97, 97, 160, + 19, 6, 240, 149, 17, 81, 81, 84, 33, 49, 17, 49, + 20, 33, 81, 81, 84, 240, 176, 17, 7, 0, 8, 1, + 17, 241, 17, 49, 49, 33, 67, 81, 97, 97, 97, 160,}; + +//***************************************************************************** +// +// The glyph offset table for the 16 point Handwriting font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetHandwriting16[] = +{ + 0, 4, 18, 26, 56, 89, 118, 150, + 157, 176, 192, 200, 217, 225, 233, 238, + 257, 287, 302, 327, 348, 376, 399, 420, + 438, 465, 493, 501, 508, 524, 534, 550, + 570, 613, 642, 669, 689, 718, 741, 762, + 787, 819, 835, 855, 883, 904, 940, 974, + 1005, 1027, 1057, 1085, 1106, 1126, 1154, 1178, + 1216, 1242, 1264, 1289, 1310, 1328, 1347, 1361, + 1368, 1375, 1393, 1413, 1426, 1452, 1467, 1486, + 1504, 1526, 1538, 1554, 1577, 1593, 1613, 1629, + 1644, 1660, 1679, 1694, 1707, 1727, 1740, 1755, + 1773, 1787, 1802, 1816, 1836, 1852, 1872, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1885, 1899, 1922, 1943, 1956, 1983, 1995, + 2021, 2030, 2058, 2069, 2092, 2105, 2113, 2146, + 2154, 2165, 2182, 2196, 2207, 2214, 2239, 2267, + 2276, 2284, 2293, 2304, 2332, 2361, 2388, 2420, + 2439, 2466, 2494, 2519, 2545, 2571, 2596, 2625, + 2646, 2668, 2689, 2712, 2735, 2750, 2764, 2780, + 2796, 2825, 2858, 2886, 2914, 2942, 2970, 2998, + 3016, 3053, 3081, 3108, 3137, 3166, 3188, 3207, + 3236, 3254, 3271, 3288, 3307, 3325, 3343, 3365, + 3379, 3394, 3411, 3428, 3442, 3457, 3468, 3480, + 3494, 3510, 3532, 3548, 3564, 3581, 3602, 3619, + 3630, 3650, 3666, 3682, 3698, 3716, 3732, 3751, +}; + +//***************************************************************************** +// +// The font definition for the 16 point Handwriting font. +// +//***************************************************************************** +const tFontEx g_sFontExHandwriting16 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 15, + + // + // The height of the font. + // + 20, + + // + // The baseline of the font. + // + 16, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetHandwriting16, + + // + // A pointer to the actual font data + // + g_pui8Handwriting16Data +}; diff --git a/third_party/fonts/ofl/fonts/fonthandwriting18.c b/third_party/fonts/ofl/fonts/fonthandwriting18.c new file mode 100644 index 0000000..f35711d --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthandwriting18.c @@ -0,0 +1,585 @@ +//***************************************************************************** +// +// fonthandwriting18.c - Font definition for the 18pt Handwriting font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://helloalan.com/projects/breip/ +// +// This Font Software is Copyright (c) 2008, Alan Hussey and Adam Breipohl. +// All Rights Reserved. +// +// "Breip" is a Reserved Font Name for this Font Software. +// +// This Font Software is licensed under the SIL Open Font License, +// Version 1.0. No modification of the license is permitted, only verbatim +// copy is allowed. This license is copied below, and is also available with +// a FAQ at: http://scripts.sil.org/OFL +// ------------------------------------------------------------------------ +// +// SIL OPEN FONT LICENSE +// +// Version 1.0 - 22 November 2005 +// PREAMBLE +// +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of cooperative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide an open +// framework in which fonts may be shared and improved in partnership with +// others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and sold with any software provided that the font names of +// derivative works are changed. The fonts and derivatives, however, cannot +// be released under any other type of license. +// +// DEFINITIONS +// +// "Font Software" refers to any and all of the following: +// +// * font files +// * data files +// * source code +// * build scripts +// * documentation +// +// "Reserved Font Name" refers to the Font Software name as seen by users +// and any other names as specified after the copyright statement. +// +// "Standard Version" refers to the collection of Font Software components +// as distributed by the Copyright Holder. +// +// "Modified Version" refers to any derivative font software made by adding +// to, deleting, or substituting -- in part or in whole -- any of the +// components of the Standard Version, by changing formats or by porting +// the Font Software to a new environment. +// +// "Author" refers to any designer, engineer, programmer, technical writer +// or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, in +// Standard or Modified Versions, may be sold by itself. +// +// 2) Standard or Modified Versions of the Font Software may be bundled, +// redistributed and sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or in +// the appropriate machine-readable metadata fields within text or binary +// files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s), in part or in whole, unless explicit written permission is +// granted by the Copyright Holder. This restriction applies to all +// references stored in the Font Software, such as the font menu name and +// other font description fields, which are used to differentiate the font +// from others. +// +// 4) The name(s) of the Copyright Holder or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any Modified +// Version, except to acknowledge the contribution(s) of the Copyright Holder +// and the Author(s) or with their explicit written permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, must +// be distributed using this license, and may not be distributed under any +// other license. +// +// TERMINATION +// +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER +// DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: handwriting +// Size: 18 point +// Bold: no +// Italic: no +// Memory usage: 4440 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 18 point Handwriting font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Handwriting18Data[4240] = +{ + 5, 7, 0, 19, 32, 16, 3, 113, 33, 33, 18, 18, + 18, 18, 17, 33, 129, 33, 33, 240, 80, 13, 4, 129, + 49, 17, 17, 17, 17, 17, 49, 0, 7, 80, 30, 13, + 240, 193, 194, 81, 97, 81, 75, 65, 81, 97, 81, 97, + 81, 97, 81, 97, 81, 74, 81, 81, 18, 49, 97, 81, + 97, 0, 11, 96, 37, 10, 240, 97, 49, 81, 35, 82, + 17, 82, 33, 65, 17, 33, 65, 17, 33, 65, 17, 33, + 87, 65, 33, 33, 49, 33, 33, 49, 50, 69, 66, 49, + 161, 145, 0, 6, 64, 32, 13, 240, 240, 147, 17, 33, + 99, 49, 177, 193, 177, 193, 193, 177, 51, 97, 33, 129, + 49, 49, 65, 49, 49, 65, 50, 17, 65, 97, 0, 10, + 16, 37, 12, 240, 163, 129, 49, 113, 49, 113, 49, 113, + 49, 129, 17, 162, 65, 97, 65, 98, 33, 97, 33, 17, + 97, 50, 81, 81, 81, 65, 17, 65, 65, 34, 52, 0, + 8, 32, 8, 2, 97, 17, 17, 240, 240, 48, 22, 7, + 240, 50, 65, 81, 97, 81, 97, 97, 81, 97, 97, 97, + 113, 97, 97, 49, 51, 240, 240, 112, 19, 4, 129, 49, + 65, 49, 49, 65, 49, 49, 49, 49, 49, 33, 49, 49, + 33, 240, 128, 9, 3, 113, 33, 18, 33, 0, 6, 16, + 19, 9, 240, 225, 145, 129, 130, 114, 129, 72, 81, 129, + 129, 129, 129, 129, 0, 7, 32, 8, 2, 240, 209, 17, + 17, 17, 144, 8, 8, 0, 9, 7, 0, 12, 16, 6, + 2, 240, 241, 17, 176, 20, 10, 240, 209, 129, 130, 129, + 129, 145, 129, 129, 145, 129, 145, 129, 145, 129, 0, 8, + 80, 34, 14, 240, 240, 18, 177, 33, 145, 49, 145, 193, + 177, 17, 177, 17, 177, 17, 177, 17, 177, 17, 177, 33, + 145, 49, 130, 65, 98, 82, 66, 132, 0, 9, 64, 17, + 2, 65, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 208, 29, 15, 240, 240, 50, 193, 33, 146, + 49, 225, 225, 209, 225, 225, 129, 81, 98, 97, 81, 129, + 65, 145, 49, 161, 33, 194, 0, 12, 32, 23, 12, 240, + 198, 66, 82, 33, 129, 177, 161, 146, 163, 178, 178, 177, + 177, 177, 162, 82, 34, 130, 0, 8, 30, 14, 240, 240, + 66, 177, 17, 161, 33, 145, 49, 129, 65, 113, 81, 97, + 97, 50, 17, 97, 18, 72, 193, 209, 209, 209, 209, 0, + 11, 32, 25, 8, 240, 68, 34, 97, 113, 113, 113, 113, + 19, 33, 17, 49, 33, 65, 113, 113, 113, 97, 113, 67, + 240, 240, 208, 24, 10, 240, 240, 81, 145, 129, 145, 129, + 129, 145, 129, 129, 145, 145, 82, 33, 113, 17, 98, 38, + 0, 6, 80, 21, 10, 240, 81, 167, 161, 145, 145, 129, + 145, 129, 145, 145, 129, 145, 129, 145, 145, 0, 6, 112, + 32, 8, 225, 113, 113, 65, 17, 50, 33, 33, 65, 33, + 49, 49, 49, 49, 33, 82, 97, 17, 81, 33, 49, 65, + 33, 49, 49, 34, 66, 240, 240, 240, 31, 11, 240, 164, + 82, 82, 33, 98, 17, 97, 17, 17, 97, 17, 33, 65, + 33, 34, 18, 49, 66, 65, 161, 161, 161, 161, 161, 161, + 0, 8, 48, 7, 2, 161, 17, 177, 240, 64, 10, 3, + 240, 145, 33, 240, 49, 33, 17, 224, 18, 10, 0, 6, + 1, 115, 98, 98, 98, 114, 147, 146, 146, 162, 146, 0, + 8, 112, 10, 9, 0, 7, 120, 240, 231, 0, 11, 48, + 18, 10, 240, 240, 161, 162, 147, 146, 162, 146, 114, 98, + 114, 114, 98, 0, 9, 96, 22, 9, 240, 84, 65, 65, + 33, 81, 33, 97, 17, 81, 33, 81, 114, 97, 0, 6, + 65, 0, 7, 48, 52, 16, 240, 240, 116, 162, 65, 129, + 113, 113, 113, 97, 65, 65, 81, 49, 17, 49, 33, 17, + 49, 97, 33, 17, 33, 81, 17, 33, 17, 33, 66, 17, + 33, 17, 17, 83, 49, 33, 17, 34, 81, 49, 34, 113, + 65, 145, 98, 97, 150, 0, 10, 80, 32, 9, 240, 113, + 114, 114, 97, 33, 81, 33, 81, 33, 81, 33, 65, 65, + 49, 65, 55, 33, 65, 49, 65, 33, 81, 33, 97, 17, + 97, 0, 5, 96, 30, 9, 240, 70, 33, 97, 33, 81, + 33, 65, 49, 34, 67, 97, 20, 49, 81, 33, 81, 33, + 81, 33, 81, 113, 113, 98, 97, 0, 6, 48, 21, 11, + 240, 209, 130, 129, 145, 145, 161, 145, 161, 161, 161, 161, + 161, 177, 98, 54, 0, 8, 80, 36, 10, 240, 83, 113, + 19, 81, 66, 49, 82, 33, 113, 17, 113, 17, 113, 17, + 113, 17, 113, 17, 97, 33, 97, 33, 97, 33, 17, 49, + 49, 17, 33, 114, 0, 6, 112, 24, 10, 240, 113, 151, + 49, 145, 129, 145, 145, 67, 18, 34, 65, 145, 145, 97, + 33, 97, 35, 20, 53, 0, 8, 24, 12, 240, 240, 20, + 39, 81, 177, 177, 177, 98, 49, 21, 81, 177, 177, 177, + 177, 162, 161, 177, 0, 8, 112, 27, 11, 240, 240, 113, + 145, 145, 146, 145, 161, 145, 161, 129, 17, 129, 17, 129, + 17, 129, 17, 129, 33, 82, 69, 0, 7, 48, 36, 11, + 240, 113, 82, 49, 82, 49, 97, 49, 97, 49, 97, 49, + 82, 49, 50, 17, 49, 34, 33, 51, 81, 33, 113, 33, + 113, 33, 113, 33, 113, 33, 129, 0, 8, 48, 19, 3, + 97, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 49, 33, 240, 16, 22, 11, 240, 180, 53, 240, 67, + 162, 178, 177, 161, 162, 145, 161, 49, 82, 65, 50, 100, + 0, 8, 96, 32, 12, 240, 145, 177, 177, 113, 49, 98, + 49, 82, 65, 66, 81, 50, 97, 49, 113, 34, 113, 33, + 129, 34, 113, 50, 97, 85, 33, 177, 0, 8, 96, 22, + 12, 240, 145, 177, 177, 177, 177, 177, 177, 177, 177, 193, + 177, 193, 98, 66, 35, 100, 0, 9, 64, 40, 15, 0, + 5, 113, 225, 114, 82, 82, 17, 49, 17, 81, 33, 49, + 17, 81, 33, 49, 17, 65, 49, 49, 33, 34, 49, 33, + 52, 81, 17, 193, 17, 193, 17, 193, 17, 193, 17, 0, + 13, 38, 18, 0, 8, 82, 66, 162, 66, 162, 67, 145, + 81, 17, 145, 81, 17, 145, 81, 18, 114, 81, 33, 113, + 97, 33, 98, 82, 49, 66, 97, 70, 113, 114, 114, 242, + 0, 13, 32, 33, 14, 240, 49, 178, 193, 98, 65, 145, + 34, 146, 17, 177, 17, 177, 17, 177, 17, 177, 17, 177, + 33, 145, 49, 145, 50, 113, 82, 66, 132, 0, 11, 32, + 25, 7, 228, 49, 49, 33, 65, 17, 50, 17, 49, 33, + 33, 51, 65, 97, 97, 97, 97, 97, 98, 82, 240, 240, + 160, 34, 13, 240, 240, 17, 178, 162, 162, 177, 177, 129, + 49, 129, 34, 145, 17, 145, 33, 145, 33, 81, 34, 33, + 81, 18, 50, 67, 83, 20, 116, 34, 0, 8, 48, 30, + 12, 240, 167, 65, 97, 65, 81, 81, 65, 97, 49, 113, + 49, 113, 34, 113, 34, 113, 50, 97, 67, 65, 115, 17, + 177, 177, 0, 10, 48, 23, 10, 240, 193, 115, 67, 98, + 113, 145, 162, 146, 162, 147, 146, 145, 49, 66, 49, 50, + 68, 0, 6, 96, 20, 10, 240, 194, 68, 52, 145, 145, + 145, 146, 145, 145, 146, 145, 145, 161, 145, 0, 7, 112, + 29, 15, 0, 7, 81, 225, 177, 33, 177, 33, 177, 18, + 177, 33, 177, 33, 162, 33, 161, 50, 145, 65, 129, 97, + 82, 134, 0, 11, 112, 27, 16, 0, 9, 97, 225, 33, + 193, 34, 161, 65, 146, 66, 129, 97, 113, 114, 82, 129, + 81, 146, 50, 161, 34, 195, 0, 13, 44, 17, 0, 8, + 17, 240, 17, 240, 17, 240, 33, 115, 97, 17, 81, 18, + 81, 17, 66, 34, 65, 17, 65, 65, 65, 17, 65, 81, + 49, 33, 49, 82, 33, 33, 49, 97, 33, 33, 33, 116, + 51, 130, 0, 13, 30, 9, 240, 193, 97, 18, 81, 33, + 66, 34, 49, 65, 34, 83, 98, 114, 113, 17, 82, 18, + 65, 49, 50, 65, 33, 81, 33, 0, 6, 64, 24, 12, + 240, 240, 65, 177, 162, 18, 113, 50, 97, 82, 50, 116, + 177, 162, 161, 177, 162, 161, 177, 0, 9, 80, 34, 19, + 0, 7, 102, 135, 49, 240, 34, 240, 18, 240, 33, 240, + 34, 240, 33, 240, 34, 240, 33, 240, 49, 240, 34, 240, + 34, 131, 114, 23, 165, 0, 12, 96, 22, 10, 240, 194, + 38, 65, 145, 145, 145, 145, 129, 145, 145, 145, 145, 145, + 145, 35, 69, 0, 6, 112, 17, 9, 240, 193, 145, 129, + 145, 145, 129, 145, 129, 145, 145, 129, 145, 0, 8, 21, + 9, 240, 55, 129, 129, 129, 129, 129, 129, 129, 145, 129, + 129, 129, 129, 129, 39, 0, 5, 96, 14, 6, 145, 66, + 49, 17, 49, 17, 33, 33, 97, 0, 11, 48, 8, 8, + 0, 16, 7, 240, 240, 176, 7, 4, 129, 66, 0, 9, + 16, 19, 8, 0, 11, 33, 97, 97, 35, 33, 33, 17, + 33, 17, 33, 34, 65, 240, 240, 176, 24, 7, 240, 97, + 97, 97, 97, 97, 97, 97, 97, 33, 49, 50, 17, 65, + 17, 49, 49, 33, 51, 240, 240, 240, 15, 6, 0, 7, + 18, 49, 65, 66, 65, 81, 97, 99, 240, 240, 16, 29, + 10, 240, 178, 130, 130, 130, 145, 145, 145, 145, 65, 65, + 49, 81, 33, 97, 33, 82, 33, 82, 34, 34, 17, 52, + 49, 0, 6, 48, 16, 11, 0, 13, 3, 113, 33, 97, + 34, 54, 129, 161, 161, 182, 0, 7, 19, 9, 240, 240, + 134, 49, 129, 129, 129, 129, 102, 97, 129, 129, 129, 129, + 0, 7, 48, 20, 8, 0, 9, 33, 97, 97, 113, 113, + 113, 51, 35, 33, 113, 113, 97, 81, 17, 82, 176, 24, + 11, 0, 9, 81, 161, 161, 161, 177, 161, 51, 65, 33, + 33, 65, 33, 49, 49, 17, 65, 66, 81, 0, 7, 14, + 3, 240, 65, 33, 113, 33, 33, 33, 33, 33, 49, 240, + 16, 18, 8, 0, 7, 49, 97, 240, 130, 113, 129, 129, + 129, 113, 113, 113, 113, 22, 160, 24, 8, 240, 17, 113, + 113, 113, 113, 113, 65, 33, 49, 49, 18, 67, 82, 97, + 114, 103, 33, 113, 0, 5, 96, 19, 3, 97, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 49, 33, + 240, 16, 22, 9, 0, 10, 97, 81, 17, 17, 49, 17, + 33, 34, 65, 34, 65, 34, 81, 18, 129, 0, 6, 64, + 18, 8, 0, 10, 49, 84, 50, 33, 50, 49, 34, 49, + 34, 65, 33, 0, 5, 96, 16, 8, 0, 11, 34, 81, + 113, 49, 33, 81, 18, 65, 37, 240, 240, 192, 19, 5, + 0, 7, 2, 33, 33, 17, 33, 17, 33, 17, 17, 34, + 49, 65, 65, 65, 144, 21, 10, 0, 12, 98, 113, 129, + 145, 49, 81, 49, 81, 34, 98, 17, 145, 145, 145, 49, + 84, 192, 17, 7, 0, 7, 20, 34, 49, 17, 97, 97, + 97, 97, 97, 97, 240, 240, 176, 15, 6, 0, 7, 17, + 50, 49, 82, 98, 97, 65, 50, 240, 240, 48, 19, 9, + 240, 240, 113, 129, 129, 130, 129, 129, 134, 19, 130, 129, + 129, 129, 0, 7, 48, 17, 7, 0, 9, 81, 97, 65, + 17, 65, 17, 65, 18, 33, 51, 240, 240, 128, 19, 6, + 0, 7, 33, 81, 81, 17, 33, 33, 33, 49, 17, 49, + 17, 50, 240, 240, 48, 22, 9, 0, 12, 49, 81, 33, + 81, 33, 34, 33, 17, 33, 18, 33, 17, 34, 50, 49, + 0, 5, 112, 15, 6, 0, 7, 65, 49, 17, 33, 50, + 66, 66, 97, 240, 240, 128, 16, 8, 0, 12, 97, 17, + 81, 33, 49, 68, 113, 97, 113, 113, 97, 192, 16, 9, + 0, 11, 99, 51, 33, 33, 65, 129, 113, 129, 132, 0, + 5, 96, 20, 11, 240, 151, 65, 161, 161, 161, 130, 145, + 178, 162, 161, 161, 161, 161, 161, 167, 0, 7, 18, 2, + 65, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 176, 22, 9, 240, 54, 129, 129, 129, 129, + 129, 130, 145, 129, 98, 113, 129, 129, 49, 35, 51, 0, + 6, 48, 12, 8, 0, 9, 18, 81, 33, 33, 82, 0, + 10, 32, 17, 3, 113, 33, 129, 33, 33, 33, 33, 33, + 33, 18, 18, 18, 18, 240, 16, 25, 6, 225, 82, 66, + 65, 17, 50, 49, 17, 49, 17, 33, 33, 33, 49, 33, + 33, 51, 81, 81, 81, 240, 240, 112, 24, 13, 240, 35, + 145, 49, 113, 193, 193, 193, 209, 193, 181, 145, 193, 193, + 193, 149, 131, 33, 214, 0, 8, 32, 16, 8, 0, 8, + 6, 50, 17, 68, 66, 18, 33, 18, 33, 0, 9, 16, + 30, 13, 240, 240, 68, 19, 97, 65, 113, 81, 81, 113, + 65, 113, 65, 129, 33, 145, 33, 150, 145, 165, 161, 193, + 240, 147, 210, 0, 6, 112, 14, 2, 65, 17, 17, 17, + 17, 17, 81, 17, 17, 17, 17, 240, 28, 10, 240, 193, + 99, 83, 82, 129, 18, 97, 49, 98, 34, 83, 18, 98, + 17, 131, 130, 145, 49, 66, 49, 50, 83, 0, 6, 96, + 9, 7, 225, 65, 18, 34, 0, 15, 112, 32, 12, 240, + 240, 194, 130, 145, 161, 161, 49, 97, 49, 113, 33, 97, + 17, 33, 97, 17, 33, 97, 17, 51, 33, 33, 129, 49, + 97, 86, 0, 9, 64, 12, 6, 240, 50, 65, 18, 34, + 33, 18, 0, 11, 96, 27, 12, 0, 8, 17, 50, 81, + 50, 66, 49, 82, 34, 82, 49, 98, 50, 113, 50, 113, + 50, 113, 50, 113, 50, 0, 10, 80, 14, 9, 0, 7, + 119, 129, 145, 129, 129, 129, 129, 0, 9, 16, 8, 7, + 0, 7, 118, 0, 10, 80, 36, 12, 240, 242, 130, 145, + 161, 34, 97, 18, 17, 81, 33, 17, 97, 34, 81, 17, + 33, 17, 65, 17, 33, 33, 49, 17, 33, 51, 33, 33, + 81, 49, 97, 86, 0, 11, 8, 7, 240, 240, 86, 0, + 14, 16, 13, 7, 240, 17, 81, 81, 65, 17, 65, 36, + 0, 13, 48, 18, 8, 240, 240, 193, 113, 129, 113, 70, + 81, 113, 113, 113, 240, 87, 240, 240, 176, 16, 8, 240, + 19, 113, 113, 97, 65, 33, 49, 49, 18, 81, 0, 13, + 80, 11, 6, 196, 81, 65, 98, 81, 65, 0, 10, 96, + 7, 4, 146, 17, 0, 9, 48, 28, 13, 0, 10, 97, + 97, 81, 97, 97, 66, 97, 66, 97, 66, 83, 49, 17, + 50, 17, 33, 51, 65, 17, 161, 17, 0, 11, 32, 32, + 13, 240, 203, 240, 65, 33, 83, 17, 33, 65, 65, 33, + 65, 65, 33, 65, 65, 33, 85, 33, 145, 33, 145, 209, + 193, 193, 193, 166, 0, 8, 64, 9, 4, 240, 240, 99, + 18, 0, 5, 96, 10, 3, 240, 240, 145, 49, 33, 18, + 240, 16, 10, 2, 65, 17, 17, 17, 17, 17, 240, 224, + 13, 7, 240, 17, 81, 81, 65, 17, 65, 36, 0, 13, + 48, 31, 13, 0, 6, 66, 50, 114, 50, 114, 50, 129, + 65, 129, 65, 129, 50, 82, 50, 97, 50, 97, 50, 97, + 50, 97, 50, 97, 65, 0, 10, 80, 36, 11, 240, 129, + 97, 49, 81, 65, 65, 81, 65, 81, 49, 97, 49, 145, + 145, 34, 97, 17, 17, 81, 17, 33, 82, 49, 17, 33, + 37, 33, 97, 161, 161, 0, 7, 32, 32, 10, 240, 240, + 17, 65, 65, 49, 81, 49, 81, 33, 97, 17, 113, 17, + 114, 130, 129, 19, 65, 65, 65, 49, 145, 49, 81, 33, + 99, 0, 6, 80, 38, 13, 240, 179, 81, 97, 65, 113, + 65, 97, 65, 129, 33, 145, 33, 145, 17, 145, 33, 34, + 113, 33, 17, 113, 17, 33, 99, 49, 33, 33, 39, 49, + 97, 193, 193, 0, 8, 80, 22, 8, 240, 178, 240, 240, + 242, 82, 97, 81, 17, 81, 17, 81, 17, 81, 18, 34, + 67, 240, 240, 208, 30, 8, 240, 81, 97, 114, 81, 17, + 81, 17, 81, 17, 65, 49, 49, 49, 49, 49, 54, 33, + 49, 33, 81, 17, 81, 17, 81, 0, 6, 16, 31, 9, + 209, 113, 129, 130, 97, 17, 97, 17, 97, 33, 81, 33, + 65, 49, 65, 49, 65, 49, 71, 33, 65, 33, 81, 33, + 81, 33, 0, 6, 80, 29, 8, 240, 65, 97, 240, 17, + 98, 97, 17, 81, 17, 65, 33, 65, 33, 65, 49, 54, + 17, 65, 33, 65, 33, 65, 33, 0, 5, 112, 32, 8, + 240, 34, 49, 17, 33, 17, 97, 97, 98, 97, 17, 65, + 33, 65, 33, 65, 33, 65, 33, 70, 17, 65, 33, 65, + 33, 65, 33, 0, 5, 112, 33, 8, 240, 49, 18, 209, + 97, 17, 81, 17, 81, 17, 81, 17, 65, 49, 49, 49, + 49, 49, 54, 33, 49, 33, 81, 17, 81, 17, 81, 113, + 240, 240, 48, 29, 8, 240, 50, 99, 82, 113, 98, 97, + 17, 81, 17, 65, 33, 65, 33, 65, 49, 54, 17, 65, + 33, 65, 33, 65, 33, 0, 5, 112, 33, 15, 0, 6, + 56, 97, 17, 193, 17, 177, 33, 177, 33, 161, 49, 161, + 55, 65, 49, 150, 145, 65, 129, 81, 129, 81, 129, 81, + 113, 103, 0, 9, 64, 22, 10, 240, 240, 65, 114, 113, + 145, 129, 145, 145, 145, 145, 161, 82, 53, 113, 145, 145, + 0, 6, 112, 25, 9, 240, 97, 146, 65, 129, 21, 33, + 129, 129, 113, 66, 33, 34, 65, 129, 129, 81, 33, 66, + 52, 0, 7, 32, 26, 8, 240, 113, 82, 177, 20, 33, + 20, 33, 113, 113, 97, 66, 17, 34, 49, 113, 113, 81, + 17, 66, 37, 240, 240, 192, 25, 8, 240, 194, 97, 17, + 177, 20, 33, 34, 49, 113, 113, 97, 50, 33, 33, 65, + 113, 113, 66, 36, 240, 240, 208, 25, 9, 240, 240, 49, + 209, 20, 49, 34, 65, 113, 129, 129, 66, 18, 34, 49, + 129, 129, 97, 18, 66, 37, 0, 6, 18, 3, 97, 81, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 49, + 240, 16, 19, 3, 65, 17, 81, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 49, 240, 16, 19, 4, 145, + 33, 17, 33, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 65, 240, 160, 19, 5, 161, 33, 113, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 81, 65, 240, 192, 34, + 14, 0, 5, 98, 193, 19, 145, 51, 113, 82, 97, 97, + 97, 113, 21, 98, 81, 97, 97, 97, 97, 97, 97, 81, + 114, 65, 97, 33, 33, 178, 0, 9, 48, 40, 15, 240, + 240, 177, 115, 49, 129, 35, 240, 49, 65, 145, 50, 145, + 49, 17, 129, 49, 17, 114, 49, 17, 113, 65, 33, 97, + 65, 33, 81, 81, 34, 50, 66, 68, 81, 209, 0, 11, + 16, 30, 12, 240, 241, 240, 66, 145, 97, 65, 113, 33, + 145, 17, 145, 17, 145, 17, 145, 17, 145, 17, 129, 49, + 113, 65, 81, 101, 0, 9, 64, 30, 12, 240, 226, 240, + 66, 145, 97, 65, 113, 33, 145, 17, 145, 17, 145, 17, + 145, 17, 145, 17, 129, 49, 113, 65, 81, 101, 0, 9, + 64, 30, 12, 240, 225, 178, 240, 66, 145, 97, 65, 113, + 33, 145, 17, 145, 17, 145, 17, 145, 17, 145, 33, 113, + 49, 113, 65, 81, 101, 0, 8, 33, 12, 240, 17, 161, + 17, 33, 146, 98, 145, 97, 65, 113, 33, 145, 17, 145, + 17, 145, 17, 145, 17, 145, 33, 113, 49, 113, 65, 81, + 101, 0, 9, 64, 31, 12, 225, 177, 82, 240, 18, 145, + 97, 65, 113, 33, 145, 17, 145, 17, 145, 17, 145, 17, + 145, 33, 113, 49, 113, 65, 81, 101, 0, 9, 64, 20, + 7, 240, 240, 193, 65, 33, 33, 65, 17, 66, 82, 81, + 17, 49, 49, 97, 0, 7, 16, 41, 13, 240, 240, 178, + 65, 81, 83, 49, 81, 49, 33, 81, 65, 17, 65, 81, + 17, 65, 81, 17, 49, 97, 17, 33, 113, 17, 33, 113, + 17, 17, 113, 50, 113, 50, 82, 82, 35, 130, 0, 9, + 31, 13, 240, 241, 209, 240, 240, 49, 161, 17, 161, 17, + 161, 17, 161, 17, 161, 17, 161, 17, 145, 49, 129, 50, + 97, 82, 50, 131, 0, 8, 112, 32, 13, 240, 240, 34, + 161, 240, 240, 49, 161, 17, 161, 17, 161, 17, 161, 17, + 161, 17, 161, 17, 145, 49, 129, 49, 113, 81, 66, 116, + 0, 8, 112, 33, 13, 240, 240, 17, 177, 17, 240, 240, + 33, 161, 17, 161, 17, 161, 17, 161, 17, 161, 17, 161, + 17, 145, 49, 129, 50, 97, 82, 50, 131, 0, 8, 112, + 33, 14, 240, 240, 18, 50, 194, 240, 65, 209, 161, 18, + 161, 17, 177, 17, 177, 17, 177, 33, 161, 33, 145, 50, + 129, 65, 113, 97, 66, 132, 0, 9, 64, 24, 11, 240, + 193, 145, 241, 17, 129, 33, 97, 65, 81, 83, 18, 130, + 161, 161, 145, 161, 161, 145, 0, 8, 112, 23, 7, 240, + 102, 17, 97, 97, 101, 33, 65, 17, 65, 17, 65, 21, + 33, 97, 97, 97, 102, 240, 240, 96, 34, 9, 240, 55, + 33, 97, 17, 97, 17, 82, 17, 51, 33, 34, 65, 33, + 81, 35, 49, 81, 33, 81, 33, 97, 17, 97, 17, 17, + 49, 49, 50, 68, 0, 6, 23, 8, 0, 7, 65, 240, + 97, 97, 113, 33, 49, 33, 17, 33, 17, 33, 33, 17, + 49, 33, 0, 5, 96, 20, 7, 0, 7, 49, 240, 65, + 81, 81, 34, 33, 17, 17, 33, 17, 33, 18, 240, 240, + 160, 21, 7, 0, 6, 65, 81, 240, 81, 81, 81, 34, + 33, 17, 17, 33, 17, 33, 18, 240, 240, 160, 21, 7, + 0, 7, 3, 33, 66, 177, 81, 81, 34, 33, 17, 17, + 33, 17, 33, 18, 240, 240, 160, 18, 7, 0, 9, 113, + 81, 81, 34, 33, 17, 17, 33, 17, 33, 18, 240, 240, + 160, 19, 8, 0, 6, 49, 99, 82, 240, 225, 97, 34, + 49, 17, 17, 50, 50, 0, 6, 16, 25, 13, 0, 15, + 81, 162, 17, 81, 33, 34, 65, 36, 97, 19, 113, 17, + 18, 113, 17, 17, 22, 18, 49, 0, 9, 16, 6, 0, + 7, 97, 65, 65, 81, 81, 82, 18, 34, 81, 81, 66, + 240, 17, 10, 0, 9, 33, 161, 240, 196, 81, 34, 53, + 113, 145, 166, 0, 6, 48, 19, 10, 0, 8, 1, 129, + 240, 242, 113, 33, 81, 33, 69, 97, 161, 166, 0, 6, + 48, 19, 10, 0, 8, 2, 130, 240, 212, 81, 49, 65, + 34, 53, 113, 145, 166, 0, 6, 48, 16, 10, 0, 13, + 3, 97, 33, 81, 34, 53, 113, 145, 166, 0, 6, 48, + 14, 4, 240, 145, 66, 161, 49, 49, 49, 49, 49, 65, + 240, 96, 14, 3, 240, 65, 17, 129, 33, 33, 33, 33, + 33, 49, 240, 16, 14, 4, 240, 226, 17, 129, 49, 49, + 49, 49, 49, 65, 240, 96, 15, 4, 240, 240, 33, 17, + 97, 49, 49, 49, 49, 49, 65, 240, 96, 17, 8, 0, + 9, 34, 241, 130, 49, 49, 33, 81, 17, 65, 52, 240, + 240, 208, 22, 8, 0, 7, 33, 82, 17, 33, 82, 210, + 66, 33, 50, 33, 50, 49, 34, 49, 49, 240, 240, 240, + 18, 8, 0, 8, 33, 130, 210, 81, 97, 65, 33, 81, + 18, 50, 51, 240, 240, 208, 19, 8, 0, 7, 65, 97, + 240, 114, 81, 97, 65, 33, 81, 17, 66, 36, 240, 240, + 208, 19, 8, 0, 7, 49, 97, 240, 130, 81, 97, 65, + 33, 81, 17, 66, 36, 240, 240, 208, 22, 8, 0, 7, + 17, 65, 17, 17, 33, 82, 210, 81, 97, 65, 33, 65, + 33, 65, 52, 240, 240, 208, 19, 8, 0, 8, 33, 33, + 240, 82, 81, 97, 65, 33, 81, 17, 81, 37, 240, 240, + 192, 12, 9, 0, 7, 18, 240, 120, 240, 113, 0, 10, + 96, 23, 8, 0, 8, 81, 113, 97, 83, 65, 17, 65, + 33, 17, 33, 17, 49, 17, 17, 49, 37, 240, 240, 192, + 19, 7, 0, 7, 17, 240, 65, 97, 65, 17, 65, 17, + 65, 17, 49, 52, 240, 240, 112, 19, 7, 0, 7, 33, + 81, 193, 97, 65, 17, 65, 17, 65, 18, 33, 51, 240, + 240, 128, 20, 7, 0, 7, 33, 81, 17, 161, 97, 65, + 17, 65, 17, 65, 18, 33, 51, 240, 240, 128, 19, 8, + 0, 8, 17, 162, 161, 113, 81, 17, 81, 17, 66, 18, + 34, 67, 240, 240, 208, 19, 7, 0, 8, 33, 81, 240, + 17, 17, 65, 34, 33, 66, 97, 97, 97, 81, 240, 32, + 21, 6, 240, 148, 33, 81, 81, 85, 17, 49, 17, 49, + 20, 33, 81, 81, 81, 85, 240, 240, 16, 19, 7, 0, + 8, 1, 33, 240, 97, 17, 65, 33, 49, 51, 97, 97, + 97, 81, 240, 32, +}; + +//***************************************************************************** +// +// The glyph offset table for the 18 point Handwriting font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetHandwriting18[] = +{ + 0, 5, 21, 34, 64, 101, 133, 170, + 178, 200, 219, 228, 247, 255, 263, 269, + 289, 323, 340, 369, 392, 422, 447, 471, + 492, 524, 555, 562, 572, 590, 600, 618, + 640, 692, 724, 754, 775, 811, 835, 859, + 886, 922, 941, 963, 995, 1017, 1057, 1095, + 1128, 1153, 1187, 1217, 1240, 1260, 1289, 1316, + 1360, 1390, 1414, 1448, 1470, 1487, 1508, 1522, + 1530, 1537, 1556, 1580, 1595, 1624, 1640, 1659, + 1679, 1703, 1717, 1735, 1759, 1778, 1800, 1818, + 1834, 1853, 1874, 1891, 1906, 1925, 1942, 1961, + 1983, 1998, 2014, 2030, 2050, 2068, 2090, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2102, 2119, 2144, 2168, 2184, 2214, 2228, + 2256, 2265, 2297, 2309, 2336, 2350, 2358, 2394, + 2402, 2415, 2433, 2449, 2460, 2467, 2495, 2527, + 2536, 2546, 2556, 2569, 2600, 2636, 2668, 2706, + 2728, 2758, 2789, 2818, 2850, 2883, 2912, 2945, + 2967, 2992, 3018, 3043, 3068, 3086, 3105, 3124, + 3143, 3177, 3217, 3247, 3277, 3307, 3340, 3371, + 3391, 3432, 3463, 3495, 3528, 3561, 3585, 3608, + 3642, 3665, 3685, 3706, 3727, 3745, 3764, 3789, + 3805, 3822, 3841, 3860, 3876, 3890, 3904, 3918, + 3933, 3950, 3972, 3990, 4009, 4028, 4050, 4069, + 4081, 4104, 4123, 4142, 4162, 4181, 4200, 4221, +}; + +//***************************************************************************** +// +// The font definition for the 18 point Handwriting font. +// +//***************************************************************************** +const tFontEx g_sFontExHandwriting18 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 17, + + // + // The height of the font. + // + 22, + + // + // The baseline of the font. + // + 17, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetHandwriting18, + + // + // A pointer to the actual font data + // + g_pui8Handwriting18Data +}; diff --git a/third_party/fonts/ofl/fonts/fonthandwriting20.c b/third_party/fonts/ofl/fonts/fonthandwriting20.c new file mode 100644 index 0000000..7a594a7 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthandwriting20.c @@ -0,0 +1,594 @@ +//***************************************************************************** +// +// fonthandwriting20.c - Font definition for the 20pt Handwriting font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://helloalan.com/projects/breip/ +// +// This Font Software is Copyright (c) 2008, Alan Hussey and Adam Breipohl. +// All Rights Reserved. +// +// "Breip" is a Reserved Font Name for this Font Software. +// +// This Font Software is licensed under the SIL Open Font License, +// Version 1.0. No modification of the license is permitted, only verbatim +// copy is allowed. This license is copied below, and is also available with +// a FAQ at: http://scripts.sil.org/OFL +// ------------------------------------------------------------------------ +// +// SIL OPEN FONT LICENSE +// +// Version 1.0 - 22 November 2005 +// PREAMBLE +// +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of cooperative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide an open +// framework in which fonts may be shared and improved in partnership with +// others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and sold with any software provided that the font names of +// derivative works are changed. The fonts and derivatives, however, cannot +// be released under any other type of license. +// +// DEFINITIONS +// +// "Font Software" refers to any and all of the following: +// +// * font files +// * data files +// * source code +// * build scripts +// * documentation +// +// "Reserved Font Name" refers to the Font Software name as seen by users +// and any other names as specified after the copyright statement. +// +// "Standard Version" refers to the collection of Font Software components +// as distributed by the Copyright Holder. +// +// "Modified Version" refers to any derivative font software made by adding +// to, deleting, or substituting -- in part or in whole -- any of the +// components of the Standard Version, by changing formats or by porting +// the Font Software to a new environment. +// +// "Author" refers to any designer, engineer, programmer, technical writer +// or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, in +// Standard or Modified Versions, may be sold by itself. +// +// 2) Standard or Modified Versions of the Font Software may be bundled, +// redistributed and sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or in +// the appropriate machine-readable metadata fields within text or binary +// files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s), in part or in whole, unless explicit written permission is +// granted by the Copyright Holder. This restriction applies to all +// references stored in the Font Software, such as the font menu name and +// other font description fields, which are used to differentiate the font +// from others. +// +// 4) The name(s) of the Copyright Holder or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any Modified +// Version, except to acknowledge the contribution(s) of the Copyright Holder +// and the Author(s) or with their explicit written permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, must +// be distributed using this license, and may not be distributed under any +// other license. +// +// TERMINATION +// +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER +// DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: handwriting +// Size: 20 point +// Bold: no +// Italic: no +// Memory usage: 4548 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 20 point Handwriting font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Handwriting20Data[4347] = +{ + 5, 9, 0, 24, 96, 17, 5, 178, 50, 50, 49, 50, + 50, 50, 49, 65, 225, 65, 65, 240, 240, 64, 13, 5, + 161, 65, 17, 33, 17, 33, 17, 65, 0, 9, 80, 33, + 15, 240, 240, 17, 225, 113, 98, 97, 92, 81, 97, 33, + 65, 97, 113, 97, 113, 97, 113, 97, 91, 97, 97, 18, + 50, 113, 81, 129, 81, 0, 12, 112, 37, 11, 240, 129, + 49, 97, 36, 82, 17, 98, 33, 81, 17, 33, 81, 17, + 33, 81, 17, 33, 103, 81, 33, 33, 65, 33, 33, 65, + 50, 85, 82, 49, 177, 161, 0, 7, 32, 35, 15, 240, + 240, 145, 83, 33, 33, 116, 49, 209, 225, 209, 225, 209, + 65, 145, 34, 17, 113, 49, 161, 33, 65, 97, 33, 65, + 81, 65, 33, 97, 82, 0, 11, 96, 37, 14, 240, 228, + 145, 49, 145, 49, 145, 49, 145, 49, 161, 33, 178, 81, + 113, 81, 114, 49, 113, 33, 33, 113, 51, 113, 81, 113, + 65, 17, 97, 65, 34, 84, 0, 9, 80, 7, 3, 145, + 33, 0, 6, 80, 22, 8, 240, 82, 81, 97, 97, 113, + 97, 113, 113, 113, 113, 113, 113, 113, 129, 33, 82, 240, + 240, 224, 20, 6, 193, 97, 97, 81, 81, 97, 81, 81, + 81, 81, 81, 65, 81, 81, 65, 240, 240, 64, 10, 6, + 209, 17, 50, 51, 65, 0, 12, 64, 20, 10, 240, 240, + 33, 146, 145, 146, 130, 130, 88, 97, 145, 145, 145, 145, + 145, 0, 8, 16, 9, 3, 240, 240, 193, 33, 33, 33, + 224, 8, 10, 0, 11, 40, 0, 15, 32, 8, 4, 0, + 7, 81, 34, 240, 112, 21, 12, 240, 240, 49, 161, 162, + 161, 161, 161, 177, 161, 161, 177, 161, 162, 161, 161, 0, + 10, 48, 33, 16, 240, 240, 82, 209, 33, 177, 49, 162, + 225, 193, 33, 193, 33, 193, 33, 193, 33, 193, 33, 193, + 34, 161, 65, 146, 66, 114, 98, 67, 148, 0, 11, 18, + 3, 97, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 240, 80, 32, 17, 240, 240, 114, 210, 33, + 177, 65, 240, 17, 240, 17, 241, 240, 17, 240, 17, 145, + 97, 114, 97, 113, 130, 66, 161, 49, 193, 33, 226, 0, + 14, 25, 14, 240, 240, 38, 83, 82, 49, 145, 194, 178, + 178, 180, 210, 210, 209, 209, 209, 194, 113, 35, 146, 0, + 9, 64, 30, 16, 240, 240, 146, 194, 17, 178, 33, 162, + 49, 145, 81, 129, 97, 113, 113, 50, 33, 113, 18, 89, + 225, 241, 241, 241, 241, 0, 12, 112, 26, 10, 240, 133, + 50, 129, 145, 145, 145, 145, 20, 49, 17, 65, 49, 81, + 145, 145, 129, 145, 65, 49, 99, 0, 6, 112, 24, 12, + 240, 240, 193, 161, 177, 161, 161, 177, 161, 161, 161, 177, + 65, 97, 83, 49, 129, 34, 97, 86, 0, 8, 21, 12, + 240, 145, 200, 193, 161, 177, 177, 161, 177, 161, 177, 161, + 177, 161, 177, 177, 0, 8, 48, 31, 10, 240, 33, 145, + 145, 97, 17, 82, 33, 50, 65, 49, 65, 65, 49, 97, + 33, 114, 131, 97, 49, 81, 65, 65, 49, 81, 33, 114, + 0, 7, 32, 14, 240, 240, 21, 114, 98, 65, 114, 49, + 113, 17, 49, 113, 17, 65, 81, 33, 81, 34, 49, 98, + 81, 209, 209, 209, 209, 209, 209, 225, 0, 9, 9, 3, + 241, 33, 240, 33, 33, 240, 176, 11, 4, 240, 240, 97, + 240, 145, 49, 34, 240, 48, 18, 11, 0, 6, 65, 131, + 99, 99, 99, 129, 163, 178, 162, 163, 162, 0, 9, 112, + 11, 10, 0, 8, 104, 240, 240, 40, 0, 12, 96, 18, + 12, 0, 6, 1, 194, 194, 194, 179, 178, 131, 130, 131, + 130, 130, 0, 11, 96, 22, 10, 240, 117, 65, 66, 33, + 97, 33, 97, 33, 97, 33, 97, 129, 129, 0, 7, 18, + 0, 8, 16, 54, 18, 240, 240, 181, 178, 81, 145, 114, + 113, 145, 113, 65, 65, 97, 65, 17, 49, 49, 33, 49, + 33, 49, 49, 33, 33, 81, 17, 49, 33, 17, 97, 17, + 49, 33, 17, 81, 18, 49, 33, 33, 34, 33, 49, 65, + 34, 129, 81, 161, 114, 113, 167, 0, 12, 32, 11, 240, + 177, 147, 129, 17, 129, 17, 113, 34, 97, 49, 97, 49, + 82, 49, 81, 66, 72, 49, 81, 65, 81, 50, 81, 49, + 97, 49, 0, 8, 16, 30, 11, 240, 120, 49, 113, 49, + 97, 49, 66, 65, 34, 99, 129, 35, 81, 81, 65, 97, + 49, 97, 49, 81, 145, 145, 130, 114, 0, 7, 112, 21, + 14, 0, 5, 99, 162, 177, 209, 193, 209, 193, 209, 209, + 209, 210, 210, 84, 70, 0, 11, 32, 35, 13, 240, 195, + 161, 20, 113, 67, 81, 98, 65, 114, 49, 129, 49, 129, + 49, 129, 49, 114, 49, 113, 65, 113, 50, 97, 66, 17, + 50, 65, 49, 18, 146, 0, 9, 26, 12, 240, 177, 177, + 22, 65, 177, 161, 177, 177, 82, 50, 35, 81, 177, 177, + 113, 49, 98, 66, 35, 100, 0, 9, 96, 24, 14, 240, + 240, 85, 56, 97, 209, 209, 209, 98, 81, 21, 113, 209, + 209, 209, 209, 194, 193, 209, 0, 10, 48, 29, 13, 240, + 240, 17, 177, 177, 178, 162, 177, 178, 177, 129, 49, 145, + 33, 145, 33, 145, 33, 145, 33, 145, 49, 98, 86, 0, + 8, 96, 35, 13, 240, 177, 97, 81, 98, 65, 98, 65, + 113, 65, 113, 65, 83, 65, 65, 33, 65, 49, 49, 68, + 66, 49, 129, 49, 129, 49, 129, 49, 130, 33, 145, 0, + 10, 18, 4, 129, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 50, 49, 49, 240, 176, 22, 12, 240, 228, 53, + 240, 99, 179, 178, 193, 193, 177, 177, 162, 49, 97, 81, + 65, 116, 0, 9, 80, 32, 14, 240, 209, 209, 209, 130, + 49, 114, 65, 98, 81, 82, 97, 66, 113, 50, 129, 34, + 145, 34, 145, 49, 145, 51, 114, 85, 49, 209, 0, 10, + 32, 22, 14, 240, 209, 209, 209, 209, 209, 209, 209, 209, + 210, 209, 210, 209, 114, 82, 51, 132, 0, 11, 16, 43, + 18, 0, 7, 1, 240, 33, 131, 98, 98, 17, 81, 17, + 97, 33, 81, 17, 82, 34, 65, 33, 65, 65, 65, 33, + 49, 81, 49, 68, 81, 49, 209, 49, 225, 33, 225, 33, + 225, 33, 225, 0, 13, 96, 38, 20, 0, 9, 81, 82, + 178, 82, 178, 82, 178, 83, 161, 97, 17, 161, 82, 18, + 130, 82, 33, 129, 98, 34, 98, 97, 65, 82, 113, 71, + 114, 114, 145, 240, 50, 0, 14, 96, 33, 16, 240, 81, + 210, 210, 114, 66, 146, 49, 178, 33, 193, 33, 193, 33, + 193, 33, 193, 33, 193, 33, 177, 65, 146, 66, 114, 98, + 82, 134, 0, 12, 112, 26, 8, 240, 21, 49, 50, 33, + 65, 33, 65, 33, 49, 49, 33, 67, 81, 113, 113, 113, + 113, 114, 98, 98, 0, 5, 96, 34, 15, 240, 240, 82, + 194, 194, 209, 209, 210, 129, 65, 145, 50, 161, 33, 161, + 49, 161, 49, 97, 34, 49, 81, 34, 66, 83, 99, 36, + 132, 35, 0, 9, 96, 30, 14, 240, 217, 81, 97, 97, + 82, 97, 66, 113, 50, 129, 49, 145, 34, 145, 49, 145, + 66, 113, 83, 81, 116, 33, 209, 209, 0, 12, 16, 24, + 12, 240, 240, 33, 132, 84, 114, 145, 177, 194, 179, 179, + 178, 194, 162, 65, 82, 65, 51, 100, 0, 8, 16, 21, + 13, 240, 240, 67, 100, 85, 193, 193, 194, 178, 193, 193, + 194, 193, 194, 193, 194, 0, 10, 32, 29, 17, 0, 8, + 81, 242, 193, 34, 193, 33, 209, 33, 209, 33, 209, 34, + 178, 49, 177, 65, 162, 81, 130, 98, 98, 150, 0, 13, + 80, 27, 18, 0, 13, 17, 33, 209, 50, 178, 65, 162, + 82, 145, 113, 130, 114, 98, 146, 81, 177, 66, 178, 34, + 212, 0, 14, 80, 46, 19, 0, 8, 113, 240, 65, 240, + 49, 240, 49, 147, 113, 33, 81, 18, 97, 33, 66, 49, + 81, 33, 65, 66, 65, 33, 65, 81, 65, 33, 65, 97, + 49, 34, 34, 98, 18, 49, 33, 129, 17, 68, 146, 0, + 14, 80, 31, 12, 240, 240, 97, 129, 34, 98, 49, 98, + 65, 66, 82, 49, 114, 18, 131, 146, 163, 130, 17, 129, + 49, 98, 50, 81, 81, 81, 0, 8, 80, 24, 14, 0, + 6, 81, 194, 34, 129, 66, 113, 98, 66, 133, 209, 194, + 193, 209, 193, 209, 209, 209, 0, 9, 64, 34, 22, 0, + 9, 6, 168, 49, 240, 82, 240, 66, 240, 81, 240, 82, + 240, 66, 240, 81, 240, 82, 240, 82, 240, 81, 240, 98, + 147, 146, 24, 197, 0, 14, 112, 23, 12, 240, 177, 82, + 55, 81, 177, 177, 177, 177, 161, 177, 177, 177, 177, 177, + 177, 50, 101, 0, 8, 48, 19, 11, 240, 240, 49, 177, + 162, 161, 177, 177, 161, 177, 177, 161, 177, 177, 0, 9, + 112, 21, 11, 240, 120, 161, 161, 161, 161, 161, 161, 161, + 177, 161, 161, 161, 161, 161, 71, 0, 7, 16, 15, 9, + 209, 114, 97, 17, 81, 33, 81, 49, 49, 66, 0, 17, + 16, 8, 10, 0, 20, 8, 0, 6, 64, 7, 5, 162, + 81, 0, 11, 64, 19, 10, 0, 14, 1, 129, 145, 34, + 65, 33, 33, 49, 17, 49, 51, 65, 0, 6, 64, 24, + 9, 240, 193, 129, 129, 129, 129, 129, 129, 129, 49, 65, + 65, 49, 81, 33, 65, 65, 34, 82, 0, 7, 48, 15, + 8, 0, 9, 65, 82, 81, 113, 97, 113, 129, 132, 240, + 240, 192, 30, 12, 240, 240, 18, 162, 162, 162, 162, 177, + 177, 177, 81, 81, 65, 97, 49, 113, 49, 98, 49, 83, + 50, 50, 17, 68, 65, 0, 7, 96, 17, 13, 0, 15, + 36, 129, 49, 113, 50, 71, 145, 193, 193, 215, 0, 8, + 48, 18, 11, 0, 5, 118, 66, 146, 146, 146, 161, 119, + 113, 161, 161, 162, 161, 0, 9, 22, 10, 0, 11, 66, + 113, 129, 145, 145, 81, 65, 49, 17, 67, 33, 145, 145, + 129, 113, 17, 114, 224, 25, 13, 0, 11, 49, 193, 193, + 193, 209, 193, 67, 81, 49, 33, 81, 33, 65, 81, 17, + 65, 82, 97, 0, 8, 48, 15, 4, 240, 161, 49, 97, + 49, 49, 49, 49, 49, 49, 65, 240, 112, 20, 11, 0, + 10, 17, 145, 240, 240, 33, 177, 177, 177, 177, 161, 162, + 145, 49, 97, 70, 240, 24, 10, 240, 81, 145, 145, 145, + 145, 145, 65, 65, 49, 81, 18, 99, 114, 129, 146, 136, + 49, 145, 0, 7, 32, 18, 4, 129, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 50, 49, 240, 176, 21, + 11, 0, 13, 2, 97, 18, 17, 65, 18, 33, 65, 81, + 50, 81, 50, 97, 34, 161, 0, 8, 18, 9, 0, 11, + 81, 100, 66, 33, 66, 49, 50, 49, 50, 65, 49, 0, + 6, 64, 16, 10, 0, 14, 18, 113, 129, 65, 49, 97, + 49, 81, 69, 0, 6, 80, 19, 7, 0, 9, 99, 49, + 34, 33, 49, 33, 33, 49, 18, 50, 81, 97, 97, 97, + 208, 21, 12, 0, 15, 34, 145, 161, 177, 65, 97, 50, + 97, 34, 130, 17, 177, 177, 178, 49, 116, 240, 17, 9, + 0, 9, 20, 66, 50, 33, 129, 129, 129, 129, 129, 129, + 0, 6, 80, 14, 7, 0, 8, 115, 49, 113, 114, 113, + 82, 50, 240, 240, 144, 20, 10, 240, 240, 177, 145, 145, + 146, 145, 145, 150, 36, 145, 145, 145, 146, 145, 0, 6, + 112, 17, 9, 0, 12, 49, 129, 81, 33, 81, 33, 81, + 34, 49, 83, 0, 6, 16, 19, 8, 0, 9, 81, 113, + 113, 33, 49, 65, 33, 65, 33, 65, 17, 98, 240, 240, + 224, 23, 11, 0, 15, 17, 97, 49, 98, 33, 50, 33, + 33, 33, 17, 17, 49, 33, 34, 66, 65, 0, 7, 32, + 17, 7, 0, 8, 97, 98, 18, 50, 97, 81, 17, 65, + 17, 113, 240, 240, 112, 18, 10, 0, 14, 81, 145, 33, + 81, 65, 65, 85, 129, 145, 145, 129, 145, 145, 80, 16, + 11, 0, 14, 51, 68, 17, 65, 81, 145, 161, 145, 165, + 0, 7, 16, 21, 13, 240, 216, 81, 193, 193, 193, 162, + 177, 210, 194, 193, 193, 193, 193, 193, 200, 0, 8, 48, + 19, 3, 97, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 240, 32, 22, 12, 240, 151, 177, + 177, 177, 177, 177, 178, 194, 162, 130, 161, 177, 177, 81, + 51, 99, 0, 8, 64, 12, 9, 0, 10, 34, 97, 33, + 33, 98, 0, 11, 80, 17, 4, 145, 49, 177, 49, 49, + 49, 49, 49, 49, 34, 34, 34, 34, 240, 112, 25, 8, + 240, 50, 98, 113, 114, 82, 84, 65, 33, 50, 33, 50, + 33, 65, 33, 82, 17, 98, 113, 113, 0, 6, 32, 24, + 15, 240, 67, 177, 49, 145, 225, 225, 225, 241, 225, 198, + 177, 225, 226, 209, 181, 163, 34, 246, 0, 9, 80, 16, + 9, 0, 9, 2, 19, 85, 67, 17, 50, 34, 33, 36, + 0, 10, 48, 29, 15, 240, 240, 148, 36, 98, 81, 113, + 98, 82, 113, 81, 145, 65, 161, 33, 177, 33, 182, 177, + 198, 177, 225, 240, 211, 242, 0, 8, 15, 3, 97, 33, + 33, 33, 33, 33, 129, 33, 33, 33, 33, 240, 128, 29, + 12, 240, 240, 18, 131, 99, 115, 145, 33, 130, 34, 114, + 49, 115, 33, 131, 17, 148, 162, 177, 65, 82, 65, 51, + 100, 0, 8, 16, 10, 9, 240, 49, 66, 34, 50, 0, + 20, 64, 31, 15, 0, 6, 51, 162, 17, 161, 209, 209, + 65, 145, 49, 145, 49, 161, 49, 113, 33, 49, 97, 49, + 67, 49, 49, 145, 81, 113, 119, 0, 12, 13, 7, 240, + 113, 81, 19, 33, 17, 17, 34, 0, 13, 96, 27, 14, + 0, 9, 65, 50, 98, 50, 97, 50, 98, 50, 98, 49, + 130, 50, 145, 65, 146, 49, 146, 50, 145, 50, 0, 12, + 64, 14, 11, 0, 9, 87, 177, 177, 161, 161, 161, 161, + 0, 11, 32, 8, 8, 0, 9, 6, 0, 12, 32, 40, + 14, 240, 240, 81, 179, 146, 177, 50, 113, 19, 17, 113, + 17, 33, 113, 33, 17, 81, 33, 33, 17, 81, 33, 33, + 34, 49, 33, 33, 65, 17, 49, 33, 97, 65, 113, 103, + 0, 12, 112, 8, 9, 240, 240, 247, 0, 18, 32, 13, + 8, 240, 49, 97, 97, 65, 33, 65, 52, 0, 15, 48, + 18, 10, 0, 6, 81, 145, 161, 145, 103, 97, 145, 145, + 145, 240, 168, 0, 6, 64, 15, 9, 240, 51, 129, 129, + 113, 129, 50, 49, 33, 98, 0, 15, 32, 12, 7, 229, + 97, 66, 98, 97, 97, 81, 0, 11, 96, 7, 5, 193, + 34, 0, 11, 80, 28, 15, 0, 12, 49, 113, 97, 113, + 113, 82, 113, 82, 98, 82, 97, 17, 65, 17, 65, 33, + 49, 52, 65, 33, 177, 33, 0, 13, 34, 16, 240, 240, + 60, 240, 17, 113, 49, 115, 17, 49, 97, 65, 49, 97, + 66, 33, 97, 66, 33, 118, 33, 193, 33, 193, 241, 241, + 241, 241, 214, 0, 10, 96, 9, 5, 240, 240, 243, 35, + 0, 7, 16, 10, 4, 0, 6, 65, 65, 49, 34, 240, + 112, 11, 3, 97, 33, 33, 33, 33, 33, 240, 240, 224, + 13, 8, 240, 49, 97, 97, 65, 33, 65, 52, 0, 15, + 48, 29, 15, 0, 7, 66, 65, 146, 66, 146, 50, 146, + 65, 146, 65, 146, 50, 114, 50, 114, 50, 114, 50, 114, + 50, 114, 50, 113, 0, 13, 36, 12, 240, 145, 113, 49, + 97, 65, 81, 81, 66, 81, 65, 97, 49, 161, 177, 34, + 97, 33, 17, 81, 33, 33, 81, 17, 49, 17, 33, 53, + 49, 97, 177, 177, 0, 8, 34, 12, 240, 240, 113, 81, + 81, 65, 97, 49, 113, 49, 113, 33, 129, 17, 145, 17, + 161, 161, 35, 97, 65, 81, 65, 177, 177, 34, 113, 17, + 161, 0, 6, 80, 43, 17, 240, 240, 84, 81, 97, 49, + 65, 177, 65, 161, 65, 193, 33, 209, 33, 209, 17, 209, + 17, 50, 177, 33, 17, 161, 33, 33, 145, 33, 49, 34, + 81, 39, 97, 113, 240, 17, 240, 33, 0, 11, 32, 23, + 10, 240, 240, 65, 0, 7, 18, 113, 130, 81, 33, 97, + 33, 97, 33, 82, 49, 50, 83, 0, 6, 112, 29, 10, + 209, 161, 130, 130, 130, 113, 33, 97, 33, 97, 33, 81, + 49, 81, 65, 71, 49, 65, 49, 81, 49, 81, 49, 97, + 0, 7, 96, 33, 11, 240, 17, 145, 146, 146, 145, 17, + 113, 33, 113, 33, 113, 33, 113, 49, 81, 65, 81, 65, + 88, 49, 65, 65, 97, 49, 97, 49, 97, 0, 7, 32, + 31, 10, 240, 129, 146, 113, 161, 129, 17, 113, 17, 113, + 33, 97, 33, 81, 49, 81, 49, 87, 49, 65, 49, 81, + 49, 81, 49, 81, 0, 6, 80, 34, 10, 240, 113, 65, + 34, 17, 33, 114, 113, 129, 17, 113, 17, 113, 17, 113, + 33, 81, 49, 81, 49, 87, 49, 65, 49, 81, 49, 81, + 49, 81, 0, 6, 80, 32, 10, 240, 113, 33, 240, 34, + 130, 113, 17, 113, 33, 97, 33, 97, 33, 81, 49, 81, + 65, 71, 49, 65, 49, 81, 49, 81, 49, 97, 0, 6, + 64, 31, 10, 240, 130, 115, 115, 129, 129, 17, 113, 17, + 113, 17, 97, 49, 81, 49, 81, 49, 87, 49, 65, 49, + 81, 49, 81, 49, 81, 0, 6, 80, 33, 17, 0, 7, + 40, 129, 17, 209, 33, 209, 33, 193, 49, 193, 49, 193, + 55, 81, 65, 182, 161, 81, 161, 81, 145, 97, 145, 97, + 129, 119, 0, 10, 112, 23, 12, 240, 240, 162, 130, 161, + 161, 161, 177, 177, 177, 177, 193, 98, 70, 129, 193, 177, + 161, 0, 6, 112, 24, 11, 240, 177, 177, 113, 167, 65, + 145, 161, 161, 66, 50, 34, 81, 161, 161, 97, 50, 66, + 69, 0, 8, 112, 26, 11, 240, 210, 129, 240, 49, 21, + 70, 81, 145, 161, 161, 67, 34, 34, 81, 161, 161, 97, + 50, 66, 70, 0, 7, 48, 26, 10, 240, 240, 66, 161, + 241, 20, 65, 34, 81, 129, 145, 145, 35, 49, 33, 97, + 145, 97, 34, 66, 53, 0, 6, 96, 27, 11, 240, 240, + 97, 33, 240, 33, 21, 65, 35, 81, 145, 161, 161, 67, + 34, 34, 81, 161, 161, 162, 66, 70, 0, 7, 48, 18, + 4, 129, 113, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 65, 49, 240, 112, 18, 4, 129, 113, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 65, 240, 112, 20, + 5, 162, 49, 17, 49, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 81, 240, 240, 32, 19, 6, 193, 33, 145, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 97, 240, + 240, 144, 35, 17, 0, 7, 2, 241, 19, 193, 66, 161, + 98, 129, 113, 129, 129, 38, 113, 129, 113, 129, 113, 129, + 113, 129, 97, 145, 17, 49, 161, 17, 34, 210, 0, 11, + 64, 38, 17, 0, 6, 116, 49, 145, 51, 240, 81, 66, + 161, 66, 161, 67, 130, 65, 17, 129, 81, 17, 129, 81, + 18, 98, 66, 33, 97, 82, 49, 65, 97, 84, 113, 241, + 0, 12, 80, 31, 14, 240, 65, 225, 240, 130, 177, 98, + 81, 129, 49, 161, 33, 161, 33, 161, 33, 161, 33, 161, + 33, 145, 65, 129, 66, 82, 117, 0, 11, 32, 31, 14, + 240, 240, 65, 240, 130, 177, 98, 81, 129, 49, 161, 33, + 161, 33, 161, 33, 161, 33, 161, 33, 145, 65, 129, 66, + 82, 117, 0, 11, 32, 33, 14, 240, 240, 65, 193, 17, + 240, 114, 177, 113, 81, 129, 49, 161, 33, 161, 33, 161, + 33, 161, 33, 161, 33, 145, 65, 129, 81, 82, 117, 0, + 9, 64, 33, 14, 240, 49, 193, 18, 17, 193, 130, 177, + 113, 81, 129, 49, 161, 33, 161, 33, 161, 33, 161, 33, + 161, 33, 145, 65, 129, 66, 82, 117, 0, 11, 32, 32, + 14, 240, 17, 210, 82, 240, 66, 177, 113, 81, 129, 49, + 161, 33, 161, 33, 161, 33, 161, 33, 161, 33, 145, 65, + 129, 66, 82, 117, 0, 11, 32, 22, 9, 240, 240, 241, + 81, 33, 65, 65, 49, 81, 17, 114, 99, 97, 18, 65, + 49, 145, 0, 9, 32, 43, 16, 240, 240, 193, 130, 65, + 129, 99, 81, 97, 49, 65, 81, 66, 34, 81, 81, 33, + 81, 97, 33, 65, 113, 33, 65, 113, 34, 33, 129, 49, + 17, 129, 66, 130, 82, 98, 114, 50, 178, 0, 11, 16, + 32, 16, 240, 240, 129, 240, 17, 240, 240, 177, 161, 65, + 177, 49, 177, 34, 177, 34, 177, 49, 177, 49, 161, 66, + 145, 81, 114, 114, 51, 163, 0, 11, 32, 16, 240, 240, + 145, 225, 240, 240, 193, 161, 65, 177, 34, 177, 34, 177, + 34, 177, 49, 177, 49, 161, 66, 130, 81, 114, 114, 51, + 149, 0, 10, 112, 31, 16, 240, 240, 130, 226, 240, 240, + 177, 177, 49, 177, 34, 177, 34, 177, 34, 177, 49, 162, + 49, 161, 66, 130, 82, 98, 114, 50, 179, 0, 11, 32, + 16, 240, 240, 97, 66, 226, 240, 113, 226, 177, 33, 193, + 33, 193, 33, 193, 33, 193, 33, 178, 49, 161, 65, 146, + 81, 114, 98, 67, 148, 0, 11, 26, 13, 240, 240, 33, + 162, 240, 33, 33, 145, 49, 113, 82, 81, 100, 33, 162, + 193, 178, 177, 193, 178, 177, 0, 10, 64, 23, 9, 240, + 199, 33, 129, 129, 134, 49, 66, 33, 81, 33, 81, 38, + 49, 129, 129, 129, 135, 0, 5, 112, 34, 11, 240, 120, + 49, 97, 49, 113, 33, 82, 49, 51, 65, 34, 97, 33, + 113, 35, 81, 82, 49, 97, 49, 97, 49, 97, 49, 97, + 65, 65, 100, 0, 7, 64, 25, 10, 0, 7, 113, 161, + 161, 240, 17, 129, 145, 34, 65, 33, 17, 65, 33, 33, + 49, 17, 50, 49, 0, 7, 32, 21, 9, 0, 9, 50, + 240, 145, 113, 129, 33, 65, 33, 17, 49, 17, 33, 50, + 65, 0, 5, 112, 22, 9, 0, 9, 50, 97, 240, 33, + 113, 129, 33, 65, 33, 17, 49, 17, 33, 50, 65, 0, + 5, 112, 22, 9, 0, 9, 3, 49, 83, 225, 113, 129, + 33, 65, 33, 17, 49, 17, 33, 50, 65, 0, 5, 112, + 21, 9, 0, 10, 49, 240, 33, 113, 129, 33, 65, 33, + 17, 49, 17, 33, 50, 65, 0, 5, 112, 23, 9, 0, + 7, 17, 115, 99, 240, 145, 113, 33, 65, 34, 65, 17, + 33, 49, 17, 34, 49, 0, 6, 64, 27, 15, 0, 18, + 1, 194, 17, 113, 33, 34, 82, 21, 113, 33, 17, 129, + 33, 18, 129, 17, 33, 22, 35, 49, 0, 10, 48, 17, + 8, 0, 10, 49, 82, 97, 97, 113, 130, 18, 66, 113, + 113, 98, 240, 80, 18, 12, 0, 11, 17, 193, 240, 240, + 52, 113, 33, 86, 129, 193, 198, 0, 7, 96, 20, 12, + 0, 9, 81, 146, 240, 240, 83, 129, 49, 97, 34, 85, + 145, 177, 199, 0, 7, 96, 21, 12, 0, 9, 81, 161, + 17, 240, 240, 52, 114, 33, 113, 34, 70, 129, 193, 198, + 0, 7, 96, 18, 12, 0, 12, 97, 240, 100, 113, 49, + 113, 33, 86, 129, 177, 199, 0, 7, 96, 15, 5, 240, + 241, 82, 129, 65, 65, 65, 65, 65, 65, 81, 240, 192, + 14, 4, 240, 161, 33, 177, 49, 49, 49, 49, 49, 65, + 240, 112, 15, 5, 240, 240, 98, 33, 161, 65, 65, 65, + 65, 65, 81, 240, 192, 16, 7, 0, 7, 2, 33, 177, + 97, 97, 97, 97, 97, 113, 240, 240, 128, 18, 9, 0, + 9, 81, 83, 240, 33, 145, 65, 65, 33, 81, 34, 65, + 68, 0, 6, 24, 10, 0, 8, 114, 65, 33, 33, 33, + 114, 240, 34, 99, 17, 82, 34, 66, 49, 66, 65, 65, + 0, 7, 16, 18, 9, 0, 9, 49, 145, 240, 17, 98, + 98, 65, 33, 81, 34, 65, 68, 0, 6, 18, 9, 0, + 8, 49, 113, 240, 177, 98, 98, 65, 33, 81, 34, 65, + 68, 0, 6, 18, 9, 0, 8, 33, 115, 240, 161, 98, + 98, 65, 33, 81, 34, 65, 68, 0, 6, 19, 9, 0, + 8, 1, 113, 18, 18, 97, 242, 97, 113, 129, 81, 34, + 65, 68, 0, 6, 19, 10, 0, 10, 33, 34, 240, 162, + 114, 114, 65, 49, 97, 34, 81, 54, 0, 6, 80, 13, + 11, 0, 8, 97, 161, 240, 41, 240, 209, 0, 13, 16, + 22, 9, 0, 9, 81, 129, 113, 99, 81, 17, 81, 33, + 33, 33, 17, 49, 33, 17, 49, 53, 0, 6, 19, 9, + 0, 9, 34, 145, 209, 129, 81, 33, 81, 33, 81, 34, + 49, 68, 0, 6, 16, 19, 9, 0, 9, 65, 98, 225, + 129, 81, 33, 81, 33, 81, 34, 49, 83, 0, 6, 16, + 20, 9, 0, 9, 49, 113, 17, 209, 129, 81, 33, 81, + 33, 81, 34, 49, 68, 0, 6, 16, 19, 10, 0, 10, + 33, 193, 225, 145, 97, 33, 97, 34, 66, 50, 34, 84, + 0, 6, 96, 19, 9, 0, 10, 81, 98, 240, 81, 33, + 81, 50, 33, 99, 129, 113, 129, 129, 129, 208, 22, 8, + 240, 240, 37, 49, 113, 113, 117, 49, 65, 33, 65, 37, + 49, 113, 113, 113, 118, 240, 240, 192, 19, 9, 0, 10, + 33, 33, 240, 209, 33, 81, 50, 33, 99, 129, 113, 129, + 129, 129, 208, +}; + +//***************************************************************************** +// +// The glyph offset table for the 20 point Handwriting font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetHandwriting20[] = +{ + 0, 5, 22, 35, 68, 105, 140, 177, + 184, 206, 226, 236, 256, 265, 273, 281, + 302, 335, 353, 385, 410, 440, 466, 490, + 511, 542, 574, 583, 594, 612, 623, 641, + 663, 717, 749, 779, 800, 835, 861, 885, + 914, 949, 967, 989, 1021, 1043, 1086, 1124, + 1157, 1183, 1217, 1247, 1271, 1292, 1321, 1348, + 1394, 1425, 1449, 1483, 1506, 1525, 1546, 1561, + 1569, 1576, 1595, 1619, 1634, 1664, 1681, 1699, + 1721, 1746, 1761, 1781, 1805, 1823, 1844, 1862, + 1878, 1897, 1918, 1935, 1949, 1969, 1986, 2005, + 2028, 2045, 2063, 2079, 2100, 2119, 2141, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2153, 2170, 2195, 2219, 2235, 2264, 2279, + 2308, 2318, 2349, 2362, 2389, 2403, 2411, 2451, + 2459, 2472, 2490, 2505, 2517, 2524, 2552, 2586, + 2595, 2605, 2616, 2629, 2658, 2694, 2728, 2771, + 2794, 2823, 2856, 2887, 2921, 2953, 2984, 3017, + 3040, 3064, 3090, 3116, 3143, 3161, 3179, 3199, + 3218, 3253, 3291, 3322, 3353, 3386, 3419, 3451, + 3473, 3516, 3548, 3580, 3611, 3643, 3669, 3692, + 3726, 3751, 3772, 3794, 3816, 3837, 3860, 3887, + 3904, 3922, 3942, 3963, 3981, 3996, 4010, 4025, + 4041, 4059, 4083, 4101, 4119, 4137, 4156, 4175, + 4188, 4210, 4229, 4248, 4268, 4287, 4306, 4328, +}; + +//***************************************************************************** +// +// The font definition for the 20 point Handwriting font. +// +//***************************************************************************** +const tFontEx g_sFontExHandwriting20 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 19, + + // + // The height of the font. + // + 22, + + // + // The baseline of the font. + // + 17, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetHandwriting20, + + // + // A pointer to the actual font data + // + g_pui8Handwriting20Data +}; diff --git a/third_party/fonts/ofl/fonts/fonthandwriting22.c b/third_party/fonts/ofl/fonts/fonthandwriting22.c new file mode 100644 index 0000000..17ab7e5 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthandwriting22.c @@ -0,0 +1,634 @@ +//***************************************************************************** +// +// fonthandwriting22.c - Font definition for the 22pt Handwriting font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://helloalan.com/projects/breip/ +// +// This Font Software is Copyright (c) 2008, Alan Hussey and Adam Breipohl. +// All Rights Reserved. +// +// "Breip" is a Reserved Font Name for this Font Software. +// +// This Font Software is licensed under the SIL Open Font License, +// Version 1.0. No modification of the license is permitted, only verbatim +// copy is allowed. This license is copied below, and is also available with +// a FAQ at: http://scripts.sil.org/OFL +// ------------------------------------------------------------------------ +// +// SIL OPEN FONT LICENSE +// +// Version 1.0 - 22 November 2005 +// PREAMBLE +// +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of cooperative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide an open +// framework in which fonts may be shared and improved in partnership with +// others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and sold with any software provided that the font names of +// derivative works are changed. The fonts and derivatives, however, cannot +// be released under any other type of license. +// +// DEFINITIONS +// +// "Font Software" refers to any and all of the following: +// +// * font files +// * data files +// * source code +// * build scripts +// * documentation +// +// "Reserved Font Name" refers to the Font Software name as seen by users +// and any other names as specified after the copyright statement. +// +// "Standard Version" refers to the collection of Font Software components +// as distributed by the Copyright Holder. +// +// "Modified Version" refers to any derivative font software made by adding +// to, deleting, or substituting -- in part or in whole -- any of the +// components of the Standard Version, by changing formats or by porting +// the Font Software to a new environment. +// +// "Author" refers to any designer, engineer, programmer, technical writer +// or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, in +// Standard or Modified Versions, may be sold by itself. +// +// 2) Standard or Modified Versions of the Font Software may be bundled, +// redistributed and sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or in +// the appropriate machine-readable metadata fields within text or binary +// files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s), in part or in whole, unless explicit written permission is +// granted by the Copyright Holder. This restriction applies to all +// references stored in the Font Software, such as the font menu name and +// other font description fields, which are used to differentiate the font +// from others. +// +// 4) The name(s) of the Copyright Holder or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any Modified +// Version, except to acknowledge the contribution(s) of the Copyright Holder +// and the Author(s) or with their explicit written permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, must +// be distributed using this license, and may not be distributed under any +// other license. +// +// TERMINATION +// +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER +// DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: handwriting +// Size: 22 point +// Bold: no +// Italic: no +// Memory usage: 5032 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 22 point Handwriting font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Handwriting22Data[4831] = +{ + 5, 9, 0, 28, 16, 20, 5, 240, 17, 66, 49, 65, + 50, 50, 50, 50, 49, 65, 65, 225, 65, 65, 240, 240, + 64, 14, 5, 240, 81, 65, 17, 33, 17, 33, 17, 65, + 0, 10, 32, 39, 17, 0, 6, 81, 240, 17, 240, 17, + 113, 130, 97, 109, 113, 97, 34, 81, 97, 145, 97, 145, + 97, 145, 97, 145, 97, 124, 83, 113, 18, 66, 113, 113, + 130, 97, 145, 0, 13, 32, 39, 11, 240, 240, 241, 49, + 97, 36, 82, 17, 98, 33, 81, 17, 33, 81, 17, 33, + 81, 17, 33, 104, 65, 33, 33, 65, 33, 33, 65, 51, + 65, 50, 85, 67, 65, 161, 0, 8, 80, 36, 16, 0, + 8, 3, 33, 161, 50, 49, 115, 65, 241, 225, 241, 225, + 241, 65, 145, 50, 17, 129, 49, 161, 49, 177, 49, 65, + 97, 65, 49, 81, 99, 97, 0, 13, 64, 44, 15, 0, + 5, 100, 162, 49, 145, 65, 145, 65, 145, 65, 161, 33, + 193, 17, 193, 17, 81, 114, 81, 114, 65, 129, 18, 33, + 113, 65, 17, 113, 82, 113, 98, 97, 81, 33, 81, 65, + 65, 84, 0, 10, 48, 9, 4, 209, 33, 49, 65, 0, + 9, 32, 24, 8, 240, 225, 82, 81, 113, 97, 113, 97, + 113, 113, 113, 113, 113, 113, 113, 113, 129, 49, 67, 240, + 240, 208, 23, 6, 240, 49, 97, 81, 97, 81, 82, 81, + 81, 81, 81, 81, 81, 81, 65, 81, 81, 65, 240, 240, + 64, 10, 5, 240, 17, 50, 50, 66, 49, 0, 11, 20, + 11, 0, 7, 33, 162, 161, 162, 146, 146, 89, 113, 161, + 161, 161, 161, 161, 0, 10, 32, 11, 3, 0, 6, 1, + 33, 33, 33, 33, 33, 176, 8, 12, 0, 16, 74, 0, + 19, 96, 8, 4, 0, 9, 2, 34, 240, 112, 23, 13, + 0, 6, 17, 177, 178, 177, 177, 178, 177, 177, 178, 177, + 177, 178, 177, 177, 193, 177, 0, 11, 32, 38, 18, 0, + 7, 35, 225, 33, 209, 49, 194, 177, 65, 209, 49, 209, + 34, 209, 34, 209, 34, 209, 34, 209, 49, 194, 49, 193, + 81, 162, 82, 130, 114, 98, 151, 225, 0, 12, 64, 20, + 3, 145, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 240, 80, 36, 18, 0, 9, 37, + 194, 49, 177, 81, 240, 33, 240, 17, 240, 33, 240, 33, + 240, 18, 240, 18, 130, 97, 129, 129, 98, 145, 82, 162, + 49, 209, 33, 227, 0, 14, 96, 26, 16, 0, 6, 87, + 114, 98, 66, 145, 49, 177, 226, 210, 194, 228, 242, 242, + 226, 241, 241, 226, 210, 150, 0, 12, 64, 38, 18, 0, + 7, 98, 243, 210, 33, 194, 49, 178, 65, 162, 81, 145, + 113, 129, 129, 66, 34, 113, 19, 90, 240, 17, 240, 33, + 240, 33, 240, 33, 240, 33, 240, 33, 0, 14, 64, 30, + 10, 240, 240, 53, 51, 113, 145, 145, 145, 145, 34, 83, + 33, 49, 17, 65, 49, 81, 145, 145, 130, 129, 145, 81, + 33, 114, 0, 6, 112, 27, 13, 0, 7, 33, 193, 177, + 193, 177, 177, 193, 177, 177, 193, 177, 193, 97, 81, 114, + 49, 145, 34, 113, 87, 0, 8, 80, 24, 12, 240, 240, + 97, 200, 193, 177, 162, 161, 177, 161, 177, 161, 177, 177, + 161, 177, 161, 177, 177, 0, 8, 48, 35, 11, 240, 65, + 161, 161, 161, 98, 17, 82, 49, 65, 66, 65, 65, 65, + 66, 81, 49, 98, 17, 130, 145, 18, 113, 49, 81, 81, + 65, 65, 81, 50, 99, 0, 9, 34, 14, 240, 240, 246, + 114, 83, 49, 130, 33, 129, 17, 33, 129, 17, 49, 97, + 33, 49, 81, 49, 69, 65, 209, 209, 209, 209, 209, 209, + 209, 209, 0, 10, 96, 11, 4, 240, 209, 50, 240, 113, + 49, 240, 240, 144, 13, 4, 240, 240, 161, 50, 240, 129, + 49, 49, 49, 33, 240, 19, 12, 0, 10, 2, 131, 115, + 115, 130, 145, 179, 179, 178, 179, 178, 193, 0, 10, 96, + 11, 11, 0, 12, 57, 240, 240, 89, 0, 15, 48, 19, + 13, 0, 9, 98, 211, 194, 210, 195, 194, 148, 130, 147, + 146, 162, 146, 0, 12, 96, 23, 11, 240, 240, 99, 103, + 50, 82, 33, 113, 33, 113, 33, 113, 33, 98, 130, 130, + 0, 9, 33, 0, 9, 60, 20, 0, 8, 37, 210, 81, + 177, 129, 145, 146, 129, 161, 113, 82, 65, 113, 50, 17, + 65, 49, 33, 50, 81, 17, 49, 33, 49, 97, 17, 49, + 33, 33, 98, 17, 49, 49, 17, 81, 17, 17, 49, 49, + 17, 66, 18, 49, 81, 20, 129, 81, 193, 114, 145, 162, + 82, 213, 0, 13, 64, 37, 12, 0, 6, 66, 162, 145, + 33, 129, 33, 129, 33, 113, 49, 113, 50, 97, 65, 97, + 65, 82, 65, 81, 23, 49, 97, 65, 97, 50, 97, 49, + 113, 49, 113, 0, 7, 112, 33, 12, 240, 240, 105, 49, + 129, 49, 113, 49, 82, 65, 50, 97, 18, 129, 19, 113, + 67, 65, 97, 65, 97, 65, 97, 65, 97, 161, 161, 146, + 115, 0, 10, 22, 15, 0, 8, 34, 179, 178, 194, 209, + 209, 225, 209, 225, 225, 225, 225, 226, 226, 100, 71, 0, + 12, 40, 14, 240, 240, 197, 161, 36, 113, 82, 97, 114, + 65, 130, 49, 145, 49, 145, 49, 145, 49, 130, 49, 130, + 34, 129, 50, 129, 50, 17, 81, 66, 17, 66, 65, 49, + 34, 148, 0, 11, 32, 29, 12, 240, 240, 129, 177, 37, + 65, 21, 81, 177, 177, 162, 161, 98, 49, 51, 66, 161, + 177, 178, 113, 34, 83, 56, 99, 0, 9, 96, 24, 15, + 0, 6, 55, 56, 113, 225, 225, 225, 225, 54, 81, 18, + 177, 225, 225, 225, 225, 210, 210, 209, 0, 13, 31, 14, + 0, 7, 81, 193, 193, 193, 194, 193, 194, 193, 145, 49, + 161, 33, 161, 33, 161, 33, 161, 33, 161, 34, 130, 50, + 68, 101, 0, 9, 64, 42, 14, 240, 240, 97, 81, 113, + 81, 113, 81, 114, 65, 114, 65, 114, 65, 114, 65, 82, + 17, 65, 66, 33, 65, 49, 65, 68, 82, 49, 145, 49, + 145, 49, 145, 49, 145, 49, 161, 33, 0, 12, 16, 20, + 4, 193, 49, 49, 49, 50, 34, 34, 34, 34, 34, 34, + 34, 49, 49, 49, 49, 240, 176, 24, 14, 0, 7, 55, + 68, 209, 227, 210, 226, 225, 210, 209, 209, 209, 193, 97, + 82, 98, 50, 148, 0, 11, 16, 35, 16, 0, 6, 1, + 241, 241, 146, 65, 130, 81, 114, 97, 98, 113, 82, 129, + 66, 145, 50, 161, 49, 177, 49, 177, 50, 162, 51, 130, + 87, 49, 241, 0, 13, 96, 23, 16, 0, 8, 1, 241, + 241, 241, 241, 241, 241, 241, 242, 241, 242, 241, 146, 66, + 114, 105, 162, 0, 13, 49, 20, 0, 10, 49, 240, 50, + 131, 114, 129, 17, 114, 114, 18, 81, 33, 97, 49, 81, + 33, 82, 49, 81, 33, 81, 65, 81, 34, 49, 82, 65, + 53, 97, 49, 241, 49, 241, 49, 241, 49, 241, 49, 242, + 33, 240, 17, 0, 15, 32, 43, 22, 0, 13, 49, 97, + 210, 98, 194, 98, 194, 84, 178, 84, 177, 98, 17, 162, + 98, 18, 146, 98, 33, 145, 113, 50, 114, 113, 65, 98, + 114, 67, 50, 130, 101, 145, 240, 82, 240, 66, 0, 16, + 32, 38, 18, 0, 7, 34, 242, 241, 131, 82, 162, 65, + 193, 50, 194, 34, 209, 34, 209, 33, 225, 34, 209, 34, + 194, 49, 193, 66, 162, 81, 146, 113, 114, 147, 19, 211, + 0, 12, 48, 29, 9, 240, 197, 65, 65, 49, 66, 33, + 66, 33, 65, 49, 49, 65, 18, 83, 97, 129, 129, 129, + 129, 130, 114, 114, 114, 0, 6, 64, 34, 16, 0, 8, + 83, 194, 225, 225, 226, 210, 225, 177, 49, 177, 34, 177, + 33, 178, 33, 177, 49, 162, 50, 82, 18, 82, 83, 114, + 52, 133, 36, 0, 10, 32, 32, 15, 0, 7, 73, 97, + 113, 97, 98, 97, 82, 113, 66, 129, 50, 145, 49, 161, + 49, 161, 50, 145, 67, 113, 99, 81, 132, 33, 225, 225, + 0, 13, 25, 13, 240, 240, 81, 163, 116, 115, 130, 177, + 194, 194, 195, 195, 195, 194, 194, 178, 177, 81, 67, 101, + 0, 10, 48, 24, 13, 0, 5, 115, 101, 70, 113, 34, + 178, 178, 193, 193, 194, 178, 193, 194, 193, 194, 193, 194, + 0, 10, 32, 34, 18, 0, 11, 49, 240, 18, 209, 34, + 209, 33, 225, 33, 225, 33, 225, 33, 225, 33, 210, 34, + 194, 49, 193, 66, 161, 97, 145, 130, 82, 166, 0, 14, + 64, 31, 20, 0, 17, 17, 240, 49, 49, 226, 50, 194, + 81, 193, 98, 162, 114, 130, 145, 129, 162, 98, 177, 82, + 194, 65, 226, 34, 244, 0, 16, 32, 54, 21, 0, 12, + 65, 240, 82, 240, 81, 240, 81, 240, 81, 163, 114, 33, + 97, 18, 113, 33, 82, 49, 97, 33, 81, 81, 81, 33, + 81, 82, 65, 34, 65, 97, 65, 49, 65, 98, 34, 49, + 50, 114, 18, 50, 33, 145, 17, 81, 18, 147, 97, 0, + 15, 32, 33, 13, 0, 7, 97, 34, 129, 34, 114, 50, + 82, 82, 66, 97, 50, 129, 18, 148, 162, 163, 164, 130, + 34, 113, 65, 98, 66, 81, 97, 81, 0, 9, 48, 27, + 15, 0, 9, 1, 210, 34, 146, 50, 129, 82, 98, 99, + 65, 148, 17, 210, 209, 225, 210, 209, 225, 210, 209, 0, + 12, 16, 37, 24, 0, 13, 7, 155, 34, 240, 98, 240, + 114, 240, 98, 240, 98, 240, 114, 240, 98, 240, 113, 240, + 114, 240, 113, 240, 129, 240, 129, 240, 130, 132, 172, 229, + 0, 16, 16, 27, 13, 240, 240, 177, 98, 50, 67, 71, + 97, 193, 193, 193, 193, 178, 177, 193, 193, 193, 193, 193, + 193, 51, 101, 0, 9, 16, 21, 12, 0, 6, 1, 193, + 177, 193, 193, 178, 177, 193, 178, 177, 193, 178, 177, 193, + 0, 10, 96, 24, 13, 240, 240, 153, 193, 193, 193, 193, + 193, 193, 193, 193, 209, 193, 193, 193, 193, 194, 178, 73, + 0, 8, 48, 17, 9, 240, 242, 97, 17, 97, 17, 81, + 33, 65, 65, 49, 81, 0, 18, 32, 8, 11, 0, 26, + 25, 0, 7, 16, 9, 6, 240, 50, 97, 97, 0, 14, + 64, 21, 10, 0, 15, 34, 129, 129, 49, 65, 49, 17, + 49, 33, 33, 49, 33, 49, 35, 0, 8, 48, 26, 9, + 240, 240, 241, 129, 129, 129, 129, 129, 129, 129, 129, 51, + 33, 81, 33, 81, 34, 65, 49, 49, 83, 0, 7, 32, + 17, 10, 0, 14, 34, 98, 114, 129, 130, 130, 130, 146, + 50, 68, 0, 6, 96, 34, 13, 0, 5, 114, 178, 178, + 178, 178, 178, 178, 193, 193, 82, 81, 65, 113, 49, 129, + 49, 114, 49, 114, 49, 97, 17, 51, 35, 18, 53, 65, + 0, 8, 48, 18, 13, 0, 18, 53, 114, 49, 113, 50, + 116, 99, 193, 193, 209, 215, 0, 8, 48, 21, 13, 0, + 8, 71, 82, 97, 65, 194, 178, 178, 193, 151, 145, 193, + 193, 194, 177, 0, 12, 64, 23, 11, 0, 15, 66, 114, + 145, 146, 145, 161, 83, 54, 17, 81, 65, 161, 161, 97, + 33, 113, 33, 130, 240, 27, 14, 0, 15, 97, 209, 209, + 225, 209, 209, 82, 97, 65, 33, 81, 49, 65, 81, 17, + 81, 81, 17, 81, 98, 97, 0, 9, 15, 4, 240, 240, + 33, 241, 49, 49, 49, 49, 49, 49, 65, 240, 112, 21, + 11, 0, 11, 65, 145, 240, 240, 210, 162, 162, 162, 161, + 177, 161, 161, 146, 33, 97, 70, 240, 28, 11, 240, 240, + 49, 161, 161, 161, 161, 161, 81, 65, 65, 81, 49, 97, + 18, 115, 130, 146, 147, 145, 22, 49, 162, 0, 9, 32, + 20, 4, 193, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 50, 34, 49, 240, 176, 23, 12, 0, 17, + 35, 97, 18, 17, 81, 18, 33, 49, 17, 81, 66, 81, + 66, 97, 50, 162, 0, 10, 16, 20, 11, 0, 17, 113, + 35, 99, 18, 82, 49, 82, 50, 66, 65, 66, 81, 65, + 0, 7, 112, 16, 10, 0, 16, 66, 113, 129, 81, 49, + 97, 33, 97, 39, 0, 7, 112, 21, 7, 0, 11, 66, + 66, 18, 33, 49, 33, 49, 33, 33, 49, 18, 50, 81, + 97, 97, 97, 208, 24, 13, 0, 19, 114, 146, 177, 177, + 193, 65, 113, 50, 113, 35, 131, 17, 178, 178, 178, 65, + 114, 34, 131, 64, 19, 9, 0, 11, 81, 98, 18, 50, + 65, 33, 129, 129, 129, 129, 129, 129, 0, 6, 80, 16, + 8, 0, 11, 65, 83, 50, 98, 114, 130, 114, 97, 67, + 240, 240, 224, 21, 11, 0, 8, 49, 161, 162, 146, 161, + 161, 167, 36, 146, 161, 161, 162, 161, 161, 0, 7, 80, + 17, 10, 0, 17, 81, 129, 97, 34, 81, 34, 66, 50, + 34, 84, 0, 6, 96, 20, 8, 0, 11, 81, 113, 113, + 98, 33, 49, 49, 49, 65, 18, 65, 17, 98, 240, 240, + 224, 25, 11, 0, 17, 113, 113, 33, 113, 33, 65, 33, + 33, 51, 17, 33, 33, 33, 17, 34, 17, 35, 50, 0, + 7, 112, 18, 7, 0, 10, 65, 97, 49, 49, 17, 81, + 83, 65, 17, 65, 33, 240, 240, 224, 19, 11, 0, 18, + 113, 145, 49, 97, 65, 81, 85, 161, 161, 145, 161, 161, + 145, 240, 32, 17, 12, 0, 18, 84, 83, 33, 66, 81, + 161, 161, 177, 177, 181, 0, 7, 96, 24, 15, 0, 6, + 8, 113, 225, 225, 225, 210, 179, 194, 226, 241, 241, 225, + 225, 225, 225, 225, 218, 0, 9, 80, 20, 4, 193, 49, + 49, 49, 50, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 240, 176, 25, 13, 240, 240, 167, 194, 177, 193, + 193, 193, 193, 194, 210, 178, 147, 161, 193, 193, 193, 82, + 36, 100, 0, 9, 16, 13, 10, 0, 14, 1, 114, 17, + 49, 33, 51, 0, 14, 16, 20, 5, 240, 17, 66, 240, + 49, 66, 50, 50, 50, 50, 50, 50, 50, 49, 50, 65, + 240, 208, 30, 10, 240, 240, 49, 145, 146, 129, 17, 97, + 17, 115, 97, 33, 97, 33, 82, 34, 81, 34, 82, 35, + 68, 145, 145, 161, 145, 0, 7, 112, 37, 18, 240, 240, + 179, 226, 34, 177, 81, 177, 240, 33, 240, 33, 240, 34, + 240, 33, 240, 33, 247, 209, 240, 34, 240, 18, 240, 18, + 227, 215, 180, 34, 240, 56, 0, 11, 64, 19, 10, 0, + 12, 1, 49, 20, 82, 18, 83, 17, 82, 18, 65, 21, + 161, 0, 11, 64, 35, 16, 0, 7, 21, 36, 113, 81, + 130, 97, 113, 113, 98, 129, 81, 161, 65, 162, 33, 193, + 33, 198, 178, 213, 209, 33, 193, 241, 240, 227, 240, 20, + 0, 8, 64, 16, 3, 193, 33, 33, 33, 33, 33, 129, + 33, 33, 33, 33, 33, 240, 128, 30, 13, 240, 240, 81, + 148, 116, 100, 131, 161, 34, 130, 49, 130, 50, 115, 49, + 131, 33, 149, 162, 194, 178, 178, 65, 67, 101, 0, 10, + 48, 12, 10, 240, 240, 97, 50, 51, 34, 65, 0, 24, + 16, 36, 15, 0, 8, 50, 178, 178, 193, 225, 209, 65, + 145, 49, 145, 49, 113, 33, 49, 113, 33, 49, 113, 33, + 50, 33, 49, 33, 82, 49, 49, 161, 66, 98, 118, 0, + 12, 17, 8, 240, 240, 49, 97, 34, 49, 17, 17, 49, + 17, 33, 49, 0, 16, 96, 30, 15, 0, 12, 97, 129, + 66, 98, 50, 114, 50, 98, 65, 114, 65, 130, 66, 145, + 66, 146, 50, 146, 50, 146, 65, 146, 65, 0, 13, 48, + 15, 12, 0, 13, 72, 193, 178, 177, 177, 177, 177, 177, + 0, 12, 32, 8, 9, 0, 13, 71, 0, 13, 96, 42, + 15, 0, 8, 20, 161, 209, 209, 20, 129, 17, 49, 129, + 17, 33, 129, 33, 17, 97, 33, 33, 17, 97, 33, 33, + 33, 81, 33, 33, 51, 17, 49, 33, 113, 49, 145, 82, + 97, 119, 0, 13, 112, 8, 10, 0, 7, 72, 0, 22, + 96, 15, 9, 240, 241, 98, 113, 49, 49, 81, 34, 65, + 68, 0, 18, 48, 19, 11, 0, 10, 1, 161, 162, 161, + 119, 113, 161, 161, 161, 161, 240, 217, 0, 7, 16, 17, + 9, 240, 195, 129, 129, 113, 129, 65, 49, 49, 65, 18, + 97, 0, 16, 64, 13, 8, 240, 149, 113, 97, 129, 129, + 97, 82, 0, 15, 64, 8, 5, 240, 33, 34, 0, 12, + 112, 34, 16, 0, 13, 17, 240, 17, 113, 113, 113, 113, + 98, 114, 82, 114, 82, 113, 17, 65, 17, 82, 17, 49, + 53, 49, 49, 193, 33, 193, 33, 241, 0, 13, 112, 42, + 17, 0, 6, 77, 240, 33, 129, 49, 133, 49, 113, 65, + 49, 97, 81, 49, 97, 82, 33, 113, 66, 33, 134, 33, + 209, 33, 209, 240, 17, 240, 17, 240, 17, 240, 17, 240, + 17, 231, 0, 11, 32, 9, 5, 0, 6, 115, 35, 0, + 7, 96, 10, 4, 0, 8, 17, 49, 49, 34, 240, 112, + 12, 3, 145, 33, 33, 33, 33, 33, 33, 0, 5, 112, + 15, 9, 240, 241, 113, 113, 49, 49, 81, 49, 65, 68, + 0, 18, 48, 35, 16, 0, 10, 1, 81, 162, 66, 146, + 66, 146, 66, 146, 66, 161, 66, 161, 81, 130, 51, 114, + 50, 130, 65, 130, 65, 130, 65, 130, 65, 130, 65, 0, + 13, 16, 41, 14, 0, 6, 65, 65, 113, 81, 97, 97, + 82, 97, 81, 113, 65, 129, 50, 129, 49, 193, 49, 145, + 34, 129, 33, 17, 113, 18, 33, 114, 65, 18, 49, 38, + 65, 113, 209, 209, 0, 9, 48, 36, 13, 0, 6, 81, + 193, 81, 97, 66, 97, 65, 113, 49, 129, 33, 145, 33, + 145, 17, 177, 193, 19, 113, 65, 113, 65, 97, 81, 177, + 50, 113, 33, 162, 0, 8, 96, 46, 16, 0, 6, 20, + 97, 65, 49, 82, 129, 81, 129, 81, 161, 50, 161, 49, + 178, 17, 193, 18, 49, 98, 33, 50, 145, 34, 17, 145, + 17, 49, 129, 17, 65, 113, 33, 67, 81, 53, 97, 129, + 241, 241, 0, 10, 64, 23, 11, 0, 6, 2, 0, 9, + 18, 130, 145, 97, 34, 97, 33, 113, 34, 97, 49, 81, + 85, 0, 8, 96, 36, 11, 240, 161, 178, 177, 129, 145, + 17, 129, 17, 129, 17, 113, 33, 113, 49, 97, 49, 82, + 49, 81, 65, 88, 49, 81, 65, 81, 49, 97, 49, 97, + 49, 0, 8, 16, 37, 11, 240, 193, 145, 240, 97, 145, + 17, 129, 17, 129, 18, 97, 49, 97, 49, 97, 49, 97, + 50, 65, 81, 72, 49, 81, 65, 81, 50, 81, 49, 113, + 33, 113, 0, 7, 16, 35, 10, 240, 240, 50, 129, 17, + 240, 34, 130, 113, 33, 97, 33, 97, 33, 97, 33, 81, + 65, 65, 65, 71, 49, 65, 50, 65, 49, 97, 33, 97, + 145, 0, 6, 64, 36, 10, 240, 240, 33, 129, 17, 49, + 99, 240, 18, 130, 113, 33, 97, 33, 97, 33, 97, 33, + 81, 65, 65, 65, 71, 49, 65, 49, 81, 49, 97, 33, + 97, 0, 6, 64, 37, 11, 240, 240, 81, 34, 240, 65, + 145, 17, 129, 17, 129, 17, 113, 33, 113, 49, 97, 49, + 82, 49, 81, 65, 88, 49, 81, 65, 81, 49, 97, 49, + 97, 49, 0, 8, 16, 34, 10, 240, 240, 51, 115, 115, + 240, 34, 130, 114, 17, 97, 33, 97, 33, 97, 33, 82, + 49, 65, 65, 71, 49, 65, 50, 65, 49, 97, 33, 97, + 0, 6, 64, 37, 18, 0, 9, 114, 241, 23, 145, 17, + 225, 33, 210, 33, 209, 49, 194, 49, 193, 72, 81, 65, + 183, 177, 81, 162, 81, 161, 97, 146, 97, 145, 113, 145, + 119, 0, 11, 80, 24, 13, 240, 240, 241, 162, 146, 177, + 177, 193, 177, 193, 193, 193, 193, 209, 99, 70, 161, 193, + 209, 162, 0, 9, 27, 11, 240, 240, 113, 177, 240, 49, + 167, 65, 161, 145, 161, 161, 51, 49, 49, 97, 161, 161, + 113, 34, 66, 70, 0, 8, 96, 31, 11, 240, 240, 162, + 129, 240, 209, 21, 65, 35, 81, 146, 145, 161, 97, 49, + 51, 49, 49, 97, 161, 161, 113, 34, 82, 54, 113, 0, + 6, 48, 28, 11, 0, 6, 17, 145, 17, 240, 209, 21, + 65, 161, 145, 161, 161, 67, 34, 34, 81, 161, 161, 97, + 50, 66, 70, 0, 7, 48, 28, 12, 240, 193, 241, 240, + 49, 177, 22, 65, 177, 161, 177, 177, 82, 50, 35, 81, + 177, 177, 177, 113, 50, 67, 70, 0, 9, 80, 20, 5, + 241, 82, 129, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 66, 65, 240, 192, 21, 5, 240, 18, 33, 161, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 65, + 240, 240, 32, 22, 5, 240, 17, 49, 17, 129, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 81, 240, 240, + 32, 22, 6, 240, 145, 33, 145, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 97, 240, 240, 48, 40, + 18, 0, 9, 98, 240, 21, 209, 51, 177, 98, 145, 129, + 129, 129, 129, 129, 39, 129, 129, 129, 129, 129, 114, 113, + 130, 113, 130, 17, 66, 130, 17, 65, 145, 49, 18, 241, + 0, 12, 16, 43, 19, 0, 10, 35, 65, 161, 49, 18, + 240, 17, 177, 193, 82, 177, 82, 177, 83, 146, 81, 17, + 145, 97, 17, 145, 82, 18, 114, 82, 33, 113, 97, 50, + 82, 97, 71, 113, 99, 129, 240, 34, 0, 14, 37, 15, + 240, 240, 97, 241, 241, 240, 130, 193, 114, 66, 145, 49, + 162, 33, 177, 33, 177, 33, 177, 33, 177, 33, 177, 33, + 161, 65, 129, 82, 98, 99, 19, 177, 0, 10, 64, 36, + 15, 0, 6, 65, 240, 240, 146, 193, 114, 66, 145, 49, + 162, 33, 177, 33, 177, 33, 177, 33, 177, 33, 177, 33, + 161, 65, 129, 82, 98, 99, 19, 177, 0, 10, 64, 36, + 15, 0, 6, 50, 193, 209, 194, 193, 114, 66, 145, 49, + 162, 33, 177, 33, 177, 33, 177, 33, 177, 33, 177, 33, + 161, 65, 130, 66, 98, 99, 19, 178, 0, 10, 48, 38, + 15, 0, 6, 18, 65, 113, 36, 240, 114, 193, 114, 66, + 145, 49, 162, 33, 177, 33, 177, 33, 177, 33, 177, 33, + 177, 33, 161, 65, 130, 66, 98, 99, 19, 178, 0, 10, + 48, 37, 15, 0, 5, 98, 98, 225, 240, 98, 193, 114, + 66, 145, 49, 162, 33, 177, 33, 177, 33, 177, 33, 177, + 33, 177, 33, 161, 65, 130, 66, 98, 99, 19, 178, 0, + 10, 48, 23, 10, 0, 8, 49, 33, 81, 50, 65, 66, + 33, 100, 114, 130, 116, 82, 34, 65, 65, 161, 0, 10, + 32, 49, 17, 0, 6, 114, 66, 115, 81, 129, 97, 18, + 81, 97, 50, 50, 97, 65, 49, 97, 97, 33, 81, 113, + 33, 81, 113, 33, 65, 129, 33, 49, 145, 34, 33, 130, + 49, 17, 145, 66, 145, 97, 130, 81, 18, 66, 165, 0, + 13, 96, 37, 17, 0, 7, 17, 240, 34, 240, 240, 209, + 240, 17, 193, 34, 193, 34, 193, 33, 209, 33, 209, 34, + 193, 49, 178, 49, 177, 81, 145, 98, 113, 130, 51, 180, + 0, 11, 80, 36, 17, 0, 7, 49, 241, 240, 240, 225, + 240, 17, 193, 34, 193, 34, 193, 33, 209, 33, 209, 33, + 209, 34, 178, 49, 177, 66, 146, 81, 130, 114, 66, 165, + 0, 11, 80, 37, 17, 0, 7, 33, 241, 17, 240, 240, + 209, 240, 17, 193, 34, 193, 34, 193, 33, 209, 33, 209, + 34, 178, 49, 178, 49, 177, 81, 145, 98, 113, 131, 35, + 180, 0, 11, 80, 38, 17, 0, 6, 98, 66, 146, 66, + 240, 240, 162, 177, 49, 209, 33, 209, 33, 209, 33, 209, + 33, 209, 33, 194, 33, 193, 65, 162, 66, 145, 97, 114, + 130, 51, 179, 0, 11, 96, 29, 14, 0, 6, 17, 178, + 240, 49, 209, 34, 130, 50, 113, 82, 97, 116, 18, 178, + 209, 194, 193, 209, 193, 209, 209, 209, 0, 9, 64, 26, + 10, 240, 240, 167, 49, 145, 145, 145, 151, 49, 82, 33, + 97, 33, 81, 54, 65, 145, 145, 145, 145, 151, 0, 6, + 80, 40, 13, 240, 240, 153, 66, 113, 65, 114, 49, 113, + 65, 83, 65, 51, 97, 34, 129, 34, 129, 51, 97, 82, + 81, 113, 65, 113, 65, 113, 65, 113, 65, 17, 66, 97, + 50, 116, 0, 8, 112, 24, 11, 0, 11, 49, 178, 240, + 241, 145, 145, 161, 35, 65, 49, 17, 65, 33, 33, 65, + 17, 66, 49, 0, 8, 22, 9, 0, 10, 97, 113, 240, + 240, 49, 113, 129, 34, 49, 33, 17, 49, 17, 49, 35, + 0, 6, 48, 21, 9, 0, 11, 82, 145, 240, 129, 113, + 129, 34, 49, 33, 17, 49, 17, 49, 35, 0, 6, 48, + 23, 9, 0, 10, 34, 49, 33, 35, 240, 129, 113, 129, + 34, 49, 33, 17, 49, 17, 49, 35, 0, 7, 64, 20, + 9, 0, 13, 1, 240, 129, 113, 129, 34, 49, 33, 17, + 49, 17, 49, 35, 0, 6, 48, 24, 11, 0, 11, 51, + 131, 131, 240, 241, 145, 145, 49, 97, 33, 17, 65, 33, + 33, 65, 17, 66, 49, 0, 8, 29, 16, 0, 23, 19, + 193, 34, 81, 65, 34, 81, 38, 113, 35, 145, 33, 18, + 145, 33, 17, 17, 129, 17, 49, 22, 34, 0, 11, 96, + 17, 8, 0, 12, 50, 81, 97, 113, 97, 129, 117, 81, + 113, 129, 82, 240, 80, 20, 12, 0, 14, 2, 193, 240, + 240, 51, 129, 49, 97, 34, 85, 145, 177, 199, 0, 7, + 96, 21, 13, 0, 13, 81, 177, 240, 240, 132, 129, 50, + 113, 34, 86, 145, 193, 209, 215, 0, 8, 48, 22, 13, + 0, 13, 82, 162, 17, 240, 240, 100, 129, 49, 113, 34, + 86, 161, 193, 193, 215, 0, 8, 48, 21, 13, 0, 15, + 2, 33, 240, 240, 99, 145, 49, 113, 34, 86, 145, 193, + 209, 215, 0, 8, 48, 16, 5, 240, 240, 162, 81, 209, + 65, 65, 65, 65, 65, 81, 240, 240, 32, 16, 5, 240, + 240, 193, 34, 225, 65, 65, 65, 65, 65, 65, 81, 240, + 192, 19, 6, 0, 6, 17, 67, 49, 33, 145, 81, 81, + 81, 81, 81, 81, 97, 240, 240, 48, 16, 7, 0, 8, + 98, 33, 177, 97, 97, 97, 97, 97, 97, 0, 5, 96, + 19, 10, 0, 13, 117, 113, 240, 82, 161, 65, 81, 33, + 97, 33, 97, 54, 0, 6, 80, 24, 10, 0, 11, 50, + 113, 33, 33, 114, 240, 49, 116, 82, 33, 82, 49, 66, + 49, 66, 65, 65, 0, 7, 16, 19, 10, 0, 12, 113, + 162, 240, 178, 113, 130, 65, 49, 97, 33, 97, 54, 0, + 6, 80, 19, 10, 0, 11, 113, 114, 240, 194, 113, 130, + 65, 49, 97, 33, 97, 54, 0, 7, 112, 20, 10, 0, + 11, 82, 113, 33, 240, 178, 113, 130, 65, 49, 97, 33, + 97, 54, 0, 7, 112, 23, 11, 0, 13, 115, 65, 33, + 49, 33, 130, 240, 50, 130, 130, 65, 65, 97, 49, 97, + 70, 0, 7, 32, 21, 11, 0, 12, 81, 225, 240, 210, + 130, 145, 81, 49, 97, 49, 98, 50, 35, 98, 0, 7, + 80, 13, 12, 0, 14, 2, 161, 240, 74, 240, 241, 0, + 14, 48, 25, 10, 0, 13, 33, 145, 129, 113, 17, 82, + 17, 82, 33, 17, 49, 33, 49, 33, 33, 49, 50, 20, + 66, 0, 7, 19, 10, 0, 11, 65, 161, 161, 241, 145, + 97, 33, 97, 34, 66, 50, 34, 84, 0, 8, 20, 10, + 0, 11, 113, 129, 114, 240, 18, 129, 97, 33, 97, 34, + 66, 50, 34, 84, 0, 8, 20, 10, 0, 12, 114, 115, + 240, 161, 145, 97, 33, 97, 34, 66, 50, 34, 84, 0, + 6, 96, 22, 11, 0, 14, 2, 33, 240, 17, 161, 97, + 34, 97, 34, 97, 49, 82, 50, 50, 85, 0, 8, 96, + 20, 10, 0, 14, 33, 114, 209, 145, 33, 81, 65, 65, + 85, 129, 145, 145, 129, 145, 240, 160, 25, 8, 240, 240, + 166, 161, 113, 113, 33, 67, 18, 33, 65, 33, 65, 37, + 49, 113, 113, 113, 113, 118, 240, 240, 192, 22, 10, 0, + 13, 114, 33, 240, 240, 17, 33, 97, 49, 65, 83, 17, + 145, 129, 145, 129, 145, 240, 160, +}; + +//***************************************************************************** +// +// The glyph offset table for the 22 point Handwriting font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetHandwriting22[] = +{ + 0, 5, 25, 39, 78, 117, 153, 197, + 206, 230, 253, 263, 283, 294, 302, 310, + 333, 371, 391, 427, 453, 491, 521, 548, + 572, 607, 641, 652, 665, 684, 695, 714, + 737, 797, 834, 867, 889, 929, 958, 982, + 1013, 1055, 1075, 1099, 1134, 1157, 1206, 1249, + 1287, 1316, 1350, 1382, 1407, 1431, 1465, 1496, + 1550, 1583, 1610, 1647, 1674, 1695, 1719, 1736, + 1744, 1753, 1774, 1800, 1817, 1851, 1869, 1890, + 1913, 1940, 1955, 1976, 2004, 2024, 2047, 2067, + 2083, 2104, 2128, 2147, 2163, 2184, 2201, 2221, + 2246, 2264, 2283, 2300, 2324, 2344, 2369, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2382, 2402, 2432, 2469, 2488, 2523, 2539, + 2569, 2581, 2617, 2634, 2664, 2679, 2687, 2729, + 2737, 2752, 2771, 2788, 2801, 2809, 2843, 2885, + 2894, 2904, 2916, 2931, 2966, 3007, 3043, 3089, + 3112, 3148, 3185, 3220, 3256, 3293, 3327, 3364, + 3388, 3415, 3446, 3474, 3502, 3522, 3543, 3565, + 3587, 3627, 3670, 3707, 3743, 3779, 3817, 3854, + 3877, 3926, 3963, 3999, 4036, 4074, 4103, 4129, + 4169, 4193, 4215, 4236, 4259, 4279, 4303, 4332, + 4349, 4369, 4390, 4412, 4433, 4449, 4465, 4484, + 4500, 4519, 4543, 4562, 4581, 4601, 4624, 4645, + 4658, 4683, 4702, 4722, 4742, 4764, 4784, 4809, +}; + +//***************************************************************************** +// +// The font definition for the 22 point Handwriting font. +// +//***************************************************************************** +const tFontEx g_sFontExHandwriting22 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 21, + + // + // The height of the font. + // + 25, + + // + // The baseline of the font. + // + 20, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetHandwriting22, + + // + // A pointer to the actual font data + // + g_pui8Handwriting22Data +}; diff --git a/third_party/fonts/ofl/fonts/fonthandwriting24.c b/third_party/fonts/ofl/fonts/fonthandwriting24.c new file mode 100644 index 0000000..daa4ad2 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthandwriting24.c @@ -0,0 +1,672 @@ +//***************************************************************************** +// +// fonthandwriting24.c - Font definition for the 24pt Handwriting font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://helloalan.com/projects/breip/ +// +// This Font Software is Copyright (c) 2008, Alan Hussey and Adam Breipohl. +// All Rights Reserved. +// +// "Breip" is a Reserved Font Name for this Font Software. +// +// This Font Software is licensed under the SIL Open Font License, +// Version 1.0. No modification of the license is permitted, only verbatim +// copy is allowed. This license is copied below, and is also available with +// a FAQ at: http://scripts.sil.org/OFL +// ------------------------------------------------------------------------ +// +// SIL OPEN FONT LICENSE +// +// Version 1.0 - 22 November 2005 +// PREAMBLE +// +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of cooperative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide an open +// framework in which fonts may be shared and improved in partnership with +// others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and sold with any software provided that the font names of +// derivative works are changed. The fonts and derivatives, however, cannot +// be released under any other type of license. +// +// DEFINITIONS +// +// "Font Software" refers to any and all of the following: +// +// * font files +// * data files +// * source code +// * build scripts +// * documentation +// +// "Reserved Font Name" refers to the Font Software name as seen by users +// and any other names as specified after the copyright statement. +// +// "Standard Version" refers to the collection of Font Software components +// as distributed by the Copyright Holder. +// +// "Modified Version" refers to any derivative font software made by adding +// to, deleting, or substituting -- in part or in whole -- any of the +// components of the Standard Version, by changing formats or by porting +// the Font Software to a new environment. +// +// "Author" refers to any designer, engineer, programmer, technical writer +// or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, in +// Standard or Modified Versions, may be sold by itself. +// +// 2) Standard or Modified Versions of the Font Software may be bundled, +// redistributed and sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or in +// the appropriate machine-readable metadata fields within text or binary +// files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s), in part or in whole, unless explicit written permission is +// granted by the Copyright Holder. This restriction applies to all +// references stored in the Font Software, such as the font menu name and +// other font description fields, which are used to differentiate the font +// from others. +// +// 4) The name(s) of the Copyright Holder or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any Modified +// Version, except to acknowledge the contribution(s) of the Copyright Holder +// and the Author(s) or with their explicit written permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, must +// be distributed using this license, and may not be distributed under any +// other license. +// +// TERMINATION +// +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER +// DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: handwriting +// Size: 24 point +// Bold: no +// Italic: no +// Memory usage: 5492 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 24 point Handwriting font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Handwriting24Data[5290] = +{ + 5, 10, 0, 33, 96, 21, 6, 226, 66, 66, 66, 51, + 51, 50, 66, 66, 65, 81, 81, 240, 129, 81, 66, 0, + 5, 96, 15, 6, 193, 81, 33, 33, 33, 33, 17, 49, + 33, 81, 0, 14, 64, 40, 19, 0, 7, 49, 240, 49, + 129, 146, 113, 146, 113, 126, 129, 113, 34, 97, 113, 161, + 113, 161, 113, 161, 113, 161, 113, 141, 99, 114, 19, 66, + 129, 130, 129, 129, 145, 129, 0, 18, 80, 46, 14, 240, + 240, 81, 129, 65, 129, 37, 99, 33, 130, 49, 115, 49, + 113, 17, 49, 97, 33, 49, 113, 17, 49, 137, 97, 49, + 49, 81, 49, 49, 81, 65, 17, 97, 67, 97, 35, 86, + 49, 209, 209, 225, 0, 10, 112, 43, 17, 0, 7, 1, + 179, 34, 49, 97, 65, 49, 132, 65, 241, 240, 17, 241, + 240, 17, 242, 241, 66, 146, 49, 33, 129, 49, 193, 49, + 177, 65, 65, 97, 65, 65, 97, 81, 33, 97, 114, 0, + 15, 48, 48, 16, 240, 240, 52, 178, 49, 161, 65, 161, + 65, 161, 65, 177, 49, 177, 33, 209, 17, 226, 97, 114, + 81, 146, 65, 129, 33, 49, 129, 49, 33, 113, 81, 17, + 113, 98, 113, 99, 97, 82, 33, 81, 66, 65, 84, 0, + 13, 16, 9, 3, 145, 33, 33, 33, 0, 7, 96, 27, + 9, 240, 130, 97, 113, 113, 129, 113, 129, 113, 129, 129, + 129, 129, 129, 129, 129, 129, 145, 65, 49, 49, 83, 0, + 7, 32, 23, 6, 194, 81, 82, 81, 81, 82, 81, 81, + 81, 81, 81, 81, 81, 66, 65, 81, 66, 65, 0, 5, + 96, 10, 5, 177, 51, 49, 51, 49, 0, 12, 112, 22, + 12, 0, 6, 49, 178, 177, 178, 162, 162, 177, 106, 113, + 178, 162, 162, 162, 162, 161, 0, 12, 96, 11, 3, 0, + 6, 49, 33, 33, 33, 33, 33, 224, 8, 13, 0, 17, + 123, 0, 24, 80, 9, 5, 0, 11, 115, 34, 240, 240, + 48, 25, 14, 240, 240, 145, 194, 178, 193, 193, 194, 193, + 193, 194, 193, 193, 209, 193, 194, 193, 193, 194, 193, 0, + 13, 112, 41, 19, 240, 146, 244, 226, 49, 209, 65, 194, + 193, 65, 225, 34, 225, 34, 225, 33, 241, 33, 241, 33, + 241, 34, 225, 34, 210, 49, 209, 66, 178, 82, 146, 98, + 130, 131, 51, 197, 0, 17, 96, 22, 3, 97, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 240, 128, 39, 18, 0, 7, 20, 194, 49, + 178, 65, 240, 33, 240, 18, 240, 17, 240, 33, 240, 33, + 240, 18, 240, 18, 240, 17, 146, 97, 114, 129, 98, 145, + 82, 162, 49, 209, 33, 227, 0, 17, 34, 17, 240, 240, + 152, 114, 99, 66, 161, 50, 177, 242, 226, 226, 226, 244, + 240, 18, 240, 18, 242, 240, 17, 240, 17, 240, 17, 242, + 129, 82, 165, 0, 15, 64, 41, 19, 0, 8, 19, 244, + 211, 18, 195, 34, 178, 66, 162, 82, 146, 98, 145, 114, + 129, 130, 51, 34, 118, 92, 240, 17, 240, 49, 240, 49, + 240, 49, 240, 49, 240, 49, 240, 49, 0, 15, 32, 30, + 11, 240, 181, 53, 97, 161, 161, 161, 161, 161, 36, 67, + 65, 33, 17, 81, 34, 97, 161, 146, 146, 145, 161, 65, + 65, 100, 0, 10, 32, 29, 13, 240, 240, 241, 193, 193, + 177, 177, 193, 177, 177, 177, 193, 177, 193, 81, 97, 99, + 49, 145, 33, 145, 34, 113, 87, 0, 11, 112, 24, 13, + 240, 179, 215, 194, 177, 193, 178, 177, 193, 177, 193, 178, + 177, 193, 177, 193, 177, 193, 193, 0, 12, 48, 39, 11, + 240, 65, 161, 161, 161, 98, 18, 66, 49, 65, 81, 49, + 81, 65, 66, 65, 65, 82, 33, 115, 146, 145, 18, 97, + 65, 81, 65, 81, 66, 65, 65, 81, 34, 114, 0, 9, + 16, 39, 16, 240, 240, 87, 18, 82, 114, 65, 146, 50, + 131, 49, 145, 17, 50, 113, 33, 65, 98, 33, 66, 65, + 65, 85, 81, 241, 241, 241, 241, 241, 241, 241, 241, 240, + 17, 0, 14, 32, 11, 4, 240, 210, 34, 240, 178, 33, + 240, 240, 208, 14, 4, 240, 240, 162, 34, 240, 193, 49, + 49, 49, 33, 240, 64, 21, 13, 0, 9, 49, 163, 131, + 131, 131, 146, 162, 180, 179, 194, 195, 194, 195, 193, 0, + 13, 32, 11, 12, 0, 12, 10, 0, 6, 42, 0, 19, + 96, 21, 14, 0, 8, 98, 211, 196, 210, 211, 211, 210, + 164, 147, 162, 163, 162, 163, 162, 0, 15, 64, 26, 12, + 240, 240, 134, 82, 66, 50, 97, 49, 114, 33, 114, 33, + 114, 33, 113, 162, 131, 0, 11, 66, 161, 0, 9, 112, + 64, 21, 0, 5, 118, 225, 97, 193, 129, 161, 161, 129, + 177, 114, 81, 82, 97, 83, 81, 97, 65, 33, 81, 49, + 33, 49, 97, 33, 49, 33, 33, 113, 33, 49, 33, 33, + 98, 33, 49, 33, 17, 99, 17, 65, 33, 33, 66, 19, + 49, 50, 21, 145, 65, 49, 161, 98, 178, 114, 146, 163, + 51, 243, 0, 17, 40, 13, 240, 240, 17, 179, 161, 17, + 146, 17, 145, 34, 129, 49, 114, 49, 114, 49, 113, 66, + 97, 81, 82, 81, 90, 49, 98, 65, 98, 65, 113, 50, + 113, 49, 129, 49, 129, 0, 11, 96, 36, 13, 240, 240, + 154, 49, 130, 49, 114, 49, 98, 65, 67, 81, 34, 131, + 161, 36, 97, 98, 65, 113, 65, 113, 65, 113, 65, 98, + 162, 162, 162, 146, 147, 0, 10, 112, 25, 16, 240, 240, + 146, 195, 194, 210, 210, 225, 226, 225, 226, 225, 241, 241, + 241, 242, 241, 242, 101, 87, 0, 16, 96, 44, 15, 240, + 240, 18, 198, 146, 37, 113, 83, 97, 115, 65, 146, 49, + 161, 49, 161, 49, 161, 49, 146, 49, 146, 34, 145, 50, + 145, 50, 130, 50, 129, 66, 17, 82, 66, 33, 50, 81, + 53, 178, 0, 12, 32, 30, 14, 240, 241, 209, 38, 90, + 66, 193, 209, 194, 194, 193, 99, 65, 51, 98, 49, 129, + 209, 209, 210, 114, 50, 98, 88, 131, 0, 13, 32, 27, + 16, 240, 240, 136, 57, 113, 241, 241, 241, 241, 115, 81, + 37, 129, 241, 241, 241, 241, 226, 226, 226, 225, 241, 0, + 15, 112, 34, 16, 240, 240, 114, 210, 210, 225, 225, 226, + 225, 226, 226, 145, 65, 177, 49, 193, 33, 193, 33, 193, + 33, 193, 33, 178, 34, 146, 67, 23, 118, 0, 14, 112, + 46, 15, 240, 240, 145, 81, 129, 81, 129, 81, 130, 66, + 114, 66, 114, 66, 114, 66, 97, 17, 66, 81, 33, 66, + 50, 49, 66, 34, 65, 68, 98, 50, 130, 50, 145, 50, + 145, 50, 145, 49, 162, 33, 177, 33, 0, 13, 23, 5, + 161, 65, 66, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 65, 65, 65, 65, 81, 240, 240, 112, 26, 15, 0, + 6, 68, 102, 116, 226, 227, 227, 227, 226, 226, 210, 225, + 210, 210, 209, 97, 98, 113, 66, 149, 0, 13, 96, 42, + 17, 240, 240, 65, 240, 17, 240, 17, 240, 17, 146, 81, + 130, 97, 115, 97, 99, 113, 83, 129, 67, 145, 66, 161, + 50, 177, 50, 177, 50, 178, 35, 162, 52, 130, 88, 49, + 240, 18, 0, 16, 80, 36, 17, 0, 6, 49, 240, 17, + 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, + 240, 17, 240, 18, 242, 240, 18, 242, 240, 18, 131, 82, + 99, 120, 0, 17, 80, 58, 21, 0, 8, 33, 240, 66, + 147, 115, 132, 97, 17, 114, 33, 97, 17, 113, 49, 82, + 17, 98, 49, 81, 34, 81, 66, 65, 49, 66, 66, 65, + 50, 34, 97, 65, 68, 113, 49, 240, 17, 49, 240, 18, + 33, 240, 33, 33, 240, 33, 33, 240, 33, 33, 240, 33, + 0, 21, 32, 45, 23, 0, 11, 17, 97, 226, 83, 210, + 83, 210, 84, 194, 84, 193, 98, 17, 178, 97, 34, 162, + 97, 34, 161, 113, 50, 130, 98, 50, 114, 114, 66, 83, + 114, 73, 129, 118, 130, 240, 82, 240, 97, 0, 22, 112, + 41, 19, 240, 240, 179, 242, 240, 33, 147, 81, 194, 50, + 209, 50, 210, 33, 226, 33, 241, 33, 241, 33, 241, 33, + 241, 34, 209, 50, 209, 65, 193, 82, 162, 98, 130, 130, + 82, 197, 0, 17, 96, 32, 10, 240, 86, 65, 66, 49, + 82, 33, 82, 33, 82, 33, 66, 49, 50, 65, 19, 83, + 113, 145, 145, 145, 145, 146, 130, 130, 130, 130, 0, 8, + 64, 39, 17, 240, 145, 242, 226, 226, 226, 226, 242, 226, + 161, 66, 177, 49, 193, 34, 193, 33, 194, 33, 193, 49, + 113, 50, 50, 97, 34, 66, 97, 18, 98, 83, 138, 149, + 36, 0, 15, 16, 38, 16, 240, 240, 57, 98, 98, 97, + 114, 97, 98, 113, 82, 129, 66, 145, 65, 161, 50, 161, + 50, 161, 50, 161, 66, 145, 83, 113, 115, 81, 148, 33, + 241, 241, 241, 0, 15, 112, 26, 14, 240, 240, 99, 148, + 117, 116, 146, 194, 194, 210, 211, 211, 196, 195, 210, 210, + 194, 178, 97, 51, 118, 0, 12, 112, 26, 16, 240, 240, + 211, 133, 118, 132, 18, 226, 226, 226, 241, 241, 242, 226, + 242, 226, 241, 242, 226, 242, 241, 0, 14, 80, 36, 20, + 0, 12, 82, 209, 65, 241, 49, 241, 34, 241, 34, 241, + 34, 241, 34, 241, 34, 226, 49, 226, 50, 209, 81, 194, + 82, 162, 114, 130, 146, 67, 198, 0, 18, 80, 37, 22, + 0, 16, 17, 240, 81, 240, 82, 50, 226, 81, 226, 82, + 194, 114, 162, 130, 162, 146, 130, 162, 114, 194, 98, 194, + 82, 226, 50, 240, 18, 19, 240, 36, 0, 20, 80, 57, + 22, 0, 10, 49, 240, 98, 240, 82, 240, 97, 240, 97, + 163, 130, 33, 101, 113, 33, 82, 49, 113, 33, 82, 65, + 97, 33, 81, 82, 81, 33, 81, 98, 65, 33, 81, 113, + 50, 33, 66, 114, 34, 34, 49, 145, 34, 49, 34, 146, + 17, 66, 18, 163, 98, 0, 21, 48, 37, 14, 0, 6, + 81, 34, 130, 34, 129, 66, 98, 82, 66, 98, 66, 114, + 34, 146, 18, 148, 178, 195, 164, 161, 34, 130, 50, 113, + 81, 98, 82, 81, 113, 81, 0, 11, 112, 31, 17, 0, + 5, 114, 241, 50, 162, 51, 146, 67, 129, 114, 98, 133, + 18, 210, 17, 242, 241, 240, 17, 242, 241, 242, 242, 241, + 240, 17, 0, 18, 41, 27, 0, 7, 104, 188, 19, 225, + 147, 240, 146, 240, 146, 240, 162, 240, 146, 240, 146, 240, + 162, 240, 146, 240, 162, 240, 161, 240, 162, 240, 162, 240, + 162, 195, 178, 103, 204, 240, 22, 0, 25, 26, 14, 240, + 241, 99, 72, 82, 193, 209, 209, 209, 209, 194, 193, 209, + 209, 209, 209, 209, 209, 209, 51, 118, 0, 13, 32, 23, + 13, 240, 240, 145, 194, 193, 209, 194, 193, 209, 209, 193, + 209, 194, 193, 209, 194, 193, 209, 0, 13, 32, 24, 13, + 240, 186, 193, 193, 193, 193, 193, 193, 193, 193, 209, 193, + 193, 193, 193, 193, 193, 193, 73, 0, 11, 80, 18, 10, + 240, 146, 130, 113, 17, 97, 33, 81, 49, 81, 65, 49, + 97, 0, 22, 96, 8, 11, 0, 26, 25, 0, 9, 112, + 8, 6, 193, 98, 97, 0, 16, 96, 23, 11, 0, 16, + 113, 145, 161, 145, 50, 81, 33, 33, 49, 49, 33, 49, + 33, 49, 51, 81, 0, 9, 112, 28, 10, 0, 6, 49, + 130, 130, 130, 130, 130, 130, 130, 130, 35, 50, 66, 34, + 81, 49, 81, 49, 66, 50, 34, 83, 0, 9, 48, 18, + 10, 0, 13, 17, 114, 114, 114, 129, 130, 130, 130, 147, + 34, 68, 0, 9, 32, 36, 13, 240, 240, 65, 194, 178, + 178, 178, 178, 178, 178, 193, 193, 98, 65, 66, 97, 50, + 113, 49, 114, 49, 114, 49, 99, 49, 82, 17, 51, 19, + 34, 53, 65, 0, 10, 20, 15, 0, 21, 52, 162, 49, + 129, 66, 129, 19, 103, 193, 209, 241, 225, 248, 0, 11, + 64, 23, 13, 0, 6, 119, 82, 97, 65, 193, 193, 194, + 178, 193, 65, 72, 129, 193, 193, 193, 194, 193, 0, 14, + 26, 11, 0, 15, 50, 130, 130, 145, 161, 161, 97, 49, + 83, 53, 33, 161, 161, 161, 145, 113, 33, 113, 17, 130, + 240, 16, 30, 15, 0, 15, 1, 225, 225, 241, 225, 225, + 98, 97, 84, 81, 65, 49, 97, 33, 81, 81, 33, 81, + 81, 17, 97, 98, 113, 0, 13, 48, 15, 4, 240, 240, + 34, 225, 49, 49, 49, 49, 49, 49, 65, 240, 240, 24, + 12, 0, 12, 65, 161, 177, 0, 5, 114, 178, 178, 178, + 178, 177, 178, 162, 162, 161, 49, 98, 70, 240, 32, 30, + 12, 240, 161, 162, 162, 162, 162, 177, 177, 81, 81, 50, + 97, 34, 113, 18, 131, 146, 161, 177, 179, 145, 23, 50, + 177, 177, 0, 10, 16, 24, 5, 161, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 66, 50, 50, 65, + 66, 65, 240, 240, 32, 26, 13, 0, 17, 18, 113, 36, + 85, 33, 84, 49, 49, 17, 97, 49, 17, 97, 66, 113, + 50, 113, 50, 178, 0, 12, 80, 22, 12, 0, 19, 65, + 35, 97, 21, 99, 34, 83, 49, 82, 66, 66, 81, 66, + 97, 65, 0, 10, 16, 19, 11, 0, 18, 49, 130, 130, + 130, 81, 49, 98, 33, 113, 34, 67, 69, 0, 8, 96, + 21, 7, 0, 12, 37, 33, 49, 33, 49, 33, 49, 33, + 34, 36, 50, 81, 97, 97, 97, 97, 208, 27, 14, 0, + 19, 81, 195, 161, 193, 209, 81, 113, 66, 113, 66, 114, + 19, 147, 17, 209, 209, 209, 210, 50, 133, 240, 240, 16, + 19, 10, 0, 12, 99, 102, 50, 81, 34, 129, 145, 145, + 145, 145, 145, 145, 0, 8, 80, 17, 8, 0, 12, 50, + 66, 81, 114, 130, 130, 113, 49, 34, 51, 0, 6, 64, + 23, 13, 0, 8, 33, 193, 194, 178, 193, 193, 194, 67, + 70, 84, 193, 193, 194, 178, 193, 193, 0, 12, 48, 19, + 10, 0, 16, 33, 145, 97, 33, 97, 33, 97, 33, 82, + 34, 50, 69, 0, 9, 32, 22, 9, 0, 12, 1, 129, + 129, 114, 33, 65, 50, 49, 65, 34, 66, 17, 97, 17, + 98, 0, 8, 64, 29, 12, 0, 19, 65, 113, 49, 129, + 33, 129, 33, 66, 33, 33, 49, 17, 33, 33, 49, 33, + 17, 34, 17, 50, 66, 81, 0, 9, 48, 19, 8, 0, + 13, 1, 50, 49, 33, 67, 97, 99, 81, 33, 65, 34, + 113, 0, 6, 32, 22, 11, 0, 20, 33, 33, 113, 34, + 97, 50, 65, 86, 129, 17, 145, 161, 161, 145, 161, 161, + 161, 80, 17, 13, 0, 18, 98, 118, 67, 81, 177, 177, + 193, 177, 193, 198, 0, 11, 80, 26, 15, 240, 240, 57, + 82, 52, 113, 225, 225, 210, 179, 194, 211, 226, 226, 225, + 225, 225, 225, 225, 225, 218, 0, 13, 48, 22, 4, 129, + 49, 49, 49, 50, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 49, 240, 240, 25, 13, 240, 184, 194, + 177, 193, 193, 193, 193, 194, 194, 209, 163, 146, 177, 193, + 193, 193, 81, 37, 99, 0, 12, 64, 13, 12, 0, 16, + 97, 97, 34, 18, 49, 49, 67, 0, 20, 21, 5, 178, + 50, 240, 130, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 34, 65, 240, 240, 48, 31, 10, 240, 129, 146, 130, + 130, 131, 114, 115, 98, 18, 81, 34, 81, 34, 66, 49, + 81, 49, 83, 19, 82, 17, 130, 145, 145, 145, 0, 9, + 16, 41, 18, 240, 132, 210, 49, 178, 240, 17, 240, 33, + 240, 33, 240, 33, 240, 34, 240, 33, 240, 33, 247, 210, + 240, 33, 240, 33, 240, 33, 240, 18, 213, 194, 20, 180, + 50, 240, 40, 0, 13, 96, 22, 12, 0, 13, 65, 36, + 99, 34, 98, 19, 97, 18, 17, 98, 19, 87, 65, 113, + 193, 0, 15, 32, 39, 17, 240, 240, 244, 36, 130, 241, + 97, 130, 113, 113, 129, 113, 145, 82, 161, 65, 178, 34, + 193, 33, 200, 177, 17, 197, 240, 19, 225, 240, 17, 240, + 17, 240, 17, 216, 0, 13, 16, 17, 3, 145, 33, 33, + 33, 33, 33, 33, 177, 33, 33, 33, 33, 33, 240, 176, + 33, 14, 240, 145, 179, 133, 116, 131, 164, 162, 34, 130, + 50, 131, 50, 115, 50, 131, 34, 147, 18, 164, 179, 194, + 194, 81, 82, 97, 52, 102, 0, 12, 112, 11, 11, 240, + 240, 50, 67, 34, 66, 0, 30, 80, 38, 16, 0, 8, + 100, 177, 210, 210, 225, 225, 66, 145, 49, 161, 50, 113, + 33, 49, 129, 33, 49, 129, 33, 50, 113, 33, 68, 65, + 33, 177, 65, 145, 83, 82, 134, 0, 14, 112, 17, 9, + 240, 81, 113, 113, 34, 65, 33, 17, 49, 17, 49, 49, + 0, 22, 32, 31, 16, 0, 12, 113, 81, 115, 50, 114, + 66, 114, 50, 114, 66, 114, 66, 130, 66, 162, 65, 162, + 65, 162, 66, 146, 66, 146, 66, 0, 18, 32, 16, 12, + 0, 13, 72, 178, 178, 177, 177, 177, 177, 177, 177, 0, + 13, 96, 8, 10, 0, 15, 8, 0, 17, 96, 47, 16, + 0, 6, 115, 178, 209, 225, 225, 21, 129, 17, 65, 129, + 17, 49, 129, 33, 33, 97, 33, 33, 33, 97, 33, 33, + 34, 81, 33, 33, 65, 65, 33, 33, 81, 49, 33, 49, + 113, 50, 145, 82, 113, 135, 0, 16, 96, 8, 11, 0, + 8, 41, 0, 27, 96, 15, 10, 240, 114, 114, 114, 65, + 49, 97, 34, 66, 68, 0, 24, 32, 22, 12, 0, 7, + 113, 193, 177, 178, 162, 162, 120, 129, 177, 177, 177, 177, + 177, 240, 58, 0, 10, 96, 18, 10, 240, 113, 114, 17, + 145, 129, 145, 145, 145, 50, 65, 33, 114, 0, 20, 80, + 14, 8, 240, 21, 113, 97, 113, 129, 129, 97, 82, 0, + 17, 64, 8, 6, 226, 50, 49, 0, 17, 16, 35, 17, + 0, 16, 17, 129, 129, 113, 129, 98, 130, 82, 130, 82, + 130, 83, 98, 17, 49, 33, 82, 33, 49, 54, 50, 33, + 209, 33, 209, 33, 240, 17, 0, 16, 112, 46, 17, 240, + 240, 93, 240, 33, 129, 50, 132, 65, 98, 49, 65, 81, + 81, 65, 81, 82, 49, 81, 82, 49, 83, 50, 49, 131, + 17, 49, 193, 49, 193, 49, 193, 240, 17, 240, 17, 240, + 17, 240, 17, 216, 0, 15, 64, 9, 6, 0, 8, 51, + 36, 0, 10, 96, 11, 4, 0, 8, 17, 49, 49, 49, + 34, 240, 176, 13, 3, 97, 33, 33, 33, 33, 33, 33, + 33, 0, 6, 80, 15, 10, 240, 129, 114, 129, 65, 49, + 97, 49, 66, 68, 0, 24, 32, 37, 17, 0, 8, 66, + 81, 162, 67, 146, 82, 147, 66, 162, 66, 162, 66, 162, + 66, 146, 66, 130, 66, 130, 66, 130, 66, 130, 66, 130, + 66, 130, 66, 130, 81, 0, 18, 16, 45, 15, 240, 240, + 17, 225, 114, 81, 113, 97, 97, 113, 82, 113, 81, 129, + 65, 145, 65, 209, 49, 145, 50, 145, 33, 17, 129, 33, + 33, 114, 17, 49, 113, 17, 68, 49, 53, 97, 113, 81, + 129, 225, 0, 13, 96, 40, 14, 240, 225, 209, 209, 97, + 97, 82, 97, 81, 113, 65, 129, 50, 129, 49, 145, 33, + 209, 193, 19, 129, 65, 129, 49, 129, 65, 114, 65, 65, + 33, 81, 49, 145, 33, 178, 0, 12, 112, 53, 18, 240, + 240, 116, 98, 81, 49, 82, 161, 81, 161, 82, 161, 81, + 193, 49, 225, 18, 225, 17, 225, 17, 65, 130, 18, 50, + 177, 49, 17, 161, 49, 33, 146, 18, 49, 145, 33, 65, + 19, 65, 56, 97, 145, 240, 33, 240, 33, 240, 33, 0, + 14, 16, 26, 11, 240, 177, 161, 0, 9, 49, 131, 114, + 145, 113, 33, 113, 33, 113, 33, 113, 33, 98, 50, 35, + 84, 0, 10, 32, 37, 12, 240, 210, 193, 146, 162, 145, + 17, 145, 33, 129, 33, 113, 49, 113, 49, 113, 50, 97, + 65, 82, 65, 89, 49, 82, 65, 97, 50, 97, 49, 113, + 49, 113, 0, 10, 112, 38, 12, 240, 49, 161, 146, 178, + 162, 148, 129, 33, 129, 33, 114, 33, 113, 50, 97, 65, + 97, 65, 82, 65, 89, 49, 97, 65, 97, 65, 97, 50, + 97, 49, 113, 49, 0, 10, 48, 37, 11, 241, 147, 129, + 17, 240, 81, 145, 17, 129, 17, 114, 17, 113, 49, 97, + 49, 97, 49, 82, 49, 81, 66, 72, 49, 81, 65, 81, + 50, 81, 49, 97, 49, 0, 10, 112, 37, 11, 240, 145, + 145, 18, 33, 130, 129, 147, 129, 17, 129, 17, 113, 33, + 113, 49, 97, 49, 82, 49, 81, 65, 88, 49, 81, 65, + 81, 50, 81, 49, 97, 49, 0, 10, 112, 39, 12, 240, + 178, 33, 240, 97, 178, 145, 17, 145, 18, 129, 33, 114, + 33, 113, 49, 113, 50, 97, 65, 82, 65, 81, 23, 49, + 81, 81, 97, 50, 97, 49, 113, 49, 113, 0, 10, 112, + 36, 11, 240, 163, 131, 131, 240, 81, 147, 129, 17, 113, + 33, 113, 33, 113, 34, 97, 49, 82, 49, 81, 65, 88, + 49, 81, 65, 81, 49, 97, 49, 97, 49, 0, 9, 64, + 41, 19, 0, 5, 97, 240, 50, 240, 26, 130, 17, 241, + 33, 226, 33, 225, 49, 210, 49, 209, 65, 194, 72, 81, + 81, 185, 161, 97, 177, 97, 161, 113, 146, 113, 145, 129, + 145, 136, 180, 0, 15, 26, 14, 0, 7, 67, 161, 193, + 194, 193, 209, 193, 209, 209, 209, 210, 209, 100, 70, 178, + 209, 209, 209, 193, 0, 9, 96, 33, 12, 240, 209, 194, + 193, 240, 49, 22, 65, 21, 81, 177, 161, 177, 177, 83, + 34, 35, 81, 49, 113, 177, 113, 49, 113, 50, 82, 71, + 114, 0, 9, 112, 34, 13, 240, 240, 66, 161, 240, 240, + 49, 193, 23, 65, 193, 193, 178, 178, 97, 65, 67, 66, + 34, 114, 177, 193, 129, 50, 113, 50, 83, 71, 145, 0, + 9, 16, 29, 12, 240, 225, 163, 145, 240, 97, 177, 22, + 65, 177, 161, 177, 177, 82, 50, 35, 81, 177, 177, 177, + 113, 50, 67, 70, 0, 11, 16, 34, 14, 240, 240, 18, + 34, 240, 240, 81, 209, 24, 65, 209, 209, 194, 193, 114, + 65, 67, 82, 34, 130, 193, 209, 129, 66, 113, 66, 83, + 87, 162, 0, 11, 64, 22, 5, 161, 82, 129, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 50, 65, + 240, 240, 112, 22, 5, 193, 34, 145, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 66, 65, 65, 240, 240, + 112, 23, 5, 177, 49, 17, 129, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 66, 65, 65, 240, 240, 112, + 24, 6, 240, 49, 33, 145, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 82, 81, 81, 240, 240, 144, + 41, 20, 0, 10, 101, 242, 20, 225, 67, 193, 99, 161, + 130, 145, 145, 145, 145, 40, 145, 145, 130, 145, 130, 130, + 129, 146, 129, 146, 114, 146, 17, 66, 161, 33, 65, 177, + 52, 240, 33, 0, 16, 48, 21, 0, 8, 99, 240, 33, + 34, 49, 240, 20, 240, 161, 97, 209, 98, 193, 98, 178, + 84, 162, 84, 161, 98, 17, 161, 98, 18, 130, 97, 49, + 129, 113, 50, 98, 113, 66, 66, 114, 71, 129, 130, 146, + 240, 50, 0, 18, 16, 41, 17, 240, 129, 240, 34, 240, + 33, 240, 210, 226, 225, 130, 82, 146, 65, 177, 65, 193, + 34, 193, 34, 193, 34, 193, 34, 193, 49, 177, 66, 161, + 81, 145, 98, 113, 130, 51, 180, 0, 13, 96, 39, 17, + 240, 240, 194, 225, 240, 242, 226, 225, 130, 82, 146, 65, + 177, 65, 193, 34, 193, 34, 193, 34, 193, 34, 193, 49, + 177, 65, 177, 81, 145, 98, 113, 130, 51, 180, 0, 13, + 96, 40, 17, 240, 240, 178, 241, 17, 240, 210, 226, 225, + 130, 82, 146, 65, 177, 65, 193, 34, 193, 34, 193, 34, + 193, 49, 193, 49, 178, 50, 161, 81, 145, 98, 113, 130, + 66, 180, 0, 13, 96, 43, 17, 240, 240, 146, 81, 129, + 33, 49, 145, 51, 162, 226, 225, 130, 82, 146, 65, 177, + 65, 193, 34, 193, 34, 193, 34, 193, 49, 193, 49, 177, + 66, 161, 81, 145, 98, 113, 130, 66, 180, 0, 13, 96, + 40, 17, 0, 5, 97, 114, 99, 241, 130, 226, 225, 130, + 82, 146, 65, 177, 65, 193, 34, 193, 34, 193, 34, 193, + 49, 193, 49, 177, 66, 161, 81, 145, 98, 113, 130, 66, + 180, 0, 13, 96, 26, 10, 0, 8, 97, 97, 49, 65, + 66, 49, 82, 17, 115, 115, 113, 17, 97, 34, 66, 49, + 65, 81, 145, 0, 11, 64, 52, 18, 0, 7, 19, 82, + 130, 97, 129, 113, 18, 82, 98, 49, 65, 113, 66, 34, + 97, 97, 34, 97, 97, 33, 97, 113, 33, 81, 129, 33, + 81, 129, 34, 49, 145, 34, 33, 161, 49, 33, 145, 67, + 146, 82, 130, 99, 98, 151, 210, 0, 14, 96, 41, 18, + 240, 240, 178, 240, 49, 240, 49, 0, 5, 97, 193, 50, + 209, 34, 209, 33, 225, 33, 225, 33, 225, 33, 225, 34, + 194, 49, 193, 66, 162, 81, 146, 98, 114, 131, 36, 180, + 0, 14, 80, 40, 18, 240, 240, 225, 240, 17, 242, 0, + 6, 1, 240, 18, 209, 34, 209, 33, 225, 33, 225, 33, + 225, 33, 225, 33, 210, 34, 193, 65, 178, 66, 161, 98, + 114, 130, 67, 166, 0, 14, 64, 41, 18, 240, 240, 209, + 240, 19, 241, 33, 240, 240, 241, 193, 50, 209, 34, 209, + 33, 225, 33, 225, 33, 225, 33, 210, 34, 194, 49, 193, + 66, 162, 81, 146, 98, 114, 131, 35, 211, 0, 14, 80, + 41, 19, 240, 240, 194, 82, 177, 82, 240, 240, 242, 240, + 33, 225, 34, 225, 34, 225, 34, 225, 34, 225, 34, 225, + 34, 210, 49, 210, 50, 193, 81, 177, 98, 146, 114, 98, + 168, 211, 0, 15, 64, 31, 16, 240, 240, 146, 209, 240, + 240, 114, 225, 50, 146, 66, 129, 114, 97, 132, 19, 225, + 241, 226, 225, 226, 225, 241, 241, 241, 241, 0, 12, 112, + 27, 10, 240, 248, 33, 145, 145, 145, 145, 21, 49, 97, + 33, 97, 33, 82, 33, 21, 49, 145, 145, 145, 145, 145, + 152, 0, 9, 41, 13, 240, 186, 49, 130, 34, 129, 49, + 114, 49, 98, 65, 67, 81, 35, 113, 33, 145, 35, 113, + 67, 81, 113, 65, 113, 65, 129, 34, 129, 34, 113, 50, + 17, 81, 49, 33, 50, 117, 0, 12, 29, 12, 0, 12, + 65, 194, 240, 240, 34, 146, 161, 161, 50, 97, 33, 17, + 81, 49, 33, 65, 33, 49, 65, 18, 66, 49, 0, 10, + 32, 26, 10, 0, 11, 113, 129, 129, 240, 210, 129, 129, + 34, 65, 49, 17, 49, 33, 33, 49, 33, 33, 51, 65, + 0, 7, 96, 27, 10, 0, 11, 97, 129, 17, 240, 240, + 98, 129, 129, 34, 65, 49, 17, 49, 33, 33, 49, 33, + 33, 51, 65, 0, 7, 96, 29, 11, 0, 11, 18, 81, + 33, 33, 49, 49, 51, 240, 210, 145, 145, 34, 81, 49, + 17, 65, 33, 33, 65, 33, 33, 67, 65, 0, 10, 24, + 10, 0, 11, 65, 209, 240, 162, 129, 129, 34, 65, 49, + 17, 49, 33, 33, 49, 33, 33, 51, 65, 0, 9, 25, + 10, 0, 10, 51, 115, 115, 240, 193, 129, 129, 49, 81, + 33, 17, 49, 49, 17, 49, 33, 49, 50, 0, 9, 80, + 32, 18, 0, 28, 21, 193, 50, 113, 65, 19, 113, 37, + 145, 49, 17, 177, 36, 161, 33, 33, 17, 145, 33, 33, + 24, 33, 17, 66, 161, 0, 13, 32, 18, 8, 0, 12, + 50, 81, 97, 98, 97, 113, 114, 117, 81, 113, 113, 98, + 240, 208, 21, 13, 0, 13, 65, 209, 209, 240, 240, 101, + 113, 50, 97, 35, 85, 161, 193, 209, 215, 0, 10, 22, + 14, 0, 13, 17, 178, 177, 0, 6, 118, 113, 65, 129, + 34, 102, 161, 209, 225, 232, 0, 10, 96, 25, 14, 0, + 13, 1, 195, 177, 17, 240, 240, 149, 130, 49, 129, 65, + 113, 35, 86, 177, 209, 225, 231, 0, 10, 96, 23, 14, + 0, 16, 33, 34, 240, 240, 132, 146, 34, 129, 50, 113, + 34, 102, 177, 209, 209, 232, 0, 10, 96, 19, 6, 240, + 240, 193, 98, 82, 240, 17, 81, 81, 81, 81, 81, 81, + 97, 240, 240, 224, 20, 6, 240, 240, 241, 50, 49, 240, + 49, 81, 81, 81, 81, 81, 81, 81, 97, 240, 240, 144, + 18, 6, 0, 6, 18, 49, 18, 241, 81, 81, 81, 81, + 81, 81, 97, 240, 240, 240, 17, 8, 0, 10, 1, 178, + 193, 113, 113, 113, 113, 113, 113, 129, 0, 6, 64, 23, + 11, 0, 13, 113, 65, 100, 240, 81, 178, 162, 65, 81, + 65, 97, 33, 113, 50, 50, 100, 0, 8, 96, 27, 11, + 0, 11, 18, 129, 33, 49, 49, 51, 240, 177, 35, 81, + 21, 82, 49, 82, 50, 66, 65, 66, 66, 50, 0, 10, + 80, 22, 11, 0, 14, 18, 177, 240, 81, 145, 130, 145, + 81, 49, 113, 34, 97, 50, 51, 68, 0, 8, 112, 23, + 11, 0, 13, 1, 130, 240, 240, 33, 145, 130, 145, 81, + 49, 113, 33, 113, 50, 51, 68, 0, 8, 112, 24, 11, + 0, 12, 113, 145, 17, 240, 240, 17, 145, 130, 145, 81, + 49, 113, 33, 113, 50, 51, 68, 0, 8, 112, 26, 11, + 0, 12, 66, 129, 33, 49, 49, 51, 240, 65, 145, 130, + 145, 81, 49, 113, 34, 97, 50, 51, 68, 0, 8, 112, + 22, 12, 0, 13, 98, 34, 240, 240, 33, 146, 146, 161, + 81, 65, 113, 49, 114, 34, 82, 71, 0, 11, 14, 12, + 0, 12, 50, 177, 240, 240, 26, 240, 226, 161, 0, 16, + 27, 11, 0, 14, 81, 161, 145, 129, 17, 115, 113, 33, + 97, 33, 33, 50, 33, 49, 34, 17, 65, 51, 50, 69, + 0, 8, 96, 22, 10, 0, 11, 49, 162, 161, 241, 145, + 97, 33, 97, 33, 97, 33, 82, 34, 50, 69, 0, 9, + 32, 22, 10, 0, 12, 114, 113, 240, 33, 145, 97, 33, + 97, 33, 97, 34, 66, 34, 50, 69, 0, 9, 32, 23, + 10, 0, 11, 81, 129, 17, 161, 225, 145, 97, 33, 97, + 33, 97, 33, 82, 34, 50, 69, 0, 9, 32, 22, 11, + 0, 13, 114, 49, 241, 161, 161, 113, 33, 113, 33, 98, + 34, 82, 50, 50, 85, 0, 10, 16, 23, 11, 0, 15, + 82, 129, 240, 177, 145, 50, 81, 66, 65, 100, 161, 161, + 145, 161, 161, 161, 161, 240, 16, 27, 9, 240, 240, 246, + 49, 129, 129, 133, 65, 50, 49, 81, 33, 81, 33, 65, + 53, 65, 129, 129, 129, 129, 134, 0, 7, 16, 24, 11, + 0, 15, 49, 33, 240, 240, 81, 145, 49, 97, 66, 65, + 100, 161, 161, 145, 161, 161, 161, 161, 240, 16, +}; + +//***************************************************************************** +// +// The glyph offset table for the 24 point Handwriting font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetHandwriting24[] = +{ + 0, 5, 26, 41, 81, 127, 170, 218, + 227, 254, 277, 287, 309, 320, 328, 337, + 362, 403, 425, 464, 498, 539, 569, 598, + 622, 661, 700, 711, 725, 746, 757, 778, + 804, 868, 908, 944, 969, 1013, 1043, 1070, + 1104, 1150, 1173, 1199, 1241, 1277, 1335, 1380, + 1421, 1453, 1492, 1530, 1556, 1582, 1618, 1655, + 1712, 1749, 1780, 1821, 1847, 1870, 1894, 1912, + 1920, 1928, 1951, 1979, 1997, 2033, 2053, 2076, + 2102, 2132, 2147, 2171, 2201, 2225, 2251, 2273, + 2292, 2313, 2340, 2359, 2376, 2399, 2418, 2440, + 2469, 2488, 2510, 2527, 2553, 2575, 2600, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2613, 2634, 2665, 2706, 2728, 2767, 2784, + 2817, 2828, 2866, 2883, 2914, 2930, 2938, 2985, + 2993, 3008, 3030, 3048, 3062, 3070, 3105, 3151, + 3160, 3171, 3184, 3199, 3236, 3281, 3321, 3374, + 3400, 3437, 3475, 3512, 3549, 3588, 3624, 3665, + 3691, 3724, 3758, 3787, 3821, 3843, 3865, 3888, + 3912, 3953, 4001, 4042, 4081, 4121, 4164, 4204, + 4230, 4282, 4323, 4363, 4404, 4445, 4476, 4503, + 4544, 4573, 4599, 4626, 4655, 4679, 4704, 4736, + 4754, 4775, 4797, 4822, 4845, 4864, 4884, 4902, + 4919, 4942, 4969, 4991, 5014, 5038, 5064, 5086, + 5100, 5127, 5149, 5171, 5194, 5216, 5239, 5266, +}; + +//***************************************************************************** +// +// The font definition for the 24 point Handwriting font. +// +//***************************************************************************** +const tFontEx g_sFontExHandwriting24 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 24, + + // + // The height of the font. + // + 27, + + // + // The baseline of the font. + // + 21, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetHandwriting24, + + // + // A pointer to the actual font data + // + g_pui8Handwriting24Data +}; diff --git a/third_party/fonts/ofl/fonts/fonthandwriting26.c b/third_party/fonts/ofl/fonts/fonthandwriting26.c new file mode 100644 index 0000000..ce989b0 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthandwriting26.c @@ -0,0 +1,721 @@ +//***************************************************************************** +// +// fonthandwriting26.c - Font definition for the 26pt Handwriting font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://helloalan.com/projects/breip/ +// +// This Font Software is Copyright (c) 2008, Alan Hussey and Adam Breipohl. +// All Rights Reserved. +// +// "Breip" is a Reserved Font Name for this Font Software. +// +// This Font Software is licensed under the SIL Open Font License, +// Version 1.0. No modification of the license is permitted, only verbatim +// copy is allowed. This license is copied below, and is also available with +// a FAQ at: http://scripts.sil.org/OFL +// ------------------------------------------------------------------------ +// +// SIL OPEN FONT LICENSE +// +// Version 1.0 - 22 November 2005 +// PREAMBLE +// +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of cooperative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide an open +// framework in which fonts may be shared and improved in partnership with +// others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and sold with any software provided that the font names of +// derivative works are changed. The fonts and derivatives, however, cannot +// be released under any other type of license. +// +// DEFINITIONS +// +// "Font Software" refers to any and all of the following: +// +// * font files +// * data files +// * source code +// * build scripts +// * documentation +// +// "Reserved Font Name" refers to the Font Software name as seen by users +// and any other names as specified after the copyright statement. +// +// "Standard Version" refers to the collection of Font Software components +// as distributed by the Copyright Holder. +// +// "Modified Version" refers to any derivative font software made by adding +// to, deleting, or substituting -- in part or in whole -- any of the +// components of the Standard Version, by changing formats or by porting +// the Font Software to a new environment. +// +// "Author" refers to any designer, engineer, programmer, technical writer +// or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, in +// Standard or Modified Versions, may be sold by itself. +// +// 2) Standard or Modified Versions of the Font Software may be bundled, +// redistributed and sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or in +// the appropriate machine-readable metadata fields within text or binary +// files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s), in part or in whole, unless explicit written permission is +// granted by the Copyright Holder. This restriction applies to all +// references stored in the Font Software, such as the font menu name and +// other font description fields, which are used to differentiate the font +// from others. +// +// 4) The name(s) of the Copyright Holder or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any Modified +// Version, except to acknowledge the contribution(s) of the Copyright Holder +// and the Author(s) or with their explicit written permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, must +// be distributed using this license, and may not be distributed under any +// other license. +// +// TERMINATION +// +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER +// DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: handwriting +// Size: 26 point +// Bold: no +// Italic: no +// Memory usage: 6080 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 26 point Handwriting font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Handwriting26Data[5877] = +{ + 5, 10, 0, 37, 64, 24, 6, 240, 97, 66, 66, 66, + 66, 51, 51, 51, 50, 66, 66, 65, 81, 240, 129, 81, + 66, 66, 0, 5, 96, 16, 6, 240, 145, 81, 33, 33, + 33, 33, 18, 33, 33, 81, 0, 15, 32, 44, 20, 0, + 7, 97, 240, 65, 240, 65, 145, 146, 114, 161, 114, 127, + 129, 114, 34, 97, 114, 161, 114, 161, 114, 161, 114, 161, + 114, 161, 114, 127, 129, 130, 19, 81, 130, 130, 145, 130, + 145, 129, 0, 22, 16, 52, 14, 240, 240, 225, 65, 129, + 65, 129, 37, 99, 33, 33, 82, 49, 115, 49, 113, 17, + 49, 97, 33, 49, 97, 33, 49, 113, 17, 49, 137, 97, + 49, 49, 81, 49, 49, 81, 65, 33, 81, 67, 97, 51, + 119, 68, 81, 209, 225, 209, 0, 10, 112, 50, 19, 0, + 11, 117, 17, 65, 113, 66, 49, 148, 81, 240, 33, 240, + 49, 240, 49, 240, 33, 240, 49, 240, 33, 240, 49, 67, + 161, 65, 49, 145, 49, 209, 65, 81, 113, 65, 81, 98, + 65, 81, 97, 97, 49, 113, 100, 129, 0, 18, 48, 53, + 17, 0, 6, 84, 193, 50, 161, 81, 161, 81, 161, 81, + 161, 81, 177, 50, 177, 49, 209, 33, 225, 17, 97, 129, + 97, 146, 81, 145, 17, 65, 129, 49, 49, 129, 65, 33, + 114, 83, 113, 114, 113, 113, 17, 97, 97, 50, 65, 82, + 165, 0, 13, 112, 10, 3, 193, 33, 33, 33, 33, 0, + 8, 16, 31, 10, 240, 240, 97, 114, 114, 129, 129, 129, + 145, 130, 129, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 97, 49, 65, 66, 18, 114, 0, 8, 16, 26, 6, 240, + 49, 82, 81, 97, 81, 82, 66, 81, 81, 81, 81, 81, + 81, 81, 81, 65, 81, 81, 65, 81, 0, 5, 96, 13, + 6, 240, 65, 81, 17, 35, 50, 82, 65, 0, 16, 32, + 24, 13, 0, 8, 65, 194, 193, 194, 178, 178, 179, 178, + 107, 114, 178, 178, 178, 178, 178, 178, 193, 0, 13, 96, + 11, 3, 0, 7, 65, 33, 33, 33, 33, 33, 224, 8, + 14, 0, 24, 76, 0, 26, 64, 9, 5, 0, 13, 99, + 34, 240, 240, 48, 27, 15, 0, 7, 17, 210, 194, 209, + 210, 194, 209, 210, 194, 209, 210, 209, 209, 210, 209, 210, + 209, 209, 210, 209, 0, 14, 112, 52, 20, 0, 8, 18, + 240, 21, 226, 49, 225, 65, 210, 209, 50, 225, 50, 241, + 33, 240, 17, 33, 240, 17, 33, 240, 17, 33, 240, 17, + 33, 240, 17, 33, 240, 17, 34, 226, 49, 225, 66, 194, + 81, 178, 98, 146, 130, 99, 168, 241, 0, 16, 64, 24, + 4, 193, 50, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 49, 49, 240, 240, 46, + 21, 0, 11, 3, 240, 22, 226, 65, 210, 81, 240, 81, + 240, 81, 240, 65, 240, 81, 240, 81, 240, 66, 240, 65, + 193, 113, 162, 129, 130, 161, 114, 177, 98, 193, 82, 209, + 65, 240, 17, 33, 240, 50, 0, 19, 112, 39, 18, 0, + 7, 72, 115, 99, 67, 161, 50, 193, 240, 18, 242, 242, + 242, 244, 240, 19, 240, 34, 240, 34, 240, 18, 240, 33, + 240, 33, 240, 33, 240, 18, 242, 167, 225, 0, 16, 80, + 49, 21, 0, 9, 18, 240, 36, 240, 21, 242, 34, 226, + 50, 210, 66, 194, 82, 178, 98, 161, 130, 145, 146, 67, + 33, 146, 35, 66, 133, 139, 240, 50, 240, 66, 240, 66, + 240, 66, 240, 66, 240, 66, 240, 81, 240, 81, 0, 16, + 112, 34, 12, 240, 240, 181, 54, 97, 177, 177, 177, 177, + 177, 177, 21, 83, 65, 49, 17, 81, 50, 97, 50, 97, + 177, 177, 161, 177, 177, 81, 65, 116, 0, 11, 32, 31, + 14, 0, 7, 113, 209, 209, 193, 193, 209, 193, 193, 209, + 193, 193, 209, 193, 209, 114, 65, 146, 33, 161, 33, 161, + 49, 114, 88, 0, 12, 96, 27, 14, 0, 7, 4, 232, + 209, 209, 194, 193, 209, 193, 209, 194, 193, 209, 193, 209, + 194, 193, 194, 193, 209, 209, 0, 11, 64, 42, 12, 240, + 97, 177, 177, 177, 177, 114, 18, 82, 49, 66, 81, 65, + 82, 49, 82, 65, 81, 82, 50, 97, 49, 131, 162, 145, + 19, 113, 50, 81, 81, 81, 81, 81, 81, 81, 50, 116, + 0, 11, 32, 52, 17, 0, 9, 7, 17, 99, 81, 18, + 66, 131, 65, 147, 50, 145, 17, 50, 129, 33, 65, 114, + 33, 66, 82, 49, 82, 50, 65, 100, 97, 240, 17, 240, + 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, + 17, 240, 18, 240, 17, 0, 13, 12, 4, 240, 240, 98, + 34, 240, 178, 34, 0, 5, 96, 15, 4, 0, 6, 2, + 34, 240, 240, 17, 49, 49, 49, 34, 240, 48, 21, 14, + 0, 11, 113, 179, 148, 147, 147, 147, 163, 162, 196, 195, + 210, 211, 195, 211, 210, 0, 16, 11, 13, 0, 17, 123, + 0, 6, 107, 0, 21, 48, 21, 15, 0, 13, 19, 227, + 212, 212, 211, 227, 226, 180, 163, 178, 179, 179, 163, 178, + 0, 18, 48, 28, 12, 0, 6, 53, 88, 50, 98, 33, + 129, 33, 129, 33, 129, 33, 129, 33, 114, 161, 147, 145, + 0, 11, 66, 162, 0, 9, 112, 71, 23, 0, 9, 54, + 240, 17, 98, 194, 130, 162, 161, 161, 178, 129, 209, 129, + 83, 81, 114, 66, 17, 81, 65, 33, 65, 145, 65, 33, + 50, 98, 17, 65, 33, 49, 114, 17, 65, 33, 33, 115, + 17, 65, 33, 33, 98, 17, 17, 50, 34, 17, 82, 34, + 65, 65, 34, 19, 145, 66, 35, 162, 82, 210, 115, 162, + 163, 99, 216, 0, 21, 16, 44, 14, 0, 5, 114, 179, + 177, 18, 161, 33, 146, 33, 145, 49, 145, 50, 114, 50, + 114, 65, 113, 81, 113, 82, 97, 82, 91, 50, 97, 81, + 113, 81, 114, 50, 114, 50, 129, 49, 145, 49, 145, 0, + 12, 80, 41, 13, 0, 6, 74, 49, 145, 49, 129, 49, + 114, 49, 98, 65, 66, 97, 34, 132, 129, 68, 65, 114, + 49, 130, 33, 145, 33, 145, 33, 130, 33, 114, 177, 177, + 162, 97, 35, 131, 0, 10, 112, 37, 18, 0, 9, 100, + 211, 226, 242, 242, 240, 17, 240, 18, 240, 17, 240, 33, + 240, 18, 240, 17, 240, 33, 240, 33, 240, 34, 240, 18, + 240, 34, 193, 66, 101, 103, 0, 19, 47, 16, 0, 6, + 20, 199, 145, 53, 113, 100, 81, 131, 65, 162, 49, 177, + 49, 177, 49, 177, 49, 177, 49, 177, 49, 162, 49, 162, + 49, 161, 50, 146, 50, 145, 66, 17, 98, 66, 33, 66, + 81, 50, 34, 180, 0, 14, 112, 34, 15, 0, 7, 113, + 225, 24, 81, 225, 210, 210, 209, 210, 115, 50, 69, 66, + 36, 98, 50, 130, 210, 210, 129, 66, 130, 50, 115, 67, + 37, 88, 0, 15, 96, 42, 18, 0, 9, 17, 89, 57, + 146, 240, 18, 240, 18, 240, 18, 240, 18, 115, 98, 22, + 146, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 242, 240, 18, 240, 17, 0, 17, 112, 36, + 17, 0, 7, 33, 242, 226, 226, 226, 226, 242, 226, 242, + 226, 242, 162, 50, 177, 50, 193, 34, 193, 34, 193, 34, + 193, 34, 178, 49, 162, 66, 115, 120, 0, 15, 80, 49, + 16, 0, 7, 33, 82, 129, 82, 114, 82, 129, 82, 130, + 66, 130, 66, 130, 66, 115, 66, 98, 17, 66, 81, 49, + 66, 50, 65, 66, 34, 81, 69, 98, 50, 146, 50, 161, + 50, 161, 50, 161, 50, 161, 50, 177, 34, 0, 15, 96, + 25, 5, 240, 82, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 65, 65, 65, 65, 66, 65, 240, 240, + 112, 37, 17, 0, 9, 84, 119, 119, 240, 240, 19, 240, + 19, 244, 243, 240, 18, 240, 18, 240, 17, 240, 17, 240, + 18, 241, 240, 17, 97, 130, 113, 98, 145, 66, 181, 0, + 15, 80, 46, 18, 0, 9, 2, 240, 18, 240, 18, 162, + 66, 147, 66, 131, 82, 115, 98, 99, 114, 83, 130, 82, + 146, 66, 162, 50, 178, 50, 178, 49, 194, 50, 178, 51, + 162, 68, 145, 104, 50, 240, 18, 240, 33, 0, 15, 48, + 42, 18, 0, 9, 1, 240, 33, 240, 33, 240, 33, 240, + 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, + 34, 240, 18, 240, 33, 240, 34, 240, 33, 178, 66, 147, + 83, 83, 151, 0, 18, 96, 63, 23, 0, 11, 114, 240, + 98, 162, 146, 148, 115, 145, 33, 115, 130, 33, 113, 18, + 113, 50, 97, 33, 98, 65, 97, 33, 97, 81, 82, 34, + 66, 81, 81, 66, 34, 98, 65, 84, 114, 65, 240, 33, + 65, 240, 33, 65, 240, 33, 65, 240, 33, 50, 240, 34, + 34, 240, 34, 49, 240, 49, 0, 23, 32, 52, 26, 0, + 15, 98, 98, 240, 18, 99, 226, 115, 226, 115, 226, 116, + 210, 113, 18, 210, 113, 33, 194, 114, 34, 178, 114, 34, + 178, 114, 50, 146, 130, 50, 131, 130, 66, 114, 146, 67, + 67, 146, 104, 162, 147, 193, 240, 131, 240, 130, 0, 25, + 96, 50, 21, 0, 8, 81, 240, 51, 240, 34, 240, 50, + 163, 97, 210, 66, 210, 65, 242, 49, 242, 34, 242, 34, + 240, 17, 34, 240, 17, 34, 240, 17, 34, 242, 49, 241, + 66, 225, 81, 209, 98, 178, 114, 146, 131, 99, 184, 243, + 0, 17, 16, 34, 10, 240, 240, 21, 65, 67, 33, 97, + 33, 97, 33, 97, 33, 82, 33, 66, 49, 34, 84, 97, + 145, 145, 145, 145, 146, 130, 130, 130, 130, 130, 0, 9, + 96, 42, 18, 0, 7, 82, 243, 226, 242, 242, 240, 18, + 242, 242, 193, 50, 193, 49, 209, 34, 209, 34, 209, 34, + 194, 33, 210, 34, 113, 50, 50, 113, 34, 67, 97, 18, + 99, 83, 139, 150, 36, 0, 16, 43, 18, 0, 9, 26, + 114, 129, 113, 130, 113, 114, 129, 98, 145, 82, 161, 66, + 177, 66, 177, 66, 177, 66, 177, 66, 177, 82, 161, 99, + 129, 131, 97, 180, 33, 240, 33, 240, 33, 240, 33, 0, + 17, 112, 29, 15, 0, 6, 114, 180, 133, 117, 147, 178, + 210, 210, 226, 227, 227, 212, 212, 211, 211, 210, 210, 81, + 98, 97, 67, 118, 0, 13, 112, 34, 17, 0, 7, 115, + 149, 134, 135, 242, 242, 242, 240, 17, 240, 18, 242, 242, + 240, 18, 242, 242, 240, 18, 242, 240, 18, 242, 240, 17, + 240, 33, 0, 15, 64, 47, 22, 0, 16, 82, 241, 66, + 241, 65, 240, 18, 34, 240, 18, 34, 240, 18, 34, 240, + 18, 34, 240, 18, 34, 240, 18, 34, 240, 18, 49, 242, + 66, 226, 66, 210, 98, 194, 98, 163, 130, 131, 163, 52, + 230, 0, 20, 64, 44, 24, 0, 20, 81, 240, 113, 240, + 114, 49, 240, 34, 66, 240, 17, 98, 226, 98, 210, 130, + 194, 130, 178, 162, 146, 178, 146, 194, 114, 211, 82, 242, + 82, 240, 18, 50, 240, 35, 18, 240, 68, 0, 22, 80, + 64, 24, 0, 14, 49, 240, 129, 240, 130, 240, 129, 240, + 129, 240, 130, 179, 145, 33, 117, 129, 33, 113, 50, 113, + 49, 82, 66, 97, 34, 82, 81, 97, 34, 81, 98, 81, + 49, 81, 114, 65, 49, 81, 114, 65, 49, 66, 130, 34, + 50, 50, 145, 34, 65, 34, 162, 18, 66, 18, 179, 99, + 209, 0, 21, 64, 41, 15, 0, 9, 1, 33, 162, 34, + 146, 50, 114, 66, 114, 82, 82, 114, 50, 130, 50, 146, + 18, 180, 179, 195, 196, 162, 18, 147, 34, 130, 66, 98, + 82, 98, 98, 82, 113, 81, 0, 12, 96, 44, 18, 0, + 8, 66, 240, 18, 242, 50, 178, 66, 161, 98, 130, 115, + 98, 149, 18, 213, 240, 18, 240, 17, 240, 18, 240, 18, + 240, 17, 240, 18, 240, 18, 240, 17, 240, 33, 240, 33, + 240, 33, 0, 16, 96, 44, 29, 0, 15, 58, 203, 66, + 240, 179, 240, 178, 240, 179, 240, 163, 240, 178, 240, 179, + 240, 178, 240, 178, 240, 194, 240, 178, 240, 194, 240, 194, + 240, 194, 240, 194, 196, 179, 88, 236, 240, 54, 0, 26, + 112, 31, 15, 0, 5, 113, 130, 66, 83, 87, 129, 209, + 225, 225, 225, 225, 225, 225, 209, 225, 225, 225, 225, 225, + 225, 81, 129, 37, 117, 161, 0, 13, 25, 14, 0, 7, + 1, 209, 225, 210, 210, 209, 225, 210, 209, 225, 210, 209, + 210, 210, 209, 225, 209, 225, 0, 14, 32, 28, 14, 240, + 240, 203, 194, 194, 194, 194, 194, 209, 209, 209, 209, 209, + 209, 209, 210, 209, 209, 209, 209, 209, 74, 66, 0, 11, + 96, 19, 9, 240, 240, 17, 114, 99, 97, 17, 81, 33, + 65, 49, 65, 65, 145, 0, 21, 80, 8, 12, 0, 33, + 10, 0, 10, 96, 10, 7, 240, 97, 114, 113, 113, 0, + 20, 48, 27, 12, 0, 21, 65, 161, 161, 161, 65, 97, + 49, 17, 81, 34, 17, 65, 49, 49, 49, 33, 65, 52, + 81, 49, 0, 10, 32, 30, 11, 0, 8, 49, 161, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 50, 66, 82, 34, + 82, 49, 82, 50, 65, 66, 50, 85, 114, 0, 9, 19, + 11, 0, 17, 18, 115, 114, 130, 145, 146, 146, 146, 161, + 163, 35, 84, 0, 10, 16, 38, 14, 0, 6, 49, 210, + 194, 194, 194, 194, 194, 194, 194, 194, 209, 98, 81, 81, + 113, 65, 129, 49, 130, 49, 130, 49, 130, 49, 115, 50, + 82, 17, 71, 34, 68, 0, 11, 64, 21, 16, 0, 28, + 101, 162, 50, 145, 50, 145, 35, 103, 209, 241, 241, 242, + 240, 24, 0, 12, 32, 24, 13, 0, 10, 24, 66, 178, + 178, 178, 178, 193, 193, 152, 131, 162, 178, 178, 193, 193, + 193, 193, 0, 12, 48, 28, 12, 0, 19, 114, 131, 145, + 162, 161, 177, 177, 99, 49, 51, 17, 68, 49, 177, 177, + 161, 177, 113, 49, 129, 17, 146, 240, 32, 38, 17, 0, + 21, 33, 240, 17, 240, 33, 240, 17, 240, 17, 240, 17, + 240, 17, 99, 129, 66, 33, 113, 49, 65, 113, 49, 81, + 97, 33, 97, 113, 17, 98, 98, 130, 0, 15, 16, 16, + 4, 240, 240, 162, 225, 49, 49, 49, 49, 49, 49, 49, + 65, 240, 240, 28, 13, 0, 15, 34, 162, 177, 193, 240, + 240, 129, 194, 194, 194, 194, 194, 194, 193, 193, 193, 193, + 33, 130, 34, 83, 71, 240, 48, 32, 13, 0, 6, 66, + 178, 178, 178, 178, 178, 178, 82, 66, 66, 82, 50, 98, + 34, 114, 18, 132, 147, 162, 179, 180, 146, 23, 50, 178, + 193, 0, 11, 25, 5, 240, 82, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 65, 66, + 50, 240, 240, 112, 27, 14, 0, 23, 83, 113, 52, 86, + 33, 82, 18, 49, 49, 17, 113, 49, 17, 113, 51, 129, + 50, 129, 50, 194, 0, 13, 80, 23, 12, 0, 22, 65, + 51, 81, 36, 84, 34, 83, 50, 66, 66, 66, 81, 66, + 82, 50, 177, 0, 10, 16, 19, 12, 0, 23, 1, 162, + 145, 161, 82, 50, 97, 50, 113, 49, 98, 56, 0, 10, + 112, 23, 8, 0, 16, 20, 50, 33, 49, 50, 33, 50, + 33, 49, 49, 34, 52, 66, 97, 113, 113, 113, 113, 240, + 29, 15, 0, 26, 67, 178, 209, 209, 225, 82, 113, 82, + 113, 66, 130, 18, 17, 147, 18, 210, 210, 210, 210, 81, + 130, 35, 148, 240, 64, 20, 11, 0, 16, 115, 118, 66, + 81, 35, 130, 146, 146, 146, 146, 146, 146, 146, 0, 9, + 48, 18, 9, 0, 15, 18, 67, 82, 114, 131, 130, 145, + 130, 49, 34, 68, 0, 8, 48, 26, 14, 0, 10, 97, + 193, 210, 194, 194, 209, 210, 194, 194, 68, 71, 84, 210, + 194, 194, 209, 210, 194, 209, 0, 11, 64, 19, 11, 0, + 22, 17, 146, 97, 34, 97, 34, 97, 49, 82, 50, 50, + 85, 129, 0, 9, 21, 9, 0, 15, 49, 129, 114, 113, + 49, 65, 49, 50, 50, 34, 65, 33, 84, 98, 0, 8, + 64, 29, 13, 0, 25, 65, 49, 130, 33, 130, 33, 81, + 34, 33, 67, 18, 33, 50, 17, 18, 33, 49, 36, 49, + 18, 50, 82, 0, 10, 112, 18, 9, 0, 16, 113, 66, + 49, 33, 84, 98, 114, 100, 81, 33, 145, 0, 8, 32, + 22, 12, 0, 25, 17, 177, 34, 97, 65, 97, 83, 49, + 131, 177, 177, 161, 177, 177, 177, 161, 240, 48, 19, 14, + 0, 23, 83, 119, 83, 66, 65, 113, 193, 209, 193, 209, + 194, 214, 0, 12, 64, 28, 16, 0, 6, 58, 82, 99, + 97, 241, 241, 226, 211, 194, 226, 242, 242, 242, 241, 241, + 241, 241, 241, 241, 241, 250, 0, 14, 32, 24, 4, 193, + 50, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 49, 34, 49, 240, 240, 28, 15, 240, + 240, 248, 226, 209, 225, 225, 225, 225, 225, 227, 227, 226, + 179, 178, 209, 225, 225, 225, 210, 99, 21, 131, 0, 14, + 48, 17, 13, 0, 21, 49, 113, 49, 18, 65, 49, 50, + 33, 65, 67, 0, 21, 96, 25, 5, 240, 18, 50, 50, + 240, 65, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 35, 49, 240, 240, 48, 36, 10, 240, 240, 34, + 130, 130, 130, 146, 113, 17, 113, 17, 100, 82, 18, 81, + 49, 81, 49, 81, 50, 66, 34, 67, 17, 18, 68, 145, + 145, 146, 145, 145, 0, 9, 16, 45, 19, 0, 7, 115, + 227, 18, 194, 81, 177, 240, 49, 240, 49, 240, 49, 240, + 65, 240, 49, 240, 49, 240, 49, 240, 24, 225, 240, 49, + 240, 49, 240, 49, 240, 49, 229, 210, 36, 180, 51, 240, + 56, 0, 14, 64, 22, 12, 0, 16, 65, 113, 71, 98, + 34, 97, 18, 17, 102, 98, 34, 81, 20, 17, 193, 0, + 16, 96, 44, 18, 0, 8, 21, 36, 146, 240, 17, 97, + 146, 98, 129, 129, 129, 145, 97, 162, 81, 177, 81, 193, + 49, 210, 33, 216, 193, 17, 225, 33, 215, 241, 240, 33, + 240, 33, 240, 33, 240, 33, 217, 0, 13, 112, 20, 4, + 240, 81, 49, 49, 49, 49, 49, 49, 242, 34, 34, 34, + 34, 34, 34, 240, 240, 64, 38, 15, 0, 6, 99, 164, + 133, 132, 162, 194, 18, 162, 34, 146, 66, 131, 50, 131, + 50, 147, 49, 163, 33, 181, 179, 226, 210, 81, 114, 81, + 98, 97, 67, 119, 161, 0, 12, 48, 11, 12, 0, 6, + 3, 67, 35, 66, 0, 36, 48, 46, 18, 0, 12, 50, + 211, 17, 193, 240, 17, 240, 17, 240, 17, 240, 17, 82, + 161, 65, 177, 65, 145, 33, 65, 145, 33, 65, 145, 33, + 65, 145, 33, 70, 65, 33, 209, 49, 193, 81, 162, 99, + 83, 150, 0, 16, 96, 18, 9, 240, 240, 129, 113, 113, + 35, 49, 33, 17, 49, 17, 49, 49, 0, 23, 48, 35, + 17, 0, 15, 113, 81, 146, 66, 115, 51, 114, 67, 114, + 66, 115, 66, 114, 82, 130, 67, 147, 66, 162, 66, 162, + 66, 162, 66, 162, 66, 162, 66, 0, 19, 48, 16, 13, + 0, 16, 42, 179, 178, 193, 193, 193, 193, 193, 193, 0, + 18, 16, 7, 10, 0, 17, 72, 0, 19, 52, 18, 0, + 10, 18, 211, 225, 240, 17, 240, 17, 240, 17, 22, 145, + 33, 50, 145, 33, 49, 145, 49, 33, 161, 49, 33, 113, + 33, 49, 33, 113, 33, 49, 49, 81, 49, 49, 67, 33, + 49, 49, 145, 49, 49, 129, 81, 161, 114, 98, 166, 0, + 19, 8, 11, 0, 9, 89, 0, 30, 64, 17, 10, 240, + 240, 50, 114, 113, 130, 81, 33, 97, 49, 81, 69, 0, + 25, 48, 23, 13, 0, 11, 98, 193, 193, 194, 193, 193, + 137, 129, 193, 193, 193, 193, 193, 240, 240, 59, 0, 11, + 80, 21, 11, 240, 240, 67, 113, 33, 161, 145, 161, 161, + 161, 66, 65, 49, 97, 18, 129, 0, 24, 32, 16, 9, + 240, 213, 49, 65, 129, 113, 130, 145, 129, 113, 98, 0, + 20, 96, 9, 6, 240, 97, 65, 50, 0, 18, 64, 40, + 19, 0, 20, 65, 145, 129, 145, 145, 129, 145, 114, 145, + 114, 146, 99, 130, 99, 116, 66, 17, 99, 17, 65, 50, + 35, 49, 65, 82, 113, 49, 225, 49, 225, 49, 240, 33, + 0, 18, 112, 51, 20, 0, 7, 95, 2, 240, 225, 65, + 181, 49, 131, 50, 49, 114, 82, 49, 113, 98, 49, 113, + 98, 49, 129, 82, 49, 132, 19, 49, 193, 33, 49, 241, + 65, 225, 240, 66, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 249, 0, 18, 32, 11, 6, 0, 9, 33, 67, + 36, 50, 0, 10, 112, 12, 5, 0, 12, 1, 65, 66, + 50, 34, 240, 240, 48, 13, 3, 145, 33, 33, 33, 33, + 33, 33, 33, 33, 0, 7, 17, 10, 240, 240, 65, 114, + 113, 145, 81, 33, 97, 49, 81, 69, 0, 25, 48, 40, + 19, 0, 12, 97, 178, 82, 179, 67, 163, 67, 178, 82, + 178, 82, 178, 82, 178, 82, 178, 82, 147, 51, 146, 67, + 146, 82, 146, 82, 146, 82, 146, 82, 146, 82, 146, 82, + 0, 20, 32, 49, 16, 0, 8, 17, 130, 81, 129, 97, + 113, 113, 98, 113, 97, 129, 81, 145, 66, 145, 65, 161, + 49, 226, 65, 145, 51, 130, 34, 17, 129, 33, 49, 113, + 33, 65, 98, 17, 84, 49, 55, 66, 129, 81, 145, 241, + 241, 0, 12, 80, 45, 15, 0, 7, 81, 225, 113, 97, + 98, 97, 97, 113, 81, 129, 65, 145, 65, 145, 49, 161, + 33, 177, 33, 209, 34, 146, 17, 17, 145, 65, 129, 81, + 129, 65, 129, 81, 81, 129, 50, 145, 33, 194, 0, 13, + 112, 56, 20, 0, 7, 85, 113, 97, 65, 98, 177, 97, + 177, 98, 177, 97, 209, 65, 241, 34, 241, 33, 241, 33, + 240, 17, 18, 50, 161, 33, 49, 17, 193, 49, 33, 193, + 18, 49, 177, 33, 65, 162, 17, 85, 97, 56, 113, 145, + 145, 145, 240, 65, 240, 81, 0, 18, 16, 29, 12, 0, + 6, 66, 162, 0, 11, 82, 130, 161, 113, 34, 113, 33, + 129, 33, 129, 33, 129, 34, 98, 49, 82, 71, 115, 0, + 9, 96, 43, 13, 240, 241, 209, 209, 162, 178, 177, 17, + 145, 33, 145, 33, 145, 34, 114, 49, 113, 65, 113, 65, + 113, 66, 82, 81, 81, 24, 49, 97, 81, 97, 66, 98, + 50, 113, 49, 129, 49, 129, 0, 11, 96, 44, 13, 240, + 240, 226, 162, 193, 179, 161, 17, 161, 17, 145, 34, 129, + 49, 129, 49, 114, 49, 113, 66, 97, 66, 97, 81, 82, + 81, 90, 49, 98, 65, 113, 50, 113, 50, 113, 49, 129, + 49, 129, 0, 10, 16, 42, 12, 0, 6, 66, 145, 18, + 240, 97, 178, 145, 17, 145, 18, 129, 33, 113, 49, 113, + 49, 113, 50, 97, 65, 82, 65, 89, 49, 81, 81, 82, + 50, 97, 49, 113, 49, 113, 49, 113, 0, 9, 48, 44, + 12, 240, 240, 130, 81, 49, 33, 49, 131, 240, 82, 145, + 17, 145, 17, 145, 33, 129, 33, 113, 49, 113, 49, 113, + 50, 82, 65, 81, 81, 89, 49, 81, 81, 97, 50, 97, + 49, 113, 49, 113, 0, 10, 112, 43, 13, 240, 240, 178, + 49, 193, 161, 178, 177, 17, 146, 17, 145, 33, 145, 34, + 114, 49, 114, 49, 113, 65, 113, 66, 82, 81, 90, 49, + 97, 81, 97, 66, 98, 50, 113, 49, 129, 49, 129, 0, + 11, 96, 43, 12, 240, 240, 163, 132, 132, 240, 240, 50, + 145, 17, 145, 17, 145, 33, 114, 33, 113, 49, 113, 49, + 113, 65, 82, 65, 81, 81, 81, 23, 49, 81, 81, 97, + 50, 97, 49, 113, 49, 113, 0, 9, 48, 47, 21, 0, + 11, 81, 240, 75, 146, 17, 240, 33, 33, 240, 18, 33, + 240, 17, 49, 242, 49, 242, 49, 226, 65, 226, 73, 97, + 81, 217, 193, 52, 194, 97, 193, 113, 178, 113, 178, 113, + 177, 129, 161, 152, 212, 0, 16, 80, 28, 14, 0, 7, + 98, 162, 177, 194, 193, 193, 209, 193, 209, 209, 209, 209, + 210, 210, 84, 70, 193, 209, 210, 209, 178, 0, 11, 48, + 36, 13, 240, 240, 225, 209, 209, 240, 81, 193, 38, 66, + 36, 81, 193, 193, 178, 177, 99, 49, 53, 50, 34, 114, + 177, 193, 129, 50, 113, 50, 83, 72, 115, 0, 10, 80, + 35, 14, 0, 6, 49, 193, 178, 240, 113, 209, 218, 66, + 193, 209, 194, 194, 193, 99, 65, 51, 98, 49, 129, 209, + 209, 129, 66, 114, 50, 98, 88, 131, 0, 9, 96, 34, + 13, 0, 7, 33, 177, 17, 240, 240, 49, 193, 23, 65, + 193, 193, 178, 177, 114, 49, 67, 66, 34, 114, 177, 193, + 194, 113, 50, 83, 71, 145, 0, 10, 96, 37, 14, 0, + 5, 97, 49, 145, 49, 240, 97, 209, 38, 88, 98, 193, + 209, 194, 194, 114, 49, 84, 65, 51, 98, 49, 129, 209, + 209, 210, 114, 50, 98, 88, 117, 0, 11, 48, 23, 5, + 241, 82, 209, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 66, 50, 65, 65, 240, 240, 112, 24, 5, 240, + 18, 33, 225, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 81, 65, 65, 240, 240, 128, 26, 5, 240, + 17, 49, 17, 129, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 81, 65, 65, 65, 240, 240, 112, 25, + 7, 240, 209, 34, 240, 33, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 98, 97, 97, 0, 6, 80, + 45, 21, 0, 13, 117, 240, 33, 20, 241, 68, 193, 99, + 177, 130, 161, 146, 145, 161, 145, 161, 40, 161, 145, 161, + 145, 146, 145, 145, 146, 145, 146, 130, 146, 129, 162, 17, + 81, 177, 49, 50, 177, 53, 0, 19, 16, 53, 22, 0, + 10, 33, 195, 81, 193, 49, 49, 240, 51, 240, 193, 97, + 225, 83, 194, 83, 194, 83, 194, 84, 177, 100, 177, 97, + 33, 162, 97, 34, 146, 97, 49, 130, 98, 50, 114, 98, + 65, 98, 114, 68, 19, 129, 117, 130, 240, 82, 240, 66, + 0, 19, 45, 18, 240, 240, 209, 240, 49, 240, 49, 0, + 6, 2, 242, 241, 131, 82, 162, 65, 193, 50, 194, 34, + 209, 34, 209, 33, 225, 34, 209, 34, 194, 49, 193, 66, + 162, 81, 161, 98, 114, 130, 67, 181, 0, 14, 64, 42, + 18, 0, 7, 114, 241, 240, 240, 18, 242, 241, 131, 82, + 162, 65, 193, 50, 194, 34, 209, 34, 209, 33, 225, 34, + 209, 34, 209, 49, 193, 66, 162, 81, 161, 98, 114, 130, + 67, 181, 0, 16, 96, 44, 18, 0, 7, 97, 240, 19, + 241, 240, 240, 34, 242, 241, 131, 82, 162, 65, 193, 50, + 194, 34, 209, 34, 209, 34, 209, 34, 209, 34, 209, 49, + 193, 66, 162, 81, 161, 98, 114, 130, 82, 181, 0, 14, + 64, 44, 18, 0, 7, 51, 65, 145, 49, 33, 242, 178, + 242, 241, 131, 82, 162, 65, 193, 50, 194, 34, 209, 34, + 209, 34, 209, 34, 209, 34, 194, 49, 193, 66, 162, 81, + 161, 98, 114, 130, 82, 181, 0, 16, 96, 44, 18, 0, + 7, 18, 130, 98, 130, 240, 17, 130, 242, 241, 131, 82, + 162, 65, 193, 50, 194, 34, 209, 34, 209, 34, 209, 34, + 209, 34, 194, 49, 193, 66, 162, 81, 161, 98, 114, 130, + 82, 181, 0, 16, 96, 26, 11, 0, 11, 1, 113, 34, + 81, 66, 65, 82, 33, 98, 18, 115, 146, 132, 98, 33, + 97, 50, 65, 81, 177, 0, 14, 58, 20, 0, 9, 17, + 163, 82, 146, 113, 146, 113, 19, 82, 114, 50, 65, 129, + 81, 50, 113, 98, 34, 98, 98, 34, 97, 129, 34, 81, + 145, 34, 66, 145, 34, 65, 161, 34, 49, 162, 49, 49, + 161, 66, 17, 162, 67, 177, 98, 161, 115, 114, 129, 19, + 36, 213, 0, 18, 80, 45, 19, 0, 7, 113, 240, 66, + 240, 50, 0, 6, 1, 240, 49, 225, 34, 225, 34, 225, + 33, 241, 33, 241, 33, 241, 33, 241, 34, 225, 34, 210, + 49, 209, 66, 178, 82, 146, 114, 99, 147, 20, 212, 0, + 15, 48, 43, 19, 0, 8, 33, 240, 33, 240, 18, 0, + 6, 33, 209, 50, 225, 34, 225, 33, 241, 33, 241, 33, + 241, 33, 241, 33, 241, 34, 210, 49, 209, 66, 178, 81, + 162, 98, 130, 130, 83, 182, 0, 17, 80, 46, 19, 0, + 8, 17, 240, 35, 240, 17, 17, 241, 240, 240, 33, 240, + 34, 225, 34, 225, 34, 225, 33, 241, 33, 241, 33, 241, + 33, 241, 34, 210, 34, 210, 49, 209, 66, 178, 82, 146, + 114, 99, 152, 211, 0, 15, 64, 44, 20, 0, 8, 18, + 82, 178, 82, 0, 5, 113, 240, 66, 225, 49, 241, 34, + 241, 34, 241, 34, 241, 34, 241, 34, 241, 34, 241, 49, + 226, 50, 209, 66, 194, 82, 162, 114, 130, 131, 83, 183, + 0, 18, 64, 36, 17, 0, 7, 50, 225, 241, 240, 130, + 241, 50, 162, 66, 146, 82, 129, 115, 82, 133, 19, 194, + 17, 242, 242, 241, 242, 241, 240, 17, 242, 241, 240, 17, + 0, 15, 112, 31, 12, 0, 6, 10, 241, 177, 177, 177, + 177, 22, 65, 98, 49, 98, 49, 98, 49, 82, 65, 20, + 97, 177, 177, 177, 177, 177, 184, 0, 10, 112, 45, 14, + 240, 240, 203, 49, 146, 49, 145, 49, 145, 49, 115, 49, + 99, 65, 52, 97, 50, 129, 49, 145, 51, 113, 83, 81, + 114, 65, 129, 65, 130, 49, 130, 49, 130, 49, 129, 50, + 17, 82, 98, 35, 132, 0, 13, 29, 13, 0, 15, 17, + 194, 209, 209, 240, 240, 66, 162, 177, 177, 51, 97, 49, + 17, 81, 49, 34, 65, 33, 65, 68, 67, 35, 0, 11, + 27, 11, 0, 15, 113, 130, 129, 240, 97, 145, 161, 145, + 50, 65, 49, 17, 65, 33, 49, 49, 33, 49, 51, 81, + 0, 9, 112, 28, 11, 0, 14, 33, 162, 129, 33, 240, + 225, 145, 161, 145, 50, 65, 49, 17, 65, 33, 49, 49, + 33, 49, 51, 81, 0, 9, 112, 30, 11, 0, 14, 1, + 145, 17, 65, 33, 52, 240, 209, 145, 161, 145, 50, 65, + 49, 17, 65, 33, 49, 49, 33, 49, 51, 81, 0, 9, + 112, 26, 11, 0, 16, 98, 34, 240, 209, 145, 161, 145, + 50, 65, 49, 17, 65, 33, 49, 49, 33, 49, 51, 81, + 0, 9, 112, 27, 11, 0, 14, 20, 116, 116, 240, 226, + 130, 145, 145, 50, 81, 33, 18, 49, 49, 33, 49, 33, + 49, 51, 81, 0, 9, 112, 34, 19, 0, 32, 34, 242, + 34, 209, 50, 113, 65, 20, 113, 38, 145, 97, 177, 35, + 17, 161, 49, 17, 17, 161, 33, 49, 24, 33, 18, 51, + 161, 0, 16, 48, 21, 9, 0, 16, 34, 82, 98, 113, + 114, 113, 130, 130, 49, 68, 97, 129, 145, 99, 240, 240, + 16, 24, 14, 0, 18, 17, 225, 225, 240, 240, 162, 162, + 33, 129, 65, 129, 19, 101, 177, 209, 225, 232, 0, 10, + 96, 24, 15, 0, 17, 97, 194, 0, 7, 52, 146, 50, + 129, 50, 129, 35, 102, 193, 225, 225, 226, 248, 0, 11, + 64, 26, 15, 0, 17, 82, 211, 177, 33, 240, 240, 196, + 161, 65, 129, 66, 129, 20, 86, 193, 225, 241, 225, 248, + 0, 11, 64, 22, 15, 0, 21, 17, 49, 0, 7, 5, + 145, 66, 129, 20, 86, 193, 225, 225, 241, 248, 0, 11, + 64, 20, 6, 0, 6, 98, 82, 97, 240, 17, 81, 81, + 81, 81, 81, 81, 81, 97, 240, 240, 224, 20, 6, 0, + 7, 2, 34, 240, 129, 81, 81, 81, 81, 81, 81, 81, + 97, 81, 240, 240, 144, 19, 6, 0, 7, 82, 49, 33, + 241, 81, 81, 81, 81, 81, 81, 81, 97, 240, 240, 240, + 19, 7, 0, 10, 65, 49, 97, 177, 97, 97, 97, 97, + 97, 97, 97, 113, 240, 240, 240, 22, 12, 0, 19, 101, + 145, 240, 145, 178, 193, 97, 81, 65, 98, 33, 114, 34, + 97, 86, 0, 9, 64, 31, 12, 0, 15, 33, 97, 49, + 17, 65, 49, 50, 17, 161, 240, 98, 97, 36, 84, 33, + 99, 34, 82, 65, 82, 66, 66, 81, 66, 0, 11, 80, + 24, 12, 0, 16, 113, 193, 193, 240, 240, 66, 146, 145, + 161, 82, 50, 97, 50, 113, 49, 98, 71, 0, 9, 48, + 23, 12, 0, 17, 17, 146, 240, 240, 82, 146, 145, 161, + 82, 50, 97, 50, 113, 49, 98, 71, 0, 10, 112, 25, + 12, 0, 15, 81, 162, 145, 33, 240, 240, 50, 146, 145, + 161, 82, 50, 97, 50, 113, 49, 98, 71, 0, 10, 112, + 28, 12, 0, 16, 97, 161, 17, 65, 49, 50, 17, 161, + 240, 98, 146, 145, 162, 81, 65, 97, 65, 113, 50, 82, + 71, 0, 9, 48, 25, 12, 0, 16, 98, 49, 177, 240, + 240, 34, 131, 130, 161, 97, 50, 98, 34, 113, 34, 113, + 56, 99, 0, 9, 96, 16, 13, 0, 16, 97, 194, 240, + 240, 59, 240, 240, 33, 193, 0, 18, 112, 29, 11, 0, + 17, 49, 146, 145, 116, 98, 17, 98, 18, 82, 33, 33, + 49, 34, 49, 33, 33, 65, 34, 17, 65, 55, 81, 0, + 9, 32, 23, 11, 0, 15, 65, 177, 177, 240, 194, 145, + 113, 33, 113, 34, 97, 34, 82, 50, 51, 70, 113, 0, + 9, 23, 11, 0, 15, 113, 130, 129, 240, 226, 145, 113, + 33, 113, 34, 97, 34, 82, 50, 51, 70, 113, 0, 9, + 25, 11, 0, 15, 81, 145, 17, 113, 33, 240, 194, 145, + 113, 33, 113, 34, 97, 34, 82, 50, 51, 70, 113, 0, + 9, 26, 13, 0, 19, 98, 50, 177, 240, 65, 178, 113, + 50, 114, 34, 114, 34, 114, 50, 83, 51, 51, 87, 131, + 0, 10, 64, 26, 12, 0, 20, 17, 146, 240, 240, 161, + 161, 49, 113, 65, 97, 82, 49, 130, 17, 177, 161, 177, + 177, 161, 177, 240, 48, 27, 9, 0, 6, 103, 177, 129, + 129, 133, 65, 51, 33, 81, 33, 81, 33, 81, 38, 49, + 129, 129, 129, 129, 129, 135, 0, 7, 25, 11, 0, 18, + 17, 49, 240, 240, 241, 33, 113, 49, 97, 65, 65, 101, + 161, 145, 161, 161, 145, 161, 161, 240, 16, +}; + +//***************************************************************************** +// +// The glyph offset table for the 26 point Handwriting font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetHandwriting26[] = +{ + 0, 5, 29, 45, 89, 141, 191, 244, + 254, 285, 311, 324, 348, 359, 367, 376, + 403, 455, 479, 525, 564, 613, 647, 678, + 705, 747, 799, 811, 826, 847, 858, 879, + 907, 978, 1022, 1063, 1100, 1147, 1181, 1223, + 1259, 1308, 1333, 1370, 1416, 1458, 1521, 1573, + 1623, 1657, 1699, 1742, 1771, 1805, 1852, 1896, + 1960, 2001, 2045, 2089, 2120, 2145, 2173, 2192, + 2200, 2210, 2237, 2267, 2286, 2324, 2345, 2369, + 2397, 2435, 2451, 2479, 2511, 2536, 2563, 2586, + 2605, 2628, 2657, 2677, 2695, 2721, 2740, 2761, + 2790, 2808, 2830, 2849, 2877, 2901, 2929, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2946, 2971, 3007, 3052, 3074, 3118, 3138, + 3176, 3187, 3233, 3251, 3286, 3302, 3309, 3361, + 3369, 3386, 3409, 3430, 3446, 3455, 3495, 3546, + 3557, 3569, 3582, 3599, 3639, 3688, 3733, 3789, + 3818, 3861, 3905, 3947, 3991, 4034, 4077, 4124, + 4152, 4188, 4223, 4257, 4294, 4317, 4341, 4367, + 4392, 4437, 4490, 4535, 4577, 4621, 4665, 4709, + 4735, 4793, 4838, 4881, 4927, 4971, 5007, 5038, + 5083, 5112, 5139, 5167, 5197, 5223, 5250, 5284, + 5305, 5329, 5353, 5379, 5401, 5421, 5441, 5460, + 5479, 5501, 5532, 5556, 5579, 5604, 5632, 5657, + 5673, 5702, 5725, 5748, 5773, 5799, 5825, 5852, +}; + +//***************************************************************************** +// +// The font definition for the 26 point Handwriting font. +// +//***************************************************************************** +const tFontEx g_sFontExHandwriting26 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 26, + + // + // The height of the font. + // + 30, + + // + // The baseline of the font. + // + 24, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetHandwriting26, + + // + // A pointer to the actual font data + // + g_pui8Handwriting26Data +}; diff --git a/third_party/fonts/ofl/fonts/fonthandwriting28.c b/third_party/fonts/ofl/fonts/fonthandwriting28.c new file mode 100644 index 0000000..d1c58ed --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthandwriting28.c @@ -0,0 +1,771 @@ +//***************************************************************************** +// +// fonthandwriting28.c - Font definition for the 28pt Handwriting font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://helloalan.com/projects/breip/ +// +// This Font Software is Copyright (c) 2008, Alan Hussey and Adam Breipohl. +// All Rights Reserved. +// +// "Breip" is a Reserved Font Name for this Font Software. +// +// This Font Software is licensed under the SIL Open Font License, +// Version 1.0. No modification of the license is permitted, only verbatim +// copy is allowed. This license is copied below, and is also available with +// a FAQ at: http://scripts.sil.org/OFL +// ------------------------------------------------------------------------ +// +// SIL OPEN FONT LICENSE +// +// Version 1.0 - 22 November 2005 +// PREAMBLE +// +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of cooperative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide an open +// framework in which fonts may be shared and improved in partnership with +// others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and sold with any software provided that the font names of +// derivative works are changed. The fonts and derivatives, however, cannot +// be released under any other type of license. +// +// DEFINITIONS +// +// "Font Software" refers to any and all of the following: +// +// * font files +// * data files +// * source code +// * build scripts +// * documentation +// +// "Reserved Font Name" refers to the Font Software name as seen by users +// and any other names as specified after the copyright statement. +// +// "Standard Version" refers to the collection of Font Software components +// as distributed by the Copyright Holder. +// +// "Modified Version" refers to any derivative font software made by adding +// to, deleting, or substituting -- in part or in whole -- any of the +// components of the Standard Version, by changing formats or by porting +// the Font Software to a new environment. +// +// "Author" refers to any designer, engineer, programmer, technical writer +// or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, in +// Standard or Modified Versions, may be sold by itself. +// +// 2) Standard or Modified Versions of the Font Software may be bundled, +// redistributed and sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or in +// the appropriate machine-readable metadata fields within text or binary +// files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s), in part or in whole, unless explicit written permission is +// granted by the Copyright Holder. This restriction applies to all +// references stored in the Font Software, such as the font menu name and +// other font description fields, which are used to differentiate the font +// from others. +// +// 4) The name(s) of the Copyright Holder or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any Modified +// Version, except to acknowledge the contribution(s) of the Copyright Holder +// and the Author(s) or with their explicit written permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, must +// be distributed using this license, and may not be distributed under any +// other license. +// +// TERMINATION +// +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER +// DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: handwriting +// Size: 28 point +// Bold: no +// Italic: no +// Memory usage: 6672 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 28 point Handwriting font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Handwriting28Data[6472] = +{ + 5, 11, 0, 45, 48, 26, 6, 240, 97, 81, 66, 66, + 66, 66, 66, 51, 51, 51, 51, 50, 65, 81, 81, 240, + 129, 66, 66, 65, 0, 6, 80, 17, 6, 240, 145, 81, + 81, 33, 33, 33, 33, 33, 33, 33, 81, 0, 16, 96, + 50, 22, 0, 11, 33, 240, 98, 240, 82, 145, 162, 130, + 178, 114, 143, 1, 146, 114, 35, 98, 114, 178, 114, 178, + 114, 178, 114, 178, 114, 178, 114, 178, 114, 159, 1, 129, + 146, 35, 81, 146, 146, 161, 146, 161, 146, 161, 161, 0, + 24, 32, 59, 14, 240, 240, 225, 65, 129, 65, 129, 37, + 100, 17, 33, 82, 49, 115, 49, 113, 17, 49, 97, 33, + 49, 97, 33, 49, 97, 33, 49, 98, 17, 49, 122, 97, + 49, 49, 81, 65, 33, 81, 65, 33, 81, 65, 18, 81, + 67, 97, 20, 86, 49, 113, 81, 210, 209, 209, 0, 12, + 80, 55, 20, 0, 12, 69, 17, 81, 113, 81, 65, 149, + 81, 240, 49, 240, 65, 240, 65, 240, 49, 240, 65, 240, + 49, 240, 65, 240, 49, 68, 177, 50, 49, 145, 65, 225, + 65, 81, 114, 65, 81, 113, 81, 81, 113, 81, 65, 114, + 97, 34, 113, 130, 145, 0, 21, 112, 56, 18, 0, 7, + 4, 209, 49, 193, 81, 177, 81, 177, 81, 177, 81, 193, + 65, 193, 49, 225, 33, 225, 33, 241, 17, 98, 129, 113, + 146, 97, 145, 17, 81, 129, 49, 65, 129, 65, 34, 129, + 84, 113, 114, 129, 130, 113, 113, 34, 81, 113, 50, 65, + 82, 181, 0, 17, 10, 3, 193, 33, 33, 33, 33, 0, + 9, 32, 33, 10, 240, 240, 98, 114, 113, 129, 129, 145, + 129, 145, 130, 129, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 97, 49, 65, 81, 19, 98, 0, 9, 48, 28, + 7, 240, 98, 98, 97, 98, 97, 97, 98, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 82, 81, 97, 82, 81, 82, + 0, 7, 64, 14, 7, 240, 129, 99, 50, 82, 65, 18, + 81, 17, 0, 21, 32, 26, 14, 0, 9, 17, 209, 210, + 210, 194, 194, 194, 195, 179, 124, 114, 194, 194, 194, 194, + 194, 194, 194, 209, 0, 16, 80, 13, 3, 0, 7, 113, + 33, 33, 33, 33, 33, 33, 240, 32, 8, 15, 0, 28, + 29, 0, 32, 16, 9, 5, 0, 15, 3, 50, 240, 240, + 112, 28, 16, 0, 9, 66, 210, 225, 226, 210, 225, 226, + 225, 226, 210, 225, 226, 210, 225, 226, 225, 226, 210, 225, + 226, 225, 0, 17, 112, 58, 22, 0, 8, 116, 240, 37, + 240, 18, 49, 242, 65, 242, 225, 66, 241, 66, 240, 17, + 49, 240, 33, 34, 240, 33, 34, 240, 33, 34, 240, 33, + 34, 240, 33, 34, 240, 33, 49, 240, 18, 50, 242, 50, + 241, 82, 210, 82, 194, 114, 162, 146, 115, 180, 20, 245, + 0, 23, 32, 27, 4, 193, 50, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 49, 49, 240, 240, 64, 49, 23, 0, 12, 5, 240, + 19, 49, 242, 81, 225, 113, 240, 113, 240, 97, 240, 113, + 240, 113, 240, 113, 240, 98, 240, 97, 209, 129, 178, 145, + 161, 177, 130, 193, 114, 209, 98, 225, 82, 242, 49, 240, + 49, 33, 240, 82, 0, 27, 64, 47, 20, 0, 8, 40, + 162, 115, 83, 162, 66, 209, 65, 210, 240, 35, 240, 19, + 240, 19, 240, 19, 240, 36, 240, 51, 240, 67, 240, 50, + 240, 50, 240, 66, 240, 50, 240, 49, 240, 50, 240, 50, + 161, 83, 198, 0, 23, 32, 52, 22, 0, 9, 82, 240, + 67, 240, 37, 240, 19, 18, 243, 34, 226, 66, 210, 82, + 194, 98, 178, 114, 162, 130, 161, 146, 82, 34, 146, 36, + 65, 150, 124, 240, 66, 240, 82, 240, 82, 240, 82, 240, + 82, 240, 82, 240, 82, 240, 97, 0, 23, 16, 39, 13, + 240, 240, 245, 55, 97, 193, 193, 193, 193, 193, 193, 51, + 97, 19, 33, 65, 18, 81, 49, 17, 97, 50, 113, 50, + 113, 193, 178, 178, 177, 193, 177, 113, 49, 147, 0, 13, + 112, 34, 15, 0, 8, 65, 225, 209, 225, 209, 225, 209, + 209, 225, 209, 209, 225, 209, 225, 209, 97, 113, 115, 65, + 162, 33, 177, 33, 177, 50, 114, 103, 0, 15, 80, 28, + 15, 0, 7, 68, 248, 226, 210, 209, 210, 209, 225, 210, + 209, 210, 209, 225, 210, 209, 210, 209, 225, 209, 225, 225, + 0, 16, 16, 45, 13, 240, 129, 193, 193, 193, 193, 130, + 18, 98, 49, 82, 81, 65, 98, 65, 97, 66, 81, 82, + 66, 97, 65, 114, 33, 147, 194, 161, 18, 129, 66, 97, + 81, 97, 81, 81, 97, 82, 66, 97, 34, 131, 0, 14, + 55, 18, 0, 9, 72, 17, 99, 97, 18, 66, 147, 65, + 163, 50, 148, 50, 145, 33, 65, 130, 33, 65, 114, 49, + 66, 82, 65, 83, 19, 81, 116, 97, 240, 33, 240, 33, + 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, + 240, 33, 240, 49, 0, 18, 32, 14, 4, 240, 240, 34, + 34, 34, 240, 240, 66, 34, 0, 6, 32, 16, 4, 0, + 6, 66, 34, 33, 240, 209, 49, 49, 49, 49, 34, 240, + 112, 23, 16, 0, 15, 51, 180, 164, 179, 179, 180, 179, + 194, 228, 227, 243, 227, 227, 243, 227, 242, 0, 20, 48, + 11, 14, 0, 19, 44, 0, 9, 12, 0, 26, 64, 23, + 16, 0, 14, 2, 243, 243, 228, 228, 227, 243, 227, 196, + 180, 179, 179, 195, 179, 195, 194, 0, 21, 80, 30, 13, + 240, 240, 211, 135, 82, 82, 50, 114, 33, 145, 33, 145, + 33, 145, 33, 130, 33, 130, 162, 162, 162, 0, 14, 18, + 178, 0, 13, 112, 77, 25, 0, 10, 38, 240, 50, 67, + 241, 130, 209, 162, 177, 193, 162, 194, 145, 225, 130, 83, + 97, 129, 82, 17, 97, 65, 49, 66, 33, 97, 65, 34, + 50, 113, 33, 65, 34, 49, 114, 33, 65, 49, 33, 130, + 33, 65, 49, 33, 113, 17, 33, 65, 49, 33, 98, 19, + 66, 50, 17, 82, 50, 65, 81, 37, 162, 82, 240, 17, + 114, 226, 131, 178, 164, 115, 233, 0, 26, 48, 15, 0, + 8, 18, 209, 17, 178, 17, 177, 34, 161, 34, 146, 49, + 146, 49, 145, 66, 129, 66, 114, 81, 114, 81, 113, 98, + 97, 98, 92, 50, 113, 82, 113, 81, 130, 50, 130, 50, + 145, 50, 145, 49, 161, 225, 0, 13, 64, 43, 14, 0, + 7, 11, 49, 146, 49, 145, 49, 130, 49, 99, 65, 82, + 97, 50, 129, 18, 161, 20, 113, 99, 65, 130, 49, 145, + 49, 146, 33, 146, 33, 145, 49, 130, 178, 178, 178, 162, + 133, 0, 15, 16, 44, 20, 0, 11, 3, 244, 242, 240, + 34, 240, 34, 240, 34, 240, 50, 240, 49, 240, 50, 240, + 49, 240, 50, 240, 50, 240, 49, 240, 65, 240, 66, 240, + 50, 240, 50, 240, 66, 195, 66, 101, 136, 0, 23, 80, + 53, 18, 0, 6, 113, 240, 37, 209, 22, 161, 69, 129, + 116, 97, 147, 81, 178, 65, 193, 65, 194, 49, 194, 49, + 194, 49, 193, 65, 178, 65, 178, 65, 178, 50, 177, 66, + 162, 66, 161, 82, 17, 114, 82, 33, 82, 97, 65, 50, + 113, 69, 226, 0, 17, 38, 16, 0, 8, 49, 241, 25, + 81, 23, 113, 241, 226, 226, 225, 226, 131, 50, 85, 66, + 52, 113, 66, 130, 226, 226, 226, 145, 66, 146, 50, 131, + 67, 53, 104, 177, 0, 17, 32, 47, 19, 0, 9, 81, + 105, 58, 146, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 71, 98, 20, 194, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 240, 34, 240, 34, 240, 18, 240, 34, 240, + 34, 240, 33, 0, 21, 32, 42, 18, 0, 9, 113, 240, + 18, 242, 242, 242, 242, 240, 18, 242, 240, 18, 242, 240, + 18, 177, 66, 178, 50, 194, 34, 209, 34, 209, 34, 209, + 34, 209, 34, 194, 50, 162, 82, 115, 135, 0, 18, 112, + 52, 17, 0, 7, 82, 82, 130, 82, 130, 82, 130, 82, + 130, 82, 146, 66, 146, 66, 146, 66, 116, 66, 98, 18, + 66, 82, 49, 66, 50, 81, 67, 18, 97, 69, 113, 66, + 162, 50, 162, 50, 162, 50, 177, 50, 177, 50, 178, 34, + 193, 33, 0, 19, 27, 5, 240, 82, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 65, 66, 50, + 50, 50, 65, 65, 240, 240, 192, 41, 18, 0, 9, 103, + 104, 149, 240, 240, 84, 240, 20, 240, 19, 240, 35, 240, + 34, 240, 34, 240, 33, 240, 33, 240, 34, 240, 17, 240, + 33, 240, 18, 113, 114, 129, 114, 145, 67, 182, 0, 21, + 50, 20, 0, 7, 66, 240, 50, 240, 50, 240, 50, 178, + 82, 162, 98, 146, 114, 131, 114, 115, 130, 99, 146, 83, + 162, 67, 178, 66, 194, 50, 210, 50, 210, 50, 210, 50, + 210, 66, 194, 69, 161, 106, 50, 240, 50, 240, 65, 0, + 22, 16, 46, 20, 0, 10, 2, 240, 50, 240, 50, 240, + 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, + 50, 240, 50, 240, 66, 240, 50, 240, 50, 240, 66, 240, + 50, 240, 66, 163, 98, 131, 132, 37, 183, 0, 23, 32, + 69, 24, 0, 12, 50, 240, 114, 178, 146, 164, 115, 162, + 18, 99, 146, 34, 97, 18, 130, 34, 97, 33, 114, 65, + 97, 33, 114, 65, 97, 34, 82, 82, 66, 49, 81, 98, + 65, 66, 50, 113, 65, 85, 129, 65, 240, 49, 65, 240, + 50, 49, 240, 50, 34, 240, 65, 34, 240, 65, 34, 240, + 65, 34, 240, 65, 240, 129, 0, 27, 32, 58, 28, 0, + 17, 1, 240, 194, 114, 240, 34, 115, 242, 131, 242, 131, + 242, 114, 18, 226, 114, 18, 226, 114, 18, 210, 130, 34, + 194, 130, 34, 194, 130, 35, 162, 146, 50, 162, 146, 51, + 130, 146, 83, 99, 146, 100, 36, 162, 120, 177, 179, 194, + 240, 162, 240, 162, 0, 31, 32, 59, 22, 0, 8, 114, + 240, 52, 240, 50, 161, 130, 164, 82, 210, 82, 226, 50, + 240, 17, 50, 240, 18, 34, 240, 18, 34, 240, 18, 34, + 240, 33, 34, 240, 33, 34, 240, 18, 34, 240, 18, 34, + 240, 17, 66, 226, 66, 225, 98, 194, 98, 178, 130, 131, + 164, 36, 230, 0, 23, 32, 38, 11, 240, 240, 70, 66, + 51, 49, 98, 33, 98, 33, 98, 33, 98, 33, 82, 49, + 66, 65, 35, 81, 18, 113, 161, 161, 161, 161, 162, 146, + 146, 146, 146, 146, 146, 0, 12, 16, 51, 19, 0, 8, + 3, 243, 243, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 34, 240, 18, 209, 50, 209, 50, 209, 34, 225, 34, 225, + 34, 210, 34, 210, 34, 129, 50, 50, 113, 50, 66, 113, + 35, 82, 101, 100, 68, 155, 165, 67, 0, 19, 32, 45, + 19, 0, 12, 11, 114, 130, 113, 131, 113, 115, 129, 114, + 145, 98, 161, 82, 177, 82, 177, 66, 193, 66, 193, 67, + 177, 82, 177, 98, 161, 115, 129, 148, 81, 211, 33, 240, + 49, 240, 49, 240, 49, 0, 21, 32, 33, 16, 0, 7, + 50, 196, 165, 133, 148, 179, 194, 226, 226, 243, 227, 228, + 228, 228, 227, 242, 242, 226, 81, 114, 97, 99, 97, 68, + 134, 178, 0, 15, 16, 47, 18, 0, 8, 51, 165, 151, + 135, 163, 34, 240, 18, 240, 18, 240, 18, 240, 34, 240, + 18, 240, 18, 240, 18, 240, 34, 240, 18, 240, 18, 240, + 34, 240, 18, 240, 34, 240, 18, 240, 33, 240, 34, 240, + 34, 0, 18, 80, 56, 23, 0, 17, 49, 240, 33, 66, + 240, 17, 50, 240, 33, 50, 240, 34, 34, 240, 34, 34, + 240, 34, 34, 240, 34, 34, 240, 34, 34, 240, 34, 34, + 240, 34, 34, 240, 18, 65, 240, 18, 66, 241, 82, 226, + 98, 194, 130, 162, 147, 115, 180, 36, 246, 0, 24, 48, + 46, 25, 0, 24, 81, 240, 130, 240, 114, 50, 240, 49, + 66, 240, 34, 82, 242, 98, 227, 114, 210, 131, 178, 162, + 178, 163, 146, 194, 130, 226, 114, 226, 98, 240, 18, 67, + 240, 19, 35, 240, 54, 240, 84, 0, 26, 80, 67, 26, + 0, 18, 97, 240, 162, 240, 146, 240, 161, 240, 162, 240, + 146, 195, 161, 49, 117, 146, 33, 114, 34, 130, 33, 113, + 66, 114, 33, 98, 82, 98, 33, 98, 97, 98, 33, 98, + 98, 82, 34, 81, 130, 66, 34, 81, 145, 66, 49, 66, + 146, 34, 66, 50, 161, 34, 66, 34, 181, 82, 18, 196, + 99, 226, 0, 26, 64, 43, 16, 0, 9, 81, 226, 34, + 162, 35, 130, 66, 130, 82, 98, 99, 67, 114, 66, 146, + 35, 165, 180, 211, 211, 196, 194, 18, 162, 35, 131, 50, + 130, 82, 99, 82, 98, 114, 82, 129, 81, 0, 15, 80, + 48, 19, 0, 9, 17, 240, 34, 240, 34, 34, 194, 51, + 178, 67, 161, 99, 130, 116, 98, 149, 34, 214, 240, 34, + 240, 33, 240, 34, 240, 34, 240, 33, 240, 34, 240, 34, + 240, 33, 240, 34, 240, 34, 240, 49, 240, 49, 0, 20, + 48, 31, 0, 17, 6, 240, 31, 220, 66, 240, 211, 240, + 210, 240, 210, 240, 211, 240, 210, 240, 210, 240, 226, 240, + 210, 240, 226, 240, 210, 240, 226, 240, 226, 240, 210, 240, + 226, 240, 227, 197, 195, 89, 252, 240, 87, 0, 32, 64, + 35, 16, 0, 6, 33, 146, 67, 67, 97, 22, 129, 241, + 225, 241, 241, 241, 241, 241, 241, 225, 241, 241, 241, 241, + 241, 241, 241, 67, 129, 37, 133, 177, 0, 15, 112, 26, + 15, 0, 9, 49, 241, 226, 225, 241, 226, 225, 241, 226, + 225, 241, 226, 225, 226, 226, 225, 241, 225, 241, 0, 17, + 16, 31, 15, 240, 240, 251, 68, 82, 210, 210, 210, 210, + 210, 225, 225, 225, 226, 210, 210, 210, 210, 225, 225, 225, + 226, 210, 210, 75, 67, 0, 14, 48, 21, 11, 0, 6, + 2, 131, 129, 17, 113, 33, 98, 33, 97, 50, 65, 81, + 65, 98, 0, 29, 16, 8, 12, 0, 36, 10, 0, 12, + 32, 9, 7, 240, 97, 114, 98, 98, 0, 23, 27, 13, + 0, 26, 50, 177, 177, 178, 50, 97, 49, 18, 66, 49, + 33, 65, 49, 49, 65, 34, 65, 52, 97, 49, 0, 12, + 96, 32, 12, 0, 10, 81, 177, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 67, 50, 97, 50, 98, 49, 97, + 66, 66, 66, 50, 101, 130, 0, 11, 48, 19, 11, 0, + 18, 67, 114, 130, 130, 130, 145, 146, 146, 146, 162, 152, + 84, 0, 11, 64, 42, 15, 0, 6, 113, 226, 210, 210, + 210, 210, 210, 210, 210, 210, 210, 225, 113, 97, 82, 113, + 65, 145, 50, 130, 49, 146, 49, 146, 49, 131, 49, 114, + 17, 50, 83, 17, 71, 50, 69, 0, 14, 16, 27, 17, + 0, 32, 101, 178, 50, 145, 81, 161, 35, 105, 193, 240, + 17, 240, 17, 240, 17, 240, 34, 97, 151, 17, 0, 15, + 16, 28, 15, 0, 11, 89, 82, 129, 66, 210, 210, 210, + 210, 225, 225, 81, 89, 147, 194, 210, 210, 225, 225, 225, + 225, 225, 0, 16, 32, 29, 13, 0, 23, 34, 146, 162, + 177, 178, 178, 177, 194, 99, 56, 17, 68, 65, 193, 193, + 193, 177, 129, 49, 129, 34, 147, 162, 240, 48, 43, 18, + 0, 22, 65, 240, 33, 240, 33, 240, 49, 240, 33, 240, + 33, 240, 33, 240, 33, 115, 129, 82, 18, 113, 66, 49, + 113, 50, 65, 113, 49, 97, 113, 18, 97, 113, 17, 114, + 99, 130, 0, 18, 32, 20, 5, 0, 6, 50, 50, 240, + 34, 65, 65, 65, 65, 65, 65, 65, 66, 65, 240, 240, + 192, 28, 14, 0, 18, 33, 193, 193, 209, 0, 6, 113, + 211, 194, 210, 210, 210, 210, 209, 209, 210, 193, 194, 194, + 51, 67, 87, 240, 80, 35, 13, 240, 240, 161, 178, 178, + 178, 178, 178, 178, 178, 97, 66, 67, 66, 50, 98, 34, + 114, 18, 132, 147, 162, 178, 179, 180, 146, 23, 50, 178, + 193, 0, 14, 32, 27, 5, 240, 82, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 65, 65, 66, 50, 240, 240, 192, 31, 15, 0, 27, 20, + 113, 34, 33, 102, 33, 98, 18, 49, 65, 17, 113, 65, + 17, 113, 65, 17, 129, 51, 130, 50, 145, 50, 210, 0, + 16, 64, 27, 13, 0, 26, 1, 50, 113, 36, 97, 19, + 18, 84, 49, 99, 50, 82, 81, 82, 82, 66, 97, 66, + 113, 65, 0, 12, 80, 21, 12, 0, 25, 114, 146, 146, + 146, 81, 65, 113, 49, 129, 33, 114, 35, 36, 85, 0, + 11, 16, 26, 8, 0, 17, 19, 66, 19, 33, 65, 33, + 65, 33, 50, 33, 50, 33, 34, 52, 65, 113, 113, 113, + 113, 113, 113, 240, 33, 17, 0, 32, 20, 194, 241, 242, + 241, 97, 145, 82, 145, 82, 145, 67, 151, 179, 33, 240, + 17, 240, 17, 242, 240, 18, 82, 130, 66, 166, 240, 240, + 128, 22, 12, 0, 20, 2, 134, 82, 66, 66, 97, 34, + 162, 162, 162, 162, 162, 162, 162, 162, 0, 11, 96, 19, + 9, 0, 16, 35, 67, 67, 98, 130, 131, 130, 130, 129, + 49, 35, 52, 0, 9, 64, 28, 14, 0, 10, 97, 194, + 194, 194, 194, 194, 210, 194, 194, 194, 38, 41, 85, 194, + 194, 209, 210, 194, 194, 209, 209, 0, 13, 32, 22, 11, + 0, 23, 49, 161, 113, 33, 113, 33, 113, 33, 113, 34, + 82, 50, 50, 85, 129, 0, 10, 48, 23, 10, 0, 18, + 49, 130, 130, 130, 129, 50, 50, 50, 50, 66, 33, 82, + 18, 97, 18, 99, 0, 10, 80, 31, 14, 0, 29, 33, + 49, 145, 49, 146, 33, 146, 33, 67, 34, 33, 68, 18, + 33, 50, 33, 18, 33, 50, 36, 49, 18, 66, 82, 0, + 13, 64, 22, 9, 0, 18, 1, 81, 34, 49, 66, 17, + 99, 98, 115, 82, 17, 81, 49, 130, 129, 0, 8, 16, + 25, 13, 0, 28, 113, 178, 33, 129, 50, 113, 66, 97, + 83, 49, 133, 193, 178, 177, 193, 178, 177, 193, 193, 193, + 96, 19, 15, 0, 28, 102, 101, 34, 67, 97, 209, 210, + 209, 210, 209, 225, 231, 0, 15, 32, 42, 17, 0, 6, + 91, 107, 98, 242, 240, 17, 240, 17, 242, 227, 211, 226, + 242, 240, 18, 240, 18, 240, 18, 240, 17, 240, 17, 240, + 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, 27, 0, + 17, 32, 27, 4, 193, 49, 50, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 49, + 49, 49, 240, 240, 64, 29, 16, 0, 6, 10, 227, 210, + 226, 226, 226, 226, 226, 226, 243, 227, 242, 196, 164, 194, + 226, 226, 226, 226, 196, 105, 132, 0, 17, 48, 16, 14, + 0, 24, 97, 129, 52, 81, 49, 50, 49, 65, 68, 0, + 26, 112, 26, 5, 240, 33, 50, 50, 240, 130, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 35, + 49, 240, 240, 128, 38, 10, 240, 240, 194, 130, 146, 130, + 130, 129, 17, 97, 17, 100, 82, 34, 66, 34, 65, 50, + 65, 50, 65, 65, 66, 49, 84, 18, 67, 17, 130, 145, + 145, 145, 145, 161, 0, 9, 48, 20, 0, 8, 35, 247, + 209, 81, 193, 240, 65, 240, 65, 240, 65, 240, 81, 240, + 65, 240, 65, 240, 65, 240, 81, 240, 24, 241, 240, 65, + 240, 65, 240, 65, 240, 65, 245, 226, 36, 196, 50, 240, + 66, 240, 88, 0, 17, 96, 24, 13, 0, 19, 66, 20, + 33, 67, 50, 99, 19, 97, 19, 17, 103, 98, 50, 86, + 18, 50, 114, 0, 21, 48, 48, 20, 0, 9, 21, 37, + 161, 240, 50, 98, 161, 129, 161, 130, 129, 162, 113, 177, + 97, 194, 81, 210, 65, 225, 49, 242, 33, 233, 225, 17, + 243, 17, 233, 240, 17, 240, 65, 240, 65, 240, 65, 240, + 65, 246, 240, 83, 0, 18, 22, 4, 240, 82, 34, 34, + 34, 34, 34, 34, 34, 241, 34, 34, 34, 34, 34, 34, + 34, 240, 240, 128, 41, 16, 0, 7, 50, 181, 149, 133, + 148, 195, 194, 19, 162, 50, 147, 50, 147, 66, 132, 50, + 148, 34, 148, 49, 164, 17, 196, 227, 226, 226, 81, 130, + 81, 99, 98, 52, 135, 162, 0, 15, 16, 12, 12, 0, + 6, 115, 35, 67, 35, 82, 0, 39, 32, 51, 19, 0, + 13, 3, 226, 17, 210, 240, 18, 240, 17, 240, 33, 240, + 49, 82, 161, 82, 177, 65, 193, 66, 145, 33, 65, 161, + 33, 65, 161, 33, 65, 161, 33, 66, 65, 65, 33, 100, + 65, 49, 210, 65, 178, 82, 146, 116, 52, 167, 0, 20, + 21, 10, 240, 240, 209, 129, 129, 34, 65, 49, 17, 49, + 33, 33, 49, 17, 50, 49, 0, 28, 64, 37, 18, 0, + 19, 2, 81, 146, 67, 115, 67, 114, 82, 130, 67, 130, + 66, 146, 66, 146, 82, 163, 67, 162, 66, 178, 66, 178, + 67, 162, 67, 162, 82, 162, 81, 0, 22, 96, 18, 14, + 0, 18, 1, 155, 195, 194, 209, 209, 209, 209, 209, 209, + 209, 0, 21, 32, 8, 11, 0, 20, 89, 0, 23, 80, + 59, 19, 0, 12, 116, 210, 33, 209, 240, 33, 240, 33, + 240, 33, 38, 145, 33, 65, 161, 33, 49, 177, 33, 49, + 97, 49, 49, 33, 129, 33, 49, 33, 129, 33, 49, 49, + 113, 33, 49, 66, 65, 49, 50, 82, 33, 49, 50, 129, + 65, 50, 114, 81, 162, 114, 99, 167, 0, 22, 48, 8, + 12, 0, 12, 10, 0, 36, 32, 18, 11, 0, 5, 114, + 129, 145, 81, 50, 82, 34, 97, 49, 82, 69, 0, 30, + 96, 25, 13, 0, 11, 97, 194, 193, 193, 194, 193, 193, + 137, 129, 193, 193, 193, 193, 193, 193, 240, 240, 59, 0, + 13, 32, 23, 13, 240, 240, 179, 130, 33, 193, 177, 193, + 193, 193, 82, 81, 65, 113, 34, 129, 17, 177, 0, 31, + 112, 18, 10, 240, 240, 37, 50, 65, 145, 129, 130, 161, + 161, 145, 129, 114, 0, 25, 64, 9, 7, 240, 146, 66, + 50, 0, 24, 32, 41, 20, 0, 26, 81, 145, 145, 145, + 161, 129, 161, 114, 162, 99, 146, 99, 131, 82, 17, 132, + 65, 33, 114, 33, 65, 51, 20, 49, 65, 97, 129, 49, + 241, 49, 241, 49, 240, 49, 0, 22, 48, 56, 20, 0, + 7, 79, 3, 240, 225, 66, 165, 65, 116, 34, 65, 98, + 82, 65, 97, 98, 65, 97, 98, 65, 97, 98, 65, 98, + 97, 65, 116, 19, 65, 163, 17, 65, 225, 65, 225, 65, + 226, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, + 65, 250, 0, 20, 80, 11, 6, 0, 10, 1, 67, 36, + 50, 0, 12, 48, 13, 5, 0, 12, 81, 65, 65, 81, + 50, 34, 240, 240, 128, 15, 3, 145, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 0, 7, 96, 17, 11, 240, 240, + 98, 129, 145, 81, 50, 97, 34, 97, 49, 82, 70, 0, + 32, 43, 20, 0, 15, 2, 97, 194, 83, 178, 83, 179, + 67, 179, 82, 179, 82, 194, 83, 178, 82, 194, 82, 163, + 67, 147, 67, 146, 82, 162, 82, 162, 82, 162, 82, 162, + 82, 162, 82, 162, 97, 0, 23, 112, 56, 17, 0, 6, + 65, 242, 146, 66, 145, 82, 130, 82, 114, 98, 113, 114, + 98, 114, 82, 145, 81, 161, 66, 241, 49, 177, 50, 162, + 18, 17, 161, 33, 33, 146, 17, 49, 145, 17, 65, 49, + 65, 17, 84, 66, 39, 97, 129, 98, 129, 240, 17, 240, + 17, 0, 17, 96, 46, 16, 0, 8, 17, 241, 241, 114, + 97, 113, 113, 97, 129, 82, 129, 81, 145, 65, 161, 50, + 161, 49, 177, 33, 241, 225, 35, 148, 33, 145, 81, 130, + 65, 145, 81, 129, 97, 66, 145, 49, 177, 33, 210, 0, + 16, 96, 65, 21, 0, 8, 36, 129, 98, 49, 114, 81, + 81, 98, 193, 97, 193, 98, 194, 66, 225, 65, 240, 17, + 34, 240, 17, 33, 240, 17, 33, 225, 33, 18, 51, 146, + 33, 52, 193, 50, 18, 178, 34, 34, 177, 33, 66, 162, + 17, 82, 161, 33, 85, 97, 72, 114, 161, 129, 177, 240, + 81, 240, 81, 240, 81, 0, 19, 30, 13, 0, 7, 33, + 178, 0, 14, 18, 162, 162, 113, 49, 129, 34, 129, 34, + 129, 34, 129, 34, 114, 49, 114, 51, 21, 101, 0, 13, + 80, 47, 14, 240, 240, 33, 225, 226, 240, 161, 195, 177, + 17, 177, 17, 162, 18, 145, 49, 145, 49, 145, 50, 114, + 50, 113, 81, 113, 81, 113, 81, 107, 50, 82, 81, 113, + 81, 113, 66, 113, 66, 113, 65, 145, 49, 0, 13, 112, + 48, 14, 240, 240, 81, 193, 178, 240, 194, 179, 177, 18, + 161, 33, 146, 33, 146, 33, 145, 50, 129, 65, 114, 65, + 114, 65, 113, 82, 97, 82, 91, 50, 97, 81, 113, 81, + 114, 50, 114, 50, 129, 49, 145, 49, 145, 0, 12, 80, + 45, 13, 240, 240, 225, 179, 146, 17, 240, 130, 179, 161, + 17, 146, 17, 145, 34, 129, 34, 114, 49, 113, 65, 113, + 66, 97, 66, 82, 81, 90, 49, 97, 81, 97, 66, 98, + 50, 113, 49, 129, 49, 129, 0, 13, 48, 48, 13, 240, + 240, 193, 177, 17, 65, 65, 50, 17, 177, 161, 178, 177, + 17, 146, 17, 145, 34, 129, 34, 114, 49, 113, 65, 113, + 66, 97, 66, 82, 81, 90, 49, 97, 81, 97, 66, 98, + 50, 113, 49, 129, 49, 129, 0, 13, 48, 47, 14, 240, + 240, 241, 50, 209, 240, 146, 179, 177, 18, 161, 33, 146, + 33, 145, 49, 145, 50, 114, 65, 114, 65, 113, 81, 113, + 82, 97, 82, 91, 50, 97, 81, 113, 81, 114, 50, 129, + 50, 129, 49, 145, 209, 0, 12, 80, 46, 13, 240, 240, + 210, 164, 148, 147, 240, 161, 178, 161, 18, 145, 33, 145, + 33, 145, 34, 113, 50, 113, 65, 113, 66, 97, 66, 82, + 66, 81, 24, 49, 97, 81, 97, 66, 98, 50, 113, 49, + 129, 49, 129, 0, 11, 96, 55, 23, 0, 12, 82, 240, + 99, 240, 76, 162, 18, 240, 49, 34, 240, 34, 34, 240, + 33, 50, 240, 18, 50, 240, 17, 66, 242, 66, 241, 91, + 82, 82, 226, 37, 210, 23, 210, 98, 209, 114, 194, 114, + 193, 130, 178, 130, 177, 146, 21, 81, 154, 228, 0, 21, + 16, 28, 15, 0, 10, 3, 178, 194, 194, 209, 210, 209, + 210, 209, 225, 225, 225, 225, 241, 226, 100, 86, 193, 226, + 225, 226, 179, 0, 14, 35, 14, 0, 5, 113, 225, 225, + 240, 113, 218, 66, 36, 97, 209, 209, 194, 193, 130, 49, + 68, 81, 50, 114, 193, 209, 209, 145, 50, 114, 50, 83, + 88, 131, 0, 15, 37, 15, 0, 6, 113, 209, 194, 240, + 129, 226, 23, 82, 24, 66, 210, 209, 225, 210, 209, 115, + 65, 69, 81, 51, 114, 209, 225, 225, 145, 66, 130, 50, + 99, 89, 118, 0, 14, 35, 14, 0, 9, 66, 177, 33, + 240, 97, 209, 218, 66, 193, 209, 194, 194, 193, 99, 65, + 51, 98, 49, 129, 209, 209, 129, 66, 113, 66, 83, 88, + 131, 0, 13, 32, 37, 16, 0, 8, 66, 49, 240, 240, + 177, 241, 25, 81, 22, 129, 241, 226, 225, 226, 226, 100, + 66, 53, 97, 51, 130, 226, 226, 226, 145, 66, 130, 67, + 84, 89, 134, 0, 15, 28, 6, 240, 49, 98, 97, 145, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 82, 66, 81, 81, 82, 81, 240, 240, 224, 27, 5, 240, + 33, 34, 210, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 65, 65, 66, 50, 65, 240, 240, 112, + 28, 6, 240, 65, 65, 17, 49, 193, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 82, 66, 81, 81, 81, + 97, 0, 6, 32, 28, 7, 240, 240, 81, 49, 240, 33, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 98, 97, 97, 97, 0, 6, 80, 49, 22, 0, 14, + 69, 240, 55, 241, 68, 209, 99, 193, 131, 161, 161, 161, + 177, 145, 177, 145, 177, 40, 177, 145, 177, 145, 161, 161, + 161, 146, 161, 146, 146, 146, 145, 162, 17, 97, 178, 33, + 66, 177, 50, 34, 240, 36, 0, 22, 112, 57, 24, 0, + 13, 3, 97, 209, 49, 65, 225, 68, 0, 6, 66, 98, + 226, 99, 210, 99, 210, 99, 210, 100, 193, 113, 18, 178, + 113, 33, 178, 98, 34, 162, 98, 34, 146, 114, 50, 130, + 114, 50, 114, 130, 66, 82, 145, 103, 146, 132, 162, 240, + 98, 240, 98, 0, 23, 96, 45, 19, 0, 8, 18, 240, + 65, 0, 6, 19, 242, 240, 33, 147, 82, 178, 65, 209, + 50, 210, 34, 210, 33, 241, 33, 241, 33, 241, 33, 241, + 34, 209, 65, 209, 66, 178, 66, 162, 98, 130, 130, 83, + 167, 0, 20, 45, 19, 0, 8, 50, 240, 17, 0, 6, + 35, 242, 240, 33, 147, 82, 178, 65, 209, 50, 210, 34, + 225, 33, 241, 33, 241, 33, 241, 33, 241, 34, 209, 65, + 209, 66, 178, 81, 162, 98, 130, 130, 83, 167, 0, 20, + 47, 19, 0, 8, 18, 240, 18, 17, 241, 240, 240, 52, + 242, 240, 17, 147, 82, 178, 65, 209, 50, 210, 34, 225, + 34, 225, 33, 241, 33, 241, 34, 225, 34, 210, 49, 209, + 66, 178, 81, 162, 98, 130, 130, 83, 167, 0, 20, 49, + 19, 0, 7, 114, 240, 17, 33, 65, 145, 68, 240, 211, + 240, 18, 240, 17, 147, 82, 178, 65, 209, 50, 210, 34, + 225, 34, 225, 33, 241, 33, 241, 34, 225, 34, 210, 49, + 209, 66, 178, 81, 162, 98, 130, 130, 83, 167, 0, 20, + 48, 19, 0, 7, 50, 240, 35, 130, 240, 34, 240, 179, + 240, 18, 240, 17, 147, 82, 178, 65, 209, 50, 210, 34, + 225, 34, 225, 33, 241, 33, 241, 34, 225, 34, 210, 49, + 209, 66, 178, 81, 162, 98, 130, 130, 83, 167, 0, 20, + 29, 12, 0, 13, 17, 33, 113, 50, 97, 66, 65, 98, + 34, 116, 132, 146, 148, 129, 34, 98, 49, 82, 66, 65, + 97, 193, 0, 16, 96, 62, 21, 0, 11, 18, 113, 163, + 98, 146, 114, 146, 129, 19, 82, 129, 66, 66, 114, 82, + 49, 129, 98, 34, 113, 129, 34, 98, 129, 34, 97, 145, + 34, 82, 145, 34, 81, 161, 34, 65, 177, 49, 50, 177, + 50, 33, 178, 50, 17, 193, 81, 17, 178, 82, 178, 99, + 146, 113, 19, 68, 184, 0, 22, 52, 20, 0, 8, 34, + 240, 66, 240, 81, 0, 8, 113, 225, 50, 241, 34, 241, + 33, 240, 17, 33, 240, 17, 33, 240, 17, 33, 240, 17, + 33, 240, 17, 33, 240, 17, 34, 226, 34, 225, 66, 194, + 66, 178, 98, 146, 130, 99, 169, 212, 0, 18, 96, 52, + 22, 0, 9, 81, 240, 81, 240, 66, 0, 7, 33, 241, + 66, 241, 66, 241, 66, 242, 49, 240, 18, 49, 240, 18, + 34, 240, 18, 49, 240, 18, 49, 240, 18, 49, 243, 50, + 226, 81, 226, 82, 194, 113, 178, 130, 131, 163, 68, 215, + 0, 23, 16, 53, 20, 0, 11, 2, 240, 36, 240, 17, + 33, 0, 6, 33, 225, 50, 241, 34, 241, 33, 240, 17, + 33, 240, 17, 33, 240, 17, 33, 240, 17, 33, 240, 17, + 33, 240, 17, 34, 226, 34, 225, 66, 194, 66, 178, 98, + 146, 130, 99, 168, 243, 0, 18, 96, 56, 22, 0, 8, + 113, 98, 195, 82, 209, 98, 0, 6, 82, 241, 50, 240, + 17, 50, 240, 18, 34, 240, 18, 34, 240, 18, 34, 240, + 18, 33, 240, 34, 34, 240, 18, 34, 240, 18, 34, 243, + 49, 242, 66, 211, 66, 210, 98, 178, 130, 131, 163, 68, + 200, 0, 23, 16, 51, 18, 0, 7, 113, 240, 17, 242, + 240, 146, 240, 18, 240, 17, 50, 178, 66, 162, 82, 145, + 115, 98, 149, 18, 211, 17, 240, 18, 240, 17, 240, 33, + 240, 18, 240, 17, 240, 33, 240, 18, 240, 17, 240, 33, + 240, 33, 240, 33, 0, 16, 96, 33, 12, 0, 6, 10, + 241, 177, 177, 177, 183, 81, 53, 49, 113, 49, 113, 49, + 113, 49, 98, 49, 21, 81, 177, 177, 177, 177, 177, 177, + 184, 0, 12, 48, 50, 15, 240, 240, 251, 65, 161, 50, + 146, 49, 146, 49, 131, 49, 115, 65, 84, 81, 52, 113, + 35, 145, 49, 161, 51, 129, 84, 81, 129, 81, 130, 65, + 145, 65, 145, 50, 145, 50, 145, 50, 130, 49, 33, 82, + 114, 20, 148, 0, 15, 112, 32, 14, 0, 18, 1, 226, + 225, 0, 6, 65, 193, 193, 209, 50, 113, 49, 18, 97, + 49, 33, 81, 49, 49, 81, 34, 50, 68, 83, 36, 0, + 13, 64, 30, 12, 0, 18, 97, 146, 145, 240, 240, 81, + 161, 177, 49, 97, 51, 65, 49, 33, 65, 49, 33, 65, + 33, 65, 51, 97, 49, 0, 11, 96, 31, 12, 0, 17, + 17, 163, 130, 17, 240, 240, 225, 161, 177, 49, 97, 51, + 65, 49, 33, 65, 49, 33, 65, 33, 65, 51, 97, 49, + 0, 11, 96, 35, 12, 0, 16, 97, 161, 17, 65, 49, + 50, 18, 145, 240, 240, 33, 161, 177, 49, 97, 51, 65, + 49, 33, 65, 49, 33, 65, 33, 65, 51, 97, 49, 0, + 11, 96, 30, 12, 0, 19, 113, 49, 177, 240, 240, 17, + 161, 177, 49, 97, 51, 65, 49, 33, 65, 49, 33, 65, + 33, 65, 51, 97, 49, 0, 11, 96, 29, 11, 0, 14, + 34, 132, 116, 115, 240, 240, 17, 145, 145, 145, 65, 81, + 50, 65, 49, 33, 49, 49, 33, 49, 33, 50, 35, 0, + 12, 38, 20, 0, 36, 52, 241, 65, 209, 66, 113, 81, + 19, 129, 39, 161, 49, 17, 193, 52, 177, 49, 33, 17, + 161, 49, 33, 18, 67, 33, 33, 65, 36, 83, 97, 177, + 0, 19, 96, 23, 9, 0, 17, 50, 82, 98, 113, 113, + 129, 129, 130, 134, 65, 17, 113, 129, 145, 114, 98, 240, + 240, 32, 25, 15, 0, 21, 34, 241, 241, 240, 240, 181, + 146, 49, 145, 50, 129, 20, 102, 193, 225, 225, 226, 233, + 0, 13, 48, 27, 16, 0, 19, 1, 226, 209, 0, 9, + 117, 161, 65, 145, 66, 145, 20, 103, 193, 241, 241, 240, + 17, 240, 25, 0, 14, 32, 32, 17, 0, 22, 18, 225, + 18, 240, 17, 0, 5, 117, 183, 161, 66, 146, 50, 161, + 35, 119, 225, 240, 17, 240, 17, 240, 18, 240, 41, 0, + 15, 16, 26, 16, 0, 24, 66, 49, 0, 7, 69, 161, + 66, 129, 66, 145, 20, 103, 193, 241, 240, 17, 241, 240, + 25, 0, 14, 32, 21, 7, 0, 8, 98, 114, 98, 240, + 34, 97, 97, 97, 97, 97, 97, 97, 98, 97, 0, 7, + 48, 21, 6, 0, 7, 17, 65, 50, 240, 129, 66, 81, + 81, 81, 81, 81, 81, 82, 81, 0, 6, 48, 21, 6, + 0, 7, 82, 51, 49, 33, 241, 81, 81, 81, 81, 81, + 81, 81, 82, 81, 0, 6, 48, 21, 8, 0, 13, 1, + 50, 33, 50, 193, 113, 113, 113, 113, 113, 113, 113, 129, + 113, 0, 7, 64, 24, 12, 0, 19, 81, 66, 101, 240, + 240, 66, 178, 178, 81, 82, 49, 113, 34, 113, 34, 113, + 57, 100, 0, 11, 34, 13, 0, 18, 17, 113, 49, 17, + 81, 49, 50, 33, 147, 240, 240, 17, 36, 97, 37, 84, + 34, 99, 50, 82, 81, 82, 81, 82, 82, 66, 193, 0, + 12, 80, 25, 12, 0, 19, 114, 178, 240, 240, 65, 146, + 146, 146, 81, 65, 113, 49, 129, 34, 98, 35, 36, 84, + 0, 11, 32, 26, 12, 0, 17, 33, 162, 145, 0, 5, + 113, 146, 146, 146, 81, 65, 113, 49, 129, 34, 98, 35, + 36, 84, 0, 11, 32, 28, 12, 0, 17, 1, 163, 145, + 18, 177, 240, 240, 49, 146, 146, 146, 81, 65, 113, 49, + 129, 34, 98, 35, 36, 84, 0, 11, 32, 30, 13, 0, + 19, 98, 97, 49, 33, 65, 49, 68, 240, 240, 81, 162, + 162, 162, 81, 81, 113, 65, 129, 50, 98, 67, 20, 115, + 0, 12, 16, 26, 13, 0, 18, 33, 193, 50, 0, 5, + 114, 162, 161, 177, 97, 66, 113, 50, 129, 34, 114, 50, + 83, 71, 0, 13, 64, 15, 14, 0, 18, 18, 194, 0, + 6, 28, 0, 6, 18, 193, 0, 22, 31, 13, 0, 22, + 17, 178, 177, 148, 130, 17, 130, 18, 114, 33, 33, 66, + 34, 49, 50, 33, 81, 34, 18, 66, 51, 51, 86, 113, + 0, 12, 80, 26, 12, 0, 18, 49, 194, 178, 240, 241, + 162, 113, 34, 113, 34, 113, 34, 113, 50, 82, 51, 50, + 86, 131, 0, 11, 16, 27, 12, 0, 18, 98, 145, 146, + 240, 240, 33, 177, 113, 34, 113, 34, 113, 49, 113, 50, + 82, 51, 50, 86, 131, 0, 11, 16, 27, 12, 0, 18, + 66, 163, 129, 33, 240, 241, 162, 113, 34, 113, 34, 113, + 34, 113, 50, 82, 51, 50, 86, 131, 0, 11, 16, 28, + 13, 0, 21, 50, 50, 177, 240, 50, 177, 129, 49, 129, + 49, 130, 33, 130, 34, 99, 34, 98, 66, 52, 87, 131, + 0, 12, 16, 27, 12, 0, 21, 82, 145, 161, 240, 225, + 33, 129, 34, 97, 66, 81, 83, 49, 116, 177, 177, 177, + 161, 177, 177, 161, 240, 240, 31, 10, 0, 7, 72, 193, + 145, 145, 145, 150, 65, 66, 49, 97, 33, 97, 33, 81, + 49, 20, 65, 145, 145, 145, 145, 145, 145, 151, 0, 9, + 16, 27, 12, 0, 21, 33, 49, 177, 240, 240, 129, 177, + 34, 98, 50, 81, 82, 65, 116, 177, 177, 177, 161, 177, + 177, 161, 240, 240, +}; + +//***************************************************************************** +// +// The glyph offset table for the 28 point Handwriting font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetHandwriting28[] = +{ + 0, 5, 31, 48, 98, 157, 212, 268, + 278, 311, 339, 353, 379, 392, 400, 409, + 437, 495, 522, 571, 618, 670, 709, 743, + 771, 816, 871, 885, 901, 924, 935, 958, + 988, 1065, 1113, 1156, 1200, 1253, 1291, 1338, + 1380, 1432, 1459, 1500, 1550, 1596, 1665, 1723, + 1782, 1820, 1871, 1916, 1949, 1996, 2052, 2098, + 2165, 2208, 2256, 2304, 2339, 2365, 2396, 2417, + 2425, 2434, 2461, 2493, 2512, 2554, 2581, 2609, + 2638, 2681, 2701, 2729, 2764, 2791, 2822, 2849, + 2870, 2896, 2929, 2951, 2970, 2998, 3020, 3043, + 3074, 3096, 3121, 3140, 3182, 3209, 3238, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3254, 3280, 3318, 3366, 3390, 3438, 3460, + 3501, 3513, 3564, 3585, 3622, 3640, 3648, 3707, + 3715, 3733, 3758, 3781, 3799, 3808, 3849, 3905, + 3916, 3929, 3944, 3961, 4004, 4060, 4106, 4171, + 4201, 4248, 4296, 4341, 4389, 4436, 4482, 4537, + 4565, 4600, 4637, 4672, 4709, 4737, 4764, 4792, + 4820, 4869, 4926, 4971, 5016, 5063, 5112, 5160, + 5189, 5251, 5303, 5355, 5408, 5464, 5515, 5548, + 5598, 5630, 5660, 5691, 5726, 5756, 5785, 5823, + 5846, 5871, 5898, 5930, 5956, 5977, 5998, 6019, + 6040, 6064, 6098, 6123, 6149, 6177, 6207, 6233, + 6248, 6279, 6305, 6332, 6359, 6387, 6414, 6445, +}; + +//***************************************************************************** +// +// The font definition for the 28 point Handwriting font. +// +//***************************************************************************** +const tFontEx g_sFontExHandwriting28 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 28, + + // + // The height of the font. + // + 33, + + // + // The baseline of the font. + // + 26, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetHandwriting28, + + // + // A pointer to the actual font data + // + g_pui8Handwriting28Data +}; diff --git a/third_party/fonts/ofl/fonts/fonthandwriting30.c b/third_party/fonts/ofl/fonts/fonthandwriting30.c new file mode 100644 index 0000000..6dffcdc --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthandwriting30.c @@ -0,0 +1,835 @@ +//***************************************************************************** +// +// fonthandwriting30.c - Font definition for the 30pt Handwriting font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://helloalan.com/projects/breip/ +// +// This Font Software is Copyright (c) 2008, Alan Hussey and Adam Breipohl. +// All Rights Reserved. +// +// "Breip" is a Reserved Font Name for this Font Software. +// +// This Font Software is licensed under the SIL Open Font License, +// Version 1.0. No modification of the license is permitted, only verbatim +// copy is allowed. This license is copied below, and is also available with +// a FAQ at: http://scripts.sil.org/OFL +// ------------------------------------------------------------------------ +// +// SIL OPEN FONT LICENSE +// +// Version 1.0 - 22 November 2005 +// PREAMBLE +// +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of cooperative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide an open +// framework in which fonts may be shared and improved in partnership with +// others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and sold with any software provided that the font names of +// derivative works are changed. The fonts and derivatives, however, cannot +// be released under any other type of license. +// +// DEFINITIONS +// +// "Font Software" refers to any and all of the following: +// +// * font files +// * data files +// * source code +// * build scripts +// * documentation +// +// "Reserved Font Name" refers to the Font Software name as seen by users +// and any other names as specified after the copyright statement. +// +// "Standard Version" refers to the collection of Font Software components +// as distributed by the Copyright Holder. +// +// "Modified Version" refers to any derivative font software made by adding +// to, deleting, or substituting -- in part or in whole -- any of the +// components of the Standard Version, by changing formats or by porting +// the Font Software to a new environment. +// +// "Author" refers to any designer, engineer, programmer, technical writer +// or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, in +// Standard or Modified Versions, may be sold by itself. +// +// 2) Standard or Modified Versions of the Font Software may be bundled, +// redistributed and sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or in +// the appropriate machine-readable metadata fields within text or binary +// files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s), in part or in whole, unless explicit written permission is +// granted by the Copyright Holder. This restriction applies to all +// references stored in the Font Software, such as the font menu name and +// other font description fields, which are used to differentiate the font +// from others. +// +// 4) The name(s) of the Copyright Holder or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any Modified +// Version, except to acknowledge the contribution(s) of the Copyright Holder +// and the Author(s) or with their explicit written permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, must +// be distributed using this license, and may not be distributed under any +// other license. +// +// TERMINATION +// +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER +// DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: handwriting +// Size: 30 point +// Bold: no +// Italic: no +// Memory usage: 7444 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 30 point Handwriting font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Handwriting30Data[7243] = +{ + 5, 13, 0, 56, 112, 28, 7, 240, 145, 97, 82, 82, + 82, 82, 82, 82, 67, 67, 67, 66, 82, 81, 97, 97, + 240, 193, 97, 82, 82, 81, 0, 7, 96, 19, 8, 240, + 240, 33, 113, 49, 49, 33, 65, 33, 65, 33, 65, 33, + 113, 0, 24, 64, 54, 24, 0, 12, 33, 240, 129, 240, + 130, 161, 178, 146, 178, 146, 194, 130, 159, 2, 162, 130, + 35, 114, 130, 194, 130, 194, 130, 194, 130, 194, 130, 194, + 130, 194, 130, 174, 159, 5, 81, 17, 162, 65, 82, 162, + 162, 177, 162, 177, 162, 177, 162, 0, 26, 64, 64, 18, + 0, 9, 34, 81, 177, 81, 177, 39, 132, 33, 33, 130, + 65, 163, 65, 161, 17, 65, 145, 33, 65, 145, 33, 65, + 145, 33, 65, 146, 17, 65, 171, 145, 65, 49, 129, 65, + 50, 113, 81, 34, 113, 81, 18, 129, 83, 145, 52, 153, + 99, 17, 97, 240, 33, 240, 49, 240, 33, 240, 33, 0, + 16, 48, 59, 22, 0, 13, 101, 33, 65, 145, 82, 49, + 163, 19, 65, 194, 113, 240, 81, 240, 97, 240, 81, 240, + 97, 240, 81, 240, 97, 240, 81, 240, 97, 84, 178, 66, + 49, 161, 81, 226, 81, 225, 97, 81, 129, 97, 81, 114, + 97, 81, 113, 113, 65, 114, 132, 130, 240, 81, 0, 24, + 32, 62, 20, 0, 7, 100, 242, 49, 210, 81, 193, 97, + 193, 97, 193, 97, 193, 97, 209, 66, 209, 65, 241, 49, + 242, 33, 113, 130, 17, 97, 162, 113, 178, 97, 178, 97, + 162, 17, 81, 161, 50, 49, 161, 66, 18, 146, 83, 161, + 114, 161, 131, 129, 113, 34, 113, 98, 50, 97, 82, 213, + 0, 18, 112, 12, 5, 240, 97, 49, 65, 65, 65, 65, + 0, 16, 16, 34, 11, 240, 240, 161, 131, 114, 130, 145, + 145, 161, 145, 161, 146, 145, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 177, 81, 65, 81, 85, 114, 0, 10, + 48, 30, 8, 240, 146, 98, 114, 113, 114, 113, 114, 98, + 98, 113, 113, 113, 113, 113, 113, 113, 113, 98, 98, 97, + 113, 98, 97, 97, 0, 8, 96, 16, 8, 240, 177, 113, + 17, 67, 82, 84, 65, 17, 17, 81, 0, 25, 80, 26, + 16, 0, 12, 65, 242, 226, 242, 226, 226, 227, 211, 211, + 140, 92, 146, 226, 226, 226, 226, 226, 226, 226, 241, 0, + 19, 13, 4, 0, 11, 65, 49, 49, 49, 49, 49, 49, + 240, 128, 8, 16, 0, 32, 13, 0, 36, 48, 10, 7, + 0, 22, 2, 68, 66, 0, 6, 80, 43, 18, 0, 10, + 82, 242, 240, 18, 242, 242, 240, 18, 242, 240, 17, 240, + 18, 242, 240, 17, 240, 18, 242, 240, 18, 242, 240, 17, + 240, 18, 242, 240, 18, 242, 240, 17, 240, 18, 240, 17, + 0, 20, 16, 68, 24, 0, 9, 98, 240, 85, 240, 51, + 33, 240, 34, 65, 240, 34, 65, 240, 18, 240, 114, 240, + 17, 66, 240, 33, 66, 240, 34, 50, 240, 34, 50, 240, + 34, 49, 240, 50, 49, 240, 50, 50, 240, 34, 50, 240, + 34, 50, 240, 34, 50, 240, 18, 82, 242, 82, 226, 114, + 195, 115, 163, 146, 147, 179, 68, 232, 0, 25, 48, 29, + 5, 240, 82, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 65, 65, + 65, 240, 240, 208, 56, 25, 0, 13, 4, 240, 68, 18, + 240, 35, 65, 240, 18, 97, 240, 145, 240, 145, 240, 129, + 240, 145, 240, 145, 240, 145, 240, 130, 240, 129, 225, 145, + 194, 161, 177, 193, 146, 194, 130, 225, 114, 241, 98, 240, + 17, 82, 240, 34, 49, 240, 82, 17, 240, 114, 0, 30, + 51, 22, 0, 9, 24, 179, 115, 114, 178, 83, 210, 65, + 226, 240, 67, 240, 51, 240, 51, 240, 51, 240, 51, 240, + 84, 240, 99, 240, 83, 240, 82, 240, 83, 240, 82, 240, + 82, 240, 82, 240, 81, 240, 82, 240, 66, 195, 51, 246, + 0, 25, 80, 58, 23, 0, 9, 115, 240, 68, 240, 53, + 240, 35, 18, 240, 19, 34, 242, 66, 226, 82, 210, 98, + 194, 114, 178, 130, 162, 146, 97, 49, 162, 67, 49, 162, + 35, 82, 149, 141, 240, 82, 240, 98, 240, 98, 240, 98, + 240, 98, 240, 98, 240, 98, 240, 113, 240, 113, 0, 24, + 32, 41, 15, 0, 6, 69, 73, 99, 193, 225, 225, 225, + 225, 225, 225, 52, 113, 19, 49, 81, 33, 97, 65, 17, + 113, 67, 113, 66, 129, 225, 225, 210, 209, 225, 209, 210, + 129, 50, 163, 0, 16, 16, 44, 17, 0, 9, 65, 240, + 17, 240, 17, 240, 17, 241, 240, 17, 241, 241, 240, 17, + 241, 241, 241, 240, 17, 241, 240, 17, 241, 240, 17, 130, + 97, 162, 65, 178, 49, 193, 49, 193, 66, 130, 120, 0, + 17, 96, 30, 16, 0, 8, 4, 249, 242, 241, 226, 225, + 241, 226, 225, 226, 225, 241, 226, 225, 226, 225, 241, 226, + 225, 226, 225, 241, 241, 0, 17, 32, 50, 15, 240, 177, + 225, 225, 225, 225, 225, 147, 18, 115, 49, 114, 81, 97, + 98, 81, 113, 97, 98, 82, 82, 113, 81, 130, 50, 146, + 18, 179, 211, 178, 18, 161, 65, 129, 97, 113, 97, 113, + 97, 113, 82, 113, 66, 133, 193, 0, 14, 48, 58, 20, + 0, 10, 73, 17, 116, 97, 18, 83, 147, 81, 179, 81, + 164, 66, 164, 66, 146, 33, 81, 130, 49, 82, 99, 49, + 98, 67, 65, 118, 97, 147, 113, 240, 65, 240, 65, 240, + 65, 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, 240, + 65, 240, 66, 240, 65, 0, 20, 48, 14, 6, 0, 6, + 98, 67, 65, 0, 6, 66, 66, 0, 10, 32, 18, 6, + 0, 10, 66, 66, 65, 0, 6, 1, 81, 82, 66, 65, + 66, 240, 240, 64, 32, 18, 0, 17, 49, 243, 212, 196, + 211, 211, 212, 211, 227, 244, 245, 240, 19, 240, 19, 240, + 19, 240, 35, 240, 19, 240, 20, 240, 19, 0, 22, 112, + 11, 16, 0, 24, 12, 0, 10, 77, 0, 32, 48, 27, + 17, 0, 14, 113, 240, 19, 244, 228, 244, 244, 243, 240, + 19, 243, 227, 196, 195, 195, 211, 196, 195, 211, 210, 0, + 23, 16, 32, 15, 0, 7, 118, 121, 98, 98, 66, 130, + 49, 146, 49, 146, 49, 146, 49, 146, 49, 130, 65, 130, + 194, 179, 209, 0, 16, 50, 210, 0, 16, 16, 84, 27, + 0, 11, 7, 240, 50, 114, 241, 162, 210, 177, 194, 194, + 177, 225, 161, 241, 161, 99, 98, 130, 82, 17, 98, 65, + 49, 81, 49, 98, 65, 49, 65, 130, 18, 65, 49, 50, + 130, 18, 65, 49, 49, 130, 34, 65, 49, 34, 130, 33, + 81, 49, 33, 129, 17, 33, 66, 65, 18, 98, 20, 65, + 81, 33, 67, 50, 81, 82, 37, 178, 97, 240, 49, 129, + 240, 17, 162, 209, 195, 146, 251, 0, 31, 64, 53, 17, + 0, 9, 34, 227, 225, 18, 194, 33, 194, 34, 177, 50, + 177, 50, 162, 65, 162, 66, 145, 82, 130, 82, 130, 97, + 130, 98, 114, 98, 113, 26, 66, 114, 98, 129, 98, 129, + 97, 146, 66, 146, 66, 146, 66, 161, 65, 177, 240, 17, + 0, 15, 48, 46, 16, 0, 8, 11, 81, 162, 50, 146, + 65, 146, 65, 115, 81, 98, 113, 51, 145, 19, 181, 177, + 67, 114, 114, 82, 130, 66, 145, 66, 145, 66, 145, 66, + 130, 66, 129, 225, 226, 210, 194, 145, 20, 179, 0, 17, + 64, 49, 22, 0, 12, 18, 240, 52, 240, 19, 240, 51, + 240, 66, 240, 66, 240, 66, 240, 82, 240, 81, 240, 82, + 240, 81, 240, 82, 240, 82, 240, 82, 240, 82, 240, 82, + 240, 82, 240, 82, 240, 98, 240, 82, 196, 83, 100, 184, + 0, 26, 56, 19, 0, 7, 35, 240, 22, 210, 21, 178, + 68, 146, 100, 114, 131, 98, 162, 82, 178, 66, 178, 66, + 178, 66, 178, 66, 178, 66, 178, 66, 178, 66, 177, 82, + 162, 67, 162, 67, 162, 67, 146, 83, 17, 113, 99, 33, + 82, 98, 49, 66, 114, 69, 228, 0, 20, 16, 49, 18, + 0, 9, 49, 240, 33, 55, 113, 41, 97, 240, 33, 240, + 18, 240, 18, 240, 18, 240, 17, 240, 18, 147, 66, 100, + 97, 84, 129, 66, 162, 240, 18, 240, 17, 240, 33, 177, + 82, 161, 82, 146, 98, 100, 107, 136, 0, 21, 32, 51, + 21, 0, 9, 113, 81, 106, 79, 103, 226, 240, 66, 240, + 66, 240, 66, 240, 66, 240, 66, 148, 98, 55, 146, 20, + 226, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, + 66, 240, 66, 240, 51, 240, 50, 240, 66, 240, 65, 0, + 23, 64, 53, 20, 0, 8, 65, 240, 49, 240, 50, 240, + 34, 240, 34, 240, 34, 240, 34, 240, 50, 240, 34, 240, + 50, 240, 49, 240, 50, 193, 82, 194, 66, 210, 50, 225, + 50, 225, 50, 225, 50, 225, 50, 225, 50, 210, 66, 178, + 83, 116, 124, 182, 0, 21, 16, 57, 20, 0, 9, 1, + 114, 146, 114, 147, 98, 162, 98, 162, 98, 162, 98, 162, + 98, 162, 98, 147, 98, 130, 18, 82, 114, 34, 82, 98, + 50, 82, 67, 66, 87, 98, 86, 129, 97, 193, 97, 194, + 81, 194, 81, 194, 81, 209, 81, 209, 81, 210, 65, 225, + 65, 0, 22, 32, 29, 6, 240, 146, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 66, 66, + 66, 66, 66, 66, 81, 81, 0, 6, 48, 48, 20, 0, + 11, 37, 152, 137, 180, 240, 97, 240, 67, 240, 52, 240, + 52, 240, 52, 240, 51, 240, 51, 240, 50, 240, 65, 240, + 65, 240, 66, 240, 49, 240, 50, 240, 50, 129, 130, 145, + 114, 177, 82, 214, 240, 18, 0, 21, 32, 52, 22, 0, + 11, 2, 240, 82, 240, 82, 240, 82, 179, 98, 163, 114, + 162, 130, 146, 146, 131, 146, 115, 162, 99, 178, 83, 194, + 67, 210, 66, 226, 51, 226, 50, 242, 50, 242, 66, 226, + 67, 211, 69, 178, 106, 66, 240, 82, 240, 97, 0, 24, + 48, 47, 22, 0, 13, 98, 240, 82, 240, 82, 240, 82, + 240, 82, 240, 82, 240, 82, 240, 82, 240, 82, 240, 82, + 240, 82, 240, 98, 240, 82, 240, 82, 240, 98, 240, 82, + 240, 98, 194, 99, 163, 115, 116, 155, 215, 0, 25, 96, + 73, 27, 0, 13, 114, 240, 162, 194, 163, 180, 147, 165, + 147, 162, 34, 129, 18, 130, 50, 114, 33, 130, 50, 114, + 33, 130, 65, 114, 33, 114, 82, 98, 34, 82, 98, 97, + 65, 82, 98, 97, 66, 50, 129, 97, 85, 145, 82, 129, + 162, 66, 240, 66, 66, 240, 66, 65, 240, 97, 65, 240, + 97, 65, 240, 97, 65, 240, 98, 50, 240, 82, 0, 34, + 16, 66, 30, 0, 18, 17, 240, 226, 130, 240, 50, 115, + 240, 34, 132, 240, 18, 132, 240, 18, 132, 240, 18, 130, + 18, 242, 130, 18, 227, 130, 18, 226, 146, 34, 210, 146, + 34, 210, 146, 35, 178, 146, 66, 163, 146, 67, 146, 162, + 82, 131, 162, 84, 83, 178, 106, 178, 151, 194, 240, 195, + 240, 179, 240, 194, 0, 33, 64, 65, 24, 0, 12, 68, + 240, 68, 240, 82, 177, 146, 180, 98, 227, 82, 242, 66, + 240, 34, 50, 240, 34, 50, 240, 49, 50, 240, 49, 50, + 240, 49, 49, 240, 65, 50, 240, 49, 50, 240, 49, 50, + 240, 34, 50, 240, 34, 66, 240, 17, 82, 242, 98, 210, + 114, 194, 146, 147, 179, 84, 217, 240, 51, 0, 22, 80, + 41, 13, 240, 240, 166, 98, 37, 65, 98, 65, 114, 49, + 114, 49, 114, 49, 98, 65, 82, 81, 66, 97, 35, 113, + 18, 145, 193, 193, 193, 193, 194, 178, 178, 178, 178, 178, + 178, 178, 0, 14, 48, 58, 22, 0, 9, 34, 240, 67, + 240, 51, 240, 66, 240, 66, 240, 66, 240, 67, 240, 66, + 240, 66, 209, 98, 209, 82, 241, 66, 241, 65, 242, 50, + 242, 50, 242, 50, 226, 66, 145, 66, 66, 129, 66, 82, + 129, 50, 99, 114, 19, 115, 101, 147, 84, 191, 1, 134, + 0, 23, 48, 49, 21, 0, 10, 92, 131, 130, 130, 130, + 146, 115, 146, 99, 162, 98, 178, 82, 194, 66, 210, 66, + 210, 65, 226, 50, 226, 51, 210, 67, 194, 83, 178, 100, + 146, 117, 114, 151, 50, 211, 50, 240, 66, 240, 81, 240, + 82, 0, 25, 112, 44, 18, 0, 10, 51, 197, 181, 165, + 196, 210, 242, 240, 18, 240, 18, 240, 35, 240, 19, 240, + 20, 240, 20, 240, 20, 240, 19, 240, 20, 240, 18, 240, + 34, 240, 18, 242, 113, 115, 114, 68, 151, 195, 0, 17, + 51, 20, 0, 9, 35, 198, 167, 167, 181, 18, 240, 50, + 240, 50, 240, 50, 240, 50, 240, 66, 240, 50, 240, 50, + 240, 50, 240, 66, 240, 50, 240, 50, 240, 66, 240, 50, + 240, 51, 240, 50, 240, 50, 240, 66, 240, 50, 240, 81, + 0, 20, 96, 59, 26, 0, 23, 2, 240, 33, 82, 240, + 49, 82, 240, 49, 82, 240, 50, 66, 240, 50, 50, 240, + 66, 50, 240, 66, 50, 240, 66, 50, 240, 66, 65, 240, + 66, 66, 240, 35, 66, 240, 34, 82, 240, 34, 98, 242, + 114, 226, 146, 195, 162, 163, 179, 115, 250, 240, 53, 0, + 27, 80, 53, 28, 0, 27, 65, 240, 177, 240, 178, 240, + 162, 82, 240, 66, 83, 240, 34, 114, 240, 19, 130, 242, + 146, 226, 178, 195, 178, 194, 210, 162, 226, 162, 242, 130, + 240, 19, 99, 240, 34, 98, 240, 51, 66, 240, 83, 35, + 240, 102, 240, 132, 0, 29, 112, 73, 29, 0, 17, 18, + 240, 209, 240, 210, 240, 194, 240, 210, 240, 194, 240, 194, + 227, 177, 65, 134, 146, 49, 129, 50, 146, 49, 114, 66, + 130, 49, 114, 82, 114, 49, 114, 98, 98, 49, 113, 114, + 98, 50, 82, 130, 82, 50, 82, 146, 66, 50, 82, 146, + 51, 65, 82, 162, 34, 82, 50, 178, 34, 82, 50, 197, + 98, 19, 197, 116, 242, 0, 33, 32, 47, 18, 0, 12, + 114, 50, 178, 50, 162, 82, 146, 83, 114, 114, 99, 130, + 82, 147, 51, 162, 35, 194, 19, 212, 227, 243, 229, 210, + 18, 195, 34, 178, 51, 147, 66, 146, 98, 115, 98, 114, + 130, 98, 240, 17, 0, 17, 80, 49, 21, 0, 12, 66, + 240, 66, 240, 65, 66, 210, 67, 194, 83, 177, 115, 146, + 147, 114, 166, 19, 231, 240, 66, 240, 65, 240, 66, 240, + 66, 240, 65, 240, 66, 240, 66, 240, 65, 240, 66, 240, + 66, 240, 65, 240, 81, 0, 24, 112, 69, 34, 0, 18, + 71, 240, 63, 2, 237, 67, 240, 240, 18, 240, 240, 19, + 240, 243, 240, 240, 18, 240, 240, 19, 240, 243, 240, 240, + 18, 240, 240, 19, 240, 240, 18, 240, 240, 19, 240, 240, + 18, 240, 240, 34, 240, 240, 18, 240, 240, 34, 240, 240, + 34, 240, 240, 34, 240, 19, 211, 167, 244, 43, 240, 60, + 240, 135, 0, 35, 96, 55, 18, 0, 7, 17, 146, 83, + 83, 113, 23, 145, 240, 33, 240, 33, 240, 17, 240, 33, + 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, 17, + 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, + 240, 33, 240, 33, 68, 145, 38, 149, 209, 0, 17, 112, + 48, 17, 0, 10, 81, 240, 18, 240, 18, 240, 17, 240, + 18, 240, 18, 240, 17, 240, 18, 240, 18, 240, 17, 240, + 18, 240, 18, 240, 17, 240, 18, 240, 17, 240, 18, 240, + 18, 240, 17, 240, 33, 240, 17, 240, 33, 0, 19, 64, + 42, 17, 0, 6, 60, 84, 98, 242, 242, 242, 242, 242, + 242, 240, 17, 240, 17, 240, 17, 240, 18, 242, 242, 242, + 242, 240, 17, 240, 17, 240, 17, 240, 18, 242, 242, 242, + 92, 83, 113, 0, 15, 48, 22, 12, 240, 240, 162, 147, + 145, 17, 130, 17, 114, 33, 113, 49, 98, 65, 81, 82, + 178, 0, 34, 112, 8, 14, 0, 45, 75, 0, 14, 48, + 10, 8, 240, 145, 115, 114, 114, 0, 28, 48, 29, 15, + 0, 32, 49, 209, 210, 209, 66, 113, 67, 113, 50, 18, + 82, 49, 34, 81, 50, 49, 81, 49, 66, 68, 98, 66, + 0, 14, 80, 35, 13, 0, 9, 113, 193, 193, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 66, 82, 83, 50, + 98, 65, 98, 65, 98, 66, 66, 82, 51, 102, 131, 0, + 13, 112, 20, 13, 0, 23, 66, 147, 146, 162, 162, 178, + 177, 178, 178, 178, 194, 200, 101, 0, 13, 80, 48, 17, + 0, 7, 97, 240, 18, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 240, 17, 129, 113, 98, 129, 82, 145, 81, + 146, 65, 162, 65, 162, 65, 147, 65, 145, 17, 65, 130, + 17, 66, 83, 34, 72, 50, 85, 0, 16, 16, 27, 18, + 0, 36, 102, 178, 65, 162, 81, 161, 67, 166, 135, 225, + 240, 33, 240, 33, 240, 49, 240, 34, 84, 150, 0, 16, + 64, 41, 18, 0, 16, 42, 114, 145, 98, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 34, 240, 18, 198, 50, 151, + 210, 240, 18, 240, 18, 240, 33, 240, 33, 240, 34, 240, + 18, 240, 18, 0, 21, 80, 32, 15, 0, 26, 98, 194, + 194, 194, 209, 225, 210, 225, 130, 65, 100, 87, 33, 100, + 65, 225, 225, 225, 209, 225, 161, 49, 161, 33, 180, 194, + 240, 96, 44, 20, 0, 27, 65, 240, 65, 240, 66, 240, + 65, 240, 65, 240, 65, 240, 65, 240, 66, 129, 161, 100, + 145, 82, 34, 129, 66, 65, 129, 65, 82, 129, 33, 113, + 129, 33, 113, 132, 129, 130, 146, 0, 20, 48, 21, 6, + 0, 8, 50, 81, 240, 98, 66, 66, 81, 81, 81, 81, + 81, 81, 82, 81, 0, 6, 48, 31, 16, 0, 20, 113, + 225, 225, 241, 241, 0, 7, 114, 242, 242, 227, 226, 242, + 242, 242, 226, 226, 226, 226, 226, 49, 146, 83, 52, 119, + 240, 128, 38, 15, 0, 7, 66, 210, 210, 210, 210, 210, + 210, 210, 113, 82, 83, 82, 67, 98, 51, 114, 34, 146, + 18, 164, 179, 195, 195, 211, 197, 162, 24, 66, 210, 226, + 225, 0, 14, 64, 29, 6, 240, 146, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 67, 66, 66, 66, 81, 0, 6, 48, 33, 17, 0, + 33, 2, 228, 130, 34, 33, 118, 49, 114, 18, 65, 81, + 17, 129, 81, 17, 129, 81, 17, 145, 67, 145, 67, 161, + 66, 242, 242, 0, 16, 80, 26, 14, 0, 30, 50, 113, + 37, 97, 37, 100, 50, 84, 50, 83, 82, 82, 82, 82, + 98, 67, 82, 66, 209, 0, 13, 80, 21, 14, 0, 31, + 115, 162, 178, 178, 97, 82, 113, 65, 130, 50, 114, 51, + 83, 72, 0, 14, 80, 28, 9, 0, 20, 51, 101, 50, + 34, 49, 65, 49, 65, 49, 50, 49, 50, 49, 34, 68, + 81, 129, 129, 129, 129, 129, 129, 240, 32, 40, 18, 0, + 36, 51, 226, 17, 209, 240, 18, 240, 17, 240, 33, 98, + 145, 98, 145, 82, 161, 67, 168, 179, 34, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 19, 66, 163, 19, 197, 240, + 128, 23, 14, 0, 24, 115, 166, 115, 66, 82, 113, 50, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 0, 13, 96, + 20, 11, 0, 21, 34, 116, 83, 114, 146, 163, 163, 147, + 162, 145, 81, 50, 85, 0, 11, 80, 29, 16, 0, 14, + 33, 226, 226, 226, 226, 242, 226, 226, 226, 227, 226, 23, + 57, 117, 226, 242, 226, 226, 226, 242, 226, 241, 0, 15, + 16, 22, 14, 0, 33, 34, 194, 113, 66, 114, 50, 114, + 50, 114, 66, 82, 83, 51, 103, 147, 0, 13, 16, 26, + 12, 0, 23, 65, 162, 162, 162, 161, 66, 66, 82, 50, + 82, 49, 113, 49, 114, 18, 114, 17, 147, 161, 0, 11, + 48, 33, 16, 0, 36, 1, 146, 65, 161, 65, 161, 65, + 97, 50, 49, 68, 34, 49, 66, 17, 33, 65, 65, 34, + 17, 66, 34, 51, 84, 67, 98, 0, 15, 64, 24, 11, + 0, 23, 49, 97, 50, 50, 82, 18, 113, 17, 130, 147, + 129, 17, 114, 18, 97, 50, 161, 0, 11, 64, 26, 15, + 0, 35, 17, 210, 49, 145, 66, 129, 82, 98, 98, 81, + 150, 225, 209, 225, 225, 209, 225, 225, 225, 209, 240, 128, + 21, 17, 0, 34, 102, 132, 49, 99, 98, 241, 242, 241, + 242, 241, 242, 242, 240, 23, 0, 17, 48, 50, 19, 0, + 7, 76, 124, 114, 240, 34, 240, 34, 240, 34, 240, 49, + 240, 34, 244, 227, 240, 18, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, + 240, 49, 240, 49, 240, 49, 240, 59, 0, 19, 48, 30, + 5, 240, 81, 65, 66, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 65, 65, + 65, 65, 240, 240, 128, 47, 18, 0, 6, 122, 240, 19, + 242, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 19, 240, 19, 240, 35, 240, 18, 228, 197, 211, + 242, 240, 18, 240, 18, 240, 18, 240, 18, 113, 85, 122, + 164, 0, 19, 64, 15, 15, 0, 28, 65, 196, 97, 65, + 49, 65, 65, 84, 0, 30, 80, 29, 6, 240, 81, 66, + 66, 81, 240, 129, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 51, 51, 65, 0, 5, 96, + 39, 12, 240, 240, 145, 163, 162, 162, 162, 162, 161, 18, + 129, 17, 132, 114, 18, 98, 34, 98, 34, 97, 65, 97, + 66, 82, 50, 82, 50, 100, 34, 85, 177, 178, 162, 177, + 177, 0, 14, 57, 23, 0, 9, 68, 240, 54, 240, 18, + 81, 226, 97, 225, 240, 113, 240, 113, 240, 113, 240, 129, + 240, 113, 240, 113, 240, 113, 240, 129, 240, 72, 240, 49, + 240, 113, 240, 113, 240, 113, 240, 113, 240, 113, 240, 38, + 240, 19, 36, 244, 50, 240, 115, 240, 121, 0, 20, 64, + 25, 15, 0, 24, 50, 20, 33, 104, 131, 34, 129, 21, + 129, 21, 131, 34, 130, 51, 82, 20, 34, 241, 0, 24, + 96, 61, 23, 0, 10, 54, 54, 162, 240, 82, 130, 178, + 146, 161, 177, 146, 178, 129, 210, 113, 225, 97, 242, 81, + 240, 18, 49, 240, 49, 49, 240, 50, 33, 240, 42, 240, + 17, 17, 240, 81, 17, 240, 42, 240, 49, 240, 113, 240, + 113, 240, 113, 240, 113, 240, 113, 240, 54, 240, 131, 0, + 20, 112, 23, 5, 240, 162, 50, 50, 50, 50, 50, 50, + 50, 50, 240, 130, 50, 50, 50, 50, 50, 50, 50, 0, + 6, 44, 18, 0, 8, 34, 228, 197, 165, 181, 180, 213, + 210, 34, 194, 51, 163, 66, 163, 66, 164, 51, 164, 50, + 165, 34, 180, 33, 213, 243, 240, 19, 240, 18, 240, 18, + 243, 97, 115, 114, 68, 151, 195, 0, 17, 13, 14, 0, + 7, 17, 99, 51, 83, 51, 83, 0, 49, 48, 53, 21, + 0, 14, 35, 240, 18, 33, 226, 240, 50, 240, 49, 240, + 65, 240, 81, 98, 177, 82, 209, 66, 209, 81, 161, 49, + 66, 161, 49, 65, 177, 49, 65, 177, 49, 66, 161, 49, + 86, 65, 65, 241, 65, 226, 81, 194, 99, 146, 140, 183, + 0, 24, 112, 23, 12, 240, 240, 161, 146, 161, 161, 35, + 81, 49, 17, 81, 33, 33, 81, 18, 49, 66, 97, 0, + 36, 48, 39, 20, 0, 23, 66, 82, 162, 82, 147, 67, + 147, 67, 146, 82, 162, 82, 162, 82, 162, 83, 179, 67, + 179, 82, 179, 82, 179, 82, 179, 82, 179, 82, 194, 82, + 193, 97, 0, 25, 48, 21, 17, 0, 23, 101, 156, 243, + 242, 240, 17, 240, 18, 242, 242, 242, 242, 242, 242, 0, + 25, 112, 8, 13, 0, 26, 10, 0, 29, 80, 64, 21, + 0, 11, 113, 240, 36, 242, 240, 50, 240, 49, 240, 65, + 82, 193, 36, 17, 193, 33, 65, 177, 33, 65, 193, 49, + 33, 193, 65, 33, 129, 49, 65, 33, 129, 49, 65, 33, + 129, 49, 65, 50, 97, 49, 65, 68, 49, 49, 65, 161, + 65, 65, 146, 81, 49, 130, 98, 162, 131, 99, 184, 0, + 27, 48, 8, 14, 0, 14, 11, 0, 45, 112, 19, 13, + 240, 240, 209, 177, 162, 177, 81, 82, 97, 66, 98, 65, + 97, 102, 0, 39, 80, 26, 15, 0, 13, 81, 225, 241, + 226, 210, 210, 226, 210, 138, 162, 210, 210, 210, 210, 210, + 210, 0, 6, 76, 0, 15, 48, 23, 14, 240, 240, 212, + 145, 49, 209, 193, 209, 209, 193, 113, 81, 82, 97, 65, + 145, 33, 178, 0, 37, 96, 21, 12, 240, 240, 149, 82, + 65, 65, 97, 161, 161, 194, 193, 177, 177, 113, 18, 145, + 0, 32, 32, 10, 8, 240, 194, 82, 82, 81, 0, 28, + 112, 48, 22, 0, 26, 49, 240, 113, 161, 161, 161, 161, + 161, 162, 130, 162, 130, 163, 115, 147, 100, 147, 98, 17, + 130, 18, 81, 34, 99, 33, 81, 56, 66, 65, 240, 17, + 65, 240, 17, 65, 240, 81, 240, 97, 240, 97, 0, 24, + 80, 65, 25, 0, 9, 125, 159, 6, 240, 240, 97, 81, + 240, 20, 65, 197, 18, 65, 178, 82, 65, 162, 98, 65, + 161, 114, 65, 161, 114, 65, 162, 98, 65, 179, 81, 65, + 215, 65, 240, 65, 65, 240, 65, 81, 240, 49, 65, 240, + 66, 240, 130, 240, 130, 240, 130, 240, 130, 240, 130, 240, + 130, 240, 90, 0, 26, 16, 11, 8, 0, 14, 33, 100, + 53, 52, 0, 17, 64, 13, 6, 0, 16, 81, 81, 82, + 81, 51, 49, 0, 5, 112, 16, 4, 193, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 0, 10, 112, 19, 13, + 240, 240, 209, 178, 161, 177, 81, 82, 97, 66, 113, 65, + 98, 86, 0, 39, 80, 46, 22, 0, 17, 65, 210, 98, + 211, 83, 195, 83, 195, 83, 195, 98, 210, 98, 210, 99, + 194, 99, 194, 98, 194, 83, 179, 68, 162, 83, 178, 83, + 178, 98, 178, 98, 179, 82, 179, 82, 179, 82, 178, 98, + 0, 26, 32, 60, 18, 0, 9, 2, 162, 66, 161, 82, + 146, 82, 130, 98, 129, 114, 114, 114, 98, 130, 97, 161, + 82, 161, 81, 177, 66, 242, 50, 177, 51, 162, 33, 33, + 161, 33, 49, 146, 17, 65, 130, 17, 81, 129, 33, 84, + 66, 55, 97, 145, 98, 145, 240, 33, 240, 33, 240, 33, + 0, 16, 64, 55, 18, 0, 9, 33, 240, 33, 240, 33, + 114, 129, 113, 145, 98, 145, 97, 161, 81, 177, 66, 177, + 65, 193, 49, 209, 34, 209, 33, 240, 17, 240, 33, 20, + 177, 17, 49, 162, 81, 161, 81, 162, 81, 161, 97, 145, + 113, 66, 177, 49, 209, 33, 242, 0, 18, 112, 70, 24, + 0, 9, 22, 240, 33, 81, 129, 225, 114, 209, 114, 210, + 113, 242, 82, 240, 17, 66, 240, 49, 49, 240, 65, 34, + 240, 65, 18, 240, 65, 33, 66, 179, 34, 52, 241, 50, + 18, 226, 34, 34, 210, 34, 50, 209, 33, 82, 194, 17, + 98, 49, 129, 33, 101, 130, 57, 146, 161, 177, 177, 177, + 177, 240, 145, 240, 129, 0, 24, 112, 32, 15, 0, 8, + 34, 210, 0, 16, 50, 195, 178, 194, 129, 66, 129, 65, + 145, 50, 145, 50, 145, 65, 145, 66, 114, 67, 67, 104, + 148, 0, 15, 112, 48, 15, 0, 6, 18, 241, 241, 194, + 210, 196, 177, 33, 177, 33, 162, 34, 146, 34, 145, 65, + 145, 65, 130, 66, 114, 66, 113, 82, 113, 97, 107, 66, + 98, 81, 114, 81, 129, 66, 129, 66, 129, 66, 129, 65, + 145, 0, 15, 64, 52, 16, 0, 6, 98, 210, 209, 240, + 18, 227, 209, 17, 194, 17, 193, 34, 177, 34, 162, 49, + 162, 49, 161, 66, 130, 66, 130, 81, 130, 81, 129, 98, + 113, 98, 108, 66, 113, 98, 113, 97, 129, 82, 130, 66, + 130, 66, 145, 65, 161, 0, 14, 64, 49, 15, 0, 6, + 34, 196, 177, 33, 240, 194, 195, 193, 18, 177, 33, 162, + 33, 161, 50, 145, 50, 130, 50, 130, 65, 129, 81, 129, + 82, 113, 82, 107, 66, 97, 97, 113, 97, 114, 66, 114, + 66, 129, 65, 145, 65, 145, 0, 15, 64, 49, 14, 0, + 7, 35, 81, 65, 34, 49, 148, 240, 130, 195, 177, 17, + 162, 17, 161, 34, 145, 34, 130, 49, 130, 49, 129, 66, + 113, 66, 113, 81, 106, 65, 97, 97, 97, 97, 98, 66, + 113, 66, 113, 65, 129, 65, 129, 0, 14, 64, 52, 15, + 0, 6, 1, 50, 145, 50, 240, 178, 210, 193, 17, 193, + 18, 162, 33, 162, 33, 161, 50, 145, 50, 130, 65, 130, + 65, 129, 82, 113, 82, 113, 82, 107, 66, 97, 97, 113, + 97, 114, 66, 114, 66, 129, 65, 145, 65, 145, 225, 0, + 13, 80, 48, 14, 0, 5, 114, 180, 164, 164, 163, 240, + 162, 195, 177, 17, 162, 17, 162, 33, 145, 49, 130, 49, + 130, 49, 130, 50, 113, 81, 98, 81, 106, 66, 81, 98, + 81, 97, 113, 66, 113, 66, 113, 66, 113, 65, 129, 0, + 12, 96, 60, 25, 0, 13, 98, 240, 130, 240, 125, 178, + 18, 240, 81, 34, 240, 66, 34, 240, 65, 50, 240, 50, + 50, 240, 49, 66, 240, 34, 66, 240, 34, 66, 240, 18, + 91, 114, 82, 242, 68, 250, 241, 114, 226, 114, 225, 130, + 210, 130, 210, 130, 194, 146, 194, 153, 81, 170, 240, 20, + 0, 23, 42, 17, 0, 9, 50, 211, 210, 226, 226, 241, + 242, 241, 240, 17, 241, 240, 17, 240, 17, 240, 17, 240, + 17, 240, 18, 240, 17, 240, 18, 101, 103, 225, 240, 17, + 240, 17, 240, 33, 242, 226, 0, 16, 39, 16, 0, 6, + 81, 240, 18, 242, 240, 177, 241, 241, 24, 97, 241, 226, + 226, 225, 226, 226, 99, 82, 51, 114, 50, 146, 226, 226, + 129, 82, 145, 66, 130, 67, 83, 105, 134, 0, 17, 43, + 17, 0, 7, 97, 241, 226, 240, 240, 225, 240, 17, 25, + 97, 22, 145, 240, 17, 242, 242, 241, 242, 130, 82, 84, + 98, 52, 114, 50, 162, 242, 242, 242, 145, 82, 130, 83, + 84, 105, 151, 0, 15, 112, 39, 16, 0, 8, 113, 227, + 209, 17, 240, 240, 177, 242, 23, 98, 24, 82, 226, 225, + 241, 226, 225, 115, 81, 69, 97, 51, 130, 225, 241, 241, + 145, 82, 129, 82, 99, 105, 134, 0, 15, 44, 17, 0, + 9, 2, 50, 242, 240, 177, 240, 17, 240, 17, 25, 97, + 240, 17, 242, 242, 241, 242, 242, 130, 82, 84, 97, 51, + 146, 65, 162, 242, 242, 145, 82, 145, 82, 131, 82, 99, + 106, 135, 0, 15, 112, 30, 7, 240, 97, 114, 113, 240, + 50, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 97, 98, 82, 97, 0, 6, 64, 30, + 8, 240, 193, 82, 82, 240, 146, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 113, 113, 114, + 98, 113, 0, 7, 48, 30, 7, 240, 114, 82, 65, 33, + 193, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 97, 97, 97, 98, 97, 0, 7, 48, 30, + 9, 240, 240, 242, 49, 240, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 130, 114, 129, 129, + 130, 129, 0, 8, 48, 55, 25, 0, 16, 82, 240, 118, + 240, 81, 37, 240, 33, 84, 241, 116, 209, 147, 193, 177, + 193, 178, 177, 178, 177, 178, 57, 178, 177, 178, 177, 177, + 193, 177, 193, 162, 178, 161, 194, 146, 194, 145, 210, 17, + 98, 210, 33, 66, 225, 65, 34, 240, 84, 0, 26, 16, + 68, 26, 0, 14, 3, 113, 225, 34, 81, 241, 50, 49, + 240, 100, 240, 240, 33, 113, 240, 18, 114, 242, 115, 226, + 115, 226, 113, 17, 226, 113, 18, 209, 114, 18, 194, 114, + 18, 194, 114, 34, 178, 114, 34, 162, 130, 50, 146, 130, + 50, 130, 145, 82, 99, 130, 84, 51, 146, 104, 162, 161, + 194, 240, 131, 240, 130, 0, 25, 96, 57, 21, 0, 6, + 17, 240, 98, 240, 82, 0, 7, 17, 240, 52, 240, 18, + 240, 65, 163, 98, 194, 66, 210, 66, 226, 50, 226, 49, + 242, 49, 240, 17, 49, 240, 17, 49, 240, 17, 49, 242, + 50, 225, 81, 225, 82, 193, 98, 178, 114, 146, 146, 99, + 184, 243, 0, 19, 112, 58, 21, 0, 9, 34, 240, 49, + 240, 65, 240, 240, 113, 240, 52, 240, 18, 240, 65, 163, + 98, 194, 66, 210, 66, 226, 50, 226, 49, 240, 17, 49, + 240, 17, 49, 240, 17, 49, 240, 17, 49, 242, 50, 225, + 81, 225, 82, 193, 98, 178, 114, 146, 146, 99, 184, 244, + 0, 19, 96, 59, 21, 0, 9, 1, 240, 67, 240, 34, + 17, 240, 240, 98, 240, 36, 240, 18, 240, 65, 163, 98, + 194, 81, 210, 66, 226, 50, 226, 49, 240, 17, 49, 240, + 17, 49, 240, 17, 49, 240, 17, 50, 226, 50, 225, 81, + 225, 82, 194, 82, 178, 114, 146, 146, 99, 184, 244, 0, + 19, 96, 58, 21, 0, 11, 20, 81, 177, 49, 49, 240, + 35, 209, 240, 52, 240, 18, 240, 65, 163, 98, 194, 81, + 210, 66, 226, 50, 226, 49, 240, 17, 49, 240, 17, 49, + 240, 17, 49, 240, 17, 49, 242, 50, 225, 81, 225, 82, + 194, 82, 178, 114, 146, 146, 99, 184, 244, 0, 19, 96, + 57, 21, 0, 10, 114, 146, 130, 146, 240, 66, 161, 240, + 52, 240, 18, 240, 65, 163, 98, 194, 81, 210, 66, 226, + 50, 226, 49, 240, 17, 49, 240, 17, 49, 240, 17, 49, + 240, 17, 49, 242, 50, 225, 81, 225, 82, 194, 82, 178, + 114, 146, 146, 99, 184, 244, 0, 19, 96, 32, 14, 0, + 15, 97, 129, 66, 113, 82, 81, 99, 50, 114, 49, 146, + 18, 163, 179, 179, 162, 18, 130, 50, 114, 65, 98, 82, + 209, 225, 0, 19, 80, 67, 23, 0, 12, 19, 98, 164, + 113, 178, 131, 146, 130, 19, 98, 145, 66, 82, 130, 66, + 66, 130, 98, 50, 129, 114, 50, 114, 129, 50, 113, 145, + 50, 97, 161, 50, 82, 161, 50, 81, 177, 50, 66, 177, + 50, 50, 178, 65, 49, 194, 66, 18, 178, 82, 17, 194, + 98, 194, 130, 147, 132, 115, 201, 240, 21, 0, 24, 48, + 63, 24, 0, 10, 1, 240, 145, 240, 146, 240, 129, 0, + 7, 97, 240, 114, 240, 17, 82, 240, 17, 82, 240, 18, + 50, 240, 34, 50, 240, 34, 50, 240, 34, 50, 240, 34, + 50, 240, 34, 50, 240, 34, 65, 240, 18, 82, 242, 97, + 241, 114, 210, 114, 194, 146, 162, 179, 99, 217, 240, 37, + 0, 22, 64, 61, 24, 0, 13, 49, 240, 98, 240, 98, + 0, 8, 1, 240, 17, 82, 240, 17, 82, 240, 17, 81, + 240, 34, 50, 240, 34, 50, 240, 34, 50, 240, 34, 50, + 240, 34, 50, 240, 34, 65, 240, 34, 66, 242, 82, 242, + 97, 226, 114, 195, 130, 163, 147, 131, 179, 84, 232, 240, + 65, 0, 22, 96, 64, 24, 0, 13, 18, 240, 98, 17, + 240, 81, 34, 0, 7, 81, 240, 17, 82, 240, 17, 82, + 240, 17, 82, 240, 18, 50, 240, 34, 50, 240, 34, 50, + 240, 34, 50, 240, 34, 50, 240, 34, 65, 240, 34, 65, + 240, 18, 82, 242, 97, 226, 114, 210, 130, 178, 146, 147, + 179, 84, 217, 240, 51, 0, 22, 80, 64, 24, 0, 9, + 81, 114, 211, 98, 226, 98, 0, 7, 34, 240, 17, 81, + 240, 33, 66, 240, 33, 66, 240, 34, 50, 240, 34, 50, + 240, 34, 49, 240, 50, 49, 240, 50, 49, 240, 50, 50, + 240, 34, 50, 240, 19, 50, 240, 18, 82, 242, 82, 226, + 114, 194, 130, 179, 147, 115, 196, 37, 247, 0, 25, 48, + 55, 20, 0, 8, 97, 240, 49, 240, 34, 0, 5, 98, + 240, 34, 66, 194, 67, 178, 83, 146, 115, 130, 132, 97, + 181, 19, 227, 18, 240, 50, 240, 34, 240, 50, 240, 49, + 240, 50, 240, 50, 240, 49, 240, 65, 240, 50, 240, 50, + 240, 49, 240, 81, 0, 18, 80, 36, 14, 0, 8, 107, + 240, 49, 209, 209, 209, 216, 97, 49, 19, 81, 114, 65, + 114, 65, 114, 65, 98, 81, 21, 113, 209, 209, 209, 209, + 209, 209, 209, 217, 0, 14, 64, 53, 17, 0, 6, 60, + 81, 177, 66, 162, 65, 162, 65, 147, 65, 131, 81, 100, + 97, 69, 113, 52, 145, 50, 177, 50, 177, 67, 145, 100, + 97, 130, 97, 146, 81, 161, 66, 161, 66, 161, 66, 161, + 66, 146, 66, 33, 98, 65, 49, 82, 151, 165, 0, 18, + 34, 16, 0, 22, 66, 240, 18, 242, 0, 7, 65, 225, + 225, 225, 226, 51, 129, 50, 17, 129, 49, 34, 97, 50, + 49, 97, 49, 65, 100, 99, 52, 0, 15, 64, 32, 13, + 0, 21, 114, 161, 177, 240, 240, 129, 177, 177, 178, 50, + 97, 49, 17, 97, 34, 18, 65, 49, 49, 65, 33, 65, + 68, 81, 65, 0, 12, 96, 33, 13, 0, 20, 17, 179, + 161, 18, 0, 6, 1, 177, 177, 178, 50, 97, 49, 17, + 97, 34, 18, 65, 49, 49, 65, 33, 65, 68, 81, 65, + 0, 12, 96, 39, 14, 0, 21, 33, 113, 65, 18, 65, + 65, 50, 33, 81, 67, 240, 240, 129, 193, 193, 194, 50, + 113, 49, 17, 113, 34, 18, 81, 49, 49, 81, 33, 65, + 84, 81, 81, 0, 13, 96, 32, 13, 0, 23, 17, 50, + 177, 240, 240, 81, 177, 177, 178, 50, 97, 49, 17, 97, + 34, 18, 65, 49, 49, 65, 33, 65, 68, 81, 65, 0, + 12, 96, 32, 15, 0, 21, 19, 196, 180, 179, 240, 240, + 209, 194, 209, 209, 225, 50, 129, 49, 33, 113, 49, 33, + 97, 49, 49, 113, 18, 67, 67, 0, 16, 48, 40, 23, + 0, 47, 54, 240, 18, 65, 177, 65, 66, 146, 81, 19, + 162, 38, 209, 97, 225, 51, 17, 225, 49, 17, 17, 209, + 49, 34, 17, 193, 49, 49, 41, 49, 33, 67, 195, 0, + 22, 80, 23, 11, 0, 22, 82, 114, 130, 130, 145, 161, + 146, 161, 162, 166, 98, 161, 161, 177, 146, 130, 240, 240, + 144, 29, 16, 0, 24, 97, 240, 18, 240, 17, 0, 7, + 54, 146, 65, 145, 51, 129, 35, 118, 209, 241, 241, 240, + 17, 240, 24, 0, 14, 48, 34, 18, 0, 23, 81, 242, + 241, 0, 9, 4, 210, 34, 177, 81, 162, 51, 161, 20, + 135, 241, 240, 33, 240, 33, 240, 33, 240, 34, 83, 166, + 33, 0, 16, 16, 37, 19, 0, 24, 97, 240, 35, 242, + 17, 241, 0, 7, 21, 211, 34, 178, 66, 177, 66, 178, + 19, 151, 240, 17, 240, 49, 240, 49, 240, 49, 240, 66, + 68, 166, 49, 0, 17, 32, 18, 0, 27, 81, 240, 18, + 50, 0, 8, 53, 193, 81, 177, 51, 161, 35, 135, 241, + 240, 33, 240, 33, 240, 33, 240, 34, 84, 149, 0, 16, + 80, 23, 8, 0, 10, 1, 130, 114, 129, 240, 82, 98, + 98, 113, 113, 113, 113, 113, 113, 114, 113, 0, 8, 64, + 23, 8, 0, 10, 50, 82, 66, 240, 240, 33, 98, 98, + 113, 113, 113, 113, 113, 113, 114, 113, 0, 8, 64, 23, + 7, 0, 10, 82, 68, 49, 33, 240, 49, 82, 97, 97, + 97, 97, 97, 97, 97, 113, 97, 0, 6, 80, 23, 10, + 0, 17, 1, 50, 50, 65, 240, 97, 130, 145, 145, 145, + 145, 145, 145, 145, 161, 145, 0, 9, 48, 25, 14, 0, + 26, 70, 148, 240, 240, 162, 226, 210, 97, 98, 65, 114, + 50, 129, 50, 114, 67, 67, 87, 0, 12, 112, 35, 14, + 0, 21, 33, 113, 52, 81, 65, 49, 49, 163, 240, 240, + 145, 129, 36, 113, 22, 100, 49, 115, 50, 98, 81, 98, + 82, 82, 97, 82, 113, 81, 0, 13, 80, 27, 14, 0, + 23, 33, 210, 225, 225, 240, 240, 130, 163, 162, 193, 97, + 82, 113, 65, 130, 50, 114, 66, 82, 103, 0, 12, 112, + 26, 14, 0, 21, 113, 178, 178, 0, 6, 98, 163, 162, + 193, 97, 82, 113, 65, 130, 50, 114, 66, 83, 87, 0, + 14, 80, 28, 14, 0, 21, 66, 193, 17, 161, 34, 0, + 6, 66, 163, 162, 193, 97, 82, 113, 65, 130, 50, 114, + 66, 83, 87, 0, 14, 80, 32, 14, 0, 22, 115, 97, + 49, 34, 65, 65, 51, 17, 178, 240, 240, 130, 163, 162, + 193, 97, 82, 113, 66, 114, 50, 114, 66, 82, 103, 0, + 12, 112, 28, 15, 0, 24, 98, 50, 210, 240, 240, 161, + 210, 194, 194, 194, 97, 82, 129, 66, 130, 50, 130, 66, + 99, 74, 131, 0, 14, 16, 16, 16, 0, 22, 97, 242, + 0, 7, 13, 0, 7, 17, 226, 0, 27, 16, 33, 14, + 0, 25, 65, 194, 193, 194, 148, 146, 18, 130, 33, 130, + 34, 33, 81, 49, 65, 65, 34, 66, 49, 33, 82, 50, + 17, 67, 72, 113, 0, 13, 80, 28, 13, 0, 21, 50, + 194, 209, 240, 240, 49, 194, 177, 129, 49, 129, 49, 129, + 50, 98, 50, 98, 66, 51, 102, 147, 0, 12, 16, 27, + 13, 0, 21, 114, 162, 161, 0, 5, 114, 177, 129, 49, + 129, 50, 113, 50, 98, 50, 98, 66, 51, 102, 147, 0, + 12, 16, 29, 13, 0, 21, 82, 163, 161, 33, 240, 240, + 33, 194, 177, 129, 49, 129, 49, 129, 50, 98, 50, 98, + 66, 51, 102, 147, 0, 12, 16, 28, 15, 0, 26, 66, + 65, 225, 240, 240, 98, 210, 129, 66, 130, 50, 130, 50, + 130, 50, 115, 66, 83, 83, 52, 104, 148, 0, 14, 28, + 14, 0, 27, 1, 178, 177, 0, 6, 1, 194, 50, 113, + 81, 113, 98, 66, 133, 209, 209, 193, 209, 209, 193, 209, + 209, 209, 112, 34, 12, 0, 10, 72, 240, 33, 177, 177, + 177, 177, 21, 81, 82, 65, 97, 65, 97, 65, 97, 65, + 82, 65, 20, 97, 177, 177, 177, 177, 177, 177, 183, 0, + 11, 30, 14, 0, 26, 66, 34, 209, 240, 240, 225, 194, + 49, 129, 81, 113, 82, 97, 114, 49, 164, 209, 193, 209, + 209, 194, 193, 209, 209, 240, 96, +}; + +//***************************************************************************** +// +// The glyph offset table for the 30 point Handwriting font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetHandwriting30[] = +{ + 0, 5, 33, 52, 106, 170, 229, 291, + 303, 337, 367, 383, 409, 422, 430, 440, + 483, 551, 580, 636, 687, 745, 786, 830, + 860, 910, 968, 982, 1000, 1032, 1043, 1070, + 1102, 1186, 1239, 1285, 1334, 1390, 1439, 1490, + 1543, 1600, 1629, 1677, 1729, 1776, 1849, 1915, + 1980, 2021, 2079, 2128, 2172, 2223, 2282, 2335, + 2408, 2455, 2504, 2573, 2628, 2676, 2718, 2740, + 2748, 2758, 2787, 2822, 2842, 2890, 2917, 2958, + 2990, 3034, 3055, 3086, 3124, 3153, 3186, 3212, + 3233, 3261, 3301, 3324, 3344, 3373, 3395, 3421, + 3454, 3478, 3504, 3525, 3575, 3605, 3652, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3667, 3696, 3735, 3792, 3817, 3878, 3901, + 3945, 3958, 4011, 4034, 4073, 4094, 4102, 4166, + 4174, 4193, 4219, 4242, 4263, 4273, 4321, 4386, + 4397, 4410, 4426, 4445, 4491, 4551, 4606, 4676, + 4708, 4756, 4808, 4857, 4906, 4958, 5006, 5066, + 5108, 5147, 5190, 5229, 5273, 5303, 5333, 5363, + 5393, 5448, 5516, 5573, 5631, 5690, 5748, 5805, + 5837, 5904, 5967, 6028, 6092, 6156, 6211, 6247, + 6300, 6334, 6366, 6399, 6438, 6470, 6502, 6542, + 6565, 6594, 6628, 6665, 6697, 6720, 6743, 6766, + 6789, 6814, 6849, 6876, 6902, 6930, 6962, 6990, + 7006, 7039, 7067, 7094, 7123, 7151, 7179, 7213, +}; + +//***************************************************************************** +// +// The font definition for the 30 point Handwriting font. +// +//***************************************************************************** +const tFontEx g_sFontExHandwriting30 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 30, + + // + // The height of the font. + // + 35, + + // + // The baseline of the font. + // + 28, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetHandwriting30, + + // + // A pointer to the actual font data + // + g_pui8Handwriting30Data +}; diff --git a/third_party/fonts/ofl/fonts/fonthangulgothic16pt.c b/third_party/fonts/ofl/fonts/fonthangulgothic16pt.c new file mode 100644 index 0000000..4cbb198 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulgothic16pt.c @@ -0,0 +1,732 @@ +//***************************************************************************** +// +// fonthangulgothic16pt.c - Font definition for the 16ptpt Hangulgothic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulgothic +// Size: 16pt +// Bold: no +// Italic: no +// Memory usage: 4933 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulgothic16pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 15, + + // + // The height of the font. + // + 16, + + // + // The baseline of the font. + // + 13, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x34, 0x09, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8d, 0x01, 0x00, 0x00, // Offset 397 (0x18d) + 0x98, 0x01, 0x00, 0x00, // Offset 408 (0x198) + 0xb3, 0x01, 0x00, 0x00, // Offset 435 (0x1b3) + 0xcd, 0x01, 0x00, 0x00, // Offset 461 (0x1cd) + 0xf5, 0x01, 0x00, 0x00, // Offset 501 (0x1f5) + 0x13, 0x02, 0x00, 0x00, // Offset 531 (0x213) + 0x1a, 0x02, 0x00, 0x00, // Offset 538 (0x21a) + 0x2a, 0x02, 0x00, 0x00, // Offset 554 (0x22a) + 0x3b, 0x02, 0x00, 0x00, // Offset 571 (0x23b) + 0x4a, 0x02, 0x00, 0x00, // Offset 586 (0x24a) + 0x59, 0x02, 0x00, 0x00, // Offset 601 (0x259) + 0x60, 0x02, 0x00, 0x00, // Offset 608 (0x260) + 0x68, 0x02, 0x00, 0x00, // Offset 616 (0x268) + 0x6d, 0x02, 0x00, 0x00, // Offset 621 (0x26d) + 0x7e, 0x02, 0x00, 0x00, // Offset 638 (0x27e) + 0x99, 0x02, 0x00, 0x00, // Offset 665 (0x299) + 0xa9, 0x02, 0x00, 0x00, // Offset 681 (0x2a9) + 0xbb, 0x02, 0x00, 0x00, // Offset 699 (0x2bb) + 0xcc, 0x02, 0x00, 0x00, // Offset 716 (0x2cc) + 0xe3, 0x02, 0x00, 0x00, // Offset 739 (0x2e3) + 0xf4, 0x02, 0x00, 0x00, // Offset 756 (0x2f4) + 0x0c, 0x03, 0x00, 0x00, // Offset 780 (0x30c) + 0x1d, 0x03, 0x00, 0x00, // Offset 797 (0x31d) + 0x37, 0x03, 0x00, 0x00, // Offset 823 (0x337) + 0x4f, 0x03, 0x00, 0x00, // Offset 847 (0x34f) + 0x57, 0x03, 0x00, 0x00, // Offset 855 (0x357) + 0x60, 0x03, 0x00, 0x00, // Offset 864 (0x360) + 0x71, 0x03, 0x00, 0x00, // Offset 881 (0x371) + 0x7b, 0x03, 0x00, 0x00, // Offset 891 (0x37b) + 0x8c, 0x03, 0x00, 0x00, // Offset 908 (0x38c) + 0x9b, 0x03, 0x00, 0x00, // Offset 923 (0x39b) + 0xc3, 0x03, 0x00, 0x00, // Offset 963 (0x3c3) + 0xdd, 0x03, 0x00, 0x00, // Offset 989 (0x3dd) + 0xf7, 0x03, 0x00, 0x00, // Offset 1015 (0x3f7) + 0x08, 0x04, 0x00, 0x00, // Offset 1032 (0x408) + 0x23, 0x04, 0x00, 0x00, // Offset 1059 (0x423) + 0x32, 0x04, 0x00, 0x00, // Offset 1074 (0x432) + 0x42, 0x04, 0x00, 0x00, // Offset 1090 (0x442) + 0x58, 0x04, 0x00, 0x00, // Offset 1112 (0x458) + 0x74, 0x04, 0x00, 0x00, // Offset 1140 (0x474) + 0x83, 0x04, 0x00, 0x00, // Offset 1155 (0x483) + 0x92, 0x04, 0x00, 0x00, // Offset 1170 (0x492) + 0xaf, 0x04, 0x00, 0x00, // Offset 1199 (0x4af) + 0xbe, 0x04, 0x00, 0x00, // Offset 1214 (0x4be) + 0xec, 0x04, 0x00, 0x00, // Offset 1260 (0x4ec) + 0x11, 0x05, 0x00, 0x00, // Offset 1297 (0x511) + 0x2c, 0x05, 0x00, 0x00, // Offset 1324 (0x52c) + 0x42, 0x05, 0x00, 0x00, // Offset 1346 (0x542) + 0x5e, 0x05, 0x00, 0x00, // Offset 1374 (0x55e) + 0x79, 0x05, 0x00, 0x00, // Offset 1401 (0x579) + 0x8a, 0x05, 0x00, 0x00, // Offset 1418 (0x58a) + 0x9b, 0x05, 0x00, 0x00, // Offset 1435 (0x59b) + 0xb7, 0x05, 0x00, 0x00, // Offset 1463 (0x5b7) + 0xd2, 0x05, 0x00, 0x00, // Offset 1490 (0x5d2) + 0x03, 0x06, 0x00, 0x00, // Offset 1539 (0x603) + 0x1e, 0x06, 0x00, 0x00, // Offset 1566 (0x61e) + 0x35, 0x06, 0x00, 0x00, // Offset 1589 (0x635) + 0x46, 0x06, 0x00, 0x00, // Offset 1606 (0x646) + 0x57, 0x06, 0x00, 0x00, // Offset 1623 (0x657) + 0x80, 0x06, 0x00, 0x00, // Offset 1664 (0x680) + 0x91, 0x06, 0x00, 0x00, // Offset 1681 (0x691) + 0xa3, 0x06, 0x00, 0x00, // Offset 1699 (0x6a3) + 0xa8, 0x06, 0x00, 0x00, // Offset 1704 (0x6a8) + 0xb0, 0x06, 0x00, 0x00, // Offset 1712 (0x6b0) + 0xc5, 0x06, 0x00, 0x00, // Offset 1733 (0x6c5) + 0xdf, 0x06, 0x00, 0x00, // Offset 1759 (0x6df) + 0xed, 0x06, 0x00, 0x00, // Offset 1773 (0x6ed) + 0x07, 0x07, 0x00, 0x00, // Offset 1799 (0x707) + 0x19, 0x07, 0x00, 0x00, // Offset 1817 (0x719) + 0x29, 0x07, 0x00, 0x00, // Offset 1833 (0x729) + 0x42, 0x07, 0x00, 0x00, // Offset 1858 (0x742) + 0x5c, 0x07, 0x00, 0x00, // Offset 1884 (0x75c) + 0x69, 0x07, 0x00, 0x00, // Offset 1897 (0x769) + 0x78, 0x07, 0x00, 0x00, // Offset 1912 (0x778) + 0x90, 0x07, 0x00, 0x00, // Offset 1936 (0x790) + 0xa0, 0x07, 0x00, 0x00, // Offset 1952 (0x7a0) + 0xc1, 0x07, 0x00, 0x00, // Offset 1985 (0x7c1) + 0xd9, 0x07, 0x00, 0x00, // Offset 2009 (0x7d9) + 0xef, 0x07, 0x00, 0x00, // Offset 2031 (0x7ef) + 0x08, 0x08, 0x00, 0x00, // Offset 2056 (0x808) + 0x20, 0x08, 0x00, 0x00, // Offset 2080 (0x820) + 0x2e, 0x08, 0x00, 0x00, // Offset 2094 (0x82e) + 0x3c, 0x08, 0x00, 0x00, // Offset 2108 (0x83c) + 0x4b, 0x08, 0x00, 0x00, // Offset 2123 (0x84b) + 0x63, 0x08, 0x00, 0x00, // Offset 2147 (0x863) + 0x79, 0x08, 0x00, 0x00, // Offset 2169 (0x879) + 0x9e, 0x08, 0x00, 0x00, // Offset 2206 (0x89e) + 0xb2, 0x08, 0x00, 0x00, // Offset 2226 (0x8b2) + 0xc7, 0x08, 0x00, 0x00, // Offset 2247 (0x8c7) + 0xd5, 0x08, 0x00, 0x00, // Offset 2261 (0x8d5) + 0xe6, 0x08, 0x00, 0x00, // Offset 2278 (0x8e6) + 0xf7, 0x08, 0x00, 0x00, // Offset 2295 (0x8f7) + 0x09, 0x09, 0x00, 0x00, // Offset 2313 (0x909) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 4, 6, 0, 12, 13, 2, 65, 17, 17, 17, 17, 17, + 17, 17, 17, 81, 80, 11, 4, 129, 17, 17, 17, 17, + 17, 240, 240, 240, 27, 9, 240, 97, 33, 65, 49, 65, + 49, 65, 33, 56, 49, 33, 81, 33, 56, 33, 49, 65, + 49, 65, 33, 81, 33, 240, 112, 26, 8, 177, 100, 34, + 17, 65, 33, 65, 33, 81, 17, 98, 115, 81, 18, 65, + 33, 65, 33, 17, 33, 17, 37, 97, 192, 40, 14, 240, + 129, 83, 81, 65, 49, 49, 81, 49, 49, 81, 49, 33, + 97, 49, 33, 115, 33, 35, 129, 18, 18, 97, 33, 49, + 97, 33, 49, 81, 49, 49, 66, 49, 34, 65, 83, 240, + 240, 30, 11, 240, 148, 98, 49, 81, 65, 81, 65, 82, + 34, 99, 116, 65, 18, 34, 49, 17, 66, 17, 33, 83, + 34, 65, 17, 68, 49, 240, 128, 7, 2, 65, 17, 17, + 240, 128, 16, 4, 161, 33, 49, 33, 49, 49, 49, 49, + 49, 49, 65, 49, 65, 49, 17, 4, 129, 65, 49, 65, + 49, 49, 49, 49, 49, 49, 33, 49, 33, 49, 48, 15, + 8, 240, 240, 209, 113, 71, 65, 97, 17, 65, 49, 240, + 240, 192, 15, 10, 240, 240, 225, 145, 145, 89, 81, 145, + 145, 145, 240, 240, 240, 7, 3, 240, 240, 161, 33, 18, + 8, 5, 240, 240, 84, 240, 240, 176, 5, 2, 240, 177, + 80, 17, 7, 240, 65, 82, 81, 97, 81, 97, 97, 81, + 97, 82, 81, 97, 82, 192, 27, 9, 240, 84, 65, 65, + 49, 65, 33, 97, 17, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 33, 66, 33, 65, 68, 240, 96, 16, 4, 146, + 19, 17, 17, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 144, 18, 8, 240, 37, 49, 50, 113, 113, 113, 97, 98, + 82, 97, 97, 97, 103, 240, 32, 17, 8, 240, 37, 114, + 113, 113, 97, 67, 129, 129, 113, 113, 97, 37, 240, 64, + 23, 10, 240, 162, 130, 113, 17, 97, 33, 97, 33, 81, + 49, 65, 65, 65, 65, 57, 113, 145, 145, 240, 128, 17, + 8, 240, 22, 33, 113, 113, 113, 117, 129, 129, 113, 113, + 97, 37, 240, 64, 24, 9, 240, 101, 49, 113, 113, 129, + 20, 50, 65, 33, 97, 17, 97, 17, 97, 17, 97, 33, + 65, 68, 240, 96, 17, 8, 240, 23, 113, 113, 97, 113, + 98, 97, 98, 97, 113, 97, 113, 240, 96, 26, 9, 240, + 84, 50, 66, 17, 97, 17, 97, 33, 65, 68, 66, 34, + 34, 66, 17, 97, 17, 97, 33, 66, 52, 240, 96, 24, + 9, 240, 84, 65, 65, 33, 97, 17, 97, 17, 97, 17, + 97, 33, 66, 52, 17, 129, 113, 114, 52, 240, 112, 8, + 3, 146, 18, 240, 18, 18, 208, 9, 4, 210, 34, 240, + 177, 34, 33, 176, 17, 8, 240, 113, 97, 97, 97, 97, + 97, 97, 129, 129, 129, 129, 129, 129, 144, 10, 10, 0, + 7, 73, 240, 105, 0, 7, 80, 17, 8, 240, 17, 129, + 129, 129, 129, 129, 129, 97, 97, 97, 97, 97, 97, 240, + 15, 7, 229, 98, 97, 97, 97, 81, 81, 82, 81, 97, + 209, 240, 48, 40, 13, 240, 230, 98, 66, 65, 129, 34, + 51, 17, 17, 17, 49, 49, 33, 17, 34, 49, 33, 17, + 33, 65, 33, 17, 33, 49, 33, 34, 17, 34, 33, 49, + 34, 19, 82, 82, 101, 240, 240, 26, 11, 240, 178, 146, + 129, 18, 113, 33, 98, 33, 97, 65, 81, 65, 65, 82, + 56, 34, 97, 33, 114, 17, 129, 240, 128, 26, 8, 240, + 22, 33, 66, 17, 81, 17, 81, 17, 66, 21, 49, 65, + 33, 81, 17, 81, 17, 81, 17, 65, 37, 240, 64, 17, + 9, 240, 101, 50, 97, 114, 113, 129, 129, 129, 129, 145, + 145, 149, 240, 64, 27, 10, 240, 86, 65, 66, 49, 97, + 33, 113, 17, 113, 17, 113, 17, 113, 17, 113, 17, 98, + 17, 97, 33, 66, 53, 240, 160, 15, 7, 230, 17, 97, + 97, 97, 102, 17, 97, 97, 97, 97, 102, 240, 16, 7, + 230, 17, 97, 97, 97, 97, 102, 17, 97, 97, 97, 97, + 240, 80, 22, 11, 240, 166, 66, 129, 146, 145, 161, 161, + 84, 17, 129, 18, 113, 33, 113, 50, 81, 86, 240, 128, + 28, 9, 240, 49, 97, 17, 97, 17, 97, 17, 97, 17, + 97, 17, 97, 24, 17, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 240, 64, 15, 2, 65, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 80, 15, 5, 209, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 50, 19, 192, 29, 9, + 240, 49, 81, 33, 65, 49, 50, 49, 34, 65, 33, 81, + 18, 82, 17, 81, 49, 65, 50, 49, 65, 49, 81, 33, + 82, 240, 64, 15, 7, 225, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 102, 240, 46, 13, 240, 178, 130, 18, + 130, 17, 17, 97, 17, 17, 17, 97, 17, 17, 18, 66, + 17, 17, 33, 65, 33, 17, 33, 65, 33, 17, 49, 33, + 49, 17, 49, 33, 49, 17, 52, 49, 17, 66, 65, 17, + 66, 65, 240, 192, 37, 10, 240, 82, 97, 18, 97, 17, + 17, 81, 17, 18, 65, 17, 33, 65, 17, 34, 49, 17, + 49, 49, 17, 65, 33, 17, 66, 17, 17, 81, 17, 17, + 83, 17, 98, 240, 96, 27, 11, 240, 164, 82, 65, 65, + 97, 33, 129, 17, 129, 17, 129, 17, 129, 17, 129, 17, + 129, 33, 97, 50, 66, 84, 240, 176, 22, 8, 240, 21, + 49, 66, 17, 81, 17, 81, 17, 81, 17, 65, 37, 49, + 113, 113, 113, 113, 240, 128, 28, 11, 240, 164, 82, 65, + 65, 97, 33, 129, 17, 129, 17, 129, 17, 129, 17, 129, + 17, 129, 33, 97, 50, 66, 84, 177, 177, 32, 27, 9, + 240, 53, 65, 65, 49, 81, 33, 81, 33, 81, 33, 65, + 53, 65, 50, 49, 65, 49, 66, 33, 81, 33, 82, 240, + 64, 17, 8, 240, 37, 34, 97, 113, 129, 130, 130, 114, + 113, 113, 98, 36, 240, 64, 17, 10, 240, 89, 81, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 240, 160, 28, + 10, 240, 81, 113, 17, 113, 17, 113, 17, 113, 17, 113, + 17, 113, 17, 113, 17, 113, 17, 113, 17, 113, 33, 66, + 69, 240, 128, 27, 11, 240, 114, 113, 33, 113, 33, 98, + 49, 81, 65, 81, 65, 65, 97, 49, 97, 49, 98, 17, + 129, 17, 131, 130, 240, 192, 49, 17, 240, 240, 66, 82, + 97, 33, 82, 97, 33, 81, 17, 65, 49, 81, 17, 65, + 65, 49, 33, 65, 65, 49, 34, 34, 65, 49, 49, 33, + 82, 17, 65, 33, 97, 17, 65, 33, 97, 17, 82, 113, + 17, 82, 129, 98, 240, 240, 128, 27, 10, 240, 81, 98, + 33, 81, 50, 49, 82, 18, 97, 17, 129, 131, 98, 17, + 97, 49, 65, 66, 34, 81, 33, 113, 240, 96, 23, 10, + 240, 81, 113, 33, 81, 49, 81, 65, 49, 82, 18, 97, + 17, 129, 145, 145, 145, 145, 145, 240, 160, 17, 9, 240, + 71, 114, 113, 113, 129, 113, 114, 113, 113, 114, 113, 120, + 240, 64, 17, 4, 67, 17, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 51, 41, 15, 0, 5, 97, + 65, 81, 49, 66, 49, 65, 49, 17, 49, 81, 33, 17, + 49, 62, 49, 33, 33, 17, 97, 33, 33, 17, 97, 17, + 49, 17, 114, 49, 17, 114, 65, 130, 65, 240, 240, 80, + 17, 4, 67, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 19, 18, 9, 240, 98, 113, 17, 82, + 17, 81, 49, 50, 49, 49, 81, 17, 97, 0, 8, 5, + 10, 0, 18, 105, 8, 3, 97, 33, 49, 240, 240, 64, + 21, 8, 240, 240, 196, 49, 65, 113, 53, 33, 65, 17, + 81, 17, 81, 17, 66, 36, 17, 240, 32, 26, 8, 129, + 113, 113, 113, 113, 19, 50, 49, 33, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 18, 49, 33, 19, 240, 64, 14, + 7, 240, 240, 116, 33, 81, 97, 97, 97, 98, 97, 116, + 240, 26, 8, 225, 113, 113, 113, 51, 17, 33, 50, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 33, 50, 51, + 17, 240, 32, 18, 8, 240, 240, 195, 65, 49, 33, 81, + 17, 81, 23, 17, 113, 129, 132, 240, 48, 16, 6, 146, + 49, 81, 81, 53, 49, 81, 81, 81, 81, 81, 81, 81, + 240, 25, 8, 240, 240, 195, 17, 33, 50, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 33, 50, 51, 17, 97, + 52, 48, 26, 8, 129, 113, 113, 113, 113, 20, 34, 50, + 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, + 17, 81, 240, 32, 13, 2, 33, 113, 17, 17, 17, 17, + 17, 17, 17, 17, 80, 15, 4, 97, 241, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 18, 32, 24, 7, 113, 97, + 97, 97, 97, 50, 17, 49, 33, 33, 49, 17, 67, 65, + 33, 49, 34, 33, 49, 33, 65, 240, 16, 2, 33, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 80, + 33, 12, 0, 7, 65, 19, 35, 34, 35, 34, 17, 65, + 65, 17, 65, 65, 17, 65, 65, 17, 65, 65, 17, 65, + 65, 17, 65, 65, 17, 65, 65, 240, 160, 24, 8, 240, + 240, 161, 20, 34, 50, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 240, 32, 22, 9, 0, + 5, 116, 65, 65, 33, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 33, 65, 68, 240, 96, 25, 8, 240, 240, 161, + 19, 50, 49, 33, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 18, 49, 33, 19, 49, 113, 112, 24, 8, 240, 240, + 195, 17, 33, 50, 17, 81, 17, 81, 17, 81, 17, 81, + 17, 81, 33, 50, 51, 17, 113, 113, 14, 5, 240, 161, + 18, 18, 49, 65, 65, 65, 65, 65, 65, 224, 14, 6, + 240, 240, 20, 17, 81, 82, 98, 97, 81, 81, 20, 224, + 15, 6, 240, 81, 81, 53, 49, 81, 81, 81, 81, 81, + 81, 98, 208, 24, 8, 240, 240, 161, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 18, 50, 36, + 17, 240, 32, 22, 8, 240, 240, 162, 65, 33, 65, 33, + 65, 34, 33, 65, 33, 65, 33, 65, 17, 98, 98, 240, + 64, 37, 14, 0, 8, 98, 66, 65, 33, 66, 65, 33, + 49, 17, 50, 33, 49, 33, 33, 65, 33, 33, 33, 65, + 17, 49, 33, 65, 17, 49, 17, 98, 66, 98, 66, 240, + 240, 16, 20, 7, 240, 240, 81, 65, 33, 34, 34, 17, + 66, 82, 83, 49, 33, 34, 49, 17, 65, 240, 21, 7, + 240, 240, 81, 65, 17, 65, 17, 49, 49, 33, 49, 18, + 51, 82, 81, 97, 97, 66, 80, 14, 7, 240, 240, 86, + 97, 81, 81, 82, 81, 81, 81, 102, 240, 17, 5, 114, + 33, 65, 65, 65, 65, 65, 49, 81, 65, 65, 65, 65, + 65, 82, 17, 2, 33, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 48, 18, 5, 82, 81, 65, + 65, 65, 65, 65, 81, 49, 65, 65, 65, 65, 65, 34, + 48, 10, 9, 0, 8, 3, 49, 17, 52, 0, 8, + 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8e, 0x01, 0x00, 0x00, // Offset 398 (0x18e) + 0xa3, 0x01, 0x00, 0x00, // Offset 419 (0x1a3) + 0xba, 0x01, 0x00, 0x00, // Offset 442 (0x1ba) + 0xc8, 0x01, 0x00, 0x00, // Offset 456 (0x1c8) + 0xdc, 0x01, 0x00, 0x00, // Offset 476 (0x1dc) + 0xf3, 0x01, 0x00, 0x00, // Offset 499 (0x1f3) + 0x00, 0x02, 0x00, 0x00, // Offset 512 (0x200) + 0x12, 0x02, 0x00, 0x00, // Offset 530 (0x212) + 0x21, 0x02, 0x00, 0x00, // Offset 545 (0x221) + 0x36, 0x02, 0x00, 0x00, // Offset 566 (0x236) + 0x4f, 0x02, 0x00, 0x00, // Offset 591 (0x24f) + 0x69, 0x02, 0x00, 0x00, // Offset 617 (0x269) + 0x80, 0x02, 0x00, 0x00, // Offset 640 (0x280) + 0x94, 0x02, 0x00, 0x00, // Offset 660 (0x294) + 0xb1, 0x02, 0x00, 0x00, // Offset 689 (0x2b1) + 0xca, 0x02, 0x00, 0x00, // Offset 714 (0x2ca) + 0xdb, 0x02, 0x00, 0x00, // Offset 731 (0x2db) + 0xee, 0x02, 0x00, 0x00, // Offset 750 (0x2ee) + 0x0d, 0x03, 0x00, 0x00, // Offset 781 (0x30d) + 0x29, 0x03, 0x00, 0x00, // Offset 809 (0x329) + 0x3a, 0x03, 0x00, 0x00, // Offset 826 (0x33a) + 0x53, 0x03, 0x00, 0x00, // Offset 851 (0x353) + 0x68, 0x03, 0x00, 0x00, // Offset 872 (0x368) + 0x77, 0x03, 0x00, 0x00, // Offset 887 (0x377) + 0x8e, 0x03, 0x00, 0x00, // Offset 910 (0x38e) + 0x9e, 0x03, 0x00, 0x00, // Offset 926 (0x39e) + 0xac, 0x03, 0x00, 0x00, // Offset 940 (0x3ac) + 0xba, 0x03, 0x00, 0x00, // Offset 954 (0x3ba) + 0xcf, 0x03, 0x00, 0x00, // Offset 975 (0x3cf) + 0xe2, 0x03, 0x00, 0x00, // Offset 994 (0x3e2) + 0xf4, 0x03, 0x00, 0x00, // Offset 1012 (0x3f4) + 0x13, 0x04, 0x00, 0x00, // Offset 1043 (0x413) + 0x25, 0x04, 0x00, 0x00, // Offset 1061 (0x425) + 0x43, 0x04, 0x00, 0x00, // Offset 1091 (0x443) + 0x55, 0x04, 0x00, 0x00, // Offset 1109 (0x455) + 0x75, 0x04, 0x00, 0x00, // Offset 1141 (0x475) + 0x87, 0x04, 0x00, 0x00, // Offset 1159 (0x487) + 0xa7, 0x04, 0x00, 0x00, // Offset 1191 (0x4a7) + 0xb4, 0x04, 0x00, 0x00, // Offset 1204 (0x4b4) + 0xcd, 0x04, 0x00, 0x00, // Offset 1229 (0x4cd) + 0xf1, 0x04, 0x00, 0x00, // Offset 1265 (0x4f1) + 0x09, 0x05, 0x00, 0x00, // Offset 1289 (0x509) + 0x1b, 0x05, 0x00, 0x00, // Offset 1307 (0x51b) + 0x2a, 0x05, 0x00, 0x00, // Offset 1322 (0x52a) + 0x43, 0x05, 0x00, 0x00, // Offset 1347 (0x543) + 0x6a, 0x05, 0x00, 0x00, // Offset 1386 (0x56a) + 0x83, 0x05, 0x00, 0x00, // Offset 1411 (0x583) + 0x99, 0x05, 0x00, 0x00, // Offset 1433 (0x599) + 0xa1, 0x05, 0x00, 0x00, // Offset 1441 (0x5a1) + 0xb4, 0x05, 0x00, 0x00, // Offset 1460 (0x5b4) + 0xc6, 0x05, 0x00, 0x00, // Offset 1478 (0x5c6) + 0xca, 0x05, 0x00, 0x00, // Offset 1482 (0x5ca) + 0xde, 0x05, 0x00, 0x00, // Offset 1502 (0x5de) + 0xef, 0x05, 0x00, 0x00, // Offset 1519 (0x5ef) + 0x06, 0x06, 0x00, 0x00, // Offset 1542 (0x606) + 0x1f, 0x06, 0x00, 0x00, // Offset 1567 (0x61f) + 0x3d, 0x06, 0x00, 0x00, // Offset 1597 (0x63d) + 0x51, 0x06, 0x00, 0x00, // Offset 1617 (0x651) + 0x76, 0x06, 0x00, 0x00, // Offset 1654 (0x676) + 0x8d, 0x06, 0x00, 0x00, // Offset 1677 (0x68d) + 0xa4, 0x06, 0x00, 0x00, // Offset 1700 (0x6a4) + 0xc3, 0x06, 0x00, 0x00, // Offset 1731 (0x6c3) + 0xdf, 0x06, 0x00, 0x00, // Offset 1759 (0x6df) + 0xf9, 0x06, 0x00, 0x00, // Offset 1785 (0x6f9) + 0x0e, 0x07, 0x00, 0x00, // Offset 1806 (0x70e) + 0x28, 0x07, 0x00, 0x00, // Offset 1832 (0x728) + 0x42, 0x07, 0x00, 0x00, // Offset 1858 (0x742) + 0x64, 0x07, 0x00, 0x00, // Offset 1892 (0x764) + 0x86, 0x07, 0x00, 0x00, // Offset 1926 (0x786) + 0x9f, 0x07, 0x00, 0x00, // Offset 1951 (0x79f) + 0xb9, 0x07, 0x00, 0x00, // Offset 1977 (0x7b9) + 0xce, 0x07, 0x00, 0x00, // Offset 1998 (0x7ce) + 0xed, 0x07, 0x00, 0x00, // Offset 2029 (0x7ed) + 0x05, 0x08, 0x00, 0x00, // Offset 2053 (0x805) + 0x1d, 0x08, 0x00, 0x00, // Offset 2077 (0x81d) + 0x34, 0x08, 0x00, 0x00, // Offset 2100 (0x834) + 0x52, 0x08, 0x00, 0x00, // Offset 2130 (0x852) + 0x6b, 0x08, 0x00, 0x00, // Offset 2155 (0x86b) + 0x7d, 0x08, 0x00, 0x00, // Offset 2173 (0x87d) + 0x9c, 0x08, 0x00, 0x00, // Offset 2204 (0x89c) + 0xb0, 0x08, 0x00, 0x00, // Offset 2224 (0x8b0) + 0xcd, 0x08, 0x00, 0x00, // Offset 2253 (0x8cd) + 0xea, 0x08, 0x00, 0x00, // Offset 2282 (0x8ea) + 0xff, 0x08, 0x00, 0x00, // Offset 2303 (0x8ff) + 0x19, 0x09, 0x00, 0x00, // Offset 2329 (0x919) + 0x2c, 0x09, 0x00, 0x00, // Offset 2348 (0x92c) + 0x4a, 0x09, 0x00, 0x00, // Offset 2378 (0x94a) + 0x72, 0x09, 0x00, 0x00, // Offset 2418 (0x972) + 0x90, 0x09, 0x00, 0x00, // Offset 2448 (0x990) + 0xb0, 0x09, 0x00, 0x00, // Offset 2480 (0x9b0) + 0xdb, 0x09, 0x00, 0x00, // Offset 2523 (0x9db) + 0xf9, 0x09, 0x00, 0x00, // Offset 2553 (0x9f9) + 0xff, 0x09, 0x00, 0x00, // Offset 2559 (0x9ff) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 14, 8, 240, 240, 167, 113, 113, 113, 113, 113, 113, 240, + 240, 48, 21, 10, 0, 6, 36, 20, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 240, 240, 176, 23, + 11, 0, 6, 116, 49, 97, 49, 97, 49, 97, 34, 97, + 33, 17, 81, 18, 18, 67, 49, 240, 240, 240, 14, 9, + 240, 240, 241, 129, 129, 129, 129, 129, 136, 240, 240, 112, + 20, 12, 0, 7, 65, 69, 33, 129, 33, 113, 49, 98, + 49, 81, 33, 38, 65, 0, 7, 80, 23, 11, 240, 240, + 225, 68, 33, 161, 54, 17, 83, 33, 65, 49, 17, 65, + 49, 22, 49, 115, 0, 5, 96, 13, 9, 240, 240, 247, + 33, 129, 129, 129, 136, 0, 5, 96, 18, 11, 0, 6, + 116, 21, 17, 65, 81, 65, 81, 65, 81, 65, 84, 21, + 0, 7, 15, 9, 240, 240, 104, 129, 129, 129, 24, 17, + 129, 136, 240, 240, 112, 21, 10, 0, 6, 36, 20, 65, + 65, 65, 65, 20, 65, 17, 113, 17, 113, 21, 49, 240, + 240, 176, 25, 10, 0, 6, 36, 20, 65, 17, 33, 65, + 17, 33, 20, 17, 33, 17, 65, 33, 17, 65, 33, 25, + 240, 240, 176, 26, 10, 0, 6, 36, 17, 33, 65, 17, + 33, 65, 20, 20, 17, 33, 17, 65, 33, 17, 65, 33, + 20, 20, 240, 240, 176, 23, 12, 0, 7, 68, 49, 113, + 49, 113, 49, 68, 49, 65, 81, 17, 49, 66, 18, 38, + 50, 0, 6, 16, 20, 10, 0, 6, 36, 20, 65, 17, + 113, 17, 68, 20, 17, 65, 65, 65, 73, 240, 240, 176, + 29, 11, 240, 240, 228, 21, 65, 33, 17, 81, 33, 17, + 81, 33, 17, 36, 33, 17, 33, 81, 17, 33, 81, 17, + 36, 21, 240, 240, 240, 25, 12, 0, 6, 4, 36, 81, + 177, 22, 65, 35, 52, 17, 49, 33, 65, 49, 33, 65, + 49, 37, 19, 0, 6, 48, 17, 9, 240, 240, 248, 17, + 97, 17, 97, 17, 97, 17, 97, 24, 0, 5, 96, 19, + 9, 240, 240, 241, 97, 17, 97, 24, 17, 97, 17, 97, + 17, 97, 24, 240, 240, 112, 31, 10, 0, 6, 33, 33, + 17, 33, 17, 33, 17, 33, 20, 20, 17, 33, 17, 33, + 17, 33, 17, 33, 17, 33, 17, 33, 20, 20, 240, 240, + 176, 28, 11, 0, 6, 113, 33, 49, 49, 33, 49, 52, + 49, 49, 33, 33, 17, 33, 33, 33, 17, 33, 33, 17, + 49, 20, 0, 6, 48, 17, 10, 0, 6, 97, 145, 130, + 131, 97, 34, 65, 66, 33, 113, 240, 240, 176, 25, 12, + 0, 6, 49, 49, 113, 49, 113, 49, 99, 18, 97, 17, + 17, 17, 65, 50, 34, 17, 65, 161, 0, 6, 112, 21, + 9, 240, 240, 132, 65, 65, 33, 97, 17, 97, 17, 97, + 17, 97, 33, 65, 68, 240, 240, 144, 15, 11, 240, 240, + 232, 146, 130, 130, 131, 98, 50, 50, 83, 0, 7, 23, + 12, 0, 6, 20, 20, 97, 65, 81, 65, 82, 50, 81, + 17, 34, 50, 50, 34, 17, 65, 0, 8, 32, 16, 10, + 240, 240, 196, 232, 145, 114, 114, 98, 18, 50, 82, 240, + 240, 176, 14, 9, 240, 240, 104, 129, 129, 129, 39, 129, + 129, 0, 5, 96, 14, 9, 240, 240, 248, 17, 129, 136, + 17, 129, 136, 240, 240, 112, 21, 10, 240, 240, 168, 65, + 49, 81, 49, 81, 49, 81, 49, 81, 49, 81, 49, 57, + 240, 240, 176, 19, 10, 240, 240, 197, 217, 53, 66, 50, + 49, 81, 49, 81, 50, 50, 69, 240, 240, 48, 18, 4, + 1, 49, 49, 49, 49, 49, 49, 51, 17, 49, 49, 49, + 49, 49, 49, 112, 31, 6, 65, 17, 49, 17, 49, 17, + 49, 17, 49, 17, 49, 17, 49, 21, 17, 49, 17, 49, + 17, 49, 17, 49, 17, 49, 17, 49, 17, 49, 112, 18, + 4, 1, 49, 49, 49, 49, 51, 17, 49, 49, 51, 17, + 49, 49, 49, 49, 112, 30, 6, 65, 17, 49, 17, 49, + 17, 49, 17, 49, 21, 17, 49, 17, 49, 17, 49, 21, + 17, 49, 17, 49, 17, 49, 17, 49, 17, 49, 112, 18, + 5, 49, 65, 65, 65, 65, 65, 65, 20, 65, 65, 65, + 65, 65, 65, 65, 96, 32, 8, 97, 65, 33, 65, 33, + 65, 33, 65, 33, 65, 33, 65, 33, 20, 33, 65, 33, + 65, 33, 65, 33, 65, 33, 65, 33, 65, 33, 65, 33, + 144, 18, 5, 49, 65, 65, 65, 65, 20, 65, 65, 65, + 20, 65, 65, 65, 65, 65, 96, 32, 8, 97, 65, 33, + 65, 33, 65, 33, 65, 33, 20, 33, 65, 33, 65, 33, + 65, 33, 20, 33, 65, 33, 65, 33, 65, 33, 65, 33, + 65, 33, 144, 13, 15, 0, 12, 1, 225, 225, 225, 225, + 142, 0, 7, 80, 25, 14, 161, 209, 209, 209, 209, 209, + 113, 81, 113, 83, 81, 81, 113, 81, 113, 81, 57, 17, + 209, 209, 209, 240, 32, 36, 14, 193, 161, 33, 161, 33, + 161, 33, 161, 33, 161, 33, 161, 33, 81, 68, 81, 65, + 33, 81, 65, 33, 81, 65, 33, 24, 17, 33, 161, 33, + 161, 33, 161, 33, 240, 24, 13, 177, 193, 193, 193, 193, + 193, 97, 81, 97, 81, 97, 81, 97, 81, 97, 81, 26, + 17, 193, 193, 193, 224, 18, 15, 0, 11, 97, 65, 145, + 65, 145, 65, 145, 65, 145, 65, 94, 0, 7, 80, 15, + 15, 0, 11, 46, 113, 225, 225, 225, 225, 225, 225, 240, + 240, 128, 25, 13, 177, 193, 193, 193, 193, 193, 193, 193, + 25, 33, 81, 97, 81, 52, 81, 97, 81, 97, 81, 97, + 81, 97, 224, 39, 13, 177, 161, 17, 161, 17, 161, 17, + 161, 17, 161, 17, 161, 17, 24, 17, 17, 65, 81, 17, + 65, 81, 17, 65, 36, 17, 65, 81, 17, 65, 81, 17, + 65, 81, 17, 161, 17, 224, 25, 13, 177, 193, 193, 193, + 193, 193, 193, 193, 26, 17, 81, 97, 81, 97, 81, 97, + 81, 97, 81, 97, 81, 97, 224, 22, 15, 0, 11, 46, + 81, 65, 145, 65, 145, 65, 145, 65, 145, 65, 145, 65, + 145, 65, 240, 240, 80, 8, 15, 0, 15, 14, 0, 13, + 32, 19, 13, 177, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 26, 17, 193, 193, 193, 193, 224, 18, 2, 1, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 48, 4, 17, 0, 34, 20, 10, 240, 240, 161, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 73, 0, + 6, 48, 17, 11, 0, 6, 113, 68, 33, 65, 81, 65, + 81, 65, 81, 65, 90, 0, 7, 23, 12, 0, 6, 1, + 97, 65, 97, 65, 97, 65, 82, 65, 81, 17, 49, 66, + 18, 38, 50, 0, 7, 80, 25, 10, 240, 240, 161, 81, + 49, 81, 49, 82, 33, 65, 17, 33, 65, 17, 33, 65, + 33, 22, 33, 85, 240, 240, 176, 30, 14, 0, 8, 99, + 20, 33, 81, 65, 33, 81, 65, 33, 51, 65, 18, 49, + 97, 17, 17, 33, 97, 17, 17, 37, 34, 49, 0, 7, + 16, 20, 11, 0, 6, 116, 20, 81, 17, 129, 17, 84, + 17, 81, 65, 81, 69, 20, 0, 6, 48, 37, 14, 0, + 7, 3, 17, 33, 33, 81, 17, 33, 33, 81, 17, 33, + 33, 81, 20, 33, 51, 17, 33, 17, 17, 33, 49, 33, + 17, 17, 33, 49, 34, 49, 24, 0, 7, 96, 23, 11, + 0, 6, 116, 161, 50, 81, 50, 36, 33, 17, 33, 65, + 34, 17, 65, 34, 20, 21, 240, 240, 240, 23, 11, 0, + 6, 116, 21, 65, 161, 35, 36, 17, 49, 17, 65, 49, + 17, 65, 49, 21, 19, 0, 5, 96, 31, 11, 0, 6, + 116, 17, 49, 17, 33, 17, 49, 17, 33, 21, 17, 33, + 17, 49, 17, 33, 17, 49, 17, 33, 17, 49, 20, 21, + 240, 240, 240, 28, 12, 0, 7, 68, 49, 65, 33, 49, + 65, 33, 49, 65, 33, 34, 65, 33, 33, 17, 49, 33, + 18, 18, 38, 50, 0, 6, 16, 26, 10, 0, 6, 36, + 97, 33, 34, 33, 33, 34, 33, 33, 34, 33, 33, 17, + 33, 17, 33, 17, 33, 25, 240, 240, 176, 21, 9, 240, + 200, 17, 97, 17, 97, 17, 97, 17, 97, 24, 210, 97, + 33, 81, 33, 98, 240, 112, 26, 10, 0, 6, 33, 33, + 20, 17, 33, 65, 20, 65, 17, 33, 65, 17, 33, 65, + 17, 33, 65, 20, 65, 240, 240, 176, 26, 11, 0, 6, + 113, 33, 20, 33, 33, 17, 84, 17, 81, 33, 17, 81, + 33, 17, 81, 33, 17, 84, 21, 240, 240, 240, 34, 13, + 0, 8, 17, 33, 33, 20, 17, 33, 33, 65, 20, 33, + 65, 17, 33, 18, 65, 17, 33, 17, 17, 49, 17, 35, + 18, 33, 21, 49, 33, 0, 6, 80, 34, 14, 0, 8, + 97, 33, 33, 35, 33, 33, 33, 33, 68, 33, 33, 65, + 33, 33, 33, 65, 33, 17, 17, 17, 65, 33, 17, 17, + 17, 69, 53, 0, 7, 16, 25, 12, 0, 7, 65, 33, + 21, 33, 33, 66, 36, 65, 49, 33, 50, 49, 33, 36, + 33, 33, 18, 34, 20, 0, 7, 26, 11, 0, 6, 113, + 33, 36, 17, 33, 18, 68, 18, 65, 33, 21, 17, 33, + 18, 65, 33, 18, 68, 36, 240, 240, 240, 21, 9, 240, + 193, 97, 17, 97, 24, 17, 97, 17, 97, 24, 210, 97, + 33, 81, 33, 98, 240, 112, 31, 10, 240, 241, 33, 17, + 33, 17, 33, 17, 33, 20, 20, 17, 33, 17, 33, 17, + 33, 17, 33, 20, 20, 227, 97, 49, 81, 49, 99, 240, + 144, 24, 11, 0, 7, 33, 36, 65, 81, 65, 81, 50, + 81, 49, 17, 65, 34, 18, 49, 18, 50, 33, 240, 240, + 240, 24, 12, 0, 6, 49, 49, 113, 49, 113, 49, 98, + 49, 97, 17, 33, 82, 18, 17, 66, 49, 20, 0, 7, + 80, 23, 12, 0, 7, 113, 52, 65, 49, 113, 49, 98, + 49, 97, 17, 33, 82, 18, 20, 18, 49, 0, 6, 96, + 30, 12, 0, 7, 113, 49, 33, 65, 49, 33, 65, 52, + 49, 17, 33, 33, 49, 17, 33, 33, 33, 49, 17, 33, + 18, 49, 20, 0, 6, 16, 25, 12, 0, 7, 97, 37, + 65, 97, 65, 82, 49, 17, 65, 65, 17, 49, 17, 33, + 49, 17, 49, 81, 0, 6, 112, 18, 8, 240, 240, 209, + 113, 97, 17, 81, 17, 65, 49, 49, 49, 39, 240, 240, + 48, 31, 12, 0, 7, 83, 51, 34, 18, 18, 18, 17, + 49, 17, 49, 17, 49, 17, 49, 17, 49, 17, 49, 18, + 18, 18, 18, 35, 51, 0, 6, 32, 20, 8, 240, 240, + 81, 84, 65, 49, 33, 81, 17, 81, 17, 81, 33, 49, + 67, 240, 240, 80, 29, 12, 0, 6, 33, 81, 67, 65, + 50, 33, 49, 49, 65, 33, 49, 65, 17, 17, 33, 65, + 17, 17, 34, 35, 49, 36, 0, 6, 112, 29, 12, 0, + 6, 33, 177, 81, 65, 17, 65, 49, 49, 19, 49, 49, + 17, 18, 33, 49, 17, 18, 34, 19, 49, 51, 37, 0, + 6, 16, 21, 10, 240, 249, 49, 49, 81, 49, 81, 49, + 54, 18, 25, 227, 97, 49, 81, 49, 99, 240, 144, 26, + 13, 0, 6, 99, 51, 252, 50, 66, 65, 33, 33, 33, + 49, 33, 33, 33, 49, 33, 33, 33, 66, 66, 0, 6, + 112, 19, 9, 240, 240, 104, 196, 65, 65, 33, 97, 17, + 97, 17, 97, 33, 65, 68, 240, 240, 30, 14, 146, 194, + 194, 194, 194, 196, 49, 49, 34, 81, 49, 34, 81, 49, + 34, 81, 49, 34, 81, 49, 36, 27, 54, 50, 194, 194, + 240, 32, 40, 14, 240, 114, 18, 146, 18, 146, 18, 146, + 18, 49, 33, 37, 49, 33, 37, 49, 33, 34, 18, 49, + 33, 34, 18, 49, 33, 34, 18, 29, 23, 18, 18, 146, + 18, 146, 18, 146, 18, 209, 30, 13, 177, 193, 193, 193, + 193, 193, 65, 49, 49, 65, 49, 49, 65, 49, 49, 65, + 49, 49, 65, 49, 49, 26, 17, 24, 49, 193, 193, 224, + 32, 13, 240, 145, 193, 193, 193, 193, 193, 41, 17, 25, + 33, 65, 33, 20, 65, 33, 65, 65, 33, 20, 65, 33, + 65, 65, 33, 65, 65, 33, 65, 224, 43, 13, 177, 146, + 17, 146, 17, 146, 17, 146, 17, 146, 17, 146, 17, 26, + 17, 23, 18, 17, 49, 37, 17, 49, 33, 34, 17, 49, + 33, 34, 17, 49, 37, 17, 49, 33, 34, 17, 49, 33, + 34, 17, 224, 30, 13, 177, 193, 193, 193, 193, 193, 193, + 26, 17, 25, 33, 65, 49, 49, 65, 49, 49, 65, 49, + 49, 65, 49, 49, 65, 49, 49, 193, 224, 6, 3, 240, + 98, 240, 160, 19, 6, 65, 81, 81, 81, 81, 81, 81, + 18, 33, 81, 81, 81, 81, 81, 81, 81, 112, + 0, 0, // Padding + +}; + +tFont *g_psFontWHangulgothic16pt = (tFont *)g_pui8Hangulgothic16pt; diff --git a/third_party/fonts/ofl/fonts/fonthangulgothic16ptb.c b/third_party/fonts/ofl/fonts/fonthangulgothic16ptb.c new file mode 100644 index 0000000..6632809 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulgothic16ptb.c @@ -0,0 +1,710 @@ +//***************************************************************************** +// +// fonthangulgothic16ptb.c - Font definition for the 16ptpt Hangulgothic bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulgothic +// Size: 16pt +// Bold: yes +// Italic: no +// Memory usage: 4654 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulgothic16ptb[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 15, + + // + // The height of the font. + // + 16, + + // + // The baseline of the font. + // + 13, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x00, 0x09, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8d, 0x01, 0x00, 0x00, // Offset 397 (0x18d) + 0x94, 0x01, 0x00, 0x00, // Offset 404 (0x194) + 0xaf, 0x01, 0x00, 0x00, // Offset 431 (0x1af) + 0xc2, 0x01, 0x00, 0x00, // Offset 450 (0x1c2) + 0xe9, 0x01, 0x00, 0x00, // Offset 489 (0x1e9) + 0x05, 0x02, 0x00, 0x00, // Offset 517 (0x205) + 0x0d, 0x02, 0x00, 0x00, // Offset 525 (0x20d) + 0x1e, 0x02, 0x00, 0x00, // Offset 542 (0x21e) + 0x30, 0x02, 0x00, 0x00, // Offset 560 (0x230) + 0x40, 0x02, 0x00, 0x00, // Offset 576 (0x240) + 0x4f, 0x02, 0x00, 0x00, // Offset 591 (0x24f) + 0x57, 0x02, 0x00, 0x00, // Offset 599 (0x257) + 0x5f, 0x02, 0x00, 0x00, // Offset 607 (0x25f) + 0x65, 0x02, 0x00, 0x00, // Offset 613 (0x265) + 0x76, 0x02, 0x00, 0x00, // Offset 630 (0x276) + 0x91, 0x02, 0x00, 0x00, // Offset 657 (0x291) + 0xa1, 0x02, 0x00, 0x00, // Offset 673 (0x2a1) + 0xb3, 0x02, 0x00, 0x00, // Offset 691 (0x2b3) + 0xc5, 0x02, 0x00, 0x00, // Offset 709 (0x2c5) + 0xda, 0x02, 0x00, 0x00, // Offset 730 (0x2da) + 0xeb, 0x02, 0x00, 0x00, // Offset 747 (0x2eb) + 0x02, 0x03, 0x00, 0x00, // Offset 770 (0x302) + 0x13, 0x03, 0x00, 0x00, // Offset 787 (0x313) + 0x2c, 0x03, 0x00, 0x00, // Offset 812 (0x32c) + 0x43, 0x03, 0x00, 0x00, // Offset 835 (0x343) + 0x49, 0x03, 0x00, 0x00, // Offset 841 (0x349) + 0x52, 0x03, 0x00, 0x00, // Offset 850 (0x352) + 0x63, 0x03, 0x00, 0x00, // Offset 867 (0x363) + 0x6e, 0x03, 0x00, 0x00, // Offset 878 (0x36e) + 0x7f, 0x03, 0x00, 0x00, // Offset 895 (0x37f) + 0x8f, 0x03, 0x00, 0x00, // Offset 911 (0x38f) + 0xb6, 0x03, 0x00, 0x00, // Offset 950 (0x3b6) + 0xce, 0x03, 0x00, 0x00, // Offset 974 (0x3ce) + 0xe8, 0x03, 0x00, 0x00, // Offset 1000 (0x3e8) + 0xf9, 0x03, 0x00, 0x00, // Offset 1017 (0x3f9) + 0x14, 0x04, 0x00, 0x00, // Offset 1044 (0x414) + 0x25, 0x04, 0x00, 0x00, // Offset 1061 (0x425) + 0x35, 0x04, 0x00, 0x00, // Offset 1077 (0x435) + 0x4b, 0x04, 0x00, 0x00, // Offset 1099 (0x44b) + 0x67, 0x04, 0x00, 0x00, // Offset 1127 (0x467) + 0x76, 0x04, 0x00, 0x00, // Offset 1142 (0x476) + 0x85, 0x04, 0x00, 0x00, // Offset 1157 (0x485) + 0xa0, 0x04, 0x00, 0x00, // Offset 1184 (0x4a0) + 0xaf, 0x04, 0x00, 0x00, // Offset 1199 (0x4af) + 0xda, 0x04, 0x00, 0x00, // Offset 1242 (0x4da) + 0xfb, 0x04, 0x00, 0x00, // Offset 1275 (0x4fb) + 0x16, 0x05, 0x00, 0x00, // Offset 1302 (0x516) + 0x2c, 0x05, 0x00, 0x00, // Offset 1324 (0x52c) + 0x48, 0x05, 0x00, 0x00, // Offset 1352 (0x548) + 0x63, 0x05, 0x00, 0x00, // Offset 1379 (0x563) + 0x74, 0x05, 0x00, 0x00, // Offset 1396 (0x574) + 0x85, 0x05, 0x00, 0x00, // Offset 1413 (0x585) + 0xa1, 0x05, 0x00, 0x00, // Offset 1441 (0x5a1) + 0xbb, 0x05, 0x00, 0x00, // Offset 1467 (0x5bb) + 0xe7, 0x05, 0x00, 0x00, // Offset 1511 (0x5e7) + 0x01, 0x06, 0x00, 0x00, // Offset 1537 (0x601) + 0x16, 0x06, 0x00, 0x00, // Offset 1558 (0x616) + 0x27, 0x06, 0x00, 0x00, // Offset 1575 (0x627) + 0x38, 0x06, 0x00, 0x00, // Offset 1592 (0x638) + 0x5c, 0x06, 0x00, 0x00, // Offset 1628 (0x65c) + 0x6d, 0x06, 0x00, 0x00, // Offset 1645 (0x66d) + 0x80, 0x06, 0x00, 0x00, // Offset 1664 (0x680) + 0x85, 0x06, 0x00, 0x00, // Offset 1669 (0x685) + 0x8c, 0x06, 0x00, 0x00, // Offset 1676 (0x68c) + 0xa0, 0x06, 0x00, 0x00, // Offset 1696 (0x6a0) + 0xb8, 0x06, 0x00, 0x00, // Offset 1720 (0x6b8) + 0xc7, 0x06, 0x00, 0x00, // Offset 1735 (0x6c7) + 0xdf, 0x06, 0x00, 0x00, // Offset 1759 (0x6df) + 0xf1, 0x06, 0x00, 0x00, // Offset 1777 (0x6f1) + 0x01, 0x07, 0x00, 0x00, // Offset 1793 (0x701) + 0x18, 0x07, 0x00, 0x00, // Offset 1816 (0x718) + 0x31, 0x07, 0x00, 0x00, // Offset 1841 (0x731) + 0x3e, 0x07, 0x00, 0x00, // Offset 1854 (0x73e) + 0x4d, 0x07, 0x00, 0x00, // Offset 1869 (0x74d) + 0x65, 0x07, 0x00, 0x00, // Offset 1893 (0x765) + 0x75, 0x07, 0x00, 0x00, // Offset 1909 (0x775) + 0x95, 0x07, 0x00, 0x00, // Offset 1941 (0x795) + 0xac, 0x07, 0x00, 0x00, // Offset 1964 (0x7ac) + 0xc2, 0x07, 0x00, 0x00, // Offset 1986 (0x7c2) + 0xd9, 0x07, 0x00, 0x00, // Offset 2009 (0x7d9) + 0xef, 0x07, 0x00, 0x00, // Offset 2031 (0x7ef) + 0xfd, 0x07, 0x00, 0x00, // Offset 2045 (0x7fd) + 0x0c, 0x08, 0x00, 0x00, // Offset 2060 (0x80c) + 0x1b, 0x08, 0x00, 0x00, // Offset 2075 (0x81b) + 0x32, 0x08, 0x00, 0x00, // Offset 2098 (0x832) + 0x46, 0x08, 0x00, 0x00, // Offset 2118 (0x846) + 0x66, 0x08, 0x00, 0x00, // Offset 2150 (0x866) + 0x7a, 0x08, 0x00, 0x00, // Offset 2170 (0x87a) + 0x8f, 0x08, 0x00, 0x00, // Offset 2191 (0x88f) + 0x9e, 0x08, 0x00, 0x00, // Offset 2206 (0x89e) + 0xaf, 0x08, 0x00, 0x00, // Offset 2223 (0x8af) + 0xc0, 0x08, 0x00, 0x00, // Offset 2240 (0x8c0) + 0xd2, 0x08, 0x00, 0x00, // Offset 2258 (0x8d2) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 4, 6, 0, 12, 13, 3, 98, 18, 18, 18, 18, 18, + 18, 18, 18, 114, 112, 7, 5, 164, 20, 20, 0, 7, + 27, 9, 240, 82, 33, 66, 18, 66, 18, 66, 18, 40, + 49, 34, 65, 34, 40, 34, 18, 66, 18, 66, 18, 66, + 18, 240, 96, 19, 9, 194, 101, 54, 52, 84, 84, 99, + 115, 101, 66, 18, 66, 18, 68, 38, 98, 208, 39, 15, + 240, 240, 20, 66, 66, 34, 34, 82, 34, 34, 82, 34, + 18, 98, 34, 18, 116, 18, 194, 36, 114, 18, 34, 82, + 34, 34, 82, 34, 34, 66, 50, 34, 50, 84, 240, 240, + 32, 28, 11, 240, 164, 82, 50, 66, 50, 66, 50, 67, + 19, 85, 85, 34, 19, 19, 18, 18, 53, 18, 67, 35, + 51, 69, 18, 240, 128, 8, 3, 98, 18, 18, 240, 240, + 64, 17, 5, 129, 50, 34, 50, 34, 50, 50, 50, 50, + 50, 50, 66, 50, 66, 65, 18, 5, 81, 66, 66, 50, + 66, 50, 50, 50, 50, 50, 50, 34, 50, 34, 49, 64, + 16, 7, 240, 240, 114, 49, 18, 17, 22, 50, 68, 49, + 33, 240, 240, 112, 15, 10, 240, 240, 210, 130, 130, 89, + 66, 130, 130, 130, 240, 240, 240, 8, 4, 0, 6, 82, + 18, 34, 32, 8, 5, 240, 240, 84, 240, 240, 176, 6, + 3, 240, 240, 146, 112, 17, 7, 240, 50, 82, 66, 82, + 82, 66, 82, 82, 66, 82, 82, 66, 82, 192, 27, 9, + 240, 84, 66, 34, 49, 65, 34, 66, 18, 66, 18, 66, + 18, 66, 18, 66, 18, 66, 33, 65, 50, 34, 68, 240, + 96, 16, 5, 194, 35, 20, 17, 18, 50, 50, 50, 50, + 50, 50, 50, 50, 176, 18, 8, 240, 36, 49, 65, 114, + 98, 83, 82, 83, 67, 82, 83, 67, 87, 240, 32, 18, + 9, 240, 69, 65, 51, 114, 114, 98, 68, 130, 130, 114, + 114, 98, 38, 240, 96, 21, 10, 240, 162, 115, 100, 100, + 82, 18, 66, 34, 66, 34, 50, 50, 57, 98, 130, 130, + 240, 128, 17, 8, 240, 23, 18, 98, 98, 98, 101, 114, + 114, 98, 98, 82, 37, 240, 64, 23, 9, 240, 100, 51, + 98, 98, 118, 51, 34, 34, 66, 18, 66, 18, 66, 18, + 66, 34, 34, 68, 240, 96, 17, 8, 240, 23, 98, 83, + 82, 98, 82, 98, 83, 82, 98, 82, 98, 240, 96, 25, + 9, 240, 84, 51, 35, 18, 66, 18, 66, 34, 34, 68, + 70, 35, 35, 18, 66, 18, 66, 34, 34, 68, 240, 96, + 23, 9, 240, 84, 66, 34, 34, 66, 18, 66, 18, 66, + 18, 66, 34, 35, 54, 114, 98, 99, 52, 240, 112, 6, + 3, 146, 240, 114, 208, 9, 4, 240, 18, 240, 194, 18, + 34, 160, 17, 8, 225, 98, 83, 67, 67, 67, 67, 82, + 99, 99, 114, 114, 114, 113, 144, 11, 10, 0, 6, 41, + 240, 240, 25, 0, 7, 80, 17, 8, 129, 114, 99, 99, + 99, 99, 99, 98, 83, 67, 67, 66, 82, 97, 240, 16, + 8, 240, 21, 114, 114, 98, 83, 82, 82, 83, 82, 98, + 226, 240, 80, 39, 14, 240, 240, 37, 115, 51, 66, 114, + 50, 37, 18, 18, 34, 34, 18, 18, 18, 50, 18, 18, + 18, 49, 34, 18, 18, 34, 18, 50, 19, 19, 66, 114, + 67, 66, 117, 240, 240, 48, 24, 12, 240, 226, 147, 148, + 132, 114, 34, 98, 34, 82, 50, 82, 66, 57, 50, 98, + 34, 98, 18, 114, 240, 160, 26, 8, 240, 22, 34, 50, + 18, 50, 18, 50, 18, 34, 37, 50, 34, 34, 50, 18, + 50, 18, 50, 18, 34, 37, 240, 64, 17, 10, 240, 134, + 50, 114, 114, 130, 130, 130, 130, 130, 146, 146, 150, 240, + 96, 27, 10, 240, 86, 66, 50, 50, 66, 34, 82, 18, + 82, 18, 82, 18, 82, 18, 82, 18, 82, 18, 66, 34, + 50, 53, 240, 160, 17, 8, 240, 23, 18, 98, 98, 98, + 103, 18, 98, 98, 98, 98, 103, 240, 32, 16, 7, 230, + 18, 82, 82, 82, 86, 18, 82, 82, 82, 82, 82, 240, + 64, 22, 11, 240, 182, 50, 130, 130, 146, 146, 146, 53, + 18, 98, 18, 98, 34, 82, 50, 66, 71, 240, 128, 28, + 10, 240, 82, 82, 18, 82, 18, 82, 18, 82, 18, 82, + 25, 18, 82, 18, 82, 18, 82, 18, 82, 18, 82, 18, + 82, 240, 96, 15, 3, 98, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 112, 15, 6, 242, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 20, 224, 27, 9, 240, + 50, 66, 18, 50, 34, 34, 50, 19, 50, 18, 68, 85, + 66, 34, 50, 34, 50, 50, 34, 66, 18, 66, 240, 64, + 15, 7, 226, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 86, 240, 43, 14, 240, 211, 115, 19, 115, 20, 84, + 20, 84, 18, 17, 81, 18, 18, 18, 50, 18, 18, 18, + 50, 18, 18, 34, 18, 34, 18, 34, 18, 34, 18, 49, + 17, 50, 18, 51, 50, 18, 51, 50, 240, 224, 33, 10, + 240, 82, 82, 19, 66, 19, 66, 20, 50, 18, 18, 34, + 18, 18, 34, 18, 34, 18, 18, 34, 18, 18, 52, 18, + 67, 18, 67, 18, 82, 240, 96, 27, 12, 240, 197, 98, + 50, 66, 82, 34, 114, 18, 114, 18, 114, 18, 114, 18, + 114, 18, 114, 34, 82, 66, 50, 101, 240, 208, 22, 8, + 240, 21, 50, 35, 18, 50, 18, 50, 18, 50, 18, 34, + 37, 50, 98, 98, 98, 98, 240, 112, 28, 12, 240, 197, + 98, 50, 66, 82, 34, 114, 18, 114, 18, 114, 18, 114, + 18, 114, 18, 114, 34, 82, 66, 50, 101, 178, 178, 32, + 27, 8, 240, 21, 50, 35, 18, 50, 18, 50, 18, 50, + 18, 34, 37, 50, 33, 50, 34, 34, 49, 34, 50, 18, + 65, 240, 32, 17, 8, 240, 52, 50, 82, 98, 100, 84, + 84, 99, 98, 98, 82, 37, 240, 64, 17, 9, 240, 56, + 66, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 240, + 112, 28, 10, 240, 82, 82, 18, 82, 18, 82, 18, 82, + 18, 82, 18, 82, 18, 82, 18, 82, 18, 82, 18, 82, + 34, 50, 69, 240, 128, 26, 12, 240, 146, 114, 33, 98, + 50, 82, 50, 81, 82, 50, 82, 50, 82, 34, 114, 18, + 114, 18, 131, 147, 146, 240, 240, 44, 17, 240, 240, 66, + 82, 82, 33, 83, 66, 34, 67, 66, 34, 52, 50, 50, + 50, 18, 34, 66, 33, 34, 34, 66, 18, 34, 33, 82, + 18, 49, 18, 97, 18, 52, 99, 68, 99, 82, 115, 82, + 240, 240, 128, 26, 10, 240, 82, 82, 34, 50, 50, 50, + 66, 18, 99, 115, 115, 98, 18, 82, 18, 66, 50, 34, + 82, 18, 82, 240, 96, 21, 11, 240, 114, 98, 34, 66, + 50, 66, 66, 34, 86, 100, 130, 146, 146, 146, 146, 146, + 240, 192, 17, 9, 240, 56, 99, 98, 99, 98, 99, 83, + 98, 99, 98, 99, 104, 240, 64, 17, 4, 67, 18, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, + 36, 15, 0, 5, 98, 50, 50, 50, 50, 50, 50, 50, + 50, 65, 36, 33, 62, 50, 17, 33, 18, 82, 17, 33, + 18, 99, 35, 115, 35, 114, 66, 114, 66, 240, 240, 64, + 17, 4, 67, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 19, 19, 9, 240, 98, 115, 84, 82, + 18, 50, 34, 50, 50, 18, 66, 17, 97, 0, 6, 112, + 5, 10, 0, 18, 105, 7, 5, 162, 66, 66, 0, 7, + 20, 8, 240, 240, 181, 49, 50, 98, 53, 19, 34, 18, + 50, 18, 50, 18, 35, 38, 240, 32, 24, 9, 146, 114, + 114, 114, 118, 51, 34, 34, 66, 18, 66, 18, 66, 18, + 66, 18, 66, 19, 34, 38, 240, 96, 15, 8, 240, 240, + 197, 34, 82, 98, 98, 98, 99, 102, 53, 240, 32, 24, + 9, 242, 114, 114, 114, 54, 34, 35, 18, 66, 18, 66, + 18, 66, 18, 66, 18, 66, 34, 35, 54, 240, 64, 18, + 8, 240, 240, 195, 66, 33, 34, 50, 18, 50, 23, 18, + 98, 114, 116, 240, 48, 16, 6, 131, 34, 66, 66, 53, + 34, 66, 66, 66, 66, 66, 66, 66, 240, 23, 9, 0, + 5, 118, 34, 35, 18, 66, 18, 66, 18, 66, 18, 66, + 18, 66, 34, 35, 54, 98, 53, 48, 25, 8, 130, 98, + 98, 98, 102, 35, 34, 18, 50, 18, 50, 18, 50, 18, + 50, 18, 50, 18, 50, 18, 50, 240, 32, 13, 3, 50, + 162, 18, 18, 18, 18, 18, 18, 18, 18, 112, 15, 4, + 82, 226, 34, 34, 34, 34, 34, 34, 34, 34, 34, 18, + 32, 24, 8, 130, 98, 98, 98, 98, 50, 18, 34, 34, + 18, 52, 68, 66, 18, 50, 34, 34, 34, 34, 50, 240, + 32, 16, 3, 50, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 112, 32, 13, 0, 8, 22, 20, 35, + 35, 34, 18, 50, 50, 18, 50, 50, 18, 50, 50, 18, + 50, 50, 18, 50, 50, 18, 50, 50, 18, 50, 50, 240, + 192, 23, 8, 240, 240, 166, 35, 34, 18, 50, 18, 50, + 18, 50, 18, 50, 18, 50, 18, 50, 18, 50, 240, 32, + 22, 9, 0, 5, 116, 66, 34, 34, 66, 18, 66, 18, + 66, 18, 66, 18, 66, 34, 34, 68, 240, 96, 23, 9, + 240, 240, 246, 51, 34, 34, 66, 18, 66, 18, 66, 18, + 66, 18, 66, 19, 34, 38, 50, 114, 112, 22, 9, 0, + 5, 118, 34, 35, 18, 66, 18, 66, 18, 66, 18, 66, + 18, 66, 34, 35, 54, 114, 114, 14, 6, 240, 245, 21, + 18, 66, 66, 66, 66, 66, 66, 240, 16, 15, 7, 240, + 240, 100, 34, 82, 84, 68, 83, 82, 82, 21, 240, 16, + 15, 6, 240, 66, 66, 53, 34, 66, 66, 66, 66, 66, + 68, 51, 208, 23, 8, 240, 240, 162, 50, 18, 50, 18, + 50, 18, 50, 18, 50, 18, 50, 18, 50, 18, 35, 38, + 240, 32, 20, 9, 240, 240, 242, 66, 33, 50, 50, 34, + 50, 34, 65, 18, 84, 84, 98, 114, 240, 112, 32, 14, + 0, 8, 98, 66, 65, 18, 51, 50, 34, 35, 50, 34, + 36, 33, 50, 18, 18, 18, 68, 33, 18, 68, 35, 83, + 51, 98, 66, 240, 240, 16, 20, 9, 0, 5, 98, 35, + 34, 34, 68, 99, 98, 100, 82, 18, 50, 34, 34, 66, + 240, 64, 21, 8, 240, 240, 162, 50, 34, 34, 34, 34, + 34, 18, 65, 18, 67, 83, 98, 97, 98, 82, 80, 15, + 8, 240, 240, 167, 83, 82, 83, 67, 67, 82, 83, 87, + 240, 32, 17, 5, 114, 34, 50, 50, 50, 50, 50, 34, + 66, 50, 50, 50, 50, 50, 66, 17, 3, 50, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 64, + 18, 6, 99, 82, 66, 66, 66, 66, 66, 82, 50, 66, + 66, 66, 66, 66, 35, 48, 11, 8, 0, 7, 3, 49, + 17, 36, 0, 7, 16, + 0, 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8d, 0x01, 0x00, 0x00, // Offset 397 (0x18d) + 0x9e, 0x01, 0x00, 0x00, // Offset 414 (0x19e) + 0xb0, 0x01, 0x00, 0x00, // Offset 432 (0x1b0) + 0xbd, 0x01, 0x00, 0x00, // Offset 445 (0x1bd) + 0xd1, 0x01, 0x00, 0x00, // Offset 465 (0x1d1) + 0xe4, 0x01, 0x00, 0x00, // Offset 484 (0x1e4) + 0xf1, 0x01, 0x00, 0x00, // Offset 497 (0x1f1) + 0x02, 0x02, 0x00, 0x00, // Offset 514 (0x202) + 0x10, 0x02, 0x00, 0x00, // Offset 528 (0x210) + 0x23, 0x02, 0x00, 0x00, // Offset 547 (0x223) + 0x39, 0x02, 0x00, 0x00, // Offset 569 (0x239) + 0x4f, 0x02, 0x00, 0x00, // Offset 591 (0x24f) + 0x64, 0x02, 0x00, 0x00, // Offset 612 (0x264) + 0x76, 0x02, 0x00, 0x00, // Offset 630 (0x276) + 0x88, 0x02, 0x00, 0x00, // Offset 648 (0x288) + 0x9c, 0x02, 0x00, 0x00, // Offset 668 (0x29c) + 0xad, 0x02, 0x00, 0x00, // Offset 685 (0x2ad) + 0xbe, 0x02, 0x00, 0x00, // Offset 702 (0x2be) + 0xd9, 0x02, 0x00, 0x00, // Offset 729 (0x2d9) + 0xf2, 0x02, 0x00, 0x00, // Offset 754 (0x2f2) + 0x02, 0x03, 0x00, 0x00, // Offset 770 (0x302) + 0x16, 0x03, 0x00, 0x00, // Offset 790 (0x316) + 0x27, 0x03, 0x00, 0x00, // Offset 807 (0x327) + 0x36, 0x03, 0x00, 0x00, // Offset 822 (0x336) + 0x49, 0x03, 0x00, 0x00, // Offset 841 (0x349) + 0x58, 0x03, 0x00, 0x00, // Offset 856 (0x358) + 0x65, 0x03, 0x00, 0x00, // Offset 869 (0x365) + 0x72, 0x03, 0x00, 0x00, // Offset 882 (0x372) + 0x82, 0x03, 0x00, 0x00, // Offset 898 (0x382) + 0x93, 0x03, 0x00, 0x00, // Offset 915 (0x393) + 0xa5, 0x03, 0x00, 0x00, // Offset 933 (0x3a5) + 0xc4, 0x03, 0x00, 0x00, // Offset 964 (0x3c4) + 0xd6, 0x03, 0x00, 0x00, // Offset 982 (0x3d6) + 0xf4, 0x03, 0x00, 0x00, // Offset 1012 (0x3f4) + 0x06, 0x04, 0x00, 0x00, // Offset 1030 (0x406) + 0x26, 0x04, 0x00, 0x00, // Offset 1062 (0x426) + 0x38, 0x04, 0x00, 0x00, // Offset 1080 (0x438) + 0x58, 0x04, 0x00, 0x00, // Offset 1112 (0x458) + 0x64, 0x04, 0x00, 0x00, // Offset 1124 (0x464) + 0x7b, 0x04, 0x00, 0x00, // Offset 1147 (0x47b) + 0x9f, 0x04, 0x00, 0x00, // Offset 1183 (0x49f) + 0xb6, 0x04, 0x00, 0x00, // Offset 1206 (0x4b6) + 0xc6, 0x04, 0x00, 0x00, // Offset 1222 (0x4c6) + 0xd3, 0x04, 0x00, 0x00, // Offset 1235 (0x4d3) + 0xeb, 0x04, 0x00, 0x00, // Offset 1259 (0x4eb) + 0x12, 0x05, 0x00, 0x00, // Offset 1298 (0x512) + 0x2a, 0x05, 0x00, 0x00, // Offset 1322 (0x52a) + 0x3e, 0x05, 0x00, 0x00, // Offset 1342 (0x53e) + 0x46, 0x05, 0x00, 0x00, // Offset 1350 (0x546) + 0x59, 0x05, 0x00, 0x00, // Offset 1369 (0x559) + 0x6b, 0x05, 0x00, 0x00, // Offset 1387 (0x56b) + 0x6f, 0x05, 0x00, 0x00, // Offset 1391 (0x56f) + 0x7e, 0x05, 0x00, 0x00, // Offset 1406 (0x57e) + 0x8f, 0x05, 0x00, 0x00, // Offset 1423 (0x58f) + 0xa2, 0x05, 0x00, 0x00, // Offset 1442 (0x5a2) + 0xb6, 0x05, 0x00, 0x00, // Offset 1462 (0x5b6) + 0xce, 0x05, 0x00, 0x00, // Offset 1486 (0x5ce) + 0xe0, 0x05, 0x00, 0x00, // Offset 1504 (0x5e0) + 0xf7, 0x05, 0x00, 0x00, // Offset 1527 (0x5f7) + 0x0c, 0x06, 0x00, 0x00, // Offset 1548 (0x60c) + 0x20, 0x06, 0x00, 0x00, // Offset 1568 (0x620) + 0x3b, 0x06, 0x00, 0x00, // Offset 1595 (0x63b) + 0x54, 0x06, 0x00, 0x00, // Offset 1620 (0x654) + 0x6c, 0x06, 0x00, 0x00, // Offset 1644 (0x66c) + 0x81, 0x06, 0x00, 0x00, // Offset 1665 (0x681) + 0x98, 0x06, 0x00, 0x00, // Offset 1688 (0x698) + 0xaf, 0x06, 0x00, 0x00, // Offset 1711 (0x6af) + 0xcc, 0x06, 0x00, 0x00, // Offset 1740 (0x6cc) + 0xe7, 0x06, 0x00, 0x00, // Offset 1767 (0x6e7) + 0xff, 0x06, 0x00, 0x00, // Offset 1791 (0x6ff) + 0x16, 0x07, 0x00, 0x00, // Offset 1814 (0x716) + 0x2c, 0x07, 0x00, 0x00, // Offset 1836 (0x72c) + 0x48, 0x07, 0x00, 0x00, // Offset 1864 (0x748) + 0x5c, 0x07, 0x00, 0x00, // Offset 1884 (0x75c) + 0x70, 0x07, 0x00, 0x00, // Offset 1904 (0x770) + 0x84, 0x07, 0x00, 0x00, // Offset 1924 (0x784) + 0x9d, 0x07, 0x00, 0x00, // Offset 1949 (0x79d) + 0xb2, 0x07, 0x00, 0x00, // Offset 1970 (0x7b2) + 0xc3, 0x07, 0x00, 0x00, // Offset 1987 (0x7c3) + 0xda, 0x07, 0x00, 0x00, // Offset 2010 (0x7da) + 0xeb, 0x07, 0x00, 0x00, // Offset 2027 (0x7eb) + 0x02, 0x08, 0x00, 0x00, // Offset 2050 (0x802) + 0x1a, 0x08, 0x00, 0x00, // Offset 2074 (0x81a) + 0x2f, 0x08, 0x00, 0x00, // Offset 2095 (0x82f) + 0x48, 0x08, 0x00, 0x00, // Offset 2120 (0x848) + 0x58, 0x08, 0x00, 0x00, // Offset 2136 (0x858) + 0x71, 0x08, 0x00, 0x00, // Offset 2161 (0x871) + 0x95, 0x08, 0x00, 0x00, // Offset 2197 (0x895) + 0xaf, 0x08, 0x00, 0x00, // Offset 2223 (0x8af) + 0xcd, 0x08, 0x00, 0x00, // Offset 2253 (0x8cd) + 0xf8, 0x08, 0x00, 0x00, // Offset 2296 (0x8f8) + 0x16, 0x09, 0x00, 0x00, // Offset 2326 (0x916) + 0x1d, 0x09, 0x00, 0x00, // Offset 2333 (0x91d) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 13, 10, 0, 6, 41, 130, 130, 130, 130, 130, 0, 6, + 48, 17, 11, 0, 6, 122, 66, 50, 66, 50, 66, 50, + 66, 50, 66, 50, 0, 7, 18, 14, 0, 8, 102, 50, + 114, 50, 114, 36, 98, 21, 101, 34, 129, 0, 9, 64, + 13, 10, 0, 6, 34, 130, 130, 130, 130, 137, 0, 6, + 48, 20, 13, 0, 8, 18, 69, 34, 114, 34, 98, 50, + 83, 50, 69, 37, 18, 34, 0, 8, 32, 19, 12, 0, + 8, 36, 34, 54, 18, 162, 68, 34, 50, 34, 23, 34, + 116, 0, 6, 32, 13, 10, 0, 6, 41, 18, 130, 130, + 130, 137, 0, 6, 48, 17, 12, 0, 7, 75, 18, 50, + 82, 50, 82, 50, 82, 50, 91, 0, 7, 80, 14, 10, + 0, 6, 41, 130, 130, 25, 18, 130, 137, 240, 240, 176, + 19, 12, 0, 7, 69, 21, 66, 66, 66, 66, 21, 66, + 18, 114, 22, 50, 0, 7, 80, 22, 12, 0, 7, 69, + 21, 66, 18, 18, 66, 18, 18, 21, 18, 18, 18, 66, + 18, 27, 0, 7, 80, 22, 12, 0, 7, 69, 18, 18, + 66, 18, 18, 66, 21, 21, 18, 18, 18, 66, 18, 27, + 0, 7, 80, 21, 14, 0, 8, 101, 50, 114, 50, 114, + 50, 69, 36, 50, 67, 18, 37, 18, 35, 0, 8, 112, + 18, 12, 0, 7, 69, 21, 66, 18, 114, 18, 69, 21, + 18, 66, 75, 0, 7, 80, 18, 14, 0, 8, 101, 23, + 66, 36, 98, 36, 53, 36, 50, 84, 61, 0, 8, 112, + 20, 13, 0, 8, 21, 36, 82, 22, 66, 133, 36, 34, + 66, 34, 24, 34, 132, 0, 6, 96, 17, 10, 0, 6, + 41, 18, 82, 18, 82, 18, 82, 18, 82, 25, 0, 6, + 48, 17, 10, 0, 6, 34, 82, 18, 82, 25, 18, 82, + 18, 82, 25, 0, 6, 48, 27, 12, 0, 7, 66, 18, + 18, 18, 18, 18, 18, 18, 21, 21, 18, 18, 18, 18, + 18, 18, 18, 18, 21, 21, 0, 7, 80, 25, 13, 0, + 8, 18, 18, 50, 50, 18, 50, 53, 50, 50, 18, 36, + 34, 18, 18, 34, 21, 17, 65, 0, 8, 32, 16, 12, + 0, 8, 18, 147, 147, 130, 18, 83, 51, 35, 83, 0, + 7, 80, 20, 12, 0, 7, 114, 34, 98, 34, 98, 34, + 87, 66, 37, 34, 50, 34, 82, 0, 6, 96, 17, 10, + 0, 6, 69, 51, 50, 34, 82, 18, 82, 19, 50, 69, + 0, 6, 80, 15, 12, 0, 7, 89, 147, 115, 118, 53, + 36, 18, 129, 0, 7, 80, 19, 12, 0, 7, 84, 20, + 82, 50, 67, 34, 69, 19, 34, 51, 18, 82, 0, 8, + 32, 15, 12, 0, 6, 53, 240, 233, 131, 116, 75, 18, + 129, 0, 6, 16, 13, 10, 0, 6, 41, 130, 130, 25, + 130, 130, 0, 6, 48, 13, 10, 0, 6, 41, 18, 130, + 137, 18, 137, 0, 6, 48, 16, 11, 0, 6, 121, 66, + 34, 82, 34, 82, 34, 82, 34, 58, 0, 7, 17, 10, + 240, 240, 37, 217, 213, 66, 50, 50, 50, 50, 50, 69, + 240, 240, 208, 18, 5, 2, 50, 50, 50, 50, 50, 52, + 18, 50, 50, 50, 50, 50, 50, 50, 128, 31, 6, 50, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 21, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 112, 18, 5, 2, 50, 50, 50, 52, 18, + 50, 50, 50, 52, 18, 50, 50, 50, 50, 128, 30, 6, + 50, 18, 18, 18, 18, 18, 18, 18, 18, 21, 18, 18, + 18, 18, 21, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 112, 18, 6, 50, 66, 66, 66, 66, 66, + 66, 21, 66, 66, 66, 66, 66, 66, 66, 112, 32, 9, + 98, 66, 18, 66, 18, 66, 18, 66, 18, 66, 18, 21, + 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, + 18, 66, 18, 66, 18, 160, 18, 6, 50, 66, 66, 66, + 21, 66, 66, 66, 21, 66, 66, 66, 66, 66, 66, 112, + 32, 8, 82, 50, 18, 50, 18, 50, 18, 50, 18, 20, + 18, 50, 18, 50, 18, 50, 18, 20, 18, 50, 18, 50, + 18, 50, 18, 50, 18, 50, 18, 144, 12, 16, 0, 14, + 98, 226, 226, 226, 143, 0, 8, 16, 23, 15, 162, 210, + 210, 210, 210, 210, 210, 114, 68, 82, 66, 114, 66, 114, + 66, 60, 210, 210, 210, 240, 48, 36, 15, 194, 162, 18, + 162, 18, 162, 18, 162, 18, 162, 18, 162, 18, 82, 53, + 82, 50, 18, 82, 50, 18, 82, 50, 18, 27, 18, 162, + 18, 162, 18, 162, 18, 240, 16, 23, 14, 178, 194, 194, + 194, 194, 194, 194, 82, 82, 82, 82, 82, 82, 82, 82, + 26, 18, 194, 194, 194, 240, 16, 16, 0, 14, 66, 50, + 146, 50, 146, 50, 146, 50, 95, 0, 8, 16, 13, 16, + 0, 12, 15, 114, 226, 226, 226, 226, 226, 0, 7, 24, + 14, 178, 194, 194, 194, 194, 194, 194, 194, 194, 26, 18, + 82, 82, 82, 37, 82, 82, 82, 82, 82, 82, 240, 39, + 15, 194, 162, 18, 162, 18, 162, 18, 162, 18, 162, 18, + 162, 18, 162, 18, 162, 18, 24, 18, 18, 66, 66, 18, + 66, 36, 18, 66, 66, 18, 66, 66, 18, 66, 66, 18, + 240, 16, 24, 14, 178, 194, 194, 194, 194, 194, 194, 194, + 194, 26, 18, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 240, 20, 16, 0, 12, 15, 82, 50, 146, 50, 146, + 50, 146, 50, 146, 50, 146, 50, 0, 6, 80, 8, 16, + 0, 16, 15, 0, 14, 16, 19, 14, 178, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 26, 18, 194, 194, 194, + 240, 18, 3, 2, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 64, 4, 17, 0, 34, 15, + 11, 0, 8, 34, 50, 66, 50, 66, 50, 66, 50, 74, + 0, 7, 17, 11, 0, 6, 114, 53, 18, 50, 66, 50, + 66, 50, 66, 50, 74, 0, 7, 19, 13, 0, 8, 18, + 82, 66, 82, 66, 82, 66, 68, 50, 54, 39, 35, 0, + 8, 32, 20, 12, 0, 7, 66, 81, 66, 82, 50, 67, + 50, 65, 18, 34, 50, 33, 43, 0, 7, 80, 24, 15, + 0, 9, 56, 34, 82, 34, 34, 82, 34, 34, 52, 34, + 35, 34, 66, 20, 37, 20, 34, 0, 9, 64, 18, 12, + 0, 7, 69, 21, 66, 18, 114, 18, 69, 18, 66, 66, + 75, 0, 7, 80, 23, 15, 0, 9, 52, 20, 18, 82, + 20, 18, 82, 20, 18, 52, 20, 19, 34, 56, 42, 34, + 0, 9, 64, 21, 13, 0, 8, 21, 65, 98, 50, 98, + 51, 37, 34, 17, 34, 81, 34, 21, 22, 0, 8, 32, + 20, 13, 0, 8, 21, 22, 66, 178, 36, 37, 18, 34, + 18, 66, 34, 22, 20, 0, 8, 48, 27, 12, 0, 7, + 69, 18, 18, 18, 18, 18, 18, 18, 18, 21, 18, 18, + 18, 18, 18, 18, 18, 18, 21, 21, 0, 7, 80, 25, + 14, 0, 8, 101, 50, 66, 18, 50, 66, 18, 50, 66, + 18, 36, 50, 18, 19, 18, 37, 18, 50, 0, 8, 112, + 24, 12, 0, 7, 69, 49, 50, 18, 34, 50, 18, 35, + 34, 18, 18, 17, 34, 18, 17, 34, 27, 0, 7, 80, + 21, 11, 240, 240, 58, 18, 98, 18, 98, 18, 98, 26, + 240, 180, 98, 34, 82, 34, 100, 240, 176, 23, 12, 0, + 7, 66, 18, 21, 18, 18, 66, 21, 66, 18, 18, 66, + 18, 18, 66, 21, 66, 0, 7, 80, 23, 12, 0, 7, + 66, 18, 21, 18, 18, 18, 69, 18, 66, 18, 18, 66, + 18, 18, 69, 21, 0, 7, 80, 29, 13, 0, 8, 17, + 33, 18, 20, 17, 33, 18, 50, 20, 18, 50, 17, 33, + 19, 34, 17, 35, 18, 18, 21, 49, 18, 0, 8, 32, + 27, 13, 0, 8, 17, 33, 18, 35, 17, 33, 18, 33, + 52, 18, 33, 49, 33, 19, 17, 49, 35, 19, 53, 52, + 0, 8, 32, 24, 13, 0, 8, 18, 18, 21, 34, 18, + 66, 37, 50, 50, 18, 35, 50, 18, 22, 21, 18, 34, + 0, 8, 32, 23, 12, 0, 7, 66, 18, 21, 18, 18, + 18, 69, 18, 66, 18, 21, 18, 18, 18, 69, 21, 0, + 7, 80, 22, 11, 240, 114, 98, 18, 98, 26, 18, 98, + 18, 98, 26, 240, 180, 98, 34, 82, 34, 100, 240, 176, + 28, 13, 240, 178, 36, 34, 18, 36, 34, 28, 18, 36, + 34, 18, 36, 34, 28, 240, 240, 20, 130, 34, 114, 34, + 132, 240, 240, 16, 20, 11, 0, 7, 18, 21, 50, 66, + 51, 50, 36, 50, 18, 35, 18, 17, 65, 34, 0, 7, + 20, 13, 0, 8, 50, 50, 98, 50, 98, 50, 84, 34, + 84, 34, 66, 40, 97, 0, 7, 48, 20, 13, 0, 8, + 50, 53, 50, 50, 98, 50, 84, 34, 67, 18, 18, 66, + 55, 0, 8, 32, 25, 13, 0, 8, 50, 50, 18, 50, + 50, 18, 50, 53, 36, 34, 18, 19, 18, 18, 18, 18, + 49, 21, 0, 8, 32, 21, 13, 0, 8, 50, 37, 66, + 82, 67, 50, 68, 36, 34, 36, 34, 17, 81, 65, 0, + 8, 32, 17, 10, 240, 240, 225, 131, 115, 98, 18, 82, + 33, 66, 50, 41, 0, 6, 48, 23, 15, 0, 9, 83, + 67, 51, 37, 19, 18, 52, 50, 18, 52, 50, 19, 22, + 19, 51, 67, 0, 9, 96, 17, 9, 240, 242, 114, 86, + 35, 35, 18, 66, 18, 66, 34, 34, 68, 0, 6, 23, + 14, 0, 9, 2, 82, 69, 50, 50, 50, 34, 50, 50, + 20, 34, 52, 34, 37, 17, 65, 0, 8, 112, 24, 14, + 0, 9, 2, 81, 84, 51, 50, 34, 35, 50, 34, 18, + 18, 34, 34, 18, 33, 52, 23, 0, 8, 112, 21, 12, + 240, 154, 66, 50, 82, 50, 82, 50, 59, 240, 240, 179, + 130, 18, 114, 18, 131, 240, 224, 25, 14, 0, 7, 20, + 52, 240, 22, 22, 240, 20, 52, 34, 34, 18, 34, 18, + 34, 18, 34, 36, 52, 0, 7, 32, 16, 10, 0, 6, + 41, 213, 66, 50, 50, 50, 50, 50, 69, 240, 240, 208, + 25, 16, 178, 226, 226, 226, 226, 226, 228, 194, 98, 18, + 50, 98, 18, 52, 66, 18, 35, 61, 226, 226, 226, 240, + 64, 36, 15, 194, 162, 18, 162, 18, 162, 18, 162, 18, + 165, 162, 18, 162, 18, 50, 18, 37, 50, 18, 37, 50, + 18, 34, 18, 27, 18, 162, 18, 162, 18, 162, 18, 240, + 16, 26, 14, 178, 194, 194, 194, 194, 194, 194, 194, 50, + 18, 66, 50, 18, 66, 50, 18, 33, 18, 26, 18, 194, + 194, 194, 240, 30, 15, 194, 210, 210, 210, 210, 210, 210, + 210, 210, 27, 18, 50, 18, 82, 50, 18, 37, 50, 18, + 82, 50, 18, 37, 50, 18, 82, 240, 16, 43, 15, 194, + 162, 18, 162, 18, 162, 18, 162, 18, 162, 18, 162, 18, + 162, 18, 27, 18, 34, 18, 50, 18, 34, 18, 20, 18, + 34, 18, 50, 18, 34, 18, 20, 18, 34, 18, 50, 18, + 162, 18, 240, 16, 30, 15, 194, 210, 210, 210, 210, 210, + 210, 210, 210, 27, 18, 66, 18, 66, 66, 18, 66, 66, + 18, 66, 66, 18, 66, 66, 18, 66, 240, 16, 7, 4, + 240, 211, 19, 240, 224, 20, 7, 66, 82, 82, 82, 82, + 82, 82, 18, 34, 18, 34, 82, 82, 82, 82, 82, 82, + 128, + 0, 0, 0, // Padding + +}; + +tFont *g_psFontWHangulgothic16ptb = (tFont *)g_pui8Hangulgothic16ptb; diff --git a/third_party/fonts/ofl/fonts/fonthangulgothic18pt.c b/third_party/fonts/ofl/fonts/fonthangulgothic18pt.c new file mode 100644 index 0000000..0044d1a --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulgothic18pt.c @@ -0,0 +1,764 @@ +//***************************************************************************** +// +// fonthangulgothic18pt.c - Font definition for the 18ptpt Hangulgothic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulgothic +// Size: 18pt +// Bold: no +// Italic: no +// Memory usage: 5316 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulgothic18pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 17, + + // + // The height of the font. + // + 18, + + // + // The baseline of the font. + // + 15, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x00, 0x0a, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x8f, 0x01, 0x00, 0x00, // Offset 399 (0x18f) + 0x9b, 0x01, 0x00, 0x00, // Offset 411 (0x19b) + 0xb9, 0x01, 0x00, 0x00, // Offset 441 (0x1b9) + 0xd4, 0x01, 0x00, 0x00, // Offset 468 (0x1d4) + 0xff, 0x01, 0x00, 0x00, // Offset 511 (0x1ff) + 0x21, 0x02, 0x00, 0x00, // Offset 545 (0x221) + 0x29, 0x02, 0x00, 0x00, // Offset 553 (0x229) + 0x3c, 0x02, 0x00, 0x00, // Offset 572 (0x23c) + 0x50, 0x02, 0x00, 0x00, // Offset 592 (0x250) + 0x61, 0x02, 0x00, 0x00, // Offset 609 (0x261) + 0x71, 0x02, 0x00, 0x00, // Offset 625 (0x271) + 0x7a, 0x02, 0x00, 0x00, // Offset 634 (0x27a) + 0x82, 0x02, 0x00, 0x00, // Offset 642 (0x282) + 0x89, 0x02, 0x00, 0x00, // Offset 649 (0x289) + 0x9c, 0x02, 0x00, 0x00, // Offset 668 (0x29c) + 0xba, 0x02, 0x00, 0x00, // Offset 698 (0x2ba) + 0xcc, 0x02, 0x00, 0x00, // Offset 716 (0x2cc) + 0xdf, 0x02, 0x00, 0x00, // Offset 735 (0x2df) + 0xf2, 0x02, 0x00, 0x00, // Offset 754 (0x2f2) + 0x0c, 0x03, 0x00, 0x00, // Offset 780 (0x30c) + 0x1e, 0x03, 0x00, 0x00, // Offset 798 (0x31e) + 0x38, 0x03, 0x00, 0x00, // Offset 824 (0x338) + 0x4a, 0x03, 0x00, 0x00, // Offset 842 (0x34a) + 0x67, 0x03, 0x00, 0x00, // Offset 871 (0x367) + 0x81, 0x03, 0x00, 0x00, // Offset 897 (0x381) + 0x89, 0x03, 0x00, 0x00, // Offset 905 (0x389) + 0x94, 0x03, 0x00, 0x00, // Offset 916 (0x394) + 0xa7, 0x03, 0x00, 0x00, // Offset 935 (0x3a7) + 0xb2, 0x03, 0x00, 0x00, // Offset 946 (0x3b2) + 0xc6, 0x03, 0x00, 0x00, // Offset 966 (0x3c6) + 0xd7, 0x03, 0x00, 0x00, // Offset 983 (0x3d7) + 0x04, 0x04, 0x00, 0x00, // Offset 1028 (0x404) + 0x22, 0x04, 0x00, 0x00, // Offset 1058 (0x422) + 0x3e, 0x04, 0x00, 0x00, // Offset 1086 (0x43e) + 0x51, 0x04, 0x00, 0x00, // Offset 1105 (0x451) + 0x6f, 0x04, 0x00, 0x00, // Offset 1135 (0x46f) + 0x81, 0x04, 0x00, 0x00, // Offset 1153 (0x481) + 0x93, 0x04, 0x00, 0x00, // Offset 1171 (0x493) + 0xac, 0x04, 0x00, 0x00, // Offset 1196 (0x4ac) + 0xca, 0x04, 0x00, 0x00, // Offset 1226 (0x4ca) + 0xda, 0x04, 0x00, 0x00, // Offset 1242 (0x4da) + 0xeb, 0x04, 0x00, 0x00, // Offset 1259 (0x4eb) + 0x09, 0x05, 0x00, 0x00, // Offset 1289 (0x509) + 0x1a, 0x05, 0x00, 0x00, // Offset 1306 (0x51a) + 0x4f, 0x05, 0x00, 0x00, // Offset 1359 (0x54f) + 0x78, 0x05, 0x00, 0x00, // Offset 1400 (0x578) + 0x96, 0x05, 0x00, 0x00, // Offset 1430 (0x596) + 0xad, 0x05, 0x00, 0x00, // Offset 1453 (0x5ad) + 0xcc, 0x05, 0x00, 0x00, // Offset 1484 (0x5cc) + 0xe9, 0x05, 0x00, 0x00, // Offset 1513 (0x5e9) + 0xfc, 0x05, 0x00, 0x00, // Offset 1532 (0x5fc) + 0x0e, 0x06, 0x00, 0x00, // Offset 1550 (0x60e) + 0x2d, 0x06, 0x00, 0x00, // Offset 1581 (0x62d) + 0x4b, 0x06, 0x00, 0x00, // Offset 1611 (0x64b) + 0x80, 0x06, 0x00, 0x00, // Offset 1664 (0x680) + 0x9d, 0x06, 0x00, 0x00, // Offset 1693 (0x69d) + 0xb6, 0x06, 0x00, 0x00, // Offset 1718 (0x6b6) + 0xc8, 0x06, 0x00, 0x00, // Offset 1736 (0x6c8) + 0xdb, 0x06, 0x00, 0x00, // Offset 1755 (0x6db) + 0x0a, 0x07, 0x00, 0x00, // Offset 1802 (0x70a) + 0x1d, 0x07, 0x00, 0x00, // Offset 1821 (0x71d) + 0x32, 0x07, 0x00, 0x00, // Offset 1842 (0x732) + 0x37, 0x07, 0x00, 0x00, // Offset 1847 (0x737) + 0x3e, 0x07, 0x00, 0x00, // Offset 1854 (0x73e) + 0x53, 0x07, 0x00, 0x00, // Offset 1875 (0x753) + 0x70, 0x07, 0x00, 0x00, // Offset 1904 (0x770) + 0x80, 0x07, 0x00, 0x00, // Offset 1920 (0x780) + 0x9d, 0x07, 0x00, 0x00, // Offset 1949 (0x79d) + 0xb0, 0x07, 0x00, 0x00, // Offset 1968 (0x7b0) + 0xc1, 0x07, 0x00, 0x00, // Offset 1985 (0x7c1) + 0xdc, 0x07, 0x00, 0x00, // Offset 2012 (0x7dc) + 0xf9, 0x07, 0x00, 0x00, // Offset 2041 (0x7f9) + 0x07, 0x08, 0x00, 0x00, // Offset 2055 (0x807) + 0x17, 0x08, 0x00, 0x00, // Offset 2071 (0x817) + 0x33, 0x08, 0x00, 0x00, // Offset 2099 (0x833) + 0x44, 0x08, 0x00, 0x00, // Offset 2116 (0x844) + 0x68, 0x08, 0x00, 0x00, // Offset 2152 (0x868) + 0x82, 0x08, 0x00, 0x00, // Offset 2178 (0x882) + 0x9a, 0x08, 0x00, 0x00, // Offset 2202 (0x89a) + 0xb5, 0x08, 0x00, 0x00, // Offset 2229 (0x8b5) + 0xcf, 0x08, 0x00, 0x00, // Offset 2255 (0x8cf) + 0xe0, 0x08, 0x00, 0x00, // Offset 2272 (0x8e0) + 0xf0, 0x08, 0x00, 0x00, // Offset 2288 (0x8f0) + 0x01, 0x09, 0x00, 0x00, // Offset 2305 (0x901) + 0x1b, 0x09, 0x00, 0x00, // Offset 2331 (0x91b) + 0x33, 0x09, 0x00, 0x00, // Offset 2355 (0x933) + 0x5b, 0x09, 0x00, 0x00, // Offset 2395 (0x95b) + 0x73, 0x09, 0x00, 0x00, // Offset 2419 (0x973) + 0x8a, 0x09, 0x00, 0x00, // Offset 2442 (0x98a) + 0x9a, 0x09, 0x00, 0x00, // Offset 2458 (0x99a) + 0xad, 0x09, 0x00, 0x00, // Offset 2477 (0x9ad) + 0xbf, 0x09, 0x00, 0x00, // Offset 2495 (0x9bf) + 0xd3, 0x09, 0x00, 0x00, // Offset 2515 (0x9d3) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 7, 0, 15, 96, 14, 2, 97, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 81, 80, 12, 5, 241, 33, 17, + 33, 17, 33, 17, 33, 0, 7, 30, 10, 240, 240, 49, + 49, 81, 49, 81, 34, 81, 33, 57, 49, 49, 81, 49, + 81, 49, 57, 49, 34, 81, 33, 82, 33, 82, 33, 240, + 144, 27, 8, 177, 113, 101, 33, 17, 65, 33, 65, 33, + 66, 17, 83, 114, 99, 81, 33, 65, 33, 65, 33, 65, + 17, 37, 97, 192, 43, 16, 240, 240, 209, 84, 82, 65, + 50, 65, 81, 65, 49, 97, 65, 49, 98, 34, 33, 132, + 34, 225, 36, 130, 18, 34, 113, 33, 65, 97, 49, 65, + 97, 49, 65, 81, 66, 34, 81, 84, 240, 240, 64, 34, + 12, 240, 240, 148, 114, 49, 97, 65, 97, 65, 98, 34, + 115, 131, 81, 33, 49, 65, 17, 81, 34, 17, 97, 17, + 33, 114, 49, 66, 17, 69, 49, 240, 160, 8, 2, 97, + 17, 17, 17, 240, 128, 19, 5, 129, 49, 49, 65, 65, + 49, 65, 65, 65, 65, 65, 65, 81, 65, 65, 81, 81, + 20, 5, 81, 81, 81, 65, 65, 81, 65, 65, 65, 65, + 65, 65, 49, 65, 50, 49, 49, 64, 17, 8, 0, 6, + 49, 113, 66, 17, 18, 51, 81, 17, 66, 18, 0, 6, + 32, 16, 11, 0, 7, 49, 161, 161, 161, 106, 81, 161, + 161, 161, 0, 6, 32, 9, 4, 0, 7, 33, 34, 33, + 34, 32, 8, 6, 0, 6, 5, 0, 6, 112, 7, 3, + 240, 240, 242, 18, 64, 19, 8, 240, 226, 97, 113, 98, + 97, 98, 97, 113, 98, 97, 113, 98, 97, 113, 97, 112, + 30, 10, 240, 240, 37, 66, 50, 49, 81, 33, 113, 17, + 113, 17, 113, 17, 113, 17, 113, 17, 113, 17, 113, 33, + 81, 50, 50, 69, 240, 128, 18, 5, 240, 34, 35, 18, + 17, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 176, + 19, 9, 240, 213, 49, 66, 129, 129, 129, 113, 129, 113, + 113, 113, 113, 114, 120, 240, 64, 19, 9, 240, 213, 146, + 129, 129, 129, 98, 68, 145, 145, 129, 129, 17, 81, 38, + 240, 96, 26, 11, 240, 240, 146, 131, 114, 17, 113, 33, + 98, 33, 82, 49, 81, 65, 65, 81, 50, 81, 58, 129, + 161, 161, 240, 160, 18, 9, 240, 199, 33, 129, 129, 129, + 134, 145, 145, 129, 129, 129, 98, 38, 240, 96, 26, 10, + 240, 240, 54, 50, 113, 145, 129, 145, 21, 50, 81, 33, + 113, 17, 113, 17, 113, 17, 113, 33, 81, 69, 240, 128, + 18, 9, 240, 200, 114, 113, 129, 114, 113, 114, 113, 114, + 113, 114, 113, 129, 240, 144, 29, 10, 240, 240, 52, 66, + 50, 49, 81, 49, 81, 50, 50, 66, 18, 99, 82, 50, + 33, 113, 17, 113, 17, 113, 33, 81, 69, 240, 128, 26, + 10, 240, 240, 37, 65, 66, 33, 97, 33, 113, 17, 113, + 17, 113, 33, 82, 53, 17, 145, 130, 129, 129, 69, 240, + 144, 8, 3, 194, 18, 240, 66, 18, 208, 11, 4, 240, + 34, 34, 240, 178, 33, 49, 34, 160, 19, 9, 240, 161, + 114, 98, 98, 98, 98, 98, 98, 129, 145, 145, 145, 145, + 145, 145, 160, 11, 11, 0, 9, 90, 240, 240, 74, 0, + 8, 48, 20, 9, 240, 49, 130, 130, 130, 130, 130, 130, + 130, 113, 113, 113, 113, 113, 113, 113, 240, 32, 17, 7, + 240, 100, 113, 113, 97, 97, 81, 97, 81, 81, 97, 240, + 81, 240, 48, 45, 15, 0, 6, 22, 114, 98, 66, 51, + 49, 49, 34, 50, 33, 17, 49, 66, 33, 17, 33, 82, + 33, 17, 33, 81, 49, 17, 33, 66, 33, 33, 33, 51, + 18, 49, 35, 19, 82, 145, 66, 98, 118, 240, 240, 80, + 30, 13, 240, 240, 226, 161, 17, 161, 17, 146, 33, 129, + 49, 129, 50, 97, 81, 97, 82, 73, 65, 113, 50, 114, + 33, 145, 33, 146, 240, 192, 28, 9, 240, 197, 65, 66, + 33, 81, 33, 81, 33, 81, 33, 65, 53, 65, 66, 33, + 97, 17, 97, 17, 97, 17, 81, 38, 240, 96, 19, 11, + 240, 240, 118, 50, 130, 145, 145, 161, 161, 161, 161, 177, + 162, 162, 182, 240, 128, 30, 11, 240, 240, 54, 81, 82, + 49, 113, 33, 113, 33, 129, 17, 129, 17, 129, 17, 129, + 17, 129, 17, 113, 33, 98, 33, 82, 54, 240, 192, 18, + 8, 240, 151, 17, 113, 113, 113, 113, 118, 33, 113, 113, + 113, 113, 119, 240, 32, 18, 7, 240, 102, 17, 97, 97, + 97, 97, 102, 17, 97, 97, 97, 97, 97, 240, 80, 25, + 12, 240, 240, 166, 66, 146, 146, 161, 177, 177, 85, 17, + 145, 17, 145, 33, 129, 34, 113, 50, 97, 86, 240, 176, + 30, 10, 240, 241, 113, 17, 113, 17, 113, 17, 113, 17, + 113, 17, 113, 25, 17, 113, 17, 113, 17, 113, 17, 113, + 17, 113, 17, 113, 240, 96, 16, 2, 97, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 80, 17, 5, + 240, 49, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 50, 19, 192, 30, 10, 240, 241, 82, 33, 81, 49, 65, + 65, 49, 81, 34, 81, 18, 100, 98, 18, 81, 50, 65, + 65, 65, 81, 49, 82, 33, 98, 240, 96, 17, 7, 240, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 102, 240, 53, 15, 240, 240, 242, 162, 19, 131, 17, 17, + 129, 17, 17, 18, 98, 17, 17, 33, 98, 17, 17, 33, + 97, 33, 17, 34, 66, 33, 17, 49, 65, 49, 17, 50, + 34, 49, 17, 65, 33, 65, 17, 66, 17, 65, 17, 82, + 81, 17, 82, 81, 240, 240, 16, 41, 11, 240, 240, 50, + 113, 19, 97, 17, 17, 97, 17, 18, 81, 17, 34, 65, + 17, 34, 65, 17, 50, 49, 17, 65, 49, 17, 66, 33, + 17, 82, 17, 17, 97, 17, 17, 99, 17, 114, 240, 128, + 30, 13, 240, 240, 198, 98, 66, 65, 129, 49, 129, 33, + 161, 17, 161, 17, 161, 17, 161, 17, 161, 18, 130, 33, + 129, 66, 66, 102, 240, 240, 23, 9, 240, 198, 49, 81, + 33, 97, 17, 97, 17, 97, 17, 81, 38, 49, 129, 129, + 129, 129, 129, 240, 176, 31, 13, 240, 240, 212, 114, 66, + 65, 129, 49, 129, 33, 161, 17, 161, 17, 161, 17, 161, + 17, 161, 18, 130, 33, 129, 66, 66, 102, 194, 194, 32, + 29, 10, 240, 246, 65, 81, 49, 97, 33, 97, 33, 97, + 33, 66, 54, 65, 65, 65, 66, 49, 81, 49, 82, 33, + 97, 33, 98, 240, 96, 19, 8, 240, 181, 18, 97, 113, + 114, 114, 130, 129, 129, 113, 113, 17, 65, 37, 240, 64, + 18, 10, 240, 249, 81, 145, 145, 145, 145, 145, 145, 145, + 145, 145, 145, 145, 240, 160, 31, 11, 240, 240, 49, 129, + 17, 129, 17, 129, 17, 129, 17, 129, 17, 129, 17, 129, + 17, 129, 17, 129, 17, 129, 18, 98, 34, 66, 84, 240, + 176, 30, 13, 240, 240, 146, 130, 33, 129, 50, 113, 65, + 97, 81, 97, 82, 66, 97, 65, 113, 65, 129, 34, 129, + 33, 148, 162, 178, 240, 240, 32, 53, 18, 0, 6, 97, + 98, 113, 17, 99, 82, 17, 97, 17, 81, 34, 66, 17, + 81, 49, 65, 33, 81, 49, 65, 34, 49, 66, 49, 49, + 49, 81, 33, 65, 49, 81, 33, 66, 18, 81, 33, 81, + 17, 100, 81, 17, 114, 97, 17, 114, 113, 240, 240, 176, + 29, 11, 240, 240, 50, 113, 33, 97, 65, 66, 66, 34, + 98, 17, 130, 146, 132, 113, 34, 81, 65, 66, 66, 34, + 98, 17, 129, 240, 128, 25, 12, 240, 240, 98, 114, 34, + 97, 65, 81, 82, 50, 97, 49, 129, 17, 147, 161, 177, + 177, 177, 177, 177, 240, 240, 18, 10, 240, 248, 130, 129, + 130, 114, 129, 130, 114, 129, 130, 114, 130, 137, 240, 96, + 19, 4, 67, 17, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 51, 47, 16, 0, 6, 17, + 81, 145, 82, 65, 50, 51, 65, 65, 49, 17, 65, 65, + 49, 17, 49, 63, 49, 49, 33, 33, 97, 17, 49, 33, + 97, 17, 49, 18, 97, 17, 49, 17, 113, 17, 66, 129, + 82, 129, 82, 240, 240, 96, 19, 4, 67, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 19, 21, 11, 240, 240, 114, 146, 129, 33, 98, 33, 97, + 65, 66, 65, 65, 97, 34, 98, 0, 9, 96, 5, 11, + 0, 23, 58, 7, 3, 145, 49, 240, 240, 160, 21, 8, + 0, 6, 21, 114, 113, 113, 53, 33, 65, 17, 81, 17, + 81, 17, 66, 36, 17, 240, 32, 29, 9, 240, 49, 129, + 129, 129, 129, 20, 50, 65, 34, 66, 17, 97, 17, 97, + 17, 97, 17, 97, 18, 66, 19, 49, 33, 20, 240, 96, + 16, 8, 0, 6, 52, 34, 97, 97, 113, 113, 113, 129, + 114, 117, 240, 32, 29, 9, 240, 161, 129, 129, 129, 52, + 17, 33, 66, 17, 82, 17, 97, 17, 97, 17, 97, 17, + 97, 17, 82, 33, 51, 52, 17, 240, 64, 19, 9, 0, + 7, 4, 65, 65, 34, 81, 17, 97, 24, 17, 129, 130, + 130, 133, 240, 80, 17, 6, 242, 49, 81, 81, 53, 49, + 81, 81, 81, 81, 81, 81, 81, 81, 240, 27, 9, 0, + 7, 4, 17, 33, 66, 17, 82, 17, 97, 17, 97, 17, + 97, 17, 97, 18, 66, 33, 51, 52, 17, 113, 53, 48, + 29, 9, 240, 49, 129, 129, 129, 129, 20, 50, 65, 33, + 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, + 97, 17, 97, 240, 64, 14, 2, 65, 113, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 80, 16, 4, 161, 241, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 18, 32, 28, + 8, 240, 17, 113, 113, 113, 113, 65, 33, 50, 33, 34, + 49, 18, 65, 17, 84, 65, 33, 65, 49, 49, 65, 33, + 66, 240, 32, 17, 2, 65, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 80, 36, 14, 0, 10, + 65, 20, 36, 34, 51, 50, 17, 81, 81, 17, 81, 81, + 17, 81, 81, 17, 81, 81, 17, 81, 81, 17, 81, 81, + 17, 81, 81, 17, 81, 81, 240, 224, 26, 9, 0, 6, + 97, 20, 50, 65, 33, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 17, 97, 17, 97, 17, 97, 240, 64, 24, 10, + 0, 7, 101, 66, 50, 34, 81, 33, 113, 17, 113, 17, + 113, 17, 113, 33, 81, 50, 50, 69, 240, 128, 27, 9, + 0, 6, 97, 20, 50, 65, 34, 81, 17, 97, 17, 97, + 17, 97, 17, 97, 18, 66, 18, 65, 33, 20, 49, 129, + 128, 26, 9, 0, 7, 4, 17, 33, 66, 17, 82, 17, + 97, 17, 97, 17, 97, 17, 97, 18, 66, 33, 66, 52, + 17, 129, 129, 17, 6, 240, 240, 97, 19, 18, 65, 81, + 81, 81, 81, 81, 81, 81, 240, 32, 16, 7, 240, 240, + 212, 33, 97, 98, 99, 98, 113, 97, 82, 21, 240, 16, + 17, 6, 240, 81, 81, 81, 53, 49, 81, 81, 81, 81, + 81, 81, 81, 98, 208, 26, 9, 0, 6, 97, 97, 17, + 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, + 82, 18, 51, 37, 17, 240, 64, 24, 8, 0, 6, 1, + 81, 17, 81, 17, 66, 33, 49, 49, 49, 49, 34, 65, + 17, 81, 17, 83, 82, 240, 80, 40, 16, 0, 12, 2, + 82, 81, 33, 67, 66, 33, 65, 17, 65, 50, 49, 17, + 65, 65, 49, 33, 34, 65, 33, 49, 33, 82, 17, 49, + 33, 97, 17, 67, 98, 82, 114, 82, 240, 240, 96, 24, + 8, 0, 6, 2, 65, 33, 49, 50, 18, 65, 17, 97, + 99, 81, 17, 65, 49, 34, 50, 17, 81, 240, 32, 23, + 8, 0, 6, 1, 81, 17, 66, 18, 49, 49, 49, 49, + 33, 66, 17, 83, 82, 113, 98, 97, 82, 96, 16, 8, + 0, 6, 7, 98, 97, 97, 98, 82, 97, 97, 98, 103, + 240, 32, 19, 5, 114, 33, 65, 65, 65, 65, 65, 50, + 49, 66, 65, 65, 65, 65, 65, 65, 82, 18, 2, 65, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 20, 6, 98, 97, 81, 81, 81, 81, 81, + 82, 82, 50, 65, 81, 81, 81, 81, 81, 50, 64, 12, + 9, 0, 8, 2, 97, 34, 33, 99, 0, 9, 16, + 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8f, 0x01, 0x00, 0x00, // Offset 399 (0x18f) + 0xa6, 0x01, 0x00, 0x00, // Offset 422 (0x1a6) + 0xc1, 0x01, 0x00, 0x00, // Offset 449 (0x1c1) + 0xd0, 0x01, 0x00, 0x00, // Offset 464 (0x1d0) + 0xe6, 0x01, 0x00, 0x00, // Offset 486 (0x1e6) + 0xfd, 0x01, 0x00, 0x00, // Offset 509 (0x1fd) + 0x0b, 0x02, 0x00, 0x00, // Offset 523 (0x20b) + 0x20, 0x02, 0x00, 0x00, // Offset 544 (0x220) + 0x2f, 0x02, 0x00, 0x00, // Offset 559 (0x22f) + 0x42, 0x02, 0x00, 0x00, // Offset 578 (0x242) + 0x5b, 0x02, 0x00, 0x00, // Offset 603 (0x25b) + 0x74, 0x02, 0x00, 0x00, // Offset 628 (0x274) + 0x8c, 0x02, 0x00, 0x00, // Offset 652 (0x28c) + 0xa1, 0x02, 0x00, 0x00, // Offset 673 (0x2a1) + 0xbe, 0x02, 0x00, 0x00, // Offset 702 (0x2be) + 0xd6, 0x02, 0x00, 0x00, // Offset 726 (0x2d6) + 0xe9, 0x02, 0x00, 0x00, // Offset 745 (0x2e9) + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x1e, 0x03, 0x00, 0x00, // Offset 798 (0x31e) + 0x3e, 0x03, 0x00, 0x00, // Offset 830 (0x33e) + 0x51, 0x03, 0x00, 0x00, // Offset 849 (0x351) + 0x6a, 0x03, 0x00, 0x00, // Offset 874 (0x36a) + 0x81, 0x03, 0x00, 0x00, // Offset 897 (0x381) + 0x93, 0x03, 0x00, 0x00, // Offset 915 (0x393) + 0xab, 0x03, 0x00, 0x00, // Offset 939 (0x3ab) + 0xbe, 0x03, 0x00, 0x00, // Offset 958 (0x3be) + 0xcd, 0x03, 0x00, 0x00, // Offset 973 (0x3cd) + 0xdb, 0x03, 0x00, 0x00, // Offset 987 (0x3db) + 0xef, 0x03, 0x00, 0x00, // Offset 1007 (0x3ef) + 0xff, 0x03, 0x00, 0x00, // Offset 1023 (0x3ff) + 0x12, 0x04, 0x00, 0x00, // Offset 1042 (0x412) + 0x33, 0x04, 0x00, 0x00, // Offset 1075 (0x433) + 0x46, 0x04, 0x00, 0x00, // Offset 1094 (0x446) + 0x66, 0x04, 0x00, 0x00, // Offset 1126 (0x466) + 0x79, 0x04, 0x00, 0x00, // Offset 1145 (0x479) + 0x9b, 0x04, 0x00, 0x00, // Offset 1179 (0x49b) + 0xae, 0x04, 0x00, 0x00, // Offset 1198 (0x4ae) + 0xd0, 0x04, 0x00, 0x00, // Offset 1232 (0x4d0) + 0xde, 0x04, 0x00, 0x00, // Offset 1246 (0x4de) + 0xf9, 0x04, 0x00, 0x00, // Offset 1273 (0x4f9) + 0x22, 0x05, 0x00, 0x00, // Offset 1314 (0x522) + 0x3d, 0x05, 0x00, 0x00, // Offset 1341 (0x53d) + 0x51, 0x05, 0x00, 0x00, // Offset 1361 (0x551) + 0x5f, 0x05, 0x00, 0x00, // Offset 1375 (0x55f) + 0x7b, 0x05, 0x00, 0x00, // Offset 1403 (0x57b) + 0xa7, 0x05, 0x00, 0x00, // Offset 1447 (0x5a7) + 0xc3, 0x05, 0x00, 0x00, // Offset 1475 (0x5c3) + 0xdb, 0x05, 0x00, 0x00, // Offset 1499 (0x5db) + 0xe3, 0x05, 0x00, 0x00, // Offset 1507 (0x5e3) + 0xf8, 0x05, 0x00, 0x00, // Offset 1528 (0x5f8) + 0x0b, 0x06, 0x00, 0x00, // Offset 1547 (0x60b) + 0x10, 0x06, 0x00, 0x00, // Offset 1552 (0x610) + 0x26, 0x06, 0x00, 0x00, // Offset 1574 (0x626) + 0x3a, 0x06, 0x00, 0x00, // Offset 1594 (0x63a) + 0x54, 0x06, 0x00, 0x00, // Offset 1620 (0x654) + 0x6d, 0x06, 0x00, 0x00, // Offset 1645 (0x66d) + 0x8d, 0x06, 0x00, 0x00, // Offset 1677 (0x68d) + 0xa2, 0x06, 0x00, 0x00, // Offset 1698 (0x6a2) + 0xc7, 0x06, 0x00, 0x00, // Offset 1735 (0x6c7) + 0xde, 0x06, 0x00, 0x00, // Offset 1758 (0x6de) + 0xf6, 0x06, 0x00, 0x00, // Offset 1782 (0x6f6) + 0x15, 0x07, 0x00, 0x00, // Offset 1813 (0x715) + 0x34, 0x07, 0x00, 0x00, // Offset 1844 (0x734) + 0x50, 0x07, 0x00, 0x00, // Offset 1872 (0x750) + 0x68, 0x07, 0x00, 0x00, // Offset 1896 (0x768) + 0x80, 0x07, 0x00, 0x00, // Offset 1920 (0x780) + 0x9d, 0x07, 0x00, 0x00, // Offset 1949 (0x79d) + 0xc4, 0x07, 0x00, 0x00, // Offset 1988 (0x7c4) + 0xeb, 0x07, 0x00, 0x00, // Offset 2027 (0x7eb) + 0x09, 0x08, 0x00, 0x00, // Offset 2057 (0x809) + 0x1e, 0x08, 0x00, 0x00, // Offset 2078 (0x81e) + 0x36, 0x08, 0x00, 0x00, // Offset 2102 (0x836) + 0x5d, 0x08, 0x00, 0x00, // Offset 2141 (0x85d) + 0x78, 0x08, 0x00, 0x00, // Offset 2168 (0x878) + 0x92, 0x08, 0x00, 0x00, // Offset 2194 (0x892) + 0xac, 0x08, 0x00, 0x00, // Offset 2220 (0x8ac) + 0xcc, 0x08, 0x00, 0x00, // Offset 2252 (0x8cc) + 0xe6, 0x08, 0x00, 0x00, // Offset 2278 (0x8e6) + 0xfa, 0x08, 0x00, 0x00, // Offset 2298 (0x8fa) + 0x19, 0x09, 0x00, 0x00, // Offset 2329 (0x919) + 0x2f, 0x09, 0x00, 0x00, // Offset 2351 (0x92f) + 0x52, 0x09, 0x00, 0x00, // Offset 2386 (0x952) + 0x71, 0x09, 0x00, 0x00, // Offset 2417 (0x971) + 0x8a, 0x09, 0x00, 0x00, // Offset 2442 (0x98a) + 0xa7, 0x09, 0x00, 0x00, // Offset 2471 (0x9a7) + 0xbb, 0x09, 0x00, 0x00, // Offset 2491 (0x9bb) + 0xdb, 0x09, 0x00, 0x00, // Offset 2523 (0x9db) + 0x0d, 0x0a, 0x00, 0x00, // Offset 2573 (0xa0d) + 0x2d, 0x0a, 0x00, 0x00, // Offset 2605 (0xa2d) + 0x51, 0x0a, 0x00, 0x00, // Offset 2641 (0xa51) + 0x85, 0x0a, 0x00, 0x00, // Offset 2693 (0xa85) + 0xa9, 0x0a, 0x00, 0x00, // Offset 2729 (0xaa9) + 0xb0, 0x0a, 0x00, 0x00, // Offset 2736 (0xab0) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 15, 9, 0, 6, 104, 129, 129, 129, 129, 129, 129, 129, + 240, 240, 112, 23, 12, 0, 9, 5, 21, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 0, + 6, 16, 27, 14, 0, 10, 69, 65, 129, 65, 129, 65, + 129, 50, 129, 49, 17, 113, 49, 17, 113, 33, 49, 97, + 17, 81, 0, 7, 16, 15, 9, 240, 240, 241, 129, 129, + 129, 129, 129, 129, 136, 0, 5, 96, 22, 13, 0, 9, + 97, 70, 33, 145, 33, 129, 49, 114, 49, 100, 33, 82, + 34, 23, 65, 0, 8, 32, 23, 13, 0, 8, 116, 49, + 193, 71, 17, 193, 84, 49, 65, 65, 33, 65, 65, 38, + 65, 132, 0, 6, 112, 14, 10, 0, 7, 72, 33, 145, + 145, 145, 145, 153, 0, 6, 48, 21, 12, 0, 9, 5, + 21, 17, 81, 81, 81, 81, 81, 81, 81, 81, 81, 85, + 21, 0, 7, 80, 15, 10, 0, 6, 40, 145, 145, 145, + 40, 33, 145, 153, 0, 6, 48, 19, 11, 0, 8, 42, + 81, 65, 81, 65, 21, 65, 17, 129, 17, 129, 21, 65, + 0, 7, 25, 11, 0, 8, 37, 20, 81, 17, 33, 81, + 17, 33, 21, 17, 33, 17, 81, 33, 17, 81, 33, 21, + 20, 0, 7, 25, 12, 0, 9, 5, 17, 49, 81, 17, + 49, 81, 21, 21, 17, 49, 17, 81, 49, 17, 81, 49, + 27, 0, 7, 80, 24, 13, 0, 9, 101, 49, 129, 49, + 129, 49, 69, 34, 65, 97, 17, 49, 82, 18, 39, 50, + 97, 0, 7, 48, 21, 12, 0, 9, 5, 20, 97, 17, + 145, 17, 85, 20, 33, 81, 81, 81, 85, 21, 0, 7, + 80, 29, 13, 0, 8, 21, 22, 81, 33, 17, 113, 33, + 17, 113, 33, 17, 53, 33, 17, 49, 97, 17, 49, 97, + 17, 53, 22, 0, 8, 32, 24, 13, 0, 8, 21, 36, + 97, 200, 81, 133, 36, 33, 81, 65, 17, 81, 65, 21, + 17, 65, 132, 0, 6, 96, 19, 9, 0, 6, 104, 17, + 97, 17, 97, 17, 97, 17, 97, 17, 97, 24, 0, 5, + 96, 19, 9, 0, 6, 97, 97, 17, 97, 24, 17, 97, + 17, 97, 17, 97, 24, 0, 5, 96, 34, 11, 0, 6, + 113, 49, 17, 33, 17, 49, 17, 33, 17, 49, 17, 33, + 21, 20, 17, 49, 17, 33, 17, 49, 17, 33, 17, 49, + 17, 33, 21, 20, 0, 7, 32, 13, 0, 8, 17, 49, + 49, 65, 49, 49, 65, 49, 49, 69, 49, 65, 49, 33, + 17, 49, 49, 33, 17, 49, 49, 17, 49, 39, 65, 0, + 8, 32, 19, 10, 0, 8, 1, 145, 130, 130, 114, 17, + 82, 49, 50, 82, 17, 113, 240, 240, 176, 25, 13, 0, + 8, 81, 49, 114, 49, 114, 49, 114, 34, 100, 19, 81, + 35, 18, 34, 65, 50, 98, 162, 0, 7, 48, 23, 10, + 0, 6, 69, 66, 50, 34, 82, 17, 113, 17, 113, 17, + 113, 18, 82, 34, 50, 69, 240, 240, 208, 18, 12, 0, + 7, 73, 162, 146, 146, 146, 146, 18, 82, 67, 34, 114, + 0, 7, 80, 24, 14, 0, 8, 117, 20, 129, 65, 113, + 66, 98, 65, 100, 34, 82, 36, 17, 50, 66, 50, 98, + 0, 9, 80, 19, 12, 0, 6, 53, 240, 233, 177, 146, + 146, 130, 17, 99, 50, 34, 129, 0, 6, 16, 15, 9, + 240, 240, 248, 129, 129, 129, 24, 129, 129, 129, 0, 5, + 96, 14, 10, 0, 7, 72, 33, 145, 152, 33, 145, 153, + 0, 6, 48, 20, 11, 0, 6, 121, 65, 65, 81, 65, + 81, 65, 81, 65, 81, 65, 81, 65, 58, 0, 7, 16, + 11, 0, 7, 21, 250, 244, 82, 66, 49, 97, 50, 66, + 84, 0, 6, 19, 5, 81, 65, 65, 65, 65, 65, 65, + 68, 17, 65, 65, 65, 65, 65, 65, 65, 144, 33, 7, + 193, 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, + 65, 22, 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, + 17, 65, 17, 65, 17, 65, 128, 19, 5, 81, 65, 65, + 65, 65, 68, 17, 65, 65, 65, 68, 17, 65, 65, 65, + 65, 144, 32, 7, 193, 17, 65, 17, 65, 17, 65, 17, + 65, 22, 17, 65, 17, 65, 17, 65, 22, 17, 65, 17, + 65, 17, 65, 17, 65, 17, 65, 17, 65, 128, 19, 6, + 161, 81, 81, 81, 81, 81, 81, 21, 81, 81, 81, 81, + 81, 81, 81, 81, 112, 34, 8, 225, 65, 33, 65, 33, + 65, 33, 65, 33, 65, 33, 65, 33, 20, 33, 65, 33, + 65, 33, 65, 33, 65, 33, 65, 33, 65, 33, 65, 33, + 65, 33, 144, 19, 6, 161, 81, 81, 81, 81, 21, 81, + 81, 81, 81, 21, 81, 81, 81, 81, 81, 112, 34, 8, + 225, 65, 33, 65, 33, 65, 33, 65, 33, 20, 33, 65, + 33, 65, 33, 65, 33, 65, 33, 20, 33, 65, 33, 65, + 33, 65, 33, 65, 33, 65, 33, 144, 14, 16, 0, 14, + 113, 241, 241, 241, 241, 241, 143, 0, 8, 16, 27, 16, + 240, 193, 241, 241, 241, 241, 241, 241, 129, 100, 81, 97, + 129, 97, 129, 97, 129, 97, 74, 17, 241, 241, 241, 240, + 80, 41, 15, 240, 209, 177, 33, 177, 33, 177, 33, 177, + 33, 177, 33, 177, 33, 81, 84, 81, 81, 33, 81, 81, + 33, 81, 81, 33, 81, 81, 33, 25, 17, 33, 177, 33, + 177, 33, 177, 33, 240, 16, 27, 14, 240, 177, 209, 209, + 209, 209, 209, 209, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 65, 17, 26, 33, 209, 209, 209, 240, 20, 16, 0, + 14, 65, 81, 145, 81, 145, 81, 145, 81, 145, 81, 145, + 81, 95, 0, 8, 16, 14, 16, 0, 14, 15, 129, 241, + 241, 241, 241, 241, 241, 0, 7, 28, 14, 240, 177, 209, + 209, 209, 209, 209, 209, 177, 17, 26, 33, 97, 97, 97, + 97, 97, 37, 97, 97, 97, 97, 97, 97, 209, 240, 44, + 15, 240, 209, 177, 33, 177, 33, 177, 33, 177, 33, 177, + 33, 177, 33, 177, 33, 25, 17, 33, 81, 81, 33, 81, + 81, 33, 81, 36, 33, 81, 81, 33, 81, 81, 33, 81, + 81, 33, 81, 81, 33, 240, 16, 28, 14, 240, 177, 209, + 209, 209, 209, 209, 209, 209, 27, 17, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 240, 24, + 16, 0, 14, 15, 81, 81, 145, 81, 145, 81, 145, 81, + 145, 81, 145, 81, 145, 81, 145, 81, 240, 240, 112, 8, + 16, 0, 18, 15, 0, 16, 16, 21, 14, 240, 177, 209, + 209, 209, 209, 209, 209, 209, 209, 209, 209, 27, 17, 209, + 209, 209, 209, 240, 19, 2, 33, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 48, 5, + 19, 0, 42, 96, 22, 12, 0, 7, 65, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 91, 0, + 7, 80, 20, 12, 0, 9, 1, 85, 17, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 91, 0, 7, 80, 26, 13, + 0, 8, 17, 113, 65, 113, 65, 113, 65, 113, 65, 97, + 17, 49, 97, 17, 49, 82, 33, 39, 50, 0, 8, 32, + 25, 12, 0, 7, 65, 177, 97, 65, 98, 49, 81, 17, + 49, 81, 18, 33, 81, 18, 33, 65, 49, 43, 0, 7, + 80, 32, 15, 0, 11, 40, 49, 97, 49, 49, 97, 49, + 49, 52, 49, 49, 49, 97, 33, 17, 33, 97, 33, 17, + 36, 49, 18, 33, 161, 49, 0, 7, 80, 21, 12, 0, + 9, 5, 21, 81, 17, 145, 17, 85, 17, 81, 81, 81, + 81, 85, 21, 0, 7, 80, 37, 15, 0, 9, 52, 17, + 33, 33, 97, 17, 33, 33, 97, 17, 33, 33, 97, 20, + 33, 52, 17, 33, 18, 49, 65, 33, 17, 17, 33, 65, + 35, 18, 26, 49, 0, 9, 64, 23, 12, 0, 9, 5, + 49, 113, 34, 113, 34, 53, 33, 17, 33, 82, 17, 33, + 81, 49, 27, 0, 7, 80, 24, 13, 0, 9, 101, 22, + 81, 193, 35, 53, 17, 49, 33, 81, 49, 33, 81, 49, + 39, 49, 147, 0, 6, 112, 31, 12, 0, 9, 5, 17, + 49, 17, 49, 17, 49, 17, 49, 21, 17, 49, 17, 49, + 17, 49, 17, 49, 17, 49, 17, 49, 21, 21, 0, 7, + 80, 31, 13, 0, 9, 101, 49, 65, 49, 49, 65, 49, + 49, 65, 49, 49, 65, 49, 33, 17, 49, 49, 33, 17, + 53, 17, 49, 114, 65, 0, 6, 80, 28, 12, 0, 9, + 5, 49, 49, 49, 34, 49, 49, 34, 49, 49, 33, 17, + 33, 49, 18, 17, 33, 49, 17, 49, 27, 0, 7, 80, + 24, 10, 240, 240, 169, 17, 113, 17, 113, 17, 113, 17, + 113, 25, 227, 97, 49, 81, 49, 81, 49, 99, 240, 144, + 24, 11, 0, 8, 33, 54, 17, 49, 65, 21, 65, 17, + 49, 65, 17, 49, 65, 17, 49, 65, 21, 65, 0, 7, + 29, 12, 0, 9, 1, 49, 21, 17, 49, 17, 85, 17, + 81, 49, 17, 81, 49, 17, 81, 49, 17, 81, 49, 17, + 85, 21, 0, 6, 16, 39, 14, 0, 8, 97, 33, 49, + 97, 33, 49, 20, 17, 33, 49, 65, 20, 49, 65, 17, + 33, 34, 65, 17, 33, 33, 17, 49, 17, 33, 18, 17, + 49, 20, 17, 49, 33, 0, 8, 112, 39, 15, 0, 11, + 33, 33, 49, 36, 17, 33, 49, 33, 68, 49, 33, 65, + 33, 49, 33, 65, 33, 33, 17, 17, 65, 33, 33, 17, + 17, 65, 33, 18, 34, 68, 17, 68, 0, 7, 80, 30, + 13, 0, 9, 97, 49, 21, 33, 49, 81, 37, 66, 33, + 49, 65, 49, 49, 49, 17, 33, 49, 33, 49, 17, 49, + 17, 101, 0, 7, 64, 21, 12, 0, 9, 1, 54, 33, + 51, 87, 81, 54, 33, 51, 81, 51, 81, 51, 91, 0, + 6, 16, 24, 9, 240, 240, 97, 97, 17, 97, 24, 17, + 97, 17, 97, 24, 211, 81, 49, 65, 49, 65, 49, 83, + 240, 96, 39, 11, 240, 240, 49, 49, 17, 33, 17, 49, + 17, 33, 17, 49, 17, 33, 21, 20, 17, 49, 17, 33, + 17, 49, 17, 33, 21, 20, 240, 19, 113, 49, 97, 49, + 97, 49, 115, 240, 176, 27, 11, 0, 8, 81, 21, 65, + 81, 65, 81, 50, 81, 49, 17, 65, 49, 18, 49, 33, + 49, 49, 17, 81, 33, 240, 240, 240, 26, 13, 0, 8, + 65, 49, 129, 49, 129, 49, 129, 49, 113, 17, 33, 113, + 17, 33, 98, 18, 17, 82, 55, 0, 8, 32, 26, 13, + 0, 10, 17, 52, 81, 49, 129, 49, 114, 49, 113, 17, + 33, 113, 17, 33, 97, 49, 21, 17, 81, 0, 7, 32, + 32, 13, 0, 10, 17, 49, 49, 65, 49, 49, 65, 53, + 65, 49, 49, 49, 17, 33, 49, 49, 18, 17, 49, 33, + 51, 49, 18, 49, 21, 0, 6, 80, 26, 15, 0, 11, + 81, 53, 97, 113, 97, 98, 83, 81, 97, 17, 67, 66, + 18, 34, 18, 34, 52, 50, 17, 0, 9, 32, 20, 8, + 240, 240, 209, 113, 97, 17, 81, 17, 65, 49, 49, 49, + 33, 66, 23, 240, 240, 176, 31, 13, 0, 9, 115, 67, + 34, 18, 34, 18, 17, 49, 33, 49, 17, 49, 33, 49, + 17, 49, 33, 49, 18, 18, 34, 18, 35, 67, 0, 8, + 48, 22, 10, 0, 6, 97, 117, 65, 66, 33, 113, 17, + 113, 17, 113, 17, 113, 34, 50, 69, 240, 240, 208, 35, + 14, 0, 9, 17, 81, 99, 65, 81, 33, 65, 65, 65, + 49, 65, 65, 33, 17, 49, 65, 33, 17, 49, 65, 18, + 18, 49, 33, 18, 50, 35, 33, 0, 7, 112, 31, 13, + 0, 8, 65, 81, 83, 65, 65, 49, 50, 33, 81, 19, + 33, 81, 17, 17, 33, 83, 33, 17, 83, 33, 33, 49, + 21, 51, 0, 7, 64, 25, 12, 0, 6, 10, 65, 50, + 97, 50, 97, 50, 97, 50, 75, 240, 19, 129, 49, 113, + 49, 113, 49, 131, 240, 240, 29, 14, 0, 8, 116, 52, + 240, 22, 22, 240, 35, 51, 65, 49, 17, 49, 49, 49, + 17, 49, 49, 49, 17, 49, 67, 51, 0, 7, 48, 20, + 10, 0, 6, 41, 227, 97, 49, 65, 81, 49, 81, 49, + 81, 65, 49, 99, 240, 240, 224, 32, 17, 240, 210, 242, + 242, 242, 242, 245, 65, 49, 50, 113, 49, 50, 113, 49, + 50, 113, 49, 50, 113, 49, 53, 29, 72, 50, 242, 242, + 242, 240, 96, 50, 15, 240, 146, 18, 162, 18, 162, 18, + 162, 18, 162, 18, 161, 17, 17, 49, 33, 50, 18, 49, + 33, 50, 18, 49, 33, 50, 18, 49, 33, 50, 18, 49, + 33, 49, 17, 17, 26, 17, 17, 24, 18, 18, 162, 18, + 162, 18, 162, 18, 225, 32, 14, 240, 177, 209, 209, 209, + 209, 209, 65, 49, 65, 65, 49, 65, 65, 49, 65, 65, + 49, 65, 65, 49, 65, 27, 17, 24, 65, 209, 209, 209, + 240, 36, 14, 240, 177, 209, 209, 209, 209, 209, 209, 27, + 17, 25, 49, 65, 33, 21, 65, 33, 81, 65, 33, 81, + 65, 33, 21, 65, 33, 81, 65, 33, 81, 65, 33, 81, + 240, 52, 15, 240, 162, 17, 178, 17, 178, 17, 178, 17, + 178, 17, 178, 17, 178, 17, 25, 18, 17, 25, 18, 17, + 65, 33, 20, 17, 65, 33, 50, 17, 65, 33, 50, 17, + 65, 33, 20, 17, 65, 33, 50, 17, 65, 33, 50, 17, + 65, 33, 97, 240, 16, 36, 14, 240, 177, 209, 209, 209, + 209, 209, 209, 27, 17, 25, 49, 65, 49, 65, 65, 49, + 65, 65, 49, 65, 65, 49, 65, 65, 49, 65, 65, 49, + 65, 65, 49, 65, 240, 7, 3, 240, 146, 18, 240, 160, + 21, 7, 193, 97, 97, 97, 97, 97, 97, 18, 49, 18, + 49, 97, 97, 97, 97, 97, 97, 97, 128, + 0, 0, 0, // Padding + +}; + +tFont *g_psFontWHangulgothic18pt = (tFont *)g_pui8Hangulgothic18pt; diff --git a/third_party/fonts/ofl/fonts/fonthangulgothic18ptb.c b/third_party/fonts/ofl/fonts/fonthangulgothic18ptb.c new file mode 100644 index 0000000..0f63818 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulgothic18ptb.c @@ -0,0 +1,749 @@ +//***************************************************************************** +// +// fonthangulgothic18ptb.c - Font definition for the 18ptpt Hangulgothic bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulgothic +// Size: 18pt +// Bold: yes +// Italic: no +// Memory usage: 5129 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulgothic18ptb[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 17, + + // + // The height of the font. + // + 18, + + // + // The baseline of the font. + // + 14, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0xe0, 0x09, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x8f, 0x01, 0x00, 0x00, // Offset 399 (0x18f) + 0x98, 0x01, 0x00, 0x00, // Offset 408 (0x198) + 0xb7, 0x01, 0x00, 0x00, // Offset 439 (0x1b7) + 0xcf, 0x01, 0x00, 0x00, // Offset 463 (0x1cf) + 0xfb, 0x01, 0x00, 0x00, // Offset 507 (0x1fb) + 0x1c, 0x02, 0x00, 0x00, // Offset 540 (0x21c) + 0x25, 0x02, 0x00, 0x00, // Offset 549 (0x225) + 0x38, 0x02, 0x00, 0x00, // Offset 568 (0x238) + 0x4c, 0x02, 0x00, 0x00, // Offset 588 (0x24c) + 0x5b, 0x02, 0x00, 0x00, // Offset 603 (0x25b) + 0x6b, 0x02, 0x00, 0x00, // Offset 619 (0x26b) + 0x73, 0x02, 0x00, 0x00, // Offset 627 (0x273) + 0x7b, 0x02, 0x00, 0x00, // Offset 635 (0x27b) + 0x81, 0x02, 0x00, 0x00, // Offset 641 (0x281) + 0x94, 0x02, 0x00, 0x00, // Offset 660 (0x294) + 0xb3, 0x02, 0x00, 0x00, // Offset 691 (0x2b3) + 0xc6, 0x02, 0x00, 0x00, // Offset 710 (0x2c6) + 0xd9, 0x02, 0x00, 0x00, // Offset 729 (0x2d9) + 0xeb, 0x02, 0x00, 0x00, // Offset 747 (0x2eb) + 0x05, 0x03, 0x00, 0x00, // Offset 773 (0x305) + 0x19, 0x03, 0x00, 0x00, // Offset 793 (0x319) + 0x32, 0x03, 0x00, 0x00, // Offset 818 (0x332) + 0x45, 0x03, 0x00, 0x00, // Offset 837 (0x345) + 0x62, 0x03, 0x00, 0x00, // Offset 866 (0x362) + 0x7c, 0x03, 0x00, 0x00, // Offset 892 (0x37c) + 0x84, 0x03, 0x00, 0x00, // Offset 900 (0x384) + 0x8d, 0x03, 0x00, 0x00, // Offset 909 (0x38d) + 0xa0, 0x03, 0x00, 0x00, // Offset 928 (0x3a0) + 0xab, 0x03, 0x00, 0x00, // Offset 939 (0x3ab) + 0xbf, 0x03, 0x00, 0x00, // Offset 959 (0x3bf) + 0xd0, 0x03, 0x00, 0x00, // Offset 976 (0x3d0) + 0xfa, 0x03, 0x00, 0x00, // Offset 1018 (0x3fa) + 0x18, 0x04, 0x00, 0x00, // Offset 1048 (0x418) + 0x35, 0x04, 0x00, 0x00, // Offset 1077 (0x435) + 0x48, 0x04, 0x00, 0x00, // Offset 1096 (0x448) + 0x67, 0x04, 0x00, 0x00, // Offset 1127 (0x467) + 0x79, 0x04, 0x00, 0x00, // Offset 1145 (0x479) + 0x8b, 0x04, 0x00, 0x00, // Offset 1163 (0x48b) + 0xa5, 0x04, 0x00, 0x00, // Offset 1189 (0x4a5) + 0xc5, 0x04, 0x00, 0x00, // Offset 1221 (0x4c5) + 0xd6, 0x04, 0x00, 0x00, // Offset 1238 (0x4d6) + 0xe8, 0x04, 0x00, 0x00, // Offset 1256 (0x4e8) + 0x06, 0x05, 0x00, 0x00, // Offset 1286 (0x506) + 0x18, 0x05, 0x00, 0x00, // Offset 1304 (0x518) + 0x47, 0x05, 0x00, 0x00, // Offset 1351 (0x547) + 0x6c, 0x05, 0x00, 0x00, // Offset 1388 (0x56c) + 0x8c, 0x05, 0x00, 0x00, // Offset 1420 (0x58c) + 0xa5, 0x05, 0x00, 0x00, // Offset 1445 (0x5a5) + 0xc5, 0x05, 0x00, 0x00, // Offset 1477 (0x5c5) + 0xe4, 0x05, 0x00, 0x00, // Offset 1508 (0x5e4) + 0xf6, 0x05, 0x00, 0x00, // Offset 1526 (0x5f6) + 0x09, 0x06, 0x00, 0x00, // Offset 1545 (0x609) + 0x29, 0x06, 0x00, 0x00, // Offset 1577 (0x629) + 0x46, 0x06, 0x00, 0x00, // Offset 1606 (0x646) + 0x78, 0x06, 0x00, 0x00, // Offset 1656 (0x678) + 0x94, 0x06, 0x00, 0x00, // Offset 1684 (0x694) + 0xac, 0x06, 0x00, 0x00, // Offset 1708 (0x6ac) + 0xbf, 0x06, 0x00, 0x00, // Offset 1727 (0x6bf) + 0xd2, 0x06, 0x00, 0x00, // Offset 1746 (0x6d2) + 0xf9, 0x06, 0x00, 0x00, // Offset 1785 (0x6f9) + 0x0c, 0x07, 0x00, 0x00, // Offset 1804 (0x70c) + 0x1e, 0x07, 0x00, 0x00, // Offset 1822 (0x71e) + 0x23, 0x07, 0x00, 0x00, // Offset 1827 (0x723) + 0x2b, 0x07, 0x00, 0x00, // Offset 1835 (0x72b) + 0x40, 0x07, 0x00, 0x00, // Offset 1856 (0x740) + 0x5b, 0x07, 0x00, 0x00, // Offset 1883 (0x75b) + 0x6b, 0x07, 0x00, 0x00, // Offset 1899 (0x76b) + 0x87, 0x07, 0x00, 0x00, // Offset 1927 (0x787) + 0x9a, 0x07, 0x00, 0x00, // Offset 1946 (0x79a) + 0xac, 0x07, 0x00, 0x00, // Offset 1964 (0x7ac) + 0xc7, 0x07, 0x00, 0x00, // Offset 1991 (0x7c7) + 0xe2, 0x07, 0x00, 0x00, // Offset 2018 (0x7e2) + 0xf0, 0x07, 0x00, 0x00, // Offset 2032 (0x7f0) + 0x02, 0x08, 0x00, 0x00, // Offset 2050 (0x802) + 0x1b, 0x08, 0x00, 0x00, // Offset 2075 (0x81b) + 0x2c, 0x08, 0x00, 0x00, // Offset 2092 (0x82c) + 0x50, 0x08, 0x00, 0x00, // Offset 2128 (0x850) + 0x69, 0x08, 0x00, 0x00, // Offset 2153 (0x869) + 0x82, 0x08, 0x00, 0x00, // Offset 2178 (0x882) + 0x9c, 0x08, 0x00, 0x00, // Offset 2204 (0x89c) + 0xb5, 0x08, 0x00, 0x00, // Offset 2229 (0x8b5) + 0xc4, 0x08, 0x00, 0x00, // Offset 2244 (0x8c4) + 0xd4, 0x08, 0x00, 0x00, // Offset 2260 (0x8d4) + 0xe6, 0x08, 0x00, 0x00, // Offset 2278 (0x8e6) + 0xff, 0x08, 0x00, 0x00, // Offset 2303 (0x8ff) + 0x17, 0x09, 0x00, 0x00, // Offset 2327 (0x917) + 0x3b, 0x09, 0x00, 0x00, // Offset 2363 (0x93b) + 0x52, 0x09, 0x00, 0x00, // Offset 2386 (0x952) + 0x6a, 0x09, 0x00, 0x00, // Offset 2410 (0x96a) + 0x7a, 0x09, 0x00, 0x00, // Offset 2426 (0x97a) + 0x8d, 0x09, 0x00, 0x00, // Offset 2445 (0x98d) + 0xa0, 0x09, 0x00, 0x00, // Offset 2464 (0x9a0) + 0xb4, 0x09, 0x00, 0x00, // Offset 2484 (0x9b4) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 7, 0, 15, 96, 14, 3, 50, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 162, 160, 9, 5, 84, 20, 20, + 20, 0, 8, 32, 31, 11, 226, 33, 98, 18, 98, 18, + 98, 18, 98, 18, 73, 65, 34, 97, 34, 97, 34, 57, + 66, 18, 98, 18, 98, 18, 98, 18, 240, 240, 112, 24, + 9, 50, 101, 54, 37, 66, 18, 66, 18, 69, 84, 100, + 100, 85, 66, 18, 66, 18, 68, 38, 98, 240, 112, 44, + 17, 240, 52, 83, 66, 34, 66, 82, 34, 50, 98, 34, + 50, 98, 34, 34, 114, 34, 34, 132, 34, 227, 21, 130, + 19, 19, 98, 34, 50, 98, 34, 50, 82, 50, 50, 82, + 51, 34, 66, 85, 0, 6, 80, 33, 13, 240, 20, 130, + 34, 98, 66, 82, 66, 83, 35, 98, 19, 117, 117, 50, + 54, 34, 35, 35, 18, 34, 68, 50, 83, 66, 67, 86, + 19, 240, 240, 160, 9, 3, 50, 18, 18, 18, 240, 240, + 160, 19, 6, 146, 50, 51, 50, 66, 50, 66, 66, 66, + 66, 66, 66, 82, 66, 66, 82, 82, 20, 6, 98, 82, + 66, 82, 66, 82, 66, 66, 66, 66, 66, 66, 50, 66, + 65, 66, 50, 64, 15, 8, 240, 240, 210, 98, 55, 38, + 52, 54, 49, 33, 0, 6, 32, 16, 11, 0, 6, 2, + 146, 146, 146, 90, 82, 146, 146, 146, 0, 7, 64, 8, + 4, 0, 7, 82, 19, 18, 32, 8, 6, 0, 6, 5, + 0, 6, 112, 6, 4, 0, 7, 3, 208, 19, 8, 210, + 82, 98, 98, 82, 98, 98, 82, 98, 98, 82, 98, 98, + 83, 82, 240, 112, 31, 10, 196, 82, 50, 50, 50, 34, + 82, 18, 82, 18, 82, 18, 82, 18, 82, 18, 82, 18, + 82, 18, 82, 34, 50, 50, 50, 69, 240, 240, 48, 19, + 5, 114, 35, 20, 17, 18, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 240, 16, 19, 9, 165, 65, 50, 130, + 114, 114, 99, 83, 99, 83, 84, 68, 83, 83, 104, 240, + 208, 18, 9, 150, 130, 130, 114, 114, 83, 53, 130, 130, + 114, 114, 114, 98, 38, 240, 240, 26, 11, 240, 34, 131, + 116, 116, 98, 18, 83, 18, 82, 34, 67, 34, 51, 50, + 50, 66, 58, 114, 146, 146, 240, 240, 96, 20, 9, 151, + 34, 114, 114, 114, 114, 118, 49, 66, 130, 114, 114, 114, + 17, 66, 38, 240, 240, 25, 10, 213, 66, 114, 130, 114, + 130, 135, 51, 50, 34, 82, 18, 82, 18, 82, 33, 82, + 34, 50, 69, 240, 240, 48, 19, 9, 152, 114, 99, 98, + 99, 98, 114, 99, 98, 114, 99, 98, 99, 98, 240, 240, + 48, 29, 10, 197, 66, 50, 34, 82, 18, 82, 19, 51, + 35, 19, 69, 71, 35, 51, 18, 82, 18, 82, 18, 82, + 34, 50, 69, 240, 240, 48, 26, 10, 197, 66, 50, 34, + 66, 34, 82, 18, 82, 18, 82, 18, 82, 34, 51, 55, + 130, 114, 130, 114, 69, 240, 240, 64, 8, 4, 195, 240, + 240, 51, 240, 96, 9, 4, 240, 34, 240, 242, 19, 18, + 224, 19, 9, 242, 99, 83, 83, 83, 83, 83, 98, 114, + 130, 130, 130, 130, 130, 130, 129, 160, 11, 11, 0, 8, + 42, 240, 240, 74, 0, 9, 96, 20, 9, 145, 130, 130, + 130, 130, 130, 130, 130, 98, 99, 83, 83, 83, 83, 98, + 113, 240, 32, 17, 8, 133, 114, 114, 98, 98, 83, 82, + 83, 67, 82, 98, 98, 226, 240, 208, 42, 15, 240, 70, + 130, 67, 82, 99, 50, 130, 34, 57, 18, 34, 35, 18, + 18, 19, 35, 18, 18, 18, 50, 34, 18, 18, 50, 18, + 34, 18, 35, 17, 66, 23, 98, 114, 82, 67, 118, 0, + 6, 32, 30, 14, 240, 67, 179, 180, 146, 18, 146, 18, + 131, 34, 114, 50, 114, 51, 83, 66, 89, 67, 98, 50, + 114, 50, 114, 34, 146, 240, 240, 208, 29, 9, 150, 50, + 50, 34, 66, 18, 66, 18, 66, 18, 66, 18, 50, 38, + 50, 50, 34, 66, 18, 66, 18, 66, 18, 50, 38, 240, + 240, 19, 11, 246, 51, 114, 146, 130, 146, 146, 146, 146, + 146, 162, 147, 147, 166, 240, 240, 64, 31, 11, 182, 82, + 66, 50, 82, 34, 82, 34, 98, 18, 98, 18, 98, 18, + 98, 18, 98, 18, 98, 18, 82, 34, 67, 34, 51, 54, + 240, 240, 128, 18, 8, 135, 18, 98, 98, 98, 98, 98, + 103, 18, 98, 98, 98, 98, 103, 240, 160, 18, 8, 135, + 18, 98, 98, 98, 98, 98, 103, 18, 98, 98, 98, 98, + 98, 240, 240, 26, 12, 240, 23, 51, 130, 162, 146, 162, + 162, 162, 69, 18, 114, 18, 114, 34, 98, 34, 98, 51, + 66, 86, 240, 240, 128, 32, 11, 178, 98, 18, 98, 18, + 98, 18, 98, 18, 98, 18, 98, 18, 98, 26, 18, 98, + 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, 240, 240, + 64, 17, 3, 50, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 160, 18, 6, 146, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 20, 240, 80, + 30, 10, 162, 67, 18, 66, 34, 50, 50, 35, 50, 19, + 69, 85, 85, 83, 18, 66, 35, 50, 50, 50, 66, 34, + 67, 18, 82, 240, 240, 16, 18, 8, 130, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 103, 240, 160, + 47, 15, 243, 131, 19, 131, 20, 100, 20, 100, 20, 100, + 18, 18, 66, 18, 18, 18, 66, 18, 18, 19, 35, 18, + 18, 34, 34, 34, 18, 34, 34, 34, 18, 52, 50, 18, + 52, 50, 18, 52, 50, 18, 66, 66, 0, 5, 96, 37, + 11, 178, 98, 19, 82, 20, 66, 20, 66, 21, 50, 18, + 18, 50, 18, 34, 34, 18, 34, 34, 18, 50, 18, 18, + 53, 18, 68, 18, 68, 18, 83, 18, 98, 240, 240, 64, + 32, 13, 240, 21, 114, 66, 66, 98, 50, 98, 34, 130, + 18, 130, 18, 130, 18, 130, 18, 130, 18, 130, 34, 98, + 50, 98, 66, 66, 102, 240, 240, 208, 25, 9, 150, 50, + 50, 34, 66, 18, 66, 18, 66, 18, 66, 18, 50, 38, + 50, 114, 114, 114, 114, 114, 240, 240, 64, 32, 13, 240, + 36, 114, 66, 66, 98, 50, 98, 34, 130, 18, 130, 18, + 130, 18, 130, 18, 130, 18, 130, 34, 98, 50, 98, 66, + 66, 102, 179, 179, 179, 31, 10, 166, 66, 50, 50, 66, + 34, 66, 34, 66, 34, 66, 34, 50, 54, 66, 34, 66, + 50, 50, 50, 50, 66, 34, 66, 34, 82, 240, 240, 16, + 18, 9, 181, 50, 98, 114, 115, 100, 101, 100, 100, 99, + 114, 114, 98, 38, 240, 240, 19, 10, 169, 82, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 240, 240, + 64, 32, 11, 178, 98, 18, 98, 18, 98, 18, 98, 18, + 98, 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, 18, + 98, 33, 97, 50, 66, 84, 240, 240, 112, 29, 13, 210, + 130, 34, 99, 34, 98, 50, 98, 66, 67, 66, 66, 82, + 66, 98, 34, 114, 34, 115, 18, 132, 148, 163, 162, 240, + 240, 240, 50, 19, 240, 66, 99, 82, 34, 83, 82, 34, + 68, 82, 34, 68, 66, 50, 66, 18, 50, 66, 50, 18, + 50, 66, 34, 34, 35, 66, 34, 34, 34, 98, 18, 50, + 18, 98, 18, 50, 18, 100, 68, 116, 83, 131, 83, 130, + 99, 0, 7, 80, 28, 12, 194, 98, 50, 67, 50, 66, + 82, 34, 102, 116, 146, 148, 132, 114, 34, 83, 35, 66, + 66, 51, 82, 34, 99, 240, 240, 112, 24, 13, 211, 99, + 34, 98, 66, 66, 82, 66, 98, 34, 118, 132, 162, 178, + 178, 178, 178, 178, 178, 240, 240, 240, 19, 10, 169, 115, + 115, 99, 99, 115, 99, 115, 99, 115, 99, 99, 115, 121, + 240, 240, 16, 19, 5, 84, 18, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 52, 39, 17, + 240, 240, 82, 66, 66, 50, 66, 66, 50, 66, 66, 66, + 36, 34, 82, 36, 34, 63, 1, 65, 18, 34, 18, 100, + 36, 116, 36, 116, 36, 115, 67, 130, 66, 146, 66, 0, + 7, 19, 5, 84, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 20, 18, 11, 242, 132, + 116, 98, 34, 82, 34, 66, 66, 50, 66, 34, 98, 0, + 12, 64, 5, 11, 0, 23, 58, 8, 5, 83, 51, 65, + 0, 8, 112, 21, 9, 0, 5, 102, 49, 51, 114, 114, + 54, 34, 50, 18, 66, 18, 66, 18, 51, 39, 240, 208, + 27, 10, 162, 130, 130, 130, 135, 51, 50, 34, 82, 18, + 82, 18, 82, 18, 82, 18, 82, 18, 82, 19, 50, 39, + 240, 240, 48, 16, 8, 240, 240, 212, 34, 97, 98, 98, + 98, 98, 114, 102, 68, 240, 160, 28, 10, 240, 34, 130, + 130, 130, 55, 34, 51, 18, 82, 18, 82, 18, 82, 18, + 82, 18, 82, 18, 67, 34, 51, 55, 240, 240, 16, 19, + 9, 0, 5, 116, 66, 34, 34, 66, 18, 66, 24, 18, + 114, 115, 114, 133, 240, 224, 18, 7, 163, 50, 82, 82, + 54, 50, 82, 82, 82, 82, 82, 82, 82, 82, 240, 144, + 27, 10, 0, 6, 71, 34, 51, 18, 82, 18, 82, 18, + 82, 18, 82, 18, 82, 18, 82, 34, 51, 55, 130, 33, + 66, 54, 48, 27, 9, 146, 114, 114, 114, 118, 51, 34, + 34, 66, 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, + 18, 66, 18, 66, 240, 208, 14, 3, 50, 162, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 160, 18, 5, 114, 240, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 20, + 19, 32, 25, 9, 146, 114, 114, 114, 114, 50, 34, 35, + 34, 19, 53, 68, 85, 66, 19, 50, 34, 50, 50, 34, + 66, 240, 208, 17, 3, 50, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 160, 36, 15, 0, 9, + 55, 20, 51, 51, 35, 18, 66, 66, 18, 66, 66, 18, + 66, 66, 18, 66, 66, 18, 66, 66, 18, 66, 66, 18, + 66, 66, 18, 66, 66, 0, 5, 96, 25, 9, 240, 240, + 246, 51, 34, 34, 66, 18, 66, 18, 66, 18, 66, 18, + 66, 18, 66, 18, 66, 18, 66, 240, 208, 25, 10, 0, + 6, 69, 66, 50, 34, 66, 34, 82, 18, 82, 18, 82, + 18, 82, 18, 66, 50, 50, 69, 240, 240, 48, 26, 10, + 0, 6, 39, 51, 50, 34, 82, 18, 82, 18, 82, 18, + 82, 18, 82, 18, 82, 19, 50, 39, 50, 130, 130, 128, + 25, 10, 0, 6, 71, 34, 51, 18, 82, 18, 82, 18, + 82, 18, 82, 18, 82, 18, 82, 34, 51, 55, 130, 130, + 130, 15, 6, 240, 245, 21, 19, 50, 66, 66, 66, 66, + 66, 66, 240, 112, 16, 7, 240, 240, 101, 18, 82, 83, + 69, 68, 67, 82, 82, 21, 240, 128, 18, 7, 240, 18, + 82, 82, 54, 50, 82, 82, 82, 82, 82, 82, 84, 67, + 240, 112, 25, 9, 240, 240, 242, 66, 18, 66, 18, 66, + 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, 34, 35, + 39, 240, 208, 24, 10, 0, 6, 34, 82, 34, 50, 50, + 50, 50, 50, 66, 18, 82, 18, 82, 18, 99, 115, 115, + 240, 240, 64, 36, 16, 0, 10, 2, 67, 66, 34, 51, + 66, 34, 51, 50, 50, 37, 34, 65, 34, 18, 34, 66, + 18, 18, 18, 82, 18, 36, 99, 52, 99, 51, 115, 66, + 0, 6, 64, 23, 10, 0, 6, 50, 50, 51, 34, 66, + 18, 100, 99, 115, 101, 82, 18, 66, 50, 35, 66, 240, + 240, 16, 24, 9, 240, 240, 242, 66, 34, 50, 34, 50, + 34, 34, 66, 18, 66, 18, 68, 99, 98, 114, 114, 113, + 99, 80, 16, 9, 240, 240, 248, 99, 84, 68, 83, 83, + 83, 84, 83, 104, 240, 208, 19, 6, 131, 34, 66, 66, + 66, 66, 66, 51, 50, 82, 66, 66, 66, 66, 66, 66, + 83, 19, 3, 50, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 64, 20, 6, 99, 82, + 66, 66, 66, 66, 66, 66, 82, 50, 66, 66, 66, 66, + 66, 66, 35, 48, 11, 9, 0, 7, 116, 49, 17, 52, + 0, 10, 32, + 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8e, 0x01, 0x00, 0x00, // Offset 398 (0x18e) + 0xa1, 0x01, 0x00, 0x00, // Offset 417 (0x1a1) + 0xb6, 0x01, 0x00, 0x00, // Offset 438 (0x1b6) + 0xc4, 0x01, 0x00, 0x00, // Offset 452 (0x1c4) + 0xda, 0x01, 0x00, 0x00, // Offset 474 (0x1da) + 0xee, 0x01, 0x00, 0x00, // Offset 494 (0x1ee) + 0xfc, 0x01, 0x00, 0x00, // Offset 508 (0x1fc) + 0x0f, 0x02, 0x00, 0x00, // Offset 527 (0x20f) + 0x1d, 0x02, 0x00, 0x00, // Offset 541 (0x21d) + 0x31, 0x02, 0x00, 0x00, // Offset 561 (0x231) + 0x46, 0x02, 0x00, 0x00, // Offset 582 (0x246) + 0x5b, 0x02, 0x00, 0x00, // Offset 603 (0x25b) + 0x72, 0x02, 0x00, 0x00, // Offset 626 (0x272) + 0x87, 0x02, 0x00, 0x00, // Offset 647 (0x287) + 0x9f, 0x02, 0x00, 0x00, // Offset 671 (0x29f) + 0xb4, 0x02, 0x00, 0x00, // Offset 692 (0x2b4) + 0xc7, 0x02, 0x00, 0x00, // Offset 711 (0x2c7) + 0xda, 0x02, 0x00, 0x00, // Offset 730 (0x2da) + 0xf2, 0x02, 0x00, 0x00, // Offset 754 (0x2f2) + 0x0c, 0x03, 0x00, 0x00, // Offset 780 (0x30c) + 0x1e, 0x03, 0x00, 0x00, // Offset 798 (0x31e) + 0x35, 0x03, 0x00, 0x00, // Offset 821 (0x335) + 0x48, 0x03, 0x00, 0x00, // Offset 840 (0x348) + 0x57, 0x03, 0x00, 0x00, // Offset 855 (0x357) + 0x6c, 0x03, 0x00, 0x00, // Offset 876 (0x36c) + 0x7c, 0x03, 0x00, 0x00, // Offset 892 (0x37c) + 0x8a, 0x03, 0x00, 0x00, // Offset 906 (0x38a) + 0x98, 0x03, 0x00, 0x00, // Offset 920 (0x398) + 0xab, 0x03, 0x00, 0x00, // Offset 939 (0x3ab) + 0xbd, 0x03, 0x00, 0x00, // Offset 957 (0x3bd) + 0xd1, 0x03, 0x00, 0x00, // Offset 977 (0x3d1) + 0xf3, 0x03, 0x00, 0x00, // Offset 1011 (0x3f3) + 0x07, 0x04, 0x00, 0x00, // Offset 1031 (0x407) + 0x27, 0x04, 0x00, 0x00, // Offset 1063 (0x427) + 0x3b, 0x04, 0x00, 0x00, // Offset 1083 (0x43b) + 0x5f, 0x04, 0x00, 0x00, // Offset 1119 (0x45f) + 0x73, 0x04, 0x00, 0x00, // Offset 1139 (0x473) + 0x97, 0x04, 0x00, 0x00, // Offset 1175 (0x497) + 0xab, 0x04, 0x00, 0x00, // Offset 1195 (0x4ab) + 0xd0, 0x04, 0x00, 0x00, // Offset 1232 (0x4d0) + 0xf8, 0x04, 0x00, 0x00, // Offset 1272 (0x4f8) + 0x13, 0x05, 0x00, 0x00, // Offset 1299 (0x513) + 0x26, 0x05, 0x00, 0x00, // Offset 1318 (0x526) + 0x3c, 0x05, 0x00, 0x00, // Offset 1340 (0x53c) + 0x58, 0x05, 0x00, 0x00, // Offset 1368 (0x558) + 0x82, 0x05, 0x00, 0x00, // Offset 1410 (0x582) + 0x9e, 0x05, 0x00, 0x00, // Offset 1438 (0x59e) + 0xb5, 0x05, 0x00, 0x00, // Offset 1461 (0x5b5) + 0xc0, 0x05, 0x00, 0x00, // Offset 1472 (0x5c0) + 0xd7, 0x05, 0x00, 0x00, // Offset 1495 (0x5d7) + 0xeb, 0x05, 0x00, 0x00, // Offset 1515 (0x5eb) + 0xf0, 0x05, 0x00, 0x00, // Offset 1520 (0x5f0) + 0x03, 0x06, 0x00, 0x00, // Offset 1539 (0x603) + 0x16, 0x06, 0x00, 0x00, // Offset 1558 (0x616) + 0x2b, 0x06, 0x00, 0x00, // Offset 1579 (0x62b) + 0x41, 0x06, 0x00, 0x00, // Offset 1601 (0x641) + 0x5c, 0x06, 0x00, 0x00, // Offset 1628 (0x65c) + 0x71, 0x06, 0x00, 0x00, // Offset 1649 (0x671) + 0x8c, 0x06, 0x00, 0x00, // Offset 1676 (0x68c) + 0xa3, 0x06, 0x00, 0x00, // Offset 1699 (0x6a3) + 0xb9, 0x06, 0x00, 0x00, // Offset 1721 (0x6b9) + 0xd1, 0x06, 0x00, 0x00, // Offset 1745 (0x6d1) + 0xec, 0x06, 0x00, 0x00, // Offset 1772 (0x6ec) + 0x07, 0x07, 0x00, 0x00, // Offset 1799 (0x707) + 0x20, 0x07, 0x00, 0x00, // Offset 1824 (0x720) + 0x38, 0x07, 0x00, 0x00, // Offset 1848 (0x738) + 0x4b, 0x07, 0x00, 0x00, // Offset 1867 (0x74b) + 0x6d, 0x07, 0x00, 0x00, // Offset 1901 (0x76d) + 0x8b, 0x07, 0x00, 0x00, // Offset 1931 (0x78b) + 0xa3, 0x07, 0x00, 0x00, // Offset 1955 (0x7a3) + 0xb6, 0x07, 0x00, 0x00, // Offset 1974 (0x7b6) + 0xcf, 0x07, 0x00, 0x00, // Offset 1999 (0x7cf) + 0xf2, 0x07, 0x00, 0x00, // Offset 2034 (0x7f2) + 0x09, 0x08, 0x00, 0x00, // Offset 2057 (0x809) + 0x1d, 0x08, 0x00, 0x00, // Offset 2077 (0x81d) + 0x33, 0x08, 0x00, 0x00, // Offset 2099 (0x833) + 0x4a, 0x08, 0x00, 0x00, // Offset 2122 (0x84a) + 0x60, 0x08, 0x00, 0x00, // Offset 2144 (0x860) + 0x72, 0x08, 0x00, 0x00, // Offset 2162 (0x872) + 0x91, 0x08, 0x00, 0x00, // Offset 2193 (0x891) + 0xa5, 0x08, 0x00, 0x00, // Offset 2213 (0x8a5) + 0xc2, 0x08, 0x00, 0x00, // Offset 2242 (0x8c2) + 0xdd, 0x08, 0x00, 0x00, // Offset 2269 (0x8dd) + 0xf6, 0x08, 0x00, 0x00, // Offset 2294 (0x8f6) + 0x12, 0x09, 0x00, 0x00, // Offset 2322 (0x912) + 0x22, 0x09, 0x00, 0x00, // Offset 2338 (0x922) + 0x48, 0x09, 0x00, 0x00, // Offset 2376 (0x948) + 0x73, 0x09, 0x00, 0x00, // Offset 2419 (0x973) + 0x92, 0x09, 0x00, 0x00, // Offset 2450 (0x992) + 0xb5, 0x09, 0x00, 0x00, // Offset 2485 (0x9b5) + 0xe8, 0x09, 0x00, 0x00, // Offset 2536 (0x9e8) + 0x0b, 0x0a, 0x00, 0x00, // Offset 2571 (0xa0b) + 0x14, 0x0a, 0x00, 0x00, // Offset 2580 (0xa14) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 14, 11, 0, 6, 122, 26, 146, 146, 146, 146, 146, 0, + 8, 48, 19, 13, 0, 8, 22, 21, 82, 66, 82, 66, + 82, 66, 82, 66, 82, 66, 0, 11, 64, 21, 15, 0, + 9, 54, 50, 130, 50, 130, 36, 114, 36, 114, 18, 35, + 82, 17, 65, 0, 13, 48, 14, 11, 0, 6, 114, 146, + 146, 146, 146, 154, 26, 0, 8, 48, 22, 14, 0, 8, + 98, 70, 34, 115, 34, 114, 50, 99, 50, 85, 37, 19, + 34, 21, 17, 0, 11, 48, 20, 13, 0, 9, 4, 34, + 178, 55, 18, 178, 84, 34, 66, 34, 24, 34, 132, 0, + 8, 48, 14, 11, 0, 6, 122, 26, 18, 146, 146, 154, + 26, 0, 8, 48, 19, 13, 0, 8, 28, 18, 66, 82, + 66, 82, 66, 82, 66, 82, 66, 92, 0, 9, 112, 14, + 11, 0, 6, 122, 146, 146, 26, 18, 146, 154, 0, 8, + 48, 20, 13, 0, 8, 28, 82, 66, 82, 66, 22, 66, + 18, 130, 18, 130, 22, 66, 0, 9, 112, 21, 13, 0, + 8, 28, 84, 34, 84, 34, 24, 34, 18, 66, 34, 18, + 66, 34, 28, 0, 9, 112, 21, 13, 0, 8, 24, 34, + 84, 34, 88, 24, 34, 18, 66, 34, 18, 66, 34, 28, + 0, 9, 112, 23, 15, 0, 9, 54, 50, 130, 50, 130, + 50, 70, 36, 50, 101, 34, 82, 35, 22, 17, 65, 0, + 11, 64, 21, 14, 0, 8, 102, 21, 98, 18, 146, 18, + 86, 21, 34, 82, 82, 82, 86, 22, 0, 10, 80, 24, + 14, 0, 8, 109, 82, 18, 18, 98, 18, 18, 38, 18, + 18, 34, 82, 18, 34, 82, 18, 45, 0, 10, 80, 21, + 14, 0, 8, 102, 36, 98, 201, 22, 36, 34, 82, 34, + 18, 82, 34, 22, 36, 0, 10, 96, 19, 11, 0, 6, + 122, 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, 26, + 0, 8, 48, 19, 10, 0, 6, 34, 82, 18, 82, 25, + 18, 82, 18, 82, 18, 82, 25, 0, 7, 80, 24, 13, + 0, 8, 18, 36, 34, 18, 36, 34, 18, 36, 34, 28, + 18, 36, 34, 18, 36, 34, 28, 0, 9, 112, 26, 14, + 0, 8, 98, 34, 34, 66, 34, 34, 66, 34, 34, 70, + 19, 66, 34, 20, 50, 36, 34, 39, 66, 0, 10, 80, + 18, 14, 0, 9, 51, 179, 179, 162, 18, 131, 35, 53, + 68, 19, 114, 0, 10, 96, 23, 12, 0, 7, 114, 34, + 98, 34, 98, 34, 83, 19, 73, 35, 34, 19, 18, 35, + 49, 82, 0, 8, 32, 19, 11, 0, 7, 22, 66, 66, + 34, 98, 18, 98, 18, 98, 34, 66, 70, 0, 8, 80, + 15, 13, 0, 8, 42, 148, 131, 133, 85, 21, 20, 83, + 0, 11, 64, 21, 13, 0, 8, 37, 20, 98, 50, 82, + 65, 85, 18, 66, 39, 18, 51, 34, 98, 0, 10, 64, + 16, 14, 0, 7, 54, 240, 240, 74, 164, 132, 107, 36, + 84, 0, 10, 80, 14, 11, 0, 6, 122, 26, 146, 146, + 26, 146, 146, 146, 0, 7, 14, 11, 0, 6, 121, 34, + 146, 153, 34, 146, 154, 0, 8, 48, 19, 13, 0, 8, + 42, 82, 34, 114, 34, 114, 34, 114, 34, 114, 34, 76, + 0, 9, 112, 18, 11, 240, 240, 101, 240, 170, 229, 82, + 66, 50, 66, 51, 35, 84, 0, 7, 48, 20, 6, 2, + 66, 66, 66, 66, 66, 69, 21, 18, 66, 66, 66, 66, + 66, 66, 66, 66, 160, 34, 7, 2, 34, 18, 34, 18, + 34, 18, 34, 18, 34, 18, 34, 22, 22, 18, 34, 18, + 34, 18, 34, 18, 34, 18, 34, 18, 34, 18, 34, 18, + 34, 82, 128, 20, 6, 2, 66, 66, 66, 69, 21, 18, + 66, 66, 69, 21, 18, 66, 66, 66, 66, 66, 160, 32, + 7, 2, 34, 18, 34, 18, 34, 18, 34, 22, 22, 18, + 34, 18, 34, 22, 22, 18, 34, 18, 34, 18, 34, 18, + 34, 18, 34, 18, 34, 82, 128, 20, 7, 66, 82, 82, + 82, 82, 82, 22, 22, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 128, 36, 9, 50, 18, 66, 18, 66, 18, 66, + 18, 66, 18, 66, 18, 21, 18, 66, 18, 66, 18, 66, + 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, + 18, 114, 160, 20, 7, 66, 82, 82, 82, 22, 82, 82, + 82, 82, 22, 82, 82, 82, 82, 82, 82, 82, 128, 36, + 9, 50, 18, 66, 18, 66, 18, 66, 18, 66, 18, 21, + 18, 66, 18, 66, 18, 66, 18, 21, 18, 66, 18, 66, + 18, 66, 18, 66, 18, 66, 18, 66, 18, 114, 160, 20, + 18, 0, 14, 50, 240, 18, 240, 18, 240, 18, 240, 18, + 159, 2, 31, 2, 0, 11, 48, 37, 18, 194, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 21, + 98, 82, 146, 82, 146, 82, 146, 82, 75, 18, 75, 18, + 240, 18, 240, 18, 240, 18, 240, 112, 40, 17, 162, 34, + 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, + 182, 82, 66, 34, 82, 66, 34, 82, 66, 34, 82, 66, + 34, 28, 34, 178, 34, 178, 34, 178, 34, 242, 240, 48, + 27, 15, 194, 210, 210, 210, 210, 210, 210, 210, 82, 98, + 82, 98, 82, 98, 82, 65, 18, 27, 18, 210, 210, 210, + 210, 240, 16, 19, 18, 0, 18, 82, 50, 178, 50, 178, + 50, 178, 50, 111, 2, 31, 2, 0, 9, 16, 22, 18, + 0, 13, 79, 2, 31, 2, 130, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 0, 10, 16, 28, 16, 210, 226, + 226, 226, 226, 226, 226, 226, 226, 28, 18, 98, 98, 98, + 98, 98, 53, 98, 53, 98, 98, 98, 98, 226, 240, 32, + 42, 17, 162, 34, 178, 34, 178, 34, 178, 34, 178, 34, + 178, 34, 178, 34, 178, 34, 178, 34, 28, 34, 28, 34, + 82, 21, 34, 82, 21, 34, 82, 66, 34, 82, 66, 34, + 82, 66, 34, 242, 240, 48, 28, 15, 194, 210, 210, 210, + 210, 210, 210, 210, 210, 27, 18, 82, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 210, 240, 16, 23, 18, + 0, 13, 79, 2, 31, 2, 98, 50, 178, 50, 178, 50, + 178, 50, 178, 50, 178, 50, 0, 9, 96, 11, 18, 0, + 18, 15, 2, 31, 2, 0, 18, 16, 23, 15, 194, 210, + 210, 210, 210, 210, 210, 210, 210, 210, 210, 27, 18, 27, + 18, 210, 210, 210, 210, 240, 16, 20, 3, 2, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 64, 5, 19, 0, 42, 96, 19, 12, 0, 7, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 69, 21, + 0, 10, 80, 19, 13, 0, 8, 18, 69, 34, 66, 82, + 66, 82, 66, 82, 66, 85, 22, 0, 11, 64, 21, 14, + 0, 8, 98, 98, 66, 98, 66, 98, 66, 84, 50, 85, + 40, 35, 21, 17, 0, 11, 48, 22, 14, 0, 9, 113, + 66, 98, 66, 99, 50, 84, 50, 81, 34, 34, 66, 34, + 37, 23, 0, 10, 80, 27, 16, 0, 10, 9, 34, 98, + 34, 34, 98, 34, 34, 53, 34, 35, 34, 82, 20, 37, + 36, 34, 35, 51, 65, 0, 12, 16, 21, 14, 0, 8, + 102, 21, 98, 18, 146, 18, 86, 18, 82, 82, 82, 82, + 86, 22, 0, 10, 80, 27, 16, 0, 10, 7, 18, 18, + 100, 18, 18, 103, 18, 55, 18, 19, 34, 50, 22, 34, + 50, 20, 18, 27, 49, 0, 12, 16, 23, 14, 0, 8, + 102, 49, 130, 34, 130, 35, 54, 18, 17, 50, 82, 18, + 34, 66, 49, 45, 0, 10, 80, 22, 14, 0, 8, 109, + 82, 194, 36, 38, 18, 34, 18, 66, 50, 18, 82, 34, + 22, 36, 0, 10, 96, 24, 13, 0, 8, 24, 34, 18, + 36, 34, 18, 40, 18, 36, 34, 18, 36, 34, 18, 36, + 34, 28, 0, 9, 112, 27, 15, 0, 9, 54, 50, 66, + 34, 50, 66, 34, 50, 66, 34, 36, 50, 34, 36, 50, + 34, 19, 18, 41, 50, 0, 11, 48, 27, 14, 0, 8, + 102, 49, 66, 34, 34, 66, 34, 35, 50, 34, 18, 17, + 50, 34, 18, 18, 34, 36, 49, 45, 0, 10, 80, 25, + 12, 240, 155, 18, 114, 18, 114, 18, 114, 18, 114, 27, + 240, 213, 98, 50, 82, 50, 82, 50, 101, 240, 240, 160, + 24, 13, 0, 8, 18, 40, 18, 34, 66, 22, 66, 18, + 34, 66, 18, 34, 66, 22, 66, 22, 66, 0, 9, 112, + 19, 13, 0, 8, 18, 39, 34, 36, 88, 82, 36, 82, + 36, 82, 36, 92, 0, 9, 112, 34, 15, 0, 9, 50, + 18, 34, 20, 18, 18, 34, 50, 21, 34, 50, 18, 18, + 35, 34, 18, 18, 20, 34, 18, 18, 18, 18, 18, 23, + 49, 18, 0, 11, 48, 30, 15, 0, 9, 50, 18, 34, + 20, 18, 18, 34, 18, 53, 34, 18, 50, 18, 34, 18, + 50, 18, 22, 50, 21, 19, 55, 37, 0, 11, 48, 24, + 14, 0, 8, 98, 40, 34, 34, 51, 38, 50, 50, 34, + 35, 50, 34, 21, 34, 41, 24, 50, 0, 10, 80, 19, + 13, 0, 8, 18, 39, 34, 36, 88, 82, 39, 34, 36, + 82, 36, 92, 0, 9, 112, 25, 12, 240, 146, 114, 18, + 114, 27, 18, 114, 18, 114, 27, 240, 212, 114, 34, 98, + 34, 98, 34, 116, 240, 240, 176, 35, 14, 240, 210, 34, + 18, 34, 18, 34, 18, 34, 22, 22, 18, 34, 18, 34, + 18, 34, 18, 34, 22, 22, 240, 240, 52, 146, 34, 130, + 34, 130, 34, 148, 0, 6, 23, 13, 0, 8, 66, 22, + 66, 22, 66, 82, 52, 66, 52, 66, 35, 18, 50, 19, + 50, 34, 0, 9, 112, 20, 14, 0, 9, 18, 50, 114, + 50, 114, 50, 100, 34, 86, 18, 67, 40, 114, 0, 11, + 32, 22, 15, 0, 9, 98, 53, 82, 50, 130, 50, 116, + 34, 116, 34, 99, 18, 18, 83, 56, 0, 11, 48, 23, + 15, 0, 11, 82, 50, 34, 66, 54, 67, 34, 34, 53, + 18, 34, 34, 37, 34, 18, 72, 0, 11, 48, 22, 15, + 0, 9, 98, 38, 82, 83, 83, 66, 84, 51, 67, 18, + 18, 18, 35, 51, 50, 0, 13, 32, 18, 10, 240, 240, + 225, 130, 131, 101, 82, 18, 66, 50, 35, 51, 25, 0, + 7, 80, 31, 16, 0, 10, 35, 83, 66, 18, 50, 18, + 34, 50, 18, 50, 18, 50, 18, 50, 18, 50, 18, 50, + 34, 18, 50, 18, 67, 83, 0, 12, 48, 20, 9, 240, + 242, 114, 86, 35, 35, 18, 66, 18, 66, 18, 66, 34, + 34, 68, 0, 7, 16, 29, 16, 0, 8, 50, 82, 114, + 82, 85, 66, 66, 50, 35, 66, 50, 36, 50, 50, 22, + 49, 49, 19, 35, 51, 49, 65, 0, 12, 32, 27, 15, + 0, 7, 114, 210, 81, 86, 50, 51, 35, 19, 50, 66, + 20, 34, 68, 33, 50, 34, 18, 34, 52, 23, 0, 11, + 48, 25, 14, 236, 82, 50, 114, 50, 114, 50, 114, 50, + 77, 0, 5, 117, 130, 50, 114, 50, 114, 50, 133, 0, + 5, 112, 28, 15, 0, 7, 100, 52, 240, 240, 46, 52, + 52, 50, 34, 18, 34, 34, 34, 18, 34, 34, 34, 18, + 34, 52, 52, 0, 9, 80, 16, 11, 0, 6, 122, 244, + 83, 35, 50, 66, 51, 35, 84, 0, 8, 96, 38, 18, + 194, 240, 18, 240, 18, 240, 18, 240, 18, 240, 21, 213, + 210, 114, 34, 50, 114, 34, 53, 66, 34, 53, 66, 34, + 35, 78, 240, 18, 240, 18, 240, 18, 240, 18, 240, 112, + 43, 17, 162, 34, 178, 34, 178, 34, 178, 34, 178, 34, + 182, 182, 178, 34, 50, 18, 54, 50, 18, 54, 50, 18, + 50, 34, 50, 18, 17, 18, 34, 25, 18, 34, 178, 34, + 178, 34, 178, 34, 242, 240, 48, 31, 15, 194, 210, 210, + 210, 210, 210, 210, 210, 50, 34, 66, 50, 34, 66, 50, + 34, 66, 50, 34, 33, 18, 27, 18, 210, 210, 210, 210, + 240, 16, 35, 16, 210, 226, 226, 226, 226, 226, 226, 226, + 226, 28, 18, 27, 34, 50, 34, 37, 50, 34, 82, 50, + 34, 82, 50, 34, 37, 50, 34, 82, 50, 34, 82, 240, + 32, 51, 16, 162, 18, 178, 18, 178, 18, 178, 18, 178, + 18, 178, 18, 178, 18, 178, 18, 25, 18, 18, 24, 34, + 18, 34, 18, 66, 18, 34, 18, 21, 18, 34, 18, 66, + 18, 34, 18, 21, 18, 34, 18, 66, 18, 34, 18, 66, + 18, 226, 240, 32, 35, 15, 194, 210, 210, 210, 210, 210, + 210, 210, 210, 27, 18, 26, 34, 50, 34, 66, 50, 34, + 66, 50, 34, 66, 50, 34, 66, 50, 34, 66, 50, 34, + 66, 240, 16, 9, 4, 240, 211, 19, 19, 240, 240, 48, + 22, 8, 82, 98, 98, 98, 98, 98, 98, 98, 19, 34, + 19, 34, 98, 98, 98, 98, 98, 98, 98, 144, + 0, 0, // Padding + +}; + +tFont *g_psFontWHangulgothic18ptb = (tFont *)g_pui8Hangulgothic18ptb; diff --git a/third_party/fonts/ofl/fonts/fonthangulgothic20pt.c b/third_party/fonts/ofl/fonts/fonthangulgothic20pt.c new file mode 100644 index 0000000..0af6de5 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulgothic20pt.c @@ -0,0 +1,813 @@ +//***************************************************************************** +// +// fonthangulgothic20pt.c - Font definition for the 20ptpt Hangulgothic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulgothic +// Size: 20pt +// Bold: no +// Italic: no +// Memory usage: 5919 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulgothic20pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 19, + + // + // The height of the font. + // + 20, + + // + // The baseline of the font. + // + 16, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x1c, 0x0b, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x91, 0x01, 0x00, 0x00, // Offset 401 (0x191) + 0x9e, 0x01, 0x00, 0x00, // Offset 414 (0x19e) + 0xc0, 0x01, 0x00, 0x00, // Offset 448 (0x1c0) + 0xdf, 0x01, 0x00, 0x00, // Offset 479 (0x1df) + 0x11, 0x02, 0x00, 0x00, // Offset 529 (0x211) + 0x38, 0x02, 0x00, 0x00, // Offset 568 (0x238) + 0x41, 0x02, 0x00, 0x00, // Offset 577 (0x241) + 0x56, 0x02, 0x00, 0x00, // Offset 598 (0x256) + 0x6b, 0x02, 0x00, 0x00, // Offset 619 (0x26b) + 0x7d, 0x02, 0x00, 0x00, // Offset 637 (0x27d) + 0x8d, 0x02, 0x00, 0x00, // Offset 653 (0x28d) + 0x96, 0x02, 0x00, 0x00, // Offset 662 (0x296) + 0x9d, 0x02, 0x00, 0x00, // Offset 669 (0x29d) + 0xa4, 0x02, 0x00, 0x00, // Offset 676 (0x2a4) + 0xba, 0x02, 0x00, 0x00, // Offset 698 (0x2ba) + 0xdc, 0x02, 0x00, 0x00, // Offset 732 (0x2dc) + 0xf1, 0x02, 0x00, 0x00, // Offset 753 (0x2f1) + 0x07, 0x03, 0x00, 0x00, // Offset 775 (0x307) + 0x1e, 0x03, 0x00, 0x00, // Offset 798 (0x31e) + 0x3c, 0x03, 0x00, 0x00, // Offset 828 (0x33c) + 0x52, 0x03, 0x00, 0x00, // Offset 850 (0x352) + 0x6f, 0x03, 0x00, 0x00, // Offset 879 (0x36f) + 0x84, 0x03, 0x00, 0x00, // Offset 900 (0x384) + 0xa4, 0x03, 0x00, 0x00, // Offset 932 (0x3a4) + 0xc1, 0x03, 0x00, 0x00, // Offset 961 (0x3c1) + 0xcb, 0x03, 0x00, 0x00, // Offset 971 (0x3cb) + 0xd6, 0x03, 0x00, 0x00, // Offset 982 (0x3d6) + 0xeb, 0x03, 0x00, 0x00, // Offset 1003 (0x3eb) + 0xf6, 0x03, 0x00, 0x00, // Offset 1014 (0x3f6) + 0x0c, 0x04, 0x00, 0x00, // Offset 1036 (0x40c) + 0x20, 0x04, 0x00, 0x00, // Offset 1056 (0x420) + 0x53, 0x04, 0x00, 0x00, // Offset 1107 (0x453) + 0x75, 0x04, 0x00, 0x00, // Offset 1141 (0x475) + 0x96, 0x04, 0x00, 0x00, // Offset 1174 (0x496) + 0xac, 0x04, 0x00, 0x00, // Offset 1196 (0x4ac) + 0xce, 0x04, 0x00, 0x00, // Offset 1230 (0x4ce) + 0xe3, 0x04, 0x00, 0x00, // Offset 1251 (0x4e3) + 0xf8, 0x04, 0x00, 0x00, // Offset 1272 (0x4f8) + 0x15, 0x05, 0x00, 0x00, // Offset 1301 (0x515) + 0x38, 0x05, 0x00, 0x00, // Offset 1336 (0x538) + 0x4a, 0x05, 0x00, 0x00, // Offset 1354 (0x54a) + 0x5e, 0x05, 0x00, 0x00, // Offset 1374 (0x55e) + 0x81, 0x05, 0x00, 0x00, // Offset 1409 (0x581) + 0x95, 0x05, 0x00, 0x00, // Offset 1429 (0x595) + 0xd1, 0x05, 0x00, 0x00, // Offset 1489 (0x5d1) + 0xff, 0x05, 0x00, 0x00, // Offset 1535 (0x5ff) + 0x22, 0x06, 0x00, 0x00, // Offset 1570 (0x622) + 0x3e, 0x06, 0x00, 0x00, // Offset 1598 (0x63e) + 0x62, 0x06, 0x00, 0x00, // Offset 1634 (0x662) + 0x84, 0x06, 0x00, 0x00, // Offset 1668 (0x684) + 0x9a, 0x06, 0x00, 0x00, // Offset 1690 (0x69a) + 0xaf, 0x06, 0x00, 0x00, // Offset 1711 (0x6af) + 0xd2, 0x06, 0x00, 0x00, // Offset 1746 (0x6d2) + 0xf4, 0x06, 0x00, 0x00, // Offset 1780 (0x6f4) + 0x30, 0x07, 0x00, 0x00, // Offset 1840 (0x730) + 0x51, 0x07, 0x00, 0x00, // Offset 1873 (0x751) + 0x6d, 0x07, 0x00, 0x00, // Offset 1901 (0x76d) + 0x82, 0x07, 0x00, 0x00, // Offset 1922 (0x782) + 0x98, 0x07, 0x00, 0x00, // Offset 1944 (0x798) + 0xcb, 0x07, 0x00, 0x00, // Offset 1995 (0x7cb) + 0xe1, 0x07, 0x00, 0x00, // Offset 2017 (0x7e1) + 0xf7, 0x07, 0x00, 0x00, // Offset 2039 (0x7f7) + 0xfd, 0x07, 0x00, 0x00, // Offset 2045 (0x7fd) + 0x05, 0x08, 0x00, 0x00, // Offset 2053 (0x805) + 0x1e, 0x08, 0x00, 0x00, // Offset 2078 (0x81e) + 0x3e, 0x08, 0x00, 0x00, // Offset 2110 (0x83e) + 0x50, 0x08, 0x00, 0x00, // Offset 2128 (0x850) + 0x71, 0x08, 0x00, 0x00, // Offset 2161 (0x871) + 0x87, 0x08, 0x00, 0x00, // Offset 2183 (0x887) + 0x9c, 0x08, 0x00, 0x00, // Offset 2204 (0x89c) + 0xba, 0x08, 0x00, 0x00, // Offset 2234 (0x8ba) + 0xda, 0x08, 0x00, 0x00, // Offset 2266 (0x8da) + 0xea, 0x08, 0x00, 0x00, // Offset 2282 (0x8ea) + 0xfe, 0x08, 0x00, 0x00, // Offset 2302 (0x8fe) + 0x1c, 0x09, 0x00, 0x00, // Offset 2332 (0x91c) + 0x2f, 0x09, 0x00, 0x00, // Offset 2351 (0x92f) + 0x58, 0x09, 0x00, 0x00, // Offset 2392 (0x958) + 0x75, 0x09, 0x00, 0x00, // Offset 2421 (0x975) + 0x90, 0x09, 0x00, 0x00, // Offset 2448 (0x990) + 0xae, 0x09, 0x00, 0x00, // Offset 2478 (0x9ae) + 0xcc, 0x09, 0x00, 0x00, // Offset 2508 (0x9cc) + 0xde, 0x09, 0x00, 0x00, // Offset 2526 (0x9de) + 0xf0, 0x09, 0x00, 0x00, // Offset 2544 (0x9f0) + 0x03, 0x0a, 0x00, 0x00, // Offset 2563 (0xa03) + 0x20, 0x0a, 0x00, 0x00, // Offset 2592 (0xa20) + 0x3a, 0x0a, 0x00, 0x00, // Offset 2618 (0xa3a) + 0x67, 0x0a, 0x00, 0x00, // Offset 2663 (0xa67) + 0x81, 0x0a, 0x00, 0x00, // Offset 2689 (0xa81) + 0x9c, 0x0a, 0x00, 0x00, // Offset 2716 (0xa9c) + 0xae, 0x0a, 0x00, 0x00, // Offset 2734 (0xaae) + 0xc4, 0x0a, 0x00, 0x00, // Offset 2756 (0xac4) + 0xd8, 0x0a, 0x00, 0x00, // Offset 2776 (0xad8) + 0xee, 0x0a, 0x00, 0x00, // Offset 2798 (0xaee) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 9, 0, 22, 64, 16, 3, 97, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 129, 33, 176, 13, 6, 193, + 33, 33, 33, 33, 33, 33, 33, 0, 10, 96, 34, 12, + 240, 194, 49, 97, 50, 97, 50, 97, 50, 97, 49, 74, + 66, 49, 98, 49, 97, 50, 74, 65, 50, 97, 49, 98, + 49, 98, 49, 98, 49, 240, 240, 176, 31, 10, 225, 118, + 50, 17, 81, 49, 81, 49, 81, 49, 98, 17, 115, 131, + 131, 113, 18, 97, 33, 97, 33, 97, 33, 97, 17, 54, + 129, 145, 240, 50, 19, 240, 242, 131, 97, 129, 49, 66, + 113, 81, 49, 129, 81, 33, 145, 81, 33, 145, 81, 17, + 177, 49, 18, 195, 33, 67, 162, 49, 49, 145, 49, 81, + 114, 49, 81, 113, 65, 81, 98, 65, 81, 97, 97, 49, + 97, 131, 0, 7, 80, 39, 15, 240, 240, 68, 161, 50, + 129, 81, 129, 81, 129, 81, 145, 49, 164, 164, 81, 66, + 34, 65, 50, 66, 49, 49, 98, 17, 65, 115, 65, 115, + 82, 66, 18, 86, 50, 0, 5, 112, 9, 3, 97, 33, + 33, 33, 240, 240, 224, 21, 6, 241, 65, 81, 65, 81, + 66, 65, 81, 81, 81, 81, 81, 81, 97, 81, 97, 81, + 97, 32, 21, 6, 193, 97, 81, 97, 81, 82, 81, 81, + 81, 81, 81, 81, 66, 65, 81, 65, 81, 65, 80, 18, + 9, 0, 7, 17, 129, 81, 33, 33, 39, 67, 97, 17, + 81, 49, 0, 8, 32, 16, 13, 0, 8, 97, 193, 193, + 193, 123, 113, 193, 193, 193, 193, 0, 9, 9, 4, 0, + 8, 2, 34, 33, 49, 48, 7, 7, 0, 7, 117, 0, + 9, 7, 4, 0, 8, 2, 34, 160, 22, 9, 240, 145, + 129, 114, 113, 114, 114, 113, 114, 114, 113, 114, 114, 113, + 114, 113, 129, 113, 240, 32, 34, 12, 240, 196, 113, 65, + 81, 97, 65, 97, 49, 129, 33, 129, 33, 129, 33, 129, + 33, 129, 33, 129, 33, 129, 34, 98, 49, 97, 81, 65, + 116, 240, 240, 176, 21, 6, 241, 51, 34, 17, 33, 33, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 240, + 80, 22, 11, 240, 133, 97, 65, 177, 161, 161, 161, 145, + 146, 145, 145, 146, 130, 130, 130, 153, 240, 240, 80, 23, + 11, 240, 134, 81, 81, 177, 161, 161, 146, 130, 84, 178, + 177, 161, 161, 146, 33, 82, 70, 240, 240, 112, 30, 13, + 240, 240, 34, 163, 161, 17, 146, 17, 130, 33, 129, 49, + 114, 49, 98, 65, 97, 81, 82, 81, 91, 145, 193, 193, + 193, 240, 240, 224, 22, 10, 240, 87, 49, 145, 145, 145, + 145, 150, 146, 161, 145, 145, 145, 130, 33, 66, 53, 240, + 240, 80, 29, 11, 240, 181, 66, 130, 145, 145, 161, 161, + 36, 67, 65, 50, 97, 33, 113, 33, 113, 33, 113, 49, + 82, 50, 50, 85, 240, 240, 112, 21, 11, 240, 121, 146, + 145, 161, 146, 145, 146, 145, 146, 146, 145, 146, 145, 146, + 145, 240, 240, 176, 32, 12, 240, 196, 113, 65, 81, 97, + 65, 97, 65, 97, 81, 65, 116, 132, 99, 35, 50, 98, + 33, 129, 33, 129, 33, 129, 50, 66, 101, 240, 240, 160, + 29, 11, 240, 149, 82, 50, 50, 81, 49, 113, 33, 113, + 33, 113, 33, 98, 49, 67, 69, 17, 161, 161, 145, 146, + 130, 69, 240, 240, 144, 10, 4, 240, 18, 34, 240, 242, + 34, 240, 112, 11, 4, 240, 18, 34, 240, 242, 34, 33, + 49, 240, 21, 11, 240, 226, 130, 130, 130, 130, 130, 130, + 130, 146, 162, 162, 162, 162, 162, 162, 161, 177, 208, 11, + 13, 0, 11, 59, 240, 240, 187, 0, 13, 32, 22, 11, + 240, 113, 177, 177, 177, 178, 162, 162, 161, 162, 130, 130, + 130, 130, 130, 130, 130, 145, 240, 96, 20, 9, 240, 53, + 145, 145, 129, 129, 114, 113, 113, 113, 113, 129, 240, 178, + 114, 240, 240, 32, 51, 17, 240, 240, 150, 146, 82, 113, + 146, 65, 83, 49, 65, 65, 50, 33, 33, 65, 66, 33, + 33, 49, 82, 33, 33, 49, 81, 49, 33, 49, 66, 49, + 33, 49, 66, 33, 65, 33, 50, 33, 81, 51, 19, 113, + 161, 98, 98, 150, 0, 7, 16, 34, 15, 240, 240, 83, + 195, 193, 17, 178, 18, 161, 34, 146, 49, 145, 66, 114, + 81, 114, 82, 97, 98, 90, 81, 130, 50, 145, 50, 146, + 33, 162, 0, 5, 112, 33, 11, 240, 118, 81, 81, 65, + 97, 49, 97, 49, 97, 49, 97, 49, 66, 70, 81, 82, + 49, 113, 33, 113, 33, 113, 33, 113, 33, 82, 54, 240, + 240, 128, 22, 13, 240, 240, 22, 82, 161, 177, 178, 177, + 193, 193, 193, 193, 194, 193, 209, 210, 199, 240, 240, 176, + 34, 13, 240, 183, 97, 83, 65, 114, 49, 129, 49, 145, + 33, 145, 33, 145, 33, 145, 33, 145, 33, 145, 33, 130, + 33, 129, 49, 113, 65, 82, 86, 0, 5, 96, 21, 10, + 240, 87, 49, 145, 145, 145, 145, 145, 151, 49, 145, 145, + 145, 145, 145, 152, 240, 240, 32, 21, 9, 240, 55, 33, + 129, 129, 129, 129, 129, 135, 33, 129, 129, 129, 129, 129, + 129, 240, 240, 80, 29, 14, 240, 240, 39, 83, 162, 193, + 194, 193, 209, 209, 101, 33, 161, 33, 161, 34, 145, 49, + 145, 65, 129, 82, 97, 103, 240, 240, 240, 35, 12, 240, + 145, 129, 33, 129, 33, 129, 33, 129, 33, 129, 33, 129, + 33, 129, 42, 33, 129, 33, 129, 33, 129, 33, 129, 33, + 129, 33, 129, 33, 129, 240, 240, 128, 18, 3, 97, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 176, 20, 7, 240, 49, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 81, 52, 240, 144, 35, 11, + 240, 113, 98, 33, 82, 49, 66, 65, 65, 81, 50, 81, + 34, 97, 18, 117, 98, 33, 97, 50, 81, 66, 65, 81, + 65, 82, 49, 98, 33, 113, 240, 240, 80, 20, 9, 240, + 49, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 135, 240, 224, 60, 17, 240, 240, 66, 178, 35, + 147, 33, 17, 147, 33, 18, 114, 17, 33, 18, 114, 17, + 33, 33, 113, 33, 33, 34, 82, 33, 33, 49, 81, 49, + 33, 50, 50, 49, 33, 65, 50, 49, 33, 65, 49, 65, + 33, 66, 18, 65, 33, 81, 17, 81, 33, 83, 81, 33, + 97, 97, 0, 6, 80, 46, 13, 240, 178, 129, 35, 113, + 35, 113, 33, 18, 97, 33, 34, 81, 33, 34, 81, 33, + 50, 65, 33, 50, 65, 33, 66, 49, 33, 82, 33, 33, + 82, 33, 33, 98, 17, 33, 98, 17, 33, 115, 33, 130, + 240, 240, 176, 35, 15, 240, 240, 69, 130, 82, 82, 114, + 65, 145, 50, 146, 33, 177, 33, 177, 33, 177, 33, 177, + 33, 177, 34, 146, 49, 145, 66, 114, 82, 82, 133, 0, + 6, 48, 28, 11, 240, 119, 65, 97, 49, 113, 33, 113, + 33, 113, 33, 113, 33, 98, 33, 82, 54, 81, 161, 161, + 161, 161, 161, 240, 240, 208, 36, 15, 240, 240, 69, 130, + 82, 82, 114, 65, 145, 50, 146, 33, 177, 33, 177, 33, + 177, 33, 177, 33, 177, 34, 146, 49, 145, 66, 114, 82, + 82, 134, 210, 226, 226, 48, 34, 12, 240, 151, 81, 82, + 65, 113, 49, 113, 49, 113, 49, 113, 49, 98, 49, 82, + 71, 81, 81, 81, 82, 65, 97, 65, 98, 49, 113, 49, + 114, 240, 240, 128, 22, 10, 240, 117, 65, 129, 145, 145, + 161, 162, 147, 146, 146, 145, 145, 145, 33, 81, 54, 240, + 240, 64, 21, 12, 240, 154, 113, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 240, 240, 192, 35, + 13, 240, 177, 145, 33, 145, 33, 145, 33, 145, 33, 145, + 33, 145, 33, 145, 33, 145, 33, 145, 33, 145, 33, 145, + 33, 145, 49, 113, 66, 82, 101, 240, 240, 224, 34, 15, + 240, 242, 146, 49, 146, 50, 129, 81, 114, 81, 113, 98, + 97, 113, 82, 114, 65, 130, 65, 145, 50, 146, 33, 177, + 18, 177, 17, 195, 210, 0, 6, 64, 60, 21, 240, 240, + 193, 114, 129, 33, 115, 98, 34, 97, 17, 97, 50, 82, + 17, 97, 65, 81, 34, 66, 65, 81, 34, 66, 66, 65, + 49, 65, 97, 50, 49, 65, 97, 49, 66, 34, 98, 33, + 81, 33, 114, 18, 81, 33, 129, 17, 97, 18, 129, 17, + 100, 131, 114, 162, 114, 0, 8, 80, 33, 14, 240, 210, + 129, 66, 98, 81, 82, 98, 65, 130, 34, 145, 18, 163, + 194, 180, 146, 33, 130, 50, 113, 82, 82, 97, 66, 114, + 49, 146, 240, 240, 224, 28, 13, 240, 177, 145, 34, 114, + 50, 82, 81, 81, 98, 50, 113, 34, 145, 17, 163, 177, + 193, 193, 193, 193, 193, 193, 0, 5, 96, 21, 12, 240, + 153, 162, 161, 162, 146, 162, 146, 161, 162, 146, 162, 146, + 161, 162, 170, 240, 240, 128, 22, 5, 83, 33, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 67, 32, 51, 19, 0, 7, 34, 82, 81, 81, + 82, 81, 81, 65, 17, 66, 81, 65, 17, 65, 98, 49, + 18, 49, 79, 2, 81, 33, 49, 34, 113, 33, 49, 33, + 129, 33, 49, 33, 130, 17, 50, 17, 147, 67, 146, 82, + 162, 82, 162, 82, 0, 7, 112, 22, 5, 83, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 35, 32, 22, 12, 240, 210, 147, 145, 18, + 114, 33, 113, 50, 82, 65, 81, 82, 50, 97, 49, 114, + 0, 13, 96, 6, 13, 0, 30, 123, 32, 8, 5, 161, + 66, 66, 0, 9, 80, 25, 10, 0, 7, 101, 65, 66, + 145, 145, 70, 50, 65, 33, 97, 33, 97, 33, 82, 34, + 51, 53, 17, 240, 240, 32, 32, 11, 177, 161, 161, 161, + 161, 161, 21, 67, 50, 50, 82, 33, 113, 33, 113, 33, + 113, 33, 113, 33, 113, 34, 81, 51, 50, 49, 21, 240, + 240, 112, 18, 10, 0, 7, 117, 50, 129, 129, 145, 145, + 145, 145, 161, 146, 165, 240, 240, 32, 33, 11, 240, 65, + 161, 161, 161, 161, 69, 17, 50, 51, 34, 82, 33, 113, + 33, 113, 33, 113, 33, 113, 33, 113, 49, 82, 50, 51, + 69, 17, 240, 240, 80, 22, 11, 0, 8, 84, 82, 50, + 65, 81, 49, 113, 33, 113, 41, 33, 161, 177, 162, 181, + 240, 240, 96, 21, 9, 196, 66, 113, 129, 129, 102, 81, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 240, 240, 48, + 30, 11, 0, 8, 69, 17, 50, 51, 34, 82, 33, 113, + 33, 113, 33, 113, 33, 113, 33, 113, 49, 82, 50, 51, + 84, 17, 145, 146, 69, 80, 32, 10, 161, 145, 145, 145, + 145, 145, 20, 66, 65, 49, 97, 33, 97, 33, 97, 33, + 97, 33, 97, 33, 97, 33, 97, 33, 97, 33, 97, 240, + 240, 32, 16, 3, 49, 33, 177, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 176, 20, 6, 130, 66, 240, 113, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 50, 64, 30, 9, 145, 129, 129, 129, 129, 129, 66, 33, + 65, 49, 49, 65, 33, 81, 18, 84, 82, 17, 81, 49, + 65, 50, 49, 66, 33, 81, 240, 224, 19, 3, 49, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 176, 41, 17, 0, 12, 97, 20, 52, 66, 65, + 18, 49, 49, 98, 81, 33, 97, 97, 33, 97, 97, 33, + 97, 97, 33, 97, 97, 33, 97, 97, 33, 97, 97, 33, + 97, 97, 33, 97, 97, 0, 6, 80, 29, 10, 0, 7, + 65, 20, 66, 65, 49, 97, 33, 97, 33, 97, 33, 97, + 33, 97, 33, 97, 33, 97, 33, 97, 33, 97, 240, 240, + 32, 27, 12, 0, 9, 52, 98, 66, 65, 97, 49, 129, + 33, 129, 33, 129, 33, 129, 33, 129, 49, 97, 66, 66, + 100, 240, 240, 176, 30, 11, 0, 8, 33, 21, 67, 50, + 50, 81, 49, 113, 33, 113, 33, 113, 33, 113, 33, 113, + 34, 81, 51, 50, 49, 21, 65, 161, 161, 160, 30, 11, + 0, 8, 69, 17, 50, 51, 34, 82, 33, 113, 33, 113, + 33, 113, 33, 113, 33, 113, 49, 82, 50, 51, 69, 17, + 161, 161, 161, 32, 18, 7, 240, 240, 193, 19, 34, 82, + 81, 97, 97, 97, 97, 97, 97, 97, 240, 192, 18, 9, + 0, 7, 5, 50, 113, 129, 146, 131, 130, 129, 129, 33, + 66, 53, 240, 240, 19, 9, 240, 225, 129, 129, 102, 81, + 129, 129, 129, 129, 129, 129, 129, 129, 148, 240, 224, 29, + 10, 0, 7, 65, 97, 33, 97, 33, 97, 33, 97, 33, + 97, 33, 97, 33, 97, 33, 97, 33, 82, 49, 51, 68, + 17, 240, 240, 32, 26, 10, 0, 7, 65, 97, 33, 97, + 34, 66, 49, 65, 65, 65, 66, 34, 81, 33, 97, 33, + 100, 114, 130, 240, 240, 80, 45, 19, 0, 14, 34, 98, + 82, 49, 83, 81, 66, 65, 17, 66, 66, 65, 17, 66, + 81, 50, 18, 49, 97, 49, 49, 49, 98, 33, 49, 34, + 113, 18, 50, 17, 129, 17, 81, 17, 131, 83, 146, 82, + 0, 7, 112, 26, 10, 0, 7, 66, 66, 49, 65, 81, + 34, 82, 17, 114, 130, 116, 97, 33, 82, 49, 50, 66, + 33, 97, 240, 240, 32, 27, 10, 0, 7, 65, 82, 33, + 82, 34, 65, 65, 50, 65, 49, 82, 33, 97, 18, 97, + 17, 115, 130, 129, 145, 129, 115, 112, 18, 10, 0, 7, + 72, 130, 114, 129, 130, 114, 114, 129, 129, 130, 136, 240, + 240, 32, 22, 7, 162, 65, 97, 97, 97, 97, 97, 97, + 82, 66, 98, 97, 97, 97, 97, 97, 97, 97, 114, 32, + 20, 3, 49, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 128, 22, 7, 114, 113, + 97, 97, 97, 97, 97, 97, 98, 98, 66, 81, 97, 97, + 97, 97, 97, 97, 66, 80, 13, 12, 0, 12, 19, 129, + 35, 34, 33, 68, 0, 13, 112, + 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x90, 0x01, 0x00, 0x00, // Offset 400 (0x190) + 0xa8, 0x01, 0x00, 0x00, // Offset 424 (0x1a8) + 0xc6, 0x01, 0x00, 0x00, // Offset 454 (0x1c6) + 0xd5, 0x01, 0x00, 0x00, // Offset 469 (0x1d5) + 0xed, 0x01, 0x00, 0x00, // Offset 493 (0x1ed) + 0x06, 0x02, 0x00, 0x00, // Offset 518 (0x206) + 0x15, 0x02, 0x00, 0x00, // Offset 533 (0x215) + 0x2c, 0x02, 0x00, 0x00, // Offset 556 (0x22c) + 0x3c, 0x02, 0x00, 0x00, // Offset 572 (0x23c) + 0x52, 0x02, 0x00, 0x00, // Offset 594 (0x252) + 0x6d, 0x02, 0x00, 0x00, // Offset 621 (0x26d) + 0x89, 0x02, 0x00, 0x00, // Offset 649 (0x289) + 0xa4, 0x02, 0x00, 0x00, // Offset 676 (0x2a4) + 0xb9, 0x02, 0x00, 0x00, // Offset 697 (0x2b9) + 0xd9, 0x02, 0x00, 0x00, // Offset 729 (0x2d9) + 0xf3, 0x02, 0x00, 0x00, // Offset 755 (0x2f3) + 0x08, 0x03, 0x00, 0x00, // Offset 776 (0x308) + 0x1d, 0x03, 0x00, 0x00, // Offset 797 (0x31d) + 0x43, 0x03, 0x00, 0x00, // Offset 835 (0x343) + 0x67, 0x03, 0x00, 0x00, // Offset 871 (0x367) + 0x79, 0x03, 0x00, 0x00, // Offset 889 (0x379) + 0x97, 0x03, 0x00, 0x00, // Offset 919 (0x397) + 0xae, 0x03, 0x00, 0x00, // Offset 942 (0x3ae) + 0xc1, 0x03, 0x00, 0x00, // Offset 961 (0x3c1) + 0xdb, 0x03, 0x00, 0x00, // Offset 987 (0x3db) + 0xef, 0x03, 0x00, 0x00, // Offset 1007 (0x3ef) + 0xff, 0x03, 0x00, 0x00, // Offset 1023 (0x3ff) + 0x0e, 0x04, 0x00, 0x00, // Offset 1038 (0x40e) + 0x24, 0x04, 0x00, 0x00, // Offset 1060 (0x424) + 0x39, 0x04, 0x00, 0x00, // Offset 1081 (0x439) + 0x4e, 0x04, 0x00, 0x00, // Offset 1102 (0x44e) + 0x73, 0x04, 0x00, 0x00, // Offset 1139 (0x473) + 0x88, 0x04, 0x00, 0x00, // Offset 1160 (0x488) + 0xac, 0x04, 0x00, 0x00, // Offset 1196 (0x4ac) + 0xc1, 0x04, 0x00, 0x00, // Offset 1217 (0x4c1) + 0xe7, 0x04, 0x00, 0x00, // Offset 1255 (0x4e7) + 0xfc, 0x04, 0x00, 0x00, // Offset 1276 (0x4fc) + 0x22, 0x05, 0x00, 0x00, // Offset 1314 (0x522) + 0x36, 0x05, 0x00, 0x00, // Offset 1334 (0x536) + 0x60, 0x05, 0x00, 0x00, // Offset 1376 (0x560) + 0x8e, 0x05, 0x00, 0x00, // Offset 1422 (0x58e) + 0xad, 0x05, 0x00, 0x00, // Offset 1453 (0x5ad) + 0xc2, 0x05, 0x00, 0x00, // Offset 1474 (0x5c2) + 0xda, 0x05, 0x00, 0x00, // Offset 1498 (0x5da) + 0x04, 0x06, 0x00, 0x00, // Offset 1540 (0x604) + 0x36, 0x06, 0x00, 0x00, // Offset 1590 (0x636) + 0x5f, 0x06, 0x00, 0x00, // Offset 1631 (0x65f) + 0x78, 0x06, 0x00, 0x00, // Offset 1656 (0x678) + 0x81, 0x06, 0x00, 0x00, // Offset 1665 (0x681) + 0xaa, 0x06, 0x00, 0x00, // Offset 1706 (0x6aa) + 0xbf, 0x06, 0x00, 0x00, // Offset 1727 (0x6bf) + 0xc3, 0x06, 0x00, 0x00, // Offset 1731 (0x6c3) + 0xd8, 0x06, 0x00, 0x00, // Offset 1752 (0x6d8) + 0xed, 0x06, 0x00, 0x00, // Offset 1773 (0x6ed) + 0x0a, 0x07, 0x00, 0x00, // Offset 1802 (0x70a) + 0x23, 0x07, 0x00, 0x00, // Offset 1827 (0x723) + 0x47, 0x07, 0x00, 0x00, // Offset 1863 (0x747) + 0x5e, 0x07, 0x00, 0x00, // Offset 1886 (0x75e) + 0x8b, 0x07, 0x00, 0x00, // Offset 1931 (0x78b) + 0xa4, 0x07, 0x00, 0x00, // Offset 1956 (0x7a4) + 0xc0, 0x07, 0x00, 0x00, // Offset 1984 (0x7c0) + 0xe3, 0x07, 0x00, 0x00, // Offset 2019 (0x7e3) + 0x06, 0x08, 0x00, 0x00, // Offset 2054 (0x806) + 0x26, 0x08, 0x00, 0x00, // Offset 2086 (0x826) + 0x40, 0x08, 0x00, 0x00, // Offset 2112 (0x840) + 0x5c, 0x08, 0x00, 0x00, // Offset 2140 (0x85c) + 0x79, 0x08, 0x00, 0x00, // Offset 2169 (0x879) + 0xa4, 0x08, 0x00, 0x00, // Offset 2212 (0x8a4) + 0xcd, 0x08, 0x00, 0x00, // Offset 2253 (0x8cd) + 0xef, 0x08, 0x00, 0x00, // Offset 2287 (0x8ef) + 0x0c, 0x09, 0x00, 0x00, // Offset 2316 (0x90c) + 0x28, 0x09, 0x00, 0x00, // Offset 2344 (0x928) + 0x50, 0x09, 0x00, 0x00, // Offset 2384 (0x950) + 0x6d, 0x09, 0x00, 0x00, // Offset 2413 (0x96d) + 0x89, 0x09, 0x00, 0x00, // Offset 2441 (0x989) + 0xa4, 0x09, 0x00, 0x00, // Offset 2468 (0x9a4) + 0xc7, 0x09, 0x00, 0x00, // Offset 2503 (0x9c7) + 0xe4, 0x09, 0x00, 0x00, // Offset 2532 (0x9e4) + 0xf9, 0x09, 0x00, 0x00, // Offset 2553 (0x9f9) + 0x1c, 0x0a, 0x00, 0x00, // Offset 2588 (0xa1c) + 0x34, 0x0a, 0x00, 0x00, // Offset 2612 (0xa34) + 0x59, 0x0a, 0x00, 0x00, // Offset 2649 (0xa59) + 0x7b, 0x0a, 0x00, 0x00, // Offset 2683 (0xa7b) + 0x98, 0x0a, 0x00, 0x00, // Offset 2712 (0xa98) + 0xb8, 0x0a, 0x00, 0x00, // Offset 2744 (0xab8) + 0xcf, 0x0a, 0x00, 0x00, // Offset 2767 (0xacf) + 0xfb, 0x0a, 0x00, 0x00, // Offset 2811 (0xafb) + 0x35, 0x0b, 0x00, 0x00, // Offset 2869 (0xb35) + 0x59, 0x0b, 0x00, 0x00, // Offset 2905 (0xb59) + 0x82, 0x0b, 0x00, 0x00, // Offset 2946 (0xb82) + 0xbd, 0x0b, 0x00, 0x00, // Offset 3005 (0xbbd) + 0xe4, 0x0b, 0x00, 0x00, // Offset 3044 (0xbe4) + 0xed, 0x0b, 0x00, 0x00, // Offset 3053 (0xbed) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 16, 11, 0, 8, 41, 161, 161, 161, 161, 161, 161, 161, + 161, 0, 7, 16, 24, 14, 0, 10, 69, 37, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 0, 9, 30, 15, 0, 11, 37, 65, 145, 65, + 145, 65, 145, 50, 145, 49, 17, 129, 49, 17, 129, 34, + 18, 113, 18, 50, 97, 17, 81, 0, 9, 80, 15, 11, + 0, 8, 33, 161, 161, 161, 161, 161, 161, 169, 0, 8, + 64, 24, 16, 0, 12, 1, 86, 65, 161, 65, 146, 65, + 130, 81, 130, 81, 116, 65, 98, 34, 56, 66, 0, 12, + 32, 25, 15, 0, 10, 21, 65, 225, 72, 33, 225, 100, + 65, 81, 65, 49, 81, 65, 49, 81, 65, 54, 20, 0, + 11, 96, 15, 11, 0, 8, 41, 33, 161, 161, 161, 161, + 161, 169, 0, 8, 64, 23, 14, 0, 10, 69, 22, 33, + 81, 113, 81, 113, 81, 113, 81, 113, 81, 113, 81, 117, + 22, 0, 10, 96, 16, 12, 0, 7, 73, 177, 177, 177, + 57, 49, 177, 177, 186, 0, 9, 32, 22, 13, 0, 9, + 101, 21, 97, 81, 97, 81, 37, 81, 33, 145, 33, 145, + 33, 145, 38, 65, 0, 10, 27, 13, 0, 9, 101, 21, + 97, 17, 49, 97, 17, 49, 37, 17, 49, 33, 81, 49, + 33, 81, 49, 33, 81, 49, 43, 0, 10, 28, 14, 0, + 10, 69, 17, 65, 97, 17, 65, 97, 17, 65, 37, 22, + 33, 81, 65, 33, 81, 65, 33, 81, 65, 44, 0, 10, + 96, 27, 15, 0, 11, 37, 65, 145, 65, 145, 65, 85, + 50, 81, 113, 17, 65, 98, 18, 49, 82, 50, 37, 17, + 81, 0, 11, 64, 21, 13, 0, 9, 101, 21, 97, 17, + 161, 17, 101, 21, 33, 81, 97, 81, 97, 81, 107, 0, + 10, 32, 15, 0, 9, 53, 23, 97, 33, 33, 129, 33, + 33, 129, 33, 33, 69, 33, 33, 65, 97, 33, 65, 97, + 33, 65, 97, 33, 69, 23, 0, 11, 64, 26, 15, 0, + 9, 53, 37, 113, 225, 23, 97, 165, 52, 49, 97, 65, + 33, 97, 65, 33, 97, 65, 38, 36, 0, 11, 80, 21, + 11, 0, 8, 41, 33, 113, 33, 113, 33, 113, 33, 113, + 33, 113, 33, 113, 41, 0, 8, 64, 21, 11, 0, 8, + 33, 113, 33, 113, 33, 113, 41, 33, 113, 33, 113, 33, + 113, 41, 0, 8, 64, 38, 13, 0, 8, 17, 49, 17, + 49, 33, 49, 17, 49, 33, 49, 17, 49, 33, 49, 17, + 49, 37, 21, 33, 49, 17, 49, 33, 49, 17, 49, 33, + 49, 17, 49, 37, 21, 0, 10, 36, 15, 0, 9, 49, + 49, 65, 81, 49, 65, 81, 49, 65, 81, 49, 65, 85, + 65, 81, 49, 49, 17, 65, 49, 49, 17, 65, 49, 33, + 49, 53, 18, 50, 0, 11, 64, 18, 13, 0, 10, 49, + 193, 178, 178, 162, 17, 145, 34, 113, 66, 66, 99, 0, + 10, 30, 15, 0, 9, 113, 65, 145, 65, 145, 65, 131, + 49, 129, 17, 35, 98, 18, 17, 18, 66, 51, 34, 34, + 66, 65, 114, 209, 0, 10, 64, 23, 12, 0, 7, 116, + 98, 66, 50, 98, 33, 129, 33, 129, 33, 129, 34, 98, + 50, 66, 100, 0, 9, 80, 19, 15, 0, 9, 74, 210, + 194, 194, 194, 180, 162, 50, 99, 83, 50, 146, 0, 11, + 64, 26, 16, 0, 10, 22, 21, 130, 66, 129, 81, 130, + 66, 115, 50, 114, 34, 19, 82, 66, 50, 34, 82, 65, + 130, 0, 13, 20, 14, 0, 7, 53, 240, 240, 89, 210, + 178, 162, 179, 146, 35, 67, 99, 33, 0, 10, 48, 16, + 11, 0, 6, 121, 161, 161, 161, 161, 41, 161, 161, 161, + 0, 8, 64, 15, 12, 0, 9, 9, 49, 177, 185, 49, + 177, 177, 186, 0, 9, 32, 22, 13, 0, 8, 26, 97, + 49, 129, 49, 129, 49, 129, 49, 129, 49, 129, 49, 129, + 49, 91, 0, 10, 21, 13, 0, 8, 54, 240, 59, 240, + 53, 113, 81, 81, 113, 65, 113, 81, 81, 117, 0, 8, + 96, 21, 6, 97, 81, 81, 81, 81, 81, 81, 81, 84, + 33, 81, 81, 81, 81, 81, 81, 81, 81, 176, 37, 8, + 129, 65, 33, 65, 33, 65, 33, 65, 33, 65, 33, 65, + 33, 65, 33, 65, 38, 33, 65, 33, 65, 33, 65, 33, + 65, 33, 65, 33, 65, 33, 65, 33, 65, 113, 160, 21, + 6, 97, 81, 81, 81, 81, 84, 33, 81, 81, 81, 84, + 33, 81, 81, 81, 81, 81, 81, 176, 36, 8, 129, 65, + 33, 65, 33, 65, 33, 65, 33, 65, 38, 33, 65, 33, + 65, 33, 65, 33, 65, 38, 33, 65, 33, 65, 33, 65, + 33, 65, 33, 65, 33, 65, 113, 160, 21, 7, 177, 97, + 97, 97, 97, 97, 97, 37, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 144, 38, 10, 209, 49, 81, 49, 81, + 49, 81, 49, 81, 49, 81, 49, 81, 49, 36, 49, 81, + 49, 81, 49, 81, 49, 81, 49, 81, 49, 81, 49, 81, + 49, 81, 49, 81, 49, 145, 192, 21, 7, 177, 97, 97, + 97, 97, 37, 97, 97, 97, 97, 37, 97, 97, 97, 97, + 97, 97, 97, 144, 38, 10, 209, 49, 81, 49, 81, 49, + 81, 49, 81, 49, 36, 49, 81, 49, 81, 49, 81, 49, + 81, 49, 36, 49, 81, 49, 81, 49, 81, 49, 81, 49, + 81, 49, 81, 49, 145, 192, 20, 19, 0, 20, 1, 240, + 49, 240, 49, 240, 49, 240, 49, 240, 49, 175, 2, 0, + 12, 16, 42, 19, 240, 240, 33, 240, 49, 240, 49, 240, + 49, 240, 49, 240, 49, 240, 49, 161, 113, 161, 116, 113, + 113, 161, 113, 161, 113, 161, 81, 17, 91, 33, 240, 49, + 240, 49, 240, 49, 240, 49, 240, 144, 46, 18, 240, 225, + 49, 209, 49, 209, 49, 209, 49, 209, 49, 209, 49, 209, + 49, 113, 85, 113, 81, 49, 113, 81, 49, 113, 81, 49, + 113, 81, 49, 42, 17, 49, 209, 49, 209, 49, 209, 49, + 209, 49, 240, 33, 240, 80, 31, 16, 240, 225, 241, 241, + 241, 241, 241, 241, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 65, 33, 43, 33, 241, 241, 241, 241, 240, + 48, 21, 19, 0, 19, 81, 81, 193, 81, 193, 81, 193, + 81, 193, 81, 193, 81, 127, 2, 0, 12, 16, 24, 19, + 0, 16, 95, 2, 161, 240, 49, 240, 49, 240, 49, 240, + 49, 240, 49, 240, 49, 240, 49, 0, 10, 96, 42, 17, + 240, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, + 17, 240, 17, 240, 17, 38, 97, 17, 134, 33, 129, 113, + 129, 113, 129, 53, 129, 113, 129, 113, 129, 113, 129, 113, + 240, 17, 240, 64, 50, 17, 240, 209, 33, 209, 33, 209, + 33, 209, 33, 209, 33, 209, 33, 209, 33, 209, 33, 41, + 33, 33, 97, 97, 33, 97, 97, 33, 97, 97, 33, 97, + 52, 33, 97, 97, 33, 97, 97, 33, 97, 97, 33, 97, + 97, 33, 240, 17, 240, 64, 41, 17, 240, 240, 17, 240, + 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 225, + 17, 45, 17, 129, 113, 129, 113, 129, 113, 129, 113, 129, + 113, 129, 113, 129, 113, 240, 17, 240, 17, 240, 64, 25, + 19, 0, 16, 95, 2, 113, 81, 193, 81, 193, 81, 193, + 81, 193, 81, 193, 81, 193, 81, 193, 81, 0, 10, 48, + 9, 19, 0, 23, 111, 2, 0, 21, 80, 41, 17, 240, + 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, + 240, 17, 240, 17, 240, 17, 240, 17, 225, 17, 45, 17, + 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, + 240, 64, 21, 3, 49, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 80, 4, + 22, 0, 55, 21, 13, 0, 9, 97, 81, 97, 81, 97, + 81, 97, 81, 97, 81, 97, 81, 97, 81, 107, 0, 10, + 21, 13, 0, 9, 97, 85, 33, 81, 97, 81, 97, 81, + 97, 81, 97, 81, 97, 81, 107, 0, 10, 29, 15, 0, + 10, 65, 81, 129, 81, 129, 81, 129, 81, 114, 81, 113, + 17, 65, 113, 17, 65, 97, 49, 53, 18, 50, 129, 0, + 10, 48, 25, 13, 0, 9, 97, 113, 65, 98, 65, 98, + 65, 82, 17, 49, 82, 17, 49, 81, 33, 49, 66, 49, + 43, 0, 10, 36, 19, 0, 14, 36, 20, 65, 129, 65, + 65, 129, 65, 65, 84, 65, 65, 81, 113, 49, 17, 65, + 113, 49, 17, 65, 113, 34, 18, 53, 49, 33, 50, 194, + 0, 12, 96, 23, 14, 0, 10, 69, 37, 97, 33, 161, + 33, 101, 33, 97, 97, 97, 97, 97, 97, 102, 21, 0, + 10, 96, 45, 19, 0, 11, 116, 33, 17, 65, 129, 33, + 17, 65, 129, 33, 17, 65, 129, 33, 17, 65, 84, 35, + 50, 81, 81, 17, 49, 17, 65, 81, 17, 49, 17, 65, + 81, 17, 34, 18, 53, 19, 18, 50, 0, 14, 64, 25, + 15, 0, 11, 37, 65, 145, 65, 145, 51, 69, 51, 65, + 97, 33, 65, 97, 34, 49, 81, 50, 61, 0, 11, 64, + 28, 15, 0, 11, 37, 23, 97, 225, 51, 69, 34, 18, + 49, 97, 49, 49, 97, 49, 49, 97, 49, 54, 17, 34, + 179, 0, 9, 112, 35, 14, 0, 10, 69, 33, 49, 33, + 49, 33, 49, 33, 49, 33, 49, 33, 49, 37, 33, 49, + 33, 49, 33, 49, 33, 49, 33, 49, 33, 49, 37, 37, + 0, 10, 96, 35, 15, 0, 11, 37, 65, 81, 49, 65, + 81, 49, 65, 81, 49, 65, 81, 49, 49, 17, 65, 49, + 49, 17, 65, 49, 34, 18, 53, 33, 50, 129, 81, 0, + 9, 80, 32, 15, 0, 11, 37, 65, 81, 49, 65, 81, + 49, 51, 65, 49, 51, 65, 49, 33, 33, 65, 49, 33, + 34, 49, 49, 17, 50, 53, 23, 0, 11, 64, 26, 12, + 0, 6, 10, 33, 129, 33, 129, 33, 129, 33, 129, 42, + 240, 227, 129, 49, 113, 49, 113, 49, 131, 240, 240, 192, + 28, 13, 0, 9, 97, 49, 21, 33, 49, 81, 33, 49, + 81, 37, 81, 33, 49, 81, 33, 49, 81, 33, 49, 81, + 37, 81, 0, 10, 29, 14, 0, 10, 65, 49, 37, 33, + 49, 33, 97, 49, 33, 101, 33, 97, 49, 33, 97, 49, + 33, 97, 49, 33, 101, 37, 0, 10, 96, 43, 16, 0, + 10, 1, 49, 49, 113, 49, 49, 20, 33, 49, 49, 65, + 33, 49, 49, 65, 37, 34, 65, 33, 49, 34, 65, 33, + 49, 33, 17, 49, 33, 49, 17, 34, 33, 39, 49, 33, + 193, 0, 10, 80, 41, 17, 0, 12, 97, 49, 49, 36, + 33, 49, 49, 33, 81, 49, 49, 33, 85, 49, 33, 81, + 49, 34, 33, 81, 49, 33, 17, 17, 81, 49, 33, 17, + 17, 85, 18, 37, 129, 49, 0, 11, 48, 34, 16, 0, + 10, 1, 49, 177, 49, 22, 65, 49, 82, 65, 49, 81, + 85, 66, 81, 49, 51, 81, 49, 49, 18, 65, 49, 18, + 50, 53, 17, 82, 0, 12, 32, 29, 14, 0, 10, 65, + 49, 22, 33, 49, 18, 97, 49, 18, 101, 22, 33, 49, + 18, 97, 49, 18, 97, 49, 18, 101, 22, 0, 10, 96, + 28, 11, 240, 240, 49, 113, 33, 113, 33, 113, 41, 33, + 113, 33, 113, 41, 240, 195, 113, 49, 97, 49, 97, 49, + 115, 240, 240, 128, 40, 13, 0, 6, 65, 49, 17, 49, + 33, 49, 17, 49, 37, 21, 33, 49, 17, 49, 33, 49, + 17, 49, 33, 49, 17, 49, 37, 21, 240, 67, 145, 49, + 129, 49, 129, 49, 147, 240, 240, 240, 29, 13, 0, 10, + 17, 37, 81, 97, 81, 97, 66, 97, 65, 17, 81, 65, + 17, 81, 50, 33, 65, 34, 50, 49, 33, 145, 0, 8, + 48, 28, 15, 0, 11, 81, 65, 145, 65, 145, 65, 130, + 65, 129, 17, 49, 129, 17, 49, 114, 18, 33, 98, 50, + 21, 33, 0, 11, 16, 27, 14, 0, 10, 113, 53, 81, + 49, 145, 49, 145, 49, 129, 17, 33, 129, 17, 33, 114, + 18, 17, 98, 55, 33, 0, 10, 48, 35, 15, 0, 9, + 97, 49, 65, 81, 49, 65, 81, 49, 65, 81, 49, 65, + 66, 54, 65, 17, 33, 65, 50, 17, 33, 65, 49, 49, + 17, 65, 33, 72, 0, 11, 64, 29, 17, 0, 11, 1, + 240, 17, 54, 113, 129, 113, 114, 99, 82, 113, 17, 82, + 113, 17, 68, 81, 49, 34, 34, 50, 52, 66, 0, 13, + 21, 10, 0, 6, 97, 145, 131, 113, 17, 97, 34, 81, + 49, 66, 49, 65, 81, 40, 0, 7, 96, 35, 15, 0, + 11, 52, 52, 65, 33, 49, 33, 49, 65, 17, 65, 33, + 65, 17, 65, 33, 65, 17, 65, 33, 65, 17, 65, 49, + 33, 49, 33, 82, 82, 0, 11, 96, 24, 11, 0, 7, + 49, 133, 82, 50, 50, 82, 33, 113, 33, 113, 33, 113, + 34, 82, 50, 50, 84, 0, 7, 64, 37, 16, 0, 10, + 49, 97, 115, 81, 97, 49, 65, 81, 81, 49, 81, 81, + 35, 65, 81, 33, 17, 65, 81, 33, 18, 49, 81, 17, + 50, 49, 49, 18, 65, 67, 33, 0, 11, 34, 15, 0, + 9, 97, 211, 65, 97, 49, 50, 65, 81, 34, 65, 81, + 18, 17, 49, 81, 17, 33, 49, 83, 33, 49, 83, 49, + 49, 49, 22, 67, 0, 10, 80, 29, 14, 240, 240, 218, + 71, 18, 97, 65, 129, 65, 129, 65, 129, 65, 88, 19, + 44, 240, 84, 145, 65, 129, 65, 129, 65, 148, 0, 6, + 32, 16, 0, 10, 36, 52, 240, 78, 240, 83, 68, 65, + 49, 34, 34, 49, 49, 33, 65, 49, 49, 33, 65, 49, + 49, 34, 34, 67, 68, 0, 10, 48, 23, 13, 0, 8, + 27, 240, 53, 113, 81, 81, 113, 65, 113, 65, 113, 65, + 113, 82, 50, 117, 0, 8, 96, 44, 19, 194, 240, 34, + 240, 34, 240, 34, 240, 34, 240, 34, 240, 37, 226, 129, + 65, 50, 129, 65, 50, 129, 65, 50, 129, 65, 50, 129, + 65, 53, 46, 89, 50, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 144, 58, 18, 240, 226, 18, 210, 18, 210, 18, + 210, 18, 210, 18, 209, 17, 17, 81, 49, 49, 17, 17, + 81, 49, 50, 18, 81, 49, 50, 18, 81, 49, 50, 18, + 81, 49, 50, 18, 81, 49, 49, 17, 17, 42, 18, 18, + 42, 18, 18, 210, 18, 210, 18, 210, 18, 240, 18, 240, + 80, 36, 16, 240, 225, 241, 241, 241, 241, 241, 241, 81, + 65, 65, 81, 65, 65, 81, 65, 65, 81, 65, 65, 81, + 65, 33, 17, 44, 17, 41, 65, 241, 241, 241, 241, 240, + 48, 41, 16, 209, 241, 241, 241, 241, 241, 241, 241, 44, + 17, 42, 49, 81, 49, 81, 81, 49, 21, 81, 49, 81, + 81, 49, 81, 81, 49, 21, 81, 49, 81, 81, 49, 81, + 81, 49, 81, 241, 240, 48, 59, 17, 240, 210, 17, 210, + 17, 210, 17, 210, 17, 210, 17, 210, 17, 210, 17, 42, + 18, 17, 41, 34, 17, 81, 33, 66, 17, 81, 33, 21, + 17, 81, 33, 66, 17, 81, 33, 66, 17, 81, 33, 21, + 17, 81, 33, 66, 17, 81, 33, 66, 17, 81, 33, 66, + 17, 240, 17, 240, 64, 39, 16, 240, 225, 241, 241, 241, + 241, 241, 241, 241, 44, 17, 42, 49, 81, 65, 65, 81, + 65, 65, 81, 65, 65, 81, 65, 65, 81, 65, 65, 81, + 65, 65, 81, 65, 65, 241, 240, 48, 9, 4, 240, 240, + 98, 34, 240, 240, 128, 23, 8, 209, 113, 113, 113, 113, + 113, 113, 113, 34, 49, 34, 49, 113, 113, 113, 113, 113, + 113, 113, 113, 160, +}; + +tFont *g_psFontWHangulgothic20pt = (tFont *)g_pui8Hangulgothic20pt; diff --git a/third_party/fonts/ofl/fonts/fonthangulgothic20ptb.c b/third_party/fonts/ofl/fonts/fonthangulgothic20ptb.c new file mode 100644 index 0000000..73d0d09 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulgothic20ptb.c @@ -0,0 +1,793 @@ +//***************************************************************************** +// +// fonthangulgothic20ptb.c - Font definition for the 20ptpt Hangulgothic bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulgothic +// Size: 20pt +// Bold: yes +// Italic: no +// Memory usage: 5674 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulgothic20ptb[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 19, + + // + // The height of the font. + // + 20, + + // + // The baseline of the font. + // + 16, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0xb8, 0x0a, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x92, 0x01, 0x00, 0x00, // Offset 402 (0x192) + 0x9f, 0x01, 0x00, 0x00, // Offset 415 (0x19f) + 0xbf, 0x01, 0x00, 0x00, // Offset 447 (0x1bf) + 0xd9, 0x01, 0x00, 0x00, // Offset 473 (0x1d9) + 0x07, 0x02, 0x00, 0x00, // Offset 519 (0x207) + 0x2a, 0x02, 0x00, 0x00, // Offset 554 (0x22a) + 0x33, 0x02, 0x00, 0x00, // Offset 563 (0x233) + 0x49, 0x02, 0x00, 0x00, // Offset 585 (0x249) + 0x5f, 0x02, 0x00, 0x00, // Offset 607 (0x25f) + 0x6f, 0x02, 0x00, 0x00, // Offset 623 (0x26f) + 0x80, 0x02, 0x00, 0x00, // Offset 640 (0x280) + 0x89, 0x02, 0x00, 0x00, // Offset 649 (0x289) + 0x91, 0x02, 0x00, 0x00, // Offset 657 (0x291) + 0x99, 0x02, 0x00, 0x00, // Offset 665 (0x299) + 0xaf, 0x02, 0x00, 0x00, // Offset 687 (0x2af) + 0xcf, 0x02, 0x00, 0x00, // Offset 719 (0x2cf) + 0xe4, 0x02, 0x00, 0x00, // Offset 740 (0x2e4) + 0xfa, 0x02, 0x00, 0x00, // Offset 762 (0x2fa) + 0x11, 0x03, 0x00, 0x00, // Offset 785 (0x311) + 0x2d, 0x03, 0x00, 0x00, // Offset 813 (0x32d) + 0x44, 0x03, 0x00, 0x00, // Offset 836 (0x344) + 0x60, 0x03, 0x00, 0x00, // Offset 864 (0x360) + 0x75, 0x03, 0x00, 0x00, // Offset 885 (0x375) + 0x93, 0x03, 0x00, 0x00, // Offset 915 (0x393) + 0xaf, 0x03, 0x00, 0x00, // Offset 943 (0x3af) + 0xbc, 0x03, 0x00, 0x00, // Offset 956 (0x3bc) + 0xca, 0x03, 0x00, 0x00, // Offset 970 (0x3ca) + 0xe0, 0x03, 0x00, 0x00, // Offset 992 (0x3e0) + 0xec, 0x03, 0x00, 0x00, // Offset 1004 (0x3ec) + 0x02, 0x04, 0x00, 0x00, // Offset 1026 (0x402) + 0x17, 0x04, 0x00, 0x00, // Offset 1047 (0x417) + 0x44, 0x04, 0x00, 0x00, // Offset 1092 (0x444) + 0x64, 0x04, 0x00, 0x00, // Offset 1124 (0x464) + 0x82, 0x04, 0x00, 0x00, // Offset 1154 (0x482) + 0x98, 0x04, 0x00, 0x00, // Offset 1176 (0x498) + 0xb8, 0x04, 0x00, 0x00, // Offset 1208 (0x4b8) + 0xcd, 0x04, 0x00, 0x00, // Offset 1229 (0x4cd) + 0xe2, 0x04, 0x00, 0x00, // Offset 1250 (0x4e2) + 0xfe, 0x04, 0x00, 0x00, // Offset 1278 (0x4fe) + 0x20, 0x05, 0x00, 0x00, // Offset 1312 (0x520) + 0x32, 0x05, 0x00, 0x00, // Offset 1330 (0x532) + 0x46, 0x05, 0x00, 0x00, // Offset 1350 (0x546) + 0x67, 0x05, 0x00, 0x00, // Offset 1383 (0x567) + 0x7c, 0x05, 0x00, 0x00, // Offset 1404 (0x57c) + 0xb2, 0x05, 0x00, 0x00, // Offset 1458 (0x5b2) + 0xdb, 0x05, 0x00, 0x00, // Offset 1499 (0x5db) + 0xfc, 0x05, 0x00, 0x00, // Offset 1532 (0x5fc) + 0x16, 0x06, 0x00, 0x00, // Offset 1558 (0x616) + 0x38, 0x06, 0x00, 0x00, // Offset 1592 (0x638) + 0x58, 0x06, 0x00, 0x00, // Offset 1624 (0x658) + 0x6d, 0x06, 0x00, 0x00, // Offset 1645 (0x66d) + 0x82, 0x06, 0x00, 0x00, // Offset 1666 (0x682) + 0xa4, 0x06, 0x00, 0x00, // Offset 1700 (0x6a4) + 0xc4, 0x06, 0x00, 0x00, // Offset 1732 (0x6c4) + 0xf8, 0x06, 0x00, 0x00, // Offset 1784 (0x6f8) + 0x17, 0x07, 0x00, 0x00, // Offset 1815 (0x717) + 0x32, 0x07, 0x00, 0x00, // Offset 1842 (0x732) + 0x47, 0x07, 0x00, 0x00, // Offset 1863 (0x747) + 0x5d, 0x07, 0x00, 0x00, // Offset 1885 (0x75d) + 0x8b, 0x07, 0x00, 0x00, // Offset 1931 (0x78b) + 0xa1, 0x07, 0x00, 0x00, // Offset 1953 (0x7a1) + 0xb6, 0x07, 0x00, 0x00, // Offset 1974 (0x7b6) + 0xbd, 0x07, 0x00, 0x00, // Offset 1981 (0x7bd) + 0xc5, 0x07, 0x00, 0x00, // Offset 1989 (0x7c5) + 0xdc, 0x07, 0x00, 0x00, // Offset 2012 (0x7dc) + 0xfa, 0x07, 0x00, 0x00, // Offset 2042 (0x7fa) + 0x0c, 0x08, 0x00, 0x00, // Offset 2060 (0x80c) + 0x2b, 0x08, 0x00, 0x00, // Offset 2091 (0x82b) + 0x3f, 0x08, 0x00, 0x00, // Offset 2111 (0x83f) + 0x53, 0x08, 0x00, 0x00, // Offset 2131 (0x853) + 0x6f, 0x08, 0x00, 0x00, // Offset 2159 (0x86f) + 0x8e, 0x08, 0x00, 0x00, // Offset 2190 (0x88e) + 0x9e, 0x08, 0x00, 0x00, // Offset 2206 (0x89e) + 0xb2, 0x08, 0x00, 0x00, // Offset 2226 (0x8b2) + 0xcf, 0x08, 0x00, 0x00, // Offset 2255 (0x8cf) + 0xe2, 0x08, 0x00, 0x00, // Offset 2274 (0x8e2) + 0x09, 0x09, 0x00, 0x00, // Offset 2313 (0x909) + 0x25, 0x09, 0x00, 0x00, // Offset 2341 (0x925) + 0x3e, 0x09, 0x00, 0x00, // Offset 2366 (0x93e) + 0x5a, 0x09, 0x00, 0x00, // Offset 2394 (0x95a) + 0x76, 0x09, 0x00, 0x00, // Offset 2422 (0x976) + 0x88, 0x09, 0x00, 0x00, // Offset 2440 (0x988) + 0x99, 0x09, 0x00, 0x00, // Offset 2457 (0x999) + 0xac, 0x09, 0x00, 0x00, // Offset 2476 (0x9ac) + 0xc8, 0x09, 0x00, 0x00, // Offset 2504 (0x9c8) + 0xe0, 0x09, 0x00, 0x00, // Offset 2528 (0x9e0) + 0x08, 0x0a, 0x00, 0x00, // Offset 2568 (0xa08) + 0x20, 0x0a, 0x00, 0x00, // Offset 2592 (0xa20) + 0x39, 0x0a, 0x00, 0x00, // Offset 2617 (0xa39) + 0x4b, 0x0a, 0x00, 0x00, // Offset 2635 (0xa4b) + 0x61, 0x0a, 0x00, 0x00, // Offset 2657 (0xa61) + 0x76, 0x0a, 0x00, 0x00, // Offset 2678 (0xa76) + 0x8c, 0x0a, 0x00, 0x00, // Offset 2700 (0xa8c) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 9, 0, 22, 64, 17, 5, 162, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 211, 35, 240, 32, 13, 7, + 226, 18, 34, 18, 34, 18, 34, 18, 0, 12, 64, 32, + 13, 240, 242, 18, 130, 18, 114, 34, 114, 34, 114, 34, + 90, 58, 82, 18, 130, 18, 90, 58, 82, 34, 114, 34, + 114, 34, 114, 34, 240, 240, 224, 26, 10, 50, 130, 118, + 54, 53, 82, 18, 82, 18, 85, 100, 116, 116, 101, 82, + 18, 82, 18, 85, 39, 54, 114, 240, 160, 46, 19, 240, + 240, 163, 114, 101, 83, 82, 50, 66, 98, 50, 50, 114, + 50, 35, 114, 50, 34, 149, 35, 163, 50, 35, 178, 37, + 147, 18, 50, 130, 34, 50, 115, 34, 50, 114, 50, 50, + 98, 70, 99, 99, 0, 7, 80, 35, 15, 240, 240, 68, + 165, 146, 50, 130, 50, 130, 50, 131, 18, 165, 148, 66, + 66, 34, 50, 50, 51, 19, 50, 69, 66, 84, 67, 68, + 91, 85, 51, 0, 5, 112, 9, 4, 130, 34, 34, 34, + 0, 7, 32, 22, 7, 162, 66, 82, 66, 82, 67, 66, + 82, 82, 82, 82, 82, 82, 83, 82, 82, 98, 82, 98, + 32, 22, 7, 114, 98, 82, 98, 82, 82, 98, 82, 82, + 82, 82, 82, 82, 66, 82, 82, 66, 82, 66, 80, 16, + 10, 0, 7, 114, 130, 88, 40, 68, 100, 82, 34, 81, + 33, 0, 8, 17, 13, 0, 8, 98, 178, 178, 178, 107, + 43, 114, 178, 178, 178, 0, 8, 112, 9, 6, 0, 12, + 19, 50, 51, 50, 64, 8, 7, 0, 7, 5, 37, 0, + 9, 8, 5, 0, 9, 51, 35, 35, 192, 22, 9, 240, + 130, 114, 99, 99, 98, 114, 99, 98, 114, 99, 98, 114, + 99, 98, 114, 99, 98, 240, 16, 32, 12, 240, 196, 118, + 82, 66, 66, 66, 50, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 50, 66, 66, 66, 86, 116, + 240, 240, 176, 21, 7, 240, 34, 67, 52, 34, 18, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 240, 128, + 22, 11, 240, 149, 87, 66, 51, 146, 146, 146, 130, 131, + 115, 130, 130, 131, 115, 121, 41, 240, 240, 80, 23, 11, + 240, 149, 87, 65, 67, 146, 146, 130, 85, 101, 162, 162, + 146, 146, 33, 83, 40, 54, 240, 240, 128, 28, 13, 240, + 240, 35, 163, 148, 133, 130, 18, 115, 18, 99, 34, 98, + 50, 83, 50, 67, 66, 75, 43, 146, 178, 178, 240, 240, + 208, 23, 11, 240, 120, 56, 50, 146, 146, 146, 150, 88, + 49, 83, 146, 146, 146, 33, 82, 56, 54, 240, 240, 128, + 28, 12, 240, 213, 87, 67, 146, 146, 162, 20, 89, 51, + 66, 50, 98, 34, 98, 34, 98, 34, 98, 50, 66, 72, + 100, 240, 240, 176, 21, 11, 240, 121, 41, 131, 130, 131, + 130, 146, 131, 130, 131, 130, 146, 131, 130, 131, 240, 240, + 160, 30, 12, 240, 197, 103, 67, 51, 50, 82, 50, 82, + 66, 50, 87, 101, 84, 19, 51, 67, 34, 98, 34, 98, + 35, 67, 56, 100, 240, 240, 176, 28, 12, 240, 196, 104, + 66, 66, 50, 98, 34, 98, 34, 98, 34, 98, 50, 67, + 57, 84, 18, 162, 146, 147, 71, 85, 240, 240, 192, 13, + 5, 240, 83, 35, 35, 240, 240, 35, 35, 35, 240, 112, + 14, 6, 240, 67, 51, 51, 240, 240, 243, 50, 51, 50, + 240, 112, 22, 11, 240, 65, 146, 130, 131, 115, 115, 115, + 115, 115, 130, 147, 147, 147, 147, 147, 147, 147, 146, 208, + 12, 13, 0, 11, 59, 43, 240, 219, 43, 0, 11, 80, + 22, 11, 177, 162, 147, 147, 147, 147, 147, 147, 146, 147, + 115, 115, 115, 115, 115, 115, 130, 145, 240, 96, 21, 10, + 240, 101, 71, 131, 130, 130, 115, 114, 114, 114, 114, 130, + 130, 240, 50, 130, 240, 240, 96, 45, 18, 240, 240, 182, + 170, 116, 83, 83, 51, 35, 66, 58, 34, 50, 51, 18, + 34, 35, 50, 34, 34, 34, 66, 34, 34, 34, 51, 19, + 34, 34, 35, 34, 66, 26, 83, 19, 35, 116, 84, 107, + 151, 0, 7, 64, 32, 16, 240, 240, 131, 211, 196, 194, + 18, 163, 18, 162, 35, 146, 50, 130, 67, 114, 82, 106, + 107, 82, 114, 67, 115, 50, 146, 35, 146, 0, 6, 32, + 30, 11, 240, 118, 87, 66, 51, 50, 66, 50, 66, 50, + 51, 55, 72, 50, 67, 34, 82, 34, 82, 34, 82, 34, + 67, 40, 54, 240, 240, 128, 22, 13, 240, 240, 22, 88, + 67, 146, 163, 162, 178, 178, 178, 178, 194, 179, 179, 184, + 118, 240, 240, 176, 32, 13, 240, 183, 105, 66, 68, 50, + 98, 50, 99, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 99, 34, 83, 50, 67, 72, 86, 0, 5, 96, + 21, 10, 240, 88, 40, 34, 130, 130, 130, 136, 40, 34, + 130, 130, 130, 130, 136, 40, 240, 240, 32, 21, 10, 240, + 88, 40, 34, 130, 130, 130, 136, 40, 34, 130, 130, 130, + 130, 130, 130, 240, 240, 128, 28, 14, 240, 240, 39, 89, + 68, 163, 163, 178, 194, 194, 70, 34, 70, 34, 130, 35, + 114, 50, 114, 67, 82, 89, 103, 240, 240, 240, 34, 13, + 240, 178, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 43, 43, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 240, 240, 176, 18, 4, 130, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 224, 20, 7, 240, 34, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 37, 36, 240, 144, 33, 12, + 240, 146, 83, 34, 67, 50, 51, 66, 35, 82, 34, 98, + 19, 101, 117, 118, 98, 35, 82, 50, 82, 51, 66, 67, + 50, 82, 50, 83, 240, 240, 128, 21, 10, 240, 82, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 136, + 40, 240, 240, 32, 54, 17, 240, 240, 67, 147, 35, 147, + 36, 116, 36, 116, 37, 85, 34, 18, 82, 18, 34, 18, + 82, 18, 34, 19, 51, 18, 34, 34, 50, 34, 34, 35, + 19, 34, 34, 50, 18, 50, 34, 50, 18, 50, 34, 53, + 50, 34, 67, 66, 34, 67, 66, 0, 6, 80, 41, 13, + 240, 179, 98, 35, 98, 36, 82, 37, 66, 37, 66, 34, + 19, 50, 34, 19, 50, 34, 35, 34, 34, 51, 18, 34, + 51, 18, 34, 69, 34, 69, 34, 84, 34, 99, 34, 99, + 240, 240, 176, 33, 15, 240, 240, 69, 137, 83, 83, 66, + 114, 51, 115, 34, 146, 34, 146, 34, 146, 34, 146, 34, + 146, 35, 115, 50, 114, 67, 83, 89, 133, 0, 6, 48, + 26, 11, 240, 119, 72, 50, 67, 34, 82, 34, 82, 34, + 82, 34, 67, 40, 54, 82, 146, 146, 146, 146, 146, 240, + 240, 192, 34, 15, 240, 240, 69, 137, 83, 83, 66, 114, + 51, 115, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 35, 115, 50, 114, 67, 83, 89, 134, 211, 211, 211, 32, + 32, 12, 240, 151, 88, 66, 67, 50, 82, 50, 82, 50, + 82, 50, 67, 56, 71, 82, 50, 82, 51, 66, 66, 66, + 82, 50, 83, 34, 98, 240, 240, 128, 21, 10, 240, 117, + 70, 51, 114, 130, 131, 131, 132, 131, 131, 130, 130, 115, + 39, 54, 240, 240, 64, 21, 13, 240, 187, 43, 98, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 0, + 5, 96, 34, 13, 240, 178, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 50, 82, 73, 101, 240, 240, 224, + 32, 15, 240, 243, 130, 50, 115, 50, 115, 51, 98, 82, + 83, 82, 82, 99, 66, 114, 51, 114, 50, 146, 34, 146, + 19, 149, 180, 179, 195, 0, 6, 64, 52, 22, 240, 240, + 227, 99, 98, 50, 99, 98, 50, 84, 83, 50, 85, 66, + 67, 66, 18, 66, 82, 51, 18, 66, 82, 50, 34, 51, + 83, 34, 35, 34, 114, 34, 50, 34, 114, 19, 50, 19, + 117, 69, 133, 84, 148, 84, 147, 100, 147, 114, 0, 9, + 31, 14, 240, 211, 99, 50, 83, 67, 66, 99, 35, 114, + 19, 133, 164, 163, 180, 150, 115, 34, 114, 51, 83, 67, + 51, 98, 50, 115, 240, 240, 224, 27, 14, 240, 210, 130, + 50, 99, 51, 67, 82, 66, 99, 35, 114, 34, 148, 164, + 178, 194, 194, 194, 194, 194, 194, 0, 6, 16, 21, 12, + 240, 154, 42, 147, 131, 131, 147, 131, 146, 147, 131, 146, + 147, 131, 154, 42, 240, 240, 128, 22, 6, 100, 36, 34, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 68, 36, 32, 46, 20, 0, 7, 82, 82, 82, + 67, 66, 67, 82, 52, 50, 98, 52, 50, 98, 52, 50, + 79, 3, 47, 3, 82, 18, 34, 18, 130, 18, 34, 18, + 130, 18, 34, 18, 147, 68, 147, 67, 163, 67, 163, 67, + 0, 8, 32, 22, 6, 100, 36, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 36, 36, + 32, 21, 13, 240, 243, 163, 149, 130, 18, 115, 34, 98, + 50, 83, 66, 66, 82, 51, 98, 0, 14, 112, 7, 13, + 0, 29, 43, 43, 32, 8, 6, 195, 67, 66, 0, 11, + 64, 23, 10, 0, 7, 100, 86, 65, 51, 130, 70, 55, + 35, 50, 34, 66, 34, 51, 40, 52, 18, 240, 240, 32, + 30, 11, 178, 146, 146, 146, 146, 146, 20, 72, 51, 50, + 50, 82, 34, 82, 34, 82, 34, 82, 34, 82, 35, 50, + 56, 50, 20, 240, 240, 112, 18, 10, 0, 7, 117, 55, + 50, 114, 130, 130, 130, 130, 146, 135, 85, 240, 240, 32, + 31, 11, 240, 50, 146, 146, 146, 146, 68, 18, 56, 50, + 51, 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, 50, + 51, 56, 68, 18, 240, 240, 80, 20, 11, 0, 8, 69, + 87, 66, 51, 34, 82, 41, 41, 34, 147, 146, 151, 101, + 240, 240, 96, 20, 8, 179, 68, 66, 98, 98, 70, 38, + 66, 98, 98, 98, 98, 98, 98, 98, 98, 240, 208, 28, + 11, 0, 8, 68, 18, 56, 50, 51, 34, 82, 34, 82, + 34, 82, 34, 82, 34, 82, 50, 51, 56, 68, 18, 130, + 71, 69, 80, 31, 11, 178, 146, 146, 146, 146, 146, 20, + 72, 51, 51, 34, 82, 34, 82, 34, 82, 34, 82, 34, + 82, 34, 82, 34, 82, 34, 82, 240, 240, 80, 16, 4, + 66, 34, 226, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 224, 20, 6, 130, 66, 240, 114, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 36, 35, 48, 29, 10, + 162, 130, 130, 130, 130, 130, 51, 34, 50, 50, 34, 66, + 18, 84, 101, 86, 66, 34, 66, 50, 50, 51, 34, 66, + 240, 240, 32, 19, 4, 66, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 224, 39, 16, + 0, 12, 2, 19, 51, 71, 21, 51, 51, 35, 34, 66, + 66, 34, 66, 66, 34, 66, 66, 34, 66, 66, 34, 66, + 66, 34, 66, 66, 34, 66, 66, 34, 66, 66, 0, 6, + 32, 28, 11, 0, 8, 34, 20, 72, 51, 51, 34, 82, + 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 82, 240, 240, 80, 25, 12, 0, 9, 52, 104, 66, + 66, 50, 83, 34, 98, 34, 98, 34, 98, 34, 83, 50, + 66, 72, 100, 240, 240, 176, 28, 11, 0, 8, 34, 20, + 72, 51, 50, 50, 82, 34, 82, 34, 82, 34, 82, 34, + 82, 35, 50, 56, 50, 20, 66, 146, 146, 144, 28, 11, + 0, 8, 68, 18, 56, 50, 51, 34, 82, 34, 82, 34, + 82, 34, 82, 34, 82, 50, 51, 56, 68, 18, 146, 146, + 146, 32, 18, 8, 0, 6, 2, 19, 38, 35, 82, 98, + 98, 98, 98, 98, 98, 98, 240, 240, 17, 9, 0, 6, + 117, 54, 50, 114, 131, 115, 131, 114, 114, 39, 38, 240, + 240, 19, 9, 240, 226, 114, 114, 86, 54, 82, 114, 114, + 114, 114, 114, 114, 117, 84, 240, 224, 28, 11, 0, 8, + 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 82, 34, 82, 35, 51, 56, 68, 18, 240, 240, 80, + 24, 12, 0, 9, 3, 67, 50, 66, 66, 66, 67, 35, + 82, 34, 98, 34, 102, 116, 132, 131, 162, 240, 240, 192, + 40, 19, 0, 14, 34, 83, 82, 50, 67, 67, 50, 67, + 66, 66, 50, 18, 50, 82, 34, 18, 34, 98, 34, 18, + 34, 98, 18, 50, 18, 116, 52, 132, 52, 131, 83, 146, + 82, 0, 7, 112, 24, 12, 0, 9, 18, 66, 67, 35, + 83, 18, 116, 132, 147, 132, 118, 98, 34, 83, 50, 51, + 67, 240, 240, 128, 25, 11, 0, 8, 35, 66, 50, 66, + 50, 50, 67, 34, 82, 19, 82, 18, 116, 116, 115, 146, + 131, 130, 116, 115, 112, 18, 10, 0, 7, 72, 40, 115, + 99, 99, 114, 114, 115, 99, 120, 40, 240, 240, 32, 22, + 8, 179, 68, 66, 98, 98, 98, 98, 98, 83, 67, 99, + 98, 98, 98, 98, 98, 98, 100, 83, 32, 21, 4, 66, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 96, 22, 8, 131, 84, 98, 98, + 98, 98, 98, 98, 99, 99, 67, 82, 98, 98, 98, 98, + 98, 68, 67, 80, 12, 12, 0, 12, 20, 49, 58, 33, + 53, 0, 13, 112, + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8e, 0x01, 0x00, 0x00, // Offset 398 (0x18e) + 0xa3, 0x01, 0x00, 0x00, // Offset 419 (0x1a3) + 0xbc, 0x01, 0x00, 0x00, // Offset 444 (0x1bc) + 0xca, 0x01, 0x00, 0x00, // Offset 458 (0x1ca) + 0xe3, 0x01, 0x00, 0x00, // Offset 483 (0x1e3) + 0xfb, 0x01, 0x00, 0x00, // Offset 507 (0x1fb) + 0x09, 0x02, 0x00, 0x00, // Offset 521 (0x209) + 0x20, 0x02, 0x00, 0x00, // Offset 544 (0x220) + 0x30, 0x02, 0x00, 0x00, // Offset 560 (0x230) + 0x47, 0x02, 0x00, 0x00, // Offset 583 (0x247) + 0x62, 0x02, 0x00, 0x00, // Offset 610 (0x262) + 0x7d, 0x02, 0x00, 0x00, // Offset 637 (0x27d) + 0x95, 0x02, 0x00, 0x00, // Offset 661 (0x295) + 0xac, 0x02, 0x00, 0x00, // Offset 684 (0x2ac) + 0xc7, 0x02, 0x00, 0x00, // Offset 711 (0x2c7) + 0xdd, 0x02, 0x00, 0x00, // Offset 733 (0x2dd) + 0xf0, 0x02, 0x00, 0x00, // Offset 752 (0x2f0) + 0x03, 0x03, 0x00, 0x00, // Offset 771 (0x303) + 0x22, 0x03, 0x00, 0x00, // Offset 802 (0x322) + 0x3e, 0x03, 0x00, 0x00, // Offset 830 (0x33e) + 0x51, 0x03, 0x00, 0x00, // Offset 849 (0x351) + 0x6b, 0x03, 0x00, 0x00, // Offset 875 (0x36b) + 0x7e, 0x03, 0x00, 0x00, // Offset 894 (0x37e) + 0x8f, 0x03, 0x00, 0x00, // Offset 911 (0x38f) + 0xa8, 0x03, 0x00, 0x00, // Offset 936 (0x3a8) + 0xbb, 0x03, 0x00, 0x00, // Offset 955 (0x3bb) + 0xc9, 0x03, 0x00, 0x00, // Offset 969 (0x3c9) + 0xd7, 0x03, 0x00, 0x00, // Offset 983 (0x3d7) + 0xea, 0x03, 0x00, 0x00, // Offset 1002 (0x3ea) + 0x00, 0x04, 0x00, 0x00, // Offset 1024 (0x400) + 0x16, 0x04, 0x00, 0x00, // Offset 1046 (0x416) + 0x3c, 0x04, 0x00, 0x00, // Offset 1084 (0x43c) + 0x52, 0x04, 0x00, 0x00, // Offset 1106 (0x452) + 0x76, 0x04, 0x00, 0x00, // Offset 1142 (0x476) + 0x8c, 0x04, 0x00, 0x00, // Offset 1164 (0x48c) + 0xb4, 0x04, 0x00, 0x00, // Offset 1204 (0x4b4) + 0xca, 0x04, 0x00, 0x00, // Offset 1226 (0x4ca) + 0xf2, 0x04, 0x00, 0x00, // Offset 1266 (0x4f2) + 0x06, 0x05, 0x00, 0x00, // Offset 1286 (0x506) + 0x2f, 0x05, 0x00, 0x00, // Offset 1327 (0x52f) + 0x5d, 0x05, 0x00, 0x00, // Offset 1373 (0x55d) + 0x87, 0x05, 0x00, 0x00, // Offset 1415 (0x587) + 0x9c, 0x05, 0x00, 0x00, // Offset 1436 (0x59c) + 0xb4, 0x05, 0x00, 0x00, // Offset 1460 (0x5b4) + 0xdd, 0x05, 0x00, 0x00, // Offset 1501 (0x5dd) + 0x0f, 0x06, 0x00, 0x00, // Offset 1551 (0x60f) + 0x38, 0x06, 0x00, 0x00, // Offset 1592 (0x638) + 0x51, 0x06, 0x00, 0x00, // Offset 1617 (0x651) + 0x5c, 0x06, 0x00, 0x00, // Offset 1628 (0x65c) + 0x85, 0x06, 0x00, 0x00, // Offset 1669 (0x685) + 0x9b, 0x06, 0x00, 0x00, // Offset 1691 (0x69b) + 0x9f, 0x06, 0x00, 0x00, // Offset 1695 (0x69f) + 0xb2, 0x06, 0x00, 0x00, // Offset 1714 (0x6b2) + 0xc9, 0x06, 0x00, 0x00, // Offset 1737 (0x6c9) + 0xe2, 0x06, 0x00, 0x00, // Offset 1762 (0x6e2) + 0xfa, 0x06, 0x00, 0x00, // Offset 1786 (0x6fa) + 0x19, 0x07, 0x00, 0x00, // Offset 1817 (0x719) + 0x30, 0x07, 0x00, 0x00, // Offset 1840 (0x730) + 0x52, 0x07, 0x00, 0x00, // Offset 1874 (0x752) + 0x6b, 0x07, 0x00, 0x00, // Offset 1899 (0x76b) + 0x84, 0x07, 0x00, 0x00, // Offset 1924 (0x784) + 0xa3, 0x07, 0x00, 0x00, // Offset 1955 (0x7a3) + 0xc0, 0x07, 0x00, 0x00, // Offset 1984 (0x7c0) + 0xdc, 0x07, 0x00, 0x00, // Offset 2012 (0x7dc) + 0xf6, 0x07, 0x00, 0x00, // Offset 2038 (0x7f6) + 0x11, 0x08, 0x00, 0x00, // Offset 2065 (0x811) + 0x2a, 0x08, 0x00, 0x00, // Offset 2090 (0x82a) + 0x4c, 0x08, 0x00, 0x00, // Offset 2124 (0x84c) + 0x6b, 0x08, 0x00, 0x00, // Offset 2155 (0x86b) + 0x88, 0x08, 0x00, 0x00, // Offset 2184 (0x888) + 0xa1, 0x08, 0x00, 0x00, // Offset 2209 (0x8a1) + 0xbc, 0x08, 0x00, 0x00, // Offset 2236 (0x8bc) + 0xe5, 0x08, 0x00, 0x00, // Offset 2277 (0x8e5) + 0xff, 0x08, 0x00, 0x00, // Offset 2303 (0x8ff) + 0x17, 0x09, 0x00, 0x00, // Offset 2327 (0x917) + 0x2f, 0x09, 0x00, 0x00, // Offset 2351 (0x92f) + 0x4c, 0x09, 0x00, 0x00, // Offset 2380 (0x94c) + 0x66, 0x09, 0x00, 0x00, // Offset 2406 (0x966) + 0x7a, 0x09, 0x00, 0x00, // Offset 2426 (0x97a) + 0x98, 0x09, 0x00, 0x00, // Offset 2456 (0x998) + 0xad, 0x09, 0x00, 0x00, // Offset 2477 (0x9ad) + 0xca, 0x09, 0x00, 0x00, // Offset 2506 (0x9ca) + 0xe6, 0x09, 0x00, 0x00, // Offset 2534 (0x9e6) + 0x01, 0x0a, 0x00, 0x00, // Offset 2561 (0xa01) + 0x1e, 0x0a, 0x00, 0x00, // Offset 2590 (0xa1e) + 0x30, 0x0a, 0x00, 0x00, // Offset 2608 (0xa30) + 0x5c, 0x0a, 0x00, 0x00, // Offset 2652 (0xa5c) + 0x8a, 0x0a, 0x00, 0x00, // Offset 2698 (0xa8a) + 0xb8, 0x0a, 0x00, 0x00, // Offset 2744 (0xab8) + 0xe8, 0x0a, 0x00, 0x00, // Offset 2792 (0xae8) + 0x20, 0x0b, 0x00, 0x00, // Offset 2848 (0xb20) + 0x4f, 0x0b, 0x00, 0x00, // Offset 2895 (0xb4f) + 0x59, 0x0b, 0x00, 0x00, // Offset 2905 (0xb59) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 14, 13, 0, 9, 107, 43, 178, 178, 178, 178, 178, 178, + 0, 10, 21, 14, 0, 10, 76, 44, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 0, 10, 96, 25, + 18, 0, 13, 71, 66, 87, 66, 162, 66, 162, 52, 146, + 52, 146, 34, 34, 130, 19, 35, 114, 17, 0, 14, 80, + 14, 13, 0, 9, 98, 178, 178, 178, 178, 178, 187, 43, + 0, 10, 25, 16, 0, 12, 2, 86, 50, 86, 50, 131, + 50, 130, 66, 115, 66, 101, 54, 19, 19, 38, 17, 81, + 0, 12, 32, 24, 16, 0, 12, 117, 66, 226, 72, 34, + 226, 100, 66, 82, 34, 54, 18, 34, 54, 18, 34, 180, + 0, 10, 64, 14, 13, 0, 9, 106, 58, 50, 178, 178, + 178, 187, 43, 0, 10, 23, 15, 0, 11, 38, 22, 38, + 22, 34, 82, 98, 82, 98, 82, 98, 82, 102, 22, 38, + 22, 0, 11, 64, 16, 13, 0, 9, 106, 58, 178, 58, + 58, 50, 178, 187, 43, 0, 8, 48, 23, 15, 0, 11, + 38, 22, 38, 22, 98, 82, 98, 82, 38, 82, 34, 146, + 38, 82, 39, 66, 0, 11, 64, 27, 15, 0, 11, 38, + 22, 38, 22, 98, 18, 34, 38, 18, 34, 38, 18, 34, + 34, 82, 34, 38, 22, 38, 22, 0, 11, 64, 27, 15, + 0, 11, 38, 18, 34, 38, 18, 34, 98, 22, 38, 22, + 34, 82, 34, 34, 82, 34, 38, 22, 38, 22, 0, 11, + 64, 24, 17, 0, 12, 102, 66, 86, 66, 146, 66, 146, + 52, 70, 52, 66, 102, 54, 19, 35, 38, 33, 66, 0, + 13, 23, 15, 0, 11, 38, 22, 38, 22, 98, 18, 102, + 22, 38, 22, 34, 82, 102, 22, 38, 22, 0, 11, 64, + 27, 16, 0, 12, 6, 23, 38, 23, 98, 34, 18, 114, + 34, 18, 54, 34, 18, 50, 98, 18, 54, 23, 38, 23, + 0, 12, 32, 22, 17, 0, 12, 102, 37, 70, 242, 24, + 38, 178, 101, 66, 82, 50, 57, 50, 55, 21, 0, 13, + 32, 19, 12, 0, 9, 10, 42, 34, 98, 34, 98, 34, + 98, 34, 98, 42, 42, 0, 9, 32, 19, 12, 0, 9, + 2, 98, 34, 98, 42, 42, 34, 98, 34, 98, 42, 42, + 0, 9, 32, 31, 15, 0, 11, 34, 34, 18, 34, 34, + 34, 18, 34, 38, 22, 38, 22, 34, 34, 18, 34, 34, + 34, 18, 34, 38, 22, 38, 22, 0, 11, 64, 28, 16, + 0, 12, 2, 34, 50, 82, 34, 50, 86, 50, 86, 36, + 66, 34, 36, 66, 34, 19, 18, 57, 50, 40, 81, 0, + 12, 32, 19, 16, 0, 12, 99, 211, 211, 197, 163, 19, + 116, 52, 53, 84, 50, 146, 0, 12, 32, 26, 15, 0, + 11, 82, 50, 130, 50, 130, 50, 115, 35, 116, 20, 82, + 24, 50, 51, 35, 33, 51, 65, 129, 0, 10, 64, 19, + 13, 0, 10, 21, 105, 51, 83, 34, 114, 34, 114, 35, + 83, 57, 101, 0, 10, 48, 17, 15, 0, 11, 59, 75, + 179, 179, 164, 138, 53, 68, 34, 161, 0, 11, 64, 25, + 15, 0, 11, 53, 21, 69, 21, 114, 51, 98, 66, 100, + 35, 83, 23, 51, 51, 34, 33, 67, 193, 0, 10, 64, + 19, 16, 0, 10, 70, 166, 240, 139, 91, 195, 180, 138, + 70, 53, 34, 177, 0, 10, 32, 14, 13, 0, 9, 107, + 43, 178, 178, 43, 43, 178, 178, 0, 10, 14, 13, 0, + 9, 106, 58, 50, 186, 58, 50, 187, 43, 0, 10, 19, + 15, 0, 11, 44, 60, 98, 50, 130, 50, 130, 50, 130, + 50, 93, 45, 0, 11, 64, 22, 14, 0, 7, 54, 240, + 240, 60, 100, 150, 115, 35, 98, 66, 98, 66, 114, 34, + 148, 0, 9, 64, 22, 7, 2, 82, 82, 82, 82, 82, + 82, 85, 37, 34, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 192, 38, 8, 2, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 38, 38, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 98, 160, 22, 7, 2, 82, 82, 82, 82, 85, + 37, 34, 82, 82, 82, 85, 37, 34, 82, 82, 82, 82, + 82, 192, 36, 8, 2, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 38, 38, 34, 34, 34, 34, 34, 34, 38, 38, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 98, 160, 22, 8, 66, 98, 98, 98, 98, 98, 98, 98, + 38, 38, 98, 98, 98, 98, 98, 98, 98, 98, 98, 160, + 40, 11, 114, 82, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 82, 34, 37, 34, 37, 34, 82, 34, 82, 34, 82, + 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 82, 34, 208, 22, 8, 66, 98, 98, 98, 98, 38, + 38, 98, 98, 98, 38, 38, 98, 98, 98, 98, 98, 98, + 98, 160, 40, 11, 114, 82, 34, 82, 34, 82, 34, 82, + 34, 37, 34, 37, 34, 82, 34, 82, 34, 82, 34, 37, + 34, 37, 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 82, 34, 82, 34, 208, 20, 20, 0, 21, 2, 240, + 50, 240, 50, 240, 50, 240, 50, 175, 3, 47, 3, 0, + 12, 96, 41, 20, 210, 240, 50, 240, 50, 240, 50, 240, + 50, 240, 50, 240, 50, 240, 50, 162, 101, 114, 101, 114, + 98, 162, 98, 162, 98, 92, 18, 92, 18, 240, 50, 240, + 50, 240, 50, 240, 50, 240, 160, 46, 19, 178, 34, 210, + 34, 210, 34, 210, 34, 210, 34, 210, 34, 210, 34, 210, + 34, 214, 98, 86, 98, 82, 34, 98, 82, 34, 98, 82, + 34, 42, 18, 34, 42, 18, 34, 210, 34, 210, 34, 210, + 34, 240, 34, 240, 96, 42, 18, 226, 240, 18, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 130, 98, + 130, 98, 130, 98, 130, 98, 130, 65, 18, 45, 18, 45, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 80, 21, + 20, 0, 20, 82, 66, 194, 66, 194, 66, 194, 66, 194, + 66, 127, 3, 47, 3, 0, 12, 96, 24, 20, 0, 17, + 79, 3, 47, 3, 162, 240, 50, 240, 50, 240, 50, 240, + 50, 240, 50, 240, 50, 0, 11, 32, 41, 18, 226, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 45, 18, 44, 34, 114, 114, 114, + 54, 114, 54, 114, 114, 114, 114, 114, 114, 114, 114, 240, + 80, 50, 19, 178, 34, 210, 34, 210, 34, 210, 34, 210, + 34, 210, 34, 210, 34, 210, 34, 210, 34, 210, 34, 42, + 18, 34, 42, 18, 34, 98, 82, 34, 98, 37, 34, 98, + 37, 34, 98, 82, 34, 98, 82, 34, 98, 82, 34, 240, + 34, 240, 96, 41, 18, 226, 240, 18, 240, 18, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 240, 18, 45, 18, 45, 18, 130, 98, 130, 98, 130, 98, + 130, 98, 130, 98, 130, 98, 240, 80, 25, 20, 0, 17, + 79, 3, 47, 3, 114, 66, 194, 66, 194, 66, 194, 66, + 194, 66, 194, 66, 194, 66, 0, 10, 112, 11, 20, 0, + 22, 79, 3, 47, 3, 0, 22, 96, 41, 18, 226, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 45, + 18, 45, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 80, 22, 4, 2, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 96, 4, + 22, 0, 55, 19, 14, 0, 10, 66, 66, 98, 66, 98, + 66, 98, 66, 98, 66, 108, 44, 0, 12, 64, 23, 15, + 0, 11, 34, 86, 34, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 102, 22, 38, 22, 0, 11, 64, 25, 16, 0, + 12, 2, 114, 82, 114, 82, 114, 82, 115, 66, 100, 66, + 86, 53, 19, 35, 37, 18, 66, 0, 12, 32, 24, 15, + 0, 10, 65, 82, 98, 82, 99, 66, 84, 66, 82, 18, + 50, 66, 34, 50, 66, 50, 45, 0, 13, 48, 31, 20, + 0, 15, 5, 20, 50, 130, 50, 50, 130, 50, 50, 85, + 50, 36, 66, 98, 37, 50, 33, 50, 19, 19, 38, 34, + 18, 49, 0, 17, 112, 23, 15, 0, 11, 38, 22, 38, + 22, 98, 18, 102, 18, 98, 82, 98, 82, 102, 22, 38, + 22, 0, 11, 64, 34, 19, 0, 14, 37, 18, 18, 34, + 114, 18, 18, 34, 114, 18, 18, 34, 69, 21, 35, 50, + 66, 18, 20, 50, 66, 21, 18, 37, 23, 49, 51, 0, + 16, 16, 25, 17, 0, 11, 113, 102, 66, 86, 51, 146, + 52, 70, 34, 18, 66, 98, 34, 50, 82, 50, 54, 24, + 0, 15, 16, 25, 16, 0, 12, 6, 23, 38, 23, 98, + 166, 52, 50, 98, 34, 34, 82, 50, 39, 18, 34, 39, + 36, 0, 12, 48, 31, 15, 0, 11, 38, 18, 34, 38, + 18, 34, 34, 34, 22, 34, 34, 22, 34, 34, 18, 34, + 34, 34, 18, 34, 38, 22, 38, 22, 0, 11, 64, 29, + 17, 0, 12, 102, 66, 86, 66, 82, 34, 66, 82, 34, + 67, 66, 34, 52, 66, 34, 35, 18, 54, 19, 35, 38, + 18, 66, 0, 13, 28, 17, 0, 12, 102, 65, 102, 51, + 82, 34, 51, 82, 34, 34, 18, 66, 34, 34, 18, 66, + 34, 18, 50, 54, 24, 0, 15, 16, 26, 14, 240, 240, + 204, 44, 34, 130, 34, 130, 34, 130, 44, 44, 240, 240, + 68, 146, 34, 130, 34, 130, 34, 148, 0, 6, 27, 15, + 0, 11, 34, 34, 22, 34, 34, 22, 38, 82, 38, 82, + 34, 34, 82, 34, 34, 82, 38, 82, 38, 82, 0, 11, + 64, 25, 15, 0, 11, 34, 34, 22, 34, 34, 18, 102, + 18, 102, 18, 98, 34, 18, 98, 34, 18, 102, 22, 0, + 13, 48, 34, 17, 0, 12, 98, 18, 34, 36, 34, 18, + 34, 66, 34, 18, 34, 66, 37, 35, 50, 34, 18, 20, + 50, 34, 18, 18, 18, 34, 39, 34, 34, 0, 15, 16, + 31, 17, 0, 12, 98, 18, 34, 36, 34, 18, 34, 34, + 66, 18, 34, 34, 69, 35, 18, 66, 18, 20, 18, 66, + 21, 20, 71, 38, 0, 15, 16, 29, 16, 0, 12, 2, + 34, 22, 50, 34, 22, 54, 67, 54, 66, 66, 34, 51, + 66, 34, 37, 54, 19, 19, 38, 17, 66, 0, 12, 32, + 25, 15, 0, 11, 34, 34, 22, 34, 34, 18, 102, 18, + 102, 22, 34, 34, 18, 98, 34, 18, 102, 22, 0, 13, + 48, 27, 14, 240, 210, 130, 34, 130, 44, 44, 34, 130, + 34, 130, 44, 44, 240, 240, 53, 130, 50, 114, 50, 114, + 50, 133, 0, 6, 41, 16, 240, 240, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 38, 38, 38, 38, + 34, 34, 34, 34, 38, 38, 38, 38, 240, 240, 148, 178, + 34, 162, 34, 162, 34, 180, 0, 6, 112, 26, 15, 0, + 11, 82, 38, 82, 38, 82, 98, 68, 82, 68, 82, 51, + 18, 66, 35, 35, 50, 34, 66, 50, 0, 11, 64, 24, + 17, 0, 13, 18, 66, 146, 66, 146, 66, 146, 66, 132, + 50, 133, 34, 114, 35, 22, 35, 50, 22, 0, 13, 24, + 17, 0, 13, 18, 70, 82, 66, 146, 66, 132, 50, 133, + 34, 115, 18, 34, 99, 50, 22, 145, 0, 13, 112, 29, + 17, 0, 13, 18, 66, 34, 82, 66, 34, 82, 70, 83, + 54, 68, 50, 34, 51, 18, 34, 34, 35, 35, 22, 34, + 66, 22, 0, 13, 26, 17, 0, 13, 18, 54, 98, 54, + 98, 99, 84, 82, 100, 67, 83, 18, 37, 51, 34, 19, + 19, 49, 98, 65, 0, 13, 20, 13, 0, 7, 17, 178, + 179, 149, 130, 18, 115, 19, 83, 50, 82, 67, 59, 0, + 11, 80, 30, 18, 0, 13, 100, 83, 86, 53, 51, 35, + 19, 34, 34, 66, 18, 50, 34, 66, 18, 50, 35, 35, + 19, 19, 54, 53, 84, 83, 0, 14, 21, 11, 0, 5, + 114, 146, 132, 103, 51, 51, 34, 82, 34, 82, 35, 51, + 55, 85, 0, 8, 96, 29, 18, 0, 11, 82, 98, 130, + 98, 102, 66, 83, 35, 51, 66, 66, 36, 66, 66, 37, + 51, 35, 18, 35, 54, 19, 50, 68, 0, 15, 28, 17, + 0, 11, 2, 97, 130, 82, 102, 51, 67, 35, 20, 66, + 66, 18, 18, 50, 68, 34, 51, 37, 50, 62, 68, 0, + 14, 16, 27, 16, 240, 240, 45, 61, 98, 66, 130, 66, + 130, 66, 94, 46, 0, 6, 116, 178, 34, 162, 34, 162, + 34, 180, 0, 6, 112, 29, 17, 0, 10, 101, 53, 240, + 240, 119, 23, 240, 100, 68, 65, 50, 33, 50, 34, 50, + 18, 50, 49, 50, 33, 50, 68, 68, 0, 11, 18, 13, + 0, 9, 107, 240, 240, 21, 99, 51, 66, 82, 67, 51, + 101, 0, 10, 48, 44, 20, 210, 240, 50, 240, 50, 240, + 50, 240, 50, 240, 50, 240, 53, 245, 242, 240, 50, 114, + 34, 82, 114, 34, 85, 66, 34, 85, 66, 34, 33, 34, + 91, 34, 91, 34, 240, 50, 240, 50, 240, 50, 240, 160, + 46, 19, 178, 34, 210, 34, 210, 34, 210, 34, 210, 34, + 210, 34, 214, 214, 210, 34, 210, 34, 66, 34, 54, 66, + 34, 54, 66, 34, 50, 34, 42, 18, 34, 42, 18, 34, + 210, 34, 210, 34, 210, 34, 240, 34, 240, 96, 46, 18, + 226, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 82, 34, 82, 82, 34, + 82, 82, 34, 82, 82, 34, 34, 18, 45, 18, 44, 34, + 240, 18, 240, 18, 240, 18, 240, 80, 48, 18, 226, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 45, 18, 43, 50, 66, 34, 98, + 66, 34, 38, 66, 34, 38, 66, 34, 98, 66, 34, 38, + 66, 34, 38, 66, 34, 98, 240, 80, 56, 19, 178, 34, + 210, 34, 210, 34, 210, 34, 210, 34, 210, 34, 210, 34, + 210, 34, 210, 34, 210, 34, 42, 18, 34, 42, 18, 34, + 50, 34, 21, 34, 50, 34, 21, 34, 50, 34, 66, 34, + 50, 34, 21, 34, 50, 34, 21, 34, 50, 34, 66, 34, + 240, 34, 240, 96, 47, 18, 226, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 44, 34, 43, 50, 82, 34, 82, 82, 34, + 82, 82, 34, 82, 82, 34, 82, 82, 34, 82, 82, 34, + 82, 240, 80, 10, 5, 240, 240, 163, 35, 35, 0, 5, + 112, 25, 9, 82, 114, 114, 114, 114, 114, 114, 114, 35, + 34, 35, 34, 35, 34, 114, 114, 114, 114, 114, 114, 114, + 114, 176, + 0, 0, // Padding + +}; + +tFont *g_psFontWHangulgothic20ptb = (tFont *)g_pui8Hangulgothic20ptb; diff --git a/third_party/fonts/ofl/fonts/fonthangulgothic22pt.c b/third_party/fonts/ofl/fonts/fonthangulgothic22pt.c new file mode 100644 index 0000000..d03bf21 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulgothic22pt.c @@ -0,0 +1,854 @@ +//***************************************************************************** +// +// fonthangulgothic22pt.c - Font definition for the 22ptpt Hangulgothic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulgothic +// Size: 22pt +// Bold: no +// Italic: no +// Memory usage: 6389 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulgothic22pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 21, + + // + // The height of the font. + // + 22, + + // + // The baseline of the font. + // + 18, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0xe4, 0x0b, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x92, 0x01, 0x00, 0x00, // Offset 402 (0x192) + 0xa2, 0x01, 0x00, 0x00, // Offset 418 (0x1a2) + 0xc7, 0x01, 0x00, 0x00, // Offset 455 (0x1c7) + 0xea, 0x01, 0x00, 0x00, // Offset 490 (0x1ea) + 0x20, 0x02, 0x00, 0x00, // Offset 544 (0x220) + 0x48, 0x02, 0x00, 0x00, // Offset 584 (0x248) + 0x52, 0x02, 0x00, 0x00, // Offset 594 (0x252) + 0x6a, 0x02, 0x00, 0x00, // Offset 618 (0x26a) + 0x81, 0x02, 0x00, 0x00, // Offset 641 (0x281) + 0x94, 0x02, 0x00, 0x00, // Offset 660 (0x294) + 0xa6, 0x02, 0x00, 0x00, // Offset 678 (0x2a6) + 0xb0, 0x02, 0x00, 0x00, // Offset 688 (0x2b0) + 0xb8, 0x02, 0x00, 0x00, // Offset 696 (0x2b8) + 0xbf, 0x02, 0x00, 0x00, // Offset 703 (0x2bf) + 0xd7, 0x02, 0x00, 0x00, // Offset 727 (0x2d7) + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x13, 0x03, 0x00, 0x00, // Offset 787 (0x313) + 0x2b, 0x03, 0x00, 0x00, // Offset 811 (0x32b) + 0x43, 0x03, 0x00, 0x00, // Offset 835 (0x343) + 0x63, 0x03, 0x00, 0x00, // Offset 867 (0x363) + 0x7a, 0x03, 0x00, 0x00, // Offset 890 (0x37a) + 0x9a, 0x03, 0x00, 0x00, // Offset 922 (0x39a) + 0xb1, 0x03, 0x00, 0x00, // Offset 945 (0x3b1) + 0xd5, 0x03, 0x00, 0x00, // Offset 981 (0x3d5) + 0xf5, 0x03, 0x00, 0x00, // Offset 1013 (0x3f5) + 0x00, 0x04, 0x00, 0x00, // Offset 1024 (0x400) + 0x0c, 0x04, 0x00, 0x00, // Offset 1036 (0x40c) + 0x24, 0x04, 0x00, 0x00, // Offset 1060 (0x424) + 0x2f, 0x04, 0x00, 0x00, // Offset 1071 (0x42f) + 0x47, 0x04, 0x00, 0x00, // Offset 1095 (0x447) + 0x5c, 0x04, 0x00, 0x00, // Offset 1116 (0x45c) + 0x90, 0x04, 0x00, 0x00, // Offset 1168 (0x490) + 0xb3, 0x04, 0x00, 0x00, // Offset 1203 (0x4b3) + 0xd7, 0x04, 0x00, 0x00, // Offset 1239 (0x4d7) + 0xee, 0x04, 0x00, 0x00, // Offset 1262 (0x4ee) + 0x13, 0x05, 0x00, 0x00, // Offset 1299 (0x513) + 0x2a, 0x05, 0x00, 0x00, // Offset 1322 (0x52a) + 0x41, 0x05, 0x00, 0x00, // Offset 1345 (0x541) + 0x61, 0x05, 0x00, 0x00, // Offset 1377 (0x561) + 0x87, 0x05, 0x00, 0x00, // Offset 1415 (0x587) + 0x9a, 0x05, 0x00, 0x00, // Offset 1434 (0x59a) + 0xaf, 0x05, 0x00, 0x00, // Offset 1455 (0x5af) + 0xd5, 0x05, 0x00, 0x00, // Offset 1493 (0x5d5) + 0xec, 0x05, 0x00, 0x00, // Offset 1516 (0x5ec) + 0x2b, 0x06, 0x00, 0x00, // Offset 1579 (0x62b) + 0x5c, 0x06, 0x00, 0x00, // Offset 1628 (0x65c) + 0x81, 0x06, 0x00, 0x00, // Offset 1665 (0x681) + 0x9f, 0x06, 0x00, 0x00, // Offset 1695 (0x69f) + 0xc7, 0x06, 0x00, 0x00, // Offset 1735 (0x6c7) + 0xec, 0x06, 0x00, 0x00, // Offset 1772 (0x6ec) + 0x04, 0x07, 0x00, 0x00, // Offset 1796 (0x704) + 0x1b, 0x07, 0x00, 0x00, // Offset 1819 (0x71b) + 0x41, 0x07, 0x00, 0x00, // Offset 1857 (0x741) + 0x66, 0x07, 0x00, 0x00, // Offset 1894 (0x766) + 0xa6, 0x07, 0x00, 0x00, // Offset 1958 (0x7a6) + 0xca, 0x07, 0x00, 0x00, // Offset 1994 (0x7ca) + 0xe7, 0x07, 0x00, 0x00, // Offset 2023 (0x7e7) + 0xfe, 0x07, 0x00, 0x00, // Offset 2046 (0x7fe) + 0x16, 0x08, 0x00, 0x00, // Offset 2070 (0x816) + 0x4f, 0x08, 0x00, 0x00, // Offset 2127 (0x84f) + 0x67, 0x08, 0x00, 0x00, // Offset 2151 (0x867) + 0x80, 0x08, 0x00, 0x00, // Offset 2176 (0x880) + 0x86, 0x08, 0x00, 0x00, // Offset 2182 (0x886) + 0x8e, 0x08, 0x00, 0x00, // Offset 2190 (0x88e) + 0xa9, 0x08, 0x00, 0x00, // Offset 2217 (0x8a9) + 0xcc, 0x08, 0x00, 0x00, // Offset 2252 (0x8cc) + 0xdf, 0x08, 0x00, 0x00, // Offset 2271 (0x8df) + 0x03, 0x09, 0x00, 0x00, // Offset 2307 (0x903) + 0x1b, 0x09, 0x00, 0x00, // Offset 2331 (0x91b) + 0x32, 0x09, 0x00, 0x00, // Offset 2354 (0x932) + 0x53, 0x09, 0x00, 0x00, // Offset 2387 (0x953) + 0x76, 0x09, 0x00, 0x00, // Offset 2422 (0x976) + 0x87, 0x09, 0x00, 0x00, // Offset 2439 (0x987) + 0x9d, 0x09, 0x00, 0x00, // Offset 2461 (0x99d) + 0xc0, 0x09, 0x00, 0x00, // Offset 2496 (0x9c0) + 0xd4, 0x09, 0x00, 0x00, // Offset 2516 (0x9d4) + 0xff, 0x09, 0x00, 0x00, // Offset 2559 (0x9ff) + 0x1e, 0x0a, 0x00, 0x00, // Offset 2590 (0xa1e) + 0x3b, 0x0a, 0x00, 0x00, // Offset 2619 (0xa3b) + 0x5b, 0x0a, 0x00, 0x00, // Offset 2651 (0xa5b) + 0x7b, 0x0a, 0x00, 0x00, // Offset 2683 (0xa7b) + 0x8e, 0x0a, 0x00, 0x00, // Offset 2702 (0xa8e) + 0xa2, 0x0a, 0x00, 0x00, // Offset 2722 (0xaa2) + 0xb8, 0x0a, 0x00, 0x00, // Offset 2744 (0xab8) + 0xd7, 0x0a, 0x00, 0x00, // Offset 2775 (0xad7) + 0xf4, 0x0a, 0x00, 0x00, // Offset 2804 (0xaf4) + 0x24, 0x0b, 0x00, 0x00, // Offset 2852 (0xb24) + 0x40, 0x0b, 0x00, 0x00, // Offset 2880 (0xb40) + 0x5c, 0x0b, 0x00, 0x00, // Offset 2908 (0xb5c) + 0x6f, 0x0b, 0x00, 0x00, // Offset 2927 (0xb6f) + 0x87, 0x0b, 0x00, 0x00, // Offset 2951 (0xb87) + 0x9d, 0x0b, 0x00, 0x00, // Offset 2973 (0xb9d) + 0xb5, 0x0b, 0x00, 0x00, // Offset 2997 (0xbb5) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 9, 0, 24, 96, 17, 4, 194, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 162, 34, 224, 16, 7, + 240, 98, 18, 34, 18, 34, 18, 34, 18, 34, 18, 0, + 12, 64, 37, 13, 240, 240, 209, 50, 98, 50, 98, 50, + 98, 49, 114, 49, 75, 81, 65, 98, 50, 98, 50, 98, + 50, 75, 65, 65, 113, 65, 113, 50, 98, 50, 98, 50, + 240, 240, 224, 35, 11, 241, 161, 134, 66, 17, 98, 33, + 98, 33, 98, 33, 99, 17, 116, 147, 147, 129, 18, 113, + 34, 97, 34, 97, 34, 97, 34, 33, 49, 18, 54, 145, + 240, 208, 54, 21, 0, 6, 113, 148, 98, 130, 34, 81, + 130, 66, 50, 130, 66, 34, 146, 66, 33, 162, 66, 18, + 178, 34, 33, 212, 34, 52, 193, 50, 34, 162, 34, 66, + 145, 50, 66, 129, 66, 66, 114, 66, 66, 113, 82, 66, + 98, 98, 34, 113, 132, 0, 8, 48, 40, 15, 0, 6, + 20, 161, 50, 129, 82, 113, 82, 113, 82, 114, 50, 145, + 34, 164, 164, 82, 50, 34, 66, 34, 66, 50, 34, 82, + 33, 50, 99, 66, 114, 82, 84, 101, 50, 0, 5, 112, + 10, 4, 194, 34, 34, 34, 34, 0, 7, 32, 24, 7, + 240, 49, 82, 81, 82, 66, 82, 81, 82, 82, 82, 82, + 82, 82, 97, 98, 82, 98, 97, 98, 97, 32, 23, 7, + 225, 98, 97, 98, 97, 98, 97, 98, 82, 82, 82, 82, + 82, 81, 82, 82, 66, 81, 82, 81, 96, 19, 11, 0, + 10, 17, 161, 97, 49, 105, 97, 145, 17, 114, 18, 97, + 49, 0, 10, 16, 18, 14, 0, 11, 18, 194, 194, 194, + 194, 124, 114, 194, 194, 194, 194, 0, 9, 80, 10, 5, + 0, 10, 98, 49, 50, 50, 49, 64, 8, 8, 0, 10, + 6, 0, 11, 32, 7, 4, 0, 9, 2, 34, 160, 24, + 10, 240, 240, 113, 130, 129, 130, 130, 129, 130, 130, 129, + 130, 130, 129, 130, 130, 129, 130, 129, 130, 240, 48, 37, + 13, 240, 240, 197, 114, 50, 82, 82, 66, 82, 50, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 50, 82, 66, 82, 82, 50, 117, 240, 240, 224, + 23, 7, 240, 146, 52, 34, 18, 33, 34, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 240, 128, 24, + 12, 240, 240, 133, 97, 82, 178, 162, 162, 162, 146, 147, + 146, 146, 146, 146, 146, 146, 146, 170, 240, 240, 128, 24, + 12, 240, 240, 118, 81, 83, 178, 162, 162, 146, 146, 100, + 195, 163, 162, 162, 162, 146, 146, 70, 240, 240, 192, 32, + 14, 0, 6, 19, 179, 161, 18, 146, 18, 130, 34, 129, + 50, 113, 66, 98, 66, 82, 82, 81, 98, 66, 98, 76, + 162, 194, 194, 194, 0, 5, 96, 23, 11, 240, 240, 57, + 34, 146, 146, 146, 146, 151, 147, 147, 146, 146, 146, 146, + 130, 131, 54, 240, 240, 128, 32, 13, 240, 240, 214, 98, + 162, 162, 178, 162, 178, 36, 84, 51, 51, 83, 34, 114, + 34, 114, 34, 114, 49, 114, 50, 82, 82, 51, 101, 240, + 240, 224, 23, 12, 240, 240, 106, 162, 162, 146, 162, 146, + 162, 161, 162, 161, 162, 162, 146, 162, 161, 162, 240, 240, + 224, 36, 13, 240, 240, 198, 82, 82, 50, 114, 34, 114, + 34, 114, 50, 82, 82, 35, 116, 131, 19, 82, 82, 50, + 114, 34, 114, 34, 114, 34, 114, 51, 51, 101, 240, 240, + 224, 32, 13, 240, 240, 197, 99, 50, 82, 82, 50, 113, + 50, 114, 34, 114, 34, 114, 35, 83, 50, 68, 84, 34, + 178, 162, 178, 162, 162, 101, 0, 5, 96, 11, 4, 240, + 82, 34, 240, 240, 66, 34, 240, 112, 12, 4, 240, 82, + 34, 240, 240, 66, 34, 34, 33, 240, 24, 12, 240, 240, + 49, 161, 147, 131, 131, 131, 131, 131, 131, 146, 163, 163, + 163, 163, 163, 163, 178, 177, 193, 224, 11, 14, 0, 14, + 12, 0, 7, 44, 0, 14, 32, 24, 12, 240, 145, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 146, 146, 146, 146, + 146, 146, 146, 146, 161, 240, 128, 21, 10, 240, 246, 146, + 146, 130, 130, 130, 114, 114, 114, 130, 114, 130, 240, 210, + 130, 240, 240, 96, 52, 19, 0, 7, 103, 163, 83, 114, + 146, 82, 52, 66, 66, 34, 51, 34, 34, 34, 82, 34, + 34, 19, 81, 50, 34, 18, 82, 50, 34, 18, 82, 50, + 34, 18, 66, 50, 50, 19, 35, 34, 82, 20, 35, 114, + 178, 82, 146, 115, 83, 167, 0, 8, 35, 16, 0, 6, + 98, 227, 196, 193, 34, 162, 34, 162, 49, 146, 66, 130, + 66, 129, 98, 98, 98, 98, 98, 92, 66, 130, 65, 162, + 34, 162, 33, 193, 0, 6, 32, 36, 12, 240, 240, 103, + 82, 66, 66, 82, 50, 82, 50, 82, 50, 82, 50, 66, + 70, 98, 66, 66, 82, 50, 98, 34, 98, 34, 98, 34, + 83, 34, 67, 55, 240, 240, 176, 23, 14, 0, 5, 119, + 83, 162, 178, 194, 178, 194, 194, 194, 194, 194, 210, 194, + 210, 211, 215, 240, 240, 224, 37, 14, 240, 240, 199, 114, + 82, 82, 98, 66, 114, 50, 114, 50, 130, 34, 130, 34, + 130, 34, 130, 34, 130, 34, 130, 34, 114, 50, 114, 50, + 98, 66, 67, 87, 0, 6, 16, 23, 11, 240, 240, 57, + 34, 146, 146, 146, 146, 146, 153, 34, 146, 146, 146, 146, + 146, 146, 153, 240, 240, 80, 23, 11, 240, 240, 57, 34, + 146, 146, 146, 146, 146, 152, 50, 146, 146, 146, 146, 146, + 146, 146, 240, 240, 192, 32, 16, 0, 6, 103, 114, 97, + 82, 210, 226, 210, 226, 226, 87, 34, 162, 34, 162, 34, + 162, 50, 146, 50, 146, 66, 130, 83, 98, 120, 0, 6, + 48, 38, 14, 240, 240, 194, 130, 34, 130, 34, 130, 34, + 130, 34, 130, 34, 130, 34, 130, 44, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 240, 240, 224, 19, 4, 194, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 224, 21, 8, + 240, 210, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 82, 52, 240, 208, 38, 13, 240, 240, 146, + 114, 34, 98, 50, 82, 66, 66, 82, 50, 98, 34, 114, + 34, 114, 19, 118, 115, 34, 98, 66, 82, 81, 82, 82, + 66, 98, 50, 114, 34, 114, 240, 240, 176, 23, 11, 240, + 240, 50, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 153, 240, 240, 80, 63, 19, 0, 7, + 19, 179, 35, 179, 36, 148, 34, 17, 145, 18, 34, 17, + 145, 18, 34, 33, 113, 34, 34, 33, 113, 34, 34, 34, + 82, 34, 34, 49, 81, 50, 34, 50, 65, 50, 34, 65, + 49, 66, 34, 65, 49, 66, 34, 66, 18, 66, 34, 81, + 17, 82, 34, 83, 82, 34, 97, 98, 0, 7, 48, 49, + 14, 240, 240, 194, 130, 35, 114, 35, 114, 34, 17, 98, + 34, 17, 98, 34, 33, 82, 34, 49, 66, 34, 49, 66, + 34, 65, 50, 34, 65, 50, 34, 81, 34, 34, 81, 34, + 34, 97, 18, 34, 100, 34, 115, 34, 130, 240, 240, 224, + 37, 17, 0, 7, 5, 162, 82, 114, 114, 82, 146, 66, + 146, 50, 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, + 178, 50, 146, 66, 146, 82, 114, 114, 82, 151, 0, 7, + 16, 30, 12, 240, 240, 103, 82, 82, 50, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 82, 55, 82, 162, 162, + 162, 162, 162, 162, 0, 5, 96, 40, 17, 0, 7, 5, + 162, 82, 114, 114, 82, 146, 66, 146, 50, 178, 34, 178, + 34, 178, 34, 178, 34, 178, 34, 178, 50, 146, 66, 146, + 82, 114, 114, 82, 151, 242, 240, 18, 240, 18, 64, 37, + 13, 240, 240, 152, 82, 82, 66, 98, 50, 98, 50, 98, + 50, 98, 50, 82, 66, 67, 71, 98, 65, 98, 66, 82, + 81, 82, 82, 66, 98, 50, 98, 50, 114, 240, 240, 176, + 24, 11, 240, 240, 102, 50, 130, 146, 146, 147, 147, 148, + 147, 147, 162, 146, 146, 145, 49, 67, 54, 240, 240, 128, + 23, 13, 240, 240, 155, 114, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 240, 240, 240, 38, + 14, 240, 240, 194, 130, 34, 130, 34, 130, 34, 130, 34, + 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, + 130, 34, 130, 34, 130, 50, 98, 82, 66, 118, 0, 5, + 112, 37, 15, 240, 240, 241, 177, 34, 146, 34, 146, 49, + 130, 66, 114, 66, 113, 97, 98, 98, 82, 113, 81, 130, + 50, 130, 49, 161, 34, 162, 18, 177, 17, 195, 194, 0, + 6, 80, 64, 23, 0, 8, 81, 131, 114, 34, 115, 114, + 34, 113, 17, 113, 50, 98, 17, 113, 65, 97, 34, 82, + 66, 81, 34, 82, 66, 66, 49, 81, 97, 66, 50, 50, + 98, 49, 66, 50, 98, 49, 81, 49, 129, 34, 81, 49, + 129, 33, 98, 18, 130, 17, 98, 17, 148, 113, 17, 163, + 115, 162, 131, 0, 9, 48, 36, 15, 240, 240, 242, 146, + 50, 114, 82, 82, 113, 81, 130, 50, 146, 18, 179, 195, + 195, 178, 18, 146, 50, 129, 66, 114, 82, 82, 114, 50, + 130, 50, 146, 0, 5, 112, 29, 16, 0, 6, 2, 162, + 50, 130, 81, 129, 98, 98, 114, 66, 145, 65, 162, 34, + 180, 195, 226, 226, 226, 226, 226, 226, 226, 0, 7, 23, + 13, 240, 240, 154, 178, 162, 178, 162, 178, 162, 162, 178, + 162, 162, 178, 162, 178, 162, 187, 240, 240, 176, 24, 6, + 100, 34, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 68, 32, 57, 21, + 0, 10, 97, 98, 82, 81, 83, 82, 81, 83, 81, 98, + 65, 17, 81, 98, 65, 17, 66, 113, 65, 18, 50, 79, + 4, 81, 49, 49, 49, 130, 33, 49, 49, 145, 33, 50, + 18, 145, 18, 65, 17, 161, 17, 81, 17, 163, 81, 17, + 178, 83, 178, 97, 0, 8, 96, 24, 6, 100, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 36, 32, 25, 13, 240, 240, 210, + 179, 146, 17, 145, 34, 114, 49, 113, 66, 82, 81, 81, + 98, 50, 113, 49, 130, 0, 14, 112, 6, 14, 0, 36, + 108, 32, 8, 5, 241, 66, 66, 0, 10, 32, 27, 11, + 0, 9, 102, 66, 66, 162, 146, 86, 51, 50, 35, 66, + 34, 82, 34, 82, 34, 67, 50, 36, 67, 34, 240, 240, + 80, 35, 12, 240, 146, 162, 162, 162, 162, 162, 21, 68, + 35, 51, 66, 50, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 35, 66, 52, 35, 50, 21, 240, 240, 160, + 19, 11, 0, 10, 21, 66, 130, 130, 146, 146, 146, 146, + 147, 146, 162, 166, 240, 240, 80, 36, 12, 240, 240, 34, + 162, 162, 162, 162, 69, 18, 50, 52, 50, 67, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 50, 67, + 50, 52, 69, 18, 240, 240, 128, 24, 12, 0, 10, 116, + 114, 50, 66, 66, 50, 98, 34, 98, 42, 34, 162, 162, + 178, 163, 65, 102, 240, 240, 144, 23, 9, 240, 100, 67, + 98, 114, 114, 87, 66, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 240, 240, 32, 33, 13, 0, 11, 101, 18, + 51, 52, 50, 83, 34, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 34, 114, 50, 83, 66, 52, 85, 18, 162, 65, + 82, 87, 80, 35, 12, 240, 146, 162, 162, 162, 162, 162, + 21, 67, 66, 50, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 240, + 240, 128, 17, 4, 130, 34, 226, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 224, 22, 7, 240, 34, 82, + 240, 178, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 36, 48, 35, 11, 240, 114, 146, 146, 146, + 146, 146, 82, 34, 66, 50, 50, 66, 34, 82, 18, 98, + 18, 99, 17, 99, 18, 82, 50, 66, 66, 50, 81, 50, + 82, 240, 240, 80, 20, 4, 130, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 224, + 43, 18, 0, 15, 98, 20, 52, 67, 50, 17, 50, 50, + 83, 66, 34, 82, 82, 34, 82, 82, 34, 82, 82, 34, + 82, 82, 34, 82, 82, 34, 82, 82, 34, 82, 82, 34, + 82, 82, 34, 82, 82, 0, 7, 31, 12, 0, 10, 66, + 21, 67, 66, 51, 82, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 240, + 240, 128, 29, 13, 0, 11, 101, 114, 50, 82, 82, 50, + 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 50, + 82, 82, 50, 117, 240, 240, 224, 32, 12, 0, 10, 66, + 21, 68, 50, 51, 66, 50, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 35, 66, 52, 35, 50, 20, 82, + 162, 162, 160, 32, 12, 0, 10, 101, 18, 50, 52, 50, + 67, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 50, 67, 51, 36, 69, 18, 162, 162, 162, 32, 19, + 8, 0, 7, 2, 19, 36, 67, 82, 98, 98, 98, 98, + 98, 98, 98, 98, 240, 240, 20, 10, 0, 9, 5, 66, + 114, 130, 131, 132, 147, 131, 130, 130, 33, 66, 54, 240, + 240, 64, 22, 10, 240, 240, 194, 130, 130, 103, 82, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 149, 240, 240, 32, + 31, 12, 0, 10, 66, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 83, + 50, 52, 68, 34, 240, 240, 128, 29, 11, 0, 9, 81, + 113, 34, 82, 34, 82, 49, 81, 65, 66, 66, 50, 81, + 49, 97, 34, 98, 17, 129, 17, 131, 130, 240, 240, 144, + 48, 20, 0, 17, 66, 98, 113, 49, 99, 82, 50, 81, + 17, 82, 50, 66, 17, 81, 81, 65, 34, 50, 82, 49, + 49, 50, 82, 34, 49, 49, 113, 33, 66, 18, 114, 17, + 81, 18, 116, 81, 17, 147, 83, 146, 99, 0, 8, 16, + 28, 11, 0, 9, 82, 82, 50, 65, 81, 50, 82, 18, + 115, 146, 131, 129, 18, 98, 33, 82, 50, 65, 82, 34, + 97, 240, 240, 80, 28, 11, 0, 9, 81, 98, 34, 81, + 50, 66, 65, 66, 66, 49, 97, 34, 97, 34, 98, 17, + 131, 130, 146, 146, 145, 146, 115, 128, 19, 11, 0, 9, + 89, 146, 130, 130, 146, 130, 130, 130, 145, 146, 130, 153, + 240, 240, 80, 24, 8, 240, 67, 66, 98, 98, 98, 98, + 98, 98, 98, 67, 83, 114, 98, 98, 98, 98, 98, 98, + 98, 115, 32, 22, 4, 130, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 96, 24, 8, 240, 19, 114, 98, 98, 98, 98, 98, 98, + 98, 115, 83, 66, 98, 98, 98, 98, 98, 98, 98, 67, + 80, 13, 13, 0, 14, 99, 146, 34, 50, 33, 84, 0, + 16, 80, + 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8f, 0x01, 0x00, 0x00, // Offset 399 (0x18f) + 0xa7, 0x01, 0x00, 0x00, // Offset 423 (0x1a7) + 0xc3, 0x01, 0x00, 0x00, // Offset 451 (0x1c3) + 0xd2, 0x01, 0x00, 0x00, // Offset 466 (0x1d2) + 0xed, 0x01, 0x00, 0x00, // Offset 493 (0x1ed) + 0x09, 0x02, 0x00, 0x00, // Offset 521 (0x209) + 0x18, 0x02, 0x00, 0x00, // Offset 536 (0x218) + 0x30, 0x02, 0x00, 0x00, // Offset 560 (0x230) + 0x40, 0x02, 0x00, 0x00, // Offset 576 (0x240) + 0x58, 0x02, 0x00, 0x00, // Offset 600 (0x258) + 0x78, 0x02, 0x00, 0x00, // Offset 632 (0x278) + 0x97, 0x02, 0x00, 0x00, // Offset 663 (0x297) + 0xb2, 0x02, 0x00, 0x00, // Offset 690 (0x2b2) + 0xcb, 0x02, 0x00, 0x00, // Offset 715 (0x2cb) + 0xee, 0x02, 0x00, 0x00, // Offset 750 (0x2ee) + 0x0a, 0x03, 0x00, 0x00, // Offset 778 (0x30a) + 0x20, 0x03, 0x00, 0x00, // Offset 800 (0x320) + 0x36, 0x03, 0x00, 0x00, // Offset 822 (0x336) + 0x5d, 0x03, 0x00, 0x00, // Offset 861 (0x35d) + 0x82, 0x03, 0x00, 0x00, // Offset 898 (0x382) + 0x95, 0x03, 0x00, 0x00, // Offset 917 (0x395) + 0xb4, 0x03, 0x00, 0x00, // Offset 948 (0x3b4) + 0xcd, 0x03, 0x00, 0x00, // Offset 973 (0x3cd) + 0xe2, 0x03, 0x00, 0x00, // Offset 994 (0x3e2) + 0xff, 0x03, 0x00, 0x00, // Offset 1023 (0x3ff) + 0x13, 0x04, 0x00, 0x00, // Offset 1043 (0x413) + 0x23, 0x04, 0x00, 0x00, // Offset 1059 (0x423) + 0x32, 0x04, 0x00, 0x00, // Offset 1074 (0x432) + 0x4b, 0x04, 0x00, 0x00, // Offset 1099 (0x44b) + 0x63, 0x04, 0x00, 0x00, // Offset 1123 (0x463) + 0x7a, 0x04, 0x00, 0x00, // Offset 1146 (0x47a) + 0xa3, 0x04, 0x00, 0x00, // Offset 1187 (0x4a3) + 0xba, 0x04, 0x00, 0x00, // Offset 1210 (0x4ba) + 0xe2, 0x04, 0x00, 0x00, // Offset 1250 (0x4e2) + 0xf9, 0x04, 0x00, 0x00, // Offset 1273 (0x4f9) + 0x23, 0x05, 0x00, 0x00, // Offset 1315 (0x523) + 0x3a, 0x05, 0x00, 0x00, // Offset 1338 (0x53a) + 0x64, 0x05, 0x00, 0x00, // Offset 1380 (0x564) + 0x79, 0x05, 0x00, 0x00, // Offset 1401 (0x579) + 0xa7, 0x05, 0x00, 0x00, // Offset 1447 (0x5a7) + 0xdb, 0x05, 0x00, 0x00, // Offset 1499 (0x5db) + 0x09, 0x06, 0x00, 0x00, // Offset 1545 (0x609) + 0x1f, 0x06, 0x00, 0x00, // Offset 1567 (0x61f) + 0x39, 0x06, 0x00, 0x00, // Offset 1593 (0x639) + 0x66, 0x06, 0x00, 0x00, // Offset 1638 (0x666) + 0x9d, 0x06, 0x00, 0x00, // Offset 1693 (0x69d) + 0xca, 0x06, 0x00, 0x00, // Offset 1738 (0x6ca) + 0xe5, 0x06, 0x00, 0x00, // Offset 1765 (0x6e5) + 0xee, 0x06, 0x00, 0x00, // Offset 1774 (0x6ee) + 0x1b, 0x07, 0x00, 0x00, // Offset 1819 (0x71b) + 0x32, 0x07, 0x00, 0x00, // Offset 1842 (0x732) + 0x36, 0x07, 0x00, 0x00, // Offset 1846 (0x736) + 0x4e, 0x07, 0x00, 0x00, // Offset 1870 (0x74e) + 0x66, 0x07, 0x00, 0x00, // Offset 1894 (0x766) + 0x84, 0x07, 0x00, 0x00, // Offset 1924 (0x784) + 0xa0, 0x07, 0x00, 0x00, // Offset 1952 (0x7a0) + 0xc7, 0x07, 0x00, 0x00, // Offset 1991 (0x7c7) + 0xdf, 0x07, 0x00, 0x00, // Offset 2015 (0x7df) + 0x10, 0x08, 0x00, 0x00, // Offset 2064 (0x810) + 0x2c, 0x08, 0x00, 0x00, // Offset 2092 (0x82c) + 0x47, 0x08, 0x00, 0x00, // Offset 2119 (0x847) + 0x6e, 0x08, 0x00, 0x00, // Offset 2158 (0x86e) + 0x92, 0x08, 0x00, 0x00, // Offset 2194 (0x892) + 0xb7, 0x08, 0x00, 0x00, // Offset 2231 (0x8b7) + 0xd7, 0x08, 0x00, 0x00, // Offset 2263 (0x8d7) + 0xf6, 0x08, 0x00, 0x00, // Offset 2294 (0x8f6) + 0x16, 0x09, 0x00, 0x00, // Offset 2326 (0x916) + 0x46, 0x09, 0x00, 0x00, // Offset 2374 (0x946) + 0x74, 0x09, 0x00, 0x00, // Offset 2420 (0x974) + 0x98, 0x09, 0x00, 0x00, // Offset 2456 (0x998) + 0xb8, 0x09, 0x00, 0x00, // Offset 2488 (0x9b8) + 0xd8, 0x09, 0x00, 0x00, // Offset 2520 (0x9d8) + 0x05, 0x0a, 0x00, 0x00, // Offset 2565 (0xa05) + 0x22, 0x0a, 0x00, 0x00, // Offset 2594 (0xa22) + 0x3f, 0x0a, 0x00, 0x00, // Offset 2623 (0xa3f) + 0x5b, 0x0a, 0x00, 0x00, // Offset 2651 (0xa5b) + 0x80, 0x0a, 0x00, 0x00, // Offset 2688 (0xa80) + 0xa1, 0x0a, 0x00, 0x00, // Offset 2721 (0xaa1) + 0xb7, 0x0a, 0x00, 0x00, // Offset 2743 (0xab7) + 0xde, 0x0a, 0x00, 0x00, // Offset 2782 (0xade) + 0xf9, 0x0a, 0x00, 0x00, // Offset 2809 (0xaf9) + 0x1e, 0x0b, 0x00, 0x00, // Offset 2846 (0xb1e) + 0x43, 0x0b, 0x00, 0x00, // Offset 2883 (0xb43) + 0x63, 0x0b, 0x00, 0x00, // Offset 2915 (0xb63) + 0x88, 0x0b, 0x00, 0x00, // Offset 2952 (0xb88) + 0xa0, 0x0b, 0x00, 0x00, // Offset 2976 (0xba0) + 0xd2, 0x0b, 0x00, 0x00, // Offset 3026 (0xbd2) + 0x14, 0x0c, 0x00, 0x00, // Offset 3092 (0xc14) + 0x48, 0x0c, 0x00, 0x00, // Offset 3144 (0xc48) + 0x7e, 0x0c, 0x00, 0x00, // Offset 3198 (0xc7e) + 0xbc, 0x0c, 0x00, 0x00, // Offset 3260 (0xcbc) + 0xf1, 0x0c, 0x00, 0x00, // Offset 3313 (0xcf1) + 0xfa, 0x0c, 0x00, 0x00, // Offset 3322 (0xcfa) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 15, 13, 0, 11, 59, 178, 178, 178, 178, 178, 178, 178, + 178, 0, 10, 24, 16, 0, 14, 14, 114, 82, 114, 82, + 114, 82, 114, 82, 114, 82, 114, 82, 114, 82, 114, 82, + 0, 12, 32, 28, 18, 0, 15, 103, 66, 162, 66, 162, + 66, 162, 66, 162, 51, 162, 49, 18, 146, 34, 34, 130, + 18, 65, 132, 82, 0, 13, 96, 15, 13, 0, 11, 50, + 178, 178, 178, 178, 178, 178, 178, 187, 0, 10, 27, 18, + 0, 15, 98, 87, 66, 177, 66, 162, 66, 161, 82, 146, + 82, 131, 82, 114, 33, 66, 98, 51, 41, 97, 0, 13, + 96, 28, 16, 0, 13, 5, 50, 226, 72, 34, 226, 101, + 50, 82, 50, 34, 81, 81, 34, 81, 81, 34, 82, 50, + 39, 21, 0, 12, 48, 15, 13, 0, 11, 59, 34, 178, + 178, 178, 178, 178, 178, 187, 0, 10, 24, 16, 0, 14, + 6, 23, 34, 82, 114, 82, 114, 82, 114, 82, 114, 82, + 114, 82, 114, 82, 126, 0, 12, 32, 16, 13, 0, 9, + 107, 178, 178, 178, 178, 43, 34, 178, 178, 187, 0, 10, + 24, 14, 0, 12, 44, 113, 81, 113, 81, 113, 81, 38, + 81, 33, 161, 33, 161, 33, 161, 39, 65, 0, 10, 96, + 32, 15, 0, 13, 21, 38, 97, 33, 65, 97, 33, 65, + 97, 33, 65, 37, 33, 65, 33, 97, 65, 33, 97, 65, + 33, 97, 65, 38, 22, 0, 11, 64, 31, 15, 0, 13, + 22, 17, 65, 113, 17, 65, 113, 17, 65, 113, 22, 38, + 17, 65, 33, 97, 65, 33, 97, 65, 33, 97, 65, 45, + 0, 11, 64, 27, 17, 0, 14, 118, 65, 177, 65, 177, + 65, 177, 65, 102, 50, 97, 129, 17, 81, 114, 18, 65, + 113, 50, 56, 82, 0, 13, 25, 15, 0, 13, 21, 37, + 113, 33, 177, 33, 177, 33, 117, 37, 49, 97, 113, 97, + 113, 97, 118, 22, 0, 11, 64, 35, 16, 0, 12, 6, + 23, 113, 33, 33, 145, 33, 33, 145, 33, 33, 145, 33, + 33, 70, 33, 33, 65, 113, 33, 65, 113, 33, 65, 113, + 33, 70, 23, 0, 12, 32, 28, 16, 0, 12, 6, 37, + 129, 249, 113, 241, 37, 54, 18, 50, 33, 97, 81, 33, + 97, 81, 33, 98, 50, 38, 37, 0, 12, 48, 22, 13, + 0, 11, 59, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 43, 0, 10, 22, 13, 0, 11, + 50, 114, 34, 114, 34, 114, 43, 34, 114, 34, 114, 34, + 114, 34, 114, 43, 0, 10, 39, 15, 0, 13, 17, 49, + 33, 65, 33, 49, 33, 65, 33, 49, 33, 65, 37, 38, + 33, 49, 33, 65, 33, 49, 33, 65, 33, 49, 33, 65, + 33, 49, 33, 65, 37, 38, 0, 11, 64, 37, 16, 0, + 14, 1, 49, 81, 81, 49, 81, 81, 49, 81, 85, 81, + 81, 49, 65, 17, 65, 49, 65, 17, 65, 49, 50, 18, + 49, 49, 34, 50, 37, 18, 81, 0, 12, 32, 19, 13, + 0, 12, 1, 193, 178, 178, 179, 146, 18, 114, 50, 82, + 82, 50, 114, 0, 10, 31, 18, 0, 14, 17, 66, 162, + 66, 162, 66, 162, 66, 163, 35, 146, 17, 36, 114, 36, + 34, 82, 66, 67, 34, 82, 242, 240, 17, 0, 12, 80, + 25, 13, 0, 10, 21, 99, 50, 82, 82, 50, 114, 34, + 114, 34, 114, 34, 114, 50, 82, 67, 51, 101, 0, 10, + 48, 21, 16, 0, 12, 27, 226, 210, 210, 210, 211, 179, + 18, 146, 67, 83, 115, 34, 177, 0, 12, 32, 29, 17, + 0, 12, 118, 21, 146, 81, 130, 82, 130, 66, 131, 65, + 130, 18, 35, 98, 52, 18, 66, 82, 66, 33, 82, 97, + 129, 0, 14, 20, 15, 0, 9, 102, 240, 240, 108, 210, + 194, 179, 178, 182, 100, 67, 51, 130, 0, 11, 64, 16, + 13, 0, 9, 107, 178, 178, 178, 178, 43, 178, 178, 178, + 178, 0, 10, 15, 13, 0, 11, 59, 34, 178, 178, 187, + 34, 178, 178, 187, 0, 10, 25, 14, 0, 10, 91, 66, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 66, 76, 0, 10, 96, 24, 14, 0, 9, 22, + 240, 240, 60, 240, 70, 113, 82, 81, 114, 65, 114, 65, + 114, 81, 82, 118, 0, 9, 48, 23, 7, 114, 82, 82, + 82, 82, 82, 82, 82, 82, 85, 34, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 192, 41, 9, 145, 81, 33, 81, + 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, + 33, 81, 39, 33, 81, 33, 81, 33, 81, 33, 81, 33, + 81, 33, 81, 33, 81, 33, 81, 33, 81, 129, 176, 23, + 7, 114, 82, 82, 82, 82, 82, 85, 34, 82, 82, 82, + 82, 85, 34, 82, 82, 82, 82, 82, 82, 192, 40, 9, + 145, 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, + 39, 33, 81, 33, 81, 33, 81, 33, 81, 39, 33, 81, + 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, + 129, 176, 23, 8, 194, 98, 98, 98, 98, 98, 98, 98, + 98, 38, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 160, 42, 11, 241, 49, 97, 49, 97, 49, 97, 49, 97, + 49, 97, 49, 97, 49, 97, 49, 37, 49, 97, 49, 97, + 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, + 49, 97, 49, 97, 49, 161, 208, 23, 8, 194, 98, 98, + 98, 98, 98, 38, 98, 98, 98, 98, 98, 38, 98, 98, + 98, 98, 98, 98, 98, 160, 42, 11, 241, 49, 97, 49, + 97, 49, 97, 49, 97, 49, 97, 49, 37, 49, 97, 49, + 97, 49, 97, 49, 97, 49, 97, 49, 37, 49, 97, 49, + 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, 161, 208, + 21, 21, 0, 22, 2, 240, 66, 240, 66, 240, 66, 240, + 66, 240, 66, 240, 66, 191, 4, 0, 16, 46, 21, 240, + 240, 82, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, + 240, 66, 240, 66, 162, 114, 162, 117, 114, 114, 162, 114, + 162, 114, 162, 81, 18, 93, 18, 240, 66, 240, 66, 240, + 66, 240, 66, 240, 66, 240, 176, 52, 20, 240, 240, 33, + 65, 225, 65, 225, 65, 225, 65, 225, 65, 225, 65, 225, + 65, 225, 65, 114, 81, 65, 114, 86, 114, 81, 65, 114, + 81, 65, 114, 81, 65, 114, 81, 65, 43, 17, 65, 225, + 65, 225, 65, 225, 65, 225, 65, 240, 65, 240, 112, 46, + 19, 240, 240, 66, 240, 34, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 34, 240, 34, 240, 34, 130, 114, 130, 114, + 130, 114, 130, 114, 130, 114, 130, 66, 18, 45, 34, 240, + 34, 240, 34, 240, 34, 240, 34, 240, 96, 22, 21, 0, + 21, 82, 82, 194, 82, 194, 82, 194, 82, 194, 82, 194, + 82, 194, 82, 127, 4, 0, 16, 26, 21, 0, 23, 95, + 4, 162, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, + 240, 66, 240, 66, 240, 66, 0, 9, 32, 45, 19, 240, + 240, 66, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 34, 240, 34, 241, 18, 45, 34, 130, 114, + 130, 114, 130, 114, 130, 39, 130, 114, 130, 114, 130, 114, + 130, 114, 240, 34, 240, 96, 55, 20, 240, 240, 49, 49, + 241, 49, 241, 49, 241, 49, 241, 49, 241, 49, 241, 49, + 241, 49, 241, 49, 241, 49, 44, 17, 49, 114, 97, 49, + 114, 97, 49, 114, 37, 49, 114, 97, 49, 114, 97, 49, + 114, 97, 49, 114, 97, 49, 114, 97, 49, 240, 65, 240, + 112, 45, 19, 240, 240, 66, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 241, 18, + 46, 18, 130, 114, 130, 114, 130, 114, 130, 114, 130, 114, + 130, 114, 130, 114, 130, 114, 240, 34, 240, 96, 27, 21, + 0, 23, 95, 4, 114, 82, 194, 82, 194, 82, 194, 82, + 194, 82, 194, 82, 194, 82, 194, 82, 194, 82, 0, 8, + 96, 9, 21, 0, 28, 127, 4, 0, 26, 64, 45, 19, + 240, 240, 66, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 241, 18, 46, 18, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 240, 34, 240, 96, 23, 4, 66, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 96, 4, 24, 0, 66, 24, 16, + 0, 14, 2, 82, 114, 82, 114, 82, 114, 82, 114, 82, + 114, 82, 114, 82, 114, 82, 126, 0, 12, 32, 24, 16, + 0, 14, 2, 87, 34, 82, 114, 82, 114, 82, 114, 82, + 114, 82, 114, 82, 114, 82, 126, 0, 12, 32, 30, 17, + 0, 14, 114, 130, 82, 130, 82, 130, 82, 130, 82, 115, + 82, 116, 66, 98, 33, 66, 97, 50, 54, 18, 66, 145, + 97, 0, 10, 112, 28, 15, 0, 13, 18, 113, 82, 113, + 82, 98, 82, 99, 66, 82, 17, 66, 82, 33, 50, 82, + 33, 50, 66, 49, 61, 0, 11, 64, 39, 20, 0, 17, + 68, 21, 65, 129, 81, 65, 129, 81, 65, 129, 81, 65, + 84, 81, 50, 81, 129, 49, 17, 65, 129, 49, 17, 65, + 129, 34, 18, 54, 49, 18, 50, 209, 0, 13, 64, 24, + 16, 0, 14, 6, 23, 113, 18, 193, 18, 193, 18, 118, + 18, 113, 98, 113, 98, 113, 98, 126, 0, 12, 32, 49, + 19, 0, 14, 36, 33, 33, 65, 113, 33, 33, 65, 113, + 33, 33, 65, 113, 33, 33, 65, 113, 36, 50, 68, 33, + 33, 51, 49, 81, 33, 49, 17, 49, 81, 33, 34, 18, + 33, 81, 33, 33, 49, 37, 20, 18, 49, 0, 14, 64, + 28, 15, 0, 13, 22, 49, 161, 49, 161, 50, 145, 35, + 70, 34, 17, 49, 98, 33, 49, 98, 33, 49, 98, 49, + 45, 0, 11, 64, 27, 16, 0, 14, 6, 23, 113, 241, + 241, 51, 70, 33, 49, 49, 113, 49, 49, 113, 49, 49, + 113, 49, 55, 35, 0, 12, 64, 39, 15, 0, 13, 21, + 33, 65, 33, 49, 33, 65, 33, 49, 33, 65, 33, 49, + 38, 33, 49, 33, 65, 33, 49, 33, 65, 33, 49, 33, + 65, 33, 49, 33, 65, 37, 38, 0, 11, 64, 36, 16, + 0, 14, 5, 66, 81, 49, 66, 81, 49, 66, 81, 49, + 66, 81, 49, 51, 81, 49, 51, 81, 49, 49, 18, 65, + 49, 34, 34, 53, 18, 66, 114, 0, 11, 16, 37, 15, + 0, 13, 21, 65, 81, 49, 65, 81, 49, 51, 65, 49, + 49, 17, 65, 49, 49, 18, 49, 49, 33, 34, 49, 49, + 33, 49, 49, 49, 33, 50, 37, 23, 0, 11, 64, 32, + 13, 0, 6, 75, 34, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 34, 114, 43, 240, 68, 130, 34, 113, 65, 113, + 65, 113, 50, 132, 240, 240, 224, 31, 14, 0, 12, 33, + 71, 33, 65, 81, 33, 65, 81, 38, 81, 33, 65, 81, + 33, 65, 81, 33, 65, 81, 33, 65, 81, 38, 81, 0, + 10, 96, 32, 16, 0, 14, 1, 65, 22, 49, 65, 18, + 113, 65, 18, 118, 18, 113, 65, 18, 113, 65, 18, 113, + 65, 18, 113, 65, 18, 118, 23, 0, 12, 32, 48, 18, + 0, 13, 65, 49, 65, 129, 49, 65, 21, 33, 49, 65, + 81, 33, 49, 65, 81, 37, 50, 81, 33, 49, 50, 81, + 33, 49, 49, 17, 65, 33, 49, 34, 17, 65, 33, 49, + 33, 34, 49, 37, 18, 50, 33, 0, 13, 96, 46, 20, + 0, 17, 65, 49, 49, 68, 49, 49, 49, 65, 97, 49, + 49, 65, 101, 49, 65, 97, 49, 34, 65, 97, 49, 33, + 17, 49, 97, 49, 33, 17, 49, 97, 49, 18, 18, 33, + 101, 17, 50, 21, 129, 0, 14, 16, 36, 17, 0, 12, + 97, 65, 177, 65, 23, 49, 65, 98, 49, 65, 82, 70, + 82, 65, 65, 66, 81, 65, 52, 65, 65, 34, 34, 49, + 65, 18, 66, 38, 17, 0, 13, 112, 32, 16, 0, 14, + 1, 65, 22, 49, 65, 18, 113, 65, 18, 118, 18, 113, + 65, 22, 49, 65, 18, 113, 65, 18, 113, 65, 18, 118, + 23, 0, 12, 32, 32, 13, 0, 6, 66, 114, 34, 114, + 34, 114, 43, 34, 114, 34, 114, 34, 114, 43, 240, 67, + 145, 49, 129, 49, 129, 49, 129, 49, 147, 240, 240, 240, + 45, 14, 0, 7, 1, 49, 33, 49, 33, 49, 33, 49, + 33, 49, 33, 49, 37, 37, 33, 49, 33, 49, 33, 49, + 33, 49, 33, 49, 33, 49, 37, 37, 240, 84, 146, 34, + 129, 65, 129, 65, 129, 50, 148, 0, 6, 29, 14, 0, + 12, 82, 22, 82, 97, 82, 97, 82, 97, 67, 97, 68, + 81, 50, 34, 65, 49, 50, 65, 34, 66, 49, 33, 0, + 10, 48, 29, 17, 0, 15, 34, 50, 162, 50, 162, 50, + 162, 50, 147, 50, 148, 34, 130, 33, 34, 129, 50, 18, + 114, 73, 33, 97, 0, 11, 96, 28, 17, 0, 15, 34, + 54, 98, 50, 162, 50, 162, 50, 147, 50, 148, 34, 130, + 33, 34, 129, 50, 18, 114, 73, 33, 0, 12, 80, 37, + 17, 0, 13, 34, 49, 65, 98, 49, 65, 98, 49, 65, + 98, 49, 65, 83, 54, 83, 49, 65, 81, 18, 33, 65, + 66, 33, 33, 65, 50, 50, 17, 65, 34, 88, 0, 13, + 33, 20, 0, 15, 66, 240, 50, 55, 130, 130, 130, 130, + 115, 114, 132, 98, 129, 18, 84, 98, 34, 50, 34, 66, + 66, 18, 66, 34, 97, 17, 0, 16, 16, 22, 11, 0, + 10, 17, 146, 145, 17, 114, 17, 113, 34, 82, 49, 81, + 66, 50, 81, 57, 0, 8, 64, 39, 16, 0, 14, 34, + 98, 81, 33, 65, 33, 49, 65, 33, 65, 33, 65, 33, + 65, 33, 65, 33, 65, 33, 65, 33, 65, 33, 65, 33, + 65, 49, 33, 65, 33, 82, 98, 0, 12, 64, 27, 11, + 0, 7, 50, 146, 117, 82, 50, 65, 82, 33, 113, 33, + 113, 33, 113, 33, 113, 49, 81, 66, 50, 99, 0, 7, + 64, 37, 17, 0, 13, 18, 242, 82, 101, 66, 97, 50, + 50, 81, 81, 50, 81, 81, 35, 81, 81, 36, 65, 81, + 18, 33, 81, 49, 33, 50, 83, 34, 66, 145, 97, 0, + 10, 112, 37, 17, 0, 13, 17, 240, 17, 113, 101, 66, + 97, 49, 66, 81, 81, 33, 18, 65, 81, 33, 18, 65, + 81, 33, 19, 49, 81, 17, 50, 65, 49, 33, 50, 83, + 55, 0, 13, 32, 15, 0, 7, 91, 72, 18, 98, 65, + 130, 65, 130, 65, 130, 65, 130, 65, 93, 240, 116, 162, + 34, 145, 65, 145, 65, 145, 50, 164, 0, 6, 48, 37, + 18, 0, 13, 101, 53, 240, 111, 1, 240, 116, 68, 82, + 33, 50, 33, 81, 65, 33, 65, 65, 65, 33, 65, 65, + 65, 33, 65, 66, 34, 34, 34, 84, 68, 0, 11, 96, + 24, 14, 0, 10, 76, 240, 240, 54, 114, 66, 81, 129, + 65, 129, 65, 129, 65, 114, 82, 66, 132, 0, 9, 64, + 50, 20, 240, 240, 50, 240, 50, 240, 50, 240, 50, 240, + 50, 240, 50, 240, 53, 242, 130, 50, 50, 130, 50, 50, + 130, 50, 50, 130, 50, 50, 130, 50, 50, 130, 50, 17, + 21, 47, 90, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 160, 66, 20, 240, 240, 34, 34, 226, 34, 226, 34, + 226, 34, 226, 34, 226, 34, 225, 18, 17, 82, 34, 49, + 18, 17, 82, 34, 50, 34, 82, 34, 50, 34, 82, 34, + 50, 34, 82, 34, 50, 34, 82, 34, 49, 18, 17, 82, + 34, 49, 18, 17, 43, 18, 34, 43, 18, 34, 226, 34, + 226, 34, 226, 34, 240, 50, 240, 112, 52, 19, 240, 240, + 66, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 98, 50, 66, 98, 50, 66, 98, 50, 66, + 98, 50, 66, 98, 50, 66, 98, 50, 33, 18, 46, 18, + 43, 66, 240, 34, 240, 34, 240, 34, 240, 34, 240, 96, + 54, 19, 241, 240, 50, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 240, 34, 240, 34, 240, 34, 45, 34, 43, + 66, 82, 34, 23, 82, 34, 98, 82, 34, 98, 82, 34, + 98, 82, 34, 23, 82, 34, 98, 82, 34, 98, 82, 34, + 98, 82, 34, 98, 240, 96, 62, 19, 240, 240, 81, 226, + 33, 226, 33, 226, 33, 226, 33, 226, 33, 226, 33, 226, + 33, 226, 33, 43, 18, 33, 42, 34, 33, 82, 34, 50, + 33, 82, 39, 33, 82, 34, 50, 33, 82, 34, 50, 33, + 82, 39, 33, 82, 34, 50, 33, 82, 34, 50, 33, 82, + 34, 50, 33, 82, 34, 113, 240, 96, 53, 19, 240, 240, + 66, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 240, 34, 46, 18, 43, 66, 98, 50, 66, + 98, 50, 66, 98, 50, 66, 98, 50, 66, 98, 50, 66, + 98, 50, 66, 98, 50, 66, 98, 50, 66, 240, 34, 240, + 96, 9, 4, 240, 240, 162, 34, 240, 240, 192, 25, 9, + 226, 114, 114, 114, 114, 114, 114, 114, 114, 34, 50, 34, + 50, 114, 114, 114, 114, 114, 114, 114, 114, 114, 176, + 0, // Padding + +}; + +tFont *g_psFontWHangulgothic22pt = (tFont *)g_pui8Hangulgothic22pt; diff --git a/third_party/fonts/ofl/fonts/fonthangulgothic22ptb.c b/third_party/fonts/ofl/fonts/fonthangulgothic22ptb.c new file mode 100644 index 0000000..3e649a5 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulgothic22ptb.c @@ -0,0 +1,824 @@ +//***************************************************************************** +// +// fonthangulgothic22ptb.c - Font definition for the 22ptpt Hangulgothic bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulgothic +// Size: 22pt +// Bold: yes +// Italic: no +// Memory usage: 6032 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulgothic22ptb[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 21, + + // + // The height of the font. + // + 21, + + // + // The baseline of the font. + // + 17, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x5c, 0x0b, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x94, 0x01, 0x00, 0x00, // Offset 404 (0x194) + 0xa3, 0x01, 0x00, 0x00, // Offset 419 (0x1a3) + 0xc5, 0x01, 0x00, 0x00, // Offset 453 (0x1c5) + 0xe3, 0x01, 0x00, 0x00, // Offset 483 (0x1e3) + 0x14, 0x02, 0x00, 0x00, // Offset 532 (0x214) + 0x39, 0x02, 0x00, 0x00, // Offset 569 (0x239) + 0x43, 0x02, 0x00, 0x00, // Offset 579 (0x243) + 0x5b, 0x02, 0x00, 0x00, // Offset 603 (0x25b) + 0x73, 0x02, 0x00, 0x00, // Offset 627 (0x273) + 0x86, 0x02, 0x00, 0x00, // Offset 646 (0x286) + 0x98, 0x02, 0x00, 0x00, // Offset 664 (0x298) + 0xa1, 0x02, 0x00, 0x00, // Offset 673 (0x2a1) + 0xaa, 0x02, 0x00, 0x00, // Offset 682 (0x2aa) + 0xb2, 0x02, 0x00, 0x00, // Offset 690 (0x2b2) + 0xc9, 0x02, 0x00, 0x00, // Offset 713 (0x2c9) + 0xeb, 0x02, 0x00, 0x00, // Offset 747 (0x2eb) + 0x01, 0x03, 0x00, 0x00, // Offset 769 (0x301) + 0x18, 0x03, 0x00, 0x00, // Offset 792 (0x318) + 0x2f, 0x03, 0x00, 0x00, // Offset 815 (0x32f) + 0x4c, 0x03, 0x00, 0x00, // Offset 844 (0x34c) + 0x64, 0x03, 0x00, 0x00, // Offset 868 (0x364) + 0x82, 0x03, 0x00, 0x00, // Offset 898 (0x382) + 0x98, 0x03, 0x00, 0x00, // Offset 920 (0x398) + 0xb8, 0x03, 0x00, 0x00, // Offset 952 (0x3b8) + 0xd5, 0x03, 0x00, 0x00, // Offset 981 (0x3d5) + 0xe2, 0x03, 0x00, 0x00, // Offset 994 (0x3e2) + 0xf0, 0x03, 0x00, 0x00, // Offset 1008 (0x3f0) + 0x08, 0x04, 0x00, 0x00, // Offset 1032 (0x408) + 0x15, 0x04, 0x00, 0x00, // Offset 1045 (0x415) + 0x2c, 0x04, 0x00, 0x00, // Offset 1068 (0x42c) + 0x43, 0x04, 0x00, 0x00, // Offset 1091 (0x443) + 0x71, 0x04, 0x00, 0x00, // Offset 1137 (0x471) + 0x91, 0x04, 0x00, 0x00, // Offset 1169 (0x491) + 0xb1, 0x04, 0x00, 0x00, // Offset 1201 (0x4b1) + 0xc8, 0x04, 0x00, 0x00, // Offset 1224 (0x4c8) + 0xea, 0x04, 0x00, 0x00, // Offset 1258 (0x4ea) + 0x00, 0x05, 0x00, 0x00, // Offset 1280 (0x500) + 0x16, 0x05, 0x00, 0x00, // Offset 1302 (0x516) + 0x35, 0x05, 0x00, 0x00, // Offset 1333 (0x535) + 0x59, 0x05, 0x00, 0x00, // Offset 1369 (0x559) + 0x6c, 0x05, 0x00, 0x00, // Offset 1388 (0x56c) + 0x81, 0x05, 0x00, 0x00, // Offset 1409 (0x581) + 0xa4, 0x05, 0x00, 0x00, // Offset 1444 (0x5a4) + 0xba, 0x05, 0x00, 0x00, // Offset 1466 (0x5ba) + 0xf4, 0x05, 0x00, 0x00, // Offset 1524 (0x5f4) + 0x20, 0x06, 0x00, 0x00, // Offset 1568 (0x620) + 0x43, 0x06, 0x00, 0x00, // Offset 1603 (0x643) + 0x5e, 0x06, 0x00, 0x00, // Offset 1630 (0x65e) + 0x82, 0x06, 0x00, 0x00, // Offset 1666 (0x682) + 0xa4, 0x06, 0x00, 0x00, // Offset 1700 (0x6a4) + 0xbb, 0x06, 0x00, 0x00, // Offset 1723 (0x6bb) + 0xd1, 0x06, 0x00, 0x00, // Offset 1745 (0x6d1) + 0xf5, 0x06, 0x00, 0x00, // Offset 1781 (0x6f5) + 0x18, 0x07, 0x00, 0x00, // Offset 1816 (0x718) + 0x52, 0x07, 0x00, 0x00, // Offset 1874 (0x752) + 0x74, 0x07, 0x00, 0x00, // Offset 1908 (0x774) + 0x90, 0x07, 0x00, 0x00, // Offset 1936 (0x790) + 0xa6, 0x07, 0x00, 0x00, // Offset 1958 (0x7a6) + 0xbe, 0x07, 0x00, 0x00, // Offset 1982 (0x7be) + 0xf0, 0x07, 0x00, 0x00, // Offset 2032 (0x7f0) + 0x08, 0x08, 0x00, 0x00, // Offset 2056 (0x808) + 0x1f, 0x08, 0x00, 0x00, // Offset 2079 (0x81f) + 0x26, 0x08, 0x00, 0x00, // Offset 2086 (0x826) + 0x2f, 0x08, 0x00, 0x00, // Offset 2095 (0x82f) + 0x48, 0x08, 0x00, 0x00, // Offset 2120 (0x848) + 0x68, 0x08, 0x00, 0x00, // Offset 2152 (0x868) + 0x7b, 0x08, 0x00, 0x00, // Offset 2171 (0x87b) + 0x9c, 0x08, 0x00, 0x00, // Offset 2204 (0x89c) + 0xb3, 0x08, 0x00, 0x00, // Offset 2227 (0x8b3) + 0xc9, 0x08, 0x00, 0x00, // Offset 2249 (0x8c9) + 0xe7, 0x08, 0x00, 0x00, // Offset 2279 (0x8e7) + 0x08, 0x09, 0x00, 0x00, // Offset 2312 (0x908) + 0x1b, 0x09, 0x00, 0x00, // Offset 2331 (0x91b) + 0x31, 0x09, 0x00, 0x00, // Offset 2353 (0x931) + 0x50, 0x09, 0x00, 0x00, // Offset 2384 (0x950) + 0x64, 0x09, 0x00, 0x00, // Offset 2404 (0x964) + 0x8d, 0x09, 0x00, 0x00, // Offset 2445 (0x98d) + 0xab, 0x09, 0x00, 0x00, // Offset 2475 (0x9ab) + 0xc6, 0x09, 0x00, 0x00, // Offset 2502 (0x9c6) + 0xe4, 0x09, 0x00, 0x00, // Offset 2532 (0x9e4) + 0x02, 0x0a, 0x00, 0x00, // Offset 2562 (0xa02) + 0x15, 0x0a, 0x00, 0x00, // Offset 2581 (0xa15) + 0x28, 0x0a, 0x00, 0x00, // Offset 2600 (0xa28) + 0x3d, 0x0a, 0x00, 0x00, // Offset 2621 (0xa3d) + 0x5b, 0x0a, 0x00, 0x00, // Offset 2651 (0xa5b) + 0x76, 0x0a, 0x00, 0x00, // Offset 2678 (0xa76) + 0xa1, 0x0a, 0x00, 0x00, // Offset 2721 (0xaa1) + 0xbc, 0x0a, 0x00, 0x00, // Offset 2748 (0xabc) + 0xd6, 0x0a, 0x00, 0x00, // Offset 2774 (0xad6) + 0xe9, 0x0a, 0x00, 0x00, // Offset 2793 (0xae9) + 0x01, 0x0b, 0x00, 0x00, // Offset 2817 (0xb01) + 0x17, 0x0b, 0x00, 0x00, // Offset 2839 (0xb17) + 0x2f, 0x0b, 0x00, 0x00, // Offset 2863 (0xb2f) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 9, 0, 23, 80, 19, 5, 178, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 115, 35, 35, 240, 32, + 15, 7, 226, 18, 34, 18, 34, 18, 34, 18, 34, 18, + 0, 12, 64, 34, 14, 240, 240, 34, 34, 130, 34, 130, + 34, 130, 34, 130, 19, 91, 59, 82, 34, 130, 34, 91, + 59, 98, 19, 115, 19, 114, 34, 130, 34, 130, 34, 0, + 6, 30, 11, 66, 146, 134, 56, 38, 82, 34, 82, 34, + 83, 18, 101, 116, 148, 116, 114, 18, 98, 18, 98, 18, + 101, 40, 70, 130, 146, 240, 16, 49, 21, 240, 240, 228, + 115, 102, 98, 99, 35, 67, 98, 66, 51, 114, 66, 50, + 131, 35, 35, 150, 50, 180, 51, 20, 195, 22, 178, 19, + 35, 147, 18, 66, 131, 34, 66, 130, 50, 66, 115, 51, + 35, 114, 86, 115, 100, 0, 8, 48, 37, 16, 240, 240, + 100, 182, 147, 50, 130, 66, 130, 66, 131, 19, 165, 165, + 66, 67, 19, 50, 51, 51, 34, 50, 86, 50, 100, 66, + 100, 67, 69, 92, 101, 51, 0, 6, 32, 10, 4, 130, + 34, 34, 34, 34, 0, 7, 32, 24, 7, 50, 67, 66, + 67, 66, 82, 67, 66, 82, 82, 82, 82, 82, 82, 82, + 98, 82, 83, 82, 83, 82, 32, 24, 7, 2, 83, 82, + 83, 82, 82, 83, 82, 82, 82, 82, 82, 82, 82, 67, + 66, 82, 67, 66, 67, 66, 80, 19, 10, 0, 7, 114, + 130, 82, 18, 18, 40, 54, 84, 83, 18, 66, 34, 0, + 9, 16, 18, 14, 0, 9, 50, 194, 194, 194, 124, 44, + 114, 194, 194, 194, 194, 0, 9, 80, 9, 6, 0, 12, + 115, 51, 50, 51, 48, 9, 8, 0, 9, 6, 38, 0, + 10, 32, 8, 5, 0, 10, 3, 35, 35, 192, 23, 10, + 240, 178, 115, 115, 114, 115, 115, 114, 115, 115, 114, 115, + 115, 114, 115, 115, 114, 115, 115, 240, 32, 34, 13, 240, + 229, 119, 83, 51, 66, 82, 50, 114, 34, 114, 34, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 50, 82, + 67, 51, 87, 117, 240, 240, 224, 22, 7, 240, 34, 67, + 52, 37, 49, 18, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 240, 128, 23, 12, 240, 197, 88, 66, 67, + 162, 162, 162, 147, 131, 131, 147, 131, 131, 131, 131, 138, + 42, 240, 240, 128, 23, 12, 240, 182, 88, 65, 83, 162, + 162, 131, 86, 102, 163, 178, 162, 162, 162, 146, 57, 70, + 240, 240, 176, 29, 14, 240, 240, 83, 164, 164, 149, 131, + 18, 115, 34, 115, 34, 99, 50, 83, 66, 67, 82, 76, + 44, 162, 194, 194, 194, 0, 5, 96, 24, 12, 240, 153, + 57, 50, 162, 162, 162, 167, 89, 49, 98, 178, 162, 162, + 162, 33, 83, 56, 71, 240, 240, 176, 30, 13, 240, 246, + 103, 83, 146, 178, 162, 21, 89, 68, 66, 50, 114, 34, + 114, 34, 114, 34, 114, 50, 83, 51, 51, 87, 117, 240, + 240, 224, 22, 12, 240, 154, 42, 147, 146, 147, 146, 147, + 147, 131, 147, 146, 147, 146, 147, 147, 131, 240, 240, 224, + 32, 13, 240, 229, 119, 83, 51, 66, 82, 66, 82, 67, + 51, 83, 19, 117, 119, 83, 51, 50, 99, 34, 114, 34, + 114, 35, 83, 57, 101, 240, 240, 224, 29, 13, 240, 229, + 104, 83, 51, 50, 98, 50, 114, 34, 114, 34, 114, 50, + 83, 58, 85, 18, 178, 162, 178, 147, 87, 102, 240, 240, + 240, 13, 5, 240, 83, 35, 35, 240, 240, 115, 35, 35, + 240, 112, 14, 6, 240, 67, 51, 51, 0, 6, 51, 51, + 50, 51, 240, 96, 24, 12, 240, 82, 147, 131, 131, 131, + 131, 131, 131, 131, 147, 147, 163, 163, 163, 163, 163, 163, + 163, 162, 177, 32, 13, 14, 0, 10, 76, 44, 240, 240, + 236, 44, 0, 14, 32, 23, 12, 193, 178, 163, 163, 163, + 163, 163, 163, 163, 163, 131, 132, 116, 116, 116, 116, 116, + 131, 146, 161, 176, 23, 10, 240, 86, 71, 49, 67, 130, + 130, 130, 114, 115, 114, 114, 130, 130, 240, 35, 115, 115, + 240, 240, 80, 46, 19, 240, 240, 230, 171, 116, 84, 83, + 52, 35, 66, 59, 35, 35, 36, 18, 34, 35, 51, 34, + 34, 34, 67, 34, 34, 34, 66, 35, 34, 34, 51, 34, + 51, 27, 82, 36, 20, 99, 147, 84, 99, 123, 182, 0, + 8, 32, 18, 240, 240, 211, 228, 228, 214, 195, 18, 179, + 35, 163, 35, 162, 66, 147, 67, 131, 82, 124, 108, 98, + 131, 67, 131, 66, 162, 51, 163, 0, 7, 32, 12, 240, + 151, 88, 66, 67, 50, 82, 50, 82, 50, 82, 50, 67, + 56, 73, 50, 68, 34, 98, 34, 98, 34, 98, 34, 83, + 41, 55, 240, 240, 176, 23, 14, 240, 240, 55, 89, 67, + 163, 178, 178, 194, 194, 194, 194, 194, 210, 195, 195, 201, + 119, 240, 240, 224, 34, 14, 240, 215, 121, 82, 83, 66, + 99, 50, 114, 50, 130, 34, 130, 34, 130, 34, 130, 34, + 130, 34, 115, 34, 114, 50, 99, 50, 68, 73, 87, 0, + 6, 16, 22, 11, 240, 121, 41, 34, 146, 146, 146, 146, + 153, 41, 34, 146, 146, 146, 146, 153, 41, 240, 240, 80, + 22, 11, 240, 121, 41, 34, 146, 146, 146, 146, 152, 56, + 50, 146, 146, 146, 146, 146, 146, 240, 240, 192, 31, 16, + 240, 240, 119, 121, 99, 97, 83, 210, 210, 226, 226, 87, + 34, 87, 34, 162, 34, 162, 50, 146, 51, 130, 68, 98, + 91, 120, 0, 6, 48, 36, 14, 240, 210, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 44, 44, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 240, 240, 224, 19, 4, 130, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 224, + 21, 7, 240, 34, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 36, 52, 240, 144, 35, 13, 240, + 178, 83, 50, 83, 50, 67, 66, 51, 82, 35, 98, 19, + 117, 133, 134, 115, 19, 98, 50, 98, 51, 82, 67, 66, + 83, 50, 83, 50, 99, 240, 240, 176, 22, 11, 240, 114, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 153, 41, 240, 240, 80, 58, 19, 240, 240, 131, 179, + 36, 148, 36, 148, 37, 117, 37, 117, 34, 19, 83, 18, + 34, 19, 83, 18, 34, 19, 83, 18, 34, 35, 51, 34, + 34, 35, 51, 34, 34, 51, 19, 50, 34, 51, 19, 50, + 34, 66, 18, 66, 34, 69, 66, 34, 83, 82, 34, 83, + 82, 0, 7, 48, 44, 14, 240, 211, 114, 36, 98, 36, + 98, 37, 82, 38, 66, 34, 19, 66, 34, 20, 50, 34, + 35, 50, 34, 51, 34, 34, 52, 18, 34, 67, 18, 34, + 70, 34, 85, 34, 100, 34, 100, 34, 115, 240, 240, 224, + 35, 16, 240, 240, 102, 152, 115, 67, 83, 99, 66, 130, + 50, 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, + 50, 130, 66, 115, 83, 67, 106, 134, 0, 6, 96, 27, + 12, 240, 151, 89, 50, 83, 34, 98, 34, 98, 34, 98, + 34, 83, 41, 55, 82, 162, 162, 162, 162, 162, 162, 0, + 5, 96, 36, 16, 240, 240, 102, 152, 115, 67, 83, 99, + 66, 130, 50, 162, 34, 162, 34, 162, 34, 162, 34, 162, + 34, 162, 50, 130, 66, 115, 83, 67, 121, 135, 227, 227, + 227, 32, 34, 13, 240, 183, 105, 66, 83, 50, 98, 50, + 98, 50, 98, 50, 83, 57, 72, 82, 51, 82, 67, 66, + 67, 66, 83, 50, 98, 50, 99, 34, 114, 240, 240, 176, + 23, 11, 240, 150, 71, 51, 130, 146, 147, 147, 148, 147, + 147, 162, 146, 146, 33, 83, 40, 70, 240, 240, 112, 22, + 14, 240, 220, 44, 114, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 0, 6, 16, 36, 14, 240, + 210, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 35, 99, 51, 67, 88, 118, 0, 5, 112, 35, 17, 240, + 240, 67, 147, 50, 146, 67, 115, 67, 114, 98, 99, 99, + 83, 99, 82, 130, 67, 131, 51, 146, 50, 163, 19, 163, + 18, 197, 197, 211, 227, 0, 7, 48, 58, 24, 0, 6, + 3, 115, 114, 50, 115, 114, 50, 100, 99, 51, 85, 82, + 82, 82, 18, 82, 82, 67, 18, 67, 83, 51, 19, 51, + 83, 50, 35, 50, 114, 35, 50, 35, 115, 19, 50, 35, + 115, 18, 67, 18, 146, 18, 85, 149, 85, 148, 100, 179, + 115, 179, 115, 0, 9, 96, 34, 15, 240, 243, 115, 51, + 83, 67, 82, 99, 51, 115, 19, 131, 18, 165, 179, 180, + 181, 147, 19, 115, 50, 115, 51, 83, 83, 51, 115, 34, + 131, 0, 5, 112, 28, 16, 240, 240, 35, 131, 51, 99, + 82, 98, 99, 67, 115, 35, 146, 35, 150, 180, 196, 210, + 226, 226, 226, 226, 226, 226, 0, 7, 22, 13, 240, 187, + 43, 148, 147, 147, 163, 147, 147, 163, 147, 147, 163, 147, + 148, 155, 43, 240, 240, 176, 24, 7, 5, 37, 34, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 85, 37, 32, 50, 21, 240, 240, 210, 97, + 98, 67, 67, 67, 82, 67, 66, 98, 67, 66, 98, 53, + 50, 99, 34, 18, 35, 79, 4, 47, 4, 82, 19, 19, + 18, 130, 18, 50, 18, 133, 53, 148, 52, 164, 52, 163, + 83, 163, 83, 178, 83, 0, 8, 80, 24, 6, 4, 36, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 36, 36, 32, 23, 14, 240, 240, + 50, 180, 165, 131, 18, 130, 35, 99, 50, 98, 67, 67, + 82, 66, 99, 35, 114, 0, 16, 7, 14, 0, 33, 44, + 44, 32, 9, 7, 227, 83, 83, 82, 0, 13, 48, 25, + 11, 0, 8, 69, 87, 65, 67, 146, 86, 56, 35, 66, + 34, 82, 34, 82, 34, 67, 56, 68, 18, 240, 240, 80, + 32, 12, 194, 162, 162, 162, 162, 162, 20, 89, 51, 66, + 50, 83, 34, 98, 34, 98, 34, 98, 34, 98, 35, 67, + 35, 66, 57, 50, 20, 240, 240, 176, 19, 11, 0, 8, + 86, 70, 67, 115, 130, 146, 146, 146, 147, 147, 135, 102, + 240, 240, 80, 33, 12, 240, 82, 162, 162, 162, 162, 84, + 18, 57, 50, 67, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 83, 50, 67, 57, 84, 18, 240, 240, 128, + 23, 12, 0, 9, 52, 119, 67, 35, 51, 67, 35, 67, + 42, 42, 35, 147, 163, 65, 72, 102, 240, 240, 144, 22, + 9, 196, 69, 66, 114, 114, 87, 39, 66, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 240, 240, 32, 30, 12, 0, + 9, 52, 18, 57, 50, 67, 35, 67, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 83, 50, 67, 72, 84, 18, 146, + 72, 70, 80, 33, 11, 178, 146, 146, 146, 146, 146, 20, + 72, 51, 51, 34, 82, 34, 82, 34, 82, 34, 82, 34, + 82, 34, 82, 34, 82, 34, 82, 34, 82, 240, 240, 80, + 19, 5, 83, 35, 35, 194, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 240, 48, 22, 7, 147, 67, 67, + 240, 50, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 52, 51, 64, 31, 11, 178, 146, 146, 146, 146, + 146, 67, 34, 51, 50, 35, 66, 19, 85, 101, 102, 82, + 34, 82, 35, 66, 51, 50, 66, 50, 67, 240, 240, 80, + 20, 4, 66, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 224, 41, 18, 0, 13, + 66, 20, 52, 72, 22, 51, 52, 51, 34, 82, 82, 34, + 82, 82, 34, 82, 82, 34, 82, 82, 34, 82, 82, 34, + 82, 82, 34, 82, 82, 34, 82, 82, 34, 82, 82, 0, + 7, 30, 11, 0, 8, 34, 20, 72, 51, 51, 34, 82, + 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 82, 34, 82, 240, 240, 80, 27, 13, 0, 10, 21, + 119, 83, 51, 51, 83, 34, 114, 34, 114, 34, 114, 34, + 114, 35, 83, 51, 51, 87, 117, 240, 240, 224, 30, 12, + 0, 9, 2, 20, 89, 51, 66, 51, 67, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 83, 35, 66, 57, 50, 20, + 82, 162, 162, 160, 30, 12, 0, 9, 52, 18, 57, 50, + 67, 34, 83, 34, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 50, 67, 57, 84, 18, 162, 162, 162, 32, 19, 8, + 0, 6, 2, 19, 38, 36, 67, 82, 98, 98, 98, 98, + 98, 98, 98, 240, 240, 19, 9, 0, 6, 117, 55, 34, + 114, 115, 116, 115, 115, 114, 114, 39, 37, 240, 240, 16, + 21, 9, 240, 82, 114, 114, 114, 87, 39, 66, 114, 114, + 114, 114, 114, 114, 114, 117, 84, 240, 224, 30, 11, 0, + 8, 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, 34, + 82, 34, 82, 34, 82, 34, 82, 35, 51, 56, 68, 18, + 240, 240, 80, 27, 13, 0, 9, 99, 83, 50, 82, 66, + 67, 67, 51, 82, 50, 98, 35, 99, 18, 130, 18, 133, + 132, 163, 163, 240, 240, 240, 43, 21, 0, 15, 99, 83, + 83, 50, 83, 82, 66, 68, 67, 67, 53, 51, 82, 50, + 18, 50, 98, 35, 18, 35, 99, 18, 35, 18, 130, 18, + 50, 18, 133, 53, 132, 68, 163, 83, 163, 83, 0, 8, + 80, 27, 13, 0, 9, 115, 66, 67, 51, 83, 19, 114, + 18, 133, 147, 163, 149, 115, 19, 98, 50, 83, 51, 51, + 83, 240, 240, 176, 26, 12, 0, 9, 3, 82, 50, 67, + 51, 50, 67, 35, 82, 35, 83, 18, 117, 117, 116, 147, + 146, 162, 147, 116, 131, 128, 19, 11, 0, 8, 41, 41, + 116, 115, 115, 115, 130, 131, 115, 115, 137, 41, 240, 240, + 80, 24, 8, 51, 68, 66, 98, 98, 98, 98, 98, 98, + 83, 67, 99, 98, 98, 98, 98, 98, 98, 98, 100, 83, + 32, 22, 4, 66, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 96, 24, + 8, 3, 84, 98, 98, 98, 98, 98, 98, 98, 99, 99, + 67, 82, 98, 98, 98, 98, 98, 98, 68, 67, 80, 11, + 13, 0, 14, 101, 50, 43, 34, 53, 0, 15, + 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x90, 0x01, 0x00, 0x00, // Offset 400 (0x190) + 0xa9, 0x01, 0x00, 0x00, // Offset 425 (0x1a9) + 0xc2, 0x01, 0x00, 0x00, // Offset 450 (0x1c2) + 0xd1, 0x01, 0x00, 0x00, // Offset 465 (0x1d1) + 0xe9, 0x01, 0x00, 0x00, // Offset 489 (0x1e9) + 0x04, 0x02, 0x00, 0x00, // Offset 516 (0x204) + 0x14, 0x02, 0x00, 0x00, // Offset 532 (0x214) + 0x2c, 0x02, 0x00, 0x00, // Offset 556 (0x22c) + 0x3d, 0x02, 0x00, 0x00, // Offset 573 (0x23d) + 0x56, 0x02, 0x00, 0x00, // Offset 598 (0x256) + 0x74, 0x02, 0x00, 0x00, // Offset 628 (0x274) + 0x92, 0x02, 0x00, 0x00, // Offset 658 (0x292) + 0xad, 0x02, 0x00, 0x00, // Offset 685 (0x2ad) + 0xc5, 0x02, 0x00, 0x00, // Offset 709 (0x2c5) + 0xe3, 0x02, 0x00, 0x00, // Offset 739 (0x2e3) + 0xff, 0x02, 0x00, 0x00, // Offset 767 (0x2ff) + 0x12, 0x03, 0x00, 0x00, // Offset 786 (0x312) + 0x27, 0x03, 0x00, 0x00, // Offset 807 (0x327) + 0x4a, 0x03, 0x00, 0x00, // Offset 842 (0x34a) + 0x6b, 0x03, 0x00, 0x00, // Offset 875 (0x36b) + 0x80, 0x03, 0x00, 0x00, // Offset 896 (0x380) + 0x9a, 0x03, 0x00, 0x00, // Offset 922 (0x39a) + 0xaf, 0x03, 0x00, 0x00, // Offset 943 (0x3af) + 0xc0, 0x03, 0x00, 0x00, // Offset 960 (0x3c0) + 0xd9, 0x03, 0x00, 0x00, // Offset 985 (0x3d9) + 0xec, 0x03, 0x00, 0x00, // Offset 1004 (0x3ec) + 0xfc, 0x03, 0x00, 0x00, // Offset 1020 (0x3fc) + 0x0c, 0x04, 0x00, 0x00, // Offset 1036 (0x40c) + 0x21, 0x04, 0x00, 0x00, // Offset 1057 (0x421) + 0x37, 0x04, 0x00, 0x00, // Offset 1079 (0x437) + 0x4f, 0x04, 0x00, 0x00, // Offset 1103 (0x44f) + 0x79, 0x04, 0x00, 0x00, // Offset 1145 (0x479) + 0x91, 0x04, 0x00, 0x00, // Offset 1169 (0x491) + 0xb9, 0x04, 0x00, 0x00, // Offset 1209 (0x4b9) + 0xd1, 0x04, 0x00, 0x00, // Offset 1233 (0x4d1) + 0xfd, 0x04, 0x00, 0x00, // Offset 1277 (0x4fd) + 0x15, 0x05, 0x00, 0x00, // Offset 1301 (0x515) + 0x41, 0x05, 0x00, 0x00, // Offset 1345 (0x541) + 0x57, 0x05, 0x00, 0x00, // Offset 1367 (0x557) + 0x83, 0x05, 0x00, 0x00, // Offset 1411 (0x583) + 0xb5, 0x05, 0x00, 0x00, // Offset 1461 (0x5b5) + 0xe1, 0x05, 0x00, 0x00, // Offset 1505 (0x5e1) + 0xf5, 0x05, 0x00, 0x00, // Offset 1525 (0x5f5) + 0x0f, 0x06, 0x00, 0x00, // Offset 1551 (0x60f) + 0x3c, 0x06, 0x00, 0x00, // Offset 1596 (0x63c) + 0x72, 0x06, 0x00, 0x00, // Offset 1650 (0x672) + 0x9e, 0x06, 0x00, 0x00, // Offset 1694 (0x69e) + 0xb9, 0x06, 0x00, 0x00, // Offset 1721 (0x6b9) + 0xc3, 0x06, 0x00, 0x00, // Offset 1731 (0x6c3) + 0xef, 0x06, 0x00, 0x00, // Offset 1775 (0x6ef) + 0x07, 0x07, 0x00, 0x00, // Offset 1799 (0x707) + 0x0b, 0x07, 0x00, 0x00, // Offset 1803 (0x70b) + 0x22, 0x07, 0x00, 0x00, // Offset 1826 (0x722) + 0x39, 0x07, 0x00, 0x00, // Offset 1849 (0x739) + 0x52, 0x07, 0x00, 0x00, // Offset 1874 (0x752) + 0x6c, 0x07, 0x00, 0x00, // Offset 1900 (0x76c) + 0x8e, 0x07, 0x00, 0x00, // Offset 1934 (0x78e) + 0xa5, 0x07, 0x00, 0x00, // Offset 1957 (0x7a5) + 0xca, 0x07, 0x00, 0x00, // Offset 1994 (0x7ca) + 0xe4, 0x07, 0x00, 0x00, // Offset 2020 (0x7e4) + 0xff, 0x07, 0x00, 0x00, // Offset 2047 (0x7ff) + 0x1e, 0x08, 0x00, 0x00, // Offset 2078 (0x81e) + 0x3b, 0x08, 0x00, 0x00, // Offset 2107 (0x83b) + 0x57, 0x08, 0x00, 0x00, // Offset 2135 (0x857) + 0x72, 0x08, 0x00, 0x00, // Offset 2162 (0x872) + 0x90, 0x08, 0x00, 0x00, // Offset 2192 (0x890) + 0xad, 0x08, 0x00, 0x00, // Offset 2221 (0x8ad) + 0xd3, 0x08, 0x00, 0x00, // Offset 2259 (0x8d3) + 0xf7, 0x08, 0x00, 0x00, // Offset 2295 (0x8f7) + 0x13, 0x09, 0x00, 0x00, // Offset 2323 (0x913) + 0x30, 0x09, 0x00, 0x00, // Offset 2352 (0x930) + 0x4d, 0x09, 0x00, 0x00, // Offset 2381 (0x94d) + 0x76, 0x09, 0x00, 0x00, // Offset 2422 (0x976) + 0x91, 0x09, 0x00, 0x00, // Offset 2449 (0x991) + 0xab, 0x09, 0x00, 0x00, // Offset 2475 (0x9ab) + 0xc6, 0x09, 0x00, 0x00, // Offset 2502 (0x9c6) + 0xe2, 0x09, 0x00, 0x00, // Offset 2530 (0x9e2) + 0xfb, 0x09, 0x00, 0x00, // Offset 2555 (0x9fb) + 0x0f, 0x0a, 0x00, 0x00, // Offset 2575 (0xa0f) + 0x2d, 0x0a, 0x00, 0x00, // Offset 2605 (0xa2d) + 0x44, 0x0a, 0x00, 0x00, // Offset 2628 (0xa44) + 0x66, 0x0a, 0x00, 0x00, // Offset 2662 (0xa66) + 0x88, 0x0a, 0x00, 0x00, // Offset 2696 (0xa88) + 0xa4, 0x0a, 0x00, 0x00, // Offset 2724 (0xaa4) + 0xc4, 0x0a, 0x00, 0x00, // Offset 2756 (0xac4) + 0xd8, 0x0a, 0x00, 0x00, // Offset 2776 (0xad8) + 0x0a, 0x0b, 0x00, 0x00, // Offset 2826 (0xb0a) + 0x3d, 0x0b, 0x00, 0x00, // Offset 2877 (0xb3d) + 0x6f, 0x0b, 0x00, 0x00, // Offset 2927 (0xb6f) + 0xa2, 0x0b, 0x00, 0x00, // Offset 2978 (0xba2) + 0xdf, 0x0b, 0x00, 0x00, // Offset 3039 (0xbdf) + 0x12, 0x0c, 0x00, 0x00, // Offset 3090 (0xc12) + 0x1b, 0x0c, 0x00, 0x00, // Offset 3099 (0xc1b) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 16, 15, 0, 11, 45, 45, 195, 195, 195, 195, 195, 195, + 195, 0, 11, 64, 25, 16, 0, 12, 7, 22, 39, 22, + 114, 82, 114, 82, 114, 82, 114, 82, 114, 82, 114, 82, + 114, 82, 0, 12, 32, 25, 19, 0, 14, 39, 82, 87, + 82, 162, 82, 162, 68, 146, 53, 146, 39, 130, 20, 35, + 114, 19, 66, 0, 16, 112, 15, 15, 0, 11, 35, 195, + 195, 195, 195, 195, 205, 45, 0, 13, 48, 24, 17, 0, + 13, 87, 50, 87, 50, 147, 50, 131, 66, 131, 66, 116, + 66, 102, 58, 35, 38, 18, 66, 0, 13, 27, 17, 0, + 11, 85, 197, 66, 242, 73, 34, 73, 34, 101, 66, 82, + 50, 50, 82, 50, 54, 18, 50, 54, 52, 0, 13, 32, + 16, 15, 0, 11, 44, 60, 51, 195, 195, 195, 195, 205, + 45, 0, 11, 64, 24, 17, 0, 12, 102, 39, 38, 39, + 34, 98, 114, 98, 114, 98, 114, 98, 114, 98, 118, 39, + 39, 23, 0, 13, 17, 15, 0, 11, 44, 60, 195, 195, + 60, 60, 51, 195, 205, 45, 0, 9, 80, 25, 16, 0, + 12, 6, 38, 38, 38, 98, 98, 38, 98, 38, 98, 34, + 162, 34, 162, 39, 82, 39, 82, 0, 12, 32, 30, 16, + 0, 12, 6, 38, 38, 38, 98, 34, 34, 38, 34, 34, + 38, 34, 34, 34, 98, 34, 34, 98, 34, 39, 22, 39, + 22, 0, 12, 32, 30, 16, 0, 12, 6, 34, 34, 38, + 34, 34, 98, 34, 34, 38, 38, 38, 38, 34, 98, 34, + 34, 98, 34, 39, 22, 39, 22, 0, 12, 32, 27, 18, + 0, 13, 70, 82, 86, 82, 146, 82, 146, 82, 86, 68, + 70, 68, 66, 118, 55, 19, 35, 39, 18, 66, 0, 13, + 96, 24, 17, 0, 12, 102, 38, 54, 38, 114, 34, 118, + 38, 54, 38, 50, 98, 114, 98, 119, 23, 39, 23, 0, + 13, 30, 18, 0, 13, 71, 24, 39, 24, 114, 34, 34, + 55, 34, 34, 55, 34, 34, 50, 114, 34, 50, 114, 34, + 55, 24, 39, 24, 0, 13, 96, 28, 18, 0, 12, 53, + 70, 53, 70, 240, 18, 25, 38, 25, 38, 53, 66, 98, + 50, 50, 98, 50, 55, 18, 50, 55, 37, 0, 14, 19, + 14, 0, 10, 76, 44, 35, 99, 35, 99, 35, 99, 35, + 99, 44, 44, 0, 12, 64, 21, 14, 0, 10, 67, 99, + 35, 99, 44, 44, 35, 99, 35, 99, 35, 99, 44, 44, + 0, 10, 96, 35, 16, 0, 12, 2, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 38, 38, 38, 38, 34, + 34, 34, 34, 34, 34, 34, 34, 38, 38, 38, 38, 0, + 12, 32, 33, 18, 0, 13, 66, 34, 66, 98, 34, 66, + 98, 34, 66, 102, 66, 102, 52, 82, 34, 53, 66, 34, + 35, 18, 70, 19, 36, 38, 18, 66, 0, 13, 112, 21, + 17, 0, 13, 67, 227, 227, 213, 179, 19, 147, 51, 85, + 85, 36, 116, 34, 177, 0, 13, 16, 26, 16, 0, 12, + 66, 50, 146, 50, 146, 50, 131, 35, 132, 19, 122, 83, + 39, 51, 51, 35, 49, 51, 225, 0, 11, 16, 21, 15, + 0, 11, 87, 106, 83, 83, 51, 115, 35, 115, 35, 115, + 51, 83, 74, 119, 0, 11, 112, 17, 17, 0, 12, 124, + 92, 211, 196, 181, 169, 87, 23, 36, 115, 0, 15, 32, + 25, 16, 0, 12, 22, 21, 70, 21, 115, 66, 114, 66, + 116, 35, 102, 20, 52, 36, 19, 34, 67, 50, 130, 0, + 13, 19, 18, 0, 11, 103, 183, 240, 188, 108, 227, 213, + 153, 104, 23, 36, 131, 0, 13, 112, 16, 15, 0, 11, + 45, 45, 195, 195, 45, 45, 195, 195, 195, 0, 11, 64, + 16, 14, 0, 10, 76, 44, 35, 179, 188, 44, 35, 188, + 44, 0, 10, 96, 21, 16, 0, 12, 13, 61, 99, 35, + 131, 35, 131, 35, 131, 35, 131, 35, 94, 46, 0, 12, + 32, 22, 15, 0, 7, 119, 135, 93, 45, 240, 101, 151, + 115, 51, 98, 82, 99, 51, 119, 149, 0, 10, 16, 24, + 8, 3, 83, 83, 83, 83, 83, 83, 83, 86, 38, 35, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 80, 42, + 9, 2, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, + 35, 34, 35, 34, 35, 39, 39, 34, 35, 34, 35, 34, + 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, 35, 34, + 35, 34, 35, 99, 32, 24, 8, 3, 83, 83, 83, 83, + 86, 38, 35, 83, 83, 83, 86, 38, 35, 83, 83, 83, + 83, 83, 83, 83, 80, 40, 9, 2, 35, 34, 35, 34, + 35, 34, 35, 34, 35, 39, 39, 34, 35, 34, 35, 34, + 35, 39, 39, 34, 35, 34, 35, 34, 35, 34, 35, 34, + 35, 34, 35, 34, 35, 34, 35, 99, 32, 24, 9, 67, + 99, 99, 99, 99, 99, 99, 99, 39, 39, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 32, 44, 13, 66, + 35, 98, 35, 98, 35, 98, 35, 98, 35, 98, 35, 98, + 35, 38, 35, 38, 35, 98, 35, 98, 35, 98, 35, 98, + 35, 98, 35, 98, 35, 98, 35, 98, 35, 98, 35, 98, + 35, 98, 35, 163, 32, 24, 10, 83, 115, 115, 115, 115, + 40, 40, 115, 115, 115, 40, 40, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 32, 44, 11, 50, 34, 82, 34, 82, + 34, 82, 34, 82, 34, 37, 34, 37, 34, 82, 34, 82, + 34, 82, 34, 82, 34, 37, 34, 37, 34, 82, 34, 82, + 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, 34, 146, + 32, 22, 22, 0, 20, 35, 240, 67, 240, 67, 240, 67, + 240, 67, 240, 67, 191, 5, 47, 5, 0, 16, 96, 44, + 22, 227, 240, 67, 240, 67, 240, 67, 240, 67, 240, 67, + 240, 67, 240, 67, 240, 70, 115, 102, 115, 99, 163, 99, + 163, 99, 163, 99, 93, 19, 93, 19, 240, 67, 240, 67, + 240, 67, 240, 67, 240, 67, 80, 50, 21, 194, 50, 226, + 50, 226, 50, 226, 50, 226, 50, 226, 50, 226, 50, 226, + 50, 231, 114, 87, 114, 82, 50, 114, 82, 50, 114, 82, + 50, 114, 82, 50, 43, 18, 50, 43, 18, 50, 226, 50, + 226, 50, 226, 50, 240, 66, 240, 66, 32, 44, 20, 243, + 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, + 240, 35, 240, 35, 131, 99, 131, 99, 131, 99, 131, 99, + 131, 69, 47, 3, 46, 19, 240, 35, 240, 35, 240, 35, + 240, 35, 240, 35, 32, 20, 22, 0, 25, 51, 67, 195, + 67, 195, 67, 195, 67, 195, 67, 127, 5, 47, 5, 0, + 14, 26, 22, 0, 19, 47, 5, 47, 5, 163, 240, 67, + 240, 67, 240, 67, 240, 67, 240, 67, 240, 67, 240, 67, + 0, 12, 48, 45, 21, 240, 19, 240, 51, 240, 51, 240, + 51, 240, 51, 240, 51, 240, 51, 240, 51, 240, 51, 240, + 51, 240, 51, 47, 19, 46, 35, 131, 115, 131, 55, 131, + 55, 131, 115, 131, 115, 131, 115, 131, 115, 240, 51, 32, + 54, 21, 194, 35, 226, 35, 226, 35, 226, 35, 226, 35, + 226, 35, 226, 35, 226, 35, 226, 35, 226, 35, 226, 35, + 43, 18, 35, 43, 18, 35, 99, 37, 35, 99, 37, 35, + 99, 82, 35, 99, 82, 35, 99, 82, 35, 99, 82, 35, + 99, 82, 35, 240, 51, 32, 44, 20, 243, 240, 35, 240, + 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, + 35, 240, 35, 240, 35, 47, 3, 45, 35, 131, 99, 131, + 99, 131, 99, 131, 99, 131, 99, 131, 99, 131, 99, 240, + 35, 32, 27, 22, 0, 19, 47, 5, 47, 5, 115, 67, + 195, 67, 195, 67, 195, 67, 195, 67, 195, 67, 195, 67, + 195, 67, 0, 11, 112, 10, 22, 0, 27, 79, 5, 47, + 5, 0, 25, 44, 20, 243, 240, 35, 240, 35, 240, 35, + 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, + 240, 35, 240, 35, 240, 35, 240, 35, 46, 19, 46, 19, + 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 32, 24, + 5, 3, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 32, 4, + 24, 0, 63, 23, 15, 0, 11, 34, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 102, 22, 38, 22, 0, + 13, 48, 23, 16, 0, 12, 2, 86, 50, 86, 50, 82, + 114, 82, 114, 82, 114, 82, 118, 23, 38, 23, 0, 14, + 32, 25, 18, 0, 13, 66, 130, 98, 130, 98, 130, 98, + 116, 82, 116, 82, 102, 70, 19, 36, 38, 18, 66, 0, + 16, 16, 26, 17, 0, 11, 113, 240, 17, 98, 115, 82, + 115, 82, 101, 66, 98, 18, 66, 83, 34, 50, 82, 50, + 63, 0, 15, 16, 34, 21, 0, 15, 101, 21, 50, 85, + 21, 50, 130, 66, 50, 130, 66, 50, 85, 66, 36, 66, + 114, 37, 50, 114, 19, 19, 38, 50, 18, 49, 67, 82, + 0, 17, 23, 17, 0, 12, 102, 38, 54, 38, 114, 34, + 118, 34, 118, 34, 114, 98, 119, 23, 39, 23, 0, 15, + 16, 37, 21, 0, 15, 101, 18, 34, 34, 85, 18, 34, + 34, 130, 18, 34, 34, 130, 22, 34, 85, 22, 20, 66, + 66, 34, 21, 50, 66, 37, 19, 46, 50, 52, 23, 0, + 16, 96, 26, 18, 0, 13, 70, 198, 82, 146, 82, 86, + 68, 70, 53, 66, 114, 34, 50, 98, 65, 55, 24, 39, + 24, 0, 13, 96, 27, 18, 0, 13, 70, 40, 38, 40, + 98, 198, 68, 70, 50, 34, 50, 99, 50, 34, 99, 50, + 39, 34, 34, 55, 52, 0, 14, 31, 16, 0, 12, 6, + 34, 34, 38, 34, 34, 34, 34, 38, 34, 34, 38, 34, + 34, 34, 34, 34, 34, 34, 34, 38, 38, 38, 38, 0, + 14, 32, 29, 17, 0, 12, 102, 66, 86, 66, 82, 34, + 66, 82, 34, 52, 66, 34, 52, 66, 34, 38, 54, 19, + 35, 38, 18, 66, 0, 15, 16, 28, 18, 0, 13, 70, + 81, 102, 82, 82, 34, 68, 66, 34, 68, 66, 34, 50, + 34, 50, 34, 50, 34, 54, 40, 38, 40, 0, 16, 27, + 16, 0, 6, 14, 46, 35, 131, 35, 131, 35, 131, 46, + 46, 0, 6, 101, 162, 50, 146, 50, 146, 50, 165, 0, + 6, 112, 30, 16, 0, 12, 2, 34, 38, 34, 34, 38, + 38, 98, 38, 98, 34, 34, 98, 34, 34, 98, 34, 34, + 98, 38, 98, 38, 98, 0, 12, 32, 29, 17, 0, 12, + 98, 34, 38, 50, 34, 38, 54, 34, 118, 34, 114, 34, + 34, 114, 34, 34, 114, 34, 34, 118, 39, 38, 39, 0, + 13, 38, 18, 0, 13, 66, 34, 34, 21, 34, 34, 34, + 21, 38, 34, 66, 38, 35, 50, 34, 34, 35, 50, 34, + 34, 21, 34, 34, 37, 19, 18, 40, 49, 34, 39, 114, + 0, 13, 96, 36, 18, 0, 13, 66, 34, 34, 36, 34, + 34, 34, 34, 70, 34, 34, 70, 35, 18, 66, 34, 35, + 18, 66, 34, 20, 18, 66, 37, 20, 72, 38, 39, 69, + 0, 13, 96, 28, 18, 0, 13, 66, 34, 39, 50, 34, + 39, 54, 99, 54, 83, 66, 34, 68, 66, 34, 54, 54, + 20, 35, 38, 34, 66, 0, 16, 29, 17, 0, 12, 98, + 34, 38, 50, 34, 38, 54, 34, 118, 38, 50, 34, 38, + 50, 34, 34, 114, 34, 34, 118, 39, 38, 39, 0, 13, + 29, 16, 240, 240, 35, 131, 35, 131, 46, 46, 35, 131, + 35, 131, 46, 46, 0, 6, 101, 162, 50, 146, 50, 146, + 50, 165, 0, 6, 112, 41, 17, 240, 240, 66, 50, 18, + 50, 34, 50, 18, 50, 34, 50, 18, 50, 39, 23, 39, + 23, 34, 50, 18, 50, 39, 23, 39, 23, 0, 7, 37, + 178, 50, 162, 50, 162, 50, 181, 0, 7, 32, 27, 15, + 0, 11, 82, 38, 82, 38, 82, 98, 68, 82, 68, 82, + 54, 66, 35, 35, 50, 35, 50, 50, 145, 50, 0, 11, + 64, 26, 18, 0, 13, 114, 82, 146, 82, 146, 82, 132, + 66, 132, 66, 118, 50, 99, 35, 38, 35, 50, 38, 145, + 0, 14, 96, 27, 18, 0, 13, 114, 70, 98, 70, 98, + 66, 162, 66, 148, 50, 149, 34, 131, 19, 18, 115, 43, + 34, 81, 23, 0, 13, 96, 28, 18, 0, 13, 114, 66, + 50, 82, 66, 50, 82, 71, 68, 55, 68, 50, 50, 51, + 18, 34, 50, 35, 43, 34, 66, 23, 0, 16, 25, 18, + 0, 13, 114, 55, 98, 55, 98, 115, 84, 83, 100, 83, + 86, 53, 51, 39, 19, 35, 49, 19, 50, 0, 16, 20, + 14, 0, 11, 18, 195, 164, 162, 18, 130, 35, 99, 50, + 98, 82, 75, 44, 0, 10, 96, 30, 20, 0, 15, 36, + 85, 86, 55, 51, 35, 19, 51, 34, 66, 18, 82, 34, + 66, 18, 82, 35, 35, 19, 51, 54, 55, 84, 85, 0, + 18, 23, 11, 0, 5, 115, 131, 117, 87, 51, 51, 34, + 82, 34, 82, 34, 82, 35, 51, 55, 85, 0, 8, 96, + 34, 20, 0, 12, 114, 114, 146, 114, 118, 82, 99, 34, + 82, 98, 66, 52, 82, 66, 53, 66, 66, 35, 19, 51, + 35, 19, 36, 54, 34, 66, 84, 0, 16, 96, 34, 19, + 0, 12, 34, 113, 146, 113, 118, 67, 83, 34, 67, 82, + 66, 37, 66, 66, 34, 18, 66, 66, 19, 34, 51, 35, + 18, 50, 70, 25, 68, 0, 15, 112, 28, 17, 240, 62, + 62, 82, 82, 130, 82, 130, 82, 130, 82, 95, 47, 0, + 9, 53, 178, 50, 162, 50, 162, 50, 181, 0, 7, 32, + 32, 19, 0, 12, 21, 69, 85, 69, 240, 120, 24, 40, + 24, 69, 69, 66, 50, 34, 50, 50, 50, 34, 50, 50, + 50, 34, 50, 69, 69, 0, 14, 80, 20, 14, 0, 8, + 108, 44, 240, 70, 120, 84, 36, 67, 67, 68, 36, 88, + 118, 0, 11, 16, 50, 23, 243, 240, 83, 240, 83, 240, + 83, 240, 83, 240, 83, 240, 86, 240, 38, 240, 35, 146, + 34, 83, 146, 34, 83, 146, 34, 86, 98, 34, 86, 98, + 34, 34, 19, 94, 19, 93, 35, 240, 83, 240, 83, 240, + 83, 240, 83, 240, 83, 80, 51, 21, 194, 35, 226, 35, + 226, 35, 226, 35, 226, 35, 226, 35, 231, 231, 226, 35, + 226, 35, 66, 34, 71, 66, 34, 71, 66, 34, 66, 35, + 66, 34, 66, 35, 43, 18, 35, 42, 34, 35, 226, 35, + 226, 35, 226, 35, 226, 35, 240, 51, 32, 50, 20, 243, + 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, + 240, 35, 240, 35, 82, 50, 83, 82, 50, 83, 82, 50, + 83, 82, 50, 83, 82, 50, 34, 19, 46, 19, 45, 35, + 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 32, 51, + 20, 243, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, + 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 46, 19, + 45, 35, 66, 50, 99, 66, 50, 39, 66, 50, 39, 66, + 50, 99, 66, 50, 39, 66, 50, 39, 66, 50, 99, 240, + 35, 32, 61, 20, 194, 19, 226, 19, 226, 19, 226, 19, + 226, 19, 226, 19, 226, 19, 226, 19, 226, 19, 226, 19, + 43, 18, 19, 42, 34, 19, 50, 34, 82, 19, 50, 34, + 37, 19, 50, 34, 37, 19, 50, 34, 82, 19, 50, 34, + 37, 19, 50, 34, 37, 19, 50, 34, 82, 19, 226, 19, + 240, 35, 32, 51, 19, 227, 240, 19, 240, 19, 240, 19, + 240, 19, 240, 19, 240, 19, 240, 19, 240, 19, 240, 19, + 240, 19, 47, 2, 45, 19, 82, 50, 67, 82, 50, 67, + 82, 50, 67, 82, 50, 67, 82, 50, 67, 82, 50, 67, + 82, 50, 67, 240, 19, 32, 9, 6, 0, 6, 99, 52, + 51, 0, 7, 27, 10, 83, 115, 115, 115, 115, 115, 115, + 115, 115, 35, 35, 35, 35, 35, 35, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 32, + 0, 0, // Padding + +}; + +tFont *g_psFontWHangulgothic22ptb = (tFont *)g_pui8Hangulgothic22ptb; diff --git a/third_party/fonts/ofl/fonts/fonthangulgothic24pt.c b/third_party/fonts/ofl/fonts/fonthangulgothic24pt.c new file mode 100644 index 0000000..a0a65cd --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulgothic24pt.c @@ -0,0 +1,888 @@ +//***************************************************************************** +// +// fonthangulgothic24pt.c - Font definition for the 24ptpt Hangulgothic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulgothic +// Size: 24pt +// Bold: no +// Italic: no +// Memory usage: 6794 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulgothic24pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 23, + + // + // The height of the font. + // + 24, + + // + // The baseline of the font. + // + 19, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x88, 0x0c, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x93, 0x01, 0x00, 0x00, // Offset 403 (0x193) + 0xa3, 0x01, 0x00, 0x00, // Offset 419 (0x1a3) + 0xca, 0x01, 0x00, 0x00, // Offset 458 (0x1ca) + 0xf0, 0x01, 0x00, 0x00, // Offset 496 (0x1f0) + 0x29, 0x02, 0x00, 0x00, // Offset 553 (0x229) + 0x55, 0x02, 0x00, 0x00, // Offset 597 (0x255) + 0x5f, 0x02, 0x00, 0x00, // Offset 607 (0x25f) + 0x79, 0x02, 0x00, 0x00, // Offset 633 (0x279) + 0x93, 0x02, 0x00, 0x00, // Offset 659 (0x293) + 0xa7, 0x02, 0x00, 0x00, // Offset 679 (0x2a7) + 0xba, 0x02, 0x00, 0x00, // Offset 698 (0x2ba) + 0xc4, 0x02, 0x00, 0x00, // Offset 708 (0x2c4) + 0xcc, 0x02, 0x00, 0x00, // Offset 716 (0x2cc) + 0xd3, 0x02, 0x00, 0x00, // Offset 723 (0x2d3) + 0xed, 0x02, 0x00, 0x00, // Offset 749 (0x2ed) + 0x14, 0x03, 0x00, 0x00, // Offset 788 (0x314) + 0x2d, 0x03, 0x00, 0x00, // Offset 813 (0x32d) + 0x46, 0x03, 0x00, 0x00, // Offset 838 (0x346) + 0x60, 0x03, 0x00, 0x00, // Offset 864 (0x360) + 0x82, 0x03, 0x00, 0x00, // Offset 898 (0x382) + 0x9b, 0x03, 0x00, 0x00, // Offset 923 (0x39b) + 0xbd, 0x03, 0x00, 0x00, // Offset 957 (0x3bd) + 0xd5, 0x03, 0x00, 0x00, // Offset 981 (0x3d5) + 0xfa, 0x03, 0x00, 0x00, // Offset 1018 (0x3fa) + 0x1b, 0x04, 0x00, 0x00, // Offset 1051 (0x41b) + 0x26, 0x04, 0x00, 0x00, // Offset 1062 (0x426) + 0x34, 0x04, 0x00, 0x00, // Offset 1076 (0x434) + 0x4e, 0x04, 0x00, 0x00, // Offset 1102 (0x44e) + 0x58, 0x04, 0x00, 0x00, // Offset 1112 (0x458) + 0x72, 0x04, 0x00, 0x00, // Offset 1138 (0x472) + 0x88, 0x04, 0x00, 0x00, // Offset 1160 (0x488) + 0xc0, 0x04, 0x00, 0x00, // Offset 1216 (0x4c0) + 0xe6, 0x04, 0x00, 0x00, // Offset 1254 (0x4e6) + 0x0c, 0x05, 0x00, 0x00, // Offset 1292 (0x50c) + 0x24, 0x05, 0x00, 0x00, // Offset 1316 (0x524) + 0x4b, 0x05, 0x00, 0x00, // Offset 1355 (0x54b) + 0x63, 0x05, 0x00, 0x00, // Offset 1379 (0x563) + 0x7b, 0x05, 0x00, 0x00, // Offset 1403 (0x57b) + 0x9b, 0x05, 0x00, 0x00, // Offset 1435 (0x59b) + 0xc3, 0x05, 0x00, 0x00, // Offset 1475 (0x5c3) + 0xd8, 0x05, 0x00, 0x00, // Offset 1496 (0x5d8) + 0xf0, 0x05, 0x00, 0x00, // Offset 1520 (0x5f0) + 0x18, 0x06, 0x00, 0x00, // Offset 1560 (0x618) + 0x30, 0x06, 0x00, 0x00, // Offset 1584 (0x630) + 0x72, 0x06, 0x00, 0x00, // Offset 1650 (0x672) + 0xa6, 0x06, 0x00, 0x00, // Offset 1702 (0x6a6) + 0xcd, 0x06, 0x00, 0x00, // Offset 1741 (0x6cd) + 0xec, 0x06, 0x00, 0x00, // Offset 1772 (0x6ec) + 0x19, 0x07, 0x00, 0x00, // Offset 1817 (0x719) + 0x40, 0x07, 0x00, 0x00, // Offset 1856 (0x740) + 0x59, 0x07, 0x00, 0x00, // Offset 1881 (0x759) + 0x71, 0x07, 0x00, 0x00, // Offset 1905 (0x771) + 0x99, 0x07, 0x00, 0x00, // Offset 1945 (0x799) + 0xbf, 0x07, 0x00, 0x00, // Offset 1983 (0x7bf) + 0x03, 0x08, 0x00, 0x00, // Offset 2051 (0x803) + 0x28, 0x08, 0x00, 0x00, // Offset 2088 (0x828) + 0x47, 0x08, 0x00, 0x00, // Offset 2119 (0x847) + 0x5f, 0x08, 0x00, 0x00, // Offset 2143 (0x85f) + 0x78, 0x08, 0x00, 0x00, // Offset 2168 (0x878) + 0xb6, 0x08, 0x00, 0x00, // Offset 2230 (0x8b6) + 0xcf, 0x08, 0x00, 0x00, // Offset 2255 (0x8cf) + 0xe9, 0x08, 0x00, 0x00, // Offset 2281 (0x8e9) + 0xf0, 0x08, 0x00, 0x00, // Offset 2288 (0x8f0) + 0xf8, 0x08, 0x00, 0x00, // Offset 2296 (0x8f8) + 0x14, 0x09, 0x00, 0x00, // Offset 2324 (0x914) + 0x39, 0x09, 0x00, 0x00, // Offset 2361 (0x939) + 0x4d, 0x09, 0x00, 0x00, // Offset 2381 (0x94d) + 0x73, 0x09, 0x00, 0x00, // Offset 2419 (0x973) + 0x8d, 0x09, 0x00, 0x00, // Offset 2445 (0x98d) + 0xa5, 0x09, 0x00, 0x00, // Offset 2469 (0x9a5) + 0xc9, 0x09, 0x00, 0x00, // Offset 2505 (0x9c9) + 0xee, 0x09, 0x00, 0x00, // Offset 2542 (0x9ee) + 0x01, 0x0a, 0x00, 0x00, // Offset 2561 (0xa01) + 0x19, 0x0a, 0x00, 0x00, // Offset 2585 (0xa19) + 0x3d, 0x0a, 0x00, 0x00, // Offset 2621 (0xa3d) + 0x53, 0x0a, 0x00, 0x00, // Offset 2643 (0xa53) + 0x82, 0x0a, 0x00, 0x00, // Offset 2690 (0xa82) + 0xa3, 0x0a, 0x00, 0x00, // Offset 2723 (0xaa3) + 0xc2, 0x0a, 0x00, 0x00, // Offset 2754 (0xac2) + 0xe5, 0x0a, 0x00, 0x00, // Offset 2789 (0xae5) + 0x08, 0x0b, 0x00, 0x00, // Offset 2824 (0xb08) + 0x1d, 0x0b, 0x00, 0x00, // Offset 2845 (0xb1d) + 0x31, 0x0b, 0x00, 0x00, // Offset 2865 (0xb31) + 0x49, 0x0b, 0x00, 0x00, // Offset 2889 (0xb49) + 0x6b, 0x0b, 0x00, 0x00, // Offset 2923 (0xb6b) + 0x89, 0x0b, 0x00, 0x00, // Offset 2953 (0xb89) + 0xbd, 0x0b, 0x00, 0x00, // Offset 3005 (0xbbd) + 0xda, 0x0b, 0x00, 0x00, // Offset 3034 (0xbda) + 0xfa, 0x0b, 0x00, 0x00, // Offset 3066 (0xbfa) + 0x0e, 0x0c, 0x00, 0x00, // Offset 3086 (0xc0e) + 0x27, 0x0c, 0x00, 0x00, // Offset 3111 (0xc27) + 0x3f, 0x0c, 0x00, 0x00, // Offset 3135 (0xc3f) + 0x58, 0x0c, 0x00, 0x00, // Offset 3160 (0xc58) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 4, 10, 0, 30, 19, 4, 194, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 162, 34, 240, 48, 16, + 7, 240, 98, 18, 34, 18, 34, 18, 34, 18, 34, 18, + 0, 14, 32, 39, 15, 0, 6, 33, 50, 130, 50, 130, + 50, 130, 49, 146, 49, 108, 97, 65, 130, 50, 130, 50, + 130, 50, 92, 97, 65, 145, 65, 145, 50, 145, 50, 130, + 50, 130, 50, 0, 8, 32, 38, 12, 240, 18, 162, 150, + 66, 18, 98, 34, 98, 34, 98, 34, 98, 34, 114, 18, + 132, 149, 133, 114, 18, 114, 34, 98, 34, 98, 34, 98, + 33, 49, 53, 55, 146, 162, 240, 240, 57, 22, 0, 7, + 34, 132, 129, 130, 34, 98, 114, 66, 66, 130, 66, 66, + 130, 66, 50, 146, 66, 49, 178, 34, 50, 196, 65, 52, + 210, 34, 34, 178, 34, 66, 161, 50, 66, 146, 50, 66, + 145, 66, 66, 130, 66, 66, 114, 82, 66, 113, 114, 34, + 114, 132, 0, 11, 64, 44, 17, 0, 6, 117, 178, 50, + 146, 82, 130, 82, 130, 82, 131, 50, 162, 34, 196, 196, + 98, 51, 34, 82, 50, 66, 66, 34, 98, 34, 50, 114, + 18, 50, 131, 67, 115, 83, 67, 18, 102, 66, 0, 8, + 96, 10, 4, 194, 34, 34, 34, 34, 0, 8, 32, 26, + 8, 240, 82, 97, 97, 98, 97, 98, 98, 82, 98, 98, + 98, 98, 98, 98, 98, 114, 98, 113, 114, 113, 129, 114, + 32, 26, 8, 240, 18, 113, 129, 114, 113, 114, 98, 113, + 114, 98, 98, 98, 98, 98, 98, 82, 98, 97, 98, 97, + 97, 98, 96, 20, 12, 0, 11, 2, 162, 97, 50, 49, + 42, 84, 132, 114, 34, 82, 66, 81, 0, 13, 16, 19, + 15, 0, 11, 114, 210, 210, 210, 210, 141, 114, 210, 210, + 210, 210, 210, 0, 12, 32, 10, 5, 0, 12, 2, 50, + 34, 50, 50, 48, 8, 8, 0, 10, 6, 0, 13, 32, + 7, 4, 0, 9, 66, 34, 224, 26, 10, 240, 240, 98, + 130, 114, 130, 129, 130, 130, 129, 130, 130, 129, 130, 130, + 114, 130, 130, 114, 130, 129, 145, 240, 64, 39, 14, 0, + 5, 100, 130, 66, 82, 98, 66, 98, 50, 129, 50, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 50, 98, 66, 98, 82, 66, 118, 0, 7, 80, + 25, 8, 240, 210, 68, 50, 18, 34, 34, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 240, 240, + 64, 25, 13, 240, 240, 166, 98, 82, 194, 178, 178, 178, + 163, 162, 162, 163, 147, 162, 162, 162, 162, 162, 187, 0, + 6, 96, 26, 13, 240, 240, 167, 97, 83, 194, 178, 178, + 162, 162, 101, 210, 194, 194, 178, 178, 178, 162, 49, 98, + 71, 0, 7, 32, 34, 15, 0, 6, 67, 195, 177, 18, + 162, 18, 161, 34, 146, 34, 130, 50, 129, 66, 114, 66, + 98, 82, 97, 98, 82, 98, 93, 162, 210, 210, 210, 0, + 8, 16, 25, 13, 240, 240, 170, 50, 178, 178, 178, 178, + 183, 195, 178, 194, 178, 178, 178, 178, 162, 49, 98, 86, + 0, 7, 32, 34, 14, 0, 5, 118, 98, 178, 178, 194, + 178, 194, 37, 84, 67, 51, 98, 50, 130, 34, 130, 34, + 130, 34, 130, 49, 130, 50, 98, 82, 66, 118, 0, 7, + 80, 24, 13, 240, 240, 155, 178, 178, 162, 178, 162, 178, + 162, 178, 162, 178, 177, 178, 178, 162, 178, 162, 0, 7, + 80, 37, 14, 240, 240, 245, 114, 67, 66, 114, 50, 114, + 50, 114, 51, 83, 67, 51, 117, 149, 115, 66, 67, 98, + 50, 130, 34, 130, 34, 130, 50, 99, 51, 67, 102, 0, + 7, 80, 33, 14, 240, 240, 246, 114, 66, 82, 98, 50, + 129, 50, 130, 34, 130, 34, 130, 50, 99, 51, 68, 85, + 34, 194, 194, 178, 194, 178, 163, 102, 0, 7, 112, 11, + 4, 240, 82, 34, 240, 240, 130, 34, 240, 176, 14, 5, + 240, 82, 50, 0, 6, 18, 50, 34, 50, 50, 240, 128, + 26, 12, 240, 240, 49, 162, 146, 146, 146, 146, 146, 146, + 146, 146, 162, 178, 178, 178, 178, 178, 178, 178, 178, 177, + 240, 176, 10, 15, 0, 15, 13, 0, 7, 109, 0, 19, + 26, 12, 240, 145, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 162, 146, 146, 146, 146, 146, 146, 146, 146, 161, 240, + 240, 80, 22, 10, 240, 246, 146, 146, 130, 130, 130, 115, + 114, 114, 114, 115, 114, 130, 240, 210, 130, 0, 5, 96, + 56, 20, 0, 8, 39, 178, 99, 115, 146, 98, 52, 66, + 66, 50, 51, 19, 35, 34, 67, 34, 34, 50, 81, 50, + 34, 34, 82, 50, 34, 34, 82, 50, 34, 34, 81, 50, + 50, 34, 66, 50, 66, 34, 35, 34, 82, 51, 35, 130, + 177, 99, 146, 130, 98, 198, 0, 11, 38, 18, 0, 7, + 82, 244, 225, 18, 210, 33, 210, 34, 178, 50, 178, 66, + 161, 82, 146, 97, 146, 98, 114, 114, 124, 82, 146, 82, + 162, 65, 178, 50, 193, 50, 194, 0, 9, 32, 38, 13, + 240, 240, 152, 82, 82, 66, 98, 50, 98, 50, 98, 50, + 98, 50, 67, 71, 98, 82, 66, 98, 50, 114, 34, 114, + 34, 114, 34, 114, 34, 98, 50, 82, 71, 0, 7, 32, + 24, 15, 0, 6, 55, 98, 179, 179, 194, 194, 210, 210, + 210, 210, 210, 210, 226, 210, 226, 227, 247, 0, 7, 96, + 39, 15, 240, 240, 248, 114, 83, 82, 114, 66, 130, 50, + 130, 50, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, + 146, 34, 146, 34, 130, 50, 130, 50, 114, 66, 83, 87, + 0, 8, 64, 24, 12, 240, 240, 106, 34, 162, 162, 162, + 162, 162, 169, 50, 162, 162, 162, 162, 162, 162, 162, 170, + 0, 6, 32, 24, 11, 240, 240, 57, 34, 146, 146, 146, + 146, 146, 146, 153, 34, 146, 146, 146, 146, 146, 146, 146, + 0, 6, 80, 32, 17, 0, 7, 24, 115, 97, 98, 226, + 226, 242, 226, 242, 242, 103, 34, 178, 34, 178, 34, 178, + 50, 162, 51, 146, 67, 130, 98, 114, 135, 0, 9, 40, + 15, 240, 240, 242, 146, 34, 146, 34, 146, 34, 146, 34, + 146, 34, 146, 34, 146, 34, 146, 45, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 0, 7, 96, 21, 4, 194, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 240, 48, + 24, 9, 240, 240, 34, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 98, 53, 240, 240, 160, + 40, 14, 240, 240, 194, 115, 34, 99, 50, 98, 66, 82, + 82, 66, 98, 50, 114, 34, 130, 19, 134, 132, 18, 115, + 50, 98, 67, 82, 82, 82, 98, 66, 114, 50, 114, 50, + 130, 0, 7, 32, 24, 11, 240, 240, 50, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 153, 0, 5, 96, 66, 20, 0, 7, 67, 195, 35, 195, + 36, 164, 34, 17, 161, 18, 34, 18, 130, 18, 34, 33, + 129, 34, 34, 33, 129, 34, 34, 34, 98, 34, 34, 49, + 97, 50, 34, 50, 66, 50, 34, 65, 65, 66, 34, 66, + 49, 66, 34, 81, 34, 66, 34, 81, 33, 82, 34, 84, + 82, 34, 98, 98, 34, 98, 98, 0, 10, 32, 52, 15, + 240, 240, 242, 146, 35, 130, 36, 114, 34, 17, 114, 34, + 18, 98, 34, 33, 98, 34, 49, 82, 34, 50, 66, 34, + 65, 66, 34, 66, 50, 34, 81, 50, 34, 82, 34, 34, + 97, 34, 34, 113, 18, 34, 116, 34, 131, 34, 131, 0, + 7, 96, 39, 18, 0, 7, 54, 163, 67, 114, 130, 82, + 162, 66, 162, 50, 194, 34, 194, 34, 194, 34, 194, 34, + 194, 34, 194, 34, 194, 50, 162, 66, 162, 82, 130, 115, + 67, 166, 0, 9, 112, 31, 13, 240, 240, 152, 82, 98, + 50, 114, 34, 114, 34, 114, 34, 114, 34, 99, 34, 83, + 56, 82, 178, 178, 178, 178, 178, 178, 178, 0, 7, 112, + 45, 18, 0, 7, 54, 163, 67, 114, 130, 82, 162, 66, + 162, 50, 194, 34, 194, 34, 194, 34, 194, 34, 194, 34, + 194, 34, 194, 50, 162, 66, 162, 82, 130, 115, 67, 166, + 240, 34, 240, 34, 240, 19, 240, 19, 48, 39, 14, 240, + 240, 200, 98, 83, 66, 114, 50, 114, 50, 114, 50, 114, + 50, 98, 66, 82, 88, 98, 66, 98, 82, 82, 82, 82, + 98, 66, 98, 66, 114, 50, 114, 50, 130, 0, 7, 32, + 25, 12, 240, 240, 150, 67, 145, 162, 162, 163, 163, 164, + 149, 148, 163, 162, 162, 162, 146, 49, 82, 71, 0, 6, + 80, 24, 14, 240, 240, 204, 114, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 0, 7, + 112, 40, 15, 240, 240, 242, 146, 34, 146, 34, 146, 34, + 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, + 146, 34, 146, 34, 146, 34, 146, 34, 146, 50, 114, 82, + 82, 133, 0, 8, 32, 38, 17, 0, 6, 49, 194, 34, + 162, 50, 162, 66, 145, 82, 130, 97, 130, 98, 98, 114, + 98, 129, 97, 146, 66, 146, 66, 162, 34, 178, 34, 193, + 33, 212, 212, 226, 0, 9, 80, 68, 25, 0, 9, 49, + 147, 130, 34, 131, 130, 34, 129, 17, 129, 65, 114, 18, + 98, 66, 98, 18, 98, 66, 97, 34, 98, 66, 82, 49, + 97, 97, 82, 50, 66, 98, 65, 66, 66, 98, 50, 81, + 65, 129, 50, 82, 34, 130, 33, 98, 34, 130, 33, 113, + 33, 161, 18, 113, 18, 161, 17, 132, 163, 131, 179, 146, + 0, 13, 48, 37, 16, 0, 6, 2, 162, 50, 130, 82, + 98, 114, 82, 114, 66, 146, 34, 180, 211, 211, 196, 178, + 34, 146, 66, 130, 66, 114, 98, 82, 130, 66, 146, 34, + 162, 0, 8, 32, 31, 16, 0, 6, 2, 162, 34, 162, + 50, 130, 82, 98, 98, 98, 114, 66, 146, 34, 162, 34, + 180, 210, 226, 226, 226, 226, 226, 226, 226, 0, 9, 24, + 14, 240, 240, 203, 194, 178, 194, 178, 178, 194, 178, 179, + 178, 178, 179, 178, 178, 194, 178, 204, 0, 7, 32, 25, + 7, 117, 34, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 85, 144, + 62, 23, 0, 8, 113, 113, 225, 99, 97, 98, 83, 97, + 98, 81, 17, 82, 113, 81, 17, 82, 113, 81, 18, 65, + 130, 50, 18, 65, 95, 6, 82, 49, 49, 50, 145, 49, + 50, 33, 161, 34, 50, 33, 162, 17, 81, 18, 162, 17, + 81, 18, 177, 17, 83, 195, 83, 194, 114, 194, 114, 0, + 12, 48, 25, 7, 117, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 37, 144, 26, 14, 0, 5, 114, 179, 180, 146, 34, + 130, 34, 114, 66, 98, 66, 82, 98, 66, 98, 50, 130, + 34, 130, 0, 17, 96, 7, 15, 0, 41, 45, 240, 32, + 8, 5, 242, 65, 66, 0, 11, 64, 28, 12, 0, 10, + 102, 81, 82, 178, 162, 162, 87, 51, 66, 35, 82, 34, + 98, 34, 98, 34, 83, 50, 52, 68, 34, 0, 6, 32, + 37, 13, 240, 178, 178, 178, 178, 178, 178, 36, 84, 51, + 51, 82, 50, 114, 34, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 35, 98, 35, 82, 52, 50, 66, 36, 0, 7, + 16, 20, 12, 0, 11, 6, 67, 130, 162, 146, 162, 162, + 162, 162, 178, 162, 179, 182, 0, 6, 32, 38, 13, 240, + 240, 82, 178, 178, 178, 178, 84, 34, 51, 52, 50, 83, + 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, + 34, 99, 50, 83, 66, 52, 84, 34, 0, 6, 96, 26, + 13, 0, 11, 101, 114, 50, 82, 82, 66, 98, 34, 114, + 34, 114, 43, 34, 178, 178, 194, 194, 81, 103, 0, 6, + 112, 24, 10, 228, 82, 114, 130, 130, 130, 103, 82, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 5, + 96, 36, 13, 0, 11, 100, 34, 51, 52, 50, 83, 34, + 99, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 99, 50, 83, 66, 52, 85, 18, 177, 178, 65, 82, 87, + 80, 37, 12, 240, 146, 162, 162, 162, 162, 162, 21, 67, + 66, 50, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 0, + 6, 32, 19, 4, 130, 34, 226, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 240, 48, 24, 7, 240, + 34, 82, 240, 178, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 67, 36, 48, 36, 12, 240, + 146, 162, 162, 162, 162, 162, 82, 50, 67, 50, 66, 66, + 50, 82, 34, 98, 18, 117, 115, 18, 98, 50, 82, 65, + 82, 66, 66, 82, 50, 98, 0, 6, 32, 22, 4, 130, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 240, 48, 47, 20, 0, 17, 66, + 21, 53, 68, 50, 18, 50, 51, 83, 82, 34, 98, 98, + 34, 98, 98, 34, 98, 98, 34, 98, 98, 34, 98, 98, + 34, 98, 98, 34, 98, 98, 34, 98, 98, 34, 98, 98, + 34, 98, 98, 0, 10, 32, 33, 12, 0, 10, 66, 21, + 68, 50, 51, 82, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 0, 6, 32, 31, 14, 0, 12, 86, 114, 66, 82, 98, + 66, 98, 50, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 50, 98, 66, 98, 82, 66, 118, 0, 7, 80, 35, 13, + 0, 11, 50, 36, 84, 51, 51, 82, 50, 114, 34, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 34, 113, 51, 82, + 52, 50, 66, 21, 82, 178, 178, 178, 176, 35, 13, 0, + 11, 100, 34, 51, 52, 50, 83, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 34, 114, 50, 83, 66, + 52, 85, 18, 178, 178, 178, 178, 32, 21, 9, 0, 7, + 114, 35, 36, 83, 98, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 240, 240, 208, 20, 11, 0, 10, 6, 66, 130, + 146, 147, 148, 133, 131, 162, 146, 146, 33, 82, 70, 0, + 6, 24, 10, 240, 240, 34, 130, 130, 130, 103, 82, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 149, 240, 240, + 192, 34, 13, 0, 11, 50, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 99, 50, 65, 18, 69, 34, 0, 6, 96, 30, + 12, 0, 10, 65, 129, 34, 98, 34, 98, 49, 82, 66, + 66, 66, 65, 97, 50, 98, 34, 98, 33, 129, 18, 132, + 131, 162, 0, 6, 96, 52, 21, 0, 18, 49, 114, 114, + 34, 99, 98, 34, 84, 97, 50, 82, 17, 82, 66, 65, + 34, 66, 66, 50, 34, 65, 82, 50, 49, 50, 97, 49, + 66, 34, 98, 33, 66, 33, 114, 18, 81, 18, 129, 17, + 97, 18, 131, 99, 147, 114, 0, 11, 32, 29, 12, 0, + 10, 66, 98, 50, 66, 82, 50, 82, 34, 116, 147, 146, + 148, 129, 34, 98, 34, 82, 66, 65, 98, 34, 98, 0, + 6, 32, 32, 12, 0, 10, 66, 98, 34, 97, 50, 82, + 65, 82, 66, 65, 82, 50, 97, 50, 98, 33, 129, 18, + 129, 17, 147, 162, 161, 177, 162, 161, 131, 144, 20, 12, + 0, 10, 89, 162, 146, 147, 131, 146, 146, 147, 131, 146, + 147, 131, 154, 0, 6, 32, 25, 8, 179, 66, 98, 98, + 98, 98, 98, 98, 98, 82, 83, 82, 114, 114, 98, 98, + 98, 98, 98, 98, 98, 115, 160, 24, 4, 130, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 96, 25, 9, 148, 130, 114, + 114, 114, 114, 114, 114, 114, 129, 146, 99, 83, 98, 114, + 114, 114, 114, 114, 114, 114, 68, 224, 13, 14, 0, 17, + 84, 146, 50, 50, 33, 100, 0, 19, 80, + 0, 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x91, 0x01, 0x00, 0x00, // Offset 401 (0x191) + 0xac, 0x01, 0x00, 0x00, // Offset 428 (0x1ac) + 0xc9, 0x01, 0x00, 0x00, // Offset 457 (0x1c9) + 0xda, 0x01, 0x00, 0x00, // Offset 474 (0x1da) + 0xf6, 0x01, 0x00, 0x00, // Offset 502 (0x1f6) + 0x15, 0x02, 0x00, 0x00, // Offset 533 (0x215) + 0x25, 0x02, 0x00, 0x00, // Offset 549 (0x225) + 0x3c, 0x02, 0x00, 0x00, // Offset 572 (0x23c) + 0x4e, 0x02, 0x00, 0x00, // Offset 590 (0x24e) + 0x68, 0x02, 0x00, 0x00, // Offset 616 (0x268) + 0x8a, 0x02, 0x00, 0x00, // Offset 650 (0x28a) + 0xac, 0x02, 0x00, 0x00, // Offset 684 (0x2ac) + 0xc8, 0x02, 0x00, 0x00, // Offset 712 (0x2c8) + 0xe2, 0x02, 0x00, 0x00, // Offset 738 (0x2e2) + 0x07, 0x03, 0x00, 0x00, // Offset 775 (0x307) + 0x26, 0x03, 0x00, 0x00, // Offset 806 (0x326) + 0x3d, 0x03, 0x00, 0x00, // Offset 829 (0x33d) + 0x56, 0x03, 0x00, 0x00, // Offset 854 (0x356) + 0x81, 0x03, 0x00, 0x00, // Offset 897 (0x381) + 0xa6, 0x03, 0x00, 0x00, // Offset 934 (0x3a6) + 0xbd, 0x03, 0x00, 0x00, // Offset 957 (0x3bd) + 0xdd, 0x03, 0x00, 0x00, // Offset 989 (0x3dd) + 0xf8, 0x03, 0x00, 0x00, // Offset 1016 (0x3f8) + 0x0d, 0x04, 0x00, 0x00, // Offset 1037 (0x40d) + 0x2b, 0x04, 0x00, 0x00, // Offset 1067 (0x42b) + 0x41, 0x04, 0x00, 0x00, // Offset 1089 (0x441) + 0x53, 0x04, 0x00, 0x00, // Offset 1107 (0x453) + 0x64, 0x04, 0x00, 0x00, // Offset 1124 (0x464) + 0x7f, 0x04, 0x00, 0x00, // Offset 1151 (0x47f) + 0x97, 0x04, 0x00, 0x00, // Offset 1175 (0x497) + 0xb1, 0x04, 0x00, 0x00, // Offset 1201 (0x4b1) + 0xdf, 0x04, 0x00, 0x00, // Offset 1247 (0x4df) + 0xf9, 0x04, 0x00, 0x00, // Offset 1273 (0x4f9) + 0x26, 0x05, 0x00, 0x00, // Offset 1318 (0x526) + 0x40, 0x05, 0x00, 0x00, // Offset 1344 (0x540) + 0x6f, 0x05, 0x00, 0x00, // Offset 1391 (0x56f) + 0x89, 0x05, 0x00, 0x00, // Offset 1417 (0x589) + 0xb8, 0x05, 0x00, 0x00, // Offset 1464 (0x5b8) + 0xd0, 0x05, 0x00, 0x00, // Offset 1488 (0x5d0) + 0x01, 0x06, 0x00, 0x00, // Offset 1537 (0x601) + 0x38, 0x06, 0x00, 0x00, // Offset 1592 (0x638) + 0x6a, 0x06, 0x00, 0x00, // Offset 1642 (0x66a) + 0x83, 0x06, 0x00, 0x00, // Offset 1667 (0x683) + 0x9e, 0x06, 0x00, 0x00, // Offset 1694 (0x69e) + 0xd0, 0x06, 0x00, 0x00, // Offset 1744 (0x6d0) + 0x15, 0x07, 0x00, 0x00, // Offset 1813 (0x715) + 0x48, 0x07, 0x00, 0x00, // Offset 1864 (0x748) + 0x65, 0x07, 0x00, 0x00, // Offset 1893 (0x765) + 0x6e, 0x07, 0x00, 0x00, // Offset 1902 (0x76e) + 0xa0, 0x07, 0x00, 0x00, // Offset 1952 (0x7a0) + 0xb9, 0x07, 0x00, 0x00, // Offset 1977 (0x7b9) + 0xbd, 0x07, 0x00, 0x00, // Offset 1981 (0x7bd) + 0xd8, 0x07, 0x00, 0x00, // Offset 2008 (0x7d8) + 0xf0, 0x07, 0x00, 0x00, // Offset 2032 (0x7f0) + 0x0f, 0x08, 0x00, 0x00, // Offset 2063 (0x80f) + 0x30, 0x08, 0x00, 0x00, // Offset 2096 (0x830) + 0x58, 0x08, 0x00, 0x00, // Offset 2136 (0x858) + 0x72, 0x08, 0x00, 0x00, // Offset 2162 (0x872) + 0xa3, 0x08, 0x00, 0x00, // Offset 2211 (0x8a3) + 0xc2, 0x08, 0x00, 0x00, // Offset 2242 (0x8c2) + 0xe2, 0x08, 0x00, 0x00, // Offset 2274 (0x8e2) + 0x0d, 0x09, 0x00, 0x00, // Offset 2317 (0x90d) + 0x35, 0x09, 0x00, 0x00, // Offset 2357 (0x935) + 0x5c, 0x09, 0x00, 0x00, // Offset 2396 (0x95c) + 0x7d, 0x09, 0x00, 0x00, // Offset 2429 (0x97d) + 0x9f, 0x09, 0x00, 0x00, // Offset 2463 (0x99f) + 0xc2, 0x09, 0x00, 0x00, // Offset 2498 (0x9c2) + 0xf5, 0x09, 0x00, 0x00, // Offset 2549 (0x9f5) + 0x24, 0x0a, 0x00, 0x00, // Offset 2596 (0xa24) + 0x49, 0x0a, 0x00, 0x00, // Offset 2633 (0xa49) + 0x6c, 0x0a, 0x00, 0x00, // Offset 2668 (0xa6c) + 0x8d, 0x0a, 0x00, 0x00, // Offset 2701 (0xa8d) + 0xbc, 0x0a, 0x00, 0x00, // Offset 2748 (0xabc) + 0xdb, 0x0a, 0x00, 0x00, // Offset 2779 (0xadb) + 0xfa, 0x0a, 0x00, 0x00, // Offset 2810 (0xafa) + 0x18, 0x0b, 0x00, 0x00, // Offset 2840 (0xb18) + 0x3c, 0x0b, 0x00, 0x00, // Offset 2876 (0xb3c) + 0x5f, 0x0b, 0x00, 0x00, // Offset 2911 (0xb5f) + 0x76, 0x0b, 0x00, 0x00, // Offset 2934 (0xb76) + 0xa1, 0x0b, 0x00, 0x00, // Offset 2977 (0xba1) + 0xbe, 0x0b, 0x00, 0x00, // Offset 3006 (0xbbe) + 0xe6, 0x0b, 0x00, 0x00, // Offset 3046 (0xbe6) + 0x0d, 0x0c, 0x00, 0x00, // Offset 3085 (0xc0d) + 0x2f, 0x0c, 0x00, 0x00, // Offset 3119 (0xc2f) + 0x51, 0x0c, 0x00, 0x00, // Offset 3153 (0xc51) + 0x6a, 0x0c, 0x00, 0x00, // Offset 3178 (0xc6a) + 0xa2, 0x0c, 0x00, 0x00, // Offset 3234 (0xca2) + 0xe5, 0x0c, 0x00, 0x00, // Offset 3301 (0xce5) + 0x1e, 0x0d, 0x00, 0x00, // Offset 3358 (0xd1e) + 0x59, 0x0d, 0x00, 0x00, // Offset 3417 (0xd59) + 0xa7, 0x0d, 0x00, 0x00, // Offset 3495 (0xda7) + 0xe0, 0x0d, 0x00, 0x00, // Offset 3552 (0xde0) + 0xe9, 0x0d, 0x00, 0x00, // Offset 3561 (0xde9) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 17, 14, 0, 12, 44, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 0, 12, 64, 27, 17, 0, 14, 119, 23, 114, + 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, + 98, 114, 98, 114, 98, 0, 15, 16, 29, 18, 0, 15, + 103, 66, 162, 66, 162, 66, 162, 66, 162, 51, 162, 52, + 146, 34, 33, 146, 34, 34, 130, 18, 66, 116, 97, 0, + 16, 17, 14, 0, 12, 34, 194, 194, 194, 194, 194, 194, + 194, 194, 204, 0, 12, 64, 28, 19, 0, 16, 82, 104, + 50, 179, 50, 178, 66, 162, 82, 162, 82, 147, 82, 130, + 18, 66, 114, 51, 39, 18, 82, 0, 19, 32, 31, 18, + 0, 14, 70, 66, 240, 18, 89, 34, 240, 18, 240, 18, + 117, 66, 98, 35, 50, 97, 66, 50, 97, 66, 55, 18, + 35, 197, 0, 16, 32, 16, 14, 0, 12, 44, 34, 194, + 194, 194, 194, 194, 194, 204, 0, 14, 32, 23, 17, 0, + 14, 127, 34, 82, 130, 82, 130, 82, 130, 82, 130, 82, + 130, 82, 130, 82, 143, 0, 17, 32, 18, 14, 0, 10, + 76, 194, 194, 194, 194, 44, 34, 194, 194, 194, 204, 0, + 12, 64, 26, 16, 0, 14, 14, 114, 82, 114, 82, 114, + 82, 39, 82, 34, 162, 34, 162, 34, 162, 34, 162, 39, + 82, 0, 14, 32, 34, 17, 0, 14, 119, 23, 114, 17, + 66, 114, 17, 66, 114, 17, 66, 39, 17, 66, 34, 97, + 66, 34, 97, 66, 34, 97, 66, 34, 97, 66, 47, 0, + 15, 16, 34, 17, 0, 14, 119, 18, 50, 114, 18, 50, + 114, 18, 50, 114, 23, 39, 18, 50, 34, 98, 50, 34, + 98, 50, 34, 98, 50, 34, 98, 50, 47, 0, 15, 16, + 28, 19, 0, 16, 87, 66, 178, 66, 178, 66, 178, 66, + 103, 51, 98, 132, 82, 114, 33, 82, 113, 65, 66, 83, + 67, 40, 0, 18, 26, 17, 0, 14, 119, 23, 114, 18, + 194, 18, 194, 18, 119, 23, 34, 98, 114, 98, 114, 98, + 114, 98, 127, 0, 15, 16, 37, 18, 0, 13, 71, 24, + 114, 34, 18, 146, 34, 18, 146, 34, 18, 146, 34, 18, + 71, 34, 18, 66, 114, 18, 66, 114, 18, 66, 114, 18, + 66, 114, 18, 71, 24, 0, 16, 31, 18, 0, 13, 71, + 38, 130, 240, 27, 114, 240, 18, 183, 37, 66, 99, 35, + 34, 98, 66, 34, 98, 66, 34, 99, 35, 40, 21, 0, + 16, 32, 23, 14, 0, 12, 44, 34, 130, 34, 130, 34, + 130, 34, 130, 34, 130, 34, 130, 34, 130, 44, 0, 14, + 32, 25, 14, 0, 12, 34, 130, 34, 130, 34, 130, 44, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 44, 0, + 12, 64, 43, 16, 0, 14, 1, 65, 33, 65, 33, 65, + 33, 65, 33, 65, 33, 65, 38, 38, 33, 65, 33, 65, + 33, 65, 33, 65, 33, 65, 33, 65, 33, 65, 33, 65, + 33, 65, 33, 65, 38, 38, 0, 14, 32, 37, 18, 0, + 15, 97, 65, 66, 97, 65, 66, 97, 65, 66, 102, 66, + 97, 65, 52, 81, 65, 49, 33, 81, 65, 34, 34, 65, + 65, 18, 66, 49, 67, 98, 38, 0, 17, 32, 23, 15, + 0, 12, 2, 210, 210, 210, 195, 196, 162, 18, 146, 50, + 114, 82, 82, 115, 34, 146, 0, 13, 48, 32, 18, 0, + 14, 2, 66, 162, 66, 161, 82, 147, 66, 147, 51, 145, + 18, 36, 114, 36, 34, 82, 67, 50, 50, 82, 82, 33, + 82, 242, 0, 17, 16, 27, 14, 0, 10, 117, 130, 66, + 82, 98, 50, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 50, 98, 82, 66, 118, 0, 12, 112, 21, 17, 0, 12, + 123, 242, 227, 211, 210, 226, 229, 163, 35, 115, 100, 51, + 147, 33, 0, 16, 112, 30, 19, 0, 14, 55, 22, 162, + 82, 146, 82, 161, 98, 146, 82, 148, 51, 130, 35, 20, + 98, 83, 35, 50, 98, 82, 146, 240, 33, 0, 18, 22, + 15, 0, 9, 102, 240, 240, 108, 210, 194, 194, 179, 165, + 132, 35, 68, 99, 33, 177, 0, 13, 48, 18, 14, 0, + 10, 76, 194, 194, 194, 194, 44, 194, 194, 194, 194, 194, + 0, 12, 64, 17, 14, 0, 12, 44, 34, 194, 194, 204, + 34, 194, 194, 194, 204, 0, 12, 64, 27, 16, 0, 12, + 28, 98, 66, 130, 66, 130, 66, 130, 66, 130, 66, 130, + 66, 130, 66, 130, 66, 130, 66, 94, 0, 14, 32, 24, + 15, 0, 9, 103, 240, 240, 93, 240, 240, 86, 130, 82, + 82, 114, 66, 114, 66, 114, 82, 82, 133, 0, 12, 26, + 8, 2, 98, 98, 98, 98, 98, 98, 98, 98, 98, 102, + 34, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 240, + 112, 46, 10, 98, 34, 66, 34, 66, 34, 66, 34, 66, + 34, 66, 34, 66, 34, 66, 34, 66, 34, 66, 40, 34, + 66, 34, 66, 34, 66, 34, 66, 34, 66, 34, 66, 34, + 66, 34, 66, 34, 66, 34, 66, 34, 66, 240, 112, 26, + 8, 2, 98, 98, 98, 98, 98, 98, 102, 34, 98, 98, + 98, 98, 98, 102, 34, 98, 98, 98, 98, 98, 98, 240, + 112, 45, 10, 98, 34, 66, 34, 66, 34, 66, 34, 66, + 34, 66, 34, 66, 40, 34, 66, 34, 66, 34, 66, 34, + 66, 34, 66, 40, 34, 66, 34, 66, 34, 66, 34, 66, + 34, 66, 34, 66, 34, 66, 34, 66, 240, 112, 26, 9, + 82, 114, 114, 114, 114, 114, 114, 114, 114, 114, 39, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 240, 80, + 47, 12, 130, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 38, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 240, 176, 26, + 9, 82, 114, 114, 114, 114, 114, 114, 39, 114, 114, 114, + 114, 114, 39, 114, 114, 114, 114, 114, 114, 114, 114, 240, + 80, 47, 12, 130, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 38, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 38, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 240, 176, + 24, 23, 0, 24, 18, 240, 98, 240, 98, 240, 98, 240, + 98, 240, 98, 240, 98, 240, 98, 207, 6, 0, 20, 48, + 49, 23, 242, 240, 98, 240, 98, 240, 98, 240, 98, 240, + 98, 240, 98, 240, 98, 240, 98, 178, 130, 178, 134, 114, + 130, 178, 130, 178, 130, 178, 130, 178, 97, 18, 110, 18, + 240, 98, 240, 98, 240, 98, 240, 98, 240, 98, 0, 6, + 64, 55, 22, 240, 50, 242, 50, 242, 50, 242, 50, 242, + 50, 242, 50, 242, 50, 242, 50, 242, 50, 130, 82, 50, + 130, 87, 130, 82, 50, 130, 82, 50, 130, 82, 50, 130, + 82, 50, 130, 82, 50, 47, 50, 242, 50, 242, 50, 242, + 50, 242, 50, 242, 50, 0, 5, 96, 50, 20, 240, 18, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 50, 146, 114, 146, 114, 146, 114, 146, 114, + 146, 114, 146, 114, 146, 66, 18, 46, 34, 240, 50, 240, + 50, 240, 50, 240, 50, 240, 50, 240, 240, 192, 25, 23, + 0, 23, 98, 82, 226, 82, 226, 82, 226, 82, 226, 82, + 226, 82, 226, 82, 226, 82, 143, 6, 0, 20, 48, 27, + 23, 0, 25, 127, 6, 178, 240, 98, 240, 98, 240, 98, + 240, 98, 240, 98, 240, 98, 240, 98, 240, 98, 240, 98, + 0, 13, 50, 21, 240, 34, 240, 66, 240, 66, 240, 66, + 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, + 240, 18, 18, 46, 50, 146, 130, 146, 130, 146, 130, 146, + 55, 146, 130, 146, 130, 146, 130, 146, 130, 146, 130, 240, + 66, 240, 240, 224, 69, 23, 240, 66, 240, 18, 50, 240, + 18, 50, 240, 18, 50, 240, 18, 50, 240, 18, 50, 240, + 18, 50, 240, 18, 50, 240, 18, 50, 240, 18, 50, 240, + 18, 50, 45, 18, 50, 130, 98, 50, 130, 98, 50, 130, + 98, 50, 130, 38, 50, 130, 98, 50, 130, 98, 50, 130, + 98, 50, 130, 98, 50, 130, 98, 50, 240, 18, 50, 0, + 6, 51, 21, 240, 34, 240, 66, 240, 66, 240, 66, 240, + 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, + 18, 18, 47, 1, 18, 146, 130, 146, 130, 146, 130, 146, + 130, 146, 130, 146, 130, 146, 130, 146, 130, 146, 130, 240, + 66, 240, 240, 224, 29, 23, 0, 25, 127, 6, 130, 82, + 226, 82, 226, 82, 226, 82, 226, 82, 226, 82, 226, 82, + 226, 82, 226, 82, 226, 82, 0, 12, 64, 9, 23, 0, + 34, 79, 6, 0, 31, 112, 50, 21, 240, 34, 240, 66, + 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, + 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, + 240, 18, 18, 47, 34, 240, 66, 240, 66, 240, 66, 240, + 66, 240, 66, 240, 66, 240, 240, 224, 25, 4, 2, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 160, 4, 26, 0, + 78, 27, 17, 0, 12, 98, 98, 114, 98, 114, 98, 114, + 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 119, + 23, 0, 17, 32, 24, 16, 0, 14, 2, 87, 34, 82, + 114, 82, 114, 82, 114, 82, 114, 82, 114, 82, 114, 82, + 126, 0, 16, 32, 31, 18, 0, 13, 66, 146, 82, 146, + 82, 146, 82, 146, 82, 131, 82, 131, 82, 129, 18, 66, + 114, 33, 66, 98, 50, 58, 66, 146, 97, 0, 16, 33, + 16, 0, 12, 2, 129, 82, 129, 82, 130, 66, 115, 66, + 113, 17, 66, 98, 18, 50, 98, 33, 50, 98, 33, 50, + 82, 50, 41, 65, 151, 0, 14, 32, 40, 22, 0, 19, + 44, 50, 146, 66, 50, 146, 66, 50, 146, 66, 50, 86, + 66, 35, 82, 130, 36, 66, 130, 34, 17, 66, 130, 18, + 34, 50, 130, 17, 66, 39, 52, 81, 225, 0, 17, 80, + 26, 17, 0, 14, 119, 23, 114, 18, 194, 18, 194, 18, + 119, 18, 114, 98, 114, 98, 114, 98, 114, 103, 39, 0, + 16, 16, 49, 22, 0, 16, 70, 18, 18, 50, 146, 18, + 18, 50, 146, 18, 18, 50, 146, 18, 18, 50, 146, 21, + 35, 86, 18, 18, 35, 82, 82, 18, 36, 66, 82, 18, + 33, 33, 66, 82, 18, 18, 34, 50, 82, 20, 66, 45, + 0, 20, 48, 31, 18, 0, 15, 103, 240, 18, 66, 162, + 66, 162, 52, 71, 49, 18, 66, 129, 33, 66, 114, 34, + 50, 113, 50, 50, 113, 65, 63, 1, 0, 16, 32, 18, + 0, 15, 103, 24, 114, 240, 18, 240, 18, 52, 71, 34, + 34, 50, 113, 65, 50, 113, 65, 50, 113, 65, 50, 114, + 34, 56, 36, 0, 16, 32, 43, 16, 0, 14, 6, 18, + 50, 33, 50, 18, 50, 33, 50, 18, 50, 33, 50, 23, + 33, 50, 18, 50, 33, 50, 18, 50, 33, 50, 18, 50, + 33, 50, 18, 50, 33, 50, 18, 50, 38, 23, 0, 14, + 32, 40, 18, 0, 15, 102, 66, 97, 50, 66, 97, 50, + 66, 97, 50, 66, 97, 50, 51, 97, 50, 52, 81, 50, + 49, 18, 81, 50, 34, 34, 65, 50, 18, 66, 54, 18, + 82, 130, 0, 14, 96, 39, 17, 0, 14, 118, 177, 50, + 66, 81, 50, 66, 81, 50, 51, 81, 50, 49, 18, 65, + 50, 49, 18, 65, 50, 34, 34, 49, 50, 33, 50, 49, + 50, 18, 65, 54, 24, 0, 15, 16, 33, 14, 0, 7, + 12, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, + 130, 44, 240, 240, 68, 146, 34, 129, 65, 129, 65, 129, + 50, 148, 0, 7, 96, 34, 16, 0, 14, 2, 57, 34, + 50, 82, 34, 50, 82, 39, 82, 34, 50, 82, 34, 50, + 82, 34, 50, 82, 34, 50, 82, 34, 50, 82, 39, 82, + 0, 14, 32, 35, 17, 0, 14, 114, 50, 23, 34, 50, + 18, 114, 50, 18, 119, 18, 114, 50, 18, 114, 50, 18, + 114, 50, 18, 114, 50, 18, 114, 50, 18, 119, 23, 0, + 15, 16, 51, 20, 0, 15, 2, 34, 50, 146, 34, 50, + 22, 34, 34, 50, 82, 34, 34, 50, 82, 38, 50, 82, + 34, 34, 35, 82, 34, 34, 36, 66, 34, 34, 33, 33, + 66, 34, 34, 18, 34, 50, 34, 34, 17, 66, 34, 40, + 81, 34, 0, 17, 96, 47, 22, 0, 19, 34, 34, 50, + 54, 34, 34, 50, 50, 98, 34, 50, 50, 102, 50, 50, + 98, 34, 35, 50, 98, 34, 36, 34, 98, 34, 36, 34, + 98, 34, 33, 34, 18, 98, 34, 18, 49, 18, 104, 72, + 129, 0, 18, 48, 37, 19, 0, 16, 82, 50, 24, 50, + 50, 98, 66, 50, 98, 71, 82, 82, 50, 82, 82, 50, + 68, 66, 50, 50, 34, 50, 50, 34, 66, 34, 50, 18, + 97, 39, 0, 18, 16, 35, 17, 0, 14, 114, 50, 23, + 34, 50, 18, 114, 50, 18, 119, 18, 114, 50, 23, 34, + 50, 18, 114, 50, 18, 114, 50, 18, 114, 50, 18, 119, + 23, 0, 15, 16, 33, 14, 0, 7, 2, 130, 34, 130, + 34, 130, 44, 34, 130, 34, 130, 34, 130, 44, 240, 240, + 68, 146, 34, 129, 65, 129, 65, 129, 50, 148, 0, 7, + 96, 47, 16, 0, 8, 2, 50, 18, 34, 34, 50, 18, + 34, 34, 50, 18, 34, 39, 22, 34, 50, 18, 34, 34, + 50, 18, 34, 34, 50, 18, 34, 39, 22, 240, 240, 148, + 178, 34, 161, 65, 161, 65, 161, 50, 180, 0, 8, 112, + 31, 17, 0, 15, 50, 39, 98, 114, 98, 114, 98, 114, + 83, 114, 84, 98, 66, 33, 98, 66, 34, 82, 50, 66, + 66, 34, 97, 66, 0, 15, 16, 31, 18, 0, 14, 2, + 50, 178, 50, 178, 50, 178, 50, 163, 50, 163, 50, 164, + 34, 146, 33, 34, 130, 50, 18, 115, 73, 34, 97, 0, + 16, 112, 30, 18, 0, 16, 34, 55, 98, 50, 178, 50, + 178, 50, 163, 50, 164, 34, 161, 33, 34, 146, 34, 18, + 130, 73, 34, 97, 145, 0, 15, 80, 36, 18, 0, 16, + 34, 50, 50, 98, 50, 50, 98, 50, 50, 98, 55, 83, + 50, 50, 84, 34, 50, 66, 18, 34, 50, 66, 34, 18, + 50, 50, 68, 50, 34, 104, 0, 16, 35, 21, 0, 16, + 34, 240, 66, 71, 130, 146, 130, 145, 131, 130, 131, 114, + 148, 99, 114, 33, 82, 18, 97, 50, 50, 50, 66, 66, + 18, 82, 34, 97, 0, 19, 112, 23, 12, 0, 11, 17, + 162, 163, 130, 17, 129, 34, 98, 49, 97, 66, 66, 81, + 66, 82, 42, 0, 10, 96, 43, 17, 0, 15, 19, 98, + 81, 49, 65, 33, 50, 50, 33, 65, 33, 81, 33, 65, + 33, 81, 33, 65, 33, 81, 33, 65, 33, 81, 33, 65, + 33, 66, 33, 65, 49, 49, 65, 33, 83, 98, 0, 15, + 48, 29, 14, 0, 9, 50, 194, 166, 114, 66, 82, 98, + 50, 130, 34, 130, 34, 130, 34, 130, 34, 130, 50, 98, + 82, 66, 132, 0, 11, 32, 40, 20, 0, 15, 50, 240, + 50, 114, 118, 82, 114, 50, 66, 98, 82, 50, 98, 82, + 35, 98, 82, 36, 82, 82, 18, 18, 82, 82, 18, 34, + 82, 50, 18, 66, 85, 18, 98, 0, 17, 96, 39, 18, + 0, 13, 114, 240, 18, 113, 102, 81, 98, 50, 51, 66, + 82, 35, 66, 82, 33, 17, 66, 82, 18, 33, 50, 82, + 18, 33, 50, 84, 50, 50, 50, 18, 65, 69, 39, 0, + 16, 34, 16, 0, 8, 13, 57, 34, 98, 66, 130, 66, + 130, 66, 130, 66, 130, 66, 89, 35, 46, 240, 132, 178, + 34, 161, 65, 161, 65, 161, 50, 180, 0, 8, 112, 34, + 19, 0, 14, 69, 69, 240, 120, 24, 240, 240, 196, 84, + 82, 35, 34, 35, 49, 66, 33, 66, 49, 66, 33, 66, + 50, 35, 34, 35, 68, 84, 0, 17, 16, 25, 15, 0, + 11, 45, 240, 240, 101, 131, 51, 83, 83, 66, 114, 66, + 114, 66, 114, 82, 82, 99, 51, 133, 0, 12, 56, 23, + 240, 240, 130, 240, 98, 240, 98, 240, 98, 240, 98, 240, + 98, 240, 98, 240, 102, 98, 66, 50, 162, 66, 50, 162, + 66, 50, 162, 66, 50, 162, 66, 50, 162, 66, 54, 98, + 66, 17, 18, 110, 18, 108, 50, 240, 98, 240, 98, 240, + 98, 240, 98, 0, 6, 64, 67, 21, 240, 240, 66, 34, + 242, 34, 242, 34, 242, 34, 242, 34, 242, 34, 242, 34, + 82, 34, 65, 18, 17, 82, 34, 66, 34, 82, 34, 66, + 34, 82, 34, 66, 34, 82, 34, 66, 34, 82, 34, 66, + 34, 82, 34, 65, 18, 17, 44, 18, 34, 43, 34, 34, + 242, 34, 242, 34, 242, 34, 242, 34, 240, 66, 240, 240, + 224, 57, 20, 240, 18, 240, 50, 240, 50, 240, 50, 240, + 50, 240, 50, 240, 50, 240, 50, 240, 50, 98, 50, 82, + 98, 50, 82, 98, 50, 82, 98, 50, 82, 98, 50, 82, + 98, 50, 82, 98, 50, 33, 34, 47, 18, 44, 66, 240, + 50, 240, 50, 240, 50, 240, 50, 240, 240, 192, 59, 21, + 240, 33, 240, 82, 240, 66, 240, 66, 240, 66, 240, 66, + 240, 66, 240, 66, 240, 66, 242, 34, 47, 34, 45, 66, + 98, 50, 98, 98, 50, 23, 98, 50, 98, 98, 50, 98, + 98, 50, 98, 98, 50, 23, 98, 50, 98, 98, 50, 98, + 98, 50, 98, 98, 50, 98, 240, 240, 224, 78, 22, 240, + 50, 240, 18, 34, 240, 18, 34, 240, 18, 34, 240, 18, + 34, 240, 18, 34, 240, 18, 34, 240, 18, 34, 240, 18, + 34, 240, 18, 34, 44, 34, 34, 44, 34, 34, 98, 34, + 66, 34, 98, 34, 21, 34, 98, 34, 66, 34, 98, 34, + 66, 34, 98, 34, 66, 34, 98, 34, 21, 34, 98, 34, + 66, 34, 98, 34, 66, 34, 98, 34, 66, 34, 240, 82, + 0, 5, 96, 57, 20, 240, 18, 240, 50, 240, 50, 240, + 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, + 50, 241, 34, 46, 34, 44, 66, 98, 66, 66, 98, 66, + 66, 98, 66, 66, 98, 66, 66, 98, 66, 66, 98, 66, + 66, 98, 66, 66, 98, 66, 66, 240, 50, 240, 240, 192, + 9, 4, 240, 240, 162, 34, 0, 6, 32, 28, 10, 98, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 34, 66, 34, + 66, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 240, + 112, + 0, 0, 0, // Padding + +}; + +tFont *g_psFontWHangulgothic24pt = (tFont *)g_pui8Hangulgothic24pt; diff --git a/third_party/fonts/ofl/fonts/fonthangulgothic24ptb.c b/third_party/fonts/ofl/fonts/fonthangulgothic24ptb.c new file mode 100644 index 0000000..9ffca54 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulgothic24ptb.c @@ -0,0 +1,877 @@ +//***************************************************************************** +// +// fonthangulgothic24ptb.c - Font definition for the 24ptpt Hangulgothic bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulgothic +// Size: 24pt +// Bold: yes +// Italic: no +// Memory usage: 6691 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulgothic24ptb[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 23, + + // + // The height of the font. + // + 25, + + // + // The baseline of the font. + // + 20, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0xd4, 0x0c, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x96, 0x01, 0x00, 0x00, // Offset 406 (0x196) + 0xa2, 0x01, 0x00, 0x00, // Offset 418 (0x1a2) + 0xcb, 0x01, 0x00, 0x00, // Offset 459 (0x1cb) + 0xee, 0x01, 0x00, 0x00, // Offset 494 (0x1ee) + 0x26, 0x02, 0x00, 0x00, // Offset 550 (0x226) + 0x50, 0x02, 0x00, 0x00, // Offset 592 (0x250) + 0x5b, 0x02, 0x00, 0x00, // Offset 603 (0x25b) + 0x76, 0x02, 0x00, 0x00, // Offset 630 (0x276) + 0x91, 0x02, 0x00, 0x00, // Offset 657 (0x291) + 0xa5, 0x02, 0x00, 0x00, // Offset 677 (0x2a5) + 0xba, 0x02, 0x00, 0x00, // Offset 698 (0x2ba) + 0xc4, 0x02, 0x00, 0x00, // Offset 708 (0x2c4) + 0xcd, 0x02, 0x00, 0x00, // Offset 717 (0x2cd) + 0xd6, 0x02, 0x00, 0x00, // Offset 726 (0x2d6) + 0xf1, 0x02, 0x00, 0x00, // Offset 753 (0x2f1) + 0x19, 0x03, 0x00, 0x00, // Offset 793 (0x319) + 0x33, 0x03, 0x00, 0x00, // Offset 819 (0x333) + 0x4d, 0x03, 0x00, 0x00, // Offset 845 (0x34d) + 0x68, 0x03, 0x00, 0x00, // Offset 872 (0x368) + 0x88, 0x03, 0x00, 0x00, // Offset 904 (0x388) + 0xa3, 0x03, 0x00, 0x00, // Offset 931 (0x3a3) + 0xc6, 0x03, 0x00, 0x00, // Offset 966 (0x3c6) + 0xdf, 0x03, 0x00, 0x00, // Offset 991 (0x3df) + 0x05, 0x04, 0x00, 0x00, // Offset 1029 (0x405) + 0x28, 0x04, 0x00, 0x00, // Offset 1064 (0x428) + 0x38, 0x04, 0x00, 0x00, // Offset 1080 (0x438) + 0x48, 0x04, 0x00, 0x00, // Offset 1096 (0x448) + 0x63, 0x04, 0x00, 0x00, // Offset 1123 (0x463) + 0x70, 0x04, 0x00, 0x00, // Offset 1136 (0x470) + 0x8b, 0x04, 0x00, 0x00, // Offset 1163 (0x48b) + 0xa4, 0x04, 0x00, 0x00, // Offset 1188 (0x4a4) + 0xdb, 0x04, 0x00, 0x00, // Offset 1243 (0x4db) + 0x02, 0x05, 0x00, 0x00, // Offset 1282 (0x502) + 0x28, 0x05, 0x00, 0x00, // Offset 1320 (0x528) + 0x42, 0x05, 0x00, 0x00, // Offset 1346 (0x542) + 0x6b, 0x05, 0x00, 0x00, // Offset 1387 (0x56b) + 0x84, 0x05, 0x00, 0x00, // Offset 1412 (0x584) + 0x9d, 0x05, 0x00, 0x00, // Offset 1437 (0x59d) + 0xbf, 0x05, 0x00, 0x00, // Offset 1471 (0x5bf) + 0xe9, 0x05, 0x00, 0x00, // Offset 1513 (0x5e9) + 0x00, 0x06, 0x00, 0x00, // Offset 1536 (0x600) + 0x19, 0x06, 0x00, 0x00, // Offset 1561 (0x619) + 0x42, 0x06, 0x00, 0x00, // Offset 1602 (0x642) + 0x5b, 0x06, 0x00, 0x00, // Offset 1627 (0x65b) + 0x9e, 0x06, 0x00, 0x00, // Offset 1694 (0x69e) + 0xd2, 0x06, 0x00, 0x00, // Offset 1746 (0x6d2) + 0xfb, 0x06, 0x00, 0x00, // Offset 1787 (0x6fb) + 0x1b, 0x07, 0x00, 0x00, // Offset 1819 (0x71b) + 0x48, 0x07, 0x00, 0x00, // Offset 1864 (0x748) + 0x70, 0x07, 0x00, 0x00, // Offset 1904 (0x770) + 0x8a, 0x07, 0x00, 0x00, // Offset 1930 (0x78a) + 0xa3, 0x07, 0x00, 0x00, // Offset 1955 (0x7a3) + 0xcd, 0x07, 0x00, 0x00, // Offset 1997 (0x7cd) + 0xf4, 0x07, 0x00, 0x00, // Offset 2036 (0x7f4) + 0x36, 0x08, 0x00, 0x00, // Offset 2102 (0x836) + 0x5d, 0x08, 0x00, 0x00, // Offset 2141 (0x85d) + 0x7f, 0x08, 0x00, 0x00, // Offset 2175 (0x87f) + 0x98, 0x08, 0x00, 0x00, // Offset 2200 (0x898) + 0xb3, 0x08, 0x00, 0x00, // Offset 2227 (0x8b3) + 0xee, 0x08, 0x00, 0x00, // Offset 2286 (0x8ee) + 0x09, 0x09, 0x00, 0x00, // Offset 2313 (0x909) + 0x24, 0x09, 0x00, 0x00, // Offset 2340 (0x924) + 0x2c, 0x09, 0x00, 0x00, // Offset 2348 (0x92c) + 0x35, 0x09, 0x00, 0x00, // Offset 2357 (0x935) + 0x51, 0x09, 0x00, 0x00, // Offset 2385 (0x951) + 0x76, 0x09, 0x00, 0x00, // Offset 2422 (0x976) + 0x8c, 0x09, 0x00, 0x00, // Offset 2444 (0x98c) + 0xb2, 0x09, 0x00, 0x00, // Offset 2482 (0x9b2) + 0xca, 0x09, 0x00, 0x00, // Offset 2506 (0x9ca) + 0xe3, 0x09, 0x00, 0x00, // Offset 2531 (0x9e3) + 0x07, 0x0a, 0x00, 0x00, // Offset 2567 (0xa07) + 0x2d, 0x0a, 0x00, 0x00, // Offset 2605 (0xa2d) + 0x43, 0x0a, 0x00, 0x00, // Offset 2627 (0xa43) + 0x5c, 0x0a, 0x00, 0x00, // Offset 2652 (0xa5c) + 0x80, 0x0a, 0x00, 0x00, // Offset 2688 (0xa80) + 0x98, 0x0a, 0x00, 0x00, // Offset 2712 (0xa98) + 0xc8, 0x0a, 0x00, 0x00, // Offset 2760 (0xac8) + 0xea, 0x0a, 0x00, 0x00, // Offset 2794 (0xaea) + 0x09, 0x0b, 0x00, 0x00, // Offset 2825 (0xb09) + 0x2c, 0x0b, 0x00, 0x00, // Offset 2860 (0xb2c) + 0x4f, 0x0b, 0x00, 0x00, // Offset 2895 (0xb4f) + 0x65, 0x0b, 0x00, 0x00, // Offset 2917 (0xb65) + 0x7b, 0x0b, 0x00, 0x00, // Offset 2939 (0xb7b) + 0x94, 0x0b, 0x00, 0x00, // Offset 2964 (0xb94) + 0xb6, 0x0b, 0x00, 0x00, // Offset 2998 (0xbb6) + 0xd4, 0x0b, 0x00, 0x00, // Offset 3028 (0xbd4) + 0x05, 0x0c, 0x00, 0x00, // Offset 3077 (0xc05) + 0x22, 0x0c, 0x00, 0x00, // Offset 3106 (0xc22) + 0x41, 0x0c, 0x00, 0x00, // Offset 3137 (0xc41) + 0x56, 0x0c, 0x00, 0x00, // Offset 3158 (0xc56) + 0x71, 0x0c, 0x00, 0x00, // Offset 3185 (0xc71) + 0x8b, 0x0c, 0x00, 0x00, // Offset 3211 (0xc8b) + 0xa6, 0x0c, 0x00, 0x00, // Offset 3238 (0xca6) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 10, 0, 31, 32, 21, 5, 163, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 195, 35, 35, + 240, 112, 12, 8, 240, 22, 38, 38, 38, 38, 38, 0, + 17, 32, 41, 15, 240, 240, 67, 34, 131, 34, 131, 19, + 130, 35, 130, 35, 130, 35, 92, 60, 83, 34, 131, 34, + 131, 19, 92, 60, 98, 35, 130, 34, 131, 34, 131, 34, + 131, 34, 131, 19, 0, 8, 32, 35, 12, 66, 162, 150, + 87, 72, 51, 18, 99, 18, 99, 18, 99, 18, 117, 132, + 148, 148, 133, 118, 98, 19, 98, 19, 98, 19, 33, 53, + 56, 71, 146, 162, 240, 240, 56, 23, 0, 6, 5, 115, + 119, 83, 116, 20, 66, 131, 51, 51, 131, 51, 35, 147, + 51, 35, 148, 20, 19, 183, 35, 197, 35, 240, 82, 53, + 195, 39, 163, 36, 20, 147, 35, 51, 131, 51, 51, 131, + 51, 51, 115, 67, 51, 114, 84, 20, 99, 103, 114, 133, + 0, 12, 42, 18, 240, 240, 181, 184, 163, 36, 131, 67, + 131, 67, 131, 67, 132, 35, 168, 182, 181, 67, 72, 51, + 67, 36, 35, 51, 68, 18, 67, 86, 67, 101, 67, 115, + 99, 70, 109, 103, 36, 0, 9, 32, 11, 5, 163, 35, + 35, 35, 35, 35, 0, 10, 112, 27, 9, 211, 98, 98, + 99, 99, 83, 99, 99, 83, 99, 99, 99, 99, 99, 99, + 99, 115, 99, 99, 115, 99, 114, 115, 115, 32, 27, 9, + 147, 114, 115, 115, 99, 115, 99, 99, 115, 99, 99, 99, + 99, 99, 99, 99, 83, 99, 99, 83, 99, 83, 98, 99, + 96, 20, 12, 0, 9, 66, 162, 113, 34, 121, 42, 85, + 117, 99, 18, 83, 35, 97, 49, 0, 14, 21, 15, 0, + 10, 3, 195, 195, 195, 195, 195, 125, 45, 115, 195, 195, + 195, 195, 195, 0, 12, 16, 10, 7, 0, 17, 84, 51, + 67, 66, 67, 64, 9, 8, 0, 11, 6, 38, 0, 12, + 32, 9, 5, 0, 12, 1, 51, 35, 49, 208, 27, 11, + 240, 211, 131, 130, 131, 131, 131, 115, 131, 131, 130, 131, + 131, 130, 131, 131, 131, 115, 131, 131, 130, 131, 145, 240, + 80, 40, 14, 240, 240, 36, 136, 89, 84, 36, 67, 67, + 51, 99, 35, 99, 35, 99, 35, 99, 35, 99, 35, 99, + 35, 99, 35, 99, 35, 99, 50, 98, 67, 67, 68, 36, + 88, 132, 0, 7, 96, 26, 8, 240, 67, 68, 53, 38, + 34, 19, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 240, 240, 64, 26, 13, 240, 229, 104, + 82, 67, 179, 163, 163, 163, 148, 132, 148, 132, 132, 132, + 148, 132, 132, 132, 155, 43, 0, 6, 96, 27, 13, 240, + 199, 90, 65, 83, 179, 163, 163, 147, 148, 86, 119, 164, + 164, 163, 163, 163, 148, 33, 84, 57, 71, 0, 7, 32, + 32, 15, 240, 240, 131, 180, 165, 165, 150, 131, 19, 130, + 35, 115, 35, 99, 51, 98, 67, 83, 67, 67, 83, 77, + 45, 163, 195, 195, 195, 195, 0, 8, 27, 13, 240, 186, + 58, 51, 163, 163, 163, 163, 168, 89, 65, 84, 164, 163, + 163, 163, 163, 147, 49, 84, 57, 71, 0, 7, 32, 35, + 14, 240, 240, 54, 104, 84, 148, 163, 179, 163, 179, 21, + 90, 68, 67, 52, 83, 35, 99, 35, 99, 35, 99, 35, + 99, 51, 68, 52, 36, 88, 133, 0, 7, 80, 25, 13, + 240, 187, 43, 163, 147, 163, 163, 147, 163, 148, 147, 163, + 147, 163, 163, 147, 163, 147, 163, 163, 0, 7, 64, 38, + 14, 240, 240, 22, 106, 67, 67, 51, 99, 35, 99, 35, + 99, 36, 67, 68, 36, 87, 134, 106, 67, 52, 51, 84, + 35, 99, 35, 99, 35, 99, 51, 67, 88, 118, 0, 7, + 80, 35, 14, 240, 240, 21, 136, 84, 36, 52, 67, 51, + 98, 51, 99, 35, 99, 35, 99, 35, 84, 51, 68, 74, + 85, 19, 179, 163, 179, 164, 148, 88, 102, 0, 7, 112, + 16, 5, 240, 97, 51, 35, 49, 240, 240, 145, 51, 35, + 49, 240, 240, 48, 16, 6, 240, 81, 67, 51, 65, 0, + 7, 35, 51, 51, 50, 51, 240, 192, 27, 13, 240, 114, + 163, 148, 132, 132, 132, 147, 147, 147, 147, 148, 147, 164, + 164, 164, 163, 179, 179, 179, 179, 163, 179, 178, 240, 13, + 15, 0, 15, 13, 45, 0, 7, 109, 45, 0, 17, 16, + 27, 13, 209, 194, 179, 179, 164, 164, 164, 164, 164, 164, + 163, 164, 147, 148, 132, 132, 132, 132, 132, 132, 147, 162, + 177, 240, 160, 25, 11, 240, 118, 88, 49, 67, 147, 131, + 131, 116, 115, 116, 100, 115, 116, 115, 131, 240, 243, 131, + 131, 0, 6, 32, 55, 21, 0, 6, 7, 203, 148, 84, + 116, 116, 84, 52, 36, 67, 45, 36, 20, 36, 19, 35, + 35, 51, 35, 35, 19, 67, 35, 35, 19, 66, 51, 35, + 19, 66, 36, 35, 19, 51, 20, 55, 40, 83, 27, 100, + 20, 20, 132, 132, 100, 85, 139, 199, 0, 11, 64, 39, + 19, 240, 240, 243, 240, 20, 229, 230, 214, 195, 19, 195, + 35, 179, 35, 163, 51, 163, 67, 131, 83, 131, 99, 124, + 109, 99, 131, 67, 147, 67, 162, 67, 163, 35, 179, 0, + 9, 96, 38, 13, 240, 183, 105, 67, 52, 51, 67, 51, + 67, 51, 67, 51, 67, 51, 51, 73, 73, 67, 52, 51, + 68, 35, 83, 35, 83, 35, 83, 35, 83, 35, 67, 57, + 71, 0, 7, 32, 26, 16, 240, 240, 135, 122, 84, 179, + 195, 211, 195, 211, 211, 211, 211, 211, 211, 227, 211, 227, + 228, 218, 135, 0, 8, 48, 41, 16, 240, 240, 40, 138, + 99, 84, 67, 99, 67, 115, 51, 115, 51, 131, 35, 131, + 35, 131, 35, 131, 35, 131, 35, 131, 35, 131, 35, 115, + 51, 115, 51, 99, 67, 68, 90, 103, 0, 9, 16, 25, + 12, 240, 154, 42, 35, 147, 147, 147, 147, 147, 153, 57, + 51, 147, 147, 147, 147, 147, 147, 154, 42, 0, 6, 32, + 25, 11, 240, 121, 41, 35, 131, 131, 131, 131, 131, 137, + 41, 35, 131, 131, 131, 131, 131, 131, 131, 131, 0, 6, + 64, 34, 17, 240, 240, 168, 122, 100, 97, 83, 211, 227, + 211, 227, 227, 227, 87, 35, 87, 35, 147, 35, 147, 51, + 131, 51, 131, 67, 115, 84, 83, 107, 135, 0, 9, 42, + 15, 240, 243, 115, 35, 115, 35, 115, 35, 115, 35, 115, + 35, 115, 35, 115, 35, 115, 45, 45, 35, 115, 35, 115, + 35, 115, 35, 115, 35, 115, 35, 115, 35, 115, 35, 115, + 35, 115, 0, 7, 96, 23, 5, 163, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 240, 112, 25, 9, 240, 115, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 84, 39, + 38, 68, 240, 240, 160, 41, 15, 240, 243, 99, 51, 83, + 67, 68, 67, 67, 83, 51, 99, 35, 115, 20, 115, 19, + 134, 151, 136, 116, 19, 115, 51, 99, 52, 83, 67, 83, + 83, 67, 84, 51, 99, 51, 115, 0, 7, 96, 25, 12, + 240, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 154, 42, 0, 6, 32, 67, + 21, 240, 240, 196, 180, 36, 180, 37, 149, 37, 149, 37, + 149, 38, 118, 35, 18, 114, 19, 35, 19, 83, 19, 35, + 19, 83, 19, 35, 34, 82, 35, 35, 35, 51, 35, 35, + 35, 51, 35, 35, 50, 35, 51, 35, 51, 19, 51, 35, + 66, 18, 67, 35, 69, 67, 35, 69, 67, 35, 83, 83, + 35, 83, 83, 0, 10, 96, 52, 16, 240, 240, 35, 131, + 36, 115, 36, 115, 37, 99, 38, 83, 38, 83, 35, 19, + 67, 35, 19, 67, 35, 35, 51, 35, 50, 51, 35, 51, + 35, 35, 67, 19, 35, 67, 19, 35, 86, 35, 86, 35, + 101, 35, 116, 35, 116, 35, 131, 0, 8, 32, 41, 18, + 240, 240, 182, 170, 116, 68, 84, 99, 83, 131, 67, 131, + 51, 163, 35, 163, 35, 163, 35, 163, 35, 163, 35, 163, + 35, 163, 51, 131, 67, 131, 68, 100, 84, 68, 122, 166, + 0, 9, 112, 32, 13, 240, 184, 90, 51, 67, 51, 83, + 35, 83, 35, 83, 35, 83, 35, 83, 35, 67, 57, 72, + 83, 163, 163, 163, 163, 163, 163, 163, 0, 7, 96, 45, + 18, 240, 240, 182, 170, 116, 68, 84, 99, 83, 131, 67, + 131, 51, 163, 35, 163, 35, 163, 35, 163, 35, 163, 35, + 163, 35, 163, 51, 131, 67, 131, 68, 99, 100, 68, 122, + 167, 240, 19, 244, 243, 240, 19, 48, 40, 14, 240, 216, + 106, 67, 67, 67, 83, 51, 83, 51, 83, 51, 83, 51, + 83, 51, 67, 73, 88, 99, 50, 99, 51, 83, 66, 83, + 67, 67, 82, 67, 83, 51, 83, 51, 99, 0, 7, 32, + 26, 12, 240, 198, 87, 67, 131, 147, 147, 148, 148, 134, + 133, 133, 133, 132, 147, 147, 147, 33, 83, 56, 70, 0, + 6, 96, 25, 15, 240, 253, 45, 115, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 0, 8, 48, 42, 15, 240, 243, 115, 35, 115, 35, 115, + 35, 115, 35, 115, 35, 115, 35, 115, 35, 115, 35, 115, + 35, 115, 35, 115, 35, 115, 35, 115, 35, 115, 35, 115, + 51, 83, 68, 52, 89, 133, 0, 8, 32, 39, 18, 240, + 240, 99, 163, 50, 163, 51, 131, 67, 131, 82, 131, 83, + 99, 99, 99, 114, 99, 115, 67, 131, 67, 146, 66, 163, + 35, 163, 35, 179, 18, 198, 198, 212, 228, 243, 0, 10, + 66, 26, 0, 6, 67, 131, 130, 50, 116, 115, 51, 100, + 115, 51, 101, 99, 51, 101, 98, 82, 83, 18, 83, 83, + 67, 19, 67, 83, 67, 19, 67, 98, 66, 35, 51, 115, + 35, 50, 51, 115, 35, 51, 35, 115, 34, 67, 34, 146, + 19, 82, 19, 150, 86, 150, 86, 149, 101, 180, 116, 180, + 116, 179, 131, 0, 13, 112, 39, 17, 240, 240, 67, 131, + 67, 100, 67, 99, 99, 67, 131, 36, 131, 35, 166, 182, + 196, 212, 212, 198, 164, 19, 147, 35, 131, 67, 115, 83, + 83, 99, 67, 131, 51, 132, 0, 8, 96, 34, 17, 240, + 240, 67, 147, 35, 147, 51, 115, 83, 84, 83, 83, 115, + 51, 131, 51, 147, 19, 167, 181, 211, 227, 227, 227, 227, + 227, 227, 227, 227, 0, 9, 64, 25, 14, 240, 220, 44, + 164, 163, 164, 148, 164, 148, 163, 164, 163, 164, 148, 164, + 148, 163, 164, 172, 44, 0, 7, 32, 27, 7, 117, 37, + 35, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 69, 37, 32, 59, + 23, 0, 8, 99, 83, 83, 82, 83, 82, 98, 83, 82, + 98, 69, 66, 99, 53, 51, 99, 50, 18, 51, 114, 50, + 18, 50, 95, 6, 47, 6, 83, 19, 19, 19, 131, 18, + 50, 19, 146, 18, 50, 18, 165, 50, 18, 165, 53, 164, + 84, 179, 84, 179, 83, 195, 83, 0, 12, 48, 27, 7, + 117, 37, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 37, 37, + 32, 27, 15, 240, 240, 98, 196, 180, 166, 146, 19, 131, + 35, 114, 51, 99, 67, 83, 67, 67, 99, 51, 99, 35, + 130, 0, 20, 112, 8, 15, 0, 41, 45, 45, 240, 32, + 9, 7, 228, 67, 83, 82, 0, 16, 112, 28, 12, 0, + 10, 102, 88, 66, 52, 147, 147, 87, 57, 36, 51, 35, + 67, 35, 67, 35, 52, 35, 52, 57, 68, 19, 0, 6, + 32, 37, 14, 227, 179, 179, 179, 179, 179, 179, 21, 90, + 68, 52, 52, 67, 51, 99, 35, 99, 35, 99, 35, 99, + 35, 99, 35, 99, 36, 67, 53, 36, 58, 67, 21, 0, + 7, 80, 22, 12, 0, 11, 6, 87, 67, 131, 131, 147, + 147, 147, 147, 148, 147, 150, 33, 72, 102, 0, 6, 32, + 38, 14, 240, 131, 179, 179, 179, 179, 179, 85, 19, 74, + 52, 37, 51, 68, 35, 99, 35, 99, 35, 99, 35, 99, + 35, 99, 35, 99, 51, 68, 51, 53, 74, 85, 19, 0, + 7, 32, 24, 13, 0, 11, 101, 119, 83, 51, 66, 83, + 35, 83, 43, 43, 35, 163, 163, 179, 164, 65, 88, 102, + 0, 7, 25, 10, 228, 85, 67, 115, 115, 115, 87, 55, + 83, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 240, 240, 240, 36, 14, 0, 12, 85, 19, 74, 52, 37, + 51, 68, 35, 99, 35, 99, 35, 99, 35, 99, 35, 99, + 35, 99, 51, 68, 52, 37, 74, 85, 19, 178, 66, 83, + 73, 102, 96, 38, 13, 211, 163, 163, 163, 163, 163, 163, + 21, 74, 52, 51, 51, 83, 35, 83, 35, 83, 35, 83, + 35, 83, 35, 83, 35, 83, 35, 83, 35, 83, 35, 83, + 35, 83, 0, 6, 96, 22, 5, 83, 35, 35, 240, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 240, 112, 25, 7, 147, 67, 67, 240, 163, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 36, 51, 64, 36, 13, 211, 163, 163, 163, 163, 163, + 163, 67, 51, 52, 51, 51, 67, 35, 83, 19, 102, 118, + 119, 100, 19, 83, 35, 83, 51, 67, 67, 51, 67, 51, + 83, 0, 6, 96, 24, 5, 83, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 240, 112, 48, 19, 0, 16, 83, 20, 52, 79, + 1, 52, 37, 36, 35, 67, 67, 35, 67, 67, 35, 67, + 67, 35, 67, 67, 35, 67, 67, 35, 67, 67, 35, 67, + 67, 35, 67, 67, 35, 67, 67, 35, 67, 67, 35, 67, + 67, 0, 9, 96, 34, 13, 0, 11, 51, 21, 74, 52, + 51, 51, 83, 35, 83, 35, 83, 35, 83, 35, 83, 35, + 83, 35, 83, 35, 83, 35, 83, 35, 83, 35, 83, 0, + 6, 96, 31, 15, 0, 13, 85, 137, 84, 52, 67, 83, + 51, 115, 35, 115, 35, 115, 35, 115, 35, 115, 35, 115, + 51, 83, 68, 52, 89, 133, 0, 8, 32, 35, 14, 0, + 12, 35, 21, 90, 69, 36, 52, 67, 51, 99, 35, 99, + 35, 99, 35, 99, 35, 99, 35, 99, 36, 67, 53, 36, + 58, 67, 21, 83, 179, 179, 179, 176, 35, 14, 0, 12, + 85, 19, 74, 51, 53, 51, 68, 35, 99, 35, 99, 35, + 99, 35, 99, 35, 99, 35, 99, 51, 68, 51, 53, 74, + 85, 19, 179, 179, 179, 179, 32, 22, 9, 0, 7, 115, + 18, 55, 39, 36, 83, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 240, 240, 192, 22, 11, 0, 9, 118, 71, 51, + 131, 132, 117, 118, 117, 132, 131, 131, 33, 68, 40, 54, + 0, 6, 16, 25, 10, 240, 240, 35, 115, 115, 115, 87, + 55, 83, 115, 115, 115, 115, 115, 115, 115, 115, 118, 85, + 100, 240, 240, 192, 34, 13, 0, 11, 51, 83, 35, 83, + 35, 83, 35, 83, 35, 83, 35, 83, 35, 83, 35, 83, + 35, 83, 35, 83, 35, 68, 51, 52, 58, 69, 19, 0, + 6, 96, 30, 14, 0, 12, 35, 99, 50, 83, 67, 67, + 67, 67, 82, 51, 99, 35, 99, 35, 99, 34, 130, 19, + 134, 133, 164, 164, 163, 0, 7, 112, 49, 22, 0, 19, + 35, 99, 83, 35, 84, 83, 50, 84, 83, 51, 69, 66, + 67, 54, 51, 82, 51, 18, 51, 83, 35, 19, 34, 99, + 34, 35, 19, 114, 19, 50, 19, 118, 50, 18, 133, 69, + 148, 69, 148, 83, 163, 99, 0, 11, 96, 29, 14, 0, + 12, 51, 67, 67, 67, 83, 35, 115, 19, 118, 148, 179, + 164, 150, 134, 115, 35, 99, 51, 67, 67, 51, 99, 0, + 7, 32, 31, 13, 0, 11, 51, 83, 51, 67, 51, 67, + 51, 51, 82, 51, 83, 34, 99, 19, 114, 19, 117, 133, + 148, 147, 163, 163, 162, 178, 133, 132, 128, 21, 12, 0, + 10, 74, 42, 132, 116, 132, 116, 116, 131, 132, 116, 131, + 131, 154, 42, 0, 6, 32, 27, 9, 196, 69, 67, 99, + 99, 99, 99, 99, 99, 99, 84, 68, 84, 100, 99, 99, + 99, 99, 99, 99, 99, 99, 101, 84, 32, 26, 5, 83, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 112, 27, + 8, 131, 84, 99, 83, 83, 83, 83, 83, 83, 83, 83, + 99, 83, 67, 83, 83, 83, 83, 83, 83, 83, 83, 52, + 67, 80, 14, 14, 0, 17, 84, 81, 55, 50, 34, 55, + 148, 0, 19, 80, + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x90, 0x01, 0x00, 0x00, // Offset 400 (0x190) + 0xa9, 0x01, 0x00, 0x00, // Offset 425 (0x1a9) + 0xc5, 0x01, 0x00, 0x00, // Offset 453 (0x1c5) + 0xd5, 0x01, 0x00, 0x00, // Offset 469 (0x1d5) + 0xef, 0x01, 0x00, 0x00, // Offset 495 (0x1ef) + 0x0d, 0x02, 0x00, 0x00, // Offset 525 (0x20d) + 0x1d, 0x02, 0x00, 0x00, // Offset 541 (0x21d) + 0x35, 0x02, 0x00, 0x00, // Offset 565 (0x235) + 0x46, 0x02, 0x00, 0x00, // Offset 582 (0x246) + 0x60, 0x02, 0x00, 0x00, // Offset 608 (0x260) + 0x80, 0x02, 0x00, 0x00, // Offset 640 (0x280) + 0x9e, 0x02, 0x00, 0x00, // Offset 670 (0x29e) + 0xbb, 0x02, 0x00, 0x00, // Offset 699 (0x2bb) + 0xd6, 0x02, 0x00, 0x00, // Offset 726 (0x2d6) + 0xf4, 0x02, 0x00, 0x00, // Offset 756 (0x2f4) + 0x0d, 0x03, 0x00, 0x00, // Offset 781 (0x30d) + 0x22, 0x03, 0x00, 0x00, // Offset 802 (0x322) + 0x37, 0x03, 0x00, 0x00, // Offset 823 (0x337) + 0x5d, 0x03, 0x00, 0x00, // Offset 861 (0x35d) + 0x7f, 0x03, 0x00, 0x00, // Offset 895 (0x37f) + 0x95, 0x03, 0x00, 0x00, // Offset 917 (0x395) + 0xb3, 0x03, 0x00, 0x00, // Offset 947 (0x3b3) + 0xca, 0x03, 0x00, 0x00, // Offset 970 (0x3ca) + 0xdc, 0x03, 0x00, 0x00, // Offset 988 (0x3dc) + 0xf7, 0x03, 0x00, 0x00, // Offset 1015 (0x3f7) + 0x0b, 0x04, 0x00, 0x00, // Offset 1035 (0x40b) + 0x1c, 0x04, 0x00, 0x00, // Offset 1052 (0x41c) + 0x2d, 0x04, 0x00, 0x00, // Offset 1069 (0x42d) + 0x42, 0x04, 0x00, 0x00, // Offset 1090 (0x442) + 0x5a, 0x04, 0x00, 0x00, // Offset 1114 (0x45a) + 0x74, 0x04, 0x00, 0x00, // Offset 1140 (0x474) + 0xa2, 0x04, 0x00, 0x00, // Offset 1186 (0x4a2) + 0xbc, 0x04, 0x00, 0x00, // Offset 1212 (0x4bc) + 0xe8, 0x04, 0x00, 0x00, // Offset 1256 (0x4e8) + 0x02, 0x05, 0x00, 0x00, // Offset 1282 (0x502) + 0x33, 0x05, 0x00, 0x00, // Offset 1331 (0x533) + 0x4d, 0x05, 0x00, 0x00, // Offset 1357 (0x54d) + 0x7d, 0x05, 0x00, 0x00, // Offset 1405 (0x57d) + 0x93, 0x05, 0x00, 0x00, // Offset 1427 (0x593) + 0xc7, 0x05, 0x00, 0x00, // Offset 1479 (0x5c7) + 0xff, 0x05, 0x00, 0x00, // Offset 1535 (0x5ff) + 0x33, 0x06, 0x00, 0x00, // Offset 1587 (0x633) + 0x4a, 0x06, 0x00, 0x00, // Offset 1610 (0x64a) + 0x64, 0x06, 0x00, 0x00, // Offset 1636 (0x664) + 0x97, 0x06, 0x00, 0x00, // Offset 1687 (0x697) + 0xe0, 0x06, 0x00, 0x00, // Offset 1760 (0x6e0) + 0x15, 0x07, 0x00, 0x00, // Offset 1813 (0x715) + 0x2f, 0x07, 0x00, 0x00, // Offset 1839 (0x72f) + 0x3a, 0x07, 0x00, 0x00, // Offset 1850 (0x73a) + 0x70, 0x07, 0x00, 0x00, // Offset 1904 (0x770) + 0x8a, 0x07, 0x00, 0x00, // Offset 1930 (0x78a) + 0x8f, 0x07, 0x00, 0x00, // Offset 1935 (0x78f) + 0xa6, 0x07, 0x00, 0x00, // Offset 1958 (0x7a6) + 0xbf, 0x07, 0x00, 0x00, // Offset 1983 (0x7bf) + 0xda, 0x07, 0x00, 0x00, // Offset 2010 (0x7da) + 0xf6, 0x07, 0x00, 0x00, // Offset 2038 (0x7f6) + 0x1c, 0x08, 0x00, 0x00, // Offset 2076 (0x81c) + 0x35, 0x08, 0x00, 0x00, // Offset 2101 (0x835) + 0x5b, 0x08, 0x00, 0x00, // Offset 2139 (0x85b) + 0x77, 0x08, 0x00, 0x00, // Offset 2167 (0x877) + 0x95, 0x08, 0x00, 0x00, // Offset 2197 (0x895) + 0xb8, 0x08, 0x00, 0x00, // Offset 2232 (0x8b8) + 0xd9, 0x08, 0x00, 0x00, // Offset 2265 (0x8d9) + 0xfa, 0x08, 0x00, 0x00, // Offset 2298 (0x8fa) + 0x1b, 0x09, 0x00, 0x00, // Offset 2331 (0x91b) + 0x39, 0x09, 0x00, 0x00, // Offset 2361 (0x939) + 0x57, 0x09, 0x00, 0x00, // Offset 2391 (0x957) + 0x7f, 0x09, 0x00, 0x00, // Offset 2431 (0x97f) + 0xa5, 0x09, 0x00, 0x00, // Offset 2469 (0x9a5) + 0xc4, 0x09, 0x00, 0x00, // Offset 2500 (0x9c4) + 0xe2, 0x09, 0x00, 0x00, // Offset 2530 (0x9e2) + 0x03, 0x0a, 0x00, 0x00, // Offset 2563 (0xa03) + 0x32, 0x0a, 0x00, 0x00, // Offset 2610 (0xa32) + 0x4e, 0x0a, 0x00, 0x00, // Offset 2638 (0xa4e) + 0x6a, 0x0a, 0x00, 0x00, // Offset 2666 (0xa6a) + 0x85, 0x0a, 0x00, 0x00, // Offset 2693 (0xa85) + 0xa3, 0x0a, 0x00, 0x00, // Offset 2723 (0xaa3) + 0xc0, 0x0a, 0x00, 0x00, // Offset 2752 (0xac0) + 0xd5, 0x0a, 0x00, 0x00, // Offset 2773 (0xad5) + 0xf4, 0x0a, 0x00, 0x00, // Offset 2804 (0xaf4) + 0x0d, 0x0b, 0x00, 0x00, // Offset 2829 (0xb0d) + 0x30, 0x0b, 0x00, 0x00, // Offset 2864 (0xb30) + 0x54, 0x0b, 0x00, 0x00, // Offset 2900 (0xb54) + 0x75, 0x0b, 0x00, 0x00, // Offset 2933 (0xb75) + 0x98, 0x0b, 0x00, 0x00, // Offset 2968 (0xb98) + 0xad, 0x0b, 0x00, 0x00, // Offset 2989 (0xbad) + 0xe7, 0x0b, 0x00, 0x00, // Offset 3047 (0xbe7) + 0x23, 0x0c, 0x00, 0x00, // Offset 3107 (0xc23) + 0x5e, 0x0c, 0x00, 0x00, // Offset 3166 (0xc5e) + 0x99, 0x0c, 0x00, 0x00, // Offset 3225 (0xc99) + 0xea, 0x0c, 0x00, 0x00, // Offset 3306 (0xcea) + 0x26, 0x0d, 0x00, 0x00, // Offset 3366 (0xd26) + 0x31, 0x0d, 0x00, 0x00, // Offset 3377 (0xd31) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 16, 16, 0, 16, 14, 46, 211, 211, 211, 211, 211, 211, + 211, 0, 16, 32, 25, 18, 0, 18, 8, 23, 40, 23, + 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, + 115, 83, 0, 18, 32, 28, 21, 0, 21, 8, 82, 104, + 82, 179, 82, 179, 68, 163, 68, 163, 54, 147, 20, 35, + 131, 19, 67, 115, 18, 97, 0, 21, 48, 16, 16, 0, + 16, 3, 211, 211, 211, 211, 211, 211, 222, 46, 0, 16, + 32, 26, 19, 0, 19, 3, 88, 51, 88, 51, 163, 51, + 147, 67, 131, 83, 117, 67, 103, 59, 51, 39, 18, 82, + 0, 19, 32, 30, 19, 0, 17, 102, 214, 67, 240, 19, + 74, 35, 74, 35, 240, 19, 116, 83, 82, 51, 51, 82, + 66, 58, 51, 56, 23, 213, 0, 14, 96, 16, 16, 0, + 16, 13, 61, 51, 211, 211, 211, 211, 222, 46, 0, 16, + 32, 24, 18, 0, 18, 15, 1, 47, 1, 35, 83, 115, + 83, 115, 83, 115, 83, 115, 83, 127, 1, 63, 0, 18, + 32, 17, 16, 0, 16, 13, 61, 211, 211, 61, 61, 51, + 211, 222, 46, 0, 14, 32, 26, 18, 0, 18, 15, 1, + 47, 1, 115, 83, 115, 83, 40, 83, 40, 83, 35, 163, + 35, 163, 40, 83, 40, 83, 0, 16, 32, 18, 0, 18, + 8, 23, 40, 23, 115, 19, 19, 115, 19, 19, 40, 19, + 19, 40, 19, 19, 35, 99, 19, 35, 99, 19, 40, 23, + 40, 23, 0, 16, 30, 18, 0, 18, 8, 18, 50, 40, + 18, 50, 115, 18, 50, 115, 23, 40, 23, 40, 18, 50, + 35, 98, 50, 40, 23, 40, 23, 0, 18, 32, 29, 20, + 0, 20, 8, 66, 104, 66, 179, 66, 179, 66, 104, 52, + 88, 52, 83, 118, 67, 99, 35, 60, 51, 40, 18, 81, + 0, 17, 112, 27, 19, 0, 19, 8, 24, 40, 24, 115, + 19, 195, 19, 120, 24, 40, 24, 35, 99, 115, 99, 120, + 24, 40, 24, 0, 16, 112, 30, 19, 0, 19, 15, 2, + 47, 2, 115, 34, 34, 131, 34, 34, 56, 34, 34, 56, + 34, 34, 51, 114, 34, 51, 89, 47, 2, 40, 0, 18, + 25, 19, 0, 17, 118, 56, 38, 56, 240, 28, 124, 40, + 184, 37, 67, 99, 34, 59, 66, 43, 50, 213, 0, 17, + 16, 21, 15, 0, 15, 13, 45, 35, 115, 35, 115, 35, + 115, 35, 115, 35, 115, 45, 45, 0, 15, 32, 21, 15, + 0, 15, 3, 115, 35, 115, 35, 115, 45, 45, 35, 115, + 35, 115, 45, 45, 0, 15, 32, 38, 18, 0, 18, 3, + 35, 19, 34, 35, 35, 19, 34, 35, 35, 19, 34, 40, + 23, 40, 23, 35, 35, 19, 34, 35, 35, 19, 34, 35, + 35, 19, 34, 40, 23, 40, 23, 0, 16, 34, 19, 0, + 19, 2, 35, 66, 98, 35, 66, 98, 35, 66, 103, 66, + 103, 52, 82, 35, 52, 82, 35, 38, 66, 35, 19, 35, + 59, 51, 39, 18, 81, 0, 17, 22, 19, 0, 19, 115, + 240, 19, 244, 245, 211, 19, 180, 20, 133, 53, 70, 101, + 36, 147, 0, 19, 48, 30, 18, 0, 18, 67, 51, 147, + 51, 147, 51, 132, 51, 132, 36, 118, 21, 84, 25, 52, + 52, 20, 35, 52, 51, 131, 240, 17, 0, 14, 96, 23, + 16, 0, 16, 70, 138, 84, 68, 51, 116, 35, 131, 35, + 131, 35, 131, 51, 84, 90, 134, 0, 14, 96, 18, 18, + 0, 18, 29, 93, 227, 212, 197, 184, 126, 54, 85, 35, + 177, 0, 18, 48, 27, 17, 0, 17, 22, 22, 70, 22, + 115, 67, 114, 82, 116, 51, 102, 20, 83, 41, 35, 67, + 35, 34, 52, 81, 130, 0, 16, 20, 19, 0, 17, 39, + 199, 240, 206, 94, 228, 213, 184, 111, 2, 38, 101, 33, + 0, 18, 112, 17, 16, 0, 16, 29, 61, 211, 211, 211, + 46, 46, 211, 211, 211, 0, 14, 32, 17, 15, 0, 15, + 13, 45, 35, 195, 205, 45, 35, 195, 205, 45, 0, 13, + 48, 21, 17, 0, 17, 30, 62, 83, 51, 131, 51, 131, + 51, 131, 51, 131, 51, 95, 47, 0, 17, 32, 24, 16, + 0, 12, 71, 151, 94, 46, 240, 133, 153, 100, 52, 83, + 83, 83, 83, 84, 52, 105, 149, 0, 12, 96, 26, 9, + 147, 99, 99, 99, 99, 99, 99, 99, 99, 103, 39, 35, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 240, + 46, 10, 163, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 40, 40, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 115, 192, 26, 9, + 147, 99, 99, 99, 99, 99, 103, 39, 35, 99, 99, 99, + 99, 103, 39, 35, 99, 99, 99, 99, 99, 99, 99, 240, + 44, 10, 163, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 40, 40, 35, 35, 35, 35, 35, 35, 35, 35, + 40, 40, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 115, 192, 26, 10, 243, 115, + 115, 115, 115, 115, 115, 115, 115, 40, 40, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 192, 49, 14, + 240, 131, 99, 35, 99, 35, 99, 35, 99, 35, 99, 35, + 99, 35, 99, 35, 39, 35, 39, 35, 99, 35, 99, 35, + 99, 35, 99, 35, 99, 35, 99, 35, 99, 35, 99, 35, + 99, 35, 99, 35, 99, 35, 99, 35, 179, 240, 16, 26, + 10, 243, 115, 115, 115, 115, 115, 40, 40, 115, 115, 115, + 115, 40, 40, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 192, 48, 12, 240, 67, 83, 19, 83, 19, 83, 19, 83, + 19, 83, 19, 38, 19, 38, 19, 83, 19, 83, 19, 83, + 19, 83, 19, 38, 19, 38, 19, 83, 19, 83, 19, 83, + 19, 83, 19, 83, 19, 83, 19, 83, 19, 83, 19, 147, + 224, 22, 24, 0, 31, 19, 240, 99, 240, 99, 240, 99, + 240, 99, 240, 99, 207, 7, 47, 7, 0, 21, 32, 52, + 24, 240, 240, 163, 240, 99, 240, 99, 240, 99, 240, 99, + 240, 99, 240, 99, 240, 99, 240, 99, 240, 99, 179, 118, + 131, 118, 131, 115, 179, 115, 179, 115, 179, 81, 19, 95, + 19, 95, 19, 240, 99, 240, 99, 240, 99, 240, 99, 240, + 99, 240, 224, 56, 23, 240, 240, 179, 243, 35, 243, 35, + 243, 35, 243, 35, 243, 35, 243, 35, 243, 35, 243, 35, + 243, 35, 248, 115, 88, 115, 83, 35, 115, 83, 35, 115, + 83, 35, 115, 83, 35, 47, 1, 35, 44, 19, 35, 243, + 35, 243, 35, 243, 35, 243, 35, 240, 83, 240, 160, 52, + 21, 240, 240, 115, 240, 51, 240, 51, 240, 51, 240, 51, + 240, 51, 240, 51, 240, 51, 240, 51, 240, 51, 131, 115, + 131, 115, 131, 115, 131, 115, 131, 115, 131, 66, 19, 47, + 19, 47, 19, 240, 51, 240, 51, 240, 51, 240, 51, 240, + 51, 240, 128, 23, 24, 0, 33, 99, 67, 227, 67, 227, + 67, 227, 67, 227, 67, 227, 67, 143, 7, 47, 7, 0, + 18, 32, 26, 24, 0, 27, 15, 7, 47, 7, 179, 240, + 99, 240, 99, 240, 99, 240, 99, 240, 99, 240, 99, 240, + 99, 0, 19, 64, 51, 21, 240, 240, 115, 240, 51, 240, + 51, 240, 51, 240, 51, 240, 51, 240, 51, 240, 51, 240, + 51, 240, 51, 240, 51, 240, 51, 240, 51, 47, 4, 46, + 35, 131, 115, 131, 40, 131, 40, 131, 115, 131, 115, 131, + 115, 131, 115, 131, 115, 240, 128, 73, 23, 240, 240, 115, + 19, 240, 19, 19, 240, 19, 19, 240, 19, 19, 240, 19, + 19, 240, 19, 19, 240, 19, 19, 240, 19, 19, 240, 19, + 19, 240, 19, 19, 240, 19, 19, 240, 19, 19, 45, 19, + 19, 45, 19, 19, 115, 99, 19, 115, 39, 19, 115, 39, + 19, 115, 99, 19, 115, 99, 19, 115, 99, 19, 115, 99, + 19, 240, 19, 19, 240, 83, 240, 160, 53, 22, 240, 240, + 147, 240, 67, 240, 67, 240, 67, 240, 67, 240, 67, 240, + 67, 240, 67, 240, 67, 240, 67, 240, 67, 240, 67, 240, + 33, 19, 47, 1, 19, 47, 35, 147, 115, 147, 115, 147, + 115, 147, 115, 147, 115, 147, 115, 147, 115, 240, 67, 240, + 144, 26, 24, 0, 27, 15, 7, 47, 7, 131, 67, 227, + 67, 227, 67, 227, 67, 227, 67, 227, 67, 227, 67, 227, + 67, 0, 19, 11, 24, 0, 36, 15, 7, 47, 7, 0, + 33, 32, 54, 22, 240, 240, 147, 240, 67, 240, 67, 240, + 67, 240, 67, 240, 67, 240, 67, 240, 67, 240, 67, 240, + 67, 240, 67, 240, 67, 240, 67, 240, 67, 240, 67, 240, + 33, 19, 47, 1, 19, 47, 1, 19, 240, 67, 240, 67, + 240, 67, 240, 67, 240, 67, 240, 144, 26, 5, 83, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 112, 5, 26, + 0, 81, 32, 23, 18, 0, 20, 35, 83, 115, 83, 115, + 83, 115, 83, 115, 83, 115, 83, 119, 24, 39, 24, 0, + 18, 32, 25, 18, 0, 18, 3, 88, 35, 88, 35, 83, + 115, 83, 115, 83, 115, 83, 115, 83, 119, 24, 39, 24, + 0, 18, 32, 27, 19, 0, 19, 3, 130, 99, 130, 99, + 130, 99, 130, 99, 116, 83, 117, 67, 99, 19, 59, 36, + 39, 18, 67, 0, 19, 32, 28, 19, 0, 19, 3, 130, + 99, 130, 99, 116, 83, 116, 83, 98, 34, 67, 98, 34, + 67, 82, 66, 55, 24, 63, 2, 0, 19, 32, 38, 22, + 0, 22, 6, 21, 50, 86, 21, 50, 146, 66, 50, 146, + 66, 50, 86, 66, 51, 70, 66, 36, 66, 130, 37, 50, + 49, 66, 19, 19, 38, 69, 50, 51, 145, 0, 20, 32, + 25, 19, 0, 19, 8, 24, 40, 24, 115, 19, 195, 19, + 120, 19, 120, 19, 115, 99, 120, 24, 40, 24, 0, 19, + 32, 38, 22, 0, 22, 6, 18, 34, 34, 86, 18, 34, + 34, 146, 18, 34, 34, 146, 22, 34, 86, 22, 20, 70, + 18, 34, 20, 66, 82, 40, 54, 24, 35, 38, 23, 66, + 0, 22, 32, 28, 20, 0, 20, 8, 66, 104, 67, 163, + 52, 163, 53, 72, 35, 18, 72, 34, 35, 51, 99, 50, + 56, 25, 47, 3, 0, 20, 32, 30, 19, 0, 19, 15, + 2, 47, 2, 115, 240, 19, 52, 72, 23, 56, 18, 51, + 35, 83, 51, 35, 98, 51, 47, 1, 57, 21, 0, 17, + 16, 35, 18, 0, 18, 8, 18, 35, 40, 18, 35, 35, + 35, 18, 35, 35, 35, 23, 35, 35, 23, 35, 35, 18, + 35, 35, 35, 18, 35, 40, 23, 40, 23, 0, 18, 32, + 33, 20, 0, 20, 8, 66, 104, 66, 99, 35, 66, 99, + 35, 67, 83, 35, 52, 83, 35, 53, 67, 35, 35, 19, + 56, 19, 36, 40, 18, 67, 0, 20, 32, 33, 20, 0, + 20, 8, 66, 104, 66, 99, 35, 52, 83, 35, 52, 83, + 35, 35, 18, 67, 35, 34, 34, 67, 35, 19, 50, 56, + 24, 63, 3, 0, 20, 32, 33, 17, 0, 8, 79, 47, + 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, 47, 47, + 240, 240, 195, 213, 178, 50, 162, 50, 162, 50, 181, 211, + 0, 7, 48, 30, 18, 0, 18, 3, 34, 24, 35, 34, + 24, 35, 34, 99, 39, 99, 39, 99, 35, 34, 99, 35, + 34, 99, 39, 99, 39, 99, 0, 18, 32, 30, 19, 0, + 19, 3, 34, 40, 35, 34, 40, 35, 34, 35, 119, 35, + 119, 35, 115, 34, 35, 115, 34, 35, 119, 40, 39, 40, + 0, 19, 32, 40, 19, 0, 19, 2, 34, 50, 21, 34, + 34, 50, 21, 34, 34, 50, 66, 38, 50, 66, 38, 36, + 50, 34, 34, 36, 50, 34, 34, 19, 18, 34, 41, 35, + 18, 40, 65, 34, 0, 19, 32, 38, 21, 0, 21, 2, + 34, 50, 53, 34, 34, 50, 53, 34, 34, 50, 50, 86, + 50, 50, 86, 36, 34, 82, 34, 37, 18, 82, 34, 19, + 21, 89, 55, 38, 17, 101, 0, 21, 32, 31, 19, 0, + 19, 2, 35, 24, 50, 35, 24, 50, 35, 99, 55, 83, + 71, 68, 66, 35, 53, 66, 35, 39, 60, 35, 39, 18, + 82, 0, 19, 32, 30, 19, 0, 19, 3, 35, 24, 35, + 35, 24, 35, 35, 19, 120, 19, 120, 24, 35, 35, 24, + 35, 35, 19, 120, 24, 40, 24, 0, 19, 32, 33, 17, + 0, 8, 67, 147, 35, 147, 47, 47, 35, 147, 35, 147, + 35, 147, 47, 47, 240, 240, 180, 198, 163, 35, 146, 66, + 147, 35, 166, 196, 0, 7, 48, 47, 18, 0, 9, 2, + 50, 34, 50, 34, 50, 34, 50, 39, 39, 39, 39, 34, + 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, 39, + 39, 39, 39, 240, 240, 228, 214, 179, 35, 162, 66, 163, + 35, 182, 212, 0, 7, 96, 28, 18, 0, 18, 66, 40, + 98, 40, 98, 115, 99, 99, 84, 99, 85, 83, 67, 19, + 67, 36, 36, 51, 50, 81, 67, 0, 18, 32, 28, 19, + 0, 19, 50, 83, 146, 83, 146, 83, 146, 83, 132, 67, + 133, 51, 118, 51, 99, 35, 39, 34, 67, 23, 33, 97, + 0, 18, 27, 19, 0, 19, 50, 72, 82, 72, 82, 67, + 162, 67, 148, 51, 149, 35, 131, 19, 19, 115, 44, 34, + 66, 24, 0, 19, 32, 30, 19, 0, 19, 50, 67, 50, + 82, 67, 50, 82, 67, 50, 82, 72, 68, 56, 69, 35, + 50, 54, 35, 50, 35, 44, 34, 75, 145, 0, 18, 29, + 21, 0, 21, 66, 72, 114, 72, 114, 147, 115, 115, 116, + 99, 133, 69, 99, 19, 40, 36, 50, 20, 35, 50, 114, + 97, 0, 21, 32, 21, 15, 0, 13, 98, 211, 180, 181, + 147, 19, 115, 50, 114, 67, 83, 83, 60, 61, 0, 15, + 32, 31, 22, 0, 22, 52, 100, 104, 40, 52, 35, 20, + 36, 35, 70, 67, 35, 70, 67, 35, 70, 67, 36, 40, + 36, 56, 40, 100, 100, 0, 22, 80, 25, 13, 0, 8, + 83, 163, 163, 135, 89, 52, 51, 51, 83, 35, 83, 35, + 83, 35, 83, 51, 51, 72, 117, 0, 12, 35, 21, 0, + 18, 99, 114, 147, 114, 134, 82, 120, 66, 100, 36, 36, + 83, 67, 36, 83, 67, 37, 67, 67, 19, 19, 52, 39, + 36, 56, 18, 66, 100, 0, 20, 16, 36, 21, 0, 18, + 99, 240, 51, 114, 133, 98, 118, 84, 83, 35, 68, 82, + 66, 50, 34, 66, 66, 50, 34, 66, 66, 34, 66, 51, + 35, 40, 70, 42, 68, 0, 20, 32, 33, 19, 0, 7, + 47, 79, 115, 51, 163, 51, 163, 51, 163, 51, 111, 2, + 47, 2, 0, 10, 83, 245, 210, 50, 194, 50, 194, 50, + 213, 243, 0, 8, 32, 35, 21, 0, 18, 86, 54, 102, + 54, 240, 169, 25, 41, 25, 240, 165, 85, 83, 34, 50, + 35, 66, 66, 18, 67, 51, 35, 19, 36, 55, 55, 85, + 85, 0, 16, 32, 21, 15, 0, 13, 29, 45, 240, 240, + 101, 137, 84, 52, 67, 83, 68, 52, 89, 133, 0, 13, + 112, 58, 25, 240, 240, 179, 240, 115, 240, 115, 240, 115, + 240, 115, 240, 115, 240, 115, 240, 115, 240, 119, 240, 55, + 240, 51, 147, 35, 83, 147, 35, 83, 147, 35, 87, 83, + 35, 87, 83, 35, 34, 19, 111, 19, 110, 35, 240, 115, + 240, 115, 240, 115, 240, 115, 240, 115, 240, 240, 16, 60, + 22, 240, 240, 83, 19, 243, 19, 243, 19, 243, 19, 243, + 19, 243, 19, 243, 19, 247, 247, 243, 19, 243, 19, 67, + 35, 51, 19, 67, 35, 55, 67, 35, 55, 67, 35, 51, + 19, 67, 35, 36, 19, 47, 1, 19, 47, 1, 19, 243, + 19, 243, 19, 243, 19, 243, 19, 240, 67, 240, 144, 59, + 22, 240, 240, 147, 240, 67, 240, 67, 240, 67, 240, 67, + 240, 67, 240, 67, 240, 67, 240, 67, 240, 67, 240, 67, + 99, 35, 83, 99, 35, 83, 99, 35, 83, 99, 35, 83, + 99, 35, 19, 19, 47, 1, 19, 47, 1, 19, 240, 67, + 240, 67, 240, 67, 240, 67, 240, 67, 240, 144, 59, 21, + 240, 240, 115, 240, 51, 240, 51, 240, 51, 240, 51, 240, + 51, 240, 51, 240, 51, 240, 51, 240, 51, 240, 51, 240, + 51, 47, 4, 46, 35, 67, 35, 99, 67, 35, 24, 67, + 35, 24, 67, 35, 99, 67, 35, 99, 67, 35, 24, 67, + 35, 24, 67, 35, 99, 240, 51, 240, 128, 81, 23, 240, + 240, 115, 19, 240, 19, 19, 240, 19, 19, 240, 19, 19, + 240, 19, 19, 240, 19, 19, 240, 19, 19, 240, 19, 19, + 240, 19, 19, 240, 19, 19, 240, 19, 19, 240, 19, 19, + 45, 19, 19, 44, 35, 19, 67, 19, 23, 19, 67, 19, + 23, 19, 67, 19, 83, 19, 67, 19, 83, 19, 67, 19, + 23, 19, 67, 19, 23, 19, 67, 19, 83, 19, 67, 19, + 83, 19, 240, 83, 240, 160, 60, 22, 240, 240, 147, 240, + 67, 240, 67, 240, 67, 240, 67, 240, 67, 240, 67, 240, + 67, 240, 67, 240, 67, 240, 67, 240, 67, 240, 33, 19, + 47, 1, 19, 47, 35, 99, 35, 83, 99, 35, 83, 99, + 35, 83, 99, 35, 83, 99, 35, 83, 99, 35, 83, 99, + 35, 83, 240, 67, 240, 144, 11, 6, 0, 8, 50, 52, + 36, 50, 0, 7, 112, 30, 11, 240, 35, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 35, 51, 36, 35, 51, 35, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 208, + 0, // Padding + +}; + +tFont *g_psFontWHangulgothic24ptb = (tFont *)g_pui8Hangulgothic24ptb; diff --git a/third_party/fonts/ofl/fonts/fonthangulmyeongjo16pt.c b/third_party/fonts/ofl/fonts/fonthangulmyeongjo16pt.c new file mode 100644 index 0000000..bddfe3b --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulmyeongjo16pt.c @@ -0,0 +1,756 @@ +//***************************************************************************** +// +// fonthangulmyeongjo16pt.c - Font definition for the 16ptpt Hangulmyeongjo font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulmyeongjo +// Size: 16pt +// Bold: no +// Italic: no +// Memory usage: 5212 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulmyeongjo16pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 15, + + // + // The height of the font. + // + 20, + + // + // The baseline of the font. + // + 15, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0xac, 0x09, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x90, 0x01, 0x00, 0x00, // Offset 400 (0x190) + 0x9d, 0x01, 0x00, 0x00, // Offset 413 (0x19d) + 0xb9, 0x01, 0x00, 0x00, // Offset 441 (0x1b9) + 0xd7, 0x01, 0x00, 0x00, // Offset 471 (0x1d7) + 0x01, 0x02, 0x00, 0x00, // Offset 513 (0x201) + 0x22, 0x02, 0x00, 0x00, // Offset 546 (0x222) + 0x2b, 0x02, 0x00, 0x00, // Offset 555 (0x22b) + 0x3e, 0x02, 0x00, 0x00, // Offset 574 (0x23e) + 0x50, 0x02, 0x00, 0x00, // Offset 592 (0x250) + 0x5f, 0x02, 0x00, 0x00, // Offset 607 (0x25f) + 0x6e, 0x02, 0x00, 0x00, // Offset 622 (0x26e) + 0x77, 0x02, 0x00, 0x00, // Offset 631 (0x277) + 0x7f, 0x02, 0x00, 0x00, // Offset 639 (0x27f) + 0x86, 0x02, 0x00, 0x00, // Offset 646 (0x286) + 0x9a, 0x02, 0x00, 0x00, // Offset 666 (0x29a) + 0xb6, 0x02, 0x00, 0x00, // Offset 694 (0x2b6) + 0xc8, 0x02, 0x00, 0x00, // Offset 712 (0x2c8) + 0xdb, 0x02, 0x00, 0x00, // Offset 731 (0x2db) + 0xef, 0x02, 0x00, 0x00, // Offset 751 (0x2ef) + 0x06, 0x03, 0x00, 0x00, // Offset 774 (0x306) + 0x18, 0x03, 0x00, 0x00, // Offset 792 (0x318) + 0x31, 0x03, 0x00, 0x00, // Offset 817 (0x331) + 0x43, 0x03, 0x00, 0x00, // Offset 835 (0x343) + 0x5e, 0x03, 0x00, 0x00, // Offset 862 (0x35e) + 0x77, 0x03, 0x00, 0x00, // Offset 887 (0x377) + 0x80, 0x03, 0x00, 0x00, // Offset 896 (0x380) + 0x8b, 0x03, 0x00, 0x00, // Offset 907 (0x38b) + 0x9e, 0x03, 0x00, 0x00, // Offset 926 (0x39e) + 0xa8, 0x03, 0x00, 0x00, // Offset 936 (0x3a8) + 0xbb, 0x03, 0x00, 0x00, // Offset 955 (0x3bb) + 0xd0, 0x03, 0x00, 0x00, // Offset 976 (0x3d0) + 0xf9, 0x03, 0x00, 0x00, // Offset 1017 (0x3f9) + 0x14, 0x04, 0x00, 0x00, // Offset 1044 (0x414) + 0x2e, 0x04, 0x00, 0x00, // Offset 1070 (0x42e) + 0x44, 0x04, 0x00, 0x00, // Offset 1092 (0x444) + 0x62, 0x04, 0x00, 0x00, // Offset 1122 (0x462) + 0x7a, 0x04, 0x00, 0x00, // Offset 1146 (0x47a) + 0x90, 0x04, 0x00, 0x00, // Offset 1168 (0x490) + 0xa9, 0x04, 0x00, 0x00, // Offset 1193 (0x4a9) + 0xc7, 0x04, 0x00, 0x00, // Offset 1223 (0x4c7) + 0xd7, 0x04, 0x00, 0x00, // Offset 1239 (0x4d7) + 0xeb, 0x04, 0x00, 0x00, // Offset 1259 (0x4eb) + 0x09, 0x05, 0x00, 0x00, // Offset 1289 (0x509) + 0x1c, 0x05, 0x00, 0x00, // Offset 1308 (0x51c) + 0x4a, 0x05, 0x00, 0x00, // Offset 1354 (0x54a) + 0x70, 0x05, 0x00, 0x00, // Offset 1392 (0x570) + 0x8c, 0x05, 0x00, 0x00, // Offset 1420 (0x58c) + 0xa3, 0x05, 0x00, 0x00, // Offset 1443 (0x5a3) + 0xc3, 0x05, 0x00, 0x00, // Offset 1475 (0x5c3) + 0xdf, 0x05, 0x00, 0x00, // Offset 1503 (0x5df) + 0xf2, 0x05, 0x00, 0x00, // Offset 1522 (0x5f2) + 0x06, 0x06, 0x00, 0x00, // Offset 1542 (0x606) + 0x23, 0x06, 0x00, 0x00, // Offset 1571 (0x623) + 0x3e, 0x06, 0x00, 0x00, // Offset 1598 (0x63e) + 0x6b, 0x06, 0x00, 0x00, // Offset 1643 (0x66b) + 0x88, 0x06, 0x00, 0x00, // Offset 1672 (0x688) + 0x9f, 0x06, 0x00, 0x00, // Offset 1695 (0x69f) + 0xb3, 0x06, 0x00, 0x00, // Offset 1715 (0x6b3) + 0xc6, 0x06, 0x00, 0x00, // Offset 1734 (0x6c6) + 0xf0, 0x06, 0x00, 0x00, // Offset 1776 (0x6f0) + 0x03, 0x07, 0x00, 0x00, // Offset 1795 (0x703) + 0x0e, 0x07, 0x00, 0x00, // Offset 1806 (0x70e) + 0x15, 0x07, 0x00, 0x00, // Offset 1813 (0x715) + 0x1d, 0x07, 0x00, 0x00, // Offset 1821 (0x71d) + 0x30, 0x07, 0x00, 0x00, // Offset 1840 (0x730) + 0x4a, 0x07, 0x00, 0x00, // Offset 1866 (0x74a) + 0x5b, 0x07, 0x00, 0x00, // Offset 1883 (0x75b) + 0x74, 0x07, 0x00, 0x00, // Offset 1908 (0x774) + 0x85, 0x07, 0x00, 0x00, // Offset 1925 (0x785) + 0x97, 0x07, 0x00, 0x00, // Offset 1943 (0x797) + 0xaf, 0x07, 0x00, 0x00, // Offset 1967 (0x7af) + 0xca, 0x07, 0x00, 0x00, // Offset 1994 (0x7ca) + 0xd8, 0x07, 0x00, 0x00, // Offset 2008 (0x7d8) + 0xe8, 0x07, 0x00, 0x00, // Offset 2024 (0x7e8) + 0x02, 0x08, 0x00, 0x00, // Offset 2050 (0x802) + 0x13, 0x08, 0x00, 0x00, // Offset 2067 (0x813) + 0x32, 0x08, 0x00, 0x00, // Offset 2098 (0x832) + 0x49, 0x08, 0x00, 0x00, // Offset 2121 (0x849) + 0x5f, 0x08, 0x00, 0x00, // Offset 2143 (0x85f) + 0x77, 0x08, 0x00, 0x00, // Offset 2167 (0x877) + 0x8e, 0x08, 0x00, 0x00, // Offset 2190 (0x88e) + 0x9f, 0x08, 0x00, 0x00, // Offset 2207 (0x89f) + 0xb0, 0x08, 0x00, 0x00, // Offset 2224 (0x8b0) + 0xc0, 0x08, 0x00, 0x00, // Offset 2240 (0x8c0) + 0xd7, 0x08, 0x00, 0x00, // Offset 2263 (0x8d7) + 0xe9, 0x08, 0x00, 0x00, // Offset 2281 (0x8e9) + 0x06, 0x09, 0x00, 0x00, // Offset 2310 (0x906) + 0x1b, 0x09, 0x00, 0x00, // Offset 2331 (0x91b) + 0x31, 0x09, 0x00, 0x00, // Offset 2353 (0x931) + 0x42, 0x09, 0x00, 0x00, // Offset 2370 (0x942) + 0x56, 0x09, 0x00, 0x00, // Offset 2390 (0x956) + 0x67, 0x09, 0x00, 0x00, // Offset 2407 (0x967) + 0x7b, 0x09, 0x00, 0x00, // Offset 2427 (0x97b) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 7, 0, 17, 64, 15, 2, 97, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 49, 17, 144, 13, 4, 65, 17, + 17, 17, 17, 17, 17, 17, 0, 7, 80, 28, 9, 240, + 241, 33, 81, 33, 81, 33, 40, 49, 33, 81, 33, 81, + 33, 56, 33, 33, 81, 33, 81, 33, 81, 33, 0, 6, + 16, 30, 8, 240, 65, 85, 33, 33, 17, 33, 33, 65, + 33, 81, 17, 98, 115, 81, 33, 65, 33, 65, 33, 17, + 33, 33, 37, 81, 113, 240, 208, 42, 14, 240, 240, 242, + 65, 82, 37, 81, 49, 33, 81, 65, 17, 97, 49, 33, + 97, 49, 17, 49, 67, 33, 18, 17, 113, 18, 49, 97, + 17, 49, 97, 33, 49, 81, 49, 33, 97, 66, 0, 9, + 32, 33, 13, 240, 240, 211, 145, 49, 129, 49, 129, 33, + 147, 50, 67, 65, 65, 33, 65, 49, 65, 33, 65, 82, + 81, 82, 82, 66, 49, 37, 35, 0, 8, 48, 9, 2, + 33, 17, 17, 17, 240, 240, 16, 19, 5, 193, 65, 49, + 65, 49, 65, 65, 65, 65, 65, 81, 65, 81, 65, 81, + 240, 16, 18, 5, 161, 81, 81, 65, 81, 65, 65, 65, + 65, 65, 49, 65, 49, 49, 240, 144, 15, 6, 129, 81, + 49, 19, 34, 53, 17, 17, 17, 49, 0, 9, 48, 15, + 8, 240, 240, 209, 113, 113, 71, 65, 113, 113, 113, 0, + 7, 64, 9, 3, 240, 240, 194, 18, 33, 17, 128, 8, + 9, 0, 9, 8, 0, 12, 64, 7, 3, 240, 240, 194, + 18, 208, 20, 7, 240, 65, 97, 97, 81, 97, 81, 97, + 97, 81, 97, 81, 97, 97, 81, 240, 240, 64, 28, 8, + 240, 179, 65, 49, 33, 65, 33, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 17, 81, 17, 65, 49, 49, 67, 240, + 240, 208, 18, 5, 240, 18, 33, 17, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 51, 240, 176, 19, 8, 240, 180, + 49, 50, 113, 113, 113, 97, 113, 97, 97, 97, 98, 87, + 240, 240, 176, 20, 8, 240, 179, 65, 49, 33, 65, 113, + 97, 83, 129, 129, 113, 113, 97, 52, 240, 240, 208, 23, + 9, 240, 240, 33, 114, 114, 97, 17, 81, 33, 81, 33, + 65, 49, 49, 65, 56, 97, 129, 129, 0, 6, 18, 7, + 240, 132, 33, 81, 100, 98, 98, 97, 97, 97, 97, 81, + 36, 240, 240, 128, 25, 8, 240, 210, 81, 97, 97, 97, + 34, 51, 33, 33, 81, 17, 81, 17, 81, 17, 81, 33, + 49, 67, 240, 240, 208, 18, 8, 240, 166, 17, 81, 97, + 113, 113, 97, 113, 113, 97, 113, 113, 0, 6, 64, 27, + 8, 240, 180, 34, 65, 17, 81, 17, 81, 33, 49, 67, + 65, 34, 33, 81, 17, 81, 17, 81, 17, 65, 52, 240, + 240, 208, 25, 8, 240, 179, 65, 49, 33, 81, 17, 81, + 17, 81, 17, 81, 33, 50, 51, 17, 97, 97, 98, 66, + 240, 240, 240, 9, 3, 194, 18, 240, 18, 18, 240, 112, + 11, 3, 194, 18, 240, 18, 18, 33, 17, 240, 32, 19, + 7, 240, 65, 81, 81, 81, 97, 81, 81, 97, 113, 113, + 97, 113, 113, 113, 240, 224, 10, 9, 0, 7, 120, 240, + 72, 0, 10, 32, 19, 7, 225, 113, 113, 97, 113, 113, + 113, 97, 81, 81, 81, 97, 81, 81, 240, 240, 64, 21, + 7, 240, 116, 33, 65, 17, 65, 17, 65, 97, 81, 97, + 81, 97, 97, 194, 82, 240, 240, 16, 41, 14, 0, 5, + 117, 114, 81, 81, 129, 49, 53, 33, 33, 33, 50, 33, + 33, 18, 49, 49, 17, 33, 65, 49, 33, 17, 49, 49, + 49, 17, 49, 34, 49, 35, 18, 98, 113, 103, 0, 9, + 16, 27, 11, 240, 240, 113, 162, 129, 17, 129, 17, 129, + 33, 97, 49, 97, 49, 102, 65, 81, 65, 81, 65, 97, + 34, 83, 0, 7, 26, 9, 240, 198, 65, 65, 49, 65, + 49, 65, 49, 49, 68, 81, 50, 49, 81, 33, 81, 33, + 81, 33, 65, 38, 0, 6, 22, 11, 240, 240, 117, 66, + 81, 33, 145, 161, 161, 161, 161, 162, 161, 113, 49, 97, + 70, 0, 7, 16, 30, 11, 240, 240, 54, 97, 66, 65, + 97, 49, 97, 49, 113, 33, 113, 33, 113, 33, 113, 33, + 97, 49, 97, 49, 81, 51, 19, 0, 7, 48, 24, 9, + 240, 199, 49, 65, 49, 129, 129, 49, 69, 65, 49, 65, + 49, 65, 129, 129, 81, 20, 19, 0, 5, 96, 22, 8, + 240, 151, 33, 65, 33, 113, 113, 49, 53, 49, 49, 49, + 49, 49, 113, 113, 99, 240, 240, 240, 25, 12, 240, 240, + 165, 82, 81, 49, 177, 161, 177, 177, 100, 17, 129, 49, + 113, 49, 113, 65, 97, 86, 0, 7, 112, 30, 12, 240, + 240, 99, 83, 33, 113, 49, 113, 49, 113, 49, 113, 57, + 49, 113, 49, 113, 49, 113, 49, 113, 49, 113, 35, 83, + 0, 7, 80, 16, 4, 195, 33, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 35, 240, 96, 20, 6, 240, 83, 65, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 65, 51, 144, 30, 10, 240, 243, 66, 33, 65, 65, 49, + 81, 33, 97, 17, 113, 17, 114, 17, 97, 49, 81, 50, + 65, 65, 65, 81, 35, 66, 0, 6, 48, 19, 9, 240, + 195, 113, 129, 129, 129, 129, 129, 129, 129, 129, 129, 81, + 24, 0, 5, 96, 46, 14, 240, 240, 194, 146, 34, 114, + 50, 114, 50, 97, 17, 49, 17, 81, 17, 49, 17, 65, + 33, 49, 33, 49, 33, 49, 33, 33, 49, 49, 49, 17, + 49, 49, 49, 17, 49, 49, 65, 65, 35, 49, 51, 0, + 8, 112, 38, 12, 240, 240, 98, 99, 33, 113, 50, 97, + 49, 17, 81, 49, 33, 65, 49, 33, 65, 49, 49, 49, + 49, 65, 33, 49, 81, 17, 49, 81, 17, 49, 98, 35, + 97, 0, 7, 96, 28, 12, 240, 240, 149, 97, 81, 65, + 113, 33, 129, 33, 145, 17, 145, 17, 145, 17, 145, 18, + 113, 49, 113, 65, 81, 101, 0, 8, 23, 8, 240, 149, + 65, 49, 49, 65, 33, 65, 33, 65, 33, 49, 52, 65, + 113, 113, 113, 99, 240, 240, 240, 32, 12, 240, 240, 149, + 97, 81, 65, 113, 33, 129, 33, 145, 17, 145, 17, 145, + 17, 145, 18, 113, 49, 113, 65, 81, 98, 18, 146, 178, + 194, 240, 176, 28, 10, 240, 246, 81, 49, 81, 65, 65, + 65, 65, 65, 65, 49, 84, 97, 34, 81, 49, 81, 65, + 65, 66, 35, 66, 0, 6, 48, 19, 7, 240, 116, 33, + 97, 97, 98, 98, 114, 98, 97, 97, 17, 49, 36, 240, + 240, 128, 20, 11, 240, 240, 58, 81, 65, 81, 161, 161, + 161, 161, 161, 161, 161, 161, 147, 0, 7, 64, 29, 12, + 240, 240, 99, 83, 33, 113, 49, 113, 49, 113, 49, 113, + 49, 113, 49, 113, 49, 113, 49, 113, 49, 113, 65, 81, + 101, 0, 8, 27, 11, 240, 240, 50, 98, 33, 97, 49, + 97, 65, 65, 81, 65, 82, 49, 97, 33, 113, 33, 129, + 17, 130, 146, 0, 8, 112, 45, 16, 0, 6, 2, 35, + 34, 34, 33, 65, 33, 49, 49, 65, 33, 49, 65, 49, + 17, 49, 81, 66, 49, 81, 65, 65, 97, 50, 33, 113, + 33, 17, 33, 129, 17, 18, 17, 130, 50, 146, 50, 161, + 0, 11, 32, 29, 12, 240, 240, 99, 82, 50, 81, 81, + 65, 113, 33, 145, 17, 146, 162, 145, 33, 129, 49, 97, + 66, 65, 97, 50, 99, 0, 7, 80, 23, 10, 240, 242, + 82, 33, 81, 50, 49, 81, 49, 97, 17, 129, 145, 145, + 145, 145, 145, 131, 0, 6, 96, 20, 11, 240, 240, 57, + 33, 98, 145, 145, 145, 146, 145, 145, 145, 146, 145, 113, + 26, 0, 7, 19, 5, 164, 17, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 68, 240, 16, 42, 17, + 0, 6, 67, 50, 82, 49, 81, 81, 65, 81, 65, 97, + 65, 65, 97, 65, 65, 63, 1, 81, 33, 17, 33, 129, + 33, 33, 17, 129, 17, 49, 17, 146, 50, 161, 81, 161, + 81, 0, 11, 32, 19, 5, 164, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 20, 240, 16, 11, + 8, 34, 81, 33, 49, 65, 129, 0, 16, 16, 7, 9, + 0, 18, 8, 240, 208, 8, 3, 97, 33, 49, 0, 5, + 96, 19, 7, 0, 6, 50, 50, 33, 33, 49, 97, 52, + 33, 49, 33, 49, 38, 240, 240, 96, 26, 8, 240, 17, + 113, 113, 113, 113, 113, 19, 50, 49, 33, 81, 17, 81, + 17, 81, 17, 81, 17, 65, 52, 240, 240, 208, 17, 7, + 0, 6, 52, 33, 49, 17, 97, 97, 97, 113, 49, 51, + 240, 240, 112, 25, 9, 240, 145, 129, 129, 129, 129, 69, + 49, 65, 33, 81, 33, 81, 33, 81, 33, 81, 49, 65, + 70, 0, 5, 96, 17, 7, 0, 6, 51, 34, 49, 22, + 17, 97, 97, 113, 49, 51, 240, 240, 112, 18, 6, 242, + 49, 65, 81, 81, 68, 49, 81, 81, 81, 81, 81, 67, + 240, 240, 48, 24, 8, 0, 7, 22, 17, 65, 33, 65, + 33, 65, 33, 49, 67, 65, 133, 49, 65, 17, 81, 17, + 65, 52, 176, 27, 8, 240, 33, 113, 113, 113, 113, 113, + 19, 50, 49, 33, 65, 33, 65, 33, 65, 33, 65, 33, + 65, 19, 49, 240, 240, 176, 14, 3, 145, 33, 129, 33, + 33, 33, 33, 33, 33, 34, 240, 16, 16, 3, 161, 33, + 129, 33, 33, 33, 33, 33, 33, 33, 33, 33, 17, 128, + 26, 8, 240, 33, 113, 113, 113, 113, 113, 50, 33, 33, + 65, 17, 82, 97, 17, 81, 33, 65, 49, 35, 34, 240, + 240, 176, 17, 4, 145, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 35, 240, 96, 31, 14, 0, 12, 49, + 34, 35, 67, 34, 49, 49, 65, 65, 49, 65, 65, 49, + 65, 65, 49, 65, 65, 49, 65, 65, 35, 35, 35, 0, + 8, 112, 23, 9, 0, 8, 1, 34, 67, 33, 49, 65, + 49, 65, 49, 65, 49, 65, 49, 65, 35, 35, 0, 5, + 96, 22, 8, 0, 7, 35, 65, 49, 33, 81, 17, 81, + 17, 81, 17, 81, 33, 49, 65, 17, 240, 240, 208, 24, + 9, 0, 8, 1, 19, 66, 49, 49, 81, 33, 81, 33, + 81, 33, 81, 33, 65, 53, 65, 129, 129, 115, 240, 23, + 9, 0, 8, 21, 49, 65, 33, 81, 33, 81, 33, 81, + 33, 81, 49, 65, 69, 129, 129, 129, 115, 160, 17, 6, + 240, 240, 209, 18, 34, 17, 33, 81, 81, 81, 81, 67, + 240, 240, 48, 17, 6, 240, 240, 211, 33, 49, 17, 98, + 83, 81, 17, 49, 20, 240, 240, 32, 16, 6, 240, 240, + 113, 69, 33, 81, 81, 81, 81, 81, 83, 240, 240, 32, + 23, 8, 0, 7, 1, 65, 33, 65, 33, 65, 33, 65, + 33, 65, 33, 65, 33, 50, 51, 18, 240, 240, 176, 18, + 7, 0, 6, 18, 49, 17, 65, 33, 33, 49, 33, 66, + 82, 82, 240, 240, 240, 29, 13, 0, 11, 51, 35, 34, + 33, 65, 49, 65, 33, 17, 33, 65, 33, 17, 33, 82, + 33, 17, 98, 50, 98, 49, 193, 0, 8, 80, 21, 8, + 0, 7, 3, 34, 33, 49, 65, 17, 97, 113, 97, 17, + 65, 49, 34, 50, 240, 240, 176, 22, 8, 0, 7, 2, + 50, 33, 49, 49, 33, 81, 17, 81, 17, 82, 113, 113, + 97, 113, 97, 98, 224, 17, 7, 0, 6, 37, 17, 49, + 81, 97, 81, 82, 81, 81, 50, 240, 240, 96, 20, 5, + 114, 33, 65, 65, 65, 65, 65, 49, 65, 81, 65, 65, + 65, 65, 65, 82, 240, 16, 17, 2, 65, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 144, 20, + 5, 82, 81, 65, 65, 65, 65, 65, 81, 50, 49, 65, + 65, 65, 65, 65, 34, 240, 48, 14, 10, 0, 9, 2, + 65, 18, 34, 33, 17, 82, 0, 12, 96, + 0, 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8f, 0x01, 0x00, 0x00, // Offset 399 (0x18f) + 0xa5, 0x01, 0x00, 0x00, // Offset 421 (0x1a5) + 0xbd, 0x01, 0x00, 0x00, // Offset 445 (0x1bd) + 0xcc, 0x01, 0x00, 0x00, // Offset 460 (0x1cc) + 0xe6, 0x01, 0x00, 0x00, // Offset 486 (0x1e6) + 0xfc, 0x01, 0x00, 0x00, // Offset 508 (0x1fc) + 0x0a, 0x02, 0x00, 0x00, // Offset 522 (0x20a) + 0x1d, 0x02, 0x00, 0x00, // Offset 541 (0x21d) + 0x2c, 0x02, 0x00, 0x00, // Offset 556 (0x22c) + 0x43, 0x02, 0x00, 0x00, // Offset 579 (0x243) + 0x5c, 0x02, 0x00, 0x00, // Offset 604 (0x25c) + 0x78, 0x02, 0x00, 0x00, // Offset 632 (0x278) + 0x91, 0x02, 0x00, 0x00, // Offset 657 (0x291) + 0xa5, 0x02, 0x00, 0x00, // Offset 677 (0x2a5) + 0xbd, 0x02, 0x00, 0x00, // Offset 701 (0x2bd) + 0xd3, 0x02, 0x00, 0x00, // Offset 723 (0x2d3) + 0xe7, 0x02, 0x00, 0x00, // Offset 743 (0x2e7) + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x1f, 0x03, 0x00, 0x00, // Offset 799 (0x31f) + 0x3f, 0x03, 0x00, 0x00, // Offset 831 (0x33f) + 0x52, 0x03, 0x00, 0x00, // Offset 850 (0x352) + 0x69, 0x03, 0x00, 0x00, // Offset 873 (0x369) + 0x7d, 0x03, 0x00, 0x00, // Offset 893 (0x37d) + 0x8d, 0x03, 0x00, 0x00, // Offset 909 (0x38d) + 0xa5, 0x03, 0x00, 0x00, // Offset 933 (0x3a5) + 0xb7, 0x03, 0x00, 0x00, // Offset 951 (0x3b7) + 0xc5, 0x03, 0x00, 0x00, // Offset 965 (0x3c5) + 0xd3, 0x03, 0x00, 0x00, // Offset 979 (0x3d3) + 0xe5, 0x03, 0x00, 0x00, // Offset 997 (0x3e5) + 0xf9, 0x03, 0x00, 0x00, // Offset 1017 (0x3f9) + 0x0d, 0x04, 0x00, 0x00, // Offset 1037 (0x40d) + 0x2d, 0x04, 0x00, 0x00, // Offset 1069 (0x42d) + 0x41, 0x04, 0x00, 0x00, // Offset 1089 (0x441) + 0x60, 0x04, 0x00, 0x00, // Offset 1120 (0x460) + 0x74, 0x04, 0x00, 0x00, // Offset 1140 (0x474) + 0x97, 0x04, 0x00, 0x00, // Offset 1175 (0x497) + 0xab, 0x04, 0x00, 0x00, // Offset 1195 (0x4ab) + 0xcd, 0x04, 0x00, 0x00, // Offset 1229 (0x4cd) + 0xda, 0x04, 0x00, 0x00, // Offset 1242 (0x4da) + 0xf7, 0x04, 0x00, 0x00, // Offset 1271 (0x4f7) + 0x1f, 0x05, 0x00, 0x00, // Offset 1311 (0x51f) + 0x3c, 0x05, 0x00, 0x00, // Offset 1340 (0x53c) + 0x4e, 0x05, 0x00, 0x00, // Offset 1358 (0x54e) + 0x5d, 0x05, 0x00, 0x00, // Offset 1373 (0x55d) + 0x7c, 0x05, 0x00, 0x00, // Offset 1404 (0x57c) + 0xa7, 0x05, 0x00, 0x00, // Offset 1447 (0x5a7) + 0xc4, 0x05, 0x00, 0x00, // Offset 1476 (0x5c4) + 0xda, 0x05, 0x00, 0x00, // Offset 1498 (0x5da) + 0xe2, 0x05, 0x00, 0x00, // Offset 1506 (0x5e2) + 0xf9, 0x05, 0x00, 0x00, // Offset 1529 (0x5f9) + 0x0b, 0x06, 0x00, 0x00, // Offset 1547 (0x60b) + 0x11, 0x06, 0x00, 0x00, // Offset 1553 (0x611) + 0x26, 0x06, 0x00, 0x00, // Offset 1574 (0x626) + 0x3b, 0x06, 0x00, 0x00, // Offset 1595 (0x63b) + 0x52, 0x06, 0x00, 0x00, // Offset 1618 (0x652) + 0x6c, 0x06, 0x00, 0x00, // Offset 1644 (0x66c) + 0x8b, 0x06, 0x00, 0x00, // Offset 1675 (0x68b) + 0x9f, 0x06, 0x00, 0x00, // Offset 1695 (0x69f) + 0xc2, 0x06, 0x00, 0x00, // Offset 1730 (0x6c2) + 0xda, 0x06, 0x00, 0x00, // Offset 1754 (0x6da) + 0xf4, 0x06, 0x00, 0x00, // Offset 1780 (0x6f4) + 0x14, 0x07, 0x00, 0x00, // Offset 1812 (0x714) + 0x30, 0x07, 0x00, 0x00, // Offset 1840 (0x730) + 0x4d, 0x07, 0x00, 0x00, // Offset 1869 (0x74d) + 0x67, 0x07, 0x00, 0x00, // Offset 1895 (0x767) + 0x83, 0x07, 0x00, 0x00, // Offset 1923 (0x783) + 0x9d, 0x07, 0x00, 0x00, // Offset 1949 (0x79d) + 0xc1, 0x07, 0x00, 0x00, // Offset 1985 (0x7c1) + 0xe4, 0x07, 0x00, 0x00, // Offset 2020 (0x7e4) + 0x02, 0x08, 0x00, 0x00, // Offset 2050 (0x802) + 0x1d, 0x08, 0x00, 0x00, // Offset 2077 (0x81d) + 0x38, 0x08, 0x00, 0x00, // Offset 2104 (0x838) + 0x5e, 0x08, 0x00, 0x00, // Offset 2142 (0x85e) + 0x78, 0x08, 0x00, 0x00, // Offset 2168 (0x878) + 0x92, 0x08, 0x00, 0x00, // Offset 2194 (0x892) + 0xa9, 0x08, 0x00, 0x00, // Offset 2217 (0x8a9) + 0xc9, 0x08, 0x00, 0x00, // Offset 2249 (0x8c9) + 0xe7, 0x08, 0x00, 0x00, // Offset 2279 (0x8e7) + 0xfb, 0x08, 0x00, 0x00, // Offset 2299 (0x8fb) + 0x1c, 0x09, 0x00, 0x00, // Offset 2332 (0x91c) + 0x31, 0x09, 0x00, 0x00, // Offset 2353 (0x931) + 0x4e, 0x09, 0x00, 0x00, // Offset 2382 (0x94e) + 0x6d, 0x09, 0x00, 0x00, // Offset 2413 (0x96d) + 0x87, 0x09, 0x00, 0x00, // Offset 2439 (0x987) + 0x9f, 0x09, 0x00, 0x00, // Offset 2463 (0x99f) + 0xb2, 0x09, 0x00, 0x00, // Offset 2482 (0x9b2) + 0xd3, 0x09, 0x00, 0x00, // Offset 2515 (0x9d3) + 0x00, 0x0a, 0x00, 0x00, // Offset 2560 (0xa00) + 0x20, 0x0a, 0x00, 0x00, // Offset 2592 (0xa20) + 0x43, 0x0a, 0x00, 0x00, // Offset 2627 (0xa43) + 0x73, 0x0a, 0x00, 0x00, // Offset 2675 (0xa73) + 0x96, 0x0a, 0x00, 0x00, // Offset 2710 (0xa96) + 0x9e, 0x0a, 0x00, 0x00, // Offset 2718 (0xa9e) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 15, 10, 0, 7, 73, 145, 145, 145, 145, 145, 145, 145, + 0, 7, 80, 22, 11, 0, 8, 42, 81, 65, 81, 65, + 81, 65, 81, 65, 81, 65, 81, 65, 81, 65, 0, 8, + 48, 24, 13, 0, 9, 101, 50, 113, 49, 129, 49, 129, + 34, 129, 33, 17, 113, 17, 49, 98, 66, 81, 0, 10, + 96, 15, 12, 0, 7, 67, 177, 177, 177, 177, 177, 177, + 185, 0, 10, 80, 26, 13, 0, 9, 98, 55, 33, 97, + 81, 97, 81, 82, 81, 81, 17, 65, 65, 49, 49, 19, + 81, 49, 17, 0, 10, 96, 22, 13, 0, 9, 3, 50, + 193, 55, 33, 193, 83, 65, 65, 49, 49, 50, 49, 52, + 35, 0, 11, 96, 14, 11, 0, 8, 42, 33, 161, 161, + 161, 161, 169, 0, 9, 96, 19, 12, 0, 9, 11, 33, + 65, 97, 65, 97, 65, 97, 65, 97, 65, 106, 0, 10, + 80, 15, 11, 0, 6, 122, 145, 161, 161, 42, 33, 161, + 169, 0, 9, 96, 23, 12, 0, 9, 26, 97, 65, 97, + 65, 22, 65, 33, 129, 33, 129, 33, 50, 49, 36, 81, + 0, 9, 16, 25, 12, 0, 9, 26, 97, 17, 33, 81, + 33, 33, 22, 17, 33, 33, 81, 33, 33, 81, 33, 36, + 36, 0, 10, 80, 28, 12, 0, 8, 81, 55, 33, 81, + 33, 33, 81, 36, 22, 17, 33, 33, 81, 33, 33, 81, + 33, 36, 36, 129, 33, 0, 9, 16, 25, 13, 0, 9, + 117, 49, 114, 34, 113, 49, 70, 34, 65, 81, 17, 65, + 65, 49, 49, 50, 65, 37, 0, 10, 80, 20, 13, 0, + 9, 123, 97, 17, 145, 33, 86, 20, 49, 81, 97, 81, + 100, 37, 0, 11, 64, 24, 13, 0, 9, 123, 97, 17, + 33, 97, 49, 17, 38, 33, 17, 49, 97, 17, 49, 97, + 17, 59, 0, 11, 64, 22, 14, 0, 9, 99, 69, 193, + 23, 81, 150, 35, 65, 81, 49, 49, 81, 49, 52, 51, + 0, 12, 80, 20, 11, 0, 8, 41, 49, 97, 49, 97, + 49, 97, 49, 97, 49, 97, 57, 33, 0, 9, 48, 21, + 9, 0, 6, 50, 17, 97, 17, 97, 24, 17, 97, 17, + 97, 17, 97, 24, 17, 0, 7, 96, 35, 11, 0, 7, + 17, 34, 33, 17, 33, 33, 33, 17, 33, 33, 33, 20, + 36, 17, 33, 33, 33, 17, 33, 33, 33, 17, 33, 33, + 33, 20, 36, 17, 0, 9, 64, 32, 13, 0, 8, 17, + 50, 34, 65, 49, 49, 65, 49, 34, 69, 33, 81, 49, + 34, 65, 49, 17, 33, 49, 49, 17, 49, 38, 65, 33, + 0, 11, 16, 19, 11, 0, 7, 49, 177, 146, 145, 145, + 17, 113, 49, 81, 82, 33, 129, 0, 9, 96, 23, 12, + 0, 9, 50, 49, 97, 65, 97, 49, 98, 50, 65, 33, + 17, 33, 33, 65, 65, 81, 0, 11, 48, 20, 9, 0, + 6, 2, 100, 65, 65, 33, 97, 17, 97, 17, 97, 33, + 65, 68, 0, 8, 32, 16, 12, 0, 9, 8, 177, 161, + 161, 162, 130, 34, 66, 99, 0, 10, 80, 24, 14, 0, + 10, 90, 129, 65, 129, 49, 129, 65, 114, 50, 97, 35, + 33, 65, 65, 66, 17, 65, 0, 11, 64, 18, 12, 0, + 7, 117, 240, 40, 161, 161, 161, 146, 18, 97, 83, 18, + 0, 10, 32, 14, 10, 0, 7, 73, 145, 145, 25, 145, + 145, 145, 0, 8, 112, 14, 11, 0, 8, 42, 33, 161, + 169, 33, 161, 169, 0, 9, 96, 18, 12, 0, 9, 25, + 240, 33, 50, 97, 49, 113, 49, 113, 49, 75, 0, 10, + 80, 20, 12, 0, 7, 117, 240, 27, 68, 114, 49, 97, + 81, 81, 81, 82, 50, 115, 0, 9, 80, 20, 7, 114, + 113, 97, 97, 97, 97, 97, 100, 49, 97, 97, 97, 97, + 97, 97, 97, 240, 160, 32, 7, 227, 33, 49, 33, 49, + 33, 49, 33, 49, 33, 49, 33, 52, 49, 33, 49, 33, + 49, 33, 49, 33, 49, 33, 49, 33, 49, 33, 97, 240, + 112, 20, 7, 113, 114, 97, 97, 97, 100, 49, 97, 97, + 100, 49, 97, 97, 97, 97, 97, 240, 160, 31, 7, 240, + 35, 18, 49, 33, 49, 33, 49, 33, 49, 37, 33, 49, + 33, 49, 37, 33, 49, 33, 49, 33, 49, 33, 49, 33, + 49, 97, 240, 112, 20, 7, 240, 50, 97, 97, 97, 97, + 97, 22, 97, 97, 97, 97, 97, 97, 97, 97, 240, 112, + 35, 8, 240, 49, 34, 65, 33, 65, 33, 65, 33, 65, + 33, 65, 33, 20, 33, 65, 33, 65, 33, 65, 33, 65, + 33, 65, 33, 65, 33, 65, 33, 65, 33, 240, 160, 20, + 6, 130, 97, 81, 81, 81, 21, 81, 81, 81, 21, 81, + 81, 81, 81, 81, 81, 240, 64, 34, 8, 194, 66, 33, + 65, 33, 65, 33, 65, 33, 20, 33, 65, 33, 65, 33, + 65, 33, 20, 33, 65, 33, 65, 33, 65, 33, 65, 33, + 65, 33, 113, 240, 160, 13, 14, 0, 13, 1, 209, 209, + 209, 209, 125, 0, 12, 48, 29, 15, 240, 130, 241, 225, + 225, 225, 225, 129, 81, 129, 84, 81, 81, 129, 81, 129, + 21, 68, 17, 65, 225, 225, 225, 225, 0, 6, 16, 40, + 14, 240, 240, 146, 146, 33, 161, 33, 161, 33, 161, 33, + 65, 81, 33, 81, 65, 33, 81, 68, 81, 65, 33, 81, + 50, 33, 24, 17, 33, 161, 33, 161, 33, 161, 33, 209, + 240, 240, 208, 29, 12, 240, 240, 50, 177, 177, 177, 177, + 65, 97, 81, 81, 81, 81, 81, 81, 81, 51, 20, 19, + 33, 177, 177, 177, 177, 240, 240, 112, 18, 15, 0, 13, + 66, 65, 145, 65, 145, 65, 145, 65, 145, 65, 94, 0, + 13, 32, 15, 15, 0, 16, 126, 129, 225, 225, 225, 225, + 225, 225, 0, 6, 64, 31, 14, 240, 240, 131, 209, 209, + 209, 209, 209, 209, 17, 69, 33, 37, 97, 97, 97, 97, + 37, 97, 97, 97, 97, 97, 97, 97, 97, 240, 240, 208, + 43, 14, 240, 240, 82, 19, 161, 33, 161, 33, 161, 33, + 161, 33, 161, 33, 161, 33, 23, 33, 33, 81, 65, 33, + 81, 20, 33, 81, 65, 33, 81, 65, 33, 81, 65, 33, + 81, 65, 33, 209, 240, 240, 208, 29, 13, 240, 240, 83, + 193, 193, 193, 193, 193, 193, 148, 24, 49, 97, 81, 97, + 81, 97, 81, 97, 81, 97, 81, 97, 81, 240, 240, 160, + 22, 15, 0, 16, 126, 81, 65, 145, 65, 145, 65, 145, + 65, 145, 65, 145, 65, 145, 65, 0, 6, 32, 8, 15, + 0, 22, 78, 0, 13, 32, 23, 12, 240, 240, 50, 177, + 177, 177, 177, 177, 177, 177, 177, 117, 22, 65, 177, 177, + 177, 177, 240, 240, 112, 18, 4, 131, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 208, 6, + 2, 240, 49, 240, 96, 21, 12, 0, 9, 2, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 84, 36, 0, + 10, 80, 21, 12, 0, 9, 1, 70, 33, 65, 97, 65, + 97, 65, 97, 65, 97, 50, 100, 21, 0, 10, 80, 23, + 13, 0, 9, 98, 98, 65, 97, 81, 97, 81, 82, 81, + 81, 17, 65, 65, 49, 53, 81, 0, 11, 64, 26, 12, + 0, 8, 34, 65, 97, 65, 98, 49, 81, 17, 49, 81, + 33, 33, 65, 49, 33, 35, 65, 19, 38, 0, 10, 80, + 31, 16, 0, 12, 24, 34, 113, 49, 33, 129, 49, 33, + 69, 49, 18, 81, 97, 17, 17, 65, 98, 49, 49, 34, + 34, 50, 35, 65, 0, 12, 112, 20, 13, 0, 9, 123, + 97, 17, 145, 33, 86, 17, 97, 81, 97, 81, 100, 37, + 0, 11, 64, 35, 16, 0, 11, 49, 86, 33, 33, 113, + 17, 33, 33, 113, 20, 17, 69, 17, 33, 18, 65, 65, + 33, 17, 17, 49, 65, 34, 34, 36, 20, 65, 113, 0, + 13, 16, 24, 13, 0, 9, 117, 34, 113, 50, 113, 50, + 54, 17, 33, 49, 65, 49, 49, 65, 65, 33, 25, 0, + 11, 64, 26, 13, 0, 9, 116, 22, 81, 193, 51, 37, + 33, 34, 33, 81, 49, 33, 81, 49, 33, 34, 18, 18, + 35, 67, 0, 10, 32, 12, 0, 9, 5, 18, 33, 33, + 33, 33, 33, 33, 33, 36, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 37, 20, 33, 0, 10, 32, + 28, 14, 0, 10, 70, 49, 81, 49, 49, 81, 49, 49, + 81, 49, 34, 81, 49, 33, 17, 65, 49, 17, 49, 54, + 66, 33, 0, 12, 29, 13, 0, 9, 102, 49, 65, 49, + 34, 65, 49, 33, 17, 49, 49, 33, 17, 49, 49, 17, + 49, 33, 49, 17, 49, 43, 0, 11, 64, 26, 9, 240, + 200, 33, 81, 33, 81, 33, 81, 33, 81, 39, 196, 66, + 50, 33, 81, 33, 81, 34, 50, 52, 240, 240, 144, 28, + 12, 0, 9, 2, 49, 20, 33, 49, 65, 37, 65, 33, + 49, 65, 33, 49, 65, 33, 49, 65, 37, 65, 33, 129, + 0, 9, 16, 26, 13, 0, 9, 98, 54, 49, 49, 17, + 101, 17, 97, 49, 17, 97, 49, 17, 97, 49, 17, 101, + 21, 33, 0, 11, 16, 36, 13, 0, 9, 97, 33, 38, + 17, 33, 33, 65, 20, 33, 65, 17, 33, 17, 17, 49, + 17, 33, 17, 17, 49, 17, 34, 49, 33, 21, 65, 17, + 17, 161, 0, 9, 112, 35, 15, 0, 11, 34, 33, 33, + 35, 49, 33, 33, 33, 84, 33, 33, 81, 33, 18, 33, + 81, 33, 17, 17, 17, 81, 34, 35, 85, 53, 33, 33, + 66, 0, 11, 96, 30, 14, 0, 10, 66, 56, 33, 49, + 49, 85, 49, 81, 49, 49, 81, 49, 33, 17, 65, 49, + 17, 49, 53, 17, 65, 33, 65, 0, 11, 48, 27, 13, + 0, 9, 98, 49, 20, 49, 49, 17, 101, 17, 97, 49, + 20, 49, 49, 17, 97, 49, 17, 101, 21, 33, 0, 11, + 16, 27, 9, 240, 194, 81, 33, 81, 39, 33, 81, 33, + 81, 39, 33, 148, 66, 50, 33, 81, 33, 81, 34, 50, + 52, 240, 240, 144, 38, 10, 240, 146, 33, 17, 33, 17, + 33, 17, 33, 17, 33, 20, 20, 17, 33, 17, 33, 17, + 33, 17, 33, 20, 20, 228, 82, 34, 65, 65, 65, 65, + 66, 34, 84, 240, 240, 208, 26, 12, 0, 9, 50, 21, + 65, 97, 65, 97, 65, 97, 49, 17, 81, 33, 49, 65, + 33, 65, 49, 17, 145, 0, 9, 16, 26, 13, 0, 8, + 49, 50, 129, 49, 129, 49, 113, 65, 114, 49, 97, 33, + 33, 81, 65, 17, 81, 65, 21, 0, 11, 64, 23, 13, + 0, 10, 18, 21, 81, 49, 129, 49, 114, 49, 113, 17, + 33, 97, 49, 17, 81, 101, 0, 11, 64, 32, 12, 0, + 7, 98, 18, 49, 65, 33, 49, 49, 49, 49, 49, 53, + 33, 17, 33, 49, 33, 17, 33, 49, 17, 49, 17, 49, + 102, 113, 0, 9, 80, 30, 14, 0, 9, 17, 225, 23, + 66, 65, 113, 81, 113, 81, 97, 17, 49, 17, 81, 33, + 33, 33, 49, 66, 50, 17, 81, 81, 0, 10, 80, 20, + 8, 240, 240, 209, 113, 97, 17, 65, 49, 49, 49, 33, + 81, 17, 81, 23, 0, 7, 16, 33, 14, 0, 9, 2, + 82, 68, 52, 33, 65, 17, 65, 17, 65, 17, 65, 17, + 65, 17, 65, 17, 65, 17, 65, 33, 33, 34, 33, 52, + 52, 0, 12, 64, 21, 8, 240, 240, 81, 113, 84, 65, + 49, 33, 81, 17, 81, 17, 81, 33, 49, 67, 0, 7, + 48, 29, 13, 0, 8, 49, 82, 81, 97, 65, 18, 49, + 65, 65, 33, 65, 65, 17, 17, 49, 65, 17, 33, 34, + 35, 65, 37, 0, 12, 32, 31, 13, 0, 8, 49, 81, + 97, 82, 65, 18, 50, 49, 65, 17, 33, 33, 65, 17, + 33, 33, 65, 17, 33, 34, 35, 65, 36, 22, 0, 11, + 64, 26, 11, 240, 240, 57, 66, 33, 113, 33, 113, 33, + 113, 33, 74, 244, 98, 34, 81, 65, 81, 65, 82, 34, + 100, 0, 6, 24, 14, 0, 9, 3, 67, 240, 29, 240, + 35, 67, 49, 49, 33, 49, 33, 49, 33, 49, 51, 67, + 0, 12, 64, 19, 12, 0, 9, 11, 240, 20, 114, 50, + 81, 81, 81, 81, 82, 50, 115, 0, 9, 80, 33, 15, + 240, 240, 146, 225, 225, 225, 228, 114, 33, 113, 49, 33, + 113, 49, 33, 113, 49, 36, 65, 49, 18, 71, 17, 17, + 225, 225, 225, 225, 0, 6, 16, 45, 13, 240, 240, 49, + 34, 145, 33, 145, 33, 145, 33, 148, 82, 33, 33, 49, + 33, 33, 33, 49, 33, 33, 33, 49, 33, 36, 49, 33, + 18, 33, 21, 17, 17, 33, 145, 33, 145, 33, 145, 33, + 193, 240, 240, 160, 32, 13, 240, 240, 98, 193, 193, 193, + 193, 49, 50, 49, 65, 49, 49, 65, 49, 49, 65, 49, + 49, 65, 53, 23, 65, 193, 193, 193, 193, 240, 240, 160, + 35, 13, 240, 240, 98, 193, 193, 193, 193, 193, 193, 25, + 33, 65, 33, 65, 65, 33, 20, 65, 33, 65, 65, 33, + 20, 65, 33, 65, 65, 33, 65, 193, 240, 240, 160, 48, + 14, 240, 240, 131, 161, 33, 161, 33, 161, 33, 161, 33, + 161, 33, 161, 33, 23, 33, 33, 49, 33, 49, 33, 49, + 33, 19, 33, 49, 33, 49, 33, 49, 33, 19, 33, 49, + 33, 49, 33, 49, 33, 49, 33, 209, 240, 240, 208, 35, + 13, 240, 240, 83, 193, 193, 193, 193, 193, 193, 148, 24, + 49, 65, 49, 49, 65, 49, 49, 65, 49, 49, 65, 49, + 49, 65, 49, 49, 65, 49, 49, 240, 240, 160, 8, 3, + 240, 146, 18, 240, 240, 16, 21, 6, 227, 81, 81, 81, + 81, 81, 18, 33, 18, 33, 81, 81, 81, 81, 81, 81, + 81, 240, 64, + 0, // Padding + +}; + +tFont *g_psFontWHangulmyeongjo16pt = (tFont *)g_pui8Hangulmyeongjo16pt; diff --git a/third_party/fonts/ofl/fonts/fonthangulmyeongjo16ptb.c b/third_party/fonts/ofl/fonts/fonthangulmyeongjo16ptb.c new file mode 100644 index 0000000..9b12253 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulmyeongjo16ptb.c @@ -0,0 +1,752 @@ +//***************************************************************************** +// +// fonthangulmyeongjo16ptb.c - Font definition for the 16ptpt Hangulmyeongjo bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulmyeongjo +// Size: 16pt +// Bold: yes +// Italic: no +// Memory usage: 5165 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulmyeongjo16ptb[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 15, + + // + // The height of the font. + // + 19, + + // + // The baseline of the font. + // + 14, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x9c, 0x09, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x90, 0x01, 0x00, 0x00, // Offset 400 (0x190) + 0x9d, 0x01, 0x00, 0x00, // Offset 413 (0x19d) + 0xb9, 0x01, 0x00, 0x00, // Offset 441 (0x1b9) + 0xd7, 0x01, 0x00, 0x00, // Offset 471 (0x1d7) + 0x00, 0x02, 0x00, 0x00, // Offset 512 (0x200) + 0x22, 0x02, 0x00, 0x00, // Offset 546 (0x222) + 0x2b, 0x02, 0x00, 0x00, // Offset 555 (0x22b) + 0x3f, 0x02, 0x00, 0x00, // Offset 575 (0x23f) + 0x53, 0x02, 0x00, 0x00, // Offset 595 (0x253) + 0x5e, 0x02, 0x00, 0x00, // Offset 606 (0x25e) + 0x6d, 0x02, 0x00, 0x00, // Offset 621 (0x26d) + 0x76, 0x02, 0x00, 0x00, // Offset 630 (0x276) + 0x7e, 0x02, 0x00, 0x00, // Offset 638 (0x27e) + 0x85, 0x02, 0x00, 0x00, // Offset 645 (0x285) + 0x98, 0x02, 0x00, 0x00, // Offset 664 (0x298) + 0xb3, 0x02, 0x00, 0x00, // Offset 691 (0x2b3) + 0xc5, 0x02, 0x00, 0x00, // Offset 709 (0x2c5) + 0xd9, 0x02, 0x00, 0x00, // Offset 729 (0x2d9) + 0xec, 0x02, 0x00, 0x00, // Offset 748 (0x2ec) + 0x03, 0x03, 0x00, 0x00, // Offset 771 (0x303) + 0x16, 0x03, 0x00, 0x00, // Offset 790 (0x316) + 0x2f, 0x03, 0x00, 0x00, // Offset 815 (0x32f) + 0x42, 0x03, 0x00, 0x00, // Offset 834 (0x342) + 0x5c, 0x03, 0x00, 0x00, // Offset 860 (0x35c) + 0x74, 0x03, 0x00, 0x00, // Offset 884 (0x374) + 0x7d, 0x03, 0x00, 0x00, // Offset 893 (0x37d) + 0x87, 0x03, 0x00, 0x00, // Offset 903 (0x387) + 0x99, 0x03, 0x00, 0x00, // Offset 921 (0x399) + 0xa3, 0x03, 0x00, 0x00, // Offset 931 (0x3a3) + 0xb6, 0x03, 0x00, 0x00, // Offset 950 (0x3b6) + 0xcc, 0x03, 0x00, 0x00, // Offset 972 (0x3cc) + 0xf6, 0x03, 0x00, 0x00, // Offset 1014 (0x3f6) + 0x11, 0x04, 0x00, 0x00, // Offset 1041 (0x411) + 0x2b, 0x04, 0x00, 0x00, // Offset 1067 (0x42b) + 0x42, 0x04, 0x00, 0x00, // Offset 1090 (0x442) + 0x5e, 0x04, 0x00, 0x00, // Offset 1118 (0x45e) + 0x77, 0x04, 0x00, 0x00, // Offset 1143 (0x477) + 0x8e, 0x04, 0x00, 0x00, // Offset 1166 (0x48e) + 0xa7, 0x04, 0x00, 0x00, // Offset 1191 (0x4a7) + 0xc4, 0x04, 0x00, 0x00, // Offset 1220 (0x4c4) + 0xd5, 0x04, 0x00, 0x00, // Offset 1237 (0x4d5) + 0xea, 0x04, 0x00, 0x00, // Offset 1258 (0x4ea) + 0x07, 0x05, 0x00, 0x00, // Offset 1287 (0x507) + 0x1b, 0x05, 0x00, 0x00, // Offset 1307 (0x51b) + 0x47, 0x05, 0x00, 0x00, // Offset 1351 (0x547) + 0x6b, 0x05, 0x00, 0x00, // Offset 1387 (0x56b) + 0x87, 0x05, 0x00, 0x00, // Offset 1415 (0x587) + 0x9e, 0x05, 0x00, 0x00, // Offset 1438 (0x59e) + 0xbc, 0x05, 0x00, 0x00, // Offset 1468 (0x5bc) + 0xd8, 0x05, 0x00, 0x00, // Offset 1496 (0x5d8) + 0xee, 0x05, 0x00, 0x00, // Offset 1518 (0x5ee) + 0x02, 0x06, 0x00, 0x00, // Offset 1538 (0x602) + 0x1f, 0x06, 0x00, 0x00, // Offset 1567 (0x61f) + 0x3a, 0x06, 0x00, 0x00, // Offset 1594 (0x63a) + 0x66, 0x06, 0x00, 0x00, // Offset 1638 (0x666) + 0x82, 0x06, 0x00, 0x00, // Offset 1666 (0x682) + 0x99, 0x06, 0x00, 0x00, // Offset 1689 (0x699) + 0xae, 0x06, 0x00, 0x00, // Offset 1710 (0x6ae) + 0xc1, 0x06, 0x00, 0x00, // Offset 1729 (0x6c1) + 0xe9, 0x06, 0x00, 0x00, // Offset 1769 (0x6e9) + 0xfc, 0x06, 0x00, 0x00, // Offset 1788 (0x6fc) + 0x06, 0x07, 0x00, 0x00, // Offset 1798 (0x706) + 0x0d, 0x07, 0x00, 0x00, // Offset 1805 (0x70d) + 0x15, 0x07, 0x00, 0x00, // Offset 1813 (0x715) + 0x28, 0x07, 0x00, 0x00, // Offset 1832 (0x728) + 0x42, 0x07, 0x00, 0x00, // Offset 1858 (0x742) + 0x53, 0x07, 0x00, 0x00, // Offset 1875 (0x753) + 0x6b, 0x07, 0x00, 0x00, // Offset 1899 (0x76b) + 0x7c, 0x07, 0x00, 0x00, // Offset 1916 (0x77c) + 0x8e, 0x07, 0x00, 0x00, // Offset 1934 (0x78e) + 0xa6, 0x07, 0x00, 0x00, // Offset 1958 (0x7a6) + 0xbf, 0x07, 0x00, 0x00, // Offset 1983 (0x7bf) + 0xcd, 0x07, 0x00, 0x00, // Offset 1997 (0x7cd) + 0xde, 0x07, 0x00, 0x00, // Offset 2014 (0x7de) + 0xf7, 0x07, 0x00, 0x00, // Offset 2039 (0x7f7) + 0x08, 0x08, 0x00, 0x00, // Offset 2056 (0x808) + 0x25, 0x08, 0x00, 0x00, // Offset 2085 (0x825) + 0x3b, 0x08, 0x00, 0x00, // Offset 2107 (0x83b) + 0x4f, 0x08, 0x00, 0x00, // Offset 2127 (0x84f) + 0x67, 0x08, 0x00, 0x00, // Offset 2151 (0x867) + 0x7f, 0x08, 0x00, 0x00, // Offset 2175 (0x87f) + 0x8f, 0x08, 0x00, 0x00, // Offset 2191 (0x88f) + 0xa0, 0x08, 0x00, 0x00, // Offset 2208 (0x8a0) + 0xb0, 0x08, 0x00, 0x00, // Offset 2224 (0x8b0) + 0xc6, 0x08, 0x00, 0x00, // Offset 2246 (0x8c6) + 0xd9, 0x08, 0x00, 0x00, // Offset 2265 (0x8d9) + 0xf7, 0x08, 0x00, 0x00, // Offset 2295 (0x8f7) + 0x0c, 0x09, 0x00, 0x00, // Offset 2316 (0x90c) + 0x23, 0x09, 0x00, 0x00, // Offset 2339 (0x923) + 0x35, 0x09, 0x00, 0x00, // Offset 2357 (0x935) + 0x48, 0x09, 0x00, 0x00, // Offset 2376 (0x948) + 0x59, 0x09, 0x00, 0x00, // Offset 2393 (0x959) + 0x6c, 0x09, 0x00, 0x00, // Offset 2412 (0x96c) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 7, 0, 16, 80, 15, 3, 98, 18, 18, 18, 18, + 33, 33, 33, 33, 33, 66, 18, 208, 13, 4, 1, 17, + 17, 17, 17, 17, 17, 17, 0, 7, 80, 28, 10, 240, + 145, 33, 97, 33, 82, 18, 56, 65, 33, 97, 33, 97, + 33, 57, 50, 18, 81, 33, 97, 33, 97, 33, 0, 6, + 96, 30, 8, 177, 85, 33, 33, 17, 33, 33, 65, 33, + 81, 17, 98, 115, 81, 18, 65, 33, 17, 33, 33, 17, + 33, 33, 37, 81, 113, 240, 208, 41, 14, 240, 243, 65, + 82, 36, 82, 49, 33, 81, 65, 17, 97, 49, 33, 97, + 34, 17, 34, 66, 34, 17, 33, 113, 18, 34, 81, 33, + 50, 81, 18, 49, 81, 49, 33, 82, 66, 0, 9, 32, + 34, 13, 240, 243, 146, 33, 129, 49, 129, 34, 129, 18, + 20, 66, 65, 66, 17, 65, 65, 49, 33, 66, 50, 17, + 66, 66, 83, 51, 33, 37, 35, 0, 8, 48, 9, 2, + 1, 17, 17, 17, 240, 240, 16, 20, 6, 65, 65, 66, + 50, 66, 50, 66, 66, 66, 66, 66, 82, 66, 82, 81, + 97, 240, 64, 20, 6, 1, 97, 82, 82, 66, 82, 66, + 66, 66, 66, 66, 50, 66, 50, 65, 65, 240, 128, 11, + 7, 146, 54, 22, 22, 22, 50, 0, 10, 112, 15, 9, + 240, 240, 146, 114, 114, 72, 66, 114, 114, 114, 0, 8, + 48, 9, 3, 240, 240, 98, 18, 33, 17, 176, 8, 9, + 0, 7, 120, 0, 12, 64, 7, 3, 240, 240, 146, 18, + 208, 19, 7, 193, 97, 82, 81, 97, 82, 81, 97, 81, + 97, 82, 81, 97, 82, 240, 240, 48, 27, 9, 240, 84, + 66, 34, 50, 34, 34, 66, 18, 66, 18, 66, 18, 66, + 18, 66, 18, 66, 33, 50, 50, 34, 68, 0, 6, 18, + 7, 161, 67, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 54, 240, 240, 96, 20, 8, 240, 51, 50, 34, 33, + 66, 98, 98, 82, 98, 82, 82, 82, 82, 103, 240, 240, + 176, 19, 7, 244, 33, 50, 82, 82, 66, 51, 98, 98, + 82, 82, 17, 34, 36, 240, 240, 128, 23, 10, 240, 162, + 130, 115, 97, 18, 97, 18, 81, 34, 81, 34, 65, 50, + 57, 98, 130, 130, 0, 6, 80, 19, 8, 240, 53, 33, + 113, 100, 115, 99, 98, 98, 98, 97, 34, 34, 36, 240, + 240, 224, 25, 8, 240, 83, 51, 67, 82, 82, 18, 51, + 33, 34, 50, 18, 50, 18, 50, 18, 50, 34, 18, 67, + 240, 240, 208, 19, 8, 240, 23, 17, 66, 97, 113, 98, + 97, 113, 113, 98, 97, 113, 98, 240, 240, 224, 26, 9, + 240, 69, 51, 34, 34, 65, 34, 65, 50, 49, 68, 66, + 19, 34, 66, 18, 66, 18, 66, 19, 34, 68, 0, 6, + 24, 8, 240, 51, 66, 18, 34, 50, 18, 50, 18, 50, + 18, 50, 33, 50, 53, 82, 98, 82, 51, 240, 240, 240, + 9, 3, 194, 18, 240, 18, 18, 240, 64, 10, 3, 194, + 18, 240, 18, 18, 33, 17, 224, 18, 7, 193, 81, 82, + 81, 81, 81, 82, 81, 113, 113, 98, 98, 97, 113, 240, + 224, 10, 9, 0, 6, 104, 240, 72, 0, 10, 32, 19, + 7, 113, 113, 98, 97, 113, 113, 98, 82, 81, 81, 82, + 66, 81, 81, 240, 240, 64, 22, 8, 240, 51, 50, 35, + 17, 66, 17, 66, 17, 66, 82, 97, 98, 97, 113, 226, + 98, 240, 240, 96, 42, 13, 240, 245, 98, 81, 66, 35, + 33, 49, 33, 34, 33, 18, 18, 34, 33, 17, 33, 50, + 33, 17, 18, 49, 49, 17, 18, 34, 34, 18, 17, 34, + 18, 49, 19, 19, 82, 82, 101, 0, 8, 80, 27, 12, + 240, 225, 178, 145, 17, 145, 18, 129, 18, 113, 49, 113, + 50, 102, 82, 65, 81, 82, 65, 82, 36, 52, 0, 7, + 80, 26, 9, 240, 54, 66, 34, 50, 34, 50, 34, 50, + 33, 68, 82, 34, 50, 50, 34, 50, 34, 50, 34, 34, + 38, 0, 6, 23, 11, 240, 180, 82, 66, 34, 97, 33, + 146, 146, 146, 146, 147, 97, 34, 97, 51, 50, 85, 0, + 7, 16, 28, 13, 240, 184, 114, 66, 82, 82, 66, 82, + 66, 98, 50, 98, 50, 98, 50, 98, 50, 97, 66, 82, + 66, 66, 56, 0, 8, 96, 25, 11, 240, 121, 66, 50, + 66, 65, 66, 146, 33, 101, 98, 33, 98, 33, 98, 146, + 81, 50, 65, 41, 0, 7, 16, 23, 10, 240, 89, 50, + 65, 50, 65, 50, 130, 49, 70, 66, 49, 66, 49, 66, + 130, 130, 101, 0, 6, 112, 25, 12, 240, 213, 82, 66, + 50, 97, 50, 146, 162, 162, 84, 18, 98, 50, 82, 50, + 82, 66, 66, 101, 0, 7, 112, 29, 15, 240, 245, 69, + 50, 98, 82, 98, 82, 98, 82, 98, 90, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 53, 69, 0, 9, 64, + 17, 6, 197, 50, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 37, 240, 240, 16, 21, 8, 240, 53, 66, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 49, 33, + 67, 208, 29, 13, 240, 181, 51, 66, 81, 82, 65, 98, + 49, 114, 18, 132, 146, 33, 130, 34, 114, 50, 98, 65, + 98, 66, 53, 67, 0, 8, 32, 20, 10, 240, 85, 98, + 130, 130, 130, 130, 130, 130, 130, 130, 81, 34, 81, 25, + 0, 6, 48, 44, 17, 240, 240, 82, 147, 66, 130, 82, + 115, 83, 99, 81, 17, 81, 18, 81, 18, 65, 18, 81, + 33, 49, 34, 81, 34, 33, 34, 81, 49, 17, 50, 81, + 51, 50, 81, 65, 66, 52, 49, 38, 0, 10, 96, 36, + 15, 240, 243, 101, 50, 113, 83, 97, 81, 18, 81, 81, + 34, 65, 81, 50, 49, 81, 50, 49, 81, 66, 33, 81, + 82, 17, 81, 99, 81, 114, 53, 97, 0, 9, 96, 28, + 13, 240, 244, 114, 66, 66, 98, 49, 114, 34, 130, 18, + 130, 18, 130, 18, 130, 34, 113, 50, 98, 66, 66, 116, + 0, 8, 96, 23, 10, 240, 102, 82, 34, 66, 50, 50, + 50, 50, 50, 50, 34, 69, 82, 130, 130, 130, 101, 0, + 6, 112, 30, 13, 240, 244, 114, 66, 66, 98, 49, 114, + 34, 130, 18, 130, 18, 130, 18, 130, 34, 113, 50, 98, + 66, 66, 101, 178, 195, 209, 240, 208, 28, 12, 240, 150, + 114, 34, 98, 50, 82, 50, 82, 50, 82, 34, 101, 114, + 33, 114, 34, 98, 50, 82, 66, 52, 67, 0, 7, 80, + 22, 8, 240, 52, 34, 49, 33, 65, 33, 114, 115, 115, + 99, 98, 17, 66, 17, 50, 37, 240, 240, 208, 20, 11, + 240, 122, 17, 50, 49, 82, 146, 146, 146, 146, 146, 146, + 146, 146, 132, 0, 7, 48, 29, 13, 240, 181, 67, 50, + 97, 66, 97, 66, 97, 66, 97, 66, 97, 66, 97, 66, + 97, 66, 97, 66, 97, 82, 65, 117, 0, 8, 80, 27, + 13, 240, 180, 68, 34, 98, 66, 81, 82, 81, 97, 65, + 114, 49, 129, 49, 129, 33, 146, 17, 162, 178, 193, 0, + 8, 112, 44, 17, 240, 240, 68, 27, 34, 50, 34, 33, + 65, 65, 33, 49, 66, 50, 17, 49, 81, 51, 49, 98, + 50, 49, 113, 50, 33, 129, 50, 33, 130, 17, 18, 17, + 145, 17, 34, 162, 50, 177, 65, 0, 11, 32, 28, 13, + 240, 181, 52, 50, 81, 97, 65, 129, 49, 130, 17, 162, + 179, 145, 33, 145, 49, 113, 66, 81, 98, 36, 68, 0, + 8, 32, 23, 13, 240, 180, 68, 34, 97, 82, 81, 98, + 49, 130, 17, 147, 178, 178, 178, 178, 178, 165, 0, 8, + 80, 21, 11, 240, 122, 17, 98, 33, 82, 145, 146, 130, + 130, 145, 146, 130, 97, 18, 113, 26, 0, 7, 19, 6, + 101, 18, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 69, 240, 64, 40, 17, 240, 240, 68, 21, 36, + 34, 65, 82, 65, 66, 65, 82, 65, 65, 63, 1, 65, + 49, 17, 33, 114, 17, 33, 33, 129, 17, 33, 33, 129, + 17, 50, 146, 66, 161, 66, 161, 0, 12, 19, 6, 101, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 21, 240, 64, 10, 9, 50, 100, 66, 49, 33, 97, + 0, 17, 7, 9, 0, 16, 120, 240, 208, 8, 4, 66, + 49, 65, 0, 7, 80, 19, 8, 0, 6, 35, 50, 34, + 34, 34, 98, 53, 34, 34, 34, 34, 39, 240, 240, 176, + 26, 8, 130, 98, 98, 98, 98, 98, 19, 35, 18, 34, + 50, 18, 50, 18, 50, 18, 50, 18, 34, 33, 19, 240, + 240, 208, 17, 8, 0, 6, 36, 50, 34, 18, 98, 98, + 98, 114, 49, 52, 240, 240, 192, 24, 9, 226, 114, 114, + 114, 114, 69, 50, 34, 34, 50, 34, 50, 34, 50, 34, + 50, 50, 34, 55, 0, 5, 96, 17, 7, 240, 240, 227, + 49, 34, 22, 18, 82, 82, 98, 33, 51, 240, 240, 112, + 18, 6, 146, 49, 66, 66, 66, 53, 34, 66, 66, 66, + 66, 66, 52, 240, 240, 32, 24, 8, 0, 6, 22, 18, + 34, 34, 50, 18, 50, 18, 50, 51, 65, 117, 49, 65, + 17, 81, 18, 49, 52, 176, 25, 9, 162, 114, 114, 114, + 114, 114, 18, 67, 18, 50, 34, 50, 34, 50, 34, 50, + 34, 50, 34, 40, 0, 5, 96, 14, 5, 178, 50, 210, + 50, 50, 50, 50, 50, 50, 36, 240, 176, 17, 4, 146, + 34, 177, 19, 34, 34, 34, 34, 34, 34, 34, 34, 33, + 33, 112, 25, 10, 178, 130, 130, 130, 130, 130, 35, 50, + 49, 66, 18, 83, 114, 17, 98, 33, 82, 34, 52, 35, + 0, 6, 48, 17, 5, 98, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 36, 240, 176, 29, 13, 0, 9, + 114, 18, 34, 67, 19, 18, 50, 34, 34, 50, 34, 34, + 50, 34, 34, 50, 34, 34, 50, 34, 34, 44, 0, 8, + 32, 22, 9, 0, 6, 114, 19, 51, 18, 50, 34, 50, + 34, 50, 34, 50, 34, 50, 34, 40, 0, 5, 96, 20, + 9, 0, 7, 4, 66, 34, 34, 66, 18, 66, 18, 66, + 18, 66, 34, 34, 68, 0, 6, 24, 9, 0, 6, 114, + 19, 51, 18, 50, 50, 34, 50, 34, 50, 34, 50, 34, + 34, 53, 66, 114, 114, 100, 224, 24, 9, 0, 7, 3, + 17, 50, 34, 34, 50, 34, 50, 34, 50, 34, 50, 50, + 34, 54, 114, 114, 114, 100, 160, 16, 7, 240, 240, 210, + 18, 37, 34, 82, 82, 82, 82, 69, 240, 240, 112, 17, + 6, 240, 240, 115, 33, 33, 33, 98, 82, 82, 17, 34, + 20, 240, 240, 32, 16, 6, 240, 177, 81, 53, 34, 66, + 66, 66, 66, 66, 68, 240, 240, 16, 22, 9, 0, 6, + 99, 19, 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, + 50, 34, 55, 0, 5, 96, 19, 9, 0, 6, 100, 19, + 34, 49, 65, 49, 65, 33, 82, 17, 98, 114, 0, 7, + 32, 30, 14, 0, 10, 67, 35, 35, 34, 49, 65, 65, + 50, 33, 81, 33, 17, 33, 82, 17, 17, 17, 114, 35, + 114, 50, 129, 49, 0, 9, 48, 21, 10, 0, 7, 83, + 35, 49, 49, 97, 17, 114, 146, 113, 18, 81, 49, 51, + 36, 0, 6, 48, 23, 9, 0, 6, 99, 35, 33, 65, + 50, 33, 81, 33, 81, 17, 99, 113, 129, 129, 113, 99, + 98, 240, 16, 18, 8, 0, 6, 21, 33, 49, 98, 97, + 97, 98, 49, 33, 49, 38, 240, 240, 192, 19, 6, 131, + 34, 66, 66, 66, 66, 66, 49, 98, 66, 66, 66, 66, + 66, 83, 240, 64, 17, 3, 50, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 208, 19, 6, 99, + 82, 66, 66, 66, 66, 66, 97, 50, 66, 66, 66, 66, + 66, 35, 240, 96, 14, 11, 0, 8, 51, 81, 33, 34, + 33, 33, 67, 0, 14, 16, + 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8f, 0x01, 0x00, 0x00, // Offset 399 (0x18f) + 0xa5, 0x01, 0x00, 0x00, // Offset 421 (0x1a5) + 0xbe, 0x01, 0x00, 0x00, // Offset 446 (0x1be) + 0xcd, 0x01, 0x00, 0x00, // Offset 461 (0x1cd) + 0xe5, 0x01, 0x00, 0x00, // Offset 485 (0x1e5) + 0xfb, 0x01, 0x00, 0x00, // Offset 507 (0x1fb) + 0x09, 0x02, 0x00, 0x00, // Offset 521 (0x209) + 0x1c, 0x02, 0x00, 0x00, // Offset 540 (0x21c) + 0x2b, 0x02, 0x00, 0x00, // Offset 555 (0x22b) + 0x42, 0x02, 0x00, 0x00, // Offset 578 (0x242) + 0x5c, 0x02, 0x00, 0x00, // Offset 604 (0x25c) + 0x79, 0x02, 0x00, 0x00, // Offset 633 (0x279) + 0x92, 0x02, 0x00, 0x00, // Offset 658 (0x292) + 0xa6, 0x02, 0x00, 0x00, // Offset 678 (0x2a6) + 0xbd, 0x02, 0x00, 0x00, // Offset 701 (0x2bd) + 0xd2, 0x02, 0x00, 0x00, // Offset 722 (0x2d2) + 0xe6, 0x02, 0x00, 0x00, // Offset 742 (0x2e6) + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x1f, 0x03, 0x00, 0x00, // Offset 799 (0x31f) + 0x3e, 0x03, 0x00, 0x00, // Offset 830 (0x33e) + 0x52, 0x03, 0x00, 0x00, // Offset 850 (0x352) + 0x6c, 0x03, 0x00, 0x00, // Offset 876 (0x36c) + 0x81, 0x03, 0x00, 0x00, // Offset 897 (0x381) + 0x92, 0x03, 0x00, 0x00, // Offset 914 (0x392) + 0xab, 0x03, 0x00, 0x00, // Offset 939 (0x3ab) + 0xbd, 0x03, 0x00, 0x00, // Offset 957 (0x3bd) + 0xcb, 0x03, 0x00, 0x00, // Offset 971 (0x3cb) + 0xd9, 0x03, 0x00, 0x00, // Offset 985 (0x3d9) + 0xec, 0x03, 0x00, 0x00, // Offset 1004 (0x3ec) + 0x00, 0x04, 0x00, 0x00, // Offset 1024 (0x400) + 0x14, 0x04, 0x00, 0x00, // Offset 1044 (0x414) + 0x35, 0x04, 0x00, 0x00, // Offset 1077 (0x435) + 0x49, 0x04, 0x00, 0x00, // Offset 1097 (0x449) + 0x67, 0x04, 0x00, 0x00, // Offset 1127 (0x467) + 0x7a, 0x04, 0x00, 0x00, // Offset 1146 (0x47a) + 0x9b, 0x04, 0x00, 0x00, // Offset 1179 (0x49b) + 0xaf, 0x04, 0x00, 0x00, // Offset 1199 (0x4af) + 0xd1, 0x04, 0x00, 0x00, // Offset 1233 (0x4d1) + 0xde, 0x04, 0x00, 0x00, // Offset 1246 (0x4de) + 0xf6, 0x04, 0x00, 0x00, // Offset 1270 (0x4f6) + 0x1c, 0x05, 0x00, 0x00, // Offset 1308 (0x51c) + 0x37, 0x05, 0x00, 0x00, // Offset 1335 (0x537) + 0x49, 0x05, 0x00, 0x00, // Offset 1353 (0x549) + 0x58, 0x05, 0x00, 0x00, // Offset 1368 (0x558) + 0x75, 0x05, 0x00, 0x00, // Offset 1397 (0x575) + 0x9f, 0x05, 0x00, 0x00, // Offset 1439 (0x59f) + 0xbc, 0x05, 0x00, 0x00, // Offset 1468 (0x5bc) + 0xd2, 0x05, 0x00, 0x00, // Offset 1490 (0x5d2) + 0xda, 0x05, 0x00, 0x00, // Offset 1498 (0x5da) + 0xf0, 0x05, 0x00, 0x00, // Offset 1520 (0x5f0) + 0x02, 0x06, 0x00, 0x00, // Offset 1538 (0x602) + 0x08, 0x06, 0x00, 0x00, // Offset 1544 (0x608) + 0x1e, 0x06, 0x00, 0x00, // Offset 1566 (0x61e) + 0x33, 0x06, 0x00, 0x00, // Offset 1587 (0x633) + 0x4b, 0x06, 0x00, 0x00, // Offset 1611 (0x64b) + 0x65, 0x06, 0x00, 0x00, // Offset 1637 (0x665) + 0x85, 0x06, 0x00, 0x00, // Offset 1669 (0x685) + 0x99, 0x06, 0x00, 0x00, // Offset 1689 (0x699) + 0xb9, 0x06, 0x00, 0x00, // Offset 1721 (0x6b9) + 0xd2, 0x06, 0x00, 0x00, // Offset 1746 (0x6d2) + 0xe8, 0x06, 0x00, 0x00, // Offset 1768 (0x6e8) + 0x07, 0x07, 0x00, 0x00, // Offset 1799 (0x707) + 0x23, 0x07, 0x00, 0x00, // Offset 1827 (0x723) + 0x3f, 0x07, 0x00, 0x00, // Offset 1855 (0x73f) + 0x59, 0x07, 0x00, 0x00, // Offset 1881 (0x759) + 0x76, 0x07, 0x00, 0x00, // Offset 1910 (0x776) + 0x8f, 0x07, 0x00, 0x00, // Offset 1935 (0x78f) + 0xb1, 0x07, 0x00, 0x00, // Offset 1969 (0x7b1) + 0xd1, 0x07, 0x00, 0x00, // Offset 2001 (0x7d1) + 0xf0, 0x07, 0x00, 0x00, // Offset 2032 (0x7f0) + 0x09, 0x08, 0x00, 0x00, // Offset 2057 (0x809) + 0x24, 0x08, 0x00, 0x00, // Offset 2084 (0x824) + 0x4a, 0x08, 0x00, 0x00, // Offset 2122 (0x84a) + 0x62, 0x08, 0x00, 0x00, // Offset 2146 (0x862) + 0x7b, 0x08, 0x00, 0x00, // Offset 2171 (0x87b) + 0x93, 0x08, 0x00, 0x00, // Offset 2195 (0x893) + 0xb3, 0x08, 0x00, 0x00, // Offset 2227 (0x8b3) + 0xcf, 0x08, 0x00, 0x00, // Offset 2255 (0x8cf) + 0xe2, 0x08, 0x00, 0x00, // Offset 2274 (0x8e2) + 0x03, 0x09, 0x00, 0x00, // Offset 2307 (0x903) + 0x17, 0x09, 0x00, 0x00, // Offset 2327 (0x917) + 0x34, 0x09, 0x00, 0x00, // Offset 2356 (0x934) + 0x50, 0x09, 0x00, 0x00, // Offset 2384 (0x950) + 0x6b, 0x09, 0x00, 0x00, // Offset 2411 (0x96b) + 0x84, 0x09, 0x00, 0x00, // Offset 2436 (0x984) + 0x97, 0x09, 0x00, 0x00, // Offset 2455 (0x997) + 0xb6, 0x09, 0x00, 0x00, // Offset 2486 (0x9b6) + 0xe1, 0x09, 0x00, 0x00, // Offset 2529 (0x9e1) + 0x00, 0x0a, 0x00, 0x00, // Offset 2560 (0xa00) + 0x22, 0x0a, 0x00, 0x00, // Offset 2594 (0xa22) + 0x54, 0x0a, 0x00, 0x00, // Offset 2644 (0xa54) + 0x76, 0x0a, 0x00, 0x00, // Offset 2678 (0xa76) + 0x7e, 0x0a, 0x00, 0x00, // Offset 2686 (0xa7e) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 15, 10, 0, 6, 41, 145, 145, 145, 145, 145, 145, 145, + 0, 7, 80, 22, 11, 0, 6, 122, 81, 65, 81, 65, + 81, 65, 81, 65, 81, 65, 81, 65, 81, 65, 0, 8, + 48, 25, 13, 0, 7, 49, 85, 50, 113, 49, 129, 34, + 129, 34, 129, 18, 17, 113, 17, 34, 98, 66, 81, 0, + 10, 96, 15, 11, 240, 240, 226, 161, 161, 161, 161, 161, + 161, 169, 0, 9, 96, 24, 14, 0, 8, 99, 40, 34, + 82, 82, 81, 98, 82, 82, 65, 18, 66, 50, 34, 54, + 66, 97, 0, 11, 64, 22, 14, 0, 7, 116, 51, 194, + 40, 34, 194, 68, 66, 49, 65, 50, 49, 65, 53, 20, + 0, 12, 80, 14, 11, 0, 6, 122, 33, 161, 161, 161, + 161, 169, 0, 9, 96, 19, 11, 0, 6, 122, 33, 49, + 97, 49, 97, 49, 97, 49, 97, 49, 105, 0, 9, 96, + 15, 12, 0, 6, 10, 177, 177, 177, 42, 50, 162, 170, + 0, 10, 80, 23, 11, 0, 7, 9, 82, 49, 81, 65, + 22, 49, 33, 113, 33, 113, 33, 19, 49, 34, 97, 0, + 8, 48, 26, 12, 0, 7, 90, 81, 17, 49, 81, 17, + 49, 21, 17, 49, 33, 65, 49, 33, 65, 49, 36, 21, + 113, 0, 9, 80, 29, 12, 0, 7, 2, 54, 49, 81, + 17, 49, 81, 21, 21, 17, 49, 33, 65, 49, 33, 65, + 49, 36, 21, 34, 49, 49, 0, 9, 16, 25, 13, 0, + 7, 49, 101, 34, 114, 33, 129, 49, 70, 18, 81, 81, + 17, 65, 65, 49, 49, 19, 66, 34, 0, 11, 20, 13, + 0, 8, 43, 81, 33, 145, 33, 86, 20, 49, 81, 97, + 81, 100, 37, 0, 11, 64, 23, 13, 0, 8, 43, 81, + 66, 97, 33, 33, 37, 33, 33, 49, 81, 33, 49, 81, + 33, 59, 0, 11, 64, 21, 14, 0, 7, 101, 68, 217, + 81, 149, 36, 65, 65, 65, 49, 50, 65, 52, 36, 0, + 12, 80, 20, 10, 0, 6, 41, 33, 97, 33, 97, 33, + 97, 33, 97, 33, 97, 40, 33, 0, 8, 64, 22, 9, + 240, 240, 179, 17, 97, 17, 97, 24, 17, 97, 17, 97, + 17, 97, 24, 17, 97, 0, 6, 112, 35, 11, 0, 5, + 97, 19, 18, 17, 33, 33, 33, 17, 33, 33, 33, 20, + 36, 17, 33, 33, 33, 17, 33, 33, 33, 17, 33, 33, + 33, 20, 36, 17, 0, 9, 64, 31, 13, 0, 6, 65, + 35, 34, 65, 49, 34, 65, 49, 34, 69, 33, 81, 49, + 19, 65, 49, 17, 18, 49, 51, 34, 38, 65, 33, 0, + 11, 16, 20, 12, 0, 6, 81, 193, 162, 161, 161, 17, + 129, 50, 81, 82, 49, 114, 17, 0, 10, 48, 26, 13, + 0, 7, 49, 130, 49, 113, 50, 98, 50, 98, 35, 82, + 17, 17, 18, 50, 50, 34, 33, 50, 66, 0, 11, 64, + 21, 10, 240, 240, 225, 114, 18, 66, 65, 34, 82, 18, + 82, 18, 82, 34, 50, 69, 0, 9, 16, 17, 13, 0, + 8, 41, 162, 162, 162, 164, 129, 66, 66, 99, 17, 0, + 11, 32, 25, 14, 0, 8, 122, 129, 50, 114, 49, 129, + 50, 113, 17, 19, 97, 35, 34, 49, 65, 66, 17, 65, + 0, 11, 64, 18, 13, 0, 6, 117, 240, 73, 162, 162, + 147, 146, 34, 82, 99, 17, 0, 11, 32, 14, 10, 0, + 6, 41, 145, 145, 40, 145, 145, 145, 0, 8, 112, 14, + 11, 0, 6, 122, 33, 161, 168, 49, 161, 169, 0, 9, + 96, 19, 12, 0, 7, 89, 66, 35, 97, 49, 113, 49, + 113, 49, 113, 49, 75, 0, 10, 80, 20, 13, 0, 6, + 117, 240, 60, 84, 115, 34, 98, 66, 82, 66, 98, 34, + 132, 0, 10, 48, 20, 7, 2, 113, 97, 97, 97, 97, + 97, 100, 49, 97, 97, 97, 97, 97, 97, 240, 240, 32, + 33, 7, 49, 50, 34, 49, 33, 49, 33, 49, 33, 49, + 33, 49, 33, 52, 49, 33, 49, 33, 49, 33, 49, 33, + 49, 33, 49, 33, 49, 33, 97, 240, 112, 20, 7, 1, + 114, 97, 97, 97, 100, 49, 97, 97, 100, 49, 97, 97, + 97, 97, 97, 240, 160, 30, 7, 163, 18, 49, 33, 49, + 33, 49, 33, 49, 37, 33, 49, 33, 49, 37, 33, 49, + 33, 49, 33, 49, 33, 49, 33, 49, 97, 240, 112, 19, + 6, 146, 81, 81, 81, 81, 81, 21, 81, 81, 81, 81, + 81, 81, 81, 81, 240, 64, 33, 8, 195, 50, 33, 65, + 33, 65, 33, 65, 33, 65, 33, 20, 33, 65, 33, 65, + 33, 65, 33, 65, 33, 65, 33, 65, 33, 65, 33, 65, + 33, 240, 160, 20, 6, 33, 98, 81, 81, 81, 21, 81, + 81, 81, 21, 81, 81, 81, 81, 81, 81, 240, 64, 34, + 8, 65, 67, 18, 65, 33, 65, 33, 65, 33, 20, 33, + 65, 33, 65, 33, 65, 33, 20, 33, 65, 33, 65, 33, + 65, 33, 65, 33, 65, 33, 113, 240, 160, 13, 14, 0, + 11, 18, 209, 209, 209, 209, 125, 0, 12, 48, 24, 15, + 130, 241, 225, 225, 225, 225, 114, 81, 129, 84, 81, 81, + 129, 81, 75, 66, 129, 225, 225, 225, 0, 8, 38, 14, + 162, 147, 33, 161, 33, 161, 33, 161, 33, 161, 33, 66, + 65, 33, 81, 68, 81, 65, 33, 81, 65, 33, 26, 33, + 33, 113, 33, 161, 33, 161, 33, 161, 33, 0, 7, 16, + 27, 12, 240, 98, 177, 177, 177, 177, 66, 81, 81, 81, + 81, 81, 81, 81, 81, 21, 22, 65, 177, 177, 177, 177, + 240, 240, 112, 18, 15, 0, 11, 82, 50, 145, 65, 145, + 65, 145, 65, 145, 65, 94, 0, 13, 32, 15, 15, 0, + 15, 14, 129, 225, 225, 225, 225, 225, 225, 0, 6, 64, + 29, 12, 129, 194, 177, 177, 177, 177, 177, 132, 23, 49, + 81, 81, 81, 81, 81, 21, 81, 81, 81, 81, 81, 81, + 81, 81, 240, 240, 112, 42, 13, 240, 82, 18, 161, 17, + 161, 17, 161, 17, 161, 17, 161, 17, 161, 17, 23, 33, + 17, 81, 65, 17, 81, 20, 17, 81, 65, 17, 81, 65, + 17, 81, 65, 17, 81, 65, 17, 193, 240, 240, 160, 29, + 13, 240, 130, 193, 193, 193, 193, 193, 193, 17, 56, 35, + 17, 81, 97, 81, 97, 81, 97, 81, 97, 81, 97, 81, + 193, 240, 240, 160, 22, 15, 0, 15, 14, 81, 65, 145, + 65, 145, 65, 145, 65, 145, 65, 145, 65, 145, 65, 0, + 6, 32, 8, 15, 0, 20, 94, 0, 13, 32, 22, 12, + 240, 98, 177, 177, 177, 177, 177, 177, 177, 177, 87, 20, + 97, 177, 177, 177, 177, 240, 240, 112, 18, 4, 67, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 208, 6, 2, 240, 17, 240, 96, 22, 14, 0, 8, + 99, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 51, + 49, 37, 21, 0, 12, 64, 21, 13, 0, 8, 18, 70, + 34, 65, 98, 65, 98, 65, 98, 65, 98, 50, 101, 21, + 0, 11, 64, 24, 14, 0, 8, 1, 83, 97, 82, 97, + 82, 82, 82, 82, 82, 66, 17, 66, 50, 49, 54, 66, + 0, 12, 48, 26, 13, 0, 7, 49, 82, 97, 66, 83, + 50, 81, 17, 50, 66, 33, 34, 65, 49, 34, 35, 49, + 36, 23, 0, 11, 64, 32, 16, 0, 9, 33, 104, 34, + 113, 49, 33, 129, 49, 33, 69, 49, 18, 81, 97, 17, + 17, 65, 99, 18, 49, 19, 34, 50, 34, 81, 0, 12, + 112, 20, 13, 0, 8, 42, 113, 17, 145, 33, 86, 17, + 97, 81, 97, 81, 100, 37, 0, 11, 64, 32, 16, 0, + 9, 1, 134, 33, 18, 113, 17, 33, 18, 113, 20, 18, + 53, 17, 33, 18, 65, 65, 37, 49, 65, 34, 34, 36, + 20, 65, 0, 14, 16, 25, 13, 0, 8, 37, 18, 129, + 34, 129, 33, 17, 54, 17, 17, 65, 65, 49, 49, 65, + 65, 33, 25, 49, 0, 11, 22, 13, 0, 8, 43, 81, + 193, 36, 37, 17, 50, 33, 65, 65, 33, 51, 34, 36, + 36, 0, 11, 80, 31, 12, 0, 7, 71, 34, 33, 33, + 17, 49, 33, 33, 21, 33, 33, 17, 49, 33, 33, 17, + 49, 33, 33, 17, 49, 36, 21, 33, 0, 10, 32, 28, + 14, 0, 8, 102, 34, 81, 49, 34, 81, 49, 34, 81, + 49, 34, 81, 49, 17, 33, 65, 49, 17, 34, 54, 66, + 0, 12, 48, 28, 12, 0, 7, 69, 34, 65, 33, 34, + 65, 33, 33, 17, 49, 33, 18, 17, 49, 33, 17, 49, + 33, 35, 49, 42, 0, 10, 80, 26, 9, 240, 56, 33, + 66, 33, 66, 33, 66, 33, 66, 39, 211, 67, 19, 34, + 50, 34, 50, 35, 19, 52, 240, 240, 144, 29, 12, 0, + 6, 1, 55, 33, 49, 65, 33, 49, 65, 37, 65, 33, + 49, 65, 33, 49, 65, 33, 49, 65, 37, 65, 33, 0, + 10, 32, 25, 12, 0, 7, 66, 39, 33, 49, 17, 85, + 17, 81, 49, 17, 81, 49, 17, 81, 49, 17, 85, 20, + 0, 10, 80, 34, 14, 0, 8, 98, 18, 38, 33, 33, + 34, 49, 33, 33, 34, 49, 36, 33, 65, 33, 33, 19, + 49, 33, 35, 33, 33, 37, 50, 17, 33, 161, 0, 10, + 80, 32, 15, 0, 9, 50, 33, 38, 49, 33, 33, 33, + 81, 33, 33, 33, 84, 18, 33, 81, 33, 17, 17, 17, + 81, 35, 19, 85, 53, 33, 0, 12, 112, 31, 14, 0, + 8, 98, 34, 22, 33, 49, 49, 85, 49, 81, 49, 34, + 81, 49, 33, 17, 65, 49, 17, 49, 53, 17, 50, 33, + 65, 0, 11, 48, 25, 13, 0, 8, 18, 39, 49, 49, + 17, 101, 17, 97, 49, 20, 49, 49, 17, 97, 49, 17, + 101, 21, 0, 11, 64, 27, 9, 225, 50, 66, 33, 81, + 39, 33, 81, 33, 81, 39, 33, 163, 67, 19, 34, 50, + 34, 50, 35, 19, 52, 240, 240, 144, 38, 11, 240, 21, + 18, 18, 17, 33, 33, 33, 17, 33, 36, 20, 33, 33, + 17, 33, 33, 33, 17, 33, 36, 20, 33, 65, 131, 99, + 19, 66, 50, 66, 50, 67, 19, 84, 0, 6, 24, 11, + 0, 7, 18, 21, 50, 81, 50, 81, 50, 81, 36, 65, + 33, 34, 49, 17, 66, 33, 161, 0, 8, 48, 25, 13, + 0, 6, 98, 34, 129, 49, 129, 49, 114, 49, 114, 49, + 98, 17, 33, 97, 49, 17, 81, 71, 0, 11, 64, 24, + 13, 0, 8, 66, 21, 81, 49, 129, 49, 114, 49, 113, + 17, 33, 97, 49, 17, 81, 65, 21, 0, 11, 64, 32, + 13, 0, 6, 99, 18, 34, 66, 33, 49, 65, 49, 49, + 65, 53, 51, 33, 49, 49, 18, 17, 49, 33, 49, 17, + 49, 17, 86, 129, 0, 10, 48, 28, 13, 0, 6, 97, + 209, 23, 50, 66, 81, 81, 98, 50, 81, 18, 33, 17, + 50, 36, 33, 33, 66, 50, 97, 81, 0, 9, 112, 19, + 9, 240, 240, 131, 99, 97, 17, 82, 33, 65, 49, 50, + 65, 33, 81, 40, 0, 8, 33, 14, 0, 7, 34, 82, + 68, 52, 34, 34, 18, 34, 17, 65, 17, 65, 17, 65, + 17, 65, 17, 65, 17, 65, 18, 34, 18, 34, 36, 52, + 0, 12, 64, 20, 9, 240, 240, 146, 129, 83, 18, 34, + 66, 18, 66, 18, 66, 34, 34, 68, 0, 8, 32, 29, + 12, 0, 6, 18, 66, 81, 66, 65, 17, 50, 49, 49, + 33, 65, 49, 19, 49, 49, 17, 33, 34, 19, 50, 36, + 81, 0, 10, 80, 28, 13, 0, 6, 82, 66, 97, 82, + 68, 50, 49, 65, 19, 49, 65, 17, 33, 33, 67, 33, + 34, 35, 65, 36, 22, 0, 11, 64, 27, 12, 240, 154, + 67, 18, 113, 34, 114, 18, 114, 18, 75, 240, 35, 115, + 19, 82, 50, 82, 50, 83, 19, 100, 0, 6, 80, 25, + 14, 0, 7, 20, 52, 240, 22, 22, 240, 35, 67, 49, + 49, 33, 49, 33, 49, 33, 49, 51, 67, 0, 12, 64, + 19, 13, 0, 8, 28, 240, 52, 115, 34, 98, 66, 82, + 66, 98, 34, 132, 0, 10, 48, 31, 15, 240, 146, 225, + 225, 225, 228, 49, 35, 33, 113, 49, 33, 113, 49, 33, + 113, 49, 36, 65, 52, 71, 49, 225, 225, 225, 225, 0, + 6, 16, 43, 13, 240, 65, 50, 130, 33, 145, 33, 145, + 33, 148, 33, 34, 33, 33, 49, 33, 33, 33, 49, 33, + 33, 33, 49, 33, 36, 49, 36, 33, 21, 49, 33, 145, + 33, 145, 33, 145, 33, 193, 240, 240, 160, 31, 13, 240, + 115, 193, 193, 193, 193, 50, 34, 49, 65, 49, 49, 65, + 49, 49, 65, 49, 49, 65, 53, 23, 65, 193, 193, 193, + 193, 240, 240, 160, 34, 13, 145, 210, 193, 193, 193, 193, + 193, 163, 25, 33, 65, 33, 65, 65, 33, 20, 65, 33, + 65, 65, 33, 20, 65, 33, 65, 65, 33, 65, 193, 240, + 240, 160, 50, 13, 240, 130, 146, 17, 161, 17, 161, 17, + 161, 17, 161, 17, 161, 17, 24, 17, 17, 49, 33, 49, + 17, 49, 33, 19, 17, 49, 33, 49, 17, 49, 33, 49, + 17, 49, 33, 19, 17, 49, 33, 49, 17, 49, 33, 49, + 17, 240, 240, 160, 34, 13, 240, 114, 209, 193, 193, 193, + 193, 193, 148, 24, 49, 65, 49, 49, 65, 49, 49, 65, + 49, 49, 65, 49, 49, 65, 49, 49, 65, 49, 49, 240, + 240, 160, 8, 3, 240, 98, 18, 240, 240, 16, 21, 6, + 131, 81, 81, 81, 81, 81, 18, 33, 18, 33, 81, 81, + 81, 81, 81, 81, 81, 240, 64, + 0, // Padding + +}; + +tFont *g_psFontWHangulmyeongjo16ptb = (tFont *)g_pui8Hangulmyeongjo16ptb; diff --git a/third_party/fonts/ofl/fonts/fonthangulmyeongjo18pt.c b/third_party/fonts/ofl/fonts/fonthangulmyeongjo18pt.c new file mode 100644 index 0000000..fdfb29e --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulmyeongjo18pt.c @@ -0,0 +1,798 @@ +//***************************************************************************** +// +// fonthangulmyeongjo18pt.c - Font definition for the 18ptpt Hangulmyeongjo font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulmyeongjo +// Size: 18pt +// Bold: no +// Italic: no +// Memory usage: 5711 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulmyeongjo18pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 17, + + // + // The height of the font. + // + 21, + + // + // The baseline of the font. + // + 16, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x88, 0x0a, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x91, 0x01, 0x00, 0x00, // Offset 401 (0x191) + 0x9d, 0x01, 0x00, 0x00, // Offset 413 (0x19d) + 0xbd, 0x01, 0x00, 0x00, // Offset 445 (0x1bd) + 0xdf, 0x01, 0x00, 0x00, // Offset 479 (0x1df) + 0x0d, 0x02, 0x00, 0x00, // Offset 525 (0x20d) + 0x34, 0x02, 0x00, 0x00, // Offset 564 (0x234) + 0x3d, 0x02, 0x00, 0x00, // Offset 573 (0x23d) + 0x51, 0x02, 0x00, 0x00, // Offset 593 (0x251) + 0x65, 0x02, 0x00, 0x00, // Offset 613 (0x265) + 0x73, 0x02, 0x00, 0x00, // Offset 627 (0x273) + 0x83, 0x02, 0x00, 0x00, // Offset 643 (0x283) + 0x8c, 0x02, 0x00, 0x00, // Offset 652 (0x28c) + 0x94, 0x02, 0x00, 0x00, // Offset 660 (0x294) + 0x9b, 0x02, 0x00, 0x00, // Offset 667 (0x29b) + 0xaf, 0x02, 0x00, 0x00, // Offset 687 (0x2af) + 0xce, 0x02, 0x00, 0x00, // Offset 718 (0x2ce) + 0xe1, 0x02, 0x00, 0x00, // Offset 737 (0x2e1) + 0xf7, 0x02, 0x00, 0x00, // Offset 759 (0x2f7) + 0x0e, 0x03, 0x00, 0x00, // Offset 782 (0x30e) + 0x28, 0x03, 0x00, 0x00, // Offset 808 (0x328) + 0x3d, 0x03, 0x00, 0x00, // Offset 829 (0x33d) + 0x58, 0x03, 0x00, 0x00, // Offset 856 (0x358) + 0x6e, 0x03, 0x00, 0x00, // Offset 878 (0x36e) + 0x8c, 0x03, 0x00, 0x00, // Offset 908 (0x38c) + 0xa8, 0x03, 0x00, 0x00, // Offset 936 (0x3a8) + 0xb1, 0x03, 0x00, 0x00, // Offset 945 (0x3b1) + 0xbd, 0x03, 0x00, 0x00, // Offset 957 (0x3bd) + 0xd2, 0x03, 0x00, 0x00, // Offset 978 (0x3d2) + 0xdd, 0x03, 0x00, 0x00, // Offset 989 (0x3dd) + 0xf3, 0x03, 0x00, 0x00, // Offset 1011 (0x3f3) + 0x0b, 0x04, 0x00, 0x00, // Offset 1035 (0x40b) + 0x3b, 0x04, 0x00, 0x00, // Offset 1083 (0x43b) + 0x5a, 0x04, 0x00, 0x00, // Offset 1114 (0x45a) + 0x79, 0x04, 0x00, 0x00, // Offset 1145 (0x479) + 0x91, 0x04, 0x00, 0x00, // Offset 1169 (0x491) + 0xb1, 0x04, 0x00, 0x00, // Offset 1201 (0x4b1) + 0xc9, 0x04, 0x00, 0x00, // Offset 1225 (0x4c9) + 0xe1, 0x04, 0x00, 0x00, // Offset 1249 (0x4e1) + 0xfc, 0x04, 0x00, 0x00, // Offset 1276 (0x4fc) + 0x1e, 0x05, 0x00, 0x00, // Offset 1310 (0x51e) + 0x31, 0x05, 0x00, 0x00, // Offset 1329 (0x531) + 0x48, 0x05, 0x00, 0x00, // Offset 1352 (0x548) + 0x6a, 0x05, 0x00, 0x00, // Offset 1386 (0x56a) + 0x80, 0x05, 0x00, 0x00, // Offset 1408 (0x580) + 0xb7, 0x05, 0x00, 0x00, // Offset 1463 (0x5b7) + 0xe1, 0x05, 0x00, 0x00, // Offset 1505 (0x5e1) + 0x02, 0x06, 0x00, 0x00, // Offset 1538 (0x602) + 0x1c, 0x06, 0x00, 0x00, // Offset 1564 (0x61c) + 0x3f, 0x06, 0x00, 0x00, // Offset 1599 (0x63f) + 0x5f, 0x06, 0x00, 0x00, // Offset 1631 (0x65f) + 0x75, 0x06, 0x00, 0x00, // Offset 1653 (0x675) + 0x8c, 0x06, 0x00, 0x00, // Offset 1676 (0x68c) + 0xad, 0x06, 0x00, 0x00, // Offset 1709 (0x6ad) + 0xca, 0x06, 0x00, 0x00, // Offset 1738 (0x6ca) + 0xfe, 0x06, 0x00, 0x00, // Offset 1790 (0x6fe) + 0x1d, 0x07, 0x00, 0x00, // Offset 1821 (0x71d) + 0x37, 0x07, 0x00, 0x00, // Offset 1847 (0x737) + 0x4e, 0x07, 0x00, 0x00, // Offset 1870 (0x74e) + 0x63, 0x07, 0x00, 0x00, // Offset 1891 (0x763) + 0x92, 0x07, 0x00, 0x00, // Offset 1938 (0x792) + 0xa7, 0x07, 0x00, 0x00, // Offset 1959 (0x7a7) + 0xb3, 0x07, 0x00, 0x00, // Offset 1971 (0x7b3) + 0xba, 0x07, 0x00, 0x00, // Offset 1978 (0x7ba) + 0xc2, 0x07, 0x00, 0x00, // Offset 1986 (0x7c2) + 0xd8, 0x07, 0x00, 0x00, // Offset 2008 (0x7d8) + 0xf4, 0x07, 0x00, 0x00, // Offset 2036 (0x7f4) + 0x06, 0x08, 0x00, 0x00, // Offset 2054 (0x806) + 0x22, 0x08, 0x00, 0x00, // Offset 2082 (0x822) + 0x34, 0x08, 0x00, 0x00, // Offset 2100 (0x834) + 0x48, 0x08, 0x00, 0x00, // Offset 2120 (0x848) + 0x61, 0x08, 0x00, 0x00, // Offset 2145 (0x861) + 0x7e, 0x08, 0x00, 0x00, // Offset 2174 (0x87e) + 0x8d, 0x08, 0x00, 0x00, // Offset 2189 (0x88d) + 0x9f, 0x08, 0x00, 0x00, // Offset 2207 (0x89f) + 0xbb, 0x08, 0x00, 0x00, // Offset 2235 (0x8bb) + 0xce, 0x08, 0x00, 0x00, // Offset 2254 (0x8ce) + 0xf0, 0x08, 0x00, 0x00, // Offset 2288 (0x8f0) + 0x09, 0x09, 0x00, 0x00, // Offset 2313 (0x909) + 0x1f, 0x09, 0x00, 0x00, // Offset 2335 (0x91f) + 0x39, 0x09, 0x00, 0x00, // Offset 2361 (0x939) + 0x52, 0x09, 0x00, 0x00, // Offset 2386 (0x952) + 0x64, 0x09, 0x00, 0x00, // Offset 2404 (0x964) + 0x76, 0x09, 0x00, 0x00, // Offset 2422 (0x976) + 0x87, 0x09, 0x00, 0x00, // Offset 2439 (0x987) + 0xa0, 0x09, 0x00, 0x00, // Offset 2464 (0x9a0) + 0xb6, 0x09, 0x00, 0x00, // Offset 2486 (0x9b6) + 0xd8, 0x09, 0x00, 0x00, // Offset 2520 (0x9d8) + 0xee, 0x09, 0x00, 0x00, // Offset 2542 (0x9ee) + 0x06, 0x0a, 0x00, 0x00, // Offset 2566 (0xa06) + 0x18, 0x0a, 0x00, 0x00, // Offset 2584 (0xa18) + 0x2e, 0x0a, 0x00, 0x00, // Offset 2606 (0xa2e) + 0x41, 0x0a, 0x00, 0x00, // Offset 2625 (0xa41) + 0x57, 0x0a, 0x00, 0x00, // Offset 2647 (0xa57) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 7, 0, 18, 48, 16, 3, 98, 18, 18, 18, 17, + 33, 33, 33, 33, 33, 33, 130, 18, 208, 12, 5, 81, + 33, 17, 33, 17, 33, 17, 0, 10, 64, 32, 11, 240, + 177, 33, 97, 49, 97, 49, 97, 33, 74, 65, 33, 97, + 49, 97, 49, 97, 49, 73, 65, 33, 98, 33, 97, 49, + 97, 49, 0, 7, 64, 34, 9, 193, 101, 49, 33, 33, + 33, 33, 81, 33, 81, 33, 97, 17, 115, 116, 81, 34, + 65, 49, 65, 49, 65, 49, 17, 33, 33, 53, 97, 129, + 240, 240, 32, 46, 15, 240, 240, 51, 65, 98, 22, 81, + 49, 49, 82, 49, 49, 81, 65, 33, 97, 49, 49, 97, + 49, 33, 131, 33, 52, 113, 33, 49, 97, 34, 49, 97, + 33, 65, 81, 49, 49, 97, 49, 49, 81, 83, 0, 9, + 96, 39, 15, 240, 240, 68, 161, 65, 145, 65, 145, 65, + 145, 49, 164, 51, 82, 81, 82, 18, 65, 81, 49, 65, + 65, 81, 33, 81, 83, 97, 98, 98, 65, 18, 49, 37, + 67, 0, 9, 80, 9, 2, 33, 17, 17, 17, 240, 240, + 48, 20, 5, 129, 49, 49, 65, 65, 49, 65, 65, 65, + 65, 65, 65, 81, 65, 81, 81, 240, 96, 20, 5, 81, + 81, 65, 81, 65, 81, 65, 65, 65, 65, 65, 49, 65, + 65, 49, 49, 240, 144, 14, 8, 177, 66, 17, 18, 37, + 81, 71, 65, 113, 0, 13, 64, 16, 10, 240, 240, 225, + 145, 145, 145, 89, 81, 145, 145, 145, 0, 10, 80, 9, + 4, 0, 7, 18, 19, 49, 33, 224, 8, 10, 0, 10, + 9, 0, 15, 16, 7, 3, 240, 240, 242, 18, 208, 20, + 7, 193, 97, 81, 97, 97, 81, 97, 81, 97, 97, 81, + 97, 81, 97, 97, 240, 240, 176, 31, 9, 240, 84, 65, + 65, 49, 65, 33, 97, 17, 97, 17, 97, 17, 97, 17, + 97, 17, 97, 17, 97, 17, 97, 33, 65, 49, 65, 68, + 0, 6, 19, 6, 225, 66, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 53, 240, 240, 16, 22, 8, 240, + 51, 65, 49, 33, 81, 113, 113, 113, 97, 98, 97, 97, + 98, 82, 97, 103, 240, 240, 176, 23, 8, 240, 36, 49, + 50, 33, 65, 113, 97, 113, 83, 129, 129, 113, 113, 113, + 17, 65, 37, 240, 240, 208, 26, 10, 240, 177, 130, 130, + 113, 17, 97, 33, 97, 33, 81, 49, 65, 65, 65, 65, + 57, 113, 145, 145, 145, 0, 6, 80, 21, 8, 240, 53, + 49, 97, 113, 115, 115, 113, 129, 113, 113, 113, 97, 33, + 65, 37, 240, 240, 208, 27, 9, 240, 131, 66, 97, 113, + 129, 113, 20, 50, 65, 33, 82, 17, 97, 17, 97, 17, + 97, 33, 81, 33, 65, 68, 0, 6, 22, 9, 240, 71, + 17, 82, 17, 81, 129, 129, 113, 129, 129, 113, 129, 129, + 129, 113, 129, 0, 6, 32, 30, 9, 240, 83, 81, 49, + 49, 81, 33, 81, 33, 81, 49, 49, 83, 81, 34, 49, + 82, 17, 97, 17, 97, 17, 97, 33, 65, 68, 0, 6, + 28, 9, 240, 84, 65, 65, 33, 81, 33, 97, 17, 97, + 17, 97, 17, 97, 33, 66, 52, 17, 113, 129, 113, 113, + 68, 0, 6, 32, 9, 3, 194, 18, 240, 66, 18, 240, + 112, 12, 4, 240, 34, 34, 240, 163, 49, 49, 33, 240, + 112, 21, 8, 225, 97, 97, 98, 97, 97, 97, 97, 113, + 129, 129, 113, 129, 129, 129, 113, 129, 240, 160, 11, 10, + 0, 7, 73, 240, 240, 25, 0, 12, 80, 22, 8, 129, + 129, 129, 129, 113, 129, 129, 129, 113, 97, 97, 113, 97, + 97, 97, 113, 97, 240, 240, 16, 24, 8, 240, 36, 49, + 65, 33, 81, 17, 81, 17, 81, 97, 113, 97, 113, 97, + 113, 240, 114, 98, 240, 240, 96, 48, 15, 240, 240, 85, + 130, 82, 81, 145, 49, 67, 17, 18, 33, 49, 50, 33, + 33, 33, 65, 49, 17, 49, 65, 49, 17, 33, 65, 65, + 17, 33, 65, 49, 33, 49, 34, 33, 65, 50, 34, 97, + 145, 81, 113, 119, 0, 9, 112, 31, 12, 240, 225, 177, + 161, 17, 145, 17, 129, 33, 129, 49, 113, 49, 97, 65, + 103, 81, 81, 65, 97, 65, 98, 49, 113, 35, 83, 0, + 7, 80, 31, 11, 240, 119, 97, 65, 81, 81, 65, 81, + 65, 81, 65, 65, 85, 97, 66, 65, 97, 49, 97, 49, + 97, 49, 97, 49, 81, 55, 0, 7, 32, 24, 12, 240, + 214, 81, 97, 34, 113, 33, 161, 177, 177, 177, 177, 177, + 193, 178, 113, 50, 97, 86, 0, 7, 96, 32, 13, 240, + 199, 113, 82, 81, 97, 81, 113, 65, 129, 49, 129, 49, + 129, 49, 129, 49, 129, 49, 129, 49, 113, 65, 113, 65, + 97, 57, 0, 8, 80, 24, 11, 240, 136, 65, 81, 65, + 161, 161, 161, 65, 86, 81, 65, 81, 65, 81, 161, 161, + 161, 97, 26, 0, 7, 24, 9, 240, 56, 33, 81, 33, + 129, 129, 129, 65, 54, 49, 65, 49, 65, 49, 129, 129, + 129, 115, 0, 6, 48, 27, 13, 240, 246, 82, 97, 50, + 113, 49, 177, 193, 193, 193, 193, 116, 17, 145, 49, 129, + 50, 113, 66, 97, 102, 0, 8, 64, 34, 16, 240, 240, + 37, 85, 49, 145, 81, 145, 81, 145, 81, 145, 81, 145, + 91, 81, 145, 81, 145, 81, 145, 81, 145, 81, 145, 81, + 145, 52, 115, 0, 10, 32, 19, 6, 197, 49, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 53, 240, 240, + 16, 23, 8, 240, 53, 81, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 49, 33, 67, 208, + 34, 12, 240, 148, 67, 49, 81, 81, 65, 97, 49, 113, + 33, 129, 17, 145, 18, 130, 17, 129, 49, 113, 50, 97, + 65, 97, 81, 81, 82, 51, 82, 0, 7, 80, 22, 10, + 240, 83, 129, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 97, 33, 97, 24, 0, 6, 64, 55, 18, 240, 240, + 114, 178, 66, 146, 82, 146, 81, 17, 113, 17, 81, 17, + 113, 17, 81, 33, 81, 33, 81, 33, 81, 33, 81, 34, + 49, 49, 81, 49, 49, 49, 81, 49, 49, 49, 81, 65, + 17, 65, 81, 65, 17, 65, 81, 81, 81, 52, 65, 68, + 0, 11, 48, 42, 15, 240, 243, 131, 50, 129, 66, 129, + 65, 17, 113, 65, 33, 97, 65, 49, 81, 65, 65, 65, + 65, 65, 65, 65, 81, 49, 65, 97, 33, 65, 113, 17, + 65, 115, 65, 130, 51, 129, 0, 9, 80, 33, 14, 240, + 240, 37, 114, 81, 81, 129, 65, 145, 33, 162, 17, 177, + 17, 177, 17, 177, 17, 177, 18, 161, 33, 145, 65, 113, + 82, 81, 133, 0, 9, 48, 26, 9, 240, 54, 65, 65, + 49, 81, 33, 81, 33, 81, 33, 81, 33, 65, 53, 65, + 129, 129, 129, 129, 115, 0, 6, 48, 35, 14, 240, 240, + 37, 114, 81, 81, 129, 65, 145, 33, 162, 17, 177, 17, + 177, 17, 177, 17, 177, 18, 161, 33, 145, 50, 129, 66, + 97, 118, 177, 226, 226, 240, 240, 32, 13, 240, 183, 129, + 65, 113, 81, 97, 81, 97, 81, 97, 81, 97, 65, 117, + 129, 49, 129, 50, 113, 66, 97, 81, 97, 82, 67, 83, + 0, 8, 32, 22, 8, 240, 52, 49, 49, 33, 113, 113, + 129, 115, 115, 114, 113, 113, 113, 17, 65, 37, 240, 240, + 208, 23, 12, 240, 155, 17, 65, 65, 97, 65, 97, 177, + 177, 177, 177, 177, 177, 177, 177, 177, 148, 0, 8, 16, + 33, 13, 240, 179, 99, 33, 129, 49, 129, 49, 129, 49, + 129, 49, 129, 49, 129, 49, 129, 49, 129, 49, 129, 49, + 129, 50, 98, 65, 97, 102, 0, 8, 80, 29, 13, 240, + 179, 99, 33, 129, 50, 97, 81, 97, 81, 81, 98, 65, + 113, 65, 113, 49, 145, 33, 145, 33, 147, 178, 178, 177, + 0, 9, 52, 18, 240, 240, 99, 35, 35, 19, 33, 66, + 49, 49, 50, 65, 33, 65, 65, 65, 33, 49, 81, 67, + 65, 82, 66, 65, 97, 66, 49, 113, 66, 49, 129, 50, + 49, 129, 33, 33, 17, 146, 17, 33, 17, 162, 49, 17, + 162, 65, 240, 33, 0, 12, 31, 13, 240, 180, 83, 34, + 97, 82, 65, 113, 65, 129, 33, 147, 178, 178, 161, 33, + 129, 50, 113, 65, 97, 97, 65, 114, 35, 99, 0, 8, + 32, 26, 12, 240, 147, 83, 34, 97, 65, 81, 97, 49, + 114, 33, 129, 17, 146, 177, 177, 177, 177, 177, 177, 163, + 0, 8, 16, 23, 12, 240, 155, 17, 129, 33, 113, 162, + 146, 161, 161, 162, 146, 161, 162, 146, 161, 129, 27, 0, + 7, 80, 21, 5, 84, 17, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 68, 240, 16, 47, + 19, 240, 240, 147, 51, 67, 65, 81, 97, 81, 81, 97, + 81, 97, 81, 97, 81, 65, 113, 66, 65, 79, 3, 81, + 33, 33, 33, 145, 33, 33, 33, 145, 33, 49, 17, 162, + 66, 178, 66, 178, 81, 240, 49, 0, 12, 80, 21, 5, + 84, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 20, 240, 16, 12, 10, 65, 129, 17, + 82, 50, 34, 82, 0, 21, 48, 7, 10, 0, 22, 73, + 240, 96, 8, 3, 49, 33, 49, 0, 6, 64, 22, 8, + 0, 7, 35, 50, 49, 33, 65, 113, 83, 50, 33, 33, + 65, 33, 50, 51, 18, 240, 240, 176, 28, 8, 129, 113, + 113, 113, 113, 113, 113, 19, 50, 49, 33, 81, 17, 81, + 17, 81, 17, 81, 17, 65, 33, 65, 52, 240, 240, 208, + 18, 8, 0, 7, 51, 50, 49, 17, 113, 113, 113, 114, + 114, 49, 52, 240, 240, 192, 28, 9, 241, 129, 129, 129, + 129, 129, 69, 49, 65, 33, 81, 33, 81, 33, 81, 33, + 81, 33, 81, 49, 50, 67, 18, 0, 5, 96, 18, 7, + 0, 6, 51, 49, 49, 17, 65, 22, 17, 97, 97, 113, + 116, 240, 240, 96, 20, 6, 146, 49, 65, 81, 81, 81, + 68, 49, 81, 81, 81, 81, 81, 81, 67, 240, 240, 48, + 25, 9, 0, 8, 22, 33, 65, 49, 65, 49, 65, 49, + 49, 83, 81, 129, 149, 49, 66, 17, 97, 17, 81, 53, + 192, 29, 9, 161, 129, 129, 129, 129, 129, 129, 34, 67, + 18, 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, 49, + 65, 35, 35, 0, 5, 96, 15, 4, 145, 49, 241, 49, + 49, 49, 49, 49, 49, 49, 35, 240, 96, 18, 4, 146, + 34, 225, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 33, 112, 28, 9, 161, 129, 129, 129, 129, 129, 129, + 51, 33, 49, 65, 33, 81, 17, 99, 97, 33, 81, 34, + 65, 49, 51, 50, 0, 5, 96, 19, 4, 81, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, + 240, 96, 34, 14, 0, 12, 49, 34, 50, 67, 35, 33, + 49, 65, 65, 49, 65, 65, 49, 65, 65, 49, 65, 65, + 49, 65, 65, 49, 65, 65, 35, 35, 35, 0, 8, 112, + 25, 9, 0, 8, 1, 34, 67, 33, 49, 65, 49, 65, + 49, 65, 49, 65, 49, 65, 49, 65, 35, 35, 0, 5, + 96, 22, 9, 0, 8, 20, 65, 65, 33, 97, 17, 97, + 17, 97, 17, 97, 17, 97, 33, 65, 68, 0, 6, 26, + 9, 0, 8, 1, 19, 66, 49, 49, 81, 33, 81, 33, + 81, 33, 81, 33, 65, 49, 65, 53, 65, 129, 129, 115, + 240, 25, 10, 0, 9, 21, 50, 65, 33, 97, 33, 97, + 33, 97, 33, 97, 33, 97, 49, 81, 70, 145, 145, 145, + 131, 176, 18, 7, 0, 6, 33, 19, 34, 17, 49, 97, + 97, 97, 97, 97, 83, 240, 240, 144, 18, 6, 240, 240, + 211, 33, 49, 17, 82, 83, 82, 81, 17, 49, 20, 240, + 240, 32, 17, 6, 240, 240, 113, 69, 33, 81, 81, 81, + 81, 81, 81, 83, 240, 240, 32, 25, 9, 0, 7, 114, + 50, 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, 49, + 65, 49, 50, 67, 18, 0, 5, 96, 22, 9, 0, 7, + 115, 35, 33, 49, 65, 49, 65, 49, 81, 17, 97, 17, + 99, 113, 129, 0, 6, 32, 34, 15, 0, 13, 20, 35, + 35, 49, 65, 65, 65, 65, 49, 81, 49, 17, 33, 97, + 17, 33, 33, 97, 17, 33, 17, 113, 17, 50, 129, 65, + 145, 65, 0, 10, 22, 10, 0, 8, 99, 51, 34, 49, + 81, 33, 114, 130, 130, 113, 33, 81, 65, 50, 51, 0, + 6, 64, 24, 9, 0, 7, 115, 35, 33, 65, 49, 49, + 81, 33, 81, 17, 99, 114, 113, 129, 113, 129, 129, 98, + 240, 16, 18, 8, 0, 7, 21, 33, 65, 97, 98, 97, + 97, 98, 97, 65, 23, 240, 240, 176, 22, 5, 34, 33, + 65, 65, 65, 65, 65, 65, 49, 65, 81, 65, 65, 65, + 65, 65, 65, 82, 240, 16, 19, 2, 33, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 144, 22, 5, 2, 81, 65, 65, 65, 65, 65, 65, 81, + 65, 49, 65, 65, 65, 65, 65, 65, 34, 240, 48, 14, + 12, 0, 10, 99, 81, 33, 50, 33, 33, 83, 0, 16, + 112, + 0, 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8f, 0x01, 0x00, 0x00, // Offset 399 (0x18f) + 0xa7, 0x01, 0x00, 0x00, // Offset 423 (0x1a7) + 0xc0, 0x01, 0x00, 0x00, // Offset 448 (0x1c0) + 0xd0, 0x01, 0x00, 0x00, // Offset 464 (0x1d0) + 0xe9, 0x01, 0x00, 0x00, // Offset 489 (0x1e9) + 0x02, 0x02, 0x00, 0x00, // Offset 514 (0x202) + 0x11, 0x02, 0x00, 0x00, // Offset 529 (0x211) + 0x26, 0x02, 0x00, 0x00, // Offset 550 (0x226) + 0x36, 0x02, 0x00, 0x00, // Offset 566 (0x236) + 0x4d, 0x02, 0x00, 0x00, // Offset 589 (0x24d) + 0x6d, 0x02, 0x00, 0x00, // Offset 621 (0x26d) + 0x8b, 0x02, 0x00, 0x00, // Offset 651 (0x28b) + 0xa5, 0x02, 0x00, 0x00, // Offset 677 (0x2a5) + 0xbc, 0x02, 0x00, 0x00, // Offset 700 (0x2bc) + 0xd4, 0x02, 0x00, 0x00, // Offset 724 (0x2d4) + 0xec, 0x02, 0x00, 0x00, // Offset 748 (0x2ec) + 0x00, 0x03, 0x00, 0x00, // Offset 768 (0x300) + 0x18, 0x03, 0x00, 0x00, // Offset 792 (0x318) + 0x41, 0x03, 0x00, 0x00, // Offset 833 (0x341) + 0x66, 0x03, 0x00, 0x00, // Offset 870 (0x366) + 0x7a, 0x03, 0x00, 0x00, // Offset 890 (0x37a) + 0x96, 0x03, 0x00, 0x00, // Offset 918 (0x396) + 0xac, 0x03, 0x00, 0x00, // Offset 940 (0x3ac) + 0xbe, 0x03, 0x00, 0x00, // Offset 958 (0x3be) + 0xd9, 0x03, 0x00, 0x00, // Offset 985 (0x3d9) + 0xec, 0x03, 0x00, 0x00, // Offset 1004 (0x3ec) + 0xfc, 0x03, 0x00, 0x00, // Offset 1020 (0x3fc) + 0x0b, 0x04, 0x00, 0x00, // Offset 1035 (0x40b) + 0x20, 0x04, 0x00, 0x00, // Offset 1056 (0x420) + 0x36, 0x04, 0x00, 0x00, // Offset 1078 (0x436) + 0x4b, 0x04, 0x00, 0x00, // Offset 1099 (0x44b) + 0x6f, 0x04, 0x00, 0x00, // Offset 1135 (0x46f) + 0x84, 0x04, 0x00, 0x00, // Offset 1156 (0x484) + 0xa7, 0x04, 0x00, 0x00, // Offset 1191 (0x4a7) + 0xbc, 0x04, 0x00, 0x00, // Offset 1212 (0x4bc) + 0xe3, 0x04, 0x00, 0x00, // Offset 1251 (0x4e3) + 0xf8, 0x04, 0x00, 0x00, // Offset 1272 (0x4f8) + 0x1f, 0x05, 0x00, 0x00, // Offset 1311 (0x51f) + 0x2d, 0x05, 0x00, 0x00, // Offset 1325 (0x52d) + 0x54, 0x05, 0x00, 0x00, // Offset 1364 (0x554) + 0x7f, 0x05, 0x00, 0x00, // Offset 1407 (0x57f) + 0x9c, 0x05, 0x00, 0x00, // Offset 1436 (0x59c) + 0xb0, 0x05, 0x00, 0x00, // Offset 1456 (0x5b0) + 0xc8, 0x05, 0x00, 0x00, // Offset 1480 (0x5c8) + 0xe8, 0x05, 0x00, 0x00, // Offset 1512 (0x5e8) + 0x1a, 0x06, 0x00, 0x00, // Offset 1562 (0x61a) + 0x39, 0x06, 0x00, 0x00, // Offset 1593 (0x639) + 0x52, 0x06, 0x00, 0x00, // Offset 1618 (0x652) + 0x5a, 0x06, 0x00, 0x00, // Offset 1626 (0x65a) + 0x72, 0x06, 0x00, 0x00, // Offset 1650 (0x672) + 0x86, 0x06, 0x00, 0x00, // Offset 1670 (0x686) + 0x8c, 0x06, 0x00, 0x00, // Offset 1676 (0x68c) + 0xa5, 0x06, 0x00, 0x00, // Offset 1701 (0x6a5) + 0xbc, 0x06, 0x00, 0x00, // Offset 1724 (0x6bc) + 0xd7, 0x06, 0x00, 0x00, // Offset 1751 (0x6d7) + 0xf4, 0x06, 0x00, 0x00, // Offset 1780 (0x6f4) + 0x14, 0x07, 0x00, 0x00, // Offset 1812 (0x714) + 0x2b, 0x07, 0x00, 0x00, // Offset 1835 (0x72b) + 0x53, 0x07, 0x00, 0x00, // Offset 1875 (0x753) + 0x6d, 0x07, 0x00, 0x00, // Offset 1901 (0x76d) + 0x87, 0x07, 0x00, 0x00, // Offset 1927 (0x787) + 0xb0, 0x07, 0x00, 0x00, // Offset 1968 (0x7b0) + 0xd4, 0x07, 0x00, 0x00, // Offset 2004 (0x7d4) + 0xf8, 0x07, 0x00, 0x00, // Offset 2040 (0x7f8) + 0x14, 0x08, 0x00, 0x00, // Offset 2068 (0x814) + 0x34, 0x08, 0x00, 0x00, // Offset 2100 (0x834) + 0x51, 0x08, 0x00, 0x00, // Offset 2129 (0x851) + 0x7c, 0x08, 0x00, 0x00, // Offset 2172 (0x87c) + 0xa4, 0x08, 0x00, 0x00, // Offset 2212 (0x8a4) + 0xc7, 0x08, 0x00, 0x00, // Offset 2247 (0x8c7) + 0xe4, 0x08, 0x00, 0x00, // Offset 2276 (0x8e4) + 0x02, 0x09, 0x00, 0x00, // Offset 2306 (0x902) + 0x2c, 0x09, 0x00, 0x00, // Offset 2348 (0x92c) + 0x47, 0x09, 0x00, 0x00, // Offset 2375 (0x947) + 0x64, 0x09, 0x00, 0x00, // Offset 2404 (0x964) + 0x81, 0x09, 0x00, 0x00, // Offset 2433 (0x981) + 0xa7, 0x09, 0x00, 0x00, // Offset 2471 (0x9a7) + 0xc6, 0x09, 0x00, 0x00, // Offset 2502 (0x9c6) + 0xdc, 0x09, 0x00, 0x00, // Offset 2524 (0x9dc) + 0x01, 0x0a, 0x00, 0x00, // Offset 2561 (0xa01) + 0x18, 0x0a, 0x00, 0x00, // Offset 2584 (0xa18) + 0x3b, 0x0a, 0x00, 0x00, // Offset 2619 (0xa3b) + 0x60, 0x0a, 0x00, 0x00, // Offset 2656 (0xa60) + 0x7c, 0x0a, 0x00, 0x00, // Offset 2684 (0xa7c) + 0x99, 0x0a, 0x00, 0x00, // Offset 2713 (0xa99) + 0xaf, 0x0a, 0x00, 0x00, // Offset 2735 (0xaaf) + 0xd2, 0x0a, 0x00, 0x00, // Offset 2770 (0xad2) + 0x04, 0x0b, 0x00, 0x00, // Offset 2820 (0xb04) + 0x28, 0x0b, 0x00, 0x00, // Offset 2856 (0xb28) + 0x4f, 0x0b, 0x00, 0x00, // Offset 2895 (0xb4f) + 0x85, 0x0b, 0x00, 0x00, // Offset 2949 (0xb85) + 0xab, 0x0b, 0x00, 0x00, // Offset 2987 (0xbab) + 0xb3, 0x0b, 0x00, 0x00, // Offset 2995 (0xbb3) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 15, 11, 0, 8, 42, 161, 161, 161, 161, 161, 161, 161, + 0, 9, 96, 24, 12, 0, 8, 22, 21, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 0, 10, 80, 25, 15, 0, 11, 38, 65, 145, 65, 145, + 49, 161, 49, 161, 35, 145, 33, 33, 129, 17, 65, 114, + 82, 0, 13, 32, 16, 13, 0, 8, 18, 209, 193, 193, + 193, 193, 193, 193, 202, 0, 11, 64, 25, 14, 0, 10, + 66, 56, 33, 113, 81, 98, 81, 97, 97, 98, 81, 81, + 33, 65, 65, 65, 53, 97, 0, 12, 48, 25, 14, 0, + 9, 84, 50, 209, 56, 33, 209, 84, 65, 65, 50, 49, + 65, 65, 49, 36, 34, 51, 52, 0, 12, 80, 15, 12, + 0, 9, 11, 33, 177, 177, 177, 177, 177, 186, 0, 10, + 80, 21, 13, 0, 8, 17, 70, 54, 113, 65, 113, 65, + 113, 65, 113, 65, 113, 65, 123, 0, 13, 16, 16, 12, + 0, 7, 74, 177, 177, 177, 43, 33, 177, 177, 186, 0, + 10, 80, 23, 13, 0, 9, 102, 21, 97, 81, 97, 81, + 22, 81, 33, 145, 33, 145, 33, 145, 37, 81, 0, 11, + 64, 32, 13, 0, 8, 28, 97, 17, 49, 97, 17, 49, + 97, 17, 49, 22, 17, 49, 33, 81, 49, 33, 81, 49, + 33, 66, 49, 37, 21, 129, 0, 10, 48, 30, 13, 0, + 9, 49, 40, 49, 82, 17, 49, 81, 37, 22, 17, 49, + 33, 81, 49, 33, 81, 49, 33, 19, 21, 49, 65, 49, + 0, 11, 64, 26, 14, 0, 10, 70, 50, 129, 49, 145, + 49, 70, 34, 81, 97, 17, 65, 81, 49, 49, 81, 65, + 38, 81, 0, 12, 48, 23, 13, 0, 9, 102, 21, 82, + 17, 146, 17, 86, 21, 33, 81, 97, 81, 97, 66, 101, + 21, 0, 11, 64, 24, 15, 0, 11, 60, 98, 18, 33, + 114, 33, 33, 54, 33, 33, 65, 97, 33, 65, 97, 33, + 77, 0, 15, 16, 24, 15, 0, 10, 52, 69, 233, 97, + 150, 36, 65, 81, 50, 49, 81, 65, 49, 52, 34, 52, + 52, 0, 13, 64, 20, 12, 0, 9, 10, 49, 113, 49, + 113, 49, 113, 49, 113, 49, 113, 58, 33, 0, 11, 96, + 24, 11, 0, 6, 49, 50, 98, 33, 113, 33, 113, 41, + 33, 113, 33, 113, 33, 113, 41, 33, 113, 0, 9, 96, + 41, 13, 0, 7, 97, 33, 35, 17, 49, 33, 49, 17, + 49, 33, 49, 17, 49, 37, 21, 33, 49, 17, 49, 33, + 49, 17, 49, 33, 49, 17, 49, 33, 49, 21, 37, 17, + 49, 33, 0, 11, 16, 37, 14, 0, 8, 98, 34, 50, + 65, 49, 49, 81, 49, 49, 85, 49, 81, 49, 34, 81, + 49, 33, 17, 65, 49, 17, 49, 49, 49, 17, 50, 38, + 81, 33, 49, 0, 11, 64, 20, 12, 0, 8, 17, 193, + 162, 161, 161, 17, 129, 49, 97, 82, 49, 114, 17, 0, + 11, 112, 28, 16, 0, 11, 17, 177, 66, 145, 65, 145, + 66, 145, 66, 129, 17, 34, 17, 97, 51, 49, 65, 81, + 82, 17, 81, 0, 15, 16, 22, 10, 0, 6, 97, 117, + 66, 50, 33, 113, 17, 113, 17, 113, 17, 113, 34, 50, + 69, 0, 9, 16, 18, 13, 0, 9, 106, 177, 177, 177, + 178, 161, 33, 114, 66, 50, 130, 0, 11, 64, 27, 14, + 0, 10, 91, 113, 65, 114, 50, 113, 65, 114, 50, 97, + 33, 33, 17, 65, 66, 50, 17, 81, 81, 97, 0, 11, + 64, 19, 13, 0, 8, 69, 240, 58, 162, 162, 162, 161, + 18, 114, 66, 50, 130, 0, 11, 64, 16, 11, 0, 8, + 42, 161, 161, 161, 26, 161, 161, 161, 161, 0, 8, 48, + 15, 12, 0, 9, 11, 33, 177, 185, 49, 177, 177, 186, + 0, 10, 80, 21, 13, 0, 9, 107, 240, 34, 65, 113, + 65, 113, 65, 113, 65, 113, 65, 33, 28, 0, 11, 64, + 22, 13, 0, 6, 118, 240, 252, 84, 129, 65, 97, 97, + 81, 97, 81, 97, 97, 65, 132, 0, 10, 48, 21, 7, + 113, 114, 97, 97, 97, 97, 97, 97, 100, 49, 97, 97, + 97, 97, 97, 97, 97, 240, 160, 36, 8, 129, 66, 34, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 53, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 113, 240, 160, 21, 8, 131, 113, 113, + 113, 113, 117, 49, 113, 113, 113, 117, 49, 113, 113, 113, + 113, 113, 240, 224, 35, 8, 193, 50, 50, 49, 49, 49, + 49, 49, 49, 49, 49, 53, 49, 49, 49, 49, 49, 49, + 53, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 240, 160, 21, 7, 163, 97, 97, 97, 97, 97, 97, + 22, 97, 97, 97, 97, 97, 97, 97, 97, 97, 240, 112, + 39, 10, 240, 19, 66, 49, 81, 49, 81, 49, 81, 49, + 81, 49, 81, 49, 21, 49, 81, 49, 81, 49, 81, 49, + 81, 49, 81, 49, 81, 49, 81, 49, 81, 49, 81, 49, + 240, 240, 16, 21, 7, 178, 97, 97, 97, 97, 22, 97, + 97, 97, 97, 22, 97, 97, 97, 97, 97, 97, 240, 112, + 39, 9, 177, 35, 66, 33, 81, 33, 81, 33, 81, 33, + 21, 33, 81, 33, 81, 33, 81, 33, 81, 33, 21, 33, + 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, + 129, 240, 64, 14, 16, 0, 14, 98, 241, 241, 241, 241, + 241, 143, 0, 14, 16, 39, 17, 240, 193, 240, 34, 240, + 17, 240, 17, 240, 17, 240, 17, 240, 17, 145, 97, 145, + 100, 97, 97, 145, 97, 145, 52, 73, 49, 240, 17, 240, + 17, 240, 17, 240, 17, 0, 6, 112, 43, 15, 240, 178, + 163, 33, 177, 33, 177, 33, 177, 33, 177, 33, 65, 97, + 33, 81, 81, 33, 81, 84, 81, 81, 33, 81, 81, 33, + 87, 33, 20, 97, 33, 177, 33, 177, 33, 177, 33, 225, + 0, 5, 96, 29, 14, 240, 146, 225, 209, 209, 209, 209, + 81, 113, 97, 97, 97, 97, 97, 97, 97, 97, 104, 21, + 113, 209, 209, 209, 209, 240, 240, 208, 20, 17, 0, 15, + 49, 66, 177, 65, 177, 65, 177, 65, 177, 65, 177, 65, + 111, 1, 0, 15, 24, 17, 0, 19, 31, 1, 145, 240, + 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, + 17, 0, 7, 48, 32, 14, 240, 162, 209, 209, 209, 209, + 209, 209, 177, 17, 26, 33, 97, 97, 97, 97, 97, 37, + 97, 97, 97, 97, 97, 97, 97, 97, 209, 240, 240, 208, + 50, 15, 240, 129, 35, 162, 33, 177, 33, 177, 33, 177, + 33, 177, 33, 177, 33, 145, 17, 33, 24, 33, 33, 81, + 81, 33, 81, 81, 33, 81, 21, 33, 81, 81, 33, 81, + 81, 33, 81, 81, 33, 81, 81, 33, 81, 81, 33, 0, + 5, 96, 31, 14, 240, 146, 225, 209, 209, 209, 209, 209, + 209, 149, 24, 65, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 240, 240, 208, 25, 17, 0, + 19, 31, 1, 97, 65, 177, 65, 177, 65, 177, 65, 177, + 65, 177, 65, 177, 65, 177, 65, 0, 7, 16, 8, 17, + 0, 27, 95, 1, 0, 15, 24, 14, 240, 146, 225, 209, + 209, 209, 209, 209, 209, 209, 209, 194, 27, 17, 209, 209, + 209, 209, 209, 240, 240, 208, 20, 4, 66, 65, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 208, 6, 2, 240, 49, 240, 128, 25, 14, 0, 10, + 66, 81, 113, 81, 113, 81, 113, 81, 113, 81, 113, 81, + 113, 49, 17, 50, 36, 36, 0, 12, 80, 23, 14, 0, + 10, 65, 71, 49, 81, 113, 81, 113, 81, 113, 81, 113, + 81, 113, 51, 116, 38, 0, 12, 48, 27, 14, 0, 9, + 98, 66, 113, 81, 113, 81, 113, 81, 98, 81, 97, 17, + 65, 81, 49, 49, 50, 66, 37, 97, 0, 12, 48, 29, + 14, 0, 9, 97, 82, 113, 81, 99, 65, 97, 17, 65, + 97, 33, 49, 81, 49, 49, 81, 49, 49, 35, 81, 35, + 39, 0, 12, 48, 32, 17, 0, 12, 121, 49, 113, 65, + 49, 113, 65, 33, 70, 49, 34, 65, 113, 17, 17, 65, + 113, 17, 33, 49, 65, 34, 65, 37, 49, 81, 0, 15, + 23, 13, 0, 9, 102, 21, 82, 17, 146, 17, 86, 17, + 97, 81, 97, 81, 97, 66, 101, 21, 0, 11, 64, 40, + 18, 0, 12, 49, 151, 33, 34, 129, 17, 33, 33, 129, + 36, 33, 70, 17, 33, 18, 81, 81, 33, 17, 17, 65, + 81, 34, 49, 49, 81, 34, 49, 52, 36, 81, 129, 33, + 0, 14, 48, 26, 14, 0, 10, 70, 50, 129, 49, 145, + 35, 54, 33, 17, 65, 82, 33, 49, 81, 49, 49, 66, + 65, 44, 0, 12, 48, 26, 14, 0, 10, 92, 82, 193, + 52, 38, 18, 34, 33, 81, 65, 33, 81, 65, 33, 49, + 18, 34, 36, 52, 0, 12, 64, 41, 13, 0, 7, 97, + 40, 49, 33, 49, 17, 49, 33, 49, 17, 49, 33, 49, + 21, 33, 49, 17, 49, 33, 49, 17, 49, 33, 49, 17, + 49, 33, 49, 21, 37, 17, 49, 33, 81, 0, 10, 48, + 36, 15, 0, 9, 54, 50, 81, 49, 50, 81, 49, 49, + 97, 49, 49, 97, 49, 34, 97, 49, 33, 17, 81, 49, + 17, 49, 65, 49, 17, 65, 54, 82, 33, 0, 12, 112, + 36, 14, 0, 8, 102, 49, 81, 49, 49, 81, 49, 35, + 65, 49, 33, 17, 65, 49, 33, 33, 49, 49, 17, 49, + 49, 49, 17, 65, 33, 49, 17, 65, 44, 33, 0, 12, + 28, 10, 240, 249, 33, 97, 33, 97, 33, 97, 33, 97, + 40, 243, 97, 49, 65, 81, 49, 81, 49, 81, 65, 49, + 99, 240, 240, 208, 32, 13, 0, 9, 98, 49, 21, 33, + 49, 81, 37, 81, 33, 49, 81, 33, 49, 81, 33, 49, + 81, 33, 49, 81, 37, 81, 33, 49, 81, 0, 9, 112, + 29, 14, 0, 10, 66, 49, 22, 33, 49, 33, 101, 33, + 97, 49, 33, 97, 49, 33, 97, 49, 33, 97, 49, 33, + 101, 37, 33, 0, 12, 43, 15, 0, 9, 97, 178, 33, + 49, 20, 33, 33, 49, 65, 36, 33, 81, 33, 33, 34, + 65, 33, 33, 17, 33, 49, 33, 33, 17, 33, 49, 33, + 34, 65, 33, 37, 65, 33, 33, 33, 129, 0, 11, 48, + 40, 16, 0, 10, 49, 194, 33, 49, 21, 33, 33, 34, + 33, 84, 33, 49, 81, 33, 34, 33, 81, 33, 17, 17, + 33, 81, 33, 17, 33, 17, 81, 34, 51, 85, 69, 33, + 33, 0, 13, 48, 35, 15, 0, 9, 113, 162, 49, 22, + 49, 49, 65, 85, 49, 97, 49, 49, 97, 49, 50, 81, + 49, 33, 33, 65, 49, 17, 65, 53, 17, 66, 33, 50, + 0, 12, 32, 29, 14, 0, 10, 66, 49, 22, 33, 49, + 33, 101, 33, 97, 49, 37, 33, 49, 33, 97, 49, 33, + 97, 49, 33, 101, 37, 33, 0, 12, 30, 9, 240, 131, + 17, 97, 17, 97, 24, 17, 97, 17, 97, 24, 17, 164, + 65, 65, 33, 97, 17, 97, 17, 97, 33, 65, 68, 240, + 240, 144, 42, 11, 240, 146, 18, 33, 17, 49, 17, 33, + 17, 49, 17, 33, 21, 20, 17, 49, 17, 33, 17, 49, + 17, 33, 17, 49, 17, 33, 21, 20, 244, 98, 50, 65, + 81, 65, 81, 66, 50, 84, 0, 6, 27, 13, 0, 10, + 33, 22, 66, 97, 65, 113, 65, 113, 49, 17, 97, 49, + 33, 81, 33, 65, 65, 17, 82, 49, 0, 11, 64, 29, + 14, 0, 9, 1, 65, 146, 49, 129, 65, 129, 65, 114, + 65, 113, 17, 49, 97, 49, 33, 97, 50, 17, 81, 81, + 21, 0, 12, 48, 29, 14, 0, 9, 33, 38, 81, 49, + 130, 49, 129, 65, 130, 49, 113, 33, 33, 113, 33, 33, + 97, 65, 17, 81, 81, 21, 0, 12, 48, 38, 14, 0, + 8, 50, 66, 49, 49, 81, 49, 49, 65, 65, 49, 65, + 69, 66, 49, 49, 49, 17, 49, 49, 49, 33, 33, 49, + 33, 65, 17, 49, 17, 81, 21, 145, 0, 11, 16, 31, + 15, 0, 9, 82, 226, 24, 65, 97, 113, 82, 98, 81, + 113, 17, 66, 81, 33, 49, 33, 65, 49, 33, 34, 33, + 82, 66, 113, 0, 12, 32, 22, 10, 0, 6, 82, 145, + 129, 17, 98, 17, 97, 49, 65, 81, 49, 81, 33, 113, + 25, 0, 8, 112, 37, 15, 0, 9, 82, 98, 83, 82, + 65, 49, 49, 33, 33, 81, 17, 65, 17, 81, 17, 65, + 17, 81, 17, 65, 17, 81, 17, 65, 33, 49, 49, 33, + 67, 82, 0, 13, 64, 23, 9, 240, 240, 161, 129, 100, + 65, 65, 33, 97, 17, 97, 17, 97, 17, 97, 33, 65, + 68, 0, 8, 32, 35, 15, 0, 9, 97, 82, 113, 97, + 82, 18, 65, 65, 81, 34, 65, 81, 34, 65, 81, 17, + 33, 49, 81, 17, 49, 49, 49, 17, 81, 51, 17, 97, + 0, 13, 32, 37, 15, 0, 9, 82, 82, 113, 97, 82, + 18, 49, 17, 49, 81, 33, 17, 49, 81, 33, 17, 49, + 81, 17, 49, 33, 81, 17, 49, 49, 49, 17, 81, 51, + 39, 0, 13, 32, 28, 12, 240, 154, 129, 114, 49, 113, + 49, 113, 49, 113, 49, 75, 240, 227, 114, 50, 81, 81, + 81, 81, 82, 50, 100, 0, 6, 80, 29, 17, 0, 10, + 115, 84, 240, 95, 1, 240, 84, 68, 65, 50, 33, 50, + 49, 65, 33, 65, 49, 50, 34, 34, 68, 68, 0, 15, + 32, 22, 13, 0, 8, 28, 240, 240, 20, 129, 65, 97, + 97, 81, 97, 81, 97, 97, 65, 132, 0, 10, 48, 35, + 16, 240, 162, 240, 17, 241, 241, 241, 244, 114, 49, 113, + 49, 49, 113, 49, 49, 113, 49, 52, 65, 49, 34, 71, + 18, 17, 241, 241, 241, 241, 241, 0, 6, 64, 50, 15, + 240, 179, 147, 33, 177, 33, 177, 33, 177, 33, 180, 97, + 65, 33, 65, 33, 49, 33, 65, 33, 49, 33, 65, 33, + 49, 33, 65, 33, 52, 65, 33, 34, 33, 25, 17, 33, + 177, 33, 177, 33, 177, 33, 177, 33, 225, 240, 240, 16, + 36, 13, 240, 114, 209, 193, 193, 193, 193, 49, 50, 49, + 65, 49, 49, 65, 49, 49, 65, 49, 49, 65, 49, 49, + 65, 23, 19, 17, 97, 193, 193, 193, 193, 240, 240, 160, + 39, 14, 240, 162, 209, 209, 209, 209, 209, 209, 177, 17, + 26, 33, 65, 49, 65, 65, 49, 20, 65, 49, 65, 65, + 49, 65, 65, 49, 20, 65, 49, 65, 65, 49, 65, 209, + 240, 240, 208, 54, 15, 240, 179, 162, 33, 177, 33, 177, + 33, 177, 33, 177, 33, 177, 33, 177, 33, 24, 33, 33, + 49, 33, 65, 33, 49, 33, 20, 33, 49, 33, 65, 33, + 49, 33, 65, 33, 49, 33, 20, 33, 49, 33, 65, 33, + 49, 33, 65, 33, 177, 33, 0, 5, 96, 38, 14, 240, + 131, 225, 209, 209, 209, 209, 209, 209, 149, 24, 65, 65, + 49, 65, 65, 49, 65, 65, 49, 65, 65, 49, 65, 65, + 49, 65, 65, 49, 65, 65, 49, 65, 240, 240, 208, 8, + 3, 240, 146, 18, 240, 240, 64, 23, 7, 163, 97, 97, + 97, 97, 97, 97, 18, 49, 18, 49, 97, 97, 97, 97, + 97, 97, 97, 97, 240, 112, + 0, 0, // Padding + +}; + +tFont *g_psFontWHangulmyeongjo18pt = (tFont *)g_pui8Hangulmyeongjo18pt; diff --git a/third_party/fonts/ofl/fonts/fonthangulmyeongjo18ptb.c b/third_party/fonts/ofl/fonts/fonthangulmyeongjo18ptb.c new file mode 100644 index 0000000..bfc4005 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulmyeongjo18ptb.c @@ -0,0 +1,791 @@ +//***************************************************************************** +// +// fonthangulmyeongjo18ptb.c - Font definition for the 18ptpt Hangulmyeongjo bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulmyeongjo +// Size: 18pt +// Bold: yes +// Italic: no +// Memory usage: 5659 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulmyeongjo18ptb[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 17, + + // + // The height of the font. + // + 21, + + // + // The baseline of the font. + // + 16, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0xa4, 0x0a, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x91, 0x01, 0x00, 0x00, // Offset 401 (0x191) + 0x9e, 0x01, 0x00, 0x00, // Offset 414 (0x19e) + 0xbe, 0x01, 0x00, 0x00, // Offset 446 (0x1be) + 0xe3, 0x01, 0x00, 0x00, // Offset 483 (0x1e3) + 0x11, 0x02, 0x00, 0x00, // Offset 529 (0x211) + 0x38, 0x02, 0x00, 0x00, // Offset 568 (0x238) + 0x41, 0x02, 0x00, 0x00, // Offset 577 (0x241) + 0x56, 0x02, 0x00, 0x00, // Offset 598 (0x256) + 0x6b, 0x02, 0x00, 0x00, // Offset 619 (0x26b) + 0x7b, 0x02, 0x00, 0x00, // Offset 635 (0x27b) + 0x8b, 0x02, 0x00, 0x00, // Offset 651 (0x28b) + 0x94, 0x02, 0x00, 0x00, // Offset 660 (0x294) + 0x9c, 0x02, 0x00, 0x00, // Offset 668 (0x29c) + 0xa3, 0x02, 0x00, 0x00, // Offset 675 (0x2a3) + 0xb7, 0x02, 0x00, 0x00, // Offset 695 (0x2b7) + 0xd6, 0x02, 0x00, 0x00, // Offset 726 (0x2d6) + 0xea, 0x02, 0x00, 0x00, // Offset 746 (0x2ea) + 0x02, 0x03, 0x00, 0x00, // Offset 770 (0x302) + 0x19, 0x03, 0x00, 0x00, // Offset 793 (0x319) + 0x32, 0x03, 0x00, 0x00, // Offset 818 (0x332) + 0x47, 0x03, 0x00, 0x00, // Offset 839 (0x347) + 0x62, 0x03, 0x00, 0x00, // Offset 866 (0x362) + 0x78, 0x03, 0x00, 0x00, // Offset 888 (0x378) + 0x96, 0x03, 0x00, 0x00, // Offset 918 (0x396) + 0xb2, 0x03, 0x00, 0x00, // Offset 946 (0x3b2) + 0xbb, 0x03, 0x00, 0x00, // Offset 955 (0x3bb) + 0xc7, 0x03, 0x00, 0x00, // Offset 967 (0x3c7) + 0xdc, 0x03, 0x00, 0x00, // Offset 988 (0x3dc) + 0xe7, 0x03, 0x00, 0x00, // Offset 999 (0x3e7) + 0xfd, 0x03, 0x00, 0x00, // Offset 1021 (0x3fd) + 0x16, 0x04, 0x00, 0x00, // Offset 1046 (0x416) + 0x47, 0x04, 0x00, 0x00, // Offset 1095 (0x447) + 0x66, 0x04, 0x00, 0x00, // Offset 1126 (0x466) + 0x85, 0x04, 0x00, 0x00, // Offset 1157 (0x485) + 0xa0, 0x04, 0x00, 0x00, // Offset 1184 (0x4a0) + 0xc0, 0x04, 0x00, 0x00, // Offset 1216 (0x4c0) + 0xdb, 0x04, 0x00, 0x00, // Offset 1243 (0x4db) + 0xf4, 0x04, 0x00, 0x00, // Offset 1268 (0x4f4) + 0x11, 0x05, 0x00, 0x00, // Offset 1297 (0x511) + 0x33, 0x05, 0x00, 0x00, // Offset 1331 (0x533) + 0x46, 0x05, 0x00, 0x00, // Offset 1350 (0x546) + 0x5d, 0x05, 0x00, 0x00, // Offset 1373 (0x55d) + 0x7e, 0x05, 0x00, 0x00, // Offset 1406 (0x57e) + 0x94, 0x05, 0x00, 0x00, // Offset 1428 (0x594) + 0xc8, 0x05, 0x00, 0x00, // Offset 1480 (0x5c8) + 0xf3, 0x05, 0x00, 0x00, // Offset 1523 (0x5f3) + 0x14, 0x06, 0x00, 0x00, // Offset 1556 (0x614) + 0x2e, 0x06, 0x00, 0x00, // Offset 1582 (0x62e) + 0x51, 0x06, 0x00, 0x00, // Offset 1617 (0x651) + 0x71, 0x06, 0x00, 0x00, // Offset 1649 (0x671) + 0x8a, 0x06, 0x00, 0x00, // Offset 1674 (0x68a) + 0xa2, 0x06, 0x00, 0x00, // Offset 1698 (0x6a2) + 0xc3, 0x06, 0x00, 0x00, // Offset 1731 (0x6c3) + 0xe1, 0x06, 0x00, 0x00, // Offset 1761 (0x6e1) + 0x15, 0x07, 0x00, 0x00, // Offset 1813 (0x715) + 0x36, 0x07, 0x00, 0x00, // Offset 1846 (0x736) + 0x50, 0x07, 0x00, 0x00, // Offset 1872 (0x750) + 0x69, 0x07, 0x00, 0x00, // Offset 1897 (0x769) + 0x7d, 0x07, 0x00, 0x00, // Offset 1917 (0x77d) + 0xae, 0x07, 0x00, 0x00, // Offset 1966 (0x7ae) + 0xc2, 0x07, 0x00, 0x00, // Offset 1986 (0x7c2) + 0xce, 0x07, 0x00, 0x00, // Offset 1998 (0x7ce) + 0xd5, 0x07, 0x00, 0x00, // Offset 2005 (0x7d5) + 0xde, 0x07, 0x00, 0x00, // Offset 2014 (0x7de) + 0xf4, 0x07, 0x00, 0x00, // Offset 2036 (0x7f4) + 0x11, 0x08, 0x00, 0x00, // Offset 2065 (0x811) + 0x23, 0x08, 0x00, 0x00, // Offset 2083 (0x823) + 0x3f, 0x08, 0x00, 0x00, // Offset 2111 (0x83f) + 0x52, 0x08, 0x00, 0x00, // Offset 2130 (0x852) + 0x66, 0x08, 0x00, 0x00, // Offset 2150 (0x866) + 0x7f, 0x08, 0x00, 0x00, // Offset 2175 (0x87f) + 0x9c, 0x08, 0x00, 0x00, // Offset 2204 (0x89c) + 0xac, 0x08, 0x00, 0x00, // Offset 2220 (0x8ac) + 0xbe, 0x08, 0x00, 0x00, // Offset 2238 (0x8be) + 0xd9, 0x08, 0x00, 0x00, // Offset 2265 (0x8d9) + 0xec, 0x08, 0x00, 0x00, // Offset 2284 (0x8ec) + 0x0e, 0x09, 0x00, 0x00, // Offset 2318 (0x90e) + 0x27, 0x09, 0x00, 0x00, // Offset 2343 (0x927) + 0x3e, 0x09, 0x00, 0x00, // Offset 2366 (0x93e) + 0x59, 0x09, 0x00, 0x00, // Offset 2393 (0x959) + 0x73, 0x09, 0x00, 0x00, // Offset 2419 (0x973) + 0x84, 0x09, 0x00, 0x00, // Offset 2436 (0x984) + 0x97, 0x09, 0x00, 0x00, // Offset 2455 (0x997) + 0xaa, 0x09, 0x00, 0x00, // Offset 2474 (0x9aa) + 0xc3, 0x09, 0x00, 0x00, // Offset 2499 (0x9c3) + 0xd9, 0x09, 0x00, 0x00, // Offset 2521 (0x9d9) + 0xf8, 0x09, 0x00, 0x00, // Offset 2552 (0x9f8) + 0x0d, 0x0a, 0x00, 0x00, // Offset 2573 (0xa0d) + 0x26, 0x0a, 0x00, 0x00, // Offset 2598 (0xa26) + 0x38, 0x0a, 0x00, 0x00, // Offset 2616 (0xa38) + 0x4d, 0x0a, 0x00, 0x00, // Offset 2637 (0xa4d) + 0x60, 0x0a, 0x00, 0x00, // Offset 2656 (0xa60) + 0x75, 0x0a, 0x00, 0x00, // Offset 2677 (0xa75) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 7, 0, 18, 48, 16, 3, 98, 18, 18, 18, 18, + 33, 33, 33, 33, 33, 33, 114, 18, 208, 13, 5, 81, + 18, 17, 18, 17, 18, 17, 33, 0, 10, 16, 32, 12, + 240, 210, 33, 114, 33, 113, 34, 113, 34, 74, 66, 33, + 114, 33, 114, 18, 113, 34, 74, 66, 33, 114, 33, 114, + 18, 113, 34, 0, 8, 16, 37, 10, 210, 102, 50, 18, + 18, 34, 18, 33, 34, 18, 33, 34, 18, 100, 116, 116, + 98, 19, 66, 34, 17, 34, 34, 17, 34, 34, 18, 18, + 18, 54, 98, 130, 240, 240, 80, 46, 15, 240, 240, 51, + 65, 82, 38, 81, 50, 33, 81, 66, 18, 81, 65, 33, + 97, 50, 17, 114, 18, 33, 145, 49, 37, 98, 18, 49, + 97, 34, 49, 82, 33, 65, 81, 34, 50, 66, 49, 34, + 81, 82, 0, 9, 112, 39, 15, 240, 240, 68, 162, 34, + 146, 34, 146, 34, 146, 18, 164, 36, 98, 66, 82, 17, + 65, 82, 33, 50, 66, 50, 33, 82, 65, 17, 98, 82, + 99, 52, 34, 37, 52, 0, 9, 80, 9, 2, 33, 17, + 17, 17, 240, 240, 48, 21, 6, 161, 65, 66, 50, 66, + 50, 66, 66, 66, 66, 66, 81, 82, 81, 82, 82, 81, + 240, 64, 21, 6, 97, 97, 82, 82, 66, 82, 66, 66, + 66, 66, 66, 50, 66, 65, 66, 50, 65, 240, 128, 16, + 7, 146, 49, 18, 17, 22, 50, 54, 17, 18, 17, 50, + 0, 11, 96, 16, 10, 0, 6, 82, 130, 130, 130, 89, + 66, 130, 130, 130, 0, 9, 48, 9, 3, 240, 240, 194, + 18, 33, 33, 160, 8, 10, 0, 11, 41, 0, 13, 112, + 7, 3, 240, 240, 242, 18, 208, 20, 8, 225, 113, 98, + 97, 98, 97, 113, 98, 97, 98, 97, 113, 98, 97, 98, + 0, 5, 96, 31, 9, 240, 84, 66, 34, 50, 34, 34, + 66, 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, 18, + 66, 18, 66, 34, 34, 50, 34, 68, 0, 6, 20, 7, + 240, 18, 52, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 54, 240, 240, 96, 24, 9, 240, 84, 65, 50, + 33, 82, 17, 82, 114, 114, 98, 114, 98, 98, 98, 113, + 114, 65, 24, 0, 5, 96, 23, 9, 240, 84, 65, 50, + 33, 66, 114, 113, 113, 100, 130, 130, 114, 114, 114, 18, + 50, 37, 0, 6, 16, 25, 10, 240, 162, 130, 115, 100, + 97, 18, 81, 34, 81, 34, 65, 50, 50, 50, 57, 98, + 130, 130, 130, 0, 6, 80, 21, 9, 240, 86, 49, 129, + 113, 132, 131, 114, 130, 114, 114, 114, 113, 34, 50, 52, + 0, 6, 16, 27, 9, 240, 131, 67, 82, 98, 114, 98, + 19, 51, 34, 34, 66, 18, 66, 18, 66, 18, 66, 33, + 66, 34, 34, 68, 0, 6, 22, 9, 240, 71, 17, 82, + 17, 81, 129, 114, 114, 113, 114, 114, 113, 129, 114, 113, + 129, 0, 6, 32, 30, 9, 240, 84, 66, 34, 34, 66, + 18, 66, 18, 66, 34, 34, 68, 66, 19, 49, 51, 18, + 66, 18, 66, 18, 66, 34, 34, 68, 0, 6, 28, 9, + 240, 84, 66, 34, 34, 50, 34, 66, 18, 66, 18, 66, + 18, 66, 34, 35, 51, 18, 98, 114, 98, 98, 67, 0, + 6, 48, 9, 3, 194, 18, 240, 66, 18, 240, 112, 12, + 4, 240, 83, 19, 240, 114, 34, 49, 33, 240, 112, 21, + 8, 225, 98, 82, 97, 97, 97, 98, 82, 97, 129, 114, + 114, 113, 129, 129, 114, 113, 240, 160, 11, 10, 0, 7, + 73, 240, 240, 25, 0, 12, 80, 22, 8, 129, 114, 114, + 113, 129, 129, 114, 114, 113, 97, 98, 82, 82, 97, 97, + 98, 97, 240, 240, 16, 25, 9, 240, 84, 65, 50, 33, + 82, 18, 66, 18, 66, 113, 114, 98, 113, 113, 129, 129, + 240, 34, 114, 240, 240, 160, 49, 15, 240, 240, 70, 114, + 83, 66, 115, 49, 51, 50, 34, 34, 34, 34, 17, 34, + 50, 34, 17, 33, 65, 50, 17, 18, 50, 50, 17, 18, + 50, 49, 33, 18, 34, 49, 50, 19, 17, 33, 17, 49, + 98, 18, 66, 83, 118, 0, 10, 31, 14, 240, 240, 65, + 209, 195, 177, 17, 177, 17, 161, 34, 145, 49, 145, 49, + 135, 113, 81, 113, 81, 97, 98, 81, 98, 53, 53, 0, + 8, 112, 31, 11, 240, 119, 98, 34, 82, 50, 66, 50, + 66, 50, 66, 34, 85, 98, 50, 66, 66, 50, 66, 50, + 66, 50, 66, 50, 50, 40, 0, 7, 32, 27, 13, 240, + 240, 21, 98, 67, 50, 98, 34, 129, 18, 178, 178, 178, + 178, 179, 178, 129, 35, 97, 67, 66, 102, 0, 8, 64, + 32, 14, 240, 216, 130, 66, 98, 82, 82, 98, 66, 114, + 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, 50, 98, + 66, 97, 82, 66, 72, 0, 9, 64, 27, 11, 240, 121, + 66, 65, 66, 65, 66, 65, 66, 146, 49, 82, 49, 86, + 82, 49, 82, 146, 146, 81, 50, 81, 26, 0, 7, 25, + 10, 240, 89, 50, 65, 50, 65, 50, 130, 130, 49, 66, + 49, 70, 66, 49, 66, 130, 130, 130, 101, 0, 6, 112, + 29, 14, 240, 240, 38, 114, 82, 66, 113, 50, 129, 34, + 194, 194, 194, 194, 101, 18, 130, 50, 114, 66, 98, 82, + 82, 117, 0, 9, 32, 34, 16, 240, 240, 38, 54, 50, + 114, 82, 114, 82, 114, 82, 114, 82, 114, 91, 82, 114, + 82, 114, 82, 114, 82, 114, 82, 114, 82, 114, 54, 54, + 0, 10, 16, 19, 7, 230, 50, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 54, 240, 240, 96, 23, 9, + 240, 101, 82, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 50, 18, 83, 224, 33, 14, 240, + 213, 52, 66, 82, 82, 66, 98, 50, 114, 34, 130, 18, + 149, 146, 33, 146, 34, 130, 50, 114, 66, 98, 66, 98, + 82, 53, 83, 0, 8, 112, 22, 12, 240, 150, 130, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 97, 50, 81, + 42, 0, 7, 96, 52, 18, 240, 240, 100, 148, 50, 146, + 82, 131, 83, 115, 81, 17, 97, 18, 81, 18, 81, 18, + 81, 18, 66, 18, 81, 34, 49, 34, 81, 34, 49, 34, + 81, 49, 33, 50, 81, 50, 17, 50, 81, 66, 66, 81, + 66, 66, 52, 50, 38, 0, 11, 48, 43, 16, 240, 240, + 35, 117, 50, 129, 83, 113, 81, 18, 97, 81, 19, 81, + 81, 34, 81, 81, 50, 65, 81, 66, 49, 81, 82, 33, + 81, 98, 17, 81, 98, 17, 81, 115, 81, 130, 53, 113, + 0, 10, 48, 33, 14, 240, 240, 37, 129, 66, 97, 98, + 66, 114, 34, 131, 18, 146, 18, 146, 18, 146, 18, 146, + 19, 130, 34, 114, 66, 97, 83, 65, 133, 0, 9, 48, + 26, 10, 240, 87, 82, 34, 66, 50, 50, 50, 50, 50, + 50, 50, 50, 34, 69, 82, 130, 130, 130, 130, 101, 0, + 6, 112, 35, 14, 240, 240, 37, 129, 66, 97, 98, 66, + 114, 34, 131, 18, 146, 18, 146, 18, 146, 18, 146, 19, + 130, 34, 114, 51, 97, 83, 66, 117, 178, 226, 226, 240, + 240, 32, 14, 240, 216, 130, 50, 114, 66, 98, 66, 98, + 66, 98, 66, 98, 50, 117, 146, 34, 130, 50, 114, 50, + 114, 66, 98, 82, 54, 67, 0, 8, 112, 25, 8, 240, + 52, 50, 33, 34, 49, 34, 98, 99, 99, 115, 99, 98, + 17, 66, 17, 66, 17, 50, 37, 240, 240, 208, 24, 13, + 240, 188, 17, 66, 65, 17, 66, 65, 98, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 150, 0, 8, 80, 33, 14, + 240, 214, 52, 50, 113, 66, 113, 66, 113, 66, 113, 66, + 113, 66, 113, 66, 113, 66, 113, 66, 113, 66, 113, 67, + 82, 83, 50, 117, 0, 9, 48, 30, 14, 240, 213, 68, + 50, 113, 66, 97, 82, 97, 98, 81, 98, 65, 129, 65, + 130, 49, 130, 33, 161, 33, 163, 194, 194, 193, 0, 9, + 80, 52, 19, 240, 240, 138, 19, 19, 35, 50, 49, 49, + 66, 50, 34, 49, 66, 65, 33, 65, 82, 50, 17, 49, + 98, 66, 65, 113, 66, 50, 114, 50, 49, 130, 50, 49, + 145, 33, 18, 17, 162, 17, 33, 17, 178, 51, 178, 50, + 194, 65, 0, 12, 80, 33, 15, 240, 240, 20, 68, 66, + 98, 98, 81, 129, 65, 146, 33, 178, 17, 194, 211, 177, + 18, 162, 34, 145, 66, 113, 98, 82, 98, 53, 69, 0, + 9, 64, 26, 14, 240, 213, 83, 50, 113, 82, 81, 98, + 66, 114, 49, 146, 17, 163, 194, 194, 194, 194, 194, 194, + 166, 0, 9, 32, 25, 13, 240, 187, 34, 98, 49, 114, + 162, 162, 162, 178, 162, 162, 177, 178, 113, 34, 114, 18, + 129, 43, 0, 8, 48, 20, 6, 101, 18, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 69, 240, + 160, 49, 19, 240, 240, 133, 21, 52, 34, 66, 98, 65, + 81, 97, 82, 66, 81, 97, 66, 65, 79, 3, 66, 49, + 17, 49, 129, 33, 33, 34, 129, 33, 34, 17, 146, 17, + 49, 17, 162, 65, 17, 162, 66, 178, 81, 240, 49, 0, + 12, 80, 20, 6, 101, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 21, 240, 160, 12, 10, + 66, 113, 18, 66, 50, 34, 82, 0, 21, 48, 7, 10, + 0, 22, 73, 240, 96, 9, 4, 66, 50, 49, 49, 0, + 8, 16, 22, 9, 0, 8, 20, 65, 50, 34, 50, 114, + 84, 50, 34, 34, 50, 34, 35, 51, 19, 0, 5, 96, + 29, 10, 178, 115, 130, 130, 130, 130, 130, 19, 67, 34, + 50, 66, 34, 66, 34, 66, 34, 66, 34, 65, 50, 50, + 49, 19, 0, 6, 96, 18, 8, 0, 7, 51, 50, 34, + 33, 98, 98, 98, 98, 114, 49, 52, 240, 240, 192, 28, + 10, 240, 33, 115, 130, 130, 130, 130, 70, 50, 50, 49, + 66, 34, 66, 34, 66, 34, 66, 34, 66, 50, 50, 71, + 0, 6, 48, 19, 8, 0, 7, 36, 50, 33, 34, 50, + 23, 18, 98, 98, 114, 49, 52, 240, 240, 192, 20, 7, + 163, 49, 97, 82, 82, 82, 69, 50, 82, 82, 82, 82, + 82, 82, 69, 240, 240, 112, 25, 10, 0, 8, 120, 18, + 35, 50, 50, 50, 50, 65, 50, 83, 97, 145, 166, 50, + 66, 18, 82, 19, 50, 54, 208, 29, 10, 178, 115, 130, + 130, 130, 130, 130, 19, 67, 34, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 36, 20, 0, 6, 48, + 16, 5, 178, 50, 240, 50, 50, 50, 50, 50, 50, 50, + 50, 36, 240, 176, 18, 4, 146, 34, 241, 19, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 18, 96, 27, 11, + 194, 131, 146, 146, 146, 146, 146, 36, 50, 49, 82, 33, + 98, 17, 116, 114, 18, 98, 34, 82, 50, 52, 36, 0, + 7, 19, 5, 98, 35, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 36, 240, 176, 34, 15, 0, 13, + 34, 19, 35, 67, 35, 34, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 36, 20, 20, 0, 9, 64, 25, 10, 0, 8, 114, 19, + 67, 34, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 36, 20, 0, 6, 48, 23, 10, 0, 9, 5, + 66, 50, 34, 82, 18, 82, 18, 82, 18, 82, 18, 82, + 34, 50, 69, 0, 6, 80, 27, 10, 0, 8, 114, 19, + 67, 34, 50, 66, 34, 66, 34, 66, 34, 66, 34, 65, + 50, 50, 54, 66, 130, 130, 116, 240, 16, 26, 10, 0, + 9, 19, 17, 50, 35, 49, 66, 34, 66, 34, 66, 34, + 66, 34, 66, 50, 50, 70, 130, 130, 130, 116, 176, 17, + 7, 0, 6, 34, 18, 22, 34, 82, 82, 82, 82, 82, + 69, 240, 240, 112, 19, 7, 0, 6, 36, 34, 33, 34, + 83, 84, 83, 17, 50, 18, 34, 21, 240, 240, 112, 19, + 7, 240, 240, 113, 82, 70, 34, 82, 82, 82, 82, 82, + 82, 33, 51, 240, 240, 112, 25, 10, 0, 8, 99, 35, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 35, 67, 19, 0, 6, 48, 22, 10, 0, 8, 100, + 35, 34, 65, 65, 49, 82, 33, 82, 33, 97, 17, 115, + 129, 145, 0, 6, 112, 31, 15, 0, 13, 20, 20, 35, + 34, 50, 65, 65, 50, 65, 66, 35, 33, 82, 33, 17, + 33, 97, 17, 35, 115, 35, 129, 66, 129, 65, 0, 10, + 21, 11, 0, 9, 100, 20, 50, 49, 97, 33, 131, 130, + 147, 113, 34, 81, 65, 52, 36, 0, 7, 25, 10, 0, + 8, 100, 20, 34, 49, 66, 49, 81, 34, 82, 17, 113, + 17, 114, 130, 129, 145, 145, 99, 115, 240, 32, 18, 8, + 0, 7, 22, 33, 49, 98, 82, 97, 98, 82, 97, 65, + 23, 240, 240, 176, 21, 7, 163, 50, 82, 82, 82, 82, + 82, 82, 50, 114, 82, 82, 82, 82, 82, 82, 99, 240, + 112, 19, 3, 50, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 208, 21, 6, 99, 82, + 66, 66, 66, 66, 66, 66, 97, 50, 66, 66, 66, 66, + 66, 66, 35, 240, 96, 14, 12, 0, 10, 99, 81, 33, + 35, 33, 33, 83, 0, 16, 112, + 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8f, 0x01, 0x00, 0x00, // Offset 399 (0x18f) + 0xa5, 0x01, 0x00, 0x00, // Offset 421 (0x1a5) + 0xc0, 0x01, 0x00, 0x00, // Offset 448 (0x1c0) + 0xd0, 0x01, 0x00, 0x00, // Offset 464 (0x1d0) + 0xeb, 0x01, 0x00, 0x00, // Offset 491 (0x1eb) + 0x04, 0x02, 0x00, 0x00, // Offset 516 (0x204) + 0x13, 0x02, 0x00, 0x00, // Offset 531 (0x213) + 0x26, 0x02, 0x00, 0x00, // Offset 550 (0x226) + 0x36, 0x02, 0x00, 0x00, // Offset 566 (0x236) + 0x4d, 0x02, 0x00, 0x00, // Offset 589 (0x24d) + 0x68, 0x02, 0x00, 0x00, // Offset 616 (0x268) + 0x83, 0x02, 0x00, 0x00, // Offset 643 (0x283) + 0x9e, 0x02, 0x00, 0x00, // Offset 670 (0x29e) + 0xb1, 0x02, 0x00, 0x00, // Offset 689 (0x2b1) + 0xca, 0x02, 0x00, 0x00, // Offset 714 (0x2ca) + 0xe2, 0x02, 0x00, 0x00, // Offset 738 (0x2e2) + 0xf6, 0x02, 0x00, 0x00, // Offset 758 (0x2f6) + 0x0d, 0x03, 0x00, 0x00, // Offset 781 (0x30d) + 0x2d, 0x03, 0x00, 0x00, // Offset 813 (0x32d) + 0x50, 0x03, 0x00, 0x00, // Offset 848 (0x350) + 0x64, 0x03, 0x00, 0x00, // Offset 868 (0x364) + 0x7f, 0x03, 0x00, 0x00, // Offset 895 (0x37f) + 0x95, 0x03, 0x00, 0x00, // Offset 917 (0x395) + 0xa7, 0x03, 0x00, 0x00, // Offset 935 (0x3a7) + 0xc2, 0x03, 0x00, 0x00, // Offset 962 (0x3c2) + 0xd5, 0x03, 0x00, 0x00, // Offset 981 (0x3d5) + 0xe5, 0x03, 0x00, 0x00, // Offset 997 (0x3e5) + 0xf4, 0x03, 0x00, 0x00, // Offset 1012 (0x3f4) + 0x09, 0x04, 0x00, 0x00, // Offset 1033 (0x409) + 0x20, 0x04, 0x00, 0x00, // Offset 1056 (0x420) + 0x35, 0x04, 0x00, 0x00, // Offset 1077 (0x435) + 0x59, 0x04, 0x00, 0x00, // Offset 1113 (0x459) + 0x6f, 0x04, 0x00, 0x00, // Offset 1135 (0x46f) + 0x92, 0x04, 0x00, 0x00, // Offset 1170 (0x492) + 0xa7, 0x04, 0x00, 0x00, // Offset 1191 (0x4a7) + 0xce, 0x04, 0x00, 0x00, // Offset 1230 (0x4ce) + 0xe3, 0x04, 0x00, 0x00, // Offset 1251 (0x4e3) + 0x0a, 0x05, 0x00, 0x00, // Offset 1290 (0x50a) + 0x18, 0x05, 0x00, 0x00, // Offset 1304 (0x518) + 0x3e, 0x05, 0x00, 0x00, // Offset 1342 (0x53e) + 0x6b, 0x05, 0x00, 0x00, // Offset 1387 (0x56b) + 0x88, 0x05, 0x00, 0x00, // Offset 1416 (0x588) + 0x9c, 0x05, 0x00, 0x00, // Offset 1436 (0x59c) + 0xb4, 0x05, 0x00, 0x00, // Offset 1460 (0x5b4) + 0xd2, 0x05, 0x00, 0x00, // Offset 1490 (0x5d2) + 0x03, 0x06, 0x00, 0x00, // Offset 1539 (0x603) + 0x22, 0x06, 0x00, 0x00, // Offset 1570 (0x622) + 0x3b, 0x06, 0x00, 0x00, // Offset 1595 (0x63b) + 0x43, 0x06, 0x00, 0x00, // Offset 1603 (0x643) + 0x5b, 0x06, 0x00, 0x00, // Offset 1627 (0x65b) + 0x70, 0x06, 0x00, 0x00, // Offset 1648 (0x670) + 0x76, 0x06, 0x00, 0x00, // Offset 1654 (0x676) + 0x8e, 0x06, 0x00, 0x00, // Offset 1678 (0x68e) + 0xa5, 0x06, 0x00, 0x00, // Offset 1701 (0x6a5) + 0xc0, 0x06, 0x00, 0x00, // Offset 1728 (0x6c0) + 0xdd, 0x06, 0x00, 0x00, // Offset 1757 (0x6dd) + 0xfe, 0x06, 0x00, 0x00, // Offset 1790 (0x6fe) + 0x12, 0x07, 0x00, 0x00, // Offset 1810 (0x712) + 0x37, 0x07, 0x00, 0x00, // Offset 1847 (0x737) + 0x53, 0x07, 0x00, 0x00, // Offset 1875 (0x753) + 0x6b, 0x07, 0x00, 0x00, // Offset 1899 (0x76b) + 0x8c, 0x07, 0x00, 0x00, // Offset 1932 (0x78c) + 0xaf, 0x07, 0x00, 0x00, // Offset 1967 (0x7af) + 0xd3, 0x07, 0x00, 0x00, // Offset 2003 (0x7d3) + 0xf1, 0x07, 0x00, 0x00, // Offset 2033 (0x7f1) + 0x12, 0x08, 0x00, 0x00, // Offset 2066 (0x812) + 0x2f, 0x08, 0x00, 0x00, // Offset 2095 (0x82f) + 0x55, 0x08, 0x00, 0x00, // Offset 2133 (0x855) + 0x7a, 0x08, 0x00, 0x00, // Offset 2170 (0x87a) + 0x9c, 0x08, 0x00, 0x00, // Offset 2204 (0x89c) + 0xb9, 0x08, 0x00, 0x00, // Offset 2233 (0x8b9) + 0xd7, 0x08, 0x00, 0x00, // Offset 2263 (0x8d7) + 0x03, 0x09, 0x00, 0x00, // Offset 2307 (0x903) + 0x1e, 0x09, 0x00, 0x00, // Offset 2334 (0x91e) + 0x3a, 0x09, 0x00, 0x00, // Offset 2362 (0x93a) + 0x54, 0x09, 0x00, 0x00, // Offset 2388 (0x954) + 0x78, 0x09, 0x00, 0x00, // Offset 2424 (0x978) + 0x96, 0x09, 0x00, 0x00, // Offset 2454 (0x996) + 0xab, 0x09, 0x00, 0x00, // Offset 2475 (0x9ab) + 0xcc, 0x09, 0x00, 0x00, // Offset 2508 (0x9cc) + 0xe3, 0x09, 0x00, 0x00, // Offset 2531 (0x9e3) + 0x04, 0x0a, 0x00, 0x00, // Offset 2564 (0xa04) + 0x26, 0x0a, 0x00, 0x00, // Offset 2598 (0xa26) + 0x44, 0x0a, 0x00, 0x00, // Offset 2628 (0xa44) + 0x5e, 0x0a, 0x00, 0x00, // Offset 2654 (0xa5e) + 0x73, 0x0a, 0x00, 0x00, // Offset 2675 (0xa73) + 0x95, 0x0a, 0x00, 0x00, // Offset 2709 (0xa95) + 0xc6, 0x0a, 0x00, 0x00, // Offset 2758 (0xac6) + 0xe8, 0x0a, 0x00, 0x00, // Offset 2792 (0xae8) + 0x0c, 0x0b, 0x00, 0x00, // Offset 2828 (0xb0c) + 0x32, 0x0b, 0x00, 0x00, // Offset 2866 (0xb32) + 0x58, 0x0b, 0x00, 0x00, // Offset 2904 (0xb58) + 0x61, 0x0b, 0x00, 0x00, // Offset 2913 (0xb61) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 15, 12, 0, 9, 11, 162, 162, 162, 162, 162, 162, 162, + 0, 10, 80, 22, 13, 0, 9, 108, 82, 66, 82, 66, + 82, 66, 82, 66, 82, 66, 82, 66, 82, 66, 0, 11, + 64, 27, 15, 0, 10, 49, 102, 50, 130, 50, 130, 49, + 146, 34, 146, 33, 17, 130, 18, 18, 114, 17, 50, 99, + 82, 0, 13, 32, 16, 14, 0, 8, 98, 226, 194, 194, + 194, 194, 194, 194, 203, 0, 12, 48, 27, 15, 0, 11, + 35, 41, 34, 98, 82, 97, 98, 82, 98, 81, 17, 82, + 66, 33, 66, 35, 66, 36, 17, 82, 0, 13, 32, 25, + 15, 0, 10, 37, 51, 210, 41, 34, 210, 69, 66, 50, + 50, 50, 50, 50, 50, 35, 50, 52, 37, 0, 13, 64, + 15, 13, 0, 9, 108, 34, 178, 178, 178, 178, 178, 187, + 0, 11, 64, 19, 15, 0, 11, 45, 66, 50, 130, 50, + 130, 50, 130, 50, 130, 50, 140, 0, 15, 16, 16, 13, + 0, 8, 27, 178, 178, 178, 43, 50, 178, 178, 187, 0, + 11, 64, 23, 13, 0, 9, 108, 83, 50, 82, 66, 23, + 50, 34, 114, 34, 114, 34, 50, 34, 37, 66, 0, 11, + 64, 27, 14, 0, 10, 77, 100, 34, 97, 18, 34, 25, + 34, 34, 66, 34, 34, 66, 34, 34, 66, 34, 37, 22, + 130, 0, 11, 16, 27, 14, 0, 10, 2, 56, 34, 100, + 34, 97, 22, 25, 34, 34, 66, 34, 34, 66, 34, 34, + 25, 35, 49, 50, 0, 12, 48, 27, 15, 0, 10, 65, + 87, 50, 130, 49, 146, 34, 71, 34, 82, 82, 17, 66, + 81, 34, 50, 50, 66, 38, 97, 0, 13, 32, 19, 14, + 0, 10, 77, 100, 164, 93, 34, 66, 98, 66, 98, 66, + 101, 22, 0, 12, 48, 25, 16, 0, 12, 29, 99, 18, + 18, 114, 34, 18, 55, 18, 18, 66, 82, 18, 66, 82, + 18, 78, 34, 0, 15, 80, 24, 16, 0, 11, 4, 86, + 234, 98, 151, 21, 66, 66, 50, 50, 66, 50, 50, 36, + 50, 52, 53, 0, 14, 48, 20, 12, 0, 9, 11, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 42, 34, 0, + 11, 80, 23, 12, 0, 7, 66, 99, 34, 98, 34, 98, + 42, 34, 98, 34, 98, 34, 98, 42, 34, 98, 0, 10, + 80, 32, 14, 0, 8, 33, 49, 53, 34, 34, 36, 34, + 34, 36, 34, 44, 34, 36, 34, 34, 36, 34, 34, 36, + 34, 34, 40, 39, 50, 34, 0, 11, 112, 35, 15, 0, + 9, 51, 19, 35, 66, 34, 49, 82, 34, 34, 86, 34, + 82, 34, 34, 82, 34, 18, 17, 66, 34, 17, 34, 50, + 35, 66, 39, 66, 34, 0, 12, 96, 20, 13, 0, 8, + 82, 210, 162, 162, 179, 146, 18, 114, 66, 66, 99, 17, + 146, 0, 11, 64, 27, 16, 0, 11, 17, 163, 50, 130, + 65, 146, 50, 145, 66, 132, 20, 98, 35, 34, 66, 65, + 67, 18, 65, 97, 0, 14, 32, 22, 11, 0, 7, 50, + 118, 66, 66, 34, 98, 18, 98, 18, 98, 18, 98, 34, + 66, 84, 0, 10, 16, 18, 13, 0, 9, 106, 162, 177, + 177, 163, 146, 34, 98, 67, 34, 130, 0, 11, 64, 27, + 14, 0, 10, 76, 113, 65, 114, 50, 113, 50, 114, 50, + 98, 17, 18, 18, 50, 50, 50, 17, 66, 81, 81, 0, + 11, 80, 19, 13, 0, 8, 69, 240, 58, 162, 162, 162, + 146, 18, 114, 67, 34, 130, 0, 11, 64, 16, 12, 0, + 9, 11, 162, 162, 162, 42, 162, 162, 162, 161, 0, 9, + 32, 15, 13, 0, 9, 108, 34, 178, 186, 50, 178, 178, + 187, 0, 11, 64, 21, 14, 0, 10, 76, 147, 114, 50, + 114, 50, 114, 50, 114, 50, 114, 50, 33, 29, 0, 12, + 48, 23, 14, 0, 7, 54, 240, 240, 61, 85, 130, 50, + 98, 82, 82, 82, 82, 82, 98, 50, 133, 0, 11, 16, + 21, 8, 129, 131, 98, 98, 98, 98, 98, 98, 101, 50, + 98, 98, 98, 98, 98, 98, 98, 240, 208, 36, 9, 145, + 67, 35, 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, + 34, 54, 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, + 50, 34, 50, 34, 50, 34, 114, 240, 208, 22, 9, 148, + 114, 114, 114, 114, 118, 50, 114, 114, 114, 118, 50, 114, + 114, 114, 114, 114, 240, 240, 32, 35, 9, 240, 51, 35, + 50, 34, 50, 34, 50, 34, 50, 34, 54, 50, 34, 50, + 34, 50, 34, 54, 50, 34, 50, 34, 50, 34, 50, 34, + 50, 34, 50, 34, 240, 208, 21, 8, 180, 98, 98, 98, + 98, 98, 98, 23, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 240, 160, 39, 10, 240, 19, 67, 18, 82, 18, 82, + 18, 82, 18, 82, 18, 82, 18, 22, 18, 82, 18, 82, + 18, 82, 18, 82, 18, 82, 18, 82, 18, 82, 18, 82, + 18, 81, 34, 240, 240, 16, 21, 8, 180, 98, 98, 98, + 98, 23, 98, 98, 98, 98, 23, 98, 98, 98, 98, 98, + 98, 240, 160, 39, 10, 240, 19, 67, 18, 82, 18, 82, + 18, 82, 18, 22, 18, 82, 18, 82, 18, 82, 18, 82, + 18, 22, 18, 82, 18, 82, 18, 82, 18, 82, 18, 82, + 18, 82, 18, 130, 240, 96, 14, 17, 0, 15, 68, 242, + 242, 242, 242, 242, 143, 1, 0, 15, 38, 18, 240, 209, + 240, 51, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 131, 82, 146, 85, 98, 82, 146, 82, 153, 71, 82, 240, + 18, 240, 18, 240, 18, 240, 18, 0, 7, 32, 45, 16, + 240, 194, 179, 19, 162, 34, 162, 34, 162, 34, 162, 34, + 162, 34, 82, 50, 34, 82, 54, 82, 50, 34, 82, 50, + 34, 82, 20, 34, 21, 17, 34, 34, 162, 34, 162, 34, + 162, 34, 162, 34, 0, 6, 16, 29, 15, 240, 163, 226, + 210, 210, 210, 210, 82, 98, 98, 82, 98, 82, 98, 82, + 98, 82, 90, 20, 130, 210, 210, 210, 210, 0, 5, 96, + 20, 18, 0, 16, 115, 178, 50, 178, 50, 178, 50, 178, + 50, 178, 50, 111, 2, 0, 15, 112, 24, 18, 0, 20, + 47, 2, 146, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 0, 7, 96, 30, 15, 240, 161, + 243, 210, 210, 210, 210, 210, 210, 165, 25, 50, 98, 82, + 98, 22, 98, 82, 98, 82, 98, 82, 98, 82, 210, 0, + 5, 96, 49, 15, 240, 113, 51, 147, 18, 162, 18, 162, + 18, 162, 18, 162, 18, 162, 18, 162, 18, 23, 34, 18, + 81, 66, 18, 81, 66, 18, 81, 21, 18, 81, 66, 18, + 81, 66, 18, 81, 66, 18, 81, 66, 18, 81, 66, 18, + 0, 5, 96, 31, 15, 240, 163, 226, 210, 210, 210, 210, + 210, 210, 135, 23, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 0, 5, 96, 25, 18, + 0, 20, 47, 2, 97, 66, 177, 66, 177, 66, 177, 66, + 177, 66, 177, 66, 177, 66, 177, 66, 0, 7, 64, 8, + 17, 0, 27, 95, 1, 0, 15, 24, 15, 240, 163, 226, + 210, 210, 210, 210, 210, 210, 210, 210, 180, 26, 34, 210, + 210, 210, 210, 210, 0, 5, 96, 21, 5, 83, 66, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 240, 16, 6, 2, 240, 49, 240, 128, 24, 15, + 0, 11, 35, 66, 114, 66, 114, 66, 114, 66, 114, 66, + 114, 66, 114, 36, 35, 36, 36, 0, 13, 80, 23, 15, + 0, 11, 34, 71, 50, 66, 114, 66, 114, 66, 114, 66, + 114, 66, 114, 51, 117, 23, 0, 13, 32, 27, 15, 0, + 10, 66, 67, 113, 82, 98, 82, 98, 82, 83, 82, 81, + 18, 66, 66, 34, 50, 35, 66, 36, 17, 0, 14, 16, + 29, 15, 0, 10, 65, 83, 98, 82, 98, 82, 82, 17, + 66, 82, 17, 66, 81, 49, 50, 66, 49, 50, 35, 81, + 36, 39, 0, 13, 32, 33, 18, 0, 13, 90, 34, 114, + 50, 34, 114, 50, 33, 70, 50, 19, 66, 98, 17, 17, + 66, 98, 17, 33, 50, 49, 35, 50, 37, 50, 81, 0, + 15, 112, 20, 14, 0, 10, 77, 85, 146, 18, 89, 98, + 66, 98, 66, 98, 66, 101, 22, 0, 12, 48, 37, 19, + 0, 13, 1, 49, 103, 34, 34, 129, 17, 34, 33, 145, + 21, 18, 70, 17, 34, 18, 82, 65, 34, 19, 66, 65, + 35, 34, 50, 40, 50, 36, 33, 34, 0, 17, 64, 28, + 15, 0, 11, 39, 34, 146, 34, 146, 33, 17, 55, 18, + 17, 66, 81, 49, 50, 66, 49, 50, 50, 81, 37, 23, + 0, 13, 32, 24, 15, 0, 11, 61, 98, 209, 51, 57, + 34, 50, 66, 50, 34, 66, 50, 34, 37, 19, 36, 67, + 0, 13, 64, 33, 14, 0, 8, 33, 57, 34, 34, 36, + 34, 34, 36, 34, 34, 40, 34, 36, 34, 34, 36, 34, + 34, 36, 34, 34, 40, 39, 50, 33, 81, 0, 11, 32, + 35, 15, 0, 9, 55, 50, 66, 34, 50, 66, 34, 49, + 82, 34, 34, 82, 34, 34, 82, 34, 18, 17, 66, 34, + 17, 34, 50, 36, 50, 39, 81, 33, 0, 12, 112, 36, + 15, 0, 9, 55, 35, 66, 34, 50, 66, 34, 35, 66, + 34, 33, 17, 66, 34, 18, 33, 50, 34, 18, 33, 50, + 34, 17, 50, 34, 36, 65, 45, 33, 0, 12, 112, 30, + 11, 240, 240, 58, 34, 82, 34, 82, 34, 82, 34, 82, + 41, 240, 20, 98, 34, 66, 66, 50, 66, 50, 66, 66, + 34, 100, 0, 5, 112, 33, 14, 0, 8, 99, 25, 34, + 34, 66, 34, 34, 66, 38, 66, 34, 34, 66, 34, 34, + 66, 34, 34, 66, 34, 34, 66, 38, 66, 34, 129, 0, + 10, 96, 29, 15, 0, 11, 35, 41, 34, 34, 18, 102, + 18, 98, 34, 18, 98, 34, 18, 98, 34, 18, 98, 34, + 18, 102, 22, 33, 0, 12, 112, 38, 15, 0, 11, 34, + 33, 39, 33, 33, 33, 66, 33, 33, 33, 66, 36, 18, + 66, 33, 33, 19, 50, 33, 35, 17, 50, 33, 34, 49, + 34, 37, 50, 18, 33, 162, 0, 11, 48, 37, 16, 0, + 10, 49, 194, 34, 39, 33, 34, 33, 33, 81, 34, 18, + 33, 85, 18, 33, 81, 34, 18, 33, 81, 36, 17, 17, + 81, 35, 35, 85, 69, 33, 49, 0, 13, 32, 34, 16, + 0, 10, 65, 179, 34, 23, 34, 34, 50, 86, 50, 82, + 34, 50, 82, 34, 35, 82, 34, 33, 33, 66, 34, 18, + 34, 54, 17, 66, 34, 65, 0, 13, 29, 15, 0, 11, + 35, 41, 34, 34, 18, 102, 18, 98, 34, 22, 34, 34, + 18, 98, 34, 18, 98, 34, 18, 102, 22, 33, 0, 12, + 112, 30, 11, 240, 212, 19, 82, 34, 82, 41, 34, 82, + 34, 82, 41, 34, 81, 84, 98, 34, 66, 66, 50, 66, + 50, 66, 66, 34, 100, 0, 6, 44, 11, 240, 145, 34, + 18, 17, 34, 17, 33, 17, 34, 17, 33, 21, 20, 17, + 34, 17, 33, 17, 34, 17, 33, 17, 34, 17, 33, 21, + 20, 17, 81, 116, 83, 34, 66, 66, 50, 66, 51, 35, + 84, 0, 6, 27, 14, 0, 9, 17, 226, 22, 81, 98, + 66, 98, 66, 98, 52, 82, 49, 34, 66, 34, 50, 50, + 18, 81, 50, 0, 12, 48, 28, 15, 0, 10, 33, 162, + 50, 130, 50, 129, 66, 114, 66, 113, 17, 50, 98, 33, + 34, 97, 50, 18, 81, 81, 22, 0, 13, 32, 26, 15, + 0, 11, 83, 23, 66, 50, 130, 50, 130, 50, 115, 50, + 113, 33, 34, 97, 50, 18, 81, 81, 22, 0, 13, 32, + 36, 15, 0, 8, 114, 83, 19, 34, 81, 50, 34, 66, + 50, 34, 66, 54, 66, 50, 34, 50, 17, 34, 34, 49, + 34, 18, 34, 33, 68, 34, 18, 72, 146, 0, 11, 112, + 30, 15, 0, 9, 82, 226, 24, 66, 66, 113, 82, 98, + 81, 113, 17, 51, 82, 33, 33, 33, 50, 52, 34, 33, + 82, 66, 113, 0, 12, 32, 21, 10, 0, 6, 82, 131, + 115, 98, 18, 81, 49, 66, 65, 49, 81, 34, 97, 25, + 0, 8, 112, 33, 16, 0, 10, 50, 82, 114, 82, 82, + 34, 18, 34, 34, 67, 66, 18, 67, 66, 18, 67, 66, + 18, 67, 66, 34, 34, 18, 34, 68, 52, 0, 14, 48, + 23, 10, 240, 240, 210, 145, 131, 82, 50, 34, 82, 18, + 82, 18, 82, 18, 82, 34, 50, 69, 0, 9, 16, 33, + 16, 0, 10, 34, 98, 113, 113, 99, 82, 82, 34, 50, + 66, 66, 34, 66, 66, 18, 17, 50, 68, 34, 50, 34, + 17, 66, 52, 17, 97, 0, 14, 16, 34, 16, 0, 10, + 34, 82, 129, 98, 99, 82, 82, 34, 49, 17, 50, 66, + 18, 17, 50, 66, 17, 49, 34, 68, 49, 50, 34, 17, + 66, 52, 39, 0, 14, 16, 30, 13, 240, 129, 43, 130, + 115, 34, 114, 34, 114, 34, 114, 34, 76, 240, 240, 20, + 115, 34, 98, 66, 82, 66, 83, 35, 116, 0, 7, 16, + 26, 17, 0, 10, 116, 52, 240, 111, 1, 240, 85, 37, + 66, 52, 50, 50, 52, 50, 50, 52, 50, 69, 37, 0, + 15, 32, 21, 14, 0, 10, 77, 240, 69, 130, 50, 98, + 82, 82, 82, 82, 82, 98, 50, 133, 0, 11, 16, 34, + 17, 240, 178, 240, 34, 242, 242, 242, 245, 50, 35, 34, + 114, 34, 34, 114, 34, 34, 114, 34, 37, 66, 38, 71, + 66, 242, 242, 242, 242, 242, 0, 6, 112, 49, 16, 240, + 210, 164, 18, 178, 18, 178, 18, 178, 18, 181, 99, 34, + 18, 66, 18, 34, 18, 66, 18, 34, 18, 66, 18, 34, + 18, 66, 18, 37, 66, 22, 18, 23, 50, 18, 178, 18, + 178, 18, 178, 18, 178, 18, 226, 240, 240, 48, 34, 14, + 240, 131, 210, 194, 194, 194, 194, 50, 35, 34, 66, 34, + 34, 66, 34, 34, 66, 34, 34, 66, 34, 34, 74, 20, + 114, 194, 194, 194, 194, 240, 240, 208, 36, 15, 240, 240, + 179, 210, 210, 210, 210, 210, 210, 165, 25, 50, 66, 34, + 20, 66, 34, 50, 66, 34, 50, 66, 34, 20, 66, 34, + 50, 66, 34, 50, 210, 0, 5, 96, 38, 15, 240, 179, + 165, 180, 180, 180, 180, 180, 180, 24, 36, 50, 17, 68, + 50, 17, 23, 50, 17, 68, 50, 17, 68, 50, 17, 23, + 50, 17, 68, 50, 17, 68, 210, 0, 5, 96, 38, 15, + 240, 162, 242, 210, 210, 210, 210, 210, 210, 150, 25, 50, + 66, 34, 50, 66, 34, 50, 66, 34, 50, 66, 34, 50, + 66, 34, 50, 66, 34, 50, 66, 34, 50, 0, 5, 96, + 9, 4, 240, 240, 35, 19, 240, 240, 240, 23, 8, 179, + 114, 98, 98, 98, 98, 98, 19, 34, 19, 34, 98, 98, + 98, 98, 98, 98, 98, 97, 240, 176, +}; + +tFont *g_psFontWHangulmyeongjo18ptb = (tFont *)g_pui8Hangulmyeongjo18ptb; diff --git a/third_party/fonts/ofl/fonts/fonthangulmyeongjo20pt.c b/third_party/fonts/ofl/fonts/fonthangulmyeongjo20pt.c new file mode 100644 index 0000000..6530205 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulmyeongjo20pt.c @@ -0,0 +1,843 @@ +//***************************************************************************** +// +// fonthangulmyeongjo20pt.c - Font definition for the 20ptpt Hangulmyeongjo font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulmyeongjo +// Size: 20pt +// Bold: no +// Italic: no +// Memory usage: 6258 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulmyeongjo20pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 19, + + // + // The height of the font. + // + 24, + + // + // The baseline of the font. + // + 18, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x74, 0x0b, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x92, 0x01, 0x00, 0x00, // Offset 402 (0x192) + 0xa1, 0x01, 0x00, 0x00, // Offset 417 (0x1a1) + 0xc4, 0x01, 0x00, 0x00, // Offset 452 (0x1c4) + 0xec, 0x01, 0x00, 0x00, // Offset 492 (0x1ec) + 0x21, 0x02, 0x00, 0x00, // Offset 545 (0x221) + 0x4b, 0x02, 0x00, 0x00, // Offset 587 (0x24b) + 0x54, 0x02, 0x00, 0x00, // Offset 596 (0x254) + 0x6b, 0x02, 0x00, 0x00, // Offset 619 (0x26b) + 0x83, 0x02, 0x00, 0x00, // Offset 643 (0x283) + 0x94, 0x02, 0x00, 0x00, // Offset 660 (0x294) + 0xa5, 0x02, 0x00, 0x00, // Offset 677 (0x2a5) + 0xb0, 0x02, 0x00, 0x00, // Offset 688 (0x2b0) + 0xb8, 0x02, 0x00, 0x00, // Offset 696 (0x2b8) + 0xc0, 0x02, 0x00, 0x00, // Offset 704 (0x2c0) + 0xd7, 0x02, 0x00, 0x00, // Offset 727 (0x2d7) + 0xfa, 0x02, 0x00, 0x00, // Offset 762 (0x2fa) + 0x0f, 0x03, 0x00, 0x00, // Offset 783 (0x30f) + 0x28, 0x03, 0x00, 0x00, // Offset 808 (0x328) + 0x40, 0x03, 0x00, 0x00, // Offset 832 (0x340) + 0x5d, 0x03, 0x00, 0x00, // Offset 861 (0x35d) + 0x74, 0x03, 0x00, 0x00, // Offset 884 (0x374) + 0x92, 0x03, 0x00, 0x00, // Offset 914 (0x392) + 0xa9, 0x03, 0x00, 0x00, // Offset 937 (0x3a9) + 0xcb, 0x03, 0x00, 0x00, // Offset 971 (0x3cb) + 0xe9, 0x03, 0x00, 0x00, // Offset 1001 (0x3e9) + 0xf4, 0x03, 0x00, 0x00, // Offset 1012 (0x3f4) + 0x03, 0x04, 0x00, 0x00, // Offset 1027 (0x403) + 0x1c, 0x04, 0x00, 0x00, // Offset 1052 (0x41c) + 0x27, 0x04, 0x00, 0x00, // Offset 1063 (0x427) + 0x3f, 0x04, 0x00, 0x00, // Offset 1087 (0x43f) + 0x59, 0x04, 0x00, 0x00, // Offset 1113 (0x459) + 0x8c, 0x04, 0x00, 0x00, // Offset 1164 (0x48c) + 0xae, 0x04, 0x00, 0x00, // Offset 1198 (0x4ae) + 0xd0, 0x04, 0x00, 0x00, // Offset 1232 (0x4d0) + 0xec, 0x04, 0x00, 0x00, // Offset 1260 (0x4ec) + 0x0f, 0x05, 0x00, 0x00, // Offset 1295 (0x50f) + 0x2d, 0x05, 0x00, 0x00, // Offset 1325 (0x52d) + 0x49, 0x05, 0x00, 0x00, // Offset 1353 (0x549) + 0x67, 0x05, 0x00, 0x00, // Offset 1383 (0x567) + 0x8b, 0x05, 0x00, 0x00, // Offset 1419 (0x58b) + 0xa0, 0x05, 0x00, 0x00, // Offset 1440 (0x5a0) + 0xbb, 0x05, 0x00, 0x00, // Offset 1467 (0x5bb) + 0xe0, 0x05, 0x00, 0x00, // Offset 1504 (0x5e0) + 0xf8, 0x05, 0x00, 0x00, // Offset 1528 (0x5f8) + 0x30, 0x06, 0x00, 0x00, // Offset 1584 (0x630) + 0x5e, 0x06, 0x00, 0x00, // Offset 1630 (0x65e) + 0x81, 0x06, 0x00, 0x00, // Offset 1665 (0x681) + 0x9e, 0x06, 0x00, 0x00, // Offset 1694 (0x69e) + 0xc5, 0x06, 0x00, 0x00, // Offset 1733 (0x6c5) + 0xe8, 0x06, 0x00, 0x00, // Offset 1768 (0x6e8) + 0x01, 0x07, 0x00, 0x00, // Offset 1793 (0x701) + 0x1a, 0x07, 0x00, 0x00, // Offset 1818 (0x71a) + 0x3e, 0x07, 0x00, 0x00, // Offset 1854 (0x73e) + 0x5f, 0x07, 0x00, 0x00, // Offset 1887 (0x75f) + 0x96, 0x07, 0x00, 0x00, // Offset 1942 (0x796) + 0xb9, 0x07, 0x00, 0x00, // Offset 1977 (0x7b9) + 0xd4, 0x07, 0x00, 0x00, // Offset 2004 (0x7d4) + 0xef, 0x07, 0x00, 0x00, // Offset 2031 (0x7ef) + 0x05, 0x08, 0x00, 0x00, // Offset 2053 (0x805) + 0x37, 0x08, 0x00, 0x00, // Offset 2103 (0x837) + 0x4d, 0x08, 0x00, 0x00, // Offset 2125 (0x84d) + 0x58, 0x08, 0x00, 0x00, // Offset 2136 (0x858) + 0x60, 0x08, 0x00, 0x00, // Offset 2144 (0x860) + 0x69, 0x08, 0x00, 0x00, // Offset 2153 (0x869) + 0x81, 0x08, 0x00, 0x00, // Offset 2177 (0x881) + 0x9f, 0x08, 0x00, 0x00, // Offset 2207 (0x89f) + 0xb1, 0x08, 0x00, 0x00, // Offset 2225 (0x8b1) + 0xd0, 0x08, 0x00, 0x00, // Offset 2256 (0x8d0) + 0xe4, 0x08, 0x00, 0x00, // Offset 2276 (0x8e4) + 0xfa, 0x08, 0x00, 0x00, // Offset 2298 (0x8fa) + 0x17, 0x09, 0x00, 0x00, // Offset 2327 (0x917) + 0x38, 0x09, 0x00, 0x00, // Offset 2360 (0x938) + 0x4b, 0x09, 0x00, 0x00, // Offset 2379 (0x94b) + 0x60, 0x09, 0x00, 0x00, // Offset 2400 (0x960) + 0x7f, 0x09, 0x00, 0x00, // Offset 2431 (0x97f) + 0x94, 0x09, 0x00, 0x00, // Offset 2452 (0x994) + 0xb9, 0x09, 0x00, 0x00, // Offset 2489 (0x9b9) + 0xd5, 0x09, 0x00, 0x00, // Offset 2517 (0x9d5) + 0xee, 0x09, 0x00, 0x00, // Offset 2542 (0x9ee) + 0x0c, 0x0a, 0x00, 0x00, // Offset 2572 (0xa0c) + 0x29, 0x0a, 0x00, 0x00, // Offset 2601 (0xa29) + 0x3c, 0x0a, 0x00, 0x00, // Offset 2620 (0xa3c) + 0x50, 0x0a, 0x00, 0x00, // Offset 2640 (0xa50) + 0x62, 0x0a, 0x00, 0x00, // Offset 2658 (0xa62) + 0x7d, 0x0a, 0x00, 0x00, // Offset 2685 (0xa7d) + 0x93, 0x0a, 0x00, 0x00, // Offset 2707 (0xa93) + 0xb4, 0x0a, 0x00, 0x00, // Offset 2740 (0xab4) + 0xcd, 0x0a, 0x00, 0x00, // Offset 2765 (0xacd) + 0xea, 0x0a, 0x00, 0x00, // Offset 2794 (0xaea) + 0xfd, 0x0a, 0x00, 0x00, // Offset 2813 (0xafd) + 0x15, 0x0b, 0x00, 0x00, // Offset 2837 (0xb15) + 0x2a, 0x0b, 0x00, 0x00, // Offset 2858 (0xb2a) + 0x42, 0x0b, 0x00, 0x00, // Offset 2882 (0xb42) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 4, 9, 0, 27, 18, 4, 194, 34, 34, 34, 34, 49, + 49, 49, 49, 49, 49, 49, 162, 34, 240, 112, 15, 6, + 97, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 13, + 96, 35, 13, 240, 240, 209, 49, 129, 49, 129, 34, 114, + 33, 91, 81, 49, 129, 49, 129, 34, 114, 33, 106, 81, + 49, 129, 49, 129, 34, 114, 34, 113, 49, 0, 10, 80, + 40, 11, 240, 177, 133, 81, 33, 33, 49, 49, 33, 49, + 49, 97, 49, 114, 17, 131, 163, 129, 18, 113, 34, 97, + 49, 97, 49, 33, 49, 49, 33, 49, 33, 70, 129, 161, + 161, 240, 240, 144, 53, 18, 0, 7, 19, 97, 113, 50, + 19, 113, 65, 17, 17, 114, 65, 49, 113, 81, 33, 129, + 65, 49, 129, 49, 49, 146, 17, 49, 52, 81, 65, 34, + 49, 129, 34, 65, 129, 33, 81, 113, 49, 65, 113, 65, + 65, 113, 65, 49, 113, 99, 0, 14, 16, 42, 18, 0, + 7, 52, 209, 65, 193, 65, 193, 65, 193, 49, 212, 37, + 114, 82, 114, 17, 81, 113, 65, 65, 97, 82, 33, 113, + 97, 33, 113, 114, 129, 114, 81, 49, 81, 18, 49, 85, + 67, 0, 14, 9, 3, 49, 33, 33, 33, 33, 0, 7, + 23, 7, 177, 81, 81, 81, 97, 97, 81, 97, 97, 97, + 97, 97, 97, 113, 97, 113, 97, 113, 113, 240, 240, 24, + 7, 113, 113, 113, 113, 97, 97, 113, 97, 97, 97, 97, + 97, 97, 81, 97, 81, 97, 81, 81, 240, 240, 64, 17, + 9, 193, 129, 82, 17, 18, 67, 85, 50, 17, 18, 81, + 129, 0, 17, 64, 17, 11, 0, 7, 49, 161, 161, 161, + 105, 97, 161, 161, 161, 161, 0, 13, 16, 11, 5, 0, + 10, 3, 35, 65, 65, 34, 240, 48, 8, 11, 0, 13, + 105, 0, 18, 16, 8, 4, 0, 8, 66, 34, 240, 112, + 23, 9, 240, 145, 114, 113, 129, 113, 129, 129, 113, 129, + 114, 113, 129, 113, 129, 129, 113, 129, 0, 6, 80, 35, + 11, 240, 240, 99, 113, 49, 81, 81, 65, 81, 49, 113, + 33, 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, 113, + 49, 81, 65, 81, 81, 49, 115, 0, 8, 112, 21, 7, + 240, 114, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 69, 240, 240, 224, 25, 10, 240, 240, 36, + 81, 65, 49, 97, 33, 97, 145, 145, 129, 145, 129, 129, + 130, 129, 129, 129, 136, 0, 7, 96, 24, 10, 240, 240, + 36, 81, 50, 49, 81, 145, 145, 129, 129, 132, 146, 145, + 145, 145, 129, 50, 65, 69, 0, 8, 29, 11, 240, 240, + 145, 146, 146, 129, 17, 129, 17, 113, 33, 97, 49, 97, + 49, 81, 65, 65, 81, 73, 129, 161, 161, 161, 0, 8, + 96, 23, 10, 240, 240, 53, 65, 145, 129, 148, 147, 145, + 146, 145, 145, 145, 145, 129, 50, 49, 84, 0, 8, 16, + 30, 10, 240, 240, 83, 82, 113, 129, 145, 145, 18, 83, + 34, 49, 81, 49, 97, 33, 97, 33, 97, 33, 97, 49, + 81, 49, 65, 84, 0, 8, 23, 11, 240, 240, 72, 49, + 82, 33, 97, 161, 146, 145, 161, 161, 145, 161, 161, 145, + 161, 161, 146, 0, 9, 34, 11, 240, 240, 99, 113, 49, + 81, 81, 65, 81, 65, 81, 66, 49, 98, 33, 116, 82, + 50, 49, 98, 33, 113, 33, 113, 33, 113, 49, 81, 85, + 0, 8, 96, 30, 10, 240, 240, 36, 81, 65, 49, 81, + 49, 97, 33, 97, 33, 97, 33, 97, 49, 81, 49, 66, + 69, 145, 130, 129, 114, 83, 0, 8, 48, 11, 4, 240, + 82, 34, 240, 242, 34, 240, 240, 64, 15, 5, 240, 163, + 35, 240, 240, 35, 35, 65, 49, 49, 240, 240, 64, 25, + 10, 240, 33, 129, 129, 130, 129, 129, 129, 129, 145, 129, + 161, 145, 161, 161, 161, 146, 145, 161, 161, 240, 240, 192, + 11, 11, 0, 11, 9, 240, 240, 89, 0, 15, 48, 24, + 10, 161, 161, 161, 146, 145, 161, 161, 161, 145, 161, 129, + 130, 129, 129, 129, 130, 129, 129, 129, 0, 6, 16, 26, + 10, 240, 240, 36, 81, 65, 49, 97, 34, 81, 34, 81, + 145, 129, 145, 129, 129, 145, 145, 240, 210, 130, 0, 6, + 112, 51, 17, 0, 7, 6, 146, 98, 97, 146, 65, 67, + 65, 65, 49, 50, 49, 33, 49, 81, 49, 33, 49, 66, + 49, 33, 34, 65, 65, 33, 33, 81, 65, 33, 33, 66, + 49, 49, 34, 49, 49, 81, 51, 19, 113, 161, 97, 114, + 135, 0, 13, 64, 34, 16, 240, 240, 145, 241, 226, 226, + 209, 33, 193, 33, 193, 33, 177, 65, 161, 65, 166, 145, + 97, 129, 97, 129, 97, 113, 129, 97, 129, 69, 69, 0, + 12, 32, 34, 13, 240, 240, 151, 129, 65, 113, 81, 97, + 81, 97, 81, 97, 81, 97, 65, 117, 129, 67, 81, 98, + 65, 113, 65, 113, 65, 113, 65, 97, 57, 0, 10, 32, + 28, 15, 0, 6, 38, 114, 98, 65, 145, 49, 161, 49, + 209, 225, 225, 225, 225, 241, 225, 161, 65, 129, 98, 97, + 134, 0, 11, 96, 35, 16, 0, 6, 9, 145, 98, 113, + 129, 97, 145, 81, 145, 81, 161, 65, 161, 65, 161, 65, + 161, 65, 161, 65, 145, 81, 145, 81, 129, 97, 113, 90, + 0, 12, 96, 30, 13, 240, 240, 154, 81, 97, 81, 97, + 81, 193, 193, 81, 97, 81, 103, 97, 81, 97, 81, 97, + 193, 193, 113, 65, 113, 42, 0, 10, 16, 28, 12, 240, + 240, 106, 65, 97, 65, 97, 65, 177, 177, 81, 81, 81, + 87, 81, 81, 81, 81, 81, 177, 177, 177, 149, 0, 9, + 112, 30, 16, 0, 6, 85, 146, 82, 97, 129, 81, 241, + 225, 241, 241, 241, 133, 33, 161, 81, 145, 81, 145, 97, + 129, 113, 113, 135, 0, 12, 80, 36, 18, 0, 6, 101, + 101, 65, 161, 97, 161, 97, 161, 97, 161, 97, 161, 97, + 161, 108, 97, 161, 97, 161, 97, 161, 97, 161, 97, 161, + 97, 161, 69, 101, 0, 13, 96, 21, 7, 240, 101, 65, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 69, 240, 240, 224, 27, 10, 240, 240, 53, 113, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, + 145, 129, 81, 49, 84, 240, 16, 37, 15, 240, 240, 245, + 52, 81, 97, 113, 81, 129, 65, 145, 49, 161, 33, 177, + 18, 178, 17, 177, 49, 161, 50, 145, 66, 129, 81, 129, + 97, 113, 98, 69, 83, 0, 11, 64, 24, 13, 240, 240, + 149, 161, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 113, 65, 97, 73, 0, 10, 16, 56, 21, 0, 8, + 3, 195, 82, 162, 114, 162, 113, 17, 129, 17, 113, 17, + 129, 17, 113, 33, 97, 33, 113, 33, 97, 33, 113, 34, + 65, 49, 113, 49, 65, 49, 113, 50, 49, 49, 113, 65, + 33, 65, 113, 65, 33, 65, 113, 82, 81, 113, 82, 81, + 69, 149, 0, 16, 46, 17, 0, 6, 51, 147, 66, 145, + 82, 145, 81, 17, 129, 81, 33, 113, 81, 49, 97, 81, + 65, 81, 81, 66, 65, 81, 81, 65, 81, 97, 49, 81, + 113, 33, 81, 129, 17, 81, 131, 81, 146, 53, 129, 0, + 13, 16, 35, 16, 0, 6, 84, 162, 66, 113, 129, 81, + 161, 49, 177, 49, 193, 33, 193, 33, 193, 33, 193, 33, + 193, 49, 161, 65, 161, 81, 129, 113, 97, 150, 0, 12, + 96, 29, 12, 240, 240, 103, 113, 66, 81, 82, 65, 97, + 65, 97, 65, 97, 65, 97, 65, 81, 86, 97, 177, 177, + 177, 177, 149, 0, 9, 112, 39, 16, 0, 6, 84, 162, + 66, 113, 129, 81, 161, 49, 177, 49, 193, 33, 193, 33, + 193, 33, 193, 33, 193, 49, 161, 65, 161, 81, 129, 113, + 97, 150, 210, 242, 240, 20, 0, 6, 32, 35, 15, 240, + 240, 248, 145, 81, 129, 97, 113, 97, 113, 97, 113, 97, + 113, 66, 133, 161, 50, 145, 66, 129, 81, 129, 82, 113, + 98, 97, 98, 69, 83, 0, 11, 64, 25, 11, 240, 240, + 101, 81, 65, 65, 161, 161, 162, 163, 163, 162, 162, 161, + 161, 33, 113, 49, 81, 70, 0, 8, 96, 25, 15, 0, + 5, 108, 33, 81, 81, 33, 81, 81, 129, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 225, 197, 0, 12, 36, 17, + 0, 6, 53, 85, 65, 145, 97, 145, 97, 145, 97, 145, + 97, 145, 97, 145, 97, 145, 97, 145, 97, 145, 97, 145, + 97, 145, 113, 113, 130, 82, 165, 0, 13, 80, 33, 16, + 0, 6, 5, 99, 66, 129, 97, 113, 113, 113, 114, 97, + 129, 81, 145, 81, 161, 65, 161, 49, 178, 33, 193, 17, + 209, 17, 211, 225, 241, 0, 13, 55, 22, 0, 8, 37, + 20, 36, 19, 65, 81, 65, 65, 82, 66, 49, 65, 97, + 81, 33, 65, 114, 66, 17, 65, 129, 82, 81, 129, 82, + 65, 146, 81, 65, 161, 66, 49, 178, 33, 18, 33, 193, + 33, 33, 33, 193, 17, 51, 226, 66, 226, 66, 225, 0, + 18, 32, 35, 16, 0, 6, 4, 85, 65, 129, 98, 97, + 130, 65, 161, 49, 193, 33, 195, 226, 209, 17, 209, 33, + 177, 50, 145, 82, 113, 113, 113, 129, 68, 100, 0, 12, + 32, 27, 15, 240, 240, 244, 84, 65, 113, 98, 97, 114, + 65, 145, 49, 162, 17, 195, 209, 225, 225, 225, 225, 225, + 225, 197, 0, 12, 27, 15, 0, 5, 107, 49, 145, 65, + 130, 194, 194, 209, 210, 194, 194, 209, 210, 194, 129, 50, + 145, 49, 145, 60, 0, 11, 80, 22, 6, 196, 33, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 84, 240, 176, 50, 21, 0, 7, 117, 21, 68, + 65, 82, 97, 97, 97, 97, 98, 81, 97, 113, 81, 81, + 129, 82, 65, 95, 4, 97, 49, 17, 65, 145, 49, 33, + 33, 161, 33, 49, 33, 177, 17, 49, 33, 177, 17, 66, + 194, 82, 209, 82, 0, 19, 32, 22, 6, 196, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 36, 240, 176, 11, 10, 50, 116, 81, 65, 49, + 97, 0, 25, 32, 8, 12, 0, 30, 10, 240, 240, 128, + 9, 4, 65, 49, 65, 49, 0, 9, 96, 24, 10, 0, + 10, 51, 82, 34, 49, 81, 145, 130, 83, 17, 65, 65, + 49, 81, 49, 66, 68, 18, 0, 7, 96, 30, 10, 240, + 81, 145, 145, 145, 145, 145, 145, 35, 67, 34, 49, 82, + 33, 97, 33, 97, 33, 97, 33, 97, 33, 81, 49, 81, + 69, 0, 8, 18, 10, 0, 10, 52, 66, 50, 33, 145, + 145, 145, 145, 146, 146, 49, 84, 0, 8, 31, 11, 240, + 225, 161, 161, 161, 161, 161, 101, 66, 65, 65, 81, 49, + 97, 49, 97, 49, 97, 49, 97, 50, 81, 66, 50, 84, + 18, 0, 8, 64, 20, 9, 0, 9, 36, 65, 65, 33, + 81, 39, 33, 129, 129, 130, 130, 49, 68, 0, 7, 16, + 22, 9, 240, 130, 82, 97, 129, 129, 129, 117, 81, 129, + 129, 129, 129, 129, 129, 129, 101, 0, 7, 32, 29, 11, + 0, 11, 39, 49, 65, 81, 65, 81, 65, 81, 65, 82, + 33, 115, 113, 161, 182, 65, 82, 33, 113, 33, 113, 34, + 81, 70, 240, 33, 11, 240, 129, 161, 161, 161, 161, 161, + 161, 35, 81, 17, 34, 66, 65, 65, 81, 65, 81, 65, + 81, 65, 81, 65, 81, 65, 81, 51, 51, 0, 8, 64, + 19, 6, 240, 66, 66, 240, 129, 66, 81, 81, 81, 81, + 81, 81, 81, 52, 240, 240, 128, 21, 5, 240, 18, 50, + 240, 49, 50, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 49, 224, 31, 12, 240, 161, 177, 177, 177, 177, + 177, 177, 67, 65, 65, 97, 49, 113, 33, 129, 17, 148, + 129, 34, 113, 50, 97, 65, 83, 67, 0, 9, 32, 21, + 5, 177, 50, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 51, 240, 240, 32, 37, 17, 0, 17, + 17, 35, 51, 81, 17, 36, 34, 66, 65, 81, 65, 81, + 81, 65, 81, 81, 65, 81, 81, 65, 81, 81, 65, 81, + 81, 65, 81, 81, 51, 52, 35, 0, 13, 28, 11, 0, + 11, 17, 35, 81, 17, 34, 66, 65, 65, 81, 65, 81, + 65, 81, 65, 81, 65, 81, 65, 81, 51, 51, 0, 8, + 64, 25, 11, 0, 11, 37, 81, 81, 49, 97, 49, 113, + 33, 113, 33, 113, 33, 113, 49, 81, 65, 81, 85, 0, + 8, 96, 30, 11, 0, 11, 17, 35, 83, 34, 65, 82, + 49, 97, 49, 97, 49, 97, 49, 97, 49, 81, 65, 81, + 70, 81, 161, 161, 161, 147, 240, 64, 29, 11, 0, 11, + 53, 66, 50, 65, 81, 49, 97, 49, 97, 49, 97, 49, + 97, 50, 81, 66, 50, 84, 17, 161, 161, 161, 161, 147, + 208, 19, 9, 0, 9, 33, 34, 50, 19, 66, 113, 129, + 129, 129, 129, 129, 101, 0, 7, 32, 20, 8, 0, 8, + 20, 49, 65, 33, 65, 34, 115, 114, 114, 113, 33, 65, + 37, 0, 6, 48, 18, 7, 0, 6, 33, 85, 49, 97, + 97, 97, 97, 97, 97, 97, 114, 240, 240, 240, 27, 11, + 0, 11, 2, 66, 65, 81, 65, 81, 65, 81, 65, 81, + 65, 81, 65, 81, 65, 81, 66, 35, 83, 34, 0, 8, + 64, 22, 12, 0, 12, 4, 51, 65, 65, 97, 65, 98, + 49, 113, 33, 129, 33, 146, 162, 162, 0, 11, 32, 33, + 18, 0, 18, 4, 36, 36, 65, 81, 65, 97, 66, 65, + 98, 51, 33, 129, 33, 33, 33, 129, 33, 33, 33, 146, + 51, 162, 66, 162, 66, 0, 16, 64, 25, 12, 0, 12, + 4, 36, 50, 65, 98, 33, 129, 17, 161, 178, 145, 17, + 129, 49, 97, 81, 67, 52, 0, 9, 32, 29, 11, 0, + 11, 3, 51, 49, 65, 82, 49, 97, 49, 97, 33, 114, + 17, 129, 17, 130, 161, 145, 161, 161, 145, 129, 17, 130, + 240, 80, 19, 10, 0, 10, 22, 130, 129, 129, 130, 129, + 130, 114, 65, 49, 81, 39, 0, 7, 112, 24, 6, 49, + 50, 65, 81, 81, 81, 81, 81, 81, 65, 81, 97, 81, + 81, 81, 81, 81, 81, 81, 98, 240, 176, 21, 3, 97, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 224, 24, 6, 1, 98, 81, 81, + 81, 81, 81, 81, 81, 97, 81, 65, 81, 81, 81, 81, + 81, 81, 81, 50, 240, 208, 17, 14, 0, 14, 35, 97, + 49, 50, 65, 49, 66, 33, 49, 99, 0, 21, 64, + 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x90, 0x01, 0x00, 0x00, // Offset 400 (0x190) + 0xa9, 0x01, 0x00, 0x00, // Offset 425 (0x1a9) + 0xc6, 0x01, 0x00, 0x00, // Offset 454 (0x1c6) + 0xd7, 0x01, 0x00, 0x00, // Offset 471 (0x1d7) + 0xf4, 0x01, 0x00, 0x00, // Offset 500 (0x1f4) + 0x12, 0x02, 0x00, 0x00, // Offset 530 (0x212) + 0x20, 0x02, 0x00, 0x00, // Offset 544 (0x220) + 0x37, 0x02, 0x00, 0x00, // Offset 567 (0x237) + 0x46, 0x02, 0x00, 0x00, // Offset 582 (0x246) + 0x61, 0x02, 0x00, 0x00, // Offset 609 (0x261) + 0x81, 0x02, 0x00, 0x00, // Offset 641 (0x281) + 0xa6, 0x02, 0x00, 0x00, // Offset 678 (0x2a6) + 0xc5, 0x02, 0x00, 0x00, // Offset 709 (0x2c5) + 0xdd, 0x02, 0x00, 0x00, // Offset 733 (0x2dd) + 0xfa, 0x02, 0x00, 0x00, // Offset 762 (0x2fa) + 0x19, 0x03, 0x00, 0x00, // Offset 793 (0x319) + 0x31, 0x03, 0x00, 0x00, // Offset 817 (0x331) + 0x49, 0x03, 0x00, 0x00, // Offset 841 (0x349) + 0x75, 0x03, 0x00, 0x00, // Offset 885 (0x375) + 0x98, 0x03, 0x00, 0x00, // Offset 920 (0x398) + 0xae, 0x03, 0x00, 0x00, // Offset 942 (0x3ae) + 0xcd, 0x03, 0x00, 0x00, // Offset 973 (0x3cd) + 0xe5, 0x03, 0x00, 0x00, // Offset 997 (0x3e5) + 0xf8, 0x03, 0x00, 0x00, // Offset 1016 (0x3f8) + 0x17, 0x04, 0x00, 0x00, // Offset 1047 (0x417) + 0x2c, 0x04, 0x00, 0x00, // Offset 1068 (0x42c) + 0x3d, 0x04, 0x00, 0x00, // Offset 1085 (0x43d) + 0x4e, 0x04, 0x00, 0x00, // Offset 1102 (0x44e) + 0x65, 0x04, 0x00, 0x00, // Offset 1125 (0x465) + 0x7e, 0x04, 0x00, 0x00, // Offset 1150 (0x47e) + 0x96, 0x04, 0x00, 0x00, // Offset 1174 (0x496) + 0xbe, 0x04, 0x00, 0x00, // Offset 1214 (0x4be) + 0xd6, 0x04, 0x00, 0x00, // Offset 1238 (0x4d6) + 0xfc, 0x04, 0x00, 0x00, // Offset 1276 (0x4fc) + 0x14, 0x05, 0x00, 0x00, // Offset 1300 (0x514) + 0x3f, 0x05, 0x00, 0x00, // Offset 1343 (0x53f) + 0x57, 0x05, 0x00, 0x00, // Offset 1367 (0x557) + 0x82, 0x05, 0x00, 0x00, // Offset 1410 (0x582) + 0x98, 0x05, 0x00, 0x00, // Offset 1432 (0x598) + 0xc3, 0x05, 0x00, 0x00, // Offset 1475 (0x5c3) + 0xf3, 0x05, 0x00, 0x00, // Offset 1523 (0x5f3) + 0x1e, 0x06, 0x00, 0x00, // Offset 1566 (0x61e) + 0x33, 0x06, 0x00, 0x00, // Offset 1587 (0x633) + 0x4d, 0x06, 0x00, 0x00, // Offset 1613 (0x64d) + 0x72, 0x06, 0x00, 0x00, // Offset 1650 (0x672) + 0xa7, 0x06, 0x00, 0x00, // Offset 1703 (0x6a7) + 0xd1, 0x06, 0x00, 0x00, // Offset 1745 (0x6d1) + 0xec, 0x06, 0x00, 0x00, // Offset 1772 (0x6ec) + 0xf5, 0x06, 0x00, 0x00, // Offset 1781 (0x6f5) + 0x0f, 0x07, 0x00, 0x00, // Offset 1807 (0x70f) + 0x25, 0x07, 0x00, 0x00, // Offset 1829 (0x725) + 0x2c, 0x07, 0x00, 0x00, // Offset 1836 (0x72c) + 0x48, 0x07, 0x00, 0x00, // Offset 1864 (0x748) + 0x64, 0x07, 0x00, 0x00, // Offset 1892 (0x764) + 0x80, 0x07, 0x00, 0x00, // Offset 1920 (0x780) + 0x9f, 0x07, 0x00, 0x00, // Offset 1951 (0x79f) + 0xc6, 0x07, 0x00, 0x00, // Offset 1990 (0x7c6) + 0xde, 0x07, 0x00, 0x00, // Offset 2014 (0x7de) + 0x0a, 0x08, 0x00, 0x00, // Offset 2058 (0x80a) + 0x2b, 0x08, 0x00, 0x00, // Offset 2091 (0x82b) + 0x49, 0x08, 0x00, 0x00, // Offset 2121 (0x849) + 0x73, 0x08, 0x00, 0x00, // Offset 2163 (0x873) + 0x97, 0x08, 0x00, 0x00, // Offset 2199 (0x897) + 0xbc, 0x08, 0x00, 0x00, // Offset 2236 (0x8bc) + 0xdd, 0x08, 0x00, 0x00, // Offset 2269 (0x8dd) + 0x00, 0x09, 0x00, 0x00, // Offset 2304 (0x900) + 0x20, 0x09, 0x00, 0x00, // Offset 2336 (0x920) + 0x4f, 0x09, 0x00, 0x00, // Offset 2383 (0x94f) + 0x77, 0x09, 0x00, 0x00, // Offset 2423 (0x977) + 0x9a, 0x09, 0x00, 0x00, // Offset 2458 (0x99a) + 0xbb, 0x09, 0x00, 0x00, // Offset 2491 (0x9bb) + 0xdc, 0x09, 0x00, 0x00, // Offset 2524 (0x9dc) + 0x0d, 0x0a, 0x00, 0x00, // Offset 2573 (0xa0d) + 0x2b, 0x0a, 0x00, 0x00, // Offset 2603 (0xa2b) + 0x48, 0x0a, 0x00, 0x00, // Offset 2632 (0xa48) + 0x66, 0x0a, 0x00, 0x00, // Offset 2662 (0xa66) + 0x8b, 0x0a, 0x00, 0x00, // Offset 2699 (0xa8b) + 0xac, 0x0a, 0x00, 0x00, // Offset 2732 (0xaac) + 0xc4, 0x0a, 0x00, 0x00, // Offset 2756 (0xac4) + 0xed, 0x0a, 0x00, 0x00, // Offset 2797 (0xaed) + 0x07, 0x0b, 0x00, 0x00, // Offset 2823 (0xb07) + 0x2c, 0x0b, 0x00, 0x00, // Offset 2860 (0xb2c) + 0x51, 0x0b, 0x00, 0x00, // Offset 2897 (0xb51) + 0x75, 0x0b, 0x00, 0x00, // Offset 2933 (0xb75) + 0x96, 0x0b, 0x00, 0x00, // Offset 2966 (0xb96) + 0xae, 0x0b, 0x00, 0x00, // Offset 2990 (0xbae) + 0xde, 0x0b, 0x00, 0x00, // Offset 3038 (0xbde) + 0x12, 0x0c, 0x00, 0x00, // Offset 3090 (0xc12) + 0x44, 0x0c, 0x00, 0x00, // Offset 3140 (0xc44) + 0x6f, 0x0c, 0x00, 0x00, // Offset 3183 (0xc6f) + 0xab, 0x0c, 0x00, 0x00, // Offset 3243 (0xcab) + 0xdc, 0x0c, 0x00, 0x00, // Offset 3292 (0xcdc) + 0xe5, 0x0c, 0x00, 0x00, // Offset 3301 (0xce5) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 16, 13, 0, 11, 59, 193, 193, 193, 193, 193, 193, 193, + 193, 0, 13, 32, 25, 15, 0, 11, 38, 22, 113, 97, + 113, 97, 113, 97, 113, 97, 113, 97, 113, 97, 113, 97, + 113, 97, 0, 17, 16, 29, 17, 0, 11, 97, 118, 66, + 161, 65, 177, 65, 177, 50, 177, 50, 177, 34, 17, 161, + 33, 49, 145, 17, 81, 130, 98, 0, 19, 48, 17, 15, + 0, 9, 49, 242, 225, 225, 225, 225, 225, 225, 225, 235, + 0, 17, 16, 29, 16, 0, 14, 2, 57, 49, 114, 97, + 113, 113, 113, 113, 99, 97, 97, 33, 81, 81, 50, 65, + 50, 82, 52, 17, 97, 0, 16, 32, 30, 17, 0, 13, + 101, 66, 240, 17, 58, 49, 240, 17, 115, 97, 82, 50, + 65, 81, 81, 65, 81, 81, 65, 37, 50, 67, 68, 0, + 17, 80, 14, 14, 0, 12, 44, 49, 209, 209, 209, 209, + 209, 219, 0, 16, 23, 16, 0, 12, 2, 72, 56, 145, + 81, 145, 81, 145, 81, 145, 81, 145, 81, 145, 81, 156, + 0, 18, 32, 15, 14, 0, 10, 75, 209, 209, 209, 60, + 49, 209, 209, 219, 0, 16, 27, 15, 0, 11, 45, 129, + 81, 129, 81, 129, 81, 39, 81, 49, 161, 49, 161, 49, + 161, 49, 20, 81, 50, 145, 0, 15, 32, 32, 15, 0, + 11, 45, 113, 33, 49, 113, 33, 49, 113, 33, 49, 39, + 17, 49, 49, 97, 49, 49, 97, 49, 49, 97, 49, 53, + 37, 161, 0, 15, 96, 37, 15, 0, 10, 98, 38, 18, + 49, 113, 33, 49, 113, 33, 49, 113, 33, 49, 53, 37, + 49, 97, 49, 49, 97, 49, 49, 97, 49, 49, 19, 37, + 50, 81, 49, 0, 15, 32, 31, 17, 0, 11, 97, 119, + 50, 162, 50, 161, 65, 177, 65, 103, 34, 113, 113, 17, + 97, 97, 49, 81, 81, 81, 65, 20, 98, 50, 0, 18, + 96, 24, 16, 0, 12, 13, 129, 33, 193, 33, 193, 33, + 119, 21, 65, 97, 129, 97, 129, 97, 133, 38, 0, 18, + 32, 29, 17, 0, 12, 110, 129, 240, 17, 34, 33, 145, + 49, 33, 71, 33, 33, 81, 113, 33, 81, 113, 33, 81, + 113, 33, 94, 0, 19, 48, 31, 17, 0, 12, 103, 36, + 145, 240, 17, 24, 113, 182, 52, 81, 98, 34, 65, 97, + 65, 65, 97, 65, 65, 35, 18, 34, 67, 84, 0, 17, + 64, 24, 14, 0, 10, 76, 49, 129, 65, 129, 65, 129, + 65, 129, 65, 129, 65, 129, 65, 129, 75, 49, 0, 15, + 64, 24, 13, 0, 10, 99, 34, 129, 49, 129, 49, 129, + 58, 49, 129, 49, 129, 49, 129, 58, 49, 129, 0, 13, + 32, 44, 15, 0, 10, 18, 50, 34, 34, 33, 49, 49, + 49, 33, 49, 49, 49, 33, 49, 49, 49, 37, 53, 33, + 49, 49, 49, 33, 49, 49, 49, 33, 49, 49, 49, 33, + 49, 53, 37, 49, 49, 33, 0, 15, 96, 35, 17, 0, + 13, 34, 50, 98, 65, 65, 97, 65, 50, 97, 65, 49, + 118, 49, 113, 65, 35, 97, 65, 18, 33, 81, 65, 17, + 65, 71, 82, 49, 65, 0, 18, 32, 22, 16, 0, 12, + 98, 241, 226, 225, 226, 210, 18, 162, 65, 130, 98, 81, + 147, 33, 177, 0, 16, 48, 31, 18, 0, 14, 1, 82, + 178, 66, 162, 66, 161, 81, 162, 66, 163, 51, 129, 49, + 17, 49, 97, 82, 65, 65, 97, 97, 33, 97, 0, 19, + 32, 24, 12, 0, 9, 66, 148, 98, 66, 50, 98, 33, + 129, 33, 129, 33, 129, 34, 98, 50, 66, 100, 0, 12, + 80, 19, 16, 0, 14, 26, 226, 210, 210, 210, 212, 177, + 66, 114, 99, 50, 162, 0, 16, 32, 31, 17, 0, 15, + 12, 161, 66, 146, 65, 161, 66, 145, 81, 145, 17, 49, + 17, 113, 49, 17, 49, 81, 81, 82, 33, 81, 113, 113, + 0, 16, 32, 21, 15, 0, 9, 102, 240, 240, 122, 209, + 209, 194, 195, 177, 50, 114, 99, 34, 161, 0, 15, 32, + 17, 13, 0, 9, 107, 193, 193, 193, 193, 58, 193, 193, + 193, 193, 0, 13, 32, 17, 14, 0, 10, 76, 49, 209, + 209, 218, 65, 209, 209, 209, 219, 0, 14, 32, 23, 15, + 0, 13, 28, 240, 67, 66, 129, 66, 129, 66, 129, 66, + 129, 65, 145, 65, 49, 45, 0, 15, 32, 25, 16, 0, + 10, 70, 240, 240, 81, 45, 240, 148, 177, 65, 145, 97, + 129, 97, 129, 97, 145, 65, 180, 0, 14, 112, 24, 8, + 240, 18, 113, 113, 113, 113, 113, 113, 113, 117, 49, 113, + 113, 113, 113, 113, 113, 113, 113, 240, 240, 128, 40, 8, + 240, 67, 34, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 53, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 113, + 240, 176, 24, 9, 145, 146, 129, 129, 129, 129, 133, 65, + 129, 129, 129, 133, 65, 129, 129, 129, 129, 129, 129, 240, + 240, 192, 38, 9, 240, 115, 34, 65, 49, 65, 49, 65, + 49, 65, 49, 65, 54, 49, 65, 49, 65, 49, 65, 54, + 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, + 129, 240, 240, 128, 24, 9, 210, 145, 129, 129, 129, 129, + 129, 129, 39, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 240, 240, 128, 43, 11, 240, 34, 83, 49, 97, 49, + 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, 37, 49, + 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, + 97, 49, 97, 49, 97, 49, 97, 49, 0, 5, 96, 24, + 9, 210, 145, 129, 129, 129, 129, 39, 129, 129, 129, 129, + 39, 129, 129, 129, 129, 129, 129, 129, 240, 240, 128, 43, + 11, 240, 34, 83, 49, 97, 49, 97, 49, 97, 49, 97, + 49, 37, 49, 97, 49, 97, 49, 97, 49, 97, 49, 37, + 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, + 49, 97, 49, 0, 5, 96, 22, 19, 0, 19, 98, 240, + 65, 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, 175, + 2, 0, 19, 32, 43, 20, 0, 6, 66, 240, 65, 240, + 65, 240, 65, 240, 65, 240, 65, 240, 65, 178, 97, 193, + 101, 129, 97, 193, 97, 193, 82, 98, 55, 17, 116, 129, + 240, 65, 240, 65, 240, 65, 240, 65, 0, 10, 96, 48, + 18, 240, 241, 225, 51, 194, 49, 209, 49, 209, 49, 209, + 49, 209, 49, 209, 49, 98, 81, 49, 113, 85, 113, 81, + 49, 113, 81, 49, 113, 66, 49, 42, 17, 49, 209, 49, + 209, 49, 209, 49, 209, 49, 209, 49, 0, 9, 32, 43, + 17, 240, 209, 240, 35, 240, 17, 240, 17, 240, 17, 240, + 17, 240, 17, 240, 17, 114, 113, 129, 113, 129, 113, 129, + 113, 129, 68, 43, 49, 240, 17, 240, 17, 240, 17, 240, + 17, 240, 17, 0, 8, 96, 21, 19, 0, 21, 114, 66, + 193, 81, 193, 81, 193, 81, 193, 81, 193, 81, 127, 2, + 0, 19, 32, 26, 20, 0, 25, 15, 3, 177, 240, 65, + 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, + 240, 65, 0, 11, 32, 37, 16, 240, 193, 240, 18, 241, + 241, 241, 241, 241, 241, 241, 163, 33, 40, 81, 113, 113, + 113, 113, 113, 38, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 241, 0, 6, 32, 53, 18, 0, 6, 4, 194, + 49, 209, 49, 209, 49, 209, 49, 209, 49, 209, 49, 209, + 49, 177, 17, 49, 41, 33, 49, 113, 81, 49, 113, 81, + 49, 113, 21, 49, 113, 81, 49, 113, 81, 49, 113, 81, + 49, 113, 81, 49, 113, 81, 49, 240, 33, 0, 7, 42, + 17, 240, 211, 240, 33, 240, 17, 240, 17, 240, 17, 240, + 17, 240, 17, 240, 17, 240, 17, 182, 41, 81, 129, 113, + 129, 113, 129, 113, 129, 113, 129, 113, 129, 113, 129, 113, + 240, 17, 0, 8, 96, 27, 19, 0, 23, 111, 2, 113, + 81, 193, 81, 193, 81, 193, 81, 193, 81, 193, 81, 193, + 81, 193, 81, 193, 81, 0, 10, 48, 9, 19, 0, 35, + 95, 2, 0, 19, 32, 26, 16, 240, 240, 226, 241, 241, + 241, 241, 241, 241, 241, 241, 241, 241, 181, 41, 65, 241, + 241, 241, 241, 241, 0, 8, 32, 22, 5, 163, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 240, 112, 7, 3, 240, 241, 240, 240, 176, + 28, 15, 0, 12, 1, 130, 82, 113, 97, 113, 97, 113, + 97, 113, 97, 113, 97, 113, 97, 113, 35, 17, 34, 51, + 67, 0, 15, 64, 28, 17, 0, 12, 98, 88, 65, 97, + 145, 97, 145, 97, 145, 97, 145, 97, 145, 97, 145, 97, + 145, 50, 17, 148, 54, 0, 17, 32, 28, 17, 0, 13, + 114, 98, 129, 113, 129, 113, 114, 113, 114, 113, 99, 113, + 97, 33, 97, 81, 65, 81, 35, 98, 51, 0, 18, 80, + 31, 16, 0, 14, 2, 129, 97, 114, 97, 113, 17, 81, + 98, 17, 81, 97, 49, 65, 97, 49, 65, 81, 81, 49, + 36, 81, 51, 55, 0, 16, 32, 39, 20, 0, 14, 17, + 107, 50, 145, 65, 49, 161, 65, 49, 161, 65, 34, 86, + 65, 34, 97, 129, 33, 17, 81, 129, 17, 49, 65, 130, + 65, 65, 19, 66, 81, 50, 113, 0, 21, 16, 24, 16, + 0, 12, 13, 129, 33, 193, 33, 193, 33, 119, 17, 129, + 97, 129, 97, 129, 97, 133, 38, 0, 18, 32, 44, 20, + 0, 13, 97, 152, 49, 34, 130, 17, 49, 34, 130, 17, + 49, 34, 130, 17, 49, 33, 100, 37, 18, 97, 81, 49, + 17, 17, 81, 81, 49, 17, 33, 65, 66, 50, 65, 53, + 21, 81, 145, 49, 0, 21, 33, 17, 0, 12, 103, 49, + 177, 65, 177, 51, 161, 49, 17, 87, 18, 33, 81, 97, + 49, 81, 97, 65, 65, 81, 81, 65, 21, 81, 67, 56, + 0, 17, 32, 30, 16, 0, 12, 6, 113, 113, 23, 113, + 241, 181, 52, 65, 98, 34, 49, 97, 65, 49, 97, 65, + 49, 19, 34, 34, 50, 100, 0, 16, 48, 42, 15, 0, + 10, 97, 54, 18, 49, 49, 49, 33, 49, 49, 49, 33, + 49, 49, 49, 33, 49, 49, 49, 37, 49, 49, 33, 49, + 49, 49, 33, 49, 49, 49, 33, 49, 54, 21, 49, 97, + 0, 15, 96, 36, 17, 0, 12, 103, 66, 81, 65, 65, + 97, 65, 50, 97, 65, 49, 113, 65, 50, 97, 65, 33, + 33, 81, 65, 33, 49, 65, 65, 17, 66, 55, 97, 49, + 0, 18, 112, 37, 16, 0, 12, 6, 50, 97, 49, 50, + 97, 49, 50, 97, 49, 34, 17, 81, 49, 33, 33, 81, + 49, 33, 49, 65, 49, 17, 65, 65, 49, 17, 81, 61, + 49, 0, 17, 96, 33, 11, 240, 240, 57, 49, 97, 49, + 97, 49, 97, 49, 97, 49, 97, 56, 49, 240, 147, 113, + 49, 81, 81, 65, 81, 65, 81, 81, 49, 115, 0, 7, + 48, 35, 15, 0, 11, 34, 50, 21, 49, 65, 81, 49, + 65, 81, 49, 65, 81, 54, 81, 49, 65, 81, 49, 65, + 81, 49, 65, 81, 54, 81, 49, 65, 81, 0, 15, 32, + 32, 15, 0, 11, 34, 56, 49, 65, 17, 113, 65, 17, + 113, 65, 17, 118, 17, 113, 65, 17, 113, 65, 17, 113, + 65, 17, 118, 21, 49, 0, 16, 80, 47, 18, 0, 11, + 97, 49, 146, 49, 55, 49, 49, 50, 65, 49, 49, 49, + 81, 49, 49, 34, 81, 53, 34, 81, 49, 49, 18, 17, + 65, 49, 49, 18, 18, 49, 49, 51, 50, 33, 54, 81, + 33, 49, 49, 145, 0, 18, 32, 40, 18, 0, 13, 66, + 34, 49, 21, 49, 49, 49, 33, 97, 49, 34, 33, 97, + 49, 33, 49, 101, 33, 49, 97, 49, 19, 33, 97, 49, + 17, 33, 17, 97, 50, 51, 102, 69, 49, 0, 20, 35, + 18, 0, 14, 2, 194, 65, 23, 65, 65, 66, 97, 65, + 65, 118, 50, 113, 65, 50, 113, 65, 49, 17, 97, 65, + 33, 49, 86, 17, 82, 49, 66, 0, 19, 32, 33, 16, + 0, 12, 2, 50, 21, 65, 65, 17, 129, 65, 17, 129, + 65, 17, 134, 21, 65, 65, 17, 129, 65, 17, 129, 65, + 17, 134, 22, 49, 0, 17, 96, 33, 11, 240, 240, 162, + 34, 97, 49, 97, 56, 49, 97, 49, 97, 56, 49, 97, + 240, 20, 97, 65, 65, 97, 49, 97, 49, 97, 65, 65, + 100, 0, 7, 48, 49, 15, 240, 240, 163, 33, 50, 18, + 49, 49, 49, 33, 49, 49, 49, 33, 49, 53, 37, 49, + 49, 33, 49, 49, 49, 33, 49, 49, 49, 33, 49, 53, + 37, 240, 116, 161, 65, 129, 97, 113, 97, 113, 97, 129, + 65, 164, 0, 10, 16, 30, 15, 0, 9, 97, 241, 38, + 97, 113, 82, 113, 81, 129, 82, 113, 65, 33, 97, 50, + 49, 81, 49, 66, 65, 33, 97, 65, 0, 17, 16, 29, + 17, 0, 13, 33, 50, 177, 65, 162, 65, 161, 81, 162, + 65, 145, 33, 49, 129, 65, 33, 129, 66, 17, 113, 97, + 22, 0, 19, 48, 30, 16, 0, 10, 33, 240, 18, 38, + 98, 49, 161, 65, 161, 65, 146, 65, 145, 17, 49, 129, + 49, 33, 113, 81, 17, 209, 22, 0, 18, 32, 37, 16, + 0, 12, 49, 50, 50, 97, 49, 65, 82, 49, 65, 81, + 65, 65, 81, 70, 67, 49, 65, 65, 33, 33, 65, 49, + 50, 17, 65, 33, 81, 22, 161, 65, 0, 16, 32, 33, + 18, 0, 13, 113, 240, 49, 40, 113, 97, 146, 97, 145, + 98, 146, 82, 129, 33, 65, 17, 98, 49, 33, 34, 81, + 67, 66, 49, 98, 82, 145, 0, 17, 24, 11, 0, 8, + 82, 146, 145, 17, 114, 17, 113, 49, 82, 49, 81, 81, + 49, 113, 33, 113, 41, 0, 11, 32, 41, 18, 0, 11, + 66, 113, 145, 114, 98, 18, 50, 34, 49, 81, 18, 65, + 49, 81, 17, 97, 33, 81, 17, 97, 33, 81, 17, 97, + 33, 81, 17, 97, 49, 49, 49, 65, 83, 84, 0, 20, + 96, 26, 11, 0, 5, 113, 177, 161, 133, 82, 50, 50, + 82, 33, 113, 33, 113, 33, 113, 34, 82, 50, 50, 85, + 0, 11, 64, 37, 17, 0, 13, 2, 82, 145, 98, 115, + 82, 97, 49, 65, 97, 81, 49, 97, 81, 33, 17, 81, + 81, 33, 33, 65, 81, 17, 50, 65, 49, 17, 82, 67, + 17, 0, 18, 32, 37, 17, 0, 13, 2, 81, 161, 98, + 115, 82, 97, 49, 49, 17, 81, 81, 33, 33, 65, 81, + 18, 33, 65, 81, 17, 65, 49, 81, 17, 65, 65, 49, + 24, 67, 0, 18, 64, 36, 14, 240, 240, 129, 59, 82, + 65, 114, 65, 129, 65, 129, 65, 129, 65, 129, 65, 33, + 44, 240, 84, 145, 65, 113, 97, 97, 97, 97, 97, 113, + 65, 148, 0, 9, 64, 33, 19, 0, 14, 67, 84, 240, + 159, 2, 240, 132, 83, 98, 34, 34, 50, 65, 65, 33, + 81, 65, 65, 33, 81, 66, 34, 34, 50, 84, 83, 0, + 19, 80, 24, 15, 0, 11, 45, 240, 240, 116, 161, 65, + 129, 97, 113, 97, 113, 97, 113, 97, 129, 65, 164, 0, + 13, 112, 48, 20, 0, 6, 66, 240, 65, 240, 65, 240, + 65, 240, 65, 240, 69, 161, 65, 161, 65, 49, 161, 65, + 49, 161, 65, 49, 161, 65, 53, 97, 65, 34, 97, 56, + 17, 115, 145, 240, 65, 240, 65, 240, 65, 240, 65, 0, + 10, 96, 52, 17, 240, 240, 209, 50, 194, 33, 209, 33, + 209, 33, 209, 33, 212, 129, 65, 33, 66, 49, 49, 33, + 81, 49, 49, 33, 81, 49, 49, 33, 81, 49, 52, 81, + 49, 49, 33, 44, 33, 209, 33, 209, 33, 209, 33, 209, + 33, 209, 33, 0, 8, 96, 50, 17, 240, 209, 240, 35, + 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 81, 51, + 65, 97, 65, 65, 97, 65, 65, 97, 65, 65, 97, 65, + 65, 97, 65, 20, 41, 17, 49, 240, 17, 240, 17, 240, + 17, 240, 17, 240, 17, 0, 8, 96, 43, 16, 240, 240, + 226, 241, 241, 241, 241, 241, 241, 241, 194, 17, 42, 49, + 81, 49, 81, 81, 49, 21, 81, 49, 81, 81, 49, 81, + 81, 49, 21, 81, 49, 81, 81, 49, 81, 81, 49, 81, + 0, 8, 32, 60, 18, 0, 6, 19, 210, 33, 225, 33, + 225, 33, 225, 33, 225, 33, 225, 33, 225, 33, 178, 17, + 33, 41, 49, 33, 81, 33, 81, 33, 81, 33, 21, 33, + 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, 21, 33, + 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, + 0, 9, 32, 49, 17, 240, 226, 240, 33, 240, 17, 240, + 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 182, + 42, 65, 97, 65, 65, 97, 65, 65, 97, 65, 65, 97, + 65, 65, 97, 65, 65, 97, 65, 65, 97, 65, 65, 240, + 17, 0, 8, 96, 9, 5, 0, 6, 35, 35, 0, 7, + 96, 26, 9, 240, 99, 145, 129, 129, 129, 129, 129, 129, + 35, 49, 35, 49, 129, 129, 129, 129, 129, 129, 129, 129, + 240, 240, 128, + 0, // Padding + +}; + +tFont *g_psFontWHangulmyeongjo20pt = (tFont *)g_pui8Hangulmyeongjo20pt; diff --git a/third_party/fonts/ofl/fonts/fonthangulmyeongjo20ptb.c b/third_party/fonts/ofl/fonts/fonthangulmyeongjo20ptb.c new file mode 100644 index 0000000..0788657 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulmyeongjo20ptb.c @@ -0,0 +1,838 @@ +//***************************************************************************** +// +// fonthangulmyeongjo20ptb.c - Font definition for the 20ptpt Hangulmyeongjo bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulmyeongjo +// Size: 20pt +// Bold: yes +// Italic: no +// Memory usage: 6217 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulmyeongjo20ptb[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 19, + + // + // The height of the font. + // + 24, + + // + // The baseline of the font. + // + 18, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x88, 0x0b, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x93, 0x01, 0x00, 0x00, // Offset 403 (0x193) + 0xa2, 0x01, 0x00, 0x00, // Offset 418 (0x1a2) + 0xc5, 0x01, 0x00, 0x00, // Offset 453 (0x1c5) + 0xee, 0x01, 0x00, 0x00, // Offset 494 (0x1ee) + 0x1f, 0x02, 0x00, 0x00, // Offset 543 (0x21f) + 0x49, 0x02, 0x00, 0x00, // Offset 585 (0x249) + 0x53, 0x02, 0x00, 0x00, // Offset 595 (0x253) + 0x6b, 0x02, 0x00, 0x00, // Offset 619 (0x26b) + 0x83, 0x02, 0x00, 0x00, // Offset 643 (0x283) + 0x94, 0x02, 0x00, 0x00, // Offset 660 (0x294) + 0xa5, 0x02, 0x00, 0x00, // Offset 677 (0x2a5) + 0xb0, 0x02, 0x00, 0x00, // Offset 688 (0x2b0) + 0xb8, 0x02, 0x00, 0x00, // Offset 696 (0x2b8) + 0xc1, 0x02, 0x00, 0x00, // Offset 705 (0x2c1) + 0xd8, 0x02, 0x00, 0x00, // Offset 728 (0x2d8) + 0xfb, 0x02, 0x00, 0x00, // Offset 763 (0x2fb) + 0x10, 0x03, 0x00, 0x00, // Offset 784 (0x310) + 0x2a, 0x03, 0x00, 0x00, // Offset 810 (0x32a) + 0x44, 0x03, 0x00, 0x00, // Offset 836 (0x344) + 0x60, 0x03, 0x00, 0x00, // Offset 864 (0x360) + 0x77, 0x03, 0x00, 0x00, // Offset 887 (0x377) + 0x96, 0x03, 0x00, 0x00, // Offset 918 (0x396) + 0xad, 0x03, 0x00, 0x00, // Offset 941 (0x3ad) + 0xcf, 0x03, 0x00, 0x00, // Offset 975 (0x3cf) + 0xed, 0x03, 0x00, 0x00, // Offset 1005 (0x3ed) + 0xfa, 0x03, 0x00, 0x00, // Offset 1018 (0x3fa) + 0x09, 0x04, 0x00, 0x00, // Offset 1033 (0x409) + 0x22, 0x04, 0x00, 0x00, // Offset 1058 (0x422) + 0x2d, 0x04, 0x00, 0x00, // Offset 1069 (0x42d) + 0x45, 0x04, 0x00, 0x00, // Offset 1093 (0x445) + 0x61, 0x04, 0x00, 0x00, // Offset 1121 (0x461) + 0x97, 0x04, 0x00, 0x00, // Offset 1175 (0x497) + 0xb8, 0x04, 0x00, 0x00, // Offset 1208 (0x4b8) + 0xda, 0x04, 0x00, 0x00, // Offset 1242 (0x4da) + 0xf6, 0x04, 0x00, 0x00, // Offset 1270 (0x4f6) + 0x19, 0x05, 0x00, 0x00, // Offset 1305 (0x519) + 0x37, 0x05, 0x00, 0x00, // Offset 1335 (0x537) + 0x53, 0x05, 0x00, 0x00, // Offset 1363 (0x553) + 0x72, 0x05, 0x00, 0x00, // Offset 1394 (0x572) + 0x96, 0x05, 0x00, 0x00, // Offset 1430 (0x596) + 0xab, 0x05, 0x00, 0x00, // Offset 1451 (0x5ab) + 0xc7, 0x05, 0x00, 0x00, // Offset 1479 (0x5c7) + 0xeb, 0x05, 0x00, 0x00, // Offset 1515 (0x5eb) + 0x04, 0x06, 0x00, 0x00, // Offset 1540 (0x604) + 0x3b, 0x06, 0x00, 0x00, // Offset 1595 (0x63b) + 0x67, 0x06, 0x00, 0x00, // Offset 1639 (0x667) + 0x8a, 0x06, 0x00, 0x00, // Offset 1674 (0x68a) + 0xa7, 0x06, 0x00, 0x00, // Offset 1703 (0x6a7) + 0xce, 0x06, 0x00, 0x00, // Offset 1742 (0x6ce) + 0xf1, 0x06, 0x00, 0x00, // Offset 1777 (0x6f1) + 0x0b, 0x07, 0x00, 0x00, // Offset 1803 (0x70b) + 0x24, 0x07, 0x00, 0x00, // Offset 1828 (0x724) + 0x48, 0x07, 0x00, 0x00, // Offset 1864 (0x748) + 0x69, 0x07, 0x00, 0x00, // Offset 1897 (0x769) + 0xa0, 0x07, 0x00, 0x00, // Offset 1952 (0x7a0) + 0xc1, 0x07, 0x00, 0x00, // Offset 1985 (0x7c1) + 0xdd, 0x07, 0x00, 0x00, // Offset 2013 (0x7dd) + 0xf8, 0x07, 0x00, 0x00, // Offset 2040 (0x7f8) + 0x0e, 0x08, 0x00, 0x00, // Offset 2062 (0x80e) + 0x41, 0x08, 0x00, 0x00, // Offset 2113 (0x841) + 0x57, 0x08, 0x00, 0x00, // Offset 2135 (0x857) + 0x64, 0x08, 0x00, 0x00, // Offset 2148 (0x864) + 0x6c, 0x08, 0x00, 0x00, // Offset 2156 (0x86c) + 0x76, 0x08, 0x00, 0x00, // Offset 2166 (0x876) + 0x8f, 0x08, 0x00, 0x00, // Offset 2191 (0x88f) + 0xaf, 0x08, 0x00, 0x00, // Offset 2223 (0x8af) + 0xc3, 0x08, 0x00, 0x00, // Offset 2243 (0x8c3) + 0xe3, 0x08, 0x00, 0x00, // Offset 2275 (0x8e3) + 0xf7, 0x08, 0x00, 0x00, // Offset 2295 (0x8f7) + 0x0d, 0x09, 0x00, 0x00, // Offset 2317 (0x90d) + 0x2b, 0x09, 0x00, 0x00, // Offset 2347 (0x92b) + 0x4b, 0x09, 0x00, 0x00, // Offset 2379 (0x94b) + 0x5e, 0x09, 0x00, 0x00, // Offset 2398 (0x95e) + 0x73, 0x09, 0x00, 0x00, // Offset 2419 (0x973) + 0x92, 0x09, 0x00, 0x00, // Offset 2450 (0x992) + 0xa7, 0x09, 0x00, 0x00, // Offset 2471 (0x9a7) + 0xcc, 0x09, 0x00, 0x00, // Offset 2508 (0x9cc) + 0xe7, 0x09, 0x00, 0x00, // Offset 2535 (0x9e7) + 0x00, 0x0a, 0x00, 0x00, // Offset 2560 (0xa00) + 0x1e, 0x0a, 0x00, 0x00, // Offset 2590 (0xa1e) + 0x3b, 0x0a, 0x00, 0x00, // Offset 2619 (0xa3b) + 0x4d, 0x0a, 0x00, 0x00, // Offset 2637 (0xa4d) + 0x61, 0x0a, 0x00, 0x00, // Offset 2657 (0xa61) + 0x75, 0x0a, 0x00, 0x00, // Offset 2677 (0xa75) + 0x90, 0x0a, 0x00, 0x00, // Offset 2704 (0xa90) + 0xa8, 0x0a, 0x00, 0x00, // Offset 2728 (0xaa8) + 0xcb, 0x0a, 0x00, 0x00, // Offset 2763 (0xacb) + 0xe2, 0x0a, 0x00, 0x00, // Offset 2786 (0xae2) + 0xfd, 0x0a, 0x00, 0x00, // Offset 2813 (0xafd) + 0x12, 0x0b, 0x00, 0x00, // Offset 2834 (0xb12) + 0x2a, 0x0b, 0x00, 0x00, // Offset 2858 (0xb2a) + 0x3f, 0x0b, 0x00, 0x00, // Offset 2879 (0xb3f) + 0x57, 0x0b, 0x00, 0x00, // Offset 2903 (0xb57) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 4, 9, 0, 27, 19, 4, 194, 34, 34, 34, 34, 49, + 49, 49, 49, 49, 49, 49, 98, 34, 34, 240, 112, 15, + 6, 98, 17, 34, 17, 34, 17, 34, 17, 33, 33, 0, + 13, 96, 35, 14, 0, 5, 114, 33, 145, 34, 130, 34, + 130, 34, 91, 97, 49, 145, 34, 130, 34, 130, 34, 91, + 97, 49, 145, 34, 130, 34, 130, 34, 130, 33, 0, 11, + 48, 41, 12, 240, 194, 149, 97, 18, 34, 50, 18, 49, + 50, 18, 49, 50, 18, 132, 132, 164, 130, 19, 98, 35, + 82, 50, 33, 34, 50, 33, 34, 50, 34, 18, 34, 70, + 130, 162, 162, 240, 240, 208, 49, 18, 0, 7, 19, 81, + 114, 39, 113, 65, 49, 114, 65, 34, 113, 81, 18, 129, + 65, 33, 145, 50, 18, 149, 33, 52, 146, 33, 50, 129, + 33, 66, 114, 33, 66, 98, 34, 66, 97, 50, 50, 98, + 65, 34, 113, 99, 0, 14, 16, 42, 18, 0, 7, 52, + 210, 34, 178, 50, 178, 50, 178, 34, 194, 18, 37, 114, + 82, 114, 17, 81, 114, 34, 65, 98, 65, 49, 114, 66, + 18, 114, 83, 130, 83, 81, 50, 53, 49, 84, 68, 0, + 14, 10, 4, 66, 34, 34, 33, 49, 0, 9, 48, 24, + 8, 209, 82, 82, 98, 82, 98, 82, 98, 98, 98, 98, + 98, 98, 114, 98, 114, 113, 114, 129, 240, 240, 64, 24, + 8, 129, 130, 114, 98, 114, 98, 114, 98, 98, 98, 98, + 98, 98, 82, 98, 82, 97, 98, 81, 240, 240, 144, 17, + 10, 210, 97, 18, 17, 56, 54, 70, 56, 49, 18, 17, + 98, 0, 19, 48, 17, 12, 0, 8, 2, 162, 162, 162, + 106, 98, 162, 162, 162, 162, 0, 14, 32, 11, 5, 0, + 10, 18, 35, 50, 65, 49, 240, 48, 8, 12, 0, 15, + 10, 0, 19, 96, 9, 4, 0, 8, 2, 34, 34, 240, + 112, 23, 9, 240, 145, 114, 113, 114, 114, 113, 114, 114, + 113, 114, 113, 114, 114, 113, 114, 113, 129, 0, 6, 80, + 35, 11, 240, 240, 99, 113, 49, 82, 50, 65, 81, 50, + 82, 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, 34, + 82, 49, 81, 66, 50, 81, 49, 115, 0, 8, 112, 21, + 9, 240, 113, 99, 69, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 86, 0, 7, 26, 11, 240, 240, + 100, 82, 50, 65, 82, 33, 98, 146, 146, 130, 146, 130, + 130, 131, 130, 130, 130, 81, 41, 0, 8, 64, 26, 11, + 240, 240, 84, 97, 51, 49, 82, 146, 146, 130, 115, 113, + 20, 147, 146, 146, 146, 130, 51, 35, 69, 0, 8, 112, + 28, 12, 240, 240, 194, 162, 147, 132, 129, 18, 114, 18, + 98, 34, 97, 50, 82, 50, 66, 66, 74, 130, 162, 162, + 162, 0, 9, 64, 23, 10, 240, 240, 38, 65, 130, 129, + 133, 146, 146, 146, 130, 130, 130, 130, 114, 50, 49, 69, + 0, 8, 16, 31, 11, 240, 240, 147, 98, 115, 130, 130, + 146, 18, 84, 33, 66, 66, 50, 82, 34, 82, 34, 82, + 34, 82, 50, 66, 50, 50, 100, 0, 8, 96, 23, 11, + 240, 240, 72, 34, 82, 33, 97, 146, 146, 145, 146, 146, + 146, 145, 146, 146, 145, 146, 146, 0, 9, 34, 11, 240, + 240, 85, 82, 50, 50, 82, 34, 82, 34, 82, 35, 50, + 67, 33, 101, 82, 50, 50, 82, 34, 82, 34, 82, 34, + 82, 50, 50, 85, 0, 8, 96, 30, 11, 240, 240, 84, + 98, 34, 66, 66, 50, 82, 34, 82, 34, 82, 34, 82, + 50, 66, 50, 51, 85, 146, 130, 146, 114, 99, 0, 9, + 32, 13, 4, 240, 18, 34, 34, 240, 178, 34, 34, 240, + 240, 64, 15, 5, 240, 83, 35, 35, 240, 240, 35, 35, + 65, 49, 240, 240, 128, 25, 10, 240, 33, 130, 114, 114, + 129, 130, 114, 114, 129, 130, 130, 146, 146, 145, 161, 146, + 146, 145, 161, 240, 240, 192, 11, 12, 0, 12, 10, 240, + 240, 138, 0, 16, 96, 24, 10, 161, 146, 146, 145, 161, + 146, 146, 146, 145, 146, 130, 114, 114, 129, 129, 130, 114, + 114, 129, 0, 6, 16, 28, 10, 240, 240, 36, 81, 50, + 49, 82, 34, 66, 34, 66, 130, 129, 130, 129, 130, 129, + 145, 145, 240, 50, 130, 130, 240, 240, 240, 54, 18, 0, + 7, 54, 163, 67, 114, 130, 82, 52, 50, 66, 34, 35, + 19, 34, 34, 51, 34, 34, 33, 66, 50, 34, 18, 66, + 50, 34, 18, 51, 50, 34, 18, 50, 50, 50, 18, 35, + 34, 82, 20, 17, 18, 17, 82, 97, 34, 98, 98, 166, + 0, 14, 48, 33, 16, 240, 240, 145, 241, 226, 227, 211, + 193, 33, 193, 34, 162, 34, 161, 65, 161, 66, 136, 129, + 82, 129, 98, 98, 98, 98, 99, 53, 69, 0, 12, 32, + 34, 13, 240, 240, 152, 114, 50, 98, 66, 82, 66, 82, + 66, 82, 66, 82, 50, 102, 114, 51, 82, 82, 66, 82, + 66, 82, 66, 82, 66, 66, 57, 0, 10, 32, 28, 15, + 0, 6, 38, 114, 83, 66, 114, 50, 145, 50, 194, 210, + 210, 210, 210, 226, 210, 145, 66, 113, 99, 66, 134, 0, + 11, 96, 35, 16, 0, 6, 9, 146, 67, 114, 98, 98, + 114, 82, 114, 82, 130, 66, 130, 66, 130, 66, 130, 66, + 130, 66, 114, 82, 114, 82, 98, 98, 82, 89, 0, 12, + 112, 30, 13, 240, 240, 154, 82, 81, 82, 81, 82, 81, + 82, 178, 65, 98, 65, 103, 98, 65, 98, 65, 98, 178, + 178, 97, 66, 97, 43, 0, 10, 28, 12, 240, 240, 106, + 66, 81, 66, 81, 66, 162, 162, 65, 82, 65, 87, 82, + 65, 82, 65, 82, 162, 162, 162, 134, 0, 9, 96, 31, + 16, 0, 6, 86, 131, 67, 82, 129, 66, 145, 66, 210, + 226, 226, 226, 117, 34, 146, 66, 130, 66, 130, 82, 114, + 99, 82, 134, 0, 12, 80, 36, 18, 0, 6, 102, 70, + 66, 130, 98, 130, 98, 130, 98, 130, 98, 130, 98, 130, + 108, 98, 130, 98, 130, 98, 130, 98, 130, 98, 130, 98, + 130, 70, 70, 0, 13, 96, 21, 8, 240, 150, 66, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, + 0, 6, 32, 28, 10, 240, 240, 53, 98, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 81, 33, 82, 18, 99, 240, 16, 36, 16, 0, 6, 6, + 52, 82, 98, 98, 81, 130, 65, 146, 49, 162, 33, 178, + 18, 181, 178, 34, 162, 50, 146, 66, 130, 66, 130, 82, + 114, 98, 70, 68, 0, 12, 32, 25, 14, 240, 240, 198, + 162, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 113, + 66, 97, 82, 97, 59, 0, 10, 112, 55, 22, 0, 8, + 52, 180, 82, 163, 115, 147, 115, 132, 116, 113, 18, 113, + 18, 98, 18, 113, 19, 81, 34, 113, 34, 81, 34, 113, + 34, 65, 50, 113, 50, 49, 50, 113, 50, 33, 66, 113, + 66, 17, 66, 113, 68, 66, 113, 82, 82, 70, 50, 54, + 0, 16, 96, 44, 19, 0, 7, 20, 133, 82, 145, 115, + 129, 116, 113, 113, 19, 97, 113, 34, 97, 113, 50, 81, + 113, 66, 65, 113, 82, 49, 113, 98, 33, 113, 99, 17, + 113, 116, 113, 131, 113, 146, 85, 129, 0, 14, 96, 35, + 17, 0, 7, 5, 162, 67, 114, 114, 82, 146, 65, 162, + 50, 178, 34, 178, 34, 178, 34, 178, 34, 178, 50, 161, + 66, 146, 82, 114, 115, 66, 165, 0, 13, 80, 29, 12, + 240, 240, 103, 114, 50, 82, 51, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 50, 86, 98, 162, 162, 162, 162, 134, + 0, 9, 96, 39, 18, 0, 7, 53, 178, 67, 130, 114, + 98, 146, 81, 162, 66, 178, 50, 178, 50, 178, 50, 178, + 50, 178, 66, 161, 82, 146, 98, 114, 131, 66, 181, 243, + 240, 19, 240, 38, 0, 7, 35, 16, 0, 6, 9, 146, + 66, 130, 82, 114, 82, 114, 82, 114, 82, 114, 51, 134, + 162, 50, 146, 50, 146, 66, 130, 82, 114, 83, 98, 99, + 54, 83, 0, 12, 32, 26, 10, 240, 240, 37, 66, 34, + 50, 65, 50, 130, 131, 131, 132, 131, 131, 130, 33, 82, + 33, 82, 34, 50, 54, 0, 8, 25, 14, 240, 240, 204, + 33, 66, 65, 114, 65, 114, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 166, 0, 11, 16, 36, 17, 0, 6, + 54, 69, 66, 129, 98, 129, 98, 129, 98, 129, 98, 129, + 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, + 114, 97, 131, 66, 165, 0, 13, 80, 33, 17, 0, 6, + 53, 85, 66, 129, 98, 129, 114, 97, 130, 97, 130, 82, + 146, 65, 162, 65, 177, 49, 194, 33, 194, 33, 211, 227, + 242, 241, 0, 13, 112, 55, 22, 0, 8, 37, 21, 20, + 19, 66, 51, 50, 49, 82, 66, 49, 65, 98, 65, 33, + 66, 98, 66, 17, 65, 114, 68, 65, 130, 66, 65, 146, + 66, 65, 162, 51, 34, 162, 36, 33, 193, 33, 33, 33, + 194, 17, 36, 195, 51, 226, 66, 225, 81, 0, 17, 64, + 33, 17, 0, 6, 69, 69, 67, 98, 114, 97, 146, 65, + 178, 34, 178, 33, 211, 242, 228, 209, 19, 177, 50, 161, + 82, 130, 98, 98, 115, 53, 85, 0, 13, 28, 16, 0, + 6, 5, 84, 51, 113, 98, 113, 114, 81, 146, 49, 163, + 17, 196, 210, 226, 226, 226, 226, 226, 226, 198, 0, 12, + 96, 27, 15, 0, 5, 107, 50, 115, 49, 130, 194, 194, + 195, 194, 194, 194, 195, 194, 194, 129, 50, 145, 35, 130, + 44, 0, 11, 80, 22, 7, 229, 34, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 85, + 240, 240, 51, 22, 0, 8, 37, 37, 53, 66, 66, 114, + 82, 81, 113, 113, 82, 82, 114, 66, 81, 95, 5, 97, + 65, 17, 49, 162, 33, 33, 49, 162, 33, 34, 33, 177, + 33, 49, 18, 179, 65, 17, 195, 67, 210, 82, 209, 97, + 225, 97, 0, 17, 64, 22, 7, 229, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 37, 240, 240, 13, 11, 50, 132, 98, 34, 66, 66, 49, + 113, 0, 26, 48, 8, 12, 0, 30, 10, 240, 240, 128, + 10, 5, 81, 66, 50, 65, 81, 0, 11, 64, 25, 11, + 0, 11, 51, 98, 34, 66, 50, 146, 131, 98, 18, 66, + 50, 66, 50, 66, 35, 17, 51, 19, 0, 8, 80, 32, + 12, 240, 162, 147, 162, 162, 162, 162, 162, 20, 83, 50, + 66, 67, 50, 82, 50, 82, 50, 82, 50, 82, 50, 66, + 67, 34, 81, 20, 0, 9, 80, 20, 10, 0, 10, 52, + 81, 50, 50, 65, 34, 130, 130, 130, 131, 131, 49, 69, + 0, 7, 112, 32, 12, 240, 240, 18, 147, 162, 162, 162, + 162, 102, 82, 35, 66, 66, 50, 82, 50, 82, 50, 82, + 50, 82, 51, 66, 66, 51, 84, 19, 0, 9, 32, 20, + 10, 0, 10, 36, 82, 34, 65, 66, 40, 34, 130, 130, + 130, 81, 50, 50, 68, 0, 8, 22, 9, 240, 130, 84, + 81, 114, 114, 114, 102, 66, 114, 114, 114, 114, 114, 114, + 114, 86, 0, 7, 16, 30, 12, 0, 12, 40, 50, 35, + 66, 66, 66, 66, 66, 66, 82, 34, 116, 113, 177, 199, + 66, 67, 34, 98, 34, 98, 35, 66, 85, 240, 32, 32, + 12, 240, 162, 147, 162, 162, 162, 162, 162, 20, 83, 35, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 52, 36, 0, 9, 32, 19, 6, 240, 66, 66, + 240, 129, 51, 66, 66, 66, 66, 66, 66, 66, 52, 240, + 240, 128, 21, 5, 240, 18, 50, 240, 65, 35, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 34, 208, 31, + 12, 240, 162, 147, 162, 162, 162, 162, 162, 52, 50, 50, + 82, 34, 98, 18, 116, 130, 18, 114, 34, 98, 34, 98, + 50, 68, 51, 0, 9, 32, 21, 6, 210, 51, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 52, + 240, 240, 128, 37, 18, 0, 18, 18, 20, 36, 83, 51, + 50, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 52, 36, + 36, 0, 13, 96, 27, 12, 0, 12, 18, 20, 83, 50, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 52, 36, 0, 9, 32, 25, 12, 0, 12, 52, + 98, 51, 66, 66, 50, 98, 34, 98, 34, 98, 34, 98, + 50, 66, 67, 50, 100, 0, 9, 80, 30, 13, 0, 13, + 34, 20, 99, 50, 82, 67, 66, 82, 66, 82, 66, 82, + 66, 82, 66, 66, 83, 34, 102, 114, 178, 178, 178, 150, + 240, 80, 29, 12, 0, 12, 52, 17, 81, 51, 66, 66, + 50, 82, 50, 82, 50, 82, 50, 82, 50, 82, 66, 66, + 87, 162, 162, 162, 162, 148, 224, 18, 9, 0, 9, 34, + 18, 54, 66, 114, 114, 114, 114, 114, 114, 86, 0, 7, + 16, 20, 8, 0, 8, 20, 50, 33, 50, 99, 99, 99, + 114, 33, 50, 34, 34, 52, 0, 6, 48, 20, 8, 0, + 6, 33, 98, 86, 50, 98, 98, 98, 98, 98, 98, 98, + 33, 67, 0, 6, 48, 27, 12, 0, 12, 3, 51, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 51, 84, 19, 0, 9, 32, 24, 12, 0, 12, + 5, 20, 50, 66, 82, 49, 98, 49, 113, 34, 114, 17, + 130, 17, 146, 162, 161, 0, 9, 112, 35, 18, 0, 18, + 4, 36, 36, 50, 66, 66, 81, 66, 65, 98, 51, 49, + 113, 36, 33, 130, 17, 33, 33, 130, 17, 36, 146, 66, + 162, 66, 177, 65, 0, 14, 48, 23, 13, 0, 13, 20, + 36, 66, 65, 114, 33, 148, 147, 178, 161, 18, 129, 50, + 97, 66, 68, 37, 0, 10, 27, 11, 0, 11, 4, 35, + 50, 65, 66, 65, 82, 33, 98, 33, 98, 18, 115, 131, + 145, 161, 161, 145, 161, 115, 131, 240, 64, 21, 10, 0, + 10, 23, 49, 50, 49, 65, 130, 114, 129, 130, 114, 65, + 50, 65, 40, 0, 7, 96, 24, 8, 179, 66, 98, 98, + 98, 98, 98, 98, 98, 66, 130, 98, 98, 98, 98, 98, + 98, 98, 115, 240, 240, 64, 21, 4, 130, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 240, 112, 24, 8, 131, 114, 98, 98, 98, 98, 98, + 98, 98, 130, 66, 98, 98, 98, 98, 98, 98, 98, 67, + 240, 240, 112, 14, 14, 0, 14, 36, 81, 49, 50, 65, + 33, 100, 0, 23, 16, + 0, 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x90, 0x01, 0x00, 0x00, // Offset 400 (0x190) + 0xaa, 0x01, 0x00, 0x00, // Offset 426 (0x1aa) + 0xc6, 0x01, 0x00, 0x00, // Offset 454 (0x1c6) + 0xd8, 0x01, 0x00, 0x00, // Offset 472 (0x1d8) + 0xf5, 0x01, 0x00, 0x00, // Offset 501 (0x1f5) + 0x11, 0x02, 0x00, 0x00, // Offset 529 (0x211) + 0x20, 0x02, 0x00, 0x00, // Offset 544 (0x220) + 0x38, 0x02, 0x00, 0x00, // Offset 568 (0x238) + 0x48, 0x02, 0x00, 0x00, // Offset 584 (0x248) + 0x63, 0x02, 0x00, 0x00, // Offset 611 (0x263) + 0x84, 0x02, 0x00, 0x00, // Offset 644 (0x284) + 0xa8, 0x02, 0x00, 0x00, // Offset 680 (0x2a8) + 0xc6, 0x02, 0x00, 0x00, // Offset 710 (0x2c6) + 0xde, 0x02, 0x00, 0x00, // Offset 734 (0x2de) + 0xfb, 0x02, 0x00, 0x00, // Offset 763 (0x2fb) + 0x18, 0x03, 0x00, 0x00, // Offset 792 (0x318) + 0x30, 0x03, 0x00, 0x00, // Offset 816 (0x330) + 0x48, 0x03, 0x00, 0x00, // Offset 840 (0x348) + 0x74, 0x03, 0x00, 0x00, // Offset 884 (0x374) + 0x97, 0x03, 0x00, 0x00, // Offset 919 (0x397) + 0xad, 0x03, 0x00, 0x00, // Offset 941 (0x3ad) + 0xcc, 0x03, 0x00, 0x00, // Offset 972 (0x3cc) + 0xe4, 0x03, 0x00, 0x00, // Offset 996 (0x3e4) + 0xf7, 0x03, 0x00, 0x00, // Offset 1015 (0x3f7) + 0x14, 0x04, 0x00, 0x00, // Offset 1044 (0x414) + 0x29, 0x04, 0x00, 0x00, // Offset 1065 (0x429) + 0x39, 0x04, 0x00, 0x00, // Offset 1081 (0x439) + 0x4a, 0x04, 0x00, 0x00, // Offset 1098 (0x44a) + 0x61, 0x04, 0x00, 0x00, // Offset 1121 (0x461) + 0x79, 0x04, 0x00, 0x00, // Offset 1145 (0x479) + 0x91, 0x04, 0x00, 0x00, // Offset 1169 (0x491) + 0xba, 0x04, 0x00, 0x00, // Offset 1210 (0x4ba) + 0xd2, 0x04, 0x00, 0x00, // Offset 1234 (0x4d2) + 0xf8, 0x04, 0x00, 0x00, // Offset 1272 (0x4f8) + 0x10, 0x05, 0x00, 0x00, // Offset 1296 (0x510) + 0x3a, 0x05, 0x00, 0x00, // Offset 1338 (0x53a) + 0x52, 0x05, 0x00, 0x00, // Offset 1362 (0x552) + 0x7d, 0x05, 0x00, 0x00, // Offset 1405 (0x57d) + 0x93, 0x05, 0x00, 0x00, // Offset 1427 (0x593) + 0xbd, 0x05, 0x00, 0x00, // Offset 1469 (0x5bd) + 0xef, 0x05, 0x00, 0x00, // Offset 1519 (0x5ef) + 0x11, 0x06, 0x00, 0x00, // Offset 1553 (0x611) + 0x26, 0x06, 0x00, 0x00, // Offset 1574 (0x626) + 0x40, 0x06, 0x00, 0x00, // Offset 1600 (0x640) + 0x63, 0x06, 0x00, 0x00, // Offset 1635 (0x663) + 0x96, 0x06, 0x00, 0x00, // Offset 1686 (0x696) + 0xba, 0x06, 0x00, 0x00, // Offset 1722 (0x6ba) + 0xd5, 0x06, 0x00, 0x00, // Offset 1749 (0x6d5) + 0xdf, 0x06, 0x00, 0x00, // Offset 1759 (0x6df) + 0xfa, 0x06, 0x00, 0x00, // Offset 1786 (0x6fa) + 0x11, 0x07, 0x00, 0x00, // Offset 1809 (0x711) + 0x18, 0x07, 0x00, 0x00, // Offset 1816 (0x718) + 0x32, 0x07, 0x00, 0x00, // Offset 1842 (0x732) + 0x4d, 0x07, 0x00, 0x00, // Offset 1869 (0x74d) + 0x6a, 0x07, 0x00, 0x00, // Offset 1898 (0x76a) + 0x89, 0x07, 0x00, 0x00, // Offset 1929 (0x789) + 0xae, 0x07, 0x00, 0x00, // Offset 1966 (0x7ae) + 0xc6, 0x07, 0x00, 0x00, // Offset 1990 (0x7c6) + 0xf0, 0x07, 0x00, 0x00, // Offset 2032 (0x7f0) + 0x10, 0x08, 0x00, 0x00, // Offset 2064 (0x810) + 0x2c, 0x08, 0x00, 0x00, // Offset 2092 (0x82c) + 0x55, 0x08, 0x00, 0x00, // Offset 2133 (0x855) + 0x7a, 0x08, 0x00, 0x00, // Offset 2170 (0x87a) + 0x9e, 0x08, 0x00, 0x00, // Offset 2206 (0x89e) + 0xbe, 0x08, 0x00, 0x00, // Offset 2238 (0x8be) + 0xdf, 0x08, 0x00, 0x00, // Offset 2271 (0x8df) + 0xff, 0x08, 0x00, 0x00, // Offset 2303 (0x8ff) + 0x29, 0x09, 0x00, 0x00, // Offset 2345 (0x929) + 0x53, 0x09, 0x00, 0x00, // Offset 2387 (0x953) + 0x78, 0x09, 0x00, 0x00, // Offset 2424 (0x978) + 0x95, 0x09, 0x00, 0x00, // Offset 2453 (0x995) + 0xb5, 0x09, 0x00, 0x00, // Offset 2485 (0x9b5) + 0xe5, 0x09, 0x00, 0x00, // Offset 2533 (0x9e5) + 0x04, 0x0a, 0x00, 0x00, // Offset 2564 (0xa04) + 0x21, 0x0a, 0x00, 0x00, // Offset 2593 (0xa21) + 0x40, 0x0a, 0x00, 0x00, // Offset 2624 (0xa40) + 0x64, 0x0a, 0x00, 0x00, // Offset 2660 (0xa64) + 0x85, 0x0a, 0x00, 0x00, // Offset 2693 (0xa85) + 0x9c, 0x0a, 0x00, 0x00, // Offset 2716 (0xa9c) + 0xbf, 0x0a, 0x00, 0x00, // Offset 2751 (0xabf) + 0xd8, 0x0a, 0x00, 0x00, // Offset 2776 (0xad8) + 0xfc, 0x0a, 0x00, 0x00, // Offset 2812 (0xafc) + 0x20, 0x0b, 0x00, 0x00, // Offset 2848 (0xb20) + 0x43, 0x0b, 0x00, 0x00, // Offset 2883 (0xb43) + 0x64, 0x0b, 0x00, 0x00, // Offset 2916 (0xb64) + 0x7c, 0x0b, 0x00, 0x00, // Offset 2940 (0xb7c) + 0xab, 0x0b, 0x00, 0x00, // Offset 2987 (0xbab) + 0xe0, 0x0b, 0x00, 0x00, // Offset 3040 (0xbe0) + 0x07, 0x0c, 0x00, 0x00, // Offset 3079 (0xc07) + 0x31, 0x0c, 0x00, 0x00, // Offset 3121 (0xc31) + 0x6e, 0x0c, 0x00, 0x00, // Offset 3182 (0xc6e) + 0x9f, 0x0c, 0x00, 0x00, // Offset 3231 (0xc9f) + 0xa9, 0x0c, 0x00, 0x00, // Offset 3241 (0xca9) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 16, 14, 0, 12, 44, 194, 194, 194, 194, 194, 194, 194, + 194, 0, 14, 32, 26, 15, 0, 12, 7, 40, 50, 114, + 66, 114, 66, 114, 66, 114, 66, 114, 66, 114, 66, 114, + 66, 114, 66, 0, 15, 32, 28, 17, 0, 14, 1, 103, + 51, 146, 50, 162, 50, 162, 49, 178, 35, 162, 33, 33, + 146, 18, 34, 132, 66, 115, 97, 0, 17, 32, 18, 16, + 0, 10, 1, 240, 19, 226, 226, 226, 226, 226, 226, 226, + 236, 0, 18, 32, 29, 17, 0, 14, 115, 57, 50, 114, + 98, 98, 114, 98, 114, 99, 98, 82, 18, 82, 66, 50, + 66, 20, 82, 51, 33, 113, 0, 17, 32, 28, 17, 0, + 13, 101, 67, 242, 42, 50, 242, 99, 98, 66, 35, 66, + 66, 50, 66, 66, 50, 66, 22, 19, 68, 67, 0, 17, + 80, 15, 15, 0, 13, 29, 50, 210, 210, 210, 210, 210, + 220, 0, 17, 16, 24, 17, 0, 12, 98, 88, 72, 146, + 66, 146, 66, 146, 66, 146, 66, 146, 66, 146, 66, 157, + 81, 0, 18, 80, 16, 15, 0, 11, 44, 210, 210, 210, + 60, 66, 210, 210, 220, 0, 17, 16, 27, 16, 0, 12, + 14, 130, 66, 129, 82, 129, 82, 40, 66, 50, 146, 50, + 146, 50, 81, 50, 55, 66, 65, 146, 0, 16, 32, 33, + 16, 0, 12, 14, 114, 18, 34, 114, 18, 34, 114, 18, + 34, 39, 18, 34, 50, 82, 34, 50, 82, 34, 50, 82, + 34, 54, 22, 50, 82, 0, 16, 96, 36, 16, 0, 11, + 50, 58, 34, 114, 18, 34, 114, 18, 34, 114, 18, 34, + 39, 22, 50, 82, 34, 50, 82, 34, 50, 82, 34, 50, + 19, 22, 52, 49, 50, 0, 16, 32, 30, 18, 0, 12, + 65, 120, 35, 162, 65, 178, 50, 178, 50, 104, 19, 114, + 98, 17, 98, 82, 34, 82, 81, 66, 71, 98, 65, 0, + 19, 112, 24, 17, 0, 12, 110, 130, 18, 194, 18, 194, + 18, 119, 22, 66, 82, 130, 82, 130, 67, 134, 23, 0, + 19, 48, 29, 18, 0, 13, 79, 130, 240, 18, 22, 146, + 34, 18, 71, 34, 18, 82, 98, 18, 82, 98, 18, 82, + 98, 18, 95, 51, 0, 19, 96, 29, 18, 0, 13, 72, + 20, 162, 129, 123, 114, 183, 51, 98, 82, 34, 82, 82, + 50, 66, 82, 50, 66, 23, 19, 68, 68, 0, 18, 80, + 24, 15, 0, 11, 45, 66, 114, 66, 114, 66, 114, 66, + 114, 66, 114, 66, 114, 66, 114, 75, 66, 0, 16, 48, + 24, 14, 0, 11, 67, 52, 98, 66, 98, 66, 98, 74, + 66, 98, 66, 98, 66, 98, 74, 66, 98, 0, 14, 32, + 44, 16, 0, 10, 114, 35, 34, 35, 18, 34, 50, 34, + 18, 34, 50, 34, 18, 34, 50, 34, 22, 54, 18, 34, + 50, 34, 18, 34, 50, 34, 18, 34, 50, 34, 18, 34, + 54, 22, 50, 33, 33, 0, 16, 112, 35, 18, 0, 14, + 17, 65, 115, 50, 50, 98, 50, 50, 98, 50, 34, 119, + 34, 114, 50, 18, 17, 98, 50, 18, 18, 82, 52, 50, + 72, 82, 50, 50, 0, 19, 32, 22, 17, 0, 13, 67, + 243, 226, 227, 227, 210, 18, 178, 50, 146, 98, 98, 131, + 34, 177, 0, 17, 48, 31, 18, 0, 14, 1, 82, 178, + 66, 162, 66, 162, 50, 162, 66, 163, 36, 130, 18, 18, + 18, 98, 51, 50, 66, 66, 82, 34, 66, 0, 19, 32, + 24, 13, 0, 10, 35, 149, 99, 51, 66, 82, 50, 114, + 34, 114, 34, 114, 50, 82, 67, 51, 101, 0, 13, 80, + 19, 17, 0, 15, 27, 226, 226, 226, 226, 214, 162, 66, + 115, 100, 35, 161, 0, 17, 48, 29, 17, 0, 14, 33, + 92, 146, 66, 146, 50, 146, 66, 146, 50, 148, 33, 18, + 98, 36, 34, 66, 66, 66, 33, 81, 241, 0, 16, 32, + 21, 17, 0, 11, 22, 240, 240, 218, 227, 210, 226, 228, + 178, 51, 115, 100, 35, 161, 0, 17, 48, 16, 14, 0, + 12, 44, 194, 194, 194, 59, 194, 194, 194, 194, 0, 14, + 32, 17, 16, 0, 12, 14, 66, 226, 226, 235, 82, 226, + 226, 226, 236, 0, 16, 32, 23, 16, 0, 14, 13, 240, + 99, 51, 130, 66, 130, 65, 146, 65, 146, 65, 146, 65, + 34, 45, 0, 16, 48, 24, 16, 0, 10, 70, 240, 240, + 142, 240, 133, 162, 50, 130, 82, 114, 82, 114, 82, 130, + 50, 165, 0, 14, 96, 24, 10, 240, 84, 130, 130, 130, + 130, 130, 130, 130, 134, 66, 130, 130, 130, 130, 130, 130, + 130, 130, 0, 5, 96, 41, 10, 240, 148, 36, 34, 66, + 34, 66, 34, 66, 34, 66, 34, 66, 34, 66, 34, 70, + 66, 34, 66, 34, 66, 34, 66, 34, 66, 34, 66, 34, + 66, 34, 66, 34, 66, 34, 130, 240, 240, 32, 24, 10, + 161, 163, 130, 130, 130, 130, 134, 66, 130, 130, 130, 134, + 66, 130, 130, 130, 130, 130, 130, 0, 5, 96, 38, 10, + 240, 148, 36, 34, 66, 34, 66, 34, 66, 34, 66, 34, + 70, 66, 34, 66, 34, 66, 34, 70, 66, 34, 66, 34, + 66, 34, 66, 34, 66, 34, 66, 34, 130, 240, 240, 192, + 24, 10, 226, 147, 130, 130, 130, 130, 130, 130, 40, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 240, 240, 192, + 42, 12, 240, 51, 83, 35, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 38, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 162, 0, 6, 32, 24, 10, 226, 147, 130, 130, + 130, 130, 40, 130, 130, 130, 130, 55, 130, 130, 130, 130, + 130, 130, 130, 240, 240, 192, 43, 12, 240, 51, 84, 19, + 98, 34, 98, 34, 98, 34, 98, 34, 38, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 38, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 0, 6, + 32, 22, 20, 0, 20, 98, 240, 82, 240, 50, 240, 50, + 240, 50, 240, 50, 240, 50, 175, 3, 0, 20, 32, 42, + 20, 0, 6, 51, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 50, 163, 82, 178, 86, 114, 82, 178, 82, + 178, 37, 105, 50, 97, 178, 240, 50, 240, 50, 240, 50, + 240, 50, 0, 10, 96, 50, 19, 240, 240, 33, 226, 51, + 195, 34, 210, 34, 210, 34, 210, 34, 210, 34, 97, 98, + 34, 114, 66, 34, 114, 70, 114, 66, 34, 114, 66, 34, + 114, 51, 34, 42, 18, 34, 210, 34, 210, 34, 210, 34, + 210, 34, 210, 34, 0, 9, 96, 34, 17, 240, 209, 240, + 35, 242, 242, 242, 242, 242, 113, 114, 130, 82, 130, 82, + 130, 82, 130, 82, 130, 37, 42, 50, 49, 178, 242, 242, + 242, 242, 0, 8, 96, 21, 20, 0, 22, 116, 51, 194, + 66, 194, 66, 194, 66, 194, 66, 194, 66, 127, 3, 0, + 20, 32, 26, 20, 0, 25, 15, 3, 162, 240, 50, 240, + 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, + 50, 0, 11, 32, 35, 17, 240, 240, 244, 242, 242, 242, + 242, 242, 242, 242, 182, 41, 66, 114, 98, 114, 98, 114, + 23, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 241, + 0, 6, 96, 51, 18, 0, 6, 4, 195, 18, 210, 18, + 210, 18, 210, 18, 210, 18, 210, 18, 210, 18, 177, 18, + 18, 41, 34, 18, 114, 66, 18, 114, 21, 18, 114, 66, + 18, 114, 66, 18, 114, 66, 18, 114, 66, 18, 114, 66, + 18, 240, 18, 0, 9, 32, 36, 17, 240, 209, 240, 35, + 242, 242, 242, 242, 242, 242, 242, 197, 42, 50, 49, 66, + 82, 130, 82, 130, 82, 130, 82, 130, 82, 130, 82, 130, + 82, 130, 82, 0, 8, 96, 27, 20, 0, 25, 15, 3, + 114, 66, 194, 66, 194, 66, 194, 66, 194, 66, 194, 66, + 194, 66, 194, 66, 194, 66, 0, 10, 112, 10, 20, 0, + 34, 81, 47, 3, 0, 22, 96, 27, 17, 240, 209, 240, + 35, 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 167, + 40, 82, 242, 242, 242, 242, 242, 0, 8, 96, 23, 6, + 97, 99, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 240, 176, 7, 3, 240, + 241, 240, 240, 176, 26, 16, 0, 12, 113, 131, 82, 114, + 82, 114, 82, 114, 82, 114, 82, 114, 82, 114, 82, 118, + 22, 51, 67, 0, 16, 80, 27, 18, 0, 13, 67, 73, + 66, 82, 146, 82, 146, 82, 146, 82, 146, 82, 146, 82, + 146, 82, 146, 52, 149, 39, 0, 18, 32, 29, 17, 0, + 13, 115, 83, 114, 98, 114, 98, 113, 114, 99, 98, 97, + 17, 98, 82, 33, 82, 66, 50, 71, 82, 51, 33, 0, + 18, 32, 31, 18, 0, 14, 97, 116, 114, 114, 114, 114, + 100, 98, 98, 17, 98, 82, 34, 82, 82, 49, 82, 81, + 66, 66, 36, 81, 68, 40, 0, 18, 32, 37, 21, 0, + 15, 108, 35, 146, 50, 34, 162, 50, 34, 162, 50, 34, + 87, 50, 19, 98, 114, 20, 82, 114, 17, 34, 66, 65, + 36, 49, 70, 51, 66, 65, 114, 0, 22, 16, 24, 17, + 0, 12, 110, 130, 18, 194, 18, 194, 18, 119, 18, 130, + 82, 130, 82, 130, 67, 134, 23, 0, 19, 48, 42, 21, + 0, 17, 2, 33, 120, 34, 34, 130, 18, 34, 34, 130, + 18, 34, 33, 93, 18, 98, 66, 34, 17, 17, 82, 66, + 34, 17, 18, 66, 66, 35, 49, 66, 26, 50, 52, 38, + 81, 0, 21, 32, 32, 17, 0, 12, 104, 34, 162, 50, + 162, 51, 146, 34, 17, 71, 34, 17, 82, 82, 49, 66, + 82, 49, 66, 66, 66, 56, 81, 52, 40, 0, 17, 32, + 28, 17, 0, 12, 103, 113, 49, 58, 114, 242, 167, 51, + 82, 82, 34, 66, 82, 50, 50, 82, 50, 58, 19, 51, + 99, 0, 17, 64, 41, 16, 0, 11, 49, 74, 34, 50, + 34, 18, 34, 50, 34, 18, 34, 50, 34, 18, 34, 50, + 34, 22, 50, 34, 18, 34, 50, 34, 18, 34, 50, 34, + 18, 34, 54, 22, 50, 81, 0, 16, 112, 37, 17, 0, + 12, 103, 50, 98, 34, 50, 98, 34, 50, 98, 34, 49, + 114, 34, 35, 98, 34, 33, 18, 82, 34, 18, 34, 66, + 34, 17, 66, 55, 82, 50, 49, 0, 18, 32, 36, 17, + 0, 12, 103, 50, 98, 34, 50, 98, 34, 36, 82, 34, + 34, 17, 82, 34, 33, 33, 82, 34, 18, 49, 66, 34, + 17, 65, 66, 36, 66, 62, 49, 0, 18, 112, 32, 12, + 240, 240, 106, 50, 82, 50, 82, 50, 82, 50, 82, 50, + 82, 57, 50, 240, 164, 114, 34, 82, 66, 66, 66, 66, + 66, 82, 34, 116, 0, 8, 33, 16, 0, 12, 81, 163, + 50, 21, 50, 50, 66, 50, 50, 66, 55, 66, 50, 50, + 66, 50, 50, 66, 50, 50, 66, 55, 66, 50, 49, 82, + 0, 16, 32, 32, 16, 0, 12, 3, 26, 50, 34, 18, + 114, 34, 18, 114, 34, 18, 118, 18, 114, 34, 18, 114, + 34, 18, 114, 34, 18, 118, 22, 50, 0, 17, 80, 42, + 18, 0, 14, 2, 33, 147, 34, 18, 21, 50, 34, 18, + 66, 50, 34, 18, 66, 54, 17, 82, 50, 34, 18, 66, + 50, 35, 33, 50, 50, 35, 34, 34, 54, 66, 18, 49, + 50, 114, 0, 18, 32, 42, 19, 0, 12, 49, 227, 19, + 18, 22, 50, 34, 18, 34, 98, 34, 18, 34, 98, 34, + 18, 34, 102, 17, 50, 98, 34, 18, 34, 98, 35, 33, + 18, 98, 35, 36, 102, 70, 50, 49, 0, 20, 64, 37, + 18, 0, 14, 1, 211, 34, 23, 66, 34, 66, 98, 34, + 50, 118, 50, 114, 34, 50, 114, 34, 34, 17, 98, 34, + 18, 50, 70, 17, 82, 50, 33, 17, 97, 0, 18, 48, + 29, 17, 0, 14, 115, 41, 66, 34, 18, 130, 34, 18, + 134, 22, 66, 34, 18, 130, 34, 18, 130, 34, 18, 134, + 23, 49, 0, 18, 112, 32, 12, 240, 240, 196, 35, 82, + 50, 82, 57, 50, 82, 50, 82, 57, 50, 82, 240, 37, + 98, 50, 66, 82, 50, 82, 50, 82, 66, 50, 101, 0, + 8, 48, 15, 240, 240, 162, 49, 54, 18, 50, 34, 18, + 18, 50, 34, 18, 18, 54, 21, 50, 34, 18, 18, 50, + 34, 18, 18, 50, 34, 18, 18, 54, 21, 50, 81, 181, + 146, 50, 114, 82, 98, 82, 98, 82, 114, 50, 149, 0, + 10, 31, 16, 0, 12, 49, 240, 18, 23, 98, 98, 82, + 114, 82, 114, 83, 98, 66, 18, 82, 50, 50, 66, 49, + 82, 50, 33, 98, 50, 0, 16, 32, 29, 17, 0, 13, + 19, 35, 162, 50, 146, 66, 146, 66, 146, 66, 130, 17, + 50, 114, 34, 34, 113, 66, 18, 97, 97, 22, 0, 19, + 48, 31, 18, 0, 11, 81, 240, 50, 39, 114, 50, 178, + 50, 162, 66, 163, 50, 146, 17, 50, 145, 49, 34, 130, + 50, 18, 114, 81, 23, 0, 20, 64, 36, 16, 0, 12, + 34, 50, 35, 82, 50, 34, 82, 50, 34, 82, 50, 34, + 66, 70, 67, 50, 34, 50, 33, 34, 34, 34, 50, 18, + 34, 33, 88, 162, 33, 0, 16, 48, 33, 18, 0, 13, + 113, 240, 50, 24, 98, 82, 146, 82, 146, 82, 132, 66, + 129, 34, 34, 17, 98, 49, 33, 34, 66, 68, 50, 49, + 98, 82, 0, 18, 32, 23, 12, 0, 9, 51, 162, 163, + 130, 18, 114, 33, 98, 50, 81, 81, 66, 82, 49, 113, + 42, 0, 12, 32, 35, 18, 0, 11, 81, 113, 146, 98, + 102, 38, 66, 34, 34, 34, 50, 68, 66, 34, 68, 66, + 34, 68, 66, 34, 68, 66, 50, 34, 34, 34, 84, 68, + 0, 20, 96, 25, 12, 0, 7, 115, 162, 148, 98, 51, + 66, 66, 50, 98, 34, 98, 34, 98, 34, 83, 50, 66, + 100, 0, 12, 80, 36, 18, 0, 13, 99, 82, 146, 98, + 130, 98, 98, 34, 50, 98, 66, 34, 98, 66, 35, 82, + 66, 18, 18, 66, 68, 50, 66, 34, 17, 82, 68, 17, + 97, 0, 18, 48, 36, 17, 0, 10, 115, 242, 82, 130, + 83, 86, 51, 82, 34, 34, 18, 50, 66, 18, 33, 50, + 66, 17, 49, 50, 68, 65, 34, 68, 65, 50, 34, 23, + 68, 0, 18, 48, 35, 15, 240, 240, 177, 60, 162, 131, + 35, 130, 50, 130, 50, 130, 50, 130, 50, 33, 45, 240, + 101, 146, 50, 114, 82, 98, 82, 98, 82, 114, 50, 149, + 0, 10, 16, 33, 20, 0, 15, 36, 69, 240, 168, 25, + 240, 163, 84, 98, 34, 50, 34, 82, 50, 18, 66, 66, + 50, 18, 66, 67, 19, 19, 34, 115, 84, 0, 20, 80, + 24, 16, 0, 12, 14, 240, 240, 149, 162, 50, 130, 82, + 114, 82, 114, 82, 114, 82, 130, 50, 165, 0, 14, 96, + 47, 21, 0, 6, 84, 240, 66, 240, 66, 240, 66, 240, + 66, 240, 70, 81, 67, 34, 162, 50, 34, 162, 50, 34, + 162, 50, 34, 162, 50, 38, 98, 54, 106, 50, 113, 178, + 240, 66, 240, 66, 240, 66, 240, 66, 0, 11, 32, 53, + 18, 240, 240, 241, 51, 195, 18, 210, 18, 210, 18, 210, + 18, 213, 131, 34, 18, 67, 34, 34, 18, 82, 34, 34, + 18, 82, 34, 34, 18, 82, 34, 37, 82, 34, 19, 18, + 42, 18, 18, 210, 18, 210, 18, 210, 18, 210, 18, 210, + 18, 0, 9, 32, 39, 17, 240, 209, 240, 35, 242, 242, + 242, 242, 242, 82, 51, 34, 98, 50, 34, 98, 50, 34, + 98, 50, 34, 98, 50, 34, 98, 54, 41, 66, 49, 178, + 242, 242, 242, 242, 0, 8, 96, 42, 17, 240, 240, 244, + 242, 242, 242, 242, 242, 242, 242, 182, 41, 66, 82, 34, + 66, 82, 34, 21, 82, 34, 66, 82, 34, 66, 82, 34, + 21, 82, 34, 66, 82, 34, 66, 82, 34, 66, 0, 8, + 96, 61, 19, 0, 6, 37, 195, 34, 210, 34, 210, 34, + 210, 34, 210, 34, 210, 34, 210, 34, 180, 34, 41, 34, + 34, 82, 18, 50, 34, 82, 18, 20, 34, 82, 18, 50, + 34, 82, 18, 50, 34, 82, 18, 20, 34, 82, 18, 50, + 34, 82, 18, 50, 34, 82, 18, 50, 34, 240, 34, 0, + 7, 48, 49, 18, 240, 242, 240, 35, 240, 18, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 198, 43, + 50, 98, 50, 50, 98, 50, 50, 98, 50, 50, 98, 50, + 50, 98, 50, 50, 98, 50, 50, 98, 50, 50, 240, 18, + 0, 9, 32, 10, 5, 240, 240, 243, 35, 35, 0, 7, + 96, 27, 9, 194, 131, 114, 114, 114, 114, 114, 114, 35, + 34, 35, 34, 35, 34, 114, 114, 114, 114, 114, 114, 114, + 114, 240, 240, 128, +}; + +tFont *g_psFontWHangulmyeongjo20ptb = (tFont *)g_pui8Hangulmyeongjo20ptb; diff --git a/third_party/fonts/ofl/fonts/fonthangulmyeongjo22pt.c b/third_party/fonts/ofl/fonts/fonthangulmyeongjo22pt.c new file mode 100644 index 0000000..1cee2fe --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulmyeongjo22pt.c @@ -0,0 +1,892 @@ +//***************************************************************************** +// +// fonthangulmyeongjo22pt.c - Font definition for the 22ptpt Hangulmyeongjo font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulmyeongjo +// Size: 22pt +// Bold: no +// Italic: no +// Memory usage: 6845 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulmyeongjo22pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 21, + + // + // The height of the font. + // + 26, + + // + // The baseline of the font. + // + 20, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x84, 0x0c, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x95, 0x01, 0x00, 0x00, // Offset 405 (0x195) + 0xa2, 0x01, 0x00, 0x00, // Offset 418 (0x1a2) + 0xc9, 0x01, 0x00, 0x00, // Offset 457 (0x1c9) + 0xf5, 0x01, 0x00, 0x00, // Offset 501 (0x1f5) + 0x2d, 0x02, 0x00, 0x00, // Offset 557 (0x22d) + 0x5d, 0x02, 0x00, 0x00, // Offset 605 (0x25d) + 0x66, 0x02, 0x00, 0x00, // Offset 614 (0x266) + 0x80, 0x02, 0x00, 0x00, // Offset 640 (0x280) + 0x9a, 0x02, 0x00, 0x00, // Offset 666 (0x29a) + 0xad, 0x02, 0x00, 0x00, // Offset 685 (0x2ad) + 0xbf, 0x02, 0x00, 0x00, // Offset 703 (0x2bf) + 0xca, 0x02, 0x00, 0x00, // Offset 714 (0x2ca) + 0xd2, 0x02, 0x00, 0x00, // Offset 722 (0x2d2) + 0xda, 0x02, 0x00, 0x00, // Offset 730 (0x2da) + 0xf3, 0x02, 0x00, 0x00, // Offset 755 (0x2f3) + 0x1a, 0x03, 0x00, 0x00, // Offset 794 (0x31a) + 0x32, 0x03, 0x00, 0x00, // Offset 818 (0x332) + 0x50, 0x03, 0x00, 0x00, // Offset 848 (0x350) + 0x6a, 0x03, 0x00, 0x00, // Offset 874 (0x36a) + 0x8a, 0x03, 0x00, 0x00, // Offset 906 (0x38a) + 0xa2, 0x03, 0x00, 0x00, // Offset 930 (0x3a2) + 0xc4, 0x03, 0x00, 0x00, // Offset 964 (0x3c4) + 0xde, 0x03, 0x00, 0x00, // Offset 990 (0x3de) + 0x04, 0x04, 0x00, 0x00, // Offset 1028 (0x404) + 0x24, 0x04, 0x00, 0x00, // Offset 1060 (0x424) + 0x30, 0x04, 0x00, 0x00, // Offset 1072 (0x430) + 0x40, 0x04, 0x00, 0x00, // Offset 1088 (0x440) + 0x5a, 0x04, 0x00, 0x00, // Offset 1114 (0x45a) + 0x65, 0x04, 0x00, 0x00, // Offset 1125 (0x465) + 0x7f, 0x04, 0x00, 0x00, // Offset 1151 (0x47f) + 0x9c, 0x04, 0x00, 0x00, // Offset 1180 (0x49c) + 0xd6, 0x04, 0x00, 0x00, // Offset 1238 (0x4d6) + 0xfa, 0x04, 0x00, 0x00, // Offset 1274 (0x4fa) + 0x20, 0x05, 0x00, 0x00, // Offset 1312 (0x520) + 0x40, 0x05, 0x00, 0x00, // Offset 1344 (0x540) + 0x67, 0x05, 0x00, 0x00, // Offset 1383 (0x567) + 0x88, 0x05, 0x00, 0x00, // Offset 1416 (0x588) + 0xa7, 0x05, 0x00, 0x00, // Offset 1447 (0x5a7) + 0xcd, 0x05, 0x00, 0x00, // Offset 1485 (0x5cd) + 0xf5, 0x05, 0x00, 0x00, // Offset 1525 (0x5f5) + 0x0c, 0x06, 0x00, 0x00, // Offset 1548 (0x60c) + 0x29, 0x06, 0x00, 0x00, // Offset 1577 (0x629) + 0x51, 0x06, 0x00, 0x00, // Offset 1617 (0x651) + 0x6b, 0x06, 0x00, 0x00, // Offset 1643 (0x66b) + 0xac, 0x06, 0x00, 0x00, // Offset 1708 (0x6ac) + 0xe0, 0x06, 0x00, 0x00, // Offset 1760 (0x6e0) + 0x07, 0x07, 0x00, 0x00, // Offset 1799 (0x707) + 0x27, 0x07, 0x00, 0x00, // Offset 1831 (0x727) + 0x52, 0x07, 0x00, 0x00, // Offset 1874 (0x752) + 0x78, 0x07, 0x00, 0x00, // Offset 1912 (0x778) + 0x94, 0x07, 0x00, 0x00, // Offset 1940 (0x794) + 0xb0, 0x07, 0x00, 0x00, // Offset 1968 (0x7b0) + 0xd8, 0x07, 0x00, 0x00, // Offset 2008 (0x7d8) + 0x00, 0x08, 0x00, 0x00, // Offset 2048 (0x800) + 0x41, 0x08, 0x00, 0x00, // Offset 2113 (0x841) + 0x69, 0x08, 0x00, 0x00, // Offset 2153 (0x869) + 0x89, 0x08, 0x00, 0x00, // Offset 2185 (0x889) + 0xa5, 0x08, 0x00, 0x00, // Offset 2213 (0x8a5) + 0xbf, 0x08, 0x00, 0x00, // Offset 2239 (0x8bf) + 0xfa, 0x08, 0x00, 0x00, // Offset 2298 (0x8fa) + 0x14, 0x09, 0x00, 0x00, // Offset 2324 (0x914) + 0x22, 0x09, 0x00, 0x00, // Offset 2338 (0x922) + 0x2a, 0x09, 0x00, 0x00, // Offset 2346 (0x92a) + 0x34, 0x09, 0x00, 0x00, // Offset 2356 (0x934) + 0x4e, 0x09, 0x00, 0x00, // Offset 2382 (0x94e) + 0x70, 0x09, 0x00, 0x00, // Offset 2416 (0x970) + 0x85, 0x09, 0x00, 0x00, // Offset 2437 (0x985) + 0xa7, 0x09, 0x00, 0x00, // Offset 2471 (0x9a7) + 0xbb, 0x09, 0x00, 0x00, // Offset 2491 (0x9bb) + 0xd3, 0x09, 0x00, 0x00, // Offset 2515 (0x9d3) + 0xf2, 0x09, 0x00, 0x00, // Offset 2546 (0x9f2) + 0x17, 0x0a, 0x00, 0x00, // Offset 2583 (0xa17) + 0x2b, 0x0a, 0x00, 0x00, // Offset 2603 (0xa2b) + 0x42, 0x0a, 0x00, 0x00, // Offset 2626 (0xa42) + 0x65, 0x0a, 0x00, 0x00, // Offset 2661 (0xa65) + 0x7d, 0x0a, 0x00, 0x00, // Offset 2685 (0xa7d) + 0xa7, 0x0a, 0x00, 0x00, // Offset 2727 (0xaa7) + 0xc5, 0x0a, 0x00, 0x00, // Offset 2757 (0xac5) + 0xe0, 0x0a, 0x00, 0x00, // Offset 2784 (0xae0) + 0x00, 0x0b, 0x00, 0x00, // Offset 2816 (0xb00) + 0x21, 0x0b, 0x00, 0x00, // Offset 2849 (0xb21) + 0x34, 0x0b, 0x00, 0x00, // Offset 2868 (0xb34) + 0x4a, 0x0b, 0x00, 0x00, // Offset 2890 (0xb4a) + 0x5f, 0x0b, 0x00, 0x00, // Offset 2911 (0xb5f) + 0x7c, 0x0b, 0x00, 0x00, // Offset 2940 (0xb7c) + 0x96, 0x0b, 0x00, 0x00, // Offset 2966 (0xb96) + 0xbd, 0x0b, 0x00, 0x00, // Offset 3005 (0xbbd) + 0xd7, 0x0b, 0x00, 0x00, // Offset 3031 (0xbd7) + 0xf4, 0x0b, 0x00, 0x00, // Offset 3060 (0xbf4) + 0x09, 0x0c, 0x00, 0x00, // Offset 3081 (0xc09) + 0x22, 0x0c, 0x00, 0x00, // Offset 3106 (0xc22) + 0x39, 0x0c, 0x00, 0x00, // Offset 3129 (0xc39) + 0x53, 0x0c, 0x00, 0x00, // Offset 3155 (0xc53) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 10, 0, 32, 64, 20, 4, 194, 34, 34, 34, 34, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 162, 34, 240, + 112, 13, 7, 114, 18, 34, 18, 34, 18, 49, 33, 0, + 18, 80, 39, 14, 0, 5, 113, 49, 130, 49, 130, 34, + 129, 50, 129, 49, 107, 82, 49, 130, 49, 129, 50, 129, + 49, 145, 49, 107, 82, 49, 129, 50, 129, 49, 145, 49, + 130, 49, 0, 11, 48, 44, 12, 240, 209, 150, 81, 33, + 49, 49, 49, 49, 49, 49, 113, 49, 114, 33, 130, 17, + 147, 179, 145, 19, 113, 49, 113, 65, 97, 65, 97, 65, + 33, 49, 65, 34, 33, 49, 71, 129, 177, 177, 240, 240, + 208, 56, 20, 0, 8, 3, 82, 134, 50, 130, 69, 145, + 81, 49, 130, 81, 33, 145, 81, 49, 145, 81, 33, 161, + 65, 49, 177, 33, 49, 68, 82, 50, 34, 49, 161, 49, + 66, 129, 49, 82, 129, 49, 81, 129, 65, 81, 129, 65, + 65, 129, 81, 49, 145, 99, 0, 15, 96, 48, 19, 0, + 7, 116, 225, 65, 193, 81, 193, 81, 193, 66, 193, 50, + 212, 53, 114, 98, 129, 18, 82, 98, 49, 81, 114, 50, + 65, 98, 82, 33, 114, 97, 33, 114, 114, 130, 114, 81, + 50, 66, 33, 49, 85, 83, 0, 14, 96, 9, 4, 66, + 34, 34, 33, 0, 10, 112, 26, 8, 209, 97, 98, 82, + 97, 98, 98, 82, 98, 98, 98, 98, 98, 98, 114, 98, + 113, 114, 113, 129, 129, 240, 240, 64, 26, 8, 129, 129, + 114, 114, 113, 114, 98, 114, 98, 98, 98, 98, 98, 98, + 82, 98, 97, 98, 97, 97, 97, 240, 240, 144, 19, 10, + 210, 130, 82, 18, 18, 36, 19, 82, 88, 34, 18, 18, + 82, 130, 0, 20, 80, 18, 13, 0, 10, 49, 193, 193, + 193, 193, 123, 113, 193, 193, 193, 193, 0, 15, 64, 11, + 5, 0, 11, 35, 35, 65, 65, 49, 240, 48, 8, 12, + 0, 16, 74, 0, 21, 32, 8, 4, 0, 9, 66, 34, + 240, 112, 25, 10, 240, 193, 129, 145, 130, 129, 145, 129, + 145, 130, 129, 145, 130, 129, 145, 129, 145, 130, 129, 145, + 0, 7, 48, 39, 12, 240, 240, 148, 114, 34, 82, 66, + 66, 66, 50, 97, 50, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 50, 66, 66, 66, + 82, 34, 116, 0, 9, 80, 24, 9, 240, 240, 17, 99, + 66, 18, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 86, 0, 7, 30, 13, 240, 240, 197, 113, + 51, 81, 83, 65, 98, 49, 114, 178, 178, 162, 178, 162, + 162, 162, 177, 178, 162, 97, 50, 97, 58, 0, 10, 16, + 26, 11, 240, 240, 84, 97, 50, 65, 82, 146, 146, 130, + 145, 130, 163, 162, 162, 146, 146, 146, 130, 50, 50, 69, + 0, 9, 32, 12, 240, 240, 194, 162, 147, 129, 18, 129, + 18, 113, 34, 113, 34, 97, 50, 81, 66, 81, 66, 65, + 82, 74, 130, 162, 162, 162, 162, 0, 9, 64, 24, 11, + 240, 240, 87, 65, 161, 145, 161, 164, 148, 147, 147, 146, + 146, 146, 146, 145, 146, 50, 50, 69, 0, 9, 34, 12, + 240, 240, 196, 98, 146, 146, 146, 162, 161, 35, 84, 34, + 66, 82, 50, 98, 34, 98, 34, 98, 34, 98, 49, 98, + 50, 81, 81, 66, 100, 0, 9, 80, 26, 12, 240, 240, + 121, 50, 82, 33, 113, 177, 162, 161, 177, 162, 161, 177, + 177, 162, 161, 177, 162, 161, 177, 0, 9, 112, 38, 12, + 240, 240, 133, 98, 65, 66, 97, 50, 97, 50, 97, 51, + 81, 66, 65, 99, 17, 132, 98, 51, 65, 83, 33, 114, + 33, 114, 33, 114, 33, 113, 65, 82, 85, 0, 9, 80, + 32, 12, 240, 240, 148, 98, 65, 81, 82, 50, 97, 50, + 98, 34, 98, 34, 98, 34, 98, 50, 82, 66, 51, 86, + 162, 162, 146, 146, 146, 100, 0, 10, 12, 4, 240, 146, + 34, 240, 240, 66, 34, 240, 240, 64, 16, 5, 240, 177, + 51, 35, 240, 240, 115, 35, 65, 65, 49, 240, 240, 48, + 26, 11, 240, 225, 145, 146, 145, 145, 145, 146, 130, 145, + 145, 162, 161, 177, 177, 162, 161, 177, 177, 177, 162, 0, + 5, 96, 11, 12, 0, 12, 10, 0, 6, 42, 0, 18, + 32, 26, 11, 240, 129, 177, 162, 161, 177, 177, 162, 162, + 161, 177, 146, 145, 145, 145, 146, 145, 145, 145, 145, 146, + 0, 6, 80, 29, 11, 240, 240, 85, 81, 66, 49, 98, + 34, 82, 34, 82, 146, 130, 146, 130, 145, 146, 145, 161, + 161, 240, 240, 18, 146, 0, 7, 80, 58, 18, 0, 7, + 54, 162, 98, 114, 145, 82, 177, 65, 68, 17, 33, 49, + 66, 50, 49, 33, 50, 65, 65, 33, 34, 81, 65, 33, + 34, 81, 65, 33, 33, 81, 66, 33, 33, 81, 65, 49, + 33, 66, 49, 65, 34, 50, 18, 97, 51, 33, 130, 177, + 97, 130, 136, 0, 14, 32, 36, 16, 0, 8, 98, 226, + 209, 17, 209, 18, 193, 33, 177, 49, 177, 50, 161, 65, + 145, 81, 152, 129, 97, 113, 113, 113, 114, 97, 129, 81, + 146, 52, 85, 0, 12, 32, 38, 14, 240, 240, 200, 130, + 50, 114, 66, 98, 66, 98, 66, 98, 66, 98, 65, 114, + 49, 134, 130, 66, 98, 82, 82, 98, 66, 98, 66, 98, + 66, 98, 66, 82, 57, 0, 11, 16, 32, 16, 0, 6, + 102, 130, 98, 66, 145, 65, 161, 50, 161, 34, 226, 226, + 226, 226, 226, 227, 226, 161, 51, 129, 82, 129, 99, 97, + 135, 0, 12, 64, 39, 17, 0, 6, 57, 162, 82, 130, + 114, 98, 129, 98, 130, 82, 145, 82, 146, 66, 146, 66, + 146, 66, 146, 66, 146, 66, 145, 82, 130, 82, 129, 98, + 114, 98, 97, 106, 0, 13, 80, 33, 14, 240, 240, 203, + 82, 81, 98, 97, 82, 97, 82, 194, 194, 65, 114, 65, + 119, 114, 65, 114, 65, 114, 194, 194, 194, 113, 66, 113, + 43, 0, 10, 112, 31, 13, 240, 240, 155, 66, 81, 82, + 97, 66, 97, 66, 178, 178, 65, 98, 65, 103, 98, 65, + 98, 65, 98, 178, 178, 178, 178, 150, 0, 10, 80, 38, + 18, 0, 7, 70, 162, 98, 98, 145, 98, 242, 240, 17, + 240, 18, 240, 18, 240, 18, 240, 18, 134, 34, 162, 66, + 162, 82, 146, 97, 146, 98, 130, 130, 98, 166, 0, 14, + 32, 40, 19, 0, 7, 22, 86, 66, 146, 98, 146, 98, + 146, 98, 146, 98, 146, 98, 146, 98, 146, 109, 98, 146, + 98, 146, 98, 146, 98, 146, 98, 146, 98, 146, 98, 146, + 70, 86, 0, 14, 64, 23, 8, 240, 150, 66, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 70, 0, 6, 32, 29, 11, 240, 240, 102, 114, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 145, 82, 34, 99, 240, 48, 40, 17, 0, + 6, 54, 68, 82, 113, 114, 97, 130, 81, 146, 65, 162, + 49, 178, 33, 194, 18, 195, 18, 178, 49, 178, 65, 162, + 66, 146, 82, 130, 97, 130, 98, 114, 114, 70, 99, 0, + 13, 26, 14, 240, 240, 198, 162, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 113, 66, 113, 44, + 0, 10, 96, 65, 24, 0, 9, 19, 212, 98, 194, 130, + 179, 131, 145, 18, 129, 17, 145, 18, 129, 18, 129, 18, + 129, 33, 113, 34, 129, 34, 97, 34, 129, 49, 81, 50, + 129, 49, 81, 50, 129, 65, 49, 66, 129, 65, 49, 66, + 129, 66, 33, 66, 129, 81, 17, 82, 129, 83, 82, 129, + 97, 98, 86, 65, 71, 0, 18, 32, 52, 20, 0, 7, + 68, 149, 82, 161, 114, 161, 113, 17, 145, 113, 33, 129, + 113, 34, 113, 113, 50, 97, 113, 65, 97, 113, 81, 81, + 113, 97, 65, 113, 98, 49, 113, 113, 49, 113, 129, 33, + 113, 145, 17, 113, 147, 113, 162, 85, 145, 0, 15, 64, + 39, 18, 0, 7, 54, 162, 97, 130, 130, 97, 146, 82, + 162, 65, 178, 50, 194, 34, 194, 34, 194, 34, 194, 34, + 194, 50, 177, 66, 162, 82, 145, 98, 130, 114, 98, 166, + 0, 14, 48, 32, 13, 240, 240, 152, 114, 66, 82, 66, + 82, 82, 66, 82, 66, 82, 66, 82, 66, 66, 82, 66, + 86, 114, 178, 178, 178, 178, 178, 150, 0, 10, 80, 43, + 18, 0, 7, 54, 177, 97, 130, 130, 97, 146, 82, 162, + 65, 178, 50, 194, 34, 194, 34, 194, 34, 194, 34, 194, + 35, 177, 66, 162, 66, 161, 98, 130, 114, 98, 166, 242, + 240, 34, 240, 53, 0, 7, 38, 17, 0, 6, 57, 162, + 66, 146, 82, 130, 82, 130, 82, 130, 82, 130, 66, 146, + 65, 166, 178, 49, 178, 50, 162, 65, 162, 81, 146, 82, + 130, 98, 114, 113, 86, 84, 0, 13, 28, 11, 240, 240, + 85, 81, 65, 65, 97, 49, 161, 162, 162, 147, 163, 148, + 147, 146, 146, 146, 33, 97, 49, 82, 69, 0, 8, 112, + 28, 16, 0, 6, 14, 33, 82, 81, 33, 82, 81, 130, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 198, 0, 12, 96, 40, 18, 0, 6, 102, 85, 66, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 114, 113, 146, 81, 182, 0, 14, 48, 40, 18, 0, 6, + 102, 100, 66, 145, 113, 145, 114, 113, 130, 113, 145, 113, + 146, 81, 177, 81, 177, 81, 178, 49, 209, 49, 210, 33, + 210, 17, 241, 17, 242, 240, 33, 240, 33, 0, 14, 80, + 65, 24, 0, 9, 5, 37, 20, 35, 66, 81, 81, 65, + 97, 82, 49, 81, 97, 97, 49, 65, 114, 81, 33, 81, + 129, 82, 17, 81, 130, 82, 81, 161, 82, 81, 161, 97, + 81, 162, 66, 65, 193, 67, 49, 194, 33, 33, 33, 210, + 33, 34, 17, 225, 17, 65, 17, 227, 66, 240, 17, 82, + 240, 17, 97, 0, 19, 40, 18, 0, 6, 101, 85, 82, + 129, 129, 113, 146, 81, 178, 65, 193, 49, 210, 17, 243, + 240, 18, 241, 17, 225, 34, 209, 50, 177, 82, 145, 98, + 145, 114, 113, 146, 68, 117, 0, 13, 96, 32, 17, 0, + 6, 53, 115, 66, 145, 98, 113, 114, 97, 146, 81, 162, + 49, 179, 17, 210, 17, 226, 242, 242, 242, 242, 242, 242, + 242, 214, 0, 13, 64, 28, 16, 0, 6, 28, 65, 146, + 49, 146, 210, 226, 210, 210, 210, 226, 210, 210, 225, 226, + 210, 210, 161, 50, 146, 46, 0, 12, 32, 26, 8, 240, + 22, 34, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 102, 240, 240, 64, 59, + 23, 0, 8, 85, 38, 68, 65, 98, 113, 98, 82, 113, + 113, 97, 113, 113, 97, 97, 129, 98, 81, 145, 82, 81, + 95, 6, 97, 65, 33, 49, 162, 49, 33, 49, 177, 33, + 49, 49, 177, 33, 65, 17, 194, 17, 65, 17, 210, 81, + 17, 210, 97, 226, 97, 240, 113, 0, 18, 32, 26, 8, + 240, 22, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 38, 240, 240, 64, + 14, 13, 82, 146, 18, 114, 50, 82, 82, 50, 114, 0, + 34, 48, 8, 13, 0, 35, 107, 240, 240, 176, 10, 5, + 81, 66, 65, 65, 81, 0, 12, 96, 26, 11, 0, 12, + 100, 82, 35, 49, 82, 49, 82, 146, 116, 67, 34, 49, + 82, 49, 82, 49, 67, 68, 19, 0, 8, 64, 34, 12, + 240, 177, 147, 162, 162, 162, 162, 162, 162, 35, 84, 34, + 66, 67, 50, 82, 50, 82, 50, 82, 50, 82, 50, 82, + 50, 66, 66, 65, 116, 0, 9, 80, 21, 11, 0, 12, + 101, 81, 65, 66, 130, 146, 146, 146, 146, 162, 81, 52, + 18, 99, 0, 8, 112, 34, 13, 240, 240, 81, 163, 178, + 178, 178, 178, 178, 103, 81, 67, 66, 82, 50, 98, 50, + 98, 50, 98, 50, 98, 50, 98, 66, 82, 67, 51, 85, + 19, 0, 10, 20, 10, 0, 11, 68, 82, 49, 65, 66, + 40, 34, 130, 130, 130, 146, 131, 33, 84, 0, 8, 24, + 9, 240, 130, 99, 81, 129, 114, 114, 114, 86, 82, 114, + 114, 114, 114, 114, 114, 114, 114, 86, 0, 7, 16, 31, + 12, 0, 13, 104, 50, 51, 50, 82, 50, 82, 50, 82, + 66, 50, 100, 113, 177, 178, 183, 65, 98, 33, 129, 33, + 129, 34, 97, 86, 240, 16, 37, 14, 240, 240, 17, 179, + 194, 194, 194, 194, 194, 194, 35, 114, 17, 19, 99, 50, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 66, 69, 37, 0, 10, 96, 20, 6, 240, 66, 66, + 240, 225, 51, 66, 66, 66, 66, 66, 66, 66, 66, 52, + 240, 240, 128, 23, 5, 240, 18, 50, 240, 145, 35, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 49, + 49, 144, 35, 14, 240, 240, 17, 179, 194, 194, 194, 194, + 194, 194, 52, 82, 65, 114, 49, 130, 33, 146, 17, 164, + 162, 33, 146, 34, 130, 50, 114, 65, 85, 52, 0, 10, + 96, 24, 8, 240, 65, 83, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 6, + 32, 42, 19, 0, 21, 97, 35, 51, 83, 17, 19, 17, + 19, 83, 51, 50, 82, 66, 66, 82, 66, 66, 82, 66, + 66, 82, 66, 66, 82, 66, 66, 82, 66, 66, 82, 66, + 66, 53, 36, 36, 0, 14, 64, 30, 14, 0, 16, 17, + 35, 99, 17, 19, 99, 50, 98, 66, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 69, 37, 0, 10, + 96, 27, 13, 0, 15, 5, 113, 81, 82, 82, 50, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 50, 82, 81, 81, + 117, 0, 10, 48, 32, 13, 0, 15, 1, 35, 85, 34, + 82, 66, 82, 82, 66, 82, 66, 82, 66, 82, 66, 82, + 66, 66, 83, 49, 102, 114, 178, 178, 178, 150, 240, 80, + 33, 14, 0, 16, 21, 17, 97, 67, 82, 82, 81, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 82, 82, 83, 51, + 101, 18, 194, 194, 194, 194, 166, 240, 16, 19, 10, 0, + 11, 81, 34, 51, 19, 67, 114, 130, 130, 130, 130, 130, + 130, 102, 0, 8, 22, 9, 0, 10, 52, 50, 49, 49, + 65, 50, 130, 131, 116, 114, 33, 66, 33, 66, 52, 0, + 7, 32, 21, 8, 0, 6, 33, 113, 98, 86, 50, 98, + 98, 98, 98, 98, 98, 98, 98, 116, 0, 6, 32, 29, + 12, 0, 13, 67, 51, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 20, 83, + 35, 0, 9, 32, 26, 13, 0, 14, 85, 36, 65, 81, + 98, 65, 113, 49, 129, 49, 130, 33, 145, 17, 161, 17, + 163, 177, 193, 0, 10, 80, 39, 19, 0, 21, 52, 52, + 51, 65, 82, 81, 81, 82, 65, 98, 66, 65, 113, 49, + 18, 49, 114, 33, 33, 33, 145, 17, 49, 33, 145, 17, + 66, 163, 66, 177, 82, 177, 0, 15, 112, 26, 14, 0, + 15, 116, 52, 81, 81, 114, 49, 146, 17, 178, 194, 195, + 161, 34, 129, 65, 129, 66, 68, 53, 0, 10, 96, 29, + 12, 0, 13, 68, 36, 49, 81, 82, 65, 97, 49, 114, + 33, 129, 33, 129, 17, 147, 161, 177, 177, 161, 177, 161, + 147, 146, 240, 112, 21, 11, 0, 12, 71, 49, 81, 146, + 145, 146, 130, 145, 146, 130, 81, 49, 81, 56, 0, 8, + 80, 25, 7, 177, 66, 81, 97, 97, 97, 97, 97, 97, + 97, 66, 113, 97, 97, 97, 97, 97, 97, 97, 97, 114, + 240, 240, 23, 4, 130, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 240, + 112, 26, 7, 113, 114, 97, 97, 97, 97, 97, 97, 97, + 97, 114, 65, 97, 97, 97, 97, 97, 97, 97, 97, 66, + 240, 240, 48, 16, 14, 0, 16, 3, 97, 49, 34, 81, + 33, 82, 34, 148, 0, 23, 16, + 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x90, 0x01, 0x00, 0x00, // Offset 400 (0x190) + 0xab, 0x01, 0x00, 0x00, // Offset 427 (0x1ab) + 0xcb, 0x01, 0x00, 0x00, // Offset 459 (0x1cb) + 0xdc, 0x01, 0x00, 0x00, // Offset 476 (0x1dc) + 0xfb, 0x01, 0x00, 0x00, // Offset 507 (0x1fb) + 0x1c, 0x02, 0x00, 0x00, // Offset 540 (0x21c) + 0x2c, 0x02, 0x00, 0x00, // Offset 556 (0x22c) + 0x45, 0x02, 0x00, 0x00, // Offset 581 (0x245) + 0x56, 0x02, 0x00, 0x00, // Offset 598 (0x256) + 0x74, 0x02, 0x00, 0x00, // Offset 628 (0x274) + 0x97, 0x02, 0x00, 0x00, // Offset 663 (0x297) + 0xbf, 0x02, 0x00, 0x00, // Offset 703 (0x2bf) + 0xe0, 0x02, 0x00, 0x00, // Offset 736 (0x2e0) + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x1e, 0x03, 0x00, 0x00, // Offset 798 (0x31e) + 0x3e, 0x03, 0x00, 0x00, // Offset 830 (0x33e) + 0x58, 0x03, 0x00, 0x00, // Offset 856 (0x358) + 0x72, 0x03, 0x00, 0x00, // Offset 882 (0x372) + 0xa4, 0x03, 0x00, 0x00, // Offset 932 (0x3a4) + 0xcb, 0x03, 0x00, 0x00, // Offset 971 (0x3cb) + 0xe2, 0x03, 0x00, 0x00, // Offset 994 (0x3e2) + 0x03, 0x04, 0x00, 0x00, // Offset 1027 (0x403) + 0x1d, 0x04, 0x00, 0x00, // Offset 1053 (0x41d) + 0x32, 0x04, 0x00, 0x00, // Offset 1074 (0x432) + 0x52, 0x04, 0x00, 0x00, // Offset 1106 (0x452) + 0x69, 0x04, 0x00, 0x00, // Offset 1129 (0x469) + 0x7a, 0x04, 0x00, 0x00, // Offset 1146 (0x47a) + 0x8b, 0x04, 0x00, 0x00, // Offset 1163 (0x48b) + 0xa2, 0x04, 0x00, 0x00, // Offset 1186 (0x4a2) + 0xbd, 0x04, 0x00, 0x00, // Offset 1213 (0x4bd) + 0xd7, 0x04, 0x00, 0x00, // Offset 1239 (0x4d7) + 0x04, 0x05, 0x00, 0x00, // Offset 1284 (0x504) + 0x1f, 0x05, 0x00, 0x00, // Offset 1311 (0x51f) + 0x4b, 0x05, 0x00, 0x00, // Offset 1355 (0x54b) + 0x65, 0x05, 0x00, 0x00, // Offset 1381 (0x565) + 0x94, 0x05, 0x00, 0x00, // Offset 1428 (0x594) + 0xae, 0x05, 0x00, 0x00, // Offset 1454 (0x5ae) + 0xda, 0x05, 0x00, 0x00, // Offset 1498 (0x5da) + 0xf1, 0x05, 0x00, 0x00, // Offset 1521 (0x5f1) + 0x20, 0x06, 0x00, 0x00, // Offset 1568 (0x620) + 0x56, 0x06, 0x00, 0x00, // Offset 1622 (0x656) + 0x86, 0x06, 0x00, 0x00, // Offset 1670 (0x686) + 0x9e, 0x06, 0x00, 0x00, // Offset 1694 (0x69e) + 0xbb, 0x06, 0x00, 0x00, // Offset 1723 (0x6bb) + 0xea, 0x06, 0x00, 0x00, // Offset 1770 (0x6ea) + 0x25, 0x07, 0x00, 0x00, // Offset 1829 (0x725) + 0x53, 0x07, 0x00, 0x00, // Offset 1875 (0x753) + 0x70, 0x07, 0x00, 0x00, // Offset 1904 (0x770) + 0x79, 0x07, 0x00, 0x00, // Offset 1913 (0x779) + 0xa8, 0x07, 0x00, 0x00, // Offset 1960 (0x7a8) + 0xc1, 0x07, 0x00, 0x00, // Offset 1985 (0x7c1) + 0xc9, 0x07, 0x00, 0x00, // Offset 1993 (0x7c9) + 0xe5, 0x07, 0x00, 0x00, // Offset 2021 (0x7e5) + 0x01, 0x08, 0x00, 0x00, // Offset 2049 (0x801) + 0x1e, 0x08, 0x00, 0x00, // Offset 2078 (0x81e) + 0x40, 0x08, 0x00, 0x00, // Offset 2112 (0x840) + 0x6c, 0x08, 0x00, 0x00, // Offset 2156 (0x86c) + 0x88, 0x08, 0x00, 0x00, // Offset 2184 (0x888) + 0xba, 0x08, 0x00, 0x00, // Offset 2234 (0x8ba) + 0xdc, 0x08, 0x00, 0x00, // Offset 2268 (0x8dc) + 0xff, 0x08, 0x00, 0x00, // Offset 2303 (0x8ff) + 0x2d, 0x09, 0x00, 0x00, // Offset 2349 (0x92d) + 0x54, 0x09, 0x00, 0x00, // Offset 2388 (0x954) + 0x7d, 0x09, 0x00, 0x00, // Offset 2429 (0x97d) + 0xa0, 0x09, 0x00, 0x00, // Offset 2464 (0x9a0) + 0xc6, 0x09, 0x00, 0x00, // Offset 2502 (0x9c6) + 0xeb, 0x09, 0x00, 0x00, // Offset 2539 (0x9eb) + 0x1f, 0x0a, 0x00, 0x00, // Offset 2591 (0xa1f) + 0x4f, 0x0a, 0x00, 0x00, // Offset 2639 (0xa4f) + 0x77, 0x0a, 0x00, 0x00, // Offset 2679 (0xa77) + 0x9c, 0x0a, 0x00, 0x00, // Offset 2716 (0xa9c) + 0xc2, 0x0a, 0x00, 0x00, // Offset 2754 (0xac2) + 0xfa, 0x0a, 0x00, 0x00, // Offset 2810 (0xafa) + 0x1b, 0x0b, 0x00, 0x00, // Offset 2843 (0xb1b) + 0x3b, 0x0b, 0x00, 0x00, // Offset 2875 (0xb3b) + 0x5a, 0x0b, 0x00, 0x00, // Offset 2906 (0xb5a) + 0x85, 0x0b, 0x00, 0x00, // Offset 2949 (0xb85) + 0xaa, 0x0b, 0x00, 0x00, // Offset 2986 (0xbaa) + 0xc4, 0x0b, 0x00, 0x00, // Offset 3012 (0xbc4) + 0xef, 0x0b, 0x00, 0x00, // Offset 3055 (0xbef) + 0x09, 0x0c, 0x00, 0x00, // Offset 3081 (0xc09) + 0x31, 0x0c, 0x00, 0x00, // Offset 3121 (0xc31) + 0x5a, 0x0c, 0x00, 0x00, // Offset 3162 (0xc5a) + 0x81, 0x0c, 0x00, 0x00, // Offset 3201 (0xc81) + 0xa4, 0x0c, 0x00, 0x00, // Offset 3236 (0xca4) + 0xbc, 0x0c, 0x00, 0x00, // Offset 3260 (0xcbc) + 0xf1, 0x0c, 0x00, 0x00, // Offset 3313 (0xcf1) + 0x2a, 0x0d, 0x00, 0x00, // Offset 3370 (0xd2a) + 0x5e, 0x0d, 0x00, 0x00, // Offset 3422 (0xd5e) + 0x97, 0x0d, 0x00, 0x00, // Offset 3479 (0xd97) + 0xdd, 0x0d, 0x00, 0x00, // Offset 3549 (0xddd) + 0x13, 0x0e, 0x00, 0x00, // Offset 3603 (0xe13) + 0x1d, 0x0e, 0x00, 0x00, // Offset 3613 (0xe1d) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 16, 14, 0, 12, 44, 209, 209, 209, 209, 209, 209, 209, + 209, 209, 0, 16, 27, 15, 0, 13, 22, 22, 113, 97, + 113, 97, 113, 97, 113, 97, 113, 97, 113, 97, 113, 97, + 113, 97, 113, 97, 0, 17, 16, 32, 18, 0, 14, 97, + 119, 66, 177, 66, 177, 66, 177, 65, 193, 50, 193, 49, + 17, 177, 34, 33, 161, 33, 65, 145, 17, 82, 130, 113, + 0, 20, 64, 17, 15, 0, 13, 18, 225, 225, 225, 225, + 225, 225, 225, 225, 236, 0, 17, 16, 31, 19, 0, 19, + 3, 74, 50, 130, 114, 129, 130, 114, 130, 114, 130, 113, + 17, 114, 97, 49, 98, 82, 65, 82, 36, 98, 52, 33, + 0, 20, 48, 33, 18, 0, 16, 117, 67, 240, 18, 58, + 50, 240, 18, 115, 98, 97, 49, 82, 81, 81, 66, 81, + 81, 66, 81, 81, 66, 37, 49, 99, 83, 0, 18, 80, + 16, 16, 0, 16, 14, 65, 241, 241, 241, 241, 241, 241, + 252, 0, 18, 32, 25, 17, 0, 14, 126, 81, 81, 161, + 81, 161, 81, 161, 81, 161, 81, 161, 81, 161, 81, 161, + 81, 173, 0, 19, 48, 17, 16, 0, 14, 13, 241, 241, + 241, 62, 50, 226, 226, 226, 237, 0, 18, 32, 30, 16, + 0, 14, 7, 22, 129, 97, 129, 97, 129, 97, 129, 97, + 39, 97, 49, 177, 49, 177, 49, 177, 49, 66, 81, 53, + 113, 0, 16, 32, 35, 16, 0, 14, 14, 129, 33, 49, + 129, 33, 49, 129, 33, 49, 129, 33, 49, 39, 33, 49, + 49, 113, 49, 49, 113, 49, 49, 81, 17, 49, 54, 37, + 0, 18, 32, 40, 17, 0, 14, 35, 39, 18, 65, 129, + 33, 65, 129, 33, 65, 129, 33, 65, 129, 38, 39, 33, + 65, 49, 113, 65, 49, 113, 65, 49, 113, 65, 49, 35, + 38, 51, 81, 65, 0, 17, 32, 33, 18, 0, 14, 97, + 119, 66, 162, 66, 162, 65, 178, 65, 178, 50, 103, 50, + 113, 114, 17, 97, 113, 49, 81, 97, 81, 65, 66, 98, + 53, 0, 19, 64, 28, 17, 0, 14, 119, 23, 129, 33, + 209, 33, 209, 33, 209, 33, 119, 38, 49, 113, 129, 113, + 129, 81, 17, 134, 38, 0, 19, 48, 34, 18, 0, 15, + 103, 24, 129, 240, 33, 82, 161, 34, 33, 161, 49, 33, + 71, 49, 33, 81, 129, 33, 81, 129, 33, 81, 129, 33, + 81, 29, 50, 0, 19, 112, 32, 19, 0, 16, 87, 53, + 146, 240, 44, 114, 240, 33, 215, 67, 97, 114, 50, 65, + 113, 81, 65, 113, 81, 65, 50, 34, 50, 68, 84, 0, + 19, 80, 26, 15, 0, 13, 29, 49, 146, 49, 145, 65, + 145, 65, 145, 65, 145, 65, 145, 65, 145, 65, 145, 76, + 49, 0, 16, 80, 26, 14, 0, 13, 51, 34, 145, 49, + 145, 49, 145, 59, 49, 145, 49, 145, 49, 145, 49, 145, + 59, 49, 145, 0, 14, 32, 50, 17, 0, 12, 17, 129, + 50, 50, 34, 50, 33, 65, 49, 65, 33, 65, 49, 65, + 33, 65, 49, 65, 38, 54, 33, 65, 49, 65, 33, 65, + 49, 65, 33, 65, 49, 65, 33, 65, 49, 65, 33, 65, + 54, 38, 49, 65, 33, 0, 17, 112, 39, 18, 0, 16, + 35, 51, 82, 65, 66, 97, 65, 65, 113, 65, 50, 118, + 50, 113, 65, 35, 113, 65, 33, 33, 97, 65, 18, 49, + 81, 65, 17, 81, 71, 98, 49, 65, 0, 19, 48, 23, + 17, 0, 15, 98, 240, 18, 226, 241, 242, 226, 17, 194, + 50, 146, 82, 114, 130, 65, 178, 33, 0, 19, 33, 19, + 0, 17, 17, 98, 178, 81, 177, 82, 177, 82, 161, 82, + 178, 67, 145, 33, 34, 18, 113, 67, 50, 81, 97, 83, + 33, 97, 114, 129, 0, 20, 64, 26, 14, 0, 12, 114, + 166, 114, 66, 82, 98, 50, 130, 34, 130, 34, 130, 34, + 130, 50, 98, 82, 66, 118, 0, 14, 80, 21, 17, 0, + 17, 28, 226, 226, 241, 226, 227, 210, 34, 161, 98, 98, + 131, 34, 193, 0, 17, 32, 32, 19, 0, 19, 30, 162, + 81, 177, 82, 162, 81, 177, 82, 162, 67, 146, 18, 33, + 33, 114, 51, 65, 81, 97, 98, 33, 97, 240, 33, 0, + 18, 16, 23, 18, 0, 14, 22, 240, 240, 252, 242, 242, + 242, 226, 242, 19, 162, 98, 113, 162, 35, 193, 0, 18, + 32, 17, 15, 0, 13, 29, 210, 210, 210, 210, 60, 210, + 210, 210, 210, 0, 17, 16, 17, 15, 0, 13, 29, 49, + 225, 225, 225, 235, 65, 225, 225, 236, 0, 17, 16, 23, + 17, 0, 17, 29, 240, 115, 66, 161, 81, 161, 81, 161, + 81, 161, 81, 161, 81, 34, 46, 0, 19, 64, 27, 18, + 0, 14, 22, 240, 240, 223, 1, 240, 180, 194, 66, 146, + 98, 130, 98, 130, 98, 130, 98, 146, 66, 196, 0, 16, + 96, 26, 9, 240, 51, 129, 129, 129, 129, 129, 129, 129, + 129, 133, 65, 129, 129, 129, 129, 129, 129, 129, 129, 129, + 240, 240, 192, 45, 10, 240, 148, 35, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 70, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 145, 240, 240, 32, + 27, 10, 240, 83, 145, 145, 145, 145, 145, 150, 65, 145, + 145, 145, 145, 150, 65, 145, 145, 145, 145, 145, 145, 145, + 240, 240, 112, 44, 10, 240, 147, 50, 66, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 70, 65, 65, 65, 65, + 65, 65, 65, 65, 70, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 145, 240, 240, 32, 26, + 9, 194, 146, 129, 129, 129, 129, 129, 129, 129, 39, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 240, 240, + 128, 47, 12, 240, 65, 114, 50, 98, 49, 113, 49, 113, + 49, 113, 49, 113, 49, 113, 49, 113, 49, 38, 49, 113, + 49, 113, 49, 113, 49, 113, 49, 113, 49, 113, 49, 113, + 49, 113, 49, 113, 49, 113, 49, 113, 49, 0, 6, 32, + 26, 9, 240, 115, 129, 129, 129, 129, 129, 39, 129, 129, + 129, 129, 129, 39, 129, 129, 129, 129, 129, 129, 129, 129, + 240, 224, 44, 11, 240, 211, 82, 49, 97, 49, 97, 49, + 97, 49, 97, 49, 37, 49, 97, 49, 97, 49, 97, 49, + 97, 49, 37, 49, 97, 49, 97, 49, 97, 49, 97, 49, + 97, 49, 97, 49, 97, 49, 161, 0, 5, 96, 23, 21, + 0, 24, 82, 240, 81, 240, 81, 240, 81, 240, 81, 240, + 81, 240, 81, 129, 47, 4, 0, 23, 112, 47, 21, 0, + 6, 99, 240, 81, 240, 81, 240, 81, 240, 81, 240, 81, + 240, 81, 162, 129, 193, 113, 193, 117, 129, 113, 193, 113, + 193, 113, 193, 23, 102, 17, 97, 240, 81, 240, 81, 240, + 81, 240, 81, 240, 81, 0, 11, 32, 54, 19, 0, 6, + 67, 195, 49, 225, 49, 225, 49, 225, 49, 225, 49, 225, + 49, 225, 49, 98, 97, 49, 113, 101, 113, 97, 49, 113, + 97, 49, 113, 97, 49, 113, 37, 49, 40, 65, 49, 225, + 49, 225, 49, 225, 49, 225, 49, 225, 49, 240, 49, 0, + 7, 48, 48, 17, 0, 5, 99, 240, 17, 240, 17, 240, + 17, 240, 17, 240, 17, 240, 17, 240, 17, 114, 113, 129, + 113, 129, 113, 129, 113, 129, 113, 129, 23, 40, 97, 240, + 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 0, + 6, 80, 24, 21, 0, 26, 99, 51, 225, 81, 225, 81, + 225, 81, 225, 81, 225, 81, 225, 81, 81, 47, 4, 0, + 21, 32, 29, 21, 0, 31, 17, 47, 4, 177, 240, 81, + 240, 81, 240, 81, 240, 81, 240, 81, 240, 81, 240, 81, + 240, 81, 240, 81, 0, 9, 32, 47, 18, 0, 6, 3, + 240, 34, 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, + 240, 33, 240, 33, 241, 17, 150, 33, 39, 129, 129, 129, + 129, 129, 129, 39, 129, 129, 129, 129, 129, 129, 129, 129, + 129, 129, 240, 33, 0, 7, 59, 19, 0, 6, 52, 195, + 49, 225, 49, 225, 49, 225, 49, 225, 49, 225, 49, 225, + 49, 225, 49, 178, 17, 49, 41, 49, 49, 113, 97, 49, + 113, 97, 49, 113, 22, 49, 113, 97, 49, 113, 97, 49, + 113, 97, 49, 113, 97, 49, 113, 97, 49, 113, 97, 49, + 240, 49, 0, 7, 48, 46, 18, 0, 6, 3, 240, 34, + 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, + 240, 33, 240, 33, 198, 42, 81, 145, 113, 145, 113, 145, + 113, 145, 113, 145, 113, 145, 113, 145, 113, 145, 113, 240, + 33, 0, 7, 29, 21, 0, 31, 79, 4, 129, 81, 225, + 81, 225, 81, 225, 81, 225, 81, 225, 81, 225, 81, 225, + 81, 225, 81, 225, 81, 0, 8, 112, 9, 21, 0, 42, + 15, 4, 0, 23, 112, 47, 18, 0, 6, 19, 240, 33, + 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, + 240, 33, 240, 33, 240, 33, 240, 33, 243, 33, 72, 33, + 52, 161, 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, + 240, 33, 0, 7, 25, 5, 163, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 240, 32, 8, 3, 240, 240, 97, 240, 240, + 176, 28, 19, 0, 17, 67, 147, 98, 146, 98, 146, 98, + 146, 98, 146, 98, 146, 98, 146, 98, 146, 65, 18, 81, + 54, 39, 0, 21, 96, 28, 19, 0, 16, 82, 104, 82, + 97, 162, 97, 162, 97, 162, 97, 162, 97, 162, 97, 162, + 97, 162, 50, 17, 165, 55, 0, 21, 80, 29, 19, 0, + 18, 3, 83, 145, 114, 130, 114, 130, 114, 129, 130, 115, + 114, 113, 33, 98, 97, 65, 82, 66, 82, 70, 130, 0, + 21, 80, 34, 20, 0, 17, 68, 130, 130, 130, 130, 129, + 17, 114, 114, 17, 114, 113, 49, 98, 98, 49, 98, 97, + 81, 82, 97, 81, 82, 36, 97, 84, 57, 0, 22, 96, + 44, 22, 0, 18, 33, 124, 50, 161, 81, 50, 161, 81, + 50, 161, 81, 49, 177, 81, 34, 103, 65, 33, 17, 97, + 145, 33, 17, 97, 145, 17, 49, 81, 145, 17, 50, 65, + 50, 66, 82, 52, 97, 0, 23, 32, 28, 17, 0, 14, + 119, 23, 129, 33, 209, 33, 209, 33, 209, 33, 119, 33, + 129, 113, 129, 113, 129, 81, 17, 134, 38, 0, 19, 48, + 50, 22, 0, 17, 98, 49, 105, 49, 49, 161, 33, 49, + 49, 161, 33, 49, 34, 161, 33, 49, 34, 161, 37, 33, + 102, 33, 49, 19, 97, 97, 49, 17, 33, 81, 97, 49, + 17, 34, 65, 97, 50, 65, 69, 37, 97, 161, 49, 0, + 23, 16, 34, 18, 0, 15, 103, 50, 178, 65, 178, 51, + 162, 49, 17, 162, 34, 33, 71, 33, 49, 81, 113, 65, + 65, 97, 81, 65, 97, 97, 49, 44, 66, 0, 19, 96, + 35, 18, 0, 15, 103, 129, 114, 24, 113, 240, 33, 240, + 33, 83, 71, 49, 49, 65, 113, 81, 49, 113, 81, 49, + 113, 81, 49, 35, 49, 49, 67, 115, 0, 18, 64, 46, + 17, 0, 14, 34, 55, 18, 65, 49, 65, 33, 65, 49, + 65, 33, 65, 49, 65, 33, 65, 49, 65, 38, 49, 65, + 33, 65, 49, 65, 33, 65, 49, 65, 33, 65, 49, 65, + 33, 65, 55, 22, 49, 113, 0, 17, 112, 39, 18, 0, + 15, 103, 66, 97, 65, 66, 97, 65, 65, 113, 65, 65, + 113, 65, 50, 113, 65, 49, 17, 97, 65, 33, 49, 81, + 65, 33, 50, 65, 65, 17, 82, 55, 113, 49, 0, 20, + 41, 18, 0, 15, 103, 50, 113, 65, 65, 113, 65, 51, + 97, 65, 49, 17, 97, 65, 34, 33, 81, 65, 33, 49, + 81, 65, 33, 65, 65, 65, 17, 81, 65, 65, 17, 97, + 54, 24, 49, 0, 20, 35, 13, 0, 6, 75, 49, 114, + 49, 114, 49, 114, 49, 114, 49, 114, 58, 49, 240, 212, + 114, 66, 66, 98, 50, 98, 50, 98, 50, 98, 66, 66, + 116, 0, 8, 96, 38, 16, 0, 14, 2, 50, 22, 49, + 65, 97, 49, 65, 97, 49, 65, 97, 54, 97, 49, 65, + 97, 49, 65, 97, 49, 65, 97, 49, 65, 97, 54, 97, + 49, 65, 97, 0, 16, 32, 37, 18, 0, 15, 99, 50, + 22, 81, 65, 33, 145, 65, 33, 145, 65, 33, 150, 33, + 145, 65, 33, 145, 65, 33, 145, 65, 33, 145, 65, 33, + 150, 38, 65, 65, 0, 19, 32, 52, 19, 0, 14, 97, + 65, 146, 49, 65, 21, 49, 49, 65, 81, 49, 49, 50, + 81, 49, 49, 50, 81, 53, 49, 97, 49, 49, 35, 81, + 49, 49, 33, 33, 65, 49, 49, 17, 50, 49, 49, 51, + 66, 33, 54, 97, 33, 49, 49, 161, 0, 19, 32, 48, + 20, 0, 15, 65, 49, 178, 49, 50, 21, 65, 49, 49, + 49, 113, 49, 49, 49, 113, 49, 49, 49, 117, 34, 49, + 113, 49, 34, 49, 113, 49, 18, 17, 33, 113, 49, 17, + 49, 17, 113, 50, 67, 117, 102, 49, 0, 22, 32, 40, + 19, 0, 17, 18, 210, 65, 24, 65, 65, 66, 113, 65, + 66, 118, 65, 129, 65, 65, 129, 65, 49, 17, 113, 65, + 49, 33, 97, 65, 33, 65, 86, 17, 98, 49, 66, 113, + 0, 19, 48, 37, 18, 0, 15, 99, 50, 23, 65, 65, + 33, 145, 65, 33, 145, 65, 33, 150, 33, 145, 65, 38, + 65, 65, 33, 145, 65, 33, 145, 65, 33, 150, 38, 65, + 65, 0, 19, 32, 38, 13, 240, 240, 147, 98, 65, 113, + 65, 113, 73, 65, 113, 65, 113, 65, 113, 65, 113, 73, + 65, 229, 114, 50, 82, 82, 66, 82, 66, 82, 66, 82, + 82, 50, 117, 0, 8, 80, 56, 17, 240, 240, 178, 51, + 35, 34, 33, 65, 65, 49, 33, 65, 65, 49, 33, 65, + 65, 49, 38, 69, 33, 65, 65, 49, 33, 65, 65, 49, + 33, 65, 65, 49, 33, 65, 69, 38, 240, 165, 178, 50, + 146, 82, 130, 82, 130, 82, 130, 82, 146, 50, 181, 0, + 11, 48, 33, 16, 0, 12, 49, 240, 18, 23, 97, 129, + 97, 129, 82, 129, 82, 129, 66, 17, 113, 65, 34, 97, + 49, 66, 81, 33, 98, 65, 161, 65, 0, 18, 32, 32, + 18, 0, 16, 34, 50, 178, 65, 177, 81, 177, 81, 162, + 81, 161, 17, 65, 145, 49, 49, 145, 50, 33, 129, 82, + 17, 113, 113, 22, 0, 20, 64, 31, 17, 0, 15, 50, + 39, 97, 65, 177, 65, 162, 65, 162, 65, 147, 65, 145, + 33, 49, 129, 65, 33, 129, 66, 17, 113, 97, 22, 0, + 19, 48, 43, 18, 0, 15, 17, 131, 34, 50, 113, 65, + 65, 113, 65, 65, 98, 65, 65, 97, 86, 83, 65, 65, + 81, 33, 49, 65, 65, 50, 33, 65, 65, 66, 17, 65, + 49, 97, 22, 33, 145, 65, 0, 18, 32, 37, 19, 0, + 17, 2, 240, 50, 41, 98, 98, 146, 98, 145, 113, 146, + 98, 145, 17, 81, 17, 113, 49, 65, 18, 82, 65, 33, + 50, 65, 83, 82, 33, 114, 97, 0, 19, 32, 26, 13, + 0, 10, 18, 194, 177, 17, 146, 17, 145, 49, 114, 49, + 113, 81, 82, 81, 81, 113, 49, 145, 43, 0, 14, 112, + 43, 19, 0, 17, 2, 114, 113, 33, 81, 33, 81, 65, + 49, 65, 49, 97, 17, 97, 33, 97, 17, 97, 33, 97, + 17, 97, 33, 97, 17, 97, 34, 66, 18, 66, 49, 65, + 49, 65, 84, 84, 0, 21, 112, 26, 12, 0, 8, 2, + 177, 177, 149, 83, 50, 66, 82, 34, 113, 34, 113, 34, + 113, 35, 82, 51, 50, 100, 0, 14, 16, 40, 19, 0, + 16, 114, 113, 161, 129, 146, 113, 114, 33, 82, 97, 81, + 65, 113, 97, 50, 97, 97, 33, 33, 81, 97, 33, 49, + 65, 82, 17, 66, 65, 65, 17, 98, 68, 17, 0, 20, + 48, 41, 18, 0, 16, 2, 98, 145, 114, 130, 98, 98, + 33, 81, 17, 65, 81, 49, 33, 65, 97, 33, 49, 49, + 97, 18, 49, 49, 97, 17, 81, 33, 82, 17, 81, 49, + 65, 24, 68, 0, 19, 64, 39, 16, 240, 240, 225, 76, + 177, 163, 50, 146, 50, 146, 49, 162, 49, 177, 49, 177, + 49, 34, 46, 240, 133, 162, 50, 130, 82, 114, 82, 114, + 82, 114, 82, 130, 50, 165, 0, 10, 96, 35, 20, 0, + 17, 100, 84, 240, 240, 43, 40, 240, 240, 83, 99, 98, + 49, 50, 50, 65, 81, 33, 81, 65, 81, 33, 81, 66, + 50, 34, 50, 99, 99, 0, 20, 80, 24, 17, 0, 14, + 127, 240, 240, 181, 178, 66, 130, 98, 114, 98, 114, 98, + 114, 98, 130, 66, 180, 0, 17, 112, 53, 21, 0, 6, + 83, 240, 82, 240, 81, 240, 81, 240, 81, 240, 81, 240, + 85, 161, 81, 146, 65, 65, 161, 65, 65, 161, 65, 65, + 161, 65, 69, 97, 65, 50, 161, 23, 17, 100, 17, 129, + 240, 81, 240, 81, 240, 81, 240, 81, 240, 81, 0, 11, + 32, 57, 20, 0, 6, 99, 212, 49, 241, 49, 241, 49, + 241, 49, 241, 49, 245, 145, 81, 49, 82, 49, 65, 49, + 97, 49, 65, 49, 97, 49, 65, 49, 97, 49, 69, 97, + 49, 65, 49, 33, 58, 49, 51, 145, 49, 241, 49, 241, + 49, 241, 49, 241, 49, 240, 65, 0, 10, 32, 52, 18, + 0, 6, 4, 240, 33, 240, 33, 240, 33, 240, 33, 240, + 33, 240, 33, 147, 81, 97, 65, 81, 97, 65, 81, 97, + 65, 81, 97, 65, 81, 97, 65, 81, 97, 71, 41, 97, + 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, + 0, 7, 57, 18, 240, 241, 240, 51, 240, 33, 240, 33, + 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, + 195, 33, 42, 81, 97, 49, 97, 97, 49, 22, 97, 49, + 97, 97, 49, 97, 97, 49, 97, 97, 49, 22, 97, 49, + 97, 97, 49, 97, 97, 49, 97, 240, 33, 0, 7, 70, + 19, 240, 240, 49, 241, 50, 226, 33, 241, 33, 241, 33, + 241, 33, 241, 33, 241, 33, 241, 33, 241, 33, 164, 17, + 33, 40, 81, 33, 81, 49, 81, 33, 81, 49, 21, 33, + 81, 49, 81, 33, 81, 49, 81, 33, 81, 49, 81, 33, + 81, 49, 21, 33, 81, 49, 81, 33, 81, 49, 81, 33, + 81, 49, 81, 33, 240, 49, 0, 7, 48, 54, 18, 0, + 6, 3, 240, 34, 240, 33, 240, 33, 240, 33, 240, 33, + 240, 33, 240, 33, 240, 33, 240, 33, 198, 42, 81, 97, + 65, 81, 97, 65, 81, 97, 65, 81, 97, 65, 81, 97, + 65, 81, 97, 65, 81, 97, 65, 81, 97, 65, 81, 240, + 33, 0, 7, 10, 5, 0, 6, 35, 35, 35, 0, 8, + 48, 29, 9, 194, 146, 129, 129, 129, 129, 129, 129, 129, + 35, 49, 35, 49, 35, 49, 129, 129, 129, 129, 129, 129, + 129, 129, 129, 240, 240, 128, + 0, 0, // Padding + +}; + +tFont *g_psFontWHangulmyeongjo22pt = (tFont *)g_pui8Hangulmyeongjo22pt; diff --git a/third_party/fonts/ofl/fonts/fonthangulmyeongjo22ptb.c b/third_party/fonts/ofl/fonts/fonthangulmyeongjo22ptb.c new file mode 100644 index 0000000..4e0ce27 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulmyeongjo22ptb.c @@ -0,0 +1,889 @@ +//***************************************************************************** +// +// fonthangulmyeongjo22ptb.c - Font definition for the 22ptpt Hangulmyeongjo bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulmyeongjo +// Size: 22pt +// Bold: yes +// Italic: no +// Memory usage: 6800 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulmyeongjo22ptb[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 21, + + // + // The height of the font. + // + 26, + + // + // The baseline of the font. + // + 20, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x80, 0x0c, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x95, 0x01, 0x00, 0x00, // Offset 405 (0x195) + 0xa4, 0x01, 0x00, 0x00, // Offset 420 (0x1a4) + 0xcb, 0x01, 0x00, 0x00, // Offset 459 (0x1cb) + 0xf8, 0x01, 0x00, 0x00, // Offset 504 (0x1f8) + 0x30, 0x02, 0x00, 0x00, // Offset 560 (0x230) + 0x60, 0x02, 0x00, 0x00, // Offset 608 (0x260) + 0x6a, 0x02, 0x00, 0x00, // Offset 618 (0x26a) + 0x84, 0x02, 0x00, 0x00, // Offset 644 (0x284) + 0x9e, 0x02, 0x00, 0x00, // Offset 670 (0x29e) + 0xae, 0x02, 0x00, 0x00, // Offset 686 (0x2ae) + 0xc0, 0x02, 0x00, 0x00, // Offset 704 (0x2c0) + 0xcb, 0x02, 0x00, 0x00, // Offset 715 (0x2cb) + 0xd2, 0x02, 0x00, 0x00, // Offset 722 (0x2d2) + 0xdb, 0x02, 0x00, 0x00, // Offset 731 (0x2db) + 0xf3, 0x02, 0x00, 0x00, // Offset 755 (0x2f3) + 0x1a, 0x03, 0x00, 0x00, // Offset 794 (0x31a) + 0x32, 0x03, 0x00, 0x00, // Offset 818 (0x332) + 0x50, 0x03, 0x00, 0x00, // Offset 848 (0x350) + 0x6d, 0x03, 0x00, 0x00, // Offset 877 (0x36d) + 0x8c, 0x03, 0x00, 0x00, // Offset 908 (0x38c) + 0xa4, 0x03, 0x00, 0x00, // Offset 932 (0x3a4) + 0xc5, 0x03, 0x00, 0x00, // Offset 965 (0x3c5) + 0xdf, 0x03, 0x00, 0x00, // Offset 991 (0x3df) + 0x04, 0x04, 0x00, 0x00, // Offset 1028 (0x404) + 0x24, 0x04, 0x00, 0x00, // Offset 1060 (0x424) + 0x32, 0x04, 0x00, 0x00, // Offset 1074 (0x432) + 0x43, 0x04, 0x00, 0x00, // Offset 1091 (0x443) + 0x5d, 0x04, 0x00, 0x00, // Offset 1117 (0x45d) + 0x68, 0x04, 0x00, 0x00, // Offset 1128 (0x468) + 0x82, 0x04, 0x00, 0x00, // Offset 1154 (0x482) + 0xa0, 0x04, 0x00, 0x00, // Offset 1184 (0x4a0) + 0xd9, 0x04, 0x00, 0x00, // Offset 1241 (0x4d9) + 0xff, 0x04, 0x00, 0x00, // Offset 1279 (0x4ff) + 0x25, 0x05, 0x00, 0x00, // Offset 1317 (0x525) + 0x45, 0x05, 0x00, 0x00, // Offset 1349 (0x545) + 0x6c, 0x05, 0x00, 0x00, // Offset 1388 (0x56c) + 0x8e, 0x05, 0x00, 0x00, // Offset 1422 (0x58e) + 0xad, 0x05, 0x00, 0x00, // Offset 1453 (0x5ad) + 0xd3, 0x05, 0x00, 0x00, // Offset 1491 (0x5d3) + 0xfb, 0x05, 0x00, 0x00, // Offset 1531 (0x5fb) + 0x12, 0x06, 0x00, 0x00, // Offset 1554 (0x612) + 0x30, 0x06, 0x00, 0x00, // Offset 1584 (0x630) + 0x58, 0x06, 0x00, 0x00, // Offset 1624 (0x658) + 0x73, 0x06, 0x00, 0x00, // Offset 1651 (0x673) + 0xb1, 0x06, 0x00, 0x00, // Offset 1713 (0x6b1) + 0xe3, 0x06, 0x00, 0x00, // Offset 1763 (0x6e3) + 0x0a, 0x07, 0x00, 0x00, // Offset 1802 (0x70a) + 0x2a, 0x07, 0x00, 0x00, // Offset 1834 (0x72a) + 0x57, 0x07, 0x00, 0x00, // Offset 1879 (0x757) + 0x7e, 0x07, 0x00, 0x00, // Offset 1918 (0x77e) + 0x9c, 0x07, 0x00, 0x00, // Offset 1948 (0x79c) + 0xb8, 0x07, 0x00, 0x00, // Offset 1976 (0x7b8) + 0xe0, 0x07, 0x00, 0x00, // Offset 2016 (0x7e0) + 0x06, 0x08, 0x00, 0x00, // Offset 2054 (0x806) + 0x45, 0x08, 0x00, 0x00, // Offset 2117 (0x845) + 0x6c, 0x08, 0x00, 0x00, // Offset 2156 (0x86c) + 0x8b, 0x08, 0x00, 0x00, // Offset 2187 (0x88b) + 0xa9, 0x08, 0x00, 0x00, // Offset 2217 (0x8a9) + 0xc3, 0x08, 0x00, 0x00, // Offset 2243 (0x8c3) + 0xfd, 0x08, 0x00, 0x00, // Offset 2301 (0x8fd) + 0x17, 0x09, 0x00, 0x00, // Offset 2327 (0x917) + 0x24, 0x09, 0x00, 0x00, // Offset 2340 (0x924) + 0x2c, 0x09, 0x00, 0x00, // Offset 2348 (0x92c) + 0x37, 0x09, 0x00, 0x00, // Offset 2359 (0x937) + 0x52, 0x09, 0x00, 0x00, // Offset 2386 (0x952) + 0x75, 0x09, 0x00, 0x00, // Offset 2421 (0x975) + 0x8a, 0x09, 0x00, 0x00, // Offset 2442 (0x98a) + 0xac, 0x09, 0x00, 0x00, // Offset 2476 (0x9ac) + 0xc1, 0x09, 0x00, 0x00, // Offset 2497 (0x9c1) + 0xd8, 0x09, 0x00, 0x00, // Offset 2520 (0x9d8) + 0xf7, 0x09, 0x00, 0x00, // Offset 2551 (0x9f7) + 0x19, 0x0a, 0x00, 0x00, // Offset 2585 (0xa19) + 0x2d, 0x0a, 0x00, 0x00, // Offset 2605 (0xa2d) + 0x44, 0x0a, 0x00, 0x00, // Offset 2628 (0xa44) + 0x66, 0x0a, 0x00, 0x00, // Offset 2662 (0xa66) + 0x7e, 0x0a, 0x00, 0x00, // Offset 2686 (0xa7e) + 0xa6, 0x0a, 0x00, 0x00, // Offset 2726 (0xaa6) + 0xc2, 0x0a, 0x00, 0x00, // Offset 2754 (0xac2) + 0xdd, 0x0a, 0x00, 0x00, // Offset 2781 (0xadd) + 0xfd, 0x0a, 0x00, 0x00, // Offset 2813 (0xafd) + 0x1d, 0x0b, 0x00, 0x00, // Offset 2845 (0xb1d) + 0x2f, 0x0b, 0x00, 0x00, // Offset 2863 (0xb2f) + 0x46, 0x0b, 0x00, 0x00, // Offset 2886 (0xb46) + 0x5b, 0x0b, 0x00, 0x00, // Offset 2907 (0xb5b) + 0x78, 0x0b, 0x00, 0x00, // Offset 2936 (0xb78) + 0x91, 0x0b, 0x00, 0x00, // Offset 2961 (0xb91) + 0xb8, 0x0b, 0x00, 0x00, // Offset 3000 (0xbb8) + 0xd2, 0x0b, 0x00, 0x00, // Offset 3026 (0xbd2) + 0xef, 0x0b, 0x00, 0x00, // Offset 3055 (0xbef) + 0x04, 0x0c, 0x00, 0x00, // Offset 3076 (0xc04) + 0x1e, 0x0c, 0x00, 0x00, // Offset 3102 (0xc1e) + 0x35, 0x0c, 0x00, 0x00, // Offset 3125 (0xc35) + 0x4f, 0x0c, 0x00, 0x00, // Offset 3151 (0xc4f) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 10, 0, 32, 64, 20, 5, 243, 35, 35, 35, 35, + 34, 50, 50, 50, 50, 50, 50, 50, 211, 35, 35, 240, + 192, 15, 7, 226, 18, 34, 18, 34, 18, 34, 18, 34, + 18, 0, 16, 112, 39, 14, 0, 5, 98, 49, 130, 34, + 130, 34, 130, 34, 129, 50, 76, 82, 34, 130, 34, 130, + 34, 129, 50, 114, 49, 107, 82, 34, 130, 34, 129, 50, + 114, 49, 130, 34, 0, 11, 48, 45, 12, 240, 210, 134, + 82, 18, 18, 50, 34, 33, 50, 34, 33, 50, 34, 99, + 18, 114, 18, 132, 164, 133, 114, 19, 98, 34, 33, 50, + 34, 33, 50, 34, 33, 50, 34, 34, 34, 18, 86, 130, + 162, 0, 6, 96, 56, 20, 0, 8, 18, 98, 130, 19, + 35, 130, 52, 18, 114, 66, 34, 129, 82, 33, 145, 81, + 34, 130, 66, 18, 161, 50, 34, 165, 34, 37, 178, 19, + 49, 146, 19, 65, 145, 34, 81, 130, 19, 65, 145, 35, + 65, 130, 35, 49, 130, 66, 33, 146, 83, 0, 15, 96, + 48, 19, 0, 7, 116, 226, 34, 194, 50, 194, 50, 194, + 50, 194, 34, 210, 18, 37, 130, 82, 132, 82, 114, 34, + 65, 114, 50, 50, 98, 82, 33, 114, 82, 18, 114, 99, + 130, 99, 81, 50, 66, 18, 50, 69, 68, 0, 14, 96, + 10, 4, 130, 34, 34, 34, 33, 0, 9, 112, 26, 8, + 209, 97, 98, 82, 98, 82, 98, 82, 98, 98, 98, 98, + 98, 98, 114, 98, 98, 114, 113, 129, 129, 240, 240, 64, + 26, 8, 129, 129, 114, 114, 98, 114, 98, 114, 98, 98, + 98, 98, 98, 98, 82, 98, 98, 82, 97, 97, 97, 240, + 240, 144, 16, 10, 240, 130, 130, 88, 40, 82, 83, 20, + 40, 82, 130, 0, 19, 48, 18, 13, 0, 10, 34, 178, + 178, 178, 178, 123, 98, 178, 178, 178, 178, 0, 15, 64, + 11, 6, 0, 13, 67, 52, 36, 66, 50, 240, 96, 7, + 13, 0, 17, 123, 0, 23, 9, 5, 0, 11, 35, 35, + 35, 240, 192, 24, 11, 240, 226, 146, 145, 146, 145, 146, + 146, 145, 146, 146, 130, 146, 145, 146, 146, 130, 146, 145, + 146, 0, 8, 39, 12, 240, 240, 148, 114, 34, 82, 66, + 66, 66, 50, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 50, 66, 66, 66, + 82, 34, 116, 0, 9, 80, 24, 9, 240, 240, 17, 99, + 66, 18, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 86, 0, 7, 30, 13, 240, 240, 197, 114, + 50, 82, 66, 81, 98, 65, 98, 178, 178, 162, 178, 162, + 163, 147, 162, 162, 162, 97, 51, 81, 58, 0, 10, 16, + 29, 12, 240, 240, 148, 113, 50, 81, 82, 65, 82, 162, + 146, 146, 132, 164, 163, 162, 162, 162, 162, 49, 82, 52, + 34, 85, 0, 9, 96, 31, 13, 240, 240, 242, 178, 163, + 163, 148, 145, 18, 130, 18, 129, 34, 113, 50, 98, 50, + 97, 66, 82, 66, 91, 130, 178, 178, 178, 0, 10, 48, + 24, 11, 240, 240, 102, 66, 145, 146, 146, 133, 163, 162, + 147, 146, 146, 146, 146, 145, 146, 51, 34, 69, 0, 9, + 33, 12, 240, 240, 196, 99, 130, 146, 147, 146, 166, 84, + 34, 67, 66, 50, 98, 34, 98, 34, 98, 34, 98, 49, + 98, 50, 66, 82, 50, 100, 0, 9, 80, 26, 12, 240, + 240, 121, 49, 98, 33, 98, 162, 162, 162, 146, 162, 162, + 146, 162, 162, 161, 162, 162, 162, 161, 0, 9, 112, 37, + 12, 240, 240, 149, 82, 66, 50, 98, 34, 98, 34, 98, + 34, 98, 51, 50, 86, 102, 82, 51, 65, 83, 34, 98, + 34, 98, 34, 98, 34, 97, 66, 66, 100, 0, 9, 80, + 32, 12, 240, 240, 148, 98, 50, 82, 66, 50, 82, 50, + 98, 34, 98, 34, 98, 34, 98, 50, 67, 51, 51, 86, + 162, 162, 146, 146, 131, 100, 0, 10, 14, 5, 240, 163, + 35, 35, 240, 240, 115, 35, 35, 240, 240, 192, 17, 6, + 240, 240, 18, 52, 50, 240, 240, 147, 52, 36, 66, 50, + 240, 240, 240, 26, 11, 240, 226, 130, 130, 145, 146, 130, + 130, 145, 146, 130, 146, 162, 162, 161, 162, 162, 162, 161, + 162, 162, 0, 5, 96, 11, 13, 0, 13, 11, 0, 6, + 107, 0, 19, 96, 26, 11, 240, 114, 162, 162, 161, 162, + 162, 162, 161, 162, 162, 146, 130, 130, 145, 146, 130, 130, + 145, 146, 130, 0, 6, 80, 30, 11, 240, 240, 85, 82, + 50, 50, 82, 34, 82, 34, 82, 34, 82, 130, 146, 130, + 145, 146, 145, 161, 161, 240, 83, 131, 131, 0, 7, 64, + 57, 19, 0, 7, 118, 178, 83, 129, 146, 97, 178, 66, + 67, 18, 19, 49, 51, 35, 34, 34, 35, 50, 50, 34, + 34, 66, 50, 34, 34, 65, 66, 33, 34, 66, 50, 50, + 18, 66, 50, 50, 18, 65, 50, 81, 33, 53, 114, 35, + 113, 82, 161, 115, 98, 182, 0, 15, 16, 38, 18, 0, + 7, 82, 240, 18, 240, 18, 244, 225, 18, 225, 18, 210, + 34, 193, 50, 193, 50, 178, 66, 168, 161, 82, 146, 98, + 129, 114, 129, 114, 114, 130, 70, 70, 0, 13, 96, 38, + 14, 240, 240, 200, 130, 50, 114, 66, 98, 66, 98, 66, + 98, 66, 98, 65, 114, 50, 118, 130, 66, 98, 82, 82, + 98, 66, 98, 66, 98, 66, 98, 66, 82, 57, 0, 11, + 16, 32, 16, 0, 6, 102, 130, 83, 66, 130, 65, 161, + 50, 161, 49, 226, 226, 226, 226, 226, 227, 226, 161, 51, + 145, 67, 114, 83, 83, 134, 0, 12, 64, 39, 17, 0, + 6, 57, 162, 82, 130, 114, 98, 129, 98, 130, 82, 145, + 82, 146, 66, 146, 66, 146, 66, 146, 66, 146, 66, 146, + 66, 130, 82, 129, 98, 114, 98, 82, 105, 0, 13, 96, + 34, 14, 240, 240, 203, 82, 82, 82, 82, 82, 97, 82, + 194, 194, 65, 114, 65, 119, 114, 65, 114, 65, 114, 194, + 194, 113, 66, 113, 66, 98, 43, 0, 10, 112, 31, 13, + 240, 240, 155, 66, 82, 66, 82, 66, 82, 66, 178, 178, + 65, 98, 65, 103, 98, 65, 98, 65, 98, 178, 178, 178, + 178, 150, 0, 10, 80, 38, 18, 0, 7, 70, 162, 83, + 99, 129, 98, 145, 82, 161, 82, 242, 240, 18, 240, 18, + 240, 18, 134, 34, 162, 67, 146, 82, 146, 98, 130, 99, + 114, 130, 83, 166, 0, 14, 32, 40, 19, 0, 7, 22, + 86, 66, 146, 98, 146, 98, 146, 98, 146, 98, 146, 98, + 146, 98, 146, 109, 98, 146, 98, 146, 98, 146, 98, 146, + 98, 146, 98, 146, 98, 146, 70, 86, 0, 14, 64, 23, + 8, 240, 150, 66, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 70, 0, 6, 32, 30, 11, + 240, 240, 102, 114, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 66, 49, 82, + 34, 100, 240, 32, 40, 17, 0, 6, 54, 53, 82, 98, + 114, 97, 130, 81, 146, 65, 162, 49, 178, 33, 194, 18, + 195, 18, 178, 34, 178, 50, 162, 66, 146, 67, 130, 82, + 130, 98, 114, 99, 70, 84, 0, 13, 27, 14, 240, 240, + 198, 162, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 113, 66, 113, 66, 98, 44, 0, 10, 96, 62, + 24, 0, 9, 20, 196, 98, 194, 131, 163, 131, 163, 132, + 132, 130, 17, 129, 18, 130, 18, 98, 18, 130, 33, 97, + 34, 130, 34, 81, 34, 130, 34, 65, 50, 130, 50, 49, + 50, 130, 50, 34, 50, 130, 66, 17, 66, 130, 66, 17, + 66, 130, 82, 82, 115, 82, 82, 87, 50, 55, 0, 18, + 32, 50, 20, 0, 7, 68, 134, 67, 146, 115, 130, 115, + 130, 114, 17, 114, 114, 33, 98, 114, 34, 82, 114, 49, + 82, 114, 65, 66, 114, 66, 50, 114, 82, 34, 114, 97, + 34, 114, 98, 18, 114, 116, 114, 131, 114, 131, 86, 114, + 0, 15, 64, 39, 18, 0, 7, 54, 177, 82, 130, 115, + 97, 146, 82, 162, 65, 178, 50, 194, 34, 194, 34, 194, + 34, 194, 34, 194, 50, 177, 66, 162, 82, 145, 99, 114, + 115, 82, 166, 0, 14, 48, 32, 13, 240, 240, 152, 114, + 51, 82, 66, 82, 82, 66, 82, 66, 82, 66, 82, 66, + 66, 82, 66, 86, 114, 178, 178, 178, 178, 178, 150, 0, + 10, 80, 45, 19, 0, 7, 102, 193, 82, 146, 115, 113, + 146, 98, 162, 81, 178, 66, 194, 50, 194, 50, 194, 50, + 194, 50, 194, 51, 177, 82, 162, 83, 146, 99, 114, 131, + 82, 182, 240, 18, 240, 51, 240, 54, 0, 7, 48, 39, + 16, 0, 6, 9, 146, 66, 130, 82, 114, 82, 114, 82, + 114, 82, 114, 66, 130, 51, 134, 162, 35, 146, 50, 146, + 66, 130, 66, 130, 82, 114, 83, 98, 99, 54, 83, 0, + 12, 32, 30, 11, 240, 240, 101, 66, 50, 50, 81, 50, + 81, 50, 146, 147, 148, 133, 132, 147, 146, 146, 33, 98, + 33, 97, 50, 66, 69, 0, 8, 112, 28, 16, 0, 6, + 14, 34, 66, 81, 33, 82, 81, 130, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 198, 0, 12, 96, + 40, 18, 0, 6, 102, 85, 66, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 114, 113, 146, 81, + 182, 0, 14, 48, 38, 18, 0, 6, 102, 85, 66, 146, + 83, 129, 114, 114, 114, 113, 146, 97, 146, 82, 146, 81, + 178, 65, 178, 50, 178, 49, 210, 33, 210, 17, 243, 243, + 242, 240, 33, 0, 14, 80, 63, 24, 0, 9, 6, 21, + 20, 20, 66, 67, 50, 65, 82, 82, 49, 81, 98, 66, + 49, 66, 98, 82, 18, 65, 130, 66, 17, 66, 130, 68, + 65, 146, 82, 81, 162, 66, 66, 162, 67, 49, 194, 51, + 49, 194, 33, 34, 18, 194, 33, 34, 17, 228, 34, 17, + 227, 67, 227, 66, 240, 17, 97, 0, 19, 39, 18, 0, + 6, 102, 69, 67, 130, 98, 114, 130, 97, 162, 65, 179, + 33, 210, 18, 227, 240, 18, 244, 210, 18, 209, 50, 177, + 82, 146, 83, 114, 114, 98, 146, 69, 86, 0, 13, 96, + 31, 17, 0, 6, 54, 84, 67, 114, 98, 113, 115, 82, + 130, 81, 162, 49, 179, 17, 212, 226, 242, 242, 242, 242, + 242, 242, 242, 214, 0, 13, 64, 30, 16, 0, 6, 29, + 49, 131, 50, 130, 65, 131, 195, 210, 210, 211, 195, 210, + 211, 195, 210, 210, 145, 51, 145, 35, 146, 46, 0, 12, + 32, 26, 8, 240, 22, 34, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 102, + 240, 240, 64, 58, 23, 0, 8, 86, 22, 53, 51, 82, + 114, 82, 82, 113, 98, 97, 98, 114, 82, 81, 130, 82, + 81, 95, 6, 98, 49, 18, 49, 162, 49, 18, 49, 162, + 34, 33, 49, 177, 33, 50, 17, 194, 17, 50, 17, 196, + 65, 17, 210, 83, 210, 82, 226, 97, 240, 113, 0, 18, + 32, 26, 8, 240, 22, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 38, + 240, 240, 64, 13, 13, 67, 149, 115, 34, 82, 82, 50, + 114, 0, 34, 48, 8, 13, 0, 35, 107, 240, 240, 176, + 11, 5, 81, 66, 50, 66, 65, 65, 0, 12, 16, 27, + 12, 0, 13, 116, 98, 35, 66, 66, 66, 66, 162, 117, + 82, 50, 66, 66, 66, 66, 66, 51, 17, 52, 19, 0, + 9, 48, 35, 13, 240, 209, 163, 178, 178, 178, 178, 178, + 178, 20, 99, 51, 66, 82, 66, 98, 50, 98, 50, 98, + 50, 98, 50, 97, 66, 82, 67, 50, 81, 21, 0, 10, + 48, 21, 10, 0, 11, 85, 66, 34, 50, 65, 34, 130, + 130, 130, 130, 146, 131, 49, 84, 0, 7, 112, 34, 13, + 240, 240, 81, 163, 178, 178, 178, 178, 178, 118, 82, 51, + 66, 82, 65, 98, 50, 98, 50, 98, 50, 98, 50, 98, + 66, 82, 67, 51, 100, 19, 0, 10, 21, 10, 0, 11, + 68, 82, 34, 65, 66, 40, 34, 130, 130, 130, 146, 65, + 50, 50, 68, 0, 8, 23, 10, 240, 163, 100, 81, 130, + 130, 130, 130, 103, 82, 130, 130, 130, 130, 130, 130, 130, + 130, 102, 0, 8, 31, 12, 0, 13, 119, 66, 34, 82, + 66, 66, 66, 66, 66, 82, 34, 116, 98, 162, 162, 183, + 66, 67, 34, 98, 34, 98, 35, 66, 85, 240, 32, 34, + 13, 240, 194, 163, 178, 178, 178, 178, 178, 178, 20, 99, + 35, 82, 66, 82, 66, 82, 66, 82, 66, 82, 66, 82, + 66, 82, 66, 82, 66, 68, 37, 0, 10, 20, 6, 240, + 66, 66, 240, 225, 51, 66, 66, 66, 66, 66, 66, 66, + 66, 52, 240, 240, 128, 23, 5, 240, 18, 50, 240, 130, + 35, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 34, 49, 144, 34, 14, 240, 242, 179, 194, 194, 194, + 194, 194, 194, 52, 82, 66, 98, 49, 130, 33, 146, 17, + 164, 162, 18, 146, 34, 130, 50, 114, 66, 70, 36, 0, + 10, 96, 24, 7, 240, 17, 67, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 69, 240, + 240, 224, 40, 19, 0, 21, 82, 20, 36, 84, 36, 35, + 82, 66, 66, 82, 66, 66, 82, 66, 66, 82, 66, 66, + 82, 66, 66, 82, 66, 66, 82, 66, 66, 82, 66, 66, + 53, 36, 36, 0, 14, 64, 28, 13, 0, 14, 98, 35, + 85, 34, 82, 66, 82, 66, 82, 66, 82, 66, 82, 66, + 82, 66, 82, 66, 82, 66, 68, 37, 0, 10, 27, 13, + 0, 15, 5, 114, 50, 82, 82, 50, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 50, 82, 82, 50, 117, 0, 10, + 48, 32, 14, 0, 16, 2, 20, 100, 51, 82, 82, 82, + 98, 66, 98, 66, 98, 66, 98, 66, 97, 82, 82, 83, + 50, 103, 114, 194, 194, 194, 166, 240, 112, 32, 14, 0, + 16, 36, 17, 98, 51, 82, 82, 81, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 82, 82, 83, 66, 119, 194, 194, + 194, 194, 166, 240, 16, 18, 10, 0, 11, 66, 19, 55, + 66, 130, 130, 130, 130, 130, 130, 130, 102, 0, 8, 23, + 9, 0, 10, 52, 50, 49, 50, 49, 50, 116, 116, 100, + 33, 66, 33, 66, 34, 49, 68, 0, 7, 32, 21, 9, + 0, 7, 1, 129, 114, 103, 50, 114, 114, 114, 114, 114, + 114, 114, 114, 132, 0, 7, 16, 29, 12, 0, 13, 67, + 51, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 51, 84, 19, 0, 9, 32, + 25, 13, 0, 14, 85, 36, 51, 66, 82, 65, 98, 65, + 114, 33, 130, 33, 130, 18, 147, 163, 177, 193, 0, 10, + 80, 39, 19, 0, 21, 53, 36, 36, 51, 66, 81, 82, + 66, 66, 82, 67, 49, 114, 33, 18, 49, 114, 33, 18, + 33, 130, 33, 34, 17, 147, 52, 147, 66, 178, 66, 177, + 81, 0, 15, 16, 26, 14, 0, 15, 117, 36, 66, 81, + 114, 49, 146, 18, 163, 178, 195, 161, 34, 130, 50, 98, + 66, 69, 37, 0, 10, 96, 29, 12, 0, 13, 69, 35, + 50, 81, 66, 66, 82, 49, 98, 49, 114, 17, 130, 17, + 132, 146, 162, 161, 177, 161, 177, 132, 131, 240, 96, 21, + 11, 0, 12, 72, 49, 66, 130, 146, 130, 130, 146, 130, + 130, 81, 50, 66, 40, 0, 8, 80, 26, 8, 179, 66, + 98, 98, 98, 98, 98, 98, 98, 83, 66, 130, 98, 98, + 98, 98, 98, 98, 98, 98, 115, 240, 240, 64, 23, 4, + 130, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 240, 112, 26, 8, 131, + 114, 98, 98, 98, 98, 98, 98, 98, 98, 130, 66, 98, + 98, 98, 98, 98, 98, 98, 98, 67, 240, 240, 112, 14, + 16, 0, 18, 36, 113, 50, 50, 65, 50, 100, 0, 28, + 64, + 0, 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x91, 0x01, 0x00, 0x00, // Offset 401 (0x191) + 0xab, 0x01, 0x00, 0x00, // Offset 427 (0x1ab) + 0xca, 0x01, 0x00, 0x00, // Offset 458 (0x1ca) + 0xdc, 0x01, 0x00, 0x00, // Offset 476 (0x1dc) + 0xfb, 0x01, 0x00, 0x00, // Offset 507 (0x1fb) + 0x1b, 0x02, 0x00, 0x00, // Offset 539 (0x21b) + 0x2b, 0x02, 0x00, 0x00, // Offset 555 (0x22b) + 0x46, 0x02, 0x00, 0x00, // Offset 582 (0x246) + 0x58, 0x02, 0x00, 0x00, // Offset 600 (0x258) + 0x75, 0x02, 0x00, 0x00, // Offset 629 (0x275) + 0x97, 0x02, 0x00, 0x00, // Offset 663 (0x297) + 0xbb, 0x02, 0x00, 0x00, // Offset 699 (0x2bb) + 0xde, 0x02, 0x00, 0x00, // Offset 734 (0x2de) + 0xfa, 0x02, 0x00, 0x00, // Offset 762 (0x2fa) + 0x1d, 0x03, 0x00, 0x00, // Offset 797 (0x31d) + 0x3d, 0x03, 0x00, 0x00, // Offset 829 (0x33d) + 0x57, 0x03, 0x00, 0x00, // Offset 855 (0x357) + 0x71, 0x03, 0x00, 0x00, // Offset 881 (0x371) + 0xa2, 0x03, 0x00, 0x00, // Offset 930 (0x3a2) + 0xc8, 0x03, 0x00, 0x00, // Offset 968 (0x3c8) + 0xde, 0x03, 0x00, 0x00, // Offset 990 (0x3de) + 0xff, 0x03, 0x00, 0x00, // Offset 1023 (0x3ff) + 0x19, 0x04, 0x00, 0x00, // Offset 1049 (0x419) + 0x33, 0x04, 0x00, 0x00, // Offset 1075 (0x433) + 0x52, 0x04, 0x00, 0x00, // Offset 1106 (0x452) + 0x69, 0x04, 0x00, 0x00, // Offset 1129 (0x469) + 0x7a, 0x04, 0x00, 0x00, // Offset 1146 (0x47a) + 0x8b, 0x04, 0x00, 0x00, // Offset 1163 (0x48b) + 0xa3, 0x04, 0x00, 0x00, // Offset 1187 (0x4a3) + 0xbf, 0x04, 0x00, 0x00, // Offset 1215 (0x4bf) + 0xd9, 0x04, 0x00, 0x00, // Offset 1241 (0x4d9) + 0x06, 0x05, 0x00, 0x00, // Offset 1286 (0x506) + 0x21, 0x05, 0x00, 0x00, // Offset 1313 (0x521) + 0x4d, 0x05, 0x00, 0x00, // Offset 1357 (0x54d) + 0x67, 0x05, 0x00, 0x00, // Offset 1383 (0x567) + 0x95, 0x05, 0x00, 0x00, // Offset 1429 (0x595) + 0xb0, 0x05, 0x00, 0x00, // Offset 1456 (0x5b0) + 0xdc, 0x05, 0x00, 0x00, // Offset 1500 (0x5dc) + 0xf2, 0x05, 0x00, 0x00, // Offset 1522 (0x5f2) + 0x20, 0x06, 0x00, 0x00, // Offset 1568 (0x620) + 0x54, 0x06, 0x00, 0x00, // Offset 1620 (0x654) + 0x83, 0x06, 0x00, 0x00, // Offset 1667 (0x683) + 0x9b, 0x06, 0x00, 0x00, // Offset 1691 (0x69b) + 0xb9, 0x06, 0x00, 0x00, // Offset 1721 (0x6b9) + 0xe7, 0x06, 0x00, 0x00, // Offset 1767 (0x6e7) + 0x22, 0x07, 0x00, 0x00, // Offset 1826 (0x722) + 0x52, 0x07, 0x00, 0x00, // Offset 1874 (0x752) + 0x71, 0x07, 0x00, 0x00, // Offset 1905 (0x771) + 0x7b, 0x07, 0x00, 0x00, // Offset 1915 (0x77b) + 0xaa, 0x07, 0x00, 0x00, // Offset 1962 (0x7aa) + 0xc3, 0x07, 0x00, 0x00, // Offset 1987 (0x7c3) + 0xcb, 0x07, 0x00, 0x00, // Offset 1995 (0x7cb) + 0xe8, 0x07, 0x00, 0x00, // Offset 2024 (0x7e8) + 0x03, 0x08, 0x00, 0x00, // Offset 2051 (0x803) + 0x22, 0x08, 0x00, 0x00, // Offset 2082 (0x822) + 0x42, 0x08, 0x00, 0x00, // Offset 2114 (0x842) + 0x6c, 0x08, 0x00, 0x00, // Offset 2156 (0x86c) + 0x88, 0x08, 0x00, 0x00, // Offset 2184 (0x888) + 0xb9, 0x08, 0x00, 0x00, // Offset 2233 (0x8b9) + 0xda, 0x08, 0x00, 0x00, // Offset 2266 (0x8da) + 0xfd, 0x08, 0x00, 0x00, // Offset 2301 (0x8fd) + 0x21, 0x09, 0x00, 0x00, // Offset 2337 (0x921) + 0x49, 0x09, 0x00, 0x00, // Offset 2377 (0x949) + 0x71, 0x09, 0x00, 0x00, // Offset 2417 (0x971) + 0x94, 0x09, 0x00, 0x00, // Offset 2452 (0x994) + 0xb9, 0x09, 0x00, 0x00, // Offset 2489 (0x9b9) + 0xdc, 0x09, 0x00, 0x00, // Offset 2524 (0x9dc) + 0x0c, 0x0a, 0x00, 0x00, // Offset 2572 (0xa0c) + 0x3c, 0x0a, 0x00, 0x00, // Offset 2620 (0xa3c) + 0x68, 0x0a, 0x00, 0x00, // Offset 2664 (0xa68) + 0x8c, 0x0a, 0x00, 0x00, // Offset 2700 (0xa8c) + 0xb4, 0x0a, 0x00, 0x00, // Offset 2740 (0xab4) + 0xe8, 0x0a, 0x00, 0x00, // Offset 2792 (0xae8) + 0x0a, 0x0b, 0x00, 0x00, // Offset 2826 (0xb0a) + 0x29, 0x0b, 0x00, 0x00, // Offset 2857 (0xb29) + 0x48, 0x0b, 0x00, 0x00, // Offset 2888 (0xb48) + 0x70, 0x0b, 0x00, 0x00, // Offset 2928 (0xb70) + 0x94, 0x0b, 0x00, 0x00, // Offset 2964 (0xb94) + 0xad, 0x0b, 0x00, 0x00, // Offset 2989 (0xbad) + 0xd2, 0x0b, 0x00, 0x00, // Offset 3026 (0xbd2) + 0xeb, 0x0b, 0x00, 0x00, // Offset 3051 (0xbeb) + 0x12, 0x0c, 0x00, 0x00, // Offset 3090 (0xc12) + 0x39, 0x0c, 0x00, 0x00, // Offset 3129 (0xc39) + 0x5f, 0x0c, 0x00, 0x00, // Offset 3167 (0xc5f) + 0x83, 0x0c, 0x00, 0x00, // Offset 3203 (0xc83) + 0x9b, 0x0c, 0x00, 0x00, // Offset 3227 (0xc9b) + 0xce, 0x0c, 0x00, 0x00, // Offset 3278 (0xcce) + 0x07, 0x0d, 0x00, 0x00, // Offset 3335 (0xd07) + 0x3c, 0x0d, 0x00, 0x00, // Offset 3388 (0xd3c) + 0x75, 0x0d, 0x00, 0x00, // Offset 3445 (0xd75) + 0xb6, 0x0d, 0x00, 0x00, // Offset 3510 (0xdb6) + 0xec, 0x0d, 0x00, 0x00, // Offset 3564 (0xdec) + 0xf6, 0x0d, 0x00, 0x00, // Offset 3574 (0xdf6) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 17, 15, 0, 13, 29, 210, 210, 210, 210, 210, 210, 210, + 210, 210, 0, 17, 16, 26, 16, 0, 14, 14, 114, 82, + 114, 82, 114, 82, 114, 82, 114, 82, 114, 82, 114, 82, + 114, 82, 114, 82, 0, 18, 32, 31, 18, 0, 14, 97, + 119, 66, 162, 66, 162, 51, 162, 50, 178, 51, 162, 34, + 17, 162, 18, 34, 146, 18, 50, 132, 82, 115, 113, 0, + 20, 64, 18, 17, 0, 14, 116, 242, 242, 242, 242, 242, + 242, 242, 242, 161, 77, 0, 19, 48, 31, 20, 0, 20, + 4, 58, 82, 114, 146, 114, 146, 114, 146, 99, 146, 98, + 17, 130, 82, 34, 114, 66, 67, 87, 99, 81, 49, 129, + 0, 20, 48, 32, 19, 0, 17, 87, 67, 240, 34, 44, + 50, 240, 34, 240, 34, 101, 98, 82, 50, 82, 66, 82, + 66, 66, 82, 66, 22, 50, 84, 69, 0, 19, 80, 16, + 17, 0, 17, 15, 66, 242, 242, 242, 242, 242, 242, 253, + 0, 19, 48, 27, 18, 0, 15, 111, 82, 66, 162, 66, + 162, 66, 162, 66, 162, 66, 162, 66, 162, 66, 162, 66, + 81, 78, 81, 0, 19, 96, 18, 17, 0, 15, 13, 242, + 242, 242, 62, 82, 242, 242, 242, 161, 77, 0, 19, 48, + 29, 17, 0, 14, 127, 130, 82, 130, 82, 130, 82, 130, + 82, 40, 82, 50, 162, 50, 162, 50, 162, 50, 21, 66, + 52, 130, 0, 17, 32, 34, 17, 0, 14, 127, 117, 50, + 114, 18, 50, 114, 18, 50, 114, 18, 50, 42, 50, 50, + 82, 50, 50, 82, 50, 50, 82, 50, 54, 23, 51, 66, + 0, 17, 112, 36, 17, 0, 14, 20, 42, 50, 117, 50, + 114, 18, 50, 114, 18, 50, 114, 23, 42, 50, 50, 82, + 50, 50, 82, 50, 50, 82, 50, 50, 27, 52, 50, 50, + 0, 17, 32, 35, 19, 0, 15, 66, 120, 51, 178, 51, + 178, 50, 194, 50, 194, 34, 120, 35, 114, 113, 18, 98, + 98, 34, 82, 82, 66, 66, 21, 98, 52, 33, 113, 0, + 19, 48, 28, 18, 0, 15, 111, 1, 130, 18, 210, 18, + 210, 18, 209, 34, 120, 23, 50, 98, 130, 98, 130, 98, + 134, 39, 50, 0, 19, 112, 35, 19, 0, 16, 95, 2, + 49, 67, 240, 18, 67, 162, 19, 18, 161, 50, 18, 72, + 34, 18, 82, 114, 18, 82, 114, 18, 82, 114, 18, 82, + 29, 52, 0, 20, 96, 32, 19, 0, 16, 88, 21, 178, + 129, 139, 131, 240, 17, 200, 36, 98, 98, 34, 82, 82, + 66, 66, 82, 66, 66, 35, 18, 34, 85, 68, 0, 19, + 80, 26, 16, 0, 14, 13, 82, 114, 82, 114, 82, 114, + 82, 114, 82, 114, 82, 114, 82, 114, 82, 114, 92, 66, + 0, 17, 64, 26, 14, 0, 13, 36, 35, 114, 50, 114, + 50, 114, 59, 50, 114, 50, 114, 50, 114, 50, 114, 59, + 50, 114, 0, 14, 32, 49, 18, 0, 14, 17, 51, 19, + 36, 35, 18, 34, 66, 50, 18, 34, 66, 50, 18, 34, + 66, 50, 22, 71, 18, 34, 66, 50, 18, 34, 66, 50, + 18, 34, 66, 50, 18, 34, 66, 50, 18, 34, 71, 22, + 66, 49, 33, 0, 18, 112, 38, 19, 0, 17, 20, 35, + 99, 50, 50, 114, 50, 50, 114, 50, 50, 119, 34, 130, + 50, 35, 114, 50, 18, 18, 98, 50, 18, 34, 82, 52, + 66, 72, 98, 50, 50, 0, 20, 48, 22, 17, 0, 15, + 83, 243, 226, 227, 226, 226, 18, 178, 50, 146, 83, 98, + 115, 66, 162, 33, 0, 19, 33, 19, 0, 17, 18, 67, + 178, 67, 162, 66, 162, 82, 162, 66, 163, 67, 146, 18, + 18, 18, 114, 51, 50, 82, 81, 83, 34, 82, 98, 129, + 0, 20, 64, 26, 14, 0, 12, 99, 180, 131, 35, 82, + 98, 50, 130, 34, 130, 34, 130, 34, 130, 50, 98, 82, + 66, 118, 0, 14, 80, 26, 19, 0, 19, 44, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 20, 211, 35, 162, 99, + 99, 132, 34, 209, 0, 19, 48, 31, 20, 0, 20, 46, + 178, 66, 194, 66, 178, 66, 178, 82, 179, 51, 162, 18, + 18, 34, 114, 51, 66, 82, 66, 98, 34, 82, 113, 161, + 0, 19, 23, 18, 0, 14, 23, 240, 240, 236, 227, 227, + 227, 227, 211, 34, 162, 99, 82, 147, 34, 209, 0, 18, + 32, 17, 15, 0, 13, 29, 210, 210, 210, 210, 60, 210, + 210, 210, 210, 0, 17, 16, 17, 17, 0, 14, 127, 66, + 242, 242, 242, 252, 82, 242, 242, 253, 0, 19, 48, 24, + 17, 0, 17, 30, 67, 67, 131, 66, 146, 66, 146, 66, + 146, 66, 146, 66, 146, 66, 18, 47, 0, 19, 48, 28, + 18, 0, 14, 7, 240, 240, 161, 47, 1, 240, 180, 194, + 66, 146, 98, 130, 98, 130, 98, 130, 98, 146, 66, 196, + 0, 16, 96, 26, 11, 240, 117, 146, 146, 146, 146, 146, + 146, 146, 146, 150, 82, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 0, 6, 32, 45, 11, 240, 180, 51, 51, 66, + 50, 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, 66, + 50, 71, 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, + 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, 146, 240, + 240, 80, 27, 11, 240, 117, 146, 146, 146, 146, 146, 150, + 82, 146, 146, 146, 146, 150, 82, 146, 146, 146, 146, 146, + 146, 146, 240, 240, 144, 44, 11, 240, 194, 67, 51, 51, + 50, 66, 50, 66, 50, 66, 50, 66, 50, 71, 66, 50, + 66, 50, 66, 50, 66, 50, 71, 66, 50, 66, 50, 66, + 50, 66, 50, 66, 50, 66, 50, 66, 50, 146, 240, 240, + 80, 26, 10, 225, 148, 130, 130, 130, 130, 130, 130, 130, + 40, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 240, 240, 192, 46, 13, 240, 81, 130, 51, 99, 34, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 39, + 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 34, 178, 0, 6, + 96, 27, 10, 240, 148, 130, 130, 130, 130, 130, 40, 130, + 130, 130, 130, 130, 40, 130, 130, 130, 130, 130, 130, 130, + 130, 240, 240, 32, 44, 12, 240, 244, 68, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 38, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 38, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 162, 0, 6, 32, + 22, 22, 0, 25, 84, 240, 82, 240, 82, 240, 82, 240, + 82, 240, 82, 240, 82, 129, 47, 5, 0, 25, 46, 22, + 0, 7, 4, 240, 82, 240, 82, 240, 82, 240, 82, 240, + 82, 240, 82, 177, 130, 194, 98, 194, 102, 130, 98, 194, + 98, 194, 68, 108, 34, 102, 130, 240, 82, 240, 82, 240, + 82, 240, 82, 240, 82, 0, 11, 96, 52, 20, 0, 6, + 100, 196, 34, 226, 34, 226, 34, 226, 34, 226, 34, 226, + 34, 98, 98, 34, 114, 82, 34, 114, 86, 114, 82, 34, + 114, 82, 34, 114, 82, 34, 46, 34, 37, 114, 34, 226, + 34, 226, 34, 226, 34, 226, 34, 225, 50, 0, 10, 32, + 47, 18, 0, 5, 117, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 113, 130, 115, 98, 130, 98, 130, + 98, 130, 98, 130, 83, 135, 18, 40, 98, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 0, 7, 24, + 22, 0, 28, 4, 51, 226, 66, 226, 66, 226, 66, 226, + 66, 226, 66, 226, 66, 81, 47, 5, 0, 22, 32, 30, + 22, 0, 32, 81, 47, 5, 33, 130, 240, 82, 240, 82, + 240, 82, 240, 82, 240, 82, 240, 82, 240, 82, 240, 82, + 240, 82, 0, 9, 80, 46, 19, 0, 6, 52, 240, 34, + 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, + 240, 34, 196, 18, 42, 82, 130, 114, 130, 114, 130, 24, + 130, 114, 130, 114, 130, 114, 130, 114, 130, 114, 240, 34, + 0, 9, 96, 59, 19, 0, 6, 52, 196, 18, 226, 18, + 226, 18, 226, 18, 226, 18, 226, 18, 226, 18, 226, 18, + 193, 18, 18, 42, 34, 18, 114, 82, 18, 114, 82, 18, + 114, 22, 18, 114, 82, 18, 114, 82, 18, 114, 82, 18, + 114, 82, 18, 114, 82, 18, 114, 82, 18, 240, 33, 0, + 7, 64, 48, 19, 0, 6, 37, 240, 34, 240, 34, 240, + 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 244, + 34, 42, 18, 56, 98, 146, 98, 146, 98, 146, 98, 146, + 98, 146, 98, 146, 98, 146, 98, 146, 98, 240, 34, 0, + 7, 48, 31, 22, 0, 32, 81, 47, 5, 33, 82, 66, + 226, 66, 226, 66, 226, 66, 226, 66, 226, 66, 226, 66, + 226, 66, 226, 66, 240, 82, 0, 9, 32, 10, 22, 0, + 43, 81, 47, 4, 0, 25, 16, 47, 19, 0, 6, 37, + 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 244, 45, + 34, 53, 146, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 0, 7, 48, 25, 7, 229, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 240, 128, 8, 3, 240, 240, 97, + 240, 240, 176, 29, 20, 0, 17, 65, 115, 163, 98, 162, + 98, 162, 98, 162, 98, 162, 98, 162, 98, 162, 98, 162, + 68, 66, 70, 38, 113, 113, 0, 21, 27, 19, 0, 16, + 83, 73, 82, 82, 162, 82, 162, 82, 162, 82, 162, 82, + 162, 82, 162, 82, 162, 52, 165, 40, 0, 21, 80, 31, + 19, 0, 16, 81, 163, 99, 130, 114, 130, 114, 114, 130, + 114, 130, 100, 114, 98, 18, 98, 82, 50, 82, 51, 82, + 71, 98, 81, 0, 20, 112, 32, 19, 0, 16, 84, 115, + 114, 130, 114, 115, 114, 116, 98, 98, 33, 98, 98, 34, + 82, 82, 65, 82, 82, 66, 66, 36, 97, 68, 41, 0, + 21, 80, 42, 23, 0, 19, 17, 125, 35, 162, 66, 50, + 162, 66, 34, 178, 66, 34, 179, 50, 34, 103, 66, 19, + 114, 130, 20, 98, 130, 17, 34, 82, 132, 50, 66, 20, + 51, 67, 52, 98, 97, 0, 23, 48, 28, 18, 0, 15, + 111, 1, 130, 18, 210, 18, 210, 18, 209, 34, 120, 18, + 130, 98, 130, 98, 130, 98, 134, 39, 50, 0, 19, 112, + 49, 23, 0, 18, 82, 34, 106, 34, 34, 162, 18, 34, + 34, 162, 18, 34, 34, 162, 18, 34, 34, 162, 22, 18, + 103, 18, 34, 19, 98, 82, 34, 20, 82, 82, 36, 33, + 82, 82, 35, 50, 70, 23, 66, 51, 66, 34, 0, 24, + 16, 33, 18, 0, 15, 104, 35, 178, 50, 178, 36, 162, + 36, 161, 49, 34, 56, 18, 34, 66, 97, 66, 50, 82, + 66, 50, 82, 81, 50, 28, 81, 0, 19, 96, 35, 18, + 0, 15, 104, 113, 49, 59, 114, 240, 18, 240, 18, 67, + 72, 34, 18, 66, 98, 50, 50, 98, 50, 50, 98, 50, + 50, 20, 34, 18, 68, 99, 0, 18, 64, 36, 17, 0, + 14, 18, 74, 35, 50, 52, 50, 50, 52, 50, 50, 52, + 50, 50, 57, 50, 52, 50, 50, 52, 50, 50, 52, 50, + 50, 52, 50, 62, 50, 82, 0, 17, 112, 40, 19, 0, + 16, 88, 51, 98, 50, 51, 98, 50, 50, 114, 50, 50, + 114, 50, 50, 114, 50, 36, 98, 50, 33, 34, 82, 50, + 18, 49, 82, 50, 17, 66, 72, 98, 50, 65, 0, 20, + 48, 40, 19, 0, 16, 88, 51, 98, 50, 51, 98, 50, + 51, 98, 50, 34, 17, 98, 50, 34, 18, 82, 50, 33, + 49, 82, 50, 18, 50, 66, 50, 18, 65, 66, 52, 82, + 63, 1, 50, 0, 21, 35, 14, 0, 7, 12, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 74, 66, 240, 229, + 130, 50, 98, 82, 82, 82, 82, 82, 82, 82, 98, 50, + 133, 0, 9, 32, 37, 17, 0, 15, 68, 51, 35, 50, + 22, 50, 50, 82, 50, 50, 82, 55, 82, 50, 50, 82, + 50, 50, 82, 50, 50, 82, 50, 50, 82, 55, 82, 50, + 49, 98, 0, 17, 32, 35, 18, 0, 15, 99, 42, 66, + 50, 18, 130, 50, 18, 130, 50, 18, 135, 18, 130, 50, + 18, 130, 50, 18, 130, 50, 18, 130, 50, 18, 135, 23, + 50, 0, 19, 112, 48, 20, 0, 17, 66, 35, 41, 50, + 34, 50, 21, 50, 34, 35, 66, 50, 34, 34, 82, 54, + 34, 82, 50, 34, 20, 66, 50, 34, 18, 17, 66, 50, + 36, 34, 50, 50, 36, 50, 34, 55, 82, 18, 49, 50, + 146, 0, 20, 32, 48, 21, 0, 16, 33, 49, 195, 19, + 34, 22, 66, 34, 34, 34, 114, 34, 34, 34, 114, 34, + 33, 50, 118, 18, 50, 114, 34, 19, 34, 114, 34, 17, + 18, 18, 114, 36, 33, 18, 114, 35, 52, 118, 87, 50, + 49, 0, 22, 96, 44, 21, 0, 16, 65, 228, 35, 24, + 82, 50, 66, 130, 50, 66, 130, 50, 51, 135, 50, 146, + 50, 51, 130, 50, 34, 18, 114, 50, 34, 34, 98, 50, + 18, 66, 87, 17, 83, 66, 49, 17, 113, 0, 21, 48, + 36, 19, 0, 16, 84, 43, 66, 50, 18, 146, 50, 18, + 146, 50, 18, 151, 18, 65, 66, 50, 22, 82, 50, 18, + 146, 50, 18, 146, 50, 18, 151, 23, 66, 0, 20, 112, + 40, 14, 240, 240, 97, 83, 99, 66, 98, 66, 98, 74, + 66, 98, 66, 98, 66, 98, 66, 98, 74, 66, 97, 132, + 130, 66, 82, 98, 66, 98, 66, 98, 66, 98, 82, 66, + 132, 0, 9, 48, 52, 16, 0, 6, 114, 35, 39, 18, + 34, 50, 34, 18, 34, 50, 34, 18, 34, 54, 22, 50, + 34, 18, 34, 50, 34, 18, 34, 50, 34, 18, 34, 54, + 22, 50, 81, 212, 162, 66, 114, 98, 98, 98, 98, 98, + 98, 98, 114, 66, 164, 0, 10, 96, 34, 17, 0, 13, + 18, 240, 19, 23, 98, 114, 98, 114, 82, 130, 83, 114, + 66, 18, 98, 66, 34, 82, 50, 66, 66, 34, 83, 50, + 33, 113, 66, 0, 19, 48, 31, 19, 0, 17, 19, 20, + 178, 66, 178, 66, 178, 66, 163, 66, 163, 66, 146, 18, + 50, 145, 50, 34, 130, 66, 18, 114, 97, 23, 0, 21, + 80, 31, 19, 0, 17, 19, 40, 114, 50, 178, 66, 178, + 66, 163, 66, 164, 50, 146, 33, 50, 146, 34, 34, 130, + 66, 18, 114, 97, 23, 0, 21, 80, 40, 18, 0, 16, + 19, 20, 35, 98, 50, 50, 98, 50, 50, 82, 66, 50, + 82, 71, 68, 50, 50, 66, 18, 34, 50, 50, 49, 34, + 50, 49, 66, 18, 50, 33, 105, 178, 49, 0, 18, 48, + 36, 19, 0, 17, 2, 240, 51, 25, 98, 98, 146, 98, + 130, 98, 147, 82, 130, 18, 50, 17, 114, 34, 34, 18, + 82, 68, 50, 50, 83, 82, 33, 113, 113, 0, 19, 32, + 25, 13, 0, 10, 18, 194, 179, 146, 17, 146, 18, 114, + 50, 98, 65, 82, 82, 50, 113, 50, 114, 43, 0, 14, + 112, 37, 20, 0, 15, 49, 129, 178, 113, 133, 69, 82, + 50, 34, 50, 50, 84, 82, 34, 84, 82, 34, 84, 82, + 34, 84, 82, 34, 84, 82, 50, 50, 34, 50, 85, 69, + 0, 23, 25, 13, 0, 10, 19, 178, 164, 115, 50, 82, + 82, 50, 114, 34, 114, 34, 114, 35, 83, 51, 51, 101, + 0, 15, 32, 39, 19, 0, 14, 67, 81, 178, 99, 130, + 98, 132, 82, 114, 34, 51, 98, 66, 35, 98, 66, 33, + 18, 82, 66, 18, 34, 66, 68, 65, 82, 34, 17, 83, + 68, 17, 113, 0, 21, 96, 39, 19, 0, 14, 66, 240, + 50, 99, 130, 114, 117, 67, 98, 50, 52, 66, 82, 18, + 33, 66, 82, 18, 34, 50, 82, 17, 65, 50, 84, 66, + 50, 50, 18, 81, 69, 40, 0, 21, 80, 38, 16, 0, + 7, 65, 76, 99, 35, 146, 50, 146, 50, 146, 50, 146, + 50, 146, 50, 18, 46, 240, 133, 162, 50, 130, 82, 114, + 82, 114, 82, 114, 82, 130, 50, 165, 0, 10, 96, 36, + 21, 0, 18, 85, 69, 240, 177, 98, 25, 41, 240, 240, + 100, 84, 114, 34, 50, 34, 82, 66, 18, 66, 66, 66, + 18, 66, 82, 34, 35, 34, 116, 84, 0, 21, 80, 24, + 18, 0, 15, 49, 47, 240, 240, 229, 194, 66, 146, 98, + 130, 98, 130, 98, 130, 98, 146, 66, 196, 0, 19, 51, + 22, 0, 6, 115, 240, 99, 240, 82, 240, 82, 240, 82, + 240, 82, 240, 86, 81, 67, 50, 162, 50, 50, 162, 50, + 50, 162, 50, 50, 162, 50, 54, 98, 55, 107, 50, 115, + 162, 240, 82, 240, 82, 240, 82, 240, 82, 240, 82, 0, + 11, 96, 57, 20, 0, 6, 99, 211, 35, 226, 34, 226, + 34, 226, 34, 226, 34, 230, 147, 34, 34, 83, 34, 34, + 34, 98, 34, 34, 34, 98, 34, 34, 34, 98, 34, 38, + 98, 34, 19, 34, 43, 18, 34, 51, 130, 34, 226, 34, + 226, 34, 226, 34, 226, 34, 240, 50, 0, 10, 32, 53, + 18, 0, 5, 117, 240, 18, 240, 18, 240, 18, 240, 18, + 240, 18, 240, 18, 81, 67, 50, 98, 50, 50, 98, 50, + 50, 98, 50, 50, 98, 50, 50, 98, 50, 50, 98, 25, + 40, 98, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 240, 18, 0, 7, 57, 19, 0, 6, 52, 240, 34, 240, + 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 196, 18, 42, 82, 98, 34, 82, 98, 34, 22, 98, + 34, 82, 98, 34, 82, 98, 34, 82, 98, 34, 22, 98, + 34, 82, 98, 34, 82, 98, 34, 82, 240, 34, 0, 7, + 48, 65, 20, 240, 240, 49, 240, 84, 211, 34, 226, 34, + 226, 34, 226, 34, 226, 34, 226, 34, 226, 34, 226, 34, + 166, 34, 41, 50, 34, 82, 34, 50, 34, 82, 34, 20, + 34, 82, 34, 50, 34, 82, 34, 50, 34, 82, 34, 20, + 34, 82, 34, 20, 34, 82, 34, 50, 34, 82, 34, 50, + 34, 240, 50, 0, 10, 32, 54, 18, 0, 6, 2, 240, + 35, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 183, 43, 50, 98, 50, 50, 98, + 50, 50, 98, 50, 50, 98, 50, 50, 98, 50, 50, 98, + 50, 50, 98, 50, 50, 98, 50, 50, 240, 18, 0, 7, + 10, 5, 0, 6, 35, 35, 35, 0, 8, 48, 29, 9, + 240, 100, 114, 114, 114, 114, 114, 114, 114, 35, 34, 35, + 34, 35, 34, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 240, 240, 128, + 0, // Padding + +}; + +tFont *g_psFontWHangulmyeongjo22ptb = (tFont *)g_pui8Hangulmyeongjo22ptb; diff --git a/third_party/fonts/ofl/fonts/fonthangulmyeongjo24pt.c b/third_party/fonts/ofl/fonts/fonthangulmyeongjo24pt.c new file mode 100644 index 0000000..699d868 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulmyeongjo24pt.c @@ -0,0 +1,935 @@ +//***************************************************************************** +// +// fonthangulmyeongjo24pt.c - Font definition for the 24ptpt Hangulmyeongjo font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulmyeongjo +// Size: 24pt +// Bold: no +// Italic: no +// Memory usage: 7370 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulmyeongjo24pt[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 23, + + // + // The height of the font. + // + 29, + + // + // The baseline of the font. + // + 22, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x54, 0x0d, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x98, 0x01, 0x00, 0x00, // Offset 408 (0x198) + 0xa9, 0x01, 0x00, 0x00, // Offset 425 (0x1a9) + 0xd3, 0x01, 0x00, 0x00, // Offset 467 (0x1d3) + 0x05, 0x02, 0x00, 0x00, // Offset 517 (0x205) + 0x41, 0x02, 0x00, 0x00, // Offset 577 (0x241) + 0x74, 0x02, 0x00, 0x00, // Offset 628 (0x274) + 0x7e, 0x02, 0x00, 0x00, // Offset 638 (0x27e) + 0x9a, 0x02, 0x00, 0x00, // Offset 666 (0x29a) + 0xb6, 0x02, 0x00, 0x00, // Offset 694 (0x2b6) + 0xcb, 0x02, 0x00, 0x00, // Offset 715 (0x2cb) + 0xde, 0x02, 0x00, 0x00, // Offset 734 (0x2de) + 0xea, 0x02, 0x00, 0x00, // Offset 746 (0x2ea) + 0xf2, 0x02, 0x00, 0x00, // Offset 754 (0x2f2) + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x17, 0x03, 0x00, 0x00, // Offset 791 (0x317) + 0x3f, 0x03, 0x00, 0x00, // Offset 831 (0x33f) + 0x58, 0x03, 0x00, 0x00, // Offset 856 (0x358) + 0x76, 0x03, 0x00, 0x00, // Offset 886 (0x376) + 0x93, 0x03, 0x00, 0x00, // Offset 915 (0x393) + 0xb4, 0x03, 0x00, 0x00, // Offset 948 (0x3b4) + 0xce, 0x03, 0x00, 0x00, // Offset 974 (0x3ce) + 0xef, 0x03, 0x00, 0x00, // Offset 1007 (0x3ef) + 0x0a, 0x04, 0x00, 0x00, // Offset 1034 (0x40a) + 0x31, 0x04, 0x00, 0x00, // Offset 1073 (0x431) + 0x56, 0x04, 0x00, 0x00, // Offset 1110 (0x456) + 0x64, 0x04, 0x00, 0x00, // Offset 1124 (0x464) + 0x74, 0x04, 0x00, 0x00, // Offset 1140 (0x474) + 0x90, 0x04, 0x00, 0x00, // Offset 1168 (0x490) + 0x9b, 0x04, 0x00, 0x00, // Offset 1179 (0x49b) + 0xb7, 0x04, 0x00, 0x00, // Offset 1207 (0x4b7) + 0xd7, 0x04, 0x00, 0x00, // Offset 1239 (0x4d7) + 0x12, 0x05, 0x00, 0x00, // Offset 1298 (0x512) + 0x3c, 0x05, 0x00, 0x00, // Offset 1340 (0x53c) + 0x64, 0x05, 0x00, 0x00, // Offset 1380 (0x564) + 0x86, 0x05, 0x00, 0x00, // Offset 1414 (0x586) + 0xaf, 0x05, 0x00, 0x00, // Offset 1455 (0x5af) + 0xd1, 0x05, 0x00, 0x00, // Offset 1489 (0x5d1) + 0xf0, 0x05, 0x00, 0x00, // Offset 1520 (0x5f0) + 0x19, 0x06, 0x00, 0x00, // Offset 1561 (0x619) + 0x43, 0x06, 0x00, 0x00, // Offset 1603 (0x643) + 0x5c, 0x06, 0x00, 0x00, // Offset 1628 (0x65c) + 0x7c, 0x06, 0x00, 0x00, // Offset 1660 (0x67c) + 0xa6, 0x06, 0x00, 0x00, // Offset 1702 (0x6a6) + 0xc1, 0x06, 0x00, 0x00, // Offset 1729 (0x6c1) + 0x04, 0x07, 0x00, 0x00, // Offset 1796 (0x704) + 0x3b, 0x07, 0x00, 0x00, // Offset 1851 (0x73b) + 0x64, 0x07, 0x00, 0x00, // Offset 1892 (0x764) + 0x85, 0x07, 0x00, 0x00, // Offset 1925 (0x785) + 0xb6, 0x07, 0x00, 0x00, // Offset 1974 (0x7b6) + 0xde, 0x07, 0x00, 0x00, // Offset 2014 (0x7de) + 0xfd, 0x07, 0x00, 0x00, // Offset 2045 (0x7fd) + 0x1a, 0x08, 0x00, 0x00, // Offset 2074 (0x81a) + 0x44, 0x08, 0x00, 0x00, // Offset 2116 (0x844) + 0x6e, 0x08, 0x00, 0x00, // Offset 2158 (0x86e) + 0xb5, 0x08, 0x00, 0x00, // Offset 2229 (0x8b5) + 0xe1, 0x08, 0x00, 0x00, // Offset 2273 (0x8e1) + 0x0a, 0x09, 0x00, 0x00, // Offset 2314 (0x90a) + 0x2b, 0x09, 0x00, 0x00, // Offset 2347 (0x92b) + 0x47, 0x09, 0x00, 0x00, // Offset 2375 (0x947) + 0x83, 0x09, 0x00, 0x00, // Offset 2435 (0x983) + 0x9f, 0x09, 0x00, 0x00, // Offset 2463 (0x99f) + 0xac, 0x09, 0x00, 0x00, // Offset 2476 (0x9ac) + 0xb4, 0x09, 0x00, 0x00, // Offset 2484 (0x9b4) + 0xbd, 0x09, 0x00, 0x00, // Offset 2493 (0x9bd) + 0xd9, 0x09, 0x00, 0x00, // Offset 2521 (0x9d9) + 0x00, 0x0a, 0x00, 0x00, // Offset 2560 (0xa00) + 0x15, 0x0a, 0x00, 0x00, // Offset 2581 (0xa15) + 0x3c, 0x0a, 0x00, 0x00, // Offset 2620 (0xa3c) + 0x53, 0x0a, 0x00, 0x00, // Offset 2643 (0xa53) + 0x6d, 0x0a, 0x00, 0x00, // Offset 2669 (0xa6d) + 0x90, 0x0a, 0x00, 0x00, // Offset 2704 (0xa90) + 0xb8, 0x0a, 0x00, 0x00, // Offset 2744 (0xab8) + 0xcd, 0x0a, 0x00, 0x00, // Offset 2765 (0xacd) + 0xe5, 0x0a, 0x00, 0x00, // Offset 2789 (0xae5) + 0x0b, 0x0b, 0x00, 0x00, // Offset 2827 (0xb0b) + 0x25, 0x0b, 0x00, 0x00, // Offset 2853 (0xb25) + 0x52, 0x0b, 0x00, 0x00, // Offset 2898 (0xb52) + 0x72, 0x0b, 0x00, 0x00, // Offset 2930 (0xb72) + 0x8e, 0x0b, 0x00, 0x00, // Offset 2958 (0xb8e) + 0xb2, 0x0b, 0x00, 0x00, // Offset 2994 (0xbb2) + 0xd6, 0x0b, 0x00, 0x00, // Offset 3030 (0xbd6) + 0xeb, 0x0b, 0x00, 0x00, // Offset 3051 (0xbeb) + 0x02, 0x0c, 0x00, 0x00, // Offset 3074 (0xc02) + 0x19, 0x0c, 0x00, 0x00, // Offset 3097 (0xc19) + 0x38, 0x0c, 0x00, 0x00, // Offset 3128 (0xc38) + 0x53, 0x0c, 0x00, 0x00, // Offset 3155 (0xc53) + 0x7e, 0x0c, 0x00, 0x00, // Offset 3198 (0xc7e) + 0x9a, 0x0c, 0x00, 0x00, // Offset 3226 (0xc9a) + 0xba, 0x0c, 0x00, 0x00, // Offset 3258 (0xcba) + 0xd0, 0x0c, 0x00, 0x00, // Offset 3280 (0xcd0) + 0xed, 0x0c, 0x00, 0x00, // Offset 3309 (0xced) + 0x06, 0x0d, 0x00, 0x00, // Offset 3334 (0xd06) + 0x23, 0x0d, 0x00, 0x00, // Offset 3363 (0xd23) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 10, 0, 36, 32, 23, 4, 240, 18, 34, 34, 34, + 34, 34, 49, 49, 49, 49, 49, 49, 49, 49, 49, 162, + 34, 34, 240, 112, 17, 7, 114, 33, 34, 33, 34, 33, + 49, 33, 49, 33, 49, 33, 0, 19, 64, 42, 15, 0, + 6, 34, 49, 145, 65, 145, 50, 145, 50, 130, 49, 146, + 49, 108, 97, 50, 145, 50, 130, 49, 146, 49, 145, 65, + 108, 97, 50, 130, 50, 130, 49, 145, 65, 145, 65, 145, + 50, 0, 14, 50, 14, 240, 240, 65, 209, 181, 114, 33, + 18, 82, 49, 34, 65, 65, 49, 65, 65, 49, 65, 65, + 146, 33, 164, 195, 196, 161, 34, 145, 35, 129, 50, 33, + 81, 50, 34, 65, 50, 34, 65, 34, 67, 33, 34, 102, + 177, 209, 0, 9, 80, 60, 21, 0, 11, 3, 113, 130, + 34, 66, 130, 71, 129, 97, 49, 130, 81, 50, 129, 97, + 49, 145, 97, 33, 161, 81, 49, 161, 65, 49, 68, 68, + 50, 49, 65, 161, 49, 81, 145, 50, 81, 145, 49, 97, + 129, 65, 82, 114, 65, 81, 129, 81, 66, 114, 81, 50, + 129, 115, 0, 19, 16, 51, 21, 0, 11, 36, 240, 18, + 50, 210, 81, 210, 81, 210, 81, 210, 65, 242, 18, 38, + 131, 98, 147, 113, 130, 34, 97, 114, 66, 65, 129, 97, + 65, 114, 98, 33, 130, 116, 130, 130, 147, 99, 97, 51, + 66, 34, 49, 86, 84, 0, 18, 112, 10, 4, 66, 34, + 34, 49, 49, 0, 11, 96, 28, 8, 240, 97, 97, 97, + 98, 97, 98, 98, 82, 98, 98, 98, 98, 98, 98, 113, + 114, 98, 113, 114, 114, 113, 129, 240, 240, 192, 28, 8, + 240, 17, 129, 129, 114, 113, 114, 98, 114, 98, 98, 98, + 98, 98, 98, 97, 98, 98, 82, 98, 82, 97, 97, 0, + 5, 112, 21, 10, 210, 130, 82, 18, 18, 36, 19, 68, + 100, 68, 19, 34, 18, 18, 82, 130, 0, 23, 16, 19, + 14, 0, 12, 114, 194, 194, 194, 194, 124, 114, 194, 194, + 194, 194, 194, 0, 18, 48, 12, 5, 0, 12, 66, 51, + 50, 65, 49, 49, 240, 64, 8, 13, 0, 19, 75, 0, + 26, 32, 10, 5, 0, 12, 67, 35, 35, 240, 240, 32, + 27, 11, 240, 226, 145, 146, 145, 161, 146, 145, 161, 146, + 145, 146, 145, 161, 146, 145, 161, 145, 161, 146, 145, 161, + 0, 9, 64, 40, 13, 0, 6, 117, 114, 50, 82, 82, + 66, 82, 65, 113, 50, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 49, 113, 66, 82, + 66, 82, 82, 50, 117, 0, 12, 25, 10, 240, 240, 65, + 115, 85, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 88, 0, 9, 30, 14, 0, 7, + 68, 130, 51, 82, 82, 81, 114, 194, 194, 194, 178, 194, + 178, 178, 194, 178, 178, 178, 178, 113, 50, 113, 59, 0, + 12, 80, 29, 12, 0, 6, 52, 98, 50, 81, 82, 49, + 98, 162, 161, 161, 161, 149, 163, 163, 162, 162, 162, 162, + 146, 51, 50, 85, 0, 11, 32, 33, 13, 0, 7, 50, + 178, 163, 163, 145, 18, 129, 34, 129, 34, 113, 50, 97, + 66, 97, 66, 81, 82, 65, 98, 75, 146, 178, 178, 178, + 178, 0, 11, 112, 26, 13, 0, 7, 7, 81, 193, 178, + 177, 197, 180, 179, 178, 194, 178, 178, 178, 178, 162, 178, + 52, 50, 101, 0, 12, 16, 33, 13, 0, 7, 52, 115, + 146, 162, 162, 162, 178, 169, 67, 82, 50, 113, 50, 114, + 34, 114, 34, 114, 34, 114, 50, 98, 50, 82, 82, 51, + 116, 0, 12, 27, 13, 0, 6, 90, 49, 113, 49, 129, + 178, 178, 177, 178, 178, 177, 193, 178, 177, 193, 178, 178, + 177, 193, 178, 0, 12, 32, 39, 13, 0, 6, 116, 114, + 66, 66, 83, 50, 98, 50, 98, 50, 98, 66, 66, 83, + 49, 132, 130, 20, 82, 67, 50, 99, 34, 114, 34, 114, + 34, 114, 50, 82, 67, 51, 101, 0, 12, 37, 13, 0, + 6, 116, 130, 50, 82, 82, 50, 98, 50, 114, 34, 114, + 34, 114, 34, 114, 49, 114, 50, 83, 66, 49, 18, 99, + 18, 178, 162, 177, 177, 162, 116, 0, 12, 64, 14, 5, + 240, 243, 35, 35, 240, 240, 195, 35, 35, 0, 5, 112, + 16, 5, 240, 243, 35, 35, 240, 240, 195, 35, 65, 65, + 49, 240, 240, 128, 28, 11, 240, 241, 145, 146, 130, 145, + 145, 146, 130, 145, 145, 146, 146, 161, 177, 162, 162, 161, + 177, 177, 162, 161, 177, 0, 7, 16, 11, 13, 0, 16, + 43, 0, 6, 107, 0, 21, 48, 28, 11, 240, 113, 177, + 162, 161, 177, 177, 162, 162, 161, 177, 162, 146, 145, 145, + 146, 130, 145, 145, 145, 146, 145, 145, 0, 8, 16, 32, + 12, 0, 6, 52, 113, 51, 65, 83, 33, 114, 34, 98, + 34, 98, 161, 162, 161, 161, 161, 177, 161, 177, 177, 240, + 240, 67, 147, 147, 0, 8, 32, 59, 20, 0, 10, 103, + 179, 98, 130, 161, 98, 193, 66, 71, 33, 65, 65, 82, + 49, 34, 49, 97, 65, 34, 34, 82, 65, 33, 50, 82, + 65, 33, 49, 82, 81, 33, 49, 82, 65, 49, 49, 81, + 66, 65, 34, 50, 50, 81, 52, 35, 129, 209, 97, 177, + 130, 114, 183, 0, 18, 48, 42, 18, 0, 7, 81, 240, + 34, 240, 18, 241, 17, 241, 18, 209, 34, 209, 49, 209, + 50, 177, 66, 177, 81, 177, 82, 168, 145, 113, 145, 114, + 113, 130, 113, 145, 113, 146, 82, 146, 69, 86, 0, 16, + 40, 15, 0, 7, 72, 146, 66, 114, 82, 98, 82, 98, + 82, 98, 82, 98, 66, 114, 50, 135, 130, 82, 98, 98, + 82, 114, 66, 114, 66, 114, 66, 114, 66, 98, 82, 82, + 74, 0, 13, 96, 34, 17, 0, 9, 38, 147, 83, 82, + 130, 66, 161, 50, 177, 50, 226, 242, 242, 242, 242, 242, + 240, 18, 242, 177, 66, 145, 98, 129, 115, 82, 150, 0, + 15, 64, 41, 18, 0, 9, 10, 162, 83, 130, 114, 114, + 130, 98, 146, 82, 146, 82, 162, 66, 162, 66, 162, 66, + 162, 66, 162, 66, 162, 66, 146, 82, 146, 82, 130, 98, + 114, 114, 98, 106, 0, 16, 96, 34, 15, 0, 7, 75, + 98, 97, 98, 97, 98, 210, 210, 210, 81, 114, 81, 120, + 114, 81, 114, 81, 114, 210, 210, 210, 129, 66, 113, 82, + 113, 60, 0, 13, 64, 31, 13, 0, 6, 75, 66, 97, + 66, 97, 66, 178, 178, 178, 81, 82, 81, 88, 82, 81, + 82, 81, 82, 178, 178, 178, 178, 178, 150, 0, 12, 32, + 41, 19, 0, 10, 39, 163, 83, 114, 145, 98, 161, 82, + 240, 34, 240, 18, 240, 34, 240, 34, 240, 34, 240, 34, + 150, 34, 178, 82, 162, 82, 162, 98, 146, 114, 130, 131, + 83, 167, 0, 17, 48, 42, 20, 0, 10, 6, 102, 66, + 162, 98, 162, 98, 162, 98, 162, 98, 162, 98, 162, 98, + 162, 110, 98, 162, 98, 162, 98, 162, 98, 162, 98, 162, + 98, 162, 98, 162, 98, 162, 70, 102, 0, 17, 96, 25, + 8, 240, 240, 38, 66, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 7, 32, + 32, 11, 0, 5, 118, 114, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 66, 49, 82, 34, 99, 240, 48, 42, 18, 0, 9, + 6, 69, 82, 130, 98, 113, 130, 97, 146, 81, 162, 65, + 178, 49, 194, 33, 210, 19, 195, 33, 194, 50, 178, 66, + 162, 82, 146, 98, 130, 98, 130, 114, 114, 130, 70, 100, + 0, 16, 27, 15, 0, 7, 70, 178, 210, 210, 210, 210, + 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 129, 67, + 98, 44, 0, 13, 64, 67, 25, 0, 12, 84, 212, 83, + 210, 130, 195, 131, 179, 129, 17, 161, 18, 129, 18, 145, + 18, 129, 33, 129, 34, 129, 34, 113, 34, 129, 49, 97, + 50, 129, 50, 81, 50, 129, 50, 65, 66, 129, 65, 65, + 66, 129, 66, 49, 66, 129, 81, 33, 82, 129, 82, 17, + 82, 129, 98, 98, 114, 98, 99, 70, 167, 0, 22, 16, + 55, 21, 0, 10, 68, 165, 67, 177, 115, 161, 113, 17, + 161, 113, 18, 145, 113, 34, 129, 113, 50, 113, 113, 66, + 97, 113, 81, 97, 113, 82, 81, 113, 98, 65, 113, 114, + 49, 113, 130, 33, 113, 146, 17, 113, 146, 17, 113, 163, + 98, 178, 70, 161, 0, 18, 112, 41, 19, 0, 10, 37, + 194, 82, 145, 130, 113, 162, 82, 178, 65, 194, 50, 210, + 34, 210, 34, 210, 34, 210, 34, 210, 34, 210, 50, 193, + 66, 178, 82, 161, 114, 129, 146, 82, 197, 0, 17, 80, + 33, 14, 0, 7, 9, 114, 66, 98, 82, 82, 98, 66, + 98, 66, 98, 66, 98, 66, 82, 82, 67, 87, 114, 194, + 194, 194, 194, 194, 194, 166, 0, 13, 32, 49, 19, 0, + 10, 37, 194, 82, 145, 130, 113, 162, 82, 178, 65, 194, + 50, 210, 34, 210, 34, 210, 34, 210, 34, 210, 34, 210, + 50, 193, 66, 178, 82, 161, 114, 129, 146, 82, 182, 240, + 18, 240, 50, 240, 67, 240, 67, 0, 7, 48, 40, 18, + 0, 9, 9, 178, 67, 146, 82, 146, 98, 130, 98, 130, + 98, 130, 98, 130, 82, 146, 66, 166, 194, 50, 178, 66, + 162, 82, 146, 82, 146, 98, 130, 114, 114, 115, 70, 100, + 0, 16, 31, 13, 0, 7, 5, 98, 65, 81, 113, 65, + 113, 65, 193, 194, 195, 180, 180, 179, 179, 178, 33, 130, + 33, 130, 49, 98, 66, 66, 102, 0, 12, 29, 17, 0, + 8, 79, 34, 82, 81, 33, 98, 81, 146, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, 214, 0, + 15, 80, 42, 19, 0, 9, 70, 101, 66, 161, 98, 161, + 98, 161, 98, 161, 98, 161, 98, 161, 98, 161, 98, 161, + 98, 161, 98, 161, 98, 161, 98, 161, 98, 161, 99, 130, + 114, 129, 147, 66, 197, 0, 17, 80, 42, 19, 0, 9, + 70, 116, 66, 162, 98, 145, 114, 145, 129, 145, 130, 113, + 146, 113, 161, 97, 178, 81, 193, 81, 194, 49, 210, 49, + 225, 33, 242, 17, 240, 17, 17, 240, 18, 240, 34, 0, + 20, 16, 71, 26, 0, 13, 6, 22, 21, 20, 66, 82, + 81, 81, 97, 97, 81, 81, 98, 82, 49, 81, 114, 97, + 49, 81, 129, 98, 17, 97, 130, 97, 17, 81, 161, 98, + 97, 162, 82, 81, 178, 97, 81, 193, 83, 65, 194, 65, + 17, 49, 225, 49, 34, 33, 226, 33, 49, 33, 241, 17, + 67, 240, 19, 67, 240, 18, 97, 240, 49, 97, 0, 23, + 112, 44, 19, 0, 9, 70, 101, 51, 146, 98, 145, 130, + 113, 162, 81, 194, 49, 226, 33, 226, 17, 240, 18, 240, + 35, 240, 17, 18, 225, 49, 209, 66, 177, 98, 145, 130, + 129, 146, 82, 163, 53, 117, 0, 16, 112, 41, 19, 0, + 9, 70, 116, 67, 146, 98, 145, 130, 113, 162, 81, 178, + 81, 194, 49, 226, 17, 243, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 246, 0, + 17, 64, 33, 18, 0, 9, 30, 65, 162, 81, 146, 81, + 162, 242, 242, 242, 240, 18, 242, 242, 242, 240, 18, 242, + 242, 242, 177, 51, 161, 66, 162, 63, 0, 16, 16, 28, + 8, 240, 22, 34, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 102, + 240, 240, 192, 60, 25, 0, 12, 70, 38, 69, 66, 98, + 129, 98, 98, 129, 113, 113, 113, 130, 97, 113, 130, 98, + 97, 145, 98, 81, 111, 8, 113, 65, 33, 65, 177, 65, + 33, 49, 194, 33, 50, 33, 194, 33, 65, 33, 209, 33, + 65, 33, 209, 17, 83, 227, 98, 242, 98, 241, 113, 240, + 17, 0, 24, 28, 8, 240, 22, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 38, 240, 240, 192, 13, 12, 66, 148, 114, + 34, 82, 81, 49, 129, 0, 36, 32, 8, 14, 0, 42, + 12, 0, 7, 32, 9, 5, 162, 50, 65, 81, 65, 0, + 14, 28, 11, 0, 14, 20, 82, 35, 50, 66, 50, 66, + 146, 131, 83, 18, 66, 50, 50, 66, 50, 66, 50, 51, + 68, 19, 0, 9, 112, 39, 14, 240, 240, 17, 164, 194, + 194, 194, 194, 194, 194, 194, 36, 98, 17, 35, 83, 66, + 82, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 97, + 82, 82, 83, 50, 133, 0, 12, 112, 21, 11, 0, 14, + 36, 82, 50, 50, 81, 49, 146, 146, 146, 146, 146, 162, + 162, 65, 85, 0, 10, 39, 13, 240, 240, 81, 163, 178, + 178, 178, 178, 178, 178, 100, 18, 82, 51, 66, 82, 65, + 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, 98, 66, + 82, 67, 51, 85, 19, 0, 11, 80, 23, 11, 0, 14, + 20, 97, 50, 66, 66, 34, 82, 41, 34, 146, 146, 146, + 162, 162, 49, 100, 0, 10, 16, 26, 10, 240, 163, 100, + 82, 129, 130, 130, 130, 130, 103, 82, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 102, 0, 9, 32, 35, 13, 0, + 16, 73, 50, 50, 82, 82, 66, 82, 66, 82, 66, 82, + 82, 50, 117, 113, 193, 193, 216, 66, 83, 34, 114, 34, + 114, 34, 113, 66, 66, 101, 240, 64, 40, 15, 240, 240, + 49, 180, 210, 210, 210, 210, 210, 210, 210, 36, 114, 17, + 34, 115, 66, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 69, 53, 0, 13, 48, + 21, 6, 240, 162, 66, 240, 225, 51, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 52, 240, 240, 224, 24, 5, 240, + 98, 50, 240, 145, 35, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 49, 49, 224, 38, 15, 240, + 240, 49, 180, 210, 210, 210, 210, 210, 210, 210, 53, 82, + 66, 114, 65, 130, 49, 146, 33, 162, 17, 181, 162, 34, + 146, 50, 130, 65, 130, 66, 86, 52, 0, 13, 48, 26, + 8, 240, 65, 68, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 7, + 32, 45, 22, 0, 27, 98, 36, 52, 99, 17, 35, 17, + 35, 99, 67, 66, 98, 82, 82, 98, 82, 82, 98, 82, + 82, 98, 82, 82, 98, 82, 82, 98, 82, 82, 98, 82, + 82, 98, 82, 82, 69, 53, 37, 0, 19, 64, 32, 15, + 0, 19, 2, 36, 99, 17, 35, 99, 66, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 69, 53, 0, 13, 48, 28, 13, 0, 16, 85, 114, + 50, 82, 82, 50, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 113, 66, 82, 82, 50, 117, 0, 12, 36, 14, + 0, 17, 113, 36, 85, 35, 82, 82, 82, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 97, 82, 82, 83, 50, + 98, 20, 114, 194, 194, 194, 194, 166, 240, 112, 36, 14, + 0, 18, 3, 33, 98, 51, 82, 82, 81, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 82, 82, 83, 51, + 101, 18, 194, 194, 194, 194, 194, 166, 240, 16, 21, 10, + 0, 12, 113, 34, 51, 19, 67, 114, 130, 130, 130, 130, + 130, 130, 130, 102, 0, 9, 32, 23, 9, 0, 11, 68, + 50, 49, 49, 65, 49, 130, 131, 131, 115, 114, 33, 66, + 33, 50, 68, 0, 8, 48, 23, 8, 0, 7, 33, 113, + 98, 86, 50, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 33, 67, 0, 7, 48, 31, 14, 0, 17, 68, 52, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 83, 36, 100, 35, 0, 12, 64, + 27, 13, 0, 16, 36, 52, 50, 81, 82, 81, 97, 81, + 97, 65, 114, 49, 129, 33, 146, 17, 161, 17, 162, 178, + 0, 13, 112, 43, 21, 0, 26, 37, 37, 52, 66, 82, + 82, 82, 82, 81, 98, 82, 81, 113, 65, 17, 65, 130, + 49, 18, 49, 145, 33, 49, 33, 161, 33, 50, 17, 162, + 17, 65, 17, 178, 82, 194, 82, 0, 21, 112, 28, 14, + 0, 17, 69, 52, 50, 97, 98, 65, 130, 33, 163, 194, + 194, 177, 18, 145, 50, 113, 81, 98, 82, 68, 53, 0, + 12, 64, 32, 14, 0, 17, 69, 52, 66, 81, 98, 81, + 113, 65, 130, 49, 130, 49, 145, 33, 162, 17, 163, 194, + 194, 193, 209, 193, 209, 209, 163, 179, 240, 144, 22, 11, + 0, 13, 120, 49, 81, 145, 146, 145, 146, 130, 145, 146, + 130, 81, 49, 97, 41, 0, 9, 112, 29, 8, 240, 82, + 67, 82, 98, 98, 98, 98, 98, 98, 98, 82, 82, 114, + 114, 98, 98, 98, 98, 98, 98, 98, 99, 99, 240, 240, + 64, 25, 4, 130, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 240, 176, 29, 8, 240, 18, 115, 98, 98, 98, 98, 98, + 98, 98, 98, 114, 114, 82, 82, 98, 98, 98, 98, 98, + 98, 98, 83, 67, 240, 240, 112, 16, 16, 0, 20, 36, + 113, 49, 50, 81, 49, 83, 49, 180, 0, 30, 64, + 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x92, 0x01, 0x00, 0x00, // Offset 402 (0x192) + 0xaf, 0x01, 0x00, 0x00, // Offset 431 (0x1af) + 0xd1, 0x01, 0x00, 0x00, // Offset 465 (0x1d1) + 0xed, 0x01, 0x00, 0x00, // Offset 493 (0x1ed) + 0x0e, 0x02, 0x00, 0x00, // Offset 526 (0x20e) + 0x2e, 0x02, 0x00, 0x00, // Offset 558 (0x22e) + 0x4a, 0x02, 0x00, 0x00, // Offset 586 (0x24a) + 0x65, 0x02, 0x00, 0x00, // Offset 613 (0x265) + 0x7f, 0x02, 0x00, 0x00, // Offset 639 (0x27f) + 0x9f, 0x02, 0x00, 0x00, // Offset 671 (0x29f) + 0xc8, 0x02, 0x00, 0x00, // Offset 712 (0x2c8) + 0xf0, 0x02, 0x00, 0x00, // Offset 752 (0x2f0) + 0x12, 0x03, 0x00, 0x00, // Offset 786 (0x312) + 0x30, 0x03, 0x00, 0x00, // Offset 816 (0x330) + 0x52, 0x03, 0x00, 0x00, // Offset 850 (0x352) + 0x73, 0x03, 0x00, 0x00, // Offset 883 (0x373) + 0x8d, 0x03, 0x00, 0x00, // Offset 909 (0x38d) + 0xa9, 0x03, 0x00, 0x00, // Offset 937 (0x3a9) + 0xdb, 0x03, 0x00, 0x00, // Offset 987 (0x3db) + 0x09, 0x04, 0x00, 0x00, // Offset 1033 (0x409) + 0x25, 0x04, 0x00, 0x00, // Offset 1061 (0x425) + 0x4a, 0x04, 0x00, 0x00, // Offset 1098 (0x44a) + 0x64, 0x04, 0x00, 0x00, // Offset 1124 (0x464) + 0x7f, 0x04, 0x00, 0x00, // Offset 1151 (0x47f) + 0xa2, 0x04, 0x00, 0x00, // Offset 1186 (0x4a2) + 0xbf, 0x04, 0x00, 0x00, // Offset 1215 (0x4bf) + 0xd3, 0x04, 0x00, 0x00, // Offset 1235 (0x4d3) + 0xee, 0x04, 0x00, 0x00, // Offset 1262 (0x4ee) + 0x08, 0x05, 0x00, 0x00, // Offset 1288 (0x508) + 0x24, 0x05, 0x00, 0x00, // Offset 1316 (0x524) + 0x40, 0x05, 0x00, 0x00, // Offset 1344 (0x540) + 0x71, 0x05, 0x00, 0x00, // Offset 1393 (0x571) + 0x8e, 0x05, 0x00, 0x00, // Offset 1422 (0x58e) + 0xbd, 0x05, 0x00, 0x00, // Offset 1469 (0x5bd) + 0xda, 0x05, 0x00, 0x00, // Offset 1498 (0x5da) + 0x0b, 0x06, 0x00, 0x00, // Offset 1547 (0x60b) + 0x27, 0x06, 0x00, 0x00, // Offset 1575 (0x627) + 0x5a, 0x06, 0x00, 0x00, // Offset 1626 (0x65a) + 0x73, 0x06, 0x00, 0x00, // Offset 1651 (0x673) + 0xa5, 0x06, 0x00, 0x00, // Offset 1701 (0x6a5) + 0xe2, 0x06, 0x00, 0x00, // Offset 1762 (0x6e2) + 0x17, 0x07, 0x00, 0x00, // Offset 1815 (0x717) + 0x2f, 0x07, 0x00, 0x00, // Offset 1839 (0x72f) + 0x4e, 0x07, 0x00, 0x00, // Offset 1870 (0x74e) + 0x83, 0x07, 0x00, 0x00, // Offset 1923 (0x783) + 0xc3, 0x07, 0x00, 0x00, // Offset 1987 (0x7c3) + 0xf6, 0x07, 0x00, 0x00, // Offset 2038 (0x7f6) + 0x15, 0x08, 0x00, 0x00, // Offset 2069 (0x815) + 0x1d, 0x08, 0x00, 0x00, // Offset 2077 (0x81d) + 0x50, 0x08, 0x00, 0x00, // Offset 2128 (0x850) + 0x6b, 0x08, 0x00, 0x00, // Offset 2155 (0x86b) + 0x73, 0x08, 0x00, 0x00, // Offset 2163 (0x873) + 0x92, 0x08, 0x00, 0x00, // Offset 2194 (0x892) + 0xb0, 0x08, 0x00, 0x00, // Offset 2224 (0x8b0) + 0xd2, 0x08, 0x00, 0x00, // Offset 2258 (0x8d2) + 0xf6, 0x08, 0x00, 0x00, // Offset 2294 (0x8f6) + 0x23, 0x09, 0x00, 0x00, // Offset 2339 (0x923) + 0x41, 0x09, 0x00, 0x00, // Offset 2369 (0x941) + 0x78, 0x09, 0x00, 0x00, // Offset 2424 (0x978) + 0x9d, 0x09, 0x00, 0x00, // Offset 2461 (0x99d) + 0xc3, 0x09, 0x00, 0x00, // Offset 2499 (0x9c3) + 0xf5, 0x09, 0x00, 0x00, // Offset 2549 (0x9f5) + 0x20, 0x0a, 0x00, 0x00, // Offset 2592 (0xa20) + 0x4e, 0x0a, 0x00, 0x00, // Offset 2638 (0xa4e) + 0x74, 0x0a, 0x00, 0x00, // Offset 2676 (0xa74) + 0x9d, 0x0a, 0x00, 0x00, // Offset 2717 (0xa9d) + 0xc6, 0x0a, 0x00, 0x00, // Offset 2758 (0xac6) + 0xfe, 0x0a, 0x00, 0x00, // Offset 2814 (0xafe) + 0x32, 0x0b, 0x00, 0x00, // Offset 2866 (0xb32) + 0x5f, 0x0b, 0x00, 0x00, // Offset 2911 (0xb5f) + 0x86, 0x0b, 0x00, 0x00, // Offset 2950 (0xb86) + 0xaf, 0x0b, 0x00, 0x00, // Offset 2991 (0xbaf) + 0xed, 0x0b, 0x00, 0x00, // Offset 3053 (0xbed) + 0x11, 0x0c, 0x00, 0x00, // Offset 3089 (0xc11) + 0x33, 0x0c, 0x00, 0x00, // Offset 3123 (0xc33) + 0x58, 0x0c, 0x00, 0x00, // Offset 3160 (0xc58) + 0x87, 0x0c, 0x00, 0x00, // Offset 3207 (0xc87) + 0xaf, 0x0c, 0x00, 0x00, // Offset 3247 (0xcaf) + 0xca, 0x0c, 0x00, 0x00, // Offset 3274 (0xcca) + 0xf7, 0x0c, 0x00, 0x00, // Offset 3319 (0xcf7) + 0x13, 0x0d, 0x00, 0x00, // Offset 3347 (0xd13) + 0x3c, 0x0d, 0x00, 0x00, // Offset 3388 (0xd3c) + 0x67, 0x0d, 0x00, 0x00, // Offset 3431 (0xd67) + 0x8f, 0x0d, 0x00, 0x00, // Offset 3471 (0xd8f) + 0xb2, 0x0d, 0x00, 0x00, // Offset 3506 (0xdb2) + 0xcb, 0x0d, 0x00, 0x00, // Offset 3531 (0xdcb) + 0x04, 0x0e, 0x00, 0x00, // Offset 3588 (0xe04) + 0x44, 0x0e, 0x00, 0x00, // Offset 3652 (0xe44) + 0x7f, 0x0e, 0x00, 0x00, // Offset 3711 (0xe7f) + 0xbe, 0x0e, 0x00, 0x00, // Offset 3774 (0xebe) + 0x11, 0x0f, 0x00, 0x00, // Offset 3857 (0xf11) + 0x4e, 0x0f, 0x00, 0x00, // Offset 3918 (0xf4e) + 0x57, 0x0f, 0x00, 0x00, // Offset 3927 (0xf57) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 18, 15, 0, 15, 13, 33, 177, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 0, 19, 29, 18, 0, 18, 8, 23, + 130, 98, 130, 98, 130, 98, 130, 98, 130, 98, 130, 98, + 130, 98, 130, 98, 130, 98, 130, 98, 0, 22, 96, 34, + 20, 0, 19, 1, 120, 82, 178, 82, 178, 81, 194, 66, + 194, 66, 194, 51, 194, 49, 33, 178, 33, 65, 162, 18, + 81, 146, 17, 98, 131, 129, 0, 25, 32, 28, 18, 0, + 18, 4, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 177, 78, 0, 22, + 96, 33, 21, 0, 23, 84, 75, 66, 146, 130, 145, 146, + 130, 146, 130, 146, 114, 17, 130, 113, 34, 114, 98, 50, + 98, 82, 82, 88, 114, 81, 65, 0, 25, 16, 32, 21, + 0, 22, 37, 99, 240, 66, 61, 50, 240, 66, 240, 66, + 117, 114, 98, 50, 98, 82, 82, 82, 82, 82, 82, 35, + 18, 50, 100, 85, 0, 27, 28, 18, 0, 18, 15, 1, + 66, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 30, 0, 22, 96, 27, 20, + 0, 20, 15, 2, 82, 82, 178, 82, 178, 82, 178, 82, + 178, 82, 178, 82, 178, 82, 178, 82, 97, 79, 97, 0, + 27, 26, 18, 0, 18, 30, 240, 18, 240, 18, 240, 18, + 240, 18, 63, 82, 240, 18, 240, 18, 240, 18, 240, 30, + 0, 22, 96, 32, 18, 0, 18, 8, 23, 130, 98, 130, + 98, 130, 98, 130, 98, 40, 98, 50, 178, 50, 178, 50, + 178, 50, 97, 66, 56, 82, 240, 17, 0, 20, 80, 41, + 18, 0, 18, 8, 23, 145, 33, 65, 145, 33, 65, 145, + 33, 65, 145, 33, 65, 40, 33, 65, 50, 113, 65, 50, + 113, 65, 50, 113, 65, 50, 81, 17, 65, 55, 38, 50, + 113, 0, 21, 16, 40, 18, 0, 17, 51, 40, 18, 65, + 145, 33, 65, 145, 33, 65, 145, 33, 65, 145, 38, 40, + 33, 65, 50, 113, 65, 50, 113, 65, 50, 113, 65, 50, + 50, 38, 53, 65, 65, 0, 22, 96, 34, 20, 0, 19, + 1, 121, 66, 193, 82, 193, 81, 209, 66, 209, 66, 105, + 50, 114, 129, 33, 98, 129, 49, 82, 113, 66, 66, 97, + 98, 56, 129, 0, 25, 32, 30, 20, 0, 20, 8, 24, + 161, 34, 241, 34, 241, 34, 241, 34, 136, 39, 66, 114, + 146, 114, 146, 114, 146, 81, 18, 151, 40, 0, 25, 32, + 34, 20, 0, 20, 8, 25, 130, 240, 50, 34, 34, 162, + 49, 49, 162, 49, 49, 72, 49, 49, 82, 129, 49, 82, + 129, 49, 82, 129, 49, 82, 30, 51, 0, 27, 33, 20, + 0, 20, 8, 53, 177, 240, 65, 25, 145, 240, 65, 200, + 52, 98, 114, 49, 82, 98, 81, 66, 98, 81, 66, 51, + 18, 49, 85, 84, 0, 25, 80, 26, 17, 0, 17, 15, + 66, 146, 66, 145, 82, 145, 82, 145, 82, 145, 82, 145, + 82, 145, 82, 145, 93, 66, 0, 22, 112, 28, 16, 0, + 15, 34, 66, 147, 66, 130, 66, 130, 66, 130, 76, 66, + 130, 66, 130, 66, 130, 66, 130, 76, 66, 130, 0, 20, + 32, 50, 18, 0, 17, 51, 99, 34, 65, 34, 66, 33, + 65, 49, 66, 33, 65, 49, 66, 33, 65, 55, 38, 49, + 66, 33, 65, 49, 66, 33, 65, 49, 66, 33, 65, 49, + 66, 33, 65, 49, 66, 38, 55, 33, 65, 49, 66, 33, + 0, 21, 16, 46, 21, 0, 19, 113, 131, 66, 66, 129, + 81, 66, 129, 81, 66, 129, 81, 65, 151, 50, 145, 81, + 49, 17, 129, 81, 34, 17, 129, 81, 33, 49, 113, 81, + 18, 65, 97, 81, 17, 82, 88, 114, 65, 81, 0, 25, + 16, 28, 18, 0, 19, 3, 240, 18, 242, 240, 17, 240, + 18, 242, 17, 210, 49, 193, 82, 145, 115, 82, 162, 49, + 209, 33, 0, 22, 48, 37, 21, 0, 21, 66, 99, 194, + 82, 193, 97, 194, 82, 193, 97, 194, 82, 193, 17, 65, + 18, 145, 50, 17, 50, 113, 83, 66, 81, 113, 99, 33, + 113, 129, 161, 0, 25, 32, 26, 15, 0, 15, 97, 182, + 130, 82, 82, 114, 50, 146, 34, 146, 34, 146, 34, 146, + 50, 114, 82, 82, 133, 0, 19, 64, 27, 19, 0, 21, + 77, 240, 34, 240, 18, 240, 18, 240, 18, 240, 18, 242, + 33, 210, 66, 161, 130, 98, 163, 34, 0, 23, 64, 35, + 20, 0, 21, 113, 95, 178, 82, 177, 97, 178, 82, 177, + 82, 178, 82, 162, 17, 50, 17, 130, 34, 18, 49, 98, + 67, 82, 49, 113, 113, 33, 98, 0, 23, 112, 29, 20, + 0, 18, 39, 0, 6, 29, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 18, 18, 226, 66, 162, 131, 82, 194, 34, + 0, 24, 96, 20, 16, 0, 16, 14, 33, 178, 226, 226, + 226, 226, 61, 226, 226, 226, 226, 226, 0, 18, 32, 27, + 18, 0, 18, 15, 1, 66, 240, 18, 240, 18, 240, 18, + 240, 29, 82, 240, 18, 240, 18, 240, 18, 240, 30, 0, + 22, 96, 26, 17, 0, 18, 97, 47, 240, 99, 67, 145, + 82, 145, 82, 145, 82, 145, 82, 145, 82, 145, 81, 49, + 47, 0, 21, 64, 28, 19, 0, 17, 39, 240, 240, 255, + 2, 240, 197, 195, 51, 162, 82, 146, 114, 130, 114, 130, + 114, 146, 82, 163, 51, 197, 0, 20, 28, 10, 240, 83, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 150, 65, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 0, 7, 16, + 49, 11, 240, 179, 66, 67, 50, 66, 65, 66, 65, 66, + 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 71, 65, + 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 65, + 66, 65, 66, 65, 66, 65, 66, 65, 66, 145, 0, 5, + 112, 29, 11, 240, 114, 178, 161, 161, 161, 161, 161, 166, + 81, 161, 161, 161, 161, 166, 81, 161, 161, 161, 161, 161, + 161, 161, 161, 0, 6, 48, 47, 10, 240, 240, 68, 34, + 66, 49, 66, 49, 66, 49, 66, 49, 66, 49, 66, 55, + 49, 66, 49, 66, 49, 66, 49, 66, 55, 49, 66, 49, + 66, 49, 66, 49, 66, 49, 66, 49, 66, 49, 66, 49, + 66, 129, 240, 240, 208, 29, 11, 240, 177, 180, 146, 146, + 146, 146, 146, 146, 146, 146, 41, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 0, 5, 96, 49, 13, + 0, 5, 100, 98, 65, 113, 65, 113, 65, 113, 65, 113, + 65, 113, 65, 113, 65, 113, 65, 38, 65, 113, 65, 113, + 65, 113, 65, 113, 65, 113, 65, 113, 65, 113, 65, 113, + 65, 113, 65, 113, 65, 113, 65, 193, 0, 6, 96, 28, + 11, 240, 180, 147, 146, 146, 146, 146, 146, 41, 146, 146, + 146, 146, 146, 41, 146, 146, 146, 146, 146, 146, 146, 146, + 0, 7, 16, 51, 13, 240, 240, 51, 99, 50, 113, 65, + 113, 65, 113, 65, 113, 65, 113, 65, 38, 65, 113, 65, + 113, 65, 113, 65, 113, 65, 113, 65, 38, 65, 113, 65, + 113, 65, 113, 65, 113, 65, 113, 65, 113, 65, 113, 65, + 113, 65, 193, 0, 6, 96, 25, 24, 0, 31, 4, 240, + 114, 240, 114, 240, 114, 240, 114, 240, 114, 240, 114, 240, + 114, 145, 47, 7, 0, 30, 32, 50, 25, 0, 8, 4, + 240, 130, 240, 130, 240, 130, 240, 130, 240, 130, 240, 130, + 240, 130, 196, 114, 226, 114, 226, 119, 146, 114, 226, 114, + 226, 114, 226, 54, 124, 66, 240, 130, 240, 130, 240, 130, + 240, 130, 240, 130, 240, 130, 0, 16, 64, 61, 21, 0, + 7, 18, 242, 51, 227, 34, 242, 34, 242, 34, 242, 34, + 242, 34, 242, 34, 242, 34, 114, 98, 34, 129, 98, 19, + 129, 99, 18, 129, 98, 34, 129, 98, 34, 129, 83, 34, + 34, 55, 18, 34, 52, 130, 34, 242, 34, 242, 34, 242, + 34, 242, 34, 241, 50, 240, 65, 0, 10, 112, 53, 20, + 0, 6, 98, 240, 82, 240, 65, 240, 65, 240, 65, 240, + 65, 240, 65, 240, 65, 240, 65, 131, 129, 146, 129, 146, + 129, 146, 129, 146, 129, 146, 84, 33, 88, 49, 53, 177, + 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, + 0, 10, 32, 24, 23, 0, 30, 35, 211, 82, 226, 82, + 226, 82, 226, 82, 226, 82, 226, 82, 226, 82, 81, 47, + 6, 0, 29, 31, 24, 0, 38, 81, 47, 6, 210, 240, + 114, 240, 114, 240, 114, 240, 114, 240, 114, 240, 114, 240, + 114, 240, 114, 240, 114, 240, 114, 0, 13, 64, 53, 20, + 0, 6, 85, 240, 50, 240, 50, 240, 50, 240, 50, 240, + 50, 240, 50, 240, 50, 240, 50, 240, 50, 227, 18, 44, + 66, 50, 65, 130, 145, 130, 145, 130, 145, 40, 145, 130, + 145, 130, 145, 130, 145, 130, 145, 130, 145, 130, 240, 50, + 0, 10, 32, 64, 20, 0, 6, 100, 211, 49, 241, 49, + 241, 49, 241, 49, 241, 49, 241, 49, 241, 49, 241, 49, + 241, 49, 194, 17, 49, 42, 49, 49, 129, 97, 49, 129, + 97, 49, 129, 97, 49, 129, 22, 49, 129, 97, 49, 129, + 97, 49, 129, 97, 49, 129, 97, 49, 129, 97, 49, 129, + 97, 49, 240, 65, 0, 10, 32, 51, 20, 0, 6, 83, + 240, 67, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 50, 240, 50, 240, 50, 200, 42, 98, 145, + 130, 145, 130, 145, 130, 145, 130, 145, 130, 145, 130, 145, + 130, 145, 130, 145, 130, 240, 50, 0, 10, 32, 31, 23, + 0, 37, 63, 6, 145, 97, 241, 97, 241, 97, 241, 97, + 241, 97, 241, 97, 241, 97, 241, 97, 241, 97, 241, 97, + 240, 113, 0, 12, 64, 8, 23, 0, 51, 111, 6, 0, + 29, 51, 19, 0, 6, 51, 240, 50, 240, 49, 240, 49, + 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, + 240, 49, 240, 49, 240, 49, 240, 49, 229, 44, 65, 240, + 49, 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, 240, + 49, 0, 9, 96, 27, 6, 194, 98, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 240, 176, 8, 3, 240, 240, 145, + 0, 5, 112, 31, 21, 0, 21, 1, 132, 147, 114, 162, + 114, 162, 114, 162, 114, 162, 114, 162, 114, 162, 114, 162, + 114, 162, 51, 18, 51, 69, 69, 0, 26, 112, 30, 20, + 0, 20, 2, 106, 51, 98, 162, 98, 162, 98, 162, 98, + 162, 98, 162, 98, 162, 98, 162, 98, 162, 50, 18, 165, + 56, 0, 25, 32, 34, 21, 0, 21, 1, 195, 99, 146, + 130, 146, 130, 145, 146, 145, 146, 129, 17, 130, 129, 33, + 114, 113, 50, 98, 97, 82, 82, 52, 98, 69, 33, 0, + 27, 80, 36, 21, 0, 21, 3, 162, 130, 146, 130, 146, + 130, 130, 17, 114, 129, 33, 114, 114, 49, 98, 113, 65, + 98, 98, 81, 82, 97, 97, 82, 37, 113, 68, 73, 0, + 26, 64, 45, 24, 0, 23, 17, 110, 50, 177, 82, 65, + 177, 82, 50, 177, 82, 50, 177, 82, 49, 103, 82, 35, + 97, 162, 33, 33, 81, 162, 18, 33, 81, 162, 17, 65, + 65, 81, 67, 82, 54, 82, 113, 225, 0, 28, 48, 30, + 20, 0, 20, 8, 24, 146, 34, 226, 34, 226, 34, 226, + 34, 136, 34, 146, 114, 146, 114, 146, 114, 146, 81, 18, + 151, 40, 0, 25, 32, 55, 24, 0, 22, 50, 49, 121, + 65, 50, 162, 17, 65, 50, 161, 33, 65, 49, 177, 33, + 65, 49, 177, 38, 34, 103, 17, 65, 34, 113, 97, 65, + 18, 17, 97, 97, 65, 17, 34, 81, 97, 67, 49, 81, + 97, 66, 81, 69, 38, 98, 65, 81, 65, 0, 28, 32, + 37, 20, 0, 20, 8, 66, 209, 66, 209, 65, 17, 193, + 65, 17, 193, 50, 33, 72, 49, 49, 82, 114, 65, 66, + 113, 81, 66, 98, 97, 50, 82, 113, 55, 25, 0, 25, + 32, 38, 20, 0, 20, 8, 130, 49, 66, 24, 146, 240, + 50, 240, 50, 52, 88, 34, 49, 82, 98, 81, 66, 98, + 81, 66, 98, 81, 66, 98, 81, 71, 34, 49, 83, 116, + 0, 23, 16, 50, 18, 0, 17, 50, 55, 18, 81, 49, + 65, 33, 81, 49, 65, 33, 81, 49, 65, 33, 81, 49, + 65, 39, 49, 65, 33, 81, 49, 65, 33, 81, 49, 65, + 33, 81, 49, 65, 33, 81, 49, 66, 23, 54, 33, 81, + 49, 113, 0, 21, 32, 43, 19, 0, 19, 7, 67, 97, + 65, 81, 113, 65, 66, 113, 65, 66, 113, 65, 65, 129, + 65, 51, 113, 65, 49, 33, 97, 65, 34, 34, 81, 65, + 33, 65, 81, 65, 17, 97, 71, 114, 49, 0, 23, 64, + 46, 18, 0, 18, 7, 66, 97, 65, 66, 97, 65, 66, + 97, 65, 50, 17, 81, 65, 49, 33, 81, 65, 34, 49, + 65, 65, 33, 65, 65, 65, 33, 81, 49, 65, 18, 81, + 49, 65, 17, 97, 54, 24, 49, 0, 22, 32, 38, 14, + 0, 7, 12, 50, 114, 50, 114, 50, 114, 50, 114, 50, + 114, 50, 114, 59, 50, 240, 240, 228, 130, 66, 82, 98, + 66, 98, 66, 98, 66, 98, 82, 66, 132, 0, 11, 16, + 41, 19, 0, 19, 3, 51, 23, 65, 66, 98, 65, 66, + 98, 65, 66, 98, 71, 98, 65, 66, 98, 65, 66, 98, + 65, 66, 98, 65, 66, 98, 65, 66, 98, 71, 98, 65, + 66, 98, 0, 21, 80, 41, 19, 0, 17, 33, 211, 50, + 24, 65, 65, 34, 145, 65, 34, 145, 65, 34, 150, 34, + 145, 65, 34, 145, 65, 34, 145, 65, 34, 145, 65, 34, + 145, 65, 34, 150, 39, 65, 65, 0, 22, 96, 56, 21, + 0, 18, 114, 49, 178, 65, 50, 22, 49, 65, 50, 82, + 49, 65, 49, 98, 49, 65, 49, 98, 54, 34, 98, 49, + 65, 34, 98, 49, 65, 18, 17, 82, 49, 65, 17, 49, + 66, 49, 65, 17, 50, 50, 49, 66, 81, 50, 54, 98, + 34, 49, 242, 0, 23, 112, 52, 22, 0, 19, 97, 65, + 194, 49, 66, 38, 49, 49, 66, 49, 113, 49, 65, 65, + 113, 49, 50, 65, 117, 50, 65, 113, 49, 50, 65, 113, + 49, 34, 17, 49, 113, 49, 33, 49, 33, 113, 49, 17, + 66, 17, 113, 50, 99, 117, 134, 0, 27, 96, 45, 21, + 0, 18, 115, 226, 66, 25, 65, 66, 82, 113, 66, 81, + 129, 66, 66, 135, 66, 129, 66, 66, 129, 66, 52, 113, + 66, 49, 33, 113, 66, 49, 49, 97, 66, 33, 81, 87, + 17, 114, 49, 67, 129, 0, 24, 39, 20, 0, 18, 17, + 227, 59, 81, 66, 18, 161, 66, 18, 161, 66, 18, 167, + 18, 161, 66, 23, 81, 66, 18, 161, 66, 18, 161, 66, + 18, 161, 66, 18, 167, 24, 65, 65, 0, 24, 41, 15, + 0, 6, 99, 52, 114, 66, 114, 66, 114, 75, 66, 114, + 66, 114, 66, 114, 66, 114, 75, 66, 114, 240, 132, 146, + 66, 98, 98, 82, 98, 82, 98, 82, 98, 98, 66, 148, + 0, 11, 112, 62, 17, 0, 5, 97, 129, 35, 50, 34, + 50, 33, 65, 49, 65, 33, 65, 49, 65, 33, 65, 49, + 50, 38, 54, 33, 65, 49, 65, 33, 65, 49, 65, 33, + 65, 49, 65, 33, 65, 54, 38, 49, 65, 33, 65, 240, + 164, 178, 66, 130, 98, 114, 98, 114, 98, 114, 98, 130, + 66, 180, 0, 13, 80, 36, 19, 0, 17, 17, 240, 66, + 40, 114, 130, 113, 146, 98, 146, 98, 146, 97, 17, 130, + 81, 34, 114, 66, 50, 98, 65, 82, 82, 49, 114, 66, + 33, 129, 82, 0, 24, 34, 20, 0, 20, 67, 36, 194, + 66, 178, 82, 178, 82, 177, 98, 163, 82, 161, 33, 66, + 146, 34, 50, 145, 66, 34, 129, 98, 18, 113, 129, 23, + 0, 25, 32, 37, 20, 0, 17, 113, 240, 82, 56, 114, + 66, 194, 66, 193, 82, 178, 82, 177, 17, 66, 162, 17, + 66, 161, 49, 50, 146, 65, 34, 145, 82, 18, 129, 113, + 24, 0, 25, 32, 47, 20, 0, 18, 81, 68, 99, 50, + 66, 114, 65, 66, 113, 81, 66, 98, 81, 66, 97, 103, + 83, 81, 66, 81, 33, 65, 66, 66, 34, 49, 66, 65, + 66, 33, 66, 49, 98, 17, 66, 33, 129, 23, 209, 66, + 0, 22, 96, 40, 21, 0, 18, 114, 240, 82, 42, 114, + 98, 177, 114, 162, 114, 162, 113, 162, 17, 83, 145, 34, + 65, 18, 114, 49, 50, 34, 97, 81, 33, 66, 65, 114, + 98, 33, 129, 129, 0, 26, 64, 27, 14, 0, 12, 98, + 210, 195, 162, 17, 161, 49, 130, 49, 129, 81, 98, 81, + 97, 113, 66, 129, 49, 145, 44, 0, 17, 96, 45, 21, + 0, 21, 65, 145, 133, 85, 81, 81, 49, 81, 50, 81, + 34, 81, 49, 113, 17, 113, 33, 113, 17, 113, 33, 113, + 17, 113, 33, 113, 17, 113, 49, 81, 49, 81, 66, 50, + 50, 50, 99, 115, 0, 26, 112, 28, 14, 0, 11, 2, + 209, 209, 181, 115, 66, 82, 98, 50, 130, 34, 130, 34, + 130, 34, 130, 50, 98, 82, 66, 118, 0, 18, 16, 41, + 22, 0, 22, 50, 130, 177, 146, 147, 130, 114, 50, 97, + 129, 82, 66, 114, 98, 50, 114, 98, 33, 33, 98, 98, + 18, 49, 82, 83, 17, 81, 82, 66, 17, 114, 84, 33, + 129, 0, 27, 112, 43, 21, 0, 21, 50, 129, 177, 145, + 147, 115, 98, 50, 81, 17, 97, 82, 65, 33, 66, 98, + 34, 33, 66, 98, 33, 65, 50, 98, 18, 65, 50, 83, + 17, 97, 50, 66, 18, 97, 84, 57, 0, 26, 64, 40, + 18, 0, 8, 34, 78, 209, 179, 66, 162, 66, 162, 65, + 178, 65, 193, 65, 193, 65, 35, 47, 240, 240, 244, 194, + 66, 146, 98, 130, 98, 130, 98, 130, 98, 146, 66, 196, + 0, 14, 64, 35, 22, 0, 22, 37, 85, 240, 240, 92, + 41, 240, 240, 132, 100, 114, 49, 66, 49, 82, 81, 34, + 81, 66, 81, 34, 81, 82, 49, 66, 49, 116, 100, 0, + 28, 16, 25, 19, 0, 19, 15, 2, 0, 8, 21, 194, + 67, 146, 114, 130, 114, 130, 114, 130, 114, 146, 82, 197, + 0, 22, 48, 57, 24, 0, 10, 99, 240, 114, 240, 114, + 240, 114, 240, 114, 240, 114, 240, 119, 177, 82, 163, 66, + 50, 178, 66, 50, 178, 66, 50, 178, 66, 50, 178, 66, + 55, 98, 66, 35, 178, 38, 18, 120, 114, 240, 114, 240, + 114, 240, 114, 240, 114, 240, 114, 240, 114, 0, 12, 112, + 64, 20, 0, 6, 97, 240, 83, 211, 34, 226, 34, 226, + 34, 226, 34, 226, 34, 230, 226, 34, 51, 50, 50, 34, + 81, 65, 50, 34, 81, 65, 50, 34, 81, 65, 50, 34, + 81, 65, 54, 81, 65, 50, 34, 81, 40, 34, 38, 98, + 34, 226, 34, 226, 34, 226, 34, 226, 34, 225, 50, 240, + 50, 0, 10, 32, 59, 20, 0, 6, 99, 240, 66, 240, + 65, 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, 180, + 65, 99, 66, 65, 114, 66, 65, 114, 66, 65, 114, 66, + 65, 114, 66, 65, 114, 66, 35, 33, 74, 33, 53, 177, + 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, 240, 65, + 0, 10, 32, 63, 20, 0, 6, 82, 240, 83, 240, 50, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 17, 18, 166, 34, 40, 17, 98, 97, 65, + 98, 97, 65, 23, 97, 65, 98, 97, 65, 98, 97, 65, + 98, 97, 65, 23, 97, 65, 98, 97, 65, 98, 97, 65, + 98, 240, 50, 0, 10, 32, 83, 21, 0, 7, 18, 240, + 17, 66, 242, 49, 240, 17, 49, 240, 17, 49, 240, 17, + 49, 240, 17, 49, 240, 17, 49, 240, 17, 49, 240, 17, + 49, 240, 17, 49, 34, 85, 33, 49, 54, 17, 81, 49, + 97, 49, 81, 49, 97, 49, 21, 49, 97, 49, 81, 49, + 97, 49, 81, 49, 97, 49, 81, 49, 97, 49, 21, 49, + 97, 49, 81, 49, 97, 49, 81, 49, 97, 49, 81, 49, + 240, 81, 0, 10, 96, 61, 20, 0, 6, 98, 240, 67, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 50, 240, 50, 200, 42, 17, 66, 113, 81, + 66, 113, 81, 66, 113, 81, 66, 113, 81, 66, 113, 81, + 66, 113, 81, 66, 113, 81, 66, 113, 81, 66, 113, 81, + 66, 240, 50, 0, 10, 32, 9, 5, 0, 7, 67, 35, + 35, 0, 9, 32, 10, 240, 240, 68, 145, 145, 145, 145, + 145, 145, 145, 145, 35, 65, 35, 65, 35, 65, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 240, 240, 192, + 0, // Padding + +}; + +tFont *g_psFontWHangulmyeongjo24pt = (tFont *)g_pui8Hangulmyeongjo24pt; diff --git a/third_party/fonts/ofl/fonts/fonthangulmyeongjo24ptb.c b/third_party/fonts/ofl/fonts/fonthangulmyeongjo24ptb.c new file mode 100644 index 0000000..d996289 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonthangulmyeongjo24ptb.c @@ -0,0 +1,932 @@ +//***************************************************************************** +// +// fonthangulmyeongjo24ptb.c - Font definition for the 24ptpt Hangulmyeongjo bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://hangeul.naver.com/download.nhn +// +// Copyright (c) 2010, NHN Corporation (http://www.nhncorp.com), +// with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver +// NanumGothic, NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver +// NanumBrush, NanumPen, Naver NanumPen. +// +// This Font Software is licensed under the SIL Open Font License, Version +// 1.1. This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 191 in 2 blocks +// Style: hangulmyeongjo +// Size: 24pt +// Bold: yes +// Italic: no +// Memory usage: 7329 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Hangulmyeongjo24ptb[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 23, + + // + // The height of the font. + // + 29, + + // + // The baseline of the font. + // + 22, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3130 - 0x318f + // + 0x30, 0x31, 0x00, 0x00, + 0x60, 0x00, 0x00, 0x00, + 0x60, 0x0d, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x98, 0x01, 0x00, 0x00, // Offset 408 (0x198) + 0xaa, 0x01, 0x00, 0x00, // Offset 426 (0x1aa) + 0xd2, 0x01, 0x00, 0x00, // Offset 466 (0x1d2) + 0x02, 0x02, 0x00, 0x00, // Offset 514 (0x202) + 0x3e, 0x02, 0x00, 0x00, // Offset 574 (0x23e) + 0x71, 0x02, 0x00, 0x00, // Offset 625 (0x271) + 0x7c, 0x02, 0x00, 0x00, // Offset 636 (0x27c) + 0x98, 0x02, 0x00, 0x00, // Offset 664 (0x298) + 0xb4, 0x02, 0x00, 0x00, // Offset 692 (0x2b4) + 0xc8, 0x02, 0x00, 0x00, // Offset 712 (0x2c8) + 0xdb, 0x02, 0x00, 0x00, // Offset 731 (0x2db) + 0xe7, 0x02, 0x00, 0x00, // Offset 743 (0x2e7) + 0xef, 0x02, 0x00, 0x00, // Offset 751 (0x2ef) + 0xf9, 0x02, 0x00, 0x00, // Offset 761 (0x2f9) + 0x13, 0x03, 0x00, 0x00, // Offset 787 (0x313) + 0x3b, 0x03, 0x00, 0x00, // Offset 827 (0x33b) + 0x54, 0x03, 0x00, 0x00, // Offset 852 (0x354) + 0x73, 0x03, 0x00, 0x00, // Offset 883 (0x373) + 0x91, 0x03, 0x00, 0x00, // Offset 913 (0x391) + 0xb1, 0x03, 0x00, 0x00, // Offset 945 (0x3b1) + 0xcb, 0x03, 0x00, 0x00, // Offset 971 (0x3cb) + 0xef, 0x03, 0x00, 0x00, // Offset 1007 (0x3ef) + 0x0a, 0x04, 0x00, 0x00, // Offset 1034 (0x40a) + 0x31, 0x04, 0x00, 0x00, // Offset 1073 (0x431) + 0x55, 0x04, 0x00, 0x00, // Offset 1109 (0x455) + 0x63, 0x04, 0x00, 0x00, // Offset 1123 (0x463) + 0x75, 0x04, 0x00, 0x00, // Offset 1141 (0x475) + 0x92, 0x04, 0x00, 0x00, // Offset 1170 (0x492) + 0x9c, 0x04, 0x00, 0x00, // Offset 1180 (0x49c) + 0xb8, 0x04, 0x00, 0x00, // Offset 1208 (0x4b8) + 0xd8, 0x04, 0x00, 0x00, // Offset 1240 (0x4d8) + 0x15, 0x05, 0x00, 0x00, // Offset 1301 (0x515) + 0x41, 0x05, 0x00, 0x00, // Offset 1345 (0x541) + 0x69, 0x05, 0x00, 0x00, // Offset 1385 (0x569) + 0x8b, 0x05, 0x00, 0x00, // Offset 1419 (0x58b) + 0xb4, 0x05, 0x00, 0x00, // Offset 1460 (0x5b4) + 0xd8, 0x05, 0x00, 0x00, // Offset 1496 (0x5d8) + 0xf8, 0x05, 0x00, 0x00, // Offset 1528 (0x5f8) + 0x21, 0x06, 0x00, 0x00, // Offset 1569 (0x621) + 0x4b, 0x06, 0x00, 0x00, // Offset 1611 (0x64b) + 0x64, 0x06, 0x00, 0x00, // Offset 1636 (0x664) + 0x84, 0x06, 0x00, 0x00, // Offset 1668 (0x684) + 0xad, 0x06, 0x00, 0x00, // Offset 1709 (0x6ad) + 0xc9, 0x06, 0x00, 0x00, // Offset 1737 (0x6c9) + 0x0a, 0x07, 0x00, 0x00, // Offset 1802 (0x70a) + 0x3f, 0x07, 0x00, 0x00, // Offset 1855 (0x73f) + 0x68, 0x07, 0x00, 0x00, // Offset 1896 (0x768) + 0x89, 0x07, 0x00, 0x00, // Offset 1929 (0x789) + 0xb8, 0x07, 0x00, 0x00, // Offset 1976 (0x7b8) + 0xe0, 0x07, 0x00, 0x00, // Offset 2016 (0x7e0) + 0x00, 0x08, 0x00, 0x00, // Offset 2048 (0x800) + 0x2a, 0x08, 0x00, 0x00, // Offset 2090 (0x82a) + 0x54, 0x08, 0x00, 0x00, // Offset 2132 (0x854) + 0x7f, 0x08, 0x00, 0x00, // Offset 2175 (0x87f) + 0xc3, 0x08, 0x00, 0x00, // Offset 2243 (0x8c3) + 0xec, 0x08, 0x00, 0x00, // Offset 2284 (0x8ec) + 0x15, 0x09, 0x00, 0x00, // Offset 2325 (0x915) + 0x34, 0x09, 0x00, 0x00, // Offset 2356 (0x934) + 0x4f, 0x09, 0x00, 0x00, // Offset 2383 (0x94f) + 0x8a, 0x09, 0x00, 0x00, // Offset 2442 (0x98a) + 0xa5, 0x09, 0x00, 0x00, // Offset 2469 (0x9a5) + 0xb4, 0x09, 0x00, 0x00, // Offset 2484 (0x9b4) + 0xbc, 0x09, 0x00, 0x00, // Offset 2492 (0x9bc) + 0xc5, 0x09, 0x00, 0x00, // Offset 2501 (0x9c5) + 0xe2, 0x09, 0x00, 0x00, // Offset 2530 (0x9e2) + 0x08, 0x0a, 0x00, 0x00, // Offset 2568 (0xa08) + 0x1d, 0x0a, 0x00, 0x00, // Offset 2589 (0xa1d) + 0x44, 0x0a, 0x00, 0x00, // Offset 2628 (0xa44) + 0x5c, 0x0a, 0x00, 0x00, // Offset 2652 (0xa5c) + 0x76, 0x0a, 0x00, 0x00, // Offset 2678 (0xa76) + 0x99, 0x0a, 0x00, 0x00, // Offset 2713 (0xa99) + 0xc0, 0x0a, 0x00, 0x00, // Offset 2752 (0xac0) + 0xd6, 0x0a, 0x00, 0x00, // Offset 2774 (0xad6) + 0xf0, 0x0a, 0x00, 0x00, // Offset 2800 (0xaf0) + 0x16, 0x0b, 0x00, 0x00, // Offset 2838 (0xb16) + 0x30, 0x0b, 0x00, 0x00, // Offset 2864 (0xb30) + 0x5b, 0x0b, 0x00, 0x00, // Offset 2907 (0xb5b) + 0x7a, 0x0b, 0x00, 0x00, // Offset 2938 (0xb7a) + 0x96, 0x0b, 0x00, 0x00, // Offset 2966 (0xb96) + 0xb9, 0x0b, 0x00, 0x00, // Offset 3001 (0xbb9) + 0xdd, 0x0b, 0x00, 0x00, // Offset 3037 (0xbdd) + 0xf3, 0x0b, 0x00, 0x00, // Offset 3059 (0xbf3) + 0x0b, 0x0c, 0x00, 0x00, // Offset 3083 (0xc0b) + 0x22, 0x0c, 0x00, 0x00, // Offset 3106 (0xc22) + 0x41, 0x0c, 0x00, 0x00, // Offset 3137 (0xc41) + 0x5c, 0x0c, 0x00, 0x00, // Offset 3164 (0xc5c) + 0x87, 0x0c, 0x00, 0x00, // Offset 3207 (0xc87) + 0xa3, 0x0c, 0x00, 0x00, // Offset 3235 (0xca3) + 0xc3, 0x0c, 0x00, 0x00, // Offset 3267 (0xcc3) + 0xdb, 0x0c, 0x00, 0x00, // Offset 3291 (0xcdb) + 0xf7, 0x0c, 0x00, 0x00, // Offset 3319 (0xcf7) + 0x10, 0x0d, 0x00, 0x00, // Offset 3344 (0xd10) + 0x2c, 0x0d, 0x00, 0x00, // Offset 3372 (0xd2c) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 10, 0, 36, 32, 23, 5, 240, 83, 35, 35, 35, + 35, 35, 35, 50, 50, 50, 50, 50, 50, 50, 50, 195, + 35, 35, 240, 192, 18, 8, 240, 18, 18, 50, 19, 34, + 18, 50, 33, 65, 33, 65, 33, 0, 21, 48, 40, 15, + 0, 8, 18, 34, 146, 34, 130, 50, 130, 50, 130, 49, + 93, 98, 34, 130, 50, 130, 50, 130, 50, 130, 34, 108, + 82, 50, 130, 50, 130, 50, 130, 34, 146, 34, 130, 50, + 0, 14, 48, 13, 240, 242, 178, 150, 98, 18, 34, 50, + 34, 34, 50, 34, 49, 50, 34, 49, 50, 34, 130, 18, + 148, 164, 165, 130, 19, 114, 35, 98, 50, 33, 50, 50, + 33, 50, 50, 34, 34, 34, 50, 34, 34, 86, 146, 178, + 0, 9, 60, 22, 0, 11, 83, 98, 146, 34, 51, 146, + 71, 130, 82, 34, 146, 81, 49, 146, 82, 34, 146, 81, + 34, 162, 66, 34, 178, 34, 34, 52, 100, 50, 34, 49, + 178, 34, 65, 177, 34, 82, 146, 34, 81, 146, 35, 66, + 146, 35, 65, 146, 51, 50, 145, 82, 34, 146, 99, 0, + 20, 16, 51, 21, 0, 11, 36, 240, 18, 35, 210, 66, + 210, 66, 210, 51, 210, 50, 230, 38, 131, 83, 132, 98, + 130, 34, 82, 114, 50, 81, 129, 82, 50, 114, 98, 18, + 130, 98, 17, 146, 115, 147, 99, 82, 51, 50, 34, 50, + 86, 84, 0, 18, 112, 11, 4, 130, 34, 34, 34, 34, + 34, 0, 10, 96, 28, 8, 240, 97, 97, 98, 82, 97, + 98, 98, 82, 98, 98, 98, 98, 98, 98, 98, 114, 98, + 113, 114, 114, 113, 129, 240, 240, 192, 28, 8, 240, 17, + 129, 114, 114, 98, 114, 98, 114, 98, 98, 98, 98, 98, + 98, 98, 82, 98, 82, 98, 82, 97, 97, 0, 5, 112, + 20, 10, 240, 130, 130, 82, 18, 18, 40, 54, 70, 56, + 34, 18, 18, 82, 130, 0, 21, 112, 19, 14, 0, 12, + 114, 194, 194, 194, 194, 124, 114, 194, 194, 194, 194, 194, + 0, 18, 48, 12, 6, 0, 15, 18, 52, 36, 66, 65, + 50, 240, 112, 8, 14, 0, 21, 12, 0, 28, 32, 10, + 5, 0, 12, 67, 35, 35, 240, 240, 32, 26, 11, 240, + 226, 145, 146, 146, 130, 146, 146, 130, 146, 130, 146, 146, + 130, 146, 145, 146, 146, 130, 146, 145, 0, 10, 112, 40, + 13, 0, 6, 117, 114, 50, 82, 82, 66, 82, 66, 82, + 50, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 34, 114, 49, 98, 66, 82, 66, 82, 82, 50, + 117, 0, 12, 25, 10, 240, 240, 210, 100, 82, 18, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 103, 0, 9, 31, 13, 0, 6, 116, 129, 51, 81, + 82, 66, 98, 49, 114, 178, 178, 162, 178, 163, 147, 162, + 162, 163, 147, 162, 97, 50, 97, 58, 0, 11, 96, 30, + 12, 0, 6, 52, 98, 50, 81, 82, 49, 98, 162, 146, + 162, 131, 133, 178, 163, 162, 162, 162, 162, 49, 82, 52, + 19, 85, 0, 11, 32, 32, 14, 0, 7, 114, 194, 179, + 164, 164, 146, 18, 145, 34, 130, 34, 114, 50, 113, 66, + 98, 66, 82, 82, 92, 146, 194, 194, 194, 194, 0, 12, + 112, 26, 12, 0, 6, 55, 81, 162, 162, 146, 165, 179, + 163, 162, 178, 162, 162, 162, 162, 161, 162, 51, 50, 85, + 0, 11, 32, 36, 13, 0, 7, 52, 115, 146, 162, 162, + 162, 178, 33, 114, 18, 19, 67, 82, 50, 98, 50, 114, + 34, 114, 34, 114, 34, 114, 50, 98, 50, 82, 82, 50, + 132, 0, 12, 27, 13, 0, 6, 90, 58, 34, 113, 49, + 114, 178, 178, 162, 178, 178, 162, 178, 178, 162, 178, 178, + 177, 178, 178, 0, 12, 32, 39, 13, 0, 6, 117, 114, + 50, 82, 82, 66, 82, 66, 82, 66, 82, 67, 50, 99, + 34, 116, 130, 20, 82, 82, 50, 114, 34, 114, 34, 114, + 34, 114, 50, 82, 67, 51, 101, 0, 12, 36, 13, 0, + 6, 116, 130, 50, 82, 82, 50, 98, 50, 114, 34, 114, + 34, 114, 34, 114, 50, 98, 50, 83, 66, 52, 99, 18, + 178, 162, 162, 162, 147, 116, 0, 12, 64, 14, 5, 240, + 243, 35, 35, 240, 240, 195, 35, 35, 0, 5, 112, 18, + 6, 240, 240, 114, 52, 50, 0, 5, 98, 52, 36, 66, + 65, 50, 0, 5, 96, 29, 12, 240, 240, 34, 146, 146, + 162, 146, 146, 146, 161, 162, 146, 146, 162, 178, 178, 162, + 178, 178, 178, 162, 178, 178, 178, 0, 7, 96, 10, 14, + 0, 17, 76, 0, 7, 44, 0, 23, 28, 12, 240, 146, + 178, 178, 162, 178, 178, 178, 162, 178, 178, 178, 162, 146, + 146, 162, 146, 146, 146, 162, 146, 146, 146, 0, 8, 96, + 32, 12, 0, 6, 52, 98, 66, 65, 98, 34, 98, 35, + 82, 35, 82, 162, 146, 162, 146, 161, 177, 161, 177, 177, + 240, 240, 67, 147, 147, 0, 8, 16, 61, 21, 0, 11, + 54, 210, 98, 147, 146, 114, 178, 82, 68, 18, 18, 66, + 51, 35, 50, 50, 35, 66, 50, 49, 50, 82, 50, 34, + 35, 66, 66, 34, 34, 82, 66, 49, 34, 67, 50, 65, + 34, 66, 51, 66, 34, 35, 35, 82, 52, 20, 33, 82, + 194, 98, 162, 131, 98, 214, 0, 19, 48, 44, 19, 0, + 8, 17, 240, 50, 240, 34, 240, 19, 240, 17, 18, 241, + 18, 226, 18, 225, 50, 209, 50, 194, 50, 193, 82, 169, + 161, 98, 161, 114, 130, 114, 129, 130, 129, 146, 98, 146, + 70, 86, 0, 16, 112, 40, 15, 0, 7, 72, 146, 66, + 114, 82, 98, 82, 98, 82, 98, 82, 98, 66, 114, 50, + 135, 130, 67, 98, 98, 82, 114, 66, 114, 66, 114, 66, + 114, 66, 98, 82, 82, 74, 0, 13, 96, 34, 17, 0, + 9, 39, 131, 83, 82, 130, 66, 161, 50, 177, 50, 226, + 242, 242, 242, 242, 242, 240, 18, 242, 177, 66, 161, 82, + 130, 99, 83, 135, 0, 15, 48, 41, 18, 0, 9, 10, + 162, 83, 130, 114, 114, 130, 98, 146, 82, 146, 82, 162, + 66, 162, 66, 162, 66, 162, 66, 162, 66, 162, 66, 146, + 82, 146, 82, 130, 98, 114, 114, 98, 106, 0, 16, 96, + 36, 15, 0, 7, 76, 82, 98, 82, 98, 82, 97, 98, + 210, 210, 81, 114, 81, 120, 114, 81, 114, 81, 114, 81, + 114, 210, 210, 129, 66, 129, 66, 114, 44, 0, 13, 64, + 32, 14, 0, 7, 12, 66, 83, 66, 98, 66, 98, 66, + 194, 194, 81, 98, 81, 104, 98, 81, 98, 81, 98, 194, + 194, 194, 194, 194, 166, 0, 13, 32, 41, 19, 0, 10, + 38, 179, 83, 114, 130, 98, 161, 82, 177, 82, 240, 18, + 240, 34, 240, 34, 240, 34, 240, 34, 150, 34, 178, 82, + 162, 82, 162, 98, 146, 114, 130, 131, 83, 167, 0, 17, + 48, 42, 20, 0, 10, 6, 102, 66, 162, 98, 162, 98, + 162, 98, 162, 98, 162, 98, 162, 98, 162, 110, 98, 162, + 98, 162, 98, 162, 98, 162, 98, 162, 98, 162, 98, 162, + 98, 162, 70, 102, 0, 17, 96, 25, 8, 240, 240, 38, + 66, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 70, 0, 7, 32, 32, 11, 0, 5, + 118, 114, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 66, 49, 82, + 34, 100, 240, 32, 41, 18, 0, 9, 6, 69, 82, 114, + 114, 98, 130, 82, 146, 66, 162, 50, 178, 34, 194, 18, + 214, 195, 18, 194, 50, 178, 51, 162, 67, 146, 82, 146, + 98, 130, 99, 114, 115, 70, 100, 0, 16, 28, 15, 0, + 7, 70, 178, 210, 210, 210, 210, 210, 210, 210, 210, 210, + 210, 210, 210, 210, 129, 66, 129, 66, 114, 44, 0, 13, + 64, 65, 25, 0, 12, 84, 212, 99, 179, 131, 179, 132, + 163, 132, 148, 130, 17, 145, 18, 130, 18, 114, 18, 130, + 18, 113, 34, 130, 34, 97, 34, 130, 34, 82, 34, 130, + 50, 65, 50, 130, 50, 50, 50, 130, 66, 33, 66, 130, + 66, 18, 66, 130, 83, 82, 130, 83, 82, 115, 83, 83, + 71, 65, 71, 0, 22, 16, 53, 22, 0, 11, 4, 166, + 67, 178, 115, 162, 116, 146, 114, 18, 130, 114, 34, 114, + 114, 34, 114, 114, 50, 98, 114, 66, 82, 114, 82, 66, + 114, 98, 50, 114, 98, 50, 114, 114, 34, 114, 130, 18, + 114, 148, 114, 163, 114, 163, 71, 146, 0, 19, 96, 41, + 19, 0, 10, 37, 194, 82, 145, 130, 113, 162, 82, 178, + 65, 194, 50, 195, 34, 210, 34, 210, 34, 210, 34, 210, + 34, 210, 50, 193, 66, 178, 82, 161, 114, 129, 146, 82, + 197, 0, 17, 80, 33, 14, 0, 7, 9, 114, 66, 98, + 82, 82, 98, 66, 98, 66, 98, 66, 98, 66, 82, 82, + 66, 103, 114, 194, 194, 194, 194, 194, 194, 167, 0, 13, + 16, 47, 20, 0, 10, 101, 210, 82, 161, 130, 129, 162, + 98, 178, 81, 194, 66, 195, 50, 210, 50, 210, 50, 210, + 50, 210, 50, 210, 66, 193, 82, 178, 98, 161, 115, 129, + 162, 82, 199, 240, 19, 240, 51, 240, 56, 0, 10, 32, + 40, 18, 0, 9, 9, 178, 67, 146, 82, 146, 98, 130, + 98, 130, 98, 130, 98, 130, 82, 146, 67, 151, 178, 50, + 178, 66, 162, 67, 146, 82, 146, 98, 130, 99, 114, 115, + 70, 100, 0, 16, 32, 12, 0, 6, 54, 66, 66, 65, + 97, 50, 97, 50, 162, 163, 164, 148, 164, 148, 163, 162, + 33, 114, 33, 114, 33, 98, 50, 66, 86, 0, 11, 16, + 42, 18, 0, 9, 31, 49, 82, 97, 34, 82, 97, 146, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 240, 18, 231, 0, 16, 64, 42, 19, 0, 9, 70, 86, + 66, 146, 98, 146, 98, 146, 98, 146, 98, 146, 98, 146, + 98, 146, 98, 146, 98, 146, 98, 146, 98, 146, 98, 146, + 98, 146, 98, 146, 114, 114, 146, 82, 197, 0, 17, 80, + 43, 19, 0, 9, 70, 101, 67, 146, 98, 145, 114, 145, + 115, 114, 130, 113, 146, 98, 162, 82, 162, 81, 179, 50, + 194, 49, 210, 49, 226, 18, 226, 17, 242, 17, 240, 19, + 240, 18, 240, 34, 0, 17, 96, 68, 26, 0, 13, 6, + 22, 21, 20, 67, 67, 66, 50, 83, 82, 50, 66, 98, + 82, 49, 81, 115, 67, 33, 81, 130, 82, 18, 66, 130, + 84, 81, 162, 83, 66, 162, 82, 82, 163, 67, 65, 194, + 67, 50, 194, 53, 33, 226, 33, 34, 33, 226, 18, 34, + 18, 228, 67, 240, 19, 67, 240, 18, 98, 240, 33, 97, + 0, 23, 112, 41, 19, 0, 9, 70, 86, 52, 130, 99, + 114, 131, 97, 162, 81, 194, 50, 195, 18, 228, 240, 18, + 240, 35, 245, 225, 35, 193, 66, 178, 82, 146, 99, 129, + 131, 83, 147, 53, 102, 0, 16, 112, 41, 18, 0, 9, + 6, 85, 51, 145, 99, 114, 114, 113, 146, 81, 163, 49, + 195, 18, 210, 17, 227, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 230, 0, 16, + 80, 31, 18, 0, 9, 30, 66, 146, 81, 147, 65, 147, + 227, 242, 243, 227, 227, 242, 243, 227, 227, 243, 227, 161, + 51, 162, 35, 162, 63, 0, 16, 16, 27, 8, 240, 22, + 34, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 102, 0, 6, 32, 59, + 25, 0, 12, 70, 38, 69, 66, 83, 114, 98, 98, 114, + 114, 82, 113, 130, 98, 97, 130, 98, 82, 95, 8, 98, + 65, 18, 65, 177, 65, 33, 50, 178, 34, 34, 33, 194, + 33, 50, 33, 194, 33, 50, 33, 212, 65, 18, 211, 83, + 227, 83, 242, 98, 241, 114, 241, 113, 0, 23, 27, 8, + 240, 22, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 38, 0, 6, + 32, 15, 12, 66, 148, 114, 34, 82, 66, 50, 98, 33, + 129, 0, 34, 96, 8, 14, 0, 42, 12, 0, 7, 32, + 9, 5, 162, 50, 66, 50, 65, 0, 14, 29, 12, 0, + 15, 52, 98, 35, 66, 66, 66, 66, 162, 147, 99, 18, + 82, 50, 66, 66, 66, 66, 66, 51, 17, 52, 19, 0, + 10, 112, 38, 14, 240, 240, 17, 164, 194, 194, 194, 194, + 194, 194, 194, 20, 115, 51, 82, 82, 82, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 82, 82, 82, 83, 50, + 97, 20, 0, 13, 21, 11, 0, 14, 36, 82, 50, 50, + 81, 49, 146, 146, 146, 146, 146, 162, 162, 65, 85, 0, + 10, 39, 13, 240, 240, 81, 163, 178, 178, 178, 178, 178, + 178, 118, 82, 51, 66, 82, 65, 98, 50, 98, 50, 98, + 50, 98, 50, 98, 50, 98, 66, 82, 67, 51, 100, 19, + 161, 0, 10, 32, 24, 11, 0, 14, 20, 97, 50, 66, + 66, 34, 82, 41, 34, 146, 146, 146, 162, 81, 66, 50, + 84, 0, 10, 16, 26, 10, 240, 178, 100, 81, 145, 130, + 130, 130, 130, 103, 82, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 102, 0, 9, 32, 35, 13, 0, 16, 88, 66, + 35, 82, 66, 82, 66, 82, 66, 82, 66, 98, 34, 132, + 114, 178, 178, 200, 66, 83, 34, 114, 34, 114, 34, 113, + 66, 66, 101, 240, 64, 39, 15, 240, 240, 49, 180, 210, + 210, 210, 210, 210, 210, 210, 20, 132, 34, 114, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 70, 22, 0, 13, 48, 22, 7, 240, 227, + 67, 67, 240, 178, 52, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 53, 0, 6, 48, 26, 6, 240, 163, 51, 51, + 240, 113, 51, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 65, 66, 240, 16, 38, 15, 240, 240, + 49, 180, 210, 210, 210, 210, 210, 210, 210, 53, 82, 66, + 114, 50, 130, 34, 146, 18, 164, 178, 18, 162, 34, 146, + 35, 130, 50, 130, 66, 86, 52, 0, 13, 48, 26, 8, + 240, 65, 68, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 7, 32, + 43, 22, 0, 27, 98, 36, 52, 101, 37, 35, 98, 82, + 82, 98, 82, 82, 98, 82, 82, 98, 82, 82, 98, 82, + 82, 98, 82, 82, 98, 82, 82, 98, 82, 82, 98, 82, + 82, 70, 22, 22, 0, 19, 64, 31, 15, 0, 19, 2, + 36, 101, 35, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 70, 22, 0, + 13, 48, 28, 14, 0, 17, 117, 130, 66, 82, 98, 65, + 115, 34, 130, 34, 130, 34, 130, 34, 130, 35, 113, 66, + 98, 82, 66, 132, 0, 13, 35, 14, 0, 17, 98, 20, + 100, 51, 82, 82, 82, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 66, 97, 82, 82, 83, 50, 102, 130, 194, 194, + 194, 194, 166, 240, 112, 36, 15, 0, 19, 37, 17, 98, + 67, 82, 98, 82, 98, 66, 114, 66, 114, 66, 114, 66, + 114, 66, 114, 82, 98, 98, 67, 117, 18, 210, 210, 210, + 210, 210, 182, 240, 32, 22, 10, 0, 12, 113, 34, 51, + 19, 67, 18, 66, 130, 130, 130, 130, 130, 130, 130, 102, + 0, 9, 32, 24, 9, 0, 11, 68, 65, 49, 50, 49, + 50, 115, 116, 100, 115, 33, 66, 33, 66, 34, 49, 68, + 0, 8, 48, 23, 10, 0, 9, 17, 145, 130, 104, 66, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 33, 99, 0, + 9, 32, 31, 14, 0, 17, 67, 52, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 52, 100, 36, 0, 12, 64, 27, 14, 0, + 17, 69, 52, 66, 82, 82, 81, 98, 66, 114, 49, 130, + 49, 146, 18, 146, 17, 164, 178, 194, 194, 0, 13, 16, + 43, 21, 0, 26, 37, 37, 37, 51, 67, 81, 98, 82, + 66, 98, 67, 65, 130, 49, 17, 65, 130, 49, 18, 34, + 130, 33, 34, 33, 162, 17, 50, 17, 164, 51, 194, 67, + 194, 82, 194, 81, 0, 19, 48, 28, 15, 0, 18, 117, + 52, 67, 81, 114, 65, 146, 34, 164, 179, 210, 193, 18, + 162, 34, 130, 51, 98, 82, 69, 53, 0, 13, 48, 32, + 13, 0, 16, 37, 36, 51, 66, 82, 66, 82, 65, 98, + 50, 114, 33, 130, 33, 130, 18, 147, 163, 162, 193, 177, + 193, 193, 177, 148, 147, 240, 128, 24, 12, 0, 15, 24, + 65, 67, 65, 66, 146, 147, 146, 147, 146, 146, 81, 51, + 81, 50, 81, 57, 0, 10, 112, 28, 8, 194, 67, 82, + 98, 98, 98, 98, 98, 98, 98, 83, 66, 115, 98, 98, + 98, 98, 98, 98, 98, 98, 99, 99, 240, 240, 192, 25, + 4, 130, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 240, 176, + 28, 8, 130, 130, 98, 98, 98, 98, 98, 98, 98, 98, + 99, 114, 67, 82, 98, 98, 98, 98, 98, 98, 98, 83, + 67, 240, 240, 240, 18, 17, 0, 21, 83, 214, 97, 50, + 51, 65, 65, 83, 34, 50, 116, 0, 30, 32, + 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3130 - 0x318f + // + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x92, 0x01, 0x00, 0x00, // Offset 402 (0x192) + 0xaf, 0x01, 0x00, 0x00, // Offset 431 (0x1af) + 0xcf, 0x01, 0x00, 0x00, // Offset 463 (0x1cf) + 0xeb, 0x01, 0x00, 0x00, // Offset 491 (0x1eb) + 0x0c, 0x02, 0x00, 0x00, // Offset 524 (0x20c) + 0x2c, 0x02, 0x00, 0x00, // Offset 556 (0x22c) + 0x48, 0x02, 0x00, 0x00, // Offset 584 (0x248) + 0x64, 0x02, 0x00, 0x00, // Offset 612 (0x264) + 0x7a, 0x02, 0x00, 0x00, // Offset 634 (0x27a) + 0x9a, 0x02, 0x00, 0x00, // Offset 666 (0x29a) + 0xc2, 0x02, 0x00, 0x00, // Offset 706 (0x2c2) + 0xe9, 0x02, 0x00, 0x00, // Offset 745 (0x2e9) + 0x0b, 0x03, 0x00, 0x00, // Offset 779 (0x30b) + 0x2b, 0x03, 0x00, 0x00, // Offset 811 (0x32b) + 0x4e, 0x03, 0x00, 0x00, // Offset 846 (0x34e) + 0x6f, 0x03, 0x00, 0x00, // Offset 879 (0x36f) + 0x89, 0x03, 0x00, 0x00, // Offset 905 (0x389) + 0xa5, 0x03, 0x00, 0x00, // Offset 933 (0x3a5) + 0xd7, 0x03, 0x00, 0x00, // Offset 983 (0x3d7) + 0x01, 0x04, 0x00, 0x00, // Offset 1025 (0x401) + 0x20, 0x04, 0x00, 0x00, // Offset 1056 (0x420) + 0x45, 0x04, 0x00, 0x00, // Offset 1093 (0x445) + 0x60, 0x04, 0x00, 0x00, // Offset 1120 (0x460) + 0x7c, 0x04, 0x00, 0x00, // Offset 1148 (0x47c) + 0x9d, 0x04, 0x00, 0x00, // Offset 1181 (0x49d) + 0xb3, 0x04, 0x00, 0x00, // Offset 1203 (0x4b3) + 0xc6, 0x04, 0x00, 0x00, // Offset 1222 (0x4c6) + 0xe1, 0x04, 0x00, 0x00, // Offset 1249 (0x4e1) + 0xfc, 0x04, 0x00, 0x00, // Offset 1276 (0x4fc) + 0x18, 0x05, 0x00, 0x00, // Offset 1304 (0x518) + 0x34, 0x05, 0x00, 0x00, // Offset 1332 (0x534) + 0x65, 0x05, 0x00, 0x00, // Offset 1381 (0x565) + 0x81, 0x05, 0x00, 0x00, // Offset 1409 (0x581) + 0xb0, 0x05, 0x00, 0x00, // Offset 1456 (0x5b0) + 0xcd, 0x05, 0x00, 0x00, // Offset 1485 (0x5cd) + 0xfe, 0x05, 0x00, 0x00, // Offset 1534 (0x5fe) + 0x1a, 0x06, 0x00, 0x00, // Offset 1562 (0x61a) + 0x4d, 0x06, 0x00, 0x00, // Offset 1613 (0x64d) + 0x66, 0x06, 0x00, 0x00, // Offset 1638 (0x666) + 0x98, 0x06, 0x00, 0x00, // Offset 1688 (0x698) + 0xd0, 0x06, 0x00, 0x00, // Offset 1744 (0x6d0) + 0x04, 0x07, 0x00, 0x00, // Offset 1796 (0x704) + 0x1c, 0x07, 0x00, 0x00, // Offset 1820 (0x71c) + 0x3b, 0x07, 0x00, 0x00, // Offset 1851 (0x73b) + 0x6d, 0x07, 0x00, 0x00, // Offset 1901 (0x76d) + 0xad, 0x07, 0x00, 0x00, // Offset 1965 (0x7ad) + 0xe0, 0x07, 0x00, 0x00, // Offset 2016 (0x7e0) + 0x01, 0x08, 0x00, 0x00, // Offset 2049 (0x801) + 0x0a, 0x08, 0x00, 0x00, // Offset 2058 (0x80a) + 0x3d, 0x08, 0x00, 0x00, // Offset 2109 (0x83d) + 0x58, 0x08, 0x00, 0x00, // Offset 2136 (0x858) + 0x60, 0x08, 0x00, 0x00, // Offset 2144 (0x860) + 0x7e, 0x08, 0x00, 0x00, // Offset 2174 (0x87e) + 0x9d, 0x08, 0x00, 0x00, // Offset 2205 (0x89d) + 0xbf, 0x08, 0x00, 0x00, // Offset 2239 (0x8bf) + 0xe2, 0x08, 0x00, 0x00, // Offset 2274 (0x8e2) + 0x0e, 0x09, 0x00, 0x00, // Offset 2318 (0x90e) + 0x2d, 0x09, 0x00, 0x00, // Offset 2349 (0x92d) + 0x5e, 0x09, 0x00, 0x00, // Offset 2398 (0x95e) + 0x81, 0x09, 0x00, 0x00, // Offset 2433 (0x981) + 0xa4, 0x09, 0x00, 0x00, // Offset 2468 (0x9a4) + 0xd5, 0x09, 0x00, 0x00, // Offset 2517 (0x9d5) + 0x00, 0x0a, 0x00, 0x00, // Offset 2560 (0xa00) + 0x2c, 0x0a, 0x00, 0x00, // Offset 2604 (0xa2c) + 0x50, 0x0a, 0x00, 0x00, // Offset 2640 (0xa50) + 0x7a, 0x0a, 0x00, 0x00, // Offset 2682 (0xa7a) + 0xa1, 0x0a, 0x00, 0x00, // Offset 2721 (0xaa1) + 0xd5, 0x0a, 0x00, 0x00, // Offset 2773 (0xad5) + 0x09, 0x0b, 0x00, 0x00, // Offset 2825 (0xb09) + 0x37, 0x0b, 0x00, 0x00, // Offset 2871 (0xb37) + 0x5d, 0x0b, 0x00, 0x00, // Offset 2909 (0xb5d) + 0x86, 0x0b, 0x00, 0x00, // Offset 2950 (0xb86) + 0xc2, 0x0b, 0x00, 0x00, // Offset 3010 (0xbc2) + 0xe5, 0x0b, 0x00, 0x00, // Offset 3045 (0xbe5) + 0x08, 0x0c, 0x00, 0x00, // Offset 3080 (0xc08) + 0x2d, 0x0c, 0x00, 0x00, // Offset 3117 (0xc2d) + 0x5b, 0x0c, 0x00, 0x00, // Offset 3163 (0xc5b) + 0x82, 0x0c, 0x00, 0x00, // Offset 3202 (0xc82) + 0x9d, 0x0c, 0x00, 0x00, // Offset 3229 (0xc9d) + 0xca, 0x0c, 0x00, 0x00, // Offset 3274 (0xcca) + 0xe6, 0x0c, 0x00, 0x00, // Offset 3302 (0xce6) + 0x11, 0x0d, 0x00, 0x00, // Offset 3345 (0xd11) + 0x3a, 0x0d, 0x00, 0x00, // Offset 3386 (0xd3a) + 0x62, 0x0d, 0x00, 0x00, // Offset 3426 (0xd62) + 0x86, 0x0d, 0x00, 0x00, // Offset 3462 (0xd86) + 0x9f, 0x0d, 0x00, 0x00, // Offset 3487 (0xd9f) + 0xd8, 0x0d, 0x00, 0x00, // Offset 3544 (0xdd8) + 0x17, 0x0e, 0x00, 0x00, // Offset 3607 (0xe17) + 0x51, 0x0e, 0x00, 0x00, // Offset 3665 (0xe51) + 0x8c, 0x0e, 0x00, 0x00, // Offset 3724 (0xe8c) + 0xde, 0x0e, 0x00, 0x00, // Offset 3806 (0xede) + 0x1a, 0x0f, 0x00, 0x00, // Offset 3866 (0xf1a) + 0x23, 0x0f, 0x00, 0x00, // Offset 3875 (0xf23) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3130 - 0x318f + // + 18, 16, 0, 16, 14, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 0, 20, 32, 29, 18, 0, 18, 15, 1, + 130, 98, 130, 98, 130, 98, 130, 98, 130, 98, 130, 98, + 130, 98, 130, 98, 130, 98, 130, 98, 0, 22, 96, 32, + 20, 0, 18, 114, 120, 67, 178, 66, 194, 66, 194, 51, + 194, 51, 194, 37, 178, 34, 34, 162, 18, 50, 162, 17, + 82, 148, 98, 131, 0, 26, 48, 28, 18, 0, 18, 4, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 240, 18, 240, 18, 240, 18, 177, 78, 0, 22, 96, 33, + 21, 0, 23, 33, 36, 59, 82, 130, 146, 130, 146, 115, + 146, 115, 146, 101, 130, 98, 34, 114, 82, 66, 98, 36, + 98, 85, 17, 115, 145, 145, 0, 24, 32, 20, 0, 21, + 23, 67, 240, 50, 60, 50, 240, 50, 240, 50, 117, 98, + 98, 50, 82, 82, 82, 66, 82, 82, 66, 38, 50, 85, + 69, 0, 25, 80, 28, 18, 0, 18, 15, 1, 66, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 177, 78, 0, 22, 96, 28, 19, 0, 19, + 15, 2, 66, 82, 162, 82, 162, 82, 162, 82, 162, 82, + 162, 82, 162, 82, 162, 82, 81, 79, 82, 0, 25, 64, + 22, 18, 0, 18, 30, 243, 243, 243, 242, 79, 82, 240, + 18, 240, 18, 240, 18, 177, 78, 0, 22, 96, 32, 18, + 0, 18, 15, 1, 146, 82, 145, 98, 145, 98, 145, 98, + 41, 82, 50, 178, 50, 178, 50, 178, 50, 52, 66, 54, + 114, 240, 17, 0, 20, 80, 40, 18, 0, 18, 15, 1, + 130, 18, 50, 130, 18, 50, 130, 18, 50, 130, 18, 50, + 40, 18, 50, 50, 98, 50, 50, 98, 50, 50, 98, 50, + 50, 98, 50, 55, 23, 52, 66, 0, 21, 16, 39, 18, + 0, 17, 36, 43, 50, 130, 18, 50, 130, 18, 50, 130, + 18, 50, 130, 23, 40, 18, 50, 50, 98, 50, 50, 98, + 50, 50, 98, 50, 50, 35, 23, 53, 50, 50, 0, 22, + 96, 34, 20, 0, 18, 114, 121, 51, 178, 66, 194, 66, + 194, 51, 194, 50, 120, 51, 114, 114, 18, 98, 114, 34, + 82, 98, 66, 66, 52, 83, 56, 114, 0, 25, 32, 32, + 19, 0, 18, 81, 47, 1, 146, 18, 226, 18, 226, 18, + 226, 18, 136, 23, 66, 98, 146, 98, 146, 98, 146, 68, + 81, 54, 40, 51, 0, 23, 32, 35, 20, 0, 20, 15, + 3, 130, 240, 50, 19, 19, 162, 35, 18, 162, 50, 18, + 72, 50, 18, 82, 130, 18, 82, 130, 18, 82, 130, 18, + 82, 30, 52, 0, 26, 112, 33, 21, 0, 21, 8, 38, + 97, 66, 240, 66, 146, 141, 130, 216, 53, 98, 114, 50, + 82, 98, 82, 66, 98, 82, 66, 36, 18, 50, 85, 85, + 0, 26, 112, 26, 17, 0, 17, 14, 82, 130, 82, 130, + 82, 130, 82, 130, 82, 130, 82, 130, 82, 130, 82, 130, + 93, 66, 0, 22, 112, 28, 16, 0, 15, 33, 82, 147, + 51, 130, 66, 130, 66, 130, 76, 66, 130, 66, 130, 66, + 130, 66, 130, 76, 66, 130, 0, 20, 32, 50, 18, 0, + 17, 35, 115, 19, 50, 35, 50, 18, 50, 50, 50, 18, + 50, 50, 50, 18, 50, 55, 23, 50, 50, 18, 50, 50, + 50, 18, 50, 50, 50, 18, 50, 50, 50, 18, 50, 50, + 50, 23, 55, 18, 50, 50, 50, 17, 0, 21, 32, 42, + 20, 0, 20, 2, 51, 51, 114, 50, 66, 114, 50, 51, + 114, 50, 50, 135, 50, 130, 50, 36, 114, 50, 34, 17, + 114, 50, 18, 34, 98, 50, 17, 66, 82, 52, 82, 72, + 99, 50, 50, 0, 24, 31, 19, 0, 17, 65, 240, 52, + 240, 19, 240, 18, 240, 19, 240, 18, 240, 20, 226, 35, + 178, 82, 146, 115, 98, 148, 50, 179, 33, 0, 23, 80, + 37, 21, 0, 21, 67, 68, 179, 67, 179, 67, 178, 82, + 194, 67, 179, 67, 162, 18, 34, 18, 146, 34, 18, 34, + 114, 67, 67, 66, 82, 99, 34, 82, 129, 161, 0, 25, + 32, 27, 14, 0, 12, 99, 194, 152, 82, 98, 66, 98, + 50, 130, 34, 130, 34, 130, 34, 130, 50, 98, 82, 66, + 118, 0, 18, 16, 28, 20, 0, 22, 110, 240, 19, 240, + 19, 240, 19, 240, 19, 240, 19, 240, 18, 19, 195, 67, + 146, 131, 83, 163, 34, 0, 24, 96, 33, 20, 0, 21, + 113, 95, 178, 67, 163, 66, 178, 67, 162, 82, 178, 67, + 162, 18, 37, 114, 37, 35, 82, 67, 67, 50, 82, 98, + 33, 98, 0, 23, 112, 22, 19, 0, 17, 24, 0, 5, + 109, 243, 243, 243, 243, 242, 19, 179, 67, 115, 132, 35, + 194, 0, 24, 19, 16, 0, 16, 14, 226, 226, 226, 226, + 226, 61, 226, 226, 226, 226, 226, 0, 18, 32, 27, 18, + 0, 18, 15, 1, 66, 240, 18, 240, 18, 240, 18, 240, + 29, 82, 240, 18, 240, 18, 240, 18, 240, 30, 0, 22, + 96, 27, 18, 0, 19, 113, 62, 194, 148, 67, 146, 67, + 146, 67, 146, 66, 162, 66, 162, 66, 162, 66, 34, 47, + 1, 0, 22, 96, 28, 19, 0, 17, 24, 240, 240, 193, + 47, 2, 240, 197, 194, 67, 146, 114, 130, 114, 130, 114, + 130, 114, 146, 67, 197, 0, 22, 48, 28, 12, 240, 148, + 163, 162, 162, 162, 162, 162, 162, 162, 162, 167, 82, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 0, 8, 48, + 49, 11, 240, 194, 66, 67, 51, 50, 66, 50, 66, 50, + 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, 71, 66, + 50, 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, 66, + 50, 66, 50, 66, 50, 66, 50, 66, 50, 146, 0, 5, + 96, 28, 12, 240, 146, 180, 162, 162, 162, 162, 162, 167, + 82, 162, 162, 162, 162, 167, 82, 162, 162, 162, 162, 162, + 162, 162, 161, 0, 7, 47, 11, 240, 240, 132, 36, 50, + 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, 71, 66, + 50, 66, 50, 66, 50, 66, 50, 71, 66, 50, 66, 50, + 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, + 145, 0, 5, 112, 29, 11, 240, 240, 117, 146, 146, 146, + 146, 146, 146, 146, 146, 41, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 0, 5, 96, 49, 14, 0, + 6, 21, 84, 50, 114, 50, 114, 50, 114, 50, 114, 50, + 114, 50, 114, 50, 114, 50, 39, 50, 114, 50, 114, 50, + 114, 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, 50, + 114, 50, 114, 50, 114, 50, 194, 0, 7, 32, 28, 11, + 240, 180, 147, 146, 146, 146, 146, 146, 41, 146, 146, 146, + 146, 146, 41, 146, 146, 146, 146, 146, 146, 146, 146, 0, + 7, 16, 51, 14, 240, 240, 84, 99, 51, 99, 50, 114, + 50, 114, 50, 114, 50, 114, 50, 39, 50, 114, 50, 114, + 50, 114, 50, 114, 50, 114, 50, 39, 50, 114, 50, 114, + 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, + 50, 194, 0, 7, 32, 25, 23, 0, 29, 84, 240, 98, + 240, 98, 240, 98, 240, 98, 240, 98, 240, 98, 240, 98, + 145, 47, 5, 0, 29, 16, 50, 24, 0, 7, 69, 240, + 99, 240, 114, 240, 114, 240, 114, 240, 114, 240, 114, 240, + 114, 179, 130, 210, 114, 210, 119, 130, 114, 210, 114, 210, + 99, 216, 18, 121, 98, 240, 114, 240, 114, 240, 114, 240, + 114, 240, 114, 240, 114, 0, 15, 112, 56, 21, 0, 7, + 5, 196, 35, 226, 50, 226, 50, 226, 50, 226, 50, 226, + 50, 226, 50, 84, 82, 50, 114, 82, 50, 114, 87, 114, + 82, 50, 114, 82, 50, 114, 82, 50, 121, 50, 40, 66, + 50, 226, 50, 226, 50, 226, 50, 226, 50, 226, 50, 240, + 66, 0, 13, 48, 52, 20, 0, 6, 83, 240, 67, 240, + 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 113, + 162, 131, 114, 146, 114, 146, 114, 146, 114, 146, 114, 146, + 69, 45, 50, 54, 146, 240, 50, 240, 50, 240, 50, 240, + 50, 240, 50, 240, 50, 0, 10, 32, 24, 23, 0, 30, + 19, 212, 67, 226, 82, 226, 82, 226, 82, 226, 82, 226, + 82, 226, 82, 81, 47, 6, 0, 29, 31, 23, 0, 37, + 63, 6, 33, 146, 240, 98, 240, 98, 240, 98, 240, 98, + 240, 98, 240, 98, 240, 98, 240, 98, 240, 98, 240, 98, + 0, 12, 112, 50, 20, 0, 9, 21, 240, 50, 240, 50, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 197, 18, 42, 98, 130, 130, 130, 130, 130, 40, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 240, 50, 0, 10, 32, 64, 21, 0, 7, 4, 227, 35, + 227, 34, 242, 34, 242, 34, 242, 34, 242, 34, 242, 34, + 242, 34, 242, 34, 194, 18, 34, 42, 50, 34, 130, 82, + 34, 130, 82, 34, 130, 82, 34, 130, 22, 34, 130, 82, + 34, 130, 82, 34, 130, 82, 34, 130, 82, 34, 130, 82, + 34, 130, 82, 34, 240, 66, 0, 10, 96, 51, 20, 0, + 6, 83, 240, 67, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 35, 170, 42, + 98, 146, 114, 146, 114, 146, 114, 146, 114, 146, 114, 146, + 114, 146, 114, 146, 114, 146, 114, 240, 50, 0, 10, 32, + 33, 23, 0, 37, 1, 47, 6, 33, 82, 82, 226, 82, + 226, 82, 226, 82, 226, 82, 226, 82, 226, 82, 226, 82, + 226, 82, 226, 82, 240, 98, 0, 12, 64, 9, 23, 0, + 51, 49, 47, 6, 0, 29, 51, 20, 0, 6, 83, 240, + 67, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, + 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, + 50, 200, 43, 82, 50, 210, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 50, 240, 50, 0, 10, 32, 27, 7, 227, + 99, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 240, 240, + 8, 3, 240, 240, 145, 0, 5, 112, 30, 20, 0, 20, + 2, 100, 147, 98, 162, 98, 162, 98, 162, 98, 162, 98, + 162, 98, 162, 98, 162, 98, 162, 38, 36, 69, 53, 0, + 25, 80, 31, 20, 0, 20, 3, 90, 66, 98, 162, 98, + 162, 98, 162, 98, 162, 98, 162, 98, 162, 98, 162, 98, + 162, 50, 18, 166, 40, 81, 0, 24, 64, 34, 20, 0, + 20, 2, 163, 99, 146, 114, 131, 114, 130, 130, 130, 130, + 116, 114, 114, 18, 98, 98, 34, 98, 82, 66, 82, 36, + 98, 69, 18, 113, 0, 25, 32, 35, 21, 0, 21, 2, + 148, 115, 131, 130, 131, 130, 132, 114, 114, 33, 114, 114, + 34, 98, 98, 50, 98, 98, 66, 82, 82, 82, 82, 37, + 98, 69, 41, 0, 26, 80, 44, 24, 0, 23, 1, 126, + 50, 178, 66, 50, 178, 66, 50, 178, 66, 35, 177, 82, + 34, 104, 66, 35, 98, 146, 18, 18, 82, 146, 18, 18, + 82, 148, 50, 66, 51, 52, 66, 53, 99, 82, 226, 0, + 28, 32, 31, 19, 0, 19, 15, 1, 146, 18, 226, 18, + 226, 18, 226, 18, 136, 18, 146, 98, 146, 98, 146, 98, + 146, 68, 81, 54, 40, 51, 0, 23, 32, 49, 24, 0, + 22, 50, 34, 122, 34, 35, 162, 18, 34, 35, 162, 18, + 34, 34, 178, 18, 34, 34, 178, 22, 34, 103, 18, 34, + 19, 114, 82, 34, 20, 98, 82, 36, 34, 82, 82, 36, + 35, 66, 42, 67, 53, 38, 97, 0, 30, 48, 35, 20, + 0, 20, 8, 51, 194, 51, 194, 51, 194, 52, 178, 34, + 33, 88, 34, 34, 82, 98, 65, 82, 98, 66, 66, 98, + 81, 66, 52, 98, 53, 42, 0, 25, 32, 35, 21, 0, + 21, 8, 131, 49, 76, 146, 240, 66, 240, 66, 53, 88, + 34, 50, 82, 98, 82, 66, 98, 82, 66, 98, 82, 66, + 36, 18, 50, 85, 85, 0, 26, 112, 49, 18, 0, 17, + 35, 59, 35, 50, 50, 18, 50, 50, 50, 18, 50, 50, + 50, 18, 50, 50, 50, 23, 50, 50, 18, 50, 50, 50, + 18, 50, 50, 50, 18, 50, 50, 50, 18, 50, 50, 50, + 23, 55, 18, 50, 50, 97, 0, 21, 32, 43, 20, 0, + 20, 8, 52, 98, 50, 66, 114, 50, 66, 114, 50, 51, + 114, 50, 50, 130, 50, 51, 114, 50, 34, 18, 98, 50, + 33, 49, 98, 50, 18, 50, 82, 50, 17, 82, 72, 114, + 50, 65, 0, 24, 44, 19, 0, 19, 8, 51, 98, 50, + 51, 98, 50, 51, 98, 50, 52, 82, 50, 34, 33, 82, + 50, 34, 34, 66, 50, 19, 49, 66, 50, 18, 66, 50, + 50, 18, 66, 50, 52, 97, 63, 1, 50, 0, 23, 48, + 36, 15, 0, 9, 61, 66, 114, 66, 114, 66, 114, 66, + 114, 66, 114, 75, 66, 0, 5, 116, 146, 66, 98, 98, + 82, 98, 82, 98, 82, 98, 98, 66, 148, 0, 11, 112, + 42, 18, 0, 18, 2, 52, 22, 50, 66, 17, 50, 50, + 66, 82, 50, 66, 82, 56, 82, 50, 66, 82, 50, 66, + 82, 50, 66, 82, 50, 66, 82, 50, 66, 82, 56, 82, + 50, 66, 82, 0, 20, 64, 39, 20, 0, 20, 4, 35, + 24, 66, 50, 34, 146, 50, 34, 146, 50, 34, 151, 34, + 146, 50, 34, 146, 50, 34, 146, 50, 34, 146, 50, 34, + 146, 50, 34, 151, 39, 66, 49, 0, 24, 52, 22, 0, + 19, 113, 65, 180, 19, 42, 66, 34, 50, 18, 34, 66, + 34, 50, 82, 66, 34, 50, 82, 70, 34, 98, 66, 34, + 35, 82, 66, 34, 18, 18, 66, 66, 34, 18, 34, 50, + 66, 36, 66, 34, 71, 83, 18, 65, 50, 162, 0, 27, + 96, 52, 22, 0, 19, 97, 65, 195, 19, 35, 23, 50, + 34, 50, 34, 114, 34, 35, 34, 114, 34, 34, 50, 118, + 34, 50, 114, 34, 34, 50, 114, 34, 20, 34, 114, 34, + 18, 18, 18, 114, 36, 49, 18, 114, 35, 68, 119, 87, + 49, 50, 0, 26, 80, 46, 22, 0, 19, 114, 244, 35, + 25, 82, 50, 67, 130, 50, 67, 130, 50, 66, 151, 66, + 146, 50, 51, 146, 50, 52, 130, 50, 35, 18, 114, 50, + 34, 50, 98, 50, 18, 67, 87, 17, 99, 66, 51, 129, + 0, 25, 16, 38, 20, 0, 20, 4, 44, 66, 50, 34, + 146, 50, 34, 146, 50, 34, 151, 34, 146, 50, 39, 66, + 50, 34, 146, 50, 34, 146, 50, 34, 146, 50, 34, 151, + 39, 66, 0, 24, 64, 41, 15, 0, 6, 99, 52, 99, + 66, 114, 66, 114, 75, 66, 114, 66, 114, 66, 114, 66, + 114, 75, 66, 114, 240, 132, 146, 66, 98, 98, 82, 98, + 82, 98, 82, 98, 98, 66, 148, 0, 11, 112, 60, 18, + 0, 7, 115, 19, 36, 20, 18, 34, 66, 50, 18, 34, + 66, 50, 18, 34, 71, 22, 66, 50, 18, 34, 66, 50, + 18, 34, 66, 50, 18, 34, 66, 50, 18, 34, 71, 22, + 66, 50, 18, 34, 240, 196, 194, 66, 146, 98, 130, 98, + 130, 98, 130, 98, 146, 66, 196, 0, 14, 48, 35, 18, + 0, 16, 18, 240, 35, 24, 99, 114, 98, 130, 98, 130, + 83, 130, 84, 114, 66, 34, 98, 50, 51, 82, 50, 67, + 66, 34, 99, 50, 33, 210, 0, 22, 96, 35, 21, 0, + 21, 67, 36, 210, 66, 210, 66, 195, 66, 194, 82, 179, + 82, 180, 66, 162, 34, 50, 162, 50, 34, 146, 82, 18, + 81, 34, 98, 23, 49, 0, 26, 16, 37, 21, 0, 18, + 113, 240, 99, 25, 130, 66, 210, 66, 195, 66, 194, 82, + 195, 66, 178, 18, 50, 178, 33, 50, 162, 50, 34, 146, + 82, 18, 81, 34, 98, 24, 0, 26, 64, 46, 19, 0, + 17, 1, 148, 99, 35, 50, 99, 50, 50, 98, 66, 50, + 98, 66, 50, 83, 71, 83, 66, 50, 66, 18, 50, 50, + 66, 34, 34, 50, 50, 66, 18, 50, 49, 82, 18, 50, + 33, 121, 194, 50, 0, 21, 80, 39, 22, 0, 22, 66, + 240, 98, 42, 130, 98, 179, 98, 178, 99, 179, 82, 178, + 17, 83, 146, 34, 50, 18, 130, 50, 34, 34, 98, 84, + 66, 66, 114, 99, 33, 129, 129, 0, 25, 16, 27, 14, + 0, 12, 98, 211, 179, 162, 17, 162, 18, 130, 50, 114, + 50, 98, 82, 67, 97, 66, 114, 35, 129, 44, 0, 17, + 96, 45, 21, 0, 21, 51, 115, 117, 85, 82, 50, 50, + 50, 66, 50, 50, 50, 50, 82, 18, 82, 34, 82, 18, + 82, 34, 82, 18, 82, 34, 82, 18, 82, 50, 50, 50, + 50, 66, 50, 50, 50, 99, 100, 0, 26, 112, 28, 13, + 0, 10, 20, 178, 178, 149, 99, 51, 66, 82, 50, 114, + 34, 114, 34, 114, 34, 114, 50, 82, 67, 51, 101, 0, + 16, 112, 43, 21, 0, 18, 83, 240, 82, 115, 146, 130, + 132, 99, 99, 35, 66, 114, 66, 51, 98, 98, 36, 82, + 98, 34, 17, 82, 98, 18, 34, 66, 82, 18, 66, 66, + 66, 17, 98, 84, 33, 129, 0, 26, 64, 41, 21, 0, + 21, 51, 99, 162, 114, 148, 99, 103, 66, 17, 98, 66, + 50, 18, 66, 98, 18, 49, 66, 98, 18, 50, 50, 98, + 18, 50, 50, 100, 81, 66, 66, 18, 82, 84, 57, 0, + 26, 64, 40, 18, 0, 8, 34, 78, 209, 179, 51, 162, + 66, 162, 66, 162, 66, 162, 66, 162, 66, 19, 47, 240, + 240, 244, 194, 66, 146, 98, 130, 98, 130, 98, 130, 98, + 146, 66, 196, 0, 14, 64, 36, 22, 0, 22, 37, 85, + 240, 240, 82, 130, 41, 26, 240, 196, 100, 114, 34, 66, + 34, 82, 66, 34, 66, 66, 66, 34, 66, 67, 34, 51, + 34, 116, 100, 0, 28, 16, 25, 19, 0, 19, 15, 2, + 0, 8, 21, 194, 67, 146, 114, 130, 114, 130, 114, 130, + 114, 146, 67, 197, 0, 22, 48, 57, 25, 0, 10, 118, + 240, 130, 240, 130, 240, 130, 240, 130, 240, 130, 240, 135, + 179, 66, 179, 50, 66, 194, 50, 66, 194, 50, 66, 194, + 50, 66, 65, 114, 50, 71, 114, 50, 21, 126, 34, 135, + 130, 240, 130, 240, 130, 240, 130, 240, 130, 240, 130, 240, + 130, 0, 13, 48, 63, 21, 0, 9, 100, 212, 34, 242, + 34, 242, 34, 242, 34, 242, 34, 246, 147, 50, 34, 68, + 35, 34, 34, 98, 50, 34, 34, 98, 50, 34, 34, 98, + 50, 34, 34, 98, 50, 38, 98, 50, 19, 34, 44, 18, + 34, 53, 114, 34, 242, 34, 242, 34, 242, 34, 242, 34, + 242, 34, 240, 66, 0, 10, 96, 58, 20, 0, 6, 98, + 240, 67, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 97, 68, 50, 99, 66, 50, 114, 66, 50, 114, + 66, 50, 114, 66, 50, 114, 66, 50, 114, 71, 45, 50, + 54, 146, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 0, 10, 32, 59, 20, 0, 9, 21, 240, 50, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 50, 212, 18, 43, 82, 98, 50, 82, 98, + 50, 22, 98, 50, 82, 98, 50, 82, 98, 50, 82, 98, + 50, 22, 98, 50, 82, 98, 50, 82, 98, 50, 82, 240, + 50, 0, 10, 32, 82, 22, 0, 7, 49, 240, 49, 52, + 228, 34, 240, 18, 34, 240, 18, 34, 240, 18, 34, 240, + 18, 34, 240, 18, 34, 240, 18, 34, 240, 18, 34, 240, + 18, 34, 33, 72, 18, 34, 57, 66, 34, 98, 34, 66, + 34, 98, 34, 21, 34, 98, 34, 66, 34, 98, 34, 66, + 34, 98, 34, 21, 34, 98, 34, 21, 34, 98, 34, 66, + 34, 98, 34, 66, 34, 98, 34, 66, 34, 240, 82, 0, + 11, 32, 60, 20, 0, 6, 82, 240, 68, 240, 50, 240, + 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, + 50, 240, 50, 200, 44, 66, 114, 50, 66, 114, 50, 66, + 114, 50, 66, 114, 50, 66, 114, 50, 66, 114, 50, 66, + 114, 50, 66, 114, 50, 66, 114, 50, 66, 240, 50, 0, + 10, 32, 9, 5, 0, 7, 67, 35, 35, 0, 9, 32, + 10, 240, 240, 53, 115, 130, 130, 130, 130, 130, 130, 130, + 35, 50, 35, 50, 35, 50, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 240, 240, 192, + 0, // Padding + +}; + +tFont *g_psFontWHangulmyeongjo24ptb = (tFont *)g_pui8Hangulmyeongjo24ptb; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard14.c b/third_party/fonts/ofl/fonts/fontoldstandard14.c new file mode 100644 index 0000000..29d9af7 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard14.c @@ -0,0 +1,553 @@ +//***************************************************************************** +// +// fontoldstandard14.c - Font definition for the 14pt Oldstandard font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 14 point +// Bold: no +// Italic: no +// Memory usage: 4204 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 14 point Oldstandard font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard14Data[4002] = +{ + 4, 6, 0, 15, 13, 2, 161, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 176, 11, 4, 240, 17, 17, 17, 17, + 17, 0, 6, 112, 24, 9, 0, 6, 33, 81, 33, 56, + 49, 33, 81, 17, 97, 17, 72, 33, 33, 81, 33, 81, + 33, 0, 6, 16, 28, 7, 240, 130, 82, 68, 33, 18, + 17, 17, 18, 17, 17, 18, 67, 83, 66, 17, 20, 17, + 17, 18, 17, 36, 66, 240, 240, 16, 33, 10, 0, 6, + 35, 113, 33, 33, 49, 33, 17, 65, 33, 17, 82, 17, + 33, 97, 17, 17, 65, 33, 17, 49, 49, 17, 49, 49, + 17, 114, 0, 6, 64, 28, 10, 0, 6, 67, 97, 49, + 81, 49, 82, 17, 114, 35, 33, 17, 49, 33, 49, 17, + 49, 66, 49, 81, 69, 18, 0, 6, 48, 7, 2, 129, + 17, 17, 240, 192, 16, 4, 240, 113, 33, 49, 33, 49, + 49, 49, 49, 49, 65, 49, 65, 208, 16, 4, 240, 81, + 65, 49, 65, 49, 49, 49, 49, 49, 33, 49, 33, 240, + 17, 6, 240, 240, 33, 81, 49, 17, 17, 35, 33, 17, + 17, 49, 0, 7, 16, 20, 14, 0, 9, 65, 209, 209, + 209, 209, 209, 125, 113, 209, 209, 209, 209, 209, 240, 240, + 80, 10, 3, 240, 240, 145, 34, 33, 33, 17, 128, 8, + 4, 240, 240, 227, 240, 240, 48, 6, 2, 240, 177, 17, + 176, 17, 5, 240, 209, 65, 49, 65, 65, 65, 49, 65, + 65, 49, 65, 65, 65, 224, 25, 7, 240, 240, 114, 65, + 33, 33, 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, + 65, 17, 49, 51, 240, 240, 128, 15, 4, 240, 113, 19, + 49, 49, 49, 49, 49, 49, 49, 49, 240, 96, 21, 7, + 240, 240, 100, 33, 65, 17, 65, 18, 49, 81, 81, 81, + 81, 97, 49, 22, 240, 240, 96, 21, 7, 240, 240, 99, + 49, 49, 34, 33, 97, 51, 113, 113, 18, 49, 18, 49, + 36, 240, 240, 112, 20, 8, 240, 240, 225, 113, 98, 81, + 17, 65, 33, 65, 33, 55, 81, 113, 113, 240, 240, 208, + 20, 7, 240, 209, 101, 33, 97, 101, 33, 65, 97, 97, + 18, 49, 17, 49, 51, 240, 240, 128, 24, 7, 240, 240, + 115, 49, 34, 17, 97, 18, 50, 33, 33, 65, 17, 65, + 17, 65, 17, 49, 52, 240, 240, 112, 17, 6, 240, 245, + 17, 49, 81, 65, 65, 81, 81, 66, 66, 66, 240, 240, + 48, 24, 7, 240, 240, 100, 33, 65, 17, 65, 18, 49, + 36, 49, 19, 17, 65, 17, 65, 17, 65, 36, 240, 240, + 112, 25, 7, 240, 240, 99, 49, 49, 33, 65, 17, 65, + 17, 50, 35, 17, 97, 18, 33, 33, 49, 49, 17, 240, + 240, 128, 8, 2, 240, 17, 17, 113, 17, 176, 10, 3, + 240, 146, 18, 161, 34, 33, 17, 176, 19, 12, 0, 8, + 82, 145, 146, 130, 130, 145, 162, 193, 194, 194, 194, 193, + 193, 240, 160, 10, 12, 0, 13, 75, 240, 171, 0, 10, + 80, 19, 12, 0, 7, 66, 193, 194, 194, 194, 193, 178, + 145, 146, 130, 130, 145, 0, 5, 96, 20, 6, 240, 240, + 19, 33, 49, 18, 33, 66, 50, 50, 65, 17, 65, 81, + 81, 240, 240, 48, 38, 11, 0, 5, 116, 97, 66, 49, + 34, 18, 33, 33, 33, 33, 17, 18, 33, 33, 17, 17, + 49, 33, 17, 17, 33, 49, 17, 17, 33, 33, 49, 18, + 18, 65, 181, 0, 7, 48, 24, 10, 240, 240, 225, 145, + 145, 131, 113, 17, 97, 33, 97, 34, 85, 65, 65, 65, + 66, 35, 51, 0, 6, 48, 26, 7, 240, 213, 33, 65, + 17, 65, 17, 65, 17, 49, 36, 49, 49, 33, 65, 17, + 65, 17, 65, 17, 34, 240, 240, 112, 24, 9, 240, 240, + 131, 33, 33, 51, 17, 82, 17, 97, 17, 129, 129, 129, + 97, 17, 81, 49, 65, 68, 0, 6, 27, 9, 240, 240, + 102, 49, 81, 33, 81, 33, 97, 17, 97, 17, 97, 17, + 97, 17, 97, 17, 81, 33, 81, 33, 50, 0, 6, 27, + 8, 240, 240, 39, 17, 81, 17, 81, 17, 81, 17, 33, + 68, 65, 33, 65, 81, 17, 81, 17, 81, 17, 51, 240, + 240, 176, 23, 8, 240, 240, 39, 17, 81, 17, 81, 17, + 81, 17, 33, 68, 65, 33, 65, 113, 113, 113, 0, 5, + 112, 29, 10, 240, 240, 196, 17, 49, 66, 33, 97, 33, + 97, 33, 145, 68, 17, 82, 33, 82, 33, 82, 49, 49, + 17, 67, 33, 0, 6, 64, 28, 8, 240, 240, 34, 50, + 17, 81, 17, 81, 17, 81, 17, 81, 23, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 240, 240, 176, 14, 2, + 129, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 176, + 20, 6, 240, 209, 81, 81, 81, 81, 81, 81, 81, 18, + 33, 17, 49, 33, 17, 240, 240, 32, 28, 8, 240, 240, + 33, 51, 17, 49, 49, 33, 65, 33, 65, 17, 84, 65, + 33, 65, 34, 49, 49, 49, 50, 33, 51, 240, 240, 176, + 20, 7, 240, 210, 81, 97, 97, 97, 97, 97, 97, 97, + 65, 17, 65, 17, 35, 240, 240, 96, 41, 9, 240, 240, + 114, 65, 34, 50, 35, 34, 33, 17, 17, 17, 33, 17, + 17, 17, 33, 17, 17, 17, 33, 17, 17, 17, 33, 34, + 17, 33, 33, 33, 33, 33, 33, 19, 17, 33, 0, 5, + 96, 35, 10, 240, 240, 178, 51, 34, 65, 49, 17, 49, + 49, 17, 49, 49, 33, 33, 49, 33, 33, 49, 49, 17, + 49, 49, 17, 49, 66, 49, 66, 35, 65, 0, 6, 64, + 26, 9, 240, 240, 132, 65, 65, 33, 81, 33, 97, 17, + 97, 17, 97, 17, 97, 17, 97, 17, 81, 49, 65, 68, + 0, 6, 21, 7, 240, 213, 33, 65, 17, 65, 17, 65, + 17, 65, 21, 33, 97, 97, 97, 97, 240, 240, 176, 31, + 9, 240, 240, 132, 65, 65, 33, 81, 33, 97, 17, 97, + 17, 97, 17, 97, 17, 97, 17, 34, 17, 50, 34, 68, + 17, 97, 17, 98, 240, 224, 28, 9, 240, 240, 101, 65, + 65, 49, 65, 49, 65, 49, 49, 68, 81, 49, 65, 50, + 49, 50, 49, 50, 17, 17, 66, 0, 5, 112, 24, 8, + 240, 240, 51, 65, 50, 33, 65, 33, 130, 115, 115, 17, + 81, 17, 81, 18, 65, 17, 20, 240, 240, 192, 24, 10, + 240, 240, 169, 17, 49, 49, 17, 49, 49, 17, 49, 49, + 81, 145, 145, 145, 145, 145, 145, 0, 6, 112, 27, 9, + 240, 240, 97, 67, 17, 81, 33, 81, 33, 81, 33, 81, + 33, 81, 33, 81, 33, 81, 33, 81, 33, 66, 53, 0, + 6, 25, 10, 240, 240, 163, 51, 34, 65, 65, 49, 81, + 49, 82, 33, 97, 17, 113, 17, 115, 130, 129, 145, 0, + 6, 112, 38, 14, 0, 7, 2, 51, 35, 33, 65, 65, + 49, 50, 49, 66, 35, 33, 81, 33, 17, 33, 81, 17, + 33, 17, 99, 33, 17, 99, 35, 113, 65, 129, 65, 129, + 65, 0, 9, 48, 25, 9, 240, 240, 99, 35, 49, 49, + 66, 17, 98, 114, 129, 115, 81, 33, 81, 34, 49, 65, + 34, 51, 0, 5, 96, 23, 9, 240, 240, 99, 50, 34, + 49, 65, 49, 81, 17, 97, 17, 113, 129, 129, 129, 129, + 129, 0, 6, 16, 25, 9, 240, 240, 118, 33, 66, 33, + 65, 49, 50, 113, 113, 114, 113, 65, 34, 65, 33, 66, + 17, 66, 0, 5, 112, 18, 4, 240, 18, 33, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 51, 144, 18, + 5, 240, 81, 65, 65, 65, 81, 65, 65, 81, 65, 65, + 65, 81, 65, 240, 16, 18, 4, 240, 34, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 19, 144, 15, + 7, 240, 240, 129, 82, 65, 33, 33, 49, 33, 65, 0, + 8, 112, 7, 8, 0, 17, 7, 240, 32, 7, 3, 241, + 49, 240, 240, 160, 18, 7, 0, 7, 19, 49, 49, 49, + 33, 52, 33, 49, 33, 50, 22, 240, 240, 96, 23, 6, + 240, 145, 81, 81, 81, 84, 33, 49, 17, 49, 17, 49, + 17, 49, 17, 49, 33, 17, 240, 240, 32, 17, 6, 0, + 6, 19, 33, 49, 17, 49, 17, 81, 81, 97, 17, 240, + 240, 32, 24, 6, 240, 209, 81, 81, 81, 34, 17, 17, + 34, 17, 49, 17, 49, 17, 49, 17, 49, 33, 18, 240, + 240, 16, 18, 6, 0, 6, 19, 33, 33, 33, 49, 21, + 17, 81, 49, 33, 17, 240, 240, 32, 17, 4, 240, 34, + 17, 17, 17, 49, 49, 49, 49, 49, 49, 49, 49, 240, + 128, 22, 7, 0, 7, 21, 17, 50, 17, 49, 33, 49, + 51, 49, 101, 33, 65, 17, 65, 33, 33, 240, 16, 24, + 6, 240, 145, 81, 81, 81, 81, 18, 34, 33, 17, 49, + 17, 49, 17, 49, 17, 49, 17, 49, 240, 240, 16, 12, + 2, 161, 17, 49, 17, 17, 17, 17, 17, 17, 176, 17, + 5, 240, 209, 65, 145, 65, 65, 65, 65, 65, 65, 65, + 18, 17, 34, 192, 23, 6, 240, 145, 81, 81, 81, 81, + 33, 33, 17, 49, 17, 51, 49, 17, 49, 33, 33, 34, + 240, 240, 16, 14, 2, 129, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 176, 28, 10, 0, 10, 1, 18, 34, + 34, 34, 33, 17, 49, 49, 17, 49, 49, 17, 49, 49, + 17, 49, 49, 17, 49, 49, 0, 6, 48, 21, 6, 0, + 6, 1, 18, 34, 33, 17, 49, 17, 49, 17, 49, 17, + 49, 17, 49, 240, 240, 16, 20, 6, 0, 6, 19, 33, + 49, 17, 49, 17, 49, 17, 49, 17, 49, 33, 17, 240, + 240, 32, 23, 6, 0, 6, 4, 33, 49, 17, 49, 17, + 49, 17, 49, 17, 49, 18, 17, 33, 17, 49, 81, 240, + 32, 22, 6, 0, 6, 19, 33, 49, 17, 49, 17, 49, + 17, 49, 17, 49, 33, 18, 49, 17, 81, 81, 208, 14, + 5, 240, 240, 164, 18, 17, 17, 65, 65, 65, 65, 240, + 224, 17, 6, 0, 6, 3, 49, 82, 83, 33, 34, 17, + 49, 18, 18, 240, 240, 16, 16, 4, 240, 81, 49, 49, + 49, 49, 49, 49, 49, 49, 17, 19, 240, 96, 21, 6, + 0, 6, 1, 49, 17, 49, 17, 49, 17, 49, 17, 49, + 17, 34, 34, 17, 240, 240, 16, 18, 6, 0, 6, 2, + 33, 33, 33, 33, 17, 49, 17, 66, 65, 81, 240, 240, + 48, 25, 10, 0, 10, 2, 33, 49, 33, 33, 33, 49, + 17, 17, 17, 66, 17, 17, 66, 18, 82, 33, 145, 0, + 6, 80, 19, 6, 0, 6, 2, 33, 33, 17, 50, 81, + 65, 17, 49, 17, 33, 34, 240, 240, 16, 21, 7, 0, + 7, 17, 49, 33, 33, 49, 33, 65, 17, 66, 82, 97, + 81, 65, 17, 66, 240, 64, 17, 6, 0, 6, 5, 17, + 33, 66, 65, 66, 65, 33, 17, 49, 240, 240, 16, 17, + 3, 240, 17, 33, 33, 33, 33, 33, 17, 49, 33, 33, + 33, 33, 33, 112, 17, 2, 129, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 80, 16, 3, 241, + 33, 33, 33, 33, 33, 49, 17, 33, 33, 33, 33, 33, + 128, 14, 9, 0, 10, 19, 65, 17, 34, 33, 17, 67, + 0, 9, 16, 4, 6, 0, 15, 14, 2, 240, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 80, 23, 6, 240, + 240, 129, 81, 67, 33, 17, 17, 17, 17, 17, 17, 17, + 49, 17, 49, 17, 67, 65, 240, 192, 23, 9, 0, 6, + 34, 82, 33, 65, 49, 65, 116, 97, 129, 97, 17, 81, + 18, 49, 19, 19, 0, 5, 112, 23, 7, 240, 240, 193, + 18, 17, 33, 33, 33, 65, 17, 65, 17, 65, 33, 33, + 33, 18, 17, 0, 6, 32, 21, 8, 240, 240, 163, 34, + 33, 49, 65, 17, 81, 17, 97, 85, 53, 81, 113, 113, + 240, 240, 224, 13, 2, 129, 17, 17, 17, 17, 113, 17, + 17, 17, 17, 112, 26, 6, 240, 240, 34, 49, 33, 33, + 82, 67, 33, 33, 33, 49, 18, 33, 34, 17, 50, 82, + 33, 33, 33, 33, 50, 128, 10, 5, 240, 161, 33, 17, + 33, 0, 8, 32, 36, 11, 0, 5, 116, 97, 65, 65, + 49, 33, 33, 34, 17, 33, 17, 33, 81, 17, 33, 81, + 17, 33, 81, 17, 33, 33, 33, 33, 34, 33, 50, 65, + 100, 0, 7, 48, 11, 4, 240, 83, 19, 17, 17, 19, + 240, 240, 240, 14, 4, 240, 240, 161, 17, 17, 17, 17, + 17, 17, 65, 240, 112, 10, 8, 0, 9, 7, 113, 113, + 0, 8, 16, 8, 4, 240, 240, 227, 240, 240, 48, 36, + 11, 0, 5, 116, 97, 65, 69, 33, 33, 33, 33, 33, + 17, 33, 33, 33, 17, 35, 49, 17, 33, 33, 33, 17, + 33, 33, 33, 36, 19, 50, 65, 100, 0, 7, 48, 7, + 5, 240, 244, 0, 8, 32, 12, 5, 240, 178, 33, 33, + 17, 33, 34, 0, 7, 16, 18, 14, 0, 9, 65, 209, + 209, 209, 125, 113, 209, 209, 209, 240, 108, 0, 7, 32, + 13, 5, 240, 163, 33, 33, 65, 49, 34, 52, 0, 5, + 96, 16, 5, 240, 163, 33, 33, 65, 34, 33, 33, 17, + 33, 34, 240, 240, 192, 8, 3, 240, 17, 17, 240, 240, + 176, 23, 8, 0, 8, 1, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 17, 35, 18, 240, 33, 113, 240, + 31, 8, 240, 240, 69, 35, 17, 36, 17, 51, 17, 66, + 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 17, 240, 176, 7, 2, 240, 49, 17, + 240, 64, 7, 4, 0, 8, 18, 19, 144, 12, 4, 240, + 97, 34, 49, 49, 49, 35, 240, 240, 112, 14, 4, 240, + 82, 33, 17, 17, 17, 17, 17, 19, 240, 240, 176, 15, + 5, 240, 240, 241, 81, 17, 33, 17, 33, 17, 49, 65, + 240, 192, 27, 10, 0, 6, 34, 145, 65, 65, 49, 81, + 33, 97, 33, 33, 36, 19, 81, 17, 17, 65, 36, 49, + 65, 145, 0, 6, 64, 27, 10, 0, 6, 34, 145, 65, + 65, 49, 81, 51, 49, 34, 33, 20, 18, 17, 65, 49, + 65, 49, 81, 33, 148, 0, 6, 48, 31, 11, 0, 6, + 116, 49, 49, 33, 33, 82, 49, 113, 17, 81, 33, 17, + 33, 50, 17, 34, 81, 33, 17, 81, 36, 49, 81, 161, + 0, 7, 16, 19, 6, 0, 6, 33, 81, 81, 65, 17, + 66, 50, 50, 65, 34, 17, 49, 33, 17, 224, 24, 10, + 209, 240, 241, 145, 145, 131, 113, 17, 97, 33, 97, 34, + 85, 65, 65, 65, 66, 35, 51, 0, 6, 48, 24, 10, + 242, 240, 193, 145, 145, 131, 113, 17, 97, 33, 97, 34, + 85, 65, 65, 65, 66, 35, 51, 0, 6, 48, 26, 10, + 225, 129, 17, 240, 49, 145, 145, 131, 113, 17, 97, 33, + 97, 34, 85, 65, 65, 65, 66, 35, 51, 0, 6, 48, + 27, 10, 210, 17, 81, 33, 240, 49, 145, 145, 131, 113, + 17, 97, 33, 97, 34, 85, 65, 65, 65, 66, 35, 51, + 0, 6, 48, 27, 9, 177, 33, 81, 33, 240, 146, 114, + 97, 17, 97, 18, 81, 33, 65, 49, 69, 65, 65, 49, + 65, 34, 66, 0, 5, 96, 28, 10, 65, 129, 17, 113, + 17, 129, 145, 145, 145, 131, 113, 17, 97, 33, 97, 34, + 85, 65, 65, 65, 66, 35, 51, 0, 6, 48, 34, 14, + 0, 7, 88, 98, 81, 98, 81, 81, 17, 81, 81, 17, + 33, 113, 36, 97, 49, 33, 101, 81, 33, 65, 81, 33, + 65, 81, 19, 49, 51, 0, 8, 112, 27, 9, 240, 240, + 131, 33, 33, 51, 17, 82, 17, 97, 17, 129, 129, 129, + 97, 17, 81, 49, 65, 68, 82, 145, 99, 240, 112, 27, + 8, 145, 129, 215, 17, 81, 17, 81, 17, 81, 17, 33, + 68, 65, 33, 65, 81, 17, 81, 17, 81, 17, 51, 240, + 240, 176, 27, 8, 193, 97, 199, 17, 81, 17, 81, 17, + 81, 17, 33, 68, 65, 33, 65, 81, 17, 81, 17, 81, + 17, 51, 240, 240, 176, 28, 8, 161, 97, 17, 199, 17, + 81, 17, 81, 17, 81, 17, 33, 68, 65, 33, 65, 81, + 17, 81, 17, 81, 17, 51, 240, 240, 176, 29, 8, 145, + 33, 65, 33, 183, 17, 81, 17, 81, 17, 81, 17, 33, + 68, 65, 33, 65, 81, 17, 81, 17, 81, 17, 51, 240, + 240, 176, 16, 4, 66, 193, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 240, 96, 17, 4, 82, 33, 97, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 240, 128, 18, + 4, 81, 33, 17, 97, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 240, 112, 19, 5, 81, 33, 17, 33, 114, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 50, 240, 192, + 28, 10, 240, 240, 182, 65, 81, 49, 81, 49, 97, 33, + 97, 20, 65, 33, 97, 33, 97, 33, 81, 49, 81, 49, + 50, 0, 6, 80, 36, 10, 210, 17, 129, 242, 51, 34, + 65, 49, 17, 49, 49, 17, 49, 49, 33, 33, 49, 33, + 33, 49, 49, 17, 49, 49, 17, 49, 66, 49, 66, 35, + 65, 0, 6, 64, 27, 9, 177, 145, 240, 20, 65, 65, + 33, 81, 33, 97, 17, 97, 17, 97, 17, 97, 17, 97, + 17, 81, 49, 65, 68, 0, 6, 26, 9, 225, 113, 244, + 65, 65, 33, 81, 33, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 17, 81, 49, 65, 68, 0, 6, 27, 9, 194, + 97, 33, 228, 65, 65, 33, 81, 33, 97, 17, 97, 17, + 97, 17, 97, 17, 97, 17, 81, 49, 65, 68, 0, 6, + 26, 9, 178, 146, 228, 65, 65, 33, 81, 33, 97, 17, + 97, 17, 97, 17, 97, 17, 97, 17, 81, 49, 65, 68, + 0, 6, 28, 9, 177, 33, 81, 33, 228, 65, 65, 33, + 81, 33, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, + 81, 49, 65, 68, 0, 6, 26, 10, 0, 7, 65, 113, + 33, 81, 65, 49, 97, 17, 113, 17, 129, 129, 17, 97, + 49, 65, 81, 33, 113, 240, 240, 176, 33, 9, 240, 240, + 132, 17, 33, 65, 33, 82, 17, 65, 17, 17, 49, 33, + 17, 33, 49, 17, 33, 49, 17, 17, 65, 18, 65, 49, + 65, 33, 20, 0, 6, 27, 9, 177, 240, 145, 67, 17, + 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, + 81, 33, 81, 33, 66, 53, 0, 6, 27, 9, 209, 113, + 225, 67, 17, 81, 33, 81, 33, 81, 33, 81, 33, 81, + 33, 81, 33, 81, 33, 81, 33, 66, 53, 0, 6, 28, + 9, 193, 113, 17, 209, 67, 17, 81, 33, 81, 33, 81, + 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, 66, + 53, 0, 6, 29, 9, 177, 33, 81, 33, 194, 66, 17, + 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, + 81, 33, 81, 33, 66, 53, 0, 6, 23, 9, 226, 113, + 195, 50, 34, 49, 65, 49, 81, 17, 97, 17, 113, 129, + 129, 129, 129, 129, 0, 6, 16, 21, 7, 240, 210, 81, + 100, 49, 50, 17, 65, 17, 65, 17, 65, 21, 33, 97, + 97, 240, 240, 176, 28, 6, 240, 163, 33, 49, 17, 49, + 17, 33, 33, 17, 49, 33, 33, 49, 17, 49, 17, 49, + 17, 17, 17, 17, 18, 240, 240, 32, 20, 7, 240, 240, + 97, 113, 195, 49, 49, 49, 33, 52, 33, 49, 33, 50, + 22, 240, 240, 96, 20, 7, 240, 240, 130, 81, 179, 49, + 49, 49, 33, 52, 33, 49, 33, 50, 22, 240, 240, 96, + 21, 7, 240, 240, 113, 81, 17, 179, 49, 49, 49, 33, + 52, 33, 49, 33, 50, 22, 240, 240, 96, 21, 7, 240, + 240, 98, 17, 81, 179, 49, 49, 49, 33, 52, 33, 49, + 33, 50, 22, 240, 240, 96, 23, 7, 240, 240, 97, 17, + 65, 17, 179, 65, 17, 65, 17, 67, 49, 33, 49, 33, + 17, 22, 240, 240, 96, 23, 7, 240, 240, 99, 65, 17, + 81, 82, 65, 33, 97, 67, 49, 33, 49, 33, 17, 19, + 18, 240, 240, 96, 23, 9, 0, 9, 19, 18, 33, 49, + 33, 33, 33, 33, 54, 18, 33, 65, 49, 33, 20, 18, + 0, 5, 112, 19, 6, 0, 6, 19, 33, 49, 17, 49, + 17, 81, 81, 49, 33, 17, 50, 82, 51, 224, 19, 6, + 240, 242, 81, 179, 33, 33, 33, 49, 21, 17, 81, 49, + 33, 17, 240, 240, 32, 20, 6, 240, 240, 49, 81, 147, + 33, 33, 33, 49, 21, 17, 81, 49, 33, 17, 240, 240, + 32, 21, 6, 240, 240, 33, 65, 17, 147, 33, 33, 33, + 49, 21, 17, 81, 49, 33, 17, 240, 240, 32, 21, 6, + 240, 240, 17, 33, 33, 33, 131, 33, 49, 17, 49, 21, + 17, 81, 97, 17, 240, 240, 32, 14, 4, 240, 82, 49, + 129, 49, 49, 49, 49, 49, 49, 240, 96, 13, 3, 240, + 17, 113, 33, 33, 33, 33, 33, 33, 240, 32, 15, 4, + 240, 97, 33, 17, 97, 49, 49, 49, 49, 49, 49, 240, + 112, 16, 4, 240, 81, 17, 17, 17, 97, 49, 49, 49, + 49, 49, 49, 240, 112, 23, 6, 240, 161, 97, 67, 81, + 52, 17, 49, 17, 49, 17, 49, 17, 49, 17, 49, 33, + 17, 240, 240, 32, 24, 6, 240, 240, 18, 17, 65, 129, + 18, 34, 33, 17, 49, 17, 49, 17, 49, 17, 49, 17, + 49, 240, 240, 16, 21, 6, 240, 242, 81, 179, 33, 49, + 17, 49, 17, 49, 17, 49, 17, 49, 33, 17, 240, 240, + 32, 22, 6, 240, 240, 50, 65, 147, 33, 49, 17, 49, + 17, 49, 17, 49, 17, 49, 33, 17, 240, 240, 32, 23, + 6, 240, 240, 33, 65, 17, 147, 33, 49, 17, 49, 17, + 49, 17, 49, 17, 49, 33, 17, 240, 240, 32, 22, 6, + 240, 240, 18, 82, 147, 33, 49, 17, 49, 17, 49, 17, + 49, 17, 49, 33, 17, 240, 240, 32, 24, 6, 240, 240, + 17, 33, 33, 33, 131, 33, 49, 17, 49, 17, 49, 17, + 49, 17, 49, 33, 17, 240, 240, 32, 15, 12, 0, 9, + 81, 177, 240, 240, 203, 240, 241, 177, 0, 6, 96, 21, + 6, 0, 6, 20, 17, 49, 17, 34, 17, 17, 17, 18, + 33, 17, 49, 18, 17, 240, 240, 32, 22, 6, 240, 242, + 240, 17, 49, 17, 49, 17, 49, 17, 49, 17, 49, 17, + 34, 34, 17, 240, 240, 16, 22, 6, 240, 240, 49, 225, + 49, 17, 49, 17, 49, 17, 49, 17, 49, 17, 34, 34, + 17, 240, 240, 16, 24, 6, 240, 240, 33, 65, 17, 129, + 49, 17, 49, 17, 49, 17, 49, 17, 49, 17, 34, 34, + 17, 240, 240, 16, 25, 6, 240, 240, 17, 17, 49, 17, + 129, 49, 17, 49, 17, 49, 17, 49, 17, 49, 17, 34, + 34, 17, 240, 240, 16, 23, 7, 240, 240, 145, 81, 177, + 49, 33, 33, 49, 33, 65, 17, 66, 82, 97, 81, 65, + 17, 66, 240, 64, 25, 7, 240, 240, 82, 97, 97, 97, + 19, 34, 33, 33, 49, 33, 49, 33, 33, 49, 17, 66, + 81, 97, 97, 81, 208, 25, 7, 240, 240, 97, 33, 49, + 33, 145, 65, 33, 33, 49, 33, 49, 17, 82, 82, 81, + 97, 65, 17, 66, 240, 64, +}; + +//***************************************************************************** +// +// The glyph offset table for the 14 point Oldstandard font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard14[] = +{ + 0, 4, 17, 28, 52, 80, 113, 141, + 148, 164, 180, 197, 217, 227, 235, 241, + 258, 283, 298, 319, 340, 360, 380, 404, + 421, 445, 470, 478, 488, 507, 517, 536, + 556, 594, 618, 644, 668, 695, 722, 745, + 774, 802, 816, 836, 864, 884, 925, 960, + 986, 1007, 1038, 1066, 1090, 1114, 1141, 1166, + 1204, 1229, 1252, 1277, 1295, 1313, 1331, 1346, + 1353, 1360, 1378, 1401, 1418, 1442, 1460, 1477, + 1499, 1523, 1535, 1552, 1575, 1589, 1617, 1638, + 1658, 1681, 1703, 1717, 1734, 1750, 1771, 1789, + 1814, 1833, 1854, 1871, 1888, 1905, 1921, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1935, 1939, 1953, 1976, 1999, 2022, 2043, 2056, + 2082, 2092, 2128, 2139, 2153, 2163, 2171, 2207, + 2214, 2226, 2244, 2257, 2273, 2281, 2304, 2335, + 2342, 2349, 2361, 2375, 2390, 2417, 2444, 2475, + 2494, 2518, 2542, 2568, 2595, 2622, 2650, 2684, + 2711, 2738, 2765, 2793, 2822, 2838, 2855, 2873, + 2892, 2920, 2956, 2983, 3009, 3036, 3062, 3090, + 3116, 3149, 3176, 3203, 3231, 3260, 3283, 3304, + 3332, 3352, 3372, 3393, 3414, 3437, 3460, 3483, + 3502, 3521, 3541, 3562, 3583, 3597, 3610, 3625, + 3641, 3664, 3688, 3709, 3731, 3754, 3776, 3800, + 3815, 3836, 3858, 3880, 3904, 3929, 3952, 3977, +}; + +//***************************************************************************** +// +// The font definition for the 14 point Oldstandard font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard14 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 12, + + // + // The height of the font. + // + 20, + + // + // The baseline of the font. + // + 15, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard14, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard14Data +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard14b.c b/third_party/fonts/ofl/fonts/fontoldstandard14b.c new file mode 100644 index 0000000..64a96a0 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard14b.c @@ -0,0 +1,534 @@ +//***************************************************************************** +// +// fontoldstandard14b.c - Font definition for the 14pt Oldstandard bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 14 point +// Bold: yes +// Italic: no +// Memory usage: 3980 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 14 point Oldstandard bold font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard14bData[3779] = +{ + 5, 6, 0, 13, 64, 12, 3, 194, 18, 18, 18, 17, + 33, 33, 82, 18, 208, 8, 5, 240, 84, 20, 20, 0, + 7, 25, 9, 240, 240, 145, 33, 65, 49, 40, 49, 33, + 81, 33, 81, 33, 56, 33, 49, 65, 33, 81, 33, 240, + 240, 160, 27, 8, 240, 66, 98, 84, 49, 18, 17, 33, + 18, 17, 36, 83, 99, 49, 20, 18, 18, 17, 33, 18, + 17, 52, 82, 240, 192, 30, 11, 240, 240, 242, 65, 52, + 33, 68, 17, 84, 17, 145, 33, 115, 17, 81, 18, 18, + 65, 18, 18, 49, 34, 18, 113, 17, 0, 5, 96, 28, + 11, 0, 5, 115, 114, 17, 114, 17, 130, 146, 35, 34, + 18, 33, 34, 49, 17, 50, 50, 67, 35, 17, 36, 34, + 0, 5, 96, 8, 3, 194, 18, 18, 240, 240, 64, 17, + 5, 240, 113, 65, 49, 50, 50, 50, 50, 50, 50, 65, + 65, 81, 81, 96, 17, 5, 240, 81, 81, 81, 65, 66, + 50, 50, 50, 50, 49, 65, 49, 49, 144, 13, 7, 240, + 242, 54, 50, 51, 18, 50, 82, 0, 7, 48, 19, 14, + 0, 7, 97, 209, 209, 209, 209, 209, 125, 113, 209, 209, + 209, 209, 240, 240, 80, 10, 4, 0, 6, 3, 19, 49, + 33, 33, 112, 8, 5, 0, 6, 36, 240, 240, 96, 7, + 3, 240, 240, 98, 18, 208, 18, 5, 240, 129, 65, 65, + 65, 49, 65, 65, 49, 65, 65, 65, 49, 65, 65, 64, + 26, 8, 240, 240, 67, 65, 49, 34, 49, 34, 50, 18, + 50, 18, 50, 18, 50, 18, 50, 33, 49, 65, 17, 240, + 240, 80, 15, 4, 240, 49, 19, 34, 34, 34, 34, 34, + 34, 34, 34, 240, 32, 22, 7, 240, 228, 34, 34, 19, + 18, 19, 18, 66, 65, 81, 49, 17, 17, 33, 22, 17, + 34, 240, 240, 21, 7, 240, 228, 33, 50, 18, 34, 82, + 35, 113, 49, 34, 18, 34, 17, 50, 33, 18, 240, 240, + 20, 8, 240, 240, 82, 98, 83, 65, 18, 65, 18, 49, + 34, 55, 66, 98, 98, 240, 240, 80, 21, 7, 240, 213, + 35, 65, 101, 33, 50, 82, 18, 34, 18, 34, 17, 49, + 49, 17, 240, 240, 16, 21, 7, 240, 243, 49, 34, 18, + 85, 34, 34, 18, 34, 18, 34, 18, 34, 33, 34, 51, + 240, 240, 19, 7, 240, 227, 17, 37, 17, 65, 17, 65, + 81, 97, 81, 82, 82, 82, 240, 240, 16, 24, 8, 240, + 240, 52, 50, 49, 34, 49, 35, 17, 68, 65, 19, 33, + 51, 17, 66, 17, 66, 36, 240, 240, 80, 22, 7, 240, + 227, 50, 33, 34, 34, 18, 34, 18, 34, 37, 82, 34, + 18, 33, 33, 66, 240, 240, 16, 8, 3, 240, 98, 18, + 162, 18, 208, 11, 4, 240, 210, 34, 227, 19, 49, 33, + 33, 112, 18, 12, 0, 7, 18, 145, 146, 130, 130, 145, + 162, 194, 194, 193, 194, 194, 240, 160, 10, 12, 0, 12, + 11, 240, 171, 0, 9, 16, 19, 12, 0, 6, 2, 193, + 194, 194, 194, 193, 178, 130, 130, 146, 130, 130, 240, 240, + 64, 17, 6, 240, 163, 33, 34, 17, 34, 65, 65, 65, + 81, 82, 66, 66, 240, 192, 35, 11, 0, 5, 117, 66, + 33, 18, 49, 18, 18, 17, 17, 18, 34, 17, 17, 18, + 33, 33, 17, 18, 33, 33, 17, 18, 18, 17, 49, 18, + 33, 65, 181, 0, 6, 22, 10, 240, 240, 225, 145, 131, + 115, 97, 18, 97, 19, 81, 34, 85, 65, 51, 34, 52, + 240, 240, 176, 25, 8, 240, 240, 38, 34, 50, 18, 50, + 18, 49, 37, 50, 49, 34, 50, 18, 50, 18, 50, 18, + 34, 240, 240, 64, 24, 9, 240, 240, 132, 17, 33, 66, + 18, 66, 18, 81, 18, 114, 114, 81, 18, 81, 33, 65, + 68, 240, 240, 144, 26, 9, 240, 240, 102, 50, 65, 34, + 65, 34, 66, 18, 66, 18, 66, 18, 66, 18, 65, 34, + 65, 34, 34, 240, 240, 144, 27, 8, 240, 240, 39, 18, + 49, 34, 33, 17, 18, 33, 53, 50, 33, 50, 33, 17, + 18, 65, 18, 50, 18, 35, 240, 240, 48, 24, 8, 240, + 240, 39, 18, 50, 18, 33, 17, 18, 33, 17, 21, 50, + 33, 50, 33, 50, 98, 98, 240, 240, 128, 28, 10, 240, + 240, 196, 17, 49, 66, 49, 81, 34, 81, 34, 37, 18, + 66, 34, 66, 34, 66, 49, 49, 17, 67, 33, 240, 240, + 192, 26, 8, 240, 240, 34, 50, 18, 50, 18, 50, 18, + 50, 23, 18, 50, 18, 50, 18, 50, 18, 50, 18, 50, + 240, 240, 48, 13, 3, 194, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 208, 18, 6, 240, 194, 66, 66, 66, 66, + 66, 18, 18, 18, 18, 17, 34, 35, 240, 176, 26, 9, + 240, 240, 98, 50, 34, 49, 50, 33, 66, 17, 85, 66, + 18, 66, 19, 50, 34, 50, 35, 34, 36, 240, 240, 112, + 21, 8, 240, 240, 34, 98, 98, 98, 98, 98, 98, 65, + 18, 65, 18, 50, 18, 35, 240, 240, 48, 36, 11, 240, + 240, 243, 66, 35, 51, 35, 51, 36, 17, 18, 33, 18, + 17, 18, 33, 18, 17, 18, 33, 35, 18, 33, 34, 34, + 33, 34, 34, 19, 33, 34, 240, 240, 240, 30, 12, 0, + 6, 19, 37, 51, 49, 83, 49, 81, 18, 33, 81, 19, + 17, 81, 34, 17, 81, 51, 81, 51, 81, 66, 53, 49, + 0, 6, 48, 25, 9, 240, 240, 132, 65, 65, 49, 65, + 34, 66, 18, 66, 18, 66, 18, 66, 33, 65, 49, 65, + 68, 240, 240, 144, 20, 8, 240, 240, 38, 34, 50, 18, + 50, 18, 50, 21, 50, 98, 98, 98, 98, 240, 240, 128, + 29, 9, 240, 240, 132, 65, 65, 49, 65, 34, 66, 18, + 66, 18, 66, 18, 66, 33, 33, 18, 35, 18, 68, 17, + 97, 17, 99, 98, 176, 27, 9, 240, 240, 101, 66, 34, + 50, 34, 50, 34, 52, 82, 33, 66, 34, 50, 34, 17, + 18, 34, 17, 18, 50, 240, 240, 128, 23, 8, 240, 240, + 52, 49, 65, 33, 65, 35, 100, 84, 33, 51, 17, 66, + 18, 50, 49, 18, 240, 240, 64, 23, 10, 240, 240, 169, + 17, 34, 34, 17, 34, 49, 17, 34, 49, 66, 130, 130, + 130, 130, 130, 240, 240, 240, 26, 9, 240, 240, 98, 51, + 18, 65, 34, 65, 34, 65, 34, 65, 34, 65, 34, 65, + 34, 65, 49, 65, 68, 240, 240, 144, 22, 10, 240, 240, + 163, 51, 34, 65, 51, 33, 82, 33, 82, 33, 99, 115, + 115, 129, 145, 240, 240, 240, 35, 14, 0, 7, 3, 35, + 35, 34, 50, 49, 50, 50, 33, 67, 35, 17, 82, 17, + 18, 17, 82, 17, 18, 17, 83, 35, 114, 50, 114, 50, + 113, 65, 0, 7, 80, 24, 10, 240, 240, 164, 19, 51, + 33, 82, 17, 99, 130, 131, 97, 18, 97, 19, 65, 50, + 50, 52, 240, 240, 176, 22, 9, 240, 240, 99, 50, 34, + 49, 50, 49, 66, 17, 82, 17, 98, 114, 114, 114, 114, + 240, 240, 160, 22, 8, 240, 240, 39, 17, 50, 33, 50, + 82, 98, 82, 98, 82, 49, 34, 49, 18, 35, 240, 240, + 48, 17, 5, 240, 83, 34, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 52, 96, 17, 6, 240, 145, 81, 81, + 97, 81, 81, 97, 81, 81, 81, 97, 81, 81, 97, 17, + 5, 240, 99, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 20, 96, 14, 7, 240, 240, 17, 82, 65, 33, + 49, 33, 33, 65, 0, 8, 7, 8, 0, 15, 7, 240, + 32, 9, 4, 240, 17, 65, 65, 240, 240, 240, 17, 7, + 0, 6, 35, 50, 18, 49, 18, 52, 34, 18, 34, 19, + 22, 240, 224, 21, 7, 240, 210, 82, 82, 85, 34, 34, + 18, 34, 18, 34, 18, 34, 18, 34, 17, 19, 240, 240, + 15, 6, 240, 240, 211, 34, 33, 18, 18, 18, 66, 81, + 83, 240, 176, 21, 7, 240, 240, 34, 82, 82, 37, 18, + 34, 18, 34, 18, 34, 18, 34, 18, 34, 37, 240, 224, + 16, 6, 240, 240, 211, 34, 18, 18, 18, 21, 18, 66, + 33, 35, 240, 176, 15, 5, 240, 99, 20, 18, 50, 50, + 50, 50, 50, 50, 50, 240, 128, 19, 8, 0, 7, 22, + 18, 34, 34, 34, 67, 50, 101, 69, 33, 65, 33, 65, + 52, 176, 21, 6, 240, 146, 66, 66, 66, 18, 21, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 240, 160, 12, + 3, 194, 18, 66, 18, 18, 18, 18, 18, 18, 208, 17, + 5, 240, 114, 50, 130, 50, 50, 50, 50, 50, 50, 35, + 20, 17, 17, 112, 21, 7, 240, 210, 82, 82, 82, 33, + 34, 17, 50, 17, 52, 50, 18, 34, 33, 34, 34, 240, + 224, 13, 3, 194, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 208, 26, 9, 0, 7, 114, 18, 18, 24, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 240, 240, 112, 19, 6, 240, 240, 194, 18, 21, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 240, 160, 18, + 7, 0, 6, 35, 65, 33, 34, 34, 18, 34, 18, 34, + 33, 33, 52, 240, 240, 20, 7, 0, 6, 21, 34, 34, + 18, 34, 18, 34, 18, 34, 18, 34, 21, 34, 82, 82, + 192, 21, 7, 0, 6, 35, 17, 18, 34, 18, 34, 18, + 34, 18, 34, 18, 34, 37, 82, 82, 82, 128, 13, 5, + 240, 240, 84, 20, 18, 50, 50, 50, 50, 240, 128, 16, + 6, 240, 240, 196, 33, 82, 83, 33, 34, 17, 49, 18, + 17, 240, 176, 17, 5, 240, 97, 65, 50, 50, 50, 50, + 50, 50, 17, 18, 17, 34, 240, 112, 19, 6, 240, 240, + 194, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 21, 240, 160, 15, 6, 240, 240, 194, 33, 33, 33, 35, + 51, 66, 65, 81, 240, 192, 25, 10, 0, 8, 98, 34, + 33, 33, 34, 17, 51, 17, 17, 51, 17, 17, 66, 18, + 81, 34, 81, 49, 240, 240, 208, 17, 6, 240, 240, 194, + 33, 33, 17, 51, 66, 66, 49, 18, 17, 34, 240, 160, + 18, 6, 240, 240, 194, 33, 33, 33, 34, 17, 35, 66, + 66, 65, 81, 51, 50, 160, 16, 6, 240, 240, 197, 17, + 33, 66, 65, 66, 65, 33, 17, 34, 240, 160, 17, 5, + 240, 114, 34, 50, 50, 50, 50, 33, 82, 50, 50, 50, + 50, 66, 96, 16, 2, 129, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 48, 17, 5, 240, 82, 66, + 50, 50, 50, 50, 81, 34, 50, 50, 50, 50, 34, 128, + 13, 9, 0, 9, 3, 65, 17, 34, 33, 17, 52, 0, + 8, 5, 6, 0, 13, 64, 13, 3, 240, 98, 18, 65, + 33, 33, 34, 18, 18, 18, 64, 17, 6, 240, 240, 129, + 67, 50, 17, 21, 19, 51, 51, 66, 17, 50, 65, 240, + 23, 10, 240, 240, 228, 82, 34, 66, 115, 132, 114, 130, + 82, 17, 81, 35, 18, 18, 17, 19, 240, 240, 192, 23, + 8, 240, 240, 161, 19, 17, 33, 49, 33, 81, 17, 81, + 17, 81, 33, 49, 33, 19, 17, 0, 6, 16, 20, 7, + 240, 211, 33, 19, 33, 34, 17, 50, 17, 66, 54, 22, + 50, 82, 82, 240, 240, 16, 13, 2, 129, 17, 17, 17, + 17, 113, 17, 17, 17, 17, 48, 26, 7, 240, 243, 49, + 49, 33, 34, 34, 83, 49, 20, 17, 50, 19, 33, 37, + 66, 65, 33, 34, 33, 33, 49, 51, 32, 10, 6, 240, + 146, 18, 18, 18, 0, 9, 16, 33, 11, 0, 5, 116, + 82, 17, 19, 51, 18, 17, 33, 18, 33, 33, 17, 18, + 81, 17, 18, 81, 17, 33, 33, 33, 33, 34, 33, 49, + 82, 69, 0, 6, 13, 5, 240, 83, 33, 17, 35, 33, + 18, 20, 0, 5, 96, 14, 4, 240, 240, 97, 17, 17, + 17, 17, 17, 17, 65, 240, 48, 11, 8, 0, 8, 7, + 113, 113, 113, 0, 6, 16, 8, 5, 0, 6, 36, 240, + 240, 96, 31, 11, 0, 5, 116, 85, 18, 49, 18, 19, + 33, 34, 18, 17, 17, 35, 49, 17, 34, 18, 17, 17, + 34, 18, 17, 40, 49, 82, 69, 0, 6, 7, 5, 240, + 164, 0, 7, 80, 12, 6, 240, 163, 33, 49, 17, 49, + 35, 0, 7, 96, 18, 12, 0, 6, 81, 177, 177, 177, + 107, 97, 177, 177, 177, 240, 59, 240, 240, 112, 14, 5, + 240, 84, 17, 18, 34, 33, 33, 20, 49, 240, 240, 192, + 16, 6, 240, 163, 33, 34, 33, 18, 34, 98, 17, 34, + 34, 240, 240, 240, 7, 3, 209, 17, 240, 240, 128, 23, + 8, 0, 7, 2, 34, 34, 34, 34, 34, 34, 34, 33, + 49, 49, 51, 35, 18, 17, 114, 98, 98, 96, 27, 7, + 240, 229, 20, 17, 20, 17, 20, 17, 20, 17, 50, 17, + 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, + 240, 7, 3, 240, 146, 18, 240, 160, 8, 4, 0, 7, + 17, 65, 19, 80, 12, 5, 240, 83, 50, 50, 50, 50, + 36, 240, 240, 176, 11, 5, 240, 98, 36, 20, 20, 20, + 0, 5, 96, 15, 5, 0, 5, 97, 17, 33, 17, 33, + 17, 17, 33, 49, 240, 112, 29, 12, 0, 6, 3, 65, + 82, 65, 82, 49, 98, 49, 98, 33, 34, 37, 35, 97, + 17, 18, 81, 37, 65, 66, 65, 82, 0, 6, 32, 31, + 12, 0, 6, 3, 162, 65, 82, 49, 98, 49, 17, 66, + 35, 18, 20, 17, 17, 18, 81, 50, 81, 49, 33, 65, + 52, 49, 82, 0, 6, 32, 31, 14, 0, 7, 4, 81, + 66, 18, 65, 82, 81, 130, 33, 97, 34, 17, 50, 50, + 33, 51, 113, 33, 18, 97, 53, 65, 98, 194, 0, 7, + 32, 18, 6, 240, 240, 210, 66, 81, 65, 17, 81, 65, + 65, 66, 33, 18, 33, 35, 128, 23, 10, 209, 161, 240, + 65, 145, 131, 115, 97, 18, 97, 19, 81, 34, 85, 65, + 51, 34, 52, 240, 240, 176, 23, 10, 242, 114, 240, 49, + 145, 131, 115, 97, 18, 97, 19, 81, 34, 85, 65, 51, + 34, 52, 240, 240, 176, 25, 10, 65, 145, 129, 17, 240, + 49, 145, 131, 115, 97, 18, 97, 19, 81, 34, 85, 65, + 51, 34, 52, 240, 240, 176, 22, 9, 180, 240, 240, 50, + 114, 114, 97, 18, 81, 18, 65, 34, 70, 33, 66, 34, + 51, 240, 240, 112, 25, 10, 194, 18, 82, 18, 240, 33, + 145, 131, 115, 97, 18, 97, 19, 81, 34, 70, 65, 51, + 34, 52, 240, 240, 176, 24, 9, 65, 113, 17, 113, 240, + 33, 129, 115, 99, 99, 81, 19, 65, 34, 69, 49, 51, + 18, 51, 240, 240, 112, 34, 14, 0, 7, 88, 99, 49, + 97, 18, 33, 17, 81, 18, 33, 97, 37, 97, 34, 33, + 101, 33, 17, 49, 50, 65, 49, 50, 50, 19, 50, 35, + 0, 7, 16, 25, 9, 240, 240, 132, 17, 33, 66, 18, + 66, 18, 81, 18, 114, 114, 81, 18, 81, 33, 65, 68, + 97, 145, 99, 208, 27, 8, 145, 129, 215, 18, 49, 34, + 33, 17, 18, 33, 53, 50, 33, 50, 33, 17, 18, 65, + 18, 50, 18, 35, 240, 240, 48, 27, 8, 178, 97, 199, + 18, 49, 34, 33, 17, 18, 33, 53, 50, 33, 50, 33, + 17, 18, 65, 18, 50, 18, 35, 240, 240, 48, 28, 8, + 162, 81, 33, 183, 18, 49, 34, 33, 17, 18, 33, 53, + 50, 33, 50, 33, 17, 18, 65, 18, 50, 18, 35, 240, + 240, 48, 25, 8, 148, 68, 183, 18, 50, 18, 65, 18, + 17, 68, 66, 17, 66, 65, 18, 65, 18, 50, 18, 35, + 240, 240, 48, 17, 4, 1, 50, 49, 114, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 240, 32, 17, 4, 33, 34, + 33, 98, 34, 34, 34, 34, 34, 34, 34, 34, 34, 240, + 48, 17, 5, 98, 33, 33, 114, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 240, 112, 18, 6, 98, 18, 18, 18, + 131, 50, 66, 66, 66, 66, 66, 66, 66, 66, 240, 192, + 26, 10, 240, 240, 182, 66, 65, 50, 65, 50, 66, 20, + 50, 34, 66, 34, 66, 34, 65, 50, 65, 50, 34, 240, + 240, 208, 31, 12, 113, 131, 240, 243, 37, 51, 49, 83, + 49, 81, 18, 33, 81, 19, 17, 81, 34, 17, 81, 51, + 81, 51, 81, 66, 53, 49, 0, 6, 48, 27, 9, 33, + 130, 129, 240, 20, 65, 65, 49, 65, 34, 66, 18, 66, + 18, 66, 18, 66, 33, 65, 49, 65, 68, 240, 240, 144, + 26, 9, 81, 114, 113, 244, 65, 65, 49, 65, 34, 66, + 18, 66, 18, 66, 18, 66, 33, 65, 49, 65, 68, 240, + 240, 144, 26, 9, 194, 97, 33, 228, 65, 65, 49, 65, + 34, 66, 18, 66, 18, 66, 18, 66, 33, 65, 49, 65, + 68, 240, 240, 144, 25, 9, 180, 240, 132, 65, 65, 49, + 65, 34, 66, 18, 66, 18, 66, 18, 66, 33, 65, 49, + 65, 68, 240, 240, 144, 28, 9, 34, 18, 66, 18, 240, + 116, 65, 65, 49, 65, 34, 66, 18, 66, 18, 66, 18, + 66, 33, 65, 49, 65, 68, 240, 240, 144, 24, 10, 0, + 7, 33, 18, 82, 34, 65, 66, 33, 99, 130, 113, 18, + 81, 49, 65, 81, 33, 113, 240, 240, 16, 29, 9, 240, + 240, 132, 17, 33, 50, 49, 50, 34, 51, 18, 33, 18, + 18, 17, 34, 19, 50, 34, 49, 50, 49, 33, 20, 240, + 240, 144, 27, 9, 33, 129, 145, 226, 51, 18, 65, 34, + 65, 34, 65, 34, 65, 34, 65, 34, 65, 34, 65, 49, + 65, 68, 240, 240, 144, 27, 9, 66, 113, 113, 226, 51, + 18, 65, 34, 65, 34, 65, 34, 65, 34, 65, 34, 65, + 34, 65, 49, 65, 68, 240, 240, 144, 28, 9, 49, 129, + 113, 17, 210, 51, 18, 65, 34, 65, 34, 65, 34, 65, + 34, 65, 34, 65, 34, 65, 49, 65, 68, 240, 240, 144, + 29, 9, 18, 18, 66, 18, 240, 98, 51, 18, 65, 34, + 65, 34, 65, 34, 65, 34, 65, 34, 65, 34, 65, 49, + 65, 68, 240, 240, 144, 22, 9, 225, 113, 211, 50, 34, + 49, 50, 49, 66, 17, 82, 17, 98, 114, 114, 114, 114, + 240, 240, 160, 21, 8, 240, 240, 35, 85, 50, 49, 34, + 50, 18, 50, 18, 49, 37, 50, 98, 98, 240, 240, 128, + 23, 7, 240, 227, 50, 18, 34, 18, 35, 66, 18, 34, + 34, 18, 34, 18, 34, 19, 18, 19, 17, 240, 240, 18, + 7, 240, 210, 97, 211, 49, 34, 34, 18, 67, 34, 18, + 34, 19, 22, 240, 224, 19, 7, 240, 240, 18, 81, 179, + 50, 18, 49, 18, 52, 34, 18, 34, 19, 22, 240, 224, + 19, 7, 240, 241, 81, 17, 179, 50, 18, 49, 18, 52, + 34, 18, 34, 19, 22, 240, 224, 20, 7, 240, 226, 17, + 33, 33, 179, 50, 18, 49, 18, 52, 34, 18, 34, 19, + 22, 240, 224, 20, 7, 240, 210, 18, 34, 18, 148, 49, + 34, 33, 34, 52, 34, 18, 34, 19, 22, 240, 224, 20, + 7, 240, 227, 65, 17, 81, 83, 50, 18, 49, 18, 52, + 34, 18, 34, 19, 22, 240, 224, 23, 10, 0, 8, 119, + 34, 18, 34, 33, 18, 34, 40, 18, 18, 82, 18, 49, + 19, 18, 17, 240, 240, 192, 17, 6, 240, 240, 211, 34, + 33, 18, 18, 18, 66, 81, 83, 65, 97, 51, 128, 17, + 6, 240, 146, 81, 179, 34, 18, 18, 18, 21, 18, 66, + 33, 35, 240, 176, 17, 6, 240, 194, 65, 147, 34, 18, + 18, 18, 21, 18, 66, 33, 35, 240, 176, 18, 6, 240, + 177, 65, 17, 147, 34, 18, 18, 18, 21, 18, 66, 33, + 35, 240, 176, 18, 6, 240, 146, 18, 18, 18, 131, 34, + 18, 18, 18, 21, 18, 66, 83, 240, 176, 14, 4, 240, + 18, 49, 114, 34, 34, 34, 34, 34, 34, 240, 32, 14, + 4, 240, 34, 33, 98, 34, 34, 34, 34, 34, 34, 240, + 48, 15, 4, 240, 34, 17, 17, 98, 34, 34, 34, 34, + 34, 34, 240, 32, 14, 5, 240, 84, 20, 114, 50, 50, + 50, 50, 50, 50, 240, 112, 21, 7, 240, 226, 17, 66, + 98, 52, 34, 34, 18, 34, 18, 34, 18, 34, 33, 34, + 36, 240, 240, 20, 6, 240, 162, 82, 130, 18, 21, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 240, 160, 19, + 7, 240, 225, 113, 195, 65, 33, 34, 34, 18, 34, 18, + 34, 33, 33, 52, 240, 240, 20, 7, 240, 240, 33, 81, + 179, 65, 33, 34, 34, 18, 34, 18, 34, 33, 33, 52, + 240, 240, 19, 7, 240, 242, 82, 179, 65, 33, 34, 34, + 18, 34, 18, 34, 33, 33, 52, 240, 240, 19, 7, 240, + 226, 114, 163, 65, 33, 34, 34, 18, 34, 18, 34, 33, + 33, 52, 240, 240, 19, 7, 240, 228, 52, 163, 65, 33, + 34, 34, 18, 34, 18, 34, 33, 33, 52, 240, 240, 16, + 13, 0, 8, 98, 178, 240, 240, 252, 240, 240, 34, 178, + 240, 240, 240, 19, 7, 0, 6, 35, 17, 33, 33, 34, + 34, 22, 18, 34, 33, 33, 33, 19, 240, 240, 20, 6, + 240, 146, 81, 162, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 21, 240, 160, 20, 6, 240, 193, 65, 146, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 21, + 240, 160, 20, 6, 240, 177, 65, 162, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 21, 240, 160, 22, 6, + 240, 146, 18, 18, 18, 114, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 21, 240, 160, 19, 6, 240, 194, + 65, 130, 33, 33, 33, 34, 17, 35, 66, 66, 65, 81, + 51, 50, 160, 23, 7, 240, 210, 82, 82, 82, 19, 19, + 18, 18, 34, 18, 34, 18, 33, 34, 17, 51, 66, 82, + 81, 208, 21, 7, 240, 226, 18, 34, 18, 131, 33, 34, + 33, 34, 17, 67, 67, 81, 97, 97, 66, 82, 176, +}; + +//***************************************************************************** +// +// The glyph offset table for the 14 point Oldstandard bold font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard14b[] = +{ + 0, 5, 17, 25, 50, 77, 107, 135, + 143, 160, 177, 190, 209, 219, 227, 234, + 252, 278, 293, 315, 336, 356, 377, 398, + 417, 441, 463, 471, 482, 500, 510, 529, + 546, 581, 603, 628, 652, 678, 705, 729, + 757, 783, 796, 814, 840, 861, 897, 927, + 952, 972, 1001, 1028, 1051, 1074, 1100, 1122, + 1157, 1181, 1203, 1225, 1242, 1259, 1276, 1290, + 1297, 1306, 1323, 1344, 1359, 1380, 1396, 1411, + 1430, 1451, 1463, 1480, 1501, 1514, 1540, 1559, + 1577, 1597, 1618, 1631, 1647, 1664, 1683, 1698, + 1723, 1740, 1758, 1774, 1791, 1807, 1824, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1837, 1842, 1855, 1872, 1895, 1918, 1938, 1951, + 1977, 1987, 2020, 2033, 2047, 2058, 2066, 2097, + 2104, 2116, 2134, 2148, 2164, 2171, 2194, 2221, + 2228, 2236, 2248, 2259, 2274, 2303, 2334, 2365, + 2383, 2406, 2429, 2454, 2476, 2501, 2525, 2559, + 2584, 2611, 2638, 2666, 2691, 2708, 2725, 2742, + 2760, 2786, 2817, 2844, 2870, 2896, 2921, 2949, + 2973, 3002, 3029, 3056, 3084, 3113, 3135, 3156, + 3179, 3197, 3216, 3235, 3255, 3275, 3295, 3318, + 3335, 3352, 3369, 3387, 3405, 3419, 3433, 3448, + 3462, 3483, 3503, 3522, 3542, 3561, 3580, 3599, + 3615, 3634, 3654, 3674, 3694, 3716, 3735, 3758, +}; + +//***************************************************************************** +// +// The font definition for the 14 point Oldstandard bold font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard14b = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 12, + + // + // The height of the font. + // + 18, + + // + // The baseline of the font. + // + 14, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard14b, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard14bData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard14i.c b/third_party/fonts/ofl/fonts/fontoldstandard14i.c new file mode 100644 index 0000000..615c7bb --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard14i.c @@ -0,0 +1,570 @@ +//***************************************************************************** +// +// fontoldstandard14i.c - Font definition for the 14pt Oldstandard italic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 14 point +// Bold: no +// Italic: yes +// Memory usage: 4408 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 14 point Oldstandard italic font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard14iData[4208] = +{ + 5, 6, 0, 14, 32, 14, 5, 240, 113, 66, 49, 65, + 49, 65, 65, 209, 65, 240, 144, 10, 5, 240, 97, 17, + 17, 33, 17, 0, 8, 26, 9, 240, 240, 161, 113, 33, + 81, 33, 55, 49, 33, 81, 33, 81, 17, 71, 49, 17, + 81, 33, 81, 33, 240, 240, 176, 29, 8, 240, 210, 81, + 17, 52, 17, 33, 18, 17, 33, 20, 49, 17, 98, 81, + 18, 36, 17, 34, 17, 17, 35, 17, 67, 82, 240, 224, + 36, 10, 240, 240, 178, 81, 17, 33, 49, 33, 36, 49, + 33, 17, 65, 17, 33, 81, 33, 33, 81, 33, 17, 65, + 17, 33, 49, 33, 33, 33, 49, 17, 115, 240, 240, 192, + 31, 10, 0, 5, 98, 98, 17, 97, 33, 97, 17, 99, + 18, 34, 17, 17, 50, 33, 17, 49, 50, 65, 49, 81, + 49, 33, 36, 18, 240, 240, 208, 8, 3, 209, 17, 33, + 240, 240, 128, 18, 6, 240, 209, 65, 65, 81, 65, 81, + 65, 81, 81, 81, 81, 81, 81, 97, 160, 18, 6, 240, + 240, 65, 81, 81, 81, 81, 81, 81, 65, 81, 81, 65, + 65, 65, 176, 16, 6, 240, 177, 49, 17, 17, 34, 17, + 50, 35, 17, 49, 0, 7, 16, 20, 13, 0, 7, 17, + 193, 193, 193, 193, 193, 124, 97, 193, 193, 193, 193, 193, + 240, 240, 48, 10, 4, 0, 6, 81, 50, 33, 49, 33, + 112, 8, 5, 0, 6, 116, 240, 240, 96, 6, 2, 240, + 177, 17, 144, 18, 6, 240, 209, 65, 81, 81, 65, 81, + 81, 65, 81, 81, 81, 65, 81, 81, 176, 27, 8, 240, + 240, 83, 65, 33, 50, 49, 33, 65, 18, 50, 18, 50, + 17, 65, 33, 65, 33, 50, 33, 49, 67, 240, 240, 96, + 15, 5, 240, 209, 50, 50, 49, 65, 50, 50, 49, 65, + 50, 240, 128, 25, 9, 240, 240, 163, 66, 34, 49, 65, + 50, 34, 113, 113, 98, 82, 49, 49, 65, 33, 20, 49, + 34, 240, 240, 160, 22, 9, 240, 240, 163, 66, 49, 65, + 49, 113, 83, 129, 130, 114, 50, 34, 33, 65, 68, 240, + 240, 160, 21, 8, 240, 240, 113, 113, 97, 97, 97, 17, + 65, 33, 49, 34, 55, 65, 113, 98, 240, 240, 96, 22, + 8, 240, 240, 81, 33, 67, 65, 113, 115, 65, 49, 113, + 113, 34, 34, 33, 49, 67, 240, 240, 96, 26, 8, 240, + 240, 83, 65, 49, 49, 33, 49, 113, 18, 51, 33, 34, + 49, 34, 49, 34, 49, 49, 33, 67, 240, 240, 96, 20, + 7, 240, 242, 17, 18, 19, 17, 49, 97, 81, 81, 97, + 81, 82, 82, 82, 240, 240, 48, 26, 8, 240, 240, 83, + 65, 49, 49, 49, 49, 49, 50, 17, 67, 50, 33, 49, + 65, 33, 65, 33, 49, 67, 240, 240, 96, 26, 8, 240, + 240, 83, 65, 33, 49, 50, 33, 50, 33, 50, 33, 34, + 66, 17, 113, 34, 33, 49, 49, 67, 240, 240, 96, 10, + 4, 240, 240, 50, 34, 209, 49, 240, 64, 13, 5, 240, + 240, 194, 50, 240, 33, 66, 49, 65, 49, 144, 18, 10, + 0, 7, 33, 114, 113, 114, 98, 113, 145, 162, 161, 162, + 162, 161, 240, 96, 10, 13, 0, 14, 92, 240, 204, 0, + 9, 112, 19, 11, 0, 6, 113, 178, 177, 178, 178, 178, + 145, 130, 129, 130, 114, 129, 240, 240, 32, 20, 7, 240, + 243, 49, 49, 33, 49, 82, 66, 65, 81, 81, 33, 81, + 81, 97, 240, 240, 48, 40, 11, 0, 5, 117, 81, 81, + 49, 49, 17, 17, 17, 49, 18, 17, 17, 33, 49, 17, + 17, 33, 33, 33, 17, 33, 33, 33, 17, 33, 18, 33, + 33, 33, 34, 49, 179, 18, 0, 5, 112, 25, 10, 0, + 5, 113, 145, 130, 113, 17, 97, 33, 97, 33, 85, 65, + 65, 65, 65, 49, 81, 35, 51, 240, 240, 176, 27, 10, + 240, 240, 183, 81, 50, 50, 65, 49, 66, 49, 65, 69, + 66, 50, 50, 65, 49, 66, 49, 65, 50, 34, 240, 240, + 224, 25, 10, 240, 240, 227, 17, 65, 50, 49, 65, 49, + 81, 49, 130, 130, 130, 81, 34, 65, 65, 49, 99, 240, + 240, 240, 28, 10, 240, 240, 183, 81, 50, 50, 65, 49, + 81, 49, 81, 49, 81, 34, 66, 33, 81, 49, 81, 49, + 65, 50, 34, 240, 240, 224, 27, 10, 240, 240, 184, 65, + 65, 50, 65, 49, 81, 49, 33, 100, 82, 33, 81, 49, + 81, 81, 49, 65, 50, 50, 240, 240, 208, 22, 10, 240, + 240, 184, 65, 65, 50, 65, 49, 81, 49, 33, 100, 82, + 33, 81, 145, 145, 130, 0, 6, 25, 10, 240, 240, 227, + 97, 50, 49, 81, 33, 145, 130, 52, 18, 66, 34, 66, + 34, 65, 65, 50, 83, 240, 240, 240, 28, 12, 0, 6, + 21, 20, 65, 66, 66, 65, 81, 81, 81, 81, 87, 66, + 65, 81, 81, 81, 66, 81, 66, 66, 66, 0, 6, 64, + 17, 7, 240, 229, 65, 82, 81, 97, 97, 82, 81, 97, + 97, 82, 240, 240, 48, 21, 10, 240, 240, 229, 113, 145, + 130, 129, 145, 145, 81, 34, 66, 33, 81, 49, 99, 0, + 5, 96, 28, 12, 0, 6, 21, 20, 65, 65, 82, 34, + 97, 33, 129, 17, 148, 114, 33, 113, 49, 113, 50, 97, + 65, 82, 51, 0, 6, 64, 21, 9, 240, 240, 117, 97, + 114, 113, 129, 129, 114, 113, 129, 81, 33, 65, 34, 50, + 240, 240, 128, 43, 14, 0, 7, 20, 68, 49, 17, 49, + 17, 81, 17, 51, 81, 17, 33, 17, 97, 17, 33, 17, + 81, 33, 17, 33, 81, 33, 17, 18, 81, 34, 33, 97, + 34, 33, 81, 49, 49, 82, 82, 0, 7, 80, 34, 12, + 0, 6, 19, 52, 66, 49, 81, 17, 49, 81, 17, 49, + 81, 18, 33, 65, 49, 17, 81, 49, 17, 81, 51, 81, + 66, 65, 81, 82, 65, 0, 6, 80, 27, 10, 240, 240, + 227, 82, 49, 65, 65, 49, 82, 33, 82, 18, 81, 34, + 81, 34, 66, 34, 65, 65, 49, 99, 240, 240, 240, 21, + 10, 240, 240, 183, 81, 50, 50, 50, 49, 65, 65, 50, + 68, 82, 129, 145, 145, 130, 0, 6, 30, 10, 240, 240, + 227, 82, 49, 65, 65, 49, 82, 33, 82, 18, 81, 34, + 81, 34, 66, 34, 17, 33, 66, 18, 99, 145, 17, 114, + 240, 144, 27, 9, 240, 240, 119, 65, 49, 50, 49, 49, + 65, 49, 49, 68, 66, 49, 49, 65, 49, 65, 49, 51, + 18, 66, 240, 240, 112, 25, 9, 240, 240, 147, 17, 34, + 49, 49, 65, 50, 130, 131, 49, 50, 49, 81, 33, 81, + 34, 49, 83, 240, 240, 160, 23, 9, 240, 240, 119, 17, + 49, 33, 17, 34, 33, 65, 49, 65, 129, 114, 113, 129, + 129, 114, 240, 240, 192, 28, 11, 240, 240, 228, 36, 34, + 65, 65, 81, 65, 81, 65, 81, 50, 65, 65, 81, 65, + 81, 65, 81, 65, 65, 100, 0, 6, 32, 25, 11, 240, + 240, 228, 36, 34, 65, 66, 49, 82, 33, 98, 33, 98, + 17, 114, 17, 115, 130, 146, 145, 0, 6, 80, 37, 15, + 0, 7, 68, 20, 20, 34, 50, 49, 66, 50, 49, 66, + 50, 33, 82, 35, 33, 82, 17, 18, 17, 99, 34, 17, + 99, 35, 114, 50, 130, 50, 129, 65, 0, 8, 64, 26, + 12, 0, 6, 21, 20, 66, 49, 113, 33, 129, 17, 147, + 161, 163, 129, 33, 113, 49, 113, 50, 67, 51, 0, 6, + 48, 23, 11, 240, 240, 228, 21, 34, 49, 97, 49, 97, + 33, 113, 17, 130, 146, 145, 161, 161, 146, 0, 6, 64, + 24, 9, 240, 240, 134, 33, 66, 17, 66, 113, 113, 114, + 98, 113, 65, 34, 65, 18, 65, 33, 51, 240, 240, 128, + 19, 7, 240, 240, 34, 65, 97, 97, 97, 81, 97, 97, + 97, 81, 97, 97, 97, 83, 176, 18, 6, 240, 145, 81, + 81, 97, 81, 81, 97, 81, 81, 81, 97, 81, 81, 97, + 112, 19, 7, 240, 240, 34, 97, 97, 81, 97, 97, 97, + 81, 97, 97, 81, 97, 97, 67, 176, 14, 6, 240, 240, + 33, 65, 17, 33, 33, 33, 49, 0, 7, 80, 6, 9, + 0, 19, 24, 160, 8, 3, 241, 33, 49, 240, 240, 64, + 19, 7, 0, 7, 35, 49, 33, 33, 49, 33, 34, 33, + 33, 49, 33, 17, 21, 240, 240, 22, 6, 240, 162, 81, + 65, 81, 84, 33, 33, 18, 33, 17, 49, 17, 49, 17, + 33, 33, 17, 240, 192, 17, 5, 240, 240, 194, 33, 17, + 17, 33, 17, 65, 65, 33, 17, 17, 240, 112, 23, 7, + 240, 240, 49, 97, 97, 97, 51, 49, 33, 33, 49, 33, + 34, 33, 33, 49, 33, 17, 21, 240, 240, 17, 5, 240, + 240, 194, 33, 17, 17, 33, 19, 33, 65, 33, 17, 17, + 240, 112, 21, 7, 240, 240, 34, 65, 17, 49, 97, 83, + 81, 81, 97, 97, 97, 81, 97, 97, 97, 97, 96, 24, + 7, 0, 7, 51, 49, 33, 33, 49, 33, 34, 33, 33, + 49, 33, 52, 97, 33, 33, 49, 33, 49, 17, 64, 26, + 8, 240, 240, 66, 113, 97, 113, 113, 18, 66, 17, 50, + 33, 50, 18, 49, 33, 17, 33, 34, 33, 50, 240, 240, + 64, 16, 5, 240, 129, 240, 49, 35, 33, 17, 65, 50, + 49, 17, 49, 240, 112, 20, 7, 240, 240, 34, 240, 162, + 65, 17, 97, 97, 81, 97, 97, 97, 81, 65, 17, 66, + 80, 23, 7, 240, 242, 97, 81, 97, 97, 33, 49, 18, + 33, 17, 67, 65, 33, 49, 17, 17, 17, 34, 240, 240, + 17, 4, 240, 34, 49, 33, 49, 49, 49, 33, 49, 49, + 17, 18, 33, 240, 64, 29, 11, 0, 11, 33, 33, 34, + 21, 18, 17, 17, 18, 33, 33, 49, 34, 18, 49, 33, + 33, 65, 33, 34, 33, 49, 34, 240, 240, 240, 23, 9, + 0, 9, 33, 34, 37, 17, 33, 18, 33, 65, 33, 81, + 33, 17, 49, 34, 49, 50, 240, 240, 128, 19, 6, 0, + 6, 34, 49, 33, 17, 49, 17, 49, 17, 34, 17, 33, + 33, 17, 240, 192, 24, 8, 0, 8, 33, 19, 20, 33, + 49, 49, 49, 49, 49, 34, 49, 33, 50, 17, 65, 17, + 81, 113, 98, 96, 21, 6, 0, 6, 34, 49, 33, 17, + 49, 17, 34, 17, 33, 33, 33, 36, 81, 65, 81, 81, + 48, 17, 7, 0, 7, 33, 18, 20, 17, 17, 18, 81, + 97, 97, 81, 240, 240, 48, 18, 7, 0, 7, 35, 49, + 49, 49, 98, 65, 33, 33, 49, 49, 17, 240, 240, 16, + 17, 4, 240, 49, 49, 33, 49, 50, 33, 33, 49, 49, + 17, 18, 34, 240, 48, 25, 9, 0, 9, 18, 49, 33, + 17, 49, 33, 17, 33, 81, 33, 81, 18, 17, 33, 17, + 18, 65, 34, 240, 240, 128, 23, 7, 0, 7, 18, 33, + 17, 17, 33, 17, 17, 33, 49, 33, 49, 33, 33, 33, + 49, 17, 240, 240, 16, 28, 11, 0, 11, 18, 49, 17, + 33, 17, 49, 33, 17, 17, 33, 49, 49, 33, 33, 65, + 33, 33, 49, 19, 17, 66, 34, 0, 6, 21, 9, 0, + 9, 34, 18, 49, 18, 18, 81, 113, 129, 82, 17, 33, + 33, 17, 18, 240, 240, 144, 27, 8, 0, 8, 18, 49, + 17, 17, 49, 49, 33, 65, 33, 65, 33, 49, 19, 49, + 18, 81, 17, 113, 50, 17, 65, 17, 80, 18, 7, 0, + 7, 34, 17, 33, 34, 81, 66, 50, 82, 33, 33, 18, + 240, 240, 16, 19, 7, 240, 177, 66, 81, 97, 97, 97, + 81, 81, 113, 97, 81, 97, 81, 97, 240, 80, 17, 2, + 129, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 48, 18, 5, 240, 33, 81, 65, 65, 49, 65, + 65, 81, 34, 49, 65, 65, 65, 49, 224, 12, 10, 0, + 11, 51, 97, 35, 33, 33, 51, 0, 9, 5, 6, 0, + 14, 32, 15, 5, 240, 240, 194, 50, 129, 49, 65, 65, + 65, 50, 50, 49, 64, 19, 6, 240, 240, 145, 81, 66, + 50, 17, 17, 17, 49, 17, 50, 66, 82, 65, 240, 112, + 25, 12, 0, 6, 115, 129, 49, 113, 34, 113, 162, 131, + 180, 129, 116, 65, 33, 50, 49, 33, 18, 20, 0, 6, + 48, 23, 8, 0, 6, 1, 19, 17, 33, 49, 33, 65, + 33, 81, 17, 65, 49, 49, 33, 19, 17, 0, 6, 16, + 23, 9, 240, 240, 114, 50, 49, 49, 65, 33, 81, 33, + 81, 17, 98, 101, 53, 97, 129, 114, 240, 240, 192, 15, + 2, 129, 17, 17, 17, 17, 17, 81, 17, 17, 17, 17, + 17, 48, 29, 7, 240, 240, 19, 49, 33, 49, 33, 49, + 81, 18, 33, 50, 17, 65, 33, 49, 34, 17, 81, 50, + 17, 49, 33, 49, 33, 66, 176, 9, 5, 240, 161, 65, + 18, 0, 7, 80, 37, 11, 0, 5, 116, 82, 18, 18, + 33, 33, 33, 17, 33, 33, 33, 33, 17, 18, 81, 50, + 81, 17, 33, 81, 17, 33, 33, 33, 17, 50, 33, 49, + 97, 70, 0, 5, 112, 14, 5, 240, 99, 33, 17, 17, + 33, 17, 17, 36, 0, 6, 48, 14, 4, 240, 240, 129, + 34, 17, 17, 17, 17, 33, 49, 240, 48, 10, 8, 0, + 8, 7, 113, 113, 0, 8, 16, 8, 5, 0, 6, 116, + 240, 240, 96, 38, 11, 0, 5, 116, 100, 18, 34, 17, + 33, 17, 33, 33, 33, 33, 17, 33, 33, 33, 67, 49, + 17, 33, 33, 33, 17, 33, 33, 33, 17, 19, 34, 49, + 97, 70, 0, 5, 112, 8, 6, 240, 240, 101, 0, 9, + 16, 15, 5, 240, 98, 33, 33, 17, 33, 17, 33, 17, + 17, 34, 0, 6, 18, 13, 0, 8, 97, 193, 193, 193, + 124, 97, 193, 193, 193, 240, 92, 240, 240, 160, 16, 6, + 240, 179, 33, 33, 49, 17, 65, 65, 65, 65, 18, 0, + 6, 32, 16, 6, 240, 179, 49, 17, 81, 50, 49, 33, + 17, 33, 50, 0, 6, 48, 7, 3, 242, 17, 240, 240, + 128, 26, 9, 0, 9, 33, 49, 65, 33, 81, 33, 65, + 49, 65, 49, 17, 33, 33, 17, 33, 18, 17, 49, 129, + 130, 129, 112, 31, 8, 240, 240, 69, 36, 51, 17, 51, + 17, 66, 17, 81, 17, 65, 17, 81, 17, 81, 17, 81, + 17, 65, 17, 81, 17, 81, 17, 81, 17, 208, 7, 2, + 240, 49, 17, 240, 32, 7, 3, 0, 6, 17, 18, 18, + 12, 4, 240, 98, 49, 49, 33, 49, 35, 240, 240, 48, + 14, 5, 240, 114, 33, 17, 33, 17, 33, 17, 20, 0, + 6, 48, 15, 6, 0, 7, 1, 65, 17, 49, 18, 17, + 17, 65, 65, 240, 224, 33, 11, 0, 6, 49, 66, 49, + 97, 49, 97, 33, 97, 49, 33, 49, 33, 49, 35, 17, + 33, 97, 33, 17, 65, 33, 33, 65, 37, 33, 81, 0, + 5, 112, 33, 11, 0, 6, 49, 66, 49, 97, 49, 97, + 33, 97, 49, 18, 49, 33, 17, 33, 19, 17, 17, 33, + 65, 65, 65, 50, 81, 33, 97, 51, 0, 5, 112, 37, + 12, 0, 6, 35, 49, 81, 17, 33, 129, 33, 98, 33, + 97, 33, 17, 33, 33, 33, 17, 49, 50, 33, 33, 113, + 33, 17, 81, 33, 33, 81, 37, 49, 81, 0, 6, 48, + 21, 6, 0, 6, 65, 81, 65, 65, 17, 49, 17, 50, + 50, 49, 81, 49, 17, 49, 33, 17, 32, 27, 10, 240, + 17, 161, 240, 65, 145, 130, 113, 17, 97, 33, 97, 33, + 85, 65, 65, 65, 65, 49, 81, 35, 51, 240, 240, 176, + 27, 11, 240, 81, 145, 240, 81, 161, 146, 129, 17, 113, + 33, 113, 33, 101, 81, 65, 81, 65, 65, 81, 51, 51, + 0, 5, 96, 27, 10, 240, 49, 114, 240, 65, 145, 130, + 113, 17, 97, 33, 97, 33, 85, 65, 65, 65, 65, 49, + 81, 35, 51, 240, 240, 176, 27, 11, 240, 34, 178, 240, + 65, 161, 146, 129, 17, 113, 33, 113, 33, 101, 81, 65, + 81, 65, 65, 81, 51, 51, 0, 5, 96, 29, 11, 240, + 33, 33, 113, 33, 240, 65, 161, 146, 129, 17, 113, 33, + 113, 33, 101, 81, 65, 81, 65, 65, 81, 51, 51, 0, + 5, 96, 29, 10, 113, 129, 17, 113, 17, 129, 145, 145, + 130, 113, 17, 97, 33, 97, 33, 85, 65, 65, 65, 65, + 49, 81, 35, 51, 240, 240, 176, 36, 16, 0, 8, 120, + 130, 65, 129, 17, 65, 129, 17, 193, 18, 33, 129, 36, + 148, 33, 33, 66, 49, 33, 17, 81, 50, 65, 65, 65, + 81, 51, 50, 35, 0, 8, 48, 28, 10, 240, 240, 227, + 17, 65, 50, 49, 65, 49, 81, 49, 130, 130, 130, 81, + 34, 65, 65, 49, 99, 113, 161, 113, 17, 114, 112, 27, + 10, 225, 161, 248, 65, 65, 50, 65, 49, 81, 49, 33, + 100, 82, 33, 81, 49, 81, 81, 49, 65, 50, 50, 240, + 240, 208, 28, 10, 240, 33, 129, 232, 65, 65, 50, 65, + 49, 81, 49, 33, 100, 82, 33, 81, 49, 81, 81, 49, + 65, 50, 50, 240, 240, 208, 28, 10, 240, 17, 114, 248, + 65, 65, 50, 65, 49, 81, 49, 33, 100, 82, 33, 81, + 49, 81, 81, 49, 65, 50, 50, 240, 240, 208, 29, 10, + 225, 33, 97, 33, 216, 65, 65, 50, 65, 49, 81, 49, + 33, 100, 82, 33, 81, 49, 81, 81, 49, 65, 50, 50, + 240, 240, 208, 18, 7, 146, 97, 181, 65, 82, 81, 97, + 97, 82, 81, 97, 97, 82, 240, 240, 48, 18, 7, 193, + 81, 165, 65, 82, 81, 97, 97, 82, 81, 97, 97, 82, + 240, 240, 48, 19, 7, 177, 66, 17, 149, 65, 82, 81, + 97, 97, 82, 81, 97, 97, 82, 240, 240, 48, 19, 7, + 145, 33, 97, 149, 65, 82, 81, 97, 97, 82, 81, 97, + 97, 82, 240, 240, 48, 28, 10, 240, 240, 183, 81, 50, + 50, 65, 49, 81, 49, 81, 21, 49, 34, 66, 33, 81, + 49, 81, 49, 65, 50, 34, 240, 240, 224, 35, 12, 240, + 36, 240, 211, 52, 66, 49, 81, 17, 49, 81, 17, 49, + 81, 18, 33, 65, 49, 17, 81, 49, 17, 81, 51, 81, + 66, 65, 81, 82, 65, 0, 6, 80, 28, 10, 241, 145, + 240, 51, 82, 49, 65, 65, 49, 82, 33, 82, 18, 81, + 34, 81, 34, 66, 34, 65, 65, 49, 99, 240, 240, 240, + 29, 10, 240, 33, 129, 240, 35, 82, 49, 65, 65, 49, + 82, 33, 82, 18, 81, 34, 81, 34, 66, 34, 65, 65, + 49, 99, 240, 240, 240, 30, 10, 97, 145, 114, 17, 240, + 19, 82, 49, 65, 65, 49, 82, 33, 82, 18, 81, 34, + 81, 34, 66, 34, 65, 65, 49, 99, 240, 240, 240, 27, + 10, 228, 240, 179, 82, 49, 65, 65, 49, 82, 33, 82, + 18, 81, 34, 81, 34, 66, 34, 65, 65, 49, 99, 240, + 240, 240, 28, 10, 226, 17, 240, 179, 82, 49, 65, 65, + 49, 82, 33, 82, 18, 81, 34, 81, 34, 66, 34, 65, + 65, 49, 99, 240, 240, 240, 25, 10, 0, 7, 65, 113, + 33, 81, 65, 49, 97, 17, 130, 130, 113, 33, 81, 49, + 65, 81, 33, 113, 240, 240, 16, 31, 11, 0, 6, 19, + 98, 49, 81, 65, 65, 52, 49, 33, 34, 34, 33, 33, + 50, 17, 49, 51, 50, 50, 65, 81, 49, 65, 35, 0, + 6, 16, 29, 11, 241, 177, 240, 20, 36, 34, 65, 65, + 81, 65, 81, 65, 81, 50, 65, 65, 81, 65, 81, 65, + 81, 65, 65, 100, 0, 6, 32, 29, 11, 240, 49, 145, + 244, 36, 34, 65, 65, 81, 65, 81, 65, 81, 50, 65, + 65, 81, 65, 81, 65, 81, 65, 65, 100, 0, 6, 32, + 30, 11, 240, 18, 129, 240, 36, 36, 34, 65, 65, 81, + 65, 81, 65, 81, 50, 65, 65, 81, 65, 81, 65, 81, + 65, 65, 100, 0, 6, 32, 30, 11, 241, 33, 113, 33, + 228, 36, 34, 65, 65, 81, 65, 81, 65, 81, 50, 65, + 65, 81, 65, 81, 65, 81, 65, 65, 100, 0, 6, 32, + 25, 11, 240, 33, 145, 240, 20, 21, 34, 49, 97, 49, + 97, 33, 113, 17, 130, 146, 145, 161, 161, 146, 0, 6, + 64, 22, 9, 240, 240, 117, 97, 117, 65, 65, 49, 65, + 49, 65, 34, 49, 53, 65, 129, 114, 240, 240, 208, 29, + 8, 240, 240, 99, 65, 33, 49, 49, 49, 33, 65, 17, + 81, 33, 49, 49, 49, 49, 49, 49, 50, 17, 49, 18, + 65, 113, 113, 240, 21, 7, 240, 240, 113, 113, 195, 49, + 33, 33, 49, 33, 34, 33, 33, 49, 33, 17, 21, 240, + 240, 21, 7, 240, 240, 146, 65, 195, 49, 33, 33, 49, + 33, 34, 33, 33, 49, 33, 17, 21, 240, 240, 22, 7, + 240, 240, 130, 65, 17, 179, 49, 33, 33, 49, 33, 34, + 33, 33, 49, 33, 17, 21, 240, 240, 21, 7, 240, 240, + 116, 240, 35, 49, 33, 33, 49, 33, 34, 33, 33, 49, + 33, 17, 21, 240, 240, 22, 7, 240, 240, 113, 18, 49, + 211, 49, 33, 33, 49, 33, 34, 33, 33, 49, 33, 17, + 21, 240, 240, 23, 7, 240, 240, 18, 65, 17, 81, 195, + 49, 33, 33, 49, 33, 34, 33, 33, 49, 33, 17, 21, + 240, 240, 25, 9, 0, 9, 35, 18, 33, 34, 17, 17, + 49, 33, 17, 36, 33, 33, 81, 33, 33, 35, 17, 17, + 240, 240, 128, 19, 5, 240, 240, 194, 33, 17, 17, 33, + 17, 65, 65, 33, 17, 17, 49, 50, 49, 144, 18, 5, + 240, 193, 81, 130, 33, 17, 17, 33, 19, 33, 65, 33, + 17, 17, 240, 112, 19, 6, 240, 240, 65, 65, 162, 49, + 17, 33, 33, 35, 49, 81, 33, 33, 17, 240, 192, 20, + 6, 240, 240, 49, 65, 17, 146, 49, 17, 33, 33, 35, + 49, 81, 33, 33, 17, 240, 192, 21, 7, 240, 240, 113, + 18, 49, 210, 65, 17, 49, 33, 51, 65, 97, 33, 49, + 17, 240, 240, 32, 15, 5, 240, 193, 225, 35, 33, 17, + 65, 50, 49, 17, 49, 240, 112, 17, 6, 240, 240, 65, + 65, 161, 51, 49, 17, 81, 66, 65, 17, 65, 240, 192, + 18, 6, 240, 193, 81, 65, 17, 145, 51, 49, 17, 81, + 66, 65, 17, 65, 240, 192, 19, 6, 240, 240, 33, 17, + 49, 17, 145, 51, 49, 17, 81, 66, 65, 17, 65, 240, + 192, 24, 7, 240, 240, 17, 114, 51, 97, 67, 49, 33, + 33, 49, 33, 49, 33, 34, 33, 33, 49, 17, 240, 240, + 32, 25, 9, 0, 6, 19, 240, 113, 34, 37, 17, 33, + 18, 33, 65, 33, 81, 33, 17, 49, 34, 49, 50, 240, + 240, 128, 21, 6, 240, 240, 33, 97, 162, 49, 33, 17, + 49, 17, 49, 17, 34, 17, 33, 33, 17, 240, 192, 22, + 7, 240, 240, 146, 65, 194, 65, 33, 33, 49, 33, 49, + 33, 34, 33, 33, 49, 17, 240, 240, 32, 22, 6, 240, + 240, 49, 65, 17, 146, 49, 33, 17, 49, 17, 49, 17, + 34, 17, 33, 33, 17, 240, 192, 22, 7, 240, 240, 116, + 240, 34, 65, 33, 33, 49, 33, 49, 33, 34, 33, 33, + 49, 17, 240, 240, 32, 23, 7, 240, 240, 113, 18, 49, + 210, 65, 33, 33, 49, 33, 49, 33, 34, 33, 33, 49, + 17, 240, 240, 32, 16, 13, 0, 10, 49, 193, 0, 5, + 108, 240, 240, 33, 193, 0, 5, 96, 20, 6, 0, 6, + 34, 49, 33, 17, 34, 17, 17, 17, 18, 18, 17, 33, + 33, 17, 240, 192, 27, 9, 0, 6, 17, 129, 226, 49, + 33, 17, 49, 33, 17, 33, 81, 33, 81, 18, 17, 33, + 17, 18, 65, 34, 240, 240, 128, 27, 9, 0, 6, 49, + 113, 210, 49, 33, 17, 49, 33, 17, 33, 81, 33, 81, + 18, 17, 33, 17, 18, 65, 34, 240, 240, 128, 28, 9, + 240, 240, 177, 129, 98, 226, 49, 33, 17, 49, 33, 17, + 33, 81, 33, 81, 18, 17, 33, 17, 18, 65, 34, 240, + 240, 128, 28, 9, 0, 6, 2, 17, 129, 194, 49, 33, + 17, 49, 33, 17, 33, 81, 33, 81, 18, 17, 33, 17, + 18, 65, 34, 240, 240, 128, 29, 8, 0, 5, 97, 97, + 178, 49, 17, 17, 49, 49, 33, 65, 33, 65, 33, 49, + 19, 49, 18, 81, 17, 113, 50, 17, 65, 17, 80, 27, + 8, 240, 240, 82, 97, 113, 113, 116, 50, 33, 49, 49, + 49, 49, 49, 34, 49, 33, 50, 17, 65, 17, 81, 113, + 98, 96, 30, 8, 0, 5, 97, 66, 17, 162, 49, 17, + 17, 49, 49, 33, 65, 33, 65, 33, 49, 19, 49, 18, + 81, 17, 113, 50, 17, 65, 17, 80, +}; + +//***************************************************************************** +// +// The glyph offset table for the 14 point Oldstandard italic font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard14i[] = +{ + 0, 5, 19, 29, 55, 84, 120, 151, + 159, 177, 195, 211, 231, 241, 249, 255, + 273, 300, 315, 340, 362, 383, 405, 431, + 451, 477, 503, 513, 526, 544, 554, 573, + 593, 633, 658, 685, 710, 738, 765, 787, + 812, 840, 857, 878, 906, 927, 970, 1004, + 1031, 1052, 1082, 1109, 1134, 1157, 1185, 1210, + 1247, 1273, 1296, 1320, 1339, 1357, 1376, 1390, + 1396, 1404, 1423, 1445, 1462, 1485, 1502, 1523, + 1547, 1573, 1589, 1609, 1632, 1649, 1678, 1701, + 1720, 1744, 1765, 1782, 1800, 1817, 1842, 1865, + 1893, 1914, 1941, 1959, 1978, 1995, 2013, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2025, 2030, 2045, 2064, 2089, 2112, 2135, 2150, + 2179, 2188, 2225, 2239, 2253, 2263, 2271, 2309, + 2317, 2332, 2350, 2366, 2382, 2389, 2415, 2446, + 2453, 2460, 2472, 2486, 2501, 2534, 2567, 2604, + 2625, 2652, 2679, 2706, 2733, 2762, 2791, 2827, + 2855, 2882, 2910, 2938, 2967, 2985, 3003, 3022, + 3041, 3069, 3104, 3132, 3161, 3191, 3218, 3246, + 3271, 3302, 3331, 3360, 3390, 3420, 3445, 3467, + 3496, 3517, 3538, 3560, 3581, 3603, 3626, 3651, + 3670, 3688, 3707, 3727, 3748, 3763, 3780, 3798, + 3817, 3841, 3866, 3887, 3909, 3931, 3953, 3976, + 3992, 4012, 4039, 4066, 4094, 4122, 4151, 4178, +}; + +//***************************************************************************** +// +// The font definition for the 14 point Oldstandard italic font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard14i = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 14, + + // + // The height of the font. + // + 19, + + // + // The baseline of the font. + // + 15, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard14i, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard14iData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard16.c b/third_party/fonts/ofl/fonts/fontoldstandard16.c new file mode 100644 index 0000000..956e204 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard16.c @@ -0,0 +1,595 @@ +//***************************************************************************** +// +// fontoldstandard16.c - Font definition for the 16pt Oldstandard font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 16 point +// Bold: no +// Italic: no +// Memory usage: 4712 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 16 point Oldstandard font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard16Data[4510] = +{ + 5, 6, 0, 16, 64, 14, 3, 242, 18, 18, 18, 18, + 17, 33, 33, 130, 18, 240, 16, 13, 5, 240, 161, 33, + 17, 33, 17, 33, 65, 0, 8, 32, 29, 10, 0, 6, + 81, 33, 97, 33, 97, 33, 57, 65, 33, 81, 33, 97, + 33, 97, 33, 73, 49, 33, 97, 33, 97, 33, 0, 6, + 96, 42, 8, 240, 240, 65, 17, 69, 33, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 19, 19, 17, 68, 84, 65, + 17, 17, 19, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 37, 65, 17, 240, 240, 80, 39, 12, 0, 7, 82, + 81, 49, 33, 49, 65, 33, 49, 65, 33, 33, 81, 33, + 33, 98, 33, 161, 49, 113, 18, 18, 65, 33, 49, 65, + 33, 49, 49, 49, 49, 129, 17, 0, 7, 96, 31, 12, + 0, 7, 114, 145, 33, 129, 33, 129, 33, 131, 161, 52, + 36, 49, 49, 49, 33, 65, 50, 17, 65, 66, 81, 67, + 84, 35, 0, 7, 96, 7, 2, 161, 17, 17, 240, 224, + 19, 4, 240, 113, 49, 33, 49, 33, 49, 49, 49, 49, + 49, 49, 65, 49, 65, 49, 144, 19, 4, 240, 81, 49, + 65, 49, 65, 49, 49, 49, 49, 49, 49, 33, 49, 33, + 49, 176, 20, 8, 240, 240, 209, 113, 66, 17, 18, 51, + 65, 17, 17, 34, 17, 18, 65, 0, 10, 64, 21, 14, + 0, 9, 65, 209, 209, 209, 209, 209, 209, 125, 113, 209, + 209, 209, 209, 209, 0, 6, 16, 10, 4, 0, 7, 17, + 35, 49, 49, 33, 224, 8, 5, 0, 7, 68, 0, 5, + 96, 8, 3, 240, 240, 242, 18, 240, 16, 21, 6, 240, + 240, 65, 81, 81, 65, 81, 81, 65, 81, 81, 65, 81, + 81, 81, 65, 81, 81, 176, 29, 8, 240, 240, 195, 65, + 49, 33, 65, 33, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 65, 49, 49, 67, 240, 240, 208, 18, + 6, 240, 240, 129, 51, 81, 81, 81, 81, 81, 81, 81, + 81, 53, 240, 240, 16, 25, 7, 240, 240, 100, 33, 65, + 17, 65, 18, 49, 34, 33, 81, 81, 81, 97, 81, 49, + 18, 49, 22, 240, 240, 96, 24, 7, 240, 240, 100, 33, + 65, 18, 49, 97, 97, 36, 97, 113, 18, 49, 18, 49, + 17, 49, 51, 240, 240, 128, 23, 8, 240, 240, 225, 113, + 98, 98, 81, 17, 65, 33, 65, 33, 49, 49, 55, 81, + 113, 85, 240, 240, 176, 24, 8, 240, 240, 161, 117, 49, + 113, 113, 19, 50, 49, 129, 113, 18, 65, 18, 65, 17, + 65, 52, 240, 240, 208, 28, 8, 240, 240, 211, 50, 34, + 17, 66, 17, 113, 19, 50, 49, 33, 81, 17, 81, 17, + 81, 17, 81, 33, 49, 67, 240, 240, 208, 20, 7, 240, + 240, 86, 17, 65, 97, 81, 97, 81, 97, 97, 82, 82, + 82, 82, 240, 240, 128, 28, 8, 240, 240, 196, 34, 50, + 17, 81, 17, 81, 18, 49, 52, 65, 19, 33, 66, 17, + 81, 17, 81, 17, 65, 52, 240, 240, 208, 28, 7, 240, + 240, 99, 65, 33, 33, 65, 17, 65, 17, 65, 17, 65, + 33, 34, 50, 17, 97, 18, 33, 33, 49, 51, 240, 240, + 128, 9, 3, 240, 194, 18, 210, 18, 240, 16, 13, 4, + 240, 240, 114, 34, 240, 34, 50, 49, 49, 33, 160, 20, + 13, 0, 11, 1, 162, 146, 161, 162, 146, 161, 210, 210, + 209, 210, 210, 210, 240, 240, 160, 10, 14, 0, 19, 45, + 240, 237, 0, 12, 48, 20, 13, 0, 9, 98, 210, 210, + 209, 210, 210, 209, 162, 146, 161, 162, 146, 161, 0, 6, + 32, 21, 7, 240, 240, 100, 33, 65, 18, 49, 97, 81, + 66, 65, 97, 33, 66, 194, 82, 240, 240, 128, 44, 13, + 0, 8, 85, 98, 33, 18, 65, 34, 18, 17, 49, 33, + 49, 33, 17, 33, 50, 33, 17, 33, 49, 49, 17, 33, + 49, 49, 17, 33, 49, 49, 17, 33, 19, 33, 49, 33, + 50, 81, 213, 0, 8, 96, 27, 12, 0, 8, 17, 178, + 162, 145, 17, 145, 18, 129, 18, 113, 49, 113, 50, 102, + 81, 81, 81, 81, 53, 21, 0, 7, 80, 28, 10, 0, + 6, 40, 65, 81, 49, 81, 49, 81, 49, 65, 69, 81, + 65, 65, 81, 49, 81, 49, 81, 49, 66, 23, 0, 6, + 80, 27, 10, 0, 6, 83, 33, 34, 51, 17, 98, 17, + 97, 33, 113, 17, 145, 145, 145, 113, 17, 97, 49, 81, + 69, 0, 6, 80, 28, 12, 0, 7, 72, 97, 81, 81, + 97, 65, 113, 49, 113, 49, 113, 49, 113, 49, 113, 49, + 113, 49, 97, 65, 81, 56, 0, 8, 29, 11, 0, 6, + 122, 49, 82, 49, 97, 49, 49, 33, 49, 49, 101, 97, + 49, 97, 49, 33, 49, 97, 49, 97, 49, 82, 26, 0, + 7, 26, 11, 0, 6, 122, 49, 82, 49, 97, 49, 49, + 33, 49, 49, 101, 97, 49, 97, 49, 97, 161, 161, 148, + 0, 7, 80, 32, 12, 0, 7, 115, 33, 66, 51, 49, + 98, 49, 113, 49, 113, 49, 70, 17, 98, 49, 98, 49, + 98, 49, 98, 65, 65, 17, 84, 33, 0, 7, 112, 30, + 13, 0, 8, 21, 37, 49, 97, 81, 97, 81, 97, 81, + 97, 88, 81, 97, 81, 97, 81, 97, 81, 97, 81, 97, + 53, 37, 0, 8, 32, 18, 6, 240, 245, 49, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 53, 240, 240, 16, 22, + 9, 0, 6, 5, 97, 129, 129, 129, 129, 129, 129, 50, + 49, 50, 49, 49, 65, 68, 0, 6, 16, 30, 11, 0, + 6, 117, 20, 49, 65, 81, 49, 97, 33, 113, 17, 129, + 18, 114, 17, 113, 34, 97, 50, 81, 50, 81, 66, 37, + 20, 0, 7, 22, 10, 0, 6, 37, 113, 145, 145, 145, + 145, 145, 145, 145, 81, 49, 81, 49, 81, 25, 0, 6, + 48, 43, 13, 0, 8, 20, 83, 50, 66, 83, 50, 81, + 17, 33, 17, 81, 17, 33, 17, 81, 18, 17, 17, 81, + 18, 17, 17, 81, 34, 33, 81, 34, 33, 81, 34, 33, + 81, 49, 33, 52, 68, 0, 8, 32, 37, 13, 0, 8, + 20, 68, 51, 65, 83, 65, 81, 18, 49, 81, 33, 49, + 81, 34, 33, 81, 49, 33, 81, 50, 17, 81, 65, 17, + 81, 82, 81, 82, 53, 65, 0, 8, 64, 29, 10, 0, + 6, 83, 82, 49, 65, 81, 33, 113, 17, 113, 17, 113, + 17, 113, 17, 113, 17, 113, 33, 81, 49, 65, 84, 0, + 6, 96, 23, 10, 0, 6, 40, 65, 81, 49, 81, 49, + 81, 49, 65, 69, 81, 145, 145, 145, 145, 117, 0, 6, + 112, 35, 10, 0, 6, 83, 82, 49, 65, 81, 33, 113, + 17, 113, 17, 113, 17, 113, 17, 113, 17, 113, 33, 34, + 17, 49, 17, 34, 69, 17, 113, 17, 115, 240, 240, 16, + 31, 12, 0, 7, 72, 97, 81, 81, 81, 81, 81, 81, + 65, 101, 113, 65, 97, 65, 97, 65, 97, 66, 17, 49, + 66, 17, 21, 50, 0, 7, 96, 24, 9, 0, 5, 100, + 65, 66, 33, 81, 33, 130, 132, 116, 130, 17, 97, 17, + 97, 18, 65, 33, 20, 0, 6, 25, 11, 0, 6, 122, + 17, 49, 50, 17, 49, 65, 81, 65, 81, 65, 81, 161, + 161, 161, 161, 161, 133, 0, 7, 48, 30, 13, 0, 8, + 21, 37, 49, 97, 81, 97, 81, 97, 81, 97, 81, 97, + 81, 97, 81, 97, 81, 97, 81, 97, 97, 65, 132, 0, + 8, 96, 28, 13, 0, 8, 22, 21, 50, 81, 97, 65, + 114, 49, 114, 49, 129, 49, 130, 17, 146, 17, 161, 17, + 162, 193, 193, 0, 8, 112, 42, 17, 0, 10, 85, 21, + 20, 49, 66, 65, 82, 50, 65, 82, 51, 49, 97, 33, + 18, 33, 114, 17, 33, 33, 114, 17, 33, 33, 129, 17, + 35, 146, 51, 146, 66, 146, 65, 240, 17, 0, 11, 48, + 28, 12, 0, 7, 69, 21, 65, 49, 114, 33, 129, 17, + 147, 161, 178, 145, 17, 129, 34, 113, 49, 97, 66, 52, + 37, 0, 7, 80, 23, 12, 0, 7, 69, 21, 50, 65, + 97, 49, 114, 33, 129, 17, 146, 177, 177, 177, 177, 177, + 149, 0, 8, 26, 10, 0, 6, 56, 18, 66, 33, 66, + 49, 66, 114, 129, 130, 114, 65, 49, 81, 34, 81, 33, + 82, 24, 0, 6, 64, 20, 4, 240, 82, 33, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 51, + 80, 20, 6, 240, 241, 81, 81, 97, 81, 81, 81, 97, + 81, 81, 97, 81, 81, 97, 81, 81, 112, 20, 4, 240, + 98, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 19, 80, 18, 8, 240, 240, 209, 97, 17, + 81, 17, 65, 49, 49, 49, 33, 81, 0, 11, 16, 7, + 9, 0, 21, 56, 240, 64, 9, 4, 240, 81, 65, 65, + 0, 7, 16, 22, 8, 0, 9, 19, 65, 49, 65, 33, + 98, 66, 17, 49, 49, 49, 34, 17, 34, 19, 240, 240, + 176, 27, 7, 240, 240, 81, 97, 97, 97, 97, 19, 34, + 33, 33, 65, 17, 65, 17, 65, 17, 65, 17, 49, 50, + 17, 240, 240, 112, 19, 6, 0, 6, 115, 33, 49, 17, + 49, 17, 81, 81, 81, 49, 33, 17, 240, 240, 32, 27, + 7, 240, 240, 146, 97, 97, 97, 35, 17, 17, 50, 17, + 65, 17, 65, 17, 65, 17, 65, 17, 65, 33, 19, 240, + 240, 96, 18, 6, 0, 6, 115, 33, 49, 17, 49, 21, + 17, 81, 81, 49, 35, 240, 240, 32, 18, 5, 240, 179, + 17, 33, 17, 65, 66, 49, 65, 65, 65, 65, 65, 65, + 240, 224, 26, 8, 0, 9, 20, 17, 17, 66, 17, 65, + 33, 65, 33, 65, 52, 49, 118, 34, 65, 17, 81, 17, + 81, 34, 18, 160, 26, 6, 240, 241, 81, 81, 81, 81, + 18, 34, 33, 17, 49, 17, 49, 17, 49, 17, 49, 17, + 49, 17, 49, 240, 240, 16, 14, 3, 242, 18, 114, 33, + 33, 33, 33, 33, 33, 33, 240, 16, 21, 5, 240, 209, + 65, 210, 65, 65, 65, 65, 65, 65, 65, 65, 17, 33, + 17, 33, 17, 17, 112, 25, 6, 240, 241, 81, 81, 81, + 81, 34, 17, 33, 33, 17, 49, 17, 51, 49, 33, 33, + 34, 17, 34, 240, 240, 16, 15, 2, 161, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 176, 31, 10, 0, + 11, 33, 18, 34, 34, 34, 33, 17, 49, 49, 17, 49, + 49, 17, 49, 49, 17, 49, 49, 17, 49, 49, 17, 49, + 49, 0, 6, 48, 23, 6, 0, 6, 97, 18, 34, 33, + 17, 49, 17, 49, 17, 49, 17, 49, 17, 49, 17, 49, + 240, 240, 16, 21, 7, 0, 8, 18, 50, 33, 33, 65, + 17, 65, 17, 65, 17, 65, 17, 49, 51, 240, 240, 128, + 26, 7, 0, 7, 113, 19, 34, 33, 33, 65, 17, 65, + 17, 65, 17, 65, 17, 49, 35, 17, 33, 33, 49, 97, + 97, 208, 25, 7, 0, 8, 3, 49, 50, 17, 65, 17, + 65, 17, 65, 17, 65, 17, 65, 33, 19, 49, 33, 97, + 97, 97, 128, 16, 5, 240, 240, 241, 18, 18, 17, 17, + 65, 65, 65, 65, 65, 240, 224, 20, 7, 0, 8, 3, + 49, 49, 34, 99, 99, 17, 65, 18, 49, 17, 17, 17, + 240, 240, 112, 19, 5, 240, 161, 65, 65, 65, 66, 49, + 65, 65, 65, 65, 33, 17, 33, 34, 240, 192, 23, 6, + 0, 6, 97, 49, 17, 49, 17, 49, 17, 49, 17, 49, + 17, 49, 17, 34, 34, 17, 240, 240, 16, 20, 7, 0, + 7, 114, 49, 33, 33, 49, 33, 50, 17, 65, 17, 66, + 82, 97, 240, 240, 128, 27, 11, 0, 12, 50, 34, 49, + 33, 49, 33, 49, 49, 33, 50, 19, 17, 66, 34, 82, + 34, 97, 49, 97, 49, 0, 7, 32, 20, 7, 0, 7, + 114, 34, 33, 33, 66, 82, 82, 65, 18, 49, 33, 34, + 34, 240, 240, 96, 22, 8, 0, 9, 2, 50, 33, 49, + 50, 33, 65, 17, 81, 17, 83, 98, 97, 113, 113, 67, + 83, 208, 18, 6, 0, 6, 101, 17, 34, 65, 65, 81, + 65, 81, 33, 17, 34, 240, 240, 16, 19, 4, 240, 113, + 33, 49, 50, 49, 49, 49, 18, 50, 49, 49, 34, 33, + 49, 65, 144, 19, 2, 161, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 48, 19, 4, + 240, 81, 65, 49, 34, 33, 49, 49, 66, 18, 33, 49, + 50, 49, 49, 33, 176, 14, 10, 0, 13, 114, 81, 17, + 35, 33, 17, 68, 0, 10, 16, 5, 6, 0, 16, 64, + 14, 3, 240, 194, 18, 113, 33, 33, 34, 18, 18, 18, + 18, 64, 24, 6, 240, 240, 241, 81, 67, 33, 18, 17, + 34, 17, 33, 33, 33, 33, 33, 49, 18, 51, 65, 81, + 240, 80, 25, 10, 0, 6, 115, 97, 49, 81, 34, 81, + 145, 117, 113, 145, 145, 98, 17, 81, 34, 49, 20, 19, + 0, 6, 64, 25, 8, 0, 7, 1, 19, 17, 33, 49, + 33, 81, 17, 81, 17, 81, 17, 81, 33, 49, 33, 19, + 17, 0, 7, 16, 24, 10, 0, 6, 36, 35, 49, 49, + 82, 33, 97, 17, 113, 17, 129, 117, 113, 117, 113, 145, + 117, 0, 6, 80, 15, 2, 161, 17, 17, 17, 17, 17, + 113, 17, 17, 17, 17, 17, 80, 29, 7, 240, 240, 114, + 65, 33, 49, 98, 98, 50, 18, 33, 50, 17, 65, 18, + 49, 34, 17, 81, 98, 49, 33, 49, 33, 66, 240, 32, + 10, 5, 240, 241, 33, 17, 33, 0, 8, 112, 41, 13, + 0, 8, 69, 113, 34, 18, 65, 33, 33, 33, 33, 33, + 49, 33, 33, 33, 113, 17, 33, 113, 17, 33, 113, 17, + 33, 113, 17, 49, 33, 33, 49, 50, 49, 65, 97, 102, + 0, 8, 80, 16, 6, 240, 243, 66, 49, 17, 49, 17, + 17, 33, 17, 36, 0, 8, 64, 18, 5, 0, 6, 81, + 17, 17, 33, 17, 33, 17, 33, 17, 33, 33, 240, 240, + 16, 10, 9, 0, 12, 56, 129, 129, 129, 0, 8, 8, + 5, 0, 7, 68, 0, 5, 96, 44, 13, 0, 8, 69, + 117, 18, 65, 33, 33, 33, 33, 49, 33, 33, 33, 49, + 33, 49, 17, 51, 65, 17, 49, 33, 49, 17, 49, 33, + 49, 17, 49, 33, 33, 49, 19, 18, 17, 65, 97, 102, + 0, 8, 80, 8, 6, 240, 240, 101, 0, 11, 48, 15, + 6, 240, 240, 19, 33, 49, 17, 49, 17, 49, 35, 0, + 9, 32, 19, 14, 0, 11, 33, 209, 209, 209, 209, 125, + 113, 209, 209, 209, 240, 109, 0, 7, 16, 15, 5, 240, + 178, 33, 33, 18, 17, 49, 49, 49, 68, 0, 6, 48, + 17, 6, 240, 240, 19, 34, 33, 81, 35, 82, 33, 33, + 17, 49, 35, 0, 7, 9, 4, 240, 113, 33, 33, 0, + 7, 48, 25, 9, 0, 10, 17, 65, 49, 65, 49, 65, + 49, 65, 49, 65, 129, 49, 65, 17, 36, 18, 240, 65, + 129, 129, 128, 35, 7, 240, 240, 101, 19, 17, 35, 17, + 35, 17, 35, 17, 50, 17, 65, 17, 65, 17, 65, 17, + 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, + 240, 16, 8, 3, 240, 240, 50, 18, 240, 208, 9, 4, + 0, 8, 81, 49, 65, 19, 80, 13, 4, 240, 97, 34, + 49, 49, 49, 49, 35, 240, 240, 176, 14, 5, 240, 178, + 33, 33, 17, 33, 17, 33, 34, 36, 0, 7, 18, 5, + 0, 6, 33, 81, 17, 33, 17, 33, 17, 33, 17, 17, + 17, 240, 240, 32, 34, 11, 0, 7, 1, 81, 50, 81, + 65, 65, 81, 49, 97, 49, 97, 33, 49, 35, 17, 34, + 81, 33, 17, 81, 17, 33, 65, 52, 49, 81, 161, 0, + 7, 16, 33, 11, 0, 7, 1, 146, 81, 65, 65, 81, + 65, 81, 49, 18, 49, 33, 17, 33, 19, 17, 18, 17, + 65, 81, 65, 65, 65, 65, 81, 49, 164, 0, 7, 36, + 12, 0, 7, 83, 65, 50, 33, 49, 113, 33, 83, 33, + 130, 17, 97, 34, 49, 51, 17, 34, 97, 33, 17, 97, + 33, 17, 81, 52, 65, 81, 65, 97, 0, 7, 96, 20, + 7, 0, 8, 18, 82, 194, 65, 33, 97, 66, 65, 81, + 50, 17, 65, 17, 65, 36, 144, 29, 12, 242, 177, 193, + 240, 129, 177, 178, 145, 17, 145, 17, 145, 18, 113, 34, + 113, 49, 118, 81, 66, 81, 81, 53, 21, 0, 7, 80, + 30, 12, 240, 65, 161, 240, 240, 65, 177, 178, 145, 17, + 145, 17, 145, 18, 113, 34, 113, 49, 118, 81, 66, 81, + 81, 53, 21, 0, 7, 80, 30, 12, 240, 226, 145, 33, + 240, 97, 178, 162, 145, 17, 145, 18, 129, 18, 113, 49, + 113, 50, 102, 81, 81, 81, 81, 53, 21, 0, 7, 80, + 28, 13, 240, 244, 0, 6, 18, 178, 161, 17, 161, 18, + 145, 18, 129, 49, 129, 50, 118, 97, 81, 97, 82, 53, + 37, 0, 8, 32, 31, 12, 241, 49, 113, 49, 240, 240, + 49, 177, 163, 129, 18, 129, 18, 129, 34, 113, 34, 97, + 65, 103, 81, 81, 81, 81, 52, 52, 0, 7, 80, 31, + 12, 81, 161, 17, 145, 17, 161, 240, 129, 177, 177, 163, + 145, 17, 129, 33, 129, 34, 113, 34, 102, 97, 66, 81, + 66, 53, 21, 0, 7, 80, 38, 16, 0, 10, 90, 114, + 82, 114, 97, 97, 17, 49, 33, 97, 17, 49, 129, 37, + 129, 33, 49, 113, 49, 49, 97, 20, 97, 49, 65, 97, + 49, 65, 82, 20, 26, 0, 10, 16, 29, 10, 0, 6, + 83, 33, 34, 51, 17, 98, 17, 98, 17, 113, 17, 145, + 145, 145, 113, 17, 97, 49, 81, 69, 97, 162, 145, 100, + 224, 30, 11, 225, 162, 240, 218, 49, 82, 49, 97, 49, + 49, 33, 49, 49, 101, 97, 49, 97, 49, 33, 49, 97, + 49, 97, 49, 82, 26, 0, 7, 32, 11, 240, 33, 161, + 145, 240, 26, 49, 82, 49, 97, 49, 49, 33, 49, 49, + 101, 97, 49, 97, 49, 33, 49, 97, 49, 97, 49, 82, + 26, 0, 7, 31, 11, 240, 178, 129, 33, 250, 49, 82, + 49, 97, 49, 49, 33, 49, 49, 101, 97, 49, 97, 49, + 33, 49, 97, 49, 97, 49, 82, 26, 0, 7, 30, 11, + 225, 33, 113, 33, 240, 186, 49, 82, 49, 97, 49, 97, + 49, 33, 116, 113, 33, 113, 97, 49, 97, 49, 97, 49, + 82, 26, 0, 7, 20, 6, 97, 97, 97, 149, 49, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 53, 240, 240, 16, + 20, 6, 161, 65, 65, 149, 49, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 53, 240, 240, 16, 21, 6, 129, 81, + 65, 17, 133, 49, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 53, 240, 240, 16, 21, 6, 97, 49, 17, 49, 213, + 49, 81, 81, 81, 81, 81, 81, 81, 81, 81, 53, 240, + 240, 16, 28, 12, 0, 7, 72, 97, 81, 81, 97, 65, + 113, 49, 113, 36, 81, 49, 113, 49, 113, 49, 113, 49, + 97, 65, 81, 56, 0, 8, 40, 13, 240, 35, 17, 162, + 240, 240, 20, 68, 51, 65, 83, 65, 81, 18, 49, 81, + 33, 49, 81, 34, 33, 81, 49, 33, 81, 50, 17, 81, + 67, 81, 82, 81, 82, 53, 65, 0, 8, 64, 31, 10, + 193, 161, 161, 240, 51, 82, 49, 65, 81, 33, 113, 17, + 113, 17, 113, 17, 113, 17, 113, 17, 113, 33, 81, 49, + 65, 84, 0, 6, 96, 32, 10, 240, 17, 129, 129, 240, + 51, 82, 49, 65, 81, 33, 113, 17, 113, 17, 113, 17, + 113, 17, 113, 17, 113, 33, 81, 49, 65, 84, 0, 6, + 96, 33, 10, 225, 129, 17, 97, 49, 240, 19, 82, 49, + 65, 81, 33, 113, 17, 113, 17, 113, 17, 113, 17, 113, + 17, 113, 33, 81, 49, 65, 84, 0, 6, 96, 30, 10, + 195, 147, 240, 179, 82, 49, 65, 81, 33, 113, 17, 113, + 17, 113, 17, 113, 17, 113, 17, 113, 33, 81, 49, 65, + 84, 0, 6, 96, 32, 10, 209, 33, 97, 33, 240, 179, + 82, 49, 65, 81, 33, 113, 17, 113, 17, 113, 17, 113, + 17, 113, 17, 113, 33, 81, 49, 65, 84, 0, 6, 96, + 24, 10, 0, 10, 1, 113, 33, 81, 65, 49, 97, 17, + 129, 129, 17, 97, 49, 65, 81, 33, 113, 0, 6, 48, + 37, 10, 0, 6, 84, 17, 34, 66, 33, 81, 33, 81, + 17, 17, 65, 33, 17, 49, 49, 17, 49, 49, 17, 33, + 65, 17, 17, 81, 33, 81, 34, 65, 49, 20, 0, 6, + 96, 33, 13, 240, 33, 193, 209, 240, 85, 37, 49, 97, + 81, 97, 81, 97, 81, 97, 81, 97, 81, 97, 81, 97, + 81, 97, 81, 97, 97, 65, 132, 0, 8, 96, 33, 13, + 240, 81, 177, 177, 240, 85, 37, 49, 97, 81, 97, 81, + 97, 81, 97, 81, 97, 81, 97, 81, 97, 81, 97, 81, + 97, 97, 65, 132, 0, 8, 96, 34, 13, 240, 49, 177, + 17, 209, 240, 53, 37, 49, 97, 81, 97, 81, 97, 81, + 97, 81, 97, 81, 97, 81, 97, 81, 97, 81, 97, 97, + 65, 132, 0, 8, 96, 35, 13, 240, 33, 33, 145, 33, + 240, 240, 21, 37, 49, 97, 81, 97, 81, 97, 81, 97, + 81, 97, 81, 97, 81, 97, 81, 97, 81, 97, 97, 65, + 132, 0, 8, 96, 26, 12, 240, 65, 161, 161, 240, 53, + 21, 50, 65, 97, 49, 114, 33, 129, 17, 146, 177, 177, + 177, 177, 177, 149, 0, 8, 24, 10, 0, 6, 37, 113, + 149, 81, 65, 65, 81, 49, 81, 49, 81, 49, 65, 69, + 81, 145, 117, 0, 6, 112, 33, 7, 240, 240, 99, 49, + 49, 33, 49, 33, 33, 49, 18, 49, 49, 33, 65, 17, + 65, 17, 65, 17, 17, 33, 17, 17, 33, 17, 17, 17, + 240, 240, 112, 25, 8, 240, 240, 162, 113, 129, 227, 65, + 49, 65, 33, 98, 66, 17, 49, 49, 49, 34, 17, 34, + 19, 240, 240, 176, 25, 8, 240, 240, 225, 97, 240, 99, + 65, 49, 65, 33, 98, 66, 17, 49, 49, 49, 34, 17, + 34, 19, 240, 240, 176, 26, 8, 240, 240, 193, 113, 97, + 17, 211, 65, 49, 65, 33, 98, 66, 17, 49, 49, 49, + 34, 17, 34, 19, 240, 240, 176, 24, 8, 0, 6, 20, + 240, 83, 65, 49, 65, 33, 98, 66, 17, 49, 49, 49, + 34, 17, 34, 19, 240, 240, 176, 26, 8, 0, 6, 17, + 33, 65, 33, 210, 81, 33, 65, 33, 98, 66, 17, 49, + 49, 49, 34, 17, 34, 19, 240, 240, 176, 29, 8, 240, + 240, 194, 81, 33, 65, 33, 82, 81, 17, 65, 49, 65, + 33, 98, 66, 17, 49, 49, 49, 34, 17, 34, 19, 240, + 240, 176, 27, 11, 0, 12, 67, 20, 33, 49, 49, 49, + 33, 65, 56, 18, 33, 97, 49, 65, 17, 34, 49, 50, + 34, 17, 0, 7, 16, 21, 6, 0, 6, 115, 33, 49, + 17, 49, 17, 81, 81, 81, 49, 33, 17, 65, 98, 81, + 36, 112, 21, 6, 240, 240, 17, 81, 97, 163, 33, 49, + 17, 49, 21, 17, 81, 81, 49, 35, 240, 240, 32, 23, + 7, 240, 240, 145, 82, 81, 180, 33, 49, 33, 50, 22, + 17, 97, 65, 17, 49, 50, 17, 240, 240, 112, 22, 6, + 240, 240, 33, 81, 65, 17, 147, 33, 49, 17, 49, 21, + 17, 81, 81, 49, 35, 240, 240, 32, 22, 6, 240, 240, + 113, 33, 33, 33, 131, 33, 49, 17, 49, 21, 17, 81, + 81, 49, 35, 240, 240, 32, 16, 4, 240, 81, 65, 65, + 113, 49, 49, 49, 49, 49, 49, 49, 240, 96, 16, 4, + 240, 113, 33, 33, 113, 49, 49, 49, 49, 49, 49, 49, + 240, 128, 17, 4, 240, 97, 49, 33, 17, 97, 49, 49, + 49, 49, 49, 49, 49, 240, 112, 17, 5, 240, 241, 33, + 17, 33, 114, 65, 65, 65, 65, 65, 65, 65, 240, 192, + 26, 7, 240, 240, 98, 98, 65, 17, 113, 67, 34, 49, + 17, 65, 17, 65, 17, 65, 17, 65, 17, 49, 51, 240, + 240, 128, 26, 6, 240, 240, 114, 17, 50, 129, 18, 34, + 33, 17, 49, 17, 49, 17, 49, 17, 49, 17, 49, 17, + 49, 240, 240, 16, 24, 7, 240, 240, 97, 97, 113, 210, + 50, 33, 33, 65, 17, 65, 17, 65, 17, 65, 17, 49, + 51, 240, 240, 128, 24, 7, 240, 240, 145, 97, 81, 194, + 50, 33, 33, 65, 17, 65, 17, 65, 17, 65, 17, 49, + 51, 240, 240, 128, 23, 7, 240, 240, 226, 65, 226, 50, + 33, 33, 65, 17, 65, 17, 65, 17, 65, 17, 49, 51, + 240, 240, 128, 23, 7, 240, 240, 212, 240, 50, 50, 33, + 33, 65, 17, 65, 17, 65, 17, 65, 17, 49, 51, 240, + 240, 128, 25, 7, 240, 240, 209, 33, 49, 33, 178, 50, + 33, 33, 65, 17, 65, 17, 65, 17, 65, 17, 49, 51, + 240, 240, 128, 16, 15, 0, 13, 114, 210, 0, 6, 78, + 0, 6, 66, 210, 0, 8, 48, 23, 7, 0, 8, 20, + 18, 33, 33, 50, 17, 33, 17, 17, 17, 33, 18, 49, + 17, 49, 36, 240, 240, 128, 25, 6, 240, 241, 97, 97, + 145, 49, 17, 49, 17, 49, 17, 49, 17, 49, 17, 49, + 17, 34, 34, 17, 240, 240, 16, 26, 6, 240, 240, 50, + 65, 65, 145, 49, 17, 49, 17, 49, 17, 49, 17, 49, + 17, 49, 17, 34, 34, 17, 240, 240, 16, 27, 6, 240, + 240, 33, 81, 65, 17, 129, 49, 17, 49, 17, 49, 17, + 49, 17, 49, 17, 49, 17, 34, 34, 17, 240, 240, 16, + 27, 6, 240, 240, 113, 33, 33, 33, 113, 49, 17, 49, + 17, 49, 17, 49, 17, 49, 17, 49, 17, 34, 34, 17, + 240, 240, 16, 25, 8, 240, 240, 241, 97, 240, 66, 50, + 33, 49, 50, 33, 65, 17, 81, 17, 83, 97, 113, 113, + 113, 67, 83, 208, 27, 6, 240, 241, 81, 81, 81, 81, + 19, 18, 33, 17, 49, 17, 49, 17, 33, 33, 33, 33, + 17, 50, 65, 81, 81, 81, 176, 27, 7, 240, 240, 209, + 33, 49, 33, 145, 50, 17, 49, 49, 33, 49, 17, 65, + 17, 82, 82, 81, 97, 97, 65, 17, 66, 192, +}; + +//***************************************************************************** +// +// The glyph offset table for the 16 point Oldstandard font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard16[] = +{ + 0, 5, 19, 32, 61, 103, 142, 173, + 180, 199, 218, 238, 259, 269, 277, 285, + 306, 335, 353, 378, 402, 425, 449, 477, + 497, 525, 553, 562, 575, 595, 605, 625, + 646, 690, 717, 745, 772, 800, 829, 855, + 887, 917, 935, 957, 987, 1009, 1052, 1089, + 1118, 1141, 1176, 1207, 1231, 1256, 1286, 1314, + 1356, 1384, 1407, 1433, 1453, 1473, 1493, 1511, + 1518, 1527, 1549, 1576, 1595, 1622, 1640, 1658, + 1684, 1710, 1724, 1745, 1770, 1785, 1816, 1839, + 1860, 1886, 1911, 1927, 1947, 1966, 1989, 2009, + 2036, 2056, 2078, 2096, 2115, 2134, 2153, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2167, 2172, 2186, 2210, 2235, 2260, 2284, 2299, + 2328, 2338, 2379, 2395, 2413, 2423, 2431, 2475, + 2483, 2498, 2517, 2532, 2549, 2558, 2583, 2618, + 2626, 2635, 2648, 2662, 2680, 2714, 2747, 2783, + 2803, 2832, 2862, 2892, 2920, 2951, 2982, 3020, + 3049, 3079, 3111, 3142, 3172, 3192, 3212, 3233, + 3254, 3282, 3322, 3353, 3385, 3418, 3448, 3480, + 3504, 3541, 3574, 3607, 3641, 3676, 3702, 3726, + 3759, 3784, 3809, 3835, 3859, 3885, 3914, 3941, + 3962, 3983, 4006, 4028, 4050, 4066, 4082, 4099, + 4116, 4142, 4168, 4192, 4216, 4239, 4262, 4287, + 4303, 4326, 4351, 4377, 4404, 4431, 4456, 4483, +}; + +//***************************************************************************** +// +// The font definition for the 16 point Oldstandard font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard16 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 15, + + // + // The height of the font. + // + 22, + + // + // The baseline of the font. + // + 17, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard16, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard16Data +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard16b.c b/third_party/fonts/ofl/fonts/fontoldstandard16b.c new file mode 100644 index 0000000..0889886 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard16b.c @@ -0,0 +1,590 @@ +//***************************************************************************** +// +// fontoldstandard16b.c - Font definition for the 16pt Oldstandard bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 16 point +// Bold: yes +// Italic: no +// Memory usage: 4644 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 16 point Oldstandard bold font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard16bData[4441] = +{ + 5, 6, 0, 15, 96, 14, 3, 194, 18, 18, 18, 18, + 17, 33, 33, 130, 18, 240, 16, 10, 5, 240, 84, 20, + 20, 20, 0, 8, 32, 29, 10, 240, 240, 209, 49, 81, + 33, 97, 33, 57, 49, 49, 81, 49, 81, 49, 81, 49, + 57, 49, 33, 97, 33, 81, 49, 0, 6, 96, 40, 9, + 240, 225, 17, 85, 49, 17, 17, 18, 17, 17, 17, 33, + 19, 20, 19, 17, 84, 101, 65, 20, 17, 17, 17, 18, + 17, 17, 17, 18, 17, 17, 17, 17, 53, 81, 17, 240, + 240, 160, 40, 12, 0, 6, 19, 65, 50, 18, 33, 66, + 18, 33, 66, 18, 17, 82, 18, 17, 113, 33, 177, 33, + 113, 18, 18, 65, 34, 18, 65, 34, 18, 49, 50, 18, + 49, 65, 17, 0, 7, 96, 32, 12, 0, 6, 51, 130, + 33, 114, 33, 114, 17, 146, 163, 35, 49, 18, 49, 49, + 50, 17, 50, 52, 50, 66, 67, 51, 17, 37, 34, 0, + 7, 96, 9, 3, 194, 18, 18, 18, 240, 240, 160, 18, + 5, 240, 194, 49, 49, 65, 50, 50, 50, 50, 50, 50, + 65, 66, 65, 81, 176, 18, 5, 240, 161, 81, 81, 65, + 66, 50, 50, 50, 50, 50, 49, 50, 49, 49, 224, 19, + 7, 240, 242, 49, 18, 17, 19, 18, 50, 51, 18, 17, + 18, 17, 50, 0, 9, 16, 21, 15, 0, 8, 33, 225, + 225, 225, 225, 225, 142, 113, 225, 225, 225, 225, 225, 225, + 0, 6, 80, 10, 4, 0, 7, 3, 19, 49, 33, 33, + 176, 9, 5, 0, 6, 116, 20, 240, 240, 176, 8, 3, + 240, 240, 194, 18, 240, 16, 20, 6, 240, 209, 81, 81, + 65, 81, 81, 66, 65, 81, 81, 65, 81, 81, 65, 81, + 81, 176, 29, 8, 240, 240, 67, 65, 49, 49, 49, 34, + 50, 18, 50, 18, 50, 18, 50, 18, 50, 18, 50, 33, + 49, 49, 49, 67, 240, 240, 208, 19, 7, 240, 240, 17, + 52, 82, 82, 82, 82, 82, 82, 82, 82, 82, 54, 240, + 240, 96, 27, 8, 240, 240, 68, 34, 50, 18, 50, 19, + 34, 34, 34, 82, 81, 97, 49, 33, 65, 23, 17, 21, + 17, 35, 240, 240, 192, 25, 8, 240, 240, 53, 33, 66, + 18, 50, 18, 50, 97, 52, 114, 114, 18, 50, 18, 50, + 17, 65, 52, 240, 240, 208, 23, 9, 240, 240, 162, 114, + 99, 99, 81, 18, 81, 18, 65, 34, 65, 34, 56, 82, + 114, 86, 0, 5, 96, 24, 8, 240, 240, 49, 49, 53, + 51, 81, 116, 65, 49, 114, 98, 19, 34, 19, 34, 18, + 49, 52, 240, 240, 208, 27, 8, 240, 240, 67, 65, 49, + 49, 34, 34, 34, 34, 101, 50, 49, 34, 50, 18, 50, + 33, 50, 33, 49, 67, 240, 240, 208, 24, 8, 240, 240, + 66, 33, 36, 17, 18, 20, 17, 81, 17, 65, 97, 113, + 97, 98, 98, 98, 98, 240, 240, 224, 28, 8, 240, 240, + 68, 49, 65, 18, 65, 18, 65, 20, 17, 53, 49, 20, + 17, 51, 17, 81, 17, 81, 18, 65, 52, 240, 240, 192, + 26, 7, 240, 227, 50, 33, 34, 33, 34, 34, 18, 34, + 18, 34, 37, 82, 34, 18, 34, 17, 49, 33, 66, 240, + 240, 128, 9, 3, 240, 146, 18, 210, 18, 240, 16, 13, + 4, 240, 240, 34, 34, 241, 35, 19, 49, 33, 33, 176, + 20, 13, 0, 9, 50, 146, 147, 146, 146, 146, 162, 194, + 210, 210, 195, 194, 210, 240, 240, 160, 11, 15, 0, 18, + 110, 240, 240, 30, 0, 13, 32, 20, 13, 0, 8, 18, + 210, 194, 210, 210, 210, 194, 162, 146, 146, 147, 146, 146, + 0, 6, 32, 21, 6, 240, 163, 33, 34, 17, 34, 17, + 34, 50, 65, 65, 81, 17, 65, 178, 66, 240, 240, 32, + 43, 13, 0, 7, 5, 98, 81, 65, 50, 19, 49, 33, + 34, 33, 17, 34, 34, 33, 17, 18, 50, 33, 17, 18, + 50, 33, 17, 18, 34, 33, 33, 18, 17, 17, 33, 49, + 18, 50, 81, 213, 0, 8, 96, 25, 13, 0, 7, 33, + 178, 178, 179, 148, 145, 18, 129, 35, 113, 35, 118, 97, + 67, 81, 67, 53, 22, 0, 8, 32, 28, 11, 240, 240, + 232, 82, 66, 50, 66, 50, 66, 50, 65, 70, 82, 50, + 66, 66, 50, 66, 50, 66, 50, 65, 40, 0, 7, 32, + 28, 10, 240, 240, 211, 33, 34, 51, 33, 82, 18, 81, + 34, 97, 18, 130, 130, 97, 18, 97, 33, 81, 49, 81, + 69, 0, 6, 80, 28, 12, 0, 6, 8, 98, 65, 82, + 81, 66, 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, + 82, 50, 81, 66, 65, 56, 0, 8, 29, 11, 240, 240, + 234, 50, 66, 50, 81, 50, 81, 50, 49, 17, 50, 34, + 86, 82, 34, 82, 49, 17, 50, 81, 50, 66, 26, 0, + 7, 27, 11, 240, 240, 234, 50, 66, 50, 81, 50, 81, + 50, 49, 17, 50, 34, 86, 82, 34, 82, 49, 82, 146, + 118, 0, 7, 64, 31, 11, 0, 5, 116, 17, 50, 66, + 49, 97, 34, 97, 34, 97, 34, 146, 53, 18, 82, 34, + 82, 49, 82, 50, 49, 17, 83, 33, 0, 7, 16, 28, + 13, 0, 6, 76, 50, 66, 82, 66, 82, 66, 82, 66, + 88, 82, 66, 82, 66, 82, 66, 82, 66, 82, 66, 60, + 0, 8, 32, 18, 7, 240, 214, 50, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 54, 240, 240, 96, 23, 8, 240, + 240, 69, 82, 98, 98, 98, 98, 98, 49, 34, 34, 34, + 34, 34, 33, 49, 67, 240, 240, 224, 30, 12, 0, 6, + 5, 20, 66, 49, 98, 49, 98, 33, 114, 18, 117, 114, + 19, 98, 19, 98, 35, 82, 35, 82, 51, 37, 21, 0, + 7, 80, 22, 11, 240, 240, 230, 114, 146, 146, 146, 146, + 146, 146, 81, 50, 81, 50, 66, 50, 66, 26, 0, 7, + 43, 15, 0, 7, 69, 84, 51, 67, 83, 67, 84, 33, + 18, 81, 18, 33, 18, 81, 19, 17, 18, 81, 19, 17, + 18, 81, 35, 34, 81, 35, 34, 81, 50, 34, 81, 50, + 34, 53, 17, 22, 0, 9, 64, 34, 12, 0, 6, 4, + 37, 51, 49, 83, 49, 84, 33, 81, 18, 33, 81, 19, + 17, 81, 34, 17, 81, 36, 81, 51, 81, 66, 81, 66, + 53, 49, 0, 7, 112, 29, 10, 240, 240, 211, 82, 49, + 65, 81, 34, 82, 18, 82, 18, 82, 18, 82, 18, 82, + 18, 82, 33, 81, 50, 49, 99, 0, 6, 96, 24, 11, + 240, 240, 232, 82, 65, 66, 66, 50, 66, 50, 66, 50, + 65, 70, 82, 146, 146, 146, 118, 0, 7, 64, 35, 10, + 240, 240, 211, 82, 49, 65, 81, 34, 82, 18, 82, 18, + 82, 18, 82, 18, 82, 18, 82, 33, 33, 33, 66, 18, + 99, 33, 97, 33, 97, 33, 100, 114, 192, 31, 12, 0, + 6, 8, 98, 50, 82, 50, 82, 50, 82, 50, 85, 114, + 49, 98, 50, 82, 50, 82, 50, 17, 50, 50, 17, 22, + 34, 0, 7, 96, 25, 9, 240, 240, 116, 66, 50, 34, + 65, 35, 100, 101, 100, 33, 52, 17, 82, 18, 81, 18, + 65, 33, 20, 0, 6, 27, 11, 240, 240, 234, 18, 34, + 34, 18, 34, 49, 17, 50, 49, 17, 50, 49, 82, 146, + 146, 146, 146, 146, 118, 0, 7, 32, 30, 12, 0, 6, + 4, 37, 34, 81, 66, 81, 66, 81, 66, 81, 66, 81, + 66, 81, 66, 81, 66, 81, 66, 81, 81, 65, 116, 0, + 8, 16, 26, 13, 0, 6, 70, 21, 51, 65, 98, 49, + 114, 49, 115, 33, 130, 33, 130, 17, 148, 163, 162, 178, + 193, 0, 8, 112, 38, 18, 0, 9, 15, 2, 51, 50, + 65, 98, 51, 49, 98, 51, 33, 115, 17, 18, 33, 130, + 17, 19, 17, 130, 17, 35, 148, 35, 147, 51, 162, 51, + 162, 65, 177, 81, 0, 12, 26, 12, 0, 6, 5, 20, + 67, 33, 114, 33, 116, 147, 147, 162, 148, 113, 34, 113, + 35, 81, 66, 52, 37, 0, 7, 80, 24, 12, 0, 6, + 5, 21, 35, 65, 82, 49, 99, 33, 114, 17, 130, 17, + 146, 162, 162, 162, 162, 149, 0, 8, 25, 9, 240, 240, + 104, 18, 51, 17, 51, 33, 50, 99, 98, 99, 98, 99, + 49, 34, 65, 19, 50, 24, 0, 5, 96, 19, 5, 240, + 83, 34, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 52, 176, 20, 6, 240, 145, 81, 97, 81, 81, + 81, 97, 81, 81, 97, 81, 81, 82, 81, 81, 81, 112, + 19, 5, 240, 99, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 20, 176, 17, 8, 240, 240, 81, + 114, 81, 17, 66, 33, 49, 50, 17, 81, 0, 11, 16, + 7, 9, 0, 20, 40, 240, 64, 9, 4, 240, 17, 65, + 65, 0, 7, 16, 20, 8, 0, 8, 20, 49, 50, 34, + 34, 83, 50, 18, 34, 34, 34, 35, 38, 240, 240, 176, + 24, 7, 240, 210, 82, 82, 82, 85, 34, 33, 34, 34, + 18, 34, 18, 34, 18, 34, 18, 33, 67, 240, 240, 112, + 18, 7, 0, 7, 35, 49, 49, 18, 34, 18, 82, 82, + 97, 49, 51, 240, 240, 112, 26, 7, 240, 240, 34, 82, + 82, 82, 34, 18, 33, 19, 18, 34, 18, 34, 18, 34, + 18, 34, 33, 34, 37, 240, 240, 96, 19, 7, 0, 7, + 35, 49, 34, 18, 34, 22, 18, 82, 49, 33, 49, 51, + 240, 240, 112, 20, 6, 240, 163, 34, 18, 18, 18, 18, + 66, 66, 66, 66, 66, 66, 66, 66, 240, 240, 64, 24, + 9, 0, 9, 23, 18, 36, 18, 34, 50, 34, 65, 33, + 98, 86, 55, 34, 65, 33, 81, 33, 65, 68, 208, 26, + 7, 240, 210, 82, 82, 82, 82, 18, 35, 18, 18, 34, + 18, 34, 18, 34, 18, 34, 18, 34, 18, 34, 240, 240, + 96, 14, 3, 194, 18, 114, 18, 18, 18, 18, 18, 18, + 18, 240, 16, 20, 6, 240, 194, 66, 243, 66, 66, 66, + 66, 66, 66, 66, 66, 18, 18, 18, 18, 20, 128, 26, + 8, 240, 240, 34, 98, 98, 98, 98, 34, 34, 33, 50, + 17, 66, 17, 69, 50, 18, 50, 34, 34, 35, 240, 240, + 176, 16, 3, 194, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 240, 16, 30, 11, 0, 11, 2, 18, 34, + 35, 19, 18, 18, 34, 34, 18, 34, 34, 18, 34, 34, + 18, 34, 34, 18, 34, 34, 18, 34, 34, 0, 7, 23, + 7, 0, 7, 2, 18, 35, 18, 18, 34, 18, 34, 18, + 34, 18, 34, 18, 34, 18, 34, 240, 240, 96, 22, 8, + 0, 8, 35, 65, 49, 34, 50, 18, 50, 18, 50, 18, + 50, 33, 49, 65, 17, 240, 240, 208, 23, 7, 0, 7, + 5, 34, 33, 34, 34, 18, 34, 18, 34, 18, 34, 18, + 33, 37, 34, 82, 82, 82, 192, 23, 7, 0, 7, 19, + 65, 34, 18, 34, 18, 34, 18, 34, 18, 34, 33, 34, + 37, 82, 82, 82, 82, 128, 17, 6, 0, 6, 2, 18, + 21, 18, 18, 18, 66, 66, 66, 66, 240, 240, 64, 18, + 6, 0, 6, 18, 49, 33, 34, 67, 68, 17, 34, 17, + 49, 35, 240, 240, 32, 19, 5, 240, 177, 65, 50, 50, + 50, 50, 50, 50, 17, 18, 17, 18, 17, 34, 240, 192, + 22, 7, 0, 7, 2, 34, 18, 34, 18, 34, 18, 34, + 18, 34, 18, 34, 18, 34, 37, 240, 240, 96, 19, 7, + 0, 7, 3, 33, 34, 33, 34, 17, 50, 17, 67, 66, + 82, 97, 240, 240, 128, 28, 11, 0, 11, 2, 35, 33, + 34, 34, 33, 34, 34, 17, 50, 17, 17, 17, 67, 19, + 66, 34, 82, 34, 97, 49, 0, 7, 32, 20, 7, 0, + 7, 3, 33, 34, 17, 51, 82, 83, 49, 18, 49, 34, + 18, 34, 240, 240, 96, 21, 7, 0, 7, 2, 49, 34, + 33, 34, 17, 50, 17, 67, 67, 81, 97, 97, 51, 67, + 66, 192, 19, 7, 0, 7, 6, 17, 34, 82, 66, 82, + 66, 33, 33, 49, 18, 19, 240, 240, 96, 19, 6, 240, + 194, 50, 66, 66, 66, 66, 66, 34, 98, 66, 66, 66, + 66, 66, 82, 208, 18, 2, 129, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 80, 20, 6, + 240, 146, 82, 66, 66, 66, 66, 66, 98, 34, 66, 66, + 66, 66, 66, 50, 240, 16, 14, 10, 0, 12, 68, 65, + 17, 35, 33, 17, 68, 0, 10, 16, 5, 6, 0, 15, + 96, 14, 3, 240, 146, 18, 113, 33, 33, 34, 18, 18, + 18, 18, 64, 26, 7, 240, 240, 241, 97, 83, 49, 18, + 34, 18, 34, 17, 50, 17, 50, 17, 17, 33, 17, 17, + 36, 81, 97, 240, 144, 26, 10, 240, 240, 243, 97, 49, + 66, 34, 66, 33, 82, 117, 99, 130, 130, 82, 17, 49, + 17, 38, 19, 35, 0, 6, 64, 25, 8, 0, 6, 1, + 19, 17, 33, 49, 33, 81, 17, 81, 17, 81, 17, 81, + 33, 49, 33, 19, 17, 0, 7, 16, 24, 9, 240, 240, + 100, 19, 34, 49, 51, 33, 66, 17, 82, 17, 98, 86, + 54, 82, 114, 114, 86, 0, 5, 112, 15, 2, 129, 17, + 17, 17, 17, 17, 113, 17, 17, 17, 17, 17, 80, 31, + 8, 240, 240, 52, 50, 49, 34, 34, 34, 33, 67, 65, + 20, 33, 51, 18, 50, 20, 33, 37, 83, 34, 34, 34, + 34, 33, 49, 67, 240, 80, 10, 6, 240, 242, 18, 18, + 18, 0, 10, 80, 39, 13, 0, 7, 4, 114, 66, 65, + 50, 49, 49, 33, 33, 33, 33, 34, 97, 17, 34, 97, + 17, 34, 97, 17, 34, 97, 33, 33, 33, 33, 49, 50, + 49, 65, 97, 102, 0, 8, 80, 13, 6, 240, 148, 33, + 18, 51, 36, 36, 37, 0, 8, 48, 17, 5, 0, 5, + 97, 50, 17, 18, 17, 18, 17, 18, 17, 33, 81, 240, + 192, 11, 9, 0, 10, 24, 129, 129, 129, 129, 0, 8, + 9, 5, 0, 6, 116, 20, 240, 240, 176, 40, 13, 0, + 7, 4, 114, 66, 70, 49, 49, 18, 34, 17, 33, 34, + 34, 33, 17, 36, 65, 17, 34, 34, 33, 17, 34, 34, + 33, 33, 18, 36, 53, 33, 17, 65, 97, 102, 0, 8, + 80, 7, 5, 240, 164, 0, 9, 64, 14, 6, 240, 163, + 33, 49, 17, 49, 17, 49, 35, 0, 9, 32, 19, 15, + 0, 8, 33, 225, 225, 225, 225, 142, 113, 225, 225, 225, + 240, 142, 0, 9, 64, 16, 6, 240, 163, 33, 34, 18, + 18, 49, 50, 33, 21, 50, 0, 7, 96, 18, 6, 240, + 163, 33, 34, 33, 18, 34, 98, 18, 18, 17, 34, 34, + 0, 7, 16, 9, 4, 240, 49, 34, 17, 0, 7, 48, + 27, 9, 0, 9, 2, 34, 50, 34, 50, 34, 50, 34, + 49, 65, 49, 65, 17, 17, 52, 21, 17, 33, 129, 130, + 114, 240, 16, 33, 8, 240, 240, 54, 20, 17, 36, 17, + 36, 17, 36, 17, 51, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 240, 176, + 7, 3, 240, 242, 18, 240, 208, 9, 5, 0, 10, 17, + 65, 82, 20, 96, 13, 5, 240, 113, 35, 50, 50, 50, + 50, 36, 0, 6, 48, 15, 6, 240, 163, 34, 18, 18, + 18, 18, 18, 49, 53, 0, 8, 48, 19, 6, 0, 7, + 17, 49, 18, 33, 18, 33, 18, 33, 18, 17, 33, 65, + 240, 240, 48, 35, 13, 0, 6, 97, 81, 67, 81, 82, + 65, 98, 65, 98, 49, 114, 49, 34, 36, 17, 35, 97, + 33, 18, 97, 33, 18, 81, 53, 65, 82, 65, 98, 0, + 8, 48, 36, 13, 0, 6, 97, 81, 67, 81, 82, 65, + 98, 65, 98, 49, 19, 50, 50, 34, 20, 17, 18, 18, + 81, 81, 97, 65, 97, 50, 33, 65, 53, 49, 98, 0, + 8, 48, 36, 14, 0, 7, 19, 81, 65, 34, 65, 81, + 18, 49, 98, 65, 146, 33, 98, 18, 17, 50, 50, 33, + 51, 113, 33, 18, 97, 49, 18, 97, 38, 65, 98, 194, + 0, 9, 20, 6, 0, 6, 18, 66, 177, 65, 17, 81, + 65, 66, 50, 33, 18, 33, 18, 33, 35, 128, 28, 13, + 240, 34, 193, 240, 177, 193, 179, 163, 145, 18, 145, 19, + 129, 19, 113, 50, 118, 97, 67, 81, 82, 53, 22, 0, + 8, 32, 27, 13, 240, 81, 177, 240, 161, 178, 178, 179, + 148, 145, 18, 129, 35, 113, 35, 118, 97, 67, 81, 67, + 53, 22, 0, 8, 32, 28, 13, 240, 50, 161, 33, 240, + 145, 178, 178, 179, 148, 145, 18, 129, 35, 113, 35, 118, + 97, 67, 81, 67, 53, 22, 0, 8, 32, 28, 13, 240, + 34, 210, 240, 145, 178, 178, 179, 145, 18, 145, 18, 145, + 19, 113, 50, 118, 97, 67, 81, 67, 53, 22, 0, 8, + 32, 29, 12, 242, 18, 114, 18, 240, 97, 177, 163, 147, + 129, 18, 129, 19, 113, 19, 97, 50, 102, 97, 51, 81, + 66, 52, 22, 0, 7, 80, 29, 13, 82, 161, 33, 145, + 33, 162, 193, 178, 178, 164, 148, 129, 34, 129, 35, 113, + 35, 118, 97, 67, 81, 67, 52, 38, 0, 8, 32, 38, + 16, 0, 8, 90, 115, 66, 115, 81, 97, 18, 81, 97, + 18, 49, 17, 81, 34, 34, 113, 38, 97, 50, 34, 102, + 49, 17, 49, 66, 81, 49, 66, 66, 20, 41, 0, 10, + 16, 30, 10, 240, 240, 211, 33, 34, 51, 33, 82, 18, + 81, 34, 97, 18, 130, 130, 97, 18, 97, 33, 81, 49, + 81, 69, 97, 162, 145, 99, 240, 30, 11, 226, 162, 240, + 26, 50, 66, 50, 81, 50, 81, 50, 49, 17, 50, 34, + 86, 82, 34, 82, 49, 17, 50, 81, 50, 66, 26, 0, + 7, 31, 11, 240, 34, 129, 240, 26, 50, 66, 50, 81, + 50, 81, 50, 49, 17, 50, 34, 86, 82, 34, 82, 49, + 17, 50, 81, 50, 66, 26, 0, 7, 31, 11, 81, 147, + 113, 49, 234, 50, 66, 50, 81, 50, 81, 50, 49, 17, + 50, 34, 86, 82, 34, 82, 49, 17, 50, 81, 50, 66, + 26, 0, 7, 31, 11, 226, 18, 98, 18, 234, 50, 66, + 50, 66, 50, 81, 50, 49, 17, 50, 34, 86, 82, 34, + 82, 49, 17, 50, 81, 50, 66, 26, 0, 7, 19, 6, + 98, 81, 165, 34, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 53, 240, 240, 16, 19, 7, 177, 81, 166, 50, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 54, 240, 240, 96, + 20, 7, 146, 65, 33, 150, 50, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 54, 240, 240, 96, 21, 6, 98, 18, + 18, 18, 117, 50, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 37, 240, 240, 16, 28, 12, 0, 6, 8, 98, 65, + 82, 81, 66, 82, 50, 82, 22, 50, 50, 82, 50, 82, + 50, 82, 50, 81, 66, 65, 56, 0, 8, 35, 12, 113, + 131, 240, 228, 37, 51, 49, 83, 49, 84, 33, 81, 18, + 33, 81, 19, 17, 81, 34, 17, 81, 36, 81, 51, 81, + 66, 81, 66, 53, 49, 0, 7, 112, 31, 10, 34, 145, + 161, 240, 51, 97, 49, 66, 65, 34, 82, 18, 82, 18, + 82, 18, 82, 18, 82, 18, 82, 34, 65, 65, 49, 99, + 0, 6, 96, 31, 10, 97, 130, 114, 240, 35, 82, 49, + 65, 81, 34, 82, 18, 82, 18, 82, 18, 82, 18, 82, + 18, 82, 33, 81, 50, 49, 99, 0, 6, 96, 32, 10, + 65, 131, 98, 18, 240, 19, 82, 49, 65, 81, 34, 82, + 18, 82, 18, 82, 18, 82, 18, 82, 18, 82, 33, 81, + 50, 49, 99, 0, 6, 96, 29, 10, 212, 240, 179, 97, + 49, 66, 65, 34, 82, 18, 82, 18, 82, 18, 82, 18, + 82, 18, 82, 34, 65, 65, 49, 99, 0, 6, 96, 32, + 10, 194, 18, 82, 18, 240, 19, 82, 49, 65, 81, 34, + 82, 18, 82, 18, 82, 18, 82, 18, 82, 18, 82, 33, + 81, 50, 49, 99, 0, 6, 96, 25, 10, 0, 8, 97, + 113, 33, 81, 65, 49, 97, 17, 129, 129, 17, 97, 49, + 65, 81, 34, 97, 17, 0, 6, 16, 33, 10, 240, 240, + 211, 33, 34, 50, 49, 66, 34, 67, 18, 52, 18, 34, + 18, 18, 18, 34, 20, 50, 19, 66, 34, 65, 50, 49, + 49, 35, 0, 6, 96, 32, 12, 49, 178, 177, 240, 68, + 37, 34, 81, 66, 81, 66, 81, 66, 81, 66, 81, 66, + 81, 66, 81, 66, 81, 66, 81, 81, 65, 116, 0, 8, + 16, 32, 12, 97, 162, 161, 240, 52, 37, 34, 81, 66, + 81, 66, 81, 66, 81, 66, 81, 66, 81, 66, 81, 66, + 81, 66, 81, 81, 65, 116, 0, 8, 16, 33, 12, 240, + 18, 145, 33, 240, 36, 37, 34, 81, 66, 81, 66, 81, + 66, 81, 66, 81, 66, 81, 66, 81, 66, 81, 66, 81, + 81, 65, 116, 0, 8, 16, 33, 12, 242, 18, 114, 18, + 240, 21, 36, 34, 81, 66, 81, 66, 81, 66, 81, 66, + 81, 66, 81, 66, 81, 66, 81, 66, 81, 81, 65, 116, + 0, 8, 16, 26, 12, 240, 50, 145, 240, 53, 21, 35, + 65, 82, 49, 99, 33, 114, 17, 130, 17, 146, 162, 162, + 162, 162, 149, 0, 8, 24, 11, 240, 240, 230, 114, 150, + 82, 65, 66, 66, 50, 66, 50, 66, 50, 65, 70, 82, + 146, 118, 0, 7, 64, 30, 8, 240, 240, 67, 65, 34, + 34, 34, 34, 34, 34, 17, 66, 34, 34, 50, 18, 50, + 18, 50, 18, 50, 20, 18, 18, 19, 240, 240, 192, 23, + 8, 240, 240, 49, 114, 113, 228, 50, 34, 34, 34, 68, + 49, 34, 34, 34, 34, 35, 38, 240, 240, 176, 23, 8, + 240, 240, 97, 98, 82, 212, 49, 50, 34, 34, 83, 50, + 18, 34, 34, 34, 35, 38, 240, 240, 176, 24, 8, 240, + 240, 66, 98, 81, 33, 196, 49, 50, 34, 34, 83, 50, + 18, 34, 34, 34, 35, 38, 240, 240, 176, 23, 8, 240, + 240, 113, 37, 240, 84, 49, 50, 34, 34, 83, 50, 18, + 34, 34, 34, 35, 38, 240, 240, 176, 24, 8, 240, 240, + 162, 34, 34, 34, 180, 49, 50, 34, 34, 83, 50, 18, + 34, 34, 34, 35, 38, 240, 240, 176, 24, 8, 240, 240, + 51, 81, 33, 82, 212, 49, 50, 34, 34, 83, 50, 18, + 34, 34, 34, 35, 38, 240, 240, 176, 25, 11, 0, 11, + 24, 34, 34, 34, 18, 34, 34, 56, 33, 34, 82, 34, + 49, 18, 34, 49, 35, 35, 0, 7, 16, 20, 7, 0, + 7, 35, 49, 49, 18, 34, 18, 82, 82, 97, 49, 51, + 65, 114, 97, 67, 144, 21, 7, 240, 225, 98, 97, 211, + 49, 34, 18, 34, 22, 18, 82, 49, 33, 49, 51, 240, + 240, 112, 22, 7, 240, 240, 33, 82, 81, 195, 49, 34, + 18, 34, 22, 18, 82, 49, 33, 49, 51, 240, 240, 112, + 22, 7, 240, 242, 82, 65, 33, 179, 49, 34, 18, 34, + 22, 18, 82, 49, 33, 49, 51, 240, 240, 112, 22, 7, + 240, 240, 98, 18, 34, 18, 163, 49, 34, 18, 34, 22, + 18, 82, 97, 49, 51, 240, 240, 112, 16, 4, 240, 17, + 50, 65, 98, 34, 34, 34, 34, 34, 34, 34, 240, 96, + 16, 4, 240, 49, 34, 17, 114, 34, 34, 34, 34, 34, + 34, 34, 240, 112, 17, 5, 240, 98, 50, 33, 33, 114, + 50, 50, 50, 50, 50, 50, 50, 240, 192, 18, 6, 240, + 242, 18, 18, 18, 130, 66, 66, 66, 66, 66, 66, 66, + 240, 240, 48, 28, 8, 240, 240, 51, 17, 67, 65, 18, + 114, 68, 49, 50, 18, 50, 18, 50, 18, 50, 18, 50, + 33, 49, 65, 17, 240, 240, 208, 25, 7, 240, 240, 100, + 240, 18, 18, 35, 18, 18, 34, 18, 34, 18, 34, 18, + 34, 18, 34, 18, 34, 240, 240, 96, 25, 8, 240, 240, + 50, 113, 129, 227, 65, 49, 34, 50, 18, 50, 18, 50, + 18, 50, 33, 49, 65, 17, 240, 240, 208, 25, 8, 240, + 240, 98, 98, 81, 227, 65, 49, 34, 50, 18, 50, 18, + 50, 18, 50, 33, 49, 65, 17, 240, 240, 208, 26, 8, + 240, 240, 81, 99, 65, 49, 195, 65, 49, 34, 50, 18, + 50, 18, 50, 18, 50, 33, 49, 65, 17, 240, 240, 208, + 24, 8, 240, 240, 181, 240, 83, 65, 49, 34, 50, 18, + 50, 18, 50, 18, 50, 33, 49, 65, 17, 240, 240, 208, + 26, 8, 240, 240, 178, 18, 50, 18, 195, 65, 49, 34, + 50, 18, 50, 18, 50, 18, 50, 33, 49, 65, 17, 240, + 240, 208, 16, 15, 0, 12, 2, 210, 0, 6, 78, 0, + 6, 66, 210, 0, 8, 48, 23, 8, 0, 8, 35, 17, + 33, 34, 34, 35, 18, 20, 20, 18, 19, 34, 34, 33, + 33, 19, 240, 240, 208, 24, 7, 240, 225, 98, 97, 178, + 34, 18, 34, 18, 34, 18, 34, 18, 34, 18, 34, 18, + 34, 37, 240, 240, 96, 25, 7, 240, 240, 18, 81, 81, + 178, 34, 18, 34, 18, 34, 18, 34, 18, 34, 18, 34, + 18, 34, 37, 240, 240, 96, 25, 7, 240, 241, 98, 65, + 33, 146, 34, 18, 34, 18, 34, 18, 34, 18, 34, 18, + 34, 18, 34, 37, 240, 240, 96, 26, 7, 240, 240, 82, + 18, 34, 18, 146, 34, 18, 34, 18, 34, 18, 34, 18, + 34, 18, 34, 18, 34, 37, 240, 240, 96, 24, 7, 240, + 240, 33, 82, 81, 162, 49, 33, 49, 34, 17, 50, 17, + 67, 66, 82, 97, 97, 51, 67, 66, 192, 27, 8, 240, + 240, 178, 98, 98, 98, 18, 51, 18, 34, 34, 34, 34, + 34, 33, 50, 18, 50, 17, 67, 82, 98, 98, 81, 240, + 25, 7, 240, 240, 98, 18, 34, 18, 131, 33, 34, 33, + 34, 17, 50, 17, 67, 67, 81, 97, 97, 51, 67, 67, + 176, +}; + +//***************************************************************************** +// +// The glyph offset table for the 16 point Oldstandard bold font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard16b[] = +{ + 0, 5, 19, 29, 58, 98, 138, 170, + 179, 197, 215, 234, 255, 265, 274, 282, + 302, 331, 350, 377, 402, 425, 449, 476, + 500, 528, 554, 563, 576, 596, 607, 627, + 648, 691, 716, 744, 772, 800, 829, 856, + 887, 915, 933, 956, 986, 1008, 1051, 1085, + 1114, 1138, 1173, 1204, 1229, 1256, 1286, 1312, + 1350, 1376, 1400, 1425, 1444, 1464, 1483, 1500, + 1507, 1516, 1536, 1560, 1578, 1604, 1623, 1643, + 1667, 1693, 1707, 1727, 1753, 1769, 1799, 1822, + 1844, 1867, 1890, 1907, 1925, 1944, 1966, 1985, + 2013, 2033, 2054, 2073, 2092, 2110, 2130, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2144, 2149, 2163, 2189, 2215, 2240, 2264, 2279, + 2310, 2320, 2359, 2372, 2389, 2400, 2409, 2449, + 2456, 2470, 2489, 2505, 2523, 2532, 2559, 2592, + 2599, 2608, 2621, 2636, 2655, 2690, 2726, 2762, + 2782, 2810, 2837, 2865, 2893, 2922, 2951, 2989, + 3019, 3049, 3080, 3111, 3142, 3161, 3180, 3200, + 3221, 3249, 3284, 3315, 3346, 3378, 3407, 3439, + 3464, 3497, 3529, 3561, 3594, 3627, 3653, 3677, + 3707, 3730, 3753, 3777, 3800, 3824, 3848, 3873, + 3893, 3914, 3936, 3958, 3980, 3996, 4012, 4029, + 4047, 4075, 4100, 4125, 4150, 4176, 4200, 4226, + 4242, 4265, 4289, 4314, 4339, 4365, 4389, 4416, +}; + +//***************************************************************************** +// +// The font definition for the 16 point Oldstandard bold font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard16b = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 16, + + // + // The height of the font. + // + 21, + + // + // The baseline of the font. + // + 16, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard16b, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard16bData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard16i.c b/third_party/fonts/ofl/fonts/fontoldstandard16i.c new file mode 100644 index 0000000..151177d --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard16i.c @@ -0,0 +1,579 @@ +//***************************************************************************** +// +// fontoldstandard16i.c - Font definition for the 16pt Oldstandard italic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 16 point +// Bold: no +// Italic: yes +// Memory usage: 4520 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 16 point Oldstandard italic font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard16iData[4317] = +{ + 5, 6, 0, 14, 32, 15, 5, 240, 114, 50, 50, 49, + 65, 65, 49, 65, 130, 50, 240, 128, 11, 5, 240, 81, + 33, 17, 17, 65, 0, 7, 96, 25, 11, 0, 6, 17, + 33, 97, 33, 113, 33, 73, 65, 33, 97, 49, 97, 33, + 88, 65, 33, 113, 33, 0, 7, 80, 32, 9, 240, 240, + 49, 84, 65, 18, 17, 33, 34, 17, 50, 19, 51, 115, + 81, 19, 35, 17, 17, 33, 18, 33, 33, 18, 17, 68, + 81, 240, 240, 64, 37, 12, 0, 6, 34, 81, 49, 33, + 49, 49, 52, 65, 49, 33, 65, 33, 33, 98, 33, 34, + 97, 33, 33, 65, 33, 49, 49, 49, 33, 65, 49, 33, + 49, 67, 0, 6, 48, 32, 12, 0, 6, 99, 129, 33, + 129, 33, 129, 17, 131, 34, 50, 17, 33, 17, 33, 49, + 17, 66, 50, 81, 65, 49, 33, 65, 33, 71, 0, 6, + 64, 6, 2, 129, 17, 240, 192, 19, 7, 240, 240, 49, + 81, 81, 81, 81, 97, 97, 81, 97, 97, 97, 97, 113, + 240, 64, 19, 7, 240, 240, 33, 97, 113, 97, 97, 97, + 97, 81, 97, 81, 97, 81, 81, 81, 208, 18, 6, 240, + 177, 49, 17, 17, 17, 17, 17, 35, 33, 17, 17, 49, + 0, 7, 16, 20, 14, 0, 7, 97, 209, 209, 209, 209, + 209, 125, 113, 209, 209, 209, 209, 209, 240, 240, 80, 10, + 4, 0, 6, 81, 50, 49, 33, 33, 112, 9, 6, 0, + 8, 1, 20, 240, 240, 224, 7, 3, 240, 240, 146, 18, + 208, 18, 6, 240, 240, 65, 81, 65, 81, 81, 65, 81, + 81, 65, 81, 81, 65, 81, 176, 27, 9, 240, 240, 163, + 66, 33, 50, 65, 34, 65, 33, 66, 18, 66, 18, 66, + 18, 50, 33, 66, 49, 34, 68, 240, 240, 160, 16, 5, + 240, 129, 50, 20, 49, 65, 50, 49, 65, 50, 50, 50, + 240, 128, 25, 10, 240, 240, 228, 81, 50, 49, 81, 66, + 34, 129, 129, 114, 98, 49, 50, 49, 49, 36, 65, 34, + 240, 240, 224, 23, 9, 240, 240, 148, 65, 65, 50, 34, + 113, 68, 129, 130, 49, 50, 34, 49, 49, 50, 68, 240, + 240, 160, 21, 9, 240, 240, 194, 113, 113, 113, 113, 17, + 81, 18, 65, 34, 56, 66, 114, 114, 240, 240, 160, 23, + 9, 240, 240, 145, 49, 68, 65, 129, 132, 65, 65, 129, + 49, 50, 34, 50, 33, 50, 68, 240, 240, 160, 26, 9, + 240, 240, 163, 81, 49, 49, 50, 34, 113, 34, 67, 33, + 34, 65, 34, 65, 49, 50, 49, 49, 83, 240, 240, 160, + 20, 8, 240, 240, 52, 17, 33, 35, 97, 113, 97, 97, + 97, 98, 97, 98, 98, 240, 240, 128, 26, 9, 240, 240, + 148, 65, 65, 49, 65, 49, 65, 50, 33, 68, 65, 34, + 49, 66, 33, 81, 33, 65, 68, 240, 240, 160, 26, 9, + 240, 240, 148, 65, 49, 50, 50, 34, 50, 33, 66, 34, + 34, 67, 17, 114, 49, 49, 50, 33, 83, 240, 240, 176, + 10, 4, 240, 240, 65, 49, 210, 34, 240, 48, 13, 5, + 240, 240, 209, 65, 240, 34, 50, 65, 49, 49, 144, 18, + 12, 0, 8, 82, 145, 146, 130, 130, 130, 161, 194, 194, + 194, 194, 194, 240, 160, 10, 14, 0, 15, 109, 240, 237, + 0, 10, 80, 19, 12, 0, 7, 66, 194, 193, 194, 194, + 194, 177, 146, 130, 130, 130, 130, 240, 240, 64, 20, 7, + 240, 243, 34, 49, 18, 49, 82, 66, 50, 65, 97, 17, + 82, 66, 82, 240, 240, 48, 37, 13, 0, 7, 5, 98, + 82, 49, 69, 49, 34, 33, 33, 17, 49, 49, 33, 17, + 33, 50, 33, 17, 33, 49, 49, 33, 17, 34, 33, 49, + 34, 34, 81, 211, 18, 0, 7, 26, 11, 0, 6, 65, + 146, 129, 17, 129, 17, 113, 33, 97, 49, 101, 81, 65, + 65, 81, 65, 81, 35, 67, 240, 240, 240, 26, 11, 0, + 5, 118, 82, 65, 65, 81, 65, 81, 50, 65, 70, 81, + 66, 50, 81, 50, 81, 49, 82, 34, 50, 0, 6, 24, + 11, 0, 6, 19, 98, 50, 49, 97, 34, 81, 50, 145, + 146, 146, 97, 49, 81, 65, 65, 100, 0, 6, 16, 28, + 12, 0, 6, 54, 98, 65, 81, 81, 81, 82, 50, 82, + 50, 81, 65, 97, 50, 82, 50, 81, 65, 81, 66, 50, + 0, 6, 80, 26, 12, 0, 6, 56, 66, 65, 81, 81, + 81, 49, 98, 33, 117, 113, 49, 98, 162, 81, 65, 97, + 50, 66, 0, 6, 64, 23, 12, 0, 6, 56, 66, 65, + 81, 81, 81, 49, 98, 33, 117, 113, 49, 98, 162, 161, + 162, 0, 7, 32, 26, 12, 0, 6, 83, 114, 50, 65, + 97, 50, 97, 50, 161, 69, 18, 82, 50, 82, 65, 82, + 65, 66, 100, 0, 6, 96, 27, 13, 0, 6, 115, 51, + 66, 81, 81, 82, 81, 81, 82, 81, 88, 81, 82, 66, + 81, 82, 81, 81, 82, 66, 82, 0, 7, 18, 7, 240, + 240, 19, 66, 81, 97, 82, 82, 81, 82, 82, 81, 82, + 240, 240, 48, 21, 10, 0, 5, 99, 129, 130, 130, 129, + 145, 130, 65, 49, 67, 33, 65, 50, 83, 0, 5, 96, + 27, 13, 0, 6, 115, 36, 66, 65, 97, 65, 113, 34, + 114, 17, 149, 129, 34, 114, 49, 114, 50, 97, 66, 82, + 67, 0, 7, 21, 10, 240, 240, 211, 114, 129, 145, 130, + 130, 129, 130, 130, 81, 33, 97, 18, 66, 240, 240, 192, + 43, 15, 0, 7, 115, 83, 65, 17, 52, 81, 17, 49, + 17, 81, 33, 33, 18, 81, 33, 33, 18, 81, 33, 17, + 33, 97, 33, 17, 33, 81, 50, 34, 81, 49, 50, 81, + 49, 49, 83, 82, 0, 8, 16, 33, 13, 0, 6, 114, + 67, 66, 81, 83, 65, 65, 33, 49, 81, 33, 49, 81, + 34, 33, 81, 49, 17, 81, 67, 81, 82, 81, 82, 67, + 65, 0, 7, 16, 27, 11, 0, 6, 4, 97, 65, 65, + 82, 34, 82, 34, 82, 33, 98, 18, 98, 18, 97, 49, + 81, 65, 65, 100, 0, 6, 16, 22, 11, 0, 5, 118, + 82, 50, 65, 66, 65, 66, 50, 65, 70, 81, 146, 146, + 145, 146, 0, 6, 80, 31, 11, 0, 6, 4, 97, 65, + 65, 82, 34, 82, 34, 82, 33, 98, 18, 98, 18, 97, + 49, 18, 33, 66, 17, 17, 100, 146, 146, 17, 145, 240, + 28, 11, 0, 5, 118, 82, 50, 65, 66, 65, 65, 66, + 49, 85, 97, 65, 66, 65, 66, 50, 65, 66, 17, 18, + 82, 0, 5, 96, 24, 10, 240, 240, 212, 17, 49, 66, + 49, 65, 65, 147, 131, 147, 33, 97, 33, 97, 34, 65, + 84, 240, 240, 224, 22, 11, 240, 240, 249, 33, 34, 49, + 17, 50, 33, 97, 146, 146, 145, 161, 146, 146, 131, 0, + 6, 48, 28, 12, 0, 6, 19, 67, 49, 97, 65, 97, + 50, 81, 65, 97, 65, 97, 50, 81, 66, 81, 65, 97, + 66, 65, 101, 0, 6, 96, 26, 11, 240, 240, 227, 67, + 33, 81, 65, 65, 81, 65, 81, 49, 97, 33, 113, 33, + 113, 17, 130, 145, 161, 0, 6, 80, 40, 16, 0, 8, + 3, 51, 51, 33, 81, 65, 65, 66, 65, 65, 49, 17, + 49, 81, 49, 17, 49, 81, 33, 33, 33, 97, 17, 49, + 17, 113, 17, 50, 130, 66, 129, 81, 145, 0, 9, 96, + 26, 13, 0, 6, 100, 51, 81, 65, 114, 33, 145, 17, + 163, 177, 179, 145, 33, 129, 50, 97, 66, 68, 51, 0, + 6, 112, 23, 10, 240, 240, 163, 51, 33, 81, 50, 49, + 66, 33, 97, 17, 114, 129, 145, 130, 130, 115, 0, 5, + 112, 23, 11, 0, 5, 104, 49, 66, 49, 66, 130, 145, + 146, 130, 130, 130, 81, 49, 81, 50, 51, 0, 5, 112, + 19, 8, 240, 240, 99, 81, 113, 97, 113, 113, 98, 97, + 113, 113, 97, 113, 113, 100, 192, 17, 6, 240, 145, 81, + 97, 81, 81, 97, 81, 81, 97, 81, 81, 97, 81, 208, + 19, 8, 240, 240, 99, 97, 113, 113, 98, 97, 113, 113, + 97, 113, 113, 98, 97, 83, 208, 15, 7, 240, 240, 114, + 65, 17, 65, 33, 33, 65, 17, 0, 8, 80, 6, 10, + 0, 21, 41, 176, 7, 3, 242, 33, 240, 240, 112, 22, + 8, 0, 8, 36, 49, 34, 34, 34, 33, 49, 49, 49, + 49, 34, 17, 17, 17, 18, 240, 240, 64, 24, 7, 240, + 241, 97, 97, 82, 81, 19, 34, 33, 33, 49, 18, 49, + 17, 49, 33, 49, 49, 17, 240, 240, 16, 15, 6, 0, + 6, 35, 33, 33, 18, 65, 81, 81, 33, 50, 240, 192, + 27, 8, 240, 240, 129, 113, 113, 98, 50, 17, 49, 34, + 34, 34, 33, 49, 49, 49, 49, 34, 17, 17, 17, 18, + 240, 240, 64, 16, 6, 0, 6, 35, 33, 33, 18, 17, + 35, 49, 81, 33, 50, 240, 192, 21, 9, 240, 240, 179, + 81, 33, 81, 114, 113, 129, 129, 113, 129, 129, 129, 113, + 129, 129, 114, 112, 26, 8, 0, 8, 52, 49, 34, 34, + 34, 33, 49, 49, 49, 49, 34, 49, 19, 65, 17, 49, + 49, 49, 33, 65, 17, 80, 27, 8, 240, 240, 65, 113, + 113, 98, 97, 34, 51, 17, 49, 34, 34, 33, 49, 49, + 17, 17, 33, 17, 33, 49, 240, 240, 80, 17, 6, 240, + 194, 81, 242, 49, 17, 33, 33, 65, 81, 17, 50, 66, + 240, 176, 21, 8, 240, 240, 129, 113, 240, 98, 81, 17, + 113, 113, 113, 97, 113, 113, 113, 50, 17, 82, 80, 24, + 7, 240, 241, 97, 97, 82, 81, 34, 33, 17, 17, 33, + 17, 51, 65, 33, 49, 33, 17, 17, 34, 240, 240, 17, + 4, 240, 49, 49, 49, 34, 33, 49, 49, 33, 49, 49, + 17, 18, 240, 48, 31, 13, 0, 13, 34, 18, 34, 49, + 18, 34, 33, 17, 33, 34, 33, 66, 34, 33, 65, 49, + 34, 65, 34, 33, 17, 34, 33, 50, 0, 6, 96, 25, + 10, 0, 10, 34, 34, 49, 19, 17, 33, 33, 34, 66, + 33, 81, 49, 17, 49, 33, 17, 50, 34, 240, 240, 208, + 20, 7, 0, 7, 35, 49, 49, 18, 49, 17, 50, 17, + 49, 33, 49, 49, 17, 240, 240, 16, 25, 9, 0, 9, + 34, 18, 49, 18, 33, 65, 49, 50, 49, 49, 49, 65, + 49, 66, 17, 65, 33, 81, 129, 114, 112, 23, 7, 0, + 7, 35, 49, 34, 18, 34, 17, 49, 33, 49, 33, 34, + 33, 19, 49, 17, 97, 97, 82, 48, 18, 8, 0, 8, + 34, 18, 33, 18, 17, 17, 33, 98, 97, 113, 98, 240, + 240, 112, 19, 7, 0, 7, 51, 49, 33, 49, 33, 66, + 49, 33, 33, 49, 49, 17, 240, 240, 16, 17, 4, 240, + 49, 49, 49, 33, 50, 33, 49, 33, 49, 49, 17, 18, + 240, 48, 26, 10, 0, 10, 34, 49, 49, 17, 34, 33, + 33, 33, 81, 34, 81, 17, 17, 17, 49, 18, 17, 66, + 33, 240, 240, 208, 22, 8, 0, 8, 34, 18, 33, 17, + 33, 17, 33, 33, 49, 49, 49, 33, 65, 33, 67, 240, + 240, 80, 29, 12, 0, 12, 34, 49, 18, 33, 17, 49, + 33, 17, 33, 33, 49, 49, 49, 49, 49, 34, 33, 65, + 33, 49, 67, 19, 0, 6, 48, 22, 10, 0, 10, 35, + 19, 33, 34, 18, 81, 145, 145, 82, 18, 33, 33, 17, + 17, 17, 240, 240, 208, 26, 9, 0, 9, 34, 49, 33, + 17, 49, 65, 33, 65, 49, 65, 34, 65, 34, 68, 129, + 65, 49, 50, 33, 81, 17, 80, 17, 8, 0, 8, 35, + 17, 82, 113, 82, 66, 97, 49, 33, 19, 240, 240, 80, + 18, 6, 240, 194, 49, 81, 81, 81, 81, 50, 81, 81, + 66, 65, 81, 81, 97, 160, 17, 2, 129, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 48, 18, + 6, 240, 209, 81, 65, 81, 65, 81, 97, 65, 65, 81, + 81, 81, 65, 240, 32, 13, 10, 0, 11, 36, 65, 17, + 35, 33, 17, 67, 0, 9, 5, 6, 0, 14, 32, 15, + 5, 240, 240, 194, 50, 129, 65, 65, 49, 65, 50, 50, + 50, 48, 24, 7, 0, 5, 97, 81, 83, 49, 17, 17, + 33, 17, 51, 65, 17, 65, 17, 17, 49, 17, 66, 81, + 240, 64, 26, 13, 0, 7, 68, 129, 49, 129, 34, 114, + 177, 148, 196, 129, 81, 51, 97, 18, 35, 49, 33, 18, + 36, 0, 6, 112, 23, 9, 0, 6, 97, 35, 17, 34, + 49, 33, 81, 33, 97, 17, 81, 49, 65, 33, 20, 17, + 0, 6, 112, 23, 11, 240, 240, 229, 20, 50, 49, 82, + 33, 113, 33, 113, 17, 130, 118, 70, 114, 146, 131, 0, + 6, 48, 15, 2, 129, 17, 17, 17, 17, 17, 81, 17, + 17, 17, 17, 17, 48, 29, 8, 240, 240, 99, 50, 33, + 49, 49, 50, 81, 18, 65, 49, 49, 65, 34, 49, 50, + 17, 82, 50, 33, 49, 49, 49, 49, 67, 192, 9, 6, + 240, 240, 98, 18, 0, 9, 16, 38, 13, 0, 7, 4, + 114, 18, 18, 65, 33, 33, 33, 33, 33, 49, 33, 33, + 33, 113, 17, 33, 113, 17, 33, 65, 33, 17, 49, 33, + 33, 49, 50, 49, 65, 97, 102, 0, 7, 14, 6, 240, + 179, 33, 33, 33, 17, 49, 17, 36, 0, 7, 96, 18, + 6, 0, 6, 49, 65, 17, 33, 17, 33, 17, 65, 17, + 49, 17, 240, 240, 32, 10, 9, 0, 9, 8, 129, 129, + 0, 9, 16, 9, 6, 0, 8, 1, 20, 240, 240, 224, + 39, 13, 0, 7, 4, 117, 18, 65, 33, 33, 33, 33, + 49, 34, 17, 33, 49, 33, 49, 17, 51, 65, 17, 49, + 33, 49, 17, 49, 33, 18, 49, 19, 33, 17, 65, 97, + 102, 0, 7, 8, 6, 240, 240, 101, 0, 9, 16, 16, + 6, 240, 178, 49, 33, 17, 49, 17, 33, 33, 33, 50, + 0, 7, 16, 18, 15, 0, 10, 17, 225, 225, 225, 142, + 113, 225, 225, 225, 240, 141, 0, 5, 112, 17, 7, 240, + 240, 19, 34, 33, 49, 33, 81, 66, 65, 81, 19, 0, + 7, 32, 16, 7, 240, 243, 65, 33, 97, 51, 49, 33, + 33, 49, 51, 0, 7, 48, 8, 4, 240, 98, 18, 0, + 6, 32, 25, 10, 0, 10, 34, 34, 65, 49, 81, 49, + 81, 49, 66, 33, 33, 34, 33, 17, 33, 21, 49, 145, + 146, 145, 128, 32, 9, 240, 240, 134, 35, 33, 51, 17, + 67, 17, 67, 17, 81, 17, 97, 17, 97, 17, 81, 33, + 81, 17, 97, 17, 97, 17, 81, 17, 97, 240, 32, 7, + 3, 240, 194, 18, 240, 160, 9, 4, 0, 8, 17, 33, + 17, 18, 32, 13, 5, 240, 129, 50, 49, 65, 65, 65, + 35, 240, 240, 192, 14, 6, 240, 179, 33, 33, 33, 33, + 33, 17, 36, 0, 7, 96, 17, 6, 0, 6, 113, 17, + 49, 33, 49, 17, 33, 17, 33, 17, 65, 240, 208, 33, + 12, 0, 6, 49, 162, 65, 81, 65, 97, 49, 113, 49, + 49, 49, 33, 65, 19, 33, 50, 81, 50, 81, 49, 17, + 81, 37, 49, 81, 193, 240, 240, 128, 34, 12, 0, 6, + 49, 147, 65, 81, 65, 97, 49, 113, 49, 33, 65, 33, + 18, 17, 19, 33, 18, 17, 81, 81, 65, 66, 81, 34, + 33, 49, 52, 0, 6, 32, 36, 13, 0, 6, 99, 161, + 33, 49, 129, 33, 99, 33, 97, 33, 33, 49, 17, 49, + 17, 49, 51, 33, 49, 113, 50, 97, 49, 17, 97, 37, + 65, 81, 209, 240, 240, 176, 20, 7, 0, 7, 66, 82, + 66, 65, 33, 81, 82, 50, 66, 81, 50, 17, 49, 49, + 17, 48, 28, 11, 240, 49, 177, 240, 97, 146, 129, 17, + 129, 17, 113, 33, 97, 49, 101, 81, 65, 65, 81, 65, + 81, 35, 67, 240, 240, 240, 28, 13, 240, 130, 161, 240, + 145, 178, 161, 17, 161, 17, 145, 33, 129, 49, 133, 113, + 65, 97, 81, 97, 81, 67, 67, 0, 6, 112, 29, 12, + 240, 97, 146, 17, 240, 97, 162, 145, 17, 145, 17, 129, + 33, 113, 49, 117, 97, 65, 81, 81, 81, 81, 51, 67, + 0, 6, 32, 29, 13, 240, 82, 33, 162, 240, 129, 178, + 161, 17, 161, 17, 145, 33, 129, 49, 133, 113, 65, 97, + 81, 97, 81, 67, 67, 0, 6, 112, 29, 13, 240, 81, + 34, 129, 240, 177, 178, 161, 17, 161, 17, 145, 33, 129, + 49, 133, 113, 65, 97, 81, 97, 81, 67, 67, 0, 6, + 112, 30, 11, 130, 129, 17, 129, 17, 146, 145, 146, 129, + 17, 129, 17, 113, 33, 97, 49, 101, 81, 65, 65, 81, + 65, 81, 35, 67, 240, 240, 240, 35, 18, 0, 10, 24, + 162, 81, 131, 81, 129, 33, 49, 161, 18, 33, 161, 37, + 149, 49, 33, 81, 50, 81, 81, 66, 81, 81, 66, 81, + 51, 51, 50, 0, 9, 64, 28, 11, 0, 6, 19, 98, + 50, 49, 97, 34, 81, 50, 145, 146, 146, 97, 49, 81, + 65, 81, 85, 113, 161, 129, 33, 113, 17, 112, 28, 12, + 240, 33, 193, 240, 88, 66, 65, 81, 81, 81, 49, 98, + 33, 117, 113, 49, 98, 162, 81, 65, 97, 50, 66, 0, + 6, 64, 28, 12, 240, 81, 161, 240, 72, 66, 65, 81, + 81, 81, 49, 98, 33, 117, 113, 49, 98, 162, 81, 65, + 97, 50, 66, 0, 6, 64, 29, 12, 240, 65, 146, 17, + 240, 56, 66, 65, 81, 81, 81, 49, 98, 33, 117, 113, + 49, 98, 162, 81, 65, 97, 50, 66, 0, 6, 64, 30, + 12, 240, 33, 34, 113, 33, 240, 56, 66, 65, 81, 81, + 81, 49, 98, 33, 117, 113, 49, 98, 162, 81, 65, 97, + 50, 66, 0, 6, 64, 18, 7, 161, 113, 195, 66, 81, + 97, 82, 82, 81, 82, 82, 81, 82, 240, 240, 48, 18, + 8, 225, 97, 211, 82, 97, 113, 98, 98, 97, 98, 98, + 97, 98, 240, 240, 128, 18, 7, 178, 65, 211, 66, 81, + 97, 82, 82, 81, 82, 82, 81, 82, 240, 240, 48, 20, + 8, 177, 33, 65, 33, 195, 82, 97, 113, 98, 98, 97, + 98, 98, 97, 98, 240, 240, 128, 28, 12, 0, 6, 54, + 98, 65, 81, 81, 81, 82, 50, 82, 22, 49, 65, 97, + 50, 82, 50, 81, 65, 81, 66, 50, 0, 6, 80, 35, + 13, 240, 68, 240, 240, 34, 67, 66, 81, 83, 65, 65, + 33, 49, 81, 33, 49, 81, 34, 33, 81, 49, 17, 81, + 67, 81, 82, 81, 82, 67, 65, 0, 7, 16, 29, 11, + 240, 18, 161, 240, 68, 97, 65, 65, 82, 34, 82, 34, + 82, 33, 98, 18, 98, 18, 97, 49, 81, 65, 65, 100, + 0, 6, 16, 29, 11, 240, 65, 145, 240, 52, 97, 65, + 65, 82, 34, 82, 34, 82, 33, 98, 18, 98, 18, 97, + 49, 81, 65, 65, 100, 0, 6, 16, 30, 11, 113, 146, + 129, 33, 240, 36, 97, 65, 65, 82, 34, 82, 34, 82, + 33, 98, 18, 98, 18, 97, 49, 81, 65, 65, 100, 0, + 6, 16, 28, 11, 240, 21, 240, 196, 97, 65, 65, 82, + 34, 82, 34, 82, 33, 98, 18, 98, 18, 97, 49, 81, + 65, 65, 100, 0, 6, 16, 30, 11, 240, 17, 34, 97, + 240, 84, 97, 65, 65, 82, 34, 82, 34, 82, 33, 98, + 18, 98, 18, 97, 49, 81, 65, 65, 100, 0, 6, 16, + 23, 11, 0, 8, 33, 129, 33, 97, 65, 65, 97, 33, + 130, 146, 129, 33, 82, 65, 49, 113, 0, 5, 96, 32, + 12, 0, 6, 68, 33, 65, 66, 65, 82, 50, 52, 50, + 33, 34, 49, 33, 50, 34, 17, 66, 35, 66, 66, 65, + 81, 65, 81, 20, 0, 6, 96, 30, 12, 240, 33, 193, + 240, 51, 67, 49, 97, 65, 97, 50, 81, 65, 97, 65, + 97, 50, 81, 66, 81, 65, 97, 66, 65, 101, 0, 6, + 96, 30, 12, 240, 81, 161, 240, 35, 67, 49, 97, 65, + 97, 50, 81, 65, 97, 65, 97, 50, 81, 66, 81, 65, + 97, 66, 65, 101, 0, 6, 96, 31, 12, 113, 162, 145, + 33, 240, 19, 67, 49, 97, 65, 97, 50, 81, 65, 97, + 65, 97, 50, 81, 66, 81, 65, 97, 66, 65, 101, 0, + 6, 96, 31, 12, 240, 33, 34, 113, 240, 67, 67, 49, + 97, 65, 97, 50, 81, 65, 97, 65, 97, 50, 81, 66, + 81, 65, 97, 66, 65, 101, 0, 6, 96, 24, 10, 240, + 18, 113, 227, 51, 33, 81, 50, 49, 66, 33, 97, 17, + 114, 129, 145, 130, 130, 115, 0, 5, 112, 21, 10, 240, + 240, 211, 114, 133, 81, 65, 50, 65, 49, 81, 49, 66, + 38, 66, 129, 130, 0, 6, 31, 9, 240, 240, 164, 65, + 49, 65, 49, 50, 33, 65, 33, 81, 49, 65, 49, 49, + 65, 49, 65, 51, 17, 51, 17, 65, 33, 81, 129, 240, + 32, 24, 8, 240, 240, 209, 240, 116, 49, 34, 34, 34, + 33, 49, 49, 49, 49, 34, 17, 17, 17, 18, 240, 240, + 64, 24, 8, 240, 240, 242, 81, 212, 49, 34, 34, 34, + 33, 49, 49, 49, 49, 34, 17, 17, 17, 18, 240, 240, + 64, 25, 8, 240, 240, 225, 82, 17, 196, 49, 34, 34, + 34, 33, 49, 49, 49, 49, 34, 17, 17, 17, 18, 240, + 240, 64, 24, 8, 240, 240, 212, 240, 68, 49, 34, 34, + 34, 33, 49, 49, 49, 49, 34, 17, 17, 17, 18, 240, + 240, 64, 25, 8, 240, 240, 194, 18, 240, 68, 49, 34, + 34, 34, 33, 49, 49, 49, 49, 34, 17, 17, 17, 18, + 240, 240, 64, 26, 8, 240, 240, 83, 65, 33, 82, 212, + 49, 34, 34, 34, 33, 49, 49, 49, 49, 34, 17, 17, + 17, 18, 240, 240, 64, 26, 10, 0, 10, 36, 18, 33, + 35, 17, 18, 34, 33, 17, 52, 33, 49, 81, 34, 49, + 17, 17, 33, 17, 240, 240, 192, 18, 6, 0, 6, 35, + 33, 33, 18, 65, 81, 81, 33, 50, 65, 65, 17, 50, + 160, 18, 6, 240, 240, 49, 240, 19, 33, 33, 18, 17, + 35, 49, 81, 33, 50, 240, 192, 19, 7, 240, 240, 161, + 81, 179, 49, 33, 34, 17, 51, 65, 97, 33, 66, 240, + 240, 32, 21, 7, 240, 240, 33, 97, 66, 17, 163, 49, + 33, 34, 17, 51, 65, 97, 33, 66, 240, 240, 32, 20, + 8, 240, 240, 194, 18, 240, 67, 65, 33, 50, 17, 67, + 81, 113, 33, 82, 240, 240, 112, 18, 6, 240, 240, 33, + 97, 162, 49, 17, 33, 33, 65, 81, 17, 50, 66, 240, + 176, 19, 7, 240, 240, 161, 81, 178, 65, 17, 49, 33, + 81, 97, 17, 66, 82, 240, 240, 16, 18, 6, 240, 209, + 66, 49, 178, 49, 17, 33, 33, 65, 81, 17, 50, 66, + 240, 176, 21, 7, 240, 240, 113, 33, 49, 33, 162, 65, + 17, 49, 33, 81, 97, 17, 66, 82, 240, 240, 16, 26, + 8, 240, 240, 97, 113, 17, 65, 17, 113, 68, 49, 49, + 34, 49, 33, 50, 33, 49, 49, 49, 65, 17, 240, 240, + 96, 27, 10, 0, 6, 100, 240, 146, 34, 49, 19, 17, + 33, 33, 34, 66, 33, 81, 49, 17, 49, 33, 17, 50, + 34, 240, 240, 208, 22, 7, 240, 240, 129, 240, 67, 49, + 49, 18, 49, 17, 50, 17, 49, 33, 49, 49, 17, 240, + 240, 16, 22, 7, 240, 240, 161, 81, 179, 49, 49, 18, + 49, 17, 50, 17, 49, 33, 49, 49, 17, 240, 240, 16, + 24, 7, 240, 240, 33, 97, 66, 17, 163, 49, 49, 18, + 49, 17, 50, 17, 49, 33, 49, 49, 17, 240, 240, 16, + 22, 8, 240, 240, 197, 240, 67, 65, 49, 34, 49, 33, + 50, 33, 49, 49, 49, 65, 17, 240, 240, 96, 23, 8, + 240, 240, 194, 18, 240, 67, 65, 49, 34, 49, 33, 50, + 33, 49, 49, 49, 65, 17, 240, 240, 96, 15, 14, 0, + 11, 33, 210, 0, 6, 13, 240, 240, 81, 210, 0, 6, + 22, 8, 0, 8, 51, 65, 49, 34, 19, 33, 17, 18, + 34, 33, 49, 49, 33, 17, 17, 240, 240, 80, 29, 10, + 0, 6, 97, 161, 240, 18, 49, 49, 17, 34, 33, 33, + 33, 81, 34, 81, 17, 17, 17, 49, 18, 17, 66, 33, + 240, 240, 208, 28, 10, 0, 7, 17, 129, 242, 49, 49, + 17, 34, 33, 33, 33, 81, 34, 81, 17, 17, 17, 49, + 18, 17, 66, 33, 240, 240, 208, 30, 10, 0, 5, 97, + 130, 113, 240, 34, 49, 49, 17, 34, 33, 33, 33, 81, + 34, 81, 17, 17, 17, 49, 18, 17, 66, 33, 240, 240, + 208, 30, 10, 0, 6, 97, 33, 97, 33, 226, 49, 49, + 17, 34, 33, 33, 33, 81, 34, 81, 17, 17, 17, 49, + 18, 17, 66, 33, 240, 240, 208, 28, 9, 0, 6, 65, + 113, 210, 49, 33, 17, 49, 65, 33, 65, 49, 65, 34, + 65, 34, 68, 129, 65, 49, 50, 33, 81, 17, 80, 28, + 9, 240, 240, 161, 129, 129, 114, 113, 18, 82, 33, 65, + 49, 50, 49, 49, 49, 65, 49, 66, 17, 65, 33, 81, + 129, 114, 112, 30, 9, 0, 6, 17, 33, 81, 33, 194, + 49, 33, 17, 49, 65, 33, 65, 49, 65, 34, 65, 34, + 68, 129, 65, 49, 50, 33, 81, 17, 80, +}; + +//***************************************************************************** +// +// The glyph offset table for the 16 point Oldstandard italic font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard16i[] = +{ + 0, 5, 20, 31, 56, 88, 125, 157, + 163, 182, 201, 219, 239, 249, 258, 265, + 283, 310, 326, 351, 374, 395, 418, 444, + 464, 490, 516, 526, 539, 557, 567, 586, + 606, 643, 669, 695, 719, 747, 773, 796, + 822, 849, 867, 888, 915, 936, 979, 1012, + 1039, 1061, 1092, 1120, 1144, 1166, 1194, 1220, + 1260, 1286, 1309, 1332, 1351, 1368, 1387, 1402, + 1408, 1415, 1437, 1461, 1476, 1503, 1519, 1540, + 1566, 1593, 1610, 1631, 1655, 1672, 1703, 1728, + 1748, 1773, 1796, 1814, 1833, 1850, 1876, 1898, + 1927, 1949, 1975, 1992, 2010, 2027, 2045, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2058, 2063, 2078, 2102, 2128, 2151, 2174, 2189, + 2218, 2227, 2265, 2279, 2297, 2307, 2316, 2355, + 2363, 2379, 2397, 2414, 2430, 2438, 2463, 2495, + 2502, 2511, 2524, 2538, 2555, 2588, 2622, 2658, + 2678, 2706, 2734, 2763, 2792, 2821, 2851, 2886, + 2914, 2942, 2970, 2999, 3029, 3047, 3065, 3083, + 3103, 3131, 3166, 3195, 3224, 3254, 3282, 3312, + 3335, 3367, 3397, 3427, 3458, 3489, 3513, 3534, + 3565, 3589, 3613, 3638, 3662, 3687, 3713, 3739, + 3757, 3775, 3794, 3815, 3835, 3853, 3872, 3890, + 3911, 3937, 3964, 3986, 4008, 4032, 4054, 4077, + 4092, 4114, 4143, 4171, 4201, 4231, 4259, 4287, +}; + +//***************************************************************************** +// +// The font definition for the 16 point Oldstandard italic font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard16i = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 16, + + // + // The height of the font. + // + 19, + + // + // The baseline of the font. + // + 15, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard16i, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard16iData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard18.c b/third_party/fonts/ofl/fonts/fontoldstandard18.c new file mode 100644 index 0000000..78086db --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard18.c @@ -0,0 +1,637 @@ +//***************************************************************************** +// +// fontoldstandard18.c - Font definition for the 18pt Oldstandard font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 18 point +// Bold: no +// Italic: no +// Memory usage: 5216 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 18 point Oldstandard font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard18Data[5015] = +{ + 5, 7, 0, 21, 112, 16, 3, 240, 50, 18, 18, 18, + 18, 18, 17, 33, 33, 130, 18, 240, 64, 14, 5, 240, + 161, 33, 17, 33, 17, 33, 17, 33, 0, 10, 16, 30, + 11, 0, 8, 97, 33, 113, 33, 97, 49, 58, 65, 49, + 97, 33, 113, 33, 113, 33, 74, 49, 49, 97, 49, 97, + 49, 97, 0, 9, 32, 39, 9, 240, 240, 146, 114, 100, + 65, 18, 17, 33, 34, 33, 17, 34, 18, 18, 18, 17, + 52, 115, 100, 49, 18, 33, 18, 18, 33, 17, 34, 33, + 17, 34, 17, 53, 98, 0, 6, 16, 42, 13, 0, 9, + 115, 81, 49, 49, 49, 65, 49, 49, 65, 49, 33, 81, + 49, 33, 99, 33, 177, 49, 129, 18, 17, 97, 33, 49, + 81, 33, 49, 65, 49, 49, 49, 65, 49, 49, 81, 17, + 0, 10, 34, 13, 0, 10, 19, 145, 49, 129, 49, 129, + 34, 132, 162, 52, 49, 17, 66, 50, 18, 49, 50, 50, + 17, 66, 65, 17, 66, 66, 82, 67, 85, 35, 0, 10, + 9, 2, 161, 17, 17, 17, 240, 240, 48, 22, 5, 240, + 209, 49, 65, 49, 65, 49, 65, 65, 65, 65, 65, 65, + 65, 81, 65, 81, 65, 81, 176, 22, 5, 240, 161, 81, + 65, 81, 65, 81, 65, 65, 65, 65, 65, 65, 49, 65, + 65, 49, 50, 49, 224, 21, 8, 0, 6, 50, 49, 34, + 17, 18, 17, 18, 51, 69, 33, 33, 33, 66, 98, 0, + 11, 48, 22, 16, 0, 12, 113, 241, 241, 241, 241, 241, + 241, 241, 143, 129, 241, 241, 241, 241, 241, 241, 0, 7, + 11, 4, 0, 8, 3, 19, 49, 49, 33, 33, 240, 8, + 6, 0, 10, 69, 0, 7, 80, 8, 3, 0, 6, 50, + 18, 240, 64, 24, 7, 240, 240, 161, 97, 81, 97, 97, + 81, 97, 97, 97, 81, 97, 97, 81, 97, 97, 81, 97, + 97, 240, 80, 30, 10, 0, 7, 115, 97, 49, 65, 81, + 34, 81, 34, 82, 18, 82, 18, 82, 18, 82, 18, 82, + 18, 82, 33, 81, 65, 49, 99, 0, 8, 20, 7, 240, + 240, 241, 97, 52, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 54, 240, 240, 208, 26, 9, 0, 7, 4, 65, 50, + 33, 82, 18, 66, 19, 50, 113, 113, 113, 113, 113, 65, + 33, 81, 24, 24, 0, 6, 112, 26, 9, 0, 6, 117, + 49, 66, 34, 50, 49, 50, 113, 68, 146, 130, 114, 18, + 66, 18, 66, 17, 66, 53, 0, 7, 16, 25, 10, 0, + 8, 33, 130, 115, 97, 18, 97, 18, 81, 34, 65, 50, + 65, 50, 57, 98, 130, 130, 102, 0, 7, 80, 28, 9, + 240, 240, 241, 81, 38, 49, 129, 129, 129, 20, 50, 50, + 33, 82, 114, 114, 18, 66, 18, 65, 33, 66, 52, 0, + 7, 32, 30, 9, 0, 7, 20, 65, 49, 49, 50, 49, + 114, 19, 51, 34, 34, 66, 18, 66, 18, 66, 18, 66, + 33, 66, 34, 34, 68, 0, 7, 16, 21, 8, 0, 6, + 7, 23, 17, 81, 97, 113, 97, 97, 113, 113, 98, 98, + 98, 98, 0, 6, 64, 30, 10, 0, 7, 100, 82, 49, + 50, 81, 34, 81, 35, 65, 52, 17, 100, 66, 36, 18, + 82, 18, 82, 18, 82, 34, 50, 69, 0, 7, 112, 30, + 9, 0, 7, 4, 66, 49, 34, 65, 34, 66, 18, 66, + 18, 66, 34, 35, 51, 18, 114, 33, 65, 49, 50, 49, + 49, 83, 0, 7, 32, 10, 3, 240, 242, 18, 240, 18, + 18, 240, 64, 14, 4, 240, 240, 163, 19, 240, 34, 35, + 49, 49, 33, 33, 240, 23, 15, 0, 12, 98, 193, 194, + 178, 178, 193, 194, 178, 225, 242, 242, 241, 242, 242, 242, + 241, 0, 5, 96, 11, 16, 0, 22, 15, 0, 6, 31, + 0, 18, 16, 23, 15, 0, 11, 34, 241, 242, 242, 242, + 241, 242, 242, 209, 194, 178, 193, 194, 178, 178, 193, 0, + 7, 48, 23, 8, 0, 6, 20, 49, 66, 18, 50, 98, + 82, 82, 81, 97, 33, 65, 33, 82, 226, 98, 0, 6, + 64, 49, 14, 0, 9, 37, 129, 82, 81, 50, 17, 17, + 49, 49, 34, 17, 33, 49, 50, 33, 17, 34, 49, 49, + 17, 33, 65, 49, 17, 33, 50, 49, 17, 33, 49, 49, + 33, 33, 34, 49, 49, 34, 35, 65, 225, 97, 118, 0, + 11, 16, 30, 13, 0, 8, 113, 193, 178, 179, 145, 18, + 145, 18, 145, 33, 129, 50, 113, 50, 118, 97, 82, 81, + 82, 81, 97, 53, 37, 0, 9, 112, 32, 11, 0, 6, + 120, 82, 65, 66, 66, 50, 66, 50, 66, 50, 50, 69, + 98, 50, 66, 66, 50, 66, 50, 66, 50, 66, 50, 65, + 40, 0, 8, 80, 30, 11, 0, 7, 36, 33, 49, 67, + 34, 82, 33, 98, 18, 113, 18, 146, 146, 146, 146, 113, + 33, 113, 34, 81, 65, 81, 85, 0, 8, 80, 33, 13, + 0, 8, 25, 98, 81, 82, 82, 66, 97, 66, 98, 50, + 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, 97, 66, + 82, 66, 81, 57, 0, 10, 32, 32, 12, 0, 7, 75, + 50, 82, 50, 97, 50, 97, 50, 97, 50, 33, 114, 33, + 117, 114, 33, 114, 97, 50, 97, 50, 97, 50, 82, 27, + 0, 9, 16, 28, 12, 0, 7, 75, 50, 82, 50, 97, + 50, 97, 50, 97, 50, 33, 114, 33, 117, 114, 33, 114, + 162, 162, 162, 134, 0, 9, 96, 34, 13, 0, 8, 68, + 33, 81, 67, 66, 82, 65, 113, 50, 113, 50, 178, 178, + 70, 18, 98, 50, 98, 65, 98, 66, 82, 81, 65, 17, + 100, 33, 0, 10, 16, 34, 14, 0, 8, 102, 22, 50, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 89, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 54, 22, + 0, 10, 80, 21, 7, 240, 240, 86, 50, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 54, 240, 240, 208, + 25, 10, 0, 6, 86, 98, 130, 130, 130, 130, 130, 130, + 130, 50, 50, 50, 50, 49, 66, 49, 65, 84, 0, 8, + 16, 34, 13, 0, 8, 22, 21, 50, 81, 82, 65, 98, + 49, 114, 33, 130, 33, 133, 131, 18, 114, 49, 114, 50, + 98, 50, 98, 66, 82, 66, 54, 21, 0, 9, 112, 24, + 11, 0, 6, 118, 114, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 81, 50, 81, 50, 81, 26, 0, 8, 48, 52, + 15, 0, 9, 52, 100, 51, 67, 83, 67, 81, 17, 49, + 18, 81, 17, 49, 18, 81, 18, 33, 18, 81, 18, 33, + 18, 81, 33, 17, 34, 81, 33, 17, 34, 81, 35, 34, + 81, 35, 34, 81, 49, 50, 81, 49, 50, 53, 17, 22, + 0, 11, 48, 42, 14, 0, 8, 100, 69, 51, 81, 83, + 81, 81, 18, 65, 81, 18, 65, 81, 34, 49, 81, 50, + 33, 81, 50, 33, 81, 66, 17, 81, 66, 17, 81, 83, + 81, 98, 81, 98, 53, 81, 0, 10, 112, 33, 11, 0, + 7, 36, 97, 65, 66, 66, 49, 97, 34, 98, 18, 98, + 18, 98, 18, 98, 18, 98, 18, 98, 33, 97, 50, 66, + 65, 65, 100, 0, 8, 96, 27, 12, 0, 7, 73, 82, + 66, 66, 82, 50, 82, 50, 82, 50, 82, 50, 66, 70, + 98, 162, 162, 162, 162, 134, 0, 9, 96, 41, 11, 0, + 7, 36, 97, 65, 66, 66, 49, 97, 34, 98, 18, 98, + 18, 98, 18, 98, 18, 98, 18, 98, 33, 34, 33, 49, + 17, 35, 66, 34, 100, 33, 113, 33, 113, 33, 115, 240, + 240, 80, 34, 13, 0, 8, 24, 114, 66, 82, 66, 82, + 66, 82, 66, 82, 50, 101, 130, 49, 114, 50, 98, 50, + 98, 50, 98, 50, 33, 50, 66, 17, 22, 35, 0, 10, + 29, 10, 0, 6, 68, 81, 66, 33, 97, 33, 97, 33, + 162, 133, 117, 131, 17, 113, 17, 113, 18, 97, 19, 65, + 33, 36, 0, 7, 112, 28, 12, 0, 7, 75, 18, 50, + 49, 17, 66, 49, 17, 66, 49, 17, 66, 162, 162, 162, + 162, 162, 162, 162, 162, 134, 0, 9, 48, 34, 14, 0, + 8, 102, 37, 50, 97, 82, 97, 82, 97, 82, 97, 82, + 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, + 97, 98, 65, 133, 0, 11, 16, 29, 14, 0, 8, 102, + 37, 50, 97, 98, 81, 98, 65, 114, 65, 130, 49, 130, + 33, 161, 33, 162, 17, 162, 17, 178, 194, 194, 0, 13, + 48, 19, 0, 11, 117, 22, 21, 50, 66, 81, 82, 66, + 81, 97, 66, 65, 113, 49, 18, 49, 114, 33, 18, 49, + 114, 33, 33, 33, 145, 33, 34, 17, 147, 50, 17, 147, + 50, 17, 147, 66, 178, 66, 177, 82, 177, 0, 15, 112, + 32, 13, 0, 8, 22, 21, 50, 66, 98, 49, 114, 33, + 146, 17, 147, 178, 178, 161, 18, 145, 18, 129, 50, 97, + 66, 97, 82, 53, 37, 0, 9, 112, 27, 13, 0, 8, + 22, 36, 66, 66, 82, 65, 114, 49, 114, 33, 146, 17, + 147, 178, 178, 178, 178, 178, 178, 150, 0, 10, 16, 29, + 11, 0, 7, 9, 34, 66, 49, 66, 49, 82, 130, 146, + 130, 131, 130, 65, 50, 81, 50, 81, 34, 82, 34, 82, + 25, 0, 8, 64, 22, 5, 240, 164, 18, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 52, 176, 23, 7, 240, 240, 81, 97, 97, 113, 97, 97, + 113, 97, 97, 113, 97, 97, 97, 113, 97, 97, 113, 97, + 240, 22, 5, 240, 164, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 20, 176, 19, + 9, 0, 7, 33, 114, 113, 17, 81, 33, 65, 65, 49, + 65, 33, 97, 0, 13, 80, 8, 10, 0, 26, 41, 240, + 240, 16, 9, 4, 240, 145, 65, 65, 0, 8, 16, 22, + 9, 0, 11, 67, 66, 34, 65, 34, 114, 69, 50, 34, + 50, 34, 17, 18, 34, 17, 38, 0, 7, 30, 8, 240, + 240, 162, 98, 98, 98, 98, 98, 18, 51, 33, 34, 50, + 18, 50, 18, 50, 18, 50, 18, 50, 18, 49, 33, 19, + 0, 6, 48, 20, 7, 0, 9, 3, 49, 49, 18, 34, + 18, 33, 34, 82, 82, 97, 49, 51, 240, 240, 224, 29, + 8, 240, 240, 242, 98, 98, 98, 98, 35, 18, 33, 35, + 18, 50, 18, 50, 18, 50, 18, 50, 18, 50, 33, 50, + 53, 0, 6, 16, 21, 8, 0, 10, 35, 65, 49, 34, + 50, 18, 50, 23, 18, 98, 65, 33, 49, 68, 0, 6, + 32, 23, 7, 240, 240, 115, 50, 18, 34, 18, 34, 82, + 68, 66, 82, 82, 82, 82, 82, 82, 82, 0, 5, 96, + 27, 10, 0, 12, 84, 19, 18, 52, 18, 50, 50, 50, + 65, 49, 99, 82, 129, 166, 65, 81, 33, 97, 33, 97, + 54, 240, 128, 30, 7, 240, 240, 82, 82, 82, 82, 82, + 82, 18, 35, 18, 18, 34, 18, 34, 18, 34, 18, 34, + 18, 34, 18, 34, 18, 34, 240, 240, 208, 16, 3, 240, + 50, 18, 114, 18, 18, 18, 18, 18, 18, 18, 18, 240, + 64, 23, 6, 240, 240, 146, 66, 240, 18, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 18, 18, 18, 18, 35, 224, + 29, 8, 240, 240, 162, 98, 98, 98, 98, 98, 35, 18, + 33, 50, 17, 66, 17, 68, 66, 18, 50, 34, 34, 49, + 34, 35, 0, 6, 16, 18, 3, 242, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 240, 64, 34, + 11, 0, 13, 98, 18, 34, 35, 19, 18, 18, 34, 34, + 18, 34, 34, 18, 34, 34, 18, 34, 34, 18, 34, 34, + 18, 34, 34, 18, 34, 34, 0, 8, 48, 25, 7, 0, + 8, 98, 18, 35, 18, 18, 34, 18, 34, 18, 34, 18, + 34, 18, 34, 18, 34, 18, 34, 240, 240, 208, 24, 8, + 0, 10, 35, 65, 49, 34, 50, 18, 50, 18, 50, 18, + 50, 18, 50, 33, 49, 65, 17, 0, 6, 48, 27, 8, + 0, 10, 2, 18, 51, 33, 34, 50, 18, 50, 18, 50, + 18, 50, 18, 50, 18, 49, 37, 50, 98, 98, 98, 240, + 112, 28, 8, 0, 10, 34, 33, 33, 33, 17, 18, 50, + 18, 50, 18, 50, 18, 50, 18, 50, 33, 50, 53, 98, + 98, 98, 98, 240, 32, 18, 6, 0, 7, 66, 18, 21, + 18, 17, 34, 66, 66, 66, 66, 66, 240, 240, 160, 22, + 7, 0, 8, 115, 49, 49, 33, 99, 84, 33, 50, 17, + 65, 18, 49, 17, 17, 17, 240, 240, 224, 22, 6, 240, + 240, 129, 81, 81, 66, 52, 50, 66, 66, 66, 66, 66, + 17, 34, 17, 50, 240, 240, 128, 25, 7, 0, 8, 98, + 34, 18, 34, 18, 34, 18, 34, 18, 34, 18, 34, 18, + 34, 18, 19, 34, 18, 240, 240, 208, 20, 9, 0, 11, + 35, 35, 33, 65, 50, 33, 81, 33, 81, 33, 83, 114, + 114, 0, 8, 48, 32, 13, 0, 16, 34, 35, 35, 18, + 50, 49, 49, 50, 33, 66, 17, 17, 33, 81, 17, 18, + 17, 81, 17, 34, 98, 50, 113, 50, 113, 0, 10, 112, + 23, 8, 0, 10, 18, 34, 34, 33, 65, 17, 83, 98, + 81, 17, 81, 18, 49, 49, 34, 50, 0, 6, 16, 26, + 9, 0, 11, 35, 35, 34, 49, 65, 33, 81, 33, 82, + 17, 98, 114, 114, 129, 113, 82, 17, 82, 17, 83, 240, + 144, 20, 7, 0, 8, 102, 17, 50, 17, 34, 81, 82, + 81, 82, 81, 49, 17, 50, 240, 240, 208, 21, 4, 240, + 113, 33, 49, 49, 50, 49, 49, 49, 18, 50, 49, 49, + 34, 33, 49, 49, 65, 208, 21, 2, 161, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 80, 21, 4, 240, 81, 65, 49, 49, 34, 33, + 49, 49, 66, 18, 33, 49, 50, 49, 49, 49, 33, 240, + 14, 11, 0, 18, 3, 81, 17, 36, 33, 17, 69, 0, + 12, 64, 5, 7, 0, 21, 112, 15, 3, 240, 242, 18, + 113, 33, 33, 34, 18, 18, 18, 18, 18, 112, 29, 7, + 0, 7, 49, 97, 83, 49, 17, 17, 18, 19, 18, 18, + 34, 17, 50, 17, 50, 17, 65, 17, 17, 51, 81, 97, + 240, 240, 16, 26, 11, 0, 9, 3, 113, 49, 82, 34, + 82, 146, 116, 148, 114, 146, 146, 98, 17, 97, 35, 49, + 19, 51, 0, 8, 64, 27, 9, 0, 9, 1, 19, 33, + 33, 50, 33, 81, 33, 97, 17, 97, 17, 97, 17, 81, + 49, 65, 33, 20, 17, 0, 9, 16, 25, 11, 0, 8, + 36, 36, 49, 65, 82, 49, 97, 33, 114, 17, 130, 103, + 114, 103, 114, 146, 146, 117, 0, 8, 96, 17, 2, 161, + 17, 17, 17, 17, 17, 17, 113, 17, 17, 17, 17, 17, + 17, 112, 33, 8, 0, 6, 35, 65, 34, 49, 34, 49, + 130, 81, 18, 49, 50, 33, 66, 17, 81, 19, 49, 35, + 17, 82, 114, 113, 50, 33, 49, 49, 67, 240, 64, 11, + 6, 240, 240, 194, 18, 18, 18, 0, 12, 16, 46, 14, + 0, 9, 37, 114, 82, 66, 50, 33, 65, 34, 33, 33, + 33, 34, 113, 17, 34, 113, 17, 34, 113, 17, 34, 113, + 17, 34, 113, 17, 34, 49, 49, 33, 34, 33, 33, 50, + 35, 34, 66, 82, 117, 0, 11, 16, 14, 6, 240, 240, + 100, 66, 34, 17, 33, 34, 34, 52, 0, 10, 21, 6, + 0, 8, 49, 33, 17, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 49, 33, 240, 240, 208, 11, 10, 0, 15, 9, + 145, 145, 145, 0, 11, 48, 8, 6, 0, 10, 69, 0, + 7, 80, 48, 14, 0, 9, 37, 114, 82, 72, 17, 65, + 34, 34, 17, 33, 50, 34, 33, 17, 50, 34, 33, 17, + 52, 65, 17, 50, 33, 49, 17, 50, 34, 33, 17, 50, + 34, 33, 33, 34, 34, 17, 54, 35, 66, 82, 117, 0, + 11, 16, 8, 5, 240, 240, 84, 0, 10, 96, 15, 6, + 240, 240, 115, 33, 49, 17, 49, 17, 49, 35, 0, 10, + 96, 20, 16, 0, 14, 113, 241, 241, 241, 241, 143, 129, + 241, 241, 241, 241, 240, 159, 0, 10, 16, 18, 6, 240, + 240, 115, 33, 34, 18, 18, 66, 50, 49, 65, 49, 21, + 0, 8, 48, 19, 7, 240, 240, 211, 49, 49, 97, 51, + 98, 98, 18, 34, 17, 49, 51, 0, 9, 16, 9, 4, + 240, 177, 33, 33, 0, 8, 48, 30, 10, 0, 12, 66, + 50, 50, 50, 50, 50, 50, 50, 49, 66, 49, 66, 49, + 65, 66, 50, 17, 51, 34, 17, 145, 145, 146, 130, 240, + 48, 39, 8, 240, 240, 182, 20, 17, 36, 17, 36, 17, + 36, 17, 51, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 240, 176, 9, 3, 240, 240, 98, 18, 240, 240, + 64, 8, 4, 0, 10, 17, 65, 19, 144, 14, 4, 240, + 161, 34, 49, 49, 49, 49, 49, 35, 240, 240, 240, 18, + 5, 240, 240, 18, 33, 33, 17, 33, 17, 33, 17, 33, + 34, 36, 0, 7, 80, 21, 6, 0, 8, 33, 33, 33, + 33, 49, 33, 33, 33, 33, 33, 33, 33, 17, 33, 240, + 240, 224, 38, 12, 0, 9, 2, 97, 65, 81, 81, 81, + 81, 65, 97, 65, 97, 49, 49, 49, 49, 34, 35, 17, + 33, 17, 81, 49, 17, 81, 33, 33, 65, 53, 49, 97, + 177, 0, 9, 32, 38, 13, 0, 9, 98, 97, 81, 97, + 81, 81, 97, 65, 113, 65, 18, 65, 66, 34, 33, 50, + 50, 19, 17, 18, 34, 65, 82, 81, 66, 81, 65, 113, + 49, 65, 118, 0, 9, 112, 39, 13, 0, 9, 115, 81, + 49, 49, 49, 129, 49, 83, 49, 131, 17, 82, 35, 49, + 33, 50, 50, 51, 17, 33, 17, 97, 49, 17, 97, 33, + 33, 81, 68, 65, 97, 65, 113, 0, 10, 24, 8, 0, + 10, 34, 98, 113, 81, 33, 113, 97, 98, 82, 82, 49, + 34, 50, 18, 65, 18, 65, 52, 240, 48, 32, 13, 240, + 18, 194, 0, 6, 50, 178, 178, 161, 18, 145, 18, 145, + 33, 129, 50, 113, 50, 118, 97, 82, 81, 82, 81, 82, + 53, 37, 0, 9, 112, 33, 14, 240, 113, 193, 193, 240, + 193, 209, 194, 195, 161, 18, 161, 33, 161, 34, 129, 50, + 129, 65, 135, 97, 82, 97, 82, 97, 98, 53, 38, 0, + 10, 80, 34, 13, 240, 65, 178, 161, 33, 240, 145, 193, + 178, 179, 145, 18, 145, 18, 145, 33, 129, 50, 113, 50, + 118, 97, 82, 81, 82, 81, 97, 53, 37, 0, 9, 112, + 32, 13, 240, 245, 240, 240, 97, 178, 178, 179, 145, 18, + 145, 18, 145, 33, 129, 50, 113, 50, 118, 97, 82, 81, + 82, 81, 97, 53, 37, 0, 9, 112, 36, 14, 240, 240, + 34, 34, 130, 34, 240, 240, 130, 194, 177, 17, 177, 18, + 161, 18, 145, 49, 145, 50, 129, 50, 134, 113, 82, 97, + 82, 82, 97, 54, 37, 0, 10, 80, 36, 14, 98, 177, + 33, 161, 33, 161, 33, 178, 240, 178, 194, 194, 177, 18, + 161, 18, 145, 34, 145, 50, 129, 50, 134, 113, 82, 97, + 82, 82, 82, 54, 22, 0, 10, 80, 42, 18, 0, 12, + 11, 131, 82, 131, 97, 113, 18, 97, 113, 18, 97, 97, + 34, 33, 161, 34, 33, 145, 53, 145, 50, 33, 135, 97, + 65, 66, 97, 49, 82, 97, 49, 82, 82, 21, 27, 0, + 13, 80, 33, 11, 0, 7, 36, 33, 49, 67, 34, 82, + 33, 98, 18, 113, 18, 146, 146, 146, 146, 113, 33, 97, + 50, 81, 65, 65, 100, 113, 179, 146, 115, 240, 192, 34, + 12, 242, 177, 193, 240, 59, 50, 82, 50, 97, 50, 97, + 50, 97, 50, 33, 114, 33, 117, 114, 33, 114, 97, 50, + 97, 50, 97, 50, 82, 27, 0, 9, 16, 34, 12, 240, + 65, 162, 240, 219, 50, 82, 50, 97, 50, 97, 50, 97, + 50, 33, 114, 33, 117, 114, 33, 114, 97, 50, 97, 50, + 97, 50, 82, 27, 0, 9, 16, 36, 12, 240, 33, 178, + 145, 33, 240, 27, 50, 82, 50, 97, 50, 97, 50, 97, + 50, 33, 114, 33, 117, 114, 33, 114, 97, 50, 97, 50, + 97, 50, 82, 27, 0, 9, 16, 37, 12, 240, 194, 34, + 98, 34, 251, 50, 82, 50, 97, 50, 97, 50, 49, 33, + 50, 49, 98, 49, 102, 98, 49, 98, 49, 33, 50, 97, + 50, 97, 50, 82, 27, 0, 9, 16, 22, 7, 114, 98, + 240, 54, 50, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 54, 240, 240, 208, 22, 7, 177, 82, 81, 166, + 50, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 54, 240, 240, 208, 23, 7, 240, 18, 65, 33, 150, 50, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 54, + 240, 240, 208, 23, 7, 226, 34, 18, 34, 134, 50, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 54, 240, + 240, 208, 33, 13, 0, 8, 25, 98, 81, 82, 82, 66, + 97, 66, 98, 50, 98, 22, 66, 50, 98, 50, 98, 50, + 98, 50, 97, 66, 82, 66, 81, 57, 0, 10, 32, 46, + 14, 240, 66, 177, 19, 240, 240, 52, 69, 51, 81, 83, + 81, 81, 18, 65, 81, 18, 65, 81, 34, 49, 81, 49, + 49, 81, 50, 33, 81, 66, 17, 81, 66, 17, 81, 83, + 81, 98, 81, 98, 53, 81, 0, 10, 112, 35, 11, 225, + 162, 161, 240, 84, 97, 65, 66, 66, 49, 97, 34, 98, + 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, 33, 97, + 50, 66, 65, 65, 100, 0, 8, 96, 36, 11, 240, 33, + 146, 145, 240, 68, 97, 65, 66, 66, 49, 97, 34, 98, + 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, 33, 97, + 50, 66, 65, 65, 100, 0, 8, 96, 36, 11, 242, 146, + 129, 33, 240, 52, 97, 65, 66, 66, 49, 97, 34, 98, + 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, 33, 97, + 50, 66, 65, 65, 100, 0, 8, 96, 35, 11, 226, 33, + 130, 240, 228, 97, 65, 66, 81, 49, 97, 34, 98, 18, + 98, 18, 98, 18, 98, 18, 98, 18, 98, 33, 97, 50, + 81, 65, 65, 100, 0, 8, 96, 36, 11, 210, 34, 82, + 34, 240, 212, 97, 65, 66, 66, 49, 97, 34, 98, 18, + 98, 18, 98, 18, 98, 18, 98, 18, 98, 33, 97, 50, + 66, 65, 65, 100, 0, 8, 96, 29, 12, 0, 12, 1, + 145, 33, 113, 65, 81, 97, 49, 129, 17, 161, 163, 130, + 17, 114, 49, 97, 81, 65, 113, 33, 145, 0, 7, 80, + 41, 11, 0, 7, 36, 33, 49, 66, 50, 66, 49, 82, + 34, 65, 18, 18, 49, 34, 18, 49, 34, 18, 33, 50, + 18, 17, 66, 18, 17, 66, 34, 81, 50, 66, 50, 65, + 49, 36, 0, 8, 96, 37, 14, 240, 50, 209, 225, 240, + 102, 37, 50, 97, 82, 97, 82, 97, 82, 97, 82, 97, + 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, + 98, 65, 133, 0, 11, 16, 37, 14, 240, 113, 193, 193, + 240, 102, 37, 50, 97, 82, 97, 82, 97, 82, 97, 82, + 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, + 97, 98, 65, 133, 0, 11, 16, 39, 14, 240, 81, 193, + 17, 161, 49, 240, 70, 37, 50, 97, 82, 97, 82, 97, + 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, + 82, 97, 82, 97, 98, 65, 133, 0, 11, 16, 39, 14, + 240, 50, 34, 130, 34, 240, 240, 38, 52, 50, 97, 82, + 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, + 97, 82, 97, 82, 97, 82, 97, 98, 65, 133, 0, 11, + 16, 30, 13, 240, 97, 178, 177, 240, 54, 36, 66, 66, + 82, 65, 114, 49, 114, 33, 146, 17, 147, 178, 178, 178, + 178, 178, 178, 150, 0, 10, 16, 26, 12, 0, 7, 70, + 130, 162, 167, 82, 66, 66, 82, 50, 82, 50, 82, 50, + 66, 71, 82, 162, 162, 134, 0, 9, 96, 33, 8, 240, + 240, 195, 65, 34, 34, 34, 34, 34, 34, 33, 52, 66, + 34, 34, 49, 34, 50, 18, 50, 18, 50, 20, 18, 20, + 17, 34, 19, 0, 6, 32, 26, 9, 0, 6, 113, 130, + 129, 240, 35, 81, 34, 65, 34, 114, 69, 50, 34, 50, + 34, 17, 18, 34, 17, 38, 0, 7, 26, 9, 0, 7, + 49, 113, 240, 147, 81, 49, 66, 33, 129, 84, 50, 49, + 50, 49, 17, 18, 34, 17, 35, 18, 0, 7, 24, 9, + 0, 8, 18, 145, 243, 66, 34, 65, 34, 114, 69, 50, + 34, 50, 34, 17, 18, 34, 17, 38, 0, 7, 27, 9, + 0, 7, 1, 33, 65, 18, 240, 147, 81, 34, 65, 34, + 114, 69, 50, 34, 50, 34, 17, 18, 34, 17, 38, 0, + 7, 28, 9, 0, 6, 114, 18, 66, 18, 240, 131, 81, + 49, 66, 33, 129, 84, 50, 49, 50, 49, 17, 18, 34, + 17, 35, 18, 0, 7, 27, 9, 0, 7, 3, 81, 33, + 98, 240, 19, 66, 34, 65, 34, 114, 69, 50, 34, 50, + 34, 17, 18, 34, 17, 38, 0, 7, 30, 12, 0, 15, + 35, 19, 50, 34, 49, 49, 34, 50, 33, 34, 50, 57, + 18, 34, 98, 34, 65, 18, 17, 17, 49, 50, 51, 0, + 9, 48, 23, 7, 0, 9, 3, 49, 49, 18, 34, 18, + 33, 34, 82, 82, 97, 49, 51, 65, 114, 97, 67, 240, + 16, 24, 8, 0, 6, 17, 129, 129, 227, 65, 49, 34, + 50, 18, 50, 23, 18, 98, 65, 33, 49, 68, 0, 6, + 32, 23, 8, 0, 6, 81, 97, 240, 99, 65, 49, 34, + 49, 34, 49, 39, 18, 98, 113, 49, 67, 0, 6, 48, + 25, 8, 0, 6, 49, 114, 81, 33, 195, 65, 49, 34, + 50, 18, 50, 23, 18, 98, 65, 33, 49, 68, 0, 6, + 32, 25, 7, 240, 240, 210, 18, 34, 18, 240, 35, 49, + 34, 18, 49, 18, 49, 22, 18, 82, 97, 49, 51, 240, + 240, 224, 18, 5, 240, 242, 65, 81, 146, 50, 50, 50, + 50, 50, 50, 50, 50, 240, 240, 16, 17, 4, 240, 177, + 33, 33, 114, 34, 34, 34, 34, 34, 34, 34, 34, 240, + 176, 19, 5, 240, 240, 18, 35, 81, 114, 50, 50, 50, + 50, 50, 50, 50, 50, 240, 240, 32, 20, 6, 240, 240, + 194, 18, 18, 18, 145, 81, 81, 81, 81, 81, 81, 81, + 81, 240, 240, 144, 31, 8, 240, 240, 193, 33, 67, 97, + 82, 17, 114, 68, 49, 50, 18, 50, 18, 50, 18, 50, + 18, 50, 18, 50, 33, 49, 65, 17, 0, 6, 48, 30, + 7, 240, 240, 210, 17, 49, 18, 240, 18, 18, 35, 18, + 18, 34, 18, 34, 18, 34, 18, 34, 18, 34, 18, 34, + 18, 34, 240, 240, 208, 27, 8, 0, 6, 17, 129, 129, + 227, 65, 49, 34, 50, 18, 50, 18, 50, 18, 50, 18, + 50, 33, 49, 65, 17, 0, 6, 48, 27, 8, 0, 6, + 81, 97, 97, 227, 65, 49, 34, 50, 18, 50, 18, 50, + 18, 50, 18, 50, 33, 49, 65, 17, 0, 6, 48, 28, + 8, 0, 6, 49, 98, 97, 17, 211, 65, 49, 34, 50, + 18, 50, 18, 50, 18, 50, 18, 50, 33, 49, 65, 17, + 0, 6, 48, 29, 8, 0, 6, 34, 17, 49, 18, 240, + 99, 65, 49, 34, 50, 18, 50, 18, 50, 18, 50, 18, + 50, 33, 49, 65, 17, 0, 6, 48, 29, 8, 0, 6, + 18, 18, 50, 18, 240, 83, 65, 49, 34, 50, 18, 50, + 18, 50, 18, 50, 18, 50, 33, 49, 65, 17, 0, 6, + 48, 16, 15, 0, 15, 98, 210, 0, 6, 78, 0, 8, + 50, 210, 0, 10, 32, 28, 8, 0, 10, 35, 17, 33, + 49, 34, 35, 18, 17, 18, 18, 17, 18, 19, 34, 19, + 34, 33, 49, 33, 17, 17, 0, 6, 48, 28, 7, 240, + 240, 209, 97, 113, 178, 34, 18, 34, 18, 34, 18, 34, + 18, 34, 18, 34, 18, 34, 18, 19, 34, 18, 240, 240, + 208, 28, 7, 0, 5, 97, 81, 240, 34, 34, 18, 34, + 18, 34, 18, 34, 18, 34, 18, 34, 18, 34, 18, 19, + 34, 18, 240, 240, 208, 27, 7, 0, 6, 50, 65, 194, + 34, 18, 34, 18, 34, 18, 34, 18, 34, 18, 34, 18, + 34, 18, 19, 34, 18, 240, 240, 208, 29, 7, 240, 240, + 194, 34, 18, 34, 242, 34, 18, 34, 18, 34, 18, 34, + 18, 34, 18, 34, 18, 34, 18, 19, 34, 18, 240, 240, + 208, 30, 9, 0, 7, 65, 113, 113, 211, 35, 34, 49, + 65, 49, 65, 33, 82, 17, 97, 17, 98, 114, 129, 113, + 82, 17, 82, 17, 83, 240, 144, 32, 9, 0, 6, 114, + 114, 114, 114, 114, 34, 52, 18, 34, 50, 34, 50, 34, + 49, 50, 34, 50, 33, 66, 17, 83, 98, 114, 114, 114, + 97, 240, 32, 32, 9, 0, 7, 2, 18, 66, 18, 240, + 83, 50, 34, 49, 65, 49, 66, 17, 82, 17, 97, 17, + 98, 129, 129, 113, 82, 17, 82, 17, 83, 240, 144, +}; + +//***************************************************************************** +// +// The glyph offset table for the 18 point Oldstandard font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard18[] = +{ + 0, 5, 21, 35, 65, 104, 146, 180, + 189, 211, 233, 254, 276, 287, 295, 303, + 327, 357, 377, 403, 429, 454, 482, 512, + 533, 563, 593, 603, 617, 640, 651, 674, + 697, 746, 776, 808, 838, 871, 903, 931, + 965, 999, 1020, 1045, 1079, 1103, 1155, 1197, + 1230, 1257, 1298, 1332, 1361, 1389, 1423, 1452, + 1500, 1532, 1559, 1588, 1610, 1633, 1655, 1674, + 1682, 1691, 1713, 1743, 1763, 1792, 1813, 1836, + 1863, 1893, 1909, 1932, 1961, 1979, 2013, 2038, + 2062, 2089, 2117, 2135, 2157, 2179, 2204, 2224, + 2256, 2279, 2305, 2325, 2346, 2367, 2388, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2402, 2407, 2422, 2451, 2477, 2504, 2529, 2546, + 2579, 2590, 2636, 2650, 2671, 2682, 2690, 2738, + 2746, 2761, 2781, 2799, 2818, 2827, 2857, 2896, + 2905, 2913, 2927, 2945, 2966, 3004, 3042, 3081, + 3105, 3137, 3170, 3204, 3236, 3272, 3308, 3350, + 3383, 3417, 3451, 3487, 3524, 3546, 3568, 3591, + 3614, 3647, 3693, 3728, 3764, 3800, 3835, 3871, + 3900, 3941, 3978, 4015, 4054, 4093, 4123, 4149, + 4182, 4208, 4234, 4258, 4285, 4313, 4340, 4370, + 4393, 4417, 4440, 4465, 4490, 4508, 4525, 4544, + 4564, 4595, 4625, 4652, 4679, 4707, 4736, 4765, + 4781, 4809, 4837, 4865, 4892, 4921, 4951, 4983, +}; + +//***************************************************************************** +// +// The font definition for the 18 point Oldstandard font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard18 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 17, + + // + // The height of the font. + // + 25, + + // + // The baseline of the font. + // + 19, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard18, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard18Data +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard18b.c b/third_party/fonts/ofl/fonts/fontoldstandard18b.c new file mode 100644 index 0000000..84b913a --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard18b.c @@ -0,0 +1,628 @@ +//***************************************************************************** +// +// fontoldstandard18b.c - Font definition for the 18pt Oldstandard bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 18 point +// Bold: yes +// Italic: no +// Memory usage: 5108 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 18 point Oldstandard bold font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard18bData[4906] = +{ + 5, 7, 0, 20, 16, 18, 4, 240, 83, 19, 19, 19, + 19, 33, 49, 49, 49, 49, 34, 35, 19, 240, 96, 14, + 6, 240, 242, 18, 18, 18, 18, 18, 18, 18, 0, 10, + 80, 31, 11, 0, 7, 33, 49, 97, 49, 97, 49, 58, + 65, 49, 82, 34, 82, 34, 81, 49, 74, 49, 49, 97, + 49, 97, 49, 97, 49, 0, 7, 48, 38, 10, 240, 240, + 49, 33, 97, 33, 101, 66, 33, 17, 35, 33, 17, 35, + 35, 35, 34, 69, 86, 86, 35, 35, 20, 35, 33, 17, + 35, 33, 17, 35, 54, 81, 33, 240, 240, 208, 43, 13, + 0, 8, 35, 81, 50, 18, 49, 66, 18, 49, 66, 18, + 33, 82, 18, 17, 129, 49, 177, 49, 129, 33, 17, 97, + 34, 18, 81, 34, 18, 65, 50, 18, 49, 66, 18, 49, + 81, 17, 0, 8, 48, 34, 13, 0, 8, 68, 130, 49, + 114, 49, 115, 17, 147, 163, 51, 49, 19, 49, 49, 51, + 33, 34, 66, 17, 50, 68, 50, 83, 52, 51, 85, 34, + 0, 8, 48, 9, 3, 242, 18, 18, 18, 240, 240, 208, + 22, 6, 240, 240, 49, 65, 81, 65, 81, 66, 66, 66, + 66, 66, 66, 81, 81, 81, 97, 97, 97, 112, 22, 6, + 240, 240, 17, 97, 81, 97, 81, 82, 66, 66, 66, 66, + 66, 65, 81, 65, 81, 65, 65, 176, 20, 8, 240, 240, + 210, 65, 18, 17, 35, 18, 66, 52, 18, 33, 17, 33, + 66, 0, 11, 48, 23, 16, 0, 10, 113, 241, 241, 241, + 241, 241, 241, 143, 129, 241, 241, 241, 241, 241, 241, 241, + 240, 240, 160, 11, 5, 0, 9, 66, 36, 35, 65, 49, + 49, 208, 9, 6, 0, 9, 5, 21, 0, 6, 112, 9, + 4, 0, 7, 66, 35, 19, 240, 96, 22, 7, 240, 240, + 161, 97, 81, 97, 97, 82, 81, 97, 82, 81, 97, 97, + 81, 97, 97, 82, 81, 208, 31, 10, 0, 6, 83, 97, + 49, 66, 50, 50, 50, 35, 51, 19, 51, 19, 51, 19, + 51, 19, 51, 34, 50, 50, 50, 65, 49, 99, 0, 6, + 96, 20, 7, 240, 240, 129, 52, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 54, 240, 240, 96, 28, 9, 0, + 5, 116, 65, 65, 34, 66, 19, 50, 19, 50, 98, 98, + 97, 98, 65, 17, 97, 24, 17, 37, 17, 51, 0, 5, + 112, 27, 10, 0, 6, 53, 66, 66, 35, 50, 35, 50, + 129, 84, 147, 131, 34, 51, 19, 51, 19, 51, 18, 51, + 69, 0, 6, 80, 24, 9, 0, 6, 18, 114, 99, 99, + 81, 18, 65, 34, 65, 34, 49, 50, 56, 82, 114, 114, + 86, 0, 5, 96, 28, 9, 240, 240, 113, 65, 53, 68, + 81, 129, 129, 19, 66, 34, 49, 51, 99, 34, 35, 19, + 35, 18, 51, 18, 50, 53, 0, 6, 28, 9, 0, 6, + 4, 65, 50, 34, 35, 34, 35, 19, 102, 51, 49, 35, + 50, 19, 50, 19, 50, 34, 50, 34, 49, 68, 0, 6, + 24, 9, 240, 240, 241, 19, 18, 21, 33, 24, 17, 97, + 113, 129, 113, 114, 98, 99, 99, 99, 99, 0, 6, 16, + 29, 9, 0, 5, 116, 65, 66, 18, 81, 18, 81, 20, + 33, 53, 85, 49, 36, 17, 82, 17, 97, 17, 97, 33, + 81, 53, 0, 5, 112, 27, 8, 240, 240, 195, 65, 34, + 34, 34, 34, 35, 18, 35, 18, 35, 38, 83, 49, 19, + 38, 37, 49, 34, 67, 240, 240, 208, 12, 4, 240, 240, + 99, 19, 19, 210, 35, 19, 240, 96, 15, 5, 0, 5, + 99, 35, 35, 240, 34, 36, 35, 65, 49, 65, 192, 23, + 15, 0, 10, 114, 194, 178, 179, 163, 178, 178, 179, 195, + 226, 242, 242, 227, 226, 242, 241, 240, 240, 16, 11, 16, + 0, 20, 15, 0, 6, 31, 0, 16, 16, 23, 15, 0, + 9, 50, 226, 242, 227, 227, 226, 242, 227, 195, 178, 178, + 178, 179, 163, 178, 193, 240, 240, 224, 24, 7, 240, 240, + 100, 33, 50, 17, 50, 17, 50, 66, 81, 81, 81, 97, + 33, 66, 82, 83, 67, 240, 240, 112, 47, 15, 0, 9, + 118, 129, 98, 81, 50, 20, 50, 33, 34, 33, 34, 34, + 34, 34, 18, 18, 50, 34, 18, 18, 50, 34, 18, 18, + 34, 50, 18, 18, 34, 49, 49, 18, 17, 17, 34, 50, + 18, 50, 98, 245, 0, 10, 16, 28, 14, 0, 9, 65, + 209, 195, 179, 161, 18, 161, 19, 145, 19, 129, 50, 129, + 51, 119, 97, 82, 97, 83, 53, 23, 0, 8, 112, 30, + 12, 0, 7, 72, 98, 65, 82, 66, 66, 66, 66, 66, + 66, 65, 86, 98, 66, 66, 67, 50, 67, 50, 67, 50, + 66, 41, 0, 7, 112, 30, 11, 0, 7, 36, 33, 50, + 51, 34, 82, 19, 82, 19, 97, 19, 97, 19, 131, 131, + 97, 34, 97, 34, 81, 66, 65, 85, 0, 7, 32, 31, + 13, 0, 8, 25, 98, 66, 82, 82, 66, 82, 66, 83, + 50, 83, 50, 83, 50, 83, 50, 83, 50, 82, 66, 82, + 66, 66, 57, 0, 8, 80, 32, 12, 0, 7, 75, 50, + 82, 50, 82, 50, 49, 33, 50, 49, 98, 34, 102, 98, + 34, 98, 49, 33, 50, 97, 50, 82, 50, 82, 27, 0, + 7, 80, 29, 12, 0, 7, 75, 50, 82, 50, 82, 50, + 49, 33, 50, 49, 33, 50, 34, 102, 98, 34, 98, 49, + 98, 162, 162, 134, 0, 8, 32, 33, 11, 0, 7, 36, + 17, 65, 66, 50, 81, 50, 81, 35, 81, 35, 131, 37, + 19, 66, 35, 66, 35, 66, 50, 66, 65, 49, 17, 83, + 33, 0, 7, 16, 32, 14, 0, 8, 102, 22, 50, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 89, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 54, 22, 0, 8, 112, + 20, 7, 240, 240, 86, 50, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 54, 240, 240, 96, 24, 10, 0, 6, + 86, 98, 130, 130, 130, 130, 130, 130, 51, 34, 51, 34, + 50, 50, 49, 65, 84, 0, 6, 112, 32, 14, 0, 8, + 102, 21, 66, 66, 98, 65, 114, 49, 130, 33, 146, 19, + 134, 130, 20, 114, 35, 114, 51, 98, 51, 98, 67, 54, + 22, 0, 8, 112, 25, 12, 0, 7, 70, 130, 162, 162, + 162, 162, 162, 162, 97, 50, 97, 50, 82, 50, 82, 50, + 67, 27, 0, 7, 80, 46, 16, 0, 10, 5, 100, 51, + 83, 84, 67, 84, 49, 18, 81, 19, 33, 18, 81, 19, + 33, 18, 81, 19, 33, 18, 81, 36, 34, 81, 36, 34, + 81, 51, 34, 81, 50, 50, 81, 50, 50, 53, 33, 22, + 0, 10, 16, 37, 13, 0, 8, 20, 53, 36, 65, 83, + 65, 84, 49, 81, 19, 33, 81, 19, 33, 81, 35, 17, + 81, 50, 17, 81, 52, 81, 67, 81, 67, 81, 82, 53, + 65, 0, 8, 64, 31, 12, 0, 8, 3, 114, 50, 66, + 82, 50, 82, 35, 83, 19, 83, 19, 83, 19, 83, 19, + 83, 34, 82, 50, 82, 66, 50, 115, 0, 8, 16, 25, + 12, 0, 7, 73, 82, 66, 66, 67, 50, 67, 50, 67, + 50, 51, 70, 98, 162, 162, 162, 162, 134, 0, 8, 32, + 38, 12, 0, 8, 3, 114, 50, 66, 82, 50, 82, 35, + 83, 19, 83, 19, 83, 19, 83, 19, 83, 34, 18, 34, + 51, 36, 66, 35, 17, 68, 49, 113, 49, 114, 18, 117, + 131, 224, 34, 13, 0, 8, 25, 98, 67, 66, 67, 66, + 67, 66, 51, 86, 114, 50, 98, 66, 82, 66, 82, 66, + 17, 50, 66, 17, 50, 66, 17, 23, 34, 0, 8, 48, + 29, 10, 0, 6, 68, 66, 66, 34, 81, 35, 65, 36, + 117, 101, 49, 52, 33, 68, 17, 98, 18, 82, 19, 65, + 33, 36, 0, 6, 80, 27, 12, 0, 7, 75, 18, 34, + 50, 17, 50, 50, 17, 50, 65, 17, 50, 65, 82, 162, + 162, 162, 162, 162, 162, 134, 0, 8, 32, 14, 0, 8, + 102, 37, 50, 97, 82, 97, 82, 97, 82, 97, 82, 97, + 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 98, 65, + 133, 0, 9, 48, 28, 14, 0, 8, 103, 21, 51, 81, + 98, 81, 99, 49, 115, 49, 131, 33, 131, 17, 147, 17, + 164, 163, 179, 194, 193, 0, 9, 80, 40, 19, 0, 11, + 124, 21, 51, 51, 65, 83, 51, 65, 83, 52, 33, 115, + 36, 33, 115, 36, 33, 115, 17, 35, 17, 132, 36, 148, + 36, 147, 67, 162, 66, 178, 66, 177, 97, 0, 12, 80, + 28, 13, 0, 8, 22, 20, 67, 49, 99, 33, 131, 17, + 132, 163, 163, 164, 148, 129, 35, 97, 66, 97, 67, 52, + 38, 0, 8, 32, 26, 14, 0, 8, 102, 22, 51, 65, + 99, 65, 114, 49, 131, 33, 146, 17, 164, 178, 194, 194, + 194, 194, 166, 0, 9, 48, 27, 10, 0, 6, 41, 18, + 52, 17, 67, 33, 51, 49, 51, 99, 115, 99, 115, 99, + 65, 35, 65, 19, 66, 25, 0, 6, 48, 21, 5, 240, + 164, 18, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 52, 96, 22, 7, 240, 240, 81, 98, + 97, 97, 97, 113, 97, 97, 98, 97, 97, 98, 97, 97, + 97, 113, 97, 128, 21, 5, 240, 164, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 20, + 96, 19, 9, 0, 6, 17, 114, 98, 17, 81, 34, 50, + 49, 49, 66, 17, 97, 0, 12, 64, 7, 10, 0, 25, + 9, 240, 96, 9, 4, 240, 82, 34, 65, 0, 7, 80, + 23, 9, 0, 10, 36, 66, 34, 50, 34, 114, 69, 50, + 34, 50, 34, 17, 18, 34, 17, 38, 0, 5, 112, 29, + 8, 240, 240, 162, 98, 98, 98, 98, 18, 51, 33, 34, + 50, 18, 50, 18, 50, 18, 50, 18, 50, 17, 17, 33, + 82, 240, 240, 208, 20, 7, 0, 8, 19, 49, 49, 18, + 34, 18, 34, 18, 82, 82, 97, 49, 51, 240, 240, 112, + 29, 8, 240, 240, 242, 98, 98, 98, 50, 18, 33, 35, + 18, 50, 18, 50, 18, 50, 18, 50, 18, 50, 33, 35, + 50, 18, 240, 240, 176, 21, 8, 0, 9, 35, 65, 49, + 34, 50, 18, 50, 23, 18, 98, 65, 33, 65, 52, 240, + 240, 192, 22, 7, 240, 240, 115, 50, 18, 34, 18, 34, + 68, 66, 82, 82, 82, 82, 82, 82, 82, 240, 240, 144, + 26, 10, 0, 11, 68, 18, 34, 36, 34, 34, 66, 34, + 66, 33, 99, 82, 135, 71, 34, 66, 33, 97, 33, 81, + 69, 224, 29, 8, 240, 240, 162, 98, 98, 98, 98, 19, + 35, 34, 18, 50, 18, 50, 18, 50, 18, 50, 18, 50, + 18, 50, 18, 50, 240, 240, 176, 15, 3, 242, 18, 114, + 18, 18, 18, 18, 18, 18, 18, 18, 240, 16, 22, 6, + 240, 240, 50, 66, 243, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 18, 18, 18, 18, 35, 128, 28, 8, 240, 240, + 162, 98, 98, 98, 98, 35, 18, 33, 50, 17, 66, 17, + 69, 50, 18, 50, 34, 34, 35, 18, 35, 240, 240, 176, + 17, 3, 242, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 240, 16, 34, 13, 0, 14, 82, 19, 35, + 35, 35, 34, 18, 50, 50, 18, 50, 50, 18, 50, 50, + 18, 50, 50, 18, 50, 50, 18, 50, 50, 18, 50, 50, + 0, 8, 32, 25, 8, 0, 9, 2, 19, 35, 34, 18, + 50, 18, 50, 18, 50, 18, 50, 18, 50, 18, 50, 18, + 50, 240, 240, 176, 24, 8, 0, 9, 35, 65, 49, 34, + 50, 18, 50, 18, 50, 18, 50, 18, 50, 33, 49, 65, + 17, 240, 240, 208, 27, 8, 0, 9, 2, 18, 51, 33, + 34, 50, 18, 50, 18, 50, 18, 50, 18, 50, 19, 33, + 34, 18, 50, 98, 98, 98, 224, 27, 8, 0, 9, 34, + 81, 33, 17, 18, 50, 18, 50, 18, 50, 18, 50, 18, + 50, 33, 35, 50, 18, 98, 98, 98, 98, 144, 18, 6, + 0, 6, 98, 18, 21, 18, 18, 18, 66, 66, 66, 66, + 66, 240, 240, 64, 20, 7, 0, 8, 3, 49, 49, 34, + 83, 84, 83, 17, 50, 18, 49, 49, 17, 240, 240, 112, + 23, 7, 240, 240, 113, 97, 97, 82, 69, 50, 82, 82, + 82, 82, 33, 34, 33, 34, 33, 51, 240, 240, 112, 25, + 8, 0, 9, 2, 50, 18, 50, 18, 50, 18, 50, 18, + 50, 18, 50, 18, 50, 18, 35, 35, 18, 240, 240, 176, + 21, 9, 0, 10, 19, 35, 34, 49, 50, 33, 67, 17, + 82, 17, 83, 114, 114, 113, 0, 6, 32, 32, 13, 0, + 14, 83, 35, 34, 34, 50, 49, 50, 34, 33, 66, 17, + 18, 17, 66, 17, 18, 17, 83, 19, 98, 50, 98, 50, + 113, 49, 0, 8, 80, 21, 9, 0, 10, 19, 34, 50, + 33, 68, 99, 114, 114, 97, 18, 65, 35, 34, 36, 0, + 5, 96, 24, 8, 0, 9, 3, 34, 34, 33, 50, 33, + 51, 17, 66, 17, 67, 98, 98, 97, 113, 66, 17, 67, + 83, 208, 21, 8, 0, 9, 22, 33, 34, 49, 34, 82, + 83, 82, 83, 33, 34, 49, 19, 19, 240, 240, 176, 22, + 7, 240, 240, 146, 50, 82, 82, 82, 82, 82, 82, 50, + 114, 82, 82, 82, 82, 82, 82, 114, 128, 20, 2, 161, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 48, 22, 7, 240, 240, 82, 114, 82, + 82, 82, 82, 82, 82, 114, 50, 82, 82, 82, 82, 82, + 82, 50, 192, 14, 11, 0, 16, 68, 81, 17, 36, 33, + 17, 69, 0, 11, 16, 5, 7, 0, 20, 16, 18, 4, + 240, 240, 99, 19, 19, 33, 49, 49, 49, 49, 35, 19, + 19, 19, 19, 80, 31, 8, 0, 7, 49, 113, 85, 49, + 17, 17, 34, 17, 17, 34, 17, 17, 34, 17, 66, 17, + 66, 17, 33, 33, 17, 17, 67, 97, 113, 240, 208, 27, + 11, 0, 7, 68, 97, 65, 66, 50, 66, 49, 82, 134, + 99, 146, 146, 146, 98, 17, 65, 17, 38, 35, 35, 0, + 7, 32, 24, 9, 0, 9, 1, 20, 17, 34, 34, 33, + 97, 17, 97, 17, 97, 17, 97, 33, 65, 33, 20, 17, + 0, 8, 25, 10, 0, 6, 36, 35, 34, 65, 51, 33, + 82, 33, 82, 17, 114, 88, 82, 88, 82, 130, 130, 102, + 0, 6, 80, 17, 2, 161, 17, 17, 17, 17, 17, 17, + 113, 17, 17, 17, 17, 17, 17, 48, 33, 9, 0, 5, + 116, 65, 65, 34, 50, 34, 50, 35, 116, 65, 21, 33, + 52, 18, 66, 20, 49, 36, 17, 84, 99, 34, 50, 34, + 50, 33, 50, 68, 208, 11, 7, 240, 240, 194, 34, 18, + 34, 0, 13, 32, 47, 14, 0, 9, 37, 114, 18, 34, + 65, 33, 34, 18, 49, 18, 49, 33, 33, 34, 49, 49, + 17, 34, 49, 49, 17, 34, 113, 17, 34, 113, 17, 34, + 49, 49, 33, 33, 33, 49, 49, 50, 65, 66, 82, 117, + 0, 9, 48, 17, 6, 240, 240, 19, 34, 18, 51, 18, + 18, 18, 18, 36, 21, 0, 8, 48, 17, 6, 0, 7, + 81, 33, 18, 17, 36, 36, 36, 34, 17, 49, 240, 240, + 160, 12, 10, 0, 12, 73, 145, 145, 145, 145, 0, 10, + 16, 9, 6, 0, 9, 5, 21, 0, 6, 112, 46, 14, + 0, 9, 37, 114, 82, 65, 21, 34, 49, 34, 34, 17, + 33, 50, 34, 33, 17, 52, 65, 17, 50, 33, 49, 17, + 50, 34, 33, 17, 50, 35, 17, 33, 34, 36, 49, 20, + 33, 17, 66, 82, 117, 0, 9, 48, 8, 6, 240, 240, + 101, 0, 12, 16, 15, 7, 240, 240, 100, 34, 34, 17, + 65, 17, 50, 36, 0, 11, 80, 21, 16, 0, 10, 113, + 241, 241, 241, 241, 143, 129, 241, 241, 241, 241, 241, 240, + 159, 0, 8, 16, 17, 6, 240, 240, 19, 34, 18, 36, + 49, 65, 33, 21, 17, 19, 0, 8, 48, 21, 7, 240, + 240, 100, 34, 34, 33, 34, 35, 113, 49, 34, 18, 34, + 17, 50, 35, 0, 8, 32, 9, 4, 240, 98, 34, 17, + 0, 7, 112, 30, 10, 0, 11, 34, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 49, 65, 65, 65, 33, 33, 37, + 17, 19, 18, 33, 145, 146, 130, 130, 128, 37, 10, 0, + 6, 71, 36, 33, 52, 33, 37, 33, 52, 33, 52, 33, + 67, 33, 97, 33, 97, 33, 97, 33, 97, 33, 97, 33, + 97, 33, 97, 33, 97, 33, 97, 33, 240, 112, 10, 4, + 240, 240, 162, 35, 19, 240, 240, 176, 9, 5, 0, 11, + 49, 66, 66, 20, 96, 14, 5, 240, 193, 35, 50, 50, + 50, 50, 50, 36, 0, 6, 48, 18, 6, 240, 240, 19, + 34, 18, 18, 18, 18, 18, 18, 18, 49, 53, 0, 8, + 48, 18, 6, 0, 7, 65, 33, 49, 18, 36, 36, 36, + 33, 18, 17, 33, 240, 240, 128, 37, 14, 0, 8, 99, + 97, 82, 97, 82, 81, 98, 81, 98, 65, 114, 49, 50, + 50, 49, 50, 36, 17, 51, 113, 33, 18, 97, 49, 18, + 81, 54, 65, 98, 65, 114, 0, 9, 39, 14, 0, 8, + 99, 97, 82, 97, 82, 81, 98, 81, 98, 65, 18, 66, + 51, 34, 34, 51, 34, 20, 17, 19, 18, 97, 65, 113, + 65, 113, 65, 49, 65, 54, 49, 65, 34, 0, 9, 42, + 15, 0, 9, 68, 81, 66, 34, 65, 81, 34, 49, 99, + 81, 146, 33, 98, 34, 17, 50, 33, 50, 17, 50, 51, + 33, 51, 129, 33, 18, 113, 49, 18, 97, 54, 81, 98, + 81, 114, 0, 9, 80, 24, 7, 0, 8, 3, 67, 67, + 65, 33, 49, 33, 81, 82, 66, 81, 49, 18, 49, 18, + 49, 18, 49, 36, 144, 30, 14, 240, 50, 209, 225, 240, + 193, 210, 179, 179, 180, 145, 19, 145, 19, 145, 35, 113, + 51, 119, 97, 83, 81, 83, 53, 23, 0, 8, 112, 31, + 13, 240, 82, 177, 177, 240, 161, 193, 179, 163, 145, 18, + 145, 19, 129, 19, 113, 35, 113, 51, 103, 81, 67, 81, + 83, 37, 22, 0, 8, 32, 32, 14, 240, 81, 195, 161, + 49, 240, 161, 209, 195, 179, 161, 18, 161, 19, 145, 19, + 129, 50, 129, 51, 119, 97, 82, 97, 83, 53, 23, 0, + 8, 112, 33, 13, 240, 50, 17, 129, 19, 240, 240, 97, + 193, 179, 163, 145, 18, 145, 19, 129, 19, 113, 50, 113, + 51, 103, 81, 82, 81, 83, 37, 22, 0, 8, 32, 32, + 13, 240, 18, 34, 114, 34, 240, 240, 82, 178, 178, 164, + 148, 129, 19, 129, 35, 113, 35, 97, 66, 104, 81, 67, + 81, 82, 52, 38, 0, 8, 32, 32, 13, 82, 161, 33, + 145, 33, 162, 240, 161, 178, 178, 164, 148, 145, 18, 129, + 35, 113, 35, 113, 35, 104, 81, 67, 81, 67, 52, 38, + 0, 8, 32, 41, 18, 0, 12, 11, 131, 82, 131, 82, + 113, 18, 49, 33, 113, 18, 49, 145, 34, 34, 145, 38, + 129, 50, 34, 134, 49, 33, 65, 66, 97, 65, 66, 82, + 50, 66, 82, 21, 27, 0, 11, 48, 33, 11, 0, 7, + 36, 33, 50, 51, 34, 82, 19, 82, 19, 97, 19, 97, + 19, 131, 131, 97, 19, 97, 34, 81, 66, 65, 85, 113, + 178, 146, 115, 240, 16, 34, 12, 242, 177, 193, 240, 59, + 50, 82, 50, 82, 50, 49, 33, 50, 49, 98, 34, 102, + 98, 34, 98, 49, 33, 50, 97, 50, 82, 50, 82, 27, + 0, 7, 80, 35, 12, 240, 50, 161, 161, 240, 59, 50, + 82, 50, 82, 50, 49, 33, 50, 49, 98, 34, 102, 98, + 34, 98, 49, 33, 50, 97, 50, 82, 50, 82, 27, 0, + 7, 80, 35, 12, 240, 33, 163, 129, 50, 251, 50, 82, + 50, 82, 50, 49, 33, 50, 49, 98, 34, 102, 98, 34, + 98, 49, 33, 50, 97, 50, 82, 50, 82, 27, 0, 7, + 80, 35, 12, 242, 34, 98, 34, 240, 203, 50, 82, 50, + 81, 66, 49, 33, 50, 49, 98, 34, 102, 98, 34, 98, + 49, 33, 50, 97, 50, 82, 50, 82, 27, 0, 7, 80, + 21, 7, 129, 98, 97, 182, 50, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 54, 240, 240, 96, 21, 7, 178, + 66, 81, 166, 50, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 54, 240, 240, 96, 22, 7, 146, 82, 65, 33, + 150, 50, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 54, 240, 240, 96, 22, 7, 114, 34, 18, 34, 246, 50, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 54, 240, + 240, 96, 31, 13, 0, 8, 25, 98, 66, 82, 82, 66, + 82, 66, 83, 50, 83, 22, 51, 50, 83, 50, 83, 50, + 82, 66, 82, 66, 66, 57, 0, 8, 80, 40, 13, 240, + 35, 17, 162, 240, 240, 20, 53, 36, 65, 83, 65, 84, + 49, 81, 19, 33, 81, 19, 33, 81, 35, 17, 81, 52, + 81, 52, 81, 67, 81, 82, 81, 82, 53, 65, 0, 8, + 64, 34, 12, 49, 178, 177, 193, 240, 115, 114, 50, 66, + 82, 50, 82, 35, 83, 19, 83, 19, 83, 19, 83, 19, + 83, 34, 82, 50, 82, 66, 50, 115, 0, 8, 16, 34, + 12, 113, 162, 161, 161, 240, 115, 114, 50, 66, 82, 50, + 82, 35, 83, 19, 83, 19, 83, 19, 83, 19, 83, 34, + 82, 50, 82, 66, 50, 115, 0, 8, 16, 36, 12, 81, + 177, 161, 17, 129, 49, 240, 83, 114, 50, 66, 82, 50, + 82, 35, 83, 19, 83, 19, 83, 19, 83, 19, 83, 34, + 82, 50, 82, 66, 50, 115, 0, 8, 16, 33, 12, 243, + 179, 240, 240, 35, 114, 50, 66, 82, 50, 82, 35, 83, + 19, 83, 19, 83, 19, 83, 19, 83, 34, 82, 50, 82, + 66, 50, 115, 0, 8, 16, 35, 12, 226, 34, 98, 34, + 240, 240, 35, 114, 50, 66, 82, 50, 82, 35, 83, 19, + 83, 19, 83, 19, 83, 19, 83, 34, 82, 50, 82, 66, + 50, 115, 0, 8, 16, 29, 12, 0, 10, 65, 145, 18, + 114, 34, 82, 66, 50, 98, 18, 131, 147, 130, 18, 98, + 50, 66, 82, 34, 114, 17, 145, 0, 6, 16, 36, 12, + 0, 8, 4, 33, 50, 51, 50, 67, 50, 67, 35, 53, + 19, 49, 19, 19, 33, 35, 19, 17, 51, 21, 51, 35, + 66, 51, 66, 51, 50, 49, 36, 0, 8, 16, 35, 14, + 65, 210, 209, 225, 240, 102, 37, 50, 97, 82, 97, 82, + 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, + 97, 82, 97, 98, 65, 133, 0, 9, 48, 35, 14, 129, + 194, 178, 193, 240, 102, 37, 50, 97, 82, 97, 82, 97, + 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, + 82, 97, 98, 65, 133, 0, 9, 48, 37, 14, 97, 194, + 193, 17, 146, 50, 240, 54, 37, 50, 97, 82, 97, 82, + 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, + 97, 82, 97, 98, 65, 133, 0, 9, 48, 37, 14, 240, + 50, 34, 130, 34, 240, 240, 38, 52, 50, 97, 82, 97, + 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, + 82, 97, 82, 97, 98, 65, 133, 0, 9, 48, 29, 13, + 240, 82, 177, 177, 240, 70, 21, 51, 65, 83, 65, 98, + 49, 115, 33, 130, 17, 148, 162, 178, 178, 178, 178, 150, + 0, 8, 80, 25, 12, 0, 7, 70, 130, 166, 98, 66, + 66, 67, 50, 67, 50, 67, 50, 51, 70, 98, 162, 162, + 134, 0, 8, 32, 32, 8, 240, 240, 195, 65, 34, 34, + 34, 34, 34, 34, 17, 66, 34, 34, 49, 34, 50, 18, + 50, 18, 50, 20, 18, 20, 17, 34, 19, 240, 240, 192, + 28, 9, 0, 5, 97, 130, 129, 240, 20, 66, 34, 50, + 34, 50, 34, 84, 65, 34, 50, 34, 17, 18, 34, 17, + 38, 0, 5, 112, 26, 9, 0, 6, 17, 114, 98, 244, + 66, 34, 50, 34, 114, 69, 50, 34, 50, 34, 17, 18, + 34, 17, 38, 0, 5, 112, 27, 9, 0, 5, 114, 114, + 97, 33, 228, 66, 34, 50, 34, 114, 69, 50, 34, 50, + 34, 17, 18, 34, 17, 38, 0, 5, 112, 28, 9, 0, + 5, 98, 33, 49, 19, 240, 132, 66, 34, 50, 34, 114, + 69, 50, 34, 50, 34, 17, 18, 34, 17, 38, 0, 5, + 112, 28, 9, 240, 240, 242, 34, 50, 34, 240, 116, 66, + 34, 50, 34, 114, 69, 50, 34, 50, 34, 17, 18, 34, + 17, 38, 0, 5, 112, 27, 9, 0, 5, 99, 97, 33, + 98, 244, 65, 50, 50, 34, 114, 69, 50, 34, 50, 34, + 17, 18, 34, 17, 38, 0, 5, 112, 28, 12, 0, 13, + 84, 19, 50, 34, 49, 34, 34, 50, 82, 50, 57, 18, + 34, 98, 34, 65, 18, 34, 65, 35, 36, 0, 7, 96, + 22, 7, 0, 8, 19, 49, 49, 18, 34, 18, 34, 18, + 82, 82, 97, 49, 51, 65, 114, 97, 67, 144, 24, 8, + 240, 240, 178, 98, 129, 227, 65, 49, 34, 50, 18, 50, + 23, 18, 98, 65, 33, 65, 52, 240, 240, 192, 24, 8, + 240, 240, 226, 98, 81, 227, 65, 49, 34, 50, 18, 50, + 23, 18, 98, 65, 33, 65, 52, 240, 240, 192, 25, 8, + 240, 240, 194, 99, 65, 49, 195, 65, 49, 34, 50, 18, + 50, 23, 18, 98, 65, 33, 65, 52, 240, 240, 192, 26, + 8, 240, 240, 178, 18, 50, 18, 240, 83, 65, 49, 34, + 50, 18, 50, 23, 18, 98, 65, 33, 50, 52, 240, 240, + 192, 17, 4, 240, 81, 50, 50, 98, 34, 34, 34, 34, + 34, 34, 34, 34, 240, 96, 17, 4, 240, 113, 34, 18, + 98, 34, 34, 34, 34, 34, 34, 34, 34, 240, 112, 18, + 5, 240, 178, 50, 33, 33, 114, 50, 50, 50, 50, 50, + 50, 50, 50, 240, 192, 20, 6, 240, 240, 98, 18, 18, + 18, 146, 66, 66, 66, 66, 66, 66, 66, 66, 240, 240, + 32, 30, 8, 240, 240, 179, 17, 67, 65, 18, 114, 68, + 49, 50, 18, 50, 18, 50, 18, 50, 18, 50, 18, 50, + 33, 49, 65, 17, 240, 240, 208, 27, 8, 0, 6, 21, + 240, 50, 19, 35, 34, 18, 50, 18, 50, 18, 50, 18, + 50, 18, 50, 18, 50, 18, 50, 240, 240, 176, 27, 8, + 240, 240, 178, 113, 129, 227, 65, 49, 34, 50, 18, 50, + 18, 50, 18, 50, 18, 50, 33, 49, 65, 17, 240, 240, + 208, 27, 8, 240, 240, 226, 98, 81, 227, 65, 49, 34, + 50, 18, 50, 18, 50, 18, 50, 18, 50, 33, 49, 65, + 17, 240, 240, 208, 28, 8, 240, 240, 209, 99, 65, 49, + 195, 65, 49, 34, 50, 18, 50, 18, 50, 18, 50, 18, + 50, 33, 49, 65, 17, 240, 240, 208, 27, 8, 240, 240, + 179, 115, 240, 83, 65, 49, 34, 50, 18, 50, 18, 50, + 18, 50, 18, 50, 33, 49, 65, 17, 240, 240, 208, 29, + 8, 240, 240, 178, 18, 50, 18, 240, 83, 65, 49, 34, + 50, 18, 50, 18, 50, 18, 50, 18, 50, 33, 49, 65, + 17, 240, 240, 208, 18, 16, 0, 14, 99, 211, 211, 240, + 240, 159, 0, 6, 115, 211, 211, 0, 8, 112, 26, 8, + 0, 9, 35, 17, 33, 34, 34, 50, 18, 35, 18, 17, + 18, 19, 34, 18, 50, 33, 49, 33, 19, 240, 240, 208, + 28, 8, 240, 240, 177, 114, 129, 194, 50, 18, 50, 18, + 50, 18, 50, 18, 50, 18, 50, 18, 50, 18, 35, 35, + 18, 240, 240, 176, 28, 8, 240, 240, 226, 82, 82, 194, + 50, 18, 50, 18, 50, 18, 50, 18, 50, 18, 50, 18, + 50, 18, 35, 35, 18, 240, 240, 176, 29, 8, 240, 240, + 194, 99, 65, 49, 162, 50, 18, 50, 18, 50, 18, 50, + 18, 50, 18, 50, 18, 50, 18, 35, 35, 18, 240, 240, + 176, 30, 8, 240, 240, 162, 34, 34, 34, 240, 50, 50, + 18, 50, 18, 50, 18, 50, 18, 50, 18, 50, 18, 50, + 18, 35, 35, 18, 240, 240, 176, 26, 8, 240, 240, 241, + 98, 81, 195, 34, 34, 33, 50, 33, 51, 17, 67, 83, + 98, 97, 113, 113, 66, 17, 67, 83, 208, 31, 9, 0, + 5, 113, 99, 114, 114, 114, 19, 51, 34, 34, 50, 34, + 50, 34, 49, 50, 49, 50, 33, 66, 17, 83, 98, 114, + 114, 98, 240, 16, 30, 9, 0, 5, 98, 34, 50, 34, + 240, 83, 50, 34, 49, 50, 33, 67, 17, 82, 17, 83, + 114, 114, 113, 129, 82, 17, 82, 17, 83, 240, +}; + +//***************************************************************************** +// +// The glyph offset table for the 18 point Oldstandard bold font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard18b[] = +{ + 0, 5, 23, 37, 68, 106, 149, 183, + 192, 214, 236, 256, 279, 290, 299, 308, + 330, 361, 381, 409, 436, 460, 488, 516, + 540, 569, 596, 608, 623, 646, 657, 680, + 704, 751, 779, 809, 839, 870, 902, 931, + 964, 996, 1016, 1040, 1072, 1097, 1143, 1180, + 1211, 1236, 1274, 1308, 1337, 1364, 1396, 1424, + 1464, 1492, 1518, 1545, 1566, 1588, 1609, 1628, + 1635, 1644, 1667, 1696, 1716, 1745, 1766, 1788, + 1814, 1843, 1858, 1880, 1908, 1925, 1959, 1984, + 2008, 2035, 2062, 2080, 2100, 2123, 2148, 2169, + 2201, 2222, 2246, 2267, 2289, 2309, 2331, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2345, 2350, 2368, 2399, 2426, 2450, 2475, 2492, + 2525, 2536, 2583, 2600, 2617, 2629, 2638, 2684, + 2692, 2707, 2728, 2745, 2766, 2775, 2805, 2842, + 2852, 2861, 2875, 2893, 2911, 2948, 2987, 3029, + 3053, 3083, 3114, 3146, 3179, 3211, 3243, 3284, + 3317, 3351, 3386, 3421, 3456, 3477, 3498, 3520, + 3542, 3573, 3613, 3647, 3681, 3717, 3750, 3785, + 3814, 3850, 3885, 3920, 3957, 3994, 4023, 4048, + 4080, 4108, 4134, 4161, 4189, 4217, 4244, 4272, + 4294, 4318, 4342, 4367, 4393, 4410, 4427, 4445, + 4465, 4495, 4522, 4549, 4576, 4604, 4631, 4660, + 4678, 4704, 4732, 4760, 4789, 4819, 4845, 4876, +}; + +//***************************************************************************** +// +// The font definition for the 18 point Oldstandard bold font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard18b = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 17, + + // + // The height of the font. + // + 23, + + // + // The baseline of the font. + // + 18, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard18b, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard18bData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard18i.c b/third_party/fonts/ofl/fonts/fontoldstandard18i.c new file mode 100644 index 0000000..e749667 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard18i.c @@ -0,0 +1,627 @@ +//***************************************************************************** +// +// fontoldstandard18i.c - Font definition for the 18pt Oldstandard italic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 18 point +// Bold: no +// Italic: yes +// Memory usage: 5088 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 18 point Oldstandard italic font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard18iData[4885] = +{ + 5, 7, 0, 19, 32, 18, 6, 240, 240, 50, 66, 51, + 50, 66, 65, 81, 65, 81, 162, 66, 240, 240, 64, 13, + 6, 240, 161, 18, 17, 33, 33, 33, 33, 0, 11, 16, + 28, 12, 0, 8, 81, 113, 33, 113, 49, 74, 81, 33, + 113, 49, 113, 33, 113, 49, 90, 65, 33, 113, 49, 113, + 33, 0, 8, 48, 40, 11, 240, 240, 161, 129, 17, 101, + 81, 34, 17, 65, 17, 17, 18, 49, 17, 19, 68, 131, + 129, 19, 65, 18, 33, 51, 17, 33, 49, 17, 17, 33, + 49, 18, 33, 85, 129, 0, 6, 48, 40, 13, 0, 8, + 51, 81, 49, 54, 49, 33, 50, 50, 33, 49, 66, 17, + 49, 98, 49, 49, 113, 34, 17, 81, 49, 33, 65, 49, + 49, 65, 49, 49, 49, 65, 33, 49, 98, 0, 8, 64, + 34, 14, 0, 9, 83, 161, 33, 161, 33, 161, 17, 163, + 34, 84, 33, 18, 49, 34, 17, 97, 51, 98, 50, 114, + 50, 49, 50, 50, 33, 84, 19, 0, 9, 48, 9, 3, + 209, 17, 33, 33, 240, 240, 224, 21, 8, 240, 240, 129, + 97, 97, 97, 113, 97, 97, 113, 113, 97, 113, 113, 113, + 129, 113, 240, 240, 22, 7, 240, 240, 17, 113, 97, 97, + 97, 113, 81, 97, 97, 97, 81, 97, 81, 81, 97, 81, + 240, 80, 18, 7, 240, 240, 129, 97, 51, 33, 51, 50, + 17, 33, 33, 17, 65, 0, 9, 16, 22, 16, 0, 10, + 113, 241, 241, 241, 241, 241, 241, 143, 129, 241, 241, 241, + 241, 241, 241, 240, 240, 160, 10, 3, 240, 240, 242, 18, + 33, 33, 17, 128, 8, 6, 0, 9, 5, 0, 6, 112, + 8, 3, 240, 240, 242, 18, 240, 16, 22, 7, 240, 240, + 49, 97, 97, 81, 97, 97, 81, 97, 97, 81, 97, 97, + 81, 97, 97, 81, 97, 208, 29, 10, 0, 6, 100, 81, + 49, 66, 65, 34, 81, 34, 66, 34, 66, 18, 82, 18, + 66, 34, 66, 49, 65, 65, 50, 83, 0, 6, 112, 19, + 8, 0, 5, 97, 98, 67, 98, 98, 98, 97, 98, 98, + 98, 97, 70, 240, 240, 192, 27, 11, 0, 7, 68, 82, + 50, 65, 66, 66, 50, 81, 50, 130, 129, 130, 114, 65, + 50, 65, 49, 37, 65, 35, 0, 7, 48, 24, 10, 0, + 6, 100, 66, 50, 50, 50, 130, 129, 84, 145, 146, 34, + 66, 34, 65, 49, 66, 68, 0, 6, 112, 23, 10, 0, + 7, 18, 129, 129, 129, 129, 17, 97, 18, 81, 34, 65, + 49, 73, 82, 129, 102, 0, 6, 80, 24, 10, 0, 6, + 97, 49, 84, 81, 145, 148, 81, 50, 130, 130, 34, 66, + 34, 65, 49, 66, 68, 0, 6, 112, 28, 9, 0, 6, + 19, 66, 49, 49, 50, 33, 114, 19, 51, 34, 34, 65, + 33, 81, 33, 66, 33, 65, 49, 50, 68, 0, 6, 16, + 22, 9, 0, 5, 115, 18, 18, 20, 33, 66, 113, 113, + 113, 113, 114, 113, 114, 114, 114, 0, 6, 64, 28, 10, + 0, 6, 100, 81, 65, 50, 65, 50, 65, 50, 65, 69, + 50, 34, 49, 82, 33, 82, 33, 82, 33, 81, 69, 0, + 6, 96, 28, 9, 0, 6, 3, 66, 49, 49, 66, 18, + 66, 18, 66, 33, 51, 51, 17, 114, 33, 66, 34, 34, + 49, 49, 68, 0, 6, 32, 11, 5, 0, 5, 114, 50, + 240, 98, 50, 240, 208, 13, 5, 0, 5, 114, 50, 240, + 98, 50, 65, 65, 49, 224, 21, 14, 0, 10, 33, 178, + 162, 162, 177, 178, 162, 177, 226, 226, 226, 226, 225, 226, + 240, 240, 224, 11, 16, 0, 22, 15, 240, 240, 63, 0, + 14, 16, 22, 15, 0, 9, 50, 242, 242, 242, 241, 242, + 242, 241, 194, 178, 178, 178, 178, 193, 209, 240, 240, 208, + 22, 8, 240, 240, 196, 34, 50, 18, 65, 98, 82, 66, + 81, 17, 65, 33, 82, 210, 98, 0, 5, 96, 48, 14, + 0, 7, 69, 114, 82, 65, 66, 17, 17, 33, 50, 34, + 17, 33, 49, 49, 33, 33, 33, 65, 49, 17, 33, 50, + 49, 17, 33, 50, 49, 17, 33, 49, 49, 33, 33, 34, + 33, 65, 34, 34, 97, 227, 18, 0, 9, 48, 27, 14, + 0, 8, 33, 209, 194, 179, 179, 161, 18, 145, 34, 145, + 34, 134, 113, 66, 113, 66, 97, 82, 54, 37, 0, 8, + 112, 30, 14, 0, 7, 56, 129, 81, 98, 82, 82, 82, + 82, 81, 97, 81, 103, 114, 66, 98, 81, 97, 98, 66, + 82, 82, 82, 57, 0, 9, 48, 28, 11, 0, 6, 4, + 97, 66, 49, 97, 34, 97, 33, 113, 18, 146, 146, 145, + 113, 33, 113, 33, 97, 65, 65, 100, 0, 7, 64, 31, + 14, 0, 7, 56, 129, 81, 98, 82, 82, 82, 82, 82, + 81, 98, 66, 98, 66, 98, 66, 97, 81, 98, 66, 97, + 82, 81, 73, 0, 9, 48, 31, 14, 0, 7, 58, 97, + 97, 82, 97, 82, 49, 33, 82, 49, 129, 49, 134, 130, + 49, 130, 97, 81, 97, 82, 97, 82, 97, 59, 0, 9, + 16, 27, 14, 0, 7, 58, 97, 97, 82, 97, 82, 49, + 33, 82, 33, 145, 49, 134, 130, 49, 130, 193, 194, 194, + 166, 0, 9, 96, 31, 12, 0, 6, 68, 33, 65, 67, + 49, 98, 34, 97, 49, 113, 34, 113, 34, 162, 54, 17, + 98, 49, 98, 49, 98, 65, 66, 100, 0, 8, 32, 32, + 17, 0, 8, 117, 38, 97, 98, 114, 97, 130, 82, 130, + 82, 129, 98, 121, 130, 82, 130, 82, 129, 97, 130, 97, + 130, 82, 101, 37, 0, 11, 32, 20, 9, 240, 240, 149, + 97, 114, 114, 114, 113, 114, 114, 114, 113, 114, 114, 85, + 0, 6, 16, 23, 12, 0, 6, 86, 145, 162, 162, 161, + 177, 162, 162, 161, 98, 34, 83, 34, 81, 65, 116, 0, + 8, 48, 33, 16, 0, 8, 53, 37, 97, 82, 114, 65, + 146, 49, 162, 33, 177, 18, 179, 18, 162, 34, 162, 49, + 161, 66, 130, 66, 130, 81, 101, 37, 0, 10, 64, 24, + 13, 0, 6, 117, 161, 178, 178, 178, 177, 178, 178, 178, + 97, 65, 97, 66, 97, 66, 82, 43, 0, 8, 48, 50, + 18, 0, 9, 53, 84, 99, 65, 17, 113, 18, 67, 113, + 18, 49, 18, 113, 18, 33, 33, 129, 18, 33, 33, 113, + 34, 17, 34, 113, 34, 17, 34, 113, 35, 49, 129, 35, + 34, 113, 50, 50, 113, 50, 50, 85, 17, 37, 0, 11, + 96, 40, 17, 0, 8, 116, 69, 98, 97, 113, 17, 81, + 129, 18, 65, 129, 33, 65, 129, 33, 49, 129, 50, 33, + 129, 65, 33, 129, 66, 17, 129, 67, 129, 98, 129, 98, + 101, 65, 0, 11, 64, 31, 11, 0, 6, 4, 97, 65, + 65, 97, 34, 97, 18, 113, 18, 98, 18, 98, 17, 114, + 17, 114, 17, 98, 33, 97, 65, 65, 100, 0, 7, 64, + 24, 13, 0, 6, 120, 113, 66, 82, 81, 82, 81, 82, + 66, 81, 66, 86, 114, 177, 193, 178, 178, 150, 0, 9, + 38, 11, 0, 6, 4, 97, 65, 65, 97, 34, 97, 18, + 113, 18, 98, 18, 98, 18, 98, 17, 114, 17, 33, 50, + 33, 17, 17, 33, 66, 17, 17, 100, 145, 162, 17, 115, + 240, 176, 32, 13, 0, 6, 120, 113, 66, 82, 66, 82, + 66, 82, 66, 81, 65, 102, 114, 65, 98, 65, 97, 81, + 82, 66, 82, 66, 17, 22, 50, 0, 8, 48, 27, 11, + 0, 6, 4, 97, 66, 49, 82, 49, 97, 50, 163, 147, + 147, 49, 98, 34, 97, 34, 97, 35, 65, 100, 0, 7, + 48, 27, 12, 0, 6, 26, 33, 50, 49, 33, 50, 49, + 17, 65, 65, 17, 50, 162, 162, 161, 162, 162, 161, 177, + 134, 0, 8, 32, 32, 15, 0, 7, 85, 53, 50, 113, + 82, 97, 98, 97, 97, 113, 82, 97, 98, 97, 97, 113, + 82, 97, 98, 97, 98, 97, 113, 81, 149, 0, 10, 48, + 29, 13, 0, 6, 69, 37, 34, 82, 66, 81, 82, 65, + 98, 65, 98, 49, 114, 33, 130, 33, 130, 17, 147, 163, + 162, 177, 0, 9, 64, 46, 19, 0, 9, 69, 21, 37, + 34, 82, 66, 66, 82, 65, 82, 67, 49, 98, 49, 18, + 49, 98, 49, 18, 33, 114, 33, 34, 33, 114, 17, 50, + 17, 130, 17, 51, 147, 67, 146, 82, 162, 81, 177, 97, + 0, 13, 16, 29, 17, 0, 8, 117, 38, 98, 81, 161, + 65, 178, 33, 209, 17, 226, 242, 243, 209, 18, 193, 50, + 161, 66, 146, 81, 102, 38, 0, 11, 26, 14, 0, 7, + 6, 22, 50, 81, 113, 65, 129, 49, 146, 33, 146, 17, + 178, 193, 194, 194, 193, 209, 166, 0, 9, 96, 27, 12, + 0, 6, 41, 49, 82, 49, 83, 49, 82, 146, 146, 146, + 162, 146, 81, 50, 81, 50, 97, 50, 82, 41, 0, 7, + 112, 22, 9, 240, 240, 164, 66, 113, 129, 129, 114, 113, + 129, 114, 113, 129, 129, 114, 113, 129, 131, 240, 144, 20, + 7, 240, 209, 97, 113, 97, 97, 113, 97, 97, 113, 97, + 97, 113, 97, 97, 113, 97, 240, 22, 9, 240, 240, 179, + 129, 129, 114, 113, 129, 129, 114, 113, 129, 114, 113, 129, + 129, 114, 68, 240, 128, 17, 8, 240, 240, 209, 97, 17, + 81, 33, 49, 49, 33, 81, 17, 0, 11, 112, 7, 11, + 0, 26, 26, 240, 128, 8, 3, 241, 34, 33, 240, 240, + 208, 24, 9, 0, 10, 51, 17, 50, 34, 49, 50, 34, + 49, 49, 65, 49, 50, 17, 17, 51, 36, 18, 0, 5, + 112, 28, 8, 240, 240, 66, 113, 98, 97, 113, 98, 18, + 51, 33, 34, 49, 33, 65, 18, 50, 18, 49, 34, 33, + 65, 17, 240, 240, 224, 20, 7, 0, 8, 20, 34, 33, + 33, 34, 18, 81, 97, 65, 17, 49, 49, 17, 240, 240, + 128, 29, 9, 240, 240, 194, 129, 129, 114, 113, 67, 17, + 50, 34, 49, 50, 34, 49, 49, 65, 49, 50, 17, 17, + 51, 36, 18, 0, 5, 112, 20, 7, 0, 8, 35, 34, + 33, 33, 49, 21, 33, 97, 65, 17, 49, 49, 17, 240, + 240, 128, 24, 10, 0, 5, 99, 97, 33, 97, 129, 145, + 117, 97, 145, 145, 130, 129, 145, 145, 129, 145, 145, 130, + 240, 48, 27, 9, 0, 10, 67, 17, 50, 34, 49, 50, + 34, 49, 49, 65, 49, 50, 49, 49, 69, 129, 49, 49, + 65, 49, 65, 18, 224, 30, 9, 240, 240, 130, 129, 113, + 129, 129, 114, 18, 65, 17, 33, 50, 34, 49, 49, 50, + 34, 50, 33, 33, 17, 49, 17, 33, 50, 0, 6, 21, + 7, 240, 240, 146, 82, 240, 34, 65, 17, 49, 33, 97, + 82, 81, 97, 17, 66, 240, 240, 128, 24, 9, 0, 6, + 50, 129, 240, 146, 82, 17, 81, 33, 114, 113, 129, 114, + 113, 129, 81, 33, 66, 17, 98, 240, 29, 8, 240, 240, + 66, 113, 97, 113, 113, 98, 34, 33, 33, 17, 33, 17, + 83, 66, 33, 49, 34, 17, 17, 35, 33, 50, 240, 240, + 192, 19, 5, 240, 114, 50, 49, 65, 65, 50, 49, 65, + 65, 50, 49, 65, 17, 34, 240, 208, 36, 15, 0, 17, + 18, 34, 50, 49, 17, 17, 20, 17, 33, 34, 34, 49, + 82, 34, 34, 66, 49, 49, 82, 34, 34, 17, 49, 49, + 49, 17, 65, 49, 51, 0, 9, 80, 28, 11, 0, 12, + 82, 34, 65, 17, 17, 33, 33, 34, 34, 82, 33, 82, + 34, 82, 33, 33, 49, 49, 17, 65, 50, 0, 7, 32, + 22, 8, 0, 9, 51, 50, 33, 49, 50, 18, 50, 17, + 65, 33, 65, 33, 49, 65, 17, 240, 240, 224, 27, 10, + 0, 11, 66, 34, 49, 19, 33, 66, 49, 65, 50, 50, + 50, 50, 49, 66, 34, 65, 18, 82, 129, 145, 130, 240, + 48, 23, 8, 0, 9, 35, 66, 34, 33, 50, 18, 49, + 33, 65, 33, 50, 33, 50, 37, 113, 98, 97, 114, 176, + 18, 9, 0, 10, 50, 34, 33, 21, 17, 34, 113, 114, + 114, 113, 129, 0, 6, 48, 20, 8, 0, 9, 51, 65, + 49, 49, 49, 50, 130, 49, 49, 33, 65, 49, 18, 240, + 240, 208, 20, 6, 240, 240, 49, 66, 65, 81, 53, 33, + 81, 81, 66, 65, 81, 17, 50, 240, 240, 64, 29, 11, + 0, 12, 82, 65, 49, 17, 50, 33, 33, 49, 97, 34, + 82, 17, 17, 81, 34, 33, 49, 17, 17, 17, 66, 34, + 0, 7, 32, 25, 9, 0, 10, 50, 34, 33, 17, 34, + 17, 33, 49, 65, 49, 50, 33, 65, 49, 65, 33, 81, + 17, 0, 6, 16, 32, 14, 0, 16, 2, 65, 18, 49, + 17, 50, 34, 17, 33, 49, 49, 81, 49, 49, 66, 34, + 49, 65, 49, 49, 81, 19, 49, 82, 36, 0, 9, 32, + 24, 11, 0, 12, 98, 35, 34, 34, 18, 33, 49, 33, + 113, 146, 97, 33, 98, 18, 33, 66, 34, 0, 7, 48, + 30, 10, 0, 11, 66, 65, 33, 17, 50, 65, 49, 81, + 49, 66, 34, 65, 50, 65, 19, 82, 33, 130, 65, 49, + 66, 33, 97, 17, 240, 16, 22, 8, 0, 9, 50, 17, + 49, 34, 33, 65, 82, 66, 81, 65, 17, 17, 33, 34, + 18, 240, 240, 208, 21, 7, 240, 240, 146, 65, 97, 97, + 97, 97, 81, 66, 97, 113, 81, 82, 81, 97, 97, 240, + 80, 17, 2, 161, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 112, 21, 6, 240, 193, 97, 81, + 81, 66, 65, 81, 81, 97, 50, 65, 66, 66, 66, 65, + 65, 240, 32, 14, 11, 0, 15, 35, 81, 17, 36, 33, + 17, 69, 0, 11, 16, 5, 7, 0, 19, 32, 15, 6, + 0, 7, 18, 66, 241, 81, 81, 66, 65, 66, 66, 66, + 160, 26, 8, 0, 6, 81, 97, 113, 99, 65, 17, 17, + 35, 18, 33, 17, 66, 17, 67, 98, 33, 50, 17, 82, + 240, 240, 96, 25, 15, 0, 10, 68, 161, 35, 145, 209, + 225, 165, 213, 161, 210, 164, 97, 34, 36, 49, 49, 18, + 37, 0, 9, 112, 24, 9, 0, 7, 113, 19, 33, 33, + 50, 33, 81, 33, 97, 17, 97, 17, 81, 49, 65, 33, + 20, 17, 0, 8, 24, 12, 0, 7, 84, 36, 50, 65, + 97, 49, 114, 33, 114, 17, 131, 119, 114, 134, 129, 162, + 134, 0, 8, 32, 11, 2, 161, 17, 17, 17, 209, 17, + 17, 17, 112, 34, 10, 0, 6, 100, 81, 49, 81, 65, + 65, 34, 82, 113, 18, 81, 50, 65, 66, 49, 81, 66, + 33, 98, 17, 114, 81, 49, 65, 65, 65, 49, 99, 240, + 16, 11, 7, 240, 240, 97, 33, 34, 34, 0, 13, 32, + 45, 14, 0, 7, 69, 114, 82, 65, 66, 17, 17, 49, + 34, 34, 33, 17, 49, 65, 33, 17, 34, 113, 17, 34, + 113, 17, 34, 113, 17, 49, 65, 33, 33, 34, 33, 49, + 33, 66, 49, 65, 113, 103, 0, 9, 32, 17, 6, 240, + 240, 18, 17, 17, 33, 33, 33, 33, 19, 33, 68, 0, + 8, 64, 20, 7, 0, 8, 49, 81, 17, 49, 17, 49, + 17, 50, 17, 65, 17, 65, 113, 240, 240, 144, 11, 10, + 0, 11, 41, 145, 145, 145, 0, 11, 48, 8, 6, 0, + 9, 5, 0, 6, 112, 46, 14, 0, 7, 69, 114, 82, + 65, 21, 49, 49, 33, 50, 33, 17, 49, 50, 33, 17, + 49, 49, 49, 17, 52, 65, 17, 49, 49, 49, 17, 49, + 49, 49, 33, 33, 50, 33, 33, 20, 35, 65, 113, 103, + 0, 9, 32, 8, 7, 0, 6, 22, 0, 12, 48, 16, + 7, 240, 240, 115, 49, 49, 33, 49, 18, 33, 49, 33, + 51, 0, 10, 19, 16, 0, 12, 113, 241, 241, 241, 143, + 129, 241, 241, 241, 241, 240, 159, 0, 8, 16, 17, 8, + 240, 240, 211, 65, 49, 50, 33, 97, 82, 66, 81, 19, + 0, 10, 48, 18, 7, 240, 240, 115, 65, 33, 82, 50, + 113, 34, 33, 33, 34, 50, 0, 8, 48, 9, 5, 240, + 194, 34, 33, 0, 9, 32, 29, 11, 0, 12, 97, 50, + 81, 49, 81, 65, 81, 50, 81, 49, 82, 49, 33, 34, + 34, 17, 33, 19, 18, 49, 161, 177, 161, 240, 80, 36, + 9, 240, 240, 134, 35, 33, 36, 17, 52, 17, 51, 33, + 66, 33, 81, 17, 81, 33, 81, 33, 81, 17, 97, 17, + 81, 33, 81, 33, 81, 17, 97, 17, 240, 240, 48, 9, + 4, 240, 240, 227, 33, 240, 240, 128, 10, 4, 0, 8, + 97, 49, 17, 17, 33, 96, 14, 6, 240, 240, 65, 65, + 81, 81, 81, 65, 81, 52, 0, 7, 16, 6, 240, 240, + 35, 33, 33, 17, 49, 17, 33, 50, 52, 0, 8, 64, + 19, 7, 0, 9, 17, 81, 17, 65, 18, 49, 17, 49, + 17, 49, 17, 81, 240, 240, 160, 36, 14, 0, 9, 33, + 81, 82, 81, 113, 65, 129, 65, 114, 49, 50, 49, 49, + 65, 36, 33, 49, 129, 49, 17, 97, 49, 18, 97, 38, + 65, 97, 81, 98, 0, 9, 16, 38, 14, 0, 9, 33, + 81, 82, 81, 113, 65, 129, 65, 114, 49, 34, 65, 49, + 18, 33, 20, 33, 33, 33, 97, 82, 81, 81, 113, 50, + 113, 50, 33, 65, 65, 18, 0, 9, 16, 41, 14, 0, + 9, 3, 81, 81, 33, 49, 130, 33, 114, 65, 82, 33, + 33, 50, 17, 49, 17, 65, 33, 34, 17, 49, 66, 33, + 49, 17, 97, 49, 18, 97, 38, 65, 97, 81, 98, 0, + 9, 16, 21, 8, 0, 9, 82, 98, 81, 81, 33, 113, + 98, 66, 81, 97, 65, 33, 65, 33, 65, 52, 176, 29, + 14, 240, 130, 209, 240, 193, 209, 194, 179, 179, 161, 18, + 145, 34, 145, 34, 134, 113, 66, 113, 66, 97, 82, 54, + 37, 0, 8, 112, 29, 15, 240, 194, 194, 240, 193, 225, + 210, 195, 195, 177, 18, 161, 34, 161, 34, 150, 129, 66, + 129, 66, 113, 82, 70, 37, 0, 9, 80, 30, 14, 240, + 161, 178, 17, 240, 161, 209, 194, 179, 179, 161, 18, 145, + 34, 145, 34, 134, 113, 66, 113, 66, 97, 82, 54, 37, + 0, 8, 112, 30, 15, 240, 146, 33, 195, 240, 177, 225, + 210, 195, 195, 177, 18, 161, 34, 161, 34, 150, 129, 66, + 129, 66, 113, 82, 70, 37, 0, 9, 80, 31, 15, 240, + 145, 49, 161, 34, 240, 177, 225, 210, 195, 195, 177, 18, + 161, 34, 161, 34, 150, 129, 66, 129, 66, 113, 82, 70, + 37, 0, 9, 80, 31, 14, 162, 177, 33, 161, 33, 178, + 193, 209, 194, 179, 179, 161, 18, 145, 34, 145, 34, 134, + 113, 66, 113, 66, 97, 82, 54, 37, 0, 8, 112, 41, + 21, 0, 11, 106, 194, 82, 179, 97, 161, 18, 49, 193, + 33, 49, 209, 18, 49, 193, 38, 177, 50, 33, 182, 49, + 49, 97, 66, 49, 33, 113, 66, 97, 97, 81, 98, 53, + 42, 0, 13, 80, 32, 11, 0, 6, 4, 97, 66, 49, + 97, 34, 97, 33, 113, 18, 146, 146, 145, 113, 33, 113, + 33, 97, 65, 65, 100, 113, 177, 114, 17, 131, 240, 48, + 33, 14, 240, 97, 225, 240, 122, 97, 97, 82, 97, 82, + 49, 33, 82, 49, 129, 49, 134, 130, 49, 130, 97, 81, + 97, 82, 97, 82, 97, 59, 0, 9, 16, 33, 14, 240, + 146, 177, 240, 106, 97, 97, 82, 97, 82, 49, 33, 82, + 49, 129, 49, 134, 130, 49, 130, 97, 81, 97, 82, 97, + 82, 97, 59, 0, 9, 16, 34, 14, 240, 114, 177, 33, + 240, 90, 97, 97, 82, 97, 82, 49, 33, 82, 49, 129, + 49, 134, 130, 49, 130, 97, 81, 97, 82, 97, 82, 97, + 59, 0, 9, 16, 35, 14, 240, 97, 34, 130, 34, 240, + 74, 97, 97, 82, 97, 82, 49, 33, 82, 49, 129, 49, + 134, 130, 49, 130, 97, 81, 97, 82, 97, 82, 97, 59, + 0, 9, 16, 20, 9, 210, 129, 245, 97, 114, 114, 114, + 113, 114, 114, 114, 113, 114, 114, 85, 0, 6, 16, 21, + 10, 240, 49, 129, 245, 113, 130, 130, 130, 129, 130, 130, + 130, 129, 130, 130, 101, 0, 6, 112, 22, 9, 242, 97, + 17, 81, 117, 97, 114, 114, 114, 113, 114, 114, 114, 113, + 114, 114, 85, 0, 6, 16, 22, 10, 226, 33, 82, 33, + 229, 113, 130, 130, 130, 129, 130, 130, 130, 129, 130, 130, + 101, 0, 6, 112, 31, 14, 0, 7, 56, 129, 81, 98, + 82, 82, 82, 82, 82, 81, 98, 39, 50, 66, 98, 66, + 97, 81, 98, 66, 97, 82, 81, 73, 0, 9, 48, 42, + 17, 240, 165, 240, 240, 180, 69, 98, 97, 113, 17, 81, + 129, 18, 65, 129, 33, 65, 129, 33, 49, 129, 50, 33, + 129, 65, 33, 129, 66, 17, 129, 67, 129, 98, 129, 98, + 101, 65, 0, 11, 64, 33, 11, 240, 17, 177, 240, 68, + 97, 65, 65, 97, 34, 97, 18, 113, 18, 98, 18, 98, + 17, 114, 17, 114, 17, 98, 33, 97, 65, 65, 100, 0, + 7, 64, 33, 11, 240, 66, 129, 240, 52, 97, 65, 65, + 97, 34, 97, 18, 113, 18, 98, 18, 98, 17, 114, 17, + 114, 17, 98, 33, 97, 65, 65, 100, 0, 7, 64, 34, + 11, 113, 146, 129, 33, 240, 36, 97, 65, 65, 97, 34, + 97, 18, 113, 18, 98, 18, 98, 17, 114, 17, 114, 17, + 98, 33, 97, 65, 65, 100, 0, 7, 64, 32, 11, 240, + 21, 240, 196, 97, 65, 65, 97, 34, 97, 18, 113, 18, + 98, 18, 98, 17, 114, 17, 114, 17, 98, 33, 97, 65, + 65, 100, 0, 7, 64, 35, 11, 240, 17, 34, 97, 49, + 240, 20, 97, 65, 65, 97, 34, 97, 18, 113, 18, 98, + 18, 98, 17, 114, 17, 114, 17, 98, 33, 97, 65, 65, + 100, 0, 7, 64, 28, 12, 0, 10, 65, 145, 33, 113, + 65, 81, 97, 49, 129, 17, 161, 161, 17, 129, 49, 97, + 81, 65, 113, 33, 145, 0, 6, 16, 40, 13, 0, 7, + 20, 33, 81, 66, 81, 82, 66, 65, 17, 50, 65, 33, + 50, 49, 34, 50, 33, 50, 50, 17, 66, 49, 33, 66, + 49, 17, 66, 66, 81, 82, 65, 81, 36, 0, 8, 112, + 34, 15, 240, 97, 241, 240, 133, 53, 50, 113, 82, 97, + 98, 97, 97, 113, 82, 97, 98, 97, 97, 113, 82, 97, + 98, 97, 98, 97, 113, 81, 149, 0, 10, 48, 34, 15, + 240, 146, 193, 240, 117, 53, 50, 113, 82, 97, 98, 97, + 97, 113, 82, 97, 98, 97, 97, 113, 82, 97, 98, 97, + 98, 97, 113, 81, 149, 0, 10, 48, 35, 15, 129, 210, + 193, 33, 240, 101, 53, 50, 113, 82, 97, 98, 97, 97, + 113, 82, 97, 98, 97, 97, 113, 82, 97, 98, 97, 98, + 97, 113, 81, 149, 0, 10, 48, 36, 15, 240, 97, 34, + 161, 34, 240, 85, 53, 50, 113, 82, 97, 98, 97, 97, + 113, 82, 97, 98, 97, 97, 113, 82, 97, 98, 97, 98, + 97, 113, 81, 149, 0, 10, 48, 28, 14, 240, 114, 177, + 240, 86, 22, 50, 81, 113, 65, 129, 49, 146, 33, 146, + 17, 178, 193, 194, 194, 193, 209, 166, 0, 9, 96, 24, + 13, 0, 6, 118, 145, 178, 182, 114, 65, 97, 82, 66, + 82, 66, 81, 82, 65, 102, 98, 178, 150, 0, 9, 36, + 11, 0, 6, 35, 113, 49, 81, 65, 81, 65, 81, 49, + 82, 18, 97, 49, 97, 50, 81, 50, 66, 50, 65, 17, + 33, 83, 33, 66, 19, 81, 161, 161, 146, 240, 80, 27, + 9, 0, 6, 1, 145, 129, 243, 17, 50, 34, 49, 50, + 34, 49, 49, 65, 49, 50, 17, 17, 51, 36, 18, 0, + 5, 112, 27, 9, 0, 6, 50, 113, 113, 227, 17, 50, + 34, 49, 50, 34, 49, 49, 65, 49, 50, 17, 17, 51, + 36, 18, 0, 5, 112, 28, 9, 0, 6, 33, 114, 97, + 33, 211, 17, 50, 34, 49, 50, 34, 49, 49, 65, 49, + 50, 17, 17, 51, 36, 18, 0, 5, 112, 28, 9, 0, + 6, 3, 17, 98, 240, 115, 17, 50, 34, 49, 50, 34, + 49, 49, 65, 49, 50, 17, 17, 51, 36, 18, 0, 5, + 112, 29, 9, 0, 6, 1, 34, 65, 34, 240, 99, 17, + 50, 34, 49, 50, 34, 49, 49, 65, 49, 50, 17, 17, + 51, 36, 18, 0, 5, 112, 28, 9, 0, 6, 19, 81, + 33, 98, 227, 17, 50, 34, 49, 50, 34, 49, 49, 65, + 49, 50, 17, 17, 51, 36, 18, 0, 5, 112, 30, 12, + 0, 13, 99, 17, 18, 50, 35, 33, 33, 50, 33, 34, + 49, 18, 49, 66, 81, 50, 97, 33, 17, 49, 35, 34, + 17, 0, 7, 112, 24, 8, 0, 9, 52, 50, 33, 49, + 34, 34, 97, 113, 65, 33, 49, 65, 17, 82, 81, 17, + 65, 33, 82, 208, 23, 7, 240, 240, 129, 98, 97, 195, + 34, 33, 33, 49, 21, 33, 97, 65, 17, 49, 49, 17, + 240, 240, 128, 24, 9, 0, 6, 50, 98, 97, 240, 19, + 66, 33, 65, 49, 53, 65, 129, 65, 49, 49, 81, 17, + 0, 6, 32, 24, 8, 240, 240, 241, 98, 66, 33, 195, + 50, 33, 49, 49, 37, 49, 113, 65, 33, 49, 65, 17, + 240, 240, 224, 25, 9, 0, 6, 1, 33, 81, 34, 240, + 115, 66, 33, 65, 49, 53, 65, 129, 65, 49, 49, 81, + 17, 0, 6, 32, 21, 6, 240, 240, 34, 81, 240, 18, + 49, 17, 33, 33, 81, 66, 65, 81, 17, 50, 240, 240, + 32, 21, 8, 0, 5, 97, 97, 97, 210, 81, 17, 65, + 33, 113, 98, 97, 113, 17, 82, 240, 240, 224, 23, 7, + 240, 240, 145, 81, 17, 49, 33, 162, 65, 17, 49, 33, + 97, 82, 81, 97, 17, 66, 240, 240, 128, 23, 8, 240, + 240, 194, 18, 50, 18, 240, 66, 81, 17, 65, 33, 113, + 98, 97, 113, 17, 82, 240, 240, 224, 26, 9, 0, 6, + 18, 131, 68, 129, 84, 50, 34, 49, 50, 34, 50, 33, + 65, 49, 65, 49, 49, 81, 17, 0, 6, 32, 32, 11, + 0, 7, 66, 129, 34, 240, 178, 34, 65, 17, 17, 33, + 33, 34, 34, 82, 33, 82, 34, 82, 33, 33, 49, 49, + 17, 65, 50, 0, 7, 32, 25, 8, 240, 240, 209, 114, + 113, 227, 50, 33, 49, 50, 18, 50, 17, 65, 33, 65, + 33, 49, 65, 17, 240, 240, 224, 26, 9, 0, 6, 50, + 98, 97, 240, 19, 66, 33, 65, 50, 34, 50, 33, 65, + 49, 65, 49, 49, 81, 17, 0, 6, 32, 26, 8, 240, + 240, 241, 98, 66, 33, 195, 50, 33, 49, 50, 18, 50, + 17, 65, 33, 65, 33, 49, 65, 17, 240, 240, 224, 26, + 9, 0, 6, 2, 33, 98, 240, 131, 66, 33, 65, 50, + 34, 50, 33, 65, 49, 65, 49, 49, 81, 17, 0, 6, + 32, 27, 9, 0, 6, 1, 34, 65, 34, 240, 115, 66, + 33, 65, 50, 34, 50, 33, 65, 49, 65, 49, 49, 81, + 17, 0, 6, 32, 16, 16, 0, 14, 114, 226, 0, 6, + 127, 0, 7, 2, 226, 0, 8, 112, 25, 9, 0, 10, + 84, 50, 33, 65, 35, 34, 17, 18, 33, 17, 33, 50, + 49, 49, 49, 49, 17, 17, 0, 6, 16, 33, 11, 0, + 7, 65, 161, 177, 240, 34, 65, 49, 17, 50, 33, 33, + 49, 97, 34, 82, 17, 17, 81, 34, 33, 49, 17, 17, + 17, 66, 34, 0, 7, 32, 33, 11, 0, 7, 113, 146, + 129, 240, 34, 65, 49, 17, 50, 33, 33, 49, 97, 34, + 82, 17, 17, 81, 34, 33, 49, 17, 17, 17, 66, 34, + 0, 7, 32, 33, 11, 0, 7, 81, 162, 114, 240, 50, + 65, 49, 17, 50, 33, 33, 49, 97, 34, 82, 17, 17, + 81, 34, 33, 49, 17, 17, 17, 66, 34, 0, 7, 32, + 34, 11, 0, 7, 50, 33, 98, 33, 240, 178, 65, 49, + 17, 50, 33, 33, 49, 97, 34, 82, 17, 17, 81, 34, + 33, 49, 17, 17, 17, 66, 34, 0, 7, 32, 33, 10, + 0, 7, 33, 130, 113, 242, 65, 33, 17, 50, 65, 49, + 81, 49, 66, 34, 65, 50, 65, 19, 82, 33, 130, 65, + 49, 66, 33, 97, 17, 240, 16, 31, 11, 0, 6, 18, + 161, 146, 145, 161, 146, 18, 99, 33, 82, 49, 81, 50, + 66, 50, 66, 49, 82, 34, 81, 18, 98, 145, 161, 133, + 240, 32, 35, 10, 0, 6, 98, 33, 82, 33, 240, 130, + 65, 33, 17, 50, 65, 49, 81, 49, 66, 34, 65, 50, + 65, 19, 82, 33, 130, 65, 49, 66, 33, 97, 17, 240, + 16, +}; + +//***************************************************************************** +// +// The glyph offset table for the 18 point Oldstandard italic font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard18i[] = +{ + 0, 5, 23, 36, 64, 104, 144, 178, + 187, 208, 230, 248, 270, 280, 288, 296, + 318, 347, 366, 393, 417, 440, 464, 492, + 514, 542, 570, 581, 594, 615, 626, 648, + 670, 718, 745, 775, 803, 834, 865, 892, + 923, 955, 975, 998, 1031, 1055, 1105, 1145, + 1176, 1200, 1238, 1270, 1297, 1324, 1356, 1385, + 1431, 1460, 1486, 1513, 1535, 1555, 1577, 1594, + 1601, 1609, 1633, 1661, 1681, 1710, 1730, 1754, + 1781, 1811, 1832, 1856, 1885, 1904, 1940, 1968, + 1990, 2017, 2040, 2058, 2078, 2098, 2127, 2152, + 2184, 2208, 2238, 2260, 2281, 2298, 2319, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2333, 2338, 2353, 2379, 2404, 2428, 2452, 2463, + 2497, 2508, 2553, 2570, 2590, 2601, 2609, 2655, + 2663, 2679, 2698, 2715, 2733, 2742, 2771, 2807, + 2816, 2826, 2840, 2856, 2875, 2911, 2949, 2990, + 3011, 3040, 3069, 3099, 3129, 3160, 3191, 3232, + 3264, 3297, 3330, 3364, 3399, 3419, 3440, 3462, + 3484, 3515, 3557, 3590, 3623, 3657, 3689, 3724, + 3752, 3792, 3826, 3860, 3895, 3931, 3959, 3983, + 4019, 4046, 4073, 4101, 4129, 4158, 4186, 4216, + 4240, 4263, 4287, 4311, 4336, 4357, 4378, 4401, + 4424, 4450, 4482, 4507, 4533, 4559, 4585, 4612, + 4628, 4653, 4686, 4719, 4752, 4786, 4819, 4850, +}; + +//***************************************************************************** +// +// The font definition for the 18 point Oldstandard italic font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard18i = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 19, + + // + // The height of the font. + // + 22, + + // + // The baseline of the font. + // + 17, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard18i, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard18iData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard20.c b/third_party/fonts/ofl/fonts/fontoldstandard20.c new file mode 100644 index 0000000..f3abf9b --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard20.c @@ -0,0 +1,645 @@ +//***************************************************************************** +// +// fontoldstandard20.c - Font definition for the 20pt Oldstandard font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 20 point +// Bold: no +// Italic: no +// Memory usage: 5304 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 20 point Oldstandard font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard20Data[5103] = +{ + 5, 9, 0, 28, 16, 16, 4, 240, 146, 34, 34, 34, + 34, 34, 33, 49, 49, 178, 34, 240, 176, 13, 7, 240, + 240, 82, 18, 34, 18, 34, 18, 0, 15, 16, 30, 12, + 0, 9, 49, 49, 113, 49, 113, 49, 74, 81, 33, 129, + 33, 113, 49, 113, 49, 90, 65, 49, 113, 49, 113, 33, + 177, 0, 9, 96, 51, 11, 0, 5, 113, 17, 129, 17, + 117, 81, 17, 17, 17, 49, 33, 17, 33, 33, 33, 17, + 18, 34, 17, 17, 17, 69, 132, 113, 19, 65, 17, 17, + 33, 34, 17, 17, 33, 33, 33, 17, 33, 33, 33, 17, + 17, 70, 113, 17, 0, 7, 64, 40, 16, 0, 12, 20, + 178, 34, 49, 98, 34, 49, 98, 34, 33, 114, 34, 33, + 146, 49, 225, 50, 161, 33, 33, 129, 34, 34, 97, 50, + 34, 97, 50, 34, 81, 66, 34, 180, 0, 12, 48, 34, + 16, 0, 12, 67, 178, 49, 162, 49, 162, 34, 180, 210, + 53, 83, 66, 82, 34, 49, 97, 66, 33, 82, 81, 17, + 98, 82, 115, 67, 133, 36, 0, 12, 48, 9, 4, 240, + 82, 34, 34, 0, 8, 96, 23, 6, 240, 240, 49, 66, + 65, 65, 81, 65, 81, 81, 81, 81, 81, 81, 97, 81, + 81, 97, 97, 240, 80, 22, 6, 240, 241, 81, 97, 97, + 81, 81, 97, 81, 81, 81, 81, 81, 65, 81, 81, 65, + 65, 240, 128, 23, 9, 0, 7, 18, 65, 34, 17, 34, + 17, 18, 67, 81, 17, 17, 49, 33, 33, 82, 114, 0, + 12, 112, 37, 19, 0, 15, 33, 240, 49, 240, 49, 240, + 49, 240, 49, 240, 49, 240, 49, 240, 49, 175, 2, 161, + 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, + 0, 8, 48, 12, 5, 0, 10, 3, 35, 65, 65, 49, + 49, 240, 64, 7, 7, 0, 12, 37, 0, 9, 8, 4, + 0, 8, 66, 34, 240, 176, 24, 9, 0, 6, 49, 113, + 129, 129, 113, 129, 129, 113, 129, 129, 113, 129, 129, 113, + 129, 129, 113, 129, 240, 176, 31, 12, 0, 9, 52, 113, + 65, 81, 97, 65, 97, 50, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 49, 97, 65, 97, 81, 65, 116, 0, 9, + 80, 20, 8, 0, 6, 49, 98, 68, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 70, 0, 6, 32, 26, 10, 0, + 7, 100, 81, 50, 49, 82, 34, 66, 35, 50, 129, 129, + 129, 129, 129, 65, 49, 81, 40, 40, 0, 7, 96, 26, + 11, 0, 8, 53, 82, 66, 51, 50, 81, 50, 145, 85, + 178, 162, 146, 35, 66, 35, 66, 33, 82, 69, 0, 8, + 112, 25, 11, 0, 9, 1, 146, 131, 113, 18, 113, 18, + 97, 34, 81, 50, 65, 66, 73, 114, 146, 146, 118, 0, + 8, 64, 28, 11, 0, 7, 1, 81, 70, 81, 161, 161, + 161, 20, 82, 50, 65, 82, 146, 146, 35, 66, 35, 65, + 50, 66, 69, 0, 8, 112, 30, 11, 0, 8, 84, 97, + 65, 65, 66, 65, 146, 20, 67, 50, 50, 82, 34, 82, + 34, 82, 34, 82, 49, 81, 66, 50, 100, 0, 8, 96, + 21, 10, 0, 7, 72, 40, 33, 97, 129, 145, 129, 129, + 145, 130, 115, 115, 115, 115, 0, 8, 16, 30, 11, 0, + 8, 69, 82, 50, 50, 82, 34, 82, 35, 65, 68, 17, + 116, 82, 36, 34, 82, 34, 82, 34, 82, 50, 50, 85, + 0, 8, 96, 30, 10, 0, 7, 100, 82, 49, 50, 65, + 50, 66, 34, 66, 34, 66, 50, 35, 67, 18, 130, 49, + 65, 66, 49, 65, 49, 99, 0, 8, 16, 11, 4, 240, + 240, 162, 34, 240, 114, 34, 240, 176, 15, 5, 0, 6, + 35, 35, 240, 114, 51, 65, 65, 49, 49, 240, 64, 31, + 18, 0, 15, 34, 226, 226, 226, 226, 226, 226, 226, 240, + 33, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, + 50, 240, 49, 0, 7, 16, 13, 19, 0, 26, 31, 2, + 0, 7, 63, 2, 0, 21, 80, 31, 18, 0, 13, 66, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 17, 242, 226, 226, 226, 226, 226, 241, 0, + 8, 96, 25, 9, 0, 6, 116, 65, 66, 35, 49, 49, + 65, 113, 113, 113, 113, 33, 81, 33, 98, 240, 18, 114, + 0, 7, 32, 50, 16, 0, 10, 70, 145, 98, 97, 66, + 17, 17, 65, 50, 34, 17, 50, 34, 49, 49, 33, 50, + 49, 49, 33, 34, 65, 49, 33, 34, 65, 49, 33, 34, + 49, 49, 49, 34, 49, 49, 65, 36, 19, 81, 240, 18, + 97, 150, 0, 12, 96, 29, 16, 0, 10, 97, 241, 227, + 211, 211, 193, 34, 177, 34, 177, 49, 161, 66, 151, 145, + 82, 113, 98, 113, 98, 85, 39, 0, 12, 32, 32, 13, + 0, 8, 25, 98, 66, 82, 82, 66, 82, 66, 82, 66, + 66, 86, 114, 66, 82, 82, 66, 82, 66, 82, 66, 82, + 66, 66, 57, 0, 10, 32, 30, 13, 0, 8, 68, 49, + 65, 68, 50, 98, 49, 114, 34, 129, 34, 178, 178, 178, + 178, 129, 49, 129, 50, 97, 81, 81, 117, 0, 10, 48, + 32, 15, 0, 9, 57, 130, 82, 98, 98, 82, 113, 82, + 114, 66, 114, 66, 114, 66, 114, 66, 114, 66, 114, 66, + 98, 82, 98, 82, 82, 73, 0, 12, 31, 13, 0, 8, + 27, 66, 97, 66, 97, 66, 97, 66, 49, 114, 49, 114, + 49, 118, 114, 49, 114, 49, 114, 97, 66, 97, 66, 97, + 43, 0, 10, 29, 13, 0, 8, 27, 66, 97, 66, 97, + 66, 97, 66, 49, 114, 49, 114, 49, 118, 114, 49, 114, + 49, 114, 178, 178, 150, 0, 10, 80, 34, 15, 0, 9, + 101, 33, 97, 83, 82, 98, 81, 114, 66, 129, 66, 210, + 210, 86, 34, 114, 66, 114, 81, 114, 82, 83, 97, 81, + 17, 117, 33, 0, 11, 96, 34, 16, 0, 10, 6, 38, + 66, 98, 98, 98, 98, 98, 98, 98, 98, 98, 106, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, + 38, 0, 12, 32, 21, 8, 240, 240, 166, 66, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 6, + 32, 24, 11, 0, 7, 38, 114, 146, 146, 146, 146, 146, + 146, 146, 66, 50, 66, 50, 65, 66, 65, 65, 100, 0, + 9, 35, 15, 0, 9, 54, 37, 66, 82, 98, 81, 114, + 65, 130, 49, 146, 33, 162, 19, 147, 18, 146, 50, 130, + 50, 130, 66, 114, 66, 114, 82, 70, 22, 0, 11, 64, + 23, 13, 0, 8, 22, 146, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 97, 66, 97, 66, 82, 43, 0, 10, 52, + 17, 0, 10, 85, 100, 67, 83, 99, 83, 97, 17, 65, + 18, 97, 18, 49, 18, 97, 18, 49, 18, 97, 33, 49, + 18, 97, 34, 17, 34, 97, 34, 17, 34, 97, 49, 17, + 34, 97, 50, 50, 97, 50, 50, 97, 50, 50, 69, 33, + 22, 0, 13, 42, 16, 0, 10, 4, 85, 67, 97, 100, + 81, 97, 18, 81, 97, 34, 65, 97, 34, 65, 97, 50, + 49, 97, 66, 33, 97, 66, 33, 97, 82, 17, 97, 99, + 97, 99, 97, 114, 69, 97, 0, 12, 64, 33, 14, 0, + 9, 36, 130, 66, 82, 98, 65, 129, 50, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 49, 129, 66, 98, + 82, 66, 132, 0, 11, 32, 27, 13, 0, 8, 25, 98, + 66, 82, 82, 66, 82, 66, 82, 66, 82, 66, 66, 86, + 114, 178, 178, 178, 178, 150, 0, 10, 80, 42, 14, 0, + 9, 36, 130, 66, 82, 98, 65, 129, 50, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 49, 50, 49, 66, + 17, 33, 18, 83, 35, 133, 33, 146, 33, 161, 33, 163, + 240, 240, 240, 35, 15, 0, 9, 57, 130, 81, 114, 82, + 98, 82, 98, 82, 98, 66, 118, 146, 65, 130, 66, 114, + 66, 114, 66, 114, 66, 33, 66, 67, 17, 38, 51, 0, + 11, 80, 29, 11, 0, 7, 20, 97, 66, 49, 97, 49, + 97, 49, 178, 149, 133, 147, 33, 113, 33, 113, 34, 97, + 35, 65, 49, 36, 0, 8, 96, 28, 14, 0, 8, 108, + 34, 50, 50, 33, 66, 65, 33, 66, 65, 114, 65, 114, + 194, 194, 194, 194, 194, 194, 194, 151, 0, 11, 16, 34, + 16, 0, 10, 6, 53, 66, 113, 98, 113, 98, 113, 98, + 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, + 113, 113, 113, 114, 81, 165, 0, 12, 96, 29, 16, 0, + 10, 7, 37, 82, 97, 114, 97, 114, 81, 146, 65, 146, + 65, 162, 33, 178, 33, 178, 33, 195, 211, 211, 225, 241, + 0, 13, 52, 22, 0, 13, 102, 22, 22, 66, 82, 82, + 98, 82, 81, 130, 49, 17, 81, 130, 49, 18, 65, 130, + 49, 18, 49, 161, 49, 33, 49, 162, 17, 50, 33, 162, + 17, 50, 17, 178, 17, 50, 17, 194, 83, 194, 82, 210, + 82, 225, 97, 0, 17, 64, 32, 16, 0, 10, 22, 22, + 83, 65, 146, 65, 147, 33, 178, 17, 210, 226, 227, 193, + 18, 193, 34, 161, 50, 145, 82, 129, 83, 70, 38, 0, + 12, 32, 28, 15, 0, 9, 54, 37, 66, 97, 114, 81, + 115, 49, 146, 49, 162, 17, 178, 17, 194, 210, 210, 210, + 210, 210, 182, 0, 11, 112, 29, 13, 0, 8, 42, 50, + 82, 65, 82, 65, 83, 162, 162, 163, 162, 162, 81, 82, + 81, 66, 97, 51, 82, 50, 98, 42, 0, 10, 16, 22, + 6, 240, 244, 34, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 68, 224, 24, 9, 240, + 240, 241, 129, 145, 129, 129, 145, 129, 129, 145, 129, 129, + 145, 129, 129, 145, 129, 129, 145, 240, 80, 22, 6, 240, + 244, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 36, 224, 19, 10, 0, 7, 113, + 146, 113, 17, 113, 33, 81, 65, 49, 81, 49, 97, 0, + 15, 32, 8, 12, 0, 31, 74, 240, 240, 128, 9, 5, + 240, 241, 81, 81, 0, 10, 32, 24, 11, 0, 14, 4, + 97, 50, 82, 34, 146, 101, 66, 50, 66, 50, 17, 34, + 35, 17, 51, 19, 0, 8, 80, 30, 9, 240, 240, 242, + 114, 114, 114, 114, 114, 18, 67, 33, 50, 50, 34, 50, + 34, 50, 34, 50, 34, 50, 34, 49, 49, 19, 0, 7, + 32, 20, 9, 0, 11, 68, 65, 65, 34, 50, 34, 49, + 50, 114, 114, 129, 65, 68, 0, 7, 16, 30, 10, 0, + 6, 115, 130, 130, 130, 130, 67, 18, 49, 51, 34, 66, + 34, 66, 34, 66, 34, 66, 34, 66, 49, 51, 67, 18, + 0, 7, 96, 19, 10, 0, 12, 100, 82, 34, 50, 65, + 50, 65, 56, 34, 130, 145, 65, 84, 0, 8, 23, 8, + 240, 240, 195, 66, 18, 50, 18, 50, 98, 84, 82, 98, + 98, 98, 98, 98, 98, 98, 0, 6, 80, 28, 12, 0, + 15, 36, 19, 34, 68, 34, 66, 66, 66, 81, 65, 116, + 98, 161, 199, 81, 97, 49, 113, 49, 113, 67, 19, 240, + 208, 30, 10, 0, 6, 35, 130, 130, 130, 130, 130, 19, + 67, 34, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 0, 7, 96, 16, 4, 240, 146, 34, + 162, 34, 34, 34, 34, 34, 34, 34, 34, 240, 176, 24, + 7, 240, 240, 242, 82, 240, 66, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 34, 18, 34, 18, 51, 240, 32, 29, + 10, 0, 6, 34, 130, 130, 130, 130, 130, 50, 50, 49, + 66, 33, 82, 17, 101, 82, 33, 82, 34, 66, 50, 50, + 51, 0, 7, 96, 19, 4, 240, 82, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 240, 176, 34, + 14, 0, 17, 66, 19, 35, 51, 35, 34, 34, 50, 50, + 34, 50, 50, 34, 50, 50, 34, 50, 50, 34, 50, 50, + 34, 50, 50, 34, 50, 50, 0, 10, 96, 24, 9, 0, + 11, 34, 19, 51, 34, 34, 50, 34, 50, 34, 50, 34, + 50, 34, 50, 34, 50, 34, 50, 0, 7, 22, 10, 0, + 12, 100, 82, 49, 50, 66, 34, 66, 34, 66, 34, 66, + 34, 66, 49, 50, 84, 0, 8, 27, 9, 0, 11, 34, + 18, 67, 33, 50, 50, 34, 50, 34, 50, 34, 50, 34, + 50, 34, 49, 53, 66, 114, 114, 114, 240, 160, 29, 10, + 0, 12, 99, 33, 49, 49, 17, 34, 66, 34, 66, 34, + 66, 34, 66, 34, 66, 49, 51, 67, 18, 130, 130, 130, + 130, 240, 112, 19, 8, 0, 10, 2, 19, 35, 18, 35, + 17, 50, 98, 98, 98, 98, 98, 0, 6, 96, 21, 9, + 0, 11, 52, 65, 65, 49, 131, 132, 49, 51, 33, 81, + 34, 65, 33, 20, 0, 7, 16, 22, 8, 0, 6, 33, + 113, 113, 98, 85, 66, 98, 98, 98, 98, 98, 33, 50, + 33, 67, 0, 6, 48, 24, 9, 0, 11, 34, 50, 34, + 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, + 35, 51, 18, 0, 7, 20, 11, 0, 13, 99, 51, 50, + 65, 81, 49, 98, 33, 113, 33, 115, 146, 146, 145, 0, + 9, 30, 15, 0, 18, 98, 51, 35, 34, 65, 65, 65, + 66, 33, 82, 35, 33, 97, 33, 17, 33, 99, 35, 130, + 50, 130, 49, 145, 65, 0, 12, 22, 10, 0, 12, 67, + 35, 50, 33, 98, 17, 114, 130, 130, 113, 18, 81, 50, + 50, 51, 0, 7, 96, 27, 11, 0, 13, 99, 51, 50, + 65, 81, 49, 98, 33, 113, 33, 113, 17, 131, 146, 145, + 161, 98, 33, 98, 17, 130, 240, 240, 20, 9, 0, 11, + 39, 33, 65, 49, 50, 98, 113, 114, 98, 49, 49, 65, + 34, 35, 0, 7, 22, 5, 240, 193, 49, 65, 65, 66, + 65, 65, 65, 34, 66, 65, 65, 50, 49, 65, 65, 81, + 240, 32, 21, 3, 241, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 128, 22, + 5, 240, 161, 81, 65, 65, 50, 49, 65, 65, 82, 34, + 49, 65, 66, 65, 65, 65, 49, 240, 64, 14, 13, 0, + 21, 35, 97, 33, 36, 49, 33, 85, 0, 14, 112, 5, + 9, 0, 28, 16, 16, 4, 240, 240, 162, 34, 161, 49, + 49, 50, 34, 34, 34, 34, 34, 160, 31, 9, 0, 9, + 49, 129, 116, 65, 17, 33, 34, 17, 18, 34, 17, 17, + 50, 17, 82, 17, 82, 17, 97, 17, 33, 68, 97, 129, + 240, 240, 176, 26, 13, 0, 10, 68, 130, 49, 98, 50, + 98, 178, 148, 180, 146, 178, 178, 130, 17, 129, 35, 50, + 35, 52, 0, 10, 16, 27, 11, 0, 11, 1, 35, 33, + 50, 50, 65, 81, 49, 113, 33, 113, 33, 113, 49, 81, + 65, 81, 49, 21, 17, 0, 11, 32, 25, 12, 0, 9, + 4, 51, 50, 81, 82, 49, 98, 49, 114, 17, 131, 120, + 114, 120, 114, 162, 162, 134, 0, 9, 64, 17, 3, 241, + 33, 33, 33, 33, 33, 33, 177, 33, 33, 33, 33, 33, + 33, 176, 33, 10, 0, 7, 99, 97, 34, 81, 34, 82, + 146, 113, 18, 81, 51, 49, 67, 33, 97, 35, 65, 51, + 33, 99, 130, 145, 82, 33, 81, 49, 99, 240, 160, 11, + 8, 0, 7, 2, 34, 34, 34, 0, 16, 32, 46, 17, + 0, 11, 37, 162, 82, 113, 50, 65, 81, 34, 34, 49, + 49, 49, 129, 49, 34, 145, 33, 34, 145, 33, 34, 145, + 33, 34, 145, 33, 49, 65, 49, 65, 34, 49, 49, 81, + 51, 49, 113, 113, 151, 0, 13, 64, 17, 8, 0, 6, + 4, 98, 66, 17, 65, 33, 17, 50, 17, 53, 0, 13, + 48, 21, 7, 0, 9, 97, 33, 33, 33, 49, 33, 49, + 33, 49, 33, 49, 33, 65, 33, 0, 6, 48, 11, 12, + 0, 18, 10, 177, 177, 177, 0, 13, 96, 7, 7, 0, + 12, 37, 0, 9, 48, 17, 0, 11, 37, 162, 82, 119, + 49, 81, 34, 50, 33, 49, 50, 50, 33, 49, 50, 50, + 49, 33, 53, 81, 33, 50, 49, 65, 33, 50, 50, 49, + 33, 50, 50, 33, 65, 34, 51, 17, 85, 51, 113, 113, + 151, 0, 13, 64, 8, 7, 0, 6, 21, 0, 15, 16, + 15, 8, 0, 6, 20, 49, 65, 33, 65, 34, 34, 66, + 0, 14, 64, 30, 19, 0, 17, 81, 240, 49, 240, 49, + 240, 49, 240, 49, 175, 2, 161, 240, 49, 240, 49, 240, + 49, 240, 49, 240, 239, 2, 0, 12, 16, 18, 8, 0, + 6, 20, 49, 50, 34, 34, 98, 81, 97, 97, 49, 38, + 0, 11, 32, 19, 8, 0, 6, 19, 65, 49, 113, 67, + 114, 114, 34, 34, 33, 49, 67, 0, 10, 64, 10, 5, + 240, 240, 33, 49, 49, 0, 10, 64, 30, 12, 0, 15, + 2, 66, 66, 66, 66, 66, 66, 66, 65, 82, 65, 82, + 65, 81, 82, 66, 17, 68, 19, 33, 177, 177, 178, 162, + 240, 112, 40, 11, 0, 7, 23, 52, 33, 68, 33, 53, + 33, 68, 33, 83, 33, 113, 33, 113, 33, 113, 33, 113, + 33, 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, 113, + 33, 113, 33, 240, 240, 96, 9, 4, 0, 6, 2, 34, + 0, 5, 96, 8, 6, 0, 15, 18, 82, 35, 240, 15, + 8, 0, 6, 49, 68, 98, 98, 98, 98, 98, 70, 0, + 11, 32, 18, 7, 240, 240, 211, 49, 49, 33, 49, 33, + 49, 33, 49, 51, 53, 0, 10, 96, 21, 7, 0, 9, + 81, 33, 49, 33, 65, 33, 49, 33, 49, 33, 49, 33, + 33, 33, 0, 6, 64, 39, 16, 0, 12, 4, 97, 114, + 97, 114, 81, 130, 81, 130, 65, 146, 49, 50, 82, 49, + 35, 53, 17, 33, 18, 129, 49, 18, 129, 33, 34, 113, + 54, 82, 98, 97, 114, 0, 12, 48, 39, 16, 0, 12, + 4, 97, 114, 81, 130, 81, 130, 65, 146, 65, 18, 98, + 51, 34, 66, 50, 50, 37, 17, 18, 34, 113, 82, 129, + 66, 129, 65, 146, 49, 65, 81, 70, 0, 12, 32, 39, + 15, 0, 11, 51, 81, 81, 49, 65, 145, 49, 115, 65, + 147, 17, 114, 35, 50, 49, 51, 50, 67, 17, 36, 113, + 49, 18, 113, 33, 34, 97, 69, 81, 98, 81, 114, 0, + 11, 80, 24, 9, 0, 11, 82, 114, 114, 97, 33, 81, + 33, 113, 113, 98, 98, 114, 50, 34, 65, 34, 65, 68, + 240, 96, 33, 15, 240, 65, 226, 241, 240, 225, 225, 211, + 195, 177, 18, 177, 34, 161, 34, 145, 50, 145, 66, 135, + 113, 82, 113, 98, 97, 98, 69, 38, 0, 11, 64, 33, + 16, 240, 145, 226, 209, 240, 240, 17, 241, 227, 211, 211, + 193, 34, 177, 34, 177, 49, 161, 66, 151, 145, 82, 113, + 98, 113, 98, 85, 39, 0, 12, 32, 33, 16, 240, 113, + 227, 193, 49, 240, 225, 241, 227, 211, 211, 193, 34, 177, + 34, 177, 49, 161, 66, 151, 145, 82, 113, 98, 113, 98, + 85, 39, 0, 12, 32, 33, 15, 240, 240, 69, 240, 240, + 193, 225, 211, 195, 177, 18, 177, 34, 161, 34, 145, 50, + 145, 66, 135, 113, 82, 113, 98, 97, 98, 69, 38, 0, + 11, 64, 36, 16, 240, 240, 98, 34, 162, 34, 240, 240, + 226, 226, 209, 17, 209, 18, 193, 18, 177, 49, 177, 50, + 161, 50, 152, 129, 82, 129, 82, 114, 98, 70, 38, 0, + 12, 32, 36, 16, 98, 209, 33, 193, 33, 193, 33, 210, + 240, 242, 226, 226, 209, 18, 193, 18, 177, 34, 177, 50, + 161, 50, 152, 129, 82, 129, 82, 114, 98, 70, 23, 0, + 12, 32, 42, 20, 0, 13, 59, 163, 82, 163, 97, 145, + 18, 97, 145, 18, 97, 129, 34, 33, 177, 50, 33, 177, + 53, 161, 66, 33, 167, 97, 81, 82, 97, 81, 82, 97, + 66, 82, 82, 37, 43, 0, 15, 32, 34, 13, 0, 8, + 68, 49, 65, 68, 50, 98, 49, 114, 34, 129, 34, 178, + 178, 178, 178, 129, 49, 129, 50, 97, 81, 81, 117, 145, + 211, 178, 147, 240, 240, 32, 34, 13, 240, 18, 194, 209, + 240, 75, 66, 97, 66, 97, 66, 97, 66, 49, 114, 49, + 114, 49, 118, 114, 49, 114, 49, 114, 97, 66, 97, 66, + 97, 43, 0, 10, 34, 13, 240, 97, 177, 177, 240, 75, + 66, 97, 66, 97, 66, 97, 66, 49, 114, 49, 114, 49, + 118, 114, 49, 114, 49, 114, 97, 66, 97, 66, 97, 43, + 0, 10, 35, 13, 240, 65, 178, 161, 34, 240, 43, 66, + 97, 66, 97, 66, 97, 66, 49, 114, 49, 114, 49, 118, + 114, 49, 114, 49, 114, 97, 66, 97, 66, 97, 43, 0, + 10, 35, 13, 240, 226, 34, 114, 34, 240, 43, 66, 97, + 66, 97, 66, 97, 66, 49, 114, 49, 114, 49, 118, 114, + 49, 114, 49, 114, 97, 66, 97, 66, 97, 43, 0, 10, + 22, 8, 130, 113, 129, 214, 66, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 70, 0, 6, 32, 22, 8, + 194, 97, 97, 198, 66, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 70, 0, 6, 32, 23, 8, 240, 50, + 66, 34, 166, 66, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 70, 0, 6, 32, 24, 8, 240, 18, 34, + 34, 34, 166, 66, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 70, 0, 6, 32, 32, 15, 0, 9, 57, + 130, 82, 98, 98, 82, 113, 82, 114, 66, 114, 38, 82, + 66, 114, 66, 114, 66, 114, 66, 98, 82, 98, 82, 82, + 73, 0, 12, 46, 16, 240, 99, 193, 35, 240, 240, 132, + 85, 67, 97, 100, 81, 97, 18, 81, 97, 34, 65, 97, + 35, 49, 97, 50, 49, 97, 66, 33, 97, 66, 33, 97, + 82, 17, 97, 99, 97, 99, 97, 114, 69, 97, 0, 12, + 64, 36, 14, 240, 34, 209, 225, 240, 180, 130, 66, 82, + 98, 65, 129, 50, 130, 34, 130, 34, 130, 34, 130, 34, + 130, 34, 130, 49, 129, 66, 98, 82, 66, 132, 0, 11, + 32, 36, 14, 240, 98, 193, 193, 240, 164, 130, 66, 82, + 98, 65, 129, 50, 130, 34, 130, 34, 130, 34, 130, 34, + 130, 34, 130, 49, 129, 66, 98, 82, 66, 132, 0, 11, + 32, 37, 14, 240, 66, 180, 145, 65, 240, 132, 130, 66, + 82, 98, 65, 129, 50, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 34, 130, 49, 129, 66, 98, 82, 66, 132, 0, + 11, 32, 37, 14, 240, 35, 177, 20, 240, 240, 116, 130, + 66, 82, 98, 65, 129, 50, 130, 34, 130, 34, 130, 34, + 130, 34, 130, 34, 130, 49, 129, 66, 98, 82, 66, 132, + 0, 11, 32, 38, 14, 240, 34, 34, 130, 34, 240, 240, + 116, 130, 66, 82, 98, 65, 129, 50, 130, 34, 130, 34, + 130, 34, 130, 34, 130, 34, 130, 49, 129, 66, 98, 82, + 66, 132, 0, 11, 32, 29, 15, 0, 15, 1, 162, 49, + 130, 81, 98, 114, 50, 146, 18, 178, 211, 177, 34, 145, + 66, 113, 98, 81, 145, 49, 177, 0, 9, 80, 41, 14, + 0, 9, 36, 49, 66, 67, 66, 98, 65, 99, 50, 97, + 18, 34, 81, 34, 34, 65, 50, 34, 49, 66, 34, 33, + 82, 34, 17, 98, 50, 113, 66, 98, 67, 66, 65, 52, + 0, 11, 32, 39, 16, 240, 97, 240, 17, 240, 17, 240, + 150, 53, 66, 113, 98, 113, 98, 113, 98, 113, 98, 113, + 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 113, 113, + 114, 81, 165, 0, 12, 96, 37, 16, 240, 146, 225, 225, + 240, 150, 53, 66, 113, 98, 113, 98, 113, 98, 113, 98, + 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 113, + 113, 114, 81, 165, 0, 12, 96, 39, 16, 240, 129, 225, + 17, 193, 49, 240, 118, 53, 66, 113, 98, 113, 98, 113, + 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, + 98, 113, 113, 113, 114, 81, 165, 0, 12, 96, 39, 16, + 240, 82, 34, 162, 34, 240, 240, 134, 53, 66, 113, 98, + 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, + 113, 98, 113, 98, 113, 113, 113, 114, 81, 165, 0, 12, + 96, 31, 15, 240, 130, 209, 209, 240, 118, 37, 66, 97, + 114, 81, 115, 49, 146, 49, 162, 17, 178, 17, 194, 210, + 210, 210, 210, 210, 182, 0, 11, 112, 26, 13, 0, 8, + 22, 146, 178, 183, 98, 66, 82, 82, 66, 82, 66, 82, + 66, 66, 87, 98, 178, 178, 150, 0, 10, 80, 32, 10, + 0, 6, 68, 81, 50, 50, 50, 50, 50, 50, 34, 69, + 82, 49, 66, 65, 50, 66, 34, 66, 34, 66, 36, 34, + 36, 33, 50, 19, 0, 8, 28, 11, 0, 8, 49, 177, + 177, 240, 84, 97, 50, 82, 34, 146, 101, 66, 50, 66, + 50, 17, 34, 35, 17, 51, 19, 0, 8, 80, 28, 11, + 0, 8, 114, 145, 145, 240, 68, 97, 50, 82, 34, 146, + 101, 66, 50, 66, 50, 17, 34, 35, 17, 51, 19, 0, + 8, 80, 29, 11, 0, 8, 81, 162, 129, 33, 240, 52, + 97, 50, 82, 34, 146, 101, 66, 50, 66, 50, 17, 34, + 35, 17, 51, 19, 0, 8, 80, 29, 11, 0, 8, 66, + 33, 81, 19, 240, 228, 97, 50, 82, 34, 146, 101, 66, + 50, 66, 50, 17, 34, 35, 17, 51, 19, 0, 8, 80, + 29, 11, 0, 8, 50, 34, 82, 34, 240, 212, 97, 50, + 82, 34, 146, 101, 66, 50, 66, 50, 17, 34, 35, 17, + 51, 19, 0, 8, 80, 29, 11, 0, 8, 68, 97, 49, + 115, 240, 68, 97, 50, 82, 34, 146, 101, 66, 50, 66, + 50, 17, 34, 35, 17, 51, 19, 0, 8, 80, 28, 14, + 0, 17, 100, 19, 81, 50, 49, 66, 34, 50, 114, 50, + 74, 34, 50, 114, 50, 65, 34, 33, 17, 49, 67, 51, + 0, 11, 23, 9, 0, 11, 68, 65, 65, 34, 50, 34, + 49, 50, 114, 114, 129, 65, 68, 81, 146, 130, 84, 240, + 96, 23, 10, 0, 7, 82, 145, 161, 240, 52, 82, 34, + 50, 65, 50, 65, 56, 34, 130, 145, 65, 84, 0, 8, + 24, 9, 0, 7, 49, 114, 113, 243, 81, 49, 50, 50, + 34, 50, 39, 34, 114, 65, 49, 49, 84, 0, 7, 16, + 24, 10, 0, 7, 114, 130, 113, 33, 240, 20, 82, 34, + 50, 65, 50, 65, 56, 34, 130, 145, 65, 84, 0, 8, + 24, 10, 0, 7, 82, 34, 66, 34, 240, 164, 82, 34, + 50, 65, 50, 65, 56, 34, 130, 145, 65, 84, 0, 8, + 19, 6, 240, 240, 97, 82, 97, 178, 66, 66, 66, 66, + 66, 66, 66, 66, 240, 240, 128, 19, 5, 240, 240, 33, + 50, 33, 146, 50, 50, 50, 50, 50, 50, 50, 50, 240, + 240, 48, 20, 7, 240, 240, 226, 67, 49, 49, 178, 82, + 82, 82, 82, 82, 82, 82, 82, 240, 240, 240, 20, 7, + 0, 6, 18, 18, 34, 18, 178, 82, 82, 82, 82, 82, + 82, 82, 82, 240, 240, 240, 29, 10, 0, 6, 66, 33, + 99, 114, 98, 18, 146, 85, 66, 50, 34, 66, 34, 66, + 34, 66, 34, 66, 34, 66, 49, 50, 84, 0, 8, 29, + 9, 0, 7, 2, 17, 65, 19, 240, 98, 19, 51, 34, + 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, + 34, 50, 0, 7, 26, 10, 0, 7, 82, 145, 161, 240, + 52, 82, 49, 50, 66, 34, 66, 34, 66, 34, 66, 34, + 66, 49, 50, 84, 0, 8, 26, 10, 0, 8, 18, 129, + 129, 240, 36, 82, 49, 50, 66, 34, 66, 34, 66, 34, + 66, 34, 66, 49, 50, 84, 0, 8, 27, 10, 0, 7, + 114, 130, 113, 33, 240, 20, 82, 49, 50, 66, 34, 66, + 34, 66, 34, 66, 34, 66, 49, 50, 84, 0, 8, 27, + 10, 0, 7, 98, 33, 65, 34, 240, 180, 82, 49, 50, + 66, 34, 66, 34, 66, 34, 66, 34, 66, 49, 50, 84, + 0, 8, 27, 10, 0, 7, 82, 34, 66, 34, 240, 164, + 82, 49, 50, 66, 34, 66, 34, 66, 34, 66, 34, 66, + 49, 50, 84, 0, 8, 19, 18, 0, 18, 114, 240, 18, + 0, 7, 127, 1, 0, 10, 18, 240, 18, 0, 12, 48, + 27, 10, 0, 12, 100, 17, 49, 50, 50, 51, 34, 33, + 18, 34, 17, 34, 34, 17, 34, 35, 50, 49, 50, 49, + 20, 0, 8, 27, 9, 0, 6, 113, 130, 145, 226, 50, + 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, + 34, 35, 51, 18, 0, 7, 27, 9, 0, 7, 49, 113, + 113, 226, 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, + 50, 34, 50, 34, 35, 51, 18, 0, 7, 28, 9, 0, + 7, 17, 114, 97, 33, 210, 50, 34, 50, 34, 50, 34, + 50, 34, 50, 34, 50, 34, 50, 34, 35, 51, 18, 0, + 7, 29, 9, 0, 6, 98, 34, 50, 34, 240, 98, 50, + 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, + 34, 35, 51, 18, 0, 7, 30, 11, 0, 9, 1, 146, + 240, 179, 51, 50, 49, 97, 49, 98, 33, 113, 17, 129, + 17, 131, 145, 161, 161, 98, 17, 114, 17, 130, 240, 240, + 32, 10, 0, 7, 82, 130, 130, 130, 130, 34, 68, 18, + 50, 50, 50, 50, 50, 49, 66, 34, 66, 33, 82, 17, + 99, 114, 130, 130, 130, 113, 240, 64, 31, 11, 0, 8, + 66, 34, 82, 34, 240, 163, 66, 50, 65, 81, 49, 98, + 33, 113, 33, 115, 131, 146, 145, 161, 98, 33, 98, 17, + 130, 240, 240, +}; + +//***************************************************************************** +// +// The glyph offset table for the 20 point Oldstandard font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard20[] = +{ + 0, 5, 21, 34, 64, 115, 155, 189, + 198, 221, 243, 266, 303, 315, 322, 330, + 354, 385, 405, 431, 457, 482, 510, 540, + 561, 591, 621, 632, 647, 678, 691, 722, + 747, 797, 826, 858, 888, 920, 951, 980, + 1014, 1048, 1069, 1093, 1128, 1151, 1203, 1245, + 1278, 1305, 1347, 1382, 1411, 1439, 1473, 1502, + 1554, 1586, 1614, 1643, 1665, 1689, 1711, 1730, + 1738, 1747, 1771, 1801, 1821, 1851, 1870, 1893, + 1921, 1951, 1967, 1991, 2020, 2039, 2073, 2097, + 2119, 2146, 2175, 2194, 2215, 2237, 2261, 2281, + 2311, 2333, 2360, 2380, 2402, 2423, 2445, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2459, 2464, 2480, 2511, 2537, 2564, 2589, 2606, + 2639, 2650, 2696, 2713, 2734, 2745, 2752, 2800, + 2808, 2823, 2853, 2871, 2890, 2900, 2930, 2970, + 2979, 2987, 3002, 3020, 3041, 3080, 3119, 3158, + 3182, 3215, 3248, 3281, 3314, 3350, 3386, 3428, + 3462, 3496, 3530, 3565, 3600, 3622, 3644, 3667, + 3691, 3723, 3769, 3805, 3841, 3878, 3915, 3953, + 3982, 4023, 4062, 4099, 4138, 4177, 4208, 4234, + 4266, 4294, 4322, 4351, 4380, 4409, 4438, 4466, + 4489, 4512, 4536, 4560, 4584, 4603, 4622, 4642, + 4662, 4691, 4720, 4746, 4772, 4799, 4826, 4853, + 4872, 4899, 4926, 4953, 4981, 5010, 5040, 5072, +}; + +//***************************************************************************** +// +// The font definition for the 20 point Oldstandard font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard20 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 19, + + // + // The height of the font. + // + 25, + + // + // The baseline of the font. + // + 19, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard20, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard20Data +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard20b.c b/third_party/fonts/ofl/fonts/fontoldstandard20b.c new file mode 100644 index 0000000..290d2d1 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard20b.c @@ -0,0 +1,681 @@ +//***************************************************************************** +// +// fontoldstandard20b.c - Font definition for the 20pt Oldstandard bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 20 point +// Bold: yes +// Italic: no +// Memory usage: 5740 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 20 point Oldstandard bold font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard20bData[5539] = +{ + 5, 9, 0, 29, 32, 20, 5, 240, 163, 35, 35, 35, + 35, 49, 65, 65, 65, 65, 65, 131, 35, 35, 240, 240, + 32, 17, 7, 240, 240, 82, 18, 34, 18, 34, 18, 34, + 18, 34, 18, 0, 14, 32, 35, 14, 0, 9, 33, 65, + 129, 65, 129, 50, 129, 50, 76, 82, 49, 129, 65, 129, + 65, 129, 65, 129, 50, 92, 66, 49, 130, 49, 129, 65, + 129, 65, 0, 11, 32, 51, 11, 240, 240, 97, 17, 129, + 17, 117, 81, 17, 17, 17, 50, 17, 17, 33, 34, 17, + 17, 18, 36, 20, 36, 17, 101, 117, 117, 97, 20, 34, + 17, 20, 34, 17, 17, 18, 33, 33, 17, 18, 34, 17, + 17, 17, 85, 113, 17, 0, 7, 64, 48, 16, 0, 10, + 20, 82, 66, 33, 81, 82, 34, 49, 98, 34, 49, 98, + 34, 33, 129, 33, 49, 146, 49, 226, 34, 161, 33, 33, + 129, 34, 34, 113, 34, 34, 97, 50, 34, 82, 50, 34, + 81, 81, 33, 81, 99, 0, 12, 64, 39, 16, 0, 10, + 68, 178, 49, 162, 49, 162, 49, 163, 17, 195, 211, 52, + 66, 19, 50, 66, 51, 33, 82, 66, 33, 67, 68, 83, + 83, 84, 67, 100, 37, 17, 69, 51, 0, 12, 48, 11, + 4, 240, 82, 34, 34, 34, 34, 0, 8, 32, 25, 8, + 240, 240, 241, 97, 97, 98, 82, 98, 83, 83, 83, 83, + 83, 83, 83, 98, 98, 114, 113, 129, 129, 240, 48, 25, + 8, 240, 240, 161, 129, 129, 114, 114, 98, 99, 83, 83, + 83, 83, 83, 83, 82, 98, 82, 97, 97, 97, 240, 128, + 21, 10, 0, 6, 82, 130, 82, 17, 34, 36, 19, 82, + 84, 19, 34, 17, 34, 82, 0, 16, 112, 41, 19, 0, + 12, 113, 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, + 240, 49, 240, 49, 175, 2, 161, 240, 49, 240, 49, 240, + 49, 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, 0, + 8, 48, 13, 6, 0, 12, 99, 52, 36, 81, 65, 81, + 50, 240, 16, 8, 7, 0, 12, 37, 37, 0, 9, 10, + 5, 0, 10, 83, 35, 35, 240, 240, 32, 25, 9, 0, + 6, 34, 114, 113, 129, 114, 113, 129, 114, 113, 129, 129, + 114, 113, 129, 114, 113, 129, 114, 114, 240, 160, 35, 11, + 0, 7, 35, 113, 49, 82, 50, 66, 50, 51, 51, 35, + 51, 35, 51, 35, 51, 35, 51, 35, 51, 35, 51, 50, + 50, 66, 50, 81, 49, 115, 0, 8, 112, 21, 9, 0, + 6, 2, 114, 69, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 71, 0, 7, 33, 11, 0, 7, 21, 81, + 51, 50, 67, 34, 67, 35, 51, 50, 35, 131, 114, 130, + 129, 81, 49, 97, 33, 18, 65, 41, 33, 37, 49, 51, + 0, 8, 96, 31, 11, 0, 7, 21, 81, 66, 50, 67, + 35, 51, 50, 51, 130, 84, 163, 146, 65, 67, 36, 35, + 35, 51, 34, 67, 49, 51, 84, 0, 8, 112, 27, 12, + 0, 8, 34, 147, 147, 132, 117, 113, 19, 97, 35, 97, + 35, 81, 51, 81, 51, 74, 115, 147, 147, 119, 0, 9, + 32, 30, 11, 0, 6, 49, 70, 86, 84, 113, 161, 161, + 20, 82, 50, 65, 67, 131, 131, 36, 35, 35, 51, 34, + 66, 65, 51, 84, 0, 8, 112, 33, 11, 0, 7, 36, + 98, 49, 66, 35, 66, 35, 51, 49, 67, 135, 67, 50, + 51, 51, 35, 51, 35, 51, 50, 51, 50, 51, 65, 50, + 100, 0, 8, 96, 27, 10, 0, 6, 33, 19, 18, 37, + 33, 40, 33, 97, 33, 97, 129, 130, 129, 130, 114, 130, + 115, 115, 115, 130, 0, 8, 16, 33, 11, 0, 7, 36, + 82, 65, 50, 97, 34, 97, 35, 81, 37, 33, 70, 102, + 65, 37, 33, 83, 33, 98, 33, 113, 33, 113, 49, 81, + 85, 0, 8, 96, 33, 11, 0, 7, 20, 98, 49, 67, + 50, 51, 50, 51, 51, 35, 51, 35, 51, 50, 51, 71, + 131, 65, 51, 51, 34, 67, 34, 65, 50, 100, 0, 8, + 112, 14, 5, 0, 6, 35, 35, 35, 240, 115, 35, 35, + 240, 240, 32, 18, 7, 0, 8, 115, 67, 67, 240, 240, + 35, 53, 52, 97, 81, 81, 81, 240, 64, 32, 17, 0, + 14, 50, 211, 210, 211, 195, 195, 210, 211, 210, 240, 19, + 240, 19, 240, 18, 240, 19, 240, 19, 240, 19, 240, 18, + 240, 33, 0, 6, 80, 13, 19, 0, 28, 79, 2, 0, + 7, 63, 2, 0, 21, 80, 32, 17, 0, 12, 98, 240, + 19, 240, 18, 240, 19, 240, 19, 240, 19, 240, 18, 240, + 19, 240, 18, 211, 195, 210, 211, 195, 195, 210, 225, 0, + 8, 48, 28, 9, 0, 5, 100, 65, 51, 33, 51, 33, + 51, 33, 50, 98, 98, 113, 113, 33, 81, 33, 98, 240, + 19, 99, 99, 0, 7, 32, 54, 16, 0, 10, 85, 146, + 82, 97, 50, 18, 17, 65, 49, 35, 17, 65, 34, 50, + 33, 33, 50, 35, 33, 33, 34, 50, 49, 33, 34, 50, + 49, 33, 34, 50, 49, 33, 34, 35, 33, 49, 34, 35, + 33, 65, 35, 35, 97, 240, 17, 97, 150, 0, 12, 96, + 31, 16, 0, 10, 98, 226, 226, 211, 212, 177, 19, 177, + 19, 177, 35, 145, 51, 145, 51, 152, 113, 83, 113, 83, + 113, 99, 69, 39, 0, 12, 32, 33, 14, 0, 8, 106, + 99, 66, 83, 67, 67, 67, 67, 67, 67, 67, 67, 51, + 87, 115, 51, 83, 67, 67, 67, 67, 67, 67, 67, 67, + 66, 58, 0, 11, 33, 13, 0, 8, 68, 49, 66, 52, + 50, 83, 50, 98, 35, 98, 35, 113, 35, 163, 163, 163, + 113, 35, 113, 50, 97, 66, 97, 82, 65, 132, 0, 10, + 48, 34, 15, 0, 9, 57, 131, 66, 99, 82, 83, 82, + 83, 83, 67, 83, 67, 83, 67, 83, 67, 83, 67, 83, + 67, 83, 67, 82, 83, 82, 83, 66, 73, 0, 12, 36, + 14, 0, 8, 108, 67, 67, 67, 82, 67, 97, 67, 97, + 67, 49, 115, 34, 119, 115, 34, 115, 49, 33, 67, 49, + 33, 67, 97, 67, 82, 67, 67, 44, 0, 10, 96, 32, + 14, 0, 8, 108, 67, 67, 67, 82, 67, 82, 67, 97, + 67, 49, 33, 67, 34, 119, 115, 34, 115, 49, 115, 49, + 115, 179, 179, 151, 0, 11, 48, 37, 14, 0, 9, 36, + 33, 82, 67, 66, 98, 66, 98, 51, 113, 51, 113, 51, + 179, 54, 35, 83, 51, 83, 51, 83, 66, 83, 66, 83, + 82, 49, 33, 115, 49, 0, 10, 112, 35, 17, 0, 10, + 87, 23, 67, 83, 99, 83, 99, 83, 99, 83, 99, 83, + 99, 83, 107, 99, 83, 99, 83, 99, 83, 99, 83, 99, + 83, 99, 83, 71, 23, 0, 13, 21, 9, 240, 240, 247, + 67, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 71, 0, 7, 27, 12, 0, 7, 119, 115, 147, 147, + 147, 147, 147, 147, 147, 82, 35, 67, 35, 67, 35, 65, + 67, 65, 66, 101, 0, 9, 96, 36, 16, 0, 10, 7, + 21, 83, 66, 115, 65, 131, 49, 147, 33, 163, 33, 163, + 19, 151, 147, 20, 131, 35, 131, 36, 115, 51, 115, 52, + 99, 67, 71, 22, 0, 12, 32, 27, 14, 0, 8, 103, + 147, 179, 179, 179, 179, 179, 179, 179, 179, 97, 67, 81, + 83, 82, 67, 82, 67, 67, 44, 0, 10, 96, 51, 18, + 0, 11, 37, 101, 67, 84, 100, 68, 100, 68, 100, 49, + 19, 97, 19, 33, 19, 97, 19, 33, 19, 97, 19, 33, + 19, 97, 36, 35, 97, 36, 35, 97, 36, 35, 97, 51, + 35, 97, 50, 51, 97, 50, 51, 69, 33, 23, 0, 13, + 96, 41, 17, 0, 10, 85, 70, 68, 81, 132, 65, 132, + 65, 133, 49, 129, 19, 49, 129, 35, 33, 129, 36, 17, + 129, 51, 17, 129, 68, 129, 68, 129, 83, 129, 83, 114, + 98, 86, 81, 0, 13, 48, 35, 14, 0, 9, 36, 145, + 65, 113, 97, 82, 98, 66, 98, 51, 99, 35, 99, 35, + 99, 35, 99, 35, 99, 50, 98, 66, 98, 81, 97, 113, + 65, 148, 0, 11, 32, 28, 14, 0, 8, 106, 99, 66, + 83, 67, 67, 67, 67, 67, 67, 67, 67, 51, 87, 115, + 179, 179, 179, 179, 179, 151, 0, 11, 48, 43, 14, 0, + 9, 36, 145, 65, 113, 97, 82, 98, 66, 98, 51, 99, + 35, 99, 35, 99, 35, 99, 35, 99, 50, 98, 66, 98, + 81, 34, 33, 99, 34, 148, 49, 145, 49, 145, 49, 149, + 149, 163, 240, 32, 38, 15, 0, 9, 57, 131, 50, 115, + 51, 99, 51, 99, 51, 99, 50, 118, 147, 50, 115, 50, + 115, 51, 99, 51, 99, 51, 17, 67, 51, 17, 67, 51, + 17, 39, 35, 0, 11, 80, 34, 12, 0, 7, 100, 33, + 65, 67, 50, 82, 50, 97, 52, 65, 53, 134, 118, 65, + 53, 49, 84, 33, 99, 34, 98, 34, 98, 35, 81, 49, + 37, 0, 9, 64, 32, 15, 0, 9, 61, 35, 35, 35, + 34, 51, 50, 34, 51, 50, 33, 67, 65, 33, 67, 65, + 115, 195, 195, 195, 195, 195, 195, 195, 167, 0, 11, 112, + 36, 16, 0, 10, 7, 37, 67, 97, 99, 97, 99, 97, + 99, 97, 99, 97, 99, 97, 99, 97, 99, 97, 99, 97, + 99, 97, 99, 97, 114, 82, 115, 65, 165, 0, 12, 96, + 31, 16, 0, 10, 7, 37, 68, 81, 115, 81, 115, 65, + 132, 49, 147, 49, 147, 49, 148, 17, 179, 17, 179, 17, + 180, 211, 211, 210, 241, 0, 13, 47, 22, 0, 13, 110, + 21, 67, 67, 81, 115, 67, 65, 115, 67, 65, 115, 52, + 49, 132, 33, 19, 33, 147, 33, 19, 33, 147, 33, 19, + 17, 165, 52, 180, 52, 180, 52, 179, 67, 210, 82, 210, + 82, 210, 82, 0, 17, 48, 33, 16, 0, 10, 22, 22, + 68, 65, 131, 65, 147, 33, 163, 17, 196, 195, 227, 212, + 177, 19, 161, 36, 145, 51, 129, 68, 113, 68, 70, 23, + 0, 12, 32, 30, 15, 0, 9, 54, 37, 67, 81, 99, + 81, 100, 49, 131, 49, 132, 33, 147, 17, 163, 17, 179, + 195, 195, 195, 195, 195, 167, 0, 11, 112, 30, 12, 0, + 7, 74, 34, 68, 34, 67, 49, 68, 49, 67, 132, 131, + 131, 147, 131, 147, 65, 51, 81, 51, 66, 35, 82, 42, + 0, 9, 32, 23, 6, 240, 244, 34, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 68, 224, 25, 9, 240, 240, 242, 114, 129, 129, 130, 129, + 129, 130, 129, 129, 129, 130, 129, 129, 130, 129, 129, 130, + 114, 240, 80, 23, 6, 240, 244, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 36, 224, 20, 12, 0, 8, 1, 178, 148, 114, 33, 113, + 50, 82, 65, 81, 82, 50, 98, 0, 19, 96, 8, 12, + 0, 33, 10, 240, 240, 128, 9, 6, 240, 242, 66, 82, + 97, 0, 13, 27, 11, 0, 13, 116, 98, 35, 67, 19, + 67, 19, 101, 82, 19, 67, 19, 67, 19, 17, 35, 19, + 17, 51, 19, 0, 8, 80, 33, 11, 0, 6, 116, 131, + 131, 131, 131, 131, 18, 84, 18, 67, 35, 51, 35, 51, + 35, 51, 35, 51, 35, 51, 35, 49, 17, 34, 65, 35, + 0, 8, 96, 22, 9, 0, 11, 68, 66, 34, 35, 34, + 35, 19, 35, 99, 99, 114, 49, 50, 49, 68, 0, 7, + 16, 32, 11, 0, 7, 52, 131, 131, 131, 131, 82, 19, + 66, 20, 51, 35, 51, 35, 51, 35, 51, 35, 51, 35, + 51, 35, 66, 20, 82, 20, 0, 8, 64, 22, 10, 0, + 12, 100, 82, 34, 66, 35, 35, 35, 40, 35, 115, 65, + 50, 65, 51, 33, 84, 0, 8, 23, 9, 0, 6, 3, + 82, 18, 54, 53, 67, 84, 99, 99, 99, 99, 99, 99, + 99, 99, 84, 0, 7, 48, 32, 12, 0, 15, 36, 34, + 50, 35, 17, 35, 37, 35, 35, 67, 35, 82, 34, 116, + 98, 168, 88, 50, 82, 49, 113, 49, 113, 50, 81, 101, + 240, 32, 31, 12, 0, 7, 68, 147, 147, 147, 147, 147, + 19, 84, 19, 67, 35, 67, 35, 67, 35, 67, 35, 67, + 35, 67, 35, 67, 35, 58, 0, 9, 32, 21, 7, 240, + 240, 99, 67, 67, 240, 51, 67, 67, 67, 67, 67, 67, + 67, 67, 53, 240, 240, 224, 25, 8, 240, 240, 211, 83, + 83, 240, 99, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 38, 38, 34, 18, 67, 192, 31, 12, 0, 7, 68, + 147, 147, 147, 147, 147, 35, 67, 33, 99, 33, 99, 17, + 115, 17, 118, 99, 19, 83, 34, 83, 35, 53, 20, 0, + 9, 32, 22, 7, 240, 240, 84, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 53, 240, 240, 224, + 34, 17, 0, 21, 51, 19, 35, 84, 20, 19, 67, 35, + 35, 67, 35, 35, 67, 35, 35, 67, 35, 35, 67, 35, + 35, 67, 35, 35, 67, 35, 35, 63, 0, 13, 26, 12, + 0, 15, 19, 19, 84, 19, 67, 35, 67, 35, 67, 35, + 67, 35, 67, 35, 67, 35, 67, 35, 58, 0, 9, 32, + 24, 10, 0, 12, 100, 82, 34, 66, 34, 51, 35, 35, + 35, 35, 35, 35, 35, 50, 34, 66, 34, 84, 0, 8, + 30, 10, 0, 12, 67, 18, 68, 18, 51, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 34, 54, 67, + 115, 115, 115, 115, 240, 32, 30, 10, 0, 12, 99, 33, + 50, 33, 17, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 50, 35, 70, 115, 115, 115, 115, 115, 192, + 19, 9, 0, 11, 51, 18, 54, 54, 51, 17, 67, 99, + 99, 99, 99, 84, 0, 7, 48, 21, 9, 0, 11, 52, + 65, 65, 49, 131, 116, 100, 49, 51, 33, 81, 34, 65, + 68, 0, 7, 16, 25, 8, 0, 6, 33, 113, 113, 98, + 85, 66, 98, 98, 98, 98, 33, 50, 33, 50, 33, 50, + 33, 67, 0, 6, 48, 27, 11, 0, 13, 99, 35, 51, + 35, 51, 35, 51, 35, 51, 35, 51, 35, 51, 35, 51, + 35, 51, 20, 67, 20, 0, 8, 64, 21, 11, 0, 13, + 100, 35, 50, 65, 67, 33, 98, 33, 99, 17, 115, 131, + 131, 145, 161, 0, 9, 32, 16, 0, 20, 4, 20, 35, + 50, 51, 49, 67, 50, 33, 98, 35, 33, 98, 36, 17, + 100, 35, 131, 35, 131, 35, 145, 65, 161, 65, 0, 12, + 96, 23, 12, 0, 15, 19, 35, 82, 33, 115, 17, 131, + 147, 163, 132, 129, 19, 97, 50, 68, 21, 0, 9, 32, + 28, 11, 0, 13, 100, 50, 51, 49, 82, 49, 83, 33, + 98, 17, 116, 116, 130, 146, 161, 161, 113, 17, 116, 114, + 17, 130, 240, 48, 22, 10, 0, 12, 87, 49, 50, 65, + 35, 114, 115, 99, 115, 33, 51, 49, 51, 34, 40, 0, + 7, 96, 25, 8, 240, 240, 226, 81, 98, 98, 98, 98, + 98, 98, 98, 66, 129, 114, 98, 98, 98, 98, 98, 113, + 130, 240, 48, 22, 3, 241, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 128, 25, 8, 240, 240, 162, 129, 114, 98, 98, 98, 98, + 98, 98, 130, 81, 98, 98, 98, 98, 98, 98, 97, 82, + 240, 112, 14, 13, 0, 21, 35, 81, 55, 49, 33, 55, + 49, 83, 0, 15, 5, 9, 0, 29, 32, 19, 5, 0, + 6, 35, 35, 35, 129, 65, 65, 65, 65, 65, 51, 35, + 35, 35, 35, 112, 32, 9, 0, 8, 49, 129, 129, 100, + 66, 17, 17, 35, 19, 35, 18, 51, 17, 67, 17, 67, + 17, 82, 17, 17, 52, 17, 83, 113, 129, 240, 240, 160, + 30, 14, 0, 9, 68, 131, 50, 98, 51, 83, 51, 83, + 179, 164, 197, 147, 194, 194, 131, 17, 81, 33, 35, 66, + 33, 55, 67, 36, 0, 11, 27, 11, 0, 11, 1, 21, + 17, 50, 51, 34, 82, 33, 113, 33, 113, 33, 113, 34, + 82, 50, 50, 49, 21, 17, 0, 12, 80, 28, 13, 0, + 8, 21, 36, 52, 50, 83, 49, 99, 49, 115, 17, 131, + 17, 147, 121, 115, 121, 115, 163, 163, 163, 135, 0, 10, + 32, 17, 3, 241, 33, 33, 33, 33, 33, 33, 225, 33, + 33, 33, 33, 33, 33, 176, 38, 11, 0, 7, 36, 97, + 50, 66, 50, 66, 35, 67, 33, 84, 118, 65, 37, 49, + 68, 34, 82, 36, 65, 53, 17, 85, 132, 82, 34, 67, + 34, 66, 50, 66, 49, 115, 240, 192, 13, 9, 0, 6, + 113, 49, 51, 19, 35, 19, 0, 19, 48, 51, 17, 0, + 11, 37, 162, 82, 113, 50, 65, 81, 34, 34, 49, 65, + 34, 49, 49, 49, 35, 49, 65, 33, 35, 129, 33, 35, + 129, 33, 35, 129, 33, 35, 129, 49, 34, 49, 49, 65, + 34, 49, 49, 81, 51, 49, 113, 98, 150, 0, 13, 80, + 19, 8, 240, 240, 179, 66, 18, 83, 50, 18, 50, 18, + 50, 19, 65, 86, 0, 13, 32, 24, 7, 0, 9, 113, + 17, 49, 17, 50, 17, 50, 17, 50, 17, 50, 17, 65, + 17, 65, 33, 65, 0, 5, 96, 13, 12, 0, 18, 10, + 177, 177, 177, 177, 177, 0, 12, 32, 8, 7, 0, 12, + 37, 37, 0, 9, 52, 17, 0, 11, 37, 162, 82, 120, + 33, 81, 34, 51, 17, 65, 34, 51, 17, 49, 50, 51, + 33, 33, 53, 81, 33, 50, 49, 65, 33, 50, 50, 49, + 33, 50, 50, 49, 49, 34, 51, 17, 65, 21, 34, 17, + 81, 145, 113, 98, 150, 0, 13, 80, 7, 7, 0, 6, + 21, 0, 16, 17, 8, 240, 240, 180, 50, 34, 33, 65, + 33, 65, 34, 34, 52, 0, 15, 48, 34, 19, 0, 15, + 33, 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, 175, + 2, 161, 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, + 240, 239, 2, 0, 12, 16, 21, 8, 240, 240, 180, 49, + 50, 34, 34, 82, 97, 82, 33, 33, 65, 38, 33, 34, + 0, 12, 48, 22, 9, 0, 5, 100, 65, 50, 50, 34, + 114, 67, 146, 66, 19, 35, 19, 34, 34, 83, 0, 12, + 112, 11, 6, 240, 240, 34, 66, 50, 49, 0, 13, 48, + 35, 12, 0, 15, 18, 49, 83, 35, 67, 35, 67, 35, + 66, 51, 66, 66, 66, 65, 33, 49, 65, 33, 49, 49, + 19, 33, 20, 18, 50, 162, 162, 163, 147, 240, 96, 42, + 11, 0, 7, 23, 52, 33, 53, 33, 53, 33, 53, 33, + 53, 33, 68, 33, 83, 33, 113, 33, 113, 33, 113, 33, + 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, + 113, 33, 240, 240, 96, 10, 5, 0, 7, 67, 35, 35, + 0, 7, 16, 10, 6, 0, 15, 17, 81, 98, 66, 35, + 144, 16, 6, 240, 240, 33, 51, 66, 66, 66, 66, 66, + 66, 52, 0, 9, 32, 20, 7, 240, 240, 99, 50, 18, + 34, 18, 34, 18, 34, 18, 49, 17, 81, 69, 0, 11, + 80, 23, 8, 0, 11, 1, 33, 65, 49, 65, 34, 49, + 34, 49, 34, 49, 34, 49, 33, 49, 33, 0, 7, 64, + 42, 16, 0, 10, 33, 113, 83, 113, 98, 97, 114, 97, + 114, 81, 130, 65, 146, 65, 50, 66, 49, 66, 52, 33, + 51, 129, 49, 18, 129, 33, 34, 113, 54, 81, 114, 97, + 114, 81, 101, 0, 12, 32, 46, 16, 0, 10, 33, 113, + 83, 98, 98, 97, 114, 81, 130, 81, 130, 65, 34, 82, + 67, 34, 50, 49, 17, 50, 36, 18, 18, 34, 113, 82, + 113, 82, 129, 65, 49, 81, 65, 65, 81, 70, 65, 81, + 34, 0, 12, 48, 43, 17, 0, 10, 100, 97, 81, 50, + 81, 82, 34, 65, 162, 65, 115, 81, 178, 33, 131, 19, + 17, 50, 50, 36, 66, 83, 33, 51, 145, 49, 18, 145, + 49, 18, 129, 54, 97, 114, 113, 114, 228, 0, 13, 27, + 9, 0, 11, 51, 99, 99, 114, 97, 33, 81, 33, 114, + 113, 114, 98, 33, 51, 49, 35, 49, 35, 49, 35, 49, + 68, 192, 34, 16, 240, 82, 242, 241, 240, 240, 18, 226, + 226, 212, 196, 196, 177, 20, 161, 35, 161, 35, 145, 51, + 152, 113, 83, 113, 83, 113, 99, 69, 39, 0, 12, 32, + 33, 16, 240, 146, 210, 225, 240, 242, 226, 226, 212, 196, + 196, 177, 20, 161, 35, 161, 35, 145, 52, 136, 113, 83, + 113, 84, 97, 99, 69, 39, 0, 12, 32, 35, 16, 240, + 114, 211, 194, 34, 240, 210, 226, 226, 211, 212, 177, 19, + 177, 19, 177, 35, 145, 51, 145, 51, 152, 113, 83, 113, + 83, 113, 99, 69, 39, 0, 12, 32, 35, 16, 240, 98, + 33, 161, 20, 240, 240, 226, 226, 226, 212, 196, 196, 177, + 20, 161, 35, 161, 35, 145, 52, 136, 113, 83, 113, 84, + 97, 99, 69, 39, 0, 12, 32, 37, 16, 240, 83, 19, + 147, 19, 161, 49, 240, 225, 241, 227, 211, 211, 193, 19, + 177, 19, 161, 35, 161, 51, 145, 51, 151, 129, 68, 113, + 83, 98, 83, 70, 23, 0, 12, 32, 37, 17, 99, 209, + 49, 193, 49, 193, 49, 211, 241, 240, 18, 227, 227, 228, + 193, 19, 193, 19, 177, 36, 161, 51, 161, 51, 168, 129, + 83, 129, 83, 114, 84, 69, 40, 0, 13, 46, 21, 0, + 14, 12, 164, 67, 164, 82, 145, 19, 97, 145, 19, 97, + 129, 35, 49, 177, 35, 34, 162, 39, 161, 51, 34, 146, + 51, 49, 33, 104, 49, 33, 97, 67, 97, 81, 83, 82, + 66, 83, 67, 38, 28, 0, 16, 37, 13, 0, 8, 83, + 49, 66, 52, 50, 83, 50, 98, 35, 98, 35, 113, 35, + 163, 163, 163, 113, 35, 113, 50, 97, 66, 97, 82, 65, + 117, 145, 210, 194, 178, 132, 240, 64, 39, 14, 240, 34, + 210, 225, 240, 108, 67, 67, 67, 82, 67, 97, 67, 97, + 67, 49, 115, 34, 119, 115, 34, 115, 49, 33, 67, 49, + 33, 67, 97, 67, 82, 67, 67, 44, 0, 10, 96, 39, + 14, 240, 98, 193, 193, 240, 108, 67, 67, 67, 82, 67, + 97, 67, 97, 67, 49, 115, 34, 119, 115, 34, 115, 49, + 33, 67, 49, 33, 67, 97, 67, 82, 67, 67, 44, 0, + 10, 96, 40, 14, 240, 81, 195, 146, 50, 240, 60, 67, + 67, 67, 82, 67, 97, 67, 97, 67, 49, 115, 34, 119, + 115, 34, 115, 49, 33, 67, 49, 33, 67, 97, 67, 82, + 67, 67, 44, 0, 10, 96, 42, 14, 240, 35, 19, 115, + 19, 129, 49, 240, 76, 67, 67, 67, 82, 67, 97, 67, + 97, 67, 49, 115, 34, 119, 115, 34, 115, 49, 33, 67, + 49, 33, 67, 97, 67, 82, 67, 67, 44, 0, 10, 96, + 22, 9, 162, 129, 145, 231, 67, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 71, 0, 7, 22, 9, + 210, 113, 113, 231, 67, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 71, 0, 7, 23, 9, 193, 115, + 66, 50, 183, 67, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 71, 0, 7, 25, 9, 147, 19, 35, + 19, 49, 49, 199, 67, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 71, 0, 7, 34, 15, 0, 9, + 57, 131, 66, 99, 82, 83, 82, 83, 83, 67, 83, 67, + 83, 39, 51, 67, 83, 67, 83, 67, 83, 67, 82, 83, + 82, 83, 66, 73, 0, 12, 45, 17, 240, 130, 33, 177, + 19, 240, 240, 181, 70, 68, 81, 132, 65, 132, 65, 133, + 49, 129, 20, 33, 129, 35, 33, 129, 36, 17, 129, 53, + 129, 68, 129, 68, 129, 83, 129, 98, 114, 98, 86, 81, + 0, 13, 48, 38, 14, 50, 194, 210, 210, 240, 164, 145, + 65, 114, 81, 82, 98, 66, 98, 51, 99, 35, 99, 35, + 99, 35, 99, 35, 99, 50, 98, 66, 98, 82, 81, 113, + 65, 148, 0, 11, 32, 38, 14, 114, 194, 178, 178, 240, + 164, 145, 65, 113, 97, 82, 98, 66, 98, 51, 99, 35, + 99, 35, 99, 35, 99, 35, 99, 50, 98, 66, 98, 81, + 97, 113, 65, 148, 0, 11, 32, 39, 14, 240, 66, 180, + 145, 65, 240, 132, 145, 65, 113, 97, 82, 98, 66, 98, + 51, 99, 35, 99, 35, 99, 35, 99, 35, 99, 50, 98, + 66, 98, 81, 97, 113, 65, 148, 0, 11, 32, 39, 14, + 240, 51, 161, 20, 240, 240, 116, 145, 65, 114, 81, 82, + 98, 66, 98, 51, 99, 35, 99, 35, 99, 35, 99, 35, + 99, 50, 98, 66, 98, 82, 81, 113, 65, 148, 0, 11, + 32, 41, 14, 240, 19, 19, 115, 19, 129, 49, 240, 148, + 145, 65, 113, 97, 82, 98, 66, 98, 51, 99, 35, 99, + 35, 99, 35, 99, 35, 99, 50, 98, 66, 98, 81, 97, + 113, 65, 148, 0, 11, 32, 31, 15, 0, 15, 1, 162, + 49, 130, 81, 98, 113, 66, 145, 34, 162, 17, 194, 211, + 177, 34, 145, 66, 113, 98, 82, 114, 50, 146, 0, 9, + 80, 40, 14, 0, 9, 36, 49, 81, 52, 81, 83, 66, + 83, 66, 68, 51, 69, 35, 50, 19, 35, 34, 35, 35, + 18, 51, 37, 67, 37, 66, 67, 82, 67, 81, 84, 49, + 81, 52, 0, 11, 32, 40, 16, 81, 242, 241, 240, 17, + 240, 151, 37, 67, 97, 99, 97, 99, 97, 99, 97, 99, + 97, 99, 97, 99, 97, 99, 97, 99, 97, 99, 97, 99, + 97, 114, 82, 115, 65, 165, 0, 12, 96, 39, 16, 145, + 226, 210, 225, 240, 151, 37, 67, 97, 99, 97, 99, 97, + 99, 97, 99, 97, 99, 97, 99, 97, 99, 97, 99, 97, + 99, 97, 99, 97, 114, 82, 115, 65, 165, 0, 12, 96, + 41, 16, 113, 226, 210, 17, 177, 66, 240, 103, 37, 67, + 97, 99, 97, 99, 97, 99, 97, 99, 97, 99, 97, 99, + 97, 99, 97, 99, 97, 99, 97, 99, 97, 114, 82, 115, + 65, 165, 0, 12, 96, 42, 16, 240, 83, 19, 147, 19, + 161, 49, 240, 119, 37, 67, 97, 99, 97, 99, 97, 99, + 97, 99, 97, 99, 97, 99, 97, 99, 97, 99, 97, 99, + 97, 99, 97, 114, 82, 115, 65, 165, 0, 12, 96, 33, + 15, 240, 130, 194, 194, 240, 118, 37, 67, 81, 99, 81, + 100, 49, 131, 49, 132, 17, 163, 17, 163, 17, 179, 195, + 195, 195, 195, 195, 167, 0, 11, 112, 28, 14, 0, 8, + 103, 147, 179, 183, 115, 51, 83, 67, 67, 67, 67, 67, + 67, 67, 67, 51, 87, 115, 179, 179, 151, 0, 11, 48, + 34, 11, 0, 7, 36, 98, 34, 67, 34, 67, 34, 67, + 33, 83, 17, 99, 34, 67, 34, 67, 35, 51, 35, 51, + 35, 51, 35, 56, 55, 52, 18, 0, 8, 96, 32, 11, + 0, 7, 1, 162, 161, 177, 240, 68, 98, 35, 67, 19, + 81, 35, 101, 82, 19, 67, 19, 67, 19, 17, 35, 19, + 17, 51, 19, 0, 8, 80, 32, 11, 0, 7, 65, 146, + 145, 145, 240, 68, 98, 35, 67, 19, 67, 19, 101, 82, + 19, 67, 19, 67, 19, 17, 35, 19, 17, 51, 19, 0, + 8, 80, 34, 11, 0, 7, 33, 146, 145, 17, 113, 49, + 240, 36, 98, 35, 67, 19, 67, 19, 101, 82, 19, 67, + 19, 67, 19, 17, 35, 19, 17, 51, 19, 0, 8, 80, + 31, 11, 0, 8, 51, 129, 19, 240, 212, 98, 35, 67, + 19, 67, 19, 101, 82, 19, 67, 19, 67, 19, 17, 35, + 19, 17, 51, 19, 0, 8, 80, 34, 11, 0, 8, 35, + 19, 67, 19, 81, 49, 240, 36, 98, 35, 67, 19, 67, + 19, 101, 82, 19, 67, 19, 67, 19, 17, 35, 19, 17, + 51, 19, 0, 8, 80, 32, 11, 0, 7, 34, 129, 33, + 113, 33, 130, 240, 68, 82, 50, 67, 35, 51, 35, 101, + 66, 35, 51, 35, 51, 36, 35, 36, 52, 18, 0, 8, + 80, 31, 14, 0, 17, 84, 20, 66, 35, 34, 51, 19, + 35, 49, 35, 35, 74, 50, 19, 115, 19, 65, 35, 19, + 65, 35, 20, 33, 67, 36, 0, 11, 25, 10, 0, 12, + 116, 66, 50, 50, 35, 35, 35, 35, 115, 115, 130, 65, + 51, 49, 84, 97, 161, 161, 145, 99, 240, 27, 10, 0, + 6, 50, 130, 146, 161, 240, 36, 82, 34, 66, 35, 35, + 35, 40, 35, 115, 65, 50, 65, 51, 33, 84, 0, 8, + 27, 10, 0, 6, 114, 130, 114, 113, 240, 52, 82, 34, + 66, 35, 35, 35, 40, 35, 115, 65, 50, 65, 51, 33, + 84, 0, 8, 27, 10, 0, 6, 82, 130, 116, 81, 65, + 244, 82, 34, 66, 35, 35, 35, 40, 35, 115, 65, 50, + 65, 51, 33, 84, 0, 8, 29, 10, 0, 7, 67, 19, + 51, 19, 65, 49, 240, 20, 82, 34, 66, 35, 35, 35, + 40, 35, 115, 65, 50, 65, 50, 49, 84, 0, 8, 21, + 7, 240, 240, 81, 98, 98, 98, 179, 67, 67, 67, 67, + 67, 67, 67, 67, 53, 240, 240, 224, 21, 7, 240, 240, + 130, 82, 66, 65, 211, 67, 67, 67, 67, 67, 67, 67, + 67, 53, 240, 240, 224, 23, 9, 0, 5, 114, 115, 82, + 18, 49, 81, 211, 99, 99, 99, 99, 99, 99, 99, 99, + 85, 0, 7, 16, 21, 8, 0, 6, 6, 38, 49, 33, + 195, 83, 83, 83, 83, 83, 83, 83, 83, 69, 0, 6, + 48, 31, 10, 0, 6, 66, 18, 98, 130, 113, 18, 131, + 85, 66, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 50, 34, 84, 0, 8, 31, 12, 0, 9, + 50, 33, 97, 19, 240, 243, 19, 84, 19, 67, 35, 67, + 35, 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, 58, + 0, 9, 32, 28, 10, 0, 6, 65, 145, 161, 240, 212, + 82, 34, 66, 34, 51, 35, 35, 35, 35, 35, 35, 35, + 50, 34, 66, 34, 84, 0, 8, 29, 10, 0, 6, 113, + 130, 129, 129, 240, 52, 82, 34, 66, 34, 51, 35, 35, + 35, 35, 35, 35, 35, 50, 34, 66, 34, 84, 0, 8, + 29, 10, 0, 6, 82, 130, 116, 82, 34, 244, 82, 34, + 66, 34, 51, 35, 35, 35, 35, 35, 35, 35, 50, 34, + 66, 34, 84, 0, 8, 29, 10, 0, 7, 98, 33, 65, + 19, 240, 180, 82, 34, 66, 34, 51, 35, 35, 35, 35, + 35, 35, 35, 50, 34, 66, 34, 84, 0, 8, 29, 10, + 0, 7, 86, 70, 81, 33, 240, 20, 82, 34, 66, 34, + 51, 35, 35, 35, 35, 35, 35, 35, 50, 34, 66, 34, + 84, 0, 8, 22, 19, 0, 17, 67, 240, 19, 240, 19, + 0, 8, 47, 2, 0, 10, 83, 240, 19, 240, 19, 0, + 13, 26, 10, 0, 12, 99, 33, 50, 34, 66, 49, 51, + 35, 35, 20, 36, 19, 35, 35, 49, 50, 65, 50, 49, + 20, 0, 8, 31, 11, 0, 7, 2, 146, 162, 240, 227, + 35, 51, 35, 51, 35, 51, 35, 51, 35, 51, 35, 51, + 35, 51, 35, 51, 20, 67, 20, 0, 8, 64, 32, 11, + 0, 7, 65, 146, 145, 145, 240, 51, 35, 51, 35, 51, + 35, 51, 35, 51, 35, 51, 35, 51, 35, 51, 35, 51, + 20, 67, 20, 0, 8, 64, 33, 11, 0, 7, 33, 162, + 129, 17, 113, 50, 243, 35, 51, 35, 51, 35, 51, 35, + 51, 35, 51, 35, 51, 35, 51, 35, 51, 20, 67, 20, + 0, 8, 64, 34, 11, 0, 8, 35, 19, 67, 19, 81, + 49, 240, 19, 35, 51, 35, 51, 35, 51, 35, 51, 35, + 51, 35, 51, 35, 51, 35, 51, 20, 67, 20, 0, 8, + 64, 33, 11, 0, 7, 82, 146, 130, 129, 240, 36, 50, + 51, 49, 82, 49, 83, 33, 98, 17, 116, 116, 130, 146, + 161, 161, 113, 17, 116, 114, 17, 130, 240, 48, 34, 11, + 0, 8, 51, 116, 131, 131, 131, 19, 68, 19, 51, 35, + 51, 35, 51, 35, 51, 34, 67, 34, 67, 18, 83, 17, + 100, 115, 131, 131, 130, 129, 240, 96, 35, 12, 0, 9, + 35, 19, 83, 19, 97, 49, 240, 21, 35, 66, 65, 83, + 33, 99, 33, 114, 33, 116, 147, 147, 162, 161, 177, 129, + 33, 116, 130, 17, 146, 240, 80, +}; + +//***************************************************************************** +// +// The glyph offset table for the 20 point Oldstandard bold font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard20b[] = +{ + 0, 5, 25, 42, 77, 128, 176, 215, + 226, 251, 276, 297, 338, 351, 359, 369, + 394, 429, 450, 483, 514, 541, 571, 604, + 631, 664, 697, 711, 729, 761, 774, 806, + 834, 888, 919, 952, 985, 1019, 1055, 1087, + 1124, 1159, 1180, 1207, 1243, 1270, 1321, 1362, + 1397, 1425, 1468, 1506, 1540, 1572, 1608, 1639, + 1686, 1719, 1749, 1779, 1802, 1827, 1850, 1870, + 1878, 1887, 1914, 1947, 1969, 2001, 2023, 2046, + 2078, 2109, 2130, 2155, 2186, 2208, 2242, 2268, + 2292, 2322, 2352, 2371, 2392, 2417, 2444, 2465, + 2497, 2520, 2548, 2570, 2595, 2617, 2642, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2656, 2661, 2680, 2712, 2742, 2769, 2797, 2814, + 2852, 2865, 2916, 2935, 2959, 2972, 2980, 3032, + 3039, 3056, 3090, 3111, 3133, 3144, 3179, 3221, + 3231, 3241, 3257, 3277, 3300, 3342, 3388, 3431, + 3458, 3492, 3525, 3560, 3595, 3632, 3669, 3715, + 3752, 3791, 3830, 3870, 3912, 3934, 3956, 3979, + 4004, 4038, 4083, 4121, 4159, 4198, 4237, 4278, + 4309, 4349, 4389, 4428, 4469, 4511, 4544, 4572, + 4606, 4638, 4670, 4704, 4735, 4769, 4801, 4832, + 4857, 4884, 4911, 4938, 4967, 4988, 5009, 5032, + 5053, 5084, 5115, 5143, 5172, 5201, 5230, 5259, + 5281, 5307, 5338, 5370, 5403, 5437, 5470, 5504, +}; + +//***************************************************************************** +// +// The font definition for the 20 point Oldstandard bold font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard20b = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 19, + + // + // The height of the font. + // + 26, + + // + // The baseline of the font. + // + 20, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard20b, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard20bData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard20i.c b/third_party/fonts/ofl/fonts/fontoldstandard20i.c new file mode 100644 index 0000000..48f103d --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard20i.c @@ -0,0 +1,674 @@ +//***************************************************************************** +// +// fontoldstandard20i.c - Font definition for the 20pt Oldstandard italic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 20 point +// Bold: no +// Italic: yes +// Memory usage: 5652 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 20 point Oldstandard italic font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard20iData[5449] = +{ + 5, 9, 0, 28, 16, 20, 8, 240, 240, 210, 99, 82, + 98, 97, 98, 98, 97, 113, 113, 240, 99, 82, 0, 6, + 96, 11, 6, 240, 241, 33, 33, 33, 33, 33, 0, 13, + 33, 14, 0, 9, 65, 49, 145, 49, 145, 33, 145, 49, + 106, 97, 49, 145, 49, 129, 49, 145, 49, 107, 81, 49, + 145, 33, 145, 49, 145, 49, 0, 11, 64, 49, 13, 0, + 7, 33, 17, 148, 115, 17, 17, 81, 33, 17, 33, 65, + 33, 17, 18, 66, 18, 18, 98, 17, 148, 164, 129, 17, + 18, 83, 17, 33, 66, 17, 17, 33, 65, 34, 34, 65, + 17, 17, 33, 102, 129, 17, 161, 0, 7, 96, 44, 15, + 0, 9, 83, 97, 65, 33, 81, 65, 54, 81, 49, 65, + 81, 49, 49, 97, 33, 49, 115, 49, 209, 66, 113, 50, + 33, 97, 49, 49, 81, 50, 49, 65, 65, 49, 65, 82, + 33, 49, 115, 0, 11, 96, 40, 16, 0, 11, 18, 194, + 33, 177, 49, 177, 33, 178, 17, 180, 50, 82, 18, 34, + 17, 65, 50, 33, 98, 50, 17, 98, 67, 114, 66, 130, + 66, 49, 66, 66, 33, 101, 19, 0, 12, 96, 8, 3, + 241, 33, 33, 0, 6, 80, 24, 9, 0, 6, 34, 98, + 113, 113, 113, 113, 129, 113, 129, 129, 129, 129, 129, 129, + 129, 129, 145, 129, 240, 160, 24, 9, 0, 6, 33, 129, + 145, 129, 129, 129, 129, 129, 129, 113, 129, 129, 113, 113, + 129, 113, 113, 113, 240, 176, 21, 10, 0, 6, 82, 129, + 98, 17, 34, 54, 83, 97, 17, 18, 50, 18, 17, 98, + 0, 15, 80, 39, 19, 0, 12, 113, 240, 49, 240, 49, + 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, 175, 2, + 161, 240, 49, 240, 49, 240, 49, 240, 49, 240, 49, 240, + 49, 240, 49, 0, 8, 48, 12, 6, 0, 12, 19, 51, + 81, 65, 81, 50, 240, 112, 9, 8, 0, 13, 21, 33, + 0, 10, 112, 9, 5, 0, 10, 83, 34, 240, 240, 48, + 25, 9, 0, 6, 49, 129, 113, 129, 129, 113, 129, 129, + 113, 129, 129, 113, 129, 129, 113, 129, 129, 113, 129, 240, + 32, 33, 12, 0, 8, 20, 98, 49, 97, 81, 66, 81, + 51, 66, 50, 82, 50, 82, 35, 82, 34, 83, 34, 82, + 65, 82, 65, 66, 81, 50, 116, 0, 9, 96, 21, 10, + 0, 7, 17, 130, 99, 130, 130, 130, 114, 130, 130, 130, + 114, 130, 130, 87, 0, 7, 112, 30, 12, 0, 8, 4, + 113, 66, 65, 82, 65, 82, 67, 50, 82, 50, 146, 131, + 130, 130, 145, 97, 51, 65, 65, 22, 65, 51, 0, 9, + 80, 28, 12, 0, 8, 4, 113, 66, 82, 50, 82, 50, + 162, 146, 100, 193, 178, 66, 66, 51, 51, 49, 82, 65, + 66, 101, 0, 9, 96, 27, 12, 0, 8, 66, 161, 161, + 161, 17, 129, 17, 129, 33, 113, 34, 97, 49, 97, 50, + 90, 114, 146, 162, 119, 0, 9, 64, 27, 12, 0, 8, + 2, 49, 101, 113, 161, 177, 181, 98, 50, 81, 66, 162, + 162, 66, 66, 51, 50, 65, 66, 101, 0, 9, 96, 31, + 11, 0, 7, 67, 98, 49, 66, 50, 65, 65, 66, 145, + 35, 68, 34, 51, 50, 50, 66, 50, 66, 50, 66, 50, + 65, 66, 50, 84, 0, 9, 25, 11, 0, 7, 4, 49, + 53, 33, 33, 67, 49, 81, 145, 161, 145, 145, 145, 146, + 146, 130, 146, 146, 0, 9, 48, 32, 13, 0, 8, 100, + 129, 65, 97, 82, 81, 82, 81, 81, 98, 65, 117, 98, + 19, 97, 66, 81, 98, 65, 98, 65, 97, 97, 81, 117, + 0, 10, 64, 33, 11, 0, 7, 51, 98, 49, 66, 66, + 50, 66, 49, 82, 49, 82, 49, 67, 50, 33, 17, 83, + 18, 146, 50, 65, 66, 50, 65, 50, 84, 0, 9, 16, + 13, 6, 0, 7, 98, 66, 240, 240, 35, 50, 240, 240, + 160, 15, 6, 0, 7, 98, 66, 240, 178, 67, 81, 65, + 81, 65, 240, 128, 31, 17, 0, 14, 50, 210, 210, 210, + 210, 210, 225, 226, 240, 17, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 34, 240, 34, 240, 33, 0, 6, 80, 13, + 19, 0, 26, 31, 2, 0, 7, 63, 2, 0, 21, 80, + 30, 17, 0, 12, 98, 240, 34, 240, 34, 240, 34, 240, + 33, 240, 34, 240, 34, 240, 34, 241, 226, 210, 210, 210, + 210, 210, 225, 0, 8, 48, 26, 10, 0, 6, 84, 66, + 49, 65, 66, 50, 50, 129, 115, 83, 98, 129, 33, 97, + 17, 130, 240, 19, 114, 0, 8, 64, 50, 16, 0, 10, + 85, 146, 82, 97, 66, 17, 17, 65, 50, 34, 33, 33, + 50, 50, 33, 33, 49, 65, 49, 33, 34, 65, 49, 33, + 34, 50, 49, 33, 33, 65, 65, 33, 33, 50, 49, 65, + 35, 35, 81, 240, 17, 113, 135, 0, 12, 96, 30, 16, + 0, 11, 49, 241, 226, 211, 193, 18, 193, 18, 177, 34, + 161, 50, 166, 145, 66, 129, 82, 129, 82, 113, 98, 70, + 38, 0, 12, 32, 32, 16, 0, 10, 73, 130, 82, 114, + 82, 114, 82, 98, 98, 98, 82, 119, 145, 82, 114, 98, + 98, 98, 98, 98, 97, 98, 98, 97, 90, 0, 12, 96, + 31, 14, 0, 9, 53, 17, 97, 67, 81, 97, 81, 113, + 66, 113, 66, 113, 50, 194, 194, 194, 113, 66, 113, 66, + 97, 97, 81, 133, 0, 11, 48, 33, 17, 0, 11, 24, + 162, 81, 146, 82, 130, 97, 114, 113, 114, 114, 98, 98, + 113, 114, 98, 114, 98, 113, 114, 98, 113, 98, 114, 82, + 105, 0, 13, 96, 33, 17, 0, 11, 27, 114, 97, 130, + 97, 130, 49, 33, 114, 65, 162, 49, 182, 177, 65, 162, + 49, 178, 113, 114, 113, 113, 113, 114, 98, 92, 0, 13, + 48, 28, 17, 0, 11, 27, 114, 97, 130, 97, 130, 49, + 33, 114, 65, 162, 49, 182, 177, 65, 162, 49, 178, 242, + 241, 242, 215, 0, 14, 32, 15, 0, 10, 4, 161, 67, + 82, 98, 81, 129, 66, 113, 82, 194, 210, 71, 34, 113, + 82, 98, 82, 98, 82, 83, 97, 65, 33, 116, 0, 12, + 48, 34, 19, 0, 12, 53, 53, 114, 98, 146, 98, 146, + 98, 130, 98, 146, 98, 154, 145, 113, 146, 98, 146, 98, + 146, 98, 145, 98, 146, 98, 118, 38, 0, 14, 112, 21, + 11, 0, 7, 53, 114, 146, 146, 130, 146, 146, 145, 146, + 146, 146, 145, 146, 118, 0, 8, 112, 24, 15, 0, 10, + 23, 177, 210, 210, 210, 194, 210, 210, 209, 210, 130, 50, + 115, 49, 130, 50, 148, 0, 12, 64, 34, 19, 0, 12, + 53, 38, 114, 97, 162, 81, 178, 50, 178, 49, 210, 33, + 229, 226, 34, 194, 50, 194, 65, 194, 66, 177, 82, 162, + 82, 134, 38, 0, 14, 112, 25, 15, 0, 9, 117, 178, + 210, 210, 194, 210, 210, 209, 210, 210, 113, 82, 113, 81, + 113, 82, 98, 60, 0, 11, 80, 55, 21, 0, 13, 85, + 100, 113, 18, 83, 145, 18, 65, 18, 145, 18, 49, 33, + 161, 18, 49, 18, 145, 34, 33, 34, 145, 34, 33, 34, + 145, 34, 17, 49, 145, 50, 17, 34, 145, 51, 50, 145, + 50, 66, 145, 50, 50, 145, 65, 66, 117, 33, 38, 0, + 16, 48, 41, 20, 0, 13, 3, 86, 115, 97, 163, 97, + 161, 18, 65, 177, 18, 65, 161, 34, 65, 161, 50, 49, + 161, 50, 33, 161, 81, 33, 161, 82, 17, 161, 83, 177, + 98, 161, 114, 133, 82, 0, 16, 33, 14, 0, 9, 52, + 130, 66, 82, 97, 81, 114, 50, 114, 34, 130, 34, 130, + 34, 114, 50, 114, 50, 114, 50, 98, 66, 97, 97, 81, + 133, 0, 11, 48, 27, 16, 0, 10, 72, 146, 81, 130, + 82, 114, 82, 98, 98, 98, 82, 114, 66, 134, 146, 226, + 226, 225, 226, 199, 0, 13, 16, 39, 14, 0, 9, 52, + 130, 66, 82, 97, 81, 114, 50, 114, 34, 130, 34, 130, + 34, 114, 50, 114, 50, 114, 50, 18, 50, 67, 33, 33, + 98, 33, 17, 133, 193, 194, 33, 163, 0, 6, 35, 16, + 0, 10, 72, 146, 66, 130, 81, 130, 66, 114, 82, 114, + 66, 134, 161, 81, 130, 81, 130, 81, 130, 66, 129, 82, + 33, 66, 82, 17, 54, 66, 0, 12, 64, 31, 13, 0, + 8, 100, 114, 66, 81, 82, 81, 97, 81, 195, 179, 113, + 52, 81, 83, 65, 98, 65, 113, 50, 113, 49, 17, 81, + 117, 0, 10, 48, 28, 15, 0, 9, 91, 50, 50, 50, + 49, 66, 49, 65, 50, 65, 130, 65, 130, 210, 194, 210, + 210, 209, 210, 210, 167, 0, 12, 32, 34, 16, 0, 10, + 6, 53, 66, 113, 97, 129, 82, 113, 98, 113, 98, 113, + 82, 129, 82, 113, 98, 113, 98, 113, 97, 113, 113, 113, + 114, 81, 165, 0, 13, 16, 31, 16, 0, 10, 6, 38, + 66, 97, 114, 81, 130, 81, 130, 65, 146, 49, 162, 49, + 162, 33, 178, 17, 194, 17, 195, 210, 226, 225, 0, 13, + 80, 48, 22, 0, 13, 102, 22, 37, 66, 82, 82, 98, + 82, 81, 114, 67, 81, 114, 67, 65, 130, 49, 18, 49, + 146, 33, 34, 49, 146, 33, 34, 33, 162, 17, 50, 17, + 179, 66, 17, 179, 67, 194, 82, 209, 98, 209, 97, 0, + 18, 37, 20, 0, 12, 118, 39, 130, 82, 178, 81, 210, + 49, 226, 33, 240, 17, 17, 240, 34, 240, 50, 240, 33, + 18, 241, 34, 225, 66, 193, 82, 178, 98, 119, 38, 0, + 15, 80, 27, 16, 0, 10, 7, 37, 82, 82, 114, 81, + 130, 65, 161, 49, 178, 17, 195, 210, 226, 226, 225, 226, + 226, 183, 0, 13, 16, 28, 14, 0, 9, 25, 66, 83, + 65, 98, 65, 98, 81, 82, 178, 179, 178, 178, 178, 97, + 66, 97, 67, 97, 66, 98, 58, 0, 11, 24, 11, 0, + 7, 53, 97, 161, 146, 146, 145, 161, 146, 145, 161, 146, + 146, 145, 161, 146, 146, 145, 164, 240, 224, 23, 8, 0, + 6, 1, 113, 113, 129, 113, 113, 129, 113, 113, 129, 113, + 113, 129, 113, 113, 129, 113, 113, 160, 24, 11, 0, 7, + 68, 161, 146, 145, 161, 146, 146, 145, 161, 146, 145, 161, + 146, 146, 145, 161, 146, 101, 240, 208, 19, 11, 0, 7, + 49, 146, 145, 17, 113, 49, 81, 65, 81, 81, 49, 113, + 0, 18, 16, 8, 13, 0, 34, 27, 240, 240, 176, 8, + 4, 240, 146, 49, 0, 8, 96, 27, 11, 0, 14, 19, + 17, 81, 50, 65, 66, 50, 65, 66, 50, 65, 66, 65, + 65, 33, 33, 35, 17, 66, 34, 0, 8, 96, 29, 10, + 0, 6, 67, 129, 145, 130, 129, 145, 19, 82, 34, 50, + 50, 50, 50, 49, 66, 34, 65, 50, 50, 65, 49, 84, + 0, 8, 16, 19, 9, 0, 11, 83, 81, 34, 50, 34, + 34, 114, 114, 114, 114, 33, 83, 0, 7, 48, 33, 12, + 0, 8, 51, 161, 177, 162, 161, 115, 17, 97, 33, 17, + 81, 66, 81, 65, 82, 50, 81, 66, 81, 65, 33, 49, + 35, 17, 82, 34, 0, 9, 80, 20, 9, 0, 11, 83, + 81, 49, 49, 49, 50, 49, 53, 66, 114, 114, 33, 83, + 0, 7, 48, 26, 12, 0, 8, 51, 129, 33, 113, 162, + 161, 149, 145, 162, 161, 177, 162, 162, 161, 177, 162, 161, + 177, 177, 162, 240, 112, 31, 11, 0, 14, 35, 17, 81, + 50, 65, 66, 65, 65, 66, 50, 65, 66, 65, 65, 81, + 35, 98, 33, 146, 145, 82, 49, 81, 49, 100, 240, 48, + 33, 11, 0, 7, 19, 145, 161, 146, 145, 161, 34, 99, + 18, 67, 33, 82, 49, 82, 34, 66, 49, 33, 34, 49, + 17, 49, 65, 17, 49, 66, 0, 8, 96, 24, 8, 240, + 240, 226, 98, 240, 226, 66, 17, 65, 33, 49, 34, 97, + 98, 97, 33, 65, 17, 82, 0, 6, 64, 29, 11, 0, + 7, 98, 146, 240, 240, 162, 129, 18, 97, 33, 113, 33, + 161, 146, 145, 161, 146, 146, 145, 98, 33, 98, 17, 130, + 240, 64, 32, 10, 0, 6, 67, 129, 145, 130, 130, 129, + 50, 65, 33, 17, 50, 17, 33, 49, 33, 99, 98, 33, + 82, 33, 33, 33, 49, 17, 49, 50, 0, 8, 23, 7, + 240, 240, 115, 81, 97, 82, 81, 97, 82, 82, 81, 97, + 82, 81, 33, 49, 17, 66, 0, 5, 112, 42, 18, 0, + 22, 99, 34, 50, 81, 33, 17, 17, 18, 17, 81, 19, + 33, 17, 33, 65, 34, 50, 49, 114, 49, 50, 113, 50, + 49, 33, 66, 50, 34, 17, 81, 65, 49, 33, 81, 50, + 66, 0, 14, 32, 13, 0, 16, 67, 34, 81, 33, 17, + 33, 65, 19, 34, 49, 34, 49, 114, 34, 113, 50, 17, + 66, 49, 33, 65, 65, 17, 81, 66, 0, 10, 32, 23, + 10, 0, 12, 115, 97, 49, 66, 49, 50, 66, 34, 65, + 50, 50, 50, 50, 50, 34, 84, 0, 8, 16, 31, 13, + 0, 16, 82, 35, 81, 34, 49, 65, 18, 65, 98, 50, + 97, 66, 97, 65, 98, 50, 98, 49, 113, 19, 129, 178, + 177, 193, 166, 240, 80, 28, 10, 0, 12, 115, 97, 33, + 17, 49, 66, 49, 65, 50, 50, 49, 66, 49, 66, 49, + 35, 82, 33, 130, 129, 145, 145, 87, 208, 21, 11, 0, + 14, 3, 34, 49, 37, 49, 19, 17, 49, 34, 146, 145, + 146, 145, 161, 0, 9, 32, 21, 10, 0, 13, 3, 82, + 49, 65, 50, 81, 147, 146, 65, 65, 49, 65, 82, 17, + 0, 8, 16, 23, 7, 240, 240, 129, 97, 82, 82, 81, + 69, 50, 82, 81, 97, 82, 81, 33, 49, 17, 67, 0, + 5, 96, 33, 13, 0, 16, 82, 65, 66, 17, 50, 65, + 33, 49, 65, 34, 34, 113, 50, 98, 34, 33, 65, 33, + 17, 17, 81, 33, 17, 17, 83, 34, 0, 10, 32, 27, + 11, 0, 14, 18, 34, 50, 17, 34, 49, 33, 49, 33, + 34, 49, 81, 65, 66, 49, 81, 65, 81, 49, 100, 0, + 8, 112, 37, 16, 0, 20, 50, 65, 33, 66, 17, 50, + 34, 49, 33, 49, 65, 33, 34, 49, 65, 81, 50, 49, + 82, 50, 49, 81, 50, 49, 97, 33, 17, 49, 99, 36, + 0, 12, 80, 26, 13, 0, 16, 83, 35, 65, 33, 17, + 18, 114, 33, 130, 177, 193, 129, 34, 49, 50, 34, 33, + 83, 34, 0, 10, 48, 34, 11, 0, 14, 2, 65, 34, + 17, 50, 33, 33, 49, 82, 49, 81, 50, 66, 50, 65, + 50, 81, 33, 17, 83, 18, 146, 145, 81, 50, 81, 49, + 100, 240, 48, 21, 10, 0, 12, 115, 17, 70, 145, 114, + 98, 113, 65, 49, 65, 49, 18, 33, 65, 19, 0, 8, + 24, 8, 240, 240, 241, 97, 98, 98, 98, 98, 97, 113, + 67, 113, 113, 113, 98, 97, 97, 113, 113, 129, 240, 112, + 21, 3, 241, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 128, 24, 8, 240, + 240, 241, 113, 113, 98, 97, 98, 97, 113, 130, 81, 97, + 113, 113, 113, 113, 97, 97, 240, 240, 16, 14, 13, 0, + 19, 84, 81, 33, 37, 33, 33, 85, 0, 16, 64, 5, + 9, 0, 28, 16, 18, 7, 0, 9, 18, 82, 193, 97, + 81, 97, 97, 82, 82, 82, 67, 66, 82, 192, 31, 9, + 0, 9, 65, 129, 115, 67, 33, 49, 17, 18, 34, 17, + 81, 33, 81, 17, 97, 17, 33, 49, 17, 17, 81, 17, + 98, 113, 240, 240, 208, 30, 17, 0, 12, 3, 194, 49, + 177, 35, 161, 65, 177, 242, 197, 245, 178, 242, 97, 129, + 97, 85, 97, 50, 52, 34, 84, 37, 0, 13, 48, 27, + 11, 0, 11, 1, 35, 33, 50, 50, 49, 97, 49, 113, + 33, 113, 33, 113, 33, 97, 65, 66, 49, 20, 33, 0, + 11, 32, 27, 15, 0, 9, 69, 37, 82, 66, 114, 65, + 130, 49, 146, 33, 177, 17, 195, 152, 162, 167, 162, 210, + 210, 166, 0, 12, 48, 17, 3, 241, 33, 33, 33, 33, + 33, 33, 225, 33, 33, 33, 33, 33, 33, 128, 39, 12, + 0, 8, 20, 113, 49, 97, 51, 81, 50, 98, 145, 18, + 129, 35, 81, 82, 65, 97, 66, 81, 82, 49, 115, 17, + 131, 98, 34, 98, 49, 81, 81, 97, 49, 131, 240, 240, + 16, 11, 7, 240, 240, 194, 33, 34, 33, 0, 15, 16, + 49, 17, 0, 11, 37, 162, 82, 113, 66, 17, 17, 81, + 50, 34, 33, 65, 34, 65, 33, 49, 50, 129, 33, 50, + 129, 33, 50, 129, 33, 50, 65, 49, 49, 34, 65, 33, + 65, 49, 49, 49, 81, 66, 49, 113, 113, 151, 0, 13, + 64, 18, 7, 240, 240, 115, 49, 33, 33, 49, 33, 33, + 49, 34, 50, 69, 0, 11, 80, 19, 8, 0, 11, 49, + 113, 17, 50, 17, 50, 17, 81, 33, 65, 33, 81, 0, + 7, 80, 11, 12, 0, 15, 10, 177, 177, 177, 0, 16, + 96, 9, 8, 0, 13, 21, 33, 0, 10, 112, 48, 17, + 0, 11, 37, 162, 82, 119, 49, 81, 49, 50, 33, 65, + 49, 50, 33, 49, 65, 50, 49, 33, 68, 81, 33, 65, + 49, 65, 33, 65, 50, 49, 49, 49, 50, 33, 65, 21, + 34, 17, 81, 145, 113, 113, 151, 0, 13, 64, 8, 9, + 0, 7, 119, 0, 19, 48, 19, 8, 240, 240, 195, 65, + 49, 34, 49, 33, 65, 33, 49, 50, 33, 67, 0, 13, + 64, 32, 19, 0, 15, 33, 240, 49, 240, 49, 240, 49, + 240, 49, 240, 49, 175, 2, 161, 240, 49, 240, 49, 240, + 49, 240, 49, 240, 239, 2, 0, 12, 16, 18, 9, 0, + 6, 3, 66, 49, 65, 49, 113, 113, 98, 82, 49, 49, + 19, 0, 14, 19, 9, 0, 6, 3, 81, 49, 113, 83, + 145, 50, 49, 49, 50, 49, 49, 83, 0, 13, 10, 5, + 240, 240, 33, 50, 33, 0, 10, 64, 32, 12, 0, 15, + 34, 49, 97, 65, 97, 65, 82, 50, 81, 65, 97, 65, + 82, 50, 33, 34, 50, 17, 49, 19, 18, 65, 177, 177, + 177, 178, 240, 112, 40, 11, 0, 7, 38, 52, 33, 68, + 33, 52, 33, 68, 33, 83, 33, 113, 17, 113, 33, 113, + 33, 113, 33, 113, 17, 113, 33, 113, 33, 113, 33, 97, + 33, 113, 33, 113, 33, 240, 240, 160, 9, 4, 0, 6, + 2, 34, 0, 5, 96, 12, 6, 0, 13, 97, 81, 49, + 33, 33, 33, 50, 240, 14, 6, 240, 240, 130, 81, 66, + 65, 81, 66, 52, 0, 9, 32, 18, 8, 240, 240, 195, + 65, 49, 49, 49, 49, 33, 65, 33, 82, 69, 0, 13, + 48, 19, 8, 0, 11, 49, 81, 17, 81, 33, 81, 18, + 49, 18, 49, 17, 97, 0, 7, 96, 42, 16, 0, 10, + 65, 225, 97, 114, 81, 130, 65, 145, 81, 145, 65, 161, + 49, 81, 66, 49, 65, 68, 17, 65, 17, 129, 49, 17, + 129, 49, 33, 113, 55, 81, 97, 113, 113, 225, 17, 0, + 10, 64, 43, 16, 0, 10, 65, 210, 97, 129, 81, 130, + 65, 145, 81, 145, 65, 35, 81, 49, 33, 34, 50, 49, + 17, 65, 36, 17, 49, 34, 113, 82, 113, 81, 129, 66, + 145, 51, 17, 97, 65, 34, 0, 12, 64, 46, 17, 0, + 11, 3, 209, 49, 65, 113, 34, 49, 177, 49, 147, 65, + 193, 33, 130, 49, 17, 81, 49, 49, 33, 66, 67, 33, + 65, 17, 145, 49, 17, 145, 49, 33, 129, 55, 97, 97, + 129, 113, 241, 17, 0, 11, 16, 23, 9, 0, 11, 114, + 114, 242, 97, 33, 81, 33, 113, 98, 83, 82, 113, 66, + 33, 81, 34, 49, 68, 208, 34, 16, 240, 177, 240, 17, + 0, 5, 113, 241, 226, 211, 193, 18, 193, 18, 177, 34, + 161, 50, 166, 145, 66, 129, 82, 129, 82, 113, 98, 70, + 38, 0, 12, 32, 36, 17, 240, 240, 17, 242, 225, 240, + 240, 33, 240, 17, 242, 227, 209, 18, 209, 18, 193, 34, + 177, 50, 182, 161, 66, 145, 82, 145, 82, 129, 98, 86, + 38, 0, 13, 16, 36, 17, 240, 225, 241, 17, 194, 49, + 240, 241, 240, 17, 242, 227, 209, 18, 209, 18, 193, 34, + 177, 50, 182, 161, 66, 145, 82, 145, 82, 129, 98, 86, + 38, 0, 13, 16, 35, 17, 240, 195, 209, 35, 0, 5, + 113, 240, 17, 242, 227, 209, 18, 209, 18, 193, 34, 177, + 50, 182, 161, 66, 145, 82, 145, 82, 129, 98, 86, 38, + 0, 13, 16, 36, 18, 240, 209, 49, 209, 50, 0, 6, + 17, 240, 33, 240, 18, 243, 225, 18, 225, 18, 209, 34, + 193, 50, 198, 177, 66, 161, 82, 161, 82, 145, 98, 102, + 38, 0, 14, 35, 16, 178, 209, 33, 193, 33, 210, 240, + 241, 241, 226, 211, 193, 18, 193, 18, 177, 34, 161, 50, + 166, 145, 66, 129, 82, 129, 82, 113, 98, 70, 38, 0, + 12, 32, 44, 24, 0, 16, 59, 227, 82, 211, 113, 193, + 18, 240, 65, 34, 49, 225, 34, 65, 225, 38, 225, 50, + 49, 215, 49, 49, 129, 66, 65, 33, 129, 82, 113, 129, + 82, 113, 113, 97, 113, 86, 28, 0, 18, 80, 38, 14, + 0, 9, 52, 33, 97, 67, 81, 97, 81, 113, 66, 113, + 66, 113, 50, 194, 194, 194, 113, 66, 113, 66, 97, 97, + 81, 133, 161, 225, 161, 33, 161, 33, 161, 17, 240, 144, + 38, 17, 240, 146, 240, 17, 240, 33, 240, 219, 114, 97, + 130, 97, 130, 49, 33, 114, 65, 162, 49, 182, 177, 65, + 162, 49, 178, 113, 114, 113, 113, 113, 114, 98, 92, 0, + 13, 48, 36, 17, 240, 210, 241, 241, 240, 203, 114, 97, + 130, 97, 130, 49, 33, 114, 65, 162, 49, 182, 177, 65, + 162, 49, 178, 113, 114, 113, 113, 113, 114, 98, 92, 0, + 13, 48, 36, 17, 240, 193, 228, 193, 240, 251, 114, 97, + 130, 97, 130, 49, 33, 114, 65, 162, 49, 182, 177, 65, + 162, 49, 178, 113, 114, 113, 113, 113, 114, 98, 92, 0, + 13, 48, 38, 17, 240, 146, 34, 178, 34, 240, 240, 203, + 114, 97, 130, 97, 130, 49, 33, 114, 65, 162, 49, 182, + 177, 65, 162, 49, 178, 113, 114, 113, 113, 113, 114, 98, + 92, 0, 13, 48, 24, 11, 81, 161, 177, 161, 240, 69, + 114, 146, 146, 130, 146, 146, 145, 146, 146, 146, 145, 146, + 118, 0, 8, 112, 24, 12, 240, 97, 162, 145, 240, 85, + 130, 162, 162, 146, 162, 162, 161, 162, 162, 162, 161, 162, + 134, 0, 9, 96, 26, 12, 240, 65, 161, 17, 114, 49, + 240, 53, 130, 162, 162, 146, 162, 162, 161, 162, 162, 162, + 161, 162, 134, 0, 9, 96, 25, 12, 240, 33, 49, 113, + 49, 240, 245, 130, 162, 162, 146, 162, 162, 161, 162, 162, + 162, 161, 162, 134, 0, 9, 96, 33, 17, 0, 11, 24, + 162, 81, 146, 82, 130, 97, 114, 113, 114, 114, 70, 66, + 113, 114, 98, 114, 98, 113, 114, 98, 98, 98, 114, 82, + 105, 0, 13, 96, 46, 20, 240, 226, 240, 33, 35, 0, + 6, 35, 86, 115, 97, 163, 97, 161, 18, 65, 177, 18, + 65, 161, 34, 65, 161, 50, 49, 161, 50, 33, 161, 81, + 33, 161, 82, 17, 161, 83, 177, 98, 161, 114, 133, 82, + 0, 16, 36, 14, 240, 81, 210, 209, 240, 164, 130, 66, + 82, 97, 81, 114, 50, 114, 34, 130, 34, 130, 34, 114, + 50, 114, 50, 114, 50, 98, 66, 97, 97, 81, 133, 0, + 11, 48, 36, 14, 240, 130, 193, 193, 240, 148, 130, 66, + 82, 97, 81, 114, 50, 114, 34, 130, 34, 130, 34, 114, + 50, 114, 50, 114, 50, 98, 66, 97, 97, 81, 133, 0, + 11, 48, 38, 14, 129, 209, 193, 17, 146, 49, 240, 116, + 130, 66, 82, 97, 81, 114, 50, 114, 34, 130, 34, 130, + 34, 114, 50, 114, 50, 114, 50, 98, 66, 97, 97, 81, + 133, 0, 11, 48, 37, 14, 240, 83, 161, 35, 240, 240, + 100, 130, 66, 82, 97, 81, 114, 50, 114, 34, 130, 34, + 130, 34, 114, 50, 114, 50, 114, 50, 98, 66, 97, 97, + 81, 133, 0, 11, 48, 38, 14, 240, 66, 49, 145, 49, + 240, 240, 100, 130, 66, 82, 97, 81, 114, 50, 114, 34, + 130, 34, 130, 34, 114, 50, 114, 50, 114, 50, 98, 66, + 97, 97, 81, 133, 0, 11, 48, 30, 15, 0, 15, 17, + 146, 65, 114, 97, 82, 129, 50, 161, 18, 194, 193, 17, + 177, 49, 145, 81, 113, 113, 81, 145, 49, 177, 0, 9, + 80, 40, 16, 0, 10, 100, 49, 98, 67, 98, 97, 113, + 84, 82, 65, 34, 67, 49, 50, 66, 49, 51, 66, 33, + 66, 82, 33, 66, 82, 17, 82, 83, 82, 98, 82, 114, + 81, 113, 37, 0, 13, 38, 16, 240, 113, 240, 17, 241, + 240, 150, 53, 66, 113, 97, 129, 82, 113, 98, 113, 98, + 113, 82, 129, 82, 113, 98, 113, 98, 113, 97, 113, 113, + 113, 114, 81, 165, 0, 13, 16, 37, 16, 240, 162, 225, + 225, 240, 134, 53, 66, 113, 97, 129, 82, 113, 98, 113, + 98, 113, 82, 129, 82, 113, 98, 113, 98, 113, 97, 113, + 113, 113, 114, 81, 165, 0, 13, 16, 39, 16, 129, 226, + 209, 33, 177, 65, 240, 102, 53, 66, 113, 97, 129, 82, + 113, 98, 113, 98, 113, 82, 129, 82, 113, 98, 113, 98, + 113, 97, 113, 113, 113, 114, 81, 165, 0, 13, 16, 39, + 16, 240, 98, 49, 177, 49, 240, 240, 118, 53, 66, 113, + 97, 129, 82, 113, 98, 113, 98, 113, 82, 129, 82, 113, + 98, 113, 98, 113, 97, 113, 113, 113, 114, 81, 165, 0, + 13, 16, 30, 16, 240, 177, 225, 225, 240, 135, 37, 82, + 82, 114, 81, 130, 65, 161, 49, 178, 17, 195, 210, 226, + 226, 225, 226, 226, 183, 0, 13, 16, 27, 15, 0, 9, + 118, 162, 214, 145, 82, 98, 82, 98, 82, 98, 82, 97, + 82, 98, 81, 119, 130, 209, 210, 183, 0, 12, 32, 42, + 13, 0, 9, 3, 130, 49, 113, 65, 98, 50, 97, 65, + 113, 19, 114, 49, 114, 50, 97, 66, 97, 66, 82, 65, + 97, 18, 33, 97, 17, 33, 113, 17, 17, 114, 33, 129, + 193, 178, 240, 240, 112, 31, 11, 0, 8, 97, 162, 161, + 240, 67, 17, 81, 50, 65, 66, 50, 65, 66, 50, 65, + 66, 65, 65, 33, 33, 35, 17, 66, 34, 0, 8, 96, + 31, 11, 0, 9, 18, 130, 129, 240, 67, 17, 81, 50, + 65, 66, 50, 65, 66, 50, 65, 66, 65, 65, 33, 33, + 35, 17, 66, 34, 0, 8, 96, 34, 11, 0, 7, 81, + 146, 129, 17, 113, 49, 240, 35, 17, 81, 50, 65, 66, + 50, 65, 66, 50, 65, 66, 65, 65, 33, 33, 35, 17, + 66, 34, 0, 8, 96, 32, 11, 0, 8, 98, 33, 81, + 19, 240, 211, 17, 81, 50, 65, 66, 50, 65, 66, 50, + 65, 66, 65, 65, 33, 33, 35, 17, 66, 34, 0, 8, + 96, 32, 11, 0, 8, 82, 34, 82, 34, 240, 195, 17, + 81, 50, 65, 66, 50, 65, 66, 50, 65, 66, 65, 65, + 33, 33, 35, 17, 66, 34, 0, 8, 96, 34, 11, 0, + 7, 66, 129, 33, 113, 33, 130, 240, 51, 17, 81, 50, + 65, 66, 50, 65, 66, 50, 65, 66, 65, 65, 33, 33, + 35, 17, 66, 34, 0, 8, 96, 29, 14, 0, 17, 115, + 17, 19, 65, 51, 33, 49, 66, 49, 34, 65, 49, 50, + 53, 65, 66, 113, 66, 113, 36, 49, 66, 52, 0, 11, + 23, 9, 0, 11, 83, 81, 34, 50, 34, 34, 114, 114, + 114, 114, 33, 83, 113, 129, 97, 17, 98, 240, 160, 23, + 9, 0, 7, 18, 129, 145, 243, 81, 49, 49, 49, 50, + 49, 53, 66, 114, 114, 33, 83, 0, 7, 48, 24, 10, + 0, 8, 49, 129, 129, 240, 35, 97, 49, 65, 49, 66, + 49, 69, 82, 130, 130, 33, 99, 0, 8, 32, 26, 10, + 0, 7, 1, 130, 113, 17, 97, 49, 243, 97, 49, 65, + 49, 66, 49, 69, 82, 130, 130, 33, 99, 0, 8, 32, + 25, 11, 0, 8, 82, 34, 82, 34, 240, 195, 113, 49, + 81, 49, 82, 49, 85, 98, 146, 146, 33, 115, 0, 9, + 16, 24, 8, 0, 6, 49, 114, 113, 226, 66, 17, 65, + 33, 49, 34, 97, 98, 97, 33, 65, 17, 82, 0, 6, + 64, 25, 10, 0, 8, 34, 114, 113, 240, 50, 98, 17, + 97, 33, 81, 34, 129, 130, 129, 33, 97, 17, 114, 0, + 8, 32, 27, 9, 0, 6, 33, 114, 97, 17, 81, 49, + 226, 82, 17, 81, 33, 65, 34, 113, 114, 113, 33, 81, + 17, 98, 0, 7, 48, 26, 10, 0, 7, 98, 34, 66, + 34, 240, 162, 98, 17, 97, 33, 81, 34, 129, 130, 129, + 33, 97, 17, 114, 0, 8, 32, 30, 12, 0, 8, 17, + 178, 18, 115, 114, 18, 162, 115, 17, 97, 50, 82, 50, + 66, 66, 66, 65, 82, 50, 82, 49, 98, 34, 115, 0, + 10, 36, 13, 0, 10, 51, 195, 240, 240, 19, 34, 81, + 33, 17, 33, 65, 19, 34, 49, 34, 49, 114, 34, 113, + 50, 17, 66, 49, 33, 65, 65, 17, 81, 66, 0, 10, + 32, 27, 10, 0, 7, 114, 145, 161, 240, 35, 97, 49, + 66, 49, 50, 66, 34, 65, 50, 50, 50, 50, 50, 34, + 84, 0, 8, 16, 26, 11, 0, 9, 18, 129, 145, 240, + 67, 113, 49, 82, 49, 66, 66, 50, 65, 66, 50, 66, + 50, 66, 34, 100, 0, 9, 29, 10, 0, 7, 1, 130, + 113, 17, 97, 49, 243, 97, 49, 66, 49, 50, 66, 34, + 65, 50, 50, 50, 50, 50, 34, 84, 0, 8, 16, 27, + 11, 0, 8, 98, 33, 81, 19, 240, 211, 113, 49, 82, + 49, 66, 66, 50, 65, 66, 50, 66, 50, 66, 34, 100, + 0, 9, 27, 11, 0, 8, 82, 34, 82, 34, 240, 195, + 113, 49, 82, 49, 66, 66, 50, 65, 66, 50, 66, 50, + 66, 34, 100, 0, 9, 18, 19, 0, 19, 115, 240, 34, + 0, 8, 47, 2, 0, 10, 83, 240, 34, 0, 13, 27, + 11, 0, 14, 35, 17, 81, 49, 82, 34, 66, 33, 18, + 50, 17, 33, 67, 34, 66, 50, 66, 34, 65, 20, 0, + 8, 112, 37, 13, 0, 10, 50, 193, 240, 240, 82, 65, + 66, 17, 50, 65, 33, 49, 65, 34, 34, 113, 50, 98, + 35, 17, 65, 33, 17, 17, 81, 33, 17, 17, 83, 34, + 0, 10, 32, 37, 13, 0, 10, 98, 177, 177, 240, 98, + 65, 66, 17, 50, 65, 33, 49, 65, 34, 34, 113, 50, + 98, 35, 17, 65, 33, 17, 17, 81, 33, 17, 17, 83, + 34, 0, 10, 32, 39, 13, 0, 9, 1, 193, 177, 17, + 130, 240, 130, 65, 66, 17, 50, 65, 33, 49, 65, 34, + 34, 113, 50, 98, 35, 17, 65, 33, 17, 17, 81, 33, + 17, 17, 83, 34, 0, 10, 32, 39, 13, 0, 10, 49, + 34, 130, 18, 240, 240, 34, 65, 66, 17, 50, 65, 33, + 49, 65, 34, 34, 113, 50, 98, 35, 17, 65, 33, 17, + 17, 81, 33, 17, 17, 83, 34, 0, 10, 32, 38, 11, + 0, 9, 33, 145, 145, 240, 34, 65, 34, 17, 50, 33, + 33, 49, 82, 49, 81, 50, 66, 50, 65, 50, 81, 33, + 17, 83, 18, 146, 145, 81, 50, 81, 49, 100, 240, 48, + 34, 13, 0, 8, 99, 177, 193, 193, 178, 177, 19, 130, + 49, 98, 65, 98, 50, 97, 66, 97, 65, 98, 50, 98, + 49, 113, 19, 129, 178, 177, 193, 166, 240, 80, 39, 11, + 0, 8, 97, 34, 97, 34, 240, 178, 65, 34, 17, 50, + 33, 33, 49, 82, 49, 81, 50, 66, 50, 65, 50, 81, + 33, 17, 83, 18, 146, 145, 81, 50, 81, 49, 100, 240, + 48, +}; + +//***************************************************************************** +// +// The glyph offset table for the 20 point Oldstandard italic font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard20i[] = +{ + 0, 5, 25, 36, 69, 118, 162, 202, + 210, 234, 258, 279, 318, 330, 339, 348, + 373, 406, 427, 457, 485, 512, 539, 570, + 595, 627, 660, 673, 688, 719, 732, 762, + 788, 838, 868, 900, 931, 964, 997, 1025, + 1057, 1091, 1112, 1136, 1170, 1195, 1250, 1291, + 1324, 1351, 1390, 1425, 1456, 1484, 1518, 1549, + 1597, 1634, 1661, 1689, 1713, 1736, 1760, 1779, + 1787, 1795, 1822, 1851, 1870, 1903, 1923, 1949, + 1980, 2013, 2037, 2066, 2098, 2121, 2163, 2195, + 2218, 2249, 2277, 2298, 2319, 2342, 2375, 2402, + 2439, 2465, 2499, 2520, 2544, 2565, 2589, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2603, 2608, 2626, 2657, 2687, 2714, 2741, 2758, + 2797, 2808, 2857, 2875, 2894, 2905, 2914, 2962, + 2970, 2989, 3021, 3039, 3058, 3068, 3100, 3140, + 3149, 3161, 3175, 3193, 3212, 3254, 3297, 3343, + 3366, 3400, 3436, 3472, 3507, 3543, 3578, 3622, + 3660, 3698, 3734, 3770, 3808, 3832, 3856, 3882, + 3907, 3940, 3986, 4022, 4058, 4096, 4133, 4171, + 4201, 4241, 4279, 4316, 4355, 4394, 4424, 4451, + 4493, 4524, 4555, 4589, 4621, 4653, 4687, 4716, + 4739, 4762, 4786, 4812, 4837, 4861, 4886, 4913, + 4939, 4969, 5005, 5032, 5058, 5087, 5114, 5141, + 5159, 5186, 5223, 5260, 5299, 5338, 5376, 5410, +}; + +//***************************************************************************** +// +// The font definition for the 20 point Oldstandard italic font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard20i = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 21, + + // + // The height of the font. + // + 25, + + // + // The baseline of the font. + // + 19, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard20i, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard20iData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard22.c b/third_party/fonts/ofl/fonts/fontoldstandard22.c new file mode 100644 index 0000000..48980e3 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard22.c @@ -0,0 +1,689 @@ +//***************************************************************************** +// +// fontoldstandard22.c - Font definition for the 22pt Oldstandard font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 22 point +// Bold: no +// Italic: no +// Memory usage: 5832 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 22 point Oldstandard font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard22Data[5631] = +{ + 5, 9, 0, 30, 48, 18, 4, 240, 146, 34, 34, 34, + 34, 34, 49, 33, 49, 49, 49, 178, 34, 240, 176, 15, + 7, 240, 240, 194, 18, 34, 18, 34, 18, 34, 18, 0, + 15, 16, 35, 13, 0, 10, 33, 49, 129, 49, 129, 49, + 129, 49, 75, 81, 49, 129, 49, 129, 49, 129, 49, 129, + 49, 91, 65, 65, 113, 49, 129, 49, 129, 49, 0, 10, + 64, 43, 12, 0, 6, 66, 162, 149, 82, 18, 33, 49, + 50, 49, 33, 50, 34, 33, 50, 34, 35, 18, 117, 149, + 133, 114, 34, 34, 34, 49, 34, 34, 49, 33, 50, 49, + 49, 34, 33, 86, 130, 0, 8, 32, 50, 17, 0, 12, + 116, 97, 97, 33, 81, 98, 34, 65, 98, 34, 49, 114, + 34, 33, 130, 34, 33, 145, 33, 33, 178, 49, 35, 161, + 33, 49, 129, 34, 50, 113, 34, 50, 97, 50, 50, 97, + 50, 50, 81, 81, 49, 209, 17, 0, 13, 32, 40, 17, + 0, 13, 35, 209, 49, 178, 49, 178, 49, 178, 33, 211, + 242, 54, 83, 82, 97, 34, 65, 97, 51, 49, 82, 67, + 17, 98, 83, 114, 98, 130, 65, 18, 33, 85, 51, 0, + 13, 32, 10, 4, 240, 146, 34, 34, 34, 0, 8, 96, + 25, 7, 240, 240, 241, 82, 81, 81, 97, 81, 97, 97, + 97, 97, 97, 97, 97, 113, 97, 97, 113, 113, 98, 240, + 16, 25, 7, 240, 240, 209, 98, 97, 113, 97, 97, 113, + 97, 97, 97, 97, 97, 97, 81, 97, 82, 81, 81, 82, + 240, 64, 24, 11, 0, 8, 98, 146, 82, 33, 34, 50, + 17, 18, 99, 98, 17, 18, 50, 33, 34, 98, 146, 0, + 17, 16, 41, 21, 0, 16, 113, 240, 81, 240, 81, 240, + 81, 240, 81, 240, 81, 240, 81, 240, 81, 191, 4, 177, + 240, 81, 240, 81, 240, 81, 240, 81, 240, 81, 240, 81, + 240, 81, 240, 81, 0, 9, 32, 11, 5, 0, 11, 35, + 35, 65, 65, 49, 240, 128, 8, 8, 0, 15, 6, 0, + 11, 32, 8, 4, 0, 9, 66, 34, 240, 176, 26, 10, + 0, 8, 49, 129, 145, 145, 129, 145, 145, 129, 145, 145, + 129, 145, 145, 129, 145, 145, 129, 145, 145, 129, 240, 64, + 35, 12, 0, 9, 52, 113, 65, 82, 66, 65, 97, 50, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 49, 97, 66, 66, 81, 65, 116, 0, 9, 80, 22, + 10, 0, 8, 1, 130, 85, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 88, 0, 7, 96, 29, 11, 0, + 8, 69, 81, 66, 49, 98, 33, 98, 35, 66, 35, 66, + 130, 145, 145, 145, 130, 129, 97, 49, 97, 41, 41, 0, + 8, 64, 29, 11, 0, 8, 69, 66, 66, 51, 66, 35, + 66, 146, 130, 84, 178, 162, 146, 50, 66, 35, 66, 34, + 82, 34, 66, 84, 0, 8, 112, 27, 13, 0, 10, 81, + 178, 178, 163, 145, 18, 145, 18, 129, 34, 113, 50, 113, + 50, 97, 66, 91, 130, 178, 178, 136, 0, 10, 29, 11, + 0, 8, 54, 85, 97, 161, 161, 161, 20, 82, 50, 65, + 82, 146, 146, 50, 66, 35, 66, 34, 81, 50, 65, 100, + 0, 8, 112, 34, 11, 0, 8, 84, 97, 65, 65, 66, + 65, 66, 50, 146, 20, 67, 50, 51, 66, 34, 82, 34, + 82, 34, 82, 34, 82, 49, 81, 81, 50, 100, 0, 8, + 96, 22, 11, 0, 8, 41, 41, 33, 113, 145, 161, 145, + 145, 145, 161, 146, 146, 131, 131, 131, 146, 0, 9, 34, + 12, 0, 9, 53, 82, 66, 50, 98, 34, 98, 34, 98, + 35, 81, 69, 17, 117, 82, 51, 50, 83, 34, 98, 34, + 98, 34, 97, 66, 66, 85, 0, 9, 80, 33, 11, 0, + 8, 68, 98, 49, 81, 81, 50, 81, 50, 82, 34, 82, + 34, 82, 50, 51, 68, 18, 146, 145, 66, 65, 65, 66, + 65, 65, 100, 0, 8, 112, 11, 4, 240, 240, 226, 34, + 240, 178, 34, 240, 176, 16, 5, 0, 6, 115, 35, 49, + 240, 130, 51, 65, 65, 49, 65, 240, 48, 36, 19, 0, + 16, 33, 240, 18, 240, 18, 242, 242, 242, 242, 242, 242, + 240, 18, 240, 66, 240, 65, 240, 66, 240, 66, 240, 66, + 240, 66, 240, 66, 240, 66, 0, 7, 48, 13, 21, 0, + 34, 31, 4, 0, 8, 31, 4, 0, 23, 112, 36, 19, + 0, 14, 33, 240, 65, 240, 81, 240, 66, 240, 66, 240, + 66, 240, 66, 240, 66, 240, 66, 240, 50, 242, 240, 17, + 240, 18, 242, 242, 242, 242, 242, 0, 9, 32, 28, 10, + 0, 7, 100, 66, 50, 49, 82, 35, 50, 49, 66, 114, + 114, 114, 129, 129, 33, 97, 33, 114, 240, 50, 130, 0, + 8, 16, 54, 18, 0, 14, 23, 146, 113, 113, 67, 19, + 81, 65, 50, 33, 65, 34, 66, 49, 33, 50, 66, 49, + 33, 34, 81, 65, 33, 34, 66, 65, 33, 34, 66, 65, + 33, 34, 51, 49, 49, 34, 33, 18, 33, 81, 35, 51, + 113, 240, 49, 129, 152, 0, 14, 32, 34, 18, 0, 14, + 49, 240, 34, 240, 18, 243, 241, 18, 225, 18, 209, 35, + 193, 50, 178, 50, 177, 67, 168, 146, 82, 145, 114, 129, + 114, 86, 55, 0, 13, 96, 33, 14, 0, 10, 73, 114, + 82, 82, 98, 66, 98, 66, 98, 66, 98, 66, 82, 87, + 114, 82, 82, 98, 66, 98, 66, 98, 66, 98, 66, 82, + 58, 0, 11, 32, 14, 0, 11, 4, 49, 66, 68, 50, + 99, 49, 130, 34, 130, 34, 145, 34, 194, 194, 194, 209, + 145, 49, 129, 81, 113, 82, 81, 133, 0, 11, 16, 35, + 16, 0, 12, 10, 130, 98, 98, 113, 98, 114, 82, 130, + 66, 130, 66, 130, 66, 130, 66, 130, 66, 130, 66, 129, + 82, 114, 82, 113, 98, 97, 90, 0, 12, 96, 35, 14, + 0, 10, 76, 66, 98, 66, 113, 66, 113, 66, 65, 114, + 65, 114, 50, 119, 114, 50, 114, 65, 114, 65, 33, 66, + 113, 66, 113, 66, 98, 44, 0, 10, 96, 31, 14, 0, + 10, 76, 66, 98, 66, 113, 66, 113, 66, 65, 114, 65, + 114, 50, 119, 114, 50, 114, 65, 114, 65, 114, 194, 194, + 167, 0, 11, 48, 39, 16, 0, 12, 68, 49, 98, 66, + 17, 82, 99, 81, 130, 66, 145, 66, 145, 66, 226, 87, + 34, 130, 66, 130, 66, 130, 81, 115, 82, 97, 17, 98, + 65, 33, 132, 49, 0, 12, 64, 35, 17, 0, 12, 102, + 54, 66, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, + 114, 107, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, + 98, 114, 70, 54, 0, 13, 22, 8, 0, 6, 6, 66, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 70, 0, 6, 32, 26, 12, 0, 9, 70, 130, 162, 162, + 162, 162, 162, 162, 162, 162, 82, 50, 67, 50, 66, 66, + 66, 50, 116, 0, 9, 96, 37, 16, 0, 12, 6, 38, + 66, 82, 114, 81, 130, 65, 146, 49, 162, 33, 178, 19, + 163, 18, 162, 50, 146, 50, 146, 66, 130, 67, 114, 82, + 114, 83, 70, 23, 0, 12, 32, 26, 14, 0, 10, 71, + 146, 194, 194, 194, 194, 194, 194, 194, 194, 194, 113, 66, + 113, 66, 113, 66, 98, 44, 0, 10, 96, 56, 18, 0, + 13, 69, 101, 67, 99, 99, 99, 97, 18, 65, 18, 97, + 18, 65, 18, 97, 18, 65, 18, 97, 34, 33, 34, 97, + 34, 33, 34, 97, 34, 33, 34, 97, 50, 17, 34, 97, + 51, 50, 97, 51, 50, 97, 66, 50, 97, 65, 66, 69, + 33, 38, 0, 13, 96, 45, 17, 0, 12, 100, 101, 67, + 113, 100, 97, 97, 18, 97, 97, 34, 81, 97, 35, 65, + 97, 50, 65, 97, 66, 49, 97, 67, 33, 97, 82, 33, + 97, 98, 17, 97, 115, 97, 115, 97, 130, 69, 113, 0, + 13, 32, 34, 15, 0, 11, 101, 145, 81, 113, 113, 82, + 114, 65, 145, 50, 146, 34, 146, 34, 146, 34, 146, 34, + 146, 49, 145, 66, 114, 81, 113, 113, 81, 149, 0, 12, + 28, 14, 0, 10, 74, 98, 82, 82, 98, 66, 98, 66, + 98, 66, 98, 66, 82, 87, 114, 194, 194, 194, 194, 194, + 166, 0, 11, 64, 43, 15, 0, 11, 101, 145, 81, 113, + 113, 82, 114, 65, 145, 50, 146, 34, 146, 34, 146, 34, + 146, 34, 146, 49, 145, 66, 35, 34, 81, 17, 49, 17, + 114, 51, 134, 33, 162, 33, 162, 18, 164, 0, 6, 37, + 16, 0, 12, 10, 130, 82, 114, 98, 98, 98, 98, 98, + 98, 82, 119, 146, 66, 130, 81, 130, 82, 114, 82, 114, + 82, 33, 66, 82, 33, 66, 85, 39, 51, 0, 12, 48, + 36, 13, 0, 10, 4, 49, 66, 52, 50, 98, 50, 98, + 50, 113, 52, 81, 69, 151, 65, 69, 49, 115, 33, 130, + 34, 114, 34, 114, 33, 17, 82, 49, 38, 0, 10, 32, + 32, 16, 0, 12, 14, 34, 66, 66, 34, 66, 66, 33, + 82, 81, 33, 82, 81, 33, 82, 81, 130, 226, 226, 226, + 226, 226, 226, 226, 184, 0, 12, 80, 36, 17, 0, 12, + 102, 69, 66, 129, 98, 129, 98, 129, 98, 129, 98, 129, + 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, + 113, 113, 130, 82, 165, 0, 13, 80, 35, 18, 0, 13, + 71, 54, 82, 113, 130, 113, 146, 97, 146, 81, 163, 65, + 178, 49, 194, 49, 195, 33, 210, 17, 226, 17, 243, 242, + 240, 18, 240, 33, 0, 14, 80, 53, 24, 0, 18, 6, + 23, 38, 66, 98, 97, 115, 82, 97, 130, 67, 97, 130, + 65, 18, 65, 146, 65, 18, 65, 162, 49, 18, 65, 162, + 33, 50, 33, 178, 33, 50, 33, 194, 17, 50, 17, 211, + 83, 211, 83, 226, 82, 241, 113, 241, 113, 0, 19, 16, + 33, 17, 0, 12, 103, 38, 83, 66, 146, 65, 163, 49, + 178, 33, 196, 226, 240, 18, 227, 209, 34, 193, 35, 161, + 66, 145, 83, 114, 98, 86, 39, 0, 13, 29, 17, 0, + 12, 103, 38, 82, 97, 131, 81, 146, 65, 178, 49, 179, + 17, 210, 17, 211, 242, 242, 242, 242, 242, 242, 200, 0, + 13, 48, 30, 14, 0, 10, 91, 50, 98, 65, 98, 81, + 83, 178, 178, 179, 178, 178, 179, 81, 82, 97, 66, 113, + 51, 98, 50, 99, 43, 0, 10, 112, 25, 7, 240, 240, + 196, 50, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 85, 144, 25, 10, 0, + 7, 65, 161, 145, 145, 161, 145, 145, 161, 145, 145, 161, + 145, 145, 161, 145, 145, 161, 145, 145, 161, 192, 25, 7, + 240, 240, 212, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 37, 144, 21, + 11, 0, 8, 97, 161, 145, 17, 113, 33, 113, 49, 81, + 81, 49, 97, 49, 113, 0, 18, 16, 8, 13, 0, 37, + 59, 240, 240, 176, 10, 6, 240, 240, 98, 81, 97, 97, + 0, 13, 27, 12, 0, 16, 100, 113, 66, 82, 50, 82, + 50, 132, 83, 34, 66, 66, 66, 66, 17, 34, 51, 17, + 52, 34, 0, 9, 48, 32, 12, 0, 9, 4, 162, 162, + 162, 162, 162, 19, 99, 49, 82, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 67, 49, 81, 20, 0, 9, + 64, 22, 9, 0, 12, 84, 66, 49, 34, 50, 34, 50, + 34, 114, 114, 114, 65, 49, 49, 84, 0, 7, 16, 32, + 12, 0, 9, 68, 162, 162, 162, 162, 99, 18, 81, 51, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 81, 51, 99, 20, 0, 9, 32, 22, 10, 0, 14, 4, + 82, 49, 65, 66, 34, 66, 40, 34, 130, 81, 34, 81, + 50, 49, 84, 0, 8, 23, 10, 0, 8, 3, 97, 34, + 66, 34, 66, 130, 102, 98, 130, 130, 130, 130, 130, 130, + 130, 102, 0, 8, 32, 13, 0, 18, 20, 19, 65, 65, + 34, 34, 66, 82, 66, 82, 66, 98, 34, 132, 114, 178, + 200, 81, 113, 49, 129, 49, 129, 50, 97, 102, 240, 48, + 31, 13, 0, 9, 100, 178, 178, 178, 178, 178, 35, 100, + 34, 82, 66, 82, 66, 82, 66, 82, 66, 82, 66, 82, + 66, 82, 66, 53, 36, 0, 10, 20, 6, 240, 240, 114, + 66, 240, 99, 66, 66, 66, 66, 66, 66, 66, 66, 52, + 240, 240, 128, 25, 8, 0, 6, 66, 98, 240, 212, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 34, 34, + 33, 49, 67, 192, 30, 13, 0, 9, 100, 178, 178, 178, + 178, 178, 36, 82, 49, 114, 33, 130, 17, 146, 17, 149, + 130, 34, 114, 34, 114, 50, 69, 21, 0, 10, 22, 8, + 0, 6, 4, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 70, 0, 6, 32, 37, 18, 0, 24, + 99, 20, 36, 83, 51, 50, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 52, 36, 36, 0, 13, 96, 27, 12, 0, + 16, 67, 35, 84, 34, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 52, 36, 0, 9, 32, + 25, 11, 0, 15, 67, 98, 50, 65, 81, 50, 82, 34, + 82, 34, 82, 34, 82, 49, 81, 66, 50, 99, 0, 8, + 112, 31, 12, 0, 16, 68, 19, 99, 49, 82, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 49, 82, + 19, 98, 162, 162, 162, 133, 240, 64, 31, 12, 0, 16, + 99, 33, 81, 49, 17, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 81, 51, 99, 18, 162, 162, 162, + 162, 149, 224, 20, 9, 0, 12, 51, 19, 51, 18, 51, + 18, 50, 114, 114, 114, 114, 114, 100, 0, 7, 48, 23, + 9, 0, 12, 67, 81, 50, 49, 65, 50, 132, 115, 49, + 66, 33, 81, 34, 65, 33, 20, 0, 7, 16, 24, 9, + 0, 8, 33, 129, 129, 114, 86, 82, 114, 114, 114, 114, + 114, 33, 66, 33, 66, 33, 83, 0, 7, 16, 27, 12, + 0, 16, 67, 51, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 51, 84, 19, 0, 9, + 32, 23, 13, 0, 17, 117, 36, 65, 81, 98, 49, 129, + 49, 130, 33, 130, 17, 163, 163, 177, 193, 0, 10, 80, + 37, 18, 0, 24, 100, 36, 36, 50, 66, 65, 97, 66, + 49, 114, 33, 18, 33, 129, 33, 18, 33, 130, 17, 33, + 17, 146, 17, 35, 162, 51, 162, 65, 193, 65, 0, 14, + 48, 24, 12, 0, 16, 69, 20, 66, 49, 114, 17, 131, + 162, 162, 145, 18, 129, 34, 97, 65, 68, 36, 0, 9, + 32, 30, 13, 0, 17, 117, 36, 66, 65, 113, 65, 114, + 49, 114, 33, 145, 33, 146, 17, 147, 178, 178, 177, 193, + 130, 33, 130, 17, 162, 240, 112, 22, 10, 0, 13, 104, + 33, 66, 49, 66, 49, 50, 114, 130, 114, 114, 65, 50, + 65, 40, 0, 7, 96, 25, 7, 240, 240, 242, 66, 82, + 82, 82, 82, 82, 82, 81, 66, 113, 98, 82, 82, 82, + 82, 82, 82, 98, 240, 16, 24, 3, 240, 49, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 80, 25, 7, 240, 240, 194, 98, + 82, 82, 82, 82, 82, 82, 97, 114, 65, 82, 82, 82, + 82, 82, 82, 82, 66, 240, 64, 17, 15, 0, 24, 68, + 97, 49, 36, 81, 33, 68, 49, 33, 116, 0, 19, 16, + 5, 9, 0, 30, 48, 17, 4, 240, 240, 226, 34, 225, + 49, 49, 49, 50, 34, 34, 34, 34, 34, 96, 33, 9, + 0, 9, 65, 129, 129, 100, 66, 17, 17, 49, 35, 34, + 35, 34, 33, 66, 33, 66, 33, 81, 33, 17, 50, 17, + 17, 68, 113, 129, 240, 240, 160, 30, 14, 0, 11, 52, + 146, 49, 129, 50, 114, 50, 114, 194, 149, 196, 162, 194, + 194, 131, 17, 129, 50, 81, 33, 53, 17, 67, 51, 0, + 11, 29, 12, 0, 12, 1, 36, 33, 50, 66, 65, 97, + 49, 129, 33, 129, 33, 129, 33, 129, 49, 97, 66, 66, + 49, 36, 33, 0, 13, 96, 29, 14, 0, 10, 69, 52, + 66, 81, 98, 81, 114, 49, 130, 49, 146, 17, 162, 17, + 178, 152, 146, 152, 146, 194, 194, 166, 0, 11, 16, 20, + 3, 240, 49, 33, 33, 33, 33, 33, 33, 33, 177, 33, + 33, 33, 33, 33, 33, 33, 128, 36, 10, 0, 7, 100, + 81, 65, 65, 50, 65, 146, 146, 113, 19, 65, 51, 49, + 82, 34, 81, 35, 65, 51, 49, 82, 17, 114, 146, 145, + 66, 49, 65, 65, 84, 240, 144, 11, 8, 0, 7, 2, + 34, 34, 34, 0, 18, 32, 50, 18, 0, 14, 22, 162, + 98, 113, 66, 65, 81, 50, 34, 49, 65, 49, 65, 49, + 49, 50, 145, 33, 50, 145, 33, 50, 145, 33, 50, 145, + 33, 50, 145, 49, 49, 65, 49, 65, 50, 49, 49, 81, + 67, 49, 113, 114, 151, 0, 14, 48, 19, 8, 0, 6, + 4, 65, 33, 98, 66, 17, 65, 33, 17, 50, 17, 53, + 0, 14, 48, 22, 7, 0, 10, 81, 97, 33, 33, 33, + 49, 33, 49, 33, 49, 33, 49, 33, 65, 33, 0, 6, + 48, 11, 13, 0, 21, 27, 193, 193, 193, 0, 16, 64, + 8, 8, 0, 15, 6, 0, 11, 32, 55, 18, 0, 14, + 22, 162, 98, 113, 21, 65, 81, 50, 34, 49, 65, 50, + 34, 49, 49, 66, 34, 65, 33, 68, 97, 33, 66, 33, + 81, 33, 66, 34, 65, 33, 66, 34, 17, 33, 49, 50, + 34, 17, 17, 65, 36, 34, 33, 81, 161, 113, 114, 151, + 0, 14, 48, 8, 8, 0, 8, 6, 0, 18, 32, 17, + 8, 0, 6, 20, 49, 65, 33, 65, 33, 65, 49, 33, + 82, 0, 15, 64, 35, 21, 0, 19, 65, 240, 81, 240, + 81, 240, 81, 240, 81, 240, 81, 191, 4, 177, 240, 81, + 240, 81, 240, 81, 240, 81, 240, 81, 240, 240, 47, 4, + 0, 13, 48, 21, 8, 0, 6, 20, 49, 50, 34, 34, + 49, 34, 82, 82, 81, 49, 33, 65, 38, 0, 12, 32, + 19, 9, 0, 6, 116, 65, 65, 50, 49, 129, 83, 131, + 34, 50, 33, 66, 52, 0, 14, 11, 6, 240, 240, 130, + 65, 65, 65, 0, 13, 48, 32, 13, 0, 17, 114, 82, + 66, 82, 66, 82, 66, 82, 66, 82, 65, 98, 65, 98, + 65, 97, 82, 67, 17, 68, 35, 33, 193, 193, 193, 194, + 178, 176, 43, 12, 0, 9, 40, 52, 33, 84, 33, 69, + 33, 84, 33, 84, 33, 99, 33, 129, 33, 129, 33, 129, + 33, 129, 33, 129, 33, 129, 33, 129, 33, 129, 33, 129, + 33, 129, 33, 129, 33, 129, 33, 240, 208, 9, 4, 0, + 7, 2, 34, 0, 5, 96, 9, 7, 0, 19, 49, 115, + 82, 36, 160, 16, 8, 0, 6, 49, 68, 98, 98, 98, + 98, 98, 98, 70, 0, 12, 32, 18, 7, 240, 240, 211, + 49, 49, 33, 49, 33, 49, 33, 49, 51, 53, 0, 12, + 64, 22, 7, 0, 10, 113, 49, 33, 65, 33, 49, 33, + 49, 33, 49, 33, 33, 33, 49, 33, 0, 6, 64, 42, + 18, 0, 13, 113, 113, 100, 113, 130, 97, 146, 97, 146, + 81, 162, 65, 178, 65, 50, 98, 49, 51, 72, 33, 18, + 161, 49, 18, 145, 49, 34, 145, 55, 97, 114, 114, 114, + 113, 117, 0, 13, 96, 43, 17, 0, 13, 17, 113, 84, + 113, 114, 97, 130, 81, 146, 81, 146, 65, 34, 98, 67, + 34, 66, 49, 17, 50, 39, 34, 34, 129, 97, 129, 98, + 129, 81, 145, 81, 49, 82, 65, 65, 81, 86, 0, 13, + 47, 18, 0, 13, 84, 97, 97, 65, 81, 98, 49, 65, + 162, 65, 161, 18, 49, 210, 17, 146, 50, 17, 50, 65, + 65, 17, 51, 84, 17, 49, 18, 161, 49, 18, 145, 49, + 34, 129, 71, 97, 114, 113, 130, 245, 0, 13, 96, 26, + 10, 0, 14, 18, 130, 240, 50, 113, 33, 97, 33, 129, + 130, 114, 114, 114, 65, 50, 51, 34, 81, 50, 65, 69, + 208, 43, 18, 240, 129, 240, 34, 240, 49, 240, 49, 240, + 240, 81, 240, 18, 240, 18, 240, 19, 225, 18, 225, 18, + 210, 34, 193, 50, 193, 50, 178, 66, 168, 146, 83, 129, + 114, 129, 114, 87, 39, 0, 13, 96, 37, 17, 240, 193, + 242, 225, 241, 240, 240, 49, 240, 18, 242, 227, 225, 18, + 209, 18, 193, 34, 193, 50, 162, 50, 161, 67, 152, 130, + 82, 129, 99, 113, 114, 70, 54, 0, 13, 41, 18, 240, + 240, 210, 241, 33, 209, 65, 240, 240, 33, 240, 34, 240, + 18, 243, 241, 18, 225, 18, 209, 35, 193, 50, 178, 50, + 177, 67, 168, 146, 82, 145, 114, 129, 114, 86, 55, 0, + 13, 96, 40, 18, 240, 240, 194, 241, 20, 0, 6, 49, + 240, 18, 240, 18, 240, 19, 225, 18, 225, 18, 210, 34, + 193, 50, 193, 50, 178, 66, 168, 146, 83, 129, 114, 129, + 114, 87, 39, 0, 13, 96, 38, 17, 240, 240, 130, 50, + 162, 50, 0, 5, 113, 240, 17, 243, 227, 209, 18, 209, + 19, 193, 34, 177, 51, 161, 66, 161, 66, 153, 129, 98, + 114, 98, 114, 114, 70, 54, 0, 13, 40, 18, 240, 163, + 225, 49, 209, 49, 227, 240, 240, 65, 240, 33, 240, 19, + 243, 228, 225, 34, 209, 34, 193, 51, 177, 66, 161, 82, + 169, 145, 98, 129, 114, 129, 130, 71, 39, 0, 13, 96, + 47, 22, 0, 17, 76, 179, 98, 179, 113, 161, 18, 113, + 161, 18, 65, 33, 145, 34, 65, 178, 34, 50, 177, 55, + 161, 66, 50, 161, 66, 65, 152, 65, 33, 97, 82, 113, + 81, 98, 113, 66, 98, 98, 38, 44, 0, 16, 96, 36, + 14, 0, 11, 4, 49, 66, 68, 50, 99, 49, 130, 34, + 130, 34, 145, 34, 194, 194, 194, 209, 145, 49, 129, 81, + 113, 82, 81, 133, 161, 226, 210, 194, 148, 240, 80, 39, + 14, 240, 34, 210, 209, 225, 240, 108, 66, 98, 66, 113, + 66, 113, 66, 65, 114, 65, 114, 50, 119, 114, 50, 114, + 65, 114, 65, 33, 66, 113, 66, 113, 66, 98, 44, 0, + 10, 96, 40, 14, 240, 113, 194, 193, 193, 240, 108, 66, + 98, 66, 113, 66, 113, 66, 65, 33, 66, 65, 114, 50, + 119, 114, 50, 114, 65, 114, 65, 33, 66, 113, 66, 113, + 66, 98, 44, 0, 10, 96, 41, 14, 240, 81, 210, 177, + 33, 130, 65, 240, 60, 66, 98, 66, 113, 66, 113, 66, + 65, 114, 65, 114, 50, 119, 114, 50, 114, 65, 114, 65, + 33, 66, 113, 66, 113, 66, 98, 44, 0, 10, 96, 42, + 14, 240, 240, 18, 34, 130, 34, 240, 240, 60, 66, 98, + 66, 113, 66, 113, 66, 49, 49, 66, 49, 130, 49, 134, + 130, 49, 130, 49, 130, 49, 49, 66, 113, 66, 113, 66, + 98, 44, 0, 10, 96, 24, 8, 129, 114, 129, 240, 102, + 66, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 70, 0, 6, 32, 24, 8, 209, 98, 81, 240, 86, + 66, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 70, 0, 6, 32, 26, 8, 240, 50, 81, 33, 49, + 65, 166, 66, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 70, 0, 6, 32, 25, 9, 240, 50, 50, + 34, 50, 240, 87, 66, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 87, 0, 7, 35, 16, 0, 12, + 10, 130, 98, 98, 113, 98, 114, 82, 130, 66, 130, 66, + 130, 38, 98, 66, 130, 66, 130, 66, 129, 82, 114, 82, + 113, 98, 97, 90, 0, 12, 96, 49, 17, 240, 115, 240, + 20, 0, 7, 20, 101, 67, 113, 100, 97, 97, 18, 97, + 97, 34, 81, 97, 35, 65, 97, 50, 65, 97, 66, 49, + 97, 67, 33, 97, 82, 33, 97, 98, 17, 97, 115, 97, + 115, 97, 130, 69, 113, 0, 13, 32, 38, 15, 240, 50, + 226, 225, 241, 240, 197, 145, 81, 113, 113, 82, 114, 65, + 145, 50, 146, 34, 146, 34, 146, 34, 146, 34, 146, 49, + 145, 66, 114, 81, 113, 113, 81, 149, 0, 12, 38, 15, + 240, 130, 194, 209, 209, 240, 197, 145, 81, 113, 113, 82, + 114, 65, 145, 50, 146, 34, 146, 34, 146, 34, 146, 34, + 146, 49, 145, 66, 114, 81, 113, 113, 81, 149, 0, 12, + 40, 15, 240, 97, 211, 177, 34, 145, 81, 240, 149, 145, + 81, 113, 113, 82, 114, 65, 145, 50, 146, 34, 146, 34, + 146, 34, 146, 34, 146, 49, 145, 66, 114, 81, 113, 113, + 81, 149, 0, 12, 38, 15, 240, 67, 177, 36, 0, 6, + 101, 145, 81, 113, 113, 82, 114, 65, 145, 50, 146, 34, + 146, 34, 146, 34, 146, 34, 146, 49, 145, 66, 114, 81, + 113, 113, 81, 149, 0, 12, 39, 15, 240, 50, 50, 130, + 50, 0, 6, 101, 145, 81, 113, 113, 82, 114, 65, 145, + 50, 146, 34, 146, 34, 146, 34, 146, 34, 146, 49, 145, + 66, 114, 81, 113, 113, 81, 149, 0, 12, 32, 15, 0, + 16, 113, 177, 49, 145, 81, 113, 113, 81, 145, 49, 177, + 17, 194, 194, 17, 162, 49, 130, 81, 98, 113, 66, 145, + 49, 177, 0, 9, 80, 43, 15, 0, 11, 101, 49, 81, + 83, 81, 114, 66, 114, 65, 113, 18, 34, 97, 34, 34, + 81, 50, 34, 65, 66, 34, 49, 82, 34, 33, 98, 34, + 17, 113, 66, 114, 66, 113, 83, 81, 81, 53, 0, 12, + 42, 17, 240, 113, 240, 18, 240, 18, 240, 240, 214, 69, + 66, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, + 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 113, 113, + 130, 82, 165, 0, 13, 80, 40, 17, 240, 178, 226, 241, + 241, 240, 182, 69, 66, 129, 98, 129, 98, 129, 98, 129, + 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, + 98, 129, 113, 113, 130, 82, 165, 0, 13, 80, 42, 17, + 240, 145, 243, 210, 33, 177, 81, 240, 134, 69, 66, 129, + 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, + 98, 129, 98, 129, 98, 129, 98, 129, 113, 113, 130, 82, + 165, 0, 13, 80, 41, 17, 240, 98, 50, 162, 50, 0, + 7, 22, 69, 66, 129, 98, 129, 98, 129, 98, 129, 98, + 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, + 129, 113, 113, 130, 82, 165, 0, 13, 80, 33, 17, 240, + 193, 242, 225, 240, 240, 199, 38, 82, 97, 131, 81, 146, + 65, 178, 49, 179, 17, 210, 17, 211, 242, 242, 242, 242, + 242, 242, 200, 0, 13, 48, 29, 14, 0, 10, 70, 162, + 199, 114, 82, 82, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 66, 82, 87, 114, 194, 194, 166, 0, 11, 64, 35, + 12, 0, 9, 69, 98, 50, 66, 66, 66, 66, 66, 49, + 101, 114, 49, 98, 50, 82, 66, 66, 66, 66, 66, 66, + 66, 68, 34, 67, 49, 52, 19, 0, 9, 64, 32, 12, + 0, 9, 18, 162, 193, 193, 240, 100, 113, 66, 82, 50, + 82, 50, 132, 83, 34, 66, 66, 66, 66, 17, 34, 51, + 17, 52, 34, 0, 9, 48, 32, 12, 0, 9, 97, 162, + 146, 240, 240, 36, 113, 50, 98, 34, 98, 34, 147, 99, + 18, 82, 50, 82, 50, 33, 34, 35, 33, 51, 35, 0, + 9, 48, 34, 12, 0, 9, 65, 162, 161, 17, 129, 49, + 240, 68, 113, 66, 82, 50, 82, 50, 132, 83, 34, 66, + 66, 66, 66, 17, 34, 51, 17, 52, 34, 0, 9, 48, + 33, 12, 0, 10, 99, 33, 81, 35, 240, 240, 20, 113, + 66, 82, 50, 82, 50, 132, 83, 34, 66, 66, 66, 66, + 17, 34, 51, 17, 52, 34, 0, 9, 48, 33, 12, 0, + 10, 82, 34, 98, 34, 240, 240, 20, 113, 50, 98, 34, + 98, 34, 147, 99, 18, 82, 50, 82, 50, 33, 34, 35, + 33, 51, 35, 0, 9, 48, 34, 12, 0, 9, 50, 145, + 33, 129, 33, 146, 240, 100, 113, 50, 98, 34, 98, 34, + 147, 99, 18, 82, 50, 82, 50, 33, 34, 35, 33, 51, + 35, 0, 9, 48, 33, 15, 0, 20, 116, 35, 81, 66, + 49, 66, 50, 50, 65, 50, 50, 90, 50, 50, 114, 66, + 65, 34, 66, 65, 34, 49, 18, 33, 68, 51, 0, 11, + 96, 25, 9, 0, 12, 84, 66, 49, 34, 50, 34, 50, + 34, 114, 114, 129, 65, 50, 49, 68, 97, 131, 130, 114, + 68, 192, 27, 10, 0, 7, 82, 130, 161, 161, 240, 36, + 82, 49, 65, 66, 34, 66, 40, 34, 130, 81, 34, 81, + 50, 49, 84, 0, 8, 27, 10, 0, 8, 33, 130, 129, + 129, 240, 36, 82, 49, 65, 66, 34, 66, 40, 34, 130, + 81, 34, 81, 50, 49, 84, 0, 8, 28, 10, 0, 8, + 1, 130, 129, 17, 97, 49, 244, 82, 49, 65, 66, 34, + 66, 40, 34, 130, 81, 34, 81, 50, 49, 84, 0, 8, + 26, 10, 0, 8, 114, 34, 66, 34, 240, 164, 82, 34, + 65, 65, 50, 65, 56, 34, 130, 130, 65, 66, 49, 84, + 0, 8, 21, 7, 240, 240, 193, 98, 98, 240, 67, 82, + 82, 82, 82, 82, 82, 82, 82, 68, 240, 240, 224, 21, + 7, 240, 240, 242, 82, 65, 81, 195, 82, 82, 82, 82, + 82, 82, 82, 82, 68, 240, 240, 240, 23, 8, 0, 6, + 33, 114, 81, 18, 49, 65, 179, 98, 98, 98, 98, 98, + 98, 98, 98, 84, 0, 6, 48, 22, 8, 0, 7, 2, + 34, 34, 34, 240, 67, 98, 98, 98, 98, 98, 98, 98, + 98, 84, 0, 6, 48, 32, 11, 0, 8, 66, 49, 100, + 115, 113, 34, 146, 117, 66, 50, 65, 82, 34, 82, 34, + 82, 34, 82, 34, 82, 49, 81, 66, 50, 99, 0, 8, + 112, 32, 12, 0, 10, 114, 33, 97, 20, 240, 211, 35, + 84, 34, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 52, 36, 0, 9, 32, 30, 11, 0, + 8, 50, 162, 161, 177, 240, 83, 98, 50, 65, 81, 50, + 82, 34, 82, 34, 82, 34, 82, 49, 81, 66, 50, 99, + 0, 8, 112, 30, 11, 0, 9, 2, 130, 145, 145, 240, + 83, 98, 50, 65, 81, 50, 82, 34, 82, 34, 82, 34, + 82, 49, 81, 66, 50, 99, 0, 8, 112, 32, 11, 0, + 8, 97, 161, 145, 17, 113, 49, 240, 51, 98, 50, 65, + 81, 50, 82, 34, 82, 34, 82, 34, 82, 49, 81, 66, + 50, 99, 0, 8, 112, 30, 11, 0, 9, 115, 33, 65, + 35, 240, 227, 98, 50, 65, 81, 50, 82, 34, 82, 34, + 82, 34, 82, 49, 81, 66, 50, 99, 0, 8, 112, 30, + 11, 0, 9, 98, 34, 82, 34, 240, 227, 98, 50, 65, + 81, 50, 82, 34, 82, 34, 82, 34, 82, 49, 81, 66, + 50, 99, 0, 8, 112, 19, 20, 0, 23, 66, 240, 50, + 0, 11, 47, 3, 0, 11, 34, 240, 50, 0, 13, 96, + 31, 11, 0, 15, 67, 33, 50, 50, 65, 66, 50, 49, + 18, 34, 33, 34, 34, 33, 34, 34, 17, 50, 50, 65, + 66, 50, 49, 35, 0, 8, 112, 32, 12, 0, 9, 33, + 178, 178, 240, 240, 19, 51, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 51, 84, 19, + 0, 9, 32, 32, 12, 0, 9, 113, 162, 145, 161, 240, + 67, 51, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 51, 84, 19, 0, 9, 32, 34, + 12, 0, 9, 65, 178, 145, 17, 129, 50, 240, 19, 51, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 51, 84, 19, 0, 9, 32, 32, 12, 0, + 10, 98, 34, 98, 34, 240, 211, 51, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 51, + 84, 19, 0, 9, 32, 36, 13, 0, 10, 97, 178, 162, + 240, 240, 21, 36, 66, 65, 113, 65, 114, 49, 114, 33, + 145, 33, 146, 17, 146, 17, 162, 178, 178, 177, 130, 33, + 130, 17, 163, 240, 96, 36, 11, 0, 8, 50, 131, 146, + 146, 146, 146, 35, 66, 17, 34, 51, 50, 50, 66, 50, + 66, 50, 50, 66, 49, 82, 34, 82, 17, 115, 130, 146, + 146, 146, 130, 240, 80, 34, 13, 0, 11, 98, 34, 114, + 34, 240, 245, 36, 66, 65, 113, 65, 114, 33, 130, 33, + 145, 33, 147, 163, 178, 178, 177, 193, 130, 33, 130, 17, + 162, 240, 112, +}; + +//***************************************************************************** +// +// The glyph offset table for the 22 point Oldstandard font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard22[] = +{ + 0, 5, 23, 38, 73, 116, 166, 206, + 216, 241, 266, 290, 331, 342, 350, 358, + 384, 419, 441, 470, 499, 526, 555, 589, + 611, 645, 678, 689, 705, 741, 754, 790, + 818, 872, 906, 939, 971, 1006, 1041, 1072, + 1111, 1146, 1168, 1194, 1231, 1257, 1313, 1358, + 1392, 1420, 1463, 1500, 1536, 1568, 1604, 1639, + 1692, 1725, 1754, 1784, 1809, 1834, 1859, 1880, + 1888, 1898, 1925, 1957, 1979, 2011, 2033, 2056, + 2088, 2119, 2139, 2164, 2194, 2216, 2253, 2280, + 2305, 2336, 2367, 2387, 2410, 2434, 2461, 2484, + 2521, 2545, 2575, 2597, 2622, 2646, 2671, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2688, 2693, 2710, 2743, 2773, 2802, 2831, 2851, + 2887, 2898, 2948, 2967, 2989, 3000, 3008, 3063, + 3071, 3088, 3123, 3144, 3163, 3174, 3206, 3249, + 3258, 3267, 3283, 3301, 3323, 3365, 3408, 3455, + 3481, 3524, 3561, 3602, 3642, 3680, 3720, 3767, + 3803, 3842, 3882, 3923, 3965, 3989, 4013, 4039, + 4064, 4099, 4148, 4186, 4224, 4264, 4302, 4341, + 4373, 4416, 4458, 4498, 4540, 4581, 4614, 4643, + 4678, 4710, 4742, 4776, 4809, 4842, 4876, 4909, + 4934, 4961, 4988, 5016, 5042, 5063, 5084, 5107, + 5129, 5161, 5193, 5223, 5253, 5285, 5315, 5345, + 5364, 5395, 5427, 5459, 5493, 5525, 5561, 5597, +}; + +//***************************************************************************** +// +// The font definition for the 22 point Oldstandard font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard22 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 21, + + // + // The height of the font. + // + 27, + + // + // The baseline of the font. + // + 21, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard22, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard22Data +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard22b.c b/third_party/fonts/ofl/fonts/fontoldstandard22b.c new file mode 100644 index 0000000..305a62e --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard22b.c @@ -0,0 +1,716 @@ +//***************************************************************************** +// +// fontoldstandard22b.c - Font definition for the 22pt Oldstandard bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 22 point +// Bold: yes +// Italic: no +// Memory usage: 6160 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 22 point Oldstandard bold font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard22bData[5960] = +{ + 5, 9, 0, 31, 64, 23, 5, 240, 240, 17, 51, 35, + 35, 35, 35, 49, 65, 65, 65, 65, 65, 65, 51, 35, + 35, 240, 240, 32, 17, 7, 240, 240, 194, 18, 34, 18, + 34, 18, 34, 18, 34, 18, 0, 15, 16, 36, 15, 0, + 11, 98, 50, 130, 50, 129, 66, 129, 66, 77, 82, 65, + 130, 65, 130, 50, 130, 50, 129, 66, 129, 66, 93, 66, + 65, 130, 50, 130, 50, 129, 66, 0, 12, 59, 12, 0, + 6, 49, 33, 129, 33, 118, 81, 17, 33, 17, 50, 17, + 33, 33, 34, 17, 33, 18, 34, 17, 36, 36, 33, 17, + 55, 103, 118, 97, 21, 34, 17, 36, 34, 17, 33, 18, + 34, 17, 33, 18, 33, 33, 33, 18, 34, 17, 33, 17, + 86, 113, 33, 129, 33, 0, 6, 80, 53, 17, 0, 12, + 115, 114, 81, 33, 97, 82, 34, 65, 98, 34, 65, 98, + 34, 49, 114, 34, 34, 129, 33, 49, 162, 49, 50, 177, + 33, 33, 145, 34, 34, 114, 34, 34, 113, 50, 34, 97, + 66, 34, 97, 66, 34, 81, 97, 33, 81, 130, 0, 13, + 32, 41, 17, 0, 13, 52, 193, 65, 162, 65, 162, 65, + 163, 33, 179, 17, 211, 228, 52, 66, 20, 50, 66, 51, + 49, 82, 67, 33, 67, 84, 83, 99, 84, 83, 101, 37, + 17, 70, 51, 0, 13, 16, 11, 4, 240, 146, 34, 34, + 34, 34, 0, 8, 96, 26, 8, 0, 6, 81, 97, 97, + 98, 82, 98, 83, 83, 83, 83, 83, 83, 83, 83, 98, + 98, 114, 113, 129, 129, 240, 48, 26, 8, 0, 6, 1, + 129, 129, 114, 114, 98, 98, 99, 83, 83, 83, 83, 83, + 82, 98, 98, 82, 97, 97, 97, 240, 128, 23, 10, 0, + 7, 114, 130, 82, 33, 18, 35, 17, 18, 83, 67, 20, + 34, 33, 18, 82, 130, 0, 16, 112, 43, 21, 0, 16, + 98, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, + 66, 240, 66, 240, 66, 191, 4, 162, 240, 66, 240, 66, + 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, + 0, 9, 32, 13, 6, 0, 14, 36, 36, 36, 81, 65, + 81, 50, 240, 16, 9, 8, 0, 15, 6, 38, 0, 11, + 32, 11, 5, 0, 11, 49, 51, 35, 35, 240, 240, 32, + 27, 10, 0, 8, 34, 129, 145, 130, 129, 145, 130, 130, + 129, 130, 130, 129, 145, 130, 130, 129, 130, 130, 129, 145, + 130, 240, 48, 37, 12, 0, 9, 52, 114, 49, 83, 50, + 67, 50, 67, 50, 52, 51, 36, 51, 36, 51, 36, 51, + 36, 51, 36, 51, 51, 50, 67, 50, 67, 50, 82, 49, + 116, 0, 9, 80, 22, 9, 0, 7, 18, 69, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 71, + 0, 7, 34, 12, 0, 9, 53, 82, 51, 50, 83, 34, + 83, 36, 51, 36, 51, 65, 51, 131, 130, 145, 161, 97, + 49, 113, 38, 34, 42, 33, 38, 49, 67, 0, 9, 64, + 33, 12, 0, 9, 37, 97, 66, 66, 67, 51, 51, 51, + 51, 66, 51, 131, 100, 194, 178, 65, 83, 35, 67, 35, + 67, 34, 83, 49, 67, 85, 0, 9, 80, 29, 12, 0, + 9, 98, 147, 132, 132, 113, 19, 113, 19, 97, 35, 82, + 35, 81, 51, 66, 51, 74, 115, 147, 147, 147, 104, 0, + 9, 32, 33, 11, 0, 7, 1, 81, 70, 85, 100, 113, + 161, 161, 19, 98, 35, 65, 66, 147, 131, 50, 51, 36, + 35, 35, 51, 34, 66, 65, 51, 84, 0, 8, 112, 36, + 12, 0, 9, 68, 98, 65, 66, 66, 66, 51, 66, 65, + 67, 147, 20, 68, 35, 51, 66, 51, 67, 35, 67, 35, + 67, 50, 67, 50, 66, 82, 50, 101, 0, 9, 64, 27, + 11, 0, 8, 33, 19, 33, 54, 33, 41, 34, 97, 33, + 113, 145, 145, 161, 145, 146, 130, 146, 131, 131, 131, 146, + 0, 9, 34, 12, 0, 9, 53, 82, 81, 50, 113, 34, + 113, 35, 97, 37, 49, 56, 88, 88, 49, 53, 34, 83, + 34, 113, 34, 113, 34, 113, 50, 81, 101, 0, 9, 64, + 35, 12, 0, 9, 37, 98, 50, 67, 66, 51, 66, 51, + 67, 35, 67, 35, 67, 51, 36, 68, 19, 147, 147, 51, + 50, 67, 50, 66, 66, 65, 66, 100, 0, 9, 96, 16, + 5, 0, 6, 115, 35, 35, 49, 240, 65, 51, 35, 35, + 240, 240, 32, 19, 6, 0, 8, 35, 51, 51, 65, 240, + 129, 68, 36, 36, 81, 65, 81, 50, 240, 16, 34, 19, + 0, 18, 51, 227, 227, 243, 227, 227, 227, 243, 227, 240, + 19, 240, 51, 240, 51, 240, 51, 240, 35, 240, 51, 240, + 51, 240, 51, 240, 35, 0, 7, 48, 13, 21, 0, 34, + 31, 4, 0, 10, 111, 4, 0, 23, 112, 34, 19, 0, + 16, 83, 240, 51, 240, 51, 240, 35, 240, 51, 240, 51, + 240, 51, 240, 50, 240, 51, 240, 19, 227, 227, 227, 243, + 227, 227, 227, 243, 0, 9, 16, 30, 9, 0, 6, 116, + 66, 35, 33, 51, 33, 51, 33, 51, 49, 34, 98, 113, + 114, 113, 17, 97, 17, 113, 129, 115, 99, 99, 0, 7, + 32, 57, 18, 0, 14, 22, 162, 98, 114, 50, 20, 82, + 35, 19, 18, 66, 19, 50, 33, 50, 35, 35, 34, 34, + 19, 51, 34, 34, 19, 50, 50, 34, 19, 50, 50, 34, + 19, 50, 50, 34, 19, 35, 34, 69, 17, 18, 33, 82, + 34, 51, 114, 240, 34, 97, 182, 0, 14, 48, 31, 17, + 0, 13, 81, 242, 243, 227, 212, 213, 193, 19, 177, 35, + 177, 36, 161, 51, 145, 67, 153, 129, 83, 113, 99, 113, + 100, 69, 40, 0, 13, 36, 15, 0, 11, 42, 115, 51, + 99, 67, 83, 67, 83, 67, 83, 67, 83, 51, 103, 131, + 66, 99, 82, 83, 83, 67, 83, 67, 83, 67, 83, 67, + 67, 58, 0, 11, 112, 35, 14, 0, 11, 4, 33, 82, + 68, 65, 99, 50, 114, 50, 114, 35, 114, 35, 129, 35, + 179, 179, 179, 129, 50, 129, 50, 113, 81, 113, 82, 81, + 133, 0, 11, 16, 37, 16, 0, 12, 10, 131, 81, 115, + 97, 99, 98, 83, 98, 83, 99, 67, 99, 67, 99, 67, + 99, 67, 99, 67, 99, 67, 98, 83, 98, 83, 97, 99, + 81, 90, 0, 12, 96, 39, 15, 0, 11, 45, 67, 83, + 67, 98, 67, 98, 67, 49, 49, 67, 49, 131, 34, 135, + 131, 34, 131, 49, 49, 67, 49, 49, 67, 113, 67, 98, + 67, 98, 67, 83, 45, 0, 11, 64, 34, 15, 0, 11, + 45, 67, 83, 67, 98, 67, 98, 67, 49, 49, 67, 49, + 49, 67, 34, 135, 131, 34, 131, 49, 131, 49, 131, 195, + 195, 195, 167, 0, 12, 32, 41, 16, 0, 12, 69, 33, + 113, 68, 97, 99, 82, 114, 82, 129, 67, 129, 67, 129, + 67, 56, 35, 99, 67, 99, 67, 99, 82, 99, 82, 99, + 97, 97, 17, 98, 65, 33, 132, 49, 0, 12, 64, 38, + 18, 0, 13, 71, 39, 67, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 108, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 71, 39, 0, 13, + 96, 22, 9, 0, 6, 103, 67, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 71, 0, 7, 28, + 12, 0, 9, 55, 115, 147, 147, 147, 147, 147, 147, 147, + 147, 67, 35, 67, 35, 67, 35, 65, 67, 81, 50, 116, + 0, 9, 96, 36, 17, 0, 12, 103, 37, 83, 82, 115, + 81, 131, 65, 147, 49, 163, 33, 179, 19, 168, 152, 147, + 36, 131, 36, 131, 52, 115, 52, 115, 68, 99, 68, 71, + 23, 0, 13, 29, 15, 0, 11, 39, 163, 195, 195, 195, + 195, 195, 195, 195, 195, 113, 67, 113, 67, 98, 67, 98, + 67, 83, 67, 83, 45, 0, 11, 64, 56, 19, 0, 14, + 37, 117, 68, 84, 100, 84, 100, 84, 101, 49, 19, 97, + 19, 49, 19, 97, 19, 49, 19, 97, 20, 33, 19, 97, + 35, 17, 35, 97, 35, 17, 35, 97, 52, 35, 97, 52, + 35, 97, 51, 51, 97, 66, 51, 97, 66, 51, 69, 33, + 39, 0, 14, 64, 44, 18, 0, 13, 70, 55, 68, 83, + 116, 81, 133, 65, 133, 65, 129, 20, 49, 129, 35, 49, + 129, 36, 33, 129, 52, 17, 129, 67, 17, 129, 69, 129, + 84, 129, 99, 129, 99, 115, 98, 87, 81, 0, 14, 16, + 36, 15, 0, 11, 101, 145, 81, 113, 113, 82, 114, 66, + 114, 51, 115, 35, 115, 35, 115, 35, 115, 35, 115, 35, + 115, 50, 114, 66, 114, 81, 113, 113, 81, 149, 0, 12, + 30, 15, 0, 11, 42, 115, 67, 83, 83, 67, 83, 67, + 83, 67, 83, 67, 82, 83, 67, 88, 115, 195, 195, 195, + 195, 195, 168, 0, 12, 16, 47, 15, 0, 11, 101, 145, + 81, 113, 113, 82, 114, 66, 114, 51, 115, 35, 115, 35, + 115, 35, 115, 35, 115, 35, 115, 50, 114, 66, 35, 34, + 81, 17, 51, 114, 50, 33, 116, 49, 161, 49, 161, 34, + 165, 164, 195, 240, 48, 40, 16, 0, 12, 10, 131, 66, + 115, 67, 99, 67, 99, 67, 99, 51, 119, 147, 50, 131, + 66, 115, 67, 99, 67, 99, 67, 99, 67, 17, 67, 67, + 17, 67, 67, 17, 40, 35, 0, 12, 48, 37, 13, 0, + 10, 5, 33, 65, 83, 50, 98, 50, 98, 51, 97, 53, + 65, 70, 134, 135, 49, 69, 49, 100, 34, 99, 34, 114, + 35, 98, 33, 18, 81, 49, 38, 0, 10, 32, 35, 16, + 0, 12, 14, 35, 35, 51, 34, 51, 51, 33, 67, 66, + 33, 67, 66, 33, 67, 81, 33, 67, 81, 115, 211, 211, + 211, 211, 211, 211, 211, 183, 0, 12, 96, 38, 17, 0, + 12, 103, 53, 67, 113, 99, 113, 99, 113, 99, 113, 99, + 113, 99, 113, 99, 113, 99, 113, 99, 113, 99, 113, 99, + 113, 99, 113, 114, 97, 131, 66, 165, 0, 13, 80, 35, + 18, 0, 13, 72, 38, 68, 97, 131, 97, 132, 81, 132, + 65, 163, 65, 164, 49, 179, 33, 195, 33, 196, 17, 212, + 228, 228, 242, 240, 18, 240, 18, 0, 14, 80, 52, 25, + 0, 18, 104, 23, 22, 83, 68, 81, 131, 83, 81, 132, + 68, 65, 147, 68, 49, 163, 49, 19, 49, 164, 33, 20, + 33, 179, 33, 20, 33, 179, 33, 35, 17, 197, 53, 212, + 53, 212, 67, 227, 83, 242, 83, 242, 98, 242, 97, 0, + 19, 112, 33, 17, 0, 12, 103, 37, 84, 66, 132, 49, + 148, 49, 164, 17, 181, 212, 227, 228, 212, 193, 20, 161, + 51, 161, 52, 129, 83, 114, 84, 70, 39, 0, 13, 31, + 17, 0, 12, 103, 38, 68, 82, 115, 81, 132, 65, 147, + 49, 163, 49, 164, 17, 195, 17, 197, 211, 227, 227, 227, + 227, 227, 199, 0, 13, 64, 31, 13, 0, 9, 107, 35, + 68, 34, 68, 49, 84, 49, 68, 65, 67, 148, 147, 148, + 147, 148, 147, 81, 52, 81, 51, 82, 36, 67, 43, 0, + 10, 26, 8, 0, 6, 6, 35, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 86, 240, 48, 26, 10, 0, 7, 66, 145, 145, 146, 130, + 145, 146, 130, 145, 145, 146, 130, 145, 146, 130, 145, 145, + 146, 145, 145, 146, 192, 26, 8, 0, 6, 6, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 38, 240, 48, 20, 12, 0, 9, 81, + 163, 147, 130, 18, 98, 49, 97, 66, 66, 82, 34, 113, + 0, 21, 32, 8, 13, 0, 39, 11, 240, 240, 176, 11, + 6, 240, 240, 98, 66, 82, 97, 0, 13, 96, 29, 12, + 0, 16, 100, 98, 50, 83, 35, 67, 35, 132, 98, 19, + 82, 35, 67, 35, 67, 35, 17, 35, 35, 17, 52, 19, + 0, 9, 48, 35, 13, 0, 9, 101, 163, 163, 163, 163, + 163, 19, 100, 34, 83, 50, 83, 51, 67, 51, 67, 51, + 67, 51, 67, 51, 67, 50, 81, 33, 34, 81, 36, 0, + 10, 32, 24, 10, 0, 14, 20, 67, 34, 50, 50, 35, + 35, 35, 34, 51, 115, 115, 130, 65, 51, 49, 84, 0, + 7, 112, 33, 13, 0, 10, 52, 163, 163, 163, 163, 99, + 19, 82, 36, 82, 51, 67, 51, 67, 51, 67, 51, 67, + 51, 67, 51, 82, 51, 82, 36, 99, 21, 0, 10, 24, + 10, 0, 14, 4, 82, 34, 66, 35, 35, 35, 35, 35, + 40, 35, 115, 65, 50, 65, 51, 33, 99, 0, 8, 26, + 11, 0, 8, 100, 98, 34, 67, 19, 67, 18, 83, 102, + 115, 131, 131, 131, 131, 131, 131, 131, 131, 102, 0, 8, + 112, 33, 13, 0, 18, 36, 34, 65, 51, 17, 50, 53, + 50, 51, 82, 51, 97, 50, 132, 114, 182, 120, 104, 65, + 98, 49, 129, 49, 129, 65, 97, 102, 240, 48, 32, 13, + 0, 9, 101, 163, 163, 163, 163, 163, 19, 100, 19, 83, + 35, 83, 35, 83, 35, 83, 35, 83, 35, 83, 35, 83, + 35, 83, 35, 59, 0, 10, 22, 7, 240, 240, 211, 67, + 67, 240, 36, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 53, 240, 240, 224, 28, 9, 0, 7, 35, 99, 99, 240, + 117, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 35, 19, 35, 19, 34, 34, 68, 208, 33, 14, 0, 10, + 69, 179, 179, 179, 179, 179, 36, 83, 49, 115, 33, 131, + 17, 147, 17, 150, 131, 19, 115, 34, 115, 35, 99, 35, + 70, 21, 0, 10, 96, 22, 9, 0, 6, 101, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 71, 0, 7, 37, 17, 0, 23, 52, 19, 35, 84, 20, + 19, 67, 35, 35, 67, 35, 35, 67, 35, 35, 67, 35, + 35, 67, 35, 35, 67, 35, 35, 67, 35, 35, 67, 35, + 35, 63, 0, 13, 28, 12, 0, 16, 68, 19, 84, 19, + 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, + 67, 35, 67, 35, 58, 0, 9, 32, 27, 11, 0, 15, + 67, 98, 50, 66, 50, 51, 51, 35, 51, 35, 51, 35, + 51, 35, 51, 50, 50, 66, 50, 99, 0, 8, 112, 33, + 13, 0, 17, 117, 19, 100, 34, 83, 50, 83, 51, 67, + 51, 67, 51, 67, 51, 67, 51, 67, 50, 84, 34, 83, + 19, 99, 163, 163, 163, 134, 240, 80, 33, 12, 0, 16, + 100, 33, 66, 33, 33, 66, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 66, 51, 66, 36, 83, 19, 147, + 147, 147, 147, 133, 224, 22, 10, 0, 13, 100, 18, 68, + 18, 51, 19, 51, 19, 51, 115, 115, 115, 115, 115, 101, + 0, 8, 16, 23, 9, 0, 12, 68, 65, 65, 49, 65, + 50, 116, 101, 100, 33, 66, 33, 81, 34, 65, 68, 0, + 7, 16, 27, 9, 0, 7, 17, 129, 129, 114, 99, 86, + 67, 99, 99, 99, 99, 99, 33, 51, 33, 51, 33, 51, + 17, 84, 0, 7, 16, 29, 12, 0, 16, 68, 20, 67, + 35, 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, 67, + 35, 67, 35, 67, 20, 83, 20, 0, 9, 32, 24, 12, + 0, 16, 69, 35, 51, 65, 82, 49, 99, 33, 114, 33, + 114, 17, 132, 147, 146, 162, 177, 0, 9, 96, 37, 18, + 0, 24, 101, 21, 35, 67, 50, 65, 83, 51, 49, 98, + 51, 33, 115, 17, 18, 33, 115, 17, 20, 146, 17, 20, + 147, 51, 147, 50, 178, 50, 177, 81, 0, 14, 32, 26, + 12, 0, 16, 69, 20, 51, 49, 99, 17, 130, 17, 131, + 163, 147, 129, 19, 97, 35, 97, 51, 52, 21, 0, 9, + 32, 30, 12, 0, 16, 69, 35, 51, 65, 83, 33, 99, + 33, 114, 33, 115, 17, 131, 147, 147, 161, 177, 177, 130, + 17, 116, 130, 17, 146, 240, 80, 25, 11, 0, 15, 40, + 50, 35, 65, 51, 65, 35, 131, 115, 116, 33, 67, 49, + 51, 65, 51, 50, 41, 0, 8, 64, 27, 9, 0, 6, + 34, 82, 99, 99, 99, 99, 99, 99, 99, 98, 82, 146, + 115, 99, 99, 99, 99, 99, 99, 114, 146, 240, 80, 25, + 4, 240, 146, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 96, + 27, 9, 240, 240, 242, 146, 115, 99, 99, 99, 99, 99, + 99, 114, 146, 82, 99, 99, 99, 99, 99, 99, 99, 98, + 82, 240, 160, 18, 15, 0, 24, 67, 113, 55, 81, 33, + 53, 49, 33, 87, 49, 100, 0, 19, 16, 5, 9, 0, + 31, 64, 21, 5, 0, 6, 115, 35, 35, 49, 65, 65, + 65, 65, 65, 65, 51, 35, 35, 35, 35, 50, 112, 37, + 10, 0, 11, 97, 145, 131, 99, 17, 66, 17, 18, 35, + 17, 18, 35, 17, 18, 35, 17, 83, 17, 83, 17, 83, + 17, 98, 17, 33, 67, 17, 114, 129, 145, 240, 240, 80, + 32, 15, 0, 12, 20, 147, 50, 114, 51, 99, 51, 99, + 195, 165, 198, 148, 195, 195, 194, 147, 18, 81, 33, 51, + 66, 33, 56, 67, 36, 0, 11, 112, 31, 12, 0, 13, + 65, 22, 17, 36, 36, 34, 98, 33, 129, 33, 129, 33, + 129, 33, 129, 34, 98, 50, 66, 49, 22, 17, 33, 129, + 0, 12, 32, 30, 14, 0, 10, 69, 52, 52, 65, 84, + 65, 99, 49, 116, 33, 131, 17, 147, 17, 163, 137, 131, + 137, 131, 179, 179, 179, 151, 0, 11, 16, 21, 4, 240, + 146, 34, 34, 34, 34, 34, 34, 34, 240, 50, 34, 34, + 34, 34, 34, 34, 34, 160, 40, 12, 0, 9, 52, 114, + 65, 66, 66, 66, 51, 66, 51, 67, 149, 119, 65, 53, + 49, 84, 34, 98, 36, 81, 53, 49, 71, 117, 147, 67, + 50, 67, 50, 66, 66, 81, 50, 115, 240, 48, 13, 9, + 0, 6, 98, 34, 51, 19, 35, 19, 0, 21, 80, 54, + 18, 0, 14, 22, 162, 98, 113, 66, 50, 82, 34, 34, + 34, 65, 50, 49, 49, 49, 51, 49, 65, 33, 51, 129, + 33, 51, 129, 33, 51, 129, 33, 51, 65, 49, 33, 66, + 49, 65, 49, 50, 49, 49, 65, 83, 50, 81, 161, 114, + 98, 166, 0, 14, 48, 19, 8, 0, 6, 19, 66, 18, + 65, 18, 68, 50, 18, 50, 18, 54, 38, 0, 14, 32, + 25, 8, 0, 12, 33, 33, 49, 33, 50, 18, 50, 18, + 50, 18, 50, 18, 50, 18, 65, 33, 66, 33, 0, 7, + 32, 13, 13, 0, 21, 27, 193, 193, 193, 193, 193, 0, + 14, 112, 9, 8, 0, 15, 6, 38, 0, 11, 32, 56, + 18, 0, 14, 22, 162, 98, 120, 34, 82, 19, 34, 34, + 65, 35, 35, 33, 49, 51, 35, 49, 33, 51, 34, 65, + 33, 53, 97, 33, 51, 34, 65, 33, 51, 35, 49, 33, + 51, 36, 33, 49, 35, 36, 17, 65, 21, 34, 18, 81, + 161, 114, 98, 166, 0, 14, 48, 8, 8, 0, 7, 6, + 0, 20, 32, 17, 9, 0, 7, 3, 66, 49, 49, 81, + 33, 81, 34, 50, 53, 0, 18, 48, 37, 21, 0, 16, + 98, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, + 66, 191, 4, 162, 240, 66, 240, 66, 240, 66, 240, 66, + 240, 66, 0, 6, 95, 4, 0, 13, 48, 20, 9, 0, + 6, 117, 50, 35, 35, 19, 83, 97, 98, 49, 33, 21, + 39, 33, 35, 0, 15, 22, 10, 0, 7, 100, 81, 50, + 66, 34, 129, 99, 162, 66, 35, 35, 35, 34, 50, 84, + 0, 15, 64, 11, 6, 240, 240, 130, 66, 50, 49, 0, + 14, 16, 36, 13, 0, 18, 2, 65, 83, 51, 67, 51, + 67, 51, 67, 51, 66, 67, 66, 66, 97, 66, 33, 49, + 51, 18, 50, 23, 33, 35, 34, 49, 194, 178, 179, 163, + 178, 160, 46, 14, 0, 10, 121, 69, 33, 86, 33, 86, + 33, 71, 33, 86, 33, 86, 33, 101, 33, 116, 33, 146, + 33, 146, 33, 146, 33, 146, 33, 146, 33, 146, 33, 146, + 33, 146, 33, 146, 33, 146, 33, 146, 33, 240, 240, 32, + 11, 5, 0, 7, 81, 51, 35, 35, 0, 7, 96, 10, + 6, 0, 16, 81, 81, 98, 66, 35, 144, 17, 7, 240, + 240, 226, 52, 67, 67, 67, 67, 67, 67, 67, 53, 0, + 10, 96, 20, 8, 0, 6, 20, 50, 34, 34, 34, 34, + 34, 34, 34, 49, 33, 82, 70, 0, 14, 32, 25, 8, + 0, 12, 1, 33, 81, 33, 65, 34, 50, 18, 50, 18, + 50, 18, 50, 18, 49, 33, 49, 33, 0, 7, 64, 45, + 19, 0, 14, 36, 114, 115, 113, 131, 97, 147, 97, 147, + 81, 163, 66, 163, 65, 51, 83, 50, 51, 69, 33, 52, + 162, 33, 19, 161, 49, 19, 145, 49, 35, 130, 56, 97, + 115, 114, 115, 113, 102, 0, 14, 80, 47, 18, 0, 13, + 68, 113, 115, 113, 115, 97, 131, 97, 131, 81, 147, 81, + 19, 83, 67, 35, 51, 52, 35, 37, 33, 19, 19, 129, + 83, 145, 82, 145, 81, 162, 65, 65, 97, 65, 21, 82, + 71, 81, 81, 35, 0, 13, 112, 50, 20, 0, 15, 36, + 98, 113, 50, 81, 130, 34, 66, 193, 81, 163, 81, 226, + 49, 162, 35, 17, 66, 67, 35, 17, 51, 66, 50, 17, + 67, 100, 18, 52, 177, 49, 19, 162, 33, 35, 161, 56, + 113, 115, 145, 115, 129, 117, 0, 15, 48, 28, 9, 0, + 12, 67, 99, 99, 114, 97, 33, 81, 33, 129, 113, 114, + 99, 98, 33, 51, 49, 35, 49, 35, 49, 50, 33, 83, + 208, 38, 17, 240, 98, 243, 240, 17, 240, 33, 240, 240, + 49, 242, 243, 227, 212, 213, 193, 19, 177, 35, 177, 36, + 161, 36, 145, 67, 153, 129, 68, 113, 99, 113, 100, 69, + 40, 0, 13, 36, 17, 240, 162, 242, 226, 241, 240, 240, + 49, 242, 243, 227, 212, 213, 193, 19, 177, 35, 177, 36, + 161, 36, 145, 67, 153, 129, 68, 113, 99, 113, 100, 69, + 40, 0, 13, 37, 17, 240, 145, 243, 210, 18, 177, 66, + 240, 241, 242, 243, 227, 212, 213, 193, 19, 177, 35, 177, + 36, 161, 51, 145, 67, 153, 129, 83, 113, 99, 113, 100, + 69, 40, 0, 13, 35, 17, 240, 193, 166, 177, 35, 0, + 6, 1, 242, 243, 227, 212, 213, 197, 177, 35, 177, 36, + 145, 52, 145, 67, 153, 113, 84, 113, 99, 113, 100, 69, + 40, 0, 13, 40, 17, 240, 98, 34, 179, 19, 163, 19, + 0, 5, 113, 240, 17, 243, 227, 227, 209, 19, 193, 19, + 193, 19, 177, 36, 161, 51, 161, 51, 153, 129, 68, 129, + 83, 114, 84, 70, 24, 0, 13, 39, 17, 240, 131, 209, + 49, 193, 49, 211, 240, 240, 33, 240, 18, 227, 227, 213, + 197, 193, 19, 177, 36, 161, 36, 161, 51, 145, 68, 137, + 129, 83, 113, 100, 97, 100, 69, 40, 0, 13, 51, 23, + 0, 18, 45, 180, 83, 180, 98, 161, 19, 98, 161, 19, + 49, 49, 145, 35, 49, 209, 35, 34, 193, 55, 193, 51, + 34, 177, 67, 49, 49, 120, 49, 49, 97, 83, 113, 97, + 83, 98, 82, 83, 98, 82, 83, 83, 38, 45, 0, 17, + 64, 39, 14, 0, 11, 4, 49, 66, 68, 65, 99, 50, + 114, 50, 114, 35, 129, 35, 129, 35, 179, 179, 179, 129, + 50, 129, 50, 113, 66, 113, 82, 81, 133, 161, 226, 210, + 194, 148, 240, 80, 43, 15, 240, 50, 226, 225, 241, 240, + 141, 67, 83, 67, 98, 67, 98, 67, 49, 49, 67, 49, + 131, 34, 135, 131, 34, 131, 49, 49, 67, 49, 49, 67, + 113, 67, 98, 67, 98, 67, 83, 45, 0, 11, 64, 43, + 15, 240, 130, 194, 194, 209, 240, 141, 67, 83, 67, 98, + 67, 98, 67, 49, 49, 67, 49, 131, 34, 135, 131, 34, + 131, 49, 49, 67, 49, 49, 67, 113, 67, 98, 67, 98, + 67, 83, 45, 0, 11, 64, 45, 15, 240, 97, 211, 178, + 18, 145, 81, 240, 93, 67, 83, 67, 98, 67, 98, 67, + 49, 49, 67, 49, 131, 34, 135, 131, 34, 131, 49, 49, + 67, 49, 49, 67, 113, 67, 98, 67, 98, 67, 83, 45, + 0, 11, 64, 46, 15, 240, 50, 34, 147, 19, 131, 19, + 240, 240, 93, 67, 83, 67, 98, 67, 98, 67, 49, 49, + 67, 49, 131, 34, 135, 131, 34, 131, 49, 49, 67, 49, + 49, 67, 113, 67, 98, 67, 98, 67, 83, 45, 0, 11, + 64, 24, 9, 161, 130, 130, 129, 231, 67, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 71, 0, + 7, 24, 9, 226, 98, 98, 113, 231, 67, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 71, 0, + 7, 26, 9, 193, 115, 82, 18, 49, 81, 183, 67, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 71, 0, 7, 27, 9, 146, 34, 51, 19, 35, 19, 240, + 87, 67, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 71, 0, 7, 37, 16, 0, 12, 10, 131, + 81, 115, 97, 99, 98, 83, 98, 83, 99, 67, 99, 39, + 67, 67, 99, 67, 99, 67, 99, 67, 98, 83, 98, 83, + 97, 99, 81, 90, 0, 12, 96, 49, 18, 240, 147, 230, + 193, 49, 240, 240, 230, 55, 68, 83, 116, 81, 133, 65, + 133, 65, 129, 20, 49, 129, 35, 49, 129, 36, 33, 129, + 52, 17, 129, 67, 17, 129, 69, 129, 84, 129, 99, 129, + 99, 115, 98, 87, 81, 0, 14, 16, 40, 15, 50, 210, + 211, 226, 225, 240, 197, 145, 81, 113, 113, 82, 114, 66, + 114, 51, 115, 35, 115, 35, 115, 35, 115, 35, 115, 35, + 115, 50, 114, 66, 114, 81, 113, 113, 81, 149, 0, 12, + 40, 15, 130, 210, 195, 178, 209, 240, 197, 145, 81, 113, + 113, 82, 114, 66, 114, 51, 115, 35, 115, 35, 115, 35, + 115, 35, 115, 35, 115, 50, 114, 66, 114, 81, 113, 113, + 81, 149, 0, 12, 42, 15, 97, 211, 195, 178, 18, 130, + 82, 240, 133, 145, 81, 113, 113, 82, 114, 66, 114, 51, + 115, 35, 115, 35, 115, 35, 115, 35, 115, 35, 115, 50, + 114, 66, 114, 81, 113, 113, 81, 149, 0, 12, 39, 15, + 240, 67, 183, 0, 6, 101, 145, 81, 113, 113, 82, 114, + 66, 114, 51, 115, 35, 115, 35, 115, 35, 115, 35, 115, + 35, 115, 50, 114, 66, 114, 81, 113, 113, 81, 149, 0, + 12, 43, 15, 240, 51, 19, 131, 19, 131, 19, 240, 240, + 149, 145, 81, 113, 113, 82, 114, 66, 114, 51, 115, 35, + 115, 35, 115, 35, 115, 35, 115, 35, 115, 50, 114, 66, + 114, 81, 113, 113, 81, 149, 0, 12, 33, 16, 0, 18, + 2, 177, 50, 146, 66, 114, 98, 82, 130, 50, 162, 18, + 195, 211, 194, 18, 162, 50, 130, 82, 98, 114, 66, 146, + 34, 177, 0, 10, 32, 42, 15, 0, 11, 116, 49, 82, + 52, 81, 84, 66, 84, 66, 84, 51, 70, 35, 51, 19, + 35, 50, 35, 35, 34, 51, 35, 19, 51, 38, 67, 52, + 82, 68, 82, 68, 81, 84, 65, 81, 53, 0, 12, 45, + 17, 81, 240, 18, 240, 18, 240, 17, 240, 240, 215, 53, + 67, 113, 99, 113, 99, 113, 99, 113, 99, 113, 99, 113, + 99, 113, 99, 113, 99, 113, 99, 113, 99, 113, 99, 113, + 115, 81, 131, 66, 165, 0, 13, 80, 42, 17, 146, 242, + 226, 241, 241, 240, 183, 53, 67, 113, 99, 113, 99, 113, + 99, 113, 99, 113, 99, 113, 99, 113, 99, 113, 99, 113, + 99, 113, 99, 113, 99, 113, 114, 97, 131, 66, 165, 0, + 13, 80, 44, 17, 113, 240, 18, 228, 194, 34, 161, 240, + 231, 53, 67, 113, 99, 113, 99, 113, 99, 113, 99, 113, + 99, 113, 99, 113, 99, 113, 99, 113, 99, 113, 99, 113, + 99, 113, 114, 97, 131, 66, 165, 0, 13, 80, 45, 17, + 240, 99, 35, 147, 35, 147, 35, 240, 240, 151, 53, 67, + 113, 99, 113, 99, 113, 99, 113, 99, 113, 99, 113, 99, + 113, 99, 113, 99, 113, 99, 113, 99, 113, 99, 113, 114, + 97, 131, 66, 165, 0, 13, 80, 35, 17, 240, 179, 226, + 226, 225, 240, 183, 38, 68, 82, 115, 81, 132, 65, 147, + 49, 163, 49, 164, 17, 195, 17, 197, 211, 227, 227, 227, + 227, 227, 199, 0, 13, 64, 29, 15, 0, 11, 40, 147, + 195, 200, 115, 67, 83, 83, 67, 83, 67, 83, 67, 83, + 67, 67, 88, 115, 195, 195, 195, 168, 0, 12, 16, 38, + 13, 0, 10, 51, 130, 35, 98, 35, 83, 35, 83, 35, + 83, 34, 99, 17, 131, 34, 99, 50, 83, 51, 67, 51, + 67, 51, 67, 51, 69, 19, 69, 18, 53, 19, 0, 10, + 32, 34, 12, 0, 9, 18, 162, 178, 178, 240, 100, 98, + 50, 83, 35, 67, 35, 81, 51, 102, 82, 35, 67, 35, + 67, 35, 17, 35, 35, 17, 52, 19, 0, 9, 48, 34, + 12, 0, 9, 82, 147, 146, 145, 240, 116, 98, 50, 83, + 35, 67, 35, 132, 98, 19, 82, 35, 67, 35, 67, 35, + 17, 35, 35, 17, 52, 19, 0, 9, 48, 36, 12, 0, + 9, 50, 147, 145, 18, 113, 65, 240, 68, 98, 50, 83, + 35, 67, 35, 132, 98, 19, 82, 35, 67, 35, 67, 35, + 17, 35, 35, 17, 52, 19, 0, 9, 48, 35, 12, 0, + 9, 33, 166, 81, 51, 240, 240, 20, 98, 50, 83, 35, + 67, 35, 132, 98, 19, 82, 35, 67, 35, 67, 35, 17, + 35, 35, 17, 52, 19, 0, 9, 48, 36, 12, 0, 9, + 17, 50, 83, 35, 67, 35, 240, 244, 98, 50, 83, 35, + 67, 35, 132, 98, 19, 82, 35, 67, 35, 67, 35, 17, + 35, 35, 17, 52, 19, 0, 9, 48, 36, 12, 0, 9, + 50, 145, 33, 129, 33, 146, 240, 100, 98, 50, 83, 35, + 67, 35, 132, 98, 19, 82, 35, 67, 35, 67, 35, 17, + 35, 35, 17, 52, 19, 0, 9, 48, 35, 15, 0, 20, + 116, 20, 66, 51, 34, 51, 35, 35, 35, 35, 35, 100, + 35, 66, 24, 50, 35, 115, 35, 65, 35, 35, 65, 35, + 36, 33, 68, 36, 0, 11, 96, 27, 10, 0, 14, 20, + 67, 49, 50, 50, 35, 35, 35, 34, 51, 115, 115, 130, + 65, 51, 49, 84, 113, 146, 146, 130, 99, 224, 29, 10, + 0, 7, 82, 130, 146, 161, 240, 36, 82, 34, 66, 35, + 35, 35, 35, 35, 40, 35, 115, 65, 50, 65, 51, 33, + 99, 0, 8, 29, 10, 0, 8, 18, 130, 114, 113, 240, + 52, 82, 34, 66, 35, 35, 35, 35, 35, 40, 35, 115, + 65, 50, 65, 51, 33, 99, 0, 8, 29, 10, 0, 7, + 114, 130, 116, 81, 65, 244, 82, 34, 66, 35, 35, 35, + 35, 35, 40, 35, 115, 65, 50, 65, 51, 33, 99, 0, + 8, 30, 10, 0, 7, 97, 34, 67, 19, 51, 19, 240, + 148, 82, 34, 66, 35, 35, 35, 35, 35, 40, 35, 115, + 130, 65, 51, 33, 99, 0, 8, 22, 7, 240, 240, 193, + 98, 98, 98, 164, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 53, 240, 240, 224, 22, 7, 0, 5, 97, 82, 66, + 66, 180, 67, 67, 67, 67, 67, 67, 67, 67, 67, 53, + 240, 240, 224, 24, 9, 0, 7, 2, 115, 82, 18, 49, + 81, 196, 99, 99, 99, 99, 99, 99, 99, 99, 99, 85, + 0, 7, 16, 21, 8, 0, 7, 6, 38, 38, 180, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 69, 0, 6, 32, + 34, 11, 0, 8, 67, 18, 99, 131, 113, 19, 147, 86, + 66, 50, 66, 51, 35, 51, 35, 51, 35, 51, 35, 51, + 35, 51, 50, 50, 66, 50, 99, 0, 8, 112, 32, 12, + 0, 9, 113, 117, 101, 240, 228, 19, 84, 19, 67, 35, + 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, + 67, 35, 58, 0, 9, 32, 32, 11, 0, 8, 65, 162, + 162, 161, 240, 83, 98, 50, 66, 50, 51, 51, 35, 51, + 35, 51, 35, 51, 35, 51, 50, 50, 66, 50, 99, 0, + 8, 112, 32, 11, 0, 9, 1, 146, 130, 145, 240, 83, + 98, 50, 66, 50, 51, 51, 35, 51, 35, 51, 35, 51, + 35, 51, 50, 50, 66, 50, 99, 0, 8, 112, 34, 11, + 0, 8, 97, 147, 114, 17, 98, 50, 240, 35, 98, 50, + 66, 50, 51, 51, 35, 51, 35, 51, 35, 51, 35, 51, + 50, 50, 66, 50, 99, 0, 8, 112, 32, 11, 0, 9, + 17, 86, 65, 35, 240, 227, 98, 50, 66, 50, 51, 51, + 35, 51, 35, 51, 35, 51, 35, 51, 50, 50, 66, 50, + 99, 0, 8, 112, 34, 11, 0, 8, 50, 34, 83, 19, + 67, 19, 240, 211, 98, 50, 66, 50, 51, 51, 35, 51, + 35, 51, 35, 51, 35, 51, 50, 50, 66, 50, 99, 0, + 8, 112, 27, 21, 0, 22, 3, 240, 51, 240, 51, 240, + 65, 0, 9, 47, 4, 0, 9, 33, 240, 67, 240, 51, + 240, 51, 0, 14, 48, 30, 11, 0, 15, 67, 33, 50, + 50, 66, 50, 51, 51, 35, 36, 35, 17, 19, 36, 35, + 35, 51, 50, 50, 66, 50, 49, 35, 0, 8, 112, 34, + 12, 0, 9, 34, 162, 178, 240, 240, 20, 20, 67, 35, + 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, + 67, 35, 67, 20, 83, 20, 0, 9, 32, 34, 12, 0, + 9, 97, 162, 161, 161, 240, 68, 20, 67, 35, 67, 35, + 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, + 67, 20, 83, 20, 0, 9, 32, 36, 12, 0, 9, 65, + 178, 145, 18, 113, 49, 240, 36, 20, 67, 35, 67, 35, + 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, + 67, 20, 83, 20, 0, 9, 32, 36, 12, 0, 9, 18, + 34, 99, 19, 83, 19, 240, 212, 20, 67, 35, 67, 35, + 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, 67, 35, + 67, 20, 83, 20, 0, 9, 32, 35, 12, 0, 9, 113, + 162, 146, 161, 240, 53, 35, 51, 65, 83, 49, 83, 33, + 114, 33, 115, 17, 131, 147, 147, 161, 177, 177, 130, 17, + 116, 130, 17, 146, 240, 80, 37, 13, 0, 10, 33, 163, + 133, 163, 163, 163, 35, 85, 19, 68, 35, 67, 51, 67, + 51, 67, 50, 83, 50, 83, 34, 99, 33, 115, 17, 132, + 147, 163, 163, 163, 146, 240, 128, 37, 12, 0, 9, 34, + 34, 99, 19, 83, 19, 240, 197, 35, 51, 65, 83, 49, + 83, 33, 114, 33, 115, 17, 116, 147, 147, 161, 177, 177, + 130, 17, 116, 130, 17, 146, 240, 80, +}; + +//***************************************************************************** +// +// The glyph offset table for the 22 point Oldstandard bold font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard22b[] = +{ + 0, 5, 28, 45, 81, 140, 193, 234, + 245, 271, 297, 320, 363, 376, 385, 396, + 423, 460, 482, 516, 549, 578, 611, 647, + 674, 708, 743, 759, 778, 812, 825, 859, + 889, 946, 977, 1013, 1048, 1085, 1124, 1158, + 1199, 1237, 1259, 1287, 1323, 1352, 1408, 1452, + 1488, 1518, 1565, 1605, 1642, 1677, 1715, 1750, + 1802, 1835, 1866, 1897, 1923, 1949, 1975, 1995, + 2003, 2014, 2043, 2078, 2102, 2135, 2159, 2185, + 2218, 2250, 2272, 2300, 2333, 2355, 2392, 2420, + 2447, 2480, 2513, 2535, 2558, 2585, 2614, 2638, + 2675, 2701, 2731, 2756, 2783, 2808, 2835, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2853, 2858, 2879, 2916, 2948, 2979, 3009, 3030, + 3070, 3083, 3137, 3156, 3181, 3194, 3203, 3259, + 3267, 3284, 3321, 3341, 3363, 3374, 3410, 3456, + 3467, 3477, 3494, 3514, 3539, 3584, 3631, 3681, + 3709, 3747, 3783, 3820, 3855, 3895, 3934, 3985, + 4024, 4067, 4110, 4155, 4201, 4225, 4249, 4275, + 4302, 4339, 4388, 4428, 4468, 4510, 4549, 4592, + 4625, 4667, 4712, 4754, 4798, 4843, 4878, 4907, + 4945, 4979, 5013, 5049, 5084, 5120, 5156, 5191, + 5218, 5247, 5276, 5305, 5335, 5357, 5379, 5403, + 5424, 5458, 5490, 5522, 5554, 5588, 5620, 5654, + 5681, 5711, 5745, 5779, 5815, 5851, 5886, 5923, +}; + +//***************************************************************************** +// +// The font definition for the 22 point Oldstandard bold font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard22b = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 22, + + // + // The height of the font. + // + 28, + + // + // The baseline of the font. + // + 22, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard22b, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard22bData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard22i.c b/third_party/fonts/ofl/fonts/fontoldstandard22i.c new file mode 100644 index 0000000..5d7712b --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard22i.c @@ -0,0 +1,724 @@ +//***************************************************************************** +// +// fontoldstandard22i.c - Font definition for the 22pt Oldstandard italic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 22 point +// Bold: no +// Italic: yes +// Memory usage: 6256 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 22 point Oldstandard italic font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard22iData[6053] = +{ + 5, 9, 0, 30, 48, 21, 8, 0, 6, 66, 83, 83, + 83, 82, 98, 97, 113, 97, 113, 113, 225, 99, 98, 0, + 6, 80, 16, 7, 240, 240, 82, 33, 34, 33, 33, 34, + 33, 33, 97, 0, 15, 32, 35, 16, 0, 12, 113, 49, + 177, 49, 161, 49, 177, 49, 124, 113, 49, 177, 49, 161, + 49, 177, 49, 161, 65, 124, 113, 49, 161, 49, 177, 49, + 161, 49, 0, 13, 32, 60, 14, 0, 7, 113, 17, 177, + 17, 134, 114, 17, 17, 17, 97, 33, 17, 33, 81, 17, + 17, 34, 81, 17, 17, 18, 99, 17, 164, 161, 19, 145, + 17, 18, 82, 17, 17, 18, 68, 17, 49, 65, 33, 17, + 49, 65, 33, 17, 34, 81, 17, 17, 18, 117, 145, 17, + 177, 17, 0, 8, 16, 48, 16, 0, 11, 81, 68, 113, + 49, 49, 82, 50, 55, 66, 49, 65, 81, 65, 49, 98, + 33, 49, 131, 65, 225, 50, 145, 49, 33, 113, 49, 49, + 97, 50, 49, 82, 50, 49, 81, 66, 49, 65, 82, 33, + 65, 115, 0, 12, 64, 44, 18, 0, 14, 98, 226, 33, + 209, 49, 194, 33, 209, 33, 227, 50, 131, 65, 18, 82, + 33, 49, 33, 81, 65, 33, 130, 65, 17, 131, 66, 146, + 82, 65, 66, 81, 65, 98, 51, 33, 132, 35, 0, 14, + 48, 10, 4, 240, 82, 34, 33, 49, 0, 9, 48, 26, + 10, 0, 7, 17, 129, 129, 129, 129, 129, 145, 129, 145, + 145, 129, 145, 145, 145, 145, 145, 145, 145, 161, 146, 240, + 192, 26, 10, 0, 6, 113, 161, 145, 145, 161, 145, 145, + 145, 145, 129, 145, 145, 129, 145, 129, 145, 129, 129, 129, + 129, 240, 224, 22, 10, 0, 7, 113, 145, 97, 33, 34, + 34, 17, 18, 83, 101, 66, 17, 34, 81, 145, 0, 15, + 96, 41, 21, 0, 16, 113, 240, 81, 240, 81, 240, 81, + 240, 81, 240, 81, 240, 81, 240, 81, 240, 81, 191, 4, + 177, 240, 81, 240, 81, 240, 81, 240, 81, 240, 81, 240, + 81, 240, 81, 0, 9, 32, 12, 5, 0, 11, 35, 35, + 65, 65, 49, 49, 240, 64, 10, 9, 0, 16, 65, 53, + 49, 0, 12, 32, 10, 5, 0, 11, 49, 51, 50, 240, + 240, 32, 27, 10, 0, 7, 17, 129, 145, 145, 145, 129, + 145, 145, 129, 145, 145, 129, 145, 145, 129, 145, 145, 129, + 145, 145, 129, 240, 64, 35, 12, 0, 9, 84, 98, 49, + 82, 66, 51, 66, 50, 82, 35, 82, 34, 98, 34, 98, + 34, 83, 34, 83, 33, 98, 49, 83, 49, 82, 66, 50, + 100, 0, 9, 112, 23, 11, 0, 9, 33, 146, 115, 98, + 18, 146, 130, 146, 146, 146, 130, 146, 146, 146, 130, 104, + 0, 8, 80, 33, 13, 0, 10, 52, 129, 66, 81, 82, + 65, 98, 68, 50, 82, 66, 162, 161, 162, 146, 146, 97, + 66, 81, 65, 34, 34, 65, 37, 81, 51, 0, 10, 64, + 29, 13, 0, 10, 52, 114, 66, 83, 50, 82, 66, 178, + 162, 116, 194, 193, 194, 66, 67, 51, 66, 65, 98, 81, + 66, 116, 0, 10, 80, 27, 13, 0, 10, 114, 162, 178, + 162, 162, 177, 17, 130, 18, 113, 34, 113, 50, 97, 66, + 91, 114, 178, 178, 135, 0, 10, 32, 31, 13, 0, 10, + 50, 49, 97, 20, 113, 193, 193, 177, 19, 130, 50, 81, + 82, 178, 178, 66, 82, 51, 66, 66, 82, 81, 66, 116, + 0, 10, 80, 34, 12, 0, 9, 84, 113, 65, 81, 66, + 66, 65, 66, 162, 19, 99, 50, 51, 66, 51, 66, 50, + 82, 50, 82, 50, 82, 50, 66, 81, 50, 116, 0, 9, + 96, 25, 12, 0, 9, 51, 49, 54, 33, 49, 52, 177, + 161, 161, 161, 161, 161, 162, 161, 162, 147, 147, 147, 0, + 10, 16, 35, 14, 0, 11, 21, 129, 81, 98, 82, 82, + 97, 82, 82, 83, 65, 115, 33, 113, 20, 113, 51, 97, + 97, 97, 98, 65, 114, 81, 97, 97, 82, 117, 0, 11, + 48, 33, 12, 0, 9, 68, 113, 65, 82, 66, 50, 82, + 50, 82, 50, 82, 50, 67, 50, 52, 68, 18, 162, 162, + 51, 50, 66, 50, 81, 50, 116, 0, 9, 112, 15, 7, + 0, 10, 2, 67, 81, 240, 240, 33, 83, 82, 0, 5, + 96, 18, 7, 0, 10, 2, 67, 81, 240, 240, 34, 67, + 82, 97, 81, 97, 81, 240, 80, 36, 19, 0, 16, 33, + 240, 18, 242, 242, 242, 242, 242, 242, 240, 18, 240, 18, + 240, 66, 240, 65, 240, 66, 240, 66, 240, 66, 240, 66, + 240, 66, 240, 66, 0, 7, 48, 13, 21, 0, 34, 31, + 4, 0, 8, 31, 4, 0, 23, 112, 35, 19, 0, 14, + 33, 240, 66, 240, 66, 240, 66, 240, 66, 240, 65, 240, + 66, 240, 66, 240, 66, 240, 50, 242, 242, 242, 242, 240, + 18, 242, 242, 242, 0, 9, 32, 27, 11, 0, 8, 84, + 97, 65, 65, 82, 50, 66, 65, 66, 130, 115, 99, 114, + 145, 161, 33, 130, 129, 147, 146, 0, 9, 32, 56, 18, + 0, 11, 118, 162, 98, 114, 145, 82, 82, 17, 33, 65, + 66, 34, 33, 50, 49, 66, 49, 33, 50, 66, 49, 33, + 50, 65, 65, 33, 49, 66, 65, 33, 49, 66, 49, 49, + 49, 66, 49, 65, 33, 36, 33, 81, 50, 51, 113, 240, + 49, 240, 56, 0, 14, 32, 35, 18, 0, 12, 97, 240, + 33, 240, 18, 243, 243, 225, 18, 210, 18, 209, 34, 193, + 50, 178, 50, 183, 161, 82, 161, 82, 145, 98, 130, 98, + 87, 39, 0, 13, 96, 36, 18, 0, 11, 106, 162, 82, + 146, 82, 130, 99, 114, 98, 130, 98, 130, 82, 136, 162, + 82, 146, 98, 115, 98, 114, 114, 114, 114, 114, 98, 114, + 98, 107, 0, 14, 48, 32, 15, 0, 10, 21, 130, 67, + 82, 98, 66, 114, 66, 113, 66, 129, 66, 195, 194, 210, + 210, 210, 129, 66, 129, 81, 113, 98, 81, 149, 0, 12, + 16, 37, 18, 0, 11, 105, 178, 82, 146, 82, 130, 114, + 114, 114, 114, 114, 114, 114, 98, 130, 98, 115, 98, 114, + 99, 114, 98, 114, 114, 114, 114, 98, 114, 98, 106, 0, + 14, 64, 36, 18, 0, 11, 108, 130, 98, 130, 113, 114, + 113, 130, 65, 178, 65, 178, 49, 183, 178, 50, 178, 49, + 178, 240, 18, 129, 114, 129, 114, 113, 114, 114, 93, 0, + 14, 16, 34, 18, 0, 11, 108, 130, 98, 130, 113, 114, + 113, 130, 65, 178, 65, 178, 49, 183, 178, 50, 178, 49, + 178, 240, 18, 240, 18, 240, 18, 242, 231, 0, 14, 112, + 40, 16, 0, 10, 101, 33, 98, 81, 17, 82, 113, 82, + 129, 82, 129, 66, 145, 66, 145, 51, 210, 87, 34, 130, + 66, 115, 66, 114, 82, 114, 97, 97, 17, 98, 65, 33, + 132, 0, 13, 16, 38, 21, 0, 13, 86, 54, 130, 114, + 162, 98, 162, 114, 162, 114, 162, 114, 162, 98, 171, 162, + 114, 162, 99, 146, 114, 162, 114, 162, 114, 162, 99, 146, + 114, 134, 54, 0, 16, 64, 23, 12, 0, 8, 6, 130, + 162, 146, 162, 162, 162, 146, 162, 162, 147, 146, 162, 162, + 146, 134, 0, 9, 96, 27, 16, 0, 10, 119, 178, 226, + 226, 226, 210, 226, 226, 226, 210, 226, 130, 66, 116, 34, + 131, 50, 145, 50, 164, 0, 13, 48, 39, 20, 0, 13, + 6, 38, 130, 98, 162, 82, 162, 81, 194, 65, 210, 34, + 226, 18, 226, 19, 227, 34, 210, 50, 195, 50, 194, 82, + 178, 82, 178, 82, 162, 99, 118, 54, 0, 15, 80, 27, + 16, 0, 10, 70, 194, 226, 210, 226, 226, 226, 210, 226, + 226, 211, 210, 129, 82, 129, 82, 113, 82, 114, 61, 0, + 12, 48, 60, 23, 0, 14, 118, 101, 129, 18, 81, 18, + 161, 18, 83, 161, 34, 65, 18, 161, 34, 65, 18, 161, + 34, 49, 34, 161, 34, 33, 34, 161, 50, 33, 34, 161, + 50, 17, 50, 161, 50, 17, 50, 161, 51, 50, 161, 67, + 50, 161, 66, 66, 161, 66, 66, 146, 65, 66, 134, 86, + 0, 18, 49, 21, 0, 13, 84, 86, 131, 98, 163, 97, + 161, 18, 97, 161, 34, 81, 161, 34, 65, 177, 34, 65, + 161, 66, 49, 161, 66, 49, 161, 66, 33, 177, 82, 17, + 161, 98, 17, 161, 98, 17, 161, 114, 162, 114, 134, 97, + 0, 16, 96, 37, 15, 0, 10, 20, 146, 66, 98, 97, + 82, 114, 66, 114, 50, 130, 50, 130, 35, 130, 34, 146, + 34, 130, 50, 130, 50, 115, 50, 114, 81, 98, 98, 66, + 148, 0, 12, 32, 29, 17, 0, 11, 26, 146, 82, 130, + 82, 114, 98, 114, 98, 114, 98, 114, 82, 114, 82, 135, + 162, 227, 226, 242, 242, 226, 215, 0, 14, 46, 15, 0, + 10, 20, 146, 66, 98, 97, 82, 114, 66, 114, 50, 130, + 50, 130, 35, 130, 34, 146, 34, 130, 50, 130, 50, 34, + 66, 50, 17, 33, 34, 81, 17, 33, 18, 99, 35, 148, + 210, 210, 33, 164, 0, 6, 48, 39, 17, 0, 11, 25, + 162, 66, 146, 82, 114, 98, 114, 83, 114, 82, 130, 66, + 135, 162, 66, 146, 81, 130, 98, 114, 83, 114, 82, 130, + 82, 33, 66, 98, 17, 55, 67, 0, 13, 16, 34, 15, + 0, 10, 5, 33, 97, 67, 97, 98, 97, 113, 97, 113, + 98, 212, 196, 212, 97, 84, 81, 114, 81, 129, 81, 129, + 67, 113, 65, 18, 81, 149, 0, 12, 31, 16, 0, 10, + 44, 66, 50, 50, 65, 66, 65, 49, 66, 81, 49, 66, + 65, 146, 65, 146, 210, 226, 226, 226, 210, 226, 226, 211, + 168, 0, 13, 38, 18, 0, 11, 39, 54, 66, 130, 98, + 129, 114, 129, 114, 129, 98, 129, 114, 129, 114, 129, 114, + 129, 98, 129, 114, 129, 114, 129, 114, 113, 130, 113, 146, + 81, 182, 0, 14, 96, 36, 18, 0, 11, 39, 39, 66, + 114, 114, 113, 130, 97, 146, 97, 146, 81, 162, 65, 178, + 65, 178, 49, 194, 33, 210, 33, 210, 17, 227, 243, 242, + 240, 17, 0, 15, 48, 57, 25, 0, 15, 87, 23, 23, + 66, 98, 98, 114, 98, 97, 130, 98, 97, 130, 83, 81, + 146, 83, 81, 146, 65, 18, 65, 162, 49, 34, 49, 178, + 49, 34, 49, 178, 33, 50, 33, 194, 17, 66, 17, 210, + 17, 66, 17, 211, 83, 227, 83, 226, 98, 241, 113, 0, + 20, 64, 41, 21, 0, 13, 71, 39, 130, 98, 194, 81, + 210, 65, 242, 49, 242, 33, 240, 20, 240, 50, 240, 66, + 240, 49, 18, 240, 17, 34, 241, 66, 210, 66, 194, 98, + 163, 98, 119, 55, 0, 16, 32, 34, 18, 0, 11, 55, + 38, 82, 113, 130, 97, 162, 65, 178, 65, 178, 49, 194, + 33, 227, 242, 240, 18, 240, 18, 242, 240, 18, 240, 18, + 243, 200, 0, 14, 96, 31, 16, 0, 10, 59, 82, 98, + 82, 98, 97, 99, 195, 195, 210, 210, 211, 195, 210, 97, + 98, 113, 83, 97, 83, 113, 82, 114, 75, 0, 12, 80, + 26, 11, 0, 7, 68, 113, 146, 146, 145, 146, 146, 145, + 161, 146, 146, 145, 161, 146, 146, 145, 146, 146, 145, 164, + 240, 224, 26, 9, 240, 240, 241, 129, 129, 145, 129, 129, + 145, 129, 129, 129, 145, 129, 129, 145, 129, 129, 145, 129, + 129, 145, 129, 176, 27, 12, 0, 8, 21, 162, 161, 177, + 162, 162, 161, 162, 162, 161, 177, 162, 162, 161, 177, 162, + 162, 161, 162, 117, 240, 240, 16, 20, 12, 0, 11, 2, + 145, 18, 129, 33, 113, 65, 82, 65, 81, 97, 49, 129, + 0, 19, 96, 7, 14, 0, 42, 12, 240, 240, 9, 4, + 240, 145, 50, 49, 0, 9, 32, 32, 12, 0, 16, 115, + 33, 82, 35, 66, 65, 81, 66, 66, 66, 66, 66, 66, + 50, 33, 34, 33, 17, 33, 34, 33, 17, 17, 67, 34, + 0, 9, 64, 31, 11, 0, 7, 4, 146, 146, 145, 161, + 146, 146, 19, 83, 33, 67, 50, 50, 66, 50, 66, 49, + 81, 50, 66, 65, 65, 81, 50, 99, 0, 9, 22, 9, + 0, 12, 100, 66, 33, 50, 34, 50, 49, 34, 114, 114, + 114, 65, 49, 49, 83, 0, 7, 32, 38, 13, 0, 9, + 4, 177, 193, 178, 178, 177, 130, 33, 98, 35, 82, 65, + 97, 66, 82, 66, 82, 66, 82, 50, 33, 50, 33, 17, + 33, 50, 33, 17, 17, 83, 34, 0, 10, 48, 23, 9, + 0, 12, 115, 66, 33, 50, 49, 49, 65, 34, 19, 51, + 98, 114, 65, 49, 49, 83, 0, 7, 32, 29, 13, 0, + 9, 19, 130, 33, 129, 34, 113, 193, 178, 150, 145, 178, + 178, 177, 193, 178, 178, 177, 193, 178, 178, 177, 178, 178, + 240, 144, 34, 12, 0, 17, 19, 17, 82, 35, 66, 65, + 81, 66, 66, 66, 66, 66, 66, 50, 82, 33, 17, 82, + 35, 99, 18, 161, 162, 82, 49, 97, 49, 116, 240, 80, + 37, 12, 0, 7, 84, 162, 162, 161, 177, 162, 162, 34, + 97, 18, 17, 98, 49, 83, 34, 82, 50, 82, 49, 82, + 50, 33, 34, 50, 17, 49, 65, 33, 49, 67, 0, 9, + 64, 26, 8, 0, 6, 66, 98, 240, 210, 81, 17, 65, + 33, 65, 33, 98, 97, 98, 33, 50, 17, 65, 33, 82, + 0, 6, 64, 30, 12, 0, 9, 114, 163, 240, 240, 211, + 129, 33, 113, 49, 113, 34, 162, 161, 162, 162, 161, 177, + 162, 162, 98, 33, 113, 33, 131, 240, 96, 37, 11, 0, + 7, 4, 146, 146, 145, 161, 146, 146, 35, 65, 33, 18, + 65, 33, 18, 50, 33, 100, 113, 49, 82, 49, 33, 34, + 34, 17, 49, 50, 17, 49, 66, 0, 8, 96, 25, 7, + 240, 240, 100, 82, 82, 81, 97, 82, 81, 97, 82, 82, + 81, 97, 82, 82, 17, 49, 17, 82, 0, 5, 96, 46, + 18, 0, 25, 2, 50, 50, 81, 17, 18, 17, 33, 33, + 49, 33, 17, 33, 17, 34, 49, 34, 50, 50, 83, 35, + 34, 98, 50, 50, 98, 50, 49, 33, 65, 65, 65, 33, + 50, 50, 65, 17, 65, 66, 66, 0, 14, 34, 14, 0, + 19, 82, 50, 97, 17, 33, 33, 65, 33, 17, 34, 49, + 50, 49, 115, 34, 114, 50, 114, 49, 33, 81, 50, 17, + 82, 50, 17, 81, 82, 0, 11, 25, 10, 0, 14, 35, + 82, 49, 50, 65, 50, 65, 34, 81, 34, 66, 34, 66, + 34, 50, 65, 49, 99, 0, 8, 16, 34, 15, 0, 21, + 34, 35, 113, 17, 17, 34, 81, 34, 50, 129, 66, 114, + 66, 114, 66, 114, 50, 114, 66, 115, 34, 129, 35, 145, + 210, 210, 209, 183, 240, 128, 32, 11, 0, 15, 82, 33, + 66, 33, 17, 50, 65, 65, 66, 50, 66, 50, 66, 50, + 50, 66, 33, 17, 66, 35, 83, 18, 145, 161, 146, 145, + 118, 240, 24, 11, 0, 15, 50, 34, 65, 17, 17, 18, + 33, 34, 33, 49, 34, 130, 146, 145, 161, 146, 145, 0, + 9, 48, 23, 10, 0, 14, 20, 81, 49, 81, 50, 65, + 49, 83, 131, 65, 65, 65, 65, 65, 65, 84, 0, 8, + 16, 25, 8, 0, 6, 50, 98, 97, 113, 98, 70, 65, + 98, 98, 97, 113, 98, 33, 50, 17, 65, 33, 82, 0, + 6, 80, 35, 14, 0, 19, 82, 66, 81, 17, 66, 65, + 33, 65, 65, 49, 50, 114, 50, 113, 51, 98, 33, 17, + 33, 66, 33, 17, 17, 81, 33, 33, 17, 98, 50, 0, + 11, 29, 12, 0, 16, 114, 34, 81, 17, 35, 49, 33, + 65, 33, 49, 65, 82, 65, 81, 65, 82, 65, 82, 49, + 97, 49, 131, 0, 9, 96, 41, 17, 0, 23, 98, 66, + 34, 65, 17, 66, 34, 49, 33, 65, 65, 33, 49, 65, + 65, 82, 50, 65, 81, 66, 65, 66, 50, 65, 82, 33, + 17, 65, 81, 33, 33, 49, 114, 52, 0, 13, 48, 28, + 13, 0, 18, 34, 51, 50, 33, 17, 18, 33, 66, 34, + 114, 177, 178, 178, 114, 33, 65, 49, 34, 49, 67, 35, + 0, 10, 48, 36, 12, 0, 16, 98, 66, 49, 17, 66, + 33, 33, 65, 97, 65, 82, 50, 81, 66, 66, 50, 82, + 35, 81, 33, 18, 98, 33, 177, 162, 82, 49, 97, 49, + 116, 240, 80, 24, 11, 0, 15, 82, 33, 84, 17, 65, + 51, 145, 130, 114, 114, 145, 81, 49, 19, 17, 81, 35, + 0, 8, 96, 25, 9, 0, 7, 65, 113, 113, 129, 129, + 129, 129, 129, 113, 98, 129, 130, 113, 129, 114, 113, 114, + 113, 145, 145, 240, 23, 3, 241, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 128, 26, 9, 0, 6, 17, 145, 145, 129, 114, + 98, 114, 113, 129, 129, 146, 82, 98, 114, 113, 129, 129, + 129, 114, 97, 240, 176, 16, 15, 0, 24, 68, 97, 49, + 36, 81, 33, 68, 49, 149, 0, 19, 16, 5, 9, 0, + 30, 48, 19, 8, 0, 11, 51, 83, 97, 225, 113, 113, + 98, 97, 98, 98, 83, 83, 83, 82, 224, 31, 10, 0, + 11, 113, 145, 116, 81, 17, 33, 50, 17, 18, 49, 33, + 17, 50, 17, 98, 17, 98, 17, 99, 49, 51, 33, 84, + 113, 129, 0, 6, 34, 18, 0, 15, 3, 210, 49, 193, + 50, 177, 66, 162, 240, 18, 240, 17, 202, 194, 240, 17, + 240, 33, 113, 130, 97, 70, 113, 49, 73, 84, 53, 0, + 14, 16, 29, 12, 0, 12, 1, 36, 33, 50, 66, 65, + 97, 49, 129, 33, 129, 33, 129, 33, 129, 49, 97, 66, + 66, 49, 36, 33, 0, 13, 96, 29, 15, 0, 11, 38, + 37, 66, 97, 98, 81, 130, 49, 146, 33, 162, 33, 162, + 17, 179, 153, 146, 168, 162, 194, 210, 182, 0, 12, 48, + 19, 3, 241, 33, 33, 33, 33, 33, 33, 33, 225, 33, + 33, 33, 33, 33, 33, 33, 128, 41, 12, 0, 9, 83, + 114, 49, 97, 81, 81, 51, 81, 50, 98, 145, 18, 113, + 51, 81, 66, 65, 98, 50, 97, 66, 81, 83, 33, 116, + 146, 98, 50, 82, 49, 97, 65, 97, 50, 115, 240, 80, + 11, 8, 0, 7, 2, 34, 34, 34, 0, 18, 32, 53, + 19, 0, 12, 85, 194, 82, 145, 51, 49, 113, 49, 50, + 33, 81, 50, 65, 49, 65, 49, 81, 49, 49, 50, 145, + 49, 50, 145, 49, 50, 161, 33, 65, 145, 65, 50, 65, + 49, 65, 65, 49, 65, 81, 67, 65, 113, 145, 145, 113, + 183, 0, 15, 16, 20, 9, 0, 7, 4, 65, 49, 65, + 33, 66, 33, 17, 34, 19, 81, 17, 69, 0, 16, 32, + 21, 8, 0, 11, 65, 97, 97, 33, 49, 33, 50, 17, + 65, 33, 66, 17, 81, 113, 0, 7, 96, 11, 12, 0, + 16, 74, 177, 177, 177, 0, 18, 32, 10, 9, 0, 16, + 65, 53, 49, 0, 12, 32, 57, 19, 0, 12, 85, 194, + 82, 145, 145, 113, 23, 49, 81, 50, 50, 49, 65, 50, + 50, 49, 49, 66, 50, 49, 49, 69, 81, 49, 66, 49, + 81, 33, 66, 50, 49, 65, 50, 50, 17, 17, 65, 50, + 50, 17, 17, 81, 20, 50, 17, 113, 145, 145, 113, 183, + 0, 15, 16, 8, 9, 0, 9, 7, 0, 20, 64, 21, + 9, 0, 7, 19, 81, 49, 49, 65, 49, 65, 34, 49, + 50, 49, 50, 33, 83, 0, 15, 32, 35, 21, 0, 19, + 65, 240, 81, 240, 81, 240, 81, 240, 81, 240, 81, 191, + 4, 177, 240, 81, 240, 81, 240, 81, 240, 81, 240, 81, + 240, 240, 47, 4, 0, 13, 48, 20, 10, 0, 7, 116, + 81, 50, 65, 50, 66, 33, 129, 114, 98, 115, 113, 35, + 0, 15, 64, 22, 10, 0, 7, 116, 82, 34, 66, 34, + 129, 84, 146, 65, 50, 50, 50, 49, 50, 98, 0, 14, + 64, 10, 5, 240, 240, 33, 50, 33, 0, 11, 96, 35, + 13, 0, 18, 18, 65, 98, 65, 97, 66, 97, 66, 82, + 65, 98, 65, 98, 50, 33, 50, 50, 17, 51, 19, 33, + 49, 19, 19, 65, 193, 193, 193, 194, 178, 176, 43, 13, + 0, 8, 72, 68, 33, 85, 33, 84, 33, 100, 33, 100, + 33, 100, 33, 129, 33, 145, 33, 145, 33, 129, 33, 145, + 33, 145, 33, 145, 33, 129, 33, 145, 33, 145, 33, 145, + 33, 129, 33, 0, 6, 10, 5, 0, 7, 81, 51, 34, + 0, 7, 112, 11, 6, 0, 16, 113, 34, 17, 33, 33, + 50, 144, 16, 7, 0, 5, 97, 82, 82, 81, 97, 82, + 82, 81, 69, 0, 10, 96, 20, 9, 0, 7, 19, 81, + 33, 66, 34, 49, 49, 65, 49, 65, 33, 98, 85, 0, + 15, 16, 21, 8, 0, 12, 49, 81, 33, 65, 34, 65, + 33, 65, 18, 49, 18, 49, 33, 97, 0, 7, 80, 42, + 17, 0, 13, 33, 242, 97, 130, 81, 145, 97, 145, 81, + 146, 65, 162, 65, 66, 65, 65, 81, 53, 17, 81, 161, + 65, 17, 129, 65, 18, 113, 65, 33, 129, 55, 81, 114, + 113, 100, 0, 13, 16, 47, 18, 0, 14, 1, 240, 18, + 97, 146, 81, 161, 97, 161, 81, 162, 65, 50, 98, 65, + 18, 33, 81, 65, 33, 50, 37, 17, 50, 33, 145, 98, + 129, 97, 145, 82, 161, 65, 177, 65, 18, 17, 113, 65, + 34, 0, 14, 16, 45, 18, 0, 13, 116, 210, 34, 65, + 177, 65, 132, 81, 177, 65, 194, 33, 130, 50, 33, 66, + 33, 50, 33, 81, 67, 49, 81, 177, 65, 17, 145, 65, + 18, 129, 65, 33, 145, 55, 97, 114, 129, 100, 0, 13, + 112, 26, 10, 0, 14, 66, 130, 129, 130, 98, 33, 81, + 49, 129, 114, 99, 98, 114, 65, 50, 66, 34, 81, 34, + 65, 69, 224, 39, 18, 240, 226, 240, 33, 0, 6, 81, + 240, 33, 240, 18, 243, 243, 225, 18, 210, 18, 209, 34, + 193, 50, 178, 50, 183, 161, 82, 161, 82, 145, 98, 130, + 98, 87, 39, 0, 13, 96, 44, 19, 240, 240, 66, 240, + 17, 240, 33, 240, 240, 97, 240, 49, 240, 34, 240, 19, + 240, 19, 241, 18, 226, 18, 225, 34, 209, 50, 194, 50, + 199, 177, 82, 177, 82, 161, 98, 146, 98, 103, 39, 0, + 14, 80, 42, 18, 240, 240, 18, 241, 17, 210, 49, 240, + 240, 33, 240, 33, 240, 18, 243, 243, 225, 18, 210, 18, + 209, 34, 193, 50, 178, 50, 183, 161, 82, 161, 82, 145, + 98, 130, 98, 87, 39, 0, 13, 96, 42, 19, 240, 243, + 33, 193, 35, 0, 6, 81, 240, 49, 240, 34, 240, 19, + 240, 19, 241, 18, 226, 18, 225, 34, 209, 50, 194, 50, + 199, 177, 82, 177, 82, 161, 98, 146, 98, 103, 39, 0, + 14, 80, 42, 19, 240, 241, 50, 195, 34, 0, 6, 65, + 240, 49, 240, 34, 240, 19, 240, 19, 241, 18, 226, 18, + 225, 34, 209, 50, 194, 50, 199, 177, 82, 177, 82, 161, + 98, 146, 98, 103, 39, 0, 14, 80, 42, 18, 194, 241, + 33, 225, 33, 225, 33, 242, 240, 17, 240, 33, 240, 18, + 243, 243, 225, 18, 210, 18, 209, 34, 193, 50, 178, 50, + 183, 161, 82, 161, 82, 145, 98, 130, 98, 87, 39, 0, + 13, 96, 50, 26, 0, 17, 108, 243, 98, 225, 18, 113, + 227, 113, 225, 18, 65, 240, 17, 34, 65, 241, 50, 49, + 240, 17, 39, 241, 50, 50, 225, 66, 65, 216, 49, 210, + 66, 129, 145, 82, 129, 129, 98, 114, 114, 82, 114, 86, + 45, 0, 20, 16, 40, 15, 0, 10, 20, 146, 65, 17, + 82, 98, 66, 114, 66, 113, 66, 129, 66, 129, 51, 194, + 210, 210, 210, 129, 66, 129, 81, 113, 98, 81, 149, 161, + 241, 178, 18, 161, 34, 179, 240, 160, 41, 18, 240, 178, + 240, 33, 240, 49, 240, 236, 130, 98, 130, 113, 114, 113, + 130, 65, 178, 65, 178, 49, 183, 178, 50, 178, 49, 178, + 240, 18, 129, 114, 129, 114, 113, 114, 114, 93, 0, 14, + 16, 39, 18, 240, 242, 242, 241, 240, 236, 130, 98, 130, + 113, 114, 113, 130, 65, 178, 65, 178, 49, 183, 178, 50, + 178, 49, 178, 240, 18, 129, 114, 129, 114, 113, 114, 114, + 93, 0, 14, 16, 40, 18, 240, 225, 244, 209, 65, 240, + 188, 130, 98, 130, 113, 114, 113, 130, 65, 178, 65, 178, + 49, 183, 178, 50, 178, 49, 178, 240, 18, 129, 114, 129, + 114, 113, 114, 114, 93, 0, 14, 16, 41, 18, 240, 178, + 34, 194, 34, 240, 240, 236, 130, 98, 130, 113, 114, 113, + 130, 65, 178, 65, 178, 49, 183, 178, 50, 178, 49, 178, + 240, 18, 129, 114, 129, 114, 113, 114, 114, 93, 0, 14, + 16, 26, 12, 240, 34, 177, 193, 240, 86, 130, 162, 146, + 162, 162, 162, 146, 162, 162, 147, 146, 162, 162, 146, 134, + 0, 9, 96, 26, 13, 240, 114, 162, 161, 240, 118, 146, + 178, 162, 178, 178, 178, 162, 178, 178, 163, 162, 178, 178, + 162, 150, 0, 10, 80, 27, 13, 240, 97, 164, 129, 65, + 240, 70, 146, 178, 162, 178, 178, 178, 162, 178, 178, 163, + 162, 178, 178, 162, 150, 0, 10, 80, 28, 14, 240, 66, + 49, 130, 35, 240, 240, 70, 162, 194, 178, 194, 194, 194, + 178, 194, 194, 179, 178, 194, 194, 178, 166, 0, 11, 64, + 37, 18, 0, 11, 105, 178, 82, 146, 82, 130, 114, 114, + 114, 114, 114, 114, 114, 71, 82, 98, 115, 98, 114, 98, + 130, 98, 114, 114, 114, 114, 98, 114, 98, 106, 0, 14, + 64, 55, 21, 240, 240, 19, 33, 225, 35, 0, 6, 68, + 86, 131, 98, 163, 97, 161, 18, 97, 161, 34, 81, 161, + 34, 65, 177, 34, 65, 161, 66, 49, 161, 66, 49, 161, + 66, 33, 177, 82, 17, 161, 98, 17, 161, 98, 17, 161, + 114, 162, 114, 134, 97, 0, 16, 96, 40, 15, 113, 225, + 226, 225, 240, 196, 146, 66, 98, 97, 82, 114, 66, 114, + 50, 130, 50, 130, 35, 130, 34, 146, 34, 130, 50, 130, + 50, 115, 50, 114, 81, 98, 98, 66, 148, 0, 12, 32, + 40, 15, 240, 178, 194, 193, 240, 180, 146, 66, 98, 97, + 82, 114, 66, 114, 50, 130, 50, 130, 35, 130, 34, 146, + 34, 130, 50, 130, 50, 115, 50, 114, 81, 98, 98, 66, + 148, 0, 12, 32, 42, 15, 145, 226, 178, 17, 161, 65, + 240, 148, 146, 66, 98, 97, 82, 114, 66, 114, 50, 130, + 50, 130, 35, 130, 34, 146, 34, 130, 50, 130, 50, 115, + 50, 114, 81, 98, 98, 66, 148, 0, 12, 32, 42, 15, + 240, 115, 33, 129, 35, 240, 240, 148, 146, 66, 98, 97, + 82, 114, 66, 114, 50, 130, 50, 130, 35, 130, 34, 146, + 34, 130, 50, 130, 50, 115, 50, 114, 81, 98, 98, 66, + 148, 0, 12, 32, 42, 15, 240, 98, 50, 130, 50, 240, + 240, 132, 146, 66, 98, 97, 82, 114, 66, 114, 50, 130, + 50, 130, 35, 130, 34, 146, 34, 130, 50, 130, 50, 115, + 50, 114, 81, 98, 98, 66, 148, 0, 12, 32, 32, 15, + 0, 16, 113, 177, 49, 145, 81, 113, 113, 81, 145, 49, + 177, 17, 210, 193, 18, 146, 50, 114, 82, 82, 114, 50, + 146, 33, 177, 0, 9, 80, 47, 17, 0, 11, 68, 49, + 114, 67, 114, 97, 114, 99, 98, 81, 18, 82, 81, 34, + 82, 65, 50, 67, 49, 66, 66, 49, 67, 66, 49, 66, + 82, 33, 82, 82, 17, 83, 83, 98, 113, 98, 115, 66, + 113, 52, 0, 13, 112, 43, 18, 113, 240, 34, 240, 33, + 240, 240, 247, 54, 66, 130, 98, 129, 114, 129, 114, 129, + 98, 129, 114, 129, 114, 129, 114, 129, 98, 129, 114, 129, + 114, 129, 114, 113, 130, 113, 146, 81, 182, 0, 14, 96, + 42, 18, 240, 226, 241, 240, 17, 240, 183, 54, 66, 130, + 98, 129, 114, 129, 114, 129, 98, 129, 114, 129, 114, 129, + 114, 129, 98, 129, 114, 129, 114, 129, 114, 113, 130, 113, + 146, 81, 182, 0, 14, 96, 44, 18, 145, 240, 34, 226, + 17, 209, 65, 240, 151, 54, 66, 130, 98, 129, 114, 129, + 114, 129, 98, 129, 114, 129, 114, 129, 114, 129, 98, 129, + 114, 129, 114, 129, 114, 113, 130, 113, 146, 81, 182, 0, + 14, 96, 43, 18, 240, 146, 50, 178, 50, 240, 240, 183, + 54, 66, 130, 98, 129, 114, 129, 114, 129, 98, 129, 114, + 129, 114, 129, 114, 129, 98, 129, 114, 129, 114, 129, 114, + 113, 130, 113, 146, 81, 182, 0, 14, 96, 39, 18, 240, + 210, 240, 17, 240, 17, 240, 199, 38, 82, 113, 130, 97, + 162, 65, 178, 65, 178, 49, 194, 33, 227, 242, 240, 18, + 240, 18, 242, 240, 18, 240, 18, 243, 200, 0, 14, 96, + 30, 16, 0, 10, 71, 178, 226, 215, 146, 82, 114, 82, + 114, 82, 98, 98, 98, 98, 98, 82, 99, 66, 119, 146, + 226, 210, 199, 0, 13, 16, 43, 14, 0, 9, 99, 146, + 49, 114, 65, 113, 81, 113, 65, 114, 49, 129, 34, 145, + 65, 114, 65, 114, 66, 97, 82, 97, 81, 98, 81, 100, + 34, 97, 17, 49, 98, 35, 114, 193, 209, 194, 240, 240, + 160, 37, 12, 0, 9, 66, 162, 177, 193, 240, 83, 33, + 82, 35, 66, 65, 81, 66, 66, 66, 66, 66, 66, 50, + 33, 34, 33, 17, 33, 34, 33, 17, 17, 67, 34, 0, + 9, 64, 37, 12, 0, 10, 2, 146, 161, 145, 240, 99, + 33, 82, 35, 66, 65, 81, 66, 66, 66, 66, 66, 66, + 50, 33, 34, 33, 17, 33, 34, 33, 17, 17, 67, 34, + 0, 9, 64, 39, 12, 0, 9, 98, 162, 145, 17, 114, + 49, 240, 51, 33, 82, 35, 66, 65, 81, 66, 66, 66, + 66, 66, 66, 50, 33, 34, 33, 17, 33, 34, 33, 17, + 17, 67, 34, 0, 9, 64, 37, 12, 0, 9, 67, 33, + 131, 240, 240, 195, 33, 82, 35, 66, 65, 81, 66, 66, + 66, 66, 66, 66, 50, 33, 34, 33, 17, 33, 34, 33, + 17, 17, 67, 34, 0, 9, 64, 37, 12, 0, 10, 115, + 34, 98, 34, 240, 227, 33, 82, 35, 66, 65, 81, 66, + 66, 66, 66, 66, 66, 50, 33, 34, 33, 17, 33, 34, + 33, 17, 17, 67, 34, 0, 9, 64, 39, 12, 0, 9, + 83, 129, 49, 113, 49, 131, 240, 67, 33, 82, 35, 66, + 65, 81, 66, 66, 66, 66, 66, 66, 50, 33, 34, 33, + 17, 33, 34, 33, 17, 17, 67, 34, 0, 9, 64, 36, + 15, 0, 21, 3, 33, 19, 66, 36, 33, 50, 66, 49, + 49, 66, 65, 34, 70, 50, 66, 114, 50, 81, 34, 33, + 17, 81, 34, 33, 17, 65, 67, 52, 0, 11, 96, 27, + 9, 0, 12, 100, 66, 33, 50, 34, 50, 49, 34, 114, + 114, 114, 65, 49, 49, 83, 97, 129, 97, 33, 81, 33, + 98, 240, 27, 9, 0, 7, 33, 130, 129, 240, 163, 66, + 33, 50, 49, 49, 65, 34, 19, 51, 98, 114, 65, 49, + 49, 83, 0, 7, 32, 28, 12, 0, 10, 2, 146, 146, + 145, 240, 115, 114, 33, 98, 49, 97, 65, 82, 19, 99, + 146, 162, 65, 97, 49, 131, 0, 9, 112, 29, 11, 0, + 9, 1, 147, 113, 33, 97, 65, 240, 35, 98, 33, 82, + 49, 81, 65, 66, 19, 83, 130, 146, 65, 81, 49, 115, + 0, 9, 29, 12, 0, 10, 114, 35, 82, 49, 240, 240, + 19, 114, 33, 98, 49, 97, 65, 82, 19, 99, 146, 162, + 65, 97, 49, 131, 0, 9, 112, 27, 8, 0, 6, 33, + 114, 113, 240, 114, 81, 17, 65, 33, 65, 33, 98, 97, + 98, 33, 50, 17, 65, 33, 82, 0, 6, 64, 28, 10, + 0, 8, 34, 114, 114, 113, 240, 50, 113, 17, 97, 33, + 97, 33, 130, 129, 130, 33, 82, 17, 97, 33, 114, 0, + 8, 32, 29, 9, 0, 7, 33, 115, 81, 33, 65, 65, + 210, 97, 17, 81, 33, 81, 33, 114, 113, 114, 33, 66, + 17, 81, 33, 98, 0, 7, 48, 28, 9, 0, 8, 18, + 18, 66, 18, 240, 114, 97, 17, 81, 33, 81, 33, 114, + 113, 114, 33, 66, 17, 81, 33, 98, 0, 7, 48, 32, + 13, 0, 10, 50, 194, 18, 131, 130, 18, 178, 133, 98, + 50, 82, 66, 82, 66, 66, 81, 82, 66, 82, 66, 82, + 50, 113, 49, 147, 0, 10, 96, 39, 14, 0, 11, 35, + 161, 35, 0, 6, 2, 50, 97, 17, 33, 33, 65, 33, + 17, 34, 49, 50, 49, 115, 34, 114, 50, 114, 49, 33, + 81, 50, 17, 82, 50, 17, 81, 82, 0, 11, 29, 10, + 0, 8, 1, 146, 145, 240, 211, 82, 49, 50, 65, 50, + 65, 34, 81, 34, 66, 34, 66, 34, 50, 65, 49, 99, + 0, 8, 16, 30, 12, 0, 10, 2, 146, 146, 145, 240, + 115, 114, 49, 82, 65, 82, 65, 66, 81, 66, 66, 66, + 66, 66, 50, 97, 49, 131, 0, 9, 112, 31, 11, 0, + 9, 1, 147, 113, 33, 97, 65, 240, 35, 98, 49, 66, + 65, 66, 65, 50, 81, 50, 66, 50, 66, 50, 50, 81, + 49, 115, 0, 9, 30, 12, 0, 9, 67, 33, 131, 240, + 240, 211, 114, 49, 82, 65, 82, 65, 66, 81, 66, 66, + 66, 66, 66, 50, 97, 49, 131, 0, 9, 112, 31, 12, + 0, 10, 114, 35, 82, 49, 240, 240, 19, 114, 49, 82, + 65, 82, 65, 66, 81, 66, 66, 66, 66, 66, 50, 97, + 49, 131, 0, 9, 112, 23, 21, 0, 22, 3, 240, 51, + 240, 65, 0, 9, 47, 4, 0, 11, 113, 240, 67, 240, + 51, 0, 14, 48, 30, 12, 0, 17, 19, 17, 82, 49, + 82, 50, 82, 33, 17, 66, 33, 33, 66, 17, 34, 67, + 50, 66, 50, 97, 49, 81, 35, 0, 9, 96, 40, 14, + 0, 11, 33, 209, 225, 240, 240, 114, 66, 81, 17, 66, + 65, 33, 65, 65, 49, 50, 114, 50, 113, 51, 98, 33, + 17, 33, 66, 33, 17, 17, 81, 33, 33, 17, 98, 50, + 0, 11, 40, 14, 0, 11, 97, 194, 178, 177, 240, 130, + 66, 81, 17, 66, 65, 33, 65, 65, 49, 50, 114, 50, + 113, 51, 98, 33, 17, 33, 66, 33, 17, 17, 81, 33, + 33, 17, 98, 50, 0, 11, 42, 14, 0, 11, 65, 194, + 177, 33, 145, 65, 240, 82, 66, 81, 17, 66, 65, 33, + 65, 65, 49, 50, 114, 50, 113, 51, 98, 33, 17, 33, + 66, 33, 17, 17, 81, 33, 33, 17, 98, 50, 0, 11, + 41, 14, 0, 12, 114, 34, 130, 34, 240, 240, 66, 66, + 81, 17, 66, 65, 33, 65, 65, 49, 50, 114, 50, 113, + 51, 98, 33, 17, 33, 66, 33, 17, 17, 81, 33, 33, + 17, 98, 50, 0, 11, 41, 12, 0, 10, 17, 162, 145, + 161, 240, 66, 66, 49, 17, 66, 33, 33, 65, 97, 65, + 82, 50, 81, 66, 66, 50, 82, 35, 81, 33, 18, 98, + 33, 177, 162, 82, 49, 97, 49, 116, 240, 80, 37, 15, + 0, 10, 4, 225, 210, 210, 209, 225, 210, 19, 147, 34, + 130, 50, 114, 66, 114, 66, 114, 66, 114, 50, 114, 66, + 115, 34, 129, 35, 145, 210, 210, 209, 183, 240, 128, 42, + 12, 0, 9, 66, 34, 98, 34, 240, 240, 162, 66, 49, + 17, 66, 33, 33, 65, 97, 65, 82, 50, 81, 66, 66, + 50, 82, 35, 81, 33, 18, 98, 33, 177, 162, 82, 49, + 97, 49, 116, 240, 80, +}; + +//***************************************************************************** +// +// The glyph offset table for the 22 point Oldstandard italic font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard22i[] = +{ + 0, 5, 26, 42, 77, 137, 185, 229, + 239, 265, 291, 313, 354, 366, 376, 386, + 413, 448, 471, 504, 533, 560, 591, 625, + 650, 685, 718, 733, 751, 787, 800, 835, + 862, 918, 953, 989, 1021, 1058, 1094, 1128, + 1168, 1206, 1229, 1256, 1295, 1322, 1382, 1431, + 1468, 1497, 1543, 1582, 1616, 1647, 1685, 1721, + 1778, 1819, 1853, 1884, 1910, 1936, 1963, 1983, + 1990, 1999, 2031, 2062, 2084, 2122, 2145, 2174, + 2208, 2245, 2271, 2301, 2338, 2363, 2409, 2443, + 2468, 2502, 2534, 2558, 2581, 2606, 2641, 2670, + 2711, 2739, 2775, 2799, 2824, 2847, 2873, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2889, 2894, 2913, 2944, 2978, 3007, 3036, 3055, + 3096, 3107, 3160, 3180, 3201, 3212, 3222, 3279, + 3287, 3308, 3343, 3363, 3385, 3395, 3430, 3473, + 3483, 3494, 3510, 3530, 3551, 3593, 3640, 3685, + 3711, 3750, 3794, 3836, 3878, 3920, 3962, 4012, + 4052, 4093, 4132, 4172, 4213, 4239, 4265, 4292, + 4320, 4357, 4412, 4452, 4492, 4534, 4576, 4618, + 4650, 4697, 4740, 4782, 4826, 4869, 4908, 4938, + 4981, 5018, 5055, 5094, 5131, 5168, 5207, 5243, + 5270, 5297, 5325, 5354, 5383, 5410, 5438, 5467, + 5495, 5527, 5566, 5595, 5625, 5656, 5686, 5717, + 5740, 5770, 5810, 5850, 5892, 5933, 5974, 6011, +}; + +//***************************************************************************** +// +// The font definition for the 22 point Oldstandard italic font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard22i = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 23, + + // + // The height of the font. + // + 27, + + // + // The baseline of the font. + // + 21, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard22i, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard22iData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard24.c b/third_party/fonts/ofl/fonts/fontoldstandard24.c new file mode 100644 index 0000000..5295977 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard24.c @@ -0,0 +1,737 @@ +//***************************************************************************** +// +// fontoldstandard24.c - Font definition for the 24pt Oldstandard font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 24 point +// Bold: no +// Italic: no +// Memory usage: 6412 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 24 point Oldstandard font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard24Data[6211] = +{ + 5, 10, 0, 37, 64, 23, 5, 240, 240, 83, 35, 35, + 35, 35, 35, 49, 65, 65, 65, 65, 65, 65, 51, 35, + 35, 240, 240, 112, 15, 8, 0, 6, 2, 34, 34, 34, + 34, 34, 34, 34, 0, 20, 32, 36, 15, 0, 13, 97, + 49, 146, 49, 145, 65, 145, 65, 93, 97, 49, 161, 49, + 146, 49, 145, 65, 145, 65, 109, 81, 49, 161, 49, 161, + 49, 145, 65, 145, 65, 0, 14, 63, 13, 0, 8, 81, + 17, 161, 17, 149, 113, 17, 17, 18, 65, 33, 17, 34, + 49, 33, 17, 34, 49, 33, 17, 19, 50, 17, 17, 18, + 83, 17, 149, 150, 113, 20, 66, 17, 17, 34, 35, 17, + 17, 34, 34, 33, 17, 34, 34, 33, 17, 33, 66, 17, + 17, 18, 101, 145, 17, 161, 17, 0, 8, 112, 53, 18, + 0, 16, 3, 113, 97, 49, 81, 98, 50, 65, 98, 50, + 49, 114, 50, 33, 130, 50, 33, 145, 49, 33, 179, 49, + 35, 177, 33, 49, 145, 34, 50, 129, 34, 50, 113, 50, + 50, 113, 50, 50, 97, 66, 50, 81, 97, 49, 97, 115, + 0, 16, 32, 44, 18, 0, 16, 36, 209, 65, 178, 65, + 178, 65, 179, 33, 210, 17, 242, 70, 84, 82, 97, 35, + 65, 98, 50, 65, 82, 67, 33, 98, 83, 17, 98, 99, + 114, 114, 130, 66, 18, 49, 69, 68, 0, 16, 16, 10, + 4, 240, 146, 34, 34, 34, 0, 10, 32, 28, 7, 0, + 5, 97, 81, 82, 81, 81, 97, 97, 81, 97, 97, 97, + 97, 97, 97, 97, 113, 97, 98, 97, 113, 98, 97, 240, + 16, 28, 7, 240, 240, 193, 113, 98, 97, 113, 97, 97, + 113, 97, 97, 97, 97, 97, 97, 97, 81, 97, 81, 97, + 81, 82, 81, 240, 80, 25, 10, 0, 9, 18, 130, 81, + 33, 34, 34, 17, 19, 67, 99, 17, 66, 17, 34, 33, + 34, 33, 82, 0, 18, 16, 45, 23, 0, 21, 49, 240, + 113, 240, 113, 240, 113, 240, 113, 240, 113, 240, 113, 240, + 113, 240, 113, 207, 6, 193, 240, 113, 240, 113, 240, 113, + 240, 113, 240, 113, 240, 113, 240, 113, 240, 113, 240, 113, + 0, 10, 16, 13, 6, 0, 15, 4, 51, 81, 81, 65, + 81, 65, 240, 112, 8, 8, 0, 16, 6, 0, 13, 32, + 10, 5, 0, 12, 67, 35, 35, 240, 240, 112, 28, 10, + 0, 8, 49, 145, 145, 129, 145, 145, 129, 145, 145, 129, + 145, 145, 129, 145, 145, 129, 145, 145, 129, 145, 145, 129, + 240, 224, 37, 13, 0, 11, 115, 130, 50, 82, 81, 81, + 113, 65, 113, 50, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 49, 113, 65, 113, 66, 82, 82, 50, 131, + 0, 12, 16, 22, 10, 0, 9, 33, 130, 85, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, 0, + 9, 31, 12, 0, 10, 101, 97, 82, 49, 114, 33, 114, + 35, 82, 36, 66, 50, 81, 162, 145, 161, 146, 145, 161, + 113, 49, 113, 42, 42, 0, 10, 96, 31, 12, 0, 10, + 101, 97, 66, 66, 82, 51, 66, 66, 66, 162, 146, 100, + 194, 193, 178, 50, 82, 35, 82, 35, 81, 50, 82, 85, + 0, 11, 16, 30, 13, 0, 12, 33, 178, 178, 163, 145, + 18, 145, 18, 129, 34, 113, 50, 113, 50, 97, 66, 82, + 66, 91, 130, 178, 178, 136, 0, 11, 80, 33, 12, 0, + 9, 17, 97, 71, 86, 97, 177, 177, 177, 20, 98, 66, + 65, 97, 65, 98, 162, 162, 36, 66, 35, 82, 34, 82, + 65, 81, 101, 0, 11, 16, 36, 12, 0, 11, 4, 98, + 65, 81, 66, 65, 82, 65, 162, 35, 84, 50, 51, 66, + 50, 98, 34, 98, 34, 98, 34, 98, 49, 98, 50, 66, + 81, 65, 116, 0, 11, 16, 26, 11, 0, 9, 89, 41, + 33, 113, 33, 97, 49, 97, 161, 145, 145, 161, 146, 146, + 131, 131, 131, 131, 146, 0, 10, 32, 35, 13, 0, 11, + 101, 98, 82, 50, 114, 34, 114, 34, 114, 35, 97, 68, + 49, 102, 113, 37, 65, 84, 34, 114, 34, 114, 34, 114, + 34, 113, 66, 82, 101, 0, 12, 35, 12, 0, 10, 116, + 98, 65, 81, 97, 50, 97, 50, 98, 34, 98, 34, 98, + 49, 83, 50, 52, 84, 18, 162, 161, 66, 81, 65, 81, + 81, 66, 100, 0, 11, 32, 14, 5, 0, 7, 67, 35, + 35, 240, 195, 35, 35, 240, 240, 112, 16, 5, 0, 7, + 67, 35, 35, 240, 194, 51, 50, 65, 65, 49, 240, 128, + 44, 20, 0, 19, 81, 240, 34, 240, 18, 240, 18, 240, + 19, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 66, 240, 82, 240, 82, 240, 67, 240, 66, 240, 82, 240, + 82, 240, 82, 240, 82, 0, 10, 32, 13, 22, 0, 41, + 47, 5, 0, 8, 79, 5, 0, 27, 96, 43, 20, 0, + 17, 65, 240, 82, 240, 82, 240, 82, 240, 67, 240, 66, + 240, 82, 240, 82, 240, 82, 240, 82, 240, 34, 240, 18, + 240, 19, 243, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 0, 12, 32, 29, 11, 0, 9, 117, 66, 66, 49, + 98, 35, 66, 35, 66, 130, 130, 129, 145, 145, 49, 97, + 49, 115, 240, 67, 131, 131, 0, 10, 32, 60, 19, 0, + 15, 6, 178, 98, 129, 161, 97, 83, 18, 17, 65, 81, + 50, 33, 65, 66, 50, 49, 33, 66, 66, 49, 33, 66, + 65, 65, 33, 50, 81, 65, 33, 50, 81, 65, 33, 50, + 66, 49, 49, 50, 65, 65, 65, 34, 35, 49, 81, 66, + 51, 113, 240, 66, 114, 167, 0, 17, 64, 39, 19, 0, + 15, 33, 240, 34, 240, 34, 240, 35, 241, 18, 241, 19, + 225, 34, 209, 50, 209, 51, 193, 66, 177, 82, 185, 161, + 98, 145, 114, 145, 115, 114, 130, 87, 40, 0, 16, 112, + 38, 15, 0, 11, 42, 114, 98, 82, 114, 66, 114, 66, + 114, 66, 114, 66, 113, 82, 97, 104, 114, 82, 98, 113, + 82, 114, 66, 114, 66, 114, 66, 114, 66, 98, 58, 0, + 13, 96, 37, 15, 0, 11, 101, 49, 81, 81, 18, 65, + 115, 50, 130, 49, 146, 34, 161, 34, 161, 34, 210, 210, + 210, 210, 161, 49, 161, 50, 129, 81, 129, 97, 97, 134, + 0, 13, 96, 39, 17, 0, 12, 106, 146, 98, 114, 114, + 98, 130, 82, 130, 82, 146, 66, 146, 66, 146, 66, 146, + 66, 146, 66, 146, 66, 146, 66, 130, 82, 130, 82, 114, + 98, 98, 90, 0, 15, 96, 39, 15, 0, 11, 45, 66, + 114, 66, 129, 66, 129, 66, 129, 66, 65, 49, 66, 65, + 130, 50, 135, 130, 50, 130, 65, 130, 65, 130, 129, 66, + 129, 66, 129, 66, 114, 45, 0, 13, 48, 35, 15, 0, + 11, 45, 66, 114, 66, 129, 66, 129, 66, 129, 66, 65, + 49, 66, 65, 130, 50, 135, 130, 50, 130, 65, 130, 65, + 130, 210, 210, 210, 183, 0, 14, 16, 43, 17, 0, 13, + 37, 49, 113, 82, 17, 97, 115, 82, 130, 81, 146, 66, + 161, 66, 161, 66, 242, 103, 34, 131, 66, 131, 66, 131, + 81, 131, 82, 115, 97, 113, 17, 113, 81, 33, 133, 49, + 0, 15, 48, 39, 18, 0, 13, 71, 39, 66, 130, 98, + 130, 98, 130, 98, 130, 98, 130, 98, 130, 98, 130, 108, + 98, 130, 98, 130, 98, 130, 98, 130, 98, 130, 98, 130, + 98, 130, 71, 39, 0, 16, 24, 8, 0, 6, 6, 66, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 70, 0, 7, 32, 28, 13, 0, 10, 54, 146, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 68, 50, + 68, 50, 66, 81, 97, 66, 116, 0, 12, 32, 41, 17, + 0, 12, 102, 54, 66, 99, 98, 98, 114, 97, 130, 66, + 146, 50, 162, 34, 178, 19, 179, 19, 162, 51, 146, 66, + 146, 67, 130, 82, 130, 83, 114, 98, 114, 99, 70, 39, + 0, 15, 16, 29, 15, 0, 11, 39, 162, 210, 210, 210, + 210, 210, 210, 210, 210, 210, 210, 129, 66, 129, 66, 114, + 66, 114, 66, 99, 45, 0, 13, 48, 64, 19, 0, 14, + 37, 117, 67, 115, 100, 99, 97, 18, 81, 18, 97, 18, + 81, 18, 97, 18, 81, 18, 97, 34, 65, 18, 97, 34, + 49, 34, 97, 34, 49, 34, 97, 35, 33, 34, 97, 50, + 17, 50, 97, 50, 17, 50, 97, 52, 50, 97, 67, 50, + 97, 66, 66, 97, 66, 66, 69, 49, 38, 0, 16, 112, + 50, 17, 0, 12, 100, 101, 67, 113, 100, 97, 97, 18, + 97, 97, 19, 81, 97, 34, 81, 97, 50, 65, 97, 51, + 49, 97, 66, 49, 97, 67, 33, 97, 82, 33, 97, 98, + 17, 97, 100, 97, 115, 97, 115, 97, 130, 69, 113, 0, + 15, 48, 39, 16, 0, 12, 84, 162, 66, 113, 129, 82, + 130, 65, 161, 50, 162, 34, 162, 34, 162, 34, 162, 34, + 162, 34, 162, 34, 162, 49, 161, 66, 130, 81, 129, 113, + 97, 150, 0, 14, 96, 31, 15, 0, 11, 42, 114, 98, + 82, 114, 66, 114, 66, 114, 66, 114, 66, 98, 82, 98, + 88, 114, 210, 210, 210, 210, 210, 210, 183, 0, 14, 16, + 51, 16, 0, 12, 84, 162, 66, 113, 129, 82, 130, 65, + 161, 50, 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, + 162, 34, 162, 49, 51, 50, 66, 17, 49, 34, 81, 17, + 52, 114, 51, 33, 117, 49, 162, 49, 163, 18, 180, 209, + 0, 6, 80, 41, 17, 0, 12, 107, 130, 98, 114, 114, + 98, 114, 98, 114, 98, 114, 98, 98, 120, 146, 81, 146, + 82, 130, 98, 114, 98, 114, 98, 114, 98, 33, 66, 98, + 33, 66, 101, 39, 67, 0, 15, 32, 38, 14, 0, 10, + 101, 49, 66, 68, 50, 99, 50, 114, 50, 114, 51, 113, + 67, 182, 166, 166, 49, 116, 33, 131, 34, 130, 34, 130, + 35, 113, 49, 33, 82, 49, 53, 0, 12, 112, 34, 16, + 0, 12, 14, 34, 66, 66, 33, 82, 81, 33, 82, 81, + 33, 82, 81, 33, 82, 81, 130, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 184, 0, 14, 80, 40, 18, 0, 13, + 70, 85, 66, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 114, 113, 146, 81, 182, 0, 16, 80, + 40, 19, 0, 14, 40, 39, 82, 130, 115, 113, 146, 113, + 146, 97, 163, 81, 178, 81, 179, 49, 195, 49, 210, 49, + 211, 17, 242, 17, 242, 17, 243, 240, 34, 240, 34, 240, + 33, 0, 17, 112, 64, 27, 0, 20, 39, 39, 39, 83, + 83, 98, 131, 98, 98, 146, 83, 97, 162, 84, 81, 163, + 65, 18, 81, 178, 49, 34, 65, 194, 49, 35, 49, 195, + 33, 50, 49, 210, 33, 50, 33, 226, 17, 67, 17, 226, + 17, 67, 17, 228, 83, 240, 18, 99, 240, 18, 99, 240, + 18, 113, 240, 49, 113, 0, 24, 112, 37, 18, 0, 13, + 71, 39, 83, 82, 146, 81, 163, 49, 194, 49, 195, 17, + 227, 243, 240, 18, 244, 225, 18, 209, 35, 177, 66, 177, + 82, 145, 99, 114, 114, 86, 40, 0, 16, 32, 17, 0, + 12, 103, 38, 67, 98, 114, 97, 131, 81, 147, 49, 178, + 49, 179, 17, 210, 17, 211, 242, 242, 242, 242, 242, 242, + 242, 200, 0, 15, 64, 34, 15, 0, 11, 60, 50, 99, + 65, 114, 81, 99, 65, 114, 194, 195, 194, 195, 179, 194, + 97, 83, 97, 67, 113, 66, 114, 51, 114, 35, 115, 44, + 0, 13, 64, 28, 7, 240, 240, 197, 34, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 85, 240, 16, 27, 9, 0, 7, 113, + 129, 129, 145, 129, 129, 145, 129, 129, 145, 129, 129, 145, + 129, 129, 145, 129, 129, 145, 129, 129, 240, 80, 28, 7, + 240, 240, 197, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 37, + 240, 16, 21, 12, 0, 11, 2, 162, 145, 33, 114, 34, + 97, 65, 81, 97, 50, 97, 49, 129, 0, 22, 96, 8, + 14, 0, 45, 76, 240, 240, 224, 11, 6, 240, 240, 194, + 66, 97, 97, 0, 14, 64, 29, 13, 0, 19, 100, 129, + 66, 97, 66, 98, 50, 178, 118, 97, 66, 82, 66, 82, + 51, 33, 34, 33, 18, 33, 51, 51, 0, 11, 96, 36, + 13, 0, 9, 100, 178, 178, 178, 178, 178, 178, 20, 99, + 50, 83, 65, 82, 82, 66, 82, 66, 82, 66, 82, 66, + 82, 66, 81, 81, 17, 50, 81, 36, 0, 11, 112, 23, + 10, 0, 15, 52, 66, 65, 49, 81, 34, 66, 34, 130, + 130, 130, 145, 81, 50, 49, 99, 0, 9, 32, 35, 13, + 0, 10, 52, 178, 178, 178, 178, 178, 100, 18, 82, 51, + 81, 67, 66, 82, 66, 82, 66, 82, 66, 82, 66, 82, + 81, 82, 82, 51, 100, 20, 0, 11, 80, 24, 10, 0, + 15, 51, 82, 49, 65, 66, 34, 66, 34, 66, 40, 34, + 130, 145, 81, 50, 65, 84, 0, 9, 16, 26, 10, 0, + 8, 3, 97, 49, 66, 34, 66, 130, 130, 102, 98, 130, + 130, 130, 130, 130, 130, 130, 130, 102, 0, 9, 32, 34, + 13, 0, 19, 101, 19, 50, 50, 18, 34, 83, 50, 82, + 66, 82, 82, 50, 131, 130, 161, 199, 120, 81, 113, 49, + 129, 49, 129, 50, 97, 102, 240, 240, 16, 35, 14, 0, + 10, 68, 194, 194, 194, 194, 194, 194, 35, 116, 34, 99, + 50, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 66, 69, 37, 0, 12, 64, 21, 6, 240, 240, + 210, 66, 240, 99, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 52, 240, 240, 224, 27, 8, 0, 7, 66, 98, 240, + 212, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 34, 34, 33, 49, 67, 240, 80, 34, 13, 0, 9, + 100, 178, 178, 178, 178, 178, 178, 37, 66, 49, 114, 49, + 114, 33, 130, 17, 149, 130, 34, 114, 34, 114, 50, 98, + 51, 53, 21, 0, 11, 80, 24, 8, 0, 6, 4, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 70, 0, 7, 32, 40, 20, 0, 30, 4, 20, + 36, 115, 51, 50, 99, 51, 50, 98, 66, 66, 98, 66, + 66, 98, 66, 66, 98, 66, 66, 98, 66, 66, 98, 66, + 66, 98, 66, 66, 69, 36, 37, 0, 17, 96, 29, 14, + 0, 21, 4, 35, 116, 34, 99, 50, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 69, 37, + 0, 12, 64, 27, 12, 0, 18, 52, 113, 65, 81, 97, + 50, 98, 34, 98, 34, 98, 34, 98, 34, 98, 49, 97, + 81, 65, 116, 0, 11, 16, 34, 13, 0, 19, 68, 20, + 99, 50, 83, 65, 82, 82, 66, 82, 66, 82, 66, 82, + 66, 82, 66, 81, 83, 50, 82, 20, 98, 178, 178, 178, + 150, 240, 240, 48, 34, 13, 0, 19, 100, 33, 82, 49, + 17, 81, 82, 66, 82, 66, 82, 66, 82, 66, 82, 66, + 82, 81, 82, 82, 51, 100, 18, 178, 178, 178, 178, 150, + 240, 208, 22, 11, 0, 16, 68, 34, 82, 17, 33, 67, + 34, 67, 130, 146, 146, 146, 146, 146, 118, 0, 10, 32, + 25, 10, 0, 15, 20, 81, 66, 49, 81, 50, 147, 132, + 65, 52, 33, 82, 34, 81, 34, 81, 33, 21, 0, 9, + 16, 26, 9, 0, 8, 33, 129, 129, 129, 114, 86, 82, + 114, 114, 114, 114, 114, 114, 33, 66, 33, 66, 33, 83, + 0, 8, 32, 30, 14, 0, 21, 4, 51, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, + 51, 98, 33, 18, 115, 36, 0, 12, 64, 26, 14, 0, + 21, 5, 52, 66, 81, 98, 81, 114, 49, 130, 49, 146, + 17, 162, 17, 177, 17, 178, 194, 209, 0, 13, 16, 40, + 20, 0, 30, 5, 37, 36, 66, 66, 81, 113, 82, 65, + 114, 51, 49, 130, 49, 17, 49, 146, 17, 34, 17, 162, + 17, 34, 17, 179, 49, 17, 178, 66, 209, 66, 209, 81, + 0, 18, 48, 26, 13, 0, 19, 69, 20, 82, 49, 130, + 33, 130, 17, 162, 178, 179, 145, 34, 129, 34, 113, 66, + 68, 37, 0, 11, 80, 33, 14, 0, 21, 6, 36, 66, + 81, 113, 81, 114, 49, 130, 49, 145, 49, 146, 17, 162, + 17, 179, 178, 194, 209, 193, 146, 33, 146, 33, 163, 240, + 240, 112, 23, 10, 0, 15, 8, 33, 67, 33, 66, 49, + 50, 130, 114, 114, 130, 49, 50, 65, 50, 65, 40, 0, + 9, 27, 8, 0, 6, 66, 81, 98, 98, 98, 99, 98, + 98, 98, 97, 67, 114, 114, 98, 98, 83, 82, 98, 98, + 113, 130, 240, 176, 26, 3, 240, 49, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 128, 27, 8, 0, 6, 2, 129, + 114, 98, 98, 83, 82, 98, 98, 113, 131, 66, 82, 98, + 98, 99, 98, 98, 98, 97, 82, 240, 240, 17, 16, 0, + 30, 20, 113, 50, 21, 81, 33, 84, 49, 33, 117, 0, + 22, 48, 5, 10, 0, 37, 64, 21, 5, 0, 7, 67, + 35, 35, 49, 65, 65, 65, 65, 65, 65, 51, 35, 35, + 35, 35, 35, 192, 37, 10, 0, 11, 97, 145, 145, 117, + 66, 17, 33, 49, 33, 33, 34, 33, 18, 34, 33, 82, + 33, 82, 33, 82, 33, 97, 33, 33, 50, 17, 33, 69, + 113, 145, 0, 6, 112, 31, 15, 0, 14, 20, 146, 65, + 129, 66, 114, 66, 114, 210, 165, 213, 162, 210, 210, 210, + 147, 17, 145, 50, 97, 33, 56, 67, 52, 0, 13, 80, + 29, 13, 0, 16, 33, 37, 33, 50, 82, 65, 113, 49, + 145, 33, 145, 33, 145, 33, 145, 49, 113, 66, 82, 49, + 37, 33, 0, 16, 64, 30, 15, 0, 13, 21, 53, 51, + 97, 98, 81, 115, 65, 130, 49, 162, 33, 162, 17, 194, + 169, 146, 169, 146, 210, 210, 210, 183, 0, 13, 96, 21, + 3, 240, 49, 33, 33, 33, 33, 33, 33, 33, 240, 33, + 33, 33, 33, 33, 33, 33, 33, 176, 39, 11, 0, 10, + 3, 98, 49, 82, 34, 82, 147, 147, 147, 98, 19, 65, + 67, 49, 98, 33, 113, 34, 97, 50, 65, 82, 33, 115, + 146, 162, 82, 34, 82, 34, 81, 49, 115, 240, 208, 11, + 9, 0, 9, 2, 50, 34, 50, 0, 22, 96, 57, 20, + 0, 15, 102, 194, 98, 145, 51, 65, 113, 49, 51, 33, + 81, 50, 66, 49, 65, 34, 97, 49, 49, 50, 97, 65, + 33, 50, 177, 33, 50, 177, 33, 50, 177, 33, 50, 177, + 49, 50, 65, 65, 65, 65, 65, 65, 81, 68, 65, 113, + 161, 145, 129, 184, 0, 18, 48, 19, 9, 0, 7, 116, + 130, 82, 17, 66, 33, 66, 33, 17, 66, 17, 54, 0, + 18, 48, 24, 8, 0, 13, 33, 98, 33, 49, 33, 50, + 33, 50, 33, 50, 33, 50, 33, 65, 49, 65, 33, 0, + 8, 32, 12, 14, 0, 24, 76, 209, 209, 209, 209, 0, + 19, 64, 8, 8, 0, 16, 6, 0, 13, 32, 60, 20, + 0, 15, 102, 194, 98, 145, 161, 113, 22, 81, 81, 50, + 50, 65, 65, 50, 50, 65, 49, 66, 50, 81, 33, 69, + 113, 33, 66, 49, 97, 33, 66, 50, 81, 33, 66, 50, + 81, 49, 50, 50, 65, 65, 50, 50, 17, 33, 81, 20, + 50, 33, 113, 161, 145, 129, 184, 0, 18, 48, 8, 8, + 0, 9, 6, 0, 20, 32, 17, 9, 0, 8, 4, 66, + 50, 33, 81, 33, 81, 49, 49, 83, 0, 19, 80, 37, + 23, 0, 24, 33, 240, 113, 240, 113, 240, 113, 240, 113, + 240, 113, 207, 6, 193, 240, 113, 240, 113, 240, 113, 240, + 113, 240, 113, 240, 113, 240, 240, 95, 5, 0, 17, 80, + 22, 9, 0, 8, 4, 65, 66, 33, 66, 34, 50, 113, + 113, 113, 98, 49, 49, 65, 39, 0, 14, 112, 21, 9, + 0, 8, 4, 65, 50, 50, 34, 114, 52, 146, 130, 34, + 50, 34, 49, 68, 0, 15, 16, 11, 6, 240, 240, 226, + 66, 49, 65, 0, 14, 112, 35, 14, 0, 21, 2, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 81, 98, 81, 98, + 81, 97, 97, 97, 49, 34, 70, 68, 51, 33, 209, 209, + 209, 210, 194, 240, 176, 46, 12, 0, 9, 40, 52, 33, + 69, 33, 69, 33, 69, 33, 69, 33, 84, 33, 114, 33, + 129, 33, 129, 33, 129, 33, 129, 33, 129, 33, 129, 33, + 129, 33, 129, 33, 129, 33, 129, 33, 129, 33, 129, 33, + 0, 6, 64, 10, 5, 0, 8, 99, 35, 35, 0, 8, + 48, 11, 7, 0, 20, 33, 98, 114, 82, 36, 240, 32, + 17, 8, 0, 7, 49, 68, 98, 98, 98, 98, 98, 98, + 98, 70, 0, 13, 32, 20, 8, 0, 7, 20, 50, 33, + 50, 34, 34, 34, 34, 34, 49, 33, 82, 70, 0, 15, + 32, 24, 8, 0, 13, 49, 65, 34, 65, 33, 65, 34, + 49, 34, 49, 34, 49, 34, 33, 34, 49, 33, 0, 8, + 64, 46, 19, 0, 17, 1, 129, 100, 129, 130, 113, 146, + 98, 146, 97, 162, 81, 178, 81, 50, 98, 65, 51, 70, + 17, 49, 18, 177, 49, 18, 161, 49, 34, 145, 65, 34, + 145, 56, 97, 130, 114, 130, 113, 118, 0, 16, 112, 46, + 18, 0, 16, 17, 129, 84, 113, 130, 113, 130, 97, 146, + 81, 162, 81, 19, 98, 67, 34, 82, 66, 66, 38, 17, + 18, 50, 129, 49, 50, 129, 98, 129, 98, 145, 81, 161, + 81, 65, 82, 66, 65, 81, 87, 0, 16, 49, 19, 0, + 16, 100, 113, 97, 50, 97, 162, 81, 116, 97, 194, 65, + 210, 33, 146, 50, 17, 66, 66, 49, 33, 51, 84, 33, + 49, 18, 161, 65, 18, 161, 49, 34, 145, 65, 34, 129, + 72, 81, 146, 113, 146, 97, 134, 0, 16, 112, 28, 11, + 0, 16, 115, 131, 131, 131, 113, 49, 97, 49, 146, 130, + 130, 114, 146, 130, 67, 34, 67, 34, 97, 50, 65, 85, + 240, 176, 47, 19, 240, 146, 240, 34, 240, 65, 240, 65, + 240, 240, 113, 240, 49, 240, 35, 240, 19, 240, 19, 241, + 19, 225, 34, 210, 34, 209, 51, 193, 66, 178, 66, 185, + 161, 98, 145, 114, 145, 115, 114, 130, 87, 40, 0, 16, + 112, 47, 19, 240, 226, 240, 19, 240, 17, 240, 33, 240, + 240, 113, 240, 49, 240, 35, 240, 19, 241, 18, 241, 19, + 225, 34, 210, 34, 209, 51, 193, 66, 177, 82, 185, 161, + 98, 145, 114, 145, 130, 114, 130, 87, 40, 0, 16, 112, + 48, 19, 240, 193, 240, 34, 240, 17, 33, 225, 66, 240, + 240, 65, 240, 34, 240, 34, 240, 35, 241, 18, 241, 18, + 241, 34, 209, 50, 209, 51, 193, 66, 177, 82, 185, 161, + 98, 145, 114, 145, 115, 114, 130, 87, 40, 0, 16, 112, + 44, 19, 240, 240, 227, 33, 193, 21, 0, 6, 81, 240, + 49, 240, 35, 240, 19, 244, 241, 19, 225, 34, 210, 34, + 209, 51, 193, 66, 178, 66, 185, 161, 98, 145, 114, 145, + 115, 114, 130, 87, 40, 0, 16, 112, 45, 19, 240, 240, + 210, 50, 194, 50, 0, 6, 81, 240, 49, 240, 35, 240, + 19, 241, 18, 241, 19, 225, 34, 225, 34, 209, 51, 193, + 66, 193, 66, 185, 161, 98, 161, 98, 146, 114, 130, 114, + 87, 55, 0, 16, 112, 47, 19, 115, 241, 49, 225, 49, + 225, 49, 243, 240, 240, 97, 240, 49, 240, 35, 240, 19, + 240, 19, 241, 19, 225, 34, 210, 34, 209, 51, 193, 66, + 177, 82, 185, 161, 98, 145, 115, 129, 130, 114, 130, 87, + 40, 0, 16, 112, 53, 24, 0, 19, 29, 195, 99, 195, + 114, 177, 18, 129, 177, 18, 129, 161, 34, 65, 49, 161, + 34, 65, 209, 50, 50, 209, 55, 193, 66, 50, 193, 66, + 65, 184, 65, 49, 97, 98, 129, 97, 98, 129, 82, 98, + 114, 82, 98, 114, 39, 45, 0, 21, 32, 42, 15, 0, + 11, 101, 49, 81, 81, 18, 65, 115, 50, 115, 49, 146, + 34, 161, 34, 161, 34, 210, 210, 210, 210, 161, 49, 161, + 50, 129, 81, 129, 97, 97, 134, 161, 242, 226, 210, 164, + 240, 240, 112, 43, 15, 240, 50, 226, 225, 241, 240, 141, + 66, 114, 66, 129, 66, 129, 66, 129, 66, 65, 49, 66, + 65, 130, 50, 135, 130, 50, 130, 65, 130, 65, 130, 129, + 66, 129, 66, 129, 66, 114, 45, 0, 13, 48, 43, 15, + 240, 145, 210, 194, 193, 240, 141, 66, 114, 66, 129, 66, + 129, 66, 129, 66, 65, 49, 66, 65, 130, 50, 135, 130, + 50, 130, 65, 130, 65, 130, 129, 66, 129, 66, 129, 66, + 114, 45, 0, 13, 48, 45, 15, 240, 97, 226, 193, 33, + 146, 66, 240, 77, 66, 114, 66, 129, 66, 129, 66, 129, + 66, 65, 49, 66, 65, 130, 50, 135, 130, 50, 130, 65, + 130, 65, 130, 129, 66, 129, 66, 129, 66, 114, 45, 0, + 13, 48, 46, 15, 240, 240, 66, 34, 146, 34, 240, 240, + 93, 66, 114, 66, 114, 66, 129, 66, 129, 66, 65, 49, + 66, 65, 130, 65, 135, 130, 50, 130, 65, 130, 65, 49, + 66, 129, 66, 129, 66, 129, 66, 114, 45, 0, 13, 48, + 26, 9, 161, 130, 130, 240, 135, 82, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 71, 0, + 8, 16, 26, 9, 225, 114, 98, 240, 119, 66, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 87, 0, 8, 16, 28, 10, 240, 130, 113, 33, 66, 66, + 214, 98, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 102, 0, 9, 16, 28, 9, 240, 50, + 50, 34, 50, 240, 87, 82, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 71, 0, 8, 16, + 39, 17, 0, 12, 106, 146, 98, 114, 114, 98, 130, 82, + 130, 82, 146, 66, 146, 66, 146, 39, 98, 66, 146, 66, + 146, 66, 146, 66, 130, 82, 130, 82, 114, 98, 98, 90, + 0, 15, 96, 55, 17, 240, 115, 240, 20, 0, 7, 20, + 101, 67, 113, 100, 97, 97, 18, 97, 97, 19, 81, 97, + 34, 81, 97, 50, 65, 97, 51, 49, 97, 66, 49, 97, + 67, 33, 97, 82, 33, 97, 98, 17, 97, 98, 17, 97, + 115, 97, 115, 97, 130, 69, 113, 0, 15, 48, 43, 16, + 240, 66, 242, 242, 241, 240, 244, 162, 66, 113, 129, 82, + 130, 65, 161, 50, 162, 34, 162, 34, 162, 34, 162, 34, + 162, 34, 162, 34, 162, 49, 161, 66, 130, 81, 129, 113, + 97, 150, 0, 14, 96, 43, 16, 240, 162, 210, 210, 225, + 240, 228, 162, 66, 113, 129, 82, 130, 65, 161, 50, 162, + 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, + 49, 161, 66, 130, 81, 129, 113, 97, 150, 0, 14, 96, + 45, 16, 240, 114, 212, 178, 34, 145, 97, 240, 180, 162, + 66, 113, 129, 82, 130, 65, 161, 50, 162, 34, 162, 34, + 162, 34, 162, 34, 162, 34, 162, 34, 162, 49, 161, 66, + 130, 81, 129, 113, 97, 150, 0, 14, 96, 44, 16, 240, + 84, 33, 129, 37, 0, 7, 36, 162, 66, 113, 129, 82, + 130, 65, 161, 50, 162, 34, 162, 34, 162, 34, 162, 34, + 162, 34, 162, 34, 162, 49, 161, 66, 130, 81, 129, 113, + 97, 150, 0, 14, 96, 45, 16, 240, 240, 98, 34, 162, + 34, 240, 240, 212, 162, 66, 113, 129, 82, 130, 65, 161, + 50, 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, + 34, 162, 49, 161, 66, 130, 81, 129, 113, 97, 150, 0, + 14, 96, 34, 17, 0, 19, 17, 240, 18, 177, 66, 145, + 98, 113, 130, 81, 162, 49, 194, 17, 226, 243, 209, 34, + 177, 66, 145, 98, 113, 130, 81, 162, 49, 194, 0, 13, + 51, 16, 0, 12, 85, 49, 82, 81, 17, 81, 130, 66, + 130, 65, 129, 17, 50, 113, 34, 34, 97, 50, 34, 82, + 50, 34, 66, 66, 34, 50, 82, 34, 34, 98, 34, 33, + 114, 49, 17, 129, 66, 130, 66, 129, 83, 97, 81, 54, + 0, 14, 96, 47, 18, 240, 130, 240, 33, 240, 49, 240, + 49, 240, 198, 85, 66, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 114, 113, 146, 81, 182, 0, + 16, 80, 45, 18, 240, 210, 242, 241, 240, 17, 240, 214, + 85, 66, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, + 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, + 145, 98, 145, 114, 113, 146, 81, 182, 0, 16, 80, 47, + 18, 240, 162, 240, 19, 225, 34, 178, 81, 240, 150, 85, + 66, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 114, 113, 146, 81, 182, 0, 16, 80, 46, 18, + 240, 240, 178, 50, 178, 50, 240, 240, 199, 69, 66, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 114, 113, 146, 81, 182, 0, 16, 80, 36, 17, 240, 193, + 242, 226, 240, 240, 183, 38, 67, 98, 114, 97, 131, 81, + 147, 49, 178, 49, 179, 17, 210, 17, 211, 242, 242, 242, + 242, 242, 242, 242, 200, 0, 15, 64, 31, 15, 0, 11, + 39, 162, 210, 216, 114, 98, 82, 113, 82, 114, 66, 114, + 66, 114, 66, 98, 82, 98, 88, 114, 210, 210, 210, 183, + 0, 14, 16, 42, 13, 0, 10, 37, 114, 50, 82, 66, + 82, 66, 82, 66, 82, 50, 98, 18, 130, 50, 98, 66, + 82, 81, 82, 82, 66, 82, 66, 82, 66, 82, 66, 18, + 34, 66, 17, 49, 52, 35, 0, 11, 112, 34, 13, 0, + 11, 66, 178, 209, 209, 240, 132, 129, 66, 97, 66, 98, + 50, 178, 118, 97, 66, 82, 66, 82, 51, 33, 34, 33, + 18, 33, 51, 51, 0, 11, 96, 34, 13, 0, 12, 18, + 163, 161, 177, 240, 132, 129, 66, 97, 66, 98, 50, 178, + 118, 97, 66, 82, 66, 82, 51, 33, 34, 33, 18, 33, + 51, 51, 0, 11, 96, 36, 13, 0, 11, 113, 178, 177, + 17, 145, 49, 240, 100, 129, 66, 97, 66, 98, 50, 178, + 118, 97, 66, 82, 66, 82, 51, 33, 34, 33, 18, 33, + 51, 51, 0, 11, 96, 35, 13, 0, 11, 83, 33, 97, + 20, 0, 5, 116, 129, 66, 97, 66, 98, 50, 178, 118, + 97, 66, 82, 66, 82, 51, 33, 34, 33, 18, 33, 51, + 51, 0, 11, 96, 34, 13, 0, 13, 18, 50, 98, 50, + 240, 240, 52, 129, 66, 97, 66, 98, 50, 178, 118, 97, + 66, 82, 66, 82, 51, 33, 34, 51, 33, 52, 35, 0, + 11, 96, 35, 13, 0, 11, 99, 145, 49, 129, 49, 147, + 240, 116, 129, 66, 97, 66, 98, 50, 178, 118, 97, 66, + 82, 66, 82, 51, 33, 34, 51, 33, 52, 35, 0, 11, + 96, 35, 17, 0, 25, 100, 51, 97, 67, 50, 65, 66, + 81, 66, 50, 82, 130, 82, 92, 50, 50, 146, 66, 97, + 34, 66, 97, 34, 49, 18, 65, 68, 53, 0, 15, 48, + 27, 10, 0, 15, 52, 66, 65, 49, 81, 34, 66, 34, + 130, 130, 130, 145, 81, 50, 49, 84, 113, 147, 146, 130, + 84, 240, 144, 29, 10, 0, 8, 114, 130, 161, 161, 240, + 51, 82, 49, 65, 66, 34, 66, 34, 66, 40, 34, 130, + 145, 81, 50, 65, 84, 0, 9, 16, 29, 10, 0, 9, + 66, 130, 113, 129, 240, 51, 82, 49, 65, 66, 34, 66, + 34, 66, 40, 34, 130, 145, 81, 50, 65, 84, 0, 9, + 16, 31, 10, 0, 9, 33, 131, 113, 17, 97, 49, 240, + 19, 82, 49, 65, 66, 34, 66, 34, 66, 40, 34, 130, + 145, 81, 50, 65, 84, 0, 9, 16, 29, 10, 0, 10, + 18, 50, 50, 50, 240, 163, 82, 49, 65, 66, 34, 81, + 34, 81, 40, 34, 130, 145, 81, 50, 65, 84, 0, 9, + 16, 22, 8, 0, 7, 1, 114, 114, 240, 115, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 85, 0, 7, 32, 22, + 8, 0, 7, 66, 98, 81, 97, 212, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 69, 0, 7, 48, 23, 8, 0, + 7, 34, 98, 81, 33, 129, 164, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 70, 0, 7, 32, 23, 8, 0, 8, + 2, 34, 34, 34, 240, 67, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 84, 0, 7, 48, 37, 12, 0, 9, 34, + 65, 98, 18, 130, 145, 18, 98, 50, 162, 118, 81, 66, + 65, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 49, 97, 81, 65, 116, 0, 11, 16, 35, 14, 0, 14, + 66, 33, 129, 20, 240, 240, 52, 35, 116, 34, 99, 50, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 66, 69, 37, 0, 12, 64, 32, 12, 0, 10, 82, + 178, 178, 240, 240, 68, 113, 65, 81, 97, 50, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 49, 97, 81, 65, 116, + 0, 11, 16, 32, 12, 0, 11, 50, 146, 146, 161, 240, + 100, 113, 65, 81, 97, 50, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 49, 97, 81, 65, 116, 0, 11, 16, 34, + 12, 0, 11, 2, 162, 145, 33, 113, 65, 240, 68, 113, + 65, 81, 97, 50, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 49, 97, 81, 65, 116, 0, 11, 16, 33, 12, 0, + 10, 100, 33, 65, 36, 240, 240, 212, 113, 65, 81, 97, + 50, 98, 34, 98, 34, 98, 34, 98, 34, 98, 49, 97, + 81, 65, 116, 0, 11, 16, 33, 12, 0, 12, 34, 34, + 98, 34, 240, 240, 20, 113, 65, 81, 97, 50, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 49, 97, 81, 65, 116, + 0, 11, 16, 23, 23, 0, 27, 3, 240, 83, 240, 83, + 0, 12, 127, 6, 0, 12, 115, 240, 83, 240, 83, 0, + 18, 80, 34, 12, 0, 18, 52, 33, 65, 66, 65, 82, + 50, 65, 18, 34, 49, 34, 34, 33, 50, 34, 33, 50, + 34, 17, 66, 50, 81, 66, 65, 65, 36, 0, 11, 16, + 35, 14, 0, 12, 81, 210, 210, 240, 240, 100, 51, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 51, 98, 33, 18, 115, 36, 0, 12, 64, 35, + 14, 0, 13, 33, 194, 177, 193, 240, 116, 51, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 51, 98, 33, 18, 115, 36, 0, 12, 64, 37, 14, + 0, 12, 113, 210, 177, 33, 145, 65, 240, 68, 51, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 51, 98, 33, 18, 115, 36, 0, 12, 64, 36, + 14, 0, 14, 50, 34, 130, 34, 240, 240, 52, 51, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 51, 98, 33, 18, 115, 36, 0, 12, 64, 38, + 14, 0, 13, 34, 178, 193, 193, 240, 102, 36, 66, 81, + 113, 81, 114, 49, 130, 49, 145, 49, 146, 17, 162, 17, + 179, 178, 194, 209, 193, 146, 33, 146, 33, 163, 240, 240, + 112, 39, 12, 0, 10, 98, 132, 162, 162, 162, 162, 35, + 82, 17, 34, 67, 50, 66, 66, 66, 66, 66, 65, 82, + 50, 82, 49, 98, 33, 114, 17, 131, 146, 162, 162, 162, + 162, 130, 240, 112, 39, 14, 0, 12, 82, 50, 114, 50, + 0, 5, 101, 52, 66, 81, 113, 81, 114, 49, 130, 49, + 146, 33, 146, 17, 162, 17, 179, 178, 194, 209, 193, 146, + 33, 146, 18, 163, 240, 240, 112, +}; + +//***************************************************************************** +// +// The glyph offset table for the 24 point Oldstandard font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard24[] = +{ + 0, 5, 28, 43, 79, 142, 195, 239, + 249, 277, 305, 330, 375, 388, 396, 406, + 434, 471, 493, 524, 555, 585, 618, 654, + 680, 715, 750, 764, 780, 824, 837, 880, + 909, 969, 1008, 1046, 1083, 1122, 1161, 1196, + 1239, 1278, 1302, 1330, 1371, 1400, 1464, 1514, + 1553, 1584, 1635, 1676, 1714, 1748, 1788, 1828, + 1892, 1929, 1961, 1995, 2023, 2050, 2078, 2099, + 2107, 2118, 2147, 2183, 2206, 2241, 2265, 2291, + 2325, 2360, 2381, 2408, 2442, 2466, 2506, 2535, + 2562, 2596, 2630, 2652, 2677, 2703, 2733, 2759, + 2799, 2825, 2858, 2881, 2908, 2934, 2961, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2978, 2983, 3004, 3041, 3072, 3101, 3131, 3152, + 3191, 3202, 3259, 3278, 3302, 3314, 3322, 3382, + 3390, 3407, 3444, 3466, 3487, 3498, 3533, 3579, + 3589, 3600, 3617, 3637, 3661, 3707, 3753, 3802, + 3830, 3877, 3924, 3972, 4016, 4061, 4108, 4161, + 4203, 4246, 4289, 4334, 4380, 4406, 4432, 4460, + 4488, 4527, 4582, 4625, 4668, 4713, 4757, 4802, + 4836, 4887, 4934, 4979, 5026, 5072, 5108, 5139, + 5181, 5215, 5249, 5285, 5320, 5354, 5389, 5424, + 5451, 5480, 5509, 5540, 5569, 5591, 5613, 5636, + 5659, 5696, 5731, 5763, 5795, 5829, 5862, 5895, + 5918, 5952, 5987, 6022, 6059, 6095, 6133, 6172, +}; + +//***************************************************************************** +// +// The font definition for the 24 point Oldstandard font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard24 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 24, + + // + // The height of the font. + // + 30, + + // + // The baseline of the font. + // + 23, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard24, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard24Data +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard24b.c b/third_party/fonts/ofl/fonts/fontoldstandard24b.c new file mode 100644 index 0000000..7cbafe5 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard24b.c @@ -0,0 +1,770 @@ +//***************************************************************************** +// +// fontoldstandard24b.c - Font definition for the 24pt Oldstandard bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 24 point +// Bold: yes +// Italic: no +// Memory usage: 6808 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 24 point Oldstandard bold font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard24bData[6605] = +{ + 5, 10, 0, 38, 96, 24, 6, 240, 240, 114, 52, 36, + 36, 36, 36, 50, 66, 66, 66, 66, 65, 240, 34, 52, + 36, 50, 240, 240, 240, 15, 8, 0, 6, 6, 38, 38, + 38, 50, 18, 49, 33, 0, 19, 48, 39, 16, 0, 12, + 81, 66, 145, 66, 130, 66, 130, 65, 146, 65, 94, 46, + 97, 66, 130, 66, 130, 66, 130, 65, 146, 65, 110, 46, + 81, 66, 130, 66, 130, 65, 146, 65, 0, 14, 112, 64, + 14, 0, 7, 65, 33, 161, 33, 150, 115, 33, 18, 66, + 17, 33, 49, 50, 17, 33, 49, 50, 17, 33, 19, 52, + 33, 19, 52, 33, 134, 135, 135, 135, 81, 17, 37, 50, + 17, 33, 19, 35, 17, 33, 34, 49, 33, 33, 34, 49, + 33, 33, 33, 81, 17, 33, 18, 102, 145, 33, 161, 33, + 0, 9, 64, 58, 19, 0, 14, 67, 129, 98, 18, 97, + 99, 19, 65, 115, 19, 65, 115, 19, 49, 131, 19, 49, + 131, 19, 33, 162, 18, 49, 179, 49, 240, 33, 66, 193, + 34, 34, 145, 35, 34, 145, 35, 35, 113, 51, 35, 113, + 51, 35, 97, 67, 35, 81, 98, 34, 97, 116, 0, 17, + 16, 47, 19, 0, 15, 3, 241, 49, 210, 49, 210, 49, + 210, 49, 211, 17, 243, 240, 19, 244, 54, 82, 19, 66, + 98, 51, 49, 98, 67, 49, 83, 83, 17, 99, 85, 99, + 99, 116, 84, 49, 56, 20, 17, 85, 83, 0, 17, 16, + 12, 5, 240, 243, 35, 35, 35, 50, 49, 0, 12, 32, + 29, 9, 0, 7, 65, 98, 98, 113, 114, 98, 114, 114, + 99, 99, 99, 99, 99, 99, 99, 114, 114, 114, 130, 129, + 145, 145, 145, 240, 80, 29, 9, 0, 6, 97, 145, 146, + 129, 130, 130, 114, 114, 115, 99, 99, 99, 99, 99, 99, + 98, 114, 114, 98, 113, 113, 113, 113, 240, 176, 26, 10, + 0, 7, 114, 130, 82, 33, 33, 35, 17, 18, 83, 97, + 18, 67, 17, 18, 34, 18, 33, 82, 130, 0, 19, 48, + 46, 23, 0, 18, 50, 240, 98, 240, 98, 240, 98, 240, + 98, 240, 98, 240, 98, 240, 98, 240, 98, 240, 98, 207, + 6, 47, 6, 178, 240, 98, 240, 98, 240, 98, 240, 98, + 240, 98, 240, 98, 240, 98, 240, 98, 0, 13, 14, 6, + 0, 15, 3, 52, 36, 36, 81, 65, 81, 65, 240, 112, + 10, 8, 0, 16, 6, 38, 38, 0, 12, 32, 11, 6, + 0, 15, 18, 52, 36, 50, 240, 240, 240, 29, 10, 0, + 8, 49, 145, 130, 130, 129, 130, 130, 129, 130, 130, 130, + 129, 130, 130, 129, 130, 130, 129, 145, 130, 130, 129, 130, + 240, 208, 41, 13, 0, 10, 35, 130, 50, 98, 50, 83, + 51, 67, 51, 52, 52, 36, 52, 36, 52, 36, 52, 36, + 52, 36, 52, 36, 52, 36, 52, 51, 51, 67, 51, 82, + 50, 98, 50, 131, 0, 12, 16, 25, 9, 0, 7, 18, + 99, 69, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 71, 0, 8, 16, 36, 12, 0, 9, + 53, 83, 35, 66, 67, 35, 67, 36, 51, 36, 51, 51, + 35, 147, 131, 130, 146, 145, 97, 49, 113, 49, 113, 42, + 33, 24, 33, 38, 49, 67, 0, 11, 34, 13, 0, 10, + 21, 113, 51, 82, 67, 66, 67, 67, 51, 67, 51, 162, + 162, 132, 195, 179, 164, 51, 52, 36, 52, 36, 52, 35, + 67, 66, 52, 86, 0, 12, 32, 14, 0, 11, 50, 179, + 179, 164, 149, 145, 19, 130, 19, 129, 35, 114, 35, 113, + 51, 98, 51, 97, 67, 92, 131, 179, 179, 179, 136, 0, + 12, 80, 36, 13, 0, 9, 113, 82, 88, 86, 116, 145, + 193, 193, 21, 98, 51, 81, 83, 65, 84, 148, 65, 68, + 36, 52, 36, 52, 35, 67, 50, 83, 65, 67, 101, 0, + 12, 16, 38, 13, 0, 10, 36, 130, 49, 98, 51, 67, + 36, 67, 36, 52, 148, 148, 20, 69, 35, 52, 66, 52, + 67, 36, 67, 36, 67, 51, 67, 51, 67, 66, 66, 83, + 35, 116, 0, 12, 33, 12, 0, 9, 1, 35, 33, 49, + 21, 33, 39, 33, 42, 33, 129, 33, 113, 49, 113, 162, + 161, 162, 147, 131, 147, 132, 132, 132, 132, 146, 0, 11, + 32, 38, 14, 0, 10, 118, 113, 97, 81, 129, 50, 129, + 50, 129, 51, 113, 54, 49, 88, 105, 105, 66, 38, 50, + 84, 50, 115, 34, 129, 50, 129, 66, 113, 67, 81, 118, + 0, 12, 112, 39, 13, 0, 10, 20, 114, 51, 82, 66, + 67, 67, 51, 67, 51, 68, 35, 68, 35, 68, 51, 37, + 68, 20, 148, 148, 67, 36, 52, 35, 68, 35, 66, 66, + 97, 50, 132, 0, 12, 16, 16, 6, 0, 9, 18, 52, + 36, 50, 240, 210, 52, 36, 50, 240, 240, 240, 19, 6, + 0, 9, 18, 52, 36, 50, 240, 195, 52, 36, 36, 81, + 65, 81, 65, 240, 112, 40, 20, 0, 19, 66, 240, 35, + 243, 243, 244, 243, 243, 243, 243, 244, 240, 19, 240, 51, + 240, 67, 240, 67, 240, 67, 240, 51, 240, 67, 240, 67, + 240, 67, 240, 51, 240, 65, 0, 7, 96, 17, 22, 0, + 38, 79, 5, 47, 5, 0, 8, 79, 5, 47, 5, 0, + 27, 96, 41, 20, 0, 17, 66, 240, 51, 240, 67, 240, + 67, 240, 67, 240, 51, 240, 67, 240, 67, 240, 67, 240, + 51, 240, 51, 240, 19, 243, 243, 243, 244, 243, 243, 243, + 240, 19, 240, 33, 0, 9, 112, 32, 10, 0, 7, 100, + 81, 35, 49, 67, 33, 67, 33, 67, 49, 50, 114, 114, + 129, 129, 145, 33, 97, 33, 114, 240, 50, 116, 100, 114, + 0, 9, 48, 64, 20, 0, 15, 102, 194, 98, 146, 146, + 98, 67, 18, 17, 82, 66, 35, 18, 66, 50, 51, 33, + 50, 51, 51, 34, 34, 51, 50, 50, 34, 35, 66, 50, + 34, 35, 51, 50, 34, 35, 51, 50, 34, 35, 50, 50, + 65, 35, 50, 50, 66, 19, 36, 18, 98, 35, 35, 130, + 240, 82, 113, 199, 0, 18, 48, 40, 19, 0, 15, 33, + 240, 50, 240, 19, 240, 19, 240, 20, 229, 225, 19, 225, + 19, 209, 36, 193, 51, 193, 51, 177, 68, 169, 161, 83, + 145, 100, 129, 100, 114, 100, 86, 41, 0, 16, 112, 40, + 16, 0, 12, 10, 131, 67, 99, 83, 83, 83, 83, 83, + 83, 83, 83, 82, 99, 66, 119, 147, 67, 99, 83, 83, + 84, 67, 84, 67, 84, 67, 84, 67, 83, 83, 68, 59, + 0, 14, 80, 39, 15, 0, 11, 101, 33, 98, 68, 66, + 99, 51, 99, 51, 114, 36, 114, 36, 113, 52, 129, 36, + 180, 180, 180, 129, 36, 129, 51, 129, 51, 113, 82, 113, + 98, 66, 133, 0, 13, 112, 41, 18, 0, 13, 75, 147, + 83, 115, 99, 99, 115, 83, 115, 83, 115, 83, 116, 67, + 116, 67, 116, 67, 116, 67, 116, 67, 116, 67, 115, 83, + 115, 83, 115, 83, 99, 99, 83, 91, 0, 16, 80, 43, + 16, 0, 12, 14, 67, 84, 67, 99, 67, 114, 67, 114, + 67, 65, 49, 67, 65, 131, 50, 131, 50, 136, 131, 50, + 131, 65, 49, 67, 65, 49, 67, 129, 67, 114, 67, 99, + 67, 99, 46, 0, 14, 32, 37, 16, 0, 12, 14, 67, + 84, 67, 99, 67, 114, 67, 114, 67, 65, 34, 67, 65, + 49, 67, 50, 131, 50, 136, 131, 50, 131, 65, 131, 65, + 131, 211, 211, 211, 184, 0, 15, 44, 17, 0, 13, 52, + 49, 114, 66, 17, 98, 99, 83, 114, 83, 114, 83, 129, + 68, 129, 68, 212, 212, 56, 36, 99, 68, 99, 68, 99, + 83, 99, 83, 99, 98, 97, 17, 114, 65, 33, 133, 49, + 0, 15, 48, 41, 18, 0, 13, 71, 39, 67, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 108, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 71, 39, 0, 16, 25, 9, 0, 6, + 103, 67, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 71, 0, 8, 16, 31, 13, 0, + 10, 24, 131, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 83, 35, 68, 35, 68, 35, 67, 51, 66, 66, 97, 66, + 116, 0, 12, 32, 40, 18, 0, 13, 71, 38, 83, 98, + 115, 97, 131, 81, 147, 65, 163, 50, 163, 34, 179, 20, + 168, 169, 147, 36, 147, 52, 131, 52, 131, 68, 115, 68, + 115, 84, 99, 85, 55, 39, 0, 16, 32, 16, 0, 12, + 7, 179, 211, 211, 211, 211, 211, 211, 211, 211, 211, 129, + 67, 114, 67, 114, 67, 114, 67, 99, 67, 99, 67, 84, + 46, 0, 14, 32, 64, 20, 0, 15, 5, 133, 68, 100, + 100, 100, 100, 100, 101, 65, 19, 97, 19, 65, 19, 97, + 19, 65, 19, 97, 20, 49, 19, 97, 35, 33, 35, 97, + 36, 17, 35, 97, 36, 17, 35, 97, 51, 17, 35, 97, + 52, 51, 97, 52, 51, 97, 67, 51, 97, 67, 51, 83, + 50, 67, 69, 49, 39, 0, 17, 96, 48, 19, 0, 14, + 38, 71, 68, 99, 101, 97, 133, 81, 133, 81, 134, 65, + 129, 21, 49, 129, 36, 49, 129, 52, 33, 129, 53, 17, + 129, 68, 17, 129, 85, 129, 85, 129, 100, 129, 115, 129, + 115, 115, 114, 87, 97, 0, 17, 32, 41, 16, 0, 12, + 84, 162, 66, 114, 98, 98, 98, 83, 99, 67, 99, 52, + 100, 36, 100, 36, 100, 36, 100, 36, 100, 36, 100, 51, + 99, 67, 99, 82, 98, 98, 98, 114, 66, 164, 0, 14, + 112, 32, 16, 0, 12, 11, 115, 68, 83, 83, 83, 84, + 67, 84, 67, 84, 67, 84, 67, 83, 83, 67, 104, 131, + 211, 211, 211, 211, 211, 211, 184, 0, 15, 53, 16, 0, + 12, 84, 162, 66, 114, 98, 98, 98, 83, 99, 67, 99, + 52, 100, 36, 100, 36, 100, 36, 100, 36, 100, 36, 100, + 51, 99, 67, 99, 67, 34, 34, 98, 17, 35, 131, 34, + 49, 116, 65, 161, 65, 161, 65, 162, 34, 166, 165, 195, + 240, 80, 45, 18, 0, 13, 74, 163, 52, 131, 68, 115, + 68, 115, 68, 115, 68, 115, 67, 131, 52, 135, 179, 50, + 163, 66, 147, 67, 131, 67, 131, 67, 49, 67, 67, 49, + 67, 67, 49, 67, 67, 33, 56, 52, 0, 16, 16, 40, + 13, 0, 10, 5, 33, 65, 66, 17, 50, 98, 50, 98, + 51, 97, 52, 81, 53, 150, 134, 135, 49, 69, 49, 85, + 33, 115, 34, 114, 34, 114, 35, 97, 49, 18, 66, 49, + 52, 0, 12, 39, 17, 0, 12, 111, 36, 35, 51, 35, + 51, 51, 34, 67, 66, 34, 67, 66, 34, 67, 81, 33, + 83, 81, 33, 83, 81, 131, 227, 227, 227, 227, 227, 227, + 227, 227, 200, 0, 15, 64, 42, 18, 0, 13, 71, 54, + 67, 115, 83, 129, 99, 129, 99, 129, 99, 129, 99, 129, + 99, 129, 99, 129, 99, 129, 99, 129, 99, 129, 99, 129, + 99, 129, 99, 129, 115, 97, 146, 81, 197, 0, 16, 80, + 39, 19, 0, 14, 40, 39, 68, 114, 116, 97, 132, 97, + 147, 81, 164, 65, 164, 65, 179, 49, 196, 33, 196, 33, + 211, 33, 213, 229, 244, 243, 240, 19, 240, 34, 240, 33, + 0, 17, 112, 58, 26, 0, 19, 71, 39, 38, 68, 84, + 82, 100, 84, 81, 131, 84, 81, 132, 68, 81, 132, 69, + 49, 163, 69, 49, 164, 33, 35, 49, 164, 33, 36, 17, + 195, 33, 36, 17, 197, 67, 17, 197, 69, 212, 68, 228, + 68, 227, 99, 242, 99, 242, 98, 240, 18, 113, 0, 23, + 112, 36, 18, 0, 13, 72, 22, 85, 66, 132, 65, 148, + 50, 164, 33, 180, 17, 213, 212, 244, 228, 229, 213, 193, + 36, 161, 52, 161, 68, 129, 84, 114, 85, 70, 40, 0, + 16, 34, 17, 0, 12, 103, 38, 68, 82, 100, 81, 132, + 65, 132, 65, 147, 49, 164, 33, 164, 17, 195, 17, 197, + 211, 227, 227, 227, 227, 227, 227, 199, 0, 15, 80, 35, + 15, 0, 11, 60, 51, 84, 50, 84, 66, 69, 65, 84, + 81, 69, 164, 165, 164, 165, 164, 164, 180, 81, 68, 97, + 53, 82, 52, 98, 37, 83, 45, 0, 13, 48, 28, 8, + 0, 6, 6, 35, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 86, + 240, 176, 29, 10, 0, 7, 66, 145, 146, 130, 145, 145, + 146, 130, 145, 146, 130, 145, 145, 146, 130, 145, 146, 130, + 145, 146, 130, 145, 145, 240, 112, 28, 8, 0, 6, 6, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 38, 240, 176, 22, + 12, 0, 9, 66, 162, 148, 129, 18, 114, 34, 82, 66, + 66, 66, 50, 98, 33, 114, 0, 24, 32, 9, 14, 0, + 45, 76, 44, 240, 240, 224, 10, 6, 240, 240, 98, 67, + 66, 82, 0, 16, 32, 13, 0, 19, 101, 113, 66, 83, + 51, 67, 51, 81, 67, 118, 83, 35, 67, 51, 67, 51, + 17, 35, 51, 17, 35, 51, 17, 53, 19, 0, 11, 96, + 38, 13, 0, 9, 101, 163, 163, 163, 163, 163, 163, 19, + 100, 19, 83, 50, 83, 51, 67, 51, 67, 51, 67, 51, + 67, 51, 67, 51, 67, 50, 81, 33, 19, 81, 36, 0, + 11, 112, 25, 11, 0, 16, 116, 98, 49, 66, 66, 35, + 51, 35, 51, 35, 131, 131, 131, 146, 81, 66, 49, 100, + 0, 10, 16, 37, 14, 0, 11, 21, 179, 179, 179, 179, + 179, 115, 19, 83, 36, 82, 52, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 82, 52, 83, 36, 115, + 21, 0, 12, 64, 26, 11, 0, 16, 116, 97, 50, 66, + 50, 51, 51, 35, 51, 41, 35, 131, 131, 81, 50, 81, + 66, 49, 100, 0, 10, 16, 29, 11, 0, 8, 100, 98, + 34, 67, 19, 67, 19, 67, 33, 83, 102, 115, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 102, 0, 10, 32, 37, + 14, 0, 21, 52, 35, 66, 50, 18, 51, 53, 51, 51, + 83, 51, 83, 51, 98, 50, 132, 130, 200, 105, 105, 66, + 83, 49, 130, 49, 130, 49, 129, 81, 98, 102, 240, 80, + 37, 14, 0, 10, 69, 179, 179, 179, 179, 179, 179, 35, + 101, 19, 84, 35, 83, 51, 83, 51, 83, 51, 83, 51, + 83, 51, 83, 51, 83, 51, 83, 51, 54, 21, 0, 12, + 64, 24, 7, 240, 240, 211, 67, 67, 81, 240, 52, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 53, 0, 6, + 48, 32, 9, 0, 7, 35, 99, 99, 113, 240, 133, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 50, + 19, 35, 19, 35, 19, 34, 34, 68, 208, 36, 15, 0, + 11, 37, 195, 195, 195, 195, 195, 195, 37, 83, 50, 115, + 49, 131, 33, 147, 33, 147, 18, 151, 131, 34, 131, 35, + 115, 51, 99, 51, 70, 22, 0, 13, 48, 25, 9, 0, + 6, 101, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 71, 0, 8, 16, 43, 19, + 0, 28, 68, 35, 36, 85, 20, 34, 84, 36, 35, 67, + 51, 51, 67, 51, 51, 67, 51, 51, 67, 51, 51, 67, + 51, 51, 67, 51, 51, 67, 51, 51, 67, 51, 51, 53, + 21, 21, 0, 16, 112, 31, 13, 0, 19, 68, 20, 84, + 34, 84, 35, 67, 51, 67, 51, 67, 51, 67, 51, 67, + 51, 67, 51, 67, 51, 67, 51, 53, 21, 0, 11, 80, + 29, 12, 0, 18, 52, 114, 34, 82, 66, 51, 67, 35, + 67, 35, 67, 35, 67, 35, 67, 35, 67, 50, 66, 82, + 34, 116, 0, 11, 16, 36, 13, 0, 19, 69, 19, 100, + 19, 83, 50, 83, 51, 67, 51, 67, 51, 67, 51, 67, + 51, 67, 51, 67, 50, 84, 19, 83, 19, 99, 163, 163, + 163, 163, 134, 240, 80, 36, 13, 0, 19, 115, 49, 82, + 33, 33, 66, 52, 51, 67, 51, 67, 51, 67, 51, 67, + 51, 67, 51, 67, 66, 52, 67, 36, 99, 19, 163, 163, + 163, 163, 163, 134, 240, 23, 10, 0, 15, 4, 18, 68, + 18, 51, 19, 51, 19, 51, 115, 115, 115, 115, 115, 115, + 101, 0, 9, 48, 28, 10, 0, 15, 20, 17, 50, 50, + 50, 65, 51, 49, 52, 117, 101, 49, 37, 33, 67, 34, + 66, 35, 50, 33, 36, 0, 9, 16, 29, 9, 0, 8, + 33, 129, 129, 114, 99, 86, 67, 99, 99, 99, 99, 99, + 33, 51, 33, 51, 33, 51, 33, 51, 17, 84, 0, 8, + 32, 32, 14, 0, 21, 5, 36, 83, 51, 83, 51, 83, + 51, 83, 51, 83, 51, 83, 51, 83, 51, 83, 51, 83, + 36, 83, 17, 19, 100, 20, 0, 12, 64, 26, 14, 0, + 21, 6, 36, 67, 65, 99, 65, 114, 49, 131, 33, 131, + 33, 146, 17, 164, 164, 178, 194, 193, 0, 13, 32, 38, + 20, 0, 30, 6, 21, 36, 67, 51, 65, 99, 51, 65, + 99, 52, 33, 131, 36, 33, 131, 36, 33, 146, 17, 36, + 164, 36, 163, 52, 178, 66, 194, 66, 193, 81, 0, 18, + 64, 27, 13, 0, 19, 69, 20, 67, 49, 115, 33, 115, + 17, 147, 163, 179, 164, 129, 19, 113, 51, 97, 51, 68, + 22, 0, 11, 80, 34, 14, 0, 21, 6, 36, 51, 81, + 99, 65, 99, 49, 131, 33, 131, 33, 131, 17, 164, 164, + 178, 194, 194, 209, 193, 147, 17, 147, 17, 146, 17, 178, + 240, 144, 26, 11, 0, 16, 88, 50, 35, 65, 51, 65, + 35, 131, 115, 131, 115, 49, 67, 49, 51, 65, 36, 50, + 41, 0, 9, 112, 29, 9, 0, 7, 50, 83, 83, 99, + 99, 99, 99, 99, 99, 99, 98, 82, 146, 115, 99, 99, + 99, 99, 99, 99, 99, 115, 130, 240, 80, 27, 4, 240, + 146, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 160, + 29, 9, 0, 6, 98, 131, 115, 99, 99, 99, 99, 99, + 99, 99, 114, 146, 82, 99, 99, 99, 99, 99, 99, 99, + 99, 83, 82, 240, 160, 18, 16, 0, 30, 20, 113, 56, + 81, 33, 54, 49, 33, 88, 49, 116, 0, 22, 48, 5, + 10, 0, 38, 96, 22, 6, 0, 9, 18, 52, 36, 50, + 240, 17, 82, 66, 66, 66, 66, 52, 36, 36, 36, 36, + 50, 144, 40, 11, 0, 13, 1, 161, 161, 132, 98, 17, + 17, 67, 17, 17, 51, 36, 35, 35, 51, 33, 83, 33, + 83, 33, 83, 33, 33, 50, 33, 33, 51, 17, 17, 101, + 129, 161, 161, 0, 6, 16, 36, 17, 0, 13, 85, 178, + 65, 146, 82, 115, 67, 115, 67, 115, 227, 197, 231, 164, + 227, 227, 227, 226, 113, 51, 18, 97, 49, 53, 19, 65, + 56, 99, 52, 0, 15, 80, 33, 13, 0, 14, 81, 65, + 65, 34, 21, 18, 51, 51, 66, 82, 50, 114, 34, 114, + 34, 114, 34, 114, 49, 113, 66, 82, 73, 50, 35, 34, + 0, 16, 64, 32, 15, 0, 11, 38, 52, 67, 82, 84, + 65, 115, 65, 115, 49, 132, 33, 147, 17, 165, 179, 154, + 131, 154, 131, 195, 195, 195, 195, 168, 0, 13, 80, 23, + 4, 240, 146, 34, 34, 34, 34, 34, 34, 34, 34, 240, + 50, 34, 34, 34, 34, 34, 34, 34, 34, 224, 46, 13, + 0, 10, 36, 114, 65, 82, 82, 66, 67, 66, 67, 67, + 65, 85, 150, 82, 22, 65, 69, 49, 100, 34, 114, 37, + 81, 54, 49, 72, 117, 164, 82, 51, 67, 66, 67, 66, + 66, 81, 97, 66, 116, 240, 240, 32, 13, 10, 0, 8, + 99, 35, 35, 35, 35, 35, 0, 26, 64, 61, 19, 0, + 15, 5, 194, 82, 145, 145, 113, 67, 17, 33, 81, 50, + 50, 49, 65, 50, 65, 49, 49, 51, 65, 65, 33, 51, + 65, 65, 33, 51, 145, 33, 51, 145, 33, 51, 145, 33, + 51, 65, 65, 49, 50, 65, 49, 65, 51, 33, 65, 81, + 67, 65, 113, 145, 146, 82, 197, 0, 17, 80, 21, 9, + 0, 6, 116, 65, 50, 50, 34, 99, 66, 18, 50, 34, + 50, 35, 54, 39, 0, 18, 32, 27, 9, 0, 14, 113, + 49, 50, 34, 49, 49, 50, 34, 50, 34, 50, 34, 50, + 34, 50, 49, 65, 49, 81, 49, 0, 9, 32, 14, 15, + 0, 24, 61, 45, 210, 210, 210, 210, 210, 0, 20, 112, + 10, 8, 0, 16, 6, 38, 38, 0, 12, 32, 62, 19, + 0, 15, 5, 194, 82, 145, 145, 113, 23, 49, 81, 51, + 34, 49, 65, 51, 35, 33, 49, 67, 35, 49, 33, 67, + 34, 65, 33, 69, 97, 33, 67, 34, 65, 33, 67, 35, + 49, 33, 67, 35, 49, 49, 51, 35, 18, 65, 51, 35, + 18, 81, 21, 36, 113, 145, 146, 82, 197, 0, 17, 80, + 9, 8, 0, 8, 6, 38, 0, 21, 32, 19, 10, 0, + 7, 100, 82, 34, 49, 97, 33, 97, 33, 97, 49, 66, + 54, 0, 22, 112, 40, 22, 0, 23, 18, 240, 82, 240, + 82, 240, 82, 240, 82, 240, 82, 191, 5, 47, 5, 178, + 240, 82, 240, 82, 240, 82, 240, 82, 240, 82, 240, 82, + 240, 240, 63, 5, 47, 5, 0, 14, 24, 9, 0, 6, + 117, 50, 35, 34, 35, 35, 19, 83, 82, 98, 49, 49, + 65, 39, 33, 21, 97, 0, 16, 32, 23, 10, 0, 7, + 85, 66, 51, 35, 35, 35, 35, 114, 83, 162, 66, 35, + 35, 35, 34, 50, 84, 0, 18, 11, 6, 240, 240, 130, + 51, 50, 50, 0, 16, 32, 40, 14, 0, 21, 18, 81, + 83, 67, 67, 67, 67, 67, 67, 67, 66, 83, 66, 82, + 82, 82, 33, 49, 82, 33, 49, 70, 33, 21, 20, 33, + 35, 50, 49, 210, 194, 195, 179, 179, 240, 160, 48, 14, + 0, 10, 121, 54, 18, 86, 18, 71, 18, 71, 18, 71, + 18, 71, 18, 86, 18, 101, 18, 131, 18, 146, 18, 146, + 18, 146, 18, 146, 18, 146, 18, 146, 18, 146, 18, 146, + 18, 146, 18, 146, 18, 146, 18, 0, 7, 64, 11, 6, + 0, 10, 82, 52, 36, 50, 0, 10, 16, 10, 7, 0, + 22, 17, 82, 114, 82, 36, 160, 18, 7, 240, 240, 226, + 52, 67, 67, 67, 67, 67, 67, 67, 67, 53, 0, 12, + 64, 22, 8, 0, 6, 34, 81, 33, 50, 34, 34, 34, + 34, 34, 34, 34, 49, 33, 82, 70, 0, 16, 32, 27, + 8, 0, 13, 1, 33, 81, 33, 65, 33, 66, 18, 50, + 18, 50, 18, 50, 18, 49, 34, 49, 33, 49, 33, 0, + 8, 64, 50, 20, 0, 15, 34, 130, 100, 129, 131, 114, + 131, 113, 147, 97, 163, 82, 163, 81, 179, 66, 66, 83, + 65, 67, 83, 50, 52, 69, 33, 68, 161, 65, 19, 161, + 65, 19, 145, 65, 35, 130, 72, 97, 131, 114, 131, 113, + 118, 0, 17, 112, 52, 19, 0, 14, 66, 129, 100, 129, + 115, 113, 131, 113, 131, 97, 147, 97, 147, 81, 163, 66, + 35, 83, 65, 18, 35, 51, 49, 34, 35, 37, 33, 35, + 19, 129, 99, 145, 98, 145, 97, 162, 81, 65, 97, 87, + 82, 81, 21, 81, 97, 35, 0, 17, 55, 21, 0, 15, + 117, 114, 98, 51, 81, 115, 35, 66, 194, 81, 163, 97, + 226, 65, 227, 33, 163, 35, 33, 51, 67, 35, 17, 67, + 66, 50, 18, 52, 100, 33, 68, 178, 49, 19, 177, 65, + 19, 161, 65, 35, 161, 72, 113, 131, 145, 131, 129, 118, + 0, 18, 96, 31, 10, 0, 15, 34, 116, 100, 114, 131, + 97, 49, 81, 49, 145, 129, 130, 114, 115, 33, 66, 65, + 35, 65, 35, 65, 35, 65, 51, 33, 84, 224, 48, 19, + 240, 146, 240, 35, 240, 49, 240, 65, 240, 240, 113, 240, + 50, 240, 19, 240, 19, 240, 19, 245, 225, 19, 225, 19, + 209, 36, 193, 36, 193, 51, 177, 68, 169, 161, 83, 145, + 100, 129, 100, 114, 100, 86, 41, 0, 16, 112, 47, 19, + 240, 227, 243, 240, 18, 240, 17, 240, 240, 113, 240, 50, + 240, 19, 240, 19, 240, 20, 229, 225, 19, 225, 20, 193, + 36, 193, 51, 193, 52, 161, 68, 169, 161, 84, 129, 100, + 129, 100, 114, 101, 70, 41, 0, 16, 112, 48, 19, 240, + 193, 240, 35, 242, 18, 209, 81, 240, 240, 65, 240, 50, + 240, 19, 240, 19, 240, 20, 229, 225, 19, 225, 19, 209, + 36, 193, 51, 193, 51, 177, 68, 169, 161, 83, 145, 100, + 129, 100, 114, 100, 86, 41, 0, 16, 112, 46, 19, 240, + 162, 65, 183, 193, 36, 0, 6, 81, 240, 50, 240, 19, + 240, 19, 240, 20, 229, 225, 19, 209, 36, 193, 36, 193, + 36, 177, 68, 161, 68, 169, 161, 84, 129, 100, 129, 100, + 114, 101, 70, 41, 0, 16, 112, 44, 18, 240, 115, 35, + 163, 35, 163, 35, 0, 6, 18, 240, 18, 240, 18, 244, + 228, 228, 209, 20, 193, 20, 193, 35, 177, 52, 161, 52, + 161, 67, 154, 129, 84, 129, 99, 114, 100, 98, 100, 70, + 40, 0, 16, 44, 18, 240, 163, 225, 49, 209, 49, 227, + 240, 240, 65, 240, 33, 240, 19, 243, 243, 229, 209, 19, + 209, 19, 193, 36, 177, 36, 177, 51, 161, 68, 153, 145, + 83, 129, 100, 113, 100, 98, 100, 70, 40, 0, 16, 56, + 25, 0, 19, 126, 196, 84, 196, 99, 181, 114, 177, 19, + 114, 162, 19, 65, 49, 161, 35, 65, 210, 35, 50, 209, + 51, 50, 194, 56, 193, 67, 50, 178, 67, 65, 49, 121, + 65, 49, 98, 83, 129, 97, 99, 114, 82, 99, 99, 67, + 99, 99, 39, 46, 0, 22, 16, 44, 15, 0, 11, 101, + 34, 82, 68, 66, 99, 51, 99, 51, 114, 36, 114, 36, + 114, 36, 129, 36, 180, 180, 180, 129, 36, 129, 51, 129, + 51, 113, 82, 113, 98, 66, 133, 177, 227, 226, 210, 210, + 164, 240, 112, 48, 16, 240, 67, 226, 242, 240, 17, 240, + 158, 67, 84, 67, 99, 67, 114, 67, 114, 67, 65, 49, + 67, 65, 131, 50, 131, 50, 136, 131, 50, 131, 65, 49, + 67, 65, 49, 67, 129, 67, 114, 67, 99, 67, 99, 46, + 0, 14, 32, 47, 16, 240, 147, 195, 209, 225, 240, 174, + 67, 84, 67, 99, 67, 114, 67, 114, 67, 65, 49, 67, + 65, 131, 50, 131, 50, 136, 131, 50, 131, 65, 49, 67, + 65, 49, 67, 113, 83, 114, 67, 99, 67, 99, 46, 0, + 14, 32, 49, 16, 240, 114, 212, 178, 34, 145, 97, 240, + 110, 67, 84, 67, 99, 67, 114, 67, 114, 67, 65, 49, + 67, 65, 131, 50, 131, 50, 136, 131, 50, 131, 65, 49, + 67, 65, 49, 67, 129, 67, 114, 67, 99, 67, 99, 46, + 0, 14, 32, 50, 16, 240, 67, 35, 131, 35, 131, 35, + 240, 240, 126, 67, 84, 67, 99, 67, 114, 67, 114, 67, + 65, 49, 67, 65, 131, 50, 131, 50, 136, 131, 50, 131, + 65, 49, 67, 65, 49, 67, 113, 83, 114, 67, 99, 67, + 99, 46, 0, 14, 32, 27, 9, 146, 130, 130, 129, 231, + 67, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 71, 0, 8, 16, 27, 10, 243, 99, + 113, 129, 240, 24, 67, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 88, 0, 9, 29, + 9, 193, 115, 82, 18, 49, 81, 183, 67, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 71, 0, 8, 16, 29, 10, 163, 35, 35, 35, 35, 35, + 240, 120, 67, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 88, 0, 9, 41, 18, 0, + 13, 75, 147, 83, 115, 99, 99, 115, 83, 115, 83, 115, + 83, 116, 67, 116, 40, 68, 67, 116, 67, 116, 67, 116, + 67, 115, 83, 115, 83, 115, 83, 99, 99, 83, 91, 0, + 16, 80, 54, 19, 240, 163, 240, 22, 193, 50, 0, 5, + 102, 71, 68, 99, 101, 97, 133, 81, 133, 81, 134, 65, + 129, 21, 49, 129, 36, 49, 129, 52, 33, 129, 53, 17, + 129, 68, 17, 129, 85, 129, 85, 129, 100, 129, 115, 129, + 115, 115, 114, 87, 97, 0, 17, 32, 46, 16, 65, 242, + 227, 226, 240, 17, 240, 228, 162, 66, 114, 98, 98, 98, + 83, 99, 67, 99, 52, 100, 36, 100, 36, 100, 36, 100, + 36, 100, 36, 100, 51, 99, 67, 99, 82, 98, 98, 98, + 114, 66, 164, 0, 14, 112, 45, 16, 145, 226, 211, 210, + 210, 240, 228, 162, 66, 114, 98, 98, 98, 83, 99, 67, + 99, 52, 100, 36, 100, 36, 100, 36, 100, 36, 100, 36, + 100, 51, 99, 67, 99, 82, 98, 98, 98, 114, 66, 164, + 0, 14, 112, 47, 16, 240, 114, 212, 178, 34, 146, 66, + 240, 180, 162, 66, 114, 98, 98, 98, 83, 99, 67, 99, + 52, 100, 36, 100, 36, 100, 36, 100, 36, 100, 36, 100, + 51, 99, 67, 99, 82, 98, 98, 98, 114, 66, 164, 0, + 14, 112, 46, 16, 240, 83, 214, 145, 50, 240, 240, 228, + 162, 66, 114, 98, 98, 98, 83, 99, 67, 99, 52, 100, + 36, 100, 36, 100, 36, 100, 36, 100, 36, 100, 51, 99, + 67, 99, 82, 98, 98, 98, 114, 66, 164, 0, 14, 112, + 48, 16, 240, 67, 35, 131, 35, 131, 35, 240, 240, 196, + 162, 66, 114, 98, 98, 98, 83, 99, 67, 99, 52, 100, + 36, 100, 36, 100, 36, 100, 36, 100, 36, 100, 51, 99, + 67, 99, 82, 98, 98, 98, 114, 66, 164, 0, 14, 112, + 36, 18, 0, 20, 49, 240, 19, 178, 51, 146, 83, 114, + 115, 82, 146, 66, 178, 34, 212, 242, 244, 210, 34, 178, + 66, 146, 98, 114, 130, 83, 146, 66, 178, 0, 13, 96, + 49, 16, 0, 12, 84, 65, 82, 66, 17, 82, 99, 82, + 98, 83, 99, 67, 84, 52, 70, 36, 65, 20, 36, 49, + 36, 36, 33, 52, 36, 17, 68, 38, 68, 52, 83, 67, + 99, 82, 98, 83, 98, 81, 18, 66, 81, 68, 0, 14, + 112, 50, 18, 82, 240, 18, 240, 34, 240, 34, 240, 33, + 240, 199, 54, 67, 115, 83, 129, 99, 129, 99, 129, 99, + 129, 99, 129, 99, 129, 99, 129, 99, 129, 99, 129, 99, + 129, 99, 129, 99, 129, 99, 129, 115, 97, 146, 81, 197, + 0, 16, 80, 46, 18, 162, 243, 242, 242, 240, 240, 231, + 54, 67, 115, 83, 129, 99, 129, 99, 129, 99, 129, 99, + 129, 99, 129, 99, 129, 99, 129, 99, 129, 99, 129, 99, + 129, 99, 129, 99, 129, 115, 97, 146, 81, 197, 0, 16, + 80, 49, 18, 129, 240, 18, 244, 210, 49, 177, 240, 240, + 23, 54, 67, 115, 83, 129, 99, 129, 99, 129, 99, 129, + 99, 129, 99, 129, 99, 129, 99, 129, 99, 129, 99, 129, + 99, 129, 99, 129, 99, 129, 115, 97, 146, 81, 197, 0, + 16, 80, 49, 18, 240, 131, 35, 163, 35, 163, 35, 240, + 240, 184, 53, 67, 130, 83, 129, 99, 129, 99, 129, 99, + 129, 99, 129, 99, 129, 99, 129, 99, 129, 99, 129, 99, + 129, 99, 129, 99, 129, 99, 129, 115, 97, 146, 81, 197, + 0, 16, 80, 38, 18, 240, 195, 242, 242, 241, 240, 215, + 39, 68, 82, 116, 82, 132, 65, 148, 65, 163, 49, 180, + 33, 180, 33, 195, 17, 213, 227, 243, 243, 243, 243, 243, + 243, 215, 0, 16, 80, 32, 16, 0, 12, 8, 163, 211, + 216, 131, 67, 99, 83, 83, 84, 67, 84, 67, 84, 67, + 84, 67, 83, 83, 67, 104, 131, 211, 211, 211, 184, 0, + 15, 43, 14, 0, 11, 20, 146, 34, 114, 51, 83, 51, + 83, 51, 83, 51, 83, 50, 99, 18, 131, 50, 99, 66, + 83, 67, 67, 67, 67, 67, 67, 67, 67, 17, 35, 70, + 19, 69, 34, 53, 20, 0, 12, 96, 38, 13, 0, 9, + 114, 179, 178, 194, 194, 240, 117, 113, 66, 83, 51, 67, + 51, 148, 114, 19, 82, 51, 67, 51, 67, 51, 17, 35, + 51, 17, 35, 51, 17, 53, 19, 0, 11, 96, 38, 13, + 0, 10, 66, 163, 147, 162, 161, 240, 149, 113, 66, 83, + 51, 67, 51, 81, 67, 118, 83, 35, 67, 51, 67, 51, + 17, 35, 51, 17, 35, 51, 17, 53, 19, 0, 11, 96, + 40, 13, 0, 10, 19, 163, 148, 130, 49, 113, 81, 240, + 85, 113, 66, 83, 51, 67, 51, 81, 67, 118, 83, 35, + 67, 51, 67, 51, 17, 35, 51, 17, 35, 51, 17, 53, + 19, 0, 11, 96, 38, 13, 0, 11, 68, 151, 81, 66, + 240, 240, 69, 113, 66, 83, 51, 67, 51, 81, 67, 118, + 83, 35, 67, 51, 67, 51, 17, 35, 51, 17, 35, 51, + 17, 53, 19, 0, 11, 96, 40, 13, 0, 11, 51, 35, + 83, 35, 83, 35, 240, 240, 53, 113, 66, 83, 51, 67, + 51, 81, 67, 118, 83, 35, 67, 51, 67, 51, 17, 35, + 51, 17, 35, 51, 17, 53, 19, 0, 11, 96, 41, 13, + 0, 10, 19, 145, 49, 129, 49, 129, 49, 147, 240, 117, + 114, 50, 83, 51, 67, 51, 81, 67, 118, 83, 35, 67, + 51, 67, 51, 17, 35, 51, 17, 35, 51, 17, 53, 19, + 0, 11, 96, 37, 17, 0, 25, 101, 21, 66, 67, 50, + 51, 51, 50, 51, 51, 51, 116, 51, 82, 25, 50, 51, + 131, 51, 131, 51, 81, 35, 51, 81, 35, 52, 49, 69, + 52, 0, 15, 48, 30, 11, 0, 16, 116, 98, 49, 66, + 66, 35, 51, 35, 51, 35, 131, 131, 131, 146, 81, 66, + 49, 100, 129, 161, 178, 146, 146, 115, 240, 16, 32, 11, + 0, 8, 50, 147, 146, 162, 162, 240, 68, 97, 50, 66, + 50, 51, 51, 35, 51, 41, 35, 131, 131, 81, 50, 81, + 66, 49, 100, 0, 10, 16, 32, 11, 0, 9, 2, 131, + 130, 130, 130, 240, 84, 97, 50, 66, 50, 51, 51, 35, + 51, 41, 35, 131, 131, 81, 50, 81, 66, 49, 100, 0, + 10, 16, 35, 11, 0, 8, 97, 147, 129, 17, 113, 49, + 81, 81, 240, 36, 97, 50, 66, 50, 51, 51, 35, 51, + 41, 35, 131, 131, 81, 50, 81, 66, 49, 100, 0, 10, + 16, 33, 11, 0, 9, 99, 19, 67, 19, 67, 19, 240, + 212, 97, 50, 66, 50, 51, 51, 35, 51, 41, 35, 131, + 131, 81, 50, 66, 66, 49, 100, 0, 10, 16, 24, 8, + 0, 6, 2, 99, 98, 114, 240, 100, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 69, 0, 7, 32, 24, 7, + 0, 5, 97, 82, 67, 65, 240, 52, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 53, 0, 6, 48, 26, 9, + 0, 7, 2, 115, 82, 17, 66, 49, 145, 196, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 85, 0, 8, 32, + 26, 9, 0, 7, 115, 19, 35, 19, 35, 19, 240, 100, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 85, 0, + 8, 32, 36, 12, 0, 9, 35, 34, 100, 147, 132, 163, + 163, 102, 82, 35, 66, 67, 35, 67, 35, 67, 35, 67, + 35, 67, 35, 67, 35, 67, 50, 66, 82, 34, 116, 0, + 11, 16, 38, 13, 0, 11, 98, 49, 103, 97, 35, 240, + 240, 20, 20, 84, 34, 84, 35, 67, 51, 67, 51, 67, + 51, 67, 51, 67, 51, 67, 51, 67, 51, 67, 51, 53, + 21, 0, 11, 80, 35, 12, 0, 9, 34, 162, 178, 178, + 177, 240, 100, 114, 34, 82, 66, 51, 67, 35, 67, 35, + 67, 35, 67, 35, 67, 35, 67, 50, 66, 82, 34, 116, + 0, 11, 16, 35, 12, 0, 9, 98, 162, 147, 130, 161, + 240, 116, 114, 34, 82, 66, 51, 67, 35, 67, 35, 67, + 35, 67, 35, 67, 35, 67, 50, 66, 82, 34, 116, 0, + 11, 16, 37, 12, 0, 9, 66, 162, 148, 114, 34, 81, + 97, 240, 52, 114, 34, 82, 66, 51, 67, 35, 67, 35, + 67, 35, 67, 35, 67, 35, 67, 50, 66, 82, 34, 116, + 0, 11, 16, 36, 12, 0, 10, 99, 49, 86, 81, 50, + 240, 240, 36, 114, 34, 82, 66, 51, 67, 35, 67, 35, + 67, 35, 67, 35, 67, 35, 67, 50, 66, 82, 34, 116, + 0, 11, 16, 36, 12, 0, 10, 83, 35, 67, 35, 67, + 35, 240, 244, 114, 34, 82, 66, 51, 67, 35, 67, 35, + 67, 35, 67, 35, 67, 35, 67, 50, 66, 82, 34, 116, + 0, 11, 16, 29, 23, 0, 27, 2, 240, 84, 240, 68, + 240, 82, 0, 13, 15, 6, 47, 6, 0, 10, 2, 240, + 84, 240, 68, 240, 82, 0, 15, 112, 33, 12, 0, 18, + 52, 33, 66, 35, 66, 51, 51, 52, 35, 52, 35, 33, + 19, 35, 17, 35, 36, 51, 36, 51, 51, 50, 67, 34, + 65, 36, 0, 11, 16, 38, 14, 0, 10, 114, 194, 210, + 210, 209, 240, 101, 36, 83, 51, 83, 51, 83, 51, 83, + 51, 83, 51, 83, 51, 83, 51, 83, 51, 83, 36, 83, + 17, 19, 100, 20, 0, 12, 64, 38, 14, 0, 11, 50, + 194, 178, 193, 193, 240, 117, 36, 83, 51, 83, 51, 83, + 51, 83, 51, 83, 51, 83, 51, 83, 51, 83, 51, 83, + 36, 83, 17, 19, 100, 20, 0, 12, 64, 39, 14, 0, + 11, 18, 194, 180, 146, 34, 240, 240, 53, 36, 83, 51, + 83, 51, 83, 51, 83, 51, 83, 51, 83, 51, 83, 51, + 83, 51, 83, 36, 83, 17, 19, 100, 20, 0, 12, 64, + 40, 14, 0, 12, 67, 35, 99, 35, 99, 35, 240, 240, + 37, 36, 83, 51, 83, 51, 83, 51, 83, 51, 83, 51, + 83, 51, 83, 51, 83, 51, 83, 36, 83, 17, 19, 100, + 20, 0, 12, 64, 40, 14, 0, 11, 50, 194, 178, 178, + 193, 240, 118, 36, 51, 81, 99, 65, 99, 49, 131, 33, + 131, 33, 131, 17, 164, 164, 178, 194, 194, 209, 193, 147, + 17, 147, 17, 146, 17, 179, 240, 128, 40, 13, 0, 11, + 98, 148, 163, 163, 163, 163, 35, 85, 19, 68, 35, 67, + 51, 67, 51, 67, 51, 67, 50, 83, 34, 99, 34, 99, + 33, 115, 17, 132, 147, 163, 163, 163, 161, 162, 240, 144, + 41, 14, 0, 12, 67, 35, 99, 35, 99, 35, 240, 240, + 38, 36, 51, 81, 99, 65, 99, 49, 131, 33, 131, 33, + 133, 164, 164, 178, 194, 194, 209, 193, 147, 17, 147, 17, + 146, 17, 178, 240, 144, +}; + +//***************************************************************************** +// +// The glyph offset table for the 24 point Oldstandard bold font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard24b[] = +{ + 0, 5, 29, 44, 83, 147, 205, 252, + 264, 293, 322, 348, 394, 408, 418, 429, + 458, 499, 524, 560, 594, 626, 662, 700, + 733, 771, 810, 826, 845, 885, 902, 943, + 975, 1039, 1079, 1119, 1158, 1199, 1242, 1279, + 1323, 1364, 1389, 1420, 1460, 1492, 1556, 1604, + 1645, 1677, 1730, 1775, 1815, 1854, 1896, 1935, + 1993, 2029, 2063, 2098, 2126, 2155, 2183, 2205, + 2214, 2224, 2256, 2294, 2319, 2356, 2382, 2411, + 2448, 2485, 2509, 2541, 2577, 2602, 2645, 2676, + 2705, 2741, 2777, 2800, 2828, 2857, 2889, 2915, + 2953, 2980, 3014, 3040, 3069, 3096, 3125, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3143, 3148, 3170, 3210, 3246, 3279, 3311, 3334, + 3380, 3393, 3454, 3475, 3502, 3516, 3526, 3588, + 3597, 3616, 3656, 3680, 3703, 3714, 3754, 3802, + 3813, 3823, 3841, 3863, 3890, 3940, 3992, 4047, + 4078, 4126, 4173, 4221, 4267, 4311, 4355, 4411, + 4455, 4503, 4550, 4599, 4649, 4676, 4703, 4732, + 4761, 4802, 4856, 4902, 4947, 4994, 5040, 5088, + 5124, 5173, 5223, 5269, 5318, 5367, 5405, 5437, + 5480, 5518, 5556, 5596, 5634, 5674, 5715, 5752, + 5782, 5814, 5846, 5881, 5914, 5938, 5962, 5988, + 6014, 6050, 6088, 6123, 6158, 6195, 6231, 6267, + 6296, 6329, 6367, 6405, 6444, 6484, 6524, 6564, +}; + +//***************************************************************************** +// +// The font definition for the 24 point Oldstandard bold font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard24b = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 23, + + // + // The height of the font. + // + 31, + + // + // The baseline of the font. + // + 24, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard24b, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard24bData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard24i.c b/third_party/fonts/ofl/fonts/fontoldstandard24i.c new file mode 100644 index 0000000..27253f3 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard24i.c @@ -0,0 +1,768 @@ +//***************************************************************************** +// +// fontoldstandard24i.c - Font definition for the 24pt Oldstandard italic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 24 point +// Bold: no +// Italic: yes +// Memory usage: 6800 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 24 point Oldstandard italic font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard24iData[6600] = +{ + 5, 10, 0, 37, 64, 24, 9, 0, 7, 35, 99, 99, + 98, 99, 99, 98, 114, 113, 129, 129, 113, 129, 240, 18, + 99, 114, 0, 8, 80, 17, 8, 0, 6, 17, 49, 49, + 34, 34, 33, 49, 49, 49, 49, 0, 19, 48, 39, 17, + 0, 13, 97, 50, 177, 49, 177, 65, 177, 49, 177, 65, + 125, 129, 49, 177, 65, 177, 49, 177, 65, 177, 49, 141, + 113, 50, 177, 49, 177, 65, 177, 49, 177, 65, 0, 16, + 16, 65, 15, 0, 8, 65, 17, 177, 33, 165, 130, 17, + 17, 17, 98, 33, 17, 33, 81, 33, 17, 49, 81, 33, + 17, 19, 82, 17, 17, 19, 84, 17, 164, 197, 161, 20, + 129, 33, 18, 82, 17, 17, 34, 67, 17, 17, 34, 65, + 49, 17, 34, 65, 33, 17, 49, 97, 17, 17, 33, 134, + 161, 17, 177, 0, 10, 112, 54, 18, 0, 13, 115, 129, + 81, 49, 82, 81, 71, 82, 65, 66, 82, 65, 50, 98, + 49, 65, 114, 33, 65, 147, 65, 240, 17, 67, 146, 49, + 49, 129, 50, 49, 113, 65, 65, 97, 66, 65, 81, 82, + 65, 66, 82, 49, 81, 98, 33, 81, 131, 0, 16, 48, + 50, 19, 0, 15, 83, 226, 33, 225, 49, 210, 49, 209, + 49, 225, 33, 228, 51, 114, 17, 65, 33, 82, 49, 49, + 34, 66, 65, 49, 114, 81, 33, 130, 81, 17, 131, 82, + 147, 81, 81, 67, 81, 65, 98, 52, 33, 132, 51, 0, + 17, 64, 11, 4, 240, 161, 49, 34, 33, 49, 0, 9, + 112, 28, 10, 0, 8, 49, 129, 129, 129, 130, 129, 129, + 145, 129, 145, 145, 129, 145, 145, 145, 145, 145, 145, 161, + 145, 161, 145, 240, 192, 28, 10, 0, 8, 33, 145, 161, + 145, 145, 145, 145, 145, 145, 145, 145, 130, 129, 145, 129, + 145, 129, 129, 130, 114, 114, 240, 240, 128, 25, 11, 0, + 8, 82, 146, 98, 33, 34, 35, 17, 18, 99, 113, 18, + 82, 33, 19, 34, 33, 33, 98, 161, 0, 20, 44, 23, + 0, 18, 65, 240, 113, 240, 113, 240, 113, 240, 113, 240, + 113, 240, 113, 240, 113, 240, 113, 240, 113, 207, 6, 193, + 240, 113, 240, 113, 240, 113, 240, 113, 240, 113, 240, 113, + 240, 113, 240, 113, 0, 13, 13, 5, 0, 12, 2, 35, + 50, 65, 65, 49, 65, 240, 128, 9, 9, 0, 18, 22, + 33, 0, 14, 64, 10, 5, 0, 12, 82, 35, 50, 240, + 240, 112, 29, 10, 0, 8, 49, 129, 145, 145, 129, 145, + 145, 129, 145, 145, 129, 145, 145, 129, 145, 145, 145, 129, + 145, 145, 129, 145, 145, 240, 64, 39, 13, 0, 10, 52, + 130, 49, 98, 66, 66, 82, 51, 82, 50, 98, 35, 98, + 35, 98, 34, 114, 34, 99, 34, 99, 34, 98, 50, 83, + 50, 82, 66, 66, 97, 50, 132, 0, 12, 32, 24, 12, + 0, 10, 17, 161, 162, 117, 147, 146, 162, 162, 147, 146, + 162, 162, 147, 146, 162, 162, 105, 0, 10, 112, 33, 15, + 0, 12, 4, 146, 51, 97, 98, 97, 99, 81, 99, 83, + 66, 99, 51, 194, 194, 178, 178, 193, 194, 210, 97, 81, + 39, 81, 53, 97, 67, 0, 14, 34, 14, 0, 11, 36, + 130, 66, 97, 82, 83, 66, 98, 66, 194, 178, 117, 145, + 50, 194, 195, 81, 83, 67, 67, 52, 66, 65, 99, 81, + 67, 117, 0, 13, 16, 30, 13, 0, 10, 114, 162, 178, + 162, 162, 177, 17, 145, 18, 129, 19, 113, 34, 98, 50, + 81, 67, 91, 114, 178, 163, 162, 136, 0, 11, 112, 33, + 15, 0, 11, 113, 97, 115, 49, 134, 145, 209, 225, 229, + 146, 50, 114, 82, 97, 98, 210, 210, 83, 67, 68, 66, + 97, 83, 97, 67, 133, 0, 14, 16, 38, 13, 0, 10, + 68, 114, 65, 82, 66, 82, 51, 66, 178, 162, 35, 98, + 17, 34, 83, 66, 51, 82, 51, 82, 50, 98, 50, 98, + 50, 82, 81, 82, 82, 50, 116, 0, 12, 32, 29, 13, + 0, 10, 1, 19, 49, 70, 33, 50, 53, 49, 83, 177, + 177, 178, 177, 177, 177, 178, 162, 178, 163, 163, 148, 162, + 0, 12, 80, 38, 14, 0, 11, 21, 129, 81, 97, 98, + 81, 113, 66, 113, 66, 98, 82, 81, 100, 33, 118, 98, + 51, 81, 98, 81, 114, 65, 114, 65, 113, 81, 113, 97, + 81, 133, 0, 13, 16, 37, 13, 0, 10, 52, 114, 50, + 82, 82, 66, 82, 50, 98, 50, 98, 50, 83, 50, 83, + 66, 52, 84, 18, 178, 178, 66, 66, 67, 66, 66, 66, + 81, 66, 116, 0, 12, 48, 15, 8, 0, 12, 50, 99, + 82, 240, 240, 226, 83, 98, 0, 7, 80, 19, 8, 0, + 12, 50, 99, 82, 240, 240, 226, 83, 98, 113, 113, 97, + 97, 240, 240, 16, 44, 20, 0, 19, 66, 240, 19, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 19, 240, 18, 240, 66, 240, 82, 240, 82, 240, 82, 240, + 67, 240, 66, 240, 82, 240, 82, 240, 82, 0, 10, 32, + 13, 23, 0, 37, 63, 6, 0, 11, 111, 6, 0, 31, + 112, 46, 21, 0, 18, 50, 240, 98, 240, 98, 240, 98, + 240, 98, 240, 83, 240, 82, 240, 98, 240, 98, 240, 98, + 240, 35, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 35, 240, 34, 240, 49, 0, 10, 48, 31, + 11, 0, 8, 84, 82, 50, 65, 82, 34, 82, 49, 82, + 130, 130, 115, 99, 129, 33, 97, 49, 97, 49, 115, 240, + 50, 147, 130, 0, 10, 96, 62, 20, 0, 15, 102, 194, + 98, 145, 82, 19, 113, 66, 35, 17, 82, 49, 66, 49, + 65, 50, 66, 49, 65, 50, 66, 49, 50, 34, 82, 49, + 49, 50, 81, 66, 33, 50, 66, 65, 50, 34, 66, 65, + 65, 34, 51, 49, 81, 49, 33, 18, 49, 97, 50, 52, + 114, 240, 81, 129, 184, 0, 18, 48, 37, 19, 0, 18, + 33, 240, 34, 240, 19, 240, 19, 241, 18, 225, 34, 225, + 34, 209, 50, 193, 66, 199, 177, 82, 161, 98, 161, 98, + 145, 114, 130, 114, 87, 55, 0, 16, 112, 38, 19, 0, + 14, 107, 163, 82, 146, 114, 130, 114, 130, 99, 114, 114, + 130, 98, 152, 178, 82, 146, 114, 130, 114, 130, 114, 115, + 114, 114, 130, 114, 114, 130, 98, 107, 0, 17, 80, 34, + 17, 0, 13, 85, 33, 114, 67, 114, 98, 98, 114, 82, + 145, 82, 145, 66, 242, 227, 227, 227, 227, 145, 67, 129, + 98, 114, 98, 113, 129, 82, 165, 0, 16, 39, 19, 0, + 14, 106, 179, 82, 146, 114, 130, 114, 130, 114, 115, 114, + 114, 130, 114, 130, 114, 130, 98, 146, 98, 131, 98, 130, + 99, 114, 114, 130, 114, 114, 130, 98, 107, 0, 17, 80, + 40, 20, 0, 15, 78, 131, 98, 146, 129, 146, 129, 146, + 129, 131, 65, 49, 130, 81, 194, 65, 215, 195, 50, 194, + 65, 210, 65, 65, 115, 129, 130, 145, 130, 130, 130, 114, + 110, 0, 18, 32, 37, 20, 0, 15, 78, 131, 98, 146, + 129, 146, 129, 146, 129, 131, 65, 49, 130, 65, 210, 65, + 215, 195, 50, 194, 65, 210, 65, 195, 240, 34, 240, 50, + 240, 50, 248, 0, 19, 42, 17, 0, 13, 85, 162, 81, + 17, 98, 114, 82, 130, 66, 145, 82, 145, 66, 161, 66, + 227, 87, 35, 130, 67, 130, 67, 115, 67, 114, 98, 99, + 98, 97, 17, 113, 81, 33, 133, 49, 0, 15, 64, 40, + 23, 0, 17, 103, 55, 131, 114, 178, 130, 178, 115, 178, + 114, 179, 114, 178, 130, 178, 115, 187, 179, 114, 178, 130, + 178, 115, 163, 114, 178, 130, 178, 115, 178, 114, 151, 40, + 0, 20, 112, 24, 13, 0, 10, 39, 131, 162, 178, 178, + 163, 162, 178, 178, 162, 178, 178, 163, 162, 178, 178, 135, + 0, 12, 16, 29, 17, 0, 13, 88, 195, 226, 242, 227, + 226, 242, 242, 227, 226, 242, 131, 51, 131, 50, 132, 50, + 130, 66, 161, 65, 196, 0, 16, 32, 42, 22, 0, 17, + 7, 54, 131, 99, 162, 113, 194, 82, 210, 65, 227, 49, + 242, 34, 240, 18, 19, 240, 19, 18, 243, 50, 226, 66, + 226, 66, 211, 82, 194, 98, 194, 98, 194, 99, 135, 39, + 0, 20, 35, 18, 0, 14, 7, 211, 242, 240, 18, 240, + 18, 243, 242, 240, 18, 240, 18, 242, 240, 18, 240, 18, + 145, 83, 129, 98, 145, 98, 130, 98, 114, 78, 0, 16, + 32, 67, 25, 0, 19, 38, 118, 147, 115, 177, 18, 97, + 18, 177, 18, 97, 18, 177, 18, 81, 19, 177, 18, 65, + 34, 177, 34, 65, 34, 177, 34, 49, 50, 177, 34, 49, + 35, 161, 50, 33, 50, 177, 50, 33, 50, 177, 50, 17, + 66, 177, 50, 17, 50, 177, 67, 66, 177, 66, 82, 177, + 66, 67, 134, 33, 55, 0, 22, 80, 51, 23, 0, 17, + 101, 102, 146, 129, 180, 113, 177, 18, 113, 177, 18, 97, + 193, 34, 81, 177, 50, 81, 177, 50, 65, 193, 66, 49, + 177, 82, 49, 177, 83, 33, 177, 98, 17, 193, 98, 17, + 177, 131, 177, 130, 193, 130, 150, 113, 0, 21, 32, 38, + 16, 0, 12, 116, 162, 66, 114, 98, 82, 114, 66, 130, + 66, 130, 50, 146, 50, 146, 35, 146, 35, 146, 35, 131, + 35, 130, 51, 115, 66, 114, 82, 98, 114, 66, 149, 0, + 15, 36, 19, 0, 14, 107, 163, 82, 146, 98, 146, 99, + 130, 98, 131, 98, 130, 98, 146, 82, 167, 178, 240, 34, + 240, 34, 240, 19, 240, 18, 240, 34, 240, 34, 232, 0, + 18, 49, 16, 0, 12, 116, 162, 66, 114, 98, 82, 114, + 66, 130, 66, 130, 50, 146, 50, 146, 35, 146, 35, 146, + 35, 131, 35, 130, 51, 19, 51, 67, 33, 50, 83, 49, + 18, 114, 36, 149, 226, 49, 162, 33, 178, 33, 195, 0, + 6, 96, 41, 18, 0, 14, 10, 163, 66, 146, 98, 130, + 98, 130, 98, 114, 99, 114, 83, 136, 162, 65, 162, 97, + 146, 98, 130, 83, 115, 83, 114, 98, 130, 98, 33, 82, + 98, 18, 40, 67, 0, 16, 16, 38, 16, 0, 12, 101, + 33, 98, 68, 97, 98, 98, 113, 98, 113, 98, 113, 115, + 212, 213, 212, 97, 115, 81, 130, 81, 145, 82, 129, 67, + 114, 65, 34, 81, 81, 54, 0, 14, 96, 33, 17, 0, + 13, 13, 51, 50, 51, 49, 67, 65, 65, 66, 81, 49, + 82, 81, 49, 82, 81, 131, 226, 242, 242, 227, 226, 242, + 227, 226, 242, 200, 0, 16, 40, 20, 0, 15, 23, 70, + 82, 145, 130, 145, 115, 129, 130, 145, 130, 145, 130, 145, + 115, 129, 130, 145, 130, 145, 115, 129, 130, 145, 130, 145, + 130, 129, 161, 129, 162, 97, 214, 0, 18, 112, 40, 19, + 0, 14, 40, 39, 82, 114, 130, 113, 146, 113, 146, 97, + 162, 81, 178, 81, 178, 65, 194, 49, 210, 49, 210, 33, + 226, 17, 242, 17, 243, 240, 18, 240, 34, 240, 33, 0, + 18, 64, 63, 27, 0, 20, 40, 23, 39, 82, 114, 98, + 130, 99, 98, 130, 99, 97, 146, 99, 81, 162, 81, 18, + 81, 162, 65, 34, 65, 178, 65, 34, 49, 194, 49, 50, + 49, 194, 33, 66, 33, 210, 33, 66, 17, 226, 17, 82, + 17, 227, 99, 243, 98, 240, 18, 114, 240, 17, 129, 240, + 33, 129, 0, 25, 48, 46, 23, 0, 17, 103, 55, 146, + 114, 195, 97, 226, 81, 242, 65, 240, 34, 33, 240, 50, + 17, 240, 67, 240, 98, 240, 84, 240, 50, 18, 240, 34, + 35, 240, 17, 66, 241, 83, 209, 114, 194, 114, 136, 40, + 0, 20, 96, 38, 19, 0, 14, 39, 55, 82, 114, 130, + 113, 146, 97, 163, 65, 194, 49, 210, 33, 226, 17, 243, + 240, 34, 240, 19, 240, 18, 240, 34, 240, 19, 240, 18, + 240, 34, 232, 0, 18, 32, 17, 0, 13, 43, 83, 98, + 97, 115, 81, 115, 97, 99, 226, 226, 227, 211, 211, 226, + 227, 211, 113, 83, 114, 67, 129, 82, 130, 77, 0, 15, + 48, 29, 12, 0, 9, 85, 114, 162, 161, 162, 162, 161, + 162, 162, 162, 161, 162, 162, 162, 161, 162, 162, 161, 162, + 162, 162, 165, 240, 240, 16, 28, 10, 0, 7, 65, 145, + 145, 161, 145, 145, 161, 145, 145, 161, 145, 145, 161, 145, + 145, 161, 145, 145, 161, 145, 145, 161, 145, 192, 29, 13, + 0, 10, 69, 177, 178, 178, 178, 177, 178, 178, 178, 177, + 178, 178, 177, 178, 178, 178, 177, 178, 178, 178, 177, 133, + 240, 240, 64, 23, 13, 0, 10, 49, 193, 177, 17, 161, + 18, 129, 49, 113, 81, 97, 81, 81, 113, 50, 129, 0, + 24, 80, 8, 15, 0, 48, 109, 0, 5, 112, 11, 5, + 240, 240, 82, 50, 65, 81, 0, 12, 16, 33, 13, 0, + 20, 3, 18, 97, 51, 81, 66, 82, 66, 82, 66, 66, + 82, 66, 66, 82, 66, 33, 34, 51, 17, 50, 33, 18, + 17, 67, 50, 0, 11, 112, 34, 11, 0, 8, 37, 145, + 161, 146, 146, 145, 146, 20, 67, 49, 66, 66, 50, 66, + 34, 82, 34, 66, 50, 66, 49, 81, 65, 66, 65, 50, + 100, 0, 10, 48, 24, 10, 0, 15, 67, 97, 49, 66, + 34, 50, 50, 50, 114, 130, 130, 81, 34, 65, 65, 49, + 99, 0, 9, 48, 39, 14, 0, 11, 53, 193, 194, 194, + 194, 193, 131, 18, 113, 51, 97, 66, 98, 66, 98, 66, + 82, 82, 82, 66, 98, 66, 33, 50, 51, 17, 66, 33, + 18, 17, 83, 50, 0, 12, 112, 25, 10, 0, 15, 68, + 81, 49, 65, 65, 50, 50, 50, 33, 69, 82, 130, 81, + 34, 65, 65, 49, 99, 0, 9, 48, 31, 14, 0, 11, + 68, 145, 49, 129, 50, 114, 194, 193, 167, 146, 193, 209, + 194, 194, 193, 194, 194, 194, 193, 194, 194, 194, 193, 194, + 194, 240, 176, 38, 13, 0, 20, 19, 18, 97, 51, 81, + 66, 82, 66, 82, 66, 66, 82, 66, 66, 82, 66, 82, + 51, 82, 33, 18, 99, 33, 178, 178, 82, 65, 98, 50, + 97, 50, 131, 240, 112, 40, 13, 0, 9, 117, 177, 193, + 178, 178, 177, 178, 35, 98, 17, 33, 97, 17, 49, 98, + 50, 83, 50, 82, 50, 98, 50, 33, 49, 66, 17, 50, + 65, 33, 50, 65, 17, 65, 82, 0, 12, 28, 9, 0, + 7, 34, 115, 240, 240, 162, 97, 33, 65, 34, 65, 34, + 114, 98, 114, 98, 33, 66, 33, 66, 17, 98, 0, 8, + 64, 34, 12, 0, 10, 2, 162, 0, 7, 2, 145, 18, + 113, 34, 97, 49, 113, 49, 162, 162, 161, 162, 162, 162, + 161, 162, 113, 34, 98, 33, 113, 33, 131, 240, 96, 39, + 12, 0, 9, 21, 161, 177, 162, 162, 161, 162, 51, 66, + 33, 18, 65, 49, 17, 81, 33, 116, 130, 34, 97, 50, + 33, 49, 50, 17, 50, 49, 33, 50, 49, 17, 65, 67, + 0, 11, 27, 8, 0, 6, 21, 97, 113, 98, 98, 97, + 98, 98, 97, 113, 98, 98, 97, 98, 33, 50, 17, 66, + 17, 82, 0, 7, 80, 50, 20, 0, 30, 34, 51, 51, + 81, 18, 17, 33, 33, 33, 65, 35, 49, 17, 49, 65, + 35, 50, 50, 114, 51, 50, 99, 50, 65, 114, 66, 50, + 33, 66, 65, 66, 17, 81, 66, 65, 33, 66, 66, 65, + 17, 82, 65, 82, 0, 18, 16, 36, 14, 0, 21, 34, + 66, 81, 18, 18, 18, 49, 35, 50, 49, 35, 50, 98, + 50, 99, 50, 98, 50, 114, 50, 33, 65, 66, 17, 66, + 65, 33, 66, 82, 0, 12, 96, 27, 11, 0, 17, 4, + 97, 50, 66, 50, 50, 66, 50, 66, 34, 82, 34, 82, + 34, 66, 50, 66, 65, 50, 99, 0, 10, 48, 37, 16, + 0, 24, 82, 51, 113, 20, 34, 81, 35, 50, 81, 34, + 66, 130, 66, 114, 82, 114, 66, 130, 66, 130, 65, 131, + 50, 130, 19, 161, 241, 226, 226, 225, 200, 240, 144, 36, + 12, 0, 18, 67, 33, 81, 49, 17, 65, 66, 66, 66, + 66, 66, 50, 82, 50, 66, 66, 66, 66, 51, 66, 33, + 18, 83, 33, 162, 162, 162, 161, 162, 119, 240, 16, 26, + 13, 0, 19, 114, 50, 81, 18, 17, 18, 49, 35, 18, + 65, 34, 113, 50, 163, 162, 178, 177, 178, 178, 0, 12, + 64, 24, 11, 0, 17, 3, 98, 49, 81, 66, 65, 50, + 82, 163, 147, 66, 50, 65, 81, 65, 65, 100, 0, 10, + 48, 27, 9, 0, 7, 33, 129, 114, 114, 113, 129, 102, + 66, 113, 114, 114, 114, 113, 114, 33, 66, 33, 66, 17, + 98, 0, 8, 80, 38, 14, 0, 21, 34, 82, 65, 33, + 66, 49, 34, 65, 65, 34, 50, 114, 50, 98, 51, 98, + 33, 17, 98, 51, 33, 50, 33, 18, 17, 66, 17, 34, + 17, 82, 66, 0, 12, 96, 31, 12, 0, 18, 34, 50, + 65, 33, 35, 33, 34, 50, 33, 34, 65, 82, 65, 66, + 65, 82, 65, 66, 65, 82, 65, 82, 49, 116, 0, 11, + 32, 43, 18, 0, 27, 34, 82, 34, 65, 33, 66, 35, + 33, 34, 65, 66, 33, 34, 50, 81, 82, 50, 65, 82, + 66, 65, 82, 50, 81, 66, 66, 65, 82, 51, 65, 82, + 33, 18, 49, 115, 52, 0, 16, 64, 31, 14, 0, 21, + 51, 51, 65, 51, 18, 49, 66, 34, 129, 49, 130, 194, + 193, 194, 65, 50, 34, 65, 49, 33, 17, 49, 67, 51, + 0, 12, 112, 41, 13, 0, 19, 98, 82, 49, 33, 66, + 33, 34, 65, 49, 34, 50, 98, 50, 82, 66, 82, 50, + 82, 66, 82, 51, 82, 33, 18, 99, 33, 178, 178, 82, + 65, 98, 50, 97, 50, 131, 240, 112, 25, 11, 0, 16, + 114, 34, 68, 33, 49, 51, 161, 130, 114, 129, 130, 81, + 50, 81, 49, 21, 65, 35, 0, 10, 32, 28, 9, 0, + 7, 65, 98, 113, 114, 114, 114, 114, 114, 113, 113, 98, + 145, 129, 129, 114, 113, 114, 113, 129, 129, 129, 145, 240, + 160, 26, 4, 240, 146, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 160, 29, 11, 0, 9, 17, 161, 162, 145, 146, + 146, 130, 146, 145, 161, 178, 129, 145, 146, 146, 146, 146, + 146, 145, 161, 130, 129, 240, 240, 32, 16, 16, 0, 30, + 21, 97, 71, 81, 33, 70, 33, 49, 101, 0, 22, 48, + 5, 10, 0, 37, 64, 21, 8, 0, 12, 66, 83, 98, + 225, 97, 113, 113, 98, 98, 98, 82, 98, 83, 83, 83, + 82, 224, 37, 11, 0, 13, 17, 161, 161, 132, 97, 17, + 18, 65, 33, 18, 50, 17, 33, 66, 17, 98, 33, 98, + 33, 98, 17, 114, 17, 129, 17, 33, 100, 113, 161, 161, + 0, 6, 64, 40, 20, 0, 16, 84, 226, 49, 225, 51, + 193, 66, 194, 240, 50, 240, 50, 240, 34, 230, 240, 54, + 225, 240, 50, 240, 49, 129, 86, 129, 50, 52, 97, 65, + 65, 24, 100, 69, 0, 18, 32, 31, 13, 0, 14, 82, + 21, 33, 51, 66, 65, 113, 65, 129, 33, 145, 33, 145, + 33, 145, 49, 129, 49, 113, 67, 66, 50, 21, 33, 0, + 16, 64, 32, 16, 0, 12, 7, 37, 67, 97, 114, 81, + 130, 81, 130, 65, 146, 49, 178, 17, 194, 17, 195, 169, + 162, 169, 162, 226, 226, 211, 183, 0, 15, 16, 23, 4, + 240, 146, 34, 34, 34, 34, 34, 34, 34, 34, 240, 50, + 34, 34, 34, 34, 34, 34, 34, 34, 160, 45, 13, 0, + 10, 52, 129, 65, 98, 81, 81, 67, 81, 66, 98, 179, + 145, 35, 97, 67, 81, 98, 50, 98, 66, 97, 67, 65, + 99, 49, 117, 147, 98, 65, 99, 49, 97, 81, 97, 81, + 98, 49, 132, 240, 240, 64, 11, 9, 0, 9, 3, 34, + 50, 34, 0, 22, 96, 55, 20, 0, 15, 102, 194, 98, + 145, 67, 50, 97, 50, 50, 33, 97, 50, 65, 49, 65, + 50, 161, 49, 50, 161, 33, 66, 161, 33, 66, 161, 33, + 66, 161, 49, 50, 161, 49, 66, 65, 65, 65, 50, 49, + 65, 81, 83, 65, 113, 177, 130, 114, 183, 0, 18, 48, + 23, 9, 0, 7, 18, 17, 65, 33, 65, 49, 65, 49, + 65, 34, 65, 33, 17, 66, 17, 54, 0, 18, 48, 23, + 10, 0, 16, 113, 129, 33, 81, 33, 81, 33, 66, 33, + 98, 18, 97, 33, 97, 33, 113, 0, 10, 96, 12, 13, + 0, 19, 75, 193, 193, 193, 193, 0, 21, 48, 9, 9, + 0, 18, 22, 33, 0, 14, 64, 61, 20, 0, 15, 102, + 194, 98, 152, 50, 97, 50, 50, 33, 97, 50, 50, 49, + 65, 66, 50, 65, 49, 66, 50, 65, 33, 85, 97, 33, + 82, 49, 81, 33, 82, 50, 65, 49, 66, 50, 65, 49, + 66, 50, 65, 65, 50, 50, 17, 17, 81, 21, 50, 17, + 113, 177, 130, 114, 183, 0, 18, 48, 8, 10, 0, 11, + 40, 0, 25, 32, 23, 9, 0, 7, 19, 66, 33, 65, + 65, 34, 65, 34, 65, 33, 65, 49, 65, 50, 33, 83, + 0, 17, 64, 37, 22, 0, 20, 49, 240, 97, 240, 97, + 240, 97, 240, 97, 240, 97, 240, 97, 207, 5, 177, 240, + 97, 240, 97, 240, 97, 240, 97, 240, 97, 0, 7, 15, + 5, 0, 16, 96, 24, 11, 0, 8, 100, 82, 49, 82, + 50, 81, 50, 130, 130, 114, 129, 146, 49, 65, 36, 65, + 49, 0, 18, 80, 24, 9, 0, 7, 20, 65, 49, 66, + 33, 114, 67, 145, 65, 49, 50, 49, 49, 65, 49, 49, + 83, 0, 15, 32, 11, 6, 240, 240, 241, 66, 50, 49, + 0, 14, 112, 40, 14, 0, 21, 49, 81, 113, 66, 98, + 66, 98, 66, 97, 81, 98, 66, 98, 66, 98, 66, 33, + 50, 50, 33, 49, 17, 33, 17, 33, 49, 19, 35, 65, + 209, 209, 209, 210, 194, 240, 176, 47, 13, 0, 10, 24, + 68, 33, 84, 49, 69, 49, 69, 33, 85, 33, 84, 49, + 99, 33, 145, 33, 145, 33, 129, 49, 129, 33, 145, 33, + 129, 49, 129, 49, 129, 33, 145, 33, 129, 49, 129, 33, + 145, 33, 145, 33, 0, 6, 10, 5, 0, 8, 114, 35, + 50, 0, 8, 48, 14, 7, 0, 19, 81, 97, 97, 65, + 18, 33, 33, 66, 240, 48, 17, 8, 0, 6, 81, 98, + 67, 113, 98, 98, 97, 98, 98, 69, 0, 14, 48, 20, + 9, 0, 7, 35, 66, 33, 65, 49, 50, 49, 50, 34, + 50, 33, 83, 70, 0, 18, 48, 22, 9, 0, 15, 17, + 129, 97, 33, 81, 34, 66, 18, 65, 18, 65, 33, 65, + 33, 113, 0, 9, 96, 47, 19, 0, 14, 113, 113, 146, + 113, 115, 113, 161, 97, 162, 97, 162, 81, 177, 81, 178, + 81, 81, 82, 65, 81, 69, 49, 65, 17, 161, 65, 17, + 161, 65, 33, 161, 49, 34, 145, 56, 97, 129, 145, 129, + 129, 117, 0, 17, 52, 19, 0, 14, 113, 113, 146, 113, + 115, 113, 161, 97, 162, 97, 162, 81, 177, 81, 51, 82, + 81, 18, 34, 66, 65, 33, 65, 37, 49, 34, 49, 145, + 50, 34, 129, 114, 145, 97, 161, 82, 161, 81, 65, 113, + 65, 20, 113, 81, 35, 0, 17, 16, 53, 19, 0, 14, + 84, 97, 113, 49, 97, 114, 33, 81, 178, 65, 147, 97, + 193, 65, 145, 49, 49, 146, 49, 49, 81, 49, 65, 33, + 82, 49, 49, 49, 65, 99, 49, 65, 33, 145, 65, 33, + 161, 49, 34, 145, 56, 97, 129, 145, 129, 129, 117, 0, + 17, 29, 11, 0, 17, 35, 131, 131, 240, 50, 129, 33, + 97, 49, 161, 130, 115, 99, 115, 130, 66, 50, 81, 50, + 81, 65, 65, 100, 240, 16, 44, 19, 193, 240, 50, 240, + 34, 240, 49, 0, 9, 49, 240, 34, 240, 19, 240, 19, + 241, 18, 225, 34, 225, 34, 209, 50, 193, 66, 199, 177, + 82, 161, 98, 161, 98, 145, 114, 130, 114, 87, 55, 0, + 16, 112, 47, 20, 240, 240, 98, 240, 34, 240, 49, 240, + 49, 0, 7, 33, 240, 50, 240, 35, 240, 35, 240, 17, + 18, 241, 34, 241, 34, 225, 50, 209, 66, 215, 193, 82, + 177, 98, 177, 98, 161, 114, 146, 114, 103, 55, 0, 17, + 112, 48, 20, 240, 240, 66, 240, 35, 240, 17, 49, 225, + 81, 0, 6, 113, 240, 50, 240, 35, 240, 35, 240, 17, + 18, 241, 34, 241, 34, 225, 50, 209, 66, 215, 193, 82, + 177, 98, 177, 98, 161, 114, 146, 114, 103, 55, 0, 17, + 112, 44, 20, 240, 240, 35, 240, 17, 36, 0, 11, 113, + 240, 50, 240, 35, 240, 35, 240, 17, 18, 241, 34, 241, + 34, 225, 50, 209, 66, 215, 193, 82, 177, 98, 177, 98, + 161, 114, 146, 114, 103, 55, 0, 17, 112, 46, 21, 240, + 240, 34, 50, 227, 35, 0, 12, 49, 240, 66, 240, 51, + 240, 51, 240, 33, 18, 240, 17, 34, 240, 17, 34, 241, + 50, 225, 66, 231, 209, 82, 193, 98, 193, 98, 177, 114, + 162, 114, 119, 55, 0, 18, 112, 47, 19, 210, 240, 17, + 33, 241, 49, 225, 33, 240, 18, 0, 6, 113, 240, 34, + 240, 19, 240, 19, 241, 18, 225, 34, 225, 34, 209, 50, + 193, 66, 199, 177, 82, 161, 98, 161, 98, 145, 114, 130, + 114, 87, 55, 0, 16, 112, 56, 28, 0, 22, 93, 240, + 19, 114, 240, 19, 114, 241, 18, 129, 225, 19, 113, 225, + 34, 240, 113, 50, 65, 240, 33, 35, 65, 240, 17, 56, + 241, 66, 65, 248, 65, 225, 83, 65, 49, 161, 82, 145, + 145, 98, 130, 129, 114, 129, 130, 99, 114, 87, 46, 0, + 25, 16, 44, 17, 0, 13, 85, 33, 114, 67, 114, 98, + 98, 114, 82, 145, 82, 145, 66, 242, 227, 227, 227, 227, + 145, 67, 129, 98, 129, 98, 113, 129, 82, 165, 209, 240, + 33, 240, 17, 194, 33, 193, 49, 211, 240, 224, 48, 20, + 240, 226, 240, 50, 240, 65, 240, 81, 240, 240, 46, 131, + 98, 146, 129, 146, 129, 146, 129, 131, 65, 49, 130, 81, + 194, 65, 215, 195, 50, 194, 65, 210, 65, 65, 115, 129, + 130, 145, 130, 130, 130, 114, 110, 0, 18, 32, 49, 20, + 240, 240, 51, 240, 34, 240, 33, 240, 49, 240, 240, 46, + 131, 98, 146, 129, 146, 129, 146, 129, 131, 65, 49, 130, + 81, 194, 65, 215, 195, 50, 194, 65, 210, 65, 65, 115, + 129, 130, 145, 130, 130, 130, 114, 110, 0, 18, 32, 48, + 20, 240, 240, 33, 240, 51, 242, 33, 225, 81, 240, 238, + 131, 98, 146, 129, 146, 129, 146, 129, 131, 65, 49, 130, + 81, 194, 65, 215, 195, 50, 194, 65, 210, 65, 65, 115, + 129, 130, 145, 130, 130, 130, 114, 110, 0, 18, 32, 45, + 20, 240, 226, 50, 195, 35, 0, 8, 78, 131, 98, 146, + 129, 146, 129, 146, 129, 131, 65, 49, 130, 81, 194, 65, + 215, 195, 50, 194, 65, 210, 65, 65, 115, 129, 130, 145, + 130, 130, 130, 114, 110, 0, 18, 32, 28, 13, 240, 66, + 178, 193, 209, 240, 103, 131, 162, 178, 178, 163, 162, 178, + 178, 162, 178, 178, 163, 162, 178, 178, 135, 0, 12, 16, + 28, 14, 240, 146, 179, 177, 193, 240, 135, 147, 178, 194, + 194, 179, 178, 194, 194, 178, 194, 194, 179, 178, 194, 194, + 151, 0, 13, 16, 30, 14, 240, 114, 179, 161, 49, 129, + 81, 240, 87, 147, 178, 194, 194, 179, 178, 194, 194, 178, + 194, 194, 179, 178, 194, 194, 151, 0, 13, 16, 29, 15, + 240, 98, 34, 131, 35, 0, 6, 55, 163, 194, 210, 210, + 195, 194, 210, 210, 194, 210, 210, 195, 194, 210, 210, 167, + 0, 14, 16, 39, 19, 0, 14, 106, 179, 82, 146, 114, + 130, 114, 115, 114, 114, 130, 114, 130, 72, 82, 99, 130, + 98, 146, 98, 131, 98, 130, 99, 114, 114, 130, 114, 114, + 130, 98, 107, 0, 17, 80, 57, 23, 240, 240, 67, 240, + 65, 36, 0, 9, 117, 102, 146, 129, 180, 113, 177, 18, + 113, 177, 18, 97, 193, 34, 81, 177, 50, 81, 177, 50, + 65, 193, 66, 49, 177, 82, 49, 177, 83, 33, 177, 98, + 17, 193, 98, 17, 177, 131, 177, 130, 193, 130, 150, 113, + 0, 21, 32, 42, 16, 114, 226, 242, 241, 241, 240, 228, + 162, 66, 114, 98, 82, 114, 66, 130, 66, 130, 50, 146, + 50, 146, 35, 146, 35, 146, 35, 131, 35, 130, 51, 115, + 66, 114, 82, 98, 114, 66, 149, 0, 15, 42, 16, 240, + 210, 210, 210, 225, 240, 212, 162, 66, 114, 98, 82, 114, + 66, 130, 66, 130, 50, 146, 50, 146, 35, 146, 35, 146, + 35, 131, 35, 130, 51, 115, 66, 114, 82, 98, 114, 66, + 149, 0, 15, 45, 16, 161, 242, 209, 17, 193, 34, 146, + 81, 240, 164, 162, 66, 114, 98, 82, 114, 66, 130, 66, + 130, 50, 146, 50, 146, 35, 146, 35, 146, 35, 131, 35, + 130, 51, 115, 66, 114, 82, 98, 114, 66, 149, 0, 15, + 43, 16, 240, 147, 33, 145, 21, 0, 7, 20, 162, 66, + 114, 98, 82, 114, 66, 130, 66, 130, 50, 146, 50, 146, + 35, 146, 35, 146, 35, 131, 35, 130, 51, 115, 66, 114, + 82, 98, 114, 66, 149, 0, 15, 43, 16, 240, 130, 50, + 146, 50, 0, 7, 20, 162, 66, 114, 98, 82, 114, 66, + 130, 66, 130, 50, 146, 50, 146, 35, 146, 35, 146, 35, + 131, 35, 130, 51, 115, 66, 114, 82, 98, 114, 66, 149, + 0, 15, 35, 17, 0, 19, 17, 209, 49, 177, 81, 145, + 113, 113, 145, 81, 177, 49, 209, 17, 241, 241, 17, 209, + 49, 177, 81, 145, 113, 113, 145, 81, 177, 49, 209, 0, + 13, 50, 19, 0, 15, 36, 65, 130, 66, 17, 130, 98, + 130, 114, 114, 100, 114, 81, 34, 99, 65, 50, 98, 65, + 66, 83, 49, 82, 83, 49, 67, 83, 33, 83, 83, 17, + 98, 100, 99, 114, 114, 130, 98, 129, 18, 66, 129, 53, + 0, 17, 112, 47, 20, 129, 240, 65, 240, 66, 240, 65, + 0, 6, 55, 70, 82, 145, 130, 145, 115, 129, 130, 145, + 130, 145, 130, 145, 115, 129, 130, 145, 130, 145, 115, 129, + 130, 145, 130, 145, 130, 129, 161, 129, 162, 97, 214, 0, + 18, 112, 47, 20, 240, 240, 34, 240, 34, 240, 34, 0, + 6, 23, 70, 82, 145, 130, 145, 115, 129, 130, 145, 130, + 145, 130, 145, 115, 129, 130, 145, 130, 145, 115, 129, 130, + 145, 130, 145, 130, 129, 161, 129, 162, 97, 214, 0, 18, + 112, 50, 20, 177, 240, 50, 240, 33, 17, 240, 17, 49, + 210, 81, 240, 199, 70, 82, 145, 130, 145, 115, 129, 130, + 145, 130, 145, 130, 145, 115, 129, 130, 145, 130, 145, 115, + 129, 130, 145, 130, 145, 130, 129, 161, 129, 162, 97, 214, + 0, 18, 112, 45, 20, 240, 194, 50, 211, 34, 0, 8, + 55, 70, 82, 145, 130, 145, 115, 129, 130, 145, 130, 145, + 130, 145, 115, 129, 130, 145, 130, 145, 115, 129, 130, 145, + 130, 145, 130, 129, 161, 129, 162, 97, 214, 0, 18, 112, + 44, 19, 240, 242, 240, 18, 240, 18, 0, 5, 103, 55, + 82, 114, 130, 113, 146, 97, 163, 65, 194, 49, 210, 33, + 226, 17, 243, 240, 34, 240, 19, 240, 18, 240, 34, 240, + 19, 240, 18, 240, 34, 232, 0, 18, 33, 18, 0, 14, + 8, 195, 242, 240, 24, 162, 82, 131, 83, 114, 99, 114, + 99, 114, 98, 114, 99, 114, 83, 135, 163, 242, 240, 18, + 240, 18, 216, 0, 17, 47, 15, 0, 12, 36, 161, 50, + 129, 81, 114, 66, 114, 65, 129, 65, 130, 19, 146, 49, + 145, 81, 129, 81, 114, 81, 114, 81, 113, 82, 98, 17, + 50, 101, 33, 113, 17, 50, 113, 35, 130, 210, 209, 210, + 210, 240, 240, 208, 38, 13, 0, 12, 1, 194, 193, 240, + 240, 99, 18, 97, 51, 81, 66, 82, 66, 82, 66, 66, + 82, 66, 66, 82, 66, 33, 34, 51, 17, 50, 33, 18, + 17, 67, 50, 0, 11, 112, 38, 13, 0, 12, 66, 162, + 161, 240, 240, 83, 18, 97, 51, 81, 66, 82, 66, 82, + 66, 66, 82, 66, 66, 82, 66, 33, 34, 51, 17, 50, + 33, 18, 17, 67, 50, 0, 11, 112, 40, 13, 0, 10, + 81, 193, 179, 145, 33, 209, 240, 83, 18, 97, 51, 81, + 66, 82, 66, 82, 66, 66, 82, 66, 66, 82, 66, 33, + 34, 51, 17, 50, 33, 18, 17, 67, 50, 0, 11, 112, + 39, 13, 0, 12, 3, 33, 97, 35, 0, 5, 99, 18, + 97, 51, 81, 66, 82, 66, 82, 66, 66, 82, 66, 66, + 82, 66, 33, 34, 51, 17, 50, 33, 18, 17, 67, 50, + 0, 11, 112, 39, 13, 0, 11, 114, 50, 98, 35, 240, + 240, 243, 18, 97, 51, 81, 66, 82, 66, 82, 66, 66, + 82, 66, 66, 82, 66, 33, 34, 51, 17, 50, 33, 18, + 17, 67, 50, 0, 11, 112, 42, 13, 0, 10, 67, 145, + 33, 145, 49, 129, 33, 162, 240, 115, 18, 97, 51, 81, + 66, 82, 66, 82, 66, 66, 82, 66, 66, 82, 66, 33, + 34, 51, 17, 50, 33, 18, 17, 67, 50, 0, 11, 112, + 38, 17, 0, 26, 3, 18, 19, 97, 52, 49, 65, 67, + 65, 50, 66, 65, 66, 66, 49, 66, 85, 82, 66, 146, + 66, 81, 50, 51, 81, 50, 33, 33, 65, 83, 68, 0, + 15, 64, 30, 10, 0, 15, 67, 97, 49, 66, 34, 50, + 50, 50, 114, 130, 130, 81, 34, 65, 65, 49, 99, 113, + 161, 98, 17, 97, 33, 114, 240, 192, 30, 10, 0, 9, + 34, 145, 161, 145, 240, 36, 81, 49, 65, 65, 50, 50, + 50, 33, 69, 82, 130, 81, 34, 65, 65, 49, 99, 0, + 9, 48, 30, 12, 0, 11, 66, 162, 145, 161, 240, 100, + 113, 49, 97, 65, 82, 50, 82, 33, 101, 114, 162, 81, + 66, 65, 97, 49, 131, 0, 11, 48, 33, 12, 0, 9, + 113, 162, 162, 145, 33, 98, 65, 240, 52, 113, 49, 97, + 65, 82, 50, 82, 33, 101, 114, 162, 81, 66, 65, 97, + 49, 131, 0, 11, 48, 31, 13, 0, 11, 114, 34, 114, + 35, 240, 240, 244, 129, 49, 113, 65, 98, 50, 98, 33, + 117, 130, 178, 81, 82, 65, 113, 49, 147, 0, 12, 48, + 28, 8, 0, 7, 34, 113, 129, 113, 210, 81, 33, 49, + 34, 49, 34, 98, 82, 98, 82, 33, 50, 33, 50, 17, + 82, 0, 7, 64, 29, 10, 0, 9, 66, 130, 113, 129, + 240, 34, 113, 33, 81, 34, 81, 34, 130, 114, 130, 114, + 33, 82, 33, 82, 17, 114, 0, 9, 64, 31, 9, 0, + 7, 49, 114, 114, 82, 33, 49, 240, 50, 97, 33, 65, + 34, 65, 34, 114, 98, 114, 98, 33, 66, 33, 66, 17, + 98, 0, 8, 64, 30, 10, 0, 9, 2, 34, 66, 34, + 240, 240, 66, 113, 33, 81, 34, 81, 34, 130, 114, 130, + 114, 33, 82, 33, 82, 17, 114, 0, 9, 64, 35, 14, + 0, 11, 34, 194, 49, 148, 132, 145, 49, 210, 134, 113, + 51, 98, 51, 82, 67, 82, 66, 82, 82, 82, 82, 82, + 66, 98, 66, 113, 50, 147, 0, 13, 48, 41, 14, 0, + 12, 116, 161, 20, 0, 5, 114, 66, 81, 18, 18, 18, + 49, 35, 50, 49, 35, 50, 98, 50, 99, 50, 98, 50, + 114, 50, 33, 65, 66, 17, 66, 65, 33, 66, 82, 0, + 12, 96, 31, 11, 0, 10, 18, 161, 177, 240, 244, 97, + 50, 66, 50, 50, 66, 50, 66, 34, 82, 34, 82, 34, + 66, 50, 66, 65, 50, 99, 0, 10, 48, 32, 13, 0, + 12, 51, 162, 161, 177, 240, 132, 129, 50, 98, 50, 82, + 66, 82, 66, 66, 82, 66, 82, 66, 66, 82, 66, 97, + 50, 131, 0, 12, 48, 35, 12, 0, 9, 113, 162, 162, + 145, 33, 113, 65, 240, 52, 113, 50, 82, 50, 66, 66, + 66, 66, 50, 82, 50, 82, 50, 66, 66, 66, 81, 50, + 115, 0, 11, 48, 33, 13, 0, 12, 3, 33, 97, 20, + 0, 5, 100, 129, 50, 98, 50, 82, 66, 82, 66, 66, + 82, 66, 82, 66, 66, 82, 66, 97, 50, 131, 0, 12, + 48, 33, 13, 0, 11, 114, 34, 114, 35, 240, 240, 244, + 129, 50, 98, 50, 82, 66, 82, 66, 66, 82, 66, 82, + 66, 66, 82, 66, 97, 50, 131, 0, 12, 48, 23, 23, + 0, 27, 3, 240, 83, 240, 83, 0, 12, 127, 6, 0, + 12, 115, 240, 83, 240, 83, 0, 18, 80, 32, 13, 0, + 20, 20, 17, 97, 50, 98, 50, 82, 51, 82, 33, 18, + 66, 33, 34, 66, 17, 50, 67, 50, 82, 66, 97, 50, + 81, 35, 0, 12, 32, 43, 14, 0, 12, 114, 209, 225, + 209, 240, 114, 82, 65, 33, 66, 49, 34, 65, 65, 34, + 50, 114, 50, 98, 51, 98, 33, 17, 98, 51, 33, 50, + 33, 18, 17, 66, 17, 34, 17, 82, 66, 0, 12, 96, + 43, 14, 0, 13, 50, 179, 177, 193, 240, 114, 82, 65, + 33, 66, 49, 34, 65, 65, 34, 50, 114, 50, 98, 51, + 98, 33, 17, 98, 51, 33, 50, 33, 18, 17, 66, 17, + 34, 17, 82, 66, 0, 12, 96, 45, 14, 0, 11, 65, + 194, 194, 162, 33, 129, 240, 162, 82, 65, 33, 66, 49, + 34, 65, 65, 34, 50, 114, 50, 98, 51, 98, 33, 17, + 98, 51, 33, 50, 33, 18, 17, 66, 17, 34, 17, 82, + 66, 0, 12, 96, 44, 14, 0, 12, 114, 34, 115, 34, + 0, 5, 114, 82, 65, 33, 66, 49, 34, 65, 65, 34, + 50, 114, 50, 98, 51, 98, 33, 17, 98, 51, 33, 50, + 33, 18, 17, 66, 17, 34, 17, 82, 66, 0, 12, 96, + 46, 13, 0, 12, 81, 178, 161, 177, 240, 82, 82, 49, + 33, 66, 33, 34, 65, 49, 34, 50, 98, 50, 82, 66, + 82, 50, 82, 66, 82, 51, 82, 33, 18, 99, 33, 178, + 178, 82, 65, 98, 50, 97, 50, 131, 240, 112, 40, 16, + 0, 12, 100, 226, 226, 225, 226, 226, 225, 35, 163, 34, + 131, 50, 130, 66, 130, 66, 129, 82, 114, 66, 130, 66, + 130, 65, 131, 50, 130, 19, 161, 241, 226, 226, 226, 184, + 240, 144, 46, 13, 0, 13, 67, 34, 114, 34, 240, 242, + 82, 49, 33, 66, 33, 34, 65, 49, 34, 50, 98, 50, + 82, 66, 82, 50, 82, 66, 82, 51, 82, 33, 18, 99, + 33, 178, 178, 82, 65, 98, 50, 97, 50, 131, 240, 112,}; + +//***************************************************************************** +// +// The glyph offset table for the 24 point Oldstandard italic font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard24i[] = +{ + 0, 5, 29, 46, 85, 150, 204, 254, + 265, 293, 321, 346, 390, 403, 412, 422, + 451, 490, 514, 547, 581, 611, 644, 682, + 711, 749, 786, 801, 820, 864, 877, 923, + 954, 1016, 1053, 1091, 1125, 1164, 1204, 1241, + 1283, 1323, 1347, 1376, 1418, 1453, 1520, 1571, + 1609, 1645, 1694, 1735, 1773, 1806, 1846, 1886, + 1949, 1995, 2033, 2065, 2094, 2122, 2151, 2174, + 2182, 2193, 2226, 2260, 2284, 2323, 2348, 2379, + 2417, 2457, 2485, 2519, 2558, 2585, 2635, 2671, + 2698, 2735, 2771, 2797, 2821, 2848, 2886, 2917, + 2960, 2991, 3032, 3057, 3085, 3111, 3140, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3156, 3161, 3182, 3219, 3259, 3290, 3322, 3345, + 3390, 3401, 3456, 3479, 3502, 3514, 3523, 3584, + 3592, 3615, 3652, 3676, 3700, 3711, 3751, 3798, + 3808, 3822, 3839, 3859, 3881, 3928, 3980, 4033, + 4062, 4106, 4153, 4201, 4245, 4291, 4338, 4394, + 4438, 4486, 4535, 4583, 4628, 4656, 4684, 4714, + 4743, 4782, 4839, 4881, 4923, 4968, 5011, 5054, + 5089, 5139, 5186, 5233, 5283, 5328, 5372, 5405, + 5452, 5490, 5528, 5568, 5607, 5646, 5688, 5726, + 5756, 5786, 5816, 5849, 5880, 5908, 5937, 5968, + 5998, 6033, 6074, 6105, 6137, 6172, 6205, 6238, + 6261, 6293, 6336, 6379, 6424, 6468, 6514, 6554, +}; + +//***************************************************************************** +// +// The font definition for the 24 point Oldstandard italic font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard24i = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 25, + + // + // The height of the font. + // + 30, + + // + // The baseline of the font. + // + 23, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard24i, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard24iData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard26.c b/third_party/fonts/ofl/fonts/fontoldstandard26.c new file mode 100644 index 0000000..7d2576e --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard26.c @@ -0,0 +1,780 @@ +//***************************************************************************** +// +// fontoldstandard26.c - Font definition for the 26pt Oldstandard font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 26 point +// Bold: no +// Italic: no +// Memory usage: 6932 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 26 point Oldstandard font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard26Data[6730] = +{ + 5, 10, 0, 41, 32, 24, 5, 240, 240, 83, 35, 35, + 35, 35, 35, 49, 65, 65, 65, 65, 65, 65, 65, 131, + 35, 35, 240, 240, 192, 17, 8, 0, 7, 2, 34, 34, + 34, 34, 34, 34, 34, 33, 65, 0, 21, 32, 41, 16, + 0, 14, 81, 65, 161, 65, 161, 65, 161, 65, 161, 65, + 94, 97, 65, 161, 65, 161, 65, 161, 65, 161, 65, 146, + 65, 110, 81, 65, 161, 65, 161, 65, 161, 65, 161, 65, + 0, 16, 112, 69, 14, 0, 9, 33, 33, 161, 33, 150, + 113, 17, 33, 18, 65, 33, 33, 34, 49, 33, 33, 34, + 49, 33, 33, 19, 49, 33, 33, 19, 50, 17, 33, 132, + 17, 150, 150, 129, 36, 113, 33, 19, 35, 17, 33, 34, + 35, 17, 33, 34, 34, 33, 33, 34, 34, 33, 33, 33, + 66, 17, 33, 18, 102, 145, 33, 161, 33, 0, 11, 32, + 58, 20, 0, 17, 99, 145, 97, 49, 113, 98, 50, 81, + 114, 50, 81, 114, 50, 65, 130, 50, 49, 146, 50, 49, + 161, 49, 49, 195, 65, 240, 49, 66, 193, 50, 34, 161, + 34, 66, 129, 50, 66, 113, 66, 66, 113, 66, 66, 97, + 82, 66, 97, 97, 65, 97, 132, 0, 20, 64, 49, 20, + 0, 18, 20, 242, 49, 210, 65, 210, 65, 210, 50, 211, + 33, 242, 17, 240, 34, 71, 100, 82, 129, 20, 66, 113, + 51, 65, 113, 83, 49, 98, 99, 17, 114, 100, 130, 115, + 130, 116, 130, 82, 19, 33, 86, 68, 0, 20, 64, 11, + 4, 240, 210, 34, 34, 34, 33, 0, 10, 112, 29, 9, + 0, 8, 50, 113, 114, 98, 113, 114, 114, 98, 114, 114, + 114, 114, 114, 114, 114, 130, 114, 114, 130, 114, 130, 130, + 130, 240, 224, 30, 9, 0, 8, 2, 129, 130, 130, 129, + 130, 114, 130, 114, 114, 114, 114, 114, 114, 114, 98, 114, + 114, 98, 113, 114, 98, 98, 240, 240, 64, 27, 12, 0, + 11, 2, 162, 98, 33, 50, 34, 33, 35, 65, 17, 17, + 132, 83, 17, 20, 34, 33, 35, 98, 162, 0, 24, 96, + 49, 24, 0, 22, 33, 240, 129, 240, 129, 240, 129, 240, + 129, 240, 129, 240, 129, 240, 129, 240, 129, 240, 129, 223, + 7, 193, 240, 129, 240, 129, 240, 129, 240, 129, 240, 129, + 240, 129, 240, 129, 240, 129, 240, 129, 240, 129, 0, 13, + 80, 14, 6, 0, 15, 114, 52, 51, 81, 81, 65, 81, + 65, 240, 208, 7, 9, 0, 20, 39, 0, 16, 10, 5, + 0, 13, 99, 35, 35, 240, 240, 192, 30, 10, 0, 9, + 81, 145, 129, 145, 145, 129, 145, 145, 130, 129, 145, 130, + 129, 145, 145, 129, 145, 145, 129, 145, 145, 129, 145, 145, + 240, 224, 41, 15, 0, 13, 85, 146, 50, 114, 82, 83, + 83, 66, 114, 51, 114, 51, 115, 35, 115, 35, 115, 35, + 115, 35, 115, 35, 115, 35, 114, 66, 114, 66, 99, 82, + 82, 114, 50, 149, 0, 15, 96, 25, 10, 0, 9, 33, + 145, 130, 85, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 88, 0, 10, 32, 35, 13, 0, 11, + 101, 98, 51, 65, 99, 49, 115, 33, 115, 35, 83, 36, + 67, 65, 82, 162, 162, 162, 162, 161, 177, 97, 65, 113, + 50, 113, 58, 58, 0, 13, 48, 34, 13, 0, 11, 85, + 113, 82, 66, 98, 51, 82, 52, 66, 178, 177, 178, 101, + 210, 194, 179, 50, 83, 36, 67, 35, 83, 34, 83, 65, + 82, 102, 0, 13, 80, 32, 14, 0, 13, 33, 194, 194, + 179, 164, 161, 18, 145, 34, 130, 34, 129, 50, 113, 66, + 98, 66, 97, 82, 92, 146, 194, 194, 194, 152, 0, 14, + 32, 35, 13, 0, 11, 66, 81, 87, 102, 113, 193, 193, + 193, 21, 98, 66, 81, 83, 65, 99, 163, 163, 50, 83, + 36, 67, 35, 82, 50, 83, 65, 67, 101, 0, 13, 96, + 39, 13, 0, 11, 116, 130, 49, 98, 66, 66, 67, 66, + 67, 66, 163, 163, 35, 85, 50, 52, 66, 51, 98, 35, + 98, 35, 98, 35, 98, 50, 98, 50, 82, 82, 65, 132, + 0, 13, 80, 28, 12, 0, 10, 74, 42, 33, 129, 33, + 129, 33, 113, 177, 161, 177, 161, 162, 162, 146, 162, 148, + 132, 132, 132, 147, 0, 12, 80, 40, 14, 0, 12, 86, + 113, 83, 65, 114, 50, 130, 34, 130, 34, 130, 36, 82, + 69, 49, 103, 114, 22, 66, 84, 34, 115, 34, 130, 34, + 130, 34, 130, 50, 98, 67, 66, 118, 0, 14, 80, 39, + 13, 0, 11, 100, 129, 66, 82, 67, 50, 98, 50, 98, + 50, 99, 34, 99, 34, 99, 50, 68, 50, 53, 83, 35, + 163, 162, 67, 66, 67, 66, 66, 66, 97, 50, 132, 0, + 13, 96, 15, 5, 0, 8, 19, 35, 35, 240, 240, 35, + 35, 35, 240, 240, 192, 19, 6, 0, 9, 114, 52, 36, + 240, 240, 50, 52, 36, 81, 81, 65, 81, 65, 240, 208, + 48, 22, 0, 24, 34, 240, 50, 240, 50, 240, 50, 240, + 50, 240, 51, 240, 35, 240, 35, 240, 50, 240, 50, 240, + 66, 240, 114, 240, 114, 240, 99, 240, 99, 240, 99, 240, + 98, 240, 114, 240, 114, 240, 114, 240, 113, 0, 11, 32, + 13, 24, 0, 45, 15, 7, 0, 12, 47, 7, 0, 36, + 32, 48, 22, 0, 22, 2, 240, 114, 240, 114, 240, 114, + 240, 114, 240, 99, 240, 99, 240, 99, 240, 98, 240, 114, + 240, 98, 240, 50, 240, 50, 240, 51, 240, 35, 240, 35, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 65, 0, 13, + 80, 32, 11, 0, 9, 117, 81, 66, 49, 98, 33, 98, + 35, 66, 50, 66, 130, 130, 130, 129, 145, 161, 49, 97, + 49, 115, 240, 67, 131, 131, 0, 11, 80, 64, 21, 0, + 19, 38, 195, 99, 129, 83, 18, 17, 97, 66, 36, 33, + 65, 66, 67, 33, 65, 50, 82, 65, 33, 66, 82, 65, + 33, 51, 67, 65, 33, 50, 82, 81, 33, 50, 82, 81, + 33, 50, 67, 65, 49, 50, 67, 65, 49, 50, 49, 18, + 49, 81, 67, 52, 113, 240, 97, 240, 97, 130, 184, 0, + 22, 40, 20, 0, 18, 65, 240, 66, 240, 35, 240, 35, + 240, 36, 245, 241, 34, 241, 35, 210, 35, 209, 66, 194, + 67, 178, 67, 185, 162, 99, 145, 130, 145, 130, 130, 131, + 87, 56, 0, 20, 32, 40, 18, 0, 15, 108, 146, 99, + 114, 114, 114, 130, 98, 130, 98, 130, 98, 114, 114, 113, + 137, 146, 99, 114, 115, 98, 131, 82, 131, 82, 131, 82, + 131, 82, 115, 98, 114, 77, 0, 18, 80, 39, 16, 0, + 14, 84, 65, 82, 66, 18, 66, 115, 51, 115, 50, 146, + 35, 146, 35, 161, 35, 211, 211, 211, 211, 161, 50, 161, + 50, 161, 66, 129, 82, 129, 98, 82, 149, 0, 16, 96, + 41, 20, 0, 17, 77, 162, 115, 130, 131, 114, 146, 114, + 147, 98, 162, 98, 163, 82, 163, 82, 163, 82, 163, 82, + 163, 82, 163, 82, 162, 98, 147, 98, 146, 114, 131, 114, + 115, 93, 0, 20, 112, 42, 17, 0, 14, 127, 82, 130, + 82, 130, 82, 145, 82, 145, 82, 81, 49, 82, 81, 146, + 66, 152, 146, 66, 146, 81, 146, 81, 146, 81, 49, 82, + 145, 82, 145, 82, 130, 82, 115, 47, 0, 17, 32, 37, + 17, 0, 14, 127, 82, 130, 82, 130, 82, 145, 82, 145, + 82, 81, 49, 82, 81, 146, 66, 152, 146, 66, 146, 81, + 146, 81, 146, 81, 146, 242, 242, 242, 215, 0, 18, 16, + 46, 19, 0, 17, 37, 49, 130, 81, 33, 114, 115, 99, + 130, 98, 146, 98, 161, 83, 161, 83, 240, 19, 104, 35, + 131, 83, 131, 83, 131, 83, 131, 98, 131, 99, 115, 114, + 98, 17, 130, 66, 33, 164, 65, 0, 19, 80, 42, 20, + 0, 17, 72, 40, 82, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 140, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, + 40, 0, 20, 32, 25, 10, 0, 8, 104, 82, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 88, 0, 10, 32, 29, 14, 0, 12, 119, 146, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 98, 66, 84, + 50, 83, 66, 82, 81, 113, 66, 132, 0, 15, 43, 19, + 0, 16, 88, 39, 82, 114, 130, 113, 146, 97, 162, 81, + 178, 65, 194, 49, 210, 35, 194, 20, 195, 35, 178, 66, + 178, 67, 162, 82, 162, 83, 146, 99, 130, 99, 130, 115, + 72, 24, 0, 19, 32, 31, 17, 0, 14, 120, 194, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 145, 82, 145, + 82, 145, 82, 130, 82, 130, 82, 115, 47, 0, 17, 32, + 68, 22, 0, 19, 38, 134, 83, 131, 132, 115, 129, 18, + 97, 18, 129, 18, 97, 18, 129, 19, 81, 18, 129, 34, + 81, 18, 129, 34, 65, 34, 129, 35, 49, 34, 129, 50, + 49, 34, 129, 50, 33, 50, 129, 51, 17, 50, 129, 66, + 17, 50, 129, 67, 66, 129, 67, 66, 129, 82, 66, 129, + 81, 82, 87, 33, 40, 0, 22, 32, 53, 20, 0, 17, + 70, 102, 83, 129, 132, 113, 129, 18, 113, 129, 19, 97, + 129, 35, 81, 129, 50, 81, 129, 51, 65, 129, 67, 49, + 129, 67, 49, 129, 83, 33, 129, 98, 33, 129, 99, 17, + 129, 116, 129, 131, 129, 131, 129, 146, 87, 113, 0, 20, + 80, 41, 17, 0, 15, 69, 162, 82, 114, 114, 98, 114, + 82, 131, 66, 146, 51, 147, 35, 147, 35, 147, 35, 147, + 35, 147, 35, 147, 50, 146, 66, 131, 82, 114, 98, 114, + 114, 82, 165, 0, 17, 112, 32, 17, 0, 14, 124, 130, + 99, 98, 114, 98, 115, 82, 115, 82, 115, 82, 99, 98, + 98, 121, 130, 242, 242, 242, 242, 242, 242, 242, 200, 0, + 18, 16, 53, 17, 0, 15, 69, 162, 82, 114, 114, 98, + 114, 82, 131, 66, 146, 51, 147, 35, 147, 35, 147, 35, + 147, 35, 147, 35, 147, 50, 146, 66, 51, 35, 82, 17, + 34, 18, 98, 17, 49, 18, 115, 50, 49, 118, 49, 178, + 49, 178, 34, 181, 226, 0, 9, 44, 19, 0, 16, 92, + 162, 99, 130, 115, 114, 115, 114, 115, 114, 114, 130, 83, + 152, 178, 81, 178, 82, 162, 98, 146, 98, 146, 98, 146, + 99, 33, 82, 99, 33, 82, 99, 33, 82, 101, 56, 68, + 0, 19, 48, 42, 15, 0, 13, 68, 65, 66, 66, 18, + 50, 115, 50, 130, 50, 130, 50, 145, 52, 113, 69, 183, + 167, 65, 101, 49, 132, 33, 162, 34, 146, 34, 146, 35, + 129, 49, 34, 82, 49, 69, 0, 15, 80, 47, 18, 0, + 15, 111, 1, 35, 66, 67, 34, 82, 82, 34, 82, 97, + 33, 98, 97, 33, 98, 97, 33, 98, 97, 146, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 240, 18, 240, 18, 217, 0, 18, 80, 41, 21, 0, 18, + 56, 71, 82, 161, 130, 161, 130, 161, 130, 161, 130, 161, + 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, + 130, 161, 130, 161, 145, 161, 146, 129, 178, 97, 230, 0, + 22, 43, 20, 0, 17, 72, 55, 83, 130, 115, 129, 146, + 129, 147, 98, 162, 97, 179, 81, 179, 65, 210, 65, 211, + 49, 211, 33, 242, 33, 243, 17, 240, 19, 240, 35, 240, + 35, 240, 49, 240, 65, 0, 21, 32, 66, 28, 0, 24, + 72, 39, 39, 83, 99, 114, 130, 114, 113, 146, 99, 113, + 147, 84, 82, 147, 84, 81, 178, 65, 34, 81, 179, 49, + 35, 50, 179, 49, 35, 49, 210, 34, 50, 49, 211, 17, + 67, 18, 211, 17, 67, 17, 242, 17, 82, 17, 243, 100, + 243, 99, 240, 34, 114, 240, 33, 130, 240, 33, 129, 0, + 29, 32, 44, 20, 0, 17, 88, 23, 115, 82, 163, 82, + 179, 65, 195, 49, 227, 18, 242, 17, 240, 19, 240, 50, + 240, 51, 240, 17, 18, 242, 19, 225, 51, 193, 67, 178, + 83, 161, 114, 146, 115, 87, 56, 0, 20, 32, 42, 19, + 0, 16, 88, 39, 83, 114, 115, 113, 147, 81, 178, 81, + 179, 49, 210, 49, 211, 17, 242, 17, 240, 18, 240, 34, + 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, + 233, 0, 19, 80, 35, 16, 0, 14, 29, 51, 99, 66, + 114, 81, 115, 81, 99, 210, 211, 195, 210, 211, 195, 210, + 113, 83, 113, 67, 129, 66, 130, 51, 115, 35, 115, 61, + 0, 16, 48, 30, 7, 0, 6, 21, 34, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 114, 240, 32, 30, 10, 0, + 8, 97, 145, 145, 161, 145, 145, 161, 145, 145, 161, 145, + 145, 145, 161, 145, 145, 161, 145, 145, 161, 145, 145, 161, + 145, 240, 112, 30, 7, 0, 6, 21, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 50, 240, 48, 23, 13, 0, + 12, 1, 179, 161, 17, 145, 49, 114, 50, 97, 81, 81, + 113, 65, 114, 33, 145, 0, 27, 112, 8, 16, 0, 56, + 14, 0, 8, 32, 11, 6, 240, 240, 194, 66, 82, 97, + 0, 16, 96, 32, 13, 0, 21, 53, 98, 81, 82, 82, + 67, 66, 178, 133, 83, 50, 66, 82, 66, 82, 17, 34, + 67, 17, 34, 49, 18, 17, 52, 50, 0, 13, 48, 38, + 13, 0, 11, 52, 178, 178, 178, 178, 178, 178, 20, 99, + 50, 83, 65, 82, 82, 66, 82, 66, 82, 66, 82, 66, + 82, 66, 82, 66, 81, 81, 17, 50, 81, 36, 0, 13, + 64, 25, 11, 0, 18, 36, 97, 65, 65, 97, 34, 82, + 34, 82, 34, 146, 146, 146, 161, 97, 65, 65, 100, 0, + 11, 64, 38, 14, 0, 12, 117, 194, 194, 194, 194, 194, + 115, 34, 82, 49, 18, 81, 83, 66, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 81, 83, 82, 67, 116, + 20, 0, 14, 32, 26, 11, 0, 18, 36, 97, 50, 65, + 82, 34, 82, 34, 82, 41, 34, 146, 146, 97, 49, 97, + 65, 65, 100, 0, 11, 64, 27, 11, 0, 10, 20, 98, + 49, 66, 50, 66, 146, 146, 119, 98, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 119, 0, 11, 64, 39, 14, 0, + 23, 20, 34, 66, 66, 18, 34, 100, 34, 98, 66, 98, + 66, 98, 66, 97, 98, 66, 132, 115, 184, 121, 81, 114, + 49, 145, 49, 145, 49, 145, 65, 113, 103, 240, 240, 48, + 38, 15, 0, 13, 20, 210, 210, 210, 210, 210, 210, 36, + 114, 17, 49, 115, 66, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 70, 22, 0, + 15, 32, 23, 7, 0, 6, 35, 67, 81, 240, 164, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 53, 0, 7, + 32, 31, 9, 0, 8, 66, 114, 240, 240, 165, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 34, + 50, 34, 50, 33, 50, 68, 240, 112, 36, 14, 0, 12, + 36, 194, 194, 194, 194, 194, 194, 38, 66, 65, 114, 49, + 130, 33, 146, 33, 146, 18, 150, 130, 34, 130, 50, 114, + 51, 98, 66, 69, 37, 0, 14, 32, 25, 8, 0, 7, + 4, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 70, 0, 8, 32, 45, 22, 0, + 35, 100, 36, 51, 130, 17, 49, 33, 49, 115, 67, 66, + 98, 82, 82, 98, 82, 82, 98, 82, 82, 98, 82, 82, + 98, 82, 82, 98, 82, 82, 98, 82, 82, 98, 82, 82, + 70, 22, 22, 0, 22, 32, 32, 15, 0, 24, 52, 36, + 114, 17, 49, 115, 66, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 70, 22, 0, + 15, 32, 29, 12, 0, 19, 116, 113, 65, 82, 66, 50, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 49, + 82, 81, 65, 116, 0, 12, 80, 37, 13, 0, 21, 20, + 20, 99, 50, 83, 65, 82, 82, 66, 82, 66, 82, 66, + 82, 66, 82, 66, 82, 66, 81, 83, 50, 82, 20, 98, + 178, 178, 178, 178, 150, 240, 240, 48, 38, 14, 0, 23, + 20, 33, 82, 65, 17, 81, 81, 17, 66, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 81, 83, 82, 67, + 116, 18, 194, 194, 194, 194, 194, 166, 240, 240, 23, 11, + 0, 17, 116, 34, 82, 17, 33, 67, 34, 67, 130, 146, + 146, 146, 146, 146, 146, 118, 0, 11, 80, 27, 11, 0, + 18, 5, 81, 82, 49, 97, 50, 81, 52, 133, 148, 49, + 83, 33, 113, 34, 97, 35, 81, 33, 37, 0, 11, 48, + 27, 10, 0, 10, 49, 145, 145, 130, 130, 103, 82, 130, + 130, 130, 130, 130, 130, 130, 49, 66, 49, 66, 34, 84, + 0, 10, 48, 32, 15, 0, 24, 52, 52, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 67, 98, 49, 18, 116, 36, 0, 15, 32, 26, + 15, 0, 24, 54, 37, 66, 82, 98, 81, 130, 65, 130, + 49, 162, 33, 162, 33, 162, 17, 195, 195, 209, 225, 0, + 16, 42, 21, 0, 34, 22, 22, 21, 66, 82, 81, 98, + 82, 81, 114, 67, 49, 130, 49, 18, 49, 146, 33, 18, + 49, 146, 33, 34, 17, 162, 17, 50, 17, 179, 51, 195, + 66, 209, 82, 209, 0, 22, 96, 28, 14, 0, 22, 101, + 36, 82, 65, 115, 33, 146, 33, 163, 179, 194, 177, 18, + 145, 34, 145, 50, 113, 67, 68, 38, 0, 14, 32, 36, + 15, 0, 24, 54, 37, 67, 81, 114, 81, 114, 65, 146, + 49, 146, 49, 146, 33, 178, 17, 178, 17, 179, 210, 210, + 209, 225, 225, 146, 34, 146, 33, 179, 240, 240, 160, 26, + 11, 0, 17, 121, 34, 67, 33, 82, 49, 66, 65, 51, + 130, 130, 131, 130, 65, 50, 81, 50, 81, 41, 0, 11, + 32, 29, 8, 0, 7, 66, 81, 98, 98, 98, 99, 83, + 98, 98, 98, 97, 67, 114, 114, 98, 98, 83, 83, 82, + 98, 98, 113, 130, 240, 176, 28, 3, 240, 97, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 128, 29, 8, + 0, 7, 2, 129, 114, 98, 98, 83, 83, 82, 98, 98, + 113, 131, 66, 82, 98, 98, 99, 83, 98, 98, 98, 97, + 82, 240, 240, 18, 17, 0, 34, 33, 161, 55, 113, 33, + 54, 65, 33, 104, 49, 117, 0, 25, 112, 5, 10, 0, + 41, 32, 22, 5, 0, 8, 19, 35, 35, 129, 65, 65, + 65, 65, 65, 65, 65, 51, 35, 35, 35, 35, 35, 192, + 41, 11, 0, 14, 49, 161, 161, 133, 81, 33, 33, 50, + 33, 33, 34, 49, 18, 34, 49, 18, 34, 49, 82, 49, + 82, 49, 82, 49, 98, 33, 33, 65, 33, 17, 101, 129, + 161, 161, 0, 7, 64, 36, 17, 0, 16, 4, 178, 66, + 130, 82, 129, 83, 114, 97, 130, 242, 197, 246, 178, 242, + 242, 242, 242, 179, 17, 129, 33, 50, 114, 33, 49, 24, + 67, 69, 0, 17, 64, 31, 13, 0, 17, 113, 37, 33, + 51, 51, 65, 113, 49, 130, 33, 145, 33, 145, 33, 145, + 33, 145, 49, 113, 66, 82, 49, 37, 33, 0, 18, 16, + 33, 17, 0, 14, 118, 54, 67, 98, 114, 97, 130, 81, + 162, 65, 162, 49, 194, 33, 194, 17, 226, 186, 178, 242, + 186, 178, 242, 242, 242, 200, 0, 17, 96, 23, 3, 240, + 97, 33, 33, 33, 33, 33, 33, 33, 33, 240, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 176, 43, 12, 0, 10, + 116, 113, 65, 82, 50, 82, 50, 82, 178, 179, 133, 97, + 51, 65, 83, 49, 99, 34, 98, 35, 97, 51, 81, 67, + 49, 101, 131, 162, 178, 82, 50, 82, 50, 81, 50, 116, + 240, 240, 192, 10, 9, 0, 10, 18, 50, 34, 50, 0, + 25, 59, 21, 0, 19, 23, 194, 114, 145, 67, 65, 113, + 65, 51, 33, 81, 66, 66, 49, 65, 65, 97, 49, 49, + 66, 97, 65, 33, 66, 177, 33, 66, 177, 33, 66, 177, + 33, 66, 177, 33, 66, 177, 49, 66, 65, 65, 65, 81, + 65, 65, 81, 84, 65, 113, 177, 146, 114, 199, 0, 22, + 21, 9, 0, 8, 3, 82, 33, 114, 82, 17, 66, 33, + 66, 33, 17, 51, 17, 54, 0, 20, 80, 24, 8, 0, + 15, 18, 33, 49, 33, 50, 33, 50, 33, 50, 33, 50, + 33, 65, 33, 66, 33, 65, 0, 9, 80, 13, 14, 0, + 28, 12, 209, 209, 209, 209, 209, 0, 19, 64, 7, 9, + 0, 20, 39, 0, 16, 64, 21, 0, 19, 23, 194, 114, + 152, 65, 113, 50, 49, 65, 81, 66, 50, 65, 65, 66, + 50, 65, 49, 82, 50, 81, 33, 82, 49, 97, 33, 85, + 113, 33, 82, 49, 97, 33, 82, 50, 81, 33, 82, 50, + 81, 49, 66, 50, 65, 65, 66, 50, 17, 33, 81, 21, + 50, 33, 113, 177, 146, 114, 199, 0, 22, 8, 9, 0, + 10, 23, 0, 26, 16, 19, 9, 0, 8, 19, 81, 49, + 49, 81, 33, 81, 33, 81, 49, 49, 83, 0, 21, 112, + 39, 24, 0, 25, 33, 240, 129, 240, 129, 240, 129, 240, + 129, 240, 129, 240, 129, 223, 7, 193, 240, 129, 240, 129, + 240, 129, 240, 129, 240, 129, 240, 129, 0, 7, 95, 7, + 0, 21, 32, 22, 9, 0, 8, 5, 49, 66, 33, 66, + 35, 34, 113, 113, 113, 98, 49, 49, 65, 39, 0, 18, + 32, 24, 9, 0, 8, 4, 65, 66, 34, 50, 34, 50, + 113, 68, 130, 65, 50, 34, 50, 33, 65, 68, 0, 17, + 48, 11, 6, 240, 240, 226, 66, 50, 49, 0, 17, 16, + 40, 16, 0, 26, 2, 82, 114, 83, 98, 83, 98, 83, + 98, 83, 98, 83, 98, 83, 113, 97, 113, 98, 129, 82, + 65, 33, 17, 56, 33, 37, 51, 33, 241, 241, 242, 226, + 226, 226, 240, 240, 49, 13, 0, 11, 89, 52, 49, 69, + 49, 69, 49, 69, 49, 69, 49, 69, 49, 84, 49, 129, + 49, 129, 49, 129, 49, 129, 49, 129, 49, 129, 49, 129, + 49, 129, 49, 129, 49, 129, 49, 129, 49, 129, 49, 129, + 49, 129, 49, 0, 7, 10, 5, 0, 9, 51, 35, 35, + 0, 9, 80, 11, 7, 0, 22, 113, 114, 98, 82, 36, + 240, 32, 18, 8, 0, 7, 49, 113, 68, 98, 98, 98, + 98, 98, 98, 98, 70, 0, 15, 32, 22, 9, 0, 8, + 19, 81, 49, 50, 50, 34, 50, 34, 50, 34, 50, 49, + 49, 83, 71, 0, 19, 48, 25, 9, 0, 16, 17, 81, + 49, 65, 50, 65, 50, 49, 50, 49, 50, 49, 50, 49, + 49, 49, 50, 97, 0, 10, 96, 51, 20, 0, 17, 113, + 145, 100, 145, 130, 129, 146, 114, 146, 113, 162, 97, 178, + 97, 178, 81, 66, 98, 65, 82, 98, 65, 67, 70, 17, + 65, 18, 177, 49, 34, 161, 65, 34, 145, 65, 50, 145, + 72, 97, 146, 114, 146, 113, 134, 0, 20, 32, 53, 19, + 0, 17, 1, 145, 84, 129, 130, 129, 130, 113, 146, 113, + 146, 97, 162, 81, 178, 81, 35, 98, 65, 18, 34, 82, + 65, 17, 66, 38, 17, 34, 50, 129, 65, 50, 129, 114, + 129, 114, 145, 97, 161, 97, 65, 82, 82, 50, 81, 103, + 0, 19, 32, 57, 20, 0, 17, 85, 113, 97, 66, 97, + 98, 50, 81, 193, 82, 132, 97, 194, 65, 226, 49, 146, + 50, 33, 66, 66, 50, 17, 67, 65, 50, 33, 49, 18, + 84, 33, 65, 18, 161, 65, 34, 161, 65, 34, 145, 65, + 50, 130, 72, 97, 146, 113, 162, 113, 134, 0, 20, 32, + 31, 11, 0, 18, 35, 131, 131, 240, 67, 113, 49, 97, + 49, 146, 145, 130, 130, 130, 130, 66, 50, 67, 34, 97, + 34, 97, 50, 65, 85, 240, 176, 48, 20, 240, 162, 240, + 50, 240, 66, 240, 81, 0, 7, 49, 240, 66, 240, 35, + 240, 35, 240, 36, 245, 241, 34, 241, 35, 210, 35, 209, + 66, 209, 67, 178, 82, 185, 162, 99, 145, 130, 145, 131, + 114, 131, 87, 56, 0, 20, 32, 51, 20, 240, 240, 17, + 240, 50, 240, 34, 240, 49, 240, 49, 240, 240, 145, 240, + 66, 240, 35, 240, 35, 240, 36, 245, 241, 34, 241, 35, + 210, 35, 209, 66, 209, 67, 178, 67, 185, 162, 99, 145, + 130, 145, 131, 114, 131, 87, 56, 0, 20, 32, 51, 20, + 240, 209, 240, 66, 240, 33, 18, 241, 50, 240, 81, 240, + 240, 81, 240, 66, 240, 35, 240, 35, 240, 36, 245, 241, + 34, 241, 35, 210, 35, 209, 66, 194, 67, 178, 67, 185, + 162, 99, 145, 130, 145, 130, 130, 131, 87, 56, 0, 20, + 32, 46, 20, 0, 5, 99, 240, 17, 21, 0, 9, 65, + 240, 65, 240, 51, 240, 35, 240, 36, 245, 241, 34, 241, + 35, 210, 35, 209, 66, 194, 67, 178, 67, 185, 162, 99, + 145, 115, 145, 130, 130, 131, 87, 56, 0, 20, 32, 47, + 20, 240, 240, 242, 66, 194, 66, 0, 9, 50, 240, 50, + 240, 50, 240, 36, 240, 20, 241, 19, 241, 35, 225, 35, + 225, 50, 209, 67, 193, 82, 178, 82, 186, 161, 114, 146, + 115, 130, 130, 115, 130, 87, 56, 0, 20, 32, 50, 19, + 240, 179, 241, 49, 225, 49, 225, 49, 243, 240, 240, 97, + 240, 49, 240, 35, 240, 19, 240, 19, 241, 19, 225, 34, + 225, 34, 209, 51, 193, 51, 178, 66, 177, 83, 169, 146, + 99, 129, 115, 129, 130, 114, 131, 71, 40, 0, 19, 32, + 57, 26, 0, 23, 127, 211, 115, 211, 130, 193, 18, 145, + 193, 18, 145, 177, 34, 81, 49, 177, 34, 81, 225, 50, + 66, 225, 56, 209, 66, 66, 194, 66, 81, 193, 82, 81, + 49, 121, 81, 49, 113, 98, 145, 97, 114, 145, 97, 114, + 130, 82, 114, 115, 39, 62, 0, 26, 32, 47, 16, 0, + 14, 84, 65, 82, 66, 18, 66, 115, 51, 115, 50, 146, + 35, 146, 35, 161, 35, 211, 211, 211, 211, 161, 50, 161, + 50, 161, 51, 129, 82, 129, 98, 82, 149, 193, 242, 240, + 18, 226, 161, 50, 180, 240, 240, 144, 51, 17, 240, 98, + 240, 18, 240, 18, 240, 17, 240, 33, 240, 175, 82, 130, + 82, 130, 82, 145, 82, 145, 82, 81, 49, 82, 81, 146, + 66, 152, 146, 66, 146, 81, 146, 81, 146, 81, 49, 82, + 145, 82, 145, 82, 130, 82, 115, 47, 0, 17, 32, 47, + 17, 240, 194, 242, 226, 225, 240, 240, 207, 82, 115, 82, + 130, 82, 145, 82, 145, 82, 81, 49, 82, 81, 146, 66, + 152, 146, 66, 146, 81, 146, 81, 146, 81, 49, 82, 145, + 82, 145, 82, 130, 82, 115, 47, 0, 17, 32, 50, 17, + 240, 161, 243, 210, 17, 194, 50, 145, 113, 240, 111, 82, + 130, 82, 130, 82, 145, 82, 145, 82, 81, 49, 82, 81, + 146, 66, 152, 146, 66, 146, 81, 146, 81, 146, 81, 49, + 82, 145, 82, 145, 82, 130, 82, 115, 47, 0, 17, 32, + 49, 17, 240, 240, 146, 50, 162, 50, 0, 7, 15, 82, + 115, 82, 130, 82, 145, 82, 145, 82, 81, 49, 82, 81, + 146, 66, 152, 146, 66, 146, 81, 146, 81, 49, 82, 81, + 49, 82, 145, 82, 145, 82, 130, 82, 115, 47, 0, 17, + 32, 28, 10, 177, 146, 145, 161, 240, 184, 82, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 88, 0, 10, 32, 29, 10, 240, 18, 115, 114, 113, + 240, 168, 82, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 88, 0, 10, 32, 30, 10, + 240, 130, 116, 81, 65, 49, 97, 200, 82, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 88, 0, 10, 32, 30, 10, 240, 82, 66, 34, 66, 240, + 240, 40, 82, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 88, 0, 10, 32, 41, 20, + 0, 17, 77, 162, 115, 130, 131, 114, 146, 114, 147, 98, + 162, 98, 163, 82, 163, 55, 115, 82, 163, 82, 163, 82, + 163, 82, 162, 98, 147, 98, 146, 114, 131, 114, 115, 93, + 0, 20, 112, 58, 20, 240, 180, 33, 209, 21, 0, 10, + 118, 102, 83, 129, 132, 113, 129, 18, 113, 129, 19, 97, + 129, 35, 81, 129, 50, 81, 129, 51, 65, 129, 67, 49, + 129, 67, 49, 129, 83, 33, 129, 98, 33, 129, 99, 17, + 129, 116, 129, 131, 129, 131, 129, 146, 86, 129, 0, 20, + 80, 50, 17, 240, 98, 242, 240, 18, 240, 17, 240, 33, + 240, 240, 21, 162, 82, 114, 114, 98, 114, 82, 131, 66, + 146, 51, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, + 147, 50, 146, 66, 131, 82, 114, 98, 114, 114, 82, 165, + 0, 17, 112, 47, 17, 240, 178, 242, 226, 241, 241, 240, + 240, 21, 162, 82, 114, 114, 98, 114, 82, 131, 66, 146, + 51, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, + 50, 146, 66, 131, 82, 114, 98, 114, 114, 82, 165, 0, + 17, 112, 49, 17, 240, 145, 243, 225, 17, 209, 49, 177, + 81, 240, 213, 162, 82, 114, 114, 98, 114, 82, 131, 66, + 146, 51, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, + 147, 50, 146, 66, 131, 82, 114, 98, 114, 114, 82, 165, + 0, 17, 112, 45, 17, 240, 115, 209, 21, 0, 9, 117, + 162, 82, 114, 114, 98, 114, 82, 131, 66, 146, 51, 147, + 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, 50, 146, + 66, 131, 82, 114, 98, 114, 114, 82, 165, 0, 17, 112, + 47, 17, 240, 240, 130, 50, 162, 50, 0, 7, 101, 162, + 82, 114, 114, 98, 114, 82, 131, 66, 146, 51, 147, 35, + 147, 35, 147, 35, 147, 35, 147, 35, 147, 50, 146, 66, + 131, 82, 114, 98, 114, 114, 82, 165, 0, 17, 112, 35, + 18, 0, 24, 49, 49, 194, 65, 162, 97, 130, 129, 98, + 161, 66, 193, 34, 227, 242, 242, 17, 210, 49, 178, 81, + 146, 113, 114, 145, 82, 177, 50, 209, 0, 16, 53, 17, + 0, 15, 69, 65, 82, 81, 33, 82, 114, 98, 114, 82, + 116, 66, 113, 18, 51, 97, 35, 35, 81, 51, 35, 66, + 51, 35, 50, 67, 35, 49, 83, 35, 33, 99, 50, 17, + 114, 68, 99, 82, 114, 98, 114, 81, 33, 82, 81, 69, + 0, 17, 112, 49, 21, 240, 194, 240, 66, 240, 82, 240, + 97, 0, 6, 88, 71, 82, 161, 130, 161, 130, 161, 130, + 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, + 161, 130, 161, 130, 161, 130, 161, 145, 161, 146, 129, 178, + 97, 230, 0, 22, 50, 21, 240, 240, 34, 240, 66, 240, + 50, 240, 50, 0, 6, 72, 71, 82, 161, 130, 161, 130, + 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, + 161, 130, 161, 130, 161, 130, 161, 130, 161, 145, 161, 146, + 129, 178, 97, 230, 0, 22, 51, 21, 240, 241, 240, 67, + 240, 34, 18, 241, 81, 240, 97, 240, 216, 71, 82, 161, + 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, + 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, + 145, 161, 146, 129, 178, 97, 230, 0, 22, 47, 21, 0, + 6, 2, 50, 226, 50, 0, 8, 120, 71, 82, 161, 130, + 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, + 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 145, + 161, 146, 129, 178, 97, 230, 0, 22, 50, 19, 240, 242, + 240, 19, 240, 18, 240, 17, 0, 5, 120, 39, 83, 114, + 115, 113, 147, 81, 178, 81, 179, 49, 210, 49, 211, 17, + 242, 17, 240, 18, 240, 34, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 34, 240, 34, 233, 0, 19, 80, 33, 17, + 0, 14, 120, 194, 242, 248, 146, 98, 114, 99, 98, 115, + 82, 115, 82, 115, 82, 115, 82, 99, 98, 98, 120, 146, + 242, 242, 242, 200, 0, 18, 16, 45, 14, 0, 12, 116, + 130, 66, 97, 82, 82, 82, 82, 81, 98, 65, 114, 19, + 130, 50, 114, 81, 98, 82, 82, 98, 66, 98, 66, 98, + 66, 98, 66, 18, 50, 66, 18, 50, 66, 17, 50, 52, + 36, 0, 14, 64, 39, 13, 0, 11, 66, 178, 194, 194, + 240, 240, 116, 114, 65, 97, 82, 82, 66, 97, 66, 133, + 83, 50, 66, 82, 66, 82, 17, 34, 67, 17, 34, 49, + 18, 17, 52, 50, 0, 13, 48, 38, 13, 0, 12, 34, + 163, 162, 161, 177, 240, 133, 98, 81, 82, 82, 67, 66, + 178, 133, 83, 50, 66, 82, 66, 82, 17, 34, 67, 17, + 34, 49, 18, 17, 52, 50, 0, 13, 48, 40, 13, 0, + 11, 113, 194, 163, 146, 33, 113, 81, 240, 85, 98, 81, + 82, 82, 67, 66, 178, 133, 83, 50, 66, 82, 66, 82, + 17, 34, 67, 17, 34, 49, 18, 17, 52, 50, 0, 13, + 48, 38, 13, 0, 13, 20, 49, 81, 21, 0, 5, 101, + 98, 81, 82, 82, 67, 66, 178, 133, 83, 50, 66, 82, + 66, 82, 17, 34, 67, 17, 34, 49, 18, 17, 52, 50, + 0, 13, 48, 38, 13, 0, 13, 18, 50, 98, 50, 0, + 5, 100, 129, 65, 113, 66, 98, 50, 178, 148, 99, 34, + 82, 66, 82, 66, 33, 34, 51, 33, 34, 33, 18, 33, + 52, 35, 0, 13, 48, 40, 13, 0, 11, 99, 145, 49, + 129, 49, 129, 49, 147, 240, 116, 114, 65, 98, 66, 83, + 50, 178, 148, 99, 34, 82, 66, 82, 66, 33, 34, 51, + 33, 34, 51, 33, 52, 35, 0, 13, 48, 37, 18, 0, + 29, 84, 51, 98, 67, 50, 65, 82, 81, 67, 50, 82, + 146, 82, 93, 50, 66, 146, 82, 146, 82, 97, 34, 67, + 81, 50, 49, 34, 65, 68, 84, 0, 18, 64, 30, 11, + 0, 18, 36, 97, 65, 65, 97, 34, 82, 34, 82, 34, + 146, 146, 146, 161, 97, 65, 65, 100, 129, 162, 177, 162, + 146, 100, 240, 176, 32, 11, 0, 9, 98, 146, 162, 162, + 240, 240, 20, 97, 50, 65, 82, 34, 82, 34, 82, 41, + 34, 146, 146, 97, 49, 97, 65, 65, 100, 0, 11, 64, + 32, 11, 0, 10, 65, 146, 130, 145, 145, 240, 84, 97, + 50, 65, 82, 34, 82, 34, 82, 41, 34, 146, 146, 97, + 49, 97, 65, 65, 100, 0, 11, 64, 34, 11, 0, 10, + 17, 162, 131, 129, 33, 82, 65, 240, 36, 97, 50, 65, + 82, 34, 82, 34, 82, 41, 34, 146, 146, 97, 49, 97, + 65, 65, 100, 0, 11, 64, 32, 11, 0, 11, 34, 34, + 82, 34, 240, 240, 148, 97, 50, 65, 67, 34, 82, 34, + 82, 41, 34, 146, 146, 97, 49, 82, 65, 65, 100, 0, + 11, 64, 24, 9, 0, 7, 114, 115, 114, 145, 240, 148, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 86, 0, + 9, 32, 24, 8, 0, 7, 81, 98, 82, 97, 97, 212, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, + 8, 32, 25, 9, 0, 9, 50, 99, 97, 33, 50, 65, + 196, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 86, + 0, 9, 32, 24, 9, 0, 10, 18, 50, 34, 50, 240, + 100, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 85, + 0, 9, 48, 39, 12, 0, 10, 98, 65, 98, 18, 130, + 145, 18, 98, 50, 162, 118, 81, 66, 66, 67, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 49, 82, + 81, 65, 116, 0, 12, 80, 38, 15, 0, 15, 67, 33, + 129, 36, 0, 6, 36, 36, 114, 17, 49, 115, 66, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 70, 22, 0, 15, 32, 35, 12, 0, 10, + 82, 163, 177, 193, 193, 240, 100, 113, 65, 82, 66, 50, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 49, + 82, 81, 65, 116, 0, 12, 80, 35, 12, 0, 11, 50, + 147, 146, 145, 161, 240, 116, 113, 65, 82, 66, 50, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 49, 82, + 81, 65, 116, 0, 12, 80, 37, 12, 0, 11, 2, 162, + 162, 145, 33, 113, 65, 240, 68, 113, 65, 82, 66, 50, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 49, + 82, 81, 65, 116, 0, 12, 80, 35, 12, 0, 12, 36, + 33, 65, 36, 240, 240, 212, 113, 65, 82, 66, 50, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 49, 82, + 81, 65, 116, 0, 12, 80, 35, 12, 0, 12, 34, 50, + 82, 50, 240, 240, 196, 113, 65, 82, 66, 50, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 49, 82, 81, + 65, 116, 0, 12, 80, 23, 24, 0, 31, 19, 240, 99, + 240, 99, 0, 13, 79, 7, 0, 16, 51, 240, 99, 240, + 99, 0, 22, 64, 35, 12, 0, 19, 116, 33, 65, 66, + 66, 66, 50, 83, 34, 65, 18, 34, 49, 34, 34, 33, + 50, 34, 17, 66, 35, 82, 50, 66, 66, 65, 65, 36, + 0, 12, 80, 38, 15, 0, 13, 65, 226, 226, 225, 241, + 240, 132, 52, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 67, 98, 49, 18, + 116, 36, 0, 15, 32, 38, 15, 0, 14, 18, 210, 194, + 193, 240, 240, 132, 52, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 67, 98, + 49, 18, 116, 36, 0, 15, 32, 41, 15, 0, 13, 113, + 210, 209, 17, 177, 49, 145, 81, 240, 84, 52, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 98, 67, 98, 49, 18, 116, 36, 0, 15, 32, + 38, 15, 0, 15, 50, 50, 130, 50, 0, 6, 36, 67, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 67, 98, 49, 18, 116, 36, 0, + 15, 32, 42, 15, 0, 14, 34, 195, 194, 193, 240, 240, + 118, 37, 67, 81, 114, 81, 114, 65, 146, 49, 146, 49, + 146, 33, 178, 17, 178, 17, 179, 210, 210, 210, 209, 225, + 146, 34, 146, 33, 179, 240, 240, 160, 43, 13, 0, 11, + 82, 148, 178, 178, 178, 178, 178, 36, 82, 17, 35, 67, + 66, 67, 66, 66, 82, 66, 81, 82, 66, 82, 65, 98, + 50, 98, 49, 114, 18, 131, 162, 178, 178, 178, 178, 162, + 240, 240, 96, 43, 15, 0, 17, 50, 50, 130, 50, 240, + 240, 70, 52, 82, 81, 114, 81, 115, 49, 146, 49, 146, + 49, 147, 17, 178, 17, 178, 17, 179, 210, 210, 209, 225, + 161, 49, 147, 33, 147, 17, 179, 240, 240, 160, +}; + +//***************************************************************************** +// +// The glyph offset table for the 26 point Oldstandard font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard26[] = +{ + 0, 5, 29, 46, 87, 156, 214, 263, + 274, 303, 333, 360, 409, 423, 430, 440, + 470, 511, 536, 571, 605, 637, 672, 711, + 739, 779, 818, 833, 852, 900, 913, 961, + 993, 1057, 1097, 1137, 1176, 1217, 1259, 1296, + 1342, 1384, 1409, 1438, 1481, 1512, 1580, 1633, + 1674, 1706, 1759, 1803, 1845, 1892, 1933, 1976, + 2042, 2086, 2128, 2163, 2193, 2223, 2253, 2276, + 2284, 2295, 2327, 2365, 2390, 2428, 2454, 2481, + 2520, 2558, 2581, 2612, 2648, 2673, 2718, 2750, + 2779, 2816, 2854, 2877, 2904, 2931, 2963, 2989, + 3031, 3059, 3095, 3121, 3150, 3178, 3207, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3225, 3230, 3252, 3293, 3329, 3360, 3393, 3416, + 3459, 3469, 3528, 3549, 3573, 3586, 3593, 3657, + 3665, 3684, 3723, 3745, 3769, 3780, 3820, 3869, + 3879, 3890, 3908, 3930, 3955, 4006, 4059, 4116, + 4147, 4195, 4246, 4297, 4343, 4390, 4440, 4497, + 4544, 4595, 4642, 4692, 4741, 4769, 4798, 4828, + 4858, 4899, 4957, 5007, 5054, 5103, 5148, 5195, + 5230, 5283, 5332, 5382, 5433, 5480, 5530, 5563, + 5608, 5647, 5685, 5725, 5763, 5801, 5841, 5878, + 5908, 5940, 5972, 6006, 6038, 6062, 6086, 6111, + 6135, 6174, 6212, 6247, 6282, 6319, 6354, 6389, + 6412, 6447, 6485, 6523, 6564, 6602, 6644, 6687, +}; + +//***************************************************************************** +// +// The font definition for the 26 point Oldstandard font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard26 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 25, + + // + // The height of the font. + // + 33, + + // + // The baseline of the font. + // + 25, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard26, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard26Data +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard26b.c b/third_party/fonts/ofl/fonts/fontoldstandard26b.c new file mode 100644 index 0000000..fb8ff6b --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard26b.c @@ -0,0 +1,807 @@ +//***************************************************************************** +// +// fontoldstandard26b.c - Font definition for the 26pt Oldstandard bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 26 point +// Bold: yes +// Italic: no +// Memory usage: 7252 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 26 point Oldstandard bold font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard26bData[7050] = +{ + 5, 10, 0, 41, 32, 25, 6, 240, 240, 210, 52, 36, + 36, 36, 36, 50, 66, 66, 66, 66, 66, 65, 240, 34, + 52, 36, 50, 240, 240, 240, 19, 9, 0, 7, 115, 19, + 35, 19, 35, 19, 35, 19, 49, 49, 65, 49, 0, 22, + 112, 43, 17, 0, 15, 66, 66, 146, 66, 145, 81, 161, + 81, 146, 66, 95, 98, 66, 146, 66, 145, 81, 161, 81, + 146, 66, 146, 66, 146, 66, 111, 82, 66, 145, 81, 161, + 81, 146, 66, 146, 66, 0, 15, 96, 69, 15, 0, 10, + 1, 33, 177, 33, 166, 131, 33, 18, 81, 33, 33, 49, + 50, 33, 33, 49, 50, 33, 33, 34, 51, 17, 33, 19, + 53, 33, 18, 85, 17, 135, 152, 151, 129, 21, 67, 17, + 37, 51, 17, 33, 19, 35, 33, 33, 34, 49, 49, 33, + 34, 49, 49, 33, 33, 82, 17, 33, 17, 134, 161, 33, + 177, 33, 0, 10, 16, 60, 20, 0, 17, 100, 114, 98, + 34, 97, 99, 35, 66, 99, 35, 65, 115, 35, 49, 131, + 35, 49, 131, 35, 33, 162, 34, 49, 180, 49, 240, 50, + 36, 193, 34, 34, 161, 35, 34, 161, 35, 35, 129, 51, + 35, 129, 51, 35, 113, 67, 35, 98, 67, 35, 97, 98, + 34, 97, 132, 0, 18, 50, 20, 0, 18, 36, 242, 49, + 211, 49, 211, 49, 211, 49, 212, 17, 244, 240, 35, 240, + 20, 54, 97, 35, 67, 82, 66, 66, 82, 83, 49, 98, + 99, 33, 83, 99, 17, 99, 101, 99, 115, 116, 100, 49, + 52, 70, 17, 102, 52, 0, 18, 13, 5, 240, 240, 83, + 35, 35, 35, 49, 65, 0, 12, 112, 30, 9, 0, 8, + 66, 98, 98, 113, 114, 98, 114, 114, 99, 99, 99, 99, + 99, 99, 99, 99, 114, 114, 114, 130, 129, 145, 130, 145, + 240, 80, 30, 9, 0, 7, 114, 130, 130, 129, 130, 130, + 114, 114, 115, 99, 99, 99, 99, 99, 99, 99, 98, 114, + 113, 114, 113, 113, 113, 113, 240, 176, 27, 11, 0, 10, + 3, 131, 82, 19, 18, 34, 33, 19, 65, 18, 131, 83, + 17, 19, 34, 33, 34, 83, 131, 131, 0, 21, 32, 51, + 24, 0, 22, 34, 240, 114, 240, 114, 240, 114, 240, 114, + 240, 114, 240, 114, 240, 114, 240, 114, 240, 114, 240, 114, + 207, 7, 194, 240, 114, 240, 114, 240, 114, 240, 114, 240, + 114, 240, 114, 240, 114, 240, 114, 240, 114, 240, 114, 0, + 10, 64, 15, 7, 0, 19, 51, 53, 37, 52, 97, 97, + 81, 81, 66, 240, 64, 9, 9, 0, 20, 39, 39, 0, + 14, 112, 11, 6, 0, 16, 82, 52, 36, 50, 240, 240, + 240, 31, 11, 0, 10, 66, 146, 146, 145, 146, 146, 146, + 130, 146, 146, 145, 146, 146, 145, 146, 146, 146, 130, 146, + 146, 145, 146, 146, 146, 130, 240, 80, 42, 14, 0, 12, + 100, 146, 34, 114, 66, 83, 67, 67, 67, 67, 67, 52, + 68, 36, 68, 36, 68, 36, 68, 36, 68, 36, 68, 36, + 68, 51, 67, 67, 67, 67, 67, 82, 66, 114, 34, 148, + 0, 13, 25, 10, 0, 9, 34, 115, 70, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 72, 0, 9, 39, 13, 0, 11, 101, 99, 36, 66, 67, + 51, 68, 36, 52, 36, 52, 37, 36, 51, 36, 132, 147, + 146, 161, 177, 113, 49, 129, 52, 66, 43, 33, 39, 49, + 54, 49, 68, 0, 11, 112, 36, 14, 0, 12, 85, 115, + 36, 67, 68, 51, 68, 52, 52, 52, 52, 163, 163, 132, + 227, 195, 179, 67, 68, 36, 68, 36, 68, 36, 68, 35, + 68, 67, 51, 117, 0, 13, 33, 15, 0, 14, 3, 180, + 180, 165, 165, 150, 145, 20, 130, 20, 129, 36, 114, 36, + 113, 52, 98, 52, 97, 68, 93, 132, 180, 180, 180, 137, + 0, 13, 64, 37, 13, 0, 11, 65, 82, 87, 102, 116, + 145, 193, 193, 21, 98, 51, 81, 83, 65, 83, 164, 148, + 51, 52, 37, 36, 36, 52, 35, 67, 51, 67, 67, 35, + 101, 0, 12, 16, 41, 14, 0, 12, 116, 130, 65, 98, + 82, 67, 52, 67, 52, 67, 164, 164, 20, 85, 36, 52, + 67, 52, 68, 36, 68, 36, 68, 36, 68, 51, 68, 51, + 67, 82, 67, 98, 35, 133, 0, 12, 112, 34, 13, 0, + 11, 49, 35, 49, 49, 21, 34, 40, 33, 43, 34, 129, + 33, 129, 49, 129, 177, 193, 177, 178, 163, 147, 163, 148, + 148, 148, 148, 162, 0, 12, 32, 41, 14, 0, 12, 85, + 130, 66, 82, 98, 51, 113, 51, 113, 52, 97, 53, 65, + 86, 17, 104, 136, 82, 23, 50, 69, 34, 100, 34, 130, + 34, 130, 34, 130, 50, 113, 82, 82, 102, 0, 12, 112, + 41, 14, 0, 12, 85, 131, 34, 99, 66, 68, 67, 52, + 67, 52, 68, 36, 68, 36, 68, 51, 68, 52, 37, 84, + 20, 164, 164, 67, 51, 68, 51, 68, 51, 66, 67, 97, + 51, 132, 0, 13, 16, 17, 6, 0, 9, 114, 52, 36, + 50, 240, 240, 66, 52, 36, 50, 240, 240, 240, 21, 6, + 0, 9, 114, 52, 36, 50, 240, 240, 51, 52, 36, 36, + 81, 81, 65, 65, 65, 240, 32, 50, 22, 0, 24, 19, + 240, 36, 240, 35, 240, 35, 240, 36, 240, 20, 240, 20, + 240, 35, 240, 35, 240, 36, 240, 35, 240, 68, 240, 84, + 240, 83, 240, 99, 240, 84, 240, 84, 240, 83, 240, 99, + 240, 84, 240, 84, 240, 82, 0, 8, 64, 13, 24, 0, + 45, 15, 7, 0, 15, 47, 7, 0, 33, 32, 50, 22, + 0, 22, 3, 240, 84, 240, 83, 240, 99, 240, 99, 240, + 84, 240, 84, 240, 83, 240, 99, 240, 84, 240, 83, 240, + 52, 240, 20, 240, 35, 240, 35, 240, 36, 240, 20, 240, + 35, 240, 35, 240, 36, 240, 20, 240, 50, 0, 10, 96, + 34, 10, 0, 9, 4, 81, 35, 49, 67, 33, 67, 33, + 67, 33, 66, 65, 35, 114, 114, 129, 129, 145, 49, 81, + 49, 99, 240, 50, 116, 100, 114, 0, 9, 32, 66, 21, + 0, 19, 38, 210, 98, 146, 146, 114, 67, 21, 82, 66, + 36, 18, 66, 50, 51, 49, 66, 35, 51, 50, 34, 51, + 51, 50, 34, 35, 67, 50, 34, 35, 67, 50, 34, 35, + 66, 66, 34, 35, 51, 50, 50, 35, 51, 50, 66, 19, + 33, 18, 34, 82, 36, 51, 130, 240, 82, 240, 83, 82, + 214, 0, 19, 64, 42, 20, 0, 18, 81, 240, 50, 240, + 51, 240, 20, 240, 20, 240, 21, 230, 225, 20, 225, 36, + 193, 52, 193, 52, 193, 68, 161, 84, 170, 161, 100, 129, + 116, 129, 116, 114, 117, 71, 41, 0, 17, 96, 42, 17, + 0, 14, 124, 116, 67, 100, 83, 84, 84, 68, 84, 68, + 84, 68, 84, 68, 83, 84, 67, 104, 148, 67, 100, 83, + 84, 84, 68, 84, 68, 84, 68, 84, 68, 83, 84, 67, + 76, 0, 15, 64, 42, 16, 0, 14, 84, 50, 83, 50, + 18, 67, 84, 51, 115, 51, 115, 51, 130, 36, 130, 36, + 145, 36, 196, 196, 196, 145, 36, 145, 51, 145, 51, 129, + 82, 129, 83, 98, 99, 66, 149, 0, 14, 96, 43, 19, + 0, 16, 92, 148, 82, 132, 99, 100, 114, 100, 115, 84, + 115, 84, 116, 68, 116, 68, 116, 68, 116, 68, 116, 68, + 116, 68, 116, 68, 115, 84, 115, 84, 114, 100, 98, 116, + 82, 108, 0, 17, 64, 44, 16, 0, 14, 14, 68, 83, + 68, 98, 68, 113, 68, 113, 68, 65, 33, 68, 65, 116, + 50, 116, 35, 121, 116, 50, 116, 65, 116, 65, 33, 68, + 113, 68, 113, 68, 98, 68, 98, 68, 83, 46, 0, 14, + 32, 39, 17, 0, 14, 127, 68, 84, 68, 99, 68, 114, + 68, 114, 68, 65, 34, 68, 65, 49, 68, 50, 132, 35, + 137, 132, 50, 132, 65, 132, 65, 132, 212, 212, 212, 212, + 185, 0, 15, 112, 45, 18, 0, 16, 53, 49, 115, 53, + 99, 99, 98, 130, 83, 130, 83, 145, 68, 145, 68, 228, + 228, 57, 36, 100, 68, 100, 68, 100, 83, 100, 83, 100, + 83, 100, 99, 66, 33, 114, 50, 49, 148, 65, 0, 16, + 32, 44, 20, 0, 17, 72, 40, 68, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 110, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 72, 40, 0, 17, 96, 25, 10, 0, + 8, 104, 68, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 72, 0, 9, 33, 14, + 0, 12, 89, 132, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 97, 52, 83, 36, 68, 36, 68, 36, 66, 68, 66, + 67, 97, 51, 133, 0, 13, 16, 44, 19, 0, 16, 88, + 38, 84, 83, 116, 82, 132, 81, 148, 65, 164, 49, 180, + 34, 180, 34, 180, 20, 169, 164, 36, 148, 36, 148, 52, + 132, 52, 132, 68, 116, 68, 116, 84, 100, 85, 56, 24, + 0, 16, 112, 33, 17, 0, 14, 120, 180, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 129, 68, 114, 68, 114, + 68, 114, 68, 99, 68, 99, 68, 84, 47, 0, 15, 16, + 66, 23, 0, 20, 23, 134, 84, 117, 116, 117, 117, 101, + 117, 81, 20, 117, 81, 20, 113, 20, 65, 20, 113, 20, + 65, 20, 113, 36, 33, 36, 113, 36, 33, 36, 113, 36, + 33, 36, 113, 52, 17, 36, 113, 53, 52, 113, 53, 52, + 113, 68, 52, 113, 67, 68, 113, 82, 68, 99, 66, 68, + 71, 34, 40, 0, 20, 48, 50, 20, 0, 17, 70, 87, + 54, 99, 101, 113, 133, 97, 134, 81, 134, 81, 129, 21, + 65, 129, 37, 49, 129, 37, 49, 129, 53, 33, 129, 69, + 17, 129, 86, 129, 86, 129, 101, 129, 116, 129, 131, 129, + 131, 115, 130, 87, 113, 0, 18, 16, 43, 17, 0, 15, + 69, 178, 50, 146, 82, 114, 114, 83, 115, 67, 115, 52, + 116, 36, 116, 36, 116, 36, 116, 36, 116, 36, 116, 36, + 116, 51, 115, 67, 115, 82, 114, 114, 82, 146, 50, 181, + 0, 15, 96, 34, 17, 0, 14, 124, 116, 67, 100, 83, + 84, 84, 68, 84, 68, 84, 68, 84, 68, 83, 84, 67, + 106, 116, 212, 212, 212, 212, 212, 212, 212, 185, 0, 15, + 112, 56, 17, 0, 15, 69, 178, 50, 146, 82, 114, 114, + 83, 115, 67, 115, 52, 116, 36, 116, 36, 116, 36, 116, + 36, 116, 36, 116, 36, 116, 51, 115, 67, 35, 35, 82, + 17, 34, 18, 115, 52, 130, 51, 33, 118, 49, 178, 49, + 178, 49, 179, 18, 182, 181, 211, 240, 96, 46, 19, 0, + 16, 91, 164, 52, 132, 67, 132, 68, 116, 68, 116, 68, + 116, 67, 132, 52, 136, 180, 51, 148, 67, 132, 68, 116, + 68, 116, 68, 116, 68, 33, 68, 68, 33, 68, 68, 33, + 68, 83, 17, 57, 52, 0, 17, 43, 14, 0, 12, 84, + 49, 66, 51, 17, 50, 99, 50, 114, 51, 98, 52, 97, + 53, 81, 70, 150, 151, 135, 49, 85, 49, 116, 33, 131, + 34, 130, 35, 114, 35, 113, 49, 34, 65, 65, 53, 0, + 12, 112, 41, 18, 0, 15, 111, 1, 36, 36, 36, 35, + 52, 51, 34, 68, 66, 34, 68, 66, 33, 84, 81, 33, + 84, 81, 33, 84, 81, 132, 228, 228, 228, 228, 228, 228, + 228, 228, 228, 186, 0, 16, 48, 44, 20, 0, 17, 72, + 55, 68, 115, 100, 129, 116, 129, 116, 129, 116, 129, 116, + 129, 116, 129, 116, 129, 116, 129, 116, 129, 116, 129, 116, + 129, 116, 129, 116, 129, 131, 129, 132, 97, 164, 65, 214, + 0, 18, 64, 42, 20, 0, 17, 73, 39, 69, 114, 116, + 113, 132, 113, 148, 97, 148, 81, 164, 81, 180, 65, 180, + 49, 196, 49, 212, 33, 212, 17, 230, 245, 244, 240, 35, + 240, 35, 240, 34, 240, 65, 0, 18, 96, 66, 28, 0, + 24, 73, 24, 23, 69, 84, 98, 116, 84, 97, 132, 100, + 81, 148, 84, 81, 148, 69, 65, 164, 65, 20, 49, 180, + 49, 20, 49, 180, 49, 20, 49, 180, 33, 52, 17, 212, + 17, 52, 17, 212, 17, 52, 17, 213, 70, 228, 84, 244, + 84, 244, 84, 240, 18, 114, 240, 34, 114, 240, 34, 114, + 0, 25, 80, 41, 20, 0, 17, 88, 38, 101, 67, 133, + 66, 164, 65, 181, 34, 196, 33, 229, 245, 240, 20, 240, + 21, 245, 246, 209, 36, 209, 37, 177, 68, 161, 85, 145, + 100, 130, 101, 71, 41, 0, 17, 96, 36, 19, 0, 16, + 88, 54, 69, 98, 116, 98, 117, 81, 148, 81, 148, 65, + 180, 49, 180, 34, 196, 17, 212, 17, 213, 244, 244, 244, + 244, 244, 244, 244, 216, 0, 17, 48, 38, 16, 0, 14, + 29, 52, 69, 51, 84, 66, 85, 65, 100, 81, 85, 81, + 69, 181, 165, 180, 181, 180, 181, 81, 84, 97, 69, 97, + 53, 98, 53, 83, 37, 84, 46, 0, 14, 32, 30, 8, + 0, 7, 6, 35, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 86, 240, 48, 30, 11, 0, 9, 82, 161, 162, 146, + 161, 162, 146, 161, 162, 146, 146, 161, 162, 146, 161, 162, + 146, 146, 161, 162, 146, 161, 162, 146, 146, 208, 30, 8, + 0, 7, 6, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 38, 240, 48, 24, 15, 0, 13, 113, 211, 195, 178, + 18, 147, 34, 130, 50, 114, 82, 98, 82, 82, 114, 50, + 146, 0, 30, 32, 8, 16, 0, 58, 14, 0, 6, 32, + 12, 7, 0, 6, 18, 83, 82, 98, 98, 0, 18, 80, + 34, 14, 0, 23, 20, 145, 35, 114, 51, 99, 35, 99, + 35, 164, 130, 19, 98, 51, 83, 51, 83, 51, 33, 35, + 51, 33, 35, 51, 33, 53, 20, 0, 12, 80, 40, 14, + 0, 12, 37, 179, 179, 179, 179, 179, 179, 19, 116, 34, + 100, 50, 83, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 66, 84, 50, 81, 33, 34, 97, 51, 0, + 12, 112, 28, 11, 0, 18, 36, 98, 49, 67, 50, 50, + 66, 35, 51, 35, 50, 51, 131, 131, 146, 81, 50, 81, + 66, 49, 100, 0, 10, 16, 39, 14, 0, 12, 117, 179, + 179, 179, 179, 179, 115, 19, 98, 36, 82, 52, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 82, 67, + 82, 52, 98, 36, 115, 21, 0, 12, 64, 27, 12, 0, + 19, 116, 114, 35, 66, 66, 66, 67, 35, 67, 35, 67, + 42, 35, 147, 162, 97, 50, 97, 66, 65, 101, 0, 11, + 30, 12, 0, 11, 20, 99, 34, 82, 35, 67, 35, 67, + 49, 83, 119, 115, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 119, 0, 11, 16, 40, 15, 0, 24, 101, 34, + 82, 51, 18, 51, 51, 18, 51, 51, 17, 67, 51, 99, + 51, 114, 50, 149, 130, 194, 218, 91, 106, 66, 99, 49, + 146, 49, 146, 49, 130, 82, 82, 134, 240, 96, 40, 15, + 0, 13, 21, 195, 195, 195, 195, 195, 195, 35, 115, 17, + 34, 100, 51, 83, 67, 83, 67, 83, 67, 83, 67, 83, + 67, 83, 67, 83, 67, 83, 67, 83, 67, 54, 37, 0, + 13, 48, 25, 8, 0, 7, 34, 84, 68, 82, 240, 84, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 70, + 0, 7, 32, 33, 10, 0, 9, 50, 116, 100, 114, 240, + 165, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 51, 19, 51, 19, 50, 35, 50, 34, 84, 240, + 38, 16, 0, 14, 5, 211, 211, 211, 211, 211, 211, 37, + 99, 66, 115, 65, 131, 49, 147, 33, 163, 18, 167, 148, + 19, 131, 35, 131, 51, 115, 52, 99, 52, 70, 23, 0, + 14, 32, 26, 9, 0, 7, 117, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 71, 0, 8, 16, 48, 21, 0, 34, 20, 35, 67, 99, + 17, 34, 33, 34, 84, 52, 51, 68, 51, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 53, 37, + 37, 0, 18, 80, 34, 14, 0, 22, 100, 35, 99, 17, + 34, 84, 51, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 53, 37, 0, + 12, 64, 31, 12, 0, 19, 116, 114, 34, 82, 66, 66, + 66, 51, 67, 35, 67, 35, 67, 35, 67, 35, 67, 50, + 66, 66, 66, 82, 34, 116, 0, 11, 16, 38, 14, 0, + 22, 101, 19, 116, 34, 100, 50, 83, 66, 83, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 68, 50, 84, + 34, 99, 19, 115, 179, 179, 179, 179, 151, 240, 96, 38, + 13, 0, 21, 67, 49, 82, 33, 33, 66, 52, 51, 67, + 51, 67, 51, 67, 51, 67, 51, 67, 51, 67, 51, 67, + 66, 52, 82, 36, 99, 19, 163, 163, 163, 163, 163, 134, + 240, 26, 11, 0, 17, 116, 34, 67, 17, 18, 52, 19, + 52, 19, 51, 49, 67, 131, 131, 131, 131, 131, 131, 118, + 0, 10, 32, 29, 11, 0, 18, 19, 33, 65, 51, 50, + 66, 50, 81, 51, 148, 133, 117, 49, 68, 34, 82, 34, + 82, 35, 65, 49, 36, 0, 10, 16, 30, 11, 0, 11, + 65, 161, 161, 146, 131, 104, 83, 131, 131, 131, 131, 131, + 131, 49, 67, 49, 67, 49, 67, 49, 67, 33, 100, 0, + 10, 16, 34, 15, 0, 24, 53, 37, 83, 67, 83, 67, + 83, 67, 83, 67, 83, 67, 83, 67, 83, 67, 83, 67, + 83, 67, 83, 52, 98, 33, 19, 115, 36, 0, 13, 48, + 28, 14, 0, 22, 102, 36, 67, 66, 83, 65, 100, 49, + 115, 49, 115, 33, 147, 17, 147, 17, 148, 179, 179, 178, + 209, 0, 13, 16, 43, 21, 0, 34, 22, 22, 36, 67, + 67, 66, 83, 67, 65, 100, 52, 49, 115, 52, 49, 115, + 52, 33, 147, 17, 20, 17, 147, 17, 35, 17, 148, 52, + 179, 52, 179, 66, 194, 82, 209, 82, 0, 19, 32, 29, + 15, 0, 24, 54, 21, 83, 65, 116, 49, 131, 33, 164, + 180, 195, 196, 161, 19, 161, 35, 129, 52, 98, 52, 70, + 22, 0, 13, 48, 37, 14, 0, 22, 102, 36, 52, 66, + 83, 65, 99, 65, 115, 49, 115, 33, 132, 17, 147, 17, + 148, 179, 179, 179, 193, 209, 146, 33, 131, 17, 147, 17, + 147, 17, 163, 240, 128, 29, 12, 0, 19, 89, 50, 52, + 49, 67, 65, 51, 81, 36, 131, 132, 131, 49, 68, 49, + 52, 65, 51, 66, 36, 51, 42, 0, 10, 96, 31, 11, + 0, 9, 3, 99, 115, 131, 131, 131, 131, 131, 131, 131, + 131, 115, 99, 163, 147, 131, 131, 131, 131, 131, 131, 131, + 131, 147, 163, 240, 144, 29, 4, 240, 210, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 96, 31, 11, + 0, 8, 35, 163, 146, 147, 131, 131, 131, 131, 131, 131, + 131, 147, 163, 99, 115, 131, 131, 131, 131, 131, 131, 131, + 131, 115, 99, 240, 240, 18, 17, 0, 36, 37, 113, 56, + 97, 33, 55, 49, 33, 104, 49, 117, 0, 23, 96, 5, + 10, 0, 41, 32, 23, 6, 0, 9, 114, 52, 36, 50, + 240, 17, 82, 66, 66, 66, 66, 66, 52, 36, 36, 36, + 36, 50, 144, 45, 12, 0, 15, 81, 177, 177, 149, 98, + 17, 18, 67, 17, 18, 66, 33, 19, 35, 33, 18, 51, + 33, 99, 33, 99, 33, 99, 33, 49, 50, 33, 49, 50, + 33, 33, 82, 17, 33, 101, 145, 177, 177, 0, 6, 96, + 37, 18, 0, 16, 101, 179, 65, 147, 82, 116, 67, 116, + 67, 116, 228, 198, 247, 180, 228, 243, 243, 243, 242, 113, + 52, 18, 97, 49, 52, 81, 65, 57, 100, 52, 0, 16, + 64, 33, 14, 0, 19, 34, 22, 18, 51, 67, 66, 98, + 50, 129, 50, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 50, 98, 67, 67, 50, 22, 18, 0, 17, 96, 34, 16, + 0, 14, 7, 52, 53, 82, 84, 81, 101, 65, 116, 49, + 132, 49, 148, 17, 164, 17, 180, 140, 132, 196, 140, 132, + 196, 196, 196, 196, 153, 0, 14, 80, 23, 4, 240, 210, + 34, 34, 34, 34, 34, 34, 34, 34, 240, 114, 34, 34, + 34, 34, 34, 34, 34, 34, 224, 48, 14, 0, 12, 101, + 114, 66, 97, 98, 66, 83, 66, 68, 66, 67, 83, 181, + 152, 81, 39, 65, 70, 49, 101, 34, 130, 37, 97, 54, + 65, 71, 17, 104, 149, 179, 83, 66, 68, 66, 67, 82, + 66, 97, 98, 66, 117, 240, 80, 13, 10, 0, 10, 3, + 35, 35, 35, 35, 35, 0, 27, 96, 67, 21, 0, 19, + 23, 195, 83, 146, 51, 50, 113, 66, 35, 33, 82, 50, + 66, 34, 65, 66, 66, 49, 50, 51, 81, 50, 33, 67, + 81, 65, 33, 67, 161, 33, 67, 161, 33, 67, 81, 65, + 33, 67, 81, 65, 33, 82, 81, 50, 49, 66, 65, 65, + 66, 66, 49, 50, 81, 84, 65, 114, 146, 147, 83, 199, + 0, 19, 48, 25, 10, 0, 9, 3, 97, 34, 82, 18, + 82, 18, 100, 82, 18, 67, 18, 17, 35, 18, 17, 54, + 56, 0, 20, 32, 28, 9, 0, 16, 17, 113, 49, 50, + 33, 51, 18, 51, 18, 51, 18, 51, 18, 51, 18, 66, + 33, 66, 33, 82, 33, 0, 9, 32, 14, 15, 0, 28, + 29, 210, 210, 210, 210, 210, 210, 0, 20, 112, 9, 9, + 0, 20, 39, 39, 0, 14, 112, 67, 21, 0, 19, 23, + 195, 83, 146, 146, 113, 24, 65, 82, 51, 35, 34, 65, + 67, 35, 49, 50, 67, 35, 50, 33, 83, 34, 81, 33, + 85, 113, 33, 83, 34, 81, 33, 83, 35, 65, 33, 83, + 35, 65, 33, 83, 35, 17, 18, 49, 67, 35, 17, 17, + 66, 22, 35, 18, 81, 209, 114, 146, 147, 83, 199, 0, + 19, 48, 8, 9, 0, 10, 23, 0, 26, 16, 19, 10, + 0, 9, 4, 81, 65, 49, 97, 33, 97, 33, 97, 49, + 65, 84, 0, 24, 32, 41, 24, 0, 22, 34, 240, 114, + 240, 114, 240, 114, 240, 114, 240, 114, 240, 114, 240, 114, + 207, 7, 194, 240, 114, 240, 114, 240, 114, 240, 114, 240, + 114, 240, 114, 0, 10, 79, 7, 0, 18, 32, 25, 10, + 0, 9, 5, 50, 51, 34, 51, 35, 35, 99, 98, 113, + 65, 49, 81, 40, 33, 22, 33, 51, 0, 19, 16, 27, + 10, 0, 9, 4, 66, 50, 50, 51, 35, 35, 50, 35, + 114, 83, 147, 131, 35, 35, 34, 51, 34, 35, 69, 0, + 16, 96, 11, 7, 0, 6, 66, 67, 66, 66, 66, 0, + 19, 43, 16, 0, 26, 17, 97, 115, 67, 99, 67, 99, + 67, 99, 67, 99, 67, 98, 83, 113, 98, 49, 49, 97, + 65, 49, 97, 50, 49, 87, 50, 50, 20, 65, 20, 51, + 65, 241, 242, 227, 211, 211, 226, 192, 54, 15, 0, 13, + 74, 69, 34, 86, 34, 71, 34, 71, 34, 71, 34, 71, + 34, 71, 34, 86, 34, 101, 34, 131, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 240, + 240, 64, 11, 6, 0, 11, 50, 52, 36, 50, 0, 10, + 112, 11, 7, 0, 23, 1, 81, 114, 98, 82, 36, 160, + 18, 9, 0, 8, 34, 69, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 71, 0, 16, 24, 9, 0, 8, 19, 82, + 18, 51, 19, 35, 19, 35, 19, 35, 19, 35, 19, 50, + 18, 83, 71, 0, 18, 32, 28, 9, 0, 16, 17, 81, + 49, 81, 34, 66, 19, 50, 19, 50, 19, 50, 19, 50, + 19, 49, 34, 65, 34, 49, 34, 0, 9, 64, 52, 22, + 0, 19, 82, 146, 101, 145, 147, 129, 163, 114, 163, 113, + 179, 98, 179, 97, 195, 82, 66, 99, 81, 67, 99, 65, + 68, 71, 18, 68, 193, 65, 19, 178, 49, 35, 177, 65, + 35, 161, 73, 114, 131, 145, 147, 130, 147, 129, 135, 0, + 19, 64, 57, 21, 0, 18, 98, 145, 101, 145, 131, 129, + 147, 129, 147, 113, 163, 98, 163, 97, 179, 81, 52, 83, + 81, 18, 35, 67, 65, 34, 35, 39, 18, 35, 19, 161, + 66, 18, 162, 98, 177, 98, 177, 97, 65, 129, 97, 65, + 113, 103, 98, 97, 21, 97, 113, 35, 0, 18, 96, 58, + 23, 0, 20, 38, 130, 98, 51, 113, 115, 35, 97, 210, + 98, 163, 129, 211, 81, 243, 50, 163, 35, 49, 67, 66, + 51, 34, 67, 66, 35, 49, 68, 85, 49, 65, 19, 194, + 65, 19, 193, 65, 35, 177, 65, 51, 177, 73, 129, 147, + 146, 147, 145, 163, 129, 151, 0, 20, 48, 34, 10, 0, + 15, 50, 116, 100, 114, 240, 50, 113, 33, 97, 33, 97, + 33, 129, 130, 114, 130, 114, 49, 51, 65, 35, 65, 35, + 65, 35, 65, 51, 33, 84, 224, 53, 20, 240, 163, 240, + 35, 240, 51, 240, 65, 240, 81, 240, 240, 130, 240, 50, + 240, 51, 240, 20, 240, 20, 240, 21, 225, 20, 225, 20, + 225, 36, 193, 52, 193, 52, 193, 68, 161, 84, 170, 161, + 100, 129, 116, 129, 116, 114, 117, 70, 57, 0, 17, 96, + 53, 20, 240, 240, 18, 240, 35, 240, 34, 240, 34, 240, + 34, 240, 240, 145, 240, 50, 240, 51, 240, 20, 240, 20, + 240, 21, 230, 225, 20, 225, 36, 193, 52, 193, 52, 193, + 68, 161, 84, 170, 161, 100, 129, 116, 129, 116, 114, 117, + 71, 41, 0, 17, 96, 52, 20, 240, 210, 240, 51, 240, + 20, 242, 34, 209, 98, 240, 240, 81, 240, 50, 240, 51, + 240, 20, 240, 20, 240, 21, 230, 225, 20, 225, 36, 193, + 52, 193, 52, 193, 68, 161, 84, 170, 161, 100, 129, 116, + 129, 116, 114, 117, 71, 41, 0, 17, 96, 50, 20, 240, + 240, 33, 212, 33, 214, 209, 65, 0, 7, 33, 240, 50, + 240, 51, 240, 35, 240, 20, 240, 21, 245, 225, 20, 225, + 36, 194, 36, 193, 52, 193, 68, 162, 68, 170, 161, 100, + 129, 116, 129, 116, 114, 117, 71, 41, 0, 17, 96, 49, + 19, 240, 240, 211, 35, 179, 35, 179, 35, 0, 6, 66, + 240, 34, 240, 34, 240, 20, 244, 244, 225, 20, 209, 20, + 209, 20, 193, 52, 177, 52, 177, 52, 162, 68, 154, 145, + 84, 129, 116, 113, 116, 98, 116, 71, 40, 0, 16, 112, + 52, 20, 240, 196, 241, 65, 225, 65, 225, 65, 244, 240, + 240, 114, 240, 50, 240, 51, 240, 20, 240, 20, 240, 21, + 225, 20, 225, 20, 225, 21, 193, 52, 193, 52, 193, 53, + 161, 84, 170, 161, 100, 129, 116, 129, 116, 114, 117, 70, + 57, 0, 17, 96, 62, 27, 0, 24, 111, 1, 213, 84, + 213, 99, 193, 20, 114, 193, 20, 114, 177, 36, 65, 49, + 177, 36, 65, 225, 52, 50, 225, 52, 35, 209, 73, 209, + 68, 50, 193, 84, 65, 49, 138, 65, 49, 113, 100, 129, + 113, 100, 114, 97, 116, 114, 82, 116, 99, 67, 116, 84, + 39, 47, 1, 0, 23, 112, 48, 16, 0, 14, 84, 50, + 83, 50, 18, 67, 84, 51, 115, 51, 115, 51, 130, 36, + 130, 36, 145, 36, 196, 196, 196, 145, 36, 145, 51, 145, + 51, 129, 67, 129, 83, 97, 115, 66, 149, 193, 243, 242, + 226, 161, 50, 180, 240, 128, 49, 16, 240, 82, 227, 227, + 241, 240, 240, 174, 68, 83, 68, 98, 68, 113, 68, 113, + 68, 65, 33, 68, 65, 116, 50, 116, 35, 121, 116, 50, + 116, 65, 116, 65, 33, 68, 113, 68, 113, 68, 98, 68, + 98, 68, 83, 46, 0, 14, 32, 50, 16, 240, 162, 226, + 210, 210, 225, 240, 158, 68, 83, 68, 98, 68, 98, 68, + 113, 68, 65, 33, 68, 65, 116, 50, 116, 35, 121, 116, + 50, 116, 65, 33, 68, 65, 33, 68, 113, 68, 113, 68, + 98, 68, 98, 68, 83, 46, 0, 14, 32, 51, 16, 240, + 130, 211, 197, 162, 50, 240, 17, 240, 94, 68, 83, 68, + 98, 68, 113, 68, 113, 68, 65, 33, 68, 65, 116, 50, + 116, 35, 121, 116, 50, 116, 65, 116, 65, 33, 68, 113, + 68, 113, 68, 98, 68, 98, 68, 83, 46, 0, 14, 32, + 52, 16, 240, 240, 83, 51, 115, 51, 115, 51, 240, 240, + 110, 68, 83, 68, 98, 68, 113, 68, 113, 68, 65, 33, + 68, 65, 116, 50, 116, 35, 121, 116, 50, 116, 65, 116, + 65, 33, 68, 113, 68, 113, 68, 98, 68, 98, 68, 83, + 46, 0, 14, 32, 30, 11, 195, 131, 162, 161, 177, 240, + 25, 84, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 73, 0, 9, 112, 31, 11, + 240, 19, 131, 115, 129, 145, 240, 57, 68, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 89, 0, 9, 112, 29, 10, 210, 115, 116, 66, 66, + 240, 120, 68, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 72, 0, 9, 31, 10, + 240, 83, 35, 35, 35, 35, 35, 240, 120, 68, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 72, 0, 9, 43, 19, 0, 16, 92, 148, 82, + 132, 99, 100, 114, 100, 115, 84, 115, 84, 116, 68, 116, + 41, 68, 68, 116, 68, 116, 68, 116, 68, 116, 68, 115, + 84, 115, 84, 114, 100, 98, 116, 82, 108, 0, 17, 64, + 56, 20, 240, 195, 240, 23, 240, 19, 0, 8, 70, 87, + 54, 99, 101, 113, 133, 97, 134, 81, 134, 81, 129, 21, + 65, 129, 37, 49, 129, 37, 49, 129, 53, 33, 129, 69, + 17, 129, 86, 129, 86, 129, 101, 129, 116, 129, 131, 129, + 131, 115, 130, 87, 113, 0, 18, 16, 51, 17, 66, 242, + 243, 242, 240, 18, 240, 17, 240, 240, 21, 178, 50, 146, + 82, 114, 114, 83, 115, 67, 115, 52, 116, 36, 116, 36, + 116, 36, 116, 36, 116, 36, 116, 36, 116, 51, 115, 67, + 115, 82, 114, 114, 82, 146, 50, 181, 0, 15, 96, 49, + 17, 146, 243, 211, 226, 226, 241, 240, 240, 21, 178, 50, + 146, 82, 114, 114, 83, 115, 67, 115, 52, 116, 36, 116, + 36, 116, 36, 116, 36, 116, 36, 116, 36, 116, 51, 115, + 67, 115, 82, 114, 114, 82, 146, 50, 181, 0, 15, 96, + 51, 17, 113, 243, 227, 210, 18, 178, 50, 145, 113, 240, + 197, 178, 50, 146, 82, 114, 114, 83, 115, 67, 115, 52, + 116, 36, 116, 36, 116, 36, 116, 36, 116, 36, 116, 36, + 116, 51, 115, 67, 115, 82, 114, 114, 82, 146, 50, 181, + 0, 15, 96, 47, 17, 240, 115, 215, 211, 0, 7, 117, + 178, 50, 146, 82, 114, 114, 83, 115, 67, 115, 52, 116, + 36, 116, 36, 116, 36, 116, 36, 116, 36, 116, 36, 116, + 51, 115, 67, 115, 82, 114, 114, 82, 146, 50, 181, 0, + 15, 96, 50, 17, 240, 99, 35, 147, 35, 147, 35, 0, + 7, 85, 178, 50, 146, 82, 114, 114, 83, 115, 67, 115, + 52, 116, 36, 116, 36, 116, 36, 116, 36, 116, 36, 116, + 36, 116, 51, 115, 67, 115, 82, 114, 114, 82, 146, 50, + 181, 0, 15, 96, 39, 19, 0, 25, 81, 50, 195, 50, + 163, 82, 131, 114, 99, 146, 67, 178, 35, 213, 243, 244, + 227, 18, 210, 50, 178, 82, 146, 99, 114, 131, 82, 163, + 50, 195, 240, 33, 0, 12, 32, 54, 17, 0, 15, 69, + 65, 98, 50, 33, 98, 82, 17, 82, 99, 83, 100, 67, + 100, 52, 86, 36, 66, 20, 36, 50, 36, 36, 49, 52, + 36, 34, 52, 36, 18, 68, 38, 84, 52, 99, 68, 99, + 83, 98, 81, 18, 82, 97, 34, 50, 97, 69, 0, 15, + 96, 54, 20, 97, 240, 51, 240, 51, 240, 50, 240, 66, + 240, 65, 240, 248, 55, 68, 115, 100, 129, 116, 129, 116, + 129, 116, 129, 116, 129, 116, 129, 116, 129, 116, 129, 116, + 129, 116, 129, 116, 129, 116, 129, 116, 129, 131, 129, 132, + 97, 164, 65, 214, 0, 18, 64, 53, 20, 178, 240, 35, + 240, 34, 240, 34, 240, 49, 0, 6, 40, 55, 68, 115, + 100, 129, 116, 129, 116, 129, 116, 129, 116, 129, 116, 129, + 116, 129, 116, 129, 116, 129, 116, 129, 116, 129, 116, 129, + 116, 129, 131, 129, 132, 97, 164, 65, 214, 0, 18, 64, + 54, 20, 145, 240, 50, 240, 36, 240, 18, 18, 210, 66, + 0, 5, 120, 55, 68, 115, 100, 129, 116, 129, 116, 129, + 116, 129, 116, 129, 116, 129, 116, 129, 116, 129, 116, 129, + 116, 129, 116, 129, 116, 129, 116, 129, 131, 129, 132, 97, + 164, 65, 214, 0, 18, 64, 51, 20, 240, 163, 35, 195, + 35, 195, 35, 0, 8, 56, 55, 68, 115, 100, 129, 116, + 129, 116, 129, 116, 129, 116, 129, 116, 129, 116, 129, 116, + 129, 116, 129, 116, 129, 116, 129, 116, 129, 116, 129, 131, + 129, 132, 97, 164, 65, 214, 0, 18, 64, 52, 20, 240, + 240, 18, 240, 35, 240, 34, 240, 34, 0, 6, 24, 55, + 69, 99, 116, 98, 133, 81, 164, 81, 164, 66, 180, 49, + 196, 34, 212, 17, 228, 17, 229, 240, 20, 240, 20, 240, + 20, 240, 20, 240, 20, 240, 20, 240, 20, 232, 0, 18, + 48, 34, 17, 0, 14, 121, 164, 212, 218, 116, 67, 100, + 83, 84, 84, 68, 84, 68, 84, 68, 84, 68, 83, 84, + 67, 106, 116, 212, 212, 212, 212, 185, 0, 15, 112, 44, + 15, 0, 13, 100, 162, 34, 130, 51, 99, 51, 99, 51, + 99, 51, 99, 50, 115, 18, 147, 50, 115, 67, 83, 82, + 83, 83, 67, 83, 67, 83, 67, 83, 70, 35, 70, 34, + 85, 35, 53, 20, 0, 13, 96, 40, 14, 0, 12, 65, + 210, 195, 209, 225, 240, 164, 145, 35, 114, 51, 99, 35, + 99, 35, 149, 114, 35, 98, 51, 83, 51, 83, 51, 33, + 35, 51, 33, 35, 51, 18, 53, 20, 0, 12, 80, 40, + 14, 0, 13, 2, 194, 178, 193, 193, 240, 180, 145, 35, + 114, 51, 99, 35, 99, 35, 164, 130, 19, 98, 51, 83, + 51, 83, 51, 33, 35, 51, 33, 35, 51, 33, 53, 20, + 0, 12, 80, 42, 14, 0, 12, 98, 194, 180, 146, 33, + 129, 81, 240, 132, 145, 35, 114, 51, 99, 35, 99, 35, + 164, 130, 19, 98, 51, 83, 51, 83, 51, 33, 35, 51, + 33, 35, 51, 33, 53, 20, 0, 12, 80, 41, 14, 0, + 14, 35, 33, 134, 113, 50, 240, 240, 132, 145, 35, 114, + 51, 99, 35, 99, 35, 164, 130, 19, 98, 51, 83, 51, + 83, 51, 33, 35, 51, 33, 35, 51, 33, 53, 20, 0, + 12, 80, 42, 14, 0, 14, 19, 35, 99, 35, 99, 35, + 240, 240, 100, 145, 35, 114, 51, 99, 35, 99, 35, 164, + 130, 19, 98, 51, 83, 51, 83, 51, 33, 35, 51, 33, + 35, 51, 33, 53, 20, 0, 12, 80, 43, 14, 0, 12, + 83, 161, 49, 145, 49, 145, 49, 163, 240, 164, 145, 35, + 114, 51, 99, 35, 99, 35, 164, 130, 19, 98, 51, 83, + 51, 83, 51, 33, 35, 51, 33, 35, 51, 33, 53, 20, + 0, 12, 80, 40, 18, 0, 29, 83, 52, 113, 37, 34, + 82, 51, 66, 67, 35, 67, 51, 35, 67, 116, 67, 67, + 26, 50, 51, 147, 51, 147, 51, 97, 35, 51, 97, 35, + 52, 65, 69, 53, 0, 16, 32, 33, 11, 0, 18, 36, + 98, 49, 67, 65, 50, 66, 35, 51, 35, 50, 51, 131, + 131, 146, 81, 50, 81, 66, 50, 85, 113, 162, 178, 146, + 81, 50, 100, 240, 33, 12, 0, 10, 83, 147, 163, 178, + 177, 240, 100, 114, 35, 66, 66, 66, 67, 35, 67, 35, + 67, 42, 35, 147, 162, 97, 50, 97, 66, 65, 101, 0, + 11, 33, 12, 0, 11, 35, 147, 131, 130, 161, 240, 116, + 114, 35, 66, 66, 66, 67, 35, 67, 35, 67, 42, 35, + 147, 162, 97, 50, 97, 66, 65, 101, 0, 11, 35, 12, + 0, 11, 2, 148, 132, 114, 34, 81, 97, 240, 52, 114, + 35, 66, 66, 66, 67, 35, 67, 35, 67, 42, 35, 147, + 162, 97, 50, 97, 66, 65, 101, 0, 11, 34, 12, 0, + 12, 19, 35, 67, 35, 67, 35, 240, 244, 114, 35, 66, + 66, 66, 67, 35, 67, 35, 67, 42, 35, 147, 162, 97, + 50, 82, 66, 50, 101, 0, 11, 25, 8, 0, 7, 2, + 99, 98, 114, 240, 100, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 69, 0, 7, 32, 25, 8, 0, 7, + 66, 83, 82, 82, 240, 84, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 69, 0, 7, 48, 27, 9, 0, + 8, 18, 115, 82, 17, 66, 49, 145, 196, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 85, 0, 8, 32, + 27, 9, 0, 9, 3, 19, 35, 19, 35, 19, 240, 100, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 85, + 0, 8, 32, 38, 13, 0, 11, 84, 34, 101, 148, 129, + 19, 164, 163, 119, 82, 51, 67, 52, 50, 83, 35, 83, + 35, 83, 35, 83, 35, 83, 35, 83, 50, 82, 67, 51, + 82, 50, 117, 0, 12, 41, 14, 0, 14, 51, 49, 104, + 97, 51, 240, 240, 52, 35, 99, 17, 34, 84, 51, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 53, 37, 0, 12, 64, 37, 12, + 0, 10, 98, 162, 178, 178, 177, 240, 100, 114, 34, 82, + 66, 66, 66, 51, 67, 35, 67, 35, 67, 35, 67, 35, + 67, 50, 66, 66, 66, 82, 34, 116, 0, 11, 16, 37, + 12, 0, 11, 34, 162, 147, 130, 161, 240, 116, 114, 34, + 82, 66, 66, 66, 51, 67, 35, 67, 35, 67, 35, 67, + 35, 67, 50, 66, 66, 66, 82, 34, 116, 0, 11, 16, + 39, 12, 0, 11, 2, 162, 148, 114, 34, 82, 81, 240, + 52, 114, 34, 82, 66, 66, 66, 51, 67, 35, 67, 35, + 67, 35, 67, 35, 67, 50, 66, 66, 66, 82, 34, 116, + 0, 11, 16, 39, 12, 0, 11, 65, 83, 49, 86, 81, + 51, 240, 240, 20, 114, 34, 82, 66, 66, 66, 51, 67, + 35, 67, 35, 67, 35, 67, 35, 67, 50, 66, 66, 66, + 82, 34, 116, 0, 11, 16, 38, 12, 0, 12, 19, 35, + 67, 35, 67, 35, 240, 244, 114, 34, 82, 66, 66, 66, + 51, 67, 35, 67, 35, 67, 35, 67, 35, 67, 50, 66, + 66, 66, 82, 34, 116, 0, 11, 16, 27, 24, 0, 31, + 34, 240, 100, 240, 84, 240, 98, 0, 13, 79, 7, 0, + 16, 66, 240, 100, 240, 84, 240, 98, 0, 16, 64, 37, + 12, 0, 19, 116, 33, 66, 35, 66, 66, 66, 66, 51, + 52, 35, 33, 19, 35, 18, 19, 35, 17, 35, 36, 51, + 50, 66, 66, 66, 49, 18, 34, 65, 36, 0, 11, 16, + 40, 15, 0, 13, 66, 211, 210, 226, 240, 240, 133, 37, + 83, 67, 83, 67, 83, 67, 83, 67, 83, 67, 83, 67, + 83, 67, 83, 67, 83, 67, 83, 52, 98, 33, 19, 115, + 36, 0, 13, 48, 40, 15, 0, 14, 18, 195, 179, 194, + 240, 240, 117, 37, 83, 67, 83, 67, 83, 67, 83, 67, + 83, 67, 83, 67, 83, 67, 83, 67, 83, 67, 83, 52, + 98, 33, 19, 115, 36, 0, 13, 48, 42, 15, 0, 13, + 99, 195, 178, 18, 146, 50, 240, 240, 85, 37, 83, 67, + 83, 67, 83, 67, 83, 67, 83, 67, 83, 67, 83, 67, + 83, 67, 83, 67, 83, 52, 98, 33, 19, 115, 36, 0, + 13, 48, 42, 15, 0, 15, 35, 35, 115, 35, 115, 35, + 240, 240, 85, 37, 83, 67, 83, 67, 83, 67, 83, 67, + 83, 67, 83, 67, 83, 67, 83, 67, 83, 67, 83, 52, + 98, 33, 19, 115, 36, 0, 13, 48, 43, 14, 0, 13, + 34, 179, 163, 177, 193, 240, 118, 36, 52, 66, 83, 65, + 99, 65, 115, 49, 115, 33, 132, 17, 147, 17, 148, 179, + 179, 179, 193, 209, 146, 33, 131, 17, 147, 17, 147, 17, + 163, 240, 128, 43, 14, 0, 12, 97, 179, 149, 179, 179, + 179, 179, 36, 83, 17, 35, 68, 51, 67, 67, 67, 67, + 67, 67, 67, 66, 83, 51, 83, 50, 99, 49, 115, 33, + 133, 147, 179, 179, 179, 179, 178, 162, 240, 176, 44, 15, + 0, 15, 51, 35, 115, 35, 115, 35, 240, 240, 71, 36, + 67, 81, 99, 81, 115, 49, 131, 49, 147, 33, 147, 17, + 165, 180, 180, 194, 210, 210, 209, 177, 33, 163, 17, 147, + 17, 178, 17, 179, 240, 160, +}; + +//***************************************************************************** +// +// The glyph offset table for the 26 point Oldstandard bold font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard26b[] = +{ + 0, 5, 30, 49, 92, 161, 221, 271, + 284, 314, 344, 371, 422, 437, 446, 457, + 488, 530, 555, 594, 630, 663, 700, 741, + 775, 816, 857, 874, 895, 945, 958, 1008, + 1042, 1108, 1150, 1192, 1234, 1277, 1321, 1360, + 1405, 1449, 1474, 1507, 1551, 1584, 1650, 1700, + 1743, 1777, 1833, 1879, 1922, 1963, 2007, 2049, + 2115, 2156, 2192, 2230, 2260, 2290, 2320, 2344, + 2352, 2364, 2398, 2438, 2466, 2505, 2532, 2562, + 2602, 2642, 2667, 2700, 2738, 2764, 2812, 2846, + 2877, 2915, 2953, 2979, 3008, 3038, 3072, 3100, + 3143, 3172, 3209, 3238, 3269, 3298, 3329, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3347, 3352, 3375, 3420, 3457, 3490, 3524, 3547, + 3595, 3608, 3675, 3700, 3728, 3742, 3751, 3818, + 3826, 3845, 3886, 3911, 3938, 3949, 3992, 4046, + 4057, 4068, 4086, 4110, 4138, 4190, 4247, 4305, + 4339, 4392, 4445, 4497, 4547, 4596, 4648, 4710, + 4758, 4807, 4857, 4908, 4960, 4990, 5021, 5050, + 5081, 5124, 5180, 5231, 5280, 5331, 5378, 5428, + 5467, 5521, 5575, 5628, 5682, 5733, 5785, 5819, + 5863, 5903, 5943, 5985, 6026, 6068, 6111, 6151, + 6184, 6217, 6250, 6285, 6319, 6344, 6369, 6396, + 6423, 6461, 6502, 6539, 6576, 6615, 6654, 6692, + 6719, 6756, 6796, 6836, 6878, 6920, 6963, 7006, +}; + +//***************************************************************************** +// +// The font definition for the 26 point Oldstandard bold font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard26b = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 25, + + // + // The height of the font. + // + 33, + + // + // The baseline of the font. + // + 26, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard26b, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard26bData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard26i.c b/third_party/fonts/ofl/fonts/fontoldstandard26i.c new file mode 100644 index 0000000..5c6f2cf --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard26i.c @@ -0,0 +1,822 @@ +//***************************************************************************** +// +// fontoldstandard26i.c - Font definition for the 26pt Oldstandard italic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 26 point +// Bold: no +// Italic: yes +// Memory usage: 7428 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 26 point Oldstandard italic font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard26iData[7228] = +{ + 4, 10, 0, 40, 25, 9, 0, 8, 66, 99, 99, 99, + 99, 98, 114, 98, 114, 114, 113, 129, 129, 113, 240, 18, + 100, 98, 0, 8, 80, 18, 9, 0, 6, 114, 34, 50, + 34, 49, 49, 65, 49, 65, 49, 49, 49, 0, 23, 41, + 17, 0, 15, 113, 65, 161, 65, 177, 65, 162, 49, 177, + 65, 110, 113, 65, 177, 65, 161, 65, 177, 65, 162, 50, + 161, 65, 141, 97, 65, 177, 65, 162, 49, 177, 65, 162, + 50, 0, 16, 16, 68, 16, 0, 11, 49, 193, 17, 182, + 146, 17, 17, 18, 97, 33, 33, 33, 82, 33, 17, 49, + 82, 33, 17, 19, 82, 17, 33, 19, 84, 17, 181, 212, + 177, 35, 161, 17, 19, 83, 17, 17, 34, 83, 17, 17, + 34, 66, 33, 33, 34, 66, 33, 17, 50, 81, 33, 17, + 34, 99, 33, 18, 149, 177, 17, 209, 17, 0, 11, 32, + 59, 20, 0, 17, 1, 115, 130, 82, 34, 83, 82, 72, + 98, 65, 66, 113, 81, 65, 114, 65, 65, 130, 65, 50, + 146, 33, 50, 164, 50, 52, 177, 50, 33, 161, 50, 65, + 129, 66, 65, 114, 50, 81, 98, 66, 65, 113, 82, 65, + 97, 98, 49, 97, 114, 49, 81, 148, 0, 18, 16, 55, + 21, 0, 19, 115, 240, 18, 33, 240, 17, 65, 226, 49, + 241, 65, 241, 34, 244, 66, 148, 81, 18, 98, 34, 65, + 34, 82, 50, 49, 146, 66, 33, 147, 66, 17, 162, 83, + 163, 83, 65, 83, 82, 81, 98, 82, 65, 115, 49, 18, + 33, 149, 51, 0, 19, 48, 12, 5, 240, 240, 18, 50, + 49, 65, 65, 49, 0, 13, 31, 12, 0, 10, 2, 146, + 146, 146, 161, 161, 161, 177, 161, 177, 161, 177, 177, 162, + 161, 177, 177, 177, 177, 193, 177, 177, 193, 178, 240, 240, + 32, 31, 12, 0, 9, 113, 178, 177, 177, 193, 177, 177, + 177, 177, 177, 177, 162, 161, 177, 162, 161, 162, 161, 161, + 162, 161, 161, 161, 146, 240, 240, 64, 27, 12, 0, 11, + 2, 162, 162, 98, 33, 50, 35, 17, 19, 100, 130, 17, + 83, 17, 34, 50, 34, 34, 98, 162, 0, 21, 96, 49, + 24, 0, 22, 49, 240, 129, 240, 129, 240, 129, 240, 129, + 240, 129, 240, 129, 240, 129, 240, 129, 240, 129, 207, 7, + 209, 240, 129, 240, 129, 240, 129, 240, 129, 240, 129, 240, + 129, 240, 129, 240, 129, 240, 129, 240, 129, 0, 10, 64, + 14, 6, 0, 15, 114, 67, 51, 81, 65, 81, 65, 65, + 240, 128, 10, 10, 0, 22, 17, 54, 49, 0, 16, 16, + 10, 5, 0, 13, 98, 51, 34, 240, 240, 128, 31, 10, + 0, 8, 49, 145, 145, 129, 145, 145, 130, 129, 145, 130, + 129, 145, 145, 129, 145, 145, 129, 145, 145, 129, 145, 145, + 129, 145, 145, 240, 64, 41, 15, 0, 13, 116, 147, 49, + 115, 66, 83, 82, 82, 98, 67, 98, 67, 99, 35, 114, + 51, 114, 51, 99, 50, 115, 50, 115, 50, 99, 66, 99, + 66, 83, 97, 82, 114, 50, 148, 0, 14, 32, 24, 12, + 0, 11, 81, 161, 147, 117, 147, 146, 162, 147, 146, 162, + 162, 147, 146, 162, 147, 147, 146, 120, 0, 11, 37, 16, + 0, 14, 101, 146, 67, 113, 98, 97, 115, 84, 67, 98, + 83, 210, 210, 210, 210, 194, 194, 194, 113, 81, 129, 98, + 113, 81, 34, 65, 97, 54, 98, 52, 0, 14, 112, 35, + 15, 0, 13, 117, 145, 67, 97, 98, 99, 66, 99, 66, + 210, 179, 118, 146, 49, 226, 211, 195, 67, 83, 67, 82, + 65, 115, 81, 83, 98, 51, 133, 0, 14, 16, 32, 14, + 0, 13, 66, 179, 178, 178, 193, 193, 17, 161, 33, 145, + 34, 129, 34, 129, 50, 113, 51, 82, 66, 108, 115, 179, + 178, 194, 137, 0, 12, 96, 37, 15, 0, 11, 113, 97, + 114, 65, 134, 129, 225, 225, 225, 209, 20, 146, 50, 113, + 98, 97, 98, 210, 210, 67, 83, 67, 82, 83, 67, 81, + 98, 97, 82, 133, 0, 14, 32, 40, 14, 0, 13, 20, + 130, 65, 98, 66, 82, 67, 82, 178, 194, 20, 98, 17, + 50, 83, 82, 67, 82, 51, 98, 51, 98, 51, 98, 51, + 83, 66, 82, 82, 66, 98, 51, 132, 0, 13, 16, 31, + 13, 0, 11, 99, 65, 54, 49, 49, 51, 33, 49, 68, + 49, 129, 177, 177, 177, 177, 177, 178, 162, 163, 162, 163, + 163, 163, 163, 0, 12, 80, 40, 15, 0, 13, 117, 130, + 66, 98, 98, 82, 113, 82, 113, 82, 98, 83, 81, 100, + 49, 134, 114, 35, 113, 83, 81, 114, 81, 130, 65, 130, + 65, 129, 81, 114, 98, 66, 133, 0, 14, 16, 39, 14, + 0, 13, 4, 130, 50, 98, 82, 66, 98, 66, 98, 51, + 98, 51, 83, 51, 83, 66, 68, 66, 53, 84, 34, 194, + 178, 82, 82, 67, 66, 82, 66, 113, 50, 133, 0, 13, + 32, 15, 7, 0, 11, 83, 67, 67, 240, 240, 226, 83, + 66, 0, 6, 96, 20, 8, 0, 13, 51, 83, 83, 240, + 240, 210, 99, 83, 113, 97, 113, 97, 97, 240, 240, 16, + 50, 22, 0, 21, 81, 240, 66, 240, 51, 240, 35, 240, + 50, 240, 50, 240, 50, 240, 50, 240, 51, 240, 35, 240, + 50, 240, 67, 240, 98, 240, 114, 240, 114, 240, 114, 240, + 114, 240, 99, 240, 98, 240, 114, 240, 114, 240, 113, 0, + 8, 64, 13, 24, 0, 45, 15, 7, 0, 12, 47, 7, + 0, 33, 32, 50, 22, 0, 19, 34, 240, 98, 240, 114, + 240, 114, 240, 114, 240, 99, 240, 99, 240, 98, 240, 114, + 240, 114, 240, 114, 240, 82, 240, 50, 240, 50, 240, 51, + 240, 35, 240, 50, 240, 50, 240, 50, 240, 50, 240, 51, + 240, 50, 0, 10, 96, 31, 12, 0, 10, 117, 97, 66, + 65, 98, 49, 98, 50, 82, 146, 147, 131, 114, 145, 161, + 177, 49, 113, 33, 131, 240, 83, 147, 147, 0, 11, 80, + 67, 21, 0, 16, 86, 210, 99, 145, 162, 113, 83, 18, + 18, 81, 66, 51, 33, 66, 50, 67, 34, 49, 66, 66, + 65, 49, 50, 82, 65, 49, 50, 82, 65, 34, 50, 81, + 81, 49, 50, 66, 81, 49, 49, 82, 66, 49, 49, 67, + 65, 65, 50, 33, 18, 49, 97, 51, 52, 114, 240, 82, + 240, 83, 98, 214, 0, 19, 48, 42, 20, 0, 16, 113, + 240, 50, 240, 35, 240, 35, 240, 20, 245, 241, 19, 225, + 35, 210, 35, 209, 51, 193, 67, 178, 67, 185, 161, 99, + 146, 99, 145, 115, 129, 131, 114, 131, 72, 40, 0, 17, + 96, 42, 20, 0, 15, 91, 178, 98, 162, 114, 131, 114, + 131, 114, 130, 130, 130, 115, 115, 114, 131, 83, 152, 194, + 98, 147, 114, 131, 115, 114, 131, 114, 131, 99, 130, 114, + 131, 114, 114, 108, 0, 18, 64, 41, 18, 0, 14, 68, + 49, 130, 66, 17, 114, 99, 98, 114, 98, 145, 83, 145, + 82, 161, 67, 161, 67, 242, 243, 243, 243, 161, 67, 161, + 82, 145, 98, 129, 114, 114, 130, 82, 181, 0, 16, 112, + 43, 21, 0, 16, 59, 194, 98, 178, 114, 147, 114, 147, + 115, 130, 131, 130, 131, 115, 131, 115, 131, 114, 147, 114, + 146, 115, 146, 114, 147, 114, 146, 130, 130, 131, 130, 130, + 130, 146, 99, 124, 0, 19, 64, 45, 21, 0, 16, 62, + 146, 115, 146, 130, 131, 129, 147, 129, 146, 81, 49, 146, + 81, 195, 65, 211, 65, 216, 210, 66, 195, 65, 211, 65, + 65, 130, 81, 65, 130, 145, 131, 145, 130, 146, 130, 115, + 111, 0, 19, 16, 42, 21, 0, 16, 62, 146, 115, 146, + 130, 131, 129, 147, 129, 146, 81, 49, 146, 81, 195, 65, + 211, 65, 216, 210, 66, 195, 65, 211, 65, 210, 81, 210, + 240, 51, 240, 50, 240, 66, 240, 24, 0, 20, 48, 19, + 0, 15, 36, 65, 130, 66, 33, 114, 114, 114, 130, 98, + 146, 83, 161, 82, 161, 83, 240, 19, 240, 18, 240, 19, + 104, 35, 146, 83, 146, 83, 131, 98, 131, 98, 115, 114, + 113, 17, 130, 66, 33, 164, 65, 0, 17, 48, 44, 25, + 0, 19, 55, 56, 146, 131, 194, 131, 179, 130, 195, 130, + 194, 131, 194, 131, 179, 130, 195, 130, 205, 194, 130, 195, + 130, 195, 130, 194, 131, 194, 130, 195, 130, 194, 131, 194, + 131, 152, 40, 0, 22, 96, 25, 14, 0, 11, 23, 146, + 194, 179, 179, 178, 194, 179, 179, 178, 194, 179, 178, 194, + 194, 179, 178, 194, 152, 0, 13, 42, 19, 0, 15, 41, + 211, 240, 18, 240, 34, 240, 19, 240, 19, 240, 18, 240, + 34, 240, 19, 240, 18, 240, 34, 240, 19, 240, 19, 147, + 66, 163, 66, 148, 51, 146, 82, 177, 66, 212, 0, 18, + 32, 50, 24, 0, 18, 87, 55, 146, 131, 178, 114, 195, + 98, 211, 81, 242, 81, 240, 18, 50, 240, 19, 34, 240, + 35, 19, 240, 36, 18, 240, 34, 51, 243, 66, 242, 82, + 242, 83, 226, 98, 211, 98, 210, 115, 194, 115, 152, 40, + 0, 21, 96, 43, 19, 0, 14, 119, 226, 240, 34, 240, + 19, 240, 19, 240, 18, 240, 34, 240, 19, 240, 19, 240, + 18, 240, 34, 240, 19, 240, 18, 161, 98, 161, 98, 145, + 99, 145, 98, 146, 98, 115, 79, 0, 17, 16, 76, 27, + 0, 20, 118, 134, 145, 18, 113, 18, 193, 18, 113, 18, + 193, 18, 97, 19, 193, 18, 97, 18, 193, 34, 81, 34, + 193, 34, 81, 34, 193, 34, 65, 35, 178, 34, 65, 34, + 193, 50, 49, 50, 193, 50, 33, 51, 193, 50, 33, 51, + 177, 66, 17, 66, 193, 66, 17, 66, 193, 67, 67, 193, + 67, 67, 177, 82, 82, 179, 66, 82, 151, 33, 55, 0, + 24, 64, 55, 25, 0, 19, 53, 103, 147, 130, 195, 130, + 196, 113, 209, 18, 113, 193, 34, 113, 193, 35, 81, 209, + 50, 81, 194, 50, 81, 193, 67, 49, 209, 82, 49, 209, + 83, 33, 193, 114, 33, 193, 114, 17, 209, 116, 209, 131, + 193, 147, 179, 130, 167, 113, 0, 23, 16, 42, 18, 0, + 14, 69, 178, 66, 146, 98, 114, 114, 98, 131, 67, 131, + 66, 147, 51, 147, 51, 147, 50, 163, 35, 162, 51, 147, + 51, 147, 51, 146, 82, 130, 98, 115, 98, 114, 130, 66, + 196, 0, 17, 40, 20, 0, 15, 91, 178, 98, 162, 99, + 131, 99, 131, 99, 130, 115, 130, 114, 131, 99, 130, 98, + 168, 194, 240, 35, 240, 34, 240, 50, 240, 50, 240, 35, + 240, 34, 240, 50, 248, 0, 19, 56, 18, 0, 14, 69, + 178, 66, 146, 98, 114, 114, 98, 131, 67, 131, 66, 147, + 51, 147, 51, 147, 50, 163, 35, 162, 51, 147, 51, 147, + 51, 146, 82, 35, 50, 98, 17, 33, 35, 98, 17, 34, + 18, 131, 35, 197, 240, 18, 49, 179, 33, 195, 33, 212, + 0, 7, 80, 45, 20, 0, 15, 90, 194, 83, 162, 98, + 147, 98, 147, 98, 146, 114, 146, 99, 131, 83, 153, 178, + 81, 194, 97, 163, 98, 146, 99, 146, 99, 146, 99, 131, + 98, 49, 82, 114, 33, 98, 114, 33, 56, 83, 0, 18, + 40, 17, 0, 13, 85, 33, 114, 68, 98, 99, 97, 129, + 113, 129, 113, 129, 114, 243, 244, 229, 228, 228, 81, 146, + 82, 145, 82, 145, 82, 145, 83, 114, 65, 34, 82, 81, + 54, 0, 15, 96, 41, 18, 0, 13, 110, 67, 50, 51, + 50, 67, 66, 49, 83, 66, 49, 82, 81, 49, 98, 81, + 49, 83, 81, 146, 240, 18, 243, 243, 242, 240, 18, 243, + 243, 242, 240, 18, 243, 201, 0, 16, 112, 44, 22, 0, + 16, 88, 71, 98, 146, 131, 145, 146, 161, 146, 161, 131, + 146, 131, 145, 146, 161, 146, 161, 131, 145, 147, 145, 146, + 161, 146, 146, 131, 145, 147, 145, 162, 129, 178, 114, 194, + 82, 230, 0, 20, 112, 44, 20, 0, 15, 8, 40, 67, + 115, 115, 129, 131, 113, 147, 113, 147, 97, 163, 81, 179, + 81, 179, 65, 195, 49, 211, 49, 211, 33, 227, 17, 243, + 17, 244, 240, 19, 240, 35, 240, 34, 240, 49, 0, 19, + 80, 70, 29, 0, 21, 103, 40, 40, 67, 114, 115, 115, + 114, 114, 131, 114, 113, 147, 99, 98, 147, 84, 97, 163, + 81, 18, 81, 179, 65, 34, 81, 179, 65, 34, 65, 195, + 49, 50, 50, 195, 33, 66, 49, 211, 33, 66, 33, 227, + 17, 82, 18, 229, 82, 17, 244, 99, 240, 19, 115, 240, + 19, 114, 240, 34, 129, 240, 49, 145, 0, 27, 48, 53, + 25, 0, 19, 40, 56, 147, 115, 210, 114, 227, 97, 240, + 18, 81, 240, 34, 65, 240, 51, 33, 240, 82, 17, 240, + 99, 240, 130, 240, 116, 240, 82, 18, 240, 66, 35, 240, + 34, 66, 240, 33, 83, 241, 99, 226, 114, 196, 115, 137, + 41, 0, 22, 64, 44, 20, 0, 15, 8, 55, 83, 115, + 115, 113, 162, 98, 162, 97, 178, 81, 195, 49, 211, 33, + 242, 17, 240, 19, 240, 35, 240, 34, 240, 50, 240, 35, + 240, 35, 240, 34, 240, 50, 240, 35, 233, 0, 18, 112, + 37, 18, 0, 14, 12, 99, 99, 82, 115, 97, 115, 97, + 130, 113, 115, 227, 227, 242, 243, 227, 227, 227, 129, 99, + 113, 99, 129, 83, 130, 67, 130, 83, 115, 78, 0, 16, + 32, 31, 13, 0, 10, 69, 130, 162, 178, 178, 177, 178, + 178, 178, 177, 178, 178, 178, 162, 178, 178, 177, 178, 178, + 178, 177, 178, 178, 181, 240, 240, 64, 30, 11, 0, 8, + 33, 161, 177, 161, 161, 177, 161, 161, 177, 161, 161, 177, + 161, 161, 161, 177, 161, 161, 177, 161, 161, 177, 161, 161, + 177, 208, 31, 13, 0, 10, 69, 178, 178, 178, 177, 178, + 178, 178, 162, 178, 178, 177, 178, 178, 178, 177, 178, 178, + 178, 162, 178, 178, 178, 117, 240, 240, 64, 23, 13, 0, + 12, 1, 179, 146, 17, 145, 34, 113, 65, 98, 81, 81, + 98, 49, 129, 49, 145, 0, 26, 32, 8, 16, 0, 56, + 14, 0, 6, 32, 10, 4, 240, 209, 50, 34, 49, 0, + 10, 96, 37, 14, 0, 23, 36, 18, 98, 33, 18, 82, + 66, 83, 66, 82, 82, 82, 67, 66, 82, 82, 82, 82, + 67, 33, 34, 49, 18, 17, 65, 49, 17, 33, 68, 35, + 0, 12, 96, 38, 12, 0, 9, 20, 162, 162, 162, 161, + 162, 162, 162, 19, 82, 17, 34, 67, 65, 66, 82, 50, + 82, 34, 82, 50, 82, 50, 82, 50, 66, 66, 50, 82, + 50, 100, 0, 11, 48, 24, 11, 0, 18, 52, 98, 49, + 66, 50, 51, 50, 50, 146, 131, 130, 146, 161, 81, 66, + 49, 100, 0, 10, 32, 44, 15, 0, 12, 37, 209, 225, + 210, 210, 209, 210, 132, 18, 114, 33, 18, 98, 66, 114, + 66, 98, 82, 98, 67, 82, 82, 98, 82, 98, 67, 33, + 50, 49, 18, 17, 81, 49, 17, 33, 84, 35, 0, 13, + 96, 25, 11, 0, 18, 67, 98, 34, 66, 65, 50, 66, + 50, 65, 70, 66, 146, 146, 161, 81, 66, 49, 100, 0, + 10, 32, 34, 15, 0, 12, 51, 177, 49, 145, 50, 130, + 49, 145, 210, 210, 167, 162, 210, 210, 209, 210, 210, 210, + 209, 210, 210, 209, 210, 210, 210, 209, 210, 210, 240, 208, + 41, 14, 0, 23, 52, 18, 98, 33, 18, 82, 66, 98, + 66, 82, 82, 82, 66, 82, 82, 82, 82, 82, 67, 82, + 49, 17, 98, 51, 116, 18, 194, 178, 98, 66, 98, 50, + 113, 50, 148, 240, 128, 45, 14, 0, 10, 100, 194, 194, + 194, 193, 194, 194, 193, 50, 114, 33, 33, 98, 17, 49, + 99, 50, 97, 17, 50, 83, 50, 98, 66, 98, 50, 49, + 50, 50, 33, 50, 66, 33, 50, 66, 17, 66, 82, 0, + 12, 112, 31, 9, 0, 8, 66, 114, 240, 240, 178, 97, + 17, 81, 33, 65, 49, 65, 34, 114, 98, 114, 33, 65, + 49, 65, 33, 81, 17, 98, 0, 8, 64, 34, 14, 0, + 13, 51, 179, 0, 8, 19, 161, 33, 145, 49, 145, 34, + 194, 194, 178, 194, 194, 193, 194, 194, 194, 193, 130, 34, + 115, 33, 145, 34, 147, 240, 144, 42, 13, 0, 10, 4, + 178, 178, 177, 193, 178, 178, 177, 66, 82, 49, 18, 66, + 33, 34, 66, 33, 129, 49, 117, 130, 49, 114, 49, 49, + 49, 50, 33, 50, 50, 33, 50, 50, 17, 66, 66, 0, + 12, 30, 8, 0, 6, 36, 98, 98, 97, 113, 98, 98, + 97, 98, 98, 98, 97, 98, 98, 97, 49, 34, 33, 50, + 33, 50, 17, 82, 0, 7, 80, 56, 21, 0, 34, 51, + 51, 66, 81, 33, 33, 33, 34, 18, 65, 33, 17, 49, + 17, 50, 49, 34, 17, 49, 17, 50, 49, 35, 51, 50, + 115, 51, 50, 114, 66, 66, 99, 51, 50, 114, 66, 66, + 33, 66, 66, 65, 33, 81, 81, 81, 33, 66, 66, 83, + 0, 18, 112, 42, 15, 0, 24, 83, 51, 81, 33, 33, + 34, 65, 33, 17, 50, 49, 34, 17, 50, 49, 35, 50, + 115, 50, 114, 50, 115, 50, 33, 66, 66, 33, 66, 65, + 33, 81, 81, 33, 66, 83, 0, 13, 80, 29, 12, 0, + 20, 19, 114, 49, 82, 66, 51, 66, 50, 82, 50, 82, + 35, 82, 34, 82, 50, 82, 65, 66, 82, 34, 116, 0, + 11, 32, 43, 17, 0, 28, 35, 51, 113, 33, 33, 34, + 97, 33, 17, 50, 81, 35, 66, 81, 34, 82, 130, 82, + 130, 67, 114, 82, 130, 82, 130, 66, 130, 17, 34, 146, + 35, 162, 241, 242, 242, 242, 200, 240, 176, 38, 13, 0, + 21, 84, 33, 82, 33, 33, 66, 66, 82, 66, 66, 82, + 66, 67, 50, 82, 66, 82, 66, 67, 66, 49, 17, 97, + 51, 100, 18, 178, 177, 178, 178, 178, 120, 240, 32, 27, + 13, 0, 21, 51, 50, 65, 33, 21, 49, 33, 17, 18, + 49, 35, 113, 35, 162, 178, 162, 178, 178, 177, 178, 0, + 12, 80, 26, 11, 0, 18, 52, 97, 50, 65, 81, 65, + 66, 66, 162, 163, 66, 66, 50, 66, 49, 82, 49, 66, + 85, 0, 10, 32, 29, 9, 0, 8, 50, 114, 113, 114, + 114, 114, 86, 66, 114, 114, 113, 114, 114, 113, 49, 50, + 33, 66, 33, 66, 17, 99, 0, 8, 64, 42, 15, 0, + 24, 98, 82, 81, 17, 82, 65, 33, 66, 65, 49, 66, + 65, 34, 66, 114, 51, 98, 49, 17, 114, 51, 113, 49, + 18, 33, 65, 49, 18, 17, 81, 33, 33, 33, 83, 51, + 0, 13, 80, 34, 13, 0, 21, 66, 50, 66, 17, 51, + 49, 33, 66, 33, 49, 81, 33, 34, 81, 82, 65, 82, + 81, 82, 81, 81, 81, 97, 65, 113, 49, 132, 0, 12, + 32, 48, 19, 0, 31, 34, 82, 34, 66, 17, 82, 35, + 49, 33, 81, 66, 33, 49, 66, 81, 33, 34, 66, 81, + 82, 65, 97, 66, 66, 81, 82, 51, 81, 81, 67, 65, + 97, 49, 17, 66, 97, 33, 33, 50, 115, 67, 0, 17, + 64, 36, 15, 0, 24, 99, 67, 65, 49, 18, 33, 49, + 65, 17, 34, 49, 66, 50, 130, 209, 210, 210, 130, 50, + 65, 50, 35, 49, 65, 33, 33, 34, 67, 51, 0, 13, + 112, 45, 14, 0, 23, 18, 82, 50, 17, 82, 49, 33, + 81, 49, 49, 66, 49, 34, 66, 98, 66, 82, 66, 98, + 51, 97, 67, 97, 49, 18, 97, 33, 18, 115, 34, 194, + 178, 98, 66, 98, 50, 113, 50, 148, 240, 128, 27, 12, + 0, 19, 115, 33, 85, 33, 65, 51, 65, 97, 146, 131, + 115, 130, 145, 113, 49, 97, 67, 65, 65, 36, 0, 11, + 16, 31, 11, 0, 7, 113, 130, 129, 146, 146, 146, 146, + 146, 146, 145, 146, 145, 115, 161, 162, 146, 145, 146, 146, + 130, 146, 145, 161, 162, 177, 240, 240, 28, 3, 240, 49, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 128, + 32, 11, 0, 7, 81, 178, 161, 161, 146, 146, 130, 146, + 145, 146, 146, 161, 178, 114, 130, 145, 161, 146, 146, 146, + 146, 146, 145, 145, 130, 240, 240, 16, 17, 17, 0, 34, + 36, 129, 49, 52, 81, 33, 100, 49, 49, 132, 0, 25, + 112, 4, 10, 0, 40, 23, 9, 0, 15, 19, 99, 99, + 241, 129, 114, 113, 129, 114, 114, 114, 99, 98, 99, 99, + 99, 98, 240, 16, 39, 11, 0, 13, 17, 161, 161, 145, + 133, 82, 17, 17, 66, 33, 18, 50, 17, 19, 34, 33, + 98, 33, 98, 17, 114, 17, 113, 33, 49, 49, 17, 49, + 67, 33, 100, 129, 145, 0, 8, 42, 21, 0, 20, 20, + 242, 65, 210, 51, 209, 67, 194, 240, 66, 240, 50, 240, + 66, 231, 240, 55, 226, 240, 66, 240, 65, 240, 66, 129, + 86, 145, 50, 68, 82, 65, 65, 40, 100, 85, 0, 19, + 16, 33, 14, 0, 17, 66, 37, 33, 51, 67, 81, 113, + 65, 129, 65, 145, 49, 145, 49, 145, 49, 145, 49, 130, + 65, 113, 67, 67, 50, 37, 33, 0, 17, 96, 33, 18, + 0, 15, 118, 54, 82, 114, 114, 98, 131, 81, 162, 65, + 178, 49, 194, 33, 212, 227, 202, 179, 242, 202, 194, 243, + 242, 240, 18, 215, 0, 17, 16, 23, 3, 240, 49, 33, + 33, 33, 33, 33, 33, 33, 33, 240, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 176, 48, 14, 0, 13, 4, 145, + 65, 113, 82, 97, 97, 97, 67, 97, 66, 114, 195, 146, + 20, 97, 83, 81, 99, 65, 114, 66, 98, 67, 82, 83, + 65, 115, 33, 148, 194, 114, 50, 99, 65, 97, 97, 97, + 82, 113, 50, 147, 240, 128, 11, 9, 0, 10, 18, 50, + 34, 50, 0, 23, 112, 62, 21, 0, 16, 70, 210, 98, + 161, 162, 113, 68, 66, 81, 66, 50, 49, 81, 50, 81, + 65, 49, 66, 161, 49, 66, 161, 49, 51, 177, 33, 51, + 177, 33, 51, 177, 33, 66, 97, 65, 33, 66, 81, 65, + 65, 50, 81, 65, 65, 66, 49, 65, 97, 68, 66, 113, + 162, 146, 98, 214, 0, 19, 64, 22, 10, 0, 9, 20, + 82, 33, 66, 49, 65, 50, 65, 49, 81, 34, 17, 51, + 18, 55, 0, 21, 80, 25, 10, 0, 18, 1, 145, 33, + 66, 33, 66, 33, 66, 33, 82, 33, 82, 33, 97, 33, + 113, 33, 97, 0, 10, 112, 12, 14, 0, 22, 108, 209, + 209, 209, 209, 209, 0, 23, 10, 10, 0, 22, 17, 54, + 49, 0, 16, 16, 67, 21, 0, 16, 70, 210, 98, 161, + 162, 113, 24, 50, 81, 50, 66, 49, 81, 50, 67, 49, + 49, 66, 66, 65, 49, 66, 66, 65, 49, 70, 113, 33, + 66, 65, 97, 33, 66, 66, 81, 33, 66, 66, 81, 33, + 66, 66, 33, 17, 65, 50, 66, 17, 33, 65, 37, 51, + 17, 97, 194, 113, 162, 146, 98, 214, 0, 19, 64, 8, + 11, 0, 13, 105, 0, 29, 16, 25, 10, 0, 9, 20, + 82, 33, 66, 65, 50, 65, 34, 81, 34, 65, 50, 65, + 50, 49, 66, 49, 84, 0, 19, 48, 39, 24, 0, 25, + 33, 240, 129, 240, 129, 240, 129, 240, 129, 240, 129, 240, + 129, 223, 7, 193, 240, 129, 240, 129, 240, 129, 240, 129, + 240, 129, 240, 129, 0, 7, 95, 6, 0, 18, 48, 26, + 12, 0, 11, 19, 114, 34, 97, 66, 81, 66, 82, 49, + 161, 161, 146, 130, 146, 65, 65, 36, 97, 35, 0, 20, + 16, 25, 10, 0, 9, 20, 81, 50, 66, 49, 66, 49, + 129, 84, 161, 145, 50, 50, 50, 50, 49, 50, 84, 0, + 16, 112, 11, 6, 240, 240, 241, 66, 50, 49, 0, 16, + 48, 42, 15, 0, 24, 98, 81, 114, 66, 113, 82, 98, + 82, 98, 66, 114, 66, 98, 82, 98, 81, 114, 66, 49, + 33, 17, 66, 33, 49, 18, 20, 17, 65, 34, 50, 81, + 225, 225, 225, 226, 210, 210, 208, 52, 14, 0, 11, 8, + 69, 33, 85, 49, 85, 49, 70, 33, 86, 33, 85, 49, + 100, 49, 115, 33, 145, 49, 145, 49, 145, 49, 145, 33, + 145, 49, 145, 49, 145, 33, 161, 33, 145, 49, 145, 49, + 145, 33, 161, 33, 145, 49, 145, 49, 0, 6, 48, 10, + 6, 0, 11, 50, 52, 50, 0, 10, 112, 12, 7, 0, + 23, 17, 113, 49, 33, 33, 49, 51, 160, 18, 9, 0, + 8, 81, 114, 83, 114, 114, 113, 114, 114, 114, 113, 86, + 0, 16, 16, 22, 10, 0, 9, 35, 98, 33, 66, 49, + 65, 65, 65, 50, 50, 49, 81, 34, 83, 247, 0, 19, + 16, 25, 10, 0, 18, 1, 113, 33, 97, 34, 81, 49, + 97, 34, 66, 19, 65, 33, 81, 33, 81, 33, 129, 0, + 10, 112, 50, 21, 0, 19, 17, 113, 178, 113, 147, 113, + 178, 97, 194, 97, 193, 97, 194, 97, 194, 81, 82, 98, + 65, 98, 97, 81, 82, 70, 33, 81, 209, 81, 18, 177, + 65, 34, 161, 65, 49, 177, 57, 113, 130, 145, 146, 145, + 117, 0, 18, 112, 55, 21, 0, 19, 17, 113, 163, 113, + 162, 113, 178, 97, 194, 97, 193, 97, 194, 97, 36, 98, + 81, 33, 50, 82, 65, 33, 66, 81, 81, 33, 66, 38, + 33, 50, 50, 145, 130, 161, 113, 177, 98, 193, 66, 65, + 129, 67, 49, 129, 81, 36, 129, 81, 50, 0, 19, 54, + 21, 0, 18, 100, 113, 129, 65, 97, 130, 49, 81, 210, + 65, 164, 97, 210, 65, 241, 65, 146, 65, 49, 82, 50, + 50, 33, 98, 49, 50, 49, 82, 84, 49, 97, 193, 84, + 177, 65, 34, 161, 65, 49, 177, 57, 113, 130, 145, 146, + 145, 117, 0, 18, 112, 32, 12, 0, 20, 50, 163, 146, + 240, 83, 129, 49, 113, 49, 113, 49, 146, 131, 115, 130, + 146, 81, 66, 82, 50, 97, 50, 97, 66, 65, 101, 240, + 32, 51, 20, 240, 240, 50, 240, 50, 240, 65, 240, 81, + 240, 240, 145, 240, 50, 240, 35, 240, 35, 240, 20, 245, + 241, 19, 225, 35, 210, 35, 209, 51, 193, 67, 178, 67, + 185, 161, 99, 146, 99, 145, 115, 129, 131, 114, 131, 72, + 40, 0, 17, 96, 54, 22, 240, 240, 147, 240, 66, 240, + 65, 240, 81, 240, 240, 209, 240, 82, 240, 67, 240, 67, + 240, 52, 240, 37, 240, 33, 19, 240, 17, 35, 242, 35, + 241, 51, 225, 67, 210, 67, 217, 193, 99, 178, 99, 177, + 115, 161, 131, 146, 131, 104, 40, 0, 19, 96, 54, 21, + 240, 240, 98, 240, 52, 240, 17, 49, 226, 81, 240, 240, + 129, 240, 66, 240, 51, 240, 51, 240, 36, 240, 21, 240, + 17, 19, 241, 35, 226, 35, 225, 51, 209, 67, 194, 67, + 201, 177, 99, 162, 99, 161, 115, 145, 131, 130, 131, 88, + 40, 0, 18, 96, 51, 22, 240, 240, 83, 49, 225, 36, + 0, 10, 65, 240, 82, 240, 67, 240, 67, 240, 52, 240, + 37, 240, 33, 19, 240, 17, 35, 242, 35, 241, 51, 225, + 67, 210, 67, 217, 193, 99, 178, 99, 177, 115, 161, 131, + 146, 131, 104, 40, 0, 19, 96, 51, 22, 0, 7, 3, + 50, 227, 50, 0, 7, 81, 240, 82, 240, 67, 240, 67, + 240, 52, 240, 37, 240, 33, 19, 240, 17, 35, 242, 35, + 241, 51, 225, 67, 210, 67, 217, 193, 99, 178, 99, 177, + 115, 161, 131, 146, 131, 104, 40, 0, 19, 96, 52, 20, + 227, 240, 17, 49, 225, 65, 241, 49, 240, 19, 240, 240, + 129, 240, 50, 240, 35, 240, 35, 240, 20, 245, 241, 19, + 225, 35, 210, 35, 209, 51, 193, 67, 178, 67, 185, 161, + 99, 146, 99, 145, 115, 129, 131, 114, 131, 72, 40, 0, + 17, 96, 64, 30, 0, 24, 46, 240, 51, 114, 240, 36, + 114, 240, 17, 18, 145, 242, 18, 145, 241, 19, 240, 145, + 34, 81, 240, 49, 50, 81, 240, 34, 50, 66, 240, 18, + 56, 240, 33, 66, 66, 240, 17, 82, 81, 249, 81, 226, + 83, 145, 146, 98, 161, 145, 114, 145, 145, 115, 130, 130, + 114, 131, 87, 47, 0, 27, 50, 18, 0, 14, 68, 49, + 130, 66, 17, 114, 99, 98, 114, 98, 145, 83, 145, 82, + 161, 67, 161, 67, 242, 243, 243, 243, 161, 67, 161, 82, + 145, 98, 129, 114, 114, 130, 82, 181, 225, 240, 33, 240, + 49, 209, 49, 209, 34, 212, 240, 240, 54, 21, 240, 240, + 18, 240, 66, 240, 81, 240, 97, 240, 240, 78, 146, 115, + 146, 130, 131, 129, 147, 129, 146, 81, 49, 146, 81, 195, + 65, 211, 65, 216, 210, 66, 195, 65, 211, 65, 65, 130, + 81, 65, 130, 145, 131, 145, 130, 146, 130, 115, 111, 0, + 19, 16, 54, 21, 240, 240, 98, 240, 50, 240, 49, 240, + 65, 240, 240, 78, 146, 115, 146, 130, 131, 129, 147, 129, + 146, 81, 49, 146, 81, 195, 65, 211, 65, 216, 210, 66, + 195, 65, 211, 65, 65, 130, 81, 65, 130, 145, 131, 145, + 130, 146, 130, 115, 111, 0, 19, 16, 54, 21, 240, 240, + 65, 240, 67, 240, 18, 33, 226, 82, 240, 254, 146, 115, + 146, 130, 131, 129, 147, 129, 146, 81, 49, 146, 81, 195, + 65, 211, 65, 216, 210, 66, 195, 65, 211, 65, 65, 130, + 81, 65, 130, 145, 131, 145, 130, 146, 130, 115, 111, 0, + 19, 16, 51, 21, 0, 6, 51, 50, 211, 50, 0, 6, + 62, 146, 115, 146, 130, 131, 129, 147, 129, 146, 81, 49, + 146, 81, 195, 65, 211, 65, 216, 210, 66, 195, 65, 211, + 65, 65, 130, 81, 65, 130, 145, 131, 145, 130, 146, 130, + 115, 111, 0, 19, 16, 29, 14, 240, 82, 210, 209, 240, + 240, 135, 146, 194, 179, 179, 178, 194, 179, 179, 178, 194, + 179, 178, 194, 194, 179, 178, 194, 152, 0, 13, 29, 15, + 240, 178, 195, 178, 240, 240, 151, 162, 210, 195, 195, 194, + 210, 195, 195, 194, 210, 195, 194, 210, 210, 195, 194, 210, + 168, 0, 14, 31, 15, 240, 146, 195, 177, 49, 130, 81, + 240, 119, 162, 210, 195, 195, 194, 210, 195, 195, 194, 210, + 195, 194, 210, 210, 195, 194, 210, 168, 0, 14, 31, 16, + 240, 240, 130, 51, 130, 51, 240, 240, 151, 178, 226, 211, + 211, 210, 226, 211, 211, 210, 226, 211, 210, 226, 226, 211, + 210, 226, 184, 0, 15, 43, 21, 0, 16, 59, 194, 98, + 178, 114, 162, 114, 147, 115, 130, 131, 130, 131, 130, 131, + 115, 131, 73, 83, 114, 146, 115, 146, 115, 131, 114, 146, + 130, 130, 131, 130, 130, 130, 146, 99, 124, 0, 19, 64, + 62, 25, 240, 240, 115, 49, 240, 33, 36, 0, 10, 117, + 103, 147, 130, 195, 130, 196, 113, 209, 18, 113, 193, 34, + 113, 193, 35, 81, 209, 50, 81, 194, 50, 81, 193, 67, + 49, 209, 82, 49, 209, 83, 33, 193, 114, 33, 193, 114, + 17, 209, 116, 209, 131, 193, 147, 179, 130, 167, 113, 0, + 23, 16, 51, 18, 130, 240, 18, 240, 33, 240, 49, 240, + 33, 240, 240, 53, 178, 66, 146, 98, 114, 114, 98, 131, + 67, 131, 66, 147, 51, 147, 51, 147, 50, 163, 35, 162, + 51, 147, 51, 147, 51, 146, 82, 130, 98, 115, 98, 114, + 130, 66, 196, 0, 17, 49, 18, 225, 240, 18, 242, 242, + 240, 17, 240, 240, 37, 178, 66, 146, 98, 114, 114, 98, + 131, 67, 131, 66, 147, 51, 147, 51, 147, 50, 163, 35, + 162, 51, 147, 51, 147, 51, 146, 82, 130, 98, 115, 98, + 114, 130, 66, 196, 0, 17, 50, 18, 177, 240, 34, 241, + 17, 225, 49, 178, 81, 240, 229, 178, 66, 146, 98, 114, + 114, 98, 131, 67, 131, 66, 147, 51, 147, 51, 147, 50, + 163, 35, 162, 51, 147, 51, 147, 51, 146, 82, 130, 98, + 115, 98, 114, 130, 66, 196, 0, 17, 46, 18, 240, 180, + 240, 36, 0, 8, 21, 178, 66, 146, 98, 114, 114, 98, + 131, 67, 131, 66, 147, 51, 147, 51, 147, 50, 163, 35, + 162, 51, 147, 51, 147, 51, 146, 82, 130, 98, 115, 98, + 114, 130, 66, 196, 0, 17, 47, 18, 240, 178, 50, 178, + 50, 0, 8, 21, 178, 66, 146, 98, 114, 114, 98, 131, + 67, 131, 66, 147, 51, 147, 51, 147, 50, 163, 35, 162, + 51, 147, 51, 147, 51, 146, 82, 130, 98, 115, 98, 114, + 130, 66, 196, 0, 17, 38, 19, 0, 23, 98, 209, 66, + 178, 82, 146, 114, 114, 146, 82, 178, 50, 210, 18, 243, + 240, 19, 242, 18, 210, 50, 178, 82, 146, 114, 114, 146, + 82, 178, 50, 210, 0, 14, 64, 55, 20, 0, 16, 20, + 65, 146, 66, 17, 146, 99, 130, 114, 130, 130, 115, 101, + 98, 97, 35, 83, 81, 51, 83, 65, 67, 82, 65, 83, + 67, 49, 98, 83, 33, 99, 83, 33, 99, 83, 17, 114, + 115, 114, 130, 115, 131, 83, 129, 18, 66, 145, 68, 0, + 18, 112, 51, 22, 130, 240, 83, 240, 82, 240, 97, 0, + 7, 8, 71, 98, 146, 131, 145, 146, 161, 146, 161, 131, + 146, 131, 145, 146, 161, 146, 161, 131, 145, 147, 145, 146, + 161, 146, 146, 131, 145, 147, 145, 162, 129, 178, 114, 194, + 82, 230, 0, 20, 112, 51, 22, 226, 240, 66, 240, 66, + 240, 66, 0, 6, 104, 71, 98, 146, 131, 145, 146, 161, + 146, 161, 131, 146, 131, 145, 146, 161, 146, 161, 131, 145, + 147, 145, 146, 161, 146, 146, 131, 145, 147, 145, 162, 129, + 178, 114, 194, 82, 230, 0, 20, 112, 54, 22, 193, 240, + 82, 240, 65, 18, 240, 18, 49, 241, 240, 240, 120, 71, + 98, 146, 131, 145, 146, 161, 146, 161, 131, 146, 131, 145, + 146, 161, 146, 161, 131, 145, 147, 145, 146, 161, 146, 146, + 131, 145, 147, 145, 162, 129, 178, 114, 194, 82, 230, 0, + 20, 112, 49, 22, 240, 242, 51, 226, 51, 0, 9, 24, + 71, 98, 146, 131, 145, 146, 161, 146, 161, 131, 146, 131, + 145, 146, 161, 146, 161, 131, 145, 147, 145, 146, 161, 146, + 146, 131, 145, 147, 145, 162, 129, 178, 114, 194, 82, 230, + 0, 20, 112, 51, 20, 240, 240, 34, 240, 34, 240, 34, + 0, 6, 8, 55, 83, 115, 115, 113, 162, 98, 162, 97, + 178, 81, 195, 49, 211, 33, 242, 17, 240, 19, 240, 35, + 240, 34, 240, 50, 240, 35, 240, 35, 240, 34, 240, 50, + 240, 35, 233, 0, 18, 112, 39, 19, 0, 14, 120, 210, + 240, 34, 240, 19, 240, 25, 163, 82, 146, 99, 115, 114, + 115, 99, 114, 115, 114, 114, 115, 99, 115, 83, 137, 162, + 240, 19, 240, 18, 240, 34, 232, 0, 18, 52, 16, 0, + 13, 20, 162, 50, 130, 66, 130, 66, 114, 82, 114, 81, + 130, 50, 145, 34, 162, 65, 146, 66, 130, 66, 114, 82, + 114, 82, 114, 82, 113, 98, 98, 18, 49, 114, 18, 34, + 114, 17, 34, 129, 36, 130, 226, 226, 225, 226, 0, 5, + 96, 43, 14, 0, 12, 114, 194, 209, 225, 209, 240, 148, + 18, 98, 33, 18, 82, 66, 83, 66, 82, 82, 82, 67, + 66, 82, 82, 82, 82, 67, 33, 34, 49, 18, 17, 65, + 49, 17, 33, 68, 35, 0, 12, 96, 43, 14, 0, 13, + 66, 179, 162, 193, 240, 240, 116, 18, 98, 33, 18, 82, + 66, 83, 66, 82, 82, 82, 67, 66, 82, 82, 82, 82, + 67, 33, 34, 49, 18, 17, 65, 49, 17, 33, 68, 35, + 0, 12, 96, 45, 14, 0, 13, 33, 194, 177, 18, 145, + 49, 225, 240, 100, 18, 98, 33, 18, 82, 66, 83, 66, + 82, 82, 82, 67, 66, 82, 82, 82, 82, 67, 33, 34, + 49, 18, 17, 65, 49, 17, 33, 68, 35, 0, 12, 96, + 42, 14, 0, 14, 84, 33, 163, 0, 6, 20, 18, 98, + 33, 18, 82, 66, 83, 66, 82, 82, 82, 67, 66, 82, + 82, 82, 82, 67, 33, 34, 49, 18, 17, 65, 49, 17, + 33, 68, 35, 0, 12, 96, 43, 14, 0, 14, 67, 35, + 99, 35, 0, 6, 4, 18, 98, 33, 18, 82, 66, 83, + 66, 82, 82, 82, 67, 66, 82, 82, 82, 82, 67, 33, + 34, 49, 18, 17, 65, 49, 17, 33, 68, 35, 0, 12, + 96, 46, 14, 0, 13, 4, 161, 33, 145, 65, 145, 33, + 179, 240, 116, 18, 98, 33, 18, 82, 66, 83, 66, 82, + 82, 82, 67, 66, 82, 82, 82, 82, 67, 33, 34, 49, + 18, 17, 65, 49, 17, 33, 68, 35, 0, 12, 96, 42, + 18, 0, 29, 100, 18, 19, 98, 33, 19, 49, 66, 67, + 65, 51, 67, 65, 50, 82, 65, 66, 71, 66, 82, 146, + 82, 146, 67, 81, 50, 49, 18, 81, 65, 49, 33, 50, + 84, 68, 0, 16, 48, 30, 11, 0, 18, 52, 98, 49, + 66, 50, 51, 50, 50, 146, 131, 130, 146, 161, 81, 66, + 49, 100, 129, 161, 114, 18, 97, 34, 115, 240, 224, 31, + 11, 0, 10, 33, 162, 161, 161, 240, 240, 19, 98, 34, + 66, 65, 50, 66, 50, 65, 70, 66, 146, 146, 161, 81, + 66, 49, 100, 0, 10, 32, 31, 13, 0, 12, 81, 178, + 162, 162, 240, 240, 83, 130, 34, 98, 65, 82, 66, 82, + 65, 102, 98, 178, 178, 193, 81, 98, 49, 132, 0, 12, + 32, 33, 12, 0, 11, 50, 162, 145, 17, 129, 49, 240, + 240, 19, 114, 34, 82, 65, 66, 66, 66, 65, 86, 82, + 162, 162, 177, 81, 82, 49, 116, 0, 11, 32, 31, 13, + 0, 13, 66, 50, 99, 34, 0, 5, 99, 130, 34, 98, + 65, 82, 66, 82, 65, 102, 98, 178, 178, 193, 81, 98, + 49, 132, 0, 12, 32, 32, 9, 0, 8, 33, 130, 114, + 129, 240, 162, 97, 17, 81, 33, 65, 49, 65, 34, 114, + 98, 114, 33, 65, 49, 65, 33, 81, 17, 98, 0, 8, + 64, 32, 11, 0, 10, 66, 146, 130, 129, 240, 242, 129, + 17, 113, 33, 97, 49, 97, 34, 146, 130, 146, 33, 97, + 49, 97, 33, 113, 17, 130, 0, 10, 64, 35, 10, 0, + 9, 50, 115, 113, 17, 97, 49, 65, 240, 82, 113, 17, + 97, 33, 81, 49, 81, 34, 130, 114, 130, 33, 81, 49, + 81, 33, 97, 17, 114, 0, 9, 64, 33, 11, 0, 11, + 35, 19, 67, 19, 240, 240, 130, 129, 17, 113, 33, 97, + 49, 97, 34, 146, 130, 146, 33, 97, 49, 97, 33, 113, + 17, 130, 0, 10, 64, 37, 15, 0, 13, 115, 210, 49, + 164, 148, 210, 226, 147, 18, 114, 51, 98, 67, 83, 67, + 82, 82, 98, 82, 83, 82, 82, 82, 98, 82, 113, 66, + 130, 34, 164, 0, 14, 32, 47, 15, 0, 15, 99, 177, + 36, 0, 6, 35, 51, 81, 33, 33, 34, 65, 33, 17, + 50, 49, 34, 17, 50, 49, 35, 50, 115, 50, 114, 50, + 115, 50, 33, 66, 66, 33, 66, 65, 33, 81, 81, 33, + 66, 83, 0, 13, 80, 35, 12, 0, 11, 17, 178, 177, + 178, 240, 240, 51, 114, 49, 82, 66, 51, 66, 50, 82, + 50, 82, 35, 82, 34, 82, 50, 82, 65, 66, 82, 34, + 116, 0, 11, 32, 35, 13, 0, 12, 81, 178, 162, 162, + 240, 240, 83, 130, 49, 98, 66, 67, 66, 66, 82, 66, + 82, 51, 82, 50, 82, 66, 82, 81, 66, 98, 34, 132, + 0, 12, 32, 37, 12, 0, 11, 50, 162, 145, 17, 129, + 49, 240, 240, 19, 114, 49, 82, 66, 51, 66, 50, 82, + 50, 82, 35, 82, 34, 82, 50, 82, 65, 66, 82, 34, + 116, 0, 11, 32, 34, 13, 0, 13, 83, 145, 51, 0, + 5, 99, 130, 49, 98, 66, 67, 66, 66, 82, 66, 82, + 51, 82, 50, 82, 66, 82, 81, 66, 98, 34, 132, 0, + 12, 32, 35, 13, 0, 13, 67, 34, 99, 34, 0, 5, + 99, 130, 49, 98, 66, 67, 66, 66, 82, 66, 82, 51, + 82, 50, 82, 66, 82, 81, 66, 98, 34, 132, 0, 12, + 32, 23, 24, 0, 28, 35, 240, 99, 240, 99, 0, 16, + 63, 7, 0, 16, 67, 240, 99, 240, 99, 0, 19, 48, + 34, 13, 0, 21, 99, 33, 82, 50, 82, 66, 67, 51, + 66, 49, 18, 66, 33, 34, 51, 17, 50, 50, 17, 51, + 51, 66, 81, 66, 83, 34, 132, 0, 12, 32, 48, 15, + 0, 13, 113, 226, 225, 225, 240, 240, 162, 82, 81, 17, + 82, 65, 33, 66, 65, 49, 66, 65, 34, 66, 114, 51, + 98, 49, 17, 114, 51, 113, 49, 18, 33, 65, 49, 18, + 17, 81, 33, 33, 33, 83, 51, 0, 13, 80, 48, 15, + 0, 14, 65, 210, 194, 194, 240, 240, 130, 82, 81, 17, + 82, 65, 33, 66, 65, 49, 66, 65, 34, 66, 114, 51, + 98, 49, 17, 114, 51, 113, 49, 18, 33, 65, 49, 18, + 17, 81, 33, 33, 33, 83, 51, 0, 13, 80, 50, 15, + 0, 14, 18, 210, 193, 17, 177, 49, 240, 240, 114, 82, + 81, 17, 82, 65, 33, 66, 65, 49, 66, 65, 34, 66, + 114, 51, 98, 49, 17, 114, 51, 113, 49, 18, 33, 65, + 49, 18, 17, 81, 33, 33, 33, 83, 51, 0, 13, 80, + 48, 15, 0, 15, 82, 50, 130, 50, 0, 6, 50, 82, + 81, 17, 82, 65, 33, 66, 65, 49, 66, 65, 34, 66, + 114, 51, 98, 49, 17, 114, 51, 113, 49, 18, 33, 65, + 49, 18, 17, 81, 33, 33, 33, 83, 51, 0, 13, 80, + 51, 14, 0, 13, 81, 194, 178, 177, 240, 240, 98, 82, + 50, 17, 82, 49, 33, 81, 49, 49, 66, 49, 34, 66, + 98, 66, 82, 66, 98, 51, 97, 67, 97, 49, 18, 97, + 33, 18, 115, 34, 194, 178, 98, 66, 98, 50, 113, 50, + 148, 240, 128, 46, 17, 0, 13, 69, 242, 241, 242, 242, + 242, 226, 242, 35, 162, 17, 34, 145, 17, 50, 131, 66, + 130, 82, 130, 82, 130, 67, 114, 82, 130, 82, 130, 66, + 130, 17, 34, 146, 35, 162, 241, 242, 242, 242, 200, 240, + 176, 51, 14, 0, 14, 82, 50, 114, 50, 0, 5, 114, + 82, 50, 17, 82, 49, 33, 81, 49, 49, 66, 49, 34, + 66, 98, 66, 82, 66, 98, 51, 97, 67, 97, 49, 18, + 97, 33, 18, 115, 34, 194, 178, 98, 66, 98, 50, 113, + 50, 148, 240, 128, +}; + +//***************************************************************************** +// +// The glyph offset table for the 26 point Oldstandard italic font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard26i[] = +{ + 0, 4, 29, 47, 88, 156, 215, 270, + 282, 313, 344, 371, 420, 434, 444, 454, + 485, 526, 550, 587, 622, 654, 691, 731, + 762, 802, 841, 856, 876, 926, 939, 989, + 1020, 1087, 1129, 1171, 1212, 1255, 1300, 1342, + 1390, 1434, 1459, 1501, 1551, 1594, 1670, 1725, + 1767, 1807, 1863, 1908, 1948, 1989, 2033, 2077, + 2147, 2200, 2244, 2281, 2312, 2342, 2373, 2396, + 2404, 2414, 2451, 2489, 2513, 2557, 2582, 2616, + 2657, 2702, 2733, 2767, 2809, 2839, 2895, 2937, + 2966, 3009, 3047, 3074, 3100, 3129, 3171, 3205, + 3253, 3289, 3334, 3361, 3392, 3420, 3452, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3469, 3473, 3496, 3535, 3577, 3610, 3643, 3666, + 3714, 3725, 3787, 3809, 3834, 3846, 3856, 3923, + 3931, 3956, 3995, 4021, 4046, 4057, 4099, 4151, + 4161, 4173, 4191, 4213, 4238, 4288, 4343, 4397, + 4429, 4480, 4534, 4588, 4639, 4690, 4742, 4806, + 4856, 4910, 4964, 5018, 5069, 5098, 5127, 5158, + 5189, 5232, 5294, 5345, 5394, 5444, 5490, 5537, + 5575, 5630, 5681, 5732, 5786, 5835, 5886, 5925, + 5977, 6020, 6063, 6108, 6150, 6193, 6239, 6281, + 6311, 6342, 6373, 6406, 6437, 6469, 6501, 6536, + 6569, 6606, 6653, 6688, 6723, 6760, 6794, 6829, + 6852, 6886, 6934, 6982, 7032, 7080, 7131, 7177, +}; + +//***************************************************************************** +// +// The font definition for the 26 point Oldstandard italic font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard26i = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 27, + + // + // The height of the font. + // + 32, + + // + // The baseline of the font. + // + 25, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard26i, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard26iData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard28.c b/third_party/fonts/ofl/fonts/fontoldstandard28.c new file mode 100644 index 0000000..5eb1efe --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard28.c @@ -0,0 +1,829 @@ +//***************************************************************************** +// +// fontoldstandard28.c - Font definition for the 28pt Oldstandard font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 28 point +// Bold: no +// Italic: no +// Memory usage: 7516 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 28 point Oldstandard font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard28Data[7313] = +{ + 5, 11, 0, 45, 48, 25, 5, 240, 240, 83, 35, 35, + 35, 35, 35, 35, 49, 65, 65, 65, 65, 65, 65, 65, + 131, 35, 35, 240, 240, 112, 17, 8, 0, 6, 2, 34, + 34, 34, 34, 34, 34, 34, 49, 49, 0, 22, 32, 43, + 17, 0, 15, 81, 65, 162, 65, 161, 81, 161, 66, 161, + 66, 95, 113, 65, 162, 65, 162, 65, 161, 81, 161, 66, + 161, 66, 161, 65, 127, 82, 65, 161, 81, 161, 66, 161, + 66, 161, 65, 0, 15, 112, 71, 15, 0, 10, 1, 17, + 193, 17, 181, 130, 17, 17, 18, 82, 33, 17, 49, 50, + 49, 17, 50, 34, 49, 17, 35, 34, 49, 17, 35, 35, + 33, 17, 34, 69, 17, 150, 167, 166, 145, 17, 19, 129, + 17, 35, 35, 33, 17, 50, 35, 33, 17, 50, 34, 49, + 17, 50, 34, 49, 17, 34, 66, 33, 17, 34, 88, 163, + 193, 17, 0, 10, 32, 63, 21, 0, 18, 84, 145, 98, + 34, 113, 98, 66, 81, 114, 66, 81, 114, 66, 65, 130, + 66, 65, 130, 66, 49, 161, 65, 49, 193, 33, 65, 210, + 65, 52, 209, 34, 34, 177, 49, 65, 161, 50, 66, 145, + 50, 66, 129, 66, 66, 113, 82, 66, 113, 82, 66, 97, + 113, 65, 113, 132, 113, 0, 17, 112, 53, 21, 0, 19, + 5, 242, 50, 210, 81, 210, 81, 210, 81, 210, 65, 227, + 33, 240, 20, 240, 51, 71, 100, 99, 113, 35, 82, 113, + 52, 65, 114, 67, 65, 98, 99, 33, 114, 115, 17, 114, + 131, 130, 131, 81, 50, 116, 49, 88, 38, 129, 0, 17, + 80, 11, 4, 240, 146, 34, 34, 34, 49, 0, 11, 32, + 31, 9, 0, 7, 50, 98, 98, 114, 98, 113, 114, 114, + 98, 114, 114, 114, 114, 114, 114, 114, 114, 130, 114, 114, + 130, 129, 130, 130, 130, 240, 80, 31, 9, 0, 6, 98, + 130, 130, 114, 130, 129, 130, 114, 129, 130, 114, 114, 114, + 114, 114, 114, 114, 98, 114, 114, 98, 113, 114, 98, 98, + 240, 160, 27, 12, 0, 11, 2, 162, 98, 34, 34, 35, + 33, 34, 81, 19, 116, 84, 17, 19, 34, 49, 34, 98, + 162, 162, 0, 23, 32, 51, 26, 0, 24, 17, 240, 161, + 240, 161, 240, 161, 240, 161, 240, 161, 240, 161, 240, 161, + 240, 161, 240, 161, 240, 161, 239, 9, 209, 240, 161, 240, + 161, 240, 161, 240, 161, 240, 161, 240, 161, 240, 161, 240, + 161, 240, 161, 240, 161, 0, 11, 64, 14, 6, 0, 16, + 67, 52, 36, 81, 81, 65, 81, 65, 240, 112, 7, 9, + 0, 20, 39, 0, 16, 10, 5, 0, 14, 51, 35, 35, + 240, 240, 112, 33, 11, 0, 7, 113, 146, 145, 161, 146, + 145, 161, 146, 145, 161, 161, 145, 161, 161, 145, 161, 161, + 145, 161, 161, 145, 161, 161, 146, 145, 161, 240, 240, 32, + 44, 15, 0, 13, 85, 146, 50, 114, 82, 83, 82, 82, + 114, 66, 114, 51, 115, 35, 115, 35, 115, 35, 115, 35, + 115, 35, 115, 35, 115, 35, 115, 50, 114, 66, 114, 82, + 82, 98, 81, 149, 193, 0, 12, 32, 25, 10, 0, 9, + 33, 145, 130, 85, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 88, 0, 9, 36, 14, 0, + 12, 85, 114, 67, 81, 99, 49, 131, 33, 131, 35, 99, + 36, 83, 51, 82, 179, 163, 163, 162, 178, 177, 193, 113, + 65, 129, 50, 129, 59, 59, 0, 12, 80, 37, 14, 0, + 12, 85, 114, 67, 66, 98, 66, 114, 52, 82, 52, 82, + 194, 178, 193, 118, 211, 195, 195, 50, 99, 36, 83, 36, + 83, 34, 114, 50, 99, 72, 161, 0, 11, 64, 34, 15, + 0, 14, 17, 210, 210, 195, 180, 177, 18, 162, 18, 146, + 34, 145, 50, 130, 50, 129, 66, 113, 82, 98, 82, 109, + 146, 210, 210, 210, 169, 0, 13, 48, 36, 14, 0, 12, + 50, 97, 88, 102, 129, 209, 209, 209, 37, 99, 51, 81, + 99, 65, 114, 195, 179, 179, 51, 83, 36, 83, 35, 98, + 50, 99, 65, 83, 103, 0, 12, 112, 42, 14, 0, 12, + 116, 130, 65, 98, 82, 82, 67, 66, 83, 66, 179, 179, + 36, 85, 50, 68, 82, 51, 114, 35, 114, 35, 114, 35, + 114, 35, 114, 50, 114, 51, 82, 82, 81, 118, 177, 0, + 11, 48, 29, 13, 0, 11, 59, 43, 33, 145, 33, 145, + 33, 129, 193, 177, 178, 177, 177, 178, 178, 162, 178, 164, + 148, 148, 148, 148, 0, 12, 16, 42, 15, 0, 13, 85, + 130, 67, 82, 98, 66, 130, 50, 130, 50, 130, 51, 114, + 68, 66, 86, 17, 151, 113, 54, 66, 99, 50, 131, 34, + 146, 34, 146, 34, 146, 34, 130, 66, 113, 104, 0, 13, + 96, 40, 14, 0, 12, 85, 130, 50, 98, 82, 81, 114, + 50, 114, 50, 115, 34, 115, 34, 115, 34, 115, 50, 84, + 66, 53, 84, 35, 179, 178, 82, 82, 67, 82, 66, 82, + 82, 66, 118, 0, 13, 15, 5, 0, 8, 19, 35, 35, + 240, 240, 115, 35, 35, 240, 240, 112, 19, 6, 0, 9, + 99, 52, 36, 240, 240, 131, 52, 36, 81, 81, 65, 81, + 65, 240, 112, 52, 24, 0, 23, 65, 240, 99, 240, 67, + 240, 82, 240, 82, 240, 82, 240, 82, 240, 83, 240, 67, + 240, 67, 240, 67, 240, 82, 240, 130, 240, 146, 240, 146, + 240, 131, 240, 131, 240, 131, 240, 131, 240, 130, 240, 146, + 240, 146, 240, 146, 0, 9, 32, 12, 26, 0, 52, 15, + 9, 0, 13, 47, 9, 0, 36, 52, 24, 0, 21, 17, + 240, 131, 240, 131, 240, 130, 240, 146, 240, 146, 240, 146, + 240, 131, 240, 131, 240, 131, 240, 131, 240, 130, 240, 98, + 240, 82, 240, 82, 240, 83, 240, 67, 240, 67, 240, 67, + 240, 82, 240, 82, 240, 82, 240, 82, 0, 11, 96, 33, + 12, 0, 10, 101, 97, 82, 49, 114, 36, 66, 51, 66, + 162, 146, 146, 146, 145, 161, 49, 113, 49, 113, 49, 131, + 240, 240, 51, 147, 147, 0, 11, 16, 71, 22, 0, 17, + 41, 179, 114, 146, 178, 98, 194, 98, 83, 18, 34, 66, + 66, 51, 34, 66, 50, 67, 50, 34, 51, 66, 66, 34, + 50, 82, 66, 34, 50, 82, 66, 34, 34, 97, 82, 34, + 34, 82, 82, 34, 34, 82, 66, 50, 34, 82, 66, 66, + 18, 67, 65, 82, 18, 49, 18, 35, 98, 20, 52, 131, + 240, 83, 129, 201, 0, 20, 32, 49, 22, 0, 17, 97, + 240, 82, 240, 82, 240, 68, 240, 52, 240, 49, 18, 240, + 34, 19, 240, 17, 35, 240, 17, 50, 242, 51, 225, 67, + 225, 82, 210, 83, 202, 178, 114, 178, 115, 161, 131, 146, + 146, 146, 147, 88, 57, 0, 19, 64, 44, 18, 0, 13, + 76, 146, 98, 130, 114, 114, 130, 98, 130, 98, 130, 98, + 130, 98, 114, 114, 98, 136, 162, 99, 114, 115, 98, 131, + 82, 131, 82, 131, 82, 131, 82, 131, 82, 115, 98, 99, + 76, 0, 16, 64, 43, 17, 0, 13, 39, 49, 82, 97, + 18, 66, 131, 51, 131, 50, 162, 50, 162, 35, 177, 35, + 227, 227, 227, 227, 227, 177, 35, 177, 50, 177, 51, 145, + 82, 145, 82, 130, 98, 98, 151, 209, 0, 13, 96, 45, + 21, 0, 15, 109, 178, 115, 146, 146, 130, 162, 114, 163, + 98, 163, 98, 179, 82, 179, 82, 179, 82, 179, 82, 179, + 82, 179, 82, 179, 82, 178, 98, 163, 98, 163, 98, 147, + 114, 146, 130, 115, 109, 0, 19, 48, 47, 18, 0, 13, + 79, 1, 82, 131, 82, 146, 82, 161, 82, 161, 82, 161, + 82, 81, 65, 82, 81, 162, 66, 168, 162, 66, 162, 81, + 162, 81, 162, 81, 65, 82, 161, 82, 161, 82, 146, 82, + 146, 82, 131, 47, 1, 0, 16, 44, 18, 0, 13, 79, + 1, 82, 131, 82, 146, 82, 161, 82, 161, 82, 161, 82, + 81, 65, 82, 81, 162, 66, 168, 162, 66, 162, 81, 162, + 81, 162, 81, 162, 240, 18, 240, 18, 240, 18, 240, 18, + 216, 0, 17, 50, 20, 0, 15, 71, 49, 130, 98, 17, + 114, 131, 114, 146, 99, 146, 98, 177, 83, 177, 83, 240, + 35, 240, 35, 240, 35, 105, 35, 147, 83, 147, 83, 147, + 98, 147, 99, 131, 114, 131, 114, 114, 17, 130, 82, 33, + 151, 49, 0, 18, 16, 46, 21, 0, 15, 104, 56, 82, + 146, 130, 146, 130, 146, 130, 146, 130, 146, 130, 146, 130, + 146, 130, 146, 141, 130, 146, 130, 146, 130, 146, 130, 146, + 130, 146, 130, 146, 130, 146, 130, 146, 130, 146, 88, 56, + 0, 18, 80, 26, 10, 0, 7, 72, 82, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 88, 0, 9, 31, 15, 0, 11, 120, 162, 210, + 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 99, + 66, 84, 66, 84, 66, 82, 97, 113, 82, 119, 0, 14, + 48, 20, 0, 15, 8, 40, 82, 116, 114, 114, 146, 113, + 162, 97, 178, 81, 194, 65, 210, 49, 226, 35, 210, 17, + 19, 195, 35, 194, 67, 178, 67, 178, 83, 162, 83, 162, + 99, 146, 99, 146, 115, 130, 116, 72, 40, 0, 17, 96, + 45, 18, 0, 13, 72, 210, 240, 18, 240, 18, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 240, 18, 240, 18, 161, 82, 161, 82, 161, 82, 146, 82, + 146, 82, 131, 82, 116, 47, 1, 0, 16, 74, 23, 0, + 17, 38, 150, 84, 131, 132, 131, 132, 113, 18, 129, 19, + 97, 18, 129, 19, 97, 18, 129, 19, 97, 18, 129, 35, + 65, 34, 129, 35, 65, 34, 129, 35, 65, 34, 129, 50, + 49, 50, 129, 51, 33, 50, 129, 51, 33, 50, 129, 66, + 33, 50, 129, 68, 66, 129, 68, 66, 129, 83, 66, 129, + 82, 82, 115, 66, 82, 87, 49, 40, 0, 20, 48, 60, + 21, 0, 15, 102, 103, 83, 131, 116, 129, 133, 113, 129, + 19, 113, 129, 35, 97, 129, 35, 97, 129, 51, 81, 129, + 52, 65, 129, 67, 65, 129, 83, 49, 129, 83, 49, 129, + 99, 33, 129, 115, 17, 129, 115, 17, 129, 132, 129, 132, + 129, 147, 115, 146, 87, 114, 240, 81, 0, 16, 48, 45, + 18, 0, 14, 22, 162, 98, 114, 130, 98, 130, 83, 131, + 66, 162, 51, 163, 35, 163, 35, 163, 35, 163, 35, 163, + 35, 163, 35, 163, 35, 163, 50, 162, 67, 131, 82, 130, + 98, 130, 114, 98, 166, 0, 16, 80, 42, 18, 0, 13, + 76, 146, 99, 114, 115, 98, 131, 82, 131, 82, 131, 82, + 131, 82, 131, 82, 115, 98, 99, 121, 146, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 216, + 0, 17, 60, 18, 0, 14, 22, 162, 98, 114, 130, 98, + 130, 83, 131, 66, 162, 51, 163, 35, 163, 35, 163, 35, + 163, 35, 163, 35, 163, 35, 163, 35, 163, 50, 162, 67, + 35, 51, 82, 18, 33, 34, 98, 17, 52, 131, 52, 33, + 103, 65, 145, 18, 65, 179, 49, 179, 34, 197, 227, 240, + 240, 160, 48, 20, 0, 15, 13, 162, 100, 130, 115, 130, + 131, 114, 131, 114, 131, 114, 131, 114, 115, 130, 99, 152, + 194, 82, 178, 98, 162, 99, 146, 114, 146, 114, 146, 114, + 49, 82, 115, 33, 82, 115, 33, 82, 117, 57, 68, 0, + 17, 112, 45, 16, 0, 12, 39, 49, 66, 82, 18, 50, + 131, 50, 131, 50, 146, 50, 146, 51, 145, 68, 198, 199, + 183, 65, 102, 49, 147, 49, 163, 34, 162, 34, 162, 35, + 146, 36, 129, 49, 34, 98, 49, 56, 177, 0, 13, 52, + 19, 0, 14, 47, 2, 35, 66, 68, 34, 82, 83, 33, + 98, 98, 33, 98, 98, 33, 98, 113, 33, 98, 113, 33, + 98, 113, 146, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 218, + 0, 17, 48, 48, 22, 0, 16, 72, 87, 82, 163, 114, + 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, + 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, + 177, 130, 177, 145, 177, 146, 145, 178, 113, 216, 240, 49, + 0, 17, 112, 50, 22, 0, 16, 73, 56, 83, 146, 131, + 145, 163, 129, 163, 129, 163, 113, 195, 97, 195, 97, 210, + 81, 227, 65, 227, 65, 242, 50, 243, 33, 240, 19, 33, + 240, 37, 240, 36, 240, 52, 240, 67, 240, 66, 240, 82, + 240, 97, 0, 17, 112, 76, 30, 0, 22, 72, 41, 39, + 83, 115, 115, 130, 115, 114, 147, 99, 114, 147, 100, 97, + 163, 100, 97, 178, 85, 97, 179, 65, 34, 81, 195, 65, + 35, 65, 210, 50, 35, 65, 211, 33, 66, 49, 227, 33, + 67, 33, 227, 33, 67, 33, 242, 18, 67, 17, 240, 20, + 98, 17, 240, 20, 100, 240, 35, 100, 240, 34, 130, 240, + 50, 130, 240, 65, 130, 240, 65, 0, 25, 48, 21, 0, + 15, 105, 39, 100, 98, 163, 98, 179, 81, 195, 65, 227, + 34, 227, 33, 240, 20, 240, 36, 240, 51, 240, 51, 240, + 37, 240, 17, 34, 241, 51, 210, 67, 193, 83, 177, 115, + 146, 115, 131, 116, 87, 57, 0, 18, 80, 47, 21, 0, + 15, 105, 55, 84, 115, 131, 114, 147, 113, 179, 97, 194, + 81, 211, 49, 242, 49, 243, 17, 240, 34, 17, 240, 50, + 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, + 240, 66, 240, 66, 250, 0, 19, 16, 40, 17, 0, 13, + 13, 67, 99, 67, 115, 66, 115, 81, 115, 97, 115, 97, + 99, 211, 227, 211, 212, 211, 211, 113, 99, 113, 83, 129, + 67, 130, 67, 130, 51, 131, 36, 115, 62, 0, 15, 32, + 31, 7, 240, 240, 197, 34, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 85, 240, 16, 32, 11, 0, 6, 113, + 161, 161, 177, 161, 161, 177, 161, 161, 177, 161, 161, 177, + 161, 161, 177, 161, 161, 177, 161, 161, 162, 161, 161, 162, + 161, 240, 144, 31, 7, 240, 240, 197, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 37, 240, 16, 24, 14, + 0, 13, 1, 194, 180, 161, 33, 146, 49, 129, 66, 97, + 97, 82, 113, 65, 130, 33, 161, 0, 28, 32, 8, 17, + 0, 61, 95, 0, 6, 80, 12, 7, 0, 6, 18, 83, + 82, 113, 113, 0, 18, 80, 34, 14, 0, 23, 20, 146, + 34, 114, 66, 99, 50, 99, 50, 194, 134, 99, 50, 83, + 66, 83, 66, 33, 35, 51, 33, 35, 33, 18, 33, 52, + 51, 0, 12, 80, 42, 14, 0, 10, 68, 194, 194, 194, + 194, 194, 194, 194, 35, 114, 17, 49, 99, 66, 82, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, + 67, 66, 81, 18, 49, 97, 36, 0, 12, 112, 27, 12, + 0, 19, 117, 98, 50, 66, 82, 49, 83, 34, 83, 34, + 162, 162, 162, 113, 49, 113, 50, 97, 65, 66, 101, 0, + 11, 41, 14, 0, 11, 21, 194, 194, 194, 194, 194, 194, + 115, 34, 97, 49, 18, 82, 67, 66, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 82, 67, 97, + 52, 116, 20, 0, 12, 64, 27, 12, 0, 19, 116, 114, + 49, 82, 66, 65, 97, 50, 98, 34, 98, 42, 34, 162, + 177, 113, 50, 81, 81, 66, 101, 0, 11, 30, 11, 0, + 8, 100, 98, 49, 66, 50, 66, 50, 66, 146, 146, 119, + 98, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 119, + 0, 10, 16, 40, 15, 0, 24, 100, 50, 66, 67, 33, + 34, 97, 34, 34, 98, 82, 98, 82, 98, 82, 98, 98, + 66, 148, 146, 193, 232, 123, 99, 67, 50, 145, 49, 161, + 49, 161, 66, 98, 103, 240, 96, 41, 16, 0, 12, 4, + 226, 226, 226, 226, 226, 226, 226, 36, 130, 18, 34, 115, + 82, 99, 82, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 70, 38, 0, 14, 32, + 24, 8, 0, 7, 19, 83, 83, 240, 212, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 7, 32, + 32, 9, 0, 8, 51, 99, 99, 240, 240, 21, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 34, 50, 34, 49, 49, 50, 68, 208, 40, 15, 0, 11, + 36, 210, 210, 210, 210, 210, 210, 210, 54, 66, 66, 114, + 65, 130, 49, 146, 33, 162, 18, 162, 19, 147, 18, 146, + 50, 130, 51, 114, 67, 98, 67, 70, 22, 0, 13, 48, + 27, 8, 0, 6, 4, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, + 0, 7, 32, 48, 22, 0, 35, 100, 35, 67, 130, 17, + 34, 33, 34, 115, 67, 66, 98, 82, 82, 98, 82, 82, + 98, 82, 82, 98, 82, 82, 98, 82, 82, 98, 82, 82, + 98, 82, 82, 98, 82, 82, 98, 82, 82, 70, 22, 22, + 0, 19, 64, 34, 16, 0, 26, 4, 36, 130, 18, 34, + 115, 82, 99, 82, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 70, 38, 0, 14, + 32, 30, 13, 0, 21, 69, 114, 50, 82, 82, 65, 113, + 50, 114, 34, 114, 34, 114, 34, 114, 34, 114, 49, 113, + 66, 82, 82, 50, 117, 0, 12, 39, 14, 0, 22, 100, + 35, 114, 17, 49, 99, 66, 82, 98, 66, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 67, 66, 84, 49, + 98, 35, 114, 194, 194, 194, 194, 166, 240, 112, 40, 14, + 0, 23, 19, 49, 97, 49, 33, 82, 65, 17, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, + 82, 67, 97, 52, 116, 18, 194, 194, 194, 194, 194, 166, + 240, 16, 26, 12, 0, 19, 68, 35, 82, 17, 34, 66, + 17, 19, 67, 35, 67, 146, 162, 162, 162, 162, 162, 162, + 134, 0, 11, 32, 28, 12, 0, 19, 100, 99, 50, 66, + 81, 66, 81, 67, 165, 149, 148, 49, 99, 34, 98, 35, + 82, 34, 17, 51, 33, 52, 0, 11, 29, 10, 0, 9, + 17, 145, 145, 145, 130, 130, 103, 82, 130, 130, 130, 130, + 130, 130, 130, 130, 49, 66, 49, 66, 34, 84, 0, 9, + 16, 34, 16, 0, 26, 4, 68, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 83, 98, 83, 114, 34, 18, 132, 36, 0, 14, 32, 29, + 15, 0, 24, 54, 37, 51, 98, 82, 97, 99, 81, 114, + 65, 130, 65, 146, 33, 162, 33, 178, 17, 179, 195, 210, + 209, 0, 14, 16, 46, 22, 0, 35, 102, 22, 37, 51, + 83, 82, 82, 83, 81, 99, 67, 81, 114, 67, 65, 130, + 65, 18, 49, 146, 33, 34, 33, 162, 33, 34, 33, 178, + 17, 50, 17, 179, 67, 195, 82, 210, 82, 209, 97, 0, + 20, 32, 29, 14, 0, 22, 101, 37, 51, 66, 98, 65, + 130, 33, 148, 179, 194, 179, 177, 18, 145, 50, 113, 66, + 113, 82, 68, 38, 0, 12, 64, 37, 16, 0, 26, 7, + 37, 67, 82, 114, 81, 130, 81, 146, 65, 146, 49, 163, + 33, 178, 33, 178, 17, 196, 211, 210, 241, 241, 241, 146, + 49, 162, 49, 162, 33, 195, 240, 192, 28, 12, 0, 19, + 74, 34, 83, 33, 98, 49, 82, 65, 67, 131, 146, 147, + 131, 65, 66, 81, 51, 81, 35, 82, 42, 0, 10, 96, + 32, 9, 0, 6, 49, 98, 97, 114, 114, 114, 114, 115, + 114, 114, 114, 114, 98, 82, 146, 130, 114, 114, 114, 99, + 99, 98, 114, 114, 129, 146, 145, 176, 29, 3, 241, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 128, 33, 9, 240, 240, 241, 146, 145, 130, 114, 114, 114, + 99, 98, 114, 114, 114, 130, 146, 82, 98, 114, 114, 114, + 115, 114, 114, 114, 114, 113, 98, 97, 240, 32, 20, 18, + 0, 36, 20, 145, 49, 52, 113, 33, 84, 81, 33, 116, + 49, 49, 133, 0, 27, 48, 5, 11, 0, 45, 48, 23, + 5, 0, 8, 19, 35, 35, 129, 65, 65, 65, 65, 65, + 65, 65, 51, 35, 35, 35, 35, 35, 35, 112, 45, 12, + 0, 15, 81, 177, 177, 149, 97, 33, 33, 66, 33, 34, + 49, 49, 19, 34, 49, 19, 34, 49, 98, 49, 98, 49, + 98, 49, 49, 50, 33, 49, 50, 33, 49, 66, 17, 33, + 101, 145, 177, 177, 0, 6, 96, 43, 18, 0, 17, 4, + 194, 65, 162, 82, 145, 83, 130, 83, 130, 240, 18, 240, + 18, 198, 240, 22, 194, 240, 18, 240, 18, 240, 18, 240, + 18, 180, 17, 129, 33, 66, 129, 33, 74, 68, 54, 0, + 16, 32, 33, 14, 0, 19, 33, 52, 49, 51, 67, 65, + 129, 50, 129, 49, 161, 33, 161, 33, 161, 33, 161, 34, + 130, 49, 129, 67, 67, 49, 38, 33, 0, 17, 96, 35, + 17, 0, 14, 118, 54, 66, 114, 99, 97, 130, 97, 131, + 65, 162, 65, 163, 33, 194, 17, 210, 17, 226, 186, 178, + 186, 178, 242, 242, 242, 242, 200, 0, 15, 80, 25, 3, + 240, 49, 33, 33, 33, 33, 33, 33, 33, 33, 33, 240, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 128, 48, + 12, 0, 10, 116, 114, 49, 82, 51, 66, 51, 66, 65, + 83, 163, 163, 129, 19, 97, 51, 65, 83, 49, 99, 34, + 98, 35, 97, 51, 81, 67, 49, 99, 17, 131, 163, 163, + 81, 66, 67, 50, 67, 50, 66, 50, 116, 240, 32, 13, + 10, 0, 10, 3, 35, 35, 35, 35, 35, 0, 27, 96, + 68, 22, 0, 17, 40, 194, 130, 145, 193, 113, 84, 81, + 82, 66, 35, 50, 65, 66, 81, 65, 65, 65, 97, 65, + 49, 66, 97, 81, 33, 66, 193, 33, 66, 193, 33, 66, + 193, 33, 66, 193, 33, 66, 193, 49, 65, 97, 65, 65, + 66, 81, 65, 66, 66, 49, 66, 81, 84, 81, 113, 193, + 146, 130, 200, 240, 49, 0, 17, 112, 22, 10, 0, 8, + 116, 82, 34, 115, 82, 18, 66, 34, 17, 34, 34, 17, + 36, 18, 55, 0, 22, 112, 26, 9, 0, 17, 17, 49, + 49, 50, 34, 34, 50, 34, 50, 34, 50, 34, 50, 34, + 65, 49, 66, 49, 65, 0, 9, 96, 13, 15, 0, 30, + 13, 225, 225, 225, 225, 225, 0, 20, 112, 7, 9, 0, + 20, 39, 0, 16, 73, 22, 0, 17, 40, 194, 130, 145, + 193, 113, 225, 82, 24, 82, 65, 66, 51, 65, 65, 66, + 66, 65, 49, 82, 66, 81, 33, 82, 50, 97, 33, 85, + 129, 33, 82, 50, 97, 33, 82, 66, 81, 33, 82, 66, + 81, 49, 66, 66, 33, 17, 65, 66, 66, 33, 17, 66, + 50, 66, 35, 81, 22, 51, 17, 113, 193, 146, 130, 200, + 240, 49, 0, 17, 112, 8, 9, 0, 10, 23, 0, 26, + 16, 19, 10, 0, 9, 4, 81, 65, 49, 97, 33, 97, + 33, 97, 49, 65, 84, 0, 24, 32, 41, 26, 0, 27, + 49, 240, 161, 240, 161, 240, 161, 240, 161, 240, 161, 240, + 161, 239, 9, 209, 240, 161, 240, 161, 240, 161, 240, 161, + 240, 161, 240, 161, 240, 161, 0, 8, 47, 9, 0, 19, + 96, 25, 10, 0, 9, 4, 81, 50, 49, 82, 33, 82, + 35, 50, 114, 129, 114, 114, 113, 81, 34, 81, 40, 0, + 17, 96, 25, 10, 0, 8, 117, 65, 51, 49, 66, 50, + 50, 114, 98, 114, 19, 146, 34, 66, 34, 66, 33, 66, + 69, 0, 18, 12, 7, 0, 6, 66, 67, 66, 65, 81, + 0, 19, 16, 45, 17, 0, 27, 82, 98, 114, 99, 98, + 99, 98, 99, 98, 99, 98, 99, 98, 99, 113, 98, 129, + 113, 129, 98, 114, 98, 50, 33, 17, 66, 21, 33, 37, + 51, 49, 240, 17, 240, 18, 242, 242, 242, 240, 17, 240, + 54, 14, 0, 10, 121, 68, 49, 85, 49, 85, 49, 70, + 49, 85, 49, 85, 49, 85, 49, 115, 49, 145, 49, 145, + 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, + 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, + 49, 145, 49, 0, 5, 96, 9, 5, 0, 10, 3, 35, + 35, 0, 9, 12, 8, 0, 26, 33, 113, 130, 114, 33, + 50, 52, 176, 19, 8, 0, 7, 49, 98, 68, 98, 98, + 98, 98, 98, 98, 98, 98, 70, 0, 14, 32, 24, 9, + 0, 8, 19, 82, 18, 50, 50, 34, 50, 34, 50, 34, + 50, 34, 50, 50, 18, 83, 71, 0, 18, 32, 26, 9, + 0, 16, 113, 49, 66, 49, 66, 34, 50, 34, 50, 34, + 50, 34, 50, 34, 49, 49, 49, 50, 113, 0, 9, 64, + 55, 21, 0, 18, 97, 161, 130, 161, 100, 145, 146, 130, + 146, 129, 162, 113, 178, 113, 178, 97, 66, 98, 81, 82, + 98, 81, 67, 70, 33, 65, 18, 178, 49, 34, 177, 65, + 34, 161, 65, 50, 161, 65, 50, 145, 88, 97, 162, 129, + 162, 113, 150, 66, 0, 17, 112, 55, 20, 0, 17, 113, + 161, 114, 145, 100, 145, 130, 129, 146, 129, 146, 113, 162, + 97, 178, 97, 20, 98, 81, 18, 34, 82, 81, 17, 66, + 38, 33, 34, 50, 145, 51, 34, 145, 129, 145, 130, 145, + 113, 161, 113, 161, 113, 65, 97, 98, 65, 81, 119, 66, + 0, 17, 59, 21, 0, 18, 69, 129, 97, 51, 113, 98, + 50, 97, 114, 50, 81, 194, 97, 147, 113, 211, 65, 242, + 33, 162, 66, 17, 82, 66, 66, 17, 67, 65, 66, 17, + 83, 85, 17, 81, 18, 177, 65, 34, 161, 81, 34, 146, + 65, 50, 145, 88, 97, 162, 129, 162, 113, 150, 65, 0, + 18, 33, 12, 0, 20, 3, 147, 147, 240, 99, 129, 49, + 113, 49, 113, 49, 161, 146, 146, 146, 146, 146, 82, 50, + 83, 34, 113, 34, 113, 50, 81, 101, 240, 16, 58, 22, + 98, 240, 83, 240, 82, 240, 113, 240, 113, 240, 240, 194, + 240, 82, 240, 82, 240, 68, 240, 52, 240, 49, 18, 240, + 34, 19, 240, 17, 35, 240, 17, 50, 242, 51, 225, 67, + 225, 82, 210, 83, 202, 178, 114, 178, 115, 161, 131, 146, + 146, 146, 147, 88, 57, 0, 19, 64, 58, 22, 194, 240, + 67, 240, 66, 240, 65, 240, 81, 240, 240, 209, 240, 98, + 240, 82, 240, 68, 240, 52, 240, 49, 18, 240, 34, 19, + 240, 17, 35, 240, 17, 50, 242, 51, 225, 67, 225, 82, + 210, 83, 202, 178, 114, 178, 115, 161, 131, 146, 146, 146, + 147, 88, 57, 0, 19, 64, 57, 22, 146, 240, 82, 240, + 68, 240, 33, 65, 0, 7, 113, 240, 82, 240, 82, 240, + 68, 240, 52, 240, 49, 18, 240, 34, 19, 240, 17, 35, + 240, 17, 50, 242, 51, 225, 67, 225, 82, 210, 83, 202, + 178, 114, 178, 115, 161, 131, 146, 146, 146, 147, 88, 57, + 0, 19, 64, 54, 22, 240, 228, 240, 33, 52, 0, 10, + 65, 240, 82, 240, 82, 240, 83, 240, 52, 240, 49, 18, + 240, 34, 19, 240, 17, 35, 240, 17, 50, 242, 51, 225, + 67, 225, 82, 210, 83, 202, 193, 114, 178, 115, 161, 131, + 146, 147, 130, 147, 88, 57, 0, 19, 64, 54, 21, 240, + 179, 51, 195, 51, 195, 51, 0, 7, 33, 240, 81, 240, + 67, 240, 51, 240, 51, 240, 33, 19, 240, 17, 19, 242, + 35, 225, 51, 225, 51, 210, 67, 193, 83, 193, 98, 187, + 161, 115, 161, 130, 146, 131, 130, 131, 115, 132, 71, 72, + 0, 18, 80, 60, 22, 132, 240, 34, 49, 240, 17, 65, + 240, 18, 34, 240, 36, 240, 240, 178, 240, 82, 240, 82, + 240, 68, 240, 52, 240, 49, 18, 240, 33, 35, 240, 17, + 35, 242, 50, 241, 67, 225, 67, 210, 82, 209, 99, 202, + 177, 130, 177, 131, 146, 131, 146, 147, 115, 147, 88, 57, + 0, 19, 64, 65, 28, 0, 22, 47, 1, 227, 131, 227, + 146, 212, 146, 209, 18, 161, 194, 18, 161, 193, 34, 81, + 65, 178, 34, 81, 240, 17, 50, 66, 241, 72, 241, 66, + 66, 225, 82, 81, 225, 82, 81, 65, 137, 81, 65, 114, + 98, 161, 113, 114, 161, 98, 114, 146, 98, 114, 146, 83, + 114, 116, 40, 47, 1, 0, 24, 96, 49, 17, 0, 13, + 39, 49, 82, 97, 18, 66, 131, 51, 131, 50, 162, 50, + 162, 35, 177, 35, 227, 227, 227, 227, 227, 177, 35, 177, + 50, 177, 51, 145, 82, 145, 82, 130, 98, 98, 151, 194, + 241, 240, 34, 240, 18, 242, 196, 240, 144, 55, 18, 66, + 240, 34, 240, 34, 240, 33, 240, 49, 240, 207, 1, 82, + 131, 82, 146, 82, 161, 82, 161, 82, 161, 82, 81, 65, + 82, 81, 162, 66, 168, 162, 66, 162, 81, 162, 81, 162, + 81, 65, 82, 161, 82, 161, 82, 146, 82, 146, 82, 131, + 47, 1, 0, 16, 51, 18, 178, 243, 226, 242, 240, 240, + 239, 1, 82, 131, 82, 146, 82, 161, 82, 161, 82, 161, + 82, 81, 65, 82, 81, 162, 66, 168, 162, 66, 162, 81, + 162, 81, 162, 81, 65, 82, 161, 82, 161, 82, 146, 82, + 146, 82, 131, 47, 1, 0, 16, 55, 18, 129, 240, 19, + 226, 18, 194, 50, 161, 113, 240, 143, 1, 82, 131, 82, + 146, 82, 161, 82, 161, 82, 161, 82, 81, 65, 82, 81, + 162, 66, 168, 162, 66, 162, 81, 162, 81, 162, 81, 65, + 82, 161, 82, 161, 82, 146, 82, 146, 82, 131, 47, 1, + 0, 16, 55, 18, 240, 115, 51, 147, 51, 147, 51, 240, + 240, 191, 1, 82, 131, 82, 146, 82, 146, 82, 161, 82, + 161, 82, 81, 65, 82, 81, 162, 66, 168, 162, 66, 162, + 81, 162, 81, 65, 82, 81, 65, 82, 161, 82, 161, 82, + 146, 82, 146, 82, 131, 47, 1, 0, 16, 29, 10, 17, + 146, 145, 161, 240, 184, 82, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, + 0, 9, 30, 11, 113, 146, 130, 129, 240, 217, 82, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 105, 0, 9, 112, 30, 10, 210, 116, + 81, 65, 49, 97, 200, 82, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, + 0, 9, 32, 11, 179, 51, 35, 51, 35, 51, 240, 153, + 82, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 105, 0, 9, 112, 45, 21, + 0, 15, 109, 178, 115, 146, 146, 130, 162, 114, 163, 98, + 163, 98, 179, 82, 179, 82, 179, 40, 131, 82, 179, 82, + 179, 82, 179, 82, 178, 98, 163, 98, 163, 98, 147, 114, + 146, 130, 115, 109, 0, 19, 48, 65, 21, 240, 211, 49, + 209, 52, 0, 8, 102, 103, 83, 131, 116, 129, 133, 113, + 129, 19, 113, 129, 35, 97, 129, 35, 97, 129, 51, 81, + 129, 52, 65, 129, 67, 65, 129, 83, 49, 129, 83, 49, + 129, 99, 33, 129, 115, 17, 129, 115, 17, 129, 132, 129, + 132, 129, 147, 115, 146, 87, 114, 240, 81, 0, 16, 48, + 54, 18, 66, 240, 19, 240, 33, 240, 49, 240, 49, 240, + 240, 38, 162, 98, 114, 130, 98, 130, 83, 131, 66, 162, + 51, 163, 35, 163, 35, 163, 35, 163, 35, 163, 35, 163, + 35, 163, 35, 163, 50, 162, 67, 131, 82, 130, 98, 130, + 114, 98, 166, 0, 16, 80, 52, 18, 162, 243, 241, 240, + 17, 240, 17, 240, 240, 54, 162, 98, 114, 130, 98, 130, + 83, 131, 66, 162, 51, 163, 35, 163, 35, 163, 35, 163, + 35, 163, 35, 163, 35, 163, 35, 163, 50, 162, 67, 131, + 82, 130, 98, 130, 114, 98, 166, 0, 16, 80, 51, 18, + 114, 240, 18, 244, 209, 65, 0, 6, 6, 162, 98, 114, + 130, 98, 130, 83, 131, 66, 162, 51, 163, 35, 163, 35, + 163, 35, 163, 35, 163, 35, 163, 35, 163, 35, 163, 50, + 162, 67, 131, 82, 130, 98, 130, 114, 98, 166, 0, 16, + 80, 50, 18, 240, 132, 33, 161, 52, 0, 8, 22, 162, + 98, 114, 130, 98, 130, 83, 131, 66, 162, 51, 163, 35, + 163, 35, 163, 35, 163, 35, 163, 35, 163, 35, 163, 35, + 163, 50, 162, 67, 131, 82, 130, 98, 130, 114, 98, 166, + 0, 16, 80, 52, 18, 240, 115, 35, 163, 35, 163, 35, + 0, 5, 118, 162, 98, 114, 130, 98, 130, 83, 131, 66, + 162, 51, 163, 35, 163, 35, 163, 35, 163, 35, 163, 35, + 163, 35, 163, 35, 163, 50, 162, 67, 131, 82, 130, 98, + 130, 114, 98, 166, 0, 16, 80, 40, 20, 0, 25, 17, + 226, 50, 194, 82, 162, 114, 130, 146, 98, 178, 66, 210, + 34, 244, 240, 34, 240, 36, 242, 34, 210, 66, 178, 98, + 146, 130, 114, 162, 82, 194, 50, 226, 0, 15, 32, 59, + 18, 0, 14, 7, 50, 82, 98, 17, 82, 130, 98, 130, + 83, 116, 66, 129, 18, 51, 113, 35, 35, 98, 35, 35, + 82, 51, 35, 81, 67, 35, 65, 83, 35, 50, 83, 35, + 34, 99, 35, 33, 115, 50, 17, 130, 68, 115, 82, 130, + 98, 115, 81, 18, 98, 82, 55, 0, 16, 64, 57, 22, + 98, 240, 83, 240, 82, 240, 113, 240, 113, 240, 240, 56, + 87, 82, 163, 114, 177, 130, 177, 130, 177, 130, 177, 130, + 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, + 177, 130, 177, 130, 177, 130, 177, 145, 177, 146, 145, 178, + 113, 216, 240, 49, 0, 17, 112, 57, 22, 194, 240, 67, + 240, 66, 240, 65, 240, 81, 240, 240, 72, 87, 82, 163, + 114, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 145, 177, 146, 145, 178, 113, 216, 240, + 49, 0, 17, 112, 57, 22, 146, 240, 82, 240, 68, 240, + 33, 65, 226, 98, 240, 232, 87, 82, 163, 114, 177, 130, + 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, + 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, + 177, 145, 177, 146, 145, 178, 113, 216, 240, 49, 0, 17, + 112, 55, 22, 240, 211, 51, 211, 51, 211, 51, 0, 6, + 56, 87, 82, 163, 114, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 130, 177, 145, 177, 146, 145, + 178, 113, 216, 240, 49, 0, 17, 112, 54, 21, 209, 240, + 66, 240, 50, 240, 49, 0, 6, 73, 55, 84, 115, 131, + 114, 147, 113, 179, 97, 194, 81, 211, 49, 242, 49, 243, + 17, 240, 34, 17, 240, 50, 240, 66, 240, 66, 240, 66, + 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 250, 0, + 19, 16, 41, 18, 0, 13, 72, 210, 240, 18, 240, 18, + 240, 25, 146, 99, 114, 115, 98, 131, 82, 131, 82, 131, + 82, 131, 82, 115, 98, 99, 121, 146, 240, 18, 240, 18, + 240, 18, 240, 18, 216, 0, 17, 49, 14, 0, 11, 20, + 131, 34, 114, 66, 82, 82, 82, 82, 82, 81, 98, 65, + 114, 19, 130, 50, 114, 81, 98, 82, 82, 97, 82, 98, + 66, 98, 66, 98, 66, 98, 66, 18, 50, 66, 17, 65, + 82, 17, 50, 52, 36, 0, 12, 96, 40, 14, 0, 12, + 50, 195, 194, 225, 225, 240, 164, 146, 34, 114, 66, 99, + 50, 99, 50, 194, 134, 99, 50, 83, 66, 83, 66, 33, + 35, 51, 33, 35, 33, 18, 33, 52, 51, 0, 12, 80, + 40, 14, 0, 13, 18, 194, 178, 178, 240, 240, 132, 146, + 34, 114, 66, 99, 50, 99, 50, 194, 134, 99, 50, 83, + 66, 83, 66, 33, 35, 51, 33, 35, 33, 18, 33, 52, + 51, 0, 12, 80, 41, 14, 0, 12, 113, 194, 195, 161, + 33, 145, 240, 212, 146, 34, 114, 66, 99, 50, 99, 50, + 194, 134, 99, 50, 83, 66, 83, 66, 33, 35, 51, 33, + 35, 33, 18, 33, 52, 51, 0, 12, 80, 40, 14, 0, + 14, 35, 49, 97, 51, 0, 6, 52, 146, 34, 114, 66, + 99, 50, 99, 50, 194, 134, 99, 50, 83, 66, 83, 66, + 33, 35, 51, 33, 35, 33, 18, 33, 52, 51, 0, 12, + 80, 42, 14, 0, 14, 19, 35, 99, 35, 99, 35, 240, + 240, 100, 146, 34, 114, 66, 99, 50, 99, 50, 194, 134, + 99, 50, 83, 66, 83, 66, 33, 35, 51, 33, 35, 33, + 18, 33, 52, 51, 0, 12, 80, 43, 14, 0, 12, 99, + 161, 49, 129, 65, 145, 34, 163, 240, 148, 146, 34, 114, + 66, 98, 66, 99, 50, 194, 134, 99, 50, 83, 66, 83, + 66, 33, 35, 51, 33, 35, 33, 18, 33, 52, 51, 0, + 12, 80, 42, 19, 0, 31, 36, 52, 114, 34, 18, 49, + 82, 67, 66, 67, 50, 97, 67, 50, 98, 146, 98, 94, + 51, 50, 163, 66, 163, 66, 113, 35, 49, 18, 81, 51, + 33, 35, 50, 68, 85, 0, 17, 16, 34, 12, 0, 19, + 117, 97, 66, 66, 82, 49, 83, 34, 83, 34, 162, 162, + 162, 113, 49, 113, 50, 81, 81, 66, 101, 129, 178, 194, + 162, 97, 50, 116, 240, 32, 33, 12, 0, 10, 82, 163, + 163, 177, 193, 240, 100, 114, 49, 82, 66, 65, 97, 50, + 98, 34, 98, 42, 34, 162, 177, 113, 50, 81, 81, 66, + 101, 0, 11, 33, 12, 0, 11, 65, 162, 146, 146, 240, + 240, 36, 114, 49, 82, 66, 65, 97, 50, 98, 34, 98, + 42, 34, 162, 177, 113, 50, 81, 82, 50, 101, 0, 11, + 36, 12, 0, 11, 2, 163, 130, 17, 129, 49, 82, 81, + 240, 52, 114, 49, 82, 66, 65, 97, 50, 98, 34, 98, + 42, 34, 162, 177, 113, 50, 81, 81, 66, 101, 0, 11, + 34, 12, 0, 12, 19, 35, 67, 35, 67, 35, 240, 244, + 113, 50, 82, 66, 65, 82, 50, 83, 34, 83, 42, 34, + 162, 177, 178, 81, 81, 66, 100, 0, 11, 16, 25, 9, + 0, 7, 114, 115, 114, 145, 240, 148, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 86, 0, 8, 16, 25, + 9, 0, 8, 66, 99, 97, 113, 113, 244, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 86, 0, 8, 32, + 27, 9, 0, 8, 33, 130, 99, 81, 49, 49, 240, 52, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 86, + 0, 8, 16, 27, 9, 0, 9, 3, 19, 35, 19, 35, + 19, 240, 100, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 85, 0, 8, 32, 40, 13, 0, 10, 3, 65, + 99, 18, 131, 163, 130, 19, 179, 178, 119, 82, 51, 66, + 83, 49, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 49, 113, 66, 82, 82, 50, 117, 0, 12, 40, 16, + 0, 16, 68, 33, 129, 51, 0, 6, 100, 36, 130, 18, + 34, 115, 82, 99, 82, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 38, 0, + 14, 32, 36, 13, 0, 11, 66, 179, 194, 193, 209, 240, + 133, 114, 50, 82, 82, 65, 113, 50, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 49, 113, 66, 82, 82, 50, 117, + 0, 12, 36, 13, 0, 12, 50, 163, 146, 162, 177, 240, + 133, 114, 50, 82, 82, 65, 113, 50, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 49, 113, 66, 82, 82, 50, 117, + 0, 12, 38, 13, 0, 12, 1, 179, 161, 17, 145, 49, + 240, 240, 69, 114, 50, 82, 82, 65, 113, 50, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 49, 113, 66, 82, 82, + 50, 117, 0, 12, 35, 13, 0, 13, 36, 49, 132, 0, + 5, 101, 114, 50, 82, 82, 65, 113, 50, 114, 34, 114, + 34, 114, 34, 114, 34, 114, 49, 113, 66, 82, 82, 50, + 117, 0, 12, 38, 13, 0, 13, 19, 51, 67, 51, 67, + 51, 240, 240, 37, 114, 50, 82, 82, 65, 113, 50, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 49, 113, 66, 82, + 82, 50, 117, 0, 12, 23, 26, 0, 37, 3, 240, 131, + 240, 131, 0, 17, 127, 9, 0, 17, 99, 240, 131, 240, + 131, 0, 17, 112, 38, 13, 0, 21, 69, 33, 66, 51, + 66, 82, 65, 98, 50, 81, 18, 34, 65, 34, 34, 49, + 50, 34, 33, 66, 34, 17, 82, 50, 97, 66, 82, 49, + 18, 50, 65, 37, 0, 12, 41, 16, 0, 14, 50, 226, + 242, 240, 17, 240, 240, 180, 68, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 83, 98, 83, 114, 34, 18, 132, 36, 0, 14, 32, 40, + 16, 0, 15, 18, 211, 210, 209, 225, 240, 164, 68, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 83, 98, 83, 114, 34, 18, 132, 36, + 0, 14, 32, 43, 16, 0, 14, 98, 226, 209, 18, 177, + 65, 240, 17, 240, 100, 68, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 83, + 98, 83, 114, 34, 18, 132, 36, 0, 14, 32, 42, 16, + 0, 16, 51, 35, 131, 35, 131, 35, 240, 240, 116, 68, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 83, 98, 83, 114, 34, 18, 132, + 36, 0, 14, 32, 43, 16, 0, 15, 33, 226, 210, 225, + 240, 240, 151, 37, 67, 82, 114, 81, 130, 81, 146, 65, + 146, 49, 163, 33, 178, 33, 178, 17, 196, 211, 210, 241, + 241, 225, 162, 49, 162, 49, 162, 33, 195, 240, 192, 44, + 14, 0, 12, 66, 164, 194, 194, 194, 194, 194, 52, 82, + 18, 35, 67, 82, 67, 82, 66, 98, 66, 98, 66, 82, + 82, 81, 98, 66, 98, 65, 114, 49, 130, 18, 147, 178, + 194, 194, 194, 194, 178, 177, 208, 46, 16, 0, 14, 51, + 51, 115, 51, 115, 51, 0, 6, 70, 53, 66, 113, 114, + 97, 114, 81, 130, 81, 146, 65, 146, 49, 178, 33, 178, + 33, 178, 17, 211, 211, 210, 241, 226, 146, 49, 162, 34, + 162, 33, 195, 240, 192, +}; + +//***************************************************************************** +// +// The glyph offset table for the 28 point Oldstandard font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard28[] = +{ + 0, 5, 30, 47, 90, 161, 224, 277, + 288, 319, 350, 377, 428, 442, 449, 459, + 492, 536, 561, 597, 634, 668, 704, 746, + 775, 817, 857, 872, 891, 943, 955, 1007, + 1040, 1111, 1160, 1204, 1247, 1292, 1339, 1383, + 1433, 1479, 1505, 1536, 1584, 1629, 1703, 1763, + 1808, 1850, 1910, 1958, 2003, 2055, 2103, 2153, + 2229, 2277, 2324, 2364, 2395, 2427, 2458, 2482, + 2490, 2502, 2536, 2578, 2605, 2646, 2673, 2703, + 2743, 2784, 2808, 2840, 2880, 2907, 2955, 2989, + 3019, 3058, 3098, 3124, 3152, 3181, 3215, 3244, + 3290, 3319, 3356, 3384, 3416, 3445, 3478, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3498, 3503, 3526, 3571, 3614, 3647, 3682, 3707, + 3755, 3768, 3836, 3858, 3884, 3897, 3904, 3977, + 3985, 4004, 4045, 4070, 4095, 4107, 4152, 4206, + 4215, 4227, 4246, 4270, 4296, 4351, 4406, 4465, + 4498, 4556, 4614, 4671, 4725, 4779, 4839, 4904, + 4953, 5008, 5059, 5114, 5169, 5198, 5228, 5258, + 5290, 5335, 5400, 5454, 5506, 5557, 5607, 5659, + 5699, 5758, 5815, 5872, 5929, 5984, 6038, 6079, + 6128, 6168, 6208, 6249, 6289, 6331, 6374, 6416, + 6450, 6483, 6516, 6552, 6586, 6611, 6636, 6663, + 6690, 6730, 6770, 6806, 6842, 6880, 6915, 6953, + 6976, 7014, 7055, 7095, 7138, 7180, 7223, 7267, +}; + +//***************************************************************************** +// +// The font definition for the 28 point Oldstandard font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard28 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 27, + + // + // The height of the font. + // + 33, + + // + // The baseline of the font. + // + 26, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard28, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard28Data +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard28b.c b/third_party/fonts/ofl/fonts/fontoldstandard28b.c new file mode 100644 index 0000000..e002406 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard28b.c @@ -0,0 +1,860 @@ +//***************************************************************************** +// +// fontoldstandard28b.c - Font definition for the 28pt Oldstandard bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 28 point +// Bold: yes +// Italic: no +// Memory usage: 7904 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 28 point Oldstandard bold font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard28bData[7704] = +{ + 5, 11, 0, 49, 64, 26, 6, 240, 240, 196, 36, 36, + 36, 36, 36, 50, 66, 66, 66, 66, 66, 81, 65, 240, + 130, 52, 36, 50, 0, 6, 48, 23, 9, 0, 6, 113, + 49, 51, 19, 35, 19, 35, 19, 35, 19, 35, 19, 49, + 49, 65, 49, 0, 25, 16, 49, 18, 0, 16, 50, 82, + 146, 82, 146, 82, 146, 81, 162, 66, 162, 66, 95, 1, + 47, 1, 98, 82, 146, 82, 146, 66, 162, 66, 162, 66, + 161, 82, 111, 1, 47, 1, 82, 81, 162, 66, 162, 66, + 161, 82, 146, 82, 0, 18, 112, 74, 15, 0, 9, 113, + 33, 177, 33, 167, 98, 17, 33, 34, 65, 33, 33, 65, + 34, 33, 33, 65, 34, 33, 33, 35, 35, 17, 33, 20, + 37, 33, 19, 53, 33, 135, 135, 152, 151, 136, 65, 33, + 38, 35, 17, 33, 20, 35, 17, 33, 35, 34, 33, 33, + 50, 33, 49, 33, 50, 33, 49, 33, 49, 65, 33, 33, + 33, 104, 145, 33, 177, 33, 0, 12, 16, 69, 21, 0, + 17, 81, 116, 129, 114, 34, 113, 99, 35, 81, 115, 35, + 81, 115, 35, 65, 131, 35, 65, 131, 35, 49, 147, 35, + 49, 162, 34, 49, 178, 34, 34, 196, 49, 240, 66, 52, + 193, 50, 34, 161, 66, 34, 161, 51, 35, 129, 67, 35, + 129, 67, 35, 113, 83, 35, 113, 83, 35, 97, 114, 34, + 113, 132, 113, 0, 20, 64, 56, 22, 0, 20, 5, 240, + 18, 65, 227, 65, 227, 65, 227, 65, 227, 50, 228, 33, + 240, 19, 17, 240, 36, 240, 68, 240, 37, 70, 98, 20, + 82, 99, 51, 81, 99, 68, 65, 99, 84, 33, 100, 84, + 33, 100, 101, 116, 115, 133, 100, 133, 85, 137, 38, 0, + 22, 48, 15, 5, 240, 240, 17, 51, 35, 35, 35, 35, + 49, 65, 0, 14, 16, 33, 10, 0, 9, 81, 130, 114, + 114, 114, 115, 114, 115, 115, 100, 100, 100, 100, 100, 100, + 100, 100, 115, 115, 115, 130, 131, 130, 146, 146, 146, 240, + 240, 32, 33, 10, 0, 8, 97, 146, 146, 146, 146, 131, + 130, 131, 115, 115, 116, 100, 100, 100, 100, 100, 100, 99, + 115, 115, 114, 115, 114, 114, 114, 114, 240, 240, 128, 32, + 13, 0, 11, 115, 163, 98, 35, 18, 51, 33, 35, 35, + 33, 19, 97, 18, 163, 100, 17, 19, 51, 33, 34, 50, + 35, 18, 115, 163, 0, 28, 48, 53, 26, 0, 24, 18, + 240, 146, 240, 146, 240, 146, 240, 146, 240, 146, 240, 146, + 240, 146, 240, 146, 240, 146, 240, 146, 223, 9, 47, 9, + 210, 240, 146, 240, 146, 240, 146, 240, 146, 240, 146, 240, + 146, 240, 146, 240, 146, 240, 146, 240, 146, 0, 17, 112, + 15, 7, 0, 21, 19, 53, 37, 52, 97, 97, 81, 81, + 66, 240, 176, 9, 9, 0, 21, 55, 39, 39, 0, 16, + 11, 6, 0, 18, 18, 52, 36, 50, 0, 6, 48, 34, + 11, 0, 10, 66, 146, 146, 130, 146, 146, 145, 146, 146, + 146, 130, 146, 146, 130, 146, 146, 145, 146, 146, 146, 130, + 146, 146, 130, 146, 146, 145, 240, 240, 32, 47, 16, 0, + 14, 70, 147, 35, 115, 67, 99, 67, 84, 68, 68, 68, + 53, 68, 53, 69, 37, 69, 37, 69, 37, 69, 37, 69, + 37, 69, 37, 69, 37, 68, 68, 68, 68, 68, 83, 67, + 99, 67, 115, 35, 150, 0, 16, 96, 28, 12, 0, 11, + 18, 147, 132, 87, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 90, 0, 12, 32, + 42, 14, 0, 12, 87, 82, 68, 66, 83, 51, 84, 35, + 84, 36, 68, 37, 52, 52, 36, 82, 52, 148, 148, 147, + 163, 162, 113, 65, 129, 49, 145, 34, 145, 44, 43, 49, + 55, 49, 69, 0, 14, 64, 41, 15, 0, 13, 55, 114, + 68, 67, 83, 67, 84, 52, 68, 53, 52, 53, 52, 67, + 67, 195, 179, 133, 227, 212, 195, 67, 84, 37, 68, 37, + 68, 36, 84, 35, 99, 66, 84, 88, 0, 15, 80, 36, + 15, 0, 14, 3, 180, 180, 165, 165, 150, 145, 20, 130, + 20, 129, 36, 114, 36, 113, 52, 98, 52, 97, 68, 82, + 68, 93, 132, 180, 180, 180, 180, 138, 0, 15, 32, 39, + 14, 0, 14, 18, 82, 88, 103, 117, 145, 209, 209, 209, + 36, 115, 51, 81, 84, 65, 99, 180, 164, 51, 68, 37, + 52, 37, 52, 36, 67, 51, 83, 66, 67, 103, 161, 0, + 13, 32, 45, 15, 0, 13, 87, 115, 65, 99, 82, 82, + 68, 67, 68, 67, 68, 52, 82, 68, 180, 180, 21, 85, + 51, 68, 83, 52, 84, 36, 84, 36, 84, 51, 84, 51, + 84, 51, 84, 66, 83, 98, 52, 118, 0, 15, 80, 38, + 13, 0, 11, 49, 35, 49, 49, 21, 34, 40, 33, 40, + 33, 34, 69, 33, 145, 33, 129, 49, 129, 177, 193, 177, + 178, 163, 162, 163, 163, 148, 148, 148, 148, 148, 0, 13, + 96, 44, 16, 0, 14, 55, 130, 97, 98, 129, 67, 129, + 67, 129, 68, 113, 69, 81, 87, 49, 105, 121, 153, 113, + 24, 66, 55, 65, 101, 50, 132, 34, 146, 50, 146, 50, + 146, 66, 129, 83, 98, 119, 0, 16, 96, 45, 15, 0, + 13, 70, 131, 50, 99, 82, 83, 83, 52, 83, 52, 83, + 52, 84, 36, 84, 36, 84, 51, 84, 51, 84, 67, 53, + 85, 20, 180, 180, 67, 67, 68, 67, 68, 66, 82, 83, + 82, 82, 119, 0, 15, 96, 17, 6, 0, 10, 82, 52, + 36, 50, 240, 240, 162, 52, 36, 50, 0, 6, 48, 21, + 7, 0, 12, 50, 68, 52, 66, 0, 5, 100, 53, 37, + 37, 97, 97, 81, 81, 66, 240, 176, 54, 23, 0, 25, + 50, 240, 83, 240, 52, 240, 36, 240, 36, 240, 51, 240, + 52, 240, 36, 240, 36, 240, 51, 240, 52, 240, 36, 240, + 67, 240, 100, 240, 100, 240, 100, 240, 99, 240, 100, 240, + 100, 240, 100, 240, 99, 240, 100, 240, 100, 240, 98, 0, + 11, 96, 17, 26, 0, 52, 15, 9, 47, 9, 0, 13, + 47, 9, 47, 9, 0, 39, 32, 54, 24, 0, 24, 17, + 240, 116, 240, 116, 240, 116, 240, 116, 240, 115, 240, 116, + 240, 116, 240, 116, 240, 115, 240, 116, 240, 116, 240, 99, + 240, 68, 240, 52, 240, 52, 240, 67, 240, 68, 240, 52, + 240, 52, 240, 67, 240, 68, 240, 52, 240, 82, 0, 14, + 80, 37, 11, 0, 9, 102, 81, 51, 49, 68, 33, 68, + 33, 68, 33, 68, 49, 51, 115, 130, 130, 145, 146, 145, + 49, 97, 49, 97, 49, 115, 240, 82, 132, 116, 130, 0, + 11, 80, 71, 22, 0, 20, 9, 179, 114, 146, 162, 114, + 194, 98, 68, 82, 66, 66, 36, 34, 66, 51, 51, 50, + 34, 51, 67, 50, 34, 51, 67, 50, 34, 36, 52, 50, + 34, 35, 67, 66, 34, 35, 67, 66, 34, 35, 67, 65, + 50, 35, 52, 50, 65, 35, 52, 49, 82, 34, 33, 19, + 33, 98, 51, 52, 130, 240, 98, 240, 98, 129, 201, 0, + 23, 47, 21, 0, 19, 65, 240, 82, 240, 51, 240, 51, + 240, 52, 240, 21, 240, 21, 240, 22, 225, 36, 225, 36, + 210, 37, 193, 53, 193, 68, 178, 69, 161, 85, 171, 146, + 101, 129, 117, 129, 132, 114, 133, 71, 42, 0, 21, 32, + 46, 19, 0, 16, 92, 164, 67, 132, 83, 116, 84, 100, + 84, 100, 84, 100, 84, 100, 83, 116, 83, 116, 66, 152, + 180, 67, 132, 84, 100, 99, 100, 100, 84, 100, 84, 100, + 84, 100, 84, 84, 100, 83, 77, 0, 19, 96, 45, 17, + 0, 15, 55, 34, 83, 69, 68, 84, 67, 115, 52, 115, + 52, 130, 37, 130, 37, 130, 37, 145, 37, 197, 197, 197, + 197, 145, 37, 145, 52, 145, 52, 129, 83, 129, 84, 98, + 99, 82, 136, 209, 0, 15, 112, 46, 21, 0, 18, 61, + 180, 83, 148, 99, 132, 115, 116, 116, 100, 116, 100, 116, + 100, 117, 84, 117, 84, 117, 84, 117, 84, 117, 84, 117, + 84, 117, 84, 116, 100, 116, 100, 116, 100, 115, 116, 99, + 132, 83, 109, 0, 22, 51, 18, 0, 15, 111, 1, 84, + 84, 84, 99, 84, 114, 84, 114, 84, 129, 84, 65, 49, + 84, 65, 148, 50, 148, 35, 153, 148, 35, 148, 50, 148, + 65, 49, 84, 65, 49, 84, 129, 84, 129, 84, 114, 84, + 99, 84, 84, 47, 1, 0, 18, 32, 44, 19, 0, 16, + 95, 2, 84, 85, 84, 100, 84, 115, 84, 130, 84, 130, + 84, 65, 50, 84, 65, 49, 100, 50, 164, 35, 169, 164, + 35, 164, 50, 164, 65, 164, 65, 164, 244, 244, 244, 244, + 202, 0, 20, 16, 48, 19, 0, 17, 38, 49, 115, 84, + 100, 99, 99, 115, 84, 130, 84, 130, 84, 145, 69, 145, + 69, 229, 229, 229, 57, 37, 100, 69, 100, 69, 100, 84, + 100, 84, 100, 99, 100, 99, 97, 18, 115, 65, 49, 134, + 65, 0, 19, 64, 48, 23, 0, 20, 26, 26, 84, 116, + 132, 116, 132, 116, 132, 116, 132, 116, 132, 116, 132, 116, + 132, 116, 132, 116, 143, 132, 116, 132, 116, 132, 116, 132, + 116, 132, 116, 132, 116, 132, 116, 132, 116, 132, 116, 90, + 26, 0, 23, 32, 28, 12, 0, 10, 74, 84, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 90, 0, 12, 32, 35, 15, 0, 13, + 74, 148, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + 180, 82, 68, 68, 52, 68, 52, 68, 52, 66, 84, 66, + 83, 97, 67, 134, 0, 15, 112, 48, 21, 0, 18, 57, + 39, 100, 99, 132, 98, 148, 97, 164, 81, 180, 65, 196, + 50, 196, 34, 212, 20, 196, 20, 202, 180, 36, 180, 37, + 164, 52, 164, 53, 148, 68, 148, 69, 132, 84, 132, 85, + 116, 85, 73, 40, 0, 21, 32, 37, 19, 0, 16, 90, + 196, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, 244, + 145, 84, 130, 84, 130, 84, 130, 84, 115, 84, 115, 84, + 100, 84, 85, 47, 2, 0, 19, 32, 73, 25, 0, 21, + 119, 151, 84, 133, 133, 117, 133, 117, 133, 97, 20, 134, + 81, 20, 129, 20, 81, 20, 129, 20, 81, 20, 129, 21, + 49, 36, 129, 36, 49, 36, 129, 36, 49, 36, 129, 37, + 33, 36, 129, 52, 17, 52, 129, 54, 52, 129, 69, 52, + 129, 69, 52, 129, 68, 68, 129, 83, 68, 129, 83, 68, + 115, 66, 84, 87, 49, 42, 0, 25, 32, 58, 23, 0, + 20, 23, 89, 70, 101, 117, 129, 165, 113, 166, 97, 166, + 97, 161, 21, 81, 161, 22, 65, 161, 38, 49, 161, 53, + 49, 161, 54, 33, 161, 70, 17, 161, 85, 17, 161, 87, + 161, 102, 161, 117, 161, 132, 161, 132, 161, 147, 133, 130, + 105, 98, 240, 113, 0, 20, 112, 49, 19, 0, 15, 33, + 247, 178, 82, 147, 83, 115, 115, 84, 115, 84, 116, 68, + 116, 53, 117, 37, 117, 37, 117, 37, 117, 37, 117, 37, + 117, 37, 117, 52, 116, 68, 116, 68, 116, 83, 115, 115, + 83, 146, 82, 183, 241, 0, 17, 112, 37, 19, 0, 16, + 93, 148, 83, 116, 84, 100, 100, 84, 100, 84, 100, 84, + 100, 84, 100, 84, 84, 100, 83, 122, 148, 244, 244, 244, + 244, 244, 244, 244, 244, 202, 0, 20, 16, 63, 19, 0, + 15, 33, 247, 178, 82, 147, 83, 115, 115, 84, 115, 84, + 116, 68, 116, 53, 117, 37, 117, 37, 117, 37, 117, 37, + 117, 37, 117, 37, 117, 52, 116, 68, 116, 68, 35, 35, + 99, 17, 33, 35, 116, 37, 132, 36, 49, 118, 81, 178, + 81, 178, 81, 178, 66, 179, 50, 183, 214, 228, 240, 128, + 51, 21, 0, 18, 60, 196, 67, 164, 83, 148, 84, 132, + 84, 132, 84, 132, 84, 132, 83, 148, 67, 168, 212, 51, + 180, 67, 164, 67, 164, 68, 148, 68, 148, 68, 148, 68, + 49, 84, 68, 49, 84, 68, 49, 84, 68, 33, 58, 38, + 0, 21, 48, 45, 15, 0, 13, 54, 49, 65, 100, 50, + 115, 50, 130, 51, 114, 51, 129, 53, 97, 54, 167, 151, + 152, 136, 49, 86, 49, 102, 33, 132, 34, 131, 34, 146, + 35, 130, 35, 129, 49, 18, 98, 49, 39, 0, 15, 80, + 55, 20, 0, 17, 79, 3, 37, 36, 37, 36, 52, 52, + 35, 68, 67, 34, 84, 82, 34, 84, 82, 34, 84, 82, + 34, 84, 82, 33, 100, 97, 148, 240, 20, 240, 20, 240, + 20, 240, 20, 240, 20, 240, 20, 240, 20, 240, 20, 240, + 20, 240, 20, 218, 0, 20, 96, 47, 21, 0, 18, 57, + 55, 68, 131, 100, 145, 116, 145, 116, 145, 116, 145, 116, + 145, 116, 145, 116, 145, 116, 145, 116, 145, 116, 145, 116, + 145, 116, 145, 116, 145, 116, 145, 116, 145, 131, 145, 132, + 113, 163, 97, 200, 0, 22, 50, 22, 0, 19, 42, 40, + 69, 130, 132, 130, 133, 113, 164, 113, 164, 97, 181, 81, + 196, 81, 196, 65, 213, 49, 228, 49, 228, 34, 229, 17, + 240, 20, 17, 240, 22, 240, 21, 240, 52, 240, 52, 240, + 51, 240, 82, 240, 82, 0, 23, 48, 72, 30, 0, 26, + 41, 25, 39, 69, 85, 99, 116, 100, 98, 132, 100, 98, + 133, 85, 81, 164, 85, 81, 164, 85, 81, 165, 55, 50, + 180, 49, 36, 49, 196, 49, 36, 49, 197, 33, 37, 33, + 212, 18, 52, 17, 228, 17, 68, 17, 230, 70, 245, 85, + 244, 100, 240, 20, 100, 240, 20, 115, 240, 35, 115, 240, + 34, 130, 240, 50, 130, 0, 31, 32, 46, 21, 0, 18, + 57, 39, 86, 83, 133, 82, 164, 81, 181, 50, 196, 49, + 213, 17, 246, 245, 240, 37, 240, 21, 240, 37, 246, 226, + 21, 209, 37, 194, 53, 177, 69, 161, 101, 130, 101, 115, + 102, 71, 57, 0, 21, 32, 46, 20, 0, 17, 72, 55, + 69, 99, 101, 98, 132, 98, 133, 81, 164, 81, 165, 49, + 196, 49, 196, 49, 197, 17, 228, 17, 230, 244, 240, 20, + 240, 20, 240, 20, 240, 20, 240, 20, 240, 20, 240, 20, + 232, 0, 20, 112, 42, 17, 0, 15, 14, 52, 85, 51, + 85, 66, 101, 66, 85, 81, 101, 81, 85, 97, 85, 181, + 197, 181, 197, 181, 181, 97, 85, 97, 69, 113, 69, 98, + 53, 114, 53, 99, 37, 100, 47, 0, 17, 32, 32, 8, + 0, 7, 6, 35, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 86, 240, 176, 33, 12, 0, 10, 66, 178, + 162, 162, 177, 178, 162, 162, 178, 162, 162, 178, 162, 162, + 177, 178, 162, 162, 178, 162, 162, 178, 162, 162, 177, 178, + 162, 240, 176, 32, 8, 0, 7, 6, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 38, 240, 176, 24, + 14, 0, 12, 114, 195, 164, 147, 18, 130, 34, 114, 66, + 98, 67, 66, 98, 51, 114, 34, 130, 0, 33, 64, 9, + 17, 0, 65, 127, 47, 0, 6, 80, 12, 7, 0, 6, + 18, 83, 83, 82, 98, 0, 21, 32, 36, 14, 0, 24, + 101, 130, 51, 83, 67, 68, 51, 68, 51, 82, 67, 134, + 99, 35, 83, 51, 68, 51, 68, 51, 17, 36, 51, 17, + 36, 51, 17, 54, 19, 0, 14, 48, 44, 15, 0, 13, + 21, 195, 195, 195, 195, 195, 195, 195, 20, 116, 35, 100, + 51, 83, 67, 83, 68, 67, 68, 67, 68, 67, 68, 67, + 68, 67, 68, 67, 67, 82, 17, 51, 81, 33, 35, 97, + 52, 0, 15, 80, 29, 12, 0, 21, 68, 99, 34, 68, + 50, 51, 51, 36, 36, 36, 35, 52, 132, 132, 132, 147, + 81, 51, 81, 67, 49, 116, 0, 12, 64, 43, 15, 0, + 13, 117, 195, 195, 195, 195, 195, 195, 116, 19, 99, 17, + 19, 83, 52, 83, 67, 68, 67, 68, 67, 68, 67, 68, + 67, 68, 67, 68, 67, 83, 67, 83, 52, 99, 36, 116, + 21, 0, 15, 32, 30, 12, 0, 21, 52, 115, 19, 67, + 50, 67, 51, 36, 51, 36, 51, 42, 36, 132, 132, 81, + 51, 81, 52, 49, 83, 49, 101, 0, 12, 64, 32, 13, + 0, 12, 4, 130, 34, 98, 51, 67, 36, 67, 36, 67, + 163, 136, 115, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 136, 0, 13, 80, 41, 16, 0, 28, 68, 50, + 83, 36, 18, 52, 39, 52, 38, 68, 36, 100, 36, 115, + 36, 130, 35, 164, 147, 194, 232, 140, 91, 107, 65, 131, + 49, 162, 49, 162, 49, 146, 82, 98, 134, 240, 128, 43, + 16, 0, 14, 5, 211, 211, 211, 211, 211, 211, 211, 35, + 131, 17, 34, 116, 51, 100, 51, 99, 67, 99, 67, 99, + 67, 99, 67, 99, 67, 99, 67, 99, 67, 99, 67, 99, + 67, 70, 38, 0, 16, 32, 26, 8, 0, 7, 34, 84, + 68, 82, 240, 213, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 54, 0, 8, 32, 37, 10, 0, 9, + 50, 116, 100, 114, 240, 240, 101, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 50, 35, 36, + 19, 36, 19, 35, 34, 66, 34, 83, 240, 41, 16, 0, + 14, 5, 211, 211, 211, 211, 211, 211, 211, 53, 83, 66, + 115, 65, 131, 49, 147, 49, 147, 34, 147, 19, 152, 131, + 36, 115, 51, 115, 52, 99, 67, 99, 68, 55, 22, 0, + 16, 32, 28, 9, 0, 7, 117, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 71, 0, 9, 32, 51, 23, 0, 40, 37, 36, + 51, 131, 17, 34, 33, 34, 116, 52, 51, 100, 52, 51, + 99, 67, 67, 99, 67, 67, 99, 67, 67, 99, 67, 67, + 99, 67, 67, 99, 67, 67, 99, 67, 67, 99, 67, 67, + 99, 67, 67, 70, 37, 38, 0, 23, 32, 36, 16, 0, + 28, 5, 35, 131, 17, 34, 116, 51, 100, 51, 99, 67, + 99, 67, 99, 67, 99, 67, 99, 67, 99, 67, 99, 67, + 99, 67, 99, 67, 70, 38, 0, 16, 32, 33, 14, 0, + 25, 4, 131, 35, 83, 67, 67, 67, 52, 68, 36, 68, + 36, 68, 36, 68, 36, 68, 36, 68, 51, 67, 67, 67, + 83, 35, 132, 0, 14, 96, 41, 15, 0, 26, 37, 20, + 116, 35, 100, 51, 83, 67, 83, 68, 67, 68, 67, 68, + 67, 68, 67, 68, 67, 68, 67, 67, 84, 51, 84, 35, + 99, 20, 115, 195, 195, 195, 195, 195, 167, 240, 128, 43, + 15, 0, 26, 84, 49, 99, 33, 33, 83, 49, 18, 83, + 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, 67, 68, + 67, 83, 67, 83, 52, 99, 36, 116, 19, 195, 195, 195, + 195, 195, 195, 167, 240, 32, 27, 13, 0, 22, 101, 35, + 83, 17, 19, 68, 20, 68, 20, 67, 35, 83, 163, 163, + 163, 163, 163, 163, 163, 135, 0, 13, 96, 30, 12, 0, + 21, 36, 33, 65, 67, 50, 82, 50, 97, 51, 149, 134, + 134, 118, 33, 84, 34, 98, 35, 82, 36, 50, 49, 52, + 0, 12, 64, 32, 11, 0, 11, 65, 161, 161, 161, 146, + 131, 104, 83, 131, 131, 131, 131, 131, 131, 131, 49, 67, + 49, 67, 49, 67, 49, 67, 33, 115, 0, 11, 64, 36, + 16, 0, 28, 5, 37, 99, 67, 99, 67, 99, 67, 99, + 67, 99, 67, 99, 67, 99, 67, 99, 67, 99, 67, 99, + 52, 99, 52, 114, 33, 19, 131, 37, 0, 16, 32, 29, + 15, 0, 26, 38, 37, 52, 82, 83, 81, 100, 65, 115, + 49, 131, 49, 132, 33, 147, 17, 163, 17, 164, 195, 195, + 194, 225, 0, 16, 45, 22, 0, 38, 70, 23, 21, 52, + 68, 66, 83, 68, 65, 100, 67, 65, 115, 67, 49, 131, + 53, 33, 132, 33, 19, 33, 147, 17, 35, 17, 163, 17, + 37, 165, 52, 179, 67, 195, 67, 195, 82, 209, 97, 0, + 23, 31, 15, 0, 26, 39, 21, 68, 50, 100, 49, 132, + 33, 132, 17, 164, 195, 196, 181, 145, 20, 145, 36, 113, + 67, 98, 68, 54, 22, 0, 15, 32, 39, 15, 0, 26, + 38, 37, 52, 81, 99, 81, 100, 65, 115, 49, 131, 49, + 132, 33, 147, 17, 165, 180, 180, 179, 210, 210, 209, 225, + 163, 17, 148, 17, 147, 17, 163, 17, 179, 240, 160, 30, + 13, 0, 22, 122, 51, 52, 50, 52, 65, 67, 81, 52, + 132, 148, 132, 147, 65, 68, 65, 52, 81, 52, 66, 36, + 67, 43, 0, 13, 32, 33, 11, 0, 10, 66, 114, 130, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 115, 99, 163, + 147, 131, 131, 131, 131, 131, 131, 131, 131, 146, 162, 178, + 240, 144, 31, 4, 240, 240, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 160, 34, 11, 0, + 9, 82, 178, 162, 147, 131, 131, 131, 131, 131, 131, 131, + 131, 147, 163, 99, 115, 131, 131, 131, 131, 131, 131, 131, + 131, 130, 130, 114, 240, 240, 16, 21, 18, 0, 38, 53, + 129, 71, 113, 33, 54, 81, 33, 86, 49, 33, 119, 65, + 133, 0, 29, 80, 5, 11, 0, 49, 64, 24, 6, 0, + 10, 82, 52, 36, 50, 240, 113, 82, 66, 66, 66, 66, + 66, 51, 52, 36, 36, 36, 36, 50, 144, 45, 12, 0, + 17, 17, 177, 177, 149, 100, 33, 67, 17, 34, 51, 17, + 19, 36, 17, 19, 36, 17, 33, 52, 17, 100, 17, 100, + 17, 100, 17, 115, 17, 49, 51, 17, 49, 68, 33, 101, + 145, 177, 177, 0, 8, 32, 47, 20, 0, 18, 71, 195, + 66, 163, 83, 147, 83, 132, 68, 132, 67, 148, 240, 20, + 240, 20, 215, 209, 40, 196, 240, 20, 240, 35, 240, 35, + 240, 35, 240, 34, 145, 52, 18, 114, 49, 75, 65, 74, + 100, 54, 0, 20, 96, 33, 15, 0, 22, 66, 37, 34, + 45, 51, 83, 66, 114, 50, 146, 34, 146, 34, 146, 34, + 146, 34, 146, 50, 114, 67, 83, 61, 34, 37, 34, 0, + 20, 112, 37, 17, 0, 14, 119, 53, 53, 82, 85, 82, + 100, 81, 117, 65, 132, 49, 148, 49, 149, 33, 164, 17, + 182, 196, 156, 148, 156, 148, 212, 212, 212, 212, 212, 170, + 0, 17, 80, 25, 4, 240, 210, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 240, 178, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 224, 53, 15, 0, 13, 85, 145, 66, 113, + 98, 82, 83, 82, 68, 82, 68, 83, 66, 101, 182, 152, + 97, 40, 50, 70, 50, 101, 35, 115, 37, 98, 54, 66, + 56, 33, 104, 150, 180, 98, 67, 84, 66, 84, 66, 83, + 82, 82, 97, 114, 65, 149, 240, 240, 112, 13, 11, 0, + 12, 66, 50, 52, 20, 50, 50, 0, 33, 48, 73, 22, + 0, 20, 8, 194, 130, 146, 162, 114, 194, 97, 84, 33, + 33, 81, 83, 35, 49, 65, 67, 66, 49, 49, 83, 81, + 65, 33, 68, 81, 65, 33, 68, 161, 33, 68, 161, 33, + 68, 161, 33, 68, 81, 65, 33, 68, 81, 65, 49, 67, + 81, 49, 65, 67, 65, 65, 81, 67, 34, 49, 98, 68, + 66, 114, 162, 146, 130, 200, 240, 49, 0, 20, 80, 26, + 10, 0, 9, 3, 97, 34, 82, 18, 82, 18, 100, 81, + 34, 66, 34, 17, 34, 34, 17, 51, 18, 216, 0, 22, + 96, 29, 9, 0, 18, 33, 49, 49, 49, 50, 34, 50, + 34, 50, 34, 50, 34, 50, 34, 50, 34, 65, 49, 66, + 49, 65, 49, 0, 10, 48, 15, 16, 0, 32, 14, 46, + 226, 226, 226, 226, 226, 226, 0, 24, 32, 9, 9, 0, + 21, 55, 39, 39, 0, 16, 75, 22, 0, 20, 8, 194, + 130, 146, 162, 114, 194, 97, 26, 49, 81, 67, 36, 49, + 65, 67, 52, 33, 49, 83, 52, 49, 33, 83, 52, 49, + 33, 83, 36, 65, 33, 86, 113, 33, 83, 35, 81, 33, + 83, 51, 65, 33, 83, 51, 65, 49, 67, 51, 17, 17, + 65, 67, 51, 17, 17, 81, 51, 51, 18, 105, 37, 114, + 162, 146, 130, 200, 240, 49, 0, 20, 80, 9, 9, 0, + 10, 23, 39, 0, 28, 48, 22, 11, 0, 8, 97, 133, + 82, 50, 50, 82, 34, 82, 34, 82, 34, 82, 50, 50, + 85, 0, 29, 48, 47, 26, 0, 27, 50, 240, 146, 240, + 146, 240, 146, 240, 146, 240, 146, 240, 146, 240, 146, 223, + 9, 47, 9, 210, 240, 146, 240, 146, 240, 146, 240, 146, + 240, 146, 240, 146, 240, 146, 0, 8, 31, 9, 47, 9, + 0, 19, 96, 27, 10, 0, 9, 4, 81, 51, 34, 51, + 35, 35, 50, 34, 114, 113, 129, 65, 49, 81, 40, 33, + 22, 33, 51, 0, 21, 80, 27, 11, 0, 9, 117, 81, + 51, 50, 67, 35, 51, 50, 51, 115, 84, 163, 147, 36, + 35, 35, 51, 35, 35, 70, 0, 22, 64, 12, 7, 0, + 6, 66, 67, 51, 66, 66, 0, 21, 80, 44, 16, 0, + 28, 18, 82, 100, 52, 84, 52, 84, 52, 84, 52, 84, + 52, 83, 68, 83, 68, 83, 82, 113, 98, 49, 49, 98, + 49, 49, 87, 50, 56, 49, 20, 51, 65, 226, 227, 211, + 212, 196, 196, 210, 208, 56, 16, 0, 14, 74, 70, 34, + 87, 34, 87, 34, 87, 34, 72, 34, 87, 34, 87, 34, + 87, 34, 102, 34, 117, 34, 162, 34, 162, 34, 162, 34, + 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, + 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 0, 8, + 64, 11, 6, 0, 12, 114, 52, 36, 50, 0, 11, 80, + 11, 7, 0, 25, 81, 81, 114, 98, 82, 36, 160, 19, + 9, 0, 8, 34, 69, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 71, 0, 19, 48, 24, 10, 0, 9, 4, 82, + 34, 51, 35, 35, 35, 35, 35, 35, 35, 35, 35, 50, + 34, 84, 232, 0, 22, 96, 29, 9, 0, 18, 1, 49, + 81, 49, 65, 50, 50, 34, 50, 34, 50, 34, 50, 34, + 50, 34, 49, 49, 49, 50, 49, 49, 0, 10, 80, 58, + 23, 0, 20, 66, 162, 146, 161, 117, 146, 147, 145, 163, + 129, 179, 114, 179, 113, 195, 98, 195, 97, 211, 82, 67, + 99, 81, 83, 99, 65, 84, 71, 18, 84, 193, 81, 19, + 178, 65, 35, 177, 81, 35, 162, 65, 51, 161, 89, 114, + 147, 145, 163, 129, 151, 82, 0, 22, 48, 64, 23, 0, + 19, 18, 146, 162, 101, 146, 147, 146, 147, 130, 163, 129, + 179, 114, 179, 113, 195, 98, 195, 82, 37, 99, 81, 33, + 51, 83, 66, 18, 67, 67, 65, 34, 67, 39, 18, 35, + 50, 177, 66, 35, 162, 114, 193, 113, 209, 113, 81, 114, + 97, 97, 113, 105, 98, 97, 22, 113, 113, 52, 0, 23, + 48, 67, 24, 0, 21, 37, 146, 113, 51, 129, 114, 67, + 98, 115, 51, 97, 146, 51, 81, 227, 82, 180, 113, 243, + 66, 240, 19, 49, 180, 35, 34, 67, 67, 51, 33, 83, + 67, 35, 34, 68, 86, 49, 65, 19, 209, 81, 19, 209, + 65, 35, 193, 81, 35, 193, 65, 51, 177, 89, 130, 147, + 161, 163, 146, 135, 113, 0, 23, 32, 36, 11, 0, 19, + 82, 132, 116, 130, 240, 83, 113, 49, 97, 49, 97, 49, + 146, 130, 131, 115, 116, 33, 67, 49, 52, 65, 36, 65, + 36, 65, 36, 65, 52, 33, 85, 240, 57, 21, 240, 194, + 240, 67, 240, 66, 240, 82, 240, 81, 240, 240, 177, 240, + 82, 240, 51, 240, 51, 240, 52, 240, 21, 240, 21, 240, + 22, 226, 20, 225, 36, 225, 37, 194, 52, 193, 68, 193, + 69, 162, 69, 171, 146, 101, 129, 117, 129, 132, 114, 133, + 71, 42, 0, 21, 32, 58, 21, 240, 240, 34, 240, 51, + 240, 50, 240, 50, 240, 65, 240, 240, 177, 240, 82, 240, + 51, 240, 51, 240, 52, 240, 21, 240, 21, 240, 22, 225, + 36, 225, 36, 210, 37, 193, 53, 193, 68, 178, 68, 177, + 85, 171, 146, 100, 145, 117, 129, 132, 114, 133, 71, 42, + 0, 21, 32, 57, 21, 240, 241, 240, 67, 240, 37, 242, + 50, 209, 113, 240, 240, 113, 240, 82, 240, 51, 240, 51, + 240, 52, 240, 21, 240, 21, 240, 22, 225, 36, 225, 36, + 210, 37, 193, 53, 193, 68, 178, 69, 161, 85, 171, 146, + 101, 129, 117, 129, 132, 114, 133, 71, 42, 0, 21, 32, + 55, 21, 240, 240, 65, 227, 33, 231, 240, 35, 0, 7, + 65, 240, 82, 240, 51, 240, 51, 240, 52, 240, 21, 240, + 21, 240, 22, 226, 20, 225, 36, 225, 37, 194, 37, 193, + 68, 193, 68, 178, 69, 171, 146, 100, 145, 117, 129, 132, + 114, 133, 71, 42, 0, 21, 32, 56, 21, 0, 5, 115, + 50, 212, 20, 210, 50, 0, 7, 49, 240, 81, 240, 67, + 240, 51, 240, 51, 240, 37, 240, 21, 240, 17, 19, 242, + 20, 225, 36, 225, 36, 210, 37, 193, 68, 193, 68, 178, + 69, 171, 161, 85, 145, 117, 129, 117, 114, 117, 87, 42, + 0, 21, 32, 58, 21, 240, 228, 240, 17, 65, 241, 65, + 241, 50, 240, 20, 240, 240, 146, 240, 66, 240, 67, 240, + 36, 240, 36, 240, 36, 240, 22, 241, 20, 241, 20, 225, + 37, 209, 52, 209, 52, 194, 53, 177, 84, 177, 84, 172, + 145, 116, 145, 116, 130, 117, 99, 117, 71, 57, 0, 21, + 32, 67, 28, 0, 25, 111, 1, 229, 84, 229, 99, 214, + 114, 209, 20, 114, 194, 20, 129, 193, 36, 65, 49, 178, + 36, 65, 241, 52, 50, 226, 52, 35, 225, 73, 210, 68, + 35, 209, 84, 50, 194, 84, 65, 49, 139, 65, 49, 114, + 100, 129, 113, 116, 129, 98, 116, 114, 98, 116, 99, 83, + 116, 84, 40, 47, 1, 0, 28, 32, 53, 17, 0, 15, + 55, 34, 83, 69, 68, 84, 67, 115, 52, 115, 52, 130, + 37, 130, 37, 130, 37, 145, 37, 197, 197, 197, 197, 145, + 52, 145, 52, 145, 52, 129, 83, 129, 84, 98, 99, 82, + 151, 194, 241, 240, 34, 240, 18, 242, 177, 50, 196, 240, + 144, 59, 18, 240, 130, 240, 19, 240, 19, 240, 33, 240, + 240, 255, 1, 84, 84, 84, 99, 84, 114, 84, 114, 84, + 129, 84, 65, 49, 84, 65, 148, 50, 148, 35, 153, 148, + 35, 148, 50, 148, 65, 49, 84, 65, 49, 84, 129, 84, + 129, 84, 114, 84, 99, 84, 84, 47, 1, 0, 18, 32, + 57, 18, 240, 211, 243, 226, 242, 240, 17, 240, 207, 1, + 84, 84, 84, 99, 84, 114, 84, 114, 84, 129, 84, 65, + 49, 84, 65, 148, 50, 148, 35, 153, 148, 35, 148, 50, + 148, 65, 49, 84, 65, 49, 84, 129, 84, 129, 84, 114, + 84, 99, 84, 84, 47, 1, 0, 18, 32, 57, 18, 240, + 178, 243, 229, 194, 66, 240, 240, 191, 1, 84, 84, 84, + 99, 84, 114, 84, 114, 84, 129, 84, 65, 49, 84, 65, + 148, 50, 148, 35, 153, 148, 35, 148, 50, 148, 65, 49, + 84, 65, 49, 84, 129, 84, 129, 84, 114, 84, 99, 84, + 84, 47, 1, 0, 18, 32, 59, 18, 240, 240, 163, 66, + 148, 36, 146, 66, 240, 240, 191, 1, 84, 84, 84, 99, + 84, 114, 84, 129, 84, 129, 84, 65, 49, 84, 65, 148, + 50, 148, 35, 153, 148, 35, 148, 50, 148, 65, 49, 84, + 65, 49, 84, 129, 84, 129, 84, 114, 84, 114, 84, 84, + 47, 1, 0, 18, 32, 32, 12, 211, 147, 178, 177, 193, + 240, 58, 84, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 90, 0, 12, + 32, 33, 12, 240, 51, 147, 131, 145, 161, 240, 74, 84, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 90, 0, 12, 32, 33, 12, + 240, 18, 147, 133, 98, 66, 240, 202, 84, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 90, 0, 12, 32, 34, 11, 240, 130, 50, + 52, 20, 50, 50, 240, 169, 84, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 73, 0, 11, 32, 46, 21, 0, 18, 61, 180, 83, + 148, 99, 132, 115, 116, 116, 100, 116, 100, 116, 100, 117, + 84, 117, 84, 117, 41, 85, 84, 117, 84, 117, 84, 117, + 84, 116, 100, 116, 100, 115, 116, 115, 116, 99, 132, 83, + 109, 0, 22, 65, 23, 0, 6, 99, 49, 248, 240, 67, + 0, 6, 119, 89, 70, 101, 117, 129, 165, 113, 166, 97, + 166, 97, 161, 21, 81, 161, 22, 65, 161, 38, 49, 161, + 53, 49, 161, 54, 33, 161, 70, 17, 161, 85, 17, 161, + 87, 161, 102, 161, 117, 161, 132, 161, 132, 161, 147, 133, + 130, 105, 98, 240, 113, 0, 20, 112, 57, 19, 240, 131, + 240, 35, 240, 34, 240, 50, 240, 240, 113, 247, 178, 82, + 147, 83, 115, 115, 84, 115, 84, 116, 68, 116, 53, 117, + 37, 117, 37, 117, 37, 117, 37, 117, 37, 117, 37, 117, + 52, 116, 68, 116, 68, 116, 83, 115, 115, 83, 146, 82, + 183, 241, 0, 17, 112, 56, 19, 240, 227, 243, 240, 18, + 240, 18, 240, 240, 97, 247, 178, 82, 147, 83, 115, 115, + 84, 115, 84, 116, 68, 116, 53, 117, 37, 117, 37, 117, + 37, 117, 37, 117, 37, 117, 37, 117, 52, 116, 68, 116, + 68, 116, 83, 115, 115, 83, 146, 82, 183, 241, 0, 17, + 112, 57, 19, 240, 193, 240, 35, 242, 18, 210, 50, 240, + 65, 225, 247, 178, 82, 147, 83, 115, 115, 84, 115, 84, + 116, 68, 116, 53, 117, 37, 117, 37, 117, 37, 117, 37, + 117, 37, 117, 37, 117, 52, 116, 68, 116, 68, 116, 83, + 115, 115, 83, 146, 82, 183, 241, 0, 17, 112, 57, 19, + 240, 240, 17, 180, 49, 183, 177, 51, 240, 240, 81, 247, + 178, 82, 147, 83, 115, 115, 84, 115, 84, 116, 68, 116, + 53, 117, 37, 117, 37, 117, 37, 117, 37, 117, 37, 117, + 37, 117, 52, 116, 68, 116, 68, 116, 83, 115, 115, 83, + 146, 82, 183, 241, 0, 17, 112, 57, 19, 240, 240, 194, + 66, 164, 36, 162, 66, 240, 240, 65, 247, 178, 82, 147, + 83, 115, 115, 84, 115, 84, 116, 68, 116, 53, 117, 37, + 117, 37, 117, 37, 117, 37, 117, 37, 117, 37, 117, 52, + 116, 68, 116, 68, 116, 83, 115, 115, 83, 146, 82, 183, + 241, 0, 17, 112, 43, 20, 0, 27, 81, 225, 51, 210, + 51, 178, 83, 146, 115, 114, 147, 82, 179, 50, 211, 18, + 244, 240, 35, 240, 21, 226, 35, 194, 66, 178, 98, 146, + 130, 114, 162, 83, 178, 51, 210, 49, 0, 17, 32, 59, + 19, 0, 17, 39, 50, 98, 82, 33, 99, 84, 99, 115, + 84, 115, 84, 116, 68, 101, 53, 81, 21, 37, 66, 21, + 37, 65, 37, 37, 49, 53, 37, 33, 69, 37, 18, 69, + 37, 17, 85, 53, 100, 68, 116, 83, 116, 83, 115, 99, + 99, 97, 34, 82, 98, 55, 241, 0, 17, 112, 55, 21, + 240, 179, 240, 67, 240, 66, 240, 82, 0, 6, 89, 55, + 68, 131, 100, 145, 116, 145, 116, 145, 116, 145, 116, 145, + 116, 145, 116, 145, 116, 145, 116, 145, 116, 145, 116, 145, + 116, 145, 116, 145, 116, 145, 116, 145, 131, 145, 132, 113, + 163, 97, 200, 0, 22, 58, 21, 240, 240, 35, 240, 36, + 240, 34, 240, 50, 240, 65, 240, 240, 41, 55, 68, 131, + 100, 145, 116, 145, 116, 145, 116, 145, 116, 145, 116, 145, + 116, 145, 116, 145, 116, 145, 116, 145, 116, 145, 116, 145, + 116, 145, 116, 145, 116, 145, 131, 145, 132, 113, 163, 97, + 200, 0, 22, 57, 21, 240, 241, 240, 67, 240, 34, 18, + 242, 51, 193, 240, 240, 105, 55, 68, 131, 100, 145, 116, + 145, 116, 145, 116, 145, 116, 145, 116, 145, 116, 145, 116, + 145, 116, 145, 116, 145, 116, 145, 116, 145, 116, 145, 116, + 145, 116, 145, 131, 145, 132, 113, 163, 97, 200, 0, 22, + 55, 21, 0, 6, 2, 66, 196, 36, 194, 66, 0, 6, + 25, 55, 68, 131, 100, 145, 116, 145, 116, 145, 116, 145, + 116, 145, 116, 145, 116, 145, 116, 145, 116, 145, 116, 145, + 116, 145, 116, 145, 116, 145, 116, 145, 116, 145, 131, 145, + 132, 113, 163, 97, 200, 0, 22, 55, 21, 240, 240, 35, + 240, 51, 240, 34, 240, 50, 0, 6, 72, 56, 69, 99, + 117, 98, 148, 98, 149, 81, 180, 81, 181, 50, 196, 49, + 212, 49, 213, 17, 244, 17, 246, 240, 20, 240, 36, 240, + 36, 240, 36, 240, 36, 240, 36, 240, 36, 240, 36, 248, + 0, 22, 37, 19, 0, 16, 90, 196, 244, 244, 250, 148, + 83, 116, 84, 100, 100, 84, 100, 84, 100, 84, 100, 84, + 100, 84, 84, 100, 83, 122, 148, 244, 244, 244, 244, 202, + 0, 20, 16, 51, 16, 0, 14, 85, 162, 35, 130, 67, + 114, 67, 99, 67, 99, 67, 99, 67, 99, 66, 115, 34, + 147, 66, 115, 82, 99, 83, 83, 84, 67, 84, 67, 84, + 67, 84, 67, 84, 67, 19, 20, 67, 19, 19, 83, 18, + 35, 53, 36, 0, 16, 80, 43, 14, 0, 12, 50, 195, + 195, 195, 194, 240, 240, 133, 130, 51, 83, 67, 68, 51, + 83, 51, 149, 114, 35, 83, 51, 83, 51, 68, 51, 68, + 51, 17, 36, 51, 17, 37, 35, 17, 69, 19, 0, 14, + 48, 43, 14, 0, 13, 18, 179, 179, 162, 178, 193, 240, + 165, 130, 51, 83, 67, 68, 51, 68, 51, 82, 67, 134, + 99, 35, 83, 51, 68, 51, 68, 51, 17, 36, 51, 17, + 36, 51, 17, 54, 19, 0, 14, 48, 46, 14, 0, 12, + 98, 195, 164, 147, 18, 114, 66, 97, 97, 240, 101, 130, + 51, 83, 67, 68, 51, 68, 51, 82, 67, 134, 99, 35, + 83, 51, 68, 51, 68, 51, 17, 36, 51, 17, 36, 51, + 17, 54, 19, 0, 14, 48, 42, 14, 0, 14, 35, 168, + 97, 51, 0, 6, 37, 130, 51, 83, 67, 68, 51, 68, + 51, 82, 67, 134, 99, 35, 83, 51, 68, 51, 68, 51, + 17, 36, 51, 17, 36, 51, 17, 54, 19, 0, 14, 48, + 44, 14, 0, 14, 18, 66, 84, 36, 83, 51, 0, 6, + 5, 130, 51, 83, 67, 68, 51, 68, 51, 82, 67, 134, + 99, 35, 83, 51, 68, 51, 68, 51, 17, 36, 51, 17, + 36, 51, 17, 54, 19, 0, 14, 48, 47, 14, 0, 12, + 84, 145, 65, 129, 65, 129, 65, 130, 34, 148, 240, 133, + 130, 51, 82, 83, 68, 51, 68, 51, 82, 67, 134, 98, + 51, 82, 67, 67, 67, 67, 67, 17, 35, 67, 17, 36, + 36, 17, 53, 35, 0, 14, 48, 44, 19, 0, 33, 69, + 52, 98, 53, 34, 67, 67, 66, 52, 51, 67, 36, 51, + 67, 132, 67, 83, 26, 51, 51, 163, 51, 148, 51, 97, + 36, 51, 97, 36, 52, 65, 53, 17, 35, 49, 84, 69, + 0, 19, 64, 36, 12, 0, 21, 68, 99, 34, 68, 50, + 51, 51, 36, 36, 36, 35, 52, 132, 132, 132, 147, 81, + 51, 81, 67, 49, 116, 145, 177, 178, 178, 162, 113, 34, + 131, 240, 32, 37, 12, 0, 10, 98, 162, 163, 163, 177, + 240, 240, 52, 115, 19, 67, 50, 67, 51, 36, 51, 36, + 51, 42, 36, 132, 132, 81, 51, 81, 52, 49, 83, 49, + 101, 0, 12, 64, 37, 12, 0, 11, 50, 147, 146, 146, + 161, 240, 240, 52, 115, 19, 67, 50, 67, 51, 36, 51, + 36, 51, 42, 36, 132, 132, 81, 51, 81, 52, 49, 83, + 49, 101, 0, 12, 64, 39, 12, 0, 11, 17, 163, 147, + 130, 18, 98, 50, 177, 240, 52, 115, 19, 67, 50, 67, + 51, 36, 51, 36, 51, 42, 36, 132, 132, 81, 51, 81, + 52, 49, 83, 49, 101, 0, 12, 64, 37, 12, 0, 12, + 34, 50, 68, 20, 67, 35, 240, 240, 180, 115, 19, 67, + 50, 67, 51, 36, 51, 36, 51, 42, 36, 132, 132, 147, + 81, 52, 49, 83, 49, 101, 0, 12, 64, 27, 9, 0, + 7, 114, 115, 114, 130, 129, 240, 148, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 86, 0, 9, 32, + 27, 9, 0, 8, 66, 114, 99, 83, 97, 240, 133, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 71, + 0, 9, 32, 29, 9, 0, 8, 18, 115, 84, 82, 18, + 49, 66, 240, 85, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 71, 0, 9, 32, 27, 10, 0, 11, + 50, 34, 56, 50, 35, 240, 133, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 86, 0, 10, 48, 43, + 14, 0, 12, 68, 49, 118, 148, 164, 145, 20, 113, 52, + 179, 120, 83, 36, 67, 52, 67, 68, 36, 68, 36, 68, + 36, 68, 36, 68, 36, 68, 36, 68, 51, 67, 67, 52, + 83, 35, 132, 0, 14, 96, 44, 16, 0, 17, 33, 147, + 49, 135, 145, 50, 240, 240, 149, 35, 131, 17, 34, 116, + 51, 100, 51, 99, 67, 99, 67, 99, 67, 99, 67, 99, + 67, 99, 67, 99, 67, 99, 67, 99, 67, 70, 38, 0, + 16, 32, 40, 14, 0, 12, 66, 195, 195, 194, 210, 209, + 240, 164, 131, 35, 83, 67, 67, 67, 52, 68, 36, 68, + 36, 68, 36, 68, 36, 68, 36, 68, 51, 67, 67, 67, + 83, 35, 132, 0, 14, 96, 40, 14, 0, 13, 34, 179, + 163, 178, 178, 193, 240, 180, 131, 35, 83, 67, 67, 67, + 52, 68, 36, 68, 36, 68, 36, 68, 36, 68, 36, 68, + 51, 67, 67, 67, 83, 35, 132, 0, 14, 96, 43, 14, + 0, 12, 114, 179, 180, 146, 34, 114, 66, 97, 97, 240, + 116, 131, 35, 83, 67, 67, 67, 52, 68, 36, 68, 36, + 68, 36, 68, 36, 68, 36, 68, 51, 67, 67, 67, 83, + 35, 132, 0, 14, 96, 40, 14, 0, 14, 51, 49, 104, + 97, 51, 0, 6, 52, 131, 35, 83, 67, 67, 67, 52, + 68, 36, 68, 36, 68, 36, 68, 36, 68, 36, 68, 51, + 67, 67, 67, 83, 35, 132, 0, 14, 96, 41, 14, 0, + 14, 34, 50, 100, 20, 99, 34, 0, 6, 52, 131, 35, + 83, 67, 67, 67, 52, 68, 36, 68, 36, 68, 36, 68, + 36, 68, 36, 68, 51, 67, 67, 67, 83, 35, 132, 0, + 14, 96, 29, 26, 0, 37, 18, 240, 132, 240, 116, 240, + 130, 0, 14, 95, 9, 47, 9, 0, 17, 114, 240, 132, + 240, 116, 240, 130, 0, 21, 16, 39, 14, 0, 25, 4, + 49, 67, 34, 17, 67, 66, 83, 67, 52, 68, 36, 53, + 36, 33, 20, 36, 17, 36, 37, 52, 36, 68, 51, 67, + 82, 67, 65, 18, 35, 65, 52, 0, 14, 96, 43, 16, + 0, 14, 50, 227, 226, 242, 241, 240, 240, 181, 37, 99, + 67, 99, 67, 99, 67, 99, 67, 99, 67, 99, 67, 99, + 67, 99, 67, 99, 67, 99, 52, 99, 52, 114, 33, 19, + 131, 37, 0, 16, 32, 43, 16, 0, 15, 2, 211, 211, + 194, 225, 240, 240, 181, 37, 99, 67, 99, 67, 99, 67, + 99, 67, 99, 67, 99, 67, 99, 67, 99, 67, 99, 67, + 99, 52, 99, 52, 114, 33, 19, 131, 37, 0, 16, 32, + 45, 16, 0, 14, 83, 211, 211, 194, 18, 161, 81, 240, + 240, 133, 37, 99, 67, 99, 67, 99, 67, 99, 67, 99, + 67, 99, 67, 99, 67, 99, 67, 99, 67, 99, 52, 99, + 52, 114, 33, 19, 131, 37, 0, 16, 32, 44, 16, 0, + 16, 50, 50, 132, 20, 130, 51, 0, 6, 85, 37, 99, + 67, 99, 67, 99, 67, 99, 67, 99, 67, 99, 67, 99, + 67, 99, 67, 99, 67, 99, 52, 99, 52, 114, 33, 19, + 131, 37, 0, 16, 32, 46, 15, 0, 14, 18, 210, 195, + 179, 193, 240, 240, 134, 37, 52, 81, 99, 81, 100, 65, + 115, 49, 131, 49, 132, 33, 147, 17, 165, 180, 180, 179, + 210, 210, 209, 225, 163, 17, 148, 17, 147, 17, 163, 17, + 179, 240, 160, 46, 15, 0, 15, 50, 180, 165, 195, 195, + 195, 195, 36, 99, 17, 35, 84, 52, 67, 68, 67, 68, + 67, 68, 67, 67, 83, 67, 83, 51, 99, 50, 115, 34, + 131, 18, 148, 179, 195, 195, 195, 195, 194, 178, 209, 240, + 224, 47, 15, 0, 17, 34, 50, 116, 20, 115, 35, 240, + 240, 70, 37, 52, 81, 99, 81, 100, 49, 116, 49, 131, + 49, 132, 18, 147, 17, 163, 17, 165, 179, 195, 210, 210, + 209, 225, 163, 17, 149, 163, 17, 163, 17, 179, 240, 160,}; + +//***************************************************************************** +// +// The glyph offset table for the 28 point Oldstandard bold font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard28b[] = +{ + 0, 5, 31, 54, 103, 177, 246, 302, + 317, 350, 383, 415, 468, 483, 492, 503, + 537, 584, 612, 654, 695, 731, 770, 815, + 853, 897, 942, 959, 980, 1034, 1051, 1105, + 1142, 1213, 1260, 1306, 1351, 1397, 1448, 1492, + 1540, 1588, 1616, 1651, 1699, 1736, 1809, 1867, + 1916, 1953, 2016, 2067, 2112, 2167, 2214, 2264, + 2336, 2382, 2428, 2470, 2502, 2535, 2567, 2591, + 2600, 2612, 2648, 2692, 2721, 2764, 2794, 2826, + 2867, 2910, 2936, 2973, 3014, 3042, 3093, 3129, + 3162, 3203, 3246, 3273, 3303, 3335, 3371, 3400, + 3445, 3476, 3515, 3545, 3578, 3609, 3643, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3664, 3669, 3693, 3738, 3785, 3818, 3855, 3880, + 3933, 3946, 4019, 4045, 4074, 4089, 4098, 4173, + 4182, 4204, 4251, 4278, 4305, 4317, 4361, 4417, + 4428, 4439, 4458, 4482, 4511, 4569, 4633, 4700, + 4736, 4793, 4851, 4908, 4963, 5019, 5077, 5144, + 5197, 5256, 5313, 5370, 5429, 5461, 5494, 5527, + 5561, 5607, 5672, 5729, 5785, 5842, 5899, 5956, + 5999, 6058, 6113, 6171, 6228, 6283, 6338, 6375, + 6426, 6469, 6512, 6558, 6600, 6644, 6691, 6735, + 6771, 6808, 6845, 6884, 6921, 6948, 6975, 7004, + 7031, 7074, 7118, 7158, 7198, 7241, 7281, 7322, + 7351, 7390, 7433, 7476, 7521, 7565, 7611, 7657, +}; + +//***************************************************************************** +// +// The font definition for the 28 point Oldstandard bold font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard28b = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 27, + + // + // The height of the font. + // + 36, + + // + // The baseline of the font. + // + 28, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard28b, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard28bData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard28i.c b/third_party/fonts/ofl/fonts/fontoldstandard28i.c new file mode 100644 index 0000000..7906073 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard28i.c @@ -0,0 +1,875 @@ +//***************************************************************************** +// +// fontoldstandard28i.c - Font definition for the 28pt Oldstandard italic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 28 point +// Bold: no +// Italic: yes +// Memory usage: 8068 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 28 point Oldstandard italic font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard28iData[7867] = +{ + 5, 11, 0, 48, 16, 26, 9, 0, 8, 51, 99, 99, + 84, 84, 83, 99, 98, 114, 114, 98, 114, 113, 129, 129, + 240, 147, 99, 99, 0, 9, 96, 19, 9, 0, 8, 1, + 50, 34, 49, 50, 49, 49, 50, 49, 49, 65, 49, 0, + 25, 32, 45, 18, 0, 16, 98, 65, 177, 66, 177, 65, + 178, 65, 177, 65, 193, 65, 126, 129, 65, 177, 81, 177, + 65, 178, 65, 177, 66, 162, 65, 142, 113, 65, 177, 81, + 177, 65, 178, 65, 177, 66, 177, 65, 0, 19, 48, 75, + 18, 0, 12, 49, 33, 225, 17, 214, 179, 33, 17, 145, + 33, 33, 33, 113, 49, 17, 50, 97, 49, 17, 35, 82, + 33, 33, 19, 114, 17, 33, 19, 116, 17, 198, 228, 230, + 193, 21, 177, 17, 19, 99, 17, 33, 34, 99, 17, 17, + 50, 82, 49, 17, 50, 82, 33, 33, 50, 97, 33, 33, + 34, 116, 17, 34, 152, 177, 18, 225, 33, 225, 17, 0, + 12, 96, 63, 20, 0, 17, 116, 145, 82, 33, 129, 82, + 65, 83, 66, 88, 82, 81, 81, 98, 65, 81, 114, 65, + 65, 130, 49, 66, 130, 49, 50, 164, 65, 240, 49, 83, + 161, 66, 49, 130, 50, 65, 114, 66, 65, 113, 66, 81, + 97, 82, 81, 81, 98, 81, 66, 98, 65, 66, 114, 49, + 81, 148, 0, 20, 80, 60, 21, 0, 19, 115, 240, 18, + 34, 241, 65, 226, 65, 225, 65, 226, 50, 226, 33, 240, + 20, 67, 132, 81, 33, 98, 34, 65, 34, 82, 50, 49, + 146, 66, 49, 130, 82, 33, 131, 82, 17, 146, 99, 81, + 66, 98, 97, 66, 98, 81, 82, 98, 65, 99, 67, 50, + 118, 37, 0, 21, 112, 12, 4, 240, 225, 34, 34, 33, + 49, 49, 0, 11, 48, 32, 12, 0, 11, 66, 146, 146, + 161, 161, 161, 177, 161, 162, 161, 177, 161, 177, 177, 177, + 162, 162, 162, 162, 177, 177, 177, 178, 177, 178, 240, 240, + 224, 33, 12, 0, 9, 97, 178, 177, 178, 177, 177, 177, + 178, 162, 162, 162, 161, 177, 177, 162, 161, 177, 161, 177, + 161, 162, 161, 161, 161, 161, 161, 0, 5, 112, 29, 12, + 0, 11, 2, 162, 98, 33, 50, 34, 33, 35, 65, 17, + 18, 115, 131, 18, 66, 33, 35, 34, 33, 50, 98, 162, + 0, 26, 32, 53, 25, 0, 23, 33, 240, 145, 240, 145, + 240, 145, 240, 145, 240, 145, 240, 145, 240, 145, 240, 145, + 240, 145, 240, 145, 240, 145, 223, 8, 209, 240, 145, 240, + 145, 240, 145, 240, 145, 240, 145, 240, 145, 240, 145, 240, + 145, 240, 145, 240, 145, 0, 14, 16, 14, 5, 0, 14, + 51, 35, 35, 65, 65, 49, 65, 49, 240, 144, 10, 10, + 0, 22, 17, 145, 39, 0, 19, 16, 10, 5, 0, 15, + 3, 35, 35, 240, 240, 192, 34, 11, 0, 9, 33, 161, + 161, 145, 161, 161, 146, 145, 161, 146, 145, 161, 146, 145, + 161, 161, 145, 161, 161, 145, 161, 161, 145, 161, 161, 146, + 145, 240, 240, 32, 46, 16, 0, 14, 116, 163, 49, 130, + 82, 99, 82, 83, 98, 83, 98, 67, 115, 51, 115, 51, + 115, 35, 131, 35, 115, 51, 115, 51, 115, 50, 116, 50, + 115, 66, 115, 66, 99, 97, 98, 114, 66, 150, 193, 0, + 15, 48, 28, 13, 0, 12, 66, 177, 163, 148, 114, 19, + 162, 163, 163, 162, 178, 163, 163, 162, 178, 163, 163, 162, + 178, 163, 121, 0, 13, 64, 39, 17, 0, 15, 101, 162, + 66, 129, 114, 113, 115, 81, 131, 84, 83, 99, 83, 99, + 67, 227, 211, 195, 210, 210, 210, 226, 225, 145, 84, 113, + 81, 40, 97, 55, 98, 53, 0, 17, 112, 38, 17, 0, + 15, 101, 162, 66, 145, 98, 114, 98, 115, 83, 114, 83, + 226, 227, 211, 150, 178, 34, 240, 18, 242, 243, 98, 99, + 84, 67, 84, 83, 97, 99, 113, 98, 151, 0, 18, 35, + 15, 0, 14, 66, 195, 194, 194, 194, 209, 17, 177, 33, + 161, 34, 145, 34, 145, 35, 129, 51, 113, 67, 97, 82, + 109, 131, 195, 194, 195, 195, 138, 0, 15, 64, 37, 16, + 0, 16, 82, 97, 115, 65, 129, 21, 145, 225, 241, 246, + 161, 66, 129, 83, 98, 98, 97, 114, 211, 211, 82, 99, + 68, 82, 83, 83, 81, 114, 97, 98, 135, 0, 17, 44, + 14, 0, 13, 20, 130, 65, 98, 81, 82, 67, 67, 67, + 66, 82, 67, 178, 179, 36, 83, 17, 50, 68, 82, 51, + 98, 51, 98, 50, 114, 50, 114, 50, 99, 50, 98, 66, + 83, 81, 82, 103, 0, 14, 96, 35, 15, 0, 13, 49, + 19, 65, 86, 50, 50, 36, 33, 65, 70, 65, 99, 65, + 129, 210, 209, 209, 209, 209, 210, 194, 195, 194, 195, 195, + 180, 180, 179, 0, 16, 64, 45, 16, 0, 14, 102, 146, + 66, 114, 98, 97, 114, 82, 129, 82, 129, 82, 114, 83, + 97, 115, 66, 131, 18, 130, 20, 129, 68, 97, 99, 82, + 114, 81, 131, 65, 146, 65, 145, 82, 114, 97, 98, 135, + 0, 16, 112, 43, 15, 0, 13, 117, 146, 50, 114, 82, + 82, 98, 67, 98, 66, 114, 66, 114, 66, 99, 66, 99, + 66, 99, 66, 84, 82, 49, 18, 116, 34, 195, 194, 83, + 82, 83, 66, 83, 66, 113, 66, 134, 0, 16, 15, 8, + 0, 14, 50, 84, 82, 0, 7, 51, 83, 83, 0, 8, + 80, 20, 8, 0, 14, 50, 84, 82, 0, 6, 51, 83, + 83, 113, 113, 97, 113, 97, 240, 240, 144, 54, 24, 0, + 23, 81, 240, 114, 240, 82, 240, 82, 240, 83, 240, 67, + 240, 82, 240, 82, 240, 82, 240, 83, 240, 67, 240, 67, + 240, 82, 240, 146, 240, 131, 240, 131, 240, 130, 240, 146, + 240, 146, 240, 131, 240, 131, 240, 131, 240, 130, 240, 146, + 0, 12, 32, 13, 25, 0, 53, 31, 8, 0, 12, 111, + 8, 0, 37, 96, 52, 24, 0, 24, 3, 240, 130, 240, + 146, 240, 146, 240, 146, 240, 131, 240, 131, 240, 130, 240, + 146, 240, 146, 240, 131, 240, 130, 240, 83, 240, 67, 240, + 82, 240, 82, 240, 83, 240, 67, 240, 67, 240, 82, 240, + 82, 240, 82, 240, 83, 0, 14, 80, 34, 13, 0, 11, + 117, 98, 66, 65, 98, 65, 114, 50, 98, 50, 83, 162, + 147, 132, 130, 161, 177, 193, 49, 129, 49, 147, 240, 240, + 82, 164, 162, 0, 14, 32, 73, 22, 0, 20, 9, 178, + 130, 145, 193, 114, 83, 18, 33, 82, 66, 51, 49, 65, + 66, 67, 49, 50, 51, 67, 49, 49, 66, 82, 66, 33, + 66, 82, 66, 33, 50, 98, 66, 33, 50, 82, 82, 33, + 50, 82, 81, 49, 50, 82, 81, 49, 50, 67, 65, 66, + 49, 49, 18, 49, 97, 67, 52, 114, 240, 98, 240, 98, + 145, 201, 240, 33, 0, 20, 96, 46, 21, 0, 20, 49, + 240, 66, 240, 51, 240, 51, 240, 36, 240, 21, 240, 17, + 19, 241, 35, 226, 35, 225, 51, 209, 67, 193, 83, 201, + 177, 99, 161, 115, 146, 115, 145, 131, 130, 131, 115, 131, + 72, 56, 0, 21, 32, 44, 22, 0, 19, 124, 210, 99, + 163, 114, 163, 115, 146, 131, 131, 131, 131, 130, 147, 114, + 162, 99, 169, 211, 98, 178, 115, 162, 131, 131, 131, 131, + 131, 130, 147, 115, 131, 131, 131, 131, 114, 125, 0, 23, + 16, 43, 18, 0, 16, 86, 162, 97, 17, 98, 115, 82, + 146, 67, 146, 66, 161, 67, 161, 66, 177, 51, 243, 243, + 242, 240, 18, 240, 18, 177, 66, 177, 66, 161, 82, 146, + 98, 114, 114, 98, 151, 0, 19, 16, 45, 22, 0, 19, + 124, 210, 98, 179, 114, 163, 115, 146, 146, 131, 146, 131, + 146, 131, 146, 130, 147, 115, 147, 115, 147, 114, 163, 114, + 162, 115, 147, 115, 146, 130, 147, 115, 131, 131, 130, 147, + 98, 140, 0, 23, 32, 46, 22, 0, 19, 127, 162, 115, + 147, 130, 147, 145, 146, 161, 131, 81, 211, 81, 211, 81, + 210, 81, 217, 211, 66, 210, 81, 226, 81, 211, 81, 65, + 131, 161, 130, 161, 131, 161, 131, 146, 131, 116, 95, 1, + 0, 22, 96, 44, 22, 0, 19, 127, 162, 115, 147, 130, + 147, 145, 146, 161, 131, 81, 211, 81, 211, 81, 210, 81, + 217, 211, 66, 210, 81, 226, 81, 211, 81, 211, 240, 66, + 240, 67, 240, 67, 240, 67, 240, 25, 0, 23, 80, 50, + 19, 0, 17, 70, 49, 114, 98, 17, 98, 131, 82, 161, + 83, 161, 82, 177, 67, 177, 66, 193, 51, 240, 19, 240, + 19, 104, 34, 163, 66, 162, 82, 162, 82, 147, 82, 147, + 82, 131, 114, 113, 17, 114, 82, 33, 135, 49, 0, 19, + 96, 46, 26, 0, 23, 56, 56, 162, 146, 195, 146, 195, + 131, 194, 147, 179, 146, 195, 131, 194, 147, 194, 146, 206, + 195, 131, 194, 147, 194, 146, 195, 131, 195, 131, 194, 147, + 179, 146, 195, 131, 195, 131, 152, 56, 0, 26, 112, 27, + 15, 0, 13, 104, 162, 195, 195, 194, 195, 195, 195, 194, + 195, 195, 194, 210, 195, 195, 194, 195, 195, 195, 152, 0, + 15, 112, 44, 20, 0, 18, 89, 227, 240, 34, 240, 50, + 240, 35, 240, 35, 240, 34, 240, 35, 240, 35, 240, 35, + 240, 34, 240, 35, 240, 35, 240, 34, 163, 82, 164, 51, + 148, 66, 162, 98, 177, 82, 199, 0, 21, 64, 55, 26, + 0, 23, 56, 56, 162, 131, 195, 130, 211, 113, 242, 98, + 243, 81, 240, 35, 65, 240, 51, 34, 240, 66, 35, 240, + 53, 18, 240, 52, 35, 240, 34, 67, 240, 34, 82, 240, + 19, 83, 243, 83, 242, 114, 227, 115, 211, 115, 211, 115, + 168, 56, 0, 26, 112, 46, 20, 0, 18, 24, 242, 240, + 35, 240, 35, 240, 34, 240, 35, 240, 35, 240, 35, 240, + 34, 240, 35, 240, 35, 240, 34, 240, 50, 240, 35, 161, + 99, 161, 98, 161, 99, 161, 99, 146, 99, 116, 63, 1, + 0, 20, 64, 79, 29, 0, 26, 7, 135, 161, 18, 132, + 209, 18, 113, 19, 194, 18, 113, 18, 209, 34, 97, 34, + 209, 34, 97, 19, 209, 34, 81, 35, 193, 50, 65, 50, + 209, 50, 65, 35, 209, 50, 49, 51, 194, 50, 49, 51, + 193, 66, 33, 66, 209, 66, 33, 51, 209, 66, 17, 67, + 193, 82, 17, 66, 209, 83, 82, 209, 82, 83, 194, 82, + 83, 194, 81, 98, 167, 49, 56, 0, 29, 112, 59, 27, + 0, 24, 37, 120, 163, 131, 211, 145, 212, 145, 209, 19, + 113, 225, 34, 113, 225, 35, 97, 209, 51, 82, 209, 66, + 81, 225, 67, 65, 210, 67, 65, 209, 98, 50, 209, 99, + 33, 225, 99, 33, 209, 130, 33, 209, 132, 225, 132, 210, + 147, 210, 147, 167, 129, 240, 177, 0, 25, 45, 18, 0, + 16, 86, 162, 82, 130, 114, 98, 131, 67, 131, 66, 147, + 51, 147, 50, 163, 35, 163, 35, 163, 35, 163, 34, 179, + 34, 163, 50, 163, 50, 162, 66, 147, 66, 146, 98, 114, + 114, 98, 151, 0, 19, 16, 43, 21, 0, 19, 12, 194, + 98, 163, 99, 147, 114, 146, 130, 131, 115, 131, 115, 131, + 114, 146, 115, 131, 98, 169, 194, 240, 66, 240, 51, 240, + 51, 240, 50, 240, 51, 240, 51, 240, 51, 249, 0, 22, + 64, 59, 18, 0, 16, 86, 162, 82, 130, 114, 98, 131, + 67, 131, 66, 147, 51, 147, 50, 163, 35, 163, 35, 163, + 35, 163, 34, 179, 34, 163, 50, 163, 50, 162, 66, 35, + 67, 66, 33, 33, 50, 99, 49, 34, 115, 49, 18, 151, + 243, 49, 179, 49, 179, 33, 195, 18, 212, 0, 7, 80, + 48, 21, 0, 19, 11, 210, 83, 163, 98, 163, 99, 146, + 115, 131, 115, 131, 114, 147, 99, 146, 98, 169, 195, 81, + 194, 113, 178, 114, 147, 99, 147, 99, 146, 115, 131, 115, + 33, 83, 114, 49, 83, 114, 33, 57, 83, 0, 21, 64, + 43, 18, 0, 16, 71, 162, 82, 17, 98, 115, 98, 130, + 97, 146, 98, 129, 114, 129, 116, 244, 245, 230, 229, 97, + 131, 97, 146, 82, 162, 66, 161, 82, 161, 83, 130, 65, + 34, 113, 81, 56, 0, 18, 96, 52, 20, 0, 17, 111, + 1, 67, 51, 52, 66, 67, 66, 66, 83, 81, 65, 98, + 97, 65, 83, 97, 49, 99, 81, 65, 98, 97, 178, 240, + 35, 240, 35, 240, 34, 240, 35, 240, 35, 240, 35, 240, + 34, 240, 35, 240, 35, 240, 34, 234, 0, 21, 32, 48, + 23, 0, 20, 25, 72, 83, 147, 130, 177, 146, 162, 131, + 161, 147, 161, 146, 177, 131, 161, 147, 161, 146, 177, 146, + 177, 131, 161, 147, 161, 146, 177, 146, 162, 146, 161, 162, + 161, 162, 145, 194, 113, 232, 240, 65, 0, 22, 16, 52, + 22, 0, 19, 41, 56, 83, 131, 130, 146, 146, 145, 162, + 129, 178, 114, 178, 113, 194, 97, 210, 97, 210, 81, 226, + 65, 242, 65, 242, 49, 240, 18, 34, 240, 18, 33, 240, + 34, 17, 240, 52, 240, 51, 240, 66, 240, 82, 240, 81, + 0, 21, 64, 81, 31, 0, 27, 24, 41, 40, 82, 131, + 115, 130, 130, 130, 146, 130, 130, 146, 115, 129, 162, 115, + 113, 178, 100, 98, 178, 97, 18, 97, 194, 81, 34, 81, + 210, 66, 34, 66, 210, 65, 50, 65, 226, 49, 66, 50, + 226, 49, 66, 49, 242, 33, 82, 33, 240, 18, 18, 82, + 18, 240, 18, 17, 98, 17, 240, 35, 116, 240, 35, 115, + 240, 50, 130, 240, 65, 146, 240, 65, 145, 0, 29, 32, + 57, 27, 0, 24, 25, 57, 163, 116, 211, 114, 240, 18, + 113, 240, 35, 81, 240, 66, 65, 240, 83, 34, 240, 83, + 18, 240, 116, 240, 131, 240, 163, 240, 132, 240, 113, 34, + 240, 97, 51, 240, 65, 82, 240, 49, 99, 240, 17, 130, + 242, 131, 211, 131, 153, 57, 0, 27, 96, 49, 22, 0, + 19, 41, 56, 83, 131, 146, 130, 162, 129, 179, 97, 195, + 81, 226, 65, 242, 49, 240, 19, 18, 240, 19, 17, 240, + 51, 240, 66, 240, 67, 240, 67, 240, 67, 240, 66, 240, + 67, 240, 67, 240, 66, 240, 26, 0, 23, 64, 46, 20, + 0, 18, 14, 99, 115, 114, 115, 114, 116, 113, 131, 113, + 131, 129, 115, 240, 19, 240, 35, 240, 19, 240, 19, 240, + 19, 240, 20, 113, 131, 129, 115, 129, 115, 145, 99, 146, + 84, 131, 83, 131, 95, 0, 20, 80, 33, 14, 0, 13, + 6, 130, 194, 194, 178, 194, 194, 194, 178, 194, 194, 194, + 178, 194, 194, 178, 194, 194, 194, 178, 194, 194, 194, 178, + 194, 198, 240, 240, 96, 33, 11, 0, 8, 33, 161, 177, + 161, 161, 177, 161, 161, 177, 161, 161, 162, 161, 161, 162, + 161, 161, 161, 177, 161, 161, 177, 161, 161, 177, 161, 161, + 240, 144, 33, 14, 0, 13, 6, 194, 194, 178, 194, 194, + 194, 178, 194, 194, 194, 178, 194, 194, 178, 194, 194, 194, + 178, 194, 194, 194, 178, 194, 194, 134, 240, 240, 96, 25, + 14, 0, 12, 113, 210, 177, 18, 146, 33, 145, 50, 114, + 65, 113, 97, 81, 114, 50, 129, 49, 161, 0, 31, 96, + 8, 17, 0, 63, 111, 0, 8, 96, 11, 5, 240, 240, + 162, 50, 66, 65, 0, 14, 80, 41, 15, 0, 26, 115, + 34, 99, 33, 18, 83, 66, 98, 82, 83, 67, 82, 82, + 83, 82, 83, 82, 82, 83, 33, 34, 65, 17, 49, 34, + 65, 17, 33, 66, 33, 33, 17, 99, 51, 0, 15, 64, + 41, 12, 0, 10, 85, 162, 146, 162, 162, 162, 146, 162, + 35, 82, 17, 34, 65, 17, 50, 51, 66, 50, 82, 50, + 82, 34, 98, 34, 98, 34, 82, 50, 82, 50, 66, 81, + 50, 116, 0, 12, 96, 27, 12, 0, 21, 84, 114, 34, + 82, 50, 66, 51, 51, 50, 66, 162, 147, 147, 161, 97, + 66, 65, 82, 49, 116, 0, 12, 96, 48, 16, 0, 15, + 21, 226, 210, 226, 226, 225, 226, 147, 34, 130, 33, 18, + 114, 66, 114, 82, 99, 67, 98, 83, 98, 82, 99, 82, + 98, 83, 33, 50, 65, 17, 49, 50, 65, 17, 33, 82, + 33, 33, 17, 115, 50, 0, 16, 96, 28, 12, 0, 21, + 84, 114, 34, 82, 50, 66, 65, 66, 81, 66, 50, 85, + 99, 147, 161, 97, 66, 65, 82, 49, 116, 0, 12, 96, + 36, 16, 0, 15, 35, 178, 49, 146, 50, 145, 65, 146, + 225, 226, 184, 178, 210, 226, 226, 226, 210, 226, 226, 226, + 210, 226, 226, 225, 226, 226, 226, 210, 226, 226, 240, 240, + 45, 15, 0, 27, 3, 34, 114, 33, 18, 98, 66, 98, + 82, 83, 67, 82, 82, 98, 82, 83, 82, 82, 83, 82, + 82, 98, 67, 114, 33, 18, 131, 34, 194, 210, 98, 82, + 98, 66, 114, 65, 129, 50, 164, 240, 160, 46, 14, 0, + 12, 69, 194, 193, 194, 194, 193, 194, 194, 50, 114, 18, + 18, 97, 17, 50, 82, 17, 50, 83, 66, 83, 50, 83, + 66, 83, 51, 82, 66, 98, 66, 33, 34, 81, 33, 50, + 81, 33, 50, 83, 0, 14, 64, 32, 10, 0, 9, 51, + 115, 115, 240, 240, 242, 113, 18, 81, 34, 65, 50, 65, + 50, 114, 130, 115, 114, 130, 33, 81, 33, 97, 33, 99, + 0, 10, 80, 38, 15, 0, 14, 50, 211, 194, 0, 8, + 114, 178, 18, 161, 34, 145, 50, 145, 49, 210, 210, 210, + 194, 210, 210, 210, 194, 210, 210, 209, 131, 34, 130, 49, + 146, 34, 163, 240, 176, 46, 14, 0, 12, 69, 194, 193, + 194, 194, 193, 194, 194, 66, 98, 34, 18, 81, 49, 19, + 66, 49, 130, 33, 148, 146, 50, 114, 50, 49, 50, 50, + 33, 65, 66, 33, 50, 66, 17, 66, 66, 17, 66, 67, + 0, 14, 80, 31, 8, 0, 7, 21, 98, 82, 98, 98, + 97, 98, 98, 98, 82, 98, 98, 98, 82, 98, 98, 33, + 49, 49, 49, 33, 65, 17, 82, 0, 8, 96, 59, 23, + 0, 40, 82, 67, 67, 97, 18, 33, 33, 49, 33, 81, + 34, 17, 49, 33, 49, 65, 51, 50, 17, 50, 65, 51, + 51, 66, 115, 67, 51, 115, 66, 66, 130, 67, 66, 130, + 66, 66, 49, 66, 82, 66, 33, 82, 82, 65, 49, 82, + 66, 81, 33, 82, 82, 98, 0, 23, 80, 44, 16, 0, + 28, 50, 67, 97, 18, 33, 34, 65, 34, 17, 50, 49, + 51, 66, 49, 49, 17, 50, 115, 66, 115, 51, 114, 66, + 130, 66, 33, 66, 66, 49, 66, 66, 33, 82, 66, 17, + 82, 99, 0, 16, 64, 31, 13, 0, 23, 52, 130, 34, + 98, 65, 82, 82, 51, 82, 50, 98, 50, 83, 35, 82, + 51, 82, 65, 83, 66, 66, 82, 50, 131, 0, 13, 112, + 48, 18, 0, 32, 34, 52, 129, 18, 17, 50, 97, 35, + 66, 81, 51, 66, 81, 50, 82, 131, 82, 130, 83, 130, + 82, 146, 82, 131, 67, 131, 66, 147, 50, 146, 35, 178, + 240, 18, 240, 18, 242, 240, 18, 240, 18, 217, 240, 192, + 42, 14, 0, 25, 19, 49, 98, 33, 33, 82, 49, 17, + 82, 82, 67, 67, 66, 83, 66, 82, 67, 82, 66, 83, + 66, 82, 82, 67, 98, 33, 18, 115, 34, 178, 194, 194, + 194, 178, 194, 137, 240, 48, 30, 13, 0, 23, 18, 51, + 65, 18, 17, 18, 49, 35, 34, 33, 51, 34, 33, 50, + 113, 35, 162, 178, 178, 162, 178, 178, 162, 0, 14, 32, + 28, 12, 0, 21, 68, 114, 49, 82, 81, 66, 66, 66, + 65, 98, 179, 163, 66, 66, 66, 81, 65, 97, 66, 65, + 101, 0, 12, 96, 31, 10, 0, 9, 50, 114, 130, 130, + 130, 114, 130, 103, 82, 114, 130, 130, 129, 130, 130, 130, + 33, 81, 49, 66, 33, 97, 33, 99, 0, 10, 96, 45, + 16, 0, 28, 50, 98, 81, 18, 82, 65, 34, 66, 65, + 50, 66, 65, 50, 66, 114, 67, 114, 66, 115, 51, 114, + 49, 18, 33, 66, 49, 17, 49, 65, 49, 33, 33, 81, + 33, 49, 33, 83, 67, 0, 16, 64, 35, 14, 0, 24, + 114, 66, 81, 18, 35, 65, 34, 51, 33, 50, 81, 33, + 50, 65, 98, 81, 98, 81, 82, 97, 82, 81, 98, 66, + 97, 81, 113, 50, 147, 0, 15, 52, 20, 0, 35, 50, + 98, 35, 65, 18, 82, 35, 49, 34, 66, 66, 33, 50, + 66, 81, 33, 50, 66, 81, 82, 67, 81, 82, 66, 97, + 66, 67, 81, 82, 67, 81, 82, 49, 17, 81, 97, 49, + 33, 66, 97, 34, 33, 50, 130, 68, 0, 20, 112, 38, + 16, 0, 28, 67, 52, 81, 34, 18, 33, 65, 67, 34, + 49, 82, 35, 146, 210, 226, 226, 210, 81, 51, 34, 81, + 50, 33, 17, 65, 65, 34, 18, 33, 83, 67, 0, 16, + 96, 50, 15, 0, 26, 82, 98, 65, 18, 82, 49, 34, + 66, 49, 50, 66, 49, 50, 66, 98, 67, 98, 66, 98, + 67, 98, 67, 98, 49, 18, 97, 49, 18, 113, 34, 18, + 130, 50, 210, 194, 98, 82, 98, 66, 114, 66, 114, 50, + 148, 240, 160, 28, 12, 0, 21, 67, 33, 85, 17, 65, + 52, 49, 113, 146, 131, 115, 129, 161, 161, 113, 52, 50, + 49, 37, 65, 51, 0, 12, 80, 34, 12, 0, 10, 17, + 146, 145, 162, 161, 162, 162, 162, 162, 162, 162, 161, 161, + 131, 178, 177, 177, 162, 162, 146, 162, 146, 162, 161, 177, + 193, 193, 240, 240, 48, 30, 3, 240, 97, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 128, 34, + 12, 0, 9, 113, 193, 193, 177, 162, 162, 146, 162, 146, + 162, 161, 177, 178, 194, 130, 145, 162, 162, 162, 162, 162, + 162, 161, 162, 161, 161, 146, 240, 240, 64, 17, 17, 0, + 36, 37, 114, 40, 97, 33, 55, 49, 33, 104, 34, 117, + 0, 28, 5, 11, 0, 48, 16, 24, 9, 0, 16, 35, + 99, 99, 240, 145, 129, 129, 114, 114, 98, 114, 114, 99, + 99, 99, 84, 83, 99, 99, 240, 44, 12, 0, 15, 113, + 161, 177, 177, 148, 114, 17, 17, 82, 17, 34, 50, 33, + 19, 50, 33, 18, 51, 17, 114, 33, 114, 33, 114, 33, + 114, 17, 130, 17, 49, 81, 17, 33, 116, 129, 177, 177, + 0, 8, 80, 47, 22, 0, 21, 20, 240, 18, 65, 241, + 81, 226, 51, 210, 67, 210, 240, 67, 240, 66, 240, 82, + 240, 67, 247, 240, 72, 226, 240, 67, 240, 66, 145, 161, + 161, 71, 145, 50, 53, 114, 49, 77, 70, 56, 113, 0, + 21, 80, 35, 15, 0, 18, 98, 37, 49, 52, 67, 81, + 114, 66, 129, 65, 161, 49, 161, 49, 161, 49, 161, 49, + 161, 50, 129, 81, 114, 68, 67, 50, 37, 49, 0, 22, + 96, 41, 19, 0, 16, 103, 54, 83, 99, 115, 113, 146, + 97, 162, 97, 162, 81, 179, 49, 195, 33, 226, 33, 226, + 17, 243, 202, 210, 203, 195, 240, 18, 240, 34, 240, 19, + 240, 19, 216, 0, 20, 48, 25, 3, 240, 97, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 240, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 176, 53, 15, 0, 14, 4, + 146, 50, 129, 82, 98, 97, 97, 83, 97, 82, 114, 211, + 177, 35, 129, 67, 98, 83, 81, 115, 66, 114, 66, 114, + 68, 81, 100, 65, 116, 33, 164, 195, 114, 66, 99, 66, + 97, 98, 97, 97, 114, 81, 129, 65, 164, 240, 240, 144, + 13, 10, 0, 10, 18, 50, 35, 35, 50, 50, 0, 30, + 32, 69, 22, 0, 20, 8, 194, 130, 145, 193, 113, 84, + 81, 81, 82, 51, 49, 65, 66, 82, 49, 49, 82, 97, + 65, 33, 67, 97, 65, 33, 66, 193, 33, 66, 193, 33, + 66, 193, 33, 66, 193, 33, 66, 113, 65, 33, 67, 81, + 81, 49, 66, 81, 65, 65, 82, 50, 65, 81, 84, 81, + 113, 193, 146, 130, 200, 240, 49, 0, 20, 80, 25, 10, + 0, 9, 18, 17, 66, 34, 65, 50, 50, 49, 66, 49, + 66, 34, 17, 34, 20, 66, 19, 54, 0, 24, 32, 24, + 10, 0, 19, 49, 129, 129, 49, 66, 33, 66, 33, 66, + 34, 66, 34, 82, 33, 82, 33, 97, 0, 13, 48, 13, + 16, 0, 28, 14, 226, 226, 226, 226, 226, 0, 30, 32, + 10, 10, 0, 22, 17, 145, 39, 0, 19, 16, 76, 22, + 0, 20, 8, 194, 130, 145, 193, 113, 25, 65, 81, 66, + 66, 65, 65, 66, 67, 49, 49, 82, 67, 65, 33, 82, + 67, 65, 33, 82, 66, 81, 33, 86, 113, 33, 82, 65, + 97, 33, 82, 66, 81, 33, 82, 66, 81, 33, 82, 66, + 33, 33, 49, 66, 66, 33, 17, 65, 66, 67, 17, 17, + 81, 22, 51, 17, 113, 193, 146, 130, 200, 240, 49, 0, + 20, 80, 8, 11, 0, 13, 105, 0, 33, 32, 27, 11, + 0, 10, 19, 114, 33, 82, 65, 50, 81, 50, 81, 50, + 65, 51, 65, 50, 81, 66, 49, 82, 33, 115, 0, 24, + 16, 43, 25, 0, 26, 49, 240, 145, 240, 145, 240, 145, + 240, 145, 240, 145, 240, 145, 240, 145, 223, 8, 209, 240, + 145, 240, 145, 240, 145, 240, 145, 240, 145, 240, 145, 240, + 145, 0, 7, 127, 8, 0, 22, 16, 28, 11, 0, 10, + 20, 97, 50, 65, 81, 67, 49, 66, 50, 146, 129, 130, + 129, 130, 65, 51, 65, 49, 36, 65, 50, 0, 21, 32, + 28, 11, 0, 10, 20, 97, 50, 82, 49, 82, 49, 81, + 50, 130, 85, 162, 66, 50, 51, 50, 49, 82, 50, 50, + 84, 0, 21, 48, 11, 7, 0, 7, 50, 82, 66, 65, + 81, 0, 20, 45, 16, 0, 28, 50, 82, 114, 82, 114, + 82, 114, 82, 98, 82, 114, 82, 114, 82, 114, 66, 115, + 66, 114, 82, 49, 51, 51, 33, 49, 18, 33, 18, 17, + 65, 35, 35, 81, 241, 241, 242, 226, 226, 227, 240, 224, + 56, 15, 0, 13, 89, 84, 49, 101, 49, 86, 49, 86, + 34, 85, 49, 101, 49, 101, 49, 116, 33, 161, 49, 161, + 49, 161, 49, 146, 33, 161, 49, 161, 49, 161, 34, 145, + 49, 161, 49, 161, 49, 161, 34, 145, 49, 161, 49, 161, + 49, 161, 33, 161, 49, 0, 6, 112, 10, 5, 0, 10, + 83, 35, 35, 0, 9, 80, 14, 7, 0, 24, 1, 81, + 113, 50, 18, 33, 33, 52, 240, 32, 19, 9, 0, 8, + 81, 113, 99, 114, 113, 114, 114, 114, 113, 114, 114, 86, + 0, 18, 48, 23, 10, 0, 9, 35, 82, 34, 65, 50, + 50, 50, 49, 66, 49, 65, 65, 50, 65, 49, 99, 86, + 0, 23, 27, 11, 0, 21, 33, 113, 33, 113, 49, 113, + 34, 97, 34, 98, 34, 66, 34, 81, 34, 81, 33, 97, + 33, 145, 0, 13, 48, 56, 21, 0, 19, 17, 129, 161, + 129, 147, 129, 162, 113, 177, 114, 162, 113, 178, 97, 194, + 97, 193, 97, 98, 66, 81, 98, 82, 81, 97, 70, 33, + 97, 17, 177, 81, 18, 161, 81, 33, 161, 81, 34, 161, + 65, 50, 145, 73, 98, 145, 145, 146, 129, 134, 0, 21, + 48, 58, 22, 0, 20, 1, 129, 177, 129, 163, 129, 178, + 113, 193, 114, 178, 113, 194, 97, 210, 97, 209, 97, 52, + 98, 81, 49, 50, 82, 81, 33, 82, 38, 33, 51, 50, + 161, 66, 49, 161, 145, 161, 130, 177, 98, 193, 82, 210, + 67, 65, 129, 81, 36, 129, 97, 50, 0, 22, 96, 60, + 22, 0, 19, 100, 129, 129, 50, 97, 131, 49, 97, 145, + 50, 81, 225, 82, 164, 97, 226, 65, 242, 65, 162, 50, + 49, 98, 35, 50, 33, 113, 49, 66, 49, 98, 68, 65, + 99, 193, 84, 177, 81, 33, 177, 81, 34, 177, 65, 50, + 161, 73, 114, 145, 161, 146, 145, 134, 0, 22, 48, 33, + 13, 0, 23, 83, 164, 147, 240, 240, 83, 145, 34, 113, + 65, 178, 162, 147, 131, 147, 146, 162, 82, 66, 83, 50, + 98, 50, 97, 82, 65, 117, 240, 64, 55, 21, 240, 240, + 67, 240, 66, 240, 81, 240, 82, 0, 7, 97, 240, 66, + 240, 51, 240, 51, 240, 36, 240, 21, 240, 17, 19, 241, + 35, 226, 35, 225, 51, 209, 67, 193, 83, 201, 177, 99, + 161, 115, 146, 115, 145, 131, 130, 131, 115, 131, 72, 56, + 0, 21, 32, 58, 23, 240, 240, 194, 240, 83, 240, 66, + 240, 97, 0, 8, 49, 240, 98, 240, 83, 240, 83, 240, + 68, 240, 53, 240, 49, 19, 240, 33, 35, 240, 18, 35, + 240, 17, 51, 241, 67, 225, 83, 233, 209, 99, 193, 115, + 178, 115, 177, 131, 162, 131, 147, 131, 104, 56, 0, 23, + 64, 62, 23, 240, 240, 161, 240, 99, 240, 65, 33, 240, + 34, 65, 240, 129, 240, 240, 177, 240, 98, 240, 83, 240, + 83, 240, 68, 240, 53, 240, 49, 19, 240, 33, 35, 240, + 18, 35, 240, 17, 51, 241, 67, 225, 83, 233, 209, 99, + 193, 115, 178, 115, 177, 131, 162, 131, 147, 131, 104, 56, + 0, 23, 64, 58, 23, 240, 240, 115, 49, 241, 34, 33, + 241, 51, 0, 11, 1, 240, 98, 240, 83, 240, 83, 240, + 68, 240, 53, 240, 49, 19, 240, 33, 35, 240, 18, 35, + 240, 17, 51, 241, 67, 225, 83, 233, 209, 99, 193, 115, + 178, 115, 177, 131, 162, 131, 147, 131, 104, 56, 0, 23, + 64, 59, 24, 240, 240, 114, 66, 240, 19, 51, 242, 66, + 0, 11, 49, 240, 114, 240, 99, 240, 99, 240, 84, 240, + 69, 240, 65, 19, 240, 49, 35, 240, 34, 35, 240, 33, + 51, 240, 17, 67, 241, 83, 249, 225, 99, 209, 115, 194, + 115, 193, 131, 178, 131, 163, 131, 120, 56, 0, 24, 80, + 60, 21, 243, 240, 33, 49, 240, 17, 49, 241, 65, 240, + 17, 49, 240, 35, 240, 240, 161, 240, 66, 240, 51, 240, + 51, 240, 36, 240, 21, 240, 17, 19, 241, 35, 226, 35, + 225, 51, 209, 67, 193, 83, 201, 177, 99, 161, 115, 146, + 115, 145, 131, 130, 131, 115, 131, 72, 56, 0, 21, 32, + 74, 32, 0, 29, 127, 240, 67, 115, 240, 52, 130, 240, + 37, 130, 240, 33, 18, 161, 240, 17, 19, 81, 240, 81, + 35, 81, 240, 65, 50, 97, 240, 49, 66, 81, 240, 65, + 57, 240, 49, 67, 66, 240, 33, 82, 81, 240, 41, 81, + 240, 17, 99, 81, 65, 162, 99, 161, 161, 114, 161, 161, + 115, 161, 146, 115, 146, 130, 130, 132, 88, 47, 1, 0, + 32, 96, 55, 18, 0, 16, 86, 162, 97, 17, 98, 115, + 82, 146, 67, 146, 66, 161, 67, 161, 66, 177, 51, 243, + 243, 242, 240, 18, 240, 18, 177, 66, 177, 66, 161, 82, + 146, 98, 114, 114, 98, 151, 209, 240, 33, 240, 49, 210, + 34, 194, 34, 193, 34, 227, 240, 240, 16, 55, 22, 240, + 240, 35, 240, 82, 240, 97, 240, 97, 0, 7, 47, 162, + 115, 147, 130, 147, 145, 146, 161, 131, 81, 211, 81, 211, + 81, 210, 81, 217, 211, 66, 210, 81, 226, 81, 211, 81, + 65, 131, 161, 130, 161, 131, 161, 131, 146, 131, 116, 95, + 1, 0, 22, 96, 55, 22, 240, 240, 130, 240, 67, 240, + 50, 240, 66, 0, 7, 15, 162, 115, 147, 130, 147, 145, + 146, 161, 131, 81, 211, 81, 211, 81, 210, 81, 217, 211, + 66, 210, 81, 226, 81, 211, 81, 65, 131, 161, 130, 161, + 131, 161, 131, 146, 131, 116, 95, 1, 0, 22, 96, 59, + 22, 240, 240, 97, 240, 83, 240, 49, 33, 240, 18, 65, + 240, 113, 240, 240, 31, 162, 115, 147, 130, 147, 145, 146, + 161, 131, 81, 211, 81, 211, 81, 210, 81, 217, 211, 66, + 210, 81, 226, 81, 211, 81, 65, 131, 161, 130, 161, 131, + 161, 131, 146, 131, 116, 95, 1, 0, 22, 96, 54, 22, + 240, 240, 34, 66, 227, 50, 226, 66, 0, 9, 63, 162, + 115, 147, 130, 147, 145, 146, 161, 131, 81, 211, 81, 211, + 81, 210, 81, 217, 211, 66, 210, 81, 226, 81, 211, 81, + 65, 131, 161, 130, 161, 131, 161, 131, 146, 131, 116, 95, + 1, 0, 22, 96, 32, 15, 240, 114, 210, 225, 241, 240, + 240, 168, 162, 195, 195, 194, 195, 195, 195, 194, 195, 195, + 194, 210, 195, 195, 194, 195, 195, 195, 152, 0, 15, 112, + 31, 16, 240, 210, 211, 210, 209, 240, 240, 200, 178, 211, + 211, 210, 211, 211, 211, 210, 211, 211, 210, 226, 211, 211, + 210, 211, 211, 211, 168, 0, 17, 34, 15, 240, 162, 195, + 177, 34, 130, 65, 240, 240, 120, 162, 195, 195, 194, 195, + 195, 195, 194, 195, 195, 194, 210, 195, 195, 194, 195, 195, + 195, 152, 0, 15, 112, 34, 17, 240, 146, 50, 147, 51, + 146, 50, 0, 7, 56, 194, 227, 227, 226, 227, 227, 227, + 226, 227, 227, 226, 242, 227, 227, 226, 227, 227, 227, 184, + 0, 18, 16, 45, 22, 0, 19, 124, 210, 98, 179, 114, + 163, 115, 146, 146, 131, 146, 131, 146, 131, 146, 130, 147, + 74, 83, 115, 147, 114, 163, 114, 162, 115, 147, 115, 146, + 130, 147, 115, 131, 131, 130, 147, 98, 140, 0, 23, 32, + 69, 27, 240, 240, 162, 65, 240, 65, 34, 33, 240, 131, + 0, 11, 101, 120, 163, 131, 211, 145, 212, 145, 209, 19, + 113, 225, 34, 113, 225, 35, 97, 209, 51, 82, 209, 66, + 81, 225, 67, 65, 210, 67, 65, 209, 98, 50, 209, 99, + 33, 225, 99, 33, 209, 130, 33, 209, 132, 225, 132, 210, + 147, 210, 147, 167, 129, 240, 177, 0, 25, 53, 18, 240, + 178, 240, 18, 240, 34, 240, 33, 0, 6, 38, 162, 82, + 130, 114, 98, 131, 67, 131, 66, 147, 51, 147, 50, 163, + 35, 163, 35, 163, 35, 163, 34, 179, 34, 163, 50, 163, + 50, 162, 66, 147, 66, 146, 98, 114, 114, 98, 151, 0, + 19, 16, 51, 18, 240, 240, 19, 242, 242, 241, 0, 6, + 22, 162, 82, 130, 114, 98, 131, 67, 131, 66, 147, 51, + 147, 50, 163, 35, 163, 35, 163, 35, 163, 34, 179, 34, + 163, 50, 163, 50, 162, 66, 147, 66, 146, 98, 114, 114, + 98, 151, 0, 19, 16, 53, 18, 178, 240, 18, 243, 225, + 34, 178, 66, 0, 5, 102, 162, 82, 130, 114, 98, 131, + 67, 131, 66, 147, 51, 147, 50, 163, 35, 163, 35, 163, + 35, 163, 34, 179, 34, 163, 50, 163, 50, 162, 66, 147, + 66, 146, 98, 114, 114, 98, 151, 0, 19, 16, 53, 18, + 240, 179, 65, 145, 35, 33, 145, 67, 0, 8, 6, 162, + 82, 130, 114, 98, 131, 67, 131, 66, 147, 51, 147, 50, + 163, 35, 163, 35, 163, 35, 163, 34, 179, 34, 163, 50, + 163, 50, 162, 66, 147, 66, 146, 98, 114, 114, 98, 151, + 0, 19, 16, 52, 18, 240, 178, 51, 147, 51, 162, 51, + 0, 7, 118, 162, 82, 130, 114, 98, 131, 67, 131, 66, + 147, 51, 147, 50, 163, 35, 163, 35, 163, 35, 163, 34, + 179, 34, 163, 50, 163, 50, 162, 66, 147, 66, 146, 98, + 114, 114, 98, 151, 0, 19, 16, 41, 19, 0, 26, 17, + 226, 49, 194, 81, 162, 113, 130, 145, 98, 177, 66, 209, + 34, 243, 240, 18, 240, 18, 17, 226, 49, 209, 66, 177, + 98, 145, 130, 113, 162, 81, 194, 49, 226, 0, 16, 112, + 59, 21, 0, 19, 55, 49, 146, 82, 17, 146, 115, 130, + 131, 115, 116, 114, 113, 19, 99, 113, 19, 98, 113, 35, + 83, 97, 51, 83, 81, 67, 83, 65, 83, 82, 65, 99, + 82, 49, 99, 98, 33, 115, 98, 17, 130, 115, 131, 114, + 131, 131, 114, 132, 98, 130, 39, 240, 33, 0, 20, 57, + 23, 240, 240, 18, 240, 114, 240, 98, 240, 113, 0, 7, + 41, 72, 83, 147, 130, 177, 146, 162, 131, 161, 147, 161, + 146, 177, 131, 161, 147, 161, 146, 177, 146, 177, 131, 161, + 147, 161, 146, 177, 146, 162, 146, 161, 162, 161, 162, 145, + 194, 113, 232, 240, 65, 0, 22, 16, 57, 23, 240, 240, + 114, 240, 82, 240, 82, 240, 82, 0, 7, 9, 72, 83, + 147, 130, 177, 146, 162, 131, 161, 147, 161, 146, 177, 131, + 161, 147, 161, 146, 177, 146, 177, 131, 161, 147, 161, 146, + 177, 146, 162, 146, 161, 162, 161, 162, 145, 194, 113, 232, + 240, 65, 0, 22, 16, 59, 23, 193, 240, 98, 240, 84, + 240, 50, 33, 240, 33, 81, 0, 6, 105, 72, 83, 147, + 130, 177, 146, 162, 131, 161, 147, 161, 146, 177, 131, 161, + 147, 161, 146, 177, 146, 177, 131, 161, 147, 161, 146, 177, + 146, 162, 146, 161, 162, 161, 162, 145, 194, 113, 232, 240, + 65, 0, 22, 16, 56, 23, 240, 240, 18, 66, 243, 35, + 242, 66, 0, 9, 73, 72, 83, 147, 130, 177, 146, 162, + 131, 161, 147, 161, 146, 177, 131, 161, 147, 161, 146, 177, + 146, 177, 131, 161, 147, 161, 146, 177, 146, 162, 146, 161, + 162, 161, 162, 145, 194, 113, 232, 240, 65, 0, 22, 16, + 58, 22, 240, 240, 82, 240, 67, 240, 66, 240, 65, 0, + 6, 105, 56, 83, 131, 146, 130, 162, 129, 179, 97, 195, + 81, 226, 65, 242, 49, 240, 19, 18, 240, 19, 17, 240, + 51, 240, 66, 240, 67, 240, 67, 240, 67, 240, 66, 240, + 67, 240, 67, 240, 66, 240, 26, 0, 23, 64, 42, 20, + 0, 18, 25, 226, 240, 35, 240, 41, 178, 83, 147, 99, + 131, 114, 130, 130, 130, 130, 115, 115, 115, 115, 114, 130, + 130, 114, 131, 98, 153, 178, 240, 35, 240, 35, 240, 35, + 233, 0, 21, 48, 56, 17, 0, 16, 20, 178, 50, 146, + 66, 130, 82, 130, 82, 130, 66, 130, 66, 146, 19, 178, + 50, 146, 81, 146, 82, 130, 82, 130, 82, 114, 98, 114, + 98, 114, 17, 66, 98, 19, 34, 114, 18, 50, 114, 17, + 50, 130, 35, 146, 242, 242, 241, 242, 242, 0, 6, 16, + 47, 15, 0, 15, 83, 210, 225, 225, 240, 240, 195, 34, + 99, 33, 18, 83, 66, 98, 82, 83, 67, 82, 82, 83, + 82, 83, 82, 82, 83, 33, 34, 65, 17, 49, 34, 65, + 17, 33, 66, 33, 33, 17, 99, 51, 0, 15, 64, 47, + 15, 0, 16, 35, 194, 194, 193, 240, 240, 179, 34, 99, + 33, 18, 83, 66, 98, 82, 83, 67, 82, 82, 83, 82, + 83, 82, 82, 83, 33, 34, 65, 17, 49, 34, 65, 17, + 33, 66, 33, 33, 17, 99, 51, 0, 15, 64, 50, 15, + 0, 14, 33, 210, 195, 178, 18, 145, 65, 240, 240, 147, + 34, 99, 33, 18, 83, 66, 98, 82, 83, 67, 82, 82, + 83, 82, 83, 82, 82, 83, 33, 34, 65, 17, 49, 34, + 65, 17, 33, 66, 33, 33, 17, 99, 51, 0, 15, 64, + 50, 15, 0, 15, 99, 49, 113, 34, 17, 129, 51, 0, + 6, 83, 34, 99, 33, 18, 83, 66, 98, 82, 83, 67, + 82, 82, 83, 82, 83, 82, 82, 83, 33, 34, 65, 17, + 49, 34, 65, 17, 33, 66, 33, 33, 17, 99, 51, 0, + 15, 64, 49, 15, 0, 15, 82, 50, 131, 35, 114, 50, + 0, 6, 83, 34, 99, 33, 18, 83, 66, 98, 82, 83, + 67, 82, 82, 83, 82, 83, 82, 82, 83, 33, 34, 65, + 17, 49, 34, 65, 17, 33, 66, 33, 33, 17, 99, 51, + 0, 15, 64, 52, 15, 0, 14, 3, 177, 49, 161, 49, + 161, 49, 161, 49, 179, 240, 163, 34, 99, 33, 18, 83, + 66, 98, 82, 83, 67, 82, 82, 83, 82, 83, 82, 82, + 83, 33, 34, 65, 17, 49, 34, 65, 17, 33, 66, 33, + 33, 17, 99, 51, 0, 15, 64, 47, 19, 0, 33, 115, + 34, 35, 83, 33, 20, 33, 67, 67, 65, 66, 83, 65, + 51, 67, 65, 66, 83, 49, 67, 86, 83, 82, 146, 83, + 97, 34, 65, 18, 81, 50, 65, 18, 81, 66, 33, 34, + 50, 99, 68, 0, 19, 96, 35, 12, 0, 21, 84, 114, + 34, 82, 50, 66, 51, 51, 50, 66, 162, 147, 147, 161, + 97, 66, 65, 82, 49, 116, 145, 177, 193, 114, 33, 113, + 34, 131, 240, 240, 32, 34, 12, 0, 12, 82, 163, 162, + 177, 240, 240, 52, 114, 34, 82, 50, 66, 65, 66, 81, + 66, 50, 85, 99, 147, 161, 97, 66, 65, 82, 49, 116, + 0, 12, 96, 33, 14, 0, 15, 34, 179, 178, 177, 240, + 240, 132, 146, 34, 114, 50, 98, 65, 98, 81, 98, 50, + 117, 131, 179, 193, 97, 98, 65, 114, 49, 148, 0, 15, + 37, 13, 0, 12, 50, 178, 163, 145, 33, 129, 65, 240, + 240, 52, 130, 34, 98, 50, 82, 65, 82, 81, 82, 50, + 101, 115, 163, 177, 97, 82, 65, 98, 49, 132, 0, 13, + 112, 36, 15, 0, 15, 82, 50, 115, 51, 114, 50, 0, + 6, 84, 162, 34, 130, 50, 114, 65, 114, 81, 114, 50, + 133, 147, 195, 209, 97, 114, 65, 130, 49, 164, 0, 16, + 16, 32, 9, 0, 9, 50, 114, 129, 145, 240, 146, 97, + 18, 65, 34, 49, 50, 49, 50, 98, 114, 99, 98, 114, + 33, 65, 33, 81, 33, 83, 0, 9, 64, 33, 12, 0, + 13, 2, 146, 146, 146, 240, 240, 34, 145, 18, 113, 34, + 97, 50, 97, 50, 146, 162, 147, 146, 162, 33, 113, 33, + 129, 33, 131, 0, 12, 112, 35, 10, 0, 9, 65, 130, + 130, 113, 33, 81, 49, 240, 162, 113, 18, 81, 34, 65, + 50, 65, 50, 114, 130, 115, 114, 130, 33, 81, 33, 97, + 33, 99, 0, 10, 80, 35, 12, 0, 12, 50, 34, 83, + 35, 82, 34, 240, 240, 194, 145, 18, 113, 34, 97, 50, + 97, 50, 146, 162, 147, 146, 162, 33, 113, 33, 129, 33, + 131, 0, 12, 112, 42, 16, 0, 14, 114, 227, 49, 162, + 18, 179, 163, 18, 226, 226, 164, 18, 130, 36, 114, 67, + 98, 83, 83, 82, 98, 98, 98, 83, 83, 82, 99, 82, + 113, 82, 130, 66, 130, 50, 179, 0, 17, 32, 51, 16, + 0, 16, 114, 209, 34, 17, 211, 0, 6, 98, 67, 97, + 18, 33, 34, 65, 34, 17, 50, 49, 51, 66, 49, 49, + 17, 50, 115, 66, 115, 51, 114, 66, 130, 66, 33, 66, + 66, 49, 66, 66, 33, 82, 66, 17, 82, 99, 0, 16, + 64, 37, 13, 0, 13, 82, 194, 178, 193, 240, 240, 100, + 130, 34, 98, 65, 82, 82, 51, 82, 50, 98, 50, 83, + 35, 82, 51, 82, 65, 83, 66, 66, 82, 50, 131, 0, + 13, 112, 36, 14, 0, 15, 34, 179, 178, 177, 240, 240, + 132, 146, 34, 114, 65, 98, 82, 67, 82, 66, 98, 66, + 83, 51, 82, 67, 82, 81, 83, 82, 66, 98, 50, 147, + 0, 15, 40, 13, 0, 12, 50, 178, 163, 145, 33, 129, + 65, 240, 240, 52, 130, 34, 98, 65, 82, 82, 51, 82, + 50, 98, 50, 83, 35, 82, 51, 82, 65, 83, 66, 66, + 82, 50, 131, 0, 13, 112, 37, 14, 0, 14, 98, 177, + 34, 17, 179, 0, 6, 20, 146, 34, 114, 65, 98, 82, + 67, 82, 66, 98, 66, 83, 51, 82, 67, 82, 81, 83, + 82, 66, 98, 50, 147, 0, 15, 39, 15, 0, 15, 82, + 50, 115, 51, 114, 50, 0, 6, 84, 162, 34, 130, 65, + 114, 82, 83, 82, 82, 98, 82, 83, 67, 82, 83, 82, + 97, 83, 98, 66, 114, 50, 163, 0, 16, 16, 23, 25, + 0, 35, 83, 240, 115, 240, 115, 0, 17, 31, 8, 0, + 20, 35, 240, 115, 240, 115, 0, 20, 32, 37, 14, 0, + 25, 20, 33, 83, 35, 83, 65, 98, 67, 67, 49, 18, + 66, 49, 34, 66, 33, 35, 51, 17, 51, 52, 66, 82, + 67, 82, 66, 81, 17, 50, 97, 35, 0, 15, 51, 16, + 0, 16, 98, 227, 226, 241, 240, 240, 194, 98, 81, 18, + 82, 65, 34, 66, 65, 50, 66, 65, 50, 66, 114, 67, + 114, 66, 115, 51, 114, 49, 18, 33, 66, 49, 17, 49, + 65, 49, 33, 33, 81, 33, 49, 33, 83, 67, 0, 16, + 64, 51, 16, 0, 17, 50, 211, 210, 209, 240, 240, 178, + 98, 81, 18, 82, 65, 34, 66, 65, 50, 66, 65, 50, + 66, 114, 67, 114, 66, 115, 51, 114, 49, 18, 33, 66, + 49, 17, 49, 65, 49, 33, 33, 81, 33, 49, 33, 83, + 67, 0, 16, 64, 54, 16, 0, 15, 18, 226, 211, 193, + 33, 177, 65, 240, 240, 146, 98, 81, 18, 82, 65, 34, + 66, 65, 50, 66, 65, 50, 66, 114, 67, 114, 66, 115, + 51, 114, 49, 18, 33, 66, 49, 17, 49, 65, 49, 33, + 33, 81, 33, 49, 33, 83, 67, 0, 16, 64, 53, 16, + 0, 16, 98, 50, 131, 51, 130, 50, 0, 6, 98, 98, + 81, 18, 82, 65, 34, 66, 65, 50, 66, 65, 50, 66, + 114, 67, 114, 66, 115, 51, 114, 49, 18, 33, 66, 49, + 17, 49, 65, 49, 33, 33, 81, 33, 49, 33, 83, 67, + 0, 16, 64, 56, 15, 0, 16, 50, 210, 194, 193, 240, + 240, 130, 98, 65, 18, 82, 49, 34, 66, 49, 50, 66, + 49, 50, 66, 98, 67, 98, 66, 98, 67, 98, 67, 98, + 49, 18, 97, 49, 18, 113, 34, 18, 130, 50, 210, 194, + 98, 82, 98, 66, 114, 66, 114, 50, 148, 240, 160, 58, + 18, 0, 16, 84, 240, 18, 240, 18, 240, 18, 240, 17, + 240, 18, 240, 18, 240, 18, 20, 162, 17, 50, 147, 66, + 147, 66, 146, 82, 131, 82, 130, 83, 130, 82, 146, 82, + 131, 67, 131, 66, 147, 50, 161, 35, 178, 240, 18, 240, + 18, 242, 240, 18, 240, 18, 217, 240, 192, 58, 15, 0, + 15, 98, 50, 115, 50, 130, 50, 0, 6, 34, 98, 65, + 18, 82, 49, 34, 66, 49, 50, 66, 49, 50, 66, 98, + 67, 98, 66, 98, 67, 98, 67, 98, 49, 18, 97, 49, + 18, 113, 34, 18, 130, 50, 210, 194, 98, 82, 98, 66, + 114, 66, 114, 50, 148, 240, 160, +}; + +//***************************************************************************** +// +// The glyph offset table for the 28 point Oldstandard italic font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard28i[] = +{ + 0, 5, 31, 50, 95, 170, 233, 293, + 305, 337, 370, 399, 452, 466, 476, 486, + 520, 566, 594, 633, 671, 706, 743, 787, + 822, 867, 910, 925, 945, 999, 1012, 1064, + 1098, 1171, 1217, 1261, 1304, 1349, 1395, 1439, + 1489, 1535, 1562, 1606, 1661, 1707, 1786, 1845, + 1890, 1933, 1992, 2040, 2083, 2135, 2183, 2235, + 2316, 2373, 2422, 2468, 2501, 2534, 2567, 2592, + 2600, 2611, 2652, 2693, 2720, 2768, 2796, 2832, + 2877, 2923, 2955, 2993, 3039, 3070, 3129, 3173, + 3204, 3252, 3294, 3324, 3352, 3383, 3428, 3463, + 3515, 3553, 3603, 3631, 3665, 3695, 3729, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3746, 3751, 3775, 3819, 3866, 3901, 3942, 3967, + 4020, 4033, 4102, 4127, 4151, 4164, 4174, 4250, + 4258, 4285, 4328, 4356, 4384, 4395, 4440, 4496, + 4506, 4520, 4539, 4562, 4589, 4645, 4703, 4763, + 4796, 4851, 4909, 4971, 5029, 5088, 5148, 5222, + 5277, 5332, 5387, 5446, 5500, 5532, 5563, 5597, + 5631, 5676, 5745, 5798, 5849, 5902, 5955, 6007, + 6048, 6107, 6164, 6221, 6280, 6336, 6394, 6436, + 6492, 6539, 6586, 6636, 6686, 6735, 6787, 6834, + 6869, 6903, 6936, 6973, 7009, 7041, 7074, 7109, + 7144, 7186, 7237, 7274, 7310, 7350, 7387, 7426, + 7449, 7486, 7537, 7588, 7642, 7695, 7751, 7809, +}; + +//***************************************************************************** +// +// The font definition for the 28 point Oldstandard italic font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard28i = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 29, + + // + // The height of the font. + // + 35, + + // + // The baseline of the font. + // + 27, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard28i, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard28iData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard30.c b/third_party/fonts/ofl/fonts/fontoldstandard30.c new file mode 100644 index 0000000..c3f705b --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard30.c @@ -0,0 +1,882 @@ +//***************************************************************************** +// +// fontoldstandard30.c - Font definition for the 30pt Oldstandard font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 30 point +// Bold: no +// Italic: no +// Memory usage: 8156 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 30 point Oldstandard font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard30Data[7953] = +{ + 5, 13, 0, 58, 64, 27, 6, 240, 240, 194, 67, 51, + 51, 51, 51, 51, 65, 81, 81, 81, 81, 81, 81, 81, + 81, 240, 19, 51, 51, 0, 6, 48, 17, 10, 0, 8, + 98, 50, 50, 50, 50, 50, 50, 50, 65, 65, 0, 30, + 48, 49, 19, 0, 17, 49, 81, 193, 81, 193, 66, 178, + 66, 178, 65, 194, 65, 127, 1, 129, 81, 193, 66, 193, + 66, 178, 66, 178, 65, 193, 81, 193, 81, 143, 1, 113, + 66, 178, 66, 178, 65, 194, 65, 193, 81, 193, 81, 0, + 20, 16, 77, 16, 0, 10, 81, 33, 193, 33, 182, 145, + 17, 33, 18, 97, 33, 33, 33, 81, 49, 33, 34, 65, + 49, 33, 34, 65, 49, 33, 19, 65, 49, 37, 66, 33, + 33, 18, 100, 33, 166, 183, 167, 145, 36, 145, 33, 19, + 66, 33, 33, 34, 51, 33, 33, 34, 51, 33, 33, 34, + 50, 49, 33, 34, 65, 49, 33, 33, 82, 33, 33, 18, + 120, 164, 193, 33, 0, 12, 112, 68, 23, 0, 20, 52, + 161, 114, 34, 129, 129, 65, 113, 130, 66, 97, 130, 66, + 81, 146, 66, 81, 146, 66, 65, 162, 66, 49, 193, 65, + 65, 194, 34, 49, 228, 65, 240, 97, 68, 209, 66, 34, + 193, 65, 65, 177, 66, 66, 161, 66, 66, 145, 82, 66, + 129, 98, 66, 129, 98, 66, 113, 129, 65, 129, 148, 129, + 0, 22, 64, 60, 23, 0, 20, 115, 240, 50, 49, 240, + 33, 81, 242, 81, 242, 81, 242, 66, 243, 49, 240, 34, + 33, 240, 52, 240, 83, 87, 116, 115, 130, 19, 98, 130, + 51, 81, 131, 52, 65, 130, 83, 49, 131, 99, 33, 131, + 101, 147, 115, 163, 131, 81, 67, 82, 19, 49, 104, 54, + 0, 23, 64, 12, 5, 240, 240, 82, 50, 50, 50, 65, + 0, 15, 48, 34, 10, 0, 8, 33, 130, 114, 114, 130, + 114, 130, 114, 130, 130, 114, 130, 130, 130, 130, 130, 130, + 130, 145, 146, 130, 145, 146, 145, 146, 146, 146, 145, 240, + 128, 34, 10, 0, 7, 65, 146, 146, 146, 130, 146, 130, + 146, 130, 130, 146, 130, 130, 130, 130, 130, 130, 130, 114, + 130, 130, 129, 130, 129, 130, 114, 114, 129, 240, 224, 30, + 13, 0, 11, 115, 163, 98, 35, 33, 51, 33, 34, 82, + 17, 17, 147, 130, 19, 83, 33, 34, 50, 49, 49, 115, + 163, 163, 0, 28, 48, 55, 28, 0, 26, 1, 240, 193, + 240, 193, 240, 193, 240, 193, 240, 193, 240, 193, 240, 193, + 240, 193, 240, 193, 240, 193, 240, 193, 255, 10, 241, 240, + 193, 240, 193, 240, 193, 240, 193, 240, 193, 240, 193, 240, + 193, 240, 193, 240, 193, 240, 193, 240, 193, 0, 15, 112, + 15, 7, 0, 21, 3, 68, 52, 97, 97, 97, 81, 81, + 240, 240, 48, 7, 11, 0, 27, 72, 0, 21, 10, 6, + 0, 18, 99, 51, 51, 0, 6, 48, 35, 13, 0, 10, + 98, 177, 193, 178, 177, 193, 193, 177, 193, 193, 177, 193, + 193, 178, 177, 193, 178, 177, 193, 178, 177, 193, 178, 177, + 193, 178, 177, 193, 240, 240, 128, 47, 17, 0, 15, 68, + 178, 66, 130, 97, 130, 98, 99, 99, 82, 130, 82, 130, + 67, 131, 51, 131, 51, 131, 51, 131, 51, 131, 51, 131, + 51, 131, 51, 131, 66, 130, 82, 130, 83, 98, 114, 98, + 130, 66, 166, 0, 17, 112, 28, 14, 0, 13, 1, 209, + 194, 179, 119, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 123, 0, 14, 48, 39, 16, + 0, 14, 54, 145, 83, 97, 115, 65, 146, 65, 147, 50, + 131, 52, 99, 52, 99, 67, 83, 211, 195, 195, 194, 210, + 195, 194, 210, 129, 81, 145, 66, 145, 76, 76, 0, 16, + 64, 41, 16, 0, 14, 54, 130, 67, 98, 99, 82, 115, + 67, 99, 68, 83, 82, 99, 211, 195, 210, 134, 240, 19, + 227, 226, 227, 66, 115, 52, 99, 52, 99, 50, 115, 81, + 114, 120, 177, 0, 15, 32, 37, 17, 0, 15, 114, 242, + 227, 227, 212, 193, 19, 193, 19, 177, 35, 162, 35, 161, + 51, 145, 67, 145, 67, 129, 83, 114, 83, 126, 163, 227, + 227, 227, 227, 186, 0, 17, 48, 41, 16, 0, 14, 18, + 98, 105, 119, 145, 241, 241, 241, 241, 37, 131, 67, 97, + 115, 81, 115, 81, 131, 211, 211, 66, 115, 52, 99, 52, + 99, 51, 99, 66, 115, 81, 99, 119, 193, 0, 15, 32, + 46, 16, 0, 14, 85, 162, 50, 130, 82, 98, 83, 83, + 83, 82, 98, 98, 211, 211, 37, 99, 17, 51, 84, 83, + 68, 98, 67, 115, 51, 115, 51, 115, 51, 115, 66, 115, + 66, 114, 98, 83, 98, 82, 135, 0, 16, 96, 31, 15, + 0, 13, 28, 60, 50, 130, 49, 146, 49, 145, 65, 145, + 209, 210, 209, 209, 210, 209, 210, 209, 210, 210, 196, 180, + 180, 180, 180, 0, 16, 46, 17, 0, 15, 54, 146, 82, + 114, 114, 82, 146, 66, 146, 66, 146, 66, 146, 67, 129, + 101, 65, 134, 17, 168, 130, 38, 98, 85, 66, 132, 50, + 147, 50, 147, 50, 147, 50, 146, 82, 115, 83, 83, 136, + 0, 17, 96, 47, 16, 0, 14, 69, 147, 50, 115, 82, + 98, 114, 67, 114, 67, 114, 67, 115, 51, 115, 51, 115, + 51, 100, 67, 84, 83, 49, 19, 101, 35, 211, 210, 97, + 114, 83, 98, 83, 82, 98, 98, 98, 82, 135, 193, 0, + 15, 32, 15, 6, 0, 10, 67, 51, 51, 0, 6, 51, + 51, 51, 0, 6, 48, 20, 7, 0, 12, 36, 52, 52, + 240, 240, 243, 68, 52, 97, 97, 97, 81, 81, 240, 240, + 160, 56, 26, 0, 28, 82, 240, 115, 240, 99, 240, 99, + 240, 99, 240, 114, 240, 114, 240, 114, 240, 115, 240, 99, + 240, 99, 240, 99, 240, 131, 240, 162, 240, 178, 240, 178, + 240, 163, 240, 163, 240, 163, 240, 163, 240, 163, 240, 162, + 240, 178, 240, 163, 240, 161, 0, 10, 16, 13, 28, 0, + 56, 15, 10, 0, 17, 127, 10, 0, 45, 112, 56, 26, + 0, 26, 2, 240, 163, 240, 163, 240, 163, 240, 163, 240, + 162, 240, 178, 240, 178, 240, 163, 240, 163, 240, 163, 240, + 163, 240, 131, 240, 114, 240, 114, 240, 114, 240, 115, 240, + 99, 240, 99, 240, 99, 240, 99, 240, 114, 240, 114, 240, + 115, 240, 129, 0, 12, 112, 36, 14, 0, 12, 85, 114, + 52, 65, 99, 65, 115, 52, 67, 67, 67, 179, 163, 163, + 162, 193, 193, 193, 49, 145, 49, 145, 34, 163, 240, 240, + 147, 179, 179, 0, 14, 112, 75, 24, 0, 21, 106, 210, + 130, 162, 193, 130, 225, 113, 115, 34, 33, 81, 99, 36, + 33, 81, 82, 82, 65, 50, 67, 82, 65, 49, 82, 98, + 65, 49, 82, 82, 81, 49, 66, 98, 81, 49, 66, 98, + 81, 49, 66, 82, 81, 65, 66, 82, 81, 65, 66, 67, + 65, 97, 50, 49, 18, 50, 97, 68, 52, 145, 240, 145, + 240, 146, 146, 217, 240, 65, 0, 22, 80, 54, 24, 0, + 22, 33, 240, 114, 240, 115, 240, 99, 240, 84, 240, 81, + 19, 240, 65, 19, 240, 50, 19, 240, 49, 51, 240, 33, + 51, 240, 18, 51, 240, 17, 83, 226, 83, 226, 83, 235, + 194, 115, 194, 131, 177, 147, 162, 147, 147, 148, 104, 58, + 0, 24, 48, 46, 20, 0, 17, 77, 163, 99, 131, 115, + 115, 131, 99, 131, 99, 131, 99, 131, 99, 115, 115, 99, + 137, 179, 98, 147, 115, 115, 130, 115, 131, 99, 131, 99, + 131, 99, 131, 99, 131, 99, 115, 115, 99, 93, 0, 20, + 112, 50, 19, 0, 17, 39, 49, 98, 98, 18, 82, 132, + 82, 147, 67, 147, 66, 178, 51, 178, 51, 193, 51, 240, + 19, 240, 19, 240, 19, 240, 19, 240, 19, 193, 66, 193, + 66, 193, 67, 161, 98, 161, 114, 130, 130, 98, 168, 225, + 0, 17, 112, 47, 23, 0, 20, 30, 195, 115, 163, 146, + 147, 147, 131, 163, 115, 163, 115, 178, 115, 179, 99, 179, + 99, 179, 99, 179, 99, 179, 99, 179, 99, 179, 99, 178, + 115, 163, 115, 162, 131, 147, 131, 146, 147, 115, 126, 0, + 24, 16, 50, 20, 0, 17, 79, 2, 99, 131, 99, 146, + 99, 146, 99, 161, 99, 161, 99, 81, 65, 99, 81, 179, + 81, 179, 66, 185, 179, 66, 179, 81, 179, 81, 179, 81, + 65, 99, 161, 99, 161, 99, 146, 99, 146, 99, 131, 63, + 2, 0, 20, 48, 47, 20, 0, 17, 79, 2, 99, 131, + 99, 146, 99, 146, 99, 161, 99, 161, 99, 81, 65, 99, + 81, 179, 81, 179, 66, 185, 179, 66, 179, 81, 179, 81, + 179, 81, 179, 240, 35, 240, 35, 240, 35, 240, 35, 233, + 0, 21, 48, 54, 22, 0, 19, 119, 49, 146, 98, 33, + 130, 132, 130, 147, 115, 162, 114, 178, 114, 193, 99, 193, + 99, 240, 67, 240, 67, 121, 51, 163, 99, 163, 99, 163, + 114, 163, 114, 163, 115, 147, 130, 130, 17, 130, 129, 33, + 146, 98, 33, 182, 65, 225, 0, 20, 112, 48, 24, 0, + 21, 9, 57, 99, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 159, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 105, 57, 0, 24, 48, 28, 12, 0, + 10, 73, 99, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 105, 0, 12, + 48, 33, 17, 0, 15, 73, 179, 227, 227, 227, 227, 227, + 227, 227, 227, 227, 227, 227, 227, 227, 115, 67, 100, 67, + 100, 67, 98, 98, 129, 83, 150, 0, 18, 16, 49, 23, + 0, 20, 25, 40, 115, 116, 147, 115, 163, 114, 179, 98, + 195, 82, 211, 66, 227, 50, 243, 35, 243, 20, 245, 19, + 228, 35, 227, 67, 211, 83, 195, 83, 195, 99, 179, 99, + 179, 115, 163, 115, 163, 116, 105, 41, 0, 23, 48, 48, + 20, 0, 17, 73, 227, 240, 35, 240, 35, 240, 35, 240, + 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, + 35, 240, 35, 240, 35, 161, 99, 161, 99, 161, 99, 146, + 99, 146, 99, 131, 99, 116, 63, 2, 0, 20, 48, 76, + 25, 0, 21, 118, 151, 100, 132, 148, 132, 148, 132, 145, + 19, 97, 19, 145, 19, 97, 19, 145, 19, 97, 19, 145, + 34, 81, 35, 145, 35, 65, 35, 145, 35, 65, 35, 145, + 50, 65, 35, 145, 51, 33, 51, 145, 51, 33, 51, 145, + 66, 33, 51, 145, 68, 67, 145, 68, 67, 145, 68, 67, + 145, 83, 67, 145, 82, 83, 131, 66, 83, 103, 49, 41, + 0, 25, 48, 63, 23, 0, 20, 22, 119, 99, 147, 132, + 145, 149, 129, 145, 19, 129, 145, 35, 113, 145, 36, 97, + 145, 51, 97, 145, 67, 81, 145, 68, 65, 145, 83, 65, + 145, 84, 49, 145, 99, 49, 145, 115, 33, 145, 116, 17, + 145, 131, 17, 145, 148, 145, 148, 145, 163, 131, 162, 103, + 130, 240, 113, 0, 20, 112, 51, 20, 0, 16, 1, 240, + 23, 194, 82, 162, 114, 130, 146, 99, 147, 82, 178, 82, + 178, 67, 179, 51, 179, 51, 179, 51, 179, 51, 179, 51, + 179, 51, 179, 66, 178, 82, 163, 83, 147, 98, 146, 130, + 114, 162, 82, 199, 240, 17, 0, 18, 112, 45, 20, 0, + 17, 77, 163, 99, 131, 115, 115, 131, 99, 131, 99, 131, + 99, 131, 99, 131, 99, 115, 115, 99, 138, 163, 240, 35, + 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, + 240, 35, 233, 0, 21, 48, 65, 20, 0, 16, 1, 240, + 23, 194, 82, 162, 114, 130, 146, 99, 147, 82, 163, 82, + 178, 67, 179, 51, 179, 51, 179, 51, 179, 51, 179, 51, + 179, 51, 179, 66, 178, 83, 162, 83, 51, 51, 98, 34, + 33, 34, 130, 17, 52, 163, 51, 49, 135, 65, 177, 18, + 65, 211, 49, 211, 34, 229, 240, 19, 0, 8, 16, 50, + 22, 0, 19, 45, 195, 99, 163, 99, 163, 115, 147, 115, + 147, 115, 147, 115, 147, 99, 163, 83, 184, 227, 67, 195, + 83, 179, 98, 179, 99, 163, 99, 163, 99, 163, 99, 49, + 99, 99, 49, 99, 100, 18, 99, 117, 73, 83, 0, 22, + 80, 47, 17, 0, 15, 23, 49, 82, 82, 18, 66, 116, + 66, 131, 66, 146, 66, 146, 67, 129, 84, 129, 85, 215, + 184, 198, 81, 117, 65, 148, 49, 163, 50, 162, 50, 162, + 51, 146, 52, 114, 65, 34, 98, 65, 55, 209, 0, 16, + 54, 21, 0, 18, 63, 3, 51, 67, 68, 50, 83, 83, + 50, 83, 98, 50, 83, 98, 49, 99, 113, 49, 99, 113, + 49, 99, 113, 163, 240, 51, 240, 51, 240, 51, 240, 51, + 240, 51, 240, 51, 240, 51, 240, 51, 240, 51, 240, 51, + 240, 51, 250, 0, 21, 112, 48, 24, 0, 21, 9, 87, + 99, 163, 131, 177, 147, 177, 147, 177, 147, 177, 147, 177, + 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, + 147, 177, 147, 177, 147, 177, 147, 177, 162, 162, 163, 145, + 195, 113, 233, 0, 25, 16, 55, 24, 0, 21, 10, 56, + 115, 147, 147, 146, 163, 146, 179, 129, 195, 129, 211, 113, + 211, 97, 227, 97, 243, 81, 243, 66, 243, 65, 240, 35, + 49, 240, 35, 34, 240, 35, 33, 240, 67, 17, 240, 69, + 240, 68, 240, 99, 240, 99, 240, 98, 240, 129, 0, 22, + 64, 86, 33, 0, 28, 121, 41, 40, 99, 116, 115, 163, + 115, 130, 163, 115, 129, 179, 115, 129, 194, 101, 98, 195, + 81, 19, 97, 211, 81, 19, 97, 211, 81, 35, 66, 227, + 50, 35, 65, 243, 49, 51, 65, 243, 49, 66, 50, 240, + 18, 34, 67, 33, 240, 35, 17, 83, 33, 240, 35, 17, + 83, 33, 240, 35, 17, 101, 240, 52, 100, 240, 67, 116, + 240, 67, 131, 240, 82, 130, 240, 97, 146, 240, 97, 161, + 0, 30, 48, 52, 23, 0, 20, 25, 56, 100, 115, 163, + 114, 195, 97, 212, 65, 243, 50, 244, 33, 240, 35, 17, + 240, 68, 240, 67, 240, 99, 240, 68, 240, 50, 19, 240, + 33, 36, 241, 67, 226, 83, 209, 99, 193, 131, 162, 131, + 147, 132, 104, 57, 0, 23, 48, 51, 23, 0, 20, 25, + 56, 100, 131, 132, 130, 163, 129, 195, 98, 196, 81, 227, + 66, 228, 49, 240, 19, 33, 240, 51, 17, 240, 52, 240, + 83, 240, 83, 240, 83, 240, 83, 240, 83, 240, 83, 240, + 83, 240, 83, 240, 83, 240, 27, 0, 23, 112, 43, 19, + 0, 16, 126, 83, 115, 83, 116, 82, 131, 97, 131, 113, + 116, 113, 115, 129, 99, 244, 243, 243, 240, 19, 243, 244, + 113, 115, 129, 99, 130, 84, 130, 83, 146, 67, 147, 52, + 131, 79, 0, 19, 64, 33, 9, 0, 7, 118, 50, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 118, + 240, 96, 34, 13, 0, 9, 97, 193, 194, 193, 193, 194, + 193, 193, 194, 193, 193, 194, 193, 193, 194, 193, 193, 193, + 209, 193, 193, 209, 193, 193, 209, 193, 193, 194, 240, 224, + 33, 9, 0, 7, 118, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 54, 240, 96, 26, 16, 0, + 14, 97, 242, 211, 209, 18, 177, 50, 146, 65, 145, 82, + 114, 97, 98, 129, 81, 146, 50, 161, 0, 36, 48, 9, + 19, 0, 76, 15, 1, 0, 7, 64, 12, 8, 0, 7, + 2, 99, 98, 114, 129, 0, 24, 48, 37, 16, 0, 28, + 53, 162, 50, 130, 82, 115, 66, 115, 66, 129, 82, 196, + 132, 34, 115, 66, 99, 82, 99, 82, 33, 51, 67, 33, + 51, 49, 18, 33, 84, 51, 0, 16, 64, 44, 16, 0, + 14, 4, 226, 226, 226, 226, 226, 226, 226, 36, 130, 17, + 50, 115, 67, 99, 82, 98, 99, 82, 99, 82, 99, 82, + 99, 82, 99, 82, 99, 82, 98, 99, 67, 97, 18, 50, + 113, 52, 0, 16, 96, 30, 13, 0, 23, 21, 114, 65, + 83, 66, 66, 82, 51, 67, 51, 81, 67, 163, 163, 163, + 97, 66, 97, 67, 65, 98, 65, 117, 0, 13, 80, 43, + 16, 0, 14, 101, 226, 226, 226, 226, 226, 226, 132, 34, + 114, 49, 18, 99, 67, 98, 83, 83, 98, 83, 98, 83, + 98, 83, 98, 83, 98, 83, 98, 98, 98, 99, 67, 114, + 52, 132, 36, 0, 16, 48, 30, 14, 0, 25, 4, 130, + 50, 99, 66, 82, 82, 67, 83, 51, 83, 59, 51, 179, + 179, 113, 66, 97, 83, 81, 99, 49, 148, 0, 14, 96, + 31, 13, 0, 12, 4, 114, 50, 97, 51, 82, 51, 82, + 178, 178, 151, 130, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 151, 0, 13, 96, 45, 18, 0, 31, 117, + 51, 98, 68, 18, 67, 67, 19, 51, 101, 67, 99, 99, + 99, 99, 99, 115, 67, 146, 66, 197, 163, 225, 240, 40, + 187, 147, 51, 114, 145, 81, 177, 81, 177, 81, 162, 98, + 114, 151, 240, 176, 43, 17, 0, 14, 116, 242, 242, 242, + 242, 242, 242, 242, 51, 146, 18, 34, 131, 82, 115, 82, + 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, + 114, 98, 114, 98, 114, 98, 86, 38, 0, 17, 48, 26, + 9, 0, 8, 3, 99, 99, 240, 240, 180, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 86, 0, 9, + 48, 36, 11, 0, 10, 35, 131, 131, 0, 6, 37, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 51, 50, 51, 50, 50, 65, 66, 50, 84, 240, + 32, 42, 17, 0, 14, 116, 242, 242, 242, 242, 242, 242, + 242, 54, 98, 82, 130, 81, 146, 65, 162, 49, 178, 33, + 194, 19, 179, 18, 178, 35, 162, 51, 146, 67, 130, 82, + 130, 83, 86, 23, 0, 17, 48, 28, 9, 0, 7, 116, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 86, 0, 9, 48, 51, + 25, 0, 43, 100, 36, 68, 146, 17, 50, 33, 50, 131, + 83, 82, 115, 83, 82, 114, 98, 98, 114, 98, 98, 114, + 98, 98, 114, 98, 98, 114, 98, 98, 114, 98, 98, 114, + 98, 98, 114, 98, 98, 114, 98, 98, 86, 38, 38, 0, + 25, 48, 36, 17, 0, 29, 100, 36, 146, 18, 34, 131, + 82, 115, 82, 114, 98, 114, 98, 114, 98, 114, 98, 114, + 98, 114, 98, 114, 98, 114, 98, 114, 98, 86, 38, 0, + 17, 48, 33, 15, 0, 26, 100, 147, 35, 99, 67, 82, + 98, 67, 99, 51, 99, 51, 99, 51, 99, 51, 99, 51, + 99, 66, 98, 83, 67, 99, 35, 148, 0, 15, 112, 42, + 16, 0, 28, 4, 36, 130, 17, 50, 115, 67, 99, 82, + 98, 99, 82, 99, 82, 99, 82, 99, 82, 99, 82, 99, + 82, 98, 99, 67, 100, 50, 114, 36, 130, 226, 226, 226, + 226, 226, 198, 240, 176, 43, 16, 0, 28, 52, 49, 114, + 49, 33, 99, 65, 17, 98, 98, 83, 98, 83, 98, 83, + 98, 83, 98, 83, 98, 83, 98, 98, 98, 99, 67, 114, + 52, 132, 34, 226, 226, 226, 226, 226, 226, 198, 240, 64, + 26, 14, 0, 24, 68, 51, 98, 33, 34, 82, 17, 35, + 83, 51, 83, 179, 178, 194, 194, 194, 194, 194, 194, 166, + 0, 15, 31, 13, 0, 23, 4, 129, 67, 65, 113, 65, + 113, 66, 195, 181, 165, 65, 99, 49, 129, 50, 113, 51, + 97, 49, 18, 65, 65, 52, 0, 13, 80, 31, 12, 0, + 12, 49, 177, 177, 177, 162, 162, 136, 98, 162, 162, 162, + 162, 162, 162, 162, 162, 65, 82, 65, 82, 65, 97, 49, + 131, 0, 12, 80, 36, 17, 0, 29, 100, 68, 114, 98, + 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, + 114, 98, 114, 98, 114, 83, 114, 83, 130, 34, 18, 148, + 36, 0, 17, 48, 33, 18, 0, 31, 71, 53, 83, 98, + 130, 97, 147, 81, 162, 81, 162, 65, 194, 49, 194, 49, + 195, 17, 226, 17, 228, 242, 240, 18, 240, 33, 0, 19, + 16, 52, 25, 0, 43, 103, 38, 37, 83, 83, 82, 130, + 98, 82, 131, 82, 81, 162, 83, 65, 162, 65, 18, 49, + 194, 49, 18, 49, 194, 49, 34, 33, 195, 17, 50, 17, + 226, 17, 50, 17, 228, 67, 242, 82, 240, 18, 82, 240, + 33, 97, 0, 26, 16, 32, 17, 0, 29, 102, 37, 99, + 66, 146, 65, 178, 49, 179, 17, 211, 227, 243, 209, 18, + 193, 35, 177, 50, 161, 82, 130, 83, 85, 39, 0, 17, + 48, 46, 18, 0, 31, 71, 53, 83, 98, 130, 97, 146, + 97, 162, 81, 162, 65, 179, 49, 194, 49, 194, 49, 195, + 17, 226, 17, 226, 17, 227, 240, 18, 240, 18, 240, 17, + 240, 33, 179, 49, 179, 33, 195, 18, 212, 240, 240, 29, + 13, 0, 22, 106, 50, 83, 49, 98, 65, 83, 65, 67, + 162, 163, 147, 162, 163, 65, 82, 81, 66, 97, 51, 82, + 58, 0, 13, 48, 34, 10, 0, 8, 33, 114, 114, 114, + 130, 130, 130, 131, 115, 130, 130, 130, 130, 114, 98, 162, + 145, 146, 130, 130, 115, 115, 114, 130, 130, 130, 146, 146, + 161, 208, 32, 4, 240, 145, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 176, 35, 10, + 0, 7, 65, 162, 146, 146, 130, 130, 130, 115, 115, 114, + 130, 130, 130, 146, 162, 98, 114, 130, 130, 130, 131, 115, + 130, 130, 130, 130, 114, 114, 113, 240, 64, 20, 20, 0, + 42, 85, 145, 72, 129, 49, 54, 97, 49, 87, 49, 49, + 136, 65, 149, 0, 33, 4, 12, 0, 54, 25, 6, 0, + 10, 67, 51, 51, 240, 17, 81, 81, 81, 81, 81, 81, + 81, 81, 67, 51, 51, 51, 51, 51, 51, 144, 48, 13, + 0, 16, 113, 193, 193, 193, 165, 114, 17, 33, 83, 17, + 34, 66, 33, 19, 51, 33, 19, 51, 33, 33, 67, 33, + 115, 33, 115, 33, 115, 33, 49, 66, 33, 49, 67, 17, + 49, 82, 17, 33, 117, 161, 193, 193, 0, 9, 49, 20, + 0, 18, 101, 226, 65, 194, 82, 162, 83, 162, 83, 147, + 82, 163, 240, 35, 240, 35, 215, 240, 39, 211, 240, 35, + 240, 35, 240, 35, 240, 35, 196, 18, 129, 49, 52, 129, + 49, 82, 113, 65, 50, 25, 83, 71, 0, 20, 80, 35, + 16, 0, 22, 1, 53, 49, 67, 83, 82, 114, 81, 145, + 65, 177, 49, 177, 49, 177, 49, 177, 49, 177, 65, 145, + 82, 114, 83, 83, 65, 53, 49, 0, 24, 48, 44, 20, + 0, 17, 71, 70, 84, 114, 131, 113, 147, 113, 163, 81, + 179, 81, 195, 49, 211, 49, 227, 17, 243, 17, 240, 19, + 219, 211, 240, 35, 219, 211, 240, 35, 240, 35, 240, 35, + 240, 35, 233, 0, 20, 112, 27, 4, 240, 145, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 240, 129, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 240, 51, 14, 0, + 12, 84, 146, 49, 114, 66, 98, 51, 98, 50, 115, 194, + 196, 180, 130, 20, 97, 83, 81, 99, 65, 115, 50, 114, + 50, 129, 67, 97, 83, 65, 115, 33, 148, 179, 194, 195, + 99, 50, 99, 50, 98, 66, 113, 50, 148, 240, 240, 80, + 13, 12, 0, 13, 67, 51, 51, 51, 51, 51, 0, 36, + 48, 74, 25, 0, 22, 90, 226, 130, 178, 194, 130, 84, + 33, 34, 113, 67, 51, 49, 97, 67, 82, 65, 81, 67, + 97, 65, 65, 67, 113, 81, 49, 67, 209, 49, 67, 209, + 49, 67, 209, 49, 67, 209, 49, 67, 113, 81, 49, 67, + 113, 81, 65, 67, 81, 81, 81, 67, 81, 81, 97, 67, + 49, 81, 114, 84, 82, 130, 194, 178, 130, 234, 240, 66, + 0, 23, 64, 23, 11, 0, 9, 100, 98, 49, 146, 114, + 17, 97, 49, 82, 49, 17, 50, 34, 17, 67, 19, 55, + 0, 28, 27, 10, 0, 19, 17, 129, 130, 49, 65, 49, + 66, 49, 66, 49, 66, 49, 66, 49, 66, 49, 82, 49, + 81, 49, 97, 0, 12, 17, 17, 0, 36, 30, 240, 17, + 240, 17, 240, 17, 240, 17, 240, 17, 0, 28, 7, 11, + 0, 27, 72, 0, 21, 78, 25, 0, 22, 90, 226, 130, + 178, 194, 130, 25, 66, 113, 66, 51, 65, 97, 82, 67, + 65, 81, 82, 67, 65, 65, 98, 67, 81, 49, 98, 51, + 97, 49, 101, 145, 49, 98, 50, 113, 49, 98, 66, 97, + 49, 98, 66, 97, 49, 98, 66, 33, 49, 65, 82, 66, + 33, 33, 81, 82, 66, 33, 33, 97, 38, 51, 33, 114, + 226, 130, 194, 178, 130, 234, 240, 66, 0, 23, 64, 8, + 11, 0, 13, 104, 0, 34, 96, 21, 11, 0, 9, 116, + 97, 65, 65, 97, 49, 97, 49, 97, 49, 97, 65, 65, + 100, 0, 29, 64, 43, 28, 0, 33, 1, 240, 193, 240, + 193, 240, 193, 240, 193, 240, 193, 240, 193, 240, 193, 255, + 10, 241, 240, 193, 240, 193, 240, 193, 240, 193, 240, 193, + 240, 193, 240, 193, 0, 8, 127, 10, 0, 24, 112, 27, + 11, 0, 9, 116, 97, 50, 65, 82, 49, 82, 51, 50, + 66, 50, 130, 130, 130, 129, 145, 81, 50, 81, 56, 0, + 22, 48, 27, 11, 0, 9, 116, 82, 50, 65, 82, 50, + 66, 65, 66, 130, 84, 178, 162, 50, 66, 50, 66, 49, + 66, 85, 0, 22, 80, 12, 8, 0, 7, 50, 83, 82, + 82, 81, 0, 24, 112, 54, 19, 0, 33, 50, 113, 131, + 99, 115, 99, 115, 99, 115, 99, 115, 99, 114, 115, 114, + 115, 129, 114, 145, 129, 145, 114, 65, 66, 98, 50, 49, + 33, 66, 21, 49, 53, 51, 65, 240, 50, 240, 34, 240, + 34, 240, 35, 240, 19, 240, 19, 240, 34, 240, 16, 58, + 16, 0, 14, 58, 69, 49, 117, 49, 102, 49, 102, 49, + 102, 49, 102, 49, 117, 49, 117, 49, 147, 49, 177, 49, + 177, 49, 177, 49, 177, 49, 177, 49, 177, 49, 177, 49, + 177, 49, 177, 49, 177, 49, 177, 49, 177, 49, 177, 49, + 177, 49, 177, 49, 177, 49, 0, 6, 96, 10, 6, 0, + 12, 99, 51, 51, 0, 12, 48, 14, 9, 0, 30, 81, + 129, 130, 146, 114, 49, 50, 68, 240, 112, 19, 9, 0, + 8, 33, 114, 84, 114, 114, 114, 114, 114, 114, 114, 114, + 86, 0, 19, 64, 24, 10, 0, 9, 3, 98, 18, 66, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 66, 18, 99, + 247, 0, 22, 112, 27, 10, 0, 19, 17, 161, 81, 50, + 81, 49, 81, 50, 65, 50, 65, 50, 65, 50, 65, 50, + 49, 50, 65, 49, 129, 0, 12, 59, 23, 0, 20, 65, + 177, 146, 177, 116, 161, 162, 146, 162, 145, 178, 129, 194, + 129, 194, 113, 210, 98, 210, 97, 82, 114, 81, 83, 114, + 81, 65, 18, 86, 33, 81, 18, 194, 65, 34, 193, 65, + 50, 177, 81, 50, 177, 73, 129, 162, 145, 178, 145, 178, + 129, 166, 82, 0, 22, 64, 62, 23, 0, 20, 65, 177, + 146, 177, 116, 161, 162, 146, 162, 145, 178, 129, 194, 129, + 194, 113, 210, 98, 21, 114, 97, 17, 66, 98, 81, 17, + 98, 82, 81, 17, 98, 54, 33, 35, 66, 162, 50, 66, + 161, 146, 161, 146, 177, 114, 193, 114, 193, 113, 97, 113, + 98, 97, 97, 121, 82, 0, 22, 64, 67, 23, 0, 20, + 52, 145, 114, 50, 129, 113, 82, 97, 130, 66, 82, 145, + 66, 81, 226, 81, 180, 113, 242, 65, 240, 34, 34, 178, + 66, 33, 82, 82, 66, 17, 83, 81, 66, 33, 65, 18, + 101, 33, 81, 18, 194, 65, 34, 193, 65, 50, 177, 81, + 50, 162, 73, 129, 162, 146, 162, 145, 178, 129, 166, 82, + 0, 22, 64, 35, 14, 0, 25, 3, 179, 179, 240, 240, + 147, 162, 33, 145, 49, 145, 49, 193, 194, 178, 163, 163, + 163, 179, 67, 67, 68, 51, 113, 52, 97, 67, 81, 118, + 240, 64, 63, 24, 98, 240, 115, 240, 114, 240, 130, 240, + 145, 0, 8, 113, 240, 114, 240, 115, 240, 99, 240, 84, + 240, 81, 19, 240, 65, 19, 240, 50, 19, 240, 49, 51, + 240, 33, 51, 240, 18, 51, 240, 17, 83, 226, 83, 226, + 83, 235, 194, 115, 194, 131, 177, 147, 162, 147, 147, 148, + 104, 58, 0, 24, 48, 63, 24, 209, 240, 114, 240, 99, + 240, 97, 240, 113, 0, 8, 113, 240, 114, 240, 115, 240, + 99, 240, 84, 240, 81, 19, 240, 65, 19, 240, 50, 19, + 240, 49, 51, 240, 33, 51, 240, 18, 51, 240, 17, 83, + 226, 83, 226, 83, 235, 194, 115, 194, 130, 193, 147, 162, + 147, 147, 148, 104, 58, 0, 24, 48, 65, 24, 161, 240, + 115, 240, 84, 240, 81, 49, 240, 34, 81, 0, 8, 65, + 240, 114, 240, 115, 240, 99, 240, 84, 240, 81, 19, 240, + 65, 19, 240, 50, 19, 240, 49, 51, 240, 33, 51, 240, + 18, 51, 240, 17, 83, 226, 83, 226, 83, 235, 194, 115, + 194, 131, 177, 147, 162, 147, 147, 148, 104, 58, 0, 24, + 48, 60, 24, 240, 240, 20, 49, 241, 52, 0, 14, 65, + 240, 114, 240, 115, 240, 99, 240, 84, 240, 81, 19, 240, + 65, 19, 240, 50, 19, 240, 49, 51, 240, 33, 51, 240, + 18, 51, 240, 17, 83, 226, 83, 226, 83, 235, 194, 115, + 194, 131, 177, 147, 162, 147, 147, 148, 104, 58, 0, 24, + 48, 60, 24, 240, 243, 51, 243, 51, 243, 51, 0, 11, + 49, 240, 129, 240, 115, 240, 99, 240, 84, 240, 81, 19, + 240, 65, 19, 240, 50, 34, 240, 49, 51, 240, 33, 51, + 240, 18, 67, 242, 67, 241, 83, 226, 99, 219, 194, 115, + 194, 131, 177, 147, 162, 147, 147, 148, 104, 73, 0, 24, + 48, 67, 24, 148, 240, 66, 34, 240, 49, 65, 240, 49, + 65, 240, 50, 34, 240, 68, 240, 240, 242, 240, 114, 240, + 114, 240, 100, 240, 84, 240, 84, 240, 66, 19, 240, 49, + 35, 240, 49, 35, 240, 34, 51, 240, 17, 67, 242, 67, + 242, 83, 225, 99, 219, 209, 131, 193, 131, 178, 131, 178, + 147, 147, 147, 105, 57, 0, 24, 48, 70, 30, 0, 27, + 79, 2, 244, 131, 244, 146, 229, 146, 225, 19, 161, 210, + 19, 161, 209, 35, 81, 65, 194, 35, 81, 240, 33, 51, + 81, 240, 18, 51, 66, 240, 17, 73, 241, 83, 66, 226, + 83, 81, 225, 99, 81, 65, 139, 81, 65, 129, 115, 161, + 114, 115, 161, 113, 131, 146, 98, 131, 146, 83, 131, 116, + 56, 47, 2, 0, 30, 48, 60, 19, 0, 17, 39, 49, + 98, 98, 18, 82, 132, 82, 147, 67, 147, 66, 178, 51, + 178, 51, 193, 51, 240, 19, 240, 19, 240, 19, 240, 19, + 240, 19, 193, 66, 193, 66, 193, 67, 161, 98, 161, 114, + 130, 130, 98, 168, 225, 240, 34, 240, 51, 240, 50, 240, + 34, 193, 51, 213, 240, 192, 59, 20, 82, 240, 51, 240, + 50, 240, 66, 240, 81, 0, 6, 47, 2, 99, 131, 99, + 146, 99, 146, 99, 161, 99, 161, 99, 81, 65, 99, 81, + 179, 81, 179, 66, 185, 179, 66, 179, 81, 179, 81, 179, + 81, 65, 99, 161, 99, 161, 99, 146, 99, 146, 99, 131, + 63, 2, 0, 20, 48, 60, 20, 193, 240, 50, 240, 35, + 240, 33, 240, 49, 0, 6, 47, 2, 99, 131, 99, 146, + 99, 146, 99, 161, 99, 161, 99, 81, 65, 99, 81, 179, + 81, 179, 66, 185, 179, 66, 179, 81, 179, 81, 65, 99, + 81, 65, 99, 161, 99, 161, 99, 146, 99, 146, 99, 131, + 63, 2, 0, 20, 48, 60, 20, 145, 240, 51, 240, 20, + 240, 17, 49, 210, 82, 0, 5, 111, 2, 99, 131, 99, + 146, 99, 146, 99, 161, 99, 161, 99, 81, 65, 99, 81, + 179, 81, 179, 66, 185, 179, 66, 179, 81, 179, 81, 179, + 81, 65, 99, 161, 99, 161, 99, 146, 99, 146, 99, 131, + 63, 2, 0, 20, 48, 58, 20, 240, 163, 51, 179, 51, + 179, 51, 0, 8, 47, 2, 99, 131, 99, 146, 99, 146, + 99, 161, 99, 161, 99, 81, 65, 99, 81, 179, 81, 179, + 66, 185, 179, 66, 179, 81, 179, 81, 65, 99, 81, 65, + 99, 161, 99, 161, 99, 146, 99, 146, 99, 131, 63, 2, + 0, 20, 48, 33, 12, 2, 163, 163, 162, 193, 240, 240, + 25, 99, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 105, 0, 12, 48, + 33, 12, 113, 162, 147, 145, 161, 240, 240, 25, 99, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 105, 0, 12, 48, 35, 12, 65, + 163, 145, 17, 129, 49, 82, 82, 240, 201, 99, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 105, 0, 12, 48, 34, 12, 195, 51, + 51, 51, 51, 51, 240, 240, 153, 99, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 105, 0, 12, 48, 47, 23, 0, 20, 30, 195, + 115, 163, 146, 147, 147, 131, 163, 115, 163, 115, 178, 115, + 179, 99, 179, 57, 131, 99, 179, 99, 179, 99, 179, 99, + 179, 99, 178, 115, 163, 115, 162, 131, 147, 131, 146, 147, + 115, 126, 0, 24, 16, 68, 23, 240, 244, 49, 225, 52, + 0, 12, 86, 119, 99, 147, 132, 145, 149, 129, 145, 19, + 129, 145, 35, 113, 145, 36, 97, 145, 51, 97, 145, 67, + 81, 145, 68, 65, 145, 83, 65, 145, 84, 49, 145, 99, + 49, 145, 115, 33, 145, 116, 17, 145, 131, 17, 145, 148, + 145, 148, 145, 163, 131, 162, 103, 130, 240, 113, 0, 20, + 112, 60, 20, 66, 240, 51, 240, 51, 240, 50, 240, 81, + 240, 240, 145, 240, 23, 194, 82, 162, 114, 130, 146, 99, + 147, 82, 178, 82, 178, 67, 179, 51, 179, 51, 179, 51, + 179, 51, 179, 51, 179, 51, 179, 66, 178, 82, 163, 83, + 147, 98, 146, 130, 114, 162, 82, 199, 240, 17, 0, 18, + 112, 60, 20, 178, 240, 35, 240, 19, 240, 34, 240, 33, + 240, 240, 145, 240, 23, 194, 82, 162, 114, 130, 146, 99, + 147, 82, 178, 82, 178, 67, 179, 51, 179, 51, 179, 51, + 179, 51, 179, 51, 179, 51, 179, 66, 178, 82, 163, 83, + 147, 98, 146, 130, 114, 162, 82, 199, 240, 17, 0, 18, + 112, 62, 20, 129, 240, 51, 240, 33, 17, 240, 17, 49, + 210, 81, 240, 240, 97, 240, 23, 194, 82, 162, 114, 130, + 146, 99, 147, 82, 178, 82, 178, 67, 179, 51, 179, 51, + 179, 51, 179, 51, 179, 51, 179, 51, 179, 66, 178, 82, + 163, 83, 147, 98, 146, 130, 114, 162, 82, 199, 240, 17, + 0, 18, 112, 56, 20, 240, 164, 49, 177, 52, 0, 9, + 65, 240, 23, 194, 82, 162, 114, 130, 146, 99, 147, 82, + 178, 82, 178, 67, 179, 51, 179, 51, 179, 51, 179, 51, + 179, 51, 179, 51, 179, 66, 178, 82, 163, 83, 147, 98, + 146, 130, 114, 162, 82, 199, 240, 17, 0, 18, 112, 58, + 20, 240, 147, 51, 179, 51, 179, 51, 0, 6, 113, 240, + 23, 194, 82, 162, 114, 130, 146, 99, 147, 82, 178, 82, + 178, 67, 179, 51, 179, 51, 179, 51, 179, 51, 179, 51, + 179, 51, 179, 66, 178, 82, 163, 83, 147, 98, 146, 130, + 114, 162, 82, 199, 240, 17, 0, 18, 112, 47, 22, 0, + 30, 33, 240, 17, 81, 226, 97, 194, 129, 162, 161, 130, + 193, 98, 225, 66, 240, 17, 34, 240, 51, 240, 66, 240, + 66, 17, 240, 34, 49, 242, 81, 210, 113, 178, 145, 146, + 177, 114, 209, 82, 242, 0, 19, 80, 64, 20, 0, 18, + 23, 50, 114, 82, 33, 114, 115, 114, 146, 99, 132, 82, + 145, 18, 82, 129, 34, 67, 114, 35, 51, 98, 51, 51, + 82, 67, 51, 81, 83, 51, 65, 99, 51, 50, 99, 51, + 34, 115, 66, 33, 130, 82, 17, 131, 84, 131, 98, 146, + 115, 114, 113, 19, 82, 114, 55, 240, 17, 0, 18, 112, + 57, 24, 114, 240, 114, 240, 130, 240, 130, 240, 129, 0, + 7, 89, 87, 99, 163, 131, 177, 147, 177, 147, 177, 147, + 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, + 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 162, + 162, 163, 145, 195, 113, 233, 0, 25, 16, 57, 24, 210, + 240, 114, 240, 98, 240, 98, 240, 113, 0, 7, 73, 87, + 99, 163, 131, 177, 147, 177, 147, 177, 147, 177, 147, 177, + 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, + 147, 177, 147, 177, 147, 177, 147, 177, 162, 162, 163, 145, + 195, 113, 233, 0, 25, 16, 59, 24, 162, 240, 114, 240, + 100, 240, 66, 34, 240, 33, 97, 0, 7, 25, 87, 99, + 163, 131, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, + 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, + 177, 147, 177, 147, 177, 147, 177, 162, 162, 163, 145, 195, + 113, 233, 0, 25, 16, 55, 24, 240, 243, 51, 243, 51, + 243, 51, 0, 10, 24, 88, 99, 163, 131, 177, 147, 177, + 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, + 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, + 147, 177, 162, 162, 163, 145, 195, 113, 233, 0, 25, 16, + 60, 23, 209, 240, 98, 240, 83, 240, 81, 240, 97, 0, + 7, 41, 56, 100, 131, 132, 130, 163, 129, 195, 98, 196, + 81, 227, 66, 228, 49, 240, 19, 33, 240, 51, 17, 240, + 52, 240, 83, 240, 83, 240, 83, 240, 83, 240, 83, 240, + 83, 240, 83, 240, 83, 240, 83, 240, 27, 0, 23, 112, + 44, 20, 0, 17, 73, 227, 240, 35, 240, 42, 163, 99, + 131, 115, 115, 130, 115, 131, 99, 131, 99, 131, 99, 131, + 99, 130, 115, 115, 115, 99, 138, 163, 240, 35, 240, 35, + 240, 35, 240, 35, 233, 0, 21, 48, 52, 16, 0, 14, + 101, 146, 51, 114, 83, 82, 99, 82, 99, 82, 98, 98, + 82, 114, 35, 146, 66, 130, 82, 114, 83, 98, 98, 98, + 99, 82, 99, 82, 99, 82, 99, 82, 33, 51, 82, 19, + 35, 82, 18, 50, 98, 18, 35, 68, 36, 0, 16, 96, + 44, 16, 0, 14, 18, 227, 226, 242, 242, 241, 240, 229, + 161, 66, 129, 98, 114, 82, 115, 66, 129, 82, 196, 132, + 34, 114, 82, 98, 98, 98, 98, 33, 50, 83, 33, 51, + 49, 18, 33, 84, 51, 0, 16, 64, 44, 16, 0, 15, + 2, 211, 210, 210, 225, 225, 240, 229, 162, 50, 130, 82, + 115, 66, 115, 66, 129, 82, 196, 132, 34, 115, 66, 99, + 82, 99, 82, 33, 51, 67, 33, 51, 49, 18, 33, 84, + 51, 0, 16, 64, 46, 16, 0, 14, 81, 242, 211, 209, + 18, 177, 49, 240, 240, 213, 162, 50, 130, 82, 115, 66, + 115, 66, 129, 82, 196, 132, 34, 115, 66, 99, 82, 99, + 82, 33, 51, 67, 33, 51, 49, 18, 33, 84, 51, 0, + 16, 64, 42, 16, 0, 18, 36, 49, 180, 0, 7, 37, + 162, 50, 130, 82, 115, 66, 115, 66, 129, 82, 196, 132, + 34, 115, 66, 99, 82, 99, 82, 33, 51, 67, 33, 51, + 49, 18, 33, 84, 51, 0, 16, 64, 45, 16, 0, 16, + 19, 51, 115, 51, 115, 51, 0, 7, 21, 161, 66, 129, + 98, 114, 82, 115, 66, 129, 82, 196, 132, 34, 114, 82, + 98, 98, 98, 98, 33, 50, 83, 33, 51, 49, 18, 33, + 84, 51, 0, 16, 64, 48, 16, 0, 14, 68, 177, 50, + 145, 81, 145, 81, 161, 50, 180, 240, 197, 162, 51, 114, + 83, 98, 83, 99, 67, 113, 83, 181, 116, 35, 99, 67, + 83, 83, 83, 83, 17, 51, 68, 17, 51, 49, 19, 17, + 84, 51, 0, 16, 64, 45, 22, 0, 38, 117, 52, 145, + 66, 18, 35, 97, 99, 67, 82, 82, 98, 83, 66, 99, + 178, 99, 127, 67, 66, 209, 98, 194, 98, 129, 50, 83, + 113, 66, 81, 18, 97, 67, 49, 50, 65, 116, 85, 0, + 22, 96, 36, 13, 0, 23, 21, 114, 65, 83, 81, 66, + 82, 51, 67, 51, 81, 67, 163, 163, 163, 178, 97, 67, + 65, 98, 65, 132, 161, 194, 210, 178, 113, 50, 132, 240, + 240, 16, 37, 14, 0, 12, 65, 210, 210, 210, 209, 225, + 240, 164, 130, 50, 99, 66, 82, 82, 67, 83, 51, 83, + 59, 51, 179, 179, 113, 66, 97, 83, 81, 99, 49, 148, + 0, 14, 96, 37, 14, 0, 13, 34, 194, 178, 178, 193, + 193, 240, 180, 130, 50, 99, 66, 82, 82, 67, 83, 51, + 83, 59, 51, 179, 179, 113, 66, 97, 83, 81, 99, 49, + 148, 0, 14, 96, 40, 14, 0, 12, 114, 194, 194, 177, + 33, 145, 65, 113, 97, 240, 116, 130, 50, 99, 66, 82, + 82, 67, 83, 51, 83, 59, 51, 179, 179, 113, 66, 97, + 83, 81, 99, 49, 148, 0, 14, 96, 38, 14, 0, 14, + 19, 51, 83, 51, 83, 51, 0, 6, 36, 130, 50, 99, + 66, 82, 82, 67, 83, 51, 83, 59, 51, 179, 179, 113, + 66, 97, 83, 81, 99, 49, 148, 0, 14, 96, 27, 10, + 0, 8, 97, 146, 146, 145, 161, 240, 196, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 102, 0, 10, + 48, 27, 10, 0, 9, 50, 115, 114, 114, 114, 240, 180, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 102, 0, 10, 64, 28, 9, 0, 9, 34, 114, 97, 18, + 65, 65, 240, 100, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 86, 0, 9, 48, 28, 11, 0, 12, + 51, 35, 51, 35, 51, 35, 240, 180, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 118, 0, 11, 64, + 44, 15, 0, 13, 66, 65, 146, 33, 164, 180, 161, 34, + 145, 66, 211, 150, 115, 36, 83, 67, 82, 99, 51, 99, + 51, 99, 51, 99, 51, 99, 51, 99, 51, 99, 66, 98, + 83, 67, 99, 35, 148, 0, 15, 112, 42, 17, 0, 19, + 84, 33, 145, 51, 0, 7, 36, 36, 146, 18, 34, 131, + 82, 115, 82, 114, 98, 114, 98, 114, 98, 114, 98, 114, + 98, 114, 98, 114, 98, 114, 98, 114, 98, 86, 38, 0, + 17, 48, 40, 15, 0, 13, 50, 210, 226, 226, 225, 241, + 240, 196, 147, 35, 99, 67, 82, 98, 67, 99, 51, 99, + 51, 99, 51, 99, 51, 99, 51, 99, 66, 98, 83, 67, + 99, 35, 148, 0, 15, 112, 40, 15, 0, 14, 18, 210, + 194, 194, 209, 209, 240, 212, 147, 35, 99, 67, 82, 98, + 67, 99, 51, 99, 51, 99, 51, 99, 51, 99, 51, 99, + 66, 98, 83, 67, 99, 35, 148, 0, 15, 112, 43, 15, + 0, 13, 98, 210, 210, 193, 33, 161, 65, 129, 97, 240, + 148, 147, 35, 99, 67, 82, 98, 67, 99, 51, 99, 51, + 99, 51, 99, 51, 99, 51, 99, 66, 98, 83, 67, 99, + 35, 148, 0, 15, 112, 39, 15, 0, 17, 35, 49, 113, + 51, 0, 6, 116, 147, 35, 99, 67, 82, 98, 67, 99, + 51, 99, 51, 99, 51, 99, 51, 99, 51, 99, 66, 98, + 83, 67, 99, 35, 148, 0, 15, 112, 41, 15, 0, 15, + 35, 35, 115, 35, 115, 35, 0, 6, 100, 147, 35, 99, + 67, 82, 98, 67, 99, 51, 99, 51, 99, 51, 99, 51, + 99, 51, 99, 66, 98, 83, 67, 99, 35, 148, 0, 15, + 112, 23, 28, 0, 39, 115, 240, 163, 240, 163, 0, 22, + 111, 10, 0, 22, 99, 240, 163, 240, 163, 0, 22, 96, + 43, 15, 0, 26, 100, 49, 83, 34, 17, 83, 66, 98, + 83, 67, 65, 18, 67, 65, 19, 51, 49, 35, 51, 33, + 51, 51, 17, 67, 51, 17, 67, 67, 82, 98, 67, 81, + 18, 35, 81, 52, 0, 15, 112, 47, 17, 0, 15, 33, + 240, 18, 240, 18, 240, 18, 240, 17, 240, 240, 228, 68, + 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, + 114, 98, 114, 98, 114, 98, 114, 83, 114, 83, 130, 34, + 18, 148, 36, 0, 17, 48, 43, 17, 0, 16, 2, 227, + 226, 226, 226, 240, 240, 212, 68, 114, 98, 114, 98, 114, + 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, + 98, 114, 83, 114, 83, 130, 34, 18, 148, 36, 0, 17, + 48, 46, 17, 0, 15, 81, 240, 18, 227, 225, 33, 193, + 65, 240, 240, 180, 68, 114, 98, 114, 98, 114, 98, 114, + 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, + 83, 114, 83, 130, 34, 18, 148, 36, 0, 17, 48, 44, + 17, 0, 17, 51, 35, 147, 35, 147, 35, 0, 7, 20, + 68, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, + 98, 114, 98, 114, 98, 114, 98, 114, 83, 114, 83, 130, + 34, 18, 148, 36, 0, 17, 48, 55, 18, 0, 17, 17, + 240, 18, 242, 242, 240, 17, 240, 240, 247, 53, 83, 98, + 130, 97, 146, 97, 162, 81, 162, 65, 179, 49, 194, 49, + 194, 33, 211, 17, 226, 17, 226, 17, 227, 240, 18, 240, + 18, 240, 17, 240, 33, 179, 49, 179, 33, 195, 18, 212, + 240, 240, 49, 16, 0, 14, 34, 196, 226, 226, 226, 226, + 226, 226, 52, 114, 33, 35, 98, 17, 67, 83, 83, 82, + 99, 82, 99, 82, 98, 98, 83, 98, 82, 114, 66, 130, + 50, 146, 34, 162, 17, 195, 210, 226, 226, 226, 226, 226, + 194, 240, 240, 54, 18, 0, 20, 99, 35, 163, 35, 163, + 35, 240, 240, 199, 38, 83, 98, 130, 97, 147, 81, 162, + 65, 178, 65, 179, 49, 194, 33, 210, 33, 211, 17, 227, + 243, 240, 18, 240, 18, 240, 17, 240, 33, 240, 33, 179, + 33, 195, 33, 195, 17, 227, 240, 240, 16, +}; + +//***************************************************************************** +// +// The glyph offset table for the 30 point Oldstandard font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard30[] = +{ + 0, 5, 32, 49, 98, 175, 243, 303, + 315, 349, 383, 413, 468, 483, 490, 500, + 535, 582, 610, 649, 690, 727, 768, 814, + 845, 891, 938, 953, 973, 1029, 1042, 1098, + 1134, 1209, 1263, 1309, 1359, 1406, 1456, 1503, + 1557, 1605, 1633, 1666, 1715, 1763, 1839, 1902, + 1953, 1998, 2063, 2113, 2160, 2214, 2262, 2317, + 2403, 2455, 2506, 2549, 2582, 2616, 2649, 2675, + 2684, 2696, 2733, 2777, 2807, 2850, 2880, 2911, + 2956, 2999, 3025, 3061, 3103, 3131, 3182, 3218, + 3251, 3293, 3336, 3362, 3393, 3424, 3460, 3493, + 3545, 3577, 3623, 3652, 3686, 3718, 3753, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3773, 3777, 3802, 3850, 3899, 3934, 3978, 4005, + 4056, 4069, 4143, 4166, 4193, 4210, 4217, 4295, + 4303, 4324, 4367, 4394, 4421, 4433, 4487, 4545, + 4555, 4569, 4588, 4612, 4639, 4698, 4760, 4827, + 4862, 4925, 4988, 5053, 5113, 5173, 5240, 5310, + 5370, 5429, 5489, 5549, 5607, 5640, 5673, 5708, + 5742, 5789, 5857, 5917, 5977, 6039, 6095, 6153, + 6200, 6264, 6321, 6378, 6437, 6492, 6552, 6596, + 6648, 6692, 6736, 6782, 6824, 6869, 6917, 6962, + 6998, 7035, 7072, 7112, 7150, 7177, 7204, 7232, + 7260, 7304, 7346, 7386, 7426, 7469, 7508, 7549, + 7572, 7615, 7662, 7705, 7751, 7795, 7850, 7899, +}; + +//***************************************************************************** +// +// The font definition for the 30 point Oldstandard font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard30 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 29, + + // + // The height of the font. + // + 36, + + // + // The baseline of the font. + // + 28, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard30, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard30Data +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard30b.c b/third_party/fonts/ofl/fonts/fontoldstandard30b.c new file mode 100644 index 0000000..13f57ca --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard30b.c @@ -0,0 +1,909 @@ +//***************************************************************************** +// +// fontoldstandard30b.c - Font definition for the 30pt Oldstandard bold font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 30 point +// Bold: yes +// Italic: no +// Memory usage: 8472 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 30 point Oldstandard bold font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard30bData[8270] = +{ + 5, 13, 0, 63, 48, 29, 8, 0, 7, 33, 99, 69, + 53, 53, 53, 53, 67, 83, 83, 83, 97, 113, 113, 113, + 113, 113, 227, 69, 53, 53, 67, 0, 9, 64, 23, 11, + 0, 9, 97, 65, 67, 35, 51, 35, 51, 35, 51, 35, + 51, 35, 65, 65, 81, 65, 0, 33, 64, 51, 20, 0, + 20, 98, 82, 178, 81, 178, 82, 178, 82, 178, 82, 178, + 82, 111, 2, 63, 2, 130, 66, 178, 82, 178, 82, 178, + 82, 178, 82, 178, 82, 127, 2, 63, 2, 98, 82, 178, + 82, 178, 82, 178, 82, 178, 82, 178, 66, 0, 23, 80, + 81, 17, 0, 13, 49, 49, 193, 49, 184, 114, 17, 49, + 18, 97, 33, 49, 34, 66, 33, 49, 34, 66, 33, 49, + 19, 67, 17, 49, 19, 69, 49, 19, 69, 49, 18, 87, + 17, 152, 168, 168, 168, 145, 23, 67, 17, 53, 67, 17, + 49, 19, 52, 17, 49, 34, 66, 33, 49, 34, 65, 49, + 49, 34, 65, 49, 49, 33, 97, 33, 49, 18, 120, 177, + 17, 17, 193, 49, 193, 49, 0, 13, 80, 72, 23, 0, + 22, 17, 133, 129, 130, 50, 113, 115, 50, 97, 131, 51, + 81, 131, 51, 65, 147, 51, 50, 147, 51, 49, 163, 51, + 34, 178, 50, 49, 195, 19, 34, 227, 65, 240, 98, 52, + 225, 50, 34, 194, 50, 34, 178, 51, 35, 161, 67, 35, + 146, 67, 35, 145, 83, 35, 130, 83, 35, 129, 99, 35, + 114, 114, 34, 129, 148, 130, 0, 25, 32, 58, 24, 0, + 24, 102, 240, 34, 66, 243, 81, 243, 81, 243, 81, 244, + 50, 244, 34, 240, 38, 240, 53, 240, 84, 240, 70, 70, + 114, 21, 82, 130, 52, 82, 114, 84, 65, 115, 85, 34, + 100, 100, 33, 116, 118, 116, 117, 133, 116, 134, 101, 49, + 75, 23, 104, 69, 0, 27, 80, 15, 6, 240, 240, 209, + 67, 51, 51, 51, 51, 65, 81, 0, 18, 64, 35, 12, + 0, 12, 113, 161, 161, 162, 146, 147, 146, 147, 147, 147, + 132, 132, 132, 132, 132, 132, 132, 132, 147, 147, 147, 162, + 178, 162, 178, 178, 178, 178, 240, 240, 144, 35, 12, 0, + 12, 17, 193, 193, 178, 178, 163, 162, 163, 147, 147, 148, + 132, 132, 132, 132, 132, 132, 132, 131, 147, 147, 146, 146, + 162, 146, 146, 146, 146, 0, 5, 96, 33, 14, 0, 14, + 67, 179, 114, 35, 34, 51, 33, 35, 52, 17, 20, 115, + 161, 17, 17, 99, 33, 35, 51, 33, 35, 50, 35, 34, + 115, 179, 0, 34, 16, 56, 29, 0, 30, 66, 240, 194, + 240, 194, 240, 194, 240, 194, 240, 194, 240, 194, 240, 194, + 240, 194, 240, 194, 240, 194, 240, 194, 255, 11, 63, 11, + 242, 240, 194, 240, 194, 240, 194, 240, 194, 240, 194, 240, + 194, 240, 194, 240, 194, 240, 194, 240, 194, 240, 194, 0, + 20, 18, 9, 0, 28, 36, 84, 70, 69, 69, 129, 113, + 129, 113, 113, 113, 240, 240, 64, 9, 11, 0, 28, 120, + 56, 56, 0, 21, 12, 7, 0, 22, 2, 68, 52, 52, + 66, 0, 8, 48, 36, 13, 0, 12, 50, 178, 162, 178, + 178, 163, 162, 178, 178, 162, 178, 178, 162, 178, 178, 163, + 162, 178, 178, 162, 178, 178, 162, 178, 178, 178, 162, 178, + 178, 0, 6, 32, 48, 17, 0, 17, 70, 163, 35, 131, + 67, 115, 67, 100, 68, 84, 68, 84, 68, 69, 69, 53, + 69, 53, 69, 53, 69, 53, 69, 53, 69, 53, 69, 53, + 69, 68, 68, 84, 68, 84, 68, 99, 67, 115, 67, 131, + 35, 166, 0, 20, 28, 13, 0, 13, 82, 148, 103, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 106, 0, 15, 43, 16, 0, 16, + 55, 130, 68, 82, 99, 67, 100, 51, 100, 52, 84, 53, + 68, 53, 53, 68, 52, 180, 180, 180, 179, 195, 194, 129, + 81, 145, 65, 161, 50, 161, 61, 60, 65, 56, 65, 70, + 0, 18, 80, 42, 17, 0, 17, 40, 131, 68, 83, 99, + 83, 100, 68, 84, 69, 68, 69, 68, 83, 83, 227, 210, + 166, 244, 228, 228, 213, 68, 69, 53, 69, 53, 69, 52, + 85, 51, 85, 82, 84, 121, 0, 19, 112, 38, 17, 0, + 18, 3, 212, 212, 197, 197, 182, 177, 20, 162, 20, 161, + 36, 146, 36, 130, 52, 130, 52, 114, 68, 113, 84, 98, + 84, 110, 164, 212, 212, 212, 212, 155, 0, 19, 64, 41, + 16, 0, 16, 18, 83, 105, 120, 135, 148, 193, 241, 241, + 241, 37, 131, 52, 98, 69, 81, 100, 197, 181, 181, 68, + 53, 53, 53, 53, 53, 52, 68, 67, 84, 82, 68, 120, + 177, 0, 17, 32, 47, 17, 0, 17, 71, 147, 65, 132, + 66, 115, 52, 100, 52, 100, 52, 100, 66, 101, 197, 197, + 21, 102, 51, 85, 83, 69, 83, 69, 84, 53, 84, 53, + 84, 68, 84, 68, 84, 68, 83, 99, 83, 115, 51, 151, + 0, 19, 112, 40, 15, 0, 15, 1, 36, 49, 65, 22, + 34, 56, 49, 57, 33, 50, 70, 49, 161, 49, 145, 65, + 145, 65, 130, 194, 210, 194, 195, 180, 179, 180, 180, 165, + 165, 165, 165, 180, 0, 17, 96, 46, 18, 0, 18, 56, + 146, 113, 114, 130, 83, 145, 83, 145, 83, 145, 84, 129, + 86, 81, 120, 17, 138, 154, 154, 113, 56, 82, 86, 66, + 132, 66, 148, 50, 162, 66, 162, 66, 162, 82, 145, 114, + 113, 152, 0, 21, 16, 46, 17, 0, 17, 55, 147, 51, + 115, 83, 99, 83, 84, 84, 68, 84, 68, 85, 52, 85, + 52, 85, 67, 85, 67, 85, 83, 54, 101, 21, 197, 197, + 98, 68, 100, 52, 100, 52, 100, 51, 114, 68, 113, 83, + 151, 0, 20, 19, 7, 0, 13, 34, 68, 52, 52, 66, + 240, 240, 162, 68, 52, 52, 66, 0, 8, 48, 25, 9, + 0, 17, 18, 100, 84, 84, 98, 0, 6, 52, 84, 70, + 69, 69, 129, 113, 129, 113, 113, 113, 240, 240, 64, 56, + 26, 0, 31, 99, 240, 100, 240, 100, 240, 84, 240, 84, + 240, 84, 240, 100, 240, 84, 240, 84, 240, 84, 240, 100, + 240, 84, 240, 99, 240, 132, 240, 148, 240, 148, 240, 148, + 240, 147, 240, 148, 240, 148, 240, 148, 240, 148, 240, 132, + 240, 148, 240, 147, 0, 16, 80, 17, 28, 0, 63, 15, + 10, 63, 10, 0, 14, 63, 10, 63, 10, 0, 45, 112, + 56, 26, 0, 29, 35, 240, 148, 240, 132, 240, 148, 240, + 148, 240, 148, 240, 132, 240, 148, 240, 148, 240, 148, 240, + 132, 240, 148, 240, 147, 240, 116, 240, 84, 240, 84, 240, + 84, 240, 84, 240, 100, 240, 84, 240, 84, 240, 84, 240, + 100, 240, 84, 240, 99, 0, 19, 16, 38, 13, 0, 13, + 38, 97, 67, 65, 84, 49, 84, 49, 84, 49, 83, 81, + 52, 147, 147, 162, 162, 162, 177, 49, 129, 49, 129, 49, + 147, 240, 146, 164, 148, 148, 162, 0, 15, 64, 79, 25, + 0, 25, 121, 226, 131, 178, 178, 146, 210, 114, 99, 19, + 33, 98, 83, 36, 34, 82, 67, 52, 49, 82, 66, 68, + 50, 50, 67, 68, 50, 50, 67, 67, 66, 50, 51, 83, + 66, 50, 51, 83, 66, 50, 51, 68, 66, 50, 51, 67, + 66, 66, 51, 67, 66, 82, 35, 52, 65, 98, 50, 34, + 18, 49, 130, 51, 68, 146, 240, 146, 240, 147, 130, 234, + 240, 81, 0, 26, 80, 53, 24, 0, 22, 33, 240, 130, + 240, 99, 240, 99, 240, 100, 240, 69, 240, 69, 240, 70, + 240, 39, 240, 33, 36, 240, 33, 37, 242, 37, 241, 53, + 241, 69, 210, 69, 209, 85, 220, 178, 101, 177, 117, 177, + 133, 146, 133, 131, 134, 88, 43, 0, 27, 48, 48, 21, + 0, 21, 13, 180, 83, 148, 84, 132, 100, 116, 100, 116, + 100, 116, 100, 116, 99, 132, 99, 132, 82, 169, 196, 83, + 148, 84, 132, 100, 116, 101, 100, 101, 100, 101, 100, 101, + 100, 100, 116, 85, 116, 84, 94, 0, 24, 64, 46, 19, + 0, 19, 86, 50, 99, 85, 84, 100, 83, 131, 68, 131, + 68, 146, 68, 146, 53, 146, 53, 146, 53, 229, 229, 229, + 229, 161, 53, 161, 68, 161, 68, 146, 68, 145, 99, 145, + 115, 113, 131, 98, 167, 0, 22, 32, 48, 23, 0, 23, + 14, 196, 99, 164, 115, 148, 116, 132, 131, 132, 132, 116, + 132, 116, 133, 100, 133, 100, 133, 100, 133, 100, 133, 100, + 133, 100, 133, 100, 133, 100, 132, 116, 132, 116, 131, 132, + 116, 132, 115, 148, 99, 126, 0, 27, 52, 21, 0, 21, + 15, 2, 116, 100, 116, 115, 116, 130, 116, 130, 116, 145, + 116, 81, 49, 116, 81, 180, 66, 180, 51, 186, 180, 51, + 180, 66, 180, 81, 50, 100, 81, 50, 100, 146, 100, 146, + 100, 131, 100, 131, 100, 116, 100, 101, 63, 3, 0, 24, + 50, 20, 0, 20, 15, 2, 100, 100, 100, 115, 100, 130, + 100, 130, 100, 145, 100, 81, 49, 100, 81, 49, 100, 66, + 164, 51, 170, 164, 51, 164, 66, 164, 81, 164, 81, 164, + 240, 20, 240, 20, 240, 20, 240, 20, 240, 20, 219, 0, + 23, 80, 53, 22, 0, 22, 87, 49, 162, 85, 147, 100, + 131, 131, 116, 146, 116, 146, 116, 146, 101, 161, 101, 161, + 101, 240, 37, 240, 37, 74, 53, 116, 101, 116, 101, 116, + 116, 116, 116, 116, 116, 116, 131, 116, 132, 82, 18, 147, + 81, 49, 182, 65, 0, 25, 64, 51, 25, 0, 25, 10, + 42, 100, 132, 148, 132, 148, 132, 148, 132, 148, 132, 148, + 132, 148, 132, 148, 132, 148, 132, 159, 1, 148, 132, 148, + 132, 148, 132, 148, 132, 148, 132, 148, 132, 148, 132, 148, + 132, 148, 132, 148, 132, 106, 42, 0, 28, 64, 28, 13, + 0, 13, 10, 100, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 106, + 0, 15, 36, 17, 0, 17, 74, 164, 212, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 212, 116, 36, 101, 36, + 101, 36, 100, 52, 99, 68, 98, 83, 129, 67, 166, 0, + 20, 32, 50, 23, 0, 23, 10, 39, 116, 115, 148, 114, + 164, 98, 180, 97, 196, 81, 212, 65, 228, 50, 228, 35, + 228, 21, 218, 213, 21, 196, 37, 196, 53, 180, 53, 180, + 69, 164, 69, 164, 85, 148, 85, 148, 101, 132, 101, 90, + 25, 0, 26, 32, 50, 20, 0, 20, 10, 212, 240, 20, + 240, 20, 240, 20, 240, 20, 240, 20, 240, 20, 240, 20, + 240, 20, 240, 20, 240, 20, 240, 20, 145, 100, 145, 100, + 145, 100, 130, 100, 130, 100, 130, 100, 115, 100, 100, 100, + 85, 63, 2, 0, 22, 112, 77, 27, 0, 27, 7, 152, + 100, 149, 149, 133, 149, 133, 149, 118, 150, 97, 20, 145, + 20, 97, 20, 145, 21, 81, 20, 145, 21, 65, 36, 145, + 36, 65, 36, 145, 37, 49, 36, 145, 37, 34, 36, 145, + 52, 33, 52, 145, 53, 17, 52, 145, 68, 17, 52, 145, + 69, 68, 145, 69, 68, 145, 84, 68, 145, 84, 68, 145, + 83, 84, 131, 82, 84, 103, 50, 42, 0, 30, 96, 59, + 24, 0, 24, 7, 89, 86, 101, 133, 115, 165, 113, 182, + 97, 182, 97, 183, 81, 177, 22, 65, 177, 37, 65, 177, + 38, 49, 177, 54, 33, 177, 69, 33, 177, 70, 17, 177, + 87, 177, 102, 177, 102, 177, 117, 177, 132, 177, 132, 163, + 131, 149, 130, 121, 98, 240, 129, 0, 24, 112, 49, 21, + 0, 21, 102, 210, 98, 163, 99, 131, 131, 115, 131, 100, + 132, 84, 132, 69, 132, 69, 133, 53, 133, 53, 133, 53, + 133, 53, 133, 53, 133, 53, 132, 84, 132, 84, 132, 99, + 131, 115, 131, 131, 99, 162, 98, 214, 0, 24, 96, 47, + 21, 0, 21, 14, 164, 84, 132, 85, 116, 100, 116, 101, + 100, 101, 100, 101, 100, 101, 100, 100, 116, 85, 116, 84, + 139, 164, 240, 36, 240, 36, 240, 36, 240, 36, 240, 36, + 240, 36, 240, 36, 240, 36, 235, 0, 24, 112, 66, 21, + 0, 21, 102, 210, 98, 163, 99, 131, 131, 115, 131, 100, + 132, 84, 132, 69, 132, 69, 133, 53, 133, 53, 133, 53, + 133, 53, 133, 53, 133, 53, 133, 68, 132, 84, 132, 99, + 35, 51, 115, 17, 34, 20, 132, 53, 163, 52, 49, 135, + 81, 177, 18, 81, 210, 81, 211, 50, 216, 215, 246, 240, + 20, 0, 5, 112, 53, 23, 0, 23, 13, 212, 68, 180, + 84, 164, 85, 148, 85, 148, 85, 148, 85, 148, 85, 148, + 69, 164, 68, 185, 228, 67, 196, 83, 180, 83, 180, 84, + 164, 84, 164, 84, 164, 84, 49, 100, 84, 49, 100, 84, + 49, 100, 84, 33, 75, 38, 0, 26, 48, 49, 17, 0, + 17, 39, 49, 82, 85, 82, 115, 67, 115, 67, 130, 68, + 114, 69, 113, 71, 81, 87, 184, 168, 168, 81, 87, 65, + 102, 66, 117, 50, 132, 50, 147, 51, 146, 51, 146, 52, + 114, 66, 18, 97, 81, 55, 209, 0, 18, 16, 57, 22, + 0, 22, 15, 4, 52, 52, 53, 51, 68, 68, 51, 68, + 83, 50, 84, 83, 50, 84, 98, 49, 100, 98, 49, 100, + 98, 49, 100, 113, 164, 240, 52, 240, 52, 240, 52, 240, + 52, 240, 52, 240, 52, 240, 52, 240, 52, 240, 52, 240, + 52, 240, 52, 251, 0, 25, 80, 50, 24, 0, 24, 10, + 71, 100, 147, 132, 161, 148, 161, 148, 161, 148, 161, 148, + 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, + 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, 161, 163, + 145, 180, 129, 195, 113, 248, 0, 28, 16, 55, 24, 0, + 24, 10, 56, 101, 131, 133, 130, 149, 129, 180, 129, 181, + 98, 181, 97, 213, 81, 213, 81, 213, 65, 245, 49, 245, + 49, 245, 33, 240, 37, 17, 240, 37, 17, 240, 38, 240, + 69, 240, 69, 240, 68, 240, 99, 240, 99, 240, 98, 240, + 129, 0, 25, 80, 83, 33, 0, 33, 10, 26, 24, 101, + 86, 99, 133, 101, 98, 164, 101, 97, 181, 85, 97, 181, + 85, 97, 196, 86, 66, 197, 70, 65, 213, 65, 20, 65, + 228, 50, 21, 34, 229, 33, 37, 34, 229, 33, 52, 33, + 240, 20, 18, 53, 17, 240, 20, 17, 71, 240, 22, 86, + 240, 37, 85, 240, 53, 85, 240, 52, 116, 240, 67, 115, + 240, 83, 115, 240, 82, 146, 240, 97, 146, 240, 97, 145, + 0, 34, 64, 51, 23, 0, 23, 25, 40, 102, 83, 165, + 82, 181, 82, 197, 50, 213, 49, 245, 18, 247, 240, 37, + 240, 53, 240, 69, 240, 53, 240, 54, 240, 38, 240, 17, + 37, 226, 37, 225, 69, 194, 69, 178, 101, 162, 101, 147, + 102, 88, 42, 0, 26, 32, 53, 23, 0, 23, 9, 71, + 86, 115, 133, 114, 149, 113, 181, 97, 181, 81, 212, 81, + 213, 49, 244, 49, 245, 18, 240, 20, 17, 240, 36, 17, + 240, 52, 240, 68, 240, 68, 240, 68, 240, 68, 240, 68, + 240, 68, 240, 68, 240, 68, 240, 26, 0, 26, 112, 44, + 19, 0, 19, 31, 69, 85, 67, 101, 82, 117, 82, 101, + 97, 102, 97, 101, 113, 86, 213, 214, 213, 213, 229, 213, + 229, 97, 101, 113, 86, 113, 85, 114, 70, 99, 69, 115, + 54, 85, 63, 1, 0, 21, 96, 35, 11, 0, 11, 8, + 52, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 120, 240, 240, 96, 36, 14, 0, 12, 35, 194, + 194, 194, 210, 194, 194, 210, 194, 194, 195, 194, 194, 194, + 210, 194, 194, 210, 194, 194, 194, 210, 194, 194, 210, 194, + 194, 210, 194, 240, 240, 240, 35, 11, 0, 11, 8, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 56, 240, 240, 96, 25, 16, 0, 16, 97, 227, 212, + 181, 178, 19, 146, 50, 131, 66, 114, 83, 83, 98, 82, + 130, 50, 146, 0, 40, 48, 11, 19, 0, 78, 63, 1, + 63, 1, 0, 9, 112, 13, 8, 0, 8, 2, 99, 99, + 98, 114, 113, 0, 25, 48, 38, 16, 0, 30, 53, 147, + 36, 99, 67, 100, 52, 84, 52, 84, 52, 181, 131, 20, + 100, 36, 99, 52, 84, 52, 84, 52, 17, 52, 52, 17, + 53, 36, 17, 85, 20, 0, 18, 64, 46, 17, 0, 17, + 6, 212, 212, 212, 212, 212, 212, 212, 20, 133, 35, 117, + 51, 100, 67, 100, 68, 84, 68, 84, 68, 84, 68, 84, + 68, 84, 68, 84, 68, 84, 67, 98, 18, 51, 97, 49, + 35, 113, 68, 0, 19, 112, 31, 14, 0, 26, 101, 115, + 50, 99, 66, 67, 67, 52, 52, 52, 52, 52, 66, 68, + 164, 164, 164, 179, 97, 83, 81, 84, 49, 133, 0, 16, + 48, 45, 17, 0, 17, 102, 212, 212, 212, 212, 212, 212, + 132, 20, 115, 17, 20, 99, 53, 99, 53, 84, 68, 84, + 68, 84, 68, 84, 68, 84, 68, 84, 68, 84, 68, 99, + 68, 99, 53, 115, 37, 132, 22, 0, 19, 64, 32, 14, + 0, 26, 100, 131, 19, 99, 51, 83, 51, 68, 52, 52, + 52, 52, 52, 59, 52, 164, 164, 97, 67, 97, 68, 65, + 99, 50, 132, 0, 16, 64, 33, 14, 0, 14, 84, 147, + 18, 115, 35, 84, 20, 84, 20, 84, 164, 136, 132, 164, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 136, + 0, 16, 64, 46, 18, 0, 34, 36, 51, 100, 20, 34, + 68, 51, 19, 68, 54, 84, 52, 116, 52, 131, 52, 147, + 20, 181, 163, 226, 240, 18, 240, 24, 172, 123, 139, 97, + 131, 81, 162, 81, 162, 81, 146, 114, 98, 166, 240, 240, + 240, 45, 19, 0, 19, 6, 244, 244, 244, 244, 244, 244, + 244, 36, 148, 17, 35, 133, 52, 117, 52, 116, 68, 116, + 68, 116, 68, 116, 68, 116, 68, 116, 68, 116, 68, 116, + 68, 116, 68, 116, 68, 87, 39, 0, 21, 96, 28, 9, + 0, 9, 34, 100, 84, 98, 240, 240, 37, 84, 84, 84, + 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 70, 0, + 10, 64, 39, 12, 0, 12, 98, 148, 132, 146, 240, 240, + 214, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 67, 20, 52, 20, 52, 20, 51, 35, + 82, 19, 116, 240, 240, 42, 18, 0, 18, 6, 228, 228, + 228, 228, 228, 228, 228, 38, 100, 66, 132, 65, 148, 49, + 164, 33, 180, 33, 180, 19, 168, 169, 148, 35, 148, 36, + 132, 52, 116, 52, 116, 53, 71, 23, 0, 20, 80, 29, + 11, 0, 11, 6, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 88, 0, 12, 96, 53, 25, 0, 46, 118, 35, 67, 150, + 19, 18, 19, 133, 37, 36, 117, 36, 52, 116, 52, 52, + 116, 52, 52, 116, 52, 52, 116, 52, 52, 116, 52, 52, + 116, 52, 52, 116, 52, 52, 116, 52, 52, 116, 52, 52, + 116, 52, 52, 87, 22, 23, 0, 28, 64, 38, 19, 0, + 35, 86, 36, 148, 17, 35, 133, 52, 117, 52, 116, 68, + 116, 68, 116, 68, 116, 68, 116, 68, 116, 68, 116, 68, + 116, 68, 116, 68, 116, 68, 87, 39, 0, 21, 96, 35, + 15, 0, 28, 84, 147, 35, 114, 66, 99, 67, 68, 67, + 68, 68, 52, 68, 52, 68, 52, 68, 52, 68, 67, 67, + 83, 67, 98, 66, 115, 35, 148, 0, 17, 96, 44, 17, + 0, 31, 118, 20, 133, 35, 117, 51, 100, 67, 100, 68, + 84, 68, 84, 68, 84, 68, 84, 68, 84, 68, 84, 68, + 84, 67, 101, 51, 101, 35, 116, 20, 132, 212, 212, 212, + 212, 212, 184, 240, 240, 208, 47, 17, 0, 32, 36, 65, + 115, 33, 49, 99, 50, 18, 99, 68, 84, 68, 84, 68, + 84, 68, 84, 68, 84, 68, 84, 68, 84, 68, 99, 53, + 99, 53, 115, 17, 20, 132, 20, 212, 212, 212, 212, 212, + 212, 184, 240, 240, 112, 25, 14, 0, 26, 38, 34, 105, + 89, 84, 20, 84, 19, 100, 164, 164, 164, 164, 164, 164, + 164, 164, 135, 0, 16, 80, 35, 13, 0, 24, 84, 33, + 81, 50, 17, 66, 82, 66, 82, 67, 81, 68, 165, 150, + 134, 65, 69, 49, 99, 50, 98, 51, 82, 49, 18, 50, + 65, 52, 0, 15, 32, 34, 13, 0, 15, 17, 193, 193, + 178, 178, 163, 137, 99, 163, 163, 163, 163, 163, 163, 163, + 65, 83, 65, 83, 65, 83, 65, 83, 49, 114, 49, 132, + 0, 15, 32, 38, 19, 0, 35, 86, 38, 116, 68, 116, + 68, 116, 68, 116, 68, 116, 68, 116, 68, 116, 68, 116, + 68, 116, 68, 116, 68, 116, 53, 116, 53, 131, 33, 20, + 148, 38, 0, 21, 96, 33, 18, 0, 33, 104, 37, 84, + 82, 131, 82, 131, 81, 148, 65, 163, 49, 180, 33, 180, + 33, 195, 17, 213, 213, 227, 243, 240, 18, 240, 17, 0, + 21, 64, 51, 25, 0, 46, 119, 39, 21, 84, 68, 82, + 115, 83, 81, 131, 83, 81, 132, 68, 49, 163, 68, 49, + 164, 33, 19, 49, 164, 33, 20, 17, 195, 17, 51, 17, + 197, 51, 17, 197, 52, 227, 83, 227, 83, 242, 82, 240, + 17, 113, 0, 29, 32, 32, 17, 0, 31, 119, 21, 85, + 66, 116, 65, 132, 49, 164, 17, 197, 196, 228, 212, 213, + 177, 36, 145, 52, 145, 68, 114, 69, 70, 23, 0, 19, + 64, 44, 17, 0, 31, 119, 37, 69, 82, 100, 81, 116, + 81, 131, 65, 148, 49, 163, 49, 164, 17, 180, 17, 197, + 196, 227, 227, 227, 241, 240, 17, 240, 17, 179, 17, 180, + 17, 179, 33, 179, 17, 211, 0, 5, 96, 33, 15, 0, + 28, 43, 67, 68, 66, 68, 81, 68, 97, 68, 97, 52, + 180, 164, 164, 65, 100, 65, 84, 81, 69, 66, 68, 82, + 52, 68, 60, 0, 17, 32, 36, 13, 0, 12, 50, 131, + 147, 148, 148, 148, 148, 148, 148, 148, 148, 148, 147, 147, + 131, 195, 179, 164, 148, 148, 148, 148, 148, 148, 148, 148, + 163, 179, 210, 240, 240, 192, 34, 5, 240, 240, 162, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 240, 48, 36, 13, 0, 11, 50, 211, 179, 164, + 148, 148, 148, 148, 148, 148, 148, 148, 163, 179, 195, 131, + 147, 148, 148, 148, 148, 148, 148, 148, 148, 148, 147, 147, + 130, 0, 6, 32, 21, 20, 0, 47, 100, 145, 87, 129, + 49, 54, 97, 49, 102, 49, 49, 135, 81, 148, 0, 35, + 80, 5, 12, 0, 58, 64, 28, 8, 0, 14, 19, 69, + 53, 53, 67, 240, 113, 113, 113, 113, 113, 98, 99, 83, + 83, 83, 69, 53, 53, 53, 53, 67, 240, 80, 52, 14, + 0, 21, 97, 209, 209, 195, 148, 17, 115, 17, 18, 83, + 33, 18, 83, 33, 19, 52, 33, 18, 68, 33, 18, 68, + 33, 116, 33, 116, 33, 116, 33, 49, 67, 33, 49, 67, + 33, 49, 83, 17, 33, 116, 17, 163, 193, 209, 209, 0, + 9, 80, 50, 22, 0, 23, 23, 211, 82, 180, 83, 163, + 99, 148, 84, 148, 83, 164, 240, 52, 240, 52, 247, 241, + 56, 228, 240, 52, 240, 67, 240, 67, 240, 67, 240, 66, + 145, 69, 18, 129, 65, 52, 130, 65, 76, 81, 75, 116, + 70, 0, 25, 80, 35, 17, 0, 27, 82, 52, 50, 62, + 68, 68, 82, 130, 67, 130, 66, 162, 50, 162, 50, 162, + 50, 162, 51, 131, 66, 130, 84, 68, 78, 50, 38, 34, + 0, 25, 112, 38, 19, 0, 19, 8, 53, 70, 83, 101, + 97, 117, 81, 149, 65, 149, 65, 164, 49, 181, 33, 196, + 17, 214, 228, 189, 164, 244, 189, 164, 244, 244, 244, 244, + 244, 202, 0, 22, 16, 30, 5, 240, 240, 82, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 240, 240, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 240, 128, 56, + 17, 0, 17, 69, 178, 66, 130, 98, 98, 99, 98, 84, + 98, 84, 99, 67, 116, 229, 199, 145, 24, 113, 41, 66, + 71, 66, 102, 51, 116, 53, 114, 70, 82, 72, 49, 106, + 151, 198, 212, 115, 67, 100, 82, 100, 82, 99, 98, 98, + 98, 130, 66, 181, 240, 240, 192, 15, 13, 0, 14, 98, + 66, 68, 36, 52, 36, 66, 66, 0, 42, 96, 77, 25, + 0, 25, 105, 242, 130, 193, 193, 161, 225, 129, 100, 33, + 49, 97, 83, 51, 65, 81, 67, 82, 65, 81, 67, 82, + 65, 65, 68, 97, 81, 49, 68, 97, 81, 49, 68, 193, + 49, 68, 193, 49, 68, 193, 49, 68, 97, 81, 65, 52, + 97, 65, 81, 67, 97, 65, 81, 67, 81, 81, 97, 67, + 50, 65, 129, 84, 81, 161, 193, 194, 130, 234, 240, 81, + 0, 26, 80, 28, 12, 0, 12, 20, 114, 35, 83, 19, + 83, 19, 132, 98, 19, 83, 19, 83, 19, 17, 51, 19, + 17, 67, 19, 72, 0, 30, 64, 30, 11, 0, 23, 82, + 49, 66, 49, 82, 49, 67, 34, 67, 34, 67, 34, 67, + 34, 67, 34, 82, 49, 82, 49, 98, 49, 97, 0, 14, + 80, 23, 18, 0, 38, 47, 63, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 0, 29, 80, + 9, 11, 0, 28, 120, 56, 56, 0, 21, 80, 25, 0, + 25, 105, 242, 130, 193, 193, 161, 225, 129, 27, 65, 97, + 68, 36, 65, 81, 68, 52, 49, 81, 68, 52, 49, 65, + 84, 52, 65, 49, 84, 36, 81, 49, 86, 145, 49, 84, + 34, 113, 49, 84, 36, 81, 49, 84, 36, 81, 65, 68, + 36, 17, 33, 81, 68, 36, 17, 33, 81, 68, 36, 17, + 33, 97, 23, 36, 33, 129, 225, 161, 193, 194, 130, 234, + 240, 81, 0, 26, 80, 9, 11, 0, 13, 104, 56, 0, + 37, 64, 21, 13, 0, 13, 38, 98, 66, 66, 98, 50, + 98, 50, 98, 50, 98, 66, 66, 116, 0, 38, 16, 49, + 28, 0, 33, 2, 240, 178, 240, 178, 240, 178, 240, 178, + 240, 178, 240, 178, 240, 178, 239, 10, 63, 10, 242, 240, + 178, 240, 178, 240, 178, 240, 178, 240, 178, 240, 178, 240, + 178, 240, 178, 0, 8, 111, 10, 63, 10, 0, 24, 112, + 30, 12, 0, 12, 37, 98, 35, 66, 67, 50, 67, 51, + 51, 66, 35, 131, 131, 130, 145, 97, 65, 97, 57, 49, + 37, 65, 51, 0, 26, 16, 29, 13, 0, 13, 37, 113, + 51, 82, 67, 68, 35, 83, 35, 147, 116, 195, 179, 83, + 36, 52, 36, 51, 52, 51, 36, 101, 0, 28, 48, 13, + 8, 0, 8, 50, 83, 67, 82, 82, 97, 0, 25, 112, + 51, 18, 0, 33, 114, 98, 131, 68, 100, 68, 100, 68, + 100, 68, 100, 68, 99, 84, 99, 84, 99, 83, 115, 98, + 49, 65, 114, 49, 65, 99, 49, 66, 72, 72, 21, 65, + 36, 51, 81, 240, 18, 240, 19, 243, 244, 228, 228, 228, + 240, 240, 32, 60, 18, 0, 18, 75, 86, 34, 119, 34, + 119, 34, 104, 34, 104, 34, 104, 34, 104, 34, 104, 34, + 119, 34, 134, 34, 164, 34, 194, 34, 194, 34, 194, 34, + 194, 34, 194, 34, 194, 34, 194, 34, 194, 34, 194, 34, + 194, 34, 194, 34, 194, 34, 194, 34, 194, 34, 194, 34, + 0, 9, 96, 12, 7, 0, 15, 2, 68, 52, 52, 66, + 0, 15, 48, 13, 8, 0, 30, 33, 97, 114, 130, 98, + 98, 52, 240, 80, 20, 10, 0, 10, 50, 85, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 87, 0, 22, 112, + 26, 11, 0, 11, 36, 98, 34, 82, 34, 67, 35, 51, + 35, 51, 35, 51, 35, 66, 34, 82, 34, 100, 88, 0, + 27, 112, 30, 11, 0, 23, 49, 50, 97, 50, 81, 50, + 82, 35, 66, 35, 66, 35, 66, 35, 66, 35, 65, 50, + 81, 50, 65, 50, 145, 0, 14, 64, 62, 25, 0, 23, + 114, 162, 177, 133, 162, 163, 161, 179, 146, 179, 145, 195, + 129, 211, 114, 211, 113, 227, 98, 82, 115, 97, 83, 115, + 82, 83, 115, 81, 84, 87, 34, 69, 225, 81, 19, 209, + 81, 35, 194, 66, 35, 193, 81, 51, 178, 74, 145, 163, + 162, 163, 161, 179, 145, 167, 98, 0, 27, 64, 66, 25, + 0, 23, 114, 162, 177, 133, 162, 163, 146, 179, 146, 179, + 130, 195, 129, 211, 114, 211, 113, 227, 98, 37, 115, 97, + 34, 35, 99, 82, 18, 67, 83, 66, 34, 67, 55, 33, + 51, 51, 178, 66, 35, 193, 146, 194, 115, 209, 114, 225, + 113, 97, 130, 113, 97, 129, 121, 114, 113, 22, 129, 129, + 51, 0, 28, 96, 72, 26, 0, 24, 114, 149, 161, 145, + 51, 130, 130, 67, 113, 148, 35, 98, 163, 35, 97, 243, + 98, 196, 129, 240, 19, 81, 240, 51, 65, 211, 36, 33, + 98, 84, 36, 18, 83, 83, 52, 17, 84, 83, 36, 18, + 84, 117, 49, 81, 19, 225, 82, 19, 225, 81, 35, 209, + 81, 51, 209, 89, 161, 163, 193, 163, 177, 179, 162, 151, + 129, 0, 28, 64, 40, 13, 0, 23, 18, 164, 148, 148, + 162, 240, 147, 145, 49, 129, 49, 129, 49, 178, 177, 178, + 162, 163, 148, 34, 83, 66, 52, 81, 52, 81, 52, 81, + 52, 81, 68, 49, 117, 240, 240, 16, 63, 24, 240, 243, + 240, 114, 240, 115, 240, 115, 240, 129, 0, 5, 113, 240, + 130, 240, 99, 240, 99, 240, 100, 240, 69, 240, 69, 240, + 70, 240, 39, 240, 33, 36, 240, 33, 37, 242, 37, 241, + 53, 241, 69, 210, 69, 209, 85, 220, 178, 101, 177, 117, + 177, 133, 146, 133, 131, 134, 88, 43, 0, 27, 48, 64, + 24, 240, 240, 99, 240, 99, 240, 83, 240, 83, 240, 97, + 0, 5, 113, 240, 130, 240, 99, 240, 99, 240, 100, 240, + 69, 240, 69, 240, 70, 240, 39, 240, 33, 36, 240, 33, + 37, 242, 37, 241, 53, 241, 69, 210, 69, 209, 85, 220, + 178, 101, 177, 117, 177, 133, 146, 133, 131, 134, 88, 43, + 0, 27, 48, 66, 24, 240, 240, 65, 240, 115, 240, 100, + 240, 66, 19, 240, 18, 82, 240, 240, 209, 240, 130, 240, + 99, 240, 99, 240, 100, 240, 69, 240, 69, 240, 70, 240, + 39, 240, 33, 36, 240, 33, 37, 242, 37, 241, 53, 241, + 69, 210, 69, 209, 85, 220, 178, 101, 177, 117, 177, 133, + 146, 133, 131, 134, 88, 43, 0, 27, 48, 61, 24, 0, + 7, 3, 49, 240, 24, 241, 52, 0, 8, 65, 240, 115, + 240, 99, 240, 99, 240, 100, 240, 69, 240, 69, 240, 70, + 240, 39, 240, 33, 36, 240, 33, 37, 242, 37, 241, 53, + 241, 69, 210, 69, 209, 85, 220, 178, 101, 177, 117, 177, + 133, 146, 133, 131, 134, 88, 43, 0, 27, 48, 62, 24, + 0, 6, 98, 82, 228, 52, 212, 52, 226, 82, 0, 8, + 50, 240, 99, 240, 99, 240, 100, 240, 69, 240, 69, 240, + 70, 240, 33, 21, 240, 33, 21, 240, 33, 37, 241, 53, + 241, 68, 241, 69, 209, 85, 209, 100, 220, 177, 117, 177, + 132, 161, 149, 145, 149, 131, 134, 88, 43, 0, 27, 48, + 69, 24, 240, 240, 37, 240, 50, 50, 240, 33, 81, 240, + 33, 81, 240, 34, 50, 240, 53, 240, 240, 242, 240, 99, + 240, 99, 240, 100, 240, 69, 240, 69, 240, 70, 240, 33, + 21, 240, 33, 21, 240, 33, 37, 241, 53, 241, 53, 241, + 69, 209, 85, 209, 100, 220, 177, 117, 177, 132, 177, 133, + 146, 133, 131, 134, 88, 43, 0, 27, 48, 76, 31, 0, + 32, 63, 2, 240, 21, 85, 240, 21, 115, 246, 115, 241, + 20, 130, 226, 20, 130, 225, 36, 65, 50, 209, 52, 65, + 240, 49, 52, 50, 240, 33, 68, 35, 240, 33, 73, 240, + 17, 84, 35, 241, 100, 50, 241, 100, 65, 65, 156, 65, + 65, 145, 116, 130, 129, 132, 130, 129, 132, 130, 114, 132, + 115, 114, 132, 115, 84, 132, 100, 56, 63, 2, 0, 35, + 32, 58, 19, 0, 19, 87, 34, 99, 85, 99, 100, 83, + 131, 68, 131, 68, 146, 68, 146, 53, 146, 53, 161, 53, + 229, 229, 229, 229, 161, 53, 161, 68, 161, 68, 146, 68, + 145, 99, 145, 115, 113, 146, 98, 168, 225, 240, 49, 240, + 51, 240, 50, 240, 34, 193, 51, 212, 0, 5, 112, 62, + 21, 240, 179, 240, 51, 240, 67, 240, 66, 240, 82, 0, + 6, 95, 2, 116, 100, 116, 115, 116, 130, 116, 130, 116, + 145, 116, 81, 49, 116, 81, 180, 66, 180, 51, 186, 180, + 51, 180, 66, 180, 81, 50, 100, 81, 50, 100, 146, 100, + 146, 100, 131, 100, 131, 100, 116, 100, 101, 63, 3, 0, + 24, 63, 21, 240, 240, 35, 240, 36, 240, 35, 240, 35, + 240, 34, 0, 6, 95, 2, 116, 100, 116, 115, 116, 130, + 116, 130, 116, 145, 116, 81, 49, 116, 81, 180, 66, 180, + 51, 186, 180, 51, 180, 66, 180, 81, 50, 100, 81, 50, + 100, 146, 100, 146, 100, 131, 100, 131, 100, 116, 100, 101, + 63, 3, 0, 24, 63, 21, 240, 241, 240, 67, 240, 36, + 240, 19, 18, 226, 82, 0, 6, 31, 2, 116, 100, 116, + 115, 116, 130, 116, 130, 116, 145, 116, 81, 49, 116, 81, + 180, 66, 180, 51, 186, 180, 51, 180, 66, 180, 81, 50, + 100, 81, 50, 100, 146, 100, 146, 100, 131, 100, 131, 100, + 116, 100, 101, 63, 3, 0, 24, 62, 21, 0, 5, 114, + 82, 180, 52, 164, 52, 178, 82, 0, 6, 31, 2, 116, + 100, 116, 115, 116, 130, 116, 145, 116, 145, 116, 81, 49, + 116, 81, 180, 66, 180, 51, 186, 180, 51, 180, 66, 180, + 81, 49, 116, 81, 50, 100, 146, 100, 146, 100, 131, 100, + 131, 100, 116, 100, 101, 63, 3, 0, 24, 33, 13, 226, + 179, 178, 194, 194, 240, 240, 58, 100, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 106, 0, 15, 34, 13, 240, 82, 163, 162, + 162, 162, 240, 240, 58, 100, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 106, 0, 15, 35, 13, 240, 34, 178, 164, 130, 34, + 98, 66, 240, 250, 100, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 106, 0, 15, 36, 13, 240, 194, 66, 68, 36, 52, 36, + 66, 66, 240, 250, 100, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 106, 0, 15, 48, 23, 0, 23, 14, 196, 99, 164, 115, + 148, 116, 132, 131, 132, 132, 116, 132, 116, 133, 100, 133, + 100, 133, 58, 85, 100, 133, 100, 133, 100, 133, 100, 133, + 100, 132, 116, 132, 116, 131, 132, 116, 132, 115, 148, 99, + 126, 0, 27, 68, 24, 0, 7, 3, 49, 240, 24, 240, + 17, 51, 0, 10, 39, 89, 86, 101, 133, 115, 165, 113, + 182, 97, 182, 97, 183, 81, 177, 22, 65, 177, 37, 65, + 177, 38, 49, 177, 54, 33, 177, 69, 33, 177, 70, 17, + 177, 87, 177, 102, 177, 102, 177, 117, 177, 132, 177, 132, + 163, 131, 149, 130, 121, 98, 240, 129, 0, 24, 112, 59, + 21, 240, 163, 240, 67, 240, 51, 240, 82, 240, 82, 0, + 7, 54, 210, 98, 163, 99, 131, 131, 115, 131, 100, 132, + 84, 132, 69, 132, 69, 133, 53, 133, 53, 133, 53, 133, + 53, 133, 53, 133, 53, 132, 84, 132, 84, 132, 99, 131, + 115, 131, 131, 99, 162, 98, 214, 0, 24, 96, 60, 21, + 240, 240, 35, 240, 35, 240, 51, 240, 34, 240, 50, 0, + 7, 54, 210, 98, 163, 99, 131, 131, 115, 131, 100, 132, + 84, 132, 69, 132, 69, 133, 53, 133, 53, 133, 53, 133, + 53, 133, 53, 133, 53, 132, 84, 132, 84, 132, 99, 131, + 115, 131, 131, 99, 162, 98, 214, 0, 24, 96, 60, 21, + 240, 226, 240, 52, 240, 36, 240, 18, 34, 210, 98, 0, + 6, 118, 210, 98, 163, 99, 131, 131, 115, 131, 100, 132, + 84, 132, 69, 132, 69, 133, 53, 133, 53, 133, 53, 133, + 53, 133, 53, 133, 53, 132, 84, 132, 84, 132, 99, 131, + 115, 131, 131, 99, 162, 98, 214, 0, 24, 96, 56, 21, + 0, 6, 3, 65, 200, 193, 67, 0, 9, 102, 210, 98, + 163, 99, 131, 131, 115, 131, 100, 132, 84, 132, 69, 132, + 69, 133, 53, 133, 53, 133, 53, 133, 53, 133, 53, 133, + 53, 132, 84, 132, 84, 132, 99, 131, 115, 131, 131, 99, + 162, 98, 214, 0, 24, 96, 59, 21, 0, 5, 114, 66, + 196, 36, 180, 36, 194, 66, 0, 7, 6, 210, 98, 163, + 99, 131, 131, 115, 131, 100, 132, 84, 132, 69, 132, 69, + 133, 53, 133, 53, 133, 53, 133, 53, 133, 53, 133, 53, + 132, 84, 132, 84, 132, 99, 131, 115, 131, 131, 99, 162, + 98, 214, 0, 24, 96, 50, 23, 0, 34, 81, 240, 17, + 82, 227, 82, 195, 114, 163, 146, 131, 178, 99, 210, 67, + 227, 35, 240, 22, 240, 52, 240, 68, 240, 54, 240, 19, + 35, 227, 67, 195, 99, 163, 131, 131, 163, 99, 195, 67, + 227, 65, 240, 17, 0, 20, 80, 59, 21, 0, 21, 103, + 50, 114, 83, 33, 115, 100, 115, 116, 115, 116, 100, 117, + 84, 102, 69, 103, 53, 82, 21, 53, 66, 37, 53, 50, + 53, 53, 50, 53, 53, 34, 69, 53, 18, 85, 55, 100, + 86, 100, 85, 116, 100, 115, 116, 115, 116, 99, 113, 35, + 82, 114, 55, 0, 24, 96, 60, 24, 240, 243, 240, 115, + 240, 115, 240, 114, 240, 130, 0, 7, 74, 71, 100, 147, + 132, 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, 161, + 148, 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, 161, + 148, 161, 148, 161, 148, 161, 148, 161, 163, 145, 180, 129, + 195, 113, 248, 0, 28, 16, 61, 24, 240, 240, 115, 240, + 84, 240, 83, 240, 82, 240, 98, 0, 7, 74, 71, 100, + 147, 132, 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, + 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, + 161, 148, 161, 148, 161, 148, 161, 148, 161, 163, 145, 180, + 129, 195, 113, 248, 0, 28, 16, 62, 24, 240, 240, 66, + 240, 115, 240, 85, 240, 50, 35, 242, 98, 0, 7, 10, + 71, 100, 147, 132, 161, 148, 161, 148, 161, 148, 161, 148, + 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, + 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, 161, 163, + 145, 180, 129, 195, 113, 248, 0, 28, 16, 60, 24, 0, + 6, 114, 66, 244, 36, 228, 36, 242, 66, 0, 7, 26, + 71, 100, 147, 132, 161, 148, 161, 148, 161, 148, 161, 148, + 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, + 161, 148, 161, 148, 161, 148, 161, 148, 161, 148, 161, 163, + 145, 180, 129, 195, 113, 248, 0, 28, 16, 64, 23, 240, + 240, 83, 240, 83, 240, 67, 240, 67, 240, 81, 0, 7, + 41, 71, 86, 115, 133, 114, 149, 113, 181, 97, 181, 81, + 212, 81, 213, 49, 244, 49, 245, 18, 240, 20, 17, 240, + 36, 17, 240, 52, 240, 68, 240, 68, 240, 68, 240, 68, + 240, 68, 240, 68, 240, 68, 240, 68, 240, 26, 0, 26, + 112, 46, 21, 0, 21, 11, 212, 240, 36, 240, 36, 240, + 43, 164, 84, 132, 85, 116, 100, 116, 101, 100, 101, 100, + 101, 100, 101, 100, 100, 116, 85, 116, 84, 139, 164, 240, + 36, 240, 36, 240, 36, 240, 36, 235, 0, 24, 112, 51, + 17, 0, 17, 101, 163, 35, 131, 52, 115, 52, 100, 52, + 100, 52, 100, 51, 116, 50, 132, 18, 164, 50, 132, 51, + 116, 67, 100, 68, 84, 68, 84, 68, 84, 68, 84, 68, + 84, 17, 36, 87, 20, 86, 35, 102, 19, 86, 20, 0, + 19, 112, 45, 16, 0, 16, 18, 227, 227, 227, 226, 240, + 240, 245, 146, 52, 99, 67, 100, 52, 84, 52, 99, 52, + 166, 130, 36, 99, 52, 99, 52, 84, 52, 84, 52, 17, + 52, 52, 17, 68, 36, 17, 85, 20, 0, 18, 64, 45, + 16, 0, 16, 114, 212, 195, 195, 194, 225, 240, 245, 147, + 36, 99, 67, 100, 52, 84, 52, 84, 52, 181, 131, 20, + 100, 36, 99, 52, 84, 52, 84, 52, 17, 52, 52, 17, + 53, 36, 17, 85, 20, 0, 18, 64, 48, 16, 0, 16, + 67, 211, 197, 163, 18, 146, 66, 129, 113, 240, 165, 147, + 36, 99, 67, 100, 52, 84, 52, 84, 52, 181, 131, 20, + 100, 36, 99, 52, 84, 52, 84, 52, 17, 52, 52, 17, + 53, 36, 17, 85, 20, 0, 18, 64, 45, 16, 0, 18, + 36, 49, 121, 113, 52, 0, 7, 37, 147, 36, 99, 67, + 100, 52, 84, 52, 84, 52, 181, 131, 20, 100, 36, 99, + 52, 84, 52, 84, 52, 17, 52, 52, 17, 53, 36, 17, + 85, 20, 0, 18, 64, 48, 16, 0, 18, 18, 66, 116, + 36, 100, 36, 114, 66, 240, 240, 197, 147, 36, 99, 67, + 100, 52, 84, 52, 84, 52, 181, 131, 20, 100, 36, 99, + 52, 84, 52, 84, 52, 17, 52, 52, 17, 53, 36, 17, + 85, 20, 0, 18, 64, 49, 16, 0, 16, 68, 177, 50, + 161, 50, 161, 50, 162, 19, 180, 240, 197, 147, 36, 99, + 67, 100, 52, 84, 52, 84, 52, 181, 131, 20, 100, 36, + 99, 52, 84, 52, 84, 52, 17, 52, 52, 17, 53, 36, + 17, 85, 20, 0, 18, 64, 47, 21, 0, 39, 85, 68, + 114, 54, 19, 83, 68, 51, 68, 52, 51, 68, 52, 52, + 67, 52, 52, 134, 52, 98, 43, 67, 52, 179, 52, 164, + 52, 97, 52, 52, 97, 52, 53, 65, 84, 33, 19, 50, + 101, 68, 0, 24, 48, 37, 14, 0, 26, 101, 115, 50, + 99, 66, 67, 67, 52, 52, 52, 52, 52, 66, 68, 164, + 164, 164, 179, 97, 83, 81, 99, 49, 133, 161, 210, 226, + 194, 129, 50, 148, 0, 6, 39, 14, 0, 14, 34, 194, + 195, 195, 209, 240, 240, 164, 131, 19, 99, 51, 83, 51, + 68, 52, 52, 52, 52, 52, 59, 52, 164, 164, 97, 67, + 97, 68, 65, 99, 50, 132, 0, 16, 64, 39, 14, 0, + 14, 114, 194, 179, 163, 178, 240, 240, 148, 131, 19, 99, + 51, 83, 51, 68, 52, 52, 52, 52, 52, 59, 52, 164, + 164, 97, 67, 97, 68, 65, 99, 50, 132, 0, 16, 64, + 41, 14, 0, 14, 81, 195, 179, 162, 18, 130, 50, 225, + 240, 116, 131, 19, 99, 51, 83, 51, 68, 52, 52, 52, + 52, 52, 59, 52, 164, 164, 97, 67, 97, 68, 65, 99, + 50, 132, 0, 16, 64, 41, 14, 0, 16, 2, 66, 84, + 36, 68, 36, 82, 66, 240, 240, 100, 131, 19, 99, 51, + 83, 51, 68, 52, 52, 52, 52, 52, 59, 52, 164, 164, + 179, 97, 68, 65, 100, 49, 133, 0, 16, 48, 28, 11, + 0, 11, 2, 147, 132, 146, 162, 240, 214, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 88, 0, + 12, 96, 28, 11, 0, 11, 98, 131, 115, 115, 130, 240, + 214, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, + 116, 116, 87, 0, 12, 112, 30, 12, 0, 12, 51, 148, + 117, 114, 34, 66, 82, 240, 214, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 132, 132, 132, 104, 0, 13, 112, + 30, 12, 0, 13, 82, 50, 68, 20, 52, 20, 66, 50, + 240, 229, 132, 132, 132, 132, 132, 132, 132, 132, 132, 132, + 132, 132, 132, 119, 0, 14, 45, 15, 0, 15, 36, 49, + 134, 164, 180, 161, 20, 129, 52, 195, 151, 99, 36, 84, + 36, 83, 68, 52, 68, 52, 68, 52, 68, 52, 68, 52, + 68, 52, 68, 52, 68, 67, 67, 83, 52, 99, 35, 148, + 0, 17, 96, 45, 19, 0, 22, 3, 49, 184, 161, 52, + 0, 8, 22, 36, 148, 17, 35, 133, 52, 117, 52, 116, + 68, 116, 68, 116, 68, 116, 68, 116, 68, 116, 68, 116, + 68, 116, 68, 116, 68, 116, 68, 87, 39, 0, 21, 96, + 42, 15, 0, 15, 34, 211, 211, 210, 226, 225, 240, 196, + 147, 35, 114, 66, 99, 67, 68, 67, 68, 68, 52, 68, + 52, 68, 52, 68, 52, 68, 67, 67, 83, 67, 98, 66, + 115, 35, 148, 0, 17, 96, 42, 15, 0, 16, 2, 195, + 179, 194, 194, 209, 240, 212, 147, 35, 114, 66, 99, 67, + 68, 67, 68, 68, 52, 68, 52, 68, 52, 68, 52, 68, + 67, 67, 83, 67, 98, 66, 115, 35, 148, 0, 17, 96, + 45, 15, 0, 15, 82, 210, 196, 162, 34, 130, 66, 113, + 97, 240, 148, 147, 35, 114, 66, 99, 67, 68, 67, 68, + 68, 52, 68, 52, 68, 52, 68, 52, 68, 67, 67, 83, + 67, 98, 66, 115, 35, 148, 0, 17, 96, 42, 15, 0, + 17, 35, 49, 120, 113, 51, 0, 6, 116, 147, 35, 114, + 66, 99, 67, 68, 67, 68, 68, 52, 68, 52, 68, 52, + 68, 52, 68, 67, 67, 83, 67, 98, 66, 115, 35, 148, + 0, 17, 96, 45, 15, 0, 17, 18, 66, 100, 36, 84, + 36, 98, 66, 240, 240, 148, 147, 35, 114, 66, 99, 67, + 68, 67, 68, 68, 52, 68, 52, 68, 52, 68, 52, 68, + 67, 67, 83, 67, 98, 66, 115, 35, 148, 0, 17, 96, + 33, 29, 0, 41, 50, 240, 180, 240, 164, 240, 164, 240, + 178, 0, 20, 15, 11, 63, 11, 0, 16, 50, 240, 180, + 240, 164, 240, 164, 240, 178, 0, 27, 32, 41, 15, 0, + 28, 84, 49, 83, 34, 17, 83, 67, 83, 67, 68, 67, + 68, 53, 52, 33, 20, 52, 17, 36, 53, 52, 53, 52, + 67, 68, 67, 67, 83, 67, 81, 17, 51, 81, 52, 0, + 17, 96, 49, 19, 0, 19, 51, 240, 19, 240, 35, 240, + 35, 240, 49, 0, 6, 22, 38, 116, 68, 116, 68, 116, + 68, 116, 68, 116, 68, 116, 68, 116, 68, 116, 68, 116, + 68, 116, 68, 116, 53, 116, 53, 131, 33, 20, 148, 38, + 0, 21, 96, 47, 19, 0, 20, 18, 240, 35, 243, 243, + 240, 17, 0, 6, 22, 38, 116, 68, 116, 68, 116, 68, + 116, 68, 116, 68, 116, 68, 116, 68, 116, 68, 116, 68, + 116, 68, 116, 53, 116, 53, 131, 33, 20, 148, 38, 0, + 21, 96, 48, 19, 0, 19, 99, 240, 19, 245, 211, 18, + 194, 82, 240, 240, 246, 38, 116, 68, 116, 68, 116, 68, + 116, 68, 116, 68, 116, 68, 116, 68, 116, 68, 116, 68, + 116, 68, 116, 53, 116, 53, 131, 33, 20, 148, 38, 0, + 21, 96, 48, 19, 0, 21, 98, 66, 164, 36, 148, 36, + 162, 66, 0, 5, 102, 38, 116, 68, 116, 68, 116, 68, + 116, 68, 116, 68, 116, 68, 116, 68, 116, 68, 116, 68, + 116, 68, 116, 53, 116, 53, 131, 33, 20, 148, 38, 0, + 21, 96, 51, 17, 0, 18, 18, 227, 227, 210, 226, 240, + 240, 215, 37, 69, 81, 116, 81, 116, 65, 147, 65, 148, + 49, 163, 49, 164, 17, 180, 17, 197, 196, 227, 227, 227, + 241, 240, 17, 240, 17, 179, 17, 180, 17, 179, 33, 179, + 17, 211, 0, 5, 96, 51, 17, 0, 17, 66, 212, 182, + 177, 20, 212, 212, 212, 212, 36, 116, 17, 35, 101, 52, + 85, 52, 84, 68, 84, 68, 84, 67, 100, 67, 100, 51, + 116, 51, 116, 50, 132, 34, 148, 18, 165, 196, 212, 212, + 212, 212, 211, 210, 225, 0, 6, 32, 54, 17, 0, 19, + 66, 66, 132, 36, 116, 36, 130, 66, 240, 240, 167, 37, + 68, 97, 115, 97, 116, 65, 132, 65, 148, 49, 148, 33, + 179, 33, 180, 17, 180, 17, 196, 212, 227, 226, 242, 240, + 17, 242, 179, 17, 180, 17, 179, 33, 179, 17, 211, 0, + 5, 96, +}; + +//***************************************************************************** +// +// The glyph offset table for the 30 point Oldstandard bold font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard30b[] = +{ + 0, 5, 34, 57, 108, 189, 261, 319, + 334, 369, 404, 437, 493, 511, 520, 532, + 568, 616, 644, 687, 729, 767, 808, 855, + 895, 941, 987, 1006, 1031, 1087, 1104, 1160, + 1198, 1277, 1330, 1378, 1424, 1472, 1524, 1574, + 1627, 1678, 1706, 1742, 1792, 1842, 1919, 1978, + 2027, 2074, 2140, 2193, 2242, 2299, 2349, 2404, + 2487, 2538, 2591, 2635, 2670, 2706, 2741, 2766, + 2777, 2790, 2828, 2874, 2905, 2950, 2982, 3015, + 3061, 3106, 3134, 3173, 3215, 3244, 3297, 3335, + 3370, 3414, 3461, 3486, 3521, 3555, 3593, 3626, + 3677, 3709, 3753, 3786, 3822, 3856, 3892, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3913, 3918, 3946, 3998, 4048, 4083, 4121, 4151, + 4207, 4222, 4299, 4327, 4357, 4380, 4389, 4469, + 4478, 4499, 4548, 4578, 4607, 4620, 4671, 4731, + 4743, 4756, 4776, 4802, 4832, 4894, 4960, 5032, + 5072, 5135, 5199, 5265, 5326, 5388, 5457, 5533, + 5591, 5653, 5716, 5779, 5841, 5874, 5908, 5943, + 5979, 6027, 6095, 6154, 6214, 6274, 6330, 6389, + 6439, 6498, 6558, 6619, 6681, 6741, 6805, 6851, + 6902, 6947, 6992, 7040, 7085, 7133, 7182, 7229, + 7266, 7305, 7344, 7385, 7426, 7454, 7482, 7512, + 7542, 7587, 7632, 7674, 7716, 7761, 7803, 7848, + 7881, 7922, 7971, 8018, 8066, 8114, 8165, 8216, +}; + +//***************************************************************************** +// +// The font definition for the 30 point Oldstandard bold font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard30b = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 29, + + // + // The height of the font. + // + 39, + + // + // The baseline of the font. + // + 30, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard30b, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard30bData +}; diff --git a/third_party/fonts/ofl/fonts/fontoldstandard30i.c b/third_party/fonts/ofl/fonts/fontoldstandard30i.c new file mode 100644 index 0000000..fe2e9a5 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontoldstandard30i.c @@ -0,0 +1,940 @@ +//***************************************************************************** +// +// fontoldstandard30i.c - Font definition for the 30pt Oldstandard italic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: oldstandard +// Size: 30 point +// Bold: no +// Italic: yes +// Memory usage: 8864 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 30 point Oldstandard italic font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Oldstandard30iData[8664] = +{ + 5, 13, 0, 61, 96, 29, 11, 0, 10, 34, 132, 116, + 116, 115, 131, 115, 131, 131, 130, 146, 145, 161, 146, 145, + 161, 161, 240, 67, 131, 131, 131, 0, 13, 48, 18, 11, + 0, 9, 98, 50, 66, 34, 81, 50, 66, 50, 65, 65, + 81, 65, 0, 35, 49, 21, 0, 22, 18, 65, 225, 66, + 210, 65, 225, 81, 225, 66, 209, 81, 159, 1, 146, 65, + 225, 81, 210, 66, 209, 81, 225, 66, 210, 65, 225, 81, + 175, 1, 129, 81, 225, 66, 209, 81, 225, 66, 210, 65, + 225, 81, 0, 25, 32, 88, 20, 0, 16, 33, 33, 240, + 20, 226, 35, 178, 17, 33, 33, 145, 49, 17, 49, 130, + 49, 17, 50, 114, 33, 33, 50, 114, 33, 33, 20, 114, + 33, 17, 35, 130, 33, 17, 35, 132, 33, 230, 240, 21, + 225, 36, 209, 33, 19, 130, 33, 33, 34, 116, 17, 17, + 50, 115, 17, 33, 50, 98, 49, 33, 50, 113, 49, 17, + 66, 113, 49, 17, 50, 145, 17, 33, 34, 183, 225, 17, + 240, 33, 17, 240, 17, 33, 0, 16, 80, 71, 23, 0, + 19, 65, 131, 177, 99, 33, 145, 99, 49, 114, 114, 81, + 68, 98, 101, 33, 114, 81, 97, 130, 81, 81, 146, 81, + 65, 162, 65, 66, 163, 33, 81, 196, 81, 240, 97, 83, + 209, 82, 33, 178, 66, 65, 161, 66, 81, 145, 82, 81, + 129, 82, 97, 114, 82, 81, 114, 98, 81, 113, 114, 65, + 113, 130, 65, 97, 165, 0, 26, 80, 72, 24, 0, 22, + 83, 240, 81, 49, 240, 49, 65, 240, 34, 65, 240, 33, + 81, 240, 18, 65, 240, 34, 50, 240, 34, 18, 240, 67, + 83, 165, 82, 18, 115, 34, 81, 19, 98, 66, 65, 49, + 98, 82, 49, 163, 82, 33, 178, 98, 17, 179, 98, 17, + 179, 99, 195, 98, 97, 99, 98, 81, 115, 83, 65, 131, + 65, 18, 50, 150, 53, 0, 28, 16, 13, 6, 240, 240, + 210, 66, 65, 66, 65, 81, 0, 19, 48, 35, 13, 0, + 12, 65, 177, 177, 177, 177, 178, 177, 177, 178, 177, 178, + 177, 193, 178, 177, 193, 193, 193, 193, 193, 193, 193, 193, + 193, 209, 193, 194, 193, 0, 6, 16, 35, 14, 0, 13, + 18, 209, 225, 209, 210, 209, 209, 209, 209, 209, 209, 209, + 209, 194, 193, 209, 194, 193, 194, 193, 194, 193, 193, 194, + 178, 178, 178, 178, 0, 6, 96, 30, 14, 0, 12, 98, + 194, 130, 49, 50, 51, 33, 35, 82, 17, 18, 147, 146, + 19, 99, 33, 35, 50, 49, 50, 114, 194, 194, 0, 34, + 32, 57, 28, 0, 29, 65, 240, 193, 240, 193, 240, 193, + 240, 193, 240, 193, 240, 193, 240, 193, 240, 193, 240, 193, + 240, 193, 240, 193, 240, 193, 255, 10, 241, 240, 193, 240, + 193, 240, 193, 240, 193, 240, 193, 240, 193, 240, 193, 240, + 193, 240, 193, 240, 193, 240, 193, 0, 15, 112, 16, 8, + 0, 25, 19, 83, 84, 98, 97, 113, 97, 97, 97, 240, + 240, 144, 9, 11, 0, 28, 49, 56, 0, 22, 48, 11, + 6, 0, 18, 99, 51, 51, 51, 0, 7, 16, 36, 13, + 0, 10, 113, 193, 178, 177, 193, 178, 177, 193, 178, 177, + 193, 193, 177, 193, 193, 177, 193, 193, 178, 177, 193, 178, + 177, 193, 178, 177, 193, 193, 177, 0, 6, 48, 49, 18, + 0, 16, 100, 194, 50, 162, 82, 130, 98, 115, 98, 99, + 115, 83, 115, 68, 115, 67, 131, 67, 131, 67, 116, 52, + 115, 67, 131, 67, 131, 67, 116, 67, 115, 83, 115, 83, + 99, 114, 99, 114, 83, 130, 67, 166, 0, 21, 64, 29, + 14, 0, 15, 33, 194, 179, 164, 115, 18, 179, 179, 179, + 178, 179, 179, 179, 163, 179, 179, 178, 179, 179, 179, 178, + 138, 0, 16, 32, 44, 19, 0, 17, 85, 194, 66, 161, + 99, 129, 131, 113, 131, 113, 131, 116, 83, 116, 68, 130, + 83, 244, 228, 228, 212, 227, 227, 242, 240, 18, 240, 18, + 145, 101, 113, 97, 56, 113, 71, 114, 69, 0, 22, 48, + 46, 18, 0, 16, 85, 178, 66, 146, 98, 129, 114, 129, + 115, 115, 83, 115, 83, 227, 243, 226, 166, 194, 50, 240, + 34, 240, 18, 240, 19, 99, 99, 84, 84, 84, 83, 97, + 131, 97, 115, 114, 83, 152, 209, 0, 19, 80, 37, 18, + 0, 17, 34, 243, 242, 243, 242, 242, 242, 17, 225, 33, + 209, 34, 193, 34, 193, 35, 177, 51, 161, 67, 145, 67, + 145, 83, 143, 163, 227, 243, 243, 227, 202, 0, 21, 45, + 18, 0, 18, 97, 113, 147, 65, 167, 161, 36, 177, 240, + 33, 240, 33, 240, 17, 20, 194, 51, 146, 83, 129, 99, + 114, 99, 243, 243, 243, 99, 99, 84, 83, 100, 83, 97, + 115, 114, 83, 152, 209, 0, 19, 80, 46, 16, 0, 15, + 4, 162, 65, 130, 81, 114, 82, 98, 83, 83, 83, 82, + 211, 211, 210, 52, 99, 18, 50, 84, 83, 68, 98, 67, + 114, 67, 114, 67, 99, 66, 115, 66, 115, 66, 114, 82, + 98, 114, 66, 150, 0, 19, 38, 17, 0, 15, 17, 35, + 65, 97, 21, 50, 88, 49, 81, 68, 17, 81, 101, 81, + 145, 241, 241, 241, 242, 226, 241, 241, 242, 226, 227, 227, + 211, 227, 212, 212, 227, 0, 20, 96, 48, 18, 0, 16, + 85, 194, 66, 146, 98, 114, 114, 114, 129, 114, 129, 114, + 129, 114, 114, 115, 97, 132, 65, 164, 18, 152, 146, 52, + 130, 84, 113, 115, 98, 131, 81, 147, 81, 146, 98, 130, + 113, 130, 114, 98, 152, 0, 21, 32, 48, 16, 0, 14, + 101, 147, 50, 115, 66, 99, 98, 82, 114, 67, 114, 67, + 114, 67, 99, 66, 115, 66, 115, 66, 100, 67, 84, 82, + 50, 19, 101, 34, 211, 210, 97, 114, 83, 82, 99, 67, + 98, 82, 113, 82, 150, 0, 19, 16, 17, 9, 0, 17, + 35, 99, 99, 99, 0, 7, 19, 99, 99, 99, 0, 10, + 112, 22, 10, 0, 19, 35, 115, 115, 115, 0, 8, 3, + 115, 116, 130, 129, 145, 129, 129, 129, 0, 6, 16, 55, + 25, 0, 27, 81, 240, 115, 240, 98, 240, 98, 240, 99, + 240, 83, 240, 83, 240, 98, 240, 98, 240, 99, 240, 83, + 240, 83, 240, 98, 240, 130, 240, 162, 240, 147, 240, 147, + 240, 147, 240, 147, 240, 146, 240, 162, 240, 147, 240, 147, + 240, 147, 240, 146, 0, 16, 13, 28, 0, 59, 79, 10, + 0, 17, 127, 10, 0, 49, 48, 58, 26, 0, 26, 1, + 240, 163, 240, 163, 240, 162, 240, 178, 240, 163, 240, 163, + 240, 163, 240, 162, 240, 178, 240, 163, 240, 163, 240, 163, + 240, 130, 240, 115, 240, 99, 240, 99, 240, 99, 240, 114, + 240, 114, 240, 115, 240, 99, 240, 99, 240, 114, 240, 114, + 240, 145, 0, 16, 16, 38, 15, 0, 13, 100, 146, 51, + 97, 98, 82, 99, 66, 114, 67, 83, 81, 98, 195, 179, + 164, 148, 163, 193, 210, 49, 145, 65, 146, 33, 180, 240, + 162, 196, 180, 194, 0, 18, 48, 78, 24, 0, 21, 106, + 210, 130, 162, 194, 129, 225, 113, 115, 97, 82, 82, 51, + 49, 81, 82, 67, 65, 50, 66, 83, 65, 50, 66, 83, + 65, 49, 67, 82, 81, 49, 66, 98, 81, 49, 66, 98, + 81, 49, 66, 83, 81, 49, 66, 82, 82, 50, 50, 67, + 81, 81, 50, 67, 66, 81, 50, 49, 18, 50, 98, 52, + 52, 146, 240, 130, 240, 130, 146, 217, 240, 65, 0, 25, + 80, 55, 24, 0, 23, 17, 240, 114, 240, 99, 240, 99, + 240, 84, 240, 69, 240, 65, 19, 240, 49, 35, 240, 34, + 35, 240, 33, 51, 240, 17, 67, 240, 17, 67, 241, 83, + 234, 225, 99, 209, 115, 193, 131, 193, 131, 177, 147, 162, + 147, 147, 147, 105, 57, 0, 27, 48, 48, 24, 0, 21, + 93, 227, 99, 195, 115, 178, 131, 163, 131, 163, 131, 163, + 131, 162, 146, 163, 131, 163, 99, 201, 227, 99, 195, 115, + 179, 131, 163, 131, 147, 147, 147, 147, 147, 147, 146, 147, + 147, 146, 163, 115, 142, 0, 28, 32, 50, 21, 0, 19, + 54, 49, 146, 97, 33, 130, 115, 130, 146, 115, 146, 99, + 162, 99, 162, 83, 177, 99, 177, 98, 240, 51, 240, 51, + 240, 51, 240, 51, 240, 51, 177, 99, 177, 99, 162, 99, + 161, 130, 146, 130, 130, 162, 98, 199, 0, 25, 49, 25, + 0, 22, 77, 243, 98, 227, 114, 210, 131, 179, 146, 179, + 147, 163, 147, 162, 163, 147, 163, 147, 163, 147, 163, 131, + 163, 147, 163, 147, 163, 146, 178, 147, 163, 147, 162, 163, + 146, 178, 147, 163, 131, 179, 114, 173, 0, 29, 80, 55, + 25, 0, 22, 79, 2, 179, 131, 179, 131, 178, 161, 179, + 161, 179, 161, 179, 81, 65, 178, 97, 243, 82, 243, 81, + 240, 25, 243, 82, 243, 81, 240, 19, 81, 240, 18, 97, + 243, 97, 65, 163, 177, 163, 162, 162, 177, 163, 162, 163, + 132, 127, 2, 0, 29, 16, 52, 25, 0, 22, 79, 2, + 179, 131, 179, 131, 178, 161, 179, 161, 179, 161, 179, 81, + 65, 178, 97, 243, 82, 243, 81, 240, 25, 243, 82, 243, + 81, 240, 19, 81, 240, 18, 97, 243, 97, 243, 240, 115, + 240, 114, 240, 115, 240, 115, 240, 74, 0, 30, 54, 22, + 0, 20, 38, 65, 146, 98, 17, 146, 131, 130, 162, 115, + 162, 99, 178, 99, 177, 99, 193, 99, 193, 83, 240, 67, + 240, 67, 240, 67, 106, 51, 163, 99, 163, 99, 162, 115, + 147, 115, 147, 130, 132, 130, 114, 17, 162, 82, 33, 183, + 49, 0, 25, 96, 50, 29, 0, 26, 9, 57, 179, 147, + 227, 147, 226, 162, 227, 147, 227, 147, 227, 147, 226, 162, + 227, 147, 227, 147, 239, 211, 147, 227, 147, 227, 147, 226, + 162, 227, 147, 227, 147, 227, 147, 226, 162, 227, 147, 227, + 147, 185, 57, 0, 33, 80, 29, 17, 0, 15, 73, 179, + 227, 226, 227, 227, 227, 226, 227, 227, 227, 211, 227, 227, + 226, 227, 227, 227, 226, 227, 227, 185, 0, 20, 16, 51, + 22, 0, 20, 58, 240, 19, 240, 66, 240, 67, 240, 67, + 240, 67, 240, 66, 240, 67, 240, 67, 240, 67, 240, 66, + 240, 67, 240, 67, 240, 67, 240, 66, 194, 83, 180, 67, + 165, 66, 180, 67, 193, 98, 210, 66, 246, 240, 49, 0, + 24, 16, 64, 28, 0, 25, 25, 56, 179, 132, 211, 130, + 242, 130, 243, 114, 240, 19, 82, 240, 51, 66, 240, 66, + 66, 240, 67, 49, 240, 99, 20, 240, 88, 240, 68, 50, + 240, 67, 67, 240, 51, 67, 240, 51, 82, 240, 35, 99, + 240, 19, 99, 240, 19, 114, 240, 18, 131, 227, 131, 227, + 132, 169, 56, 0, 32, 64, 51, 23, 0, 20, 105, 240, + 35, 240, 83, 240, 82, 240, 83, 240, 83, 240, 83, 240, + 82, 240, 83, 240, 83, 240, 83, 240, 67, 240, 83, 240, + 83, 240, 82, 193, 115, 177, 131, 177, 131, 162, 130, 177, + 131, 162, 131, 132, 95, 2, 0, 26, 80, 85, 32, 0, + 28, 88, 151, 181, 129, 19, 225, 19, 129, 18, 241, 19, + 113, 19, 241, 19, 113, 19, 226, 19, 97, 35, 225, 35, + 97, 34, 241, 35, 81, 35, 241, 35, 81, 35, 226, 35, + 65, 51, 225, 51, 49, 66, 241, 51, 49, 51, 241, 51, + 33, 67, 226, 51, 33, 67, 225, 67, 17, 82, 241, 67, + 17, 67, 241, 68, 83, 225, 84, 83, 225, 83, 83, 241, + 83, 83, 226, 82, 99, 184, 33, 73, 0, 37, 66, 29, + 0, 26, 6, 120, 179, 163, 212, 146, 228, 145, 241, 18, + 145, 226, 19, 114, 225, 35, 113, 241, 51, 97, 241, 51, + 97, 226, 51, 82, 225, 83, 65, 241, 83, 65, 241, 98, + 65, 226, 99, 34, 225, 115, 33, 241, 130, 33, 241, 131, + 17, 225, 149, 225, 163, 241, 163, 226, 163, 184, 129, 240, + 209, 0, 30, 64, 51, 21, 0, 19, 39, 210, 82, 178, + 114, 146, 131, 114, 162, 99, 162, 98, 179, 67, 179, 67, + 179, 51, 179, 67, 179, 67, 179, 67, 179, 67, 179, 67, + 163, 83, 163, 83, 147, 99, 146, 130, 131, 130, 115, 162, + 83, 199, 240, 33, 0, 22, 96, 48, 24, 0, 21, 93, + 227, 98, 211, 99, 194, 131, 163, 131, 163, 131, 163, 130, + 178, 131, 163, 131, 163, 115, 179, 83, 202, 227, 240, 99, + 240, 99, 240, 83, 240, 99, 240, 99, 240, 98, 240, 99, + 240, 99, 240, 58, 0, 28, 96, 66, 21, 0, 19, 39, + 210, 82, 178, 114, 146, 131, 114, 162, 99, 162, 98, 179, + 67, 179, 67, 179, 51, 179, 67, 179, 67, 179, 67, 179, + 67, 179, 67, 163, 83, 163, 83, 35, 82, 99, 17, 34, + 50, 130, 17, 49, 35, 130, 17, 49, 19, 163, 37, 199, + 240, 50, 65, 226, 65, 226, 65, 227, 33, 245, 0, 11, + 80, 53, 24, 0, 21, 92, 243, 83, 211, 99, 194, 115, + 179, 115, 179, 115, 179, 115, 178, 130, 179, 115, 179, 98, + 217, 227, 97, 227, 113, 211, 114, 194, 130, 179, 115, 179, + 115, 179, 115, 49, 114, 131, 33, 115, 130, 49, 115, 131, + 17, 89, 99, 0, 27, 96, 52, 21, 0, 19, 39, 49, + 145, 98, 18, 130, 115, 145, 131, 130, 146, 130, 146, 130, + 145, 147, 129, 164, 240, 38, 240, 22, 240, 38, 240, 22, + 129, 132, 129, 148, 113, 163, 98, 178, 98, 178, 99, 161, + 116, 130, 98, 19, 98, 113, 72, 0, 24, 80, 55, 22, + 0, 19, 95, 1, 84, 51, 67, 82, 83, 67, 82, 83, + 82, 81, 98, 97, 81, 99, 97, 81, 99, 97, 194, 113, + 179, 240, 67, 240, 67, 240, 66, 240, 67, 240, 67, 240, + 67, 240, 66, 240, 67, 240, 67, 240, 67, 240, 66, 240, + 67, 251, 0, 26, 16, 51, 25, 0, 22, 9, 72, 114, + 178, 147, 178, 147, 177, 163, 177, 162, 178, 147, 177, 163, + 177, 163, 177, 162, 178, 147, 177, 163, 177, 162, 193, 147, + 177, 163, 177, 163, 177, 162, 178, 162, 177, 179, 146, 194, + 145, 211, 113, 240, 24, 0, 29, 112, 59, 25, 0, 21, + 121, 73, 99, 147, 163, 146, 179, 145, 195, 130, 195, 129, + 211, 114, 211, 113, 227, 97, 243, 82, 243, 81, 240, 19, + 65, 240, 35, 50, 240, 35, 49, 240, 51, 33, 240, 67, + 18, 240, 67, 17, 240, 84, 240, 100, 240, 99, 240, 114, + 240, 130, 240, 129, 0, 27, 80, 89, 34, 0, 29, 105, + 41, 41, 99, 131, 131, 147, 131, 130, 163, 131, 130, 163, + 131, 129, 179, 116, 113, 195, 116, 98, 195, 97, 19, 97, + 211, 82, 19, 82, 211, 81, 35, 81, 227, 65, 51, 65, + 243, 65, 51, 50, 243, 49, 67, 49, 240, 19, 34, 67, + 34, 240, 19, 33, 83, 18, 240, 35, 17, 99, 17, 240, + 51, 17, 101, 240, 52, 116, 240, 68, 115, 240, 83, 131, + 240, 82, 146, 240, 98, 146, 240, 97, 161, 0, 36, 48, + 63, 29, 0, 26, 9, 57, 180, 116, 243, 130, 240, 19, + 114, 240, 50, 113, 240, 67, 81, 240, 83, 65, 240, 115, + 33, 240, 131, 18, 240, 148, 240, 163, 240, 180, 240, 149, + 240, 145, 19, 240, 129, 51, 240, 97, 67, 240, 81, 99, + 240, 50, 99, 240, 34, 131, 243, 131, 228, 132, 154, 58, + 0, 33, 48, 54, 25, 0, 22, 9, 57, 115, 132, 163, + 130, 195, 129, 226, 114, 227, 82, 243, 81, 240, 19, 65, + 240, 50, 49, 240, 66, 33, 240, 84, 240, 100, 240, 99, + 240, 115, 240, 115, 240, 114, 240, 115, 240, 115, 240, 115, + 240, 114, 240, 115, 240, 59, 0, 29, 112, 51, 22, 0, + 19, 126, 116, 116, 114, 132, 129, 147, 130, 131, 145, 132, + 240, 36, 240, 51, 240, 51, 240, 51, 240, 52, 240, 51, + 240, 51, 240, 51, 240, 52, 129, 147, 145, 131, 146, 115, + 161, 116, 146, 100, 147, 99, 147, 111, 1, 0, 25, 64, + 35, 16, 0, 14, 118, 162, 211, 210, 226, 226, 211, 210, + 226, 226, 210, 226, 226, 226, 210, 226, 226, 226, 210, 226, + 226, 211, 210, 226, 226, 210, 226, 230, 0, 7, 32, 36, + 13, 0, 9, 97, 194, 193, 193, 194, 193, 193, 194, 193, + 193, 193, 209, 193, 193, 209, 193, 193, 194, 193, 193, 194, + 193, 193, 194, 193, 193, 194, 193, 193, 240, 240, 192, 35, + 17, 0, 15, 118, 227, 226, 242, 242, 227, 226, 242, 242, + 227, 226, 242, 242, 226, 242, 242, 242, 226, 242, 242, 227, + 226, 242, 242, 227, 226, 242, 167, 0, 7, 80, 27, 16, + 0, 16, 97, 227, 209, 17, 194, 18, 177, 49, 161, 66, + 130, 82, 113, 113, 98, 114, 81, 145, 65, 177, 0, 38, + 48, 9, 19, 0, 78, 63, 1, 0, 9, 112, 12, 7, + 0, 7, 17, 83, 82, 97, 113, 0, 22, 32, 41, 17, + 0, 32, 68, 34, 130, 51, 130, 67, 114, 83, 114, 83, + 99, 82, 114, 98, 114, 83, 99, 83, 99, 82, 49, 50, + 83, 33, 66, 65, 18, 33, 82, 33, 34, 17, 115, 66, + 0, 19, 112, 43, 14, 0, 12, 53, 194, 194, 194, 178, + 194, 194, 194, 178, 36, 98, 17, 50, 83, 66, 67, 82, + 67, 82, 66, 98, 66, 98, 51, 83, 50, 98, 66, 98, + 66, 82, 82, 67, 98, 35, 132, 0, 16, 96, 29, 13, + 0, 25, 3, 130, 49, 98, 66, 67, 51, 66, 66, 67, + 162, 178, 178, 178, 97, 66, 81, 82, 81, 97, 65, 132, + 0, 15, 64, 55, 18, 0, 17, 5, 240, 18, 242, 240, + 18, 240, 18, 240, 18, 242, 240, 18, 164, 34, 146, 49, + 17, 146, 67, 130, 83, 130, 83, 115, 82, 130, 98, 130, + 83, 115, 83, 115, 82, 49, 66, 83, 33, 82, 65, 18, + 33, 98, 33, 34, 17, 131, 66, 0, 21, 16, 30, 12, + 0, 23, 19, 114, 49, 82, 65, 66, 81, 66, 66, 51, + 50, 70, 98, 162, 162, 97, 50, 81, 66, 81, 81, 65, + 116, 0, 14, 32, 52, 18, 0, 17, 4, 210, 34, 178, + 50, 162, 50, 178, 242, 240, 18, 243, 201, 194, 240, 18, + 243, 242, 240, 18, 240, 18, 242, 240, 18, 240, 18, 240, + 18, 242, 240, 18, 240, 18, 243, 242, 240, 18, 240, 18, + 242, 240, 18, 240, 18, 0, 6, 64, 48, 17, 0, 32, + 84, 34, 130, 51, 130, 67, 114, 83, 114, 83, 99, 82, + 114, 98, 114, 83, 99, 83, 99, 82, 114, 83, 114, 65, + 18, 130, 33, 18, 163, 34, 242, 226, 130, 82, 130, 81, + 146, 66, 146, 50, 180, 0, 5, 96, 52, 17, 0, 15, + 21, 242, 242, 242, 226, 242, 242, 242, 226, 51, 146, 33, + 34, 130, 17, 50, 129, 17, 66, 114, 17, 51, 115, 66, + 131, 66, 115, 67, 115, 66, 49, 66, 67, 33, 82, 66, + 49, 66, 82, 33, 82, 82, 33, 82, 99, 0, 19, 112, + 35, 12, 0, 11, 34, 148, 146, 0, 8, 51, 129, 33, + 113, 49, 113, 49, 97, 50, 97, 50, 147, 146, 147, 146, + 49, 98, 33, 114, 33, 114, 17, 146, 0, 14, 48, 41, + 16, 0, 15, 50, 211, 226, 0, 11, 51, 193, 18, 177, + 34, 161, 50, 161, 50, 226, 211, 210, 226, 226, 210, 226, + 226, 211, 210, 226, 146, 50, 131, 34, 146, 50, 146, 34, + 179, 240, 240, 224, 50, 16, 0, 14, 37, 226, 226, 226, + 210, 226, 226, 226, 210, 67, 114, 49, 34, 98, 49, 19, + 97, 65, 18, 98, 49, 162, 49, 165, 163, 49, 146, 66, + 49, 66, 66, 33, 82, 50, 49, 66, 66, 33, 82, 66, + 33, 82, 83, 0, 18, 96, 34, 9, 0, 8, 5, 114, + 114, 114, 98, 114, 114, 114, 98, 114, 114, 98, 114, 114, + 114, 98, 114, 49, 50, 33, 66, 33, 65, 33, 81, 33, + 83, 0, 10, 112, 66, 25, 0, 47, 35, 66, 83, 113, + 18, 49, 18, 49, 33, 97, 34, 33, 49, 33, 50, 81, + 34, 17, 50, 17, 66, 65, 50, 17, 50, 17, 50, 81, + 51, 67, 66, 146, 82, 67, 131, 67, 66, 146, 83, 66, + 146, 82, 66, 49, 83, 67, 66, 49, 82, 82, 82, 33, + 98, 82, 82, 17, 114, 82, 98, 0, 28, 112, 47, 18, + 0, 34, 19, 67, 113, 18, 49, 33, 97, 34, 33, 50, + 81, 34, 17, 66, 65, 50, 17, 50, 81, 51, 66, 131, + 67, 131, 66, 146, 82, 146, 66, 49, 83, 66, 49, 82, + 82, 33, 98, 82, 17, 114, 98, 0, 21, 33, 14, 0, + 26, 116, 130, 50, 98, 66, 83, 82, 66, 98, 51, 83, + 50, 99, 50, 98, 66, 98, 66, 83, 66, 82, 82, 66, + 113, 50, 148, 0, 16, 96, 55, 20, 0, 38, 35, 51, + 161, 18, 33, 34, 129, 34, 17, 66, 113, 35, 82, 97, + 51, 82, 97, 50, 98, 147, 83, 147, 83, 146, 98, 162, + 83, 147, 82, 163, 66, 178, 17, 34, 194, 35, 194, 240, + 50, 240, 50, 240, 35, 240, 34, 240, 50, 249, 0, 6, + 48, 46, 16, 0, 30, 84, 49, 114, 49, 17, 114, 65, + 17, 98, 83, 98, 83, 83, 82, 98, 98, 98, 83, 83, + 83, 83, 82, 98, 83, 98, 65, 18, 114, 33, 19, 131, + 34, 226, 226, 210, 226, 226, 226, 153, 240, 240, 128, 33, + 15, 0, 28, 67, 51, 81, 18, 33, 18, 65, 34, 17, + 19, 65, 34, 17, 34, 49, 51, 129, 51, 179, 195, 194, + 210, 195, 194, 210, 210, 0, 18, 32, 30, 14, 0, 26, + 116, 145, 65, 113, 82, 97, 67, 97, 67, 98, 211, 195, + 113, 67, 82, 82, 82, 82, 81, 98, 82, 66, 132, 0, + 16, 96, 34, 11, 0, 10, 18, 146, 146, 130, 146, 146, + 146, 130, 120, 82, 146, 130, 146, 146, 146, 130, 146, 49, + 82, 33, 98, 33, 97, 49, 97, 33, 115, 0, 13, 48, + 47, 18, 0, 34, 19, 98, 97, 33, 98, 81, 49, 82, + 97, 49, 82, 81, 50, 67, 81, 50, 67, 131, 66, 146, + 67, 131, 49, 18, 130, 68, 33, 82, 49, 18, 49, 82, + 49, 18, 33, 98, 33, 34, 17, 131, 66, 0, 21, 39, + 16, 0, 30, 51, 51, 97, 33, 51, 81, 49, 52, 65, + 49, 82, 49, 50, 81, 65, 50, 81, 115, 81, 114, 97, + 99, 81, 114, 97, 114, 81, 130, 65, 146, 49, 180, 0, + 19, 16, 54, 23, 0, 43, 67, 98, 50, 97, 33, 98, + 36, 65, 49, 82, 67, 65, 49, 82, 97, 49, 50, 82, + 97, 49, 50, 67, 97, 99, 66, 97, 114, 67, 97, 99, + 67, 97, 98, 67, 97, 114, 67, 81, 130, 49, 18, 66, + 130, 33, 34, 50, 163, 68, 0, 27, 44, 18, 0, 34, + 36, 52, 97, 49, 34, 33, 81, 68, 34, 65, 83, 35, + 65, 82, 65, 178, 240, 18, 242, 240, 18, 177, 66, 81, + 67, 35, 81, 66, 49, 17, 65, 81, 49, 33, 49, 115, + 67, 0, 21, 16, 53, 17, 0, 32, 35, 98, 81, 33, + 98, 65, 49, 82, 81, 49, 82, 65, 50, 82, 65, 50, + 67, 115, 66, 130, 67, 115, 67, 114, 68, 114, 67, 130, + 49, 18, 130, 33, 34, 147, 34, 242, 242, 129, 82, 131, + 66, 130, 66, 146, 50, 181, 240, 240, 240, 31, 14, 0, + 26, 99, 34, 101, 33, 81, 68, 65, 114, 178, 163, 147, + 162, 177, 193, 113, 66, 113, 65, 18, 65, 82, 22, 82, + 36, 0, 16, 64, 36, 14, 0, 11, 97, 178, 177, 193, + 194, 194, 194, 194, 194, 194, 194, 193, 194, 178, 162, 225, + 210, 194, 194, 178, 194, 178, 194, 178, 194, 194, 194, 210, + 210, 0, 6, 64, 34, 5, 240, 240, 82, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 240, 48, 36, 14, 0, 11, 49, 226, 209, 210, 194, 193, + 194, 179, 178, 194, 178, 194, 194, 209, 226, 162, 178, 193, + 194, 194, 194, 194, 194, 194, 194, 178, 193, 193, 178, 0, + 6, 96, 21, 20, 0, 45, 21, 130, 72, 113, 65, 54, + 97, 49, 86, 50, 49, 120, 81, 148, 0, 35, 80, 4, + 12, 0, 57, 27, 11, 0, 21, 34, 132, 116, 130, 240, + 81, 161, 145, 161, 146, 146, 146, 130, 146, 131, 131, 131, + 116, 116, 115, 131, 240, 240, 46, 14, 0, 20, 33, 193, + 209, 209, 180, 132, 33, 99, 17, 34, 82, 33, 19, 67, + 17, 34, 82, 33, 131, 33, 131, 33, 130, 33, 146, 33, + 146, 33, 49, 97, 17, 65, 99, 34, 132, 177, 193, 209, + 209, 0, 10, 16, 56, 25, 0, 23, 116, 240, 81, 65, + 240, 49, 97, 240, 18, 97, 242, 68, 242, 67, 242, 240, + 130, 240, 130, 240, 115, 240, 115, 240, 39, 240, 136, 240, + 19, 240, 114, 240, 130, 240, 114, 161, 194, 161, 103, 161, + 82, 69, 114, 81, 81, 27, 102, 72, 145, 0, 27, 96, + 34, 17, 0, 25, 65, 53, 50, 67, 83, 98, 114, 97, + 145, 81, 177, 65, 177, 65, 177, 65, 177, 65, 177, 81, + 145, 98, 114, 99, 83, 81, 53, 50, 0, 28, 47, 22, + 0, 22, 24, 55, 99, 130, 162, 129, 179, 97, 195, 82, + 195, 81, 226, 65, 243, 33, 240, 19, 17, 240, 35, 17, + 240, 36, 235, 243, 240, 67, 251, 242, 240, 67, 240, 67, + 240, 66, 240, 67, 240, 25, 0, 26, 48, 29, 5, 240, + 242, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 240, + 240, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 240, 128, 57, 17, 0, 15, 116, 178, 50, 146, 82, 129, + 98, 114, 68, 114, 67, 130, 240, 18, 225, 19, 177, 51, + 145, 83, 114, 99, 98, 115, 82, 130, 83, 114, 99, 98, + 115, 81, 147, 49, 179, 17, 226, 240, 17, 147, 66, 116, + 66, 114, 97, 130, 82, 146, 50, 180, 0, 9, 112, 13, + 11, 0, 12, 50, 66, 51, 35, 50, 66, 0, 36, 16, + 76, 25, 0, 22, 104, 242, 130, 193, 193, 161, 225, 129, + 100, 33, 49, 97, 98, 51, 65, 81, 82, 82, 65, 81, + 67, 97, 65, 65, 82, 113, 81, 49, 82, 209, 49, 67, + 209, 49, 67, 209, 49, 67, 209, 49, 67, 113, 81, 65, + 66, 113, 65, 81, 67, 97, 65, 81, 82, 81, 81, 97, + 67, 50, 65, 129, 84, 81, 161, 193, 194, 130, 248, 240, + 82, 0, 26, 80, 31, 12, 0, 10, 117, 98, 34, 82, + 50, 81, 65, 97, 65, 82, 50, 82, 50, 17, 50, 34, + 17, 66, 17, 17, 17, 83, 18, 87, 0, 30, 80, 27, + 12, 0, 24, 97, 161, 161, 49, 97, 49, 83, 33, 83, + 33, 98, 34, 114, 33, 114, 34, 113, 49, 113, 49, 129, + 0, 16, 18, 18, 0, 33, 111, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 0, 38, 80, 9, 11, 0, 28, + 49, 56, 0, 22, 48, 79, 25, 0, 22, 104, 242, 130, + 193, 193, 161, 225, 129, 41, 81, 97, 82, 66, 81, 81, + 82, 67, 65, 81, 82, 67, 65, 65, 98, 67, 81, 49, + 98, 51, 97, 49, 102, 129, 49, 98, 50, 113, 49, 98, + 66, 97, 49, 98, 66, 97, 65, 82, 66, 81, 81, 82, + 67, 17, 33, 81, 82, 67, 17, 33, 97, 38, 51, 33, + 129, 225, 161, 193, 194, 130, 248, 240, 82, 0, 26, 80, + 8, 12, 0, 16, 73, 0, 39, 48, 27, 12, 0, 11, + 3, 115, 33, 82, 65, 82, 81, 50, 97, 50, 81, 66, + 81, 66, 81, 66, 65, 83, 33, 116, 0, 30, 112, 45, + 28, 0, 33, 1, 240, 193, 240, 193, 240, 193, 240, 193, + 240, 193, 240, 193, 240, 193, 255, 10, 241, 240, 193, 240, + 193, 240, 193, 240, 193, 240, 193, 240, 193, 240, 193, 240, + 193, 0, 8, 127, 10, 0, 28, 48, 28, 13, 0, 12, + 4, 129, 50, 97, 66, 81, 82, 98, 50, 98, 49, 177, + 162, 146, 146, 81, 67, 65, 81, 37, 81, 51, 0, 30, + 29, 13, 0, 12, 4, 114, 50, 97, 66, 98, 50, 178, + 162, 116, 145, 49, 194, 82, 66, 67, 66, 65, 82, 97, + 50, 132, 0, 28, 64, 12, 8, 0, 8, 50, 83, 82, + 81, 97, 0, 25, 112, 56, 18, 0, 34, 34, 82, 146, + 82, 130, 98, 130, 83, 130, 82, 131, 82, 130, 98, 130, + 82, 146, 82, 131, 82, 49, 67, 67, 49, 67, 49, 17, + 49, 83, 33, 34, 17, 81, 35, 51, 97, 240, 33, 240, + 33, 240, 34, 240, 18, 240, 18, 240, 19, 243, 240, 240, + 48, 60, 18, 0, 16, 58, 101, 49, 134, 49, 134, 49, + 118, 50, 118, 49, 134, 49, 134, 49, 133, 50, 163, 49, + 209, 49, 194, 49, 193, 49, 209, 49, 209, 49, 194, 34, + 193, 49, 209, 49, 209, 49, 193, 50, 193, 49, 209, 49, + 194, 49, 193, 50, 193, 49, 209, 49, 194, 49, 0, 10, + 64, 11, 7, 0, 15, 2, 68, 52, 66, 0, 15, 48, + 16, 8, 0, 29, 49, 113, 113, 66, 18, 50, 33, 49, + 34, 67, 240, 80, 20, 10, 0, 9, 65, 130, 115, 97, + 18, 114, 130, 130, 114, 130, 130, 130, 114, 102, 0, 23, + 25, 12, 0, 11, 4, 114, 33, 98, 50, 81, 66, 66, + 65, 82, 50, 82, 50, 82, 34, 115, 240, 71, 0, 30, + 80, 26, 12, 0, 26, 33, 113, 49, 129, 34, 113, 50, + 98, 34, 98, 34, 82, 34, 97, 34, 97, 34, 97, 49, + 161, 0, 16, 63, 24, 0, 21, 97, 240, 129, 145, 179, + 130, 161, 18, 129, 194, 129, 210, 129, 210, 113, 226, 97, + 226, 113, 226, 97, 98, 114, 82, 98, 114, 81, 98, 114, + 81, 113, 17, 70, 49, 97, 17, 209, 97, 33, 194, 81, + 34, 193, 81, 50, 177, 81, 50, 193, 74, 129, 162, 161, + 162, 177, 134, 0, 27, 80, 64, 24, 0, 21, 97, 240, + 129, 145, 179, 130, 161, 18, 129, 194, 129, 210, 129, 210, + 113, 225, 113, 226, 113, 226, 97, 68, 114, 82, 34, 50, + 82, 97, 33, 82, 54, 49, 66, 50, 193, 66, 50, 177, + 161, 178, 145, 193, 130, 193, 114, 225, 82, 81, 145, 83, + 65, 145, 97, 37, 145, 97, 51, 0, 27, 96, 72, 25, + 0, 22, 68, 240, 66, 50, 113, 161, 66, 98, 162, 50, + 97, 240, 18, 81, 240, 18, 97, 196, 113, 209, 49, 81, + 240, 50, 65, 194, 66, 49, 98, 67, 66, 34, 98, 65, + 82, 49, 113, 97, 50, 49, 115, 100, 65, 97, 17, 225, + 97, 33, 210, 81, 34, 209, 81, 50, 193, 81, 50, 209, + 74, 145, 162, 177, 162, 193, 134, 0, 28, 96, 37, 14, + 0, 27, 35, 179, 179, 179, 147, 161, 49, 145, 50, 113, + 65, 194, 178, 163, 148, 147, 163, 163, 82, 66, 98, 66, + 99, 50, 113, 67, 97, 82, 66, 117, 240, 240, 80, 64, + 24, 240, 240, 131, 240, 114, 240, 129, 240, 130, 0, 8, + 113, 240, 114, 240, 99, 240, 99, 240, 84, 240, 69, 240, + 65, 19, 240, 49, 35, 240, 34, 35, 240, 33, 51, 240, + 17, 67, 240, 17, 67, 241, 83, 234, 225, 99, 209, 115, + 193, 131, 193, 131, 177, 147, 162, 147, 147, 147, 105, 57, + 0, 27, 48, 67, 26, 0, 5, 99, 240, 115, 240, 115, + 240, 129, 0, 9, 65, 240, 146, 240, 131, 240, 131, 240, + 116, 240, 101, 240, 97, 19, 240, 81, 35, 240, 66, 35, + 240, 65, 51, 240, 49, 67, 240, 49, 67, 240, 33, 83, + 240, 26, 240, 17, 99, 241, 115, 225, 131, 225, 131, 209, + 147, 194, 147, 179, 147, 137, 57, 0, 29, 112, 67, 25, + 240, 240, 209, 240, 131, 240, 97, 34, 240, 50, 66, 0, + 8, 97, 240, 130, 240, 115, 240, 115, 240, 100, 240, 85, + 240, 81, 19, 240, 65, 35, 240, 50, 35, 240, 49, 51, + 240, 33, 67, 240, 33, 67, 240, 17, 83, 250, 241, 99, + 225, 115, 209, 131, 209, 131, 193, 147, 178, 147, 163, 147, + 121, 57, 0, 28, 80, 65, 26, 0, 8, 37, 49, 240, + 33, 52, 0, 12, 49, 240, 146, 240, 131, 240, 131, 240, + 116, 240, 101, 240, 97, 19, 240, 81, 35, 240, 66, 35, + 240, 65, 51, 240, 49, 67, 240, 49, 67, 240, 33, 83, + 240, 26, 240, 17, 99, 241, 115, 225, 131, 225, 131, 209, + 147, 194, 147, 179, 147, 137, 57, 0, 29, 112, 68, 26, + 240, 240, 162, 67, 240, 35, 51, 240, 34, 67, 0, 12, + 33, 240, 146, 240, 131, 240, 131, 240, 116, 240, 101, 240, + 97, 19, 240, 81, 35, 240, 66, 35, 240, 65, 51, 240, + 49, 67, 240, 49, 67, 240, 33, 83, 240, 26, 240, 17, + 99, 241, 115, 225, 131, 225, 131, 209, 147, 194, 147, 179, + 147, 137, 57, 0, 29, 112, 71, 24, 240, 19, 240, 81, + 49, 240, 49, 65, 240, 49, 65, 240, 65, 49, 240, 83, + 0, 5, 97, 240, 114, 240, 99, 240, 99, 240, 84, 240, + 69, 240, 65, 19, 240, 49, 35, 240, 34, 35, 240, 33, + 51, 240, 17, 67, 240, 17, 67, 241, 83, 234, 225, 99, + 209, 115, 193, 131, 193, 131, 177, 147, 162, 147, 147, 147, + 105, 57, 0, 27, 48, 82, 36, 0, 33, 79, 2, 240, + 100, 115, 240, 100, 146, 240, 100, 146, 240, 81, 19, 161, + 240, 65, 34, 177, 240, 49, 35, 97, 240, 114, 35, 81, + 240, 129, 51, 81, 240, 113, 66, 82, 240, 97, 74, 240, + 81, 83, 66, 240, 97, 83, 81, 240, 89, 97, 240, 65, + 99, 97, 65, 209, 115, 177, 194, 115, 161, 209, 115, 177, + 193, 131, 162, 178, 131, 147, 163, 131, 131, 136, 47, 3, + 0, 41, 64, 66, 21, 0, 19, 54, 49, 146, 97, 33, + 130, 115, 130, 146, 115, 146, 99, 162, 99, 162, 83, 177, + 99, 177, 98, 240, 51, 240, 51, 240, 51, 240, 51, 240, + 51, 177, 99, 177, 99, 162, 99, 161, 130, 146, 130, 130, + 162, 98, 199, 240, 17, 240, 81, 240, 82, 240, 17, 50, + 226, 49, 241, 50, 240, 20, 0, 7, 16, 64, 25, 240, + 240, 98, 240, 146, 240, 130, 240, 145, 0, 8, 47, 2, + 179, 131, 179, 131, 178, 161, 179, 161, 179, 161, 179, 81, + 65, 178, 97, 243, 82, 243, 81, 240, 25, 243, 82, 243, + 81, 240, 19, 81, 240, 18, 97, 243, 97, 65, 163, 177, + 163, 162, 162, 177, 163, 162, 163, 132, 127, 2, 0, 29, + 16, 64, 25, 240, 240, 194, 240, 115, 240, 98, 240, 114, + 0, 8, 15, 2, 179, 131, 179, 131, 178, 161, 179, 161, + 179, 161, 179, 81, 65, 178, 97, 243, 82, 243, 81, 240, + 25, 243, 82, 243, 81, 240, 19, 81, 240, 18, 97, 243, + 97, 65, 163, 177, 163, 162, 162, 177, 163, 162, 163, 132, + 127, 2, 0, 29, 16, 66, 25, 240, 240, 161, 240, 131, + 240, 82, 33, 240, 65, 81, 0, 7, 111, 2, 179, 131, + 179, 131, 178, 161, 179, 161, 179, 161, 179, 81, 65, 178, + 97, 243, 82, 243, 81, 240, 25, 243, 82, 243, 81, 240, + 19, 81, 240, 18, 97, 243, 97, 65, 163, 177, 163, 162, + 162, 177, 163, 162, 163, 132, 127, 2, 0, 29, 16, 65, + 25, 240, 240, 98, 66, 240, 35, 51, 240, 18, 66, 0, + 10, 111, 2, 179, 131, 179, 131, 178, 161, 179, 161, 179, + 161, 179, 81, 65, 178, 97, 243, 82, 243, 81, 240, 25, + 243, 82, 243, 81, 240, 19, 81, 240, 18, 97, 243, 97, + 65, 163, 177, 163, 162, 162, 177, 163, 162, 163, 132, 127, + 2, 0, 29, 16, 36, 17, 240, 146, 240, 18, 242, 240, + 17, 0, 5, 105, 179, 227, 226, 227, 227, 227, 226, 227, + 227, 227, 211, 227, 227, 226, 227, 227, 227, 226, 227, 227, + 185, 0, 20, 16, 36, 18, 240, 240, 18, 243, 226, 240, + 17, 0, 5, 121, 195, 243, 242, 243, 243, 243, 242, 243, + 243, 243, 227, 243, 243, 242, 243, 243, 243, 242, 243, 243, + 201, 0, 21, 48, 36, 17, 240, 209, 243, 194, 33, 177, + 81, 240, 240, 201, 179, 227, 226, 227, 227, 227, 226, 227, + 227, 227, 211, 227, 227, 226, 227, 227, 227, 226, 227, 227, + 185, 0, 20, 16, 54, 19, 240, 178, 66, 179, 51, 162, + 66, 0, 8, 41, 211, 240, 19, 240, 18, 240, 19, 240, + 19, 240, 19, 240, 18, 240, 19, 240, 19, 240, 19, 243, + 240, 19, 240, 19, 240, 18, 240, 19, 240, 19, 240, 19, + 240, 18, 240, 19, 240, 19, 217, 0, 22, 80, 49, 25, + 0, 22, 77, 243, 98, 227, 114, 210, 131, 179, 146, 179, + 147, 163, 147, 162, 163, 147, 163, 147, 163, 90, 115, 131, + 163, 147, 163, 147, 163, 146, 178, 147, 163, 147, 162, 163, + 146, 178, 147, 163, 131, 179, 114, 173, 0, 29, 80, 71, + 29, 0, 8, 116, 240, 228, 0, 12, 70, 120, 179, 163, + 212, 146, 228, 145, 241, 18, 145, 226, 19, 114, 225, 35, + 113, 241, 51, 97, 241, 51, 97, 226, 51, 82, 225, 83, + 65, 241, 83, 65, 241, 98, 65, 226, 99, 34, 225, 115, + 33, 241, 130, 33, 241, 131, 17, 225, 149, 225, 163, 241, + 163, 226, 163, 184, 129, 240, 209, 0, 30, 64, 59, 21, + 240, 242, 240, 66, 240, 82, 240, 81, 0, 7, 39, 210, + 82, 178, 114, 146, 131, 114, 162, 99, 162, 98, 179, 67, + 179, 67, 179, 51, 179, 67, 179, 67, 179, 67, 179, 67, + 179, 67, 163, 83, 163, 83, 147, 99, 146, 130, 131, 130, + 115, 162, 83, 199, 240, 33, 0, 22, 96, 60, 21, 240, + 240, 83, 240, 50, 240, 50, 240, 49, 0, 7, 23, 210, + 82, 178, 114, 146, 131, 114, 162, 99, 162, 98, 179, 67, + 179, 67, 179, 51, 179, 67, 179, 67, 179, 67, 179, 67, + 179, 67, 163, 83, 163, 83, 147, 99, 146, 130, 131, 130, + 115, 162, 83, 199, 240, 33, 0, 22, 96, 61, 21, 194, + 240, 66, 240, 51, 240, 33, 49, 226, 81, 0, 6, 103, + 210, 82, 178, 114, 146, 131, 114, 162, 99, 162, 98, 179, + 67, 179, 67, 179, 51, 179, 67, 179, 67, 179, 67, 179, + 67, 179, 67, 163, 83, 163, 83, 147, 99, 146, 130, 131, + 130, 115, 162, 83, 199, 240, 33, 0, 22, 96, 57, 21, + 0, 6, 52, 49, 193, 52, 0, 9, 55, 210, 82, 178, + 114, 146, 131, 114, 162, 99, 162, 98, 179, 67, 179, 67, + 179, 51, 179, 67, 179, 67, 179, 67, 179, 67, 179, 67, + 163, 83, 163, 83, 147, 99, 146, 130, 131, 130, 115, 162, + 83, 199, 240, 33, 0, 22, 96, 58, 21, 240, 227, 66, + 195, 51, 195, 66, 0, 9, 39, 210, 82, 178, 114, 146, + 131, 114, 162, 99, 162, 98, 179, 67, 179, 67, 179, 51, + 179, 67, 179, 67, 179, 67, 179, 67, 179, 67, 163, 83, + 163, 83, 147, 99, 146, 130, 131, 130, 115, 162, 83, 199, + 240, 33, 0, 22, 96, 46, 22, 0, 33, 2, 242, 66, + 210, 98, 178, 130, 146, 162, 114, 194, 82, 226, 50, 240, + 18, 18, 240, 51, 240, 67, 240, 50, 18, 240, 18, 50, + 226, 82, 194, 114, 162, 146, 130, 178, 98, 210, 66, 242, + 0, 22, 48, 66, 23, 0, 21, 23, 50, 162, 82, 33, + 162, 115, 162, 131, 146, 147, 131, 129, 18, 130, 129, 35, + 99, 114, 35, 99, 98, 51, 83, 98, 51, 99, 82, 67, + 99, 81, 83, 99, 65, 99, 99, 49, 115, 99, 33, 115, + 115, 17, 131, 116, 131, 132, 130, 162, 131, 147, 115, 146, + 18, 83, 161, 55, 240, 65, 0, 24, 112, 60, 25, 240, + 240, 66, 240, 131, 240, 130, 240, 145, 0, 8, 9, 72, + 114, 178, 147, 178, 147, 177, 163, 177, 162, 178, 147, 177, + 163, 177, 163, 177, 162, 178, 147, 177, 163, 177, 162, 193, + 147, 177, 163, 177, 163, 177, 162, 178, 162, 177, 179, 146, + 194, 145, 211, 113, 240, 24, 0, 29, 112, 60, 25, 240, + 240, 162, 240, 115, 240, 98, 240, 114, 0, 7, 105, 72, + 114, 178, 147, 178, 147, 177, 163, 177, 162, 178, 147, 177, + 163, 177, 163, 177, 162, 178, 147, 177, 163, 177, 162, 193, + 147, 177, 163, 177, 163, 177, 162, 178, 162, 177, 179, 146, + 194, 145, 211, 113, 240, 24, 0, 29, 112, 62, 25, 209, + 240, 130, 240, 116, 240, 82, 34, 240, 34, 82, 0, 7, + 57, 72, 114, 178, 147, 178, 147, 177, 163, 177, 162, 178, + 147, 177, 163, 177, 163, 177, 162, 178, 147, 177, 163, 177, + 162, 193, 147, 177, 163, 177, 163, 177, 162, 178, 162, 177, + 179, 146, 194, 145, 211, 113, 240, 24, 0, 29, 112, 61, + 25, 240, 240, 66, 66, 240, 35, 51, 240, 18, 66, 0, + 10, 73, 72, 114, 178, 147, 178, 147, 177, 163, 177, 162, + 178, 147, 177, 163, 177, 163, 177, 162, 178, 147, 177, 163, + 177, 162, 193, 147, 177, 163, 177, 163, 177, 162, 178, 162, + 177, 179, 146, 194, 145, 211, 113, 240, 24, 0, 29, 112, + 63, 25, 240, 240, 147, 240, 114, 240, 114, 240, 113, 0, + 7, 121, 57, 115, 132, 163, 130, 195, 129, 226, 114, 227, + 82, 243, 81, 240, 19, 65, 240, 50, 49, 240, 66, 33, + 240, 84, 240, 100, 240, 99, 240, 115, 240, 115, 240, 114, + 240, 115, 240, 115, 240, 115, 240, 114, 240, 115, 240, 59, + 0, 29, 112, 48, 23, 0, 20, 106, 240, 19, 240, 83, + 240, 82, 240, 90, 211, 98, 195, 99, 178, 130, 163, 131, + 147, 131, 147, 115, 147, 131, 147, 130, 163, 115, 163, 83, + 186, 211, 240, 83, 240, 82, 240, 83, 240, 83, 240, 42, + 0, 27, 64, 64, 19, 0, 17, 117, 210, 50, 177, 82, + 162, 82, 146, 98, 146, 98, 146, 82, 147, 66, 162, 35, + 194, 65, 194, 66, 162, 98, 146, 98, 146, 98, 146, 98, + 130, 114, 130, 99, 130, 18, 50, 149, 50, 130, 18, 50, + 146, 18, 34, 162, 36, 162, 240, 34, 240, 34, 240, 34, + 240, 18, 240, 34, 0, 9, 32, 50, 17, 0, 17, 98, + 242, 240, 18, 242, 240, 17, 0, 5, 116, 34, 130, 51, + 130, 67, 114, 83, 114, 83, 99, 82, 114, 98, 114, 83, + 99, 83, 99, 82, 49, 50, 83, 33, 66, 65, 18, 33, + 82, 33, 34, 17, 115, 66, 0, 19, 112, 48, 17, 0, + 18, 66, 227, 211, 210, 241, 0, 5, 100, 34, 130, 51, + 130, 67, 114, 83, 114, 83, 99, 82, 114, 98, 114, 83, + 99, 83, 99, 82, 49, 50, 83, 33, 66, 65, 18, 33, + 82, 33, 34, 17, 115, 66, 0, 19, 112, 51, 17, 0, + 18, 18, 227, 225, 17, 209, 34, 162, 65, 240, 240, 228, + 34, 130, 51, 130, 67, 114, 83, 114, 83, 99, 82, 114, + 98, 114, 83, 99, 83, 99, 82, 49, 50, 83, 33, 66, + 65, 18, 33, 82, 33, 34, 17, 115, 66, 0, 19, 112, + 47, 17, 0, 19, 116, 49, 129, 52, 0, 9, 84, 34, + 130, 51, 130, 67, 114, 83, 114, 83, 99, 82, 114, 98, + 114, 83, 99, 83, 99, 82, 49, 50, 83, 33, 66, 65, + 18, 33, 82, 33, 34, 17, 115, 66, 0, 19, 112, 49, + 17, 0, 19, 99, 50, 147, 51, 131, 50, 0, 7, 68, + 34, 130, 51, 130, 67, 114, 83, 114, 83, 99, 82, 114, + 98, 114, 83, 99, 83, 99, 82, 49, 50, 83, 33, 66, + 65, 18, 33, 82, 33, 34, 17, 115, 66, 0, 19, 112, + 53, 17, 0, 15, 115, 209, 49, 177, 65, 177, 65, 193, + 49, 211, 240, 240, 244, 34, 130, 51, 130, 67, 114, 83, + 114, 83, 99, 82, 114, 98, 114, 83, 99, 83, 99, 82, + 49, 50, 83, 33, 66, 65, 18, 33, 82, 33, 34, 17, + 115, 66, 0, 19, 112, 47, 22, 0, 41, 116, 34, 35, + 130, 54, 34, 98, 68, 66, 82, 84, 66, 82, 83, 81, + 83, 83, 65, 98, 103, 114, 83, 179, 83, 179, 82, 113, + 66, 83, 97, 82, 65, 19, 81, 98, 33, 50, 50, 131, + 84, 0, 25, 96, 38, 14, 0, 27, 3, 146, 49, 114, + 66, 83, 51, 82, 66, 83, 178, 194, 194, 194, 97, 82, + 81, 98, 81, 113, 65, 148, 161, 225, 161, 33, 146, 34, + 129, 49, 163, 0, 6, 64, 37, 12, 0, 12, 82, 162, + 162, 178, 177, 240, 240, 51, 114, 49, 82, 65, 66, 81, + 66, 66, 51, 50, 70, 98, 162, 162, 97, 50, 81, 66, + 81, 81, 65, 116, 0, 14, 32, 36, 15, 0, 16, 34, + 210, 194, 194, 193, 240, 240, 195, 162, 49, 130, 65, 114, + 81, 114, 66, 99, 50, 118, 146, 210, 210, 97, 98, 81, + 114, 81, 129, 65, 164, 0, 18, 39, 14, 0, 15, 1, + 194, 180, 146, 33, 129, 81, 240, 240, 99, 146, 49, 114, + 65, 98, 81, 98, 66, 83, 50, 102, 130, 194, 194, 97, + 82, 81, 98, 81, 113, 65, 148, 0, 16, 96, 38, 16, + 0, 18, 66, 66, 131, 36, 114, 66, 0, 7, 19, 178, + 49, 146, 65, 130, 81, 130, 66, 115, 50, 134, 162, 226, + 226, 97, 114, 81, 130, 81, 145, 65, 180, 0, 19, 32, + 36, 11, 0, 11, 50, 146, 162, 146, 161, 240, 243, 113, + 33, 97, 49, 97, 49, 81, 50, 81, 50, 131, 130, 131, + 130, 49, 82, 33, 98, 33, 98, 17, 130, 0, 13, 16, + 37, 14, 0, 15, 18, 179, 163, 162, 193, 240, 240, 131, + 161, 33, 145, 49, 145, 49, 129, 50, 129, 50, 179, 178, + 179, 178, 49, 130, 33, 146, 33, 146, 17, 178, 0, 16, + 112, 39, 12, 0, 12, 98, 147, 145, 17, 129, 34, 97, + 65, 240, 243, 129, 33, 113, 49, 113, 49, 97, 50, 97, + 50, 147, 146, 147, 146, 49, 98, 33, 114, 33, 114, 17, + 146, 0, 14, 48, 38, 14, 0, 16, 18, 50, 100, 20, + 98, 50, 0, 6, 19, 161, 33, 145, 49, 145, 49, 129, + 50, 129, 50, 179, 178, 179, 178, 49, 130, 33, 146, 33, + 146, 17, 178, 0, 16, 112, 44, 17, 0, 15, 83, 242, + 243, 19, 180, 181, 177, 50, 242, 242, 179, 19, 130, 52, + 114, 68, 99, 82, 114, 98, 99, 83, 98, 99, 98, 98, + 114, 98, 114, 83, 114, 82, 130, 66, 161, 50, 196, 0, + 20, 64, 52, 18, 0, 21, 20, 209, 52, 0, 9, 115, + 67, 113, 18, 49, 33, 97, 34, 33, 50, 81, 34, 17, + 66, 65, 50, 17, 50, 81, 51, 66, 131, 67, 131, 66, + 146, 82, 146, 66, 49, 83, 66, 49, 82, 82, 33, 98, + 82, 17, 114, 98, 0, 21, 40, 14, 0, 14, 82, 194, + 194, 210, 209, 240, 240, 148, 130, 50, 98, 66, 83, 82, + 66, 98, 51, 83, 50, 99, 50, 98, 66, 98, 66, 83, + 66, 82, 82, 66, 113, 50, 148, 0, 16, 96, 39, 15, + 0, 16, 49, 210, 194, 194, 194, 240, 240, 180, 146, 50, + 114, 66, 99, 82, 82, 98, 67, 83, 66, 99, 66, 98, + 82, 98, 82, 83, 82, 82, 98, 66, 129, 50, 164, 0, + 18, 42, 14, 0, 15, 1, 195, 164, 146, 33, 129, 81, + 240, 240, 100, 130, 50, 98, 66, 83, 82, 66, 98, 51, + 83, 50, 99, 50, 98, 66, 98, 66, 83, 66, 82, 82, + 66, 113, 50, 148, 0, 16, 96, 37, 15, 0, 17, 68, + 161, 52, 0, 8, 68, 146, 50, 114, 66, 99, 82, 82, + 98, 67, 83, 66, 99, 66, 98, 82, 98, 82, 83, 82, + 82, 98, 66, 129, 50, 164, 0, 18, 41, 16, 0, 18, + 67, 50, 131, 36, 115, 50, 0, 7, 20, 162, 50, 130, + 66, 115, 82, 98, 98, 83, 83, 82, 99, 82, 98, 98, + 98, 98, 83, 98, 82, 114, 66, 145, 50, 180, 0, 19, + 32, 27, 28, 0, 39, 115, 240, 163, 240, 163, 240, 163, + 0, 22, 111, 10, 0, 19, 35, 240, 163, 240, 163, 240, + 163, 0, 26, 32, 41, 16, 0, 30, 99, 49, 114, 51, + 114, 66, 115, 67, 98, 65, 18, 83, 49, 19, 82, 49, + 35, 82, 33, 51, 82, 17, 66, 99, 67, 98, 82, 114, + 66, 113, 17, 50, 129, 36, 0, 19, 16, 58, 18, 0, + 18, 114, 240, 18, 240, 18, 240, 34, 240, 33, 0, 5, + 115, 98, 97, 33, 98, 81, 49, 82, 97, 49, 82, 81, + 50, 67, 81, 50, 67, 131, 66, 146, 67, 131, 49, 18, + 130, 68, 33, 82, 49, 18, 49, 82, 49, 18, 33, 98, + 33, 34, 17, 131, 66, 0, 21, 55, 18, 0, 19, 81, + 240, 18, 242, 242, 242, 0, 5, 99, 98, 97, 33, 98, + 81, 49, 82, 97, 49, 82, 81, 50, 67, 81, 50, 67, + 131, 66, 146, 67, 131, 49, 18, 130, 68, 33, 82, 49, + 18, 49, 82, 49, 18, 33, 98, 33, 34, 17, 131, 66, + 0, 21, 57, 18, 0, 19, 33, 240, 19, 228, 210, 33, + 193, 81, 240, 240, 227, 98, 97, 33, 98, 81, 49, 82, + 97, 49, 82, 81, 50, 67, 81, 50, 67, 131, 66, 146, + 67, 131, 49, 18, 130, 68, 33, 82, 49, 18, 49, 82, + 49, 18, 33, 98, 33, 34, 17, 131, 66, 0, 21, 55, + 18, 0, 21, 3, 50, 163, 36, 147, 50, 0, 7, 83, + 98, 97, 33, 98, 81, 49, 82, 97, 49, 82, 81, 50, + 67, 81, 50, 67, 131, 66, 146, 67, 131, 49, 18, 130, + 68, 33, 82, 49, 18, 49, 82, 49, 18, 33, 98, 33, + 34, 17, 131, 66, 0, 21, 60, 17, 0, 18, 66, 242, + 226, 226, 225, 240, 240, 227, 98, 81, 33, 98, 65, 49, + 82, 81, 49, 82, 65, 50, 82, 65, 50, 67, 115, 66, + 130, 67, 115, 67, 114, 68, 114, 67, 130, 49, 18, 130, + 33, 34, 147, 34, 242, 242, 129, 82, 131, 66, 130, 66, + 146, 50, 181, 240, 240, 240, 65, 20, 0, 18, 53, 240, + 50, 240, 50, 240, 34, 240, 50, 240, 50, 240, 50, 240, + 34, 240, 50, 35, 210, 17, 34, 195, 66, 163, 82, 163, + 82, 162, 98, 147, 83, 147, 83, 146, 98, 162, 83, 147, + 82, 163, 66, 178, 17, 34, 194, 35, 194, 240, 50, 240, + 50, 240, 35, 240, 34, 240, 50, 249, 0, 6, 48, 61, + 17, 0, 19, 114, 66, 147, 35, 146, 66, 0, 7, 19, + 98, 81, 33, 98, 65, 49, 82, 81, 49, 82, 65, 50, + 82, 65, 50, 67, 115, 66, 130, 67, 115, 67, 114, 68, + 114, 67, 130, 49, 18, 130, 33, 34, 147, 34, 242, 242, + 129, 82, 131, 66, 130, 66, 146, 50, 181, 240, 240, 240,}; + +//***************************************************************************** +// +// The glyph offset table for the 30 point Oldstandard italic font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetOldstandard30i[] = +{ + 0, 5, 34, 52, 101, 189, 260, 332, + 345, 380, 415, 445, 502, 518, 527, 538, + 574, 623, 652, 696, 742, 779, 824, 870, + 908, 956, 1004, 1021, 1043, 1098, 1111, 1169, + 1207, 1285, 1340, 1388, 1438, 1487, 1542, 1594, + 1648, 1698, 1727, 1778, 1842, 1893, 1978, 2044, + 2095, 2143, 2209, 2262, 2314, 2369, 2420, 2479, + 2568, 2631, 2685, 2736, 2771, 2807, 2842, 2869, + 2878, 2890, 2931, 2974, 3003, 3058, 3088, 3140, + 3188, 3240, 3275, 3316, 3366, 3400, 3466, 3513, + 3546, 3601, 3647, 3680, 3710, 3744, 3791, 3830, + 3884, 3928, 3981, 4012, 4048, 4082, 4118, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 4139, 4143, 4170, 4216, 4272, 4306, 4353, 4382, + 4439, 4452, 4528, 4559, 4586, 4604, 4613, 4692, + 4700, 4727, 4772, 4800, 4829, 4841, 4897, 4957, + 4968, 4984, 5004, 5029, 5055, 5118, 5182, 5254, + 5291, 5355, 5422, 5489, 5554, 5622, 5693, 5775, + 5841, 5905, 5969, 6035, 6100, 6136, 6172, 6208, + 6262, 6311, 6382, 6441, 6501, 6562, 6619, 6677, + 6723, 6789, 6849, 6909, 6971, 7032, 7095, 7143, + 7207, 7257, 7305, 7356, 7403, 7452, 7505, 7552, + 7590, 7627, 7663, 7702, 7740, 7776, 7813, 7852, + 7890, 7934, 7986, 8026, 8065, 8107, 8144, 8185, + 8212, 8253, 8311, 8366, 8423, 8478, 8538, 8603, +}; + +//***************************************************************************** +// +// The font definition for the 30 point Oldstandard italic font. +// +//***************************************************************************** +const tFontEx g_sFontExOldstandard30i = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 32, + + // + // The height of the font. + // + 38, + + // + // The baseline of the font. + // + 29, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetOldstandard30i, + + // + // A pointer to the actual font data + // + g_pui8Oldstandard30iData +}; diff --git a/third_party/fonts/ofl/fonts/fontsansand14.c b/third_party/fonts/ofl/fonts/fontsansand14.c new file mode 100644 index 0000000..2201b77 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontsansand14.c @@ -0,0 +1,528 @@ +//***************************************************************************** +// +// fontsansand14.c - Font definition for the 14pt Sansand font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://scripts.sil.org/cms/scripts/page.php? +// item_id=Andika_download +// +// Copyright (c) 2004-2008, SIL International (http://scripts.sil.org), +// with Reserved Font Names 'Andika' and 'SIL'. +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: sansand +// Size: 14 point +// Bold: no +// Italic: no +// Memory usage: 3840 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 14 point Sansand font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Sansand14Data[3639] = +{ + 5, 6, 0, 12, 96, 12, 2, 129, 17, 17, 17, 17, + 17, 17, 49, 17, 112, 11, 4, 193, 17, 17, 17, 17, + 17, 240, 240, 240, 23, 9, 240, 240, 145, 33, 81, 17, + 71, 49, 33, 81, 33, 55, 65, 17, 81, 33, 81, 33, + 240, 240, 160, 23, 7, 240, 145, 97, 69, 33, 17, 65, + 17, 67, 99, 65, 17, 65, 17, 17, 33, 17, 36, 81, + 240, 32, 33, 10, 240, 240, 178, 50, 33, 33, 33, 49, + 33, 18, 49, 33, 17, 82, 17, 145, 18, 81, 17, 33, + 65, 17, 33, 49, 33, 33, 34, 50, 240, 240, 32, 24, + 9, 240, 240, 130, 97, 33, 81, 33, 83, 114, 97, 17, + 81, 49, 17, 33, 51, 33, 50, 67, 34, 240, 208, 7, + 2, 97, 17, 17, 240, 128, 16, 4, 225, 34, 33, 34, + 33, 49, 49, 49, 49, 49, 65, 49, 65, 49, 17, 4, + 193, 50, 49, 49, 65, 49, 49, 49, 49, 49, 33, 49, + 33, 49, 48, 12, 6, 240, 81, 49, 19, 34, 53, 49, + 0, 7, 16, 13, 7, 240, 240, 241, 97, 54, 65, 97, + 97, 240, 240, 128, 8, 3, 240, 240, 98, 33, 17, 128, + 8, 6, 0, 6, 101, 240, 240, 208, 7, 3, 240, 240, + 98, 18, 160, 17, 8, 240, 241, 97, 113, 97, 113, 97, + 113, 97, 113, 97, 113, 113, 97, 240, 24, 8, 240, 240, + 67, 65, 49, 33, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 33, 49, 67, 240, 192, 15, 7, 240, 226, + 67, 97, 97, 97, 97, 97, 97, 97, 70, 240, 112, 17, + 8, 240, 240, 52, 49, 50, 113, 113, 98, 97, 97, 98, + 82, 87, 240, 160, 16, 7, 240, 228, 113, 97, 82, 50, + 114, 97, 97, 17, 50, 35, 240, 144, 20, 8, 240, 240, + 113, 98, 81, 17, 65, 33, 50, 33, 34, 49, 39, 97, + 113, 113, 240, 176, 15, 7, 240, 214, 17, 97, 97, 100, + 114, 97, 97, 82, 20, 240, 144, 21, 8, 240, 240, 69, + 33, 113, 97, 113, 20, 34, 50, 17, 81, 17, 81, 33, + 50, 51, 240, 192, 16, 8, 240, 240, 39, 98, 82, 97, + 98, 97, 98, 97, 113, 98, 240, 224, 23, 8, 240, 240, + 67, 65, 49, 49, 49, 49, 49, 67, 65, 49, 33, 81, + 17, 81, 18, 50, 51, 240, 192, 21, 8, 240, 240, 67, + 50, 49, 33, 81, 17, 81, 18, 50, 36, 17, 113, 97, + 113, 37, 240, 192, 8, 3, 240, 146, 18, 114, 18, 160, + 9, 3, 240, 98, 18, 162, 33, 17, 128, 13, 8, 0, + 6, 82, 51, 51, 82, 131, 115, 240, 240, 176, 9, 8, + 0, 7, 7, 151, 0, 7, 16, 13, 8, 0, 6, 2, + 115, 130, 99, 50, 66, 0, 5, 96, 14, 5, 240, 84, + 65, 65, 49, 49, 65, 65, 130, 50, 240, 48, 33, 11, + 0, 7, 36, 82, 66, 49, 20, 18, 17, 18, 33, 33, + 17, 17, 49, 33, 17, 17, 49, 33, 17, 17, 34, 18, + 17, 34, 34, 49, 162, 180, 240, 24, 10, 240, 240, 226, + 115, 113, 17, 113, 33, 82, 33, 81, 49, 86, 49, 81, + 49, 81, 34, 97, 240, 240, 16, 22, 7, 240, 213, 33, + 65, 17, 65, 17, 50, 21, 33, 50, 17, 65, 17, 65, + 17, 50, 21, 240, 128, 18, 8, 240, 240, 69, 34, 49, + 33, 97, 113, 113, 113, 114, 114, 49, 53, 240, 160, 25, + 9, 240, 240, 102, 49, 66, 33, 82, 17, 97, 17, 97, + 17, 97, 17, 97, 17, 81, 33, 66, 37, 240, 240, 16, + 15, 7, 240, 213, 33, 97, 97, 101, 33, 97, 97, 97, + 102, 240, 112, 15, 7, 240, 214, 17, 97, 97, 101, 33, + 97, 97, 97, 97, 240, 192, 21, 9, 240, 240, 148, 50, + 65, 33, 113, 129, 129, 52, 17, 97, 18, 81, 34, 65, + 53, 240, 224, 25, 8, 240, 240, 33, 81, 17, 81, 17, + 81, 17, 81, 23, 17, 81, 17, 81, 17, 81, 17, 81, + 17, 81, 240, 160, 15, 6, 240, 149, 49, 81, 81, 81, + 81, 81, 81, 81, 53, 240, 64, 16, 6, 240, 209, 81, + 81, 81, 81, 81, 81, 81, 17, 34, 20, 240, 80, 23, + 7, 240, 209, 50, 17, 49, 33, 33, 49, 17, 67, 67, + 65, 18, 49, 34, 33, 50, 17, 65, 240, 112, 15, 7, + 240, 209, 97, 97, 97, 97, 97, 97, 97, 97, 102, 240, + 112, 40, 10, 240, 240, 162, 82, 18, 82, 18, 82, 17, + 17, 49, 17, 17, 17, 49, 17, 17, 17, 49, 17, 17, + 33, 17, 33, 17, 33, 17, 33, 17, 33, 17, 33, 17, + 49, 49, 240, 240, 16, 30, 9, 240, 240, 97, 97, 18, + 81, 19, 65, 17, 18, 49, 17, 33, 49, 17, 49, 33, + 17, 50, 17, 17, 67, 17, 82, 17, 97, 240, 208, 24, + 9, 240, 240, 132, 65, 65, 49, 66, 17, 97, 17, 97, + 17, 97, 17, 97, 18, 65, 49, 65, 68, 240, 240, 19, + 7, 240, 213, 33, 50, 17, 65, 17, 65, 17, 50, 21, + 33, 97, 97, 97, 240, 192, 25, 10, 240, 240, 196, 81, + 65, 65, 66, 33, 97, 33, 97, 33, 97, 33, 97, 34, + 66, 49, 65, 85, 147, 240, 96, 24, 8, 240, 240, 37, + 49, 50, 33, 65, 33, 65, 33, 50, 37, 49, 33, 65, + 49, 49, 50, 33, 66, 240, 160, 17, 7, 240, 229, 17, + 65, 17, 98, 99, 99, 97, 97, 17, 50, 21, 240, 128, + 16, 8, 240, 240, 39, 65, 113, 113, 113, 113, 113, 113, + 113, 113, 240, 208, 25, 8, 240, 240, 33, 81, 17, 81, + 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, + 18, 50, 37, 240, 176, 25, 10, 240, 240, 162, 82, 33, + 81, 50, 65, 65, 50, 65, 49, 82, 33, 97, 18, 97, + 17, 115, 130, 240, 240, 64, 37, 15, 0, 7, 66, 66, + 66, 33, 66, 65, 49, 66, 65, 50, 36, 34, 65, 33, + 33, 33, 81, 33, 33, 33, 81, 33, 34, 17, 83, 67, + 98, 66, 114, 66, 0, 6, 16, 24, 8, 240, 240, 34, + 50, 33, 49, 50, 18, 65, 17, 97, 99, 81, 17, 65, + 34, 34, 50, 17, 81, 240, 160, 20, 8, 240, 240, 33, + 81, 18, 50, 33, 49, 65, 17, 83, 97, 113, 113, 113, + 113, 240, 208, 16, 8, 240, 240, 39, 98, 82, 97, 97, + 98, 97, 97, 98, 103, 240, 160, 16, 4, 195, 17, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 51, 16, + 6, 240, 50, 81, 81, 81, 97, 81, 81, 82, 81, 81, + 81, 97, 208, 16, 4, 195, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 19, 13, 7, 240, 130, 67, + 65, 33, 34, 33, 33, 65, 0, 8, 6, 10, 0, 18, + 105, 176, 7, 5, 242, 66, 66, 0, 7, 19, 7, 0, + 6, 52, 33, 49, 17, 65, 17, 65, 17, 65, 17, 50, + 35, 17, 240, 112, 22, 7, 240, 97, 97, 97, 97, 97, + 19, 34, 34, 17, 65, 17, 65, 17, 65, 17, 49, 37, + 240, 128, 13, 6, 240, 240, 227, 33, 65, 81, 81, 82, + 84, 240, 64, 22, 7, 240, 177, 97, 97, 97, 52, 33, + 49, 17, 65, 17, 65, 17, 65, 18, 34, 35, 17, 240, + 112, 15, 7, 0, 6, 36, 34, 33, 33, 65, 22, 17, + 98, 101, 240, 112, 16, 6, 240, 83, 33, 81, 81, 68, + 49, 81, 81, 81, 81, 81, 240, 112, 21, 7, 0, 6, + 52, 33, 49, 17, 65, 17, 65, 17, 65, 17, 50, 35, + 17, 97, 82, 36, 32, 23, 7, 240, 97, 97, 97, 97, + 97, 19, 34, 49, 17, 65, 17, 65, 17, 65, 17, 65, + 17, 65, 240, 112, 12, 3, 194, 18, 65, 33, 33, 33, + 33, 33, 33, 176, 16, 5, 240, 114, 50, 145, 65, 65, + 65, 65, 65, 65, 65, 65, 19, 32, 21, 6, 240, 49, + 81, 81, 81, 81, 34, 17, 18, 35, 50, 65, 17, 49, + 33, 33, 49, 240, 64, 14, 2, 97, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 112, 26, 10, 0, 8, 104, + 34, 34, 33, 17, 49, 49, 17, 49, 49, 17, 49, 49, + 17, 49, 49, 17, 49, 49, 240, 240, 16, 20, 7, 0, + 6, 17, 19, 34, 49, 17, 65, 17, 65, 17, 65, 17, + 65, 17, 65, 240, 112, 18, 7, 0, 6, 36, 34, 34, + 17, 65, 17, 65, 17, 65, 18, 34, 36, 240, 128, 21, + 7, 0, 6, 17, 19, 34, 34, 17, 65, 17, 65, 17, + 65, 17, 49, 37, 33, 97, 97, 96, 20, 7, 0, 6, + 52, 33, 49, 17, 65, 17, 65, 17, 65, 18, 34, 35, + 17, 97, 97, 97, 15, 6, 240, 240, 193, 34, 17, 17, + 50, 66, 65, 81, 81, 240, 128, 14, 6, 240, 240, 212, + 17, 82, 83, 82, 17, 49, 20, 240, 80, 14, 5, 240, + 177, 65, 52, 33, 65, 65, 65, 65, 67, 240, 16, 20, + 7, 0, 6, 17, 65, 17, 65, 17, 65, 17, 65, 17, + 65, 17, 50, 35, 17, 240, 112, 18, 8, 0, 7, 2, + 65, 33, 50, 34, 33, 65, 18, 65, 17, 83, 98, 240, + 192, 28, 11, 0, 9, 82, 49, 49, 33, 34, 49, 33, + 33, 17, 18, 33, 33, 17, 17, 66, 33, 17, 66, 50, + 66, 49, 240, 240, 96, 17, 7, 0, 6, 17, 50, 33, + 18, 51, 81, 83, 50, 18, 33, 50, 240, 112, 20, 8, + 0, 7, 2, 65, 33, 49, 50, 33, 65, 18, 65, 17, + 98, 98, 97, 98, 67, 80, 13, 7, 0, 6, 22, 81, + 82, 66, 66, 81, 86, 240, 112, 17, 5, 240, 34, 33, + 65, 65, 65, 65, 49, 66, 65, 65, 65, 65, 66, 112, + 16, 2, 97, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 48, 17, 5, 242, 81, 65, 65, 65, 65, + 81, 50, 49, 65, 65, 65, 50, 49, 48, 11, 8, 0, + 9, 19, 33, 17, 51, 0, 6, 16, 5, 9, 0, 19, + 16, 11, 2, 225, 17, 49, 17, 17, 17, 17, 17, 17, + 21, 7, 240, 240, 129, 97, 84, 33, 17, 17, 17, 33, + 49, 33, 49, 33, 69, 65, 97, 240, 32, 15, 7, 240, + 243, 49, 97, 97, 84, 65, 97, 97, 97, 86, 240, 112, + 25, 9, 240, 240, 97, 97, 33, 18, 17, 65, 33, 65, + 65, 49, 65, 65, 33, 65, 18, 17, 33, 97, 0, 5, + 96, 21, 8, 240, 240, 33, 81, 33, 49, 49, 49, 65, + 17, 81, 17, 69, 81, 85, 81, 113, 240, 208, 13, 2, + 97, 17, 17, 17, 17, 113, 17, 17, 17, 17, 48, 22, + 6, 240, 164, 17, 49, 17, 97, 83, 33, 34, 17, 49, + 18, 18, 35, 82, 81, 17, 49, 20, 32, 10, 6, 240, + 146, 17, 34, 18, 0, 8, 48, 33, 11, 0, 5, 116, + 82, 66, 49, 19, 33, 33, 18, 33, 33, 17, 17, 97, + 17, 17, 97, 17, 18, 33, 33, 33, 19, 33, 50, 66, + 84, 240, 240, 112, 15, 6, 240, 163, 33, 33, 33, 33, + 33, 18, 36, 37, 240, 240, 208, 20, 8, 0, 7, 33, + 34, 34, 33, 34, 33, 49, 33, 66, 33, 66, 33, 65, + 34, 240, 160, 10, 8, 0, 9, 7, 113, 113, 240, 240, + 176, 8, 6, 0, 6, 101, 240, 240, 208, 35, 11, 0, + 5, 116, 82, 66, 49, 20, 17, 33, 33, 33, 33, 17, + 35, 49, 17, 33, 17, 49, 17, 33, 33, 33, 33, 17, + 33, 17, 50, 66, 84, 240, 240, 112, 7, 6, 240, 245, + 0, 8, 48, 12, 4, 240, 34, 17, 17, 17, 17, 34, + 240, 240, 112, 14, 7, 240, 240, 17, 97, 97, 54, 65, + 97, 166, 240, 240, 96, 13, 5, 240, 18, 33, 33, 65, + 49, 49, 52, 240, 240, 176, 12, 5, 240, 18, 81, 65, + 34, 81, 19, 240, 240, 192, 8, 4, 225, 33, 33, 0, + 5, 112, 22, 7, 0, 6, 17, 65, 17, 65, 17, 65, + 17, 65, 17, 65, 18, 34, 20, 17, 17, 97, 97, 96, + 24, 7, 240, 214, 19, 17, 35, 17, 35, 17, 50, 17, + 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, 240, 128, + 6, 2, 240, 17, 17, 240, 7, 3, 240, 240, 193, 49, + 18, 12, 6, 240, 66, 81, 81, 81, 81, 53, 0, 6, + 16, 15, 5, 240, 98, 33, 33, 17, 33, 17, 33, 34, + 36, 240, 240, 96, 20, 8, 0, 7, 1, 34, 65, 34, + 65, 34, 50, 33, 49, 34, 33, 34, 33, 49, 240, 192, + 32, 11, 240, 240, 50, 97, 49, 81, 65, 81, 65, 65, + 81, 49, 83, 33, 18, 97, 17, 17, 81, 33, 17, 81, + 21, 49, 81, 49, 97, 240, 240, 80, 31, 11, 240, 240, + 50, 97, 49, 81, 65, 81, 65, 65, 81, 49, 83, 33, + 18, 97, 65, 65, 81, 65, 65, 65, 65, 65, 68, 33, + 240, 240, 16, 33, 11, 240, 240, 67, 65, 81, 49, 66, + 65, 97, 33, 113, 17, 83, 33, 18, 97, 17, 17, 81, + 33, 17, 81, 21, 49, 81, 49, 97, 49, 240, 240, 16, + 13, 5, 240, 240, 113, 65, 145, 65, 65, 49, 49, 65, + 83, 26, 10, 34, 146, 146, 240, 50, 115, 113, 17, 113, + 33, 82, 33, 81, 49, 86, 49, 81, 49, 81, 34, 97, + 240, 240, 16, 26, 10, 97, 129, 129, 240, 66, 115, 113, + 17, 113, 33, 82, 33, 81, 49, 86, 49, 81, 49, 81, + 34, 97, 240, 240, 16, 27, 10, 65, 131, 97, 49, 240, + 34, 115, 113, 17, 113, 33, 82, 33, 81, 49, 86, 49, + 81, 49, 81, 34, 97, 240, 240, 16, 27, 10, 210, 17, + 81, 34, 240, 34, 115, 113, 17, 113, 33, 82, 33, 81, + 49, 86, 49, 81, 49, 81, 34, 97, 240, 240, 16, 27, + 10, 194, 18, 97, 18, 240, 34, 115, 113, 17, 113, 33, + 82, 33, 81, 49, 86, 49, 81, 49, 81, 34, 97, 240, + 240, 16, 28, 10, 51, 113, 17, 115, 240, 49, 129, 17, + 113, 17, 98, 18, 81, 49, 81, 49, 71, 49, 81, 49, + 81, 34, 82, 240, 240, 16, 24, 11, 0, 6, 6, 82, + 129, 17, 129, 17, 113, 36, 65, 33, 101, 97, 49, 81, + 65, 81, 69, 240, 240, 64, 20, 9, 240, 240, 148, 50, + 65, 33, 113, 129, 129, 129, 130, 130, 50, 53, 82, 145, + 98, 64, 17, 7, 2, 97, 113, 181, 33, 97, 97, 101, + 33, 97, 97, 97, 102, 240, 112, 17, 7, 65, 81, 81, + 181, 33, 97, 97, 101, 33, 97, 97, 97, 102, 240, 112, + 19, 7, 33, 81, 17, 49, 49, 149, 33, 97, 97, 101, + 33, 97, 97, 97, 102, 240, 112, 18, 7, 129, 33, 49, + 33, 149, 33, 97, 97, 101, 33, 97, 97, 97, 102, 240, + 112, 17, 6, 2, 81, 97, 149, 49, 81, 81, 81, 81, + 81, 81, 81, 53, 240, 64, 17, 6, 65, 65, 65, 149, + 49, 81, 81, 81, 81, 81, 81, 81, 53, 240, 64, 19, + 6, 33, 65, 17, 33, 49, 117, 49, 81, 81, 81, 81, + 81, 81, 81, 53, 240, 64, 18, 6, 98, 17, 34, 17, + 133, 49, 81, 81, 81, 81, 81, 81, 81, 53, 240, 64, + 25, 10, 240, 240, 182, 65, 66, 49, 82, 33, 97, 21, + 49, 33, 97, 33, 97, 33, 81, 49, 66, 53, 240, 240, + 64, 32, 9, 178, 33, 49, 34, 193, 97, 18, 81, 19, + 65, 17, 18, 49, 17, 33, 49, 17, 49, 33, 17, 50, + 17, 17, 67, 17, 82, 17, 97, 240, 208, 25, 9, 33, + 145, 145, 244, 65, 65, 49, 66, 17, 97, 17, 97, 17, + 97, 17, 97, 18, 65, 49, 65, 68, 240, 240, 26, 9, + 81, 113, 113, 240, 20, 65, 65, 49, 66, 17, 97, 17, + 97, 17, 97, 17, 97, 18, 65, 49, 65, 68, 240, 240, + 26, 9, 50, 100, 66, 34, 212, 65, 65, 49, 66, 17, + 97, 17, 97, 17, 97, 17, 97, 18, 65, 49, 65, 68, + 240, 240, 24, 9, 178, 146, 228, 65, 65, 49, 66, 17, + 97, 17, 97, 17, 97, 17, 97, 18, 65, 49, 65, 68, + 240, 240, 26, 9, 177, 33, 81, 33, 228, 65, 65, 49, + 66, 17, 97, 17, 97, 17, 97, 17, 97, 18, 65, 49, + 65, 68, 240, 240, 13, 6, 240, 240, 193, 34, 35, 50, + 49, 33, 240, 240, 128, 29, 9, 240, 240, 49, 69, 49, + 50, 49, 51, 17, 49, 33, 17, 49, 33, 17, 33, 49, + 17, 33, 49, 19, 49, 50, 49, 53, 240, 240, 26, 8, + 18, 114, 113, 193, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 18, 50, 37, 240, 176, + 26, 8, 66, 82, 97, 193, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 18, 50, 37, + 240, 176, 28, 8, 35, 81, 17, 65, 49, 161, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 18, 50, 37, 240, 176, 27, 8, 161, 33, 65, 33, + 161, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 18, 50, 37, 240, 176, 21, 8, 66, + 97, 97, 193, 81, 18, 50, 33, 49, 65, 17, 83, 97, + 113, 113, 113, 113, 240, 208, 19, 7, 240, 209, 97, 101, + 33, 50, 17, 65, 17, 65, 17, 50, 21, 33, 97, 240, + 192, 26, 8, 240, 164, 50, 49, 33, 65, 33, 50, 33, + 33, 65, 33, 65, 34, 49, 65, 33, 81, 17, 66, 17, + 20, 240, 176, 21, 7, 240, 114, 98, 97, 196, 33, 49, + 17, 65, 17, 65, 17, 65, 17, 50, 35, 17, 240, 112, + 21, 7, 240, 162, 66, 81, 196, 33, 49, 17, 65, 17, + 65, 17, 65, 17, 50, 35, 17, 240, 112, 23, 7, 240, + 130, 81, 17, 49, 49, 164, 33, 49, 17, 65, 17, 65, + 17, 65, 17, 50, 35, 17, 240, 112, 22, 7, 240, 226, + 33, 33, 18, 180, 33, 49, 17, 65, 17, 65, 17, 65, + 17, 50, 35, 17, 240, 112, 22, 7, 240, 226, 17, 50, + 17, 180, 33, 49, 17, 65, 17, 65, 17, 65, 17, 50, + 35, 17, 240, 112, 22, 7, 240, 131, 65, 17, 67, 180, + 33, 49, 17, 65, 17, 65, 17, 65, 17, 50, 35, 17, + 240, 112, 21, 12, 0, 10, 84, 19, 49, 50, 49, 98, + 49, 58, 18, 49, 97, 50, 115, 36, 240, 240, 128, 15, + 7, 0, 6, 52, 33, 81, 97, 97, 113, 115, 66, 97, + 82, 48, 17, 7, 240, 113, 113, 113, 180, 34, 33, 33, + 65, 22, 17, 98, 101, 240, 112, 17, 7, 240, 161, 81, + 81, 196, 34, 33, 33, 65, 22, 17, 98, 101, 240, 112, + 18, 7, 240, 130, 68, 49, 33, 164, 34, 33, 33, 65, + 22, 17, 98, 101, 240, 112, 18, 7, 240, 225, 33, 49, + 33, 164, 34, 33, 33, 65, 22, 17, 98, 101, 240, 112, + 13, 4, 194, 50, 49, 113, 49, 49, 49, 49, 49, 49, + 208, 13, 4, 210, 18, 33, 113, 49, 49, 49, 49, 49, + 49, 240, 17, 6, 240, 81, 65, 17, 33, 49, 145, 81, + 81, 81, 81, 81, 81, 240, 96, 16, 5, 240, 81, 18, + 17, 18, 113, 65, 65, 65, 65, 65, 65, 240, 48, 23, + 7, 240, 114, 33, 66, 50, 17, 97, 53, 18, 34, 17, + 65, 17, 65, 17, 65, 18, 33, 52, 240, 128, 21, 7, + 240, 226, 114, 145, 19, 34, 49, 17, 65, 17, 65, 17, + 65, 17, 65, 17, 65, 240, 112, 20, 7, 240, 113, 113, + 113, 180, 34, 34, 17, 65, 17, 65, 17, 65, 18, 34, + 36, 240, 128, 20, 7, 240, 161, 81, 81, 196, 34, 34, + 17, 65, 17, 65, 17, 65, 18, 34, 36, 240, 128, 21, + 7, 240, 130, 68, 49, 33, 164, 34, 34, 17, 65, 17, + 65, 17, 65, 18, 34, 36, 240, 128, 19, 7, 240, 226, + 114, 164, 34, 34, 17, 65, 17, 65, 17, 65, 18, 34, + 36, 240, 128, 21, 7, 240, 225, 33, 49, 33, 164, 34, + 34, 17, 65, 17, 65, 17, 65, 18, 34, 36, 240, 128, + 12, 7, 240, 240, 226, 82, 54, 162, 82, 240, 240, 128, + 22, 7, 0, 6, 36, 34, 19, 17, 33, 17, 17, 17, + 33, 17, 17, 33, 18, 34, 36, 33, 240, 80, 22, 7, + 240, 113, 113, 113, 161, 65, 17, 65, 17, 65, 17, 65, + 17, 65, 17, 50, 35, 17, 240, 112, 22, 7, 240, 161, + 81, 81, 177, 65, 17, 65, 17, 65, 17, 65, 17, 65, + 17, 50, 35, 17, 240, 112, 24, 7, 240, 130, 65, 33, + 33, 65, 129, 65, 17, 65, 17, 65, 17, 65, 17, 65, + 17, 50, 35, 17, 240, 112, 23, 7, 240, 225, 33, 49, + 33, 145, 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, + 50, 35, 17, 240, 112, 22, 8, 240, 210, 97, 97, 194, + 65, 33, 49, 50, 33, 65, 18, 65, 17, 98, 98, 97, + 98, 67, 80, 24, 7, 240, 97, 97, 97, 97, 97, 19, + 34, 34, 17, 65, 17, 65, 17, 65, 17, 49, 37, 33, + 97, 97, 96, 24, 8, 240, 240, 50, 18, 50, 18, 162, + 65, 33, 49, 50, 33, 65, 18, 65, 17, 98, 98, 97, + 98, 67, 80, +}; + +//***************************************************************************** +// +// The glyph offset table for the 14 point Sansand font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetSansand14[] = +{ + 0, 5, 17, 28, 51, 74, 107, 131, + 138, 154, 171, 183, 196, 204, 212, 219, + 236, 260, 275, 292, 308, 328, 343, 364, + 380, 403, 424, 432, 441, 454, 463, 476, + 490, 523, 547, 569, 587, 612, 627, 642, + 663, 688, 703, 719, 742, 757, 797, 827, + 851, 870, 895, 919, 936, 952, 977, 1002, + 1039, 1063, 1083, 1099, 1115, 1131, 1147, 1160, + 1166, 1173, 1192, 1214, 1227, 1249, 1264, 1280, + 1301, 1324, 1336, 1352, 1373, 1387, 1413, 1433, + 1451, 1472, 1492, 1507, 1521, 1535, 1555, 1573, + 1601, 1618, 1638, 1651, 1668, 1684, 1701, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1712, 1717, 1728, 1749, 1764, 1789, 1810, 1823, + 1845, 1855, 1888, 1903, 1923, 1933, 1941, 1976, + 1983, 1995, 2009, 2022, 2034, 2042, 2064, 2088, + 2094, 2101, 2113, 2128, 2148, 2180, 2211, 2244, + 2257, 2283, 2309, 2336, 2363, 2390, 2418, 2442, + 2462, 2479, 2496, 2515, 2533, 2550, 2567, 2586, + 2604, 2629, 2661, 2686, 2712, 2738, 2762, 2788, + 2801, 2830, 2856, 2882, 2910, 2937, 2958, 2977, + 3003, 3024, 3045, 3068, 3090, 3112, 3134, 3155, + 3170, 3187, 3204, 3222, 3240, 3253, 3266, 3283, + 3299, 3322, 3343, 3363, 3383, 3404, 3423, 3444, + 3456, 3478, 3500, 3522, 3546, 3569, 3591, 3615, +}; + +//***************************************************************************** +// +// The font definition for the 14 point Sansand font. +// +//***************************************************************************** +const tFontEx g_sFontExSansand14 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 13, + + // + // The height of the font. + // + 17, + + // + // The baseline of the font. + // + 14, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetSansand14, + + // + // A pointer to the actual font data + // + g_pui8Sansand14Data +}; diff --git a/third_party/fonts/ofl/fonts/fontsansand16.c b/third_party/fonts/ofl/fonts/fontsansand16.c new file mode 100644 index 0000000..7404672 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontsansand16.c @@ -0,0 +1,571 @@ +//***************************************************************************** +// +// fontsansand16.c - Font definition for the 16pt Sansand font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://scripts.sil.org/cms/scripts/page.php? +// item_id=Andika_download +// +// Copyright (c) 2004-2008, SIL International (http://scripts.sil.org), +// with Reserved Font Names 'Andika' and 'SIL'. +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: sansand +// Size: 16 point +// Bold: no +// Italic: no +// Memory usage: 4356 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 16 point Sansand font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Sansand16Data[4154] = +{ + 4, 6, 0, 15, 13, 3, 193, 33, 33, 33, 33, 33, + 33, 33, 130, 18, 208, 14, 5, 240, 81, 33, 17, 33, + 17, 33, 17, 33, 0, 7, 80, 25, 10, 0, 6, 82, + 33, 81, 49, 81, 34, 41, 49, 49, 81, 49, 57, 33, + 49, 81, 34, 66, 33, 0, 6, 112, 27, 8, 240, 240, + 81, 113, 86, 18, 17, 66, 17, 66, 17, 84, 99, 81, + 33, 65, 33, 17, 33, 18, 21, 97, 113, 240, 80, 38, + 11, 0, 7, 2, 66, 33, 33, 49, 49, 33, 33, 65, + 33, 33, 65, 33, 17, 98, 18, 18, 97, 17, 33, 66, + 17, 33, 65, 33, 33, 49, 49, 33, 34, 66, 0, 5, + 96, 27, 10, 0, 6, 67, 97, 49, 81, 49, 82, 18, + 99, 115, 97, 33, 81, 50, 17, 33, 67, 34, 51, 52, + 34, 240, 240, 176, 8, 2, 129, 17, 17, 17, 240, 160, + 19, 5, 240, 114, 34, 49, 50, 49, 65, 65, 65, 65, + 65, 65, 81, 65, 81, 65, 112, 19, 5, 240, 82, 66, + 65, 65, 81, 65, 65, 65, 65, 65, 65, 49, 65, 49, + 65, 128, 16, 6, 240, 177, 49, 17, 17, 35, 51, 33, + 17, 17, 49, 0, 7, 112, 14, 8, 0, 7, 49, 113, + 113, 71, 65, 113, 113, 0, 6, 64, 8, 3, 240, 240, + 194, 33, 18, 160, 8, 6, 0, 8, 37, 0, 6, 16, + 6, 2, 240, 209, 17, 144, 20, 9, 240, 240, 194, 113, + 114, 113, 114, 113, 129, 113, 129, 113, 129, 113, 129, 113, + 240, 176, 27, 9, 0, 5, 116, 65, 65, 33, 82, 17, + 97, 17, 97, 17, 97, 17, 97, 17, 97, 18, 66, 33, + 65, 68, 240, 240, 144, 18, 7, 240, 240, 114, 52, 49, + 33, 97, 97, 97, 97, 97, 97, 97, 54, 240, 224, 19, + 9, 0, 5, 100, 66, 49, 145, 129, 129, 113, 114, 98, + 98, 98, 104, 240, 240, 112, 21, 9, 0, 5, 101, 65, + 65, 129, 114, 67, 146, 145, 129, 17, 97, 18, 65, 53, + 240, 240, 144, 22, 9, 0, 6, 33, 114, 99, 82, 17, + 81, 33, 65, 49, 50, 49, 56, 97, 129, 129, 240, 240, + 144, 19, 8, 240, 240, 167, 17, 113, 113, 117, 129, 129, + 113, 113, 17, 65, 37, 240, 240, 80, 24, 9, 0, 6, + 5, 34, 113, 113, 129, 20, 50, 65, 33, 97, 17, 97, + 18, 81, 34, 49, 68, 240, 240, 144, 18, 9, 240, 240, + 248, 114, 98, 113, 114, 113, 114, 113, 114, 113, 129, 240, + 240, 192, 26, 9, 0, 5, 116, 65, 65, 49, 65, 49, + 65, 68, 65, 65, 33, 97, 17, 97, 17, 97, 33, 65, + 68, 240, 240, 144, 23, 9, 0, 5, 116, 65, 65, 33, + 97, 17, 97, 18, 66, 52, 17, 129, 129, 113, 114, 37, + 240, 240, 160, 8, 2, 240, 49, 17, 113, 17, 144, 9, + 3, 240, 145, 33, 226, 33, 18, 160, 14, 9, 0, 8, + 67, 67, 67, 82, 131, 147, 130, 0, 6, 112, 10, 9, + 0, 9, 8, 240, 72, 0, 9, 16, 14, 9, 0, 7, + 114, 131, 147, 130, 67, 67, 82, 0, 7, 80, 15, 5, + 240, 84, 65, 65, 50, 49, 49, 65, 65, 225, 65, 240, + 128, 41, 13, 0, 8, 85, 98, 66, 66, 113, 49, 36, + 34, 17, 49, 33, 49, 17, 33, 49, 49, 17, 33, 49, + 49, 17, 33, 49, 49, 17, 33, 34, 33, 49, 34, 34, + 65, 210, 197, 240, 240, 16, 26, 10, 0, 6, 82, 131, + 113, 17, 98, 18, 81, 34, 66, 49, 66, 50, 55, 34, + 81, 33, 98, 17, 113, 240, 240, 176, 26, 8, 240, 240, + 166, 33, 81, 17, 81, 17, 66, 22, 33, 66, 17, 81, + 17, 81, 17, 81, 17, 65, 37, 240, 240, 80, 20, 9, + 0, 6, 5, 34, 65, 33, 113, 129, 129, 129, 129, 145, + 130, 65, 68, 240, 240, 128, 27, 10, 0, 6, 38, 65, + 82, 33, 97, 33, 113, 17, 113, 17, 113, 17, 113, 17, + 113, 17, 97, 33, 81, 54, 240, 240, 224, 17, 7, 240, + 240, 86, 17, 97, 97, 97, 101, 33, 97, 97, 97, 102, + 240, 224, 18, 7, 240, 240, 86, 17, 97, 97, 97, 102, + 17, 97, 97, 97, 97, 240, 240, 64, 24, 10, 0, 6, + 85, 50, 81, 33, 129, 145, 145, 68, 17, 113, 17, 113, + 33, 97, 34, 66, 69, 240, 240, 192, 28, 9, 240, 240, + 241, 97, 17, 97, 17, 97, 17, 97, 17, 97, 24, 17, + 97, 17, 97, 17, 97, 17, 97, 17, 97, 240, 240, 112, + 16, 6, 240, 245, 49, 81, 81, 81, 81, 81, 81, 81, + 81, 53, 240, 160, 18, 6, 240, 240, 65, 81, 81, 81, + 81, 81, 81, 81, 81, 17, 34, 20, 240, 176, 27, 8, + 240, 240, 161, 66, 17, 50, 33, 34, 49, 18, 67, 83, + 81, 18, 65, 34, 49, 49, 49, 50, 33, 66, 240, 240, + 48, 17, 7, 240, 240, 81, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 102, 240, 224, 43, 12, 0, 7, 66, 114, + 18, 114, 19, 83, 17, 17, 81, 17, 17, 18, 50, 17, + 17, 18, 50, 17, 17, 33, 49, 33, 17, 34, 18, 33, + 17, 49, 17, 49, 17, 51, 49, 17, 51, 49, 0, 6, + 16, 34, 10, 0, 6, 33, 113, 18, 97, 19, 81, 17, + 18, 65, 17, 34, 49, 17, 49, 49, 17, 50, 33, 17, + 66, 17, 17, 83, 17, 98, 17, 113, 240, 240, 176, 27, + 10, 0, 6, 83, 82, 50, 49, 81, 33, 113, 17, 113, + 17, 113, 17, 113, 17, 113, 33, 81, 50, 50, 83, 240, + 240, 224, 23, 8, 240, 240, 165, 49, 65, 33, 81, 17, + 81, 17, 81, 17, 65, 37, 49, 113, 113, 113, 240, 240, + 144, 28, 11, 0, 7, 35, 98, 50, 65, 81, 49, 113, + 33, 113, 33, 113, 33, 113, 33, 113, 49, 82, 50, 50, + 101, 163, 240, 240, 64, 27, 9, 240, 240, 246, 49, 66, + 33, 81, 33, 81, 33, 66, 38, 49, 34, 65, 50, 49, + 65, 49, 66, 33, 82, 240, 240, 112, 20, 8, 240, 240, + 197, 18, 65, 17, 113, 116, 100, 114, 113, 113, 17, 65, + 37, 240, 240, 80, 18, 10, 0, 6, 41, 81, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 240, 240, 240, 28, 9, + 240, 240, 241, 97, 17, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 17, 97, 17, 97, 17, 97, 33, 65, 68, 240, + 240, 144, 27, 11, 0, 6, 114, 98, 33, 98, 34, 81, + 65, 66, 66, 50, 66, 49, 97, 34, 98, 17, 114, 17, + 131, 130, 0, 6, 16, 44, 16, 0, 10, 1, 82, 82, + 17, 82, 81, 34, 66, 66, 34, 52, 50, 49, 49, 33, + 49, 65, 49, 33, 49, 66, 18, 34, 18, 81, 17, 65, + 18, 81, 17, 65, 17, 97, 17, 67, 99, 82, 0, 8, + 64, 25, 9, 240, 240, 242, 66, 34, 49, 50, 34, 68, + 98, 114, 100, 81, 33, 66, 34, 34, 66, 17, 97, 240, + 240, 112, 23, 10, 0, 6, 34, 82, 34, 50, 65, 49, + 82, 18, 97, 17, 115, 129, 145, 145, 145, 145, 240, 240, + 240, 18, 9, 240, 240, 248, 114, 98, 98, 113, 114, 98, + 113, 114, 98, 120, 240, 240, 112, 19, 4, 240, 19, 17, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 51, 80, 18, 5, 240, 81, 65, 66, 65, 65, 65, 81, + 65, 65, 66, 65, 65, 65, 240, 16, 19, 4, 240, 19, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 19, 80, 17, 8, 240, 240, 66, 99, 66, 17, 65, + 34, 34, 49, 33, 66, 0, 10, 16, 7, 11, 0, 23, + 58, 240, 128, 10, 6, 240, 146, 82, 82, 82, 0, 9, + 16, 22, 8, 0, 8, 37, 33, 65, 17, 81, 17, 81, + 17, 81, 17, 66, 18, 35, 36, 17, 240, 240, 48, 26, + 8, 240, 240, 33, 113, 113, 113, 113, 20, 35, 33, 33, + 81, 17, 81, 17, 81, 17, 81, 17, 65, 37, 240, 240, + 80, 16, 7, 0, 7, 36, 33, 49, 17, 97, 97, 97, + 113, 49, 52, 240, 224, 26, 8, 240, 240, 129, 113, 113, + 113, 53, 33, 65, 17, 81, 17, 81, 17, 81, 17, 81, + 18, 50, 36, 17, 240, 240, 48, 17, 8, 0, 8, 35, + 65, 49, 33, 65, 39, 17, 113, 129, 132, 240, 240, 64, + 19, 7, 240, 240, 19, 49, 97, 97, 69, 65, 97, 97, + 97, 97, 97, 97, 240, 240, 32, 25, 8, 0, 8, 37, + 33, 65, 17, 81, 17, 81, 17, 81, 17, 81, 18, 35, + 36, 17, 113, 113, 33, 49, 52, 48, 27, 8, 240, 240, + 33, 113, 113, 113, 113, 20, 35, 34, 17, 81, 17, 81, + 17, 81, 17, 81, 17, 81, 17, 81, 240, 240, 48, 13, + 3, 242, 18, 81, 33, 33, 33, 33, 33, 33, 33, 208, + 18, 5, 240, 209, 65, 145, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 19, 32, 23, 7, 240, 209, 97, 97, + 97, 97, 50, 17, 33, 49, 17, 66, 83, 65, 18, 49, + 34, 33, 50, 240, 224, 15, 2, 129, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 144, 31, 12, 0, 12, + 1, 19, 35, 34, 50, 49, 17, 65, 65, 17, 65, 65, + 17, 65, 65, 17, 65, 65, 17, 65, 65, 17, 65, 65, + 0, 6, 16, 23, 8, 0, 8, 1, 20, 35, 34, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 240, + 240, 48, 21, 8, 0, 8, 35, 65, 49, 33, 81, 17, + 81, 17, 81, 17, 81, 33, 49, 67, 240, 240, 80, 24, + 8, 0, 8, 1, 20, 35, 33, 34, 65, 17, 81, 17, + 81, 17, 81, 18, 49, 37, 49, 113, 113, 113, 112, 23, + 8, 0, 8, 37, 33, 65, 17, 81, 17, 81, 17, 81, + 17, 81, 33, 50, 51, 17, 113, 113, 113, 113, 16, 6, + 0, 6, 1, 34, 17, 17, 50, 66, 65, 81, 81, 81, + 240, 224, 15, 7, 0, 7, 21, 18, 82, 84, 84, 82, + 17, 50, 21, 240, 240, 17, 7, 240, 240, 113, 97, 97, + 70, 49, 97, 97, 97, 97, 97, 115, 240, 224, 23, 8, + 0, 8, 1, 81, 17, 81, 17, 81, 17, 81, 17, 81, + 17, 66, 18, 35, 36, 17, 240, 240, 48, 21, 9, 0, + 9, 2, 66, 33, 66, 34, 49, 65, 34, 65, 33, 82, + 17, 99, 98, 240, 240, 160, 32, 12, 0, 12, 1, 50, + 50, 17, 50, 49, 33, 50, 49, 34, 18, 17, 18, 49, + 17, 33, 17, 65, 17, 33, 17, 67, 50, 66, 66, 0, + 6, 48, 21, 8, 0, 8, 2, 50, 33, 34, 50, 17, + 82, 98, 82, 17, 50, 34, 34, 50, 240, 240, 48, 23, + 9, 0, 9, 2, 66, 33, 66, 34, 49, 65, 34, 65, + 33, 82, 17, 99, 98, 129, 114, 113, 83, 96, 14, 7, + 0, 7, 6, 81, 82, 81, 81, 82, 81, 86, 240, 224, + 20, 5, 240, 49, 35, 33, 65, 65, 65, 65, 50, 49, + 81, 65, 65, 65, 65, 65, 82, 96, 18, 2, 129, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 48, 19, 5, 241, 67, 65, 65, 65, 65, 65, 66, + 65, 49, 65, 65, 65, 65, 65, 34, 128, 11, 9, 0, + 11, 51, 49, 17, 52, 0, 9, 16, 4, 10, 0, 25, + 14, 3, 240, 98, 18, 113, 33, 33, 33, 33, 33, 33, + 33, 80, 24, 7, 240, 240, 241, 97, 84, 35, 17, 17, + 33, 49, 33, 49, 33, 49, 33, 67, 17, 51, 81, 97, + 240, 32, 18, 8, 240, 240, 196, 50, 97, 113, 113, 101, + 65, 113, 113, 113, 103, 240, 240, 48, 27, 10, 0, 6, + 33, 113, 33, 19, 17, 65, 49, 65, 81, 49, 81, 49, + 81, 65, 49, 65, 19, 17, 33, 113, 0, 7, 80, 24, + 9, 240, 240, 242, 81, 33, 66, 34, 49, 65, 34, 66, + 17, 97, 17, 70, 54, 97, 129, 129, 240, 240, 160, 15, + 2, 129, 17, 17, 17, 17, 17, 113, 17, 17, 17, 17, + 17, 48, 25, 7, 240, 240, 116, 33, 49, 18, 98, 98, + 68, 49, 34, 33, 49, 34, 33, 51, 82, 98, 97, 33, + 49, 36, 32, 10, 6, 240, 242, 18, 18, 18, 0, 9, + 112, 34, 12, 0, 7, 117, 97, 81, 65, 35, 33, 33, + 33, 97, 17, 17, 113, 17, 17, 113, 17, 17, 113, 17, + 18, 97, 33, 20, 33, 65, 81, 101, 0, 6, 64, 17, + 6, 240, 240, 19, 33, 33, 33, 33, 33, 18, 34, 17, + 133, 0, 6, 16, 23, 9, 0, 9, 49, 34, 49, 49, + 50, 33, 50, 34, 50, 34, 66, 33, 81, 49, 81, 34, + 240, 240, 112, 11, 8, 0, 10, 7, 113, 113, 113, 0, + 6, 16, 8, 6, 0, 8, 37, 0, 6, 16, 39, 12, + 0, 7, 117, 97, 81, 65, 20, 33, 33, 33, 49, 33, + 17, 33, 49, 33, 17, 36, 49, 17, 33, 33, 49, 17, + 33, 34, 33, 33, 17, 49, 17, 65, 81, 101, 0, 6, + 64, 8, 7, 240, 240, 86, 0, 12, 48, 12, 5, 240, + 178, 33, 18, 17, 18, 34, 0, 7, 16, 15, 8, 240, + 240, 209, 113, 113, 71, 65, 113, 113, 199, 0, 6, 16, + 13, 5, 240, 83, 81, 65, 49, 65, 34, 52, 0, 5, + 96, 13, 5, 240, 83, 81, 65, 34, 81, 65, 19, 0, + 5, 112, 9, 5, 240, 114, 49, 49, 49, 0, 8, 25, + 8, 0, 8, 1, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 18, 50, 21, 17, 17, 113, 113, 113, 112, + 28, 8, 240, 240, 182, 20, 17, 36, 17, 36, 17, 51, + 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, + 17, 240, 240, 64, 7, 3, 240, 242, 18, 240, 160, 8, + 3, 0, 6, 1, 49, 33, 18, 14, 6, 240, 162, 49, + 17, 81, 81, 81, 81, 53, 0, 6, 112, 16, 6, 240, + 240, 19, 33, 49, 17, 49, 17, 49, 35, 133, 0, 6, + 16, 23, 9, 0, 9, 2, 34, 66, 33, 81, 49, 81, + 34, 65, 34, 49, 49, 50, 33, 50, 34, 240, 240, 144, + 36, 12, 0, 6, 2, 113, 49, 97, 65, 97, 65, 81, + 81, 65, 97, 49, 49, 36, 17, 34, 97, 33, 17, 81, + 33, 33, 81, 37, 49, 97, 49, 113, 33, 0, 5, 112, + 35, 12, 0, 6, 2, 113, 49, 97, 65, 81, 81, 81, + 81, 65, 97, 49, 19, 35, 33, 17, 33, 81, 81, 65, + 81, 81, 81, 65, 66, 65, 84, 33, 0, 5, 96, 36, + 12, 0, 6, 4, 81, 81, 65, 66, 81, 97, 49, 113, + 33, 129, 17, 49, 35, 33, 34, 97, 33, 17, 81, 33, + 33, 81, 37, 49, 97, 49, 113, 33, 0, 5, 112, 17, + 7, 0, 6, 50, 82, 209, 97, 97, 82, 81, 82, 66, + 97, 49, 37, 128, 29, 10, 18, 146, 161, 161, 240, 34, + 131, 113, 17, 98, 18, 81, 34, 66, 49, 66, 50, 55, + 34, 81, 33, 98, 17, 113, 240, 240, 176, 29, 10, 98, + 113, 129, 129, 240, 66, 131, 113, 17, 98, 18, 81, 34, + 66, 49, 66, 50, 55, 34, 81, 33, 98, 17, 113, 240, + 240, 176, 30, 10, 65, 131, 97, 34, 65, 81, 242, 131, + 113, 17, 98, 18, 81, 34, 66, 49, 66, 50, 55, 34, + 81, 33, 98, 17, 113, 240, 240, 176, 27, 10, 240, 117, + 240, 178, 131, 113, 17, 98, 18, 81, 34, 66, 49, 66, + 50, 55, 34, 81, 33, 98, 17, 113, 240, 240, 176, 29, + 10, 194, 18, 82, 18, 240, 178, 131, 113, 17, 98, 18, + 81, 34, 66, 49, 66, 50, 55, 34, 81, 33, 98, 17, + 113, 240, 240, 176, 31, 10, 65, 129, 17, 113, 17, 129, + 240, 65, 131, 113, 17, 113, 17, 98, 18, 81, 49, 66, + 50, 55, 49, 81, 34, 82, 17, 113, 240, 240, 176, 26, + 13, 0, 8, 103, 83, 161, 17, 146, 17, 145, 33, 130, + 37, 65, 49, 118, 113, 65, 98, 65, 97, 86, 0, 6, + 80, 22, 10, 0, 6, 85, 50, 65, 49, 129, 145, 145, + 145, 145, 161, 146, 66, 69, 97, 161, 145, 115, 64, 19, + 7, 2, 97, 113, 113, 166, 17, 97, 97, 97, 101, 33, + 97, 97, 97, 102, 240, 224, 19, 7, 66, 66, 66, 66, + 182, 17, 97, 97, 97, 101, 33, 97, 97, 97, 102, 240, + 224, 21, 7, 34, 67, 65, 33, 33, 65, 134, 17, 97, + 97, 97, 101, 33, 97, 97, 97, 102, 240, 224, 20, 7, + 114, 18, 34, 18, 240, 22, 17, 97, 97, 97, 101, 33, + 97, 97, 97, 102, 240, 224, 19, 6, 1, 97, 97, 97, + 133, 49, 81, 81, 81, 81, 81, 81, 81, 81, 53, 240, + 160, 19, 6, 65, 65, 65, 65, 165, 49, 81, 81, 81, + 81, 81, 81, 81, 81, 53, 240, 160, 22, 8, 49, 99, + 66, 18, 34, 50, 165, 81, 113, 113, 113, 113, 113, 113, + 113, 113, 85, 240, 240, 64, 19, 6, 98, 33, 18, 33, + 213, 49, 81, 81, 81, 81, 81, 81, 81, 81, 53, 240, + 160, 26, 11, 0, 7, 21, 97, 66, 65, 81, 65, 97, + 49, 97, 22, 49, 49, 97, 49, 97, 49, 81, 65, 66, + 69, 0, 6, 35, 10, 240, 117, 240, 129, 113, 18, 97, + 19, 81, 17, 18, 65, 17, 34, 49, 17, 49, 49, 17, + 50, 33, 17, 66, 17, 17, 83, 17, 98, 17, 113, 240, + 240, 176, 30, 10, 34, 145, 161, 161, 240, 35, 82, 50, + 49, 81, 33, 113, 17, 113, 17, 113, 17, 113, 17, 113, + 33, 81, 50, 50, 83, 240, 240, 224, 30, 10, 82, 129, + 129, 129, 240, 67, 82, 50, 49, 81, 33, 113, 17, 113, + 17, 113, 17, 113, 17, 113, 33, 81, 50, 50, 83, 240, + 240, 224, 32, 10, 51, 113, 17, 97, 49, 65, 81, 243, + 82, 50, 49, 81, 33, 113, 17, 113, 17, 113, 17, 113, + 17, 113, 33, 81, 50, 50, 83, 240, 240, 224, 30, 10, + 195, 17, 81, 19, 240, 179, 82, 50, 49, 81, 33, 113, + 17, 113, 17, 113, 17, 113, 17, 113, 33, 81, 50, 50, + 83, 240, 240, 224, 30, 10, 194, 18, 82, 18, 240, 179, + 82, 50, 49, 81, 33, 113, 17, 113, 17, 113, 17, 113, + 17, 113, 33, 81, 50, 50, 83, 240, 240, 224, 16, 7, + 0, 6, 17, 98, 34, 36, 66, 65, 18, 33, 50, 0, + 6, 32, 33, 10, 0, 5, 113, 85, 50, 50, 49, 52, + 17, 65, 33, 17, 50, 33, 17, 49, 49, 17, 33, 65, + 17, 33, 65, 19, 65, 50, 50, 53, 240, 240, 224, 30, + 9, 18, 130, 130, 130, 193, 97, 17, 97, 17, 97, 17, + 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, 33, + 65, 68, 240, 240, 144, 30, 9, 82, 98, 98, 98, 225, + 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, + 97, 17, 97, 17, 97, 33, 65, 68, 240, 240, 144, 32, + 9, 50, 100, 66, 34, 49, 65, 177, 97, 17, 97, 17, + 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, + 97, 33, 65, 68, 240, 240, 144, 31, 9, 162, 18, 66, + 18, 240, 97, 97, 17, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 17, 97, 17, 97, 17, 97, 33, 65, 68, 240, + 240, 144, 26, 10, 97, 129, 129, 129, 240, 18, 82, 34, + 50, 65, 49, 82, 18, 97, 17, 115, 129, 145, 145, 145, + 145, 240, 240, 240, 23, 8, 240, 240, 161, 113, 117, 49, + 65, 33, 81, 17, 81, 17, 81, 17, 65, 37, 49, 113, + 240, 240, 144, 30, 9, 240, 240, 132, 65, 50, 33, 81, + 33, 66, 33, 50, 49, 49, 65, 49, 65, 66, 33, 82, + 17, 97, 17, 97, 17, 36, 240, 240, 128, 25, 8, 240, + 240, 50, 114, 129, 213, 33, 65, 17, 81, 17, 81, 17, + 81, 17, 66, 18, 35, 36, 17, 240, 240, 48, 25, 8, + 240, 240, 114, 82, 82, 213, 33, 65, 17, 81, 17, 81, + 17, 81, 17, 66, 18, 35, 36, 17, 240, 240, 48, 27, + 8, 240, 240, 82, 82, 17, 49, 65, 181, 33, 65, 17, + 81, 17, 81, 17, 81, 17, 66, 18, 35, 36, 17, 240, + 240, 48, 26, 8, 240, 240, 179, 33, 33, 34, 197, 33, + 65, 17, 81, 17, 81, 17, 81, 17, 66, 18, 35, 36, + 17, 240, 240, 48, 26, 8, 240, 240, 178, 33, 50, 33, + 197, 33, 65, 17, 81, 17, 81, 17, 81, 17, 66, 18, + 35, 36, 17, 240, 240, 48, 26, 8, 240, 240, 82, 81, + 33, 83, 197, 33, 65, 17, 81, 17, 81, 17, 81, 17, + 66, 18, 35, 36, 17, 240, 240, 48, 24, 13, 0, 13, + 20, 36, 49, 50, 50, 98, 65, 43, 18, 50, 97, 66, + 98, 36, 49, 35, 53, 0, 6, 80, 19, 7, 0, 7, + 36, 33, 49, 17, 97, 97, 97, 113, 49, 52, 49, 114, + 97, 66, 48, 20, 8, 240, 240, 49, 129, 129, 227, 65, + 49, 33, 65, 39, 17, 113, 129, 132, 240, 240, 64, 20, + 8, 240, 240, 98, 82, 82, 227, 65, 49, 33, 65, 39, + 17, 113, 129, 132, 240, 240, 64, 22, 8, 240, 240, 66, + 82, 17, 65, 49, 195, 65, 49, 33, 65, 39, 17, 113, + 129, 132, 240, 240, 64, 21, 8, 240, 240, 178, 18, 50, + 18, 195, 65, 49, 33, 65, 39, 17, 113, 129, 132, 240, + 240, 64, 16, 4, 240, 18, 50, 49, 113, 49, 49, 49, + 49, 49, 49, 49, 240, 32, 16, 4, 240, 34, 18, 33, + 113, 49, 49, 49, 49, 49, 49, 49, 240, 64, 18, 6, + 240, 177, 65, 17, 33, 49, 145, 81, 81, 81, 81, 81, + 81, 81, 240, 192, 17, 6, 240, 241, 34, 17, 34, 145, + 81, 81, 81, 81, 81, 81, 81, 240, 192, 27, 8, 240, + 177, 116, 82, 81, 33, 113, 67, 17, 33, 50, 17, 81, + 17, 81, 17, 81, 17, 81, 33, 49, 67, 240, 240, 80, + 25, 8, 240, 240, 179, 115, 161, 20, 35, 34, 17, 81, + 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 240, 240, + 48, 24, 8, 240, 240, 50, 114, 114, 211, 65, 49, 33, + 81, 17, 81, 17, 81, 17, 81, 33, 49, 67, 240, 240, + 80, 24, 8, 240, 240, 98, 82, 97, 227, 65, 49, 33, + 81, 17, 81, 17, 81, 17, 81, 33, 49, 67, 240, 240, + 80, 26, 8, 240, 240, 67, 81, 17, 65, 49, 195, 65, + 49, 33, 81, 17, 81, 17, 81, 17, 81, 33, 49, 67, + 240, 240, 80, 23, 8, 240, 240, 179, 115, 195, 65, 49, + 33, 81, 17, 81, 17, 81, 17, 81, 33, 49, 67, 240, + 240, 80, 25, 8, 240, 240, 178, 18, 50, 18, 195, 65, + 49, 33, 81, 17, 81, 17, 81, 17, 81, 33, 49, 67, + 240, 240, 80, 12, 8, 0, 7, 50, 98, 183, 194, 98, + 0, 6, 48, 27, 8, 0, 7, 81, 68, 49, 35, 17, + 49, 17, 17, 33, 33, 17, 18, 33, 17, 17, 49, 19, + 33, 52, 49, 240, 240, 16, 26, 8, 240, 240, 49, 130, + 114, 177, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 66, 18, 35, 36, 17, 240, 240, 48, 26, 8, 240, 240, + 113, 82, 82, 193, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 66, 18, 35, 36, 17, 240, 240, 48, 28, 8, + 240, 240, 67, 66, 18, 34, 65, 145, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 66, 18, 35, 36, 17, 240, + 240, 48, 27, 8, 240, 240, 178, 18, 50, 18, 161, 81, + 17, 81, 17, 81, 17, 81, 17, 81, 17, 66, 18, 35, + 36, 17, 240, 240, 48, 26, 9, 240, 240, 178, 98, 98, + 210, 66, 33, 66, 34, 49, 65, 34, 65, 33, 82, 17, + 99, 98, 129, 114, 113, 83, 96, 28, 8, 240, 240, 33, + 113, 113, 113, 113, 20, 35, 33, 34, 65, 17, 81, 17, + 81, 17, 81, 18, 49, 37, 49, 113, 113, 113, 112, 27, + 9, 0, 5, 113, 34, 65, 34, 178, 66, 33, 66, 34, + 49, 65, 34, 65, 33, 82, 17, 99, 98, 129, 114, 113, + 83, 96, +}; + +//***************************************************************************** +// +// The glyph offset table for the 16 point Sansand font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetSansand16[] = +{ + 0, 4, 17, 31, 56, 83, 121, 148, + 156, 175, 194, 210, 224, 232, 240, 246, + 266, 293, 311, 330, 351, 373, 392, 416, + 434, 460, 483, 491, 500, 514, 524, 538, + 553, 594, 620, 646, 666, 693, 710, 728, + 752, 780, 796, 814, 841, 858, 901, 935, + 962, 985, 1013, 1040, 1060, 1078, 1106, 1133, + 1177, 1202, 1225, 1243, 1262, 1280, 1299, 1316, + 1323, 1333, 1355, 1381, 1397, 1423, 1440, 1459, + 1484, 1511, 1524, 1542, 1565, 1580, 1611, 1634, + 1655, 1679, 1702, 1718, 1733, 1750, 1773, 1794, + 1826, 1847, 1870, 1884, 1904, 1922, 1941, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1952, 1956, 1970, 1994, 2012, 2039, 2063, 2078, + 2103, 2113, 2147, 2164, 2187, 2198, 2206, 2245, + 2253, 2265, 2280, 2293, 2306, 2315, 2340, 2368, + 2375, 2383, 2397, 2413, 2436, 2472, 2507, 2543, + 2560, 2589, 2618, 2648, 2675, 2704, 2735, 2761, + 2783, 2802, 2821, 2842, 2862, 2881, 2900, 2922, + 2941, 2967, 3002, 3032, 3062, 3094, 3124, 3154, + 3170, 3203, 3233, 3263, 3295, 3326, 3352, 3375, + 3405, 3430, 3455, 3482, 3508, 3534, 3560, 3584, + 3603, 3623, 3643, 3665, 3686, 3702, 3718, 3736, + 3753, 3780, 3805, 3829, 3853, 3879, 3902, 3927, + 3939, 3966, 3992, 4018, 4046, 4073, 4099, 4127, +}; + +//***************************************************************************** +// +// The font definition for the 16 point Sansand font. +// +//***************************************************************************** +const tFontEx g_sFontExSansand16 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 14, + + // + // The height of the font. + // + 20, + + // + // The baseline of the font. + // + 16, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetSansand16, + + // + // A pointer to the actual font data + // + g_pui8Sansand16Data +}; diff --git a/third_party/fonts/ofl/fonts/fontsansand18.c b/third_party/fonts/ofl/fonts/fontsansand18.c new file mode 100644 index 0000000..138da3e --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontsansand18.c @@ -0,0 +1,612 @@ +//***************************************************************************** +// +// fontsansand18.c - Font definition for the 18pt Sansand font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://scripts.sil.org/cms/scripts/page.php? +// item_id=Andika_download +// +// Copyright (c) 2004-2008, SIL International (http://scripts.sil.org), +// with Reserved Font Names 'Andika' and 'SIL'. +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: sansand +// Size: 18 point +// Bold: no +// Italic: no +// Memory usage: 4856 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 18 point Sansand font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Sansand18Data[4653] = +{ + 5, 7, 0, 19, 32, 14, 3, 242, 18, 18, 18, 18, + 18, 18, 18, 18, 114, 18, 208, 14, 5, 240, 81, 33, + 17, 33, 17, 33, 17, 33, 0, 8, 112, 27, 11, 0, + 7, 49, 49, 82, 49, 82, 34, 42, 50, 49, 82, 34, + 81, 50, 58, 34, 34, 81, 50, 81, 49, 0, 8, 112, + 30, 9, 240, 240, 145, 129, 102, 39, 34, 17, 82, 17, + 82, 17, 100, 116, 81, 19, 65, 34, 65, 34, 17, 33, + 18, 38, 97, 129, 240, 128, 43, 13, 0, 8, 35, 66, + 50, 18, 49, 66, 18, 33, 82, 18, 33, 82, 18, 17, + 98, 18, 17, 115, 17, 20, 115, 34, 81, 18, 34, 81, + 18, 34, 65, 34, 34, 65, 34, 34, 49, 68, 0, 6, + 96, 31, 11, 0, 7, 20, 98, 34, 82, 34, 82, 34, + 100, 130, 131, 114, 18, 82, 50, 17, 34, 65, 18, 18, + 67, 50, 36, 68, 34, 240, 240, 240, 8, 2, 129, 17, + 17, 17, 240, 224, 21, 6, 240, 194, 50, 66, 50, 66, + 50, 66, 66, 66, 66, 66, 66, 82, 66, 81, 82, 82, + 112, 21, 6, 240, 146, 67, 66, 82, 66, 82, 66, 66, + 66, 66, 66, 66, 50, 66, 50, 66, 50, 160, 16, 6, + 240, 177, 49, 17, 17, 20, 52, 17, 17, 17, 49, 0, + 9, 48, 15, 9, 0, 9, 50, 114, 114, 114, 72, 66, + 114, 114, 0, 7, 32, 9, 3, 0, 6, 2, 33, 18, + 17, 128, 7, 7, 0, 10, 70, 0, 8, 7, 3, 0, + 6, 2, 18, 208, 22, 9, 240, 240, 209, 129, 114, 113, + 114, 113, 114, 113, 129, 113, 129, 113, 129, 114, 113, 114, + 240, 160, 31, 10, 0, 6, 84, 66, 50, 50, 50, 34, + 82, 18, 82, 18, 82, 18, 82, 18, 82, 18, 82, 18, + 82, 34, 50, 50, 50, 69, 240, 240, 208, 21, 8, 240, + 240, 195, 68, 50, 18, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 55, 240, 240, 48, 22, 9, 0, 5, 101, 50, + 50, 33, 82, 114, 114, 99, 98, 99, 83, 98, 98, 98, + 104, 240, 240, 112, 23, 10, 0, 6, 69, 66, 51, 130, + 130, 114, 83, 162, 146, 130, 130, 17, 98, 18, 66, 53, + 240, 240, 224, 25, 10, 0, 7, 2, 115, 100, 82, 18, + 81, 34, 65, 50, 50, 50, 34, 66, 41, 114, 130, 130, + 130, 240, 240, 192, 21, 9, 240, 240, 247, 34, 114, 114, + 114, 118, 130, 130, 114, 114, 114, 17, 66, 38, 240, 240, + 144, 28, 10, 0, 6, 85, 66, 49, 50, 129, 130, 130, + 20, 51, 50, 34, 82, 18, 82, 18, 82, 34, 66, 34, + 50, 69, 240, 240, 208, 20, 10, 0, 6, 41, 130, 114, + 114, 130, 114, 130, 114, 130, 129, 130, 130, 129, 0, 5, + 112, 30, 10, 0, 6, 69, 66, 50, 34, 82, 18, 82, + 34, 50, 69, 66, 50, 34, 82, 18, 82, 18, 82, 18, + 82, 34, 50, 69, 240, 240, 208, 27, 10, 0, 6, 68, + 82, 50, 34, 66, 34, 82, 18, 82, 34, 51, 52, 18, + 130, 130, 129, 130, 49, 50, 69, 240, 240, 224, 8, 3, + 240, 242, 18, 210, 18, 208, 10, 3, 240, 242, 18, 210, + 33, 18, 17, 128, 16, 10, 0, 9, 97, 115, 83, 68, + 82, 132, 147, 148, 145, 0, 7, 80, 10, 9, 0, 10, + 24, 240, 72, 0, 10, 32, 15, 10, 0, 10, 2, 148, + 147, 147, 99, 68, 67, 113, 0, 8, 80, 20, 7, 240, + 240, 85, 33, 50, 82, 82, 66, 82, 66, 82, 82, 240, + 66, 82, 240, 240, 16, 43, 15, 0, 11, 102, 130, 67, + 82, 114, 50, 37, 19, 18, 34, 34, 34, 18, 18, 50, + 34, 18, 18, 50, 34, 18, 18, 50, 34, 18, 18, 35, + 18, 34, 35, 35, 66, 211, 211, 65, 150, 240, 240, 80, + 29, 12, 0, 8, 2, 163, 132, 129, 33, 114, 34, 98, + 34, 97, 65, 82, 66, 72, 65, 97, 50, 98, 34, 98, + 33, 130, 0, 6, 16, 30, 10, 0, 6, 38, 66, 51, + 34, 66, 34, 66, 34, 66, 34, 50, 54, 66, 66, 34, + 82, 18, 82, 18, 82, 18, 66, 39, 240, 240, 208, 22, + 11, 0, 7, 53, 66, 66, 34, 146, 130, 146, 146, 146, + 146, 147, 146, 162, 66, 70, 0, 5, 96, 31, 11, 0, + 6, 119, 66, 66, 50, 82, 34, 83, 18, 98, 18, 98, + 18, 98, 18, 98, 18, 98, 18, 82, 34, 82, 34, 66, + 54, 0, 6, 16, 20, 9, 240, 240, 247, 34, 114, 114, + 114, 114, 119, 34, 114, 114, 114, 114, 120, 240, 240, 112, + 20, 9, 240, 240, 248, 18, 114, 114, 114, 114, 119, 34, + 114, 114, 114, 114, 114, 240, 240, 208, 26, 12, 0, 8, + 6, 66, 82, 34, 162, 146, 162, 162, 162, 69, 18, 114, + 34, 98, 34, 98, 50, 67, 71, 0, 6, 32, 32, 11, + 0, 6, 114, 98, 18, 98, 18, 98, 18, 98, 18, 98, + 18, 98, 26, 18, 98, 18, 98, 18, 98, 18, 98, 18, + 98, 18, 98, 240, 240, 240, 19, 7, 240, 240, 86, 50, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 54, 240, + 224, 21, 8, 240, 240, 242, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 17, 50, 37, 240, 240, 80, 31, 10, + 0, 6, 34, 67, 18, 66, 34, 50, 50, 34, 66, 18, + 84, 100, 98, 18, 82, 34, 66, 35, 50, 50, 50, 66, + 34, 82, 240, 240, 176, 20, 9, 240, 240, 242, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 120, 240, 240, + 112, 47, 13, 0, 8, 19, 99, 19, 99, 19, 99, 20, + 68, 18, 17, 65, 18, 18, 17, 65, 18, 18, 18, 34, + 18, 18, 33, 33, 34, 18, 33, 33, 34, 18, 36, 34, + 18, 36, 34, 18, 50, 50, 18, 50, 50, 0, 6, 80, + 38, 11, 0, 6, 114, 98, 19, 82, 19, 82, 20, 66, + 18, 18, 50, 18, 33, 50, 18, 34, 34, 18, 49, 34, + 18, 50, 18, 18, 68, 18, 83, 18, 83, 18, 98, 240, + 240, 240, 31, 12, 0, 7, 117, 98, 50, 66, 82, 49, + 113, 34, 114, 18, 114, 18, 114, 18, 114, 18, 114, 33, + 113, 50, 82, 66, 50, 101, 0, 6, 64, 26, 9, 240, + 240, 246, 50, 50, 34, 66, 18, 66, 18, 66, 18, 66, + 18, 50, 38, 50, 114, 114, 114, 114, 240, 240, 208, 32, + 13, 0, 8, 69, 114, 50, 82, 82, 65, 113, 50, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 49, 114, 50, 82, + 82, 50, 118, 196, 240, 240, 160, 31, 10, 0, 6, 38, + 66, 50, 50, 66, 34, 66, 34, 66, 34, 50, 54, 66, + 33, 82, 34, 66, 50, 50, 66, 34, 66, 34, 82, 240, + 240, 176, 22, 9, 0, 5, 117, 50, 49, 34, 114, 115, + 101, 101, 100, 114, 114, 114, 17, 66, 38, 240, 240, 144, + 20, 11, 0, 6, 122, 82, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 0, 6, 16, 32, 11, 0, 6, + 114, 98, 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, + 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, 34, 66, + 70, 0, 5, 112, 30, 12, 0, 7, 66, 114, 34, 98, + 34, 98, 49, 82, 66, 66, 66, 66, 81, 50, 98, 34, + 98, 33, 129, 18, 132, 131, 162, 0, 6, 80, 48, 18, + 0, 11, 33, 98, 98, 18, 82, 82, 34, 83, 66, 34, + 68, 66, 49, 65, 33, 65, 66, 49, 33, 50, 66, 34, + 34, 34, 81, 34, 34, 34, 81, 33, 65, 33, 98, 17, + 68, 100, 68, 114, 98, 130, 98, 0, 9, 80, 29, 11, + 0, 6, 114, 82, 50, 66, 50, 50, 82, 18, 116, 115, + 131, 132, 98, 18, 97, 50, 66, 50, 50, 82, 34, 98, + 240, 240, 240, 25, 11, 0, 6, 114, 98, 18, 98, 34, + 66, 66, 34, 82, 34, 100, 116, 130, 146, 146, 146, 146, + 146, 0, 6, 16, 20, 10, 0, 6, 41, 115, 114, 114, + 130, 114, 114, 130, 114, 129, 130, 114, 137, 240, 240, 176, + 21, 5, 240, 84, 18, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 52, 96, 20, 6, 240, + 145, 82, 66, 81, 81, 82, 81, 81, 82, 66, 81, 81, + 82, 81, 81, 240, 64, 21, 5, 240, 84, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 20, 96, 19, 9, 240, 240, 146, 99, 97, 18, 66, 33, + 65, 50, 34, 65, 33, 82, 0, 12, 64, 6, 12, 0, + 30, 11, 208, 10, 5, 240, 81, 81, 81, 81, 0, 8, + 112, 24, 10, 0, 11, 85, 50, 50, 49, 66, 34, 66, + 34, 66, 34, 66, 34, 51, 50, 20, 52, 34, 240, 240, + 176, 29, 9, 240, 240, 98, 114, 114, 114, 114, 114, 20, + 35, 34, 35, 50, 18, 66, 18, 66, 18, 66, 18, 66, + 18, 50, 38, 240, 240, 144, 17, 9, 0, 10, 69, 34, + 98, 114, 114, 114, 114, 130, 65, 53, 240, 240, 128, 29, + 10, 0, 5, 98, 130, 130, 130, 130, 70, 50, 50, 34, + 66, 34, 66, 34, 66, 34, 66, 34, 66, 50, 35, 67, + 34, 240, 240, 176, 19, 9, 0, 10, 52, 66, 50, 18, + 66, 24, 18, 114, 114, 130, 65, 54, 240, 240, 112, 21, + 8, 240, 240, 84, 50, 98, 98, 98, 70, 66, 98, 98, + 98, 98, 98, 98, 98, 240, 240, 96, 27, 9, 0, 10, + 54, 34, 50, 33, 66, 18, 66, 18, 66, 18, 66, 18, + 66, 19, 35, 36, 18, 114, 114, 33, 50, 53, 48, 30, + 9, 240, 240, 98, 114, 114, 114, 114, 114, 20, 35, 50, + 19, 50, 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, + 18, 66, 240, 240, 112, 16, 4, 240, 82, 34, 178, 34, + 34, 34, 34, 34, 34, 34, 34, 240, 32, 21, 7, 240, + 240, 146, 82, 240, 66, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 66, 37, 32, 28, 9, 240, 240, 98, 114, + 114, 114, 114, 114, 50, 34, 34, 50, 18, 68, 84, 82, + 18, 66, 34, 50, 50, 34, 51, 240, 240, 112, 17, 3, + 194, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 208, 34, 13, 0, 14, 82, 19, 20, 35, 35, + 34, 18, 50, 50, 18, 50, 50, 18, 50, 50, 18, 50, + 50, 18, 50, 50, 18, 50, 50, 18, 50, 50, 0, 6, + 80, 25, 9, 0, 10, 18, 20, 35, 50, 19, 50, 18, + 66, 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, 240, + 240, 112, 23, 10, 0, 11, 69, 66, 50, 34, 82, 18, + 82, 18, 82, 18, 82, 18, 82, 34, 50, 69, 240, 240, + 208, 26, 9, 0, 10, 18, 19, 51, 34, 35, 50, 18, + 66, 18, 66, 18, 66, 18, 66, 19, 34, 38, 50, 114, + 114, 114, 112, 25, 9, 0, 10, 54, 34, 50, 33, 66, + 18, 66, 18, 66, 18, 66, 18, 66, 34, 35, 51, 18, + 114, 114, 114, 114, 19, 8, 0, 9, 2, 35, 18, 18, + 50, 17, 67, 83, 82, 98, 98, 98, 240, 240, 128, 17, + 7, 0, 8, 5, 18, 49, 18, 84, 69, 82, 97, 17, + 65, 21, 240, 240, 18, 7, 240, 240, 226, 82, 82, 54, + 50, 82, 82, 82, 82, 82, 82, 99, 240, 224, 25, 9, + 0, 10, 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, + 18, 66, 18, 51, 18, 36, 36, 33, 240, 240, 112, 23, + 10, 0, 11, 34, 82, 34, 66, 34, 50, 65, 50, 66, + 33, 82, 18, 97, 18, 99, 130, 240, 240, 224, 34, 13, + 0, 14, 81, 66, 50, 17, 66, 50, 18, 35, 49, 34, + 33, 18, 33, 49, 33, 33, 18, 49, 18, 33, 18, 51, + 51, 82, 66, 82, 66, 0, 6, 112, 22, 9, 0, 10, + 18, 66, 34, 34, 50, 18, 83, 114, 99, 82, 18, 65, + 50, 34, 66, 240, 240, 112, 25, 10, 0, 11, 34, 82, + 34, 66, 34, 65, 65, 50, 66, 33, 97, 18, 100, 99, + 130, 130, 129, 81, 34, 84, 96, 16, 8, 0, 9, 7, + 82, 98, 82, 82, 98, 82, 82, 103, 240, 240, 48, 22, + 7, 240, 240, 19, 51, 66, 82, 82, 82, 82, 82, 50, + 99, 82, 82, 82, 82, 82, 82, 99, 128, 20, 3, 194, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 64, 22, 7, 240, 211, 83, 82, 82, + 82, 82, 82, 82, 114, 51, 66, 82, 82, 82, 82, 82, + 51, 65, 96, 11, 10, 0, 13, 116, 49, 17, 68, 0, + 11, 48, 5, 11, 0, 30, 32, 14, 3, 240, 194, 18, + 114, 18, 18, 18, 18, 18, 18, 18, 18, 25, 8, 0, + 7, 65, 113, 100, 36, 17, 19, 17, 50, 33, 50, 33, + 50, 33, 51, 17, 70, 67, 97, 113, 240, 64, 20, 9, + 0, 6, 4, 66, 98, 114, 114, 114, 101, 82, 114, 114, + 114, 114, 104, 240, 240, 112, 29, 11, 0, 6, 113, 129, + 33, 20, 17, 65, 65, 65, 97, 49, 97, 49, 97, 49, + 97, 65, 65, 65, 20, 17, 33, 129, 0, 9, 96, 24, + 10, 0, 7, 66, 82, 33, 66, 50, 50, 50, 34, 82, + 18, 84, 87, 82, 103, 82, 130, 130, 240, 240, 240, 17, + 3, 194, 18, 18, 18, 18, 18, 18, 162, 18, 18, 18, + 18, 18, 18, 64, 28, 8, 240, 240, 182, 18, 49, 34, + 99, 99, 99, 51, 18, 34, 50, 18, 50, 19, 34, 37, + 67, 114, 114, 98, 17, 66, 21, 48, 11, 7, 240, 240, + 82, 34, 18, 34, 0, 13, 32, 39, 13, 0, 8, 84, + 114, 66, 65, 51, 33, 49, 33, 81, 33, 33, 113, 17, + 33, 113, 17, 33, 113, 17, 33, 113, 17, 49, 97, 33, + 51, 33, 49, 129, 66, 66, 116, 0, 7, 16, 19, 7, + 240, 240, 100, 34, 33, 33, 49, 33, 49, 33, 34, 50, + 17, 38, 0, 8, 112, 25, 10, 0, 11, 82, 34, 50, + 34, 50, 50, 34, 50, 50, 34, 81, 50, 66, 50, 66, + 49, 82, 34, 240, 240, 176, 11, 10, 0, 13, 105, 130, + 130, 130, 0, 8, 112, 7, 7, 0, 10, 70, 0, 8, + 43, 13, 0, 8, 84, 114, 66, 65, 129, 49, 36, 33, + 33, 49, 49, 33, 17, 49, 49, 33, 17, 52, 49, 17, + 49, 33, 49, 17, 49, 33, 49, 33, 33, 49, 17, 49, + 129, 66, 66, 116, 0, 7, 16, 8, 7, 240, 240, 198, + 0, 13, 32, 12, 5, 240, 179, 17, 33, 17, 33, 35, + 0, 8, 32, 15, 9, 0, 6, 2, 114, 114, 114, 72, + 66, 114, 114, 216, 0, 8, 14, 6, 240, 163, 97, 81, + 81, 65, 65, 66, 53, 0, 7, 80, 15, 6, 240, 163, + 97, 66, 50, 97, 81, 17, 49, 35, 0, 7, 96, 9, + 6, 240, 194, 50, 50, 50, 0, 11, 27, 9, 0, 10, + 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, + 18, 66, 19, 35, 21, 33, 18, 114, 114, 114, 112, 32, + 9, 0, 5, 103, 20, 33, 36, 33, 36, 33, 36, 33, + 51, 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, + 81, 33, 81, 33, 240, 240, 128, 8, 3, 240, 240, 50, + 18, 240, 208, 9, 5, 0, 11, 49, 82, 50, 19, 32, + 15, 6, 240, 162, 49, 17, 81, 81, 81, 81, 81, 53, + 0, 7, 80, 18, 6, 240, 240, 19, 33, 49, 17, 49, + 17, 49, 17, 49, 35, 37, 0, 7, 80, 25, 11, 0, + 12, 50, 49, 98, 34, 98, 34, 98, 34, 82, 50, 66, + 34, 66, 34, 66, 34, 66, 49, 0, 6, 16, 41, 14, + 0, 7, 18, 129, 33, 17, 113, 81, 113, 81, 97, 97, + 81, 113, 81, 113, 65, 49, 37, 17, 50, 129, 35, 113, + 34, 17, 97, 49, 33, 82, 38, 65, 113, 65, 129, 49, + 0, 6, 96, 40, 14, 0, 7, 18, 129, 33, 17, 113, + 81, 98, 81, 97, 97, 81, 113, 66, 113, 65, 19, 37, + 17, 17, 49, 98, 81, 97, 97, 81, 97, 82, 81, 97, + 81, 97, 85, 34, 0, 6, 80, 41, 13, 0, 6, 83, + 97, 97, 65, 98, 65, 82, 65, 129, 49, 129, 33, 81, + 49, 17, 49, 51, 33, 34, 113, 35, 97, 49, 17, 97, + 33, 33, 81, 53, 50, 97, 65, 113, 49, 0, 6, 32, + 18, 7, 0, 7, 34, 82, 194, 82, 82, 82, 67, 51, + 66, 82, 82, 49, 37, 128, 32, 12, 34, 178, 177, 193, + 240, 114, 163, 132, 129, 33, 114, 34, 98, 34, 97, 65, + 82, 66, 72, 65, 97, 50, 98, 34, 98, 33, 130, 0, + 6, 16, 32, 12, 114, 146, 145, 161, 240, 130, 163, 132, + 129, 33, 114, 34, 98, 34, 97, 65, 82, 66, 72, 65, + 97, 50, 98, 34, 98, 33, 130, 0, 6, 16, 34, 12, + 66, 148, 129, 33, 113, 65, 240, 82, 163, 132, 129, 33, + 114, 34, 98, 34, 97, 65, 82, 66, 72, 65, 97, 50, + 98, 34, 98, 33, 130, 0, 6, 16, 33, 12, 240, 194, + 33, 97, 35, 240, 82, 163, 132, 129, 33, 114, 34, 98, + 34, 97, 65, 82, 66, 72, 65, 97, 50, 98, 34, 98, + 33, 130, 0, 6, 16, 33, 12, 240, 178, 34, 98, 34, + 240, 82, 163, 132, 129, 33, 114, 34, 98, 34, 97, 65, + 82, 66, 72, 65, 97, 50, 98, 34, 98, 33, 130, 0, + 6, 16, 34, 13, 82, 161, 33, 145, 33, 162, 240, 146, + 164, 148, 145, 33, 130, 34, 114, 34, 113, 65, 98, 66, + 88, 81, 97, 66, 98, 49, 129, 34, 130, 0, 6, 80, + 30, 15, 0, 10, 24, 100, 177, 18, 162, 18, 161, 34, + 146, 34, 145, 54, 66, 50, 135, 129, 66, 113, 82, 113, + 82, 98, 87, 0, 7, 80, 26, 11, 0, 7, 38, 66, + 66, 34, 146, 130, 146, 146, 146, 146, 147, 146, 97, 50, + 66, 70, 98, 145, 17, 161, 131, 64, 22, 9, 3, 114, + 145, 145, 215, 34, 114, 114, 114, 114, 119, 34, 114, 114, + 114, 114, 120, 240, 240, 112, 22, 9, 82, 98, 113, 113, + 231, 34, 114, 114, 114, 114, 119, 34, 114, 114, 114, 114, + 120, 240, 240, 112, 24, 9, 50, 99, 82, 33, 50, 65, + 183, 34, 114, 114, 114, 114, 119, 34, 114, 114, 114, 114, + 120, 240, 240, 112, 23, 9, 240, 50, 34, 50, 34, 199, + 34, 114, 114, 114, 114, 119, 34, 114, 114, 114, 114, 120, + 240, 240, 112, 21, 7, 1, 113, 113, 113, 166, 50, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 54, 240, 224, + 22, 8, 82, 81, 97, 97, 214, 66, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 70, 240, 240, 64, 23, 7, + 34, 68, 34, 34, 17, 65, 134, 50, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 54, 240, 224, 21, 7, 226, + 34, 18, 34, 134, 50, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 54, 240, 224, 31, 13, 0, 8, 39, 98, + 67, 66, 98, 50, 98, 50, 114, 34, 114, 23, 50, 34, + 114, 34, 114, 34, 98, 50, 98, 50, 67, 71, 0, 7, + 16, 41, 11, 240, 162, 33, 81, 34, 242, 98, 19, 82, + 19, 82, 20, 66, 18, 18, 50, 18, 33, 50, 18, 34, + 34, 18, 49, 34, 18, 50, 18, 18, 68, 18, 83, 18, + 83, 18, 98, 240, 240, 240, 34, 12, 50, 177, 178, 178, + 240, 85, 98, 50, 66, 82, 49, 113, 34, 114, 18, 114, + 18, 114, 18, 114, 18, 114, 33, 113, 50, 82, 66, 50, + 101, 0, 6, 64, 34, 12, 113, 161, 162, 146, 240, 101, + 98, 50, 66, 82, 49, 113, 34, 114, 18, 114, 18, 114, + 18, 114, 18, 114, 33, 113, 50, 82, 66, 50, 101, 0, + 6, 64, 37, 12, 67, 145, 17, 130, 18, 98, 50, 240, + 53, 98, 50, 66, 82, 49, 113, 34, 114, 18, 114, 18, + 114, 18, 114, 18, 114, 33, 113, 50, 82, 66, 50, 101, + 0, 6, 64, 35, 12, 240, 195, 17, 113, 19, 240, 69, + 98, 50, 66, 82, 49, 113, 34, 114, 18, 114, 18, 114, + 18, 114, 18, 114, 33, 113, 50, 82, 66, 50, 101, 0, + 6, 64, 35, 12, 226, 34, 98, 34, 240, 240, 21, 98, + 50, 66, 82, 49, 113, 34, 114, 18, 114, 18, 114, 18, + 114, 18, 114, 33, 113, 50, 82, 66, 50, 101, 0, 6, + 64, 18, 8, 0, 8, 1, 114, 50, 34, 18, 66, 99, + 65, 34, 33, 66, 0, 7, 16, 40, 12, 0, 7, 2, + 86, 82, 50, 66, 67, 49, 65, 19, 18, 65, 34, 18, + 49, 50, 18, 49, 50, 18, 34, 50, 18, 33, 66, 18, + 18, 65, 51, 66, 66, 50, 86, 81, 0, 5, 96, 35, + 11, 34, 162, 162, 161, 240, 18, 98, 18, 98, 18, 98, + 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, + 18, 98, 18, 98, 34, 66, 70, 0, 5, 112, 35, 11, + 98, 130, 145, 145, 240, 34, 98, 18, 98, 18, 98, 18, + 98, 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, 18, + 98, 18, 98, 34, 66, 70, 0, 5, 112, 36, 11, 66, + 132, 98, 34, 81, 65, 226, 98, 18, 98, 18, 98, 18, + 98, 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, 18, + 98, 18, 98, 34, 66, 70, 0, 5, 112, 35, 11, 194, + 34, 82, 34, 240, 178, 98, 18, 98, 18, 98, 18, 98, + 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, 18, 98, + 18, 98, 34, 66, 70, 0, 5, 112, 28, 11, 114, 130, + 129, 145, 240, 34, 98, 18, 98, 34, 66, 66, 34, 82, + 34, 100, 116, 130, 146, 146, 146, 146, 146, 0, 6, 16, + 25, 9, 240, 240, 242, 114, 114, 118, 50, 50, 34, 66, + 18, 66, 18, 66, 18, 50, 38, 50, 114, 114, 240, 240, + 208, 34, 10, 240, 240, 196, 82, 35, 34, 66, 34, 66, + 34, 51, 34, 35, 50, 34, 66, 34, 66, 51, 34, 67, + 18, 82, 18, 82, 18, 82, 18, 36, 240, 240, 192, 29, + 10, 240, 240, 194, 145, 161, 146, 240, 37, 50, 50, 49, + 66, 34, 66, 34, 66, 34, 66, 34, 51, 50, 20, 52, + 34, 240, 240, 176, 29, 10, 240, 240, 243, 114, 114, 114, + 240, 53, 50, 50, 49, 66, 34, 66, 34, 66, 34, 66, + 34, 51, 50, 20, 52, 34, 240, 240, 176, 31, 10, 240, + 240, 211, 113, 17, 98, 33, 66, 50, 245, 50, 50, 49, + 66, 34, 66, 34, 66, 34, 66, 34, 51, 50, 20, 52, + 34, 240, 240, 176, 29, 10, 0, 6, 67, 18, 65, 34, + 240, 181, 50, 50, 49, 66, 34, 66, 34, 66, 34, 66, + 34, 51, 50, 20, 52, 34, 240, 240, 176, 29, 10, 0, + 6, 66, 18, 82, 18, 240, 181, 50, 50, 49, 66, 34, + 66, 34, 66, 34, 66, 34, 51, 50, 20, 52, 34, 240, + 240, 176, 31, 10, 240, 240, 225, 129, 17, 113, 17, 129, + 240, 53, 50, 50, 49, 66, 34, 66, 34, 66, 34, 66, + 34, 51, 50, 20, 52, 34, 240, 240, 176, 25, 15, 0, + 17, 20, 36, 65, 52, 34, 130, 65, 130, 65, 76, 19, + 50, 114, 66, 114, 52, 116, 53, 0, 7, 96, 20, 8, + 0, 9, 37, 34, 49, 18, 98, 98, 98, 98, 114, 49, + 53, 65, 130, 98, 82, 48, 23, 9, 240, 240, 114, 130, + 130, 130, 228, 66, 50, 18, 66, 24, 18, 114, 114, 130, + 65, 54, 240, 240, 112, 23, 9, 240, 240, 178, 113, 114, + 98, 244, 66, 50, 18, 66, 24, 18, 114, 114, 130, 65, + 54, 240, 240, 112, 26, 9, 240, 240, 147, 82, 17, 81, + 49, 49, 66, 196, 66, 50, 18, 66, 24, 18, 114, 114, + 130, 65, 54, 240, 240, 112, 24, 9, 0, 5, 98, 34, + 50, 34, 240, 116, 66, 50, 18, 66, 24, 18, 114, 114, + 130, 65, 54, 240, 240, 112, 18, 6, 240, 146, 82, 82, + 82, 146, 66, 66, 66, 66, 66, 66, 66, 66, 240, 176, + 18, 6, 240, 194, 50, 50, 50, 178, 66, 66, 66, 66, + 66, 66, 66, 66, 240, 192, 22, 9, 240, 240, 146, 100, + 66, 34, 34, 66, 210, 114, 114, 114, 114, 114, 114, 114, + 114, 240, 240, 160, 18, 6, 240, 241, 34, 17, 34, 226, + 66, 66, 66, 66, 66, 66, 66, 66, 240, 192, 31, 10, + 240, 240, 195, 18, 99, 100, 97, 33, 146, 68, 17, 50, + 51, 18, 82, 18, 82, 18, 82, 18, 82, 18, 81, 50, + 50, 69, 240, 240, 208, 30, 9, 0, 5, 114, 33, 49, + 34, 240, 98, 20, 35, 50, 19, 50, 18, 66, 18, 66, + 18, 66, 18, 66, 18, 66, 18, 66, 240, 240, 112, 28, + 10, 240, 240, 179, 130, 146, 146, 240, 21, 66, 50, 34, + 82, 18, 82, 18, 82, 18, 82, 18, 82, 34, 50, 69, + 240, 240, 208, 28, 10, 0, 5, 98, 114, 114, 114, 240, + 37, 66, 50, 34, 82, 18, 82, 18, 82, 18, 82, 18, + 82, 34, 50, 69, 240, 240, 208, 30, 10, 240, 240, 211, + 98, 17, 97, 49, 65, 81, 229, 66, 50, 34, 82, 18, + 82, 18, 82, 18, 82, 18, 82, 34, 50, 69, 240, 240, + 208, 28, 10, 0, 6, 66, 49, 49, 35, 240, 165, 66, + 50, 34, 82, 18, 82, 18, 82, 18, 82, 18, 82, 34, + 50, 69, 240, 240, 208, 28, 10, 0, 6, 50, 34, 66, + 34, 240, 165, 66, 50, 34, 82, 18, 82, 18, 82, 18, + 82, 18, 82, 34, 50, 69, 240, 240, 208, 13, 9, 0, + 9, 50, 114, 240, 120, 210, 114, 0, 7, 32, 30, 10, + 0, 10, 98, 69, 66, 35, 34, 49, 18, 18, 34, 18, + 18, 33, 34, 18, 18, 34, 18, 17, 50, 35, 34, 69, + 65, 240, 240, 128, 29, 9, 240, 240, 114, 130, 130, 129, + 210, 66, 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, + 18, 51, 18, 36, 36, 33, 240, 240, 112, 29, 9, 240, + 240, 178, 98, 98, 113, 226, 66, 18, 66, 18, 66, 18, + 66, 18, 66, 18, 66, 18, 51, 18, 36, 36, 33, 240, + 240, 112, 31, 9, 240, 240, 146, 100, 66, 34, 34, 66, + 162, 66, 18, 66, 18, 66, 18, 66, 18, 66, 18, 66, + 18, 51, 18, 36, 36, 33, 240, 240, 112, 30, 9, 0, + 5, 98, 34, 50, 34, 240, 82, 66, 18, 66, 18, 66, + 18, 66, 18, 66, 18, 66, 18, 51, 18, 36, 36, 33, + 240, 240, 112, 29, 10, 0, 5, 98, 114, 114, 114, 242, + 82, 34, 66, 34, 65, 65, 50, 66, 33, 97, 18, 100, + 99, 130, 130, 129, 81, 34, 84, 96, 31, 9, 240, 240, + 98, 114, 114, 114, 114, 114, 19, 51, 34, 35, 50, 18, + 66, 18, 66, 18, 66, 18, 66, 19, 34, 38, 50, 114, + 114, 114, 112, 30, 10, 0, 6, 66, 33, 82, 34, 240, + 114, 82, 34, 66, 34, 65, 65, 50, 66, 33, 97, 18, + 100, 99, 130, 130, 129, 81, 34, 84, 96, +}; + +//***************************************************************************** +// +// The glyph offset table for the 18 point Sansand font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetSansand18[] = +{ + 0, 5, 19, 33, 60, 90, 133, 164, + 172, 193, 214, 230, 245, 254, 261, 268, + 290, 321, 342, 364, 387, 412, 433, 461, + 481, 511, 538, 546, 556, 572, 582, 597, + 617, 660, 689, 719, 741, 772, 792, 812, + 838, 870, 889, 910, 941, 961, 1008, 1046, + 1077, 1103, 1135, 1166, 1188, 1208, 1240, 1270, + 1318, 1347, 1372, 1392, 1413, 1433, 1454, 1473, + 1479, 1489, 1513, 1542, 1559, 1588, 1607, 1628, + 1655, 1685, 1701, 1722, 1750, 1767, 1801, 1826, + 1849, 1875, 1900, 1919, 1936, 1954, 1979, 2002, + 2036, 2058, 2083, 2099, 2121, 2141, 2163, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2174, 2179, 2193, 2218, 2238, 2267, 2291, 2308, + 2336, 2347, 2386, 2405, 2430, 2441, 2448, 2491, + 2499, 2511, 2526, 2540, 2555, 2564, 2591, 2623, + 2631, 2640, 2655, 2673, 2698, 2739, 2779, 2820, + 2838, 2870, 2902, 2936, 2969, 3002, 3036, 3066, + 3092, 3114, 3136, 3160, 3183, 3204, 3226, 3249, + 3270, 3301, 3342, 3376, 3410, 3447, 3482, 3517, + 3535, 3575, 3610, 3645, 3681, 3716, 3744, 3769, + 3803, 3832, 3861, 3892, 3921, 3950, 3981, 4006, + 4026, 4049, 4072, 4098, 4122, 4140, 4158, 4180, + 4198, 4229, 4259, 4287, 4315, 4345, 4373, 4401, + 4414, 4444, 4473, 4502, 4533, 4563, 4592, 4623, +}; + +//***************************************************************************** +// +// The font definition for the 18 point Sansand font. +// +//***************************************************************************** +const tFontEx g_sFontExSansand18 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 16, + + // + // The height of the font. + // + 22, + + // + // The baseline of the font. + // + 18, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetSansand18, + + // + // A pointer to the actual font data + // + g_pui8Sansand18Data +}; diff --git a/third_party/fonts/ofl/fonts/fontsansand20.c b/third_party/fonts/ofl/fonts/fontsansand20.c new file mode 100644 index 0000000..d06d8e2 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontsansand20.c @@ -0,0 +1,644 @@ +//***************************************************************************** +// +// fontsansand20.c - Font definition for the 20pt Sansand font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://scripts.sil.org/cms/scripts/page.php? +// item_id=Andika_download +// +// Copyright (c) 2004-2008, SIL International (http://scripts.sil.org), +// with Reserved Font Names 'Andika' and 'SIL'. +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: sansand +// Size: 20 point +// Bold: no +// Italic: no +// Memory usage: 5236 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 20 point Sansand font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Sansand20Data[5036] = +{ + 5, 9, 0, 28, 16, 17, 4, 240, 82, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 240, 50, 240, 112, 17, 7, + 240, 240, 82, 18, 34, 18, 34, 18, 34, 18, 34, 18, + 0, 13, 48, 29, 13, 0, 10, 34, 49, 113, 50, 113, + 50, 98, 49, 75, 81, 50, 98, 49, 91, 50, 50, 98, + 49, 114, 34, 113, 50, 0, 12, 16, 31, 10, 0, 6, + 82, 130, 117, 70, 50, 18, 82, 18, 82, 18, 85, 101, + 116, 98, 18, 82, 18, 82, 18, 33, 36, 54, 114, 130, + 240, 240, 80, 45, 15, 0, 11, 52, 66, 66, 34, 49, + 82, 34, 34, 82, 34, 33, 98, 34, 17, 114, 34, 17, + 132, 17, 225, 20, 129, 18, 34, 113, 18, 34, 97, 34, + 34, 97, 34, 34, 81, 50, 34, 66, 68, 0, 9, 96, + 31, 13, 0, 10, 4, 130, 34, 114, 34, 114, 34, 132, + 147, 178, 163, 146, 18, 114, 50, 17, 66, 68, 50, 67, + 82, 36, 100, 35, 0, 8, 48, 11, 4, 240, 82, 34, + 34, 34, 34, 0, 7, 96, 25, 7, 240, 240, 33, 82, + 66, 82, 66, 82, 66, 82, 82, 82, 82, 82, 82, 82, + 98, 82, 98, 82, 98, 97, 144, 24, 7, 240, 209, 98, + 98, 82, 98, 82, 98, 82, 82, 82, 82, 82, 82, 82, + 66, 82, 66, 82, 66, 81, 208, 18, 9, 0, 6, 1, + 81, 33, 33, 39, 81, 102, 33, 33, 33, 81, 0, 15, + 32, 15, 11, 0, 12, 98, 146, 146, 105, 82, 146, 146, + 146, 0, 11, 96, 10, 5, 0, 11, 35, 65, 50, 34, + 240, 48, 8, 9, 0, 14, 87, 0, 12, 80, 7, 4, + 0, 9, 66, 240, 112, 25, 11, 0, 7, 113, 146, 146, + 145, 146, 145, 146, 145, 146, 145, 146, 145, 146, 145, 146, + 146, 145, 146, 240, 240, 16, 33, 12, 0, 9, 52, 114, + 35, 66, 66, 50, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 50, 66, 67, 35, 100, + 0, 8, 16, 23, 10, 0, 7, 99, 100, 82, 18, 81, + 34, 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, 0, + 6, 64, 23, 11, 0, 8, 54, 66, 66, 49, 98, 146, + 146, 146, 130, 131, 130, 130, 130, 130, 130, 137, 0, 7, + 16, 23, 11, 0, 8, 54, 66, 66, 162, 146, 131, 115, + 84, 163, 162, 146, 146, 146, 34, 66, 69, 0, 7, 64, + 26, 12, 0, 9, 98, 147, 132, 129, 18, 114, 18, 98, + 34, 97, 50, 82, 50, 66, 66, 74, 130, 162, 162, 162, + 0, 8, 23, 12, 0, 9, 24, 66, 162, 162, 162, 166, + 97, 67, 163, 162, 162, 162, 146, 50, 67, 70, 0, 8, + 16, 30, 12, 0, 9, 69, 82, 65, 66, 161, 162, 162, + 21, 67, 66, 50, 98, 34, 98, 34, 98, 34, 98, 50, + 81, 67, 50, 100, 0, 8, 16, 21, 12, 0, 9, 10, + 147, 146, 146, 162, 146, 162, 146, 162, 146, 162, 161, 162, + 162, 0, 8, 64, 32, 12, 0, 9, 52, 114, 34, 82, + 66, 66, 66, 66, 66, 82, 34, 116, 98, 66, 50, 98, + 34, 98, 34, 98, 34, 98, 50, 66, 100, 0, 8, 16, + 29, 12, 0, 9, 52, 98, 50, 66, 82, 50, 98, 34, + 98, 34, 98, 50, 67, 69, 18, 162, 162, 146, 162, 65, + 66, 85, 0, 8, 32, 9, 4, 0, 6, 2, 240, 178, + 240, 112, 11, 4, 240, 240, 226, 240, 178, 49, 49, 33, + 240, 17, 12, 0, 13, 17, 147, 100, 100, 99, 147, 180, + 164, 179, 177, 0, 10, 96, 10, 11, 0, 13, 105, 240, + 153, 0, 15, 48, 15, 12, 0, 13, 67, 164, 180, 164, + 132, 100, 84, 115, 0, 13, 16, 21, 8, 240, 240, 164, + 115, 98, 83, 83, 67, 82, 83, 82, 98, 98, 98, 240, + 114, 240, 240, 240, 51, 17, 0, 13, 54, 147, 66, 114, + 115, 66, 146, 66, 38, 34, 34, 34, 50, 34, 34, 18, + 66, 34, 34, 18, 66, 34, 34, 18, 66, 34, 34, 18, + 51, 34, 34, 19, 20, 18, 66, 20, 35, 82, 240, 18, + 240, 19, 65, 182, 0, 7, 16, 31, 14, 0, 11, 3, + 179, 177, 18, 146, 18, 146, 33, 145, 50, 114, 50, 114, + 66, 97, 82, 89, 82, 98, 50, 114, 50, 129, 50, 130, + 0, 9, 31, 12, 0, 9, 7, 82, 67, 50, 82, 50, + 82, 50, 82, 50, 66, 71, 82, 82, 50, 98, 34, 98, + 34, 98, 34, 98, 34, 82, 56, 0, 8, 24, 13, 0, + 10, 38, 83, 66, 50, 178, 162, 178, 178, 178, 178, 178, + 194, 178, 113, 67, 66, 102, 0, 8, 64, 33, 13, 0, + 9, 103, 98, 67, 66, 98, 50, 98, 50, 114, 34, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 34, 98, 50, 98, + 50, 67, 71, 0, 8, 112, 21, 11, 0, 8, 40, 50, + 146, 146, 146, 146, 152, 50, 146, 146, 146, 146, 146, 153, + 0, 7, 16, 20, 11, 0, 8, 41, 34, 146, 146, 146, + 146, 152, 50, 146, 146, 146, 146, 146, 146, 0, 8, 28, + 14, 0, 11, 7, 83, 67, 50, 194, 178, 194, 194, 194, + 70, 34, 130, 34, 130, 50, 114, 50, 114, 67, 67, 102, + 0, 9, 32, 34, 13, 0, 9, 98, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 43, 34, 114, 34, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 0, 8, + 48, 21, 9, 0, 6, 103, 66, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 87, 0, 5, 112, 22, 9, + 0, 7, 50, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 33, 50, 53, 0, 6, 16, 33, 12, 0, 9, + 2, 82, 50, 66, 66, 51, 66, 35, 82, 34, 98, 18, + 116, 133, 114, 19, 98, 34, 98, 50, 82, 66, 66, 82, + 50, 98, 0, 7, 96, 21, 11, 0, 8, 34, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 153, 0, + 7, 16, 52, 16, 0, 12, 3, 131, 35, 131, 36, 100, + 36, 100, 34, 17, 97, 18, 34, 18, 66, 18, 34, 18, + 66, 18, 34, 33, 65, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 49, 33, 50, 34, 52, 50, 34, 67, 50, + 34, 66, 66, 0, 10, 32, 41, 13, 0, 9, 98, 114, + 35, 98, 36, 82, 36, 82, 34, 18, 66, 34, 33, 66, + 34, 34, 50, 34, 50, 34, 34, 65, 34, 34, 66, 18, + 34, 84, 34, 84, 34, 99, 34, 114, 0, 8, 48, 33, + 14, 0, 11, 4, 130, 66, 82, 98, 66, 98, 50, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 50, 98, + 66, 98, 82, 66, 132, 0, 9, 64, 26, 11, 0, 8, + 39, 66, 66, 50, 82, 34, 82, 34, 82, 34, 82, 34, + 66, 55, 66, 146, 146, 146, 146, 146, 0, 8, 34, 15, + 0, 11, 100, 146, 66, 98, 98, 82, 98, 66, 130, 50, + 130, 50, 130, 50, 130, 50, 130, 50, 130, 66, 98, 82, + 98, 98, 66, 150, 228, 194, 0, 6, 33, 12, 0, 9, + 7, 82, 66, 66, 82, 50, 82, 50, 82, 50, 82, 50, + 66, 71, 82, 34, 98, 50, 82, 66, 66, 66, 66, 82, + 50, 98, 0, 7, 96, 23, 11, 0, 8, 70, 66, 65, + 50, 146, 147, 133, 118, 117, 132, 146, 146, 146, 34, 66, + 54, 0, 7, 64, 21, 14, 0, 10, 76, 114, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 0, 9, + 80, 33, 12, 0, 9, 2, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 50, 66, 101, 0, 8, 33, 14, + 0, 10, 66, 115, 34, 114, 50, 114, 66, 82, 82, 82, + 82, 82, 98, 50, 114, 50, 114, 50, 130, 18, 146, 18, + 161, 18, 163, 179, 0, 9, 80, 55, 20, 0, 15, 2, + 98, 98, 34, 98, 98, 34, 84, 82, 49, 84, 82, 50, + 66, 17, 66, 66, 65, 34, 50, 66, 50, 34, 50, 81, + 50, 34, 49, 98, 33, 65, 34, 98, 18, 66, 18, 113, + 18, 66, 18, 113, 17, 97, 17, 131, 99, 131, 99, 0, + 13, 16, 32, 13, 0, 9, 99, 82, 66, 82, 82, 50, + 98, 34, 130, 18, 147, 163, 163, 146, 18, 114, 34, 114, + 50, 82, 67, 51, 82, 50, 114, 0, 8, 48, 27, 14, + 0, 10, 67, 99, 50, 98, 82, 66, 98, 66, 114, 34, + 131, 18, 148, 178, 194, 194, 194, 194, 194, 194, 0, 9, + 80, 21, 12, 0, 9, 25, 147, 146, 146, 162, 146, 147, + 146, 146, 147, 146, 147, 131, 154, 0, 7, 96, 23, 6, + 240, 244, 34, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 68, 128, 23, 8, 240, + 240, 162, 113, 113, 114, 98, 113, 113, 114, 113, 113, 114, + 98, 113, 113, 114, 113, 240, 240, 64, 23, 6, 240, 244, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 36, 128, 19, 11, 0, 7, 35, + 131, 114, 18, 98, 18, 82, 50, 65, 66, 50, 82, 0, + 18, 16, 7, 14, 0, 38, 76, 240, 240, 11, 7, 240, + 240, 83, 98, 97, 113, 0, 14, 32, 26, 12, 0, 15, + 54, 82, 50, 66, 66, 50, 82, 50, 82, 50, 82, 50, + 82, 50, 67, 66, 36, 83, 50, 0, 7, 96, 31, 11, + 0, 6, 114, 146, 146, 146, 146, 146, 20, 68, 34, 51, + 66, 34, 82, 34, 82, 34, 82, 34, 82, 34, 66, 50, + 66, 54, 0, 7, 64, 19, 10, 0, 12, 117, 51, 49, + 50, 114, 130, 130, 130, 146, 130, 65, 85, 0, 6, 64, + 31, 12, 0, 8, 50, 162, 162, 162, 162, 102, 66, 51, + 66, 66, 50, 82, 50, 82, 50, 82, 50, 82, 50, 67, + 66, 36, 84, 34, 0, 7, 96, 21, 11, 0, 14, 20, + 82, 50, 65, 82, 34, 82, 41, 34, 146, 162, 146, 81, + 86, 0, 7, 16, 22, 9, 0, 6, 4, 66, 114, 114, + 114, 86, 82, 114, 114, 114, 114, 114, 114, 114, 114, 0, + 6, 32, 31, 11, 0, 14, 22, 50, 66, 50, 66, 34, + 82, 34, 82, 34, 82, 34, 82, 34, 67, 50, 36, 68, + 18, 146, 146, 49, 82, 50, 50, 85, 64, 32, 11, 0, + 6, 114, 146, 146, 146, 146, 146, 21, 52, 34, 51, 66, + 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 82, 0, 7, 16, 16, 4, 240, 146, 226, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 240, 112, 22, 8, 0, + 6, 66, 240, 242, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 82, 52, 64, 31, 10, 0, 6, 34, + 130, 130, 130, 130, 130, 51, 34, 35, 50, 34, 66, 18, + 84, 98, 18, 82, 18, 82, 34, 66, 50, 50, 66, 0, + 6, 64, 20, 4, 240, 82, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 240, 112, 37, 16, + 0, 20, 2, 20, 36, 51, 51, 50, 34, 66, 66, 34, + 66, 66, 34, 66, 66, 34, 66, 66, 34, 66, 66, 34, + 66, 66, 34, 66, 66, 34, 66, 66, 0, 10, 32, 27, + 11, 0, 13, 98, 21, 52, 34, 51, 66, 34, 82, 34, + 82, 34, 82, 34, 82, 34, 82, 34, 82, 34, 82, 0, + 7, 16, 25, 11, 0, 14, 5, 82, 50, 66, 51, 34, + 82, 34, 82, 34, 82, 34, 82, 34, 66, 66, 50, 85, + 0, 7, 48, 29, 11, 0, 13, 98, 20, 68, 34, 51, + 66, 34, 82, 34, 82, 34, 82, 34, 82, 34, 66, 51, + 50, 55, 66, 146, 146, 146, 146, 144, 29, 11, 0, 14, + 22, 51, 50, 50, 66, 34, 82, 34, 82, 34, 82, 34, + 82, 34, 67, 50, 36, 68, 18, 146, 146, 146, 146, 146, + 32, 20, 9, 0, 11, 34, 35, 34, 18, 66, 17, 83, + 99, 99, 98, 114, 114, 114, 0, 6, 64, 18, 9, 0, + 11, 69, 49, 65, 34, 115, 102, 85, 114, 129, 34, 50, + 38, 0, 6, 21, 9, 0, 8, 18, 114, 114, 87, 66, + 114, 114, 114, 114, 114, 114, 114, 33, 84, 0, 5, 112, + 27, 12, 0, 15, 2, 82, 50, 82, 50, 82, 50, 82, + 50, 82, 50, 82, 50, 82, 50, 67, 51, 36, 69, 34, + 0, 7, 96, 24, 12, 0, 15, 2, 98, 50, 82, 50, + 66, 82, 50, 82, 49, 98, 34, 114, 18, 116, 147, 146, + 0, 8, 32, 38, 16, 0, 20, 1, 81, 82, 34, 51, + 50, 50, 51, 50, 50, 49, 17, 50, 65, 34, 18, 33, + 82, 18, 33, 18, 82, 17, 49, 18, 99, 52, 99, 66, + 114, 82, 0, 10, 80, 23, 11, 0, 13, 98, 67, 50, + 50, 82, 18, 100, 131, 131, 116, 98, 34, 82, 50, 50, + 67, 0, 7, 16, 29, 12, 0, 15, 17, 98, 50, 82, + 50, 66, 82, 50, 82, 49, 113, 34, 114, 18, 114, 17, + 147, 147, 146, 162, 161, 113, 34, 116, 128, 17, 10, 0, + 12, 72, 114, 115, 114, 114, 115, 114, 114, 129, 136, 0, + 6, 64, 25, 8, 240, 240, 113, 83, 66, 98, 98, 98, + 98, 98, 98, 82, 83, 114, 98, 98, 98, 98, 98, 98, + 100, 98, 160, 23, 4, 240, 82, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 96, 25, 8, 240, 240, 33, 115, 114, 98, 98, 98, + 98, 98, 98, 114, 99, 66, 98, 98, 98, 98, 98, 98, + 68, 66, 224, 13, 12, 0, 18, 20, 65, 34, 38, 33, + 83, 0, 15, 48, 5, 13, 0, 40, 80, 16, 4, 240, + 240, 162, 226, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 96, 27, 11, 0, 11, 66, 146, 133, 71, 66, 18, 82, + 34, 82, 34, 82, 34, 82, 34, 98, 18, 119, 98, 146, + 146, 240, 240, 128, 21, 10, 0, 7, 116, 82, 114, 130, + 130, 130, 118, 82, 130, 130, 130, 130, 114, 136, 0, 6, + 64, 29, 13, 0, 11, 50, 114, 50, 19, 18, 82, 50, + 82, 82, 66, 82, 66, 82, 66, 82, 82, 50, 82, 19, + 18, 50, 114, 0, 13, 32, 27, 12, 0, 9, 2, 98, + 34, 98, 50, 66, 66, 66, 82, 34, 114, 17, 132, 104, + 114, 162, 120, 114, 162, 162, 0, 8, 32, 20, 4, 240, + 82, 34, 34, 34, 34, 34, 34, 34, 226, 34, 34, 34, + 34, 34, 34, 34, 96, 30, 9, 0, 6, 118, 34, 49, + 50, 114, 115, 131, 85, 51, 18, 50, 50, 34, 50, 35, + 34, 53, 83, 115, 115, 114, 114, 34, 50, 37, 64, 9, + 8, 0, 6, 2, 34, 0, 18, 32, 44, 16, 0, 12, + 70, 131, 66, 98, 36, 33, 81, 33, 65, 33, 49, 33, + 145, 33, 33, 145, 33, 33, 145, 33, 33, 145, 33, 34, + 129, 33, 49, 65, 49, 49, 52, 49, 66, 130, 83, 67, + 134, 0, 10, 96, 19, 8, 0, 6, 20, 50, 33, 49, + 49, 49, 49, 49, 34, 66, 17, 182, 0, 11, 32, 27, + 12, 0, 15, 65, 50, 82, 34, 82, 50, 66, 50, 66, + 50, 82, 50, 98, 50, 98, 50, 98, 49, 113, 50, 0, + 7, 96, 11, 12, 0, 19, 74, 162, 162, 162, 0, 12, + 32, 8, 9, 0, 14, 87, 0, 12, 80, 49, 16, 0, + 12, 70, 131, 66, 98, 20, 49, 81, 33, 49, 49, 49, + 49, 49, 65, 33, 49, 49, 65, 33, 52, 81, 33, 49, + 18, 81, 33, 49, 33, 81, 33, 49, 49, 65, 49, 33, + 50, 33, 66, 130, 82, 83, 134, 0, 10, 96, 8, 9, + 0, 7, 119, 0, 19, 48, 15, 7, 240, 240, 211, 49, + 49, 33, 49, 33, 49, 51, 0, 12, 80, 17, 11, 0, + 8, 82, 146, 146, 146, 105, 82, 146, 146, 240, 217, 0, + 11, 32, 16, 8, 240, 240, 180, 49, 50, 98, 98, 82, + 82, 81, 102, 0, 12, 32, 16, 7, 240, 240, 99, 113, + 97, 51, 98, 97, 97, 33, 34, 36, 0, 10, 11, 7, + 240, 240, 130, 66, 66, 66, 0, 14, 80, 30, 12, 0, + 15, 2, 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, + 82, 50, 82, 50, 67, 51, 36, 54, 34, 34, 162, 162, + 162, 162, 160, 34, 12, 0, 9, 40, 53, 18, 69, 18, + 54, 18, 69, 18, 69, 18, 99, 18, 114, 18, 114, 18, + 114, 18, 114, 18, 114, 18, 114, 18, 114, 18, 0, 7, + 112, 8, 4, 0, 6, 66, 0, 5, 96, 9, 7, 0, + 18, 65, 115, 82, 36, 48, 16, 8, 240, 240, 179, 68, + 98, 98, 98, 98, 98, 98, 70, 0, 11, 32, 18, 8, + 0, 6, 20, 50, 34, 33, 65, 33, 65, 34, 34, 52, + 182, 0, 11, 32, 27, 13, 0, 16, 34, 50, 114, 50, + 114, 50, 114, 50, 114, 35, 98, 35, 82, 50, 82, 50, + 82, 50, 82, 50, 0, 8, 112, 42, 16, 0, 10, 18, + 130, 51, 129, 82, 114, 82, 98, 98, 97, 114, 81, 130, + 66, 34, 53, 18, 35, 145, 51, 129, 49, 18, 114, 33, + 34, 98, 54, 81, 114, 81, 130, 66, 130, 65, 0, 9, + 96, 41, 17, 0, 10, 98, 129, 83, 113, 114, 113, 114, + 97, 130, 81, 146, 66, 146, 65, 35, 69, 17, 33, 34, + 130, 82, 129, 98, 113, 98, 114, 98, 113, 98, 113, 98, + 114, 102, 49, 0, 10, 48, 43, 15, 0, 9, 67, 98, + 113, 81, 129, 66, 83, 81, 145, 49, 161, 34, 97, 49, + 33, 34, 52, 33, 35, 130, 35, 129, 33, 18, 113, 33, + 34, 98, 38, 81, 98, 82, 98, 81, 114, 65, 0, 9, + 16, 18, 7, 0, 9, 2, 240, 66, 82, 82, 82, 67, + 51, 66, 82, 82, 82, 100, 144, 35, 14, 34, 210, 210, + 210, 210, 240, 147, 179, 177, 18, 146, 18, 146, 33, 145, + 50, 114, 50, 114, 66, 97, 82, 89, 82, 98, 50, 114, + 50, 129, 50, 130, 0, 9, 35, 14, 115, 178, 178, 178, + 178, 240, 179, 179, 177, 18, 146, 18, 146, 33, 145, 50, + 114, 50, 114, 66, 97, 82, 89, 82, 98, 50, 114, 50, + 129, 50, 130, 0, 9, 38, 14, 82, 179, 162, 18, 130, + 50, 113, 82, 240, 115, 179, 177, 18, 146, 18, 146, 33, + 145, 50, 114, 50, 114, 66, 97, 82, 89, 82, 98, 50, + 114, 50, 129, 50, 130, 0, 9, 37, 14, 240, 240, 19, + 33, 113, 51, 240, 240, 115, 179, 177, 18, 146, 18, 146, + 33, 145, 50, 114, 50, 114, 66, 97, 82, 89, 82, 98, + 50, 114, 50, 129, 50, 130, 0, 9, 34, 14, 240, 240, + 18, 34, 0, 6, 66, 180, 164, 161, 33, 146, 34, 130, + 34, 129, 65, 114, 66, 98, 66, 104, 82, 98, 66, 98, + 65, 129, 50, 130, 0, 9, 36, 14, 240, 66, 177, 33, + 161, 33, 178, 240, 178, 180, 164, 161, 33, 146, 34, 130, + 34, 129, 65, 114, 66, 98, 66, 104, 82, 98, 66, 98, + 50, 130, 34, 130, 0, 9, 32, 18, 0, 14, 56, 148, + 225, 18, 210, 18, 209, 34, 194, 34, 194, 39, 98, 50, + 178, 50, 168, 161, 82, 146, 82, 146, 82, 130, 104, 0, + 11, 64, 26, 14, 0, 11, 7, 83, 66, 66, 194, 178, + 194, 194, 194, 194, 194, 210, 195, 195, 67, 102, 145, 212, + 194, 194, 163, 96, 25, 11, 3, 147, 146, 177, 177, 240, + 24, 50, 146, 146, 146, 146, 152, 50, 146, 146, 146, 146, + 146, 153, 0, 7, 16, 25, 11, 98, 130, 130, 130, 145, + 240, 56, 50, 146, 146, 146, 146, 152, 50, 146, 146, 146, + 146, 146, 153, 0, 7, 16, 27, 11, 50, 147, 114, 18, + 82, 49, 66, 81, 232, 50, 146, 146, 146, 146, 152, 50, + 146, 146, 146, 146, 146, 153, 0, 7, 16, 24, 11, 240, + 130, 34, 240, 240, 120, 50, 146, 146, 146, 146, 151, 66, + 146, 146, 146, 146, 146, 153, 0, 7, 16, 24, 10, 2, + 146, 146, 146, 146, 247, 82, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 103, 0, 6, 64, 25, 10, 83, + 98, 114, 114, 114, 240, 39, 82, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 103, 0, 6, 80, 27, 11, + 50, 132, 113, 34, 81, 66, 50, 82, 231, 98, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 119, 0, 7, + 32, 23, 8, 240, 18, 34, 240, 182, 66, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 70, 240, 240, 192, + 33, 15, 0, 11, 71, 130, 67, 98, 98, 82, 98, 82, + 114, 66, 114, 39, 66, 66, 114, 66, 114, 66, 114, 66, + 98, 82, 98, 82, 67, 103, 0, 10, 16, 46, 13, 240, + 227, 33, 97, 35, 240, 240, 18, 114, 35, 98, 36, 82, + 36, 82, 34, 18, 66, 34, 33, 66, 34, 34, 50, 34, + 50, 34, 34, 65, 34, 34, 66, 18, 34, 84, 34, 84, + 34, 99, 34, 114, 0, 8, 48, 37, 14, 50, 210, 209, + 210, 210, 240, 148, 130, 66, 82, 98, 66, 98, 50, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 50, 98, + 66, 98, 82, 66, 132, 0, 9, 64, 37, 14, 114, 178, + 194, 178, 178, 240, 180, 130, 66, 82, 98, 66, 98, 50, + 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 50, + 98, 66, 98, 82, 66, 132, 0, 9, 64, 40, 14, 82, + 180, 146, 34, 129, 65, 113, 97, 240, 116, 130, 66, 82, + 98, 66, 98, 50, 130, 34, 130, 34, 130, 34, 130, 34, + 130, 34, 130, 50, 98, 66, 98, 82, 66, 132, 0, 9, + 64, 39, 14, 240, 240, 19, 33, 129, 35, 240, 240, 116, + 130, 66, 82, 98, 66, 98, 50, 130, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 50, 98, 66, 98, 82, 66, + 132, 0, 9, 64, 37, 14, 240, 240, 18, 34, 0, 6, + 52, 130, 66, 82, 98, 66, 98, 50, 130, 34, 130, 34, + 130, 34, 130, 34, 130, 34, 130, 50, 98, 66, 98, 82, + 66, 132, 0, 9, 64, 19, 10, 0, 12, 1, 50, 51, + 50, 19, 84, 99, 98, 18, 66, 50, 145, 0, 10, 48, + 42, 14, 0, 9, 113, 134, 98, 66, 82, 68, 66, 65, + 18, 50, 66, 34, 34, 65, 50, 34, 50, 50, 34, 49, + 66, 34, 34, 66, 34, 33, 82, 52, 66, 67, 82, 82, + 66, 102, 114, 0, 8, 48, 37, 12, 34, 178, 177, 178, + 178, 240, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 50, 66, 101, 0, 8, 37, 12, 98, 146, 162, + 146, 146, 240, 66, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 50, 66, 101, 0, 8, 39, 12, 66, 148, + 129, 33, 113, 65, 82, 66, 242, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 50, 66, 101, 0, 8, 36, + 12, 240, 178, 34, 240, 240, 162, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 50, 66, 101, 0, 8, 31, + 14, 130, 178, 178, 178, 178, 240, 114, 115, 50, 98, 82, + 66, 98, 66, 114, 34, 131, 18, 148, 178, 194, 194, 194, + 194, 194, 194, 0, 9, 80, 26, 11, 0, 8, 34, 146, + 146, 151, 66, 66, 50, 82, 34, 82, 34, 82, 34, 82, + 34, 66, 55, 66, 146, 146, 0, 8, 35, 12, 0, 7, + 101, 98, 50, 66, 82, 50, 82, 50, 67, 50, 51, 66, + 34, 98, 34, 98, 35, 82, 52, 50, 83, 34, 98, 34, + 98, 34, 83, 34, 36, 0, 8, 31, 12, 0, 7, 98, + 178, 178, 178, 240, 86, 82, 50, 66, 66, 50, 82, 50, + 82, 50, 82, 50, 82, 50, 67, 66, 36, 83, 50, 0, + 7, 96, 31, 12, 0, 8, 35, 131, 145, 161, 240, 118, + 82, 50, 66, 66, 50, 82, 50, 82, 50, 82, 50, 82, + 50, 67, 66, 36, 83, 50, 0, 7, 96, 33, 12, 0, + 8, 2, 148, 114, 34, 82, 66, 240, 54, 82, 50, 66, + 66, 50, 82, 50, 82, 50, 82, 50, 82, 50, 67, 66, + 36, 83, 50, 0, 7, 96, 32, 12, 0, 9, 35, 34, + 81, 35, 240, 240, 22, 82, 50, 66, 66, 50, 82, 50, + 82, 50, 82, 50, 82, 50, 67, 66, 36, 83, 50, 0, + 7, 96, 30, 12, 0, 9, 34, 34, 240, 240, 214, 82, + 50, 66, 66, 50, 82, 50, 82, 50, 82, 50, 82, 50, + 67, 66, 36, 83, 35, 0, 7, 96, 33, 12, 0, 8, + 2, 145, 33, 129, 33, 146, 240, 102, 82, 50, 66, 66, + 50, 82, 50, 82, 50, 82, 50, 82, 50, 67, 66, 36, + 83, 50, 0, 7, 96, 28, 17, 0, 21, 69, 36, 81, + 67, 50, 147, 66, 130, 82, 77, 50, 65, 146, 81, 146, + 67, 130, 52, 81, 52, 70, 0, 10, 112, 22, 10, 0, + 12, 117, 51, 49, 50, 114, 130, 130, 130, 131, 131, 49, + 70, 81, 148, 130, 130, 99, 64, 26, 11, 0, 7, 3, + 162, 161, 177, 240, 68, 82, 50, 65, 82, 34, 82, 41, + 34, 146, 162, 146, 81, 86, 0, 7, 16, 26, 11, 0, + 7, 82, 130, 130, 130, 240, 84, 82, 50, 65, 82, 34, + 82, 41, 34, 146, 162, 146, 81, 86, 0, 7, 16, 28, + 11, 0, 7, 35, 132, 98, 34, 66, 66, 240, 20, 82, + 50, 65, 82, 34, 82, 41, 34, 146, 162, 146, 81, 86, + 0, 7, 16, 25, 11, 0, 8, 66, 34, 240, 240, 148, + 82, 50, 65, 82, 34, 82, 41, 34, 146, 162, 146, 81, + 86, 0, 7, 16, 21, 7, 240, 240, 82, 98, 98, 98, + 178, 82, 82, 82, 82, 82, 82, 82, 82, 82, 240, 240, + 128, 21, 7, 240, 240, 130, 66, 66, 66, 210, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 240, 240, 144, 23, 10, + 0, 6, 82, 116, 82, 34, 50, 81, 242, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 0, 6, 112, 20, 8, 0, + 6, 2, 34, 240, 210, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 240, 240, 224, 35, 11, 0, 5, 113, 49, 98, + 18, 115, 116, 113, 34, 146, 84, 17, 66, 51, 49, 82, + 34, 82, 34, 82, 34, 82, 34, 82, 34, 81, 66, 50, + 85, 0, 7, 48, 32, 11, 0, 8, 66, 49, 65, 35, + 240, 178, 21, 52, 34, 51, 66, 34, 82, 34, 82, 34, + 82, 34, 82, 34, 82, 34, 82, 34, 82, 0, 7, 16, + 30, 11, 0, 7, 3, 146, 162, 162, 240, 53, 82, 50, + 66, 51, 34, 82, 34, 82, 34, 82, 34, 82, 34, 66, + 66, 50, 85, 0, 7, 48, 30, 11, 0, 7, 82, 130, + 130, 130, 240, 69, 82, 50, 66, 51, 34, 82, 34, 82, + 34, 82, 34, 82, 34, 66, 66, 50, 85, 0, 7, 48, + 33, 11, 0, 7, 35, 114, 17, 113, 49, 81, 81, 240, + 21, 82, 50, 66, 51, 34, 82, 34, 82, 34, 82, 34, + 82, 34, 66, 66, 50, 85, 0, 7, 48, 30, 11, 0, + 8, 66, 34, 65, 35, 240, 213, 82, 50, 66, 51, 34, + 82, 34, 82, 34, 82, 34, 82, 34, 66, 66, 50, 85, + 0, 7, 48, 29, 11, 0, 8, 66, 34, 240, 240, 133, + 82, 50, 66, 51, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 66, 66, 50, 85, 0, 7, 48, 13, 11, 0, 12, + 98, 240, 217, 240, 240, 130, 0, 11, 96, 33, 11, 0, + 13, 18, 85, 82, 35, 65, 49, 18, 34, 34, 18, 34, + 33, 34, 34, 18, 34, 34, 17, 50, 34, 17, 34, 66, + 50, 85, 81, 0, 6, 80, 32, 12, 0, 7, 82, 178, + 178, 193, 240, 50, 82, 50, 82, 50, 82, 50, 82, 50, + 82, 50, 82, 50, 82, 50, 67, 51, 36, 69, 34, 0, + 7, 96, 32, 12, 0, 8, 34, 146, 146, 146, 240, 66, + 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, + 82, 50, 67, 51, 36, 69, 34, 0, 7, 96, 34, 12, + 0, 7, 115, 130, 18, 98, 50, 66, 82, 242, 82, 50, + 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, + 67, 51, 36, 69, 34, 0, 7, 96, 31, 12, 0, 9, + 18, 34, 240, 240, 178, 82, 50, 82, 50, 82, 50, 82, + 50, 82, 50, 82, 50, 82, 50, 67, 51, 36, 68, 35, + 0, 7, 96, 34, 12, 0, 8, 35, 130, 161, 161, 240, + 81, 98, 50, 82, 50, 66, 82, 50, 82, 49, 113, 34, + 114, 18, 114, 17, 147, 147, 146, 162, 161, 113, 34, 116, + 128, 34, 11, 0, 6, 114, 146, 146, 146, 146, 146, 20, + 68, 34, 51, 66, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 66, 51, 50, 55, 66, 146, 146, 146, 146, 144, 33, + 11, 0, 8, 66, 34, 240, 240, 113, 97, 50, 66, 50, + 66, 65, 65, 82, 34, 82, 34, 97, 33, 114, 17, 116, + 130, 146, 146, 145, 97, 34, 100, 112, +}; + +//***************************************************************************** +// +// The glyph offset table for the 20 point Sansand font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetSansand20[] = +{ + 0, 5, 22, 39, 68, 99, 144, 175, + 186, 211, 235, 253, 268, 278, 286, 293, + 318, 351, 374, 397, 420, 446, 469, 499, + 520, 552, 581, 590, 601, 618, 628, 643, + 664, 715, 746, 777, 801, 834, 855, 875, + 903, 937, 958, 980, 1013, 1034, 1086, 1127, + 1160, 1186, 1220, 1253, 1276, 1297, 1330, 1363, + 1418, 1450, 1477, 1498, 1521, 1544, 1567, 1586, + 1593, 1604, 1630, 1661, 1680, 1711, 1732, 1754, + 1785, 1817, 1833, 1855, 1886, 1906, 1943, 1970, + 1995, 2024, 2053, 2073, 2091, 2112, 2139, 2163, + 2201, 2224, 2253, 2270, 2295, 2318, 2343, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2356, 2361, 2377, 2404, 2425, 2454, 2481, 2501, + 2531, 2540, 2584, 2603, 2630, 2641, 2649, 2698, + 2706, 2721, 2738, 2754, 2770, 2781, 2811, 2845, + 2853, 2862, 2878, 2896, 2923, 2965, 3006, 3049, + 3067, 3102, 3137, 3175, 3212, 3246, 3282, 3314, + 3340, 3365, 3390, 3417, 3441, 3465, 3490, 3517, + 3540, 3573, 3619, 3656, 3693, 3733, 3772, 3809, + 3828, 3870, 3907, 3944, 3983, 4019, 4050, 4076, + 4111, 4142, 4173, 4206, 4238, 4268, 4301, 4329, + 4351, 4377, 4403, 4431, 4456, 4477, 4498, 4521, + 4541, 4576, 4608, 4638, 4668, 4701, 4731, 4760, + 4773, 4806, 4838, 4870, 4904, 4935, 4969, 5003, +}; + +//***************************************************************************** +// +// The font definition for the 20 point Sansand font. +// +//***************************************************************************** +const tFontEx g_sFontExSansand20 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 17, + + // + // The height of the font. + // + 25, + + // + // The baseline of the font. + // + 20, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetSansand20, + + // + // A pointer to the actual font data + // + g_pui8Sansand20Data +}; diff --git a/third_party/fonts/ofl/fonts/fontsansand22.c b/third_party/fonts/ofl/fonts/fontsansand22.c new file mode 100644 index 0000000..ac21823 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontsansand22.c @@ -0,0 +1,678 @@ +//***************************************************************************** +// +// fontsansand22.c - Font definition for the 22pt Sansand font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://scripts.sil.org/cms/scripts/page.php? +// item_id=Andika_download +// +// Copyright (c) 2004-2008, SIL International (http://scripts.sil.org), +// with Reserved Font Names 'Andika' and 'SIL'. +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: sansand +// Size: 22 point +// Bold: no +// Italic: no +// Memory usage: 5648 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 22 point Sansand font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Sansand22Data[5446] = +{ + 5, 9, 0, 30, 48, 19, 5, 240, 243, 34, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 211, 35, 35, 240, 192, + 17, 7, 240, 240, 82, 18, 34, 18, 34, 18, 34, 18, + 34, 18, 0, 15, 16, 33, 14, 0, 12, 113, 50, 114, + 50, 114, 50, 113, 65, 76, 82, 50, 113, 65, 114, 50, + 92, 65, 65, 114, 50, 114, 50, 114, 49, 114, 50, 0, + 11, 48, 35, 11, 0, 7, 50, 146, 131, 103, 66, 18, + 17, 50, 34, 82, 34, 82, 34, 86, 117, 132, 117, 98, + 18, 98, 18, 98, 18, 34, 36, 55, 130, 146, 240, 240, + 128, 48, 16, 0, 14, 20, 82, 66, 34, 65, 82, 34, + 49, 98, 34, 49, 98, 34, 33, 114, 34, 18, 132, 33, + 226, 20, 145, 18, 34, 114, 18, 34, 113, 34, 34, 97, + 50, 34, 97, 50, 34, 81, 66, 34, 66, 84, 0, 10, + 48, 32, 14, 0, 12, 69, 130, 50, 114, 50, 114, 50, + 115, 18, 149, 163, 164, 150, 115, 34, 114, 66, 18, 50, + 84, 50, 83, 82, 53, 85, 35, 0, 9, 11, 4, 240, + 82, 34, 34, 34, 34, 0, 8, 96, 26, 7, 240, 240, + 145, 82, 66, 82, 66, 82, 66, 82, 82, 82, 82, 82, + 82, 82, 82, 98, 82, 98, 82, 98, 97, 144, 26, 7, + 240, 240, 81, 98, 98, 82, 98, 82, 98, 82, 82, 82, + 82, 82, 82, 82, 66, 82, 82, 66, 82, 66, 81, 208, + 21, 9, 0, 6, 1, 129, 33, 34, 17, 18, 52, 99, + 66, 17, 18, 33, 33, 129, 0, 16, 48, 16, 12, 0, + 15, 66, 162, 162, 162, 106, 98, 162, 162, 162, 0, 12, + 96, 10, 5, 0, 12, 67, 50, 50, 34, 240, 48, 7, + 10, 0, 18, 104, 0, 14, 9, 5, 0, 11, 115, 35, + 35, 240, 192, 27, 12, 0, 8, 81, 162, 162, 146, 162, + 146, 162, 161, 162, 161, 162, 161, 162, 161, 162, 162, 146, + 162, 161, 162, 240, 240, 64, 35, 13, 0, 11, 101, 114, + 50, 82, 82, 65, 113, 50, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 49, 98, 66, 82, 82, + 50, 117, 0, 8, 96, 23, 11, 0, 9, 115, 116, 101, + 97, 34, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 105, 0, 7, 16, 24, 12, 0, 10, 86, 82, 66, 65, + 98, 162, 162, 162, 147, 146, 147, 131, 146, 146, 146, 146, + 154, 0, 7, 96, 26, 13, 0, 11, 86, 98, 66, 81, + 98, 178, 163, 147, 116, 210, 194, 194, 178, 178, 34, 98, + 51, 66, 87, 0, 8, 96, 29, 13, 0, 12, 34, 163, + 148, 145, 18, 130, 18, 114, 34, 98, 50, 98, 50, 82, + 66, 66, 82, 75, 146, 178, 178, 178, 0, 8, 80, 24, + 12, 0, 10, 88, 66, 162, 162, 162, 166, 97, 67, 162, + 178, 162, 162, 162, 146, 50, 67, 70, 0, 8, 16, 31, + 13, 0, 11, 118, 83, 65, 66, 178, 177, 178, 178, 22, + 68, 66, 50, 114, 34, 114, 34, 114, 49, 114, 50, 82, + 82, 51, 101, 0, 8, 96, 22, 13, 0, 11, 59, 163, + 162, 162, 163, 162, 162, 178, 162, 178, 163, 162, 178, 162, + 178, 0, 9, 32, 34, 13, 0, 11, 101, 114, 50, 82, + 82, 66, 82, 66, 82, 82, 50, 117, 99, 51, 66, 82, + 50, 114, 34, 114, 34, 114, 50, 82, 67, 51, 101, 0, + 8, 96, 30, 13, 0, 11, 101, 98, 66, 66, 98, 50, + 113, 50, 114, 34, 114, 50, 68, 70, 18, 178, 178, 177, + 178, 178, 65, 67, 86, 0, 8, 112, 13, 5, 0, 7, + 67, 35, 35, 240, 115, 35, 35, 240, 192, 14, 5, 0, + 7, 67, 35, 35, 240, 195, 50, 50, 34, 240, 48, 17, + 13, 0, 15, 113, 148, 116, 101, 100, 147, 180, 181, 181, + 163, 0, 13, 32, 10, 12, 0, 16, 74, 240, 186, 0, + 18, 32, 17, 13, 0, 14, 81, 195, 181, 180, 181, 163, + 117, 100, 101, 130, 0, 14, 48, 23, 9, 0, 6, 102, + 49, 66, 114, 114, 99, 83, 98, 98, 114, 114, 114, 240, + 163, 99, 99, 0, 6, 16, 53, 18, 0, 16, 54, 163, + 82, 114, 130, 83, 146, 66, 54, 19, 34, 50, 50, 34, + 34, 34, 66, 34, 34, 34, 66, 34, 34, 34, 66, 34, + 34, 34, 51, 34, 34, 35, 20, 18, 51, 36, 35, 82, + 240, 19, 240, 19, 240, 19, 81, 183, 0, 7, 64, 33, + 15, 0, 13, 99, 195, 180, 178, 18, 162, 18, 146, 50, + 130, 50, 115, 50, 114, 82, 98, 82, 91, 66, 114, 51, + 114, 50, 146, 34, 146, 0, 9, 80, 34, 12, 0, 10, + 72, 66, 82, 50, 98, 34, 98, 34, 98, 34, 82, 56, + 66, 82, 50, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 82, 55, 0, 8, 16, 25, 14, 0, 12, 103, 98, + 67, 66, 178, 193, 194, 194, 194, 194, 194, 194, 210, 195, + 113, 67, 67, 103, 0, 9, 16, 35, 14, 0, 12, 40, + 98, 83, 66, 99, 50, 114, 50, 130, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 114, 50, 98, + 66, 82, 87, 0, 9, 80, 22, 12, 0, 10, 73, 50, + 162, 162, 162, 162, 168, 66, 162, 162, 162, 162, 162, 162, + 170, 0, 7, 96, 21, 11, 0, 9, 89, 34, 146, 146, + 146, 146, 146, 153, 34, 146, 146, 146, 146, 146, 146, 0, + 8, 30, 15, 0, 13, 103, 98, 83, 66, 194, 209, 210, + 210, 210, 86, 34, 146, 34, 146, 34, 146, 50, 130, 51, + 114, 67, 83, 103, 0, 9, 112, 35, 14, 0, 12, 34, + 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, + 130, 44, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 34, 130, 0, 9, 22, 9, 0, 7, 119, 82, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 71, 0, 5, 112, 23, 10, 0, 9, 66, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 129, 50, 50, 54, + 0, 6, 96, 35, 13, 0, 11, 50, 98, 50, 82, 66, + 66, 82, 50, 98, 34, 114, 19, 117, 132, 146, 18, 130, + 34, 114, 50, 98, 51, 82, 67, 66, 83, 50, 99, 0, + 8, 48, 22, 11, 0, 9, 82, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 153, 0, 7, 16, + 57, 17, 0, 14, 115, 147, 36, 116, 36, 116, 36, 116, + 34, 18, 82, 18, 34, 18, 82, 18, 34, 18, 82, 18, + 34, 34, 50, 34, 34, 34, 50, 34, 34, 34, 50, 34, + 34, 50, 18, 50, 34, 50, 18, 50, 34, 65, 17, 66, + 34, 67, 66, 34, 67, 66, 0, 10, 112, 43, 14, 0, + 12, 34, 130, 35, 114, 36, 98, 36, 98, 34, 18, 82, + 34, 34, 66, 34, 34, 66, 34, 50, 50, 34, 66, 34, + 34, 66, 34, 34, 82, 18, 34, 100, 34, 100, 34, 115, + 34, 130, 0, 9, 35, 15, 0, 13, 85, 146, 51, 97, + 114, 66, 114, 65, 146, 34, 146, 34, 146, 34, 146, 34, + 146, 34, 146, 34, 145, 66, 114, 66, 113, 99, 50, 149, + 0, 10, 16, 29, 12, 0, 10, 71, 82, 67, 50, 98, + 34, 98, 34, 98, 34, 98, 34, 97, 50, 82, 55, 82, + 162, 162, 162, 162, 162, 0, 8, 96, 36, 16, 0, 14, + 69, 162, 51, 113, 113, 98, 114, 81, 146, 50, 146, 50, + 146, 50, 146, 50, 146, 50, 146, 50, 146, 66, 114, 82, + 114, 99, 51, 151, 244, 0, 8, 32, 35, 13, 0, 11, + 56, 82, 82, 66, 98, 50, 98, 50, 98, 50, 98, 50, + 82, 71, 98, 50, 98, 51, 82, 66, 82, 82, 66, 83, + 50, 99, 34, 114, 0, 8, 48, 24, 12, 0, 10, 118, + 66, 66, 50, 162, 162, 164, 150, 119, 118, 147, 162, 162, + 161, 50, 82, 55, 0, 8, 16, 22, 15, 0, 13, 29, + 114, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, + 210, 210, 0, 10, 48, 36, 13, 0, 11, 50, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 34, 114, 50, 82, 67, + 51, 101, 0, 8, 96, 34, 15, 0, 13, 18, 146, 34, + 130, 51, 114, 66, 114, 66, 98, 83, 82, 98, 67, 98, + 66, 130, 50, 130, 34, 146, 34, 162, 18, 164, 180, 195, + 0, 10, 32, 57, 22, 0, 19, 34, 114, 114, 34, 114, + 114, 34, 100, 98, 50, 84, 82, 66, 82, 17, 82, 66, + 66, 34, 66, 66, 66, 34, 66, 82, 50, 34, 50, 98, + 49, 66, 34, 98, 34, 66, 34, 114, 18, 66, 33, 130, + 17, 97, 18, 132, 100, 147, 100, 147, 114, 0, 14, 64, + 32, 14, 0, 12, 35, 99, 50, 83, 82, 66, 99, 35, + 114, 34, 148, 164, 163, 180, 146, 19, 115, 34, 114, 66, + 83, 67, 66, 98, 50, 130, 0, 9, 28, 14, 0, 12, + 34, 130, 50, 99, 50, 98, 82, 66, 99, 35, 114, 34, + 148, 164, 178, 194, 194, 194, 194, 194, 194, 0, 9, 80, + 22, 13, 0, 11, 74, 163, 162, 162, 163, 162, 162, 163, + 162, 163, 147, 162, 163, 147, 171, 0, 8, 48, 26, 7, + 240, 240, 85, 34, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 85, 240, 16, + 25, 9, 240, 240, 242, 129, 130, 114, 114, 129, 130, 114, + 129, 130, 114, 114, 129, 130, 114, 129, 130, 114, 240, 240, + 128, 26, 7, 240, 240, 85, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 37, 240, 16, 20, 12, 0, 8, 2, 148, 132, 114, 34, + 98, 34, 82, 66, 66, 66, 50, 98, 0, 21, 32, 8, + 16, 0, 48, 14, 240, 240, 64, 12, 8, 240, 240, 163, + 114, 114, 113, 129, 0, 17, 32, 28, 13, 0, 18, 39, + 82, 66, 66, 82, 65, 98, 50, 98, 50, 98, 50, 98, + 50, 83, 50, 68, 66, 37, 84, 50, 0, 8, 48, 34, + 12, 0, 7, 66, 162, 162, 162, 162, 162, 162, 36, 68, + 50, 51, 66, 50, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 82, 50, 66, 71, 0, 8, 16, 20, 11, 0, + 15, 70, 66, 50, 50, 130, 146, 146, 146, 146, 162, 147, + 50, 85, 0, 7, 32, 34, 13, 0, 9, 18, 178, 178, + 178, 178, 178, 103, 82, 51, 66, 82, 50, 98, 50, 98, + 50, 98, 50, 98, 50, 98, 50, 83, 66, 52, 85, 34, + 0, 8, 48, 22, 12, 0, 16, 116, 98, 51, 66, 66, + 50, 82, 58, 34, 162, 162, 178, 163, 65, 102, 0, 7, + 112, 24, 10, 0, 6, 100, 82, 33, 66, 130, 130, 130, + 103, 82, 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, + 7, 33, 12, 0, 16, 119, 66, 66, 50, 82, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 83, 50, 52, + 69, 18, 162, 162, 49, 97, 66, 66, 85, 80, 35, 12, + 0, 7, 66, 162, 162, 162, 162, 162, 162, 36, 68, 50, + 51, 82, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 0, 7, 96, 19, 4, 240, + 210, 34, 34, 98, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 240, 112, 25, 9, 0, 8, 51, 99, 99, 242, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 49, 34, 68, 80, 33, 11, 0, 6, 114, 146, 146, + 146, 146, 146, 146, 66, 50, 50, 66, 34, 82, 18, 100, + 116, 114, 18, 98, 34, 82, 50, 66, 51, 50, 67, 0, + 7, 16, 22, 4, 240, 82, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 240, 112, + 40, 16, 0, 22, 2, 20, 36, 51, 51, 50, 34, 66, + 66, 34, 66, 66, 34, 66, 66, 34, 66, 66, 34, 66, + 66, 34, 66, 66, 34, 66, 66, 34, 66, 66, 34, 66, + 66, 0, 10, 32, 29, 12, 0, 16, 66, 36, 68, 50, + 51, 82, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 0, 7, 96, 27, 12, 0, + 16, 116, 99, 35, 66, 66, 50, 98, 34, 98, 34, 98, + 34, 98, 34, 98, 50, 66, 66, 51, 100, 0, 8, 16, + 31, 12, 0, 16, 66, 21, 68, 50, 51, 66, 50, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 82, 51, 50, + 71, 82, 162, 162, 162, 162, 160, 31, 11, 0, 15, 70, + 66, 50, 50, 66, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 82, 34, 67, 50, 36, 68, 18, 146, 146, 146, 146, + 146, 32, 21, 10, 0, 13, 98, 51, 34, 33, 82, 17, + 100, 99, 115, 114, 130, 130, 130, 130, 0, 7, 32, 20, + 10, 0, 14, 6, 49, 65, 50, 131, 118, 86, 101, 130, + 130, 34, 50, 54, 0, 6, 96, 22, 10, 0, 10, 34, + 130, 130, 104, 66, 130, 130, 130, 130, 130, 130, 130, 130, + 49, 85, 0, 6, 64, 29, 12, 0, 16, 66, 82, 50, + 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, + 82, 50, 67, 66, 36, 69, 34, 0, 7, 96, 26, 13, + 0, 17, 115, 98, 50, 83, 50, 82, 82, 66, 82, 50, + 114, 34, 114, 34, 114, 18, 148, 147, 178, 0, 8, 112, + 41, 17, 0, 23, 50, 66, 82, 34, 67, 66, 34, 67, + 65, 65, 50, 17, 50, 66, 34, 18, 34, 66, 33, 34, + 34, 66, 18, 49, 18, 97, 18, 52, 99, 68, 99, 82, + 115, 82, 0, 11, 32, 25, 12, 0, 16, 66, 83, 50, + 51, 82, 34, 101, 132, 131, 148, 114, 19, 83, 34, 82, + 66, 50, 83, 0, 7, 96, 30, 13, 0, 18, 2, 98, + 50, 98, 50, 82, 82, 66, 82, 65, 114, 34, 114, 34, + 114, 33, 148, 148, 162, 178, 177, 178, 113, 49, 132, 144, + 18, 11, 0, 15, 25, 130, 131, 115, 130, 131, 115, 130, + 130, 146, 137, 0, 7, 16, 26, 8, 240, 240, 211, 68, + 66, 98, 98, 98, 98, 98, 98, 83, 66, 115, 98, 98, + 98, 98, 98, 98, 98, 100, 83, 160, 25, 4, 240, 82, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 96, 26, 8, 240, + 240, 163, 84, 98, 98, 98, 98, 98, 98, 98, 99, 114, + 67, 82, 98, 98, 98, 98, 98, 98, 68, 67, 208, 13, + 13, 0, 21, 37, 65, 34, 39, 33, 99, 0, 18, 32, + 5, 14, 0, 47, 32, 19, 5, 0, 6, 35, 35, 35, + 194, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 112, + 30, 11, 0, 11, 66, 146, 146, 133, 72, 50, 18, 82, + 34, 82, 34, 82, 34, 82, 34, 83, 18, 101, 18, 70, + 114, 146, 146, 240, 240, 128, 22, 11, 0, 10, 5, 82, + 130, 146, 146, 146, 135, 98, 146, 146, 146, 146, 146, 130, + 137, 0, 7, 16, 30, 14, 0, 12, 34, 130, 50, 20, + 18, 82, 66, 98, 66, 82, 98, 66, 98, 66, 98, 81, + 82, 98, 66, 82, 20, 18, 50, 130, 0, 16, 28, 13, + 0, 11, 50, 114, 34, 114, 50, 82, 66, 67, 82, 50, + 98, 34, 130, 18, 132, 121, 114, 137, 114, 178, 178, 178, + 0, 9, 21, 4, 240, 82, 34, 34, 34, 34, 34, 34, + 34, 226, 34, 34, 34, 34, 34, 34, 34, 34, 160, 31, + 10, 0, 9, 6, 49, 65, 50, 130, 131, 132, 101, 71, + 50, 51, 34, 66, 34, 66, 51, 19, 54, 99, 131, 131, + 130, 130, 34, 50, 54, 64, 13, 9, 0, 7, 114, 50, + 34, 50, 34, 50, 0, 19, 48, 47, 18, 0, 16, 54, + 163, 67, 114, 36, 34, 82, 18, 65, 34, 66, 18, 114, + 50, 18, 146, 34, 18, 146, 34, 18, 146, 34, 18, 146, + 34, 19, 130, 50, 18, 50, 34, 66, 37, 50, 82, 130, + 115, 67, 166, 0, 12, 16, 21, 9, 0, 8, 20, 66, + 33, 50, 49, 50, 49, 50, 49, 50, 34, 67, 17, 199, + 0, 12, 80, 29, 13, 0, 18, 50, 50, 82, 51, 67, + 50, 67, 50, 82, 50, 82, 51, 98, 50, 114, 50, 99, + 50, 98, 66, 98, 50, 0, 8, 48, 12, 13, 0, 22, + 107, 178, 178, 178, 178, 0, 13, 32, 7, 10, 0, 18, + 104, 0, 14, 52, 18, 0, 16, 54, 163, 67, 119, 50, + 82, 18, 35, 34, 66, 18, 50, 34, 50, 34, 50, 50, + 34, 34, 35, 50, 34, 37, 82, 34, 34, 33, 82, 34, + 34, 34, 66, 50, 18, 50, 34, 66, 18, 65, 34, 82, + 130, 115, 67, 166, 0, 12, 16, 8, 10, 0, 10, 8, + 0, 22, 96, 15, 7, 0, 6, 35, 49, 49, 33, 49, + 33, 49, 51, 0, 13, 64, 18, 12, 0, 11, 2, 162, + 162, 162, 106, 98, 162, 162, 162, 240, 58, 0, 13, 96, + 17, 8, 240, 240, 180, 49, 50, 98, 98, 82, 98, 82, + 81, 102, 0, 13, 32, 18, 8, 240, 240, 180, 49, 50, + 98, 82, 67, 130, 98, 33, 50, 37, 0, 13, 48, 12, + 8, 240, 240, 211, 67, 82, 82, 82, 0, 17, 96, 32, + 12, 0, 16, 66, 82, 50, 82, 50, 82, 50, 82, 50, + 82, 50, 82, 50, 82, 50, 82, 50, 67, 51, 36, 54, + 34, 34, 162, 162, 162, 162, 160, 36, 12, 0, 10, 104, + 53, 18, 54, 18, 54, 18, 54, 18, 69, 18, 84, 18, + 114, 18, 114, 18, 114, 18, 114, 18, 114, 18, 114, 18, + 114, 18, 114, 18, 0, 7, 112, 10, 5, 0, 8, 19, + 35, 35, 0, 7, 16, 10, 7, 0, 19, 50, 114, 82, + 82, 36, 48, 16, 8, 240, 240, 179, 68, 98, 98, 98, + 98, 98, 98, 70, 0, 13, 32, 20, 8, 0, 7, 20, + 50, 34, 33, 65, 33, 65, 33, 65, 34, 34, 52, 182, + 0, 11, 32, 29, 13, 0, 17, 114, 50, 98, 66, 98, + 51, 98, 50, 114, 50, 99, 50, 82, 50, 82, 50, 82, + 51, 66, 66, 82, 50, 0, 8, 112, 47, 17, 0, 10, + 99, 130, 52, 129, 98, 114, 98, 98, 114, 97, 130, 82, + 130, 81, 146, 65, 50, 53, 34, 35, 161, 36, 146, 33, + 18, 130, 33, 34, 129, 34, 34, 114, 39, 82, 114, 97, + 130, 82, 130, 66, 0, 10, 32, 43, 18, 0, 11, 51, + 145, 68, 129, 114, 114, 114, 113, 130, 98, 130, 82, 146, + 81, 162, 66, 133, 34, 36, 161, 98, 130, 98, 114, 114, + 113, 114, 114, 114, 98, 114, 113, 113, 130, 102, 50, 0, + 10, 112, 49, 17, 0, 10, 100, 114, 49, 50, 97, 130, + 82, 115, 66, 99, 97, 146, 66, 162, 34, 178, 33, 129, + 35, 18, 50, 52, 34, 51, 145, 49, 18, 129, 50, 18, + 114, 34, 34, 113, 55, 81, 130, 82, 130, 81, 146, 65, + 0, 10, 48, 21, 9, 0, 11, 67, 99, 99, 240, 146, + 114, 114, 114, 99, 83, 98, 113, 129, 130, 50, 53, 192, + 38, 15, 35, 210, 226, 226, 226, 240, 240, 195, 195, 180, + 178, 18, 162, 18, 146, 50, 130, 50, 115, 50, 114, 82, + 98, 82, 91, 66, 114, 51, 114, 50, 146, 34, 146, 0, + 9, 80, 38, 15, 131, 179, 194, 194, 194, 240, 240, 211, + 195, 180, 178, 18, 162, 18, 146, 50, 130, 50, 115, 50, + 114, 82, 98, 82, 91, 66, 114, 51, 114, 50, 146, 34, + 146, 0, 9, 80, 41, 15, 82, 211, 178, 18, 146, 50, + 114, 82, 240, 240, 147, 195, 180, 178, 18, 162, 18, 146, + 50, 130, 50, 115, 50, 114, 82, 98, 82, 91, 66, 114, + 51, 114, 50, 146, 34, 146, 0, 9, 80, 39, 15, 240, + 240, 51, 49, 129, 35, 0, 7, 3, 195, 180, 178, 18, + 162, 18, 146, 50, 130, 50, 115, 50, 114, 82, 98, 82, + 91, 66, 114, 51, 114, 50, 146, 34, 146, 0, 9, 80, + 41, 15, 240, 240, 50, 35, 130, 35, 130, 35, 240, 240, + 162, 196, 180, 178, 18, 146, 34, 146, 34, 146, 50, 114, + 66, 114, 67, 98, 82, 90, 82, 114, 66, 114, 50, 146, + 34, 146, 0, 9, 80, 38, 14, 240, 66, 177, 33, 161, + 33, 178, 240, 240, 162, 180, 164, 164, 146, 34, 130, 34, + 130, 34, 114, 66, 98, 66, 83, 67, 74, 66, 98, 50, + 130, 34, 130, 34, 130, 0, 9, 35, 20, 0, 18, 73, + 164, 240, 17, 18, 242, 18, 241, 34, 226, 34, 226, 39, + 130, 50, 210, 50, 194, 66, 200, 178, 82, 162, 98, 162, + 98, 146, 121, 0, 12, 96, 28, 14, 0, 12, 103, 98, + 67, 66, 178, 193, 194, 194, 194, 194, 194, 194, 210, 195, + 113, 67, 67, 103, 129, 212, 194, 194, 163, 96, 26, 12, + 3, 163, 162, 178, 178, 240, 249, 50, 162, 162, 162, 162, + 168, 66, 162, 162, 162, 162, 162, 162, 170, 0, 7, 96, + 27, 12, 99, 131, 146, 146, 146, 240, 240, 25, 50, 162, + 162, 162, 162, 168, 66, 162, 162, 162, 162, 162, 162, 170, + 0, 7, 96, 29, 12, 65, 163, 130, 18, 98, 50, 66, + 82, 240, 201, 50, 162, 162, 162, 162, 168, 66, 162, 162, + 162, 162, 162, 162, 170, 0, 7, 96, 28, 12, 240, 162, + 50, 82, 50, 82, 50, 240, 217, 50, 162, 162, 162, 162, + 168, 66, 162, 162, 162, 162, 162, 162, 170, 0, 7, 96, + 26, 10, 3, 146, 146, 146, 145, 240, 167, 98, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 87, 0, + 6, 64, 26, 10, 98, 114, 114, 114, 114, 240, 183, 98, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 87, 0, 6, 80, 28, 11, 66, 132, 101, 82, 50, 50, + 82, 240, 167, 114, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 103, 0, 7, 32, 28, 9, 240, 51, + 34, 35, 34, 35, 34, 240, 87, 82, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 71, 0, 5, 112, + 35, 16, 0, 14, 40, 130, 83, 98, 99, 82, 114, 82, + 130, 66, 130, 40, 66, 66, 130, 66, 130, 66, 130, 66, + 130, 66, 114, 82, 98, 98, 82, 119, 0, 10, 112, 49, + 14, 240, 240, 19, 34, 98, 35, 0, 5, 114, 130, 35, + 114, 36, 98, 36, 98, 34, 18, 82, 34, 34, 66, 34, + 34, 66, 34, 50, 50, 34, 66, 34, 34, 66, 34, 34, + 82, 18, 34, 100, 34, 100, 34, 115, 34, 130, 0, 9, + 40, 15, 35, 211, 210, 226, 226, 240, 240, 181, 146, 51, + 97, 114, 66, 114, 65, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 145, 66, 114, 66, 113, 99, 50, + 149, 0, 10, 16, 40, 15, 131, 179, 194, 194, 194, 240, + 240, 197, 146, 51, 97, 114, 66, 114, 65, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 145, 66, 114, + 66, 113, 99, 50, 149, 0, 10, 16, 43, 15, 97, 211, + 178, 18, 146, 50, 114, 82, 240, 240, 133, 146, 51, 97, + 114, 66, 114, 65, 146, 34, 146, 34, 146, 34, 146, 34, + 146, 34, 146, 34, 145, 66, 114, 66, 113, 99, 50, 149, + 0, 10, 16, 41, 15, 240, 240, 52, 33, 129, 36, 0, + 6, 101, 146, 51, 97, 114, 66, 114, 65, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 145, 66, 114, + 66, 113, 99, 50, 149, 0, 10, 16, 42, 15, 240, 51, + 34, 131, 34, 131, 34, 0, 6, 101, 146, 51, 97, 114, + 66, 114, 65, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 34, 145, 66, 114, 66, 113, 99, 50, 149, 0, + 10, 16, 20, 11, 0, 13, 113, 81, 51, 51, 51, 19, + 85, 115, 117, 82, 50, 50, 82, 0, 12, 80, 46, 15, + 0, 10, 82, 209, 135, 114, 51, 97, 84, 66, 81, 18, + 65, 82, 34, 34, 81, 50, 34, 66, 50, 34, 65, 66, + 34, 50, 66, 34, 49, 82, 34, 34, 81, 66, 17, 82, + 68, 81, 99, 50, 119, 114, 0, 9, 41, 13, 19, 179, + 178, 194, 194, 240, 240, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 50, 82, 67, 51, 101, 0, 8, + 96, 41, 13, 115, 147, 162, 162, 162, 240, 240, 50, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 50, 82, + 67, 51, 101, 0, 8, 96, 43, 13, 81, 179, 146, 18, + 114, 50, 97, 81, 240, 242, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 50, 82, 67, 51, 101, 0, 8, + 96, 42, 13, 243, 34, 99, 34, 99, 34, 240, 240, 210, + 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 50, + 82, 67, 51, 101, 0, 8, 96, 33, 14, 130, 178, 178, + 178, 193, 240, 240, 98, 130, 50, 99, 50, 98, 82, 66, + 99, 35, 114, 34, 148, 164, 178, 194, 194, 194, 194, 194, + 194, 0, 9, 80, 29, 12, 0, 10, 66, 162, 162, 167, + 82, 67, 50, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 82, 55, 82, 162, 162, 0, 8, 96, 41, 13, 0, + 8, 69, 98, 66, 81, 98, 50, 98, 50, 98, 50, 67, + 66, 51, 82, 50, 98, 50, 98, 51, 82, 68, 50, 83, + 50, 99, 34, 114, 34, 114, 34, 49, 34, 50, 37, 0, + 8, 80, 34, 13, 0, 8, 50, 194, 194, 194, 194, 240, + 103, 82, 66, 66, 82, 65, 98, 50, 98, 50, 98, 50, + 98, 50, 83, 50, 68, 66, 37, 84, 50, 0, 8, 48, + 34, 13, 0, 9, 3, 147, 147, 162, 162, 240, 135, 82, + 66, 66, 82, 65, 98, 50, 98, 50, 98, 50, 98, 50, + 83, 50, 68, 66, 37, 84, 50, 0, 8, 48, 37, 13, + 0, 8, 83, 149, 130, 34, 98, 66, 66, 97, 240, 71, + 82, 66, 66, 82, 65, 98, 50, 98, 50, 98, 50, 98, + 50, 83, 50, 68, 66, 37, 84, 50, 0, 8, 48, 34, + 13, 0, 11, 84, 34, 81, 51, 240, 240, 55, 82, 66, + 66, 82, 65, 98, 50, 98, 50, 98, 50, 98, 50, 83, + 50, 68, 66, 37, 84, 50, 0, 8, 48, 35, 13, 0, + 11, 82, 50, 98, 50, 98, 50, 240, 87, 82, 66, 66, + 82, 65, 98, 50, 98, 50, 98, 50, 98, 50, 83, 50, + 68, 66, 37, 84, 35, 0, 8, 48, 36, 13, 0, 8, + 83, 145, 49, 129, 49, 147, 240, 240, 87, 82, 66, 66, + 82, 65, 98, 50, 98, 50, 98, 50, 98, 50, 83, 50, + 68, 66, 37, 84, 50, 0, 8, 48, 31, 19, 0, 26, + 53, 52, 98, 52, 51, 163, 66, 162, 82, 95, 50, 66, + 162, 82, 162, 82, 162, 68, 147, 34, 19, 65, 84, 70, + 0, 12, 32, 23, 11, 0, 15, 70, 66, 49, 66, 130, + 146, 146, 146, 146, 162, 147, 50, 70, 97, 164, 146, 146, + 115, 80, 28, 12, 0, 7, 83, 163, 162, 178, 178, 240, + 84, 98, 51, 66, 66, 50, 82, 58, 34, 162, 162, 178, + 163, 65, 102, 0, 7, 112, 28, 12, 0, 8, 35, 146, + 146, 146, 146, 240, 116, 98, 51, 66, 66, 50, 82, 58, + 34, 162, 162, 178, 163, 65, 102, 0, 7, 112, 31, 12, + 0, 8, 2, 148, 114, 34, 82, 66, 65, 97, 240, 52, + 98, 51, 66, 66, 50, 82, 58, 34, 162, 162, 178, 163, + 65, 102, 0, 7, 112, 29, 12, 0, 10, 98, 35, 82, + 35, 82, 35, 240, 52, 98, 66, 66, 81, 50, 97, 58, + 34, 162, 162, 178, 163, 65, 102, 0, 7, 112, 23, 7, + 240, 240, 83, 83, 82, 98, 240, 66, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 240, 240, 112, 23, 7, 240, + 240, 115, 66, 66, 66, 240, 66, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 240, 240, 160, 25, 10, 0, 6, + 82, 116, 82, 34, 50, 66, 240, 162, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 0, 6, 112, 24, 9, 0, + 7, 115, 19, 35, 19, 35, 19, 226, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 0, 6, 16, 37, 12, 0, + 7, 115, 18, 116, 131, 130, 18, 113, 50, 162, 100, 17, + 67, 36, 50, 67, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 50, 66, 66, 50, 116, 0, 8, 16, 34, 12, + 0, 10, 99, 49, 65, 51, 240, 210, 36, 68, 50, 51, + 82, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 0, 7, 96, 33, 12, 0, 7, + 83, 163, 162, 178, 178, 240, 84, 99, 35, 66, 66, 50, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 50, 66, 66, + 51, 100, 0, 8, 16, 33, 12, 0, 8, 35, 146, 146, + 146, 146, 240, 116, 99, 35, 66, 66, 50, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 50, 66, 66, 51, 100, 0, + 8, 16, 36, 12, 0, 8, 2, 148, 114, 34, 82, 66, + 65, 97, 240, 52, 99, 35, 66, 66, 50, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 50, 66, 66, 51, 100, 0, + 8, 16, 33, 12, 0, 10, 99, 34, 66, 35, 240, 240, + 20, 99, 35, 66, 66, 50, 98, 34, 98, 34, 98, 34, + 98, 34, 98, 50, 66, 66, 51, 100, 0, 8, 16, 34, + 12, 0, 10, 83, 34, 83, 34, 83, 34, 240, 68, 99, + 35, 66, 66, 50, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 50, 66, 66, 51, 100, 0, 8, 16, 16, 12, 0, + 13, 115, 147, 147, 240, 250, 240, 35, 147, 147, 0, 12, + 96, 34, 12, 0, 15, 114, 101, 83, 35, 66, 36, 50, + 50, 18, 34, 34, 34, 34, 34, 34, 34, 33, 50, 34, + 18, 50, 36, 50, 67, 35, 85, 97, 0, 7, 32, 34, + 12, 0, 7, 82, 178, 178, 178, 240, 242, 82, 50, 82, + 50, 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, 82, + 50, 67, 66, 36, 69, 34, 0, 7, 96, 35, 12, 0, + 8, 34, 146, 146, 146, 240, 240, 18, 82, 50, 82, 50, + 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, + 67, 66, 36, 69, 34, 0, 7, 96, 36, 12, 0, 7, + 115, 133, 114, 18, 98, 50, 240, 210, 82, 50, 82, 50, + 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, + 67, 66, 36, 69, 34, 0, 7, 96, 36, 12, 0, 10, + 83, 34, 83, 34, 83, 34, 240, 18, 82, 50, 82, 50, + 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, 82, 50, + 67, 66, 36, 69, 34, 0, 7, 96, 36, 13, 0, 9, + 3, 147, 147, 161, 240, 240, 66, 98, 50, 98, 50, 82, + 82, 66, 82, 65, 114, 34, 114, 34, 114, 33, 148, 148, + 162, 178, 177, 178, 113, 49, 132, 144, 37, 12, 0, 7, + 66, 162, 162, 162, 162, 162, 162, 21, 68, 50, 51, 66, + 50, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 82, + 51, 50, 71, 82, 162, 162, 162, 162, 160, 37, 13, 0, + 11, 82, 50, 98, 50, 98, 50, 240, 34, 114, 50, 82, + 66, 82, 67, 65, 98, 50, 98, 50, 114, 33, 130, 18, + 133, 147, 163, 163, 162, 178, 113, 34, 132, 144, +}; + +//***************************************************************************** +// +// The glyph offset table for the 22 point Sansand font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetSansand22[] = +{ + 0, 5, 24, 41, 74, 109, 157, 189, + 200, 226, 252, 273, 289, 299, 306, 315, + 342, 377, 400, 424, 450, 479, 503, 534, + 556, 590, 620, 633, 647, 664, 674, 691, + 714, 767, 800, 834, 859, 894, 916, 937, + 967, 1002, 1024, 1047, 1082, 1104, 1161, 1204, + 1239, 1268, 1304, 1339, 1363, 1385, 1421, 1455, + 1512, 1544, 1572, 1594, 1620, 1645, 1671, 1691, + 1699, 1711, 1739, 1773, 1793, 1827, 1849, 1873, + 1906, 1941, 1960, 1985, 2018, 2040, 2080, 2109, + 2136, 2167, 2198, 2219, 2239, 2261, 2290, 2316, + 2357, 2382, 2412, 2430, 2456, 2481, 2507, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2520, 2525, 2544, 2574, 2596, 2626, 2654, 2675, + 2706, 2719, 2766, 2787, 2816, 2828, 2835, 2887, + 2895, 2910, 2928, 2945, 2963, 2975, 3007, 3043, + 3053, 3063, 3079, 3099, 3128, 3175, 3218, 3267, + 3288, 3326, 3364, 3405, 3444, 3485, 3523, 3558, + 3586, 3612, 3639, 3668, 3696, 3722, 3748, 3776, + 3804, 3839, 3888, 3928, 3968, 4011, 4052, 4094, + 4114, 4160, 4201, 4242, 4285, 4327, 4360, 4389, + 4430, 4464, 4498, 4535, 4569, 4604, 4640, 4671, + 4694, 4722, 4750, 4781, 4810, 4833, 4856, 4881, + 4905, 4942, 4976, 5009, 5042, 5078, 5111, 5145, + 5161, 5195, 5229, 5264, 5300, 5336, 5372, 5409, +}; + +//***************************************************************************** +// +// The font definition for the 22 point Sansand font. +// +//***************************************************************************** +const tFontEx g_sFontExSansand22 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 19, + + // + // The height of the font. + // + 27, + + // + // The baseline of the font. + // + 22, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetSansand22, + + // + // A pointer to the actual font data + // + g_pui8Sansand22Data +}; diff --git a/third_party/fonts/ofl/fonts/fontsansand24.c b/third_party/fonts/ofl/fonts/fontsansand24.c new file mode 100644 index 0000000..f025522 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontsansand24.c @@ -0,0 +1,708 @@ +//***************************************************************************** +// +// fontsansand24.c - Font definition for the 24pt Sansand font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://scripts.sil.org/cms/scripts/page.php? +// item_id=Andika_download +// +// Copyright (c) 2004-2008, SIL International (http://scripts.sil.org), +// with Reserved Font Names 'Andika' and 'SIL'. +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: sansand +// Size: 24 point +// Bold: no +// Italic: no +// Memory usage: 6008 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 24 point Sansand font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Sansand24Data[5805] = +{ + 5, 10, 0, 37, 64, 22, 5, 240, 243, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 240, 35, 35, 35, + 240, 240, 32, 19, 8, 0, 6, 2, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 0, 18, 32, 32, 16, + 0, 14, 97, 50, 146, 50, 146, 50, 145, 65, 109, 61, + 98, 50, 130, 50, 109, 61, 97, 65, 146, 50, 146, 50, + 146, 49, 146, 50, 0, 17, 39, 12, 0, 9, 66, 162, + 148, 104, 66, 18, 18, 50, 34, 98, 34, 98, 34, 102, + 133, 149, 114, 19, 98, 34, 98, 34, 98, 34, 34, 34, + 18, 57, 70, 146, 162, 162, 240, 240, 192, 51, 18, 0, + 16, 3, 113, 101, 82, 82, 50, 50, 98, 50, 50, 98, + 50, 34, 114, 50, 34, 114, 50, 18, 149, 34, 163, 34, + 35, 162, 37, 146, 18, 50, 114, 34, 50, 114, 34, 50, + 98, 50, 50, 98, 50, 50, 82, 85, 98, 99, 0, 14, + 37, 15, 0, 13, 68, 166, 131, 35, 114, 66, 114, 66, + 130, 34, 149, 179, 181, 147, 18, 146, 50, 114, 82, 33, + 50, 85, 50, 99, 67, 69, 72, 19, 69, 66, 0, 11, + 64, 12, 4, 240, 146, 34, 34, 34, 34, 34, 0, 9, + 32, 29, 8, 240, 240, 225, 99, 82, 82, 98, 82, 98, + 82, 98, 98, 98, 98, 98, 98, 98, 98, 114, 98, 98, + 114, 99, 98, 114, 97, 176, 29, 8, 240, 240, 177, 99, + 98, 114, 98, 114, 98, 98, 114, 98, 98, 98, 98, 98, + 98, 98, 82, 98, 98, 82, 83, 82, 82, 113, 224, 20, + 9, 0, 7, 17, 129, 81, 33, 18, 38, 97, 102, 34, + 17, 33, 81, 129, 0, 17, 64, 17, 12, 0, 17, 2, + 162, 162, 162, 106, 42, 98, 162, 162, 162, 0, 14, 32, + 12, 5, 0, 13, 19, 35, 50, 50, 34, 49, 240, 64, + 9, 10, 0, 20, 8, 40, 0, 15, 32, 10, 5, 0, + 13, 19, 35, 35, 240, 240, 32, 29, 13, 0, 11, 1, + 178, 178, 162, 178, 162, 178, 162, 178, 177, 178, 177, 178, + 178, 162, 178, 162, 178, 162, 178, 177, 178, 240, 240, 112, + 37, 14, 0, 12, 101, 120, 83, 67, 66, 98, 51, 99, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 35, 99, 50, 98, 67, 67, 88, 117, 0, 11, + 32, 25, 12, 0, 10, 115, 132, 102, 98, 34, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 106, 42, 0, + 9, 32, 25, 13, 0, 11, 85, 120, 67, 66, 65, 114, + 178, 178, 178, 162, 178, 162, 163, 147, 147, 147, 147, 155, + 43, 0, 10, 27, 13, 0, 11, 85, 120, 66, 83, 178, + 178, 163, 147, 116, 150, 179, 179, 178, 178, 33, 115, 34, + 83, 57, 101, 0, 10, 64, 30, 14, 0, 13, 34, 179, + 164, 149, 146, 18, 130, 34, 114, 50, 114, 50, 98, 66, + 82, 82, 67, 82, 76, 44, 162, 194, 194, 194, 0, 11, + 26, 13, 0, 11, 73, 73, 66, 178, 178, 178, 183, 104, + 81, 83, 179, 178, 178, 178, 163, 34, 83, 57, 101, 0, + 10, 64, 33, 14, 0, 12, 117, 120, 83, 81, 66, 194, + 178, 194, 37, 91, 52, 67, 50, 115, 34, 130, 34, 130, + 35, 114, 50, 99, 51, 67, 88, 118, 0, 11, 16, 24, + 14, 0, 12, 44, 44, 179, 163, 178, 178, 179, 178, 179, + 178, 179, 178, 194, 179, 178, 194, 178, 0, 11, 96, 35, + 14, 0, 12, 100, 136, 83, 67, 66, 98, 66, 98, 66, + 98, 82, 66, 119, 104, 83, 67, 50, 115, 34, 130, 34, + 130, 34, 130, 51, 67, 88, 118, 0, 11, 16, 32, 14, + 0, 12, 85, 136, 83, 67, 50, 114, 50, 130, 34, 130, + 34, 130, 50, 84, 59, 85, 34, 194, 179, 178, 179, 65, + 83, 88, 117, 0, 11, 48, 14, 5, 0, 8, 19, 35, + 35, 240, 195, 35, 35, 240, 240, 32, 15, 5, 0, 8, + 19, 35, 35, 240, 195, 35, 50, 50, 49, 240, 128, 17, + 14, 0, 18, 98, 164, 117, 117, 101, 146, 197, 181, 197, + 181, 194, 0, 16, 12, 13, 0, 19, 75, 43, 240, 219, + 43, 0, 19, 96, 18, 14, 0, 17, 65, 212, 181, 197, + 181, 195, 149, 101, 117, 116, 162, 0, 17, 32, 25, 10, + 0, 7, 85, 71, 50, 51, 130, 130, 114, 115, 114, 114, + 130, 130, 130, 130, 240, 195, 115, 115, 0, 8, 16, 59, + 20, 0, 20, 102, 202, 148, 84, 99, 146, 83, 53, 50, + 66, 55, 34, 51, 34, 66, 50, 34, 50, 66, 50, 34, + 34, 82, 50, 34, 34, 82, 50, 34, 34, 82, 50, 34, + 34, 67, 50, 35, 19, 36, 34, 66, 37, 37, 67, 35, + 51, 115, 240, 52, 81, 186, 198, 0, 8, 64, 35, 16, + 0, 14, 99, 196, 196, 182, 162, 34, 162, 34, 147, 35, + 130, 66, 130, 66, 115, 67, 98, 98, 107, 76, 66, 130, + 51, 131, 34, 162, 34, 162, 0, 12, 32, 35, 13, 0, + 11, 56, 89, 66, 83, 50, 98, 50, 98, 50, 98, 50, + 82, 72, 89, 66, 83, 50, 114, 34, 114, 34, 114, 34, + 114, 34, 83, 58, 56, 0, 10, 48, 27, 15, 0, 13, + 102, 122, 67, 83, 51, 194, 194, 210, 210, 210, 210, 210, + 211, 210, 211, 129, 67, 83, 90, 117, 0, 11, 112, 37, + 15, 0, 13, 24, 122, 82, 99, 66, 115, 50, 130, 50, + 131, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, + 131, 34, 130, 50, 115, 50, 84, 74, 88, 0, 12, 16, + 24, 12, 0, 10, 74, 42, 34, 162, 162, 162, 162, 169, + 57, 50, 162, 162, 162, 162, 162, 170, 42, 0, 9, 32, + 24, 12, 0, 10, 74, 42, 34, 162, 162, 162, 162, 169, + 57, 50, 162, 162, 162, 162, 162, 162, 162, 0, 10, 32, + 32, 16, 0, 14, 87, 123, 67, 99, 51, 210, 211, 210, + 226, 226, 102, 34, 102, 34, 162, 35, 146, 50, 146, 51, + 130, 67, 99, 90, 134, 0, 12, 80, 39, 15, 0, 13, + 18, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 45, 45, 34, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 0, 11, 64, 24, + 10, 0, 8, 104, 40, 82, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 88, 40, 0, 7, 96, 25, + 10, 0, 9, 66, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 33, 66, 55, 68, 0, 8, 16, + 39, 14, 0, 12, 34, 99, 50, 83, 66, 67, 82, 66, + 98, 50, 114, 35, 114, 19, 133, 149, 146, 19, 130, 34, + 130, 35, 114, 51, 98, 67, 82, 83, 66, 99, 50, 115, + 0, 10, 96, 24, 12, 0, 10, 66, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 170, 42, + 0, 9, 32, 62, 18, 0, 15, 99, 163, 36, 132, 36, + 132, 36, 132, 34, 18, 101, 34, 18, 98, 18, 34, 18, + 98, 18, 34, 34, 66, 34, 34, 34, 66, 34, 34, 34, + 66, 34, 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, + 34, 50, 34, 68, 66, 34, 68, 66, 34, 68, 66, 34, + 82, 82, 0, 13, 96, 50, 15, 0, 13, 18, 146, 35, + 130, 36, 114, 36, 114, 34, 18, 98, 34, 19, 82, 34, + 34, 82, 34, 50, 66, 34, 51, 50, 34, 66, 50, 34, + 82, 34, 34, 83, 18, 34, 98, 18, 34, 116, 34, 116, + 34, 131, 34, 146, 0, 11, 64, 37, 16, 0, 14, 85, + 152, 115, 67, 83, 99, 66, 130, 50, 162, 34, 162, 34, + 162, 34, 162, 34, 162, 34, 162, 34, 162, 50, 130, 67, + 99, 83, 67, 120, 149, 0, 12, 112, 31, 13, 0, 11, + 56, 89, 66, 83, 50, 99, 34, 114, 34, 114, 34, 114, + 34, 99, 34, 83, 57, 72, 82, 178, 178, 178, 178, 178, + 0, 11, 16, 39, 17, 0, 15, 69, 168, 131, 67, 99, + 99, 82, 130, 66, 162, 50, 162, 50, 162, 50, 162, 50, + 162, 50, 162, 50, 162, 66, 130, 83, 99, 99, 67, 136, + 169, 229, 227, 0, 8, 96, 37, 14, 0, 12, 40, 106, + 66, 83, 66, 114, 50, 114, 50, 114, 50, 114, 50, 83, + 73, 88, 98, 51, 98, 66, 98, 82, 82, 83, 66, 99, + 50, 115, 34, 130, 0, 10, 96, 26, 13, 0, 11, 102, + 89, 66, 82, 50, 178, 178, 180, 166, 150, 164, 179, 178, + 178, 178, 34, 83, 57, 102, 0, 10, 48, 23, 16, 0, + 14, 14, 46, 130, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 0, 13, 39, 14, 0, 12, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 35, 99, 51, 67, 88, 118, 0, 11, 16, 37, + 16, 0, 14, 2, 162, 34, 147, 35, 130, 66, 130, 66, + 115, 67, 98, 98, 98, 98, 83, 114, 66, 130, 66, 130, + 51, 146, 34, 162, 34, 162, 18, 196, 196, 195, 0, 13, + 64, 24, 0, 21, 2, 130, 130, 34, 116, 114, 35, 100, + 99, 50, 100, 98, 66, 100, 98, 66, 82, 34, 82, 67, + 66, 34, 67, 82, 66, 34, 66, 98, 66, 50, 50, 98, + 50, 66, 50, 114, 34, 66, 35, 114, 34, 66, 34, 130, + 18, 98, 18, 130, 18, 98, 18, 148, 100, 163, 131, 163, + 131, 0, 18, 96, 37, 15, 0, 13, 19, 115, 51, 83, + 82, 82, 99, 51, 115, 34, 146, 19, 149, 179, 195, 181, + 162, 18, 147, 34, 115, 51, 98, 82, 83, 83, 66, 115, + 35, 130, 0, 11, 64, 30, 16, 0, 14, 3, 131, 51, + 114, 82, 98, 99, 67, 114, 66, 131, 35, 146, 34, 180, + 196, 210, 226, 226, 226, 226, 226, 226, 226, 0, 13, 24, + 14, 0, 12, 59, 59, 178, 179, 178, 178, 179, 178, 178, + 179, 163, 178, 179, 163, 178, 188, 44, 0, 10, 96, 29, + 7, 240, 240, 197, 37, 34, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 85, 37, 32, 26, 9, 0, 6, 97, 130, 114, 129, + 130, 114, 114, 129, 130, 114, 129, 130, 114, 114, 129, 130, + 114, 129, 130, 0, 5, 112, 29, 7, 240, 240, 197, 37, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 37, 37, 32, 23, + 13, 0, 10, 35, 163, 146, 18, 130, 18, 114, 50, 98, + 50, 82, 82, 66, 82, 50, 114, 0, 24, 80, 9, 17, + 0, 55, 47, 47, 240, 240, 96, 12, 8, 0, 6, 3, + 99, 99, 99, 98, 0, 19, 32, 28, 13, 0, 19, 118, + 104, 67, 66, 66, 82, 50, 98, 50, 98, 50, 98, 50, + 83, 50, 83, 51, 37, 70, 18, 84, 50, 0, 10, 35, + 13, 0, 9, 98, 178, 178, 178, 178, 178, 178, 37, 66, + 23, 52, 66, 51, 98, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 98, 50, 83, 57, 102, 0, 10, 48, 21, 11, + 0, 16, 117, 87, 51, 65, 50, 130, 146, 146, 146, 147, + 147, 65, 71, 85, 0, 8, 80, 36, 14, 0, 11, 82, + 194, 194, 194, 194, 194, 101, 18, 89, 67, 67, 66, 98, + 50, 114, 50, 114, 50, 114, 50, 114, 50, 99, 66, 68, + 71, 18, 100, 50, 0, 10, 96, 22, 13, 0, 19, 117, + 119, 82, 82, 50, 98, 58, 59, 34, 178, 179, 179, 81, + 89, 86, 0, 10, 32, 25, 11, 0, 8, 101, 86, 67, + 130, 146, 146, 120, 56, 82, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 0, 9, 16, 34, 12, 0, 18, 54, 88, + 51, 66, 50, 82, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 83, 35, 52, 54, 18, 68, 34, 162, 162, 50, 66, + 72, 100, 240, 32, 37, 12, 0, 9, 2, 162, 162, 162, + 162, 162, 162, 36, 66, 22, 52, 51, 35, 82, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 0, 9, 32, 22, 5, 240, 240, 83, 35, 35, + 210, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 240, 240, 32, 26, 9, 0, 8, 51, 99, 99, 240, 146, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 99, 53, 68, 224, 35, 12, 0, 9, 2, 162, 162, + 162, 162, 162, 162, 67, 50, 51, 66, 35, 82, 19, 101, + 116, 130, 18, 114, 19, 98, 35, 82, 51, 66, 67, 50, + 83, 0, 9, 32, 23, 4, 240, 146, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 240, 176, 42, 18, 0, 27, 2, 36, 52, 63, 1, + 36, 52, 35, 35, 67, 66, 34, 82, 82, 34, 82, 82, + 34, 82, 82, 34, 82, 82, 34, 82, 82, 34, 82, 82, + 34, 82, 82, 34, 82, 82, 0, 13, 96, 31, 12, 0, + 18, 2, 36, 66, 22, 52, 51, 35, 82, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, + 98, 0, 9, 32, 27, 13, 0, 19, 117, 119, 83, 51, + 51, 83, 34, 114, 34, 114, 34, 114, 34, 114, 35, 83, + 51, 51, 87, 117, 0, 10, 48, 34, 13, 0, 19, 66, + 36, 82, 23, 52, 66, 51, 83, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 98, 51, 67, 57, 66, 21, 82, 178, + 178, 178, 178, 240, 144, 31, 12, 0, 18, 54, 88, 51, + 66, 50, 82, 34, 98, 34, 98, 34, 98, 34, 98, 34, + 83, 50, 52, 57, 83, 34, 162, 162, 162, 162, 162, 224, + 23, 10, 0, 15, 2, 51, 34, 36, 34, 19, 66, 18, + 84, 99, 115, 115, 114, 130, 130, 130, 0, 8, 64, 21, + 11, 0, 16, 101, 87, 51, 65, 50, 147, 149, 148, 147, + 146, 34, 67, 40, 85, 0, 8, 96, 24, 10, 0, 10, + 34, 130, 130, 130, 104, 40, 66, 130, 130, 130, 130, 130, + 130, 130, 49, 70, 84, 0, 7, 112, 30, 13, 0, 19, + 66, 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, 98, + 50, 98, 50, 98, 50, 83, 51, 37, 70, 18, 84, 50, + 0, 10, 28, 14, 0, 21, 3, 114, 50, 99, 51, 82, + 82, 82, 82, 66, 114, 50, 114, 35, 114, 34, 146, 18, + 148, 179, 179, 0, 11, 32, 43, 18, 0, 27, 2, 82, + 82, 34, 82, 82, 34, 68, 66, 50, 52, 66, 50, 50, + 17, 50, 66, 34, 34, 34, 66, 34, 34, 34, 82, 18, + 49, 34, 84, 68, 100, 68, 115, 83, 114, 98, 0, 14, + 16, 26, 13, 0, 19, 67, 83, 50, 67, 82, 50, 99, + 18, 133, 147, 163, 149, 115, 18, 99, 50, 82, 67, 51, + 83, 0, 10, 33, 14, 0, 21, 18, 114, 50, 99, 66, + 82, 82, 82, 83, 50, 114, 50, 114, 35, 130, 18, 146, + 18, 163, 179, 179, 178, 194, 113, 50, 134, 148, 240, 128, + 19, 12, 0, 18, 25, 57, 146, 146, 147, 131, 131, 146, + 146, 147, 138, 42, 0, 9, 32, 29, 9, 0, 6, 33, + 100, 67, 98, 114, 114, 114, 114, 114, 114, 99, 83, 99, + 130, 114, 114, 114, 114, 114, 114, 114, 115, 116, 113, 192, + 27, 4, 240, 146, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 96, 30, 9, 0, 5, 97, 116, 115, 114, 114, + 114, 114, 114, 114, 114, 115, 115, 99, 82, 114, 114, 114, + 114, 114, 114, 114, 99, 68, 97, 240, 16, 14, 15, 0, + 26, 67, 98, 55, 49, 50, 55, 49, 100, 0, 23, 5, + 15, 0, 56, 32, 21, 5, 0, 6, 115, 35, 35, 240, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 35, + 112, 33, 11, 0, 12, 114, 146, 146, 133, 72, 50, 18, + 33, 34, 34, 82, 34, 82, 34, 82, 34, 82, 34, 98, + 18, 33, 56, 70, 114, 146, 146, 0, 6, 16, 24, 12, + 0, 10, 117, 102, 83, 146, 162, 162, 162, 151, 87, 114, + 162, 162, 162, 162, 146, 154, 42, 0, 9, 32, 31, 14, + 0, 14, 2, 130, 35, 20, 19, 58, 82, 66, 82, 98, + 66, 98, 66, 98, 66, 98, 82, 66, 90, 51, 20, 19, + 34, 130, 0, 17, 96, 30, 13, 0, 13, 2, 114, 35, + 98, 50, 82, 82, 66, 82, 50, 114, 34, 115, 17, 148, + 105, 73, 73, 73, 130, 178, 178, 178, 0, 10, 64, 23, + 4, 240, 146, 34, 34, 34, 34, 34, 34, 34, 34, 240, + 50, 34, 34, 34, 34, 34, 34, 34, 34, 160, 33, 11, + 0, 9, 117, 87, 51, 65, 50, 146, 163, 132, 133, 72, + 50, 67, 34, 82, 34, 82, 50, 66, 70, 100, 147, 147, + 146, 146, 34, 67, 40, 85, 240, 13, 10, 0, 8, 99, + 35, 35, 35, 35, 35, 0, 25, 32, 50, 19, 0, 17, + 38, 186, 132, 84, 83, 36, 50, 82, 38, 50, 51, 19, + 49, 51, 34, 19, 146, 34, 18, 162, 34, 18, 162, 34, + 18, 162, 34, 19, 146, 35, 19, 49, 51, 50, 23, 50, + 67, 36, 51, 84, 84, 123, 167, 0, 15, 16, 20, 9, + 0, 8, 21, 50, 34, 34, 50, 34, 50, 34, 50, 34, + 35, 51, 33, 183, 0, 16, 31, 15, 0, 23, 18, 51, + 98, 51, 98, 66, 98, 66, 99, 50, 99, 51, 99, 51, + 115, 50, 130, 66, 130, 66, 130, 51, 130, 51, 0, 11, + 64, 13, 14, 0, 24, 76, 44, 194, 194, 194, 194, 0, + 17, 96, 9, 10, 0, 20, 8, 40, 0, 15, 32, 54, + 19, 0, 17, 38, 186, 132, 84, 89, 50, 82, 18, 51, + 34, 51, 18, 66, 35, 34, 34, 66, 50, 34, 34, 51, + 50, 34, 38, 82, 34, 34, 34, 82, 34, 34, 50, 66, + 35, 18, 65, 51, 50, 18, 81, 34, 67, 147, 84, 84, + 123, 167, 0, 15, 16, 9, 10, 0, 10, 8, 40, 0, + 25, 32, 17, 8, 0, 7, 20, 68, 50, 34, 34, 34, + 34, 34, 52, 68, 0, 16, 48, 20, 12, 0, 12, 66, + 162, 162, 162, 106, 42, 98, 162, 162, 162, 240, 58, 42, + 0, 13, 96, 19, 9, 0, 7, 3, 70, 49, 66, 114, + 114, 98, 114, 98, 98, 98, 103, 0, 14, 112, 19, 9, + 0, 7, 4, 70, 114, 114, 68, 84, 115, 114, 114, 33, + 51, 38, 68, 0, 14, 12, 8, 0, 6, 51, 67, 67, + 67, 82, 0, 19, 96, 36, 13, 0, 19, 66, 98, 50, + 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, + 98, 50, 83, 51, 52, 55, 18, 50, 19, 50, 34, 178, + 178, 178, 178, 240, 144, 38, 14, 0, 12, 89, 59, 54, + 18, 86, 18, 71, 18, 86, 18, 86, 18, 101, 18, 146, + 18, 146, 18, 146, 18, 146, 18, 146, 18, 146, 18, 146, + 18, 146, 18, 146, 18, 0, 11, 10, 5, 0, 8, 99, + 35, 35, 0, 8, 48, 11, 7, 0, 20, 34, 83, 98, + 82, 37, 51, 160, 17, 9, 0, 7, 3, 69, 65, 34, + 114, 114, 114, 114, 114, 114, 71, 0, 16, 19, 9, 0, + 8, 19, 82, 18, 50, 50, 34, 50, 34, 50, 35, 18, + 68, 215, 0, 16, 31, 14, 0, 21, 2, 51, 99, 51, + 99, 50, 114, 66, 114, 66, 114, 51, 83, 51, 82, 51, + 82, 66, 83, 50, 83, 51, 82, 51, 0, 11, 32, 49, + 19, 0, 14, 51, 146, 68, 146, 98, 130, 114, 114, 130, + 114, 130, 98, 146, 82, 162, 82, 162, 66, 50, 70, 18, + 51, 177, 52, 162, 49, 18, 146, 49, 34, 145, 50, 34, + 130, 56, 82, 130, 113, 146, 98, 146, 82, 0, 13, 112, + 47, 19, 0, 14, 51, 146, 68, 145, 114, 130, 114, 114, + 130, 113, 146, 98, 146, 82, 162, 81, 35, 98, 72, 54, + 18, 18, 50, 145, 114, 130, 114, 114, 114, 129, 130, 114, + 114, 114, 114, 129, 114, 130, 103, 50, 0, 13, 112, 52, + 19, 0, 14, 68, 114, 86, 98, 146, 82, 116, 82, 132, + 82, 163, 50, 194, 34, 129, 66, 34, 34, 70, 34, 35, + 84, 34, 51, 177, 49, 18, 162, 34, 18, 146, 49, 34, + 145, 50, 34, 130, 56, 82, 130, 113, 146, 98, 146, 82, + 0, 13, 112, 23, 10, 0, 14, 19, 115, 115, 240, 194, + 130, 130, 130, 115, 114, 115, 99, 114, 130, 131, 50, 55, + 69, 208, 40, 16, 35, 227, 227, 227, 226, 242, 240, 226, + 212, 196, 182, 162, 34, 162, 34, 147, 35, 130, 66, 130, + 66, 115, 67, 98, 98, 106, 92, 66, 130, 51, 131, 34, + 162, 34, 162, 0, 12, 32, 41, 16, 147, 195, 195, 210, + 210, 210, 240, 240, 18, 212, 196, 182, 162, 34, 162, 34, + 147, 35, 130, 66, 130, 66, 115, 67, 98, 98, 106, 92, + 66, 130, 51, 131, 34, 162, 34, 162, 0, 12, 32, 43, + 16, 98, 212, 182, 162, 34, 146, 66, 114, 98, 240, 178, + 212, 196, 182, 162, 34, 162, 34, 147, 35, 130, 66, 130, + 66, 115, 67, 98, 98, 106, 92, 66, 130, 51, 131, 34, + 162, 34, 162, 0, 12, 32, 42, 17, 240, 240, 131, 49, + 152, 145, 51, 0, 5, 115, 212, 212, 210, 18, 178, 34, + 178, 35, 162, 50, 146, 66, 146, 67, 115, 82, 114, 98, + 123, 92, 82, 130, 82, 146, 51, 146, 50, 163, 0, 13, + 43, 16, 240, 240, 83, 35, 131, 35, 131, 35, 240, 240, + 195, 212, 196, 182, 162, 34, 162, 34, 147, 35, 130, 66, + 130, 66, 115, 67, 98, 98, 91, 92, 66, 130, 51, 131, + 34, 162, 34, 162, 0, 12, 32, 44, 17, 99, 213, 194, + 18, 194, 18, 197, 211, 240, 240, 33, 243, 225, 17, 210, + 18, 194, 18, 193, 49, 178, 50, 162, 50, 146, 82, 130, + 82, 130, 82, 123, 107, 83, 115, 66, 146, 66, 146, 51, + 147, 0, 13, 37, 21, 0, 19, 59, 171, 164, 240, 18, + 18, 240, 18, 18, 242, 34, 242, 34, 226, 56, 130, 56, + 114, 66, 210, 66, 201, 201, 179, 82, 178, 98, 162, 121, + 35, 121, 0, 16, 31, 15, 0, 13, 102, 122, 67, 83, + 51, 194, 195, 194, 210, 210, 210, 210, 211, 210, 211, 129, + 67, 83, 90, 103, 161, 243, 210, 165, 164, 240, 96, 29, + 12, 3, 163, 163, 163, 162, 178, 240, 42, 42, 34, 162, + 162, 162, 162, 169, 57, 50, 162, 162, 162, 162, 162, 170, + 42, 0, 9, 32, 29, 12, 115, 131, 131, 131, 146, 146, + 240, 74, 42, 34, 162, 162, 162, 162, 169, 57, 50, 162, + 162, 162, 162, 162, 170, 42, 0, 9, 32, 31, 12, 66, + 148, 118, 98, 34, 82, 66, 50, 98, 234, 42, 34, 162, + 162, 162, 162, 169, 57, 50, 162, 162, 162, 162, 162, 170, + 42, 0, 9, 32, 30, 12, 240, 163, 35, 67, 35, 67, + 35, 240, 202, 42, 34, 162, 162, 162, 162, 169, 57, 50, + 162, 162, 162, 162, 162, 170, 42, 0, 9, 32, 29, 11, + 3, 147, 147, 147, 146, 162, 240, 24, 56, 98, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 104, 56, + 0, 8, 64, 29, 11, 99, 115, 115, 130, 130, 130, 240, + 56, 56, 98, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 104, 56, 0, 8, 80, 31, 12, 66, 148, + 118, 98, 34, 82, 66, 50, 98, 248, 72, 114, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 120, 72, + 0, 9, 48, 30, 10, 240, 83, 35, 35, 35, 35, 35, + 240, 120, 40, 82, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 88, 40, 0, 7, 96, 37, 17, 0, + 15, 24, 154, 114, 99, 98, 115, 82, 130, 82, 131, 66, + 146, 41, 66, 41, 66, 66, 146, 66, 146, 66, 131, 66, + 130, 82, 115, 82, 84, 106, 120, 0, 13, 80, 57, 15, + 240, 240, 52, 33, 135, 114, 36, 240, 240, 82, 146, 35, + 130, 36, 114, 36, 114, 34, 18, 98, 34, 19, 82, 34, + 34, 82, 34, 50, 66, 34, 51, 50, 34, 66, 50, 34, + 82, 34, 34, 83, 18, 34, 98, 18, 34, 116, 34, 116, + 34, 131, 34, 146, 0, 11, 64, 42, 16, 35, 242, 242, + 242, 242, 240, 240, 229, 152, 115, 67, 83, 99, 66, 130, + 50, 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, + 34, 162, 50, 130, 67, 99, 83, 67, 120, 149, 0, 12, + 112, 42, 16, 147, 195, 195, 194, 210, 0, 5, 101, 152, + 115, 67, 83, 99, 66, 130, 50, 162, 34, 162, 34, 162, + 34, 162, 34, 162, 34, 162, 34, 162, 50, 130, 67, 99, + 83, 67, 120, 149, 0, 12, 112, 44, 16, 98, 212, 182, + 146, 66, 114, 98, 240, 240, 181, 152, 115, 67, 83, 99, + 66, 130, 50, 162, 34, 162, 34, 162, 34, 162, 34, 162, + 34, 162, 34, 162, 50, 130, 67, 99, 83, 67, 120, 149, + 0, 12, 112, 44, 16, 240, 240, 99, 49, 136, 129, 51, + 240, 240, 213, 152, 115, 67, 83, 99, 66, 130, 50, 162, + 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, + 50, 130, 67, 99, 83, 67, 120, 149, 0, 12, 112, 45, + 16, 240, 240, 83, 35, 131, 35, 131, 35, 240, 240, 197, + 152, 115, 67, 83, 99, 66, 130, 50, 162, 34, 162, 34, + 162, 34, 162, 34, 162, 34, 162, 34, 162, 50, 130, 67, + 99, 83, 67, 120, 149, 0, 12, 112, 22, 11, 0, 15, + 17, 97, 50, 67, 50, 35, 85, 114, 132, 98, 34, 66, + 66, 49, 97, 0, 14, 16, 49, 16, 0, 13, 49, 151, + 121, 99, 67, 83, 84, 66, 82, 18, 50, 97, 35, 34, + 82, 50, 34, 66, 66, 34, 66, 66, 34, 50, 82, 34, + 50, 82, 34, 34, 98, 50, 17, 98, 68, 83, 83, 67, + 105, 113, 21, 130, 0, 11, 80, 44, 14, 19, 210, 210, + 210, 210, 240, 240, 66, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 35, 99, 51, 67, 88, 118, + 0, 11, 16, 44, 14, 131, 163, 162, 178, 178, 240, 240, + 98, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 35, 99, 51, 67, 88, 118, 0, 11, 16, 46, + 14, 82, 180, 150, 114, 66, 97, 97, 240, 240, 34, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 35, 99, 51, 67, 88, 118, 0, 11, 16, 46, 14, 240, + 243, 35, 99, 35, 99, 35, 240, 240, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 35, 99, + 51, 67, 88, 118, 0, 11, 16, 35, 16, 147, 195, 195, + 210, 210, 210, 240, 163, 131, 50, 130, 82, 98, 99, 67, + 114, 66, 131, 35, 146, 34, 180, 196, 210, 226, 226, 226, + 226, 226, 226, 226, 0, 13, 31, 13, 0, 11, 50, 178, + 178, 184, 89, 66, 83, 50, 99, 34, 114, 34, 114, 34, + 114, 34, 99, 34, 83, 57, 72, 82, 178, 178, 0, 11, + 16, 41, 14, 0, 10, 117, 121, 83, 67, 51, 98, 50, + 114, 50, 98, 66, 67, 82, 51, 98, 50, 114, 50, 114, + 67, 82, 84, 50, 115, 34, 130, 34, 130, 34, 49, 51, + 34, 54, 50, 53, 0, 11, 34, 13, 0, 10, 2, 194, + 194, 194, 194, 240, 102, 104, 67, 66, 66, 82, 50, 98, + 50, 98, 50, 98, 50, 83, 50, 83, 51, 37, 70, 18, + 84, 50, 0, 10, 34, 13, 0, 10, 83, 147, 147, 162, + 162, 240, 134, 104, 67, 66, 66, 82, 50, 98, 50, 98, + 50, 98, 50, 83, 50, 83, 51, 37, 70, 18, 84, 50, + 0, 10, 37, 13, 0, 10, 35, 149, 130, 34, 98, 66, + 66, 97, 240, 70, 104, 67, 66, 66, 82, 50, 98, 50, + 98, 50, 98, 50, 83, 50, 83, 51, 37, 70, 18, 84, + 50, 0, 10, 35, 13, 0, 11, 99, 34, 87, 97, 36, + 240, 240, 54, 104, 67, 66, 66, 82, 50, 98, 50, 98, + 50, 98, 50, 83, 50, 83, 51, 37, 70, 18, 84, 50, + 0, 10, 36, 13, 0, 11, 83, 35, 83, 35, 83, 35, + 240, 240, 38, 104, 67, 66, 66, 82, 50, 98, 50, 98, + 50, 98, 50, 83, 50, 83, 51, 37, 70, 33, 84, 50, + 0, 10, 35, 13, 0, 10, 36, 134, 114, 34, 118, 132, + 240, 102, 104, 67, 66, 66, 82, 50, 98, 50, 98, 50, + 98, 50, 83, 50, 83, 51, 37, 71, 17, 84, 50, 0, + 10, 33, 20, 0, 30, 37, 69, 88, 23, 65, 84, 66, + 163, 98, 95, 63, 2, 35, 82, 162, 98, 162, 84, 147, + 50, 19, 66, 55, 25, 68, 85, 0, 15, 64, 25, 12, + 0, 18, 69, 88, 51, 65, 66, 146, 162, 162, 162, 163, + 163, 66, 72, 85, 129, 195, 162, 117, 116, 240, 32, 28, + 13, 0, 9, 115, 194, 194, 194, 194, 240, 101, 119, 82, + 82, 50, 98, 58, 59, 34, 178, 179, 179, 81, 89, 86, + 0, 10, 32, 28, 13, 0, 10, 83, 147, 147, 147, 146, + 240, 149, 119, 82, 82, 50, 98, 58, 59, 34, 178, 179, + 179, 81, 89, 86, 0, 10, 32, 31, 13, 0, 10, 35, + 149, 115, 34, 82, 82, 65, 113, 240, 69, 119, 82, 82, + 50, 98, 58, 59, 34, 178, 179, 179, 81, 89, 86, 0, + 10, 32, 30, 13, 0, 11, 83, 35, 83, 35, 83, 35, + 240, 240, 37, 119, 82, 82, 50, 113, 58, 59, 34, 178, + 179, 179, 81, 89, 86, 0, 10, 32, 24, 7, 240, 240, + 195, 83, 82, 98, 240, 66, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 240, 240, 224, 24, 7, 240, 240, + 227, 66, 66, 66, 240, 66, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 0, 5, 112, 26, 10, 0, 7, + 114, 116, 82, 34, 50, 66, 240, 162, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 0, 8, 16, 26, 10, + 0, 8, 99, 35, 35, 35, 35, 35, 240, 162, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 0, 8, 16, + 38, 13, 0, 8, 67, 49, 118, 132, 132, 130, 34, 113, + 51, 178, 100, 18, 89, 51, 52, 35, 83, 34, 114, 34, + 114, 34, 114, 34, 114, 35, 82, 67, 51, 72, 117, 0, + 10, 48, 37, 12, 0, 10, 99, 49, 72, 65, 51, 240, + 210, 36, 66, 22, 52, 51, 35, 82, 34, 98, 34, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 0, 9, 32, 33, 13, 0, 9, 115, 194, 194, 194, 194, + 240, 101, 119, 83, 51, 51, 83, 34, 114, 34, 114, 34, + 114, 34, 114, 35, 83, 51, 51, 87, 117, 0, 10, 48, + 33, 13, 0, 10, 83, 147, 147, 146, 162, 240, 149, 119, + 83, 51, 51, 83, 34, 114, 34, 114, 34, 114, 34, 114, + 35, 83, 51, 51, 87, 117, 0, 10, 48, 36, 13, 0, + 10, 35, 149, 115, 19, 82, 82, 65, 113, 240, 69, 119, + 83, 51, 51, 83, 34, 114, 34, 114, 34, 114, 34, 114, + 35, 83, 51, 51, 87, 117, 0, 10, 48, 34, 13, 0, + 11, 84, 34, 87, 82, 36, 240, 240, 53, 119, 83, 51, + 51, 83, 34, 114, 34, 114, 34, 114, 34, 114, 35, 83, + 51, 51, 87, 117, 0, 10, 48, 35, 13, 0, 11, 83, + 35, 83, 35, 83, 35, 240, 240, 37, 119, 83, 51, 51, + 83, 34, 114, 34, 114, 34, 114, 34, 114, 35, 83, 51, + 51, 87, 117, 0, 10, 48, 17, 12, 0, 17, 3, 147, + 147, 240, 42, 42, 240, 51, 147, 147, 0, 14, 16, 33, + 13, 0, 18, 114, 102, 103, 83, 36, 51, 53, 34, 50, + 34, 34, 50, 34, 34, 34, 50, 34, 18, 66, 37, 51, + 51, 51, 87, 87, 97, 0, 9, 64, 36, 13, 0, 9, + 115, 178, 194, 194, 240, 240, 50, 98, 50, 98, 50, 98, + 50, 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, 83, + 51, 37, 70, 18, 84, 50, 0, 10, 36, 13, 0, 10, + 82, 162, 162, 162, 240, 240, 50, 98, 50, 98, 50, 98, + 50, 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, 83, + 51, 37, 70, 18, 84, 50, 0, 10, 37, 13, 0, 10, + 34, 164, 130, 34, 98, 66, 240, 242, 98, 50, 98, 50, + 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, + 83, 51, 37, 70, 18, 84, 50, 0, 10, 37, 13, 0, + 11, 67, 35, 83, 35, 83, 35, 240, 242, 98, 50, 98, + 50, 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, 98, + 50, 83, 51, 37, 70, 18, 84, 50, 0, 10, 39, 14, + 0, 11, 66, 178, 178, 178, 240, 240, 98, 114, 50, 99, + 66, 82, 82, 82, 83, 50, 114, 50, 114, 35, 130, 18, + 146, 18, 163, 179, 179, 178, 194, 113, 50, 134, 148, 240, + 128, 40, 13, 0, 9, 98, 178, 178, 178, 178, 178, 178, + 36, 82, 23, 52, 66, 51, 83, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 98, 51, 67, 57, 66, 21, 82, 178, + 178, 178, 178, 240, 144, 40, 14, 0, 12, 67, 35, 99, + 35, 99, 35, 240, 240, 35, 99, 50, 98, 66, 98, 82, + 66, 98, 66, 114, 50, 114, 34, 130, 34, 149, 148, 179, + 178, 194, 179, 113, 50, 133, 148, 240, 144, +}; + +//***************************************************************************** +// +// The glyph offset table for the 24 point Sansand font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetSansand24[] = +{ + 0, 5, 27, 46, 78, 117, 168, 205, + 217, 246, 275, 295, 312, 324, 333, 343, + 372, 409, 434, 459, 486, 516, 542, 575, + 599, 634, 666, 680, 695, 712, 724, 742, + 767, 826, 861, 896, 923, 960, 984, 1008, + 1040, 1079, 1103, 1128, 1167, 1191, 1253, 1303, + 1340, 1371, 1410, 1447, 1473, 1496, 1535, 1572, + 1636, 1673, 1703, 1727, 1756, 1782, 1811, 1834, + 1843, 1855, 1883, 1918, 1939, 1975, 1997, 2022, + 2056, 2093, 2115, 2141, 2176, 2199, 2241, 2272, + 2299, 2333, 2364, 2387, 2408, 2432, 2462, 2490, + 2533, 2559, 2592, 2611, 2640, 2667, 2697, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2711, 2716, 2737, 2770, 2794, 2825, 2855, 2878, + 2911, 2924, 2974, 2994, 3025, 3038, 3047, 3101, + 3110, 3127, 3147, 3166, 3185, 3197, 3233, 3271, + 3281, 3292, 3309, 3328, 3359, 3408, 3455, 3507, + 3530, 3570, 3611, 3654, 3696, 3739, 3783, 3820, + 3851, 3880, 3909, 3940, 3970, 3999, 4028, 4059, + 4089, 4126, 4183, 4225, 4267, 4311, 4355, 4400, + 4422, 4471, 4515, 4559, 4605, 4651, 4686, 4717, + 4758, 4792, 4826, 4863, 4898, 4934, 4969, 5002, + 5027, 5055, 5083, 5114, 5144, 5168, 5192, 5218, + 5244, 5282, 5319, 5352, 5385, 5421, 5455, 5490, + 5507, 5540, 5576, 5612, 5649, 5686, 5725, 5765, +}; + +//***************************************************************************** +// +// The font definition for the 24 point Sansand font. +// +//***************************************************************************** +const tFontEx g_sFontExSansand24 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 21, + + // + // The height of the font. + // + 30, + + // + // The baseline of the font. + // + 24, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetSansand24, + + // + // A pointer to the actual font data + // + g_pui8Sansand24Data +}; diff --git a/third_party/fonts/ofl/fonts/fontsansand26.c b/third_party/fonts/ofl/fonts/fontsansand26.c new file mode 100644 index 0000000..3dea0e1 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontsansand26.c @@ -0,0 +1,740 @@ +//***************************************************************************** +// +// fontsansand26.c - Font definition for the 26pt Sansand font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://scripts.sil.org/cms/scripts/page.php? +// item_id=Andika_download +// +// Copyright (c) 2004-2008, SIL International (http://scripts.sil.org), +// with Reserved Font Names 'Andika' and 'SIL'. +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: sansand +// Size: 26 point +// Bold: no +// Italic: no +// Memory usage: 6388 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 26 point Sansand font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Sansand26Data[6188] = +{ + 4, 10, 0, 40, 24, 5, 240, 240, 83, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 240, 35, 35, + 35, 240, 240, 32, 21, 8, 0, 6, 2, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 0, 19, + 32, 34, 17, 0, 17, 98, 50, 162, 50, 146, 66, 146, + 50, 110, 62, 98, 50, 162, 50, 161, 66, 110, 62, 98, + 50, 146, 66, 146, 50, 162, 50, 161, 66, 0, 18, 41, + 13, 0, 10, 34, 178, 178, 152, 73, 51, 18, 49, 50, + 34, 114, 34, 114, 34, 118, 134, 150, 134, 114, 35, 98, + 50, 98, 50, 98, 35, 34, 34, 19, 57, 86, 162, 178, + 178, 0, 5, 96, 54, 19, 0, 19, 35, 114, 101, 83, + 82, 50, 66, 98, 50, 51, 98, 50, 50, 114, 50, 34, + 130, 50, 34, 149, 34, 179, 35, 20, 178, 22, 150, 35, + 130, 18, 66, 114, 34, 66, 114, 34, 66, 98, 50, 66, + 98, 51, 35, 82, 86, 98, 100, 0, 14, 96, 40, 15, + 0, 15, 52, 166, 131, 35, 114, 66, 114, 66, 115, 34, + 146, 19, 164, 179, 181, 146, 35, 115, 50, 49, 50, 82, + 19, 34, 100, 50, 99, 67, 69, 72, 19, 84, 66, 0, + 11, 64, 13, 4, 240, 146, 34, 34, 34, 34, 34, 34, + 0, 9, 96, 30, 8, 0, 6, 66, 83, 82, 82, 83, + 82, 98, 98, 82, 98, 98, 98, 98, 98, 98, 98, 98, + 114, 98, 98, 114, 99, 98, 114, 97, 176, 30, 8, 0, + 6, 2, 99, 98, 114, 98, 114, 98, 98, 114, 98, 98, + 98, 98, 98, 98, 98, 83, 82, 98, 83, 82, 83, 82, + 82, 113, 224, 21, 11, 0, 8, 98, 146, 33, 34, 34, + 18, 55, 99, 100, 18, 50, 34, 18, 98, 146, 0, 24, + 17, 13, 0, 18, 66, 178, 178, 178, 107, 43, 114, 178, + 178, 178, 178, 0, 17, 12, 6, 0, 17, 50, 52, 66, + 66, 50, 50, 240, 112, 9, 11, 0, 23, 57, 41, 0, + 18, 16, 10, 5, 0, 14, 51, 35, 35, 240, 240, 32, + 30, 14, 0, 11, 98, 194, 193, 194, 194, 178, 194, 178, + 194, 178, 194, 178, 194, 178, 194, 193, 194, 194, 178, 194, + 178, 194, 178, 0, 6, 96, 38, 15, 0, 15, 69, 137, + 98, 83, 66, 114, 66, 114, 50, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 50, 114, + 66, 114, 67, 83, 89, 133, 0, 12, 27, 12, 0, 12, + 51, 132, 102, 99, 18, 97, 50, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 106, 42, 0, 9, 32, 27, + 14, 0, 14, 53, 120, 83, 67, 66, 114, 194, 194, 194, + 179, 178, 178, 179, 163, 163, 163, 163, 163, 172, 44, 0, + 10, 96, 28, 14, 0, 14, 53, 121, 82, 83, 194, 194, + 179, 163, 117, 150, 196, 194, 210, 194, 194, 33, 131, 35, + 83, 58, 102, 0, 11, 32, 32, 15, 0, 16, 18, 195, + 180, 165, 147, 18, 131, 34, 130, 50, 114, 66, 98, 82, + 83, 82, 67, 98, 77, 45, 178, 210, 210, 210, 210, 0, + 11, 96, 28, 14, 0, 14, 26, 74, 66, 194, 194, 194, + 199, 121, 81, 99, 195, 194, 194, 194, 194, 33, 130, 51, + 83, 58, 102, 0, 11, 32, 33, 15, 0, 15, 86, 121, + 83, 82, 67, 194, 210, 194, 210, 38, 91, 68, 83, 50, + 131, 34, 146, 34, 146, 50, 130, 50, 115, 52, 67, 89, + 133, 0, 12, 25, 15, 0, 15, 13, 45, 195, 179, 179, + 194, 195, 194, 195, 194, 195, 194, 195, 194, 195, 195, 194, + 195, 0, 12, 64, 36, 15, 0, 15, 69, 137, 83, 83, + 66, 114, 66, 114, 66, 114, 82, 82, 120, 105, 83, 83, + 51, 114, 50, 146, 34, 146, 34, 146, 35, 115, 51, 83, + 89, 133, 0, 12, 33, 14, 0, 14, 53, 136, 83, 67, + 50, 114, 50, 129, 50, 130, 34, 130, 50, 84, 59, 85, + 34, 194, 194, 178, 194, 179, 66, 67, 88, 117, 0, 11, + 48, 15, 5, 0, 8, 99, 35, 35, 240, 240, 35, 35, + 35, 240, 240, 32, 17, 6, 0, 10, 82, 52, 50, 240, + 240, 147, 52, 66, 66, 50, 50, 240, 112, 19, 15, 0, + 22, 2, 165, 133, 118, 117, 147, 196, 198, 197, 198, 196, + 210, 0, 17, 16, 12, 14, 0, 24, 76, 44, 240, 252, + 44, 0, 21, 32, 19, 15, 0, 20, 82, 212, 198, 197, + 198, 196, 165, 133, 118, 102, 148, 177, 0, 18, 80, 26, + 10, 0, 8, 117, 71, 50, 51, 130, 130, 115, 114, 114, + 130, 114, 130, 130, 130, 130, 240, 195, 115, 115, 0, 8, + 16, 61, 21, 0, 24, 70, 203, 148, 100, 99, 162, 83, + 54, 50, 66, 56, 34, 66, 35, 66, 50, 34, 50, 82, + 50, 34, 34, 98, 50, 34, 34, 98, 50, 34, 34, 98, + 50, 34, 34, 83, 50, 34, 35, 52, 34, 51, 38, 37, + 66, 52, 51, 99, 240, 67, 240, 68, 97, 187, 214, 0, + 8, 112, 38, 18, 0, 18, 99, 244, 213, 210, 18, 210, + 34, 179, 34, 178, 51, 162, 66, 146, 82, 146, 83, 115, + 98, 123, 124, 83, 130, 82, 146, 82, 147, 51, 162, 50, + 179, 0, 13, 96, 37, 14, 0, 14, 9, 90, 66, 99, + 50, 114, 50, 114, 50, 114, 50, 98, 73, 90, 66, 99, + 50, 115, 34, 130, 34, 130, 34, 130, 34, 115, 34, 99, + 58, 73, 0, 11, 16, 28, 16, 0, 16, 86, 139, 68, + 82, 82, 210, 226, 210, 226, 226, 226, 226, 226, 227, 226, + 227, 145, 68, 83, 90, 134, 0, 12, 80, 38, 16, 0, + 16, 9, 123, 82, 100, 66, 131, 50, 146, 50, 147, 34, + 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, + 146, 50, 146, 50, 131, 50, 100, 74, 104, 0, 13, 24, + 13, 0, 13, 11, 43, 34, 178, 178, 178, 178, 186, 58, + 50, 178, 178, 178, 178, 178, 178, 187, 43, 0, 10, 25, + 13, 0, 13, 11, 43, 34, 178, 178, 178, 178, 178, 186, + 58, 50, 178, 178, 178, 178, 178, 178, 178, 0, 11, 16, + 34, 17, 0, 17, 102, 155, 68, 99, 66, 226, 242, 226, + 242, 242, 103, 34, 103, 34, 178, 34, 178, 35, 162, 50, + 162, 51, 146, 68, 84, 91, 135, 0, 13, 48, 41, 16, + 0, 16, 2, 162, 34, 162, 34, 162, 34, 162, 34, 162, + 34, 162, 34, 162, 34, 162, 46, 46, 34, 162, 34, 162, + 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, + 0, 12, 32, 25, 11, 0, 11, 9, 41, 82, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 105, + 41, 0, 8, 64, 26, 11, 0, 11, 114, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 131, 34, + 66, 56, 69, 0, 8, 112, 41, 15, 0, 15, 2, 115, + 50, 99, 66, 83, 82, 67, 98, 51, 114, 35, 130, 34, + 146, 18, 164, 181, 162, 19, 146, 35, 130, 51, 114, 67, + 98, 83, 82, 99, 66, 115, 50, 116, 0, 11, 64, 24, + 13, 0, 13, 2, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 187, 43, 0, 10, 66, + 19, 0, 19, 3, 179, 36, 148, 36, 148, 36, 148, 37, + 117, 34, 18, 114, 18, 34, 18, 114, 18, 34, 34, 82, + 34, 34, 34, 82, 34, 34, 34, 82, 34, 34, 50, 50, + 50, 34, 50, 50, 50, 34, 50, 50, 50, 34, 66, 18, + 66, 34, 66, 18, 66, 34, 69, 66, 34, 83, 82, 34, + 83, 82, 0, 14, 64, 52, 16, 0, 16, 2, 162, 35, + 146, 36, 130, 36, 130, 37, 114, 34, 19, 98, 34, 35, + 82, 34, 50, 82, 34, 51, 66, 34, 67, 50, 34, 82, + 50, 34, 83, 34, 34, 99, 18, 34, 114, 18, 34, 132, + 34, 132, 34, 147, 34, 162, 0, 12, 32, 39, 18, 0, + 18, 86, 185, 116, 68, 98, 131, 66, 162, 66, 162, 50, + 194, 34, 194, 34, 194, 34, 194, 34, 194, 34, 194, 35, + 162, 66, 162, 67, 130, 100, 68, 121, 182, 0, 14, 48, + 31, 14, 0, 14, 9, 90, 66, 99, 50, 115, 34, 130, + 34, 130, 34, 130, 34, 115, 34, 99, 58, 72, 98, 194, + 194, 194, 194, 194, 194, 0, 12, 43, 19, 0, 19, 86, + 201, 132, 68, 114, 131, 82, 162, 82, 162, 66, 194, 50, + 194, 50, 194, 50, 194, 50, 194, 50, 194, 51, 163, 66, + 162, 83, 131, 100, 68, 138, 186, 240, 21, 240, 19, 0, + 9, 96, 39, 15, 0, 15, 8, 122, 82, 83, 82, 114, + 66, 114, 66, 114, 66, 114, 66, 83, 89, 104, 114, 51, + 114, 66, 114, 67, 98, 83, 82, 98, 82, 99, 66, 115, + 50, 131, 0, 11, 64, 28, 14, 0, 14, 55, 105, 67, + 82, 50, 194, 194, 195, 197, 167, 166, 179, 195, 194, 194, + 33, 131, 35, 83, 58, 102, 0, 11, 32, 25, 17, 0, + 17, 15, 47, 130, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 0, 13, 112, 40, 15, + 0, 15, 2, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 50, 114, 67, 83, 89, 133, + 0, 12, 41, 17, 0, 17, 2, 178, 35, 147, 35, 147, + 50, 146, 67, 115, 82, 115, 82, 114, 99, 83, 114, 82, + 130, 82, 131, 51, 146, 50, 162, 50, 163, 19, 178, 18, + 194, 18, 212, 211, 0, 13, 96, 68, 26, 0, 26, 2, + 146, 146, 35, 116, 115, 35, 116, 115, 50, 116, 114, 66, + 117, 98, 67, 82, 34, 83, 82, 82, 34, 83, 82, 82, + 34, 82, 98, 67, 50, 66, 99, 50, 66, 51, 114, 50, + 66, 50, 130, 50, 67, 34, 130, 34, 98, 34, 146, 18, + 98, 19, 146, 18, 98, 18, 164, 132, 164, 132, 179, 131, + 0, 20, 48, 37, 17, 0, 17, 18, 131, 67, 99, 99, + 83, 114, 67, 131, 50, 163, 19, 181, 196, 227, 212, 198, + 179, 19, 147, 35, 146, 67, 115, 83, 83, 99, 82, 131, + 51, 147, 0, 13, 31, 16, 0, 16, 3, 131, 50, 131, + 51, 99, 82, 98, 99, 67, 115, 50, 146, 34, 166, 180, + 196, 210, 226, 226, 226, 226, 226, 226, 226, 0, 13, 25, + 15, 0, 15, 28, 60, 194, 195, 179, 194, 195, 179, 194, + 195, 179, 179, 195, 179, 179, 195, 189, 45, 0, 11, 64, + 30, 8, 0, 6, 6, 38, 34, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 102, 38, 160, 28, 9, 0, 6, 98, 114, + 114, 130, 114, 114, 114, 130, 114, 114, 130, 114, 114, 114, + 130, 114, 114, 130, 114, 114, 114, 0, 5, 112, 30, 7, + 240, 240, 197, 37, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 37, 37, 144, 24, 14, 0, 11, 18, 180, 164, 146, + 34, 130, 34, 114, 66, 98, 66, 83, 82, 66, 99, 35, + 114, 0, 28, 32, 11, 18, 0, 63, 15, 1, 47, 1, + 240, 240, 128, 13, 9, 0, 6, 99, 115, 115, 115, 115, + 114, 0, 22, 96, 31, 14, 0, 23, 38, 105, 82, 82, + 66, 98, 66, 98, 50, 114, 50, 114, 50, 114, 50, 99, + 50, 84, 66, 53, 71, 18, 99, 66, 0, 10, 96, 38, + 14, 0, 10, 66, 194, 194, 194, 194, 194, 194, 194, 52, + 82, 23, 69, 51, 51, 99, 35, 114, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 114, 51, 83, 58, 102, 0, 11, + 32, 22, 12, 0, 20, 5, 88, 51, 66, 50, 146, 162, + 162, 162, 162, 178, 163, 66, 72, 86, 0, 9, 48, 39, + 15, 0, 12, 66, 210, 210, 210, 210, 210, 210, 117, 18, + 90, 67, 83, 66, 114, 50, 130, 50, 130, 50, 130, 50, + 130, 50, 130, 51, 99, 67, 53, 87, 18, 101, 50, 0, + 11, 64, 23, 14, 0, 23, 37, 120, 83, 67, 66, 98, + 50, 114, 59, 60, 34, 194, 210, 195, 97, 90, 102, 0, + 11, 26, 11, 0, 8, 116, 101, 83, 130, 146, 146, 146, + 104, 56, 98, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 0, 9, 37, 13, 0, 21, 86, 89, 51, 82, 50, + 98, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 99, 50, 53, 55, 18, 69, 34, 178, 178, 49, 99, 50, + 67, 72, 117, 80, 39, 13, 0, 9, 98, 178, 178, 178, + 178, 178, 178, 178, 37, 66, 23, 53, 51, 35, 98, 35, + 98, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 0, 10, 23, 5, 240, 240, 163, + 35, 35, 210, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 240, 240, 32, 28, 10, 0, 10, 83, 115, + 115, 240, 210, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 114, 55, 68, 80, 38, 12, + 0, 9, 2, 162, 162, 162, 162, 162, 162, 162, 83, 34, + 67, 50, 51, 66, 34, 98, 18, 116, 133, 114, 19, 98, + 35, 82, 50, 82, 51, 66, 67, 50, 83, 0, 9, 32, + 25, 4, 240, 146, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 240, + 176, 44, 21, 0, 34, 19, 36, 68, 89, 23, 68, 53, + 51, 51, 83, 82, 50, 98, 98, 50, 98, 98, 50, 98, + 98, 50, 98, 98, 50, 98, 98, 50, 98, 98, 50, 98, + 98, 50, 98, 98, 50, 98, 98, 0, 16, 33, 14, 0, + 22, 99, 52, 82, 23, 69, 51, 51, 98, 51, 98, 50, + 114, 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, 50, + 114, 50, 114, 0, 10, 96, 29, 14, 0, 23, 37, 120, + 83, 67, 66, 98, 50, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 35, 98, 67, 67, 88, 117, 0, 11, 32, 36, + 14, 0, 22, 98, 52, 82, 23, 69, 51, 51, 99, 35, + 114, 34, 130, 34, 130, 34, 130, 34, 130, 34, 114, 52, + 67, 58, 66, 36, 98, 194, 194, 194, 194, 194, 192, 34, + 13, 0, 21, 86, 89, 51, 82, 50, 98, 34, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 35, 83, 51, 52, 73, + 84, 34, 178, 178, 178, 178, 178, 178, 32, 24, 12, 0, + 19, 67, 52, 50, 37, 50, 34, 98, 18, 116, 132, 131, + 147, 146, 162, 162, 162, 162, 0, 10, 16, 22, 11, 0, + 18, 21, 87, 51, 65, 50, 146, 164, 134, 132, 146, 146, + 34, 67, 40, 70, 0, 8, 96, 25, 12, 0, 13, 114, + 162, 162, 162, 121, 57, 98, 162, 162, 162, 162, 162, 162, + 162, 162, 65, 87, 101, 0, 9, 48, 33, 14, 0, 22, + 98, 114, 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, + 50, 114, 50, 114, 50, 99, 50, 84, 51, 53, 71, 18, + 84, 66, 0, 10, 96, 30, 15, 0, 24, 51, 115, 50, + 115, 51, 98, 82, 83, 83, 66, 114, 66, 114, 51, 115, + 34, 146, 19, 146, 18, 180, 180, 179, 0, 12, 16, 48, + 20, 0, 32, 66, 98, 98, 34, 83, 83, 35, 68, 66, + 66, 68, 66, 66, 50, 18, 66, 66, 50, 34, 35, 67, + 34, 34, 34, 98, 18, 50, 34, 98, 18, 66, 18, 98, + 18, 68, 131, 84, 131, 99, 131, 99, 0, 15, 80, 28, + 14, 0, 22, 99, 99, 51, 67, 82, 51, 99, 34, 134, + 148, 163, 180, 150, 115, 34, 99, 51, 83, 67, 51, 99, + 0, 10, 96, 34, 15, 0, 24, 66, 115, 50, 115, 66, + 98, 82, 83, 83, 66, 114, 66, 114, 51, 130, 34, 146, + 34, 150, 164, 180, 195, 194, 195, 194, 129, 51, 134, 164, + 160, 20, 12, 0, 19, 74, 42, 131, 146, 147, 131, 146, + 146, 146, 147, 146, 154, 42, 0, 9, 32, 30, 10, 0, + 8, 19, 84, 98, 130, 130, 130, 130, 130, 130, 130, 130, + 99, 99, 147, 130, 130, 130, 130, 130, 130, 130, 130, 131, + 132, 115, 192, 29, 4, 240, 146, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 96, 31, 10, 0, 7, + 67, 132, 130, 130, 130, 130, 130, 130, 130, 130, 130, 147, + 131, 83, 114, 130, 130, 130, 130, 130, 130, 130, 115, 84, + 99, 240, 32, 15, 16, 0, 32, 36, 98, 55, 65, 50, + 56, 50, 100, 0, 24, 64, 4, 16, 0, 64, 22, 5, + 0, 7, 67, 35, 35, 240, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 35, 112, 36, 12, 0, 15, + 82, 162, 162, 149, 88, 51, 18, 33, 50, 34, 82, 50, + 82, 50, 82, 50, 82, 50, 82, 50, 98, 34, 102, 18, + 72, 100, 146, 162, 162, 240, 240, 176, 24, 13, 0, 13, + 69, 118, 99, 162, 178, 178, 178, 152, 88, 114, 178, 178, + 178, 178, 178, 162, 171, 43, 0, 10, 35, 17, 0, 17, + 17, 177, 51, 147, 51, 35, 35, 91, 115, 51, 130, 82, + 114, 114, 98, 114, 98, 114, 114, 82, 131, 51, 123, 83, + 35, 35, 66, 146, 0, 21, 80, 32, 16, 0, 16, 3, + 131, 50, 130, 82, 98, 98, 98, 114, 66, 131, 50, 146, + 34, 163, 18, 180, 154, 106, 162, 170, 106, 162, 226, 226, + 226, 0, 13, 25, 4, 240, 146, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 240, 50, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 160, 37, 11, 0, 11, 37, 87, 51, 65, + 50, 146, 147, 147, 148, 102, 67, 35, 50, 67, 34, 82, + 34, 82, 50, 66, 55, 85, 132, 131, 147, 146, 33, 98, + 34, 67, 40, 70, 64, 13, 10, 0, 10, 3, 35, 35, + 35, 35, 35, 0, 26, 64, 53, 20, 0, 20, 102, 202, + 132, 20, 19, 115, 22, 19, 82, 35, 49, 35, 66, 34, + 130, 50, 34, 162, 34, 34, 162, 34, 34, 162, 34, 34, + 162, 34, 34, 162, 34, 35, 146, 50, 35, 49, 50, 66, + 54, 35, 82, 52, 35, 100, 99, 154, 198, 0, 16, 22, + 10, 0, 10, 37, 66, 34, 50, 50, 50, 50, 50, 50, + 50, 35, 67, 33, 240, 136, 0, 17, 96, 33, 16, 0, + 26, 82, 67, 99, 51, 99, 66, 99, 66, 114, 67, 99, + 51, 99, 51, 131, 51, 130, 67, 130, 66, 131, 66, 131, + 51, 130, 67, 0, 12, 32, 13, 14, 0, 28, 12, 44, + 194, 194, 194, 194, 0, 17, 96, 9, 11, 0, 23, 57, + 41, 0, 18, 16, 56, 20, 0, 20, 102, 202, 132, 99, + 121, 35, 82, 34, 51, 19, 66, 34, 66, 34, 50, 50, + 66, 50, 34, 50, 51, 50, 34, 54, 82, 34, 50, 34, + 82, 34, 50, 49, 82, 34, 50, 50, 66, 50, 34, 66, + 34, 66, 34, 85, 82, 147, 100, 99, 154, 198, 0, 16, + 9, 11, 0, 11, 9, 41, 0, 30, 64, 17, 9, 0, + 9, 35, 85, 50, 50, 34, 50, 34, 50, 53, 83, 0, + 19, 80, 22, 13, 0, 13, 82, 178, 178, 178, 178, 107, + 43, 114, 178, 178, 178, 240, 240, 43, 43, 0, 14, 112, + 19, 9, 0, 7, 3, 70, 49, 66, 114, 114, 98, 114, + 98, 98, 98, 103, 39, 0, 16, 20, 9, 0, 7, 4, + 70, 114, 114, 99, 67, 100, 115, 114, 33, 66, 38, 68, + 0, 16, 32, 13, 9, 0, 7, 50, 98, 98, 98, 98, + 99, 0, 23, 32, 38, 14, 0, 22, 98, 114, 50, 114, + 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, + 50, 99, 51, 83, 52, 37, 56, 18, 50, 20, 50, 34, + 194, 194, 194, 194, 194, 192, 41, 14, 0, 14, 57, 74, + 54, 34, 70, 34, 55, 34, 70, 34, 70, 34, 85, 34, + 100, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, + 130, 34, 130, 34, 130, 34, 130, 34, 0, 10, 112, 10, + 5, 0, 10, 3, 35, 35, 0, 8, 48, 11, 7, 0, + 22, 114, 83, 98, 82, 37, 51, 48, 18, 10, 0, 7, + 99, 85, 81, 34, 130, 130, 130, 130, 130, 130, 88, 40, + 0, 19, 22, 10, 0, 10, 36, 82, 34, 50, 66, 34, + 66, 34, 66, 34, 66, 50, 34, 84, 232, 0, 17, 96, + 32, 16, 0, 26, 2, 66, 146, 66, 131, 66, 131, 51, + 131, 51, 130, 67, 115, 67, 98, 67, 99, 51, 99, 51, + 99, 66, 114, 66, 114, 66, 0, 13, 54, 20, 0, 15, + 19, 162, 68, 162, 98, 146, 114, 130, 130, 130, 130, 114, + 146, 98, 162, 98, 162, 82, 50, 70, 49, 51, 70, 34, + 51, 178, 52, 177, 50, 18, 162, 49, 34, 146, 50, 34, + 145, 72, 98, 72, 82, 146, 113, 162, 98, 162, 82, 0, + 14, 80, 51, 21, 0, 15, 115, 177, 84, 161, 97, 18, + 146, 130, 145, 146, 130, 146, 114, 162, 113, 178, 98, 178, + 82, 166, 49, 52, 70, 34, 38, 162, 114, 161, 130, 146, + 130, 130, 130, 145, 145, 146, 129, 146, 129, 161, 135, 66, + 135, 50, 0, 15, 48, 55, 19, 0, 14, 68, 130, 70, + 113, 146, 98, 146, 82, 116, 97, 132, 82, 163, 50, 194, + 49, 210, 34, 129, 51, 18, 66, 54, 33, 67, 68, 34, + 52, 161, 50, 18, 146, 34, 34, 130, 34, 50, 129, 56, + 98, 56, 82, 146, 97, 162, 82, 162, 66, 0, 13, 112, + 24, 10, 0, 15, 51, 115, 115, 240, 210, 130, 130, 130, + 130, 114, 115, 99, 99, 114, 130, 131, 50, 55, 69, 208, + 49, 18, 51, 240, 18, 240, 34, 240, 34, 240, 34, 240, + 34, 0, 6, 35, 244, 213, 210, 18, 210, 34, 179, 34, + 178, 51, 162, 66, 146, 82, 146, 83, 115, 98, 123, 124, + 83, 130, 82, 146, 82, 147, 51, 162, 50, 179, 0, 13, + 96, 44, 18, 163, 227, 227, 227, 242, 242, 0, 6, 67, + 244, 213, 210, 18, 210, 34, 179, 34, 178, 51, 162, 66, + 146, 82, 146, 83, 115, 98, 123, 124, 83, 130, 82, 146, + 82, 147, 51, 162, 50, 179, 0, 13, 96, 47, 18, 114, + 244, 213, 195, 34, 163, 66, 146, 98, 0, 5, 115, 244, + 213, 210, 18, 210, 34, 179, 34, 178, 51, 162, 66, 146, + 82, 146, 83, 115, 98, 123, 124, 83, 130, 82, 146, 82, + 147, 51, 162, 50, 179, 0, 13, 96, 49, 18, 240, 240, + 179, 65, 164, 34, 146, 36, 161, 67, 0, 6, 19, 243, + 226, 18, 210, 18, 195, 19, 178, 50, 178, 50, 163, 51, + 146, 82, 146, 82, 130, 114, 123, 109, 82, 146, 82, 146, + 67, 147, 50, 178, 35, 178, 0, 13, 96, 45, 18, 240, + 240, 163, 35, 163, 35, 163, 35, 0, 8, 35, 244, 228, + 214, 194, 34, 194, 34, 179, 35, 162, 66, 162, 66, 147, + 67, 130, 98, 138, 124, 98, 130, 83, 131, 67, 131, 66, + 162, 51, 163, 0, 13, 96, 45, 18, 100, 214, 194, 34, + 194, 34, 198, 212, 0, 6, 50, 244, 228, 214, 194, 34, + 194, 34, 178, 66, 162, 66, 147, 67, 130, 98, 130, 98, + 124, 108, 83, 131, 66, 162, 66, 162, 51, 163, 34, 194, + 0, 13, 96, 41, 22, 0, 23, 12, 172, 149, 240, 34, + 18, 240, 19, 18, 240, 18, 34, 243, 34, 242, 57, 115, + 57, 114, 66, 211, 66, 217, 202, 194, 98, 179, 98, 178, + 114, 163, 122, 34, 138, 0, 16, 96, 33, 16, 0, 16, + 102, 138, 68, 83, 66, 145, 50, 226, 210, 226, 226, 226, + 226, 226, 227, 226, 227, 145, 68, 83, 91, 119, 177, 243, + 242, 226, 181, 179, 112, 30, 13, 3, 179, 179, 178, 194, + 194, 240, 240, 43, 43, 34, 178, 178, 178, 178, 186, 58, + 50, 178, 178, 178, 178, 178, 178, 187, 43, 0, 10, 30, + 13, 115, 147, 162, 162, 162, 162, 240, 240, 75, 43, 34, + 178, 178, 178, 178, 186, 58, 50, 178, 178, 178, 178, 178, + 178, 187, 43, 0, 10, 32, 13, 66, 164, 149, 114, 35, + 82, 67, 50, 98, 240, 235, 43, 34, 178, 178, 178, 178, + 186, 58, 50, 178, 178, 178, 178, 178, 178, 187, 43, 0, + 10, 31, 13, 240, 195, 51, 67, 51, 67, 51, 240, 240, + 203, 43, 34, 178, 178, 178, 178, 186, 58, 50, 178, 178, + 178, 178, 178, 178, 187, 43, 0, 10, 30, 12, 3, 163, + 163, 163, 162, 178, 240, 249, 57, 98, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 121, 57, 0, + 9, 32, 31, 12, 100, 116, 131, 131, 130, 146, 240, 240, + 41, 57, 98, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 121, 57, 0, 9, 48, 33, 13, 66, + 164, 149, 114, 35, 82, 67, 50, 99, 240, 233, 73, 114, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 137, 73, 0, 10, 16, 32, 10, 240, 83, 35, 35, + 35, 35, 35, 240, 240, 40, 40, 82, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, 40, 0, + 7, 96, 39, 18, 0, 18, 41, 155, 114, 100, 98, 131, + 82, 146, 82, 147, 66, 162, 41, 82, 41, 82, 66, 162, + 66, 162, 66, 162, 66, 146, 82, 146, 82, 131, 82, 100, + 106, 136, 0, 14, 64, 62, 16, 240, 240, 98, 65, 133, + 33, 129, 37, 129, 66, 240, 240, 130, 162, 35, 146, 36, + 130, 36, 130, 37, 114, 34, 19, 98, 34, 35, 82, 34, + 50, 82, 34, 51, 66, 34, 67, 50, 34, 82, 50, 34, + 83, 34, 34, 99, 18, 34, 114, 18, 34, 132, 34, 132, + 34, 147, 34, 162, 0, 12, 32, 50, 18, 51, 240, 19, + 240, 19, 240, 19, 240, 19, 240, 19, 0, 6, 6, 185, + 116, 68, 98, 131, 66, 162, 66, 162, 50, 194, 34, 194, + 34, 194, 34, 194, 34, 194, 34, 194, 35, 162, 66, 162, + 67, 130, 100, 68, 121, 182, 0, 14, 48, 45, 18, 164, + 211, 227, 227, 227, 227, 0, 6, 54, 185, 116, 68, 98, + 131, 66, 162, 66, 162, 50, 194, 34, 194, 34, 194, 34, + 194, 34, 194, 34, 194, 35, 162, 66, 162, 67, 130, 100, + 68, 121, 182, 0, 14, 48, 48, 18, 114, 244, 214, 179, + 35, 146, 98, 114, 130, 240, 240, 246, 185, 116, 68, 98, + 131, 66, 162, 66, 162, 50, 194, 34, 194, 34, 194, 34, + 194, 34, 194, 34, 194, 35, 162, 66, 162, 67, 130, 100, + 68, 121, 182, 0, 14, 48, 46, 18, 240, 240, 164, 50, + 138, 130, 52, 0, 8, 22, 185, 116, 68, 98, 131, 66, + 162, 66, 162, 50, 194, 34, 194, 34, 194, 34, 194, 34, + 194, 34, 194, 35, 162, 66, 162, 67, 130, 100, 68, 121, + 182, 0, 14, 48, 47, 18, 240, 240, 163, 35, 163, 35, + 163, 35, 0, 8, 22, 185, 116, 68, 98, 131, 66, 162, + 66, 162, 50, 194, 34, 194, 34, 194, 34, 194, 34, 194, + 34, 194, 35, 162, 66, 162, 67, 130, 100, 68, 121, 182, + 0, 14, 48, 25, 12, 0, 18, 1, 113, 50, 83, 50, + 51, 82, 18, 131, 148, 114, 19, 82, 51, 50, 83, 33, + 113, 0, 15, 48, 54, 18, 0, 15, 18, 242, 165, 18, + 138, 115, 68, 98, 101, 66, 114, 18, 66, 98, 35, 34, + 98, 66, 34, 98, 66, 34, 82, 82, 34, 67, 82, 34, + 66, 98, 34, 50, 114, 35, 34, 98, 66, 18, 114, 68, + 114, 100, 67, 122, 129, 37, 146, 0, 13, 16, 46, 15, + 19, 226, 226, 226, 226, 226, 240, 240, 98, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 50, 114, 67, 83, 89, 133, 0, 12, 46, 15, 147, 179, + 178, 194, 194, 194, 240, 240, 146, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 50, 114, + 67, 83, 89, 133, 0, 12, 50, 15, 83, 195, 178, 18, + 146, 50, 114, 82, 82, 114, 240, 240, 50, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 50, 114, 67, 83, 89, 133, 0, 12, 48, 15, 240, 240, + 51, 35, 115, 35, 115, 35, 0, 6, 18, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 50, 114, 67, 83, 89, 133, 0, 12, 37, 16, 147, 195, + 195, 210, 210, 210, 240, 240, 179, 131, 50, 131, 51, 99, + 82, 98, 99, 67, 115, 50, 146, 34, 166, 180, 196, 210, + 226, 226, 226, 226, 226, 226, 226, 0, 13, 31, 14, 0, + 14, 2, 194, 194, 200, 106, 66, 99, 50, 115, 34, 130, + 34, 130, 34, 130, 34, 115, 34, 99, 58, 72, 98, 194, + 194, 194, 0, 12, 46, 15, 0, 11, 86, 137, 83, 83, + 51, 114, 50, 130, 50, 130, 50, 99, 66, 83, 82, 66, + 114, 66, 114, 66, 114, 83, 82, 99, 66, 115, 50, 131, + 34, 146, 34, 146, 34, 65, 51, 34, 55, 50, 69, 0, + 11, 96, 38, 14, 0, 10, 99, 195, 194, 210, 210, 240, + 240, 134, 105, 82, 82, 66, 98, 66, 98, 50, 114, 50, + 114, 50, 114, 50, 99, 50, 84, 66, 53, 71, 18, 99, + 66, 0, 10, 96, 38, 14, 0, 11, 67, 163, 163, 178, + 178, 240, 240, 150, 105, 82, 82, 66, 98, 66, 98, 50, + 114, 50, 114, 50, 114, 50, 99, 50, 84, 66, 53, 71, + 18, 99, 66, 0, 10, 96, 41, 14, 0, 11, 19, 165, + 131, 18, 115, 50, 98, 82, 240, 240, 86, 105, 82, 82, + 66, 98, 66, 98, 50, 114, 50, 114, 50, 114, 50, 99, + 50, 84, 66, 53, 71, 18, 99, 66, 0, 10, 96, 38, + 14, 0, 14, 51, 50, 88, 97, 52, 240, 240, 102, 105, + 82, 82, 66, 98, 66, 98, 50, 114, 50, 114, 50, 114, + 50, 99, 51, 68, 66, 53, 71, 18, 99, 66, 0, 10, + 96, 39, 14, 0, 14, 35, 51, 83, 51, 83, 51, 240, + 240, 86, 105, 82, 82, 66, 98, 66, 98, 50, 114, 50, + 114, 50, 114, 50, 99, 50, 84, 66, 53, 71, 33, 99, + 66, 0, 10, 96, 39, 14, 0, 11, 4, 150, 130, 34, + 134, 148, 240, 240, 134, 105, 82, 82, 66, 98, 66, 98, + 50, 114, 50, 114, 50, 114, 50, 99, 50, 84, 66, 53, + 71, 18, 84, 66, 0, 10, 96, 34, 22, 0, 36, 21, + 69, 104, 39, 82, 84, 67, 179, 98, 179, 98, 111, 1, + 79, 4, 35, 98, 178, 114, 178, 99, 179, 69, 97, 71, + 42, 69, 86, 0, 17, 26, 13, 0, 21, 86, 89, 51, + 82, 50, 162, 178, 178, 178, 178, 194, 179, 82, 73, 101, + 130, 180, 194, 178, 118, 131, 96, 30, 14, 0, 10, 83, + 195, 195, 195, 195, 240, 240, 133, 120, 83, 67, 66, 98, + 50, 114, 59, 60, 34, 194, 210, 195, 97, 90, 102, 0, + 11, 30, 14, 0, 11, 67, 163, 163, 163, 162, 240, 240, + 165, 120, 83, 67, 66, 98, 50, 114, 59, 60, 34, 194, + 210, 195, 97, 90, 102, 0, 11, 33, 14, 0, 11, 3, + 180, 146, 19, 114, 66, 82, 98, 240, 240, 85, 120, 83, + 67, 66, 98, 50, 114, 59, 60, 34, 194, 210, 195, 97, + 90, 102, 0, 11, 31, 14, 0, 14, 35, 35, 99, 35, + 99, 35, 240, 240, 101, 120, 83, 67, 66, 83, 50, 114, + 59, 60, 34, 194, 210, 195, 97, 90, 102, 0, 11, 26, + 8, 0, 6, 3, 98, 114, 114, 114, 240, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 0, 6, + 48, 26, 8, 0, 6, 66, 82, 82, 82, 82, 240, 130, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 0, 6, 80, 29, 12, 0, 9, 66, 148, 114, 34, 82, + 66, 50, 98, 240, 242, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 0, 9, 96, 27, 10, 0, 10, + 3, 35, 35, 35, 35, 35, 240, 162, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 0, 8, 16, 40, + 14, 0, 9, 33, 196, 34, 119, 147, 149, 131, 34, 194, + 210, 116, 18, 90, 51, 68, 50, 99, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 35, 98, 67, 67, 88, 117, + 0, 11, 32, 40, 14, 0, 14, 52, 49, 89, 81, 52, + 240, 240, 35, 52, 82, 23, 69, 51, 51, 98, 51, 98, + 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, + 50, 114, 50, 114, 0, 10, 96, 36, 14, 0, 10, 83, + 195, 195, 195, 210, 240, 240, 133, 120, 83, 67, 66, 98, + 50, 130, 34, 130, 34, 130, 34, 130, 34, 130, 35, 98, + 67, 67, 88, 117, 0, 11, 32, 36, 14, 0, 11, 67, + 163, 163, 163, 163, 240, 240, 149, 120, 83, 67, 66, 98, + 50, 130, 34, 130, 34, 130, 34, 130, 34, 130, 35, 98, + 67, 67, 88, 117, 0, 11, 32, 39, 14, 0, 11, 4, + 164, 146, 34, 114, 66, 82, 98, 240, 240, 85, 120, 83, + 67, 66, 98, 50, 130, 34, 130, 34, 130, 34, 130, 34, + 130, 35, 98, 67, 67, 88, 117, 0, 11, 32, 36, 14, + 0, 14, 36, 50, 88, 82, 52, 240, 240, 101, 120, 83, + 67, 66, 98, 50, 130, 34, 130, 34, 130, 34, 130, 34, + 130, 35, 98, 67, 67, 88, 117, 0, 11, 32, 37, 14, + 0, 14, 35, 35, 99, 35, 99, 35, 240, 240, 101, 120, + 83, 67, 66, 98, 50, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 35, 98, 67, 67, 88, 117, 0, 11, 32, 18, + 13, 0, 20, 18, 164, 162, 240, 75, 43, 240, 240, 50, + 164, 162, 0, 15, 48, 36, 14, 0, 22, 18, 118, 104, + 83, 52, 66, 69, 34, 66, 34, 34, 50, 50, 34, 50, + 50, 34, 34, 66, 34, 19, 66, 37, 66, 67, 67, 88, + 87, 113, 0, 10, 32, 40, 14, 0, 10, 83, 195, 195, + 195, 195, 240, 240, 66, 114, 50, 114, 50, 114, 50, 114, + 50, 114, 50, 114, 50, 114, 50, 114, 50, 99, 50, 84, + 51, 53, 71, 18, 84, 66, 0, 10, 96, 40, 14, 0, + 11, 51, 163, 163, 178, 178, 240, 240, 98, 114, 50, 114, + 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, + 50, 99, 50, 84, 51, 53, 71, 18, 84, 66, 0, 10, + 96, 43, 14, 0, 11, 3, 165, 131, 19, 99, 51, 82, + 97, 240, 240, 34, 114, 50, 114, 50, 114, 50, 114, 50, + 114, 50, 114, 50, 114, 50, 114, 50, 99, 50, 84, 51, + 53, 71, 18, 84, 66, 0, 10, 96, 41, 14, 0, 14, + 19, 51, 83, 51, 83, 51, 240, 240, 34, 114, 50, 114, + 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, 50, 114, + 50, 99, 50, 84, 51, 53, 71, 33, 84, 66, 0, 10, + 96, 41, 15, 0, 12, 35, 194, 194, 194, 194, 240, 240, + 146, 115, 50, 115, 66, 98, 82, 83, 83, 66, 114, 66, + 114, 51, 130, 34, 146, 34, 150, 164, 180, 195, 194, 195, + 194, 129, 51, 134, 164, 160, 43, 14, 0, 10, 66, 194, + 194, 194, 194, 194, 194, 194, 52, 82, 23, 69, 51, 51, + 99, 35, 114, 34, 130, 34, 130, 34, 130, 34, 130, 34, + 114, 52, 67, 58, 66, 36, 98, 194, 194, 194, 194, 194, + 192, 43, 15, 0, 15, 51, 35, 115, 35, 115, 35, 240, + 240, 83, 99, 66, 99, 66, 98, 83, 67, 98, 66, 114, + 66, 130, 35, 130, 34, 146, 34, 162, 18, 164, 180, 195, + 194, 210, 194, 145, 35, 134, 164, 160, +}; + +//***************************************************************************** +// +// The glyph offset table for the 26 point Sansand font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetSansand26[] = +{ + 0, 4, 28, 49, 83, 124, 178, 218, + 231, 261, 291, 312, 329, 341, 350, 360, + 390, 428, 455, 482, 510, 542, 570, 603, + 628, 664, 697, 712, 729, 748, 760, 779, + 805, 866, 904, 941, 969, 1007, 1031, 1056, + 1090, 1131, 1156, 1182, 1223, 1247, 1313, 1365, + 1404, 1435, 1478, 1517, 1545, 1570, 1610, 1651, + 1719, 1756, 1787, 1812, 1842, 1870, 1900, 1924, + 1935, 1948, 1979, 2017, 2039, 2078, 2101, 2127, + 2164, 2203, 2226, 2254, 2292, 2317, 2361, 2394, + 2423, 2459, 2493, 2517, 2539, 2564, 2597, 2627, + 2675, 2703, 2737, 2757, 2787, 2816, 2847, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2862, 2866, 2888, 2924, 2948, 2983, 3015, 3040, + 3077, 3090, 3143, 3165, 3198, 3211, 3220, 3276, + 3285, 3302, 3324, 3343, 3363, 3376, 3414, 3455, + 3465, 3476, 3494, 3516, 3548, 3602, 3653, 3708, + 3732, 3781, 3825, 3872, 3921, 3966, 4011, 4052, + 4085, 4115, 4145, 4177, 4208, 4238, 4269, 4302, + 4334, 4373, 4435, 4485, 4530, 4578, 4624, 4671, + 4696, 4750, 4796, 4842, 4892, 4940, 4977, 5008, + 5054, 5092, 5130, 5171, 5209, 5248, 5287, 5321, + 5347, 5377, 5407, 5440, 5471, 5497, 5523, 5552, + 5579, 5619, 5659, 5695, 5731, 5770, 5806, 5843, + 5861, 5897, 5937, 5977, 6020, 6061, 6102, 6145, +}; + +//***************************************************************************** +// +// The font definition for the 26 point Sansand font. +// +//***************************************************************************** +const tFontEx g_sFontExSansand26 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 23, + + // + // The height of the font. + // + 32, + + // + // The baseline of the font. + // + 26, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetSansand26, + + // + // A pointer to the actual font data + // + g_pui8Sansand26Data +}; diff --git a/third_party/fonts/ofl/fonts/fontsansand28.c b/third_party/fonts/ofl/fonts/fontsansand28.c new file mode 100644 index 0000000..6759b6a --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontsansand28.c @@ -0,0 +1,787 @@ +//***************************************************************************** +// +// fontsansand28.c - Font definition for the 28pt Sansand font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://scripts.sil.org/cms/scripts/page.php? +// item_id=Andika_download +// +// Copyright (c) 2004-2008, SIL International (http://scripts.sil.org), +// with Reserved Font Names 'Andika' and 'SIL'. +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: sansand +// Size: 28 point +// Bold: no +// Italic: no +// Memory usage: 6956 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 28 point Sansand font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Sansand28Data[6753] = +{ + 5, 11, 0, 46, 96, 25, 5, 240, 240, 163, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 240, + 35, 35, 35, 240, 240, 32, 21, 9, 0, 6, 98, 50, + 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, + 0, 23, 112, 37, 18, 0, 18, 98, 66, 162, 66, 162, + 66, 147, 50, 162, 66, 111, 63, 98, 66, 162, 66, 162, + 66, 111, 63, 98, 66, 162, 50, 162, 66, 162, 66, 162, + 51, 0, 21, 32, 45, 14, 0, 11, 18, 194, 194, 167, + 105, 67, 18, 19, 51, 34, 115, 34, 115, 34, 115, 34, + 134, 135, 151, 150, 130, 20, 114, 35, 114, 35, 114, 35, + 33, 66, 35, 34, 50, 19, 58, 102, 178, 194, 0, 7, + 112, 62, 20, 0, 20, 36, 113, 118, 82, 99, 20, 50, + 114, 51, 50, 114, 51, 34, 130, 51, 34, 130, 51, 18, + 146, 51, 18, 147, 22, 182, 18, 36, 100, 18, 38, 162, + 19, 20, 130, 34, 51, 130, 34, 51, 114, 50, 51, 114, + 50, 51, 98, 66, 51, 98, 67, 20, 82, 102, 98, 116, + 0, 15, 64, 43, 17, 0, 17, 53, 183, 147, 51, 130, + 82, 130, 82, 131, 51, 146, 35, 166, 196, 212, 198, 163, + 34, 163, 35, 49, 67, 67, 33, 67, 86, 51, 100, 67, + 99, 99, 69, 89, 20, 85, 66, 0, 13, 16, 13, 4, + 240, 146, 34, 34, 34, 34, 34, 34, 0, 10, 96, 32, + 9, 0, 7, 65, 114, 99, 83, 83, 99, 83, 99, 99, + 83, 99, 99, 99, 99, 99, 99, 99, 99, 115, 99, 99, + 115, 99, 115, 99, 115, 114, 176, 33, 9, 0, 6, 97, + 130, 115, 115, 115, 99, 115, 99, 99, 115, 99, 99, 99, + 99, 99, 99, 99, 99, 83, 99, 99, 83, 99, 83, 84, + 83, 98, 240, 16, 24, 12, 0, 9, 66, 162, 98, 34, + 33, 51, 21, 85, 117, 83, 17, 20, 34, 34, 33, 114, + 162, 0, 27, 96, 19, 14, 0, 21, 82, 194, 194, 194, + 194, 124, 44, 114, 194, 194, 194, 194, 0, 18, 48, 12, + 6, 0, 18, 99, 52, 66, 66, 50, 50, 240, 112, 9, + 12, 0, 28, 74, 42, 0, 19, 96, 10, 5, 0, 15, + 83, 35, 35, 240, 240, 32, 32, 15, 0, 12, 82, 210, + 194, 210, 194, 210, 210, 194, 210, 194, 210, 194, 210, 194, + 210, 195, 194, 210, 194, 210, 194, 210, 194, 210, 194, 0, + 7, 32, 43, 16, 0, 16, 70, 152, 115, 67, 83, 99, + 67, 99, 66, 131, 35, 131, 35, 131, 35, 131, 35, 131, + 35, 131, 35, 131, 35, 131, 35, 131, 35, 131, 51, 99, + 67, 99, 83, 67, 120, 150, 0, 12, 96, 28, 13, 0, + 13, 67, 133, 103, 99, 19, 98, 35, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 107, 43, 0, + 10, 29, 15, 0, 15, 53, 137, 83, 68, 66, 100, 195, + 195, 195, 195, 179, 195, 179, 180, 179, 179, 179, 179, 179, + 179, 189, 45, 0, 11, 64, 31, 15, 0, 15, 55, 106, + 83, 83, 65, 131, 195, 195, 179, 164, 133, 166, 197, 195, + 211, 195, 195, 33, 147, 34, 115, 51, 84, 59, 103, 0, + 12, 36, 16, 0, 17, 19, 196, 181, 181, 162, 19, 147, + 19, 131, 35, 130, 51, 115, 51, 99, 67, 98, 83, 82, + 99, 67, 99, 78, 46, 179, 211, 211, 211, 211, 0, 12, + 64, 29, 15, 0, 15, 27, 75, 67, 195, 195, 195, 195, + 200, 122, 81, 100, 195, 211, 195, 195, 195, 195, 33, 131, + 51, 84, 58, 119, 0, 12, 37, 16, 0, 16, 87, 137, + 84, 81, 99, 195, 211, 210, 211, 211, 38, 92, 69, 68, + 51, 116, 35, 131, 35, 131, 35, 131, 51, 115, 51, 99, + 83, 68, 105, 134, 0, 12, 96, 27, 16, 0, 16, 14, + 46, 211, 195, 195, 211, 195, 195, 211, 195, 211, 195, 211, + 210, 211, 211, 210, 211, 211, 210, 0, 13, 48, 41, 16, + 0, 16, 70, 152, 115, 67, 83, 99, 67, 99, 67, 99, + 67, 99, 83, 67, 120, 136, 115, 67, 83, 99, 51, 131, + 35, 131, 35, 131, 35, 131, 51, 99, 68, 68, 90, 134, + 0, 12, 96, 37, 16, 0, 16, 70, 137, 100, 67, 83, + 99, 51, 115, 51, 130, 51, 131, 35, 131, 36, 100, 52, + 69, 76, 86, 35, 211, 210, 211, 211, 195, 97, 84, 89, + 135, 0, 12, 112, 15, 5, 0, 10, 3, 35, 35, 240, + 240, 35, 35, 35, 240, 240, 32, 17, 6, 0, 12, 18, + 52, 50, 240, 240, 147, 52, 66, 66, 50, 50, 240, 112, + 20, 16, 0, 25, 51, 181, 134, 134, 118, 148, 195, 214, + 214, 198, 214, 196, 241, 0, 18, 32, 13, 15, 0, 28, + 29, 45, 0, 5, 125, 45, 0, 22, 96, 20, 16, 0, + 24, 2, 229, 198, 214, 198, 213, 196, 150, 134, 118, 134, + 163, 209, 0, 19, 112, 27, 11, 0, 9, 102, 72, 50, + 52, 131, 131, 116, 115, 116, 100, 115, 115, 131, 131, 131, + 131, 240, 240, 179, 131, 131, 0, 9, 67, 23, 0, 26, + 103, 236, 164, 100, 131, 163, 99, 195, 67, 85, 66, 66, + 72, 51, 35, 51, 66, 66, 34, 66, 82, 66, 34, 50, + 98, 66, 34, 50, 98, 66, 34, 50, 98, 66, 34, 50, + 83, 66, 34, 50, 83, 50, 51, 35, 38, 19, 66, 54, + 37, 83, 52, 67, 115, 240, 99, 240, 100, 97, 219, 231, + 0, 9, 96, 42, 19, 0, 19, 115, 244, 245, 226, 18, + 211, 19, 194, 35, 194, 50, 179, 51, 162, 67, 147, 82, + 147, 83, 130, 99, 115, 114, 125, 109, 83, 146, 83, 147, + 66, 178, 51, 179, 35, 179, 0, 14, 64, 40, 15, 0, + 15, 9, 107, 67, 84, 51, 99, 51, 99, 51, 99, 51, + 98, 67, 83, 73, 106, 83, 84, 51, 99, 51, 115, 35, + 115, 35, 115, 35, 115, 35, 100, 35, 84, 59, 73, 0, + 12, 31, 18, 0, 18, 103, 155, 100, 83, 83, 145, 67, + 243, 227, 243, 243, 243, 243, 243, 243, 244, 243, 244, 243, + 146, 84, 84, 107, 151, 0, 14, 16, 43, 18, 0, 18, + 10, 140, 99, 100, 83, 131, 67, 132, 51, 147, 51, 148, + 35, 163, 35, 163, 35, 163, 35, 163, 35, 163, 35, 163, + 35, 148, 35, 147, 51, 132, 51, 116, 67, 100, 92, 105, + 0, 14, 80, 27, 14, 0, 14, 12, 44, 35, 179, 179, + 179, 179, 179, 179, 187, 59, 51, 179, 179, 179, 179, 179, + 179, 188, 44, 0, 10, 96, 27, 14, 0, 14, 12, 44, + 35, 179, 179, 179, 179, 179, 179, 187, 59, 51, 179, 179, + 179, 179, 179, 179, 179, 179, 0, 11, 112, 37, 18, 0, + 18, 103, 156, 84, 83, 83, 145, 67, 243, 227, 243, 243, + 243, 243, 103, 35, 103, 35, 163, 35, 163, 51, 147, 51, + 147, 67, 131, 84, 69, 107, 151, 0, 14, 16, 44, 17, + 0, 17, 3, 147, 35, 147, 35, 147, 35, 147, 35, 147, + 35, 147, 35, 147, 35, 147, 35, 147, 47, 47, 35, 147, + 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, + 35, 147, 35, 147, 0, 13, 27, 11, 0, 11, 9, 41, + 83, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 89, 41, 0, 8, 64, 28, 12, 0, + 12, 115, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 131, 50, 52, 56, 86, 0, 9, + 80, 45, 16, 0, 16, 3, 116, 35, 100, 51, 99, 67, + 83, 83, 67, 99, 51, 115, 35, 131, 19, 147, 18, 166, + 167, 147, 19, 147, 35, 131, 51, 115, 67, 99, 83, 83, + 84, 67, 100, 51, 116, 35, 131, 0, 12, 32, 27, 14, + 0, 14, 3, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 188, 44, 0, 10, + 96, 73, 21, 0, 21, 4, 180, 36, 180, 36, 180, 37, + 149, 37, 149, 34, 18, 146, 18, 34, 19, 115, 18, 34, + 19, 115, 18, 34, 34, 114, 34, 34, 35, 83, 34, 34, + 50, 82, 50, 34, 50, 82, 50, 34, 51, 51, 50, 34, + 66, 50, 66, 34, 67, 19, 66, 34, 67, 19, 66, 34, + 82, 18, 82, 34, 85, 82, 34, 100, 82, 34, 99, 98, + 0, 16, 57, 18, 0, 18, 3, 163, 36, 147, 37, 131, + 37, 131, 38, 115, 35, 18, 115, 35, 19, 99, 35, 35, + 83, 35, 50, 83, 35, 51, 67, 35, 67, 51, 35, 82, + 51, 35, 83, 35, 35, 99, 19, 35, 114, 19, 35, 118, + 35, 133, 35, 133, 35, 148, 35, 163, 0, 13, 96, 43, + 19, 0, 19, 101, 201, 147, 83, 115, 115, 83, 147, 67, + 147, 66, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, + 179, 35, 179, 35, 178, 67, 147, 67, 147, 83, 115, 115, + 83, 153, 197, 0, 15, 32, 35, 15, 0, 15, 9, 107, + 67, 84, 51, 100, 35, 115, 35, 115, 35, 115, 35, 115, + 35, 99, 51, 84, 59, 73, 99, 195, 195, 195, 195, 195, + 195, 195, 0, 12, 96, 47, 20, 0, 20, 101, 217, 163, + 83, 131, 115, 99, 147, 83, 147, 82, 179, 51, 179, 51, + 179, 51, 179, 51, 179, 51, 179, 51, 179, 51, 179, 67, + 147, 83, 147, 99, 115, 131, 83, 169, 202, 240, 38, 240, + 35, 0, 10, 32, 42, 17, 0, 17, 9, 139, 99, 84, + 83, 100, 67, 115, 67, 115, 67, 115, 67, 115, 67, 99, + 83, 84, 91, 105, 131, 51, 131, 67, 115, 67, 115, 83, + 99, 99, 83, 115, 67, 116, 51, 132, 0, 13, 29, 15, + 0, 15, 70, 122, 68, 67, 51, 195, 195, 196, 181, 183, + 152, 152, 165, 196, 195, 195, 195, 33, 131, 51, 84, 59, + 103, 0, 12, 46, 19, 0, 19, 15, 2, 47, 2, 147, + 240, 19, 240, 19, 240, 19, 240, 19, 240, 19, 240, 19, + 240, 19, 240, 19, 240, 19, 240, 19, 240, 19, 240, 19, + 240, 19, 240, 19, 240, 19, 240, 19, 240, 19, 0, 15, + 48, 45, 17, 0, 17, 3, 147, 35, 147, 35, 147, 35, + 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, + 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, + 132, 51, 115, 68, 84, 91, 135, 0, 13, 64, 43, 19, + 0, 19, 3, 179, 35, 163, 51, 163, 67, 147, 67, 131, + 98, 131, 99, 115, 99, 99, 130, 99, 131, 82, 147, 67, + 162, 67, 163, 50, 179, 35, 194, 35, 195, 18, 214, 229, + 228, 244, 0, 15, 48, 75, 28, 0, 28, 3, 146, 147, + 35, 132, 131, 35, 132, 131, 50, 132, 130, 67, 102, 99, + 67, 99, 18, 99, 82, 98, 34, 99, 82, 98, 34, 98, + 99, 67, 35, 67, 99, 66, 66, 67, 114, 66, 66, 66, + 130, 66, 67, 50, 131, 35, 82, 35, 131, 34, 98, 35, + 146, 34, 98, 34, 162, 19, 99, 18, 165, 130, 18, 180, + 133, 180, 132, 196, 147, 0, 21, 112, 41, 18, 0, 18, + 19, 131, 67, 115, 99, 99, 115, 67, 131, 66, 163, 35, + 182, 198, 212, 227, 244, 214, 179, 19, 179, 35, 147, 67, + 130, 83, 115, 99, 83, 130, 83, 131, 51, 163, 0, 13, + 96, 44, 19, 0, 19, 3, 179, 51, 147, 83, 115, 99, + 115, 115, 83, 131, 83, 147, 51, 179, 34, 195, 19, 213, + 229, 243, 240, 19, 240, 19, 240, 19, 240, 19, 240, 19, + 240, 19, 240, 19, 240, 19, 0, 15, 48, 27, 16, 0, + 16, 29, 61, 195, 211, 195, 210, 211, 195, 211, 195, 195, + 211, 195, 195, 211, 195, 195, 211, 206, 46, 0, 12, 32, + 32, 8, 0, 6, 6, 38, 35, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 83, 86, 38, 160, 30, 10, 0, 8, + 98, 131, 130, 130, 130, 131, 130, 130, 130, 146, 130, 130, + 131, 130, 130, 130, 146, 130, 130, 131, 130, 130, 129, 240, + 240, 208, 32, 9, 0, 6, 103, 39, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 39, 39, 176, 24, 14, + 0, 11, 3, 180, 149, 146, 19, 115, 34, 114, 51, 83, + 66, 82, 83, 51, 98, 50, 115, 0, 31, 96, 10, 19, + 0, 73, 95, 2, 47, 2, 240, 96, 13, 10, 0, 7, + 68, 115, 131, 131, 131, 131, 0, 27, 96, 33, 15, 0, + 26, 103, 121, 83, 67, 67, 83, 67, 83, 51, 99, 51, + 99, 51, 99, 51, 99, 51, 84, 51, 69, 67, 38, 71, + 35, 83, 67, 0, 11, 64, 40, 15, 0, 11, 35, 195, + 195, 195, 195, 195, 195, 195, 195, 52, 83, 23, 70, 51, + 52, 83, 52, 99, 35, 115, 35, 115, 35, 115, 35, 115, + 35, 100, 35, 99, 52, 68, 59, 103, 0, 12, 22, 14, + 0, 25, 21, 121, 67, 81, 67, 164, 163, 179, 179, 179, + 179, 195, 180, 82, 74, 102, 0, 11, 42, 16, 0, 13, + 35, 211, 211, 211, 211, 211, 211, 211, 117, 19, 91, 68, + 68, 67, 99, 51, 115, 51, 115, 51, 115, 51, 115, 51, + 115, 51, 100, 52, 84, 67, 69, 87, 35, 85, 51, 0, + 12, 32, 24, 14, 0, 25, 5, 120, 84, 66, 67, 98, + 35, 114, 44, 44, 35, 179, 179, 195, 180, 82, 74, 102, + 0, 11, 30, 12, 0, 9, 85, 87, 83, 49, 67, 147, + 147, 147, 147, 121, 57, 83, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 0, 9, 112, 38, 14, 0, 25, + 7, 105, 67, 67, 51, 83, 50, 99, 35, 99, 35, 99, + 35, 99, 35, 99, 35, 99, 35, 84, 51, 53, 55, 19, + 69, 35, 179, 179, 163, 82, 52, 73, 118, 80, 43, 14, + 0, 10, 67, 179, 179, 179, 179, 179, 179, 179, 179, 52, + 67, 23, 53, 51, 52, 83, 36, 83, 35, 99, 35, 99, + 35, 99, 35, 99, 35, 99, 35, 99, 35, 99, 35, 99, + 35, 99, 0, 10, 96, 25, 5, 240, 240, 163, 35, 35, + 240, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 240, 240, 32, 31, 10, 0, 10, 83, 115, + 115, 240, 240, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 33, 51, 55, 53, + 80, 41, 14, 0, 10, 67, 179, 179, 179, 179, 179, 179, + 179, 179, 83, 51, 67, 67, 51, 83, 35, 99, 19, 118, + 134, 131, 18, 131, 19, 115, 35, 99, 51, 83, 67, 67, + 83, 51, 99, 0, 10, 96, 28, 5, 240, 243, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 240, 240, 32, 48, 22, + 0, 38, 67, 52, 68, 90, 23, 69, 38, 36, 52, 68, + 67, 51, 83, 83, 51, 83, 83, 51, 83, 83, 51, 83, + 83, 51, 83, 83, 51, 83, 83, 51, 83, 83, 51, 83, + 83, 51, 83, 83, 51, 83, 83, 0, 16, 96, 35, 15, + 0, 26, 35, 53, 83, 23, 69, 51, 68, 83, 52, 83, + 51, 99, 51, 99, 51, 99, 51, 99, 51, 99, 51, 99, + 51, 99, 51, 99, 51, 99, 0, 11, 64, 30, 15, 0, + 26, 101, 137, 84, 52, 67, 83, 51, 115, 35, 115, 35, + 115, 35, 115, 35, 115, 35, 115, 51, 83, 68, 52, 89, + 133, 0, 12, 38, 16, 0, 28, 3, 53, 99, 23, 86, + 36, 68, 83, 68, 99, 51, 115, 51, 115, 51, 115, 51, + 115, 51, 115, 51, 99, 69, 52, 75, 83, 36, 115, 211, + 211, 211, 211, 211, 192, 36, 14, 0, 25, 7, 105, 67, + 67, 51, 83, 50, 99, 35, 99, 35, 99, 35, 99, 35, + 99, 35, 99, 36, 68, 51, 53, 74, 84, 35, 179, 179, + 179, 179, 179, 179, 32, 26, 13, 0, 22, 99, 83, 51, + 37, 51, 34, 99, 18, 115, 18, 117, 132, 148, 148, 147, + 163, 163, 163, 163, 0, 10, 112, 24, 13, 0, 23, 22, + 89, 52, 66, 51, 163, 166, 136, 119, 149, 163, 33, 115, + 35, 68, 42, 86, 0, 10, 48, 26, 12, 0, 15, 35, + 147, 147, 147, 122, 42, 67, 147, 147, 147, 147, 147, 147, + 147, 147, 148, 49, 87, 101, 0, 9, 48, 35, 15, 0, + 26, 35, 99, 51, 99, 51, 99, 51, 99, 51, 99, 51, + 99, 51, 99, 51, 99, 51, 99, 51, 84, 51, 84, 52, + 38, 71, 34, 84, 67, 0, 11, 64, 32, 16, 0, 28, + 3, 131, 51, 115, 51, 114, 82, 99, 83, 82, 114, 67, + 115, 51, 115, 50, 146, 35, 147, 18, 178, 18, 181, 180, + 211, 0, 12, 112, 50, 21, 0, 36, 98, 99, 98, 35, + 83, 98, 35, 83, 83, 50, 69, 67, 50, 66, 18, 66, + 67, 50, 18, 66, 67, 35, 34, 35, 82, 34, 50, 34, + 98, 34, 50, 34, 102, 66, 18, 116, 85, 116, 84, 132, + 99, 131, 115, 0, 16, 48, 31, 15, 0, 26, 35, 115, + 51, 83, 83, 51, 114, 35, 131, 19, 149, 179, 180, 181, + 147, 19, 115, 50, 115, 51, 83, 83, 51, 115, 0, 11, + 64, 37, 16, 0, 28, 18, 131, 51, 115, 66, 114, 83, + 83, 83, 82, 114, 82, 115, 51, 130, 50, 147, 19, 147, + 19, 162, 18, 181, 195, 211, 211, 210, 211, 129, 51, 150, + 180, 176, 20, 13, 0, 22, 107, 43, 147, 147, 163, 147, + 147, 162, 162, 163, 147, 162, 171, 43, 0, 10, 32, 11, + 0, 9, 3, 101, 84, 115, 131, 131, 131, 131, 131, 131, + 131, 131, 115, 99, 147, 148, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 149, 116, 208, 31, 4, 240, 146, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 96, 33, 11, 0, 8, 34, 149, 132, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 147, 163, 115, 100, 115, 131, 131, + 131, 131, 131, 131, 131, 116, 85, 100, 240, 48, 15, 17, + 0, 36, 52, 114, 56, 50, 50, 72, 50, 101, 0, 28, + 16, 5, 17, 0, 72, 32, 23, 5, 0, 8, 99, 35, + 35, 240, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 32, 37, 12, 0, 17, 18, 162, 162, + 149, 88, 54, 18, 51, 18, 83, 34, 83, 34, 83, 34, + 83, 34, 83, 34, 83, 34, 99, 18, 33, 57, 72, 114, + 162, 162, 162, 240, 240, 176, 28, 14, 0, 14, 69, 135, + 99, 65, 83, 179, 179, 179, 179, 179, 168, 104, 131, 179, + 179, 179, 179, 178, 179, 172, 44, 0, 10, 96, 39, 18, + 0, 18, 17, 193, 51, 163, 51, 36, 35, 92, 115, 67, + 130, 98, 114, 130, 98, 130, 98, 130, 98, 130, 114, 98, + 131, 67, 124, 83, 36, 35, 51, 163, 49, 193, 0, 22, + 112, 34, 17, 0, 19, 19, 147, 50, 146, 67, 115, 83, + 83, 114, 82, 131, 51, 146, 50, 163, 19, 181, 155, 107, + 163, 227, 171, 107, 163, 227, 227, 227, 0, 13, 96, 27, + 4, 240, 146, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 240, 114, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 96, 40, 13, 0, 13, 54, 89, 52, 66, 51, 163, + 164, 164, 164, 165, 104, 68, 36, 51, 68, 35, 83, 35, + 83, 51, 67, 52, 20, 87, 132, 164, 179, 164, 163, 33, + 115, 35, 67, 58, 86, 80, 13, 11, 0, 11, 3, 51, + 35, 51, 35, 51, 0, 31, 112, 58, 21, 0, 21, 103, + 203, 148, 84, 115, 37, 35, 83, 39, 35, 66, 35, 50, + 50, 51, 34, 146, 50, 34, 178, 34, 34, 178, 34, 34, + 178, 34, 34, 178, 34, 34, 178, 34, 35, 162, 35, 35, + 50, 50, 66, 55, 50, 67, 52, 67, 83, 147, 116, 84, + 155, 199, 0, 16, 96, 25, 11, 0, 11, 52, 87, 66, + 50, 50, 66, 50, 66, 50, 66, 50, 51, 66, 20, 68, + 33, 233, 41, 0, 19, 64, 34, 17, 0, 30, 66, 67, + 114, 67, 115, 66, 115, 67, 99, 67, 99, 67, 100, 51, + 116, 51, 131, 67, 131, 67, 131, 67, 131, 66, 146, 67, + 146, 67, 0, 13, 13, 15, 0, 31, 125, 45, 210, 210, + 210, 210, 0, 20, 112, 9, 12, 0, 28, 74, 42, 0, + 19, 96, 63, 21, 0, 21, 103, 203, 148, 84, 115, 147, + 83, 22, 67, 66, 39, 66, 51, 34, 51, 50, 50, 50, + 66, 66, 34, 50, 51, 66, 34, 55, 82, 34, 54, 98, + 34, 50, 34, 98, 34, 50, 49, 98, 35, 34, 50, 67, + 50, 34, 66, 50, 67, 18, 82, 19, 83, 147, 116, 84, + 155, 199, 0, 16, 96, 9, 12, 0, 13, 74, 42, 0, + 34, 96, 17, 9, 0, 9, 35, 85, 50, 50, 34, 50, + 34, 50, 53, 83, 0, 21, 112, 22, 14, 0, 16, 50, + 194, 194, 194, 194, 124, 44, 114, 194, 194, 194, 194, 240, + 240, 92, 44, 0, 16, 20, 10, 0, 7, 99, 86, 65, + 51, 130, 130, 130, 114, 114, 130, 114, 114, 120, 40, 0, + 19, 22, 10, 0, 7, 100, 86, 65, 66, 130, 115, 68, + 101, 131, 130, 130, 34, 51, 39, 84, 0, 19, 32, 13, + 9, 0, 7, 35, 83, 98, 98, 98, 98, 0, 25, 80, + 40, 15, 0, 26, 35, 99, 51, 99, 51, 99, 51, 99, + 51, 99, 51, 99, 51, 99, 51, 99, 51, 99, 51, 84, + 52, 68, 52, 53, 56, 34, 51, 19, 51, 35, 195, 195, + 195, 195, 195, 192, 45, 15, 0, 15, 58, 60, 54, 34, + 71, 34, 71, 34, 71, 34, 71, 34, 86, 34, 101, 34, + 116, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, + 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 0, 11, + 96, 9, 5, 0, 10, 83, 35, 35, 0, 9, 11, 8, + 0, 28, 18, 100, 114, 98, 38, 51, 64, 20, 10, 0, + 7, 99, 85, 81, 34, 130, 130, 130, 130, 130, 130, 130, + 88, 40, 0, 20, 32, 25, 10, 0, 10, 36, 86, 51, + 35, 34, 66, 34, 66, 34, 66, 34, 66, 35, 35, 54, + 84, 72, 40, 0, 17, 96, 35, 16, 0, 28, 3, 66, + 130, 67, 130, 67, 115, 67, 115, 67, 115, 51, 131, 51, + 100, 51, 99, 51, 99, 67, 83, 67, 83, 67, 98, 67, + 99, 66, 0, 12, 112, 60, 21, 0, 16, 2, 194, 52, + 193, 65, 18, 178, 98, 162, 114, 161, 130, 146, 130, 130, + 146, 129, 162, 114, 162, 98, 178, 97, 82, 55, 33, 83, + 55, 18, 68, 162, 66, 18, 161, 66, 34, 146, 51, 34, + 130, 51, 50, 129, 73, 98, 73, 82, 178, 97, 194, 82, + 194, 66, 0, 15, 48, 57, 22, 0, 16, 98, 194, 68, + 178, 81, 18, 178, 114, 162, 130, 146, 146, 146, 146, 130, + 162, 114, 178, 114, 178, 98, 194, 82, 52, 71, 34, 23, + 55, 18, 34, 51, 146, 146, 146, 146, 130, 146, 130, 147, + 130, 131, 130, 131, 130, 130, 161, 136, 66, 136, 50, 0, + 16, 16, 60, 22, 0, 16, 100, 162, 86, 146, 81, 66, + 114, 178, 98, 179, 98, 132, 114, 149, 82, 211, 66, 226, + 50, 242, 34, 162, 51, 34, 66, 71, 34, 67, 100, 34, + 68, 194, 50, 18, 178, 66, 18, 162, 66, 34, 162, 50, + 50, 146, 73, 98, 89, 98, 162, 114, 178, 98, 194, 98, + 0, 16, 25, 11, 0, 19, 99, 131, 131, 240, 243, 131, + 131, 131, 131, 116, 100, 115, 115, 116, 115, 131, 132, 50, + 56, 70, 48, 55, 19, 51, 240, 35, 240, 35, 240, 35, + 240, 34, 240, 50, 240, 50, 240, 240, 67, 244, 245, 226, + 18, 211, 18, 210, 35, 194, 50, 179, 51, 162, 67, 147, + 82, 147, 83, 130, 99, 115, 114, 125, 109, 83, 146, 83, + 147, 66, 178, 51, 179, 35, 179, 0, 14, 64, 52, 19, + 179, 243, 243, 243, 240, 18, 240, 18, 240, 18, 240, 240, + 115, 244, 245, 226, 18, 211, 18, 210, 35, 194, 50, 179, + 51, 162, 67, 147, 82, 147, 83, 130, 99, 115, 114, 125, + 109, 83, 146, 83, 147, 66, 178, 51, 179, 35, 179, 0, + 14, 64, 53, 19, 115, 244, 245, 211, 19, 179, 51, 147, + 82, 146, 114, 240, 240, 19, 244, 245, 226, 18, 211, 18, + 210, 35, 194, 50, 179, 51, 162, 67, 147, 82, 147, 83, + 130, 99, 115, 114, 125, 109, 83, 146, 83, 147, 66, 178, + 51, 179, 35, 179, 0, 14, 64, 50, 19, 0, 7, 100, + 49, 169, 162, 51, 0, 6, 67, 240, 20, 229, 226, 18, + 226, 19, 195, 34, 195, 35, 178, 51, 163, 66, 163, 67, + 146, 83, 131, 98, 131, 99, 109, 109, 98, 147, 67, 147, + 67, 162, 66, 179, 35, 194, 0, 14, 64, 50, 19, 0, + 7, 83, 51, 163, 51, 163, 51, 0, 6, 51, 245, 229, + 211, 18, 211, 19, 195, 19, 179, 50, 179, 51, 163, 51, + 147, 83, 131, 83, 130, 99, 115, 115, 109, 109, 83, 147, + 67, 147, 66, 178, 51, 179, 35, 179, 0, 14, 64, 56, + 20, 116, 240, 20, 242, 34, 226, 34, 226, 34, 244, 240, + 20, 240, 240, 114, 240, 36, 240, 20, 240, 20, 242, 34, + 226, 34, 211, 35, 194, 66, 194, 66, 179, 67, 162, 98, + 147, 99, 131, 99, 140, 126, 99, 131, 98, 162, 83, 163, + 66, 194, 51, 195, 0, 15, 32, 47, 24, 0, 25, 28, + 204, 182, 240, 50, 19, 240, 35, 19, 240, 34, 35, 240, + 19, 35, 240, 19, 35, 243, 51, 243, 57, 131, 73, 131, + 67, 211, 83, 219, 204, 195, 99, 179, 115, 179, 115, 163, + 139, 35, 139, 0, 18, 32, 38, 18, 0, 18, 103, 155, + 100, 83, 83, 145, 67, 243, 227, 243, 243, 243, 243, 243, + 243, 244, 243, 244, 243, 145, 100, 84, 107, 151, 209, 240, + 35, 240, 34, 240, 18, 213, 211, 128, 33, 14, 19, 195, + 195, 194, 210, 195, 195, 240, 76, 44, 35, 179, 179, 179, + 179, 179, 179, 187, 59, 51, 179, 179, 179, 179, 179, 179, + 188, 44, 0, 10, 96, 33, 14, 131, 178, 179, 163, 163, + 163, 178, 240, 124, 44, 35, 179, 179, 179, 179, 179, 179, + 187, 59, 51, 179, 179, 179, 179, 179, 179, 188, 44, 0, + 10, 96, 37, 14, 82, 180, 150, 115, 34, 114, 66, 82, + 98, 50, 130, 240, 28, 44, 35, 179, 179, 179, 179, 179, + 179, 187, 59, 51, 179, 179, 179, 179, 179, 179, 188, 44, + 0, 10, 96, 35, 14, 240, 240, 211, 51, 83, 51, 83, + 51, 240, 240, 44, 44, 35, 179, 179, 179, 179, 179, 179, + 186, 74, 67, 179, 179, 179, 179, 179, 179, 188, 44, 0, + 10, 96, 33, 12, 3, 163, 163, 163, 163, 162, 178, 240, + 41, 57, 99, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 105, 57, 0, 9, 32, 33, + 12, 115, 131, 131, 131, 146, 146, 146, 240, 89, 57, 99, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 105, 57, 0, 9, 48, 37, 13, 67, 149, + 133, 115, 19, 83, 51, 66, 82, 50, 114, 240, 25, 73, + 115, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 121, 73, 0, 10, 16, 34, 11, 240, + 240, 51, 51, 35, 51, 35, 51, 240, 153, 41, 83, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 89, 41, 0, 8, 64, 43, 20, 0, 20, 42, + 172, 131, 100, 115, 131, 99, 132, 83, 147, 83, 148, 67, + 163, 67, 163, 42, 83, 42, 83, 67, 163, 67, 163, 67, + 148, 67, 147, 83, 132, 83, 116, 99, 100, 124, 137, 0, + 16, 16, 64, 18, 0, 7, 51, 49, 168, 161, 51, 240, + 240, 211, 163, 36, 147, 37, 131, 37, 131, 38, 115, 35, + 18, 115, 35, 19, 99, 35, 35, 83, 35, 50, 83, 35, + 51, 67, 35, 67, 51, 35, 82, 51, 35, 83, 35, 35, + 99, 19, 35, 114, 19, 35, 118, 35, 133, 35, 133, 35, + 148, 35, 163, 0, 13, 96, 54, 19, 51, 240, 35, 240, + 35, 240, 35, 240, 35, 240, 35, 0, 6, 69, 201, 147, + 83, 115, 115, 83, 147, 67, 147, 66, 179, 35, 179, 35, + 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 178, 67, + 147, 67, 147, 83, 115, 115, 83, 153, 197, 0, 15, 32, + 50, 19, 179, 243, 243, 243, 243, 240, 18, 0, 6, 101, + 201, 147, 83, 115, 115, 83, 147, 67, 147, 66, 179, 35, + 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, + 178, 67, 147, 67, 147, 83, 115, 115, 83, 153, 197, 0, + 15, 32, 54, 19, 115, 240, 19, 242, 18, 210, 50, 178, + 82, 146, 114, 0, 6, 21, 201, 147, 83, 115, 115, 83, + 147, 67, 147, 66, 179, 35, 179, 35, 179, 35, 179, 35, + 179, 35, 179, 35, 179, 35, 178, 67, 147, 67, 147, 83, + 115, 115, 83, 153, 197, 0, 15, 32, 53, 19, 240, 240, + 211, 65, 165, 34, 162, 37, 161, 67, 0, 6, 53, 201, + 147, 83, 115, 115, 83, 147, 67, 147, 66, 179, 35, 179, + 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 178, + 67, 147, 67, 147, 83, 115, 115, 83, 153, 197, 0, 15, + 32, 51, 19, 240, 240, 195, 51, 163, 51, 163, 51, 0, + 8, 85, 201, 147, 83, 115, 115, 83, 147, 67, 147, 66, + 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, + 179, 35, 178, 67, 147, 67, 147, 83, 115, 115, 83, 153, + 197, 0, 15, 32, 24, 13, 0, 21, 18, 113, 51, 83, + 51, 51, 83, 19, 116, 163, 149, 114, 35, 67, 67, 50, + 98, 0, 18, 32, 59, 19, 0, 18, 34, 165, 18, 154, + 131, 83, 115, 100, 83, 98, 19, 67, 98, 19, 66, 98, + 51, 35, 98, 51, 35, 82, 67, 35, 82, 67, 35, 66, + 83, 35, 66, 83, 35, 50, 99, 35, 50, 98, 67, 18, + 99, 67, 18, 99, 84, 99, 115, 83, 138, 130, 37, 162, + 0, 13, 96, 51, 17, 35, 243, 243, 243, 243, 243, 240, + 240, 179, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, + 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, + 147, 35, 147, 35, 147, 35, 147, 35, 132, 51, 115, 68, + 84, 91, 135, 0, 13, 64, 51, 17, 163, 211, 211, 211, + 211, 226, 240, 240, 211, 147, 35, 147, 35, 147, 35, 147, + 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, + 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, 132, + 51, 115, 68, 84, 91, 135, 0, 13, 64, 55, 17, 99, + 227, 210, 18, 178, 50, 146, 82, 114, 114, 240, 240, 131, + 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, + 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, + 147, 35, 147, 35, 147, 35, 132, 51, 115, 68, 84, 91, + 135, 0, 13, 64, 53, 17, 240, 240, 115, 51, 131, 51, + 131, 51, 0, 7, 3, 147, 35, 147, 35, 147, 35, 147, + 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, + 35, 147, 35, 147, 35, 147, 35, 147, 35, 147, 35, 132, + 51, 115, 68, 84, 91, 135, 0, 13, 64, 53, 19, 179, + 243, 243, 243, 240, 18, 240, 18, 240, 18, 240, 243, 179, + 51, 147, 83, 115, 99, 115, 115, 83, 131, 83, 147, 51, + 179, 34, 195, 19, 213, 229, 243, 240, 19, 240, 19, 240, + 19, 240, 19, 240, 19, 240, 19, 240, 19, 240, 19, 0, + 15, 48, 35, 15, 0, 15, 3, 195, 195, 195, 201, 107, + 67, 84, 51, 100, 35, 115, 35, 115, 35, 115, 35, 115, + 35, 99, 51, 84, 59, 73, 99, 195, 195, 195, 0, 12, + 96, 50, 16, 0, 12, 70, 137, 100, 67, 83, 99, 51, + 115, 51, 115, 51, 100, 51, 84, 67, 67, 99, 51, 115, + 51, 115, 51, 115, 68, 83, 69, 67, 100, 51, 116, 35, + 131, 35, 131, 35, 131, 35, 49, 52, 35, 55, 51, 53, + 0, 12, 80, 41, 15, 0, 11, 67, 211, 211, 210, 226, + 225, 240, 240, 183, 121, 83, 67, 67, 83, 67, 83, 51, + 99, 51, 99, 51, 99, 51, 99, 51, 84, 51, 69, 67, + 38, 71, 35, 83, 67, 0, 11, 64, 41, 15, 0, 12, + 36, 179, 179, 179, 194, 194, 240, 240, 199, 121, 83, 67, + 67, 83, 67, 83, 51, 99, 51, 99, 51, 99, 51, 99, + 51, 84, 51, 69, 67, 38, 71, 35, 83, 67, 0, 11, + 64, 45, 15, 0, 11, 115, 196, 162, 19, 131, 34, 130, + 66, 98, 98, 240, 240, 119, 121, 83, 67, 67, 83, 67, + 83, 51, 99, 51, 99, 51, 99, 51, 99, 51, 84, 51, + 69, 67, 38, 71, 35, 83, 67, 0, 11, 64, 43, 15, + 0, 15, 66, 66, 101, 18, 113, 37, 113, 66, 240, 240, + 151, 121, 83, 67, 67, 83, 67, 83, 51, 99, 51, 99, + 51, 99, 51, 99, 51, 84, 51, 69, 67, 38, 71, 35, + 83, 67, 0, 11, 64, 41, 15, 0, 15, 51, 35, 115, + 35, 115, 35, 0, 6, 87, 121, 83, 67, 67, 83, 67, + 83, 51, 99, 51, 99, 51, 99, 51, 99, 51, 84, 51, + 69, 67, 38, 71, 35, 83, 67, 0, 11, 64, 43, 15, + 0, 11, 116, 166, 146, 34, 146, 34, 150, 164, 240, 240, + 167, 121, 83, 67, 67, 83, 67, 83, 51, 99, 51, 99, + 51, 99, 51, 99, 51, 84, 51, 69, 67, 38, 71, 35, + 84, 66, 0, 11, 64, 37, 23, 0, 40, 86, 69, 120, + 40, 82, 69, 67, 195, 99, 179, 99, 95, 3, 79, 4, + 51, 83, 179, 99, 179, 99, 179, 85, 164, 55, 82, 56, + 42, 69, 102, 0, 17, 96, 27, 13, 0, 23, 38, 104, + 67, 66, 51, 147, 163, 163, 163, 163, 163, 179, 164, 66, + 73, 102, 129, 195, 194, 178, 133, 132, 80, 32, 14, 0, + 10, 99, 195, 195, 194, 210, 210, 240, 240, 117, 120, 84, + 66, 67, 98, 35, 114, 44, 44, 35, 179, 179, 195, 180, + 82, 74, 102, 0, 11, 32, 14, 0, 11, 82, 179, 163, + 163, 178, 178, 240, 240, 149, 120, 84, 66, 67, 98, 35, + 114, 44, 44, 35, 179, 179, 195, 180, 82, 74, 102, 0, + 11, 35, 14, 0, 11, 19, 165, 150, 115, 34, 99, 66, + 67, 98, 240, 240, 69, 120, 84, 66, 67, 98, 35, 114, + 44, 44, 35, 179, 179, 195, 180, 82, 74, 102, 0, 11, + 32, 14, 0, 14, 35, 51, 83, 51, 83, 51, 0, 6, + 21, 120, 84, 66, 67, 83, 35, 114, 44, 44, 35, 179, + 179, 195, 180, 82, 74, 102, 0, 11, 28, 9, 0, 6, + 99, 114, 130, 130, 130, 130, 240, 131, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 0, 7, 16, + 28, 10, 0, 8, 19, 99, 99, 99, 99, 99, 240, 211, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 0, 8, 32, 33, 13, 0, 10, 35, 149, 115, 19, + 83, 51, 66, 82, 50, 114, 240, 240, 35, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 0, 10, + 64, 29, 11, 0, 11, 3, 51, 35, 51, 35, 51, 240, + 240, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 0, 8, 112, 42, 15, 0, 11, 99, 49, + 132, 19, 148, 179, 166, 146, 35, 210, 211, 116, 19, 90, + 68, 53, 51, 84, 35, 115, 35, 115, 35, 115, 35, 115, + 35, 115, 35, 114, 67, 83, 68, 51, 105, 133, 0, 12, + 45, 15, 0, 15, 66, 65, 117, 18, 113, 37, 98, 66, + 240, 240, 83, 53, 83, 23, 69, 51, 68, 83, 52, 83, + 51, 99, 51, 99, 51, 99, 51, 99, 51, 99, 51, 99, + 51, 99, 51, 99, 51, 99, 0, 11, 64, 38, 15, 0, + 11, 67, 211, 210, 226, 211, 210, 240, 240, 181, 137, 84, + 52, 67, 83, 51, 115, 35, 115, 35, 115, 35, 115, 35, + 115, 35, 115, 51, 83, 68, 52, 89, 133, 0, 12, 38, + 15, 0, 12, 35, 179, 195, 179, 179, 194, 240, 240, 197, + 137, 84, 52, 67, 83, 51, 115, 35, 115, 35, 115, 35, + 115, 35, 115, 35, 115, 51, 83, 68, 52, 89, 133, 0, + 12, 42, 15, 0, 11, 115, 181, 162, 18, 146, 50, 115, + 51, 83, 83, 240, 240, 117, 137, 84, 52, 67, 83, 51, + 115, 35, 115, 35, 115, 35, 115, 35, 115, 35, 115, 51, + 83, 68, 52, 89, 133, 0, 12, 40, 15, 0, 15, 51, + 50, 101, 34, 98, 37, 98, 51, 240, 240, 149, 137, 84, + 52, 67, 83, 51, 115, 35, 115, 35, 115, 35, 115, 35, + 115, 35, 115, 51, 83, 68, 52, 89, 133, 0, 12, 38, + 15, 0, 15, 35, 51, 99, 51, 99, 51, 0, 6, 85, + 137, 84, 52, 67, 83, 51, 115, 35, 115, 35, 115, 35, + 115, 35, 115, 35, 115, 51, 83, 68, 52, 89, 133, 0, + 12, 19, 14, 0, 21, 82, 180, 178, 240, 240, 92, 44, + 240, 98, 180, 164, 178, 0, 18, 48, 39, 15, 0, 25, + 66, 134, 121, 84, 52, 67, 53, 51, 65, 35, 35, 50, + 35, 35, 49, 51, 35, 34, 51, 35, 33, 67, 35, 18, + 67, 53, 51, 68, 52, 89, 103, 114, 0, 10, 112, 43, + 15, 0, 11, 51, 211, 211, 211, 210, 226, 240, 240, 115, + 99, 51, 99, 51, 99, 51, 99, 51, 99, 51, 99, 51, + 99, 51, 99, 51, 99, 51, 84, 51, 84, 52, 38, 71, + 34, 84, 67, 0, 11, 64, 43, 15, 0, 12, 35, 179, + 179, 194, 194, 194, 240, 240, 147, 99, 51, 99, 51, 99, + 51, 99, 51, 99, 51, 99, 51, 99, 51, 99, 51, 99, + 51, 84, 51, 84, 52, 38, 71, 34, 84, 67, 0, 11, + 64, 46, 15, 0, 11, 114, 196, 166, 131, 35, 99, 67, + 82, 98, 240, 240, 67, 99, 51, 99, 51, 99, 51, 99, + 51, 99, 51, 99, 51, 99, 51, 99, 51, 99, 51, 84, + 51, 84, 52, 38, 71, 34, 84, 67, 0, 11, 64, 43, + 15, 0, 15, 35, 35, 115, 35, 115, 35, 0, 6, 35, + 99, 51, 99, 51, 99, 51, 99, 51, 99, 51, 99, 51, + 99, 51, 99, 51, 99, 51, 84, 51, 84, 52, 38, 71, + 34, 84, 67, 0, 11, 64, 45, 16, 0, 13, 19, 195, + 210, 210, 210, 210, 240, 240, 194, 131, 51, 115, 66, 114, + 83, 83, 83, 82, 114, 82, 115, 51, 130, 50, 147, 19, + 147, 19, 162, 18, 181, 195, 211, 211, 210, 211, 129, 51, + 150, 180, 176, 46, 15, 0, 11, 35, 195, 195, 195, 195, + 195, 195, 195, 195, 37, 83, 23, 70, 36, 52, 83, 52, + 99, 35, 115, 35, 115, 35, 115, 35, 115, 35, 115, 35, + 99, 53, 52, 59, 67, 36, 99, 195, 195, 195, 195, 195, + 192, 44, 16, 0, 16, 51, 51, 115, 51, 115, 51, 0, + 6, 83, 115, 51, 115, 66, 114, 83, 83, 98, 82, 115, + 66, 115, 51, 130, 50, 147, 34, 162, 19, 165, 181, 196, + 195, 211, 210, 211, 145, 35, 151, 164, 176, +}; + +//***************************************************************************** +// +// The glyph offset table for the 28 point Sansand font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetSansand28[] = +{ + 0, 5, 30, 51, 88, 133, 195, 238, + 251, 283, 316, 340, 359, 371, 380, 390, + 422, 465, 493, 522, 553, 589, 618, 655, + 682, 723, 760, 775, 792, 812, 825, 845, + 872, 939, 981, 1021, 1052, 1095, 1122, 1149, + 1186, 1230, 1257, 1285, 1330, 1357, 1430, 1487, + 1530, 1565, 1612, 1654, 1683, 1729, 1774, 1817, + 1892, 1933, 1977, 2004, 2036, 2066, 2098, 2122, + 2132, 2145, 2178, 2218, 2240, 2282, 2306, 2336, + 2374, 2417, 2442, 2473, 2514, 2542, 2590, 2625, + 2655, 2693, 2729, 2755, 2779, 2805, 2840, 2872, + 2922, 2953, 2990, 3010, 3042, 3073, 3106, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3121, 3126, 3149, 3186, 3214, 3253, 3287, 3314, + 3354, 3367, 3425, 3450, 3484, 3497, 3506, 3569, + 3578, 3595, 3617, 3637, 3659, 3672, 3712, 3757, + 3766, 3777, 3797, 3822, 3857, 3917, 3974, 4034, + 4059, 4114, 4166, 4219, 4269, 4319, 4375, 4422, + 4460, 4493, 4526, 4563, 4598, 4631, 4664, 4701, + 4735, 4778, 4842, 4896, 4946, 5000, 5053, 5104, + 5128, 5187, 5238, 5289, 5344, 5397, 5450, 5485, + 5535, 5576, 5617, 5662, 5705, 5746, 5789, 5826, + 5853, 5885, 5917, 5952, 5984, 6012, 6040, 6073, + 6102, 6144, 6189, 6227, 6265, 6307, 6347, 6385, + 6404, 6443, 6486, 6529, 6575, 6618, 6663, 6709, +}; + +//***************************************************************************** +// +// The font definition for the 28 point Sansand font. +// +//***************************************************************************** +const tFontEx g_sFontExSansand28 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 25, + + // + // The height of the font. + // + 34, + + // + // The baseline of the font. + // + 28, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetSansand28, + + // + // A pointer to the actual font data + // + g_pui8Sansand28Data +}; diff --git a/third_party/fonts/ofl/fonts/fontsansand30.c b/third_party/fonts/ofl/fonts/fontsansand30.c new file mode 100644 index 0000000..cc801d2 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fontsansand30.c @@ -0,0 +1,829 @@ +//***************************************************************************** +// +// fontsansand30.c - Font definition for the 30pt Sansand font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://scripts.sil.org/cms/scripts/page.php? +// item_id=Andika_download +// +// Copyright (c) 2004-2008, SIL International (http://scripts.sil.org), +// with Reserved Font Names 'Andika' and 'SIL'. +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: sansand +// Size: 30 point +// Bold: no +// Italic: no +// Memory usage: 7452 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 30 point Sansand font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Sansand30Data[7251] = +{ + 5, 13, 0, 60, 16, 27, 7, 0, 7, 4, 51, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, + 240, 178, 68, 52, 66, 0, 6, 80, 23, 10, 0, 8, + 98, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 0, 27, 112, 43, 20, 0, 23, 50, + 66, 179, 66, 178, 67, 178, 66, 194, 66, 127, 1, 79, + 1, 130, 66, 179, 66, 178, 67, 178, 66, 143, 1, 79, + 1, 114, 66, 194, 66, 179, 66, 178, 66, 194, 66, 0, + 26, 32, 47, 17, 0, 15, 82, 242, 242, 230, 154, 107, + 84, 18, 49, 99, 34, 163, 34, 163, 34, 164, 18, 182, + 199, 199, 183, 162, 36, 146, 51, 146, 51, 146, 51, 65, + 66, 35, 83, 34, 20, 76, 135, 210, 242, 242, 0, 9, + 80, 64, 23, 0, 26, 21, 114, 135, 83, 131, 19, 82, + 131, 51, 51, 131, 51, 50, 147, 51, 35, 147, 51, 34, + 163, 51, 19, 164, 19, 34, 199, 19, 213, 34, 36, 226, + 24, 194, 19, 35, 178, 19, 67, 162, 19, 67, 146, 35, + 67, 146, 35, 67, 130, 51, 67, 130, 52, 35, 130, 88, + 130, 101, 0, 20, 112, 45, 19, 0, 21, 117, 200, 164, + 36, 147, 67, 147, 67, 147, 67, 163, 35, 194, 19, 213, + 243, 245, 211, 19, 179, 50, 164, 51, 49, 83, 83, 34, + 67, 102, 67, 116, 83, 116, 99, 71, 105, 20, 102, 67, + 0, 17, 15, 5, 240, 240, 82, 50, 50, 50, 50, 50, + 50, 50, 0, 14, 16, 35, 11, 0, 9, 1, 146, 132, + 100, 115, 115, 131, 115, 131, 131, 115, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 147, 131, 131, 147, 131, 147, 132, + 131, 146, 161, 240, 36, 11, 0, 8, 49, 162, 132, 131, + 147, 147, 131, 147, 131, 131, 147, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 115, 131, 131, 115, 131, 115, 116, 115, + 130, 145, 240, 80, 26, 14, 0, 12, 114, 194, 129, 50, + 33, 68, 18, 19, 87, 147, 166, 84, 17, 35, 65, 50, + 33, 146, 194, 0, 34, 16, 19, 16, 0, 26, 98, 226, + 226, 226, 226, 226, 141, 61, 146, 226, 226, 226, 226, 0, + 23, 14, 7, 0, 22, 114, 68, 52, 82, 82, 66, 82, + 81, 240, 176, 9, 13, 0, 32, 74, 58, 0, 24, 96, + 11, 7, 0, 22, 114, 68, 52, 66, 0, 6, 80, 34, + 17, 0, 16, 50, 242, 226, 242, 226, 242, 227, 226, 227, + 226, 227, 226, 242, 226, 242, 226, 242, 226, 242, 227, 226, + 227, 226, 242, 226, 242, 226, 0, 8, 32, 45, 18, 0, + 20, 117, 185, 132, 67, 99, 115, 83, 115, 83, 115, 67, + 147, 51, 147, 51, 147, 51, 147, 51, 147, 51, 147, 51, + 147, 51, 147, 51, 147, 67, 115, 83, 115, 83, 100, 100, + 52, 137, 166, 0, 16, 96, 31, 15, 0, 17, 52, 165, + 135, 116, 19, 115, 35, 113, 67, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 195, 195, 195, 195, 124, 60, 0, 13, + 64, 30, 17, 0, 19, 70, 154, 100, 68, 82, 115, 243, + 227, 227, 227, 212, 211, 212, 211, 211, 212, 196, 196, 196, + 196, 195, 222, 62, 0, 15, 32, 34, 18, 0, 20, 102, + 170, 115, 84, 240, 19, 243, 243, 227, 212, 166, 199, 240, + 20, 244, 244, 243, 243, 243, 49, 179, 50, 147, 68, 84, + 107, 151, 0, 16, 96, 37, 18, 0, 21, 51, 228, 213, + 213, 194, 19, 179, 19, 163, 35, 162, 51, 147, 51, 131, + 67, 130, 83, 114, 99, 99, 99, 111, 63, 195, 243, 243, + 243, 243, 243, 0, 16, 64, 31, 17, 0, 19, 44, 92, + 83, 227, 227, 227, 227, 227, 233, 138, 113, 101, 227, 243, + 227, 227, 227, 212, 49, 147, 67, 84, 91, 135, 0, 15, + 112, 39, 18, 0, 21, 7, 154, 116, 66, 115, 227, 243, + 242, 243, 243, 38, 125, 85, 84, 68, 115, 67, 147, 51, + 147, 51, 147, 67, 131, 67, 131, 68, 99, 100, 67, 137, + 181, 0, 16, 96, 28, 18, 0, 20, 47, 63, 228, 227, + 227, 228, 227, 227, 243, 227, 243, 227, 243, 227, 243, 227, + 243, 243, 227, 243, 243, 0, 17, 32, 43, 18, 0, 20, + 118, 169, 131, 83, 99, 115, 83, 115, 83, 115, 83, 115, + 99, 83, 137, 153, 131, 83, 99, 115, 67, 147, 51, 147, + 51, 147, 51, 147, 51, 147, 67, 115, 84, 84, 121, 182, + 0, 16, 80, 38, 18, 0, 20, 102, 185, 116, 68, 99, + 100, 67, 131, 67, 146, 67, 147, 51, 147, 52, 116, 68, + 70, 93, 118, 35, 243, 243, 227, 243, 243, 227, 114, 68, + 122, 151, 0, 16, 112, 17, 7, 0, 14, 18, 68, 52, + 66, 0, 5, 114, 68, 52, 66, 0, 6, 80, 20, 7, + 0, 14, 18, 68, 52, 66, 0, 5, 114, 68, 52, 82, + 82, 66, 82, 81, 240, 176, 21, 18, 0, 28, 97, 243, + 198, 166, 151, 150, 165, 211, 246, 230, 246, 231, 229, 243, + 0, 25, 16, 13, 17, 0, 34, 14, 62, 0, 6, 110, + 62, 0, 30, 16, 20, 18, 0, 29, 35, 245, 231, 230, + 231, 230, 243, 198, 151, 150, 150, 181, 210, 0, 26, 96, + 29, 13, 0, 13, 22, 105, 66, 68, 163, 163, 148, 132, + 132, 147, 147, 162, 163, 163, 163, 163, 0, 6, 34, 164, + 148, 162, 0, 12, 48, 70, 25, 0, 32, 39, 252, 196, + 116, 147, 179, 115, 211, 83, 86, 66, 82, 73, 50, 82, + 51, 82, 66, 50, 66, 98, 66, 50, 50, 114, 66, 50, + 50, 114, 66, 50, 50, 114, 66, 50, 50, 99, 66, 50, + 50, 84, 50, 66, 51, 54, 19, 82, 55, 37, 98, 68, + 83, 115, 240, 131, 240, 131, 240, 132, 98, 236, 240, 23, + 0, 13, 96, 45, 21, 0, 24, 68, 240, 36, 240, 37, + 246, 242, 34, 227, 35, 211, 35, 210, 66, 195, 67, 179, + 82, 178, 99, 147, 99, 147, 114, 157, 126, 114, 162, 99, + 163, 83, 163, 82, 194, 67, 195, 51, 195, 0, 18, 96, + 43, 17, 0, 19, 26, 124, 83, 99, 83, 115, 67, 115, + 67, 115, 67, 115, 67, 99, 83, 83, 106, 123, 99, 100, + 67, 115, 67, 131, 51, 131, 51, 131, 51, 131, 51, 116, + 51, 100, 76, 90, 0, 15, 96, 45, 20, 0, 23, 55, + 187, 116, 99, 100, 145, 99, 240, 19, 240, 35, 240, 19, + 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, + 240, 36, 240, 35, 240, 36, 240, 36, 145, 116, 100, 124, + 167, 0, 18, 48, 45, 20, 0, 22, 74, 173, 115, 101, + 99, 132, 83, 148, 67, 163, 67, 163, 67, 179, 51, 179, + 51, 179, 51, 179, 51, 179, 51, 179, 51, 179, 51, 163, + 67, 163, 67, 147, 83, 132, 83, 101, 108, 138, 0, 18, + 96, 28, 16, 0, 18, 13, 61, 51, 211, 211, 211, 211, + 211, 211, 219, 91, 83, 211, 211, 211, 211, 211, 211, 211, + 221, 61, 0, 14, 48, 28, 16, 0, 18, 13, 61, 51, + 211, 211, 211, 211, 211, 211, 220, 76, 67, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 0, 15, 80, 45, 20, 0, + 23, 55, 188, 100, 99, 100, 145, 99, 240, 19, 240, 35, + 240, 19, 240, 35, 240, 35, 240, 35, 104, 51, 104, 51, + 179, 51, 179, 67, 163, 67, 163, 68, 147, 83, 147, 100, + 85, 124, 167, 0, 18, 48, 48, 19, 0, 21, 51, 163, + 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, + 51, 163, 51, 163, 63, 1, 63, 1, 51, 163, 51, 163, + 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, + 51, 163, 51, 163, 0, 17, 28, 13, 0, 14, 90, 58, + 99, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 122, 58, 0, 11, 96, 29, 14, + 0, 16, 99, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 163, 66, 68, 73, 102, + 0, 13, 16, 47, 18, 0, 20, 35, 131, 67, 115, 83, + 99, 99, 84, 99, 68, 115, 67, 131, 51, 147, 35, 163, + 19, 182, 198, 195, 19, 179, 35, 163, 36, 147, 52, 131, + 68, 115, 84, 99, 100, 83, 115, 83, 131, 67, 147, 0, + 16, 16, 28, 16, 0, 18, 3, 211, 211, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 211, 221, 61, 0, 14, 48, 76, 23, 0, 25, 116, 196, + 53, 165, 53, 165, 53, 165, 54, 134, 51, 18, 130, 19, + 51, 18, 130, 19, 51, 19, 99, 19, 51, 34, 98, 35, + 51, 34, 98, 35, 51, 35, 67, 35, 51, 50, 66, 51, + 51, 50, 66, 51, 51, 51, 35, 51, 51, 66, 34, 67, + 51, 66, 34, 67, 51, 70, 67, 51, 85, 67, 51, 84, + 83, 51, 84, 83, 51, 99, 83, 0, 20, 64, 60, 20, + 0, 22, 67, 179, 52, 163, 53, 147, 53, 147, 54, 131, + 51, 19, 115, 51, 19, 115, 51, 35, 99, 51, 51, 83, + 51, 51, 83, 51, 67, 67, 51, 83, 51, 51, 83, 51, + 51, 99, 35, 51, 115, 19, 51, 115, 19, 51, 134, 51, + 149, 51, 149, 51, 164, 51, 179, 0, 17, 112, 45, 21, + 0, 24, 54, 218, 164, 68, 131, 131, 115, 132, 83, 163, + 83, 163, 67, 195, 51, 195, 51, 195, 51, 195, 51, 195, + 51, 195, 51, 195, 67, 163, 83, 163, 84, 146, 115, 131, + 132, 68, 170, 214, 0, 19, 64, 37, 17, 0, 19, 26, + 124, 83, 100, 67, 115, 67, 131, 51, 131, 51, 131, 51, + 131, 51, 131, 51, 115, 67, 100, 76, 90, 115, 227, 227, + 227, 227, 227, 227, 227, 0, 16, 80, 49, 23, 0, 26, + 86, 250, 196, 68, 163, 131, 147, 132, 115, 163, 115, 163, + 99, 195, 83, 195, 83, 195, 83, 195, 83, 195, 83, 195, + 83, 195, 99, 163, 115, 163, 116, 147, 131, 131, 164, 68, + 202, 250, 240, 87, 240, 52, 0, 14, 112, 44, 19, 0, + 21, 58, 156, 115, 100, 99, 116, 83, 131, 83, 131, 83, + 131, 83, 131, 83, 115, 99, 100, 108, 122, 147, 52, 147, + 67, 147, 83, 131, 84, 115, 100, 99, 115, 99, 131, 83, + 132, 67, 148, 0, 17, 31, 18, 0, 20, 119, 155, 100, + 83, 99, 227, 243, 243, 245, 230, 216, 185, 199, 229, 228, + 243, 243, 243, 65, 147, 83, 100, 76, 151, 0, 16, 96, + 48, 20, 0, 22, 79, 2, 63, 2, 163, 240, 35, 240, + 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, + 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, + 35, 240, 35, 240, 35, 240, 35, 240, 35, 0, 18, 96, + 47, 19, 0, 21, 51, 163, 51, 163, 51, 163, 51, 163, + 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, + 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, + 52, 132, 67, 131, 99, 99, 138, 182, 0, 17, 80, 47, + 21, 0, 23, 83, 195, 51, 195, 52, 163, 83, 163, 83, + 147, 115, 131, 115, 131, 115, 115, 147, 99, 147, 99, 147, + 83, 179, 67, 179, 67, 179, 51, 211, 35, 211, 34, 242, + 19, 246, 245, 240, 36, 240, 36, 0, 19, 80, 79, 31, + 0, 34, 115, 163, 147, 51, 148, 147, 51, 148, 147, 67, + 132, 131, 83, 118, 115, 83, 118, 115, 98, 114, 34, 114, + 115, 98, 35, 83, 115, 83, 35, 83, 115, 82, 66, 83, + 130, 82, 66, 82, 147, 51, 67, 51, 147, 51, 82, 51, + 162, 50, 98, 51, 162, 50, 99, 34, 179, 19, 99, 19, + 179, 18, 130, 19, 194, 18, 130, 18, 213, 133, 212, 164, + 227, 164, 0, 28, 16, 47, 20, 0, 22, 83, 147, 84, + 116, 99, 115, 131, 83, 148, 52, 163, 51, 195, 19, 215, + 229, 240, 19, 240, 20, 240, 21, 227, 19, 196, 19, 195, + 51, 163, 83, 147, 83, 131, 115, 100, 116, 83, 147, 67, + 179, 0, 17, 112, 47, 20, 0, 22, 67, 179, 67, 148, + 67, 147, 99, 115, 116, 99, 131, 83, 163, 51, 179, 51, + 195, 19, 215, 229, 240, 20, 240, 19, 240, 35, 240, 35, + 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, + 0, 18, 96, 33, 19, 0, 21, 78, 94, 243, 240, 19, + 243, 243, 240, 19, 243, 243, 240, 19, 243, 243, 240, 19, + 243, 244, 243, 243, 244, 243, 255, 1, 63, 1, 0, 17, + 34, 10, 0, 8, 103, 55, 51, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 119, 55, 208, 31, 12, + 0, 10, 66, 163, 162, 162, 163, 162, 162, 162, 163, 162, + 162, 163, 162, 162, 162, 163, 162, 162, 163, 162, 162, 162, + 163, 162, 161, 0, 8, 34, 10, 0, 8, 103, 55, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 55, 55, 208, 26, 16, 0, 14, 83, 196, 197, 163, 18, + 162, 35, 131, 50, 130, 67, 99, 82, 98, 99, 67, 114, + 66, 131, 0, 38, 48, 11, 22, 0, 90, 111, 4, 63, + 4, 0, 5, 112, 13, 11, 0, 9, 84, 147, 147, 146, + 162, 162, 0, 33, 48, 35, 17, 0, 32, 71, 138, 99, + 83, 83, 99, 83, 99, 67, 115, 67, 115, 67, 115, 67, + 115, 67, 100, 67, 100, 68, 69, 83, 54, 103, 35, 100, + 67, 0, 15, 32, 43, 17, 0, 14, 115, 227, 227, 227, + 227, 227, 227, 227, 227, 53, 99, 24, 86, 52, 69, 83, + 68, 115, 51, 131, 51, 131, 51, 131, 51, 131, 51, 131, + 51, 115, 67, 115, 68, 68, 91, 150, 0, 15, 112, 24, + 15, 0, 28, 102, 121, 84, 66, 67, 195, 179, 195, 195, + 195, 195, 196, 195, 211, 82, 105, 119, 0, 13, 80, 44, + 18, 0, 17, 19, 243, 243, 243, 243, 243, 243, 243, 149, + 19, 123, 99, 84, 83, 115, 83, 115, 67, 131, 67, 131, + 67, 131, 67, 131, 67, 131, 67, 116, 83, 85, 84, 54, + 104, 35, 102, 51, 0, 16, 16, 27, 16, 0, 30, 70, + 137, 115, 67, 83, 98, 67, 115, 51, 115, 61, 61, 51, + 211, 211, 227, 212, 98, 91, 119, 0, 14, 80, 31, 14, + 0, 13, 5, 119, 115, 49, 99, 179, 179, 179, 179, 138, + 74, 115, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 0, 13, 32, 42, 16, 0, 30, 86, 138, 83, + 83, 67, 99, 67, 99, 51, 115, 51, 115, 51, 115, 51, + 115, 51, 115, 51, 100, 52, 69, 67, 54, 87, 19, 101, + 35, 211, 211, 211, 81, 99, 98, 68, 90, 149, 112, 45, + 16, 0, 14, 3, 211, 211, 211, 211, 211, 211, 211, 211, + 53, 83, 24, 70, 51, 69, 83, 52, 99, 51, 115, 51, + 115, 51, 115, 51, 115, 51, 115, 51, 115, 51, 115, 51, + 115, 51, 115, 51, 115, 0, 14, 48, 26, 6, 0, 6, + 98, 67, 51, 66, 243, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 240, 240, 240, 34, 12, + 0, 14, 34, 148, 132, 146, 240, 240, 51, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 65, 51, 86, 101, 112, 43, 16, 0, 14, + 3, 211, 211, 211, 211, 211, 211, 211, 211, 84, 67, 68, + 83, 67, 99, 51, 115, 35, 131, 19, 149, 182, 163, 19, + 147, 35, 131, 51, 115, 52, 99, 68, 83, 84, 67, 100, + 0, 14, 48, 30, 6, 240, 240, 195, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 240, 240, 240, 51, 23, 0, + 43, 19, 52, 68, 106, 23, 85, 38, 36, 68, 68, 67, + 67, 83, 83, 67, 83, 83, 67, 83, 83, 67, 83, 83, + 67, 83, 83, 67, 83, 83, 67, 83, 83, 67, 83, 83, + 67, 83, 83, 67, 83, 83, 67, 83, 83, 0, 20, 64, + 37, 17, 0, 31, 115, 68, 115, 24, 86, 51, 85, 83, + 68, 99, 67, 115, 67, 115, 67, 115, 67, 115, 67, 115, + 67, 115, 67, 115, 67, 115, 67, 115, 67, 115, 0, 15, + 32, 33, 17, 0, 32, 54, 169, 115, 68, 83, 99, 68, + 100, 51, 131, 51, 131, 51, 131, 51, 131, 51, 131, 51, + 116, 67, 99, 84, 67, 121, 166, 0, 15, 96, 41, 18, + 0, 33, 99, 69, 115, 24, 102, 52, 85, 83, 84, 115, + 67, 131, 67, 131, 67, 131, 67, 131, 67, 131, 67, 115, + 83, 115, 85, 67, 107, 115, 37, 131, 243, 243, 243, 243, + 243, 243, 224, 39, 16, 0, 30, 86, 138, 83, 83, 67, + 99, 67, 99, 51, 115, 51, 115, 51, 115, 51, 115, 51, + 115, 51, 115, 67, 84, 68, 53, 91, 116, 35, 211, 211, + 211, 211, 211, 211, 211, 48, 28, 15, 0, 28, 19, 84, + 67, 53, 67, 37, 83, 35, 115, 18, 147, 18, 149, 165, + 164, 180, 179, 195, 195, 195, 195, 0, 14, 64, 24, 14, + 0, 26, 86, 105, 83, 66, 67, 179, 181, 167, 136, 135, + 164, 179, 49, 115, 51, 67, 74, 102, 0, 13, 28, 14, + 0, 17, 115, 179, 179, 179, 179, 138, 74, 115, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 180, 34, 119, 133, 0, + 12, 96, 38, 17, 0, 31, 115, 115, 67, 115, 67, 115, + 67, 115, 67, 115, 67, 115, 67, 115, 67, 115, 67, 115, + 67, 115, 67, 100, 67, 85, 83, 51, 18, 88, 34, 101, + 67, 0, 15, 32, 32, 17, 0, 31, 115, 131, 51, 131, + 51, 115, 83, 99, 83, 98, 114, 83, 115, 67, 115, 66, + 147, 35, 147, 34, 178, 19, 182, 181, 212, 211, 0, 16, + 56, 24, 0, 45, 3, 99, 99, 51, 99, 99, 51, 84, + 98, 82, 85, 67, 83, 66, 18, 67, 83, 51, 18, 66, + 114, 50, 35, 50, 114, 50, 50, 35, 115, 34, 50, 35, + 115, 18, 67, 18, 146, 18, 82, 18, 146, 18, 85, 149, + 85, 148, 115, 179, 115, 0, 21, 112, 32, 17, 0, 31, + 116, 100, 67, 99, 99, 67, 131, 35, 147, 35, 166, 196, + 212, 197, 198, 163, 35, 131, 51, 131, 67, 99, 99, 67, + 116, 0, 15, 32, 40, 18, 0, 33, 115, 131, 67, 131, + 82, 115, 99, 99, 99, 98, 130, 83, 131, 67, 146, 66, + 163, 35, 163, 35, 178, 34, 198, 213, 212, 228, 242, 240, + 18, 243, 242, 162, 51, 167, 196, 208, 22, 15, 0, 28, + 28, 60, 179, 179, 180, 179, 179, 179, 194, 195, 179, 179, + 194, 204, 60, 0, 13, 64, 35, 12, 0, 10, 1, 132, + 117, 100, 131, 147, 147, 147, 147, 147, 147, 147, 147, 132, + 115, 131, 179, 163, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 164, 133, 162, 240, 33, 5, 240, 240, 82, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 208, 36, 12, 0, 9, 1, 180, 133, 148, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 148, 163, 148, 115, 131, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 116, 117, 114, + 240, 112, 15, 19, 0, 45, 52, 130, 73, 50, 66, 73, + 66, 117, 0, 33, 112, 5, 19, 0, 87, 112, 25, 7, + 0, 12, 50, 68, 52, 66, 240, 163, 67, 67, 67, 67, + 67, 67, 67, 67, 67, 67, 67, 67, 67, 68, 160, 41, + 15, 0, 21, 50, 210, 210, 210, 182, 137, 86, 18, 83, + 34, 131, 34, 115, 50, 115, 50, 115, 50, 115, 50, 115, + 50, 131, 34, 49, 68, 18, 34, 90, 104, 162, 210, 210, + 210, 0, 8, 48, 29, 16, 0, 18, 85, 167, 131, 65, + 115, 211, 211, 211, 211, 211, 185, 121, 147, 211, 211, 211, + 211, 211, 211, 195, 205, 61, 0, 14, 48, 40, 20, 0, + 22, 81, 209, 67, 179, 67, 37, 35, 109, 131, 83, 146, + 114, 130, 146, 114, 146, 114, 146, 114, 146, 114, 146, 130, + 114, 147, 83, 141, 99, 37, 35, 67, 179, 65, 209, 0, + 28, 40, 19, 0, 23, 99, 163, 67, 131, 83, 115, 115, + 99, 115, 83, 147, 67, 147, 51, 179, 35, 179, 19, 213, + 188, 124, 179, 204, 124, 179, 240, 19, 240, 19, 240, 19, + 240, 19, 0, 17, 112, 30, 5, 240, 240, 82, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 240, 210, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 128, 42, + 14, 0, 16, 22, 105, 83, 66, 67, 179, 180, 180, 165, + 180, 150, 120, 84, 36, 67, 68, 51, 83, 51, 83, 67, + 67, 68, 35, 103, 133, 180, 180, 180, 179, 179, 49, 115, + 51, 67, 74, 102, 96, 15, 13, 0, 14, 82, 82, 67, + 67, 51, 67, 66, 67, 0, 39, 48, 61, 24, 0, 27, + 119, 251, 181, 84, 147, 53, 35, 130, 40, 50, 98, 35, + 66, 66, 82, 34, 178, 66, 34, 210, 50, 34, 210, 50, + 34, 210, 50, 34, 210, 50, 34, 210, 50, 35, 194, 50, + 50, 194, 66, 35, 66, 66, 82, 56, 66, 98, 68, 82, + 115, 164, 132, 101, 187, 247, 0, 22, 32, 28, 12, 0, + 13, 116, 103, 82, 50, 66, 66, 66, 66, 66, 66, 66, + 51, 67, 20, 84, 18, 83, 49, 240, 25, 57, 0, 22, + 112, 36, 19, 0, 36, 51, 67, 131, 67, 131, 67, 132, + 67, 131, 67, 131, 67, 131, 67, 131, 68, 147, 67, 163, + 67, 163, 67, 163, 67, 147, 82, 163, 67, 163, 67, 0, + 17, 14, 17, 0, 40, 62, 62, 242, 242, 242, 242, 242, + 0, 23, 96, 9, 13, 0, 32, 74, 58, 0, 24, 96, + 67, 24, 0, 27, 119, 251, 181, 84, 147, 22, 51, 130, + 39, 66, 98, 50, 51, 66, 82, 50, 66, 66, 66, 66, + 66, 82, 50, 66, 51, 82, 50, 71, 98, 50, 70, 114, + 50, 66, 34, 114, 50, 66, 49, 114, 50, 66, 50, 98, + 66, 50, 66, 66, 82, 50, 67, 50, 98, 210, 115, 164, + 132, 101, 187, 247, 0, 22, 32, 8, 13, 0, 16, 42, + 58, 0, 41, 19, 10, 0, 11, 67, 101, 67, 19, 50, + 50, 50, 50, 51, 19, 69, 99, 0, 25, 80, 24, 16, + 0, 20, 98, 226, 226, 226, 226, 226, 141, 61, 146, 226, + 226, 226, 226, 240, 240, 173, 61, 0, 20, 48, 21, 11, + 0, 9, 116, 87, 66, 51, 146, 146, 146, 130, 130, 130, + 130, 130, 136, 56, 0, 23, 96, 23, 11, 0, 9, 116, + 102, 81, 66, 146, 131, 84, 117, 146, 162, 146, 146, 50, + 51, 55, 100, 0, 22, 80, 12, 11, 0, 10, 35, 115, + 115, 115, 115, 115, 0, 34, 44, 17, 0, 31, 115, 115, + 67, 115, 67, 115, 67, 115, 67, 115, 67, 115, 67, 115, + 67, 115, 67, 115, 67, 115, 67, 100, 68, 69, 69, 35, + 18, 73, 34, 67, 20, 51, 51, 227, 227, 227, 227, 227, + 227, 224, 47, 16, 0, 18, 58, 76, 55, 34, 87, 34, + 87, 34, 87, 34, 87, 34, 87, 34, 102, 34, 117, 34, + 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, + 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 0, 14, + 80, 11, 7, 0, 15, 114, 68, 52, 66, 0, 13, 80, + 12, 9, 0, 33, 114, 116, 130, 114, 99, 53, 83, 80, + 21, 12, 0, 10, 99, 132, 114, 18, 162, 162, 162, 162, + 162, 162, 162, 162, 121, 57, 0, 25, 112, 26, 12, 0, + 13, 101, 103, 67, 51, 50, 82, 50, 82, 50, 82, 50, + 82, 51, 51, 71, 101, 240, 41, 57, 0, 22, 112, 37, + 19, 0, 35, 83, 67, 163, 67, 163, 67, 147, 83, 147, + 67, 163, 67, 163, 67, 148, 67, 131, 67, 131, 67, 131, + 67, 131, 68, 131, 67, 131, 67, 131, 67, 0, 17, 96, + 63, 24, 0, 21, 35, 194, 85, 194, 82, 18, 178, 146, + 162, 162, 162, 162, 146, 178, 130, 194, 130, 194, 114, 210, + 98, 226, 98, 66, 87, 50, 67, 87, 34, 68, 226, 50, + 18, 210, 66, 18, 194, 66, 34, 194, 50, 50, 178, 50, + 66, 162, 74, 130, 74, 114, 178, 130, 194, 130, 194, 114, + 0, 20, 64, 60, 24, 0, 21, 35, 194, 85, 178, 98, + 18, 178, 146, 162, 162, 146, 178, 146, 178, 130, 194, 130, + 194, 114, 210, 98, 226, 98, 36, 87, 50, 23, 71, 34, + 34, 51, 194, 33, 82, 178, 146, 162, 162, 162, 146, 162, + 146, 162, 146, 178, 130, 178, 130, 178, 136, 98, 136, 82, + 0, 20, 64, 65, 24, 0, 21, 36, 178, 102, 162, 97, + 66, 130, 194, 114, 195, 114, 148, 130, 165, 98, 227, 82, + 242, 66, 240, 18, 50, 177, 67, 50, 66, 87, 50, 67, + 116, 50, 68, 225, 66, 18, 210, 66, 18, 194, 66, 34, + 178, 66, 50, 178, 50, 66, 162, 74, 114, 90, 114, 178, + 130, 194, 114, 210, 114, 0, 20, 64, 29, 13, 0, 23, + 50, 164, 148, 162, 240, 240, 99, 163, 163, 163, 163, 148, + 147, 148, 132, 147, 147, 163, 163, 164, 66, 73, 102, 240, + 32, 58, 21, 52, 240, 52, 240, 51, 240, 67, 240, 67, + 240, 67, 240, 66, 0, 7, 52, 240, 36, 240, 37, 246, + 242, 34, 227, 35, 211, 35, 210, 66, 195, 67, 179, 82, + 178, 98, 163, 99, 147, 114, 157, 126, 114, 162, 99, 163, + 83, 163, 82, 194, 67, 195, 51, 195, 0, 18, 96, 58, + 21, 195, 240, 35, 240, 35, 240, 35, 240, 35, 240, 50, + 240, 50, 0, 7, 84, 240, 36, 240, 37, 246, 242, 34, + 227, 35, 211, 35, 210, 66, 195, 67, 179, 82, 178, 98, + 163, 99, 147, 114, 157, 126, 114, 162, 99, 163, 83, 163, + 82, 194, 67, 195, 51, 195, 0, 18, 96, 58, 21, 130, + 240, 52, 240, 22, 227, 35, 210, 66, 194, 98, 163, 114, + 0, 6, 116, 240, 36, 240, 37, 246, 242, 34, 227, 35, + 211, 35, 210, 66, 195, 67, 179, 82, 178, 98, 163, 99, + 147, 114, 157, 126, 114, 162, 99, 163, 83, 163, 82, 194, + 67, 195, 51, 195, 0, 18, 96, 56, 22, 0, 8, 116, + 65, 202, 194, 52, 0, 10, 36, 240, 52, 240, 53, 240, + 19, 18, 240, 19, 18, 240, 18, 35, 227, 50, 227, 51, + 210, 67, 195, 82, 194, 99, 163, 99, 163, 114, 173, 142, + 131, 147, 114, 163, 99, 178, 99, 179, 67, 195, 67, 211, + 0, 19, 80, 54, 21, 0, 5, 98, 82, 195, 67, 179, + 67, 194, 82, 0, 9, 84, 240, 22, 246, 246, 227, 35, + 211, 35, 196, 35, 195, 67, 179, 67, 163, 98, 163, 99, + 147, 99, 131, 131, 126, 126, 99, 163, 83, 163, 83, 163, + 67, 195, 51, 195, 51, 195, 0, 18, 96, 58, 21, 240, + 212, 240, 22, 242, 34, 242, 34, 246, 240, 20, 0, 7, + 66, 240, 52, 240, 36, 240, 36, 240, 18, 34, 242, 34, + 227, 35, 210, 66, 210, 66, 195, 67, 178, 98, 163, 99, + 147, 99, 156, 142, 114, 162, 114, 162, 99, 163, 83, 163, + 67, 195, 51, 195, 0, 18, 96, 52, 27, 0, 31, 93, + 237, 214, 240, 98, 19, 240, 83, 19, 240, 82, 35, 240, + 67, 35, 240, 66, 51, 240, 51, 51, 240, 50, 74, 163, + 74, 162, 83, 240, 19, 83, 240, 27, 252, 242, 115, 227, + 115, 226, 131, 211, 131, 210, 156, 51, 156, 0, 24, 54, + 20, 0, 23, 55, 188, 100, 100, 84, 145, 99, 240, 19, + 240, 35, 240, 19, 240, 35, 240, 35, 240, 35, 240, 35, + 240, 35, 240, 35, 240, 51, 240, 35, 240, 36, 240, 36, + 146, 100, 100, 124, 168, 226, 240, 52, 240, 51, 240, 50, + 240, 35, 229, 244, 144, 35, 16, 19, 212, 212, 211, 227, + 227, 227, 240, 240, 157, 61, 51, 211, 211, 211, 211, 211, + 211, 219, 91, 83, 211, 211, 211, 211, 211, 211, 211, 221, + 61, 0, 14, 48, 35, 16, 147, 195, 195, 195, 210, 210, + 211, 240, 240, 189, 61, 51, 211, 211, 211, 211, 211, 211, + 219, 91, 83, 211, 211, 211, 211, 211, 211, 211, 221, 61, + 0, 14, 48, 39, 16, 82, 212, 197, 163, 19, 131, 51, + 99, 82, 83, 114, 240, 240, 109, 61, 51, 211, 211, 211, + 211, 211, 211, 219, 91, 83, 211, 211, 211, 211, 211, 211, + 211, 221, 61, 0, 14, 48, 38, 16, 240, 240, 66, 66, + 131, 51, 115, 51, 115, 66, 0, 6, 93, 61, 51, 211, + 211, 211, 211, 211, 211, 219, 91, 83, 211, 211, 211, 211, + 211, 211, 211, 221, 61, 0, 14, 48, 35, 14, 3, 195, + 195, 195, 195, 194, 210, 240, 240, 90, 74, 115, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 138, 74, 0, 12, 80, 35, 14, 116, 148, 163, + 163, 163, 163, 163, 240, 240, 122, 74, 115, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 138, 74, 0, 12, 96, 39, 15, 67, 181, 166, 131, + 19, 115, 51, 98, 83, 66, 115, 240, 240, 74, 90, 131, + 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 195, 195, 195, 154, 90, 0, 13, 80, 37, 13, 240, + 178, 82, 67, 67, 51, 67, 66, 82, 240, 240, 202, 58, + 99, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 122, 58, 0, 11, 96, 45, 22, + 0, 25, 10, 205, 147, 101, 131, 132, 115, 148, 99, 163, + 99, 163, 99, 179, 83, 179, 59, 83, 59, 83, 83, 179, + 83, 179, 83, 179, 83, 163, 99, 163, 99, 147, 115, 132, + 115, 101, 140, 170, 0, 20, 64, 67, 20, 0, 8, 20, + 49, 185, 177, 52, 0, 8, 67, 179, 52, 163, 53, 147, + 53, 147, 54, 131, 51, 19, 115, 51, 19, 115, 51, 35, + 99, 51, 51, 83, 51, 51, 83, 51, 67, 67, 51, 83, + 51, 51, 83, 51, 51, 99, 35, 51, 115, 19, 51, 115, + 19, 51, 134, 51, 149, 51, 149, 51, 164, 51, 179, 0, + 17, 112, 58, 21, 67, 240, 52, 240, 51, 240, 67, 240, + 67, 240, 67, 240, 67, 0, 7, 22, 218, 164, 68, 131, + 131, 115, 132, 83, 163, 83, 163, 67, 195, 51, 195, 51, + 195, 51, 195, 51, 195, 51, 195, 51, 195, 67, 163, 83, + 163, 84, 146, 115, 131, 132, 68, 170, 214, 0, 19, 64, + 58, 21, 180, 240, 35, 240, 35, 240, 35, 240, 35, 240, + 35, 240, 35, 0, 7, 70, 218, 164, 68, 131, 131, 115, + 132, 83, 163, 83, 163, 67, 195, 51, 195, 51, 195, 51, + 195, 51, 195, 51, 195, 51, 195, 67, 163, 83, 163, 84, + 146, 115, 131, 132, 68, 170, 214, 0, 19, 64, 58, 21, + 130, 240, 52, 240, 22, 227, 35, 210, 66, 194, 98, 162, + 130, 0, 6, 102, 218, 164, 68, 131, 131, 115, 132, 83, + 163, 83, 163, 67, 195, 51, 195, 51, 195, 51, 195, 51, + 195, 51, 195, 51, 195, 67, 163, 83, 163, 84, 146, 115, + 131, 132, 68, 170, 214, 0, 19, 64, 52, 21, 0, 8, + 68, 50, 186, 178, 52, 0, 9, 86, 218, 164, 68, 131, + 131, 115, 132, 83, 163, 83, 163, 67, 195, 51, 195, 51, + 195, 51, 195, 51, 195, 51, 195, 51, 195, 67, 163, 83, + 163, 84, 146, 115, 131, 132, 68, 170, 214, 0, 19, 64, + 55, 21, 0, 5, 114, 66, 211, 51, 195, 51, 210, 66, + 0, 9, 70, 218, 164, 68, 131, 131, 115, 132, 83, 163, + 83, 163, 67, 195, 51, 195, 51, 195, 51, 195, 51, 195, + 51, 195, 51, 195, 67, 163, 83, 163, 84, 146, 115, 131, + 132, 68, 170, 214, 0, 19, 64, 25, 15, 0, 26, 49, + 114, 67, 84, 67, 52, 99, 20, 133, 179, 181, 147, 19, + 115, 51, 83, 83, 81, 114, 0, 23, 62, 21, 0, 20, + 18, 240, 50, 198, 18, 171, 148, 68, 131, 101, 115, 102, + 83, 98, 35, 83, 98, 35, 67, 98, 67, 51, 98, 67, + 51, 82, 83, 51, 82, 83, 51, 66, 99, 51, 66, 99, + 51, 50, 115, 52, 34, 99, 83, 18, 115, 86, 114, 116, + 115, 132, 68, 155, 146, 38, 178, 0, 17, 112, 60, 19, + 36, 240, 20, 240, 19, 240, 35, 240, 35, 240, 35, 240, + 35, 0, 5, 99, 163, 51, 163, 51, 163, 51, 163, 51, + 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, + 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, 52, + 132, 67, 131, 99, 99, 138, 182, 0, 17, 80, 54, 19, + 164, 243, 243, 243, 243, 243, 243, 0, 6, 19, 163, 51, + 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, + 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, + 163, 51, 163, 51, 163, 52, 132, 67, 131, 99, 99, 138, + 182, 0, 17, 80, 59, 19, 114, 240, 20, 230, 195, 35, + 163, 67, 146, 98, 130, 130, 240, 240, 211, 163, 51, 163, + 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, + 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, + 51, 163, 51, 163, 52, 132, 67, 131, 99, 99, 138, 182, + 0, 17, 80, 57, 19, 240, 240, 178, 66, 179, 51, 163, + 51, 178, 51, 0, 8, 3, 163, 51, 163, 51, 163, 51, + 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, + 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, 163, 51, + 163, 52, 132, 67, 131, 99, 99, 138, 182, 0, 17, 80, + 60, 20, 179, 240, 19, 240, 20, 240, 19, 240, 19, 240, + 19, 240, 19, 0, 6, 51, 179, 67, 148, 67, 147, 99, + 115, 116, 99, 131, 83, 163, 51, 179, 51, 195, 19, 215, + 229, 240, 20, 240, 19, 240, 35, 240, 35, 240, 35, 240, + 35, 240, 35, 240, 35, 240, 35, 240, 35, 0, 18, 96, + 37, 17, 0, 19, 19, 227, 227, 227, 234, 124, 83, 100, + 67, 115, 67, 131, 51, 131, 51, 131, 51, 131, 51, 131, + 51, 115, 67, 100, 76, 90, 115, 227, 227, 227, 0, 16, + 80, 52, 18, 0, 16, 38, 170, 116, 68, 99, 115, 67, + 131, 67, 131, 67, 116, 67, 100, 83, 69, 99, 52, 131, + 51, 147, 51, 147, 52, 131, 69, 99, 85, 83, 116, 67, + 132, 51, 147, 51, 147, 51, 147, 51, 49, 67, 67, 56, + 67, 54, 0, 16, 64, 43, 17, 0, 15, 20, 227, 243, + 243, 243, 242, 0, 5, 119, 138, 99, 83, 83, 99, 83, + 99, 67, 115, 67, 115, 67, 115, 67, 115, 67, 100, 67, + 100, 68, 69, 83, 54, 103, 35, 100, 67, 0, 15, 32, + 43, 17, 0, 16, 4, 196, 211, 211, 211, 211, 0, 6, + 7, 138, 99, 83, 83, 99, 83, 99, 67, 115, 67, 115, + 67, 115, 67, 115, 67, 100, 67, 100, 68, 69, 83, 54, + 103, 35, 100, 67, 0, 15, 32, 47, 17, 0, 15, 83, + 213, 179, 19, 147, 50, 146, 82, 114, 114, 240, 240, 215, + 138, 99, 83, 83, 99, 83, 99, 67, 115, 67, 115, 67, + 115, 67, 115, 67, 100, 67, 100, 68, 69, 83, 54, 103, + 35, 100, 67, 0, 15, 32, 42, 17, 0, 19, 83, 65, + 137, 129, 52, 0, 7, 103, 138, 99, 83, 83, 99, 83, + 99, 67, 115, 67, 115, 67, 115, 67, 115, 67, 100, 67, + 100, 68, 69, 83, 54, 103, 35, 100, 67, 0, 15, 32, + 45, 17, 0, 19, 66, 66, 147, 51, 131, 51, 131, 66, + 240, 240, 231, 138, 99, 83, 83, 99, 83, 99, 67, 115, + 67, 115, 67, 115, 67, 115, 67, 100, 67, 100, 68, 69, + 83, 54, 103, 35, 100, 67, 0, 15, 32, 46, 17, 0, + 15, 83, 199, 162, 50, 162, 50, 167, 195, 0, 5, 119, + 138, 99, 83, 83, 99, 83, 99, 67, 115, 67, 115, 67, + 115, 67, 115, 67, 100, 67, 100, 68, 69, 83, 51, 18, + 103, 35, 101, 66, 0, 15, 32, 40, 26, 0, 49, 37, + 85, 152, 41, 114, 70, 67, 228, 99, 212, 114, 211, 130, + 127, 4, 111, 6, 67, 83, 227, 99, 227, 100, 211, 85, + 212, 51, 20, 82, 88, 59, 85, 103, 0, 23, 64, 29, + 15, 0, 28, 102, 121, 84, 66, 67, 195, 179, 195, 195, + 195, 195, 196, 195, 211, 82, 105, 119, 146, 212, 211, 210, + 195, 149, 179, 112, 35, 16, 0, 14, 35, 227, 227, 227, + 226, 242, 240, 240, 214, 137, 115, 67, 83, 98, 67, 115, + 51, 115, 61, 61, 51, 211, 211, 227, 212, 98, 91, 119, + 0, 14, 80, 35, 16, 0, 15, 19, 195, 195, 210, 210, + 210, 240, 240, 246, 137, 115, 67, 83, 98, 67, 115, 51, + 115, 61, 61, 51, 211, 211, 227, 212, 98, 91, 119, 0, + 14, 80, 38, 16, 0, 14, 84, 196, 182, 147, 35, 115, + 67, 83, 99, 240, 240, 150, 137, 115, 67, 83, 98, 67, + 115, 51, 115, 61, 61, 51, 211, 211, 227, 212, 98, 91, + 119, 0, 14, 80, 37, 16, 0, 18, 34, 82, 115, 67, + 99, 67, 99, 82, 240, 240, 166, 137, 115, 67, 83, 98, + 67, 130, 51, 130, 61, 61, 51, 211, 211, 227, 212, 98, + 91, 119, 0, 14, 80, 29, 11, 0, 9, 84, 131, 147, + 147, 147, 162, 240, 227, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 0, 10, 16, 30, 11, + 0, 10, 35, 115, 115, 115, 115, 115, 240, 240, 19, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 0, 10, 64, 34, 14, 0, 12, 99, 165, 131, 19, + 99, 51, 67, 83, 50, 114, 240, 240, 83, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 0, + 13, 16, 32, 13, 0, 14, 98, 66, 68, 51, 52, 51, + 66, 82, 240, 240, 35, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 0, 12, 32, 46, 17, + 0, 13, 50, 228, 35, 151, 181, 181, 179, 19, 162, 51, + 227, 243, 133, 19, 122, 99, 69, 67, 100, 67, 100, 51, + 131, 51, 131, 51, 131, 51, 131, 51, 131, 51, 115, 83, + 99, 84, 67, 121, 166, 0, 15, 96, 47, 17, 0, 19, + 83, 65, 133, 34, 130, 37, 114, 67, 240, 240, 163, 69, + 99, 24, 86, 51, 85, 83, 68, 99, 67, 115, 67, 115, + 67, 115, 67, 115, 67, 115, 67, 115, 67, 115, 67, 115, + 67, 115, 67, 115, 0, 15, 32, 42, 17, 0, 15, 19, + 243, 243, 243, 242, 240, 18, 0, 5, 102, 169, 115, 68, + 83, 99, 68, 100, 51, 131, 51, 131, 51, 131, 51, 131, + 51, 131, 51, 116, 67, 99, 84, 67, 121, 166, 0, 15, + 96, 41, 17, 0, 16, 3, 211, 211, 226, 226, 226, 0, + 6, 6, 169, 115, 68, 83, 99, 68, 100, 51, 131, 51, + 131, 51, 131, 51, 131, 51, 131, 51, 116, 67, 99, 84, + 67, 121, 166, 0, 15, 96, 44, 17, 0, 15, 68, 212, + 198, 163, 35, 131, 67, 99, 99, 240, 240, 198, 169, 115, + 68, 83, 99, 68, 100, 51, 131, 51, 131, 51, 131, 51, + 131, 51, 131, 51, 116, 67, 99, 84, 67, 121, 166, 0, + 15, 96, 40, 17, 0, 19, 68, 50, 122, 114, 52, 0, + 7, 86, 169, 115, 68, 83, 99, 68, 100, 51, 131, 51, + 131, 51, 131, 51, 131, 51, 131, 51, 116, 67, 99, 84, + 67, 121, 166, 0, 15, 96, 43, 17, 0, 19, 66, 66, + 132, 51, 116, 51, 130, 82, 240, 240, 214, 169, 115, 68, + 83, 99, 68, 100, 51, 131, 51, 131, 51, 131, 51, 131, + 51, 131, 51, 116, 67, 99, 84, 67, 121, 166, 0, 15, + 96, 20, 16, 0, 26, 82, 212, 196, 210, 240, 173, 61, + 240, 240, 162, 212, 196, 210, 0, 23, 16, 42, 17, 0, + 28, 114, 242, 151, 153, 115, 52, 99, 69, 68, 50, 20, + 51, 66, 35, 51, 50, 51, 51, 50, 51, 51, 34, 67, + 51, 34, 67, 54, 68, 69, 67, 84, 67, 121, 136, 130, + 0, 14, 64, 46, 17, 0, 15, 4, 228, 227, 243, 243, + 243, 240, 240, 195, 115, 67, 115, 67, 115, 67, 115, 67, + 115, 67, 115, 67, 115, 67, 115, 67, 115, 67, 115, 67, + 100, 67, 85, 83, 51, 18, 88, 34, 101, 67, 0, 15, + 32, 46, 17, 0, 15, 116, 211, 211, 211, 211, 211, 240, + 240, 227, 115, 67, 115, 67, 115, 67, 115, 67, 115, 67, + 115, 67, 115, 67, 115, 67, 115, 67, 115, 67, 100, 67, + 85, 83, 51, 18, 88, 34, 101, 67, 0, 15, 32, 50, + 17, 0, 15, 67, 213, 179, 19, 147, 51, 115, 83, 98, + 114, 240, 240, 147, 115, 67, 115, 67, 115, 67, 115, 67, + 115, 67, 115, 67, 115, 67, 115, 67, 115, 67, 115, 67, + 100, 67, 85, 83, 51, 18, 88, 34, 101, 67, 0, 15, + 32, 47, 17, 0, 19, 50, 66, 147, 51, 131, 51, 146, + 66, 240, 240, 163, 115, 67, 115, 67, 115, 67, 115, 67, + 115, 67, 115, 67, 115, 67, 115, 67, 115, 67, 115, 67, + 100, 67, 85, 83, 54, 88, 34, 101, 67, 0, 15, 32, + 48, 18, 0, 17, 3, 227, 227, 227, 227, 242, 0, 5, + 115, 131, 67, 131, 82, 115, 99, 99, 99, 98, 130, 83, + 131, 67, 146, 66, 163, 35, 163, 35, 178, 34, 198, 213, + 212, 228, 242, 240, 18, 243, 242, 162, 51, 167, 196, 208, + 49, 17, 0, 14, 115, 227, 227, 227, 227, 227, 227, 227, + 227, 53, 99, 24, 86, 52, 69, 83, 68, 115, 51, 131, + 51, 131, 51, 131, 51, 131, 51, 131, 51, 115, 67, 115, + 69, 67, 91, 99, 37, 115, 227, 227, 227, 227, 227, 227, + 224, 50, 18, 0, 20, 82, 82, 147, 67, 131, 67, 131, + 82, 240, 240, 195, 131, 67, 131, 82, 130, 99, 99, 99, + 99, 115, 82, 131, 67, 131, 67, 147, 50, 163, 35, 179, + 18, 195, 18, 198, 212, 228, 228, 227, 243, 227, 162, 36, + 167, 197, 192, +}; + +//***************************************************************************** +// +// The glyph offset table for the 30 point Sansand font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetSansand30[] = +{ + 0, 5, 32, 55, 98, 145, 209, 254, + 269, 304, 340, 366, 385, 399, 408, 419, + 453, 498, 529, 559, 593, 630, 661, 700, + 728, 771, 809, 826, 846, 867, 880, 900, + 929, 999, 1044, 1087, 1132, 1177, 1205, 1233, + 1278, 1326, 1354, 1383, 1430, 1458, 1534, 1594, + 1639, 1676, 1725, 1769, 1800, 1848, 1895, 1942, + 2021, 2068, 2115, 2148, 2182, 2213, 2247, 2273, + 2284, 2297, 2332, 2375, 2399, 2443, 2470, 2501, + 2543, 2588, 2614, 2648, 2691, 2721, 2772, 2809, + 2842, 2883, 2922, 2950, 2974, 3002, 3040, 3072, + 3128, 3160, 3200, 3222, 3257, 3290, 3326, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3341, 3346, 3371, 3412, 3441, 3481, 3521, 3551, + 3593, 3608, 3669, 3697, 3733, 3747, 3756, 3823, + 3831, 3850, 3874, 3895, 3918, 3930, 3974, 4021, + 4032, 4044, 4065, 4091, 4128, 4191, 4251, 4316, + 4345, 4403, 4461, 4519, 4575, 4629, 4687, 4739, + 4793, 4828, 4863, 4902, 4940, 4975, 5010, 5049, + 5086, 5131, 5198, 5256, 5314, 5372, 5424, 5479, + 5504, 5566, 5626, 5680, 5739, 5796, 5856, 5893, + 5945, 5988, 6031, 6078, 6120, 6165, 6211, 6251, + 6280, 6315, 6350, 6388, 6425, 6454, 6484, 6518, + 6550, 6596, 6643, 6685, 6726, 6770, 6810, 6853, + 6873, 6915, 6961, 7007, 7057, 7104, 7152, 7201, +}; + +//***************************************************************************** +// +// The font definition for the 30 point Sansand font. +// +//***************************************************************************** +const tFontEx g_sFontExSansand30 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 27, + + // + // The height of the font. + // + 37, + + // + // The baseline of the font. + // + 30, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetSansand30, + + // + // A pointer to the actual font data + // + g_pui8Sansand30Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanodidot14.c b/third_party/fonts/ofl/fonts/fonttheanodidot14.c new file mode 100644 index 0000000..d28c472 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanodidot14.c @@ -0,0 +1,519 @@ +//***************************************************************************** +// +// fonttheanodidot14.c - Font definition for the 14pt Theanodidot font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanodidot +// Size: 14 point +// Bold: no +// Italic: no +// Memory usage: 3800 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 14 point Theanodidot font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanodidot14Data[3598] = +{ + 5, 6, 0, 12, 96, 11, 3, 146, 18, 18, 18, 18, + 17, 130, 18, 208, 13, 5, 241, 33, 17, 33, 17, 33, + 17, 33, 0, 6, 48, 24, 8, 240, 193, 33, 65, 17, + 65, 33, 39, 49, 33, 65, 33, 39, 33, 33, 65, 33, + 65, 33, 240, 240, 80, 32, 8, 240, 165, 33, 17, 17, + 17, 17, 17, 17, 17, 19, 17, 68, 85, 49, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 34, 18, 67, 240, + 192, 31, 10, 240, 243, 65, 33, 33, 33, 49, 33, 17, + 65, 33, 17, 82, 17, 145, 33, 81, 33, 17, 65, 33, + 17, 49, 49, 17, 114, 240, 240, 192, 27, 11, 240, 240, + 99, 113, 33, 113, 17, 145, 132, 34, 33, 49, 33, 49, + 65, 17, 49, 66, 66, 65, 85, 19, 240, 240, 240, 8, + 2, 97, 17, 17, 17, 240, 96, 15, 3, 209, 33, 17, + 33, 33, 33, 33, 33, 33, 33, 49, 33, 64, 16, 4, + 240, 33, 49, 49, 65, 49, 49, 49, 49, 49, 33, 49, + 33, 112, 16, 8, 240, 193, 66, 17, 18, 51, 65, 17, + 17, 81, 113, 0, 8, 64, 14, 8, 0, 6, 49, 113, + 113, 71, 65, 113, 113, 240, 240, 96, 9, 3, 240, 240, + 98, 33, 17, 33, 80, 8, 5, 0, 6, 36, 240, 240, + 16, 7, 3, 240, 240, 50, 18, 208, 15, 4, 240, 49, + 49, 49, 33, 49, 49, 49, 33, 49, 49, 49, 176, 24, + 7, 240, 115, 49, 49, 33, 65, 17, 65, 17, 65, 17, + 65, 17, 65, 17, 65, 17, 49, 51, 240, 240, 16, 15, + 4, 225, 34, 17, 17, 49, 49, 49, 49, 49, 49, 49, + 240, 32, 21, 7, 240, 116, 33, 65, 17, 65, 17, 17, + 33, 34, 33, 81, 81, 81, 81, 49, 22, 240, 224, 20, + 7, 240, 115, 49, 49, 34, 33, 97, 66, 98, 113, 18, + 49, 17, 65, 18, 18, 240, 240, 18, 8, 240, 209, 113, + 97, 113, 97, 17, 65, 33, 55, 81, 113, 113, 240, 240, + 80, 20, 6, 240, 49, 33, 35, 49, 83, 49, 33, 97, + 81, 17, 49, 17, 33, 33, 17, 240, 192, 23, 7, 240, + 131, 49, 34, 17, 49, 33, 97, 19, 34, 49, 17, 65, + 17, 65, 17, 65, 33, 33, 240, 240, 17, 7, 240, 99, + 33, 21, 97, 81, 97, 97, 81, 97, 82, 81, 240, 240, + 48, 23, 7, 240, 116, 33, 65, 17, 65, 18, 33, 51, + 65, 18, 33, 50, 17, 65, 17, 65, 33, 33, 240, 240, + 23, 7, 240, 115, 49, 49, 33, 65, 17, 65, 17, 65, + 17, 65, 37, 81, 34, 33, 49, 17, 240, 240, 16, 8, + 3, 240, 98, 18, 114, 18, 208, 10, 3, 240, 98, 18, + 162, 33, 17, 33, 80, 14, 8, 0, 6, 82, 66, 66, + 81, 130, 130, 130, 240, 240, 48, 9, 8, 0, 8, 7, + 151, 0, 6, 16, 14, 8, 0, 6, 2, 130, 130, 129, + 82, 66, 66, 240, 240, 128, 14, 5, 243, 33, 33, 65, + 65, 65, 34, 49, 130, 50, 240, 128, 39, 12, 0, 6, + 83, 99, 50, 49, 113, 49, 36, 33, 17, 49, 33, 33, + 17, 33, 49, 33, 17, 33, 33, 49, 17, 33, 33, 33, + 33, 33, 17, 18, 65, 33, 145, 81, 101, 240, 16, 21, + 8, 240, 193, 113, 98, 81, 18, 65, 18, 65, 33, 69, + 33, 65, 33, 66, 98, 240, 240, 48, 23, 7, 240, 101, + 33, 65, 17, 65, 17, 65, 21, 33, 50, 17, 65, 17, + 65, 17, 65, 17, 49, 240, 240, 21, 9, 240, 245, 34, + 65, 17, 97, 17, 129, 129, 129, 129, 97, 33, 81, 50, + 19, 240, 240, 112, 25, 9, 240, 198, 49, 81, 33, 81, + 33, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, 81, + 33, 50, 240, 240, 144, 23, 8, 240, 151, 17, 81, 17, + 81, 17, 49, 53, 49, 49, 49, 49, 49, 113, 81, 17, + 66, 240, 240, 48, 22, 8, 240, 151, 17, 81, 17, 81, + 17, 49, 53, 49, 49, 49, 49, 49, 49, 49, 113, 240, + 240, 144, 23, 10, 240, 240, 53, 50, 65, 33, 97, 33, + 145, 145, 145, 68, 17, 97, 49, 81, 66, 34, 240, 240, + 192, 25, 8, 240, 146, 50, 17, 81, 17, 81, 17, 81, + 23, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 240, + 240, 48, 13, 2, 97, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 144, 16, 5, 240, 49, 65, 65, 65, 65, 65, + 65, 65, 18, 17, 34, 240, 112, 25, 8, 240, 145, 50, + 33, 49, 49, 33, 65, 17, 83, 81, 18, 65, 34, 49, + 49, 49, 50, 33, 66, 240, 240, 48, 20, 8, 240, 145, + 113, 113, 113, 113, 113, 113, 81, 17, 81, 17, 66, 17, + 51, 240, 240, 48, 37, 9, 240, 194, 81, 19, 50, 17, + 17, 33, 17, 17, 17, 33, 17, 17, 18, 17, 17, 17, + 18, 17, 17, 17, 34, 33, 17, 34, 33, 17, 34, 33, + 17, 97, 240, 240, 112, 31, 8, 240, 147, 49, 17, 17, + 49, 17, 18, 33, 17, 33, 33, 17, 34, 17, 17, 49, + 17, 17, 51, 17, 66, 17, 66, 17, 81, 240, 240, 48, + 26, 10, 240, 240, 51, 82, 50, 33, 97, 33, 113, 17, + 113, 17, 113, 17, 113, 17, 97, 49, 81, 66, 18, 240, + 240, 208, 20, 7, 240, 101, 33, 65, 17, 65, 17, 65, + 17, 65, 21, 33, 97, 97, 97, 240, 240, 64, 27, 10, + 240, 240, 36, 81, 66, 33, 97, 33, 113, 17, 113, 17, + 113, 17, 113, 17, 97, 49, 81, 66, 18, 113, 162, 162, + 176, 24, 8, 240, 149, 49, 65, 33, 65, 33, 65, 37, + 49, 50, 33, 65, 33, 65, 33, 65, 33, 66, 240, 240, + 48, 21, 8, 240, 180, 49, 49, 49, 114, 116, 99, 113, + 17, 81, 18, 65, 17, 17, 33, 240, 240, 64, 22, 11, + 240, 240, 58, 17, 49, 50, 17, 49, 65, 81, 65, 81, + 161, 161, 161, 161, 161, 0, 6, 32, 26, 8, 240, 145, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 33, 34, 240, 240, 64, 22, 9, + 240, 195, 65, 34, 65, 49, 49, 66, 33, 66, 33, 81, + 17, 99, 99, 113, 129, 240, 240, 160, 34, 14, 240, 240, + 195, 50, 65, 34, 65, 49, 50, 51, 33, 65, 33, 18, + 33, 66, 17, 33, 17, 82, 17, 35, 98, 51, 98, 66, + 98, 65, 209, 0, 7, 64, 23, 9, 240, 195, 50, 49, + 49, 66, 17, 98, 129, 130, 82, 17, 81, 34, 49, 66, + 33, 81, 240, 240, 112, 20, 8, 240, 146, 65, 33, 49, + 50, 17, 81, 17, 82, 113, 113, 113, 113, 113, 240, 240, + 96, 21, 9, 240, 199, 33, 66, 33, 50, 114, 98, 113, + 114, 98, 65, 34, 65, 18, 51, 240, 240, 112, 16, 4, + 194, 33, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 51, 15, 4, 240, 17, 49, 49, 49, 65, 49, 49, + 49, 65, 49, 49, 144, 16, 4, 210, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 19, 13, 7, 240, + 130, 65, 17, 49, 49, 33, 50, 97, 0, 8, 6, 8, + 0, 15, 7, 144, 8, 3, 145, 33, 49, 240, 240, 64, + 14, 5, 240, 240, 83, 33, 33, 65, 20, 17, 33, 20, + 240, 96, 21, 7, 240, 97, 97, 97, 97, 97, 19, 34, + 49, 17, 65, 17, 65, 17, 65, 18, 33, 240, 240, 14, + 6, 240, 240, 211, 33, 49, 17, 81, 81, 97, 17, 240, + 176, 21, 7, 240, 162, 97, 97, 97, 35, 17, 17, 50, + 17, 65, 17, 65, 17, 65, 33, 19, 240, 224, 14, 6, + 240, 240, 211, 33, 49, 21, 17, 81, 49, 35, 240, 176, + 16, 5, 240, 19, 17, 33, 17, 65, 65, 65, 65, 65, + 65, 65, 240, 144, 21, 8, 0, 7, 37, 33, 33, 65, + 33, 67, 65, 117, 65, 49, 33, 65, 33, 65, 49, 18, + 48, 21, 6, 240, 49, 81, 81, 81, 81, 18, 34, 33, + 17, 49, 17, 49, 17, 49, 17, 49, 240, 160, 11, 2, + 97, 17, 81, 17, 17, 17, 17, 17, 144, 16, 4, 225, + 49, 177, 49, 49, 49, 49, 49, 49, 49, 17, 17, 18, + 32, 20, 6, 240, 49, 81, 81, 81, 81, 33, 33, 17, + 51, 49, 18, 33, 33, 33, 49, 240, 160, 13, 2, 97, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 144, 25, 10, + 0, 8, 97, 18, 34, 34, 34, 33, 17, 49, 49, 17, + 49, 49, 17, 49, 49, 17, 49, 49, 240, 240, 176, 18, + 6, 240, 240, 193, 18, 34, 33, 17, 49, 17, 49, 17, + 49, 17, 49, 240, 160, 17, 7, 0, 6, 36, 33, 65, + 17, 65, 17, 65, 17, 65, 33, 33, 240, 240, 20, 7, + 0, 6, 17, 19, 34, 49, 17, 65, 17, 65, 17, 65, + 21, 33, 97, 97, 97, 96, 19, 7, 0, 6, 35, 17, + 17, 50, 17, 65, 17, 65, 17, 65, 37, 97, 97, 97, + 97, 13, 5, 240, 240, 84, 17, 33, 17, 65, 65, 65, + 240, 144, 14, 6, 240, 240, 211, 33, 98, 98, 17, 49, + 18, 17, 240, 176, 13, 4, 240, 81, 49, 50, 33, 49, + 49, 49, 51, 240, 32, 17, 6, 240, 240, 193, 49, 17, + 49, 17, 49, 17, 49, 17, 49, 36, 240, 160, 15, 6, + 240, 240, 193, 49, 33, 17, 49, 17, 51, 65, 81, 240, + 192, 22, 9, 0, 7, 113, 49, 81, 34, 17, 33, 17, + 17, 17, 33, 17, 18, 65, 34, 65, 240, 240, 192, 15, + 5, 240, 240, 81, 33, 17, 17, 49, 66, 33, 17, 81, + 240, 96, 19, 7, 0, 6, 33, 49, 49, 33, 49, 17, + 67, 81, 97, 97, 81, 65, 17, 66, 80, 14, 6, 240, + 240, 196, 66, 65, 66, 65, 33, 17, 49, 240, 160, 16, + 3, 161, 33, 33, 33, 33, 33, 17, 49, 33, 33, 33, + 33, 33, 64, 16, 2, 97, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 48, 16, 3, 145, 33, 33, + 33, 33, 33, 49, 17, 33, 33, 33, 33, 33, 80, 10, + 7, 0, 7, 34, 49, 50, 0, 6, 32, 5, 6, 0, + 12, 96, 11, 3, 240, 98, 18, 113, 34, 18, 18, 18, + 18, 19, 6, 240, 209, 65, 81, 51, 33, 17, 17, 17, + 17, 50, 66, 83, 33, 81, 81, 176, 23, 10, 240, 240, + 83, 97, 49, 65, 35, 65, 145, 117, 113, 145, 113, 17, + 49, 33, 17, 20, 240, 240, 192, 18, 7, 0, 6, 22, + 17, 49, 33, 65, 17, 65, 33, 33, 33, 18, 17, 240, + 224, 18, 6, 240, 49, 81, 49, 33, 17, 49, 17, 37, + 49, 53, 49, 81, 81, 240, 192, 13, 2, 97, 17, 17, + 17, 17, 113, 17, 17, 17, 17, 48, 26, 6, 240, 67, + 33, 49, 17, 34, 33, 67, 49, 33, 34, 33, 33, 33, + 34, 17, 65, 82, 18, 33, 17, 49, 35, 32, 8, 5, + 240, 81, 33, 0, 7, 80, 33, 12, 240, 240, 149, 97, + 81, 65, 20, 33, 33, 17, 113, 17, 17, 113, 17, 17, + 113, 17, 17, 49, 49, 33, 19, 49, 65, 81, 98, 18, + 0, 6, 64, 9, 5, 243, 65, 35, 36, 0, 6, 48, + 14, 5, 240, 240, 177, 17, 17, 17, 33, 17, 49, 17, + 240, 176, 10, 8, 0, 8, 7, 113, 113, 0, 6, 16, + 8, 5, 0, 6, 36, 240, 240, 16, 34, 12, 240, 240, + 149, 97, 81, 69, 49, 33, 33, 33, 49, 17, 35, 65, + 17, 33, 33, 49, 17, 33, 33, 49, 36, 18, 17, 65, + 81, 98, 18, 0, 6, 64, 6, 5, 240, 164, 0, 7, + 13, 6, 240, 67, 33, 49, 17, 49, 17, 49, 35, 0, + 7, 14, 8, 0, 6, 49, 113, 113, 71, 65, 113, 113, + 71, 240, 160, 13, 5, 243, 33, 33, 18, 17, 49, 49, + 67, 240, 240, 176, 12, 5, 244, 17, 17, 50, 81, 65, + 34, 240, 240, 192, 8, 3, 161, 33, 17, 240, 240, 80, + 21, 8, 0, 7, 1, 49, 49, 49, 49, 49, 49, 49, + 49, 34, 52, 18, 17, 113, 114, 98, 96, 29, 7, 240, + 117, 19, 17, 35, 17, 35, 17, 50, 17, 65, 17, 65, + 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, + 17, 144, 7, 3, 240, 146, 18, 240, 112, 9, 4, 0, + 7, 17, 33, 17, 33, 32, 13, 5, 240, 33, 65, 33, + 17, 65, 65, 51, 240, 240, 176, 14, 5, 240, 18, 33, + 33, 17, 33, 17, 33, 34, 0, 5, 112, 14, 5, 240, + 240, 161, 17, 49, 17, 33, 17, 17, 17, 240, 192, 28, + 10, 240, 240, 17, 81, 49, 65, 65, 49, 81, 49, 81, + 33, 33, 36, 49, 81, 33, 81, 50, 65, 51, 33, 81, + 240, 240, 192, 29, 10, 240, 240, 17, 145, 65, 65, 49, + 81, 49, 81, 33, 18, 36, 17, 33, 65, 18, 17, 49, + 65, 49, 81, 49, 67, 240, 240, 176, 31, 11, 240, 240, + 52, 49, 49, 17, 49, 82, 49, 113, 17, 129, 17, 17, + 66, 17, 33, 97, 33, 113, 33, 17, 65, 52, 49, 81, + 0, 5, 96, 16, 5, 240, 240, 114, 50, 145, 35, 17, + 33, 17, 65, 65, 33, 33, 17, 22, 8, 161, 240, 17, + 113, 98, 81, 18, 65, 18, 65, 33, 69, 33, 65, 33, + 66, 98, 240, 240, 48, 21, 8, 178, 225, 113, 98, 81, + 18, 65, 18, 65, 33, 69, 33, 65, 33, 66, 98, 240, + 240, 48, 24, 8, 49, 82, 17, 129, 81, 113, 98, 81, + 18, 65, 18, 65, 33, 69, 33, 65, 33, 66, 98, 240, + 240, 48, 21, 8, 148, 225, 113, 98, 81, 18, 65, 18, + 65, 33, 69, 33, 65, 33, 66, 98, 240, 240, 48, 22, + 8, 145, 33, 225, 113, 98, 81, 18, 65, 18, 65, 33, + 69, 33, 65, 33, 66, 98, 240, 240, 48, 24, 9, 50, + 97, 33, 98, 240, 18, 114, 97, 18, 81, 18, 65, 34, + 85, 49, 50, 33, 82, 114, 240, 240, 112, 32, 14, 0, + 5, 120, 81, 17, 81, 81, 17, 81, 65, 33, 49, 104, + 81, 49, 49, 65, 65, 49, 65, 65, 113, 81, 81, 17, + 81, 66, 0, 7, 16, 24, 9, 240, 245, 34, 65, 17, + 97, 17, 129, 129, 129, 129, 97, 33, 81, 50, 19, 81, + 129, 98, 17, 99, 48, 23, 8, 146, 215, 17, 81, 17, + 81, 17, 49, 53, 49, 49, 49, 49, 49, 113, 81, 17, + 66, 240, 240, 48, 23, 8, 162, 199, 17, 81, 17, 81, + 17, 49, 53, 49, 49, 49, 49, 49, 113, 81, 17, 66, + 240, 240, 48, 27, 8, 33, 97, 17, 65, 50, 39, 17, + 81, 17, 81, 17, 49, 53, 49, 49, 49, 49, 49, 113, + 81, 17, 66, 240, 240, 48, 24, 8, 145, 33, 183, 17, + 81, 17, 81, 17, 49, 53, 49, 49, 49, 49, 49, 113, + 81, 17, 66, 240, 240, 48, 14, 3, 49, 97, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 208, 14, 3, 65, 65, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 224, 18, 5, + 17, 49, 17, 81, 33, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 240, 128, 16, 5, 81, 33, 113, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 240, 128, 26, 10, 240, 240, + 22, 65, 81, 49, 81, 49, 97, 33, 97, 20, 65, 33, + 97, 33, 97, 33, 81, 49, 50, 240, 240, 208, 31, 8, + 164, 163, 49, 17, 17, 49, 17, 18, 33, 17, 33, 33, + 17, 34, 17, 17, 49, 17, 17, 51, 17, 66, 17, 66, + 17, 81, 240, 240, 48, 27, 10, 49, 161, 240, 51, 82, + 50, 33, 97, 33, 113, 17, 113, 17, 113, 17, 113, 17, + 97, 49, 81, 66, 18, 240, 240, 208, 27, 10, 81, 129, + 240, 51, 82, 50, 33, 97, 33, 113, 17, 113, 17, 113, + 17, 113, 17, 97, 49, 81, 66, 18, 240, 240, 208, 28, + 10, 66, 98, 18, 145, 99, 82, 50, 33, 97, 33, 113, + 17, 113, 17, 113, 17, 113, 17, 97, 49, 81, 66, 18, + 240, 240, 208, 26, 10, 197, 240, 19, 82, 50, 33, 97, + 33, 113, 17, 113, 17, 113, 17, 113, 17, 97, 49, 81, + 66, 18, 240, 240, 208, 27, 10, 194, 33, 240, 19, 82, + 50, 33, 97, 33, 113, 17, 113, 17, 113, 17, 113, 17, + 97, 49, 81, 66, 18, 240, 240, 208, 16, 7, 0, 6, + 17, 65, 33, 33, 66, 65, 17, 49, 49, 240, 240, 112, + 32, 10, 240, 240, 52, 17, 34, 65, 33, 98, 17, 66, + 17, 17, 49, 49, 17, 33, 65, 17, 17, 81, 18, 81, + 49, 81, 33, 18, 18, 240, 240, 208, 27, 8, 18, 129, + 193, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 17, 81, 33, 34, 240, 240, 64, 27, + 8, 65, 97, 193, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 33, 34, 240, + 240, 64, 30, 8, 49, 82, 17, 65, 49, 33, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 33, 34, 240, 240, 64, 27, 8, 146, 33, + 161, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 17, 81, 33, 34, 240, 240, 64, 20, + 8, 193, 178, 65, 33, 49, 50, 17, 81, 17, 83, 97, + 113, 113, 113, 113, 240, 240, 96, 22, 8, 240, 161, 113, + 101, 65, 49, 49, 65, 33, 65, 33, 65, 33, 65, 37, + 49, 113, 113, 99, 208, 24, 6, 240, 67, 33, 49, 17, + 49, 17, 33, 33, 17, 49, 33, 33, 49, 17, 49, 19, + 17, 18, 17, 240, 176, 16, 5, 240, 17, 65, 81, 115, + 33, 33, 65, 20, 17, 33, 20, 240, 96, 16, 5, 240, + 33, 65, 49, 131, 33, 33, 65, 20, 17, 33, 20, 240, + 96, 16, 5, 240, 33, 35, 81, 99, 33, 33, 65, 20, + 17, 33, 20, 240, 96, 15, 5, 240, 97, 81, 115, 33, + 33, 65, 20, 17, 33, 20, 240, 96, 15, 5, 240, 81, + 33, 179, 33, 33, 65, 20, 17, 33, 20, 240, 96, 16, + 5, 244, 17, 33, 34, 115, 33, 33, 65, 20, 17, 33, + 20, 240, 96, 18, 9, 0, 8, 7, 17, 34, 33, 69, + 21, 65, 34, 67, 18, 17, 240, 240, 112, 17, 6, 240, + 240, 211, 33, 49, 17, 81, 81, 97, 17, 65, 65, 17, + 65, 144, 16, 6, 240, 65, 97, 240, 19, 33, 49, 21, + 17, 81, 49, 35, 240, 176, 16, 6, 240, 97, 65, 65, + 179, 33, 49, 21, 17, 81, 49, 35, 240, 176, 17, 6, + 240, 81, 65, 17, 82, 131, 33, 49, 21, 17, 81, 49, + 35, 240, 176, 15, 6, 240, 146, 17, 243, 33, 49, 21, + 17, 81, 49, 35, 240, 176, 12, 3, 145, 49, 33, 81, + 33, 33, 33, 33, 33, 208, 13, 4, 225, 33, 33, 129, + 49, 49, 49, 49, 49, 240, 48, 14, 4, 209, 33, 17, + 49, 97, 49, 49, 49, 49, 49, 240, 48, 13, 5, 240, + 81, 33, 209, 65, 65, 65, 65, 65, 240, 112, 22, 7, + 240, 114, 17, 66, 65, 18, 97, 53, 17, 65, 17, 65, + 17, 65, 17, 65, 33, 33, 240, 240, 20, 6, 240, 161, + 65, 18, 129, 18, 34, 33, 17, 49, 17, 49, 17, 49, + 17, 49, 240, 160, 19, 7, 240, 129, 97, 113, 180, 33, + 65, 17, 65, 17, 65, 17, 65, 33, 33, 240, 240, 19, + 7, 240, 145, 97, 81, 196, 33, 65, 17, 65, 17, 65, + 17, 65, 33, 33, 240, 240, 20, 7, 240, 130, 65, 18, + 97, 164, 33, 65, 17, 65, 17, 65, 17, 65, 33, 33, + 240, 240, 19, 7, 240, 226, 65, 34, 164, 33, 65, 17, + 65, 17, 65, 17, 65, 33, 33, 240, 240, 19, 7, 240, + 225, 18, 240, 36, 33, 65, 17, 65, 17, 65, 17, 65, + 33, 33, 240, 240, 12, 9, 0, 8, 34, 114, 216, 66, + 114, 240, 240, 160, 20, 7, 0, 6, 37, 17, 50, 17, + 33, 17, 17, 17, 33, 18, 49, 18, 33, 66, 240, 144, + 19, 6, 240, 65, 97, 81, 145, 49, 17, 49, 17, 49, + 17, 49, 17, 49, 36, 240, 160, 19, 6, 240, 81, 81, + 65, 161, 49, 17, 49, 17, 49, 17, 49, 17, 49, 36, + 240, 160, 20, 6, 240, 81, 50, 17, 81, 129, 49, 17, + 49, 17, 49, 17, 49, 17, 49, 36, 240, 160, 18, 6, + 240, 161, 18, 209, 49, 17, 49, 17, 49, 17, 49, 17, + 49, 36, 240, 160, 21, 7, 240, 161, 97, 81, 177, 49, + 49, 33, 49, 17, 67, 81, 97, 97, 81, 65, 17, 66, + 80, 24, 7, 240, 98, 81, 97, 97, 101, 33, 65, 17, + 65, 17, 65, 17, 65, 18, 33, 33, 18, 49, 97, 97, + 96, 21, 7, 240, 241, 33, 240, 17, 49, 49, 33, 49, + 17, 67, 81, 97, 97, 81, 65, 17, 66, 80, +}; + +//***************************************************************************** +// +// The glyph offset table for the 14 point Theanodidot font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanodidot14[] = +{ + 0, 5, 16, 29, 53, 85, 116, 143, + 151, 166, 182, 198, 212, 221, 229, 236, + 251, 275, 290, 311, 331, 349, 369, 392, + 409, 432, 455, 463, 473, 487, 496, 510, + 524, 563, 584, 607, 628, 653, 676, 698, + 721, 746, 759, 775, 800, 820, 857, 888, + 914, 934, 961, 985, 1006, 1028, 1054, 1076, + 1110, 1133, 1153, 1174, 1190, 1205, 1221, 1234, + 1240, 1248, 1262, 1283, 1297, 1318, 1332, 1348, + 1369, 1390, 1401, 1417, 1437, 1450, 1475, 1493, + 1510, 1530, 1549, 1562, 1576, 1589, 1606, 1621, + 1643, 1658, 1677, 1691, 1707, 1723, 1739, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1749, 1754, 1765, 1784, 1807, 1825, 1843, 1856, + 1882, 1890, 1923, 1932, 1946, 1956, 1964, 1998, + 2004, 2017, 2031, 2044, 2056, 2064, 2085, 2114, + 2121, 2130, 2143, 2157, 2171, 2199, 2228, 2259, + 2275, 2297, 2318, 2342, 2363, 2385, 2409, 2441, + 2465, 2488, 2511, 2538, 2562, 2576, 2590, 2608, + 2624, 2650, 2681, 2708, 2735, 2763, 2789, 2816, + 2832, 2864, 2891, 2918, 2948, 2975, 2995, 3017, + 3041, 3057, 3073, 3089, 3104, 3119, 3135, 3153, + 3170, 3186, 3202, 3219, 3234, 3246, 3259, 3273, + 3286, 3308, 3328, 3347, 3366, 3386, 3405, 3424, + 3436, 3456, 3475, 3494, 3514, 3532, 3553, 3577, +}; + +//***************************************************************************** +// +// The font definition for the 14 point Theanodidot font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanodidot14 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 12, + + // + // The height of the font. + // + 17, + + // + // The baseline of the font. + // + 13, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanodidot14, + + // + // A pointer to the actual font data + // + g_pui8Theanodidot14Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanodidot16.c b/third_party/fonts/ofl/fonts/fonttheanodidot16.c new file mode 100644 index 0000000..8c8c483 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanodidot16.c @@ -0,0 +1,565 @@ +//***************************************************************************** +// +// fonttheanodidot16.c - Font definition for the 16pt Theanodidot font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanodidot +// Size: 16 point +// Bold: no +// Italic: no +// Memory usage: 4352 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 16 point Theanodidot font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanodidot16Data[4150] = +{ + 4, 6, 0, 15, 14, 3, 146, 18, 18, 18, 18, 17, + 33, 33, 130, 18, 240, 16, 15, 5, 241, 33, 17, 33, + 17, 33, 17, 33, 17, 33, 0, 7, 80, 25, 10, 0, + 5, 113, 81, 33, 97, 33, 57, 49, 49, 81, 49, 81, + 33, 73, 49, 33, 81, 49, 81, 0, 7, 32, 37, 9, + 240, 225, 17, 85, 49, 17, 17, 18, 17, 17, 17, 18, + 17, 17, 17, 69, 101, 65, 20, 34, 17, 33, 19, 17, + 33, 17, 17, 17, 17, 50, 18, 83, 240, 240, 160, 39, + 12, 240, 240, 114, 81, 49, 33, 49, 65, 33, 49, 65, + 33, 33, 81, 33, 33, 98, 33, 161, 49, 113, 18, 17, + 81, 33, 49, 65, 33, 49, 49, 49, 49, 129, 17, 0, + 7, 96, 31, 13, 240, 240, 211, 145, 33, 145, 33, 147, + 162, 161, 18, 35, 34, 49, 33, 65, 66, 17, 65, 83, + 65, 82, 97, 82, 101, 20, 0, 8, 32, 9, 2, 97, + 17, 17, 17, 17, 240, 160, 19, 4, 225, 33, 49, 49, + 33, 49, 49, 49, 49, 49, 49, 49, 49, 65, 49, 65, + 80, 19, 4, 193, 49, 65, 49, 49, 65, 49, 49, 49, + 49, 49, 49, 33, 49, 33, 49, 112, 19, 8, 240, 193, + 113, 66, 17, 18, 51, 65, 17, 17, 33, 33, 33, 65, + 0, 10, 64, 15, 10, 0, 9, 33, 145, 145, 89, 81, + 145, 145, 145, 0, 6, 112, 10, 3, 240, 240, 145, 34, + 33, 17, 33, 128, 8, 6, 0, 8, 37, 0, 6, 16, + 8, 3, 240, 240, 146, 18, 240, 16, 19, 5, 240, 129, + 65, 49, 65, 65, 65, 49, 65, 65, 65, 65, 49, 65, + 65, 65, 144, 28, 8, 240, 240, 67, 65, 49, 33, 65, + 33, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 65, + 49, 49, 65, 17, 240, 240, 208, 17, 4, 240, 49, 34, + 17, 17, 49, 49, 49, 49, 49, 49, 49, 49, 240, 96, + 22, 7, 240, 228, 33, 65, 17, 65, 17, 65, 19, 33, + 81, 97, 81, 81, 81, 49, 22, 240, 240, 96, 25, 8, + 240, 240, 67, 65, 49, 50, 33, 113, 97, 82, 17, 129, + 33, 65, 18, 65, 17, 81, 34, 18, 240, 240, 192, 21, + 8, 240, 209, 98, 98, 97, 113, 97, 17, 65, 33, 49, + 49, 55, 81, 113, 113, 240, 240, 208, 24, 8, 240, 240, + 49, 33, 67, 65, 113, 19, 65, 49, 129, 113, 113, 18, + 65, 17, 65, 49, 33, 240, 240, 208, 27, 8, 240, 240, + 68, 49, 50, 17, 65, 33, 113, 20, 34, 65, 17, 81, + 17, 81, 17, 81, 33, 49, 65, 17, 240, 240, 208, 19, + 8, 240, 240, 35, 49, 22, 113, 97, 113, 97, 113, 98, + 97, 98, 98, 240, 240, 240, 27, 8, 240, 240, 68, 34, + 65, 17, 81, 17, 81, 35, 17, 68, 49, 35, 17, 81, + 17, 81, 17, 65, 50, 17, 240, 240, 208, 27, 8, 240, + 240, 67, 50, 49, 33, 81, 17, 81, 17, 81, 18, 50, + 51, 17, 113, 33, 49, 34, 49, 49, 33, 240, 240, 208, + 9, 3, 240, 146, 18, 162, 18, 240, 16, 11, 3, 240, + 146, 18, 161, 34, 33, 33, 17, 128, 15, 9, 0, 8, + 82, 82, 82, 82, 114, 146, 146, 146, 0, 5, 96, 9, + 10, 0, 12, 73, 185, 0, 8, 112, 15, 9, 0, 7, + 114, 146, 146, 146, 114, 82, 82, 82, 0, 6, 64, 18, + 6, 240, 67, 33, 33, 97, 81, 81, 81, 35, 49, 81, + 162, 66, 240, 240, 64, 43, 14, 0, 9, 52, 130, 66, + 81, 129, 49, 50, 17, 49, 17, 49, 34, 49, 17, 33, + 50, 49, 17, 33, 50, 49, 17, 33, 49, 65, 17, 33, + 34, 49, 49, 34, 20, 65, 226, 97, 118, 240, 240, 32, + 26, 9, 240, 240, 146, 114, 97, 17, 97, 18, 81, 18, + 65, 50, 54, 49, 50, 33, 82, 17, 82, 17, 82, 0, + 5, 96, 27, 10, 240, 240, 167, 65, 81, 49, 81, 49, + 81, 54, 65, 66, 49, 82, 33, 82, 33, 82, 33, 81, + 49, 50, 0, 6, 80, 24, 11, 0, 5, 119, 49, 82, + 34, 97, 18, 113, 18, 146, 146, 146, 113, 33, 113, 49, + 82, 66, 20, 0, 7, 28, 11, 240, 240, 231, 81, 81, + 65, 82, 49, 98, 33, 98, 33, 98, 33, 98, 33, 98, + 33, 97, 49, 82, 49, 50, 0, 7, 48, 27, 10, 240, + 240, 169, 33, 82, 33, 97, 33, 49, 81, 49, 85, 81, + 49, 81, 49, 81, 97, 33, 97, 33, 67, 0, 6, 48, + 25, 10, 240, 240, 169, 33, 82, 33, 97, 33, 49, 33, + 33, 49, 85, 81, 49, 81, 49, 81, 145, 145, 0, 7, + 32, 24, 12, 0, 6, 54, 81, 81, 65, 97, 50, 162, + 162, 162, 69, 18, 97, 65, 97, 81, 81, 98, 18, 0, + 8, 28, 10, 240, 240, 163, 51, 33, 81, 49, 81, 49, + 81, 49, 81, 55, 49, 81, 49, 81, 49, 81, 49, 81, + 49, 81, 0, 6, 64, 16, 4, 240, 19, 33, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 240, 112, 19, 6, 240, + 179, 65, 81, 81, 81, 81, 81, 81, 49, 17, 34, 17, + 35, 240, 240, 48, 28, 10, 240, 240, 163, 50, 49, 49, + 81, 33, 97, 17, 113, 17, 116, 97, 34, 81, 50, 65, + 50, 65, 66, 49, 82, 0, 6, 48, 22, 10, 240, 240, + 163, 129, 145, 145, 145, 145, 145, 145, 97, 33, 97, 33, + 82, 33, 52, 0, 6, 48, 42, 12, 0, 6, 4, 82, + 35, 66, 49, 17, 49, 17, 49, 18, 33, 17, 49, 18, + 33, 17, 49, 33, 17, 33, 49, 35, 33, 49, 35, 33, + 49, 35, 33, 49, 49, 49, 49, 49, 49, 0, 7, 96, + 35, 11, 240, 240, 228, 66, 33, 17, 65, 49, 18, 49, + 49, 34, 33, 49, 34, 33, 49, 50, 17, 49, 50, 17, + 49, 67, 49, 82, 49, 82, 49, 97, 0, 7, 16, 27, + 12, 0, 6, 53, 97, 81, 65, 98, 34, 114, 18, 114, + 18, 114, 18, 114, 18, 114, 33, 113, 65, 81, 98, 18, + 0, 8, 23, 10, 240, 240, 167, 65, 66, 49, 82, 33, + 82, 33, 82, 33, 81, 54, 65, 145, 145, 145, 0, 7, + 32, 30, 13, 0, 6, 117, 113, 81, 81, 98, 50, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 49, 113, 66, 81, + 114, 18, 161, 195, 179, 196, 224, 27, 9, 240, 240, 102, + 65, 65, 49, 65, 49, 65, 53, 65, 50, 49, 65, 49, + 65, 49, 65, 49, 65, 49, 81, 0, 5, 96, 23, 9, + 240, 240, 133, 49, 65, 49, 130, 116, 116, 130, 17, 97, + 17, 97, 18, 65, 33, 18, 17, 0, 6, 25, 12, 0, + 6, 11, 18, 49, 65, 17, 65, 65, 17, 65, 65, 17, + 65, 177, 177, 177, 177, 177, 177, 0, 8, 32, 29, 11, + 240, 240, 227, 67, 33, 97, 49, 97, 49, 97, 49, 97, + 49, 97, 49, 97, 49, 97, 49, 97, 49, 82, 66, 18, + 0, 7, 48, 25, 10, 240, 240, 163, 66, 18, 81, 50, + 49, 66, 49, 81, 49, 82, 17, 98, 17, 115, 114, 130, + 145, 0, 6, 112, 39, 15, 0, 7, 66, 67, 50, 18, + 81, 65, 49, 82, 49, 50, 51, 49, 50, 33, 33, 33, + 81, 33, 34, 17, 82, 17, 34, 17, 83, 66, 114, 66, + 114, 66, 113, 97, 0, 9, 112, 25, 10, 240, 240, 163, + 50, 50, 49, 82, 17, 99, 130, 145, 116, 97, 34, 65, + 50, 65, 66, 33, 98, 0, 6, 48, 23, 9, 240, 240, + 99, 65, 34, 49, 65, 49, 66, 17, 97, 17, 98, 129, + 129, 129, 129, 129, 0, 6, 16, 23, 10, 240, 240, 168, + 33, 82, 33, 66, 115, 114, 114, 130, 114, 114, 81, 34, + 81, 18, 67, 0, 6, 48, 19, 4, 194, 33, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 51, + 80, 19, 5, 240, 81, 65, 65, 65, 81, 65, 65, 65, + 65, 81, 65, 65, 65, 81, 65, 96, 19, 4, 210, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 19, 80, 18, 10, 240, 240, 65, 129, 17, 97, 34, + 65, 65, 65, 81, 33, 98, 0, 13, 112, 7, 9, 0, + 19, 24, 240, 64, 8, 3, 193, 49, 33, 240, 240, 160, + 17, 7, 0, 7, 19, 49, 49, 97, 67, 34, 33, 33, + 49, 38, 240, 240, 96, 24, 7, 240, 97, 97, 97, 97, + 97, 97, 19, 34, 49, 17, 65, 17, 65, 17, 65, 17, + 65, 21, 240, 240, 112, 19, 7, 0, 7, 35, 34, 33, + 33, 49, 33, 97, 65, 17, 49, 50, 17, 240, 240, 112, + 24, 7, 240, 162, 97, 97, 97, 97, 35, 17, 17, 50, + 17, 65, 17, 65, 17, 65, 17, 65, 37, 240, 240, 96, + 16, 7, 0, 7, 20, 33, 65, 22, 17, 97, 98, 49, + 36, 240, 240, 112, 19, 6, 240, 67, 33, 34, 17, 81, + 81, 82, 65, 81, 81, 81, 81, 81, 240, 240, 80, 24, + 8, 0, 8, 35, 17, 33, 49, 49, 49, 49, 49, 52, + 49, 113, 118, 49, 50, 17, 81, 17, 81, 37, 32, 25, + 7, 240, 97, 97, 97, 97, 97, 97, 19, 34, 49, 17, + 65, 17, 65, 17, 65, 17, 65, 17, 65, 240, 240, 96, + 13, 3, 146, 18, 161, 33, 33, 33, 33, 33, 33, 240, + 32, 22, 5, 240, 34, 50, 240, 50, 65, 65, 65, 65, + 65, 65, 65, 65, 17, 33, 17, 33, 17, 17, 32, 23, + 7, 240, 97, 97, 97, 97, 97, 97, 97, 33, 49, 17, + 67, 65, 18, 49, 34, 33, 50, 240, 240, 96, 15, 2, + 97, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 176, 28, 10, 0, 10, 1, 18, 34, 34, 34, 33, 17, + 49, 49, 17, 49, 49, 17, 49, 49, 17, 49, 49, 17, + 49, 49, 0, 6, 48, 21, 7, 0, 7, 1, 19, 34, + 49, 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, 240, + 240, 96, 20, 7, 0, 7, 20, 33, 49, 33, 65, 17, + 65, 17, 65, 17, 65, 33, 33, 240, 240, 112, 24, 8, + 0, 8, 2, 19, 50, 49, 33, 65, 33, 65, 33, 65, + 34, 49, 33, 19, 49, 113, 113, 113, 113, 96, 24, 8, + 0, 8, 19, 18, 17, 50, 33, 65, 33, 65, 33, 65, + 33, 50, 51, 17, 113, 113, 113, 113, 113, 32, 15, 5, + 240, 240, 161, 18, 18, 17, 17, 65, 65, 65, 65, 240, + 224, 16, 6, 0, 6, 19, 33, 82, 83, 82, 17, 49, + 18, 17, 240, 240, 32, 14, 4, 240, 145, 49, 50, 33, + 49, 49, 49, 49, 51, 240, 96, 21, 7, 0, 7, 1, + 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, 50, 35, + 17, 240, 240, 96, 16, 7, 0, 7, 2, 49, 33, 33, + 49, 33, 51, 82, 82, 240, 240, 240, 25, 11, 0, 11, + 2, 49, 49, 33, 49, 33, 49, 35, 17, 51, 33, 17, + 66, 34, 82, 34, 81, 65, 0, 7, 32, 17, 6, 0, + 6, 1, 49, 18, 17, 50, 81, 67, 33, 33, 97, 240, + 240, 16, 22, 8, 0, 8, 18, 49, 49, 33, 66, 17, + 81, 17, 82, 98, 113, 97, 113, 113, 65, 17, 83, 80, + 16, 7, 0, 7, 5, 82, 66, 81, 82, 81, 49, 18, + 34, 240, 240, 96, 18, 4, 240, 49, 33, 49, 50, 49, + 49, 49, 18, 50, 49, 49, 34, 33, 49, 129, 18, 2, + 129, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 48, 19, 4, 240, 17, 65, 49, 34, 33, + 49, 49, 66, 18, 33, 49, 50, 49, 49, 33, 112, 11, + 8, 0, 10, 19, 33, 17, 35, 0, 8, 32, 4, 6, + 0, 15, 13, 3, 240, 146, 18, 113, 33, 33, 34, 18, + 18, 18, 18, 25, 7, 240, 240, 145, 97, 81, 68, 33, + 34, 33, 17, 17, 33, 17, 66, 49, 18, 33, 52, 33, + 97, 97, 240, 80, 27, 11, 0, 6, 20, 98, 17, 17, + 66, 34, 82, 146, 118, 129, 161, 114, 17, 49, 33, 35, + 18, 33, 17, 35, 0, 7, 32, 21, 7, 0, 7, 1, + 18, 17, 18, 33, 33, 65, 17, 65, 33, 33, 33, 18, + 17, 240, 240, 208, 21, 8, 240, 240, 34, 113, 49, 50, + 17, 81, 17, 82, 71, 65, 71, 65, 113, 113, 240, 240, + 224, 15, 2, 129, 17, 17, 17, 17, 17, 113, 17, 17, + 17, 17, 17, 48, 30, 7, 240, 228, 33, 65, 17, 50, + 18, 98, 65, 18, 49, 34, 34, 34, 34, 33, 50, 17, + 66, 98, 18, 49, 18, 49, 17, 49, 51, 48, 8, 5, + 240, 161, 33, 0, 8, 112, 39, 13, 240, 240, 212, 114, + 66, 65, 65, 49, 49, 19, 17, 33, 33, 33, 113, 17, + 33, 113, 17, 33, 113, 17, 33, 113, 33, 33, 33, 33, + 49, 50, 49, 65, 97, 102, 0, 8, 80, 10, 5, 240, + 83, 65, 35, 36, 0, 7, 80, 16, 5, 0, 5, 97, + 49, 17, 33, 17, 33, 17, 49, 17, 240, 240, 16, 10, + 9, 0, 10, 24, 129, 129, 129, 0, 8, 8, 6, 0, + 8, 37, 0, 6, 16, 43, 13, 240, 240, 212, 114, 66, + 65, 20, 49, 49, 33, 33, 33, 33, 49, 33, 49, 17, + 51, 65, 17, 49, 33, 49, 17, 49, 33, 49, 33, 33, + 33, 33, 49, 19, 33, 17, 65, 97, 102, 0, 8, 80, + 7, 6, 240, 245, 0, 10, 80, 15, 7, 240, 116, 33, + 65, 17, 65, 17, 65, 18, 34, 50, 0, 10, 16, 10, + 0, 8, 1, 145, 145, 145, 89, 81, 145, 145, 249, 240, + 240, 176, 14, 5, 240, 83, 33, 33, 18, 17, 49, 49, + 67, 0, 6, 48, 13, 5, 240, 84, 49, 50, 81, 17, + 33, 34, 0, 6, 64, 8, 3, 209, 17, 33, 240, 240, + 176, 25, 9, 0, 9, 2, 49, 50, 49, 50, 49, 50, + 49, 49, 65, 50, 36, 17, 19, 33, 17, 129, 129, 130, + 114, 112, 34, 8, 240, 240, 54, 19, 17, 51, 17, 51, + 17, 51, 17, 66, 17, 81, 17, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 176, + 7, 3, 240, 194, 18, 240, 208, 9, 4, 0, 8, 18, + 17, 17, 33, 96, 13, 5, 240, 113, 65, 33, 17, 65, + 65, 51, 0, 6, 48, 14, 5, 240, 98, 33, 33, 17, + 33, 17, 33, 34, 0, 7, 16, 16, 5, 0, 5, 113, + 49, 17, 33, 17, 33, 17, 17, 17, 240, 240, 32, 34, + 11, 240, 240, 161, 65, 65, 81, 65, 81, 49, 97, 49, + 97, 33, 33, 51, 17, 33, 97, 49, 81, 49, 17, 65, + 49, 17, 49, 68, 33, 97, 0, 7, 16, 33, 11, 240, + 240, 241, 81, 50, 65, 81, 65, 81, 49, 97, 33, 34, + 35, 17, 17, 33, 65, 33, 33, 65, 34, 17, 49, 81, + 49, 81, 65, 83, 0, 7, 35, 12, 240, 240, 225, 51, + 65, 81, 81, 82, 49, 129, 33, 81, 33, 17, 33, 66, + 17, 49, 113, 49, 97, 49, 17, 81, 49, 17, 65, 68, + 49, 97, 0, 7, 96, 17, 6, 0, 6, 50, 66, 161, + 81, 51, 33, 81, 81, 81, 81, 49, 35, 32, 26, 10, + 33, 161, 161, 145, 145, 130, 131, 97, 18, 97, 34, 81, + 34, 85, 65, 66, 49, 66, 33, 82, 146, 0, 6, 48, + 25, 9, 209, 113, 129, 129, 130, 99, 97, 18, 65, 34, + 65, 34, 70, 33, 66, 33, 66, 33, 82, 114, 0, 5, + 96, 27, 9, 65, 100, 129, 242, 114, 97, 17, 97, 18, + 81, 18, 65, 50, 54, 49, 50, 33, 82, 17, 82, 17, + 82, 0, 5, 96, 28, 9, 178, 33, 49, 34, 242, 114, + 97, 17, 97, 18, 81, 18, 65, 50, 54, 49, 50, 33, + 82, 17, 82, 17, 82, 0, 5, 96, 27, 9, 162, 34, + 240, 130, 114, 97, 17, 97, 18, 81, 18, 65, 50, 54, + 49, 50, 33, 82, 17, 82, 17, 82, 0, 5, 96, 29, + 9, 50, 97, 33, 98, 240, 18, 114, 97, 17, 97, 18, + 81, 18, 65, 34, 85, 49, 50, 33, 67, 17, 82, 17, + 82, 0, 5, 96, 36, 16, 0, 8, 105, 97, 17, 82, + 97, 17, 97, 81, 33, 49, 129, 33, 49, 121, 97, 65, + 49, 97, 65, 49, 81, 81, 97, 17, 97, 97, 17, 97, + 67, 0, 10, 16, 30, 11, 0, 5, 119, 49, 82, 33, + 113, 18, 113, 18, 146, 146, 146, 113, 33, 113, 49, 82, + 66, 20, 97, 161, 145, 17, 114, 17, 130, 80, 27, 10, + 194, 161, 249, 33, 82, 33, 97, 33, 49, 81, 49, 85, + 81, 49, 81, 49, 81, 97, 33, 97, 33, 67, 0, 6, + 48, 28, 10, 226, 113, 240, 25, 33, 82, 33, 97, 33, + 49, 81, 49, 85, 81, 49, 81, 49, 81, 97, 33, 97, + 33, 67, 0, 6, 48, 28, 10, 65, 116, 146, 217, 33, + 82, 33, 97, 33, 49, 81, 49, 85, 81, 49, 81, 49, + 81, 97, 33, 97, 33, 67, 0, 6, 48, 28, 10, 177, + 49, 240, 153, 33, 82, 33, 97, 33, 49, 81, 49, 85, + 81, 49, 81, 49, 81, 97, 33, 97, 33, 67, 0, 6, + 48, 17, 4, 65, 65, 114, 33, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 240, 112, 17, 5, 114, 33, 131, 49, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 240, 208, 19, + 5, 17, 49, 17, 66, 99, 49, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 240, 208, 18, 6, 97, 49, 227, 65, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 240, 240, 48, + 27, 12, 0, 6, 23, 97, 81, 81, 82, 65, 98, 49, + 98, 21, 66, 49, 98, 49, 98, 49, 97, 65, 82, 65, + 50, 0, 8, 35, 11, 229, 240, 164, 66, 33, 17, 65, + 49, 18, 49, 49, 34, 33, 49, 34, 33, 49, 50, 17, + 49, 50, 17, 49, 67, 49, 82, 49, 82, 49, 97, 0, + 7, 16, 29, 12, 50, 177, 193, 240, 101, 97, 81, 65, + 98, 34, 114, 18, 114, 18, 114, 18, 114, 18, 114, 33, + 113, 65, 81, 98, 18, 0, 8, 29, 12, 98, 161, 161, + 240, 101, 97, 81, 65, 98, 34, 114, 18, 114, 18, 114, + 18, 114, 18, 114, 33, 113, 65, 81, 98, 18, 0, 8, + 30, 12, 82, 130, 18, 177, 240, 69, 97, 81, 65, 98, + 34, 114, 18, 114, 18, 114, 18, 114, 18, 114, 33, 113, + 65, 81, 98, 18, 0, 8, 28, 12, 245, 240, 240, 21, + 97, 81, 65, 98, 34, 114, 18, 114, 18, 114, 18, 114, + 18, 114, 33, 113, 65, 81, 98, 18, 0, 8, 29, 12, + 241, 49, 240, 240, 21, 97, 81, 65, 98, 34, 114, 18, + 114, 18, 114, 18, 114, 18, 114, 33, 113, 65, 81, 98, + 18, 0, 8, 17, 8, 0, 8, 1, 66, 33, 34, 67, + 83, 66, 17, 50, 50, 0, 6, 16, 34, 12, 0, 6, + 53, 33, 49, 82, 49, 98, 34, 81, 18, 18, 65, 34, + 18, 49, 50, 18, 33, 66, 18, 17, 82, 34, 82, 50, + 81, 49, 34, 18, 0, 8, 31, 11, 34, 162, 177, 240, + 19, 67, 33, 97, 49, 97, 49, 97, 49, 97, 49, 97, + 49, 97, 49, 97, 49, 97, 49, 82, 66, 18, 0, 7, + 48, 31, 11, 97, 146, 129, 240, 35, 67, 33, 97, 49, + 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, + 97, 49, 82, 66, 18, 0, 7, 48, 32, 11, 66, 129, + 18, 97, 50, 227, 67, 33, 97, 49, 97, 49, 97, 49, + 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, 82, 66, + 18, 0, 7, 48, 30, 11, 209, 49, 240, 179, 67, 33, + 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, + 97, 49, 97, 49, 82, 66, 18, 0, 7, 48, 23, 10, + 242, 113, 243, 66, 34, 65, 65, 49, 82, 33, 97, 17, + 114, 145, 145, 145, 145, 145, 0, 6, 112, 26, 11, 240, + 240, 243, 145, 161, 135, 97, 66, 65, 82, 49, 82, 49, + 82, 49, 81, 70, 81, 161, 161, 161, 133, 240, 32, 31, + 7, 240, 131, 34, 49, 17, 65, 17, 65, 17, 49, 33, + 33, 49, 49, 33, 65, 17, 65, 17, 65, 17, 17, 33, + 17, 17, 17, 240, 240, 112, 19, 7, 240, 225, 113, 240, + 67, 49, 49, 97, 67, 34, 33, 33, 49, 38, 240, 240, + 96, 20, 7, 240, 240, 17, 81, 81, 211, 49, 49, 97, + 67, 34, 33, 33, 49, 38, 240, 240, 96, 20, 7, 240, + 241, 81, 17, 113, 163, 49, 49, 97, 67, 34, 33, 33, + 49, 38, 240, 240, 96, 19, 7, 240, 240, 98, 98, 179, + 49, 49, 97, 67, 34, 33, 33, 49, 38, 240, 240, 96, + 20, 8, 240, 240, 177, 33, 240, 83, 65, 49, 113, 83, + 50, 33, 49, 49, 55, 240, 240, 176, 22, 7, 240, 130, + 65, 33, 49, 33, 66, 179, 49, 49, 97, 67, 34, 33, + 34, 33, 38, 240, 240, 96, 21, 11, 0, 11, 19, 20, + 34, 33, 65, 86, 36, 97, 49, 97, 49, 65, 20, 20, + 0, 7, 16, 22, 7, 0, 7, 35, 34, 33, 33, 49, + 33, 97, 65, 17, 49, 50, 17, 81, 97, 65, 33, 66, + 160, 18, 7, 240, 241, 97, 113, 180, 33, 65, 22, 17, + 97, 98, 49, 36, 240, 240, 112, 19, 7, 240, 240, 17, + 97, 81, 196, 33, 65, 22, 17, 97, 98, 49, 36, 240, + 240, 112, 19, 7, 240, 242, 65, 18, 97, 164, 33, 65, + 22, 17, 97, 98, 49, 36, 240, 240, 112, 20, 7, 240, + 240, 97, 33, 240, 36, 33, 65, 22, 17, 97, 65, 17, + 65, 36, 240, 240, 112, 14, 3, 193, 33, 49, 81, 33, + 33, 33, 33, 33, 33, 240, 16, 15, 4, 240, 49, 33, + 33, 129, 49, 49, 49, 49, 49, 49, 240, 112, 16, 4, + 240, 33, 33, 17, 49, 97, 49, 49, 49, 49, 49, 49, + 240, 112, 14, 5, 240, 161, 33, 194, 65, 65, 65, 65, + 65, 65, 240, 192, 25, 7, 240, 226, 17, 66, 65, 18, + 97, 53, 17, 65, 17, 65, 17, 65, 17, 65, 17, 49, + 49, 33, 240, 240, 112, 24, 7, 240, 240, 98, 65, 34, + 145, 19, 34, 49, 17, 65, 17, 65, 17, 65, 17, 65, + 17, 65, 240, 240, 96, 22, 7, 240, 241, 97, 113, 180, + 33, 49, 33, 65, 17, 65, 17, 65, 17, 65, 33, 33, + 240, 240, 112, 23, 7, 240, 240, 17, 97, 81, 196, 33, + 49, 33, 65, 17, 65, 17, 65, 17, 65, 33, 33, 240, + 240, 112, 23, 7, 240, 242, 65, 18, 97, 164, 33, 49, + 33, 65, 17, 65, 17, 65, 17, 65, 33, 33, 240, 240, + 112, 23, 7, 240, 240, 98, 65, 34, 164, 33, 49, 33, + 65, 17, 65, 17, 65, 17, 65, 33, 33, 240, 240, 112, + 23, 7, 240, 240, 97, 33, 240, 36, 33, 49, 33, 65, + 17, 65, 17, 65, 17, 65, 33, 33, 240, 240, 112, 12, + 9, 0, 8, 34, 114, 216, 210, 114, 0, 7, 32, 22, + 7, 0, 7, 21, 17, 65, 17, 35, 17, 17, 33, 18, + 49, 17, 49, 35, 17, 81, 240, 240, 16, 23, 7, 240, + 226, 97, 113, 161, 65, 17, 65, 17, 65, 17, 65, 17, + 65, 17, 50, 35, 17, 240, 240, 96, 24, 7, 240, 240, + 17, 81, 81, 193, 65, 17, 65, 17, 65, 17, 65, 17, + 65, 17, 50, 35, 17, 240, 240, 96, 24, 7, 240, 242, + 65, 17, 113, 145, 65, 17, 65, 17, 65, 17, 65, 17, + 65, 17, 50, 35, 17, 240, 240, 96, 24, 7, 240, 240, + 97, 33, 240, 17, 65, 17, 65, 17, 65, 17, 65, 17, + 65, 17, 50, 35, 17, 240, 240, 96, 25, 8, 240, 240, + 113, 97, 97, 210, 49, 49, 33, 66, 17, 81, 17, 82, + 98, 113, 97, 113, 113, 65, 17, 83, 80, 26, 7, 240, + 98, 81, 97, 97, 97, 101, 33, 65, 17, 65, 17, 65, + 17, 65, 17, 65, 21, 33, 97, 97, 97, 97, 96, 23, + 7, 240, 240, 113, 33, 240, 17, 113, 33, 49, 17, 67, + 82, 82, 81, 97, 97, 81, 65, 17, 66, 80, +}; + +//***************************************************************************** +// +// The glyph offset table for the 16 point Theanodidot font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanodidot16[] = +{ + 0, 4, 18, 33, 58, 95, 134, 165, + 174, 193, 212, 231, 246, 256, 264, 272, + 291, 319, 336, 358, 383, 404, 428, 455, + 474, 501, 528, 537, 548, 563, 572, 587, + 605, 648, 674, 701, 725, 753, 780, 805, + 829, 857, 873, 892, 920, 942, 984, 1019, + 1046, 1069, 1099, 1126, 1149, 1174, 1203, 1228, + 1267, 1292, 1315, 1338, 1357, 1376, 1395, 1413, + 1420, 1428, 1445, 1469, 1488, 1512, 1528, 1547, + 1571, 1596, 1609, 1631, 1654, 1669, 1697, 1718, + 1738, 1762, 1786, 1801, 1817, 1831, 1852, 1868, + 1893, 1910, 1932, 1948, 1966, 1984, 2003, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2014, 2018, 2031, 2056, 2083, 2104, 2125, 2140, + 2170, 2178, 2217, 2227, 2243, 2253, 2261, 2304, + 2311, 2326, 2342, 2356, 2369, 2377, 2402, 2436, + 2443, 2452, 2465, 2479, 2495, 2529, 2562, 2597, + 2614, 2640, 2665, 2692, 2720, 2747, 2776, 2812, + 2842, 2869, 2897, 2925, 2953, 2970, 2987, 3006, + 3024, 3051, 3086, 3115, 3144, 3174, 3202, 3231, + 3248, 3282, 3313, 3344, 3376, 3406, 3429, 3455, + 3486, 3505, 3525, 3545, 3564, 3584, 3606, 3627, + 3649, 3667, 3686, 3705, 3725, 3739, 3754, 3770, + 3784, 3809, 3833, 3855, 3878, 3901, 3924, 3947, + 3959, 3981, 4004, 4028, 4052, 4076, 4101, 4127, +}; + +//***************************************************************************** +// +// The font definition for the 16 point Theanodidot font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanodidot16 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 14, + + // + // The height of the font. + // + 20, + + // + // The baseline of the font. + // + 15, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanodidot16, + + // + // A pointer to the actual font data + // + g_pui8Theanodidot16Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanodidot18.c b/third_party/fonts/ofl/fonts/fonttheanodidot18.c new file mode 100644 index 0000000..8f0712e --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanodidot18.c @@ -0,0 +1,608 @@ +//***************************************************************************** +// +// fonttheanodidot18.c - Font definition for the 18pt Theanodidot font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanodidot +// Size: 18 point +// Bold: no +// Italic: no +// Memory usage: 4864 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 18 point Theanodidot font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanodidot18Data[4663] = +{ + 5, 7, 0, 19, 32, 15, 3, 194, 18, 18, 18, 18, + 18, 33, 17, 33, 130, 18, 240, 16, 15, 6, 240, 146, + 18, 18, 18, 18, 18, 18, 18, 17, 33, 0, 10, 29, + 10, 240, 240, 209, 145, 33, 81, 49, 81, 49, 57, 49, + 49, 81, 33, 81, 49, 73, 33, 49, 81, 33, 97, 33, + 145, 0, 6, 112, 47, 10, 240, 240, 49, 17, 101, 65, + 17, 17, 17, 33, 33, 17, 18, 17, 33, 17, 17, 34, + 17, 17, 85, 102, 81, 20, 65, 17, 33, 18, 17, 17, + 33, 17, 33, 17, 33, 17, 33, 17, 17, 51, 18, 99, + 240, 240, 224, 43, 13, 0, 6, 83, 81, 49, 49, 49, + 65, 49, 49, 65, 49, 33, 81, 49, 33, 99, 33, 177, + 49, 129, 18, 17, 97, 33, 49, 81, 33, 49, 65, 49, + 49, 65, 49, 49, 49, 81, 17, 0, 8, 48, 34, 14, + 0, 7, 68, 146, 33, 146, 33, 148, 178, 162, 18, 35, + 50, 34, 49, 50, 66, 33, 50, 66, 17, 66, 83, 67, + 82, 83, 51, 101, 36, 0, 8, 112, 10, 3, 194, 18, + 18, 18, 17, 240, 240, 176, 21, 5, 240, 129, 49, 65, + 50, 49, 50, 50, 50, 50, 50, 50, 50, 65, 65, 81, + 65, 81, 65, 22, 6, 240, 161, 97, 81, 82, 81, 81, + 82, 66, 66, 66, 66, 66, 65, 66, 65, 81, 65, 65, + 80, 21, 8, 240, 240, 82, 98, 50, 17, 18, 38, 36, + 50, 17, 18, 17, 34, 17, 66, 0, 10, 48, 16, 10, + 0, 10, 65, 145, 145, 145, 89, 81, 145, 145, 145, 0, + 6, 112, 11, 4, 0, 7, 66, 35, 49, 33, 49, 33, + 112, 8, 7, 0, 11, 54, 0, 7, 16, 8, 3, 240, + 240, 242, 18, 240, 16, 22, 6, 240, 209, 65, 81, 81, + 81, 65, 81, 81, 81, 65, 81, 81, 81, 81, 65, 81, + 81, 81, 80, 32, 10, 240, 240, 211, 97, 49, 65, 81, + 49, 81, 34, 82, 18, 82, 18, 82, 18, 82, 18, 82, + 33, 81, 49, 81, 65, 49, 97, 17, 0, 6, 96, 20, + 6, 240, 209, 66, 51, 18, 18, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 240, 240, 16, 25, 9, 240, 240, 132, + 65, 50, 33, 82, 17, 82, 17, 82, 20, 34, 98, 113, + 114, 98, 97, 119, 24, 0, 5, 96, 27, 9, 240, 240, + 132, 65, 66, 34, 50, 49, 50, 113, 98, 82, 17, 146, + 114, 18, 66, 18, 66, 17, 66, 50, 18, 0, 6, 23, + 10, 240, 240, 242, 130, 129, 130, 129, 129, 18, 81, 34, + 65, 50, 57, 98, 130, 130, 130, 0, 6, 80, 26, 9, + 240, 240, 113, 49, 68, 65, 129, 129, 34, 82, 34, 130, + 114, 114, 18, 66, 18, 65, 33, 66, 52, 0, 6, 16, + 28, 9, 240, 240, 147, 81, 34, 49, 50, 49, 114, 114, + 19, 51, 49, 34, 66, 18, 66, 18, 66, 33, 66, 34, + 49, 68, 0, 6, 23, 9, 240, 240, 115, 49, 21, 33, + 17, 51, 129, 113, 129, 113, 129, 113, 129, 114, 114, 113, + 0, 6, 48, 30, 9, 240, 240, 132, 50, 66, 17, 97, + 17, 97, 18, 65, 51, 17, 84, 65, 51, 17, 82, 17, + 97, 17, 97, 18, 65, 65, 18, 0, 6, 30, 9, 240, + 240, 132, 65, 50, 34, 65, 34, 66, 18, 66, 18, 66, + 33, 51, 51, 18, 114, 113, 50, 49, 50, 33, 81, 17, + 0, 6, 16, 9, 3, 240, 194, 18, 210, 18, 240, 16, + 14, 4, 240, 240, 114, 34, 240, 34, 35, 49, 49, 33, + 33, 112, 16, 10, 0, 10, 114, 98, 98, 98, 113, 162, + 162, 162, 162, 0, 6, 48, 10, 10, 0, 12, 73, 240, + 105, 0, 10, 16, 16, 10, 0, 10, 2, 162, 162, 162, + 161, 114, 98, 98, 98, 0, 7, 32, 20, 7, 240, 227, + 50, 33, 98, 82, 82, 33, 34, 35, 65, 97, 240, 66, + 82, 240, 240, 160, 50, 15, 0, 10, 20, 146, 66, 82, + 129, 50, 145, 50, 35, 17, 49, 18, 34, 34, 49, 18, + 34, 34, 49, 18, 18, 50, 49, 18, 18, 49, 65, 18, + 18, 49, 49, 34, 18, 34, 49, 49, 35, 35, 66, 226, + 113, 98, 81, 149, 240, 80, 26, 11, 0, 6, 1, 162, + 146, 131, 132, 97, 34, 97, 34, 97, 50, 86, 65, 66, + 65, 82, 33, 98, 33, 99, 0, 7, 31, 10, 240, 240, + 167, 66, 65, 50, 66, 34, 66, 34, 66, 34, 65, 54, + 66, 50, 50, 66, 34, 66, 34, 66, 34, 65, 50, 34, + 0, 6, 80, 26, 12, 0, 6, 71, 50, 82, 34, 98, + 33, 129, 18, 162, 162, 162, 162, 177, 129, 34, 98, 49, + 98, 72, 0, 7, 80, 31, 12, 0, 6, 8, 82, 81, + 66, 82, 50, 97, 50, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 34, 97, 50, 82, 50, 81, 66, 35, 0, 8, + 29, 11, 240, 240, 233, 50, 81, 50, 81, 50, 146, 49, + 82, 49, 86, 82, 49, 82, 49, 82, 97, 34, 97, 34, + 82, 34, 52, 0, 7, 28, 11, 240, 240, 234, 34, 82, + 34, 97, 34, 49, 33, 34, 49, 82, 33, 102, 82, 49, + 82, 49, 82, 146, 146, 146, 0, 7, 112, 29, 14, 0, + 7, 71, 82, 82, 66, 113, 65, 129, 50, 194, 194, 194, + 71, 18, 114, 65, 114, 66, 98, 81, 83, 101, 33, 0, + 9, 16, 32, 12, 0, 6, 4, 52, 34, 82, 50, 82, + 50, 82, 50, 82, 50, 82, 57, 50, 82, 50, 82, 50, + 82, 50, 82, 50, 82, 50, 82, 0, 7, 96, 18, 5, + 240, 84, 34, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 240, 192, 21, 7, 240, 244, 66, 82, 82, 82, + 82, 82, 82, 82, 82, 34, 18, 34, 18, 51, 240, 240, + 128, 32, 12, 0, 6, 4, 50, 66, 65, 82, 49, 98, + 33, 114, 17, 130, 18, 118, 98, 34, 98, 50, 82, 51, + 66, 66, 66, 82, 50, 83, 0, 7, 80, 24, 11, 240, + 240, 228, 130, 146, 146, 146, 146, 146, 146, 146, 97, 34, + 97, 34, 81, 50, 82, 34, 52, 0, 7, 48, 14, 0, + 7, 4, 99, 35, 83, 49, 18, 67, 49, 18, 49, 18, + 49, 18, 49, 18, 49, 18, 49, 18, 49, 34, 17, 34, + 49, 34, 17, 34, 49, 34, 17, 34, 49, 50, 50, 49, + 50, 50, 49, 50, 50, 49, 130, 0, 9, 39, 12, 0, + 6, 4, 67, 36, 65, 49, 18, 65, 49, 34, 49, 49, + 34, 49, 49, 50, 33, 49, 51, 17, 49, 66, 17, 49, + 68, 49, 83, 49, 98, 49, 98, 49, 113, 0, 7, 96, + 31, 13, 0, 7, 4, 114, 66, 66, 98, 49, 129, 34, + 130, 18, 130, 18, 130, 18, 130, 18, 130, 33, 129, 50, + 98, 65, 97, 102, 0, 8, 80, 26, 11, 240, 240, 231, + 82, 66, 50, 82, 34, 82, 34, 82, 34, 82, 34, 81, + 55, 66, 146, 146, 146, 146, 0, 7, 112, 33, 14, 0, + 7, 68, 130, 66, 82, 98, 65, 129, 50, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 49, 129, 66, 98, 81, 97, + 118, 161, 227, 195, 212, 240, 30, 11, 240, 240, 231, 82, + 65, 66, 66, 50, 66, 50, 66, 50, 65, 70, 82, 50, + 66, 66, 50, 66, 50, 66, 50, 66, 50, 82, 0, 7, + 26, 11, 0, 5, 117, 66, 65, 65, 81, 65, 163, 149, + 118, 132, 131, 17, 114, 18, 98, 19, 81, 33, 37, 0, + 7, 32, 26, 13, 0, 6, 76, 18, 50, 50, 17, 66, + 65, 17, 66, 65, 98, 178, 178, 178, 178, 178, 178, 178, + 178, 0, 8, 112, 32, 12, 0, 6, 4, 67, 34, 97, + 50, 97, 50, 97, 50, 97, 50, 97, 50, 97, 50, 97, + 50, 97, 50, 97, 50, 97, 65, 81, 98, 18, 0, 8, + 29, 11, 240, 240, 228, 66, 34, 81, 50, 81, 50, 65, + 82, 49, 82, 49, 83, 17, 114, 17, 114, 17, 130, 146, + 146, 161, 0, 7, 64, 45, 17, 0, 8, 67, 67, 66, + 18, 98, 65, 50, 82, 65, 50, 67, 65, 50, 65, 18, + 33, 82, 33, 34, 33, 82, 33, 34, 33, 82, 33, 50, + 17, 99, 67, 115, 67, 115, 82, 129, 97, 145, 97, 0, + 11, 32, 28, 11, 240, 240, 228, 50, 50, 65, 82, 33, + 99, 17, 115, 146, 146, 129, 18, 113, 19, 81, 50, 65, + 82, 49, 82, 162, 0, 7, 26, 11, 240, 240, 228, 66, + 34, 81, 50, 65, 82, 49, 83, 17, 114, 17, 115, 146, + 146, 146, 146, 146, 146, 0, 7, 64, 26, 11, 240, 240, + 233, 34, 67, 33, 82, 49, 67, 130, 130, 146, 130, 131, + 130, 81, 35, 81, 34, 82, 18, 68, 0, 7, 21, 6, + 240, 148, 34, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 69, 21, 6, 240, 145, 81, + 81, 81, 97, 81, 81, 81, 97, 81, 81, 81, 81, 97, + 81, 81, 81, 97, 21, 6, 240, 164, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 21, 20, 11, 0, 6, 2, 129, 17, 129, 33, 97, 50, + 65, 81, 65, 97, 33, 114, 0, 15, 32, 7, 10, 0, + 23, 105, 240, 96, 8, 3, 193, 34, 33, 0, 5, 96, + 21, 8, 0, 9, 20, 49, 50, 33, 50, 83, 50, 18, + 34, 34, 34, 34, 51, 18, 240, 240, 176, 27, 9, 240, + 240, 98, 114, 114, 114, 114, 114, 19, 51, 49, 34, 66, + 18, 66, 18, 66, 18, 66, 19, 49, 34, 19, 0, 6, + 19, 8, 0, 9, 36, 49, 49, 34, 49, 34, 98, 98, + 65, 34, 33, 68, 240, 240, 192, 28, 9, 240, 240, 179, + 114, 114, 114, 114, 51, 18, 33, 51, 18, 66, 18, 66, + 18, 66, 18, 66, 33, 51, 51, 18, 0, 5, 96, 19, + 8, 0, 9, 36, 49, 50, 18, 50, 23, 18, 98, 65, + 34, 49, 52, 240, 240, 192, 20, 7, 240, 243, 49, 34, + 18, 82, 82, 83, 66, 82, 82, 82, 82, 82, 82, 240, + 240, 160, 26, 9, 0, 10, 36, 18, 18, 51, 18, 50, + 49, 50, 52, 65, 129, 134, 81, 34, 34, 65, 33, 81, + 33, 65, 68, 64, 28, 8, 240, 240, 34, 98, 98, 98, + 98, 98, 19, 35, 34, 18, 50, 18, 50, 18, 50, 18, + 50, 18, 50, 18, 50, 240, 240, 176, 14, 3, 194, 18, + 162, 18, 18, 18, 18, 18, 18, 18, 240, 16, 23, 6, + 240, 194, 66, 240, 114, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 18, 18, 18, 18, 33, 17, 32, 27, 8, 240, + 240, 34, 98, 98, 98, 98, 98, 49, 34, 33, 50, 17, + 69, 50, 18, 50, 34, 34, 49, 34, 50, 240, 240, 176, + 17, 3, 194, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 240, 16, 31, 14, 0, 15, 99, 19, 35, + 51, 35, 34, 34, 50, 50, 34, 50, 50, 34, 50, 50, + 34, 50, 50, 34, 50, 50, 34, 50, 50, 0, 8, 112, + 23, 9, 0, 10, 19, 19, 51, 34, 34, 50, 34, 50, + 34, 50, 34, 50, 34, 50, 34, 50, 0, 5, 96, 20, + 9, 0, 10, 52, 65, 65, 34, 66, 18, 66, 18, 66, + 18, 66, 33, 65, 68, 0, 6, 26, 10, 0, 11, 35, + 19, 67, 34, 50, 66, 34, 66, 34, 66, 34, 66, 35, + 49, 50, 19, 66, 130, 130, 130, 130, 112, 26, 10, 0, + 11, 67, 19, 33, 51, 34, 66, 34, 66, 34, 66, 34, + 66, 49, 51, 67, 18, 130, 130, 130, 130, 130, 32, 17, + 7, 0, 7, 115, 18, 35, 17, 34, 82, 82, 82, 82, + 82, 240, 240, 144, 18, 7, 0, 8, 4, 33, 49, 34, + 99, 99, 17, 65, 17, 65, 21, 240, 240, 112, 19, 6, + 240, 240, 210, 66, 51, 66, 66, 66, 66, 66, 17, 34, + 17, 35, 240, 240, 32, 23, 9, 0, 10, 18, 50, 34, + 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, 35, 51, + 19, 0, 5, 96, 18, 7, 0, 7, 114, 97, 49, 34, + 33, 49, 17, 67, 67, 81, 97, 240, 240, 128, 30, 12, + 0, 13, 66, 50, 49, 33, 65, 49, 34, 35, 17, 50, + 17, 18, 17, 65, 17, 33, 17, 66, 50, 97, 50, 97, + 65, 0, 7, 112, 20, 9, 0, 10, 20, 18, 50, 33, + 83, 113, 130, 97, 18, 65, 49, 51, 20, 0, 5, 96, + 23, 9, 0, 10, 34, 65, 49, 49, 66, 33, 81, 33, + 83, 114, 113, 129, 129, 113, 129, 82, 17, 83, 96, 19, + 8, 0, 9, 21, 33, 50, 97, 98, 97, 98, 33, 49, + 49, 34, 34, 240, 240, 176, 22, 5, 240, 49, 34, 49, + 65, 65, 81, 65, 65, 49, 49, 81, 81, 65, 65, 49, + 65, 65, 65, 82, 20, 2, 129, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 48, + 21, 5, 241, 81, 81, 65, 50, 49, 65, 65, 65, 82, + 34, 49, 65, 65, 81, 65, 65, 49, 128, 11, 9, 0, + 12, 67, 49, 17, 51, 0, 10, 48, 5, 7, 0, 19, + 32, 14, 3, 240, 194, 18, 113, 33, 33, 34, 18, 18, + 18, 18, 18, 31, 8, 240, 240, 129, 97, 113, 113, 97, + 82, 17, 49, 34, 34, 17, 17, 34, 17, 66, 17, 67, + 49, 34, 33, 68, 49, 113, 97, 113, 113, 112, 29, 12, + 0, 6, 115, 114, 49, 82, 33, 17, 82, 34, 98, 162, + 134, 130, 162, 162, 49, 50, 17, 65, 33, 39, 36, 20, + 0, 7, 112, 23, 8, 0, 9, 1, 19, 17, 33, 49, + 33, 81, 17, 81, 17, 81, 33, 49, 33, 19, 17, 0, + 6, 16, 25, 9, 240, 240, 98, 81, 18, 65, 50, 49, + 50, 33, 82, 17, 83, 72, 66, 72, 66, 114, 114, 114, + 0, 6, 16, 17, 2, 129, 17, 17, 17, 17, 17, 17, + 113, 17, 17, 17, 17, 17, 17, 48, 33, 7, 240, 228, + 33, 65, 17, 50, 17, 50, 33, 99, 49, 19, 33, 34, + 34, 34, 34, 33, 35, 17, 66, 97, 113, 18, 49, 17, + 49, 33, 49, 51, 48, 10, 6, 240, 242, 18, 18, 18, + 0, 11, 48, 43, 15, 0, 8, 6, 129, 97, 82, 37, + 17, 65, 34, 49, 33, 33, 34, 65, 49, 17, 34, 129, + 17, 34, 129, 17, 34, 129, 17, 34, 65, 49, 33, 34, + 49, 33, 50, 51, 34, 66, 97, 134, 0, 10, 14, 6, + 240, 147, 49, 33, 51, 33, 33, 50, 17, 0, 9, 112, + 14, 5, 0, 7, 1, 49, 33, 17, 33, 17, 33, 240, + 240, 96, 11, 10, 0, 12, 73, 145, 145, 145, 0, 10, + 16, 8, 7, 0, 11, 54, 0, 7, 16, 43, 15, 0, + 8, 6, 129, 97, 87, 49, 65, 34, 34, 33, 33, 50, + 34, 49, 17, 52, 81, 17, 50, 34, 49, 17, 50, 34, + 49, 17, 50, 34, 49, 33, 20, 34, 17, 50, 130, 66, + 97, 134, 0, 10, 8, 6, 240, 240, 101, 0, 11, 48, + 19, 8, 240, 240, 67, 65, 49, 33, 81, 17, 81, 17, + 81, 33, 49, 67, 0, 11, 48, 17, 10, 0, 9, 33, + 145, 145, 145, 89, 81, 145, 145, 145, 249, 240, 240, 176, + 15, 5, 240, 98, 33, 33, 17, 33, 18, 17, 49, 49, + 67, 0, 7, 18, 6, 240, 149, 17, 33, 33, 17, 82, + 97, 33, 33, 17, 49, 35, 0, 7, 96, 8, 3, 209, + 18, 17, 0, 5, 112, 27, 10, 0, 11, 34, 50, 50, + 50, 50, 50, 50, 50, 49, 65, 65, 65, 66, 37, 17, + 19, 34, 17, 145, 145, 146, 130, 128, 40, 10, 240, 240, + 199, 35, 33, 52, 33, 52, 33, 52, 33, 67, 33, 82, + 33, 97, 33, 97, 33, 97, 33, 97, 33, 97, 33, 97, + 33, 97, 33, 97, 33, 97, 33, 97, 33, 97, 33, 48, + 8, 3, 240, 240, 50, 18, 240, 208, 9, 5, 0, 12, + 18, 18, 17, 34, 32, 12, 5, 240, 113, 65, 35, 65, + 65, 65, 51, 0, 7, 16, 6, 240, 163, 33, 49, 17, + 49, 17, 49, 17, 33, 50, 0, 9, 48, 15, 6, 0, + 8, 33, 33, 49, 33, 33, 33, 33, 17, 240, 240, 224, + 36, 13, 0, 6, 97, 97, 81, 81, 67, 81, 97, 65, + 113, 65, 113, 49, 33, 67, 17, 49, 129, 49, 113, 49, + 129, 49, 17, 81, 68, 49, 113, 65, 113, 0, 8, 48, + 38, 13, 0, 6, 97, 97, 81, 97, 51, 81, 97, 65, + 113, 65, 113, 49, 19, 51, 34, 49, 97, 17, 49, 81, + 35, 17, 81, 81, 81, 97, 65, 97, 17, 49, 84, 0, + 8, 32, 37, 14, 0, 7, 5, 81, 49, 33, 81, 65, + 17, 97, 98, 65, 145, 33, 113, 33, 33, 33, 67, 33, + 49, 145, 33, 145, 49, 129, 49, 33, 97, 53, 65, 113, + 209, 0, 9, 20, 7, 0, 8, 34, 82, 240, 81, 67, + 49, 33, 34, 33, 34, 82, 82, 97, 34, 51, 32, 28, + 11, 34, 162, 177, 240, 81, 161, 162, 131, 132, 97, 34, + 97, 34, 97, 35, 86, 65, 66, 65, 82, 33, 98, 33, + 99, 0, 7, 30, 10, 82, 114, 114, 240, 65, 145, 131, + 115, 97, 18, 97, 34, 81, 34, 65, 50, 71, 49, 66, + 33, 83, 17, 98, 17, 98, 0, 6, 48, 30, 11, 66, + 129, 18, 97, 50, 240, 49, 162, 146, 131, 132, 97, 34, + 97, 34, 97, 50, 86, 65, 66, 65, 82, 33, 98, 33, + 99, 0, 7, 29, 11, 211, 33, 65, 35, 240, 65, 162, + 146, 131, 132, 97, 34, 97, 34, 97, 50, 86, 65, 66, + 65, 82, 33, 98, 33, 99, 0, 7, 29, 10, 178, 34, + 240, 240, 98, 130, 113, 18, 97, 18, 97, 18, 97, 19, + 65, 50, 70, 49, 67, 33, 82, 33, 83, 130, 0, 6, + 48, 30, 11, 51, 113, 49, 97, 49, 115, 145, 161, 147, + 131, 131, 113, 34, 97, 34, 81, 51, 71, 65, 66, 49, + 83, 33, 98, 33, 99, 0, 7, 41, 18, 0, 9, 106, + 129, 18, 81, 129, 18, 81, 113, 34, 209, 34, 49, 129, + 50, 49, 138, 113, 66, 49, 97, 82, 49, 97, 82, 97, + 33, 98, 97, 33, 98, 82, 17, 114, 52, 0, 11, 48, + 31, 12, 0, 6, 71, 50, 82, 34, 97, 49, 129, 18, + 162, 162, 162, 162, 177, 129, 34, 98, 49, 98, 72, 240, + 65, 145, 33, 129, 33, 131, 80, 31, 11, 34, 162, 177, + 240, 25, 50, 81, 50, 81, 50, 146, 49, 82, 49, 86, + 82, 49, 82, 49, 82, 97, 34, 97, 34, 82, 34, 52, + 0, 7, 31, 11, 97, 146, 129, 240, 41, 50, 81, 50, + 81, 50, 146, 49, 82, 49, 86, 82, 49, 82, 49, 82, + 97, 34, 97, 34, 82, 34, 52, 0, 7, 32, 11, 66, + 129, 18, 97, 50, 233, 50, 81, 50, 81, 50, 146, 49, + 82, 49, 86, 82, 49, 82, 49, 82, 97, 34, 97, 34, + 82, 34, 52, 0, 7, 31, 11, 194, 50, 240, 169, 50, + 81, 50, 81, 50, 49, 82, 49, 82, 49, 86, 82, 49, + 82, 49, 82, 97, 34, 97, 34, 82, 34, 52, 0, 7, + 20, 5, 1, 66, 81, 131, 34, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 240, 192, 20, 5, 49, 50, + 33, 131, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 240, 192, 22, 6, 18, 49, 18, 82, 116, 50, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 240, + 240, 48, 21, 7, 114, 34, 240, 20, 66, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 240, 240, 128, 32, + 13, 0, 6, 88, 98, 81, 82, 82, 66, 97, 66, 98, + 50, 98, 22, 66, 50, 98, 50, 98, 50, 97, 66, 82, + 66, 81, 82, 35, 0, 8, 80, 39, 12, 245, 240, 212, + 67, 36, 65, 49, 18, 65, 49, 34, 49, 49, 34, 49, + 49, 50, 33, 49, 51, 17, 49, 66, 17, 49, 68, 49, + 83, 49, 98, 49, 98, 49, 113, 0, 7, 96, 33, 13, + 50, 194, 209, 240, 132, 114, 66, 66, 98, 49, 129, 34, + 130, 18, 130, 18, 130, 18, 130, 18, 130, 33, 129, 50, + 98, 65, 97, 102, 0, 8, 80, 33, 13, 114, 162, 161, + 240, 148, 114, 66, 66, 98, 49, 129, 34, 130, 18, 130, + 18, 130, 18, 130, 18, 130, 33, 129, 50, 98, 65, 97, + 102, 0, 8, 80, 34, 13, 82, 161, 18, 194, 240, 100, + 114, 66, 66, 98, 49, 129, 34, 130, 18, 130, 18, 130, + 18, 130, 18, 130, 33, 129, 50, 98, 65, 97, 102, 0, + 8, 80, 33, 13, 240, 22, 240, 240, 68, 114, 66, 66, + 98, 49, 129, 34, 130, 18, 130, 18, 130, 18, 130, 18, + 130, 33, 129, 50, 98, 65, 97, 102, 0, 8, 80, 34, + 13, 240, 18, 34, 240, 240, 68, 114, 66, 66, 98, 49, + 129, 34, 130, 18, 130, 18, 130, 18, 130, 18, 130, 33, + 129, 50, 98, 65, 97, 102, 0, 8, 80, 19, 8, 0, + 9, 1, 66, 33, 34, 67, 82, 82, 17, 50, 49, 33, + 65, 0, 6, 32, 40, 13, 0, 7, 4, 49, 50, 67, + 50, 98, 49, 97, 17, 34, 81, 34, 18, 65, 50, 18, + 49, 66, 18, 49, 66, 18, 33, 82, 33, 17, 97, 50, + 98, 50, 97, 49, 38, 0, 8, 80, 34, 12, 50, 178, + 193, 240, 36, 67, 34, 97, 50, 97, 50, 97, 50, 97, + 50, 97, 50, 97, 50, 97, 50, 97, 50, 97, 50, 97, + 65, 81, 98, 18, 0, 8, 34, 12, 113, 162, 145, 240, + 52, 67, 34, 97, 50, 97, 50, 97, 50, 97, 50, 97, + 50, 97, 50, 97, 50, 97, 50, 97, 50, 97, 65, 81, + 98, 18, 0, 8, 34, 12, 82, 145, 18, 178, 244, 67, + 34, 97, 50, 97, 50, 97, 50, 97, 50, 97, 50, 97, + 50, 97, 50, 97, 50, 97, 50, 97, 65, 81, 98, 18, + 0, 8, 33, 12, 242, 34, 240, 196, 67, 34, 97, 50, + 97, 50, 97, 50, 97, 50, 97, 50, 97, 50, 97, 50, + 97, 50, 97, 50, 97, 65, 81, 98, 18, 0, 8, 28, + 11, 98, 130, 129, 240, 36, 66, 34, 65, 66, 65, 82, + 49, 83, 17, 114, 17, 115, 146, 146, 146, 146, 146, 146, + 0, 7, 64, 29, 12, 0, 6, 20, 146, 162, 136, 98, + 66, 66, 81, 66, 82, 50, 82, 50, 82, 50, 81, 71, + 82, 162, 162, 162, 162, 162, 134, 96, 31, 8, 240, 240, + 68, 49, 50, 18, 50, 18, 50, 18, 33, 50, 17, 66, + 34, 34, 50, 18, 50, 18, 50, 20, 18, 20, 17, 38, + 240, 240, 192, 25, 8, 240, 240, 65, 113, 113, 129, 212, + 49, 50, 33, 50, 83, 50, 18, 34, 34, 34, 34, 51, + 18, 240, 240, 176, 25, 8, 240, 240, 81, 113, 97, 113, + 228, 49, 50, 33, 50, 83, 50, 18, 34, 34, 34, 34, + 51, 18, 240, 240, 176, 26, 8, 240, 240, 81, 83, 81, + 18, 114, 180, 49, 50, 33, 50, 83, 50, 18, 34, 34, + 34, 34, 51, 18, 240, 240, 176, 26, 8, 240, 240, 178, + 33, 33, 34, 240, 84, 49, 50, 33, 50, 83, 50, 18, + 34, 34, 34, 34, 51, 18, 240, 240, 176, 26, 8, 240, + 240, 162, 34, 34, 34, 240, 68, 49, 50, 33, 50, 83, + 50, 18, 34, 34, 34, 34, 51, 18, 240, 240, 176, 27, + 8, 240, 240, 66, 81, 33, 65, 33, 82, 212, 49, 50, + 33, 50, 83, 50, 18, 34, 34, 34, 34, 51, 18, 240, + 240, 176, 25, 12, 0, 13, 84, 20, 49, 34, 50, 33, + 34, 50, 87, 37, 98, 34, 65, 18, 34, 65, 20, 36, + 0, 7, 96, 21, 8, 0, 9, 36, 49, 49, 34, 49, + 34, 98, 98, 65, 34, 33, 68, 225, 81, 17, 97, 192, + 23, 8, 240, 240, 65, 129, 113, 240, 116, 49, 50, 18, + 50, 23, 18, 98, 65, 34, 49, 52, 240, 240, 192, 23, + 8, 240, 240, 97, 98, 97, 240, 116, 49, 50, 18, 50, + 23, 18, 98, 65, 34, 49, 52, 240, 240, 192, 25, 8, + 240, 240, 81, 97, 17, 81, 18, 113, 196, 49, 50, 18, + 50, 23, 18, 98, 65, 34, 49, 52, 240, 240, 192, 24, + 8, 240, 240, 178, 18, 50, 18, 240, 84, 49, 50, 18, + 50, 23, 18, 98, 65, 34, 49, 52, 240, 240, 192, 16, + 4, 240, 18, 49, 65, 162, 34, 34, 34, 34, 34, 34, + 34, 240, 96, 15, 3, 209, 18, 17, 130, 18, 18, 18, + 18, 18, 18, 18, 240, 16, 17, 5, 240, 98, 33, 17, + 66, 194, 50, 50, 50, 50, 50, 50, 50, 240, 192, 18, + 6, 240, 242, 18, 18, 18, 242, 66, 66, 66, 66, 66, + 66, 66, 240, 240, 32, 27, 9, 240, 240, 130, 33, 83, + 99, 81, 18, 130, 69, 49, 66, 18, 66, 18, 66, 18, + 66, 18, 66, 33, 65, 68, 0, 6, 25, 9, 0, 7, + 5, 240, 83, 19, 51, 34, 34, 50, 34, 50, 34, 50, + 34, 50, 34, 50, 34, 50, 0, 5, 96, 24, 9, 240, + 240, 130, 129, 129, 145, 244, 65, 65, 34, 66, 18, 66, + 18, 66, 18, 66, 33, 65, 68, 0, 6, 25, 9, 240, + 240, 161, 129, 113, 129, 240, 20, 65, 65, 34, 66, 18, + 66, 18, 66, 18, 66, 33, 65, 68, 0, 6, 26, 9, + 240, 240, 146, 97, 18, 81, 33, 130, 212, 65, 65, 34, + 66, 18, 66, 18, 66, 18, 66, 33, 65, 68, 0, 6, + 25, 9, 0, 5, 114, 33, 49, 34, 240, 132, 65, 65, + 34, 66, 18, 66, 18, 66, 18, 66, 33, 65, 68, 0, + 6, 25, 9, 0, 5, 98, 18, 66, 18, 240, 132, 65, + 65, 34, 66, 18, 66, 18, 66, 18, 66, 33, 65, 68, + 0, 6, 13, 9, 0, 9, 50, 114, 240, 120, 210, 114, + 0, 7, 32, 24, 9, 0, 10, 52, 17, 33, 65, 34, + 51, 18, 33, 18, 18, 17, 34, 19, 50, 33, 65, 33, + 20, 0, 6, 27, 9, 240, 240, 129, 129, 145, 240, 130, + 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, + 35, 51, 19, 0, 5, 96, 27, 9, 240, 240, 146, 113, + 113, 240, 146, 50, 34, 50, 34, 50, 34, 50, 34, 50, + 34, 50, 34, 35, 51, 19, 0, 5, 96, 28, 9, 240, + 240, 145, 115, 81, 33, 240, 114, 50, 34, 50, 34, 50, + 34, 50, 34, 50, 34, 50, 34, 35, 51, 19, 0, 5, + 96, 28, 9, 240, 240, 242, 34, 50, 34, 240, 98, 50, + 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, 35, + 51, 19, 0, 5, 96, 27, 9, 240, 240, 177, 129, 113, + 240, 130, 65, 49, 49, 66, 33, 81, 33, 83, 114, 113, + 129, 129, 113, 129, 82, 17, 83, 96, 30, 9, 240, 240, + 99, 98, 114, 114, 114, 114, 19, 51, 49, 34, 66, 18, + 66, 18, 66, 18, 66, 18, 65, 38, 50, 114, 114, 114, + 114, 112, 29, 9, 0, 6, 2, 18, 66, 18, 240, 98, + 49, 65, 49, 66, 17, 82, 17, 97, 17, 98, 129, 129, + 113, 129, 129, 66, 17, 99, 80, +}; + +//***************************************************************************** +// +// The glyph offset table for the 18 point Theanodidot font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanodidot18[] = +{ + 0, 5, 20, 35, 64, 111, 154, 188, + 198, 219, 241, 262, 278, 289, 297, 305, + 327, 359, 379, 404, 431, 454, 480, 508, + 531, 561, 591, 600, 614, 630, 640, 656, + 676, 726, 752, 783, 809, 840, 869, 897, + 926, 958, 976, 997, 1029, 1053, 1101, 1140, + 1171, 1197, 1230, 1260, 1286, 1312, 1344, 1373, + 1418, 1446, 1472, 1498, 1519, 1540, 1561, 1581, + 1588, 1596, 1617, 1644, 1663, 1691, 1710, 1730, + 1756, 1784, 1798, 1821, 1848, 1865, 1896, 1919, + 1939, 1965, 1991, 2008, 2026, 2045, 2068, 2086, + 2116, 2136, 2159, 2178, 2200, 2220, 2241, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2252, 2257, 2271, 2302, 2331, 2354, 2379, 2396, + 2429, 2439, 2482, 2496, 2510, 2521, 2529, 2572, + 2580, 2599, 2616, 2631, 2649, 2657, 2684, 2724, + 2732, 2741, 2753, 2769, 2784, 2820, 2858, 2895, + 2915, 2943, 2973, 3003, 3032, 3061, 3091, 3132, + 3163, 3194, 3225, 3257, 3288, 3308, 3328, 3350, + 3371, 3403, 3442, 3475, 3508, 3542, 3575, 3609, + 3628, 3668, 3702, 3736, 3770, 3803, 3831, 3860, + 3891, 3916, 3941, 3967, 3993, 4019, 4046, 4071, + 4092, 4115, 4138, 4163, 4187, 4203, 4218, 4235, + 4253, 4280, 4305, 4329, 4354, 4380, 4405, 4430, + 4443, 4467, 4494, 4521, 4549, 4577, 4604, 4634, +}; + +//***************************************************************************** +// +// The font definition for the 18 point Theanodidot font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanodidot18 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 16, + + // + // The height of the font. + // + 22, + + // + // The baseline of the font. + // + 17, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanodidot18, + + // + // A pointer to the actual font data + // + g_pui8Theanodidot18Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanodidot20.c b/third_party/fonts/ofl/fonts/fonttheanodidot20.c new file mode 100644 index 0000000..5b84d0f --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanodidot20.c @@ -0,0 +1,650 @@ +//***************************************************************************** +// +// fonttheanodidot20.c - Font definition for the 20pt Theanodidot font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanodidot +// Size: 20 point +// Bold: no +// Italic: no +// Memory usage: 5368 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 20 point Theanodidot font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanodidot20Data[5168] = +{ + 5, 9, 0, 29, 32, 17, 4, 240, 82, 34, 34, 34, + 34, 34, 34, 33, 49, 49, 242, 34, 240, 176, 19, 8, + 240, 240, 162, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 33, 49, 0, 15, 48, 32, 12, 0, 9, 49, 177, 49, + 113, 49, 113, 49, 74, 65, 49, 113, 49, 113, 49, 113, + 49, 90, 49, 49, 113, 49, 113, 49, 113, 49, 0, 9, + 96, 51, 12, 0, 6, 49, 33, 129, 33, 118, 81, 17, + 33, 17, 49, 33, 33, 17, 49, 33, 35, 50, 17, 33, + 84, 33, 103, 118, 97, 33, 18, 81, 33, 33, 34, 17, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 17, 71, 113, + 33, 0, 8, 16, 44, 16, 0, 10, 20, 178, 33, 81, + 82, 34, 49, 98, 34, 49, 98, 34, 33, 129, 33, 33, + 162, 49, 225, 241, 50, 145, 49, 33, 129, 34, 34, 97, + 50, 34, 97, 50, 34, 81, 66, 34, 180, 0, 12, 48, + 38, 16, 0, 10, 67, 194, 33, 178, 33, 178, 17, 195, + 226, 194, 18, 22, 50, 34, 49, 97, 66, 33, 82, 66, + 33, 82, 83, 98, 83, 99, 82, 115, 52, 117, 52, 0, + 12, 32, 12, 4, 240, 82, 34, 34, 34, 34, 33, 0, + 7, 112, 25, 6, 240, 240, 49, 81, 65, 81, 66, 65, + 81, 66, 66, 66, 66, 66, 66, 66, 81, 82, 81, 81, + 97, 81, 128, 24, 6, 240, 241, 81, 97, 81, 82, 81, + 81, 82, 66, 66, 66, 66, 66, 66, 65, 66, 65, 81, + 65, 81, 176, 23, 10, 0, 6, 82, 130, 81, 33, 34, + 34, 17, 19, 67, 99, 18, 50, 17, 34, 82, 130, 0, + 15, 80, 16, 11, 0, 14, 33, 161, 161, 161, 105, 97, + 161, 161, 161, 161, 0, 9, 11, 5, 0, 11, 35, 35, + 65, 49, 65, 49, 224, 8, 8, 0, 15, 6, 0, 10, + 32, 8, 4, 0, 9, 2, 34, 240, 176, 25, 7, 0, + 5, 97, 97, 97, 81, 97, 97, 97, 97, 81, 97, 97, + 97, 81, 97, 97, 97, 81, 97, 97, 97, 96, 34, 11, + 0, 8, 83, 113, 49, 81, 81, 65, 81, 50, 82, 34, + 82, 34, 82, 34, 82, 34, 82, 34, 82, 49, 81, 65, + 81, 81, 49, 113, 17, 0, 8, 112, 22, 7, 0, 5, + 97, 82, 67, 34, 18, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 240, 240, 224, 28, 10, 0, 7, 100, 81, + 50, 49, 82, 33, 82, 33, 17, 50, 36, 34, 129, 130, + 129, 129, 129, 129, 65, 55, 40, 0, 7, 96, 28, 11, + 0, 8, 68, 97, 65, 82, 50, 66, 50, 146, 130, 114, + 179, 162, 49, 82, 34, 82, 34, 82, 33, 82, 70, 0, + 8, 96, 26, 11, 0, 7, 66, 146, 146, 130, 146, 145, + 145, 33, 97, 34, 81, 50, 65, 66, 73, 114, 146, 146, + 146, 0, 8, 96, 29, 11, 0, 6, 49, 145, 82, 33, + 100, 97, 161, 161, 35, 98, 50, 146, 162, 146, 146, 34, + 82, 34, 81, 49, 81, 85, 0, 8, 112, 31, 11, 0, + 8, 84, 97, 50, 66, 50, 65, 146, 146, 20, 67, 50, + 50, 82, 34, 82, 34, 82, 34, 82, 49, 81, 66, 50, + 100, 0, 8, 96, 25, 11, 0, 8, 36, 65, 38, 33, + 33, 52, 49, 97, 145, 161, 145, 161, 145, 161, 146, 145, + 146, 146, 0, 9, 16, 31, 11, 0, 8, 68, 97, 66, + 49, 97, 49, 97, 50, 81, 51, 49, 85, 118, 65, 52, + 33, 98, 33, 98, 33, 98, 49, 66, 85, 0, 8, 96, + 31, 11, 0, 8, 68, 98, 49, 66, 81, 50, 82, 34, + 82, 34, 82, 34, 82, 50, 51, 68, 18, 146, 145, 66, + 50, 66, 49, 100, 0, 8, 112, 11, 4, 240, 240, 226, + 34, 240, 114, 34, 240, 176, 15, 5, 0, 6, 115, 35, + 49, 240, 131, 35, 65, 49, 65, 49, 224, 17, 12, 0, + 15, 114, 130, 146, 130, 130, 162, 194, 194, 194, 194, 0, + 9, 32, 10, 12, 0, 19, 74, 240, 186, 0, 13, 96, + 17, 12, 0, 15, 18, 194, 178, 194, 194, 162, 130, 130, + 130, 130, 0, 10, 32, 23, 8, 240, 240, 179, 66, 33, + 114, 98, 98, 98, 49, 33, 67, 81, 113, 113, 240, 130, + 98, 0, 6, 80, 56, 18, 0, 16, 84, 179, 66, 130, + 129, 98, 161, 66, 51, 18, 34, 50, 34, 35, 49, 34, + 50, 34, 65, 34, 34, 50, 65, 34, 34, 50, 65, 34, + 34, 49, 81, 34, 34, 49, 65, 50, 34, 34, 49, 82, + 35, 35, 98, 240, 34, 145, 130, 82, 181, 240, 240, 208, + 32, 16, 0, 10, 97, 241, 227, 211, 193, 18, 193, 19, + 177, 34, 177, 34, 161, 51, 151, 145, 66, 129, 98, 113, + 98, 113, 99, 68, 55, 0, 12, 32, 32, 13, 0, 9, + 105, 98, 66, 82, 82, 66, 82, 66, 82, 66, 66, 86, + 114, 66, 82, 82, 66, 82, 66, 82, 66, 82, 66, 66, + 57, 0, 10, 32, 29, 14, 0, 11, 8, 81, 83, 65, + 114, 50, 129, 34, 145, 34, 194, 194, 194, 194, 145, 49, + 145, 50, 114, 66, 83, 104, 0, 10, 96, 32, 15, 0, + 11, 41, 130, 82, 98, 98, 82, 113, 82, 114, 66, 114, + 66, 114, 66, 114, 66, 114, 66, 114, 66, 113, 82, 98, + 82, 82, 73, 0, 12, 32, 14, 0, 10, 75, 82, 97, + 82, 97, 82, 65, 114, 65, 114, 50, 119, 114, 50, 114, + 65, 114, 113, 66, 113, 66, 113, 66, 98, 44, 0, 10, + 96, 29, 13, 0, 9, 107, 66, 97, 66, 97, 66, 65, + 98, 65, 98, 50, 103, 98, 50, 98, 65, 98, 65, 98, + 178, 178, 150, 0, 10, 80, 31, 16, 0, 12, 72, 113, + 83, 97, 114, 82, 129, 66, 145, 66, 226, 226, 226, 87, + 34, 130, 81, 130, 82, 114, 98, 83, 133, 33, 0, 12, + 64, 34, 16, 0, 12, 6, 38, 66, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 106, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 70, 38, 0, 12, 32, 21, + 8, 0, 6, 6, 66, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 70, 0, 6, 32, 23, 10, 0, 7, + 87, 98, 130, 130, 130, 130, 130, 130, 130, 130, 130, 66, + 34, 66, 33, 99, 0, 8, 32, 34, 16, 0, 12, 6, + 21, 98, 65, 146, 65, 146, 49, 162, 33, 178, 33, 182, + 162, 34, 162, 35, 146, 51, 130, 66, 130, 82, 114, 83, + 70, 38, 0, 12, 32, 25, 14, 0, 10, 70, 162, 194, + 194, 194, 194, 194, 194, 194, 194, 113, 66, 113, 66, 98, + 66, 98, 44, 0, 10, 96, 53, 18, 0, 13, 69, 116, + 67, 99, 97, 18, 83, 97, 18, 65, 18, 97, 18, 65, + 18, 97, 34, 49, 18, 97, 34, 33, 34, 97, 34, 33, + 34, 97, 35, 17, 34, 97, 51, 50, 97, 51, 50, 97, + 51, 50, 97, 65, 66, 69, 33, 38, 0, 13, 96, 42, + 16, 0, 12, 5, 69, 68, 81, 97, 19, 65, 97, 34, + 65, 97, 35, 49, 97, 50, 49, 97, 66, 33, 97, 67, + 17, 97, 82, 17, 97, 84, 97, 99, 97, 114, 97, 114, + 69, 97, 0, 12, 64, 32, 15, 0, 11, 101, 130, 82, + 82, 113, 82, 114, 50, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 49, 130, 66, 114, 82, 82, 133, 0, + 12, 27, 13, 0, 9, 104, 114, 66, 82, 82, 66, 82, + 66, 82, 66, 82, 66, 66, 87, 98, 178, 178, 178, 178, + 150, 0, 10, 80, 37, 16, 0, 12, 69, 146, 82, 113, + 113, 98, 114, 66, 146, 50, 146, 50, 146, 50, 146, 50, + 146, 50, 146, 65, 130, 82, 114, 98, 82, 134, 209, 243, + 227, 227, 244, 240, 48, 33, 16, 0, 12, 8, 162, 50, + 146, 66, 130, 66, 130, 66, 130, 65, 150, 162, 51, 130, + 82, 114, 82, 114, 82, 114, 82, 114, 82, 86, 68, 0, + 12, 32, 28, 12, 0, 9, 53, 97, 65, 82, 65, 82, + 163, 149, 134, 133, 163, 33, 114, 33, 114, 34, 98, 35, + 66, 49, 37, 0, 9, 64, 31, 16, 0, 12, 14, 34, + 66, 66, 34, 66, 66, 33, 82, 81, 33, 82, 81, 33, + 82, 81, 130, 226, 226, 226, 226, 226, 226, 198, 0, 12, + 96, 34, 16, 0, 12, 6, 53, 66, 113, 98, 113, 98, + 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, + 113, 98, 113, 98, 113, 113, 97, 150, 0, 12, 96, 31, + 16, 0, 12, 6, 53, 66, 97, 115, 81, 130, 81, 130, + 65, 147, 49, 162, 49, 162, 33, 179, 17, 194, 17, 195, + 226, 226, 225, 0, 13, 16, 49, 22, 0, 16, 69, 53, + 52, 66, 98, 81, 98, 98, 81, 99, 83, 65, 114, 65, + 18, 49, 130, 49, 34, 49, 131, 33, 35, 33, 146, 33, + 50, 17, 162, 17, 66, 17, 164, 68, 179, 83, 178, 98, + 194, 98, 209, 113, 0, 17, 48, 31, 16, 0, 12, 7, + 21, 83, 65, 146, 49, 178, 33, 180, 211, 226, 227, 193, + 18, 177, 35, 145, 67, 129, 82, 113, 99, 69, 39, 0, + 12, 32, 28, 15, 0, 11, 39, 36, 67, 81, 114, 81, + 115, 49, 146, 49, 162, 17, 178, 17, 194, 210, 210, 210, + 210, 210, 182, 0, 11, 112, 27, 13, 0, 9, 106, 50, + 83, 49, 98, 65, 83, 147, 162, 163, 162, 163, 147, 81, + 66, 97, 51, 97, 50, 98, 43, 0, 10, 25, 7, 240, + 240, 85, 34, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 85, 144, 25, 7, + 240, 240, 193, 97, 97, 113, 97, 97, 97, 113, 97, 97, + 97, 97, 113, 97, 97, 97, 113, 97, 97, 97, 32, 25, + 7, 240, 240, 85, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 37, 144, + 18, 12, 0, 8, 1, 163, 129, 34, 97, 65, 97, 66, + 65, 98, 178, 0, 21, 32, 7, 12, 0, 34, 74, 240, + 176, 10, 5, 240, 241, 66, 65, 81, 0, 10, 32, 22, + 11, 0, 15, 37, 82, 50, 66, 50, 146, 101, 66, 50, + 66, 50, 66, 50, 84, 19, 0, 8, 64, 30, 10, 0, + 6, 34, 130, 130, 130, 130, 130, 130, 19, 67, 34, 50, + 66, 34, 66, 34, 66, 34, 66, 34, 66, 35, 34, 50, + 19, 0, 8, 19, 9, 0, 12, 84, 66, 34, 34, 50, + 34, 114, 114, 114, 130, 49, 68, 0, 7, 16, 31, 10, + 0, 6, 115, 130, 130, 130, 130, 130, 67, 18, 50, 35, + 34, 66, 34, 66, 34, 66, 34, 66, 34, 66, 50, 35, + 67, 18, 0, 7, 96, 19, 10, 0, 14, 4, 81, 65, + 50, 66, 40, 34, 130, 130, 81, 50, 49, 84, 0, 8, + 24, 8, 240, 240, 195, 66, 33, 49, 34, 34, 98, 98, + 99, 82, 98, 98, 98, 98, 98, 98, 98, 0, 6, 96, + 30, 11, 0, 15, 52, 18, 34, 65, 17, 34, 66, 50, + 66, 65, 65, 85, 81, 161, 167, 72, 65, 81, 49, 97, + 49, 97, 49, 81, 85, 80, 30, 9, 240, 240, 242, 114, + 114, 114, 114, 114, 114, 19, 51, 34, 34, 50, 34, 50, + 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, 0, 7, + 17, 4, 240, 82, 34, 240, 50, 34, 34, 34, 34, 34, + 34, 34, 34, 240, 176, 26, 7, 240, 240, 130, 82, 240, + 240, 50, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 34, 18, 34, 17, 67, 48, 30, 10, 0, 6, 34, + 130, 130, 130, 130, 130, 130, 50, 50, 33, 82, 33, 82, + 17, 101, 82, 34, 66, 34, 66, 50, 50, 66, 0, 7, + 96, 20, 4, 240, 82, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 240, 176, 34, 15, 0, + 20, 83, 19, 35, 67, 35, 34, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 0, 11, 64, 25, 10, 0, 13, 99, + 19, 67, 34, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 0, 7, 96, 22, 10, 0, 14, + 4, 81, 65, 50, 66, 34, 66, 34, 66, 34, 66, 34, + 66, 49, 50, 84, 0, 8, 29, 11, 0, 15, 19, 19, + 83, 34, 66, 66, 50, 66, 50, 66, 50, 66, 50, 66, + 51, 34, 66, 19, 82, 146, 146, 146, 146, 146, 128, 29, + 11, 0, 15, 51, 19, 50, 35, 50, 66, 50, 66, 50, + 66, 50, 66, 50, 66, 66, 35, 83, 18, 146, 146, 146, + 146, 146, 146, 48, 19, 9, 0, 12, 51, 19, 51, 33, + 50, 49, 50, 114, 114, 114, 114, 114, 0, 7, 64, 19, + 8, 0, 11, 20, 49, 49, 49, 115, 100, 114, 33, 65, + 33, 65, 37, 0, 6, 48, 20, 7, 0, 7, 33, 82, + 82, 68, 66, 82, 82, 82, 82, 82, 82, 17, 67, 240, + 240, 224, 25, 10, 0, 13, 98, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 35, 67, 19, + 0, 7, 96, 20, 9, 0, 12, 51, 49, 50, 49, 50, + 49, 65, 33, 82, 17, 83, 114, 114, 0, 8, 48, 32, + 14, 0, 19, 35, 50, 114, 50, 49, 50, 33, 17, 49, + 65, 33, 18, 17, 82, 17, 18, 17, 83, 49, 17, 98, + 50, 114, 50, 113, 81, 0, 11, 22, 11, 0, 15, 20, + 19, 82, 17, 114, 17, 130, 146, 147, 113, 34, 81, 50, + 67, 21, 0, 8, 64, 28, 11, 0, 15, 35, 65, 66, + 49, 82, 49, 98, 17, 114, 17, 129, 17, 130, 146, 161, + 145, 161, 161, 98, 17, 114, 17, 115, 128, 19, 9, 0, + 12, 54, 49, 50, 98, 114, 98, 113, 114, 49, 49, 65, + 34, 35, 0, 7, 26, 7, 240, 240, 145, 81, 82, 82, + 82, 82, 82, 82, 82, 81, 66, 113, 98, 82, 82, 82, + 82, 82, 82, 97, 113, 32, 24, 3, 240, 49, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 32, 26, 7, 240, 240, 81, 113, + 98, 82, 82, 82, 82, 82, 82, 97, 114, 65, 82, 82, + 82, 82, 82, 82, 82, 81, 81, 96, 11, 11, 0, 19, + 67, 49, 34, 36, 0, 14, 16, 4, 8, 0, 26, 17, + 4, 240, 240, 226, 34, 225, 49, 49, 50, 34, 34, 34, + 34, 34, 34, 32, 33, 9, 0, 7, 65, 129, 113, 129, + 113, 98, 17, 66, 19, 34, 17, 18, 34, 17, 82, 17, + 82, 17, 83, 114, 49, 68, 65, 129, 129, 113, 129, 129, + 128, 28, 14, 0, 11, 52, 130, 65, 113, 51, 98, 50, + 114, 194, 167, 146, 194, 194, 193, 81, 66, 17, 81, 49, + 40, 52, 36, 0, 11, 24, 10, 0, 13, 97, 20, 17, + 49, 65, 49, 97, 33, 97, 33, 97, 33, 97, 49, 65, + 49, 20, 17, 0, 9, 26, 11, 0, 8, 35, 81, 50, + 81, 65, 65, 82, 49, 98, 17, 115, 104, 98, 104, 98, + 146, 146, 146, 146, 0, 8, 112, 20, 3, 240, 49, 33, + 33, 33, 33, 33, 33, 33, 225, 33, 33, 33, 33, 33, + 33, 33, 32, 38, 9, 0, 7, 4, 65, 50, 34, 35, + 34, 35, 50, 130, 82, 18, 65, 50, 49, 66, 34, 50, + 50, 49, 51, 33, 68, 99, 114, 66, 34, 35, 34, 34, + 49, 50, 49, 83, 64, 11, 8, 0, 7, 2, 34, 34, + 34, 0, 17, 32, 47, 17, 0, 11, 37, 162, 82, 113, + 145, 81, 53, 49, 65, 33, 65, 49, 49, 34, 145, 33, + 34, 145, 33, 34, 145, 33, 34, 145, 33, 49, 65, 65, + 49, 34, 49, 49, 65, 67, 65, 81, 145, 113, 113, 151, + 0, 13, 64, 17, 7, 240, 240, 195, 65, 33, 82, 50, + 17, 49, 33, 66, 17, 0, 12, 64, 17, 7, 0, 11, + 65, 33, 33, 33, 49, 33, 49, 33, 65, 33, 0, 7, + 32, 12, 12, 0, 19, 74, 177, 177, 177, 177, 0, 12, + 32, 8, 8, 0, 15, 6, 0, 10, 32, 51, 17, 0, + 11, 37, 162, 82, 113, 145, 81, 37, 65, 65, 50, 34, + 33, 49, 66, 34, 49, 33, 66, 34, 49, 33, 68, 81, + 33, 66, 34, 49, 33, 66, 34, 49, 49, 50, 34, 33, + 65, 36, 34, 17, 81, 145, 113, 113, 151, 0, 13, 64, + 8, 8, 0, 8, 6, 0, 17, 32, 21, 9, 0, 5, + 115, 81, 49, 49, 81, 33, 81, 33, 81, 33, 81, 49, + 49, 83, 0, 15, 16, 19, 11, 0, 12, 113, 161, 161, + 161, 105, 97, 161, 161, 161, 161, 240, 41, 0, 7, 16, + 17, 7, 240, 240, 211, 49, 34, 33, 34, 34, 18, 66, + 65, 100, 0, 11, 80, 19, 8, 0, 6, 6, 33, 49, + 49, 18, 98, 130, 49, 34, 33, 50, 51, 0, 12, 64, + 11, 5, 240, 240, 33, 50, 49, 49, 0, 10, 64, 30, + 13, 0, 17, 114, 66, 82, 66, 82, 66, 82, 66, 82, + 65, 97, 81, 97, 66, 98, 39, 33, 20, 34, 49, 193, + 193, 193, 194, 178, 176, 44, 11, 0, 8, 71, 51, 33, + 68, 33, 68, 33, 68, 33, 68, 33, 83, 33, 113, 33, + 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, + 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, + 64, 9, 4, 0, 6, 66, 34, 0, 5, 96, 11, 6, + 0, 16, 1, 65, 17, 33, 33, 50, 144, 16, 6, 240, + 240, 129, 81, 66, 49, 17, 81, 81, 81, 67, 0, 9, + 32, 17, 7, 240, 240, 211, 49, 49, 33, 49, 33, 49, + 33, 33, 66, 0, 12, 96, 17, 7, 0, 11, 49, 33, + 65, 33, 49, 33, 49, 33, 33, 33, 0, 7, 48, 41, + 15, 0, 10, 82, 81, 113, 97, 97, 83, 97, 113, 81, + 129, 66, 129, 65, 34, 81, 49, 50, 67, 33, 49, 145, + 65, 129, 65, 17, 113, 65, 17, 97, 69, 81, 113, 81, + 129, 0, 11, 80, 43, 16, 0, 11, 33, 113, 113, 113, + 97, 114, 81, 113, 17, 81, 145, 65, 161, 65, 161, 49, + 36, 67, 17, 33, 50, 113, 33, 50, 97, 51, 18, 97, + 113, 97, 113, 97, 113, 33, 65, 101, 0, 12, 32, 43, + 15, 0, 10, 82, 53, 81, 65, 18, 82, 98, 81, 146, + 33, 162, 33, 113, 34, 17, 34, 49, 49, 18, 34, 67, + 33, 49, 145, 65, 145, 49, 17, 113, 65, 17, 113, 68, + 81, 113, 225, 0, 11, 80, 22, 8, 0, 11, 66, 98, + 240, 113, 113, 83, 65, 33, 50, 33, 50, 98, 98, 98, + 113, 34, 67, 48, 35, 16, 240, 82, 242, 240, 17, 240, + 241, 242, 226, 226, 212, 193, 18, 177, 35, 161, 50, 161, + 50, 167, 129, 82, 129, 82, 113, 99, 97, 114, 69, 54, + 0, 12, 32, 36, 16, 240, 146, 210, 209, 240, 240, 33, + 226, 226, 227, 193, 18, 193, 18, 177, 35, 161, 50, 161, + 50, 167, 129, 82, 129, 82, 129, 83, 97, 114, 69, 54, + 0, 12, 32, 38, 16, 240, 114, 209, 17, 193, 49, 161, + 66, 193, 241, 227, 211, 193, 18, 193, 19, 177, 34, 177, + 34, 161, 51, 151, 145, 66, 129, 98, 113, 98, 113, 99, + 68, 55, 0, 12, 32, 37, 16, 240, 240, 99, 33, 145, + 35, 240, 225, 241, 227, 211, 193, 18, 193, 19, 177, 34, + 177, 34, 161, 51, 151, 145, 66, 129, 98, 113, 98, 113, + 99, 68, 55, 0, 12, 32, 36, 17, 240, 240, 130, 50, + 162, 50, 240, 241, 240, 17, 243, 227, 227, 209, 19, 193, + 34, 193, 35, 161, 51, 167, 161, 67, 129, 98, 129, 98, + 129, 99, 69, 55, 0, 13, 37, 16, 83, 193, 49, 177, + 49, 177, 49, 195, 225, 241, 227, 211, 211, 193, 19, 177, + 34, 177, 34, 161, 51, 151, 145, 66, 129, 83, 113, 98, + 113, 98, 85, 39, 0, 12, 32, 44, 23, 0, 18, 44, + 193, 18, 97, 193, 18, 97, 177, 34, 65, 193, 50, 65, + 193, 50, 50, 203, 177, 66, 50, 161, 82, 65, 161, 82, + 113, 97, 98, 113, 81, 114, 113, 81, 114, 98, 38, 60, + 0, 17, 64, 35, 14, 0, 11, 8, 81, 83, 65, 114, + 50, 129, 34, 145, 34, 194, 194, 194, 194, 145, 49, 145, + 50, 114, 66, 83, 104, 240, 113, 226, 146, 33, 145, 49, + 163, 96, 36, 14, 240, 34, 210, 210, 240, 240, 91, 82, + 97, 82, 97, 82, 65, 114, 65, 114, 50, 119, 114, 50, + 114, 65, 114, 113, 66, 113, 66, 113, 66, 98, 44, 0, + 10, 96, 36, 14, 240, 98, 179, 162, 240, 240, 91, 82, + 97, 82, 97, 82, 65, 114, 65, 114, 50, 119, 114, 50, + 114, 65, 114, 113, 66, 113, 66, 113, 66, 98, 44, 0, + 10, 96, 39, 14, 240, 66, 177, 18, 145, 50, 129, 66, + 240, 59, 82, 97, 82, 97, 82, 65, 114, 65, 114, 50, + 119, 114, 50, 114, 65, 114, 113, 66, 113, 66, 113, 66, + 98, 44, 0, 10, 96, 37, 14, 240, 240, 18, 50, 114, + 50, 240, 240, 43, 82, 97, 82, 194, 65, 114, 65, 114, + 50, 119, 114, 65, 114, 65, 114, 113, 66, 113, 66, 113, + 66, 98, 44, 0, 10, 96, 23, 8, 130, 99, 114, 240, + 86, 66, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 70, 0, 6, 32, 23, 8, 194, 83, 66, 240, 86, + 66, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 70, 0, 6, 32, 25, 9, 178, 97, 18, 65, 50, 130, + 182, 82, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 86, 0, 7, 16, 24, 9, 240, 50, 50, 34, 50, + 240, 87, 66, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 87, 0, 7, 32, 15, 0, 11, 41, 130, 82, + 98, 98, 82, 113, 82, 114, 66, 114, 39, 66, 66, 114, + 66, 114, 66, 114, 66, 113, 82, 98, 82, 82, 73, 0, + 12, 47, 16, 240, 99, 33, 145, 35, 0, 6, 101, 69, + 68, 81, 97, 19, 65, 97, 34, 65, 97, 35, 49, 97, + 50, 49, 97, 66, 33, 97, 67, 17, 97, 82, 17, 97, + 84, 97, 99, 97, 114, 97, 114, 69, 97, 0, 12, 64, + 36, 15, 240, 65, 226, 226, 241, 240, 181, 130, 82, 82, + 113, 82, 114, 50, 146, 34, 146, 34, 146, 34, 146, 34, + 146, 34, 146, 49, 130, 66, 114, 82, 82, 133, 0, 12, + 36, 15, 240, 129, 210, 194, 193, 240, 213, 130, 82, 82, + 113, 82, 114, 50, 146, 34, 146, 34, 146, 34, 146, 34, + 146, 34, 146, 49, 130, 66, 114, 82, 82, 133, 0, 12, + 37, 15, 240, 98, 178, 18, 226, 240, 240, 149, 130, 82, + 82, 113, 82, 114, 50, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 49, 130, 66, 114, 82, 82, 133, 0, + 12, 36, 15, 240, 67, 177, 35, 0, 6, 117, 130, 82, + 82, 113, 82, 114, 50, 146, 34, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 49, 130, 66, 114, 82, 82, 133, 0, + 12, 38, 15, 240, 240, 50, 50, 130, 50, 240, 240, 149, + 130, 82, 82, 113, 82, 114, 50, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 49, 130, 66, 114, 82, 82, + 133, 0, 12, 20, 9, 0, 12, 49, 81, 49, 50, 65, + 18, 98, 99, 82, 33, 50, 65, 33, 0, 8, 112, 41, + 15, 0, 11, 101, 49, 66, 83, 66, 114, 66, 99, 50, + 97, 34, 34, 81, 50, 34, 66, 50, 34, 50, 66, 34, + 49, 82, 34, 33, 98, 49, 17, 98, 66, 114, 67, 82, + 65, 53, 0, 12, 39, 16, 240, 82, 242, 242, 240, 17, + 240, 134, 53, 66, 113, 98, 113, 98, 113, 98, 113, 98, + 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, + 113, 113, 97, 150, 0, 12, 96, 38, 16, 240, 146, 226, + 209, 240, 240, 166, 53, 66, 113, 98, 113, 98, 113, 98, + 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, + 113, 98, 113, 113, 97, 150, 0, 12, 96, 40, 16, 240, + 130, 194, 17, 240, 17, 240, 240, 134, 53, 66, 113, 98, + 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, + 113, 98, 113, 98, 113, 98, 113, 113, 97, 150, 0, 12, + 96, 40, 16, 240, 240, 98, 50, 146, 50, 240, 240, 118, + 53, 66, 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, + 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 113, + 97, 150, 0, 12, 96, 32, 15, 240, 145, 210, 194, 193, + 240, 135, 36, 67, 81, 114, 81, 115, 49, 146, 49, 162, + 17, 178, 17, 194, 210, 210, 210, 210, 210, 182, 0, 11, + 112, 32, 13, 0, 9, 102, 146, 178, 178, 152, 114, 65, + 98, 81, 82, 82, 66, 82, 66, 82, 66, 82, 66, 66, + 87, 98, 178, 178, 178, 178, 178, 150, 112, 35, 10, 0, + 6, 68, 81, 50, 65, 50, 50, 50, 50, 49, 66, 33, + 82, 18, 82, 49, 66, 50, 50, 66, 34, 66, 34, 66, + 36, 34, 35, 49, 50, 19, 0, 8, 26, 11, 0, 8, + 65, 162, 161, 240, 245, 82, 50, 66, 50, 146, 101, 66, + 50, 66, 50, 66, 50, 84, 19, 0, 8, 64, 26, 11, + 0, 8, 97, 146, 145, 240, 245, 82, 50, 66, 50, 146, + 101, 66, 50, 66, 50, 66, 50, 84, 19, 0, 8, 64, + 29, 11, 0, 8, 82, 129, 17, 113, 34, 162, 240, 21, + 82, 50, 66, 50, 146, 101, 66, 50, 66, 50, 66, 50, + 84, 19, 0, 8, 64, 27, 11, 0, 9, 99, 33, 65, + 35, 240, 213, 82, 50, 66, 50, 146, 101, 66, 50, 66, + 50, 66, 50, 84, 19, 0, 8, 64, 27, 11, 0, 9, + 82, 34, 82, 34, 240, 213, 82, 50, 66, 50, 146, 101, + 66, 50, 66, 50, 66, 50, 84, 19, 0, 8, 64, 31, + 11, 0, 7, 19, 113, 49, 97, 49, 97, 49, 115, 240, + 53, 82, 50, 66, 50, 146, 101, 66, 50, 66, 50, 66, + 50, 84, 19, 0, 8, 64, 28, 14, 0, 19, 67, 36, + 65, 50, 50, 49, 50, 50, 119, 54, 114, 50, 114, 50, + 65, 34, 33, 18, 33, 67, 52, 0, 10, 112, 24, 9, + 0, 12, 84, 66, 49, 34, 50, 34, 114, 114, 114, 130, + 49, 68, 240, 17, 113, 17, 81, 33, 98, 208, 23, 10, + 0, 7, 98, 145, 161, 240, 196, 81, 65, 50, 66, 40, + 34, 130, 130, 81, 50, 49, 84, 0, 8, 24, 10, 0, + 8, 2, 129, 145, 129, 240, 52, 81, 65, 50, 66, 40, + 34, 130, 130, 81, 50, 49, 84, 0, 8, 24, 10, 0, + 8, 1, 116, 97, 34, 145, 244, 81, 65, 50, 66, 40, + 34, 130, 130, 81, 50, 49, 84, 0, 8, 24, 10, 0, + 8, 114, 34, 66, 34, 240, 164, 81, 65, 50, 66, 40, + 34, 130, 130, 81, 50, 49, 84, 0, 8, 18, 5, 240, + 242, 65, 81, 210, 50, 50, 50, 50, 50, 50, 50, 50, + 240, 240, 32, 17, 4, 240, 161, 34, 33, 178, 34, 34, + 34, 34, 34, 34, 34, 34, 240, 176, 20, 6, 240, 240, + 114, 49, 17, 82, 242, 66, 66, 66, 66, 66, 66, 66, + 66, 240, 240, 144, 21, 8, 0, 7, 2, 34, 34, 34, + 240, 82, 98, 98, 98, 98, 98, 98, 98, 98, 0, 6, + 64, 29, 10, 0, 7, 98, 33, 99, 114, 113, 18, 146, + 85, 65, 66, 34, 66, 34, 66, 34, 66, 34, 66, 34, + 66, 49, 50, 84, 0, 8, 30, 10, 0, 9, 2, 33, + 65, 35, 240, 131, 19, 67, 34, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 0, 7, 96, + 27, 10, 0, 7, 113, 145, 145, 161, 240, 36, 81, 65, + 50, 66, 34, 66, 34, 66, 34, 66, 34, 66, 49, 50, + 84, 0, 8, 27, 10, 0, 8, 1, 145, 129, 145, 240, + 52, 81, 65, 50, 66, 34, 66, 34, 66, 34, 66, 34, + 66, 49, 50, 84, 0, 8, 28, 10, 0, 7, 114, 113, + 18, 97, 33, 146, 244, 81, 65, 50, 66, 34, 66, 34, + 66, 34, 66, 34, 66, 49, 50, 84, 0, 8, 27, 10, + 0, 9, 2, 33, 65, 19, 240, 180, 81, 65, 50, 66, + 34, 66, 34, 66, 34, 66, 34, 66, 49, 50, 84, 0, + 8, 27, 10, 0, 8, 114, 34, 66, 34, 240, 164, 81, + 65, 50, 66, 34, 66, 34, 66, 34, 66, 34, 66, 49, + 50, 84, 0, 8, 14, 12, 0, 15, 66, 162, 240, 250, + 240, 242, 162, 0, 11, 32, 27, 10, 0, 14, 4, 17, + 49, 65, 50, 51, 34, 33, 18, 34, 17, 34, 34, 17, + 34, 35, 50, 49, 50, 49, 20, 0, 8, 29, 10, 0, + 7, 97, 145, 161, 240, 178, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 35, 67, 19, 0, + 7, 96, 29, 10, 0, 7, 114, 129, 129, 240, 194, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 35, 67, 19, 0, 7, 96, 30, 10, 0, 7, 113, + 131, 97, 33, 240, 162, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 35, 67, 19, 0, 7, + 96, 30, 10, 0, 8, 98, 34, 66, 34, 240, 146, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 35, 67, 19, 0, 7, 96, 31, 11, 0, 9, 1, + 146, 145, 240, 211, 65, 66, 49, 97, 49, 98, 33, 98, + 17, 131, 131, 145, 161, 161, 145, 161, 98, 17, 114, 17, + 115, 128, 34, 10, 0, 6, 35, 114, 130, 130, 130, 130, + 130, 19, 67, 49, 50, 66, 34, 66, 34, 66, 34, 66, + 34, 66, 34, 65, 54, 66, 130, 130, 130, 130, 130, 128, + 32, 10, 0, 9, 2, 34, 66, 34, 240, 130, 65, 50, + 65, 66, 33, 82, 33, 97, 33, 99, 130, 130, 129, 145, + 145, 129, 97, 33, 97, 33, 99, 112, +}; + +//***************************************************************************** +// +// The glyph offset table for the 20 point Theanodidot font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanodidot20[] = +{ + 0, 5, 22, 41, 73, 124, 168, 206, + 218, 243, 267, 290, 306, 317, 325, 333, + 358, 392, 414, 442, 470, 496, 525, 556, + 581, 612, 643, 654, 669, 686, 696, 713, + 736, 792, 824, 856, 885, 917, 949, 978, + 1009, 1043, 1064, 1087, 1121, 1146, 1199, 1241, + 1273, 1300, 1337, 1370, 1398, 1429, 1463, 1494, + 1543, 1574, 1602, 1629, 1654, 1679, 1704, 1722, + 1729, 1739, 1761, 1791, 1810, 1841, 1860, 1884, + 1914, 1944, 1961, 1987, 2017, 2037, 2071, 2096, + 2118, 2147, 2176, 2195, 2214, 2234, 2259, 2279, + 2311, 2333, 2361, 2380, 2406, 2430, 2456, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2467, 2471, 2488, 2521, 2549, 2573, 2599, 2619, + 2657, 2668, 2715, 2732, 2749, 2761, 2769, 2820, + 2828, 2849, 2868, 2885, 2904, 2915, 2945, 2989, + 2998, 3009, 3025, 3042, 3059, 3100, 3143, 3186, + 3208, 3243, 3279, 3317, 3354, 3390, 3427, 3471, + 3506, 3542, 3578, 3617, 3654, 3677, 3700, 3725, + 3749, 3781, 3828, 3864, 3900, 3937, 3973, 4011, + 4031, 4072, 4111, 4149, 4189, 4229, 4261, 4293, + 4328, 4354, 4380, 4409, 4436, 4463, 4494, 4522, + 4546, 4569, 4593, 4617, 4641, 4659, 4676, 4696, + 4717, 4746, 4776, 4803, 4830, 4858, 4885, 4912, + 4926, 4953, 4982, 5011, 5041, 5071, 5102, 5136, +}; + +//***************************************************************************** +// +// The font definition for the 20 point Theanodidot font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanodidot20 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 20, + + // + // The height of the font. + // + 26, + + // + // The baseline of the font. + // + 20, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanodidot20, + + // + // A pointer to the actual font data + // + g_pui8Theanodidot20Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanodidot22.c b/third_party/fonts/ofl/fonts/fonttheanodidot22.c new file mode 100644 index 0000000..c6ff43d --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanodidot22.c @@ -0,0 +1,704 @@ +//***************************************************************************** +// +// fonttheanodidot22.c - Font definition for the 22pt Theanodidot font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanodidot +// Size: 22 point +// Bold: no +// Italic: no +// Memory usage: 6012 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 22 point Theanodidot font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanodidot22Data[5809] = +{ + 5, 9, 0, 32, 80, 21, 5, 240, 163, 35, 35, 35, + 35, 35, 49, 65, 65, 65, 65, 65, 225, 51, 35, 240, + 240, 112, 19, 8, 240, 240, 162, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 33, 49, 0, 18, 48, 37, 13, 0, + 10, 33, 65, 113, 49, 129, 49, 113, 65, 75, 81, 65, + 113, 49, 129, 49, 129, 49, 113, 65, 91, 65, 49, 129, + 49, 129, 49, 113, 65, 113, 65, 0, 12, 16, 58, 13, + 0, 6, 113, 33, 145, 33, 149, 99, 33, 17, 65, 33, + 33, 33, 49, 33, 33, 18, 49, 33, 33, 17, 66, 17, + 33, 116, 17, 119, 135, 97, 37, 81, 33, 34, 34, 17, + 33, 49, 34, 17, 33, 49, 33, 33, 33, 33, 49, 33, + 33, 17, 87, 129, 33, 0, 10, 64, 53, 17, 0, 10, + 114, 113, 97, 33, 97, 82, 34, 65, 98, 34, 49, 114, + 34, 49, 114, 34, 33, 145, 33, 49, 162, 49, 240, 17, + 241, 51, 161, 33, 49, 129, 34, 50, 113, 34, 50, 97, + 50, 50, 81, 66, 50, 81, 81, 49, 209, 17, 0, 15, + 48, 43, 18, 0, 11, 115, 225, 49, 194, 49, 194, 49, + 194, 33, 227, 243, 225, 18, 39, 65, 35, 65, 97, 66, + 49, 98, 82, 33, 98, 83, 17, 98, 99, 114, 99, 115, + 98, 132, 52, 134, 52, 0, 16, 16, 12, 4, 240, 82, + 34, 34, 34, 34, 33, 0, 9, 48, 28, 7, 240, 240, + 145, 81, 97, 81, 97, 82, 81, 97, 82, 82, 82, 82, + 82, 82, 82, 97, 97, 98, 97, 97, 113, 97, 240, 32, + 28, 7, 240, 240, 81, 113, 97, 113, 97, 98, 97, 97, + 98, 82, 82, 82, 82, 82, 82, 81, 97, 82, 81, 97, + 81, 97, 81, 208, 25, 10, 0, 6, 82, 130, 81, 33, + 34, 34, 17, 19, 67, 100, 82, 17, 19, 33, 33, 34, + 82, 130, 0, 18, 16, 18, 13, 0, 18, 65, 193, 193, + 193, 193, 123, 113, 193, 193, 193, 193, 0, 12, 32, 13, + 6, 0, 15, 19, 51, 81, 81, 65, 65, 65, 240, 32, + 8, 9, 0, 19, 23, 0, 12, 80, 10, 5, 0, 12, + 1, 51, 35, 240, 240, 112, 27, 8, 0, 6, 81, 98, + 97, 113, 113, 113, 97, 113, 113, 113, 98, 97, 113, 113, + 98, 97, 113, 113, 113, 97, 113, 113, 240, 37, 12, 0, + 9, 52, 113, 65, 82, 65, 81, 97, 65, 97, 50, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 49, 97, + 65, 97, 66, 66, 81, 65, 116, 0, 11, 16, 23, 10, + 0, 8, 1, 130, 115, 82, 18, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 88, 0, 9, 32, 11, 0, + 8, 69, 81, 66, 49, 98, 33, 98, 33, 98, 33, 33, + 50, 36, 50, 50, 50, 146, 130, 145, 145, 145, 145, 81, + 56, 41, 0, 9, 112, 30, 12, 0, 9, 52, 98, 50, + 82, 66, 66, 66, 162, 161, 161, 131, 195, 177, 178, 35, + 82, 35, 82, 34, 98, 49, 82, 85, 0, 11, 16, 29, + 13, 0, 8, 114, 178, 178, 162, 178, 162, 177, 33, 130, + 18, 129, 34, 113, 50, 97, 66, 91, 130, 178, 178, 178, + 150, 0, 11, 96, 31, 11, 0, 8, 49, 65, 85, 100, + 97, 161, 161, 35, 98, 50, 49, 82, 162, 146, 146, 34, + 82, 34, 82, 34, 81, 49, 81, 85, 0, 10, 32, 35, + 12, 0, 9, 68, 98, 65, 81, 66, 66, 66, 65, 162, + 162, 36, 68, 50, 50, 98, 34, 98, 34, 98, 34, 98, + 49, 98, 50, 81, 81, 66, 100, 0, 11, 16, 28, 12, + 0, 9, 35, 65, 53, 49, 49, 22, 49, 113, 49, 97, + 177, 161, 177, 177, 161, 162, 162, 146, 162, 162, 162, 0, + 11, 48, 36, 12, 0, 9, 37, 97, 81, 65, 113, 49, + 113, 49, 113, 50, 81, 83, 33, 117, 113, 20, 81, 67, + 49, 99, 33, 114, 33, 114, 33, 113, 65, 82, 85, 0, + 11, 16, 35, 12, 0, 9, 52, 98, 65, 81, 82, 50, + 97, 50, 98, 34, 98, 34, 98, 34, 98, 50, 67, 84, + 18, 162, 161, 66, 66, 66, 65, 81, 66, 100, 0, 11, + 32, 14, 5, 0, 7, 67, 35, 49, 240, 145, 51, 35, + 240, 240, 112, 18, 6, 0, 9, 19, 51, 65, 240, 240, + 67, 51, 81, 81, 65, 65, 65, 240, 32, 18, 12, 0, + 17, 66, 130, 130, 131, 115, 146, 178, 194, 194, 194, 193, + 0, 10, 96, 10, 13, 0, 22, 107, 240, 219, 0, 18, + 16, 18, 12, 0, 16, 66, 194, 194, 179, 179, 162, 146, + 130, 130, 130, 145, 0, 11, 112, 27, 9, 0, 5, 100, + 66, 34, 50, 49, 130, 114, 114, 114, 49, 49, 68, 81, + 129, 129, 129, 240, 33, 115, 99, 0, 8, 80, 60, 19, + 0, 19, 117, 194, 82, 130, 145, 98, 177, 66, 67, 18, + 33, 66, 50, 35, 49, 34, 50, 50, 65, 34, 50, 50, + 65, 34, 34, 66, 65, 34, 34, 66, 65, 34, 34, 65, + 65, 50, 34, 50, 65, 65, 34, 33, 17, 49, 82, 35, + 51, 114, 240, 50, 145, 130, 98, 182, 0, 8, 35, 17, + 0, 11, 65, 242, 242, 243, 227, 209, 18, 209, 19, 193, + 19, 177, 50, 177, 51, 161, 51, 152, 145, 83, 129, 83, + 113, 115, 97, 115, 69, 55, 0, 15, 16, 36, 14, 0, + 10, 73, 114, 66, 98, 82, 82, 82, 82, 82, 82, 82, + 82, 66, 102, 130, 66, 98, 97, 82, 98, 66, 98, 66, + 98, 66, 98, 66, 82, 57, 0, 12, 112, 31, 15, 0, + 11, 120, 82, 83, 65, 130, 50, 145, 49, 161, 34, 210, + 210, 210, 210, 210, 225, 161, 50, 145, 65, 130, 81, 99, + 105, 0, 13, 48, 37, 16, 0, 12, 10, 130, 97, 114, + 113, 98, 114, 82, 129, 82, 130, 66, 130, 66, 130, 66, + 130, 66, 130, 66, 130, 66, 129, 82, 114, 82, 113, 98, + 97, 90, 0, 14, 96, 36, 15, 0, 11, 44, 82, 98, + 82, 113, 82, 113, 82, 65, 130, 65, 130, 50, 135, 130, + 50, 130, 65, 130, 65, 130, 129, 66, 129, 66, 129, 66, + 114, 45, 0, 13, 48, 34, 14, 0, 10, 76, 66, 98, + 66, 113, 66, 113, 66, 65, 33, 66, 65, 114, 50, 119, + 114, 50, 114, 65, 114, 65, 114, 65, 114, 194, 194, 166, + 0, 13, 32, 34, 17, 0, 13, 56, 114, 83, 97, 130, + 82, 145, 81, 161, 66, 242, 242, 242, 242, 103, 34, 146, + 81, 146, 82, 130, 97, 130, 113, 99, 134, 33, 0, 15, + 48, 38, 17, 0, 12, 102, 54, 66, 114, 98, 114, 98, + 114, 98, 114, 98, 114, 98, 114, 107, 98, 114, 98, 114, + 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 70, 54, + 0, 15, 16, 23, 8, 0, 6, 6, 66, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, + 7, 32, 26, 10, 0, 7, 87, 98, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 81, 34, 66, 34, 65, 49, + 99, 0, 9, 64, 38, 17, 0, 12, 102, 37, 98, 81, + 146, 65, 162, 65, 162, 49, 178, 33, 194, 18, 198, 178, + 35, 162, 35, 162, 51, 146, 67, 130, 82, 130, 83, 114, + 99, 70, 39, 0, 15, 16, 28, 15, 0, 11, 38, 178, + 210, 210, 210, 210, 210, 210, 210, 210, 210, 129, 66, 129, + 66, 114, 66, 114, 66, 99, 45, 0, 13, 48, 61, 19, + 0, 14, 37, 117, 68, 99, 97, 18, 99, 97, 18, 81, + 18, 97, 19, 65, 18, 97, 19, 65, 18, 97, 34, 49, + 34, 97, 34, 49, 34, 97, 35, 33, 34, 97, 50, 17, + 50, 97, 50, 17, 50, 97, 52, 50, 97, 66, 66, 97, + 66, 66, 97, 66, 66, 69, 33, 54, 0, 16, 112, 47, + 17, 0, 12, 102, 69, 68, 97, 97, 19, 81, 97, 35, + 65, 97, 35, 65, 97, 51, 49, 97, 51, 49, 97, 67, + 33, 97, 82, 33, 97, 83, 17, 97, 100, 97, 100, 97, + 115, 97, 130, 97, 130, 69, 113, 0, 15, 48, 37, 17, + 0, 13, 53, 162, 82, 113, 145, 82, 146, 65, 177, 50, + 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, 178, 49, + 177, 66, 146, 81, 145, 113, 113, 151, 0, 15, 80, 31, + 14, 0, 10, 73, 114, 81, 98, 82, 82, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 82, 87, 114, 194, 194, + 194, 194, 166, 0, 13, 32, 45, 18, 0, 14, 21, 178, + 82, 129, 145, 98, 146, 81, 177, 66, 178, 50, 178, 50, + 178, 50, 178, 50, 178, 50, 178, 65, 177, 82, 146, 97, + 145, 129, 113, 167, 225, 240, 35, 240, 20, 243, 240, 37, + 240, 240, 128, 37, 16, 0, 12, 9, 146, 66, 130, 82, + 114, 82, 114, 82, 114, 82, 114, 66, 134, 162, 66, 130, + 82, 114, 82, 114, 82, 114, 82, 114, 82, 114, 82, 86, + 68, 0, 14, 32, 30, 13, 0, 10, 22, 98, 50, 82, + 81, 82, 178, 180, 165, 135, 149, 164, 33, 115, 33, 130, + 34, 114, 34, 113, 51, 82, 49, 37, 0, 12, 34, 17, + 0, 12, 111, 34, 66, 67, 34, 66, 82, 33, 82, 82, + 33, 82, 97, 33, 82, 97, 130, 97, 130, 242, 242, 242, + 242, 242, 242, 242, 214, 0, 15, 96, 38, 17, 0, 12, + 102, 69, 66, 129, 98, 129, 98, 129, 98, 129, 98, 129, + 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, + 98, 129, 98, 114, 114, 82, 165, 0, 15, 96, 34, 17, + 0, 12, 103, 53, 67, 113, 99, 97, 130, 97, 131, 81, + 131, 65, 162, 65, 163, 49, 178, 33, 195, 17, 195, 17, + 211, 227, 227, 241, 240, 17, 0, 16, 56, 24, 0, 18, + 6, 54, 37, 66, 114, 97, 99, 98, 97, 99, 99, 81, + 114, 81, 18, 65, 131, 65, 18, 65, 131, 49, 35, 49, + 146, 49, 50, 33, 163, 33, 50, 33, 163, 17, 67, 17, + 178, 17, 82, 17, 180, 83, 195, 99, 210, 114, 210, 113, + 225, 129, 0, 22, 35, 17, 0, 12, 103, 37, 98, 81, + 147, 65, 163, 33, 179, 33, 196, 226, 243, 228, 193, 19, + 193, 35, 161, 66, 161, 67, 129, 99, 97, 130, 70, 39, + 0, 15, 16, 31, 17, 0, 12, 104, 37, 82, 97, 131, + 81, 146, 81, 147, 49, 178, 49, 194, 17, 210, 17, 226, + 242, 242, 242, 242, 242, 242, 214, 0, 15, 80, 31, 14, + 0, 10, 75, 50, 99, 50, 83, 65, 99, 65, 83, 178, + 179, 178, 179, 163, 179, 163, 97, 66, 113, 51, 98, 50, + 114, 44, 0, 12, 64, 28, 7, 240, 240, 85, 34, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 85, 144, 27, 8, 0, + 6, 1, 113, 114, 113, 113, 113, 113, 129, 113, 113, 113, + 129, 113, 113, 113, 114, 113, 113, 113, 113, 129, 113, 160, + 28, 7, 240, 240, 85, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 37, 144, 21, 13, 0, 8, 82, 161, 18, 145, + 33, 129, 50, 97, 82, 81, 82, 65, 114, 194, 0, 26, + 32, 8, 13, 0, 40, 91, 240, 240, 176, 10, 5, 240, + 242, 50, 65, 81, 0, 12, 16, 24, 11, 0, 16, 84, + 98, 49, 82, 50, 146, 131, 83, 18, 66, 50, 66, 50, + 66, 35, 83, 35, 0, 9, 112, 34, 13, 0, 8, 20, + 178, 178, 178, 178, 178, 178, 178, 20, 99, 50, 82, 82, + 66, 82, 66, 82, 66, 82, 66, 82, 66, 82, 67, 50, + 52, 20, 0, 11, 112, 22, 10, 0, 15, 52, 66, 50, + 49, 66, 34, 66, 34, 130, 130, 130, 81, 50, 49, 85, + 0, 9, 16, 34, 13, 0, 8, 100, 178, 178, 178, 178, + 178, 178, 100, 18, 82, 51, 66, 82, 66, 82, 66, 82, + 66, 82, 66, 82, 66, 82, 82, 51, 100, 20, 0, 11, + 80, 22, 10, 0, 15, 36, 82, 49, 65, 66, 34, 66, + 40, 34, 130, 130, 81, 50, 49, 84, 0, 9, 32, 26, + 11, 0, 7, 67, 113, 34, 81, 50, 66, 146, 146, 146, + 118, 114, 146, 146, 146, 146, 146, 146, 146, 118, 0, 10, + 32, 35, 12, 0, 18, 51, 34, 65, 50, 17, 50, 66, + 66, 66, 66, 66, 82, 34, 81, 35, 81, 177, 184, 88, + 81, 51, 65, 82, 50, 82, 50, 81, 66, 66, 100, 96, + 34, 14, 0, 8, 100, 194, 194, 194, 194, 194, 194, 194, + 35, 116, 34, 99, 50, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 66, 98, 66, 69, 37, 0, 12, 64, 21, 6, + 240, 240, 18, 66, 240, 240, 51, 66, 66, 66, 66, 66, + 66, 66, 66, 52, 240, 240, 224, 29, 8, 240, 240, 226, + 98, 240, 240, 243, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 34, 34, 34, 34, 34, 33, 67, 64, + 32, 14, 0, 8, 100, 194, 194, 194, 194, 194, 194, 194, + 36, 98, 49, 130, 33, 146, 17, 165, 146, 34, 130, 34, + 130, 50, 114, 66, 76, 0, 12, 64, 24, 8, 240, 240, + 164, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 70, 0, 7, 32, 38, 20, 0, 30, + 4, 35, 36, 116, 33, 17, 50, 99, 50, 66, 98, 66, + 66, 98, 66, 66, 98, 66, 66, 98, 66, 66, 98, 66, + 66, 98, 66, 66, 69, 36, 37, 0, 17, 96, 27, 14, + 0, 21, 4, 35, 116, 34, 99, 50, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 69, 37, 0, 12, + 64, 25, 11, 0, 16, 100, 98, 50, 65, 81, 50, 82, + 34, 82, 34, 82, 34, 82, 49, 81, 66, 50, 85, 0, + 10, 16, 32, 13, 0, 19, 68, 20, 99, 50, 82, 82, + 66, 82, 66, 82, 66, 82, 66, 82, 66, 82, 67, 50, + 82, 20, 98, 178, 178, 178, 178, 178, 150, 112, 32, 13, + 0, 19, 100, 20, 50, 51, 66, 82, 66, 82, 66, 82, + 66, 82, 66, 82, 66, 82, 82, 51, 100, 18, 178, 178, + 178, 178, 178, 178, 150, 32, 20, 11, 0, 16, 68, 20, + 67, 34, 67, 34, 66, 146, 146, 146, 146, 146, 118, 0, + 10, 32, 21, 9, 0, 13, 85, 49, 50, 49, 65, 50, + 132, 100, 115, 33, 66, 33, 66, 38, 0, 8, 32, 22, + 9, 0, 10, 65, 114, 114, 86, 82, 114, 114, 114, 114, + 114, 114, 33, 66, 33, 83, 0, 8, 32, 28, 14, 0, + 21, 4, 51, 98, 66, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 66, 98, 51, 98, 33, 18, 115, 36, 0, 12, + 64, 23, 12, 0, 18, 5, 35, 66, 65, 82, 49, 114, + 33, 114, 33, 129, 17, 147, 147, 161, 177, 0, 11, 32, + 36, 18, 0, 27, 5, 21, 35, 66, 66, 49, 98, 66, + 49, 114, 33, 18, 33, 114, 33, 18, 17, 130, 17, 34, + 17, 147, 51, 146, 66, 162, 66, 177, 81, 0, 16, 64, + 24, 12, 0, 18, 5, 19, 82, 33, 114, 33, 131, 162, + 162, 145, 18, 113, 35, 97, 50, 68, 21, 0, 10, 96, + 30, 13, 0, 19, 69, 36, 66, 65, 113, 65, 114, 33, + 130, 33, 146, 17, 147, 163, 178, 177, 193, 193, 177, 193, + 130, 33, 130, 17, 163, 144, 20, 10, 0, 15, 7, 49, + 51, 114, 114, 130, 114, 130, 49, 50, 65, 35, 65, 40, + 0, 9, 28, 9, 0, 6, 34, 82, 98, 114, 114, 115, + 114, 114, 114, 114, 98, 82, 146, 130, 114, 114, 114, 99, + 98, 114, 114, 130, 146, 176, 26, 3, 240, 49, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 80, 29, 9, 240, 240, + 242, 146, 130, 114, 114, 99, 98, 114, 114, 114, 130, 146, + 82, 98, 114, 114, 114, 115, 114, 114, 114, 98, 82, 240, + 16, 11, 12, 0, 22, 100, 49, 34, 52, 0, 18, 48, + 5, 9, 0, 32, 80, 20, 5, 0, 7, 67, 35, 49, + 225, 65, 65, 65, 65, 65, 51, 35, 35, 35, 35, 35, + 32, 39, 10, 0, 8, 49, 145, 129, 145, 145, 129, 116, + 66, 35, 49, 33, 18, 34, 33, 18, 34, 33, 82, 17, + 98, 17, 98, 17, 49, 50, 49, 85, 81, 129, 145, 145, + 129, 145, 240, 64, 33, 16, 0, 13, 20, 162, 65, 130, + 81, 114, 52, 114, 51, 130, 226, 226, 184, 178, 226, 226, + 163, 17, 81, 65, 50, 81, 65, 71, 84, 36, 0, 14, + 80, 27, 11, 0, 16, 65, 21, 17, 50, 50, 50, 82, + 33, 113, 33, 113, 33, 113, 34, 82, 50, 50, 49, 21, + 17, 0, 11, 32, 29, 14, 0, 10, 69, 52, 66, 81, + 98, 65, 130, 49, 130, 33, 162, 17, 163, 138, 130, 194, + 138, 130, 194, 194, 194, 166, 0, 12, 112, 22, 3, 240, + 49, 33, 33, 33, 33, 33, 33, 33, 33, 225, 33, 33, + 33, 33, 33, 33, 33, 33, 80, 42, 10, 0, 7, 100, + 81, 66, 34, 66, 34, 51, 35, 49, 67, 116, 81, 35, + 65, 51, 49, 67, 34, 66, 50, 65, 51, 49, 67, 17, + 114, 146, 131, 50, 50, 35, 50, 34, 66, 49, 50, 83, + 240, 11, 8, 0, 8, 2, 34, 34, 34, 0, 19, 32, + 54, 19, 0, 12, 85, 194, 82, 130, 146, 97, 68, 49, + 81, 50, 65, 49, 65, 49, 81, 49, 49, 50, 161, 33, + 50, 161, 33, 50, 161, 33, 50, 161, 33, 50, 161, 49, + 49, 81, 49, 65, 65, 65, 49, 81, 68, 49, 98, 146, + 129, 113, 183, 0, 17, 64, 17, 7, 240, 240, 195, 65, + 33, 82, 50, 17, 49, 33, 66, 17, 0, 15, 16, 19, + 7, 0, 12, 49, 33, 33, 33, 49, 33, 49, 33, 49, + 33, 65, 33, 0, 8, 16, 12, 13, 0, 22, 107, 193, + 193, 193, 193, 0, 16, 64, 8, 9, 0, 19, 23, 0, + 12, 80, 58, 19, 0, 12, 85, 194, 82, 130, 146, 97, + 22, 65, 81, 50, 50, 49, 65, 50, 50, 49, 49, 66, + 50, 65, 33, 66, 49, 81, 33, 69, 97, 33, 66, 35, + 65, 33, 66, 50, 65, 49, 50, 50, 49, 65, 50, 50, + 49, 81, 21, 36, 98, 146, 129, 113, 183, 0, 17, 64, + 8, 8, 0, 8, 6, 0, 20, 32, 21, 10, 0, 6, + 68, 81, 65, 49, 97, 33, 97, 33, 97, 33, 97, 49, + 65, 84, 0, 20, 64, 19, 13, 0, 16, 113, 193, 193, + 193, 193, 123, 113, 193, 193, 193, 193, 240, 91, 0, 10, + 22, 8, 0, 6, 20, 49, 50, 33, 50, 33, 17, 18, + 35, 17, 98, 97, 97, 33, 53, 0, 14, 32, 19, 8, + 0, 6, 6, 33, 33, 97, 114, 130, 98, 34, 34, 33, + 49, 67, 0, 14, 64, 11, 5, 240, 240, 18, 50, 49, + 49, 0, 12, 48, 34, 13, 0, 19, 66, 82, 66, 82, + 66, 82, 66, 82, 66, 82, 65, 97, 81, 82, 81, 83, + 67, 19, 19, 33, 35, 50, 33, 193, 193, 193, 194, 178, + 178, 176, 49, 12, 0, 9, 55, 52, 33, 84, 33, 84, + 33, 69, 33, 84, 33, 84, 33, 99, 33, 129, 33, 129, + 33, 129, 33, 129, 33, 129, 33, 129, 33, 129, 33, 129, + 33, 129, 33, 129, 33, 129, 33, 129, 33, 129, 33, 129, + 33, 240, 16, 10, 5, 0, 8, 113, 51, 35, 0, 7, + 96, 11, 6, 0, 18, 33, 49, 33, 33, 33, 50, 144, + 17, 7, 240, 240, 226, 82, 67, 49, 18, 82, 82, 82, + 82, 68, 0, 12, 64, 19, 8, 0, 6, 20, 50, 34, + 34, 34, 34, 34, 34, 34, 49, 33, 82, 0, 16, 64, + 19, 7, 0, 12, 33, 33, 65, 33, 49, 33, 49, 33, + 49, 33, 33, 33, 0, 8, 32, 47, 17, 0, 12, 1, + 114, 97, 130, 97, 115, 81, 113, 18, 81, 146, 65, 162, + 65, 162, 49, 34, 114, 49, 34, 100, 17, 50, 162, 49, + 177, 65, 33, 114, 49, 34, 113, 65, 34, 97, 86, 81, + 130, 81, 146, 0, 15, 32, 47, 17, 0, 12, 1, 114, + 113, 114, 97, 115, 97, 97, 18, 81, 146, 81, 146, 65, + 162, 49, 178, 49, 36, 68, 17, 33, 50, 129, 33, 50, + 113, 51, 18, 98, 113, 113, 114, 98, 113, 113, 98, 33, + 65, 117, 0, 15, 16, 49, 17, 0, 12, 2, 69, 97, + 81, 33, 98, 113, 113, 130, 81, 178, 49, 178, 33, 130, + 34, 18, 34, 65, 49, 33, 50, 83, 34, 50, 161, 65, + 161, 81, 17, 129, 65, 18, 113, 65, 34, 113, 70, 81, + 130, 81, 146, 0, 15, 32, 24, 9, 0, 13, 115, 99, + 113, 240, 33, 129, 129, 129, 99, 81, 114, 114, 114, 114, + 129, 50, 50, 34, 68, 48, 41, 17, 240, 98, 240, 18, + 240, 33, 240, 240, 49, 242, 242, 243, 227, 209, 18, 209, + 19, 193, 19, 177, 50, 177, 51, 161, 51, 152, 145, 83, + 129, 83, 113, 115, 97, 115, 69, 55, 0, 15, 16, 39, + 18, 240, 194, 242, 241, 240, 240, 81, 240, 34, 240, 18, + 243, 244, 228, 209, 34, 209, 35, 193, 35, 193, 50, 177, + 67, 168, 161, 82, 145, 99, 129, 99, 129, 114, 86, 55, + 0, 16, 41, 17, 240, 146, 210, 17, 193, 50, 240, 18, + 209, 242, 242, 243, 227, 209, 18, 209, 19, 193, 19, 177, + 50, 177, 51, 161, 51, 152, 145, 83, 129, 83, 113, 115, + 97, 115, 69, 55, 0, 15, 16, 41, 17, 240, 240, 132, + 33, 145, 36, 240, 240, 17, 242, 242, 243, 227, 209, 18, + 209, 19, 193, 19, 177, 50, 177, 51, 161, 51, 152, 145, + 83, 129, 83, 113, 115, 97, 115, 69, 55, 0, 15, 16, + 40, 17, 240, 240, 130, 50, 162, 50, 240, 241, 240, 17, + 243, 227, 227, 228, 193, 19, 193, 34, 193, 35, 161, 51, + 161, 51, 168, 129, 83, 129, 98, 129, 99, 97, 115, 69, + 55, 0, 15, 16, 43, 18, 100, 209, 65, 193, 65, 193, + 65, 212, 240, 240, 50, 240, 18, 240, 19, 228, 225, 18, + 225, 19, 193, 35, 193, 35, 193, 51, 161, 67, 168, 161, + 83, 129, 99, 129, 114, 129, 115, 70, 55, 0, 16, 50, + 25, 0, 19, 125, 209, 18, 98, 209, 18, 113, 193, 34, + 113, 193, 34, 65, 225, 50, 65, 209, 66, 50, 220, 193, + 82, 50, 193, 82, 65, 177, 98, 65, 177, 98, 129, 97, + 114, 129, 81, 130, 129, 81, 130, 114, 38, 77, 0, 22, + 16, 38, 15, 0, 11, 120, 82, 83, 65, 130, 50, 145, + 49, 161, 34, 210, 210, 210, 210, 210, 225, 161, 50, 145, + 65, 130, 81, 99, 105, 240, 240, 146, 226, 162, 18, 161, + 34, 179, 96, 40, 15, 240, 50, 226, 226, 241, 240, 124, + 82, 98, 82, 113, 82, 113, 82, 65, 130, 65, 130, 50, + 135, 130, 50, 130, 65, 130, 65, 130, 129, 66, 129, 66, + 129, 66, 114, 45, 0, 13, 48, 40, 15, 240, 129, 210, + 193, 240, 240, 140, 82, 98, 82, 113, 82, 113, 82, 65, + 130, 65, 130, 50, 135, 130, 50, 130, 65, 130, 65, 130, + 129, 66, 129, 66, 129, 66, 114, 45, 0, 13, 48, 43, + 15, 240, 98, 178, 18, 145, 66, 129, 67, 240, 76, 82, + 98, 82, 113, 82, 113, 82, 65, 130, 65, 130, 50, 135, + 130, 50, 130, 65, 130, 65, 130, 129, 66, 129, 66, 129, + 66, 114, 45, 0, 13, 48, 42, 15, 240, 240, 50, 50, + 130, 50, 240, 240, 92, 82, 98, 82, 113, 82, 113, 82, + 65, 130, 65, 130, 50, 135, 130, 50, 130, 65, 130, 65, + 130, 129, 66, 129, 66, 129, 66, 114, 45, 0, 13, 48, + 25, 8, 130, 99, 114, 240, 86, 66, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 7, + 32, 25, 8, 209, 83, 66, 240, 86, 66, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, + 7, 32, 27, 9, 178, 97, 18, 65, 50, 130, 182, 82, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 86, 0, 8, 32, 27, 9, 240, 50, 50, 34, 50, + 240, 87, 82, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 71, 0, 8, 16, 37, 16, 0, 12, + 10, 130, 97, 114, 113, 98, 114, 82, 129, 82, 130, 66, + 130, 39, 82, 66, 130, 66, 130, 66, 130, 66, 129, 82, + 114, 82, 113, 98, 97, 90, 0, 14, 96, 55, 17, 240, + 115, 49, 145, 34, 17, 161, 51, 240, 240, 166, 69, 68, + 97, 97, 19, 81, 97, 35, 65, 97, 35, 65, 97, 51, + 49, 97, 51, 49, 97, 67, 33, 97, 82, 33, 97, 83, + 17, 97, 100, 97, 100, 97, 115, 97, 130, 97, 130, 69, + 113, 0, 15, 48, 44, 17, 240, 98, 240, 18, 240, 33, + 240, 33, 240, 245, 162, 82, 113, 145, 82, 146, 65, 177, + 50, 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, 178, + 49, 177, 66, 146, 81, 145, 113, 113, 151, 0, 15, 80, + 42, 17, 240, 178, 226, 226, 225, 240, 240, 37, 162, 82, + 113, 145, 82, 146, 65, 177, 50, 178, 34, 178, 34, 178, + 34, 178, 34, 178, 34, 178, 49, 177, 66, 146, 81, 145, + 113, 113, 151, 0, 15, 80, 44, 17, 113, 243, 209, 34, + 177, 66, 240, 18, 240, 197, 162, 82, 113, 145, 82, 146, + 65, 177, 50, 178, 34, 178, 34, 178, 34, 178, 34, 178, + 34, 178, 49, 177, 66, 146, 81, 145, 113, 113, 151, 0, + 15, 80, 45, 17, 240, 99, 65, 129, 35, 33, 129, 52, + 240, 240, 245, 162, 82, 113, 145, 82, 146, 65, 177, 50, + 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, 178, 49, + 177, 66, 146, 81, 145, 113, 113, 151, 0, 15, 80, 43, + 17, 240, 240, 130, 50, 162, 50, 240, 240, 245, 162, 82, + 113, 145, 82, 146, 65, 177, 50, 178, 34, 178, 34, 178, + 34, 178, 34, 178, 34, 178, 49, 177, 66, 146, 81, 145, + 113, 113, 151, 0, 15, 80, 22, 10, 0, 15, 1, 97, + 49, 66, 65, 34, 99, 114, 114, 17, 82, 49, 50, 81, + 33, 0, 11, 16, 49, 17, 0, 13, 54, 49, 82, 97, + 17, 81, 146, 66, 146, 65, 130, 17, 50, 114, 34, 34, + 98, 50, 34, 82, 66, 34, 66, 82, 34, 50, 98, 34, + 34, 114, 49, 18, 129, 66, 146, 66, 145, 81, 17, 113, + 81, 55, 0, 15, 80, 43, 17, 240, 114, 243, 240, 18, + 240, 240, 198, 69, 66, 129, 98, 129, 98, 129, 98, 129, + 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, + 98, 129, 98, 129, 98, 114, 114, 82, 165, 0, 15, 96, + 42, 17, 240, 178, 226, 225, 240, 240, 214, 69, 66, 129, + 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, + 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 114, + 114, 82, 165, 0, 15, 96, 45, 17, 129, 242, 225, 18, + 193, 50, 161, 82, 240, 118, 69, 66, 129, 98, 129, 98, + 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, + 129, 98, 129, 98, 129, 98, 129, 98, 114, 114, 82, 165, + 0, 15, 96, 44, 17, 240, 240, 130, 66, 146, 66, 240, + 240, 150, 69, 66, 129, 98, 129, 98, 129, 98, 129, 98, + 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, + 129, 98, 129, 98, 114, 114, 82, 165, 0, 15, 96, 35, + 17, 240, 194, 227, 210, 225, 240, 184, 37, 82, 113, 115, + 81, 146, 81, 147, 49, 178, 49, 194, 17, 210, 17, 226, + 242, 242, 242, 242, 242, 242, 214, 0, 15, 80, 36, 14, + 0, 10, 70, 162, 194, 194, 168, 130, 66, 98, 82, 82, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 82, 87, + 114, 194, 194, 194, 194, 194, 194, 166, 240, 112, 42, 13, + 0, 8, 99, 130, 50, 97, 66, 82, 66, 82, 66, 82, + 65, 98, 49, 114, 18, 130, 50, 98, 66, 82, 82, 66, + 82, 66, 82, 66, 82, 66, 18, 34, 66, 17, 34, 52, + 35, 0, 11, 112, 29, 11, 0, 8, 65, 161, 177, 161, + 240, 244, 98, 49, 82, 50, 146, 131, 83, 18, 66, 50, + 66, 50, 66, 35, 83, 35, 0, 9, 112, 30, 11, 0, + 8, 97, 146, 145, 145, 240, 240, 20, 98, 49, 82, 50, + 146, 131, 83, 18, 66, 50, 66, 50, 66, 35, 83, 35, + 0, 9, 112, 31, 11, 0, 8, 81, 147, 113, 34, 97, + 34, 240, 212, 98, 49, 82, 50, 146, 131, 83, 18, 66, + 50, 66, 50, 66, 35, 83, 35, 0, 9, 112, 29, 11, + 0, 11, 19, 33, 65, 20, 240, 212, 98, 49, 82, 50, + 146, 131, 83, 18, 66, 50, 66, 50, 66, 35, 83, 35, + 0, 9, 112, 30, 11, 0, 9, 82, 50, 66, 50, 240, + 240, 132, 98, 49, 82, 50, 146, 131, 83, 18, 66, 50, + 66, 50, 66, 35, 83, 35, 0, 9, 112, 35, 11, 0, + 7, 19, 113, 49, 97, 49, 97, 49, 97, 49, 115, 240, + 52, 98, 49, 82, 50, 146, 131, 83, 18, 66, 50, 66, + 50, 66, 35, 83, 35, 0, 9, 112, 31, 15, 0, 22, + 84, 36, 66, 51, 49, 50, 50, 66, 34, 50, 66, 120, + 54, 130, 50, 130, 50, 81, 34, 33, 18, 49, 67, 52, + 0, 13, 80, 29, 10, 0, 15, 52, 66, 50, 49, 66, + 34, 66, 34, 130, 130, 81, 34, 81, 50, 49, 85, 240, + 33, 129, 17, 97, 33, 114, 240, 160, 27, 10, 0, 7, + 98, 145, 146, 145, 240, 196, 82, 49, 65, 66, 34, 66, + 40, 34, 130, 130, 81, 50, 49, 84, 0, 9, 32, 27, + 10, 0, 8, 17, 130, 129, 129, 240, 212, 82, 49, 65, + 66, 34, 66, 40, 34, 130, 130, 81, 50, 49, 84, 0, + 9, 32, 28, 10, 0, 8, 1, 116, 97, 33, 146, 240, + 164, 82, 49, 65, 66, 34, 66, 40, 34, 130, 130, 81, + 50, 49, 84, 0, 9, 32, 27, 10, 0, 8, 114, 50, + 50, 50, 240, 240, 68, 82, 49, 65, 66, 34, 66, 40, + 34, 130, 130, 146, 49, 84, 0, 9, 32, 22, 8, 0, + 6, 17, 114, 113, 129, 240, 84, 98, 98, 98, 98, 98, + 98, 98, 98, 70, 0, 7, 32, 22, 7, 240, 240, 241, + 97, 81, 97, 240, 52, 82, 82, 82, 82, 82, 82, 82, + 82, 53, 0, 6, 48, 25, 8, 0, 6, 34, 81, 17, + 65, 34, 49, 50, 240, 52, 98, 98, 98, 98, 98, 98, + 98, 98, 70, 0, 7, 32, 22, 8, 0, 8, 2, 34, + 34, 34, 240, 67, 98, 98, 98, 98, 98, 98, 98, 98, + 85, 0, 7, 32, 32, 11, 0, 8, 66, 49, 100, 130, + 117, 146, 162, 86, 66, 51, 49, 82, 34, 82, 34, 82, + 34, 82, 34, 82, 49, 81, 66, 50, 99, 0, 10, 32, + 33, 14, 0, 14, 51, 33, 113, 36, 240, 240, 52, 35, + 116, 34, 99, 50, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 66, 98, 66, 69, 37, 0, 12, 64, 30, 11, 0, + 8, 81, 162, 161, 161, 240, 244, 98, 50, 65, 81, 50, + 82, 34, 82, 34, 82, 34, 82, 49, 81, 66, 50, 85, + 0, 10, 16, 30, 11, 0, 8, 113, 146, 145, 161, 240, + 244, 98, 50, 65, 81, 50, 82, 34, 82, 34, 82, 34, + 82, 49, 81, 66, 50, 85, 0, 10, 16, 32, 11, 0, + 8, 98, 131, 113, 34, 97, 49, 240, 212, 98, 50, 65, + 81, 50, 82, 34, 82, 34, 82, 34, 82, 49, 81, 66, + 50, 85, 0, 10, 16, 30, 11, 0, 11, 35, 33, 65, + 20, 240, 212, 98, 50, 65, 81, 50, 82, 34, 82, 34, + 82, 34, 82, 49, 81, 66, 50, 85, 0, 10, 16, 31, + 11, 0, 9, 98, 50, 66, 50, 240, 240, 132, 98, 50, + 65, 81, 50, 82, 34, 82, 34, 82, 34, 82, 49, 81, + 66, 50, 85, 0, 10, 16, 17, 13, 0, 18, 65, 179, + 163, 240, 75, 240, 240, 49, 179, 163, 0, 13, 96, 31, + 11, 0, 16, 100, 33, 50, 50, 65, 66, 50, 49, 18, + 34, 33, 34, 34, 17, 50, 34, 17, 50, 50, 65, 66, + 50, 49, 36, 0, 10, 16, 33, 14, 0, 11, 1, 210, + 209, 0, 6, 36, 51, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 51, 98, 33, 18, 115, 36, + 0, 12, 64, 34, 14, 0, 11, 33, 209, 193, 209, 240, + 240, 100, 51, 98, 66, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 66, 98, 51, 98, 33, 18, 115, 36, 0, 12, + 64, 37, 14, 0, 11, 18, 177, 17, 161, 34, 145, 49, + 240, 240, 68, 51, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 51, 98, 33, 18, 115, 36, 0, + 12, 64, 34, 14, 0, 12, 66, 50, 114, 50, 0, 5, + 116, 51, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 66, 98, 51, 98, 33, 18, 115, 36, 0, 12, 64, + 36, 13, 0, 10, 66, 178, 177, 177, 240, 240, 53, 36, + 66, 65, 113, 65, 114, 33, 130, 33, 146, 17, 147, 163, + 178, 177, 193, 193, 177, 193, 130, 33, 130, 17, 163, 144, + 39, 13, 0, 8, 22, 146, 178, 178, 178, 178, 178, 178, + 20, 99, 50, 82, 82, 66, 82, 66, 82, 66, 82, 66, + 82, 66, 82, 67, 50, 82, 20, 98, 178, 178, 178, 178, + 178, 150, 112, 34, 12, 0, 12, 50, 34, 98, 34, 240, + 212, 35, 66, 65, 98, 33, 114, 33, 114, 33, 131, 147, + 162, 161, 177, 177, 177, 161, 177, 114, 33, 114, 17, 146, + 144, +}; + +//***************************************************************************** +// +// The glyph offset table for the 22 point Theanodidot font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanodidot22[] = +{ + 0, 5, 26, 45, 82, 140, 193, 236, + 248, 276, 304, 329, 347, 360, 368, 378, + 405, 442, 465, 497, 527, 556, 587, 622, + 650, 686, 721, 735, 753, 771, 781, 799, + 826, 886, 921, 957, 988, 1025, 1061, 1095, + 1129, 1167, 1190, 1216, 1254, 1282, 1343, 1390, + 1427, 1458, 1503, 1540, 1570, 1604, 1642, 1676, + 1732, 1767, 1798, 1829, 1857, 1884, 1912, 1933, + 1941, 1951, 1975, 2009, 2031, 2065, 2087, 2113, + 2148, 2182, 2203, 2232, 2264, 2288, 2326, 2353, + 2378, 2410, 2442, 2462, 2483, 2505, 2533, 2556, + 2592, 2616, 2646, 2666, 2694, 2720, 2749, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2760, 2765, 2785, 2824, 2857, 2884, 2913, 2935, + 2977, 2988, 3042, 3059, 3078, 3090, 3098, 3156, + 3164, 3185, 3204, 3226, 3245, 3256, 3290, 3339, + 3349, 3360, 3377, 3396, 3415, 3462, 3509, 3558, + 3582, 3623, 3662, 3703, 3744, 3784, 3827, 3877, + 3915, 3955, 3995, 4038, 4080, 4105, 4130, 4157, + 4184, 4221, 4276, 4320, 4362, 4406, 4451, 4494, + 4516, 4565, 4608, 4650, 4695, 4739, 4774, 4810, + 4852, 4881, 4911, 4942, 4971, 5001, 5036, 5067, + 5096, 5123, 5150, 5178, 5205, 5227, 5249, 5274, + 5296, 5328, 5361, 5391, 5421, 5453, 5483, 5514, + 5531, 5562, 5595, 5629, 5666, 5700, 5736, 5775, +}; + +//***************************************************************************** +// +// The font definition for the 22 point Theanodidot font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanodidot22 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 22, + + // + // The height of the font. + // + 29, + + // + // The baseline of the font. + // + 22, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanodidot22, + + // + // A pointer to the actual font data + // + g_pui8Theanodidot22Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanodidot24.c b/third_party/fonts/ofl/fonts/fonttheanodidot24.c new file mode 100644 index 0000000..59f8373 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanodidot24.c @@ -0,0 +1,753 @@ +//***************************************************************************** +// +// fonttheanodidot24.c - Font definition for the 24pt Theanodidot font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanodidot +// Size: 24 point +// Bold: no +// Italic: no +// Memory usage: 6608 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 24 point Theanodidot font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanodidot24Data[6405] = +{ + 4, 10, 0, 40, 23, 5, 240, 243, 35, 35, 35, 35, + 35, 35, 49, 65, 65, 65, 65, 65, 65, 131, 35, 35, + 240, 240, 192, 21, 8, 0, 6, 2, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 49, 49, 0, 19, 32, + 41, 14, 0, 11, 17, 65, 113, 65, 129, 65, 129, 65, + 129, 65, 76, 81, 65, 129, 65, 129, 65, 129, 65, 129, + 65, 129, 65, 92, 65, 65, 129, 65, 129, 65, 129, 50, + 113, 65, 0, 14, 112, 64, 14, 0, 9, 33, 33, 150, + 113, 17, 33, 18, 65, 33, 33, 34, 34, 33, 33, 19, + 34, 33, 33, 19, 34, 33, 33, 101, 33, 119, 135, 151, + 113, 37, 97, 33, 34, 50, 17, 33, 49, 35, 17, 33, + 49, 34, 33, 33, 49, 33, 49, 33, 33, 65, 33, 33, + 17, 103, 145, 33, 161, 33, 0, 11, 32, 58, 18, 0, + 13, 99, 113, 97, 49, 97, 82, 50, 65, 98, 50, 49, + 114, 50, 49, 114, 50, 33, 145, 49, 49, 163, 49, 240, + 33, 240, 17, 51, 177, 34, 18, 145, 34, 50, 129, 34, + 50, 113, 50, 50, 113, 50, 50, 97, 66, 50, 81, 97, + 49, 97, 113, 17, 0, 18, 64, 48, 19, 0, 15, 3, + 241, 49, 210, 49, 210, 49, 210, 33, 243, 240, 19, 226, + 18, 54, 65, 51, 65, 98, 66, 65, 97, 83, 33, 98, + 98, 33, 98, 99, 17, 98, 115, 115, 99, 131, 99, 117, + 34, 19, 133, 69, 0, 19, 32, 13, 4, 240, 146, 34, + 34, 34, 34, 34, 49, 0, 9, 96, 28, 6, 240, 240, + 241, 81, 65, 81, 66, 65, 81, 66, 66, 66, 66, 66, + 66, 66, 66, 81, 81, 82, 81, 81, 82, 81, 81, 224, + 29, 7, 0, 6, 33, 97, 113, 97, 98, 97, 97, 98, + 82, 82, 82, 82, 82, 82, 82, 81, 97, 82, 81, 97, + 82, 81, 81, 240, 80, 27, 11, 0, 8, 98, 146, 97, + 33, 49, 50, 17, 34, 65, 17, 17, 115, 100, 19, 34, + 33, 34, 97, 162, 146, 0, 21, 32, 20, 14, 0, 19, + 114, 194, 194, 194, 194, 194, 124, 114, 194, 194, 194, 194, + 194, 0, 14, 112, 15, 6, 0, 15, 114, 52, 51, 81, + 81, 65, 65, 81, 65, 240, 32, 9, 9, 0, 20, 39, + 39, 0, 13, 96, 10, 5, 0, 13, 19, 35, 35, 240, + 240, 192, 30, 8, 0, 6, 81, 113, 113, 113, 98, 97, + 113, 113, 98, 97, 113, 113, 113, 98, 97, 113, 113, 98, + 97, 113, 113, 98, 97, 113, 240, 128, 41, 13, 0, 10, + 35, 130, 49, 113, 81, 82, 82, 65, 113, 65, 113, 50, + 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 49, 113, 65, 113, 81, 81, 97, 81, 117, 0, 13, + 80, 26, 11, 0, 8, 113, 146, 131, 116, 82, 34, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 104, + 0, 11, 32, 36, 12, 0, 9, 52, 98, 66, 65, 82, + 49, 114, 33, 114, 33, 114, 33, 33, 66, 37, 50, 51, + 50, 162, 146, 161, 161, 161, 161, 81, 65, 97, 57, 42, + 0, 12, 32, 34, 12, 0, 9, 53, 97, 66, 65, 98, + 50, 82, 50, 82, 162, 146, 146, 116, 194, 178, 162, 50, + 82, 35, 82, 34, 98, 34, 82, 65, 82, 85, 0, 12, + 80, 30, 13, 0, 10, 66, 178, 178, 162, 178, 177, 178, + 177, 33, 129, 34, 114, 34, 113, 50, 97, 66, 91, 130, + 178, 178, 178, 150, 0, 13, 48, 34, 12, 0, 9, 113, + 98, 33, 116, 113, 18, 129, 177, 177, 20, 98, 50, 81, + 82, 178, 162, 162, 162, 35, 82, 35, 81, 50, 82, 65, + 81, 101, 0, 12, 80, 39, 13, 0, 10, 36, 129, 66, + 81, 82, 66, 82, 66, 81, 81, 178, 178, 36, 84, 66, + 50, 113, 50, 114, 34, 114, 34, 114, 49, 114, 49, 114, + 50, 82, 81, 81, 117, 0, 13, 80, 29, 13, 0, 10, + 3, 81, 54, 49, 40, 17, 49, 114, 49, 113, 193, 177, + 193, 193, 177, 178, 177, 178, 178, 163, 162, 178, 178, 0, + 14, 39, 13, 0, 10, 21, 98, 82, 49, 115, 33, 130, + 33, 130, 34, 114, 35, 82, 68, 33, 118, 134, 82, 52, + 65, 99, 33, 130, 33, 130, 33, 130, 33, 129, 65, 97, + 102, 0, 13, 80, 40, 13, 0, 10, 20, 129, 66, 82, + 82, 50, 113, 50, 113, 50, 114, 34, 114, 34, 114, 49, + 99, 50, 65, 18, 84, 34, 178, 177, 66, 82, 66, 82, + 66, 81, 81, 81, 117, 0, 13, 96, 14, 5, 0, 8, + 19, 35, 35, 240, 195, 35, 35, 240, 240, 192, 18, 5, + 0, 8, 19, 35, 35, 240, 209, 51, 35, 65, 65, 49, + 65, 49, 240, 64, 20, 13, 0, 19, 17, 163, 146, 146, + 146, 147, 146, 179, 195, 194, 210, 210, 209, 0, 13, 32, + 11, 14, 0, 26, 44, 240, 240, 236, 0, 21, 32, 20, + 13, 0, 17, 113, 194, 210, 210, 210, 195, 194, 163, 131, + 131, 146, 146, 161, 0, 14, 64, 27, 9, 0, 6, 116, + 66, 34, 50, 49, 130, 114, 114, 114, 113, 68, 81, 129, + 129, 129, 129, 240, 19, 99, 99, 0, 9, 96, 68, 21, + 0, 22, 5, 226, 82, 162, 146, 114, 177, 98, 209, 66, + 226, 50, 83, 34, 49, 50, 50, 49, 18, 49, 34, 50, + 67, 65, 34, 50, 67, 65, 34, 34, 83, 65, 34, 34, + 83, 65, 34, 34, 82, 65, 50, 34, 67, 65, 66, 18, + 49, 18, 49, 82, 36, 52, 113, 240, 82, 193, 114, 162, + 146, 98, 214, 0, 8, 112, 39, 19, 0, 15, 18, 240, + 34, 240, 34, 240, 35, 244, 244, 225, 35, 209, 35, 209, + 50, 193, 67, 177, 67, 184, 177, 83, 145, 99, 145, 114, + 145, 115, 113, 131, 85, 72, 0, 19, 32, 40, 15, 0, + 11, 42, 114, 82, 98, 98, 82, 98, 82, 98, 82, 98, + 82, 97, 98, 82, 103, 130, 82, 98, 98, 82, 99, 66, + 99, 66, 99, 66, 99, 66, 98, 82, 83, 58, 0, 15, + 80, 36, 16, 0, 12, 89, 97, 99, 66, 130, 65, 161, + 50, 161, 49, 177, 34, 226, 226, 226, 226, 226, 241, 177, + 50, 161, 65, 161, 66, 130, 97, 99, 118, 33, 0, 16, + 32, 41, 17, 0, 12, 106, 146, 98, 114, 114, 98, 130, + 82, 130, 82, 145, 82, 146, 66, 146, 66, 146, 66, 146, + 66, 146, 66, 146, 66, 146, 66, 130, 82, 130, 82, 114, + 98, 98, 90, 0, 17, 112, 40, 16, 0, 12, 13, 82, + 114, 82, 129, 82, 129, 82, 129, 82, 81, 130, 81, 130, + 66, 136, 130, 66, 130, 66, 130, 81, 130, 81, 130, 145, + 66, 145, 66, 130, 66, 115, 46, 0, 16, 32, 37, 15, + 0, 11, 45, 66, 114, 66, 114, 66, 129, 66, 129, 66, + 81, 33, 66, 81, 114, 66, 120, 114, 66, 114, 66, 114, + 81, 114, 81, 114, 210, 210, 210, 182, 0, 16, 16, 43, + 19, 0, 14, 118, 33, 130, 99, 114, 130, 113, 146, 98, + 161, 97, 177, 82, 240, 34, 240, 34, 240, 34, 240, 34, + 240, 34, 105, 49, 162, 98, 146, 113, 146, 114, 115, 130, + 99, 166, 33, 0, 19, 80, 42, 17, 0, 12, 102, 54, + 66, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, + 98, 114, 107, 98, 114, 98, 114, 98, 114, 98, 114, 98, + 114, 98, 114, 98, 114, 98, 114, 70, 54, 0, 17, 32, + 25, 8, 0, 6, 6, 66, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 8, + 32, 28, 10, 0, 7, 87, 98, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 66, 34, 66, 34, 65, + 49, 99, 0, 10, 96, 42, 18, 0, 13, 70, 38, 98, + 97, 146, 81, 162, 65, 178, 65, 178, 49, 194, 33, 210, + 19, 198, 194, 35, 178, 51, 162, 51, 162, 67, 146, 83, + 130, 83, 130, 99, 114, 115, 70, 40, 0, 18, 32, 31, + 16, 0, 12, 6, 194, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 145, 66, 145, 66, 130, 66, 130, 66, 115, + 66, 115, 46, 0, 16, 32, 69, 20, 0, 15, 6, 117, + 68, 115, 97, 18, 115, 97, 18, 97, 18, 97, 19, 81, + 18, 97, 19, 81, 18, 97, 34, 65, 34, 97, 35, 49, + 34, 97, 35, 49, 34, 97, 50, 33, 50, 97, 50, 33, + 50, 97, 51, 17, 50, 97, 51, 17, 50, 97, 67, 66, + 97, 67, 66, 97, 67, 66, 97, 81, 82, 69, 49, 54, + 0, 20, 32, 53, 17, 0, 12, 102, 69, 68, 97, 97, + 19, 81, 97, 19, 81, 97, 35, 65, 97, 35, 65, 97, + 51, 49, 97, 51, 49, 97, 67, 33, 97, 82, 33, 97, + 83, 17, 97, 98, 17, 97, 100, 97, 115, 97, 115, 97, + 130, 97, 130, 69, 113, 0, 17, 64, 41, 18, 0, 14, + 22, 177, 82, 130, 115, 97, 146, 82, 147, 65, 178, 50, + 179, 34, 179, 34, 179, 34, 179, 34, 179, 34, 179, 49, + 178, 66, 147, 81, 146, 98, 115, 114, 83, 166, 0, 18, + 112, 33, 15, 0, 11, 41, 130, 82, 98, 98, 82, 113, + 82, 114, 66, 114, 66, 114, 66, 114, 66, 113, 82, 98, + 88, 114, 210, 210, 210, 210, 210, 183, 0, 16, 53, 19, + 0, 14, 118, 193, 82, 146, 115, 113, 146, 98, 147, 81, + 178, 66, 179, 50, 179, 50, 179, 50, 179, 50, 179, 50, + 179, 65, 178, 82, 147, 82, 146, 114, 115, 130, 82, 197, + 240, 17, 240, 66, 240, 36, 240, 19, 240, 35, 240, 53, + 240, 240, 160, 41, 17, 0, 12, 105, 162, 82, 130, 98, + 114, 98, 114, 98, 114, 98, 114, 98, 114, 82, 135, 162, + 82, 130, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, + 98, 114, 98, 87, 68, 0, 17, 32, 34, 14, 0, 11, + 6, 98, 66, 97, 97, 82, 97, 82, 195, 180, 182, 151, + 150, 180, 179, 33, 146, 33, 146, 34, 130, 35, 113, 52, + 81, 65, 53, 0, 14, 80, 47, 18, 0, 13, 79, 1, + 35, 66, 67, 34, 82, 82, 34, 82, 97, 33, 98, 97, + 33, 98, 97, 33, 98, 97, 146, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 230, 0, 18, 112, 42, 18, 0, 13, 70, 70, 66, + 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, + 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, + 145, 98, 145, 113, 129, 130, 98, 166, 0, 18, 112, 42, + 19, 0, 14, 40, 54, 67, 129, 130, 129, 131, 97, 147, + 97, 162, 97, 163, 65, 179, 65, 195, 49, 195, 33, 211, + 33, 227, 17, 227, 17, 228, 240, 19, 240, 19, 240, 33, + 240, 49, 0, 20, 32, 62, 26, 0, 19, 71, 39, 53, + 67, 114, 113, 99, 115, 97, 114, 115, 97, 115, 81, 18, + 81, 131, 81, 19, 65, 146, 81, 19, 65, 147, 49, 50, + 65, 147, 49, 51, 33, 178, 49, 51, 33, 179, 17, 82, + 33, 179, 17, 84, 210, 17, 84, 211, 100, 211, 115, 211, + 114, 242, 114, 241, 145, 0, 27, 41, 19, 0, 14, 40, + 38, 99, 97, 147, 81, 179, 49, 211, 33, 211, 17, 244, + 243, 240, 35, 240, 19, 241, 19, 225, 35, 193, 51, 177, + 83, 161, 98, 145, 115, 129, 131, 70, 56, 0, 19, 32, + 34, 17, 0, 12, 104, 37, 67, 113, 115, 81, 131, 81, + 147, 65, 147, 49, 179, 33, 179, 17, 210, 17, 211, 242, + 242, 242, 242, 242, 242, 242, 214, 0, 17, 96, 35, 15, + 0, 11, 44, 51, 99, 50, 99, 65, 115, 65, 99, 81, + 99, 179, 179, 195, 179, 195, 179, 195, 97, 67, 113, 67, + 113, 51, 114, 35, 115, 45, 0, 15, 32, 30, 8, 0, + 6, 6, 34, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 102, 160, 30, 8, 0, 6, 1, 113, 129, 113, 113, + 113, 114, 113, 113, 113, 113, 129, 113, 113, 113, 114, 113, + 113, 113, 114, 113, 113, 113, 113, 240, 48, 30, 8, 0, + 6, 6, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 38, 160, 22, 14, 0, 11, 18, 179, 161, 34, 145, + 50, 113, 66, 97, 98, 81, 98, 65, 130, 49, 146, 0, + 30, 8, 14, 0, 47, 44, 0, 7, 32, 11, 5, 240, + 242, 50, 65, 81, 65, 0, 13, 48, 26, 12, 0, 19, + 100, 98, 65, 82, 66, 66, 66, 162, 117, 82, 50, 66, + 66, 66, 66, 66, 51, 84, 35, 0, 12, 32, 36, 14, + 0, 10, 68, 194, 194, 194, 194, 194, 194, 194, 36, 100, + 50, 83, 66, 82, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 67, 81, 83, 66, 52, 21, 0, 14, 64, 23, 11, + 0, 18, 36, 97, 66, 50, 66, 34, 82, 34, 146, 146, + 146, 162, 81, 50, 65, 100, 0, 11, 64, 38, 14, 0, + 11, 21, 194, 194, 194, 194, 194, 194, 100, 34, 82, 49, + 18, 82, 67, 66, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 81, 83, 82, 49, 18, 100, 36, 0, 14, 32, 24, + 11, 0, 18, 36, 82, 65, 65, 82, 34, 82, 41, 34, + 146, 146, 97, 50, 81, 50, 65, 100, 0, 11, 64, 27, + 11, 0, 8, 115, 113, 34, 81, 50, 66, 146, 146, 146, + 118, 114, 146, 146, 146, 146, 146, 146, 146, 146, 118, 0, + 11, 80, 39, 13, 0, 21, 68, 34, 65, 66, 17, 50, + 66, 82, 66, 82, 66, 98, 34, 97, 35, 97, 193, 193, + 68, 74, 66, 67, 81, 82, 65, 98, 50, 98, 50, 97, + 82, 65, 117, 240, 64, 37, 15, 0, 11, 36, 210, 210, + 210, 210, 210, 210, 210, 36, 114, 17, 50, 99, 66, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 70, 22, 0, 15, 32, 23, 7, 240, 240, 211, 67, + 67, 240, 240, 19, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 69, 0, 7, 32, 31, 8, 0, 6, 51, 83, 83, + 240, 240, 100, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 34, 34, 34, 34, 34, 33, 67, 192, + 35, 14, 0, 10, 68, 194, 194, 194, 194, 194, 194, 194, + 52, 82, 49, 130, 49, 130, 33, 146, 18, 150, 130, 34, + 130, 50, 114, 51, 98, 66, 70, 21, 0, 14, 32, 25, + 8, 0, 6, 4, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 8, 32, + 41, 20, 0, 32, 68, 35, 36, 116, 33, 17, 50, 99, + 50, 66, 98, 66, 66, 98, 66, 66, 98, 66, 66, 98, + 66, 66, 98, 66, 66, 98, 66, 66, 98, 66, 66, 69, + 36, 37, 0, 20, 32, 29, 15, 0, 24, 52, 36, 116, + 50, 99, 66, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 70, 22, 0, 15, 32, 27, 12, + 0, 19, 116, 98, 65, 81, 97, 50, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 49, 97, 66, 65, 116, 0, 12, + 80, 35, 14, 0, 22, 100, 36, 100, 50, 83, 66, 82, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 67, 66, 83, + 66, 82, 21, 98, 194, 194, 194, 194, 194, 167, 240, 96, + 37, 14, 0, 23, 4, 36, 50, 49, 18, 82, 67, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 81, 83, 82, + 49, 18, 100, 34, 194, 194, 194, 194, 194, 194, 151, 240, + 16, 21, 11, 0, 17, 116, 34, 84, 18, 67, 34, 66, + 146, 146, 146, 146, 146, 146, 118, 0, 11, 80, 23, 10, + 0, 16, 54, 49, 66, 49, 81, 50, 133, 102, 116, 33, + 82, 33, 82, 34, 66, 38, 0, 10, 64, 24, 10, 0, + 12, 98, 130, 130, 103, 82, 130, 130, 130, 130, 130, 130, + 49, 66, 33, 82, 33, 99, 0, 10, 64, 30, 15, 0, + 24, 52, 52, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 67, 98, 49, 18, 116, 36, + 0, 15, 32, 24, 13, 0, 21, 22, 35, 66, 81, 98, + 49, 114, 49, 114, 49, 130, 17, 146, 17, 147, 178, 178, + 0, 15, 48, 39, 19, 0, 30, 118, 21, 35, 66, 82, + 65, 98, 66, 49, 114, 51, 49, 114, 33, 34, 33, 130, + 17, 34, 17, 146, 17, 34, 17, 147, 67, 162, 66, 178, + 66, 177, 97, 0, 19, 96, 26, 13, 0, 21, 21, 35, + 82, 49, 130, 33, 130, 17, 162, 179, 163, 145, 34, 129, + 34, 113, 66, 68, 22, 0, 13, 32, 33, 14, 0, 22, + 117, 36, 66, 81, 114, 65, 114, 49, 146, 33, 146, 33, + 146, 17, 179, 178, 209, 209, 193, 209, 209, 193, 146, 33, + 146, 33, 163, 240, 144, 24, 12, 0, 19, 88, 65, 67, + 49, 82, 146, 147, 146, 147, 49, 82, 65, 66, 81, 51, + 66, 57, 0, 12, 32, 30, 9, 0, 7, 35, 82, 98, + 114, 114, 114, 115, 114, 114, 114, 114, 98, 82, 146, 130, + 114, 114, 114, 99, 98, 114, 114, 114, 129, 147, 176, 28, + 4, 240, 146, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 160, 30, 9, 0, 6, 99, 145, 130, 114, 114, + 114, 99, 98, 114, 114, 114, 130, 146, 82, 98, 114, 114, + 114, 115, 114, 114, 114, 114, 113, 83, 240, 14, 13, 0, + 26, 36, 65, 49, 35, 33, 49, 84, 0, 21, 64, 4, + 9, 0, 36, 22, 5, 0, 8, 19, 35, 35, 129, 65, + 65, 65, 65, 65, 65, 51, 35, 35, 35, 35, 35, 35, + 112, 42, 11, 0, 9, 33, 161, 161, 145, 161, 161, 145, + 117, 81, 36, 50, 33, 18, 34, 49, 18, 34, 33, 98, + 33, 98, 33, 98, 17, 131, 65, 50, 65, 85, 97, 145, + 161, 161, 145, 161, 161, 240, 96, 38, 17, 0, 13, 117, + 162, 81, 131, 81, 131, 34, 17, 115, 52, 115, 65, 147, + 227, 227, 185, 194, 242, 242, 242, 65, 83, 33, 81, 65, + 52, 50, 65, 72, 84, 52, 0, 17, 80, 29, 11, 0, + 17, 113, 20, 33, 50, 50, 65, 81, 49, 113, 33, 113, + 33, 113, 33, 113, 34, 82, 50, 50, 49, 21, 17, 0, + 12, 80, 32, 15, 0, 11, 38, 52, 66, 97, 114, 81, + 114, 65, 146, 49, 146, 33, 178, 17, 179, 154, 146, 210, + 154, 146, 210, 210, 210, 210, 182, 0, 15, 80, 23, 4, + 240, 146, 34, 34, 34, 34, 34, 34, 34, 34, 240, 178, + 34, 34, 34, 34, 34, 34, 34, 34, 160, 46, 11, 0, + 8, 69, 82, 65, 50, 82, 34, 67, 34, 66, 66, 162, + 132, 97, 35, 81, 51, 66, 51, 50, 66, 66, 65, 68, + 33, 84, 17, 115, 146, 162, 65, 81, 51, 65, 51, 65, + 50, 65, 81, 65, 100, 240, 192, 10, 9, 0, 9, 2, + 50, 34, 50, 0, 25, 60, 20, 0, 15, 102, 194, 98, + 145, 161, 113, 68, 17, 33, 81, 65, 66, 49, 65, 50, + 81, 49, 49, 50, 97, 65, 33, 50, 177, 33, 50, 177, + 33, 50, 177, 33, 50, 177, 33, 50, 97, 65, 49, 50, + 81, 49, 65, 65, 66, 49, 81, 68, 17, 33, 113, 161, + 146, 98, 198, 0, 21, 18, 8, 0, 6, 19, 65, 34, + 98, 68, 50, 18, 50, 18, 66, 18, 0, 19, 32, 21, + 8, 0, 15, 33, 33, 49, 34, 34, 18, 50, 18, 50, + 18, 65, 33, 81, 33, 0, 10, 32, 13, 15, 0, 28, + 29, 210, 210, 210, 210, 210, 0, 20, 112, 9, 9, 0, + 20, 39, 39, 0, 13, 96, 60, 20, 0, 15, 102, 194, + 98, 145, 161, 113, 23, 65, 81, 66, 50, 49, 65, 66, + 50, 49, 49, 82, 50, 65, 33, 82, 49, 81, 33, 85, + 97, 33, 82, 35, 65, 33, 82, 50, 65, 33, 82, 50, + 65, 49, 66, 50, 49, 65, 38, 35, 17, 81, 193, 113, + 161, 146, 98, 198, 0, 21, 7, 9, 0, 10, 23, 0, + 25, 23, 11, 0, 8, 69, 82, 50, 50, 82, 33, 113, + 33, 113, 33, 113, 34, 82, 50, 50, 85, 0, 23, 112, + 22, 14, 0, 18, 18, 194, 194, 194, 194, 194, 124, 114, + 194, 194, 194, 194, 194, 240, 108, 0, 12, 64, 23, 8, + 0, 6, 20, 49, 50, 33, 50, 33, 17, 18, 35, 18, + 97, 97, 97, 97, 49, 53, 0, 16, 32, 23, 8, 0, + 6, 6, 33, 49, 49, 33, 97, 114, 129, 114, 34, 34, + 33, 50, 33, 49, 67, 0, 15, 64, 12, 5, 240, 240, + 18, 50, 49, 49, 65, 0, 13, 80, 38, 14, 0, 22, + 114, 66, 98, 66, 98, 66, 98, 66, 97, 82, 97, 81, + 113, 81, 113, 66, 113, 67, 33, 33, 22, 19, 33, 36, + 50, 33, 209, 209, 210, 194, 195, 193, 240, 176, 54, 14, + 0, 10, 121, 67, 49, 100, 49, 100, 49, 85, 49, 100, + 49, 100, 49, 100, 49, 115, 49, 145, 49, 145, 49, 145, + 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, + 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, + 49, 240, 240, 48, 9, 5, 0, 9, 51, 35, 35, 0, + 9, 12, 6, 0, 18, 113, 98, 33, 33, 33, 33, 50, + 240, 18, 7, 240, 240, 226, 82, 67, 49, 18, 82, 82, + 82, 82, 82, 68, 0, 14, 32, 19, 9, 0, 7, 3, + 81, 49, 50, 50, 34, 50, 34, 50, 49, 49, 83, 0, + 21, 112, 20, 8, 0, 15, 49, 66, 33, 66, 18, 50, + 18, 50, 18, 49, 33, 49, 33, 0, 10, 64, 50, 18, + 0, 13, 98, 129, 114, 113, 115, 113, 97, 18, 97, 146, + 97, 146, 81, 162, 81, 162, 65, 34, 114, 50, 34, 100, + 33, 50, 177, 65, 193, 65, 177, 65, 34, 114, 65, 34, + 113, 65, 50, 98, 71, 81, 146, 81, 162, 0, 18, 48, + 52, 18, 0, 13, 98, 129, 114, 129, 114, 113, 100, 98, + 97, 18, 97, 146, 81, 162, 81, 162, 65, 178, 50, 35, + 84, 33, 18, 35, 129, 33, 66, 129, 33, 33, 18, 113, + 67, 18, 113, 114, 113, 129, 114, 113, 129, 98, 49, 65, + 118, 0, 18, 32, 53, 18, 0, 13, 70, 98, 65, 49, + 113, 81, 33, 114, 113, 129, 130, 97, 178, 50, 178, 49, + 130, 34, 34, 34, 65, 49, 49, 50, 83, 49, 66, 177, + 65, 177, 81, 161, 81, 33, 129, 81, 18, 113, 81, 34, + 113, 86, 81, 146, 81, 162, 0, 18, 48, 26, 9, 0, + 15, 19, 99, 99, 240, 17, 129, 129, 129, 84, 65, 49, + 50, 114, 114, 114, 114, 129, 50, 50, 34, 68, 192, 49, + 19, 240, 146, 240, 35, 240, 50, 240, 65, 240, 240, 97, + 240, 49, 240, 35, 240, 19, 240, 19, 241, 19, 225, 19, + 225, 35, 193, 51, 193, 51, 193, 67, 184, 161, 83, 161, + 99, 129, 115, 129, 130, 129, 131, 70, 56, 0, 19, 32, + 48, 19, 240, 226, 240, 19, 242, 240, 17, 240, 240, 129, + 240, 49, 240, 35, 240, 19, 240, 19, 241, 19, 225, 19, + 225, 35, 193, 51, 193, 51, 193, 67, 184, 161, 83, 161, + 99, 129, 115, 129, 130, 129, 131, 70, 56, 0, 19, 32, + 48, 19, 240, 178, 240, 17, 18, 225, 50, 240, 50, 240, + 240, 50, 240, 34, 240, 34, 240, 35, 244, 244, 225, 35, + 209, 35, 209, 50, 193, 67, 177, 67, 184, 177, 83, 145, + 99, 145, 114, 145, 115, 113, 131, 85, 72, 0, 19, 32, + 45, 19, 240, 240, 211, 49, 177, 36, 0, 6, 82, 240, + 34, 240, 34, 240, 35, 244, 244, 225, 35, 209, 35, 209, + 50, 193, 67, 177, 67, 184, 177, 83, 145, 99, 145, 114, + 145, 115, 113, 131, 85, 72, 0, 19, 32, 45, 19, 240, + 240, 194, 66, 178, 66, 0, 6, 66, 240, 34, 240, 34, + 240, 35, 244, 244, 225, 35, 209, 35, 209, 50, 193, 67, + 177, 67, 184, 177, 83, 145, 99, 145, 115, 129, 115, 113, + 131, 85, 72, 0, 19, 32, 46, 19, 100, 225, 65, 209, + 65, 209, 65, 228, 0, 6, 98, 240, 34, 240, 35, 244, + 241, 18, 241, 19, 209, 35, 209, 35, 209, 51, 177, 67, + 184, 177, 83, 145, 99, 145, 99, 145, 115, 113, 131, 86, + 56, 0, 19, 32, 56, 27, 0, 21, 78, 225, 18, 114, + 225, 18, 129, 209, 34, 129, 209, 34, 129, 193, 50, 81, + 241, 50, 81, 225, 66, 66, 237, 209, 82, 66, 193, 98, + 66, 193, 98, 81, 177, 114, 81, 177, 114, 145, 97, 130, + 145, 97, 130, 130, 81, 146, 115, 39, 78, 0, 27, 32, + 45, 16, 0, 12, 89, 97, 99, 66, 130, 65, 161, 50, + 161, 49, 177, 34, 226, 226, 226, 226, 226, 241, 177, 50, + 161, 65, 161, 66, 130, 97, 99, 118, 33, 240, 161, 240, + 18, 242, 162, 34, 161, 50, 180, 240, 112, 45, 16, 240, + 66, 242, 240, 17, 240, 240, 189, 82, 114, 82, 129, 82, + 129, 82, 129, 82, 81, 130, 81, 130, 66, 136, 130, 66, + 130, 66, 130, 81, 130, 81, 130, 145, 66, 145, 66, 130, + 66, 115, 46, 0, 16, 32, 44, 16, 240, 146, 211, 194, + 240, 240, 173, 82, 114, 82, 129, 82, 129, 82, 129, 82, + 81, 130, 81, 130, 66, 136, 130, 66, 130, 66, 130, 81, + 130, 81, 130, 145, 66, 145, 66, 130, 66, 115, 46, 0, + 16, 32, 47, 16, 240, 114, 209, 18, 177, 50, 145, 82, + 240, 109, 82, 114, 82, 129, 82, 129, 82, 129, 82, 81, + 130, 81, 130, 66, 136, 130, 66, 130, 66, 130, 81, 130, + 81, 130, 145, 66, 145, 66, 130, 66, 115, 46, 0, 16, + 32, 46, 16, 240, 240, 82, 66, 130, 66, 240, 240, 125, + 82, 114, 82, 129, 82, 129, 82, 129, 82, 81, 130, 81, + 130, 66, 136, 130, 66, 130, 66, 130, 81, 130, 81, 130, + 145, 66, 145, 66, 130, 66, 115, 46, 0, 16, 32, 27, + 8, 129, 115, 114, 240, 86, 66, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, + 8, 32, 27, 8, 209, 83, 66, 240, 86, 66, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 70, 0, 8, 32, 30, 9, 178, 97, 18, 65, 50, + 49, 66, 182, 82, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 86, 0, 9, 48, 29, + 10, 240, 82, 66, 34, 66, 240, 120, 82, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 88, 0, 10, 32, 41, 17, 0, 12, 106, 146, 98, 114, + 114, 98, 130, 82, 130, 82, 145, 82, 146, 66, 146, 40, + 82, 66, 146, 66, 146, 66, 146, 66, 146, 66, 130, 82, + 130, 82, 114, 98, 98, 90, 0, 17, 112, 61, 17, 240, + 115, 49, 145, 19, 17, 161, 51, 240, 240, 166, 69, 68, + 97, 97, 19, 81, 97, 19, 81, 97, 35, 65, 97, 35, + 65, 97, 51, 49, 97, 51, 49, 97, 67, 33, 97, 82, + 33, 97, 83, 17, 97, 98, 17, 97, 100, 97, 115, 97, + 115, 97, 130, 97, 130, 69, 113, 0, 17, 64, 49, 18, + 240, 114, 240, 34, 240, 49, 240, 49, 240, 240, 38, 177, + 82, 130, 115, 97, 146, 82, 147, 65, 178, 50, 179, 34, + 179, 34, 179, 34, 179, 34, 179, 34, 179, 49, 178, 66, + 147, 81, 146, 98, 115, 114, 83, 166, 0, 18, 112, 46, + 18, 240, 194, 242, 242, 241, 240, 240, 70, 177, 82, 130, + 115, 97, 146, 82, 147, 65, 178, 50, 179, 34, 179, 34, + 179, 34, 179, 34, 179, 34, 179, 49, 178, 66, 147, 81, + 146, 98, 115, 114, 83, 166, 0, 18, 112, 49, 18, 113, + 240, 19, 225, 34, 193, 66, 240, 34, 240, 230, 177, 82, + 130, 115, 97, 146, 82, 147, 65, 178, 50, 179, 34, 179, + 34, 179, 34, 179, 34, 179, 34, 179, 49, 178, 66, 147, + 81, 146, 98, 115, 114, 83, 166, 0, 18, 112, 49, 18, + 240, 115, 65, 145, 35, 33, 145, 52, 0, 6, 6, 177, + 82, 130, 115, 97, 146, 82, 147, 65, 178, 50, 179, 34, + 179, 34, 179, 34, 179, 34, 179, 34, 179, 49, 178, 66, + 147, 81, 146, 98, 115, 114, 83, 166, 0, 18, 112, 47, + 18, 240, 240, 162, 66, 162, 66, 0, 5, 118, 177, 82, + 130, 115, 97, 146, 82, 147, 65, 178, 50, 179, 34, 179, + 34, 179, 34, 179, 34, 179, 34, 179, 49, 178, 66, 147, + 81, 146, 98, 115, 114, 83, 166, 0, 18, 112, 22, 11, + 0, 17, 113, 113, 49, 82, 65, 50, 97, 18, 130, 131, + 114, 33, 82, 65, 50, 97, 0, 14, 52, 18, 0, 14, + 21, 81, 82, 82, 33, 82, 115, 97, 146, 82, 132, 65, + 129, 34, 50, 113, 51, 34, 98, 51, 34, 82, 67, 34, + 66, 83, 34, 50, 99, 34, 49, 115, 34, 33, 130, 67, + 131, 66, 146, 83, 115, 65, 34, 82, 97, 69, 0, 19, + 48, 18, 240, 130, 240, 34, 240, 49, 240, 240, 246, 85, + 66, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 113, 129, 130, 98, 166, 0, 18, 112, + 46, 18, 240, 195, 227, 226, 240, 240, 246, 85, 66, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 113, 129, 130, 98, 166, 0, 18, 112, 50, 18, + 129, 240, 19, 225, 34, 193, 66, 161, 98, 240, 134, 70, + 66, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 113, 129, 130, 98, 166, 0, 18, 112, + 48, 18, 240, 240, 178, 50, 178, 50, 240, 240, 199, 54, + 66, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 113, 129, 130, 98, 166, 0, 18, 112, + 45, 18, 240, 210, 243, 226, 241, 240, 216, 38, 67, 113, + 131, 97, 131, 81, 163, 65, 163, 49, 195, 33, 195, 17, + 226, 17, 227, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 231, 0, 18, 96, 39, 15, 0, + 11, 39, 162, 210, 210, 210, 185, 130, 82, 98, 98, 82, + 114, 66, 114, 66, 114, 66, 114, 66, 114, 66, 98, 88, + 114, 210, 210, 210, 210, 210, 210, 210, 183, 240, 240, 128, + 45, 13, 0, 10, 52, 129, 65, 97, 82, 66, 82, 66, + 82, 66, 66, 82, 65, 98, 19, 114, 50, 98, 66, 82, + 81, 82, 82, 66, 82, 66, 82, 66, 18, 34, 66, 18, + 34, 66, 17, 34, 52, 35, 0, 13, 64, 33, 12, 0, + 9, 33, 178, 177, 178, 177, 240, 240, 52, 98, 65, 82, + 66, 66, 66, 162, 117, 82, 50, 66, 66, 66, 66, 66, + 51, 84, 35, 0, 12, 32, 33, 12, 0, 9, 66, 162, + 146, 161, 177, 240, 240, 68, 98, 65, 82, 66, 66, 66, + 162, 117, 82, 50, 66, 66, 66, 66, 66, 51, 84, 35, + 0, 12, 32, 35, 12, 0, 9, 50, 145, 18, 129, 18, + 113, 50, 178, 240, 244, 98, 65, 82, 66, 66, 66, 162, + 117, 82, 50, 66, 66, 66, 66, 66, 51, 84, 35, 0, + 12, 32, 32, 12, 0, 12, 20, 33, 65, 36, 240, 240, + 212, 98, 65, 82, 66, 66, 66, 162, 117, 82, 50, 66, + 66, 66, 66, 66, 51, 84, 35, 0, 12, 32, 32, 12, + 0, 12, 18, 34, 98, 34, 240, 240, 212, 98, 65, 82, + 66, 66, 66, 162, 117, 82, 50, 66, 66, 66, 66, 66, + 51, 84, 35, 0, 12, 32, 36, 12, 0, 9, 36, 113, + 65, 97, 65, 97, 65, 116, 240, 240, 36, 98, 65, 82, + 66, 66, 66, 162, 117, 82, 50, 66, 66, 66, 66, 66, + 51, 84, 35, 0, 12, 32, 34, 17, 0, 27, 116, 52, + 82, 51, 65, 66, 50, 82, 50, 50, 82, 137, 70, 146, + 66, 146, 66, 97, 34, 67, 81, 34, 49, 18, 65, 68, + 53, 0, 17, 64, 31, 11, 0, 18, 36, 97, 66, 50, + 66, 34, 82, 34, 146, 146, 146, 97, 50, 81, 50, 65, + 100, 240, 65, 178, 113, 33, 98, 33, 130, 240, 192, 30, + 11, 0, 8, 81, 162, 146, 161, 177, 240, 244, 82, 65, + 65, 82, 34, 82, 41, 34, 146, 146, 97, 50, 81, 50, + 65, 100, 0, 11, 64, 31, 11, 0, 8, 114, 146, 130, + 145, 145, 240, 240, 36, 82, 65, 65, 82, 34, 82, 41, + 34, 146, 146, 97, 50, 81, 50, 65, 100, 0, 11, 64, + 32, 11, 0, 8, 98, 131, 113, 34, 97, 49, 162, 240, + 212, 82, 65, 65, 82, 34, 82, 41, 34, 146, 146, 97, + 50, 81, 50, 65, 100, 0, 11, 64, 30, 11, 0, 11, + 18, 50, 66, 50, 240, 240, 148, 82, 65, 65, 82, 34, + 82, 41, 34, 146, 146, 97, 50, 81, 50, 65, 100, 0, + 11, 64, 24, 8, 0, 6, 17, 114, 98, 113, 129, 240, + 84, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, + 8, 32, 24, 8, 0, 6, 50, 98, 82, 97, 97, 240, + 116, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, + 8, 32, 26, 8, 0, 6, 34, 83, 65, 34, 49, 34, + 114, 240, 52, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 70, 0, 8, 32, 23, 9, 0, 9, 2, 50, 34, 50, + 240, 244, 114, 114, 114, 114, 114, 114, 114, 114, 114, 86, + 0, 9, 32, 38, 12, 0, 9, 35, 49, 98, 18, 130, + 145, 18, 113, 35, 162, 178, 102, 81, 67, 49, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 49, 97, 81, + 65, 116, 0, 12, 80, 38, 15, 0, 15, 51, 49, 113, + 34, 33, 113, 51, 240, 240, 100, 36, 116, 50, 99, 66, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 70, 22, 0, 15, 32, 34, 12, 0, 9, 49, + 178, 177, 193, 177, 240, 240, 52, 98, 65, 81, 97, 50, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 49, 97, 66, + 65, 116, 0, 12, 80, 34, 12, 0, 9, 82, 162, 161, + 162, 161, 240, 240, 68, 98, 65, 81, 97, 50, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 49, 97, 66, 65, 116, + 0, 12, 80, 37, 12, 0, 9, 66, 145, 18, 129, 18, + 113, 50, 97, 66, 240, 244, 98, 65, 81, 97, 50, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 49, 97, 66, 65, + 116, 0, 12, 80, 33, 12, 0, 12, 36, 33, 65, 36, + 240, 240, 212, 98, 65, 81, 97, 50, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 49, 97, 66, 65, 116, 0, 12, + 80, 33, 12, 0, 12, 34, 34, 98, 34, 240, 240, 212, + 98, 65, 81, 97, 50, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 49, 97, 66, 65, 116, 0, 12, 80, 18, 14, + 0, 21, 83, 179, 179, 240, 240, 76, 240, 240, 83, 179, + 179, 0, 16, 64, 34, 12, 0, 19, 116, 33, 65, 66, + 65, 82, 50, 65, 18, 34, 49, 34, 34, 33, 50, 34, + 33, 50, 34, 17, 66, 50, 81, 66, 65, 65, 36, 0, + 12, 80, 36, 15, 0, 11, 98, 210, 226, 225, 0, 6, + 84, 52, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 67, 98, 49, 18, 116, 36, 0, + 15, 32, 37, 15, 0, 12, 17, 210, 209, 209, 225, 240, + 240, 148, 52, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 67, 98, 49, 18, 116, 36, + 0, 15, 32, 41, 15, 0, 11, 114, 193, 18, 177, 18, + 161, 50, 145, 66, 240, 240, 84, 52, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 67, + 98, 49, 18, 116, 36, 0, 15, 32, 36, 15, 0, 15, + 50, 34, 146, 34, 0, 6, 52, 52, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 67, + 98, 49, 18, 116, 36, 0, 15, 32, 40, 13, 0, 10, + 81, 178, 178, 177, 177, 240, 240, 69, 35, 66, 81, 98, + 49, 114, 49, 129, 49, 130, 17, 146, 17, 163, 162, 178, + 193, 177, 193, 193, 177, 130, 33, 130, 33, 147, 240, 112, + 42, 14, 0, 10, 71, 146, 194, 194, 194, 194, 194, 194, + 20, 115, 66, 82, 97, 82, 98, 66, 98, 66, 98, 66, + 98, 66, 98, 66, 97, 83, 66, 82, 20, 114, 194, 194, + 194, 194, 194, 167, 240, 96, 39, 14, 0, 14, 50, 50, + 114, 50, 0, 5, 117, 36, 66, 81, 114, 49, 130, 49, + 130, 49, 146, 17, 162, 17, 179, 178, 194, 209, 193, 209, + 209, 193, 146, 33, 146, 33, 163, 240, 144, +}; + +//***************************************************************************** +// +// The glyph offset table for the 24 point Theanodidot font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanodidot24[] = +{ + 0, 4, 27, 48, 89, 153, 211, 259, + 272, 300, 329, 356, 376, 391, 400, 410, + 440, 481, 507, 543, 577, 607, 641, 680, + 709, 748, 788, 802, 820, 840, 851, 871, + 898, 966, 1005, 1045, 1081, 1122, 1162, 1199, + 1242, 1284, 1309, 1337, 1379, 1410, 1479, 1532, + 1573, 1606, 1659, 1700, 1734, 1781, 1823, 1865, + 1927, 1968, 2002, 2037, 2067, 2097, 2127, 2149, + 2157, 2168, 2194, 2230, 2253, 2291, 2315, 2342, + 2381, 2418, 2441, 2472, 2507, 2532, 2573, 2602, + 2629, 2664, 2701, 2722, 2745, 2769, 2799, 2823, + 2862, 2888, 2921, 2945, 2975, 3003, 3033, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3047, 3051, 3073, 3115, 3153, 3182, 3214, 3237, + 3283, 3293, 3353, 3371, 3392, 3405, 3414, 3474, + 3481, 3504, 3526, 3549, 3572, 3584, 3622, 3676, + 3685, 3697, 3715, 3734, 3754, 3804, 3856, 3909, + 3935, 3984, 4032, 4080, 4125, 4170, 4216, 4272, + 4317, 4362, 4406, 4453, 4499, 4526, 4553, 4583, + 4612, 4653, 4714, 4763, 4809, 4858, 4907, 4954, + 4976, 5028, 5076, 5122, 5172, 5220, 5265, 5304, + 5349, 5382, 5415, 5450, 5482, 5514, 5550, 5584, + 5615, 5645, 5676, 5708, 5738, 5762, 5786, 5812, + 5835, 5873, 5911, 5945, 5979, 6016, 6049, 6082, + 6100, 6134, 6170, 6207, 6248, 6284, 6324, 6366, +}; + +//***************************************************************************** +// +// The font definition for the 24 point Theanodidot font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanodidot24 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 24, + + // + // The height of the font. + // + 32, + + // + // The baseline of the font. + // + 24, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanodidot24, + + // + // A pointer to the actual font data + // + g_pui8Theanodidot24Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanodidot26.c b/third_party/fonts/ofl/fonts/fonttheanodidot26.c new file mode 100644 index 0000000..292f3a7 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanodidot26.c @@ -0,0 +1,791 @@ +//***************************************************************************** +// +// fonttheanodidot26.c - Font definition for the 26pt Theanodidot font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanodidot +// Size: 26 point +// Bold: no +// Italic: no +// Memory usage: 7060 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 26 point Theanodidot font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanodidot26Data[6857] = +{ + 5, 10, 0, 42, 64, 25, 6, 240, 240, 114, 52, 36, + 36, 36, 36, 50, 66, 66, 66, 66, 66, 66, 66, 240, + 114, 52, 50, 0, 6, 48, 23, 9, 0, 6, 98, 50, + 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, + 33, 65, 0, 22, 112, 43, 15, 0, 13, 97, 65, 145, + 65, 145, 65, 129, 81, 129, 66, 77, 97, 65, 130, 65, + 129, 81, 129, 66, 129, 65, 145, 65, 109, 66, 65, 129, + 81, 129, 65, 145, 65, 145, 65, 130, 65, 0, 15, 112, + 68, 15, 0, 9, 113, 49, 161, 49, 166, 115, 49, 18, + 66, 17, 49, 34, 34, 33, 49, 34, 34, 33, 49, 19, + 34, 33, 49, 18, 51, 17, 49, 101, 49, 120, 152, 129, + 37, 113, 49, 19, 97, 49, 49, 35, 17, 49, 49, 35, + 17, 49, 49, 33, 49, 49, 49, 34, 33, 49, 33, 66, + 17, 51, 118, 161, 49, 0, 13, 112, 63, 20, 0, 15, + 35, 145, 98, 18, 113, 98, 50, 82, 98, 50, 81, 114, + 50, 66, 114, 50, 65, 130, 50, 49, 162, 18, 65, 179, + 65, 240, 50, 240, 49, 52, 178, 34, 34, 161, 49, 65, + 145, 50, 66, 129, 50, 66, 113, 66, 66, 113, 66, 66, + 97, 97, 65, 97, 114, 34, 97, 132, 0, 20, 64, 56, + 21, 0, 16, 68, 240, 18, 49, 226, 65, 226, 65, 226, + 49, 243, 17, 240, 35, 240, 51, 240, 18, 19, 55, 65, + 51, 81, 114, 67, 65, 113, 98, 65, 98, 99, 49, 98, + 115, 17, 114, 115, 17, 114, 131, 131, 115, 147, 115, 147, + 81, 19, 151, 53, 0, 21, 48, 14, 4, 240, 146, 34, + 34, 34, 34, 34, 34, 33, 0, 10, 48, 32, 7, 0, + 5, 97, 81, 97, 82, 81, 97, 82, 81, 97, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 97, 97, 98, 97, 97, + 98, 97, 97, 113, 144, 32, 7, 240, 240, 193, 97, 113, + 98, 97, 97, 98, 97, 97, 98, 82, 82, 82, 82, 82, + 82, 82, 82, 81, 82, 82, 81, 97, 82, 81, 97, 81, + 208, 30, 12, 0, 9, 66, 162, 98, 34, 34, 35, 33, + 34, 66, 17, 17, 131, 114, 19, 67, 33, 34, 34, 49, + 34, 98, 162, 162, 0, 24, 96, 20, 15, 0, 25, 18, + 210, 210, 210, 210, 210, 125, 130, 210, 210, 210, 210, 210, + 0, 15, 112, 15, 6, 0, 17, 50, 52, 51, 81, 81, + 65, 81, 65, 65, 240, 32, 9, 10, 0, 23, 104, 40, + 0, 16, 64, 10, 5, 0, 14, 51, 35, 35, 240, 240, + 192, 32, 9, 0, 8, 81, 129, 114, 113, 129, 129, 114, + 113, 129, 129, 114, 114, 113, 129, 129, 114, 113, 129, 129, + 114, 114, 113, 129, 129, 114, 113, 240, 32, 43, 14, 0, + 12, 100, 145, 65, 113, 97, 82, 97, 81, 129, 65, 129, + 50, 130, 34, 130, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 49, 129, 65, 129, 66, 98, 81, 97, 113, 65, + 148, 0, 14, 96, 27, 11, 0, 10, 33, 146, 131, 116, + 82, 34, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 104, 0, 11, 32, 37, 13, 0, 11, 101, + 113, 66, 81, 98, 49, 130, 33, 130, 33, 130, 33, 34, + 66, 37, 66, 52, 50, 178, 177, 178, 162, 162, 162, 162, + 81, 66, 97, 58, 43, 0, 13, 32, 37, 13, 0, 11, + 101, 113, 66, 81, 98, 66, 82, 67, 66, 81, 82, 177, + 178, 146, 146, 34, 194, 194, 178, 35, 98, 35, 98, 34, + 114, 34, 98, 66, 66, 102, 0, 13, 80, 33, 14, 0, + 11, 50, 194, 179, 178, 194, 178, 194, 178, 33, 145, 34, + 129, 50, 113, 66, 113, 66, 82, 82, 92, 146, 194, 194, + 194, 194, 152, 0, 14, 32, 37, 13, 0, 10, 97, 98, + 49, 117, 117, 129, 193, 193, 193, 21, 98, 66, 81, 98, + 65, 99, 178, 178, 178, 50, 98, 35, 98, 35, 97, 50, + 98, 65, 82, 101, 0, 13, 96, 42, 14, 0, 12, 100, + 146, 49, 114, 81, 97, 82, 82, 82, 81, 194, 194, 37, + 82, 17, 66, 67, 98, 50, 130, 34, 130, 34, 130, 34, + 130, 49, 130, 50, 113, 81, 98, 82, 66, 133, 0, 14, + 80, 33, 14, 0, 12, 49, 19, 81, 33, 21, 65, 55, + 33, 65, 54, 49, 129, 209, 193, 209, 209, 193, 209, 193, + 194, 194, 178, 194, 179, 179, 178, 0, 15, 16, 41, 14, + 0, 12, 85, 130, 51, 82, 83, 50, 114, 50, 114, 50, + 114, 51, 97, 84, 49, 118, 150, 129, 37, 66, 83, 65, + 115, 34, 130, 34, 130, 34, 130, 50, 98, 67, 66, 117, + 0, 14, 96, 42, 14, 0, 12, 85, 130, 65, 98, 97, + 81, 114, 50, 129, 50, 130, 34, 130, 34, 130, 34, 130, + 50, 99, 51, 65, 18, 85, 34, 194, 193, 82, 82, 82, + 81, 97, 82, 98, 50, 148, 0, 14, 96, 15, 5, 0, + 8, 99, 35, 35, 240, 240, 35, 35, 35, 240, 240, 192, + 20, 6, 0, 10, 83, 51, 51, 240, 240, 146, 67, 51, + 81, 81, 65, 81, 65, 65, 240, 32, 21, 14, 0, 22, + 49, 179, 147, 147, 162, 163, 147, 178, 211, 211, 211, 210, + 226, 210, 0, 14, 32, 11, 15, 0, 31, 125, 0, 5, + 125, 0, 22, 96, 21, 14, 0, 21, 1, 211, 211, 211, + 210, 226, 211, 194, 163, 147, 147, 147, 162, 178, 0, 15, + 64, 30, 10, 0, 7, 84, 82, 49, 66, 50, 50, 66, + 130, 130, 130, 130, 130, 65, 34, 84, 97, 145, 145, 145, + 240, 211, 115, 115, 0, 10, 96, 72, 22, 0, 25, 102, + 227, 82, 163, 145, 130, 193, 98, 225, 82, 225, 66, 99, + 34, 49, 50, 66, 49, 18, 49, 34, 66, 67, 65, 34, + 66, 67, 65, 34, 50, 83, 65, 34, 50, 83, 65, 34, + 50, 82, 65, 50, 50, 67, 65, 50, 50, 67, 65, 66, + 50, 33, 18, 49, 82, 67, 52, 114, 240, 98, 193, 130, + 162, 147, 98, 215, 0, 9, 32, 45, 20, 0, 16, 1, + 240, 66, 240, 50, 240, 35, 240, 36, 240, 20, 241, 19, + 241, 35, 225, 35, 209, 51, 209, 67, 193, 67, 185, 177, + 99, 161, 99, 145, 116, 129, 131, 129, 131, 129, 147, 70, + 72, 0, 20, 32, 42, 16, 0, 14, 10, 130, 83, 98, + 99, 82, 114, 82, 114, 82, 114, 82, 113, 98, 98, 104, + 130, 83, 98, 99, 82, 115, 66, 115, 66, 115, 66, 115, + 66, 115, 66, 99, 82, 83, 75, 0, 16, 80, 37, 17, + 0, 15, 89, 98, 84, 82, 130, 66, 146, 51, 161, 50, + 177, 35, 227, 227, 227, 227, 227, 227, 242, 177, 51, 161, + 66, 146, 82, 130, 98, 84, 134, 33, 0, 17, 32, 42, + 19, 0, 16, 91, 162, 99, 130, 130, 114, 146, 98, 147, + 82, 147, 82, 163, 66, 163, 66, 163, 66, 163, 66, 163, + 66, 163, 66, 163, 66, 162, 82, 147, 82, 146, 98, 131, + 98, 99, 107, 0, 20, 42, 17, 0, 14, 126, 82, 115, + 82, 130, 82, 145, 82, 145, 82, 97, 130, 82, 130, 67, + 137, 130, 67, 130, 82, 130, 97, 130, 97, 130, 161, 66, + 161, 66, 161, 66, 146, 66, 116, 47, 0, 17, 32, 38, + 16, 0, 14, 14, 66, 115, 66, 130, 66, 145, 66, 81, + 49, 66, 81, 130, 66, 130, 66, 136, 130, 66, 130, 66, + 130, 81, 130, 81, 130, 226, 226, 226, 226, 198, 0, 17, + 32, 44, 21, 0, 19, 22, 211, 68, 146, 130, 130, 161, + 115, 161, 114, 240, 51, 240, 51, 240, 51, 240, 51, 240, + 51, 240, 51, 106, 35, 163, 98, 163, 99, 147, 114, 147, + 130, 116, 146, 85, 182, 49, 0, 21, 80, 44, 18, 0, + 15, 103, 39, 66, 130, 98, 130, 98, 130, 98, 130, 98, + 130, 98, 130, 98, 130, 108, 98, 130, 98, 130, 98, 130, + 98, 130, 98, 130, 98, 130, 98, 130, 98, 130, 98, 130, + 71, 39, 0, 18, 32, 26, 8, 0, 7, 6, 66, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 70, 0, 8, 32, 30, 11, 0, 9, 119, + 114, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 81, 50, 67, 34, 67, 34, 66, 34, 100, 0, 11, + 96, 45, 19, 0, 16, 86, 39, 98, 113, 146, 97, 162, + 81, 178, 65, 194, 65, 194, 49, 210, 34, 210, 19, 211, + 19, 194, 36, 178, 51, 178, 67, 162, 83, 146, 84, 130, + 99, 130, 115, 114, 116, 70, 56, 0, 19, 32, 32, 17, + 0, 14, 119, 194, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 161, 66, 145, 82, 146, 66, 146, 66, 131, + 66, 116, 47, 0, 17, 32, 71, 22, 0, 19, 39, 133, + 84, 131, 116, 131, 113, 19, 97, 18, 113, 19, 97, 18, + 113, 19, 97, 18, 113, 35, 65, 34, 113, 35, 65, 34, + 113, 35, 65, 34, 113, 51, 33, 50, 113, 51, 33, 50, + 113, 51, 33, 50, 113, 66, 17, 66, 113, 68, 66, 113, + 68, 66, 113, 67, 82, 113, 82, 82, 113, 82, 82, 71, + 33, 70, 0, 22, 32, 55, 20, 0, 17, 71, 86, 85, + 97, 129, 19, 97, 129, 20, 81, 129, 35, 81, 129, 36, + 65, 129, 51, 65, 129, 67, 49, 129, 67, 49, 129, 83, + 33, 129, 84, 17, 129, 99, 17, 129, 101, 129, 116, 129, + 131, 129, 131, 129, 146, 129, 146, 86, 129, 0, 20, 80, + 42, 19, 0, 17, 53, 194, 82, 146, 114, 114, 146, 83, + 147, 66, 178, 51, 179, 35, 179, 35, 179, 35, 179, 35, + 179, 35, 179, 35, 179, 50, 178, 67, 147, 82, 146, 114, + 114, 146, 82, 197, 0, 20, 35, 16, 0, 14, 10, 130, + 83, 98, 99, 82, 114, 82, 115, 66, 115, 66, 115, 66, + 115, 66, 114, 82, 99, 89, 114, 226, 226, 226, 226, 226, + 226, 199, 0, 17, 16, 55, 20, 0, 18, 37, 210, 82, + 162, 114, 130, 146, 99, 147, 82, 178, 67, 179, 51, 179, + 51, 179, 51, 179, 51, 179, 51, 179, 51, 179, 66, 178, + 83, 147, 98, 146, 115, 114, 162, 82, 198, 240, 18, 240, + 67, 240, 52, 240, 21, 240, 21, 240, 38, 240, 240, 192, + 43, 19, 0, 16, 89, 194, 67, 162, 83, 146, 98, 146, + 98, 146, 98, 146, 98, 146, 82, 167, 194, 82, 162, 98, + 146, 114, 130, 114, 130, 114, 130, 114, 130, 114, 130, 114, + 130, 115, 87, 85, 0, 19, 32, 36, 15, 0, 13, 87, + 99, 51, 97, 98, 82, 113, 82, 113, 82, 211, 213, 168, + 151, 181, 196, 195, 33, 162, 33, 162, 34, 146, 35, 114, + 52, 82, 65, 53, 0, 15, 96, 50, 19, 0, 16, 95, + 2, 36, 50, 68, 34, 82, 83, 34, 82, 98, 33, 98, + 113, 33, 98, 113, 33, 98, 113, 33, 98, 113, 146, 240, + 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 240, 34, 247, 0, 19, 112, 43, 20, 0, + 17, 71, 71, 66, 161, 114, 161, 114, 161, 114, 161, 114, + 161, 114, 161, 114, 161, 114, 161, 114, 161, 114, 161, 114, + 161, 114, 161, 114, 161, 114, 161, 114, 146, 130, 129, 162, + 82, 199, 0, 21, 44, 20, 0, 17, 72, 70, 67, 145, + 131, 129, 131, 129, 131, 113, 163, 97, 163, 97, 179, 65, + 195, 65, 195, 65, 211, 33, 227, 33, 227, 33, 244, 240, + 20, 240, 35, 240, 34, 240, 50, 240, 65, 0, 21, 32, + 69, 28, 0, 24, 71, 56, 53, 67, 130, 129, 99, 131, + 113, 115, 115, 113, 115, 115, 97, 131, 97, 19, 81, 147, + 81, 19, 81, 147, 81, 34, 65, 163, 65, 51, 49, 179, + 49, 51, 49, 179, 49, 66, 49, 179, 33, 83, 17, 211, + 17, 83, 17, 211, 17, 98, 17, 212, 115, 243, 115, 243, + 130, 242, 146, 240, 17, 145, 0, 29, 16, 46, 20, 0, + 17, 73, 38, 99, 113, 163, 81, 179, 81, 195, 49, 212, + 17, 243, 17, 240, 19, 240, 36, 240, 35, 240, 17, 19, + 241, 19, 225, 51, 193, 68, 177, 83, 161, 115, 129, 132, + 113, 147, 71, 41, 0, 20, 32, 43, 19, 0, 16, 89, + 38, 83, 113, 131, 113, 147, 81, 163, 81, 179, 49, 210, + 49, 211, 17, 242, 17, 243, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 246, 0, + 19, 112, 38, 16, 0, 14, 13, 51, 115, 50, 115, 66, + 100, 65, 115, 81, 99, 97, 99, 195, 211, 195, 196, 195, + 195, 113, 83, 113, 67, 129, 52, 114, 51, 130, 36, 100, + 46, 0, 16, 32, 32, 8, 0, 6, 6, 34, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 102, 160, + 31, 9, 0, 7, 113, 130, 129, 129, 129, 130, 114, 129, + 129, 129, 130, 129, 129, 129, 130, 129, 129, 129, 129, 130, + 129, 129, 129, 130, 129, 129, 176, 32, 8, 0, 6, 6, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 38, 160, 23, 15, 0, 11, 114, 211, 177, 19, 145, + 50, 145, 66, 113, 82, 97, 114, 81, 130, 49, 146, 226, + 0, 34, 8, 15, 0, 56, 45, 0, 5, 112, 11, 5, + 240, 240, 82, 50, 66, 65, 65, 0, 14, 28, 12, 0, + 21, 36, 113, 50, 82, 66, 66, 66, 162, 147, 99, 18, + 66, 66, 66, 66, 66, 66, 66, 51, 84, 35, 0, 12, + 32, 41, 14, 0, 10, 68, 194, 194, 194, 194, 194, 194, + 194, 194, 35, 114, 17, 35, 83, 66, 82, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 67, 66, 82, 17, + 50, 52, 35, 0, 14, 80, 27, 11, 0, 19, 84, 98, + 49, 66, 66, 34, 82, 34, 81, 50, 146, 146, 97, 34, + 97, 50, 81, 66, 49, 100, 0, 11, 64, 41, 15, 0, + 12, 5, 210, 210, 210, 210, 210, 210, 210, 116, 34, 83, + 49, 18, 82, 83, 66, 114, 66, 114, 66, 114, 66, 114, + 66, 114, 66, 114, 82, 83, 83, 49, 18, 116, 36, 0, + 15, 32, 26, 12, 0, 21, 53, 98, 50, 66, 81, 50, + 98, 34, 98, 42, 34, 162, 162, 113, 50, 97, 66, 65, + 101, 0, 12, 64, 30, 12, 0, 9, 84, 114, 34, 82, + 50, 81, 66, 66, 162, 162, 162, 135, 114, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 134, 0, 12, 96, 41, 14, + 0, 24, 117, 34, 66, 51, 17, 50, 82, 17, 50, 82, + 82, 82, 82, 82, 98, 50, 97, 36, 97, 209, 209, 217, + 105, 98, 67, 66, 98, 50, 114, 50, 114, 50, 98, 82, + 66, 118, 96, 40, 15, 0, 11, 36, 210, 210, 210, 210, + 210, 210, 210, 210, 36, 114, 17, 34, 115, 66, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 70, 22, 0, 15, 32, 24, 7, 240, 240, 211, + 67, 67, 240, 240, 132, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 53, 0, 7, 32, 34, 9, 0, 7, 35, + 99, 99, 0, 6, 36, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 49, 50, 34, 50, 34, + 49, 50, 34, 68, 64, 38, 15, 0, 11, 36, 210, 210, + 210, 210, 210, 210, 210, 210, 52, 98, 65, 130, 49, 146, + 33, 162, 18, 166, 146, 34, 146, 35, 130, 51, 114, 67, + 98, 82, 70, 22, 0, 15, 32, 27, 8, 0, 6, 4, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 70, 0, 8, 32, 45, 22, + 0, 38, 68, 35, 67, 130, 17, 34, 33, 34, 115, 67, + 66, 98, 82, 82, 98, 82, 82, 98, 82, 82, 98, 82, + 82, 98, 82, 82, 98, 82, 82, 98, 82, 82, 98, 82, + 82, 70, 22, 22, 0, 22, 32, 32, 15, 0, 26, 36, + 36, 114, 17, 34, 115, 66, 98, 82, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 70, 22, + 0, 15, 32, 29, 13, 0, 23, 21, 114, 50, 82, 82, + 50, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, + 50, 82, 82, 50, 117, 0, 13, 80, 39, 14, 0, 24, + 68, 35, 114, 17, 35, 83, 66, 82, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 67, 66, 82, 17, 50, + 82, 36, 98, 194, 194, 194, 194, 194, 194, 167, 112, 39, + 15, 0, 26, 84, 36, 51, 49, 18, 82, 83, 66, 114, + 66, 114, 66, 114, 66, 114, 66, 114, 66, 114, 82, 83, + 83, 49, 18, 116, 34, 210, 210, 210, 210, 210, 210, 210, + 167, 32, 23, 11, 0, 19, 36, 34, 84, 18, 67, 34, + 66, 50, 66, 146, 146, 146, 146, 146, 146, 118, 0, 11, + 80, 25, 10, 0, 17, 86, 50, 50, 50, 65, 50, 65, + 51, 133, 116, 131, 33, 82, 33, 82, 34, 50, 54, 0, + 10, 64, 25, 10, 0, 14, 2, 130, 130, 103, 82, 130, + 130, 130, 130, 130, 130, 130, 49, 66, 33, 82, 33, 99, + 0, 10, 64, 32, 15, 0, 26, 36, 52, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 67, 99, 33, 18, 116, 36, 0, 15, 32, 26, + 13, 0, 22, 101, 36, 50, 97, 82, 65, 98, 65, 99, + 33, 130, 33, 130, 33, 132, 163, 163, 177, 193, 0, 13, + 112, 41, 20, 0, 35, 5, 37, 36, 50, 82, 81, 98, + 67, 65, 98, 67, 49, 114, 49, 19, 33, 130, 33, 34, + 33, 130, 33, 34, 17, 148, 52, 163, 67, 162, 82, 178, + 82, 193, 97, 0, 20, 112, 28, 15, 0, 26, 38, 20, + 98, 65, 146, 33, 163, 17, 179, 210, 211, 177, 18, 161, + 35, 145, 50, 129, 82, 85, 23, 0, 15, 32, 36, 15, + 0, 26, 53, 52, 66, 97, 114, 65, 130, 65, 131, 49, + 146, 33, 162, 33, 178, 17, 179, 195, 210, 209, 225, 225, + 209, 225, 161, 49, 146, 33, 162, 33, 179, 176, 25, 11, + 0, 19, 40, 49, 67, 49, 66, 131, 130, 130, 131, 130, + 65, 51, 65, 50, 81, 35, 66, 41, 0, 11, 32, 32, + 8, 0, 6, 66, 81, 98, 98, 98, 98, 99, 98, 98, + 98, 98, 97, 98, 66, 130, 113, 114, 98, 98, 98, 83, + 82, 98, 98, 98, 113, 130, 160, 30, 4, 240, 210, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 96, 32, 8, 0, 6, 2, 129, 114, 98, 98, 98, 83, + 82, 98, 98, 98, 113, 114, 130, 66, 82, 98, 98, 98, + 98, 99, 98, 98, 98, 98, 97, 82, 224, 13, 14, 0, + 30, 19, 81, 50, 35, 33, 49, 99, 0, 25, 5, 10, + 0, 42, 64, 23, 6, 0, 10, 82, 52, 50, 240, 114, + 66, 66, 66, 66, 66, 66, 66, 52, 36, 36, 36, 36, + 50, 48, 47, 11, 0, 10, 81, 146, 146, 145, 161, 146, + 145, 116, 98, 34, 66, 33, 18, 34, 49, 18, 34, 49, + 17, 50, 33, 98, 33, 98, 17, 65, 34, 17, 65, 51, + 65, 66, 49, 85, 97, 145, 161, 161, 145, 161, 161, 240, + 96, 43, 18, 0, 16, 117, 194, 65, 147, 97, 131, 50, + 17, 115, 53, 115, 67, 131, 243, 243, 202, 179, 240, 18, + 240, 18, 240, 18, 240, 18, 81, 83, 33, 97, 65, 51, + 82, 65, 73, 84, 53, 0, 18, 80, 31, 12, 0, 21, + 1, 36, 33, 50, 66, 65, 97, 49, 129, 33, 129, 33, + 129, 33, 129, 33, 129, 49, 97, 66, 66, 49, 36, 33, + 0, 13, 96, 33, 16, 0, 14, 6, 68, 66, 113, 99, + 81, 130, 81, 131, 49, 162, 49, 178, 17, 195, 170, 162, + 226, 226, 170, 162, 226, 226, 226, 226, 198, 0, 16, 96, + 25, 4, 240, 210, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 240, 178, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 96, 50, 11, 0, 9, 117, 82, 50, 50, 82, 34, 67, + 34, 67, 35, 50, 66, 162, 133, 81, 36, 65, 52, 49, + 82, 50, 82, 35, 66, 51, 65, 67, 49, 83, 17, 116, + 131, 146, 147, 35, 66, 35, 66, 34, 82, 34, 81, 66, + 50, 84, 80, 11, 9, 0, 10, 18, 50, 34, 50, 0, + 26, 16, 64, 22, 0, 17, 54, 226, 98, 162, 162, 114, + 194, 97, 71, 49, 81, 65, 82, 65, 65, 49, 113, 65, + 49, 50, 113, 81, 33, 50, 209, 33, 50, 209, 33, 50, + 209, 33, 50, 209, 33, 50, 113, 81, 49, 50, 97, 65, + 65, 66, 66, 65, 81, 69, 17, 49, 98, 194, 114, 162, + 162, 98, 230, 0, 23, 16, 20, 9, 0, 8, 4, 65, + 50, 50, 34, 114, 69, 50, 34, 50, 34, 52, 18, 0, + 21, 80, 21, 8, 0, 16, 33, 97, 34, 34, 18, 50, + 18, 50, 18, 50, 18, 65, 34, 65, 0, 10, 80, 13, + 16, 0, 32, 14, 226, 226, 226, 226, 226, 0, 24, 32, + 9, 10, 0, 23, 104, 40, 0, 16, 64, 67, 22, 0, + 17, 54, 226, 98, 162, 162, 114, 194, 97, 25, 65, 81, + 66, 51, 65, 65, 66, 66, 65, 49, 82, 66, 81, 33, + 82, 50, 97, 33, 85, 129, 33, 82, 50, 97, 33, 82, + 66, 81, 33, 82, 66, 81, 49, 66, 66, 65, 65, 66, + 66, 65, 81, 22, 51, 17, 98, 194, 114, 162, 162, 98, + 230, 0, 23, 16, 8, 9, 0, 11, 39, 0, 26, 16, + 25, 12, 0, 9, 52, 98, 66, 65, 97, 49, 129, 33, + 129, 33, 129, 33, 129, 49, 97, 66, 66, 100, 0, 27, + 80, 23, 15, 0, 21, 50, 210, 210, 210, 210, 210, 125, + 130, 210, 210, 210, 210, 210, 240, 240, 125, 0, 13, 48, + 23, 9, 0, 8, 4, 66, 35, 33, 66, 33, 17, 34, + 35, 34, 113, 113, 113, 98, 49, 54, 0, 19, 48, 23, + 9, 0, 7, 119, 33, 65, 49, 34, 97, 131, 130, 130, + 34, 50, 33, 66, 33, 50, 68, 0, 18, 64, 12, 5, + 240, 240, 98, 50, 34, 49, 65, 0, 14, 32, 41, 15, + 0, 26, 50, 82, 98, 67, 98, 67, 98, 67, 98, 67, + 97, 82, 113, 82, 113, 82, 113, 67, 113, 68, 33, 33, + 17, 35, 35, 33, 36, 66, 33, 225, 225, 226, 210, 210, + 211, 209, 208, 57, 14, 0, 12, 89, 52, 49, 100, 49, + 85, 49, 85, 49, 85, 49, 85, 49, 85, 49, 100, 49, + 115, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, + 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, + 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 240, 64, + 9, 5, 0, 10, 83, 35, 35, 0, 9, 12, 7, 0, + 24, 97, 113, 50, 33, 33, 34, 51, 160, 19, 8, 0, + 7, 34, 98, 98, 68, 65, 18, 98, 98, 98, 98, 98, + 70, 0, 16, 32, 21, 9, 0, 8, 19, 82, 18, 50, + 50, 34, 50, 34, 50, 34, 50, 50, 18, 83, 0, 21, + 112, 21, 8, 0, 16, 49, 66, 33, 66, 18, 50, 18, + 50, 18, 50, 18, 34, 33, 97, 0, 10, 64, 54, 19, + 0, 15, 98, 114, 129, 130, 114, 115, 113, 113, 18, 98, + 146, 97, 162, 82, 162, 81, 178, 65, 50, 114, 65, 50, + 85, 33, 66, 178, 65, 193, 81, 178, 65, 33, 145, 81, + 18, 130, 65, 34, 17, 97, 86, 98, 130, 113, 146, 97, + 162, 0, 19, 64, 56, 19, 0, 15, 113, 114, 145, 114, + 129, 115, 114, 97, 18, 113, 146, 97, 162, 97, 162, 81, + 178, 81, 178, 65, 36, 69, 34, 18, 34, 161, 33, 66, + 129, 49, 33, 18, 129, 67, 18, 113, 145, 114, 130, 113, + 145, 114, 129, 33, 81, 129, 49, 65, 134, 0, 19, 32, + 57, 20, 0, 16, 82, 86, 113, 97, 49, 114, 97, 33, + 129, 145, 130, 147, 97, 195, 49, 226, 49, 146, 50, 33, + 50, 81, 51, 18, 50, 100, 49, 66, 194, 65, 209, 81, + 193, 81, 33, 161, 81, 18, 145, 81, 34, 17, 113, 86, + 113, 146, 114, 146, 113, 162, 0, 20, 64, 28, 10, 0, + 18, 3, 115, 115, 240, 209, 145, 145, 145, 100, 82, 33, + 66, 130, 130, 130, 130, 130, 66, 50, 50, 65, 50, 84, + 48, 53, 20, 240, 162, 240, 51, 240, 66, 240, 82, 240, + 240, 113, 240, 66, 240, 50, 240, 35, 240, 36, 240, 20, + 241, 19, 241, 35, 225, 35, 209, 52, 193, 67, 193, 67, + 201, 161, 99, 161, 99, 161, 115, 129, 131, 129, 131, 129, + 147, 70, 72, 0, 20, 32, 56, 21, 240, 240, 34, 240, + 51, 240, 34, 240, 34, 240, 240, 193, 240, 66, 240, 66, + 240, 67, 240, 36, 240, 33, 19, 240, 17, 19, 241, 35, + 241, 51, 225, 51, 209, 67, 209, 83, 201, 193, 83, 177, + 115, 161, 115, 161, 115, 145, 147, 129, 147, 87, 57, 0, + 21, 32, 54, 20, 240, 210, 240, 33, 18, 241, 50, 209, + 82, 240, 240, 81, 240, 66, 240, 50, 240, 35, 240, 36, + 240, 20, 241, 19, 241, 35, 225, 35, 209, 51, 209, 67, + 193, 67, 185, 177, 99, 161, 99, 145, 116, 129, 131, 129, + 131, 129, 147, 70, 72, 0, 20, 32, 51, 20, 240, 240, + 244, 49, 177, 52, 0, 7, 1, 240, 66, 240, 50, 240, + 35, 240, 36, 240, 20, 241, 19, 241, 35, 225, 35, 209, + 51, 209, 67, 193, 67, 185, 177, 99, 161, 99, 145, 116, + 129, 131, 129, 131, 129, 147, 70, 72, 0, 20, 32, 52, + 20, 240, 240, 242, 66, 194, 66, 0, 6, 114, 240, 50, + 240, 50, 240, 51, 240, 20, 240, 20, 240, 17, 19, 225, + 35, 225, 35, 225, 51, 193, 67, 193, 67, 201, 177, 83, + 161, 99, 161, 115, 145, 115, 129, 131, 129, 147, 70, 72, + 0, 20, 32, 58, 21, 116, 240, 18, 50, 225, 81, 225, + 81, 226, 50, 245, 240, 49, 240, 81, 240, 67, 240, 51, + 240, 51, 240, 33, 19, 240, 17, 19, 240, 17, 35, 225, + 51, 225, 51, 225, 67, 193, 83, 201, 193, 99, 161, 115, + 161, 115, 161, 131, 145, 131, 129, 148, 71, 57, 0, 21, + 32, 60, 29, 0, 26, 95, 1, 240, 19, 115, 241, 18, + 130, 225, 34, 145, 225, 34, 145, 209, 50, 97, 241, 66, + 82, 241, 66, 67, 239, 225, 82, 67, 209, 98, 82, 209, + 98, 97, 193, 114, 97, 177, 130, 161, 113, 130, 161, 97, + 146, 161, 97, 146, 146, 81, 162, 116, 39, 95, 0, 29, + 32, 48, 17, 0, 15, 89, 98, 84, 82, 130, 66, 146, + 51, 161, 50, 177, 35, 227, 227, 227, 227, 227, 227, 242, + 177, 51, 161, 66, 146, 82, 130, 98, 84, 134, 33, 240, + 193, 240, 18, 240, 33, 179, 34, 162, 50, 162, 35, 181, + 96, 48, 17, 240, 82, 244, 243, 240, 18, 240, 240, 206, + 82, 115, 82, 130, 82, 145, 82, 145, 82, 97, 130, 82, + 130, 67, 137, 130, 67, 130, 82, 130, 97, 130, 97, 130, + 161, 66, 161, 66, 161, 66, 146, 66, 116, 47, 0, 17, + 32, 47, 17, 240, 178, 227, 210, 210, 240, 240, 238, 82, + 115, 82, 130, 82, 145, 82, 145, 82, 97, 130, 82, 130, + 67, 137, 130, 67, 130, 82, 130, 97, 130, 97, 130, 161, + 66, 161, 66, 161, 66, 146, 66, 116, 47, 0, 17, 32, + 50, 17, 240, 131, 209, 19, 177, 51, 145, 83, 240, 240, + 158, 82, 115, 82, 130, 82, 145, 82, 145, 82, 97, 130, + 82, 130, 67, 137, 130, 67, 130, 82, 130, 97, 130, 97, + 130, 161, 66, 161, 66, 161, 66, 146, 66, 116, 47, 0, + 17, 32, 48, 17, 240, 240, 114, 66, 146, 66, 0, 7, + 30, 82, 115, 82, 130, 82, 145, 82, 145, 82, 97, 130, + 82, 130, 67, 137, 130, 67, 130, 82, 130, 97, 130, 97, + 130, 161, 66, 161, 66, 161, 66, 146, 66, 116, 47, 0, + 17, 32, 29, 8, 129, 114, 114, 129, 240, 86, 66, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 70, 0, 8, 32, 29, 9, 226, 99, 82, + 98, 240, 135, 66, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 87, 0, 9, 32, + 31, 9, 178, 97, 18, 65, 50, 130, 240, 86, 82, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 86, 0, 9, 48, 31, 10, 240, 82, 66, + 34, 66, 240, 240, 40, 82, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, 0, + 10, 32, 42, 20, 0, 17, 91, 178, 99, 146, 130, 130, + 146, 114, 147, 98, 147, 98, 163, 82, 163, 82, 163, 41, + 99, 82, 163, 82, 163, 82, 163, 82, 162, 98, 147, 98, + 146, 114, 131, 114, 99, 123, 0, 21, 61, 20, 0, 5, + 100, 49, 177, 52, 0, 8, 55, 86, 85, 97, 129, 19, + 97, 129, 20, 81, 129, 35, 81, 129, 36, 65, 129, 51, + 65, 129, 67, 49, 129, 67, 49, 129, 83, 33, 129, 84, + 17, 129, 99, 17, 129, 101, 129, 116, 129, 131, 129, 131, + 129, 146, 129, 146, 86, 129, 0, 20, 80, 50, 19, 240, + 146, 240, 35, 240, 50, 240, 50, 0, 6, 85, 194, 82, + 146, 114, 114, 146, 83, 147, 66, 178, 51, 179, 35, 179, + 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, 50, 178, + 67, 147, 82, 146, 114, 114, 146, 82, 197, 0, 20, 49, + 19, 240, 226, 240, 19, 242, 240, 18, 0, 6, 101, 194, + 82, 146, 114, 114, 146, 83, 147, 66, 178, 51, 179, 35, + 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, 50, + 178, 67, 147, 82, 146, 114, 114, 146, 82, 197, 0, 20, + 51, 19, 129, 240, 35, 241, 34, 225, 50, 193, 82, 0, + 6, 37, 194, 82, 146, 114, 114, 146, 83, 147, 66, 178, + 51, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, + 35, 179, 50, 178, 67, 147, 82, 146, 114, 114, 146, 82, + 197, 0, 20, 48, 19, 240, 240, 212, 49, 161, 52, 0, + 8, 101, 194, 82, 146, 114, 114, 146, 83, 147, 66, 178, + 51, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, + 35, 179, 50, 178, 67, 147, 82, 146, 114, 114, 146, 82, + 197, 0, 20, 48, 19, 240, 240, 210, 66, 178, 66, 0, + 8, 85, 194, 82, 146, 114, 114, 146, 83, 147, 66, 178, + 51, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, + 35, 179, 50, 178, 67, 147, 82, 146, 114, 114, 146, 82, + 197, 0, 20, 25, 12, 0, 21, 2, 113, 50, 82, 66, + 50, 98, 18, 131, 146, 146, 17, 114, 49, 82, 81, 50, + 113, 0, 15, 32, 55, 19, 0, 17, 53, 81, 98, 82, + 34, 82, 116, 82, 146, 83, 132, 66, 130, 18, 51, 129, + 35, 35, 113, 51, 35, 97, 67, 35, 81, 83, 35, 65, + 99, 35, 49, 115, 35, 33, 131, 50, 18, 130, 68, 131, + 82, 146, 84, 114, 82, 34, 82, 97, 85, 0, 20, 51, + 20, 240, 162, 240, 51, 240, 66, 240, 81, 0, 6, 39, + 71, 66, 161, 114, 161, 114, 161, 114, 161, 114, 161, 114, + 161, 114, 161, 114, 161, 114, 161, 114, 161, 114, 161, 114, + 161, 114, 161, 114, 161, 114, 146, 130, 129, 162, 82, 199, + 0, 21, 51, 20, 240, 243, 240, 19, 240, 18, 240, 33, + 0, 6, 71, 71, 66, 161, 114, 161, 114, 161, 114, 161, + 114, 161, 114, 161, 114, 161, 114, 161, 114, 161, 114, 161, + 114, 161, 114, 161, 114, 161, 114, 161, 114, 146, 130, 129, + 162, 82, 199, 0, 21, 52, 20, 130, 240, 36, 241, 35, + 209, 66, 209, 82, 0, 5, 119, 71, 66, 161, 114, 161, + 114, 161, 114, 161, 114, 161, 114, 161, 114, 161, 114, 161, + 114, 161, 114, 161, 114, 161, 114, 161, 114, 161, 114, 161, + 114, 146, 130, 129, 162, 82, 199, 0, 21, 49, 20, 240, + 240, 242, 66, 194, 66, 0, 8, 55, 71, 66, 161, 114, + 161, 114, 161, 114, 161, 114, 161, 114, 161, 114, 161, 114, + 161, 114, 161, 114, 161, 114, 161, 114, 161, 114, 161, 114, + 161, 114, 146, 130, 129, 162, 82, 199, 0, 21, 54, 20, + 240, 240, 34, 240, 35, 240, 18, 240, 33, 0, 6, 41, + 39, 83, 129, 131, 129, 147, 97, 163, 81, 195, 65, 210, + 49, 227, 33, 242, 17, 240, 20, 240, 34, 240, 50, 240, + 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, + 23, 0, 20, 112, 41, 16, 0, 14, 7, 178, 226, 226, + 226, 226, 202, 130, 83, 98, 99, 82, 114, 82, 115, 66, + 115, 66, 115, 66, 115, 66, 114, 82, 99, 89, 114, 226, + 226, 226, 226, 226, 226, 226, 226, 199, 144, 49, 14, 0, + 11, 20, 145, 50, 114, 66, 97, 82, 82, 82, 82, 82, + 82, 66, 98, 50, 114, 18, 146, 50, 114, 81, 98, 82, + 82, 98, 66, 98, 66, 98, 66, 98, 66, 19, 34, 66, + 18, 49, 82, 18, 34, 52, 36, 0, 14, 64, 35, 12, + 0, 10, 98, 162, 177, 193, 177, 240, 240, 52, 113, 50, + 82, 66, 66, 66, 162, 147, 99, 18, 67, 50, 66, 66, + 66, 66, 67, 35, 84, 35, 0, 12, 32, 35, 12, 0, + 11, 2, 162, 146, 161, 177, 240, 240, 68, 113, 50, 82, + 66, 66, 66, 162, 147, 99, 18, 66, 66, 66, 66, 66, + 66, 66, 51, 84, 35, 0, 12, 32, 37, 12, 0, 10, + 114, 145, 18, 129, 18, 113, 50, 178, 240, 244, 113, 50, + 82, 66, 66, 66, 162, 147, 99, 18, 66, 66, 66, 66, + 66, 66, 66, 51, 84, 35, 0, 12, 32, 34, 12, 0, + 13, 83, 49, 65, 51, 240, 240, 212, 113, 50, 82, 66, + 66, 66, 162, 147, 99, 18, 66, 66, 66, 66, 66, 66, + 66, 51, 84, 35, 0, 12, 32, 34, 12, 0, 13, 82, + 50, 82, 50, 240, 240, 196, 113, 50, 82, 66, 66, 66, + 162, 147, 99, 18, 66, 66, 66, 66, 66, 66, 66, 51, + 84, 35, 0, 12, 32, 40, 12, 0, 9, 36, 114, 34, + 97, 65, 97, 65, 98, 34, 116, 240, 240, 36, 113, 50, + 82, 66, 66, 66, 162, 147, 99, 18, 66, 66, 66, 66, + 66, 66, 66, 51, 84, 35, 0, 12, 32, 38, 18, 0, + 31, 116, 52, 97, 50, 17, 50, 66, 66, 81, 66, 66, + 82, 146, 82, 138, 68, 18, 147, 66, 146, 82, 97, 34, + 83, 81, 34, 65, 18, 65, 69, 53, 0, 18, 64, 34, + 11, 0, 19, 84, 98, 49, 66, 66, 34, 82, 34, 81, + 50, 146, 146, 97, 34, 97, 50, 81, 66, 49, 100, 240, + 240, 33, 114, 17, 113, 33, 130, 240, 192, 32, 12, 0, + 10, 114, 162, 178, 177, 240, 240, 245, 98, 50, 66, 81, + 50, 98, 34, 98, 42, 34, 162, 162, 113, 50, 97, 66, + 65, 101, 0, 12, 64, 33, 12, 0, 11, 34, 147, 146, + 146, 161, 240, 240, 69, 98, 50, 66, 81, 50, 98, 34, + 98, 42, 34, 162, 162, 113, 50, 97, 66, 65, 101, 0, + 12, 64, 35, 12, 0, 11, 3, 129, 18, 129, 34, 97, + 50, 178, 240, 245, 98, 50, 66, 81, 50, 98, 34, 98, + 42, 34, 162, 162, 113, 50, 97, 66, 65, 101, 0, 12, + 64, 32, 12, 0, 13, 98, 50, 82, 50, 240, 240, 197, + 98, 50, 66, 81, 50, 98, 34, 98, 42, 34, 162, 162, + 113, 50, 97, 66, 65, 101, 0, 12, 64, 25, 8, 0, + 7, 17, 114, 98, 113, 129, 240, 84, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 70, 0, 8, 32, 25, 8, + 0, 7, 50, 98, 82, 97, 97, 240, 116, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 70, 0, 8, 32, 27, + 8, 0, 7, 34, 83, 65, 34, 49, 49, 114, 240, 52, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, + 8, 32, 24, 9, 0, 10, 18, 50, 34, 50, 240, 244, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 86, 0, + 9, 32, 40, 13, 0, 11, 83, 65, 99, 18, 131, 149, + 113, 51, 178, 179, 100, 18, 82, 52, 50, 83, 34, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 34, 113, 66, 82, + 82, 50, 117, 0, 13, 80, 38, 15, 0, 17, 36, 33, + 113, 51, 0, 6, 52, 36, 114, 17, 34, 115, 66, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 70, 22, 0, 15, 32, 36, 13, 0, 11, + 98, 178, 194, 193, 209, 240, 240, 85, 114, 50, 82, 82, + 50, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, + 50, 82, 82, 50, 117, 0, 13, 80, 36, 13, 0, 12, + 18, 163, 162, 177, 177, 240, 240, 117, 114, 50, 82, 82, + 50, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, + 50, 82, 82, 50, 117, 0, 13, 80, 39, 13, 0, 12, + 2, 164, 129, 34, 113, 66, 97, 66, 240, 240, 53, 114, + 50, 82, 82, 50, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 50, 82, 82, 50, 117, 0, 13, 80, 35, + 13, 0, 14, 116, 49, 65, 52, 0, 5, 101, 114, 50, + 82, 82, 50, 114, 34, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 50, 82, 82, 50, 117, 0, 13, 80, 35, 13, + 0, 14, 114, 50, 98, 50, 0, 5, 101, 114, 50, 82, + 82, 50, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 50, 82, 82, 50, 117, 0, 13, 80, 18, 15, 0, + 25, 3, 195, 195, 0, 6, 77, 240, 240, 115, 195, 195, + 0, 17, 96, 36, 13, 0, 23, 21, 33, 66, 51, 66, + 82, 50, 99, 34, 81, 18, 34, 50, 34, 34, 34, 50, + 34, 17, 82, 35, 98, 50, 82, 49, 18, 50, 65, 37, + 0, 13, 80, 39, 15, 0, 13, 82, 210, 225, 241, 225, + 240, 240, 132, 52, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 67, 99, 33, + 18, 116, 36, 0, 15, 32, 39, 15, 0, 14, 1, 210, + 209, 209, 225, 240, 240, 148, 52, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 67, 99, 33, 18, 116, 36, 0, 15, 32, 43, 15, 0, + 13, 98, 193, 18, 177, 18, 161, 50, 145, 66, 240, 240, + 84, 52, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 67, 99, 33, 18, 116, + 36, 0, 15, 32, 38, 15, 0, 17, 34, 50, 130, 50, + 0, 6, 36, 67, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 67, 99, 33, + 18, 116, 36, 0, 15, 32, 44, 15, 0, 14, 17, 210, + 210, 194, 209, 240, 240, 149, 52, 67, 81, 114, 81, 114, + 65, 131, 49, 146, 49, 147, 17, 178, 17, 178, 17, 194, + 210, 209, 225, 225, 209, 225, 161, 49, 146, 33, 162, 33, + 179, 176, 45, 14, 0, 10, 71, 146, 194, 194, 194, 194, + 194, 194, 194, 20, 115, 66, 83, 66, 82, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 82, 83, 66, + 82, 20, 114, 194, 194, 194, 194, 194, 194, 167, 112, 42, + 15, 0, 15, 66, 50, 130, 50, 0, 8, 22, 36, 67, + 81, 114, 81, 115, 49, 146, 49, 147, 33, 147, 17, 178, + 17, 180, 194, 210, 209, 225, 225, 209, 225, 161, 49, 146, + 33, 162, 33, 179, 176, +}; + +//***************************************************************************** +// +// The glyph offset table for the 26 point Theanodidot font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanodidot26[] = +{ + 0, 5, 30, 53, 96, 164, 227, 283, + 297, 329, 361, 391, 411, 426, 435, 445, + 477, 520, 547, 584, 621, 654, 691, 733, + 766, 807, 849, 864, 884, 905, 916, 937, + 967, 1039, 1084, 1126, 1163, 1205, 1247, 1285, + 1329, 1373, 1399, 1429, 1474, 1506, 1577, 1632, + 1674, 1709, 1764, 1807, 1843, 1893, 1936, 1980, + 2049, 2095, 2138, 2176, 2208, 2239, 2271, 2294, + 2302, 2313, 2341, 2382, 2409, 2450, 2476, 2506, + 2547, 2587, 2611, 2645, 2683, 2710, 2755, 2787, + 2816, 2855, 2894, 2917, 2942, 2967, 2999, 3025, + 3066, 3094, 3130, 3155, 3187, 3217, 3249, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3262, 3267, 3290, 3337, 3380, 3411, 3444, 3469, + 3519, 3530, 3594, 3614, 3635, 3648, 3657, 3724, + 3732, 3757, 3780, 3803, 3826, 3838, 3879, 3936, + 3945, 3957, 3976, 3997, 4018, 4072, 4128, 4185, + 4213, 4266, 4322, 4376, 4427, 4479, 4537, 4597, + 4645, 4693, 4740, 4790, 4838, 4867, 4896, 4927, + 4958, 5000, 5061, 5111, 5160, 5211, 5259, 5307, + 5332, 5387, 5438, 5489, 5541, 5590, 5644, 5685, + 5734, 5769, 5804, 5841, 5875, 5909, 5949, 5987, + 6021, 6053, 6086, 6121, 6153, 6178, 6203, 6230, + 6254, 6294, 6332, 6368, 6404, 6443, 6478, 6513, + 6531, 6567, 6606, 6645, 6688, 6726, 6770, 6815, +}; + +//***************************************************************************** +// +// The font definition for the 26 point Theanodidot font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanodidot26 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 26, + + // + // The height of the font. + // + 34, + + // + // The baseline of the font. + // + 26, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanodidot26, + + // + // A pointer to the actual font data + // + g_pui8Theanodidot26Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanodidot28.c b/third_party/fonts/ofl/fonts/fonttheanodidot28.c new file mode 100644 index 0000000..182c132 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanodidot28.c @@ -0,0 +1,798 @@ +//***************************************************************************** +// +// fonttheanodidot28.c - Font definition for the 28pt Theanodidot font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanodidot +// Size: 28 point +// Bold: no +// Italic: no +// Memory usage: 7144 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 28 point Theanodidot font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanodidot28Data[6944] = +{ + 5, 11, 0, 46, 96, 25, 6, 240, 240, 114, 52, 36, + 36, 36, 36, 50, 66, 66, 66, 66, 66, 66, 66, 240, + 114, 52, 50, 0, 6, 48, 25, 10, 0, 7, 67, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 49, 65, 65, 65, + 65, 65, 65, 65, 0, 24, 16, 43, 16, 0, 14, 82, + 65, 145, 81, 145, 81, 145, 66, 130, 65, 94, 97, 81, + 145, 81, 145, 66, 130, 65, 145, 81, 145, 81, 110, 81, + 66, 130, 65, 145, 81, 145, 81, 145, 66, 145, 66, 0, + 16, 112, 68, 16, 0, 10, 81, 33, 193, 33, 197, 147, + 33, 18, 82, 33, 33, 34, 50, 49, 33, 34, 50, 49, + 33, 19, 50, 49, 33, 18, 67, 33, 33, 133, 33, 151, + 184, 145, 22, 129, 33, 35, 113, 33, 50, 35, 33, 33, + 65, 35, 33, 33, 65, 33, 65, 33, 49, 50, 49, 33, + 49, 82, 17, 36, 133, 193, 33, 0, 14, 112, 63, 21, + 0, 16, 4, 130, 98, 34, 113, 98, 66, 82, 98, 66, + 81, 114, 66, 65, 130, 66, 65, 130, 66, 49, 162, 34, + 50, 180, 65, 240, 65, 240, 81, 52, 193, 50, 34, 162, + 49, 65, 161, 50, 66, 129, 66, 66, 129, 66, 66, 113, + 82, 66, 98, 97, 65, 113, 114, 34, 97, 148, 0, 21, + 64, 57, 22, 0, 17, 52, 240, 34, 49, 242, 65, 242, + 65, 242, 49, 240, 19, 17, 240, 51, 240, 52, 240, 33, + 35, 55, 81, 51, 97, 114, 67, 65, 114, 98, 65, 99, + 99, 49, 99, 115, 17, 115, 115, 17, 115, 131, 132, 115, + 148, 115, 148, 81, 19, 152, 54, 0, 22, 32, 15, 5, + 240, 243, 35, 35, 35, 35, 49, 65, 65, 65, 0, 12, + 32, 32, 7, 0, 5, 97, 97, 81, 97, 81, 97, 82, + 81, 97, 82, 82, 82, 82, 82, 82, 82, 82, 82, 97, + 97, 98, 97, 97, 113, 97, 113, 97, 144, 32, 7, 240, + 240, 193, 97, 113, 97, 113, 97, 98, 82, 97, 98, 82, + 82, 82, 82, 82, 82, 82, 82, 81, 82, 82, 81, 97, + 81, 97, 81, 97, 208, 30, 12, 0, 9, 67, 147, 82, + 35, 33, 35, 33, 34, 66, 17, 17, 131, 114, 19, 67, + 33, 34, 34, 49, 49, 99, 147, 147, 0, 24, 80, 19, + 16, 0, 26, 113, 241, 241, 241, 241, 241, 142, 145, 241, + 241, 241, 241, 241, 0, 17, 15, 6, 0, 17, 50, 52, + 51, 81, 81, 65, 81, 65, 65, 240, 32, 9, 11, 0, + 26, 25, 41, 0, 18, 16, 10, 5, 0, 14, 51, 35, + 35, 240, 240, 192, 32, 10, 0, 9, 66, 129, 145, 145, + 130, 129, 145, 145, 130, 129, 145, 145, 130, 130, 129, 145, + 130, 130, 129, 145, 130, 130, 129, 145, 130, 130, 240, 48, + 43, 15, 0, 13, 99, 162, 50, 114, 82, 98, 82, 82, + 114, 66, 114, 51, 115, 35, 115, 35, 115, 35, 115, 35, + 115, 35, 115, 35, 115, 50, 114, 66, 114, 67, 83, 82, + 82, 114, 50, 149, 0, 15, 96, 27, 13, 0, 12, 17, + 178, 163, 133, 98, 35, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 107, 0, 13, 32, 37, 14, + 0, 12, 86, 113, 67, 81, 99, 49, 131, 33, 131, 33, + 131, 33, 34, 67, 37, 67, 52, 51, 179, 178, 178, 178, + 178, 178, 178, 97, 66, 113, 59, 44, 0, 14, 32, 37, + 14, 0, 12, 101, 114, 52, 65, 100, 50, 99, 51, 83, + 65, 99, 163, 178, 162, 147, 19, 195, 195, 179, 35, 99, + 35, 99, 34, 115, 34, 99, 66, 67, 117, 0, 14, 96, + 33, 15, 0, 12, 34, 195, 195, 194, 195, 194, 210, 194, + 33, 146, 34, 145, 35, 129, 51, 113, 67, 97, 83, 93, + 147, 195, 195, 195, 195, 153, 0, 15, 32, 38, 14, 0, + 9, 113, 193, 114, 49, 118, 133, 145, 209, 209, 209, 21, + 114, 67, 81, 99, 65, 100, 179, 179, 179, 50, 99, 35, + 99, 35, 98, 50, 98, 81, 82, 118, 0, 14, 96, 42, + 15, 0, 13, 101, 146, 50, 114, 82, 82, 83, 67, 82, + 82, 195, 195, 37, 83, 17, 51, 68, 83, 51, 115, 35, + 115, 35, 115, 35, 115, 50, 115, 50, 114, 82, 83, 98, + 51, 133, 0, 15, 96, 32, 14, 0, 12, 33, 20, 81, + 39, 65, 40, 33, 49, 70, 49, 129, 209, 193, 209, 193, + 209, 193, 209, 194, 178, 194, 179, 179, 178, 194, 0, 15, + 16, 41, 15, 0, 13, 85, 145, 67, 97, 99, 65, 130, + 65, 130, 65, 130, 66, 113, 99, 65, 119, 166, 129, 37, + 82, 84, 65, 131, 34, 146, 34, 146, 34, 145, 66, 114, + 67, 82, 118, 0, 15, 96, 42, 15, 0, 13, 85, 131, + 50, 99, 82, 82, 99, 51, 114, 51, 115, 35, 115, 35, + 115, 35, 115, 51, 84, 52, 49, 19, 85, 35, 194, 210, + 82, 83, 67, 82, 82, 82, 113, 66, 149, 0, 15, 112, + 15, 5, 0, 8, 99, 35, 35, 240, 240, 35, 35, 35, + 240, 240, 192, 20, 6, 0, 10, 67, 52, 51, 240, 240, + 131, 52, 36, 81, 81, 65, 65, 81, 65, 240, 32, 21, + 15, 0, 24, 1, 195, 163, 163, 163, 163, 163, 194, 227, + 227, 227, 227, 227, 226, 0, 15, 32, 11, 16, 0, 34, + 14, 0, 6, 46, 0, 24, 32, 21, 15, 0, 22, 65, + 227, 227, 227, 227, 227, 227, 210, 179, 163, 163, 163, 163, + 178, 0, 16, 80, 31, 11, 0, 8, 68, 82, 50, 66, + 66, 50, 81, 162, 146, 146, 146, 146, 65, 50, 85, 97, + 161, 161, 161, 240, 240, 19, 131, 131, 0, 11, 112, 73, + 24, 0, 28, 23, 227, 99, 178, 162, 131, 209, 99, 226, + 82, 240, 17, 66, 100, 34, 65, 50, 82, 49, 18, 65, + 34, 82, 68, 65, 34, 66, 83, 81, 34, 50, 99, 81, + 34, 50, 99, 81, 34, 50, 98, 81, 50, 50, 83, 81, + 50, 50, 83, 65, 82, 50, 34, 18, 49, 98, 68, 52, + 130, 240, 130, 225, 130, 178, 178, 115, 231, 0, 10, 16, + 48, 22, 0, 17, 81, 240, 97, 240, 83, 240, 67, 240, + 68, 240, 33, 19, 240, 33, 19, 240, 17, 36, 241, 51, + 241, 51, 225, 83, 209, 83, 218, 193, 99, 177, 115, 177, + 116, 161, 131, 145, 147, 145, 163, 87, 58, 0, 22, 32, + 42, 18, 0, 15, 108, 147, 83, 115, 99, 99, 99, 99, + 99, 99, 99, 99, 98, 115, 82, 136, 163, 83, 115, 99, + 99, 114, 99, 115, 83, 115, 83, 115, 83, 115, 83, 99, + 99, 83, 76, 0, 18, 96, 38, 18, 0, 16, 74, 99, + 84, 82, 131, 66, 162, 51, 177, 50, 193, 35, 243, 243, + 243, 243, 243, 243, 240, 18, 193, 51, 177, 66, 162, 82, + 131, 99, 84, 135, 33, 0, 18, 32, 42, 21, 0, 18, + 61, 179, 99, 147, 130, 131, 146, 115, 147, 99, 147, 99, + 163, 83, 163, 83, 163, 83, 163, 83, 163, 83, 163, 83, + 163, 83, 162, 99, 147, 99, 146, 115, 130, 131, 99, 109, + 0, 22, 44, 19, 0, 16, 95, 1, 99, 115, 99, 130, + 99, 145, 99, 145, 99, 81, 163, 81, 163, 66, 163, 66, + 169, 163, 66, 163, 81, 163, 81, 163, 161, 83, 161, 83, + 161, 83, 146, 83, 116, 47, 2, 0, 19, 32, 40, 18, + 0, 15, 111, 1, 83, 115, 83, 130, 83, 130, 83, 145, + 83, 81, 49, 83, 81, 147, 66, 147, 66, 153, 147, 66, + 147, 66, 147, 81, 147, 81, 147, 243, 243, 243, 200, 0, + 19, 32, 44, 22, 0, 20, 7, 211, 84, 146, 146, 130, + 177, 115, 177, 115, 240, 51, 240, 67, 240, 67, 240, 67, + 240, 67, 240, 67, 122, 35, 179, 98, 179, 99, 163, 114, + 163, 130, 132, 147, 85, 197, 65, 0, 22, 80, 44, 22, + 0, 19, 41, 41, 83, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 142, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 89, 41, 0, 22, 32, 26, 11, 0, 9, 89, 83, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 89, 0, 11, 32, 30, 13, 0, 11, + 89, 115, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 97, 51, 83, 35, 83, 34, 98, 35, 117, 0, + 13, 112, 45, 22, 0, 19, 41, 39, 115, 113, 179, 97, + 195, 97, 195, 81, 211, 65, 227, 49, 243, 34, 243, 20, + 228, 19, 227, 51, 211, 52, 195, 68, 179, 84, 163, 99, + 163, 100, 147, 116, 131, 132, 73, 41, 0, 22, 32, 44, + 19, 0, 16, 89, 211, 240, 19, 240, 19, 240, 19, 240, + 19, 240, 19, 240, 19, 240, 19, 240, 19, 240, 19, 240, + 19, 240, 19, 161, 83, 145, 99, 146, 83, 146, 83, 131, + 83, 116, 47, 2, 0, 19, 32, 72, 25, 0, 21, 119, + 151, 84, 148, 133, 132, 129, 19, 113, 19, 129, 19, 113, + 19, 129, 20, 97, 19, 129, 35, 81, 35, 129, 35, 81, + 35, 129, 36, 65, 35, 129, 51, 49, 51, 129, 51, 49, + 51, 129, 52, 17, 67, 129, 67, 17, 67, 129, 67, 17, + 67, 129, 83, 83, 129, 83, 83, 129, 83, 83, 129, 97, + 99, 87, 49, 57, 0, 25, 32, 55, 21, 0, 18, 55, + 87, 85, 113, 129, 20, 97, 129, 20, 97, 129, 36, 81, + 129, 51, 81, 129, 52, 65, 129, 68, 49, 129, 68, 49, + 129, 84, 33, 129, 99, 33, 129, 100, 17, 129, 117, 129, + 132, 129, 132, 129, 147, 129, 147, 129, 162, 87, 129, 0, + 21, 80, 43, 21, 0, 19, 23, 195, 83, 146, 146, 114, + 163, 83, 179, 67, 179, 51, 211, 35, 211, 35, 211, 35, + 211, 35, 211, 35, 211, 35, 211, 50, 195, 67, 179, 82, + 178, 114, 146, 147, 83, 198, 0, 22, 16, 35, 18, 0, + 15, 108, 147, 83, 115, 99, 99, 114, 99, 115, 83, 115, + 83, 115, 83, 115, 83, 114, 99, 99, 106, 131, 243, 243, + 243, 243, 243, 243, 201, 0, 19, 16, 55, 22, 0, 20, + 7, 211, 83, 162, 146, 130, 163, 99, 179, 83, 179, 67, + 211, 51, 211, 51, 211, 51, 211, 51, 211, 51, 211, 51, + 211, 66, 195, 83, 179, 98, 178, 130, 146, 163, 83, 215, + 240, 34, 240, 99, 240, 84, 240, 53, 240, 53, 240, 71, + 0, 5, 96, 43, 21, 0, 18, 60, 195, 68, 163, 83, + 163, 99, 147, 99, 147, 99, 147, 98, 163, 82, 184, 211, + 82, 179, 83, 163, 99, 147, 99, 147, 99, 147, 99, 147, + 99, 147, 99, 147, 100, 89, 85, 0, 21, 32, 36, 16, + 0, 14, 72, 114, 67, 98, 98, 82, 129, 82, 129, 82, + 228, 213, 200, 167, 197, 212, 211, 33, 178, 33, 178, 34, + 162, 35, 130, 53, 82, 65, 69, 0, 16, 96, 50, 21, + 0, 18, 63, 4, 36, 67, 68, 35, 83, 83, 34, 99, + 98, 34, 99, 98, 33, 115, 113, 33, 115, 113, 33, 115, + 113, 163, 240, 51, 240, 51, 240, 51, 240, 51, 240, 51, + 240, 51, 240, 51, 240, 51, 240, 51, 249, 0, 21, 112, + 44, 22, 0, 19, 41, 71, 83, 161, 131, 161, 131, 161, + 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, + 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, 131, 146, + 147, 129, 179, 82, 230, 0, 23, 16, 47, 22, 0, 19, + 41, 71, 83, 161, 131, 145, 148, 129, 163, 129, 163, 113, + 195, 97, 195, 81, 212, 65, 227, 65, 227, 49, 240, 19, + 33, 240, 19, 33, 240, 21, 240, 52, 240, 52, 240, 66, + 240, 82, 240, 82, 0, 23, 48, 70, 30, 0, 26, 40, + 56, 54, 67, 147, 129, 115, 131, 129, 115, 131, 129, 116, + 116, 97, 147, 97, 19, 97, 147, 97, 20, 81, 148, 81, + 35, 65, 179, 65, 51, 65, 179, 65, 52, 49, 195, 49, + 67, 33, 211, 33, 83, 33, 211, 33, 99, 17, 227, 17, + 100, 244, 116, 244, 131, 240, 18, 146, 240, 34, 146, 240, + 34, 161, 0, 31, 16, 48, 22, 0, 19, 42, 38, 116, + 113, 179, 97, 211, 81, 212, 49, 243, 33, 240, 35, 17, + 240, 36, 240, 67, 240, 83, 240, 53, 240, 17, 35, 240, + 17, 51, 225, 68, 193, 99, 193, 115, 161, 132, 129, 164, + 72, 42, 0, 22, 32, 43, 20, 0, 17, 73, 54, 68, + 145, 115, 129, 147, 113, 148, 81, 179, 81, 180, 49, 211, + 49, 212, 17, 244, 240, 35, 240, 35, 240, 35, 240, 35, + 240, 35, 240, 35, 240, 35, 240, 35, 233, 0, 20, 96, + 38, 17, 0, 14, 126, 52, 100, 50, 131, 66, 115, 81, + 116, 81, 115, 97, 100, 211, 211, 212, 211, 212, 196, 113, + 83, 129, 68, 129, 67, 130, 51, 131, 36, 116, 47, 0, + 17, 32, 32, 8, 0, 6, 6, 34, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 102, 160, 31, 10, + 0, 8, 98, 130, 145, 145, 146, 130, 145, 145, 146, 130, + 145, 145, 146, 130, 145, 145, 145, 146, 145, 145, 145, 146, + 145, 145, 145, 146, 192, 32, 8, 0, 6, 6, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 38, + 160, 24, 16, 0, 12, 98, 212, 177, 34, 177, 50, 145, + 67, 113, 98, 113, 114, 81, 131, 49, 162, 242, 0, 36, + 32, 8, 16, 0, 60, 14, 0, 6, 32, 12, 6, 240, + 240, 194, 66, 82, 81, 97, 0, 16, 96, 28, 13, 0, + 23, 5, 114, 50, 83, 66, 67, 66, 178, 163, 100, 18, + 82, 66, 67, 66, 67, 66, 67, 51, 85, 35, 0, 13, + 32, 41, 16, 0, 12, 4, 226, 226, 226, 226, 226, 226, + 226, 226, 37, 114, 17, 51, 99, 83, 82, 115, 66, 115, + 66, 115, 66, 115, 66, 115, 66, 115, 67, 83, 82, 17, + 51, 68, 37, 0, 16, 80, 27, 12, 0, 21, 68, 98, + 50, 67, 51, 50, 67, 35, 66, 51, 147, 147, 97, 35, + 97, 51, 81, 67, 49, 101, 0, 12, 64, 41, 15, 0, + 12, 5, 210, 210, 210, 210, 210, 210, 210, 116, 34, 98, + 49, 18, 83, 67, 67, 98, 67, 98, 67, 98, 67, 98, + 67, 98, 67, 98, 83, 67, 98, 49, 18, 116, 36, 0, + 15, 32, 26, 13, 0, 23, 36, 114, 51, 67, 66, 66, + 83, 35, 83, 43, 35, 163, 163, 113, 51, 82, 67, 50, + 102, 0, 13, 64, 30, 12, 0, 9, 84, 114, 34, 82, + 50, 81, 66, 66, 162, 162, 162, 135, 114, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 134, 0, 12, 96, 41, 15, + 0, 26, 100, 50, 66, 67, 17, 50, 98, 17, 50, 98, + 82, 98, 82, 98, 98, 66, 97, 36, 113, 225, 225, 234, + 106, 98, 83, 66, 114, 50, 130, 50, 130, 50, 114, 82, + 82, 133, 112, 40, 16, 0, 12, 4, 226, 226, 226, 226, + 226, 226, 226, 226, 36, 130, 17, 50, 115, 82, 99, 82, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 70, 38, 0, 16, 32, 24, 7, 240, 240, 211, + 67, 67, 240, 240, 132, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 53, 0, 7, 32, 34, 9, 0, 7, 35, + 99, 99, 0, 6, 36, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 49, 50, 34, 50, 34, + 49, 50, 34, 68, 64, 38, 16, 0, 12, 4, 226, 226, + 226, 226, 226, 226, 226, 226, 53, 98, 65, 146, 49, 162, + 33, 178, 33, 182, 162, 35, 146, 51, 130, 51, 130, 67, + 114, 83, 70, 23, 0, 16, 32, 27, 8, 0, 6, 4, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 70, 0, 8, 32, 45, 22, + 0, 38, 68, 36, 67, 114, 17, 35, 18, 18, 115, 68, + 50, 98, 83, 66, 98, 83, 66, 98, 83, 66, 98, 83, + 66, 98, 83, 66, 98, 83, 66, 98, 83, 66, 98, 83, + 66, 70, 22, 37, 0, 22, 32, 32, 16, 0, 28, 4, + 36, 130, 17, 50, 115, 82, 99, 82, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 38, + 0, 16, 32, 29, 14, 0, 24, 117, 130, 66, 83, 67, + 51, 98, 51, 99, 35, 99, 35, 99, 35, 99, 35, 99, + 51, 67, 82, 66, 118, 0, 14, 80, 39, 16, 0, 28, + 4, 37, 114, 17, 51, 99, 83, 82, 115, 66, 115, 66, + 115, 66, 115, 66, 115, 66, 115, 67, 83, 82, 17, 51, + 98, 37, 114, 226, 226, 226, 226, 226, 226, 199, 144, 39, + 15, 0, 26, 84, 36, 66, 49, 18, 83, 67, 67, 98, + 67, 98, 67, 98, 67, 98, 67, 98, 67, 98, 83, 67, + 98, 49, 18, 116, 34, 210, 210, 210, 210, 210, 210, 210, + 167, 32, 24, 12, 0, 21, 4, 35, 82, 17, 34, 67, + 50, 67, 50, 66, 162, 162, 162, 162, 162, 162, 134, 0, + 12, 96, 25, 11, 0, 19, 55, 49, 67, 49, 82, 49, + 97, 51, 149, 133, 147, 33, 98, 33, 98, 34, 66, 55, + 0, 11, 64, 25, 10, 0, 14, 2, 130, 130, 103, 82, + 130, 130, 130, 130, 130, 130, 130, 49, 66, 49, 66, 49, + 84, 0, 10, 48, 32, 16, 0, 28, 4, 68, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 83, 98, 83, 114, 49, 18, 132, 36, 0, 16, 32, + 26, 14, 0, 24, 70, 36, 51, 81, 98, 81, 99, 65, + 114, 49, 130, 49, 131, 17, 162, 17, 164, 178, 194, 193, + 0, 15, 43, 21, 0, 36, 102, 22, 36, 51, 82, 81, + 98, 83, 65, 99, 49, 18, 65, 99, 49, 18, 49, 130, + 49, 19, 33, 131, 17, 50, 33, 146, 17, 52, 163, 83, + 163, 83, 178, 82, 193, 113, 0, 21, 112, 27, 16, 0, + 28, 7, 20, 99, 65, 147, 33, 178, 17, 196, 211, 211, + 212, 177, 35, 145, 66, 129, 83, 85, 24, 0, 16, 32, + 36, 16, 0, 28, 23, 36, 83, 81, 130, 81, 130, 81, + 146, 49, 162, 49, 163, 17, 194, 17, 196, 210, 226, 241, + 225, 241, 225, 241, 162, 49, 147, 33, 163, 33, 180, 176, + 25, 12, 0, 21, 9, 50, 67, 49, 67, 146, 147, 131, + 146, 147, 65, 66, 81, 51, 66, 35, 67, 42, 0, 12, + 32, 32, 8, 0, 6, 66, 81, 98, 98, 98, 98, 99, + 98, 98, 98, 98, 97, 98, 66, 130, 113, 114, 98, 98, + 98, 83, 82, 98, 98, 98, 113, 130, 160, 30, 3, 240, + 97, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 80, 32, 8, 0, 6, 2, 129, 114, 98, 98, + 98, 83, 82, 98, 98, 98, 113, 114, 130, 66, 82, 98, + 98, 98, 98, 99, 98, 98, 98, 98, 97, 82, 224, 14, + 15, 0, 32, 36, 81, 50, 35, 49, 49, 100, 0, 26, + 96, 5, 10, 0, 42, 64, 23, 6, 0, 10, 82, 52, + 51, 240, 98, 66, 66, 66, 66, 66, 66, 66, 52, 36, + 36, 36, 36, 50, 48, 46, 12, 0, 11, 81, 162, 161, + 177, 161, 177, 177, 116, 115, 34, 67, 36, 50, 33, 19, + 35, 33, 18, 51, 33, 99, 17, 115, 17, 65, 50, 17, + 65, 51, 81, 67, 49, 101, 97, 177, 177, 161, 177, 177, + 161, 240, 128, 45, 19, 0, 17, 117, 210, 65, 163, 97, + 147, 50, 17, 131, 68, 131, 82, 147, 240, 19, 240, 19, + 204, 179, 240, 34, 240, 34, 240, 34, 81, 178, 97, 68, + 33, 113, 49, 67, 98, 49, 74, 84, 69, 0, 19, 80, + 31, 13, 0, 22, 97, 37, 33, 50, 82, 65, 113, 49, + 145, 33, 145, 33, 145, 33, 145, 33, 145, 49, 113, 66, + 82, 49, 37, 33, 0, 14, 112, 33, 16, 0, 14, 6, + 68, 51, 113, 98, 97, 130, 81, 131, 49, 162, 49, 163, + 17, 195, 156, 146, 226, 226, 156, 146, 226, 226, 226, 226, + 198, 0, 16, 96, 25, 3, 240, 97, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 240, 81, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 80, 51, 12, 0, 10, 117, 98, 50, + 66, 82, 50, 67, 50, 67, 51, 50, 67, 163, 129, 20, + 81, 52, 65, 68, 49, 83, 50, 83, 35, 82, 51, 81, + 68, 49, 84, 17, 117, 147, 162, 163, 51, 66, 36, 66, + 35, 82, 34, 82, 66, 50, 101, 80, 10, 10, 0, 11, + 35, 35, 35, 35, 0, 29, 64, 23, 0, 18, 23, 226, + 114, 177, 177, 130, 209, 113, 87, 49, 81, 66, 82, 65, + 65, 50, 113, 65, 49, 66, 113, 81, 33, 51, 209, 33, + 51, 209, 33, 51, 209, 33, 51, 209, 33, 66, 113, 81, + 49, 51, 97, 65, 65, 67, 66, 65, 81, 85, 17, 49, + 98, 209, 145, 177, 178, 114, 231, 0, 24, 16, 20, 8, + 0, 7, 19, 65, 49, 50, 33, 113, 68, 50, 33, 50, + 33, 52, 17, 0, 19, 32, 19, 9, 0, 19, 34, 34, + 34, 34, 50, 34, 50, 34, 50, 34, 66, 34, 65, 0, + 12, 13, 17, 0, 34, 15, 242, 242, 242, 242, 242, 0, + 25, 96, 9, 11, 0, 26, 25, 41, 0, 18, 16, 67, + 23, 0, 18, 23, 226, 114, 177, 177, 130, 209, 113, 40, + 81, 81, 82, 51, 65, 65, 82, 66, 65, 49, 98, 66, + 81, 33, 98, 50, 97, 33, 101, 129, 33, 98, 50, 97, + 33, 98, 66, 81, 33, 98, 66, 81, 49, 82, 66, 65, + 65, 82, 66, 65, 81, 38, 51, 17, 98, 209, 145, 177, + 178, 114, 231, 0, 24, 16, 7, 10, 0, 12, 72, 0, + 29, 25, 12, 0, 9, 52, 98, 66, 65, 97, 49, 129, + 33, 129, 33, 129, 33, 129, 49, 97, 66, 66, 100, 0, + 27, 80, 23, 16, 0, 22, 113, 241, 241, 241, 241, 241, + 142, 145, 241, 241, 241, 241, 241, 240, 240, 174, 0, 14, + 32, 23, 9, 0, 8, 4, 66, 35, 33, 66, 33, 33, + 18, 51, 18, 113, 113, 113, 113, 49, 54, 0, 19, 48, + 23, 9, 0, 7, 119, 33, 65, 49, 34, 97, 131, 130, + 130, 34, 50, 33, 66, 33, 50, 68, 0, 18, 64, 12, + 6, 240, 240, 226, 66, 50, 65, 65, 0, 17, 16, 42, + 16, 0, 28, 18, 98, 83, 83, 83, 83, 83, 83, 83, + 83, 82, 98, 98, 98, 98, 98, 98, 83, 98, 82, 17, + 33, 33, 17, 51, 20, 33, 37, 51, 33, 241, 241, 242, + 226, 226, 227, 225, 224, 57, 15, 0, 13, 74, 52, 65, + 85, 65, 85, 65, 85, 65, 85, 65, 85, 65, 85, 65, + 100, 65, 115, 65, 145, 65, 145, 65, 145, 65, 145, 65, + 145, 65, 145, 65, 145, 65, 145, 65, 145, 65, 145, 65, + 145, 65, 145, 65, 145, 65, 145, 65, 145, 65, 145, 65, + 240, 80, 9, 5, 0, 10, 83, 35, 35, 0, 9, 12, + 7, 0, 24, 97, 113, 50, 33, 33, 34, 51, 160, 20, + 8, 0, 7, 34, 98, 83, 65, 18, 65, 18, 98, 98, + 98, 98, 98, 70, 0, 16, 32, 21, 9, 0, 8, 19, + 82, 18, 50, 50, 34, 50, 34, 50, 34, 50, 50, 18, + 83, 0, 21, 112, 20, 9, 0, 19, 18, 34, 66, 34, + 50, 34, 50, 34, 50, 34, 34, 34, 113, 0, 11, 96, + 54, 20, 0, 16, 82, 114, 145, 130, 130, 115, 129, 113, + 18, 113, 162, 98, 162, 97, 178, 82, 178, 81, 50, 114, + 65, 66, 86, 18, 66, 193, 81, 194, 81, 193, 81, 33, + 145, 97, 18, 145, 81, 34, 17, 97, 103, 82, 146, 113, + 162, 97, 178, 0, 20, 64, 56, 20, 0, 16, 97, 114, + 161, 114, 145, 115, 129, 113, 18, 129, 146, 113, 162, 98, + 162, 97, 178, 81, 194, 66, 36, 70, 33, 34, 34, 161, + 49, 66, 145, 49, 33, 18, 129, 83, 18, 114, 145, 129, + 146, 113, 161, 114, 145, 33, 81, 145, 49, 65, 150, 0, + 20, 32, 57, 21, 0, 17, 66, 86, 129, 97, 49, 130, + 97, 33, 145, 145, 145, 163, 98, 195, 65, 226, 50, 146, + 50, 49, 50, 81, 50, 49, 66, 100, 50, 66, 209, 81, + 209, 97, 209, 81, 33, 161, 81, 34, 146, 81, 34, 17, + 113, 103, 97, 162, 114, 162, 113, 178, 0, 21, 64, 28, + 10, 0, 18, 19, 115, 115, 240, 209, 145, 145, 145, 85, + 66, 49, 50, 130, 130, 130, 130, 130, 66, 50, 50, 65, + 50, 84, 48, 56, 22, 240, 210, 240, 84, 240, 83, 240, + 113, 240, 240, 178, 240, 82, 240, 82, 240, 68, 240, 52, + 240, 53, 240, 17, 35, 240, 17, 35, 240, 17, 36, 225, + 67, 225, 67, 225, 83, 217, 193, 100, 177, 115, 177, 115, + 161, 132, 145, 147, 129, 163, 87, 73, 0, 22, 32, 57, + 22, 240, 240, 66, 240, 52, 240, 35, 240, 49, 240, 240, + 226, 240, 82, 240, 82, 240, 68, 240, 52, 240, 52, 240, + 33, 35, 240, 17, 35, 240, 17, 36, 225, 67, 225, 67, + 225, 68, 202, 193, 99, 193, 115, 161, 131, 161, 132, 145, + 147, 129, 163, 87, 73, 0, 22, 32, 59, 22, 240, 240, + 18, 240, 50, 18, 240, 17, 66, 240, 98, 240, 240, 145, + 240, 97, 240, 83, 240, 67, 240, 68, 240, 33, 19, 240, + 33, 19, 240, 17, 36, 241, 51, 241, 51, 225, 83, 209, + 83, 218, 193, 99, 177, 115, 177, 116, 161, 131, 145, 147, + 145, 163, 87, 58, 0, 22, 32, 54, 22, 0, 6, 36, + 240, 18, 53, 0, 7, 81, 240, 97, 240, 83, 240, 67, + 240, 68, 240, 33, 19, 240, 33, 19, 240, 17, 36, 241, + 51, 241, 51, 225, 83, 209, 83, 218, 193, 99, 177, 115, + 177, 116, 161, 131, 145, 147, 145, 163, 87, 58, 0, 22, + 32, 53, 21, 0, 5, 115, 51, 195, 51, 0, 7, 33, + 240, 81, 240, 67, 240, 51, 240, 52, 240, 21, 240, 17, + 19, 240, 17, 35, 226, 35, 225, 51, 225, 52, 194, 67, + 202, 177, 84, 162, 99, 161, 116, 145, 131, 129, 147, 129, + 148, 71, 57, 0, 21, 32, 57, 21, 117, 242, 50, 225, + 81, 225, 81, 226, 50, 245, 240, 49, 240, 81, 240, 67, + 240, 51, 240, 52, 240, 17, 19, 240, 17, 19, 240, 17, + 35, 225, 51, 225, 51, 225, 67, 193, 83, 202, 177, 99, + 161, 115, 161, 116, 145, 131, 129, 147, 129, 148, 71, 57, + 0, 21, 32, 66, 31, 0, 28, 79, 2, 240, 21, 115, + 240, 17, 19, 130, 241, 35, 145, 241, 35, 145, 225, 51, + 81, 240, 33, 67, 81, 240, 33, 67, 66, 240, 17, 83, + 66, 255, 1, 241, 99, 66, 226, 99, 81, 210, 115, 81, + 209, 131, 161, 113, 147, 161, 113, 147, 161, 97, 163, 146, + 81, 179, 116, 39, 95, 2, 0, 31, 32, 49, 18, 0, + 16, 74, 99, 84, 82, 131, 66, 162, 51, 177, 50, 193, + 35, 243, 243, 243, 243, 243, 243, 240, 18, 193, 51, 177, + 66, 162, 82, 131, 99, 84, 135, 33, 240, 209, 240, 34, + 240, 49, 210, 34, 193, 50, 193, 35, 212, 112, 52, 19, + 240, 146, 240, 35, 240, 35, 240, 50, 0, 5, 127, 1, + 99, 115, 99, 130, 99, 145, 99, 145, 99, 81, 163, 81, + 163, 66, 163, 66, 169, 163, 66, 163, 81, 163, 81, 163, + 161, 83, 161, 83, 161, 83, 146, 83, 116, 47, 2, 0, + 19, 32, 50, 19, 240, 242, 240, 19, 227, 242, 0, 6, + 15, 1, 99, 115, 99, 130, 99, 145, 99, 145, 99, 81, + 163, 81, 163, 66, 163, 66, 169, 163, 66, 163, 81, 163, + 81, 163, 161, 83, 161, 83, 161, 83, 146, 83, 116, 47, + 2, 0, 19, 32, 53, 19, 240, 194, 240, 17, 18, 225, + 50, 193, 82, 240, 240, 239, 1, 99, 115, 99, 130, 99, + 145, 99, 145, 99, 81, 163, 81, 163, 66, 163, 66, 169, + 163, 66, 163, 81, 163, 81, 163, 161, 83, 161, 83, 161, + 83, 146, 83, 116, 47, 2, 0, 19, 32, 50, 19, 240, + 240, 195, 67, 147, 67, 0, 7, 111, 1, 99, 115, 99, + 130, 99, 145, 99, 145, 99, 81, 163, 81, 163, 66, 163, + 66, 169, 163, 66, 163, 81, 163, 81, 163, 161, 83, 161, + 83, 161, 83, 146, 83, 116, 47, 2, 0, 19, 32, 29, + 10, 162, 131, 131, 146, 240, 168, 67, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 88, 0, 10, 32, 30, 10, 240, 18, 115, 99, 98, 240, + 168, 83, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 72, 0, 10, 32, 31, 11, + 242, 114, 18, 81, 66, 162, 240, 153, 83, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 89, 0, 11, 32, 31, 11, 240, 115, 51, 35, 51, + 240, 240, 103, 99, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 103, 0, 11, 48, + 42, 21, 0, 18, 61, 179, 99, 147, 130, 131, 146, 115, + 147, 99, 147, 99, 163, 83, 163, 83, 163, 42, 99, 83, + 163, 83, 163, 83, 163, 83, 162, 99, 147, 99, 146, 115, + 130, 131, 99, 109, 0, 22, 61, 21, 0, 6, 4, 65, + 177, 53, 0, 8, 103, 87, 85, 113, 129, 20, 97, 129, + 20, 97, 129, 36, 81, 129, 51, 81, 129, 52, 65, 129, + 68, 49, 129, 68, 49, 129, 84, 33, 129, 99, 33, 129, + 100, 17, 129, 117, 129, 132, 129, 132, 129, 147, 129, 147, + 129, 162, 87, 129, 0, 21, 80, 51, 21, 240, 179, 240, + 67, 240, 67, 240, 82, 0, 7, 39, 195, 83, 146, 146, + 114, 163, 83, 179, 67, 179, 51, 211, 35, 211, 35, 211, + 35, 211, 35, 211, 35, 211, 35, 211, 50, 195, 67, 179, + 82, 178, 114, 146, 147, 83, 198, 0, 22, 16, 52, 21, + 240, 240, 35, 240, 35, 240, 35, 240, 34, 0, 7, 55, + 195, 83, 146, 146, 114, 163, 83, 179, 67, 179, 51, 211, + 35, 211, 35, 211, 35, 211, 35, 211, 35, 211, 35, 211, + 50, 195, 67, 179, 82, 178, 114, 146, 147, 83, 198, 0, + 22, 16, 53, 21, 146, 240, 52, 240, 17, 35, 225, 67, + 193, 98, 0, 6, 119, 195, 83, 146, 146, 114, 163, 83, + 179, 67, 179, 51, 211, 35, 211, 35, 211, 35, 211, 35, + 211, 35, 211, 35, 211, 50, 195, 67, 179, 82, 178, 114, + 146, 147, 83, 198, 0, 22, 16, 49, 21, 0, 5, 117, + 65, 161, 69, 0, 9, 71, 195, 83, 146, 146, 114, 163, + 83, 179, 67, 179, 51, 211, 35, 211, 35, 211, 35, 211, + 35, 211, 35, 211, 35, 211, 50, 195, 67, 179, 82, 178, + 114, 146, 147, 83, 198, 0, 22, 16, 49, 21, 0, 5, + 99, 67, 179, 67, 0, 9, 71, 195, 83, 146, 146, 114, + 163, 83, 179, 67, 179, 51, 211, 35, 211, 35, 211, 35, + 211, 35, 211, 35, 211, 35, 211, 50, 195, 67, 179, 82, + 178, 114, 146, 147, 83, 198, 0, 22, 16, 25, 12, 0, + 21, 1, 129, 34, 98, 50, 66, 82, 34, 116, 146, 145, + 18, 113, 50, 81, 82, 49, 114, 0, 15, 32, 55, 21, + 0, 19, 38, 81, 99, 83, 34, 82, 148, 82, 178, 83, + 164, 67, 149, 51, 145, 51, 35, 129, 67, 35, 113, 83, + 35, 97, 99, 35, 81, 115, 35, 65, 131, 35, 49, 147, + 50, 18, 147, 68, 163, 82, 178, 84, 146, 82, 35, 83, + 97, 86, 0, 22, 16, 52, 22, 240, 226, 240, 83, 240, + 98, 240, 113, 0, 6, 105, 71, 83, 161, 131, 161, 131, + 161, 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, 131, + 161, 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, 131, + 146, 147, 129, 179, 82, 230, 0, 23, 16, 53, 22, 240, + 240, 67, 240, 51, 240, 51, 240, 49, 0, 7, 9, 71, + 83, 161, 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, + 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, + 131, 161, 131, 161, 131, 146, 147, 129, 179, 82, 230, 0, + 23, 16, 54, 22, 162, 240, 68, 240, 33, 35, 241, 66, + 241, 82, 0, 6, 57, 71, 83, 161, 131, 161, 131, 161, + 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, + 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, 131, 146, + 147, 129, 179, 82, 230, 0, 23, 16, 50, 22, 0, 6, + 35, 51, 211, 51, 0, 9, 25, 56, 83, 161, 131, 161, + 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, + 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, 131, 161, + 131, 146, 147, 129, 179, 82, 230, 0, 23, 16, 52, 20, + 240, 240, 34, 240, 35, 240, 19, 240, 18, 0, 6, 25, + 54, 68, 145, 115, 129, 147, 113, 148, 81, 179, 81, 180, + 49, 211, 49, 212, 17, 244, 240, 35, 240, 35, 240, 35, + 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 233, 0, + 20, 96, 41, 18, 0, 15, 105, 195, 243, 243, 243, 243, + 204, 147, 83, 115, 99, 99, 114, 99, 115, 83, 115, 83, + 115, 83, 115, 83, 114, 99, 99, 106, 131, 243, 243, 243, + 243, 243, 243, 243, 201, 240, 192, 49, 15, 0, 11, 117, + 146, 50, 114, 82, 97, 98, 82, 98, 82, 98, 82, 82, + 98, 66, 114, 19, 146, 51, 114, 82, 98, 83, 82, 99, + 66, 99, 66, 99, 66, 99, 66, 19, 35, 66, 18, 50, + 82, 18, 35, 52, 36, 0, 15, 80, 35, 13, 0, 11, + 97, 194, 193, 194, 193, 240, 240, 85, 114, 50, 83, 66, + 67, 66, 178, 163, 100, 18, 82, 66, 67, 66, 67, 66, + 67, 51, 85, 35, 0, 13, 32, 35, 13, 0, 12, 2, + 178, 162, 177, 193, 240, 240, 101, 114, 50, 83, 66, 67, + 66, 178, 163, 100, 18, 82, 66, 67, 66, 67, 66, 67, + 51, 85, 35, 0, 13, 32, 39, 13, 0, 11, 114, 161, + 18, 145, 18, 129, 50, 97, 82, 240, 240, 37, 114, 50, + 83, 66, 67, 66, 178, 163, 100, 18, 82, 66, 67, 66, + 67, 66, 67, 51, 85, 35, 0, 13, 32, 34, 13, 0, + 14, 100, 49, 65, 52, 0, 5, 101, 114, 50, 83, 66, + 67, 66, 178, 163, 100, 18, 82, 66, 67, 66, 67, 66, + 67, 51, 85, 35, 0, 13, 32, 34, 13, 0, 14, 83, + 51, 67, 51, 240, 240, 245, 114, 50, 83, 66, 67, 66, + 178, 163, 100, 18, 82, 66, 67, 66, 67, 66, 67, 51, + 85, 35, 0, 13, 32, 40, 13, 0, 10, 19, 130, 50, + 97, 81, 97, 81, 98, 50, 117, 240, 240, 69, 114, 50, + 83, 66, 67, 66, 178, 163, 100, 18, 81, 82, 66, 82, + 66, 82, 67, 36, 84, 51, 0, 13, 32, 38, 19, 0, + 33, 69, 52, 98, 50, 17, 51, 51, 66, 82, 51, 66, + 83, 146, 83, 139, 68, 18, 163, 66, 163, 66, 113, 35, + 67, 97, 35, 49, 19, 65, 69, 69, 0, 19, 64, 34, + 12, 0, 21, 68, 98, 50, 67, 51, 50, 67, 35, 66, + 51, 147, 147, 97, 35, 97, 51, 81, 67, 49, 101, 240, + 97, 194, 114, 33, 113, 34, 131, 240, 224, 33, 13, 0, + 11, 113, 194, 178, 193, 209, 240, 240, 100, 114, 51, 67, + 66, 66, 83, 35, 83, 43, 35, 163, 163, 113, 51, 82, + 67, 50, 102, 0, 13, 64, 33, 13, 0, 12, 18, 178, + 162, 177, 193, 240, 240, 116, 114, 51, 67, 66, 66, 83, + 35, 83, 43, 35, 163, 163, 113, 51, 97, 67, 65, 102, + 0, 13, 64, 35, 13, 0, 12, 2, 164, 129, 34, 129, + 50, 179, 240, 240, 52, 114, 51, 67, 66, 66, 83, 35, + 83, 43, 35, 163, 163, 113, 51, 82, 67, 50, 102, 0, + 13, 64, 32, 13, 0, 14, 99, 51, 67, 51, 0, 5, + 100, 114, 51, 67, 66, 66, 83, 35, 83, 43, 35, 163, + 163, 113, 51, 97, 67, 65, 102, 0, 13, 64, 25, 8, + 0, 7, 17, 114, 98, 113, 129, 240, 84, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 70, 0, 8, 32, 25, + 8, 0, 7, 50, 98, 82, 97, 97, 240, 116, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 8, 32, + 28, 9, 0, 8, 34, 99, 81, 34, 65, 50, 33, 66, + 240, 100, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 86, 0, 9, 32, 25, 10, 0, 11, 35, 35, 35, 35, + 240, 240, 52, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 102, 0, 10, 48, 40, 14, 0, 12, 83, 49, 130, + 18, 162, 177, 18, 130, 35, 195, 179, 120, 82, 67, 67, + 68, 35, 99, 35, 99, 35, 99, 35, 99, 35, 99, 35, + 98, 67, 67, 82, 66, 132, 0, 14, 96, 38, 16, 0, + 18, 52, 49, 113, 52, 0, 6, 100, 36, 130, 17, 50, + 115, 82, 99, 82, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 70, 38, 0, 16, 32, 36, + 14, 0, 12, 97, 210, 209, 210, 209, 240, 240, 133, 130, + 66, 83, 67, 51, 98, 51, 99, 35, 99, 35, 99, 35, + 99, 35, 99, 51, 67, 82, 66, 118, 0, 14, 80, 36, + 14, 0, 13, 2, 194, 193, 194, 193, 240, 240, 149, 130, + 66, 83, 67, 51, 98, 51, 99, 35, 99, 35, 99, 35, + 99, 35, 99, 51, 67, 82, 66, 118, 0, 14, 80, 40, + 14, 0, 12, 114, 177, 18, 161, 19, 129, 50, 129, 66, + 240, 240, 85, 130, 66, 83, 67, 51, 98, 51, 99, 35, + 99, 35, 99, 35, 99, 35, 99, 51, 67, 82, 66, 118, + 0, 14, 80, 35, 14, 0, 16, 19, 49, 97, 51, 0, + 6, 37, 130, 66, 83, 67, 51, 98, 51, 99, 35, 99, + 35, 99, 35, 99, 35, 99, 51, 67, 82, 66, 118, 0, + 14, 80, 35, 14, 0, 16, 3, 35, 99, 35, 0, 6, + 21, 130, 66, 83, 67, 51, 98, 51, 99, 35, 99, 35, + 99, 35, 99, 35, 99, 51, 67, 82, 66, 118, 0, 14, + 80, 18, 16, 0, 26, 99, 211, 211, 0, 6, 126, 240, + 240, 163, 211, 211, 0, 18, 112, 37, 14, 0, 24, 117, + 49, 66, 65, 17, 67, 67, 51, 83, 51, 65, 19, 35, + 49, 35, 35, 33, 51, 35, 17, 67, 51, 83, 51, 67, + 65, 17, 66, 65, 53, 0, 14, 80, 40, 16, 0, 14, + 66, 226, 242, 241, 240, 17, 240, 240, 164, 68, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 83, 98, 83, 114, 49, 18, 132, 36, 0, 16, 32, + 39, 16, 0, 14, 114, 211, 210, 225, 225, 240, 240, 196, + 68, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 83, 98, 83, 114, 49, 18, 132, 36, + 0, 16, 32, 42, 16, 0, 14, 98, 212, 177, 34, 161, + 66, 145, 67, 240, 240, 116, 68, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 83, 98, + 83, 114, 49, 18, 132, 36, 0, 16, 32, 38, 16, 0, + 18, 35, 51, 115, 51, 0, 6, 84, 68, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 83, 98, 83, 114, 49, 18, 132, 36, 0, 16, 32, 42, + 15, 0, 14, 18, 210, 194, 209, 209, 240, 240, 150, 36, + 82, 97, 114, 65, 130, 65, 130, 49, 162, 33, 162, 33, + 164, 195, 195, 209, 225, 225, 209, 225, 209, 162, 33, 147, + 33, 147, 17, 179, 176, 45, 16, 0, 12, 7, 178, 226, + 226, 226, 226, 226, 226, 226, 37, 116, 51, 99, 83, 82, + 115, 66, 115, 66, 115, 66, 115, 66, 115, 66, 115, 67, + 83, 84, 51, 98, 37, 114, 226, 226, 226, 226, 226, 226, + 199, 144, 42, 16, 0, 18, 51, 51, 115, 51, 0, 6, + 86, 37, 81, 113, 114, 97, 129, 81, 146, 65, 161, 49, + 178, 33, 178, 33, 195, 211, 211, 225, 241, 225, 241, 241, + 162, 33, 163, 33, 163, 17, 196, 176, +}; + +//***************************************************************************** +// +// The glyph offset table for the 28 point Theanodidot font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanodidot28[] = +{ + 0, 5, 30, 55, 98, 166, 229, 286, + 301, 333, 365, 395, 414, 429, 438, 448, + 480, 523, 550, 587, 624, 657, 695, 737, + 769, 810, 852, 867, 887, 908, 919, 940, + 971, 1044, 1092, 1134, 1172, 1214, 1258, 1298, + 1342, 1386, 1412, 1442, 1487, 1531, 1603, 1658, + 1701, 1736, 1791, 1834, 1870, 1920, 1964, 2011, + 2081, 2129, 2172, 2210, 2242, 2273, 2305, 2329, + 2337, 2349, 2377, 2418, 2445, 2486, 2512, 2542, + 2583, 2623, 2647, 2681, 2719, 2746, 2791, 2823, + 2852, 2891, 2930, 2954, 2979, 3004, 3036, 3062, + 3105, 3132, 3168, 3193, 3225, 3255, 3287, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3301, 3306, 3329, 3375, 3420, 3451, 3484, 3509, + 3560, 3570, 3634, 3654, 3673, 3686, 3695, 3762, + 3769, 3794, 3817, 3840, 3863, 3875, 3917, 3974, + 3983, 3995, 4015, 4036, 4056, 4110, 4166, 4223, + 4251, 4307, 4364, 4423, 4477, 4530, 4587, 4653, + 4702, 4754, 4804, 4857, 4907, 4936, 4966, 4997, + 5028, 5070, 5131, 5182, 5234, 5287, 5336, 5385, + 5410, 5465, 5517, 5570, 5624, 5674, 5726, 5767, + 5816, 5851, 5886, 5925, 5959, 5993, 6033, 6071, + 6105, 6138, 6171, 6206, 6238, 6263, 6288, 6316, + 6341, 6381, 6419, 6455, 6491, 6531, 6566, 6601, + 6619, 6656, 6696, 6735, 6777, 6815, 6857, 6902, +}; + +//***************************************************************************** +// +// The font definition for the 28 point Theanodidot font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanodidot28 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 28, + + // + // The height of the font. + // + 34, + + // + // The baseline of the font. + // + 26, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanodidot28, + + // + // A pointer to the actual font data + // + g_pui8Theanodidot28Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanodidot30.c b/third_party/fonts/ofl/fonts/fonttheanodidot30.c new file mode 100644 index 0000000..42dc06b --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanodidot30.c @@ -0,0 +1,863 @@ +//***************************************************************************** +// +// fonttheanodidot30.c - Font definition for the 30pt Theanodidot font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanodidot +// Size: 30 point +// Bold: no +// Italic: no +// Memory usage: 7920 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 30 point Theanodidot font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanodidot30Data[7717] = +{ + 5, 13, 0, 60, 16, 27, 7, 240, 240, 210, 68, 52, + 52, 52, 52, 52, 66, 82, 82, 82, 82, 82, 82, 82, + 240, 240, 50, 68, 66, 0, 8, 48, 25, 11, 0, 8, + 35, 35, 51, 35, 51, 35, 51, 35, 51, 35, 65, 65, + 81, 65, 81, 65, 81, 65, 0, 30, 96, 47, 18, 0, + 16, 65, 81, 177, 81, 162, 66, 161, 82, 161, 81, 177, + 81, 111, 114, 66, 161, 82, 161, 81, 177, 81, 177, 81, + 162, 81, 162, 66, 127, 97, 81, 177, 81, 162, 66, 161, + 82, 161, 81, 177, 81, 0, 21, 48, 75, 18, 0, 14, + 17, 49, 214, 163, 49, 18, 98, 33, 49, 34, 81, 49, + 49, 34, 66, 49, 49, 19, 66, 49, 49, 19, 67, 33, + 49, 132, 17, 49, 150, 33, 169, 185, 161, 23, 145, 49, + 20, 129, 49, 50, 66, 33, 49, 65, 51, 33, 49, 65, + 50, 49, 49, 65, 49, 65, 49, 49, 81, 49, 49, 34, + 98, 17, 51, 166, 209, 49, 209, 49, 0, 16, 96, 69, + 23, 0, 17, 68, 146, 114, 34, 129, 129, 65, 114, 114, + 66, 97, 130, 66, 81, 146, 66, 81, 146, 66, 65, 177, + 65, 66, 178, 34, 65, 212, 66, 240, 97, 240, 97, 68, + 210, 50, 34, 193, 65, 65, 178, 50, 66, 161, 66, 66, + 145, 82, 66, 145, 82, 66, 129, 98, 66, 114, 113, 65, + 129, 130, 34, 113, 164, 0, 26, 64, 65, 24, 0, 18, + 116, 240, 66, 34, 240, 34, 65, 240, 34, 65, 240, 34, + 65, 240, 35, 33, 240, 51, 17, 240, 83, 240, 84, 240, + 65, 35, 56, 97, 51, 97, 146, 67, 81, 130, 83, 81, + 130, 99, 49, 131, 99, 49, 131, 115, 17, 147, 117, 147, + 131, 179, 116, 164, 116, 164, 66, 20, 182, 71, 0, 27, + 48, 15, 6, 240, 240, 99, 51, 51, 51, 51, 65, 81, + 81, 81, 0, 17, 34, 8, 0, 7, 65, 98, 97, 98, + 97, 113, 98, 98, 97, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 113, 114, 98, 113, 113, 114, 113, 113, 129, + 240, 64, 34, 8, 0, 7, 1, 113, 129, 113, 129, 113, + 114, 98, 113, 114, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 97, 98, 98, 97, 113, 97, 113, 97, 113, 240, 128, + 31, 14, 0, 11, 3, 179, 179, 114, 49, 50, 51, 33, + 35, 82, 17, 18, 147, 146, 20, 83, 33, 35, 50, 49, + 50, 115, 179, 179, 0, 32, 48, 34, 18, 0, 30, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 159, 162, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 240, 18, 0, 21, 48, 15, 7, 0, 21, 115, 68, 52, + 97, 97, 81, 97, 81, 81, 240, 192, 9, 12, 0, 31, + 73, 57, 0, 21, 48, 10, 7, 0, 22, 2, 68, 66, + 0, 8, 48, 35, 11, 0, 10, 65, 161, 146, 146, 145, + 161, 146, 146, 145, 161, 146, 146, 145, 161, 146, 146, 145, + 161, 146, 146, 145, 161, 146, 146, 146, 145, 161, 146, 240, + 240, 16, 47, 17, 0, 15, 68, 193, 65, 161, 97, 130, + 98, 99, 99, 82, 130, 82, 130, 67, 131, 51, 131, 51, + 131, 51, 131, 51, 131, 51, 131, 51, 131, 66, 130, 82, + 130, 82, 130, 98, 98, 114, 98, 130, 66, 180, 0, 20, + 16, 29, 14, 0, 13, 1, 194, 179, 164, 115, 19, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, 179, + 179, 179, 123, 0, 16, 16, 40, 16, 0, 14, 54, 146, + 67, 97, 115, 81, 130, 65, 147, 49, 147, 49, 147, 49, + 35, 67, 69, 67, 83, 67, 211, 195, 210, 210, 210, 210, + 210, 210, 113, 82, 114, 76, 61, 0, 18, 48, 40, 16, + 0, 14, 69, 146, 52, 113, 83, 98, 99, 83, 83, 83, + 83, 211, 195, 210, 194, 194, 34, 243, 226, 227, 67, 99, + 52, 99, 52, 99, 50, 115, 66, 115, 82, 83, 134, 0, + 18, 112, 36, 17, 0, 13, 114, 227, 227, 226, 227, 227, + 226, 226, 242, 33, 178, 34, 162, 35, 161, 51, 145, 67, + 129, 83, 98, 99, 110, 179, 227, 227, 227, 227, 185, 0, + 19, 64, 40, 16, 0, 11, 33, 225, 129, 97, 130, 65, + 150, 150, 161, 241, 241, 241, 37, 131, 67, 98, 99, 81, + 115, 227, 211, 211, 211, 51, 115, 51, 114, 66, 115, 66, + 114, 98, 67, 149, 0, 19, 44, 17, 0, 15, 69, 178, + 50, 146, 82, 114, 83, 99, 83, 99, 226, 227, 227, 38, + 99, 17, 67, 84, 99, 67, 131, 51, 131, 51, 131, 51, + 131, 66, 131, 66, 131, 67, 99, 98, 99, 114, 67, 165, + 0, 20, 34, 16, 0, 14, 51, 97, 71, 65, 72, 33, + 66, 55, 65, 145, 81, 145, 225, 241, 241, 225, 241, 225, + 226, 226, 210, 226, 211, 210, 211, 211, 211, 0, 19, 32, + 44, 17, 0, 15, 54, 146, 82, 114, 114, 82, 146, 66, + 146, 66, 146, 67, 129, 84, 98, 101, 50, 135, 199, 145, + 38, 113, 100, 82, 131, 50, 162, 50, 162, 50, 162, 50, + 161, 82, 130, 98, 82, 166, 0, 20, 46, 17, 0, 15, + 53, 163, 66, 130, 98, 99, 99, 67, 130, 67, 130, 67, + 131, 51, 131, 51, 131, 51, 131, 67, 100, 83, 65, 19, + 102, 35, 227, 226, 97, 115, 83, 98, 99, 98, 98, 98, + 130, 66, 165, 0, 20, 32, 15, 7, 0, 13, 34, 68, + 66, 0, 6, 98, 68, 66, 0, 8, 48, 20, 7, 0, + 13, 34, 68, 66, 0, 6, 83, 68, 52, 97, 97, 81, + 97, 81, 81, 240, 192, 28, 17, 0, 29, 18, 212, 195, + 195, 195, 195, 195, 210, 243, 240, 19, 240, 19, 240, 19, + 240, 19, 240, 19, 240, 18, 0, 19, 64, 11, 18, 0, + 38, 47, 0, 9, 63, 0, 31, 112, 26, 17, 0, 27, + 82, 244, 243, 240, 19, 240, 19, 240, 19, 240, 19, 240, + 18, 212, 195, 195, 195, 195, 195, 210, 0, 21, 33, 12, + 0, 9, 36, 98, 50, 82, 66, 66, 81, 178, 162, 162, + 162, 162, 161, 97, 50, 101, 113, 177, 177, 177, 177, 240, + 240, 66, 148, 146, 0, 14, 80, 84, 26, 0, 30, 70, + 240, 35, 98, 211, 162, 162, 210, 130, 241, 114, 240, 33, + 98, 240, 33, 82, 116, 34, 65, 66, 98, 49, 18, 65, + 50, 98, 68, 65, 50, 82, 83, 81, 50, 82, 83, 81, + 50, 66, 99, 81, 50, 66, 99, 81, 50, 66, 98, 81, + 66, 66, 83, 81, 66, 66, 68, 65, 98, 66, 34, 18, + 49, 114, 84, 52, 146, 240, 161, 240, 17, 145, 226, 162, + 178, 195, 99, 240, 39, 0, 11, 53, 24, 0, 19, 33, + 240, 114, 240, 115, 240, 99, 240, 84, 240, 85, 240, 69, + 240, 49, 35, 240, 49, 36, 240, 33, 36, 240, 18, 52, + 241, 68, 241, 83, 226, 84, 219, 209, 115, 194, 116, 177, + 132, 177, 147, 162, 148, 145, 179, 103, 74, 0, 27, 48, + 46, 20, 0, 17, 77, 163, 84, 131, 99, 131, 115, 115, + 115, 115, 115, 115, 115, 115, 99, 131, 98, 153, 179, 98, + 147, 115, 115, 130, 115, 131, 99, 131, 99, 131, 99, 131, + 99, 131, 99, 115, 115, 99, 93, 0, 23, 48, 48, 21, + 0, 19, 39, 49, 130, 101, 99, 132, 83, 163, 82, 194, + 67, 194, 66, 225, 51, 240, 51, 240, 51, 240, 51, 240, + 51, 240, 51, 240, 51, 240, 66, 225, 67, 194, 82, 194, + 83, 163, 99, 132, 130, 101, 167, 49, 0, 24, 46, 23, + 0, 20, 30, 195, 115, 163, 131, 147, 147, 131, 162, 131, + 163, 115, 178, 115, 179, 99, 179, 99, 179, 99, 179, 99, + 179, 99, 179, 99, 179, 99, 178, 115, 163, 115, 163, 115, + 147, 131, 131, 147, 115, 126, 0, 27, 47, 21, 0, 18, + 63, 2, 115, 116, 115, 131, 115, 146, 115, 145, 131, 161, + 115, 97, 179, 97, 179, 82, 179, 67, 186, 179, 67, 179, + 82, 179, 97, 179, 97, 179, 177, 99, 177, 99, 162, 99, + 147, 99, 132, 63, 3, 0, 24, 48, 20, 0, 17, 79, + 2, 99, 116, 99, 146, 99, 146, 99, 161, 99, 97, 49, + 99, 97, 49, 99, 82, 163, 82, 163, 67, 170, 163, 67, + 163, 82, 163, 97, 163, 97, 163, 240, 35, 240, 35, 240, + 35, 240, 35, 233, 0, 23, 112, 50, 24, 0, 21, 118, + 240, 18, 100, 163, 131, 147, 162, 146, 193, 131, 193, 130, + 240, 99, 240, 99, 240, 99, 240, 99, 240, 99, 240, 99, + 138, 51, 195, 114, 195, 115, 179, 130, 179, 131, 148, 147, + 132, 178, 83, 18, 214, 65, 0, 27, 96, 48, 24, 0, + 21, 9, 57, 99, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 159, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 105, 57, 0, 27, 48, 28, 12, 0, + 10, 73, 99, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 105, 0, 13, + 112, 32, 14, 0, 12, 73, 131, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 179, 179, 179, 179, 179, 99, 35, 99, + 35, 98, 50, 114, 35, 132, 0, 16, 112, 53, 24, 0, + 21, 9, 39, 147, 129, 195, 113, 211, 97, 227, 82, 227, + 81, 243, 65, 240, 19, 49, 240, 35, 34, 240, 35, 20, + 240, 20, 20, 243, 52, 227, 52, 227, 68, 211, 84, 195, + 100, 179, 100, 179, 116, 163, 132, 147, 147, 105, 42, 0, + 27, 48, 47, 21, 0, 18, 57, 243, 240, 51, 240, 51, + 240, 51, 240, 51, 240, 51, 240, 51, 240, 51, 240, 51, + 240, 51, 240, 51, 240, 51, 240, 51, 177, 99, 177, 99, + 162, 99, 162, 99, 147, 99, 147, 99, 117, 63, 3, 0, + 24, 79, 27, 0, 23, 87, 167, 101, 148, 149, 148, 145, + 19, 129, 19, 145, 20, 113, 19, 145, 20, 113, 19, 145, + 35, 97, 35, 145, 36, 81, 35, 145, 36, 81, 35, 145, + 51, 65, 51, 145, 51, 65, 51, 145, 52, 49, 51, 145, + 67, 33, 67, 145, 67, 33, 67, 145, 68, 17, 67, 145, + 84, 83, 145, 84, 83, 145, 84, 83, 145, 98, 99, 145, + 98, 99, 103, 50, 57, 0, 30, 96, 61, 23, 0, 20, + 24, 87, 101, 129, 145, 20, 113, 145, 20, 113, 145, 36, + 97, 145, 52, 81, 145, 52, 81, 145, 68, 65, 145, 68, + 65, 145, 84, 49, 145, 100, 33, 145, 100, 33, 145, 116, + 17, 145, 116, 17, 145, 133, 145, 148, 145, 148, 145, 163, + 145, 178, 145, 178, 103, 145, 0, 26, 80, 47, 23, 0, + 21, 6, 242, 98, 179, 130, 147, 162, 130, 194, 99, 195, + 82, 226, 67, 227, 51, 227, 51, 227, 51, 227, 51, 227, + 51, 227, 51, 227, 66, 226, 83, 195, 98, 194, 115, 163, + 131, 131, 178, 98, 246, 0, 27, 16, 45, 20, 0, 17, + 76, 179, 83, 147, 114, 131, 115, 115, 130, 115, 131, 99, + 131, 99, 131, 99, 131, 99, 131, 99, 115, 115, 99, 139, + 147, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, + 35, 233, 0, 23, 112, 62, 24, 0, 21, 118, 240, 18, + 98, 210, 130, 178, 162, 146, 194, 115, 195, 98, 226, 83, + 227, 67, 227, 67, 227, 67, 227, 67, 227, 67, 227, 67, + 227, 82, 226, 99, 195, 99, 194, 131, 163, 147, 131, 179, + 98, 247, 240, 66, 240, 131, 240, 117, 240, 69, 240, 85, + 240, 85, 240, 103, 0, 6, 48, 47, 23, 0, 20, 28, + 227, 67, 211, 83, 195, 99, 179, 99, 179, 99, 179, 99, + 179, 98, 195, 82, 216, 243, 83, 195, 99, 179, 115, 163, + 115, 163, 115, 163, 115, 163, 115, 163, 115, 163, 115, 163, + 131, 105, 101, 0, 26, 32, 40, 18, 0, 16, 56, 130, + 83, 114, 114, 98, 145, 98, 145, 98, 240, 19, 245, 231, + 201, 184, 214, 244, 243, 49, 194, 49, 194, 50, 178, 51, + 161, 68, 130, 69, 98, 81, 70, 0, 21, 16, 55, 23, + 0, 20, 31, 5, 52, 67, 69, 51, 83, 99, 50, 99, + 99, 50, 99, 114, 49, 115, 114, 49, 115, 129, 49, 115, + 129, 49, 115, 129, 179, 240, 83, 240, 83, 240, 83, 240, + 83, 240, 83, 240, 83, 240, 83, 240, 83, 240, 83, 240, + 83, 240, 41, 0, 27, 48, 24, 0, 21, 9, 87, 99, + 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, + 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, + 177, 147, 177, 147, 177, 147, 177, 162, 162, 163, 130, 195, + 98, 247, 0, 28, 32, 53, 24, 0, 21, 10, 71, 99, + 177, 148, 146, 163, 145, 180, 129, 180, 113, 211, 113, 212, + 97, 227, 81, 243, 81, 244, 65, 240, 19, 49, 240, 36, + 33, 240, 36, 33, 240, 51, 17, 240, 69, 240, 84, 240, + 83, 240, 99, 240, 114, 240, 113, 0, 28, 80, 79, 33, + 0, 28, 121, 57, 54, 84, 147, 145, 131, 147, 145, 132, + 132, 129, 147, 132, 113, 163, 132, 113, 164, 97, 20, 97, + 179, 97, 35, 81, 195, 97, 35, 81, 196, 65, 52, 65, + 211, 65, 67, 49, 227, 65, 67, 49, 228, 33, 84, 33, + 243, 33, 99, 33, 243, 33, 99, 17, 240, 21, 117, 240, + 36, 132, 240, 35, 147, 240, 51, 147, 240, 66, 162, 240, + 65, 177, 0, 38, 64, 54, 24, 0, 21, 11, 39, 116, + 129, 196, 113, 211, 97, 228, 65, 240, 20, 49, 240, 35, + 33, 240, 53, 240, 84, 240, 99, 240, 100, 240, 85, 240, + 49, 35, 240, 33, 52, 240, 17, 68, 225, 99, 209, 116, + 193, 132, 161, 163, 161, 164, 88, 58, 0, 27, 48, 51, + 23, 0, 20, 26, 55, 100, 145, 163, 145, 164, 113, 195, + 113, 196, 81, 227, 81, 228, 49, 240, 19, 49, 240, 20, + 17, 240, 53, 240, 67, 240, 83, 240, 83, 240, 83, 240, + 83, 240, 83, 240, 83, 240, 83, 240, 83, 240, 41, 0, + 26, 112, 43, 19, 0, 16, 95, 68, 116, 67, 116, 82, + 132, 81, 132, 97, 131, 113, 116, 113, 100, 244, 228, 243, + 244, 228, 244, 113, 100, 129, 99, 145, 84, 130, 83, 146, + 68, 131, 52, 117, 63, 1, 0, 21, 96, 35, 9, 0, + 6, 102, 50, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 118, 240, 96, 34, 11, 0, 9, + 82, 161, 161, 162, 146, 146, 161, 161, 162, 146, 161, 161, + 162, 146, 161, 161, 162, 146, 161, 161, 162, 146, 161, 161, + 162, 146, 161, 161, 240, 160, 35, 9, 0, 6, 102, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 54, 240, 96, 28, 18, 0, 14, 34, 240, 19, + 225, 19, 193, 51, 177, 66, 161, 83, 129, 115, 113, 130, + 97, 147, 65, 179, 49, 194, 0, 45, 48, 8, 18, 0, + 72, 15, 0, 9, 48, 13, 7, 0, 6, 18, 83, 82, + 97, 98, 97, 0, 21, 48, 30, 15, 0, 28, 54, 130, + 51, 99, 67, 83, 67, 83, 67, 195, 150, 99, 51, 83, + 67, 83, 67, 83, 67, 83, 52, 101, 36, 0, 17, 32, + 44, 17, 0, 12, 101, 227, 227, 227, 227, 227, 227, 227, + 227, 227, 36, 131, 17, 35, 116, 67, 99, 99, 83, 99, + 83, 99, 83, 99, 83, 99, 83, 99, 83, 99, 84, 67, + 99, 17, 35, 85, 36, 0, 19, 112, 28, 14, 0, 26, + 101, 115, 50, 83, 67, 66, 83, 51, 83, 51, 179, 179, + 179, 113, 66, 113, 67, 82, 83, 65, 133, 0, 16, 48, + 44, 18, 0, 14, 54, 243, 243, 243, 243, 243, 243, 243, + 243, 133, 35, 115, 49, 19, 99, 84, 98, 100, 83, 115, + 83, 115, 83, 115, 83, 115, 83, 115, 98, 100, 99, 84, + 115, 49, 19, 133, 37, 0, 20, 80, 27, 15, 0, 28, + 85, 131, 51, 83, 82, 82, 99, 51, 99, 60, 51, 195, + 195, 211, 113, 67, 97, 99, 66, 133, 0, 17, 80, 33, + 14, 0, 11, 36, 130, 50, 114, 50, 98, 51, 83, 65, + 99, 179, 179, 179, 152, 131, 179, 179, 179, 179, 179, 179, + 179, 179, 179, 179, 151, 0, 16, 80, 48, 17, 0, 32, + 52, 51, 83, 51, 18, 67, 82, 33, 67, 83, 99, 83, + 99, 83, 114, 82, 146, 51, 129, 36, 145, 241, 240, 17, + 240, 18, 68, 123, 115, 83, 113, 114, 97, 130, 82, 130, + 82, 129, 98, 114, 114, 82, 165, 144, 43, 18, 0, 13, + 69, 243, 243, 243, 243, 243, 243, 243, 243, 243, 36, 147, + 17, 35, 132, 67, 116, 67, 115, 83, 115, 83, 115, 83, + 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, 87, 23, + 0, 20, 80, 25, 8, 0, 6, 19, 83, 83, 0, 6, + 68, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 69, 0, 9, 48, 36, 11, 0, 8, 115, 131, 131, 0, + 9, 20, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 51, 35, 51, 35, 51, 34, + 82, 34, 99, 96, 50, 19, 0, 14, 37, 240, 19, 240, + 19, 240, 19, 240, 19, 240, 19, 240, 19, 240, 19, 240, + 19, 240, 19, 53, 131, 81, 163, 65, 179, 49, 195, 33, + 211, 34, 199, 195, 35, 179, 51, 163, 67, 147, 68, 131, + 83, 103, 24, 0, 21, 96, 29, 10, 0, 7, 69, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 87, 0, 11, 80, 49, + 26, 0, 48, 101, 36, 68, 147, 17, 35, 33, 35, 132, + 66, 17, 67, 115, 83, 83, 115, 83, 83, 115, 83, 83, + 115, 83, 83, 115, 83, 83, 115, 83, 83, 115, 83, 83, + 115, 83, 83, 115, 83, 83, 87, 23, 23, 0, 29, 80, + 34, 18, 0, 33, 101, 36, 147, 17, 35, 132, 67, 116, + 67, 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, 115, + 83, 115, 83, 115, 83, 87, 23, 0, 20, 80, 31, 16, + 0, 30, 69, 147, 51, 99, 83, 82, 114, 67, 115, 51, + 115, 51, 115, 51, 115, 51, 115, 66, 114, 83, 83, 99, + 51, 149, 0, 18, 112, 42, 17, 0, 31, 117, 36, 131, + 17, 35, 116, 67, 99, 99, 83, 99, 83, 99, 83, 99, + 83, 99, 83, 99, 83, 99, 84, 67, 99, 17, 35, 115, + 36, 131, 227, 227, 227, 227, 227, 227, 227, 200, 144, 42, + 18, 0, 34, 21, 52, 83, 49, 19, 99, 84, 98, 100, + 83, 115, 83, 115, 83, 115, 83, 115, 83, 115, 98, 100, + 99, 84, 115, 49, 19, 133, 35, 243, 243, 243, 243, 243, + 243, 243, 243, 200, 48, 24, 14, 0, 26, 37, 35, 101, + 19, 84, 35, 83, 51, 83, 179, 179, 179, 179, 179, 179, + 179, 151, 0, 16, 80, 27, 12, 0, 22, 87, 66, 51, + 66, 66, 66, 81, 67, 164, 149, 164, 49, 83, 49, 98, + 50, 82, 51, 50, 71, 0, 14, 16, 27, 13, 0, 18, + 65, 163, 163, 163, 121, 115, 163, 163, 163, 163, 163, 163, + 163, 163, 49, 99, 33, 115, 33, 132, 0, 15, 32, 34, + 18, 0, 33, 101, 53, 115, 83, 115, 83, 115, 83, 115, + 83, 115, 83, 115, 83, 115, 83, 115, 83, 115, 68, 115, + 68, 131, 33, 19, 148, 37, 0, 20, 80, 29, 16, 0, + 30, 6, 52, 67, 97, 114, 97, 115, 65, 146, 65, 147, + 49, 162, 33, 179, 17, 179, 17, 195, 211, 225, 241, 0, + 19, 16, 45, 23, 0, 43, 22, 38, 36, 67, 98, 97, + 98, 99, 65, 115, 83, 65, 130, 65, 18, 65, 131, 49, + 19, 33, 147, 33, 50, 33, 162, 33, 50, 33, 164, 68, + 180, 83, 194, 99, 194, 98, 225, 113, 0, 26, 112, 31, + 18, 0, 33, 103, 21, 115, 81, 163, 49, 195, 17, 211, + 17, 227, 240, 19, 243, 225, 19, 193, 51, 161, 67, 161, + 83, 101, 40, 0, 20, 80, 44, 18, 0, 33, 119, 52, + 99, 97, 146, 97, 147, 65, 163, 65, 178, 65, 179, 33, + 210, 33, 212, 243, 243, 242, 240, 33, 240, 33, 240, 17, + 240, 33, 240, 33, 240, 17, 179, 49, 179, 33, 195, 33, + 212, 208, 29, 15, 0, 28, 42, 82, 83, 81, 83, 81, + 83, 97, 83, 179, 179, 195, 65, 99, 81, 83, 97, 83, + 82, 67, 83, 75, 0, 17, 32, 35, 9, 0, 7, 34, + 97, 114, 114, 114, 114, 115, 114, 114, 114, 114, 114, 113, + 114, 82, 146, 129, 130, 114, 114, 114, 99, 99, 98, 114, + 114, 114, 129, 146, 240, 96, 33, 5, 240, 240, 82, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 208, 35, 9, 0, 6, 98, 145, 130, 114, 114, + 114, 99, 99, 98, 114, 114, 114, 129, 130, 146, 82, 113, + 114, 114, 114, 114, 114, 115, 114, 114, 114, 114, 113, 98, + 240, 160, 14, 16, 0, 38, 36, 97, 65, 51, 49, 65, + 100, 0, 30, 80, 5, 12, 0, 55, 64, 25, 7, 0, + 13, 34, 68, 66, 240, 240, 50, 82, 82, 82, 82, 82, + 82, 82, 68, 52, 52, 52, 52, 52, 66, 64, 51, 14, + 0, 13, 65, 194, 193, 209, 194, 193, 209, 193, 164, 131, + 35, 83, 33, 19, 66, 49, 19, 51, 49, 19, 51, 33, + 131, 33, 131, 33, 131, 17, 81, 66, 17, 81, 68, 66, + 83, 50, 118, 129, 193, 209, 193, 209, 209, 193, 209, 240, + 192, 50, 21, 0, 19, 101, 227, 65, 194, 113, 163, 66, + 17, 163, 68, 147, 83, 163, 240, 51, 240, 51, 240, 51, + 236, 211, 240, 51, 240, 51, 240, 51, 97, 178, 129, 83, + 34, 129, 65, 51, 145, 65, 68, 98, 65, 75, 100, 70, + 0, 24, 48, 30, 15, 0, 28, 18, 22, 18, 67, 67, + 81, 129, 65, 161, 49, 161, 49, 161, 49, 161, 49, 161, + 65, 129, 83, 67, 66, 22, 33, 0, 21, 43, 20, 0, + 17, 71, 85, 83, 129, 146, 129, 147, 97, 178, 97, 179, + 65, 210, 65, 211, 33, 243, 17, 244, 205, 195, 240, 35, + 205, 195, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, + 247, 0, 23, 64, 29, 5, 240, 240, 82, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 240, 240, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 208, 55, 14, 0, + 12, 101, 114, 66, 97, 98, 66, 98, 66, 68, 66, 68, + 67, 195, 180, 145, 20, 113, 52, 97, 83, 81, 98, 82, + 98, 82, 82, 84, 65, 100, 49, 116, 33, 133, 179, 195, + 194, 83, 81, 68, 81, 68, 81, 66, 113, 66, 97, 98, + 65, 133, 240, 96, 13, 12, 0, 13, 67, 51, 51, 51, + 51, 51, 0, 37, 112, 69, 26, 0, 20, 71, 240, 34, + 114, 210, 178, 162, 210, 130, 85, 82, 113, 82, 66, 65, + 97, 67, 97, 81, 81, 67, 193, 65, 67, 225, 49, 67, + 225, 49, 67, 225, 49, 67, 225, 49, 67, 225, 49, 67, + 225, 65, 66, 209, 81, 67, 97, 81, 97, 82, 66, 65, + 113, 101, 82, 130, 210, 162, 178, 210, 114, 240, 39, 0, + 30, 80, 20, 11, 0, 9, 100, 97, 50, 82, 34, 146, + 101, 82, 34, 82, 34, 84, 19, 0, 30, 80, 21, 10, + 0, 22, 97, 49, 65, 49, 66, 34, 66, 34, 66, 34, + 66, 34, 82, 34, 0, 15, 48, 20, 18, 0, 38, 47, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 0, 29, 80, 9, 12, 0, 31, 73, 57, 0, 21, 48, + 76, 26, 0, 20, 71, 240, 34, 114, 210, 178, 162, 210, + 130, 25, 82, 113, 67, 35, 81, 97, 83, 51, 81, 81, + 83, 51, 81, 65, 99, 51, 97, 49, 99, 35, 113, 49, + 101, 161, 49, 99, 35, 113, 49, 99, 51, 97, 49, 99, + 51, 97, 65, 83, 51, 81, 81, 83, 51, 81, 97, 39, + 37, 17, 113, 240, 18, 130, 210, 162, 178, 210, 114, 240, + 39, 0, 30, 80, 8, 11, 0, 13, 104, 0, 36, 16, + 27, 14, 0, 10, 117, 129, 81, 97, 113, 65, 145, 49, + 145, 49, 145, 49, 145, 49, 145, 65, 113, 97, 81, 133, + 0, 35, 96, 37, 18, 0, 25, 82, 240, 18, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 159, 162, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 240, + 255, 0, 18, 48, 26, 10, 0, 9, 3, 97, 34, 65, + 66, 49, 33, 18, 49, 33, 18, 67, 17, 130, 129, 129, + 129, 49, 70, 0, 24, 16, 24, 11, 0, 9, 88, 49, + 81, 65, 65, 145, 145, 148, 162, 162, 50, 66, 49, 82, + 49, 66, 85, 0, 25, 48, 13, 7, 0, 6, 50, 67, + 66, 81, 82, 81, 0, 21, 96, 53, 18, 0, 33, 114, + 114, 99, 99, 99, 99, 99, 99, 99, 99, 98, 114, 114, + 114, 114, 99, 114, 99, 113, 115, 114, 83, 17, 33, 49, + 23, 36, 49, 52, 67, 49, 240, 33, 240, 33, 240, 33, + 240, 34, 240, 18, 240, 18, 240, 19, 240, 17, 240, 16, + 63, 17, 0, 15, 58, 84, 65, 117, 65, 117, 65, 117, + 65, 102, 65, 117, 65, 117, 65, 117, 65, 132, 65, 147, + 65, 177, 65, 177, 65, 177, 65, 177, 65, 177, 65, 177, + 65, 177, 65, 177, 65, 177, 65, 177, 65, 177, 65, 177, + 65, 177, 65, 177, 65, 177, 65, 177, 65, 177, 65, 177, + 65, 240, 128, 10, 7, 0, 15, 114, 68, 66, 0, 14, + 64, 14, 8, 0, 29, 33, 114, 129, 50, 33, 49, 34, + 67, 240, 80, 20, 9, 0, 8, 18, 114, 114, 99, 81, + 18, 114, 114, 114, 114, 114, 114, 86, 0, 20, 80, 23, + 11, 0, 9, 116, 98, 34, 66, 66, 50, 66, 50, 66, + 50, 66, 50, 66, 66, 34, 100, 0, 29, 64, 21, 10, + 0, 22, 65, 49, 97, 49, 82, 34, 66, 34, 66, 34, + 65, 50, 50, 34, 0, 15, 64, 59, 22, 0, 18, 34, + 130, 161, 146, 146, 131, 145, 129, 18, 129, 145, 18, 114, + 178, 113, 194, 98, 194, 97, 210, 82, 50, 130, 81, 66, + 102, 33, 82, 210, 81, 225, 97, 210, 81, 225, 97, 33, + 161, 97, 34, 146, 97, 34, 17, 113, 119, 98, 162, 129, + 178, 113, 194, 0, 25, 48, 63, 22, 0, 18, 34, 130, + 161, 146, 146, 131, 130, 129, 18, 129, 145, 18, 114, 178, + 113, 194, 98, 194, 97, 210, 82, 210, 66, 52, 86, 33, + 49, 50, 178, 33, 82, 161, 49, 33, 34, 146, 49, 33, + 34, 145, 83, 34, 129, 162, 130, 161, 145, 161, 146, 145, + 49, 97, 145, 65, 81, 151, 0, 25, 16, 65, 23, 0, + 19, 18, 103, 129, 113, 65, 130, 113, 49, 145, 177, 146, + 164, 98, 226, 81, 240, 18, 50, 240, 18, 49, 178, 66, + 34, 50, 97, 82, 33, 66, 97, 66, 33, 82, 117, 34, + 81, 241, 97, 226, 81, 241, 97, 33, 178, 81, 34, 177, + 97, 34, 17, 129, 119, 114, 162, 145, 178, 130, 178, 0, + 26, 64, 31, 12, 0, 23, 34, 148, 146, 240, 240, 65, + 177, 177, 177, 177, 117, 98, 49, 97, 162, 162, 162, 162, + 162, 177, 67, 66, 51, 81, 51, 100, 80, 62, 24, 240, + 243, 240, 115, 240, 130, 240, 145, 0, 5, 97, 240, 114, + 240, 115, 240, 99, 240, 84, 240, 85, 240, 65, 19, 240, + 65, 20, 240, 33, 36, 240, 33, 51, 240, 33, 52, 241, + 68, 241, 83, 241, 84, 219, 209, 115, 209, 116, 177, 147, + 177, 148, 161, 148, 145, 179, 103, 74, 0, 27, 48, 63, + 24, 240, 240, 99, 240, 83, 240, 82, 240, 97, 0, 6, + 1, 240, 130, 240, 99, 240, 99, 240, 100, 240, 69, 240, + 65, 19, 240, 65, 20, 240, 34, 35, 240, 33, 52, 240, + 17, 52, 242, 67, 241, 84, 225, 84, 234, 209, 116, 193, + 116, 193, 131, 177, 148, 161, 163, 161, 164, 88, 73, 0, + 27, 48, 67, 24, 161, 240, 115, 240, 81, 19, 240, 49, + 51, 240, 17, 83, 240, 115, 240, 49, 240, 114, 240, 115, + 240, 99, 240, 84, 240, 85, 240, 69, 240, 49, 35, 240, + 49, 36, 240, 33, 36, 240, 18, 51, 240, 17, 68, 241, + 83, 226, 84, 219, 209, 115, 194, 116, 177, 132, 177, 147, + 162, 148, 145, 179, 103, 74, 0, 27, 48, 60, 24, 0, + 6, 101, 240, 49, 69, 0, 8, 49, 240, 114, 240, 115, + 240, 99, 240, 84, 240, 85, 240, 69, 240, 49, 35, 240, + 49, 36, 240, 33, 36, 240, 18, 51, 240, 17, 68, 241, + 83, 226, 84, 219, 209, 115, 194, 116, 177, 132, 177, 147, + 162, 148, 145, 179, 103, 74, 0, 27, 48, 60, 24, 0, + 6, 83, 67, 227, 67, 0, 8, 34, 240, 114, 240, 114, + 240, 100, 240, 84, 240, 84, 240, 70, 240, 49, 35, 240, + 49, 36, 240, 33, 36, 240, 17, 67, 240, 17, 68, 241, + 68, 226, 68, 235, 209, 100, 194, 116, 177, 132, 177, 132, + 161, 164, 145, 164, 103, 74, 0, 27, 48, 68, 24, 132, + 240, 50, 65, 240, 33, 97, 240, 17, 97, 240, 18, 66, + 240, 52, 240, 98, 240, 114, 240, 114, 240, 100, 240, 84, + 240, 84, 240, 70, 240, 49, 35, 240, 49, 36, 240, 18, + 36, 240, 17, 67, 240, 17, 68, 226, 68, 225, 99, 235, + 194, 100, 193, 132, 177, 132, 177, 147, 161, 164, 145, 179, + 103, 74, 0, 27, 48, 78, 34, 0, 31, 47, 3, 240, + 53, 116, 240, 49, 19, 131, 240, 33, 35, 146, 240, 33, + 35, 145, 240, 33, 51, 161, 242, 51, 97, 240, 65, 67, + 97, 240, 49, 83, 82, 240, 34, 83, 67, 240, 47, 2, + 240, 18, 99, 67, 240, 17, 115, 82, 242, 115, 97, 226, + 131, 97, 225, 147, 177, 130, 147, 177, 129, 163, 162, 113, + 179, 147, 98, 179, 132, 56, 95, 3, 0, 38, 80, 64, + 21, 0, 19, 39, 49, 130, 101, 99, 132, 83, 163, 82, + 194, 67, 194, 66, 225, 51, 240, 51, 240, 51, 240, 51, + 240, 51, 240, 51, 240, 51, 240, 66, 225, 67, 194, 82, + 194, 83, 163, 99, 132, 130, 101, 167, 49, 240, 240, 49, + 240, 81, 240, 98, 240, 18, 34, 227, 34, 226, 50, 226, + 35, 245, 144, 55, 21, 240, 179, 240, 52, 240, 67, 240, + 82, 0, 6, 79, 2, 115, 116, 115, 131, 115, 146, 115, + 145, 131, 161, 115, 97, 179, 97, 179, 82, 179, 67, 186, + 179, 67, 179, 82, 179, 97, 179, 97, 179, 177, 99, 177, + 99, 162, 99, 147, 99, 132, 63, 3, 0, 24, 56, 21, + 240, 240, 35, 240, 20, 240, 19, 240, 34, 0, 6, 111, + 2, 115, 116, 115, 131, 115, 146, 115, 146, 115, 161, 115, + 97, 179, 97, 179, 82, 179, 67, 186, 179, 67, 179, 82, + 179, 97, 179, 97, 179, 177, 99, 177, 99, 162, 99, 147, + 99, 132, 63, 3, 0, 24, 58, 21, 145, 240, 67, 240, + 33, 19, 241, 51, 209, 83, 177, 115, 240, 207, 2, 115, + 116, 115, 131, 115, 146, 115, 145, 131, 161, 115, 97, 179, + 97, 179, 82, 179, 67, 186, 179, 67, 179, 82, 179, 97, + 179, 97, 179, 177, 99, 177, 99, 162, 99, 147, 99, 132, + 63, 3, 0, 24, 53, 21, 0, 5, 99, 67, 179, 67, + 0, 8, 111, 2, 115, 116, 115, 131, 115, 146, 115, 146, + 115, 161, 115, 97, 179, 97, 179, 82, 179, 67, 186, 179, + 67, 179, 82, 179, 97, 179, 97, 179, 177, 99, 177, 99, + 162, 99, 147, 99, 132, 63, 3, 0, 24, 31, 12, 195, + 163, 178, 193, 240, 249, 99, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 105, 0, 13, 112, 33, 12, 240, 51, 131, 131, 129, 240, + 240, 41, 99, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 147, 105, 0, 13, + 112, 37, 13, 66, 164, 129, 34, 113, 66, 97, 82, 65, + 99, 240, 25, 115, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 121, 0, + 15, 16, 33, 13, 240, 179, 67, 51, 67, 240, 240, 216, + 115, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 136, 0, 15, 16, 46, + 23, 0, 20, 30, 195, 115, 163, 131, 147, 147, 131, 162, + 131, 163, 115, 178, 115, 179, 99, 179, 99, 179, 58, 115, + 99, 179, 99, 179, 99, 179, 99, 178, 115, 163, 115, 163, + 115, 147, 131, 131, 147, 115, 126, 0, 27, 67, 23, 0, + 6, 69, 65, 193, 69, 0, 9, 88, 87, 101, 129, 145, + 20, 113, 145, 20, 113, 145, 36, 97, 145, 52, 81, 145, + 52, 81, 145, 68, 65, 145, 68, 65, 145, 84, 49, 145, + 100, 33, 145, 100, 33, 145, 116, 17, 145, 116, 17, 145, + 133, 145, 148, 145, 148, 145, 163, 145, 178, 145, 178, 103, + 145, 0, 26, 80, 55, 23, 240, 211, 240, 99, 240, 115, + 240, 114, 0, 8, 6, 242, 98, 179, 130, 147, 162, 130, + 194, 99, 195, 82, 226, 67, 227, 51, 227, 51, 227, 51, + 227, 51, 227, 51, 227, 51, 227, 66, 226, 83, 195, 98, + 194, 115, 163, 131, 131, 178, 98, 246, 0, 27, 16, 56, + 23, 240, 240, 83, 240, 52, 240, 51, 240, 66, 0, 8, + 38, 242, 98, 179, 130, 147, 162, 130, 194, 99, 195, 82, + 226, 67, 227, 51, 227, 51, 227, 51, 227, 51, 227, 51, + 227, 51, 227, 66, 226, 83, 195, 98, 194, 115, 163, 131, + 131, 178, 98, 246, 0, 27, 16, 58, 23, 161, 240, 99, + 240, 50, 19, 240, 17, 82, 240, 114, 0, 7, 86, 242, + 98, 179, 130, 147, 162, 130, 194, 99, 195, 82, 226, 67, + 227, 51, 227, 51, 227, 51, 227, 51, 227, 51, 227, 51, + 227, 66, 226, 83, 195, 98, 194, 115, 163, 131, 131, 178, + 98, 246, 0, 27, 16, 53, 23, 0, 6, 69, 65, 178, + 54, 0, 10, 70, 242, 98, 179, 130, 147, 162, 130, 194, + 99, 195, 82, 226, 67, 227, 51, 227, 51, 227, 51, 227, + 51, 227, 51, 227, 51, 227, 66, 226, 83, 195, 98, 194, + 115, 163, 131, 131, 178, 98, 246, 0, 27, 16, 53, 23, + 0, 6, 51, 67, 211, 67, 0, 10, 70, 242, 98, 179, + 130, 147, 162, 130, 194, 99, 195, 82, 226, 67, 227, 51, + 227, 51, 227, 51, 227, 51, 227, 51, 227, 51, 227, 66, + 226, 83, 195, 98, 194, 115, 163, 131, 131, 178, 98, 246, + 0, 27, 16, 27, 14, 0, 26, 33, 145, 50, 114, 66, + 82, 98, 50, 130, 18, 163, 164, 147, 18, 115, 50, 82, + 98, 65, 130, 0, 19, 80, 60, 23, 0, 21, 6, 97, + 130, 98, 50, 99, 133, 99, 163, 114, 179, 99, 165, 82, + 162, 34, 67, 146, 51, 51, 130, 67, 51, 114, 83, 51, + 98, 99, 51, 82, 115, 51, 66, 131, 51, 50, 147, 66, + 34, 162, 85, 163, 99, 178, 115, 163, 101, 131, 98, 50, + 98, 129, 102, 0, 27, 16, 57, 24, 240, 240, 19, 240, + 100, 240, 115, 240, 130, 0, 7, 57, 87, 99, 177, 147, + 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, + 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, + 177, 147, 177, 147, 177, 162, 162, 163, 130, 195, 98, 247, + 0, 28, 32, 57, 24, 240, 240, 115, 240, 68, 240, 67, + 240, 82, 0, 7, 89, 87, 99, 177, 147, 177, 147, 177, + 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, + 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, + 147, 177, 162, 162, 163, 130, 195, 98, 247, 0, 28, 32, + 60, 24, 177, 240, 115, 240, 81, 34, 240, 49, 66, 240, + 17, 98, 0, 7, 9, 87, 99, 177, 147, 177, 147, 177, + 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, + 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, + 147, 177, 162, 162, 163, 130, 195, 98, 247, 0, 28, 32, + 54, 24, 0, 6, 99, 67, 227, 67, 0, 10, 9, 72, + 99, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, + 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, 147, 177, + 147, 177, 147, 177, 147, 177, 147, 177, 162, 162, 163, 130, + 195, 98, 247, 0, 28, 32, 60, 23, 240, 240, 99, 240, + 67, 240, 66, 240, 81, 0, 7, 42, 55, 100, 145, 163, + 145, 164, 113, 195, 113, 196, 81, 227, 81, 228, 49, 240, + 19, 49, 240, 20, 17, 240, 53, 240, 67, 240, 83, 240, + 83, 240, 83, 240, 83, 240, 83, 240, 83, 240, 83, 240, + 83, 240, 41, 0, 26, 112, 59, 20, 0, 17, 73, 227, + 240, 35, 240, 35, 240, 35, 240, 35, 236, 179, 83, 147, + 114, 131, 115, 115, 131, 99, 131, 99, 131, 99, 131, 99, + 131, 99, 115, 115, 114, 139, 147, 240, 35, 240, 35, 240, + 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, 35, 240, + 35, 233, 240, 240, 16, 50, 17, 0, 13, 69, 163, 35, + 146, 67, 114, 83, 114, 83, 99, 83, 99, 82, 115, 66, + 131, 50, 150, 179, 35, 147, 67, 115, 83, 99, 98, 99, + 99, 83, 99, 83, 99, 83, 18, 51, 86, 51, 85, 51, + 101, 50, 85, 21, 0, 19, 112, 37, 15, 0, 13, 65, + 226, 210, 226, 225, 0, 7, 6, 130, 51, 99, 67, 83, + 67, 83, 67, 195, 150, 99, 51, 83, 67, 83, 67, 83, + 67, 83, 52, 101, 36, 0, 17, 32, 38, 15, 0, 13, + 98, 210, 210, 194, 209, 209, 240, 240, 214, 130, 51, 99, + 67, 83, 67, 83, 67, 195, 150, 99, 51, 83, 67, 83, + 67, 83, 67, 83, 52, 101, 36, 0, 17, 32, 43, 15, + 0, 13, 82, 193, 18, 177, 19, 145, 50, 145, 51, 113, + 83, 240, 240, 118, 130, 51, 99, 67, 83, 67, 83, 67, + 195, 150, 99, 51, 83, 67, 83, 67, 83, 67, 83, 52, + 101, 36, 0, 17, 32, 36, 15, 0, 18, 116, 65, 81, + 68, 0, 6, 86, 130, 51, 99, 67, 83, 67, 83, 67, + 195, 150, 99, 51, 83, 67, 83, 67, 83, 67, 83, 52, + 101, 36, 0, 17, 32, 38, 15, 0, 16, 115, 51, 99, + 51, 99, 51, 0, 6, 86, 130, 51, 99, 67, 83, 67, + 83, 67, 195, 150, 99, 51, 83, 67, 83, 67, 83, 67, + 83, 52, 101, 36, 0, 17, 32, 44, 14, 0, 10, 115, + 161, 49, 129, 81, 113, 81, 113, 81, 129, 49, 163, 240, + 240, 133, 130, 50, 98, 82, 83, 66, 83, 66, 194, 149, + 99, 50, 82, 82, 82, 82, 82, 82, 83, 36, 100, 51, + 0, 16, 16, 40, 21, 0, 39, 85, 68, 114, 50, 18, + 51, 67, 67, 82, 67, 67, 83, 163, 83, 156, 99, 19, + 195, 51, 179, 67, 179, 67, 113, 51, 68, 82, 51, 49, + 35, 50, 85, 69, 0, 24, 48, 38, 14, 0, 26, 101, + 115, 50, 83, 67, 66, 83, 51, 83, 51, 179, 179, 179, + 113, 66, 113, 67, 82, 83, 65, 133, 240, 146, 210, 146, + 49, 130, 49, 129, 50, 148, 240, 240, 64, 35, 15, 0, + 13, 82, 210, 210, 226, 225, 241, 240, 240, 181, 131, 51, + 83, 82, 82, 99, 51, 99, 60, 51, 195, 195, 211, 113, + 67, 97, 99, 66, 133, 0, 17, 80, 35, 15, 0, 14, + 2, 195, 194, 209, 209, 225, 240, 240, 213, 131, 51, 83, + 82, 82, 99, 51, 99, 60, 51, 195, 195, 211, 113, 67, + 97, 99, 66, 133, 0, 17, 80, 39, 15, 0, 13, 99, + 195, 177, 19, 145, 51, 129, 66, 113, 83, 240, 240, 133, + 131, 51, 83, 82, 82, 99, 51, 99, 60, 51, 195, 195, + 211, 113, 67, 97, 99, 66, 133, 0, 17, 80, 35, 15, + 0, 17, 3, 51, 99, 51, 99, 51, 0, 6, 101, 131, + 51, 83, 82, 82, 99, 51, 99, 60, 51, 195, 195, 210, + 114, 67, 97, 99, 66, 133, 0, 17, 80, 27, 10, 0, + 8, 98, 131, 131, 130, 145, 161, 240, 165, 115, 115, 115, + 115, 115, 115, 115, 115, 115, 115, 115, 87, 0, 11, 80, + 27, 9, 0, 8, 34, 114, 114, 98, 113, 240, 240, 53, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 70, + 0, 10, 64, 29, 10, 0, 9, 2, 116, 97, 19, 65, + 50, 146, 240, 240, 53, 115, 115, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 87, 0, 11, 80, 28, 11, 0, 12, + 51, 35, 51, 35, 51, 35, 240, 240, 117, 131, 131, 131, + 131, 131, 131, 131, 131, 131, 131, 131, 103, 0, 12, 96, + 43, 15, 0, 13, 51, 65, 131, 33, 164, 195, 162, 19, + 129, 51, 211, 211, 120, 98, 52, 83, 68, 66, 99, 51, + 99, 51, 99, 51, 99, 51, 99, 51, 99, 66, 98, 83, + 67, 98, 51, 148, 0, 17, 96, 40, 18, 0, 23, 3, + 49, 161, 52, 0, 7, 85, 36, 147, 17, 35, 132, 67, + 116, 67, 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, + 115, 83, 115, 83, 115, 83, 87, 23, 0, 20, 80, 39, + 16, 0, 14, 66, 226, 242, 226, 242, 241, 240, 240, 229, + 147, 51, 99, 83, 82, 114, 67, 115, 51, 115, 51, 115, + 51, 115, 51, 115, 66, 114, 83, 83, 99, 51, 149, 0, + 18, 112, 39, 16, 0, 14, 114, 226, 210, 226, 210, 225, + 0, 5, 101, 147, 51, 99, 83, 82, 114, 67, 115, 51, + 115, 51, 115, 51, 115, 51, 115, 66, 114, 83, 83, 99, + 51, 149, 0, 18, 112, 42, 16, 0, 14, 98, 211, 193, + 34, 177, 35, 145, 66, 242, 240, 240, 181, 147, 51, 99, + 83, 82, 114, 67, 115, 51, 115, 51, 115, 51, 115, 51, + 115, 66, 114, 83, 83, 99, 51, 149, 0, 18, 112, 37, + 16, 0, 20, 52, 49, 113, 52, 0, 7, 37, 147, 51, + 99, 83, 82, 114, 67, 115, 51, 115, 51, 115, 51, 115, + 51, 115, 66, 114, 83, 83, 99, 51, 149, 0, 18, 112, + 39, 16, 0, 18, 35, 51, 115, 51, 115, 51, 0, 7, + 21, 147, 51, 99, 83, 82, 114, 67, 115, 51, 115, 51, + 115, 51, 115, 51, 115, 66, 114, 83, 83, 99, 51, 149, + 0, 18, 112, 18, 18, 0, 34, 67, 244, 243, 240, 240, + 239, 0, 8, 2, 244, 242, 0, 23, 80, 40, 16, 0, + 30, 69, 49, 83, 50, 17, 83, 82, 98, 99, 67, 81, + 19, 51, 65, 35, 51, 49, 51, 51, 33, 67, 51, 17, + 83, 67, 98, 98, 83, 81, 18, 51, 81, 53, 0, 18, + 112, 45, 18, 0, 16, 49, 240, 34, 240, 33, 240, 34, + 240, 33, 0, 8, 5, 53, 115, 83, 115, 83, 115, 83, + 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, 115, 68, + 115, 68, 131, 33, 19, 148, 37, 0, 20, 80, 44, 18, + 0, 16, 97, 240, 18, 240, 18, 242, 240, 17, 0, 8, + 21, 53, 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, + 115, 83, 115, 83, 115, 83, 115, 68, 115, 68, 131, 33, + 19, 148, 37, 0, 20, 80, 45, 18, 0, 16, 66, 241, + 18, 225, 18, 209, 50, 193, 51, 0, 7, 85, 53, 115, + 83, 115, 83, 115, 83, 115, 83, 115, 83, 115, 83, 115, + 83, 115, 83, 115, 68, 115, 68, 131, 33, 19, 148, 37, + 0, 20, 80, 42, 18, 0, 20, 67, 51, 147, 51, 147, + 51, 0, 7, 85, 53, 115, 83, 115, 83, 115, 83, 115, + 83, 115, 83, 115, 83, 115, 83, 115, 83, 115, 68, 115, + 68, 131, 33, 19, 148, 37, 0, 20, 80, 58, 18, 0, + 16, 114, 240, 18, 242, 240, 17, 240, 18, 240, 17, 0, + 5, 119, 37, 99, 97, 146, 81, 162, 81, 163, 65, 178, + 49, 195, 33, 210, 17, 226, 17, 228, 242, 240, 18, 240, + 33, 240, 17, 240, 33, 240, 33, 240, 17, 240, 33, 179, + 49, 179, 33, 195, 33, 212, 208, 49, 17, 0, 12, 104, + 179, 227, 227, 227, 227, 227, 227, 227, 227, 36, 133, 50, + 116, 67, 99, 99, 83, 99, 83, 99, 83, 99, 83, 99, + 83, 99, 83, 99, 84, 67, 100, 66, 115, 21, 131, 227, + 227, 227, 227, 227, 227, 227, 200, 144, 53, 18, 0, 20, + 99, 51, 147, 51, 147, 51, 0, 7, 71, 37, 98, 113, + 146, 97, 146, 81, 163, 65, 178, 49, 195, 33, 210, 33, + 210, 17, 228, 243, 242, 240, 33, 240, 33, 240, 17, 240, + 33, 240, 17, 240, 33, 179, 49, 179, 33, 195, 33, 212, + 208, +}; + +//***************************************************************************** +// +// The glyph offset table for the 30 point Theanodidot font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanodidot30[] = +{ + 0, 5, 32, 57, 104, 179, 248, 313, + 328, 362, 396, 427, 461, 476, 485, 495, + 530, 577, 606, 646, 686, 722, 762, 806, + 840, 884, 930, 945, 965, 993, 1004, 1030, + 1063, 1147, 1200, 1246, 1294, 1340, 1387, 1435, + 1485, 1533, 1561, 1593, 1646, 1693, 1772, 1833, + 1880, 1925, 1987, 2034, 2074, 2129, 2177, 2230, + 2309, 2363, 2414, 2457, 2492, 2526, 2561, 2589, + 2597, 2610, 2640, 2684, 2712, 2756, 2783, 2816, + 2864, 2907, 2932, 2968, 3018, 3047, 3096, 3130, + 3161, 3203, 3245, 3269, 3296, 3323, 3357, 3386, + 3431, 3462, 3506, 3535, 3570, 3603, 3638, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3652, 3657, 3682, 3733, 3783, 3813, 3856, 3885, + 3940, 3953, 4022, 4042, 4063, 4083, 4092, 4168, + 4176, 4203, 4240, 4266, 4290, 4303, 4356, 4419, + 4429, 4443, 4463, 4486, 4507, 4566, 4629, 4694, + 4725, 4787, 4850, 4917, 4977, 5037, 5105, 5183, + 5247, 5302, 5358, 5416, 5469, 5500, 5533, 5570, + 5603, 5649, 5716, 5771, 5827, 5885, 5938, 5991, + 6018, 6078, 6135, 6192, 6252, 6306, 6366, 6425, + 6475, 6512, 6550, 6593, 6629, 6667, 6711, 6751, + 6789, 6824, 6859, 6898, 6933, 6960, 6987, 7016, + 7044, 7087, 7127, 7166, 7205, 7247, 7284, 7323, + 7341, 7381, 7426, 7470, 7515, 7557, 7615, 7664, +}; + +//***************************************************************************** +// +// The font definition for the 30 point Theanodidot font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanodidot30 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 30, + + // + // The height of the font. + // + 37, + + // + // The baseline of the font. + // + 28, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanodidot30, + + // + // A pointer to the actual font data + // + g_pui8Theanodidot30Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanomodern14.c b/third_party/fonts/ofl/fonts/fonttheanomodern14.c new file mode 100644 index 0000000..2fd9bf3 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanomodern14.c @@ -0,0 +1,526 @@ +//***************************************************************************** +// +// fonttheanomodern14.c - Font definition for the 14pt Theanomodern font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanomodern +// Size: 14 point +// Bold: no +// Italic: no +// Memory usage: 3884 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 14 point Theanomodern font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanomodern14Data[3683] = +{ + 5, 6, 0, 12, 96, 11, 3, 146, 18, 18, 18, 17, + 33, 129, 34, 208, 12, 5, 241, 33, 17, 33, 17, 33, + 65, 0, 6, 48, 24, 8, 240, 193, 33, 65, 17, 65, + 33, 39, 49, 33, 65, 33, 39, 33, 33, 65, 33, 65, + 33, 240, 240, 80, 29, 8, 240, 165, 33, 17, 18, 33, + 17, 18, 35, 17, 68, 84, 65, 17, 17, 19, 17, 17, + 17, 17, 17, 17, 34, 18, 67, 240, 192, 32, 10, 240, + 240, 18, 65, 33, 33, 33, 49, 33, 17, 65, 33, 17, + 82, 17, 145, 33, 81, 33, 17, 65, 33, 17, 49, 49, + 17, 114, 240, 240, 192, 27, 10, 240, 240, 50, 113, 33, + 97, 33, 99, 114, 49, 49, 18, 17, 49, 51, 49, 66, + 49, 66, 17, 36, 18, 240, 240, 192, 7, 2, 97, 17, + 17, 240, 128, 17, 5, 240, 49, 49, 49, 65, 49, 65, + 65, 65, 65, 65, 81, 65, 81, 81, 17, 5, 241, 81, + 81, 65, 81, 65, 65, 65, 65, 65, 49, 65, 49, 49, + 64, 16, 8, 240, 193, 66, 17, 18, 51, 65, 17, 17, + 81, 113, 0, 8, 64, 14, 8, 0, 6, 49, 113, 113, + 71, 65, 113, 113, 240, 240, 96, 9, 4, 0, 6, 18, + 49, 33, 33, 112, 8, 5, 0, 6, 36, 240, 240, 16, + 7, 3, 240, 240, 49, 34, 208, 15, 4, 240, 49, 49, + 33, 49, 49, 49, 49, 33, 49, 49, 49, 176, 25, 8, + 240, 179, 65, 49, 33, 65, 33, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 33, 49, 65, 17, 240, 240, 80, 14, + 4, 225, 19, 49, 49, 49, 49, 49, 49, 49, 49, 240, + 32, 19, 7, 240, 116, 33, 65, 17, 65, 34, 33, 81, + 97, 81, 81, 81, 49, 37, 240, 224, 20, 7, 240, 116, + 33, 65, 18, 49, 97, 51, 97, 49, 49, 18, 49, 17, + 65, 36, 240, 240, 20, 8, 240, 209, 113, 98, 81, 17, + 81, 17, 65, 33, 65, 33, 55, 81, 113, 240, 240, 80, + 18, 7, 240, 177, 36, 33, 97, 116, 113, 33, 49, 18, + 49, 17, 65, 36, 240, 240, 22, 7, 240, 131, 49, 34, + 17, 49, 33, 97, 19, 34, 49, 17, 65, 17, 65, 17, + 65, 36, 240, 240, 18, 7, 241, 101, 17, 65, 17, 49, + 97, 81, 97, 97, 82, 82, 82, 240, 240, 16, 24, 8, + 240, 164, 49, 65, 33, 65, 34, 49, 52, 65, 19, 33, + 66, 17, 81, 17, 81, 34, 18, 240, 240, 64, 24, 7, + 240, 115, 49, 49, 33, 65, 17, 65, 17, 50, 35, 17, + 97, 33, 33, 34, 33, 49, 17, 240, 240, 16, 8, 3, + 240, 98, 17, 129, 34, 208, 10, 3, 240, 98, 18, 162, + 33, 33, 17, 80, 14, 8, 0, 6, 97, 82, 66, 66, + 114, 130, 130, 240, 240, 48, 9, 8, 0, 8, 7, 151, + 0, 6, 16, 14, 8, 0, 6, 1, 130, 130, 130, 82, + 66, 66, 240, 240, 128, 16, 5, 243, 33, 33, 17, 33, + 65, 50, 19, 33, 65, 65, 66, 240, 128, 39, 12, 0, + 6, 83, 99, 49, 65, 113, 49, 51, 33, 17, 49, 33, + 33, 17, 33, 49, 33, 17, 33, 33, 49, 17, 33, 33, + 33, 33, 33, 17, 18, 65, 33, 145, 81, 101, 240, 16, + 22, 9, 240, 240, 17, 129, 115, 99, 81, 33, 81, 33, + 85, 49, 65, 49, 65, 35, 50, 240, 240, 112, 24, 9, + 240, 199, 49, 81, 33, 81, 33, 65, 53, 65, 65, 49, + 81, 33, 81, 33, 81, 33, 50, 240, 240, 128, 23, 9, + 240, 228, 17, 33, 66, 17, 97, 17, 97, 17, 129, 129, + 129, 97, 33, 65, 66, 17, 240, 240, 144, 25, 10, 240, + 247, 65, 81, 49, 81, 49, 97, 33, 97, 33, 97, 33, + 97, 33, 81, 49, 81, 49, 50, 240, 240, 208, 27, 9, + 240, 200, 33, 66, 33, 81, 33, 33, 33, 33, 33, 33, + 36, 81, 33, 81, 33, 33, 33, 81, 33, 51, 240, 240, + 112, 24, 9, 240, 200, 33, 66, 33, 81, 33, 33, 33, + 33, 33, 33, 36, 81, 33, 81, 33, 81, 129, 240, 240, + 208, 24, 10, 240, 240, 36, 81, 66, 33, 97, 33, 145, + 145, 53, 17, 97, 33, 97, 49, 81, 66, 18, 240, 240, + 208, 25, 10, 240, 243, 51, 33, 81, 49, 81, 49, 81, + 49, 81, 55, 49, 81, 49, 81, 49, 81, 49, 81, 240, + 240, 192, 14, 4, 195, 33, 49, 49, 49, 49, 49, 49, + 49, 49, 240, 48, 20, 7, 240, 162, 81, 97, 97, 97, + 97, 49, 33, 35, 17, 33, 49, 49, 17, 240, 240, 16, + 26, 10, 240, 243, 51, 33, 65, 65, 49, 81, 33, 97, + 17, 114, 17, 97, 34, 81, 50, 65, 65, 65, 67, 240, + 240, 176, 20, 8, 240, 145, 113, 113, 113, 113, 113, 113, + 81, 17, 81, 17, 66, 17, 51, 240, 240, 48, 40, 12, + 240, 240, 99, 83, 34, 82, 49, 17, 49, 17, 49, 17, + 49, 17, 49, 18, 33, 17, 49, 33, 17, 33, 49, 33, + 17, 33, 49, 34, 49, 49, 49, 49, 49, 49, 49, 0, + 6, 32, 30, 9, 240, 195, 50, 34, 65, 35, 49, 33, + 17, 49, 33, 33, 33, 33, 49, 17, 33, 49, 17, 33, + 66, 33, 81, 19, 65, 240, 240, 112, 26, 10, 240, 240, + 37, 65, 81, 33, 97, 33, 113, 17, 113, 17, 113, 17, + 113, 17, 97, 49, 81, 66, 18, 240, 240, 208, 20, 8, + 240, 150, 49, 65, 33, 65, 33, 65, 33, 65, 37, 49, + 113, 113, 113, 240, 240, 128, 32, 10, 240, 240, 37, 65, + 81, 33, 97, 33, 113, 17, 113, 17, 113, 17, 113, 33, + 33, 49, 33, 17, 17, 17, 67, 17, 130, 17, 113, 17, + 114, 192, 24, 9, 240, 198, 65, 65, 49, 65, 49, 65, + 49, 65, 53, 65, 49, 65, 49, 65, 50, 49, 66, 240, + 240, 112, 23, 8, 240, 164, 49, 65, 33, 65, 34, 116, + 99, 33, 66, 17, 81, 18, 65, 17, 17, 18, 240, 240, + 64, 22, 10, 240, 249, 18, 33, 34, 17, 49, 49, 17, + 49, 49, 81, 145, 145, 145, 145, 145, 240, 240, 240, 26, + 10, 240, 243, 51, 33, 81, 49, 81, 49, 81, 49, 81, + 49, 81, 49, 81, 49, 81, 49, 81, 66, 18, 240, 240, + 208, 22, 9, 240, 195, 50, 33, 65, 50, 49, 65, 33, + 81, 33, 82, 17, 98, 114, 114, 113, 240, 240, 176, 36, + 14, 240, 240, 195, 35, 35, 33, 65, 65, 50, 50, 49, + 65, 33, 17, 33, 81, 33, 17, 33, 81, 17, 34, 17, + 83, 50, 114, 50, 113, 66, 113, 65, 0, 7, 80, 25, + 11, 240, 240, 67, 51, 65, 49, 98, 17, 129, 17, 130, + 147, 113, 33, 113, 34, 81, 66, 36, 51, 240, 240, 240, + 20, 10, 240, 243, 51, 49, 65, 65, 49, 97, 17, 115, + 129, 145, 145, 145, 145, 240, 240, 240, 22, 9, 240, 215, + 33, 65, 49, 50, 98, 113, 114, 98, 49, 34, 65, 34, + 65, 18, 51, 240, 240, 112, 17, 3, 146, 17, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 32, 15, + 4, 240, 17, 49, 49, 49, 65, 49, 49, 49, 65, 49, + 49, 144, 16, 3, 146, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 14, 8, 240, 194, 81, 17, + 81, 33, 49, 65, 17, 0, 9, 112, 7, 8, 0, 14, + 7, 240, 32, 8, 4, 193, 65, 65, 240, 240, 240, 15, + 7, 0, 6, 35, 50, 33, 82, 50, 18, 17, 50, 22, + 240, 224, 21, 7, 240, 97, 97, 97, 97, 97, 19, 34, + 49, 17, 65, 17, 65, 17, 65, 34, 17, 240, 240, 14, + 6, 240, 240, 211, 33, 49, 17, 81, 81, 97, 17, 240, + 176, 21, 7, 240, 162, 97, 97, 97, 35, 17, 17, 50, + 17, 65, 17, 65, 17, 65, 33, 19, 240, 224, 15, 6, + 240, 240, 211, 33, 49, 21, 17, 81, 49, 33, 17, 240, + 176, 16, 5, 240, 19, 17, 33, 17, 65, 65, 65, 65, + 65, 65, 65, 240, 144, 21, 8, 0, 7, 37, 33, 50, + 33, 49, 49, 49, 52, 49, 133, 33, 81, 17, 81, 33, + 34, 32, 21, 6, 240, 49, 81, 81, 81, 81, 18, 34, + 33, 17, 49, 17, 49, 17, 49, 17, 49, 240, 160, 11, + 2, 97, 17, 81, 17, 17, 17, 17, 17, 144, 16, 4, + 225, 49, 177, 49, 49, 49, 49, 49, 49, 49, 17, 17, + 18, 32, 20, 7, 240, 97, 97, 97, 97, 97, 34, 33, + 33, 49, 17, 67, 65, 33, 49, 35, 240, 224, 13, 2, + 97, 17, 17, 17, 17, 17, 17, 17, 17, 17, 144, 25, + 10, 0, 8, 97, 19, 19, 18, 34, 33, 17, 49, 49, + 17, 49, 49, 17, 49, 49, 17, 49, 49, 240, 240, 176, + 18, 6, 240, 240, 193, 18, 34, 33, 17, 49, 17, 49, + 17, 49, 17, 49, 240, 160, 17, 7, 0, 6, 36, 33, + 65, 17, 65, 17, 65, 17, 65, 33, 33, 240, 240, 21, + 7, 0, 6, 21, 33, 65, 17, 65, 17, 65, 17, 65, + 19, 17, 33, 33, 49, 97, 97, 96, 20, 7, 0, 6, + 35, 49, 50, 17, 65, 17, 65, 17, 65, 33, 19, 49, + 33, 97, 97, 97, 13, 5, 240, 240, 84, 17, 33, 17, + 65, 65, 65, 240, 144, 14, 6, 240, 240, 195, 49, 83, + 98, 17, 49, 33, 17, 240, 176, 16, 6, 240, 161, 81, + 66, 82, 65, 81, 81, 33, 33, 33, 35, 240, 176, 17, + 6, 240, 240, 193, 49, 17, 49, 17, 49, 17, 49, 17, + 49, 21, 240, 160, 16, 6, 240, 240, 193, 49, 17, 33, + 49, 17, 49, 17, 65, 81, 240, 192, 22, 9, 0, 7, + 113, 34, 33, 17, 49, 17, 49, 18, 17, 50, 34, 50, + 33, 81, 33, 240, 240, 144, 16, 7, 0, 6, 18, 34, + 34, 17, 66, 82, 65, 33, 34, 34, 240, 224, 19, 7, + 0, 6, 33, 49, 33, 49, 49, 17, 65, 17, 81, 97, + 97, 81, 67, 66, 80, 15, 6, 240, 240, 197, 17, 33, + 65, 65, 81, 33, 17, 34, 240, 160, 16, 3, 161, 33, + 33, 33, 33, 33, 17, 49, 33, 33, 33, 33, 33, 64, + 16, 2, 97, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 48, 16, 3, 145, 33, 33, 33, 33, 33, + 49, 17, 33, 33, 33, 33, 33, 80, 10, 7, 0, 8, + 18, 49, 50, 240, 240, 208, 5, 6, 0, 12, 96, 11, + 3, 240, 98, 17, 129, 33, 34, 18, 18, 18, 22, 6, + 240, 209, 65, 81, 51, 33, 17, 17, 17, 17, 49, 17, + 50, 81, 17, 50, 49, 81, 81, 80, 19, 8, 240, 211, + 65, 33, 50, 97, 113, 100, 81, 97, 115, 33, 17, 50, + 240, 240, 64, 18, 7, 0, 6, 22, 17, 49, 33, 65, + 17, 65, 33, 33, 33, 18, 17, 240, 224, 20, 8, 240, + 146, 50, 33, 49, 65, 17, 81, 17, 69, 81, 85, 81, + 113, 113, 240, 240, 96, 13, 2, 97, 17, 17, 17, 17, + 113, 17, 17, 17, 17, 48, 23, 6, 240, 82, 49, 17, + 49, 97, 50, 17, 33, 34, 17, 49, 18, 33, 35, 66, + 81, 49, 17, 65, 144, 8, 5, 240, 81, 33, 0, 7, + 80, 34, 12, 240, 240, 149, 82, 81, 65, 21, 17, 33, + 17, 65, 33, 17, 17, 65, 33, 17, 17, 113, 17, 17, + 113, 33, 20, 33, 50, 82, 82, 18, 0, 6, 64, 12, + 4, 194, 33, 17, 19, 17, 17, 33, 240, 240, 128, 14, + 6, 0, 6, 113, 17, 33, 17, 65, 17, 65, 17, 240, + 160, 10, 8, 0, 8, 7, 113, 113, 0, 6, 16, 8, + 5, 0, 6, 36, 240, 240, 16, 34, 12, 240, 240, 149, + 82, 81, 70, 33, 33, 33, 49, 33, 17, 33, 49, 33, + 17, 36, 49, 17, 33, 34, 33, 37, 17, 17, 50, 82, + 82, 18, 0, 6, 64, 6, 5, 240, 164, 0, 7, 13, + 6, 240, 67, 33, 49, 17, 49, 17, 49, 35, 0, 7, + 14, 8, 0, 6, 49, 113, 113, 71, 65, 113, 113, 71, + 240, 160, 14, 5, 240, 19, 17, 33, 33, 17, 49, 49, + 67, 240, 240, 176, 13, 5, 243, 33, 33, 65, 34, 33, + 33, 34, 240, 240, 192, 8, 4, 225, 33, 33, 0, 5, + 112, 20, 9, 0, 9, 33, 49, 65, 33, 65, 49, 65, + 34, 17, 35, 18, 33, 129, 129, 129, 128, 28, 7, 240, + 117, 19, 17, 35, 17, 35, 17, 50, 17, 65, 17, 65, + 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, 240, + 16, 6, 3, 240, 194, 240, 112, 8, 4, 0, 6, 81, + 65, 18, 96, 10, 4, 209, 49, 49, 49, 35, 240, 240, + 112, 14, 5, 240, 18, 33, 33, 17, 33, 17, 33, 34, + 0, 5, 112, 16, 6, 0, 6, 17, 17, 49, 17, 65, + 17, 33, 17, 33, 17, 240, 192, 30, 11, 240, 240, 65, + 81, 65, 65, 81, 65, 81, 49, 97, 33, 49, 35, 17, + 49, 81, 35, 65, 49, 17, 65, 52, 33, 97, 0, 5, + 96, 29, 10, 240, 240, 17, 145, 65, 65, 49, 81, 49, + 81, 33, 18, 36, 17, 33, 65, 33, 17, 49, 65, 65, + 49, 65, 67, 240, 240, 176, 31, 11, 240, 240, 52, 49, + 49, 33, 33, 82, 49, 113, 17, 81, 33, 17, 98, 17, + 49, 81, 50, 81, 33, 17, 65, 52, 49, 81, 0, 5, + 96, 17, 5, 240, 240, 114, 49, 81, 65, 35, 18, 49, + 65, 33, 17, 33, 33, 17, 22, 9, 194, 240, 33, 129, + 115, 99, 81, 33, 81, 33, 85, 49, 65, 49, 65, 35, + 50, 240, 240, 112, 22, 9, 210, 240, 17, 129, 115, 99, + 81, 33, 81, 33, 85, 49, 65, 49, 65, 35, 50, 240, + 240, 112, 24, 9, 65, 113, 17, 240, 17, 129, 115, 99, + 81, 33, 81, 33, 85, 49, 65, 49, 65, 35, 50, 240, + 240, 112, 22, 9, 161, 20, 241, 129, 115, 99, 81, 33, + 81, 33, 85, 49, 65, 49, 65, 35, 50, 240, 240, 112, + 22, 9, 177, 49, 241, 129, 115, 99, 81, 33, 81, 33, + 85, 49, 65, 49, 65, 35, 50, 240, 240, 112, 25, 10, + 66, 113, 33, 114, 240, 50, 130, 113, 17, 113, 18, 81, + 34, 85, 81, 50, 49, 66, 35, 51, 240, 240, 176, 35, + 15, 0, 6, 41, 114, 66, 97, 17, 81, 81, 33, 33, + 33, 81, 33, 33, 120, 97, 65, 33, 33, 49, 65, 33, + 33, 33, 81, 81, 18, 81, 51, 0, 7, 80, 26, 9, + 240, 228, 17, 33, 66, 17, 97, 17, 97, 17, 129, 129, + 97, 17, 97, 33, 65, 66, 17, 98, 129, 129, 98, 80, + 28, 9, 17, 145, 248, 33, 66, 33, 81, 33, 33, 33, + 33, 33, 33, 36, 81, 33, 81, 33, 33, 33, 81, 33, + 51, 240, 240, 112, 27, 9, 194, 216, 33, 66, 33, 81, + 33, 33, 33, 33, 33, 33, 36, 81, 33, 81, 33, 33, + 33, 81, 33, 51, 240, 240, 112, 27, 9, 179, 216, 33, + 66, 33, 81, 33, 33, 33, 33, 33, 33, 36, 81, 33, + 81, 33, 33, 33, 81, 33, 51, 240, 240, 112, 28, 9, + 177, 33, 200, 33, 66, 33, 81, 33, 33, 33, 33, 33, + 33, 36, 81, 33, 81, 33, 33, 33, 81, 33, 51, 240, + 240, 112, 15, 4, 66, 99, 33, 49, 49, 49, 49, 49, + 49, 49, 49, 240, 48, 15, 4, 82, 83, 33, 49, 49, + 49, 49, 49, 49, 49, 49, 240, 48, 17, 4, 17, 33, + 17, 83, 33, 49, 49, 49, 49, 49, 49, 49, 49, 240, + 48, 16, 5, 81, 33, 99, 49, 65, 65, 65, 65, 65, + 65, 65, 65, 240, 128, 26, 11, 240, 240, 71, 81, 81, + 65, 81, 65, 97, 49, 97, 21, 65, 49, 97, 49, 81, + 65, 81, 66, 34, 0, 5, 112, 30, 9, 181, 179, 50, + 34, 65, 35, 49, 33, 17, 49, 33, 33, 33, 33, 49, + 17, 33, 49, 17, 33, 66, 33, 81, 19, 65, 240, 240, + 112, 26, 10, 210, 240, 37, 65, 81, 33, 97, 33, 113, + 17, 113, 17, 113, 17, 113, 17, 97, 49, 81, 66, 18, + 240, 240, 208, 26, 10, 226, 240, 21, 65, 81, 33, 97, + 33, 113, 17, 113, 17, 113, 17, 113, 17, 97, 49, 81, + 66, 18, 240, 240, 208, 28, 10, 65, 129, 17, 240, 21, + 65, 81, 33, 97, 33, 113, 17, 113, 17, 113, 17, 113, + 17, 97, 49, 81, 66, 18, 240, 240, 208, 25, 10, 182, + 245, 65, 81, 33, 97, 33, 113, 17, 113, 17, 113, 17, + 113, 17, 97, 49, 81, 66, 18, 240, 240, 208, 26, 10, + 193, 49, 245, 65, 81, 33, 97, 33, 113, 17, 113, 17, + 113, 17, 113, 17, 97, 49, 81, 66, 18, 240, 240, 208, + 15, 7, 0, 6, 17, 65, 33, 33, 66, 82, 50, 33, + 240, 240, 112, 32, 10, 240, 240, 52, 17, 34, 50, 33, + 83, 17, 66, 17, 17, 50, 33, 17, 34, 49, 17, 18, + 65, 19, 65, 50, 65, 33, 18, 18, 240, 240, 208, 27, + 10, 209, 240, 19, 51, 33, 81, 49, 81, 49, 81, 49, + 81, 49, 81, 49, 81, 49, 81, 49, 81, 66, 18, 240, + 240, 208, 26, 10, 226, 227, 51, 33, 81, 49, 81, 49, + 81, 49, 81, 49, 81, 49, 81, 49, 81, 49, 81, 66, + 18, 240, 240, 208, 28, 10, 65, 129, 17, 227, 51, 33, + 81, 49, 81, 49, 81, 49, 81, 49, 81, 49, 81, 49, + 81, 49, 81, 66, 18, 240, 240, 208, 27, 10, 209, 33, + 211, 51, 33, 81, 49, 81, 49, 81, 49, 81, 49, 81, + 49, 81, 49, 81, 49, 81, 66, 18, 240, 240, 208, 20, + 10, 241, 227, 51, 49, 65, 65, 49, 97, 17, 115, 129, + 145, 145, 145, 145, 240, 240, 240, 27, 9, 240, 195, 34, + 67, 17, 65, 65, 49, 65, 49, 65, 49, 65, 49, 49, + 65, 49, 65, 33, 83, 97, 129, 98, 240, 16, 25, 6, + 240, 67, 33, 49, 17, 49, 17, 33, 33, 33, 33, 49, + 17, 49, 17, 49, 17, 17, 17, 17, 18, 240, 176, 17, + 7, 240, 113, 113, 240, 67, 50, 33, 67, 34, 34, 17, + 50, 22, 240, 224, 17, 7, 240, 146, 81, 81, 195, 50, + 33, 82, 50, 18, 17, 50, 22, 240, 224, 19, 7, 240, + 129, 81, 17, 49, 49, 163, 50, 33, 82, 50, 18, 17, + 50, 22, 240, 224, 16, 7, 240, 226, 113, 179, 50, 33, + 82, 50, 18, 17, 50, 22, 240, 224, 17, 7, 240, 209, + 33, 240, 51, 50, 33, 82, 50, 18, 17, 50, 22, 240, + 224, 20, 7, 240, 115, 65, 17, 81, 179, 65, 33, 82, + 50, 17, 17, 17, 33, 17, 22, 240, 224, 21, 10, 0, + 8, 115, 19, 34, 33, 49, 55, 18, 33, 81, 49, 49, + 20, 17, 17, 240, 240, 192, 16, 6, 240, 240, 211, 33, + 49, 17, 81, 81, 97, 17, 65, 97, 50, 144, 17, 6, + 240, 65, 97, 240, 19, 33, 49, 21, 17, 81, 49, 33, + 17, 240, 176, 17, 6, 240, 113, 65, 65, 163, 33, 49, + 21, 17, 81, 49, 33, 17, 240, 176, 19, 6, 240, 81, + 65, 17, 33, 49, 131, 33, 49, 21, 17, 81, 49, 33, + 17, 240, 176, 16, 6, 240, 146, 18, 227, 33, 49, 21, + 17, 81, 49, 33, 17, 240, 176, 13, 4, 193, 65, 65, + 113, 49, 49, 49, 49, 49, 240, 32, 13, 4, 225, 33, + 33, 129, 49, 49, 49, 49, 49, 240, 48, 13, 4, 225, + 34, 17, 145, 49, 49, 49, 49, 49, 240, 32, 13, 5, + 240, 81, 33, 209, 65, 65, 65, 65, 65, 240, 112, 24, + 8, 240, 162, 49, 49, 19, 50, 66, 33, 84, 49, 50, + 33, 65, 33, 65, 33, 65, 49, 33, 240, 240, 64, 21, + 7, 240, 241, 33, 17, 34, 161, 18, 50, 33, 33, 49, + 33, 49, 33, 49, 33, 49, 240, 224, 19, 7, 240, 113, + 113, 113, 180, 33, 65, 17, 65, 17, 65, 17, 65, 33, + 33, 240, 240, 19, 7, 240, 161, 81, 81, 196, 33, 65, + 17, 65, 17, 65, 17, 65, 33, 33, 240, 240, 19, 7, + 240, 130, 82, 49, 228, 33, 65, 17, 65, 17, 65, 17, + 65, 33, 33, 240, 240, 20, 7, 240, 226, 33, 17, 34, + 164, 33, 65, 17, 65, 17, 65, 17, 65, 33, 33, 240, + 240, 19, 7, 240, 210, 18, 240, 36, 33, 65, 17, 65, + 17, 65, 17, 65, 33, 33, 240, 240, 12, 9, 0, 8, + 34, 114, 72, 210, 113, 240, 240, 176, 19, 7, 0, 6, + 37, 17, 50, 17, 33, 17, 17, 17, 33, 18, 49, 18, + 33, 240, 240, 19, 6, 240, 49, 97, 97, 145, 49, 17, + 49, 17, 49, 17, 49, 17, 49, 21, 240, 160, 19, 6, + 240, 97, 65, 65, 161, 49, 17, 49, 17, 49, 17, 49, + 17, 49, 21, 240, 160, 20, 7, 240, 145, 81, 17, 33, + 225, 49, 33, 49, 33, 49, 33, 49, 33, 49, 37, 240, + 224, 18, 6, 240, 146, 18, 209, 49, 17, 49, 17, 49, + 17, 49, 17, 49, 21, 240, 160, 21, 7, 240, 161, 81, + 81, 193, 49, 33, 49, 49, 17, 65, 17, 81, 97, 97, + 81, 67, 66, 80, 22, 7, 240, 210, 97, 97, 97, 18, + 50, 33, 33, 49, 33, 49, 33, 33, 49, 17, 66, 81, + 97, 192, 21, 7, 240, 240, 98, 17, 161, 49, 33, 49, + 49, 17, 65, 17, 81, 97, 97, 81, 67, 66, 80, +}; + +//***************************************************************************** +// +// The glyph offset table for the 14 point Theanomodern font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanomodern14[] = +{ + 0, 5, 16, 28, 52, 81, 113, 140, + 147, 164, 181, 197, 211, 220, 228, 235, + 250, 275, 289, 308, 328, 348, 366, 388, + 406, 430, 454, 462, 472, 486, 495, 509, + 525, 564, 586, 610, 633, 658, 685, 709, + 733, 758, 772, 792, 818, 838, 878, 908, + 934, 954, 986, 1010, 1033, 1055, 1081, 1103, + 1139, 1164, 1184, 1206, 1223, 1238, 1254, 1268, + 1275, 1283, 1298, 1319, 1333, 1354, 1369, 1385, + 1406, 1427, 1438, 1454, 1474, 1487, 1512, 1530, + 1547, 1568, 1588, 1601, 1615, 1631, 1648, 1664, + 1686, 1702, 1721, 1736, 1752, 1768, 1784, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1794, 1799, 1810, 1832, 1851, 1869, 1889, 1902, + 1925, 1933, 1967, 1979, 1993, 2003, 2011, 2045, + 2051, 2064, 2078, 2092, 2105, 2113, 2133, 2161, + 2167, 2175, 2185, 2199, 2215, 2245, 2274, 2305, + 2322, 2344, 2366, 2390, 2412, 2434, 2459, 2494, + 2520, 2548, 2575, 2602, 2630, 2645, 2660, 2677, + 2693, 2719, 2749, 2775, 2801, 2829, 2854, 2880, + 2895, 2927, 2954, 2980, 3008, 3035, 3055, 3082, + 3107, 3124, 3141, 3160, 3176, 3193, 3213, 3234, + 3250, 3267, 3284, 3303, 3319, 3332, 3345, 3358, + 3371, 3395, 3416, 3435, 3454, 3473, 3493, 3512, + 3524, 3543, 3562, 3581, 3601, 3619, 3640, 3662, +}; + +//***************************************************************************** +// +// The font definition for the 14 point Theanomodern font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanomodern14 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 13, + + // + // The height of the font. + // + 17, + + // + // The baseline of the font. + // + 13, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanomodern14, + + // + // A pointer to the actual font data + // + g_pui8Theanomodern14Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanomodern16.c b/third_party/fonts/ofl/fonts/fonttheanomodern16.c new file mode 100644 index 0000000..9f6cc77 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanomodern16.c @@ -0,0 +1,567 @@ +//***************************************************************************** +// +// fonttheanomodern16.c - Font definition for the 16pt Theanomodern font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanomodern +// Size: 16 point +// Bold: no +// Italic: no +// Memory usage: 4368 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 16 point Theanomodern font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanomodern16Data[4165] = +{ + 4, 6, 0, 15, 13, 3, 194, 18, 18, 18, 18, 17, + 33, 130, 18, 240, 16, 15, 5, 240, 81, 33, 17, 33, + 17, 33, 17, 33, 17, 33, 0, 7, 25, 10, 0, 5, + 113, 81, 33, 97, 33, 57, 49, 49, 81, 33, 97, 33, + 73, 49, 33, 81, 49, 81, 0, 7, 32, 29, 9, 240, + 242, 100, 50, 18, 17, 33, 37, 18, 18, 84, 115, 101, + 18, 18, 33, 18, 18, 33, 17, 34, 17, 53, 98, 240, + 240, 160, 36, 12, 0, 6, 18, 81, 49, 33, 49, 65, + 33, 49, 65, 33, 33, 98, 33, 177, 33, 113, 18, 18, + 65, 33, 49, 65, 33, 49, 49, 49, 49, 129, 17, 0, + 7, 96, 32, 11, 0, 5, 114, 129, 33, 113, 33, 115, + 130, 50, 49, 18, 33, 50, 34, 17, 50, 34, 17, 50, + 50, 33, 18, 51, 17, 36, 19, 0, 7, 16, 9, 2, + 129, 17, 17, 17, 17, 240, 128, 19, 5, 240, 129, 49, + 49, 65, 49, 65, 65, 65, 65, 65, 65, 81, 65, 81, + 81, 96, 19, 5, 240, 81, 81, 81, 65, 81, 65, 65, + 65, 65, 65, 65, 49, 65, 49, 49, 144, 20, 8, 240, + 240, 81, 65, 33, 33, 33, 17, 17, 67, 50, 17, 18, + 65, 113, 0, 9, 64, 15, 10, 0, 9, 33, 145, 145, + 145, 89, 81, 145, 145, 0, 6, 112, 10, 4, 0, 6, + 81, 35, 49, 49, 33, 160, 8, 6, 0, 8, 37, 0, + 6, 16, 8, 3, 240, 240, 146, 18, 240, 16, 18, 5, + 240, 129, 65, 49, 65, 65, 65, 49, 65, 65, 65, 49, + 65, 65, 65, 224, 27, 8, 240, 240, 67, 65, 49, 33, + 65, 33, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 65, 49, 49, 67, 240, 240, 208, 16, 5, 240, 83, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 51, 240, 176, 22, + 7, 240, 228, 33, 65, 18, 49, 18, 49, 97, 81, 81, + 81, 81, 49, 17, 65, 22, 240, 240, 96, 23, 8, 240, + 240, 53, 33, 81, 18, 65, 113, 52, 113, 129, 18, 65, + 18, 65, 17, 65, 52, 240, 240, 208, 22, 8, 240, 240, + 97, 113, 98, 81, 17, 81, 17, 65, 33, 49, 49, 55, + 81, 113, 99, 240, 240, 192, 23, 8, 240, 161, 65, 37, + 49, 113, 113, 117, 49, 65, 113, 34, 49, 18, 65, 17, + 65, 52, 240, 240, 208, 26, 8, 240, 240, 83, 50, 34, + 17, 65, 33, 113, 19, 50, 50, 17, 81, 17, 81, 17, + 81, 33, 49, 67, 240, 240, 208, 21, 8, 240, 240, 54, + 17, 65, 33, 65, 33, 49, 113, 97, 113, 113, 98, 98, + 98, 240, 240, 224, 26, 8, 240, 240, 68, 34, 65, 17, + 81, 17, 81, 34, 33, 68, 34, 35, 17, 81, 17, 81, + 17, 81, 52, 240, 240, 192, 26, 8, 240, 240, 67, 50, + 49, 33, 81, 17, 81, 17, 81, 33, 50, 51, 17, 113, + 18, 49, 34, 49, 52, 240, 240, 208, 9, 3, 240, 146, + 18, 162, 18, 240, 16, 12, 4, 240, 240, 50, 34, 225, + 35, 49, 49, 33, 160, 15, 9, 0, 8, 82, 82, 82, + 82, 114, 146, 146, 146, 0, 5, 96, 9, 10, 0, 12, + 73, 185, 0, 8, 112, 15, 9, 0, 7, 114, 146, 146, + 146, 114, 82, 82, 82, 0, 6, 64, 18, 6, 240, 148, + 33, 49, 17, 49, 81, 51, 35, 49, 81, 162, 66, 240, + 240, 64, 43, 14, 0, 9, 67, 131, 50, 81, 129, 49, + 50, 18, 33, 17, 49, 34, 49, 17, 33, 50, 49, 17, + 33, 50, 49, 17, 33, 49, 65, 17, 33, 34, 49, 49, + 19, 20, 65, 226, 97, 118, 240, 240, 32, 24, 11, 0, + 6, 17, 146, 146, 129, 18, 113, 33, 113, 33, 117, 81, + 65, 81, 65, 65, 82, 36, 51, 0, 7, 27, 9, 240, + 240, 103, 49, 81, 33, 81, 33, 81, 33, 65, 53, 65, + 65, 49, 81, 33, 81, 33, 81, 18, 50, 0, 5, 112, + 25, 10, 240, 240, 212, 17, 34, 66, 33, 97, 18, 97, + 18, 130, 130, 130, 97, 33, 97, 34, 65, 84, 0, 6, + 80, 28, 11, 240, 240, 231, 81, 82, 49, 82, 49, 98, + 33, 98, 33, 98, 33, 98, 33, 98, 33, 82, 49, 82, + 35, 34, 0, 7, 48, 29, 10, 240, 240, 169, 33, 82, + 33, 97, 33, 49, 33, 33, 49, 85, 81, 49, 81, 49, + 33, 33, 97, 33, 82, 18, 52, 0, 6, 48, 25, 10, + 240, 240, 169, 33, 82, 33, 97, 33, 49, 33, 33, 49, + 85, 81, 49, 81, 49, 81, 145, 131, 0, 7, 16, 26, + 11, 0, 5, 116, 97, 66, 50, 81, 34, 97, 34, 146, + 53, 18, 97, 34, 97, 50, 81, 50, 66, 84, 0, 7, + 48, 27, 11, 240, 240, 227, 67, 33, 97, 49, 97, 49, + 97, 49, 97, 56, 49, 97, 49, 97, 49, 97, 49, 97, + 35, 67, 0, 7, 16, 4, 240, 19, 33, 49, 49, 49, + 49, 49, 49, 49, 49, 35, 240, 96, 21, 8, 240, 240, + 99, 97, 113, 113, 113, 113, 113, 50, 33, 35, 33, 33, + 49, 67, 240, 240, 224, 27, 11, 240, 240, 227, 52, 33, + 81, 65, 65, 81, 49, 97, 18, 116, 113, 34, 97, 50, + 81, 66, 65, 81, 51, 52, 0, 7, 23, 10, 240, 240, + 163, 129, 145, 145, 145, 145, 145, 97, 33, 97, 33, 97, + 33, 82, 19, 36, 0, 6, 48, 42, 13, 0, 6, 67, + 99, 35, 82, 49, 17, 65, 17, 49, 17, 65, 17, 49, + 18, 49, 17, 49, 33, 33, 33, 49, 34, 17, 33, 49, + 35, 49, 49, 50, 49, 49, 50, 49, 35, 99, 0, 8, + 32, 34, 11, 240, 240, 227, 67, 34, 81, 51, 65, 49, + 18, 49, 49, 33, 49, 49, 49, 33, 49, 50, 17, 49, + 65, 17, 49, 82, 49, 82, 35, 81, 0, 7, 16, 27, + 11, 0, 5, 116, 82, 65, 65, 97, 34, 98, 18, 98, + 18, 98, 18, 98, 18, 98, 33, 97, 50, 65, 100, 0, + 7, 48, 22, 9, 240, 240, 103, 49, 81, 33, 81, 33, + 81, 33, 65, 53, 65, 129, 129, 129, 115, 0, 6, 48, + 33, 11, 0, 5, 116, 82, 65, 65, 97, 34, 98, 18, + 98, 18, 98, 18, 98, 18, 98, 33, 33, 49, 51, 17, + 17, 100, 161, 33, 113, 33, 115, 240, 144, 28, 11, 240, + 240, 231, 81, 81, 65, 81, 65, 81, 65, 66, 69, 97, + 50, 81, 65, 81, 66, 17, 33, 67, 35, 51, 0, 7, + 16, 23, 9, 240, 240, 116, 65, 66, 33, 81, 34, 131, + 116, 131, 17, 97, 17, 97, 18, 81, 53, 0, 5, 112, + 26, 11, 240, 240, 234, 18, 33, 50, 17, 49, 65, 17, + 49, 65, 17, 49, 65, 81, 161, 161, 161, 161, 147, 0, + 7, 64, 28, 11, 240, 240, 227, 67, 33, 97, 49, 97, + 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, + 49, 82, 69, 0, 7, 48, 25, 11, 240, 240, 228, 36, + 34, 65, 66, 65, 81, 65, 82, 33, 98, 33, 113, 17, + 131, 131, 145, 161, 0, 7, 80, 42, 16, 0, 8, 3, + 51, 51, 34, 66, 65, 50, 66, 49, 81, 49, 17, 49, + 82, 33, 18, 33, 82, 17, 34, 17, 113, 17, 49, 17, + 113, 17, 49, 17, 114, 66, 145, 81, 145, 81, 0, 10, + 80, 27, 12, 0, 6, 19, 52, 50, 65, 98, 33, 129, + 17, 146, 178, 145, 17, 129, 34, 113, 50, 81, 81, 53, + 21, 0, 7, 80, 23, 12, 0, 6, 3, 53, 34, 65, + 97, 65, 98, 33, 129, 17, 161, 177, 177, 177, 177, 163, + 0, 8, 32, 25, 10, 240, 240, 184, 33, 66, 49, 65, + 65, 50, 114, 129, 130, 49, 50, 65, 34, 81, 34, 81, + 25, 0, 6, 48, 18, 3, 194, 17, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 80, 19, 5, + 240, 81, 65, 65, 65, 81, 65, 65, 65, 81, 65, 65, + 65, 65, 81, 65, 96, 18, 3, 194, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 64, 18, + 10, 240, 240, 225, 129, 17, 97, 49, 81, 49, 65, 81, + 33, 113, 0, 12, 80, 7, 9, 0, 19, 24, 240, 64, + 9, 4, 240, 17, 65, 65, 0, 6, 80, 20, 8, 0, + 8, 19, 66, 33, 65, 33, 68, 49, 49, 17, 17, 49, + 17, 23, 240, 240, 176, 23, 7, 240, 209, 97, 97, 97, + 97, 19, 34, 33, 33, 65, 17, 65, 17, 65, 18, 49, + 51, 240, 240, 112, 18, 7, 0, 7, 35, 49, 49, 17, + 65, 17, 97, 97, 65, 34, 17, 240, 240, 112, 25, 7, + 240, 240, 34, 97, 97, 97, 35, 17, 17, 50, 17, 65, + 17, 65, 17, 65, 17, 50, 35, 17, 240, 240, 96, 18, + 7, 0, 7, 20, 33, 49, 33, 50, 22, 17, 65, 17, + 65, 36, 240, 240, 112, 18, 6, 240, 163, 33, 34, 17, + 81, 82, 65, 81, 81, 81, 81, 81, 240, 240, 80, 23, + 9, 0, 9, 38, 33, 66, 33, 65, 49, 65, 68, 50, + 134, 49, 66, 17, 97, 17, 97, 34, 19, 176, 24, 7, + 240, 209, 97, 97, 97, 97, 19, 34, 49, 17, 65, 17, + 65, 17, 65, 17, 65, 17, 65, 240, 240, 96, 13, 3, + 194, 18, 113, 33, 33, 33, 33, 33, 33, 240, 32, 18, + 6, 240, 194, 66, 242, 81, 81, 81, 81, 81, 81, 81, + 81, 33, 33, 35, 144, 23, 7, 240, 209, 97, 97, 97, + 97, 50, 17, 49, 33, 18, 51, 65, 33, 49, 34, 33, + 50, 240, 240, 96, 14, 2, 129, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 176, 27, 11, 0, 11, 2, 19, + 18, 50, 34, 33, 33, 49, 49, 33, 49, 49, 33, 49, + 49, 33, 49, 49, 33, 49, 49, 0, 7, 21, 8, 0, + 8, 2, 19, 50, 49, 33, 65, 33, 65, 33, 65, 33, + 65, 33, 65, 240, 240, 176, 19, 7, 0, 7, 20, 33, + 49, 33, 65, 17, 65, 17, 65, 17, 65, 36, 240, 240, + 112, 23, 7, 0, 7, 1, 19, 34, 33, 33, 65, 17, + 65, 17, 65, 18, 49, 17, 19, 33, 97, 97, 97, 208, + 22, 7, 0, 7, 19, 49, 50, 17, 65, 17, 65, 17, + 65, 17, 50, 35, 17, 97, 97, 97, 97, 128, 16, 6, + 0, 6, 2, 18, 34, 17, 33, 81, 81, 81, 81, 240, + 240, 64, 17, 6, 0, 6, 3, 49, 33, 34, 83, 33, + 34, 17, 49, 20, 240, 240, 32, 20, 6, 240, 240, 17, + 81, 66, 82, 65, 81, 81, 33, 33, 33, 33, 33, 35, + 240, 240, 32, 21, 6, 0, 6, 1, 49, 17, 49, 17, + 49, 17, 49, 17, 49, 17, 34, 34, 17, 240, 240, 16, + 18, 7, 0, 7, 2, 34, 18, 33, 49, 33, 49, 17, + 82, 82, 81, 240, 240, 144, 27, 11, 0, 11, 2, 34, + 34, 33, 34, 33, 49, 17, 17, 17, 65, 17, 17, 17, + 82, 19, 81, 49, 97, 49, 0, 7, 48, 19, 8, 0, + 8, 3, 34, 49, 33, 67, 97, 97, 17, 65, 34, 34, + 50, 240, 240, 176, 21, 8, 0, 8, 18, 34, 34, 33, + 65, 33, 65, 33, 82, 98, 97, 113, 113, 67, 81, 17, + 208, 18, 7, 0, 7, 21, 33, 33, 82, 66, 81, 33, + 34, 33, 18, 34, 240, 240, 96, 19, 4, 240, 49, 33, + 49, 50, 49, 49, 49, 18, 50, 49, 49, 34, 33, 49, + 65, 80, 18, 2, 129, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 48, 19, 4, 240, 17, + 65, 49, 34, 33, 49, 49, 66, 18, 33, 49, 50, 49, + 49, 33, 112, 11, 8, 0, 10, 19, 33, 17, 35, 0, + 8, 32, 4, 6, 0, 15, 13, 3, 240, 146, 18, 113, + 33, 34, 18, 18, 18, 18, 64, 28, 7, 240, 240, 161, + 97, 81, 68, 33, 19, 17, 33, 17, 17, 33, 49, 17, + 65, 17, 33, 34, 17, 49, 17, 49, 97, 97, 208, 22, + 9, 240, 240, 163, 81, 49, 50, 33, 66, 113, 102, 81, + 129, 113, 132, 18, 17, 51, 0, 5, 112, 21, 7, 0, + 7, 1, 18, 17, 18, 33, 33, 65, 17, 65, 33, 33, + 33, 18, 17, 240, 240, 208, 22, 8, 240, 240, 34, 50, + 33, 49, 50, 17, 81, 17, 55, 65, 113, 71, 65, 113, + 113, 240, 240, 224, 15, 2, 129, 17, 17, 17, 17, 17, + 113, 17, 17, 17, 17, 17, 48, 27, 6, 240, 178, 49, + 17, 49, 82, 66, 49, 33, 33, 34, 17, 49, 18, 33, + 33, 33, 50, 81, 49, 17, 49, 17, 65, 144, 8, 6, + 240, 241, 49, 0, 10, 80, 37, 13, 0, 6, 118, 97, + 97, 65, 37, 17, 33, 33, 65, 33, 17, 33, 65, 33, + 17, 33, 113, 17, 33, 113, 17, 33, 49, 49, 33, 35, + 49, 65, 97, 102, 0, 8, 80, 13, 5, 240, 84, 17, + 33, 35, 17, 33, 34, 0, 7, 16, 17, 6, 0, 6, + 113, 65, 33, 33, 17, 49, 17, 65, 17, 97, 240, 240, + 16, 10, 9, 0, 10, 24, 129, 129, 129, 0, 8, 8, + 6, 0, 8, 37, 0, 6, 16, 40, 13, 0, 6, 118, + 97, 97, 65, 21, 33, 33, 49, 49, 33, 17, 49, 49, + 33, 17, 52, 49, 17, 49, 33, 49, 17, 49, 33, 17, + 17, 33, 20, 17, 17, 65, 97, 102, 0, 8, 80, 7, + 6, 240, 245, 0, 10, 80, 16, 7, 240, 228, 33, 65, + 17, 65, 17, 65, 18, 34, 50, 0, 9, 16, 16, 10, + 0, 8, 1, 145, 145, 145, 89, 81, 145, 145, 249, 240, + 240, 176, 14, 5, 240, 98, 33, 33, 18, 17, 49, 49, + 52, 0, 6, 48, 16, 5, 240, 84, 17, 33, 34, 81, + 17, 33, 17, 33, 34, 0, 5, 112, 9, 4, 240, 49, + 33, 33, 0, 6, 112, 23, 10, 0, 11, 65, 50, 65, + 49, 81, 49, 66, 34, 66, 34, 17, 36, 18, 49, 129, + 145, 145, 240, 64, 32, 7, 240, 229, 19, 17, 35, 17, + 35, 17, 35, 17, 50, 17, 65, 17, 65, 17, 65, 17, + 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, 240, 16, + 7, 3, 240, 194, 18, 240, 208, 8, 4, 0, 8, 18, + 49, 18, 96, 12, 4, 240, 33, 49, 49, 49, 49, 35, + 240, 240, 176, 14, 5, 240, 98, 33, 33, 17, 33, 17, + 33, 34, 0, 7, 16, 17, 6, 0, 6, 97, 17, 49, + 33, 49, 33, 33, 17, 33, 17, 240, 240, 144, 33, 12, + 0, 6, 17, 97, 65, 81, 81, 81, 81, 65, 97, 49, + 49, 35, 17, 65, 97, 50, 81, 49, 17, 65, 49, 33, + 65, 53, 33, 113, 0, 7, 96, 31, 11, 240, 240, 241, + 161, 81, 65, 65, 81, 49, 97, 49, 18, 35, 17, 17, + 33, 81, 18, 17, 65, 81, 49, 81, 65, 65, 65, 68, + 0, 7, 34, 12, 0, 6, 4, 65, 49, 33, 49, 82, + 65, 113, 33, 81, 33, 17, 114, 33, 49, 97, 50, 81, + 49, 17, 81, 33, 33, 65, 68, 49, 97, 0, 7, 96, + 18, 6, 0, 6, 50, 66, 65, 81, 66, 50, 49, 81, + 81, 49, 17, 49, 36, 112, 25, 11, 226, 177, 240, 97, + 161, 146, 129, 18, 113, 33, 113, 33, 117, 81, 65, 81, + 65, 65, 82, 36, 51, 0, 7, 26, 11, 240, 34, 129, + 240, 97, 161, 147, 129, 17, 113, 33, 113, 34, 101, 81, + 65, 81, 66, 65, 81, 36, 51, 0, 7, 27, 11, 81, + 146, 129, 33, 240, 81, 146, 146, 129, 18, 113, 33, 113, + 33, 117, 81, 65, 81, 65, 65, 82, 36, 51, 0, 7, + 26, 11, 226, 129, 35, 240, 65, 146, 146, 129, 18, 113, + 33, 113, 33, 117, 81, 65, 81, 65, 65, 82, 36, 51, + 0, 7, 25, 11, 225, 49, 240, 241, 146, 146, 129, 18, + 113, 33, 113, 33, 117, 81, 65, 81, 65, 65, 82, 36, + 51, 0, 7, 27, 10, 66, 113, 33, 114, 240, 210, 130, + 113, 17, 113, 18, 81, 34, 85, 81, 50, 49, 66, 49, + 81, 36, 35, 0, 6, 48, 37, 17, 0, 9, 42, 130, + 82, 113, 17, 97, 97, 33, 49, 33, 97, 33, 49, 137, + 113, 65, 49, 113, 65, 49, 33, 49, 81, 97, 34, 81, + 82, 19, 66, 52, 0, 10, 96, 27, 10, 240, 240, 212, + 17, 34, 66, 33, 97, 18, 97, 18, 130, 130, 130, 97, + 33, 97, 34, 65, 84, 113, 146, 145, 114, 240, 29, 10, + 194, 161, 249, 33, 82, 33, 97, 33, 49, 33, 33, 49, + 85, 81, 49, 81, 49, 33, 33, 97, 33, 82, 18, 52, + 0, 6, 48, 30, 10, 226, 113, 240, 25, 33, 82, 33, + 97, 33, 49, 33, 33, 49, 85, 81, 49, 81, 49, 33, + 33, 97, 33, 82, 18, 52, 0, 6, 48, 30, 10, 210, + 98, 34, 217, 33, 82, 33, 97, 33, 49, 33, 33, 49, + 85, 81, 49, 81, 49, 33, 33, 97, 33, 82, 18, 52, + 0, 6, 48, 30, 10, 177, 49, 240, 153, 33, 82, 33, + 97, 33, 49, 33, 33, 49, 85, 81, 49, 81, 49, 33, + 33, 97, 33, 82, 18, 52, 0, 6, 48, 17, 4, 65, + 65, 99, 33, 49, 49, 49, 49, 49, 49, 49, 49, 35, + 240, 96, 17, 5, 114, 33, 131, 49, 65, 65, 65, 65, + 65, 65, 65, 65, 51, 240, 192, 20, 6, 33, 67, 33, + 49, 131, 65, 81, 81, 81, 81, 81, 81, 81, 81, 67, + 240, 240, 32, 18, 6, 97, 49, 227, 65, 81, 81, 81, + 81, 81, 81, 81, 81, 67, 240, 240, 32, 27, 12, 0, + 6, 23, 97, 82, 65, 82, 65, 98, 49, 98, 21, 66, + 49, 98, 49, 98, 49, 82, 65, 82, 51, 34, 0, 8, + 34, 11, 214, 240, 163, 67, 34, 81, 51, 65, 49, 18, + 49, 49, 33, 49, 49, 49, 33, 49, 50, 17, 49, 65, + 17, 49, 82, 49, 82, 35, 81, 0, 7, 16, 29, 11, + 49, 162, 177, 240, 68, 82, 65, 65, 97, 34, 98, 18, + 98, 18, 98, 18, 98, 18, 98, 33, 97, 50, 65, 100, + 0, 7, 48, 29, 11, 97, 146, 129, 240, 84, 82, 65, + 65, 97, 34, 98, 18, 98, 18, 98, 18, 98, 18, 98, + 33, 97, 50, 65, 100, 0, 7, 48, 30, 11, 66, 146, + 129, 33, 240, 52, 82, 65, 65, 97, 34, 98, 18, 98, + 18, 98, 18, 98, 18, 98, 33, 97, 50, 65, 100, 0, + 7, 48, 27, 11, 213, 240, 228, 82, 65, 65, 97, 34, + 98, 18, 98, 18, 98, 18, 98, 18, 98, 33, 97, 50, + 65, 100, 0, 7, 48, 28, 11, 225, 49, 240, 212, 82, + 65, 65, 97, 34, 98, 18, 98, 18, 98, 18, 98, 18, + 98, 33, 97, 50, 65, 100, 0, 7, 48, 18, 8, 0, + 8, 1, 81, 33, 49, 65, 17, 97, 97, 17, 50, 50, + 0, 6, 16, 32, 11, 0, 5, 116, 33, 34, 66, 49, + 97, 34, 68, 18, 49, 34, 18, 33, 50, 18, 17, 66, + 19, 82, 33, 82, 49, 82, 33, 21, 0, 7, 48, 30, + 11, 49, 162, 177, 240, 19, 67, 33, 97, 49, 97, 49, + 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, + 82, 69, 0, 7, 48, 30, 11, 97, 146, 129, 240, 35, + 67, 33, 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, + 97, 49, 97, 49, 97, 49, 82, 69, 0, 7, 48, 30, + 11, 65, 147, 113, 50, 227, 67, 33, 97, 49, 97, 49, + 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, + 82, 69, 0, 7, 48, 29, 11, 210, 33, 240, 179, 67, + 33, 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, + 49, 97, 49, 97, 49, 82, 69, 0, 7, 48, 25, 12, + 240, 34, 145, 240, 67, 53, 34, 65, 97, 65, 98, 33, + 129, 17, 161, 177, 177, 177, 177, 163, 0, 8, 32, 32, + 11, 240, 240, 227, 50, 81, 21, 66, 51, 49, 82, 49, + 82, 49, 82, 49, 82, 49, 81, 65, 66, 65, 50, 81, + 18, 114, 145, 161, 145, 240, 80, 29, 7, 240, 227, 49, + 49, 33, 49, 33, 33, 49, 33, 49, 49, 33, 65, 17, + 65, 17, 65, 17, 17, 33, 17, 17, 17, 240, 240, 112, + 23, 8, 240, 240, 49, 114, 240, 115, 66, 33, 50, 33, + 83, 50, 33, 17, 17, 49, 17, 23, 240, 240, 176, 23, + 8, 240, 240, 97, 97, 97, 227, 66, 33, 65, 33, 68, + 49, 49, 17, 17, 49, 17, 23, 240, 240, 176, 25, 8, + 240, 240, 65, 97, 17, 65, 49, 195, 66, 33, 65, 33, + 68, 49, 49, 17, 17, 49, 17, 23, 240, 240, 176, 23, + 8, 240, 240, 178, 81, 34, 195, 66, 33, 65, 33, 68, + 49, 49, 17, 17, 49, 17, 23, 240, 240, 176, 23, 8, + 240, 240, 177, 33, 240, 83, 81, 33, 65, 33, 68, 49, + 49, 17, 17, 49, 17, 23, 240, 240, 176, 24, 8, 240, + 240, 52, 65, 33, 82, 211, 66, 33, 65, 33, 68, 49, + 49, 17, 17, 49, 17, 23, 240, 240, 176, 24, 11, 0, + 11, 19, 20, 33, 49, 65, 18, 33, 65, 56, 18, 33, + 97, 49, 65, 20, 18, 17, 0, 7, 16, 20, 7, 0, + 7, 35, 49, 49, 17, 65, 17, 97, 97, 65, 34, 17, + 81, 98, 97, 66, 160, 20, 7, 240, 225, 113, 113, 180, + 33, 49, 33, 50, 22, 17, 65, 17, 65, 36, 240, 240, + 112, 20, 7, 240, 240, 34, 66, 65, 196, 33, 49, 33, + 50, 22, 17, 97, 65, 36, 240, 240, 112, 22, 7, 240, + 242, 81, 17, 33, 65, 148, 33, 49, 33, 50, 22, 17, + 65, 17, 65, 36, 240, 240, 112, 19, 6, 240, 240, 17, + 33, 227, 33, 49, 17, 49, 21, 17, 81, 49, 35, 240, + 240, 32, 15, 4, 240, 17, 65, 65, 113, 49, 49, 49, + 49, 49, 49, 240, 96, 15, 5, 240, 114, 34, 33, 161, + 65, 65, 65, 65, 65, 65, 240, 208, 15, 4, 240, 49, + 34, 17, 145, 49, 49, 49, 49, 49, 49, 240, 96, 14, + 5, 240, 161, 33, 194, 65, 65, 65, 65, 65, 65, 240, + 192, 27, 9, 240, 240, 114, 65, 54, 17, 34, 67, 18, + 97, 18, 65, 49, 49, 81, 33, 81, 33, 81, 33, 65, + 66, 17, 0, 6, 25, 8, 240, 240, 194, 33, 17, 50, + 162, 19, 50, 49, 33, 65, 33, 65, 33, 65, 33, 65, + 33, 65, 240, 240, 176, 21, 7, 240, 225, 113, 113, 180, + 33, 49, 33, 65, 17, 65, 17, 65, 17, 65, 36, 240, + 240, 112, 22, 7, 240, 240, 33, 81, 81, 196, 33, 49, + 33, 65, 17, 65, 17, 65, 17, 65, 36, 240, 240, 112, + 21, 7, 240, 242, 82, 49, 228, 33, 49, 33, 65, 17, + 65, 17, 65, 17, 65, 36, 240, 240, 112, 23, 7, 240, + 240, 98, 33, 17, 34, 164, 33, 49, 33, 65, 17, 65, + 17, 65, 17, 65, 36, 240, 240, 112, 22, 7, 240, 240, + 97, 33, 240, 36, 33, 49, 33, 65, 17, 65, 17, 65, + 17, 65, 36, 240, 240, 112, 12, 9, 0, 9, 50, 114, + 216, 210, 114, 0, 6, 16, 20, 7, 0, 7, 21, 17, + 65, 17, 35, 17, 17, 33, 18, 49, 17, 65, 21, 240, + 240, 112, 23, 6, 240, 145, 97, 97, 145, 49, 17, 49, + 17, 49, 17, 49, 17, 49, 17, 34, 34, 17, 240, 240, + 16, 23, 6, 240, 193, 65, 65, 161, 49, 17, 49, 17, + 49, 17, 49, 17, 49, 17, 34, 34, 17, 240, 240, 16, + 25, 7, 240, 240, 17, 81, 17, 33, 225, 49, 33, 49, + 33, 49, 33, 49, 33, 49, 33, 34, 50, 17, 240, 240, + 96, 22, 6, 240, 241, 49, 209, 49, 17, 49, 17, 49, + 17, 49, 17, 49, 17, 34, 34, 17, 240, 240, 16, 24, + 8, 240, 240, 113, 97, 97, 210, 34, 34, 33, 65, 33, + 65, 33, 82, 98, 97, 113, 113, 67, 81, 17, 208, 26, + 7, 240, 240, 82, 97, 97, 97, 18, 50, 33, 33, 49, + 33, 49, 33, 49, 33, 33, 49, 17, 66, 81, 97, 81, + 208, 24, 8, 240, 240, 177, 49, 240, 50, 65, 33, 49, + 50, 33, 65, 17, 83, 98, 97, 113, 97, 81, 17, 82, + 224, +}; + +//***************************************************************************** +// +// The glyph offset table for the 16 point Theanomodern font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanomodern16[] = +{ + 0, 4, 17, 32, 57, 86, 122, 154, + 163, 182, 201, 221, 236, 246, 254, 262, + 280, 307, 323, 345, 368, 390, 413, 439, + 460, 486, 512, 521, 533, 548, 557, 572, + 590, 633, 657, 684, 709, 737, 766, 791, + 817, 844, 860, 881, 908, 931, 973, 1007, + 1034, 1056, 1089, 1117, 1140, 1166, 1194, 1219, + 1261, 1288, 1311, 1336, 1354, 1373, 1391, 1409, + 1416, 1425, 1445, 1468, 1486, 1511, 1529, 1547, + 1570, 1594, 1607, 1625, 1648, 1662, 1689, 1710, + 1729, 1752, 1774, 1790, 1807, 1827, 1848, 1866, + 1893, 1912, 1933, 1951, 1970, 1988, 2007, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2018, 2022, 2035, 2063, 2085, 2106, 2128, 2143, + 2170, 2178, 2215, 2228, 2245, 2255, 2263, 2303, + 2310, 2326, 2342, 2356, 2372, 2381, 2404, 2436, + 2443, 2451, 2463, 2477, 2494, 2527, 2558, 2592, + 2610, 2635, 2661, 2688, 2714, 2739, 2766, 2803, + 2830, 2859, 2889, 2919, 2949, 2966, 2983, 3003, + 3021, 3048, 3082, 3111, 3140, 3170, 3197, 3225, + 3243, 3275, 3305, 3335, 3365, 3394, 3419, 3451, + 3480, 3503, 3526, 3551, 3574, 3597, 3621, 3645, + 3665, 3685, 3705, 3727, 3746, 3761, 3776, 3791, + 3805, 3832, 3857, 3878, 3900, 3921, 3944, 3966, + 3978, 3998, 4021, 4044, 4069, 4091, 4115, 4141, +}; + +//***************************************************************************** +// +// The font definition for the 16 point Theanomodern font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanomodern16 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 15, + + // + // The height of the font. + // + 20, + + // + // The baseline of the font. + // + 15, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanomodern16, + + // + // A pointer to the actual font data + // + g_pui8Theanomodern16Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanomodern18.c b/third_party/fonts/ofl/fonts/fonttheanomodern18.c new file mode 100644 index 0000000..71d12a0 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanomodern18.c @@ -0,0 +1,615 @@ +//***************************************************************************** +// +// fonttheanomodern18.c - Font definition for the 18pt Theanomodern font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanomodern +// Size: 18 point +// Bold: no +// Italic: no +// Memory usage: 4952 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 18 point Theanomodern font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanomodern18Data[4751] = +{ + 5, 7, 0, 19, 32, 15, 3, 194, 18, 18, 18, 18, + 18, 17, 33, 33, 130, 18, 240, 16, 16, 6, 240, 146, + 18, 18, 18, 18, 18, 18, 18, 17, 49, 0, 9, 112, + 30, 10, 240, 240, 209, 49, 81, 33, 81, 49, 81, 49, + 57, 49, 49, 81, 33, 81, 49, 73, 33, 49, 81, 33, + 97, 33, 145, 0, 6, 112, 42, 9, 240, 241, 17, 85, + 49, 17, 17, 17, 18, 17, 19, 18, 17, 19, 20, 17, + 69, 85, 81, 19, 65, 17, 17, 18, 17, 17, 17, 17, + 33, 17, 17, 17, 33, 18, 54, 81, 17, 240, 240, 144, + 43, 13, 0, 6, 83, 81, 49, 49, 49, 65, 49, 49, + 65, 49, 33, 81, 49, 33, 99, 33, 177, 49, 129, 18, + 17, 97, 33, 49, 81, 33, 49, 65, 49, 49, 65, 49, + 49, 49, 81, 17, 0, 8, 48, 37, 13, 0, 7, 2, + 161, 33, 145, 33, 145, 33, 147, 162, 36, 65, 18, 33, + 81, 49, 33, 66, 50, 17, 66, 66, 49, 18, 66, 49, + 18, 67, 17, 53, 35, 0, 8, 48, 10, 3, 194, 18, + 18, 18, 17, 240, 240, 176, 21, 7, 240, 240, 130, 66, + 81, 82, 81, 82, 82, 82, 82, 82, 82, 97, 98, 97, + 113, 113, 113, 22, 7, 240, 209, 114, 97, 113, 98, 97, + 98, 82, 82, 82, 82, 82, 81, 82, 81, 81, 81, 81, + 96, 23, 8, 240, 240, 82, 49, 34, 17, 18, 17, 18, + 51, 65, 17, 17, 33, 33, 33, 66, 98, 0, 10, 48, + 16, 10, 0, 10, 65, 145, 145, 145, 89, 81, 145, 145, + 145, 0, 6, 112, 11, 4, 0, 7, 66, 35, 49, 49, + 33, 33, 112, 8, 7, 0, 11, 54, 0, 7, 16, 8, + 3, 240, 240, 242, 18, 240, 16, 20, 5, 240, 209, 65, + 65, 65, 49, 65, 65, 65, 49, 65, 65, 65, 49, 65, + 65, 65, 144, 31, 10, 240, 240, 211, 97, 49, 66, 50, + 49, 81, 34, 82, 18, 82, 18, 82, 18, 82, 18, 82, + 33, 81, 50, 50, 65, 49, 99, 0, 6, 96, 20, 7, + 240, 240, 17, 52, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 54, 240, 240, 96, 26, 9, 240, 240, 132, 50, + 50, 33, 82, 19, 50, 34, 50, 113, 114, 98, 98, 97, + 65, 33, 81, 39, 24, 0, 5, 96, 27, 9, 240, 240, + 132, 50, 66, 17, 82, 18, 66, 33, 50, 82, 97, 34, + 130, 114, 18, 66, 17, 82, 17, 66, 53, 0, 6, 25, + 10, 0, 5, 97, 130, 130, 115, 97, 18, 97, 18, 81, + 34, 65, 50, 65, 50, 57, 98, 130, 102, 0, 6, 48, + 23, 9, 240, 240, 118, 53, 65, 129, 129, 133, 65, 50, + 130, 114, 19, 50, 19, 50, 17, 66, 53, 0, 6, 28, + 9, 240, 240, 147, 81, 49, 50, 34, 49, 114, 114, 19, + 51, 49, 34, 66, 18, 66, 18, 66, 33, 66, 34, 34, + 68, 0, 6, 23, 9, 240, 65, 113, 151, 23, 33, 81, + 33, 65, 129, 113, 129, 113, 129, 114, 114, 114, 114, 0, + 6, 32, 29, 9, 240, 240, 132, 65, 65, 33, 97, 17, + 97, 18, 81, 35, 33, 69, 49, 51, 17, 82, 17, 97, + 17, 97, 33, 65, 68, 0, 6, 29, 9, 240, 240, 132, + 66, 34, 34, 65, 34, 66, 18, 66, 18, 66, 34, 35, + 51, 18, 114, 113, 50, 34, 49, 49, 83, 0, 6, 16, + 9, 3, 240, 194, 18, 210, 18, 240, 16, 14, 4, 240, + 240, 99, 19, 240, 34, 35, 49, 49, 33, 33, 112, 16, + 10, 0, 10, 114, 98, 98, 98, 113, 162, 162, 162, 162, + 0, 6, 48, 10, 10, 0, 12, 73, 240, 105, 0, 10, + 16, 16, 10, 0, 10, 2, 162, 162, 162, 161, 114, 98, + 98, 98, 0, 7, 32, 20, 7, 240, 227, 49, 49, 34, + 49, 97, 97, 82, 36, 49, 97, 97, 210, 82, 240, 240, + 144, 48, 15, 0, 12, 4, 131, 66, 82, 129, 50, 50, + 18, 17, 50, 18, 34, 49, 18, 34, 34, 49, 18, 18, + 50, 49, 18, 18, 49, 65, 18, 18, 49, 49, 34, 18, + 34, 49, 34, 35, 35, 66, 226, 113, 98, 81, 149, 240, + 80, 29, 14, 0, 7, 113, 194, 194, 177, 17, 177, 18, + 161, 18, 145, 49, 145, 50, 134, 113, 81, 113, 82, 97, + 82, 54, 22, 0, 8, 112, 30, 12, 0, 6, 9, 82, + 66, 66, 82, 50, 82, 50, 82, 50, 66, 70, 98, 66, + 66, 82, 50, 82, 50, 82, 50, 66, 41, 0, 7, 112, + 30, 11, 0, 5, 116, 33, 49, 65, 17, 34, 82, 33, + 113, 18, 113, 18, 146, 146, 146, 113, 33, 113, 34, 81, + 65, 81, 85, 0, 7, 32, 31, 13, 0, 6, 73, 98, + 81, 82, 82, 66, 97, 66, 98, 50, 98, 50, 98, 50, + 98, 50, 98, 50, 97, 66, 82, 66, 81, 57, 0, 8, + 80, 33, 12, 0, 6, 11, 50, 82, 50, 81, 66, 33, + 49, 50, 33, 49, 50, 33, 117, 114, 33, 114, 33, 49, + 50, 97, 50, 97, 50, 82, 27, 0, 7, 80, 29, 12, + 0, 6, 11, 50, 82, 50, 81, 66, 33, 49, 50, 33, + 49, 50, 33, 117, 114, 33, 114, 33, 114, 162, 162, 133, + 0, 8, 48, 33, 12, 0, 6, 52, 113, 65, 17, 50, + 82, 49, 113, 34, 113, 34, 162, 54, 18, 98, 34, 98, + 49, 98, 50, 82, 65, 65, 17, 84, 33, 0, 7, 96, + 32, 14, 0, 7, 6, 22, 50, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 89, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 54, 22, 0, 8, 112, 19, 7, 240, 214, + 50, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 54, + 240, 240, 96, 23, 10, 240, 240, 214, 98, 130, 130, 130, + 130, 130, 130, 130, 51, 34, 51, 34, 49, 50, 84, 0, + 6, 112, 33, 14, 0, 7, 6, 37, 50, 82, 82, 81, + 98, 65, 114, 49, 130, 18, 147, 18, 130, 34, 130, 50, + 114, 66, 98, 82, 82, 82, 54, 37, 0, 8, 112, 25, + 12, 0, 6, 6, 130, 162, 162, 162, 162, 162, 162, 97, + 50, 97, 50, 97, 50, 82, 50, 82, 27, 0, 7, 80, + 50, 17, 0, 8, 68, 117, 51, 99, 83, 81, 18, 81, + 17, 81, 18, 81, 18, 65, 18, 81, 18, 49, 34, 81, + 34, 33, 34, 81, 34, 33, 34, 81, 49, 17, 50, 81, + 51, 50, 81, 50, 66, 81, 65, 66, 53, 33, 38, 0, + 10, 96, 39, 14, 0, 7, 4, 69, 50, 97, 83, 81, + 81, 18, 65, 81, 18, 65, 81, 34, 49, 81, 50, 33, + 81, 65, 33, 81, 66, 17, 81, 83, 81, 98, 81, 113, + 53, 81, 0, 9, 16, 30, 12, 0, 6, 53, 97, 81, + 66, 82, 49, 113, 34, 114, 18, 114, 18, 114, 18, 114, + 18, 114, 33, 113, 50, 82, 65, 81, 101, 0, 8, 25, + 12, 0, 6, 9, 82, 66, 66, 82, 50, 82, 50, 82, + 50, 66, 71, 82, 162, 162, 162, 162, 134, 0, 8, 32, + 37, 12, 0, 6, 53, 97, 81, 66, 82, 49, 113, 34, + 114, 18, 114, 18, 114, 18, 114, 18, 114, 33, 113, 50, + 33, 34, 67, 17, 17, 116, 177, 33, 129, 33, 131, 240, + 176, 32, 13, 0, 6, 73, 98, 66, 82, 82, 66, 82, + 66, 82, 66, 66, 86, 114, 65, 98, 66, 82, 66, 82, + 66, 82, 81, 17, 22, 51, 0, 8, 32, 29, 11, 0, + 5, 116, 82, 66, 49, 97, 49, 97, 50, 164, 148, 49, + 83, 34, 98, 18, 113, 19, 97, 19, 81, 33, 37, 0, + 7, 32, 27, 12, 0, 6, 11, 18, 34, 50, 17, 50, + 50, 17, 50, 65, 17, 50, 65, 82, 162, 162, 162, 162, + 162, 162, 134, 0, 8, 32, 14, 0, 7, 6, 37, 50, + 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, + 97, 82, 97, 82, 97, 82, 97, 97, 81, 133, 0, 9, + 48, 29, 14, 0, 7, 6, 22, 50, 97, 97, 81, 114, + 65, 114, 65, 129, 49, 146, 33, 146, 17, 177, 17, 179, + 178, 209, 209, 0, 9, 80, 46, 20, 0, 10, 6, 28, + 50, 82, 81, 97, 82, 65, 114, 49, 17, 65, 114, 49, + 18, 49, 129, 49, 18, 33, 145, 33, 49, 33, 146, 17, + 49, 33, 146, 17, 51, 178, 67, 178, 82, 178, 81, 240, + 65, 0, 13, 48, 30, 15, 0, 7, 86, 22, 66, 81, + 130, 49, 146, 33, 178, 17, 194, 210, 211, 177, 34, 145, + 50, 129, 82, 113, 83, 54, 38, 0, 9, 64, 25, 15, + 0, 7, 70, 38, 66, 82, 98, 81, 130, 49, 146, 49, + 162, 17, 194, 210, 210, 210, 210, 210, 182, 0, 10, 29, + 12, 0, 6, 26, 34, 82, 49, 82, 65, 82, 65, 66, + 146, 146, 162, 65, 66, 81, 50, 97, 35, 97, 34, 98, + 27, 0, 7, 80, 21, 6, 240, 148, 34, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 69, 20, 5, 240, 81, 65, 65, 65, 81, 65, 65, 65, + 81, 65, 65, 65, 81, 65, 65, 65, 176, 21, 6, 240, + 164, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 21, 18, 10, 240, 240, 210, 130, + 113, 33, 81, 65, 65, 65, 49, 97, 161, 0, 13, 112, + 7, 10, 0, 23, 105, 240, 96, 9, 4, 240, 17, 65, + 65, 0, 7, 80, 23, 9, 0, 10, 36, 66, 34, 50, + 34, 99, 66, 18, 17, 18, 34, 17, 18, 34, 17, 23, + 0, 5, 112, 28, 10, 240, 240, 164, 130, 130, 130, 130, + 130, 19, 67, 33, 66, 50, 50, 50, 50, 50, 50, 50, + 50, 49, 65, 20, 0, 6, 64, 18, 8, 0, 9, 36, + 50, 34, 18, 50, 18, 98, 98, 113, 65, 52, 240, 240, + 192, 28, 9, 240, 240, 164, 114, 114, 114, 114, 51, 18, + 33, 51, 18, 66, 18, 66, 18, 66, 18, 66, 33, 51, + 51, 18, 0, 5, 96, 19, 8, 0, 9, 36, 49, 49, + 34, 50, 23, 18, 98, 65, 33, 65, 52, 240, 240, 192, + 21, 7, 240, 243, 50, 18, 34, 18, 34, 82, 67, 82, + 82, 82, 82, 82, 82, 82, 240, 240, 144, 26, 10, 0, + 11, 68, 33, 33, 67, 18, 66, 34, 66, 49, 50, 69, + 66, 129, 167, 49, 82, 17, 113, 17, 98, 38, 48, 28, + 10, 240, 240, 164, 130, 130, 130, 130, 130, 19, 67, 34, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 0, 6, 48, 15, 4, 240, 34, 34, 211, 34, 34, 34, + 34, 34, 34, 34, 240, 96, 22, 6, 240, 194, 66, 240, + 99, 66, 66, 66, 66, 66, 66, 66, 66, 66, 18, 18, + 18, 18, 35, 32, 27, 12, 0, 6, 4, 162, 162, 162, + 162, 162, 51, 66, 49, 98, 33, 114, 17, 133, 114, 34, + 98, 50, 82, 52, 0, 7, 80, 18, 5, 240, 84, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 240, + 176, 31, 15, 0, 16, 116, 19, 35, 67, 35, 34, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 0, 9, 64, 23, 10, 0, 11, + 36, 19, 67, 34, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 0, 6, 48, 20, 9, 0, 10, 52, + 65, 65, 34, 66, 18, 66, 18, 66, 18, 66, 33, 65, + 68, 0, 6, 25, 10, 0, 11, 40, 66, 49, 66, 50, + 50, 50, 50, 50, 50, 50, 51, 33, 66, 19, 66, 130, + 130, 130, 101, 80, 26, 11, 0, 12, 83, 33, 65, 49, + 17, 50, 66, 50, 66, 50, 66, 50, 66, 65, 51, 83, + 18, 146, 146, 146, 146, 133, 17, 8, 0, 9, 4, 18, + 53, 50, 17, 66, 98, 98, 98, 98, 240, 240, 224, 18, + 7, 0, 8, 3, 49, 49, 34, 99, 99, 17, 65, 17, + 65, 21, 240, 240, 112, 23, 7, 240, 240, 97, 97, 97, + 82, 99, 65, 97, 97, 49, 33, 49, 33, 49, 33, 49, + 51, 240, 240, 112, 23, 10, 0, 11, 36, 35, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 35, 67, 18, + 0, 6, 48, 20, 9, 0, 10, 19, 50, 49, 49, 65, + 49, 66, 17, 97, 17, 98, 129, 129, 0, 6, 16, 28, + 13, 0, 14, 83, 19, 35, 34, 49, 49, 65, 34, 33, + 81, 17, 18, 17, 83, 33, 17, 98, 34, 113, 50, 113, + 0, 9, 32, 21, 9, 0, 10, 20, 19, 49, 49, 81, + 17, 98, 115, 81, 33, 81, 34, 35, 35, 0, 5, 96, + 26, 10, 0, 11, 35, 51, 49, 49, 81, 49, 82, 17, + 113, 17, 113, 17, 114, 145, 145, 129, 98, 17, 98, 17, + 99, 112, 19, 8, 0, 9, 22, 33, 49, 98, 82, 82, + 97, 49, 34, 49, 18, 35, 240, 240, 176, 21, 4, 240, + 49, 33, 49, 49, 65, 49, 49, 33, 33, 65, 65, 49, + 49, 33, 49, 49, 65, 80, 20, 2, 129, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 48, 21, 4, 240, 17, 65, 49, 49, 33, 49, 49, + 49, 66, 18, 33, 49, 49, 65, 49, 49, 33, 112, 11, + 9, 0, 13, 83, 49, 17, 51, 0, 9, 32, 5, 7, + 0, 19, 32, 14, 3, 240, 194, 18, 113, 33, 33, 33, + 34, 18, 18, 18, 18, 28, 8, 0, 5, 97, 97, 113, + 113, 68, 50, 34, 18, 35, 18, 17, 66, 17, 66, 17, + 82, 49, 52, 65, 97, 113, 97, 113, 112, 24, 9, 240, + 240, 164, 66, 33, 65, 49, 50, 114, 114, 86, 81, 129, + 113, 131, 81, 52, 17, 66, 0, 5, 112, 23, 8, 0, + 9, 1, 19, 17, 33, 49, 33, 81, 17, 81, 17, 81, + 33, 49, 33, 19, 17, 0, 6, 16, 26, 11, 240, 240, + 227, 67, 34, 81, 65, 65, 82, 49, 97, 33, 114, 17, + 88, 98, 104, 98, 146, 146, 146, 0, 7, 64, 17, 2, + 129, 17, 17, 17, 17, 17, 17, 113, 17, 17, 17, 17, + 17, 17, 48, 30, 7, 240, 243, 49, 18, 49, 17, 65, + 113, 83, 49, 34, 33, 50, 17, 65, 18, 49, 34, 33, + 51, 82, 97, 34, 33, 34, 33, 51, 160, 11, 7, 240, + 240, 82, 34, 18, 34, 0, 13, 32, 43, 15, 0, 8, + 6, 114, 98, 66, 50, 50, 49, 34, 34, 33, 33, 34, + 65, 49, 17, 34, 129, 17, 34, 129, 17, 34, 129, 17, + 34, 65, 49, 33, 34, 33, 49, 49, 66, 50, 66, 98, + 118, 0, 10, 15, 6, 240, 147, 49, 33, 66, 34, 17, + 33, 34, 34, 0, 9, 48, 19, 6, 0, 7, 97, 65, + 33, 17, 33, 33, 18, 49, 17, 49, 33, 49, 240, 240, + 48, 11, 10, 0, 12, 73, 145, 145, 145, 0, 10, 16, + 8, 7, 0, 11, 54, 0, 7, 16, 46, 15, 0, 8, + 6, 114, 98, 72, 34, 49, 34, 34, 33, 33, 50, 49, + 49, 17, 50, 34, 49, 17, 52, 81, 17, 50, 33, 65, + 17, 50, 33, 65, 33, 34, 33, 17, 17, 49, 20, 33, + 18, 66, 98, 118, 0, 10, 8, 6, 240, 240, 101, 0, + 11, 48, 19, 8, 240, 240, 67, 65, 49, 33, 81, 17, + 81, 17, 81, 33, 49, 67, 0, 11, 48, 17, 10, 0, + 9, 33, 145, 145, 145, 89, 81, 145, 145, 145, 249, 240, + 240, 176, 15, 6, 240, 163, 33, 49, 18, 33, 65, 65, + 65, 69, 0, 8, 48, 17, 6, 240, 163, 49, 33, 81, + 50, 97, 33, 33, 17, 49, 35, 0, 7, 96, 9, 4, + 240, 49, 33, 33, 0, 7, 112, 26, 11, 0, 14, 17, + 65, 81, 49, 82, 49, 81, 65, 81, 50, 81, 50, 17, + 33, 19, 18, 49, 161, 146, 145, 161, 160, 38, 10, 240, + 240, 199, 35, 33, 52, 33, 52, 33, 52, 33, 67, 33, + 82, 33, 97, 33, 97, 33, 97, 33, 97, 33, 97, 33, + 97, 33, 97, 33, 97, 33, 97, 33, 97, 33, 208, 8, + 3, 240, 240, 50, 18, 240, 208, 9, 4, 0, 8, 81, + 65, 49, 18, 96, 13, 4, 240, 33, 49, 49, 49, 49, + 49, 35, 240, 240, 240, 16, 6, 240, 163, 33, 49, 17, + 49, 17, 49, 18, 17, 65, 0, 9, 48, 18, 7, 0, + 8, 97, 97, 33, 65, 33, 65, 18, 33, 33, 33, 33, + 240, 240, 240, 37, 13, 0, 6, 81, 113, 65, 97, 81, + 97, 81, 81, 97, 65, 113, 65, 49, 35, 33, 65, 97, + 66, 97, 49, 17, 81, 49, 33, 65, 69, 49, 113, 49, + 129, 0, 8, 48, 37, 12, 0, 6, 17, 177, 97, 65, + 81, 81, 81, 81, 65, 97, 49, 34, 35, 33, 17, 33, + 81, 33, 33, 81, 34, 17, 65, 81, 65, 97, 65, 81, + 65, 84, 0, 7, 80, 38, 14, 0, 7, 19, 97, 65, + 33, 65, 129, 65, 98, 65, 145, 33, 113, 33, 33, 97, + 49, 17, 65, 51, 33, 50, 113, 49, 17, 97, 49, 33, + 97, 53, 65, 113, 209, 0, 9, 19, 7, 0, 8, 34, + 82, 209, 97, 97, 52, 34, 81, 97, 97, 50, 33, 49, + 36, 32, 30, 14, 240, 50, 225, 240, 193, 209, 195, 179, + 177, 17, 161, 34, 145, 34, 145, 49, 135, 113, 66, 97, + 82, 97, 98, 54, 22, 0, 8, 112, 30, 13, 240, 82, + 161, 240, 161, 193, 178, 179, 145, 18, 145, 33, 145, 34, + 113, 50, 118, 113, 66, 81, 82, 81, 97, 53, 22, 0, + 8, 32, 32, 14, 240, 82, 177, 34, 240, 161, 194, 194, + 177, 17, 177, 18, 161, 18, 145, 49, 145, 50, 134, 113, + 81, 113, 82, 97, 82, 54, 22, 0, 8, 112, 33, 14, + 240, 51, 49, 97, 51, 240, 161, 194, 194, 177, 17, 177, + 18, 161, 18, 145, 49, 145, 50, 134, 113, 81, 113, 82, + 97, 82, 54, 22, 0, 8, 112, 31, 14, 240, 50, 34, + 0, 6, 66, 194, 177, 17, 177, 18, 161, 18, 145, 34, + 145, 50, 134, 113, 66, 113, 67, 97, 82, 54, 22, 0, + 8, 112, 31, 14, 83, 161, 49, 145, 49, 163, 193, 209, + 195, 179, 179, 161, 34, 145, 34, 129, 50, 135, 113, 66, + 97, 82, 97, 98, 54, 22, 0, 8, 112, 43, 20, 0, + 10, 109, 163, 82, 145, 18, 82, 129, 34, 97, 129, 34, + 33, 49, 113, 50, 33, 170, 161, 66, 33, 145, 82, 33, + 49, 65, 98, 33, 49, 65, 98, 97, 50, 98, 82, 22, + 43, 0, 12, 80, 32, 11, 0, 5, 116, 33, 49, 67, + 34, 82, 33, 113, 18, 113, 18, 146, 146, 146, 113, 18, + 113, 34, 81, 65, 81, 85, 113, 162, 162, 146, 115, 80, + 34, 12, 242, 193, 240, 59, 50, 82, 50, 81, 66, 33, + 49, 50, 33, 49, 50, 33, 117, 114, 33, 114, 33, 49, + 50, 97, 50, 97, 50, 82, 27, 0, 7, 80, 35, 12, + 113, 162, 145, 240, 59, 50, 82, 50, 81, 66, 33, 49, + 50, 33, 49, 50, 33, 117, 114, 33, 114, 33, 49, 50, + 97, 50, 97, 50, 82, 27, 0, 7, 80, 36, 12, 240, + 19, 129, 49, 240, 27, 50, 82, 50, 81, 66, 33, 49, + 50, 33, 49, 50, 33, 117, 114, 33, 114, 33, 49, 50, + 97, 50, 97, 50, 82, 27, 0, 7, 80, 34, 12, 226, + 50, 240, 203, 50, 82, 50, 97, 50, 49, 33, 50, 49, + 33, 50, 34, 102, 98, 49, 98, 49, 33, 50, 97, 50, + 97, 50, 82, 27, 0, 7, 80, 20, 7, 115, 113, 166, + 50, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 54, + 240, 240, 96, 20, 7, 162, 65, 182, 50, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 54, 240, 240, 96, 21, + 7, 146, 50, 34, 134, 50, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 54, 240, 240, 96, 20, 7, 114, 34, + 246, 50, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 54, 240, 240, 96, 31, 13, 0, 6, 73, 98, 81, 82, + 82, 66, 97, 66, 98, 50, 98, 22, 66, 50, 98, 50, + 98, 50, 97, 66, 82, 66, 81, 57, 0, 8, 80, 41, + 14, 240, 38, 240, 240, 52, 69, 50, 97, 83, 81, 81, + 18, 65, 81, 18, 65, 81, 34, 49, 81, 50, 33, 81, + 65, 33, 81, 66, 17, 81, 83, 81, 98, 81, 113, 53, + 81, 0, 9, 16, 32, 12, 49, 193, 193, 240, 101, 97, + 81, 66, 82, 49, 113, 34, 114, 18, 114, 18, 114, 18, + 114, 18, 114, 33, 113, 50, 82, 65, 81, 101, 0, 8, + 32, 12, 98, 161, 161, 240, 101, 97, 81, 66, 82, 49, + 113, 34, 114, 18, 114, 18, 114, 18, 114, 18, 114, 33, + 113, 50, 82, 65, 81, 101, 0, 8, 34, 12, 81, 161, + 17, 129, 49, 240, 69, 97, 81, 66, 82, 49, 113, 34, + 114, 18, 114, 18, 114, 18, 114, 18, 114, 33, 113, 50, + 82, 65, 81, 101, 0, 8, 31, 12, 230, 240, 240, 21, + 97, 81, 66, 82, 49, 113, 34, 114, 18, 114, 18, 114, + 18, 114, 18, 114, 33, 113, 50, 82, 65, 81, 101, 0, + 8, 31, 12, 242, 34, 240, 245, 97, 81, 66, 82, 49, + 113, 34, 114, 18, 114, 18, 114, 18, 114, 18, 114, 33, + 113, 50, 82, 65, 81, 101, 0, 8, 18, 7, 0, 7, + 113, 65, 18, 34, 36, 66, 68, 34, 34, 17, 65, 240, + 240, 208, 37, 12, 0, 6, 53, 33, 49, 82, 50, 97, + 49, 83, 34, 81, 18, 18, 65, 34, 18, 49, 50, 18, + 33, 66, 18, 17, 82, 34, 97, 49, 98, 50, 81, 49, + 37, 0, 8, 34, 14, 81, 210, 225, 240, 86, 37, 50, + 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, + 97, 82, 97, 82, 97, 82, 97, 97, 81, 133, 0, 9, + 48, 34, 14, 129, 194, 177, 240, 102, 37, 50, 97, 82, + 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, + 97, 82, 97, 82, 97, 97, 81, 133, 0, 9, 48, 35, + 14, 97, 195, 161, 50, 240, 54, 37, 50, 97, 82, 97, + 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, + 82, 97, 82, 97, 97, 81, 133, 0, 9, 48, 35, 14, + 240, 50, 34, 240, 240, 38, 37, 50, 97, 82, 97, 82, + 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, 97, 82, + 97, 82, 97, 97, 81, 133, 0, 9, 48, 27, 15, 240, + 114, 193, 240, 134, 38, 66, 82, 98, 81, 130, 49, 146, + 49, 162, 17, 194, 210, 210, 210, 210, 210, 182, 0, 10, + 35, 12, 0, 6, 4, 50, 82, 21, 67, 50, 66, 82, + 50, 82, 50, 82, 50, 82, 50, 82, 50, 81, 66, 66, + 66, 50, 82, 33, 116, 130, 162, 162, 130, 240, 112, 34, + 8, 240, 240, 68, 49, 50, 18, 50, 18, 50, 18, 34, + 34, 18, 50, 34, 34, 50, 18, 50, 18, 50, 18, 17, + 18, 18, 17, 18, 18, 19, 240, 240, 192, 27, 9, 240, + 240, 113, 129, 145, 145, 244, 66, 34, 50, 34, 84, 65, + 34, 17, 18, 34, 17, 18, 34, 17, 23, 0, 5, 112, + 28, 9, 240, 240, 162, 98, 113, 113, 240, 20, 66, 34, + 50, 34, 99, 66, 18, 17, 18, 34, 17, 18, 34, 17, + 23, 0, 5, 112, 29, 9, 240, 240, 129, 130, 97, 33, + 65, 240, 52, 66, 34, 50, 34, 99, 66, 18, 17, 18, + 34, 17, 18, 34, 17, 23, 0, 5, 112, 25, 9, 0, + 6, 115, 130, 228, 66, 34, 50, 34, 99, 66, 18, 17, + 18, 34, 17, 18, 34, 17, 23, 0, 5, 112, 28, 9, + 240, 240, 241, 49, 66, 34, 240, 116, 66, 49, 50, 49, + 99, 66, 33, 17, 18, 49, 17, 18, 49, 17, 39, 0, + 5, 96, 26, 9, 240, 240, 131, 81, 49, 65, 49, 83, + 229, 50, 50, 34, 50, 84, 50, 35, 18, 51, 18, 51, + 39, 0, 5, 96, 27, 13, 0, 14, 100, 35, 50, 50, + 49, 34, 50, 49, 88, 50, 34, 98, 50, 65, 18, 33, + 17, 49, 51, 51, 0, 8, 64, 20, 8, 0, 9, 36, + 50, 34, 18, 50, 18, 98, 98, 113, 65, 52, 81, 114, + 113, 82, 192, 23, 8, 240, 240, 65, 114, 113, 129, 212, + 49, 49, 34, 50, 23, 18, 98, 65, 33, 65, 52, 240, + 240, 192, 23, 8, 240, 240, 113, 98, 97, 97, 228, 49, + 49, 34, 50, 23, 18, 98, 65, 33, 65, 52, 240, 240, + 192, 25, 8, 240, 240, 82, 98, 81, 33, 49, 240, 20, + 49, 49, 34, 50, 23, 18, 98, 65, 33, 65, 52, 240, + 240, 192, 23, 8, 240, 240, 178, 34, 34, 34, 240, 68, + 49, 50, 18, 65, 23, 18, 98, 113, 65, 52, 240, 240, + 192, 17, 5, 240, 82, 65, 81, 81, 115, 50, 50, 50, + 50, 50, 50, 50, 240, 176, 18, 6, 240, 194, 65, 65, + 65, 164, 66, 66, 66, 66, 66, 66, 66, 240, 240, 32, + 19, 6, 240, 177, 65, 17, 33, 49, 212, 66, 66, 66, + 66, 66, 66, 66, 240, 240, 32, 18, 6, 240, 241, 33, + 34, 18, 227, 66, 66, 66, 66, 66, 66, 66, 240, 240, + 32, 30, 10, 240, 240, 194, 65, 65, 35, 82, 70, 66, + 50, 113, 18, 66, 49, 50, 66, 34, 81, 34, 81, 34, + 81, 50, 49, 84, 0, 6, 80, 27, 10, 0, 7, 114, + 49, 33, 51, 196, 19, 67, 34, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 0, 6, 48, 24, 9, + 240, 240, 129, 130, 129, 145, 244, 65, 65, 34, 66, 18, + 66, 18, 66, 18, 66, 33, 65, 68, 0, 6, 25, 9, + 240, 240, 177, 114, 113, 113, 240, 20, 65, 65, 34, 66, + 18, 66, 18, 66, 18, 66, 33, 65, 68, 0, 6, 26, + 9, 240, 240, 146, 114, 97, 33, 65, 65, 212, 65, 65, + 34, 66, 18, 66, 18, 66, 18, 66, 33, 65, 68, 0, + 6, 23, 9, 0, 6, 115, 81, 51, 212, 65, 65, 34, + 66, 18, 66, 18, 66, 18, 66, 33, 65, 68, 0, 6, + 25, 9, 0, 5, 98, 34, 50, 34, 240, 116, 65, 65, + 34, 66, 18, 66, 18, 66, 18, 66, 33, 65, 68, 0, + 6, 13, 9, 0, 10, 66, 114, 216, 240, 114, 114, 0, + 6, 16, 24, 9, 0, 10, 52, 17, 33, 65, 34, 51, + 18, 33, 18, 18, 17, 34, 19, 50, 33, 65, 33, 20, + 0, 6, 27, 9, 240, 240, 129, 130, 129, 240, 131, 35, + 49, 50, 49, 50, 49, 50, 49, 50, 49, 50, 49, 35, + 66, 18, 0, 5, 96, 27, 10, 0, 5, 97, 145, 129, + 129, 244, 35, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 35, 67, 18, 0, 6, 48, 28, 10, 240, 240, + 241, 131, 97, 33, 240, 132, 35, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 35, 67, 18, 0, 6, 48, + 28, 10, 0, 6, 66, 34, 66, 34, 240, 116, 35, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 35, 67, + 18, 0, 6, 48, 31, 10, 240, 240, 242, 129, 129, 129, + 240, 19, 51, 49, 49, 81, 49, 82, 33, 97, 17, 113, + 17, 115, 129, 145, 129, 98, 17, 98, 17, 99, 112, 30, + 9, 0, 5, 98, 99, 114, 114, 114, 19, 51, 34, 34, + 50, 34, 50, 34, 50, 34, 34, 50, 33, 66, 17, 83, + 98, 114, 114, 97, 128, 30, 10, 0, 7, 82, 34, 66, + 34, 211, 51, 34, 49, 81, 49, 81, 49, 97, 17, 113, + 17, 114, 145, 145, 129, 98, 17, 98, 17, 99, 112, +}; + +//***************************************************************************** +// +// The glyph offset table for the 18 point Theanomodern font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanomodern18[] = +{ + 0, 5, 20, 36, 66, 108, 151, 188, + 198, 219, 241, 264, 280, 291, 299, 307, + 327, 358, 378, 404, 431, 456, 479, 507, + 530, 559, 588, 597, 611, 627, 637, 653, + 673, 721, 750, 780, 810, 841, 874, 903, + 936, 968, 987, 1010, 1043, 1068, 1118, 1157, + 1187, 1212, 1249, 1281, 1310, 1337, 1369, 1398, + 1444, 1474, 1499, 1528, 1549, 1569, 1590, 1608, + 1615, 1624, 1647, 1675, 1693, 1721, 1740, 1761, + 1787, 1815, 1830, 1852, 1879, 1897, 1928, 1951, + 1971, 1996, 2022, 2039, 2057, 2080, 2103, 2123, + 2151, 2172, 2198, 2217, 2238, 2258, 2279, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2290, 2295, 2309, 2337, 2361, 2384, 2410, 2427, + 2457, 2468, 2511, 2526, 2545, 2556, 2564, 2610, + 2618, 2637, 2654, 2669, 2686, 2695, 2721, 2759, + 2767, 2776, 2789, 2805, 2823, 2860, 2897, 2935, + 2954, 2984, 3014, 3046, 3079, 3110, 3141, 3184, + 3216, 3250, 3285, 3321, 3355, 3375, 3395, 3416, + 3436, 3467, 3508, 3540, 3572, 3606, 3637, 3668, + 3686, 3723, 3757, 3791, 3826, 3861, 3888, 3923, + 3957, 3984, 4012, 4041, 4066, 4094, 4120, 4147, + 4167, 4190, 4213, 4238, 4261, 4278, 4296, 4315, + 4333, 4363, 4390, 4414, 4439, 4465, 4488, 4513, + 4526, 4550, 4577, 4604, 4632, 4660, 4691, 4721, +}; + +//***************************************************************************** +// +// The font definition for the 18 point Theanomodern font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanomodern18 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 18, + + // + // The height of the font. + // + 22, + + // + // The baseline of the font. + // + 17, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanomodern18, + + // + // A pointer to the actual font data + // + g_pui8Theanomodern18Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanomodern20.c b/third_party/fonts/ofl/fonts/fonttheanomodern20.c new file mode 100644 index 0000000..9f52ee6 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanomodern20.c @@ -0,0 +1,655 @@ +//***************************************************************************** +// +// fonttheanomodern20.c - Font definition for the 20pt Theanomodern font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanomodern +// Size: 20 point +// Bold: no +// Italic: no +// Memory usage: 5424 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 20 point Theanomodern font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanomodern20Data[5223] = +{ + 5, 9, 0, 28, 16, 20, 5, 240, 163, 35, 35, 35, + 35, 49, 65, 65, 65, 65, 65, 65, 51, 35, 240, 240, + 32, 19, 8, 240, 240, 162, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 33, 49, 0, 14, 48, 32, 12, 0, 7, + 113, 177, 49, 113, 49, 113, 49, 74, 65, 49, 113, 49, + 113, 49, 113, 49, 90, 49, 49, 113, 49, 113, 49, 113, + 49, 0, 9, 96, 52, 11, 240, 240, 97, 17, 129, 17, + 117, 81, 17, 17, 17, 50, 17, 17, 18, 34, 17, 17, + 18, 34, 17, 17, 84, 17, 117, 117, 97, 20, 34, 17, + 17, 33, 34, 17, 17, 33, 33, 33, 17, 33, 33, 33, + 17, 17, 70, 113, 17, 0, 7, 64, 41, 16, 0, 10, + 20, 178, 34, 65, 82, 34, 49, 98, 34, 33, 129, 33, + 49, 146, 49, 241, 225, 50, 145, 49, 33, 129, 34, 34, + 97, 50, 34, 97, 50, 34, 81, 81, 34, 180, 0, 12, + 48, 41, 15, 0, 9, 115, 177, 49, 161, 49, 162, 33, + 164, 179, 36, 81, 18, 49, 98, 34, 33, 82, 50, 33, + 82, 66, 17, 33, 34, 82, 49, 34, 82, 49, 50, 67, + 17, 85, 34, 0, 11, 96, 12, 4, 240, 82, 34, 34, + 34, 34, 33, 0, 7, 48, 25, 8, 240, 240, 113, 97, + 98, 82, 97, 98, 97, 98, 98, 98, 98, 98, 98, 98, + 113, 114, 113, 129, 114, 113, 176, 25, 8, 240, 240, 33, + 129, 114, 114, 113, 114, 113, 114, 98, 98, 98, 98, 98, + 98, 82, 98, 97, 97, 98, 97, 224, 24, 11, 0, 7, + 50, 146, 82, 33, 34, 50, 17, 18, 99, 98, 17, 18, + 50, 33, 34, 98, 146, 0, 15, 96, 16, 11, 0, 12, + 113, 161, 161, 161, 105, 97, 161, 161, 161, 161, 0, 9, + 11, 5, 0, 10, 83, 35, 65, 65, 49, 49, 224, 8, + 8, 0, 14, 6, 0, 10, 32, 8, 4, 0, 8, 66, + 34, 240, 176, 24, 7, 240, 240, 145, 97, 97, 81, 97, + 97, 97, 81, 97, 97, 97, 97, 81, 97, 97, 97, 81, + 97, 97, 208, 33, 12, 0, 7, 116, 113, 65, 82, 66, + 65, 97, 50, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 49, 97, 66, 66, 81, 65, 116, 0, 9, 80, + 21, 10, 0, 6, 37, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 88, 0, 7, 96, 27, 10, 0, + 6, 68, 81, 50, 49, 82, 35, 50, 35, 50, 130, 114, + 129, 129, 129, 129, 65, 49, 81, 55, 40, 0, 7, 96, + 29, 11, 0, 7, 36, 82, 50, 65, 82, 50, 66, 65, + 66, 130, 84, 178, 162, 50, 66, 35, 66, 33, 98, 33, + 82, 70, 0, 8, 96, 26, 12, 0, 8, 33, 162, 162, + 147, 129, 18, 113, 34, 113, 34, 97, 50, 81, 66, 90, + 114, 162, 162, 120, 0, 9, 32, 30, 11, 240, 240, 241, + 81, 70, 81, 19, 97, 161, 161, 161, 20, 82, 50, 162, + 146, 50, 66, 35, 66, 33, 97, 49, 82, 69, 0, 8, + 112, 31, 11, 0, 7, 36, 98, 49, 66, 50, 65, 146, + 146, 20, 67, 50, 50, 82, 34, 82, 34, 82, 34, 82, + 49, 82, 65, 50, 100, 0, 8, 96, 24, 11, 240, 240, + 225, 169, 40, 49, 81, 65, 81, 145, 145, 161, 145, 161, + 161, 146, 146, 146, 146, 0, 9, 16, 32, 11, 0, 7, + 21, 81, 66, 49, 98, 33, 98, 33, 98, 35, 50, 69, + 97, 36, 49, 83, 33, 113, 33, 113, 33, 113, 49, 81, + 85, 0, 8, 96, 31, 11, 0, 7, 20, 98, 49, 66, + 81, 50, 82, 34, 82, 34, 82, 50, 51, 68, 18, 146, + 146, 50, 65, 66, 50, 65, 50, 100, 0, 8, 112, 11, + 4, 240, 240, 162, 34, 240, 114, 34, 240, 176, 15, 5, + 0, 6, 35, 35, 49, 240, 131, 35, 65, 65, 49, 49, + 224, 17, 12, 0, 14, 66, 130, 130, 130, 130, 162, 194, + 194, 194, 194, 0, 9, 32, 10, 12, 0, 18, 10, 240, + 186, 0, 13, 96, 17, 12, 0, 13, 66, 194, 194, 194, + 194, 162, 130, 130, 130, 130, 0, 10, 32, 22, 9, 0, + 5, 100, 66, 49, 51, 49, 129, 129, 114, 68, 82, 113, + 129, 240, 162, 114, 0, 7, 64, 54, 18, 0, 14, 52, + 179, 66, 130, 129, 98, 161, 66, 178, 50, 66, 18, 49, + 34, 50, 35, 49, 34, 50, 34, 65, 34, 34, 50, 65, + 34, 34, 49, 81, 34, 34, 49, 65, 50, 34, 34, 49, + 82, 35, 35, 98, 240, 34, 145, 130, 82, 181, 240, 240, + 208, 30, 16, 0, 10, 113, 241, 227, 211, 193, 33, 193, + 34, 177, 34, 161, 65, 167, 145, 66, 129, 97, 129, 98, + 113, 98, 71, 22, 0, 12, 32, 31, 14, 0, 8, 106, + 98, 82, 82, 98, 66, 98, 66, 98, 66, 82, 87, 114, + 82, 82, 98, 66, 98, 66, 98, 66, 98, 66, 82, 58, + 0, 11, 30, 14, 0, 9, 36, 49, 66, 68, 50, 99, + 50, 114, 34, 129, 50, 145, 34, 194, 194, 194, 210, 113, + 66, 113, 82, 81, 133, 0, 11, 16, 32, 15, 0, 9, + 57, 130, 82, 98, 98, 82, 113, 82, 114, 66, 114, 66, + 114, 66, 114, 66, 114, 66, 114, 66, 113, 82, 98, 82, + 82, 73, 0, 12, 36, 14, 0, 8, 108, 66, 98, 66, + 98, 66, 49, 49, 66, 49, 49, 66, 34, 134, 130, 34, + 130, 49, 49, 66, 49, 49, 66, 113, 66, 98, 66, 98, + 44, 0, 10, 96, 31, 14, 0, 8, 108, 66, 98, 66, + 98, 66, 49, 49, 66, 49, 49, 66, 34, 134, 130, 34, + 130, 49, 130, 49, 130, 194, 194, 166, 0, 11, 64, 36, + 15, 0, 9, 116, 49, 82, 65, 18, 66, 99, 66, 114, + 50, 130, 50, 145, 50, 210, 71, 34, 114, 66, 114, 82, + 98, 82, 98, 98, 65, 17, 132, 33, 0, 11, 96, 34, + 16, 0, 10, 6, 38, 66, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 106, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 70, 38, 0, 12, 32, 21, 8, 240, + 240, 166, 66, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 70, 0, 6, 32, 25, 12, 0, 8, 6, 130, + 162, 162, 162, 162, 162, 162, 162, 82, 50, 67, 50, 66, + 66, 65, 66, 101, 0, 9, 96, 35, 16, 0, 10, 6, + 38, 66, 98, 98, 82, 114, 65, 146, 49, 162, 33, 178, + 19, 163, 18, 162, 50, 146, 66, 130, 67, 114, 82, 114, + 98, 70, 38, 0, 12, 32, 26, 14, 0, 8, 102, 162, + 194, 194, 194, 194, 194, 194, 194, 113, 66, 113, 66, 113, + 66, 98, 66, 83, 44, 0, 10, 96, 54, 19, 0, 11, + 116, 133, 67, 115, 99, 97, 18, 97, 18, 81, 18, 97, + 18, 81, 18, 97, 18, 65, 34, 97, 34, 49, 34, 97, + 34, 49, 34, 97, 49, 33, 50, 97, 50, 17, 50, 97, + 51, 66, 97, 66, 66, 97, 66, 66, 69, 33, 54, 0, + 14, 64, 42, 16, 0, 10, 4, 85, 66, 113, 99, 97, + 97, 18, 81, 97, 19, 65, 97, 34, 65, 97, 50, 49, + 97, 66, 33, 97, 67, 17, 97, 82, 17, 97, 99, 97, + 114, 97, 114, 69, 97, 0, 12, 64, 32, 15, 0, 9, + 117, 130, 82, 82, 114, 66, 114, 50, 146, 34, 146, 34, + 146, 34, 146, 34, 146, 34, 146, 50, 114, 66, 114, 82, + 82, 133, 0, 12, 27, 14, 0, 8, 106, 98, 82, 82, + 98, 66, 98, 66, 98, 66, 98, 66, 82, 87, 114, 194, + 194, 194, 194, 167, 0, 11, 48, 43, 15, 0, 9, 117, + 130, 82, 82, 114, 66, 114, 50, 146, 34, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 50, 34, 50, 66, 17, 33, + 34, 83, 51, 133, 210, 49, 146, 49, 146, 34, 164, 240, + 240, 48, 35, 15, 0, 9, 58, 114, 82, 98, 98, 82, + 98, 82, 98, 82, 82, 103, 130, 66, 114, 81, 114, 82, + 98, 82, 98, 82, 17, 66, 82, 17, 39, 51, 0, 11, + 64, 32, 13, 0, 8, 69, 113, 82, 66, 97, 66, 97, + 67, 81, 83, 181, 81, 69, 50, 99, 34, 114, 34, 129, + 35, 113, 36, 81, 50, 37, 0, 10, 32, 31, 14, 0, + 8, 108, 34, 50, 50, 34, 50, 50, 33, 66, 65, 33, + 66, 65, 33, 66, 65, 114, 194, 194, 194, 194, 194, 194, + 166, 0, 11, 16, 34, 16, 0, 10, 6, 53, 66, 113, + 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, + 98, 113, 98, 113, 98, 113, 98, 113, 114, 81, 150, 0, + 12, 96, 31, 16, 0, 10, 6, 23, 66, 97, 114, 97, + 129, 81, 146, 65, 146, 65, 161, 49, 178, 33, 178, 33, + 193, 17, 211, 211, 225, 241, 0, 13, 16, 50, 23, 0, + 14, 62, 22, 66, 98, 82, 114, 82, 81, 130, 65, 18, + 65, 130, 65, 18, 65, 146, 49, 18, 49, 162, 33, 49, + 49, 162, 33, 50, 33, 178, 17, 50, 17, 195, 66, 17, + 195, 83, 210, 82, 225, 98, 225, 113, 0, 18, 32, 31, + 17, 0, 10, 87, 23, 82, 82, 146, 65, 162, 49, 194, + 17, 227, 226, 243, 209, 34, 193, 34, 177, 66, 145, 83, + 114, 98, 86, 39, 0, 13, 28, 17, 0, 10, 86, 39, + 66, 113, 130, 81, 146, 81, 162, 49, 194, 17, 210, 17, + 226, 242, 242, 242, 242, 242, 214, 0, 13, 80, 31, 14, + 0, 8, 123, 50, 98, 65, 98, 81, 83, 81, 82, 97, + 66, 178, 179, 178, 81, 82, 97, 66, 113, 51, 98, 50, + 114, 44, 0, 10, 96, 24, 7, 240, 240, 85, 34, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 85, 144, 24, 7, 240, 240, 81, 97, 97, + 113, 97, 97, 97, 113, 97, 97, 97, 97, 113, 97, 97, + 97, 113, 97, 97, 144, 24, 7, 240, 240, 85, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 37, 144, 20, 11, 0, 7, 49, 145, 17, + 114, 33, 97, 49, 81, 81, 50, 97, 33, 113, 0, 18, + 16, 8, 12, 0, 31, 74, 240, 240, 128, 10, 6, 240, + 242, 66, 97, 97, 0, 12, 32, 25, 11, 0, 13, 116, + 97, 65, 82, 50, 146, 101, 81, 50, 17, 34, 50, 17, + 34, 35, 17, 51, 19, 0, 8, 80, 31, 12, 0, 7, + 68, 162, 162, 162, 162, 162, 19, 99, 49, 82, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 65, 17, 49, 81, 35, + 0, 9, 64, 20, 9, 0, 11, 68, 66, 49, 34, 50, + 34, 114, 114, 114, 65, 50, 49, 68, 0, 7, 16, 30, + 12, 0, 8, 4, 162, 162, 162, 162, 99, 18, 81, 51, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 81, 51, + 99, 20, 0, 9, 32, 20, 10, 0, 12, 100, 81, 65, + 50, 66, 40, 34, 130, 81, 34, 81, 50, 49, 84, 0, + 8, 22, 10, 0, 6, 99, 97, 34, 66, 34, 66, 130, + 102, 98, 130, 130, 130, 130, 130, 130, 102, 0, 8, 30, + 13, 0, 16, 84, 34, 65, 68, 50, 68, 50, 66, 82, + 66, 98, 34, 117, 113, 199, 113, 81, 66, 97, 65, 113, + 65, 97, 102, 240, 64, 29, 13, 0, 8, 20, 178, 178, + 178, 178, 178, 19, 115, 34, 98, 50, 98, 50, 98, 50, + 98, 50, 98, 50, 98, 50, 69, 21, 0, 10, 19, 6, + 240, 240, 18, 66, 240, 99, 66, 66, 66, 66, 66, 66, + 66, 52, 240, 240, 128, 24, 8, 240, 240, 226, 98, 240, + 212, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 34, + 34, 34, 33, 67, 192, 27, 13, 0, 8, 20, 178, 178, + 178, 178, 178, 37, 66, 50, 98, 49, 114, 18, 133, 130, + 33, 130, 34, 114, 50, 75, 0, 10, 21, 8, 240, 240, + 164, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 70, 0, 6, 32, 34, 18, 0, 22, 68, 19, 35, + 115, 35, 34, 98, 50, 50, 98, 50, 50, 98, 50, 50, + 98, 50, 50, 98, 50, 50, 98, 50, 50, 69, 20, 21, + 0, 13, 96, 24, 13, 0, 16, 36, 19, 115, 34, 98, + 50, 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, 69, + 21, 0, 10, 22, 10, 0, 12, 100, 82, 34, 50, 66, + 34, 66, 34, 66, 34, 66, 34, 66, 50, 34, 84, 0, + 8, 29, 12, 0, 15, 4, 19, 99, 49, 82, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 67, 49, 82, 19, 98, + 162, 162, 162, 133, 240, 64, 29, 12, 0, 15, 35, 33, + 81, 49, 17, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 81, 51, 99, 18, 162, 162, 162, 162, 149, 224, 18, + 10, 0, 12, 68, 19, 67, 18, 66, 34, 66, 130, 130, + 130, 130, 102, 0, 8, 22, 9, 0, 11, 51, 81, 50, + 49, 65, 51, 132, 49, 66, 33, 81, 34, 65, 33, 20, + 0, 7, 16, 24, 9, 0, 7, 1, 129, 129, 114, 102, + 81, 129, 129, 129, 49, 65, 49, 65, 49, 65, 49, 83, + 0, 7, 16, 25, 11, 0, 13, 100, 35, 66, 50, 66, + 50, 66, 50, 66, 50, 66, 50, 66, 50, 66, 35, 83, + 18, 0, 8, 64, 21, 11, 0, 13, 100, 20, 50, 65, + 81, 49, 98, 33, 113, 33, 113, 17, 131, 145, 161, 0, + 9, 28, 15, 0, 18, 109, 50, 50, 49, 66, 50, 33, + 97, 33, 17, 33, 98, 17, 18, 17, 114, 35, 130, 50, + 130, 50, 209, 0, 12, 22, 12, 0, 15, 5, 20, 66, + 49, 114, 17, 146, 162, 163, 129, 33, 113, 50, 68, 21, + 0, 9, 32, 28, 12, 0, 15, 5, 20, 65, 65, 98, + 49, 98, 33, 129, 33, 130, 17, 146, 162, 162, 161, 177, + 114, 17, 130, 17, 146, 240, 96, 22, 10, 0, 12, 71, + 49, 50, 65, 50, 114, 129, 49, 65, 65, 50, 50, 49, + 66, 40, 0, 7, 96, 24, 6, 240, 240, 49, 66, 66, + 66, 66, 66, 66, 66, 65, 50, 97, 82, 66, 66, 66, + 66, 66, 66, 81, 128, 22, 3, 241, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 80, 23, 6, 240, 241, 82, 66, 66, 66, 66, + 66, 66, 81, 98, 49, 66, 66, 66, 66, 66, 66, 66, + 65, 176, 11, 11, 0, 18, 19, 49, 34, 36, 0, 14, + 16, 4, 8, 0, 25, 19, 5, 0, 6, 35, 35, 49, + 65, 65, 65, 65, 65, 65, 51, 35, 35, 35, 35, 112, + 33, 9, 0, 7, 65, 113, 129, 129, 84, 66, 17, 17, + 34, 35, 34, 17, 82, 17, 82, 17, 82, 17, 33, 50, + 49, 68, 81, 113, 129, 113, 129, 240, 32, 26, 11, 0, + 7, 68, 97, 49, 82, 34, 82, 145, 146, 119, 98, 146, + 145, 161, 148, 49, 33, 53, 33, 67, 0, 8, 80, 24, + 10, 0, 12, 65, 20, 17, 49, 65, 49, 97, 33, 97, + 33, 97, 33, 97, 49, 65, 49, 20, 17, 0, 9, 27, + 13, 0, 8, 21, 36, 65, 82, 82, 65, 114, 49, 114, + 33, 146, 17, 119, 146, 178, 135, 146, 178, 178, 149, 0, + 10, 48, 19, 3, 241, 33, 33, 33, 33, 33, 33, 33, + 177, 33, 33, 33, 33, 33, 33, 33, 80, 34, 8, 240, + 240, 195, 65, 34, 49, 34, 49, 114, 99, 65, 33, 65, + 49, 49, 50, 33, 65, 34, 49, 50, 33, 67, 82, 114, + 113, 66, 17, 66, 17, 82, 192, 11, 8, 0, 6, 2, + 34, 34, 34, 0, 17, 32, 49, 17, 0, 11, 37, 162, + 82, 113, 36, 17, 17, 81, 34, 50, 33, 50, 18, 81, + 33, 49, 34, 81, 49, 33, 34, 145, 33, 34, 81, 49, + 33, 34, 81, 49, 33, 50, 49, 50, 49, 67, 65, 81, + 145, 113, 113, 151, 0, 13, 64, 19, 8, 240, 240, 178, + 81, 33, 98, 66, 17, 17, 33, 33, 17, 50, 17, 0, + 14, 48, 19, 8, 0, 12, 33, 33, 49, 33, 50, 17, + 66, 18, 65, 33, 81, 33, 0, 7, 32, 11, 12, 0, + 18, 10, 177, 177, 177, 0, 13, 96, 8, 8, 0, 14, + 6, 0, 10, 32, 49, 17, 0, 11, 37, 162, 82, 120, + 33, 81, 50, 34, 33, 50, 50, 34, 33, 49, 66, 34, + 49, 33, 68, 81, 33, 66, 33, 65, 33, 66, 33, 65, + 33, 66, 33, 17, 18, 49, 21, 33, 33, 81, 145, 113, + 113, 151, 0, 13, 64, 8, 8, 0, 7, 6, 0, 17, + 32, 19, 9, 0, 5, 115, 81, 49, 49, 81, 33, 81, + 33, 81, 49, 49, 83, 0, 15, 16, 19, 11, 0, 11, + 65, 161, 161, 161, 161, 105, 97, 161, 161, 161, 240, 41, + 0, 7, 16, 18, 7, 240, 240, 99, 49, 34, 34, 18, + 82, 66, 81, 81, 33, 37, 0, 10, 96, 18, 8, 240, + 240, 179, 66, 33, 113, 67, 115, 34, 34, 33, 50, 51, + 0, 12, 64, 11, 6, 240, 240, 34, 66, 49, 65, 0, + 12, 80, 29, 14, 0, 19, 82, 50, 113, 66, 113, 65, + 114, 65, 114, 50, 114, 50, 33, 66, 35, 17, 69, 34, + 81, 209, 194, 194, 193, 240, 192, 42, 11, 0, 7, 23, + 51, 33, 68, 33, 68, 33, 68, 33, 68, 33, 83, 33, + 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, + 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, + 240, 9, 4, 0, 6, 2, 34, 0, 5, 96, 10, 5, + 0, 12, 1, 50, 81, 65, 34, 128, 14, 5, 240, 177, + 65, 65, 65, 65, 65, 65, 51, 0, 7, 96, 17, 7, + 240, 240, 99, 49, 49, 33, 49, 33, 49, 34, 17, 81, + 0, 12, 96, 20, 8, 0, 11, 1, 113, 33, 81, 33, + 81, 33, 65, 33, 49, 33, 49, 33, 0, 7, 64, 40, + 15, 0, 9, 65, 129, 81, 113, 97, 113, 97, 97, 113, + 81, 129, 81, 129, 65, 65, 51, 33, 66, 129, 49, 17, + 113, 65, 17, 97, 65, 33, 81, 85, 65, 129, 65, 145, + 0, 11, 80, 40, 15, 0, 9, 65, 113, 97, 113, 97, + 97, 113, 81, 129, 81, 129, 65, 145, 49, 35, 67, 33, + 17, 50, 97, 34, 34, 97, 98, 81, 98, 81, 97, 113, + 81, 49, 49, 86, 0, 11, 64, 42, 16, 0, 10, 19, + 113, 66, 33, 81, 145, 81, 99, 81, 147, 33, 114, 34, + 33, 113, 50, 17, 65, 67, 33, 66, 145, 49, 17, 129, + 65, 17, 113, 65, 33, 113, 69, 81, 129, 241, 0, 12, + 48, 21, 8, 0, 10, 66, 98, 225, 113, 98, 68, 50, + 97, 113, 113, 50, 33, 50, 49, 49, 67, 176, 34, 16, + 81, 242, 242, 240, 17, 240, 241, 241, 227, 211, 193, 18, + 193, 34, 177, 34, 161, 50, 167, 129, 82, 129, 82, 129, + 98, 98, 98, 70, 23, 0, 12, 32, 34, 16, 145, 226, + 210, 209, 240, 240, 33, 241, 227, 211, 193, 33, 193, 34, + 177, 34, 161, 65, 167, 145, 66, 129, 97, 129, 98, 113, + 98, 71, 22, 0, 12, 32, 35, 16, 113, 227, 193, 49, + 161, 81, 240, 209, 241, 227, 211, 193, 33, 193, 34, 177, + 34, 161, 65, 167, 145, 66, 129, 97, 129, 98, 113, 98, + 71, 22, 0, 12, 32, 35, 16, 240, 99, 49, 113, 52, + 240, 240, 225, 241, 227, 211, 193, 33, 193, 34, 177, 34, + 161, 65, 167, 145, 66, 129, 97, 129, 98, 113, 98, 71, + 22, 0, 12, 32, 35, 16, 240, 82, 50, 146, 50, 240, + 240, 225, 241, 227, 211, 193, 18, 193, 34, 177, 34, 161, + 50, 167, 129, 82, 129, 82, 129, 98, 98, 98, 70, 38, + 0, 12, 32, 35, 16, 99, 193, 49, 177, 49, 195, 240, + 241, 241, 227, 211, 193, 18, 193, 34, 177, 34, 161, 50, + 167, 145, 66, 129, 82, 129, 83, 113, 98, 71, 22, 0, + 12, 32, 47, 23, 0, 15, 46, 195, 98, 177, 18, 98, + 161, 34, 49, 49, 161, 34, 49, 49, 145, 50, 34, 203, + 193, 66, 34, 177, 82, 49, 49, 97, 98, 49, 49, 97, + 98, 113, 81, 114, 98, 66, 114, 98, 38, 60, 0, 17, + 64, 34, 14, 0, 9, 36, 49, 66, 68, 50, 99, 50, + 114, 34, 145, 34, 145, 34, 194, 194, 194, 210, 113, 66, + 113, 82, 81, 118, 161, 195, 210, 194, 148, 240, 96, 39, + 14, 50, 195, 209, 240, 240, 108, 66, 98, 66, 98, 66, + 49, 49, 66, 49, 49, 66, 34, 134, 130, 34, 130, 49, + 49, 66, 49, 49, 66, 113, 66, 98, 66, 98, 44, 0, + 10, 96, 39, 14, 114, 179, 162, 240, 240, 92, 66, 98, + 66, 98, 66, 49, 49, 66, 49, 49, 66, 34, 134, 130, + 34, 130, 49, 49, 66, 49, 49, 66, 113, 66, 98, 66, + 98, 44, 0, 10, 96, 40, 14, 81, 195, 161, 50, 240, + 240, 60, 66, 98, 66, 98, 66, 49, 49, 66, 49, 49, + 66, 34, 134, 130, 34, 130, 49, 49, 66, 49, 49, 66, + 113, 66, 98, 66, 98, 44, 0, 10, 96, 41, 14, 240, + 18, 50, 114, 50, 240, 240, 60, 66, 98, 66, 98, 66, + 49, 49, 66, 49, 49, 66, 34, 134, 130, 34, 130, 49, + 49, 66, 49, 49, 66, 113, 66, 98, 66, 98, 44, 0, + 10, 96, 23, 8, 2, 99, 114, 240, 86, 66, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 6, + 32, 23, 8, 66, 83, 66, 240, 86, 66, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 6, 32, + 24, 8, 34, 84, 50, 34, 240, 54, 66, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 6, 32, + 24, 8, 130, 34, 34, 34, 240, 54, 66, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 6, 32, + 32, 15, 0, 9, 57, 130, 82, 98, 98, 82, 113, 82, + 114, 66, 114, 39, 66, 66, 114, 66, 114, 66, 114, 66, + 113, 82, 98, 82, 82, 73, 0, 12, 47, 16, 240, 83, + 49, 129, 51, 240, 240, 132, 85, 66, 113, 99, 97, 97, + 18, 81, 97, 19, 65, 97, 34, 65, 97, 50, 49, 97, + 66, 33, 97, 67, 17, 97, 82, 17, 97, 99, 97, 114, + 97, 114, 69, 97, 0, 12, 64, 35, 15, 50, 226, 226, + 241, 240, 181, 130, 82, 82, 114, 66, 114, 50, 146, 34, + 146, 34, 146, 34, 146, 34, 146, 34, 146, 50, 114, 66, + 114, 82, 82, 133, 0, 12, 35, 15, 130, 194, 194, 193, + 240, 213, 130, 82, 82, 114, 66, 114, 50, 146, 34, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 50, 114, 66, 114, + 82, 82, 133, 0, 12, 37, 15, 97, 211, 177, 49, 145, + 81, 240, 149, 130, 82, 82, 114, 66, 114, 50, 146, 34, + 146, 34, 146, 34, 146, 34, 146, 34, 146, 50, 114, 66, + 114, 82, 82, 133, 0, 12, 37, 15, 240, 52, 49, 97, + 52, 240, 240, 149, 130, 82, 82, 114, 66, 114, 50, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 50, 114, + 66, 114, 82, 82, 133, 0, 12, 37, 15, 240, 50, 50, + 130, 50, 240, 240, 149, 130, 82, 82, 114, 66, 114, 50, + 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 50, + 114, 66, 114, 82, 82, 133, 0, 12, 21, 9, 0, 11, + 33, 81, 49, 50, 65, 18, 98, 99, 82, 18, 50, 50, + 33, 81, 0, 8, 16, 40, 15, 0, 9, 117, 49, 66, + 83, 66, 99, 66, 99, 50, 98, 18, 34, 82, 34, 34, + 66, 50, 34, 50, 66, 34, 34, 82, 34, 18, 98, 51, + 98, 67, 98, 67, 82, 65, 53, 0, 12, 38, 16, 81, + 242, 242, 240, 17, 240, 134, 53, 66, 113, 98, 113, 98, + 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, + 113, 98, 113, 98, 113, 114, 81, 150, 0, 12, 96, 37, + 16, 145, 226, 209, 240, 240, 166, 53, 66, 113, 98, 113, + 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, + 98, 113, 98, 113, 98, 113, 114, 81, 150, 0, 12, 96, + 39, 16, 113, 227, 193, 49, 161, 81, 240, 102, 53, 66, + 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, + 113, 98, 113, 98, 113, 98, 113, 98, 113, 114, 81, 150, + 0, 12, 96, 39, 16, 240, 82, 50, 146, 50, 240, 240, + 119, 37, 66, 113, 98, 113, 98, 113, 98, 113, 98, 113, + 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, 98, 113, + 114, 81, 150, 0, 12, 96, 31, 17, 130, 227, 210, 240, + 240, 214, 39, 66, 113, 130, 81, 146, 81, 162, 49, 194, + 17, 210, 17, 226, 242, 242, 242, 242, 242, 214, 0, 13, + 80, 38, 13, 0, 8, 20, 50, 98, 36, 84, 34, 82, + 82, 66, 82, 66, 82, 66, 82, 66, 82, 66, 82, 66, + 81, 82, 66, 82, 50, 98, 34, 116, 146, 178, 178, 178, + 146, 240, 144, 36, 12, 0, 8, 4, 114, 34, 82, 50, + 82, 50, 82, 34, 98, 18, 114, 49, 98, 65, 82, 66, + 66, 66, 66, 66, 66, 17, 34, 66, 17, 33, 52, 20, + 0, 9, 48, 30, 11, 0, 7, 1, 162, 177, 240, 244, + 97, 65, 82, 50, 66, 50, 116, 82, 34, 17, 34, 50, + 17, 34, 35, 17, 51, 19, 0, 8, 80, 30, 11, 0, + 7, 66, 130, 129, 145, 240, 84, 97, 65, 82, 50, 146, + 101, 81, 50, 17, 34, 50, 17, 34, 35, 17, 51, 19, + 0, 8, 80, 31, 11, 0, 7, 33, 147, 113, 49, 81, + 240, 116, 97, 65, 82, 50, 146, 101, 81, 50, 17, 34, + 50, 17, 34, 35, 17, 51, 19, 0, 8, 80, 29, 11, + 0, 8, 51, 113, 35, 240, 212, 97, 65, 82, 50, 146, + 101, 81, 50, 17, 34, 50, 17, 34, 35, 17, 51, 19, + 0, 8, 80, 30, 11, 0, 8, 50, 34, 82, 34, 240, + 212, 97, 50, 82, 34, 146, 101, 81, 50, 17, 34, 50, + 17, 34, 35, 17, 51, 19, 0, 8, 80, 32, 11, 0, + 7, 19, 113, 49, 97, 49, 115, 240, 52, 97, 65, 82, + 50, 146, 101, 81, 50, 17, 34, 50, 17, 34, 35, 17, + 51, 19, 0, 8, 80, 30, 15, 0, 18, 116, 36, 66, + 50, 65, 50, 50, 66, 90, 50, 34, 130, 50, 81, 34, + 50, 81, 34, 33, 18, 49, 67, 52, 0, 11, 96, 23, + 9, 0, 11, 68, 66, 49, 34, 50, 34, 114, 114, 114, + 65, 50, 49, 68, 113, 115, 129, 129, 98, 208, 24, 10, + 0, 6, 65, 146, 146, 240, 196, 81, 65, 50, 66, 40, + 34, 130, 81, 34, 81, 50, 49, 84, 0, 8, 25, 10, + 0, 7, 1, 129, 129, 129, 240, 52, 81, 65, 50, 65, + 56, 34, 130, 81, 34, 65, 66, 49, 84, 0, 8, 26, + 10, 0, 6, 97, 131, 97, 49, 65, 240, 84, 81, 65, + 50, 66, 40, 34, 130, 81, 34, 81, 50, 49, 84, 0, + 8, 25, 9, 0, 6, 114, 34, 50, 34, 240, 116, 65, + 50, 34, 65, 39, 34, 114, 114, 65, 50, 49, 68, 0, + 7, 16, 20, 8, 240, 240, 161, 114, 129, 129, 196, 98, + 98, 98, 98, 98, 98, 98, 70, 0, 6, 32, 20, 7, + 240, 240, 130, 81, 81, 81, 196, 82, 82, 82, 82, 82, + 82, 82, 53, 240, 240, 224, 22, 8, 240, 240, 193, 97, + 17, 65, 49, 240, 68, 98, 98, 98, 98, 98, 98, 98, + 70, 0, 6, 32, 21, 8, 0, 6, 2, 34, 34, 34, + 240, 67, 98, 98, 98, 98, 98, 98, 98, 85, 0, 6, + 32, 34, 12, 0, 7, 98, 81, 82, 20, 83, 49, 33, + 35, 99, 34, 145, 18, 98, 50, 81, 67, 50, 82, 50, + 82, 50, 82, 50, 82, 66, 50, 101, 0, 9, 64, 30, + 13, 0, 10, 18, 49, 81, 51, 240, 240, 20, 19, 115, + 34, 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, 98, + 50, 69, 21, 0, 10, 27, 10, 0, 6, 65, 146, 145, + 161, 240, 36, 82, 34, 50, 66, 34, 66, 34, 66, 34, + 66, 34, 66, 50, 34, 84, 0, 8, 27, 10, 0, 6, + 113, 130, 129, 129, 240, 52, 82, 34, 50, 66, 34, 66, + 34, 66, 34, 66, 34, 66, 50, 34, 84, 0, 8, 28, + 10, 0, 6, 82, 130, 113, 33, 81, 65, 244, 82, 34, + 50, 66, 34, 66, 34, 66, 34, 66, 34, 66, 50, 34, + 84, 0, 8, 26, 10, 0, 7, 98, 113, 20, 240, 164, + 82, 34, 50, 66, 34, 66, 34, 66, 34, 66, 34, 66, + 50, 34, 84, 0, 8, 27, 10, 0, 7, 82, 34, 66, + 34, 240, 164, 82, 34, 50, 66, 34, 66, 34, 66, 34, + 66, 34, 66, 50, 34, 84, 0, 8, 14, 12, 0, 15, + 66, 162, 240, 250, 240, 50, 162, 0, 11, 32, 27, 10, + 0, 12, 100, 17, 50, 34, 50, 51, 34, 33, 18, 34, + 17, 34, 34, 17, 34, 35, 50, 50, 34, 49, 20, 0, + 8, 30, 11, 0, 7, 18, 161, 177, 177, 240, 20, 35, + 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, + 66, 35, 83, 18, 0, 8, 64, 30, 11, 0, 7, 81, + 161, 145, 145, 240, 36, 35, 66, 50, 66, 50, 66, 50, + 66, 50, 66, 50, 66, 50, 66, 35, 83, 18, 0, 8, + 64, 30, 11, 0, 7, 65, 146, 129, 33, 240, 180, 35, + 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, + 66, 35, 83, 18, 0, 8, 64, 30, 11, 0, 8, 66, + 34, 82, 34, 240, 164, 35, 66, 50, 66, 50, 66, 50, + 66, 50, 66, 50, 66, 50, 66, 35, 83, 18, 0, 8, + 64, 32, 12, 0, 8, 33, 162, 146, 240, 245, 20, 65, + 65, 98, 49, 98, 33, 129, 33, 130, 17, 146, 162, 161, + 177, 177, 114, 17, 130, 17, 131, 240, 96, 33, 10, 0, + 7, 67, 130, 130, 130, 130, 19, 67, 34, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 34, 66, 33, 82, 17, 99, + 114, 130, 130, 114, 240, 48, 33, 12, 0, 9, 34, 34, + 98, 34, 240, 213, 20, 65, 65, 98, 49, 113, 49, 114, + 17, 130, 17, 146, 162, 177, 161, 177, 114, 17, 130, 17, + 146, 240, 96, +}; + +//***************************************************************************** +// +// The glyph offset table for the 20 point Theanomodern font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanomodern20[] = +{ + 0, 5, 25, 44, 76, 128, 169, 210, + 222, 247, 272, 296, 312, 323, 331, 339, + 363, 396, 417, 444, 473, 499, 529, 560, + 584, 616, 647, 658, 673, 690, 700, 717, + 739, 793, 823, 854, 884, 916, 952, 983, + 1019, 1053, 1074, 1099, 1134, 1160, 1214, 1256, + 1288, 1315, 1358, 1393, 1425, 1456, 1490, 1521, + 1571, 1602, 1630, 1661, 1685, 1709, 1733, 1753, + 1761, 1771, 1796, 1827, 1847, 1877, 1897, 1919, + 1949, 1978, 1997, 2021, 2048, 2069, 2103, 2127, + 2149, 2178, 2207, 2225, 2247, 2271, 2296, 2317, + 2345, 2367, 2395, 2417, 2441, 2463, 2486, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2497, 2501, 2520, 2553, 2579, 2603, 2630, 2649, + 2683, 2694, 2743, 2762, 2781, 2792, 2800, 2849, + 2857, 2876, 2895, 2913, 2931, 2942, 2971, 3013, + 3022, 3032, 3046, 3063, 3083, 3123, 3163, 3205, + 3226, 3260, 3294, 3329, 3364, 3399, 3434, 3481, + 3515, 3554, 3593, 3633, 3674, 3697, 3720, 3744, + 3768, 3800, 3847, 3882, 3917, 3954, 3991, 4028, + 4049, 4089, 4127, 4164, 4203, 4242, 4273, 4311, + 4347, 4377, 4407, 4438, 4467, 4497, 4529, 4559, + 4582, 4606, 4631, 4657, 4682, 4702, 4722, 4744, + 4765, 4799, 4829, 4856, 4883, 4911, 4937, 4964, + 4978, 5005, 5035, 5065, 5095, 5125, 5157, 5190, +}; + +//***************************************************************************** +// +// The font definition for the 20 point Theanomodern font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanomodern20 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 20, + + // + // The height of the font. + // + 25, + + // + // The baseline of the font. + // + 19, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanomodern20, + + // + // A pointer to the actual font data + // + g_pui8Theanomodern20Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanomodern22.c b/third_party/fonts/ofl/fonts/fonttheanomodern22.c new file mode 100644 index 0000000..386f308 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanomodern22.c @@ -0,0 +1,709 @@ +//***************************************************************************** +// +// fonttheanomodern22.c - Font definition for the 22pt Theanomodern font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanomodern +// Size: 22 point +// Bold: no +// Italic: no +// Memory usage: 6076 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 22 point Theanomodern font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanomodern22Data[5876] = +{ + 5, 9, 0, 32, 80, 21, 5, 240, 243, 35, 35, 35, + 35, 49, 65, 65, 65, 65, 65, 65, 145, 51, 35, 240, + 240, 112, 19, 8, 0, 6, 2, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 49, 49, 0, 17, 32, 37, 13, 0, + 10, 33, 65, 113, 65, 113, 49, 129, 49, 113, 65, 75, + 81, 65, 113, 49, 129, 49, 113, 65, 91, 65, 49, 129, + 49, 129, 49, 113, 65, 113, 65, 0, 12, 16, 59, 13, + 0, 7, 1, 17, 161, 17, 149, 98, 17, 17, 17, 81, + 33, 17, 33, 50, 33, 17, 18, 50, 33, 17, 17, 67, + 17, 17, 118, 134, 150, 113, 20, 65, 33, 17, 19, 35, + 17, 17, 34, 34, 33, 17, 34, 34, 33, 17, 33, 66, + 17, 17, 18, 101, 145, 17, 0, 10, 64, 51, 17, 0, + 13, 2, 113, 97, 33, 81, 98, 34, 65, 98, 34, 49, + 114, 34, 49, 114, 34, 33, 145, 33, 49, 162, 49, 241, + 51, 161, 33, 49, 129, 34, 50, 113, 34, 50, 97, 50, + 50, 97, 50, 50, 81, 81, 49, 209, 17, 0, 15, 48, + 47, 16, 0, 12, 68, 178, 49, 162, 49, 162, 49, 163, + 17, 195, 211, 36, 97, 18, 49, 113, 50, 33, 97, 66, + 33, 82, 82, 17, 33, 34, 83, 49, 34, 98, 49, 34, + 98, 49, 50, 65, 18, 17, 85, 50, 0, 14, 64, 12, + 4, 240, 146, 34, 34, 34, 34, 49, 0, 8, 96, 27, + 8, 0, 6, 81, 97, 97, 98, 97, 98, 98, 82, 98, + 98, 98, 98, 98, 98, 98, 114, 98, 113, 114, 114, 113, + 129, 160, 27, 8, 0, 6, 1, 129, 129, 114, 113, 114, + 98, 114, 98, 98, 98, 98, 98, 98, 97, 98, 98, 97, + 98, 82, 97, 97, 240, 25, 10, 0, 7, 114, 130, 81, + 33, 34, 34, 17, 19, 67, 100, 82, 17, 19, 33, 33, + 34, 82, 130, 0, 16, 112, 18, 13, 0, 18, 65, 193, + 193, 193, 193, 123, 113, 193, 193, 193, 193, 0, 12, 32, + 13, 6, 0, 15, 19, 51, 81, 81, 65, 65, 65, 240, + 32, 8, 9, 0, 19, 23, 0, 12, 80, 10, 5, 0, + 12, 1, 51, 35, 240, 240, 112, 27, 8, 0, 6, 81, + 97, 113, 113, 113, 98, 97, 113, 113, 113, 97, 113, 113, + 113, 98, 97, 113, 113, 113, 97, 113, 240, 128, 37, 12, + 0, 9, 52, 113, 65, 82, 66, 66, 66, 65, 97, 50, + 98, 34, 98, 34, 98, 34, 98, 34, 98, 34, 98, 49, + 97, 66, 66, 66, 66, 81, 65, 116, 0, 11, 16, 22, + 10, 0, 8, 1, 85, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 88, 0, 9, 31, 11, 0, + 8, 69, 81, 66, 49, 98, 33, 98, 35, 66, 35, 66, + 145, 146, 130, 145, 145, 145, 65, 65, 81, 49, 97, 56, + 41, 0, 9, 112, 32, 11, 0, 8, 69, 81, 66, 50, + 82, 35, 66, 35, 66, 146, 130, 84, 178, 161, 65, 82, + 35, 66, 35, 66, 34, 82, 50, 50, 85, 0, 10, 16, + 29, 13, 0, 10, 81, 178, 178, 163, 163, 145, 18, 129, + 34, 129, 34, 113, 50, 113, 50, 97, 66, 91, 130, 178, + 178, 136, 0, 11, 80, 30, 12, 0, 9, 17, 97, 71, + 86, 97, 177, 177, 177, 20, 98, 66, 178, 162, 162, 36, + 66, 35, 82, 33, 98, 65, 81, 101, 0, 11, 16, 35, + 12, 0, 9, 68, 98, 65, 81, 66, 66, 66, 65, 162, + 162, 36, 68, 50, 51, 82, 34, 98, 34, 98, 34, 98, + 49, 98, 50, 81, 81, 66, 100, 0, 11, 16, 28, 11, + 240, 240, 241, 161, 153, 41, 33, 97, 49, 97, 49, 81, + 161, 145, 146, 145, 146, 146, 146, 131, 131, 131, 131, 0, + 10, 48, 35, 12, 0, 9, 53, 82, 66, 49, 114, 33, + 114, 33, 114, 34, 97, 67, 49, 101, 97, 37, 65, 67, + 49, 114, 33, 129, 33, 129, 34, 113, 50, 81, 101, 0, + 11, 36, 12, 0, 9, 52, 98, 65, 81, 82, 50, 97, + 50, 98, 34, 98, 34, 98, 34, 83, 50, 49, 18, 83, + 34, 162, 161, 66, 66, 66, 65, 81, 66, 100, 0, 11, + 32, 14, 5, 0, 7, 67, 35, 49, 240, 145, 51, 35, + 240, 240, 112, 16, 5, 0, 7, 67, 35, 49, 240, 211, + 35, 65, 65, 49, 65, 240, 48, 18, 13, 0, 18, 115, + 131, 131, 146, 146, 161, 210, 210, 210, 210, 209, 0, 11, + 96, 10, 13, 0, 22, 107, 240, 219, 0, 18, 16, 18, + 13, 0, 17, 115, 195, 195, 194, 210, 209, 162, 146, 146, + 146, 161, 0, 12, 96, 26, 9, 0, 6, 116, 66, 49, + 51, 49, 35, 49, 129, 129, 114, 68, 83, 97, 129, 129, + 240, 33, 115, 99, 0, 8, 64, 58, 19, 0, 19, 117, + 194, 82, 130, 145, 98, 177, 66, 193, 66, 67, 18, 49, + 34, 66, 35, 49, 34, 50, 50, 65, 34, 34, 66, 65, + 34, 34, 66, 65, 34, 34, 65, 65, 50, 34, 50, 65, + 65, 34, 33, 17, 49, 82, 35, 51, 114, 240, 50, 145, + 130, 98, 182, 0, 8, 34, 17, 0, 13, 97, 242, 242, + 227, 225, 18, 209, 18, 193, 34, 193, 50, 177, 50, 161, + 66, 168, 145, 82, 129, 98, 129, 114, 98, 114, 71, 23, + 0, 15, 16, 36, 16, 0, 12, 11, 130, 82, 114, 98, + 98, 98, 98, 98, 98, 97, 114, 81, 135, 146, 82, 114, + 98, 98, 114, 82, 114, 82, 114, 82, 114, 82, 98, 60, + 0, 14, 64, 35, 15, 0, 11, 101, 49, 81, 81, 18, + 65, 115, 50, 130, 49, 146, 34, 161, 34, 161, 34, 210, + 210, 210, 225, 145, 66, 129, 81, 113, 113, 82, 133, 0, + 13, 112, 37, 17, 0, 12, 107, 146, 97, 130, 113, 114, + 114, 98, 129, 98, 130, 82, 130, 82, 130, 82, 130, 82, + 130, 82, 130, 82, 129, 98, 114, 98, 113, 114, 97, 91, + 0, 15, 80, 39, 16, 0, 12, 13, 98, 98, 98, 113, + 98, 113, 98, 65, 33, 98, 65, 146, 50, 151, 146, 50, + 146, 65, 146, 65, 49, 82, 65, 33, 98, 114, 82, 114, + 82, 99, 46, 0, 14, 32, 33, 15, 0, 11, 45, 82, + 98, 82, 113, 82, 113, 82, 65, 33, 82, 65, 130, 50, + 135, 130, 50, 130, 65, 130, 65, 130, 65, 130, 210, 210, + 168, 0, 14, 40, 16, 0, 12, 69, 49, 97, 81, 18, + 81, 115, 66, 130, 65, 146, 50, 146, 50, 161, 50, 226, + 87, 34, 130, 66, 130, 81, 130, 82, 114, 97, 114, 113, + 81, 17, 133, 33, 0, 14, 64, 38, 19, 0, 14, 40, + 24, 82, 114, 130, 114, 130, 114, 130, 114, 130, 114, 130, + 114, 139, 130, 114, 130, 114, 130, 114, 130, 114, 130, 114, + 130, 114, 130, 114, 88, 24, 0, 16, 112, 22, 10, 0, + 7, 72, 82, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 88, 0, 9, 28, 13, 0, 10, 39, + 130, 178, 178, 178, 178, 178, 178, 178, 178, 98, 50, 83, + 50, 83, 50, 81, 81, 97, 66, 117, 0, 12, 32, 38, + 18, 0, 13, 72, 23, 82, 99, 114, 98, 130, 81, 162, + 65, 178, 49, 194, 33, 210, 19, 195, 19, 178, 50, 178, + 66, 162, 67, 146, 83, 130, 98, 130, 99, 72, 23, 0, + 16, 29, 15, 0, 11, 38, 178, 210, 210, 210, 210, 210, + 210, 210, 210, 129, 66, 129, 66, 129, 66, 114, 66, 114, + 66, 99, 45, 0, 13, 48, 60, 22, 0, 16, 70, 134, + 83, 131, 131, 131, 129, 18, 97, 18, 129, 18, 97, 18, + 129, 18, 81, 34, 129, 34, 65, 34, 129, 34, 65, 34, + 129, 35, 33, 50, 129, 50, 33, 50, 129, 50, 33, 50, + 129, 67, 66, 129, 67, 66, 129, 66, 82, 129, 81, 82, + 87, 33, 40, 0, 19, 64, 46, 18, 0, 13, 69, 86, + 82, 129, 115, 113, 116, 97, 113, 19, 81, 113, 34, 81, + 113, 50, 65, 113, 51, 49, 113, 66, 49, 113, 82, 33, + 113, 98, 17, 113, 100, 113, 115, 113, 130, 113, 130, 71, + 97, 0, 16, 32, 37, 16, 0, 12, 70, 145, 97, 113, + 129, 82, 130, 65, 161, 50, 162, 34, 162, 34, 162, 34, + 162, 34, 162, 34, 162, 49, 161, 66, 130, 81, 129, 113, + 97, 150, 0, 14, 96, 29, 15, 0, 11, 42, 130, 82, + 98, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 82, + 103, 130, 210, 210, 210, 210, 210, 168, 0, 14, 48, 16, + 0, 12, 70, 145, 97, 113, 129, 82, 130, 65, 161, 50, + 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, 50, + 145, 66, 50, 50, 82, 17, 33, 33, 115, 51, 149, 49, + 162, 49, 162, 49, 162, 34, 180, 0, 6, 48, 40, 18, + 0, 13, 75, 162, 82, 146, 98, 130, 98, 130, 98, 130, + 98, 130, 82, 151, 178, 81, 162, 82, 146, 82, 146, 82, + 146, 97, 49, 82, 98, 33, 82, 98, 18, 40, 67, 0, + 16, 16, 36, 14, 0, 10, 117, 130, 67, 66, 98, 66, + 113, 66, 113, 67, 196, 182, 81, 70, 50, 99, 50, 130, + 34, 145, 35, 129, 36, 113, 34, 33, 81, 50, 53, 0, + 12, 96, 35, 16, 0, 12, 14, 35, 50, 51, 34, 66, + 66, 34, 66, 66, 33, 82, 81, 33, 82, 81, 33, 82, + 81, 130, 226, 226, 226, 226, 226, 226, 226, 184, 0, 14, + 80, 38, 19, 0, 14, 40, 39, 82, 129, 130, 129, 130, + 129, 130, 129, 130, 129, 130, 129, 130, 129, 130, 129, 130, + 129, 130, 129, 130, 129, 130, 129, 130, 114, 146, 97, 198, + 0, 17, 64, 35, 17, 0, 12, 103, 23, 66, 114, 98, + 113, 130, 97, 130, 81, 146, 81, 162, 65, 162, 49, 178, + 49, 194, 33, 194, 17, 210, 17, 227, 226, 242, 241, 0, + 16, 16, 57, 25, 0, 18, 103, 23, 23, 82, 98, 98, + 114, 98, 97, 130, 98, 97, 146, 65, 18, 65, 162, 65, + 18, 65, 162, 65, 18, 65, 178, 33, 50, 33, 194, 33, + 50, 33, 194, 33, 50, 33, 194, 17, 66, 17, 227, 83, + 227, 83, 226, 99, 241, 113, 240, 17, 113, 0, 23, 35, + 18, 0, 13, 71, 38, 98, 98, 130, 97, 162, 65, 179, + 33, 210, 18, 227, 243, 243, 241, 18, 209, 35, 177, 66, + 162, 82, 145, 98, 130, 99, 86, 40, 0, 16, 37, 18, + 0, 13, 71, 39, 67, 114, 114, 113, 146, 81, 163, 50, + 178, 49, 210, 17, 226, 17, 242, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 215, 0, 16, 80, 35, + 15, 0, 11, 60, 51, 98, 66, 99, 65, 99, 81, 98, + 97, 82, 113, 67, 194, 194, 195, 81, 98, 97, 82, 113, + 66, 129, 51, 114, 50, 115, 45, 0, 13, 48, 27, 7, + 240, 240, 197, 34, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 85, + 144, 27, 8, 0, 6, 1, 113, 129, 113, 113, 113, 114, + 113, 113, 113, 113, 129, 113, 113, 113, 114, 113, 113, 113, + 113, 129, 240, 48, 27, 7, 240, 240, 197, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 37, 144, 21, 13, 0, 10, 34, + 179, 145, 33, 130, 49, 113, 66, 81, 97, 66, 113, 49, + 130, 0, 24, 80, 8, 13, 0, 40, 91, 240, 240, 176, + 11, 6, 240, 240, 98, 66, 97, 97, 0, 14, 64, 29, + 12, 0, 18, 36, 113, 65, 98, 50, 82, 50, 132, 83, + 34, 17, 34, 66, 17, 34, 66, 17, 34, 51, 17, 52, + 19, 0, 10, 112, 34, 13, 0, 9, 100, 178, 178, 178, + 178, 178, 178, 20, 99, 50, 82, 81, 82, 82, 66, 82, + 66, 82, 66, 82, 66, 82, 65, 17, 50, 81, 36, 0, + 11, 112, 22, 10, 0, 15, 52, 66, 65, 49, 66, 34, + 66, 34, 130, 130, 145, 81, 50, 65, 69, 0, 9, 16, + 33, 13, 0, 10, 37, 178, 178, 178, 178, 178, 100, 18, + 82, 51, 66, 67, 66, 82, 66, 82, 66, 82, 66, 82, + 66, 67, 82, 51, 100, 20, 0, 11, 80, 22, 10, 0, + 15, 36, 82, 49, 65, 66, 34, 66, 40, 34, 130, 145, + 81, 50, 65, 69, 0, 9, 16, 25, 10, 0, 8, 3, + 97, 49, 66, 34, 66, 130, 130, 102, 98, 130, 130, 130, + 130, 130, 130, 130, 102, 0, 9, 32, 35, 14, 0, 21, + 52, 35, 66, 35, 18, 50, 66, 18, 50, 66, 98, 66, + 98, 66, 114, 34, 132, 130, 193, 232, 113, 82, 66, 113, + 65, 129, 65, 113, 103, 240, 80, 32, 14, 0, 10, 68, + 194, 194, 194, 194, 194, 194, 35, 116, 34, 99, 50, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 76, + 0, 12, 64, 20, 6, 240, 240, 114, 66, 240, 195, 66, + 66, 66, 66, 66, 66, 66, 66, 52, 240, 240, 224, 27, + 8, 0, 6, 66, 98, 240, 240, 100, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 34, 34, 33, 49, + 67, 192, 32, 14, 0, 10, 68, 194, 194, 194, 194, 194, + 194, 38, 66, 65, 114, 49, 130, 33, 146, 18, 149, 146, + 34, 130, 50, 114, 66, 70, 21, 0, 12, 64, 23, 8, + 0, 6, 4, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 70, 0, 7, 32, 36, 20, 0, + 30, 4, 35, 51, 116, 36, 34, 99, 51, 50, 98, 66, + 66, 98, 66, 66, 98, 66, 66, 98, 66, 66, 98, 66, + 66, 98, 66, 66, 79, 3, 0, 17, 96, 26, 14, 0, + 21, 4, 35, 116, 34, 99, 50, 98, 66, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 76, 0, 12, 64, 25, + 11, 0, 16, 101, 82, 50, 65, 81, 50, 82, 34, 82, + 34, 82, 34, 82, 49, 81, 66, 50, 85, 0, 10, 16, + 32, 13, 0, 19, 68, 20, 99, 50, 82, 81, 82, 82, + 66, 82, 66, 82, 66, 82, 66, 82, 67, 50, 82, 20, + 98, 178, 178, 178, 178, 150, 240, 80, 32, 13, 0, 19, + 100, 33, 82, 49, 17, 81, 67, 66, 82, 66, 82, 66, + 82, 66, 82, 66, 67, 82, 51, 100, 18, 178, 178, 178, + 178, 178, 150, 240, 20, 10, 0, 15, 4, 19, 67, 18, + 67, 18, 66, 130, 130, 130, 130, 130, 102, 0, 9, 32, + 23, 9, 0, 13, 83, 81, 50, 49, 65, 50, 132, 115, + 49, 66, 33, 81, 34, 65, 33, 20, 0, 8, 32, 27, + 10, 0, 9, 17, 145, 145, 130, 130, 103, 82, 130, 130, + 130, 49, 66, 49, 66, 49, 66, 49, 66, 49, 84, 0, + 9, 16, 28, 14, 0, 21, 4, 36, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 51, 98, 33, + 18, 115, 36, 0, 12, 64, 24, 13, 0, 19, 69, 21, + 65, 81, 98, 49, 129, 49, 129, 49, 130, 17, 161, 17, + 162, 178, 193, 0, 12, 32, 36, 17, 0, 25, 74, 20, + 65, 66, 49, 98, 50, 49, 98, 33, 17, 49, 113, 33, + 18, 17, 130, 17, 18, 17, 131, 49, 17, 146, 50, 162, + 50, 161, 81, 0, 15, 80, 25, 13, 0, 19, 69, 21, + 66, 50, 114, 33, 145, 17, 162, 194, 161, 18, 129, 34, + 113, 66, 68, 22, 0, 11, 80, 31, 13, 0, 19, 69, + 21, 65, 81, 98, 65, 98, 49, 129, 49, 130, 33, 145, + 17, 163, 162, 193, 193, 177, 193, 130, 33, 129, 33, 163, + 240, 112, 21, 10, 0, 15, 23, 49, 50, 65, 50, 114, + 114, 130, 114, 49, 50, 65, 50, 65, 40, 0, 9, 28, + 9, 0, 6, 33, 98, 98, 114, 114, 115, 114, 114, 114, + 114, 98, 82, 146, 130, 114, 114, 114, 99, 98, 114, 114, + 130, 146, 176, 25, 3, 240, 49, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 128, 28, 8, 240, 240, 161, 130, 114, 98, + 98, 83, 82, 98, 98, 98, 114, 130, 66, 82, 98, 98, + 98, 99, 98, 98, 98, 82, 81, 240, 11, 12, 0, 22, + 100, 49, 34, 52, 0, 18, 48, 5, 9, 0, 32, 80, + 20, 5, 0, 7, 67, 35, 49, 145, 65, 65, 65, 65, + 65, 50, 51, 35, 35, 35, 35, 112, 38, 10, 0, 9, + 81, 145, 129, 145, 145, 100, 66, 33, 17, 49, 51, 34, + 33, 18, 34, 33, 82, 33, 82, 17, 113, 17, 49, 51, + 49, 84, 81, 145, 129, 145, 129, 145, 240, 64, 30, 13, + 0, 10, 68, 114, 50, 82, 51, 82, 50, 97, 178, 178, + 178, 152, 114, 178, 177, 177, 129, 52, 66, 33, 54, 49, + 83, 0, 11, 112, 27, 11, 0, 16, 65, 21, 17, 50, + 50, 50, 82, 33, 113, 33, 113, 33, 113, 34, 82, 50, + 50, 49, 21, 17, 0, 11, 32, 30, 15, 0, 11, 37, + 53, 65, 113, 98, 81, 129, 81, 130, 49, 161, 49, 162, + 17, 153, 146, 210, 169, 146, 210, 210, 210, 182, 0, 13, + 112, 21, 3, 240, 49, 33, 33, 33, 33, 33, 33, 33, + 240, 33, 33, 33, 33, 33, 33, 33, 33, 128, 38, 9, + 0, 7, 3, 81, 34, 65, 34, 65, 130, 129, 115, 81, + 34, 65, 50, 49, 66, 33, 81, 34, 65, 50, 49, 66, + 33, 83, 113, 130, 129, 66, 33, 66, 17, 98, 240, 128, + 11, 9, 0, 9, 2, 50, 34, 50, 0, 21, 80, 53, + 18, 0, 14, 22, 162, 98, 113, 66, 65, 81, 50, 34, + 49, 65, 34, 65, 49, 49, 34, 81, 65, 33, 34, 161, + 33, 34, 161, 33, 34, 161, 33, 34, 161, 33, 49, 81, + 65, 49, 34, 49, 65, 65, 67, 81, 81, 161, 114, 98, + 166, 0, 16, 80, 17, 8, 0, 6, 19, 66, 33, 113, + 68, 49, 50, 33, 35, 50, 0, 16, 80, 22, 9, 0, + 15, 1, 113, 49, 65, 33, 65, 33, 66, 18, 81, 33, + 97, 33, 81, 49, 0, 9, 32, 12, 13, 0, 22, 107, + 193, 193, 193, 193, 0, 16, 64, 8, 9, 0, 19, 23, + 0, 12, 80, 56, 18, 0, 14, 22, 162, 98, 113, 161, + 81, 24, 49, 65, 50, 50, 33, 49, 66, 50, 49, 33, + 66, 50, 49, 33, 70, 65, 33, 66, 33, 81, 33, 66, + 34, 65, 33, 66, 34, 33, 17, 49, 50, 49, 34, 65, + 22, 19, 17, 81, 161, 114, 98, 166, 0, 16, 80, 8, + 8, 0, 9, 6, 0, 19, 32, 21, 10, 0, 7, 100, + 81, 65, 49, 97, 33, 97, 33, 97, 33, 97, 49, 65, + 84, 0, 19, 32, 19, 13, 0, 16, 113, 193, 193, 193, + 193, 123, 113, 193, 193, 193, 193, 240, 91, 0, 10, 20, + 8, 0, 6, 20, 49, 50, 33, 50, 35, 18, 97, 97, + 97, 97, 49, 38, 0, 14, 32, 20, 8, 0, 6, 20, + 49, 50, 49, 34, 97, 67, 130, 34, 34, 33, 50, 51, + 0, 14, 64, 11, 6, 240, 240, 130, 66, 49, 65, 0, + 14, 112, 33, 15, 0, 24, 98, 66, 114, 66, 113, 81, + 114, 66, 114, 66, 114, 66, 114, 51, 33, 51, 51, 17, + 66, 19, 34, 81, 225, 210, 210, 209, 240, 240, 224, 47, + 12, 0, 9, 55, 52, 33, 84, 33, 84, 33, 69, 33, + 84, 33, 84, 33, 99, 33, 129, 33, 129, 33, 129, 33, + 129, 33, 129, 33, 129, 33, 129, 33, 129, 33, 129, 33, + 129, 33, 129, 33, 129, 33, 129, 33, 240, 208, 10, 5, + 0, 8, 113, 51, 35, 0, 7, 96, 11, 7, 0, 19, + 65, 83, 98, 82, 35, 240, 48, 14, 5, 240, 242, 65, + 65, 65, 65, 65, 65, 65, 51, 0, 9, 19, 8, 0, + 6, 20, 49, 65, 33, 65, 33, 65, 33, 65, 49, 33, + 82, 0, 16, 64, 23, 9, 0, 14, 81, 33, 81, 49, + 81, 33, 97, 33, 82, 18, 65, 33, 65, 33, 65, 33, + 0, 9, 80, 44, 16, 0, 12, 2, 145, 81, 129, 97, + 129, 97, 113, 113, 97, 129, 97, 129, 81, 145, 65, 81, + 51, 49, 66, 129, 82, 113, 81, 17, 113, 65, 33, 97, + 81, 33, 81, 86, 65, 145, 65, 146, 0, 14, 48, 45, + 16, 0, 12, 2, 129, 97, 129, 97, 113, 113, 97, 129, + 97, 129, 81, 145, 81, 145, 65, 50, 67, 33, 34, 34, + 113, 33, 50, 97, 51, 18, 97, 113, 97, 113, 97, 113, + 113, 97, 49, 49, 102, 0, 14, 32, 47, 17, 0, 12, + 116, 113, 66, 34, 81, 146, 81, 99, 97, 162, 49, 178, + 49, 114, 34, 33, 129, 50, 33, 65, 67, 49, 66, 145, + 82, 145, 65, 17, 129, 65, 33, 113, 81, 33, 113, 85, + 81, 145, 97, 145, 0, 15, 32, 24, 9, 0, 14, 3, + 99, 113, 129, 129, 129, 114, 84, 66, 98, 113, 129, 129, + 66, 33, 66, 49, 65, 68, 192, 44, 18, 240, 130, 240, + 19, 240, 34, 240, 49, 240, 240, 65, 240, 18, 240, 18, + 240, 19, 225, 18, 225, 18, 210, 19, 193, 50, 193, 50, + 178, 51, 168, 161, 82, 145, 99, 129, 114, 114, 114, 87, + 24, 0, 16, 40, 17, 240, 178, 227, 210, 225, 240, 240, + 65, 240, 18, 242, 227, 225, 18, 209, 18, 193, 34, 193, + 35, 177, 50, 161, 66, 168, 145, 82, 129, 98, 129, 98, + 114, 114, 71, 23, 0, 15, 16, 40, 17, 240, 146, 228, + 194, 34, 161, 97, 240, 241, 242, 242, 227, 225, 18, 209, + 18, 193, 34, 193, 50, 177, 50, 161, 66, 168, 145, 82, + 129, 98, 129, 114, 98, 114, 71, 23, 0, 15, 16, 39, + 17, 240, 240, 147, 209, 36, 0, 6, 1, 242, 242, 227, + 225, 18, 209, 18, 193, 34, 193, 50, 177, 50, 161, 66, + 168, 145, 82, 129, 98, 129, 114, 98, 114, 71, 23, 0, + 15, 16, 40, 18, 240, 240, 178, 50, 178, 50, 0, 6, + 33, 240, 33, 240, 19, 243, 243, 225, 19, 209, 34, 209, + 34, 193, 50, 193, 51, 168, 161, 82, 161, 83, 130, 98, + 130, 99, 71, 39, 0, 16, 42, 17, 100, 193, 65, 177, + 65, 177, 65, 196, 240, 240, 33, 242, 242, 227, 225, 18, + 209, 18, 193, 34, 193, 50, 177, 50, 161, 66, 168, 145, + 82, 129, 98, 129, 99, 98, 114, 71, 23, 0, 15, 16, + 52, 26, 0, 20, 79, 243, 98, 225, 18, 113, 210, 18, + 113, 209, 34, 65, 33, 193, 50, 65, 33, 178, 50, 65, + 225, 66, 50, 221, 194, 82, 50, 193, 98, 65, 49, 113, + 114, 65, 49, 98, 114, 114, 97, 130, 114, 82, 130, 99, + 40, 46, 0, 23, 40, 15, 0, 11, 101, 49, 81, 81, + 18, 65, 115, 50, 130, 49, 146, 34, 161, 34, 161, 34, + 210, 210, 210, 225, 145, 66, 129, 81, 129, 97, 82, 133, + 193, 211, 211, 210, 210, 149, 240, 112, 44, 16, 240, 82, + 227, 242, 240, 17, 240, 141, 98, 98, 98, 113, 98, 113, + 98, 65, 33, 98, 65, 146, 50, 151, 146, 50, 146, 65, + 146, 65, 49, 82, 65, 33, 98, 114, 82, 114, 82, 99, + 46, 0, 14, 32, 44, 16, 240, 161, 226, 209, 240, 240, + 173, 98, 98, 98, 113, 98, 113, 98, 65, 33, 98, 65, + 33, 98, 50, 151, 146, 50, 146, 65, 146, 65, 49, 82, + 65, 34, 82, 114, 82, 114, 82, 99, 46, 0, 14, 32, + 44, 16, 240, 129, 227, 178, 49, 240, 240, 141, 98, 98, + 98, 113, 98, 113, 98, 65, 33, 98, 65, 146, 50, 151, + 146, 50, 146, 65, 146, 65, 49, 82, 65, 33, 98, 114, + 82, 114, 82, 99, 46, 0, 14, 32, 46, 16, 240, 240, + 98, 50, 146, 50, 240, 240, 125, 98, 98, 98, 113, 98, + 113, 98, 65, 33, 98, 65, 33, 98, 50, 151, 146, 50, + 146, 65, 146, 65, 49, 82, 65, 34, 82, 114, 82, 114, + 82, 99, 46, 0, 14, 32, 25, 9, 146, 115, 130, 145, + 215, 66, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 87, 0, 8, 16, 25, 9, 226, 99, 82, + 97, 247, 82, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 71, 0, 8, 16, 26, 10, 210, 116, + 81, 65, 49, 97, 200, 82, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 88, 0, 9, 26, 10, + 240, 82, 66, 34, 66, 240, 120, 82, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, 0, 9, + 37, 17, 0, 12, 107, 146, 97, 130, 113, 114, 114, 98, + 129, 98, 130, 82, 130, 40, 82, 82, 130, 82, 130, 82, + 130, 82, 129, 98, 114, 98, 113, 114, 97, 91, 0, 15, + 80, 52, 18, 240, 240, 180, 49, 145, 52, 240, 240, 197, + 86, 82, 129, 115, 113, 116, 97, 113, 19, 81, 113, 34, + 81, 113, 50, 65, 113, 51, 49, 113, 66, 49, 113, 82, + 33, 113, 98, 17, 113, 100, 113, 115, 113, 130, 113, 130, + 71, 97, 0, 16, 32, 42, 16, 240, 81, 243, 242, 240, + 17, 240, 198, 145, 97, 113, 129, 82, 130, 65, 161, 50, + 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, 49, + 161, 66, 130, 81, 129, 113, 97, 150, 0, 14, 96, 41, + 16, 240, 161, 211, 194, 209, 240, 246, 145, 97, 113, 129, + 82, 130, 65, 161, 50, 162, 34, 162, 34, 162, 34, 162, + 34, 162, 34, 162, 49, 161, 66, 130, 81, 129, 113, 97, + 150, 0, 14, 96, 43, 16, 240, 114, 212, 178, 34, 145, + 97, 240, 166, 145, 97, 113, 129, 82, 130, 65, 161, 50, + 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, 49, + 161, 66, 130, 81, 129, 113, 97, 150, 0, 14, 96, 43, + 16, 240, 240, 99, 65, 98, 37, 240, 240, 182, 145, 97, + 113, 129, 82, 130, 65, 161, 50, 162, 34, 162, 34, 162, + 34, 162, 34, 162, 34, 162, 49, 161, 66, 130, 81, 129, + 113, 97, 150, 0, 14, 96, 43, 16, 240, 240, 82, 66, + 130, 66, 240, 240, 182, 145, 97, 113, 129, 82, 130, 65, + 161, 50, 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, + 162, 49, 161, 66, 130, 81, 129, 113, 97, 150, 0, 14, + 96, 23, 10, 0, 15, 1, 97, 49, 66, 65, 34, 99, + 114, 114, 17, 82, 49, 50, 81, 33, 97, 0, 10, 32, + 47, 16, 0, 12, 85, 49, 82, 68, 81, 115, 66, 115, + 65, 114, 17, 50, 98, 34, 34, 82, 50, 34, 66, 66, + 34, 66, 66, 34, 50, 82, 34, 34, 98, 49, 18, 113, + 67, 114, 67, 113, 84, 81, 81, 54, 0, 14, 96, 44, + 19, 240, 161, 240, 51, 240, 50, 0, 5, 120, 39, 82, + 129, 130, 129, 130, 129, 130, 129, 130, 129, 130, 129, 130, + 129, 130, 129, 130, 129, 130, 129, 130, 129, 130, 129, 130, + 114, 146, 97, 198, 0, 17, 64, 44, 19, 240, 226, 240, + 19, 242, 240, 17, 240, 248, 39, 82, 129, 130, 129, 130, + 129, 130, 129, 130, 129, 130, 129, 130, 129, 130, 129, 130, + 129, 130, 129, 130, 129, 130, 129, 130, 114, 146, 97, 198, + 0, 17, 64, 45, 19, 240, 194, 240, 19, 241, 50, 193, + 240, 240, 40, 39, 82, 129, 130, 129, 130, 129, 130, 129, + 130, 129, 130, 129, 130, 129, 130, 129, 130, 129, 130, 129, + 130, 129, 130, 129, 130, 114, 146, 97, 198, 0, 17, 64, + 44, 19, 240, 240, 210, 50, 194, 50, 240, 240, 248, 39, + 82, 129, 130, 129, 130, 129, 130, 129, 130, 129, 130, 129, + 130, 129, 130, 129, 130, 129, 130, 129, 130, 129, 130, 129, + 130, 114, 146, 97, 198, 0, 17, 64, 42, 18, 240, 209, + 240, 18, 226, 240, 240, 247, 54, 67, 114, 114, 113, 146, + 81, 163, 50, 178, 49, 210, 17, 226, 17, 242, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 216, 0, + 16, 64, 44, 14, 0, 10, 83, 66, 68, 37, 82, 17, + 50, 83, 67, 66, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 66, 98, 66, 97, 82, 82, 82, 81, 98, 65, 114, + 34, 132, 162, 194, 194, 194, 162, 240, 240, 160, 40, 13, + 0, 10, 37, 114, 50, 82, 66, 82, 66, 82, 66, 82, + 50, 98, 18, 130, 50, 98, 66, 82, 82, 66, 82, 66, + 82, 66, 82, 66, 18, 34, 66, 17, 49, 52, 35, 0, + 11, 112, 35, 12, 0, 9, 18, 178, 177, 193, 240, 240, + 52, 113, 65, 98, 50, 82, 50, 132, 83, 34, 17, 34, + 66, 17, 34, 66, 17, 34, 51, 17, 52, 19, 0, 10, + 112, 35, 12, 0, 9, 98, 146, 146, 161, 240, 240, 52, + 113, 65, 98, 50, 82, 50, 132, 83, 34, 17, 34, 66, + 17, 34, 66, 17, 34, 51, 17, 52, 19, 0, 10, 112, + 36, 12, 0, 9, 65, 163, 129, 34, 97, 81, 240, 244, + 113, 65, 98, 50, 82, 50, 132, 83, 34, 17, 34, 66, + 17, 34, 66, 17, 34, 51, 17, 52, 19, 0, 10, 112, + 33, 12, 0, 12, 20, 114, 36, 240, 244, 113, 65, 98, + 50, 82, 50, 132, 83, 34, 17, 34, 66, 17, 34, 66, + 17, 34, 51, 17, 52, 19, 0, 10, 112, 35, 12, 0, + 12, 18, 34, 98, 34, 240, 240, 20, 113, 49, 114, 34, + 98, 34, 132, 98, 34, 33, 34, 50, 33, 34, 50, 33, + 34, 35, 33, 51, 35, 0, 10, 112, 38, 12, 0, 9, + 36, 113, 65, 97, 65, 97, 65, 116, 240, 84, 113, 65, + 98, 50, 82, 50, 132, 83, 34, 17, 34, 66, 17, 34, + 66, 17, 34, 51, 17, 52, 19, 0, 10, 112, 33, 16, + 0, 24, 36, 36, 81, 67, 49, 66, 50, 65, 66, 50, + 66, 106, 51, 34, 130, 66, 81, 34, 66, 81, 34, 49, + 18, 49, 68, 52, 0, 14, 64, 26, 10, 0, 15, 52, + 66, 65, 49, 66, 34, 66, 34, 130, 130, 145, 81, 50, + 65, 69, 113, 131, 146, 130, 98, 240, 160, 27, 10, 0, + 7, 97, 146, 146, 145, 240, 196, 82, 49, 65, 66, 34, + 66, 40, 34, 130, 145, 81, 50, 65, 69, 0, 9, 16, + 28, 10, 0, 8, 33, 130, 129, 129, 240, 196, 82, 49, + 65, 66, 34, 66, 40, 34, 130, 81, 49, 81, 50, 49, + 84, 0, 9, 32, 29, 10, 0, 8, 1, 131, 98, 33, + 65, 81, 240, 148, 82, 49, 65, 66, 34, 66, 40, 34, + 130, 145, 81, 50, 65, 69, 0, 9, 16, 28, 11, 0, + 11, 18, 50, 66, 50, 240, 196, 98, 50, 65, 81, 50, + 81, 56, 50, 146, 97, 49, 81, 66, 65, 85, 0, 10, + 16, 22, 8, 0, 6, 1, 114, 114, 114, 240, 84, 98, + 98, 98, 98, 98, 98, 98, 98, 70, 0, 7, 32, 22, + 7, 0, 5, 97, 82, 66, 81, 240, 52, 82, 82, 82, + 82, 82, 82, 82, 82, 53, 0, 6, 48, 24, 8, 0, + 6, 33, 99, 81, 17, 65, 49, 240, 68, 98, 98, 98, + 98, 98, 98, 98, 98, 70, 0, 7, 32, 22, 8, 0, + 8, 2, 34, 34, 34, 240, 67, 98, 98, 98, 98, 98, + 98, 98, 98, 85, 0, 7, 32, 36, 13, 0, 10, 2, + 97, 66, 67, 82, 18, 33, 98, 116, 18, 98, 66, 149, + 113, 51, 82, 66, 66, 83, 50, 98, 50, 98, 50, 98, + 50, 97, 82, 66, 116, 0, 12, 32, 14, 0, 14, 51, + 49, 97, 36, 240, 240, 52, 35, 116, 34, 99, 50, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 76, + 0, 12, 64, 30, 11, 0, 8, 65, 162, 161, 177, 240, + 245, 82, 50, 65, 81, 50, 82, 34, 82, 34, 82, 34, + 82, 49, 81, 66, 50, 85, 0, 10, 16, 30, 11, 0, + 9, 1, 146, 130, 145, 240, 245, 82, 50, 65, 81, 50, + 82, 34, 82, 34, 82, 34, 82, 49, 81, 66, 50, 85, + 0, 10, 16, 32, 11, 0, 8, 97, 147, 114, 18, 81, + 240, 240, 53, 82, 50, 65, 81, 50, 82, 34, 82, 34, + 82, 34, 82, 49, 81, 66, 50, 85, 0, 10, 16, 30, + 11, 0, 11, 35, 33, 65, 36, 240, 197, 82, 50, 65, + 81, 50, 82, 34, 82, 34, 82, 34, 82, 49, 81, 66, + 50, 85, 0, 10, 16, 30, 11, 0, 11, 18, 50, 66, + 50, 240, 197, 82, 50, 65, 81, 50, 82, 34, 82, 34, + 82, 34, 82, 49, 81, 66, 50, 85, 0, 10, 16, 17, + 13, 0, 20, 3, 163, 177, 240, 91, 240, 240, 35, 163, + 177, 0, 12, 32, 31, 11, 0, 16, 100, 33, 50, 50, + 65, 66, 50, 49, 18, 34, 33, 34, 34, 33, 34, 34, + 17, 50, 50, 66, 50, 50, 49, 36, 0, 10, 16, 34, + 14, 0, 10, 98, 195, 209, 225, 240, 240, 100, 36, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, + 51, 98, 33, 18, 115, 36, 0, 12, 64, 34, 14, 0, + 11, 49, 194, 193, 193, 240, 240, 100, 36, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 51, 98, + 33, 18, 115, 36, 0, 12, 64, 36, 14, 0, 11, 17, + 195, 161, 49, 129, 81, 240, 240, 52, 36, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 51, 98, + 33, 18, 115, 36, 0, 12, 64, 34, 14, 0, 14, 34, + 50, 114, 50, 240, 240, 52, 51, 98, 66, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 51, 98, 33, 18, + 115, 36, 0, 12, 64, 37, 13, 0, 10, 81, 178, 162, + 161, 240, 240, 69, 21, 65, 81, 98, 65, 98, 49, 129, + 49, 130, 33, 145, 17, 163, 163, 177, 193, 177, 193, 130, + 33, 129, 33, 163, 240, 112, 37, 12, 0, 10, 113, 132, + 162, 162, 162, 162, 20, 83, 34, 82, 66, 66, 66, 66, + 66, 66, 66, 66, 65, 82, 50, 82, 34, 98, 18, 115, + 146, 162, 162, 162, 130, 240, 112, 37, 12, 0, 12, 34, + 34, 98, 34, 240, 213, 20, 65, 81, 82, 49, 98, 49, + 113, 49, 114, 17, 145, 17, 145, 17, 146, 177, 161, 177, + 177, 114, 17, 129, 33, 146, 240, 96, +}; + +//***************************************************************************** +// +// The glyph offset table for the 22 point Theanomodern font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanomodern22[] = +{ + 0, 5, 26, 45, 82, 141, 192, 239, + 251, 278, 305, 330, 348, 361, 369, 379, + 406, 443, 465, 496, 528, 557, 587, 622, + 650, 685, 721, 735, 751, 769, 779, 797, + 823, 881, 915, 951, 986, 1023, 1062, 1095, + 1135, 1173, 1195, 1223, 1261, 1290, 1350, 1396, + 1433, 1462, 1510, 1550, 1586, 1621, 1659, 1694, + 1751, 1786, 1823, 1858, 1885, 1912, 1939, 1960, + 1968, 1979, 2008, 2042, 2064, 2097, 2119, 2144, + 2179, 2211, 2231, 2258, 2290, 2313, 2349, 2375, + 2400, 2432, 2464, 2484, 2507, 2534, 2562, 2586, + 2622, 2647, 2678, 2699, 2727, 2752, 2780, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2791, 2796, 2816, 2854, 2884, 2911, 2941, 2962, + 3000, 3011, 3064, 3081, 3103, 3115, 3123, 3179, + 3187, 3208, 3227, 3247, 3267, 3278, 3311, 3358, + 3368, 3379, 3393, 3412, 3435, 3479, 3524, 3571, + 3595, 3639, 3679, 3719, 3758, 3798, 3840, 3892, + 3932, 3976, 4020, 4064, 4110, 4135, 4160, 4186, + 4212, 4249, 4301, 4343, 4384, 4427, 4470, 4513, + 4536, 4583, 4627, 4671, 4716, 4760, 4802, 4846, + 4886, 4921, 4956, 4992, 5025, 5060, 5098, 5131, + 5157, 5184, 5212, 5241, 5269, 5291, 5313, 5337, + 5359, 5395, 5427, 5457, 5487, 5519, 5549, 5579, + 5596, 5627, 5661, 5695, 5731, 5765, 5802, 5839, +}; + +//***************************************************************************** +// +// The font definition for the 22 point Theanomodern font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanomodern22 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 23, + + // + // The height of the font. + // + 29, + + // + // The baseline of the font. + // + 22, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanomodern22, + + // + // A pointer to the actual font data + // + g_pui8Theanomodern22Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanomodern24.c b/third_party/fonts/ofl/fonts/fonttheanomodern24.c new file mode 100644 index 0000000..67800e4 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanomodern24.c @@ -0,0 +1,764 @@ +//***************************************************************************** +// +// fonttheanomodern24.c - Font definition for the 24pt Theanomodern font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanomodern +// Size: 24 point +// Bold: no +// Italic: no +// Memory usage: 6732 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 24 point Theanomodern font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanomodern24Data[6531] = +{ + 4, 10, 0, 40, 22, 5, 240, 243, 35, 35, 35, 35, + 35, 49, 65, 65, 65, 65, 65, 65, 211, 35, 35, 240, + 240, 192, 21, 8, 0, 6, 2, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 33, 49, 0, 19, 48, 41, + 14, 0, 11, 17, 65, 114, 49, 129, 65, 129, 65, 129, + 65, 129, 65, 76, 81, 65, 129, 65, 129, 65, 129, 65, + 129, 65, 92, 65, 65, 129, 65, 129, 65, 129, 49, 129, + 65, 0, 14, 112, 63, 14, 0, 9, 33, 17, 165, 131, + 17, 17, 97, 33, 17, 33, 66, 33, 17, 18, 66, 33, + 17, 18, 67, 17, 17, 117, 17, 134, 150, 166, 129, 21, + 113, 17, 35, 35, 17, 17, 50, 35, 17, 17, 50, 34, + 33, 17, 50, 34, 33, 17, 34, 66, 17, 17, 18, 117, + 161, 17, 177, 17, 0, 11, 48, 58, 18, 0, 13, 99, + 113, 98, 18, 97, 82, 50, 65, 98, 50, 49, 114, 50, + 49, 114, 50, 33, 130, 50, 33, 146, 18, 33, 179, 49, + 240, 17, 51, 177, 34, 18, 145, 34, 50, 129, 34, 50, + 113, 50, 50, 113, 50, 50, 97, 66, 50, 81, 98, 18, + 97, 115, 0, 18, 64, 50, 18, 0, 14, 4, 210, 34, + 194, 49, 194, 49, 194, 49, 195, 17, 227, 243, 38, 100, + 66, 113, 35, 49, 114, 50, 49, 98, 67, 33, 98, 82, + 33, 49, 34, 84, 65, 34, 98, 81, 35, 83, 49, 66, + 68, 49, 85, 52, 0, 18, 64, 13, 4, 240, 146, 34, + 34, 34, 34, 34, 33, 0, 9, 112, 30, 9, 0, 7, + 65, 113, 113, 113, 114, 113, 114, 114, 113, 114, 114, 114, + 114, 114, 114, 114, 129, 130, 114, 129, 130, 130, 129, 145, + 145, 176, 31, 9, 0, 6, 97, 145, 145, 145, 130, 129, + 130, 114, 129, 130, 114, 114, 114, 114, 114, 114, 113, 114, + 114, 113, 114, 98, 113, 113, 113, 240, 32, 26, 10, 0, + 7, 114, 130, 130, 81, 33, 34, 34, 17, 19, 67, 115, + 82, 17, 19, 33, 33, 49, 82, 130, 0, 19, 48, 19, + 14, 0, 21, 82, 194, 194, 194, 194, 124, 114, 194, 194, + 194, 194, 194, 0, 14, 112, 14, 5, 0, 13, 18, 51, + 35, 65, 65, 49, 65, 49, 240, 64, 8, 9, 0, 21, + 55, 0, 13, 96, 10, 5, 0, 13, 19, 35, 35, 240, + 240, 192, 30, 8, 0, 6, 81, 113, 113, 98, 97, 113, + 113, 113, 98, 97, 113, 113, 98, 97, 113, 113, 98, 97, + 113, 113, 113, 98, 97, 240, 240, 16, 41, 13, 0, 10, + 35, 130, 50, 97, 81, 82, 82, 66, 82, 50, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 49, 98, 66, 82, 81, 81, 98, 50, 131, 0, 13, + 96, 25, 10, 0, 7, 114, 85, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, 0, + 10, 32, 35, 12, 0, 9, 52, 98, 51, 65, 82, 49, + 114, 33, 114, 36, 66, 36, 66, 50, 66, 162, 146, 161, + 161, 161, 161, 81, 65, 97, 49, 113, 57, 42, 0, 12, + 32, 35, 12, 0, 9, 37, 98, 66, 50, 83, 34, 98, + 36, 66, 51, 66, 161, 161, 101, 193, 193, 178, 35, 82, + 35, 82, 34, 98, 34, 82, 66, 66, 85, 0, 12, 80, + 32, 13, 0, 10, 81, 178, 178, 163, 163, 145, 18, 129, + 34, 129, 34, 113, 50, 113, 50, 97, 66, 81, 82, 91, + 130, 178, 178, 178, 136, 0, 13, 32, 34, 12, 0, 9, + 17, 97, 71, 86, 97, 177, 177, 177, 177, 20, 98, 51, + 65, 82, 178, 162, 50, 82, 36, 66, 35, 82, 33, 98, + 65, 66, 101, 0, 12, 80, 40, 12, 0, 9, 69, 98, + 35, 65, 67, 50, 67, 49, 82, 65, 162, 162, 35, 82, + 17, 50, 51, 66, 50, 98, 34, 98, 34, 98, 34, 98, + 49, 98, 50, 66, 82, 50, 100, 0, 12, 80, 31, 13, + 0, 6, 81, 193, 202, 58, 33, 129, 49, 113, 65, 113, + 65, 97, 193, 177, 193, 178, 177, 178, 178, 163, 163, 163, + 163, 163, 0, 13, 112, 40, 13, 0, 10, 36, 114, 51, + 81, 83, 49, 114, 49, 114, 49, 114, 50, 97, 83, 49, + 117, 114, 20, 82, 67, 50, 99, 34, 114, 34, 114, 34, + 114, 50, 82, 67, 51, 101, 0, 13, 80, 40, 12, 0, + 9, 52, 98, 50, 82, 66, 50, 97, 50, 97, 50, 98, + 34, 98, 34, 98, 50, 67, 50, 49, 18, 83, 34, 162, + 161, 82, 65, 67, 50, 66, 65, 82, 49, 116, 0, 12, + 96, 14, 5, 0, 8, 19, 35, 35, 240, 195, 35, 35, + 240, 240, 192, 18, 5, 0, 8, 19, 35, 35, 240, 194, + 51, 35, 65, 65, 49, 65, 49, 240, 64, 19, 13, 0, + 20, 82, 147, 131, 131, 131, 146, 179, 194, 210, 210, 210, + 209, 0, 13, 32, 11, 14, 0, 26, 44, 240, 240, 236, + 0, 21, 32, 19, 13, 0, 19, 66, 210, 195, 195, 195, + 194, 163, 131, 146, 146, 146, 161, 0, 14, 64, 28, 10, + 0, 7, 100, 66, 50, 50, 66, 35, 65, 49, 81, 145, + 130, 114, 84, 98, 129, 145, 145, 240, 211, 115, 115, 0, + 10, 96, 66, 21, 0, 24, 86, 195, 83, 146, 146, 114, + 178, 82, 209, 66, 83, 34, 34, 50, 50, 49, 18, 49, + 34, 50, 67, 65, 34, 50, 67, 65, 34, 34, 83, 65, + 34, 34, 82, 81, 34, 34, 82, 65, 50, 34, 67, 65, + 50, 34, 49, 18, 49, 82, 36, 52, 98, 240, 82, 193, + 114, 162, 146, 98, 214, 0, 8, 112, 41, 19, 0, 15, + 49, 240, 49, 240, 35, 240, 19, 240, 19, 241, 19, 225, + 34, 210, 34, 209, 51, 193, 51, 178, 66, 184, 177, 83, + 146, 98, 145, 114, 145, 115, 114, 115, 72, 39, 0, 19, + 32, 40, 17, 0, 12, 107, 146, 98, 114, 99, 98, 114, + 98, 114, 98, 114, 98, 98, 114, 82, 136, 146, 98, 114, + 114, 98, 130, 82, 130, 82, 130, 82, 130, 82, 114, 98, + 99, 60, 0, 17, 80, 39, 16, 0, 12, 84, 65, 82, + 66, 18, 66, 100, 50, 131, 50, 146, 49, 162, 34, 177, + 34, 177, 34, 226, 226, 226, 226, 161, 66, 145, 66, 145, + 82, 113, 114, 66, 165, 0, 16, 96, 41, 18, 0, 13, + 75, 162, 98, 130, 114, 114, 130, 98, 130, 98, 146, 82, + 146, 82, 146, 82, 146, 82, 146, 82, 146, 82, 146, 82, + 146, 82, 130, 98, 130, 98, 114, 114, 98, 91, 0, 18, + 112, 44, 17, 0, 12, 110, 98, 99, 98, 114, 98, 129, + 98, 129, 98, 65, 49, 98, 65, 49, 98, 50, 167, 162, + 50, 162, 65, 162, 65, 65, 82, 65, 50, 82, 130, 82, + 130, 82, 115, 82, 100, 47, 0, 17, 32, 37, 16, 0, + 12, 14, 82, 99, 82, 114, 82, 129, 82, 129, 82, 65, + 49, 82, 65, 49, 82, 50, 151, 146, 50, 146, 65, 146, + 65, 146, 65, 146, 226, 226, 226, 184, 0, 17, 46, 18, + 0, 14, 20, 65, 114, 66, 18, 98, 100, 82, 131, 82, + 146, 81, 162, 66, 162, 66, 177, 66, 240, 18, 89, 34, + 146, 82, 146, 82, 146, 98, 130, 98, 130, 114, 97, 17, + 130, 66, 17, 164, 49, 0, 18, 80, 42, 20, 0, 15, + 8, 40, 82, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 140, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, 40, 0, + 20, 32, 25, 10, 0, 7, 72, 82, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, + 0, 10, 32, 29, 14, 0, 11, 8, 146, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 98, 66, 84, 50, 84, + 50, 81, 82, 113, 66, 132, 0, 15, 43, 20, 0, 15, + 8, 40, 82, 115, 130, 114, 146, 113, 162, 97, 178, 66, + 194, 50, 210, 34, 226, 20, 211, 34, 210, 51, 194, 67, + 178, 83, 162, 98, 162, 99, 146, 115, 130, 116, 72, 40, + 0, 20, 32, 32, 16, 0, 12, 6, 194, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 145, 66, 145, 66, 145, 66, + 130, 66, 130, 66, 115, 66, 100, 46, 0, 16, 32, 68, + 24, 0, 18, 6, 166, 83, 163, 132, 132, 129, 18, 129, + 18, 129, 18, 129, 18, 129, 19, 97, 34, 129, 34, 97, + 34, 129, 35, 66, 34, 129, 35, 65, 50, 129, 50, 65, + 50, 129, 51, 34, 50, 129, 66, 33, 66, 129, 66, 18, + 66, 129, 68, 82, 129, 83, 82, 129, 83, 82, 129, 97, + 98, 87, 49, 56, 0, 24, 32, 52, 19, 0, 14, 37, + 102, 67, 145, 115, 129, 116, 113, 113, 19, 97, 113, 19, + 97, 113, 35, 81, 113, 51, 65, 113, 66, 65, 113, 67, + 49, 113, 83, 33, 113, 99, 17, 113, 114, 17, 113, 116, + 113, 131, 113, 146, 99, 145, 71, 113, 0, 19, 64, 41, + 17, 0, 13, 53, 162, 82, 114, 114, 82, 146, 66, 146, + 65, 177, 50, 178, 34, 178, 34, 178, 34, 178, 34, 178, + 34, 178, 49, 177, 66, 146, 66, 146, 82, 114, 114, 82, + 165, 0, 17, 112, 32, 16, 0, 12, 11, 130, 83, 98, + 98, 98, 114, 82, 114, 82, 114, 82, 114, 82, 98, 98, + 83, 104, 130, 226, 226, 226, 226, 226, 226, 184, 0, 17, + 54, 17, 0, 13, 53, 162, 82, 114, 114, 82, 145, 82, + 146, 65, 177, 50, 178, 34, 178, 34, 178, 34, 178, 34, + 178, 34, 178, 49, 178, 50, 146, 81, 51, 50, 82, 17, + 49, 18, 115, 51, 166, 49, 177, 65, 177, 65, 178, 49, + 178, 33, 211, 0, 6, 112, 45, 19, 0, 14, 43, 178, + 83, 146, 98, 146, 114, 130, 114, 130, 114, 130, 114, 130, + 98, 152, 178, 82, 162, 97, 162, 98, 146, 98, 146, 98, + 49, 82, 98, 49, 82, 99, 33, 82, 114, 17, 56, 68, + 0, 19, 48, 40, 15, 0, 11, 100, 146, 66, 17, 66, + 114, 66, 129, 66, 129, 67, 113, 68, 197, 198, 181, 65, + 131, 50, 146, 34, 161, 35, 145, 35, 145, 36, 114, 34, + 33, 82, 50, 54, 0, 15, 64, 39, 17, 0, 12, 111, + 35, 50, 52, 34, 66, 82, 34, 66, 82, 33, 82, 82, + 33, 82, 97, 33, 82, 97, 33, 82, 97, 130, 242, 242, + 242, 242, 242, 242, 242, 242, 200, 0, 17, 96, 41, 20, + 0, 15, 8, 55, 82, 131, 114, 145, 130, 145, 130, 145, + 130, 145, 130, 145, 130, 145, 130, 145, 130, 145, 130, 145, + 130, 145, 130, 145, 130, 145, 130, 145, 146, 113, 163, 82, + 198, 0, 21, 42, 19, 0, 14, 40, 24, 67, 115, 114, + 114, 130, 113, 147, 97, 162, 97, 162, 81, 179, 65, 194, + 65, 194, 49, 211, 33, 226, 33, 226, 17, 244, 240, 19, + 240, 18, 240, 34, 240, 34, 0, 20, 32, 66, 27, 0, + 20, 40, 24, 23, 67, 99, 99, 114, 99, 98, 130, 99, + 97, 147, 84, 81, 162, 81, 18, 81, 162, 66, 18, 66, + 162, 65, 34, 65, 179, 49, 35, 49, 194, 49, 50, 49, + 194, 33, 66, 33, 211, 17, 67, 17, 226, 17, 82, 17, + 227, 99, 243, 99, 243, 99, 240, 17, 129, 240, 33, 129, + 0, 28, 32, 44, 20, 0, 15, 24, 24, 84, 98, 147, + 97, 178, 81, 195, 50, 210, 49, 242, 17, 240, 19, 240, + 50, 240, 51, 240, 17, 19, 226, 34, 225, 51, 193, 83, + 161, 99, 146, 115, 115, 116, 72, 40, 0, 20, 32, 43, + 20, 0, 15, 8, 55, 83, 114, 146, 114, 147, 97, 178, + 81, 195, 65, 210, 49, 242, 17, 240, 18, 17, 240, 34, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 248, 0, 20, 112, 39, 16, 0, 12, 29, 51, + 114, 66, 115, 66, 114, 81, 114, 97, 99, 97, 83, 113, + 82, 211, 195, 210, 97, 98, 113, 83, 113, 82, 129, 66, + 130, 51, 130, 50, 131, 46, 0, 16, 32, 30, 8, 0, + 6, 6, 34, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 102, 240, 48, 29, 8, 0, 6, 1, 114, 113, 113, 113, + 113, 129, 113, 113, 113, 114, 113, 113, 113, 114, 113, 113, + 113, 113, 114, 113, 113, 113, 240, 176, 30, 8, 0, 6, + 6, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 38, + 240, 48, 22, 14, 0, 11, 18, 179, 177, 33, 145, 50, + 114, 65, 113, 97, 81, 114, 50, 129, 49, 146, 0, 30, + 8, 14, 0, 47, 44, 0, 7, 32, 12, 7, 240, 240, + 194, 83, 82, 113, 113, 0, 18, 80, 30, 13, 0, 21, + 52, 129, 50, 114, 50, 98, 50, 178, 133, 98, 50, 33, + 34, 66, 33, 34, 66, 33, 34, 51, 33, 52, 35, 0, + 13, 48, 39, 14, 0, 10, 68, 194, 194, 194, 194, 194, + 194, 194, 35, 114, 17, 50, 83, 81, 82, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 65, 17, 81, 81, 18, 50, + 81, 36, 0, 14, 80, 23, 11, 0, 18, 37, 82, 65, + 50, 66, 34, 82, 34, 146, 146, 146, 162, 81, 50, 65, + 100, 0, 11, 64, 38, 14, 0, 11, 6, 194, 194, 194, + 194, 194, 194, 115, 34, 82, 49, 18, 81, 83, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 81, 83, 82, 49, + 18, 115, 36, 0, 14, 32, 25, 11, 0, 18, 36, 82, + 50, 65, 82, 34, 82, 41, 34, 146, 97, 34, 97, 50, + 81, 50, 65, 100, 0, 11, 64, 28, 11, 0, 8, 100, + 98, 49, 66, 50, 66, 50, 66, 146, 146, 119, 98, 146, + 146, 146, 146, 146, 146, 146, 146, 118, 0, 11, 80, 37, + 15, 0, 24, 101, 34, 82, 51, 18, 50, 85, 50, 82, + 98, 82, 98, 82, 114, 50, 119, 113, 225, 248, 129, 97, + 82, 129, 65, 145, 65, 130, 66, 98, 118, 240, 240, 112, + 36, 14, 0, 10, 68, 194, 194, 194, 194, 194, 194, 194, + 35, 114, 17, 34, 99, 50, 98, 66, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 76, 0, 14, 32, + 23, 7, 240, 240, 211, 67, 67, 240, 240, 19, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 69, 0, 7, 32, 31, + 9, 0, 7, 35, 99, 99, 240, 240, 165, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 34, 50, 34, + 50, 33, 50, 68, 240, 112, 35, 15, 0, 11, 36, 210, + 210, 210, 210, 210, 210, 210, 39, 66, 67, 98, 65, 130, + 49, 146, 33, 165, 162, 34, 146, 50, 130, 66, 114, 67, + 70, 22, 0, 15, 32, 25, 8, 0, 6, 4, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 70, 0, 8, 32, 41, 20, 0, 32, 68, 35, + 51, 114, 17, 34, 17, 34, 99, 51, 50, 98, 66, 66, + 98, 66, 66, 98, 66, 66, 98, 66, 66, 98, 66, 66, + 98, 66, 66, 98, 66, 66, 79, 3, 0, 20, 32, 30, + 15, 0, 24, 52, 36, 114, 17, 35, 99, 66, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 70, 22, 0, 15, 32, 27, 12, 0, 19, 116, 98, 66, + 66, 66, 50, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 50, 66, 66, 66, 100, 0, 12, 80, 37, 14, 0, 22, + 100, 35, 114, 17, 50, 83, 81, 82, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 67, 81, 82, 17, 50, 82, 35, + 114, 194, 194, 194, 194, 166, 240, 240, 96, 37, 14, 0, + 23, 19, 49, 82, 50, 17, 81, 81, 17, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 81, 83, 82, 49, 18, + 115, 34, 194, 194, 194, 194, 194, 166, 240, 240, 22, 10, + 0, 16, 36, 19, 67, 33, 67, 18, 66, 33, 82, 130, + 130, 130, 130, 130, 102, 0, 10, 64, 25, 10, 0, 16, + 52, 81, 66, 49, 81, 50, 147, 147, 65, 67, 33, 97, + 34, 81, 35, 50, 33, 36, 0, 10, 48, 28, 10, 0, + 10, 49, 145, 145, 130, 115, 103, 82, 130, 130, 130, 130, + 49, 66, 49, 66, 49, 66, 49, 66, 34, 84, 0, 10, + 48, 30, 14, 0, 22, 100, 36, 98, 66, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 51, 98, + 33, 18, 115, 36, 0, 14, 32, 25, 14, 0, 22, 102, + 21, 66, 81, 98, 81, 114, 49, 130, 49, 145, 33, 162, + 17, 162, 17, 178, 194, 0, 16, 80, 39, 19, 0, 30, + 117, 21, 21, 66, 66, 65, 98, 66, 65, 113, 66, 49, + 130, 33, 18, 33, 130, 33, 18, 33, 145, 17, 49, 17, + 163, 51, 163, 51, 177, 81, 193, 81, 0, 19, 112, 26, + 15, 0, 24, 69, 22, 82, 66, 114, 65, 146, 33, 179, + 210, 196, 161, 34, 145, 66, 114, 67, 70, 22, 0, 15, + 32, 35, 14, 0, 22, 101, 37, 50, 97, 98, 81, 98, + 65, 130, 49, 130, 49, 145, 33, 162, 17, 163, 194, 194, + 193, 209, 130, 34, 130, 33, 145, 34, 163, 240, 240, 128, + 25, 11, 0, 18, 8, 50, 51, 49, 66, 65, 50, 130, + 131, 130, 49, 66, 65, 50, 81, 35, 66, 41, 0, 11, + 32, 30, 9, 0, 7, 35, 81, 114, 114, 114, 114, 115, + 114, 114, 114, 114, 98, 82, 146, 130, 114, 114, 114, 99, + 98, 114, 114, 114, 129, 147, 176, 27, 4, 240, 146, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 224, 30, 9, + 0, 6, 99, 145, 130, 114, 114, 114, 99, 98, 114, 114, + 114, 130, 146, 82, 98, 114, 114, 114, 114, 130, 114, 114, + 114, 113, 83, 240, 14, 13, 0, 26, 36, 65, 49, 35, + 33, 49, 83, 0, 21, 80, 4, 9, 0, 36, 21, 5, + 0, 8, 19, 35, 35, 129, 65, 65, 65, 65, 65, 65, + 51, 35, 35, 35, 35, 35, 192, 41, 11, 0, 10, 81, + 161, 145, 161, 161, 161, 101, 82, 33, 17, 50, 51, 34, + 49, 18, 34, 49, 82, 33, 98, 33, 98, 33, 115, 65, + 66, 49, 100, 97, 161, 145, 161, 145, 161, 240, 240, 32, + 33, 14, 0, 11, 52, 130, 50, 98, 66, 98, 51, 97, + 81, 98, 194, 194, 194, 153, 130, 193, 209, 193, 209, 129, + 53, 66, 34, 54, 50, 68, 0, 14, 64, 29, 11, 0, + 17, 113, 21, 17, 50, 50, 65, 81, 49, 113, 33, 113, + 33, 113, 33, 113, 49, 81, 66, 50, 49, 21, 17, 0, + 12, 80, 33, 15, 0, 11, 38, 37, 66, 98, 82, 97, + 114, 65, 130, 65, 146, 49, 146, 33, 178, 17, 137, 162, + 210, 153, 162, 210, 210, 210, 210, 182, 0, 15, 80, 23, + 4, 240, 146, 34, 34, 34, 34, 34, 34, 34, 34, 240, + 114, 34, 34, 34, 34, 34, 34, 34, 34, 224, 43, 9, + 0, 7, 19, 81, 49, 49, 50, 49, 50, 49, 130, 130, + 100, 65, 34, 65, 50, 49, 66, 33, 81, 34, 65, 50, + 49, 51, 33, 68, 98, 130, 129, 66, 33, 66, 33, 65, + 33, 99, 240, 240, 16, 11, 9, 0, 10, 18, 50, 34, + 50, 0, 23, 112, 61, 20, 0, 15, 102, 194, 98, 145, + 161, 113, 68, 17, 33, 81, 66, 50, 49, 65, 50, 81, + 49, 49, 50, 97, 65, 33, 50, 97, 65, 33, 50, 177, + 33, 50, 177, 33, 50, 97, 65, 33, 50, 97, 65, 49, + 50, 65, 65, 65, 50, 65, 65, 81, 68, 65, 113, 161, + 146, 98, 198, 0, 21, 22, 9, 0, 6, 115, 97, 33, + 81, 33, 114, 82, 17, 66, 33, 17, 34, 33, 17, 39, + 0, 20, 64, 24, 9, 0, 16, 65, 65, 33, 65, 49, + 50, 33, 65, 34, 65, 34, 66, 33, 81, 49, 81, 49, + 0, 10, 48, 13, 15, 0, 28, 29, 210, 210, 210, 210, + 210, 0, 20, 112, 8, 9, 0, 21, 55, 0, 13, 96, + 64, 20, 0, 15, 102, 194, 98, 145, 161, 113, 24, 49, + 81, 66, 35, 49, 65, 66, 50, 49, 49, 82, 50, 65, + 33, 82, 50, 65, 33, 82, 34, 81, 33, 85, 97, 33, + 82, 34, 81, 33, 82, 34, 81, 49, 66, 34, 33, 17, + 65, 66, 49, 33, 17, 81, 22, 19, 17, 113, 161, 146, + 98, 198, 0, 21, 7, 9, 0, 10, 23, 0, 25, 23, + 11, 0, 8, 69, 82, 50, 50, 82, 33, 113, 33, 113, + 33, 113, 34, 82, 50, 50, 85, 0, 23, 112, 22, 14, + 0, 18, 18, 194, 194, 194, 194, 194, 124, 114, 194, 194, + 194, 194, 240, 240, 92, 0, 12, 64, 22, 8, 0, 6, + 20, 50, 34, 33, 50, 33, 50, 50, 18, 82, 97, 97, + 97, 49, 38, 0, 16, 32, 24, 9, 0, 6, 116, 65, + 50, 50, 34, 65, 34, 98, 83, 146, 50, 50, 33, 66, + 33, 51, 52, 0, 17, 48, 12, 7, 240, 240, 242, 67, + 66, 65, 81, 0, 19, 16, 37, 16, 0, 28, 65, 82, + 114, 81, 130, 66, 130, 66, 129, 82, 114, 81, 130, 66, + 49, 66, 66, 33, 83, 33, 17, 33, 66, 19, 35, 82, + 225, 226, 226, 226, 0, 7, 96, 54, 14, 0, 10, 121, + 67, 49, 100, 49, 100, 49, 85, 49, 100, 49, 100, 49, + 100, 49, 115, 49, 145, 49, 145, 49, 145, 49, 145, 49, + 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, + 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 240, 240, + 48, 9, 5, 0, 9, 51, 35, 35, 0, 9, 11, 7, + 0, 22, 17, 84, 82, 82, 36, 240, 32, 17, 6, 240, + 240, 99, 66, 66, 66, 66, 66, 66, 66, 66, 52, 0, + 12, 32, 21, 9, 0, 7, 3, 82, 18, 50, 50, 34, + 50, 34, 50, 34, 50, 50, 18, 83, 0, 20, 96, 24, + 10, 0, 17, 65, 145, 49, 97, 49, 97, 34, 82, 34, + 66, 33, 81, 34, 65, 49, 65, 49, 0, 11, 112, 48, + 17, 0, 12, 99, 129, 98, 114, 98, 113, 114, 97, 130, + 97, 130, 81, 146, 81, 146, 65, 162, 50, 66, 52, 33, + 82, 130, 67, 129, 65, 18, 114, 49, 34, 113, 65, 34, + 98, 70, 81, 130, 81, 146, 66, 132, 0, 17, 32, 49, + 17, 0, 12, 99, 129, 98, 129, 98, 113, 114, 113, 114, + 97, 130, 81, 146, 81, 146, 65, 162, 65, 36, 52, 33, + 33, 50, 114, 33, 50, 113, 51, 18, 98, 114, 97, 114, + 98, 113, 113, 113, 113, 113, 49, 50, 102, 0, 17, 32, + 52, 18, 0, 13, 84, 113, 81, 50, 97, 97, 34, 81, + 162, 65, 131, 97, 178, 49, 210, 33, 130, 50, 17, 145, + 51, 17, 66, 68, 33, 82, 145, 83, 145, 65, 18, 129, + 81, 18, 129, 65, 34, 113, 86, 97, 130, 97, 146, 97, + 132, 0, 18, 32, 27, 10, 0, 16, 99, 115, 115, 129, + 145, 145, 130, 100, 82, 114, 129, 145, 145, 67, 33, 67, + 49, 66, 50, 49, 84, 240, 144, 49, 19, 240, 162, 240, + 35, 240, 50, 240, 65, 240, 240, 97, 240, 49, 240, 35, + 240, 19, 240, 19, 241, 19, 225, 34, 210, 34, 209, 51, + 193, 66, 178, 66, 184, 177, 83, 146, 98, 145, 114, 145, + 115, 114, 115, 72, 39, 0, 19, 32, 48, 19, 240, 242, + 240, 19, 242, 240, 17, 240, 240, 129, 240, 49, 240, 35, + 240, 19, 240, 19, 241, 19, 225, 34, 210, 34, 209, 51, + 193, 51, 178, 66, 184, 177, 83, 146, 98, 145, 114, 145, + 115, 114, 115, 72, 39, 0, 19, 32, 49, 19, 240, 209, + 240, 35, 226, 49, 193, 98, 240, 240, 49, 240, 49, 240, + 35, 240, 19, 240, 19, 241, 19, 225, 34, 210, 34, 209, + 50, 209, 51, 178, 66, 184, 177, 83, 146, 98, 145, 114, + 145, 115, 114, 115, 72, 39, 0, 19, 32, 47, 19, 240, + 240, 228, 49, 161, 52, 0, 6, 81, 240, 49, 240, 35, + 240, 19, 240, 19, 241, 19, 225, 34, 210, 34, 209, 50, + 209, 51, 178, 66, 184, 177, 83, 146, 98, 145, 114, 145, + 115, 114, 115, 72, 39, 0, 19, 32, 47, 19, 240, 240, + 210, 66, 178, 66, 0, 6, 66, 240, 34, 240, 34, 240, + 19, 240, 20, 241, 18, 225, 34, 225, 35, 209, 50, 193, + 66, 193, 67, 184, 161, 98, 161, 99, 130, 114, 130, 114, + 115, 115, 72, 24, 0, 19, 32, 48, 19, 116, 225, 65, + 209, 65, 209, 65, 228, 0, 6, 98, 240, 34, 240, 19, + 240, 17, 18, 241, 18, 226, 18, 225, 35, 209, 50, 194, + 50, 193, 67, 184, 162, 82, 161, 98, 161, 99, 130, 114, + 115, 115, 72, 24, 0, 19, 32, 60, 28, 0, 22, 31, + 1, 240, 19, 99, 244, 114, 241, 18, 129, 225, 34, 129, + 210, 34, 65, 49, 209, 50, 65, 49, 194, 50, 65, 242, + 66, 50, 253, 226, 82, 50, 210, 98, 65, 65, 129, 114, + 65, 49, 130, 114, 130, 98, 130, 130, 98, 130, 115, 83, + 130, 100, 40, 63, 0, 28, 32, 45, 16, 0, 12, 84, + 65, 82, 66, 18, 66, 100, 50, 131, 50, 146, 49, 162, + 34, 177, 34, 177, 34, 226, 226, 226, 226, 161, 66, 145, + 66, 145, 82, 113, 114, 66, 149, 209, 227, 242, 226, 226, + 180, 240, 240, 160, 50, 17, 240, 98, 243, 240, 18, 240, + 33, 240, 174, 98, 99, 98, 114, 98, 129, 98, 129, 98, + 65, 49, 98, 65, 49, 98, 50, 167, 162, 50, 162, 65, + 162, 65, 65, 82, 65, 50, 82, 130, 82, 130, 82, 115, + 82, 100, 47, 0, 17, 32, 48, 17, 240, 178, 227, 210, + 240, 240, 206, 98, 99, 98, 114, 98, 129, 98, 129, 98, + 65, 49, 98, 65, 49, 98, 50, 167, 162, 50, 162, 65, + 162, 65, 65, 82, 65, 50, 82, 130, 82, 130, 82, 115, + 82, 100, 47, 0, 17, 32, 50, 17, 240, 145, 243, 194, + 50, 240, 33, 240, 126, 98, 99, 98, 114, 98, 129, 98, + 129, 98, 65, 49, 98, 65, 49, 98, 50, 167, 162, 50, + 162, 65, 162, 65, 65, 82, 65, 50, 82, 130, 82, 130, + 82, 115, 82, 100, 47, 0, 17, 32, 50, 17, 240, 240, + 130, 66, 146, 66, 240, 240, 158, 98, 99, 98, 114, 98, + 129, 98, 129, 98, 65, 49, 98, 65, 49, 98, 50, 167, + 162, 50, 162, 65, 162, 65, 65, 82, 65, 49, 98, 130, + 82, 130, 82, 115, 82, 100, 47, 0, 17, 32, 27, 10, + 177, 147, 146, 161, 232, 82, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, 0, 10, + 32, 29, 10, 240, 17, 115, 98, 113, 240, 40, 82, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 88, 0, 10, 32, 28, 10, 210, 116, 81, 65, + 161, 200, 82, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 88, 0, 10, 32, 29, 10, + 240, 82, 66, 34, 66, 240, 120, 82, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, + 0, 10, 32, 41, 18, 0, 13, 75, 162, 98, 130, 114, + 114, 130, 98, 130, 98, 146, 82, 146, 82, 146, 40, 98, + 82, 146, 82, 146, 82, 146, 82, 146, 82, 130, 98, 130, + 98, 114, 114, 98, 91, 0, 18, 112, 58, 19, 240, 240, + 212, 65, 145, 68, 240, 240, 229, 102, 67, 145, 115, 129, + 116, 113, 113, 19, 97, 113, 19, 97, 113, 35, 81, 113, + 51, 65, 113, 66, 65, 113, 67, 49, 113, 83, 33, 113, + 99, 17, 113, 114, 17, 113, 116, 113, 131, 113, 146, 99, + 145, 71, 113, 0, 19, 64, 47, 17, 240, 98, 243, 240, + 18, 240, 33, 240, 245, 162, 82, 114, 114, 82, 146, 66, + 146, 65, 177, 50, 178, 34, 178, 34, 178, 34, 178, 34, + 178, 34, 178, 49, 177, 66, 146, 66, 146, 82, 114, 114, + 82, 165, 0, 17, 112, 46, 17, 240, 178, 227, 210, 225, + 240, 240, 37, 162, 82, 114, 114, 82, 146, 66, 146, 65, + 177, 50, 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, + 178, 49, 177, 66, 146, 66, 146, 82, 114, 114, 82, 165, + 0, 17, 112, 48, 17, 113, 243, 210, 18, 178, 50, 145, + 113, 240, 197, 162, 82, 114, 114, 82, 146, 66, 146, 65, + 177, 50, 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, + 178, 49, 177, 66, 146, 66, 146, 82, 114, 114, 82, 165, + 0, 17, 112, 47, 17, 240, 240, 132, 65, 98, 53, 240, + 240, 229, 162, 82, 114, 114, 82, 146, 66, 146, 65, 177, + 50, 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, 178, + 49, 177, 66, 146, 66, 146, 82, 114, 114, 82, 165, 0, + 17, 112, 47, 17, 240, 240, 130, 66, 146, 66, 240, 240, + 229, 162, 82, 114, 114, 82, 146, 66, 146, 65, 177, 50, + 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, 178, 49, + 177, 66, 146, 66, 146, 82, 114, 114, 82, 165, 0, 17, + 112, 22, 11, 0, 17, 113, 113, 49, 82, 65, 50, 97, + 18, 130, 131, 114, 33, 82, 65, 50, 97, 0, 14, 53, + 17, 0, 13, 53, 65, 82, 67, 18, 66, 100, 81, 131, + 66, 116, 65, 115, 18, 34, 99, 34, 34, 98, 50, 34, + 82, 66, 34, 66, 82, 34, 50, 98, 34, 35, 98, 34, + 19, 113, 68, 114, 67, 129, 84, 98, 66, 19, 66, 81, + 69, 0, 17, 112, 47, 20, 240, 178, 240, 66, 240, 81, + 0, 6, 40, 55, 82, 131, 114, 145, 130, 145, 130, 145, + 130, 145, 130, 145, 130, 145, 130, 145, 130, 145, 130, 145, + 130, 145, 130, 145, 130, 145, 130, 145, 146, 113, 163, 82, + 198, 0, 21, 47, 20, 240, 243, 240, 19, 240, 18, 0, + 6, 40, 55, 82, 131, 114, 145, 130, 145, 130, 145, 130, + 145, 130, 145, 130, 145, 130, 145, 130, 145, 130, 145, 130, + 145, 130, 145, 130, 145, 130, 145, 146, 113, 163, 82, 198, + 0, 21, 49, 20, 145, 240, 51, 240, 18, 18, 225, 66, + 0, 5, 120, 55, 82, 131, 114, 145, 130, 145, 130, 145, + 130, 145, 130, 145, 130, 145, 130, 145, 130, 145, 130, 145, + 130, 145, 130, 145, 130, 145, 130, 145, 146, 113, 163, 82, + 198, 0, 21, 47, 20, 240, 240, 242, 66, 194, 66, 0, + 5, 120, 55, 82, 131, 114, 145, 130, 145, 130, 145, 130, + 145, 130, 145, 130, 145, 130, 145, 130, 145, 130, 145, 130, + 145, 130, 145, 130, 145, 130, 145, 146, 113, 163, 82, 198, + 0, 21, 50, 20, 240, 240, 18, 240, 35, 240, 18, 0, + 6, 24, 55, 83, 114, 146, 114, 147, 97, 178, 81, 195, + 65, 210, 49, 242, 17, 240, 18, 17, 240, 34, 240, 50, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 248, 0, 20, 112, 50, 16, 0, 12, 50, 181, 67, 99, + 52, 114, 18, 35, 99, 82, 98, 99, 82, 114, 82, 114, + 82, 114, 82, 114, 82, 114, 82, 113, 98, 113, 98, 98, + 98, 82, 114, 81, 130, 50, 146, 18, 179, 210, 226, 226, + 226, 194, 209, 240, 240, 16, 42, 13, 0, 10, 36, 130, + 34, 113, 66, 82, 66, 82, 66, 82, 65, 98, 49, 117, + 130, 50, 98, 66, 82, 66, 82, 82, 66, 82, 66, 82, + 66, 18, 34, 69, 34, 68, 34, 52, 20, 0, 13, 64, + 38, 13, 0, 9, 114, 193, 194, 194, 193, 240, 240, 100, + 129, 50, 114, 50, 98, 50, 148, 114, 34, 97, 66, 33, + 34, 66, 33, 34, 66, 33, 35, 20, 33, 51, 51, 0, + 13, 48, 37, 13, 0, 10, 66, 162, 178, 161, 177, 240, + 240, 116, 129, 50, 114, 50, 98, 50, 178, 133, 98, 50, + 33, 34, 66, 33, 34, 66, 33, 34, 51, 33, 52, 35, + 0, 13, 48, 40, 13, 0, 10, 33, 179, 146, 17, 145, + 49, 113, 81, 240, 240, 52, 129, 50, 114, 50, 98, 50, + 178, 133, 98, 50, 33, 34, 66, 33, 34, 66, 33, 34, + 51, 33, 52, 35, 0, 13, 48, 39, 13, 0, 13, 34, + 65, 81, 33, 33, 81, 66, 240, 240, 68, 129, 50, 114, + 50, 98, 50, 178, 133, 98, 50, 33, 34, 66, 33, 34, + 66, 33, 34, 51, 33, 52, 35, 0, 13, 48, 36, 13, + 0, 13, 18, 50, 98, 50, 0, 5, 100, 129, 50, 114, + 50, 98, 50, 178, 133, 98, 50, 33, 34, 66, 33, 34, + 66, 33, 34, 51, 33, 52, 35, 0, 13, 48, 41, 13, + 0, 10, 19, 146, 18, 129, 49, 129, 49, 130, 18, 147, + 240, 116, 129, 50, 114, 50, 98, 50, 178, 133, 98, 50, + 33, 34, 66, 33, 34, 66, 33, 34, 51, 33, 52, 35, + 0, 13, 48, 37, 18, 0, 29, 68, 52, 97, 52, 65, + 82, 50, 82, 81, 50, 82, 123, 82, 34, 177, 66, 113, + 34, 66, 97, 50, 49, 18, 81, 51, 33, 18, 66, 68, + 68, 0, 18, 80, 29, 11, 0, 18, 37, 82, 65, 50, + 66, 34, 82, 34, 146, 146, 146, 97, 50, 81, 50, 65, + 100, 129, 147, 162, 146, 146, 115, 240, 192, 31, 11, 0, + 8, 65, 162, 162, 161, 177, 240, 244, 82, 50, 65, 82, + 34, 82, 41, 34, 146, 97, 34, 97, 50, 81, 50, 65, + 100, 0, 11, 64, 31, 11, 0, 9, 17, 146, 130, 145, + 145, 240, 240, 20, 82, 50, 65, 82, 34, 82, 41, 34, + 146, 146, 97, 50, 81, 50, 65, 100, 0, 11, 64, 34, + 11, 0, 8, 98, 146, 129, 33, 97, 65, 65, 97, 240, + 196, 82, 50, 65, 82, 34, 82, 41, 34, 146, 97, 34, + 97, 50, 81, 50, 65, 100, 0, 11, 64, 31, 11, 0, + 11, 34, 34, 82, 34, 240, 240, 147, 98, 50, 65, 81, + 50, 81, 56, 50, 146, 97, 34, 81, 65, 81, 66, 50, + 100, 0, 11, 64, 24, 9, 0, 6, 98, 115, 114, 145, + 145, 240, 132, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 86, 0, 9, 32, 24, 8, 0, 6, 66, 83, 82, 82, + 81, 240, 116, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 70, 0, 8, 32, 27, 9, 0, 7, 17, 115, 97, 17, + 81, 49, 49, 81, 240, 100, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 86, 0, 9, 32, 23, 9, 0, 9, 2, + 50, 34, 50, 240, 244, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 86, 0, 9, 32, 42, 13, 0, 10, 2, 97, + 66, 67, 82, 33, 33, 99, 97, 33, 17, 115, 34, 97, + 82, 149, 113, 51, 82, 66, 66, 83, 50, 98, 50, 98, + 50, 98, 50, 98, 66, 66, 83, 35, 116, 0, 13, 80, + 36, 15, 0, 17, 36, 49, 97, 52, 240, 240, 84, 36, + 114, 17, 35, 99, 66, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 70, 22, 0, 15, 32, + 34, 12, 0, 9, 33, 178, 178, 177, 193, 240, 240, 52, + 98, 66, 66, 66, 50, 98, 34, 98, 34, 98, 34, 98, + 34, 98, 50, 66, 66, 66, 100, 0, 12, 80, 34, 12, + 0, 9, 113, 162, 146, 161, 161, 240, 240, 68, 98, 66, + 66, 66, 50, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 50, 66, 66, 66, 100, 0, 12, 80, 36, 12, 0, 9, + 66, 162, 145, 33, 113, 65, 81, 97, 240, 244, 98, 66, + 66, 66, 50, 98, 34, 98, 34, 98, 34, 98, 34, 98, + 50, 66, 66, 66, 100, 0, 12, 80, 35, 12, 0, 12, + 35, 129, 34, 33, 49, 67, 240, 240, 20, 98, 66, 66, + 66, 50, 98, 34, 98, 34, 98, 34, 98, 34, 98, 50, + 66, 66, 66, 100, 0, 12, 80, 33, 12, 0, 12, 34, + 34, 98, 34, 240, 240, 212, 98, 66, 66, 66, 50, 98, + 34, 98, 34, 98, 34, 98, 34, 98, 50, 66, 66, 66, + 100, 0, 12, 80, 18, 14, 0, 23, 51, 179, 179, 240, + 240, 76, 240, 240, 83, 179, 179, 0, 14, 96, 33, 12, + 0, 19, 116, 33, 50, 66, 66, 66, 50, 68, 34, 50, + 18, 34, 34, 34, 34, 18, 50, 34, 17, 66, 50, 66, + 66, 66, 49, 36, 0, 12, 80, 36, 14, 0, 10, 98, + 194, 210, 210, 0, 6, 36, 36, 98, 66, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 51, 98, + 33, 18, 115, 36, 0, 14, 32, 37, 14, 0, 11, 49, + 194, 193, 193, 193, 240, 240, 116, 36, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 51, + 98, 33, 18, 115, 36, 0, 14, 32, 40, 14, 0, 11, + 17, 195, 162, 17, 161, 49, 129, 81, 240, 240, 52, 36, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 66, 98, 51, 98, 33, 18, 115, 36, 0, 14, 32, + 36, 14, 0, 14, 34, 50, 114, 50, 0, 5, 116, 51, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 66, 98, 51, 98, 33, 18, 115, 36, 0, 14, 32, + 42, 14, 0, 11, 50, 179, 178, 177, 193, 240, 240, 117, + 37, 50, 97, 98, 65, 114, 65, 130, 49, 130, 33, 161, + 33, 162, 17, 163, 194, 194, 193, 209, 130, 33, 146, 33, + 145, 34, 163, 240, 240, 128, 40, 12, 0, 12, 34, 132, + 162, 162, 162, 162, 34, 100, 18, 82, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 50, 82, 50, 82, 34, 98, + 18, 115, 146, 162, 162, 162, 146, 145, 240, 128, 41, 13, + 0, 13, 34, 50, 98, 50, 240, 240, 213, 36, 65, 82, + 82, 65, 98, 65, 114, 49, 114, 33, 145, 33, 146, 17, + 147, 178, 177, 193, 193, 114, 33, 130, 33, 129, 34, 147, + 240, 240, 80, +}; + +//***************************************************************************** +// +// The glyph offset table for the 24 point Theanomodern font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanomodern24[] = +{ + 0, 4, 26, 47, 88, 151, 209, 259, + 272, 302, 333, 359, 378, 392, 400, 410, + 440, 481, 506, 541, 576, 608, 642, 682, + 713, 753, 793, 807, 825, 844, 855, 874, + 902, 968, 1009, 1049, 1088, 1129, 1173, 1210, + 1256, 1298, 1323, 1352, 1395, 1427, 1495, 1547, + 1588, 1620, 1674, 1719, 1759, 1798, 1839, 1881, + 1947, 1991, 2034, 2073, 2103, 2132, 2162, 2184, + 2192, 2204, 2234, 2273, 2296, 2334, 2359, 2387, + 2424, 2460, 2483, 2514, 2549, 2574, 2615, 2645, + 2672, 2709, 2746, 2768, 2793, 2821, 2851, 2876, + 2915, 2941, 2976, 3001, 3031, 3058, 3088, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3102, 3106, 3127, 3168, 3201, 3230, 3263, 3286, + 3329, 3340, 3401, 3423, 3447, 3460, 3468, 3532, + 3539, 3562, 3584, 3606, 3630, 3642, 3679, 3733, + 3742, 3753, 3770, 3791, 3815, 3863, 3912, 3964, + 3991, 4040, 4088, 4137, 4184, 4231, 4279, 4339, + 4384, 4434, 4482, 4532, 4582, 4609, 4638, 4666, + 4695, 4736, 4794, 4841, 4887, 4935, 4982, 5029, + 5051, 5104, 5151, 5198, 5247, 5294, 5344, 5394, + 5436, 5474, 5511, 5551, 5590, 5626, 5667, 5704, + 5733, 5764, 5795, 5829, 5860, 5884, 5908, 5935, + 5958, 6000, 6036, 6070, 6104, 6140, 6175, 6208, + 6226, 6259, 6295, 6332, 6372, 6408, 6450, 6490, +}; + +//***************************************************************************** +// +// The font definition for the 24 point Theanomodern font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanomodern24 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 25, + + // + // The height of the font. + // + 32, + + // + // The baseline of the font. + // + 24, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanomodern24, + + // + // A pointer to the actual font data + // + g_pui8Theanomodern24Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanomodern26.c b/third_party/fonts/ofl/fonts/fonttheanomodern26.c new file mode 100644 index 0000000..e77115b --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanomodern26.c @@ -0,0 +1,800 @@ +//***************************************************************************** +// +// fonttheanomodern26.c - Font definition for the 26pt Theanomodern font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanomodern +// Size: 26 point +// Bold: no +// Italic: no +// Memory usage: 7168 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 26 point Theanomodern font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanomodern26Data[6965] = +{ + 5, 10, 0, 42, 64, 24, 6, 240, 240, 210, 52, 36, + 36, 36, 36, 50, 66, 66, 66, 66, 66, 66, 240, 114, + 52, 50, 0, 6, 48, 21, 9, 0, 7, 114, 50, 34, + 50, 34, 50, 34, 50, 34, 50, 34, 50, 33, 65, 0, + 22, 112, 43, 15, 0, 13, 97, 66, 129, 65, 145, 65, + 130, 65, 129, 81, 129, 66, 77, 97, 65, 130, 65, 129, + 81, 129, 66, 129, 65, 109, 66, 65, 129, 81, 129, 65, + 145, 65, 145, 65, 130, 65, 0, 15, 112, 69, 14, 0, + 9, 33, 33, 161, 33, 150, 115, 36, 66, 17, 33, 34, + 34, 33, 33, 19, 34, 33, 33, 19, 34, 33, 33, 33, + 51, 17, 33, 116, 33, 134, 151, 129, 21, 113, 37, 49, + 33, 33, 34, 35, 17, 33, 34, 35, 17, 33, 34, 34, + 33, 33, 34, 34, 33, 33, 18, 66, 17, 35, 118, 145, + 33, 161, 33, 0, 11, 32, 61, 20, 0, 17, 99, 130, + 98, 18, 113, 98, 50, 82, 98, 50, 81, 114, 50, 65, + 130, 50, 65, 130, 50, 49, 162, 18, 50, 179, 65, 240, + 49, 52, 193, 34, 34, 161, 49, 65, 146, 34, 66, 129, + 50, 66, 113, 66, 66, 113, 66, 66, 97, 97, 65, 113, + 98, 34, 97, 132, 0, 20, 64, 55, 19, 0, 17, 36, + 226, 34, 210, 49, 210, 49, 210, 49, 211, 17, 243, 240, + 19, 38, 116, 66, 115, 19, 49, 115, 50, 49, 114, 66, + 49, 99, 82, 33, 99, 82, 17, 65, 35, 84, 65, 35, + 98, 81, 36, 83, 49, 67, 65, 19, 33, 101, 52, 0, + 19, 64, 13, 4, 240, 210, 34, 34, 34, 34, 34, 33, + 0, 10, 48, 31, 9, 0, 8, 81, 113, 113, 113, 114, + 113, 114, 114, 113, 114, 114, 114, 114, 114, 114, 114, 114, + 129, 130, 114, 129, 130, 130, 129, 145, 145, 176, 32, 9, + 0, 7, 113, 145, 145, 145, 130, 129, 130, 114, 129, 130, + 114, 114, 114, 114, 114, 114, 114, 113, 114, 114, 113, 114, + 98, 113, 113, 113, 240, 32, 30, 12, 0, 11, 2, 162, + 162, 98, 49, 34, 35, 33, 34, 66, 17, 17, 131, 114, + 19, 67, 33, 34, 34, 34, 34, 98, 162, 0, 23, 32, + 20, 15, 0, 25, 18, 210, 210, 210, 210, 210, 125, 130, + 210, 210, 210, 210, 210, 0, 15, 112, 15, 6, 0, 17, + 50, 67, 51, 81, 81, 65, 81, 65, 65, 240, 32, 8, + 10, 0, 25, 8, 0, 16, 64, 10, 5, 0, 14, 51, + 35, 35, 240, 240, 192, 32, 9, 0, 8, 81, 114, 114, + 113, 129, 129, 114, 113, 129, 129, 114, 114, 113, 129, 129, + 114, 113, 129, 129, 114, 114, 113, 129, 129, 114, 113, 240, + 32, 43, 14, 0, 12, 100, 145, 65, 114, 66, 82, 98, + 66, 98, 65, 129, 50, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 130, 49, 129, 66, 98, 66, 98, + 81, 82, 113, 65, 148, 0, 14, 96, 26, 10, 0, 9, + 18, 85, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 88, 0, 10, 32, 36, 12, + 0, 10, 116, 98, 51, 49, 98, 49, 114, 35, 82, 36, + 66, 50, 82, 161, 162, 161, 161, 162, 146, 161, 65, 81, + 81, 65, 97, 49, 113, 57, 42, 0, 12, 32, 37, 13, + 0, 11, 101, 98, 67, 50, 99, 34, 114, 36, 82, 51, + 82, 162, 177, 117, 194, 209, 194, 50, 98, 35, 98, 35, + 98, 34, 114, 34, 98, 66, 66, 117, 0, 13, 80, 34, + 14, 0, 13, 33, 194, 194, 179, 179, 161, 18, 146, 18, + 145, 34, 129, 50, 129, 50, 113, 66, 98, 66, 97, 82, + 92, 146, 194, 194, 194, 137, 0, 14, 32, 36, 13, 0, + 11, 66, 82, 72, 86, 113, 193, 193, 193, 193, 21, 98, + 66, 81, 98, 194, 178, 50, 98, 36, 82, 36, 82, 33, + 114, 49, 114, 66, 66, 101, 0, 13, 96, 42, 13, 0, + 11, 117, 114, 50, 82, 66, 66, 67, 66, 66, 81, 178, + 178, 36, 82, 17, 50, 67, 82, 50, 114, 34, 114, 34, + 114, 34, 114, 49, 114, 49, 113, 81, 82, 82, 50, 132, + 0, 13, 80, 32, 14, 0, 7, 17, 209, 209, 219, 58, + 49, 130, 49, 129, 65, 113, 81, 113, 193, 209, 193, 194, + 193, 209, 194, 194, 179, 179, 179, 179, 179, 0, 15, 42, + 14, 0, 12, 100, 145, 51, 97, 83, 65, 114, 65, 114, + 65, 114, 66, 97, 98, 66, 101, 17, 134, 113, 53, 65, + 99, 50, 115, 34, 130, 34, 130, 34, 130, 50, 98, 82, + 66, 118, 0, 14, 80, 41, 13, 0, 11, 100, 130, 50, + 82, 81, 66, 113, 50, 113, 50, 114, 34, 114, 34, 114, + 50, 83, 51, 49, 18, 84, 34, 178, 178, 177, 67, 66, + 67, 66, 66, 66, 97, 50, 132, 0, 13, 96, 15, 5, + 0, 8, 99, 35, 35, 240, 240, 35, 35, 35, 240, 240, + 192, 19, 6, 0, 10, 67, 51, 51, 240, 240, 147, 52, + 36, 81, 81, 65, 81, 65, 240, 112, 21, 14, 0, 22, + 49, 194, 162, 163, 147, 147, 147, 178, 211, 211, 211, 210, + 226, 210, 0, 14, 32, 11, 15, 0, 31, 125, 0, 5, + 125, 0, 22, 96, 21, 14, 0, 21, 1, 210, 226, 226, + 211, 211, 211, 194, 163, 147, 147, 162, 162, 178, 0, 15, + 64, 30, 11, 0, 9, 116, 97, 66, 50, 81, 51, 81, + 49, 97, 161, 146, 130, 86, 85, 98, 145, 161, 161, 240, + 240, 19, 131, 131, 0, 11, 112, 72, 22, 0, 25, 102, + 227, 82, 163, 145, 130, 193, 98, 225, 82, 225, 66, 99, + 34, 49, 50, 66, 49, 18, 49, 34, 66, 67, 65, 34, + 66, 67, 65, 34, 50, 83, 65, 34, 50, 83, 65, 34, + 50, 82, 65, 50, 50, 67, 65, 50, 50, 67, 65, 66, + 50, 33, 18, 49, 82, 67, 52, 114, 240, 98, 193, 130, + 162, 147, 98, 215, 0, 9, 32, 43, 20, 0, 18, 81, + 240, 66, 240, 35, 240, 35, 240, 36, 241, 34, 241, 34, + 241, 35, 209, 66, 209, 66, 209, 67, 185, 177, 98, 177, + 98, 161, 115, 145, 130, 130, 131, 100, 115, 72, 40, 0, + 20, 32, 42, 17, 0, 14, 124, 130, 99, 98, 115, 82, + 130, 82, 130, 82, 130, 82, 114, 98, 98, 120, 146, 98, + 114, 114, 98, 130, 82, 130, 82, 130, 82, 130, 82, 130, + 82, 114, 98, 98, 76, 0, 17, 80, 42, 17, 0, 15, + 69, 65, 98, 66, 18, 67, 100, 66, 131, 51, 146, 50, + 162, 35, 177, 35, 177, 35, 227, 227, 227, 177, 35, 161, + 66, 161, 67, 145, 82, 129, 99, 113, 115, 66, 165, 0, + 17, 112, 43, 19, 0, 16, 92, 162, 99, 130, 115, 114, + 130, 114, 131, 98, 146, 98, 147, 82, 147, 82, 147, 82, + 147, 82, 147, 82, 147, 82, 147, 82, 146, 98, 131, 98, + 130, 114, 115, 114, 99, 92, 0, 19, 112, 48, 18, 0, + 15, 111, 98, 115, 98, 130, 98, 130, 98, 145, 98, 81, + 49, 98, 81, 49, 98, 66, 49, 98, 66, 168, 162, 66, + 162, 66, 162, 81, 65, 82, 81, 50, 82, 146, 82, 146, + 82, 131, 82, 116, 47, 1, 0, 18, 32, 40, 17, 0, + 14, 127, 82, 115, 82, 130, 82, 130, 82, 145, 82, 81, + 49, 82, 81, 49, 82, 66, 49, 82, 66, 152, 146, 66, + 146, 66, 146, 81, 146, 81, 146, 242, 242, 242, 201, 0, + 18, 48, 19, 0, 17, 37, 65, 130, 66, 18, 99, 100, + 98, 131, 83, 146, 82, 162, 67, 162, 67, 177, 67, 240, + 19, 89, 35, 146, 83, 146, 83, 146, 98, 146, 99, 130, + 114, 130, 115, 97, 17, 131, 65, 33, 165, 49, 0, 19, + 80, 44, 21, 0, 18, 56, 56, 82, 146, 130, 146, 130, + 146, 130, 146, 130, 146, 130, 146, 130, 146, 130, 146, 141, + 130, 146, 130, 146, 130, 146, 130, 146, 130, 146, 130, 146, + 130, 146, 130, 146, 88, 56, 0, 21, 32, 26, 10, 0, + 8, 104, 82, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 88, 0, 10, 32, 31, + 15, 0, 13, 104, 162, 210, 210, 210, 210, 210, 210, 210, + 210, 210, 210, 99, 66, 84, 66, 84, 66, 81, 114, 81, + 98, 113, 66, 149, 0, 16, 45, 21, 0, 18, 56, 40, + 98, 131, 130, 130, 146, 114, 162, 98, 178, 81, 210, 65, + 226, 49, 242, 35, 226, 20, 227, 35, 210, 67, 194, 83, + 178, 83, 178, 99, 162, 115, 146, 131, 130, 132, 72, 41, + 0, 21, 32, 44, 18, 0, 15, 104, 210, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 161, 82, 161, 82, 146, 82, 146, + 82, 146, 82, 131, 82, 116, 47, 1, 0, 18, 32, 73, + 25, 0, 21, 118, 182, 83, 179, 132, 148, 129, 18, 145, + 18, 129, 19, 129, 18, 129, 19, 113, 34, 129, 34, 113, + 34, 129, 35, 82, 34, 129, 35, 81, 50, 129, 51, 65, + 50, 129, 51, 49, 66, 129, 66, 49, 66, 129, 67, 18, + 66, 129, 67, 17, 82, 129, 82, 17, 82, 129, 83, 98, + 129, 98, 98, 129, 98, 98, 87, 49, 72, 0, 25, 32, + 55, 21, 0, 18, 53, 119, 68, 145, 131, 145, 132, 129, + 129, 19, 113, 129, 20, 97, 129, 35, 97, 129, 51, 81, + 129, 67, 65, 129, 67, 65, 129, 83, 49, 129, 99, 33, + 129, 115, 17, 129, 115, 17, 129, 132, 129, 147, 129, 162, + 115, 146, 87, 129, 0, 21, 80, 42, 19, 0, 17, 53, + 194, 82, 146, 114, 114, 146, 83, 147, 66, 178, 51, 179, + 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, + 50, 178, 67, 147, 82, 146, 114, 114, 146, 82, 197, 0, + 20, 34, 17, 0, 14, 124, 130, 98, 114, 114, 98, 130, + 82, 130, 82, 130, 82, 130, 82, 114, 98, 99, 105, 130, + 242, 242, 242, 242, 242, 242, 242, 200, 0, 18, 16, 57, + 19, 0, 17, 53, 194, 82, 146, 114, 114, 146, 83, 147, + 66, 178, 51, 179, 35, 179, 35, 179, 35, 179, 35, 179, + 35, 179, 35, 179, 50, 163, 67, 35, 67, 82, 17, 49, + 50, 115, 50, 18, 146, 52, 197, 81, 178, 81, 178, 81, + 178, 81, 194, 49, 228, 0, 7, 80, 47, 20, 0, 17, + 76, 178, 98, 162, 114, 146, 130, 130, 130, 130, 130, 130, + 130, 130, 114, 146, 99, 152, 194, 82, 178, 98, 162, 99, + 146, 99, 146, 114, 49, 82, 114, 49, 82, 114, 49, 82, + 115, 17, 56, 84, 0, 20, 48, 42, 16, 0, 14, 69, + 147, 66, 17, 81, 130, 66, 145, 66, 145, 66, 145, 67, + 228, 214, 198, 81, 117, 50, 131, 50, 162, 34, 177, 35, + 161, 36, 145, 37, 113, 50, 34, 82, 50, 69, 0, 16, + 80, 50, 18, 0, 15, 111, 1, 36, 50, 52, 35, 66, + 67, 34, 82, 82, 34, 82, 82, 33, 98, 97, 33, 98, + 97, 33, 98, 97, 146, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 216, + 0, 18, 96, 43, 21, 0, 18, 56, 71, 82, 147, 114, + 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, + 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, + 161, 130, 161, 146, 129, 178, 82, 215, 0, 22, 43, 20, + 0, 17, 72, 40, 67, 130, 115, 129, 146, 129, 147, 113, + 162, 97, 178, 97, 179, 81, 179, 65, 210, 65, 211, 34, + 211, 33, 242, 33, 245, 244, 240, 35, 240, 35, 240, 34, + 240, 65, 0, 21, 48, 75, 30, 0, 26, 41, 24, 40, + 83, 115, 99, 131, 115, 113, 162, 115, 113, 163, 99, 113, + 163, 81, 18, 97, 194, 81, 19, 81, 194, 81, 34, 81, + 195, 49, 50, 65, 226, 49, 51, 49, 226, 49, 51, 49, + 227, 17, 82, 33, 243, 17, 83, 17, 240, 18, 17, 83, + 17, 240, 18, 17, 99, 240, 35, 115, 240, 50, 115, 240, + 50, 129, 240, 65, 145, 0, 31, 48, 46, 21, 0, 18, + 57, 40, 84, 99, 147, 98, 178, 97, 195, 65, 227, 34, + 227, 33, 240, 20, 240, 51, 240, 51, 240, 52, 240, 17, + 34, 242, 35, 210, 67, 193, 98, 177, 115, 146, 131, 115, + 132, 72, 41, 0, 21, 32, 45, 22, 0, 19, 41, 56, + 84, 130, 147, 129, 178, 114, 179, 97, 210, 81, 242, 50, + 243, 33, 240, 34, 17, 240, 52, 240, 66, 240, 82, 240, + 82, 240, 82, 240, 82, 240, 82, 240, 82, 240, 82, 240, + 40, 0, 23, 40, 18, 0, 16, 14, 68, 99, 82, 116, + 82, 100, 97, 115, 113, 100, 113, 84, 129, 83, 227, 228, + 227, 227, 97, 115, 113, 100, 113, 99, 129, 83, 130, 68, + 130, 67, 131, 63, 0, 18, 48, 31, 8, 0, 7, 6, + 34, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 102, 160, 31, 9, 0, 7, 114, 114, 129, 129, 129, 130, + 129, 129, 129, 130, 114, 129, 129, 129, 130, 129, 129, 129, + 129, 130, 129, 129, 129, 130, 129, 129, 176, 31, 8, 0, + 7, 6, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 38, 160, 25, 15, 0, 13, 98, 211, 178, 18, + 146, 49, 145, 66, 114, 81, 98, 113, 81, 130, 50, 145, + 49, 177, 0, 32, 16, 8, 15, 0, 54, 61, 0, 7, + 96, 12, 7, 0, 6, 18, 83, 82, 98, 113, 0, 19, + 64, 33, 13, 0, 23, 20, 114, 50, 97, 82, 82, 66, + 82, 66, 133, 98, 50, 82, 66, 17, 34, 82, 17, 34, + 82, 17, 35, 36, 17, 52, 50, 0, 13, 48, 41, 14, + 0, 12, 36, 194, 194, 194, 194, 194, 194, 194, 35, 114, + 17, 49, 99, 66, 82, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 66, 98, 65, 17, 66, 81, 18, 50, 81, 51, + 0, 14, 80, 26, 11, 0, 19, 85, 82, 65, 50, 81, + 34, 82, 34, 81, 50, 146, 146, 146, 97, 50, 81, 65, + 65, 100, 0, 11, 64, 40, 15, 0, 13, 102, 210, 210, + 210, 210, 210, 210, 116, 34, 97, 65, 18, 82, 83, 66, + 99, 66, 114, 66, 114, 66, 114, 66, 114, 66, 99, 82, + 83, 97, 65, 18, 116, 36, 0, 15, 32, 27, 12, 0, + 21, 53, 97, 66, 65, 82, 50, 83, 34, 83, 42, 34, + 162, 113, 34, 113, 50, 97, 66, 50, 101, 0, 12, 64, + 29, 11, 0, 10, 20, 98, 49, 66, 50, 66, 50, 66, + 146, 146, 119, 98, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 118, 0, 11, 80, 40, 16, 0, 28, 53, 50, 82, + 67, 18, 50, 86, 50, 98, 17, 66, 98, 98, 98, 113, + 83, 114, 66, 134, 130, 225, 250, 137, 113, 114, 66, 145, + 65, 161, 65, 145, 97, 99, 119, 240, 128, 39, 15, 0, + 13, 20, 210, 210, 210, 210, 210, 210, 210, 36, 114, 17, + 34, 115, 66, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 70, 22, 0, 15, 32, + 24, 9, 0, 8, 19, 99, 99, 240, 240, 165, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 71, 0, 9, 32, + 32, 9, 0, 8, 51, 99, 99, 240, 240, 165, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 34, 50, 34, 50, 33, 50, 68, 208, 38, 15, 0, 13, + 20, 210, 210, 210, 210, 210, 210, 210, 39, 66, 82, 98, + 81, 114, 65, 130, 34, 146, 18, 163, 18, 146, 50, 130, + 51, 114, 66, 114, 82, 70, 22, 0, 15, 32, 26, 8, + 0, 7, 4, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 8, 32, + 45, 22, 0, 38, 68, 36, 52, 114, 17, 50, 17, 35, + 99, 67, 66, 99, 67, 66, 98, 82, 82, 98, 82, 82, + 98, 82, 82, 98, 82, 82, 98, 82, 82, 98, 82, 82, + 98, 82, 82, 70, 22, 22, 0, 22, 32, 32, 15, 0, + 26, 36, 36, 114, 17, 34, 115, 66, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 70, 22, 0, 15, 32, 29, 13, 0, 23, 21, 114, 50, + 82, 82, 50, 114, 34, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 50, 82, 82, 50, 117, 0, 13, 80, 39, 14, + 0, 24, 68, 35, 114, 17, 49, 99, 66, 82, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 67, 66, 82, + 17, 50, 82, 35, 114, 194, 194, 194, 194, 194, 166, 240, + 112, 40, 15, 0, 26, 84, 49, 97, 65, 33, 82, 81, + 17, 66, 99, 66, 114, 66, 114, 66, 114, 66, 114, 66, + 99, 82, 83, 97, 65, 18, 116, 34, 210, 210, 210, 210, + 210, 210, 182, 240, 32, 24, 11, 0, 19, 36, 34, 82, + 17, 33, 67, 34, 67, 34, 66, 146, 146, 146, 146, 146, + 146, 118, 0, 11, 80, 26, 10, 0, 17, 84, 81, 66, + 49, 81, 49, 147, 147, 147, 49, 82, 33, 97, 34, 81, + 35, 50, 33, 36, 0, 10, 48, 31, 11, 0, 11, 49, + 161, 161, 161, 146, 131, 120, 82, 146, 146, 146, 146, 65, + 66, 65, 66, 65, 66, 65, 66, 65, 66, 49, 100, 0, + 11, 64, 32, 15, 0, 26, 36, 52, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 67, + 98, 67, 98, 49, 18, 116, 36, 0, 15, 32, 26, 14, + 0, 24, 69, 37, 51, 81, 98, 81, 98, 65, 129, 65, + 130, 49, 130, 33, 162, 17, 163, 194, 194, 193, 0, 15, + 41, 20, 0, 35, 5, 28, 50, 67, 66, 98, 66, 65, + 114, 66, 65, 114, 49, 18, 49, 130, 33, 18, 33, 146, + 33, 18, 33, 146, 17, 50, 17, 163, 51, 179, 51, 178, + 82, 193, 81, 0, 21, 28, 15, 0, 26, 38, 37, 67, + 66, 114, 65, 146, 33, 179, 195, 210, 193, 18, 161, 50, + 129, 66, 114, 82, 70, 22, 0, 15, 32, 36, 15, 0, + 26, 38, 22, 66, 82, 98, 81, 130, 65, 130, 65, 145, + 49, 162, 33, 162, 33, 179, 195, 210, 209, 225, 209, 225, + 147, 33, 147, 17, 162, 33, 179, 240, 176, 28, 12, 0, + 21, 24, 66, 51, 65, 66, 81, 50, 97, 35, 146, 146, + 65, 67, 65, 66, 66, 50, 82, 35, 67, 42, 0, 12, + 32, 32, 9, 0, 7, 35, 82, 98, 114, 114, 114, 115, + 114, 114, 114, 114, 114, 98, 82, 146, 129, 130, 114, 114, + 114, 99, 98, 114, 114, 114, 129, 147, 176, 29, 4, 240, + 210, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 160, 32, 9, 0, 6, 99, 130, 130, 114, 114, 114, + 99, 98, 114, 114, 114, 114, 130, 146, 82, 98, 114, 114, + 114, 114, 115, 114, 114, 114, 114, 98, 83, 240, 14, 14, + 0, 31, 115, 81, 50, 35, 33, 49, 99, 0, 23, 32, + 5, 10, 0, 42, 64, 22, 6, 0, 10, 82, 52, 50, + 240, 114, 66, 66, 66, 66, 66, 66, 52, 36, 36, 36, + 36, 50, 144, 45, 11, 0, 12, 1, 161, 145, 161, 161, + 161, 101, 82, 33, 17, 50, 51, 34, 49, 18, 34, 49, + 17, 50, 49, 82, 33, 98, 33, 98, 17, 65, 51, 65, + 66, 49, 100, 97, 161, 145, 161, 161, 145, 161, 240, 96, + 36, 15, 0, 14, 5, 146, 50, 114, 66, 98, 67, 98, + 81, 114, 195, 194, 210, 169, 146, 210, 209, 225, 209, 145, + 68, 97, 49, 50, 65, 50, 70, 50, 84, 0, 15, 64, + 29, 12, 0, 21, 1, 36, 33, 50, 66, 65, 97, 49, + 129, 33, 129, 33, 129, 33, 129, 49, 97, 66, 66, 49, + 36, 33, 0, 15, 32, 34, 16, 0, 14, 6, 53, 66, + 113, 98, 113, 114, 81, 130, 81, 146, 49, 162, 33, 194, + 17, 154, 162, 226, 226, 170, 162, 226, 226, 226, 226, 198, + 0, 16, 96, 25, 4, 240, 210, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 240, 114, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 160, 48, 10, 0, 9, 34, 113, 33, 81, + 34, 81, 34, 81, 146, 130, 131, 97, 19, 65, 50, 65, + 66, 49, 82, 33, 82, 34, 81, 34, 81, 50, 65, 51, + 33, 83, 17, 99, 130, 130, 145, 82, 33, 82, 33, 81, + 33, 114, 240, 16, 10, 10, 0, 11, 34, 66, 34, 66, + 0, 29, 63, 21, 0, 19, 23, 195, 83, 146, 146, 113, + 68, 33, 33, 82, 50, 51, 34, 65, 50, 82, 49, 50, + 34, 113, 50, 33, 50, 113, 65, 33, 50, 193, 33, 50, + 193, 33, 50, 113, 65, 33, 50, 97, 81, 33, 66, 81, + 66, 49, 66, 50, 65, 66, 68, 82, 81, 209, 114, 146, + 147, 83, 199, 0, 22, 22, 9, 0, 8, 3, 97, 33, + 81, 33, 114, 82, 17, 66, 33, 17, 34, 33, 17, 39, + 0, 21, 80, 24, 10, 0, 20, 65, 33, 81, 49, 65, + 49, 66, 34, 50, 34, 82, 34, 81, 49, 97, 49, 97, + 0, 11, 112, 13, 16, 0, 32, 14, 226, 226, 226, 226, + 226, 0, 24, 32, 8, 10, 0, 25, 8, 0, 16, 64, + 66, 21, 0, 19, 23, 195, 83, 146, 146, 113, 24, 65, + 82, 50, 51, 34, 65, 66, 66, 49, 50, 66, 66, 50, + 33, 82, 66, 65, 33, 82, 50, 81, 33, 85, 113, 33, + 82, 50, 81, 33, 82, 50, 81, 33, 82, 50, 33, 18, + 49, 66, 50, 33, 17, 66, 22, 35, 18, 81, 209, 114, + 146, 147, 83, 199, 0, 22, 8, 9, 0, 11, 39, 0, + 26, 16, 25, 12, 0, 10, 116, 98, 66, 65, 97, 49, + 129, 33, 129, 33, 129, 33, 129, 49, 97, 66, 66, 100, + 0, 26, 16, 23, 15, 0, 21, 50, 210, 210, 210, 210, + 210, 125, 130, 210, 210, 210, 210, 210, 240, 240, 125, 0, + 13, 48, 21, 9, 0, 8, 4, 66, 35, 33, 66, 35, + 34, 114, 98, 98, 97, 113, 65, 39, 0, 19, 48, 24, + 9, 0, 8, 5, 49, 51, 33, 66, 49, 50, 98, 83, + 145, 50, 50, 33, 66, 33, 51, 52, 0, 18, 64, 11, + 7, 0, 6, 66, 67, 66, 66, 65, 0, 20, 40, 17, + 0, 32, 50, 82, 130, 82, 130, 66, 130, 82, 130, 82, + 130, 82, 130, 66, 131, 66, 49, 67, 66, 49, 67, 49, + 17, 33, 66, 35, 35, 82, 242, 241, 242, 242, 241, 0, + 6, 32, 57, 14, 0, 12, 89, 52, 49, 100, 49, 85, + 49, 85, 49, 85, 49, 85, 49, 100, 49, 100, 49, 115, + 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, + 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, + 49, 145, 49, 145, 49, 145, 49, 145, 49, 240, 64, 9, + 5, 0, 10, 83, 35, 35, 0, 9, 12, 7, 0, 23, + 1, 83, 98, 82, 82, 36, 240, 32, 18, 8, 0, 7, + 4, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, + 16, 32, 21, 9, 0, 8, 19, 82, 18, 50, 50, 34, + 50, 34, 50, 34, 50, 50, 18, 83, 0, 21, 112, 24, + 11, 0, 22, 65, 113, 49, 113, 49, 98, 34, 98, 34, + 66, 34, 81, 49, 81, 49, 81, 49, 0, 13, 16, 51, + 20, 0, 17, 68, 145, 130, 130, 130, 129, 146, 113, 162, + 113, 162, 97, 178, 82, 178, 81, 194, 66, 66, 69, 49, + 82, 177, 83, 162, 65, 18, 161, 81, 18, 146, 65, 34, + 145, 65, 50, 130, 72, 97, 146, 113, 162, 98, 149, 0, + 20, 32, 52, 19, 0, 16, 84, 145, 114, 129, 130, 129, + 130, 113, 146, 113, 146, 97, 162, 82, 162, 81, 178, 66, + 20, 69, 49, 18, 34, 161, 33, 66, 130, 35, 34, 129, + 130, 114, 129, 129, 129, 130, 113, 145, 113, 49, 81, 113, + 65, 66, 103, 0, 19, 32, 56, 21, 0, 18, 69, 129, + 97, 66, 97, 114, 50, 97, 194, 81, 163, 98, 209, 81, + 226, 49, 162, 50, 49, 161, 66, 33, 97, 65, 50, 34, + 82, 84, 49, 83, 177, 99, 162, 81, 18, 161, 81, 34, + 146, 65, 50, 145, 88, 97, 162, 114, 162, 113, 165, 0, + 21, 32, 28, 11, 0, 19, 115, 131, 131, 240, 81, 161, + 161, 161, 116, 101, 82, 130, 145, 161, 161, 83, 33, 83, + 49, 82, 50, 65, 100, 240, 53, 20, 240, 178, 240, 51, + 240, 51, 240, 66, 240, 81, 240, 240, 113, 240, 66, 240, + 35, 240, 35, 240, 36, 241, 34, 241, 34, 241, 35, 209, + 66, 209, 66, 209, 67, 185, 177, 98, 177, 98, 161, 115, + 145, 130, 130, 131, 100, 115, 72, 40, 0, 20, 32, 54, + 20, 240, 240, 33, 240, 35, 240, 34, 240, 33, 240, 49, + 240, 240, 161, 240, 66, 240, 35, 240, 35, 240, 36, 241, + 34, 241, 34, 241, 35, 209, 66, 209, 66, 209, 67, 185, + 177, 98, 177, 98, 161, 115, 145, 130, 130, 130, 116, 115, + 72, 40, 0, 20, 32, 53, 20, 240, 225, 240, 51, 240, + 18, 33, 225, 81, 193, 240, 240, 209, 240, 66, 240, 35, + 240, 35, 240, 36, 241, 34, 241, 34, 241, 35, 209, 66, + 209, 66, 209, 67, 185, 177, 98, 177, 98, 161, 115, 145, + 130, 130, 131, 100, 115, 72, 40, 0, 20, 32, 49, 20, + 0, 5, 100, 65, 161, 53, 0, 9, 49, 240, 66, 240, + 35, 240, 35, 240, 36, 241, 34, 241, 34, 241, 35, 209, + 66, 209, 66, 209, 67, 185, 177, 98, 177, 98, 161, 115, + 145, 130, 130, 131, 100, 115, 72, 40, 0, 20, 32, 49, + 19, 240, 240, 210, 66, 178, 66, 0, 8, 114, 240, 34, + 240, 34, 240, 19, 240, 20, 241, 18, 225, 34, 225, 35, + 209, 50, 193, 66, 193, 67, 184, 161, 98, 161, 99, 145, + 114, 130, 114, 130, 115, 99, 115, 72, 24, 0, 19, 32, + 54, 20, 116, 242, 50, 209, 81, 209, 81, 210, 50, 229, + 240, 240, 113, 240, 65, 240, 51, 240, 35, 240, 20, 240, + 17, 19, 241, 34, 225, 50, 225, 51, 209, 66, 193, 82, + 201, 177, 83, 161, 114, 161, 115, 130, 115, 130, 130, 115, + 131, 72, 40, 0, 20, 32, 68, 30, 0, 27, 79, 2, + 240, 35, 115, 240, 20, 130, 240, 17, 18, 130, 241, 34, + 145, 226, 34, 81, 49, 210, 50, 81, 49, 209, 66, 66, + 240, 17, 82, 66, 255, 241, 98, 66, 225, 114, 66, 65, + 130, 114, 81, 65, 129, 130, 81, 50, 113, 146, 146, 98, + 146, 146, 83, 146, 131, 83, 146, 116, 41, 63, 1, 0, + 30, 32, 48, 17, 0, 15, 69, 65, 98, 66, 18, 67, + 100, 66, 131, 51, 146, 50, 162, 35, 177, 35, 177, 35, + 227, 227, 227, 177, 35, 161, 66, 161, 67, 145, 82, 145, + 83, 113, 115, 66, 165, 225, 242, 244, 242, 242, 242, 195, + 240, 176, 56, 18, 240, 114, 240, 19, 240, 35, 240, 34, + 240, 240, 239, 98, 115, 98, 130, 98, 130, 98, 145, 98, + 81, 49, 98, 81, 49, 98, 66, 49, 98, 66, 168, 162, + 66, 162, 66, 162, 81, 65, 82, 81, 50, 82, 146, 82, + 146, 82, 131, 82, 116, 47, 1, 0, 18, 32, 53, 18, + 240, 210, 243, 226, 226, 0, 5, 111, 98, 115, 98, 130, + 98, 130, 98, 145, 98, 81, 49, 98, 81, 49, 98, 66, + 49, 98, 66, 168, 162, 66, 162, 66, 162, 81, 65, 82, + 81, 50, 82, 146, 82, 146, 82, 131, 82, 116, 47, 1, + 0, 18, 32, 55, 18, 240, 162, 244, 210, 34, 177, 97, + 240, 240, 207, 98, 115, 98, 130, 98, 130, 98, 145, 98, + 81, 49, 98, 81, 49, 98, 66, 49, 98, 66, 168, 162, + 66, 162, 66, 162, 81, 65, 82, 81, 50, 82, 146, 82, + 146, 82, 131, 82, 116, 47, 1, 0, 18, 32, 54, 18, + 240, 240, 162, 66, 162, 66, 0, 7, 79, 98, 115, 98, + 130, 98, 130, 98, 145, 98, 81, 49, 98, 81, 49, 98, + 66, 49, 98, 66, 168, 162, 66, 162, 66, 162, 81, 65, + 82, 81, 50, 82, 146, 82, 146, 82, 131, 82, 116, 47, + 1, 0, 18, 32, 29, 10, 177, 146, 146, 161, 240, 168, + 82, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 88, 0, 10, 32, 30, 11, 240, + 34, 131, 114, 129, 240, 233, 82, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 105, + 0, 11, 32, 31, 10, 210, 116, 82, 34, 49, 97, 240, + 120, 82, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 88, 0, 10, 32, 31, 10, + 240, 82, 66, 34, 66, 240, 240, 40, 82, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 88, 0, 10, 32, 43, 19, 0, 16, 92, 162, 99, + 130, 115, 114, 130, 114, 131, 98, 146, 98, 147, 82, 147, + 82, 147, 41, 83, 82, 147, 82, 147, 82, 147, 82, 146, + 98, 131, 98, 130, 114, 115, 114, 99, 92, 0, 19, 112, + 61, 21, 0, 6, 4, 65, 162, 53, 0, 8, 101, 119, + 68, 145, 131, 145, 132, 129, 129, 19, 113, 129, 20, 97, + 129, 35, 97, 129, 51, 81, 129, 67, 65, 129, 67, 65, + 129, 83, 49, 129, 99, 33, 129, 115, 17, 129, 115, 17, + 129, 132, 129, 147, 129, 162, 115, 146, 87, 129, 0, 21, + 80, 50, 19, 240, 146, 240, 35, 240, 35, 240, 50, 0, + 6, 85, 194, 82, 146, 114, 114, 146, 83, 147, 66, 178, + 51, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, + 35, 179, 50, 178, 67, 147, 82, 146, 114, 114, 146, 82, + 197, 0, 20, 48, 19, 240, 226, 240, 19, 243, 242, 0, + 6, 101, 194, 82, 146, 114, 114, 146, 83, 147, 66, 178, + 51, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, + 35, 179, 50, 178, 67, 147, 82, 146, 114, 114, 146, 82, + 197, 0, 20, 51, 19, 129, 240, 35, 240, 19, 241, 49, + 209, 81, 0, 6, 53, 194, 82, 146, 114, 114, 146, 83, + 147, 66, 178, 51, 179, 35, 179, 35, 179, 35, 179, 35, + 179, 35, 179, 35, 179, 50, 178, 67, 147, 82, 146, 114, + 114, 146, 82, 197, 0, 20, 48, 19, 240, 240, 212, 65, + 130, 53, 0, 8, 85, 194, 82, 146, 114, 114, 146, 83, + 147, 66, 178, 51, 179, 35, 179, 35, 179, 35, 179, 35, + 179, 35, 179, 35, 179, 50, 178, 67, 147, 82, 146, 114, + 114, 146, 82, 197, 0, 20, 48, 19, 240, 240, 194, 66, + 178, 66, 0, 8, 101, 194, 82, 146, 114, 114, 146, 83, + 147, 66, 178, 51, 179, 35, 179, 35, 179, 35, 179, 35, + 179, 35, 179, 35, 179, 50, 178, 67, 147, 82, 146, 114, + 114, 146, 82, 197, 0, 20, 25, 12, 0, 21, 17, 113, + 50, 82, 65, 66, 97, 34, 131, 146, 146, 17, 114, 49, + 82, 81, 50, 113, 0, 15, 32, 55, 19, 0, 17, 53, + 81, 98, 82, 33, 98, 115, 98, 146, 83, 132, 66, 130, + 18, 51, 114, 35, 35, 98, 51, 35, 97, 67, 35, 81, + 83, 35, 65, 99, 35, 50, 99, 35, 34, 115, 50, 18, + 130, 68, 131, 82, 146, 99, 114, 97, 34, 82, 97, 85, + 0, 20, 51, 21, 240, 194, 240, 67, 240, 82, 240, 97, + 0, 6, 72, 71, 82, 147, 114, 161, 130, 161, 130, 161, + 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, + 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 146, 129, + 178, 82, 215, 0, 22, 52, 21, 240, 240, 35, 240, 35, + 240, 35, 240, 34, 0, 6, 88, 71, 82, 147, 114, 161, + 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, + 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, + 130, 161, 146, 129, 178, 82, 215, 0, 22, 53, 21, 145, + 240, 82, 240, 52, 240, 17, 50, 210, 97, 0, 6, 24, + 71, 82, 147, 114, 161, 130, 161, 130, 161, 130, 161, 130, + 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, + 161, 130, 161, 130, 161, 130, 161, 146, 129, 178, 82, 215, + 0, 22, 49, 21, 0, 6, 2, 66, 210, 66, 0, 8, + 105, 55, 82, 147, 114, 161, 130, 161, 130, 161, 130, 161, + 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, 130, 161, + 130, 161, 130, 161, 130, 161, 130, 161, 146, 129, 178, 82, + 215, 0, 22, 54, 22, 240, 240, 66, 240, 67, 240, 51, + 240, 50, 0, 6, 121, 56, 84, 130, 147, 129, 178, 114, + 179, 97, 210, 81, 242, 50, 243, 33, 240, 34, 17, 240, + 52, 240, 66, 240, 82, 240, 82, 240, 82, 240, 82, 240, + 82, 240, 82, 240, 82, 240, 40, 0, 23, 56, 18, 0, + 16, 18, 213, 83, 115, 54, 114, 18, 52, 99, 99, 98, + 116, 82, 131, 82, 131, 82, 131, 82, 131, 82, 131, 82, + 131, 82, 130, 98, 115, 98, 114, 114, 99, 114, 83, 130, + 66, 162, 35, 180, 226, 240, 18, 240, 18, 240, 18, 242, + 226, 240, 17, 240, 32, 47, 14, 0, 12, 116, 131, 34, + 114, 66, 82, 82, 82, 82, 82, 81, 98, 66, 98, 19, + 130, 66, 98, 82, 82, 82, 82, 98, 66, 98, 66, 98, + 66, 98, 66, 19, 34, 66, 18, 50, 66, 18, 34, 52, + 36, 0, 14, 64, 40, 13, 0, 11, 66, 194, 179, 193, + 209, 240, 240, 100, 129, 50, 97, 82, 82, 66, 82, 66, + 148, 99, 34, 82, 66, 17, 34, 82, 17, 34, 82, 17, + 35, 36, 17, 52, 50, 0, 13, 48, 40, 13, 0, 12, + 34, 162, 162, 162, 162, 240, 240, 116, 114, 50, 97, 82, + 82, 66, 82, 66, 133, 98, 50, 82, 66, 17, 34, 82, + 17, 34, 82, 17, 35, 36, 17, 52, 50, 0, 13, 48, + 43, 13, 0, 11, 113, 179, 161, 18, 129, 65, 97, 97, + 240, 240, 52, 114, 50, 97, 82, 82, 66, 82, 66, 133, + 98, 50, 82, 66, 17, 34, 82, 17, 34, 82, 17, 35, + 36, 17, 52, 50, 0, 13, 48, 41, 13, 0, 14, 115, + 145, 34, 33, 65, 67, 240, 240, 68, 114, 50, 97, 82, + 82, 66, 82, 66, 133, 98, 50, 82, 66, 17, 34, 82, + 17, 34, 82, 17, 35, 36, 17, 52, 50, 0, 13, 48, + 39, 13, 0, 14, 98, 50, 98, 50, 0, 5, 100, 115, + 34, 98, 66, 83, 50, 98, 50, 148, 114, 34, 97, 66, + 33, 34, 66, 33, 34, 66, 33, 35, 20, 33, 51, 51, + 0, 13, 48, 43, 13, 0, 11, 100, 130, 34, 113, 65, + 113, 50, 132, 240, 240, 84, 114, 50, 97, 82, 82, 66, + 82, 66, 133, 98, 50, 82, 66, 17, 34, 82, 17, 34, + 82, 17, 35, 36, 17, 52, 50, 0, 13, 48, 41, 19, + 0, 33, 69, 52, 97, 66, 17, 65, 81, 82, 82, 66, + 66, 82, 81, 66, 82, 124, 82, 50, 177, 82, 113, 34, + 82, 97, 50, 65, 18, 81, 51, 34, 18, 66, 68, 84, + 0, 19, 80, 31, 11, 0, 19, 85, 82, 65, 50, 81, + 34, 82, 34, 81, 50, 146, 146, 146, 97, 50, 81, 66, + 49, 100, 145, 147, 162, 146, 146, 100, 240, 176, 34, 12, + 0, 10, 97, 178, 178, 178, 177, 240, 240, 53, 97, 66, + 65, 82, 50, 83, 34, 83, 42, 34, 162, 113, 34, 113, + 50, 97, 66, 50, 101, 0, 12, 64, 34, 12, 0, 11, + 50, 147, 146, 145, 161, 240, 240, 69, 97, 66, 65, 82, + 50, 83, 34, 83, 42, 34, 162, 113, 34, 113, 50, 82, + 66, 50, 101, 0, 12, 64, 36, 12, 0, 11, 17, 163, + 130, 18, 97, 66, 65, 113, 240, 229, 97, 66, 65, 82, + 50, 83, 34, 83, 42, 34, 162, 113, 34, 113, 50, 97, + 66, 50, 101, 0, 12, 64, 33, 12, 0, 13, 98, 50, + 82, 50, 240, 240, 197, 97, 66, 65, 82, 50, 98, 34, + 98, 42, 34, 162, 113, 34, 113, 50, 82, 65, 66, 101, + 0, 12, 64, 25, 9, 0, 7, 114, 115, 114, 145, 145, + 240, 132, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 86, 0, 9, 32, 25, 8, 0, 7, 66, 83, 82, 81, + 97, 240, 116, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 70, 0, 8, 32, 28, 9, 0, 8, 33, 115, 97, + 17, 81, 49, 49, 81, 240, 100, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 86, 0, 9, 32, 24, 9, 0, + 10, 18, 50, 34, 50, 240, 244, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 86, 0, 9, 32, 45, 14, 0, + 12, 66, 113, 66, 83, 82, 34, 33, 99, 65, 33, 51, + 116, 19, 98, 66, 177, 18, 130, 50, 98, 67, 82, 82, + 66, 114, 50, 114, 50, 114, 50, 114, 50, 114, 66, 82, + 98, 50, 133, 0, 14, 80, 41, 15, 0, 17, 35, 65, + 97, 34, 33, 97, 67, 240, 240, 100, 36, 114, 17, 34, + 115, 66, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 70, 22, 0, 15, 32, 36, + 13, 0, 11, 82, 178, 194, 194, 209, 240, 240, 85, 114, + 50, 82, 82, 50, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 50, 82, 82, 50, 117, 0, 13, 80, 36, + 13, 0, 12, 34, 178, 162, 162, 161, 240, 240, 117, 114, + 50, 82, 82, 50, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 50, 82, 82, 50, 117, 0, 13, 80, 39, + 13, 0, 12, 1, 179, 146, 18, 114, 65, 81, 113, 240, + 240, 37, 114, 50, 82, 82, 50, 114, 34, 114, 34, 114, + 34, 114, 34, 114, 34, 114, 50, 82, 82, 50, 117, 0, + 13, 80, 37, 13, 0, 14, 115, 145, 35, 33, 49, 83, + 240, 240, 53, 114, 50, 82, 82, 50, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 34, 114, 50, 82, 82, 50, 117, + 0, 13, 80, 35, 13, 0, 14, 114, 50, 98, 50, 0, + 5, 101, 114, 50, 82, 82, 50, 114, 34, 114, 34, 114, + 34, 114, 34, 114, 34, 114, 50, 82, 82, 50, 117, 0, + 13, 80, 18, 15, 0, 26, 115, 195, 195, 240, 240, 125, + 240, 240, 115, 195, 195, 0, 17, 96, 35, 13, 0, 23, + 21, 33, 66, 51, 66, 82, 50, 84, 34, 66, 18, 34, + 50, 34, 34, 34, 50, 34, 18, 66, 36, 82, 50, 82, + 67, 50, 65, 37, 0, 13, 80, 39, 15, 0, 13, 50, + 211, 211, 225, 241, 240, 240, 132, 52, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 67, + 98, 67, 98, 49, 18, 116, 36, 0, 15, 32, 39, 15, + 0, 14, 17, 210, 194, 194, 209, 240, 240, 148, 52, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 67, 98, 67, 98, 49, 18, 116, 36, 0, 15, + 32, 42, 15, 0, 13, 98, 195, 193, 33, 161, 65, 129, + 97, 240, 240, 84, 52, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 67, 98, 67, 98, + 49, 18, 116, 36, 0, 15, 32, 38, 15, 0, 17, 18, + 66, 114, 66, 0, 6, 36, 52, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 67, 98, + 67, 98, 49, 18, 116, 36, 0, 15, 32, 43, 15, 0, + 14, 18, 195, 194, 193, 209, 240, 240, 150, 22, 66, 82, + 98, 82, 114, 65, 130, 65, 145, 49, 162, 33, 162, 33, + 179, 195, 210, 209, 225, 225, 209, 147, 33, 147, 17, 162, + 33, 179, 240, 176, 43, 13, 0, 14, 84, 178, 178, 178, + 178, 178, 35, 98, 17, 34, 83, 66, 66, 82, 66, 82, + 66, 82, 66, 82, 66, 81, 82, 66, 82, 65, 98, 49, + 114, 18, 131, 162, 178, 178, 178, 178, 146, 240, 144, 42, + 15, 0, 17, 34, 50, 130, 50, 0, 6, 38, 37, 66, + 82, 99, 65, 130, 65, 130, 65, 146, 33, 162, 33, 163, + 17, 179, 195, 210, 209, 225, 209, 225, 147, 33, 147, 17, + 162, 33, 179, 240, 176, +}; + +//***************************************************************************** +// +// The glyph offset table for the 26 point Theanomodern font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanomodern26[] = +{ + 0, 5, 29, 50, 93, 162, 223, 278, + 291, 322, 354, 384, 404, 419, 427, 437, + 469, 512, 538, 574, 611, 645, 681, 723, + 755, 797, 838, 853, 872, 893, 904, 925, + 955, 1027, 1070, 1112, 1154, 1197, 1245, 1285, + 1333, 1377, 1403, 1434, 1479, 1523, 1596, 1651, + 1693, 1727, 1784, 1831, 1873, 1923, 1966, 2009, + 2084, 2130, 2175, 2215, 2246, 2277, 2308, 2333, + 2341, 2353, 2386, 2427, 2453, 2493, 2520, 2549, + 2589, 2628, 2652, 2684, 2722, 2748, 2793, 2825, + 2854, 2893, 2933, 2957, 2983, 3014, 3046, 3072, + 3113, 3141, 3177, 3205, 3237, 3266, 3298, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3312, 3317, 3339, 3384, 3420, 3449, 3483, 3508, + 3556, 3566, 3629, 3651, 3675, 3688, 3696, 3762, + 3770, 3795, 3818, 3839, 3863, 3874, 3914, 3971, + 3980, 3992, 4010, 4031, 4055, 4106, 4158, 4214, + 4242, 4295, 4349, 4402, 4451, 4500, 4554, 4622, + 4670, 4726, 4779, 4834, 4888, 4917, 4947, 4978, + 5009, 5052, 5113, 5163, 5211, 5262, 5310, 5358, + 5383, 5438, 5489, 5541, 5594, 5643, 5697, 5753, + 5800, 5840, 5880, 5923, 5964, 6003, 6046, 6087, + 6118, 6152, 6186, 6222, 6255, 6280, 6305, 6333, + 6357, 6402, 6443, 6479, 6515, 6554, 6591, 6626, + 6644, 6679, 6718, 6757, 6799, 6837, 6880, 6923, +}; + +//***************************************************************************** +// +// The font definition for the 26 point Theanomodern font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanomodern26 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 27, + + // + // The height of the font. + // + 34, + + // + // The baseline of the font. + // + 26, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanomodern26, + + // + // A pointer to the actual font data + // + g_pui8Theanomodern26Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanomodern28.c b/third_party/fonts/ofl/fonts/fonttheanomodern28.c new file mode 100644 index 0000000..3677afc --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanomodern28.c @@ -0,0 +1,853 @@ +//***************************************************************************** +// +// fonttheanomodern28.c - Font definition for the 28pt Theanomodern font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanomodern +// Size: 28 point +// Bold: no +// Italic: no +// Memory usage: 7808 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 28 point Theanomodern font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanomodern28Data[7606] = +{ + 5, 11, 0, 50, 112, 26, 6, 240, 240, 210, 52, 36, + 36, 36, 36, 50, 66, 66, 66, 66, 66, 66, 66, 81, + 240, 114, 52, 50, 0, 7, 16, 23, 9, 0, 7, 114, + 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, + 50, 33, 65, 0, 25, 16, 47, 16, 0, 14, 82, 65, + 146, 65, 145, 81, 145, 81, 145, 66, 145, 66, 130, 65, + 94, 97, 81, 145, 81, 145, 66, 130, 65, 145, 81, 145, + 81, 110, 81, 66, 130, 65, 145, 81, 145, 81, 145, 66, + 145, 66, 0, 18, 112, 73, 15, 0, 10, 1, 33, 177, + 33, 166, 116, 35, 82, 33, 33, 18, 65, 49, 33, 18, + 50, 49, 36, 50, 49, 36, 51, 33, 33, 100, 17, 33, + 118, 17, 135, 167, 145, 21, 129, 37, 113, 33, 19, 35, + 33, 33, 34, 35, 33, 33, 34, 35, 33, 33, 34, 34, + 49, 33, 34, 49, 49, 33, 18, 82, 17, 35, 133, 177, + 33, 177, 33, 0, 13, 112, 66, 21, 0, 18, 84, 130, + 98, 34, 113, 113, 65, 98, 98, 66, 81, 114, 66, 66, + 114, 66, 65, 130, 66, 49, 161, 65, 65, 162, 34, 49, + 196, 50, 240, 65, 240, 66, 52, 193, 50, 34, 161, 65, + 65, 161, 50, 66, 129, 66, 66, 114, 66, 66, 113, 82, + 66, 98, 97, 65, 113, 114, 34, 97, 148, 0, 24, 16, + 61, 20, 0, 18, 35, 240, 18, 33, 226, 65, 210, 65, + 210, 65, 211, 49, 211, 33, 244, 240, 19, 54, 117, 66, + 130, 19, 65, 130, 51, 49, 114, 67, 49, 99, 83, 33, + 99, 83, 33, 49, 35, 98, 17, 65, 35, 100, 65, 35, + 114, 81, 51, 99, 49, 68, 65, 19, 33, 102, 52, 0, + 23, 14, 4, 240, 210, 34, 34, 34, 34, 34, 34, 33, + 0, 11, 48, 34, 10, 0, 9, 66, 114, 114, 129, 129, + 130, 129, 130, 130, 129, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 145, 146, 130, 145, 146, 146, 145, 161, 161, 240, + 128, 35, 10, 0, 8, 98, 146, 145, 161, 161, 146, 145, + 146, 130, 145, 146, 130, 130, 130, 130, 130, 130, 130, 130, + 114, 130, 130, 129, 130, 114, 129, 129, 129, 129, 240, 64, + 31, 12, 0, 11, 2, 162, 162, 98, 49, 49, 35, 33, + 34, 66, 17, 17, 131, 114, 19, 67, 33, 34, 34, 49, + 49, 98, 162, 162, 0, 26, 32, 20, 16, 0, 28, 98, + 226, 226, 226, 226, 226, 142, 130, 226, 226, 226, 226, 226, + 226, 0, 19, 15, 6, 0, 18, 99, 52, 36, 81, 81, + 65, 81, 65, 65, 240, 128, 9, 11, 0, 28, 121, 41, + 0, 19, 64, 10, 6, 0, 18, 114, 52, 50, 0, 7, + 16, 34, 10, 0, 9, 66, 129, 145, 130, 130, 129, 145, + 145, 130, 130, 129, 145, 145, 130, 129, 145, 145, 130, 130, + 129, 145, 145, 130, 129, 145, 145, 130, 130, 240, 208, 47, + 16, 0, 14, 84, 163, 35, 115, 67, 98, 98, 83, 99, + 66, 130, 66, 130, 51, 131, 35, 131, 35, 131, 35, 131, + 35, 131, 35, 131, 35, 131, 50, 130, 66, 115, 67, 99, + 82, 98, 99, 67, 115, 35, 164, 0, 18, 112, 28, 12, + 0, 11, 2, 102, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 106, 0, + 13, 96, 40, 14, 0, 12, 86, 114, 51, 82, 83, 50, + 115, 34, 115, 36, 83, 37, 67, 51, 83, 163, 179, 178, + 178, 178, 179, 163, 65, 98, 81, 82, 97, 66, 113, 50, + 114, 58, 59, 0, 16, 16, 41, 15, 0, 13, 70, 115, + 66, 97, 114, 66, 130, 52, 98, 52, 98, 67, 98, 194, + 194, 133, 242, 227, 210, 66, 115, 36, 99, 36, 99, 35, + 115, 34, 130, 65, 115, 82, 67, 118, 0, 17, 80, 37, + 15, 0, 14, 17, 210, 210, 195, 195, 177, 18, 162, 18, + 161, 34, 146, 34, 145, 50, 129, 66, 129, 66, 113, 82, + 98, 82, 109, 146, 210, 210, 210, 210, 154, 0, 17, 16, + 38, 14, 0, 12, 65, 98, 88, 102, 113, 209, 209, 209, + 209, 209, 22, 114, 51, 97, 83, 195, 179, 179, 50, 99, + 36, 83, 36, 83, 34, 99, 50, 99, 66, 67, 117, 0, + 16, 64, 45, 14, 0, 12, 116, 130, 65, 113, 82, 81, + 83, 66, 83, 65, 209, 194, 194, 37, 82, 17, 66, 67, + 98, 51, 114, 34, 130, 34, 130, 34, 130, 49, 130, 49, + 130, 50, 98, 81, 98, 97, 66, 133, 0, 16, 48, 35, + 14, 0, 7, 17, 209, 209, 219, 44, 33, 145, 49, 130, + 49, 129, 65, 114, 193, 194, 193, 194, 194, 178, 194, 179, + 179, 179, 164, 164, 164, 164, 178, 0, 16, 96, 45, 15, + 0, 13, 85, 145, 67, 97, 98, 81, 130, 65, 130, 65, + 130, 65, 130, 66, 113, 99, 65, 119, 151, 113, 53, 82, + 84, 50, 131, 34, 146, 34, 146, 34, 146, 34, 146, 50, + 114, 83, 66, 133, 0, 17, 80, 45, 14, 0, 12, 85, + 130, 65, 98, 97, 82, 98, 50, 129, 50, 129, 50, 130, + 34, 130, 34, 130, 34, 115, 50, 99, 66, 65, 18, 85, + 34, 194, 193, 194, 67, 82, 67, 81, 82, 81, 113, 66, + 132, 0, 16, 80, 15, 6, 0, 11, 50, 52, 51, 240, + 240, 242, 52, 50, 0, 7, 16, 20, 6, 0, 11, 50, + 52, 51, 240, 240, 227, 52, 36, 81, 81, 65, 81, 65, + 65, 240, 128, 22, 15, 0, 25, 113, 195, 163, 163, 179, + 163, 163, 178, 211, 227, 227, 227, 226, 227, 226, 0, 17, + 16, 11, 16, 0, 34, 14, 0, 8, 46, 0, 28, 32, + 22, 15, 0, 24, 49, 227, 227, 226, 227, 227, 227, 226, + 195, 163, 163, 163, 163, 179, 178, 0, 18, 64, 33, 11, + 0, 9, 116, 97, 65, 66, 81, 51, 81, 35, 81, 49, + 97, 161, 161, 146, 130, 85, 99, 129, 161, 161, 161, 240, + 240, 19, 132, 130, 0, 13, 32, 76, 24, 0, 31, 23, + 227, 99, 178, 147, 146, 194, 114, 211, 82, 242, 66, 100, + 34, 35, 50, 82, 49, 18, 50, 50, 66, 67, 66, 34, + 66, 83, 66, 34, 66, 83, 66, 34, 50, 99, 66, 34, + 50, 99, 66, 34, 50, 98, 66, 50, 50, 83, 66, 50, + 50, 68, 65, 82, 50, 34, 18, 49, 98, 68, 52, 130, + 240, 130, 209, 146, 177, 194, 99, 247, 0, 13, 16, 50, + 21, 0, 19, 66, 240, 66, 240, 66, 240, 52, 240, 36, + 240, 33, 18, 240, 18, 18, 240, 17, 35, 241, 35, 226, + 50, 225, 67, 209, 67, 194, 82, 202, 177, 99, 162, 114, + 161, 131, 145, 131, 130, 131, 116, 116, 72, 41, 0, 23, + 112, 46, 19, 0, 16, 93, 146, 99, 130, 115, 114, 131, + 98, 131, 98, 131, 98, 131, 98, 130, 114, 115, 114, 98, + 153, 162, 114, 130, 131, 98, 146, 98, 147, 82, 147, 82, + 147, 82, 147, 82, 131, 98, 115, 77, 0, 22, 16, 45, + 18, 0, 16, 69, 65, 99, 66, 33, 82, 116, 66, 147, + 66, 162, 51, 162, 50, 193, 35, 193, 35, 193, 35, 243, + 243, 243, 243, 193, 50, 193, 51, 177, 51, 161, 82, 161, + 98, 129, 130, 82, 181, 0, 21, 16, 47, 20, 0, 17, + 76, 178, 114, 146, 130, 130, 146, 114, 147, 98, 147, 98, + 162, 98, 163, 82, 163, 82, 163, 82, 163, 82, 163, 82, + 163, 82, 163, 82, 162, 98, 147, 98, 147, 98, 146, 114, + 130, 130, 114, 108, 0, 23, 64, 53, 19, 0, 16, 95, + 1, 98, 116, 98, 131, 98, 146, 98, 146, 98, 81, 65, + 98, 81, 65, 98, 81, 65, 98, 66, 178, 66, 184, 178, + 66, 178, 66, 178, 81, 81, 82, 81, 66, 82, 162, 82, + 162, 82, 147, 82, 147, 82, 117, 47, 2, 0, 21, 80, + 49, 18, 0, 15, 111, 1, 82, 116, 82, 131, 82, 146, + 82, 146, 82, 81, 65, 82, 81, 65, 82, 81, 65, 82, + 66, 162, 66, 168, 162, 66, 162, 66, 162, 81, 162, 81, + 162, 240, 18, 240, 18, 240, 18, 240, 18, 217, 0, 21, + 48, 53, 20, 0, 18, 37, 65, 130, 66, 34, 114, 113, + 18, 98, 147, 83, 147, 83, 162, 82, 178, 67, 178, 67, + 193, 67, 240, 35, 240, 35, 105, 35, 162, 83, 162, 98, + 162, 99, 146, 99, 146, 114, 146, 130, 113, 17, 146, 81, + 33, 181, 49, 0, 23, 16, 47, 22, 0, 19, 41, 41, + 82, 162, 130, 162, 130, 162, 130, 162, 130, 162, 130, 162, + 130, 162, 130, 162, 130, 162, 142, 130, 162, 130, 162, 130, + 162, 130, 162, 130, 162, 130, 162, 130, 162, 130, 162, 130, + 162, 89, 41, 0, 25, 28, 10, 0, 8, 104, 82, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 88, 0, 11, 64, 35, 16, 0, + 14, 104, 178, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 115, 66, 100, 66, 85, 66, 85, 66, 82, 113, + 98, 98, 114, 66, 149, 0, 19, 16, 49, 22, 0, 19, + 41, 41, 82, 147, 130, 146, 146, 130, 162, 114, 178, 98, + 194, 82, 210, 66, 226, 50, 242, 35, 242, 17, 19, 227, + 36, 210, 67, 210, 83, 194, 99, 178, 100, 162, 115, 162, + 131, 146, 147, 130, 148, 73, 41, 0, 25, 48, 19, 0, + 16, 88, 226, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 177, 82, 177, 82, 162, 82, 162, 82, 162, 82, 147, + 82, 132, 82, 117, 47, 2, 0, 21, 80, 78, 26, 0, + 22, 102, 198, 84, 179, 132, 164, 132, 161, 18, 129, 19, + 145, 18, 129, 19, 130, 18, 129, 34, 129, 34, 129, 35, + 98, 34, 129, 35, 97, 50, 129, 51, 81, 50, 129, 51, + 66, 50, 129, 51, 65, 66, 129, 67, 34, 66, 129, 67, + 33, 82, 129, 82, 33, 82, 129, 85, 82, 129, 84, 98, + 129, 99, 98, 129, 99, 98, 129, 98, 114, 88, 49, 57, + 0, 29, 64, 59, 22, 0, 19, 37, 120, 68, 161, 131, + 161, 132, 145, 133, 129, 129, 19, 129, 129, 35, 113, 129, + 51, 97, 129, 52, 81, 129, 67, 81, 129, 83, 65, 129, + 99, 49, 129, 100, 33, 129, 115, 33, 129, 131, 17, 129, + 148, 129, 148, 129, 163, 129, 178, 115, 162, 88, 129, 0, + 25, 48, 47, 20, 0, 18, 38, 195, 67, 146, 130, 115, + 131, 83, 162, 83, 163, 66, 194, 51, 195, 35, 195, 35, + 195, 35, 195, 35, 195, 35, 195, 35, 195, 50, 194, 67, + 163, 67, 163, 83, 131, 114, 130, 147, 67, 198, 0, 23, + 64, 45, 18, 0, 15, 108, 146, 99, 114, 115, 98, 131, + 82, 131, 82, 131, 82, 131, 82, 131, 82, 115, 98, 99, + 121, 146, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 240, 18, 240, 18, 240, 18, 216, 0, 21, 64, 62, 20, + 0, 18, 38, 195, 67, 146, 130, 115, 131, 83, 162, 83, + 163, 66, 194, 51, 195, 35, 195, 35, 195, 35, 195, 35, + 195, 35, 195, 35, 195, 50, 194, 67, 163, 67, 51, 67, + 83, 17, 49, 50, 114, 17, 50, 18, 147, 52, 198, 81, + 194, 81, 194, 81, 194, 81, 195, 50, 214, 244, 0, 8, + 51, 21, 0, 18, 60, 194, 99, 162, 115, 146, 131, 130, + 131, 130, 131, 130, 131, 130, 131, 130, 115, 146, 99, 168, + 210, 97, 194, 98, 178, 114, 162, 114, 162, 114, 162, 115, + 49, 82, 115, 49, 82, 130, 49, 82, 130, 33, 56, 99, + 0, 24, 16, 49, 17, 0, 15, 53, 65, 98, 66, 18, + 82, 100, 66, 131, 66, 146, 66, 146, 67, 130, 68, 129, + 85, 215, 199, 81, 102, 66, 132, 50, 163, 34, 163, 35, + 162, 35, 162, 36, 146, 35, 17, 114, 50, 49, 82, 66, + 70, 0, 19, 96, 55, 19, 0, 16, 95, 2, 36, 66, + 52, 35, 82, 67, 34, 98, 82, 34, 98, 82, 33, 114, + 97, 33, 114, 97, 33, 114, 97, 33, 114, 97, 162, 240, + 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 240, 34, 240, 34, 217, 0, 22, 16, 48, + 22, 0, 19, 41, 56, 82, 163, 114, 177, 130, 177, 130, + 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, + 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, + 177, 130, 162, 146, 145, 178, 98, 230, 0, 25, 112, 52, + 22, 0, 19, 41, 41, 83, 131, 131, 130, 162, 130, 163, + 113, 179, 113, 194, 98, 195, 81, 211, 81, 211, 81, 226, + 65, 243, 49, 243, 49, 240, 18, 33, 240, 35, 17, 240, + 35, 17, 240, 51, 240, 67, 240, 67, 240, 81, 240, 97, + 0, 26, 32, 81, 31, 0, 27, 25, 25, 40, 83, 116, + 100, 115, 116, 114, 146, 116, 113, 163, 100, 113, 163, 97, + 18, 98, 163, 97, 19, 81, 194, 82, 19, 81, 195, 65, + 35, 66, 195, 65, 50, 65, 226, 50, 51, 49, 226, 49, + 67, 49, 227, 33, 82, 33, 243, 33, 82, 33, 240, 18, + 17, 99, 17, 240, 20, 101, 240, 20, 115, 240, 50, 131, + 240, 50, 131, 240, 50, 145, 240, 65, 161, 0, 36, 32, + 53, 23, 0, 20, 41, 41, 100, 115, 163, 114, 179, 98, + 211, 81, 227, 66, 243, 34, 240, 35, 17, 240, 52, 240, + 83, 240, 99, 240, 68, 240, 50, 19, 240, 18, 35, 240, + 17, 67, 226, 83, 194, 99, 193, 131, 162, 131, 147, 132, + 89, 42, 0, 26, 16, 52, 23, 0, 20, 25, 57, 84, + 131, 147, 130, 163, 129, 195, 98, 195, 97, 227, 65, 240, + 18, 50, 240, 19, 33, 240, 50, 17, 240, 68, 240, 82, + 240, 98, 240, 98, 240, 98, 240, 98, 240, 98, 240, 98, + 240, 98, 240, 98, 240, 57, 0, 26, 112, 45, 19, 0, + 16, 127, 68, 115, 83, 116, 82, 116, 98, 115, 113, 116, + 113, 100, 129, 99, 145, 84, 228, 243, 244, 228, 97, 131, + 113, 115, 129, 100, 129, 99, 130, 83, 146, 68, 131, 67, + 132, 63, 1, 0, 21, 96, 34, 8, 0, 7, 6, 34, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 102, 160, 34, 10, 0, 8, 98, 145, 145, 145, + 146, 130, 145, 145, 145, 146, 145, 145, 145, 146, 130, 145, + 145, 145, 146, 145, 145, 145, 146, 130, 145, 145, 145, 146, + 240, 112, 34, 8, 0, 7, 6, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 38, 160, + 27, 16, 0, 14, 98, 212, 193, 33, 178, 34, 146, 65, + 145, 82, 114, 98, 82, 129, 81, 146, 50, 162, 33, 193, + 0, 38, 32, 8, 16, 0, 64, 14, 0, 8, 32, 12, + 7, 0, 6, 18, 83, 82, 98, 98, 0, 22, 16, 37, + 14, 0, 26, 85, 130, 50, 98, 81, 99, 66, 83, 66, + 179, 116, 18, 97, 82, 17, 49, 98, 17, 34, 98, 17, + 34, 83, 17, 35, 49, 18, 17, 53, 50, 0, 16, 16, + 44, 15, 0, 13, 20, 210, 210, 210, 210, 210, 210, 210, + 210, 36, 114, 17, 50, 99, 82, 83, 97, 82, 114, 66, + 114, 66, 114, 66, 114, 66, 114, 67, 97, 81, 17, 82, + 81, 33, 50, 97, 52, 0, 17, 64, 26, 12, 0, 23, + 4, 98, 65, 66, 82, 50, 67, 34, 83, 34, 162, 162, + 162, 177, 113, 50, 97, 66, 65, 101, 0, 14, 43, 15, + 0, 13, 102, 210, 210, 210, 210, 210, 210, 210, 116, 34, + 98, 49, 18, 82, 83, 81, 99, 66, 114, 66, 114, 66, + 114, 66, 114, 66, 114, 81, 99, 82, 83, 98, 49, 18, + 116, 36, 0, 17, 16, 28, 13, 0, 24, 101, 113, 66, + 82, 82, 65, 98, 50, 98, 58, 50, 178, 178, 129, 49, + 113, 66, 97, 82, 65, 117, 0, 15, 32, 32, 12, 0, + 11, 20, 98, 50, 81, 66, 66, 51, 66, 50, 82, 162, + 162, 135, 114, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 134, 0, 14, 32, 45, 17, 0, 32, 53, 50, 83, + 52, 18, 66, 86, 50, 114, 18, 50, 114, 98, 114, 98, + 114, 114, 82, 146, 51, 135, 146, 241, 240, 17, 240, 26, + 138, 113, 130, 81, 161, 66, 161, 66, 145, 98, 98, 135, + 240, 160, 42, 16, 0, 14, 4, 226, 226, 226, 226, 226, + 226, 226, 226, 36, 130, 18, 34, 115, 82, 99, 82, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 70, 38, 0, 18, 32, 25, 9, 0, 8, + 19, 99, 99, 0, 6, 21, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 71, 0, 10, 48, 35, 10, 0, + 9, 51, 115, 115, 0, 6, 116, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 66, 34, + 51, 34, 50, 49, 66, 34, 84, 240, 41, 16, 0, 14, + 4, 226, 226, 226, 226, 226, 226, 226, 226, 55, 66, 83, + 98, 82, 114, 66, 130, 49, 162, 33, 178, 19, 163, 19, + 146, 50, 146, 66, 130, 67, 114, 83, 70, 38, 0, 18, + 32, 28, 8, 0, 7, 4, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 70, 0, 9, 32, 49, 24, 0, 45, 4, 52, 67, + 130, 18, 35, 18, 34, 114, 17, 66, 17, 66, 99, 83, + 82, 98, 99, 82, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 79, 7, 0, 27, 32, 34, 16, 0, 30, 4, 36, + 130, 18, 34, 115, 82, 99, 82, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, + 38, 0, 18, 32, 31, 13, 0, 24, 101, 114, 50, 82, + 82, 65, 113, 50, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 49, 113, 66, 82, 82, 50, 117, 0, 15, 32, 42, + 15, 0, 28, 20, 36, 114, 17, 50, 99, 82, 83, 97, + 82, 114, 66, 114, 66, 114, 66, 114, 66, 114, 67, 97, + 83, 82, 82, 17, 50, 98, 36, 114, 210, 210, 210, 210, + 210, 210, 182, 240, 144, 43, 15, 0, 28, 68, 49, 98, + 49, 33, 82, 81, 17, 81, 99, 66, 114, 66, 114, 66, + 114, 66, 114, 66, 114, 81, 99, 82, 83, 98, 49, 18, + 116, 34, 210, 210, 210, 210, 210, 210, 210, 182, 240, 32, + 25, 12, 0, 22, 68, 35, 82, 17, 34, 67, 35, 67, + 35, 66, 162, 162, 162, 162, 162, 162, 162, 134, 0, 14, + 32, 30, 11, 0, 20, 100, 98, 51, 49, 97, 49, 97, + 50, 164, 148, 65, 82, 49, 98, 33, 113, 34, 97, 33, + 17, 65, 49, 36, 0, 12, 112, 32, 11, 0, 12, 97, + 161, 161, 161, 146, 131, 120, 82, 146, 146, 146, 146, 146, + 65, 66, 65, 66, 65, 66, 65, 66, 65, 66, 49, 100, + 0, 12, 112, 35, 16, 0, 30, 4, 53, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 83, 98, 65, 18, 114, 34, 18, 131, 52, 0, + 18, 32, 29, 15, 0, 28, 22, 37, 66, 98, 82, 97, + 114, 81, 114, 65, 130, 65, 146, 33, 162, 33, 162, 33, + 179, 195, 209, 225, 0, 17, 112, 47, 21, 0, 39, 54, + 22, 21, 51, 67, 82, 82, 82, 81, 99, 67, 65, 114, + 49, 18, 49, 130, 49, 18, 49, 131, 33, 19, 33, 146, + 17, 50, 17, 162, 17, 50, 17, 179, 52, 178, 82, 194, + 82, 209, 81, 0, 24, 80, 30, 16, 0, 30, 6, 38, + 67, 67, 114, 66, 146, 49, 163, 17, 195, 226, 212, 193, + 19, 161, 50, 145, 82, 114, 83, 70, 23, 0, 18, 32, + 41, 15, 0, 28, 22, 37, 67, 82, 83, 81, 114, 81, + 114, 65, 146, 49, 146, 49, 146, 33, 178, 17, 178, 17, + 179, 210, 210, 209, 225, 225, 145, 49, 147, 33, 147, 33, + 146, 33, 179, 240, 176, 30, 13, 0, 24, 73, 66, 67, + 65, 82, 81, 66, 97, 51, 147, 162, 65, 83, 65, 67, + 81, 66, 82, 50, 98, 35, 83, 43, 0, 14, 112, 34, + 9, 0, 8, 51, 82, 98, 114, 114, 114, 115, 99, 114, + 114, 114, 114, 113, 114, 82, 146, 129, 130, 114, 114, 114, + 99, 99, 98, 114, 114, 114, 130, 131, 176, 31, 4, 240, + 210, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 224, 34, 9, 0, 7, 115, 130, 130, 114, + 114, 114, 99, 99, 98, 114, 114, 114, 129, 130, 146, 82, + 113, 114, 114, 114, 114, 115, 99, 114, 114, 114, 114, 98, + 83, 240, 14, 15, 0, 36, 4, 81, 50, 35, 49, 49, + 100, 0, 28, 80, 5, 10, 0, 46, 32, 24, 6, 0, + 11, 50, 52, 51, 240, 97, 82, 66, 66, 66, 66, 66, + 66, 66, 52, 36, 36, 36, 36, 50, 144, 50, 12, 0, + 11, 81, 177, 177, 161, 177, 177, 161, 177, 132, 98, 33, + 17, 66, 49, 18, 50, 52, 34, 49, 19, 34, 49, 98, + 49, 98, 33, 114, 33, 129, 17, 81, 51, 81, 66, 65, + 101, 97, 177, 177, 161, 177, 177, 161, 177, 240, 128, 38, + 16, 0, 15, 4, 162, 66, 114, 82, 114, 67, 99, 66, + 114, 226, 226, 226, 226, 170, 147, 210, 226, 226, 225, 225, + 161, 68, 113, 49, 51, 65, 50, 71, 50, 100, 0, 18, + 64, 31, 13, 0, 24, 49, 37, 33, 50, 82, 65, 113, + 49, 145, 33, 145, 33, 145, 33, 145, 33, 145, 49, 113, + 66, 82, 49, 37, 33, 0, 18, 16, 37, 17, 0, 14, + 119, 53, 67, 114, 83, 113, 114, 97, 131, 81, 146, 65, + 163, 49, 178, 33, 195, 17, 155, 178, 242, 242, 171, 178, + 242, 242, 242, 242, 242, 199, 0, 19, 112, 27, 4, 240, + 210, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 240, + 178, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 160, + 49, 11, 0, 10, 3, 129, 33, 97, 34, 97, 34, 97, + 162, 146, 162, 117, 97, 35, 66, 51, 50, 51, 50, 67, + 34, 82, 35, 66, 50, 66, 51, 50, 66, 49, 100, 115, + 146, 162, 146, 82, 34, 82, 34, 81, 34, 115, 240, 240, + 144, 11, 10, 0, 12, 66, 66, 34, 66, 0, 31, 64, + 68, 23, 0, 21, 7, 226, 114, 177, 177, 145, 209, 113, + 100, 17, 49, 81, 82, 66, 65, 65, 66, 97, 65, 49, + 82, 97, 81, 33, 66, 113, 81, 33, 66, 209, 33, 66, + 209, 33, 66, 209, 33, 66, 113, 81, 33, 81, 113, 81, + 49, 66, 97, 65, 65, 82, 50, 81, 81, 85, 81, 98, + 209, 130, 177, 178, 114, 231, 0, 27, 23, 10, 0, 8, + 116, 97, 34, 81, 34, 115, 82, 18, 66, 34, 17, 34, + 34, 17, 36, 18, 0, 27, 112, 27, 10, 0, 21, 81, + 49, 66, 49, 65, 49, 65, 50, 50, 34, 66, 34, 81, + 49, 97, 49, 82, 49, 81, 49, 0, 12, 96, 14, 17, + 0, 38, 47, 242, 242, 242, 242, 242, 242, 0, 25, 96, + 9, 11, 0, 28, 121, 41, 0, 19, 64, 72, 23, 0, + 21, 7, 226, 114, 177, 177, 145, 209, 113, 40, 81, 81, + 82, 50, 81, 65, 82, 66, 65, 49, 98, 66, 81, 33, + 98, 66, 81, 33, 98, 50, 97, 33, 101, 129, 33, 98, + 49, 113, 33, 98, 50, 97, 33, 98, 50, 97, 49, 82, + 50, 33, 33, 65, 82, 50, 33, 33, 81, 38, 35, 33, + 98, 209, 130, 177, 178, 114, 231, 0, 27, 8, 10, 0, + 13, 104, 0, 31, 64, 25, 12, 0, 10, 116, 98, 66, + 65, 97, 49, 129, 33, 129, 33, 129, 33, 129, 49, 97, + 66, 66, 100, 0, 30, 80, 24, 16, 0, 24, 98, 226, + 226, 226, 226, 226, 142, 130, 226, 226, 226, 226, 226, 226, + 240, 240, 174, 0, 16, 32, 26, 9, 0, 8, 19, 81, + 34, 49, 66, 33, 66, 35, 34, 50, 34, 98, 113, 113, + 113, 49, 49, 65, 39, 0, 20, 64, 25, 9, 0, 8, + 20, 65, 50, 49, 50, 65, 34, 98, 68, 145, 130, 34, + 50, 33, 66, 33, 50, 68, 0, 20, 96, 12, 7, 0, + 6, 66, 67, 66, 66, 66, 0, 22, 64, 45, 18, 0, + 36, 82, 82, 130, 98, 130, 82, 146, 82, 146, 82, 130, + 98, 130, 82, 146, 82, 131, 82, 49, 67, 67, 49, 68, + 34, 17, 33, 82, 19, 51, 82, 240, 18, 240, 18, 243, + 242, 240, 18, 0, 8, 96, 62, 16, 0, 14, 74, 68, + 65, 101, 65, 101, 65, 101, 65, 86, 65, 101, 65, 101, + 65, 101, 65, 116, 65, 146, 65, 161, 65, 161, 65, 161, + 65, 161, 65, 161, 65, 161, 65, 161, 65, 161, 65, 161, + 65, 161, 65, 161, 65, 161, 65, 161, 65, 161, 65, 161, + 65, 161, 65, 161, 65, 240, 240, 112, 10, 6, 0, 13, + 82, 52, 50, 0, 12, 48, 13, 7, 0, 24, 97, 97, + 68, 98, 82, 82, 35, 240, 48, 19, 8, 0, 7, 4, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, + 18, 32, 23, 10, 0, 9, 4, 82, 34, 50, 66, 34, + 66, 34, 66, 34, 66, 34, 66, 50, 34, 84, 0, 26, + 96, 26, 10, 0, 21, 97, 81, 49, 97, 49, 82, 34, + 82, 34, 66, 34, 50, 34, 65, 49, 65, 49, 81, 49, + 0, 13, 16, 56, 21, 0, 18, 52, 161, 130, 146, 130, + 145, 146, 129, 162, 129, 162, 113, 178, 98, 178, 97, 194, + 82, 194, 81, 97, 98, 65, 98, 70, 33, 83, 177, 99, + 162, 81, 18, 161, 81, 34, 146, 81, 34, 145, 81, 50, + 130, 88, 97, 162, 113, 178, 98, 150, 0, 23, 112, 58, + 20, 0, 17, 68, 161, 114, 145, 130, 145, 130, 129, 146, + 129, 146, 113, 162, 98, 162, 97, 178, 82, 178, 81, 36, + 98, 65, 34, 34, 54, 33, 33, 66, 145, 51, 34, 130, + 51, 34, 129, 146, 114, 130, 129, 145, 130, 129, 145, 129, + 49, 81, 129, 65, 66, 119, 0, 22, 96, 61, 22, 0, + 19, 68, 145, 113, 50, 114, 113, 50, 113, 145, 34, 97, + 194, 98, 148, 113, 225, 82, 226, 65, 162, 50, 49, 177, + 66, 49, 97, 65, 50, 49, 98, 84, 65, 83, 193, 99, + 178, 81, 18, 177, 81, 34, 161, 97, 34, 161, 81, 50, + 145, 104, 113, 162, 129, 178, 113, 166, 0, 25, 30, 11, + 0, 21, 35, 132, 116, 240, 241, 161, 161, 161, 131, 101, + 82, 130, 145, 161, 161, 97, 49, 83, 33, 83, 49, 82, + 50, 65, 100, 240, 60, 21, 240, 194, 240, 67, 240, 67, + 240, 82, 240, 97, 240, 240, 146, 240, 66, 240, 66, 240, + 52, 240, 36, 240, 33, 18, 240, 18, 18, 240, 17, 35, + 241, 35, 226, 50, 225, 67, 209, 67, 194, 82, 202, 177, + 99, 162, 114, 161, 131, 145, 131, 130, 131, 116, 116, 72, + 41, 0, 23, 112, 61, 21, 240, 240, 50, 240, 51, 240, + 35, 240, 34, 240, 49, 240, 240, 194, 240, 66, 240, 66, + 240, 52, 240, 36, 240, 33, 18, 240, 18, 18, 240, 17, + 35, 241, 35, 226, 50, 225, 67, 209, 67, 194, 82, 202, + 177, 99, 162, 114, 161, 131, 145, 131, 130, 131, 116, 116, + 72, 41, 0, 23, 112, 61, 21, 240, 242, 240, 52, 240, + 18, 34, 226, 81, 193, 129, 240, 240, 98, 240, 66, 240, + 66, 240, 52, 240, 36, 240, 33, 18, 240, 18, 18, 240, + 17, 35, 241, 35, 226, 50, 225, 67, 209, 67, 194, 82, + 202, 177, 99, 162, 114, 161, 131, 145, 131, 130, 131, 116, + 116, 72, 41, 0, 23, 112, 56, 21, 0, 6, 5, 49, + 177, 68, 0, 9, 114, 240, 66, 240, 66, 240, 52, 240, + 36, 240, 33, 18, 240, 18, 18, 240, 17, 35, 241, 35, + 226, 50, 225, 67, 209, 67, 194, 82, 202, 177, 99, 162, + 114, 161, 131, 145, 131, 130, 131, 116, 116, 72, 41, 0, + 23, 112, 56, 22, 0, 6, 34, 82, 210, 82, 0, 10, + 49, 240, 97, 240, 83, 240, 67, 240, 67, 240, 49, 19, + 240, 33, 19, 240, 18, 34, 240, 17, 51, 241, 51, 226, + 66, 225, 82, 225, 83, 202, 193, 114, 193, 115, 162, 115, + 162, 130, 162, 131, 131, 131, 89, 41, 0, 25, 62, 22, + 132, 240, 34, 50, 241, 81, 241, 81, 242, 50, 240, 21, + 240, 240, 177, 240, 97, 240, 83, 240, 67, 240, 67, 240, + 53, 240, 33, 19, 240, 33, 34, 240, 18, 34, 240, 17, + 51, 226, 51, 226, 66, 225, 83, 202, 194, 83, 193, 115, + 162, 115, 162, 115, 162, 131, 131, 131, 89, 41, 0, 25, + 78, 32, 0, 29, 47, 4, 240, 51, 116, 240, 36, 131, + 240, 33, 18, 146, 240, 17, 34, 146, 242, 34, 161, 241, + 50, 81, 65, 225, 66, 81, 65, 210, 66, 66, 240, 49, + 82, 66, 240, 47, 240, 18, 98, 66, 240, 17, 114, 66, + 242, 114, 81, 81, 130, 130, 81, 66, 129, 146, 81, 66, + 114, 146, 162, 98, 162, 147, 98, 162, 147, 83, 162, 117, + 41, 79, 2, 0, 36, 32, 56, 18, 0, 16, 69, 65, + 99, 66, 33, 82, 116, 67, 131, 66, 162, 51, 162, 50, + 193, 35, 193, 35, 193, 35, 243, 243, 243, 243, 193, 50, + 193, 51, 177, 51, 161, 82, 161, 98, 129, 130, 82, 182, + 225, 240, 33, 244, 240, 19, 240, 18, 240, 18, 242, 212, + 240, 192, 61, 19, 240, 130, 240, 35, 240, 51, 240, 50, + 0, 5, 127, 1, 98, 116, 98, 131, 98, 146, 98, 146, + 98, 81, 65, 98, 81, 65, 98, 81, 65, 98, 66, 178, + 66, 184, 178, 66, 178, 66, 178, 81, 81, 82, 81, 66, + 82, 162, 82, 162, 82, 147, 82, 147, 82, 117, 47, 2, + 0, 21, 80, 59, 19, 240, 226, 240, 19, 243, 226, 0, + 6, 31, 1, 98, 116, 98, 131, 98, 146, 98, 146, 98, + 81, 65, 98, 81, 65, 98, 81, 65, 98, 66, 178, 66, + 184, 178, 66, 178, 66, 178, 81, 81, 82, 81, 66, 82, + 162, 82, 162, 82, 147, 82, 147, 82, 117, 47, 2, 0, + 21, 80, 61, 19, 240, 178, 240, 20, 226, 34, 193, 98, + 240, 240, 239, 1, 98, 116, 98, 131, 98, 146, 98, 146, + 98, 81, 65, 98, 81, 65, 98, 81, 65, 98, 66, 178, + 66, 184, 178, 66, 178, 66, 178, 81, 81, 82, 81, 66, + 82, 162, 82, 162, 82, 147, 82, 147, 82, 117, 47, 2, + 0, 21, 80, 59, 19, 240, 240, 194, 82, 162, 82, 0, + 7, 127, 1, 98, 116, 98, 131, 98, 146, 98, 146, 98, + 81, 65, 98, 81, 65, 98, 81, 65, 98, 66, 178, 66, + 184, 178, 66, 178, 66, 178, 81, 81, 82, 81, 66, 82, + 162, 82, 162, 82, 147, 82, 147, 82, 117, 47, 2, 0, + 21, 80, 31, 11, 194, 147, 162, 177, 240, 201, 98, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 89, 0, 12, 80, 32, 11, 240, + 34, 131, 115, 114, 240, 217, 82, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 105, 0, 12, 80, 33, 10, 210, 116, 82, 34, 49, + 97, 240, 120, 82, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, 0, + 11, 64, 33, 11, 240, 114, 82, 34, 82, 240, 240, 89, + 98, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 89, 0, 12, 80, 47, + 21, 0, 18, 61, 178, 115, 146, 146, 130, 147, 114, 163, + 98, 163, 98, 178, 98, 179, 82, 179, 82, 179, 41, 115, + 82, 179, 82, 179, 82, 179, 82, 178, 98, 163, 98, 163, + 98, 147, 114, 146, 130, 115, 109, 0, 24, 80, 65, 22, + 0, 6, 37, 65, 162, 54, 0, 9, 21, 120, 68, 161, + 131, 161, 132, 145, 133, 129, 129, 19, 129, 129, 35, 113, + 129, 51, 97, 129, 52, 81, 129, 67, 81, 129, 83, 65, + 129, 99, 49, 129, 100, 33, 129, 115, 33, 129, 131, 17, + 129, 148, 129, 148, 129, 163, 129, 178, 115, 162, 88, 129, + 0, 25, 48, 55, 20, 240, 163, 240, 36, 240, 50, 240, + 82, 0, 6, 118, 195, 67, 146, 130, 115, 131, 83, 162, + 83, 163, 66, 194, 51, 195, 35, 195, 35, 195, 35, 195, + 35, 195, 35, 195, 35, 195, 50, 194, 67, 163, 67, 163, + 83, 131, 114, 130, 147, 67, 198, 0, 23, 64, 54, 20, + 240, 243, 240, 20, 243, 240, 33, 0, 7, 22, 195, 67, + 146, 130, 115, 131, 83, 162, 83, 163, 66, 194, 51, 195, + 35, 195, 35, 195, 35, 195, 35, 195, 35, 195, 35, 195, + 50, 194, 67, 163, 67, 163, 83, 131, 114, 130, 147, 67, + 198, 0, 23, 64, 55, 20, 240, 210, 240, 36, 242, 34, + 209, 97, 0, 6, 86, 195, 67, 146, 130, 115, 131, 83, + 162, 83, 163, 66, 194, 51, 195, 35, 195, 35, 195, 35, + 195, 35, 195, 35, 195, 35, 195, 50, 194, 67, 163, 67, + 163, 83, 131, 114, 130, 147, 67, 198, 0, 23, 64, 53, + 20, 240, 240, 245, 65, 130, 54, 0, 9, 6, 195, 67, + 146, 130, 115, 131, 83, 162, 83, 163, 66, 194, 51, 195, + 35, 195, 35, 195, 35, 195, 35, 195, 35, 195, 35, 195, + 50, 194, 67, 163, 67, 163, 83, 131, 114, 130, 147, 67, + 198, 0, 23, 64, 53, 20, 240, 240, 242, 66, 194, 66, + 0, 9, 22, 195, 67, 146, 130, 115, 131, 83, 162, 83, + 163, 66, 194, 51, 195, 35, 195, 35, 195, 35, 195, 35, + 195, 35, 195, 35, 195, 50, 194, 67, 163, 67, 163, 83, + 131, 114, 130, 147, 67, 198, 0, 23, 64, 26, 12, 0, + 22, 65, 129, 34, 98, 50, 66, 82, 34, 116, 146, 148, + 114, 34, 82, 65, 66, 97, 49, 129, 0, 16, 96, 60, + 20, 0, 18, 38, 81, 99, 67, 33, 98, 117, 83, 131, + 83, 147, 83, 133, 66, 130, 34, 51, 129, 51, 35, 114, + 51, 35, 98, 67, 35, 82, 83, 35, 66, 99, 35, 50, + 115, 35, 49, 131, 50, 34, 130, 69, 131, 68, 146, 99, + 131, 85, 114, 97, 35, 67, 97, 86, 0, 23, 64, 56, + 22, 240, 211, 240, 68, 240, 83, 240, 98, 0, 6, 105, + 56, 82, 163, 114, 177, 130, 177, 130, 177, 130, 177, 130, + 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, + 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 162, 146, + 145, 178, 98, 230, 0, 25, 112, 57, 22, 240, 240, 67, + 240, 51, 240, 50, 240, 50, 0, 7, 9, 56, 82, 163, + 114, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 130, 162, 146, 145, 178, 98, + 230, 0, 25, 112, 58, 22, 161, 240, 83, 240, 53, 240, + 18, 50, 210, 113, 0, 6, 57, 56, 82, 163, 114, 177, + 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 162, 146, 145, 178, 98, 230, 0, + 25, 112, 54, 22, 0, 6, 34, 82, 210, 82, 0, 9, + 25, 71, 82, 163, 114, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 162, + 146, 145, 178, 98, 230, 0, 25, 112, 61, 23, 240, 240, + 82, 240, 83, 240, 67, 240, 66, 0, 7, 41, 57, 84, + 131, 147, 130, 163, 129, 195, 98, 195, 97, 227, 65, 240, + 18, 50, 240, 19, 33, 240, 50, 17, 240, 68, 240, 82, + 240, 98, 240, 98, 240, 98, 240, 98, 240, 98, 240, 98, + 240, 98, 240, 98, 240, 57, 0, 26, 112, 63, 19, 0, + 17, 18, 244, 98, 86, 69, 130, 39, 130, 18, 52, 115, + 99, 114, 116, 98, 131, 98, 131, 98, 131, 98, 131, 98, + 131, 98, 131, 98, 130, 114, 130, 114, 115, 114, 114, 130, + 98, 146, 82, 162, 66, 178, 19, 211, 240, 18, 240, 34, + 240, 34, 240, 34, 240, 34, 242, 240, 17, 240, 240, 96, + 52, 15, 0, 13, 101, 146, 50, 114, 82, 82, 98, 82, + 98, 82, 98, 82, 82, 98, 66, 114, 19, 146, 66, 114, + 82, 98, 98, 82, 113, 82, 114, 66, 114, 66, 114, 66, + 33, 66, 66, 19, 50, 66, 18, 50, 82, 18, 50, 52, + 36, 0, 17, 64, 45, 14, 0, 12, 50, 195, 195, 210, + 209, 225, 240, 240, 133, 130, 50, 98, 81, 99, 66, 83, + 66, 164, 115, 34, 82, 82, 17, 34, 98, 17, 34, 98, + 17, 34, 83, 17, 35, 49, 18, 17, 53, 50, 0, 16, + 16, 45, 14, 0, 13, 33, 194, 179, 178, 177, 193, 240, + 240, 165, 130, 50, 98, 81, 99, 66, 83, 66, 179, 116, + 18, 97, 82, 17, 49, 98, 17, 34, 98, 17, 34, 83, + 17, 35, 49, 18, 17, 53, 50, 0, 16, 16, 49, 14, + 0, 12, 113, 195, 162, 18, 145, 50, 113, 81, 97, 113, + 240, 240, 85, 130, 50, 98, 81, 99, 66, 83, 66, 179, + 116, 18, 97, 82, 17, 49, 98, 17, 34, 98, 17, 34, + 83, 17, 35, 49, 18, 17, 53, 50, 0, 16, 16, 42, + 14, 0, 17, 100, 130, 52, 0, 6, 37, 130, 50, 98, + 81, 99, 66, 83, 66, 179, 116, 18, 97, 82, 17, 49, + 98, 17, 34, 98, 17, 34, 83, 17, 35, 49, 18, 17, + 53, 50, 0, 16, 16, 43, 14, 0, 17, 98, 50, 114, + 50, 0, 6, 36, 146, 34, 114, 66, 99, 50, 99, 50, + 179, 131, 18, 98, 66, 33, 34, 82, 33, 34, 82, 33, + 34, 67, 33, 35, 33, 18, 33, 52, 51, 0, 16, 16, + 49, 14, 0, 12, 84, 146, 34, 129, 65, 129, 65, 130, + 34, 148, 240, 240, 132, 146, 34, 114, 66, 99, 50, 99, + 50, 179, 131, 18, 98, 66, 33, 34, 82, 33, 34, 82, + 33, 34, 67, 33, 35, 33, 18, 33, 52, 51, 0, 16, + 16, 42, 20, 0, 37, 116, 68, 113, 66, 17, 66, 66, + 82, 82, 67, 66, 83, 65, 82, 83, 125, 67, 50, 178, + 82, 162, 98, 113, 34, 98, 113, 34, 81, 18, 81, 51, + 49, 50, 50, 69, 85, 0, 23, 33, 12, 0, 23, 4, + 98, 65, 66, 82, 50, 67, 34, 83, 34, 162, 162, 162, + 177, 113, 50, 97, 66, 65, 101, 145, 177, 148, 178, 162, + 147, 115, 240, 240, 36, 13, 0, 11, 82, 178, 179, 194, + 193, 209, 240, 240, 85, 113, 66, 82, 82, 65, 98, 50, + 98, 58, 50, 178, 178, 129, 49, 113, 66, 97, 82, 65, + 117, 0, 15, 32, 36, 13, 0, 12, 50, 163, 147, 162, + 161, 177, 240, 240, 117, 113, 66, 82, 82, 65, 98, 50, + 98, 58, 50, 178, 178, 129, 49, 113, 66, 97, 82, 65, + 117, 0, 15, 32, 39, 13, 0, 12, 1, 179, 146, 18, + 129, 50, 97, 82, 65, 240, 240, 165, 113, 66, 82, 82, + 65, 98, 50, 98, 58, 50, 178, 178, 129, 49, 113, 66, + 97, 82, 65, 117, 0, 15, 32, 34, 13, 0, 16, 66, + 66, 82, 66, 240, 240, 245, 114, 50, 82, 82, 65, 113, + 50, 113, 58, 50, 178, 178, 129, 49, 113, 66, 97, 82, + 65, 117, 0, 15, 32, 27, 9, 0, 7, 113, 130, 115, + 130, 129, 145, 240, 132, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 86, 0, 10, 48, 27, 8, 0, 7, + 81, 98, 83, 66, 97, 97, 240, 116, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 70, 0, 9, 32, 29, + 9, 0, 8, 33, 115, 97, 17, 81, 49, 49, 81, 240, + 244, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 86, 0, 10, 48, 25, 9, 0, 11, 34, 50, 34, 50, + 240, 244, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 86, 0, 10, 48, 48, 15, 0, 13, 50, 129, 66, + 99, 82, 68, 98, 18, 49, 100, 113, 33, 18, 131, 50, + 114, 82, 181, 145, 51, 113, 83, 82, 98, 66, 115, 50, + 130, 50, 130, 50, 130, 50, 130, 50, 129, 82, 98, 98, + 66, 149, 0, 17, 64, 40, 16, 0, 20, 52, 65, 97, + 53, 0, 6, 84, 36, 130, 18, 34, 115, 82, 99, 82, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 70, 38, 0, 18, 32, 39, 13, 0, + 11, 81, 194, 179, 194, 193, 209, 240, 240, 85, 114, 50, + 82, 82, 65, 113, 50, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 49, 113, 66, 82, 82, 50, 117, 0, 15, 32, + 39, 13, 0, 12, 34, 178, 163, 146, 177, 177, 240, 240, + 117, 114, 50, 82, 82, 65, 113, 50, 114, 34, 114, 34, + 114, 34, 114, 34, 114, 49, 113, 66, 82, 82, 50, 117, + 0, 15, 32, 43, 13, 0, 12, 1, 179, 146, 18, 129, + 49, 113, 81, 81, 113, 240, 240, 37, 114, 50, 82, 82, + 65, 113, 50, 114, 34, 114, 34, 114, 34, 114, 34, 114, + 49, 113, 66, 82, 82, 50, 117, 0, 15, 32, 37, 13, + 0, 16, 68, 49, 65, 52, 0, 5, 101, 114, 50, 82, + 82, 65, 113, 50, 114, 34, 114, 34, 114, 34, 114, 34, + 114, 49, 113, 66, 82, 82, 50, 117, 0, 15, 32, 37, + 13, 0, 16, 66, 66, 82, 66, 240, 240, 245, 114, 50, + 82, 82, 65, 113, 50, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 49, 113, 66, 82, 82, 50, 117, 0, 15, 32, + 17, 16, 0, 30, 98, 212, 210, 240, 240, 174, 0, 7, + 2, 212, 210, 0, 21, 38, 13, 0, 24, 101, 33, 66, + 52, 50, 82, 65, 98, 50, 81, 18, 34, 65, 34, 34, + 49, 50, 34, 33, 66, 34, 17, 82, 50, 97, 66, 82, + 67, 50, 65, 37, 0, 15, 32, 42, 16, 0, 14, 50, + 227, 226, 242, 242, 241, 240, 240, 165, 52, 114, 82, 114, + 82, 114, 82, 114, 82, 114, 82, 114, 82, 114, 82, 114, + 82, 114, 67, 114, 67, 129, 49, 18, 132, 36, 0, 18, + 32, 43, 16, 0, 15, 2, 226, 210, 210, 210, 225, 240, + 240, 196, 53, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 83, 98, 65, 18, + 114, 34, 18, 131, 52, 0, 18, 32, 47, 16, 0, 14, + 82, 227, 194, 18, 162, 49, 146, 81, 240, 17, 240, 240, + 116, 53, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 83, 98, 65, 18, 114, + 34, 18, 131, 52, 0, 18, 32, 41, 16, 0, 20, 34, + 66, 130, 66, 0, 6, 100, 53, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 83, 98, 65, 18, 114, 34, 18, 131, 52, 0, 18, 32, + 49, 16, 0, 15, 17, 226, 211, 209, 225, 225, 240, 240, + 198, 38, 67, 82, 99, 81, 130, 81, 130, 65, 162, 49, + 162, 49, 162, 33, 194, 17, 194, 17, 195, 226, 226, 225, + 241, 241, 161, 49, 163, 33, 163, 33, 162, 33, 195, 240, + 208, 47, 14, 0, 15, 100, 164, 194, 194, 194, 194, 194, + 36, 98, 17, 50, 83, 82, 66, 98, 66, 98, 66, 98, + 66, 98, 66, 97, 82, 82, 82, 81, 98, 65, 114, 49, + 130, 33, 148, 162, 194, 194, 194, 194, 177, 193, 240, 192, + 46, 16, 0, 20, 50, 66, 130, 66, 0, 6, 87, 22, + 66, 98, 98, 97, 130, 81, 130, 81, 146, 49, 162, 49, + 163, 33, 178, 17, 196, 211, 210, 226, 241, 225, 241, 161, + 49, 163, 33, 163, 33, 162, 33, 195, 240, 208, +}; + +//***************************************************************************** +// +// The glyph offset table for the 28 point Theanomodern font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanomodern28[] = +{ + 0, 5, 31, 54, 101, 174, 240, 301, + 315, 349, 384, 415, 435, 450, 459, 469, + 503, 550, 578, 618, 659, 696, 734, 779, + 814, 859, 904, 919, 939, 961, 972, 994, + 1027, 1103, 1153, 1199, 1244, 1291, 1344, 1393, + 1446, 1493, 1521, 1556, 1605, 1653, 1731, 1790, + 1837, 1882, 1944, 1995, 2044, 2099, 2147, 2199, + 2280, 2333, 2385, 2430, 2464, 2498, 2532, 2559, + 2567, 2579, 2616, 2660, 2686, 2729, 2757, 2789, + 2834, 2876, 2901, 2936, 2977, 3005, 3054, 3088, + 3119, 3161, 3204, 3229, 3259, 3291, 3326, 3355, + 3402, 3432, 3473, 3503, 3537, 3568, 3602, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3616, 3621, 3645, 3695, 3733, 3764, 3801, 3828, + 3877, 3888, 3956, 3979, 4006, 4020, 4029, 4101, + 4109, 4134, 4158, 4184, 4209, 4221, 4266, 4328, + 4338, 4351, 4370, 4393, 4419, 4475, 4533, 4594, + 4624, 4684, 4745, 4806, 4862, 4918, 4980, 5058, + 5114, 5175, 5234, 5295, 5354, 5385, 5417, 5450, + 5483, 5530, 5595, 5650, 5704, 5759, 5812, 5865, + 5891, 5951, 6007, 6064, 6122, 6176, 6237, 6300, + 6352, 6397, 6442, 6491, 6533, 6576, 6625, 6667, + 6700, 6736, 6772, 6811, 6845, 6872, 6899, 6928, + 6953, 7001, 7041, 7080, 7119, 7162, 7199, 7236, + 7253, 7291, 7333, 7376, 7423, 7464, 7513, 7560, +}; + +//***************************************************************************** +// +// The font definition for the 28 point Theanomodern font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanomodern28 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 29, + + // + // The height of the font. + // + 37, + + // + // The baseline of the font. + // + 28, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanomodern28, + + // + // A pointer to the actual font data + // + g_pui8Theanomodern28Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanomodern30.c b/third_party/fonts/ofl/fonts/fonttheanomodern30.c new file mode 100644 index 0000000..c612c8b --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanomodern30.c @@ -0,0 +1,914 @@ +//***************************************************************************** +// +// fonttheanomodern30.c - Font definition for the 30pt Theanomodern font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanomodern +// Size: 30 point +// Bold: no +// Italic: no +// Memory usage: 8532 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 30 point Theanomodern font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanomodern30Data[8331] = +{ + 4, 13, 0, 65, 28, 7, 0, 7, 18, 68, 52, 52, + 52, 52, 66, 82, 82, 82, 82, 82, 82, 82, 82, 97, + 240, 66, 68, 52, 66, 0, 9, 32, 27, 11, 0, 11, + 3, 35, 51, 35, 51, 35, 51, 35, 51, 35, 51, 35, + 65, 65, 81, 65, 81, 65, 81, 65, 0, 30, 96, 49, + 18, 0, 18, 97, 81, 177, 81, 162, 81, 161, 82, 161, + 81, 177, 81, 111, 114, 66, 161, 82, 161, 81, 177, 81, + 177, 81, 162, 81, 162, 66, 127, 97, 81, 177, 81, 162, + 81, 162, 66, 161, 81, 177, 81, 177, 81, 0, 23, 80, + 78, 17, 0, 13, 49, 33, 209, 33, 198, 148, 35, 114, + 33, 33, 33, 97, 49, 33, 34, 66, 49, 33, 19, 66, + 49, 33, 19, 67, 33, 33, 33, 84, 17, 33, 149, 33, + 167, 184, 183, 161, 37, 145, 33, 20, 66, 33, 33, 35, + 51, 33, 33, 50, 51, 33, 33, 50, 50, 49, 33, 50, + 50, 49, 33, 49, 81, 49, 33, 34, 98, 17, 35, 166, + 193, 33, 209, 33, 0, 18, 69, 23, 0, 23, 36, 146, + 114, 34, 129, 129, 65, 114, 114, 66, 97, 130, 66, 81, + 146, 66, 81, 146, 66, 65, 177, 65, 66, 178, 34, 65, + 212, 66, 240, 97, 240, 97, 68, 210, 50, 34, 193, 65, + 65, 178, 50, 66, 161, 66, 66, 145, 82, 66, 145, 82, + 66, 129, 98, 66, 114, 113, 65, 129, 130, 34, 113, 164, + 0, 29, 48, 70, 23, 0, 23, 115, 240, 65, 34, 240, + 34, 50, 240, 18, 50, 240, 18, 50, 240, 19, 33, 240, + 35, 18, 240, 51, 240, 83, 55, 148, 83, 147, 19, 81, + 146, 66, 81, 131, 67, 65, 130, 83, 49, 131, 99, 33, + 131, 99, 33, 65, 51, 116, 81, 51, 116, 81, 51, 116, + 65, 83, 115, 65, 99, 66, 19, 33, 134, 68, 0, 29, + 64, 16, 6, 0, 6, 3, 51, 51, 51, 51, 51, 65, + 81, 81, 81, 0, 17, 37, 11, 0, 10, 65, 145, 146, + 130, 145, 145, 146, 145, 146, 146, 146, 130, 146, 146, 146, + 146, 146, 146, 146, 146, 161, 162, 146, 146, 162, 146, 162, + 161, 177, 162, 162, 161, 224, 38, 11, 0, 9, 81, 162, + 162, 162, 161, 177, 162, 161, 162, 146, 146, 161, 162, 146, + 146, 146, 146, 146, 146, 146, 145, 146, 146, 145, 146, 145, + 146, 145, 145, 146, 130, 145, 240, 96, 33, 14, 0, 14, + 66, 194, 194, 130, 49, 50, 51, 33, 35, 67, 17, 19, + 131, 179, 131, 17, 19, 67, 33, 35, 50, 49, 50, 114, + 194, 194, 0, 32, 64, 34, 18, 0, 34, 82, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 159, 162, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 0, 23, 80, 16, 7, 0, 23, 83, 68, 52, 97, 97, + 97, 81, 82, 66, 240, 240, 48, 9, 12, 0, 34, 73, + 57, 0, 22, 112, 11, 7, 0, 22, 114, 68, 52, 66, + 0, 9, 32, 37, 11, 0, 11, 113, 146, 146, 146, 145, + 161, 146, 146, 145, 161, 146, 146, 146, 145, 161, 146, 146, + 145, 161, 146, 146, 146, 145, 161, 146, 146, 145, 161, 161, + 146, 240, 240, 16, 49, 17, 0, 17, 84, 179, 35, 131, + 66, 130, 98, 99, 99, 83, 99, 82, 130, 67, 131, 51, + 131, 51, 131, 51, 131, 51, 131, 51, 131, 51, 131, 51, + 131, 66, 130, 83, 99, 83, 99, 98, 98, 115, 66, 147, + 35, 180, 0, 22, 32, 29, 13, 0, 13, 66, 118, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 122, 0, 16, 80, 41, 15, + 0, 15, 54, 130, 51, 98, 83, 66, 115, 50, 115, 52, + 83, 53, 67, 67, 83, 194, 195, 194, 195, 194, 194, 194, + 194, 81, 98, 97, 98, 97, 82, 113, 66, 114, 59, 75, + 0, 19, 32, 46, 17, 0, 17, 70, 146, 82, 129, 114, + 98, 130, 84, 98, 84, 98, 99, 98, 226, 226, 165, 240, + 34, 240, 18, 240, 18, 97, 131, 68, 99, 53, 99, 52, + 115, 50, 147, 50, 131, 82, 115, 98, 83, 150, 0, 22, + 16, 38, 17, 0, 18, 17, 242, 242, 227, 227, 212, 194, + 18, 193, 34, 178, 34, 177, 50, 162, 50, 161, 66, 145, + 82, 130, 82, 129, 98, 126, 178, 242, 242, 242, 242, 186, + 0, 21, 80, 39, 16, 0, 16, 33, 99, 105, 118, 145, + 241, 241, 241, 241, 241, 37, 146, 67, 113, 99, 211, 227, + 211, 67, 99, 52, 99, 52, 99, 50, 131, 50, 115, 82, + 98, 99, 66, 149, 0, 21, 47, 16, 0, 16, 85, 162, + 65, 130, 82, 98, 83, 98, 83, 82, 226, 211, 211, 37, + 99, 17, 66, 84, 98, 68, 98, 67, 130, 51, 130, 51, + 130, 51, 130, 66, 130, 66, 130, 67, 98, 98, 98, 114, + 66, 149, 0, 20, 112, 40, 17, 0, 10, 113, 240, 17, + 240, 17, 240, 28, 76, 81, 146, 81, 145, 97, 130, 97, + 129, 98, 114, 241, 242, 241, 242, 242, 226, 242, 227, 227, + 227, 212, 212, 212, 212, 226, 0, 22, 64, 48, 17, 0, + 17, 69, 163, 66, 114, 114, 97, 146, 66, 146, 66, 146, + 66, 146, 67, 129, 100, 82, 117, 34, 151, 161, 23, 113, + 85, 82, 115, 66, 147, 50, 162, 50, 162, 50, 162, 66, + 145, 82, 130, 99, 82, 150, 0, 22, 16, 47, 16, 0, + 16, 68, 162, 66, 114, 98, 98, 99, 66, 130, 66, 130, + 66, 131, 50, 131, 50, 131, 50, 116, 66, 100, 82, 65, + 19, 101, 35, 211, 211, 210, 98, 83, 83, 82, 99, 67, + 98, 82, 129, 51, 164, 0, 21, 16, 17, 7, 0, 14, + 18, 68, 52, 66, 0, 5, 114, 68, 52, 66, 0, 9, + 32, 22, 7, 0, 14, 18, 68, 52, 66, 0, 6, 83, + 68, 52, 97, 97, 97, 81, 82, 66, 240, 240, 48, 29, + 17, 0, 31, 49, 227, 195, 195, 195, 196, 195, 195, 226, + 240, 19, 240, 19, 240, 19, 240, 19, 240, 19, 243, 240, + 18, 0, 21, 80, 11, 18, 0, 42, 111, 0, 9, 63, + 0, 34, 16, 29, 17, 0, 29, 97, 240, 19, 240, 19, + 240, 19, 240, 19, 243, 240, 19, 240, 19, 242, 211, 195, + 195, 195, 196, 195, 210, 0, 23, 16, 34, 13, 0, 13, + 37, 113, 66, 82, 97, 67, 82, 51, 97, 65, 113, 193, + 193, 178, 162, 118, 117, 130, 177, 193, 193, 193, 240, 146, + 164, 148, 162, 0, 17, 48, 90, 27, 0, 35, 7, 240, + 35, 99, 226, 162, 178, 210, 146, 242, 129, 240, 34, 98, + 240, 34, 82, 116, 34, 51, 66, 98, 49, 18, 66, 66, + 82, 65, 18, 66, 50, 82, 84, 66, 50, 82, 83, 82, + 50, 66, 99, 82, 50, 66, 99, 82, 50, 66, 99, 81, + 66, 66, 83, 82, 66, 66, 83, 82, 81, 66, 65, 18, + 66, 98, 66, 34, 18, 50, 114, 84, 52, 162, 240, 178, + 241, 162, 210, 178, 178, 211, 99, 240, 55, 0, 14, 112, + 57, 24, 0, 25, 49, 240, 114, 240, 115, 240, 99, 240, + 84, 240, 81, 19, 240, 65, 19, 240, 50, 19, 240, 49, + 50, 240, 49, 51, 240, 17, 67, 240, 17, 82, 240, 17, + 83, 234, 225, 114, 210, 115, 194, 115, 193, 131, 178, 147, + 162, 147, 148, 132, 90, 26, 0, 30, 48, 48, 22, 0, + 22, 14, 194, 115, 162, 131, 146, 147, 130, 147, 130, 147, + 130, 147, 130, 146, 146, 130, 162, 114, 185, 210, 115, 162, + 146, 146, 147, 130, 163, 114, 163, 114, 163, 114, 163, 114, + 148, 114, 147, 130, 131, 95, 0, 28, 48, 51, 20, 0, + 20, 101, 81, 115, 66, 49, 98, 129, 18, 83, 147, 82, + 163, 67, 178, 66, 194, 51, 209, 51, 209, 51, 209, 51, + 240, 35, 240, 35, 240, 35, 240, 35, 209, 66, 209, 67, + 178, 82, 177, 99, 146, 114, 130, 147, 82, 198, 0, 26, + 49, 23, 0, 23, 14, 210, 115, 178, 146, 162, 147, 146, + 162, 146, 163, 130, 178, 130, 179, 114, 179, 114, 179, 114, + 179, 114, 179, 114, 179, 114, 179, 114, 179, 114, 178, 130, + 163, 130, 162, 146, 147, 146, 146, 162, 115, 126, 0, 29, + 112, 57, 22, 0, 22, 15, 3, 130, 132, 130, 147, 130, + 162, 130, 162, 130, 97, 65, 130, 97, 65, 130, 97, 65, + 130, 82, 65, 130, 67, 217, 210, 67, 210, 82, 210, 97, + 81, 114, 97, 65, 130, 97, 66, 114, 178, 114, 178, 114, + 163, 114, 148, 114, 133, 63, 4, 0, 27, 112, 52, 21, + 0, 21, 15, 3, 114, 132, 114, 147, 114, 162, 114, 162, + 114, 97, 65, 114, 97, 65, 114, 97, 65, 114, 82, 65, + 114, 67, 201, 194, 67, 194, 82, 194, 97, 194, 97, 194, + 97, 194, 240, 66, 240, 66, 240, 66, 240, 66, 250, 0, + 27, 80, 56, 23, 0, 23, 101, 81, 163, 66, 34, 146, + 114, 18, 131, 132, 130, 163, 115, 163, 114, 194, 99, 194, + 99, 194, 99, 209, 99, 240, 83, 107, 51, 178, 115, 178, + 115, 178, 131, 162, 131, 162, 146, 162, 147, 129, 17, 162, + 129, 17, 179, 66, 33, 213, 65, 0, 29, 80, 50, 26, + 0, 26, 10, 58, 114, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 191, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 122, 58, 0, 32, 112, + 29, 13, 0, 13, 10, 114, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 122, 0, 16, 80, 48, 18, 0, 18, 105, 194, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 147, + 66, 132, 66, 117, 66, 117, 66, 114, 113, 130, 98, 146, + 66, 181, 0, 23, 112, 58, 25, 0, 25, 10, 42, 114, + 148, 162, 147, 178, 146, 194, 130, 210, 113, 242, 97, 240, + 18, 81, 240, 34, 50, 240, 50, 35, 240, 50, 21, 240, + 36, 20, 240, 19, 51, 240, 18, 83, 242, 99, 226, 100, + 210, 115, 210, 131, 194, 147, 178, 148, 162, 149, 90, 42, + 0, 31, 80, 51, 21, 0, 21, 8, 240, 18, 240, 66, + 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, + 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 193, 98, + 178, 98, 178, 98, 178, 98, 178, 98, 163, 98, 148, 98, + 133, 63, 3, 0, 26, 80, 82, 30, 0, 30, 8, 199, + 116, 195, 181, 164, 181, 161, 18, 178, 19, 145, 18, 178, + 19, 130, 18, 178, 19, 129, 34, 178, 35, 113, 34, 178, + 35, 98, 34, 178, 50, 97, 50, 178, 51, 66, 50, 178, + 51, 65, 66, 178, 66, 65, 66, 178, 67, 34, 66, 178, + 67, 33, 82, 178, 82, 33, 82, 178, 85, 82, 178, 84, + 98, 178, 99, 98, 178, 99, 98, 178, 98, 114, 122, 49, + 58, 0, 37, 112, 61, 25, 0, 25, 7, 120, 100, 162, + 164, 146, 165, 130, 165, 130, 162, 19, 114, 162, 35, 98, + 162, 35, 98, 162, 51, 82, 162, 66, 82, 162, 67, 66, + 162, 83, 50, 162, 98, 50, 162, 99, 34, 162, 115, 18, + 162, 130, 18, 162, 133, 162, 148, 162, 163, 162, 178, 148, + 162, 105, 145, 0, 32, 49, 22, 0, 22, 117, 242, 82, + 179, 115, 131, 147, 114, 178, 99, 179, 82, 210, 67, 211, + 51, 211, 51, 211, 51, 211, 51, 211, 51, 211, 51, 211, + 51, 211, 66, 195, 83, 179, 98, 178, 115, 147, 131, 115, + 178, 82, 245, 0, 28, 96, 47, 21, 0, 21, 14, 178, + 115, 146, 131, 130, 146, 130, 147, 114, 147, 114, 147, 114, + 147, 114, 147, 114, 131, 130, 115, 154, 178, 240, 66, 240, + 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, + 66, 250, 0, 27, 80, 66, 22, 0, 22, 117, 242, 82, + 179, 115, 131, 147, 114, 178, 99, 179, 82, 210, 67, 211, + 51, 211, 51, 211, 51, 211, 51, 211, 51, 211, 51, 211, + 51, 211, 66, 210, 83, 179, 98, 52, 66, 115, 17, 50, + 35, 130, 17, 65, 19, 178, 68, 230, 81, 226, 81, 211, + 81, 211, 81, 227, 49, 247, 240, 20, 0, 11, 96, 54, + 24, 0, 24, 14, 226, 115, 194, 131, 178, 147, 162, 147, + 162, 147, 162, 147, 162, 147, 162, 131, 178, 115, 201, 242, + 98, 226, 114, 210, 115, 194, 115, 194, 115, 194, 130, 65, + 114, 131, 49, 114, 131, 49, 114, 131, 49, 114, 146, 33, + 74, 99, 0, 30, 80, 51, 19, 0, 19, 70, 65, 114, + 67, 18, 98, 116, 82, 147, 82, 147, 82, 162, 83, 146, + 84, 130, 101, 113, 118, 232, 216, 81, 134, 66, 148, 66, + 179, 50, 194, 51, 178, 51, 178, 52, 162, 51, 17, 130, + 66, 50, 82, 82, 86, 0, 24, 64, 57, 21, 0, 21, + 15, 3, 52, 66, 68, 51, 82, 83, 50, 98, 98, 50, + 98, 98, 50, 98, 98, 49, 114, 113, 49, 114, 113, 49, + 114, 113, 178, 240, 66, 240, 66, 240, 66, 240, 66, 240, + 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, 66, 240, + 66, 250, 0, 27, 16, 51, 26, 0, 26, 10, 58, 114, + 164, 162, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 193, 162, 210, + 146, 226, 99, 240, 39, 0, 33, 112, 58, 24, 0, 24, + 10, 26, 84, 132, 147, 146, 163, 145, 195, 129, 195, 114, + 195, 113, 227, 97, 227, 82, 227, 81, 240, 18, 81, 240, + 19, 50, 240, 19, 49, 240, 50, 49, 240, 51, 18, 240, + 51, 17, 240, 67, 17, 240, 84, 240, 83, 240, 99, 240, + 114, 240, 113, 0, 31, 96, 89, 35, 0, 35, 10, 41, + 41, 100, 131, 132, 147, 131, 130, 179, 131, 130, 195, 116, + 113, 211, 116, 113, 211, 113, 18, 113, 226, 97, 34, 97, + 243, 81, 35, 81, 243, 81, 35, 81, 240, 18, 65, 66, + 66, 240, 19, 49, 67, 49, 240, 35, 49, 67, 49, 240, + 35, 34, 67, 34, 240, 50, 33, 98, 33, 240, 67, 17, + 99, 17, 240, 69, 101, 240, 83, 131, 240, 99, 131, 240, + 99, 131, 240, 98, 146, 240, 129, 161, 0, 45, 48, 58, + 25, 0, 25, 26, 41, 116, 131, 179, 130, 196, 98, 227, + 97, 240, 19, 65, 240, 35, 50, 240, 51, 33, 240, 69, + 240, 100, 240, 115, 240, 115, 240, 97, 19, 240, 66, 35, + 240, 49, 51, 240, 33, 83, 241, 100, 210, 115, 209, 147, + 178, 148, 147, 149, 89, 58, 0, 31, 80, 55, 25, 0, + 25, 9, 58, 85, 147, 148, 145, 195, 130, 211, 113, 227, + 97, 240, 19, 66, 240, 19, 65, 240, 51, 33, 240, 82, + 18, 240, 84, 240, 114, 240, 130, 240, 130, 240, 130, 240, + 130, 240, 130, 240, 130, 240, 130, 240, 130, 240, 130, 240, + 74, 0, 32, 64, 52, 21, 0, 21, 47, 1, 84, 131, + 99, 132, 98, 132, 114, 116, 129, 132, 129, 116, 145, 100, + 161, 100, 240, 20, 240, 20, 240, 35, 240, 36, 240, 20, + 113, 147, 129, 132, 129, 116, 145, 115, 146, 100, 146, 84, + 147, 83, 148, 79, 2, 0, 26, 96, 36, 9, 0, 9, + 6, 50, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 118, 240, 96, 36, 11, 0, 11, + 2, 161, 161, 162, 146, 161, 161, 161, 162, 146, 161, 161, + 162, 146, 146, 161, 161, 162, 146, 161, 161, 162, 146, 146, + 161, 161, 162, 146, 161, 161, 240, 160, 36, 9, 0, 9, + 6, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 54, 240, 96, 30, 18, 0, 18, + 98, 240, 19, 226, 18, 194, 49, 194, 50, 162, 82, 145, + 113, 130, 114, 98, 146, 81, 162, 66, 178, 49, 209, 0, + 45, 48, 8, 18, 0, 76, 79, 0, 11, 80, 13, 9, + 0, 9, 2, 115, 115, 114, 130, 145, 0, 29, 80, 39, + 16, 0, 32, 52, 178, 50, 130, 81, 131, 66, 115, 66, + 129, 82, 181, 131, 50, 114, 82, 33, 50, 98, 33, 50, + 98, 33, 50, 83, 33, 51, 49, 18, 33, 69, 51, 0, + 20, 64, 54, 18, 0, 18, 5, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 36, + 162, 18, 50, 132, 82, 115, 113, 114, 130, 98, 130, 98, + 130, 98, 130, 98, 130, 98, 130, 99, 113, 113, 18, 82, + 113, 34, 50, 129, 52, 0, 23, 48, 31, 15, 0, 30, + 69, 131, 65, 98, 98, 82, 83, 66, 99, 66, 113, 82, + 210, 210, 145, 50, 129, 81, 129, 82, 98, 98, 66, 149, + 0, 19, 64, 52, 18, 0, 18, 87, 240, 18, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 164, 34, + 130, 50, 18, 114, 84, 113, 115, 98, 130, 98, 130, 98, + 130, 98, 130, 98, 130, 98, 130, 113, 115, 114, 84, 130, + 50, 18, 164, 37, 0, 22, 112, 30, 15, 0, 30, 69, + 130, 66, 98, 82, 97, 114, 66, 114, 66, 114, 75, 66, + 210, 210, 145, 65, 129, 82, 113, 98, 66, 149, 0, 19, + 64, 33, 15, 0, 15, 100, 162, 49, 130, 66, 98, 67, + 98, 66, 114, 210, 210, 169, 146, 210, 210, 210, 210, 210, + 210, 210, 210, 210, 210, 210, 168, 0, 19, 80, 50, 19, + 0, 38, 70, 50, 114, 66, 17, 18, 82, 102, 66, 130, + 18, 66, 130, 114, 130, 114, 130, 130, 98, 162, 67, 152, + 162, 240, 33, 240, 49, 240, 59, 155, 129, 146, 97, 177, + 82, 177, 82, 177, 82, 161, 115, 98, 167, 0, 5, 112, + 53, 19, 0, 19, 5, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 240, 34, 240, 34, 240, 34, 51, 178, 18, + 34, 162, 17, 66, 147, 82, 146, 98, 146, 98, 146, 98, + 146, 98, 146, 98, 146, 98, 146, 98, 146, 98, 146, 98, + 103, 39, 0, 24, 16, 27, 11, 0, 11, 50, 132, 116, + 130, 0, 6, 37, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 104, 0, 14, 16, 39, 12, 0, 12, + 98, 148, 132, 146, 0, 6, 117, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 82, + 50, 67, 50, 66, 65, 82, 50, 100, 240, 240, 16, 51, + 19, 0, 19, 5, 240, 34, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 34, 240, 34, 240, 34, 56, 98, 99, 130, + 98, 146, 81, 178, 65, 194, 49, 210, 19, 211, 19, 194, + 50, 194, 66, 178, 67, 162, 83, 146, 84, 88, 23, 0, + 24, 16, 29, 11, 0, 11, 5, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 104, 0, 14, 16, 52, 27, 0, 54, 5, + 51, 83, 178, 33, 34, 34, 34, 162, 17, 66, 17, 66, + 147, 83, 82, 147, 83, 82, 146, 98, 98, 146, 98, 98, + 146, 98, 98, 146, 98, 98, 146, 98, 98, 146, 98, 98, + 146, 98, 98, 146, 98, 98, 111, 9, 0, 34, 16, 37, + 19, 0, 38, 5, 36, 178, 18, 34, 162, 17, 66, 147, + 82, 146, 98, 146, 98, 146, 98, 146, 98, 146, 98, 146, + 98, 146, 98, 146, 98, 146, 98, 103, 39, 0, 24, 16, + 33, 15, 0, 30, 68, 146, 66, 98, 98, 82, 98, 66, + 130, 50, 130, 50, 130, 50, 130, 50, 130, 50, 130, 66, + 98, 82, 98, 98, 66, 148, 0, 19, 80, 51, 18, 0, + 36, 5, 36, 162, 18, 50, 132, 82, 115, 113, 114, 130, + 98, 130, 98, 130, 98, 130, 98, 130, 98, 130, 99, 113, + 116, 82, 114, 18, 50, 130, 37, 146, 240, 18, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 216, 0, 5, 96, + 53, 18, 0, 36, 68, 49, 130, 50, 33, 114, 82, 17, + 113, 115, 98, 130, 98, 130, 98, 130, 98, 130, 98, 130, + 98, 130, 113, 115, 114, 84, 130, 50, 18, 164, 34, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 216, 240, 240, 144, 27, 14, 0, 28, 5, 35, 114, + 17, 34, 99, 35, 99, 35, 98, 65, 114, 194, 194, 194, + 194, 194, 194, 194, 151, 0, 18, 48, 33, 13, 0, 26, + 36, 129, 65, 17, 65, 98, 65, 113, 66, 97, 83, 181, + 165, 65, 99, 49, 114, 49, 129, 50, 113, 49, 18, 65, + 65, 37, 0, 16, 112, 35, 14, 0, 16, 18, 194, 194, + 194, 194, 179, 164, 154, 114, 194, 194, 194, 194, 194, 81, + 98, 81, 98, 81, 98, 81, 98, 81, 98, 81, 98, 65, + 148, 0, 18, 16, 37, 19, 0, 38, 5, 53, 146, 98, + 146, 98, 146, 98, 146, 98, 146, 98, 146, 98, 146, 98, + 146, 98, 146, 98, 146, 83, 146, 65, 18, 162, 34, 18, + 179, 53, 0, 24, 16, 31, 17, 0, 34, 6, 38, 67, + 98, 114, 98, 115, 81, 146, 81, 146, 65, 178, 49, 178, + 49, 178, 33, 210, 17, 211, 227, 242, 241, 0, 22, 64, + 47, 23, 0, 46, 6, 22, 22, 67, 83, 66, 114, 83, + 66, 115, 67, 65, 146, 67, 65, 146, 68, 49, 147, 33, + 34, 33, 178, 33, 34, 33, 178, 33, 35, 17, 180, 67, + 211, 67, 211, 67, 210, 97, 241, 97, 0, 29, 112, 34, + 19, 0, 38, 23, 22, 116, 67, 147, 65, 194, 50, 195, + 33, 228, 240, 18, 240, 35, 241, 19, 225, 34, 209, 51, + 177, 83, 146, 84, 87, 24, 0, 24, 16, 47, 18, 0, + 36, 7, 23, 83, 98, 115, 97, 146, 97, 146, 81, 178, + 65, 178, 65, 179, 33, 210, 33, 210, 33, 227, 243, 243, + 240, 17, 240, 33, 240, 18, 240, 17, 194, 49, 179, 33, + 195, 33, 194, 34, 211, 0, 6, 32, 31, 14, 0, 28, + 26, 66, 83, 66, 67, 81, 82, 97, 67, 97, 51, 163, + 178, 179, 65, 83, 81, 82, 97, 67, 82, 51, 83, 59, + 0, 17, 112, 37, 10, 0, 9, 35, 98, 114, 130, 130, + 130, 130, 131, 130, 130, 130, 130, 130, 129, 130, 98, 161, + 161, 146, 130, 130, 130, 130, 115, 114, 130, 130, 130, 130, + 146, 147, 240, 128, 35, 5, 240, 240, 162, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 240, 48, 37, 10, 0, 8, 99, 146, 146, 130, 130, + 130, 130, 115, 114, 130, 130, 130, 130, 145, 146, 162, 98, + 129, 130, 130, 130, 130, 130, 131, 130, 130, 130, 130, 130, + 114, 99, 240, 192, 14, 16, 0, 42, 36, 97, 50, 51, + 49, 65, 100, 0, 32, 80, 4, 12, 0, 60, 27, 7, + 0, 13, 34, 68, 52, 66, 240, 177, 98, 82, 82, 82, + 82, 82, 82, 82, 67, 68, 52, 52, 52, 52, 66, 240, + 48, 57, 15, 0, 16, 33, 225, 225, 209, 225, 225, 209, + 225, 165, 131, 33, 17, 98, 65, 18, 82, 49, 19, 66, + 65, 19, 66, 50, 33, 82, 49, 146, 49, 146, 34, 81, + 50, 33, 81, 81, 33, 81, 83, 82, 98, 66, 133, 145, + 225, 225, 209, 225, 225, 209, 225, 240, 240, 224, 39, 17, + 0, 18, 4, 178, 66, 130, 82, 130, 67, 114, 82, 130, + 242, 227, 227, 227, 186, 162, 242, 242, 241, 242, 241, 240, + 17, 161, 69, 98, 50, 51, 65, 66, 71, 65, 115, 0, + 22, 33, 15, 0, 30, 2, 36, 34, 67, 67, 82, 98, + 81, 129, 66, 130, 50, 130, 50, 130, 50, 130, 65, 129, + 82, 98, 83, 67, 66, 36, 34, 0, 22, 112, 46, 19, + 0, 19, 7, 54, 83, 114, 115, 114, 130, 113, 147, 81, + 178, 81, 179, 49, 210, 49, 211, 17, 188, 194, 240, 34, + 240, 34, 240, 34, 204, 194, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 34, 232, 0, 24, 80, 30, 5, 240, 240, + 162, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 240, + 240, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 240, 128, 53, 13, 0, 13, 67, 145, 49, 113, 50, 113, + 50, 113, 193, 194, 179, 164, 130, 19, 113, 36, 82, 52, + 66, 67, 66, 83, 50, 83, 51, 82, 66, 82, 67, 66, + 83, 49, 115, 18, 131, 163, 179, 178, 178, 98, 50, 98, + 50, 97, 50, 132, 0, 5, 96, 13, 12, 0, 15, 3, + 51, 51, 51, 51, 51, 0, 40, 112, 76, 25, 0, 26, + 6, 240, 19, 99, 194, 162, 161, 225, 129, 100, 33, 49, + 98, 66, 67, 50, 81, 66, 98, 65, 81, 66, 113, 65, + 65, 66, 129, 81, 49, 66, 129, 81, 49, 66, 225, 49, + 66, 225, 49, 66, 129, 81, 49, 66, 129, 81, 65, 65, + 129, 65, 81, 66, 97, 81, 82, 66, 65, 82, 97, 100, + 97, 129, 225, 162, 162, 195, 99, 240, 22, 0, 32, 80, + 21, 11, 0, 11, 36, 97, 50, 81, 50, 131, 83, 18, + 66, 51, 50, 36, 67, 19, 0, 33, 48, 29, 12, 0, + 27, 65, 49, 97, 50, 82, 49, 82, 49, 98, 34, 82, + 34, 98, 50, 98, 49, 114, 34, 113, 50, 113, 49, 0, + 16, 112, 20, 18, 0, 42, 111, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 0, 31, 112, 9, 12, + 0, 34, 73, 57, 0, 22, 112, 80, 25, 0, 26, 6, + 240, 19, 99, 194, 162, 161, 225, 129, 42, 65, 98, 66, + 82, 50, 81, 82, 98, 49, 81, 82, 98, 49, 65, 98, + 98, 65, 49, 98, 83, 65, 49, 105, 81, 49, 98, 65, + 113, 49, 98, 81, 97, 49, 98, 82, 81, 65, 82, 82, + 17, 33, 81, 82, 82, 17, 33, 82, 66, 82, 17, 18, + 97, 39, 50, 33, 129, 225, 162, 162, 195, 99, 240, 22, + 0, 32, 80, 8, 11, 0, 15, 24, 0, 38, 112, 27, + 14, 0, 14, 53, 129, 81, 97, 113, 65, 145, 49, 145, + 49, 145, 49, 145, 49, 145, 65, 113, 97, 81, 133, 0, + 37, 64, 37, 18, 0, 30, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 159, 162, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 240, 255, + 0, 20, 80, 25, 11, 0, 11, 36, 97, 50, 65, 82, + 49, 82, 51, 50, 66, 50, 130, 130, 130, 129, 146, 65, + 56, 0, 27, 112, 27, 11, 0, 11, 21, 82, 50, 66, + 50, 82, 34, 130, 100, 178, 162, 66, 50, 51, 50, 50, + 66, 50, 50, 85, 0, 26, 96, 13, 9, 0, 9, 66, + 99, 83, 98, 98, 98, 0, 30, 16, 51, 20, 0, 43, + 18, 83, 147, 82, 162, 98, 162, 98, 162, 83, 147, 82, + 162, 98, 162, 98, 162, 83, 49, 83, 83, 49, 83, 68, + 33, 100, 49, 21, 98, 20, 51, 98, 240, 50, 240, 50, + 240, 50, 240, 34, 240, 50, 240, 50, 0, 9, 96, 66, + 17, 0, 17, 74, 85, 34, 133, 34, 118, 34, 118, 34, + 103, 34, 118, 34, 118, 34, 118, 34, 133, 34, 133, 34, + 163, 34, 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, + 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, + 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, + 178, 34, 240, 240, 160, 11, 7, 0, 16, 98, 68, 52, + 66, 0, 15, 48, 14, 9, 0, 34, 17, 114, 101, 114, + 114, 99, 52, 240, 240, 32, 19, 9, 0, 9, 4, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 86, 0, 22, + 112, 21, 11, 0, 12, 84, 98, 34, 66, 66, 50, 66, + 50, 66, 50, 66, 66, 34, 100, 0, 32, 32, 28, 12, + 0, 27, 65, 113, 65, 113, 49, 114, 49, 114, 34, 114, + 34, 82, 34, 82, 50, 81, 50, 81, 65, 97, 49, 0, + 17, 48, 59, 23, 0, 23, 4, 177, 146, 162, 146, 161, + 162, 145, 178, 130, 178, 129, 194, 114, 194, 113, 210, 97, + 226, 82, 97, 114, 81, 98, 86, 34, 83, 209, 99, 194, + 81, 18, 193, 97, 18, 177, 97, 34, 162, 81, 50, 161, + 97, 50, 146, 104, 113, 178, 129, 194, 114, 166, 0, 29, + 16, 61, 22, 0, 22, 4, 177, 130, 161, 146, 161, 146, + 145, 162, 145, 162, 129, 178, 114, 178, 113, 194, 97, 210, + 97, 51, 114, 81, 49, 34, 70, 34, 33, 66, 177, 49, + 66, 162, 51, 34, 161, 82, 34, 145, 161, 146, 146, 145, + 146, 146, 130, 161, 145, 49, 97, 145, 65, 82, 135, 0, + 27, 112, 66, 24, 0, 24, 21, 161, 114, 50, 129, 130, + 50, 129, 146, 34, 113, 210, 114, 164, 129, 242, 81, 240, + 34, 65, 194, 50, 49, 194, 66, 34, 97, 82, 50, 49, + 98, 101, 49, 99, 225, 99, 209, 97, 18, 209, 97, 18, + 193, 97, 34, 177, 97, 50, 177, 97, 50, 161, 120, 129, + 178, 145, 194, 129, 182, 0, 30, 48, 35, 13, 0, 25, + 18, 164, 148, 162, 240, 145, 193, 193, 193, 178, 148, 133, + 114, 162, 177, 193, 193, 193, 99, 49, 99, 65, 83, 65, + 98, 82, 65, 117, 240, 240, 16, 68, 24, 240, 240, 18, + 240, 115, 240, 115, 240, 115, 240, 130, 0, 8, 97, 240, + 114, 240, 115, 240, 99, 240, 84, 240, 81, 19, 240, 65, + 19, 240, 49, 35, 240, 49, 50, 240, 49, 51, 240, 17, + 67, 240, 17, 82, 240, 17, 83, 234, 225, 114, 210, 115, + 194, 115, 193, 131, 178, 147, 162, 147, 148, 132, 90, 26, + 0, 30, 48, 68, 25, 240, 240, 146, 240, 115, 240, 99, + 240, 98, 240, 113, 0, 9, 49, 240, 130, 240, 131, 240, + 115, 240, 100, 240, 97, 19, 240, 81, 19, 240, 66, 19, + 240, 65, 51, 240, 49, 51, 240, 33, 67, 240, 33, 83, + 240, 17, 83, 250, 241, 115, 210, 115, 210, 115, 209, 132, + 178, 147, 178, 147, 164, 132, 106, 27, 0, 31, 80, 71, + 24, 240, 240, 81, 240, 115, 240, 82, 18, 240, 50, 50, + 240, 17, 113, 0, 8, 49, 240, 114, 240, 115, 240, 99, + 240, 84, 240, 81, 19, 240, 65, 19, 240, 50, 19, 240, + 49, 50, 240, 49, 51, 240, 17, 67, 240, 17, 82, 240, + 17, 83, 234, 225, 114, 210, 115, 194, 115, 193, 131, 178, + 147, 162, 147, 148, 132, 90, 26, 0, 30, 48, 66, 24, + 0, 6, 116, 81, 209, 51, 33, 209, 99, 0, 11, 65, + 240, 114, 240, 115, 240, 99, 240, 84, 240, 81, 19, 240, + 65, 19, 240, 50, 19, 240, 49, 50, 240, 49, 51, 240, + 17, 67, 240, 17, 82, 240, 17, 83, 234, 225, 114, 210, + 115, 194, 115, 193, 131, 178, 147, 162, 147, 148, 132, 90, + 26, 0, 30, 48, 60, 24, 0, 6, 98, 98, 226, 98, + 0, 14, 34, 240, 114, 240, 114, 240, 100, 240, 84, 240, + 84, 240, 65, 35, 240, 49, 35, 240, 34, 50, 240, 33, + 67, 240, 17, 67, 241, 98, 241, 99, 234, 209, 130, 209, + 130, 209, 131, 178, 146, 178, 146, 163, 147, 132, 148, 89, + 42, 0, 30, 48, 69, 24, 148, 240, 50, 66, 240, 17, + 97, 240, 17, 97, 240, 18, 66, 240, 52, 0, 8, 82, + 240, 114, 240, 114, 240, 100, 240, 84, 240, 84, 240, 65, + 35, 240, 49, 35, 240, 49, 35, 240, 33, 67, 240, 17, + 67, 242, 67, 241, 98, 250, 210, 99, 209, 130, 209, 131, + 178, 131, 178, 146, 163, 147, 132, 148, 89, 42, 0, 30, + 48, 87, 35, 0, 36, 63, 5, 240, 68, 132, 240, 68, + 147, 240, 65, 18, 162, 240, 49, 34, 162, 240, 34, 34, + 97, 65, 240, 33, 50, 97, 65, 240, 17, 66, 97, 65, + 242, 66, 82, 240, 81, 82, 67, 240, 79, 1, 240, 50, + 98, 67, 240, 49, 114, 82, 240, 33, 130, 97, 81, 162, + 130, 97, 66, 161, 146, 97, 66, 145, 162, 178, 130, 162, + 178, 130, 162, 163, 115, 162, 148, 100, 162, 133, 58, 63, + 4, 0, 44, 16, 67, 20, 0, 20, 101, 81, 115, 66, + 34, 98, 129, 18, 83, 147, 82, 163, 67, 178, 66, 194, + 51, 209, 51, 209, 51, 209, 51, 240, 35, 240, 35, 240, + 35, 240, 35, 209, 66, 209, 67, 178, 67, 177, 99, 146, + 114, 130, 147, 67, 198, 240, 17, 240, 65, 240, 36, 240, + 51, 240, 50, 240, 50, 240, 34, 244, 0, 6, 48, 67, + 22, 240, 194, 240, 84, 240, 68, 240, 83, 240, 98, 0, + 6, 111, 3, 130, 132, 130, 147, 130, 162, 130, 162, 130, + 97, 65, 130, 97, 65, 130, 97, 65, 130, 82, 65, 130, + 67, 217, 210, 67, 210, 82, 210, 97, 81, 114, 97, 65, + 130, 97, 66, 114, 178, 114, 178, 114, 163, 114, 148, 114, + 133, 63, 4, 0, 27, 112, 68, 22, 240, 240, 66, 240, + 52, 240, 36, 240, 35, 240, 50, 0, 7, 31, 3, 130, + 132, 130, 147, 130, 162, 130, 162, 130, 97, 65, 130, 97, + 65, 130, 97, 65, 130, 82, 65, 130, 67, 217, 210, 67, + 210, 82, 210, 97, 81, 114, 97, 66, 114, 97, 66, 114, + 178, 114, 178, 114, 163, 114, 148, 114, 133, 63, 4, 0, + 27, 112, 69, 22, 240, 240, 18, 240, 68, 240, 34, 19, + 241, 82, 209, 129, 0, 6, 63, 3, 130, 132, 130, 147, + 130, 162, 130, 162, 130, 97, 65, 130, 97, 65, 130, 97, + 65, 130, 82, 65, 130, 67, 217, 210, 67, 210, 82, 210, + 97, 81, 114, 97, 65, 130, 97, 66, 114, 178, 114, 178, + 114, 163, 114, 148, 114, 133, 63, 4, 0, 27, 112, 63, + 22, 0, 6, 18, 82, 210, 82, 0, 12, 15, 3, 130, + 132, 130, 147, 130, 162, 130, 162, 130, 97, 65, 130, 97, + 65, 130, 97, 65, 130, 82, 65, 130, 67, 217, 210, 67, + 210, 82, 210, 97, 81, 114, 97, 66, 114, 97, 66, 114, + 178, 114, 178, 114, 163, 114, 148, 114, 133, 63, 4, 0, + 27, 112, 34, 13, 226, 179, 179, 194, 194, 240, 240, 42, + 114, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 122, 0, 16, 80, + 35, 13, 240, 82, 163, 148, 131, 146, 240, 240, 74, 114, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 122, 0, 16, 80, 36, + 13, 240, 34, 164, 133, 114, 66, 65, 129, 240, 234, 114, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 122, 0, 16, 80, 34, + 13, 240, 178, 98, 50, 98, 0, 6, 122, 114, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 122, 0, 16, 80, 49, 23, 0, + 23, 14, 210, 115, 178, 146, 162, 147, 146, 162, 146, 163, + 130, 178, 130, 179, 114, 179, 114, 179, 58, 115, 114, 179, + 114, 179, 114, 179, 114, 179, 114, 178, 130, 163, 130, 162, + 146, 147, 146, 146, 162, 115, 126, 0, 29, 112, 67, 25, + 0, 7, 36, 65, 226, 53, 0, 13, 87, 120, 100, 162, + 164, 146, 165, 130, 165, 130, 162, 19, 114, 162, 35, 98, + 162, 35, 98, 162, 51, 82, 162, 66, 82, 162, 67, 66, + 162, 83, 50, 162, 98, 50, 162, 99, 34, 162, 115, 18, + 162, 130, 18, 162, 133, 162, 148, 162, 163, 162, 178, 148, + 162, 105, 145, 0, 32, 59, 22, 240, 195, 240, 68, 240, + 68, 240, 83, 240, 97, 0, 7, 101, 242, 82, 179, 115, + 131, 147, 114, 178, 99, 179, 82, 210, 67, 211, 51, 211, + 51, 211, 51, 211, 51, 211, 51, 211, 51, 211, 51, 211, + 66, 195, 83, 179, 98, 178, 115, 147, 131, 115, 178, 82, + 245, 0, 28, 96, 60, 22, 240, 240, 51, 240, 52, 240, + 36, 240, 35, 240, 65, 0, 8, 5, 242, 82, 179, 115, + 131, 147, 114, 178, 99, 179, 82, 210, 67, 211, 51, 211, + 51, 211, 51, 211, 51, 211, 51, 211, 51, 211, 51, 211, + 66, 195, 83, 179, 98, 178, 115, 147, 131, 115, 178, 82, + 245, 0, 28, 96, 61, 22, 145, 240, 83, 240, 53, 240, + 19, 18, 242, 81, 210, 114, 0, 7, 37, 242, 82, 179, + 115, 131, 147, 114, 178, 99, 179, 82, 210, 67, 211, 51, + 211, 51, 211, 51, 211, 51, 211, 51, 211, 51, 211, 51, + 211, 66, 195, 83, 179, 98, 178, 115, 147, 131, 115, 178, + 82, 245, 0, 28, 96, 55, 22, 0, 6, 21, 66, 161, + 69, 0, 12, 117, 242, 82, 179, 115, 131, 147, 114, 178, + 99, 179, 82, 210, 67, 211, 51, 211, 51, 211, 51, 211, + 51, 211, 51, 211, 51, 211, 51, 211, 66, 195, 83, 179, + 98, 178, 115, 147, 131, 115, 178, 82, 245, 0, 28, 96, + 55, 22, 0, 6, 18, 82, 210, 82, 0, 12, 117, 242, + 82, 179, 115, 131, 147, 114, 178, 99, 179, 82, 210, 67, + 211, 51, 211, 51, 211, 51, 211, 51, 211, 51, 211, 51, + 211, 51, 211, 66, 195, 83, 179, 98, 178, 115, 147, 131, + 115, 178, 82, 245, 0, 28, 96, 29, 14, 0, 28, 1, + 145, 50, 114, 66, 82, 98, 50, 130, 18, 163, 179, 162, + 18, 130, 50, 98, 82, 66, 114, 49, 145, 0, 21, 48, + 63, 22, 0, 22, 117, 97, 130, 83, 33, 115, 117, 99, + 147, 114, 163, 99, 149, 82, 146, 34, 67, 131, 35, 51, + 130, 51, 51, 114, 67, 51, 98, 83, 51, 82, 99, 51, + 66, 115, 51, 50, 131, 51, 35, 131, 66, 34, 146, 85, + 147, 99, 162, 115, 147, 101, 115, 113, 35, 82, 129, 101, + 0, 28, 96, 62, 26, 240, 240, 51, 240, 132, 240, 132, + 240, 146, 240, 177, 0, 8, 26, 58, 114, 164, 162, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 193, 162, 210, 146, 226, 99, + 240, 39, 0, 33, 112, 62, 26, 240, 240, 147, 240, 115, + 240, 115, 240, 114, 240, 129, 0, 8, 74, 58, 114, 164, + 162, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 193, 162, 210, 146, + 226, 99, 240, 39, 0, 33, 112, 65, 26, 177, 240, 146, + 240, 132, 240, 98, 34, 240, 66, 81, 240, 33, 129, 0, + 7, 106, 58, 114, 164, 162, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 193, 162, 210, 146, 226, 99, 240, 39, 0, 33, 112, + 58, 26, 0, 7, 50, 98, 240, 18, 98, 0, 14, 26, + 88, 114, 179, 162, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 193, + 162, 210, 146, 226, 99, 240, 39, 0, 33, 112, 66, 25, + 240, 240, 130, 240, 115, 240, 99, 240, 98, 240, 113, 0, + 8, 25, 58, 85, 147, 148, 145, 195, 130, 211, 113, 227, + 97, 240, 19, 66, 240, 19, 65, 240, 51, 33, 240, 82, + 18, 240, 84, 240, 114, 240, 130, 240, 130, 240, 130, 240, + 130, 240, 130, 240, 130, 240, 130, 240, 130, 240, 130, 240, + 74, 0, 32, 64, 69, 21, 0, 21, 66, 240, 36, 113, + 118, 84, 147, 55, 146, 19, 52, 132, 84, 130, 131, 130, + 132, 114, 147, 114, 147, 114, 147, 114, 147, 114, 147, 114, + 147, 114, 146, 130, 146, 130, 131, 130, 130, 146, 114, 162, + 98, 178, 82, 194, 66, 210, 19, 243, 240, 50, 240, 66, + 240, 66, 240, 66, 240, 66, 240, 34, 240, 50, 240, 240, + 144, 53, 17, 0, 17, 101, 178, 50, 146, 82, 129, 98, + 114, 98, 114, 98, 114, 82, 130, 66, 146, 19, 178, 66, + 146, 82, 130, 98, 114, 98, 114, 114, 98, 114, 98, 114, + 98, 114, 98, 34, 50, 98, 19, 50, 98, 18, 50, 114, + 18, 50, 69, 36, 0, 22, 48, 16, 0, 16, 18, 227, + 227, 242, 241, 240, 17, 240, 240, 228, 178, 50, 130, 81, + 131, 66, 115, 66, 130, 66, 196, 147, 34, 114, 82, 33, + 50, 98, 33, 50, 98, 33, 50, 83, 33, 51, 49, 18, + 33, 69, 51, 0, 20, 64, 47, 16, 0, 17, 1, 227, + 195, 210, 209, 225, 0, 5, 100, 178, 50, 130, 81, 131, + 66, 115, 66, 129, 82, 181, 131, 50, 114, 82, 33, 50, + 98, 33, 50, 98, 33, 50, 83, 33, 51, 49, 18, 33, + 69, 51, 0, 20, 64, 51, 16, 0, 16, 81, 227, 194, + 18, 177, 50, 145, 81, 129, 113, 240, 240, 180, 178, 50, + 130, 81, 131, 66, 115, 66, 129, 82, 181, 131, 50, 114, + 82, 33, 50, 98, 33, 50, 98, 33, 50, 83, 33, 51, + 49, 18, 33, 69, 51, 0, 20, 64, 48, 16, 0, 20, + 35, 81, 97, 35, 33, 97, 83, 0, 7, 36, 178, 50, + 130, 81, 131, 66, 115, 66, 129, 82, 181, 131, 50, 114, + 82, 33, 50, 98, 33, 50, 98, 33, 50, 83, 33, 51, + 49, 18, 33, 69, 51, 0, 20, 64, 47, 16, 0, 20, + 19, 51, 115, 51, 115, 51, 0, 7, 20, 178, 50, 130, + 81, 131, 66, 115, 66, 129, 82, 181, 131, 50, 114, 82, + 33, 50, 98, 33, 50, 98, 33, 50, 83, 33, 51, 49, + 18, 33, 69, 51, 0, 20, 64, 51, 16, 0, 16, 67, + 178, 50, 145, 81, 145, 81, 146, 50, 165, 240, 240, 212, + 178, 50, 130, 81, 131, 66, 115, 66, 129, 82, 181, 131, + 50, 114, 82, 33, 50, 98, 33, 50, 98, 33, 50, 83, + 33, 51, 49, 18, 33, 69, 51, 0, 20, 64, 46, 22, + 0, 44, 52, 69, 130, 50, 18, 50, 98, 83, 82, 83, + 66, 98, 83, 66, 99, 81, 82, 99, 127, 82, 66, 210, + 82, 194, 98, 129, 50, 98, 129, 50, 81, 18, 97, 67, + 49, 50, 66, 85, 85, 0, 28, 32, 38, 15, 0, 30, + 69, 131, 65, 98, 98, 82, 83, 66, 99, 66, 113, 82, + 210, 210, 145, 50, 129, 82, 113, 82, 98, 98, 66, 149, + 193, 210, 196, 226, 210, 194, 164, 0, 6, 80, 38, 15, + 0, 15, 34, 211, 211, 210, 226, 241, 240, 240, 181, 130, + 66, 98, 82, 98, 98, 66, 114, 66, 114, 75, 66, 210, + 210, 145, 66, 113, 82, 113, 98, 66, 149, 0, 19, 64, + 38, 15, 0, 16, 2, 195, 194, 194, 194, 194, 240, 240, + 213, 130, 66, 98, 82, 97, 114, 66, 114, 66, 114, 75, + 66, 210, 210, 130, 65, 129, 82, 98, 98, 66, 149, 0, + 19, 64, 40, 15, 0, 15, 82, 211, 181, 146, 49, 129, + 97, 97, 0, 5, 117, 130, 66, 98, 82, 97, 114, 66, + 114, 66, 114, 75, 66, 210, 210, 145, 65, 129, 82, 113, + 98, 66, 149, 0, 19, 64, 38, 15, 0, 19, 3, 51, + 99, 51, 99, 51, 0, 6, 85, 130, 66, 98, 82, 97, + 114, 66, 114, 66, 114, 75, 66, 210, 210, 145, 65, 129, + 82, 113, 98, 66, 149, 0, 19, 64, 28, 11, 0, 11, + 1, 162, 147, 162, 161, 177, 240, 228, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 119, 0, 14, 16, + 28, 11, 0, 11, 98, 131, 115, 115, 129, 145, 240, 245, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 104, 0, 14, 16, 31, 11, 0, 11, 49, 147, 129, 17, + 113, 49, 81, 81, 240, 240, 117, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 104, 0, 14, 16, 29, + 11, 0, 13, 99, 35, 51, 35, 51, 35, 240, 240, 117, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 103, 0, 14, 16, 52, 17, 0, 17, 19, 130, 83, 84, + 99, 34, 34, 116, 81, 49, 52, 146, 18, 19, 131, 51, + 130, 83, 194, 19, 162, 51, 130, 83, 98, 99, 98, 115, + 66, 131, 66, 146, 66, 146, 66, 146, 66, 146, 82, 114, + 98, 114, 115, 51, 165, 0, 22, 16, 43, 19, 0, 26, + 84, 65, 145, 53, 0, 8, 5, 36, 178, 18, 34, 162, + 17, 66, 147, 82, 146, 98, 146, 98, 146, 98, 146, 98, + 146, 98, 146, 98, 146, 98, 146, 98, 146, 98, 103, 39, + 0, 24, 16, 41, 15, 0, 15, 34, 211, 210, 226, 226, + 241, 240, 240, 180, 146, 66, 98, 98, 82, 98, 66, 130, + 50, 130, 50, 130, 50, 130, 50, 130, 50, 130, 66, 98, + 82, 98, 98, 66, 148, 0, 19, 80, 41, 15, 0, 16, + 2, 195, 194, 194, 194, 193, 240, 240, 228, 146, 66, 98, + 98, 82, 98, 66, 130, 50, 130, 50, 130, 50, 130, 50, + 130, 50, 130, 66, 98, 82, 98, 98, 66, 148, 0, 19, + 80, 44, 15, 0, 15, 82, 196, 180, 161, 65, 129, 97, + 97, 129, 240, 240, 132, 146, 66, 98, 98, 82, 98, 66, + 130, 50, 130, 50, 130, 50, 130, 50, 130, 50, 130, 66, + 98, 82, 98, 98, 66, 148, 0, 19, 80, 41, 15, 0, + 19, 4, 161, 50, 49, 65, 84, 0, 6, 100, 146, 66, + 98, 98, 82, 98, 66, 130, 50, 130, 50, 130, 50, 130, + 50, 130, 50, 130, 66, 98, 82, 98, 98, 66, 148, 0, + 19, 80, 41, 15, 0, 19, 3, 51, 99, 51, 99, 51, + 0, 6, 84, 146, 66, 98, 98, 82, 98, 66, 130, 50, + 130, 50, 130, 50, 130, 50, 130, 50, 130, 66, 98, 82, + 98, 98, 66, 148, 0, 19, 80, 20, 18, 0, 34, 82, + 244, 228, 242, 0, 7, 127, 0, 5, 98, 244, 228, 242, + 0, 25, 112, 41, 15, 0, 30, 69, 33, 82, 68, 66, + 98, 82, 98, 66, 97, 18, 50, 81, 34, 50, 65, 50, + 50, 49, 66, 50, 33, 82, 50, 17, 98, 66, 98, 82, + 98, 68, 66, 81, 37, 0, 19, 80, 50, 19, 0, 19, + 50, 240, 35, 240, 35, 240, 34, 240, 65, 240, 65, 0, + 6, 5, 53, 146, 98, 146, 98, 146, 98, 146, 98, 146, + 98, 146, 98, 146, 98, 146, 98, 146, 98, 146, 83, 146, + 65, 18, 162, 34, 18, 179, 53, 0, 24, 16, 49, 19, + 0, 20, 18, 240, 34, 240, 19, 242, 240, 18, 240, 33, + 0, 6, 37, 53, 146, 98, 146, 98, 146, 98, 146, 98, + 146, 98, 146, 98, 146, 98, 146, 98, 146, 98, 146, 83, + 146, 65, 18, 162, 34, 18, 179, 53, 0, 24, 16, 50, + 19, 0, 19, 98, 240, 35, 242, 18, 210, 49, 194, 81, + 240, 65, 240, 240, 245, 53, 146, 98, 146, 98, 146, 98, + 146, 98, 146, 98, 146, 98, 146, 98, 146, 98, 146, 98, + 146, 83, 146, 65, 18, 162, 34, 18, 179, 53, 0, 24, + 16, 45, 19, 0, 24, 19, 51, 163, 51, 163, 51, 0, + 8, 5, 68, 146, 98, 146, 98, 146, 98, 146, 98, 146, + 98, 146, 98, 146, 98, 146, 98, 146, 98, 146, 83, 146, + 65, 18, 162, 34, 18, 179, 53, 0, 24, 16, 54, 18, + 0, 19, 18, 243, 242, 242, 242, 0, 8, 7, 23, 83, + 98, 115, 97, 146, 97, 146, 82, 162, 65, 178, 65, 179, + 33, 210, 33, 210, 33, 227, 243, 243, 240, 17, 240, 33, + 240, 18, 240, 17, 194, 49, 179, 33, 195, 33, 194, 34, + 211, 0, 6, 32, 51, 16, 0, 18, 50, 181, 181, 226, + 226, 226, 226, 226, 36, 130, 17, 50, 115, 66, 114, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 82, 114, 82, + 114, 66, 130, 65, 146, 49, 162, 18, 179, 210, 226, 226, + 226, 226, 225, 210, 240, 240, 240, 56, 18, 0, 22, 115, + 51, 147, 51, 147, 51, 0, 7, 71, 38, 83, 98, 130, + 97, 146, 97, 147, 81, 162, 65, 179, 49, 194, 49, 194, + 33, 226, 17, 227, 243, 240, 18, 240, 17, 240, 33, 240, + 33, 240, 17, 194, 49, 179, 34, 179, 33, 194, 34, 212, + 0, 6, 16, +}; + +//***************************************************************************** +// +// The glyph offset table for the 30 point Theanomodern font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanomodern30[] = +{ + 0, 4, 32, 59, 108, 186, 255, 325, + 341, 378, 416, 449, 483, 499, 508, 519, + 556, 605, 634, 675, 721, 759, 798, 845, + 885, 933, 980, 997, 1019, 1048, 1059, 1088, + 1122, 1212, 1269, 1317, 1368, 1417, 1474, 1526, + 1582, 1632, 1661, 1709, 1767, 1818, 1900, 1961, + 2010, 2057, 2123, 2177, 2228, 2285, 2336, 2394, + 2483, 2541, 2596, 2648, 2684, 2720, 2756, 2786, + 2794, 2807, 2846, 2900, 2931, 2983, 3013, 3046, + 3096, 3149, 3176, 3215, 3266, 3295, 3347, 3384, + 3417, 3468, 3521, 3548, 3581, 3616, 3653, 3684, + 3731, 3765, 3812, 3843, 3880, 3915, 3952, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3966, 3970, 3997, 4054, 4093, 4126, 4172, 4202, + 4255, 4268, 4344, 4365, 4394, 4414, 4423, 4503, + 4511, 4538, 4575, 4600, 4627, 4640, 4691, 4757, + 4768, 4782, 4801, 4822, 4850, 4909, 4970, 5036, + 5071, 5139, 5207, 5278, 5344, 5404, 5473, 5560, + 5627, 5694, 5762, 5831, 5894, 5928, 5963, 5999, + 6033, 6082, 6149, 6208, 6268, 6329, 6384, 6439, + 6468, 6531, 6593, 6655, 6720, 6778, 6844, 6913, + 6966, 7014, 7061, 7112, 7160, 7207, 7258, 7304, + 7342, 7380, 7418, 7458, 7496, 7524, 7552, 7583, + 7612, 7664, 7707, 7748, 7789, 7833, 7874, 7915, + 7935, 7976, 8026, 8075, 8125, 8170, 8224, 8275, +}; + +//***************************************************************************** +// +// The font definition for the 30 point Theanomodern font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanomodern30 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 31, + + // + // The height of the font. + // + 40, + + // + // The baseline of the font. + // + 30, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanomodern30, + + // + // A pointer to the actual font data + // + g_pui8Theanomodern30Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanooldstyle14.c b/third_party/fonts/ofl/fonts/fonttheanooldstyle14.c new file mode 100644 index 0000000..2564fcb --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanooldstyle14.c @@ -0,0 +1,516 @@ +//***************************************************************************** +// +// fonttheanooldstyle14.c - Font definition for the 14pt Theanooldstyle font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanooldstyle +// Size: 14 point +// Bold: no +// Italic: no +// Memory usage: 3756 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 14 point Theanooldstyle font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanooldstyle14Data[3556] = +{ + 5, 6, 0, 12, 96, 12, 3, 146, 18, 18, 17, 33, + 33, 33, 81, 34, 208, 12, 5, 241, 33, 17, 33, 17, + 33, 65, 0, 6, 48, 24, 8, 240, 193, 33, 65, 17, + 65, 33, 39, 49, 33, 65, 33, 39, 33, 33, 65, 33, + 65, 33, 240, 240, 80, 26, 7, 240, 33, 68, 33, 33, + 17, 17, 35, 18, 17, 67, 98, 81, 17, 18, 17, 17, + 17, 33, 17, 36, 81, 240, 144, 32, 10, 240, 240, 18, + 65, 33, 33, 33, 49, 33, 17, 65, 33, 17, 82, 17, + 145, 33, 81, 33, 17, 65, 33, 17, 49, 49, 17, 114, + 240, 240, 192, 28, 11, 240, 240, 115, 113, 33, 113, 33, + 113, 17, 130, 35, 34, 17, 49, 33, 50, 17, 49, 67, + 49, 82, 69, 19, 240, 240, 240, 7, 2, 97, 17, 17, + 240, 128, 16, 4, 240, 34, 33, 49, 33, 49, 49, 49, + 49, 49, 65, 49, 65, 80, 16, 4, 240, 17, 65, 49, + 65, 49, 49, 49, 49, 49, 33, 49, 33, 112, 16, 8, + 240, 193, 66, 17, 18, 51, 65, 17, 17, 81, 113, 0, + 8, 64, 14, 8, 0, 6, 49, 113, 113, 71, 65, 113, + 113, 240, 240, 96, 8, 3, 240, 240, 98, 33, 17, 128, + 8, 5, 0, 6, 36, 240, 240, 16, 7, 3, 240, 240, + 49, 34, 208, 15, 4, 240, 49, 49, 49, 33, 49, 49, + 49, 33, 49, 49, 49, 176, 25, 8, 240, 179, 65, 49, + 33, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, + 33, 49, 65, 17, 240, 240, 80, 15, 4, 225, 34, 17, + 17, 49, 49, 49, 49, 49, 49, 49, 240, 32, 18, 7, + 240, 131, 49, 49, 33, 49, 97, 81, 81, 81, 81, 81, + 65, 22, 240, 224, 20, 7, 240, 116, 33, 65, 17, 65, + 81, 66, 113, 113, 17, 65, 17, 65, 18, 18, 240, 240, + 20, 8, 240, 209, 98, 81, 17, 81, 17, 65, 33, 49, + 49, 55, 81, 113, 113, 240, 240, 80, 17, 7, 240, 116, + 49, 97, 100, 98, 97, 97, 97, 17, 49, 51, 240, 240, + 16, 20, 7, 240, 161, 66, 65, 97, 81, 19, 34, 49, + 17, 65, 17, 65, 17, 65, 36, 240, 240, 17, 7, 240, + 117, 17, 65, 81, 97, 97, 81, 97, 97, 82, 82, 240, + 240, 16, 23, 7, 240, 116, 33, 65, 17, 65, 18, 33, + 51, 65, 18, 33, 50, 17, 65, 17, 65, 33, 18, 240, + 240, 20, 7, 240, 116, 33, 49, 33, 65, 17, 65, 17, + 50, 35, 17, 81, 81, 81, 240, 240, 144, 8, 3, 240, + 98, 17, 129, 34, 208, 9, 3, 240, 98, 18, 162, 33, + 17, 128, 14, 8, 0, 6, 97, 82, 66, 66, 114, 130, + 130, 240, 240, 48, 9, 8, 0, 8, 7, 151, 0, 6, + 16, 14, 8, 0, 6, 1, 130, 130, 130, 82, 66, 66, + 240, 240, 128, 14, 5, 243, 66, 65, 65, 19, 33, 65, + 65, 65, 66, 240, 128, 37, 13, 0, 7, 20, 114, 66, + 65, 113, 49, 68, 17, 17, 50, 33, 33, 17, 49, 33, + 49, 17, 33, 49, 33, 33, 33, 33, 49, 33, 35, 19, + 65, 209, 81, 117, 240, 48, 23, 10, 240, 240, 81, 130, + 130, 113, 18, 97, 33, 81, 50, 70, 65, 65, 49, 82, + 19, 66, 240, 240, 176, 23, 9, 240, 197, 81, 65, 49, + 65, 49, 65, 49, 49, 68, 81, 50, 49, 81, 33, 81, + 38, 240, 240, 128, 19, 9, 240, 228, 17, 33, 66, 17, + 129, 129, 129, 129, 129, 145, 81, 53, 240, 240, 128, 24, + 10, 240, 246, 81, 66, 49, 81, 49, 97, 33, 97, 33, + 97, 33, 97, 33, 81, 49, 81, 54, 240, 240, 208, 21, + 8, 240, 151, 17, 81, 17, 113, 49, 49, 49, 53, 49, + 49, 49, 113, 81, 23, 240, 240, 48, 20, 8, 240, 151, + 17, 81, 17, 113, 49, 49, 49, 53, 49, 49, 49, 113, + 113, 240, 240, 144, 23, 10, 240, 240, 36, 17, 49, 66, + 33, 145, 145, 145, 83, 17, 97, 33, 97, 49, 81, 70, + 240, 240, 192, 25, 8, 240, 145, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 23, 17, 81, 17, 81, 17, 81, 17, + 81, 240, 240, 48, 13, 2, 97, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 144, 18, 5, 240, 49, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 17, 17, 35, 112, 26, + 8, 240, 145, 66, 17, 65, 33, 49, 49, 33, 65, 18, + 66, 17, 65, 34, 49, 49, 49, 65, 33, 51, 240, 240, + 48, 17, 8, 240, 145, 113, 113, 113, 113, 113, 113, 113, + 113, 81, 23, 240, 240, 48, 40, 11, 240, 240, 66, 82, + 34, 82, 33, 17, 49, 17, 33, 17, 49, 17, 33, 18, + 33, 17, 33, 33, 17, 33, 33, 33, 17, 33, 33, 35, + 33, 33, 49, 49, 19, 33, 49, 240, 240, 240, 32, 10, + 240, 240, 18, 66, 34, 65, 49, 17, 49, 49, 18, 33, + 49, 33, 33, 49, 34, 17, 49, 49, 17, 49, 66, 49, + 66, 34, 81, 240, 240, 192, 26, 10, 240, 240, 37, 65, + 81, 33, 97, 33, 113, 17, 113, 17, 113, 17, 113, 17, + 97, 49, 81, 66, 18, 240, 240, 208, 20, 8, 240, 150, + 49, 65, 33, 65, 33, 65, 33, 49, 52, 65, 113, 113, + 113, 240, 240, 128, 29, 10, 240, 240, 37, 65, 81, 33, + 97, 33, 113, 17, 113, 17, 113, 17, 113, 17, 113, 33, + 81, 66, 18, 113, 115, 49, 33, 51, 192, 24, 10, 240, + 245, 97, 50, 65, 65, 65, 65, 65, 49, 84, 97, 33, + 97, 49, 81, 50, 65, 67, 240, 240, 176, 19, 9, 240, + 228, 65, 66, 33, 130, 131, 146, 145, 17, 97, 33, 81, + 38, 240, 240, 128, 18, 10, 240, 249, 17, 49, 49, 81, + 145, 145, 145, 145, 145, 145, 145, 240, 240, 240, 26, 9, + 240, 193, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, + 97, 17, 97, 17, 97, 17, 81, 50, 18, 240, 240, 144, + 24, 11, 240, 240, 51, 67, 34, 81, 65, 65, 81, 65, + 97, 49, 97, 33, 114, 17, 130, 146, 161, 0, 6, 16, + 37, 14, 240, 240, 194, 51, 50, 33, 65, 81, 33, 66, + 49, 50, 33, 17, 49, 65, 33, 17, 33, 81, 33, 18, + 17, 83, 49, 17, 98, 50, 113, 66, 113, 81, 0, 7, + 64, 24, 10, 240, 243, 51, 49, 49, 82, 17, 113, 17, + 114, 131, 97, 33, 97, 34, 65, 66, 35, 51, 240, 240, + 176, 22, 10, 240, 243, 66, 34, 65, 65, 65, 66, 33, + 97, 17, 113, 17, 129, 145, 145, 145, 240, 240, 240, 19, + 9, 240, 215, 33, 66, 17, 66, 113, 113, 114, 98, 113, + 113, 81, 24, 240, 240, 112, 16, 3, 146, 17, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 80, 15, 4, + 240, 17, 49, 49, 49, 65, 49, 49, 49, 65, 49, 49, + 144, 16, 3, 146, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 64, 12, 8, 240, 194, 81, 18, 49, + 65, 17, 0, 10, 112, 7, 8, 0, 14, 7, 240, 32, + 8, 3, 145, 49, 33, 240, 240, 64, 14, 7, 0, 6, + 35, 113, 82, 35, 17, 33, 49, 38, 240, 224, 21, 8, + 240, 146, 113, 113, 113, 113, 19, 50, 49, 33, 65, 33, + 65, 33, 65, 37, 240, 240, 64, 13, 6, 240, 240, 212, + 17, 49, 17, 81, 81, 100, 240, 160, 20, 8, 240, 210, + 113, 113, 113, 53, 33, 65, 33, 65, 33, 65, 33, 65, + 54, 240, 240, 48, 13, 7, 0, 6, 36, 33, 49, 38, + 17, 97, 116, 240, 240, 15, 5, 240, 19, 17, 65, 65, + 65, 65, 65, 65, 65, 65, 240, 144, 19, 8, 0, 7, + 22, 17, 65, 33, 65, 52, 49, 116, 81, 34, 33, 65, + 49, 33, 176, 21, 7, 240, 98, 97, 97, 97, 97, 18, + 50, 33, 33, 49, 33, 49, 33, 49, 33, 49, 240, 224, + 11, 3, 209, 33, 66, 33, 33, 33, 33, 33, 208, 15, + 4, 240, 49, 49, 98, 49, 49, 49, 49, 49, 49, 49, + 18, 96, 21, 8, 240, 146, 113, 113, 113, 113, 49, 49, + 33, 65, 17, 83, 81, 33, 65, 50, 240, 240, 48, 13, + 3, 146, 33, 33, 33, 33, 33, 33, 33, 33, 33, 208, + 25, 11, 0, 9, 82, 18, 35, 34, 34, 33, 33, 49, + 49, 33, 49, 49, 33, 49, 49, 33, 49, 49, 240, 240, + 240, 18, 7, 0, 6, 18, 18, 50, 33, 33, 49, 33, + 49, 33, 49, 33, 49, 240, 224, 16, 7, 0, 6, 36, + 33, 65, 17, 65, 17, 65, 17, 65, 36, 240, 240, 21, + 8, 0, 7, 2, 19, 50, 49, 33, 65, 33, 65, 33, + 65, 34, 18, 49, 17, 81, 113, 224, 18, 7, 0, 6, + 37, 17, 65, 17, 65, 17, 65, 17, 65, 37, 97, 97, + 97, 128, 13, 6, 240, 240, 194, 18, 34, 65, 81, 81, + 81, 240, 208, 14, 5, 240, 240, 83, 33, 33, 18, 82, + 65, 17, 17, 240, 112, 14, 4, 240, 17, 49, 49, 50, + 33, 49, 49, 49, 51, 240, 32, 18, 8, 0, 7, 2, + 34, 49, 49, 49, 49, 49, 49, 49, 49, 54, 240, 240, + 48, 17, 7, 0, 6, 17, 50, 17, 49, 49, 33, 49, + 17, 82, 81, 240, 240, 32, 23, 10, 0, 8, 97, 34, + 34, 17, 49, 33, 49, 18, 17, 65, 17, 18, 81, 34, + 81, 33, 240, 240, 224, 17, 8, 0, 7, 2, 50, 34, + 17, 82, 98, 81, 33, 50, 34, 240, 240, 64, 18, 8, + 0, 7, 17, 65, 34, 33, 65, 33, 65, 17, 97, 113, + 97, 113, 82, 224, 14, 6, 240, 240, 212, 17, 33, 65, + 81, 65, 65, 49, 240, 160, 16, 3, 161, 33, 33, 33, + 33, 33, 17, 49, 33, 33, 33, 33, 33, 64, 16, 2, + 97, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 48, 16, 3, 145, 33, 33, 33, 33, 33, 49, 17, + 33, 33, 33, 33, 33, 80, 10, 7, 0, 7, 34, 49, + 50, 0, 6, 32, 5, 6, 0, 12, 96, 13, 3, 240, + 98, 17, 33, 33, 33, 33, 34, 18, 18, 64, 20, 6, + 240, 209, 81, 65, 52, 17, 33, 33, 17, 49, 17, 50, + 84, 33, 65, 81, 81, 80, 23, 10, 240, 240, 68, 81, + 50, 65, 49, 81, 145, 119, 97, 98, 17, 81, 34, 49, + 19, 35, 240, 240, 192, 18, 7, 0, 6, 22, 17, 49, + 33, 65, 17, 65, 33, 33, 33, 18, 17, 240, 224, 20, + 8, 240, 146, 50, 33, 49, 50, 17, 81, 17, 69, 81, + 85, 81, 113, 113, 240, 240, 96, 13, 2, 97, 17, 17, + 17, 17, 113, 17, 17, 17, 17, 48, 24, 7, 240, 115, + 49, 49, 34, 33, 50, 83, 49, 49, 33, 65, 33, 49, + 51, 81, 49, 49, 33, 49, 51, 160, 8, 5, 240, 81, + 33, 0, 7, 80, 34, 12, 240, 240, 149, 82, 81, 65, + 34, 49, 33, 33, 34, 33, 17, 17, 113, 17, 17, 113, + 17, 17, 65, 33, 33, 20, 33, 50, 82, 82, 18, 0, + 6, 64, 11, 5, 240, 99, 50, 18, 17, 34, 0, 5, + 112, 14, 6, 0, 6, 113, 17, 33, 17, 65, 17, 65, + 17, 240, 160, 10, 8, 0, 8, 7, 113, 113, 0, 6, + 16, 8, 5, 0, 6, 36, 240, 240, 16, 34, 12, 240, + 240, 149, 82, 81, 69, 49, 33, 33, 33, 49, 17, 35, + 65, 17, 33, 17, 65, 17, 33, 33, 49, 36, 18, 17, + 50, 82, 82, 18, 0, 6, 64, 6, 5, 240, 164, 0, + 7, 13, 6, 240, 67, 33, 49, 17, 49, 17, 49, 35, + 0, 7, 14, 8, 0, 6, 49, 113, 113, 71, 65, 113, + 113, 71, 240, 160, 11, 5, 244, 17, 33, 49, 34, 52, + 0, 5, 96, 13, 5, 240, 19, 65, 34, 81, 17, 33, + 34, 240, 240, 192, 8, 3, 161, 17, 33, 240, 240, 80, + 23, 9, 0, 8, 17, 33, 81, 33, 65, 49, 65, 34, + 65, 34, 17, 17, 18, 33, 33, 129, 129, 240, 32, 29, + 7, 240, 117, 19, 17, 35, 17, 35, 17, 50, 17, 65, + 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, + 17, 65, 17, 144, 6, 3, 240, 194, 240, 112, 9, 4, + 0, 6, 81, 50, 17, 17, 80, 9, 2, 97, 17, 17, + 17, 17, 240, 64, 12, 5, 240, 98, 33, 33, 17, 33, + 34, 0, 5, 112, 16, 6, 0, 6, 17, 17, 65, 17, + 49, 17, 33, 17, 33, 17, 240, 192, 28, 9, 240, 193, + 65, 49, 49, 65, 49, 65, 33, 81, 33, 33, 65, 49, + 65, 19, 49, 33, 17, 33, 52, 17, 81, 240, 240, 128, + 28, 9, 240, 193, 65, 49, 49, 65, 49, 65, 33, 81, + 33, 18, 65, 17, 33, 49, 65, 33, 65, 33, 50, 49, + 52, 240, 240, 112, 31, 11, 240, 240, 67, 49, 97, 33, + 82, 49, 113, 17, 81, 33, 17, 33, 50, 17, 49, 81, + 35, 81, 33, 17, 65, 52, 49, 81, 0, 5, 96, 14, + 5, 240, 240, 114, 49, 65, 65, 65, 35, 33, 65, 83, + 96, 24, 10, 210, 161, 145, 130, 113, 17, 113, 18, 97, + 33, 81, 50, 70, 65, 65, 49, 82, 19, 66, 240, 240, + 176, 24, 10, 242, 113, 161, 130, 113, 17, 113, 18, 97, + 33, 81, 50, 70, 65, 65, 49, 82, 19, 66, 240, 240, + 176, 25, 10, 226, 97, 49, 129, 130, 113, 17, 113, 18, + 97, 33, 81, 50, 70, 65, 65, 49, 82, 19, 66, 240, + 240, 176, 24, 10, 197, 240, 49, 130, 113, 17, 113, 18, + 97, 33, 81, 50, 70, 65, 65, 49, 82, 19, 66, 240, + 240, 176, 25, 10, 209, 33, 240, 49, 130, 113, 17, 113, + 18, 97, 33, 81, 50, 70, 65, 65, 49, 82, 19, 66, + 240, 240, 176, 26, 10, 66, 113, 33, 114, 145, 130, 113, + 18, 97, 18, 97, 33, 81, 50, 70, 49, 66, 49, 82, + 19, 66, 240, 240, 176, 30, 15, 0, 6, 41, 114, 81, + 97, 17, 177, 33, 49, 113, 33, 49, 105, 81, 65, 49, + 81, 65, 129, 81, 81, 19, 65, 66, 0, 7, 80, 20, + 9, 240, 243, 66, 50, 17, 129, 129, 129, 129, 145, 129, + 81, 53, 97, 130, 97, 17, 192, 21, 8, 146, 215, 17, + 81, 17, 113, 49, 49, 49, 53, 49, 49, 49, 113, 81, + 23, 240, 240, 48, 21, 8, 162, 199, 17, 81, 17, 113, + 49, 49, 49, 53, 49, 49, 49, 113, 81, 23, 240, 240, + 48, 24, 8, 33, 97, 17, 129, 55, 17, 81, 17, 113, + 49, 49, 49, 53, 49, 49, 49, 113, 81, 23, 240, 240, + 48, 22, 8, 145, 33, 183, 17, 81, 17, 113, 49, 49, + 49, 53, 49, 49, 49, 113, 81, 23, 240, 240, 48, 14, + 3, 50, 81, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 208, 14, 3, 50, 65, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 224, 17, 4, 17, 33, 17, 97, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 240, 48, 16, 5, 81, 33, + 113, 65, 65, 65, 65, 65, 65, 65, 65, 65, 240, 128, + 25, 11, 240, 240, 70, 97, 66, 65, 81, 65, 97, 49, + 97, 21, 65, 49, 97, 49, 81, 65, 81, 70, 0, 5, + 112, 31, 10, 197, 226, 66, 34, 65, 49, 17, 49, 49, + 18, 33, 49, 33, 33, 49, 34, 17, 49, 49, 17, 49, + 66, 49, 66, 34, 81, 240, 240, 192, 26, 10, 210, 240, + 37, 65, 81, 33, 97, 33, 113, 17, 113, 17, 113, 17, + 113, 17, 97, 49, 81, 66, 18, 240, 240, 208, 26, 10, + 226, 240, 21, 65, 81, 33, 97, 33, 113, 17, 113, 17, + 113, 17, 113, 17, 97, 49, 81, 66, 18, 240, 240, 208, + 28, 10, 65, 129, 17, 240, 21, 65, 81, 33, 97, 33, + 113, 17, 113, 17, 113, 17, 113, 17, 97, 49, 81, 66, + 18, 240, 240, 208, 25, 10, 182, 245, 65, 81, 33, 97, + 33, 113, 17, 113, 17, 113, 17, 113, 17, 97, 49, 81, + 66, 18, 240, 240, 208, 26, 10, 194, 33, 245, 65, 81, + 33, 97, 33, 113, 17, 113, 17, 113, 17, 113, 17, 97, + 49, 81, 66, 18, 240, 240, 208, 15, 7, 0, 6, 17, + 65, 33, 33, 66, 82, 50, 33, 240, 240, 112, 32, 10, + 240, 240, 52, 17, 34, 65, 33, 83, 17, 66, 17, 17, + 50, 33, 17, 34, 49, 17, 18, 65, 19, 65, 50, 65, + 33, 18, 18, 240, 240, 208, 26, 9, 193, 225, 97, 17, + 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, + 97, 17, 81, 50, 18, 240, 240, 144, 26, 9, 209, 209, + 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, + 97, 17, 97, 17, 81, 50, 18, 240, 240, 144, 26, 9, + 179, 209, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, + 97, 17, 97, 17, 97, 17, 81, 50, 18, 240, 240, 144, + 27, 9, 177, 33, 193, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 17, 97, 17, 97, 17, 97, 17, 81, 50, 18, + 240, 240, 144, 22, 10, 241, 227, 66, 34, 65, 65, 65, + 66, 33, 97, 17, 113, 17, 129, 145, 145, 145, 240, 240, + 240, 20, 7, 240, 97, 97, 100, 49, 49, 33, 65, 17, + 65, 17, 49, 36, 49, 97, 240, 240, 64, 25, 7, 240, + 116, 33, 49, 33, 49, 33, 33, 49, 17, 65, 18, 49, + 34, 33, 50, 17, 65, 17, 17, 17, 240, 240, 16, 7, + 240, 113, 97, 113, 195, 113, 82, 35, 17, 33, 49, 38, + 240, 224, 16, 7, 240, 146, 81, 81, 195, 113, 82, 35, + 17, 33, 49, 38, 240, 224, 16, 7, 240, 129, 98, 65, + 211, 113, 82, 35, 17, 33, 49, 38, 240, 224, 16, 7, + 240, 226, 65, 34, 163, 113, 82, 35, 17, 33, 49, 38, + 240, 224, 16, 7, 240, 210, 17, 240, 51, 113, 82, 35, + 17, 33, 49, 38, 240, 224, 17, 7, 240, 116, 49, 33, + 66, 179, 113, 82, 35, 17, 33, 49, 38, 240, 224, 18, + 10, 0, 8, 115, 19, 33, 49, 49, 85, 36, 81, 49, + 84, 19, 240, 240, 192, 15, 6, 240, 240, 212, 17, 49, + 17, 81, 81, 100, 49, 97, 81, 128, 15, 7, 240, 113, + 113, 97, 196, 33, 49, 38, 17, 97, 116, 240, 240, 15, + 7, 240, 161, 81, 97, 180, 33, 49, 38, 17, 97, 116, + 240, 240, 14, 7, 240, 242, 65, 212, 33, 49, 38, 17, + 97, 116, 240, 240, 15, 7, 240, 210, 18, 240, 36, 33, + 49, 38, 17, 97, 116, 240, 240, 12, 3, 145, 33, 49, + 66, 33, 33, 33, 33, 33, 208, 13, 4, 225, 49, 33, + 98, 49, 49, 49, 49, 49, 240, 48, 14, 4, 209, 34, + 33, 17, 82, 49, 49, 49, 49, 49, 240, 48, 13, 5, + 240, 81, 33, 194, 65, 65, 65, 65, 65, 240, 112, 19, + 7, 240, 113, 114, 97, 113, 53, 17, 65, 17, 65, 17, + 65, 17, 49, 52, 240, 240, 19, 7, 240, 240, 101, 130, + 18, 50, 33, 33, 49, 33, 49, 33, 49, 33, 49, 240, + 224, 18, 7, 240, 113, 113, 97, 196, 33, 65, 17, 65, + 17, 65, 17, 65, 36, 240, 240, 18, 7, 240, 161, 81, + 97, 180, 33, 65, 17, 65, 17, 65, 17, 65, 36, 240, + 240, 18, 7, 240, 242, 65, 33, 164, 33, 65, 17, 65, + 17, 65, 17, 65, 36, 240, 240, 18, 7, 240, 226, 65, + 34, 164, 33, 65, 17, 65, 17, 65, 17, 65, 36, 240, + 240, 18, 7, 240, 225, 18, 240, 36, 33, 65, 17, 65, + 17, 65, 17, 65, 36, 240, 240, 12, 9, 0, 8, 34, + 114, 72, 210, 113, 240, 240, 176, 18, 7, 0, 6, 37, + 17, 50, 17, 33, 17, 17, 17, 33, 18, 49, 21, 240, + 240, 20, 8, 240, 177, 113, 240, 98, 34, 49, 49, 49, + 49, 49, 49, 49, 49, 54, 240, 240, 48, 20, 8, 240, + 209, 113, 97, 194, 34, 49, 49, 49, 49, 49, 49, 49, + 49, 54, 240, 240, 48, 21, 8, 240, 193, 98, 81, 33, + 178, 34, 49, 49, 49, 49, 49, 49, 49, 49, 54, 240, + 240, 48, 21, 8, 240, 240, 50, 18, 240, 50, 34, 49, + 49, 49, 49, 49, 49, 49, 49, 54, 240, 240, 48, 20, + 8, 240, 210, 97, 97, 209, 65, 34, 33, 65, 33, 65, + 17, 97, 113, 97, 113, 82, 224, 24, 8, 240, 146, 113, + 113, 113, 113, 19, 50, 49, 33, 65, 33, 65, 33, 65, + 34, 18, 49, 17, 81, 113, 224, 21, 8, 240, 240, 65, + 33, 240, 65, 65, 34, 33, 65, 33, 65, 17, 97, 113, + 97, 113, 82, 224, +}; + +//***************************************************************************** +// +// The glyph offset table for the 14 point Theanooldstyle font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanooldstyle14[] = +{ + 0, 5, 17, 29, 53, 79, 111, 139, + 146, 162, 178, 194, 208, 216, 224, 231, + 246, 271, 286, 304, 324, 344, 361, 381, + 398, 421, 441, 449, 458, 472, 481, 495, + 509, 546, 569, 592, 611, 635, 656, 676, + 699, 724, 737, 755, 781, 798, 838, 870, + 896, 916, 945, 969, 988, 1006, 1032, 1056, + 1093, 1117, 1139, 1158, 1174, 1189, 1205, 1217, + 1224, 1232, 1246, 1267, 1280, 1300, 1313, 1328, + 1347, 1368, 1379, 1394, 1415, 1428, 1453, 1471, + 1487, 1508, 1526, 1539, 1553, 1567, 1585, 1602, + 1625, 1642, 1660, 1674, 1690, 1706, 1722, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1732, 1737, 1750, 1770, 1793, 1811, 1831, 1844, + 1868, 1876, 1910, 1921, 1935, 1945, 1953, 1987, + 1993, 2006, 2020, 2031, 2044, 2052, 2075, 2104, + 2110, 2119, 2128, 2140, 2156, 2184, 2212, 2243, + 2257, 2281, 2305, 2330, 2354, 2379, 2405, 2435, + 2455, 2476, 2497, 2521, 2543, 2557, 2571, 2588, + 2604, 2629, 2660, 2686, 2712, 2740, 2765, 2791, + 2806, 2838, 2864, 2890, 2916, 2943, 2965, 2985, + 3010, 3026, 3042, 3058, 3074, 3090, 3107, 3125, + 3140, 3155, 3170, 3184, 3199, 3211, 3224, 3238, + 3251, 3270, 3289, 3307, 3325, 3343, 3361, 3379, + 3391, 3409, 3429, 3449, 3470, 3491, 3511, 3535, +}; + +//***************************************************************************** +// +// The font definition for the 14 point Theanooldstyle font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanooldstyle14 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 13, + + // + // The height of the font. + // + 17, + + // + // The baseline of the font. + // + 13, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanooldstyle14, + + // + // A pointer to the actual font data + // + g_pui8Theanooldstyle14Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanooldstyle16.c b/third_party/fonts/ofl/fonts/fonttheanooldstyle16.c new file mode 100644 index 0000000..9b78d9f --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanooldstyle16.c @@ -0,0 +1,557 @@ +//***************************************************************************** +// +// fonttheanooldstyle16.c - Font definition for the 16pt Theanooldstyle font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanooldstyle +// Size: 16 point +// Bold: no +// Italic: no +// Memory usage: 4248 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 16 point Theanooldstyle font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanooldstyle16Data[4047] = +{ + 4, 6, 0, 15, 14, 3, 194, 18, 18, 33, 33, 33, + 33, 33, 66, 18, 240, 16, 15, 5, 240, 81, 33, 17, + 33, 17, 33, 17, 33, 17, 33, 0, 7, 25, 10, 0, + 5, 113, 81, 33, 97, 33, 57, 49, 49, 81, 33, 97, + 33, 73, 49, 33, 81, 49, 81, 0, 7, 32, 31, 8, + 240, 65, 113, 85, 33, 33, 33, 17, 33, 33, 17, 33, + 83, 99, 97, 18, 65, 33, 18, 17, 33, 17, 33, 33, + 37, 81, 240, 240, 96, 36, 12, 0, 6, 18, 81, 49, + 33, 49, 65, 33, 49, 65, 33, 33, 98, 33, 177, 33, + 113, 18, 18, 65, 33, 49, 65, 33, 49, 49, 49, 49, + 129, 17, 0, 7, 96, 30, 12, 0, 6, 67, 129, 33, + 129, 33, 131, 146, 36, 34, 17, 65, 33, 50, 33, 49, + 65, 33, 49, 67, 66, 66, 85, 20, 0, 7, 80, 9, + 2, 129, 17, 17, 17, 17, 240, 128, 19, 4, 240, 49, + 33, 49, 49, 33, 49, 49, 49, 49, 49, 49, 65, 49, + 49, 65, 80, 18, 5, 240, 177, 81, 65, 81, 65, 65, + 65, 65, 65, 65, 49, 65, 49, 49, 144, 20, 8, 240, + 240, 81, 65, 33, 33, 33, 17, 17, 67, 50, 17, 18, + 65, 113, 0, 9, 64, 15, 10, 0, 9, 33, 145, 145, + 145, 89, 81, 145, 145, 0, 6, 112, 9, 4, 0, 7, + 18, 49, 49, 18, 160, 8, 6, 0, 8, 37, 0, 6, + 16, 8, 3, 240, 240, 146, 18, 240, 16, 19, 5, 240, + 129, 65, 49, 65, 65, 65, 49, 65, 65, 65, 65, 49, + 65, 65, 65, 144, 26, 9, 240, 240, 132, 65, 65, 33, + 81, 33, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, + 81, 49, 65, 68, 0, 6, 17, 4, 240, 49, 34, 17, + 17, 49, 49, 49, 49, 49, 49, 49, 49, 240, 96, 22, + 8, 240, 240, 68, 49, 65, 33, 65, 33, 65, 97, 97, + 97, 97, 97, 113, 65, 23, 240, 240, 176, 21, 7, 240, + 228, 33, 65, 18, 49, 81, 51, 113, 113, 97, 17, 65, + 17, 49, 51, 240, 240, 128, 21, 9, 240, 240, 177, 129, + 99, 97, 17, 81, 33, 65, 49, 65, 49, 56, 97, 129, + 129, 0, 6, 21, 8, 240, 225, 53, 49, 113, 116, 65, + 34, 114, 113, 113, 17, 81, 18, 49, 52, 240, 240, 208, + 24, 8, 240, 240, 97, 82, 81, 113, 97, 19, 50, 49, + 33, 81, 17, 81, 17, 81, 33, 49, 67, 240, 240, 208, + 20, 9, 240, 240, 119, 33, 65, 33, 81, 129, 113, 129, + 129, 113, 129, 114, 114, 0, 6, 16, 26, 8, 240, 240, + 53, 33, 81, 17, 81, 18, 65, 34, 33, 67, 65, 35, + 17, 81, 17, 81, 17, 81, 37, 240, 240, 192, 24, 8, + 240, 240, 67, 65, 49, 33, 81, 17, 81, 17, 81, 33, + 50, 51, 17, 97, 98, 81, 82, 240, 240, 240, 9, 3, + 240, 146, 18, 162, 18, 240, 16, 10, 3, 240, 146, 18, + 210, 33, 33, 17, 128, 15, 9, 0, 8, 82, 82, 82, + 82, 114, 146, 146, 146, 0, 5, 96, 9, 10, 0, 12, + 73, 185, 0, 8, 112, 15, 9, 0, 7, 114, 146, 146, + 146, 114, 82, 82, 82, 0, 6, 64, 17, 6, 240, 147, + 49, 33, 97, 81, 36, 33, 81, 81, 162, 66, 240, 240, + 64, 43, 14, 0, 9, 67, 131, 50, 81, 129, 49, 66, + 17, 33, 33, 49, 34, 33, 17, 49, 49, 49, 17, 49, + 49, 49, 17, 33, 49, 49, 33, 33, 34, 33, 49, 35, + 19, 81, 225, 97, 118, 240, 240, 48, 26, 12, 0, 6, + 81, 163, 145, 17, 129, 34, 113, 34, 97, 65, 103, 81, + 66, 65, 97, 65, 98, 35, 83, 0, 7, 80, 26, 10, + 240, 240, 167, 81, 66, 49, 81, 49, 81, 49, 65, 69, + 81, 65, 65, 81, 49, 81, 49, 81, 39, 0, 6, 64, + 22, 11, 0, 5, 119, 50, 66, 34, 97, 18, 146, 146, + 146, 146, 162, 97, 50, 65, 85, 0, 7, 32, 27, 13, + 0, 6, 72, 113, 82, 81, 98, 65, 114, 49, 114, 49, + 114, 49, 114, 49, 114, 49, 98, 65, 97, 72, 0, 8, + 80, 23, 11, 240, 240, 233, 49, 97, 49, 161, 65, 81, + 65, 86, 81, 65, 81, 161, 113, 33, 113, 26, 0, 7, + 22, 10, 240, 240, 169, 33, 97, 33, 145, 65, 65, 65, + 70, 65, 65, 65, 145, 145, 131, 0, 7, 16, 24, 12, + 0, 6, 54, 81, 81, 66, 146, 162, 162, 84, 18, 97, + 50, 97, 66, 81, 81, 81, 102, 0, 7, 112, 27, 11, + 240, 240, 227, 67, 33, 97, 49, 97, 49, 97, 49, 97, + 56, 49, 97, 49, 97, 49, 97, 49, 97, 35, 67, 0, + 7, 16, 4, 240, 19, 33, 49, 49, 49, 49, 49, 49, + 49, 49, 35, 240, 96, 20, 6, 240, 179, 65, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 33, 17, 50, + 160, 28, 11, 240, 240, 227, 52, 33, 81, 65, 65, 81, + 34, 97, 18, 114, 17, 113, 34, 97, 50, 81, 65, 81, + 66, 51, 52, 0, 7, 20, 10, 240, 240, 163, 129, 145, + 145, 145, 145, 145, 145, 145, 97, 33, 97, 24, 0, 6, + 64, 41, 13, 0, 6, 67, 99, 35, 82, 51, 65, 17, + 49, 17, 65, 17, 49, 18, 49, 17, 49, 33, 33, 33, + 49, 34, 17, 33, 49, 35, 49, 49, 50, 49, 49, 50, + 49, 35, 99, 0, 8, 32, 35, 11, 240, 240, 227, 67, + 35, 65, 49, 17, 65, 49, 18, 49, 49, 33, 49, 49, + 49, 33, 49, 50, 17, 49, 65, 17, 49, 82, 49, 82, + 35, 81, 0, 7, 16, 26, 12, 0, 6, 53, 97, 81, + 65, 113, 34, 114, 18, 114, 18, 114, 18, 114, 18, 114, + 33, 113, 65, 81, 101, 0, 8, 21, 10, 240, 240, 167, + 81, 66, 49, 81, 49, 81, 49, 65, 69, 81, 145, 145, + 145, 131, 0, 7, 31, 12, 0, 6, 53, 97, 81, 65, + 113, 34, 114, 18, 114, 18, 114, 18, 114, 18, 114, 33, + 113, 65, 82, 85, 145, 147, 49, 65, 37, 240, 176, 27, + 12, 0, 6, 7, 113, 66, 81, 81, 81, 81, 81, 65, + 101, 113, 34, 113, 50, 97, 65, 97, 66, 67, 67, 0, + 7, 80, 23, 10, 240, 240, 213, 50, 66, 33, 97, 33, + 162, 163, 162, 145, 18, 97, 34, 81, 33, 21, 0, 6, + 64, 22, 12, 0, 6, 25, 33, 65, 65, 17, 65, 65, + 97, 177, 177, 177, 177, 177, 177, 163, 0, 8, 16, 27, + 12, 0, 6, 3, 83, 33, 113, 49, 113, 49, 113, 49, + 113, 49, 113, 49, 113, 49, 113, 49, 113, 65, 81, 101, + 0, 8, 26, 12, 0, 6, 3, 83, 34, 97, 65, 81, + 82, 65, 97, 65, 98, 33, 114, 33, 129, 17, 147, 162, + 161, 0, 8, 32, 40, 18, 0, 9, 3, 52, 52, 34, + 66, 81, 81, 81, 81, 81, 67, 49, 98, 49, 17, 49, + 113, 33, 33, 49, 113, 33, 34, 17, 130, 17, 49, 17, + 146, 66, 162, 66, 161, 97, 0, 12, 27, 12, 0, 6, + 20, 36, 50, 65, 98, 33, 129, 17, 147, 162, 145, 17, + 129, 34, 113, 50, 81, 81, 52, 52, 0, 7, 80, 24, + 11, 240, 240, 227, 67, 33, 97, 50, 65, 81, 65, 97, + 33, 113, 17, 146, 145, 161, 161, 147, 0, 7, 64, 21, + 11, 240, 240, 249, 33, 82, 145, 146, 130, 130, 130, 130, + 146, 81, 34, 97, 25, 0, 7, 16, 18, 3, 194, 17, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 80, 19, 5, 240, 81, 65, 65, 65, 81, 65, 65, + 65, 65, 81, 65, 65, 65, 81, 65, 96, 18, 3, 194, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 64, 14, 8, 240, 240, 81, 97, 17, 65, 49, + 33, 81, 0, 12, 16, 7, 9, 0, 19, 24, 240, 64, + 8, 3, 193, 34, 33, 240, 240, 160, 17, 7, 0, 7, + 19, 50, 33, 97, 82, 35, 17, 33, 49, 38, 240, 240, + 96, 24, 8, 240, 240, 34, 113, 113, 113, 113, 19, 50, + 34, 33, 65, 33, 65, 33, 65, 33, 49, 53, 240, 240, + 192, 16, 7, 0, 7, 35, 49, 34, 17, 97, 97, 98, + 49, 51, 240, 240, 112, 23, 8, 240, 240, 98, 113, 113, + 113, 53, 33, 65, 33, 65, 33, 65, 33, 65, 34, 49, + 54, 240, 240, 176, 16, 7, 0, 7, 35, 34, 49, 22, + 17, 97, 98, 49, 51, 240, 240, 112, 16, 5, 240, 99, + 17, 65, 65, 66, 49, 65, 65, 65, 65, 65, 240, 224, + 23, 9, 0, 9, 20, 18, 17, 66, 33, 81, 33, 81, + 53, 49, 130, 148, 50, 65, 33, 81, 50, 18, 192, 25, + 8, 240, 240, 34, 113, 113, 113, 113, 19, 50, 49, 33, + 65, 33, 65, 33, 65, 33, 65, 33, 65, 240, 240, 176, + 13, 3, 194, 18, 113, 33, 33, 33, 33, 33, 33, 240, + 32, 17, 5, 240, 114, 50, 209, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 34, 128, 24, 9, 240, 240, 98, 129, + 129, 129, 129, 50, 49, 49, 65, 18, 83, 97, 33, 81, + 49, 65, 51, 0, 5, 96, 15, 3, 194, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 240, 16, 28, 13, 0, + 13, 2, 19, 35, 50, 50, 49, 33, 65, 65, 33, 65, + 65, 33, 65, 65, 33, 65, 65, 33, 65, 65, 0, 8, + 32, 21, 8, 0, 8, 2, 19, 50, 49, 33, 65, 33, + 65, 33, 65, 33, 65, 33, 65, 240, 240, 176, 20, 8, + 0, 8, 35, 65, 49, 33, 81, 17, 81, 17, 81, 33, + 49, 65, 17, 240, 240, 208, 22, 8, 0, 8, 2, 19, + 50, 49, 33, 65, 33, 65, 33, 65, 33, 49, 53, 49, + 113, 113, 113, 224, 21, 7, 0, 7, 21, 17, 65, 17, + 65, 17, 65, 17, 65, 18, 49, 37, 97, 97, 97, 97, + 128, 15, 6, 0, 6, 2, 18, 34, 65, 81, 81, 81, + 81, 240, 240, 64, 16, 6, 0, 6, 19, 33, 49, 18, + 83, 97, 81, 18, 17, 240, 240, 32, 18, 6, 240, 240, + 17, 81, 66, 82, 65, 81, 81, 81, 81, 33, 35, 240, + 240, 32, 20, 8, 0, 8, 2, 34, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 69, 240, 240, 176, 18, 8, + 0, 8, 2, 65, 33, 65, 49, 33, 65, 33, 67, 98, + 97, 240, 240, 224, 25, 12, 0, 12, 3, 19, 34, 49, + 49, 33, 65, 34, 33, 65, 17, 17, 17, 98, 34, 98, + 34, 97, 49, 0, 8, 19, 9, 0, 9, 3, 35, 34, + 33, 83, 114, 97, 17, 81, 49, 50, 51, 0, 5, 96, + 22, 9, 0, 9, 3, 50, 34, 49, 65, 49, 66, 17, + 97, 17, 98, 129, 113, 129, 113, 98, 240, 16, 17, 7, + 0, 7, 21, 17, 49, 81, 82, 81, 81, 49, 18, 34, + 240, 240, 96, 19, 4, 240, 49, 33, 49, 50, 49, 49, + 49, 18, 50, 49, 49, 34, 33, 49, 65, 80, 18, 2, + 129, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 48, 19, 4, 240, 17, 65, 49, 34, 33, + 49, 49, 66, 18, 33, 49, 50, 49, 49, 33, 112, 11, + 8, 0, 10, 19, 33, 17, 35, 0, 8, 32, 4, 6, + 0, 15, 14, 3, 240, 146, 18, 81, 33, 33, 33, 33, + 18, 18, 18, 64, 25, 7, 240, 240, 49, 97, 81, 97, + 67, 49, 19, 17, 33, 49, 17, 65, 17, 66, 49, 36, + 49, 81, 97, 97, 208, 24, 12, 0, 6, 84, 113, 50, + 97, 65, 97, 177, 136, 129, 177, 115, 17, 97, 51, 34, + 20, 36, 0, 7, 96, 21, 7, 0, 7, 1, 18, 17, + 18, 33, 33, 65, 17, 65, 33, 33, 33, 18, 17, 240, + 240, 208, 22, 8, 240, 240, 34, 50, 33, 49, 49, 49, + 65, 17, 55, 65, 113, 71, 65, 113, 113, 240, 240, 224, + 15, 2, 129, 17, 17, 17, 17, 17, 113, 17, 17, 17, + 17, 17, 48, 27, 7, 240, 243, 49, 49, 33, 49, 34, + 98, 65, 18, 33, 50, 17, 65, 33, 49, 51, 82, 98, + 34, 33, 33, 49, 51, 144, 8, 5, 240, 161, 33, 0, + 8, 112, 36, 13, 0, 6, 118, 97, 34, 33, 65, 33, + 34, 17, 33, 33, 113, 17, 33, 113, 17, 33, 113, 17, + 33, 113, 17, 49, 97, 33, 51, 33, 65, 97, 102, 0, + 8, 80, 13, 5, 240, 99, 17, 33, 50, 18, 17, 34, + 0, 7, 16, 17, 6, 0, 6, 113, 65, 33, 33, 17, + 49, 17, 65, 17, 97, 240, 240, 16, 10, 9, 0, 10, + 24, 129, 129, 129, 0, 8, 8, 6, 0, 8, 37, 0, + 6, 16, 40, 13, 0, 6, 118, 101, 33, 65, 33, 33, + 33, 33, 49, 33, 49, 17, 49, 33, 49, 17, 51, 65, + 17, 49, 17, 65, 17, 49, 33, 49, 33, 19, 18, 17, + 65, 97, 102, 0, 8, 80, 7, 6, 240, 245, 0, 10, + 80, 16, 7, 240, 228, 33, 65, 17, 65, 17, 65, 18, + 34, 50, 0, 9, 16, 16, 10, 0, 8, 1, 145, 145, + 145, 89, 81, 145, 145, 249, 240, 240, 176, 13, 5, 240, + 84, 17, 33, 49, 49, 49, 68, 0, 6, 48, 13, 5, + 240, 84, 65, 34, 66, 17, 33, 34, 0, 6, 64, 10, + 4, 240, 49, 34, 33, 33, 0, 6, 48, 24, 10, 0, + 11, 65, 49, 81, 49, 65, 50, 65, 50, 65, 35, 17, + 17, 19, 33, 33, 145, 145, 145, 240, 64, 33, 7, 240, + 229, 19, 17, 35, 17, 35, 17, 35, 17, 50, 17, 65, + 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, + 17, 65, 17, 65, 17, 144, 7, 3, 240, 194, 18, 240, + 208, 9, 4, 0, 8, 17, 65, 17, 17, 80, 13, 4, + 240, 49, 17, 17, 49, 49, 49, 49, 240, 240, 176, 14, + 5, 240, 98, 33, 33, 17, 33, 17, 33, 34, 0, 7, + 16, 18, 6, 0, 6, 97, 17, 65, 17, 49, 33, 33, + 17, 33, 17, 81, 240, 240, 48, 32, 12, 0, 6, 33, + 81, 49, 17, 65, 97, 65, 97, 49, 113, 33, 129, 33, + 49, 97, 50, 97, 33, 17, 81, 37, 49, 97, 65, 97, + 0, 7, 96, 33, 10, 240, 240, 161, 81, 49, 65, 65, + 65, 65, 49, 81, 49, 18, 33, 33, 17, 33, 49, 33, + 33, 49, 65, 49, 65, 65, 49, 65, 68, 0, 6, 48, + 33, 12, 0, 6, 4, 65, 97, 49, 82, 65, 98, 33, + 81, 33, 17, 49, 50, 33, 49, 97, 35, 81, 49, 17, + 81, 37, 49, 97, 65, 97, 0, 7, 96, 15, 6, 0, + 6, 34, 66, 177, 81, 81, 36, 33, 81, 82, 99, 112, + 27, 12, 242, 193, 240, 129, 163, 129, 33, 129, 33, 129, + 34, 97, 65, 102, 97, 66, 65, 97, 65, 98, 35, 68, + 0, 7, 80, 28, 12, 113, 162, 145, 240, 130, 147, 145, + 17, 129, 34, 113, 34, 113, 49, 103, 81, 81, 65, 97, + 65, 98, 35, 83, 0, 7, 80, 29, 12, 81, 163, 129, + 49, 240, 97, 163, 145, 17, 129, 34, 113, 34, 97, 65, + 103, 81, 66, 65, 97, 65, 98, 35, 83, 0, 7, 80, + 29, 12, 242, 49, 81, 50, 240, 97, 163, 145, 17, 129, + 34, 113, 34, 97, 65, 103, 81, 66, 65, 97, 65, 98, + 35, 83, 0, 7, 80, 28, 12, 241, 49, 240, 240, 49, + 163, 145, 17, 129, 34, 113, 34, 97, 65, 103, 81, 66, + 65, 97, 65, 98, 35, 83, 0, 7, 80, 29, 12, 82, + 145, 33, 146, 240, 114, 162, 145, 18, 129, 18, 113, 49, + 113, 50, 102, 81, 66, 81, 82, 65, 82, 36, 67, 0, + 7, 80, 31, 19, 0, 10, 58, 162, 97, 145, 17, 241, + 33, 65, 145, 49, 65, 154, 129, 65, 65, 129, 65, 193, + 81, 113, 50, 81, 113, 21, 43, 0, 12, 25, 11, 0, + 5, 118, 66, 66, 34, 97, 18, 146, 146, 146, 146, 162, + 97, 50, 65, 85, 129, 161, 177, 129, 17, 240, 24, 11, + 210, 177, 240, 41, 49, 97, 49, 161, 65, 81, 65, 86, + 81, 65, 81, 161, 113, 33, 113, 26, 0, 7, 25, 11, + 243, 113, 240, 57, 49, 97, 49, 161, 65, 81, 65, 86, + 81, 65, 81, 161, 113, 33, 98, 25, 0, 7, 16, 24, + 11, 227, 98, 49, 249, 49, 97, 49, 161, 65, 81, 65, + 86, 81, 65, 81, 161, 113, 33, 113, 26, 0, 7, 24, + 11, 193, 49, 240, 201, 49, 97, 49, 161, 65, 81, 65, + 86, 81, 65, 81, 161, 113, 33, 113, 26, 0, 7, 17, + 4, 65, 65, 99, 33, 49, 49, 49, 49, 49, 49, 49, + 49, 35, 240, 96, 17, 5, 114, 33, 131, 49, 65, 65, + 65, 65, 65, 65, 65, 65, 51, 240, 192, 20, 6, 33, + 67, 33, 49, 131, 65, 81, 81, 81, 81, 81, 81, 81, + 81, 67, 240, 240, 32, 18, 6, 97, 49, 227, 65, 81, + 81, 81, 81, 81, 81, 81, 81, 67, 240, 240, 32, 27, + 13, 0, 6, 72, 113, 82, 81, 98, 65, 114, 49, 114, + 22, 66, 49, 114, 49, 114, 49, 98, 65, 97, 72, 0, + 8, 80, 35, 11, 214, 240, 163, 67, 35, 65, 49, 17, + 65, 49, 18, 49, 49, 33, 49, 49, 49, 33, 49, 50, + 17, 49, 65, 17, 49, 82, 49, 82, 35, 81, 0, 7, + 16, 28, 12, 50, 177, 193, 240, 101, 97, 81, 65, 113, + 34, 114, 18, 114, 18, 114, 18, 114, 18, 114, 33, 113, + 65, 81, 101, 0, 8, 28, 12, 98, 161, 161, 240, 101, + 97, 81, 65, 113, 34, 114, 18, 114, 18, 114, 18, 114, + 18, 114, 33, 113, 65, 81, 101, 0, 8, 30, 12, 81, + 161, 17, 129, 49, 240, 69, 97, 81, 65, 113, 34, 114, + 18, 114, 18, 114, 18, 114, 18, 114, 33, 113, 65, 81, + 101, 0, 8, 27, 12, 230, 240, 240, 21, 97, 81, 65, + 113, 34, 114, 18, 114, 18, 114, 18, 114, 18, 114, 33, + 113, 65, 81, 101, 0, 8, 28, 12, 241, 49, 240, 240, + 21, 97, 81, 65, 113, 34, 114, 18, 114, 18, 114, 18, + 114, 18, 114, 33, 113, 65, 81, 101, 0, 8, 18, 8, + 0, 8, 1, 81, 33, 49, 65, 17, 97, 97, 17, 50, + 50, 0, 6, 16, 33, 12, 0, 6, 53, 33, 49, 82, + 49, 98, 34, 81, 18, 18, 65, 34, 18, 49, 50, 18, + 33, 66, 18, 17, 82, 34, 97, 50, 81, 49, 37, 0, + 8, 29, 12, 49, 193, 193, 240, 51, 83, 33, 113, 49, + 113, 49, 113, 49, 113, 49, 113, 49, 113, 49, 113, 49, + 113, 65, 81, 101, 0, 8, 29, 12, 98, 146, 145, 240, + 67, 83, 33, 113, 49, 113, 49, 113, 49, 113, 49, 113, + 49, 113, 49, 113, 49, 113, 65, 81, 101, 0, 8, 31, + 12, 81, 161, 17, 114, 49, 240, 19, 83, 33, 113, 49, + 113, 49, 113, 49, 113, 49, 113, 49, 113, 49, 113, 49, + 113, 65, 81, 101, 0, 8, 28, 12, 226, 34, 240, 211, + 83, 33, 113, 49, 113, 49, 113, 49, 113, 49, 113, 49, + 113, 49, 113, 49, 113, 65, 81, 101, 0, 8, 26, 11, + 240, 18, 129, 240, 35, 67, 33, 97, 50, 65, 81, 65, + 97, 33, 113, 17, 146, 145, 161, 161, 147, 0, 7, 64, + 22, 9, 240, 240, 99, 113, 133, 65, 65, 49, 81, 33, + 81, 33, 65, 53, 65, 129, 115, 0, 6, 48, 27, 7, + 240, 227, 49, 49, 33, 49, 33, 33, 49, 17, 65, 17, + 65, 18, 49, 49, 33, 65, 17, 65, 17, 19, 240, 240, + 112, 19, 7, 240, 225, 97, 113, 195, 50, 33, 97, 82, + 35, 17, 33, 49, 38, 240, 240, 96, 20, 7, 240, 240, + 18, 81, 81, 195, 50, 33, 97, 82, 35, 17, 33, 49, + 38, 240, 240, 96, 19, 7, 240, 241, 98, 65, 211, 50, + 33, 97, 82, 35, 17, 33, 49, 38, 240, 240, 96, 20, + 7, 240, 240, 98, 65, 34, 163, 50, 33, 97, 82, 35, + 17, 33, 49, 38, 240, 240, 96, 20, 7, 240, 240, 97, + 33, 240, 35, 50, 33, 97, 82, 35, 17, 33, 49, 38, + 240, 240, 96, 20, 7, 240, 228, 49, 33, 66, 179, 50, + 33, 97, 82, 35, 17, 33, 49, 38, 240, 240, 96, 20, + 12, 0, 12, 19, 35, 49, 50, 49, 103, 36, 113, 49, + 113, 50, 100, 35, 0, 7, 112, 19, 7, 0, 7, 35, + 49, 34, 17, 97, 97, 98, 49, 51, 81, 97, 113, 65, + 17, 144, 18, 7, 240, 225, 98, 97, 211, 34, 49, 22, + 17, 97, 98, 49, 51, 240, 240, 112, 19, 7, 240, 240, + 33, 97, 81, 195, 34, 49, 22, 17, 97, 98, 49, 51, + 240, 240, 112, 19, 7, 240, 240, 114, 65, 33, 179, 34, + 49, 22, 17, 97, 98, 49, 51, 240, 240, 112, 18, 7, + 240, 240, 97, 33, 240, 51, 34, 33, 38, 17, 97, 98, + 99, 240, 240, 128, 15, 4, 240, 18, 49, 65, 98, 49, + 49, 49, 49, 49, 49, 240, 96, 15, 4, 240, 49, 49, + 33, 98, 49, 49, 49, 49, 49, 49, 240, 112, 16, 5, + 240, 113, 50, 33, 33, 114, 65, 65, 65, 65, 65, 65, + 240, 192, 14, 5, 240, 161, 33, 194, 65, 65, 65, 65, + 65, 65, 240, 192, 26, 8, 240, 240, 65, 33, 82, 66, + 17, 129, 69, 33, 50, 17, 81, 17, 81, 17, 81, 33, + 49, 65, 17, 240, 240, 208, 25, 8, 240, 240, 194, 33, + 33, 34, 162, 19, 50, 49, 33, 65, 33, 65, 33, 65, + 33, 65, 33, 65, 240, 240, 176, 23, 8, 240, 240, 50, + 113, 129, 227, 65, 49, 33, 81, 17, 81, 17, 81, 33, + 49, 65, 17, 240, 240, 208, 23, 8, 240, 240, 98, 97, + 97, 227, 65, 49, 33, 81, 17, 81, 17, 81, 33, 49, + 65, 17, 240, 240, 208, 25, 8, 240, 240, 81, 97, 17, + 65, 240, 19, 65, 49, 33, 81, 17, 81, 17, 81, 33, + 49, 65, 17, 240, 240, 208, 23, 8, 240, 240, 179, 65, + 35, 195, 65, 49, 33, 81, 17, 81, 17, 81, 33, 49, + 65, 17, 240, 240, 208, 23, 8, 240, 240, 177, 49, 240, + 83, 65, 49, 33, 81, 17, 81, 17, 81, 33, 49, 65, + 17, 240, 240, 208, 12, 9, 0, 9, 50, 114, 216, 210, + 114, 0, 6, 16, 23, 8, 0, 8, 37, 33, 50, 17, + 49, 17, 17, 33, 33, 17, 17, 49, 18, 49, 35, 17, + 240, 240, 208, 23, 8, 240, 240, 50, 113, 240, 98, 34, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 69, 240, + 240, 176, 23, 8, 240, 240, 97, 113, 97, 194, 34, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 69, 240, 240, + 176, 24, 8, 240, 240, 81, 98, 81, 33, 178, 34, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 69, 240, 240, + 176, 23, 8, 240, 240, 193, 33, 240, 50, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 69, 240, 240, 176, + 25, 9, 240, 240, 178, 113, 113, 211, 50, 49, 49, 65, + 49, 66, 17, 97, 17, 98, 129, 113, 129, 113, 98, 240, + 16, 26, 8, 240, 240, 34, 113, 113, 113, 113, 19, 50, + 34, 33, 65, 33, 65, 33, 65, 33, 49, 53, 49, 113, + 113, 113, 224, 24, 8, 240, 240, 193, 33, 240, 50, 65, + 33, 65, 49, 33, 65, 33, 67, 98, 97, 113, 97, 81, + 17, 82, 224, +}; + +//***************************************************************************** +// +// The glyph offset table for the 16 point Theanooldstyle font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanooldstyle16[] = +{ + 0, 4, 18, 33, 58, 89, 125, 155, + 164, 183, 201, 221, 236, 245, 253, 261, + 280, 306, 323, 345, 366, 387, 408, 432, + 452, 478, 502, 511, 521, 536, 545, 560, + 577, 620, 646, 672, 694, 721, 744, 766, + 790, 817, 833, 853, 881, 901, 942, 977, + 1003, 1024, 1055, 1082, 1105, 1127, 1154, 1180, + 1220, 1247, 1271, 1292, 1310, 1329, 1347, 1361, + 1368, 1376, 1393, 1417, 1433, 1456, 1472, 1488, + 1511, 1536, 1549, 1566, 1590, 1605, 1633, 1654, + 1674, 1696, 1717, 1732, 1748, 1766, 1786, 1804, + 1829, 1848, 1870, 1887, 1906, 1924, 1943, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1954, 1958, 1972, 1997, 2021, 2042, 2064, 2079, + 2106, 2114, 2150, 2163, 2180, 2190, 2198, 2238, + 2245, 2261, 2277, 2290, 2303, 2313, 2337, 2370, + 2377, 2386, 2399, 2413, 2431, 2463, 2496, 2529, + 2544, 2571, 2599, 2628, 2657, 2685, 2714, 2745, + 2770, 2794, 2819, 2843, 2867, 2884, 2901, 2921, + 2939, 2966, 3001, 3029, 3057, 3087, 3114, 3142, + 3160, 3193, 3222, 3251, 3282, 3310, 3336, 3358, + 3385, 3404, 3424, 3443, 3463, 3483, 3503, 3523, + 3542, 3560, 3579, 3598, 3616, 3631, 3646, 3662, + 3676, 3702, 3727, 3750, 3773, 3798, 3821, 3844, + 3856, 3879, 3902, 3925, 3949, 3972, 3997, 4023, +}; + +//***************************************************************************** +// +// The font definition for the 16 point Theanooldstyle font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanooldstyle16 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 17, + + // + // The height of the font. + // + 20, + + // + // The baseline of the font. + // + 15, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanooldstyle16, + + // + // A pointer to the actual font data + // + g_pui8Theanooldstyle16Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanooldstyle18.c b/third_party/fonts/ofl/fonts/fonttheanooldstyle18.c new file mode 100644 index 0000000..e65c6cb --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanooldstyle18.c @@ -0,0 +1,604 @@ +//***************************************************************************** +// +// fonttheanooldstyle18.c - Font definition for the 18pt Theanooldstyle font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanooldstyle +// Size: 18 point +// Bold: no +// Italic: no +// Memory usage: 4812 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 18 point Theanooldstyle font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanooldstyle18Data[4610] = +{ + 5, 7, 0, 19, 32, 16, 3, 194, 18, 18, 18, 33, + 33, 33, 33, 33, 33, 66, 18, 240, 16, 16, 6, 240, + 146, 18, 18, 18, 18, 18, 18, 18, 17, 49, 0, 9, + 112, 30, 10, 240, 240, 209, 49, 81, 33, 81, 49, 81, + 49, 57, 49, 49, 81, 33, 81, 49, 73, 33, 49, 81, + 33, 97, 33, 145, 0, 6, 112, 37, 9, 240, 240, 17, + 101, 49, 33, 33, 17, 49, 33, 17, 49, 18, 18, 33, + 84, 115, 115, 97, 33, 18, 33, 33, 17, 49, 33, 17, + 49, 33, 38, 97, 129, 240, 240, 16, 43, 13, 0, 6, + 83, 81, 49, 49, 49, 65, 49, 49, 65, 49, 33, 81, + 49, 33, 99, 33, 177, 49, 129, 18, 17, 97, 33, 49, + 81, 33, 49, 65, 49, 49, 65, 49, 49, 49, 81, 17, + 0, 8, 48, 33, 14, 0, 7, 67, 162, 33, 146, 33, + 146, 17, 163, 179, 37, 49, 18, 65, 65, 50, 49, 50, + 50, 33, 66, 67, 82, 82, 83, 66, 102, 35, 0, 9, + 10, 3, 194, 18, 18, 18, 17, 240, 240, 176, 21, 6, + 240, 209, 65, 65, 81, 66, 65, 66, 66, 66, 66, 66, + 66, 81, 82, 81, 81, 97, 97, 22, 6, 240, 145, 97, + 97, 81, 82, 81, 82, 66, 66, 66, 66, 66, 65, 66, + 65, 66, 65, 65, 80, 23, 8, 240, 240, 82, 49, 34, + 17, 18, 17, 18, 51, 65, 17, 17, 33, 33, 33, 66, + 98, 0, 10, 48, 16, 10, 0, 10, 65, 145, 145, 145, + 89, 81, 145, 145, 145, 0, 6, 112, 10, 4, 0, 7, + 81, 35, 49, 49, 33, 160, 8, 7, 0, 11, 54, 0, + 7, 16, 8, 3, 240, 240, 242, 18, 240, 16, 20, 5, + 240, 209, 65, 65, 65, 49, 65, 65, 65, 49, 65, 65, + 65, 49, 65, 65, 65, 144, 31, 10, 240, 240, 211, 97, + 49, 65, 81, 34, 81, 34, 82, 18, 82, 18, 82, 18, + 82, 18, 82, 33, 82, 33, 81, 65, 49, 99, 0, 6, + 96, 21, 6, 240, 194, 51, 33, 18, 17, 34, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 240, 240, 16, 25, 9, + 240, 240, 132, 50, 51, 18, 66, 18, 66, 114, 98, 98, + 113, 113, 98, 113, 81, 17, 82, 23, 0, 5, 112, 24, + 9, 240, 240, 117, 50, 50, 35, 34, 114, 98, 67, 147, + 130, 114, 17, 82, 17, 82, 17, 66, 53, 0, 6, 24, + 12, 0, 6, 113, 162, 147, 129, 18, 113, 34, 97, 50, + 97, 50, 81, 66, 75, 114, 162, 162, 162, 0, 8, 23, + 9, 240, 240, 49, 53, 65, 129, 129, 133, 65, 35, 115, + 114, 114, 114, 17, 82, 18, 50, 53, 0, 6, 26, 9, + 240, 240, 177, 98, 98, 98, 114, 98, 19, 51, 34, 34, + 66, 18, 66, 18, 66, 33, 66, 34, 34, 68, 0, 6, + 22, 9, 240, 240, 119, 33, 81, 17, 81, 129, 129, 129, + 113, 129, 129, 114, 113, 114, 114, 0, 6, 16, 29, 9, + 240, 240, 147, 66, 50, 33, 66, 33, 66, 34, 49, 66, + 17, 99, 81, 34, 49, 66, 18, 81, 18, 81, 33, 65, + 68, 0, 6, 27, 9, 240, 240, 132, 66, 34, 34, 65, + 34, 66, 18, 66, 18, 66, 34, 35, 51, 18, 98, 114, + 98, 98, 82, 0, 6, 48, 9, 3, 240, 194, 18, 210, + 18, 240, 16, 13, 4, 240, 240, 99, 19, 240, 49, 35, + 49, 49, 33, 160, 16, 10, 0, 10, 114, 98, 98, 98, + 113, 162, 162, 162, 162, 0, 6, 48, 10, 10, 0, 12, + 73, 240, 105, 0, 10, 16, 16, 10, 0, 10, 2, 162, + 162, 162, 161, 114, 98, 98, 98, 0, 7, 32, 18, 6, + 240, 147, 52, 97, 81, 81, 35, 49, 81, 81, 81, 162, + 66, 240, 240, 64, 48, 16, 0, 10, 116, 147, 66, 97, + 145, 65, 177, 33, 85, 33, 33, 50, 35, 33, 17, 65, + 50, 49, 17, 50, 49, 65, 17, 34, 50, 49, 33, 34, + 49, 65, 33, 34, 34, 49, 49, 41, 81, 241, 161, 82, + 98, 134, 240, 112, 31, 14, 0, 7, 98, 177, 17, 177, + 18, 161, 18, 145, 49, 145, 50, 129, 50, 134, 113, 82, + 97, 82, 81, 113, 81, 114, 37, 53, 0, 8, 112, 30, + 12, 0, 6, 8, 98, 50, 82, 66, 66, 66, 66, 66, + 66, 50, 85, 114, 51, 66, 82, 50, 82, 50, 82, 50, + 66, 41, 0, 7, 112, 24, 12, 0, 6, 70, 66, 82, + 34, 113, 33, 162, 162, 162, 162, 162, 178, 162, 113, 50, + 81, 101, 0, 7, 112, 31, 14, 0, 7, 9, 114, 82, + 82, 98, 66, 98, 66, 114, 50, 114, 50, 114, 50, 114, + 50, 114, 50, 113, 66, 98, 66, 82, 57, 0, 9, 48, + 28, 12, 0, 6, 10, 66, 81, 66, 97, 50, 162, 49, + 98, 49, 102, 98, 49, 98, 49, 98, 162, 97, 50, 97, + 27, 0, 7, 80, 26, 12, 0, 6, 10, 66, 81, 66, + 97, 50, 162, 49, 98, 49, 102, 98, 49, 98, 49, 98, + 162, 162, 133, 0, 8, 48, 28, 14, 0, 7, 70, 98, + 82, 66, 113, 65, 194, 194, 194, 194, 86, 18, 114, 65, + 114, 66, 98, 82, 82, 117, 17, 0, 9, 16, 32, 14, + 0, 7, 5, 53, 50, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 89, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 53, 53, 0, 8, 112, 19, 7, 240, 214, 50, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 54, 240, 240, + 96, 22, 9, 240, 240, 134, 82, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 113, 69, 68, 224, 33, + 13, 0, 6, 70, 36, 50, 81, 82, 65, 98, 49, 114, + 33, 130, 18, 131, 17, 130, 34, 114, 50, 98, 50, 98, + 66, 82, 82, 38, 21, 0, 8, 32, 23, 13, 0, 6, + 70, 146, 178, 178, 178, 178, 178, 178, 178, 178, 113, 50, + 113, 50, 97, 43, 0, 8, 48, 50, 17, 0, 8, 68, + 117, 51, 99, 83, 81, 18, 81, 17, 81, 18, 81, 18, + 65, 18, 81, 18, 49, 34, 81, 34, 33, 34, 81, 34, + 33, 34, 81, 49, 17, 50, 81, 51, 50, 81, 51, 50, + 81, 65, 66, 53, 33, 38, 0, 10, 96, 39, 14, 0, + 7, 4, 69, 51, 81, 83, 81, 81, 18, 65, 81, 34, + 49, 81, 34, 49, 81, 50, 33, 81, 65, 33, 81, 66, + 17, 81, 83, 81, 98, 81, 98, 53, 81, 0, 9, 16, + 31, 13, 0, 7, 4, 114, 66, 66, 98, 49, 129, 34, + 130, 18, 130, 18, 130, 18, 130, 18, 130, 33, 129, 50, + 98, 65, 97, 117, 0, 8, 80, 26, 11, 240, 240, 232, + 82, 50, 66, 66, 50, 66, 50, 66, 50, 66, 50, 50, + 69, 98, 146, 146, 146, 117, 0, 7, 80, 36, 13, 0, + 7, 4, 114, 66, 66, 98, 49, 129, 34, 130, 18, 130, + 18, 130, 18, 130, 18, 130, 33, 129, 50, 98, 66, 81, + 117, 145, 81, 83, 49, 66, 37, 240, 208, 31, 14, 0, + 7, 9, 114, 66, 98, 82, 82, 82, 82, 82, 82, 66, + 102, 130, 34, 130, 50, 114, 50, 114, 66, 98, 82, 54, + 52, 0, 8, 112, 26, 11, 0, 5, 118, 65, 66, 50, + 81, 50, 147, 148, 133, 147, 162, 17, 114, 33, 98, 34, + 66, 49, 21, 0, 7, 32, 24, 13, 0, 6, 76, 17, + 66, 65, 17, 66, 65, 98, 178, 178, 178, 178, 178, 178, + 178, 178, 150, 0, 8, 80, 31, 15, 0, 7, 70, 53, + 50, 113, 82, 113, 82, 113, 82, 113, 82, 113, 82, 113, + 82, 113, 82, 113, 82, 113, 82, 113, 98, 81, 149, 0, + 10, 30, 15, 0, 7, 70, 53, 50, 113, 97, 113, 98, + 81, 114, 81, 130, 65, 130, 49, 161, 49, 162, 17, 193, + 17, 195, 194, 225, 0, 10, 32, 46, 21, 0, 10, 70, + 22, 37, 50, 82, 97, 97, 97, 97, 98, 67, 65, 114, + 67, 65, 129, 65, 17, 49, 146, 33, 34, 33, 146, 33, + 34, 33, 146, 17, 50, 17, 179, 65, 17, 179, 67, 178, + 82, 209, 97, 0, 14, 30, 14, 0, 7, 22, 21, 66, + 81, 114, 49, 130, 33, 162, 17, 178, 194, 195, 161, 34, + 129, 50, 113, 82, 97, 83, 38, 37, 0, 8, 112, 28, + 13, 0, 6, 69, 52, 50, 82, 66, 81, 97, 81, 98, + 49, 129, 49, 130, 17, 146, 17, 162, 178, 178, 178, 150, + 0, 8, 80, 25, 12, 0, 6, 41, 34, 82, 49, 82, + 49, 98, 146, 146, 162, 146, 146, 146, 162, 97, 34, 97, + 42, 0, 7, 96, 21, 6, 240, 148, 34, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 69, + 112, 20, 5, 240, 81, 65, 65, 65, 81, 65, 65, 65, + 81, 65, 65, 65, 81, 65, 65, 65, 176, 21, 6, 240, + 164, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 21, 112, 15, 9, 240, 240, 146, 100, + 81, 34, 49, 65, 33, 97, 0, 14, 96, 7, 10, 0, + 23, 105, 240, 96, 10, 4, 240, 17, 50, 49, 65, 0, + 7, 16, 20, 9, 0, 10, 36, 66, 49, 129, 99, 66, + 33, 50, 49, 50, 49, 17, 38, 0, 5, 112, 27, 10, + 240, 240, 162, 145, 145, 145, 145, 145, 20, 66, 50, 49, + 82, 33, 82, 33, 82, 33, 82, 33, 66, 54, 0, 6, + 80, 18, 8, 0, 9, 36, 50, 34, 18, 65, 18, 98, + 98, 114, 49, 52, 240, 240, 192, 27, 9, 240, 240, 178, + 129, 129, 129, 129, 67, 17, 50, 34, 34, 65, 34, 65, + 34, 65, 34, 65, 50, 49, 70, 0, 5, 96, 16, 8, + 0, 9, 36, 49, 49, 39, 18, 98, 98, 114, 115, 240, + 240, 208, 21, 7, 240, 240, 19, 34, 33, 33, 97, 97, + 84, 65, 97, 97, 97, 97, 97, 83, 240, 240, 144, 24, + 10, 0, 11, 68, 18, 18, 65, 49, 82, 33, 82, 34, + 50, 68, 81, 147, 149, 50, 81, 33, 97, 54, 208, 28, + 9, 240, 240, 98, 129, 129, 129, 129, 129, 19, 66, 49, + 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, 35, 35, + 0, 5, 96, 16, 5, 240, 98, 50, 240, 50, 65, 65, + 65, 65, 65, 65, 36, 240, 176, 20, 5, 240, 114, 50, + 240, 50, 65, 65, 65, 65, 65, 65, 65, 65, 65, 17, + 17, 34, 128, 27, 9, 240, 240, 98, 129, 129, 129, 129, + 129, 36, 33, 49, 65, 33, 81, 17, 100, 81, 34, 65, + 50, 35, 35, 0, 5, 96, 18, 4, 240, 18, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 35, 240, 96, + 31, 14, 0, 15, 98, 19, 35, 66, 50, 49, 49, 65, + 65, 49, 65, 65, 49, 65, 65, 49, 65, 65, 49, 65, + 65, 35, 35, 35, 0, 8, 112, 23, 9, 0, 10, 18, + 19, 66, 49, 49, 65, 49, 65, 49, 65, 49, 65, 49, + 65, 35, 35, 0, 5, 96, 20, 9, 0, 10, 52, 66, + 34, 34, 66, 18, 66, 18, 66, 18, 66, 34, 34, 68, + 0, 6, 25, 10, 0, 11, 34, 20, 66, 50, 49, 82, + 33, 82, 33, 82, 33, 82, 33, 66, 54, 65, 145, 145, + 132, 240, 16, 23, 9, 0, 10, 53, 50, 49, 34, 65, + 34, 65, 34, 65, 34, 65, 50, 49, 69, 129, 129, 129, + 115, 160, 16, 7, 0, 7, 114, 34, 36, 49, 97, 97, + 97, 97, 83, 240, 240, 144, 17, 7, 0, 8, 4, 33, + 65, 17, 115, 99, 97, 17, 65, 21, 240, 240, 112, 19, + 6, 240, 240, 113, 81, 66, 68, 49, 81, 81, 81, 81, + 81, 33, 50, 240, 240, 32, 22, 9, 0, 10, 18, 50, + 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, + 70, 0, 5, 96, 21, 10, 0, 11, 36, 35, 34, 65, + 65, 49, 82, 33, 97, 17, 113, 17, 129, 145, 0, 6, + 112, 30, 14, 0, 15, 100, 19, 35, 49, 50, 49, 65, + 50, 33, 82, 17, 17, 33, 97, 17, 19, 113, 17, 34, + 129, 50, 129, 49, 0, 9, 48, 21, 10, 0, 11, 36, + 35, 49, 49, 82, 17, 114, 131, 97, 34, 65, 65, 51, + 36, 0, 6, 48, 23, 11, 0, 12, 52, 36, 49, 65, + 82, 49, 97, 33, 113, 33, 115, 146, 145, 161, 145, 115, + 131, 240, 64, 17, 7, 0, 8, 5, 17, 50, 17, 49, + 81, 82, 66, 81, 86, 240, 240, 96, 21, 4, 240, 49, + 33, 49, 49, 65, 49, 49, 33, 33, 65, 65, 49, 49, + 33, 49, 49, 65, 80, 20, 2, 129, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 48, 21, 4, 240, 17, 65, 49, 49, 33, 49, 49, 49, + 66, 18, 33, 49, 49, 65, 49, 49, 33, 112, 11, 9, + 0, 12, 67, 49, 17, 51, 0, 10, 48, 5, 7, 0, + 19, 32, 16, 3, 240, 194, 18, 33, 33, 33, 33, 33, + 33, 18, 18, 18, 18, 64, 29, 8, 240, 240, 129, 113, + 97, 113, 113, 68, 50, 34, 18, 33, 50, 17, 66, 17, + 66, 17, 82, 49, 52, 65, 97, 113, 97, 113, 112, 25, + 13, 0, 7, 37, 114, 50, 82, 66, 82, 178, 178, 136, + 145, 193, 193, 131, 17, 113, 56, 20, 36, 0, 8, 64, + 23, 8, 0, 9, 1, 19, 17, 33, 49, 33, 81, 17, + 81, 17, 81, 33, 49, 33, 19, 17, 0, 6, 16, 26, + 11, 240, 240, 227, 52, 34, 65, 81, 65, 81, 49, 98, + 33, 113, 17, 103, 113, 119, 113, 161, 161, 148, 0, 7, + 48, 17, 2, 129, 17, 17, 17, 17, 17, 17, 113, 17, + 17, 17, 17, 17, 17, 48, 32, 8, 240, 240, 67, 65, + 34, 49, 34, 50, 114, 114, 51, 18, 33, 66, 17, 81, + 18, 65, 35, 17, 67, 98, 81, 18, 50, 33, 50, 33, + 67, 176, 10, 6, 240, 241, 34, 18, 18, 0, 11, 48, + 42, 15, 0, 8, 6, 114, 98, 66, 35, 17, 18, 49, + 18, 50, 33, 33, 18, 81, 49, 17, 18, 145, 17, 18, + 145, 17, 18, 145, 17, 18, 145, 33, 18, 113, 49, 52, + 34, 66, 98, 118, 0, 10, 15, 6, 240, 163, 33, 33, + 66, 34, 17, 33, 34, 34, 0, 9, 48, 19, 6, 0, + 7, 97, 65, 33, 17, 33, 33, 18, 49, 17, 49, 33, + 49, 240, 240, 48, 11, 10, 0, 12, 73, 145, 145, 145, + 0, 10, 16, 8, 7, 0, 11, 54, 0, 7, 16, 43, + 15, 0, 8, 6, 114, 98, 71, 50, 49, 33, 49, 49, + 33, 49, 49, 65, 17, 49, 49, 65, 17, 52, 81, 17, + 49, 33, 81, 17, 49, 34, 65, 33, 19, 35, 17, 49, + 146, 66, 98, 118, 0, 10, 8, 6, 240, 240, 101, 0, + 11, 48, 19, 8, 240, 240, 67, 65, 49, 33, 81, 17, + 81, 17, 81, 33, 49, 67, 0, 11, 48, 17, 10, 0, + 9, 33, 145, 145, 145, 89, 81, 145, 145, 145, 249, 240, + 240, 176, 14, 6, 240, 163, 34, 33, 81, 65, 50, 49, + 85, 0, 8, 48, 15, 6, 240, 163, 49, 33, 81, 50, + 82, 17, 49, 35, 0, 8, 64, 10, 4, 240, 49, 34, + 33, 33, 0, 7, 48, 30, 11, 0, 12, 81, 65, 81, + 65, 81, 65, 81, 50, 66, 50, 65, 66, 17, 34, 33, + 17, 17, 33, 18, 49, 34, 146, 146, 146, 240, 80, 38, + 10, 240, 240, 199, 35, 33, 52, 33, 52, 33, 52, 33, + 67, 33, 82, 33, 97, 33, 97, 33, 97, 33, 97, 33, + 97, 33, 97, 33, 97, 33, 97, 33, 97, 33, 97, 33, + 208, 8, 3, 240, 240, 50, 18, 240, 208, 10, 4, 0, + 8, 81, 49, 65, 17, 17, 80, 13, 4, 240, 49, 19, + 49, 49, 49, 49, 49, 240, 240, 240, 16, 6, 240, 163, + 33, 49, 17, 49, 17, 49, 18, 17, 65, 0, 9, 48, + 18, 7, 0, 8, 97, 113, 17, 65, 33, 65, 18, 33, + 33, 33, 33, 240, 240, 240, 36, 13, 0, 6, 97, 97, + 51, 81, 97, 81, 97, 65, 113, 49, 129, 49, 129, 33, + 65, 113, 50, 97, 49, 17, 97, 33, 33, 81, 53, 49, + 113, 65, 113, 0, 8, 48, 37, 13, 0, 6, 97, 97, + 51, 81, 97, 81, 97, 65, 113, 65, 113, 49, 34, 65, + 33, 18, 33, 97, 33, 33, 81, 81, 97, 65, 97, 65, + 97, 65, 113, 69, 0, 8, 32, 38, 14, 0, 7, 19, + 97, 65, 33, 65, 129, 65, 98, 65, 130, 33, 97, 49, + 33, 98, 33, 17, 65, 51, 17, 66, 113, 49, 17, 97, + 49, 33, 97, 53, 65, 113, 209, 0, 9, 16, 6, 0, + 7, 18, 66, 161, 81, 81, 66, 36, 33, 81, 100, 51, + 112, 32, 15, 240, 82, 241, 240, 210, 210, 193, 18, 177, + 18, 177, 33, 161, 50, 145, 65, 150, 129, 82, 113, 82, + 97, 113, 97, 114, 53, 54, 0, 9, 64, 32, 14, 240, + 98, 177, 240, 194, 194, 177, 18, 161, 18, 145, 49, 145, + 50, 129, 50, 119, 113, 82, 97, 82, 81, 113, 81, 114, + 37, 53, 0, 8, 112, 33, 14, 240, 82, 162, 33, 240, + 162, 194, 177, 18, 161, 18, 145, 49, 145, 50, 129, 50, + 134, 113, 82, 97, 82, 81, 113, 81, 114, 37, 53, 0, + 8, 112, 33, 14, 240, 51, 161, 51, 240, 146, 194, 177, + 18, 161, 18, 145, 49, 145, 50, 129, 50, 134, 113, 82, + 97, 82, 81, 113, 81, 114, 37, 53, 0, 8, 112, 33, + 15, 240, 66, 34, 240, 240, 178, 210, 193, 18, 177, 18, + 177, 33, 161, 50, 145, 50, 150, 129, 82, 113, 82, 97, + 98, 97, 114, 53, 54, 0, 9, 64, 33, 14, 83, 161, + 49, 145, 49, 163, 194, 179, 179, 161, 34, 145, 34, 145, + 34, 129, 66, 119, 97, 82, 97, 98, 81, 98, 65, 114, + 52, 54, 0, 8, 112, 38, 20, 0, 10, 123, 179, 81, + 161, 18, 97, 145, 18, 241, 34, 49, 161, 50, 49, 161, + 54, 151, 49, 129, 82, 49, 129, 82, 177, 98, 97, 50, + 98, 97, 21, 59, 0, 12, 80, 26, 12, 0, 6, 70, + 66, 66, 50, 113, 33, 162, 162, 162, 162, 162, 177, 178, + 178, 66, 100, 145, 178, 193, 132, 240, 16, 29, 12, 242, + 193, 240, 58, 66, 81, 66, 97, 50, 162, 49, 98, 49, + 102, 98, 49, 98, 49, 98, 162, 97, 50, 97, 27, 0, + 7, 80, 30, 12, 240, 50, 145, 240, 58, 66, 81, 66, + 97, 50, 162, 49, 98, 49, 102, 98, 49, 98, 49, 98, + 162, 97, 50, 97, 27, 0, 7, 80, 31, 12, 81, 163, + 129, 49, 240, 26, 66, 81, 66, 97, 50, 162, 49, 98, + 49, 102, 98, 49, 98, 49, 98, 162, 97, 50, 97, 27, + 0, 7, 80, 29, 13, 242, 50, 240, 251, 66, 97, 66, + 97, 66, 178, 49, 114, 49, 118, 114, 49, 114, 49, 114, + 178, 113, 50, 98, 27, 0, 8, 48, 20, 7, 115, 113, + 166, 50, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 54, 240, 240, 96, 20, 6, 146, 49, 149, 50, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 37, 240, 240, 16, + 21, 7, 146, 50, 34, 134, 50, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 54, 240, 240, 96, 20, 7, 114, + 34, 246, 50, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 54, 240, 240, 96, 31, 14, 0, 7, 9, 114, 82, + 82, 98, 66, 98, 66, 114, 50, 114, 23, 66, 50, 114, + 50, 114, 50, 113, 66, 98, 66, 82, 57, 0, 9, 48, + 41, 14, 240, 39, 240, 240, 36, 69, 51, 81, 83, 81, + 81, 18, 65, 81, 34, 49, 81, 34, 49, 81, 50, 33, + 81, 65, 33, 81, 66, 17, 81, 83, 81, 98, 81, 98, + 53, 81, 0, 9, 16, 33, 13, 50, 194, 209, 240, 132, + 114, 66, 66, 98, 49, 129, 34, 130, 18, 130, 18, 130, + 18, 130, 18, 130, 33, 129, 50, 98, 65, 97, 117, 0, + 8, 80, 33, 13, 114, 162, 161, 240, 148, 114, 66, 66, + 98, 49, 129, 34, 130, 18, 130, 18, 130, 18, 130, 18, + 130, 33, 129, 50, 98, 65, 97, 117, 0, 8, 80, 34, + 13, 82, 164, 129, 65, 240, 100, 114, 66, 66, 98, 49, + 129, 34, 130, 18, 130, 18, 130, 18, 130, 18, 130, 33, + 129, 50, 98, 65, 97, 117, 0, 8, 80, 32, 13, 247, + 240, 240, 68, 114, 66, 66, 98, 49, 129, 34, 130, 18, + 130, 18, 130, 18, 130, 18, 130, 33, 129, 50, 98, 65, + 97, 117, 0, 8, 80, 34, 13, 240, 18, 34, 240, 240, + 68, 114, 66, 66, 98, 49, 129, 34, 130, 18, 130, 18, + 130, 18, 130, 18, 130, 33, 129, 50, 98, 65, 97, 117, + 0, 8, 80, 18, 7, 0, 7, 113, 65, 18, 34, 36, + 66, 68, 34, 34, 17, 65, 240, 240, 208, 40, 13, 0, + 7, 4, 49, 50, 67, 50, 98, 49, 97, 17, 34, 81, + 34, 18, 65, 50, 18, 49, 66, 18, 49, 66, 18, 33, + 82, 33, 17, 97, 50, 98, 50, 82, 49, 38, 0, 8, + 80, 33, 15, 81, 241, 241, 240, 118, 53, 50, 113, 82, + 113, 82, 113, 82, 113, 82, 113, 82, 113, 82, 113, 82, + 113, 82, 113, 82, 113, 98, 81, 149, 0, 10, 33, 15, + 130, 194, 193, 240, 134, 53, 50, 113, 82, 113, 82, 113, + 82, 113, 82, 113, 82, 113, 82, 113, 82, 113, 82, 113, + 82, 113, 98, 81, 149, 0, 10, 35, 15, 113, 209, 17, + 162, 49, 240, 86, 53, 50, 113, 82, 113, 82, 113, 82, + 113, 82, 113, 82, 113, 82, 113, 82, 113, 82, 113, 82, + 113, 98, 81, 149, 0, 10, 34, 15, 240, 66, 34, 240, + 240, 86, 53, 50, 113, 82, 113, 82, 113, 82, 113, 82, + 113, 82, 113, 82, 113, 82, 113, 82, 113, 82, 113, 98, + 81, 149, 0, 10, 30, 13, 240, 82, 146, 240, 69, 52, + 50, 82, 66, 81, 97, 81, 98, 49, 129, 49, 130, 17, + 146, 17, 162, 178, 178, 178, 150, 0, 8, 80, 25, 11, + 240, 240, 229, 130, 146, 149, 98, 50, 66, 66, 50, 66, + 50, 66, 50, 50, 69, 98, 146, 117, 0, 7, 80, 33, + 9, 240, 240, 147, 66, 34, 49, 50, 49, 49, 65, 34, + 50, 33, 81, 33, 81, 34, 65, 50, 49, 66, 33, 81, + 33, 17, 49, 18, 35, 0, 5, 112, 24, 9, 240, 240, + 114, 129, 129, 145, 244, 66, 49, 129, 99, 66, 33, 50, + 49, 50, 49, 17, 38, 0, 5, 112, 24, 9, 240, 240, + 162, 113, 129, 113, 244, 66, 49, 129, 99, 66, 33, 50, + 49, 50, 49, 17, 38, 0, 5, 112, 26, 9, 240, 240, + 145, 129, 113, 17, 81, 49, 212, 66, 49, 129, 99, 66, + 33, 50, 49, 50, 49, 17, 38, 0, 5, 112, 23, 9, + 0, 6, 115, 81, 35, 212, 66, 49, 129, 99, 66, 33, + 50, 49, 50, 49, 17, 38, 0, 5, 112, 25, 9, 0, + 5, 97, 34, 66, 18, 240, 116, 66, 49, 129, 99, 66, + 33, 50, 49, 50, 49, 17, 38, 0, 5, 112, 26, 9, + 240, 240, 131, 81, 49, 65, 49, 83, 228, 66, 49, 129, + 99, 66, 33, 50, 49, 50, 49, 17, 38, 0, 5, 112, + 22, 13, 0, 14, 101, 20, 49, 50, 49, 119, 53, 113, + 50, 98, 50, 98, 51, 100, 35, 0, 8, 64, 20, 8, + 0, 9, 36, 50, 34, 18, 65, 18, 98, 98, 114, 49, + 52, 81, 113, 129, 83, 176, 20, 8, 240, 240, 65, 113, + 129, 113, 228, 49, 49, 39, 18, 98, 98, 114, 115, 240, + 240, 208, 20, 8, 240, 240, 113, 98, 97, 97, 228, 49, + 50, 23, 18, 98, 98, 114, 116, 240, 240, 192, 21, 8, + 240, 240, 210, 81, 17, 81, 33, 196, 49, 49, 39, 18, + 98, 98, 114, 115, 240, 240, 208, 21, 9, 0, 5, 98, + 33, 66, 34, 240, 116, 65, 65, 40, 18, 114, 114, 130, + 49, 68, 0, 6, 17, 5, 240, 81, 66, 65, 81, 130, + 65, 65, 65, 65, 65, 65, 36, 240, 176, 17, 5, 240, + 129, 50, 49, 49, 130, 65, 65, 65, 65, 65, 65, 52, + 240, 176, 20, 6, 240, 177, 81, 65, 17, 33, 49, 130, + 81, 81, 81, 81, 81, 81, 67, 240, 240, 32, 18, 6, + 240, 242, 17, 34, 18, 226, 81, 81, 81, 81, 81, 81, + 68, 240, 240, 16, 28, 9, 240, 240, 129, 49, 81, 17, + 98, 97, 33, 130, 69, 50, 35, 18, 66, 18, 66, 18, + 66, 18, 66, 34, 34, 68, 0, 6, 27, 9, 0, 7, + 2, 33, 49, 34, 194, 19, 66, 49, 49, 65, 49, 65, + 49, 65, 49, 65, 49, 65, 35, 35, 0, 5, 96, 24, + 9, 240, 240, 129, 130, 129, 240, 164, 66, 34, 34, 66, + 18, 66, 18, 66, 18, 66, 34, 34, 68, 0, 6, 24, + 9, 240, 240, 177, 114, 113, 129, 244, 66, 49, 34, 66, + 18, 66, 18, 66, 18, 66, 34, 49, 68, 0, 6, 24, + 9, 0, 6, 2, 114, 97, 33, 228, 66, 34, 34, 66, + 18, 66, 18, 66, 18, 66, 34, 34, 68, 0, 6, 24, + 9, 0, 7, 2, 33, 49, 34, 228, 66, 34, 34, 66, + 18, 66, 18, 66, 18, 66, 34, 34, 68, 0, 6, 25, + 9, 0, 5, 98, 33, 66, 34, 240, 116, 66, 34, 34, + 66, 18, 66, 18, 66, 18, 66, 34, 34, 68, 0, 6, + 13, 9, 0, 10, 66, 114, 216, 240, 114, 114, 0, 6, + 16, 24, 9, 0, 10, 52, 17, 34, 34, 34, 51, 18, + 33, 18, 18, 17, 34, 19, 50, 34, 34, 33, 20, 0, + 6, 26, 9, 240, 240, 114, 129, 145, 129, 226, 50, 49, + 65, 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, 70, + 0, 5, 96, 26, 9, 240, 240, 177, 114, 113, 113, 226, + 50, 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, 49, + 65, 70, 0, 5, 96, 27, 9, 0, 6, 2, 97, 17, + 81, 240, 18, 50, 49, 65, 49, 65, 49, 65, 49, 65, + 49, 65, 49, 65, 70, 0, 5, 96, 27, 9, 0, 5, + 98, 33, 66, 34, 240, 82, 50, 49, 65, 49, 65, 49, + 65, 49, 65, 49, 65, 49, 65, 70, 0, 5, 96, 28, + 11, 0, 6, 33, 161, 145, 161, 240, 20, 36, 49, 65, + 82, 49, 97, 33, 113, 33, 130, 146, 145, 161, 145, 115, + 131, 240, 64, 30, 10, 240, 240, 162, 145, 145, 145, 145, + 145, 20, 66, 50, 49, 82, 33, 82, 33, 82, 33, 82, + 33, 66, 54, 65, 145, 145, 132, 240, 16, 29, 10, 0, + 6, 66, 18, 82, 18, 240, 132, 35, 34, 65, 65, 49, + 82, 33, 97, 17, 113, 17, 129, 129, 145, 129, 115, 114, + 240, 48, +}; + +//***************************************************************************** +// +// The glyph offset table for the 18 point Theanooldstyle font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanooldstyle18[] = +{ + 0, 5, 21, 37, 67, 104, 147, 180, + 190, 211, 233, 256, 272, 282, 290, 298, + 318, 349, 370, 395, 419, 443, 466, 492, + 514, 543, 570, 579, 592, 608, 618, 634, + 652, 700, 731, 761, 785, 816, 844, 870, + 898, 930, 949, 971, 1004, 1027, 1077, 1116, + 1147, 1173, 1209, 1240, 1266, 1290, 1321, 1351, + 1397, 1427, 1455, 1480, 1501, 1521, 1542, 1557, + 1564, 1574, 1594, 1621, 1639, 1666, 1682, 1703, + 1727, 1755, 1771, 1791, 1818, 1836, 1867, 1890, + 1910, 1935, 1958, 1974, 1991, 2010, 2032, 2053, + 2083, 2104, 2127, 2144, 2165, 2185, 2206, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2217, 2222, 2238, 2267, 2292, 2315, 2341, 2358, + 2390, 2400, 2442, 2457, 2476, 2487, 2495, 2538, + 2546, 2565, 2582, 2596, 2611, 2621, 2651, 2689, + 2697, 2707, 2720, 2736, 2754, 2790, 2827, 2865, + 2881, 2913, 2945, 2978, 3011, 3044, 3077, 3115, + 3141, 3170, 3200, 3231, 3260, 3280, 3300, 3321, + 3341, 3372, 3413, 3446, 3479, 3513, 3545, 3579, + 3597, 3637, 3670, 3703, 3738, 3772, 3802, 3827, + 3860, 3884, 3908, 3934, 3957, 3982, 4008, 4030, + 4050, 4070, 4090, 4111, 4132, 4149, 4166, 4186, + 4204, 4232, 4259, 4283, 4307, 4331, 4355, 4380, + 4393, 4417, 4443, 4469, 4496, 4523, 4551, 4581, +}; + +//***************************************************************************** +// +// The font definition for the 18 point Theanooldstyle font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanooldstyle18 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 19, + + // + // The height of the font. + // + 22, + + // + // The baseline of the font. + // + 17, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanooldstyle18, + + // + // A pointer to the actual font data + // + g_pui8Theanooldstyle18Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanooldstyle20.c b/third_party/fonts/ofl/fonts/fonttheanooldstyle20.c new file mode 100644 index 0000000..cdf98eb --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanooldstyle20.c @@ -0,0 +1,641 @@ +//***************************************************************************** +// +// fonttheanooldstyle20.c - Font definition for the 20pt Theanooldstyle font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanooldstyle +// Size: 20 point +// Bold: no +// Italic: no +// Memory usage: 5256 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 20 point Theanooldstyle font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanooldstyle20Data[5055] = +{ + 5, 9, 0, 28, 16, 18, 4, 240, 82, 34, 34, 34, + 49, 49, 49, 49, 49, 49, 49, 98, 34, 240, 176, 19, + 8, 240, 240, 162, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 33, 49, 0, 14, 48, 32, 12, 0, 7, 113, 177, + 49, 113, 49, 113, 49, 74, 65, 49, 113, 49, 113, 49, + 113, 49, 90, 49, 49, 113, 49, 113, 49, 113, 49, 0, + 9, 96, 41, 11, 240, 240, 113, 161, 133, 81, 33, 33, + 49, 49, 34, 33, 49, 19, 34, 33, 114, 17, 132, 148, + 113, 19, 97, 49, 34, 33, 49, 33, 49, 49, 33, 49, + 33, 70, 129, 161, 0, 6, 32, 41, 16, 0, 10, 20, + 178, 34, 65, 82, 34, 49, 98, 34, 33, 129, 33, 49, + 146, 49, 241, 225, 50, 145, 49, 33, 129, 34, 34, 97, + 50, 34, 97, 50, 34, 81, 81, 34, 180, 0, 12, 48, + 37, 16, 0, 10, 68, 178, 49, 162, 49, 162, 33, 180, + 195, 53, 65, 34, 66, 66, 34, 65, 66, 66, 49, 66, + 66, 33, 82, 83, 98, 98, 114, 68, 117, 52, 0, 12, + 32, 12, 4, 240, 82, 34, 34, 34, 34, 33, 0, 7, + 48, 24, 7, 240, 240, 145, 81, 81, 97, 82, 81, 82, + 82, 82, 82, 82, 82, 82, 97, 98, 97, 97, 113, 113, + 144, 24, 7, 240, 240, 81, 113, 113, 97, 98, 97, 98, + 82, 82, 82, 82, 82, 82, 81, 82, 81, 82, 81, 81, + 208, 24, 11, 0, 7, 50, 146, 82, 33, 34, 50, 17, + 18, 99, 98, 17, 18, 50, 33, 34, 98, 146, 0, 15, + 96, 16, 11, 0, 12, 113, 161, 161, 161, 105, 97, 161, + 161, 161, 161, 0, 9, 11, 5, 0, 10, 82, 51, 65, + 65, 49, 49, 224, 8, 8, 0, 14, 6, 0, 10, 32, + 8, 4, 0, 8, 66, 34, 240, 176, 24, 7, 240, 240, + 145, 97, 97, 81, 97, 97, 97, 81, 97, 97, 97, 97, + 81, 97, 97, 97, 81, 97, 97, 208, 33, 12, 0, 7, + 116, 113, 65, 82, 66, 65, 97, 50, 98, 34, 98, 34, + 98, 34, 98, 34, 98, 34, 98, 49, 97, 66, 66, 81, + 65, 116, 0, 9, 80, 23, 7, 240, 240, 130, 67, 49, + 18, 33, 34, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 240, 240, 224, 26, 10, 0, 6, 68, 66, 50, 49, + 82, 34, 66, 130, 129, 130, 113, 129, 129, 129, 81, 33, + 97, 40, 39, 0, 7, 112, 26, 10, 0, 6, 68, 66, + 65, 51, 50, 130, 130, 65, 33, 115, 161, 146, 130, 33, + 82, 33, 82, 34, 50, 69, 0, 8, 26, 13, 0, 9, + 1, 178, 148, 145, 18, 129, 34, 113, 50, 97, 66, 81, + 82, 91, 130, 178, 178, 178, 178, 0, 10, 48, 25, 11, + 240, 240, 161, 161, 70, 86, 81, 161, 165, 103, 146, 162, + 146, 146, 146, 33, 97, 50, 66, 69, 0, 8, 112, 30, + 11, 0, 6, 49, 115, 114, 130, 130, 146, 130, 20, 67, + 50, 50, 82, 34, 82, 34, 82, 34, 82, 49, 82, 50, + 50, 100, 0, 8, 96, 22, 11, 0, 7, 8, 55, 49, + 97, 49, 97, 145, 161, 161, 145, 161, 161, 146, 146, 130, + 146, 0, 9, 31, 11, 0, 7, 36, 97, 50, 65, 82, + 49, 82, 50, 65, 82, 33, 115, 132, 82, 51, 34, 97, + 34, 97, 34, 97, 50, 65, 85, 0, 8, 96, 29, 11, + 0, 7, 20, 98, 50, 50, 81, 50, 82, 34, 82, 34, + 82, 34, 82, 50, 51, 68, 18, 130, 146, 130, 130, 114, + 129, 0, 8, 11, 4, 240, 240, 162, 34, 240, 114, 34, + 240, 176, 15, 5, 0, 6, 35, 35, 49, 240, 130, 51, + 65, 65, 49, 49, 224, 17, 12, 0, 14, 66, 130, 130, + 130, 130, 162, 194, 194, 194, 194, 0, 9, 32, 10, 12, + 0, 18, 10, 240, 186, 0, 13, 96, 17, 12, 0, 13, + 66, 194, 194, 194, 194, 162, 130, 130, 130, 130, 0, 10, + 32, 20, 8, 240, 240, 164, 69, 129, 113, 98, 53, 51, + 81, 113, 113, 240, 114, 98, 0, 6, 96, 56, 19, 0, + 15, 36, 195, 67, 129, 161, 82, 177, 81, 83, 18, 33, + 49, 66, 35, 49, 49, 50, 51, 49, 33, 50, 66, 65, + 33, 50, 65, 81, 33, 34, 66, 65, 49, 34, 50, 65, + 65, 34, 35, 49, 81, 36, 36, 113, 240, 65, 161, 129, + 114, 167, 0, 5, 96, 31, 16, 0, 10, 98, 227, 211, + 193, 34, 177, 34, 161, 50, 161, 66, 145, 66, 136, 129, + 98, 113, 98, 97, 114, 97, 115, 53, 54, 0, 12, 32, + 31, 14, 0, 8, 104, 130, 66, 98, 82, 82, 82, 82, + 82, 82, 66, 102, 130, 67, 82, 98, 66, 98, 66, 98, + 66, 98, 66, 82, 58, 0, 11, 25, 14, 0, 9, 39, + 83, 67, 50, 129, 50, 178, 194, 194, 194, 194, 194, 210, + 194, 129, 67, 66, 117, 0, 11, 16, 33, 16, 0, 10, + 9, 146, 82, 114, 113, 98, 114, 82, 129, 82, 130, 66, + 130, 66, 130, 66, 130, 66, 130, 66, 114, 82, 114, 82, + 98, 74, 0, 12, 96, 30, 15, 0, 9, 59, 98, 98, + 82, 113, 82, 210, 65, 130, 65, 135, 130, 50, 130, 65, + 130, 210, 129, 66, 129, 66, 113, 60, 0, 11, 80, 27, + 14, 0, 8, 107, 82, 98, 66, 113, 66, 194, 65, 114, + 65, 119, 114, 50, 114, 65, 114, 194, 194, 194, 166, 0, + 11, 64, 30, 16, 0, 10, 71, 115, 67, 82, 129, 82, + 210, 226, 226, 226, 102, 34, 130, 66, 130, 82, 114, 82, + 114, 99, 67, 134, 17, 0, 12, 64, 34, 16, 0, 10, + 6, 38, 66, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 106, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 70, 38, 0, 12, 32, 21, 8, 240, 240, 166, 66, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, + 0, 6, 32, 26, 10, 0, 6, 70, 98, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 65, + 49, 85, 83, 240, 32, 35, 15, 0, 9, 54, 37, 66, + 82, 98, 81, 114, 65, 130, 49, 146, 33, 162, 19, 147, + 18, 146, 50, 130, 50, 130, 66, 114, 82, 98, 82, 70, + 22, 0, 11, 64, 24, 15, 0, 9, 54, 178, 210, 210, + 210, 210, 210, 210, 210, 210, 210, 129, 66, 114, 66, 113, + 60, 0, 11, 80, 54, 19, 0, 11, 116, 133, 67, 115, + 99, 97, 18, 97, 18, 81, 18, 97, 18, 81, 18, 97, + 18, 65, 34, 97, 34, 49, 34, 97, 34, 49, 34, 97, + 49, 33, 50, 97, 50, 17, 50, 97, 51, 66, 97, 66, + 66, 97, 66, 66, 69, 33, 54, 0, 14, 64, 42, 16, + 0, 10, 4, 85, 67, 97, 99, 97, 97, 18, 81, 97, + 34, 65, 97, 34, 65, 97, 50, 49, 97, 66, 33, 97, + 66, 33, 97, 82, 17, 97, 99, 97, 99, 97, 114, 69, + 97, 0, 12, 64, 32, 15, 0, 9, 117, 130, 82, 82, + 114, 65, 145, 50, 146, 34, 146, 34, 146, 34, 146, 34, + 146, 34, 146, 49, 145, 66, 114, 82, 82, 133, 0, 12, + 27, 13, 0, 8, 25, 98, 66, 82, 82, 66, 82, 66, + 82, 66, 82, 66, 66, 86, 114, 178, 178, 178, 178, 150, + 0, 10, 80, 39, 15, 0, 9, 117, 130, 82, 82, 114, + 66, 129, 51, 130, 35, 130, 34, 146, 34, 146, 34, 146, + 35, 130, 50, 129, 66, 114, 82, 82, 133, 193, 210, 81, + 89, 82, 52, 240, 240, 64, 33, 16, 0, 10, 9, 146, + 66, 130, 82, 114, 82, 114, 82, 114, 66, 134, 162, 34, + 162, 49, 162, 50, 146, 66, 130, 67, 114, 82, 86, 53, + 0, 12, 32, 27, 13, 0, 8, 71, 82, 66, 66, 97, + 66, 178, 195, 181, 165, 179, 178, 33, 130, 34, 114, 50, + 82, 65, 22, 0, 10, 32, 25, 16, 0, 10, 28, 50, + 66, 66, 33, 82, 81, 130, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 198, 0, 12, 96, 34, 17, 0, 10, 86, + 69, 66, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, + 129, 98, 129, 98, 129, 98, 129, 98, 129, 113, 113, 130, + 82, 165, 0, 13, 80, 32, 17, 0, 10, 86, 69, 66, + 129, 98, 129, 114, 97, 130, 97, 146, 81, 146, 65, 178, + 49, 178, 33, 194, 33, 210, 17, 211, 242, 241, 0, 13, + 112, 50, 23, 0, 14, 54, 38, 52, 66, 98, 98, 82, + 98, 97, 114, 82, 97, 114, 83, 81, 114, 83, 65, 146, + 49, 33, 65, 146, 49, 34, 33, 162, 33, 50, 33, 178, + 17, 65, 33, 178, 17, 67, 195, 83, 210, 97, 225, 113, + 0, 18, 32, 32, 16, 0, 10, 22, 37, 82, 82, 130, + 65, 146, 49, 178, 17, 211, 210, 227, 193, 19, 177, 34, + 161, 66, 129, 83, 98, 98, 70, 38, 0, 12, 32, 29, + 16, 0, 10, 6, 68, 66, 114, 82, 113, 114, 81, 145, + 81, 146, 49, 177, 49, 178, 17, 210, 226, 226, 226, 226, + 198, 0, 12, 96, 26, 14, 0, 9, 10, 50, 98, 65, + 99, 178, 178, 178, 179, 178, 178, 178, 179, 97, 66, 113, + 50, 113, 59, 0, 10, 112, 24, 7, 240, 240, 85, 34, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 85, 144, 24, 7, 240, 240, 81, 97, + 97, 113, 97, 97, 97, 113, 97, 97, 97, 97, 113, 97, + 97, 97, 113, 97, 97, 144, 24, 7, 240, 240, 85, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 37, 144, 16, 13, 0, 8, 97, 179, + 146, 33, 114, 65, 82, 97, 49, 145, 0, 23, 8, 12, + 0, 31, 74, 240, 240, 128, 11, 5, 240, 162, 50, 65, + 81, 65, 0, 9, 80, 22, 11, 0, 14, 4, 97, 50, + 81, 50, 146, 116, 82, 34, 66, 50, 66, 50, 17, 55, + 0, 8, 80, 29, 11, 0, 7, 2, 131, 146, 146, 146, + 146, 19, 83, 34, 66, 66, 50, 66, 50, 66, 50, 66, + 50, 66, 50, 50, 70, 0, 8, 96, 19, 9, 0, 11, + 68, 66, 49, 34, 65, 34, 114, 114, 114, 130, 49, 68, + 0, 7, 16, 29, 11, 0, 7, 82, 146, 146, 146, 146, + 83, 18, 66, 35, 50, 66, 50, 66, 50, 66, 50, 66, + 50, 66, 66, 50, 87, 0, 8, 64, 18, 10, 0, 12, + 100, 82, 49, 50, 66, 40, 34, 130, 130, 146, 49, 84, + 0, 8, 22, 9, 0, 6, 19, 82, 17, 66, 114, 114, + 86, 82, 114, 114, 114, 114, 114, 114, 85, 0, 7, 32, + 30, 12, 0, 15, 36, 34, 49, 66, 17, 34, 66, 66, + 66, 66, 66, 82, 34, 116, 98, 162, 182, 113, 51, 50, + 97, 50, 97, 71, 240, 16, 29, 13, 0, 8, 50, 163, + 178, 178, 178, 178, 19, 115, 34, 98, 50, 98, 50, 98, + 50, 98, 50, 98, 50, 98, 50, 69, 21, 0, 10, 19, + 6, 240, 240, 18, 66, 240, 114, 66, 66, 66, 66, 66, + 66, 66, 52, 240, 240, 128, 23, 7, 240, 240, 130, 82, + 240, 178, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 33, 33, 51, 176, 28, 13, 0, 8, 50, 163, 178, + 178, 178, 178, 52, 66, 65, 98, 49, 114, 18, 133, 130, + 34, 114, 50, 98, 66, 54, 20, 0, 10, 21, 8, 240, + 240, 194, 83, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 70, 0, 6, 32, 34, 19, 0, 24, 2, 20, + 35, 100, 36, 34, 98, 50, 66, 98, 50, 66, 98, 50, + 66, 98, 50, 66, 98, 50, 66, 98, 50, 66, 69, 20, + 37, 0, 14, 64, 24, 13, 0, 16, 66, 19, 100, 34, + 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, + 69, 21, 0, 10, 23, 11, 0, 14, 5, 82, 50, 50, + 82, 34, 82, 34, 82, 34, 82, 34, 82, 50, 50, 85, + 0, 8, 96, 28, 12, 0, 15, 34, 19, 84, 34, 82, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 50, 86, + 98, 162, 162, 162, 133, 240, 64, 26, 12, 0, 15, 38, + 82, 50, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 82, 50, 102, 162, 162, 162, 162, 149, 224, 17, 9, 0, + 11, 66, 18, 54, 66, 114, 114, 114, 114, 114, 85, 0, + 7, 32, 18, 9, 0, 11, 53, 49, 65, 49, 131, 132, + 115, 114, 33, 66, 38, 0, 7, 16, 21, 9, 0, 7, + 17, 129, 129, 114, 87, 66, 114, 114, 114, 114, 114, 114, + 33, 83, 0, 7, 16, 24, 11, 0, 13, 99, 35, 66, + 50, 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, 66, + 50, 87, 0, 8, 64, 23, 12, 0, 15, 4, 51, 65, + 81, 82, 49, 113, 49, 113, 49, 114, 17, 145, 17, 146, + 177, 0, 9, 96, 32, 16, 0, 20, 4, 20, 35, 65, + 65, 65, 81, 65, 49, 98, 35, 33, 113, 33, 17, 33, + 115, 33, 17, 131, 35, 145, 65, 161, 65, 0, 12, 96, + 22, 13, 0, 16, 52, 36, 66, 65, 114, 33, 147, 177, + 177, 17, 145, 34, 113, 66, 68, 37, 0, 10, 27, 12, + 0, 15, 4, 51, 65, 81, 82, 49, 113, 49, 113, 49, + 114, 17, 145, 17, 146, 177, 161, 177, 161, 132, 131, 240, + 96, 20, 10, 0, 12, 86, 65, 50, 49, 50, 129, 130, + 114, 114, 65, 50, 49, 55, 0, 7, 112, 24, 6, 240, + 240, 49, 66, 66, 66, 66, 66, 66, 66, 65, 50, 97, + 82, 66, 66, 66, 66, 66, 66, 81, 128, 22, 3, 241, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 80, 23, 6, 240, 241, 82, + 66, 66, 66, 66, 66, 66, 81, 98, 49, 66, 66, 66, + 66, 66, 66, 66, 65, 176, 11, 11, 0, 18, 19, 49, + 34, 36, 0, 14, 16, 4, 8, 0, 25, 18, 4, 240, + 240, 162, 34, 113, 49, 49, 49, 49, 49, 49, 34, 34, + 34, 34, 96, 33, 9, 0, 7, 65, 129, 113, 129, 84, + 66, 17, 17, 34, 33, 17, 34, 33, 66, 33, 66, 17, + 82, 17, 99, 33, 68, 81, 113, 129, 129, 113, 129, 128, + 28, 15, 0, 10, 21, 146, 50, 114, 66, 114, 210, 226, + 154, 161, 225, 225, 147, 33, 129, 51, 81, 33, 72, 52, + 51, 0, 11, 96, 24, 10, 0, 12, 65, 20, 17, 49, + 65, 49, 97, 33, 97, 33, 97, 33, 97, 49, 65, 49, + 20, 17, 0, 9, 28, 13, 0, 8, 20, 67, 65, 82, + 82, 65, 113, 65, 114, 33, 146, 17, 116, 18, 146, 178, + 135, 146, 178, 178, 149, 0, 10, 48, 19, 3, 241, 33, + 33, 33, 33, 33, 33, 33, 177, 33, 33, 33, 33, 33, + 33, 33, 80, 35, 10, 0, 6, 68, 81, 50, 65, 50, + 66, 34, 82, 146, 116, 66, 50, 49, 82, 33, 97, 34, + 81, 51, 33, 84, 130, 145, 82, 49, 66, 49, 66, 49, + 99, 224, 11, 8, 0, 6, 2, 34, 34, 34, 0, 17, + 32, 45, 17, 0, 11, 37, 162, 82, 113, 51, 17, 17, + 81, 34, 50, 33, 50, 18, 81, 33, 49, 34, 145, 33, + 34, 145, 33, 34, 145, 33, 34, 145, 33, 50, 114, 49, + 68, 49, 81, 145, 113, 113, 151, 0, 13, 64, 16, 8, + 240, 240, 179, 81, 33, 98, 51, 17, 49, 50, 51, 0, + 14, 64, 19, 8, 0, 12, 33, 33, 49, 33, 50, 17, + 66, 18, 65, 33, 81, 33, 0, 7, 32, 11, 12, 0, + 18, 10, 177, 177, 177, 0, 13, 96, 8, 8, 0, 14, + 6, 0, 10, 32, 48, 17, 0, 11, 37, 162, 82, 119, + 49, 81, 34, 50, 33, 50, 34, 50, 33, 49, 50, 50, + 49, 33, 53, 81, 33, 50, 18, 81, 33, 50, 34, 65, + 33, 50, 50, 34, 49, 20, 35, 17, 81, 145, 113, 113, + 151, 0, 13, 64, 8, 8, 0, 7, 6, 0, 17, 32, + 19, 9, 0, 5, 115, 81, 49, 49, 81, 33, 81, 33, + 81, 49, 49, 83, 0, 15, 16, 19, 11, 0, 11, 65, + 161, 161, 161, 161, 105, 97, 161, 161, 161, 240, 41, 0, + 7, 16, 17, 7, 240, 240, 99, 49, 49, 33, 49, 81, + 81, 81, 81, 101, 0, 10, 96, 15, 7, 240, 240, 84, + 113, 51, 98, 97, 33, 49, 51, 0, 11, 96, 11, 5, + 240, 178, 50, 49, 49, 65, 0, 9, 112, 30, 13, 0, + 18, 18, 50, 98, 50, 97, 65, 113, 65, 113, 50, 98, + 50, 33, 50, 34, 19, 49, 19, 34, 65, 178, 178, 178, + 178, 240, 144, 42, 11, 0, 7, 23, 51, 33, 68, 33, + 68, 33, 68, 33, 68, 33, 83, 33, 113, 33, 113, 33, + 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, 113, 33, + 113, 33, 113, 33, 113, 33, 113, 33, 240, 9, 4, 0, + 6, 2, 34, 0, 5, 96, 10, 6, 0, 14, 65, 65, + 97, 97, 36, 128, 14, 5, 240, 193, 35, 65, 65, 65, + 65, 65, 65, 0, 7, 96, 17, 7, 240, 240, 99, 49, + 49, 33, 49, 33, 49, 34, 17, 81, 0, 12, 96, 21, + 8, 0, 11, 1, 33, 81, 17, 81, 33, 81, 33, 65, + 33, 49, 33, 49, 33, 0, 7, 64, 39, 16, 0, 10, + 33, 113, 83, 97, 129, 97, 129, 81, 145, 65, 161, 65, + 161, 49, 65, 97, 49, 65, 145, 66, 129, 65, 17, 129, + 49, 33, 113, 70, 81, 113, 97, 129, 0, 12, 64, 40, + 16, 0, 10, 33, 129, 67, 113, 113, 97, 129, 97, 129, + 81, 145, 65, 161, 65, 35, 81, 49, 33, 49, 113, 49, + 49, 113, 97, 113, 97, 113, 97, 129, 81, 49, 65, 86, + 0, 12, 32, 43, 16, 0, 10, 4, 113, 65, 49, 81, + 145, 65, 115, 81, 146, 49, 113, 49, 49, 113, 49, 33, + 65, 67, 33, 66, 145, 49, 17, 129, 49, 33, 113, 49, + 49, 113, 54, 81, 129, 81, 145, 0, 12, 48, 18, 8, + 0, 10, 50, 98, 240, 129, 113, 113, 83, 53, 50, 97, + 113, 133, 68, 160, 36, 16, 81, 242, 240, 17, 0, 5, + 98, 227, 193, 18, 193, 34, 177, 34, 161, 50, 161, 66, + 145, 66, 136, 129, 98, 113, 98, 97, 114, 97, 115, 53, + 54, 0, 12, 32, 35, 16, 145, 226, 209, 0, 5, 98, + 227, 209, 17, 193, 34, 177, 34, 162, 49, 161, 66, 145, + 66, 136, 129, 98, 113, 98, 97, 114, 97, 115, 53, 69, + 0, 12, 32, 36, 16, 113, 227, 178, 49, 240, 240, 226, + 227, 193, 18, 193, 34, 177, 34, 161, 50, 161, 66, 145, + 66, 136, 129, 98, 113, 98, 97, 114, 97, 115, 53, 54, + 0, 12, 32, 36, 16, 240, 84, 33, 129, 51, 240, 240, + 226, 227, 211, 193, 34, 177, 34, 161, 50, 161, 66, 145, + 66, 136, 129, 98, 113, 98, 97, 114, 97, 115, 53, 54, + 0, 12, 32, 36, 17, 240, 98, 50, 162, 50, 0, 5, + 99, 227, 225, 17, 209, 34, 193, 34, 177, 51, 161, 66, + 161, 66, 153, 129, 98, 129, 98, 113, 130, 97, 130, 69, + 70, 0, 13, 36, 17, 99, 209, 49, 193, 49, 211, 240, + 240, 19, 227, 227, 209, 34, 193, 34, 193, 35, 161, 51, + 161, 66, 153, 129, 83, 129, 98, 113, 130, 97, 130, 69, + 55, 0, 13, 42, 24, 0, 15, 125, 227, 98, 193, 18, + 113, 193, 18, 240, 65, 34, 65, 209, 50, 65, 209, 55, + 199, 50, 177, 82, 65, 177, 82, 241, 98, 129, 81, 114, + 129, 66, 114, 113, 54, 60, 0, 18, 48, 29, 14, 0, + 9, 39, 83, 67, 50, 114, 50, 178, 194, 194, 194, 194, + 194, 210, 209, 129, 82, 66, 117, 177, 209, 211, 209, 163, + 240, 80, 33, 15, 50, 226, 226, 240, 240, 139, 98, 98, + 82, 113, 82, 210, 65, 130, 65, 135, 130, 50, 130, 65, + 130, 210, 129, 66, 129, 66, 113, 60, 0, 11, 80, 33, + 15, 114, 195, 178, 240, 240, 139, 98, 97, 98, 113, 82, + 210, 65, 130, 65, 135, 130, 50, 130, 65, 130, 210, 129, + 66, 113, 82, 113, 60, 0, 11, 80, 34, 15, 82, 196, + 162, 49, 241, 240, 91, 98, 98, 82, 113, 82, 210, 65, + 130, 65, 135, 130, 50, 130, 65, 130, 210, 129, 66, 129, + 66, 113, 60, 0, 11, 80, 33, 14, 240, 34, 34, 130, + 34, 240, 240, 59, 82, 97, 82, 194, 194, 65, 114, 65, + 119, 114, 50, 114, 65, 114, 194, 194, 113, 66, 98, 44, + 0, 10, 96, 23, 8, 2, 99, 114, 240, 86, 66, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, + 6, 32, 23, 8, 66, 83, 66, 240, 86, 66, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 6, + 32, 24, 8, 34, 84, 50, 34, 240, 54, 66, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 6, + 32, 24, 8, 130, 34, 34, 34, 240, 54, 66, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 6, + 32, 33, 16, 0, 10, 9, 146, 82, 114, 113, 98, 114, + 82, 129, 82, 130, 39, 82, 66, 130, 66, 130, 66, 130, + 66, 114, 82, 114, 82, 98, 74, 0, 12, 96, 47, 16, + 240, 99, 33, 130, 35, 240, 240, 132, 85, 67, 97, 99, + 97, 97, 18, 81, 97, 34, 65, 97, 34, 65, 97, 50, + 49, 97, 66, 33, 97, 66, 33, 97, 82, 17, 97, 99, + 97, 99, 97, 114, 69, 97, 0, 12, 64, 35, 15, 65, + 226, 226, 241, 240, 181, 130, 82, 82, 114, 65, 145, 50, + 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 49, + 145, 66, 114, 82, 82, 133, 0, 12, 35, 15, 129, 210, + 194, 193, 240, 213, 130, 82, 82, 114, 65, 145, 50, 146, + 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 49, 145, + 66, 114, 82, 82, 133, 0, 12, 37, 15, 97, 211, 177, + 49, 145, 81, 240, 149, 130, 82, 82, 114, 65, 145, 50, + 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 49, + 145, 66, 114, 82, 82, 133, 0, 12, 36, 15, 240, 67, + 162, 36, 240, 240, 149, 130, 82, 82, 114, 65, 145, 50, + 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, 49, + 145, 66, 114, 82, 82, 133, 0, 12, 37, 15, 240, 50, + 50, 130, 50, 240, 240, 149, 130, 82, 82, 114, 65, 145, + 50, 146, 34, 146, 34, 146, 34, 146, 34, 146, 34, 146, + 49, 145, 66, 114, 82, 82, 133, 0, 12, 21, 9, 0, + 11, 33, 81, 49, 50, 65, 18, 98, 99, 82, 18, 50, + 50, 33, 81, 0, 8, 16, 42, 15, 0, 9, 117, 49, + 66, 83, 66, 114, 65, 113, 17, 50, 98, 18, 34, 82, + 34, 34, 66, 50, 34, 50, 66, 34, 34, 82, 34, 18, + 98, 49, 17, 113, 66, 114, 67, 82, 65, 53, 0, 12, + 38, 17, 82, 242, 240, 33, 240, 240, 214, 69, 66, 129, + 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, + 98, 129, 98, 129, 98, 129, 113, 113, 130, 82, 165, 0, + 13, 80, 37, 17, 146, 226, 226, 225, 240, 198, 69, 66, + 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, + 129, 98, 129, 98, 129, 98, 129, 113, 113, 130, 82, 165, + 0, 13, 80, 38, 17, 113, 243, 209, 49, 177, 240, 230, + 69, 66, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, + 129, 98, 129, 98, 129, 98, 129, 98, 129, 113, 113, 130, + 82, 165, 0, 13, 80, 39, 17, 240, 98, 50, 162, 50, + 240, 240, 166, 69, 66, 129, 98, 129, 98, 129, 98, 129, + 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, 98, 129, + 113, 113, 130, 82, 165, 0, 13, 80, 32, 16, 145, 226, + 210, 209, 240, 166, 68, 66, 114, 82, 113, 114, 81, 145, + 81, 146, 49, 177, 49, 178, 17, 210, 226, 226, 226, 226, + 198, 0, 12, 96, 28, 13, 0, 8, 22, 146, 182, 114, + 66, 82, 81, 82, 82, 66, 82, 66, 82, 66, 82, 66, + 66, 86, 114, 178, 150, 0, 10, 80, 35, 12, 0, 8, + 4, 113, 50, 82, 50, 82, 49, 98, 33, 84, 17, 130, + 17, 130, 18, 114, 34, 98, 50, 82, 66, 66, 81, 66, + 17, 49, 36, 20, 0, 9, 48, 27, 11, 0, 7, 2, + 161, 161, 177, 240, 84, 97, 50, 66, 50, 146, 116, 82, + 34, 66, 50, 66, 50, 17, 55, 0, 8, 80, 27, 11, + 0, 7, 65, 146, 145, 145, 240, 84, 97, 50, 81, 50, + 146, 116, 82, 34, 66, 50, 66, 50, 17, 55, 0, 8, + 80, 29, 11, 0, 7, 33, 162, 129, 17, 113, 49, 240, + 52, 97, 50, 81, 50, 146, 116, 82, 34, 66, 50, 66, + 50, 17, 55, 0, 8, 80, 26, 11, 0, 8, 51, 113, + 36, 240, 212, 97, 50, 81, 50, 146, 116, 82, 34, 66, + 50, 66, 50, 17, 55, 0, 8, 80, 28, 11, 0, 8, + 50, 34, 82, 34, 240, 212, 97, 50, 81, 50, 146, 116, + 82, 34, 66, 50, 66, 50, 17, 52, 18, 0, 8, 80, + 29, 11, 0, 7, 19, 113, 49, 97, 49, 115, 240, 53, + 82, 50, 66, 50, 146, 116, 82, 34, 66, 50, 66, 50, + 17, 55, 0, 8, 80, 26, 15, 0, 18, 116, 52, 50, + 51, 50, 49, 50, 81, 120, 69, 145, 50, 130, 50, 130, + 51, 65, 52, 52, 0, 11, 80, 22, 9, 0, 11, 68, + 66, 49, 34, 65, 34, 114, 114, 114, 130, 49, 68, 113, + 113, 145, 145, 99, 192, 23, 10, 0, 6, 65, 146, 145, + 161, 240, 36, 82, 49, 50, 66, 40, 34, 130, 130, 146, + 49, 84, 0, 8, 23, 10, 0, 6, 114, 130, 129, 129, + 240, 36, 82, 49, 50, 66, 40, 34, 130, 130, 146, 49, + 84, 0, 8, 24, 10, 0, 6, 97, 130, 129, 17, 97, + 49, 244, 82, 49, 50, 66, 40, 34, 130, 130, 146, 49, + 84, 0, 8, 23, 10, 0, 7, 82, 34, 66, 34, 240, + 164, 82, 49, 50, 65, 56, 34, 130, 130, 146, 49, 84, + 0, 8, 20, 8, 240, 240, 162, 98, 114, 113, 242, 83, + 98, 98, 98, 98, 98, 98, 70, 0, 6, 32, 20, 7, + 240, 240, 145, 82, 81, 97, 194, 67, 82, 82, 82, 82, + 82, 82, 53, 240, 240, 224, 21, 8, 0, 6, 34, 81, + 33, 49, 65, 194, 83, 98, 98, 98, 98, 98, 98, 70, + 0, 6, 32, 21, 7, 240, 240, 194, 18, 34, 18, 240, + 50, 82, 82, 82, 82, 82, 82, 82, 68, 240, 240, 224, + 32, 11, 0, 5, 97, 177, 33, 130, 129, 17, 113, 34, + 162, 86, 66, 51, 34, 82, 34, 82, 34, 82, 34, 82, + 34, 81, 66, 50, 84, 0, 8, 112, 30, 13, 0, 10, + 19, 33, 97, 35, 240, 240, 50, 19, 100, 34, 98, 50, + 98, 50, 98, 50, 98, 50, 98, 50, 98, 50, 69, 21, + 0, 10, 28, 11, 0, 7, 17, 162, 161, 177, 240, 69, + 82, 50, 50, 82, 34, 82, 34, 82, 34, 82, 34, 82, + 50, 50, 85, 0, 8, 96, 28, 11, 0, 7, 66, 146, + 145, 145, 240, 69, 82, 50, 50, 82, 34, 82, 34, 82, + 34, 82, 34, 82, 50, 50, 85, 0, 8, 96, 30, 11, + 0, 7, 49, 161, 145, 17, 113, 49, 240, 37, 82, 50, + 50, 82, 34, 82, 34, 82, 34, 82, 34, 82, 50, 50, + 85, 0, 8, 96, 28, 11, 0, 8, 67, 33, 65, 35, + 240, 213, 82, 50, 50, 82, 34, 82, 34, 82, 34, 82, + 34, 82, 50, 50, 85, 0, 8, 96, 28, 11, 0, 8, + 50, 34, 82, 34, 240, 213, 82, 50, 50, 82, 34, 82, + 34, 82, 34, 82, 34, 82, 50, 50, 85, 0, 8, 96, + 14, 12, 0, 15, 66, 162, 240, 250, 240, 50, 162, 0, + 11, 32, 28, 11, 0, 14, 4, 33, 50, 50, 50, 66, + 50, 49, 18, 34, 33, 34, 34, 17, 50, 35, 66, 50, + 50, 49, 36, 0, 8, 96, 29, 11, 0, 7, 17, 162, + 161, 177, 240, 35, 35, 66, 50, 66, 50, 66, 50, 66, + 50, 66, 50, 66, 50, 66, 50, 87, 0, 8, 64, 29, + 11, 0, 7, 66, 145, 161, 145, 240, 35, 35, 66, 50, + 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, + 87, 0, 8, 64, 30, 11, 0, 7, 49, 146, 145, 17, + 113, 49, 243, 35, 66, 50, 66, 50, 66, 50, 66, 50, + 66, 50, 66, 50, 66, 50, 87, 0, 8, 64, 29, 11, + 0, 8, 50, 34, 82, 34, 240, 179, 35, 66, 50, 66, + 50, 66, 50, 66, 50, 66, 50, 66, 50, 66, 50, 87, + 0, 8, 64, 32, 12, 0, 8, 34, 162, 161, 161, 240, + 52, 51, 65, 81, 82, 49, 113, 49, 113, 49, 114, 17, + 145, 17, 146, 177, 161, 177, 161, 132, 131, 240, 96, 33, + 12, 0, 7, 98, 147, 162, 162, 162, 162, 19, 99, 34, + 82, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 50, + 86, 98, 162, 162, 162, 133, 240, 64, 31, 12, 0, 9, + 34, 34, 98, 34, 240, 212, 51, 50, 81, 81, 65, 98, + 49, 113, 33, 129, 33, 131, 162, 161, 177, 161, 177, 131, + 146, 240, 112, +}; + +//***************************************************************************** +// +// The glyph offset table for the 20 point Theanooldstyle font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanooldstyle20[] = +{ + 0, 5, 23, 42, 74, 115, 156, 193, + 205, 229, 253, 277, 293, 304, 312, 320, + 344, 377, 400, 426, 452, 478, 503, 533, + 555, 586, 615, 626, 641, 658, 668, 685, + 705, 761, 792, 823, 848, 881, 911, 938, + 968, 1002, 1023, 1049, 1084, 1108, 1162, 1204, + 1236, 1263, 1302, 1335, 1362, 1387, 1421, 1453, + 1503, 1535, 1564, 1590, 1614, 1638, 1662, 1678, + 1686, 1697, 1719, 1748, 1767, 1796, 1814, 1836, + 1866, 1895, 1914, 1937, 1965, 1986, 2020, 2044, + 2067, 2095, 2121, 2138, 2156, 2177, 2201, 2224, + 2256, 2278, 2305, 2325, 2349, 2371, 2394, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2405, 2409, 2427, 2460, 2488, 2512, 2540, 2559, + 2594, 2605, 2650, 2666, 2685, 2696, 2704, 2752, + 2760, 2779, 2798, 2815, 2830, 2841, 2871, 2913, + 2922, 2932, 2946, 2963, 2984, 3023, 3063, 3106, + 3124, 3160, 3195, 3231, 3267, 3303, 3339, 3381, + 3410, 3443, 3476, 3510, 3543, 3566, 3589, 3613, + 3637, 3670, 3717, 3752, 3787, 3824, 3860, 3897, + 3918, 3960, 3998, 4035, 4073, 4112, 4144, 4172, + 4207, 4234, 4261, 4290, 4316, 4344, 4373, 4399, + 4421, 4444, 4467, 4491, 4514, 4534, 4554, 4575, + 4596, 4628, 4658, 4686, 4714, 4744, 4772, 4800, + 4814, 4842, 4871, 4900, 4930, 4959, 4991, 5024, +}; + +//***************************************************************************** +// +// The font definition for the 20 point Theanooldstyle font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanooldstyle20 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 21, + + // + // The height of the font. + // + 25, + + // + // The baseline of the font. + // + 19, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanooldstyle20, + + // + // A pointer to the actual font data + // + g_pui8Theanooldstyle20Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanooldstyle22.c b/third_party/fonts/ofl/fonts/fonttheanooldstyle22.c new file mode 100644 index 0000000..e0f1001 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanooldstyle22.c @@ -0,0 +1,693 @@ +//***************************************************************************** +// +// fonttheanooldstyle22.c - Font definition for the 22pt Theanooldstyle font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanooldstyle +// Size: 22 point +// Bold: no +// Italic: no +// Memory usage: 5884 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 22 point Theanooldstyle font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanooldstyle22Data[5682] = +{ + 5, 9, 0, 32, 80, 21, 5, 240, 243, 35, 35, 35, + 35, 49, 65, 65, 65, 65, 65, 65, 131, 35, 35, 240, + 240, 112, 19, 8, 0, 6, 2, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 49, 49, 0, 17, 32, 37, 13, 0, + 10, 33, 65, 113, 65, 113, 49, 129, 49, 113, 65, 75, + 81, 65, 113, 49, 129, 49, 113, 65, 91, 65, 49, 129, + 49, 129, 49, 113, 65, 113, 65, 0, 12, 16, 46, 12, + 0, 6, 65, 177, 150, 82, 17, 34, 50, 33, 50, 34, + 33, 50, 34, 33, 35, 35, 17, 132, 148, 164, 129, 34, + 113, 50, 50, 17, 65, 35, 17, 65, 34, 33, 65, 50, + 17, 34, 85, 145, 177, 0, 8, 48, 50, 17, 0, 13, + 2, 113, 97, 33, 81, 98, 34, 65, 98, 34, 49, 114, + 34, 49, 114, 34, 33, 145, 33, 49, 162, 49, 241, 51, + 161, 34, 18, 129, 34, 50, 113, 34, 50, 97, 50, 50, + 97, 50, 50, 81, 82, 18, 211, 0, 15, 48, 42, 18, + 0, 14, 36, 210, 34, 178, 50, 178, 50, 178, 34, 194, + 33, 227, 227, 69, 66, 19, 66, 82, 51, 50, 66, 82, + 49, 82, 83, 33, 82, 100, 98, 115, 115, 65, 19, 118, + 52, 0, 16, 16, 12, 4, 240, 146, 34, 34, 34, 34, + 49, 0, 8, 96, 27, 7, 0, 5, 97, 97, 81, 81, + 97, 82, 81, 82, 82, 82, 82, 82, 82, 82, 82, 97, + 98, 97, 97, 113, 113, 97, 144, 27, 7, 240, 240, 193, + 97, 113, 98, 97, 98, 97, 98, 82, 82, 82, 82, 82, + 82, 82, 66, 82, 81, 82, 81, 81, 97, 208, 26, 10, + 0, 7, 114, 130, 81, 34, 18, 34, 17, 34, 49, 19, + 99, 82, 17, 19, 33, 33, 34, 82, 130, 0, 16, 112, + 18, 13, 0, 18, 65, 193, 193, 193, 193, 123, 113, 193, + 193, 193, 193, 0, 12, 32, 12, 5, 0, 12, 66, 51, + 65, 65, 49, 49, 240, 64, 8, 9, 0, 19, 23, 0, + 12, 80, 10, 5, 0, 11, 115, 35, 35, 240, 240, 112, + 27, 8, 0, 6, 81, 97, 113, 113, 113, 98, 97, 113, + 113, 113, 97, 113, 113, 113, 98, 97, 113, 113, 113, 97, + 113, 240, 128, 37, 13, 0, 10, 35, 130, 50, 82, 82, + 66, 82, 65, 113, 50, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 34, 114, 49, 113, 66, 82, 66, 82, 82, 50, + 131, 0, 12, 16, 25, 7, 240, 240, 242, 67, 49, 18, + 33, 34, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 0, 6, 48, 29, 12, 0, 9, 53, 97, 66, + 65, 98, 50, 82, 50, 82, 162, 146, 161, 161, 161, 161, + 161, 161, 97, 49, 113, 57, 41, 0, 10, 112, 30, 11, + 0, 8, 69, 82, 50, 50, 82, 35, 66, 50, 66, 145, + 145, 100, 178, 161, 162, 146, 33, 98, 34, 82, 34, 66, + 69, 0, 10, 32, 30, 14, 0, 11, 65, 194, 179, 161, + 18, 145, 34, 145, 34, 129, 50, 113, 66, 113, 66, 97, + 82, 92, 146, 194, 194, 194, 194, 0, 12, 112, 28, 12, + 0, 8, 65, 72, 71, 81, 177, 182, 103, 81, 67, 163, + 162, 162, 162, 162, 33, 113, 50, 82, 51, 50, 85, 0, + 11, 32, 32, 12, 0, 9, 98, 130, 146, 146, 146, 162, + 146, 36, 68, 50, 51, 67, 34, 98, 34, 98, 34, 98, + 49, 98, 50, 66, 81, 51, 100, 0, 11, 16, 25, 12, + 0, 9, 25, 56, 49, 113, 49, 113, 161, 177, 177, 161, + 177, 162, 162, 161, 162, 162, 147, 147, 0, 11, 32, 35, + 12, 0, 9, 53, 82, 66, 50, 98, 34, 98, 34, 98, + 35, 81, 67, 49, 101, 133, 82, 51, 65, 83, 34, 98, + 34, 98, 34, 98, 50, 66, 85, 0, 11, 16, 34, 12, + 0, 9, 52, 114, 34, 82, 66, 50, 97, 50, 98, 34, + 98, 34, 98, 34, 98, 50, 67, 50, 49, 18, 68, 18, + 162, 161, 162, 146, 146, 130, 0, 10, 14, 5, 0, 7, + 67, 35, 35, 240, 115, 35, 35, 240, 240, 112, 16, 5, + 0, 7, 67, 35, 35, 240, 194, 51, 65, 65, 49, 49, + 240, 64, 18, 13, 0, 18, 115, 131, 131, 146, 146, 161, + 210, 210, 210, 210, 209, 0, 11, 96, 10, 13, 0, 24, + 59, 240, 219, 0, 16, 64, 18, 13, 0, 17, 115, 195, + 195, 194, 210, 209, 162, 146, 146, 146, 161, 0, 12, 96, + 22, 8, 0, 6, 4, 69, 129, 113, 113, 98, 52, 67, + 81, 113, 113, 113, 227, 83, 83, 0, 7, 80, 62, 20, + 0, 18, 69, 195, 82, 146, 145, 114, 177, 82, 209, 50, + 99, 18, 33, 50, 66, 35, 49, 35, 50, 51, 49, 34, + 66, 50, 65, 34, 50, 66, 65, 34, 50, 50, 65, 50, + 34, 65, 81, 50, 34, 50, 65, 66, 34, 20, 49, 98, + 19, 52, 114, 240, 66, 161, 131, 98, 183, 0, 8, 64, + 35, 18, 0, 14, 50, 243, 241, 18, 225, 18, 209, 35, + 193, 50, 193, 50, 177, 67, 161, 82, 153, 145, 99, 129, + 114, 113, 130, 113, 131, 82, 131, 69, 71, 0, 16, 36, + 14, 0, 10, 73, 114, 67, 82, 98, 66, 98, 66, 98, + 66, 98, 66, 82, 87, 114, 67, 82, 82, 82, 98, 66, + 98, 66, 98, 66, 98, 66, 82, 58, 0, 12, 96, 29, + 15, 0, 11, 119, 98, 83, 66, 114, 50, 145, 49, 210, + 210, 210, 210, 210, 210, 226, 210, 145, 66, 113, 98, 81, + 149, 0, 13, 96, 37, 17, 0, 12, 105, 162, 83, 114, + 114, 98, 130, 82, 130, 82, 146, 66, 146, 66, 146, 66, + 146, 66, 146, 66, 146, 66, 145, 82, 130, 82, 114, 98, + 98, 90, 0, 15, 96, 33, 16, 0, 12, 12, 98, 99, + 82, 129, 82, 226, 226, 81, 130, 66, 136, 130, 66, 130, + 81, 130, 81, 130, 226, 145, 66, 145, 66, 115, 45, 0, + 14, 48, 30, 15, 0, 11, 44, 82, 99, 66, 129, 66, + 210, 210, 81, 114, 66, 120, 114, 66, 114, 81, 114, 81, + 114, 210, 210, 210, 182, 0, 14, 32, 34, 17, 0, 13, + 55, 130, 83, 98, 114, 82, 145, 81, 242, 242, 242, 242, + 118, 34, 146, 66, 146, 82, 130, 82, 130, 98, 114, 114, + 83, 149, 33, 0, 15, 48, 38, 17, 0, 12, 102, 54, + 66, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, + 107, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, + 114, 98, 114, 70, 54, 0, 15, 16, 23, 8, 0, 6, + 6, 66, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 70, 0, 7, 32, 28, 11, 0, 8, 86, + 114, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 145, 82, 34, 85, 115, 240, 224, 39, + 17, 0, 12, 102, 53, 82, 99, 98, 97, 130, 81, 146, + 65, 162, 49, 178, 33, 194, 19, 179, 19, 162, 50, 162, + 66, 146, 67, 130, 82, 130, 98, 114, 99, 70, 39, 0, + 15, 16, 26, 15, 0, 11, 38, 178, 210, 210, 210, 210, + 210, 210, 210, 210, 210, 210, 210, 129, 66, 129, 66, 114, + 45, 0, 13, 48, 60, 20, 0, 15, 5, 133, 67, 131, + 99, 131, 97, 18, 97, 18, 97, 18, 97, 18, 97, 18, + 82, 18, 97, 34, 65, 34, 97, 34, 65, 34, 97, 35, + 33, 50, 97, 50, 33, 50, 97, 50, 33, 50, 97, 52, + 66, 97, 67, 66, 97, 67, 66, 97, 81, 82, 69, 49, + 54, 0, 17, 96, 47, 17, 0, 12, 100, 101, 67, 113, + 100, 97, 97, 18, 97, 97, 19, 81, 97, 35, 65, 97, + 50, 65, 97, 51, 49, 97, 67, 33, 97, 82, 33, 97, + 83, 17, 97, 100, 97, 115, 97, 115, 97, 130, 69, 113, + 0, 15, 48, 37, 16, 0, 12, 70, 146, 66, 113, 129, + 82, 130, 65, 161, 50, 162, 34, 162, 34, 162, 34, 162, + 34, 162, 34, 162, 49, 161, 66, 130, 81, 129, 114, 66, + 150, 0, 14, 96, 30, 14, 0, 10, 73, 114, 67, 82, + 82, 82, 98, 66, 98, 66, 98, 66, 82, 82, 67, 87, + 114, 194, 194, 194, 194, 194, 166, 0, 13, 32, 44, 16, + 0, 12, 70, 146, 66, 113, 129, 82, 130, 65, 161, 50, + 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, 162, 49, + 161, 66, 130, 81, 129, 114, 66, 150, 209, 210, 97, 70, + 65, 82, 53, 0, 6, 64, 37, 17, 0, 12, 105, 162, + 67, 130, 83, 114, 98, 114, 98, 114, 98, 114, 82, 135, + 162, 34, 178, 50, 162, 51, 146, 66, 146, 82, 130, 83, + 114, 99, 70, 69, 0, 15, 16, 31, 14, 0, 11, 7, + 82, 67, 66, 98, 66, 113, 66, 195, 196, 182, 181, 194, + 210, 33, 146, 34, 130, 50, 114, 51, 82, 65, 37, 0, + 12, 112, 28, 17, 0, 12, 126, 50, 66, 66, 49, 82, + 81, 33, 98, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 214, 0, 15, 80, 38, 18, 0, 13, 70, 85, + 66, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 114, 113, 146, 66, 182, 0, 16, 80, 39, 19, 0, 14, + 39, 85, 67, 130, 114, 130, 115, 113, 146, 113, 146, 97, + 178, 81, 178, 81, 179, 49, 210, 49, 210, 49, 226, 17, + 242, 17, 240, 18, 240, 34, 240, 34, 0, 17, 96, 59, + 26, 0, 19, 71, 39, 53, 67, 99, 114, 98, 99, 113, + 114, 114, 113, 130, 98, 97, 146, 83, 97, 146, 81, 18, + 65, 178, 65, 18, 65, 178, 49, 35, 49, 178, 49, 50, + 33, 210, 17, 66, 33, 210, 17, 67, 17, 210, 17, 83, + 242, 99, 242, 98, 240, 17, 129, 0, 23, 112, 35, 18, + 0, 13, 71, 38, 83, 98, 130, 97, 162, 65, 179, 49, + 194, 33, 227, 243, 243, 241, 18, 209, 35, 177, 66, 162, + 82, 145, 99, 99, 100, 70, 40, 0, 16, 37, 18, 0, + 13, 71, 69, 67, 115, 98, 114, 115, 97, 146, 82, 147, + 65, 178, 49, 194, 49, 210, 17, 226, 17, 242, 240, 18, + 240, 18, 240, 18, 240, 18, 230, 0, 16, 80, 29, 16, + 0, 12, 44, 66, 99, 66, 114, 81, 114, 211, 195, 210, + 210, 211, 195, 210, 210, 211, 113, 67, 129, 66, 130, 61, + 0, 14, 48, 27, 7, 240, 240, 197, 34, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 85, 240, 16, 27, 8, 0, 6, 1, 113, + 129, 113, 113, 113, 114, 113, 113, 113, 113, 129, 113, 113, + 113, 114, 113, 113, 113, 113, 129, 240, 48, 27, 7, 240, + 240, 197, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 37, 240, 16, + 18, 13, 0, 10, 34, 164, 145, 34, 113, 66, 81, 98, + 49, 129, 209, 0, 26, 32, 8, 13, 0, 40, 91, 240, + 240, 176, 11, 5, 240, 242, 50, 66, 65, 65, 0, 11, + 64, 23, 11, 0, 16, 101, 82, 35, 65, 66, 146, 101, + 67, 34, 50, 66, 50, 66, 50, 66, 72, 0, 9, 112, + 32, 12, 0, 9, 18, 147, 162, 162, 162, 162, 162, 20, + 83, 50, 66, 82, 50, 82, 50, 82, 50, 82, 50, 82, + 50, 81, 66, 66, 65, 21, 0, 11, 20, 11, 0, 16, + 116, 82, 50, 66, 66, 34, 146, 146, 146, 147, 146, 65, + 100, 0, 10, 16, 33, 12, 0, 9, 114, 147, 162, 162, + 162, 162, 84, 18, 66, 51, 65, 82, 50, 82, 50, 82, + 50, 82, 50, 82, 50, 82, 66, 51, 84, 19, 0, 10, + 96, 20, 11, 0, 16, 116, 82, 50, 65, 81, 57, 34, + 146, 146, 147, 146, 65, 100, 0, 10, 16, 24, 10, 0, + 8, 4, 82, 18, 81, 130, 130, 130, 102, 98, 130, 130, + 130, 130, 130, 130, 130, 101, 0, 9, 48, 32, 13, 0, + 19, 101, 19, 50, 50, 33, 34, 82, 66, 82, 66, 82, + 82, 50, 117, 98, 177, 213, 166, 82, 82, 50, 98, 51, + 67, 71, 240, 240, 16, 33, 14, 0, 10, 98, 179, 194, + 194, 194, 194, 194, 35, 116, 34, 98, 66, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 69, 37, 0, + 12, 64, 20, 6, 240, 240, 114, 66, 240, 210, 51, 66, + 66, 66, 66, 66, 66, 66, 52, 240, 240, 224, 26, 7, + 240, 240, 242, 82, 240, 240, 50, 67, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 81, 49, 33, 51, 240, 48, + 32, 14, 0, 10, 98, 179, 194, 194, 194, 194, 194, 52, + 82, 66, 98, 50, 114, 33, 146, 17, 165, 146, 34, 130, + 50, 114, 66, 70, 21, 0, 12, 64, 23, 8, 0, 6, + 34, 83, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 70, 0, 7, 32, 38, 20, 0, 30, 18, + 35, 52, 85, 34, 17, 50, 82, 82, 66, 82, 82, 66, + 82, 82, 66, 82, 82, 66, 82, 82, 66, 82, 82, 66, + 82, 82, 66, 69, 21, 37, 0, 17, 96, 27, 14, 0, + 21, 18, 36, 85, 35, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 69, 22, 0, 12, 64, + 25, 12, 0, 18, 52, 98, 51, 66, 66, 50, 98, 34, + 98, 34, 98, 34, 98, 50, 66, 66, 66, 100, 0, 11, + 16, 32, 13, 0, 19, 82, 21, 68, 66, 66, 83, 50, + 98, 50, 98, 50, 98, 50, 98, 50, 82, 67, 66, 66, + 20, 98, 178, 178, 178, 165, 240, 240, 64, 31, 13, 0, + 19, 100, 33, 82, 51, 81, 82, 66, 82, 66, 82, 66, + 82, 66, 82, 66, 82, 82, 51, 100, 18, 178, 178, 178, + 178, 150, 240, 208, 19, 10, 0, 15, 34, 34, 51, 19, + 67, 114, 130, 130, 130, 130, 130, 101, 0, 9, 48, 20, + 9, 0, 13, 85, 49, 50, 49, 65, 50, 131, 131, 130, + 114, 33, 66, 38, 0, 8, 32, 21, 9, 0, 9, 49, + 129, 129, 114, 87, 66, 114, 114, 114, 114, 114, 114, 114, + 132, 0, 8, 16, 27, 12, 0, 18, 3, 51, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 51, 84, 19, 0, 10, 96, 24, 13, 0, 19, 69, + 51, 66, 81, 82, 81, 97, 65, 114, 49, 129, 33, 146, + 17, 162, 178, 178, 0, 12, 16, 37, 17, 0, 25, 68, + 21, 35, 50, 66, 65, 81, 66, 65, 82, 50, 49, 113, + 33, 18, 33, 113, 33, 18, 17, 130, 17, 33, 17, 146, + 51, 146, 50, 161, 81, 0, 15, 80, 25, 14, 0, 21, + 5, 37, 66, 66, 114, 49, 146, 17, 178, 194, 177, 18, + 145, 50, 98, 82, 68, 53, 0, 12, 64, 29, 13, 0, + 19, 69, 51, 65, 97, 82, 81, 97, 65, 114, 49, 114, + 33, 145, 33, 147, 178, 177, 193, 177, 193, 132, 147, 240, + 240, 96, 19, 10, 0, 15, 23, 50, 49, 130, 114, 114, + 130, 114, 114, 65, 49, 66, 40, 0, 9, 28, 9, 0, + 6, 19, 81, 114, 114, 114, 115, 114, 114, 114, 114, 98, + 82, 146, 130, 114, 114, 114, 99, 98, 114, 114, 129, 147, + 176, 25, 3, 240, 49, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 128, 28, 9, 240, 240, 243, 145, 130, 114, 114, 99, + 98, 114, 114, 114, 130, 146, 82, 98, 114, 114, 114, 115, + 114, 114, 114, 113, 83, 240, 11, 12, 0, 22, 100, 49, + 34, 52, 0, 18, 48, 5, 9, 0, 32, 80, 20, 5, + 0, 7, 67, 35, 35, 49, 65, 65, 65, 65, 65, 65, + 51, 35, 35, 35, 35, 192, 36, 11, 0, 9, 33, 145, + 161, 161, 145, 161, 116, 82, 35, 66, 33, 17, 50, 33, + 98, 33, 98, 33, 98, 17, 131, 131, 49, 100, 97, 161, + 145, 161, 161, 145, 240, 96, 34, 17, 0, 13, 85, 178, + 50, 146, 82, 130, 82, 130, 242, 242, 202, 177, 240, 17, + 240, 17, 240, 17, 180, 17, 161, 66, 98, 33, 73, 68, + 53, 0, 15, 48, 27, 11, 0, 16, 65, 21, 17, 50, + 50, 50, 82, 33, 113, 33, 113, 33, 113, 34, 82, 50, + 50, 49, 21, 17, 0, 11, 32, 31, 15, 0, 11, 36, + 69, 65, 113, 98, 97, 113, 81, 130, 49, 146, 49, 162, + 17, 148, 20, 146, 210, 169, 146, 210, 210, 210, 197, 0, + 13, 112, 21, 3, 240, 49, 33, 33, 33, 33, 33, 33, + 33, 240, 33, 33, 33, 33, 33, 33, 33, 33, 128, 38, + 10, 0, 7, 100, 67, 49, 50, 66, 34, 66, 35, 131, + 131, 101, 65, 66, 49, 82, 33, 97, 34, 81, 50, 65, + 69, 99, 131, 131, 34, 66, 34, 66, 49, 51, 68, 240, + 144, 11, 8, 0, 8, 2, 34, 34, 34, 0, 19, 32, + 51, 18, 0, 14, 22, 162, 98, 114, 36, 34, 82, 19, + 49, 34, 65, 34, 81, 33, 49, 34, 161, 33, 34, 161, + 33, 34, 161, 33, 34, 161, 33, 34, 161, 33, 50, 145, + 49, 34, 65, 49, 66, 52, 50, 82, 130, 114, 98, 166, + 0, 16, 80, 17, 8, 0, 6, 19, 66, 33, 113, 83, + 50, 33, 49, 50, 38, 0, 16, 32, 22, 9, 0, 15, + 1, 113, 49, 65, 33, 65, 33, 66, 18, 81, 33, 97, + 33, 81, 49, 0, 9, 32, 12, 13, 0, 22, 107, 193, + 193, 193, 193, 0, 16, 64, 8, 9, 0, 19, 23, 0, + 12, 80, 54, 18, 0, 14, 22, 162, 98, 120, 34, 82, + 34, 35, 18, 65, 50, 50, 33, 49, 66, 50, 49, 33, + 66, 34, 65, 33, 69, 81, 33, 66, 17, 97, 33, 66, + 33, 81, 33, 66, 34, 65, 49, 50, 50, 33, 71, 37, + 82, 130, 114, 98, 166, 0, 16, 80, 8, 8, 0, 9, + 6, 0, 19, 32, 21, 10, 0, 7, 100, 81, 65, 49, + 97, 33, 97, 33, 97, 33, 97, 49, 65, 84, 0, 19, + 32, 19, 13, 0, 16, 113, 193, 193, 193, 193, 123, 113, + 193, 193, 193, 193, 240, 91, 0, 10, 20, 9, 0, 7, + 4, 65, 50, 49, 50, 49, 49, 113, 113, 113, 113, 65, + 38, 0, 16, 16, 19, 7, 240, 240, 196, 49, 49, 97, + 51, 98, 97, 33, 49, 33, 34, 36, 0, 12, 80, 12, + 5, 240, 240, 18, 50, 34, 49, 65, 0, 11, 96, 37, + 14, 0, 21, 49, 66, 113, 66, 98, 66, 98, 66, 97, + 66, 113, 66, 113, 66, 33, 50, 51, 33, 50, 49, 17, + 33, 49, 19, 50, 65, 194, 194, 194, 194, 240, 240, 160, + 47, 12, 0, 9, 55, 52, 33, 84, 33, 84, 33, 69, + 33, 84, 33, 84, 33, 99, 33, 129, 33, 129, 33, 129, + 33, 129, 33, 129, 33, 129, 33, 129, 33, 129, 33, 129, + 33, 129, 33, 129, 33, 129, 33, 129, 33, 240, 208, 10, + 5, 0, 8, 99, 35, 35, 0, 7, 96, 11, 6, 0, + 16, 1, 65, 82, 82, 81, 35, 240, 16, 5, 240, 240, + 33, 50, 33, 17, 65, 65, 65, 65, 65, 65, 0, 9, + 19, 8, 0, 6, 20, 50, 34, 33, 65, 33, 65, 33, + 65, 34, 34, 52, 0, 16, 48, 24, 9, 0, 14, 81, + 33, 97, 33, 81, 34, 81, 33, 82, 33, 65, 33, 65, + 33, 65, 49, 65, 0, 8, 112, 45, 17, 0, 13, 1, + 129, 98, 113, 97, 17, 113, 129, 97, 145, 81, 161, 81, + 161, 65, 177, 65, 65, 97, 49, 66, 145, 65, 17, 145, + 49, 33, 129, 49, 49, 129, 55, 81, 129, 97, 145, 97, + 145, 0, 15, 48, 44, 16, 0, 12, 17, 129, 82, 113, + 113, 97, 129, 97, 129, 81, 145, 81, 145, 65, 161, 65, + 36, 65, 49, 33, 50, 97, 49, 50, 97, 114, 81, 113, + 113, 97, 113, 97, 113, 97, 65, 49, 86, 0, 14, 48, + 48, 17, 0, 12, 100, 113, 81, 49, 81, 161, 81, 115, + 81, 162, 49, 193, 49, 129, 49, 33, 65, 65, 34, 33, + 65, 68, 33, 66, 161, 49, 17, 145, 49, 33, 129, 49, + 49, 129, 55, 81, 129, 113, 129, 97, 145, 0, 15, 48, + 21, 9, 0, 13, 115, 99, 99, 240, 17, 129, 129, 129, + 84, 69, 66, 113, 129, 150, 84, 240, 80, 41, 18, 240, + 129, 240, 35, 240, 34, 0, 6, 66, 243, 241, 18, 225, + 18, 209, 34, 209, 50, 177, 66, 177, 66, 177, 82, 153, + 145, 99, 129, 114, 113, 130, 113, 131, 82, 131, 69, 71, + 0, 16, 40, 18, 240, 194, 243, 226, 241, 240, 240, 98, + 243, 241, 18, 225, 18, 209, 34, 209, 50, 193, 50, 177, + 66, 177, 82, 153, 145, 99, 129, 114, 113, 130, 113, 131, + 82, 131, 69, 71, 0, 16, 42, 18, 240, 162, 244, 209, + 65, 240, 49, 240, 240, 18, 243, 241, 18, 225, 18, 209, + 34, 209, 50, 193, 50, 177, 66, 177, 82, 153, 145, 99, + 129, 114, 113, 130, 113, 131, 82, 131, 69, 71, 0, 16, + 41, 18, 240, 240, 179, 49, 146, 36, 0, 6, 34, 243, + 241, 18, 225, 18, 209, 34, 209, 50, 193, 50, 177, 66, + 177, 82, 153, 145, 99, 129, 114, 113, 130, 113, 131, 82, + 131, 69, 71, 0, 16, 42, 17, 240, 240, 130, 50, 162, + 50, 240, 240, 17, 242, 227, 227, 209, 34, 193, 34, 193, + 34, 177, 66, 161, 66, 161, 66, 153, 129, 98, 129, 98, + 113, 115, 97, 130, 82, 131, 53, 70, 0, 15, 16, 43, + 18, 100, 209, 65, 193, 65, 193, 65, 212, 240, 240, 50, + 243, 241, 18, 225, 18, 209, 34, 209, 50, 193, 50, 177, + 66, 177, 82, 153, 145, 99, 129, 114, 113, 130, 113, 131, + 82, 131, 69, 71, 0, 16, 47, 26, 0, 20, 78, 228, + 99, 212, 129, 209, 18, 240, 97, 34, 240, 81, 50, 81, + 225, 50, 66, 209, 72, 200, 66, 178, 82, 81, 177, 98, + 81, 161, 114, 242, 114, 145, 81, 130, 145, 66, 130, 115, + 38, 77, 0, 23, 16, 34, 15, 0, 11, 120, 82, 83, + 66, 114, 50, 145, 49, 210, 210, 210, 210, 210, 210, 226, + 210, 145, 66, 113, 98, 81, 134, 193, 210, 227, 210, 179, + 240, 240, 96, 37, 16, 240, 66, 242, 242, 240, 240, 188, + 98, 99, 82, 129, 82, 226, 226, 81, 130, 66, 136, 130, + 66, 130, 81, 130, 81, 130, 226, 145, 66, 145, 66, 115, + 45, 0, 14, 48, 38, 16, 240, 146, 211, 194, 240, 240, + 172, 98, 99, 82, 129, 82, 129, 82, 226, 81, 130, 66, + 136, 130, 66, 130, 81, 130, 81, 130, 226, 145, 66, 130, + 66, 114, 61, 0, 14, 48, 39, 16, 240, 113, 227, 193, + 50, 240, 17, 240, 108, 98, 99, 82, 129, 82, 226, 226, + 81, 130, 66, 136, 130, 66, 130, 81, 130, 81, 130, 226, + 145, 66, 145, 66, 115, 45, 0, 14, 48, 40, 16, 240, + 240, 82, 50, 146, 50, 240, 240, 140, 98, 98, 98, 114, + 82, 129, 82, 226, 81, 130, 66, 136, 130, 66, 130, 81, + 130, 81, 130, 226, 145, 66, 129, 82, 114, 61, 0, 14, + 48, 25, 8, 130, 99, 114, 129, 182, 66, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, + 7, 32, 25, 8, 194, 83, 66, 81, 230, 66, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, + 0, 7, 32, 27, 10, 210, 116, 81, 65, 49, 97, 214, + 98, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 102, 0, 9, 16, 26, 10, 240, 82, 66, 34, + 66, 240, 120, 82, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 88, 0, 9, 37, 18, 0, 13, + 89, 178, 83, 130, 114, 114, 130, 98, 130, 98, 146, 82, + 146, 41, 82, 82, 146, 82, 146, 82, 146, 82, 145, 98, + 130, 98, 114, 114, 98, 106, 0, 16, 80, 53, 17, 240, + 240, 147, 49, 130, 36, 240, 240, 164, 101, 67, 113, 100, + 97, 97, 18, 97, 97, 19, 81, 97, 35, 65, 97, 50, + 65, 97, 51, 49, 97, 67, 33, 97, 82, 33, 97, 83, + 17, 97, 100, 97, 115, 97, 115, 97, 130, 69, 113, 0, + 15, 48, 42, 16, 240, 82, 227, 242, 240, 17, 240, 198, + 146, 66, 113, 129, 82, 130, 65, 161, 50, 162, 34, 162, + 34, 162, 34, 162, 34, 162, 34, 162, 49, 161, 66, 130, + 81, 129, 114, 66, 150, 0, 14, 96, 41, 16, 240, 146, + 211, 194, 209, 240, 246, 146, 66, 113, 129, 82, 130, 65, + 161, 50, 162, 34, 162, 34, 162, 34, 162, 34, 162, 34, + 162, 49, 161, 66, 130, 81, 129, 114, 66, 150, 0, 14, + 96, 43, 16, 240, 114, 212, 178, 34, 145, 97, 240, 166, + 146, 66, 113, 129, 82, 130, 65, 161, 50, 162, 34, 162, + 34, 162, 34, 162, 34, 162, 34, 162, 49, 161, 66, 130, + 81, 129, 114, 66, 150, 0, 14, 96, 42, 16, 240, 240, + 99, 178, 52, 240, 240, 182, 146, 66, 113, 129, 82, 130, + 65, 161, 50, 162, 34, 162, 34, 162, 34, 162, 34, 162, + 34, 162, 49, 161, 66, 130, 81, 129, 114, 66, 150, 0, + 14, 96, 43, 16, 240, 240, 98, 50, 146, 50, 240, 240, + 182, 146, 66, 113, 129, 82, 130, 65, 161, 50, 162, 34, + 162, 34, 162, 34, 162, 34, 162, 34, 162, 49, 161, 66, + 130, 81, 129, 114, 66, 150, 0, 14, 96, 23, 10, 0, + 15, 1, 97, 49, 66, 65, 34, 99, 114, 114, 17, 82, + 49, 50, 81, 33, 97, 0, 10, 32, 49, 16, 0, 12, + 70, 49, 82, 66, 18, 65, 115, 66, 130, 65, 129, 17, + 50, 113, 34, 34, 97, 50, 34, 81, 66, 34, 65, 82, + 34, 49, 98, 34, 33, 114, 49, 17, 129, 66, 130, 67, + 113, 66, 18, 66, 81, 54, 0, 14, 96, 45, 18, 240, + 130, 240, 19, 240, 34, 240, 49, 240, 182, 85, 66, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, + 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 114, 113, + 146, 66, 182, 0, 16, 80, 43, 18, 240, 209, 240, 18, + 226, 240, 240, 246, 85, 66, 145, 98, 145, 98, 145, 98, + 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, + 145, 98, 145, 98, 145, 114, 113, 146, 66, 182, 0, 16, + 80, 44, 18, 240, 162, 244, 210, 49, 177, 240, 240, 22, + 85, 66, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, + 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, + 145, 114, 113, 146, 66, 182, 0, 16, 80, 44, 18, 240, + 240, 162, 66, 162, 66, 240, 240, 198, 85, 66, 145, 98, + 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, 145, 98, + 145, 98, 145, 98, 145, 98, 145, 98, 145, 114, 113, 146, + 66, 182, 0, 16, 80, 41, 18, 240, 210, 243, 226, 241, + 240, 215, 69, 67, 115, 98, 114, 115, 97, 146, 82, 147, + 65, 178, 49, 194, 49, 210, 17, 226, 17, 242, 240, 18, + 240, 18, 240, 18, 240, 18, 230, 0, 16, 80, 30, 14, + 0, 10, 70, 162, 194, 199, 114, 67, 82, 82, 82, 98, + 66, 98, 66, 98, 66, 82, 82, 67, 87, 114, 194, 194, + 166, 0, 13, 32, 39, 13, 0, 10, 52, 114, 50, 97, + 66, 82, 66, 82, 50, 98, 33, 100, 17, 146, 17, 146, + 18, 130, 34, 114, 51, 82, 82, 66, 97, 66, 97, 66, + 18, 34, 36, 21, 0, 11, 96, 29, 11, 0, 8, 50, + 161, 162, 161, 177, 240, 69, 82, 35, 65, 66, 146, 101, + 67, 34, 50, 66, 50, 66, 50, 66, 72, 0, 9, 112, + 29, 11, 0, 9, 1, 146, 145, 146, 145, 240, 69, 82, + 35, 65, 66, 146, 101, 67, 34, 50, 66, 50, 66, 50, + 66, 72, 0, 9, 112, 31, 11, 0, 8, 97, 146, 145, + 17, 113, 49, 81, 240, 117, 82, 35, 65, 66, 146, 101, + 67, 34, 50, 66, 50, 66, 50, 66, 72, 0, 9, 112, + 27, 11, 0, 11, 20, 97, 52, 240, 197, 82, 35, 65, + 66, 146, 101, 67, 34, 50, 66, 50, 66, 50, 66, 72, + 0, 9, 112, 27, 10, 0, 10, 18, 34, 66, 34, 240, + 164, 81, 50, 65, 50, 130, 100, 66, 34, 50, 50, 50, + 50, 50, 50, 71, 0, 9, 32, 11, 0, 8, 68, 98, + 34, 81, 65, 82, 34, 100, 240, 52, 83, 35, 50, 66, + 146, 101, 67, 34, 50, 66, 50, 66, 50, 66, 72, 0, + 9, 112, 28, 17, 0, 25, 100, 52, 67, 36, 50, 65, + 66, 81, 153, 100, 163, 34, 146, 66, 146, 82, 130, 52, + 65, 68, 68, 0, 15, 48, 24, 11, 0, 16, 116, 82, + 50, 66, 66, 34, 146, 146, 146, 162, 146, 65, 100, 145, + 145, 178, 161, 115, 240, 192, 26, 11, 0, 8, 65, 162, + 161, 177, 161, 240, 84, 82, 50, 65, 81, 57, 34, 146, + 146, 147, 146, 65, 100, 0, 10, 16, 26, 10, 0, 8, + 33, 130, 130, 129, 129, 240, 52, 66, 50, 49, 81, 40, + 34, 130, 130, 131, 130, 65, 84, 0, 9, 16, 28, 11, + 0, 8, 97, 162, 129, 17, 113, 49, 97, 240, 116, 82, + 50, 65, 81, 57, 34, 146, 146, 147, 146, 65, 100, 0, + 10, 16, 25, 11, 0, 11, 18, 50, 66, 50, 240, 212, + 82, 50, 65, 81, 57, 34, 146, 146, 147, 147, 49, 100, + 0, 10, 16, 22, 8, 0, 6, 2, 98, 114, 113, 129, + 226, 83, 98, 98, 98, 98, 98, 98, 98, 70, 0, 7, + 32, 22, 7, 0, 5, 97, 82, 82, 81, 81, 210, 67, + 82, 82, 82, 82, 82, 82, 82, 53, 0, 6, 48, 23, + 8, 0, 7, 34, 84, 65, 33, 49, 65, 194, 83, 98, + 98, 98, 98, 98, 98, 98, 70, 0, 7, 32, 22, 8, + 0, 8, 2, 34, 34, 34, 240, 82, 83, 98, 98, 98, + 98, 98, 98, 98, 85, 0, 7, 32, 35, 12, 0, 9, + 34, 65, 98, 18, 130, 145, 18, 113, 50, 178, 102, 67, + 51, 50, 67, 34, 98, 34, 98, 34, 98, 34, 98, 50, + 66, 66, 50, 116, 0, 11, 16, 33, 14, 0, 14, 36, + 49, 81, 52, 240, 240, 66, 36, 85, 35, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 69, + 22, 0, 12, 64, 31, 12, 0, 9, 34, 162, 178, 177, + 240, 240, 68, 98, 51, 66, 66, 50, 98, 34, 98, 34, + 98, 34, 98, 50, 66, 66, 66, 100, 0, 11, 16, 31, + 12, 0, 9, 98, 162, 146, 161, 161, 240, 116, 98, 51, + 66, 66, 50, 98, 34, 98, 34, 98, 34, 98, 50, 66, + 66, 66, 100, 0, 11, 16, 32, 12, 0, 11, 2, 162, + 145, 33, 113, 65, 240, 68, 98, 51, 66, 66, 50, 98, + 34, 98, 34, 98, 34, 98, 50, 66, 66, 66, 100, 0, + 11, 16, 31, 12, 0, 12, 35, 49, 65, 51, 240, 240, + 20, 98, 51, 66, 66, 50, 98, 34, 98, 34, 98, 34, + 98, 50, 66, 66, 66, 100, 0, 11, 16, 31, 12, 0, + 12, 34, 34, 98, 34, 240, 240, 20, 98, 51, 66, 66, + 50, 98, 34, 98, 34, 98, 34, 98, 50, 66, 66, 66, + 100, 0, 11, 16, 17, 13, 0, 20, 3, 163, 163, 240, + 240, 43, 240, 67, 163, 163, 0, 12, 16, 31, 12, 0, + 18, 52, 33, 50, 51, 66, 66, 50, 65, 18, 34, 49, + 34, 34, 33, 50, 34, 17, 66, 50, 66, 66, 66, 49, + 36, 0, 11, 16, 33, 12, 0, 9, 34, 162, 177, 193, + 240, 240, 19, 51, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 51, 84, 19, 0, 10, + 96, 33, 12, 0, 9, 98, 161, 162, 161, 161, 240, 67, + 51, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 51, 84, 19, 0, 10, 96, 36, 12, + 0, 9, 65, 178, 145, 17, 145, 33, 113, 65, 240, 19, + 51, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 66, 66, 51, 84, 19, 0, 10, 96, 32, 12, + 0, 12, 18, 50, 82, 50, 240, 211, 51, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 51, 84, 19, 0, 10, 96, 35, 13, 0, 10, 82, 178, + 162, 177, 177, 240, 85, 51, 65, 97, 82, 81, 97, 65, + 114, 49, 114, 33, 145, 33, 147, 178, 177, 193, 177, 193, + 132, 147, 240, 240, 96, 38, 13, 0, 10, 2, 163, 178, + 178, 178, 178, 178, 20, 99, 50, 82, 82, 66, 82, 66, + 82, 66, 82, 66, 82, 66, 81, 83, 50, 82, 20, 98, + 178, 178, 178, 150, 240, 240, 48, 35, 13, 0, 11, 98, + 34, 114, 34, 240, 240, 213, 51, 66, 81, 82, 81, 97, + 65, 114, 49, 129, 33, 145, 33, 147, 178, 177, 193, 177, + 177, 148, 147, 240, 240, 96, +}; + +//***************************************************************************** +// +// The glyph offset table for the 22 point Theanooldstyle font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanooldstyle22[] = +{ + 0, 5, 26, 45, 82, 128, 178, 220, + 232, 259, 286, 312, 330, 342, 350, 360, + 387, 424, 449, 478, 508, 538, 566, 598, + 623, 658, 692, 706, 722, 740, 750, 768, + 790, 852, 887, 923, 952, 989, 1022, 1052, + 1086, 1124, 1147, 1175, 1214, 1240, 1300, 1347, + 1384, 1414, 1458, 1495, 1526, 1554, 1592, 1631, + 1690, 1725, 1762, 1791, 1818, 1845, 1872, 1890, + 1898, 1909, 1932, 1964, 1984, 2017, 2037, 2061, + 2093, 2126, 2146, 2172, 2204, 2227, 2265, 2292, + 2317, 2349, 2380, 2399, 2419, 2440, 2467, 2491, + 2528, 2553, 2582, 2601, 2629, 2654, 2682, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2693, 2698, 2718, 2754, 2788, 2815, 2846, 2867, + 2905, 2916, 2967, 2984, 3006, 3018, 3026, 3080, + 3088, 3109, 3128, 3148, 3167, 3179, 3216, 3263, + 3273, 3284, 3300, 3319, 3343, 3388, 3432, 3480, + 3501, 3542, 3582, 3624, 3665, 3707, 3750, 3797, + 3831, 3868, 3906, 3945, 3985, 4010, 4035, 4062, + 4088, 4125, 4178, 4220, 4261, 4304, 4346, 4389, + 4412, 4461, 4506, 4549, 4593, 4637, 4678, 4708, + 4747, 4776, 4805, 4836, 4863, 4890, 4922, 4950, + 4974, 5000, 5026, 5054, 5079, 5101, 5123, 5146, + 5168, 5203, 5236, 5267, 5298, 5330, 5361, 5392, + 5409, 5440, 5473, 5506, 5542, 5574, 5609, 5647, +}; + +//***************************************************************************** +// +// The font definition for the 22 point Theanooldstyle font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanooldstyle22 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 23, + + // + // The height of the font. + // + 29, + + // + // The baseline of the font. + // + 22, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanooldstyle22, + + // + // A pointer to the actual font data + // + g_pui8Theanooldstyle22Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanooldstyle24.c b/third_party/fonts/ofl/fonts/fonttheanooldstyle24.c new file mode 100644 index 0000000..b470892 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanooldstyle24.c @@ -0,0 +1,744 @@ +//***************************************************************************** +// +// fonttheanooldstyle24.c - Font definition for the 24pt Theanooldstyle font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanooldstyle +// Size: 24 point +// Bold: no +// Italic: no +// Memory usage: 6492 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 24 point Theanooldstyle font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanooldstyle24Data[6291] = +{ + 4, 10, 0, 40, 22, 5, 240, 243, 35, 35, 35, 35, + 49, 65, 65, 65, 65, 65, 65, 65, 211, 35, 35, 240, + 240, 192, 21, 8, 0, 6, 2, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 33, 49, 0, 19, 48, 41, + 14, 0, 11, 17, 65, 114, 49, 129, 65, 129, 65, 129, + 65, 129, 65, 76, 81, 65, 129, 65, 129, 65, 129, 65, + 129, 65, 92, 65, 65, 129, 65, 129, 65, 129, 49, 129, + 65, 0, 14, 112, 51, 13, 0, 7, 17, 193, 165, 99, + 17, 34, 66, 33, 50, 34, 49, 50, 34, 49, 35, 34, + 49, 49, 51, 33, 133, 149, 165, 145, 19, 129, 50, 113, + 65, 35, 33, 65, 34, 49, 65, 34, 49, 49, 66, 33, + 34, 86, 161, 193, 0, 10, 80, 58, 18, 0, 13, 99, + 113, 98, 18, 97, 82, 50, 65, 98, 50, 49, 114, 50, + 49, 114, 50, 33, 130, 50, 33, 146, 18, 33, 179, 49, + 240, 17, 51, 177, 34, 18, 145, 34, 50, 129, 34, 50, + 113, 50, 50, 113, 50, 50, 97, 66, 50, 81, 98, 18, + 97, 115, 0, 18, 64, 49, 19, 0, 15, 4, 226, 34, + 194, 50, 194, 50, 194, 49, 210, 34, 210, 18, 242, 240, + 19, 70, 66, 19, 83, 66, 50, 82, 81, 67, 65, 82, + 83, 49, 82, 84, 17, 98, 100, 115, 99, 131, 65, 19, + 49, 70, 53, 0, 19, 48, 13, 4, 240, 146, 34, 34, + 34, 34, 34, 33, 0, 9, 112, 30, 8, 0, 6, 81, + 97, 97, 113, 97, 113, 98, 98, 82, 98, 98, 98, 98, + 98, 98, 98, 113, 114, 98, 113, 114, 113, 114, 113, 129, + 160, 30, 8, 0, 6, 1, 129, 114, 113, 114, 113, 114, + 98, 113, 114, 98, 98, 98, 98, 98, 98, 97, 98, 98, + 97, 98, 97, 98, 97, 97, 240, 26, 10, 0, 7, 114, + 130, 130, 81, 33, 34, 34, 17, 19, 67, 115, 82, 17, + 19, 33, 33, 49, 82, 130, 0, 19, 48, 19, 14, 0, + 21, 82, 194, 194, 194, 194, 124, 114, 194, 194, 194, 194, + 194, 0, 14, 112, 12, 5, 0, 13, 98, 51, 65, 65, + 49, 49, 240, 144, 8, 9, 0, 20, 39, 0, 14, 112, + 10, 5, 0, 13, 19, 35, 35, 240, 240, 192, 30, 8, + 0, 6, 81, 113, 113, 98, 97, 113, 113, 113, 98, 97, + 113, 113, 113, 98, 97, 113, 113, 98, 97, 113, 113, 113, + 98, 97, 240, 128, 41, 14, 0, 11, 4, 145, 65, 113, + 97, 82, 98, 65, 129, 50, 129, 50, 130, 34, 130, 34, + 130, 34, 130, 34, 130, 34, 130, 34, 130, 49, 129, 66, + 98, 81, 97, 113, 65, 148, 0, 14, 96, 28, 7, 240, + 240, 242, 67, 49, 18, 49, 18, 33, 34, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 0, 7, + 32, 33, 13, 0, 10, 37, 98, 66, 66, 83, 50, 98, + 51, 82, 51, 82, 177, 178, 177, 177, 177, 177, 177, 177, + 97, 65, 113, 65, 113, 57, 58, 0, 13, 48, 34, 12, + 0, 9, 52, 98, 66, 50, 98, 34, 98, 35, 82, 49, + 98, 146, 161, 116, 193, 193, 178, 162, 33, 114, 34, 98, + 34, 82, 51, 51, 85, 0, 12, 80, 33, 14, 0, 11, + 65, 194, 179, 161, 18, 161, 18, 145, 34, 129, 50, 129, + 50, 113, 66, 97, 82, 97, 82, 92, 146, 194, 194, 194, + 194, 194, 0, 14, 80, 30, 13, 0, 9, 33, 73, 72, + 81, 193, 193, 198, 120, 81, 68, 178, 179, 178, 178, 178, + 178, 34, 98, 50, 98, 51, 66, 101, 0, 13, 96, 36, + 13, 0, 10, 98, 146, 146, 162, 162, 162, 178, 178, 20, + 82, 17, 51, 51, 82, 50, 114, 34, 114, 34, 114, 34, + 114, 49, 114, 50, 82, 82, 50, 117, 0, 13, 80, 28, + 12, 0, 9, 25, 57, 34, 97, 49, 113, 49, 113, 177, + 161, 177, 177, 162, 161, 177, 162, 162, 162, 146, 162, 147, + 0, 12, 96, 39, 13, 0, 10, 36, 114, 66, 66, 98, + 50, 98, 50, 98, 50, 98, 51, 66, 84, 18, 132, 149, + 98, 51, 66, 83, 34, 114, 34, 114, 34, 114, 34, 98, + 66, 67, 101, 0, 13, 80, 36, 13, 0, 10, 21, 114, + 50, 82, 82, 50, 113, 50, 114, 34, 114, 34, 114, 34, + 114, 50, 83, 51, 49, 18, 84, 18, 178, 178, 162, 162, + 162, 146, 146, 0, 14, 32, 14, 5, 0, 8, 19, 35, + 35, 240, 195, 35, 35, 240, 240, 192, 17, 5, 0, 8, + 19, 35, 35, 240, 240, 34, 51, 65, 65, 49, 65, 240, + 128, 19, 13, 0, 20, 82, 147, 131, 131, 131, 146, 179, + 194, 210, 210, 210, 209, 0, 13, 32, 11, 14, 0, 26, + 44, 240, 240, 236, 0, 21, 32, 19, 13, 0, 19, 66, + 210, 195, 195, 195, 194, 163, 131, 146, 146, 146, 161, 0, + 14, 64, 24, 9, 0, 6, 100, 86, 129, 145, 129, 129, + 114, 53, 66, 113, 129, 129, 129, 240, 163, 99, 99, 0, + 9, 96, 69, 22, 0, 23, 22, 211, 83, 162, 146, 130, + 178, 98, 194, 82, 83, 34, 34, 50, 82, 35, 50, 50, + 66, 51, 50, 34, 66, 66, 66, 34, 50, 82, 66, 34, + 50, 66, 81, 50, 34, 82, 66, 50, 34, 66, 81, 66, + 34, 51, 65, 82, 34, 33, 18, 49, 114, 35, 52, 130, + 240, 98, 177, 131, 146, 162, 98, 215, 0, 9, 64, 43, + 20, 0, 16, 2, 240, 51, 240, 20, 240, 17, 18, 240, + 17, 19, 226, 34, 225, 50, 225, 51, 194, 51, 193, 82, + 193, 83, 170, 161, 114, 146, 115, 129, 131, 129, 146, 114, + 147, 70, 72, 0, 20, 32, 40, 15, 0, 11, 42, 114, + 82, 98, 98, 82, 114, 66, 114, 66, 114, 66, 98, 82, + 82, 103, 130, 82, 98, 98, 82, 114, 66, 114, 66, 114, + 66, 114, 66, 98, 82, 83, 58, 0, 15, 80, 32, 16, + 0, 12, 85, 33, 99, 67, 82, 130, 50, 161, 50, 225, + 226, 226, 226, 226, 226, 226, 241, 242, 241, 161, 66, 129, + 99, 66, 149, 0, 16, 96, 41, 18, 0, 13, 74, 162, + 83, 130, 114, 114, 130, 98, 146, 82, 146, 82, 162, 66, + 162, 66, 162, 66, 162, 66, 162, 66, 162, 66, 161, 82, + 146, 82, 146, 82, 130, 98, 114, 91, 0, 18, 112, 38, + 17, 0, 12, 109, 98, 99, 98, 129, 98, 130, 82, 145, + 82, 242, 81, 146, 66, 152, 146, 66, 146, 81, 146, 81, + 146, 242, 161, 66, 145, 82, 145, 82, 115, 62, 0, 17, + 48, 34, 16, 0, 12, 13, 82, 99, 82, 129, 82, 130, + 66, 145, 66, 226, 81, 130, 66, 136, 130, 66, 130, 81, + 130, 81, 130, 226, 226, 226, 226, 198, 0, 17, 32, 42, + 18, 0, 14, 21, 179, 68, 98, 130, 82, 161, 82, 240, + 17, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 134, + 34, 162, 81, 162, 82, 146, 97, 146, 98, 130, 115, 83, + 150, 33, 0, 18, 64, 42, 18, 0, 13, 70, 70, 66, + 130, 98, 130, 98, 130, 98, 130, 98, 130, 98, 130, 98, + 130, 98, 130, 108, 98, 130, 98, 130, 98, 130, 98, 130, + 98, 130, 98, 130, 98, 130, 70, 70, 0, 18, 32, 25, + 8, 0, 6, 6, 66, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 8, 32, + 31, 11, 0, 8, 71, 114, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 145, + 161, 82, 34, 85, 100, 240, 224, 43, 18, 0, 13, 70, + 69, 82, 114, 114, 113, 130, 97, 146, 81, 162, 65, 178, + 49, 194, 34, 194, 20, 179, 34, 178, 51, 162, 66, 162, + 67, 146, 83, 130, 98, 130, 99, 114, 100, 70, 40, 0, + 18, 32, 28, 16, 0, 12, 6, 194, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 145, 66, 130, + 66, 115, 46, 0, 16, 32, 68, 22, 0, 16, 69, 165, + 67, 163, 100, 132, 97, 18, 129, 18, 97, 18, 129, 18, + 97, 19, 97, 34, 97, 34, 97, 34, 97, 35, 66, 34, + 97, 35, 65, 50, 97, 50, 65, 50, 97, 51, 34, 50, + 97, 66, 33, 66, 97, 66, 18, 66, 97, 68, 82, 97, + 83, 82, 97, 83, 82, 97, 97, 98, 69, 65, 70, 0, + 22, 32, 52, 18, 0, 13, 68, 117, 67, 129, 100, 113, + 100, 113, 97, 19, 97, 97, 35, 81, 97, 35, 81, 97, + 51, 65, 97, 67, 49, 97, 67, 49, 97, 83, 33, 97, + 99, 17, 97, 99, 17, 97, 116, 97, 131, 97, 131, 97, + 146, 69, 129, 0, 18, 64, 41, 18, 0, 14, 22, 163, + 67, 114, 130, 82, 162, 66, 162, 50, 193, 50, 194, 34, + 194, 34, 194, 34, 194, 34, 194, 34, 194, 34, 194, 50, + 162, 66, 162, 82, 130, 114, 83, 166, 0, 18, 112, 32, + 15, 0, 11, 41, 130, 82, 98, 98, 82, 114, 66, 114, + 66, 114, 66, 114, 66, 98, 82, 82, 103, 130, 210, 210, + 210, 210, 210, 210, 183, 0, 16, 50, 18, 0, 14, 22, + 163, 82, 114, 130, 82, 162, 66, 162, 50, 193, 50, 194, + 34, 194, 34, 194, 34, 194, 34, 194, 34, 194, 34, 194, + 50, 162, 66, 162, 82, 130, 115, 82, 166, 241, 242, 113, + 102, 65, 83, 39, 98, 84, 0, 7, 48, 41, 18, 0, + 13, 73, 178, 67, 146, 98, 130, 114, 114, 114, 114, 114, + 114, 114, 114, 98, 130, 82, 151, 178, 50, 178, 51, 162, + 67, 146, 82, 146, 83, 130, 99, 114, 115, 70, 85, 0, + 18, 32, 34, 15, 0, 11, 101, 33, 82, 83, 81, 114, + 66, 129, 66, 210, 211, 213, 198, 181, 211, 211, 210, 33, + 162, 34, 146, 50, 114, 68, 67, 65, 53, 0, 15, 80, + 43, 18, 0, 13, 94, 51, 66, 67, 34, 82, 82, 33, + 98, 97, 146, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 216, 0, 18, 96, 41, 19, 0, 14, 38, + 101, 66, 161, 98, 161, 98, 161, 98, 161, 98, 161, 98, + 161, 98, 161, 98, 161, 98, 161, 98, 161, 98, 161, 98, + 161, 98, 161, 98, 146, 114, 129, 147, 66, 197, 0, 20, + 43, 20, 0, 15, 7, 86, 67, 147, 98, 146, 114, 145, + 146, 129, 146, 114, 147, 97, 178, 97, 178, 82, 194, 65, + 210, 65, 211, 33, 242, 33, 243, 17, 240, 19, 240, 35, + 240, 35, 240, 49, 0, 21, 32, 66, 28, 0, 21, 7, + 55, 54, 67, 115, 114, 114, 115, 114, 114, 115, 113, 131, + 114, 113, 146, 99, 113, 146, 100, 81, 163, 66, 18, 81, + 178, 65, 34, 66, 178, 65, 35, 49, 195, 34, 50, 49, + 210, 33, 66, 33, 226, 33, 67, 17, 228, 98, 17, 243, + 99, 240, 19, 99, 240, 18, 130, 240, 18, 129, 0, 29, + 32, 44, 20, 0, 15, 23, 54, 99, 114, 146, 113, 163, + 81, 195, 50, 210, 49, 227, 17, 240, 19, 240, 50, 240, + 51, 240, 17, 19, 225, 50, 210, 51, 193, 83, 161, 114, + 146, 115, 115, 116, 71, 56, 0, 20, 32, 41, 19, 0, + 14, 39, 70, 67, 130, 99, 129, 130, 129, 130, 113, 162, + 97, 162, 81, 194, 50, 194, 49, 226, 17, 242, 17, 240, + 18, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 231, + 0, 20, 33, 17, 0, 13, 13, 67, 99, 66, 130, 81, + 130, 97, 115, 211, 226, 227, 211, 226, 227, 211, 211, 226, + 129, 83, 129, 67, 130, 66, 131, 61, 0, 17, 64, 30, + 8, 0, 6, 6, 34, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 102, 240, 48, 30, 8, 0, 6, 1, 114, 113, + 113, 113, 113, 114, 113, 113, 113, 114, 113, 113, 113, 113, + 114, 113, 113, 113, 113, 114, 113, 113, 113, 240, 48, 30, + 8, 0, 6, 6, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 38, 240, 48, 19, 14, 0, 11, 18, 179, 162, + 18, 130, 50, 98, 82, 81, 129, 49, 161, 0, 33, 64, + 8, 14, 0, 47, 44, 0, 7, 32, 13, 6, 240, 240, + 98, 66, 82, 81, 81, 97, 0, 15, 32, 24, 11, 0, + 18, 20, 98, 34, 66, 66, 146, 146, 101, 67, 34, 50, + 66, 50, 66, 50, 66, 72, 0, 11, 32, 36, 14, 0, + 10, 98, 164, 194, 194, 194, 194, 194, 194, 36, 100, 35, + 82, 82, 82, 98, 66, 98, 66, 98, 66, 98, 66, 98, + 66, 82, 83, 51, 81, 36, 0, 14, 80, 23, 11, 0, + 18, 36, 98, 35, 50, 66, 34, 97, 34, 146, 146, 146, + 162, 81, 51, 49, 100, 0, 11, 64, 36, 14, 0, 11, + 66, 164, 194, 194, 194, 194, 194, 116, 18, 83, 51, 82, + 82, 66, 98, 66, 98, 66, 98, 66, 98, 66, 98, 82, + 82, 83, 51, 101, 20, 0, 14, 32, 22, 11, 0, 18, + 36, 98, 34, 66, 66, 34, 82, 41, 34, 146, 146, 162, + 147, 49, 100, 0, 11, 64, 26, 10, 0, 8, 19, 82, + 33, 81, 130, 130, 130, 130, 102, 98, 130, 130, 130, 130, + 130, 130, 130, 130, 102, 0, 10, 64, 36, 14, 0, 23, + 5, 50, 50, 67, 17, 34, 98, 66, 98, 66, 98, 66, + 98, 82, 66, 118, 98, 193, 212, 199, 113, 67, 66, 114, + 50, 114, 51, 82, 103, 240, 240, 48, 36, 15, 0, 11, + 66, 180, 210, 210, 210, 210, 210, 210, 36, 116, 35, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 70, 22, 0, 15, 32, 22, 7, 0, 6, + 35, 67, 67, 240, 162, 67, 82, 82, 82, 82, 82, 82, + 82, 82, 69, 0, 7, 32, 28, 8, 0, 7, 51, 83, + 83, 240, 226, 83, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 97, 65, 33, 67, 240, 96, 35, 14, + 0, 10, 98, 164, 194, 194, 194, 194, 194, 194, 53, 66, + 67, 82, 65, 114, 49, 130, 33, 149, 146, 34, 130, 50, + 114, 66, 98, 82, 54, 21, 0, 14, 32, 25, 8, 0, + 6, 34, 68, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 70, 0, 8, 32, 40, 21, + 0, 34, 50, 35, 52, 86, 21, 35, 98, 66, 82, 98, + 66, 82, 98, 66, 82, 98, 66, 82, 98, 66, 82, 98, + 66, 82, 98, 66, 82, 98, 66, 82, 69, 37, 22, 0, + 21, 32, 29, 15, 0, 24, 82, 36, 86, 35, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 70, 22, 0, 15, 32, 27, 13, 0, 21, 69, + 114, 50, 82, 82, 50, 114, 34, 114, 34, 114, 34, 114, + 34, 114, 50, 82, 82, 50, 117, 0, 13, 80, 35, 14, + 0, 23, 2, 36, 70, 35, 82, 82, 82, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 82, 83, 51, 82, 20, + 114, 194, 194, 194, 194, 166, 240, 240, 96, 34, 14, 0, + 23, 20, 33, 83, 51, 82, 82, 66, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 82, 82, 83, 51, 101, 18, 194, + 194, 194, 194, 194, 166, 240, 240, 20, 10, 0, 16, 66, + 34, 51, 19, 67, 114, 130, 130, 130, 130, 130, 130, 102, + 0, 10, 64, 21, 10, 0, 16, 54, 50, 50, 49, 81, + 49, 162, 148, 147, 130, 130, 34, 51, 38, 0, 10, 64, + 24, 10, 0, 10, 49, 145, 145, 130, 130, 103, 82, 130, + 130, 130, 130, 130, 130, 130, 130, 49, 84, 0, 10, 48, + 29, 14, 0, 22, 100, 51, 98, 66, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 99, 35, + 116, 20, 0, 14, 32, 25, 14, 0, 22, 101, 52, 50, + 97, 97, 97, 98, 65, 129, 65, 130, 49, 130, 33, 162, + 17, 163, 194, 193, 0, 15, 40, 19, 0, 30, 117, 21, + 36, 50, 66, 81, 97, 81, 81, 98, 66, 49, 114, 51, + 49, 130, 33, 17, 49, 130, 17, 34, 17, 146, 17, 34, + 17, 162, 66, 178, 66, 193, 66, 0, 19, 112, 27, 14, + 0, 22, 101, 37, 51, 82, 82, 81, 114, 49, 148, 178, + 177, 18, 145, 50, 113, 82, 82, 83, 52, 53, 0, 14, + 32, 32, 15, 0, 24, 53, 68, 66, 97, 98, 97, 114, + 65, 130, 65, 145, 49, 162, 33, 162, 17, 195, 194, 225, + 209, 225, 209, 225, 164, 179, 240, 240, 192, 23, 11, 0, + 18, 8, 50, 50, 65, 66, 49, 66, 130, 130, 146, 130, + 130, 81, 50, 66, 41, 0, 11, 32, 30, 9, 0, 7, + 35, 81, 114, 114, 114, 114, 115, 114, 114, 114, 114, 98, + 82, 146, 130, 114, 114, 114, 99, 98, 114, 114, 114, 129, + 147, 176, 28, 4, 240, 146, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 160, 30, 9, 0, 6, 99, 145, + 130, 114, 114, 114, 99, 98, 114, 114, 114, 130, 146, 82, + 98, 114, 114, 114, 114, 130, 114, 114, 114, 113, 83, 240, + 14, 13, 0, 26, 36, 65, 49, 35, 33, 49, 83, 0, + 21, 80, 4, 9, 0, 36, 21, 5, 0, 8, 19, 35, + 35, 209, 65, 65, 65, 65, 65, 65, 65, 51, 35, 35, + 35, 35, 112, 41, 11, 0, 9, 33, 161, 145, 161, 161, + 145, 161, 116, 98, 35, 50, 33, 18, 34, 49, 82, 33, + 98, 33, 98, 33, 98, 17, 131, 65, 51, 49, 100, 97, + 161, 145, 161, 161, 145, 161, 240, 96, 42, 18, 0, 14, + 69, 194, 50, 162, 67, 130, 83, 130, 97, 146, 240, 18, + 240, 18, 240, 34, 203, 178, 240, 33, 240, 33, 180, 33, + 161, 67, 113, 33, 83, 82, 33, 65, 24, 68, 68, 0, + 18, 80, 29, 11, 0, 17, 113, 21, 17, 50, 50, 65, + 81, 49, 113, 33, 113, 33, 113, 33, 113, 49, 81, 66, + 50, 49, 21, 17, 0, 12, 80, 34, 15, 0, 11, 37, + 68, 66, 98, 82, 97, 114, 81, 114, 65, 146, 49, 146, + 33, 178, 17, 133, 19, 162, 210, 153, 162, 210, 210, 210, + 210, 181, 0, 15, 96, 23, 4, 240, 146, 34, 34, 34, + 34, 34, 34, 34, 34, 240, 178, 34, 34, 34, 34, 34, + 34, 34, 34, 160, 45, 12, 0, 9, 51, 114, 49, 98, + 50, 82, 50, 83, 34, 99, 148, 148, 99, 19, 66, 67, + 50, 83, 34, 98, 35, 82, 51, 66, 67, 18, 115, 163, + 162, 98, 35, 82, 50, 82, 50, 97, 50, 115, 240, 240, + 192, 11, 9, 0, 10, 18, 50, 34, 50, 0, 23, 112, + 56, 20, 0, 15, 102, 194, 98, 145, 161, 113, 68, 17, + 33, 81, 66, 50, 49, 65, 50, 81, 49, 49, 50, 177, + 33, 50, 177, 33, 50, 177, 33, 50, 177, 33, 50, 177, + 33, 66, 81, 65, 49, 66, 49, 65, 65, 84, 81, 81, + 193, 113, 161, 146, 98, 198, 0, 21, 17, 8, 0, 7, + 19, 66, 33, 113, 83, 50, 33, 50, 34, 38, 0, 18, + 32, 24, 9, 0, 16, 65, 65, 33, 65, 49, 50, 33, + 65, 34, 65, 34, 66, 33, 81, 49, 81, 49, 0, 10, + 48, 13, 15, 0, 28, 29, 210, 210, 210, 210, 210, 0, + 20, 112, 8, 9, 0, 20, 39, 0, 14, 112, 59, 20, + 0, 15, 102, 194, 98, 145, 161, 121, 65, 81, 50, 51, + 49, 65, 50, 66, 49, 49, 66, 66, 65, 33, 66, 50, + 81, 33, 70, 97, 33, 66, 33, 113, 33, 66, 34, 97, + 33, 66, 50, 81, 49, 50, 66, 49, 65, 22, 36, 17, + 81, 193, 113, 161, 146, 98, 198, 0, 21, 7, 9, 0, + 10, 23, 0, 25, 23, 11, 0, 8, 69, 82, 50, 50, + 82, 33, 113, 33, 113, 33, 113, 34, 82, 50, 50, 85, + 0, 23, 112, 22, 14, 0, 18, 18, 194, 194, 194, 194, + 194, 124, 114, 194, 194, 194, 194, 240, 240, 92, 0, 12, + 64, 21, 9, 0, 6, 117, 49, 51, 33, 66, 34, 50, + 98, 98, 97, 113, 113, 81, 38, 0, 18, 48, 21, 9, + 0, 6, 117, 50, 50, 49, 50, 113, 83, 130, 130, 33, + 66, 34, 35, 52, 0, 18, 64, 13, 6, 240, 240, 130, + 66, 50, 66, 65, 65, 0, 15, 80, 39, 16, 0, 27, + 33, 130, 66, 130, 66, 129, 82, 114, 66, 129, 82, 129, + 82, 129, 67, 49, 65, 67, 34, 49, 17, 34, 35, 65, + 35, 50, 81, 241, 226, 226, 226, 226, 0, 5, 96, 54, + 14, 0, 10, 121, 67, 49, 100, 49, 100, 49, 85, 49, + 100, 49, 100, 49, 100, 49, 115, 49, 145, 49, 145, 49, + 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, + 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, + 145, 49, 240, 240, 48, 9, 5, 0, 9, 51, 35, 35, + 0, 9, 12, 6, 0, 17, 65, 81, 65, 82, 97, 81, + 35, 240, 18, 6, 240, 240, 130, 51, 33, 18, 66, 66, + 66, 66, 66, 66, 66, 0, 12, 32, 19, 9, 0, 8, + 19, 82, 18, 50, 50, 34, 50, 34, 50, 49, 34, 83, + 0, 20, 96, 23, 10, 0, 18, 113, 33, 97, 49, 97, + 34, 82, 34, 66, 34, 65, 34, 65, 49, 65, 49, 0, + 11, 112, 49, 18, 0, 13, 98, 129, 99, 113, 97, 18, + 113, 130, 97, 146, 82, 146, 81, 162, 66, 162, 65, 178, + 49, 97, 82, 49, 82, 145, 68, 130, 65, 18, 129, 65, + 34, 114, 49, 50, 113, 71, 82, 130, 97, 146, 81, 162, + 0, 18, 48, 49, 18, 0, 13, 98, 129, 99, 113, 97, + 18, 113, 130, 97, 146, 97, 146, 81, 162, 65, 178, 65, + 178, 49, 52, 82, 49, 33, 50, 129, 49, 50, 114, 114, + 113, 129, 114, 113, 129, 113, 130, 97, 145, 97, 65, 65, + 117, 0, 18, 48, 53, 19, 0, 14, 53, 113, 82, 50, + 81, 113, 50, 81, 177, 81, 147, 82, 178, 65, 210, 33, + 145, 66, 33, 81, 50, 35, 17, 82, 69, 33, 82, 161, + 68, 146, 65, 18, 145, 65, 34, 129, 65, 50, 129, 71, + 97, 146, 113, 146, 97, 162, 0, 19, 48, 22, 9, 0, + 15, 19, 99, 99, 240, 161, 129, 129, 129, 114, 69, 50, + 113, 129, 129, 145, 134, 84, 176, 50, 20, 240, 178, 240, + 51, 240, 66, 240, 81, 240, 240, 114, 240, 51, 240, 20, + 240, 20, 240, 17, 19, 226, 34, 226, 34, 225, 51, 194, + 66, 194, 66, 193, 83, 170, 161, 114, 146, 115, 129, 146, + 129, 146, 114, 147, 70, 87, 0, 20, 32, 52, 20, 240, + 240, 17, 240, 50, 240, 34, 240, 33, 240, 240, 146, 240, + 51, 240, 20, 240, 17, 18, 240, 17, 19, 226, 34, 225, + 50, 225, 51, 194, 51, 193, 82, 193, 83, 170, 161, 114, + 146, 115, 129, 131, 129, 146, 114, 147, 70, 72, 0, 20, + 32, 51, 20, 240, 210, 240, 36, 242, 34, 209, 97, 240, + 240, 82, 240, 51, 240, 20, 240, 17, 18, 240, 17, 19, + 226, 34, 225, 50, 225, 51, 194, 66, 193, 82, 193, 83, + 170, 161, 114, 146, 115, 129, 131, 129, 146, 114, 147, 70, + 72, 0, 20, 32, 49, 20, 0, 5, 100, 49, 162, 52, + 0, 6, 114, 240, 51, 240, 20, 240, 17, 18, 240, 17, + 19, 226, 34, 225, 50, 225, 51, 194, 66, 193, 82, 193, + 83, 170, 161, 114, 146, 115, 129, 131, 129, 146, 114, 147, + 70, 72, 0, 20, 32, 49, 20, 240, 240, 242, 66, 194, + 66, 0, 6, 114, 240, 50, 240, 33, 18, 240, 17, 18, + 242, 18, 241, 35, 225, 50, 210, 51, 193, 67, 193, 82, + 178, 83, 170, 146, 114, 145, 131, 129, 131, 114, 146, 99, + 147, 70, 72, 0, 20, 32, 51, 20, 116, 241, 65, 225, + 65, 225, 65, 244, 240, 240, 114, 240, 51, 240, 20, 240, + 17, 18, 240, 17, 19, 226, 19, 225, 50, 225, 51, 194, + 51, 193, 67, 193, 83, 170, 161, 99, 146, 115, 129, 131, + 129, 146, 114, 147, 70, 72, 0, 20, 32, 54, 28, 0, + 22, 31, 244, 99, 244, 129, 241, 18, 130, 209, 34, 145, + 194, 34, 240, 113, 50, 81, 241, 66, 66, 226, 72, 232, + 66, 209, 98, 81, 209, 98, 81, 193, 114, 240, 34, 114, + 161, 97, 130, 145, 98, 130, 145, 83, 130, 115, 55, 78, + 0, 28, 48, 38, 16, 0, 12, 86, 33, 83, 83, 66, + 130, 65, 161, 50, 225, 226, 226, 226, 226, 226, 226, 241, + 242, 241, 161, 66, 130, 83, 82, 134, 209, 226, 227, 242, + 226, 180, 240, 240, 128, 44, 17, 240, 82, 240, 18, 240, + 18, 240, 240, 237, 98, 99, 98, 129, 98, 130, 82, 145, + 82, 242, 81, 146, 66, 152, 146, 66, 146, 81, 146, 81, + 146, 242, 161, 66, 145, 82, 145, 82, 115, 62, 0, 17, + 48, 41, 16, 240, 146, 211, 194, 240, 240, 172, 98, 99, + 82, 114, 82, 129, 82, 226, 226, 81, 130, 66, 136, 130, + 66, 130, 81, 130, 81, 130, 226, 145, 66, 145, 66, 130, + 66, 115, 45, 0, 16, 48, 44, 17, 240, 129, 243, 209, + 50, 240, 33, 240, 141, 98, 99, 98, 129, 98, 130, 82, + 145, 82, 242, 81, 146, 66, 152, 146, 66, 146, 81, 146, + 81, 146, 242, 161, 66, 145, 82, 145, 82, 115, 62, 0, + 17, 48, 44, 17, 240, 240, 114, 66, 146, 66, 240, 240, + 173, 98, 99, 98, 130, 82, 145, 82, 145, 82, 242, 81, + 146, 66, 152, 146, 66, 146, 81, 146, 81, 146, 242, 161, + 66, 146, 66, 145, 82, 130, 62, 0, 17, 48, 27, 8, + 129, 115, 114, 129, 182, 66, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, 8, + 32, 27, 8, 209, 83, 66, 81, 230, 66, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 70, 0, 8, 32, 28, 9, 178, 100, 65, 65, 145, 182, + 82, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 86, 0, 9, 48, 29, 10, 240, 82, + 66, 34, 66, 240, 120, 82, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 88, 0, 10, + 32, 41, 19, 0, 14, 58, 178, 83, 146, 114, 130, 130, + 114, 146, 98, 146, 98, 162, 82, 162, 82, 162, 41, 98, + 82, 162, 82, 162, 82, 161, 98, 146, 98, 146, 98, 130, + 114, 114, 107, 0, 19, 112, 58, 18, 240, 240, 180, 49, + 145, 52, 240, 240, 196, 117, 67, 129, 100, 113, 100, 113, + 97, 19, 97, 97, 35, 81, 97, 35, 81, 97, 51, 65, + 97, 67, 49, 97, 67, 49, 97, 83, 33, 97, 99, 17, + 97, 99, 17, 97, 116, 97, 131, 97, 131, 97, 146, 69, + 129, 0, 18, 64, 49, 18, 240, 115, 240, 19, 240, 34, + 240, 49, 240, 240, 22, 163, 67, 114, 130, 82, 162, 66, + 162, 50, 193, 50, 194, 34, 194, 34, 194, 34, 194, 34, + 194, 34, 194, 34, 194, 50, 162, 66, 162, 82, 130, 114, + 83, 166, 0, 18, 112, 46, 18, 240, 195, 227, 226, 241, + 240, 240, 70, 163, 67, 114, 130, 82, 162, 66, 162, 50, + 193, 50, 194, 34, 194, 34, 194, 34, 194, 34, 194, 34, + 194, 34, 194, 50, 162, 66, 162, 82, 130, 114, 83, 166, + 0, 18, 112, 47, 18, 240, 162, 244, 194, 66, 145, 129, + 240, 214, 163, 67, 114, 130, 82, 162, 66, 162, 50, 193, + 50, 194, 34, 194, 34, 194, 34, 194, 34, 194, 34, 194, + 34, 194, 50, 162, 66, 162, 82, 130, 114, 83, 166, 0, + 18, 112, 47, 18, 240, 240, 165, 49, 129, 53, 0, 5, + 118, 163, 67, 114, 130, 82, 162, 66, 162, 50, 193, 50, + 194, 34, 194, 34, 194, 34, 194, 34, 194, 34, 194, 34, + 194, 50, 162, 66, 162, 82, 130, 114, 83, 166, 0, 18, + 112, 47, 18, 240, 240, 162, 66, 162, 66, 0, 5, 118, + 163, 67, 114, 130, 82, 162, 66, 162, 50, 193, 50, 194, + 34, 194, 34, 194, 34, 194, 34, 194, 34, 194, 34, 194, + 50, 162, 66, 162, 82, 130, 114, 83, 166, 0, 18, 112, + 22, 11, 0, 17, 113, 113, 49, 82, 65, 50, 97, 18, + 130, 131, 114, 33, 82, 65, 50, 97, 0, 14, 53, 18, + 0, 14, 22, 65, 82, 83, 33, 66, 116, 81, 147, 66, + 132, 50, 130, 34, 34, 115, 34, 34, 99, 50, 34, 83, + 66, 34, 67, 82, 34, 51, 98, 34, 35, 114, 34, 34, + 129, 68, 130, 67, 145, 84, 114, 65, 35, 82, 81, 70, + 0, 18, 112, 47, 19, 240, 147, 240, 35, 240, 50, 0, + 5, 118, 101, 66, 161, 98, 161, 98, 161, 98, 161, 98, + 161, 98, 161, 98, 161, 98, 161, 98, 161, 98, 161, 98, + 161, 98, 161, 98, 161, 98, 146, 114, 129, 147, 66, 197, + 0, 20, 47, 19, 240, 226, 240, 18, 240, 17, 0, 6, + 6, 101, 66, 161, 98, 161, 98, 161, 98, 161, 98, 161, + 98, 161, 98, 161, 98, 161, 98, 161, 98, 161, 98, 161, + 98, 161, 98, 161, 98, 146, 114, 129, 147, 66, 197, 0, + 20, 48, 19, 129, 240, 35, 242, 18, 210, 65, 240, 240, + 246, 101, 66, 161, 98, 161, 98, 161, 98, 161, 98, 161, + 98, 161, 98, 161, 98, 161, 98, 161, 98, 161, 98, 161, + 98, 161, 98, 161, 98, 146, 114, 129, 147, 66, 197, 0, + 20, 47, 19, 240, 240, 210, 66, 178, 66, 240, 240, 231, + 85, 66, 161, 98, 161, 98, 161, 98, 161, 98, 161, 98, + 161, 98, 161, 98, 161, 98, 161, 98, 161, 98, 161, 98, + 161, 98, 161, 98, 146, 114, 129, 147, 66, 197, 0, 20, + 48, 19, 240, 226, 240, 19, 242, 240, 17, 240, 247, 70, + 67, 130, 99, 129, 130, 129, 130, 113, 162, 97, 162, 81, + 194, 50, 194, 49, 226, 17, 242, 17, 240, 18, 240, 34, + 240, 34, 240, 34, 240, 34, 240, 34, 232, 0, 19, 112, + 32, 15, 0, 11, 39, 162, 210, 210, 215, 130, 82, 98, + 98, 82, 114, 66, 114, 66, 114, 66, 114, 66, 98, 82, + 82, 103, 130, 210, 210, 183, 0, 16, 44, 14, 0, 11, + 20, 130, 35, 113, 66, 98, 66, 98, 65, 114, 50, 114, + 49, 100, 33, 146, 33, 146, 34, 130, 35, 114, 51, 98, + 67, 82, 83, 66, 98, 66, 17, 66, 66, 18, 49, 52, + 37, 0, 14, 48, 31, 11, 0, 8, 50, 146, 162, 161, + 161, 177, 240, 68, 98, 34, 81, 66, 146, 146, 101, 67, + 34, 50, 66, 50, 66, 50, 66, 72, 0, 11, 32, 31, + 11, 0, 9, 1, 146, 146, 145, 145, 161, 240, 68, 98, + 34, 66, 66, 146, 146, 101, 67, 34, 50, 66, 50, 66, + 50, 66, 72, 0, 11, 32, 34, 11, 0, 8, 97, 146, + 147, 113, 33, 113, 49, 81, 81, 240, 20, 98, 34, 66, + 66, 146, 146, 101, 67, 34, 50, 66, 50, 66, 50, 66, + 72, 0, 11, 32, 28, 11, 0, 12, 68, 97, 52, 240, + 196, 98, 34, 66, 66, 146, 146, 101, 67, 34, 50, 66, + 50, 66, 50, 66, 72, 0, 11, 32, 30, 11, 0, 11, + 18, 50, 66, 50, 240, 240, 132, 98, 34, 66, 66, 146, + 146, 101, 67, 34, 50, 66, 50, 66, 50, 66, 72, 0, + 11, 32, 35, 11, 0, 8, 83, 114, 18, 97, 49, 97, + 49, 98, 18, 115, 240, 52, 98, 34, 66, 66, 146, 146, + 101, 67, 34, 50, 66, 50, 66, 50, 66, 72, 0, 11, + 32, 31, 18, 0, 29, 68, 52, 98, 34, 18, 50, 50, + 67, 81, 146, 97, 154, 100, 179, 34, 162, 66, 162, 82, + 146, 53, 65, 68, 69, 0, 18, 64, 28, 11, 0, 18, + 36, 98, 35, 50, 66, 34, 97, 34, 146, 146, 146, 162, + 81, 51, 49, 100, 145, 145, 162, 177, 161, 115, 240, 192, + 29, 11, 0, 8, 66, 146, 161, 162, 161, 240, 240, 20, + 98, 34, 66, 66, 34, 82, 41, 34, 146, 146, 162, 147, + 49, 100, 0, 11, 64, 29, 11, 0, 9, 2, 146, 130, + 146, 145, 145, 240, 84, 98, 34, 66, 66, 34, 82, 41, + 34, 146, 146, 162, 147, 49, 100, 0, 11, 64, 30, 11, + 0, 10, 18, 146, 129, 33, 97, 49, 177, 240, 36, 98, + 34, 66, 66, 34, 82, 41, 34, 146, 146, 162, 147, 49, + 100, 0, 11, 64, 28, 11, 0, 11, 34, 34, 82, 34, + 240, 240, 148, 98, 34, 66, 65, 50, 82, 41, 34, 146, + 146, 162, 147, 49, 100, 0, 11, 64, 24, 8, 0, 6, + 1, 114, 98, 114, 113, 129, 226, 68, 98, 98, 98, 98, + 98, 98, 98, 98, 70, 0, 8, 32, 24, 8, 0, 6, + 66, 98, 82, 98, 97, 97, 242, 68, 98, 98, 98, 98, + 98, 98, 98, 98, 70, 0, 8, 32, 25, 8, 0, 7, + 34, 83, 81, 33, 49, 65, 240, 82, 68, 98, 98, 98, + 98, 98, 98, 98, 98, 70, 0, 8, 32, 23, 8, 0, + 8, 2, 34, 34, 34, 240, 210, 83, 98, 98, 98, 98, + 98, 98, 98, 98, 85, 0, 8, 32, 37, 13, 0, 10, + 1, 97, 98, 49, 132, 147, 145, 34, 194, 179, 103, 82, + 52, 50, 83, 34, 114, 34, 114, 34, 114, 34, 114, 34, + 113, 66, 82, 82, 50, 117, 0, 13, 80, 35, 15, 0, + 17, 36, 49, 97, 52, 240, 240, 114, 36, 86, 35, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 70, 22, 0, 15, 32, 34, 13, 0, 10, + 2, 179, 178, 193, 194, 193, 240, 133, 114, 50, 82, 82, + 50, 114, 34, 114, 34, 114, 34, 114, 34, 114, 50, 82, + 82, 50, 117, 0, 13, 80, 34, 13, 0, 10, 82, 163, + 162, 177, 178, 177, 240, 133, 114, 50, 82, 82, 50, 114, + 34, 114, 34, 114, 34, 114, 34, 114, 50, 82, 82, 50, + 117, 0, 13, 80, 37, 13, 0, 10, 49, 193, 179, 146, + 18, 129, 49, 113, 81, 240, 85, 114, 50, 82, 82, 50, + 114, 34, 114, 34, 114, 34, 114, 34, 114, 50, 82, 82, + 50, 117, 0, 13, 80, 33, 13, 0, 14, 116, 49, 65, + 52, 240, 240, 53, 114, 50, 82, 82, 50, 114, 34, 114, + 34, 114, 34, 114, 34, 114, 50, 82, 82, 50, 117, 0, + 13, 80, 33, 13, 0, 13, 34, 50, 98, 50, 0, 5, + 101, 114, 50, 82, 82, 50, 114, 34, 114, 34, 114, 34, + 114, 34, 114, 50, 82, 82, 50, 117, 0, 13, 80, 18, + 14, 0, 23, 51, 179, 179, 240, 240, 76, 240, 240, 83, + 179, 179, 0, 14, 96, 34, 13, 0, 21, 69, 33, 66, + 51, 66, 82, 50, 81, 18, 34, 65, 34, 34, 49, 50, + 34, 33, 66, 34, 17, 82, 50, 82, 67, 50, 65, 37, + 0, 13, 80, 36, 14, 0, 10, 113, 210, 209, 210, 209, + 240, 240, 100, 51, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 99, 35, 116, 20, + 0, 14, 32, 36, 14, 0, 11, 50, 194, 178, 193, 209, + 240, 240, 84, 51, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 99, 35, 116, 20, + 0, 14, 32, 37, 14, 0, 12, 114, 194, 177, 33, 145, + 49, 225, 240, 68, 51, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 66, 98, 66, 98, 66, 98, 66, 99, 35, 116, + 20, 0, 14, 32, 35, 14, 0, 14, 50, 34, 130, 34, + 0, 5, 116, 51, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 66, 98, 66, 98, 66, 98, 66, 99, 35, 116, 20, + 0, 14, 32, 39, 15, 0, 12, 34, 210, 194, 209, 225, + 209, 240, 133, 68, 66, 97, 98, 97, 114, 65, 130, 65, + 145, 49, 162, 33, 162, 17, 195, 194, 225, 209, 225, 209, + 225, 164, 179, 240, 240, 192, 42, 14, 0, 10, 98, 164, + 194, 194, 194, 194, 194, 194, 36, 100, 35, 82, 82, 82, + 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, 82, 83, + 51, 82, 20, 114, 194, 194, 194, 194, 166, 240, 240, 96, + 39, 14, 0, 14, 50, 50, 114, 50, 0, 5, 101, 67, + 66, 97, 82, 97, 97, 81, 114, 65, 114, 49, 145, 49, + 146, 17, 177, 17, 178, 194, 193, 209, 193, 209, 148, 163, + 240, 240, 144, +}; + +//***************************************************************************** +// +// The glyph offset table for the 24 point Theanooldstyle font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanooldstyle24[] = +{ + 0, 4, 26, 47, 88, 139, 197, 246, + 259, 289, 319, 345, 364, 376, 384, 394, + 424, 465, 493, 526, 560, 593, 623, 659, + 687, 726, 762, 776, 793, 812, 823, 842, + 866, 935, 978, 1018, 1050, 1091, 1129, 1163, + 1205, 1247, 1272, 1303, 1346, 1374, 1442, 1494, + 1535, 1567, 1617, 1658, 1692, 1735, 1776, 1819, + 1885, 1929, 1970, 2003, 2033, 2063, 2093, 2112, + 2120, 2133, 2157, 2193, 2216, 2252, 2274, 2300, + 2336, 2372, 2394, 2422, 2457, 2482, 2522, 2551, + 2578, 2613, 2647, 2667, 2688, 2712, 2741, 2766, + 2806, 2833, 2865, 2888, 2918, 2946, 2976, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2990, 2994, 3015, 3056, 3098, 3127, 3161, 3184, + 3229, 3240, 3296, 3313, 3337, 3350, 3358, 3417, + 3424, 3447, 3469, 3490, 3511, 3524, 3563, 3617, + 3626, 3638, 3656, 3675, 3698, 3747, 3796, 3849, + 3871, 3921, 3973, 4024, 4073, 4122, 4173, 4227, + 4265, 4309, 4350, 4394, 4438, 4465, 4492, 4520, + 4549, 4590, 4648, 4697, 4743, 4790, 4837, 4884, + 4906, 4959, 5006, 5053, 5101, 5148, 5196, 5228, + 5272, 5303, 5334, 5368, 5396, 5426, 5461, 5492, + 5520, 5549, 5578, 5608, 5636, 5660, 5684, 5709, + 5732, 5769, 5804, 5838, 5872, 5909, 5942, 5975, + 5993, 6027, 6063, 6099, 6136, 6171, 6210, 6252, +}; + +//***************************************************************************** +// +// The font definition for the 24 point Theanooldstyle font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanooldstyle24 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 25, + + // + // The height of the font. + // + 32, + + // + // The baseline of the font. + // + 24, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanooldstyle24, + + // + // A pointer to the actual font data + // + g_pui8Theanooldstyle24Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanooldstyle26.c b/third_party/fonts/ofl/fonts/fonttheanooldstyle26.c new file mode 100644 index 0000000..93d811a --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanooldstyle26.c @@ -0,0 +1,781 @@ +//***************************************************************************** +// +// fonttheanooldstyle26.c - Font definition for the 26pt Theanooldstyle font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanooldstyle +// Size: 26 point +// Bold: no +// Italic: no +// Memory usage: 6944 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 26 point Theanooldstyle font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanooldstyle26Data[6743] = +{ + 5, 10, 0, 42, 64, 24, 5, 240, 240, 83, 35, 35, + 35, 35, 35, 49, 65, 65, 65, 65, 65, 65, 65, 211, + 35, 35, 240, 240, 192, 21, 9, 0, 7, 114, 50, 34, + 50, 34, 50, 34, 50, 34, 50, 34, 50, 33, 65, 0, + 22, 112, 43, 15, 0, 13, 97, 66, 129, 65, 145, 65, + 130, 65, 129, 81, 129, 66, 77, 97, 65, 130, 65, 129, + 81, 129, 66, 129, 65, 109, 66, 65, 129, 81, 129, 65, + 145, 65, 145, 65, 130, 65, 0, 15, 112, 55, 14, 0, + 7, 81, 209, 209, 181, 130, 17, 34, 82, 33, 50, 50, + 49, 50, 50, 49, 35, 50, 49, 34, 67, 33, 147, 17, + 165, 166, 165, 145, 35, 129, 51, 50, 33, 66, 35, 33, + 66, 34, 49, 66, 34, 49, 50, 66, 33, 34, 118, 161, + 209, 0, 11, 64, 61, 20, 0, 17, 99, 130, 98, 18, + 113, 98, 50, 82, 98, 50, 81, 114, 50, 65, 130, 50, + 65, 130, 50, 49, 162, 18, 50, 179, 65, 240, 49, 52, + 193, 34, 34, 161, 49, 65, 146, 34, 66, 129, 50, 66, + 113, 66, 66, 113, 66, 66, 97, 97, 65, 113, 98, 34, + 97, 132, 0, 20, 64, 51, 20, 0, 18, 52, 242, 34, + 210, 50, 210, 50, 210, 49, 226, 34, 229, 240, 18, 240, + 35, 70, 82, 19, 83, 82, 50, 82, 82, 67, 65, 82, + 98, 65, 82, 99, 33, 98, 115, 17, 98, 116, 115, 115, + 131, 66, 20, 133, 84, 0, 20, 48, 13, 4, 240, 210, + 34, 34, 34, 34, 34, 33, 0, 10, 48, 31, 8, 0, + 7, 81, 97, 97, 113, 98, 97, 98, 98, 97, 98, 98, + 98, 98, 98, 98, 98, 98, 113, 114, 98, 113, 114, 113, + 114, 113, 129, 160, 31, 8, 0, 7, 1, 129, 114, 113, + 114, 113, 114, 98, 113, 114, 98, 98, 98, 98, 98, 98, + 98, 97, 98, 98, 97, 98, 97, 98, 97, 97, 240, 30, + 12, 0, 11, 2, 162, 162, 98, 49, 34, 35, 33, 34, + 66, 17, 17, 131, 114, 19, 67, 33, 34, 34, 34, 34, + 98, 162, 0, 23, 32, 20, 15, 0, 25, 18, 210, 210, + 210, 210, 210, 125, 130, 210, 210, 210, 210, 210, 0, 15, + 112, 13, 6, 0, 18, 18, 67, 81, 81, 81, 65, 50, + 240, 112, 8, 10, 0, 25, 8, 0, 16, 64, 10, 5, + 0, 14, 51, 35, 35, 240, 240, 192, 32, 9, 0, 8, + 81, 114, 114, 113, 129, 129, 114, 113, 129, 129, 114, 114, + 113, 129, 129, 114, 113, 129, 129, 129, 114, 113, 129, 129, + 114, 114, 240, 16, 43, 15, 0, 13, 85, 146, 50, 114, + 82, 82, 114, 66, 114, 65, 145, 50, 146, 34, 146, 34, + 146, 34, 146, 34, 146, 34, 146, 34, 146, 49, 145, 66, + 114, 66, 114, 82, 82, 114, 50, 149, 0, 15, 96, 28, + 7, 0, 6, 66, 67, 52, 49, 18, 33, 34, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 0, 7, 32, 34, 14, 0, 12, 101, 114, 67, 66, 98, + 66, 114, 51, 98, 51, 98, 194, 178, 193, 193, 193, 193, + 193, 193, 193, 113, 65, 129, 65, 114, 58, 59, 0, 14, + 48, 34, 13, 0, 11, 100, 114, 66, 66, 98, 50, 98, + 51, 82, 178, 162, 162, 132, 210, 194, 194, 178, 178, 34, + 114, 34, 114, 34, 98, 66, 66, 102, 0, 13, 80, 34, + 16, 0, 15, 17, 226, 211, 211, 193, 18, 177, 34, 161, + 50, 161, 50, 145, 66, 129, 82, 129, 82, 113, 98, 110, + 162, 226, 226, 226, 226, 226, 0, 16, 96, 32, 14, 0, + 10, 1, 209, 89, 88, 97, 209, 209, 214, 136, 97, 68, + 194, 195, 194, 194, 194, 194, 194, 34, 114, 51, 97, 83, + 66, 117, 0, 14, 96, 39, 14, 0, 11, 97, 163, 147, + 162, 178, 178, 194, 178, 194, 21, 82, 17, 66, 67, 98, + 50, 130, 34, 130, 34, 130, 34, 130, 49, 130, 49, 114, + 66, 98, 82, 66, 133, 0, 14, 80, 29, 13, 0, 11, + 74, 58, 34, 113, 49, 129, 49, 129, 177, 193, 193, 178, + 177, 193, 178, 178, 162, 178, 178, 163, 163, 148, 0, 13, + 96, 41, 14, 0, 12, 101, 115, 51, 82, 83, 50, 114, + 50, 114, 50, 114, 51, 82, 84, 49, 118, 164, 130, 21, + 81, 83, 65, 115, 34, 130, 34, 130, 34, 130, 50, 98, + 67, 66, 118, 0, 14, 80, 39, 14, 0, 12, 85, 130, + 66, 82, 97, 81, 129, 50, 129, 50, 130, 34, 130, 34, + 130, 34, 115, 50, 99, 66, 65, 18, 85, 18, 194, 178, + 194, 178, 178, 163, 162, 162, 0, 13, 80, 15, 5, 0, + 8, 99, 35, 35, 240, 240, 35, 35, 35, 240, 240, 192, + 18, 6, 0, 10, 67, 51, 51, 240, 240, 243, 52, 81, + 81, 65, 81, 50, 240, 112, 21, 14, 0, 22, 49, 194, + 162, 163, 147, 147, 147, 178, 211, 211, 211, 210, 226, 210, + 0, 14, 32, 11, 15, 0, 31, 125, 0, 5, 125, 0, + 22, 96, 21, 14, 0, 21, 1, 210, 226, 226, 211, 211, + 211, 194, 163, 147, 147, 162, 162, 178, 0, 15, 64, 26, + 10, 0, 8, 116, 87, 67, 18, 161, 145, 145, 130, 69, + 84, 97, 145, 145, 145, 145, 240, 211, 115, 115, 0, 10, + 96, 77, 24, 0, 25, 38, 243, 83, 179, 147, 130, 194, + 114, 226, 82, 240, 17, 82, 115, 18, 50, 50, 98, 33, + 18, 50, 50, 82, 51, 66, 34, 82, 67, 66, 34, 82, + 66, 82, 34, 66, 82, 82, 34, 66, 66, 82, 50, 50, + 82, 82, 50, 50, 66, 82, 66, 50, 51, 66, 82, 50, + 33, 18, 50, 114, 51, 52, 146, 240, 130, 209, 146, 162, + 179, 98, 247, 0, 10, 48, 47, 21, 0, 17, 1, 240, + 51, 240, 52, 240, 36, 240, 18, 18, 240, 17, 35, 241, + 35, 226, 50, 225, 67, 209, 67, 194, 82, 193, 99, 171, + 161, 130, 161, 131, 130, 131, 129, 162, 129, 163, 98, 163, + 70, 88, 0, 21, 32, 42, 17, 0, 14, 123, 146, 83, + 114, 114, 98, 130, 82, 130, 82, 130, 82, 130, 82, 114, + 98, 98, 120, 146, 98, 114, 114, 98, 130, 82, 130, 82, + 130, 82, 130, 82, 114, 98, 99, 60, 0, 17, 80, 34, + 18, 0, 16, 73, 115, 83, 98, 131, 66, 162, 51, 242, + 243, 243, 243, 243, 243, 243, 243, 240, 19, 243, 240, 19, + 161, 82, 130, 115, 82, 166, 0, 18, 96, 42, 21, 0, + 18, 60, 194, 99, 162, 131, 130, 147, 114, 163, 98, 163, + 98, 178, 98, 179, 82, 179, 82, 179, 82, 179, 82, 179, + 82, 179, 82, 178, 98, 163, 98, 162, 114, 146, 130, 115, + 109, 0, 22, 43, 19, 0, 16, 95, 114, 115, 114, 146, + 98, 161, 98, 161, 98, 240, 34, 97, 162, 97, 162, 82, + 169, 162, 82, 162, 97, 162, 97, 162, 240, 34, 177, 82, + 162, 82, 161, 98, 131, 63, 1, 0, 19, 48, 41, 18, + 0, 15, 111, 98, 115, 98, 146, 82, 161, 82, 161, 82, + 240, 18, 97, 146, 97, 146, 82, 153, 146, 82, 146, 97, + 146, 97, 146, 240, 18, 240, 18, 240, 18, 240, 18, 216, + 0, 19, 32, 44, 21, 0, 19, 25, 163, 84, 130, 146, + 114, 177, 99, 240, 50, 240, 51, 240, 51, 240, 51, 240, + 51, 240, 51, 136, 35, 178, 83, 178, 99, 162, 99, 162, + 115, 146, 131, 130, 147, 84, 183, 33, 0, 21, 80, 44, + 21, 0, 18, 56, 56, 82, 146, 130, 146, 130, 146, 130, + 146, 130, 146, 130, 146, 130, 146, 130, 146, 141, 130, 146, + 130, 146, 130, 146, 130, 146, 130, 146, 130, 146, 130, 146, + 130, 146, 88, 56, 0, 21, 32, 26, 10, 0, 8, 104, + 82, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 88, 0, 10, 32, 33, 12, 0, + 10, 104, 114, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 161, 177, + 98, 34, 101, 116, 240, 80, 45, 20, 0, 17, 72, 55, + 82, 131, 114, 129, 146, 113, 162, 97, 178, 81, 194, 65, + 210, 34, 226, 20, 212, 19, 195, 35, 194, 67, 178, 82, + 178, 83, 162, 99, 146, 114, 146, 115, 130, 116, 72, 40, + 0, 20, 32, 43, 18, 0, 15, 104, 210, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 161, + 82, 161, 82, 146, 82, 131, 47, 0, 18, 48, 72, 25, + 0, 21, 118, 182, 83, 179, 132, 148, 132, 145, 18, 129, + 19, 129, 18, 129, 19, 113, 34, 129, 34, 113, 34, 129, + 35, 82, 34, 129, 35, 81, 50, 129, 50, 81, 50, 129, + 51, 50, 50, 129, 66, 49, 66, 129, 67, 18, 66, 129, + 67, 17, 82, 129, 82, 17, 82, 129, 84, 82, 129, 98, + 98, 129, 98, 98, 87, 49, 72, 0, 25, 32, 55, 21, + 0, 18, 53, 119, 83, 145, 132, 129, 132, 129, 129, 19, + 113, 129, 35, 97, 129, 36, 81, 129, 51, 81, 129, 67, + 65, 129, 83, 49, 129, 83, 49, 129, 99, 33, 129, 115, + 17, 129, 115, 17, 129, 132, 129, 147, 129, 147, 129, 162, + 87, 129, 0, 21, 80, 42, 19, 0, 17, 53, 194, 82, + 146, 114, 114, 146, 83, 147, 66, 178, 51, 179, 35, 179, + 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, 50, 178, + 67, 147, 82, 146, 99, 115, 130, 82, 197, 0, 20, 35, + 17, 0, 14, 123, 146, 83, 114, 114, 98, 130, 82, 130, + 82, 130, 82, 130, 82, 130, 82, 114, 98, 83, 120, 146, + 242, 242, 242, 242, 242, 242, 200, 0, 18, 16, 54, 19, + 0, 17, 53, 194, 82, 146, 114, 114, 146, 83, 147, 66, + 178, 51, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, + 179, 35, 179, 50, 178, 67, 147, 82, 146, 99, 114, 146, + 82, 197, 240, 17, 240, 33, 129, 117, 66, 98, 55, 113, + 100, 0, 7, 96, 43, 21, 0, 18, 59, 210, 83, 178, + 114, 162, 130, 146, 130, 146, 130, 146, 130, 146, 114, 162, + 98, 184, 210, 50, 226, 66, 210, 67, 194, 83, 178, 99, + 162, 99, 162, 115, 146, 132, 72, 86, 0, 21, 32, 35, + 16, 0, 14, 73, 98, 68, 81, 130, 66, 145, 66, 226, + 227, 228, 214, 198, 213, 211, 227, 33, 178, 34, 162, 35, + 146, 51, 114, 68, 82, 81, 54, 0, 16, 80, 46, 20, + 0, 17, 95, 1, 67, 66, 67, 65, 98, 97, 50, 98, + 98, 162, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 50, 248, 0, 20, 112, 44, 22, 0, 19, + 40, 87, 82, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 146, 145, 162, 130, 179, 82, + 230, 0, 23, 16, 46, 21, 0, 18, 56, 86, 67, 162, + 99, 161, 130, 161, 131, 130, 146, 129, 163, 113, 178, 98, + 178, 97, 195, 81, 210, 65, 227, 49, 242, 34, 242, 33, + 240, 19, 17, 240, 36, 240, 35, 240, 66, 240, 66, 0, + 22, 32, 71, 30, 0, 26, 39, 56, 70, 67, 115, 146, + 99, 130, 145, 130, 130, 145, 131, 115, 114, 146, 115, 113, + 162, 100, 113, 163, 81, 19, 81, 179, 81, 19, 81, 194, + 65, 50, 66, 195, 49, 51, 49, 211, 49, 51, 49, 226, + 33, 82, 33, 243, 17, 83, 17, 245, 83, 17, 240, 19, + 115, 240, 35, 115, 240, 34, 131, 240, 49, 145, 0, 31, + 48, 44, 20, 0, 17, 88, 54, 84, 99, 131, 98, 147, + 97, 179, 65, 211, 34, 211, 33, 244, 240, 35, 240, 35, + 240, 36, 241, 34, 226, 35, 194, 67, 177, 98, 161, 115, + 130, 131, 99, 132, 55, 71, 0, 20, 32, 45, 21, 0, + 18, 56, 71, 68, 131, 115, 130, 131, 129, 162, 129, 163, + 97, 194, 97, 195, 65, 226, 49, 243, 33, 240, 18, 17, + 240, 36, 240, 50, 240, 66, 240, 66, 240, 66, 240, 66, + 240, 66, 240, 24, 0, 22, 34, 18, 0, 16, 29, 67, + 115, 82, 131, 66, 131, 81, 131, 242, 243, 227, 227, 242, + 243, 227, 227, 243, 227, 145, 67, 145, 67, 161, 67, 131, + 63, 0, 18, 48, 31, 8, 0, 7, 6, 34, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 102, 160, 31, + 9, 0, 7, 114, 114, 129, 129, 129, 130, 129, 129, 129, + 129, 130, 129, 129, 129, 130, 114, 129, 129, 129, 130, 129, + 129, 129, 130, 114, 129, 176, 31, 8, 0, 7, 6, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 38, + 160, 21, 15, 0, 13, 98, 211, 178, 18, 146, 50, 114, + 82, 82, 113, 66, 145, 49, 177, 0, 35, 112, 8, 15, + 0, 54, 61, 0, 7, 96, 12, 6, 240, 240, 194, 66, + 82, 66, 81, 97, 0, 16, 27, 13, 0, 23, 5, 114, + 50, 83, 66, 178, 178, 133, 98, 50, 82, 66, 66, 82, + 66, 82, 66, 67, 85, 35, 0, 13, 32, 38, 14, 0, + 12, 66, 164, 194, 194, 194, 194, 194, 194, 35, 116, 35, + 82, 82, 82, 98, 66, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 66, 82, 83, 50, 97, 36, 0, 14, 80, 24, + 12, 0, 21, 53, 98, 50, 66, 67, 49, 98, 34, 162, + 162, 162, 162, 178, 97, 66, 65, 101, 0, 12, 64, 38, + 15, 0, 14, 34, 180, 210, 210, 210, 210, 210, 117, 18, + 98, 67, 82, 98, 66, 114, 66, 114, 66, 114, 66, 114, + 66, 114, 66, 114, 82, 98, 83, 67, 117, 20, 0, 15, + 32, 24, 12, 0, 21, 53, 98, 50, 66, 82, 34, 98, + 42, 34, 162, 162, 162, 178, 97, 66, 65, 101, 0, 12, + 64, 27, 11, 0, 10, 36, 97, 34, 81, 146, 146, 146, + 146, 118, 114, 146, 146, 146, 146, 146, 146, 146, 146, 146, + 118, 0, 11, 80, 39, 15, 0, 26, 85, 50, 51, 52, + 17, 35, 82, 82, 114, 66, 114, 66, 114, 81, 98, 114, + 51, 118, 129, 210, 211, 216, 145, 22, 82, 99, 50, 130, + 50, 130, 51, 98, 103, 240, 96, 38, 15, 0, 13, 50, + 180, 210, 210, 210, 210, 210, 210, 36, 116, 34, 114, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 98, 82, 70, 22, 0, 15, 32, 24, 7, 0, + 6, 35, 67, 67, 240, 240, 50, 52, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 53, 0, 7, 32, 30, 9, 0, + 8, 51, 99, 99, 240, 240, 210, 84, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 113, 129, 50, + 33, 68, 224, 38, 15, 0, 13, 50, 180, 210, 210, 210, + 210, 210, 210, 54, 66, 83, 82, 81, 114, 50, 130, 34, + 146, 18, 163, 18, 146, 50, 130, 51, 114, 67, 98, 83, + 54, 37, 0, 15, 32, 26, 8, 0, 7, 34, 68, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 70, 0, 8, 32, 44, 23, 0, 40, 66, + 36, 68, 86, 35, 18, 34, 114, 83, 82, 98, 82, 98, + 98, 82, 98, 98, 82, 98, 98, 82, 98, 98, 82, 98, + 98, 82, 98, 98, 82, 98, 98, 82, 98, 70, 22, 38, + 0, 23, 32, 31, 15, 0, 26, 66, 36, 86, 34, 114, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 70, 22, 0, 15, 32, 29, 14, + 0, 24, 117, 130, 66, 82, 98, 51, 98, 50, 130, 34, + 130, 34, 130, 34, 130, 34, 115, 50, 98, 82, 66, 117, + 0, 14, 96, 37, 14, 0, 24, 98, 35, 86, 35, 82, + 82, 82, 98, 66, 98, 66, 98, 66, 98, 66, 98, 66, + 98, 66, 82, 83, 50, 98, 20, 114, 194, 194, 194, 194, + 194, 166, 240, 112, 37, 15, 0, 26, 85, 33, 98, 67, + 82, 98, 66, 114, 66, 114, 66, 114, 66, 114, 66, 114, + 66, 114, 82, 98, 83, 67, 117, 18, 210, 210, 210, 210, + 210, 210, 182, 240, 32, 21, 11, 0, 19, 66, 35, 51, + 20, 67, 130, 146, 146, 146, 146, 146, 146, 146, 118, 0, + 11, 80, 23, 10, 0, 17, 86, 50, 50, 49, 81, 49, + 146, 148, 147, 131, 130, 33, 82, 34, 50, 54, 0, 10, + 64, 25, 10, 0, 11, 81, 145, 145, 130, 115, 103, 82, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 49, 84, 0, + 10, 48, 31, 15, 0, 26, 36, 52, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 99, 51, 117, 20, 0, 15, 32, 27, 15, 0, + 26, 38, 52, 66, 98, 82, 97, 114, 81, 114, 81, 129, + 65, 146, 49, 146, 33, 178, 17, 179, 210, 209, 0, 16, + 42, 20, 0, 35, 5, 21, 37, 51, 66, 82, 82, 66, + 81, 98, 67, 65, 113, 67, 49, 130, 51, 49, 130, 33, + 34, 17, 162, 17, 34, 17, 163, 50, 17, 163, 66, 194, + 66, 193, 82, 0, 20, 112, 29, 16, 0, 28, 21, 53, + 67, 83, 98, 81, 146, 49, 178, 17, 210, 227, 193, 19, + 161, 51, 129, 82, 114, 84, 53, 54, 0, 16, 32, 34, + 15, 0, 26, 37, 68, 66, 98, 82, 98, 98, 81, 114, + 81, 129, 65, 146, 49, 146, 33, 178, 17, 179, 210, 209, + 225, 209, 225, 209, 165, 164, 179, 240, 192, 25, 12, 0, + 21, 40, 50, 66, 65, 66, 65, 67, 146, 146, 146, 162, + 146, 81, 50, 81, 66, 66, 57, 0, 12, 48, 32, 9, + 0, 7, 35, 82, 98, 114, 114, 114, 115, 114, 114, 114, + 114, 114, 98, 82, 146, 129, 130, 114, 114, 114, 99, 98, + 114, 114, 114, 129, 147, 176, 30, 4, 240, 210, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 96, + 32, 9, 0, 6, 99, 130, 130, 114, 114, 114, 99, 98, + 114, 114, 114, 114, 130, 146, 82, 98, 114, 114, 114, 114, + 115, 114, 114, 114, 114, 98, 83, 240, 13, 14, 0, 30, + 19, 81, 50, 35, 33, 49, 99, 0, 25, 5, 10, 0, + 42, 64, 22, 5, 0, 8, 99, 35, 35, 209, 65, 65, + 65, 65, 65, 65, 65, 51, 35, 35, 35, 35, 35, 112, + 43, 12, 0, 11, 81, 177, 161, 177, 177, 161, 177, 117, + 98, 35, 66, 52, 49, 50, 18, 34, 49, 98, 49, 98, + 33, 114, 33, 114, 33, 131, 81, 66, 65, 101, 97, 177, + 177, 161, 177, 177, 161, 240, 128, 44, 20, 0, 18, 85, + 226, 51, 178, 82, 162, 99, 146, 98, 162, 240, 50, 240, + 50, 240, 51, 220, 210, 240, 50, 240, 50, 240, 50, 196, + 34, 178, 51, 145, 33, 84, 82, 49, 65, 40, 84, 85, + 0, 20, 80, 29, 12, 0, 21, 1, 36, 33, 50, 66, + 65, 97, 49, 129, 33, 129, 33, 129, 33, 129, 49, 97, + 66, 66, 49, 36, 33, 0, 15, 32, 35, 16, 0, 14, + 5, 69, 66, 114, 82, 113, 114, 81, 130, 81, 146, 49, + 162, 49, 178, 17, 149, 20, 162, 226, 226, 170, 162, 226, + 226, 226, 226, 198, 0, 16, 96, 25, 4, 240, 210, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 240, 178, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 96, 46, 12, 0, 10, + 116, 114, 49, 82, 66, 66, 66, 66, 66, 67, 163, 163, + 133, 98, 35, 66, 67, 50, 83, 34, 98, 35, 82, 51, + 66, 67, 34, 101, 131, 163, 163, 66, 66, 66, 66, 66, + 66, 81, 50, 116, 240, 224, 11, 9, 0, 10, 18, 50, + 34, 50, 0, 26, 16, 58, 21, 0, 19, 23, 195, 83, + 146, 146, 113, 69, 65, 82, 50, 51, 34, 65, 50, 97, + 49, 50, 34, 178, 33, 50, 193, 33, 50, 193, 33, 50, + 193, 33, 50, 193, 33, 50, 193, 33, 66, 97, 50, 49, + 66, 65, 65, 66, 69, 66, 81, 209, 114, 146, 147, 83, + 199, 0, 22, 20, 10, 0, 9, 3, 97, 49, 81, 49, + 145, 100, 67, 33, 66, 36, 36, 18, 0, 24, 16, 24, + 10, 0, 20, 65, 33, 81, 49, 65, 49, 66, 34, 50, + 34, 82, 34, 81, 49, 97, 49, 97, 0, 11, 112, 13, + 16, 0, 32, 14, 226, 226, 226, 226, 226, 0, 24, 32, + 8, 10, 0, 25, 8, 0, 16, 64, 63, 21, 0, 19, + 23, 195, 83, 146, 146, 113, 24, 65, 82, 50, 50, 50, + 65, 66, 66, 49, 50, 66, 66, 50, 33, 82, 66, 65, + 33, 82, 50, 81, 33, 85, 113, 33, 82, 33, 113, 33, + 82, 34, 97, 33, 82, 50, 66, 49, 66, 66, 49, 66, + 22, 38, 81, 209, 114, 146, 147, 83, 199, 0, 22, 8, + 9, 0, 11, 39, 0, 26, 16, 25, 12, 0, 10, 116, + 98, 66, 65, 97, 49, 129, 33, 129, 33, 129, 33, 129, + 49, 97, 66, 66, 100, 0, 26, 16, 23, 15, 0, 21, + 50, 210, 210, 210, 210, 210, 125, 130, 210, 210, 210, 210, + 210, 240, 240, 125, 0, 13, 48, 22, 9, 0, 8, 20, + 50, 35, 34, 50, 35, 34, 113, 114, 97, 113, 113, 114, + 65, 38, 0, 18, 48, 22, 9, 0, 8, 4, 65, 51, + 34, 50, 114, 98, 82, 146, 130, 33, 66, 33, 51, 52, + 0, 18, 64, 13, 6, 240, 240, 226, 66, 50, 66, 50, + 65, 0, 16, 48, 44, 17, 0, 32, 49, 82, 130, 82, + 130, 66, 146, 66, 145, 82, 130, 82, 129, 83, 129, 83, + 49, 65, 66, 17, 34, 49, 17, 49, 36, 65, 35, 66, + 81, 240, 17, 240, 17, 242, 242, 242, 242, 240, 240, 32, + 57, 14, 0, 12, 89, 52, 49, 100, 49, 85, 49, 85, + 49, 85, 49, 85, 49, 85, 49, 100, 49, 115, 49, 145, + 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, + 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, 49, 145, + 49, 145, 49, 145, 49, 145, 49, 240, 64, 9, 5, 0, + 10, 83, 35, 35, 0, 9, 12, 7, 0, 23, 1, 81, + 97, 99, 98, 82, 36, 160, 19, 6, 240, 240, 226, 51, + 33, 18, 66, 66, 66, 66, 66, 66, 66, 66, 0, 12, + 32, 21, 9, 0, 8, 19, 82, 18, 50, 50, 34, 50, + 34, 50, 34, 50, 50, 18, 83, 0, 21, 112, 24, 10, + 0, 20, 1, 33, 97, 49, 97, 49, 82, 34, 82, 34, + 50, 34, 65, 49, 65, 49, 81, 33, 0, 12, 51, 20, + 0, 17, 98, 145, 115, 129, 113, 18, 129, 146, 113, 162, + 98, 162, 97, 178, 81, 194, 81, 194, 65, 210, 50, 97, + 98, 49, 98, 162, 68, 161, 81, 18, 145, 81, 34, 130, + 65, 50, 129, 88, 82, 146, 113, 162, 97, 178, 0, 20, + 64, 53, 19, 0, 16, 114, 145, 99, 129, 97, 18, 129, + 130, 113, 146, 97, 162, 97, 162, 81, 178, 81, 178, 65, + 52, 82, 50, 18, 35, 66, 49, 34, 50, 129, 51, 34, + 129, 129, 129, 129, 130, 113, 145, 113, 146, 97, 161, 98, + 65, 65, 118, 0, 19, 48, 56, 20, 0, 17, 85, 129, + 81, 66, 97, 97, 66, 82, 177, 97, 147, 97, 194, 81, + 210, 49, 226, 34, 145, 66, 33, 97, 50, 34, 33, 98, + 68, 49, 83, 161, 81, 18, 146, 65, 34, 145, 65, 50, + 129, 81, 50, 129, 72, 97, 162, 98, 162, 97, 178, 0, + 20, 48, 25, 10, 0, 18, 3, 115, 115, 240, 209, 145, + 145, 145, 145, 130, 85, 66, 129, 145, 145, 146, 146, 20, + 70, 84, 48, 55, 21, 240, 194, 240, 67, 240, 82, 240, + 97, 240, 240, 177, 240, 51, 240, 52, 240, 36, 240, 18, + 18, 240, 17, 35, 241, 35, 226, 50, 225, 67, 209, 67, + 194, 82, 193, 99, 171, 161, 130, 161, 131, 130, 131, 129, + 162, 129, 163, 98, 163, 70, 88, 0, 21, 32, 56, 21, + 240, 240, 34, 240, 51, 240, 35, 240, 34, 240, 240, 193, + 240, 51, 240, 52, 240, 36, 240, 18, 18, 240, 17, 35, + 241, 35, 226, 50, 225, 67, 209, 67, 194, 82, 193, 99, + 171, 161, 130, 161, 131, 130, 131, 129, 162, 129, 163, 98, + 163, 70, 88, 0, 21, 32, 56, 21, 240, 241, 240, 67, + 240, 34, 33, 241, 82, 240, 240, 129, 240, 51, 240, 52, + 240, 36, 240, 18, 18, 240, 17, 35, 241, 35, 226, 50, + 225, 67, 209, 67, 194, 82, 193, 99, 171, 161, 130, 161, + 131, 130, 131, 129, 162, 129, 163, 98, 163, 70, 88, 0, + 21, 32, 53, 21, 0, 6, 4, 65, 177, 53, 0, 7, + 49, 240, 51, 240, 52, 240, 36, 240, 18, 18, 240, 17, + 35, 241, 35, 226, 50, 225, 67, 209, 67, 193, 98, 193, + 99, 171, 161, 130, 161, 131, 130, 131, 129, 162, 129, 163, + 98, 163, 70, 88, 0, 21, 32, 51, 21, 0, 5, 114, + 66, 210, 66, 0, 9, 115, 240, 51, 240, 33, 18, 240, + 33, 19, 242, 19, 241, 50, 241, 51, 210, 51, 209, 82, + 209, 83, 178, 83, 186, 177, 115, 146, 115, 145, 146, 145, + 147, 114, 147, 99, 148, 70, 73, 0, 21, 32, 54, 21, + 116, 240, 18, 50, 225, 81, 225, 81, 226, 50, 245, 240, + 240, 131, 240, 51, 240, 36, 240, 37, 242, 34, 242, 34, + 241, 51, 210, 66, 210, 66, 209, 83, 178, 98, 186, 177, + 115, 146, 130, 145, 146, 145, 147, 114, 147, 99, 148, 70, + 88, 0, 21, 32, 62, 30, 0, 27, 63, 2, 240, 20, + 115, 240, 20, 146, 241, 18, 161, 225, 34, 161, 210, 34, + 240, 145, 50, 97, 240, 18, 50, 97, 242, 66, 82, 241, + 89, 233, 82, 210, 98, 97, 209, 114, 97, 194, 114, 240, + 65, 130, 177, 97, 146, 162, 82, 146, 161, 83, 146, 131, + 55, 79, 1, 0, 30, 48, 45, 18, 0, 16, 73, 115, + 83, 98, 130, 82, 162, 51, 242, 243, 243, 243, 243, 243, + 243, 243, 240, 19, 243, 240, 19, 145, 98, 130, 115, 82, + 166, 241, 240, 18, 240, 18, 240, 19, 240, 34, 240, 18, + 212, 240, 160, 51, 19, 240, 130, 240, 35, 240, 50, 240, + 66, 0, 5, 127, 114, 115, 114, 146, 98, 161, 98, 161, + 98, 240, 34, 97, 162, 97, 162, 82, 169, 162, 82, 162, + 97, 162, 97, 162, 240, 34, 177, 82, 162, 82, 161, 98, + 131, 63, 1, 0, 19, 48, 50, 19, 240, 226, 240, 19, + 242, 240, 17, 0, 6, 31, 114, 115, 114, 130, 114, 146, + 98, 161, 98, 240, 34, 97, 162, 97, 162, 82, 169, 162, + 82, 162, 97, 162, 97, 162, 240, 34, 177, 82, 161, 98, + 146, 98, 131, 63, 1, 0, 19, 48, 51, 19, 240, 178, + 240, 20, 226, 34, 193, 97, 240, 240, 255, 114, 115, 114, + 146, 98, 161, 98, 161, 98, 240, 34, 97, 162, 97, 162, + 82, 169, 162, 82, 162, 97, 162, 97, 162, 240, 34, 177, + 82, 162, 82, 161, 98, 131, 63, 1, 0, 19, 48, 48, + 18, 240, 240, 162, 66, 162, 66, 0, 7, 78, 114, 114, + 114, 130, 98, 145, 98, 240, 18, 240, 18, 97, 146, 97, + 146, 82, 153, 146, 82, 146, 97, 146, 97, 146, 240, 18, + 161, 82, 161, 82, 146, 82, 131, 47, 0, 18, 48, 29, + 9, 145, 130, 130, 145, 240, 135, 66, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 87, 0, 9, 32, 30, 10, 240, 18, 115, 98, 113, 240, + 184, 82, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 88, 0, 10, 32, 31, 10, + 210, 116, 82, 34, 49, 97, 240, 120, 82, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 88, 0, 10, 32, 31, 10, 240, 82, 66, 34, 66, + 240, 240, 40, 82, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 88, 0, 10, 32, + 42, 21, 0, 18, 60, 194, 99, 162, 131, 130, 147, 114, + 163, 98, 163, 98, 178, 98, 179, 82, 179, 42, 99, 82, + 179, 82, 179, 82, 179, 82, 178, 98, 163, 98, 162, 114, + 146, 130, 115, 109, 0, 22, 61, 21, 0, 6, 4, 65, + 177, 53, 0, 8, 101, 119, 83, 145, 132, 129, 132, 129, + 129, 19, 113, 129, 35, 97, 129, 36, 81, 129, 51, 81, + 129, 67, 65, 129, 83, 49, 129, 83, 49, 129, 99, 33, + 129, 115, 17, 129, 115, 17, 129, 132, 129, 147, 129, 147, + 129, 162, 87, 129, 0, 21, 80, 50, 19, 240, 146, 240, + 35, 240, 50, 240, 50, 0, 6, 85, 194, 82, 146, 114, + 114, 146, 83, 147, 66, 178, 51, 179, 35, 179, 35, 179, + 35, 179, 35, 179, 35, 179, 35, 179, 50, 178, 67, 147, + 82, 146, 99, 115, 130, 82, 197, 0, 20, 49, 19, 240, + 226, 240, 19, 242, 240, 18, 0, 6, 101, 194, 82, 146, + 114, 114, 146, 83, 147, 66, 178, 51, 179, 35, 179, 35, + 179, 35, 179, 35, 179, 35, 179, 35, 179, 50, 178, 67, + 147, 82, 146, 99, 115, 130, 82, 197, 0, 20, 53, 19, + 129, 240, 35, 240, 19, 241, 49, 209, 81, 177, 113, 240, + 240, 21, 194, 82, 146, 114, 114, 146, 83, 147, 66, 178, + 51, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, + 35, 179, 50, 178, 67, 147, 82, 146, 99, 115, 130, 82, + 197, 0, 20, 48, 19, 240, 240, 212, 49, 161, 52, 0, + 8, 101, 194, 82, 146, 114, 114, 146, 83, 147, 66, 178, + 51, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, + 35, 179, 50, 178, 67, 147, 82, 146, 99, 115, 130, 82, + 197, 0, 20, 48, 19, 240, 240, 210, 66, 178, 66, 0, + 8, 85, 194, 82, 146, 114, 114, 146, 83, 147, 66, 178, + 51, 179, 35, 179, 35, 179, 35, 179, 35, 179, 35, 179, + 35, 179, 50, 178, 67, 147, 82, 146, 99, 115, 130, 82, + 197, 0, 20, 25, 12, 0, 21, 17, 113, 50, 82, 65, + 66, 97, 34, 131, 146, 146, 17, 114, 49, 82, 81, 50, + 113, 0, 15, 32, 55, 19, 0, 17, 53, 81, 98, 82, + 34, 67, 131, 82, 146, 83, 147, 66, 145, 18, 51, 129, + 35, 35, 113, 51, 35, 97, 67, 35, 81, 83, 35, 65, + 99, 35, 49, 115, 35, 33, 131, 50, 17, 146, 67, 147, + 82, 146, 83, 131, 66, 34, 82, 97, 85, 0, 20, 52, + 22, 240, 211, 240, 83, 240, 83, 240, 98, 0, 6, 104, + 87, 82, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, + 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, + 177, 130, 177, 130, 177, 146, 145, 162, 130, 179, 82, 230, + 0, 23, 16, 53, 22, 240, 240, 51, 240, 52, 240, 50, + 240, 65, 0, 7, 8, 87, 82, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 146, 145, + 162, 130, 179, 82, 230, 0, 23, 16, 54, 22, 161, 240, + 82, 240, 68, 240, 34, 49, 241, 98, 0, 6, 56, 87, + 82, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 146, 145, 162, 130, 179, 82, 230, 0, + 23, 16, 50, 22, 0, 6, 34, 66, 226, 66, 0, 9, + 40, 87, 82, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, 130, 177, + 130, 177, 130, 177, 130, 177, 146, 145, 162, 130, 179, 82, + 230, 0, 23, 16, 54, 21, 240, 240, 50, 240, 51, 240, + 34, 240, 49, 0, 6, 88, 86, 68, 131, 115, 130, 131, + 129, 162, 129, 163, 97, 194, 97, 195, 65, 226, 49, 243, + 33, 240, 18, 17, 240, 36, 240, 50, 240, 66, 240, 66, + 240, 66, 240, 66, 240, 66, 240, 24, 0, 22, 34, 17, + 0, 14, 120, 194, 242, 242, 248, 146, 83, 114, 114, 98, + 130, 82, 130, 82, 130, 82, 130, 82, 114, 98, 83, 120, + 146, 242, 242, 242, 200, 0, 18, 16, 46, 15, 0, 13, + 101, 145, 51, 114, 66, 98, 82, 98, 81, 114, 66, 114, + 49, 116, 33, 162, 33, 162, 33, 162, 34, 146, 51, 114, + 67, 98, 83, 82, 99, 66, 114, 66, 17, 82, 66, 34, + 34, 52, 37, 0, 15, 64, 35, 13, 0, 11, 66, 179, + 178, 194, 193, 193, 240, 133, 114, 50, 83, 66, 81, 82, + 178, 133, 98, 50, 82, 66, 66, 82, 66, 82, 66, 67, + 85, 35, 0, 13, 32, 34, 13, 0, 12, 18, 178, 163, + 162, 177, 177, 240, 133, 114, 50, 83, 66, 178, 178, 133, + 98, 50, 82, 66, 66, 82, 66, 82, 66, 67, 85, 35, + 0, 13, 32, 37, 13, 0, 11, 113, 194, 163, 161, 33, + 129, 65, 97, 97, 240, 69, 114, 50, 83, 66, 178, 178, + 133, 98, 50, 82, 66, 66, 82, 66, 82, 66, 67, 85, + 35, 0, 13, 32, 36, 13, 0, 14, 115, 65, 65, 34, + 33, 65, 67, 240, 240, 53, 114, 50, 83, 66, 178, 178, + 133, 98, 50, 82, 66, 66, 82, 66, 82, 66, 67, 85, + 35, 0, 13, 32, 34, 13, 0, 14, 98, 50, 98, 50, + 0, 5, 100, 130, 34, 98, 66, 178, 178, 133, 99, 34, + 97, 66, 82, 66, 82, 66, 82, 66, 33, 53, 19, 0, + 13, 48, 37, 13, 0, 11, 100, 130, 34, 113, 65, 113, + 50, 132, 240, 240, 69, 114, 50, 98, 66, 178, 178, 133, + 98, 50, 82, 66, 66, 82, 66, 82, 66, 67, 85, 20, + 0, 13, 32, 35, 19, 0, 33, 69, 53, 82, 50, 18, + 50, 51, 67, 82, 146, 98, 154, 116, 195, 34, 178, 66, + 162, 82, 162, 83, 97, 34, 65, 19, 65, 69, 69, 0, + 19, 64, 30, 12, 0, 21, 53, 98, 50, 66, 67, 49, + 98, 34, 162, 162, 162, 162, 178, 97, 66, 65, 101, 145, + 161, 177, 194, 178, 162, 116, 240, 32, 31, 12, 0, 10, + 98, 162, 178, 177, 178, 177, 240, 101, 98, 50, 66, 82, + 34, 98, 42, 34, 162, 162, 162, 178, 97, 66, 65, 101, + 0, 12, 64, 31, 12, 0, 11, 50, 147, 146, 161, 162, + 161, 240, 101, 98, 50, 66, 82, 34, 98, 42, 34, 162, + 162, 162, 178, 97, 66, 65, 101, 0, 12, 64, 34, 12, + 0, 11, 17, 162, 163, 130, 18, 97, 65, 97, 81, 240, + 53, 98, 50, 66, 82, 34, 98, 42, 34, 162, 162, 162, + 178, 97, 66, 65, 101, 0, 12, 64, 29, 12, 0, 13, + 98, 50, 82, 50, 240, 240, 197, 98, 50, 66, 81, 50, + 98, 42, 34, 162, 162, 162, 178, 178, 50, 100, 0, 12, + 80, 25, 8, 0, 7, 1, 114, 98, 114, 113, 129, 226, + 68, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, + 8, 32, 25, 8, 0, 7, 81, 98, 98, 82, 97, 97, + 242, 68, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, + 0, 8, 32, 27, 10, 0, 10, 50, 116, 97, 33, 81, + 65, 49, 97, 242, 100, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 102, 0, 10, 48, 25, 9, 0, 10, 18, 50, + 34, 50, 240, 240, 34, 84, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 86, 0, 9, 32, 39, 14, 0, 12, 67, + 66, 114, 33, 163, 164, 130, 50, 210, 195, 119, 82, 67, + 66, 99, 35, 114, 34, 130, 34, 130, 34, 130, 34, 130, + 34, 114, 66, 98, 82, 66, 117, 0, 14, 96, 37, 15, + 0, 19, 20, 49, 97, 52, 240, 240, 114, 36, 86, 34, + 114, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 70, 22, 0, 15, 32, 36, + 14, 0, 12, 66, 195, 194, 210, 209, 225, 240, 149, 130, + 66, 82, 98, 51, 98, 50, 130, 34, 130, 34, 130, 34, + 130, 34, 115, 50, 98, 82, 66, 117, 0, 14, 96, 36, + 14, 0, 13, 34, 179, 178, 178, 193, 193, 240, 165, 130, + 66, 82, 98, 51, 98, 50, 130, 34, 130, 34, 130, 34, + 130, 34, 115, 50, 98, 82, 66, 117, 0, 14, 96, 38, + 14, 0, 14, 82, 180, 161, 33, 145, 65, 113, 97, 240, + 101, 130, 66, 82, 98, 51, 98, 50, 130, 34, 130, 34, + 130, 34, 130, 34, 115, 50, 98, 82, 66, 117, 0, 14, + 96, 38, 14, 0, 16, 19, 65, 66, 34, 33, 81, 67, + 240, 240, 101, 130, 66, 82, 98, 51, 98, 50, 130, 34, + 130, 34, 130, 34, 130, 34, 115, 50, 98, 82, 66, 117, + 0, 14, 96, 35, 14, 0, 16, 2, 50, 114, 50, 0, + 6, 37, 130, 66, 82, 98, 51, 98, 50, 130, 34, 130, + 34, 130, 34, 130, 34, 115, 50, 98, 82, 66, 117, 0, + 14, 96, 18, 15, 0, 26, 115, 195, 195, 240, 240, 125, + 240, 240, 115, 195, 195, 0, 17, 96, 37, 14, 0, 25, + 5, 33, 66, 67, 66, 98, 51, 81, 17, 50, 81, 34, + 34, 65, 50, 34, 49, 66, 34, 33, 82, 49, 17, 83, + 50, 98, 67, 66, 65, 52, 0, 14, 96, 38, 15, 0, + 13, 66, 210, 226, 225, 225, 241, 240, 132, 52, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 98, 82, 99, 51, 117, 20, 0, 15, 32, 38, + 15, 0, 14, 18, 195, 194, 209, 209, 225, 240, 132, 52, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 99, 51, 117, 20, 0, 15, + 32, 40, 15, 0, 13, 113, 210, 211, 177, 33, 161, 65, + 241, 240, 84, 52, 98, 82, 98, 82, 98, 82, 98, 82, + 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 99, 51, + 117, 20, 0, 15, 32, 37, 15, 0, 17, 34, 50, 130, + 50, 0, 6, 36, 67, 98, 82, 98, 82, 98, 82, 98, + 82, 98, 82, 98, 82, 98, 82, 98, 82, 98, 82, 99, + 51, 117, 20, 0, 15, 32, 41, 15, 0, 14, 33, 210, + 210, 194, 209, 240, 240, 118, 52, 66, 98, 82, 98, 98, + 81, 114, 81, 129, 65, 146, 49, 146, 33, 178, 17, 179, + 210, 209, 225, 209, 225, 209, 165, 164, 179, 240, 192, 44, + 14, 0, 12, 66, 164, 194, 194, 194, 194, 194, 194, 35, + 116, 35, 82, 82, 82, 98, 66, 98, 66, 98, 66, 98, + 66, 98, 66, 98, 66, 82, 83, 50, 98, 20, 114, 194, + 194, 194, 194, 194, 166, 240, 112, 40, 15, 0, 17, 34, + 50, 130, 50, 0, 6, 37, 68, 51, 97, 98, 97, 98, + 81, 130, 65, 130, 49, 146, 49, 162, 33, 162, 17, 195, + 194, 210, 209, 225, 209, 225, 164, 180, 179, 240, 192, +}; + +//***************************************************************************** +// +// The glyph offset table for the 26 point Theanooldstyle font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanooldstyle26[] = +{ + 0, 5, 29, 50, 93, 148, 209, 260, + 273, 304, 335, 365, 385, 398, 406, 416, + 448, 491, 519, 553, 587, 621, 653, 692, + 721, 762, 801, 816, 834, 855, 866, 887, + 913, 990, 1037, 1079, 1113, 1155, 1198, 1239, + 1283, 1327, 1353, 1386, 1431, 1474, 1546, 1601, + 1643, 1678, 1732, 1775, 1810, 1856, 1900, 1946, + 2017, 2061, 2106, 2140, 2171, 2202, 2233, 2254, + 2262, 2274, 2301, 2339, 2363, 2401, 2425, 2452, + 2491, 2529, 2553, 2583, 2621, 2647, 2691, 2722, + 2751, 2788, 2825, 2846, 2869, 2894, 2925, 2952, + 2994, 3023, 3057, 3082, 3114, 3144, 3176, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3189, 3194, 3216, 3259, 3303, 3332, 3367, 3392, + 3438, 3449, 3507, 3527, 3551, 3564, 3572, 3635, + 3643, 3668, 3691, 3713, 3735, 3748, 3792, 3849, + 3858, 3870, 3889, 3910, 3934, 3985, 4038, 4094, + 4119, 4174, 4230, 4286, 4339, 4390, 4444, 4506, + 4551, 4602, 4652, 4703, 4751, 4780, 4810, 4841, + 4872, 4914, 4975, 5025, 5074, 5127, 5175, 5223, + 5248, 5303, 5355, 5408, 5462, 5512, 5566, 5600, + 5646, 5681, 5715, 5752, 5788, 5822, 5859, 5894, + 5924, 5955, 5986, 6020, 6049, 6074, 6099, 6126, + 6151, 6190, 6227, 6263, 6299, 6337, 6375, 6410, + 6428, 6465, 6503, 6541, 6581, 6618, 6659, 6703, +}; + +//***************************************************************************** +// +// The font definition for the 26 point Theanooldstyle font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanooldstyle26 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 27, + + // + // The height of the font. + // + 34, + + // + // The baseline of the font. + // + 26, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanooldstyle26, + + // + // A pointer to the actual font data + // + g_pui8Theanooldstyle26Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanooldstyle28.c b/third_party/fonts/ofl/fonts/fonttheanooldstyle28.c new file mode 100644 index 0000000..f0c7e67 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanooldstyle28.c @@ -0,0 +1,832 @@ +//***************************************************************************** +// +// fonttheanooldstyle28.c - Font definition for the 28pt Theanooldstyle font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanooldstyle +// Size: 28 point +// Bold: no +// Italic: no +// Memory usage: 7556 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 28 point Theanooldstyle font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanooldstyle28Data[7354] = +{ + 5, 11, 0, 50, 112, 26, 6, 240, 240, 210, 52, 36, + 36, 36, 35, 66, 66, 65, 81, 81, 81, 81, 81, 81, + 240, 130, 52, 50, 0, 7, 16, 23, 9, 0, 7, 114, + 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, 50, 34, + 50, 33, 65, 0, 25, 16, 47, 16, 0, 14, 82, 65, + 146, 65, 145, 81, 145, 81, 145, 66, 145, 66, 130, 65, + 94, 97, 81, 145, 81, 145, 66, 130, 65, 145, 81, 145, + 81, 110, 81, 66, 130, 65, 145, 81, 145, 81, 145, 66, + 145, 66, 0, 18, 112, 59, 15, 0, 10, 17, 225, 197, + 130, 33, 34, 82, 49, 49, 66, 65, 50, 50, 65, 35, + 50, 65, 35, 50, 65, 49, 67, 49, 148, 17, 166, 182, + 181, 161, 20, 145, 51, 129, 66, 35, 49, 66, 35, 49, + 66, 34, 65, 66, 34, 65, 50, 67, 33, 34, 119, 177, + 225, 0, 14, 16, 66, 21, 0, 18, 84, 130, 98, 34, + 113, 113, 65, 98, 98, 66, 81, 114, 66, 66, 114, 66, + 65, 130, 66, 49, 161, 65, 65, 162, 34, 49, 196, 50, + 240, 65, 240, 66, 52, 193, 50, 34, 161, 65, 65, 161, + 50, 66, 129, 66, 66, 114, 66, 66, 113, 82, 66, 98, + 97, 65, 113, 114, 34, 97, 148, 0, 24, 16, 58, 22, + 0, 20, 36, 240, 18, 35, 241, 66, 226, 66, 226, 66, + 226, 50, 242, 49, 240, 21, 240, 50, 240, 68, 71, 82, + 19, 115, 82, 51, 98, 82, 67, 97, 97, 99, 65, 98, + 100, 49, 98, 115, 33, 114, 133, 114, 132, 146, 132, 131, + 82, 20, 49, 86, 85, 0, 25, 16, 14, 4, 240, 210, + 34, 34, 34, 34, 34, 34, 33, 0, 11, 48, 34, 9, + 0, 8, 66, 113, 113, 113, 129, 114, 113, 114, 114, 113, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 129, 130, 114, + 129, 130, 129, 130, 129, 145, 240, 96, 34, 8, 0, 7, + 1, 113, 129, 129, 113, 114, 113, 114, 98, 113, 114, 98, + 98, 98, 98, 98, 98, 98, 98, 97, 98, 98, 97, 98, + 97, 98, 97, 97, 240, 128, 31, 12, 0, 11, 2, 162, + 162, 98, 49, 49, 35, 33, 34, 66, 17, 17, 131, 114, + 19, 67, 33, 34, 34, 49, 49, 98, 162, 162, 0, 26, + 32, 20, 16, 0, 28, 98, 226, 226, 226, 226, 226, 142, + 130, 226, 226, 226, 226, 226, 226, 0, 19, 14, 6, 0, + 18, 114, 52, 51, 81, 81, 65, 81, 65, 240, 208, 9, + 11, 0, 28, 121, 41, 0, 19, 64, 10, 6, 0, 18, + 114, 52, 50, 0, 7, 16, 34, 10, 0, 9, 66, 129, + 145, 145, 130, 129, 145, 145, 130, 130, 129, 145, 145, 130, + 130, 129, 145, 130, 130, 129, 145, 145, 130, 130, 129, 145, + 145, 130, 240, 208, 47, 16, 0, 14, 84, 162, 66, 114, + 98, 98, 98, 83, 99, 66, 130, 66, 130, 51, 131, 35, + 131, 35, 131, 35, 131, 35, 131, 35, 131, 35, 131, 50, + 130, 66, 130, 67, 99, 82, 98, 98, 98, 114, 66, 164, + 0, 18, 112, 31, 8, 0, 7, 66, 83, 83, 65, 18, + 49, 34, 33, 50, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 0, 9, 32, 37, 14, + 0, 12, 101, 129, 67, 81, 98, 66, 114, 51, 98, 51, + 98, 66, 98, 194, 178, 193, 194, 178, 177, 193, 193, 209, + 193, 113, 65, 129, 65, 114, 58, 59, 0, 16, 16, 38, + 14, 0, 12, 101, 114, 67, 66, 98, 66, 114, 51, 98, + 51, 98, 194, 178, 178, 132, 226, 210, 210, 194, 194, 49, + 130, 35, 114, 50, 114, 50, 98, 82, 66, 118, 0, 16, + 48, 37, 17, 0, 16, 17, 242, 227, 227, 209, 18, 193, + 34, 178, 34, 177, 50, 161, 66, 145, 82, 145, 82, 129, + 98, 113, 114, 111, 178, 242, 242, 242, 242, 242, 242, 0, + 19, 112, 35, 15, 0, 10, 97, 225, 90, 89, 97, 225, + 225, 225, 231, 137, 97, 84, 195, 211, 210, 210, 210, 210, + 210, 34, 145, 51, 114, 51, 113, 83, 66, 133, 0, 17, + 96, 41, 14, 0, 13, 35, 146, 178, 178, 178, 178, 178, + 194, 194, 21, 82, 17, 66, 67, 98, 51, 99, 34, 130, + 34, 130, 34, 130, 34, 130, 49, 130, 50, 98, 81, 98, + 82, 66, 132, 0, 16, 64, 31, 14, 0, 12, 59, 59, + 49, 129, 49, 145, 49, 145, 194, 193, 209, 194, 193, 209, + 194, 194, 193, 194, 194, 179, 179, 179, 163, 179, 0, 16, + 80, 45, 15, 0, 13, 85, 146, 51, 98, 82, 82, 114, + 66, 114, 66, 114, 67, 98, 68, 66, 100, 34, 133, 197, + 145, 21, 98, 68, 66, 115, 34, 146, 34, 146, 34, 146, + 34, 146, 50, 114, 82, 82, 133, 0, 17, 80, 40, 14, + 0, 12, 100, 130, 65, 98, 97, 82, 98, 50, 129, 50, + 130, 34, 130, 34, 130, 34, 130, 34, 115, 50, 99, 66, + 65, 18, 85, 18, 194, 194, 178, 178, 178, 178, 178, 147, + 0, 17, 15, 6, 0, 11, 50, 52, 51, 240, 240, 242, + 52, 50, 0, 7, 16, 19, 6, 0, 11, 50, 52, 51, + 240, 240, 227, 52, 36, 81, 81, 65, 81, 65, 240, 208, + 22, 15, 0, 25, 113, 195, 163, 163, 179, 163, 163, 178, + 211, 227, 227, 227, 226, 227, 226, 0, 17, 16, 11, 16, + 0, 34, 14, 0, 8, 46, 0, 28, 32, 22, 15, 0, + 24, 49, 227, 227, 226, 227, 227, 227, 226, 195, 163, 163, + 163, 163, 179, 178, 0, 18, 64, 29, 11, 0, 9, 100, + 103, 68, 34, 161, 177, 161, 161, 146, 70, 85, 98, 145, + 161, 161, 161, 161, 240, 240, 19, 132, 130, 0, 13, 32, + 83, 26, 0, 30, 87, 240, 19, 99, 195, 162, 162, 210, + 130, 242, 98, 240, 18, 82, 116, 19, 50, 51, 98, 33, + 19, 50, 50, 98, 52, 66, 50, 82, 67, 82, 34, 82, + 83, 82, 34, 67, 82, 98, 34, 66, 83, 82, 50, 66, + 82, 98, 50, 50, 83, 82, 66, 50, 67, 98, 66, 50, + 67, 81, 114, 34, 34, 18, 50, 130, 51, 68, 163, 240, + 146, 241, 146, 194, 194, 115, 240, 23, 0, 14, 64, 51, + 22, 0, 20, 50, 240, 83, 240, 49, 18, 240, 49, 18, + 240, 34, 19, 240, 17, 35, 240, 17, 50, 242, 51, 225, + 67, 225, 82, 210, 83, 193, 99, 202, 177, 131, 161, 131, + 161, 146, 145, 163, 129, 163, 114, 163, 99, 164, 70, 104, + 0, 25, 45, 18, 0, 15, 107, 162, 84, 114, 115, 98, + 131, 82, 131, 82, 131, 82, 131, 82, 131, 82, 115, 98, + 99, 120, 162, 99, 114, 115, 98, 131, 82, 131, 82, 131, + 82, 131, 82, 131, 82, 115, 98, 99, 76, 0, 21, 47, + 19, 0, 17, 58, 115, 84, 99, 130, 83, 162, 66, 193, + 51, 240, 18, 240, 19, 240, 19, 240, 19, 240, 19, 240, + 19, 240, 19, 240, 19, 240, 34, 240, 35, 240, 34, 193, + 67, 161, 99, 130, 115, 82, 198, 0, 22, 16, 47, 22, + 0, 19, 44, 210, 100, 162, 131, 146, 162, 130, 163, 114, + 179, 98, 179, 98, 195, 82, 195, 82, 195, 82, 195, 82, + 195, 82, 195, 82, 195, 82, 194, 98, 179, 98, 179, 98, + 163, 114, 147, 130, 131, 109, 0, 25, 112, 47, 19, 0, + 16, 95, 114, 115, 114, 146, 98, 161, 98, 161, 98, 240, + 34, 97, 162, 97, 162, 97, 162, 82, 169, 162, 82, 162, + 97, 162, 97, 162, 240, 34, 177, 82, 177, 82, 162, 82, + 162, 82, 132, 47, 1, 0, 21, 96, 45, 18, 0, 15, + 111, 98, 115, 98, 146, 82, 161, 82, 161, 82, 240, 18, + 97, 146, 97, 146, 97, 146, 82, 153, 146, 82, 146, 97, + 146, 97, 146, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 216, 0, 21, 64, 48, 22, 0, 20, 25, 178, 99, + 147, 131, 115, 162, 114, 193, 99, 240, 66, 240, 67, 240, + 67, 240, 67, 240, 67, 240, 67, 152, 35, 194, 83, 194, + 98, 194, 99, 178, 114, 178, 115, 162, 131, 131, 163, 84, + 199, 33, 0, 25, 48, 47, 22, 0, 19, 40, 72, 82, + 162, 130, 162, 130, 162, 130, 162, 130, 162, 130, 162, 130, + 162, 130, 162, 130, 162, 142, 130, 162, 130, 162, 130, 162, + 130, 162, 130, 162, 130, 162, 130, 162, 130, 162, 130, 162, + 88, 72, 0, 25, 28, 10, 0, 8, 104, 82, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 88, 0, 11, 64, 36, 13, 0, 11, + 104, 130, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 177, + 193, 99, 33, 118, 131, 240, 240, 80, 49, 21, 0, 18, + 56, 71, 82, 147, 114, 146, 130, 129, 162, 113, 178, 97, + 194, 81, 210, 65, 226, 35, 226, 20, 228, 19, 211, 51, + 194, 67, 194, 83, 178, 84, 162, 99, 162, 115, 146, 116, + 130, 131, 130, 132, 72, 41, 0, 23, 112, 48, 19, 0, + 16, 88, 226, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, 34, 240, + 34, 240, 34, 240, 34, 240, 34, 177, 82, 177, 82, 162, + 82, 162, 82, 131, 63, 1, 0, 21, 96, 78, 26, 0, + 22, 102, 198, 83, 195, 132, 164, 132, 161, 18, 129, 19, + 145, 18, 129, 19, 130, 18, 129, 34, 129, 34, 129, 35, + 98, 34, 129, 35, 97, 50, 129, 51, 81, 50, 129, 51, + 66, 50, 129, 51, 65, 66, 129, 67, 34, 66, 129, 67, + 33, 82, 129, 82, 33, 82, 129, 85, 82, 129, 84, 98, + 129, 99, 98, 129, 99, 98, 129, 98, 114, 87, 65, 72, + 0, 29, 64, 60, 22, 0, 19, 38, 119, 83, 161, 132, + 145, 133, 129, 129, 19, 129, 129, 20, 113, 129, 36, 97, + 129, 51, 97, 129, 67, 81, 129, 68, 65, 129, 83, 65, + 129, 99, 49, 129, 100, 33, 129, 115, 33, 129, 131, 17, + 129, 133, 129, 148, 129, 163, 129, 163, 129, 178, 87, 145, + 0, 25, 48, 47, 21, 0, 19, 22, 211, 83, 146, 146, + 114, 178, 83, 178, 83, 179, 66, 210, 51, 211, 35, 211, + 35, 211, 35, 211, 35, 211, 35, 211, 35, 211, 50, 210, + 67, 179, 67, 179, 82, 178, 114, 146, 147, 83, 199, 0, + 24, 80, 45, 18, 0, 15, 108, 146, 84, 114, 115, 98, + 115, 98, 131, 82, 131, 82, 131, 82, 131, 82, 115, 98, + 115, 98, 83, 136, 162, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 240, 18, 240, 18, 216, 0, 21, 64, 60, + 21, 0, 19, 23, 195, 83, 146, 146, 114, 178, 83, 178, + 83, 179, 66, 210, 51, 211, 35, 211, 35, 211, 35, 211, + 35, 211, 35, 211, 35, 211, 50, 210, 67, 179, 67, 179, + 82, 178, 114, 146, 147, 83, 199, 240, 34, 240, 49, 145, + 132, 113, 120, 66, 99, 41, 114, 100, 0, 8, 80, 46, + 22, 0, 19, 44, 210, 84, 178, 100, 162, 116, 146, 131, + 146, 131, 146, 131, 146, 131, 146, 115, 162, 99, 184, 226, + 50, 242, 66, 226, 67, 210, 83, 194, 84, 178, 99, 178, + 115, 162, 116, 146, 133, 72, 102, 0, 25, 38, 17, 0, + 15, 73, 98, 84, 82, 115, 66, 146, 66, 161, 66, 243, + 243, 229, 215, 199, 214, 227, 243, 242, 33, 194, 34, 178, + 35, 162, 51, 130, 69, 82, 81, 54, 0, 19, 112, 51, + 20, 0, 17, 95, 1, 52, 66, 68, 34, 98, 98, 33, + 114, 113, 33, 114, 113, 162, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, + 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 248, 0, + 23, 48, 47, 23, 0, 20, 24, 103, 82, 193, 130, 193, + 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, + 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, + 130, 193, 130, 178, 146, 161, 163, 130, 194, 83, 246, 0, + 27, 52, 23, 0, 20, 25, 87, 68, 179, 99, 178, 130, + 177, 147, 146, 147, 145, 179, 129, 179, 114, 194, 113, 211, + 97, 211, 82, 227, 65, 243, 65, 240, 18, 50, 240, 19, + 33, 240, 35, 33, 240, 52, 240, 68, 240, 83, 240, 82, + 240, 98, 0, 27, 32, 84, 33, 0, 28, 121, 41, 71, + 68, 131, 147, 115, 131, 146, 146, 146, 146, 147, 130, 145, + 163, 131, 129, 178, 116, 114, 179, 97, 18, 113, 195, 97, + 19, 97, 210, 82, 19, 81, 226, 81, 50, 81, 227, 50, + 51, 50, 227, 49, 67, 49, 240, 18, 49, 82, 49, 240, + 19, 18, 83, 18, 240, 19, 17, 99, 17, 240, 50, 17, + 114, 17, 240, 52, 115, 240, 67, 131, 240, 82, 146, 240, + 81, 161, 0, 38, 80, 50, 22, 0, 19, 57, 55, 100, + 115, 132, 114, 163, 98, 195, 81, 211, 66, 227, 34, 240, + 19, 17, 240, 36, 240, 67, 240, 83, 240, 52, 240, 34, + 19, 242, 35, 241, 67, 209, 99, 178, 99, 177, 131, 146, + 131, 131, 132, 72, 72, 0, 25, 51, 22, 0, 19, 40, + 87, 68, 147, 115, 146, 131, 145, 162, 145, 163, 113, 194, + 113, 194, 97, 211, 65, 242, 65, 243, 33, 240, 34, 18, + 240, 34, 17, 240, 66, 240, 82, 240, 82, 240, 82, 240, + 82, 240, 82, 240, 82, 240, 40, 0, 25, 112, 39, 19, + 0, 17, 14, 68, 115, 82, 147, 66, 147, 81, 147, 97, + 132, 243, 243, 244, 243, 243, 243, 240, 19, 243, 243, 244, + 243, 146, 67, 161, 68, 146, 67, 147, 63, 1, 0, 21, + 96, 34, 8, 0, 7, 6, 34, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 102, 160, 34, + 10, 0, 8, 98, 145, 145, 145, 146, 130, 145, 145, 145, + 146, 130, 145, 145, 146, 130, 145, 145, 145, 146, 130, 145, + 145, 145, 146, 145, 145, 145, 146, 240, 112, 34, 8, 0, + 7, 6, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 38, 160, 21, 16, 0, 14, 98, + 212, 182, 147, 34, 146, 66, 114, 98, 82, 130, 49, 178, + 241, 0, 42, 32, 8, 16, 0, 64, 14, 0, 8, 32, + 14, 6, 240, 240, 194, 67, 66, 66, 82, 81, 81, 0, + 17, 64, 30, 15, 0, 28, 54, 131, 50, 99, 82, 210, + 210, 165, 115, 50, 98, 82, 82, 98, 82, 98, 82, 98, + 83, 67, 33, 54, 35, 0, 17, 32, 41, 15, 0, 13, + 50, 180, 210, 210, 210, 210, 210, 210, 210, 36, 116, 50, + 98, 98, 82, 114, 66, 114, 66, 114, 66, 114, 66, 114, + 66, 114, 66, 113, 82, 98, 83, 66, 97, 37, 0, 17, + 64, 24, 12, 0, 23, 4, 98, 51, 50, 82, 50, 82, + 34, 162, 162, 162, 162, 178, 162, 97, 66, 66, 100, 0, + 14, 41, 15, 0, 14, 34, 180, 210, 210, 210, 210, 210, + 210, 117, 18, 98, 67, 82, 98, 81, 114, 66, 114, 66, + 114, 66, 114, 66, 114, 66, 114, 66, 114, 82, 98, 98, + 52, 116, 36, 0, 17, 16, 25, 13, 0, 24, 116, 114, + 66, 66, 97, 65, 114, 43, 34, 178, 178, 178, 194, 178, + 113, 66, 66, 116, 0, 15, 32, 29, 12, 0, 11, 20, + 113, 35, 81, 177, 162, 162, 162, 162, 135, 114, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 134, 0, 14, 32, + 41, 16, 0, 30, 54, 50, 51, 68, 17, 50, 98, 82, + 130, 66, 130, 66, 130, 82, 98, 114, 67, 119, 129, 226, + 227, 230, 200, 114, 68, 81, 146, 50, 146, 50, 146, 52, + 83, 104, 240, 240, 128, 42, 16, 0, 14, 34, 196, 226, + 226, 226, 226, 226, 226, 226, 36, 130, 17, 50, 115, 82, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 70, 38, 0, 18, 32, 25, + 7, 0, 6, 35, 67, 67, 240, 240, 162, 52, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 53, 0, 8, 16, + 32, 9, 0, 8, 51, 99, 99, 0, 6, 66, 84, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 113, 129, 50, 33, 68, 240, 128, 40, 16, 0, 14, + 34, 196, 226, 226, 226, 226, 226, 226, 226, 70, 66, 83, + 98, 82, 114, 66, 130, 49, 162, 33, 182, 162, 35, 146, + 51, 130, 67, 114, 83, 98, 99, 54, 38, 0, 18, 32, + 28, 8, 0, 7, 34, 68, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 70, 0, 9, 32, 48, 24, 0, 45, 34, 36, 68, 100, + 17, 50, 33, 50, 115, 83, 82, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 38, + 38, 0, 27, 32, 34, 16, 0, 30, 34, 36, 100, 17, + 50, 115, 82, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 38, 0, + 18, 32, 31, 14, 0, 26, 100, 130, 66, 82, 98, 66, + 98, 50, 130, 34, 130, 34, 130, 34, 130, 34, 130, 50, + 98, 66, 98, 82, 66, 132, 0, 16, 64, 40, 15, 0, + 28, 50, 36, 86, 50, 98, 98, 82, 114, 66, 114, 66, + 114, 66, 114, 66, 114, 66, 114, 66, 113, 82, 98, 83, + 66, 98, 21, 114, 210, 210, 210, 210, 210, 182, 240, 240, + 144, 40, 15, 0, 28, 69, 33, 98, 67, 82, 98, 81, + 114, 66, 114, 66, 114, 66, 114, 66, 114, 66, 114, 66, + 114, 82, 98, 98, 67, 117, 18, 210, 210, 210, 210, 210, + 210, 182, 240, 240, 32, 21, 11, 0, 20, 114, 35, 51, + 20, 67, 130, 146, 146, 146, 146, 146, 146, 146, 146, 118, + 0, 13, 24, 11, 0, 20, 118, 50, 66, 49, 97, 49, + 162, 164, 133, 147, 162, 146, 33, 98, 34, 66, 55, 0, + 12, 112, 26, 10, 0, 12, 113, 145, 145, 130, 115, 104, + 66, 130, 130, 130, 130, 130, 130, 130, 130, 130, 131, 33, + 84, 0, 11, 80, 33, 16, 0, 30, 4, 68, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 114, 52, 132, 36, 0, 18, + 32, 30, 16, 0, 30, 6, 53, 51, 114, 82, 113, 114, + 97, 114, 81, 130, 81, 146, 49, 162, 49, 178, 17, 194, + 17, 194, 17, 210, 226, 0, 19, 45, 22, 0, 41, 38, + 22, 37, 51, 67, 82, 98, 82, 82, 99, 67, 65, 130, + 67, 65, 130, 67, 49, 162, 33, 34, 33, 162, 33, 34, + 33, 162, 17, 50, 17, 195, 67, 195, 67, 194, 82, 225, + 97, 0, 25, 96, 30, 17, 0, 31, 118, 54, 67, 99, + 98, 97, 146, 65, 178, 33, 196, 227, 228, 193, 34, 177, + 66, 145, 98, 99, 99, 69, 70, 0, 19, 48, 38, 17, + 0, 31, 118, 69, 67, 98, 99, 98, 114, 97, 131, 81, + 146, 65, 162, 65, 178, 33, 194, 33, 211, 227, 226, 240, + 17, 241, 240, 17, 241, 240, 17, 181, 197, 195, 0, 6, + 25, 13, 0, 24, 89, 51, 66, 65, 82, 81, 67, 147, + 162, 162, 163, 162, 162, 97, 51, 81, 66, 82, 58, 0, + 15, 34, 9, 0, 8, 51, 82, 98, 114, 114, 114, 115, + 99, 114, 114, 114, 114, 113, 114, 82, 146, 129, 130, 114, + 114, 114, 99, 99, 98, 114, 114, 114, 130, 131, 176, 32, + 4, 240, 210, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 160, 34, 9, 0, 7, 115, + 130, 130, 114, 114, 114, 99, 99, 98, 114, 114, 114, 129, + 130, 146, 82, 113, 114, 114, 114, 114, 115, 99, 114, 114, + 114, 114, 98, 83, 240, 14, 15, 0, 36, 4, 81, 50, + 35, 49, 49, 100, 0, 28, 80, 5, 10, 0, 46, 32, + 24, 6, 0, 11, 50, 52, 51, 240, 97, 81, 81, 81, + 81, 81, 81, 81, 82, 51, 52, 36, 36, 36, 50, 144, + 48, 13, 0, 12, 81, 177, 193, 193, 177, 193, 193, 177, + 148, 114, 36, 66, 49, 18, 66, 49, 18, 50, 50, 98, + 49, 114, 49, 114, 34, 114, 33, 131, 17, 147, 81, 82, + 66, 101, 113, 193, 193, 177, 193, 193, 177, 193, 240, 160, + 48, 21, 0, 19, 85, 226, 51, 194, 83, 162, 99, 162, + 114, 162, 240, 66, 240, 66, 240, 67, 240, 66, 237, 211, + 240, 66, 240, 66, 240, 66, 240, 66, 197, 34, 178, 52, + 145, 33, 100, 82, 50, 65, 25, 85, 85, 0, 24, 32, + 31, 13, 0, 24, 49, 37, 33, 50, 82, 65, 113, 49, + 145, 33, 145, 33, 145, 33, 145, 33, 145, 49, 113, 66, + 82, 49, 37, 33, 0, 18, 16, 38, 17, 0, 14, 118, + 69, 66, 130, 83, 113, 114, 98, 115, 81, 146, 66, 147, + 49, 178, 49, 179, 17, 150, 20, 178, 242, 242, 171, 178, + 242, 242, 242, 242, 242, 214, 0, 19, 112, 27, 4, 240, + 210, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 240, + 178, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 160, + 49, 13, 0, 11, 101, 114, 50, 82, 82, 66, 82, 66, + 82, 67, 179, 164, 164, 134, 98, 51, 66, 83, 50, 99, + 34, 114, 35, 98, 51, 82, 67, 50, 102, 132, 164, 163, + 179, 66, 82, 66, 82, 66, 82, 82, 50, 117, 240, 240, + 224, 11, 10, 0, 12, 66, 66, 34, 66, 0, 31, 64, + 66, 23, 0, 21, 7, 226, 114, 177, 177, 145, 69, 17, + 33, 113, 51, 51, 49, 81, 50, 98, 65, 65, 50, 113, + 65, 49, 50, 225, 33, 50, 225, 33, 50, 225, 33, 50, + 225, 33, 50, 225, 33, 50, 225, 33, 66, 209, 49, 50, + 113, 65, 65, 66, 66, 81, 81, 84, 97, 98, 209, 130, + 177, 178, 114, 231, 0, 27, 20, 11, 0, 9, 116, 97, + 50, 146, 101, 82, 34, 66, 50, 66, 50, 17, 55, 0, + 30, 80, 27, 10, 0, 21, 81, 49, 66, 49, 65, 49, + 65, 50, 50, 34, 66, 34, 81, 49, 97, 49, 82, 49, + 81, 49, 0, 12, 96, 14, 17, 0, 38, 47, 242, 242, + 242, 242, 242, 242, 0, 25, 96, 9, 11, 0, 28, 121, + 41, 0, 19, 64, 70, 23, 0, 21, 7, 226, 114, 177, + 177, 145, 209, 113, 25, 81, 81, 66, 66, 81, 65, 66, + 82, 65, 49, 82, 82, 81, 33, 82, 82, 81, 33, 82, + 66, 97, 33, 86, 129, 33, 82, 34, 129, 33, 82, 50, + 113, 33, 82, 51, 97, 49, 66, 66, 81, 65, 66, 82, + 65, 81, 22, 52, 17, 98, 209, 130, 177, 178, 114, 231, + 0, 27, 8, 10, 0, 13, 104, 0, 31, 64, 25, 12, + 0, 10, 116, 98, 66, 65, 97, 49, 129, 33, 129, 33, + 129, 33, 129, 49, 97, 66, 66, 100, 0, 30, 80, 24, + 16, 0, 24, 98, 226, 226, 226, 226, 226, 142, 130, 226, + 226, 226, 226, 226, 226, 240, 240, 174, 0, 16, 32, 24, + 10, 0, 9, 4, 81, 50, 50, 66, 35, 50, 49, 66, + 114, 114, 113, 129, 129, 130, 81, 39, 0, 22, 112, 23, + 9, 0, 8, 4, 65, 51, 34, 50, 114, 98, 67, 146, + 130, 114, 33, 66, 33, 50, 68, 0, 20, 96, 14, 6, + 240, 240, 226, 51, 50, 66, 50, 65, 81, 0, 17, 112, + 52, 18, 0, 36, 66, 82, 130, 83, 130, 82, 146, 82, + 145, 98, 130, 83, 129, 99, 129, 99, 49, 65, 82, 17, + 49, 65, 82, 17, 33, 65, 17, 50, 36, 65, 36, 66, + 81, 240, 33, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 0, 6, 64, 62, 16, 0, 14, 74, 68, 65, 101, + 65, 101, 65, 101, 65, 86, 65, 101, 65, 101, 65, 101, + 65, 116, 65, 131, 65, 161, 65, 161, 65, 161, 65, 161, + 65, 161, 65, 161, 65, 161, 65, 161, 65, 161, 65, 161, + 65, 161, 65, 161, 65, 161, 65, 161, 65, 161, 65, 161, + 65, 161, 65, 240, 240, 112, 10, 6, 0, 13, 82, 52, + 50, 0, 12, 48, 14, 7, 0, 23, 113, 97, 81, 82, + 99, 98, 82, 36, 240, 32, 19, 6, 240, 240, 226, 51, + 33, 18, 66, 66, 66, 66, 66, 66, 66, 66, 0, 14, + 64, 23, 10, 0, 9, 4, 82, 34, 50, 66, 34, 66, + 34, 66, 34, 66, 34, 66, 50, 34, 84, 0, 26, 96, + 27, 10, 0, 21, 33, 49, 81, 49, 97, 49, 82, 49, + 82, 34, 66, 34, 50, 49, 65, 49, 66, 34, 65, 49, + 0, 13, 16, 56, 20, 0, 17, 98, 161, 99, 145, 97, + 18, 130, 130, 129, 146, 114, 146, 113, 162, 97, 178, 97, + 178, 81, 194, 66, 82, 82, 65, 98, 162, 68, 161, 81, + 18, 145, 81, 34, 130, 65, 50, 129, 81, 50, 114, 72, + 97, 162, 98, 162, 97, 178, 81, 194, 0, 22, 112, 57, + 20, 0, 17, 98, 161, 99, 145, 97, 18, 145, 130, 129, + 146, 113, 162, 113, 162, 97, 178, 97, 178, 81, 194, 81, + 37, 82, 65, 34, 35, 146, 34, 50, 145, 51, 34, 129, + 146, 129, 130, 129, 145, 130, 129, 145, 129, 146, 113, 65, + 81, 113, 81, 65, 134, 0, 22, 112, 60, 21, 0, 18, + 68, 145, 97, 51, 97, 114, 50, 97, 194, 81, 194, 97, + 147, 113, 210, 66, 226, 49, 242, 33, 177, 66, 33, 97, + 65, 50, 33, 98, 84, 49, 83, 177, 81, 18, 177, 81, + 18, 161, 81, 34, 146, 65, 50, 145, 88, 98, 146, 129, + 162, 113, 178, 113, 178, 0, 24, 16, 26, 10, 0, 19, + 35, 116, 100, 240, 193, 145, 145, 145, 145, 130, 100, 85, + 66, 129, 145, 145, 146, 146, 20, 70, 100, 192, 60, 22, + 240, 210, 240, 83, 240, 83, 240, 98, 240, 113, 240, 240, + 178, 240, 83, 240, 52, 240, 49, 18, 240, 34, 19, 240, + 17, 35, 240, 17, 50, 242, 51, 225, 67, 225, 82, 210, + 83, 193, 99, 202, 177, 131, 161, 131, 161, 146, 145, 163, + 129, 163, 114, 163, 99, 164, 70, 104, 0, 25, 61, 22, + 240, 240, 66, 240, 67, 240, 51, 240, 50, 240, 65, 240, + 240, 226, 240, 83, 240, 52, 240, 49, 18, 240, 34, 19, + 240, 17, 35, 240, 17, 50, 242, 51, 225, 67, 225, 82, + 210, 83, 193, 99, 202, 177, 131, 161, 131, 161, 146, 145, + 163, 129, 163, 114, 163, 99, 164, 71, 88, 0, 25, 62, + 22, 240, 240, 18, 240, 68, 240, 34, 34, 241, 97, 209, + 129, 240, 240, 130, 240, 83, 240, 52, 240, 49, 18, 240, + 34, 19, 240, 17, 35, 240, 17, 50, 242, 51, 225, 67, + 225, 82, 210, 83, 193, 99, 202, 177, 131, 161, 131, 161, + 146, 145, 163, 129, 163, 114, 163, 99, 164, 70, 104, 0, + 25, 57, 22, 0, 6, 37, 49, 193, 53, 0, 10, 50, + 240, 83, 240, 49, 18, 240, 49, 18, 240, 34, 19, 240, + 17, 50, 240, 17, 50, 242, 51, 225, 67, 225, 82, 210, + 83, 193, 99, 202, 177, 131, 161, 131, 161, 146, 145, 163, + 129, 163, 114, 163, 99, 164, 70, 104, 0, 25, 59, 23, + 0, 6, 66, 82, 226, 82, 0, 10, 99, 240, 83, 240, + 84, 240, 49, 19, 240, 49, 34, 240, 49, 35, 240, 17, + 51, 240, 17, 66, 240, 17, 67, 225, 83, 225, 98, 210, + 98, 219, 193, 130, 178, 130, 177, 147, 161, 147, 146, 162, + 146, 163, 115, 164, 71, 89, 0, 26, 16, 67, 23, 132, + 240, 50, 50, 240, 17, 81, 240, 17, 81, 240, 18, 50, + 240, 37, 240, 240, 195, 240, 83, 240, 84, 240, 53, 240, + 49, 34, 240, 49, 35, 240, 18, 35, 240, 17, 51, 240, + 17, 67, 226, 67, 225, 83, 210, 98, 219, 193, 115, 178, + 130, 177, 147, 161, 147, 146, 162, 146, 163, 115, 164, 71, + 89, 0, 26, 16, 71, 31, 0, 28, 63, 2, 240, 36, + 115, 240, 36, 146, 240, 17, 18, 161, 241, 34, 161, 226, + 34, 240, 161, 50, 97, 240, 34, 50, 97, 240, 18, 66, + 97, 240, 17, 82, 82, 242, 89, 249, 82, 225, 114, 97, + 210, 114, 97, 209, 130, 240, 65, 146, 177, 98, 146, 177, + 97, 162, 162, 82, 162, 162, 67, 162, 132, 40, 79, 1, + 0, 35, 32, 60, 19, 0, 17, 73, 115, 84, 99, 131, + 67, 162, 66, 193, 51, 240, 18, 240, 19, 240, 19, 240, + 19, 240, 19, 240, 19, 240, 19, 240, 19, 240, 34, 240, + 35, 240, 34, 193, 67, 162, 83, 130, 116, 67, 182, 240, + 17, 240, 33, 240, 35, 240, 35, 240, 50, 240, 34, 228, + 240, 240, 240, 55, 19, 240, 130, 240, 35, 240, 50, 240, + 66, 0, 5, 127, 114, 115, 114, 146, 98, 161, 98, 161, + 98, 240, 34, 97, 162, 97, 162, 97, 162, 82, 169, 162, + 82, 162, 97, 162, 97, 162, 240, 34, 177, 82, 177, 82, + 162, 82, 162, 82, 132, 47, 1, 0, 21, 96, 55, 20, + 240, 242, 240, 35, 240, 19, 240, 17, 0, 6, 79, 130, + 116, 114, 146, 114, 161, 114, 177, 98, 240, 50, 97, 178, + 97, 178, 97, 178, 82, 185, 178, 82, 178, 97, 178, 97, + 178, 240, 50, 193, 82, 177, 98, 177, 98, 162, 98, 147, + 63, 2, 0, 22, 112, 55, 19, 240, 178, 240, 20, 226, + 34, 193, 97, 240, 240, 255, 114, 115, 114, 146, 98, 161, + 98, 161, 98, 240, 34, 97, 162, 97, 162, 97, 162, 82, + 169, 162, 82, 162, 97, 162, 97, 162, 240, 34, 177, 82, + 177, 82, 162, 82, 162, 82, 132, 47, 1, 0, 21, 96, + 53, 20, 240, 240, 226, 82, 178, 82, 0, 8, 63, 130, + 116, 114, 146, 114, 161, 114, 177, 98, 240, 50, 97, 178, + 97, 178, 97, 178, 82, 185, 178, 82, 178, 97, 178, 97, + 178, 240, 50, 193, 82, 177, 98, 177, 98, 162, 98, 147, + 63, 2, 0, 22, 112, 31, 10, 162, 131, 146, 161, 240, + 168, 82, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 88, 0, 11, 64, + 32, 10, 240, 18, 115, 99, 98, 240, 168, 82, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 88, 0, 11, 64, 33, 10, 210, 116, + 82, 34, 49, 97, 240, 120, 82, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, + 130, 88, 0, 11, 64, 33, 11, 240, 114, 82, 34, 82, + 240, 240, 89, 98, 146, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 89, 0, + 12, 80, 47, 22, 0, 19, 44, 210, 100, 162, 131, 146, + 162, 130, 163, 114, 179, 98, 179, 98, 195, 82, 195, 82, + 195, 42, 115, 82, 195, 82, 195, 82, 195, 82, 194, 98, + 179, 98, 178, 114, 163, 114, 147, 130, 131, 109, 0, 25, + 112, 66, 22, 0, 6, 37, 65, 177, 69, 0, 9, 22, + 119, 83, 161, 132, 145, 133, 129, 129, 19, 129, 129, 20, + 113, 129, 36, 97, 129, 51, 97, 129, 67, 81, 129, 68, + 65, 129, 83, 65, 129, 99, 49, 129, 100, 33, 129, 115, + 33, 129, 131, 17, 129, 133, 129, 148, 129, 163, 129, 163, + 129, 178, 87, 145, 0, 25, 48, 55, 21, 240, 179, 240, + 67, 240, 67, 240, 82, 0, 7, 38, 211, 83, 146, 146, + 114, 178, 83, 178, 83, 179, 66, 210, 51, 211, 35, 211, + 35, 211, 35, 211, 35, 211, 35, 211, 35, 211, 50, 210, + 67, 179, 67, 179, 82, 178, 114, 146, 147, 83, 199, 0, + 24, 80, 56, 21, 240, 240, 35, 240, 35, 240, 35, 240, + 34, 0, 7, 54, 211, 83, 146, 146, 114, 178, 83, 178, + 83, 179, 66, 210, 51, 211, 35, 211, 35, 211, 35, 211, + 35, 211, 35, 211, 35, 211, 50, 210, 67, 179, 67, 179, + 82, 178, 114, 146, 147, 83, 199, 0, 24, 80, 56, 21, + 145, 240, 67, 240, 37, 242, 50, 210, 82, 0, 6, 118, + 211, 83, 146, 146, 114, 178, 83, 178, 83, 179, 66, 210, + 51, 211, 35, 211, 35, 211, 35, 211, 35, 211, 35, 211, + 35, 211, 50, 210, 67, 179, 67, 179, 82, 178, 114, 146, + 147, 83, 199, 0, 24, 80, 53, 21, 0, 5, 117, 65, + 161, 69, 0, 9, 70, 211, 83, 146, 146, 114, 178, 83, + 178, 83, 179, 66, 210, 51, 211, 35, 211, 35, 211, 35, + 211, 35, 211, 35, 211, 35, 211, 50, 210, 67, 179, 67, + 179, 82, 178, 114, 146, 147, 83, 199, 0, 24, 80, 53, + 21, 0, 5, 114, 82, 194, 82, 0, 9, 70, 211, 83, + 146, 146, 114, 178, 83, 178, 83, 179, 66, 210, 51, 211, + 35, 211, 35, 211, 35, 211, 35, 211, 35, 211, 35, 211, + 50, 210, 67, 179, 67, 179, 82, 178, 114, 146, 147, 83, + 199, 0, 24, 80, 26, 12, 0, 22, 65, 129, 34, 98, + 50, 66, 82, 34, 116, 146, 148, 114, 34, 82, 65, 66, + 97, 49, 129, 0, 16, 96, 60, 21, 0, 19, 38, 81, + 99, 83, 34, 82, 133, 82, 163, 83, 163, 83, 149, 66, + 146, 34, 51, 130, 51, 35, 114, 67, 35, 98, 83, 35, + 83, 83, 35, 82, 99, 35, 66, 115, 35, 50, 131, 50, + 34, 146, 69, 147, 68, 163, 83, 162, 85, 130, 82, 35, + 83, 97, 87, 0, 24, 80, 55, 23, 240, 227, 240, 99, + 240, 114, 240, 129, 0, 7, 24, 103, 82, 193, 130, 193, + 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, + 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, + 130, 193, 130, 178, 146, 161, 163, 130, 194, 83, 246, 0, + 27, 56, 23, 240, 240, 83, 240, 67, 240, 67, 240, 65, + 0, 7, 56, 103, 82, 193, 130, 193, 130, 193, 130, 193, + 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, + 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, 130, 178, + 146, 161, 163, 130, 194, 83, 246, 0, 27, 57, 23, 161, + 240, 99, 240, 69, 240, 34, 50, 241, 113, 0, 6, 104, + 103, 82, 193, 130, 193, 130, 193, 130, 193, 130, 193, 130, + 193, 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, 130, + 193, 130, 193, 130, 193, 130, 193, 130, 178, 146, 161, 163, + 130, 194, 83, 246, 0, 27, 53, 23, 0, 6, 66, 82, + 226, 82, 0, 9, 88, 103, 82, 193, 130, 193, 130, 193, + 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, + 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, 130, 193, + 130, 178, 146, 161, 163, 130, 194, 83, 246, 0, 27, 60, + 22, 240, 240, 66, 240, 67, 240, 50, 240, 65, 0, 7, + 8, 87, 68, 147, 115, 146, 131, 145, 162, 145, 163, 113, + 194, 113, 194, 97, 211, 65, 242, 65, 243, 33, 240, 34, + 18, 240, 34, 17, 240, 66, 240, 82, 240, 82, 240, 82, + 240, 82, 240, 82, 240, 82, 240, 40, 0, 25, 112, 44, + 18, 0, 15, 104, 210, 240, 18, 240, 18, 240, 24, 162, + 83, 130, 115, 98, 115, 98, 131, 82, 131, 82, 131, 82, + 131, 82, 115, 98, 115, 98, 83, 136, 162, 240, 18, 240, + 18, 240, 18, 216, 0, 21, 64, 50, 15, 0, 13, 100, + 162, 34, 130, 66, 113, 82, 98, 82, 98, 81, 114, 65, + 130, 49, 116, 33, 162, 33, 162, 33, 162, 34, 146, 51, + 114, 67, 98, 83, 82, 99, 66, 114, 66, 114, 66, 18, + 66, 66, 34, 34, 52, 37, 0, 17, 48, 39, 15, 0, + 13, 34, 211, 211, 210, 225, 226, 225, 240, 197, 131, 50, + 99, 82, 98, 82, 210, 165, 115, 50, 98, 82, 82, 98, + 82, 98, 82, 98, 83, 67, 33, 54, 35, 0, 17, 32, + 38, 15, 0, 14, 2, 210, 195, 194, 194, 209, 225, 240, + 182, 131, 50, 99, 82, 210, 210, 165, 115, 50, 98, 82, + 82, 98, 82, 98, 82, 98, 83, 67, 33, 54, 35, 0, + 17, 32, 41, 15, 0, 13, 97, 210, 211, 178, 18, 146, + 49, 145, 81, 113, 240, 246, 131, 50, 99, 82, 210, 210, + 165, 115, 50, 98, 82, 82, 98, 82, 98, 82, 98, 83, + 67, 33, 54, 35, 0, 17, 32, 36, 15, 0, 19, 4, + 65, 66, 53, 0, 6, 70, 131, 50, 99, 82, 210, 210, + 165, 115, 50, 98, 82, 82, 98, 82, 98, 82, 98, 83, + 67, 33, 54, 35, 0, 17, 32, 36, 14, 0, 17, 82, + 66, 98, 66, 0, 6, 21, 130, 50, 99, 66, 194, 194, + 149, 114, 50, 98, 66, 82, 82, 82, 82, 82, 82, 83, + 51, 33, 53, 35, 0, 16, 16, 42, 15, 0, 13, 83, + 162, 50, 129, 81, 129, 81, 130, 50, 149, 240, 240, 150, + 131, 50, 99, 82, 210, 210, 165, 115, 50, 98, 82, 82, + 98, 82, 98, 82, 98, 83, 67, 33, 54, 20, 0, 17, + 32, 36, 20, 0, 37, 102, 53, 83, 50, 18, 50, 51, + 83, 82, 162, 98, 170, 132, 211, 34, 178, 82, 162, 98, + 162, 99, 146, 99, 97, 35, 50, 34, 65, 69, 85, 0, + 23, 30, 12, 0, 23, 4, 98, 51, 50, 82, 50, 82, + 34, 162, 162, 162, 162, 163, 162, 178, 66, 85, 161, 161, + 177, 179, 178, 162, 116, 240, 208, 33, 13, 0, 11, 82, + 179, 178, 178, 194, 193, 240, 240, 116, 114, 66, 66, 97, + 66, 98, 43, 34, 178, 178, 179, 178, 178, 113, 67, 50, + 116, 0, 15, 32, 33, 13, 0, 12, 34, 178, 178, 162, + 177, 178, 177, 240, 148, 114, 65, 82, 97, 65, 114, 43, + 34, 178, 178, 178, 194, 178, 97, 82, 65, 132, 0, 15, + 32, 36, 13, 0, 12, 1, 194, 163, 161, 18, 129, 49, + 113, 81, 240, 240, 68, 114, 66, 66, 97, 65, 114, 43, + 34, 178, 178, 178, 194, 178, 113, 66, 66, 116, 0, 15, + 32, 31, 13, 0, 16, 66, 66, 82, 66, 0, 5, 100, + 114, 66, 66, 97, 65, 114, 43, 34, 178, 178, 178, 194, + 178, 97, 82, 66, 116, 0, 15, 32, 27, 9, 0, 7, + 114, 115, 114, 115, 114, 129, 240, 178, 84, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 86, 0, 10, 48, 27, + 8, 0, 7, 81, 98, 98, 82, 98, 97, 240, 114, 68, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 70, 0, + 9, 32, 29, 8, 0, 8, 34, 98, 81, 33, 50, 49, + 33, 65, 240, 82, 68, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 70, 0, 9, 32, 26, 9, 0, 11, 34, + 50, 34, 50, 240, 240, 34, 84, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 86, 0, 10, 48, 43, 14, 0, + 12, 66, 97, 98, 50, 132, 179, 161, 19, 114, 50, 210, + 195, 119, 82, 67, 66, 99, 50, 99, 34, 130, 34, 130, + 34, 130, 34, 130, 34, 129, 66, 98, 66, 97, 98, 66, + 132, 0, 16, 64, 43, 16, 0, 20, 67, 65, 98, 34, + 33, 113, 67, 240, 240, 162, 36, 100, 17, 50, 115, 82, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 70, 38, 0, 18, 32, 39, + 14, 0, 12, 66, 195, 194, 210, 194, 209, 240, 240, 164, + 130, 66, 82, 98, 66, 98, 50, 130, 34, 130, 34, 130, + 34, 130, 34, 130, 50, 98, 66, 98, 82, 66, 132, 0, + 16, 64, 39, 14, 0, 13, 34, 179, 178, 194, 178, 193, + 240, 240, 148, 130, 66, 82, 98, 66, 98, 50, 130, 34, + 130, 34, 130, 34, 130, 34, 130, 50, 98, 66, 98, 82, + 66, 132, 0, 16, 64, 42, 14, 0, 14, 82, 194, 177, + 33, 146, 34, 129, 65, 113, 97, 240, 116, 130, 66, 82, + 98, 66, 98, 50, 130, 34, 130, 34, 130, 34, 130, 34, + 130, 50, 98, 66, 98, 82, 66, 132, 0, 16, 64, 37, + 14, 0, 17, 116, 49, 66, 37, 0, 6, 36, 130, 66, + 82, 98, 66, 98, 50, 130, 34, 130, 34, 130, 34, 130, + 34, 130, 50, 98, 66, 98, 82, 66, 132, 0, 16, 64, + 37, 14, 0, 17, 98, 66, 98, 66, 0, 6, 36, 130, + 66, 82, 98, 66, 98, 50, 130, 34, 130, 34, 130, 34, + 130, 34, 130, 50, 98, 66, 98, 82, 66, 132, 0, 16, + 64, 17, 16, 0, 30, 98, 212, 210, 240, 240, 174, 0, + 7, 2, 212, 210, 0, 21, 38, 14, 0, 26, 100, 49, + 66, 67, 66, 98, 66, 83, 50, 82, 18, 34, 66, 34, + 34, 50, 50, 34, 34, 66, 34, 18, 82, 51, 82, 66, + 98, 67, 66, 65, 52, 0, 16, 64, 41, 16, 0, 14, + 50, 227, 226, 226, 242, 241, 240, 240, 180, 68, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 114, 52, 132, 36, 0, 18, + 32, 41, 16, 0, 15, 18, 211, 210, 210, 225, 226, 240, + 240, 164, 68, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 114, + 52, 132, 36, 0, 18, 32, 44, 16, 0, 14, 97, 242, + 211, 209, 33, 177, 50, 145, 81, 240, 240, 132, 68, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 114, 52, 132, 36, 0, + 18, 32, 39, 16, 0, 20, 50, 50, 146, 50, 0, 6, + 100, 68, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 114, 52, + 132, 36, 0, 18, 32, 46, 17, 0, 16, 2, 242, 242, + 226, 241, 242, 240, 240, 198, 69, 67, 98, 99, 98, 114, + 97, 131, 81, 146, 65, 162, 65, 178, 33, 194, 33, 211, + 227, 226, 240, 17, 241, 240, 17, 241, 240, 17, 181, 197, + 195, 0, 6, 48, 15, 0, 13, 50, 180, 210, 210, 210, + 210, 210, 210, 210, 36, 116, 50, 98, 98, 82, 114, 66, + 114, 66, 114, 66, 114, 66, 114, 66, 114, 66, 113, 82, + 98, 83, 66, 98, 21, 114, 210, 210, 210, 210, 210, 182, + 240, 240, 144, 43, 16, 0, 20, 50, 66, 130, 66, 0, + 6, 85, 84, 51, 114, 82, 113, 98, 97, 130, 81, 130, + 66, 131, 49, 162, 34, 162, 33, 196, 195, 211, 225, 226, + 225, 226, 225, 178, 18, 180, 195, 240, 240, 240, +}; + +//***************************************************************************** +// +// The glyph offset table for the 28 point Theanooldstyle font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanooldstyle28[] = +{ + 0, 5, 31, 54, 101, 160, 226, 284, + 298, 332, 366, 397, 417, 431, 440, 450, + 484, 531, 562, 599, 637, 674, 709, 750, + 781, 826, 866, 881, 900, 922, 933, 955, + 984, 1067, 1118, 1163, 1210, 1257, 1304, 1349, + 1397, 1444, 1472, 1508, 1557, 1605, 1683, 1743, + 1790, 1835, 1895, 1941, 1979, 2030, 2077, 2129, + 2213, 2263, 2314, 2353, 2387, 2421, 2455, 2476, + 2484, 2498, 2528, 2569, 2593, 2634, 2659, 2688, + 2729, 2771, 2796, 2828, 2868, 2896, 2944, 2978, + 3009, 3049, 3089, 3110, 3134, 3160, 3193, 3223, + 3268, 3298, 3336, 3361, 3395, 3427, 3461, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3475, 3480, 3504, 3552, 3600, 3631, 3669, 3696, + 3745, 3756, 3822, 3842, 3869, 3883, 3892, 3962, + 3970, 3995, 4019, 4043, 4066, 4080, 4132, 4194, + 4204, 4218, 4237, 4260, 4287, 4343, 4400, 4460, + 4486, 4546, 4607, 4669, 4726, 4785, 4852, 4923, + 4983, 5038, 5093, 5148, 5201, 5232, 5264, 5297, + 5330, 5377, 5443, 5498, 5554, 5610, 5663, 5716, + 5742, 5802, 5857, 5913, 5970, 6023, 6083, 6127, + 6177, 6216, 6254, 6295, 6331, 6367, 6409, 6445, + 6475, 6508, 6541, 6577, 6608, 6635, 6662, 6691, + 6717, 6760, 6803, 6842, 6881, 6923, 6960, 6997, + 7014, 7052, 7093, 7134, 7178, 7217, 7263, 7311, +}; + +//***************************************************************************** +// +// The font definition for the 28 point Theanooldstyle font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanooldstyle28 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 30, + + // + // The height of the font. + // + 37, + + // + // The baseline of the font. + // + 28, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanooldstyle28, + + // + // A pointer to the actual font data + // + g_pui8Theanooldstyle28Data +}; diff --git a/third_party/fonts/ofl/fonts/fonttheanooldstyle30.c b/third_party/fonts/ofl/fonts/fonttheanooldstyle30.c new file mode 100644 index 0000000..1800918 --- /dev/null +++ b/third_party/fonts/ofl/fonts/fonttheanooldstyle30.c @@ -0,0 +1,887 @@ +//***************************************************************************** +// +// fonttheanooldstyle30.c - Font definition for the 30pt Theanooldstyle font. +// +//***************************************************************************** + +//***************************************************************************** +// +// Original font source: http://www.thessalonica.org.ru/en/fonts-download.html +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: +// http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide +// development of collaborative font projects, to support the font creation +// efforts of academic and linguistic communities, and to provide a free and +// open framework in which fonts may be shared and improved in partnership +// with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and +// redistributed freely as long as they are not sold by themselves. The +// fonts, including any derivative works, can be bundled, embedded, +// redistributed and/or sold with any software provided that any reserved +// names are not used by derivative works. The fonts and derivatives, +// however, cannot be released under any other type of license. The +// requirement for fonts to remain under this license does not apply +// to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright +// Holder(s) under this license and clearly marked as such. This may +// include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the +// copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as +// distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, +// or substituting -- in part or in whole -- any of the components of the +// Original Version, by changing formats or by porting the Font Software to a +// new environment. +// +// "Author" refers to any designer, engineer, programmer, technical +// writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining +// a copy of the Font Software, to use, study, copy, merge, embed, modify, +// redistribute, and sell modified and unmodified copies of the Font +// Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, +// in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, +// redistributed and/or sold with any software, provided that each copy +// contains the above copyright notice and this license. These can be +// included either as stand-alone text files, human-readable headers or +// in the appropriate machine-readable metadata fields within text or +// binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font +// Name(s) unless explicit written permission is granted by the corresponding +// Copyright Holder. This restriction only applies to the primary font name as +// presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +// Software shall not be used to promote, endorse or advertise any +// Modified Version, except to acknowledge the contribution(s) of the +// Copyright Holder(s) and the Author(s) or with their explicit written +// permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, +// must be distributed entirely under this license, and must not be +// distributed under any other license. The requirement for fonts to +// remain under this license does not apply to any document created +// using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are +// not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +// OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +// COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +// DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +// OTHER DEALINGS IN THE FONT SOFTWARE. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 32 to 255 inclusive +// Style: theanooldstyle +// Size: 30 point +// Bold: no +// Italic: no +// Memory usage: 8216 bytes +// +//***************************************************************************** + +//***************************************************************************** +// +// The compressed data for the 30 point Theanooldstyle font. +// Contains characters 32 to 255 inclusive. +// +//***************************************************************************** +static const uint8_t g_pui8Theanooldstyle30Data[8013] = +{ + 5, 13, 0, 63, 48, 28, 7, 0, 7, 18, 68, 52, + 52, 52, 51, 67, 82, 81, 97, 97, 97, 97, 97, 97, + 97, 240, 82, 68, 52, 66, 0, 8, 48, 27, 11, 0, + 11, 3, 35, 51, 35, 51, 35, 51, 35, 51, 35, 51, + 35, 65, 65, 81, 65, 81, 65, 81, 65, 0, 29, 48, + 49, 18, 0, 18, 97, 81, 177, 81, 162, 81, 161, 82, + 161, 81, 177, 81, 111, 114, 66, 161, 82, 161, 81, 177, + 81, 177, 81, 162, 81, 162, 66, 127, 97, 81, 177, 81, + 162, 81, 162, 66, 161, 81, 177, 81, 177, 81, 0, 21, + 48, 65, 17, 0, 11, 49, 240, 17, 240, 17, 230, 146, + 33, 34, 114, 49, 65, 97, 65, 66, 66, 65, 51, 66, + 65, 51, 66, 65, 50, 83, 49, 179, 33, 197, 214, 214, + 199, 161, 51, 161, 67, 65, 65, 82, 51, 49, 82, 51, + 49, 82, 50, 65, 81, 81, 65, 66, 83, 33, 35, 135, + 209, 240, 17, 0, 16, 16, 69, 23, 0, 23, 36, 146, + 114, 34, 129, 129, 65, 114, 114, 66, 97, 130, 66, 81, + 146, 66, 81, 146, 66, 65, 177, 65, 66, 178, 34, 65, + 212, 66, 240, 97, 240, 97, 68, 210, 50, 34, 193, 65, + 65, 178, 50, 66, 161, 66, 66, 145, 82, 66, 145, 82, + 66, 129, 98, 66, 114, 113, 65, 129, 130, 34, 113, 164, + 0, 26, 64, 64, 24, 0, 25, 4, 240, 50, 51, 240, + 17, 82, 242, 82, 242, 82, 242, 66, 240, 19, 34, 240, + 35, 17, 240, 83, 240, 84, 87, 113, 20, 115, 99, 35, + 114, 99, 52, 97, 114, 83, 97, 99, 99, 65, 115, 100, + 49, 115, 116, 17, 131, 132, 148, 116, 163, 132, 163, 82, + 20, 49, 103, 85, 0, 27, 64, 17, 6, 0, 6, 3, + 51, 51, 51, 51, 51, 65, 81, 81, 81, 0, 16, 32, + 35, 9, 0, 9, 81, 114, 113, 113, 129, 114, 113, 114, + 114, 113, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 129, 130, 114, 129, 130, 129, 130, 129, 145, 129, 192, 36, + 9, 0, 9, 1, 130, 129, 130, 129, 130, 129, 130, 114, + 114, 130, 114, 114, 114, 114, 114, 114, 114, 114, 114, 98, + 114, 114, 113, 114, 113, 114, 113, 113, 129, 240, 32, 33, + 14, 0, 14, 66, 194, 194, 130, 49, 50, 51, 33, 35, + 67, 17, 19, 131, 179, 131, 17, 19, 67, 33, 35, 50, + 49, 50, 114, 194, 194, 0, 30, 96, 34, 18, 0, 34, + 82, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 159, 162, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 0, 21, 48, 16, 8, 0, 27, 4, 69, + 53, 98, 98, 97, 98, 82, 81, 240, 240, 16, 9, 12, + 0, 34, 73, 57, 0, 21, 48, 11, 7, 0, 22, 114, + 68, 52, 66, 0, 8, 48, 36, 11, 0, 11, 113, 146, + 146, 146, 145, 161, 146, 146, 145, 161, 161, 146, 146, 145, + 161, 146, 146, 146, 145, 161, 146, 146, 145, 161, 146, 146, + 146, 145, 161, 146, 240, 80, 49, 18, 0, 18, 85, 194, + 50, 162, 82, 130, 114, 99, 115, 82, 131, 82, 146, 67, + 147, 51, 147, 51, 147, 51, 147, 51, 147, 51, 147, 51, + 147, 51, 147, 66, 146, 82, 131, 83, 115, 98, 114, 130, + 82, 162, 50, 197, 0, 21, 32, 32, 9, 0, 9, 66, + 99, 84, 81, 18, 65, 34, 49, 50, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 0, 10, 64, 38, 16, 0, 16, 85, 146, 66, 114, 98, + 83, 114, 67, 114, 68, 98, 68, 98, 226, 210, 226, 210, + 210, 210, 210, 210, 210, 210, 225, 129, 82, 129, 66, 130, + 75, 76, 0, 18, 64, 39, 15, 0, 15, 54, 114, 83, + 81, 114, 66, 130, 51, 114, 51, 114, 210, 194, 194, 133, + 242, 226, 210, 226, 210, 210, 50, 130, 50, 130, 50, 114, + 67, 98, 83, 66, 133, 0, 17, 96, 49, 19, 0, 20, + 33, 240, 34, 240, 19, 240, 19, 241, 18, 225, 34, 225, + 34, 209, 50, 193, 66, 178, 66, 177, 82, 161, 98, 146, + 98, 145, 114, 143, 1, 194, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 34, 240, 34, 0, 22, 48, 41, 17, 0, + 14, 33, 240, 17, 107, 106, 113, 240, 17, 240, 17, 240, + 17, 240, 23, 169, 129, 99, 243, 242, 243, 242, 242, 242, + 242, 242, 50, 146, 67, 130, 68, 98, 100, 66, 150, 0, + 20, 16, 44, 16, 0, 15, 34, 194, 194, 210, 210, 210, + 210, 226, 210, 226, 21, 114, 18, 66, 84, 98, 67, 114, + 66, 146, 50, 146, 50, 146, 50, 146, 50, 146, 65, 146, + 66, 114, 97, 114, 114, 51, 149, 0, 18, 112, 31, 16, + 0, 16, 28, 76, 65, 145, 65, 161, 65, 161, 225, 241, + 226, 226, 225, 226, 226, 210, 226, 226, 211, 211, 210, 211, + 211, 196, 196, 0, 19, 46, 17, 0, 17, 70, 162, 66, + 130, 98, 98, 130, 82, 130, 82, 130, 83, 114, 83, 98, + 116, 65, 148, 18, 181, 214, 146, 52, 113, 100, 82, 131, + 50, 162, 50, 162, 50, 162, 50, 161, 82, 130, 98, 83, + 150, 0, 20, 44, 16, 0, 16, 69, 147, 50, 114, 113, + 98, 114, 66, 145, 66, 146, 50, 146, 50, 146, 50, 146, + 50, 146, 66, 115, 66, 115, 82, 66, 18, 117, 18, 226, + 210, 226, 210, 210, 210, 210, 195, 178, 0, 17, 80, 17, + 7, 0, 14, 18, 68, 52, 66, 0, 5, 114, 68, 52, + 66, 0, 8, 48, 21, 7, 0, 14, 18, 68, 52, 66, + 0, 6, 83, 68, 52, 82, 82, 82, 66, 81, 81, 240, + 192, 29, 17, 0, 31, 49, 227, 195, 195, 195, 196, 195, + 195, 226, 240, 19, 240, 19, 240, 19, 240, 19, 240, 19, + 243, 240, 18, 0, 19, 64, 11, 18, 0, 42, 111, 0, + 9, 63, 0, 31, 112, 28, 17, 0, 29, 97, 240, 19, + 240, 19, 240, 19, 240, 19, 243, 240, 19, 240, 19, 242, + 211, 195, 195, 195, 196, 195, 210, 0, 21, 30, 13, 0, + 13, 21, 120, 84, 20, 178, 194, 178, 178, 163, 87, 102, + 114, 177, 193, 193, 193, 193, 240, 240, 130, 164, 148, 162, + 0, 15, 96, 90, 28, 0, 36, 55, 240, 51, 100, 226, + 178, 179, 210, 146, 240, 18, 114, 240, 34, 114, 131, 19, + 50, 82, 114, 33, 19, 50, 66, 114, 52, 66, 66, 98, + 68, 66, 66, 82, 83, 82, 50, 98, 83, 82, 50, 82, + 98, 98, 50, 82, 83, 82, 66, 67, 82, 98, 66, 66, + 83, 82, 82, 66, 67, 97, 98, 66, 52, 81, 114, 66, + 34, 18, 50, 146, 67, 68, 178, 240, 194, 240, 194, 226, + 178, 178, 227, 99, 240, 55, 0, 12, 32, 58, 25, 0, + 23, 34, 240, 115, 240, 100, 240, 101, 240, 81, 19, 240, + 66, 19, 240, 65, 50, 240, 65, 51, 240, 34, 51, 240, + 33, 82, 240, 33, 83, 241, 99, 241, 114, 226, 115, 220, + 209, 146, 194, 147, 177, 163, 177, 178, 162, 179, 145, 195, + 131, 180, 87, 105, 0, 28, 64, 48, 20, 0, 20, 12, + 178, 100, 130, 131, 114, 132, 98, 147, 98, 147, 98, 147, + 98, 147, 98, 131, 114, 99, 153, 178, 100, 130, 131, 114, + 131, 114, 147, 98, 147, 98, 147, 98, 147, 98, 147, 98, + 131, 114, 115, 93, 0, 23, 48, 50, 21, 0, 21, 119, + 33, 147, 84, 115, 146, 114, 178, 82, 209, 67, 240, 50, + 240, 51, 240, 51, 240, 51, 240, 51, 240, 51, 240, 51, + 240, 51, 240, 51, 240, 67, 240, 51, 240, 66, 209, 98, + 177, 130, 145, 163, 82, 214, 0, 24, 80, 49, 24, 0, + 24, 13, 226, 115, 194, 147, 162, 163, 146, 179, 130, 194, + 130, 195, 114, 195, 114, 211, 98, 211, 98, 211, 98, 211, + 98, 211, 98, 211, 98, 211, 98, 195, 114, 195, 114, 194, + 130, 179, 130, 163, 146, 131, 142, 0, 28, 32, 50, 22, + 0, 22, 15, 1, 146, 132, 130, 162, 130, 177, 130, 193, + 114, 240, 82, 113, 194, 113, 194, 98, 194, 83, 202, 194, + 98, 194, 113, 194, 113, 194, 240, 82, 240, 82, 194, 98, + 193, 114, 178, 114, 178, 114, 148, 79, 3, 0, 25, 32, + 49, 21, 0, 21, 15, 1, 130, 132, 114, 162, 114, 177, + 114, 193, 98, 240, 66, 113, 178, 113, 178, 98, 178, 83, + 186, 178, 98, 178, 113, 178, 113, 178, 240, 66, 240, 66, + 240, 66, 240, 66, 240, 66, 240, 66, 240, 25, 0, 25, + 16, 51, 24, 0, 24, 119, 33, 195, 84, 178, 147, 146, + 178, 130, 209, 115, 240, 98, 240, 99, 240, 99, 240, 99, + 240, 99, 240, 99, 168, 51, 210, 99, 210, 99, 210, 115, + 194, 115, 194, 131, 178, 146, 178, 162, 147, 179, 100, 215, + 49, 0, 27, 96, 50, 25, 0, 25, 9, 73, 98, 178, + 162, 178, 162, 178, 162, 178, 162, 178, 162, 178, 162, 178, + 162, 178, 162, 178, 175, 162, 178, 162, 178, 162, 178, 162, + 178, 162, 178, 162, 178, 162, 178, 162, 178, 162, 178, 162, + 178, 121, 73, 0, 28, 64, 29, 12, 0, 12, 9, 98, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 121, 0, 13, 112, 37, + 16, 0, 16, 73, 162, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 226, 225, 241, 241, 132, 33, 165, 180, 240, 192, + 53, 23, 0, 23, 9, 71, 98, 163, 130, 162, 146, 146, + 162, 129, 194, 113, 210, 97, 226, 66, 242, 50, 240, 18, + 36, 242, 18, 18, 244, 35, 226, 83, 210, 83, 210, 99, + 194, 115, 178, 115, 178, 131, 162, 146, 162, 147, 146, 148, + 89, 41, 0, 26, 32, 51, 22, 0, 22, 9, 240, 18, + 240, 82, 240, 82, 240, 82, 240, 82, 240, 82, 240, 82, + 240, 82, 240, 82, 240, 82, 240, 82, 240, 82, 240, 82, + 240, 82, 240, 82, 240, 82, 209, 98, 209, 98, 194, 98, + 178, 114, 163, 79, 3, 0, 25, 32, 82, 29, 0, 29, + 7, 199, 100, 195, 164, 180, 165, 161, 18, 162, 18, 146, + 18, 162, 18, 146, 18, 162, 19, 129, 34, 162, 34, 114, + 34, 162, 34, 113, 50, 162, 35, 97, 50, 162, 50, 82, + 50, 162, 51, 65, 66, 162, 51, 50, 66, 162, 66, 49, + 82, 162, 67, 33, 82, 162, 67, 18, 82, 162, 82, 17, + 98, 162, 84, 98, 162, 83, 114, 162, 98, 114, 162, 98, + 114, 119, 65, 89, 0, 33, 63, 24, 0, 24, 6, 135, + 100, 162, 132, 162, 133, 146, 130, 19, 130, 130, 19, 130, + 130, 35, 114, 130, 51, 98, 130, 51, 98, 130, 67, 82, + 130, 83, 66, 130, 83, 66, 130, 99, 50, 130, 115, 34, + 130, 115, 34, 130, 131, 18, 130, 149, 130, 149, 130, 164, + 130, 179, 130, 179, 87, 162, 0, 27, 80, 49, 23, 0, + 23, 118, 242, 98, 179, 131, 131, 163, 114, 194, 99, 195, + 82, 226, 67, 227, 51, 227, 51, 227, 51, 227, 51, 227, + 51, 227, 51, 227, 51, 227, 66, 226, 83, 195, 98, 194, + 115, 163, 131, 131, 178, 98, 246, 0, 27, 16, 47, 20, + 0, 20, 12, 178, 100, 130, 116, 114, 131, 114, 147, 98, + 147, 98, 147, 98, 147, 98, 131, 114, 130, 130, 99, 153, + 178, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, + 50, 240, 50, 240, 50, 249, 0, 23, 112, 62, 23, 0, + 23, 118, 243, 82, 179, 131, 131, 163, 114, 194, 99, 195, + 83, 210, 67, 227, 51, 227, 51, 227, 51, 227, 51, 227, + 51, 227, 51, 227, 51, 227, 67, 210, 83, 195, 98, 194, + 115, 163, 131, 131, 178, 99, 231, 240, 66, 240, 66, 145, + 163, 129, 136, 82, 115, 57, 130, 101, 0, 9, 64, 49, + 24, 0, 24, 12, 242, 100, 194, 116, 178, 131, 178, 147, + 162, 147, 162, 147, 162, 147, 162, 131, 178, 100, 201, 242, + 52, 242, 67, 242, 68, 226, 84, 210, 100, 194, 100, 194, + 116, 178, 132, 162, 133, 146, 149, 89, 102, 0, 27, 48, + 46, 19, 0, 19, 90, 114, 85, 98, 131, 82, 162, 82, + 177, 82, 240, 34, 240, 35, 240, 36, 240, 23, 216, 231, + 245, 240, 19, 240, 35, 49, 210, 50, 194, 50, 194, 51, + 177, 84, 130, 85, 98, 97, 70, 0, 22, 32, 54, 24, + 0, 24, 31, 4, 83, 82, 84, 82, 98, 114, 81, 114, + 129, 66, 114, 130, 194, 240, 114, 240, 114, 240, 114, 240, + 114, 240, 114, 240, 114, 240, 114, 240, 114, 240, 114, 240, + 114, 240, 114, 240, 114, 240, 114, 240, 114, 240, 114, 240, + 73, 0, 28, 16, 51, 25, 0, 25, 9, 103, 98, 194, + 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, + 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, + 146, 194, 146, 194, 146, 194, 146, 178, 178, 162, 194, 130, + 226, 83, 240, 38, 0, 29, 64, 57, 25, 0, 25, 9, + 103, 84, 179, 131, 193, 162, 178, 163, 161, 179, 161, 195, + 130, 195, 129, 226, 129, 227, 98, 227, 97, 240, 19, 81, + 240, 19, 66, 240, 34, 65, 240, 51, 49, 240, 51, 34, + 240, 67, 17, 240, 85, 240, 100, 240, 99, 240, 115, 240, + 129, 0, 29, 96, 87, 36, 0, 36, 9, 57, 87, 84, + 132, 163, 131, 147, 177, 162, 147, 162, 163, 146, 161, 179, + 147, 145, 194, 132, 130, 195, 113, 18, 129, 211, 113, 19, + 113, 211, 97, 35, 97, 243, 81, 35, 97, 243, 66, 51, + 66, 243, 65, 67, 65, 240, 35, 49, 67, 65, 240, 35, + 34, 83, 33, 240, 51, 33, 99, 33, 240, 67, 17, 99, + 18, 240, 68, 132, 240, 84, 132, 240, 99, 132, 240, 98, + 162, 240, 114, 162, 0, 42, 16, 56, 24, 0, 24, 25, + 56, 101, 116, 148, 114, 195, 114, 211, 82, 227, 81, 240, + 19, 49, 240, 36, 18, 240, 53, 240, 83, 240, 99, 240, + 100, 240, 85, 240, 49, 35, 240, 34, 51, 240, 17, 68, + 226, 83, 210, 115, 178, 131, 178, 147, 133, 117, 89, 57, + 0, 27, 48, 54, 24, 0, 24, 9, 87, 84, 163, 131, + 177, 162, 177, 163, 145, 194, 129, 211, 113, 226, 97, 243, + 81, 243, 65, 240, 34, 49, 240, 51, 33, 240, 66, 17, + 240, 84, 240, 98, 240, 114, 240, 114, 240, 114, 240, 114, + 240, 114, 240, 114, 240, 73, 0, 28, 16, 52, 22, 0, + 22, 63, 1, 99, 147, 99, 147, 114, 147, 114, 148, 113, + 163, 240, 51, 240, 52, 240, 36, 240, 51, 240, 51, 240, + 52, 240, 36, 240, 51, 240, 51, 240, 52, 240, 51, 161, + 115, 177, 100, 162, 84, 163, 83, 163, 95, 2, 0, 25, + 48, 36, 9, 0, 9, 6, 50, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 118, + 48, 35, 11, 0, 11, 2, 161, 161, 162, 146, 146, 161, + 161, 162, 146, 161, 161, 161, 162, 146, 161, 161, 162, 146, + 161, 161, 161, 162, 146, 161, 161, 162, 146, 146, 161, 224, + 36, 9, 0, 9, 6, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 54, 48, + 23, 18, 0, 18, 98, 240, 19, 229, 194, 35, 162, 67, + 130, 114, 98, 145, 97, 177, 65, 209, 0, 49, 112, 8, + 18, 0, 76, 79, 0, 9, 48, 14, 7, 0, 7, 2, + 83, 82, 82, 98, 97, 97, 0, 21, 48, 32, 16, 0, + 32, 53, 147, 50, 115, 82, 114, 82, 226, 226, 181, 131, + 50, 114, 82, 98, 98, 98, 98, 98, 98, 33, 51, 54, + 85, 50, 0, 18, 80, 42, 17, 0, 17, 34, 212, 242, + 242, 242, 242, 242, 242, 242, 37, 132, 66, 114, 114, 98, + 114, 98, 130, 82, 130, 82, 130, 82, 130, 82, 130, 82, + 130, 82, 114, 98, 114, 99, 82, 113, 37, 0, 20, 26, + 14, 0, 28, 69, 129, 67, 81, 83, 66, 98, 50, 194, + 194, 194, 194, 194, 210, 194, 113, 83, 65, 133, 0, 16, + 48, 43, 17, 0, 18, 34, 212, 242, 242, 242, 242, 242, + 242, 148, 34, 114, 68, 98, 114, 98, 114, 82, 130, 82, + 130, 82, 130, 82, 130, 82, 130, 82, 130, 98, 114, 98, + 114, 114, 68, 133, 36, 0, 19, 64, 27, 15, 0, 30, + 69, 146, 50, 113, 98, 82, 98, 66, 114, 76, 50, 210, + 210, 210, 226, 210, 113, 99, 65, 149, 0, 17, 80, 30, + 14, 0, 14, 100, 130, 35, 97, 209, 194, 194, 194, 194, + 167, 146, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 166, 0, 16, 96, 45, 18, 0, 36, 54, 51, 82, + 68, 33, 66, 99, 98, 130, 98, 130, 98, 130, 98, 130, + 114, 98, 146, 66, 167, 161, 240, 18, 240, 19, 245, 249, + 170, 98, 116, 66, 162, 66, 162, 66, 162, 83, 99, 135, + 240, 176, 51, 18, 0, 18, 34, 228, 240, 18, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 52, 146, + 18, 50, 131, 98, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 86, 54, 0, 20, 80, 27, 11, 0, 11, 50, 132, 116, + 130, 0, 6, 82, 101, 146, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 104, 0, 12, 96, 35, 11, 0, 11, + 82, 132, 116, 130, 0, 6, 82, 101, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 145, + 161, 82, 34, 85, 99, 240, 64, 50, 18, 0, 18, 34, + 228, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, + 18, 240, 18, 71, 82, 99, 114, 97, 146, 81, 162, 65, + 178, 34, 194, 19, 195, 19, 178, 51, 162, 66, 162, 82, + 146, 83, 130, 99, 86, 39, 0, 20, 80, 29, 9, 0, + 9, 34, 84, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 86, 0, + 10, 64, 52, 26, 0, 52, 34, 37, 68, 116, 17, 66, + 33, 50, 131, 97, 17, 82, 114, 114, 98, 114, 114, 98, + 114, 114, 98, 114, 114, 98, 114, 114, 98, 114, 114, 98, + 114, 114, 98, 114, 114, 98, 114, 114, 98, 114, 114, 98, + 87, 23, 38, 0, 29, 80, 36, 18, 0, 36, 34, 52, + 116, 18, 50, 131, 98, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 86, 54, 0, 20, 80, 33, 16, 0, 32, 69, 147, + 51, 98, 114, 82, 114, 66, 146, 50, 146, 50, 146, 50, + 146, 50, 146, 50, 146, 66, 114, 82, 114, 99, 51, 149, + 0, 18, 112, 42, 17, 0, 34, 34, 37, 102, 66, 114, + 114, 98, 114, 98, 130, 82, 130, 82, 130, 82, 130, 82, + 130, 82, 130, 82, 114, 98, 114, 100, 66, 114, 36, 146, + 242, 242, 242, 242, 242, 242, 214, 240, 208, 42, 17, 0, + 34, 68, 49, 114, 68, 98, 114, 98, 114, 82, 130, 82, + 130, 82, 130, 82, 130, 82, 130, 82, 130, 98, 114, 98, + 114, 114, 68, 133, 34, 242, 242, 242, 242, 242, 242, 242, + 214, 240, 80, 24, 14, 0, 28, 34, 51, 68, 37, 82, + 21, 99, 178, 194, 194, 194, 194, 194, 194, 194, 194, 166, + 0, 16, 96, 26, 13, 0, 26, 54, 98, 50, 82, 81, + 82, 179, 179, 166, 164, 179, 178, 49, 114, 65, 98, 66, + 66, 87, 0, 15, 32, 29, 13, 0, 16, 97, 193, 193, + 193, 178, 163, 137, 114, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 65, 114, 33, 147, 0, 15, 32, 35, 17, + 0, 34, 4, 68, 114, 98, 114, 98, 114, 98, 114, 98, + 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, + 114, 98, 130, 52, 148, 36, 0, 19, 64, 32, 17, 0, + 34, 6, 53, 67, 114, 98, 113, 115, 97, 130, 81, 146, + 81, 147, 50, 162, 49, 178, 49, 194, 17, 210, 17, 226, + 242, 242, 0, 20, 32, 50, 24, 0, 48, 6, 22, 53, + 67, 83, 82, 114, 83, 82, 115, 82, 81, 146, 67, 81, + 146, 68, 65, 147, 49, 18, 49, 178, 33, 34, 49, 178, + 33, 35, 17, 195, 17, 50, 17, 211, 66, 17, 211, 82, + 226, 98, 241, 97, 0, 28, 32, 34, 19, 0, 38, 7, + 54, 84, 83, 131, 82, 162, 81, 194, 49, 211, 17, 243, + 240, 35, 241, 18, 225, 50, 193, 82, 161, 99, 115, 100, + 86, 54, 0, 21, 112, 48, 19, 0, 38, 6, 85, 83, + 114, 130, 114, 130, 113, 146, 113, 162, 81, 178, 81, 194, + 49, 210, 49, 211, 18, 226, 17, 244, 240, 18, 240, 34, + 240, 33, 240, 34, 240, 33, 240, 34, 240, 33, 211, 18, + 213, 228, 240, 240, 64, 27, 14, 0, 28, 41, 67, 66, + 82, 67, 81, 82, 178, 179, 178, 178, 179, 178, 178, 97, + 67, 82, 66, 83, 58, 0, 16, 32, 36, 10, 0, 9, + 35, 98, 114, 130, 130, 130, 130, 131, 130, 130, 130, 130, + 130, 129, 130, 98, 161, 161, 146, 130, 130, 130, 130, 115, + 114, 130, 130, 130, 130, 146, 147, 208, 35, 5, 240, 240, + 162, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 128, 37, 10, 0, 8, 99, + 146, 146, 130, 130, 130, 130, 115, 114, 130, 130, 130, 130, + 145, 146, 162, 98, 129, 130, 130, 130, 130, 130, 131, 130, + 130, 130, 130, 130, 114, 99, 240, 32, 14, 16, 0, 40, + 36, 97, 65, 51, 49, 65, 100, 0, 32, 80, 5, 12, + 0, 58, 64, 26, 7, 0, 14, 18, 68, 52, 66, 240, + 177, 97, 97, 97, 97, 97, 97, 97, 98, 67, 67, 68, + 52, 52, 52, 66, 64, 51, 15, 0, 16, 34, 209, 225, + 209, 225, 225, 209, 225, 165, 145, 51, 113, 53, 82, 50, + 18, 66, 65, 34, 66, 65, 130, 50, 130, 49, 146, 49, + 146, 33, 178, 17, 178, 17, 81, 99, 65, 134, 145, 209, + 225, 225, 209, 225, 225, 209, 225, 224, 53, 24, 0, 25, + 53, 240, 34, 67, 226, 84, 194, 115, 194, 115, 194, 240, + 114, 240, 114, 240, 115, 240, 114, 240, 30, 240, 19, 240, + 114, 240, 114, 240, 114, 240, 114, 244, 50, 210, 68, 146, + 49, 116, 98, 65, 108, 82, 65, 56, 117, 101, 0, 27, + 112, 32, 15, 0, 30, 2, 36, 34, 67, 67, 82, 98, + 81, 129, 66, 130, 50, 130, 50, 130, 50, 130, 65, 129, + 82, 98, 83, 67, 66, 36, 34, 0, 21, 47, 19, 0, + 19, 6, 85, 67, 131, 99, 114, 130, 113, 147, 82, 162, + 81, 179, 50, 194, 49, 211, 17, 182, 21, 179, 240, 34, + 240, 34, 240, 34, 204, 194, 240, 34, 240, 34, 240, 34, + 240, 34, 240, 34, 246, 0, 22, 48, 29, 5, 240, 240, + 162, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 240, + 240, 210, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 128, 53, 15, 0, 15, 68, 146, 66, 98, 83, 82, 83, + 82, 83, 83, 67, 99, 196, 196, 196, 151, 113, 83, 82, + 99, 66, 115, 50, 130, 51, 114, 67, 98, 83, 81, 119, + 148, 196, 196, 195, 99, 67, 83, 82, 83, 82, 83, 82, + 98, 66, 148, 240, 240, 112, 13, 12, 0, 15, 3, 51, + 51, 51, 51, 51, 0, 39, 48, 72, 25, 0, 26, 6, + 240, 19, 99, 194, 162, 161, 85, 17, 33, 129, 67, 51, + 49, 98, 50, 98, 50, 81, 66, 113, 65, 81, 50, 209, + 65, 66, 225, 49, 66, 225, 49, 66, 225, 49, 66, 225, + 49, 66, 225, 49, 82, 209, 65, 66, 113, 65, 81, 82, + 66, 81, 82, 100, 98, 97, 240, 17, 129, 225, 162, 162, + 195, 99, 240, 22, 0, 29, 64, 19, 12, 0, 12, 36, + 113, 50, 162, 117, 98, 34, 82, 50, 82, 50, 17, 71, + 0, 35, 29, 12, 0, 27, 65, 49, 97, 50, 82, 49, + 82, 49, 98, 34, 82, 34, 98, 50, 98, 49, 114, 34, + 113, 50, 113, 49, 0, 15, 48, 20, 18, 0, 42, 111, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 0, 29, 80, 9, 12, 0, 34, 73, 57, 0, 21, 48, + 78, 25, 0, 26, 6, 240, 19, 99, 194, 162, 161, 24, + 81, 129, 66, 66, 65, 98, 66, 82, 50, 81, 82, 82, + 65, 81, 82, 82, 65, 65, 98, 82, 81, 49, 98, 66, + 97, 49, 102, 129, 49, 98, 34, 129, 49, 98, 50, 113, + 49, 98, 51, 97, 65, 82, 66, 81, 81, 82, 82, 65, + 82, 38, 52, 18, 97, 240, 17, 129, 225, 162, 162, 195, + 99, 240, 22, 0, 29, 64, 8, 12, 0, 16, 73, 0, + 40, 112, 27, 14, 0, 14, 53, 129, 81, 97, 113, 65, + 145, 49, 145, 49, 145, 49, 145, 49, 145, 65, 113, 97, + 81, 133, 0, 35, 96, 37, 18, 0, 30, 18, 240, 18, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 159, 162, + 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, 240, 18, + 240, 240, 255, 0, 18, 48, 23, 11, 0, 11, 36, 97, + 50, 66, 66, 51, 50, 146, 130, 130, 129, 145, 145, 146, + 81, 55, 0, 26, 80, 25, 11, 0, 11, 21, 82, 50, + 66, 66, 65, 66, 146, 130, 99, 178, 162, 146, 49, 82, + 50, 50, 85, 0, 25, 48, 14, 7, 0, 7, 34, 67, + 66, 82, 66, 81, 97, 0, 21, 96, 54, 20, 0, 43, + 2, 83, 162, 83, 147, 82, 162, 98, 162, 83, 161, 98, + 177, 98, 162, 83, 161, 99, 65, 81, 84, 65, 82, 51, + 33, 34, 65, 22, 52, 81, 36, 82, 97, 240, 65, 240, + 65, 240, 50, 240, 50, 240, 50, 240, 50, 240, 50, 240, + 240, 128, 65, 17, 0, 17, 74, 85, 34, 133, 34, 118, + 34, 118, 34, 103, 34, 118, 34, 118, 34, 118, 34, 118, + 34, 133, 34, 163, 34, 178, 34, 178, 34, 178, 34, 178, + 34, 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, 178, + 34, 178, 34, 178, 34, 178, 34, 178, 34, 178, 34, 178, + 34, 178, 34, 178, 34, 240, 128, 11, 7, 0, 16, 98, + 68, 52, 66, 0, 14, 64, 13, 8, 0, 30, 33, 97, + 113, 114, 115, 98, 98, 52, 192, 21, 8, 0, 8, 50, + 83, 65, 18, 49, 34, 98, 98, 98, 98, 98, 98, 98, + 98, 0, 19, 48, 23, 11, 0, 11, 36, 98, 34, 66, + 66, 50, 66, 50, 66, 50, 66, 50, 66, 66, 34, 100, + 0, 30, 112, 29, 12, 0, 27, 1, 49, 113, 65, 113, + 50, 98, 49, 114, 34, 114, 34, 82, 34, 97, 50, 81, + 50, 82, 49, 97, 49, 0, 15, 112, 59, 24, 0, 24, + 50, 177, 147, 161, 145, 18, 146, 129, 34, 145, 194, 130, + 194, 129, 210, 113, 226, 98, 226, 97, 242, 82, 242, 81, + 98, 130, 65, 114, 210, 84, 209, 97, 18, 194, 81, 34, + 193, 81, 50, 177, 97, 50, 162, 89, 129, 178, 146, 178, + 145, 194, 129, 210, 0, 27, 80, 61, 23, 0, 23, 34, + 177, 131, 161, 129, 18, 146, 162, 145, 178, 130, 178, 129, + 194, 113, 210, 98, 210, 97, 226, 82, 52, 114, 81, 34, + 50, 98, 65, 49, 82, 162, 35, 66, 161, 66, 66, 146, + 146, 161, 161, 161, 161, 162, 130, 177, 129, 194, 114, 81, + 97, 129, 97, 81, 136, 0, 26, 48, 65, 24, 0, 24, + 21, 161, 114, 50, 129, 130, 66, 98, 226, 97, 226, 98, + 179, 129, 242, 81, 240, 34, 65, 240, 34, 49, 193, 82, + 34, 97, 82, 50, 49, 98, 101, 50, 83, 225, 81, 18, + 209, 97, 18, 209, 81, 34, 193, 81, 50, 178, 81, 50, + 177, 89, 129, 178, 161, 178, 145, 194, 145, 194, 0, 27, + 80, 29, 12, 0, 24, 82, 148, 132, 146, 240, 240, 81, + 177, 177, 177, 177, 177, 132, 102, 83, 146, 162, 162, 162, + 178, 163, 20, 87, 116, 64, 69, 25, 240, 240, 34, 240, + 131, 240, 131, 240, 146, 240, 161, 0, 6, 2, 240, 115, + 240, 100, 240, 101, 240, 81, 19, 240, 66, 19, 240, 65, + 50, 240, 65, 51, 240, 34, 51, 240, 33, 82, 240, 33, + 83, 242, 83, 241, 114, 226, 115, 220, 209, 146, 194, 147, + 177, 163, 177, 178, 162, 179, 145, 195, 131, 180, 87, 105, + 0, 28, 64, 69, 25, 240, 240, 130, 240, 116, 240, 84, + 240, 83, 240, 97, 0, 6, 50, 240, 115, 240, 100, 240, + 101, 240, 81, 19, 240, 66, 19, 240, 65, 50, 240, 65, + 51, 240, 34, 51, 240, 33, 82, 240, 33, 83, 241, 99, + 241, 114, 226, 115, 220, 209, 146, 194, 147, 177, 163, 177, + 178, 162, 179, 145, 195, 131, 180, 87, 105, 0, 28, 64, + 72, 25, 240, 240, 82, 240, 116, 240, 83, 18, 240, 50, + 66, 240, 17, 129, 240, 240, 242, 240, 115, 240, 100, 240, + 101, 240, 81, 19, 240, 66, 19, 240, 65, 50, 240, 65, + 51, 240, 34, 51, 240, 33, 82, 240, 33, 83, 241, 99, + 241, 114, 226, 115, 220, 209, 146, 194, 147, 177, 163, 177, + 178, 162, 179, 145, 195, 131, 180, 87, 105, 0, 28, 64, + 67, 25, 0, 7, 20, 81, 225, 51, 33, 225, 84, 0, + 8, 114, 240, 115, 240, 100, 240, 101, 240, 81, 19, 240, + 66, 19, 240, 65, 50, 240, 65, 51, 240, 34, 51, 240, + 33, 82, 240, 33, 83, 241, 99, 241, 114, 226, 115, 220, + 209, 146, 194, 147, 177, 163, 177, 178, 162, 179, 145, 195, + 131, 180, 87, 105, 0, 28, 64, 65, 25, 0, 7, 18, + 82, 240, 18, 82, 0, 11, 114, 240, 115, 240, 100, 240, + 101, 240, 81, 19, 240, 66, 34, 240, 66, 34, 240, 65, + 51, 240, 34, 66, 240, 34, 66, 240, 33, 83, 242, 83, + 242, 98, 226, 115, 220, 210, 130, 194, 147, 178, 147, 178, + 147, 162, 179, 146, 179, 131, 180, 87, 105, 0, 28, 64, + 74, 25, 148, 240, 66, 66, 240, 33, 97, 240, 33, 97, + 240, 34, 66, 240, 68, 0, 6, 2, 240, 115, 240, 100, + 240, 97, 19, 240, 81, 19, 240, 66, 19, 240, 65, 50, + 240, 65, 51, 240, 34, 51, 240, 33, 67, 240, 33, 83, + 242, 83, 241, 99, 226, 115, 220, 209, 131, 194, 147, 177, + 163, 177, 163, 162, 179, 145, 195, 131, 180, 87, 105, 0, + 28, 64, 80, 36, 0, 37, 79, 3, 240, 100, 132, 240, + 84, 162, 240, 66, 18, 177, 240, 65, 34, 193, 240, 34, + 34, 240, 241, 50, 113, 240, 97, 66, 113, 240, 82, 66, + 98, 240, 81, 82, 83, 240, 65, 106, 240, 58, 98, 240, + 49, 114, 113, 240, 33, 130, 113, 240, 18, 130, 240, 145, + 146, 209, 145, 162, 194, 130, 162, 193, 145, 178, 178, 130, + 178, 178, 101, 162, 148, 73, 95, 3, 0, 41, 64, 21, + 0, 21, 119, 33, 147, 85, 114, 147, 98, 178, 82, 209, + 67, 240, 50, 240, 51, 240, 51, 240, 51, 240, 51, 240, + 51, 240, 51, 240, 51, 240, 51, 240, 67, 240, 51, 240, + 66, 209, 98, 178, 114, 146, 147, 83, 199, 240, 49, 240, + 65, 240, 66, 240, 67, 240, 83, 240, 66, 240, 66, 245, + 240, 224, 60, 22, 240, 178, 240, 84, 240, 68, 240, 83, + 240, 98, 0, 6, 127, 1, 146, 132, 130, 162, 130, 177, + 130, 193, 114, 240, 82, 113, 194, 113, 194, 98, 194, 83, + 202, 194, 98, 194, 113, 194, 113, 194, 240, 82, 240, 82, + 194, 98, 193, 114, 178, 114, 178, 114, 148, 79, 3, 0, + 25, 32, 61, 22, 240, 240, 50, 240, 67, 240, 51, 240, + 35, 240, 50, 0, 7, 47, 2, 130, 132, 130, 162, 130, + 178, 114, 193, 114, 240, 82, 113, 194, 113, 194, 98, 194, + 83, 202, 194, 98, 194, 113, 194, 113, 194, 240, 82, 209, + 98, 209, 98, 194, 98, 193, 114, 178, 114, 148, 79, 3, + 0, 25, 32, 62, 22, 240, 241, 240, 83, 240, 50, 18, + 240, 18, 66, 209, 129, 0, 6, 79, 1, 146, 132, 130, + 162, 130, 177, 130, 193, 114, 240, 82, 113, 194, 113, 194, + 98, 194, 83, 202, 194, 98, 194, 113, 194, 113, 194, 240, + 82, 240, 82, 194, 98, 193, 114, 178, 114, 178, 114, 148, + 79, 3, 0, 25, 32, 56, 22, 0, 6, 2, 98, 194, + 98, 0, 12, 15, 1, 146, 132, 130, 162, 130, 178, 114, + 193, 114, 240, 82, 113, 194, 113, 194, 98, 194, 83, 202, + 194, 98, 194, 113, 194, 113, 194, 240, 82, 209, 98, 209, + 98, 194, 98, 193, 114, 178, 114, 148, 79, 3, 0, 25, + 32, 33, 12, 194, 163, 163, 178, 193, 240, 249, 98, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 121, 0, 13, 112, 35, 12, + 240, 66, 147, 116, 115, 130, 240, 240, 41, 98, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 121, 0, 13, 112, 38, 14, 240, + 50, 180, 147, 18, 114, 66, 81, 130, 240, 240, 41, 130, + 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, 194, + 194, 194, 194, 194, 194, 194, 194, 153, 0, 16, 32, 34, + 13, 240, 178, 98, 50, 98, 0, 6, 121, 130, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 121, 0, 15, 16, 49, 24, 0, + 24, 28, 242, 100, 194, 131, 178, 162, 162, 163, 146, 179, + 130, 179, 130, 194, 130, 195, 114, 195, 59, 115, 114, 195, + 114, 195, 114, 195, 114, 195, 114, 194, 130, 179, 130, 178, + 146, 163, 146, 147, 162, 130, 157, 0, 28, 32, 69, 24, + 0, 6, 117, 65, 209, 69, 0, 13, 6, 135, 100, 162, + 132, 162, 133, 146, 130, 19, 130, 130, 19, 130, 130, 35, + 114, 130, 51, 98, 130, 51, 98, 130, 67, 82, 130, 83, + 66, 130, 83, 66, 130, 99, 50, 130, 115, 34, 130, 115, + 34, 130, 131, 18, 130, 149, 130, 149, 130, 164, 130, 179, + 130, 179, 87, 162, 0, 27, 80, 59, 23, 240, 211, 240, + 99, 240, 99, 240, 114, 240, 114, 0, 8, 6, 242, 98, + 179, 131, 131, 163, 114, 194, 99, 195, 82, 226, 67, 227, + 51, 227, 51, 227, 51, 227, 51, 227, 51, 227, 51, 227, + 51, 227, 66, 226, 83, 195, 98, 194, 115, 163, 131, 131, + 178, 98, 246, 0, 27, 16, 60, 23, 240, 240, 83, 240, + 67, 240, 67, 240, 66, 240, 82, 0, 8, 38, 242, 98, + 179, 131, 131, 163, 114, 194, 99, 195, 82, 226, 67, 227, + 51, 227, 51, 227, 51, 227, 51, 227, 51, 227, 51, 227, + 51, 227, 66, 226, 83, 195, 98, 194, 115, 163, 131, 131, + 178, 98, 246, 0, 27, 16, 62, 23, 240, 240, 34, 240, + 84, 240, 50, 34, 240, 18, 66, 225, 129, 0, 7, 86, + 242, 98, 179, 131, 131, 163, 114, 194, 99, 195, 82, 226, + 67, 227, 51, 227, 51, 227, 51, 227, 51, 227, 51, 227, + 51, 227, 51, 227, 66, 226, 83, 195, 98, 194, 115, 163, + 131, 131, 178, 98, 246, 0, 27, 16, 55, 23, 0, 6, + 54, 65, 177, 70, 0, 13, 54, 242, 98, 179, 131, 131, + 163, 114, 194, 99, 195, 82, 226, 67, 227, 51, 227, 51, + 227, 51, 227, 51, 227, 51, 227, 51, 227, 51, 227, 66, + 226, 83, 195, 98, 194, 115, 163, 131, 131, 178, 98, 246, + 0, 27, 16, 55, 23, 0, 6, 50, 98, 210, 98, 0, + 13, 54, 242, 98, 179, 131, 131, 163, 114, 194, 99, 195, + 82, 226, 67, 227, 51, 227, 51, 227, 51, 227, 51, 227, + 51, 227, 51, 227, 51, 227, 66, 226, 83, 195, 98, 194, + 115, 163, 131, 131, 178, 98, 246, 0, 27, 16, 29, 14, + 0, 28, 1, 145, 50, 114, 66, 82, 98, 50, 130, 18, + 163, 179, 162, 18, 130, 50, 98, 82, 66, 114, 49, 145, + 0, 19, 80, 63, 23, 0, 23, 118, 97, 130, 84, 34, + 99, 133, 99, 163, 114, 179, 99, 165, 82, 162, 34, 67, + 146, 51, 51, 130, 67, 51, 115, 67, 51, 99, 83, 51, + 83, 99, 51, 67, 115, 51, 66, 131, 51, 50, 147, 66, + 34, 162, 85, 163, 99, 178, 115, 163, 101, 131, 98, 36, + 82, 129, 102, 0, 27, 16, 62, 25, 240, 240, 35, 240, + 116, 240, 116, 240, 131, 240, 146, 0, 7, 89, 103, 98, + 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, + 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, + 194, 146, 194, 146, 194, 146, 194, 146, 178, 178, 162, 194, + 130, 226, 83, 240, 38, 0, 29, 64, 62, 25, 240, 240, + 131, 240, 99, 240, 99, 240, 98, 240, 129, 0, 8, 9, + 103, 98, 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, + 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, + 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, 178, 178, + 162, 194, 130, 226, 83, 240, 38, 0, 29, 64, 65, 25, + 177, 240, 131, 240, 100, 240, 83, 33, 240, 50, 81, 240, + 17, 129, 0, 7, 57, 103, 98, 194, 146, 194, 146, 194, + 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, + 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, + 146, 194, 146, 178, 178, 162, 194, 130, 226, 83, 240, 38, + 0, 29, 64, 58, 25, 0, 7, 18, 82, 240, 18, 82, + 0, 13, 89, 103, 98, 194, 146, 194, 146, 194, 146, 194, + 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, + 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, 146, 194, + 146, 178, 178, 162, 194, 130, 226, 83, 240, 38, 0, 29, + 64, 65, 24, 240, 240, 115, 240, 84, 240, 68, 240, 67, + 240, 82, 0, 7, 89, 87, 84, 163, 131, 177, 162, 177, + 163, 145, 194, 129, 211, 113, 226, 97, 243, 81, 243, 65, + 240, 34, 49, 240, 51, 33, 240, 66, 17, 240, 84, 240, + 98, 240, 114, 240, 114, 240, 114, 240, 114, 240, 114, 240, + 114, 240, 73, 0, 28, 16, 46, 20, 0, 20, 9, 226, + 240, 50, 240, 50, 240, 57, 178, 99, 146, 130, 130, 131, + 114, 147, 98, 147, 98, 147, 98, 147, 98, 131, 114, 130, + 130, 99, 153, 178, 240, 50, 240, 50, 240, 50, 240, 50, + 249, 0, 23, 112, 53, 17, 0, 17, 100, 178, 50, 146, + 82, 129, 98, 114, 98, 114, 97, 130, 81, 146, 65, 132, + 49, 178, 34, 178, 34, 178, 35, 162, 36, 146, 52, 130, + 68, 114, 99, 98, 115, 82, 130, 82, 17, 98, 82, 18, + 82, 82, 34, 50, 68, 38, 0, 19, 96, 41, 16, 0, + 16, 18, 227, 227, 226, 241, 242, 241, 240, 229, 147, 50, + 130, 82, 99, 82, 114, 82, 226, 181, 131, 50, 114, 82, + 98, 98, 98, 98, 98, 98, 33, 51, 54, 85, 50, 0, + 18, 80, 40, 16, 0, 16, 114, 226, 211, 210, 210, 225, + 241, 240, 229, 147, 50, 115, 82, 114, 82, 226, 226, 181, + 131, 50, 114, 82, 98, 98, 98, 98, 98, 98, 33, 51, + 54, 85, 50, 0, 18, 80, 44, 16, 0, 16, 81, 226, + 227, 194, 18, 162, 49, 161, 81, 129, 240, 240, 53, 147, + 50, 115, 82, 114, 82, 226, 226, 181, 131, 50, 114, 82, + 98, 98, 98, 98, 98, 98, 33, 51, 54, 85, 50, 0, + 18, 80, 38, 16, 0, 22, 36, 65, 82, 53, 0, 7, + 21, 147, 50, 115, 82, 114, 82, 226, 226, 181, 131, 50, + 114, 82, 98, 98, 98, 98, 98, 98, 33, 51, 54, 85, + 50, 0, 18, 80, 40, 16, 0, 20, 19, 51, 115, 51, + 115, 51, 0, 7, 21, 147, 50, 115, 82, 114, 82, 226, + 226, 181, 131, 50, 114, 82, 98, 98, 98, 98, 98, 98, + 33, 51, 54, 85, 50, 0, 18, 80, 44, 16, 0, 16, + 67, 178, 50, 145, 81, 145, 81, 146, 50, 165, 240, 240, + 213, 147, 50, 115, 82, 114, 82, 226, 226, 181, 131, 50, + 114, 82, 98, 98, 98, 98, 98, 98, 33, 51, 54, 85, + 50, 0, 18, 80, 41, 23, 0, 46, 52, 85, 115, 50, + 18, 66, 83, 83, 98, 82, 83, 98, 194, 114, 204, 148, + 240, 19, 34, 226, 82, 210, 98, 210, 99, 194, 99, 113, + 67, 50, 35, 65, 101, 86, 0, 26, 80, 34, 14, 0, + 28, 69, 129, 67, 81, 83, 66, 98, 50, 194, 194, 194, + 194, 194, 210, 194, 113, 83, 65, 133, 177, 193, 209, 210, + 211, 194, 129, 50, 148, 240, 80, 35, 15, 0, 15, 34, + 211, 210, 226, 210, 226, 225, 240, 197, 146, 50, 114, 82, + 82, 98, 67, 98, 76, 51, 194, 211, 195, 210, 211, 97, + 99, 65, 149, 0, 17, 80, 35, 15, 0, 16, 2, 195, + 195, 194, 194, 209, 240, 240, 197, 146, 50, 113, 98, 82, + 98, 66, 115, 60, 50, 210, 210, 210, 226, 210, 113, 99, + 65, 149, 0, 17, 80, 37, 15, 0, 17, 66, 196, 177, + 33, 161, 65, 129, 97, 240, 240, 149, 146, 50, 113, 98, + 82, 98, 66, 114, 76, 50, 210, 210, 210, 226, 210, 113, + 99, 65, 149, 0, 17, 80, 35, 15, 0, 19, 3, 51, + 99, 51, 99, 51, 0, 6, 85, 146, 50, 113, 98, 82, + 114, 50, 130, 60, 50, 210, 210, 210, 226, 210, 114, 83, + 66, 133, 0, 17, 80, 28, 10, 0, 10, 2, 131, 130, + 131, 130, 145, 240, 226, 100, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 130, 102, 0, 11, 80, 28, 10, 0, + 10, 82, 115, 114, 115, 114, 129, 240, 210, 100, 130, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 102, 0, 11, + 96, 32, 11, 0, 12, 98, 131, 129, 33, 97, 65, 65, + 97, 49, 97, 240, 34, 116, 146, 146, 146, 146, 146, 146, + 146, 146, 146, 146, 146, 118, 0, 12, 112, 29, 11, 0, + 13, 99, 35, 51, 35, 51, 35, 240, 240, 146, 116, 146, + 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 119, 0, + 12, 96, 45, 16, 0, 16, 35, 82, 130, 34, 180, 196, + 177, 35, 130, 66, 227, 226, 152, 99, 52, 82, 115, 66, + 115, 50, 146, 50, 146, 50, 146, 50, 146, 50, 146, 50, + 145, 82, 114, 82, 98, 115, 50, 165, 0, 18, 112, 45, + 18, 0, 25, 35, 81, 114, 35, 33, 129, 83, 240, 240, + 242, 52, 116, 18, 50, 131, 98, 114, 114, 114, 114, 114, + 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, + 114, 114, 114, 86, 54, 0, 20, 80, 41, 16, 0, 16, + 34, 227, 227, 226, 241, 242, 241, 240, 229, 147, 51, 98, + 114, 82, 114, 66, 146, 50, 146, 50, 146, 50, 146, 50, + 146, 50, 146, 66, 114, 82, 114, 99, 51, 149, 0, 18, + 112, 41, 16, 0, 17, 3, 211, 195, 210, 225, 226, 225, + 240, 229, 147, 51, 98, 114, 82, 114, 66, 146, 50, 146, + 50, 146, 50, 146, 50, 146, 50, 146, 66, 114, 82, 114, + 99, 51, 149, 0, 18, 112, 45, 16, 0, 16, 97, 226, + 227, 194, 18, 162, 50, 145, 81, 129, 113, 240, 165, 147, + 51, 98, 114, 82, 114, 66, 146, 50, 146, 50, 146, 50, + 146, 50, 146, 50, 146, 66, 114, 82, 114, 99, 51, 149, + 0, 18, 112, 39, 16, 0, 22, 52, 65, 82, 53, 0, + 7, 21, 147, 51, 98, 114, 82, 114, 66, 146, 50, 146, + 50, 146, 50, 146, 50, 146, 50, 146, 66, 114, 82, 114, + 99, 51, 149, 0, 18, 112, 41, 16, 0, 20, 35, 51, + 115, 51, 115, 51, 0, 7, 21, 147, 51, 98, 114, 82, + 114, 66, 146, 50, 146, 50, 146, 50, 146, 50, 146, 50, + 146, 66, 114, 82, 114, 99, 51, 149, 0, 18, 112, 20, + 18, 0, 34, 82, 244, 228, 242, 0, 7, 127, 0, 5, + 98, 244, 228, 242, 0, 23, 80, 41, 16, 0, 32, 69, + 49, 83, 52, 82, 114, 82, 99, 66, 98, 18, 50, 82, + 34, 50, 66, 50, 50, 50, 66, 50, 34, 82, 50, 18, + 98, 67, 98, 82, 114, 84, 51, 81, 53, 0, 18, 112, + 45, 17, 0, 17, 50, 243, 242, 242, 240, 18, 240, 17, + 240, 240, 228, 68, 114, 98, 114, 98, 114, 98, 114, 98, + 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, + 114, 98, 130, 52, 148, 36, 0, 19, 64, 43, 17, 0, + 18, 18, 227, 226, 226, 241, 242, 240, 240, 212, 68, 114, + 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, + 98, 114, 98, 114, 98, 114, 98, 114, 98, 130, 52, 148, + 36, 0, 19, 64, 47, 17, 0, 17, 97, 240, 18, 227, + 225, 33, 193, 50, 161, 81, 240, 240, 180, 68, 114, 98, + 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, + 114, 98, 114, 98, 114, 98, 114, 98, 130, 52, 148, 36, + 0, 19, 64, 43, 17, 0, 21, 67, 51, 131, 51, 131, + 51, 0, 7, 20, 68, 114, 98, 114, 98, 114, 98, 114, + 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, 98, 114, + 98, 114, 98, 130, 52, 148, 36, 0, 19, 64, 60, 19, + 0, 20, 34, 240, 19, 240, 18, 240, 18, 240, 34, 240, + 33, 0, 6, 6, 70, 83, 114, 115, 114, 130, 113, 146, + 113, 162, 81, 178, 81, 179, 49, 210, 49, 210, 34, 226, + 17, 244, 243, 240, 34, 240, 33, 240, 34, 240, 33, 240, + 34, 240, 33, 211, 18, 213, 228, 240, 240, 64, 50, 17, + 0, 17, 34, 212, 242, 242, 242, 242, 242, 242, 242, 37, + 132, 66, 114, 114, 98, 114, 98, 130, 82, 130, 82, 130, + 82, 130, 82, 130, 82, 130, 82, 114, 98, 114, 100, 66, + 114, 36, 146, 242, 242, 242, 242, 242, 242, 214, 240, 208, + 57, 19, 0, 24, 35, 51, 163, 51, 163, 51, 0, 7, + 119, 69, 83, 115, 114, 129, 131, 97, 162, 97, 162, 82, + 163, 65, 194, 50, 194, 49, 226, 18, 226, 17, 240, 19, + 240, 18, 240, 34, 240, 33, 240, 49, 240, 33, 240, 49, + 240, 33, 211, 18, 213, 228, 240, 240, 64, +}; + +//***************************************************************************** +// +// The glyph offset table for the 30 point Theanooldstyle font. +// +//***************************************************************************** + +const uint16_t g_pui16FontOffsetTheanooldstyle30[] = +{ + 0, 5, 33, 60, 109, 174, 243, 307, + 324, 359, 395, 428, 462, 478, 487, 498, + 534, 583, 615, 653, 692, 741, 782, 826, + 857, 903, 947, 964, 985, 1014, 1025, 1053, + 1083, 1173, 1231, 1279, 1329, 1378, 1428, 1477, + 1528, 1578, 1607, 1644, 1697, 1748, 1830, 1893, + 1942, 1989, 2051, 2100, 2146, 2200, 2251, 2308, + 2395, 2451, 2505, 2557, 2593, 2628, 2664, 2687, + 2695, 2709, 2741, 2783, 2809, 2852, 2879, 2909, + 2954, 3005, 3032, 3067, 3117, 3146, 3198, 3234, + 3267, 3309, 3351, 3375, 3401, 3430, 3465, 3497, + 3547, 3581, 3629, 3656, 3692, 3727, 3764, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 3778, 3783, 3809, 3860, 3913, 3945, 3992, 4021, + 4074, 4087, 4159, 4178, 4207, 4227, 4236, 4314, + 4322, 4349, 4386, 4409, 4434, 4448, 4502, 4567, + 4578, 4591, 4612, 4635, 4664, 4723, 4784, 4849, + 4878, 4947, 5016, 5088, 5155, 5220, 5294, 5374, + 5438, 5498, 5559, 5621, 5677, 5710, 5745, 5783, + 5817, 5866, 5935, 5994, 6054, 6116, 6171, 6226, + 6255, 6318, 6380, 6442, 6507, 6565, 6630, 6676, + 6729, 6770, 6810, 6854, 6892, 6932, 6976, 7017, + 7051, 7086, 7121, 7158, 7193, 7221, 7249, 7281, + 7310, 7355, 7400, 7441, 7482, 7527, 7566, 7607, + 7627, 7668, 7713, 7756, 7803, 7846, 7906, 7956, +}; + +//***************************************************************************** +// +// The font definition for the 30 point Theanooldstyle font. +// +//***************************************************************************** +const tFontEx g_sFontExTheanooldstyle30 = +{ + // + // The format of the font. + // + FONT_FMT_EX_PIXEL_RLE, + + // + // The maximum width of the font. + // + 32, + + // + // The height of the font. + // + 39, + + // + // The baseline of the font. + // + 30, + + // + // The first encoded character in the font. + // + 32, + + // + // The last encoded character in the font. + // + 255, + + // + // A pointer to the character offset table. + // + g_pui16FontOffsetTheanooldstyle30, + + // + // A pointer to the actual font data + // + g_pui8Theanooldstyle30Data +}; diff --git a/third_party/fonts/ofl/ofl_fonts.h b/third_party/fonts/ofl/ofl_fonts.h new file mode 100644 index 0000000..2b6d796 --- /dev/null +++ b/third_party/fonts/ofl/ofl_fonts.h @@ -0,0 +1,220 @@ +//***************************************************************************** +// +// ofl_fonts.h - Public header declaring prototypes for the various extended +// fonts found under third_party/fonts/ofl. +// +//***************************************************************************** +#ifndef __OFL_FONTS_H__ +#define __OFL_FONTS_H__ + +//***************************************************************************** +// +// Fonts encoding the ISO8859-1 character set (Unicode U0000-U00FF). +// +//***************************************************************************** +extern const tFontEx g_sFontExHandwriting14; +#define g_pFontExHandwriting14 (const tFont *)&g_sFontExHandwriting14 +extern const tFontEx g_sFontExHandwriting16; +#define g_pFontExHandwriting16 (const tFont *)&g_sFontExHandwriting16 +extern const tFontEx g_sFontExHandwriting18; +#define g_pFontExHandwriting18 (const tFont *)&g_sFontExHandwriting18 +extern const tFontEx g_sFontExHandwriting20; +#define g_pFontExHandwriting20 (const tFont *)&g_sFontExHandwriting20 +extern const tFontEx g_sFontExHandwriting22; +#define g_pFontExHandwriting22 (const tFont *)&g_sFontExHandwriting22 +extern const tFontEx g_sFontExHandwriting24; +#define g_pFontExHandwriting24 (const tFont *)&g_sFontExHandwriting24 +extern const tFontEx g_sFontExHandwriting26; +#define g_pFontExHandwriting26 (const tFont *)&g_sFontExHandwriting26 +extern const tFontEx g_sFontExHandwriting28; +#define g_pFontExHandwriting28 (const tFont *)&g_sFontExHandwriting28 +extern const tFontEx g_sFontExHandwriting30; +#define g_pFontExHandwriting30 (const tFont *)&g_sFontExHandwriting30 +extern const tFontEx g_sFontExOldstandard14; +#define g_pFontExOldstandard14 (const tFont *)&g_sFontExOldstandard14 +extern const tFontEx g_sFontExOldstandard14b; +#define g_pFontExOldstandard14b (const tFont *)&g_sFontExOldstandard14b +extern const tFontEx g_sFontExOldstandard14i; +#define g_pFontExOldstandard14i (const tFont *)&g_sFontExOldstandard14i +extern const tFontEx g_sFontExOldstandard16; +#define g_pFontExOldstandard16 (const tFont *)&g_sFontExOldstandard16 +extern const tFontEx g_sFontExOldstandard16b; +#define g_pFontExOldstandard16b (const tFont *)&g_sFontExOldstandard16b +extern const tFontEx g_sFontExOldstandard16i; +#define g_pFontExOldstandard16i (const tFont *)&g_sFontExOldstandard16i +extern const tFontEx g_sFontExOldstandard18; +#define g_pFontExOldstandard18 (const tFont *)&g_sFontExOldstandard18 +extern const tFontEx g_sFontExOldstandard18b; +#define g_pFontExOldstandard18b (const tFont *)&g_sFontExOldstandard18b +extern const tFontEx g_sFontExOldstandard18i; +#define g_pFontExOldstandard18i (const tFont *)&g_sFontExOldstandard18i +extern const tFontEx g_sFontExOldstandard20; +#define g_pFontExOldstandard20 (const tFont *)&g_sFontExOldstandard20 +extern const tFontEx g_sFontExOldstandard20b; +#define g_pFontExOldstandard20b (const tFont *)&g_sFontExOldstandard20b +extern const tFontEx g_sFontExOldstandard20i; +#define g_pFontExOldstandard20i (const tFont *)&g_sFontExOldstandard20i +extern const tFontEx g_sFontExOldstandard22; +#define g_pFontExOldstandard22 (const tFont *)&g_sFontExOldstandard22 +extern const tFontEx g_sFontExOldstandard22b; +#define g_pFontExOldstandard22b (const tFont *)&g_sFontExOldstandard22b +extern const tFontEx g_sFontExOldstandard22i; +#define g_pFontExOldstandard22i (const tFont *)&g_sFontExOldstandard22i +extern const tFontEx g_sFontExOldstandard24; +#define g_pFontExOldstandard24 (const tFont *)&g_sFontExOldstandard24 +extern const tFontEx g_sFontExOldstandard24b; +#define g_pFontExOldstandard24b (const tFont *)&g_sFontExOldstandard24b +extern const tFontEx g_sFontExOldstandard24i; +#define g_pFontExOldstandard24i (const tFont *)&g_sFontExOldstandard24i +extern const tFontEx g_sFontExOldstandard26; +#define g_pFontExOldstandard26 (const tFont *)&g_sFontExOldstandard26 +extern const tFontEx g_sFontExOldstandard26b; +#define g_pFontExOldstandard26b (const tFont *)&g_sFontExOldstandard26b +extern const tFontEx g_sFontExOldstandard26i; +#define g_pFontExOldstandard26i (const tFont *)&g_sFontExOldstandard26i +extern const tFontEx g_sFontExOldstandard28; +#define g_pFontExOldstandard28 (const tFont *)&g_sFontExOldstandard28 +extern const tFontEx g_sFontExOldstandard28b; +#define g_pFontExOldstandard28b (const tFont *)&g_sFontExOldstandard28b +extern const tFontEx g_sFontExOldstandard28i; +#define g_pFontExOldstandard28i (const tFont *)&g_sFontExOldstandard28i +extern const tFontEx g_sFontExOldstandard30; +#define g_pFontExOldstandard30 (const tFont *)&g_sFontExOldstandard30 +extern const tFontEx g_sFontExOldstandard30b; +#define g_pFontExOldstandard30b (const tFont *)&g_sFontExOldstandard30b +extern const tFontEx g_sFontExOldstandard30i; +#define g_pFontExOldstandard30i (const tFont *)&g_sFontExOldstandard30i +extern const tFontEx g_sFontExSansand14; +#define g_pFontExSansand14 (const tFont *)&g_sFontExSansand14 +extern const tFontEx g_sFontExSansand16; +#define g_pFontExSansand16 (const tFont *)&g_sFontExSansand16 +extern const tFontEx g_sFontExSansand18; +#define g_pFontExSansand18 (const tFont *)&g_sFontExSansand18 +extern const tFontEx g_sFontExSansand20; +#define g_pFontExSansand20 (const tFont *)&g_sFontExSansand20 +extern const tFontEx g_sFontExSansand22; +#define g_pFontExSansand22 (const tFont *)&g_sFontExSansand22 +extern const tFontEx g_sFontExSansand24; +#define g_pFontExSansand24 (const tFont *)&g_sFontExSansand24 +extern const tFontEx g_sFontExSansand26; +#define g_pFontExSansand26 (const tFont *)&g_sFontExSansand26 +extern const tFontEx g_sFontExSansand28; +#define g_pFontExSansand28 (const tFont *)&g_sFontExSansand28 +extern const tFontEx g_sFontExSansand30; +#define g_pFontExSansand30 (const tFont *)&g_sFontExSansand30 +extern const tFontEx g_sFontExTheanodidot14; +#define g_pFontExTheanodidot14 (const tFont *)&g_sFontExTheanodidot14 +extern const tFontEx g_sFontExTheanodidot16; +#define g_pFontExTheanodidot16 (const tFont *)&g_sFontExTheanodidot16 +extern const tFontEx g_sFontExTheanodidot18; +#define g_pFontExTheanodidot18 (const tFont *)&g_sFontExTheanodidot18 +extern const tFontEx g_sFontExTheanodidot20; +#define g_pFontExTheanodidot20 (const tFont *)&g_sFontExTheanodidot20 +extern const tFontEx g_sFontExTheanodidot22; +#define g_pFontExTheanodidot22 (const tFont *)&g_sFontExTheanodidot22 +extern const tFontEx g_sFontExTheanodidot24; +#define g_pFontExTheanodidot24 (const tFont *)&g_sFontExTheanodidot24 +extern const tFontEx g_sFontExTheanodidot26; +#define g_pFontExTheanodidot26 (const tFont *)&g_sFontExTheanodidot26 +extern const tFontEx g_sFontExTheanodidot28; +#define g_pFontExTheanodidot28 (const tFont *)&g_sFontExTheanodidot28 +extern const tFontEx g_sFontExTheanodidot30; +#define g_pFontExTheanodidot30 (const tFont *)&g_sFontExTheanodidot30 +extern const tFontEx g_sFontExTheanomodern14; +#define g_pFontExTheanomodern14 (const tFont *)&g_sFontExTheanomodern14 +extern const tFontEx g_sFontExTheanomodern16; +#define g_pFontExTheanomodern16 (const tFont *)&g_sFontExTheanomodern16 +extern const tFontEx g_sFontExTheanomodern18; +#define g_pFontExTheanomodern18 (const tFont *)&g_sFontExTheanomodern18 +extern const tFontEx g_sFontExTheanomodern20; +#define g_pFontExTheanomodern20 (const tFont *)&g_sFontExTheanomodern20 +extern const tFontEx g_sFontExTheanomodern22; +#define g_pFontExTheanomodern22 (const tFont *)&g_sFontExTheanomodern22 +extern const tFontEx g_sFontExTheanomodern24; +#define g_pFontExTheanomodern24 (const tFont *)&g_sFontExTheanomodern24 +extern const tFontEx g_sFontExTheanomodern26; +#define g_pFontExTheanomodern26 (const tFont *)&g_sFontExTheanomodern26 +extern const tFontEx g_sFontExTheanomodern28; +#define g_pFontExTheanomodern28 (const tFont *)&g_sFontExTheanomodern28 +extern const tFontEx g_sFontExTheanomodern30; +#define g_pFontExTheanomodern30 (const tFont *)&g_sFontExTheanomodern30 +extern const tFontEx g_sFontExTheanooldstyle14; +#define g_pFontExTheanooldstyle14 (const tFont *)&g_sFontExTheanooldstyle14 +extern const tFontEx g_sFontExTheanooldstyle16; +#define g_pFontExTheanooldstyle16 (const tFont *)&g_sFontExTheanooldstyle16 +extern const tFontEx g_sFontExTheanooldstyle18; +#define g_pFontExTheanooldstyle18 (const tFont *)&g_sFontExTheanooldstyle18 +extern const tFontEx g_sFontExTheanooldstyle20; +#define g_pFontExTheanooldstyle20 (const tFont *)&g_sFontExTheanooldstyle20 +extern const tFontEx g_sFontExTheanooldstyle22; +#define g_pFontExTheanooldstyle22 (const tFont *)&g_sFontExTheanooldstyle22 +extern const tFontEx g_sFontExTheanooldstyle24; +#define g_pFontExTheanooldstyle24 (const tFont *)&g_sFontExTheanooldstyle24 +extern const tFontEx g_sFontExTheanooldstyle26; +#define g_pFontExTheanooldstyle26 (const tFont *)&g_sFontExTheanooldstyle26 +extern const tFontEx g_sFontExTheanooldstyle28; +#define g_pFontExTheanooldstyle28 (const tFont *)&g_sFontExTheanooldstyle28 +extern const tFontEx g_sFontExTheanooldstyle30; +#define g_pFontExTheanooldstyle30 (const tFont *)&g_sFontExTheanooldstyle30 + +//***************************************************************************** +// +// Fonts encoding ASCII and Korean Hangul jamo. The binary versions of these +// fonts, found in the binfonts subdirectory, also contain the full Hangul +// syllable set (but are, of course, very much larger). +// +//***************************************************************************** +extern const unsigned char g_pucHangulgothic16pt[]; +#define g_pFontHangulgothic16pt const tFont *)g_pucHangulgothic16pt +extern const unsigned char g_pucHangulgothic16ptb[]; +#define g_pFontHangulgothic16ptb (const tFont *)g_pucHangulgothic16ptb +extern const unsigned char g_pucHangulgothic18pt[]; +#define g_pFontHangulgothic18pt (const tFont *)g_pucHangulgothic18pt +extern const unsigned char g_pucHangulgothic18ptb[]; +#define g_pFontHangulgothic18ptb (const tFont *)g_pucHangulgothic18ptb +extern const unsigned char g_pucHangulgothic20pt[]; +#define g_pFontHangulgothic20pt (const tFont *)g_pucHangulgothic20pt +extern const unsigned char g_pucHangulgothic20ptb[]; +#define g_pFontHangulgothic20ptb (const tFont *)g_pucHangulgothic20ptb +extern const unsigned char g_pucHangulgothic22pt[]; +#define g_pFontHangulgothic22pt (const tFont *)g_pucHangulgothic22pt +extern const unsigned char g_pucHangulgothic22ptb[]; +#define g_pFontHangulgothic22ptb (const tFont *)g_pucHangulgothic22ptb +extern const unsigned char g_pucHangulgothic24pt[]; +#define g_pFontHangulgothic24pt (const tFont *)g_pucHangulgothic24pt +extern const unsigned char g_pucHangulgothic24ptb[]; +#define g_pFontHangulgothic24ptb (const tFont *)g_pucHangulgothic24ptb +extern const unsigned char g_pucHangulmyeongjo16pt[]; +#define g_pFontHangulmyeongjo16pt (const tFont *)g_pucHangulmyeongjo16pt +extern const unsigned char g_pucHangulmyeongjo16ptb[]; +#define g_pFontHangulmyeongjo16ptb (const tFont *)g_pucHangulmyeongjo16ptb +extern const unsigned char g_pucHangulmyeongjo18pt[]; +#define g_pFontHangulmyeongjo18pt (const tFont *)g_pucHangulmyeongjo18pt +extern const unsigned char g_pucHangulmyeongjo18ptb[]; +#define g_pFontHangulmyeongjo18ptb (const tFont *)g_pucHangulmyeongjo18ptb +extern const unsigned char g_pucHangulmyeongjo20pt[]; +#define g_pFontHangulmyeongjo20pt (const tFont *)g_pucHangulmyeongjo20pt +extern const unsigned char g_pucHangulmyeongjo20ptb[]; +#define g_pFontHangulmyeongjo20ptb (const tFont *)g_pucHangulmyeongjo20ptb +extern const unsigned char g_pucHangulmyeongjo22pt[]; +#define g_pFontHangulmyeongjo22pt (const tFont *)g_pucHangulmyeongjo22pt +extern const unsigned char g_pucHangulmyeongjo22ptb[]; +#define g_pFontHangulmyeongjo22ptb (const tFont *)g_pucHangulmyeongjo22ptb +extern const unsigned char g_pucHangulmyeongjo24pt[]; +#define g_pFontHangulmyeongjo24pt (const tFont *)g_pucHangulmyeongjo24pt +extern const unsigned char g_pucHangulmyeongjo24ptb[]; +#define g_pFontHangulmyeongjo24ptb (const tFont *)g_pucHangulmyeongjo24ptb + +//***************************************************************************** +// +// The following font is used as an example in the fontview application. +// It contains ASCII, Hiragana, Katakana, Korean Jamo and a small number +// of Hangul syllables and Chinese ideographs. It is intended purely for +// illustration purposes and is unlikely to be of use in a real-world +// application. +// +//***************************************************************************** +extern const uint8_t g_pui8Cjktest20pt[]; +#define g_pFontCjktest20pt (const tFont *)g_pui8Cjktest20pt + +#endif // __OFL_FONTS_H__ diff --git a/third_party/fonts/ofl/readme.txt b/third_party/fonts/ofl/readme.txt new file mode 100644 index 0000000..40cef7e --- /dev/null +++ b/third_party/fonts/ofl/readme.txt @@ -0,0 +1,17 @@ +Third Party Fonts +----------------- + +All the fonts in this directory are covered under the Open Font License. +Information on the license can be found at: + +http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL + +or in text file OFL.txt in this directory. + +Specific sources: + +OldStandard - http://www.thessalonica.org.ru/en/fonts-download.html +Theano - http://www.thessalonica.org.ru/en/fonts-download.html +Andika - http://www.sil.org/computing/catalog/show_software.asp?id=119 +Breip - http://helloalan.com/projects/breip/ +Nanum - http://hangeul.naver.com/download.nhn diff --git a/third_party/fonts/ofl/ttf/AndBasR.ttf b/third_party/fonts/ofl/ttf/AndBasR.ttf new file mode 100644 index 0000000..54084b7 Binary files /dev/null and b/third_party/fonts/ofl/ttf/AndBasR.ttf differ diff --git a/third_party/fonts/ofl/ttf/NanumMyeongjo.ttf b/third_party/fonts/ofl/ttf/NanumMyeongjo.ttf new file mode 100644 index 0000000..dc16fa8 Binary files /dev/null and b/third_party/fonts/ofl/ttf/NanumMyeongjo.ttf differ diff --git a/third_party/fonts/other/README b/third_party/fonts/other/README new file mode 100644 index 0000000..eaad7ed --- /dev/null +++ b/third_party/fonts/other/README @@ -0,0 +1,183 @@ +¤µ¤¶¤Ê¤ß¥Õ¥©¥ó¥È¤Ë¤Ä¤¤¤Æ + +¤³¤Î¥Õ¥©¥ó¥È¤Ï¡¢Common Lisp ¤Ë°Ü¿¢¤µ¤ì¤¿ÏÂÅĸ¦¥Õ¥©¥ó¥È¥­¥Ã¥È (CLWFK) ¤ò +»ÈÍѤ·¤Æ¼«Æ°Åª¤ËÀ¸À®¤µ¤ì¤¿¥Õ¥©¥ó¥È¤È¡¢´û¸¤Î²þÊѼ«Í³¤Ê¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È +¤òÁȤ߹ç¤ï¤»¤ÆºîÀ®¤·¤¿Êª¤Ç¤¹¡£ + +ʸ»ú¤Î¹½À®Åª¤Ë¤ÏÅìÉ÷¥Õ¥©¥ó¥ÈÂåÂØ¥Õ¥©¥ó¥È¤È¤Û¤ÜƱ¤¸¤Ç¤¹¤¬¡¢¥¹¥±¥ë¥È¥óÄêµÁ +¥Ç¡¼¥¿¤Ë¤Þ¤ÇÁ̤俸í»ú¤Î½¤Àµ¤¬¹Ô¤ï¤ì¤Æ¤¤¤Þ¤¹¡£¾­ÍèŪ¤Ë¤Ï¡¢¥×¥í¥°¥é¥à¤Î²þÁ± +¤Ë¤è¤ê¡¢´Á»ú¥Ç¥¶¥¤¥ó¤ÎÉʼÁ¸þ¾å¤ò¿Þ¤Ã¤Æ¤¤¤­¤¿¤¤¤È»×¤¤¤Þ¤¹¡£ + +¤³¤Î¥Ð¡¼¥¸¥ç¥ó¤ÏºÇ½é¤Î¥ê¥ê¡¼¥¹¤Ç¡¢ÉʼÁ¾å¤ÏÈó¾ï¤ËÉÔ´°Á´¤Êʪ¤Ç¤¹¡£ +ÅìÉ÷¥Õ¥©¥ó¥ÈÂåÂØ¥Õ¥©¥ó¥È¤è¤ê¡¢ÉÔ¶ñ¹ç¤¬È¯À¸¤¹¤ë²ÄǽÀ­¤Ï¹â¤¤¤Ç¤·¤ç¤¦¡£ +ÌäÂêÅÀ¤òȯ¸«¤µ¤ì¤Þ¤·¤¿¤é¤´Êó¹ð¤¤¤¿¤À¤±¤ë¤È¹¬¤¤¤Ç¤¹¡£ + +Ï¢ÍíÀè¤È¤·¤Æ¤Ï efont-devel ¥á¡¼¥ê¥ó¥°¥ê¥¹¥È¤«¸ø³«¥Õ¥©¡¼¥é¥à¤ò¤´»ÈÍѤ¯¤À¤µ¤¤¡£ +¤É¤Á¤é¤â http://sourceforge.jp/projects/efont/ ¤«¤é¥¢¥¯¥»¥¹¤Ç¤­¤Þ¤¹¡£ + + +¥é¥¤¥»¥ó¥¹ + +¥Ð¥¤¥Ê¥ê¤Ï¡¢¥½¡¼¥¹¥³¡¼¥É¤Î¥é¥¤¥»¥ó¥¹¤ÈƱÅù¤È¤·¤Þ¤¹¡£¤¿¤À¤·¡¢¥Õ¥©¥ó¥È¤Î +ʸ½ñ¤Ø¤ÎËä¤á¹þ¤ß¤Ê¤É¡¢¥Õ¥©¥ó¥È¤È¤·¤Æ¤ÎºÆ»ÈÍѤòÌÜŪ¤È¤·¤Ê¤¤ÍÑÅӤˤª¤¤¤Æ¤Ï¡¢ +°Ê²¼¤Ç¸À¤¦ Redistribution ¤Ë¤ÏÅö¤¿¤é¤º¡¢À©¸Â¤Ê¤¯¹Ô¤¨¤ë¤â¤Î¤È¤·¤Þ¤¹¡£ + +Copyright (c) 1990-2003 + Wada Laboratory, the University of Tokyo. All rights reserved. +Copyright (c) 2003-2004 + Electronic Font Open Laboratory (/efont/). All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +3. Neither the name of the Wada Laboratory, the University of Tokyo nor + the names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY WADA LABORATORY, THE UNIVERSITY OF TOKYO AND +CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE LABORATORY OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Ëä¤á¹þ¤Þ¤ì¤¿¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È¤Î¥é¥¤¥»¥ó¥¹¤Ë¤Ä¤¤¤Æ¤Ï¡¢³Æ¥Õ¥©¥ó¥È¤ÎźÉÕ +¥É¥­¥å¥á¥ó¥È¤òƱº­¤·¤Æ¤ª¤ê¤Þ¤¹¤Î¤Ç¡¢¤½¤Á¤é¤ò¤´»²¾È¤¯¤À¤µ¤¤¡£ + +ËÜ¥Õ¥©¥ó¥È¤Ë´Þ¤Þ¤ì¤ëÅìÉ÷¥Õ¥©¥ó¥ÈͳÍè¤Î¥°¥ê¥Õ¤Ï¡¢¸ÅÀîÂÙÇ·¤µ¤ó¤¬Ã±ÆÈ¤ÇºîÀ®¤·¤¿ +¥ª¥ê¥¸¥Ê¥ë¥Ç¥¶¥¤¥ó¤Ë´ð¤Å¤¯ Public Domain ÁêÅö¤Î¥Ç¡¼¥¿¤Î¤ß¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ +ÆüΩÀ½ºî½ê¤È¥¿¥¤¥×¥Ð¥ó¥¯¤Ë¤è¤ê³«È¯¤µ¤ì¤¿ 32 ¥É¥Ã¥È¥Ó¥Ã¥È¥Þ¥Ã¥×¤ËͳÍ褹¤ë +´Á»ú¥Ç¡¼¥¿¡¢¥Ó¥Ã¥È¥Þ¥Ã¥×¥Ç¡¼¥¿¡¢¸½ºß¤Î CLWFK ¤Î ¥é¥¤¥»¥ó¥¹¤È°Û¤Ê¤ë¥é¥¤¥»¥ó¥¹ +¤ÇÇÛÉÛ¤µ¤ì¤Æ¤¤¤¿ÏÂÅĸ¦¥Õ¥©¥ó¥È¤ËͳÍ褹¤ë¥Ç¡¼¥¿¤Ï´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ + + +¥Ó¥ë¥É´Ä¶­ + +FontForge (20040601ÈÇ) ¤Ë¡¢°Ê²¼¤Î¥Ñ¥Ã¥Á¤òÅö¤Æ¤ÆºîÀ®¤·¤Æ¤¤¤Þ¤¹¡£¤³¤ì¤Ï¡¢ +¡¦ÅùÉý¥Õ¥©¥ó¥È¤òɬÍפȤ¹¤ë´Ä¶­¤Ç²£Éý¤¬¤º¤ì¤ë +¡¦Ëä¤á¹þ¤Þ¤ì¤¿¥Ó¥Ã¥È¥Þ¥Ã¥×¤¬Í­¸ú¤Ë¤Ê¤é¤Ê¤¤ +¤È¤¤¤¦ÌäÂêÅÀ¤ò²ò·è¤¹¤ë¤¿¤á¤Î¤â¤Î¤Ç¤¹¡£¥ª¥ê¥¸¥Ê¥ë¤Î FontForge ¤Ë +¼è¤ê¹þ¤ó¤Ç¤â¤é¤¦Í½Äê¤Ç¤¹¡£ + +--- fontforge/tottf.c.orig Mon Jun 7 19:18:27 2004 ++++ fontforge/tottf.c Wed Jun 16 13:37:06 2004 +@@ -3038,6 +3038,8 @@ + int i,j,cnt1,cnt2,first,last,avg1,avg2,k; + SplineFont *sf = _sf; + char *pt; ++ static int const weightFactors[26] = { 64, 14, 27, 35, 100, 20, 14, 42, 63, ++ 3, 6, 35, 20, 56, 56, 17, 4, 49, 56, 71, 31, 10, 18, 3, 18, 2 }; + + os2->version = 1; + os2->weightClass = sf->pfminfo.weight; +@@ -3102,9 +3104,10 @@ + if ( sf->chars[i]->width!=0 ) { + avg2 += sf->chars[i]->width; ++cnt2; + } +- if ( sf->chars[i]->unicodeenc==' ' || +- (sf->chars[i]->unicodeenc>='a' && sf->chars[i]->unicodeenc<='z')) { +- avg1 += sf->chars[i]->width; ++cnt1; ++ if ( sf->chars[i]->unicodeenc==' ') { ++ avg1 += sf->chars[i]->width * 166; ++cnt1; ++ } else if (sf->chars[i]->unicodeenc>='a' && sf->chars[i]->unicodeenc<='z') { ++ avg1 += sf->chars[i]->width * weightFactors[sf->chars[i]->unicodeenc-'a']; ++cnt1; + } + } + } +@@ -3122,9 +3125,9 @@ + while ( ptachVendID ) *pt++ = ' '; /* Pad with spaces not NUL */ + + os2->avgCharWid = 500; +- /*if ( cnt1==27 ) +- os2->avgCharWid = avg1/cnt1; +- else*/ if ( cnt2!=0 ) ++ if ( cnt1==27 ) ++ os2->avgCharWid = avg1/1000; ++ else if ( cnt2!=0 ) + os2->avgCharWid = avg2/cnt2; + memcpy(os2->panose,sf->pfminfo.panose,sizeof(os2->panose)); + if ( format==ff_ttfsym ) { +@@ -3349,11 +3352,34 @@ + putshort(at->os2f,0); + } + +-static void dumpgasp(struct alltabs *at) { ++static void dumpgasp(struct alltabs *at, SplineFont *sf) { ++ BDFFont *bdf; ++ uint32 bitmaps = 0; ++ int i, rangecnt = 1; ++ ++ for ( bdf=sf->bitmaps; bdf!=NULL; bdf=bdf->next) { ++ if ( BDFDepth(bdf)==1 && bdf->pixelsize<=32 ) ++ bitmaps |= 1<<(bdf->pixelsize-1); ++ } ++ for ( i=1; i<32; i++ ) { ++ if ( (bitmaps&(1<gaspf = tmpfile(); + putshort(at->gaspf,0); /* Version number */ +- putshort(at->gaspf,1); /* One range */ ++ putshort(at->gaspf,rangecnt); /* One range */ ++ for ( i=0; i<31; i++ ) { ++ if ( (bitmaps&(1<gaspf, i+1); ++ putshort(at->gaspf, bitmaps&(1<gaspf,32); ++ putshort(at->gaspf,0x0); ++ } + putshort(at->gaspf,0xffff); /* Upper bound on pixels/em for this range */ + putshort(at->gaspf,0x2); /* Grey scale, no gridfitting */ + /* No hints, so no grids to fit */ +@@ -4730,7 +4756,7 @@ + redoos2(at); + if ( format!=ff_otf && format!=ff_otfcid && format!=ff_none ) { + if ( !SFHasInstructions(sf)) +- dumpgasp(at); ++ dumpgasp(at, sf); + at->fpgmf = dumpstoredtable(sf,CHR('f','p','g','m'),&at->fpgmlen); + at->prepf = dumpstoredtable(sf,CHR('p','r','e','p'),&at->preplen); + at->cvtf = dumpstoredtable(sf,CHR('c','v','t',' '),&at->cvtlen); + + + +Êѹ¹ÍúÎò + +2004-06-18 ºÇ½é¤Î¥Ð¡¼¥¸¥ç¥ó¡£ + +2004-06-21 ¥Þ¥¤¥Ê¡¼¤ÊÉÔ¶ñ¹ç¤Î½¤Àµ¡£´Á»ú¤Î¥¢¥¦¥È¥é¥¤¥ó¤ÏÁ´¤¯°ì½ï¡£ + +¡¦½Ä½ñ¤­¤Ë 'vert' ¢ª 'vert' ¥Õ¥£¡¼¥Á¥ã¤ò»ÈÍѤ¹¤ë¤è¤¦¤ËÊѹ¹¡£ +¡¦Oradano ¤ÎÉÔÍפÊʸ»ú¤ò¼è¤ê½ü¤­¡¢¥Ñ¥¹¤ò½ÅÊ£½üµî +¡¦Latin1 ¤Î¥¢¥¯¥»¥ó¥È¤Ä¤­Ê¸»ú¤ò¡¢¹çÀ®¤ÇÀ¸À®¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤ß¤¿ +¡¦ÌÀÄ«¤Î U+FF02 ¤¬¸í¤Ã¤Æ U+FF01 ¤ò½ñ¤­ÄÙ¤·¤Æ¤¤¤¿¤Î¤ò½¤Àµ +¡¦PostScript ̾¤Ë¶õÇò¤¬´Þ¤Þ¤ì¤Æ¤¤¤¿¤Î¤Ç¡¢'-' ¤ËÃÖ´¹¤·¤¿¡£ + +¤³¤ÎÊѹ¹¤Ë¤è¤ê½Ä½ñ¤­¤¬¤Ç¤­¤Ê¤¯¤Ê¤Ã¤Æ¤¤¤¿¤¿¤á¡¢¸ø³«¤òÊÝα¤·¤¿¡£ + +2004-06-29 Á°¤Î¥Ð¡¼¥¸¥ç¥ó¤ÎÉÔ¶ñ¹ç¤Î½¤Àµ¡£ + +¡¦½ÅÊ£½üµî½èÍý¤Ë¤è¤Ã¤Æ¥¢¥¦¥È¥é¥¤¥ó¤¬²õ¤ì¤¿Ê¸»ú¤ò½¤Àµ¡£ +¡¡ÌÀÄ«: 5E43, 72A7, 7FB2, 855A, 9120 + ¥´¥·¥Ã¥¯: 5804, 5DC7, 6969, 7768 (âË), 789E, 8CC7 (»ñ), 8EF1, 9193 + (9090 ¤È 9115 ¤Ï°ÍÁ³²õ¤ì¤¿¤Þ¤Þ¤Ç¤¢¤ë) +¡¦vert °Ê³°¤Î OpenType ¥ì¥¤¥¢¥¦¥È¥¿¥°¤ò GSUB ¥Æ¡¼¥Ö¥ë¤«¤é½üµî¡£ +¡¦Ëä¤á¹þ¤ß¥Ó¥Ã¥È¥Þ¥Ã¥× (ayu ͳÍè) ¤Î³°»ú¥°¥ê¥Õ¤¬Àµ¤·¤¯¥¨¥ó¥³¡¼¥É¤µ¤ì¤Æ¤ª¤é¤º¡¢ +¡¡½Ä½ñ¤­¤Î¾®½ñ¤­¤Î²¾Ì¾¤¬´Ý¿ô»ú¤Ë²½¤±¤Æ¤¤¤¿¤Î¤ò½¤Àµ¡£ +¡¦´Á»ú¤Î²¾ÁÛ¥°¥ê¥Ã¥É¤Î¾åü¤¬¤Î y ºÂɸ¤¬ 1000 ¤Ë¤Ê¤ë¥Ð¥°¤¬¤¢¤Ã¤¿¤Î¤ò½¤Àµ¡£ + ´Á»ú¤Ï 1024 ʬ¤Î 24 ¤À¤±Ä㤫¤Ã¤¿¤³¤È¤Ë¤Ê¤ë¡£ diff --git a/third_party/fonts/other/binfonts/fontsazanamigothic10x19.bin b/third_party/fonts/other/binfonts/fontsazanamigothic10x19.bin new file mode 100644 index 0000000..74a8fb3 Binary files /dev/null and b/third_party/fonts/other/binfonts/fontsazanamigothic10x19.bin differ diff --git a/third_party/fonts/other/binfonts/fontsazanamigothic6x10.bin b/third_party/fonts/other/binfonts/fontsazanamigothic6x10.bin new file mode 100644 index 0000000..f26cc4c Binary files /dev/null and b/third_party/fonts/other/binfonts/fontsazanamigothic6x10.bin differ diff --git a/third_party/fonts/other/binfonts/fontsazanamigothic7x13.bin b/third_party/fonts/other/binfonts/fontsazanamigothic7x13.bin new file mode 100644 index 0000000..e7ec1fd Binary files /dev/null and b/third_party/fonts/other/binfonts/fontsazanamigothic7x13.bin differ diff --git a/third_party/fonts/other/binfonts/fontsazanamigothic8x15.bin b/third_party/fonts/other/binfonts/fontsazanamigothic8x15.bin new file mode 100644 index 0000000..a12e830 Binary files /dev/null and b/third_party/fonts/other/binfonts/fontsazanamigothic8x15.bin differ diff --git a/third_party/fonts/other/binfonts/fontsazanamigothic9x17.bin b/third_party/fonts/other/binfonts/fontsazanamigothic9x17.bin new file mode 100644 index 0000000..b9fc52c Binary files /dev/null and b/third_party/fonts/other/binfonts/fontsazanamigothic9x17.bin differ diff --git a/third_party/fonts/other/binfonts/fontsazanamimincho10x19.bin b/third_party/fonts/other/binfonts/fontsazanamimincho10x19.bin new file mode 100644 index 0000000..e5748c9 Binary files /dev/null and b/third_party/fonts/other/binfonts/fontsazanamimincho10x19.bin differ diff --git a/third_party/fonts/other/binfonts/fontsazanamimincho6x10.bin b/third_party/fonts/other/binfonts/fontsazanamimincho6x10.bin new file mode 100644 index 0000000..fdb8c10 Binary files /dev/null and b/third_party/fonts/other/binfonts/fontsazanamimincho6x10.bin differ diff --git a/third_party/fonts/other/binfonts/fontsazanamimincho7x13.bin b/third_party/fonts/other/binfonts/fontsazanamimincho7x13.bin new file mode 100644 index 0000000..382f450 Binary files /dev/null and b/third_party/fonts/other/binfonts/fontsazanamimincho7x13.bin differ diff --git a/third_party/fonts/other/binfonts/fontsazanamimincho8x15.bin b/third_party/fonts/other/binfonts/fontsazanamimincho8x15.bin new file mode 100644 index 0000000..07ee0a6 Binary files /dev/null and b/third_party/fonts/other/binfonts/fontsazanamimincho8x15.bin differ diff --git a/third_party/fonts/other/binfonts/fontsazanamimincho9x17.bin b/third_party/fonts/other/binfonts/fontsazanamimincho9x17.bin new file mode 100644 index 0000000..87e0025 Binary files /dev/null and b/third_party/fonts/other/binfonts/fontsazanamimincho9x17.bin differ diff --git a/third_party/fonts/other/doc/ayu/README.txt b/third_party/fonts/other/doc/ayu/README.txt new file mode 100644 index 0000000..7a79cdf --- /dev/null +++ b/third_party/fonts/other/doc/ayu/README.txt @@ -0,0 +1,19 @@ + + Ayu ¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È + After X-TT Project + + Ayu ¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È¤Ï¡¢Kappa 20¥É¥Ã¥È¤ò²þÊѤ·¡¢Kochi¥Õ¥©¥ó¥È +¤Î¥µ¥Ö¥»¥Ã¥È¤È¤·¤ÆÀ½ºî¤·¤Æ¤­¤¿¥Õ¥©¥ó¥È¤Ç¤¹¡£¥®¥ê¥·¥ãʸ»ú¡¦¥­¥ê¥ëʸ +»ú¤ò½ü¤¤¤¿Èó´Á»úÉô¤Ï Kochi-subst ¤Î¥¢¥¦¥È¥é¥¤¥ó¤«¤éÀ¸À®¤·¤¿¥Ó¥Ã¥È +¥Þ¥Ã¥×¤ò¡¢¥Õ¥©¥ó¥È¥¨¥Ç¥£¥¿¤Ç¼ê½¤Àµ¤¹¤ëÊýË¡¤òÍѤ¤¤Æ¤¤¤Þ¤¹¡£ + + Ayu 20 ¥É¥Ã¥È¥´¥·¥Ã¥¯¤Ï 2003ǯ5·î¤«¤é6·î¡¢Ayu 18 ¥É¥Ã¥È¥´¥·¥Ã¥¯¤Ï +2003ǯ7·î1Æü¤«¤é2004ǯ2·î10Æü¤Ë¤«¤±¤ÆÀ½ºî¤ò¹Ô¤¤¤Þ¤·¤¿¡£¤½¤Î¸å¤âÄ´À° +¤ò³¤±¤Æ¤¤¤Þ¤¹¡£ + + ¥Ù¡¼¥¹¤È¤·¤Æ»È¤ï¤»¤Æ¤¤¤¿¤À¤¤¤¿ Kappa ¥Õ¥©¥ó¥È¤Îºî¼Ô¤Î¼íÌîÍͤȡ¢ +Kochi-subst Èó´Á»ú¥¢¥¦¥È¥é¥¤¥ó¤Îºî¼Ô¤Î¸ÅÀîÍÍ¡¢¤½¤Î¾¤Î¥½¥Õ¥È¥¦¥§¥¢¤Î +´Ø·¸¼Ô¤ÎÊý¡¹¤Ë´¶¼Õ¤¤¤¿¤·¤Þ¤¹¡£ + + Ayu ¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È¤Ï public domain ¤Ç¤¹¡£¾¦ÍÑ/Èó¾¦ÍÑÍøÍÑ¡¢¤¢ +¤é¤æ¤ë²þÊÑ¡¢Ê£À½¡¢ºÆÇÛÉۤϼ«Í³¤Ç¤¹¡£ diff --git a/third_party/fonts/other/doc/kappa/README b/third_party/fonts/other/doc/kappa/README new file mode 100644 index 0000000..86bb10b --- /dev/null +++ b/third_party/fonts/other/doc/kappa/README @@ -0,0 +1,573 @@ +================= Kappa 20dot Fonts Version 0.396 README ===================== +¡üÌܼ¡ + ¡ü Kappa 20dot Fonts ¤Ë¤Ä¤¤¤Æ ¡ü¥¢¡¼¥«¥¤¥Ö¤ÎÆâÍÆ°ìÍ÷ ¡ü»ÈÍÑÊýË¡ + ¡üÍøÍѤˤĤ¤¤Æ¡¢µöÂú¾ò·ï ¡üÍúÎò ¡üº£¸å¤Î²ÝÂê ¡ü¼Õ¼­ ¡üÏ¢ÍíÀè + +¡ü Kappa 20dot Fonts ¤Ë¤Ä¤¤¤Æ +¡¡¤³¤Î¥¢¡¼¥«¥¤¥Ö¤Ë¤Ï¡¢20¡ß20¥É¥Ã¥È´Á»ú¥Õ¥©¥ó¥È¤ò´Þ¤à¡¢X Window System ÍѤΠ+¥Õ¥©¥ó¥È¤¬¼ý¤á¤é¤ì¤Æ¤¤¤Þ¤¹¡£¤³¤ì¤é¤Î¥Õ¥©¥ó¥È¤Ï¤¹¤Ù¤Æºî¼Ô¤¬ºî¤Ã¤¿¤â¤Î¤Ç¡¢¼« +ͳ¤ËÍøÍÑ¡¦Ê£À½¡¦²þÊѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + +¡¡ËÜ¥Õ¥©¥ó¥È¤ÎÆÃħ¤È¤·¤Æ¡¢°Ê²¼¤Î¤è¤¦¤Ê¤â¤Î¤¬¤¢¤ê¤Þ¤¹¡£ + +¡¦16 ¥É¥Ã¥È¤È 24 ¥É¥Ã¥È¤ÎÃæ´Ö¤Ç¤¢¤ê¡¢¹â²òÁüÅ٤ǤÎɽ¼¨¤Ë¸þ¤¤¤Æ¤¤¤ë + 1600¡ß1200 ¥É¥Ã¥È¤Î²èÌ̤Ǥϡ¢¹Ô´Ö¤ò 4 ¥É¥Ã¥È¶õ¤±¤Æ 50 ¹Ôɽ¼¨¤Ç¤­¡¢ + ²òÁüÅÙ 1024¡ß768 ¤Ç 16 ¥É¥Ã¥È¥Õ¥©¥ó¥È¤ò»È¤Ã¤¿¤È¤­¤È¤Û¤ÜƱ¤¸¤Ç¤¹¡£ + ¤Þ¤¿¡¢¥Î¡¼¥Èµ¡¤Î±Õ¾½¤Ë¿¤¤¡¢800¡ß600 ¤Î²èÌ̤Ǥϡ¢²èÌÌÁ´ÂÎ¤Ç 80 ·å + ¤Î¥Æ¥­¥¹¥È²èÌ̤Ȥ·¤Æ»È¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + +¡¦1990 ǯ¤ËÄɲ䵤줿 2 ʸ»ú¤ò´Þ¤à¡¢JIS X 0208 ¤Î 6912 ʸ»ú¤ò¤¹¤Ù¤Æ´Þ¤à + X ¤Ç¤ÎÆüËܸì¥Õ¥©¥ó¥È¤Ï¿¤¯¤Î¾ì¹ç¡¢`*-JISX0208.1983-0' ¤Î·Á¤Ç»ØÄê + ¤µ¤ì¤ë¤Î¤Ç¡¢fonts.alias ¤ÇÊÌ̾¤òÄêµÁ¤·¡¢83 ǯÈǤ˸«¤»¤«¤±¤Æ¤¤¤Þ¤¹¡£ + 90 ǯÄɲäΠ2 »ú¤òºï½ü¤·¤¿¥Õ¥©¥ó¥È¤¬É¬ÍפÊÊý¤Ï¡¢ÊÌÅÓºîÀ®¤·¤Æ + ¤¯¤À¤µ¤¤¡£ + +¡¦½Ä½ñ¤­¥Õ¥©¥ó¥ÈÍѤòÄ󶡤·¤Æ¤¤¤ë + »ú·Á¤òÊѹ¹¤·¤¿Ê¸»ú¼ï¤Ï¡¢JIS X 0208:1997 ¤Ç½Ä½ñ¤­ÍÑ»ú·Á¤¬»ØÄꤵ¤ì¤Æ + ¤¤¤ë 53 ʸ»ú¤Ë¸Â¤ê¤Þ¤·¤¿¡£¤½¤Î¾¡¢¼ã´³°ÌÃÖ¤òÄ´À°¤·¤¿Ê¸»ú¤â¤¢¤ê¤Þ¤¹¡£ + ½Ä½ñ¤­¥Õ¥©¥ó¥È¤Ï¡¢XLFD ¤Î¡ÆSPACING¡ÇÍó (Âè 11 ÈÖÌÜ) ¤ò¡ÆVC¡Ç¤È¤¤¤¦ + ̾Á°¤ËÃÖ¤­´¹¤¨¤Æ¤¤¤Þ¤¹¡£ + +¡¦´Á»ú¤Ë¤Ä¤¤¤Æ¤Ï¡¢JIS X 0208:1997 ¤Îµ¬³Êɼ¤ËºÜ¤Ã¤Æ¤¤¤ëÂåɽ»ú·Á¤Ë¡¢²Äǽ¤Ê +¡¡¸Â¤êÃé¼Â¤Ê»úÂΤòºÆ¸½¤¹¤ë¤è¤¦¤ËÅØ¤á¤Æ¤¤¤ë + ¤â¤Á¤í¤ó¡¢20¥É¥Ã¥È¤Ç¤¹¤«¤é¡¢Ê¹Ԥ¹¤ë½Ä²£¤Î²èÀþ¤¬Â¿¤¤Ê¸»ú¤Ï¡¢Àþ¤ò + ´Ö°ú¤¤¤¿¤êÊ»¹ç¤·¤¿¤ê¤·¤Æ¤´¤Þ¤«¤·¤Æ¤¤¤Þ¤¹¡£ + ¤Þ¤¿¡¢¸«±É¤¨¤ÎÅԹ礫¤éÉÕ¤­Î¥¤ì¤Ê¤É¤òÊѤ¨¤¿¤È¤³¤í¤â¤¢¤ê¡¢Æ±¤¸Ê¸»ú¤Î + ºÙ»ú¤ÈÂÀ»ú¤È¤ÇÅý°ì¤¬¼è¤ì¤Æ¤¤¤Ê¤¤Ê¸»ú¤â¤¢¤ê¤Þ¤¹¡£ + ¤Þ¤¿¡¢ºî¼Ô¤Î¥ß¥¹¤Ë¤è¤ë¸í»ú¤¬»Ä¤Ã¤Æ¤¤¤ë²ÄǽÀ­¤â¼Î¤Æ¤­¤ì¤Þ¤»¤ó¡£ + 97ǯÈǵ¬³Ê¤Î 6.6.4 ¤Ë µ¬Äꤵ¤ì¤¿ 29 ¤Î¶èÅÀ°ÌÃ֤ˤĤ¤¤Æ¤Ï¡¢¤¹¤Ù¤Æ + (A) ¤Î»úÂΤòºÎÍѤ·¤Æ¤¤¤Þ¤¹¡£ + +¡¦ÂåɽŪ¤Ê²¤Ê¸¥Õ¥©¥ó¥È¤òÍѰդ·¤Æ¤¤¤ë + ISO-8859 ¤Î³Æ¥é¥Æ¥óʸ»ú½¸¹ç (8859-1, 2, 3, 4, 9, 10, 13, 14, 15, 16) + ¤ËÂбþ¤·¤¿¥Õ¥©¥ó¥È¤òÍѰդ·¤Æ¤¤¤Þ¤¹¡£¤Þ¤¿¡¢MuleIPA ¤Î¥Õ¥©¥ó¥È¤òÍѰդ·¡¢ + Mule¾å¤Çưºî¤¹¤ë¼­½ñ¸¡º÷¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç»ÈÍѤǤ­¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡£ + +¡¦¤É¤Îʸ»ú½¸¹ç¤Ë¤Ä¤¤¤Æ¤âºÙ»ú(medium)¤ÈÂÀ»ú(bold)¤ÎξÊý¤Î¥Õ¥©¥ó¥È¤òÄ󶡤·¤Æ¤¤¤ë + ºÙ»ú¤Ï 19¡ß20 ¥É¥Ã¥È¤ÎÏÈÆâ¤Ë¼ý¤Þ¤ë¤è¤¦¤ËÄ´À°¤·¤Æ¤¢¤ê¤Þ¤¹¡£½Ä½ñ¤­ + ÍѤ˾岼Êý¸þ¤Ë·ä´Ö¤Î¶õ¤¤¤¿¥Õ¥©¥ó¥È¤òºî¤ëͽÄê¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + +¡¦public domain ¤Ç¤¢¤ë + ¾¦¶ÈÅªÍøÍѤò´Þ¤á¡¢¼«Í³¤ËÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¶Ø»ß¤µ¤ì¤Æ¤¤¤ë¤Î¤Ï¡¢ + ¤³¤Î¥Õ¥©¥ó¥È¤Î°ì²þÊÑÈǤËÃøºî¸¢¤ò¼çÄ¥¤·¤¿¤³¤È¤òº¬µò¤È¤·¤Æ¡¢¸¶ºî¼Ô¤ä + Âè»°¼Ô¤¬¤³¤Î¥Õ¥©¥ó¥È¤òÍøÍѤ¹¤ë¸¢Íø¤ò˸¤²¤ë¤³¤È¡¢ºî¼Ô¤Ë´Ø¤¹¤ë¾ðÊó¤Ë + ¤Ä¤¤¤Æµõµ¶¤Î¼çÄ¥¤ò¹Ô¤Ê¤¦¤³¤È¤Î¤ß¤Ç¤¹¡£¾Ü¤·¤¯¤Ï¡¢¡ÖÍøÍѤˤĤ¤¤Æ¡¢ + µöÂú¾ò·ï¡×¤ÎÀá¤ò»²¾È¤·¤Æ²¼¤µ¤¤¡£ + +ËܥС¼¥¸¥ç¥ó¤Ï¡¢¥Õ¥©¥ó¥È¥»¥Ã¥È¤Ë´Þ¤Þ¤ì¤ë 14674 ¼ïÎà (Ʊ»úƱ¤¸¥Ç¥¶¥¤¥ó¤Î +½ÅÊ£¤ò½ü¤¯¡£¤Þ¤¿¡¢»²¹Í¤È¤·¤Æ´Þ¤á¤¿ JIS X 0213 ¤ÎÈó´Á»ú 659 ʸ»ú¤Ï´Þ¤Þ¤Ê¤¤)¡¢ +±ä¤Ù»ú¿ô 29482 ʸ»ú¤ÎÁ´¤Æ¤Î»ú·Á¤òºî¼Ô¤¬¼ê¤Ç¥Ç¥¶¥¤¥ó¤·¤¿½é¤Î¸ø³«¥Ð¡¼¥¸¥ç¥ó +¤Ç¤¹¡£º£¤Þ¤Ç¤Î¡¢¼«Æ°ÊÑ´¹¤Ë¤è¤ëËܳÊŪ¤Ê»ÈÍѤ˴®¤¨¤Ê¤¤²¾¤Î»ú·Á¤ò´Þ¤ó¤Ç¤¤¤¿ +¥Ð¡¼¥¸¥ç¥ó¤È°Û¤Ê¤ê¡¢°ì±þ¤Î´°À®ÉʤȤ·¤Æ¤ÎÉʼÁ¤Ë㤷¤Æ¤¤¤ë¤È¸À¤¨¤ë¤Ç¤·¤ç¤¦¡£ +¤Þ¤¿¡¢ÂÀ»ú¤ÈºÙ»ú¤ÎξÊý¤ÎÆüËܸì¥Õ¥©¥ó¥È¤¬´°À®¤·¤¿¤³¤È¤Ë¤è¤ê¡¢Ì¾¾Î¤ò `Kappa +20dot Font' ¤«¤é¡¢Ê£¿ô·Á¤Î `Kappa 20dot Fonts' ¤ËÊѹ¹¤·¤Þ¤·¤¿¡£ + +¡ü¥¢¡¼¥«¥¤¥Ö¤ÎÆâÍÆ°ìÍ÷ + README ¤³¤Î¥Õ¥¡¥¤¥ë + + Makefile ¥¤¥ó¥¹¥È¡¼¥ëÍÑ Makefile + + 10x20rkm.bdf JIS X 0201 ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë (ºÙ»ú) + 10x20rkb.bdf JIS X 0201 ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë (ÂÀ»ú) + k20m.bdf JIS X 0208 ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë (ºÙ»ú) + k20b.bdf JIS X 0208 ¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë (ÂÀ»ú) + + tategaki.diff k20b.bdf, k20m.bdf ¤Î½Ä½ñ¤­ÍÑ¥Õ¥©¥ó¥È¤Î diff + vk20b.bdf, vk20m.bdf ¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + + ipa-10x20m.bdf MuleIPA (ºÙ»ú)¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë + ipa-10x20b.bdf MuleIPA (ÂÀ»ú)¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë + + iso8859/ ISO8859-1(Latin1) ¡Á ISO8859-16 (Latin10) ¤Þ¤Ç¤Î + ¥½¡¼¥¹ (±¦È¾Ì̤Ïʸ»ú̾¤Ë½¾¤Ã¤Æ 1 ʸ»úñ°Ì¤Ëʬ³ä) + makebdf.sh ISO 8859 ¤Î¥Õ¥©¥ó¥È¤òºîÀ®¤¹¤ë¥·¥§¥ë¥¹¥¯¥ê¥×¥È + 10x20{,L{2,3,4,5,6,7,8,9,10}}{m,b}.bdf ¤Î + 20 ¸Ä¤Î¥Õ¥¡¥¤¥ë¤òºîÀ®¤·¤Þ¤¹¡£ + splitbdf.csh ¼«Æ°ºîÀ®¤µ¤ì¤¿¥Õ¥©¥ó¥È¤ò 1 ʸ»úñ°Ì¤Ëʬ²ò¤·¡¢ + ¥«¥ì¥ó¥È¥Ç¥£¥ì¥¯¥È¥ê¤Ë½ñ¤­½Ð¤¹ C ¥·¥§¥ë¥¹¥¯¥ê¥×¥È + + (»²¹Í) + newjis.diff k20b.bdf ¤Ë JIS X 0213 ¤Îʸ»ú¤òÄɲ乤뺹ʬ + ¥Ñ¥Ã¥Á¤òÅö¤Æ¤ë¤È nk20b-1.bdf ¤¬À¸À®¤µ¤ì¤Þ¤¹¡£ + +¡ü»ÈÍÑÊýË¡ +¡û Makefile ¤ÎÊÑ¿ôÀßÄê +Makefile ¤ÎÀèÆ¬¤Ë¡¢³Æ¼ïÊÑ¿ô¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ë´Ä¶­¤ÎÀßÄê¤Ë +¹ç¤ï¤»¤Æ½ñ¤­´¹¤¨¤Æ²¼¤µ¤¤¡£ + +1. TARGETDIR ¤ò¥¤¥ó¥¹¥È¡¼¥ëÀè¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë½ñ¤­´¹¤¨¤Æ²¼¤µ¤¤¡£ + +2. ɬÍפʤé¤Ð¡¢PATCH ÊÑ¿ô¤Ë¡¢patch ¥×¥í¥°¥é¥à¤Î¥Ñ¥¹Ì¾¤È¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ + ²¼¤µ¤¤¡£ + +3. X ¥µ¡¼¥Ð¤¬Âбþ¤¹¤ë¥Õ¥©¥ó¥È¤Î°µ½Ì¤Ë±þ¤¸¤Æ¡¢COMPRESSCMD, COMPRESSEXT ¤ò + Áª¤ó¤Ç²¼¤µ¤¤¡£ + +COMPRESSCMD ¤Ï°µ½Ì¥×¥í¥°¥é¥à¤Î̾Á°¡¢COMPRESSEXT ¤Ï°µ½Ì¥×¥í¥°¥é¥à¤¬»ÈÍѤ¹¤ë +¥Õ¥¡¥¤¥ë̾¤Î³ÈÄ¥»Ò¤Ç¤¹¡£ + +X11R5 °ÊÁ°¤Ç¤Ï¡¢X ¥µ¡¼¥Ð¤¬¥Õ¥©¥ó¥È¤Î°µ½Ì¤ËÂбþ¤·¤Æ¤¤¤Þ¤»¤ó¤Î¤Ç¡¢ + +##COMPRESSCMD = cat +##COMPRESSEXT = + +¤È¤¢¤ë 2 ¹Ô¤Î¥³¥á¥ó¥È¤ò³°¤·¡¢¸½ºßÍ­¸ú¤Ë¤Ê¤Ã¤Æ¤¤¤ë 2 ¹Ô¤ÎÀèÆ¬¤Ë # ¤ò +¤Ä¤±¤Æ¥³¥á¥ó¥È¥¢¥¦¥È¤·¤Æ²¼¤µ¤¤¡£¤Þ¤¿¡¢¥Õ¥©¥ó¥È¤Î¹â®¤Ê¥í¡¼¥Ç¥£¥ó¥°¤ò²Äǽ¤Ë +¤¹¤ë¤¿¤á¤Ë¥Õ¥©¥ó¥È¤Î°µ½Ì¤ò¹Ô¤Ê¤ï¤º¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤¹¤ë¾ì¹ç¤â¡¢¤³¤ÎÀßÄê¤ò»ÈÍÑ +¤·¤Æ²¼¤µ¤¤¡£ + +X11R6.3 °ÊÁ°¤Ç¤Ï¡¢compress ¤Ç¤Î°µ½Ì¤Ë¤Î¤ßÂбþ¤·¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢ + +#COMPRESSCMD = compress +#COMPRESSEXT = .Z + +¤È¤¤¤¦¹Ô¤ò¥¢¥ó¥³¥á¥ó¥È¤·¤Æ¡¢¸½ºß¤Î¹Ô¤ò¥³¥á¥ó¥È¥¢¥¦¥È¤·¤Æ²¼¤µ¤¤¡£ +TARGETDIR ¤â¡¢¥·¥¹¥Æ¥à¤ÎÀßÄê¤Ë¹ç¤ï¤»¤ÆÅ¬µ¹½ñ¤­Ä¾¤·¤Æ²¼¤µ¤¤¡£ + +¡û make ¤¹¤ë + +% make + +ɸ½à¤Ç¤Ï¡¢»îºîÈÇ JIS X 0213 Âè 1 Ì̤Υե©¥ó¥È¤Ï¥¤¥ó¥¹¥È¡¼¥ë¤·¤Þ¤»¤ó¡£ + +% make all + +¤Ç»îºîÈÇ JIS X 0213 Âè 1 Ì̤Υե¡¥¤¥ë¤ò´Þ¤àÁ´¤Æ¤Î¥Õ¥©¥ó¥È¤ò¥¤¥ó¥¹¥È¡¼¥ë +¤·¤Þ¤¹¤¬¡¢¤Û¤È¤ó¤É¤ÎÂè 3 ¿å½à´Á»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤Ë¤´Ãí°Õ²¼¤µ¤¤¡£ +¤Þ¤¿¡¢Èó´Á»úÉôʬ¤Ë¤Ä¤¤¤Æ¤â´°Á´¤Ê¥Á¥§¥Ã¥¯¤Ï¤Þ¤ÀºÑ¤ó¤Ç¤¤¤Þ¤»¤ó¡£¸í»ú¡¦Ã¦»ú¡¦ +Þ§»ú¡¦Ì̶èÅÀ°ÌÃ֤θí¤ê¤¬¤¢¤ê¤Þ¤·¤¿¤é¤ªÃΤ餻²¼¤µ¤¤¡£ + +¡û¥¤¥ó¥¹¥È¡¼¥ë +¡¦É¸½à¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤·¤Æ»È¤¦¾ì¹ç + +# make install + +¤Ç¡¢¥Õ¥©¥ó¥È¤¬¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Þ¤¹ (`#' ¤Ï¡¢root ¤Î¥×¥í¥ó¥×¥È¤òɽ¤·¤Þ¤¹¡£ +¤¢¤Ê¤¿¤¬ÍøÍѤ·¤¿¤¤¥Þ¥·¥ó¾å¤Ë¤ª¤±¤ë root ¸¢¸Â¤ò»ý¤Ã¤Æ¤¤¤Ê¤¤¤Î¤Ç¤¢¤ì¤Ð¡¢²¼¤Î +¡Ö¼«Ê¬¤À¤±¤Ç»È¤¦¾ì¹ç¡×¤Î¼ê½ç¤Ë½¾¤Ã¤Æ¤¯¤À¤µ¤¤¡£¥×¥í¥ó¥×¥È¤¬ `%' ¤Ë¤Ê¤Ã¤Æ¤¤ +¤ë¼ê½ç¤Ï¡¢root ¤Ë¤Ê¤é¤º¤Ë¼Â¹Ô¤Ç¤­¤Þ¤¹)¡£ + +% xset fp rehash + +¤È¤¹¤ì¤Ð¡¢¥¤¥ó¥¹¥È¡¼¥ë¤·¤¿¥Õ¥©¥ó¥È¤¬¤¹¤°¤Ë»È¤¨¤Þ¤¹¡£(¤¿¤À¤·¡¢Makefile Ãæ¤Î +TARGETDIR ¤Ç»ØÄꤵ¤ì¤Æ¤¤¤ë¥Ç¥£¥ì¥¯¥È¥ê¤¬¥Õ¥©¥ó¥È¥Ñ¥¹¤Ë¤¹¤Ç¤ËÆþ¤Ã¤Æ¤¤¤ë +¤³¤È¤¬É¬ÍפǤ¹)¡£ + +% xfd -fn k20b + +¤È¤·¤Æ¡¢¥Õ¥©¥ó¥È¤¬¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«»î¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£ +¥¨¥¤¥ê¥¢¥¹¤È¤·¤ÆÅÐÏ¿¤µ¤ì¤ë¥Õ¥©¥ó¥È̾¤Îû½Ì̾¾Î¤Ï¡¢¥Õ¥©¥ó¥È¥Õ¥¡¥¤¥ë̾¤«¤é +³ÈÄ¥»Ò¤ò¼è¤êµî¤Ã¤¿Éôʬ¤Ç¤¹¡£¤Þ¤¿¡¢a20m, a20b, r20m, r20b ¤È¤¤¤¦Ì¾Á°¤¬ +¤½¤ì¤¾¤ì ISO 8859-1 ¤È JIS X 0201 ¤ÎºÙ»ú¤ÈÂÀ»ú¤ÎÊÌ̾¤È¤·¤ÆÅÐÏ¿¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + +¡¦¼«Ê¬¤À¤±¤Ç»È¤¦¾ì¹ç + +ɬÍפʥե¡¥¤¥ë¤Ï pcf/ ¤È¤¤¤¦¥Ç¥£¥ì¥¯¥È¥ê¤ËÃÖ¤«¤ì¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢ +¤³¤Î¥Ç¥£¥ì¥¯¥È¥ê¤òɬÍפʾì½ê¤Ë°Ü¤·¤¿¤¦¤¨¤Ç¡¢.xinitrc (xinit, startx¤Ç +X ¤òµ¯Æ°¤·¤Æ¤¤¤ë¾ì¹ç) ¤« .xsession (xdm ¤ò»È¤Ã¤Æ¤¤¤ë¾ì¹ç)¤Ë¡¢ + +xset fp+ ¡Ú¥Ç¥£¥ì¥¯¥È¥ê¤Î¥Õ¥ë¥Ñ¥¹Ì¾¡Û + +¤È¤¤¤¦µ­½Ò¤Î¹Ô¤ò²Ã¤¨¤Þ¤¹¡£¤³¤ì¤Ç¡¢¥Õ¥©¥ó¥È¤¬»È¤¨¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ +¤¹¤°¤Ë»È¤¤¤¿¤¤¾ì¹ç¤Ï¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤éÂǤÁ¹þ¤ó¤Ç²¼¤µ¤¤¡£ + +¡û¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÀßÄê +¢¨ ¤³¤Î¥»¥¯¥·¥ç¥ó¤Ï¡¢Ãø¤·¤¯»þÂåÃÙ¤ì¤Ç¤¹¡£ + +¡¦kterm +~/.Xresources (X11R5 ¤Ç¤Ï ~/.Xdefaults)¤Ë¡¢ + +KTerm*VT100*fontList: -kappa-fixed-medium-r-normal--20-* +KTerm*VT100*boldFontList: -kappa-fixed-bold-r-normal--20-* + +¤È¤¹¤ì¤Ð¡¢¥Ç¥Õ¥©¥ë¥È¤Î¥Õ¥©¥ó¥È¤¬ Kappa20 ¤Ë¤Ê¤ê¤Þ¤¹¡£Ctrl¡Ü±¦¥Ü¥¿¥ó¤Ç +½Ð¤Æ¤¯¤ë¥á¥Ë¥å¡¼¤ËÅÐÏ¿¤·¤¿¤±¤ì¤Ð¡¢KTerm*VT100*fontList#: (# ¤Ï¡¢1 ¤«¤é 6 +¤Î¤¤¤º¤ì¤«¤Î¿ô»ú)¤È¡¢KTerm*VT100*boldFontList#: ¤ËÀßÄꤷ¤Æ²¼¤µ¤¤¡£ + +É®¼Ô¤¬»ÈÍѤ·¤Æ¤¤¤ë .Xresources ¤Î¤«¤é¤ÎÈ´¿è¤ò»²¹Í¤Þ¤Ç¤Ë¼¨¤·¤Þ¤¹¡£ + (10 ¥É¥Ã¥È¤Ë¤Ï¡Ö¥Ê¥¬10¡×¤ò¡¢12¥É¥Ã¥È¤Ë¤Ï¡ÖÍ×Ä®¡×¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹) + +KTerm*fontMenu*font1*Label: 10dot +KTerm*VT100*fontList1: -misc-fixed-medium-r-normal--10-90-75-75-c-*-* +KTerm*VT100*boldFontList1: -misc-fixed-bold-r-normal--10-90-75-75-c-*-* +KTerm*fontMenu*font2*Label: 12dot +KTerm*VT100*fontList2: -mnkaname-*-medium-r-normal--12-* +KTerm*fontMenu*font3*Label: 14dot +KTerm*VT100*fontList3: -*-fixed-medium-r-normal--14-* +KTerm*fontMenu*font4*Label: 16dot +KTerm*VT100*fontList4: -misc-fixed-medium-r-normal--16-* +KTerm*fontMenu*font5*Label: 20dot +KTerm*VT100*fontList5: -kappa-fixed-medium-r-normal--20-* +KTerm*VT100*boldFontList5: -kappa-fixed-bold-r-normal--20-* +KTerm*fontMenu*font6*Label: 24dot +KTerm*VT100*fontList6: -*-fixed-medium-r-normal--24-* + +¤Þ¤¿¡¢ +KTerm*VT100*lineSpace: 3 +¤òÄɲä·¡¢¹Ô´Ö¤Ë 3 ¥É¥Ã¥È¤Û¤É¤Î·ä´Ö¤ò¶õ¤±¤ë¤ÈÆÉ¤ß¤ä¤¹¤¯¤Ê¤ê¤Þ¤¹¡£ + +¥³¥Þ¥ó¥É¥é¥¤¥ó¤ÇÁ´¤Æ»ØÄꤹ¤ë¾ì¹ç¡¢ + +% kterm -fl -kappa-fixed-medium-r-normal--20-\* -flb -kappa-fixed-bold-r-normal--20-\* -lsp 3 +% kterm -fn a20m -fb a20b -fr r20m -frb r20b -fk k20m -fkb k20b -lsp 3 + +¤Î¤É¤Á¤é¤«¤Ë¤Ê¤ê¤Þ¤¹¡£ + +½Ä½ñ¤­¥Õ¥©¥ó¥È¤Ï¡¢¹Ô´Ö¤Ë 1 ¥É¥Ã¥È·ä´Ö¤ò¶õ¤±¤¿»þ¤Ë¥Ù¥¿ÁȤ˸«¤¨¤ë¤è¤¦¤Ë +Ä´À°¤·¤Æ¤¢¤ê¤Þ¤¹¡£ + +¡¦Mule +»ä¤Ï¡¢~/.Xresources ¤Ë°Ê²¼¤ÎÀßÄê¤ò½ñ¤¤¤Æ¤¤¤Þ¤¹¡£ºÙ»ú¤ÈÂÀ»ú¤Î¶èÊ̤¬¤Ä¤­¡¢ +bold¤Î¤È¤­ÂÀ»ú¤ò½Ð¤¹ÀßÄê¤Î»ÅÊý¤¬Ê¬¤«¤é¤Ê¤¤¤Î¤Ç¡¢¤³¤³¤Ç¤Ï¾Ò²ð¤Ç¤­¤Þ¤»¤ó¡£ + +Emacs*FontSetList: 20,8,10,12,14,16,20,24,40 + (ÃæÎ¬) +Emacs*FontSet-20:\ + -kappa-fixed-bold-r-*--20-*-iso8859-1,\ + -kappa-fixed-bold-r-*--20-*-jisx0201.1976-0,\ + -kappa-fixed-bold-r-*--20-*-jisx0208.1990-0 + (¸åά) +¤Î¤è¤¦¤Ë½ñ¤¤¤Æ¤¤¤Þ¤¹¡£ + +¡¦Emacs (¥Ð¡¼¥¸¥ç¥ó 20) + +~/.Xresources ¤Ë¡¢ + Emacs*Fontset-0: -*-fixed-medium-r-normal--14-*-*-*-*-*-fontset-small + Emacs*Fontset-1: -*-fixed-medium-r-normal--16-*-*-*-*-*-fontset-medium + Emacs*Fontset-2: -*-fixed-medium-r-normal--24-*-*-*-*-*-fontset-large + Emacs*Fontset-3: -kappa-fixed-medium-r-normal--20-*-*-*-*-*-fontset-kappa + +¡¦XEmacs + +¡¦Netscape +Foundry¤ò1¸Ä¤·¤«°·¤¨¤Ê¤¤¤Î¤Ç¡¢Ä̾ï¤Ï¡È-misc-*¡É¤ËÊÌ̾ÄêµÁ¤·¤Æ¤ä¤ë¤Î¤Ç¤¹¤¬¡¢ +X ¤Î ɸ½à¥Õ¥©¥ó¥È¤Î misc/ ¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤µ¤ì¤Æ¤¤¤ë 10x20 ¤¬¡¢ +-misc-fixed-medium-normal--20-200-75-75-C-100-iso8859-1 ¤È¤¤¤¦Ì¾Á°¤Ç¡¢ +10x20m.bdf ¤ÈÈï¤Ã¤Æ¤·¤Þ¤¦¤Î¤Ç¡¢¤½¤Î¾¤Î¥Õ¥©¥ó¥È¤Ë¡È-kappa-*¡É¤Î·Á¤ÎÊÌ̾¤ò +¤Ä¤±¤Æ¤·¤Þ¤Ã¤¿Êý¤¬³Ú¤Ç¤¹¡£ + +X11 ¤Ëɸ½àźÉÕ¤µ¤ì¤Æ¤¤¤ë 10x20 ¤Ï¡¢descent (¥Ù¡¼¥¹¥é¥¤¥ó°Ê²¼¤Î¥É¥Ã¥È¿ô) ¤¬ +5 ¥É¥Ã¥È¤¢¤ë¤Î¤Ç¡¢Kappa20 ¤È¤ÏÊ»ÍѤǤ­¤Þ¤»¤ó¡£ Kappa20 ¤ÈƱ»þ¤Ë kterm ¤Ç»È +ÍѤ¹¤ë¤È¡¢descent ¤¬ 3 ¥É¥Ã¥È¤·¤«¤Ê¤¤ Kappa20 ¤È¾å²¼¤Ë 2 ¥É¥Ã¥È¤º¤ì¤ÆÉ½¼¨ +¤µ¤ì¡¢²èÌ̤˥´¥ß¤ò»Ä¤·¤Þ¤¹¡£X 0208¤Î±Ñ¿ô»ú¤Ï¥Ù¡¼¥¹¥é¥¤¥ó¤¬²¼¤«¤é 2 ¥É¥Ã¥È¤Î +¤È¤³¤í¤ËÀ߷פµ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢¥Ç¡¼¥¿¤È¤·¤Æ¤Ï 1 ¥Ð¥¤¥È¥Õ¥©¥ó¥È¤Ë¹ç¤ï¤»¤Æ 3 ¥É¥Ã +¥È¤Î¤È¤³¤í¤Ë¥Ù¡¼¥¹¥é¥¤¥ó¤òÃÖ¤¤¤Æ¤¢¤ê¤Þ¤¹¡£ + +¡üÍøÍѤˤĤ¤¤Æ¡¢µöÂú¾ò·ï + Í׻ݡ§public domain ¤Ç¡¢ÌµÊݾڤÊʪ¤È¤·¤Æ°·¤Ã¤Æ²¼¤µ¤¤¡£ +(°Ê²¼¤ÏƱ¤¸ÆâÍÆ¤ò¾Ü¤·¤¯½Ò¤Ù¤¿¤À¤±¤Ç¤¹¡£»äŪ¤Ë»ÈÍѤ¹¤ë¤À¤±¡¢Êѹ¹¤ò²Ã¤¨¤º +ºÆÇÛÉÛ¤¹¤ë¤À¤±¤Ê¤é¡¢¤³¤ÎÍ׻ݤòÍý²ò¤¹¤ì¤Ð¡¢¸å¤ÎÉôʬ¤ÏÆÉ¤àɬÍפϤ¢¤ê¤Þ¤»¤ó) + +¡ûKappa 20dot Fonts Version 0.395 ¤ÎÍøÍѵöÂú¾ò·ï +°Ê²¼¤ÎµöÂú¾ò·ï¤ËƱ°Õ¤Ç¤­¤Ê¤¤¾ì¹ç¤Ï¡¢Â®¤ä¤«¤ËËÜ¥½¥Õ¥È¥¦¥§¥¢¤òÇÑ´þ¤·¤Æ²¼¤µ¤¤¡£ + + Kappa 20dot Fonts ¤Ï¡Èpublic domain¡É¤Ç¤¢¤ë¤³¤È¤òɸÜÖ¤·¤Æ¤¤¤Þ¤¹¤¬¡¢ + ¼ÂºÝ¤Ë¤ÏËܵöÂú¾ò·ï¤òȼ¤Ã¤ÆÇÛÉÛ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤·¤«¤·¡¢¤³¤ÎµöÂú¾ò·ï + ¤Ë¤è¤Ã¤ÆÀ©¸Â¤µ¤ì¤ë¤Î¤Ï¡¢ËÜ¥½¥Õ¥È¥¦¥§¥¢¤Î public domain ¤È¤·¤Æ¤Î + ¸³¤ò˸¤²¤ë¹Ô°Ù¤À¤±¤Ç¤¹¤«¤é¡¢¡Èpublic domain¡É¤È¤¤¤¦·ÁÍÆ¤òÍѤ¤¤ë + ¤³¤È¤ËÌäÂê¤Ï¤Ê¤¤¤È¹Í¤¨¤Æ¤¤¤Þ¤¹¡£ + +1. ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ÎÃøºî¼Ô¤Ï¡¢Ãøºî¼Ô¤Ç¤¢¤ë¤³¤È¤ËͳÍ褹¤ëÆÈÀêŪ¸¢Íø¤ò + ¼çÄ¥¤·¤Þ¤»¤ó¡£Ã¯¤Ç¤â¡¢ËÜ¥½¥Õ¥È¥¦¥§¥¢¤òÍøÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + ÍøÍѤˤϡ¢Ãøºî¼Ô¤ª¤è¤ÓºÆÇÛÉۼԤˤè¤ë¸ÄÊ̤εöÂú¤òɬÍפȤ·¤Þ¤»¤ó¡£ + + ¡ÖËÜ¥½¥Õ¥È¥¦¥§¥¢¡×¤È¤Ï¡¢Á°µ­¡Ö¥¢¡¼¥«¥¤¥Ö¤ÎÆâÍÆ°ìÍ÷¡×¤Ëµ­¤·¤¿ + ¥Õ¥¡¥¤¥ë¤Î¤¦¤Á¡¢ËÜʸ½ñ (README ¥Õ¥¡¥¤¥ë) ¤ò½ü¤¯¤¹¤Ù¤Æ¤òÁíÂÎ¤È + ¤·¤Æ»Ø¤¹¤â¤Î¤Ç¤¹¡£ËÜ¥½¥Õ¥È¥¦¥§¥¢¤Ï¡¢ËÜÉí°ʸ½ñ¤È¤È¤â¤Ë¡¢1 ¸Ä¤Î + .tar.bz2 ·Á¼°¤Î¥Õ¥¡¥¤¥ë¤È¤·¤Æ¡¢ÉÔ²Äʬ¤Î·Á¤ÇÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£ + + ËÜʸ½ñ¤½¤Î¤â¤Î¤Ï¡¢¡ÖËÜ¥½¥Õ¥È¥¦¥§¥¢¡×¤Ë´Þ¤Þ¤ì¤Þ¤»¤ó¡£ + ÆâÍÆ¤ÎÊѹ¹¡¦ºï½ü¤ò¹Ô¤ï¤Ê¤¤¾ì¹ç¤Ë¸Â¤ê¡¢ËÜ¥Õ¥¡¥¤¥ë¤òºÆÇÛÉÛ¤¹¤ë + ¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£»²¾È¤ÎÍѤΤ¿¤á¤ËËÜʸ½ñ¤ÎÁ´Ê¸¤òʬ³ä¤»¤º¤Ë + ¾¤Îʸ½ñ¤ÎÃæ¤Ë¼è¤ê¹þ¤ß¡¢Å¾ºÜ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î¾ì¹ç¤Ï + žºÜÉôʬ¤È¤½¤ì°Ê³°¤ÎÉôʬ¤¬ÌÀÎÆ¤Ë¼±Ê̤Ǥ­¤ë¤è¤¦¤Ë¤·¤Ê¤±¤ì¤Ð + ¤Ê¤ê¤Þ¤»¤ó¡£ + + ¡ÖÍøÍѡפȤϡ¢ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ÎÆþ¼ê¡¦»ÈÍÑ (¥É¥Ã¥È¥Ñ¥¿¡¼¥ó¤Î + ¶õ´ÖŪÇÛÃÖ·ÁÂ֤κƸ½)¡¦²þÊÑ¡¦ºÆÇÛÉÛ¡¦²þÊÑÇÉÀ¸Êª¤ÎÇÛÉÛ¤ò´Þ¤à¡¢ + ËÜ¥½¥Õ¥È¥¦¥§¥¢¤òÍѤ¤¤Æ¹Ô¤¦¤³¤È¤Î¤Ç¤­¤ëÁ´¤Æ¤Î¹Ô°Ù¤ò»Ø¤·¤Þ¤¹¡£ + +2. ï¤Ç¤â¡¢ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ÎÇÉÀ¸Êª¤ËÆÈ¼«¤ÎÃøºî¸¢É¸¼¨¤òÉÕ¤±²Ã¤¨¡¢Ç¤°Õ¤Î + »ÈÍѵöÂú¤Î²¼¤ÇÇÛÉÛ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + ¤¿¤À¤·¡¢Ëܾò¹à¤Î³Æ¹à¤ËÈ¿¤¹¤ë¤è¤¦¤Ê·Á¤Ç¡¢ÇÓ¾Ū¸¢Íø¤ò¼çÄ¥¤¹¤ë¤³¤È¤Ï + ¤Ç¤­¤Þ¤»¤ó(ÆÃ¤Ë¼¡¹à¤Ë¤´Ãí°Õ²¼¤µ¤¤)¡£ + + ¡ÖËÜ¥½¥Õ¥È¥¦¥§¥¢¤ÎÇÉÀ¸Êª¡×¤È¤Ï¡¢ + ¡¦°ìÉô¤Þ¤¿¤ÏÁ´Éô¤Î»ú·Á¤¢¤ë¤¤¤ÏÉղþðÊó¤òÊѹ¹¤·¤¿¥Õ¥©¥ó¥È + ¡¦¥Õ¥©¥ó¥È¥Õ¥©¡¼¥Þ¥Ã¥È¤ÎÊÑ´¹¤ò¹Ô¤Ã¤¿Êª + ¡¦¥¢¡¼¥«¥¤¥Ö·Á¼°¤ÎÊѹ¹¤ä¡¢³Æ¥Õ¥¡¥¤¥ë¤ÎñÆÈʬΥ¤ò¹Ô¤Ê¤Ã¤¿Êª + ¡¦ËÜ¥½¥Õ¥È¥¦¥§¥¢Æâ¤Î¥Õ¥©¥ó¥È¤òÍøÍѤ·¤ÆÉ½¼¨¤ò¹Ô¤¦¥Ï¡¼¥É¥¦¥§¥¢ + ¡¦¥Õ¥©¥ó¥È¤ò»ÈÍѤ·¤ÆÉ½¼¨¤·¤¿²èÌ̤Υ­¥ã¥×¥Á¥ã¡¼²èÁü + ¡¦ËÜ¥½¥Õ¥È¥¦¥§¥¢¤Î¥Õ¥©¥ó¥È¤«¤éÉôʬ»ú·Á¤ò¼è¤ê½Ð¤·¡¢ÁȤßÂØ¤¨¤Ê¤É + ¤Î½¤Àµ¤ò»Ü¤·¤Æºî¤Ã¤¿¡¢Ê̤Îʸ»ú½¸¹ç¤Î¥Õ¥©¥ó¥È + ¤Ê¤É¤ÎÁ´¤Æ¤ò´Þ¤ß¤Þ¤¹¡£BDF ¥Õ¥¡¥¤¥ëÆâ¤ËÃøºî¸¢É¸¼¨¤ò²Ã¤¨¤¿¾ì¹ç¡¢ + ¤½¤ì¤ÏÉղþðÊó¤òÉÕ¤±²Ã¤¨¤¿¤â¤Î¤È¤Ê¤ê¤Þ¤¹¡£¤¹¤Ê¤ï¤Á¡¢»ú·Á¤ä + ¥Õ¥©¥ó¥È¥á¥È¥ê¥Ã¥¯¤Ê¤É¤Î¡¢É½¼¨¤Ë´óÍ¿¤¹¤ë¾ðÊó¤ò°ìÀÚ²þÊѤ»¤º¤Ë + Ãøºî¸¢É¸¼¨¤Î¤ß¤òÉÕ¤±²Ã¤¨¤¿¤â¤Î¤â¡¢ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ÎÇÉÀ¸Êª¤Ç¤¢¤ê¡¢ + ËÜ¥½¥Õ¥È¥¦¥§¥¢¤È¤ÏÊ̤Îʪ¤Ç¤¢¤ë¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£ + +3. ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ÎÇÉÀ¸Êª¤ËÂФ¹¤ë¸¢Íø¤ò¼çÄ¥¤¹¤ë¼Ô¤Ï¡¢¼«Ê¬¤¬¼ê¤ò²Ã¤¨¤¿ + ²þÊÑÇÉÀ¸Êª¤ª¤è¤Ó¤½¤ÎÉû¼¡ÇÉÀ¸Êª¤Ë¤Î¤ß¸¢Íø¤ò¼çÄ¥¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + ¾¿Í¤¬¡¢ËÜ¥½¥Õ¥È¥¦¥§¥¢¤Ê¤é¤Ó¤Ë¡¢¾åµ­¤Î²þÊÑÇÉÀ¸Êª¤ª¤è¤Ó¤½¤ÎÉû¼¡ÇÉÀ¸Êª + ¤ò½ü¤¯ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ÎÇÉÀ¸Êª¤òÍøÍѤ¹¤ë¸¢Íø¤ò˸¤²¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ + + Î㤨¤Ð¡¢¼«Ê¬¤ÎºîÀ®¤·¤¿ OS ¤Îɽ¼¨ÍÑ¥Õ¥©¥ó¥È¤È¤·¤ÆËÜ¥½¥Õ¥È¥¦¥§¥¢¤ò + ¥Õ¥©¡¼¥Þ¥Ã¥ÈÊÑ´¹¤·¤ÆÄ󶡤·¤¿¾ì¹ç¡¢¤½¤Î¥Õ¥©¥ó¥È¤ÎÊ£À½¤ä¥ê¥Ð¡¼¥¹ + ¥¨¥ó¥¸¥Ë¥¢¥ê¥ó¥°¡¢Â¾ OS ¤Ç¤Î»ÈÍѤò¶Ø»ß¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + ¤·¤«¤·¡¢¤½¤Î OS ¤ÎÍøÍѼԤËÂФ·¡¢ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ä¤½¤ì¤òÊÑ´¹¤·¤¿ + ʪ¤Î»ÈÍÑ (¤½¤Î OS ¾å¤Ë±÷¤¤¤Æ¤â)¡¦Êѹ¹¡¦ÇÛÉÛ¤ò¹Ô¤¦¸¢Íø¤ò¶Ø¤¸¤¿¤ê¡¢ + ¤³¤ì¤é¤Î¹Ô°Ù¤Î̵ͭ¤Ë´ð¤Å¤¤¤Æº¹ÊÌŪ¤Ê·ÀÌó¾ò¹à¤ò²Ý¤·¤¿¤ê¤¹¤ë¤³¤È¤Ï + ¤Ç¤­¤Þ¤»¤ó¡£ + +4. ËÜ¥½¥Õ¥È¥¦¥§¥¢¤Ø¤ÎÄ̾ï¹Í¤¨ÆÀ¤ë²þÊѤËÂФ·¡¢¤½¤Îºî¶È·ë²Ì¤Ç¤¢¤ë²þÊÑÇÉÀ¸ + ʪ¤ËÃøºî¸¢¤ò¼çÄ¥¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤¹¤¬¡¢¤½¤Î²þÊѹ԰٤½¤Î¤â¤Î¤ËÂФ·¤Æ + ¸¢Íø¤ò¼çÄ¥¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£¤½¤Î²þÊÑÇÉÀ¸Êª¤Î¸ºß¤òÃΤäƤ¤¤¿¤« + Èݤ«¤òÌä¤ï¤º¡¢¸¶Ãøºî¼Ô¤Þ¤¿¤ÏÂè»°¼Ô¤¬Æ±Åù¤ÎÊý¿Ë¤Ë´ð¤Å¤¤¤¿²þÊѹ԰٤ò + ¹Ô¤¦¸¢Íø¤ò˸¤²¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ + + Î㤨¤Ð¡¢ËÜ¥½¥Õ¥È¥¦¥§¥¢¤Î̤´°À®Éôʬ¤Î»ú·Á¤ò¡¢ºîÀ®ºÑ¤ß¤ÎÉôʬ¤Î + »ú·Á¤«¤éʸ»úÉôÉʤò½¦¤¤ÁȤ߹ç¤ï¤»¤Æ´°À®¤·¤¿¾ì¹ç¡¢¤½¤Î¸å¤Ë + ¸¶Ãøºî¼Ô¤¬Æ±Íͤι԰٤ò¹Ô¤Ê¤Ã¤ÆºîÀ½¤·¤¿¥Õ¥©¥ó¥È¤Ë¤âƱ°ì¤Î»ú·Á¤¬ + ¸½¤ì¤Þ¤¹ (²èÁÇ¿ô¤ÎÀ©¸Â¤Ë¤è¤ê¡¢Á´¤¯Æ±¤¸»ú·Á¥Ñ¥¿¡¼¥ó¤Ë¤Ê¤ëʸ»ú¤¬ + ÁêÅö¿ô´Þ¤Þ¤ì¤ë¤³¤È¤¬Í½ÁÛ¤µ¤ì¤Þ¤¹)¡£ + ¤³¤Î¡¢ÆÈΩ¤ËºîÀ½¤µ¤ì¤¿ÇÉÀ¸Êª¤Ë¤ª¤±¤ë¡¢¶öÁ³¤Î°ìÃפª¤è¤ÓÆâºßŪ¤Ê + À©¸Â¤Ë°ø¤ëɬÁ³Åª¤Ê°ìÃ×Éôʬ¤ËÂФ·¡¢Ãøºî¸¢¤Î¿¯³²¤ò¼çÄ¥¤¹¤ë¤³¤È¤Ï + ¤Ç¤­¤Þ¤»¤ó¡£ + ¥Ð¥°½¤Àµ¤Ë´Ø¤·¤Æ¤âƱÍͤǤ¹¡£Á´Ê¸»ú¤ËÂФ·¤Æ¸í»ú¤Î̵ͭ¤ò¥Á¥§¥Ã¥¯¤·¡¢ + ¸í»ú·Á¤ò²þÊѤ·¤¿¾å¤Ç¤½¤Î¥Õ¥©¥ó¥È¤òÍ­½þÄ󶡤·¤Æ¤â¹½¤¤¤Þ¤»¤ó¡£ + ¤½¤Î¾ì¹ç¡¢¤½¤ÎÉÕ°ʸ½ñ¤Ë¤¢¤ë¸í»ú¤È½¤ÀµÆâÍÆ¤Î¥ê¥¹¥È (Î㤨¤Ð + ¡ÖϽ ¸í:¤³¤í¤â¤Ø¤ó Àµ:¤·¤á¤¹¤Ø¤ó¡×¤Î¤è¤¦¤Ê)¤ò´ð¤Ë¡¢¸¶Ãøºî¼Ô¤¬ + »úÂν¤Àµ¤ò¹Ô¤Ã¤¿¾ì¹ç¡¢¤½¤ì¤¬Á´¤¯Æ±¤¸½¤À°»ú·Á¤Ë¤Ê¤Ã¤¿¤È¤·¤Æ¤â¡¢ + ¸í»ú»ØÅ¦¼Ô¡¦¸¶½¤Àµ¼Ô¤ÎÃøºî¸¢¤Ë¤ÏÄñ¿¨¤¹¤ë¤â¤Î¤È¸«Ðö¤·¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£ + +5. ²¿¿Í¤âËÜ¥½¥Õ¥È¥¦¥§¥¢¤ÎÇÉÀ¸Êª¤ÎÃøºî¸¢¼Ô¤Ç¤¢¤ë¤³¤È¤ò¼çÄ¥¤Ç¤­¤Þ¤¹¤·¡¢ + Ãøºî¼Ô̾¤òÈëÆ¿¤·¤Æ¤½¤ÎÇÉÀ¸Êª¤òÇÛÉÛ¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤¹¤¬¡¢Ãøºî¼Ô¤Ç + ¤¢¤ë¤³¤È¤òµ¶¤Ã¤Æ¼çÄ¥¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Þ¤»¤ó¡£ + ¸¶Ãøºî¼Ô¤Î̾Á°¤òÃøºî¸¢É¸¼¨¤Ëµ­ºÜ¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£¤È¤¯¤Ë¡¢ + ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ÎÇÉÀ¸Êª¤òÍ­½þÈÒÉÛ¤¹¤ë¾ì¹ç¡¢¸¶Ãøºî¼Ô¤¬¾¦¶ÈÅªÍø±×¤ò + ¶¦Í­¤·¤Æ¤¤¤ë¤È¸í²ò¤µ¤ì¤ë¤³¤È¤Î¤Ê¤¤¤è¤¦¤ËÇÛθ¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ + +6. ËÜ¥½¥Õ¥È¥¦¥§¥¢¤Ï¡¢¡Ö¤¢¤ë¤¬¤Þ¤Þ¡×¤ÇÄ󶡤µ¤ì¤ëʪ¤Ç¤¢¤ê¡¢Ãøºî¼Ô¤ª¤è¤Ó + ºÆÇÛÉۼԤϡ¢¸øÅª¡¦»äŪ¤Êµ¬³Ê¤ä¸À¸ì´·½¬¤Ø¤ÎŬ¹çÀ­¡¢²¿¤é¤«¤ÎÍÑÅӤؤÎÍ­ÍÑÀ­ + ¤Ê¤É¤Î¡¢ÉʼÁ¤Ë´Ø¤¹¤ëÊݾڤò°ìÀÚ¹Ô¤¤¤Þ¤»¤ó¡£ËÜʸ½ñ¤Îµ­½Ò¤ò¡¢¤½¤Î¤è¤¦¤Ê + Êݾڤò¹Ô¤¦¤â¤Î¤È²ò¤·¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£ + ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ÎÍøÍѤ˵¯°ø¤¹¤ë»³²¤ËÂФ·¡¢¤½¤ÎÀÕǤ¤Ï¤¹¤Ù¤ÆÍøÍѼԤ¬ + É餦¤â¤Î¤È¤·¤Þ¤¹¡£Â»³²¤Îµ¯¤³¤ë²ÄǽÀ­¤¬ÃΤé¤ì¤Æ¤¤¤¿¾ì¹ç¤Ç¤â¡¢Ãøºî¼Ô + ¤ª¤è¤ÓºÆÇÛÉۼԤϡ¢Ë¡Åª¡¦Æ»µÁŪ¤ÊÀÕǤ¤òÉ餦¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¡£ + Ãøºî¼Ô¤ª¤è¤ÓºÆÇÛÉۼԤϡ¢ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ËÉÔ¶ñ¹ç¤¬È¯¸«¤µ¤ì¤¿¤È¤­¤Ë¡¢¤½¤ì¤ò + ½¤Àµ¡¦¹ðÃΤ¹¤ëµÁ̳¤òÉ餤¤Þ¤»¤ó¡£ + +7. ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ÎÇÉÀ¸Êª¤ËÂФ·¡¢¸¢Íø¤Î¼çÄ¥¤Þ¤¿¤Ï¼Á¤Ë´Ø¤¹¤ë²¿¤é¤«¤ÎÊݾڤò + ¹Ô¤¦¼Ô¤Ï¡¢Å¬ÀÚ¤ÊÃøºî¸¢É¸¼¨¤ò¹Ô¤¤¡¢ÍøÍѵöÂú¾ò·ï¤ÈÊݾڤÎÈϰϤòÌÀ³Î¤Ë + ¼¨¤µ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ + ËÜ¥½¥Õ¥È¥¦¥§¥¢¤ÈƱÅù¤ÎµöÂú¾ò¹à¤Ë½¾¤Ã¤ÆÇÉÀ¸Êª¤òÇÛÉÛ¤¹¤ë¼Ô¤Ï¡¢ËÜʸ½ñ¤ò + źÉÕ¤¹¤ë¤³¤È¤ÇµöÂú¾ò¹à¤ÎÄ󼨤ËÂ夨¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ + ËÜ¥½¥Õ¥È¥¦¥§¥¢¤È°Û¤Ê¤ëµöÂú¾ò¹à¤òÄ󼨤·¡¢¤Ê¤ª¤«¤ÄËÜʸ½ñ¤òÇÉÀ¸Êª¤ËźÉÕ + ¤·¤ÆÇÛÉÛ¤¹¤ë¾ì¹ç¤Ï¡¢ËÜʸ½ñ¤Î»ÈÍѵöÂú¾ò¹à¤¬Í­¸ú¤Ç¤Ï¤Ê¤¤¤³¤È¤¬ÍøÍÑ¼Ô¤Ë + ÌÀÎÆ¤Ë¸«¤Æ¼è¤ì¤ë¤è¤¦¤ËÇÛθ¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ + ¿·¤¿¤ËÄ󼨤·¤¿µöÂú¾ò·ï¤ÎÆâÍÆ¤ª¤è¤ÓÄó¼¨ÊýË¡¤ÎÉÔÈ÷¤Ëµ¯°ø¤¹¤ë¡¢²þÊÑʪ¤Î + Ãøºî¼Ô¡¦Ãøºî¸¢¼Ô¡¢ÍøÍѼԤª¤è¤ÓÂè»°¼Ô¤ÎÈï¤Ã¤¿Â»³²¤ËÂФ¹¤ëÀդϡ¢²þÊÑʪ + ¤ÎÃøºî¸¢¼Ô¤¬É餦¤â¤Î¤È¤·¤Þ¤¹¡£ + +8. ËÜ¥½¥Õ¥È¥¦¥§¥¢¤Ï¡¢¼íÌ¼ù¤È±ÊÈøÀ©°ì¤Î¶¦Æ±Ãøºîʪ¤Ç¤¹¤¬¡¢¼íÌ¼ù¤ò + ÂåÉ½Ãøºî¼Ô¤ª¤è¤ÓÏ¢ÍíÀè¤È¤·¤Þ¤¹¡£ + +°Ê¾å + +¡û¥½¥Õ¥È¥¦¥§¥¢¤ÎÇÛÉۤ˴ؤï¤ëº®Íð¤òÈò¤±¤ë¤¿¤á¤Ë + +°Ê²¼¤Ë½Ò¤Ù¤ë¤Î¤Ï»ÈÍѵöÂú¾ò·ï¤Î°ìÉô¤Ç¤Ï¤Ê¤¯¡¢Ã±¤Ê¤ë¤ª´ê¤¤¤¢¤ë¤¤¤Ï¿ä¾©¤Ë +²á¤®¤Þ¤»¤ó¤¬¡¢º®Íð¤òÈò¤±¤ë¤¿¤á¤Ë¤Ç¤­¤ë¸Â¤ê½¾¤Ã¤Æ²¼¤µ¤¤¡£ + +¡¦ËܥС¼¥¸¥ç¥ó¤Ï̤´°À®ÈǤǤ¹¡£º£¸å¡¢¥Ð¡¼¥¸¥ç¥ó¥¢¥Ã¥×¤ò¹Ô¤¦Í½Äê¤Ç¤¹¡£ + Êѹ¹¤ËÄɽ¾¤·¤Æ¡¢ºÇ¿·ÈǤòºÆÇÛÉÛ¤¹¤ë¤è¤¦¤Ë¿´¤¬¤±¤Æ²¼¤µ¤¤¡£Å¾ºÜ¤µ¤ì¤ë + Êý¤Ï¡¢¤´Ï¢Íí²¼¤µ¤ì¤Ð¥Ð¡¼¥¸¥ç¥ó¥¢¥Ã¥×¤ÎºÝ¤Ë¤ªÃΤ餻¤·¤Þ¤¹¡£ +¡¡¤¿¤À¤·¡¢ËܥС¼¥¸¥ç¥ó + +¡¦´Á»ú¤ò¥Õ¥©¥ó¥È¤È¤·¤ÆÍѤ¤¤ë¾ì¹ç¡¢ÂèÆó¿å½à¤Þ¤Ç¤Îʸ»úÁ´¤Æ¤òÍѤ¤¤ë¤è¤¦¤Ë + ¿´¤¬¤±¤Æ²¼¤µ¤¤¡£¥Ó¥Ã¥È¥Þ¥Ã¥×¥Ñ¥¿¡¼¥ó¤ò¥Õ¥©¥ó¥È¤È¤·¤ÆÍøÍѤ¹¤ë¤³¤È¤Î + ¤Ç¤­¤ë·Á¤ÇÄ󶡤·¡¢¤Ê¤ª¤«¤Ä²þÊѤ¬¤Ç¤­¤Ê¤¤´Ä¶­(ŵ·¿Åª¤Ë¤Ï¡¢É½¼¨Íѥϡ¼¥É + ¥¦¥§¥¢¤Ø¤ÎÁȤ߹þ¤ß)¤Ç¤Ï¡¢ + +¡¦¥Õ¥©¥ó¥È¤Î»ú·Á¤Ë²þÊѤò¹Ô¤ï¤Ê¤¤ÇÉÀ¸Êª¤Ï¡¢¡ÖKappa 20dot Fonts¡×¤È¤¤¤¦ + ¸Æ¾Î¤òÊݸ¤·¤Æ¡¢Êѹ¹²Õ½ê¤¬ÌÀ¤é¤«¤Ë¤Ê¤ëÀâÌÀŪ̾¾Î¤òÉÕ¤±²Ã¤¨¤Æ²¼¤µ¤¤¡£ + Îã¡§¡Ö(µ¡¼ï̾)ÍÑ Kappa 20dot Fonts¡× + ¥Õ¥©¥ó¥È¤Î»ú·Á²þÊѤò¹Ô¤Ã¤¿¾ì¹ç¡¢¡ÖKappa 20dot Fonts¡×¤È¤¤¤¦Ì¾¾Î¤ò + ÍѤ¤¤Ê¤¤¤«¡¢½¤Àµ¼Ô¤Î̾Á°¤òÌÀ¼¨¤·¤Æ²¼¤µ¤¤¡£¤³¤Î¾ì¹ç¡¢¡ÖKappa20¡×¤È¤¤¤¦ + ά¾Î¤òÍѤ¤¤Æ¤â¹½¤¤¤Þ¤»¤ó¡£ + Îã¡§¡Ö(½¤Àµ¼Ô̾)½¤ÄûÈÇ Kappa 20dot Fonts¡× + ¡¡¡¡¡Ö20¡ß24 ¥É¥Ã¥ÈÈÇ Kappa20¡× + +¡¦¥Ð¥°¤Ê¤É¤òȯ¸«¤·¤¿¾ì¹ç¤Ï¤´Êó¹ð¤ò´ê¤¤¤Þ¤¹¡£ + +¤Ê¤ª¡¢ËÜ¥½¥Õ¥È¥¦¥§¥¢¤Ï¡ÖÀµ¤·¤¤»úÂΡפ˴ؤ¹¤ëÃøºî¼Ô¤Î²ò¼á¤ò¼¨¤·¤¿¤â¤Î¤Ç¤Ï +¤¢¤ê¤Þ¤»¤ó¡£ + +¡üÍúÎò +1993ǯËöº¢? ¤³¤Îº¢ºî¤ê»Ï¤á¤ë¡£¤¢¤Þ¤ê¤ËÀΤDz¿»þ¤Î¤³¤È¤«ËºµÑ¤ÎÈàÊý¡£ +1994/07 Êä½õ´Á»ú16¥É¥Ã¥È¥Õ¥©¥ó¥È¤ÎÊý¤ËÀªÎϤò·¹Ãí¡£ + : +1995/04 6¿Í¤Î¶¨ÎϤˤè¤ê¡¢16¥É¥Ã¥ÈÊä½õ´Á»ú¤Î¥Ç¥¶¥¤¥ó¤¬´°Î»¡£ +1996/08 ¤³¤Îº¢ÂÀ»ú¤ÎÂè1¿å½à¤¬´°À®¡£ +1997/08/06 Version 0.2¡£ + ÂÀ»úÁ´Ê¸»ú´°À®¡£ºÇ½é¤Î¸ø³«¥Ð¡¼¥¸¥ç¥ó¡£ +1997/08/20 ±ÊÈø¤µ¤ó¤è¤êÈó´Á»úÉôʬ¤Îʸ»ú¤òĺ¤¯¡£Èþ¤·¤µ¤Ë´¶Æ°¡£ +1998/02/15 ±ÊÈø¤µ¤ó¤è¤ê²¾Ì¾¤Î¿·¥Ð¡¼¥¸¥ç¥ó(¸½ºß¤ÈƱ¤¸)¤¬ÆÏ¤¯¡£ +1998/02/21 Version 0.21¡£ + ±ÊÈø¤µ¤ó¤Ë夤¤¿Èó´Á»úÉôʬ¤ËÃÖ¤­´¹¤¨¡£ + MuleIPA¤ÎÂÀ»úºîÀ½¡£ +1998/09/11 Version 0.29¡£ + ¡ÖÊȡסÖèç¡×¤Î¥Ð¥°¤ò½¤Àµ¡£ + ±ÊÈø¤µ¤ó¤Îʸ»ú¤ò½¤Àµ¡£ + MuleIPA¤ÎºÙ»ú¡¢²¾Ì¾¤ÎºÙ»ú¤òºîÀ½¡£ +1998/10/03 Version 0.3¡£1 ǯ¤Ö¤ê¤Î¥Ð¡¼¥¸¥ç¥ó¥¢¥Ã¥×¡£ + ºÙ»ú²¾Ì¾¤ò±ÊÈø¤µ¤ó¤ËÊäÄû¤·¤Æ¤¤¤¿¤À¤¯¡£ + ºÙ»ú¤ÏÂè°ì¿å½à¤Þ¤Ç´°À®¡£ + 1 ¥ö·î¤Ç 2000 ʸ»ú(¤½¤ÎȾʬ¤Ï 1 ½µ´Ö¤Ç)½¤Àµ¤·¤¿¡£ + ¡ÖϽ¡×¤ÎÂç¥Ð¥°¤ò½¤Àµ¡£ + SWIDTH ¤ÎÃͤ¬¤ª¤«¤·¤«¤Ã¤¿¤Î¤ò½¤Àµ¡£ + ¤½¤Î¾ÂÀ»ú¤â»úÂΤòÊ¿À®ÌÀÄ«¤Ë¹ç¤ï¤»¾®½¤Àµ¡£ +1999/05/22 SOKO¥Ñ¥Ã¥Á (°ìÈÌÈó¸ø³«) ¤òºî¤Ã¤¿¡£ +2000/09/15 Version 0.39¡£0.4¤Î¥Ù¡¼¥¿ÈÇ¡£ + ºÙ»úÁ´Ê¸»ú´°À®¡£Latin 2, 3, 9 ¤Î¥Õ¥©¥ó¥È¤òÄɲᣠ+ ÂÀ»ú¡¢¡ÖѸ¡×¡Ö鷡סÖîö¡×¡Öòó¡×¤Î¥Ð¥°¤ò½¤Àµ¡£ + ¤½¤Î¾10ʸ»ú»úÂν¤Àµ¡¢12ʸ»ú¥Ç¥¶¥¤¥ó½¤Àµ¡£ +2000/09/27 Version 0.391¡£ + Makefile ¤ò¤Á¤ç¤Ã¤È½¤Àµ¡£¼«Ê¬¤¬ÅÐÏ¿¤·¤Æ¤Ê¤¤ alias ¤òºï¤é¤Ê¤¤ + ¤è¤¦¤Ë¤¹¤ë¡£ + ¡Ö¥Ê¥¬¤ß¤ó¡×¤Ë´Ø¤¹¤ë¼Õ¼­¤òÄɲᣠ+ ¼Õ¼­¤ÇÂ緧âͳ¤µ¤ó¤Î̾Á°¤ò¡ÖÂ緧âͭ¡×¤È¤Ê¤Ã¤Æ¤¤¤¿¤Î¡¢¼ºÎé¤Ê + ´Ö°ã¤¤¤òľ¤¹¡£¤ªÌ¾Á°¤ò´Ö°ã¤¨¤Æ¿½¤·Ìõ¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿¡£ +2000/10/01 Version 0.392¡£ + ¥¤¥ó¥¹¥È¡¼¥ëÀè¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ä fonts.alias ¤¬¤Ê¤¤¾ì¹ç¤ËÂбþ¡£ + patch ¤ò ${PATCH} ÊÑ¿ô¤Ë¤·¤¿¡£ +2000/10/04 Version 0.393¡£ + Àî¸ý¶ä²Ï¤µ¤ó¤Î¤´»ØÅ¦¤Ë¤è¤ê¡¢newjis.diff ¤Î CHARS ¤òľ¤·¤¿¡£ +2000/10/08 Version 0.394¡£ + ¼ò°æÀ¶Î´¤µ¤ó¤Î¥Ñ¥Ã¥Á¤Ë½¾¤Ã¤Æ¡¢nk20b-1.bdf ºîÀ®¤Ë patch -o ¤ò + »È¤¦¤è¤¦¤ËÊѹ¹¡£ + Àî¸ý¤µ¤ó¤Î¤´»ØÅ¦¤Ë¤è¤ê egrep ¤Î¥ê¥À¥¤¥ì¥¯¥ÈÀè¤Ë¥Õ¥¡¥¤¥ë¤òÆó¤Ä + »ØÄꤷ¤Æ¤¤¤ë¤Î¤ò½¤Àµ¡£ + Reflection X ¤Ë´Ø¤¹¤ë¼Õ¼­¤ÎÄɲà (»ö¼Â³Îǧ¤Ï̤)¡£ +2000/10/10 Version 0.394 ¤Î¥¢¡¼¥«¥¤¥Ö¤ÎÃæ¿È¤¬ 0.393 ¤À¤Ã¤¿¤Î¤òľ¤·¤¿¡£ + °ì½ï¤Ë¡¢README ¤ÎƬ¤Î README ¤¬ 0.392 ¤À¤Ã¤¿¤Î¤òľ¤·¤¿¡£ + ¤½¤ì¤¾¤ì¡¢¼ò°æ¤µ¤ó¤ÈÌøÅĤµ¤ó¤Î¤´»ØÅ¦¤Ë½¾¤¤½¤Àµ¡£ + README ËöÈø¤ÎÆüÉÕ¤â 10.10 ¤Ëľ¤·¤¿¡£ +2003/07/07 Version 0.395¡£ + °Ê²¼¤Î¸í»ú¤ò½¤Àµ¡£ + k20m.bdf, k20b.bdf: ¡Ö´Á¡×¤Î¡ÖÉספβ£Àþ¤¬ 1 ËÜ¿¤¯¡¢3 Ëܤ¢¤Ã¤¿ + ¡ÖÔۡפ¬¡Ö±Ã¡×¤Î²¼¤Ë¡ÖÅڡפˤʤäƤ¤¤¿ + 10x20m.bdf, 10x20b.bdf, 10x20L3m.bdf, 10x20L3b.bdf: + ¡ÖUdieresis¡×¤¬¡ÖUtilde¡×¤Ë¤Ê¤Ã¤Æ¤¤¤¿ + 10x20b.bdf: ¡Öudieresis¡×¤¬¡Öutilde¡×¤Ë¤Ê¤Ã¤Æ¤¤¤¿ + 10x20L2m.bdf, 10x20L2b.bdf:¡ÖAbreve¡×¤¬¡ÖAtilde¡×¤Ë¤Ê¤Ã¤Æ¤¤¤¿ + ¡Ölacute¡×¤¬¡Öiacute¡×¤Ë¤Ê¤Ã¤Æ¤¤¤¿ + 10x20L3m.bdf, 10x20L3b.bdf:¡ÖUbreve¡×¤¬¡ÖUcaron¡×¤Ë¤Ê¤Ã¤Æ¤¤¤¿ + 10x20L3b.bdf:¡Ö'¡×¤¬¡Ö,¡×¤Ë¤Ê¤Ã¤Æ¤¤¤¿ + ipa-10x20m.bdf, ipa-10x20b.bdf: ¡Öh¡×¤¬È´¤±¤Æ¡¢¸å¤í¤Îʸ»ú¤¬ + 1 ʸ»ú·«¤ê¾å¤¬¤Ã¤Æ¤¤¤¿¡£ + nk20b-1.bdf: 1-11-22 (¥Ù¥Ó¡¼¥¬¥ó¥Þ) ¤Î»ú·Á¤ò¡¢JIS X 0213:2000 + ¤Îµ¬³ÊɼÎ㼨»ú·Á¡¦¼ÂÁõÎã¤Îʪ (v ¤Î²¼¤Ë¥ë¡¼¥×) ¤«¤é¡¢ + Âбþ¤¹¤ë UCS(U+0264) ¤ÎÎ㼨»ú·Á¤Î¤â¤Î (Ram's Horns) ¤Ë + Êѹ¹¡£¤³¤ì¤Ï¡¢¤³¤Îʸ»ú¤¬¼¨¤¹ IPA ¤Î close mid back + unrounded vowel ¤ËÂбþ¤¹¤ë²»À¼µ­¹æ¤¬¡¢voiced velar + median frictive ¤òɽ¤¹µ­¹æ¥¬¥ó¥Þ¤È¤Îº®Æ±¤òÀ¸¤¸¤Ê¤¤ + ¤è¤¦¤Ë¡¢1989 ǯ¤Ë¹Ô¤ï¤ì¤¿¥Ç¥¶¥¤¥ó²þÄû¸å¤Î·Á¤Ë½¾¤Ã¤¿ + ¤â¤Î¡£µ¬³Êɼ¤Î¤Û¤«¤Ë¡¢¡ÖÀ¤³¦²»À¼µ­¹æ¼­Åµ¡×(ISBN + 4-385-10756-4) ¤ò»²¾È¤·¤¿¡£ + »³ÆâÀéΤ¤µ¤ó¤Ë¤´»ØÅ¦¤¤¤¿¤À¤¤¤¿¡¢Í¾Ê¬¤Ê¥É¥Ã¥È¤Î¤Ä¤¤¤¿»ú¤Ê¤É¤Î + ÆÉ¤ß¤Ë¤¯¤¤Ê¸»ú¤ò½¤Àµ¤¹¤ë¤Ê¤É¤Î¥Ç¥¶¥¤¥óÄ´À°¡£ + ISO 8859-4,9,10,13,14,15,16 (Latin 4¡Á10) ¤òºîÀ®¡£ + ¤³¤ì¤é¤Ï¥¹¥¯¥ê¥×¥È¤Ë¤è¤ë½¸»úÊý¼°¤Ë²þ¤á¤ë¡£ + JIS X 0213 ¤ò 1 ÌÌ 47 ¶è¤Þ¤ÇÄɲúîÀ®¡£ +2003/10/06 Version0.396 + 10x20rkm.bdf: yen ¤¬ backslash, overline ¤¬ ~ ¤Ë¤Ê¤Ã¤Æ¤¤¤¿¡£ + CHARSET_ENCODING ¤¬ 1 ¤Ë¤Ê¤Ã¤Æ¤¤¤¿(»³Æâ¤µ¤ó¤Î»ØÅ¦)¡£ + makebdf.sh: bash ¤Çư¤«¤Ê¤¤ÌäÂê¤ò²ò·è¤·¤¿¡£ + +¡üº£¸å¤Î²ÝÂê +°Ê²¼¤ÎÌäÂê¤ò²ò·è¤¹¤ëɬÍפ¬¤¢¤ë¤È¹Í¤¨¤Æ¤¤¤Þ¤¹¡£ +¡¦2000ǯ¤ËºöÄꤵ¤ì¤¿Âè 3¡¦Âè 4 ¿å½à¤Ø¤ÎÂбþ¡£¸½ºßÈó´Á»úÉôʬ¤Î¤ß´°À®¡£ +¡¦¼é²¬ÃÎɧ¤µ¤ó¤ËÂפ¤¤¿¡¢78 JIS ¥Ñ¥Ã¥Á¤ò¥Þ¡¼¥¸¤·¤Æ¤¤¤Ê¤¤¡£ +¡¦Á´ÂΤÎÅý°ì¡¢Éôʬ»ú·Á¤Î¶¦Ä̲½¡¢ÂÀ»ú¤ÈºÙ»ú¤Î¥Ç¥¶¥¤¥ó¤ÎÅý°ì¤¬¼è¤ì¤Æ¤¤¤Ê¤¤¡£ +¡¦JIS X 0201 ¤Î¡¢STARTCHAR ¤Ë³¤¯Ê¸»ú¤Î̾Á°¤ÏŬÅö¤Ë¤Ä¤±¤¿¤À¤±¤Ç¤¢¤ë¡£ +¡¦Á´ÂΤòÄÌÍ÷¤·¤¿¥Ð¥°¥Á¥§¥Ã¥¯¤ò¹Ô¤Ã¤Æ¤¤¤Ê¤¤¡£ +¡¦¥É¥­¥å¥á¥ó¥È (ÆÃ¤Ë¥¤¥ó¥¹¥È¡¼¥ëÊýË¡) ¤¬½¼Ê¬¸¡¾Ú¤µ¤ì¤Æ¤¤¤Ê¤¤¡£ +¡¦Êä½õ´Á»ú¤ËÂбþ¤·¤Æ¤¤¤Ê¤¤¡£ + +¡ü¼Õ¼­ +¡¡10¥É¥Ã¥È´Á»ú¥Õ¥©¥ó¥È¡Ö¥Ê¥¬10¡×¤Îºî¼Ô¡¢±ÊÈøÀ©°ì(¤Ê¤¬¤ª¤µ¤À¤«¤º)¤µ¤ó¤Ë¡¢ +²¾Ì¾¤È¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¤Î¿·¥Ç¥¶¥¤¥ó¤ò¤¤¤¿¤À¤­¡¢Á°¤ÎÈǤȤϸ«°ã¤¨¤ë¤è¤¦¤Ë +Èþ¤·¤¯¤Ê¤ê¤Þ¤·¤¿¡£ +¡¡±ÊÈø¤µ¤ó¤«¤é¥Õ¥©¥ó¥È¤òĺÂפ·¤¿¤Î¤Ï¡¢10x20b.bdf ¤Î±Ñ¿ôʸ»ú¤È¡¢k20b.bdf +¤ÎÈó´Á»úÉôʬ¤Î²áȾ¤Ç¤¹¤¬¡¢¥·¥ó¥×¥ë¤Ç²û¤ÎÂ礭¤¤£±¥Ð¥¤¥È±Ñ¿ô»ú¤È¡¢Í¥Èþ¤Ç +²µÄ¥¤ê¤ÎÍø¤¤¤¿¥¢¥ó¥Á¥Ã¥¯ÂΤβ¾Ì¾Ê¸»ú¤ÎÈþ¤·¤µ¤ÏÆÃÉ®¤ËÃͤ·¤Þ¤¹¡£ +¡¡ºÙ»ú¤Î¥Õ¥©¥ó¥È¥Ñ¥¿¡¼¥ó¤Ï¡¢¤³¤ì¤é¤ÎÀþ¤ò¼íÌ¾¡¼ê¤ËºÙ¤¯¤·¤¿Êª¤Ç¤¹¤¬¡¢ +¥ª¥ê¥¸¥Ê¥ë¤Î»ý¤Ã¤Æ¤¤¤ëÌ£¤ï¤¤¤òÂ礤¤Ë»¦¤°·ë²Ì¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿¤Î¤ò¡¢ +±ÊÈø¤µ¤ó¤Ë½¤Àµ¤·¤ÆÂפ­¡¢ÂÀ»ú¤Î¥Õ¥©¥ó¥È¤ÎÀª¤¤¤ò¤«¤Ê¤ê¼è¤êÌᤷ¤Þ¤·¤¿¡£ +³§¤µ¤ó¤â¤¼¤Ò¡¢ÂÀ»ú¤Ç¥Æ¥­¥¹¥È¤òɽ¼¨¤·¤Æ¡¢¤½¤ÎÈþ¤·¤µ¤ò´®Ç½¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£ +¡¡¡Öº£¤Þ¤Ç¤È°ã¤Ã¤ÆÈþ¤·¤¯¤Ê¤Ã¤¿¤Ê¤¢¡×¤È¤ª´¶¤¸¤Ç¤·¤¿¤é¡¢¤½¤ì¤Ï¡¢Ê¸¾Ï¤Î +£·³ä¤òÀê¤á¤ëÈó´Á»ú¤ò¥Ç¥¶¥¤¥ó¤µ¤ì¤¿±ÊÈø¤µ¤ó¤ÎÅØÎϤλò¤Ç¤¹¡£¤³¤Î¾ì¤ò¼Ú¤ê¤Æ +¤ªÎé¤ò¿½¤·¾å¤²¤Þ¤¹¡£¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤·¤¿¡£ +¡¡¤½¤·¤Æ¡¢ËܥС¼¥¸¥ç¥ó¤Ë»²¹Í¤È¤·¤ÆÉÕ¤±¤é¤ì¤Æ¤¤¤ë JIS X 0213:2000 ¥Õ¥©¥ó¥È +(¸½ºßÈó´Á»úÉôʬ¤Î¤ß´°À®) ¤Ç»ÈÍѤµ¤ì¤Æ¤¤¤ë13¶è¤Îñ°ÌÍÑÊÒ²¾Ì¾¹ç»ú¤Ë»È¤ï¤ì¤Æ¤¤¤ë +½ñÂΤϡ¢±ÊÈø¤µ¤ó¤ÎºîÀ®¤µ¤ì¤¿¡Ö¥Ê¥¬10¡×¥Õ¥©¥ó¥È¤ËƱº­¤µ¤ì¤Æ¤¤¤ë¡Ö¥Ê¥¬¤ß¤ó¡×¤Î +²¾Ì¾¤òÁȤ߹ç¤ï¤»¤¿Êª¤Ç¤¹¡£ËÜ¥Õ¥©¥ó¥È¤ÇÍѤ¤¤Æ¤¤¤ë¤³¤ì¤é¤Îʸ»ú¤ò public domain +¤Î²¼¤ÇÇÛÉÛ¤¹¤ë¤³¤È¤Ëµö²Ä¤ò²¼¤µ¤Ã¤¿¤³¤È¤ËÂФ·¡¢½Å¤Í¤Æ´¶¼Õ¤·¤Þ¤¹¡£ + +¡¡¤Þ¤¿¡¢¦Á¥Æ¥¹¥¿¤È¤·¤Æ¤Î¿¤¯¤Î½õ¸À¡¢¥×¥í¥°¥é¥à¤ä¥Ç¡¼¥¿¤Î»ÈÍѵöÂú¤òÍ¿¤¨¤Æ +²¼¤µ¤Ã¤¿°Ê²¼¤ÎÊý¡¹¤Ë´¶¼Õ¤·¤Þ¤¹¡£ + +º£Â¼½Ó¹¬¤µ¤ó¡¢Âçµ×Êݹ°¿ò¤µ¤ó¡¢ÀîºêϺȤµ¤ó¡¢ÀîȨÂÀ°ì¤µ¤ó¡¢ÅÄÃæÅ¯Ï¯¤µ¤ó¡¢ +¿¿Ìî·ò¤µ¤ó¡¢¼é²¬ÃÎɧ¤µ¤ó¡£ + +¡¡ºÇ½é¤Î¦ÂÈǤǤ¢¤ë Version 0.2 ¤Ë¤Ï¡¢°Ê²¼¤ÎÊý¡¹¤«¤é¥Ð¥°Êó¹ð¤ä²þÁ±Ä󰯤ò +¤¤¤¿¤À¤­¤Þ¤·¤¿¡£¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£ + +°ËÆ£½ã°ìϺ¤µ¤ó¡¢¼ò°æÀ¶Î´¤µ¤ó¡¢°Ëƣδ¹¬¤µ¤ó¡¢ÃæÂ¼Åؤµ¤ó¡¢ÇϾìÈ¥¤µ¤ó¡¢ +ÌøÅijÙÍΤµ¤ó¡£ + +Version 0.4 ¤òºîÀ®¤¹¤ë¤Ë¤¢¤¿¤Ã¤Æ¡¢¼íÌ»Ö¤µ¤ó¤Ï¥³¥ó¥Ñ¥¤¥ë¾å¤ÎÌäÂêÅÀ¤ò +»ØÅ¦¤·¤Æ¤¯¤À¤µ¤¤¤Þ¤·¤¿¡£ + +Ǽ·û°ìϺ¤µ¤ó¤Ï¡¢Version 0.394 ¤Ë´Þ¤Þ¤ì¤Æ¤¤¤¿ MuleIPA ¤Î¥Ð¥°¤ò¤´»ØÅ¦ +¤¯¤À¤µ¤¤¤Þ¤·¤¿¡£¤ªÎé¤ò¿½¤·¾å¤²¤ë¤È¤È¤â¤Ë¡¢½¤ÀµÈǤòºîÀ®¤¹¤ë¤Þ¤Ç¤Ë +8 ¥ö·î¤â³«¤±¤Æ¤·¤Þ¤Ã¤¿ÂÕÂÆ¤Ë¤ªÏͤӤ¤¤¿¤·¤Þ¤¹¡£ + +¡¡¹õÌÚ¸¼¤µ¤ó¤Ï¡¢¤³¤Î¥Õ¥©¥ó¥È¤Î¥Ð¥¤¥Ê¥ê¤òºîÀ½¤·¡¢Web¥Ú¡¼¥¸¾å¤Ç¥¤¥ó¥¹¥È¡¼¥ë +Ë¡¤ò²òÀ⤹¤ë¤³¤È¤Ë¤è¤ê¡¢¥Õ¥©¥ó¥È¤ò¹­¤á¤Æ²¼¤µ¤¤¤Þ¤·¤¿¡£ +¡¡Àî¸ý¶ä²Ï¤µ¤ó¤Ï¡¢FreeBSD ¤Î ports ¤òºî¤ê¡¢´Êñ¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤Ç¤­¤ë¤è¤¦¤Ë +¤·¤Æ²¼¤µ¤¤¤Þ¤·¤¿¡£ +¡¡Â緧âͳ¤µ¤ó¤Ï¡¢Linux ¤Î rpm ¤òºî¤ê¡¢TurboLinux ¤Ë¼ýÏ¿¤·¤Æ²¼¤µ¤¤¤Þ¤·¤¿¡£ +¡¡¾®Åç»°¹°¤µ¤ó¤Ï¡¢Linux ¤Î Slackware ¤È PJE ¤òÅý¹ç¤·¤¿¥Ç¥£¥¹¥È¥ê¥Ó¥å¡¼¥·¥ç¥ó +¤Ç¤¢¤ë Plamo Linux ¤Ë Kappa20 ¤ò¼ýÏ¿¤·¤Æ²¼¤µ¤¤¤Þ¤·¤¿¡£ +¡¡ÀéÍÕͺ°ì¤µ¤ó¤Ï¡¢Windows ¾å¤Î X ¥µ¡¼¥Ð¤Ç¤¢¤ë Reflection X ¤ÎÆüËܸì¥Õ¥©¥ó¥È +¤Ë¡¢Kappa 20dot Fonts ¤ò¼ýÏ¿¤·¤Æ²¼¤µ¤¤¤Þ¤·¤¿¡£ + ´äÀîÌ÷¤µ¤ó¤Ï¡¢LASER5 Linux ¤Ë¡¢Kappa20 ¤ò¼ýÏ¿¤·¤Æ²¼¤µ¤¤¤Þ¤·¤¿¡£ + +Version 0.395 ¤ò½Ð¤¹¤ËÅö¤¿¤Ã¤Æ¡¢»³ÆâÀéΤ¤µ¤ó¤Ë¤ÏÆÃ¤Ë¤ªÎé¤ò¿½¤·¾å¤²¤¿¤¤¤È +»×¤¤¤Þ¤¹¡£»³Æâ¤µ¤ó¤Ï Kappa20 ¤ò¥Ù¡¼¥¹¤Ë¡¢Ayu(ÅìÉ÷) 20 ¥É¥Ã¥È¥´¥·¥Ã¥¯ +¥Õ¥©¥ó¥È¤òºîÀ®¤µ¤ì¡¢¸½ºß¤â 18 ¥É¥Ã¥ÈÈǤòÀºÎÏŪ¤ËºîÀ®¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ +http://x-tt.sourceforge.jp/ayu.html ¤Ç¡¢public domain ¤Ê¥Õ¥©¥ó¥È¤È¤·¤Æ +¤³¤ì¤é¤ÎÀ®²Ì¤Ï¸ø³«¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ +Kappa20 ¤ò¥Ù¡¼¥¹¤Ë¿·¤¿¤Ê¥Õ¥©¥ó¥È¤òºîÀ®¤·¤Æ¤¯¤À¤µ¤ë¤Î¤Ï¤¿¤¤¤Ø¤ó¸÷±É¤Ê +¤³¤È¤Ç¤¹¤¬¡¢¤½¤ÎºîÀ®¤È¸«Ä¾¤·¤Î²áÄø¤Ç Kappa20 ¤Î»ú·Á¤òÂçÊѾܺ٤˸¡Æ¤¤·¤Æ +¤¯¤À¤µ¤ê¡¢µ¤¤Å¤­¤½¤¦¤Çï¤â¤¬µ¤¤Å¤«¤Ê¤«¤Ã¤¿¡Ö´Á¡×¤Î¸í»ú¤ä¡¢ºÙ»úÈǤΠ+¥Ó¥Ã¥È¥Þ¥Ã¥×¤Ë»Ä¤Ã¤¿Í¾·×¤Ê¥É¥Ã¥È¤Ê¤É¤òÃΤ餻¤Æ¤¯¤À¤µ¤¤¤Þ¤·¤¿¡£ +ISO 8859-1 ¤Î¸í»ú¤ò¤´»ØÅ¦¤¤¤¿¤À¤¤¤¿¤³¤È¤Ë¤è¤ê¡¢¸ÄÊ̤ËÊÔ½¸¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯ +ʸ»ú̾¤Î¥ê¥¹¥È¤«¤é¥Õ¥©¥ó¥È¤òÁȤßΩ¤Æ¤ëÊý¼°¤ØÀÚÂØ¤¨¤ë·è¿´¤¬¤Ä¤­¤Þ¤·¤¿¡£ +¤½¤ì¤Ë¤è¤ê¡¢ISO 8859-4¡Á8, 11 ¤Î 6 ¤Ä¤ÎÄɲåե©¥ó¥È¤òÄ󶡤¹¤ë¤³¤È¤â +¶ìÏ«¤Ê¤¯¤Ç¤­¤Æ¤¤¤Þ¤¹¡£ + +¸åÆ£ÀµÆÁ¤µ¤ó¤Ï¡¢makebdf.sh ¤¬ bash ¤Çư¤«¤Ê¤¤ÌäÂê¤Î²ò·èºö¤ò¤´¶µ¼¨ +¤¯¤À¤µ¤¤¤Þ¤·¤¿¡£ + +°Ê¾å¤ÎÊý¡¹¤Ë¤ªÎ鿽¤·¾å¤²¤Þ¤¹¡£ + +¡üÏ¢ÍíÀè +¥Ð¥°Êó¹ð¡¢´¶ÁÛ¡¢¥Ç¡¼¥¿Ä󶡤ʤɤò´¿·Þ¤·¤Þ¤¹¡£¥á¡¼¥ë¤Ï + kanou@khdd.net +¤Þ¤Ç¤ª´ê¤¤¤·¤Þ¤¹¡£ºÇ¿·¾ðÊó¤Ï¡¢ + http://khdd.net/20dot.fonts/ +¤Ë¤¢¤ê¤Þ¤¹¡£ + 2003/10/06 ¼íÌî ¹¨¼ù diff --git a/third_party/fonts/other/doc/misaki/misakib8.txt b/third_party/fonts/other/doc/misaki/misakib8.txt new file mode 100644 index 0000000..a903d0e --- /dev/null +++ b/third_party/fonts/other/doc/misaki/misakib8.txt @@ -0,0 +1,99 @@ +=========================================================== + + 7*7¥É¥Ã¥ÈÆüËܸì¥Ó¥Ã¥È¥Þ¥Ã¥×¥Õ¥©¥ó¥È + Èþºé¥Õ¥©¥ó¥È period ¦Â8 + + Copyright (C) 2002-2004 #Shin.Y + +=========================================================== + + +¡¡Èþºé¥Õ¥©¥ó¥È¤ÏSHARP¥Ý¥±¥³¥óPC-E500¥·¥ê¡¼¥ºÍѤ˺î¤é¤ì¤¿7*7 +¥É¥Ã¥È¤ÎÆüËܸì¥Õ¥©¥ó¥È¤Ç¤¹. JIS X 0208-1990¤Ë½àµò¤·¤Æ¤ª¤ê, +JISÂè°ì¡¦ÂèÆó¿å½à¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤Þ¤¹. SCRNJPN(*1)¤Ë¤è¤ëÆü +Ëܸìɽ¼¨´Ä¶­²¼¤Ë¤ª¤¤¤Æ60Colmuns(*2)»ÈÍÑ»þ¤Ë»ú´Ö¤¬¤Ç¤­, ²Ä +ÆÉÀ­¤ËŤ±¤Æ¤¤¤Þ¤¹. +¡¡¥Õ¥©¥ó¥È̾¤Ï, À©ºî³«»Ï¤Î¤­¤Ã¤«¤±¤È¤Ê¤Ã¤¿ÈþºéÎé°Ò»á¤è¤êĺ +¤­¤Þ¤·¤¿. + +(*1)Nmasu¤µ¤óºî¤Î´Á»úɽ¼¨¥É¥é¥¤¥Ð +(*2)¹Âü Âç²ð¤µ¤óºî¤Î60·åɽ¼¨¥É¥é¥¤¥Ð + + +¡üÈþºéÌÀÄ« + +¡¡ÈþºéÌÀÄ«¤Ï, Èþºé¥Õ¥©¥ó¥È¤ÎÈó´Á»úÉô¤òÌÀÄ«É÷¤Î¥Õ¥©¥ó¥È¤Ëº¹ +¤·Âؤ¨¤¿¤â¤Î¤Ç¤¹. ³Æµ¡¼ïÍѤΥ¢¡¼¥«¥¤¥Ö¤Ëº¹¤·Âؤ¨ºÑ¤ß¤Î¥Õ¥© +¥ó¥È¥Õ¥¡¥¤¥ë(BDFÈǤΤߺ¹Ê¬¤Îdiff¥Õ¥¡¥¤¥ë)¤¬Æ±º­¤·¤Æ¤¢¤ê¤Þ +¤¹. + + +¡üÌäÂêÅÀ¤Ê¤É + +¡¦¡Ö¤Ø¤ó¡×¡Ö¤Ä¤¯¤ê¡×Åù, ³ÆÉô¤¬¥Õ¥©¥ó¥È´Ö¤Ç´°Á´¤ËÅý°ì¤Ç¤­¤Æ +¡¡¤¤¤Þ¤»¤ó. +¡¦¡Ö¡½(¥À¥Ã¥·¥åµ­¹æ)¡×¤È·ÓÀþ¤Ï8*8¤Çºî¤é¤ì¤Æ¤¤¤Þ¤¹. 7*7¤Ë¤· +¡¡¤¿¤¤¾ì¹ç¤Ï, ±¦¤È²¼¤Î°ìÎó¤òºï¤Ã¤Æ²¼¤µ¤¤. + + +¡ü¥é¥¤¥»¥ó¥¹ + + Copyright (C) 2002-2004 #Shin.Y + + These fonts are free softwares. + Unlimited permission is granted to use, copy, and +distribute it, with or without modification, either +commercially and noncommercially. + THESE FONTS ARE PROVIDED "AS IS" WITHOUT WARRANTY. + + ¤³¤ì¤é¤Î¥Õ¥©¥ó¥È¤Ï¥Õ¥ê¡¼¡Ê¼«Í³¤Ê¡Ë¥½¥Õ¥È¥¦¥¨¥¢¤Ç¤¹¡£ + ¤¢¤é¤æ¤ë²þÊѤÎ̵ͭ¤Ë´Ø¤ï¤é¤º¡¢¤Þ¤¿¾¦¶ÈŪ¤ÊÍøÍѤǤ¢¤Ã¤Æ¤â¡¢ +¼«Í³¤Ë¤´ÍøÍÑ¡¢Ê£À½¡¢ºÆÇÛÉÛ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢Á´¤ÆÌµÊÝ¾Ú +¤È¤µ¤»¤Æ¤¤¤¿¤À¤­¤Þ¤¹¡£ + + +¡üÏ¢ÍíÀè + +¡¡¤´°Õ¸«¡¦¤´´¶ÁÛ¤ä¸í»ú¡¦ÌäÂêÅÀ¤ÎÊó¹ðÅù¤Ï²¼µ­¥¢¥É¥ì¥¹¤Þ¤Ç. + +¡¡#Shin.Y (num_sy@yahoo.co.jp) + +¡¡Èþºé¥Õ¥©¥ó¥ÈºÇ¿·ÈǤÏ, ²¼µ­¥µ¥¤¥È¤Ç¸ø³«Ãæ¤Ç¤¹. + +¡¡Little Limit[#Shin.Y's Web Site] +¡¡(http://www.geocities.co.jp/SiliconValley-Oakland/7410/) + + +¡ü¥Ð¡¼¥¸¥ç¥ó¾ðÊó + +¡¦[2004/ 5/ 9] period ¦Â8 +¡¦[2003/ 9/21] period ¦Â7 +¡¦[2003/ 6/ 4] period ¦Â6 +¡¦[2003/ 5/ 4] period ¦Â5 +¡¦[2003/ 3/26] period ¦Â4 +¡¦[2002/12/14] period ¦Â3 +¡¦[2002/ 6/18] period ¦Â2 +¡¦[2002/ 6/ 3] period ¦Â1 + + +¡üÀ©ºîÍúÎò +¡¦[2004/ 5/ 9] ÈþºéÌÀÄ«¤ÎƱº­³«»Ï +¡¦[2004/ 4/19] ȾÂùÅÀ¤Î½èÍý¤òÊѹ¹ +¡¦[2004/ 4/11] 3¥Õ¥©¥ó¥ÈƱ»þÊÔ½¸¥Ä¡¼¥ë + ""SCRNJPN.FNT" Editor"´°À® +¡¦[2004/ 2/ 9] ÂùÅÀ¤Î½èÍý¤òÊѹ¹ +¡¦[2003/ 9/21] À©ºîÍúÎò¤ÎÆüÉեߥ¹¤ò½¤Àµ(Èþºé»áThanx!) +¡¦[2003/ 6/ 4] ¥é¥¤¥»¥ó¥¹¤Ë´Ø¤¹¤ëµ­½Ò¤òÊѹ¹ +¡¦[2003/ 3/26] ¥Þ¥Ë¥å¥¢¥ë¤ò, ¥Õ¥©¥ó¥È¤ÎÀâÌÀ¤È³Æ·Á¼°¤ÎÀâÌÀ¤Ë + ʬΥ +¡¦[2003/ 1/ 2] ³ÆÉô¤Î¥Õ¥©¥ó¥È´Ö¤Ç¤ÎÅý°ì²½ºî¶È¤òËܳÊŪ¤Ë³«»Ï +¡¦[2002/ 6/10] JIS X 0208-1983¤Ç¤Îʸ»ú¤ÎÄɲÃ, Êѹ¹¤ËÂбþ +¡¦[2002/ 6/ 6] ̤ÄêµÁʸ»ú¤Î¥Õ¥©¥ó¥È¤ò3*3¤Î¢£¤Ë +¡¦[2002/ 6/ 1] ÂèÆó¿å½à´°À® +¡¦[2002/ 5/22] À©ºîºÆ³« +¡¦[2002/ 5/21] ¥Õ¥©¥ó¥ÈºîÀ®ÀìÍѥġ¼¥ë + "'SCRNJPN.FNT' Editor"´°À® +¡¦[2002/ 5/11] E650˽Áö¤Ë¤è¤ê, ÂèÆó¿å½àÃæ¤Î600ʸ»ú¶á¤¯¤¬¾ÃÌÇ + ¢ªÀ©ºîÃæÃÇ +¡¦[2002/ 4/½é] Âè°ì¿å½à´°À® +¡¦[2002/ 3/Ãæ] À©ºî³«»Ï diff --git a/third_party/fonts/other/doc/mplus/LICENSE_J b/third_party/fonts/other/doc/mplus/LICENSE_J new file mode 100644 index 0000000..2c6478c --- /dev/null +++ b/third_party/fonts/other/doc/mplus/LICENSE_J @@ -0,0 +1,12 @@ +- +M+ BITMAP FONTS Copyright 2002-2004 COZ +- + +LICENSE + + + + +¤³¤ì¤é¤Î¥Õ¥©¥ó¥È¤Ï¥Õ¥ê¡¼¡Ê¼«Í³¤Ê¡Ë¥½¥Õ¥È¥¦¥¨¥¢¤Ç¤¹¡£ +¤¢¤é¤æ¤ë²þÊѤÎ̵ͭ¤Ë´Ø¤ï¤é¤º¡¢¤Þ¤¿¾¦¶ÈŪ¤ÊÍøÍѤǤ¢¤Ã¤Æ¤â¡¢¼«Í³¤Ë¤´ÍøÍÑ¡¢ +Ê£À½¡¢ºÆÇÛÉÛ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¤¬¡¢Á´¤ÆÌµÊݾڤȤµ¤»¤Æ¤¤¤¿¤À¤­¤Þ¤¹¡£ diff --git a/third_party/fonts/other/doc/oradano/README.txt b/third_party/fonts/other/doc/oradano/README.txt new file mode 100644 index 0000000..fac26be --- /dev/null +++ b/third_party/fonts/other/doc/oradano/README.txt @@ -0,0 +1,44 @@ +ORADANO–¾’©ƒtƒHƒ“ƒg Ver. 0.2003.1026 ‚ɂ‚¢‚Ä + +2003”N10ŒŽ26“ú +“à“c–¾ + + + +¡ORADANO–¾’©ƒtƒHƒ“ƒg‚Ƃ͉½‚© + +ORADANO–¾’©ƒtƒHƒ“ƒg‚Æ‚ÍAJIS X 0213:2000 ‚Ì”ñŠ¿Žš‚Ì‘S‚ĂƊ¿Žš‚Ì‚²‚­ +ˆê•”‚ðŽÀ‘•‚·‚邱‚Æ‚ð–ÚŽw‚µ‚Ä“à“c‚ª»ì’†‚̃tƒHƒ“ƒg‚Å‚·B + +‚±‚̃tƒHƒ“ƒg‚ªŽÀ‘•‚µ‚Ä‚¢‚鉼–¼‚¨‚æ‚щ¼–¼‚É€‚¸‚é‹L†‚ÍA“Œ‹ž’z’nŠˆ”Å +»‘¢Š‚ª–¾Ž¡30”N-31”N‚ɔ̔„‚µ‚ ‚é‚¢‚͈óü‚µ‚Ä‚¢‚½ŒÜ†ŠˆŽš(g’z’n‘Ì‘O +ŠúŒÜ†‰¼–¼h‚ÌÅIŒ^)‚ÉŠî‚«A“à“c‚ªƒAƒEƒgƒ‰ƒCƒ“‰»‚µ‚½‚à‚̂ł·B‚» +‚êˆÈŠO‚Ì”ñŠ¿Žš‚ÍA“à“c‚ªV‹K‚ɃfƒUƒCƒ“‚µ‚½‚à‚̂ł·B + +‚±‚̃tƒHƒ“ƒg‚ªŽÀ‘•‚µ‚Ä‚¢‚éŠ¿Žš‚ÍA•¶‰»’¡•¶‰»•”‘Œê‰Ûw–¾’©‘ÌŠˆŽšŽšŒ` +ˆê——x‚ÉŽû˜^‚³‚ê‚Ä‚¢‚éA“Œ‹ž’z’nŠˆ”Å»‘¢Š‚Ì‘å³2”N”Ō܆–¾’©ŠˆŽš‘ +”Œ©–{‚É‚æ‚鎚‘Ì‚ðŽQÆ‚µ‚‚ÂA“à“c‚ªƒAƒEƒgƒ‰ƒCƒ“ƒf[ƒ^‚ð•`‚«‹N‚±‚µ‚Ä +‚¢‚é‚à‚̂ł·B + + +¡ORADANO–¾’©ƒtƒHƒ“ƒg‚Ì—˜—p + +‚±‚̃tƒHƒ“ƒg‚ÍAˆóüE•\ަA“dŽq•¶‘‚Ö‚Ì–„‚ßž‚Ý“™‚Ì–Ú“I‚ÅA’N‚à‚ªŽ© +—R‚É–³ž‚Å—p‚¢‚邱‚Æ‚ª‚Å‚«‚Ü‚·B +‚±‚̃tƒHƒ“ƒg‚Ì”z•zEÄ”z•z‚ÍAŽ©—R‚É–³ž‚Ås‚¤‚±‚Æ‚ª‚Å‚«‚Ü‚·B +‚±‚̃tƒHƒ“ƒg‚ðA‚æ‚è‘å‚«‚È‹K–͂̃\ƒtƒgƒEƒGƒAƒpƒbƒP[ƒW‚̈ꕔ‚Æ‚µ‚Ä”Ì +”„‚·‚é‚Ȃǂµ‚Ä‚à\‚¢‚Ü‚¹‚ñB +‚±‚̃tƒHƒ“ƒg‚ð—p‚¢‚ÄV‚½‚ȃtƒHƒ“ƒg‚ÌŠJ”­‚ðs‚¤‚±‚Æ‚à‰Â”\‚Å‚·B + + +¡ORADANO–¾’©ƒtƒHƒ“ƒg‚Ì–ÆÓŽ–€ + +ORADANO–¾’©ƒtƒHƒ“ƒg‚ÍAu‚ ‚邪‚Ü‚Üv‚Å’ñ‹Ÿ‚³‚ê‚镨‚Å‚ ‚èA»ìŽÒ‚¨‚æ +‚ÑÄ”z•zŽÒ‚ÍAŒö“IEŽ„“I‚È‹KŠi‚⌾ŒêеK‚Ö‚Ì“K‡«A‰½‚ç‚©‚Ì—p“r‚Ö‚Ì +—L—p«‚ȂǂÌA•iŽ¿‚ÉŠÖ‚·‚é•ÛØ‚ðˆêØs‚¢‚Ü‚¹‚ñB +‚±‚̃tƒHƒ“ƒg‚Ì—˜—p‚É‹Nˆö‚·‚鑹ŠQ‚ɑ΂µA‚»‚ÌÓ”C‚Í‚·‚ׂė˜—pŽÒ‚ª•‰‚¤ +‚à‚̂Ƃµ‚Ü‚·B‘¹ŠQ‚Ì‹N‚±‚é‰Â”\«‚ª’m‚ç‚ê‚Ä‚¢‚½ê‡‚Å‚àA»ìŽÒ‚¨‚æ‚Ñ +Ä”z•zŽÒ‚ÍA–@“IE“¹‹`“I‚ÈÓ”C‚𕉂¤‚±‚Ƃ͂ ‚è‚Ü‚¹‚ñB +»ìŽÒ‚¨‚æ‚ÑÄ”z•zŽÒ‚ÍA‚±‚̃tƒHƒ“ƒg‚É•s‹ï‡‚ª”­Œ©‚³‚ꂽ‚Æ‚«‚ÉA‚»‚ê +‚ðC³E’m‚·‚é‹`–±‚𕉂¢‚Ü‚¹‚ñB + diff --git a/third_party/fonts/other/doc/shinonome/LICENSE b/third_party/fonts/other/doc/shinonome/LICENSE new file mode 100644 index 0000000..424cd74 --- /dev/null +++ b/third_party/fonts/other/doc/shinonome/LICENSE @@ -0,0 +1,14 @@ +¡üÅì±À¥Õ¥©¥ó¥È¥é¥¤¥»¥ó¥¹ + 2001 + The Electronic Font Open Laboratory + http://openlab.ring.gr.jp/efont/ + +¤³¤Î¥¢¡¼¥«¥¤¥Ö¤Ë´Þ¤Þ¤ì¤ë¤¹¤Ù¤Æ¤Î¥Õ¥©¥ó¥È¥Ç¡¼¥¿¡¢¥É¥­¥å¥á¥ó¥È¡¢¥¹¥¯¥ê¥× +¥ÈÎà¤Ï¤¹¤Ù¤Æ Public Domain ¤ÇÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹ ¡£ + +⤷¡¢ÆüËܤ˱÷¤¤¤Æ¤Ï¸½»þÅÀ¤ÇÃøºî¸¢¤òÊü´þ¤¹¤ë¤³¤È¤ÏˡΧ¾åÉÔ²Äǽ¤Ç¤¢¤ê¡¢ +AUTHORS ¤ËÎóµó¤µ¤ì¤Æ¤¤¤ëºî¼Ô¤¬¤½¤Î¸¢Íø¤ò¹Ô»È¤·¤Ê¤¤¤ÈÀë¸À¤¹¤ë¤³¤È¤Ç¼Â¼Á +Ū¤Ê Public Domain ¤Ç¤¢¤ë¤È¤·¤Þ¤¹¡£ + +¼«Í³¤Ê²þ¤¡¢Â¾¥Õ¥©¡¼¥Þ¥Ã¥È¤Ø¤ÎÊÑ´¹¡¢Áȹþ¤ß¡¢ºÆÇÛÉÛ¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ +Ʊ»þ¤Ë¡¢¤³¤ì¤é¤Ï¤¹¤Ù¤Æ´°Á´¤Ë̵ÊݾڤǤ¹¡£ diff --git a/third_party/fonts/other/fonts/fontsazanamigothic10x19.c b/third_party/fonts/other/fonts/fontsazanamigothic10x19.c new file mode 100644 index 0000000..1f07ef8 --- /dev/null +++ b/third_party/fonts/other/fonts/fontsazanamigothic10x19.c @@ -0,0 +1,1080 @@ +//***************************************************************************** +// +// fontsazanamigothic10x19.c - Font definition for the 10x19 Sazanamigothic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from Sazanami +// +// Copyright (c) 1990-2003 +// Wada Laboratory, the University of Tokyo. All rights reserved. +// Copyright (c) 2003-2004 +// Electronic Font Open Laboratory (/efont/). All rights reserved +// +// For license, please see README. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 286 in 2 blocks +// Style: sazanamigothic +// Size: 10x19 +// Bold: no +// Italic: no +// Memory usage: 9418 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Sazanamigothic10x19[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 17, + + // + // The height of the font. + // + 20, + + // + // The baseline of the font. + // + 17, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3041 - 0x30ff + // + 0x41, 0x30, 0x00, 0x00, + 0xbf, 0x00, 0x00, 0x00, + 0x84, 0x0a, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x91, 0x01, 0x00, 0x00, // Offset 401 (0x191) + 0x9e, 0x01, 0x00, 0x00, // Offset 414 (0x19e) + 0xc2, 0x01, 0x00, 0x00, // Offset 450 (0x1c2) + 0xe6, 0x01, 0x00, 0x00, // Offset 486 (0x1e6) + 0x0f, 0x02, 0x00, 0x00, // Offset 527 (0x20f) + 0x34, 0x02, 0x00, 0x00, // Offset 564 (0x234) + 0x3d, 0x02, 0x00, 0x00, // Offset 573 (0x23d) + 0x53, 0x02, 0x00, 0x00, // Offset 595 (0x253) + 0x69, 0x02, 0x00, 0x00, // Offset 617 (0x269) + 0x83, 0x02, 0x00, 0x00, // Offset 643 (0x283) + 0x97, 0x02, 0x00, 0x00, // Offset 663 (0x297) + 0xa0, 0x02, 0x00, 0x00, // Offset 672 (0x2a0) + 0xa8, 0x02, 0x00, 0x00, // Offset 680 (0x2a8) + 0xaf, 0x02, 0x00, 0x00, // Offset 687 (0x2af) + 0xc6, 0x02, 0x00, 0x00, // Offset 710 (0x2c6) + 0xe6, 0x02, 0x00, 0x00, // Offset 742 (0x2e6) + 0xf7, 0x02, 0x00, 0x00, // Offset 759 (0x2f7) + 0x0d, 0x03, 0x00, 0x00, // Offset 781 (0x30d) + 0x26, 0x03, 0x00, 0x00, // Offset 806 (0x326) + 0x41, 0x03, 0x00, 0x00, // Offset 833 (0x341) + 0x58, 0x03, 0x00, 0x00, // Offset 856 (0x358) + 0x76, 0x03, 0x00, 0x00, // Offset 886 (0x376) + 0x89, 0x03, 0x00, 0x00, // Offset 905 (0x389) + 0xa7, 0x03, 0x00, 0x00, // Offset 935 (0x3a7) + 0xc4, 0x03, 0x00, 0x00, // Offset 964 (0x3c4) + 0xce, 0x03, 0x00, 0x00, // Offset 974 (0x3ce) + 0xd9, 0x03, 0x00, 0x00, // Offset 985 (0x3d9) + 0xee, 0x03, 0x00, 0x00, // Offset 1006 (0x3ee) + 0xf7, 0x03, 0x00, 0x00, // Offset 1015 (0x3f7) + 0x0b, 0x04, 0x00, 0x00, // Offset 1035 (0x40b) + 0x22, 0x04, 0x00, 0x00, // Offset 1058 (0x422) + 0x53, 0x04, 0x00, 0x00, // Offset 1107 (0x453) + 0x71, 0x04, 0x00, 0x00, // Offset 1137 (0x471) + 0x8f, 0x04, 0x00, 0x00, // Offset 1167 (0x48f) + 0xaa, 0x04, 0x00, 0x00, // Offset 1194 (0x4aa) + 0xca, 0x04, 0x00, 0x00, // Offset 1226 (0x4ca) + 0xdd, 0x04, 0x00, 0x00, // Offset 1245 (0x4dd) + 0xf1, 0x04, 0x00, 0x00, // Offset 1265 (0x4f1) + 0x11, 0x05, 0x00, 0x00, // Offset 1297 (0x511) + 0x31, 0x05, 0x00, 0x00, // Offset 1329 (0x531) + 0x42, 0x05, 0x00, 0x00, // Offset 1346 (0x542) + 0x59, 0x05, 0x00, 0x00, // Offset 1369 (0x559) + 0x7b, 0x05, 0x00, 0x00, // Offset 1403 (0x57b) + 0x8e, 0x05, 0x00, 0x00, // Offset 1422 (0x58e) + 0xbf, 0x05, 0x00, 0x00, // Offset 1471 (0x5bf) + 0xe8, 0x05, 0x00, 0x00, // Offset 1512 (0x5e8) + 0x07, 0x06, 0x00, 0x00, // Offset 1543 (0x607) + 0x20, 0x06, 0x00, 0x00, // Offset 1568 (0x620) + 0x42, 0x06, 0x00, 0x00, // Offset 1602 (0x642) + 0x61, 0x06, 0x00, 0x00, // Offset 1633 (0x661) + 0x79, 0x06, 0x00, 0x00, // Offset 1657 (0x679) + 0x8d, 0x06, 0x00, 0x00, // Offset 1677 (0x68d) + 0xad, 0x06, 0x00, 0x00, // Offset 1709 (0x6ad) + 0xcc, 0x06, 0x00, 0x00, // Offset 1740 (0x6cc) + 0xfd, 0x06, 0x00, 0x00, // Offset 1789 (0x6fd) + 0x1b, 0x07, 0x00, 0x00, // Offset 1819 (0x71b) + 0x36, 0x07, 0x00, 0x00, // Offset 1846 (0x736) + 0x49, 0x07, 0x00, 0x00, // Offset 1865 (0x749) + 0x5e, 0x07, 0x00, 0x00, // Offset 1886 (0x75e) + 0x73, 0x07, 0x00, 0x00, // Offset 1907 (0x773) + 0x88, 0x07, 0x00, 0x00, // Offset 1928 (0x788) + 0x92, 0x07, 0x00, 0x00, // Offset 1938 (0x792) + 0x98, 0x07, 0x00, 0x00, // Offset 1944 (0x798) + 0xa1, 0x07, 0x00, 0x00, // Offset 1953 (0x7a1) + 0xb9, 0x07, 0x00, 0x00, // Offset 1977 (0x7b9) + 0xd6, 0x07, 0x00, 0x00, // Offset 2006 (0x7d6) + 0xea, 0x07, 0x00, 0x00, // Offset 2026 (0x7ea) + 0x07, 0x08, 0x00, 0x00, // Offset 2055 (0x807) + 0x1c, 0x08, 0x00, 0x00, // Offset 2076 (0x81c) + 0x30, 0x08, 0x00, 0x00, // Offset 2096 (0x830) + 0x4c, 0x08, 0x00, 0x00, // Offset 2124 (0x84c) + 0x69, 0x08, 0x00, 0x00, // Offset 2153 (0x869) + 0x78, 0x08, 0x00, 0x00, // Offset 2168 (0x878) + 0x8d, 0x08, 0x00, 0x00, // Offset 2189 (0x88d) + 0xaa, 0x08, 0x00, 0x00, // Offset 2218 (0x8aa) + 0xbb, 0x08, 0x00, 0x00, // Offset 2235 (0x8bb) + 0xdf, 0x08, 0x00, 0x00, // Offset 2271 (0x8df) + 0xf9, 0x08, 0x00, 0x00, // Offset 2297 (0x8f9) + 0x11, 0x09, 0x00, 0x00, // Offset 2321 (0x911) + 0x2c, 0x09, 0x00, 0x00, // Offset 2348 (0x92c) + 0x46, 0x09, 0x00, 0x00, // Offset 2374 (0x946) + 0x58, 0x09, 0x00, 0x00, // Offset 2392 (0x958) + 0x6c, 0x09, 0x00, 0x00, // Offset 2412 (0x96c) + 0x7f, 0x09, 0x00, 0x00, // Offset 2431 (0x97f) + 0x99, 0x09, 0x00, 0x00, // Offset 2457 (0x999) + 0xb1, 0x09, 0x00, 0x00, // Offset 2481 (0x9b1) + 0xd6, 0x09, 0x00, 0x00, // Offset 2518 (0x9d6) + 0xee, 0x09, 0x00, 0x00, // Offset 2542 (0x9ee) + 0x06, 0x0a, 0x00, 0x00, // Offset 2566 (0xa06) + 0x16, 0x0a, 0x00, 0x00, // Offset 2582 (0xa16) + 0x2c, 0x0a, 0x00, 0x00, // Offset 2604 (0xa2c) + 0x42, 0x0a, 0x00, 0x00, // Offset 2626 (0xa42) + 0x58, 0x0a, 0x00, 0x00, // Offset 2648 (0xa58) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 4, 12, 0, 30, 17, 3, 113, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 114, 18, 112, 13, 8, 162, + 18, 34, 18, 49, 33, 49, 33, 0, 15, 64, 36, 10, + 209, 49, 81, 49, 81, 49, 81, 49, 56, 49, 49, 81, + 49, 81, 49, 81, 49, 81, 49, 81, 49, 81, 49, 56, + 49, 49, 81, 49, 81, 49, 81, 49, 240, 144, 36, 10, + 225, 145, 131, 97, 17, 18, 49, 33, 33, 49, 33, 97, + 33, 113, 17, 131, 129, 18, 97, 49, 17, 49, 49, 17, + 49, 49, 33, 33, 33, 69, 113, 145, 145, 240, 41, 9, + 240, 161, 34, 65, 17, 33, 33, 33, 33, 33, 33, 33, + 17, 49, 33, 17, 66, 17, 129, 113, 129, 18, 65, 17, + 33, 49, 17, 33, 33, 33, 33, 33, 33, 33, 17, 66, + 33, 240, 176, 37, 11, 240, 240, 99, 113, 49, 81, 65, + 81, 65, 97, 33, 113, 17, 145, 145, 17, 49, 49, 33, + 49, 33, 65, 17, 49, 65, 17, 49, 81, 81, 51, 83, + 50, 240, 240, 64, 9, 3, 50, 18, 33, 17, 0, 5, + 112, 22, 6, 65, 65, 65, 81, 65, 81, 81, 65, 81, + 81, 81, 81, 97, 81, 81, 97, 81, 97, 97, 112, 22, + 6, 1, 97, 97, 81, 97, 81, 81, 97, 81, 81, 81, + 81, 65, 81, 81, 65, 81, 65, 65, 176, 26, 8, 240, + 240, 81, 113, 65, 33, 33, 33, 17, 17, 67, 97, 99, + 65, 17, 17, 33, 33, 33, 65, 113, 240, 240, 224, 20, + 10, 240, 240, 65, 145, 145, 145, 145, 145, 89, 81, 145, + 145, 145, 145, 145, 240, 240, 240, 9, 3, 240, 240, 242, + 18, 33, 17, 80, 8, 9, 0, 10, 24, 0, 11, 48, + 7, 3, 240, 240, 242, 18, 160, 23, 10, 240, 49, 145, + 129, 145, 129, 145, 129, 145, 129, 145, 129, 145, 129, 145, + 129, 145, 129, 145, 240, 64, 32, 9, 240, 242, 97, 33, + 65, 65, 49, 65, 33, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 17, 97, 33, 65, 49, 65, 65, 33, 98, 240, + 240, 16, 17, 4, 225, 19, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 208, 22, 9, 240, 228, 65, + 65, 33, 97, 17, 97, 129, 113, 129, 113, 113, 113, 113, + 113, 113, 136, 240, 208, 25, 9, 240, 228, 65, 65, 33, + 97, 17, 97, 129, 113, 98, 145, 145, 129, 17, 97, 17, + 97, 33, 65, 68, 240, 240, 27, 9, 240, 240, 18, 114, + 97, 17, 97, 17, 81, 33, 81, 33, 65, 49, 65, 49, + 49, 65, 56, 97, 129, 129, 129, 240, 240, 23, 8, 240, + 151, 17, 113, 113, 113, 113, 19, 50, 49, 129, 113, 113, + 113, 17, 81, 17, 65, 52, 240, 192, 30, 9, 240, 228, + 65, 65, 33, 97, 17, 129, 129, 35, 49, 17, 49, 34, + 81, 17, 97, 17, 97, 17, 97, 17, 97, 33, 65, 68, + 240, 240, 19, 8, 240, 151, 113, 113, 97, 113, 113, 97, + 113, 113, 97, 113, 113, 97, 113, 240, 224, 30, 9, 240, + 228, 65, 65, 33, 97, 17, 97, 17, 97, 33, 65, 68, + 65, 65, 33, 97, 17, 97, 17, 97, 17, 97, 33, 65, + 68, 240, 240, 29, 9, 240, 228, 65, 65, 33, 97, 17, + 97, 17, 97, 17, 97, 17, 97, 33, 66, 52, 17, 129, + 129, 17, 97, 33, 65, 68, 240, 240, 10, 3, 240, 50, + 18, 240, 18, 18, 240, 16, 11, 3, 240, 50, 18, 240, + 18, 18, 33, 17, 176, 21, 9, 240, 240, 65, 113, 113, + 113, 113, 113, 113, 113, 145, 145, 145, 145, 145, 145, 145, + 240, 64, 9, 9, 0, 9, 8, 240, 216, 0, 8, 20, + 9, 240, 193, 145, 145, 145, 145, 145, 145, 145, 113, 113, + 113, 113, 113, 113, 113, 240, 176, 23, 10, 240, 240, 37, + 65, 81, 33, 113, 17, 113, 145, 129, 129, 129, 129, 145, + 145, 240, 210, 130, 240, 160, 49, 10, 240, 132, 81, 65, + 49, 81, 49, 65, 17, 17, 51, 17, 17, 33, 33, 17, + 17, 33, 33, 17, 17, 17, 49, 17, 17, 17, 33, 33, + 17, 17, 33, 33, 17, 17, 33, 33, 17, 34, 18, 49, + 145, 97, 49, 65, 84, 240, 128, 30, 9, 240, 242, 114, + 97, 33, 81, 33, 81, 33, 81, 33, 65, 65, 49, 65, + 54, 49, 65, 33, 97, 17, 97, 17, 97, 17, 97, 240, + 208, 30, 9, 240, 198, 49, 81, 33, 97, 17, 97, 17, + 97, 17, 81, 38, 49, 81, 33, 97, 17, 97, 17, 97, + 17, 97, 17, 81, 38, 240, 240, 27, 10, 240, 240, 52, + 81, 65, 49, 97, 33, 97, 17, 145, 145, 145, 145, 145, + 161, 97, 33, 97, 49, 65, 84, 240, 240, 48, 32, 9, + 240, 197, 65, 65, 49, 81, 33, 81, 33, 97, 17, 97, + 17, 97, 17, 97, 17, 97, 17, 97, 17, 81, 33, 81, + 33, 65, 53, 240, 240, 16, 19, 9, 240, 200, 17, 129, + 129, 129, 129, 135, 33, 129, 129, 129, 129, 129, 136, 240, + 208, 20, 9, 240, 200, 17, 129, 129, 129, 129, 135, 33, + 129, 129, 129, 129, 129, 129, 240, 240, 80, 32, 10, 240, + 240, 52, 81, 65, 49, 97, 33, 97, 17, 145, 145, 145, + 68, 17, 113, 17, 113, 33, 97, 33, 82, 49, 49, 17, + 67, 33, 240, 240, 16, 32, 9, 240, 193, 97, 17, 97, + 17, 97, 17, 97, 17, 97, 17, 97, 24, 17, 97, 17, + 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, 240, + 208, 17, 4, 195, 33, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 35, 208, 23, 7, 240, 177, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 17, 65, 17, 65, + 33, 33, 66, 240, 32, 34, 9, 240, 193, 81, 33, 65, + 49, 65, 49, 49, 65, 33, 81, 33, 81, 17, 17, 66, + 33, 65, 65, 49, 65, 49, 81, 33, 81, 33, 97, 17, + 97, 240, 208, 19, 8, 240, 145, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 119, 240, 160, 49, 10, + 240, 241, 113, 17, 113, 18, 82, 18, 82, 18, 82, 17, + 17, 49, 17, 17, 17, 49, 17, 17, 17, 49, 17, 17, + 33, 17, 33, 17, 33, 17, 33, 17, 33, 17, 33, 17, + 49, 49, 17, 49, 49, 17, 49, 49, 240, 240, 16, 41, + 9, 240, 193, 97, 18, 81, 18, 81, 17, 17, 65, 17, + 17, 65, 17, 33, 49, 17, 33, 49, 17, 49, 33, 17, + 49, 33, 17, 65, 17, 17, 65, 17, 17, 82, 17, 82, + 17, 97, 240, 208, 31, 9, 240, 228, 65, 65, 49, 65, + 33, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 17, 97, 33, 65, 49, 65, 68, 240, 240, 25, + 9, 240, 198, 49, 81, 33, 97, 17, 97, 17, 97, 17, + 81, 38, 49, 129, 129, 129, 129, 129, 129, 240, 240, 80, + 34, 9, 240, 228, 65, 65, 49, 65, 33, 97, 17, 97, + 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, 49, + 33, 33, 50, 49, 65, 68, 17, 129, 240, 64, 31, 9, + 240, 198, 49, 81, 33, 97, 17, 97, 17, 97, 17, 81, + 38, 49, 49, 65, 65, 49, 65, 49, 81, 33, 81, 33, + 97, 17, 97, 240, 208, 24, 9, 240, 228, 65, 65, 33, + 97, 17, 129, 146, 146, 146, 145, 129, 17, 97, 17, 97, + 33, 65, 68, 240, 240, 20, 10, 240, 249, 81, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, 240, 240, + 80, 32, 9, 240, 193, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 17, 97, 33, 65, 68, 240, 240, 31, 9, 240, + 193, 97, 17, 97, 17, 97, 17, 97, 33, 65, 49, 65, + 49, 65, 49, 65, 65, 33, 81, 33, 81, 33, 98, 114, + 114, 240, 240, 16, 49, 10, 240, 241, 49, 49, 17, 49, + 49, 17, 49, 49, 17, 49, 49, 17, 49, 49, 33, 17, + 17, 17, 49, 17, 17, 17, 49, 17, 17, 17, 49, 17, + 17, 17, 49, 17, 17, 17, 65, 49, 81, 49, 81, 49, + 81, 49, 240, 240, 48, 30, 9, 240, 193, 97, 17, 97, + 33, 65, 49, 49, 81, 33, 83, 113, 130, 97, 17, 97, + 33, 65, 65, 49, 65, 33, 97, 17, 97, 240, 208, 27, + 10, 240, 241, 113, 17, 113, 33, 81, 65, 49, 81, 49, + 97, 17, 113, 17, 129, 145, 145, 145, 145, 145, 145, 240, + 240, 80, 19, 9, 240, 199, 129, 113, 129, 113, 129, 113, + 129, 113, 129, 113, 129, 113, 136, 240, 208, 21, 6, 101, + 17, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 85, 112, 21, 10, 161, 145, 161, 145, + 161, 145, 161, 145, 161, 145, 161, 145, 161, 145, 161, 145, + 161, 145, 176, 21, 6, 101, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 21, 112, + 10, 7, 146, 65, 33, 33, 65, 0, 14, 16, 6, 11, + 0, 24, 106, 192, 9, 3, 50, 18, 17, 49, 0, 5, + 96, 24, 9, 0, 8, 20, 65, 65, 33, 97, 114, 67, + 17, 34, 65, 17, 97, 17, 97, 17, 82, 37, 17, 240, + 208, 29, 8, 240, 145, 113, 113, 113, 113, 19, 50, 49, + 33, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, + 18, 49, 33, 19, 240, 192, 20, 9, 0, 8, 20, 65, + 65, 33, 97, 17, 129, 129, 129, 129, 97, 33, 65, 68, + 240, 240, 29, 8, 240, 241, 113, 113, 113, 51, 17, 33, + 50, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 33, 50, 51, 17, 240, 160, 21, 9, 0, 8, 20, + 65, 65, 33, 97, 17, 97, 24, 17, 129, 129, 97, 33, + 65, 68, 240, 240, 20, 8, 240, 195, 65, 49, 49, 113, + 86, 65, 113, 113, 113, 113, 113, 113, 113, 113, 240, 224, + 28, 10, 0, 8, 65, 52, 17, 49, 65, 65, 65, 65, + 65, 65, 65, 84, 81, 163, 97, 51, 33, 113, 17, 113, + 17, 113, 39, 32, 29, 8, 240, 145, 113, 113, 113, 113, + 20, 34, 65, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 240, 160, 15, 3, 146, + 18, 129, 33, 33, 33, 33, 33, 33, 33, 33, 33, 160, + 21, 6, 240, 98, 66, 240, 33, 81, 81, 81, 81, 81, + 81, 81, 81, 17, 49, 17, 49, 35, 128, 29, 8, 240, + 145, 113, 113, 113, 113, 65, 33, 49, 49, 33, 65, 33, + 65, 17, 82, 17, 65, 49, 49, 49, 49, 65, 33, 81, + 240, 160, 17, 3, 146, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 160, 36, 8, 0, 7, 1, + 17, 18, 34, 17, 33, 17, 33, 33, 17, 33, 33, 17, + 33, 33, 17, 33, 33, 17, 33, 33, 17, 33, 33, 17, + 33, 33, 17, 33, 33, 240, 160, 26, 8, 0, 7, 1, + 20, 34, 65, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 240, 160, 24, 9, 0, + 8, 20, 65, 65, 33, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 17, 97, 33, 65, 68, 240, 240, 27, 8, 0, + 7, 1, 19, 50, 49, 33, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 18, 49, 33, 19, 49, 113, 113, 113, 112, + 26, 8, 0, 7, 35, 17, 33, 50, 17, 81, 17, 81, + 17, 81, 17, 81, 17, 81, 33, 50, 51, 17, 113, 113, + 113, 113, 18, 7, 0, 6, 17, 35, 17, 17, 66, 81, + 97, 97, 97, 97, 97, 97, 240, 192, 20, 9, 0, 8, + 21, 49, 81, 33, 81, 33, 147, 146, 145, 17, 97, 33, + 81, 53, 240, 224, 19, 8, 240, 193, 113, 113, 113, 71, + 65, 113, 113, 113, 113, 113, 113, 113, 130, 240, 176, 26, + 8, 0, 7, 1, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 66, 36, 17, 240, + 160, 24, 8, 0, 7, 1, 81, 17, 81, 17, 81, 33, + 49, 49, 49, 49, 49, 65, 17, 81, 17, 97, 113, 240, + 208, 37, 10, 0, 8, 97, 49, 49, 17, 49, 49, 17, + 49, 49, 17, 49, 49, 33, 17, 17, 17, 49, 17, 17, + 17, 49, 17, 17, 17, 65, 49, 81, 49, 81, 49, 240, + 240, 48, 24, 8, 0, 7, 1, 81, 33, 49, 49, 49, + 65, 17, 97, 113, 97, 17, 65, 49, 49, 49, 33, 81, + 240, 160, 24, 8, 0, 7, 1, 81, 17, 81, 17, 81, + 33, 49, 49, 49, 65, 17, 81, 17, 97, 113, 113, 97, + 82, 224, 16, 9, 0, 7, 120, 113, 113, 129, 113, 113, + 113, 129, 113, 120, 240, 208, 22, 6, 65, 65, 81, 65, + 81, 81, 81, 81, 81, 50, 97, 81, 81, 81, 81, 81, + 97, 81, 97, 112, 22, 2, 1, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 22, 6, 1, 97, 81, 97, 81, 81, 81, 81, + 81, 98, 49, 81, 81, 81, 81, 81, 65, 81, 65, 176, + 11, 9, 240, 66, 97, 34, 33, 98, 0, 17, 16, + 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3041 - 0x30ff + // + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x20, 0x03, 0x00, 0x00, // Offset 800 (0x320) + 0x53, 0x03, 0x00, 0x00, // Offset 851 (0x353) + 0x6c, 0x03, 0x00, 0x00, // Offset 876 (0x36c) + 0x8d, 0x03, 0x00, 0x00, // Offset 909 (0x38d) + 0x9f, 0x03, 0x00, 0x00, // Offset 927 (0x39f) + 0xb7, 0x03, 0x00, 0x00, // Offset 951 (0x3b7) + 0xd0, 0x03, 0x00, 0x00, // Offset 976 (0x3d0) + 0xef, 0x03, 0x00, 0x00, // Offset 1007 (0x3ef) + 0x0f, 0x04, 0x00, 0x00, // Offset 1039 (0x40f) + 0x3e, 0x04, 0x00, 0x00, // Offset 1086 (0x43e) + 0x6b, 0x04, 0x00, 0x00, // Offset 1131 (0x46b) + 0x9a, 0x04, 0x00, 0x00, // Offset 1178 (0x49a) + 0xb4, 0x04, 0x00, 0x00, // Offset 1204 (0x4b4) + 0xda, 0x04, 0x00, 0x00, // Offset 1242 (0x4da) + 0xf0, 0x04, 0x00, 0x00, // Offset 1264 (0x4f0) + 0x0b, 0x05, 0x00, 0x00, // Offset 1291 (0x50b) + 0x33, 0x05, 0x00, 0x00, // Offset 1331 (0x533) + 0x60, 0x05, 0x00, 0x00, // Offset 1376 (0x560) + 0x6f, 0x05, 0x00, 0x00, // Offset 1391 (0x56f) + 0x82, 0x05, 0x00, 0x00, // Offset 1410 (0x582) + 0x9d, 0x05, 0x00, 0x00, // Offset 1437 (0x59d) + 0xc4, 0x05, 0x00, 0x00, // Offset 1476 (0x5c4) + 0xde, 0x05, 0x00, 0x00, // Offset 1502 (0x5de) + 0xfe, 0x05, 0x00, 0x00, // Offset 1534 (0x5fe) + 0x20, 0x06, 0x00, 0x00, // Offset 1568 (0x620) + 0x47, 0x06, 0x00, 0x00, // Offset 1607 (0x647) + 0x6e, 0x06, 0x00, 0x00, // Offset 1646 (0x66e) + 0x98, 0x06, 0x00, 0x00, // Offset 1688 (0x698) + 0xb7, 0x06, 0x00, 0x00, // Offset 1719 (0x6b7) + 0xdd, 0x06, 0x00, 0x00, // Offset 1757 (0x6dd) + 0x03, 0x07, 0x00, 0x00, // Offset 1795 (0x703) + 0x2d, 0x07, 0x00, 0x00, // Offset 1837 (0x72d) + 0x4b, 0x07, 0x00, 0x00, // Offset 1867 (0x74b) + 0x75, 0x07, 0x00, 0x00, // Offset 1909 (0x775) + 0x85, 0x07, 0x00, 0x00, // Offset 1925 (0x785) + 0xa1, 0x07, 0x00, 0x00, // Offset 1953 (0x7a1) + 0xc1, 0x07, 0x00, 0x00, // Offset 1985 (0x7c1) + 0xdb, 0x07, 0x00, 0x00, // Offset 2011 (0x7db) + 0xf9, 0x07, 0x00, 0x00, // Offset 2041 (0x7f9) + 0x11, 0x08, 0x00, 0x00, // Offset 2065 (0x811) + 0x32, 0x08, 0x00, 0x00, // Offset 2098 (0x832) + 0x58, 0x08, 0x00, 0x00, // Offset 2136 (0x858) + 0x80, 0x08, 0x00, 0x00, // Offset 2176 (0x880) + 0xbb, 0x08, 0x00, 0x00, // Offset 2235 (0x8bb) + 0xee, 0x08, 0x00, 0x00, // Offset 2286 (0x8ee) + 0x1d, 0x09, 0x00, 0x00, // Offset 2333 (0x91d) + 0x4b, 0x09, 0x00, 0x00, // Offset 2379 (0x94b) + 0x7c, 0x09, 0x00, 0x00, // Offset 2428 (0x97c) + 0xb0, 0x09, 0x00, 0x00, // Offset 2480 (0x9b0) + 0xda, 0x09, 0x00, 0x00, // Offset 2522 (0x9da) + 0x0a, 0x0a, 0x00, 0x00, // Offset 2570 (0xa0a) + 0x3a, 0x0a, 0x00, 0x00, // Offset 2618 (0xa3a) + 0x63, 0x0a, 0x00, 0x00, // Offset 2659 (0xa63) + 0x8d, 0x0a, 0x00, 0x00, // Offset 2701 (0xa8d) + 0xb8, 0x0a, 0x00, 0x00, // Offset 2744 (0xab8) + 0xd2, 0x0a, 0x00, 0x00, // Offset 2770 (0xad2) + 0xf0, 0x0a, 0x00, 0x00, // Offset 2800 (0xaf0) + 0x10, 0x0b, 0x00, 0x00, // Offset 2832 (0xb10) + 0x3d, 0x0b, 0x00, 0x00, // Offset 2877 (0xb3d) + 0x6c, 0x0b, 0x00, 0x00, // Offset 2924 (0xb6c) + 0x9d, 0x0b, 0x00, 0x00, // Offset 2973 (0xb9d) + 0xb9, 0x0b, 0x00, 0x00, // Offset 3001 (0xbb9) + 0xe4, 0x0b, 0x00, 0x00, // Offset 3044 (0xbe4) + 0x0d, 0x0c, 0x00, 0x00, // Offset 3085 (0xc0d) + 0x43, 0x0c, 0x00, 0x00, // Offset 3139 (0xc43) + 0x62, 0x0c, 0x00, 0x00, // Offset 3170 (0xc62) + 0x7e, 0x0c, 0x00, 0x00, // Offset 3198 (0xc7e) + 0xa7, 0x0c, 0x00, 0x00, // Offset 3239 (0xca7) + 0xcd, 0x0c, 0x00, 0x00, // Offset 3277 (0xccd) + 0x01, 0x0d, 0x00, 0x00, // Offset 3329 (0xd01) + 0x17, 0x0d, 0x00, 0x00, // Offset 3351 (0xd17) + 0x34, 0x0d, 0x00, 0x00, // Offset 3380 (0xd34) + 0x51, 0x0d, 0x00, 0x00, // Offset 3409 (0xd51) + 0x74, 0x0d, 0x00, 0x00, // Offset 3444 (0xd74) + 0x96, 0x0d, 0x00, 0x00, // Offset 3478 (0xd96) + 0xc9, 0x0d, 0x00, 0x00, // Offset 3529 (0xdc9) + 0xe6, 0x0d, 0x00, 0x00, // Offset 3558 (0xde6) + 0x05, 0x0e, 0x00, 0x00, // Offset 3589 (0xe05) + 0x34, 0x0e, 0x00, 0x00, // Offset 3636 (0xe34) + 0x64, 0x0e, 0x00, 0x00, // Offset 3684 (0xe64) + 0x8f, 0x0e, 0x00, 0x00, // Offset 3727 (0xe8f) + 0xae, 0x0e, 0x00, 0x00, // Offset 3758 (0xeae) + 0xd9, 0x0e, 0x00, 0x00, // Offset 3801 (0xed9) + 0xf6, 0x0e, 0x00, 0x00, // Offset 3830 (0xef6) + 0x17, 0x0f, 0x00, 0x00, // Offset 3863 (0xf17) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x36, 0x0f, 0x00, 0x00, // Offset 3894 (0xf36) + 0x41, 0x0f, 0x00, 0x00, // Offset 3905 (0xf41) + 0x4e, 0x0f, 0x00, 0x00, // Offset 3918 (0xf4e) + 0x5e, 0x0f, 0x00, 0x00, // Offset 3934 (0xf5e) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x75, 0x0f, 0x00, 0x00, // Offset 3957 (0xf75) + 0x89, 0x0f, 0x00, 0x00, // Offset 3977 (0xf89) + 0xa9, 0x0f, 0x00, 0x00, // Offset 4009 (0xfa9) + 0xbe, 0x0f, 0x00, 0x00, // Offset 4030 (0xfbe) + 0xd9, 0x0f, 0x00, 0x00, // Offset 4057 (0xfd9) + 0xef, 0x0f, 0x00, 0x00, // Offset 4079 (0xfef) + 0x0b, 0x10, 0x00, 0x00, // Offset 4107 (0x100b) + 0x1a, 0x10, 0x00, 0x00, // Offset 4122 (0x101a) + 0x37, 0x10, 0x00, 0x00, // Offset 4151 (0x1037) + 0x4e, 0x10, 0x00, 0x00, // Offset 4174 (0x104e) + 0x74, 0x10, 0x00, 0x00, // Offset 4212 (0x1074) + 0x98, 0x10, 0x00, 0x00, // Offset 4248 (0x1098) + 0xc0, 0x10, 0x00, 0x00, // Offset 4288 (0x10c0) + 0xe6, 0x10, 0x00, 0x00, // Offset 4326 (0x10e6) + 0x0d, 0x11, 0x00, 0x00, // Offset 4365 (0x110d) + 0x29, 0x11, 0x00, 0x00, // Offset 4393 (0x1129) + 0x4a, 0x11, 0x00, 0x00, // Offset 4426 (0x114a) + 0x66, 0x11, 0x00, 0x00, // Offset 4454 (0x1166) + 0x85, 0x11, 0x00, 0x00, // Offset 4485 (0x1185) + 0x98, 0x11, 0x00, 0x00, // Offset 4504 (0x1198) + 0xbb, 0x11, 0x00, 0x00, // Offset 4539 (0x11bb) + 0xe2, 0x11, 0x00, 0x00, // Offset 4578 (0x11e2) + 0x0d, 0x12, 0x00, 0x00, // Offset 4621 (0x120d) + 0x28, 0x12, 0x00, 0x00, // Offset 4648 (0x1228) + 0x45, 0x12, 0x00, 0x00, // Offset 4677 (0x1245) + 0x66, 0x12, 0x00, 0x00, // Offset 4710 (0x1266) + 0x8e, 0x12, 0x00, 0x00, // Offset 4750 (0x128e) + 0xb4, 0x12, 0x00, 0x00, // Offset 4788 (0x12b4) + 0xdc, 0x12, 0x00, 0x00, // Offset 4828 (0x12dc) + 0xf5, 0x12, 0x00, 0x00, // Offset 4853 (0x12f5) + 0x15, 0x13, 0x00, 0x00, // Offset 4885 (0x1315) + 0x36, 0x13, 0x00, 0x00, // Offset 4918 (0x1336) + 0x5c, 0x13, 0x00, 0x00, // Offset 4956 (0x135c) + 0x7d, 0x13, 0x00, 0x00, // Offset 4989 (0x137d) + 0xa4, 0x13, 0x00, 0x00, // Offset 5028 (0x13a4) + 0xbc, 0x13, 0x00, 0x00, // Offset 5052 (0x13bc) + 0xda, 0x13, 0x00, 0x00, // Offset 5082 (0x13da) + 0x02, 0x14, 0x00, 0x00, // Offset 5122 (0x1402) + 0x1c, 0x14, 0x00, 0x00, // Offset 5148 (0x141c) + 0x3e, 0x14, 0x00, 0x00, // Offset 5182 (0x143e) + 0x57, 0x14, 0x00, 0x00, // Offset 5207 (0x1457) + 0x76, 0x14, 0x00, 0x00, // Offset 5238 (0x1476) + 0x98, 0x14, 0x00, 0x00, // Offset 5272 (0x1498) + 0xa4, 0x14, 0x00, 0x00, // Offset 5284 (0x14a4) + 0xbf, 0x14, 0x00, 0x00, // Offset 5311 (0x14bf) + 0xdb, 0x14, 0x00, 0x00, // Offset 5339 (0x14db) + 0xf1, 0x14, 0x00, 0x00, // Offset 5361 (0x14f1) + 0x0f, 0x15, 0x00, 0x00, // Offset 5391 (0x150f) + 0x33, 0x15, 0x00, 0x00, // Offset 5427 (0x1533) + 0x56, 0x15, 0x00, 0x00, // Offset 5462 (0x1556) + 0x6d, 0x15, 0x00, 0x00, // Offset 5485 (0x156d) + 0x89, 0x15, 0x00, 0x00, // Offset 5513 (0x1589) + 0xa7, 0x15, 0x00, 0x00, // Offset 5543 (0x15a7) + 0xbc, 0x15, 0x00, 0x00, // Offset 5564 (0x15bc) + 0xdb, 0x15, 0x00, 0x00, // Offset 5595 (0x15db) + 0xfa, 0x15, 0x00, 0x00, // Offset 5626 (0x15fa) + 0x12, 0x16, 0x00, 0x00, // Offset 5650 (0x1612) + 0x2e, 0x16, 0x00, 0x00, // Offset 5678 (0x162e) + 0x4c, 0x16, 0x00, 0x00, // Offset 5708 (0x164c) + 0x77, 0x16, 0x00, 0x00, // Offset 5751 (0x1677) + 0xa4, 0x16, 0x00, 0x00, // Offset 5796 (0x16a4) + 0xd2, 0x16, 0x00, 0x00, // Offset 5842 (0x16d2) + 0xeb, 0x16, 0x00, 0x00, // Offset 5867 (0x16eb) + 0xfe, 0x16, 0x00, 0x00, // Offset 5886 (0x16fe) + 0x24, 0x17, 0x00, 0x00, // Offset 5924 (0x1724) + 0x40, 0x17, 0x00, 0x00, // Offset 5952 (0x1740) + 0x60, 0x17, 0x00, 0x00, // Offset 5984 (0x1760) + 0x79, 0x17, 0x00, 0x00, // Offset 6009 (0x1779) + 0xa2, 0x17, 0x00, 0x00, // Offset 6050 (0x17a2) + 0xb2, 0x17, 0x00, 0x00, // Offset 6066 (0x17b2) + 0xcf, 0x17, 0x00, 0x00, // Offset 6095 (0x17cf) + 0xe0, 0x17, 0x00, 0x00, // Offset 6112 (0x17e0) + 0xf4, 0x17, 0x00, 0x00, // Offset 6132 (0x17f4) + 0x08, 0x18, 0x00, 0x00, // Offset 6152 (0x1808) + 0x26, 0x18, 0x00, 0x00, // Offset 6182 (0x1826) + 0x52, 0x18, 0x00, 0x00, // Offset 6226 (0x1852) + 0x70, 0x18, 0x00, 0x00, // Offset 6256 (0x1870) + 0x90, 0x18, 0x00, 0x00, // Offset 6288 (0x1890) + 0xa4, 0x18, 0x00, 0x00, // Offset 6308 (0x18a4) + 0xbf, 0x18, 0x00, 0x00, // Offset 6335 (0x18bf) + 0xe5, 0x18, 0x00, 0x00, // Offset 6373 (0x18e5) + 0x01, 0x19, 0x00, 0x00, // Offset 6401 (0x1901) + 0x17, 0x19, 0x00, 0x00, // Offset 6423 (0x1917) + 0x2d, 0x19, 0x00, 0x00, // Offset 6445 (0x192d) + 0x52, 0x19, 0x00, 0x00, // Offset 6482 (0x1952) + 0x6d, 0x19, 0x00, 0x00, // Offset 6509 (0x196d) + 0x84, 0x19, 0x00, 0x00, // Offset 6532 (0x1984) + 0xa7, 0x19, 0x00, 0x00, // Offset 6567 (0x19a7) + 0xcd, 0x19, 0x00, 0x00, // Offset 6605 (0x19cd) + 0xeb, 0x19, 0x00, 0x00, // Offset 6635 (0x19eb) + 0x0c, 0x1a, 0x00, 0x00, // Offset 6668 (0x1a0c) + 0x16, 0x1a, 0x00, 0x00, // Offset 6678 (0x1a16) + 0x20, 0x1a, 0x00, 0x00, // Offset 6688 (0x1a20) + 0x30, 0x1a, 0x00, 0x00, // Offset 6704 (0x1a30) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3041 - 0x30ff + // + 36, 13, 0, 10, 33, 193, 33, 102, 145, 49, 129, 49, + 134, 98, 33, 34, 49, 17, 33, 49, 49, 17, 17, 81, + 17, 49, 97, 17, 34, 81, 50, 33, 50, 146, 240, 32, + 51, 17, 240, 113, 240, 17, 240, 17, 240, 17, 203, 145, + 240, 17, 81, 161, 81, 161, 22, 131, 49, 34, 81, 17, + 65, 65, 49, 33, 49, 81, 33, 65, 33, 97, 17, 65, + 17, 113, 17, 66, 113, 33, 49, 17, 113, 51, 49, 66, + 195, 240, 112, 25, 13, 0, 13, 1, 129, 49, 145, 33, + 145, 33, 161, 17, 161, 17, 161, 33, 145, 33, 33, 162, + 193, 240, 240, 80, 33, 17, 0, 6, 65, 240, 17, 240, + 17, 161, 65, 193, 49, 209, 33, 209, 33, 225, 17, 225, + 17, 225, 17, 225, 33, 33, 209, 33, 226, 240, 17, 0, + 8, 18, 9, 0, 7, 3, 146, 227, 51, 49, 145, 129, + 129, 113, 129, 113, 98, 240, 112, 24, 13, 240, 18, 211, + 210, 240, 240, 53, 68, 82, 193, 209, 193, 193, 193, 177, + 193, 177, 177, 162, 146, 240, 80, 25, 12, 0, 7, 114, + 194, 240, 240, 53, 67, 49, 161, 161, 161, 17, 129, 33, + 113, 49, 97, 65, 81, 100, 240, 160, 31, 17, 240, 99, + 240, 35, 0, 8, 6, 116, 65, 241, 241, 242, 225, 33, + 193, 49, 177, 65, 161, 81, 145, 97, 129, 113, 113, 150, + 240, 240, 80, 32, 13, 0, 10, 17, 193, 193, 19, 17, + 53, 81, 81, 113, 65, 193, 21, 83, 81, 49, 17, 113, + 17, 33, 113, 17, 33, 33, 49, 50, 67, 240, 224, 47, + 17, 240, 97, 240, 17, 240, 17, 240, 17, 240, 17, 35, + 34, 70, 113, 97, 161, 81, 240, 17, 240, 17, 38, 131, + 98, 82, 145, 65, 17, 161, 33, 33, 161, 17, 49, 161, + 17, 49, 65, 65, 49, 33, 84, 82, 240, 240, 45, 17, + 240, 113, 240, 17, 240, 17, 241, 240, 17, 113, 133, 65, + 53, 65, 65, 81, 81, 65, 81, 81, 81, 49, 97, 81, + 49, 97, 81, 49, 97, 129, 113, 129, 113, 129, 113, 113, + 113, 129, 65, 33, 226, 240, 176, 47, 18, 240, 129, 240, + 33, 145, 113, 161, 81, 145, 113, 113, 33, 101, 65, 69, + 65, 65, 97, 81, 65, 97, 81, 81, 65, 97, 81, 65, + 97, 81, 65, 97, 145, 113, 145, 113, 145, 113, 129, 113, + 145, 65, 33, 242, 240, 208, 26, 15, 240, 81, 225, 241, + 50, 73, 177, 241, 225, 66, 148, 57, 225, 241, 151, 98, + 97, 81, 225, 225, 242, 247, 240, 64, 38, 17, 240, 113, + 129, 113, 97, 33, 113, 50, 17, 73, 209, 240, 33, 240, + 17, 66, 180, 89, 240, 17, 240, 33, 183, 130, 97, 113, + 240, 17, 240, 17, 240, 34, 240, 39, 240, 128, 22, 9, + 240, 17, 129, 113, 113, 113, 113, 113, 113, 113, 129, 145, + 145, 145, 145, 145, 145, 145, 129, 160, 27, 14, 240, 97, + 209, 193, 193, 193, 97, 81, 129, 49, 97, 81, 129, 49, + 209, 225, 225, 225, 225, 225, 225, 225, 209, 240, 80, 40, + 16, 240, 193, 81, 145, 81, 145, 81, 145, 65, 161, 18, + 17, 72, 49, 161, 65, 161, 65, 161, 65, 161, 65, 161, + 65, 161, 65, 161, 81, 145, 81, 17, 97, 113, 113, 225, + 210, 240, 128, 45, 18, 240, 225, 49, 49, 145, 17, 33, + 33, 145, 33, 65, 145, 97, 161, 18, 49, 72, 81, 161, + 97, 161, 97, 161, 97, 161, 97, 161, 97, 161, 97, 161, + 113, 145, 113, 17, 97, 145, 113, 240, 17, 242, 240, 192, + 15, 14, 240, 240, 227, 230, 0, 14, 49, 209, 209, 226, + 234, 240, 224, 19, 15, 240, 193, 193, 33, 51, 97, 134, + 0, 15, 65, 225, 225, 242, 250, 240, 240, 32, 27, 14, + 240, 81, 209, 209, 225, 50, 132, 55, 17, 209, 225, 209, + 225, 118, 17, 66, 98, 65, 193, 209, 225, 210, 231, 240, + 32, 39, 17, 240, 129, 113, 129, 81, 33, 113, 97, 161, + 50, 180, 103, 17, 240, 17, 240, 33, 240, 17, 240, 33, + 166, 17, 114, 98, 113, 241, 240, 17, 240, 33, 240, 18, + 240, 39, 240, 128, 26, 13, 240, 177, 193, 193, 193, 193, + 193, 193, 193, 193, 193, 193, 193, 193, 161, 17, 145, 33, + 129, 65, 82, 101, 240, 64, 32, 13, 240, 177, 113, 65, + 129, 49, 81, 49, 33, 97, 81, 113, 65, 193, 193, 193, + 193, 193, 193, 193, 161, 17, 145, 33, 129, 65, 82, 101, + 240, 64, 34, 17, 240, 161, 240, 17, 240, 17, 240, 17, + 143, 1, 145, 240, 17, 212, 193, 49, 193, 49, 193, 49, + 193, 49, 212, 240, 17, 241, 240, 17, 241, 241, 240, 208, + 39, 18, 225, 177, 33, 49, 161, 49, 49, 145, 65, 193, + 159, 1, 161, 240, 33, 228, 209, 49, 209, 49, 209, 49, + 209, 49, 228, 240, 33, 240, 17, 240, 33, 240, 17, 240, + 17, 240, 240, 39, 19, 240, 240, 17, 240, 49, 161, 113, + 161, 113, 161, 113, 161, 113, 161, 73, 25, 49, 161, 113, + 161, 113, 161, 113, 161, 67, 177, 240, 49, 240, 65, 240, + 49, 240, 73, 240, 240, 192, 42, 19, 241, 225, 17, 33, + 209, 33, 33, 81, 97, 49, 113, 97, 177, 97, 177, 97, + 177, 57, 40, 49, 177, 97, 177, 97, 177, 97, 177, 51, + 193, 240, 49, 240, 65, 240, 49, 240, 72, 240, 240, 208, + 31, 17, 240, 240, 137, 241, 226, 225, 241, 226, 210, 41, + 23, 34, 225, 241, 240, 17, 241, 240, 17, 240, 17, 240, + 17, 240, 33, 240, 37, 240, 96, 38, 18, 240, 240, 169, + 33, 209, 17, 33, 162, 49, 177, 240, 17, 242, 226, 41, + 39, 34, 241, 240, 17, 240, 33, 240, 17, 240, 33, 240, + 33, 240, 33, 240, 49, 240, 53, 240, 128, 38, 17, 240, + 113, 240, 17, 240, 17, 240, 17, 246, 117, 240, 17, 240, + 17, 71, 65, 240, 17, 240, 17, 240, 17, 241, 240, 17, + 65, 177, 65, 161, 97, 145, 119, 33, 240, 240, 32, 42, + 17, 240, 113, 240, 17, 129, 113, 97, 33, 97, 113, 17, + 86, 49, 53, 240, 17, 240, 17, 71, 65, 240, 17, 240, + 17, 240, 17, 241, 240, 17, 65, 177, 65, 161, 97, 145, + 119, 33, 240, 240, 32, 30, 16, 240, 97, 241, 241, 241, + 36, 72, 193, 241, 241, 241, 52, 113, 34, 66, 81, 17, + 113, 82, 145, 241, 241, 225, 241, 210, 134, 240, 96, 42, + 18, 240, 129, 240, 33, 145, 113, 113, 33, 97, 36, 33, + 56, 225, 240, 33, 240, 33, 240, 33, 52, 145, 34, 66, + 113, 17, 113, 114, 145, 240, 33, 240, 33, 240, 17, 240, + 33, 242, 166, 240, 160, 16, 14, 0, 18, 6, 68, 98, + 225, 209, 209, 193, 178, 132, 240, 240, 48, 28, 18, 0, + 10, 5, 148, 82, 52, 177, 240, 49, 240, 33, 240, 33, + 240, 33, 240, 33, 240, 17, 240, 18, 226, 166, 0, 9, + 96, 32, 18, 240, 240, 49, 241, 33, 241, 181, 148, 82, + 52, 177, 240, 49, 240, 33, 240, 33, 240, 33, 240, 33, + 240, 17, 240, 18, 226, 166, 0, 9, 96, 26, 16, 0, + 7, 7, 24, 34, 209, 225, 225, 225, 241, 225, 241, 241, + 241, 240, 17, 241, 240, 18, 240, 20, 240, 240, 80, 30, + 16, 0, 7, 7, 24, 34, 209, 225, 65, 145, 97, 113, + 65, 161, 81, 129, 241, 241, 241, 240, 17, 241, 240, 18, + 240, 20, 240, 240, 80, 24, 13, 240, 17, 193, 193, 193, + 193, 209, 193, 82, 81, 35, 130, 146, 161, 177, 177, 193, + 193, 210, 217, 240, 192, 33, 16, 240, 65, 129, 97, 145, + 81, 97, 49, 65, 113, 113, 129, 113, 241, 82, 129, 35, + 178, 194, 209, 225, 225, 241, 241, 240, 18, 240, 25, 240, + 240, 96, 38, 16, 240, 97, 241, 241, 225, 19, 34, 54, + 113, 97, 145, 65, 241, 97, 113, 113, 113, 113, 97, 129, + 97, 129, 81, 145, 182, 145, 65, 18, 97, 81, 49, 81, + 81, 165, 240, 112, 40, 17, 240, 240, 81, 240, 17, 240, + 17, 133, 33, 99, 113, 240, 17, 240, 17, 240, 17, 240, + 17, 240, 17, 240, 17, 240, 17, 81, 161, 81, 161, 98, + 145, 119, 33, 17, 241, 240, 240, 16, 59, 18, 240, 193, + 240, 33, 240, 33, 145, 113, 145, 70, 113, 34, 33, 50, + 98, 65, 81, 81, 81, 81, 65, 17, 49, 113, 49, 17, + 49, 113, 33, 49, 17, 129, 33, 49, 17, 129, 33, 65, + 145, 33, 66, 36, 33, 49, 33, 17, 17, 66, 82, 65, + 65, 17, 180, 49, 240, 240, 112, 51, 18, 240, 113, 240, + 33, 240, 33, 240, 33, 240, 35, 36, 86, 18, 65, 129, + 17, 113, 114, 129, 98, 161, 82, 161, 67, 161, 65, 17, + 161, 49, 33, 145, 49, 49, 68, 17, 113, 49, 66, 113, + 49, 65, 17, 97, 68, 49, 81, 240, 240, 16, 47, 17, + 0, 7, 21, 162, 33, 34, 113, 65, 65, 81, 81, 81, + 49, 97, 81, 49, 81, 113, 17, 97, 113, 17, 97, 113, + 17, 97, 113, 17, 81, 129, 17, 81, 129, 17, 65, 129, + 49, 49, 129, 67, 114, 195, 240, 240, 144, 46, 17, 240, + 49, 145, 97, 145, 97, 145, 97, 145, 81, 161, 81, 90, + 17, 161, 81, 161, 81, 161, 81, 161, 81, 161, 81, 161, + 81, 161, 81, 101, 81, 81, 67, 49, 81, 65, 34, 17, + 17, 49, 65, 97, 84, 240, 128, 49, 18, 226, 49, 145, + 65, 33, 145, 18, 65, 145, 49, 49, 145, 97, 161, 97, + 90, 33, 161, 97, 161, 97, 161, 97, 161, 97, 161, 97, + 161, 97, 161, 97, 101, 97, 81, 67, 65, 81, 65, 34, + 33, 17, 49, 65, 113, 84, 240, 160, 52, 18, 240, 65, + 145, 34, 49, 145, 17, 33, 33, 145, 17, 33, 33, 145, + 34, 33, 161, 97, 90, 33, 161, 97, 161, 97, 161, 97, + 161, 97, 161, 97, 161, 97, 161, 97, 101, 97, 81, 67, + 65, 81, 65, 34, 33, 17, 49, 65, 113, 84, 240, 160, + 42, 18, 240, 240, 193, 65, 148, 65, 99, 33, 81, 161, + 113, 129, 129, 129, 130, 97, 145, 17, 81, 145, 33, 49, + 161, 49, 33, 161, 97, 161, 97, 161, 97, 145, 129, 129, + 130, 82, 181, 240, 240, 240, 48, 18, 240, 240, 49, 129, + 65, 17, 33, 68, 65, 33, 17, 19, 33, 81, 33, 113, + 113, 129, 129, 129, 130, 97, 145, 17, 81, 145, 33, 49, + 161, 49, 33, 161, 97, 161, 97, 161, 97, 145, 129, 129, + 130, 82, 181, 240, 240, 240, 48, 18, 240, 240, 193, 65, + 34, 84, 65, 17, 33, 19, 33, 81, 17, 33, 81, 113, + 18, 81, 129, 129, 130, 97, 145, 17, 81, 145, 33, 49, + 161, 49, 33, 161, 97, 161, 97, 161, 97, 145, 129, 129, + 130, 82, 181, 240, 240, 240, 41, 18, 240, 240, 178, 240, + 50, 240, 49, 240, 240, 17, 240, 33, 240, 33, 240, 33, + 240, 49, 240, 50, 240, 49, 34, 114, 81, 49, 81, 113, + 65, 49, 129, 81, 17, 145, 193, 49, 227, 240, 192, 42, + 18, 240, 240, 178, 240, 50, 81, 193, 33, 33, 241, 145, + 240, 33, 240, 33, 240, 33, 240, 49, 240, 50, 240, 49, + 34, 114, 81, 49, 81, 113, 65, 49, 129, 81, 17, 145, + 193, 49, 227, 240, 192, 43, 18, 240, 240, 178, 98, 162, + 49, 33, 177, 33, 33, 242, 129, 240, 33, 240, 33, 240, + 33, 240, 49, 240, 50, 240, 49, 34, 114, 81, 49, 81, + 113, 65, 49, 129, 81, 17, 145, 193, 49, 227, 240, 192, + 26, 18, 0, 11, 114, 241, 33, 209, 65, 177, 97, 145, + 129, 113, 161, 240, 49, 240, 49, 240, 49, 240, 50, 0, + 11, 48, 30, 18, 0, 8, 65, 241, 33, 114, 97, 129, + 33, 209, 65, 177, 97, 145, 129, 113, 161, 240, 49, 240, + 49, 240, 49, 240, 50, 0, 11, 48, 32, 18, 0, 8, + 34, 241, 33, 130, 65, 33, 113, 33, 66, 113, 65, 177, + 97, 145, 129, 113, 161, 240, 49, 240, 49, 240, 49, 240, + 50, 0, 11, 48, 45, 17, 240, 240, 81, 240, 17, 74, + 33, 145, 97, 145, 81, 161, 81, 90, 17, 161, 81, 161, + 81, 161, 81, 161, 81, 161, 81, 161, 81, 101, 81, 81, + 67, 49, 81, 65, 34, 17, 17, 49, 65, 97, 84, 240, + 128, 47, 18, 240, 240, 49, 49, 225, 33, 73, 65, 145, + 49, 49, 145, 97, 161, 97, 90, 33, 161, 97, 161, 97, + 161, 97, 161, 97, 161, 97, 161, 97, 101, 97, 81, 67, + 65, 81, 65, 34, 33, 17, 49, 65, 113, 84, 240, 160, + 49, 19, 240, 240, 66, 49, 193, 33, 33, 73, 33, 33, + 145, 50, 49, 145, 113, 161, 113, 90, 49, 161, 113, 161, + 113, 161, 113, 161, 113, 161, 113, 161, 113, 101, 113, 81, + 67, 81, 81, 65, 34, 49, 17, 49, 65, 129, 84, 240, + 192, 28, 14, 240, 97, 209, 209, 209, 109, 129, 209, 209, + 124, 129, 209, 209, 209, 134, 113, 83, 81, 81, 34, 49, + 81, 65, 53, 240, 96, 43, 18, 0, 7, 8, 240, 33, + 240, 33, 240, 17, 240, 33, 81, 177, 81, 161, 97, 119, + 49, 82, 33, 67, 81, 65, 99, 33, 65, 113, 33, 17, + 65, 97, 81, 49, 113, 99, 113, 240, 17, 242, 240, 176, + 41, 17, 240, 97, 240, 17, 240, 17, 240, 17, 201, 193, + 240, 17, 240, 17, 114, 83, 145, 49, 33, 161, 17, 49, + 193, 49, 113, 65, 33, 145, 67, 145, 97, 145, 97, 145, + 97, 129, 136, 240, 112, 54, 17, 240, 193, 240, 17, 129, + 113, 129, 113, 129, 54, 113, 18, 49, 34, 97, 81, 65, + 66, 65, 81, 49, 17, 65, 97, 33, 17, 49, 113, 17, + 49, 33, 113, 17, 49, 17, 129, 17, 66, 113, 33, 65, + 129, 49, 33, 17, 97, 82, 114, 210, 240, 240, 160, 31, + 14, 240, 49, 209, 209, 209, 209, 153, 145, 193, 209, 162, + 17, 199, 33, 81, 129, 65, 129, 65, 129, 65, 129, 81, + 97, 98, 66, 132, 240, 48, 28, 13, 0, 10, 65, 129, + 49, 129, 49, 145, 52, 81, 18, 65, 51, 97, 18, 33, + 97, 81, 36, 113, 193, 193, 209, 193, 240, 64, 41, 18, + 0, 5, 97, 177, 81, 177, 81, 177, 99, 145, 35, 50, + 115, 129, 67, 161, 19, 49, 145, 113, 145, 129, 33, 65, + 145, 52, 161, 240, 49, 240, 33, 240, 49, 240, 33, 240, + 33, 240, 176, 38, 13, 0, 10, 65, 209, 81, 97, 81, + 69, 49, 34, 33, 33, 33, 17, 65, 49, 17, 17, 65, + 49, 18, 81, 49, 18, 81, 33, 33, 49, 17, 34, 33, + 68, 161, 177, 240, 80, 52, 17, 240, 161, 240, 33, 129, + 113, 129, 113, 113, 117, 65, 82, 17, 50, 33, 65, 49, + 65, 33, 49, 65, 81, 17, 33, 81, 81, 17, 17, 97, + 81, 34, 97, 81, 33, 49, 49, 65, 49, 65, 33, 50, + 49, 86, 193, 240, 17, 241, 241, 240, 192, 22, 11, 0, + 8, 113, 161, 161, 161, 34, 99, 129, 161, 161, 101, 81, + 67, 49, 65, 34, 36, 240, 208, 29, 14, 240, 81, 209, + 209, 209, 209, 50, 132, 161, 209, 209, 209, 209, 209, 209, + 135, 97, 81, 19, 49, 81, 66, 17, 65, 148, 240, 128, + 29, 14, 240, 18, 227, 226, 240, 81, 209, 209, 209, 193, + 209, 69, 65, 34, 82, 33, 17, 129, 34, 161, 209, 209, + 193, 178, 102, 240, 64, 35, 11, 240, 65, 49, 97, 49, + 113, 17, 129, 17, 129, 17, 129, 17, 129, 17, 129, 17, + 129, 17, 129, 17, 17, 97, 33, 97, 161, 145, 161, 145, + 145, 130, 240, 32, 34, 15, 240, 240, 100, 116, 49, 209, + 225, 209, 209, 209, 209, 21, 115, 82, 65, 145, 49, 177, + 17, 193, 225, 84, 81, 65, 65, 49, 81, 65, 18, 118, + 240, 80, 51, 19, 240, 129, 240, 49, 240, 49, 240, 49, + 240, 51, 66, 116, 17, 34, 33, 146, 33, 65, 145, 33, + 81, 145, 17, 97, 146, 113, 130, 129, 130, 129, 113, 17, + 129, 97, 33, 129, 81, 49, 129, 49, 81, 129, 33, 97, + 146, 113, 240, 240, 48, 29, 15, 240, 240, 101, 100, 49, + 225, 209, 209, 209, 209, 209, 21, 115, 82, 66, 129, 49, + 177, 17, 193, 225, 225, 209, 194, 118, 240, 80, 31, 14, + 0, 9, 17, 209, 209, 210, 149, 36, 97, 18, 65, 82, + 113, 50, 129, 50, 129, 33, 17, 129, 17, 33, 113, 81, + 67, 97, 240, 240, 128, 47, 18, 240, 129, 240, 33, 240, + 33, 240, 33, 240, 20, 179, 17, 17, 36, 146, 18, 66, + 113, 17, 113, 114, 145, 82, 161, 67, 161, 65, 17, 161, + 49, 33, 161, 33, 49, 145, 33, 65, 145, 113, 114, 129, + 67, 161, 240, 240, 48, 17, 240, 240, 148, 163, 49, 240, + 17, 240, 17, 240, 17, 231, 130, 17, 82, 81, 49, 97, + 65, 49, 129, 33, 65, 129, 17, 65, 145, 17, 65, 145, + 17, 49, 67, 49, 17, 33, 65, 49, 17, 50, 81, 66, + 180, 240, 240, 128, 43, 19, 240, 240, 200, 240, 17, 240, + 33, 240, 33, 240, 38, 194, 81, 161, 129, 129, 51, 49, + 177, 49, 18, 183, 209, 240, 33, 240, 20, 69, 66, 65, + 18, 81, 33, 98, 113, 17, 113, 83, 240, 240, 160, 31, + 15, 240, 81, 225, 209, 170, 145, 209, 225, 209, 19, 67, + 35, 49, 18, 66, 82, 194, 178, 17, 161, 49, 145, 65, + 145, 225, 242, 248, 240, 32, 43, 17, 240, 240, 177, 240, + 17, 241, 240, 17, 241, 240, 17, 241, 240, 17, 241, 19, + 194, 49, 97, 65, 65, 97, 49, 81, 81, 65, 81, 81, + 49, 97, 65, 65, 97, 65, 49, 129, 33, 65, 146, 240, + 112, 29, 17, 240, 240, 115, 231, 50, 147, 33, 18, 210, + 17, 225, 88, 116, 82, 240, 18, 242, 242, 242, 227, 226, + 226, 211, 181, 210, 240, 208, 33, 14, 0, 12, 97, 209, + 194, 65, 71, 34, 65, 17, 49, 34, 81, 49, 34, 66, + 49, 50, 49, 65, 49, 50, 65, 113, 33, 17, 114, 50, + 240, 240, 80, 31, 12, 0, 9, 1, 113, 49, 113, 49, + 113, 17, 17, 55, 17, 113, 49, 113, 49, 113, 49, 113, + 49, 17, 81, 51, 65, 81, 66, 146, 240, 224, 11, 6, + 129, 97, 33, 49, 33, 97, 0, 10, 112, 13, 6, 115, + 33, 49, 17, 49, 17, 49, 35, 0, 10, 96, 16, 7, + 0, 6, 17, 113, 113, 113, 113, 97, 113, 97, 82, 20, + 240, 144, 23, 9, 0, 6, 33, 97, 33, 33, 49, 33, + 33, 49, 81, 145, 145, 129, 145, 129, 114, 52, 240, 240, + 32, 20, 13, 0, 13, 12, 193, 113, 49, 129, 33, 145, + 17, 161, 177, 193, 177, 177, 177, 240, 128, 32, 17, 0, + 6, 63, 1, 240, 17, 241, 240, 17, 161, 65, 177, 49, + 193, 18, 209, 240, 17, 241, 240, 17, 240, 17, 241, 240, + 17, 241, 241, 240, 224, 21, 11, 0, 9, 49, 161, 145, + 145, 145, 146, 129, 17, 98, 33, 66, 65, 161, 161, 161, + 161, 240, 27, 14, 240, 240, 161, 209, 193, 193, 193, 193, + 194, 177, 17, 146, 33, 114, 65, 82, 97, 209, 209, 209, + 209, 209, 209, 240, 64, 22, 11, 0, 8, 97, 161, 106, + 17, 129, 17, 129, 17, 129, 17, 129, 145, 161, 145, 130, + 114, 240, 208, 28, 15, 240, 97, 225, 225, 225, 142, 17, + 193, 17, 193, 17, 193, 17, 193, 17, 193, 209, 225, 209, + 225, 209, 209, 194, 163, 240, 128, 15, 14, 0, 15, 123, + 129, 209, 209, 209, 209, 209, 125, 240, 240, 208, 29, 18, + 0, 11, 77, 177, 240, 33, 240, 33, 240, 33, 240, 33, + 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, 159, 2, + 0, 6, 112, 23, 13, 0, 10, 81, 193, 193, 92, 114, + 178, 161, 17, 145, 33, 114, 49, 82, 81, 193, 163, 240, + 240, 16, 38, 18, 240, 209, 240, 33, 240, 33, 240, 33, + 240, 33, 127, 2, 162, 240, 18, 241, 17, 241, 17, 225, + 33, 209, 49, 193, 65, 177, 81, 146, 97, 114, 129, 240, + 33, 243, 240, 160, 36, 15, 240, 240, 97, 225, 225, 225, + 142, 113, 97, 113, 97, 113, 97, 97, 113, 97, 113, 97, + 113, 81, 129, 81, 129, 65, 145, 65, 129, 65, 97, 33, + 49, 130, 240, 48, 40, 17, 240, 240, 161, 113, 129, 81, + 33, 113, 97, 145, 174, 145, 97, 145, 97, 145, 97, 129, + 113, 129, 113, 129, 113, 113, 129, 113, 129, 97, 145, 97, + 129, 97, 97, 33, 81, 130, 240, 112, 38, 17, 240, 240, + 161, 240, 17, 240, 17, 240, 39, 71, 240, 17, 240, 17, + 240, 33, 240, 17, 37, 102, 101, 65, 240, 17, 240, 17, + 240, 33, 240, 17, 240, 17, 240, 17, 240, 128, 39, 18, + 240, 240, 193, 129, 129, 97, 33, 113, 113, 167, 87, 240, + 33, 240, 33, 240, 49, 240, 33, 37, 118, 117, 65, 240, + 33, 240, 33, 240, 49, 240, 33, 240, 33, 240, 33, 240, + 160, 28, 14, 240, 240, 49, 209, 209, 201, 81, 113, 65, + 129, 49, 145, 33, 145, 33, 161, 193, 209, 193, 193, 193, + 193, 178, 147, 240, 144, 33, 17, 240, 240, 17, 113, 145, + 97, 113, 129, 129, 105, 129, 113, 113, 129, 97, 145, 81, + 145, 81, 161, 241, 240, 17, 241, 241, 241, 241, 226, 195, + 240, 240, 28, 16, 240, 240, 97, 241, 241, 225, 252, 65, + 97, 113, 113, 113, 113, 97, 129, 81, 145, 241, 225, 241, + 225, 225, 210, 194, 240, 192, 31, 16, 240, 209, 113, 129, + 97, 97, 129, 113, 97, 252, 65, 97, 113, 113, 113, 113, + 97, 129, 81, 145, 241, 225, 241, 225, 225, 210, 194, 240, + 192, 19, 14, 0, 8, 109, 209, 209, 209, 209, 209, 209, + 209, 209, 209, 209, 29, 209, 240, 224, 35, 17, 0, 6, + 1, 225, 33, 225, 61, 240, 17, 240, 17, 240, 17, 240, + 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 240, + 17, 77, 240, 17, 240, 240, 128, 39, 19, 0, 6, 33, + 161, 113, 161, 113, 161, 113, 161, 113, 111, 3, 81, 113, + 161, 113, 161, 113, 161, 113, 161, 113, 240, 49, 240, 33, + 240, 49, 240, 33, 240, 33, 240, 18, 240, 224, 43, 19, + 240, 240, 81, 225, 17, 33, 81, 113, 33, 113, 113, 161, + 113, 161, 113, 111, 3, 81, 113, 161, 113, 161, 113, 161, + 113, 161, 113, 240, 49, 240, 33, 240, 49, 240, 33, 240, + 33, 240, 18, 240, 224, 27, 16, 0, 6, 34, 240, 18, + 240, 17, 240, 162, 240, 18, 161, 81, 145, 225, 241, 225, + 225, 225, 225, 210, 179, 163, 240, 208, 29, 16, 240, 240, + 241, 66, 113, 33, 82, 97, 145, 240, 162, 240, 18, 161, + 81, 145, 225, 241, 225, 225, 225, 225, 210, 179, 163, 240, + 208, 33, 17, 0, 8, 106, 240, 17, 240, 17, 240, 17, + 240, 17, 241, 240, 17, 240, 17, 241, 17, 209, 49, 177, + 81, 130, 113, 82, 161, 19, 193, 240, 240, 80, 40, 18, + 240, 240, 49, 241, 33, 241, 17, 58, 33, 225, 240, 33, + 240, 33, 240, 33, 240, 17, 240, 33, 240, 33, 240, 17, + 17, 225, 49, 193, 81, 146, 113, 98, 161, 35, 193, 240, + 240, 128, 38, 17, 240, 240, 145, 240, 17, 240, 17, 240, + 17, 85, 102, 65, 22, 129, 113, 113, 129, 97, 145, 81, + 161, 240, 17, 240, 17, 240, 17, 240, 17, 240, 33, 240, + 41, 240, 240, 80, 40, 18, 240, 240, 49, 113, 113, 33, + 97, 129, 129, 240, 33, 85, 118, 65, 38, 129, 129, 113, + 145, 97, 161, 81, 177, 240, 33, 240, 33, 240, 33, 240, + 33, 240, 49, 240, 57, 240, 240, 128, 25, 14, 0, 7, + 1, 177, 33, 161, 49, 145, 65, 129, 193, 209, 209, 193, + 209, 193, 193, 193, 193, 178, 162, 240, 144, 32, 17, 225, + 240, 33, 225, 240, 33, 33, 177, 81, 161, 97, 145, 113, + 129, 241, 240, 17, 240, 17, 241, 240, 17, 241, 241, 241, + 241, 226, 210, 240, 240, 33, 14, 240, 240, 49, 209, 216, + 81, 113, 81, 113, 65, 129, 49, 18, 81, 49, 66, 49, + 33, 113, 33, 178, 209, 193, 17, 161, 193, 193, 178, 147, + 240, 144, 38, 17, 240, 240, 17, 113, 97, 33, 97, 113, + 136, 129, 113, 129, 113, 113, 129, 97, 18, 81, 97, 66, + 49, 81, 113, 33, 226, 240, 17, 241, 17, 209, 241, 241, + 226, 195, 240, 240, 33, 17, 240, 240, 242, 180, 133, 17, + 240, 17, 240, 17, 240, 17, 240, 17, 143, 1, 145, 240, + 17, 240, 17, 240, 17, 241, 240, 17, 241, 241, 226, 240, + 224, 39, 18, 0, 5, 114, 33, 148, 81, 53, 17, 81, + 177, 97, 161, 240, 33, 240, 33, 159, 1, 161, 240, 33, + 240, 33, 240, 33, 240, 17, 240, 33, 240, 17, 240, 17, + 242, 240, 240, 16, 24, 12, 0, 12, 49, 97, 17, 33, + 97, 17, 49, 81, 33, 33, 65, 49, 113, 161, 177, 161, + 161, 146, 240, 240, 30, 16, 0, 7, 97, 97, 129, 17, + 81, 113, 33, 81, 97, 49, 65, 81, 65, 161, 241, 225, + 241, 225, 241, 225, 225, 225, 210, 179, 240, 176, 40, 18, + 241, 241, 33, 241, 240, 177, 129, 49, 81, 113, 65, 81, + 97, 81, 65, 81, 97, 161, 240, 33, 240, 17, 240, 33, + 240, 17, 240, 33, 240, 17, 240, 17, 240, 17, 242, 211, + 240, 240, 26, 17, 0, 6, 106, 0, 9, 15, 1, 145, + 240, 17, 240, 17, 240, 17, 240, 17, 241, 240, 17, 241, + 241, 226, 240, 224, 34, 18, 240, 240, 49, 241, 33, 74, + 17, 0, 9, 63, 1, 161, 240, 33, 240, 33, 240, 33, + 240, 33, 240, 17, 240, 33, 240, 17, 240, 17, 242, 240, + 240, 16, 25, 9, 240, 49, 129, 129, 129, 129, 129, 129, + 131, 97, 34, 65, 66, 33, 97, 17, 129, 129, 129, 129, + 129, 240, 32, 31, 10, 240, 81, 97, 33, 65, 33, 17, + 81, 17, 17, 81, 49, 145, 145, 147, 113, 34, 81, 66, + 49, 97, 33, 145, 145, 145, 145, 145, 240, 64, 34, 17, + 240, 240, 193, 240, 17, 240, 17, 240, 17, 240, 17, 143, + 1, 145, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, + 241, 240, 17, 241, 241, 226, 240, 224, 12, 17, 0, 10, + 124, 0, 19, 79, 1, 0, 8, 80, 27, 15, 0, 7, + 107, 225, 225, 225, 209, 130, 65, 162, 17, 209, 226, 193, + 33, 161, 65, 129, 97, 82, 113, 50, 178, 240, 208, 28, + 16, 240, 129, 241, 241, 241, 171, 241, 225, 241, 210, 210, + 194, 34, 115, 17, 66, 35, 65, 97, 129, 241, 241, 241, + 241, 240, 144, 22, 13, 0, 6, 33, 193, 193, 193, 177, + 193, 193, 177, 193, 177, 177, 177, 162, 146, 146, 240, 240, + 112, 30, 17, 0, 11, 113, 177, 81, 161, 97, 145, 97, + 129, 129, 113, 129, 97, 161, 81, 161, 65, 177, 65, 193, + 33, 209, 17, 225, 0, 6, 64, 36, 17, 0, 6, 1, + 225, 33, 225, 17, 177, 33, 129, 81, 161, 97, 145, 97, + 129, 129, 113, 129, 97, 161, 81, 161, 65, 177, 65, 193, + 33, 209, 17, 225, 0, 6, 64, 35, 18, 0, 6, 34, + 241, 33, 225, 33, 177, 50, 113, 81, 177, 97, 161, 97, + 145, 129, 129, 129, 113, 161, 97, 161, 81, 177, 81, 193, + 49, 209, 33, 225, 0, 7, 23, 13, 240, 177, 193, 193, + 193, 193, 193, 130, 33, 68, 69, 129, 193, 193, 193, 193, + 193, 210, 217, 240, 192, 28, 15, 240, 241, 177, 33, 145, + 33, 17, 161, 49, 225, 225, 130, 65, 68, 101, 161, 225, + 225, 225, 225, 225, 242, 249, 240, 240, 48, 30, 15, 240, + 178, 33, 145, 33, 17, 145, 33, 17, 162, 33, 225, 225, + 130, 65, 68, 101, 161, 225, 225, 225, 225, 225, 242, 249, + 240, 240, 48, 21, 14, 0, 7, 13, 209, 209, 209, 193, + 209, 209, 193, 209, 193, 193, 193, 178, 147, 240, 240, 112, + 31, 17, 240, 240, 17, 225, 33, 225, 61, 240, 17, 240, + 17, 240, 17, 241, 240, 17, 240, 17, 241, 240, 17, 241, + 241, 241, 226, 195, 0, 5, 96, 31, 17, 210, 225, 33, + 209, 33, 226, 45, 240, 17, 240, 17, 240, 17, 241, 240, + 17, 240, 17, 241, 240, 17, 241, 241, 241, 226, 195, 0, + 5, 96, 24, 17, 0, 11, 34, 225, 33, 193, 65, 161, + 97, 129, 129, 97, 161, 240, 33, 240, 33, 240, 34, 0, + 12, 112, 28, 17, 0, 8, 1, 225, 33, 114, 81, 129, + 33, 193, 65, 161, 97, 129, 129, 97, 161, 240, 33, 240, + 33, 240, 34, 0, 12, 112, 30, 17, 0, 7, 114, 225, + 33, 114, 65, 33, 97, 33, 66, 97, 65, 161, 97, 129, + 129, 97, 161, 240, 33, 240, 33, 240, 34, 0, 12, 112, + 43, 17, 240, 161, 240, 17, 240, 17, 240, 17, 240, 17, + 143, 1, 145, 240, 17, 240, 17, 193, 49, 49, 129, 49, + 65, 97, 65, 81, 81, 65, 97, 49, 81, 97, 33, 97, + 240, 17, 225, 17, 242, 240, 160, 45, 18, 240, 177, 97, + 161, 65, 33, 145, 81, 177, 240, 33, 159, 1, 161, 240, + 33, 240, 33, 209, 49, 49, 145, 49, 65, 113, 65, 81, + 97, 65, 97, 65, 81, 97, 49, 97, 240, 33, 241, 17, + 240, 18, 240, 192, 46, 18, 240, 177, 82, 161, 65, 33, + 145, 65, 33, 145, 82, 161, 159, 1, 161, 240, 33, 240, + 33, 209, 49, 49, 145, 49, 65, 113, 65, 81, 97, 65, + 97, 65, 81, 97, 49, 97, 240, 33, 241, 17, 240, 18, + 240, 192, 25, 16, 0, 10, 15, 241, 225, 225, 225, 225, + 146, 49, 193, 17, 225, 240, 17, 240, 17, 240, 17, 241, + 240, 240, 112, 19, 14, 240, 244, 228, 226, 0, 5, 100, + 227, 226, 240, 240, 244, 228, 227, 226, 240, 224, 38, 17, + 240, 240, 177, 240, 17, 240, 17, 240, 17, 241, 240, 17, + 240, 17, 241, 240, 17, 81, 161, 97, 129, 129, 113, 145, + 81, 101, 81, 21, 81, 21, 161, 240, 17, 240, 240, 80, + 28, 14, 0, 6, 97, 209, 209, 193, 97, 97, 114, 49, + 161, 33, 178, 209, 193, 17, 161, 49, 129, 81, 97, 193, + 178, 162, 240, 176, 32, 17, 0, 8, 92, 161, 240, 17, + 240, 17, 240, 17, 175, 1, 113, 240, 17, 240, 17, 240, + 17, 240, 17, 240, 17, 240, 33, 240, 39, 240, 240, 96, + 25, 13, 0, 10, 33, 193, 193, 52, 84, 49, 20, 17, + 65, 113, 49, 129, 33, 145, 209, 193, 193, 193, 240, 240, + 32, 41, 17, 240, 240, 145, 240, 17, 240, 17, 240, 33, + 84, 113, 20, 49, 84, 97, 36, 33, 97, 145, 81, 177, + 49, 193, 33, 209, 240, 17, 240, 33, 240, 17, 240, 17, + 240, 17, 240, 17, 240, 160, 16, 13, 0, 13, 24, 193, + 193, 193, 193, 193, 193, 193, 76, 240, 240, 160, 29, 17, + 0, 10, 122, 240, 17, 240, 17, 240, 17, 240, 17, 241, + 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 111, 1, + 0, 6, 64, 17, 10, 0, 8, 105, 145, 145, 145, 25, + 145, 145, 145, 145, 25, 145, 240, 96, 20, 13, 0, 6, + 76, 193, 193, 193, 193, 193, 43, 193, 193, 193, 193, 193, + 28, 193, 240, 192, 20, 14, 240, 249, 0, 7, 61, 209, + 209, 209, 193, 209, 193, 193, 193, 193, 178, 147, 240, 128, + 30, 10, 240, 209, 17, 113, 17, 113, 17, 113, 17, 113, + 17, 113, 17, 113, 17, 113, 17, 113, 17, 113, 145, 145, + 129, 145, 129, 129, 114, 240, 44, 17, 0, 7, 49, 193, + 49, 193, 49, 193, 49, 193, 49, 193, 49, 193, 49, 193, + 49, 193, 49, 97, 65, 65, 97, 65, 65, 81, 81, 65, + 81, 65, 81, 65, 81, 81, 49, 81, 97, 18, 81, 114, + 240, 144, 30, 13, 240, 240, 145, 193, 193, 193, 193, 193, + 193, 193, 161, 17, 161, 17, 145, 33, 129, 49, 113, 65, + 97, 81, 66, 97, 34, 131, 240, 128, 32, 14, 0, 7, + 13, 17, 177, 17, 177, 17, 177, 17, 177, 17, 177, 17, + 177, 17, 177, 17, 177, 17, 177, 17, 177, 17, 177, 29, + 17, 177, 240, 224, 20, 11, 0, 11, 10, 17, 129, 17, + 129, 17, 129, 17, 129, 145, 161, 145, 130, 114, 240, 208, + 27, 14, 0, 7, 13, 17, 177, 17, 177, 17, 177, 17, + 177, 17, 177, 17, 177, 193, 209, 193, 209, 193, 193, 178, + 147, 240, 112, 38, 18, 240, 209, 240, 33, 240, 33, 240, + 33, 240, 33, 157, 113, 81, 177, 81, 177, 81, 177, 81, + 177, 81, 127, 2, 177, 240, 33, 240, 33, 240, 33, 240, + 33, 240, 33, 240, 160, 28, 17, 0, 10, 124, 240, 17, + 241, 177, 49, 193, 18, 209, 240, 17, 240, 17, 240, 17, + 240, 17, 240, 17, 159, 1, 0, 6, 64, 22, 13, 240, + 240, 156, 193, 193, 193, 193, 28, 193, 193, 193, 177, 193, + 177, 177, 177, 162, 131, 240, 96, 22, 15, 0, 7, 65, + 242, 242, 129, 225, 209, 225, 209, 209, 209, 209, 209, 194, + 178, 163, 240, 240, 192, 37, 17, 240, 129, 113, 129, 81, + 33, 113, 97, 17, 113, 97, 62, 49, 193, 49, 193, 49, + 193, 49, 193, 49, 177, 240, 17, 240, 17, 241, 240, 17, + 241, 241, 226, 195, 240, 192, 27, 11, 0, 8, 97, 161, + 161, 106, 81, 65, 65, 81, 65, 81, 65, 81, 49, 97, + 49, 97, 33, 81, 17, 17, 113, 240, 144, 23, 13, 0, + 10, 17, 193, 193, 201, 49, 81, 97, 81, 81, 97, 65, + 97, 193, 177, 177, 162, 240, 240, 64, 35, 19, 240, 240, + 66, 240, 17, 18, 242, 61, 33, 50, 147, 82, 146, 98, + 146, 98, 146, 98, 146, 240, 19, 240, 18, 240, 18, 240, + 19, 227, 198, 227, 0, 8, 96, 38, 19, 240, 240, 65, + 194, 66, 178, 33, 34, 162, 34, 210, 172, 146, 50, 194, + 50, 194, 50, 194, 50, 194, 50, 143, 2, 178, 240, 34, + 240, 34, 240, 34, 240, 34, 0, 5, 96, 30, 19, 240, + 240, 66, 241, 34, 242, 240, 34, 93, 240, 34, 194, 34, + 210, 18, 228, 242, 240, 34, 240, 34, 240, 34, 159, 2, + 0, 12, 16, 33, 19, 240, 240, 81, 240, 50, 242, 17, + 29, 33, 227, 240, 18, 240, 34, 124, 240, 19, 240, 18, + 240, 19, 243, 243, 243, 213, 227, 240, 17, 0, 6, 80, + 10, 4, 240, 240, 35, 19, 19, 240, 240, 112, 10, 17, + 0, 17, 1, 240, 47, 0, 21, 48, 16, 7, 0, 6, + 17, 113, 113, 113, 97, 113, 97, 113, 97, 97, 240, 112, + 23, 10, 0, 7, 1, 113, 33, 33, 65, 33, 33, 65, + 81, 161, 145, 161, 145, 161, 145, 145, 240, 240, 64, + 0, // Padding + +}; + +tFont *g_psFontWSazanamigothic10x19 = (tFont *)g_pui8Sazanamigothic10x19; diff --git a/third_party/fonts/other/fonts/fontsazanamigothic6x10.c b/third_party/fonts/other/fonts/fontsazanamigothic6x10.c new file mode 100644 index 0000000..bfe8a44 --- /dev/null +++ b/third_party/fonts/other/fonts/fontsazanamigothic6x10.c @@ -0,0 +1,719 @@ +//***************************************************************************** +// +// fontsazanamigothic6x10.c - Font definition for the 6x10 Sazanamigothic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from Sazanami +// +// Copyright (c) 1990-2003 +// Wada Laboratory, the University of Tokyo. All rights reserved. +// Copyright (c) 2003-2004 +// Electronic Font Open Laboratory (/efont/). All rights reserved +// +// For license, please see README. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 286 in 2 blocks +// Style: sazanamigothic +// Size: 6x10 +// Bold: no +// Italic: no +// Memory usage: 5069 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Sazanamigothic6x10[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 9, + + // + // The height of the font. + // + 12, + + // + // The baseline of the font. + // + 10, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3041 - 0x30ff + // + 0x41, 0x30, 0x00, 0x00, + 0xbf, 0x00, 0x00, 0x00, + 0x3c, 0x05, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x86, 0x01, 0x00, 0x00, // Offset 390 (0x186) + 0x8f, 0x01, 0x00, 0x00, // Offset 399 (0x18f) + 0x9c, 0x01, 0x00, 0x00, // Offset 412 (0x19c) + 0xa7, 0x01, 0x00, 0x00, // Offset 423 (0x1a7) + 0xb1, 0x01, 0x00, 0x00, // Offset 433 (0x1b1) + 0xbf, 0x01, 0x00, 0x00, // Offset 447 (0x1bf) + 0xc3, 0x01, 0x00, 0x00, // Offset 451 (0x1c3) + 0xcf, 0x01, 0x00, 0x00, // Offset 463 (0x1cf) + 0xdb, 0x01, 0x00, 0x00, // Offset 475 (0x1db) + 0xe6, 0x01, 0x00, 0x00, // Offset 486 (0x1e6) + 0xef, 0x01, 0x00, 0x00, // Offset 495 (0x1ef) + 0xf4, 0x01, 0x00, 0x00, // Offset 500 (0x1f4) + 0xfa, 0x01, 0x00, 0x00, // Offset 506 (0x1fa) + 0xfe, 0x01, 0x00, 0x00, // Offset 510 (0x1fe) + 0x09, 0x02, 0x00, 0x00, // Offset 521 (0x209) + 0x14, 0x02, 0x00, 0x00, // Offset 532 (0x214) + 0x1e, 0x02, 0x00, 0x00, // Offset 542 (0x21e) + 0x29, 0x02, 0x00, 0x00, // Offset 553 (0x229) + 0x33, 0x02, 0x00, 0x00, // Offset 563 (0x233) + 0x3f, 0x02, 0x00, 0x00, // Offset 575 (0x23f) + 0x48, 0x02, 0x00, 0x00, // Offset 584 (0x248) + 0x53, 0x02, 0x00, 0x00, // Offset 595 (0x253) + 0x5d, 0x02, 0x00, 0x00, // Offset 605 (0x25d) + 0x69, 0x02, 0x00, 0x00, // Offset 617 (0x269) + 0x74, 0x02, 0x00, 0x00, // Offset 628 (0x274) + 0x79, 0x02, 0x00, 0x00, // Offset 633 (0x279) + 0x7e, 0x02, 0x00, 0x00, // Offset 638 (0x27e) + 0x88, 0x02, 0x00, 0x00, // Offset 648 (0x288) + 0x8f, 0x02, 0x00, 0x00, // Offset 655 (0x28f) + 0x99, 0x02, 0x00, 0x00, // Offset 665 (0x299) + 0xa2, 0x02, 0x00, 0x00, // Offset 674 (0x2a2) + 0xad, 0x02, 0x00, 0x00, // Offset 685 (0x2ad) + 0xb7, 0x02, 0x00, 0x00, // Offset 695 (0x2b7) + 0xc1, 0x02, 0x00, 0x00, // Offset 705 (0x2c1) + 0xcb, 0x02, 0x00, 0x00, // Offset 715 (0x2cb) + 0xd5, 0x02, 0x00, 0x00, // Offset 725 (0x2d5) + 0xde, 0x02, 0x00, 0x00, // Offset 734 (0x2de) + 0xe7, 0x02, 0x00, 0x00, // Offset 743 (0x2e7) + 0xf1, 0x02, 0x00, 0x00, // Offset 753 (0x2f1) + 0xfb, 0x02, 0x00, 0x00, // Offset 763 (0x2fb) + 0x05, 0x03, 0x00, 0x00, // Offset 773 (0x305) + 0x0f, 0x03, 0x00, 0x00, // Offset 783 (0x30f) + 0x1c, 0x03, 0x00, 0x00, // Offset 796 (0x31c) + 0x26, 0x03, 0x00, 0x00, // Offset 806 (0x326) + 0x31, 0x03, 0x00, 0x00, // Offset 817 (0x331) + 0x3c, 0x03, 0x00, 0x00, // Offset 828 (0x33c) + 0x47, 0x03, 0x00, 0x00, // Offset 839 (0x347) + 0x51, 0x03, 0x00, 0x00, // Offset 849 (0x351) + 0x5d, 0x03, 0x00, 0x00, // Offset 861 (0x35d) + 0x68, 0x03, 0x00, 0x00, // Offset 872 (0x368) + 0x70, 0x03, 0x00, 0x00, // Offset 880 (0x370) + 0x7a, 0x03, 0x00, 0x00, // Offset 890 (0x37a) + 0x85, 0x03, 0x00, 0x00, // Offset 901 (0x385) + 0x90, 0x03, 0x00, 0x00, // Offset 912 (0x390) + 0x9b, 0x03, 0x00, 0x00, // Offset 923 (0x39b) + 0xa7, 0x03, 0x00, 0x00, // Offset 935 (0x3a7) + 0xb2, 0x03, 0x00, 0x00, // Offset 946 (0x3b2) + 0xbc, 0x03, 0x00, 0x00, // Offset 956 (0x3bc) + 0xc7, 0x03, 0x00, 0x00, // Offset 967 (0x3c7) + 0xd2, 0x03, 0x00, 0x00, // Offset 978 (0x3d2) + 0xdd, 0x03, 0x00, 0x00, // Offset 989 (0x3dd) + 0xe7, 0x03, 0x00, 0x00, // Offset 999 (0x3e7) + 0xed, 0x03, 0x00, 0x00, // Offset 1005 (0x3ed) + 0xf4, 0x03, 0x00, 0x00, // Offset 1012 (0x3f4) + 0xfd, 0x03, 0x00, 0x00, // Offset 1021 (0x3fd) + 0x07, 0x04, 0x00, 0x00, // Offset 1031 (0x407) + 0x10, 0x04, 0x00, 0x00, // Offset 1040 (0x410) + 0x1a, 0x04, 0x00, 0x00, // Offset 1050 (0x41a) + 0x22, 0x04, 0x00, 0x00, // Offset 1058 (0x422) + 0x2c, 0x04, 0x00, 0x00, // Offset 1068 (0x42c) + 0x36, 0x04, 0x00, 0x00, // Offset 1078 (0x436) + 0x41, 0x04, 0x00, 0x00, // Offset 1089 (0x441) + 0x4a, 0x04, 0x00, 0x00, // Offset 1098 (0x44a) + 0x53, 0x04, 0x00, 0x00, // Offset 1107 (0x453) + 0x60, 0x04, 0x00, 0x00, // Offset 1120 (0x460) + 0x6a, 0x04, 0x00, 0x00, // Offset 1130 (0x46a) + 0x78, 0x04, 0x00, 0x00, // Offset 1144 (0x478) + 0x82, 0x04, 0x00, 0x00, // Offset 1154 (0x482) + 0x8c, 0x04, 0x00, 0x00, // Offset 1164 (0x48c) + 0x97, 0x04, 0x00, 0x00, // Offset 1175 (0x497) + 0xa1, 0x04, 0x00, 0x00, // Offset 1185 (0x4a1) + 0xaa, 0x04, 0x00, 0x00, // Offset 1194 (0x4aa) + 0xb1, 0x04, 0x00, 0x00, // Offset 1201 (0x4b1) + 0xbb, 0x04, 0x00, 0x00, // Offset 1211 (0x4bb) + 0xc5, 0x04, 0x00, 0x00, // Offset 1221 (0x4c5) + 0xcf, 0x04, 0x00, 0x00, // Offset 1231 (0x4cf) + 0xd9, 0x04, 0x00, 0x00, // Offset 1241 (0x4d9) + 0xe4, 0x04, 0x00, 0x00, // Offset 1252 (0x4e4) + 0xef, 0x04, 0x00, 0x00, // Offset 1263 (0x4ef) + 0xf8, 0x04, 0x00, 0x00, // Offset 1272 (0x4f8) + 0x04, 0x05, 0x00, 0x00, // Offset 1284 (0x504) + 0x07, 0x05, 0x00, 0x00, // Offset 1287 (0x507) + 0x13, 0x05, 0x00, 0x00, // Offset 1299 (0x513) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 7, 0, 10, 64, 5, 1, 53, 17, 32, 9, 3, + 97, 18, 18, 18, 17, 240, 48, 13, 4, 209, 17, 17, + 21, 17, 21, 17, 17, 17, 17, 128, 11, 4, 225, 36, + 17, 19, 35, 17, 20, 33, 96, 10, 4, 194, 34, 81, + 18, 17, 82, 34, 128, 14, 4, 209, 33, 17, 17, 17, + 33, 33, 19, 17, 33, 17, 128, 4, 1, 36, 96, 12, + 3, 129, 17, 33, 17, 33, 33, 49, 33, 49, 48, 12, + 3, 97, 49, 33, 49, 33, 33, 17, 33, 17, 80, 11, + 4, 240, 33, 17, 33, 20, 33, 33, 17, 192, 9, 4, + 240, 49, 49, 20, 33, 49, 208, 5, 2, 240, 66, 48, + 6, 4, 240, 148, 240, 80, 4, 1, 145, 32, 11, 4, + 241, 49, 33, 49, 33, 49, 33, 49, 112, 11, 4, 210, + 17, 34, 20, 18, 34, 33, 18, 144, 10, 3, 177, 19, + 17, 33, 33, 33, 33, 96, 11, 4, 210, 17, 33, 49, + 33, 33, 33, 52, 128, 10, 4, 196, 49, 33, 34, 66, + 33, 18, 144, 12, 4, 225, 34, 17, 17, 17, 17, 20, + 33, 49, 144, 9, 4, 197, 51, 65, 50, 33, 18, 144, + 11, 4, 210, 17, 51, 17, 34, 34, 33, 18, 144, 10, + 4, 196, 49, 33, 49, 33, 49, 49, 160, 12, 4, 210, + 17, 34, 33, 18, 17, 34, 33, 18, 144, 11, 4, 210, + 17, 34, 34, 33, 19, 49, 18, 144, 5, 1, 81, 33, + 48, 5, 2, 177, 82, 80, 10, 4, 241, 33, 33, 33, + 65, 65, 65, 128, 7, 4, 240, 84, 68, 240, 16, 10, + 4, 193, 65, 65, 65, 33, 33, 33, 176, 9, 4, 195, + 65, 49, 33, 33, 113, 160, 11, 4, 210, 17, 34, 19, + 17, 17, 19, 67, 128, 10, 4, 210, 17, 34, 38, 34, + 34, 33, 128, 10, 4, 195, 17, 34, 36, 17, 34, 36, + 144, 10, 4, 210, 17, 34, 49, 49, 49, 67, 128, 10, + 4, 195, 17, 34, 34, 34, 34, 36, 144, 9, 4, 197, + 49, 51, 17, 49, 52, 128, 9, 4, 197, 49, 51, 17, + 49, 49, 176, 10, 4, 212, 49, 49, 19, 34, 33, 19, + 128, 10, 4, 193, 34, 34, 38, 34, 34, 33, 128, 10, + 3, 147, 17, 33, 33, 33, 33, 19, 96, 10, 4, 241, + 49, 49, 50, 34, 33, 18, 144, 13, 4, 193, 34, 17, + 18, 34, 33, 17, 17, 34, 33, 128, 10, 4, 193, 49, + 49, 49, 49, 49, 52, 128, 11, 4, 193, 34, 20, 18, + 34, 34, 34, 33, 128, 11, 4, 193, 35, 18, 19, 34, + 34, 34, 33, 128, 11, 4, 210, 17, 34, 34, 34, 34, + 33, 18, 144, 10, 4, 195, 17, 34, 34, 36, 17, 49, + 176, 12, 4, 210, 17, 34, 34, 34, 34, 33, 18, 33, + 66, 11, 4, 195, 17, 34, 36, 17, 34, 34, 33, 128, + 8, 4, 212, 49, 66, 65, 52, 144, 10, 5, 245, 33, + 65, 65, 65, 65, 65, 192, 11, 4, 193, 34, 34, 34, + 34, 34, 33, 18, 144, 11, 4, 193, 34, 34, 34, 34, + 34, 17, 18, 160, 11, 4, 193, 34, 34, 34, 35, 18, + 19, 33, 128, 12, 4, 193, 34, 34, 33, 18, 17, 34, + 34, 33, 128, 11, 4, 193, 34, 34, 34, 17, 33, 49, + 49, 160, 10, 4, 196, 49, 33, 33, 33, 49, 52, 128, + 11, 3, 100, 33, 33, 33, 33, 33, 33, 35, 48, 11, + 4, 193, 49, 65, 49, 65, 49, 65, 49, 64, 11, 3, + 99, 33, 33, 33, 33, 33, 33, 36, 48, 10, 5, 193, + 49, 17, 17, 49, 240, 240, 80, 6, 4, 240, 240, 164, + 64, 7, 2, 65, 17, 33, 17, 192, 9, 4, 240, 98, + 65, 20, 33, 19, 128, 10, 4, 193, 49, 51, 17, 34, + 34, 36, 144, 9, 4, 240, 98, 17, 34, 49, 67, 128, + 10, 4, 241, 49, 20, 34, 34, 33, 19, 128, 8, 4, + 240, 98, 17, 38, 67, 128, 10, 4, 226, 17, 49, 36, + 17, 49, 49, 160, 10, 4, 240, 100, 34, 34, 33, 19, + 49, 18, 11, 4, 193, 49, 51, 17, 34, 34, 34, 33, + 128, 9, 3, 113, 114, 33, 33, 33, 19, 96, 9, 3, + 129, 114, 33, 33, 33, 33, 35, 13, 4, 193, 49, 49, + 34, 17, 18, 33, 17, 17, 33, 128, 10, 3, 146, 33, + 33, 33, 33, 33, 34, 96, 14, 5, 240, 164, 17, 17, + 18, 17, 18, 17, 18, 17, 17, 160, 10, 4, 240, 83, + 17, 34, 34, 34, 33, 128, 10, 4, 240, 98, 17, 34, + 34, 33, 18, 144, 11, 4, 240, 83, 17, 34, 34, 36, + 17, 49, 48, 10, 4, 240, 100, 34, 34, 33, 19, 49, + 49, 9, 4, 240, 81, 20, 33, 49, 49, 176, 7, 4, + 240, 100, 66, 68, 144, 10, 4, 209, 49, 36, 17, 49, + 49, 66, 128, 10, 4, 240, 81, 34, 34, 34, 33, 19, + 128, 10, 4, 240, 81, 34, 34, 34, 17, 18, 160, 10, + 4, 240, 81, 34, 35, 18, 19, 33, 128, 11, 4, 240, + 81, 34, 33, 18, 17, 34, 33, 128, 11, 4, 240, 81, + 34, 34, 34, 33, 19, 49, 18, 9, 4, 240, 84, 33, + 33, 33, 52, 128, 12, 4, 162, 17, 49, 49, 33, 65, + 49, 49, 66, 64, 3, 1, 41, 12, 4, 130, 65, 49, + 49, 65, 33, 49, 49, 18, 96, 7, 4, 209, 18, 17, + 240, 224, + 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3041 - 0x30ff + // + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x0c, 0x03, 0x00, 0x00, // Offset 780 (0x30c) + 0x21, 0x03, 0x00, 0x00, // Offset 801 (0x321) + 0x30, 0x03, 0x00, 0x00, // Offset 816 (0x330) + 0x41, 0x03, 0x00, 0x00, // Offset 833 (0x341) + 0x4c, 0x03, 0x00, 0x00, // Offset 844 (0x34c) + 0x59, 0x03, 0x00, 0x00, // Offset 857 (0x359) + 0x65, 0x03, 0x00, 0x00, // Offset 869 (0x365) + 0x74, 0x03, 0x00, 0x00, // Offset 884 (0x374) + 0x84, 0x03, 0x00, 0x00, // Offset 900 (0x384) + 0x99, 0x03, 0x00, 0x00, // Offset 921 (0x399) + 0xb0, 0x03, 0x00, 0x00, // Offset 944 (0x3b0) + 0xca, 0x03, 0x00, 0x00, // Offset 970 (0x3ca) + 0xd9, 0x03, 0x00, 0x00, // Offset 985 (0x3d9) + 0xeb, 0x03, 0x00, 0x00, // Offset 1003 (0x3eb) + 0xf7, 0x03, 0x00, 0x00, // Offset 1015 (0x3f7) + 0x07, 0x04, 0x00, 0x00, // Offset 1031 (0x407) + 0x1c, 0x04, 0x00, 0x00, // Offset 1052 (0x41c) + 0x33, 0x04, 0x00, 0x00, // Offset 1075 (0x433) + 0x3e, 0x04, 0x00, 0x00, // Offset 1086 (0x43e) + 0x4c, 0x04, 0x00, 0x00, // Offset 1100 (0x44c) + 0x5b, 0x04, 0x00, 0x00, // Offset 1115 (0x45b) + 0x6e, 0x04, 0x00, 0x00, // Offset 1134 (0x46e) + 0x7c, 0x04, 0x00, 0x00, // Offset 1148 (0x47c) + 0x90, 0x04, 0x00, 0x00, // Offset 1168 (0x490) + 0x9f, 0x04, 0x00, 0x00, // Offset 1183 (0x49f) + 0xaf, 0x04, 0x00, 0x00, // Offset 1199 (0x4af) + 0xc1, 0x04, 0x00, 0x00, // Offset 1217 (0x4c1) + 0xd5, 0x04, 0x00, 0x00, // Offset 1237 (0x4d5) + 0xe2, 0x04, 0x00, 0x00, // Offset 1250 (0x4e2) + 0xf1, 0x04, 0x00, 0x00, // Offset 1265 (0x4f1) + 0x03, 0x05, 0x00, 0x00, // Offset 1283 (0x503) + 0x18, 0x05, 0x00, 0x00, // Offset 1304 (0x518) + 0x27, 0x05, 0x00, 0x00, // Offset 1319 (0x527) + 0x39, 0x05, 0x00, 0x00, // Offset 1337 (0x539) + 0x45, 0x05, 0x00, 0x00, // Offset 1349 (0x545) + 0x52, 0x05, 0x00, 0x00, // Offset 1362 (0x552) + 0x62, 0x05, 0x00, 0x00, // Offset 1378 (0x562) + 0x6e, 0x05, 0x00, 0x00, // Offset 1390 (0x56e) + 0x7f, 0x05, 0x00, 0x00, // Offset 1407 (0x57f) + 0x8c, 0x05, 0x00, 0x00, // Offset 1420 (0x58c) + 0x9d, 0x05, 0x00, 0x00, // Offset 1437 (0x59d) + 0xb3, 0x05, 0x00, 0x00, // Offset 1459 (0x5b3) + 0xc4, 0x05, 0x00, 0x00, // Offset 1476 (0x5c4) + 0xde, 0x05, 0x00, 0x00, // Offset 1502 (0x5de) + 0xf4, 0x05, 0x00, 0x00, // Offset 1524 (0x5f4) + 0x08, 0x06, 0x00, 0x00, // Offset 1544 (0x608) + 0x20, 0x06, 0x00, 0x00, // Offset 1568 (0x620) + 0x3a, 0x06, 0x00, 0x00, // Offset 1594 (0x63a) + 0x54, 0x06, 0x00, 0x00, // Offset 1620 (0x654) + 0x69, 0x06, 0x00, 0x00, // Offset 1641 (0x669) + 0x7e, 0x06, 0x00, 0x00, // Offset 1662 (0x67e) + 0x94, 0x06, 0x00, 0x00, // Offset 1684 (0x694) + 0xa7, 0x06, 0x00, 0x00, // Offset 1703 (0x6a7) + 0xbd, 0x06, 0x00, 0x00, // Offset 1725 (0x6bd) + 0xd3, 0x06, 0x00, 0x00, // Offset 1747 (0x6d3) + 0xdf, 0x06, 0x00, 0x00, // Offset 1759 (0x6df) + 0xee, 0x06, 0x00, 0x00, // Offset 1774 (0x6ee) + 0xfe, 0x06, 0x00, 0x00, // Offset 1790 (0x6fe) + 0x16, 0x07, 0x00, 0x00, // Offset 1814 (0x716) + 0x30, 0x07, 0x00, 0x00, // Offset 1840 (0x730) + 0x4a, 0x07, 0x00, 0x00, // Offset 1866 (0x74a) + 0x5a, 0x07, 0x00, 0x00, // Offset 1882 (0x75a) + 0x6e, 0x07, 0x00, 0x00, // Offset 1902 (0x76e) + 0x81, 0x07, 0x00, 0x00, // Offset 1921 (0x781) + 0x99, 0x07, 0x00, 0x00, // Offset 1945 (0x799) + 0xa8, 0x07, 0x00, 0x00, // Offset 1960 (0x7a8) + 0xb9, 0x07, 0x00, 0x00, // Offset 1977 (0x7b9) + 0xcb, 0x07, 0x00, 0x00, // Offset 1995 (0x7cb) + 0xdf, 0x07, 0x00, 0x00, // Offset 2015 (0x7df) + 0xf7, 0x07, 0x00, 0x00, // Offset 2039 (0x7f7) + 0x04, 0x08, 0x00, 0x00, // Offset 2052 (0x804) + 0x14, 0x08, 0x00, 0x00, // Offset 2068 (0x814) + 0x22, 0x08, 0x00, 0x00, // Offset 2082 (0x822) + 0x31, 0x08, 0x00, 0x00, // Offset 2097 (0x831) + 0x42, 0x08, 0x00, 0x00, // Offset 2114 (0x842) + 0x58, 0x08, 0x00, 0x00, // Offset 2136 (0x858) + 0x65, 0x08, 0x00, 0x00, // Offset 2149 (0x865) + 0x75, 0x08, 0x00, 0x00, // Offset 2165 (0x875) + 0x8a, 0x08, 0x00, 0x00, // Offset 2186 (0x88a) + 0xa0, 0x08, 0x00, 0x00, // Offset 2208 (0x8a0) + 0xb2, 0x08, 0x00, 0x00, // Offset 2226 (0x8b2) + 0xc4, 0x08, 0x00, 0x00, // Offset 2244 (0x8c4) + 0xd5, 0x08, 0x00, 0x00, // Offset 2261 (0x8d5) + 0xe6, 0x08, 0x00, 0x00, // Offset 2278 (0x8e6) + 0xf9, 0x08, 0x00, 0x00, // Offset 2297 (0x8f9) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x08, 0x09, 0x00, 0x00, // Offset 2312 (0x908) + 0x11, 0x09, 0x00, 0x00, // Offset 2321 (0x911) + 0x1a, 0x09, 0x00, 0x00, // Offset 2330 (0x91a) + 0x22, 0x09, 0x00, 0x00, // Offset 2338 (0x922) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x2f, 0x09, 0x00, 0x00, // Offset 2351 (0x92f) + 0x3a, 0x09, 0x00, 0x00, // Offset 2362 (0x93a) + 0x48, 0x09, 0x00, 0x00, // Offset 2376 (0x948) + 0x54, 0x09, 0x00, 0x00, // Offset 2388 (0x954) + 0x62, 0x09, 0x00, 0x00, // Offset 2402 (0x962) + 0x6d, 0x09, 0x00, 0x00, // Offset 2413 (0x96d) + 0x7a, 0x09, 0x00, 0x00, // Offset 2426 (0x97a) + 0x85, 0x09, 0x00, 0x00, // Offset 2437 (0x985) + 0x91, 0x09, 0x00, 0x00, // Offset 2449 (0x991) + 0x9e, 0x09, 0x00, 0x00, // Offset 2462 (0x99e) + 0xad, 0x09, 0x00, 0x00, // Offset 2477 (0x9ad) + 0xbf, 0x09, 0x00, 0x00, // Offset 2495 (0x9bf) + 0xd6, 0x09, 0x00, 0x00, // Offset 2518 (0x9d6) + 0xe3, 0x09, 0x00, 0x00, // Offset 2531 (0x9e3) + 0xf4, 0x09, 0x00, 0x00, // Offset 2548 (0x9f4) + 0x03, 0x0a, 0x00, 0x00, // Offset 2563 (0xa03) + 0x16, 0x0a, 0x00, 0x00, // Offset 2582 (0xa16) + 0x24, 0x0a, 0x00, 0x00, // Offset 2596 (0xa24) + 0x37, 0x0a, 0x00, 0x00, // Offset 2615 (0xa37) + 0x42, 0x0a, 0x00, 0x00, // Offset 2626 (0xa42) + 0x50, 0x0a, 0x00, 0x00, // Offset 2640 (0xa50) + 0x61, 0x0a, 0x00, 0x00, // Offset 2657 (0xa61) + 0x74, 0x0a, 0x00, 0x00, // Offset 2676 (0xa74) + 0x82, 0x0a, 0x00, 0x00, // Offset 2690 (0xa82) + 0x94, 0x0a, 0x00, 0x00, // Offset 2708 (0xa94) + 0xa2, 0x0a, 0x00, 0x00, // Offset 2722 (0xaa2) + 0xb4, 0x0a, 0x00, 0x00, // Offset 2740 (0xab4) + 0xc4, 0x0a, 0x00, 0x00, // Offset 2756 (0xac4) + 0xd8, 0x0a, 0x00, 0x00, // Offset 2776 (0xad8) + 0xe7, 0x0a, 0x00, 0x00, // Offset 2791 (0xae7) + 0xf8, 0x0a, 0x00, 0x00, // Offset 2808 (0xaf8) + 0x09, 0x0b, 0x00, 0x00, // Offset 2825 (0xb09) + 0x1e, 0x0b, 0x00, 0x00, // Offset 2846 (0xb1e) + 0x2b, 0x0b, 0x00, 0x00, // Offset 2859 (0xb2b) + 0x3b, 0x0b, 0x00, 0x00, // Offset 2875 (0xb3b) + 0x49, 0x0b, 0x00, 0x00, // Offset 2889 (0xb49) + 0x59, 0x0b, 0x00, 0x00, // Offset 2905 (0xb59) + 0x6c, 0x0b, 0x00, 0x00, // Offset 2924 (0xb6c) + 0x78, 0x0b, 0x00, 0x00, // Offset 2936 (0xb78) + 0x86, 0x0b, 0x00, 0x00, // Offset 2950 (0xb86) + 0x93, 0x0b, 0x00, 0x00, // Offset 2963 (0xb93) + 0xa4, 0x0b, 0x00, 0x00, // Offset 2980 (0xba4) + 0xb1, 0x0b, 0x00, 0x00, // Offset 2993 (0xbb1) + 0xba, 0x0b, 0x00, 0x00, // Offset 3002 (0xbba) + 0xca, 0x0b, 0x00, 0x00, // Offset 3018 (0xbca) + 0xdb, 0x0b, 0x00, 0x00, // Offset 3035 (0xbdb) + 0xe7, 0x0b, 0x00, 0x00, // Offset 3047 (0xbe7) + 0xf8, 0x0b, 0x00, 0x00, // Offset 3064 (0xbf8) + 0x0d, 0x0c, 0x00, 0x00, // Offset 3085 (0xc0d) + 0x23, 0x0c, 0x00, 0x00, // Offset 3107 (0xc23) + 0x2f, 0x0c, 0x00, 0x00, // Offset 3119 (0xc2f) + 0x3f, 0x0c, 0x00, 0x00, // Offset 3135 (0xc3f) + 0x50, 0x0c, 0x00, 0x00, // Offset 3152 (0xc50) + 0x5c, 0x0c, 0x00, 0x00, // Offset 3164 (0xc5c) + 0x6a, 0x0c, 0x00, 0x00, // Offset 3178 (0xc6a) + 0x78, 0x0c, 0x00, 0x00, // Offset 3192 (0xc78) + 0x85, 0x0c, 0x00, 0x00, // Offset 3205 (0xc85) + 0x95, 0x0c, 0x00, 0x00, // Offset 3221 (0xc95) + 0xa7, 0x0c, 0x00, 0x00, // Offset 3239 (0xca7) + 0xb8, 0x0c, 0x00, 0x00, // Offset 3256 (0xcb8) + 0xcc, 0x0c, 0x00, 0x00, // Offset 3276 (0xccc) + 0xe1, 0x0c, 0x00, 0x00, // Offset 3297 (0xce1) + 0xef, 0x0c, 0x00, 0x00, // Offset 3311 (0xcef) + 0xf8, 0x0c, 0x00, 0x00, // Offset 3320 (0xcf8) + 0x0a, 0x0d, 0x00, 0x00, // Offset 3338 (0xd0a) + 0x1a, 0x0d, 0x00, 0x00, // Offset 3354 (0xd1a) + 0x26, 0x0d, 0x00, 0x00, // Offset 3366 (0xd26) + 0x33, 0x0d, 0x00, 0x00, // Offset 3379 (0xd33) + 0x44, 0x0d, 0x00, 0x00, // Offset 3396 (0xd44) + 0x4e, 0x0d, 0x00, 0x00, // Offset 3406 (0xd4e) + 0x5a, 0x0d, 0x00, 0x00, // Offset 3418 (0xd5a) + 0x61, 0x0d, 0x00, 0x00, // Offset 3425 (0xd61) + 0x6b, 0x0d, 0x00, 0x00, // Offset 3435 (0xd6b) + 0x77, 0x0d, 0x00, 0x00, // Offset 3447 (0xd77) + 0x84, 0x0d, 0x00, 0x00, // Offset 3460 (0xd84) + 0x9e, 0x0d, 0x00, 0x00, // Offset 3486 (0xd9e) + 0xac, 0x0d, 0x00, 0x00, // Offset 3500 (0xdac) + 0xb7, 0x0d, 0x00, 0x00, // Offset 3511 (0xdb7) + 0xc1, 0x0d, 0x00, 0x00, // Offset 3521 (0xdc1) + 0xcd, 0x0d, 0x00, 0x00, // Offset 3533 (0xdcd) + 0xdd, 0x0d, 0x00, 0x00, // Offset 3549 (0xddd) + 0xe9, 0x0d, 0x00, 0x00, // Offset 3561 (0xde9) + 0xf4, 0x0d, 0x00, 0x00, // Offset 3572 (0xdf4) + 0x01, 0x0e, 0x00, 0x00, // Offset 3585 (0xe01) + 0x14, 0x0e, 0x00, 0x00, // Offset 3604 (0xe14) + 0x24, 0x0e, 0x00, 0x00, // Offset 3620 (0xe24) + 0x2f, 0x0e, 0x00, 0x00, // Offset 3631 (0xe2f) + 0x40, 0x0e, 0x00, 0x00, // Offset 3648 (0xe40) + 0x52, 0x0e, 0x00, 0x00, // Offset 3666 (0xe52) + 0x60, 0x0e, 0x00, 0x00, // Offset 3680 (0xe60) + 0x70, 0x0e, 0x00, 0x00, // Offset 3696 (0xe70) + 0x74, 0x0e, 0x00, 0x00, // Offset 3700 (0xe74) + 0x7d, 0x0e, 0x00, 0x00, // Offset 3709 (0xe7d) + 0x86, 0x0e, 0x00, 0x00, // Offset 3718 (0xe86) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3041 - 0x30ff + // + 16, 7, 240, 241, 71, 33, 85, 17, 17, 17, 18, 18, + 33, 18, 33, 128, 21, 9, 193, 129, 103, 65, 117, 50, + 33, 17, 17, 17, 17, 50, 17, 17, 49, 19, 49, 98, + 176, 15, 7, 240, 240, 97, 49, 33, 49, 17, 82, 82, + 33, 33, 18, 176, 17, 9, 240, 209, 129, 81, 17, 97, + 17, 114, 113, 17, 33, 49, 34, 240, 128, 11, 6, 240, + 164, 147, 18, 49, 81, 65, 50, 128, 13, 7, 240, 18, + 114, 164, 18, 65, 97, 97, 81, 66, 144, 12, 6, 240, + 164, 117, 65, 65, 65, 17, 33, 50, 96, 15, 8, 240, + 50, 130, 181, 97, 97, 97, 17, 65, 33, 49, 67, 128, + 16, 7, 240, 241, 33, 21, 17, 33, 85, 17, 17, 50, + 17, 51, 34, 128, 21, 9, 193, 129, 101, 17, 65, 65, + 49, 117, 49, 17, 49, 17, 33, 66, 33, 65, 18, 50, + 160, 23, 9, 193, 129, 129, 49, 21, 33, 49, 33, 33, + 33, 33, 33, 33, 33, 33, 17, 49, 65, 49, 98, 208, + 26, 9, 193, 49, 65, 17, 33, 49, 33, 37, 97, 33, + 17, 49, 33, 17, 49, 33, 33, 17, 49, 33, 17, 49, + 98, 208, 15, 8, 193, 113, 56, 81, 55, 81, 67, 17, + 33, 50, 33, 132, 160, 18, 9, 193, 49, 65, 17, 38, + 17, 97, 87, 97, 83, 17, 49, 50, 49, 148, 192, 12, + 4, 177, 33, 33, 33, 49, 65, 65, 65, 49, 64, 16, + 8, 240, 65, 97, 49, 33, 33, 34, 65, 33, 129, 129, + 129, 113, 192, 21, 9, 241, 49, 65, 49, 65, 33, 39, + 81, 33, 81, 33, 81, 33, 81, 49, 49, 65, 18, 208, + 23, 9, 240, 17, 33, 49, 33, 17, 65, 33, 39, 81, + 33, 81, 33, 81, 33, 81, 49, 49, 65, 18, 208, 11, + 7, 240, 117, 240, 129, 81, 97, 81, 21, 128, 14, 8, + 225, 81, 33, 19, 17, 240, 193, 97, 113, 81, 37, 160, + 15, 9, 225, 129, 129, 25, 129, 83, 17, 49, 50, 49, + 145, 147, 176, 19, 9, 209, 33, 81, 49, 65, 17, 38, + 17, 97, 83, 17, 49, 50, 49, 145, 147, 192, 14, 7, + 241, 97, 97, 81, 97, 97, 82, 81, 17, 49, 51, 144, + 20, 8, 240, 33, 65, 33, 33, 33, 17, 49, 33, 113, + 113, 81, 17, 81, 33, 49, 67, 176, 15, 9, 225, 129, + 57, 81, 99, 81, 33, 81, 33, 99, 113, 98, 224, 16, + 9, 209, 33, 97, 40, 113, 99, 81, 33, 81, 33, 99, + 113, 98, 224, 18, 9, 241, 65, 49, 65, 49, 65, 41, + 17, 65, 49, 65, 34, 65, 129, 149, 160, 20, 9, 240, + 17, 49, 33, 33, 33, 49, 65, 41, 17, 65, 49, 65, + 34, 65, 129, 149, 160, 13, 8, 240, 37, 113, 97, 97, + 72, 49, 97, 113, 131, 160, 15, 8, 225, 36, 33, 81, + 97, 17, 65, 72, 49, 97, 113, 131, 160, 18, 9, 193, + 129, 87, 81, 129, 20, 33, 129, 49, 65, 33, 65, 49, + 65, 67, 144, 21, 9, 177, 65, 49, 33, 38, 17, 65, + 129, 20, 33, 129, 49, 65, 33, 65, 49, 65, 67, 160, + 15, 7, 145, 97, 71, 33, 97, 81, 19, 34, 49, 97, + 81, 51, 144, 18, 9, 177, 65, 49, 33, 38, 17, 65, + 129, 113, 19, 66, 49, 129, 113, 83, 208, 12, 7, 240, + 240, 130, 35, 33, 113, 97, 81, 51, 144, 13, 8, 240, + 195, 35, 49, 129, 113, 113, 82, 51, 240, 64, 16, 9, + 209, 33, 97, 33, 51, 51, 49, 145, 129, 129, 98, 67, + 240, 112, 12, 8, 240, 200, 33, 97, 97, 113, 113, 129, + 130, 144, 17, 9, 240, 245, 19, 17, 113, 49, 49, 33, + 33, 33, 49, 65, 145, 146, 192, 13, 6, 209, 81, 81, + 97, 18, 34, 49, 65, 81, 101, 96, 17, 8, 225, 33, + 33, 33, 17, 49, 49, 129, 18, 66, 81, 97, 113, 133, + 160, 22, 9, 193, 129, 49, 22, 33, 33, 113, 65, 49, + 65, 33, 51, 33, 33, 34, 65, 33, 17, 66, 192, 17, + 8, 240, 33, 113, 37, 113, 113, 65, 33, 49, 49, 49, + 65, 51, 17, 224, 26, 9, 225, 129, 65, 49, 65, 20, + 50, 33, 17, 33, 49, 34, 17, 17, 50, 17, 19, 18, + 34, 33, 34, 34, 17, 144, 22, 9, 177, 129, 129, 99, + 19, 66, 49, 49, 81, 33, 51, 18, 33, 34, 17, 33, + 33, 33, 50, 160, 20, 9, 240, 244, 65, 17, 33, 33, + 33, 50, 49, 50, 33, 66, 33, 65, 18, 65, 98, 176, + 24, 9, 241, 49, 65, 49, 65, 33, 39, 81, 33, 81, + 33, 51, 33, 33, 34, 33, 17, 33, 17, 17, 34, 192, + 26, 9, 240, 17, 33, 49, 33, 17, 65, 33, 39, 81, + 33, 81, 33, 51, 33, 33, 34, 33, 17, 33, 17, 17, + 34, 192, 26, 9, 242, 33, 49, 33, 17, 49, 34, 37, + 17, 81, 33, 81, 33, 51, 33, 33, 34, 33, 17, 33, + 17, 17, 34, 192, 21, 9, 240, 129, 52, 17, 97, 33, + 65, 50, 49, 49, 17, 17, 65, 49, 65, 49, 49, 83, + 208, 21, 9, 240, 17, 97, 37, 33, 81, 113, 49, 65, + 50, 33, 65, 17, 17, 65, 49, 49, 83, 208, 22, 9, + 242, 97, 37, 17, 33, 49, 34, 49, 49, 17, 33, 49, + 49, 65, 49, 65, 49, 49, 83, 208, 19, 9, 240, 98, + 146, 241, 81, 33, 33, 33, 49, 17, 17, 65, 34, 65, + 33, 50, 208, 22, 9, 240, 17, 66, 49, 97, 145, 81, + 81, 33, 33, 33, 49, 17, 17, 65, 34, 65, 33, 50, + 208, 22, 9, 242, 67, 33, 81, 33, 98, 81, 81, 33, + 33, 33, 49, 17, 17, 65, 34, 65, 33, 50, 208, 12, + 9, 0, 5, 115, 81, 49, 49, 81, 146, 240, 192, 15, + 9, 240, 161, 97, 33, 97, 67, 81, 49, 49, 81, 146, + 240, 192, 16, 9, 242, 97, 33, 81, 33, 98, 51, 81, + 49, 49, 81, 146, 240, 192, 24, 9, 240, 65, 22, 17, + 65, 33, 81, 33, 39, 81, 33, 51, 33, 33, 34, 33, + 17, 33, 17, 17, 34, 192, 26, 9, 240, 17, 33, 19, + 33, 17, 65, 33, 81, 33, 39, 81, 33, 51, 33, 33, + 34, 33, 17, 33, 17, 17, 34, 192, 26, 9, 242, 33, + 19, 33, 17, 49, 34, 82, 17, 36, 33, 81, 33, 51, + 33, 33, 34, 33, 17, 33, 17, 17, 34, 192, 16, 8, + 209, 113, 40, 81, 55, 81, 68, 49, 50, 33, 49, 17, + 35, 176, 20, 9, 240, 68, 129, 33, 81, 33, 81, 33, + 39, 17, 33, 51, 33, 49, 34, 49, 98, 192, 19, 9, + 193, 129, 85, 33, 65, 65, 19, 81, 33, 81, 33, 98, + 65, 49, 65, 68, 176, 24, 9, 225, 81, 33, 81, 33, + 85, 50, 33, 17, 17, 17, 17, 50, 17, 17, 50, 33, + 65, 18, 65, 98, 176, 15, 7, 161, 97, 55, 49, 97, + 55, 33, 97, 49, 33, 49, 51, 128, 17, 7, 240, 240, + 33, 49, 33, 49, 19, 19, 49, 33, 49, 49, 17, 65, + 160, 18, 9, 225, 129, 81, 33, 81, 20, 20, 65, 49, + 65, 49, 34, 81, 129, 129, 208, 20, 7, 240, 240, 33, + 33, 35, 17, 17, 17, 18, 17, 17, 17, 17, 19, 33, + 33, 81, 160, 24, 9, 225, 129, 101, 17, 17, 33, 34, + 17, 33, 33, 17, 49, 33, 17, 17, 17, 33, 17, 36, + 97, 98, 208, 13, 6, 240, 193, 81, 83, 49, 51, 33, + 34, 34, 33, 96, 16, 7, 161, 97, 97, 100, 49, 97, + 68, 33, 50, 17, 49, 17, 19, 160, 14, 7, 242, 114, + 33, 97, 97, 35, 19, 49, 97, 81, 51, 144, 15, 5, + 161, 50, 50, 50, 50, 17, 17, 17, 33, 65, 49, 34, + 112, 17, 7, 245, 81, 81, 83, 34, 49, 50, 33, 17, + 33, 17, 17, 34, 51, 144, 22, 9, 177, 129, 129, 99, + 34, 65, 17, 33, 50, 49, 49, 49, 50, 49, 33, 17, + 49, 65, 66, 144, 13, 7, 245, 81, 81, 83, 34, 49, + 113, 97, 81, 51, 144, 16, 7, 240, 241, 97, 67, 18, + 50, 33, 33, 49, 18, 50, 17, 18, 128, 21, 9, 177, + 129, 129, 99, 34, 65, 17, 33, 50, 65, 33, 81, 18, + 82, 17, 65, 49, 34, 176, 22, 9, 240, 69, 129, 85, + 49, 33, 33, 17, 49, 50, 49, 20, 33, 17, 33, 18, + 33, 33, 98, 160, 18, 9, 240, 71, 97, 100, 50, 65, + 66, 33, 53, 65, 115, 34, 17, 50, 33, 144, 18, 8, + 177, 113, 71, 49, 114, 34, 17, 34, 33, 33, 17, 65, + 33, 65, 132, 144, 17, 8, 240, 65, 113, 97, 113, 114, + 81, 33, 65, 33, 34, 49, 34, 66, 144, 17, 9, 240, + 17, 50, 65, 65, 17, 145, 52, 50, 65, 129, 129, 98, + 82, 224, 19, 8, 240, 240, 65, 113, 85, 17, 33, 33, + 17, 33, 33, 33, 17, 33, 49, 33, 192, 15, 6, 240, + 113, 17, 49, 17, 21, 49, 17, 49, 18, 33, 65, 224, + 9, 4, 97, 17, 33, 17, 240, 240, 64, 9, 4, 82, + 17, 34, 33, 18, 240, 224, 8, 4, 240, 17, 65, 65, + 69, 192, 13, 7, 240, 65, 65, 34, 49, 49, 113, 113, + 52, 240, 144, 11, 6, 240, 246, 81, 33, 17, 49, 81, + 50, 160, 14, 8, 240, 152, 113, 49, 33, 65, 17, 81, + 113, 97, 82, 224, 12, 6, 240, 225, 65, 50, 34, 17, + 81, 81, 81, 128, 14, 7, 240, 81, 97, 81, 81, 67, + 34, 33, 97, 97, 97, 144, 11, 6, 240, 177, 81, 55, + 66, 65, 65, 50, 128, 13, 8, 177, 113, 113, 73, 98, + 97, 97, 113, 82, 66, 192, 11, 7, 240, 240, 101, 65, + 97, 97, 97, 55, 112, 12, 9, 240, 215, 81, 129, 129, + 129, 129, 73, 240, 48, 13, 6, 240, 209, 81, 22, 50, + 49, 17, 18, 33, 66, 112, 15, 9, 225, 129, 129, 57, + 81, 114, 82, 17, 50, 49, 129, 99, 192, 18, 8, 177, + 113, 113, 72, 49, 49, 49, 49, 49, 49, 33, 65, 33, + 67, 50, 144, 23, 9, 193, 49, 65, 17, 33, 49, 33, + 40, 65, 49, 65, 49, 65, 49, 49, 65, 49, 65, 18, + 50, 176, 13, 9, 209, 129, 129, 87, 81, 129, 73, 81, + 129, 129, 192, 17, 9, 209, 33, 81, 49, 65, 17, 53, + 17, 81, 129, 73, 81, 129, 129, 192, 15, 7, 145, 97, + 101, 33, 49, 17, 66, 81, 81, 97, 66, 50, 176, 19, + 9, 209, 33, 49, 33, 33, 37, 65, 49, 49, 65, 33, + 81, 113, 129, 98, 82, 240, 14, 8, 145, 113, 113, 120, + 49, 49, 49, 113, 113, 97, 82, 208, 19, 9, 161, 81, + 33, 49, 33, 17, 65, 55, 17, 49, 65, 49, 129, 129, + 113, 98, 240, 11, 7, 240, 103, 97, 97, 97, 97, 104, + 97, 112, 14, 9, 209, 33, 97, 40, 129, 129, 129, 129, + 129, 39, 129, 176, 17, 9, 241, 65, 49, 65, 49, 41, + 33, 49, 65, 49, 129, 129, 113, 98, 208, 19, 9, 240, + 17, 49, 33, 33, 33, 49, 41, 33, 49, 65, 49, 129, + 129, 113, 98, 208, 14, 8, 240, 34, 130, 163, 81, 34, + 33, 113, 97, 82, 66, 208, 18, 9, 240, 17, 18, 49, + 33, 34, 33, 178, 81, 50, 49, 113, 113, 98, 82, 240, + 14, 8, 240, 166, 113, 113, 97, 113, 97, 17, 50, 51, + 81, 128, 18, 9, 209, 33, 97, 33, 22, 129, 129, 113, + 129, 113, 17, 66, 49, 18, 81, 160, 16, 9, 193, 129, + 129, 129, 25, 49, 49, 49, 65, 33, 81, 129, 148, 160, + 20, 9, 193, 49, 65, 17, 33, 49, 33, 81, 25, 49, + 49, 49, 65, 33, 81, 129, 148, 160, 15, 8, 240, 130, + 98, 97, 17, 81, 17, 65, 113, 97, 82, 66, 208, 17, + 9, 209, 33, 97, 34, 129, 97, 33, 81, 33, 65, 129, + 113, 98, 82, 240, 17, 7, 145, 97, 101, 33, 49, 17, + 17, 34, 49, 17, 81, 97, 66, 35, 176, 21, 9, 209, + 33, 49, 33, 33, 37, 65, 49, 49, 17, 33, 33, 49, + 17, 113, 129, 98, 67, 240, 13, 9, 240, 131, 36, 129, + 129, 73, 65, 129, 113, 98, 240, 16, 9, 240, 17, 97, + 33, 20, 17, 97, 129, 73, 65, 129, 113, 98, 240, 14, + 6, 240, 241, 17, 34, 17, 34, 17, 33, 81, 65, 35, + 128, 16, 8, 240, 145, 33, 50, 33, 50, 33, 49, 113, + 97, 113, 82, 51, 192, 19, 9, 240, 17, 97, 34, 33, + 33, 33, 33, 81, 33, 49, 129, 113, 129, 98, 67, 224, + 12, 9, 240, 71, 240, 73, 65, 129, 129, 113, 98, 240, + 14, 9, 240, 17, 37, 33, 97, 185, 65, 129, 129, 113, + 98, 240, 13, 6, 193, 81, 81, 82, 65, 18, 33, 51, + 81, 81, 176, 17, 7, 193, 17, 33, 34, 49, 33, 98, + 81, 18, 49, 50, 17, 97, 97, 208, 13, 8, 193, 113, + 113, 56, 65, 113, 113, 113, 97, 82, 208, 9, 8, 240, + 166, 240, 240, 184, 240, 16, 16, 7, 240, 103, 97, 97, + 33, 33, 65, 17, 81, 66, 17, 18, 65, 112, 17, 9, + 209, 129, 129, 87, 113, 113, 98, 17, 35, 17, 33, 81, + 49, 65, 208, 12, 7, 240, 193, 97, 97, 81, 97, 81, + 66, 50, 192, 17, 8, 240, 177, 113, 49, 49, 49, 33, + 65, 33, 81, 17, 82, 98, 97, 128, 21, 9, 240, 17, + 97, 33, 33, 49, 65, 129, 113, 65, 49, 65, 49, 81, + 17, 97, 17, 97, 160, 22, 9, 242, 97, 33, 33, 33, + 33, 33, 50, 49, 113, 65, 49, 65, 49, 81, 17, 97, + 17, 97, 160, 12, 7, 225, 97, 97, 71, 33, 97, 97, + 97, 118, 112, 16, 8, 225, 17, 49, 34, 65, 33, 113, + 51, 20, 65, 113, 113, 134, 144, 17, 8, 210, 17, 49, + 34, 49, 34, 66, 17, 34, 51, 81, 113, 113, 134, 144, + 12, 8, 240, 152, 113, 113, 113, 97, 113, 82, 51, 192, + 14, 9, 209, 33, 97, 41, 129, 129, 129, 113, 129, 98, + 67, 224, 14, 9, 242, 97, 39, 33, 98, 113, 129, 113, + 129, 98, 82, 240, 13, 9, 240, 240, 130, 97, 33, 65, + 65, 145, 146, 240, 192, 16, 9, 240, 161, 97, 33, 97, + 66, 97, 33, 65, 65, 145, 146, 240, 48, 18, 9, 240, + 146, 97, 33, 81, 33, 34, 34, 33, 33, 65, 65, 145, + 146, 240, 48, 17, 9, 209, 129, 129, 73, 65, 129, 81, + 33, 33, 17, 49, 49, 65, 114, 208, 20, 9, 225, 17, + 81, 17, 17, 65, 73, 65, 129, 81, 33, 33, 17, 49, + 49, 65, 114, 208, 21, 10, 225, 34, 81, 17, 33, 65, + 17, 42, 81, 145, 97, 33, 33, 33, 49, 49, 81, 130, + 240, 14, 8, 240, 152, 113, 97, 33, 49, 65, 17, 97, + 129, 129, 160, 9, 6, 195, 99, 114, 98, 211, 99, 96, + 18, 8, 240, 49, 113, 113, 97, 65, 33, 65, 33, 65, + 17, 50, 21, 49, 113, 128, 16, 8, 240, 113, 113, 49, + 49, 65, 33, 82, 113, 97, 17, 50, 51, 224, 12, 9, + 240, 215, 65, 129, 89, 49, 129, 129, 148, 160, 13, 6, + 240, 161, 81, 81, 22, 33, 33, 17, 49, 81, 144, 17, + 9, 240, 97, 129, 35, 51, 37, 65, 49, 49, 81, 33, + 81, 129, 129, 208, 10, 7, 240, 240, 100, 97, 97, 97, + 39, 224, 12, 9, 240, 214, 129, 129, 129, 129, 129, 41, + 240, 48, 7, 5, 240, 245, 70, 70, 80, 10, 7, 240, + 103, 97, 104, 97, 104, 97, 112, 12, 8, 240, 38, 240, + 40, 113, 113, 97, 82, 66, 192, 13, 5, 161, 50, 50, + 50, 50, 49, 65, 65, 49, 34, 112, 26, 9, 240, 113, + 81, 33, 81, 33, 81, 33, 49, 17, 33, 49, 17, 33, + 33, 33, 33, 33, 17, 49, 17, 33, 50, 192, 14, 7, + 225, 97, 97, 97, 97, 97, 82, 65, 17, 34, 35, 176, + 11, 8, 240, 153, 98, 98, 98, 98, 106, 97, 128, 10, + 6, 240, 247, 66, 65, 81, 65, 50, 128, 12, 8, 240, + 153, 98, 98, 97, 97, 113, 82, 66, 192, 16, 9, 240, + 129, 129, 71, 49, 33, 81, 33, 81, 33, 57, 81, 129, + 192, 12, 9, 240, 215, 129, 113, 98, 113, 129, 73, 240, + 48, 11, 7, 240, 103, 97, 104, 97, 81, 66, 50, 176, + 13, 8, 240, 146, 130, 49, 113, 97, 113, 97, 82, 66, + 208, 19, 9, 193, 49, 65, 17, 33, 49, 33, 40, 17, + 97, 17, 97, 113, 129, 98, 82, 224, 16, 7, 240, 240, + 17, 97, 55, 33, 49, 33, 49, 17, 65, 17, 34, 128, + 11, 7, 240, 225, 97, 103, 49, 97, 81, 66, 176, 17, + 10, 240, 49, 129, 26, 17, 81, 49, 81, 49, 81, 129, + 130, 99, 240, 160, 18, 9, 129, 81, 17, 97, 71, 49, + 33, 81, 33, 81, 33, 57, 81, 129, 129, 192, 14, 9, + 240, 33, 129, 23, 81, 33, 83, 97, 129, 73, 240, 192, + 16, 10, 240, 49, 129, 24, 17, 113, 55, 129, 145, 129, + 99, 113, 240, 48, 4, 2, 196, 128, 9, 8, 240, 240, + 161, 135, 240, 240, 160, 9, 4, 240, 17, 65, 65, 65, + 49, 192, 13, 7, 240, 65, 65, 34, 49, 49, 113, 113, + 97, 240, 144, + 0, // Padding + +}; + +tFont *g_psFontWSazanamigothic6x10 = (tFont *)g_pui8Sazanamigothic6x10; diff --git a/third_party/fonts/other/fonts/fontsazanamigothic7x13.c b/third_party/fonts/other/fonts/fontsazanamigothic7x13.c new file mode 100644 index 0000000..ef0e089 --- /dev/null +++ b/third_party/fonts/other/fonts/fontsazanamigothic7x13.c @@ -0,0 +1,837 @@ +//***************************************************************************** +// +// fontsazanamigothic7x13.c - Font definition for the 7x13 Sazanamigothic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from Sazanami +// +// Copyright (c) 1990-2003 +// Wada Laboratory, the University of Tokyo. All rights reserved. +// Copyright (c) 2003-2004 +// Electronic Font Open Laboratory (/efont/). All rights reserved +// +// For license, please see README. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 286 in 2 blocks +// Style: sazanamigothic +// Size: 7x13 +// Bold: no +// Italic: no +// Memory usage: 6491 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Sazanamigothic7x13[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 12, + + // + // The height of the font. + // + 15, + + // + // The baseline of the font. + // + 13, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3041 - 0x30ff + // + 0x41, 0x30, 0x00, 0x00, + 0xbf, 0x00, 0x00, 0x00, + 0xf4, 0x06, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x85, 0x01, 0x00, 0x00, // Offset 389 (0x185) + 0x91, 0x01, 0x00, 0x00, // Offset 401 (0x191) + 0xa7, 0x01, 0x00, 0x00, // Offset 423 (0x1a7) + 0xbd, 0x01, 0x00, 0x00, // Offset 445 (0x1bd) + 0xcf, 0x01, 0x00, 0x00, // Offset 463 (0x1cf) + 0xe4, 0x01, 0x00, 0x00, // Offset 484 (0x1e4) + 0xeb, 0x01, 0x00, 0x00, // Offset 491 (0x1eb) + 0xfa, 0x01, 0x00, 0x00, // Offset 506 (0x1fa) + 0x0a, 0x02, 0x00, 0x00, // Offset 522 (0x20a) + 0x1a, 0x02, 0x00, 0x00, // Offset 538 (0x21a) + 0x26, 0x02, 0x00, 0x00, // Offset 550 (0x226) + 0x2c, 0x02, 0x00, 0x00, // Offset 556 (0x22c) + 0x33, 0x02, 0x00, 0x00, // Offset 563 (0x233) + 0x38, 0x02, 0x00, 0x00, // Offset 568 (0x238) + 0x49, 0x02, 0x00, 0x00, // Offset 585 (0x249) + 0x5a, 0x02, 0x00, 0x00, // Offset 602 (0x25a) + 0x69, 0x02, 0x00, 0x00, // Offset 617 (0x269) + 0x78, 0x02, 0x00, 0x00, // Offset 632 (0x278) + 0x86, 0x02, 0x00, 0x00, // Offset 646 (0x286) + 0x99, 0x02, 0x00, 0x00, // Offset 665 (0x299) + 0xa7, 0x02, 0x00, 0x00, // Offset 679 (0x2a7) + 0xb7, 0x02, 0x00, 0x00, // Offset 695 (0x2b7) + 0xc6, 0x02, 0x00, 0x00, // Offset 710 (0x2c6) + 0xd8, 0x02, 0x00, 0x00, // Offset 728 (0x2d8) + 0xe8, 0x02, 0x00, 0x00, // Offset 744 (0x2e8) + 0xed, 0x02, 0x00, 0x00, // Offset 749 (0x2ed) + 0xf4, 0x02, 0x00, 0x00, // Offset 756 (0x2f4) + 0x01, 0x03, 0x00, 0x00, // Offset 769 (0x301) + 0x09, 0x03, 0x00, 0x00, // Offset 777 (0x309) + 0x16, 0x03, 0x00, 0x00, // Offset 790 (0x316) + 0x24, 0x03, 0x00, 0x00, // Offset 804 (0x324) + 0x37, 0x03, 0x00, 0x00, // Offset 823 (0x337) + 0x49, 0x03, 0x00, 0x00, // Offset 841 (0x349) + 0x5c, 0x03, 0x00, 0x00, // Offset 860 (0x35c) + 0x6c, 0x03, 0x00, 0x00, // Offset 876 (0x36c) + 0x7c, 0x03, 0x00, 0x00, // Offset 892 (0x37c) + 0x89, 0x03, 0x00, 0x00, // Offset 905 (0x389) + 0x97, 0x03, 0x00, 0x00, // Offset 919 (0x397) + 0xa8, 0x03, 0x00, 0x00, // Offset 936 (0x3a8) + 0xb6, 0x03, 0x00, 0x00, // Offset 950 (0x3b6) + 0xc3, 0x03, 0x00, 0x00, // Offset 963 (0x3c3) + 0xd1, 0x03, 0x00, 0x00, // Offset 977 (0x3d1) + 0xe8, 0x03, 0x00, 0x00, // Offset 1000 (0x3e8) + 0xf6, 0x03, 0x00, 0x00, // Offset 1014 (0x3f6) + 0x07, 0x04, 0x00, 0x00, // Offset 1031 (0x407) + 0x18, 0x04, 0x00, 0x00, // Offset 1048 (0x418) + 0x27, 0x04, 0x00, 0x00, // Offset 1063 (0x427) + 0x36, 0x04, 0x00, 0x00, // Offset 1078 (0x436) + 0x47, 0x04, 0x00, 0x00, // Offset 1095 (0x447) + 0x58, 0x04, 0x00, 0x00, // Offset 1112 (0x458) + 0x66, 0x04, 0x00, 0x00, // Offset 1126 (0x466) + 0x75, 0x04, 0x00, 0x00, // Offset 1141 (0x475) + 0x84, 0x04, 0x00, 0x00, // Offset 1156 (0x484) + 0x96, 0x04, 0x00, 0x00, // Offset 1174 (0x496) + 0xab, 0x04, 0x00, 0x00, // Offset 1195 (0x4ab) + 0xbf, 0x04, 0x00, 0x00, // Offset 1215 (0x4bf) + 0xcf, 0x04, 0x00, 0x00, // Offset 1231 (0x4cf) + 0xdd, 0x04, 0x00, 0x00, // Offset 1245 (0x4dd) + 0xeb, 0x04, 0x00, 0x00, // Offset 1259 (0x4eb) + 0xfa, 0x04, 0x00, 0x00, // Offset 1274 (0x4fa) + 0x08, 0x05, 0x00, 0x00, // Offset 1288 (0x508) + 0x12, 0x05, 0x00, 0x00, // Offset 1298 (0x512) + 0x17, 0x05, 0x00, 0x00, // Offset 1303 (0x517) + 0x1e, 0x05, 0x00, 0x00, // Offset 1310 (0x51e) + 0x2b, 0x05, 0x00, 0x00, // Offset 1323 (0x52b) + 0x3b, 0x05, 0x00, 0x00, // Offset 1339 (0x53b) + 0x48, 0x05, 0x00, 0x00, // Offset 1352 (0x548) + 0x58, 0x05, 0x00, 0x00, // Offset 1368 (0x558) + 0x64, 0x05, 0x00, 0x00, // Offset 1380 (0x564) + 0x73, 0x05, 0x00, 0x00, // Offset 1395 (0x573) + 0x85, 0x05, 0x00, 0x00, // Offset 1413 (0x585) + 0x95, 0x05, 0x00, 0x00, // Offset 1429 (0x595) + 0xa1, 0x05, 0x00, 0x00, // Offset 1441 (0x5a1) + 0xaf, 0x05, 0x00, 0x00, // Offset 1455 (0x5af) + 0xc3, 0x05, 0x00, 0x00, // Offset 1475 (0x5c3) + 0xd0, 0x05, 0x00, 0x00, // Offset 1488 (0x5d0) + 0xe2, 0x05, 0x00, 0x00, // Offset 1506 (0x5e2) + 0xf0, 0x05, 0x00, 0x00, // Offset 1520 (0x5f0) + 0xfd, 0x05, 0x00, 0x00, // Offset 1533 (0x5fd) + 0x0d, 0x06, 0x00, 0x00, // Offset 1549 (0x60d) + 0x1c, 0x06, 0x00, 0x00, // Offset 1564 (0x61c) + 0x2a, 0x06, 0x00, 0x00, // Offset 1578 (0x62a) + 0x38, 0x06, 0x00, 0x00, // Offset 1592 (0x638) + 0x47, 0x06, 0x00, 0x00, // Offset 1607 (0x647) + 0x55, 0x06, 0x00, 0x00, // Offset 1621 (0x655) + 0x63, 0x06, 0x00, 0x00, // Offset 1635 (0x663) + 0x74, 0x06, 0x00, 0x00, // Offset 1652 (0x674) + 0x86, 0x06, 0x00, 0x00, // Offset 1670 (0x686) + 0x97, 0x06, 0x00, 0x00, // Offset 1687 (0x697) + 0xa3, 0x06, 0x00, 0x00, // Offset 1699 (0x6a3) + 0xb2, 0x06, 0x00, 0x00, // Offset 1714 (0x6b2) + 0xb5, 0x06, 0x00, 0x00, // Offset 1717 (0x6b5) + 0xc5, 0x06, 0x00, 0x00, // Offset 1733 (0x6c5) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 4, 8, 0, 15, 5, 1, 55, 18, 32, 12, 5, 162, + 18, 17, 33, 17, 34, 33, 0, 5, 96, 22, 5, 240, + 17, 17, 33, 17, 33, 17, 21, 17, 17, 33, 17, 21, + 17, 17, 33, 17, 33, 17, 176, 22, 6, 240, 97, 52, + 17, 33, 18, 33, 17, 17, 17, 67, 65, 18, 33, 18, + 33, 17, 20, 65, 128, 18, 6, 240, 66, 34, 33, 18, + 34, 35, 81, 65, 83, 34, 34, 17, 34, 34, 208, 21, + 6, 240, 82, 49, 33, 33, 33, 33, 33, 50, 50, 34, + 33, 18, 49, 17, 34, 34, 33, 192, 7, 2, 66, 17, + 18, 240, 64, 15, 4, 177, 33, 33, 49, 33, 49, 49, + 49, 49, 65, 49, 65, 65, 16, 4, 129, 65, 65, 49, + 65, 49, 49, 49, 49, 33, 49, 33, 33, 48, 16, 5, + 240, 193, 33, 17, 17, 19, 49, 51, 17, 17, 17, 33, + 240, 32, 12, 5, 240, 193, 65, 65, 37, 33, 65, 65, + 240, 32, 6, 2, 240, 114, 17, 18, 7, 5, 240, 240, + 165, 240, 240, 5, 2, 240, 116, 64, 17, 6, 240, 33, + 81, 65, 81, 65, 81, 81, 65, 81, 65, 81, 65, 81, + 80, 17, 6, 240, 82, 49, 33, 17, 66, 66, 66, 66, + 66, 65, 17, 33, 50, 224, 15, 5, 240, 33, 50, 33, + 17, 65, 65, 65, 65, 65, 65, 37, 160, 15, 6, 240, + 68, 17, 66, 65, 81, 65, 81, 65, 65, 65, 70, 192, + 14, 6, 240, 54, 81, 65, 65, 67, 97, 82, 66, 65, + 20, 208, 19, 6, 240, 113, 66, 49, 17, 49, 17, 33, + 33, 33, 33, 17, 49, 22, 65, 81, 208, 14, 6, 240, + 55, 81, 85, 17, 65, 81, 82, 66, 65, 20, 208, 16, + 6, 240, 83, 33, 65, 81, 81, 19, 18, 50, 66, 66, + 65, 20, 208, 15, 6, 240, 54, 81, 65, 81, 65, 81, + 65, 81, 65, 81, 240, 16, 18, 6, 240, 68, 17, 66, + 65, 17, 33, 50, 49, 33, 17, 66, 66, 65, 20, 208, + 16, 6, 240, 68, 17, 66, 66, 66, 50, 19, 17, 82, + 66, 49, 35, 224, 5, 2, 196, 68, 96, 7, 2, 196, + 66, 17, 18, 48, 13, 5, 240, 145, 49, 49, 49, 49, + 81, 81, 81, 81, 160, 8, 6, 240, 240, 102, 198, 240, + 240, 13, 5, 240, 81, 81, 81, 81, 81, 49, 49, 49, + 49, 224, 14, 6, 240, 68, 17, 66, 65, 65, 65, 81, + 81, 177, 81, 224, 19, 6, 240, 83, 33, 50, 36, 17, + 34, 17, 34, 17, 34, 17, 34, 35, 17, 100, 192, 18, + 6, 240, 82, 66, 49, 33, 33, 33, 33, 33, 36, 17, + 66, 66, 66, 65, 192, 19, 6, 240, 52, 33, 49, 17, + 49, 17, 49, 20, 33, 49, 17, 66, 66, 49, 20, 224, + 16, 6, 240, 83, 33, 50, 66, 81, 81, 81, 81, 65, + 17, 49, 35, 208, 16, 6, 240, 52, 33, 49, 17, 66, + 66, 66, 66, 66, 66, 49, 20, 224, 13, 6, 240, 55, + 81, 81, 84, 33, 81, 81, 81, 86, 192, 14, 6, 240, + 55, 81, 81, 84, 33, 81, 81, 81, 81, 240, 32, 17, + 6, 240, 83, 33, 50, 66, 81, 81, 36, 66, 65, 17, + 34, 34, 17, 192, 14, 6, 240, 49, 66, 66, 66, 72, + 66, 66, 66, 66, 65, 192, 13, 3, 147, 17, 33, 33, + 33, 33, 33, 33, 33, 19, 96, 14, 5, 240, 65, 65, + 65, 65, 65, 65, 66, 50, 49, 19, 176, 23, 6, 240, + 49, 66, 49, 17, 33, 33, 33, 33, 17, 50, 17, 33, + 33, 33, 49, 17, 49, 17, 65, 192, 14, 6, 240, 49, + 81, 81, 81, 81, 81, 81, 81, 81, 86, 192, 17, 6, + 240, 49, 67, 36, 35, 18, 18, 18, 18, 66, 66, 66, + 66, 65, 192, 17, 6, 240, 49, 66, 67, 51, 50, 17, + 34, 33, 18, 51, 51, 66, 65, 192, 15, 6, 240, 68, + 17, 66, 66, 66, 66, 66, 66, 66, 65, 20, 208, 15, + 6, 240, 53, 17, 66, 66, 66, 70, 17, 81, 81, 81, + 240, 32, 17, 6, 240, 68, 17, 66, 66, 66, 66, 68, + 34, 33, 18, 50, 20, 81, 97, 17, 6, 240, 53, 17, + 66, 66, 66, 70, 17, 33, 33, 49, 17, 66, 65, 192, + 14, 6, 240, 68, 17, 66, 66, 98, 98, 98, 66, 65, + 20, 208, 15, 7, 240, 103, 49, 97, 97, 97, 97, 97, + 97, 97, 97, 240, 32, 15, 6, 240, 49, 66, 66, 66, + 66, 66, 66, 66, 66, 65, 20, 208, 18, 6, 240, 49, + 66, 66, 66, 65, 17, 33, 33, 33, 33, 33, 50, 66, + 66, 224, 21, 5, 241, 50, 50, 50, 17, 18, 17, 18, + 17, 18, 17, 18, 17, 17, 17, 17, 33, 17, 176, 20, + 6, 240, 49, 66, 65, 17, 33, 33, 33, 50, 66, 49, + 33, 33, 33, 17, 66, 65, 192, 16, 5, 241, 50, 50, + 49, 17, 17, 33, 17, 49, 65, 65, 65, 65, 192, 14, + 6, 240, 54, 81, 65, 65, 81, 65, 65, 81, 65, 86, + 192, 14, 4, 133, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 52, 15, 6, 193, 81, 97, 81, 97, 81, 81, + 97, 81, 97, 81, 97, 81, 14, 4, 132, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 53, 10, 6, 226, 49, + 33, 17, 65, 0, 7, 64, 5, 6, 0, 10, 70, 7, + 2, 67, 17, 33, 240, 48, 13, 6, 240, 240, 116, 17, + 65, 81, 22, 66, 65, 21, 192, 16, 6, 240, 49, 81, + 81, 81, 19, 18, 50, 66, 66, 67, 50, 19, 208, 13, + 6, 240, 240, 116, 17, 66, 81, 81, 81, 65, 20, 208, + 16, 6, 240, 129, 81, 81, 19, 18, 51, 66, 66, 66, + 50, 19, 17, 192, 12, 6, 240, 240, 116, 17, 66, 72, + 81, 65, 20, 208, 15, 6, 240, 98, 49, 33, 33, 81, + 53, 49, 81, 81, 81, 81, 240, 18, 6, 240, 240, 115, + 18, 49, 17, 49, 17, 49, 35, 49, 65, 19, 17, 65, + 20, 16, 6, 240, 49, 81, 81, 81, 19, 18, 50, 66, + 66, 66, 66, 65, 192, 12, 2, 113, 17, 34, 17, 17, + 17, 17, 17, 17, 64, 14, 4, 241, 49, 98, 49, 49, + 49, 49, 49, 49, 33, 18, 32, 20, 6, 240, 49, 81, + 81, 81, 49, 17, 33, 33, 17, 51, 49, 33, 33, 49, + 17, 65, 192, 13, 2, 98, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 64, 18, 5, 240, 242, 17, 17, 17, 18, + 17, 18, 17, 18, 17, 18, 17, 18, 49, 160, 14, 6, + 240, 240, 97, 19, 18, 50, 66, 66, 66, 66, 65, 192, + 13, 6, 240, 240, 116, 17, 66, 66, 66, 66, 65, 20, + 208, 16, 6, 240, 240, 97, 19, 18, 50, 66, 66, 67, + 50, 19, 17, 81, 80, 15, 6, 240, 240, 115, 18, 51, + 66, 66, 66, 50, 19, 17, 81, 81, 14, 6, 240, 240, + 97, 19, 18, 50, 66, 81, 81, 81, 240, 32, 14, 6, + 240, 240, 116, 17, 65, 17, 98, 97, 17, 65, 20, 208, + 15, 6, 240, 81, 81, 81, 53, 49, 81, 81, 81, 81, + 33, 50, 208, 14, 6, 240, 240, 97, 66, 66, 66, 66, + 66, 50, 19, 17, 192, 14, 5, 240, 241, 50, 50, 49, + 17, 17, 33, 17, 49, 65, 192, 17, 5, 240, 241, 50, + 50, 17, 18, 17, 18, 17, 17, 17, 17, 33, 17, 176, + 18, 6, 240, 240, 97, 65, 17, 33, 33, 33, 50, 49, + 33, 33, 33, 17, 65, 192, 17, 6, 240, 240, 97, 66, + 65, 17, 33, 33, 33, 50, 81, 65, 81, 50, 64, 12, + 6, 240, 240, 102, 65, 65, 65, 81, 65, 70, 192, 15, + 4, 162, 17, 49, 49, 49, 49, 33, 65, 49, 49, 49, + 49, 66, 3, 1, 45, 16, 4, 130, 65, 49, 49, 49, + 49, 65, 33, 49, 49, 49, 49, 18, 32, 12, 6, 209, + 65, 17, 34, 33, 17, 65, 0, 6, 112, + 0, 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3041 - 0x30ff + // + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x13, 0x03, 0x00, 0x00, // Offset 787 (0x313) + 0x2f, 0x03, 0x00, 0x00, // Offset 815 (0x32f) + 0x3f, 0x03, 0x00, 0x00, // Offset 831 (0x33f) + 0x54, 0x03, 0x00, 0x00, // Offset 852 (0x354) + 0x63, 0x03, 0x00, 0x00, // Offset 867 (0x363) + 0x73, 0x03, 0x00, 0x00, // Offset 883 (0x373) + 0x82, 0x03, 0x00, 0x00, // Offset 898 (0x382) + 0x94, 0x03, 0x00, 0x00, // Offset 916 (0x394) + 0xa8, 0x03, 0x00, 0x00, // Offset 936 (0x3a8) + 0xc4, 0x03, 0x00, 0x00, // Offset 964 (0x3c4) + 0xe3, 0x03, 0x00, 0x00, // Offset 995 (0x3e3) + 0x06, 0x04, 0x00, 0x00, // Offset 1030 (0x406) + 0x19, 0x04, 0x00, 0x00, // Offset 1049 (0x419) + 0x32, 0x04, 0x00, 0x00, // Offset 1074 (0x432) + 0x42, 0x04, 0x00, 0x00, // Offset 1090 (0x442) + 0x58, 0x04, 0x00, 0x00, // Offset 1112 (0x458) + 0x74, 0x04, 0x00, 0x00, // Offset 1140 (0x474) + 0x95, 0x04, 0x00, 0x00, // Offset 1173 (0x495) + 0xa2, 0x04, 0x00, 0x00, // Offset 1186 (0x4a2) + 0xb4, 0x04, 0x00, 0x00, // Offset 1204 (0x4b4) + 0xc6, 0x04, 0x00, 0x00, // Offset 1222 (0x4c6) + 0xdd, 0x04, 0x00, 0x00, // Offset 1245 (0x4dd) + 0xef, 0x04, 0x00, 0x00, // Offset 1263 (0x4ef) + 0x04, 0x05, 0x00, 0x00, // Offset 1284 (0x504) + 0x19, 0x05, 0x00, 0x00, // Offset 1305 (0x519) + 0x32, 0x05, 0x00, 0x00, // Offset 1330 (0x532) + 0x4a, 0x05, 0x00, 0x00, // Offset 1354 (0x54a) + 0x67, 0x05, 0x00, 0x00, // Offset 1383 (0x567) + 0x77, 0x05, 0x00, 0x00, // Offset 1399 (0x577) + 0x8f, 0x05, 0x00, 0x00, // Offset 1423 (0x58f) + 0xa4, 0x05, 0x00, 0x00, // Offset 1444 (0x5a4) + 0xbe, 0x05, 0x00, 0x00, // Offset 1470 (0x5be) + 0xd3, 0x05, 0x00, 0x00, // Offset 1491 (0x5d3) + 0xee, 0x05, 0x00, 0x00, // Offset 1518 (0x5ee) + 0xfb, 0x05, 0x00, 0x00, // Offset 1531 (0x5fb) + 0x0c, 0x06, 0x00, 0x00, // Offset 1548 (0x60c) + 0x22, 0x06, 0x00, 0x00, // Offset 1570 (0x622) + 0x34, 0x06, 0x00, 0x00, // Offset 1588 (0x634) + 0x4d, 0x06, 0x00, 0x00, // Offset 1613 (0x64d) + 0x5e, 0x06, 0x00, 0x00, // Offset 1630 (0x65e) + 0x75, 0x06, 0x00, 0x00, // Offset 1653 (0x675) + 0x8e, 0x06, 0x00, 0x00, // Offset 1678 (0x68e) + 0xa5, 0x06, 0x00, 0x00, // Offset 1701 (0x6a5) + 0xc9, 0x06, 0x00, 0x00, // Offset 1737 (0x6c9) + 0xe6, 0x06, 0x00, 0x00, // Offset 1766 (0x6e6) + 0x01, 0x07, 0x00, 0x00, // Offset 1793 (0x701) + 0x23, 0x07, 0x00, 0x00, // Offset 1827 (0x723) + 0x4a, 0x07, 0x00, 0x00, // Offset 1866 (0x74a) + 0x6f, 0x07, 0x00, 0x00, // Offset 1903 (0x76f) + 0x88, 0x07, 0x00, 0x00, // Offset 1928 (0x788) + 0xa7, 0x07, 0x00, 0x00, // Offset 1959 (0x7a7) + 0xc6, 0x07, 0x00, 0x00, // Offset 1990 (0x7c6) + 0xdf, 0x07, 0x00, 0x00, // Offset 2015 (0x7df) + 0xfe, 0x07, 0x00, 0x00, // Offset 2046 (0x7fe) + 0x1b, 0x08, 0x00, 0x00, // Offset 2075 (0x81b) + 0x2c, 0x08, 0x00, 0x00, // Offset 2092 (0x82c) + 0x43, 0x08, 0x00, 0x00, // Offset 2115 (0x843) + 0x5a, 0x08, 0x00, 0x00, // Offset 2138 (0x85a) + 0x7b, 0x08, 0x00, 0x00, // Offset 2171 (0x87b) + 0xa1, 0x08, 0x00, 0x00, // Offset 2209 (0x8a1) + 0xc6, 0x08, 0x00, 0x00, // Offset 2246 (0x8c6) + 0xd9, 0x08, 0x00, 0x00, // Offset 2265 (0x8d9) + 0xf3, 0x08, 0x00, 0x00, // Offset 2291 (0x8f3) + 0x0c, 0x09, 0x00, 0x00, // Offset 2316 (0x90c) + 0x2f, 0x09, 0x00, 0x00, // Offset 2351 (0x92f) + 0x44, 0x09, 0x00, 0x00, // Offset 2372 (0x944) + 0x57, 0x09, 0x00, 0x00, // Offset 2391 (0x957) + 0x6f, 0x09, 0x00, 0x00, // Offset 2415 (0x96f) + 0x86, 0x09, 0x00, 0x00, // Offset 2438 (0x986) + 0xa7, 0x09, 0x00, 0x00, // Offset 2471 (0x9a7) + 0xb9, 0x09, 0x00, 0x00, // Offset 2489 (0x9b9) + 0xce, 0x09, 0x00, 0x00, // Offset 2510 (0x9ce) + 0xe0, 0x09, 0x00, 0x00, // Offset 2528 (0x9e0) + 0xf5, 0x09, 0x00, 0x00, // Offset 2549 (0x9f5) + 0x0a, 0x0a, 0x00, 0x00, // Offset 2570 (0xa0a) + 0x29, 0x0a, 0x00, 0x00, // Offset 2601 (0xa29) + 0x3b, 0x0a, 0x00, 0x00, // Offset 2619 (0xa3b) + 0x52, 0x0a, 0x00, 0x00, // Offset 2642 (0xa52) + 0x6f, 0x0a, 0x00, 0x00, // Offset 2671 (0xa6f) + 0x88, 0x0a, 0x00, 0x00, // Offset 2696 (0xa88) + 0xa0, 0x0a, 0x00, 0x00, // Offset 2720 (0xaa0) + 0xb6, 0x0a, 0x00, 0x00, // Offset 2742 (0xab6) + 0xcd, 0x0a, 0x00, 0x00, // Offset 2765 (0xacd) + 0xe2, 0x0a, 0x00, 0x00, // Offset 2786 (0xae2) + 0xfa, 0x0a, 0x00, 0x00, // Offset 2810 (0xafa) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x0e, 0x0b, 0x00, 0x00, // Offset 2830 (0xb0e) + 0x17, 0x0b, 0x00, 0x00, // Offset 2839 (0xb17) + 0x21, 0x0b, 0x00, 0x00, // Offset 2849 (0xb21) + 0x2c, 0x0b, 0x00, 0x00, // Offset 2860 (0xb2c) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x3a, 0x0b, 0x00, 0x00, // Offset 2874 (0xb3a) + 0x47, 0x0b, 0x00, 0x00, // Offset 2887 (0xb47) + 0x5a, 0x0b, 0x00, 0x00, // Offset 2906 (0xb5a) + 0x69, 0x0b, 0x00, 0x00, // Offset 2921 (0xb69) + 0x7b, 0x0b, 0x00, 0x00, // Offset 2939 (0xb7b) + 0x89, 0x0b, 0x00, 0x00, // Offset 2953 (0xb89) + 0x99, 0x0b, 0x00, 0x00, // Offset 2969 (0xb99) + 0xa5, 0x0b, 0x00, 0x00, // Offset 2981 (0xba5) + 0xb4, 0x0b, 0x00, 0x00, // Offset 2996 (0xbb4) + 0xc5, 0x0b, 0x00, 0x00, // Offset 3013 (0xbc5) + 0xda, 0x0b, 0x00, 0x00, // Offset 3034 (0xbda) + 0xf2, 0x0b, 0x00, 0x00, // Offset 3058 (0xbf2) + 0x10, 0x0c, 0x00, 0x00, // Offset 3088 (0xc10) + 0x25, 0x0c, 0x00, 0x00, // Offset 3109 (0xc25) + 0x3f, 0x0c, 0x00, 0x00, // Offset 3135 (0xc3f) + 0x54, 0x0c, 0x00, 0x00, // Offset 3156 (0xc54) + 0x6e, 0x0c, 0x00, 0x00, // Offset 3182 (0xc6e) + 0x83, 0x0c, 0x00, 0x00, // Offset 3203 (0xc83) + 0x9e, 0x0c, 0x00, 0x00, // Offset 3230 (0xc9e) + 0xac, 0x0c, 0x00, 0x00, // Offset 3244 (0xcac) + 0xbf, 0x0c, 0x00, 0x00, // Offset 3263 (0xcbf) + 0xd8, 0x0c, 0x00, 0x00, // Offset 3288 (0xcd8) + 0xf6, 0x0c, 0x00, 0x00, // Offset 3318 (0xcf6) + 0x08, 0x0d, 0x00, 0x00, // Offset 3336 (0xd08) + 0x1f, 0x0d, 0x00, 0x00, // Offset 3359 (0xd1f) + 0x31, 0x0d, 0x00, 0x00, // Offset 3377 (0xd31) + 0x4a, 0x0d, 0x00, 0x00, // Offset 3402 (0xd4a) + 0x5e, 0x0d, 0x00, 0x00, // Offset 3422 (0xd5e) + 0x79, 0x0d, 0x00, 0x00, // Offset 3449 (0xd79) + 0x8d, 0x0d, 0x00, 0x00, // Offset 3469 (0xd8d) + 0xa4, 0x0d, 0x00, 0x00, // Offset 3492 (0xda4) + 0xb9, 0x0d, 0x00, 0x00, // Offset 3513 (0xdb9) + 0xd5, 0x0d, 0x00, 0x00, // Offset 3541 (0xdd5) + 0xe6, 0x0d, 0x00, 0x00, // Offset 3558 (0xde6) + 0xfc, 0x0d, 0x00, 0x00, // Offset 3580 (0xdfc) + 0x0d, 0x0e, 0x00, 0x00, // Offset 3597 (0xe0d) + 0x24, 0x0e, 0x00, 0x00, // Offset 3620 (0xe24) + 0x3f, 0x0e, 0x00, 0x00, // Offset 3647 (0xe3f) + 0x4f, 0x0e, 0x00, 0x00, // Offset 3663 (0xe4f) + 0x63, 0x0e, 0x00, 0x00, // Offset 3683 (0xe63) + 0x74, 0x0e, 0x00, 0x00, // Offset 3700 (0xe74) + 0x8a, 0x0e, 0x00, 0x00, // Offset 3722 (0xe8a) + 0x9b, 0x0e, 0x00, 0x00, // Offset 3739 (0xe9b) + 0xa5, 0x0e, 0x00, 0x00, // Offset 3749 (0xea5) + 0xbb, 0x0e, 0x00, 0x00, // Offset 3771 (0xebb) + 0xd1, 0x0e, 0x00, 0x00, // Offset 3793 (0xed1) + 0xe2, 0x0e, 0x00, 0x00, // Offset 3810 (0xee2) + 0xf7, 0x0e, 0x00, 0x00, // Offset 3831 (0xef7) + 0x13, 0x0f, 0x00, 0x00, // Offset 3859 (0xf13) + 0x2e, 0x0f, 0x00, 0x00, // Offset 3886 (0xf2e) + 0x3e, 0x0f, 0x00, 0x00, // Offset 3902 (0xf3e) + 0x51, 0x0f, 0x00, 0x00, // Offset 3921 (0xf51) + 0x65, 0x0f, 0x00, 0x00, // Offset 3941 (0xf65) + 0x75, 0x0f, 0x00, 0x00, // Offset 3957 (0xf75) + 0x89, 0x0f, 0x00, 0x00, // Offset 3977 (0xf89) + 0x9c, 0x0f, 0x00, 0x00, // Offset 3996 (0xf9c) + 0xae, 0x0f, 0x00, 0x00, // Offset 4014 (0xfae) + 0xc6, 0x0f, 0x00, 0x00, // Offset 4038 (0xfc6) + 0xde, 0x0f, 0x00, 0x00, // Offset 4062 (0xfde) + 0xf9, 0x0f, 0x00, 0x00, // Offset 4089 (0xff9) + 0x1a, 0x10, 0x00, 0x00, // Offset 4122 (0x101a) + 0x3a, 0x10, 0x00, 0x00, // Offset 4154 (0x103a) + 0x4a, 0x10, 0x00, 0x00, // Offset 4170 (0x104a) + 0x5a, 0x10, 0x00, 0x00, // Offset 4186 (0x105a) + 0x70, 0x10, 0x00, 0x00, // Offset 4208 (0x1070) + 0x85, 0x10, 0x00, 0x00, // Offset 4229 (0x1085) + 0x95, 0x10, 0x00, 0x00, // Offset 4245 (0x1095) + 0xa6, 0x10, 0x00, 0x00, // Offset 4262 (0x10a6) + 0xbb, 0x10, 0x00, 0x00, // Offset 4283 (0x10bb) + 0xc7, 0x10, 0x00, 0x00, // Offset 4295 (0x10c7) + 0xd5, 0x10, 0x00, 0x00, // Offset 4309 (0x10d5) + 0xe0, 0x10, 0x00, 0x00, // Offset 4320 (0x10e0) + 0xee, 0x10, 0x00, 0x00, // Offset 4334 (0x10ee) + 0xfe, 0x10, 0x00, 0x00, // Offset 4350 (0x10fe) + 0x0e, 0x11, 0x00, 0x00, // Offset 4366 (0x110e) + 0x2d, 0x11, 0x00, 0x00, // Offset 4397 (0x112d) + 0x40, 0x11, 0x00, 0x00, // Offset 4416 (0x1140) + 0x4e, 0x11, 0x00, 0x00, // Offset 4430 (0x114e) + 0x5a, 0x11, 0x00, 0x00, // Offset 4442 (0x115a) + 0x6a, 0x11, 0x00, 0x00, // Offset 4458 (0x116a) + 0x7e, 0x11, 0x00, 0x00, // Offset 4478 (0x117e) + 0x90, 0x11, 0x00, 0x00, // Offset 4496 (0x1190) + 0xa0, 0x11, 0x00, 0x00, // Offset 4512 (0x11a0) + 0xb1, 0x11, 0x00, 0x00, // Offset 4529 (0x11b1) + 0xca, 0x11, 0x00, 0x00, // Offset 4554 (0x11ca) + 0xdd, 0x11, 0x00, 0x00, // Offset 4573 (0x11dd) + 0xed, 0x11, 0x00, 0x00, // Offset 4589 (0x11ed) + 0x03, 0x12, 0x00, 0x00, // Offset 4611 (0x1203) + 0x19, 0x12, 0x00, 0x00, // Offset 4633 (0x1219) + 0x2c, 0x12, 0x00, 0x00, // Offset 4652 (0x122c) + 0x3f, 0x12, 0x00, 0x00, // Offset 4671 (0x123f) + 0x47, 0x12, 0x00, 0x00, // Offset 4679 (0x1247) + 0x50, 0x12, 0x00, 0x00, // Offset 4688 (0x1250) + 0x5c, 0x12, 0x00, 0x00, // Offset 4700 (0x125c) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3041 - 0x30ff + // + 23, 10, 0, 6, 81, 118, 97, 149, 65, 33, 33, 34, + 33, 50, 17, 17, 66, 33, 65, 35, 49, 114, 48, 28, + 11, 225, 161, 34, 69, 129, 161, 17, 134, 66, 17, 49, + 34, 33, 66, 17, 17, 82, 34, 82, 33, 81, 34, 17, + 49, 130, 224, 16, 9, 0, 8, 1, 129, 81, 17, 97, + 17, 114, 113, 17, 17, 113, 240, 21, 11, 240, 240, 65, + 161, 161, 97, 33, 129, 17, 129, 17, 146, 146, 145, 17, + 33, 130, 240, 224, 15, 6, 240, 240, 33, 98, 132, 17, + 65, 81, 81, 65, 81, 50, 32, 16, 9, 194, 146, 228, + 35, 65, 145, 129, 129, 113, 129, 113, 98, 82, 224, 15, + 9, 0, 5, 114, 145, 230, 113, 113, 113, 115, 81, 33, + 65, 68, 18, 11, 226, 178, 240, 200, 129, 145, 145, 145, + 147, 113, 49, 81, 65, 81, 85, 176, 20, 9, 0, 5, + 113, 129, 65, 21, 49, 33, 133, 50, 65, 17, 17, 65, + 18, 65, 98, 192, 28, 12, 240, 193, 177, 66, 84, 49, + 20, 113, 49, 182, 82, 81, 49, 17, 97, 17, 33, 97, + 17, 33, 97, 34, 82, 130, 240, 16, 31, 12, 240, 193, + 177, 65, 97, 81, 39, 49, 65, 49, 33, 65, 49, 49, + 33, 65, 49, 33, 65, 81, 81, 81, 65, 81, 33, 33, + 146, 240, 48, 35, 13, 240, 225, 97, 17, 49, 65, 17, + 17, 49, 81, 55, 49, 81, 49, 33, 81, 49, 49, 49, + 65, 49, 49, 65, 97, 81, 97, 65, 97, 33, 33, 162, + 240, 80, 19, 9, 209, 129, 129, 18, 37, 129, 137, 17, + 145, 53, 17, 17, 82, 17, 146, 147, 176, 25, 11, 241, + 161, 49, 17, 65, 19, 17, 21, 33, 17, 81, 164, 37, + 17, 177, 85, 17, 49, 82, 49, 178, 179, 240, 16, 6, + 177, 81, 65, 65, 65, 65, 65, 97, 97, 97, 97, 97, + 81, 96, 22, 9, 225, 129, 113, 17, 17, 49, 33, 17, + 33, 49, 17, 17, 113, 145, 145, 145, 145, 145, 129, 192, + 28, 12, 240, 81, 65, 97, 65, 97, 65, 101, 53, 49, + 113, 49, 113, 49, 113, 49, 113, 49, 17, 81, 65, 97, + 161, 146, 240, 32, 33, 12, 240, 65, 17, 17, 17, 81, + 17, 17, 17, 81, 81, 99, 17, 53, 49, 113, 49, 113, + 49, 113, 49, 113, 49, 17, 81, 65, 97, 161, 146, 240, + 32, 13, 9, 240, 211, 148, 0, 5, 97, 129, 113, 23, + 240, 64, 18, 11, 240, 241, 17, 19, 65, 17, 69, 17, + 0, 6, 113, 161, 113, 55, 240, 160, 18, 9, 193, 129, + 145, 25, 129, 129, 145, 68, 17, 33, 66, 17, 129, 146, + 148, 176, 23, 11, 225, 161, 65, 17, 65, 19, 23, 33, + 17, 81, 161, 177, 100, 17, 65, 66, 49, 161, 178, 180, + 240, 18, 8, 240, 17, 113, 113, 113, 113, 113, 113, 113, + 98, 98, 81, 33, 49, 67, 176, 21, 8, 240, 17, 65, + 18, 65, 18, 65, 18, 113, 113, 113, 113, 113, 98, 81, + 33, 49, 67, 176, 21, 11, 240, 33, 161, 172, 161, 114, + 17, 97, 34, 97, 49, 97, 49, 116, 161, 161, 145, 130, + 96, 25, 12, 240, 49, 33, 17, 97, 33, 17, 109, 177, + 130, 17, 113, 34, 113, 49, 113, 49, 132, 177, 177, 161, + 146, 112, 24, 12, 240, 240, 33, 97, 65, 97, 68, 49, + 20, 53, 49, 97, 65, 97, 65, 97, 49, 113, 193, 197, + 240, 176, 29, 13, 240, 129, 17, 129, 17, 17, 49, 65, + 17, 17, 49, 68, 65, 20, 69, 49, 113, 65, 113, 65, + 113, 49, 129, 209, 213, 240, 224, 16, 10, 240, 118, 129, + 129, 129, 129, 43, 129, 129, 129, 145, 161, 163, 192, 24, + 12, 240, 97, 17, 38, 17, 17, 97, 33, 17, 81, 161, + 161, 36, 39, 161, 161, 161, 177, 193, 195, 240, 16, 21, + 11, 240, 161, 161, 119, 113, 145, 98, 33, 51, 65, 145, + 161, 161, 49, 81, 65, 81, 85, 176, 26, 12, 240, 193, + 81, 17, 49, 81, 24, 33, 17, 49, 161, 98, 49, 51, + 81, 161, 177, 177, 49, 97, 65, 97, 85, 208, 21, 10, + 209, 145, 145, 104, 81, 129, 145, 35, 65, 17, 49, 35, + 81, 17, 113, 145, 114, 68, 208, 27, 12, 241, 177, 81, + 17, 49, 81, 25, 17, 17, 49, 161, 177, 35, 97, 17, + 49, 67, 81, 49, 113, 177, 146, 100, 240, 32, 13, 10, + 0, 9, 36, 36, 65, 161, 145, 129, 114, 83, 224, 17, + 12, 0, 6, 85, 82, 81, 19, 129, 177, 177, 161, 146, + 115, 240, 240, 160, 22, 13, 240, 240, 97, 17, 161, 17, + 86, 17, 50, 81, 35, 129, 193, 193, 177, 162, 131, 240, + 240, 224, 18, 12, 240, 240, 51, 70, 36, 49, 161, 177, + 161, 177, 177, 177, 177, 193, 195, 224, 25, 13, 240, 240, + 83, 85, 68, 49, 33, 17, 97, 49, 17, 97, 49, 17, + 81, 193, 193, 193, 193, 209, 211, 240, 16, 17, 9, 240, + 81, 129, 129, 145, 129, 35, 51, 82, 97, 113, 129, 145, + 151, 144, 23, 11, 240, 145, 161, 81, 17, 33, 81, 17, + 49, 65, 17, 49, 35, 83, 114, 129, 145, 161, 177, 183, + 208, 25, 11, 225, 161, 119, 113, 66, 49, 113, 33, 65, + 65, 81, 65, 81, 49, 97, 116, 97, 50, 81, 49, 17, + 83, 240, 23, 11, 240, 129, 161, 161, 83, 33, 35, 65, + 161, 161, 161, 161, 49, 97, 65, 81, 17, 53, 17, 240, + 80, 36, 12, 240, 240, 17, 97, 65, 97, 65, 97, 22, + 66, 33, 49, 34, 49, 65, 18, 33, 81, 17, 17, 17, + 82, 34, 98, 34, 50, 17, 18, 17, 33, 33, 146, 17, + 192, 29, 12, 241, 177, 177, 177, 133, 35, 81, 18, 49, + 66, 81, 65, 97, 50, 97, 50, 97, 33, 17, 52, 17, + 33, 33, 50, 49, 51, 224, 27, 11, 240, 240, 116, 82, + 17, 33, 49, 49, 49, 33, 49, 66, 49, 82, 49, 82, + 33, 98, 33, 81, 34, 97, 130, 114, 240, 34, 12, 240, + 81, 65, 97, 65, 97, 65, 99, 33, 37, 49, 113, 49, + 113, 49, 113, 49, 113, 49, 68, 49, 49, 51, 17, 17, + 17, 49, 33, 17, 51, 240, 16, 39, 13, 240, 97, 17, + 17, 17, 97, 17, 17, 17, 97, 49, 17, 99, 49, 37, + 65, 113, 65, 113, 65, 113, 65, 113, 65, 68, 65, 49, + 51, 33, 17, 17, 49, 33, 33, 51, 240, 48, 37, 13, + 240, 97, 18, 33, 98, 33, 17, 98, 33, 17, 100, 33, + 37, 65, 113, 65, 113, 65, 113, 65, 113, 65, 68, 65, + 49, 51, 33, 17, 17, 49, 33, 33, 51, 240, 48, 25, + 11, 240, 193, 130, 100, 145, 81, 49, 97, 49, 98, 17, + 113, 18, 113, 33, 97, 49, 97, 65, 65, 100, 240, 16, + 31, 12, 240, 225, 49, 17, 50, 65, 21, 81, 17, 33, + 81, 65, 97, 65, 98, 33, 113, 17, 17, 113, 49, 97, + 65, 97, 81, 65, 116, 240, 48, 31, 12, 240, 98, 97, + 33, 33, 50, 49, 37, 82, 49, 81, 65, 97, 65, 98, + 33, 113, 17, 17, 113, 49, 97, 65, 97, 81, 65, 116, + 240, 48, 25, 13, 240, 241, 211, 193, 177, 177, 209, 129, + 65, 33, 65, 81, 33, 33, 97, 50, 113, 49, 49, 49, + 147, 240, 64, 31, 13, 240, 241, 65, 17, 99, 17, 17, + 129, 17, 17, 113, 177, 209, 129, 65, 33, 65, 81, 33, + 33, 97, 50, 113, 49, 49, 49, 147, 240, 64, 29, 13, + 240, 241, 66, 116, 33, 130, 33, 113, 34, 113, 209, 129, + 65, 33, 65, 81, 33, 33, 97, 50, 113, 49, 49, 49, + 147, 240, 64, 17, 13, 0, 8, 82, 161, 33, 129, 65, + 97, 97, 65, 130, 210, 0, 6, 64, 23, 13, 0, 6, + 1, 17, 161, 17, 82, 49, 17, 65, 33, 129, 65, 97, + 97, 65, 130, 210, 0, 6, 64, 23, 13, 240, 240, 82, + 161, 33, 145, 33, 82, 50, 81, 33, 129, 65, 97, 97, + 65, 130, 210, 0, 6, 64, 33, 12, 240, 161, 39, 33, + 97, 65, 97, 65, 99, 17, 53, 49, 113, 49, 113, 49, + 113, 49, 68, 49, 49, 51, 17, 17, 17, 49, 33, 17, + 51, 240, 16, 38, 13, 240, 129, 17, 17, 39, 17, 17, + 97, 17, 17, 17, 97, 81, 100, 17, 53, 65, 113, 65, + 113, 65, 113, 65, 68, 65, 49, 51, 33, 17, 17, 49, + 33, 33, 51, 240, 48, 37, 13, 240, 130, 33, 38, 33, + 17, 98, 33, 17, 97, 18, 33, 99, 33, 53, 65, 113, + 65, 113, 65, 113, 65, 68, 65, 49, 51, 33, 17, 17, + 49, 33, 33, 51, 240, 48, 19, 9, 225, 129, 57, 81, + 129, 131, 22, 129, 129, 69, 49, 67, 17, 65, 33, 20, + 208, 26, 13, 240, 240, 181, 193, 193, 177, 65, 113, 65, + 88, 50, 17, 82, 17, 49, 65, 34, 33, 81, 66, 81, + 177, 240, 48, 25, 12, 241, 177, 134, 145, 66, 81, 97, + 35, 114, 33, 129, 33, 129, 18, 65, 66, 97, 65, 97, + 65, 97, 86, 240, 35, 12, 240, 240, 17, 97, 65, 97, + 65, 97, 36, 83, 33, 17, 65, 49, 49, 33, 17, 33, + 65, 17, 17, 17, 82, 50, 82, 49, 98, 33, 17, 65, + 34, 82, 224, 21, 11, 241, 161, 161, 118, 129, 161, 33, + 55, 113, 161, 97, 49, 97, 49, 81, 81, 49, 115, 224, + 19, 10, 0, 6, 113, 97, 49, 81, 36, 51, 69, 81, + 49, 50, 81, 145, 161, 145, 64, 24, 12, 240, 49, 193, + 193, 81, 177, 68, 65, 18, 65, 35, 99, 33, 97, 81, + 35, 97, 193, 177, 193, 177, 64, 23, 10, 0, 6, 113, + 145, 65, 68, 17, 35, 50, 17, 33, 51, 49, 50, 50, + 33, 17, 67, 113, 129, 80, 33, 11, 240, 193, 81, 81, + 65, 68, 33, 49, 17, 33, 17, 33, 33, 50, 17, 49, + 51, 65, 51, 17, 33, 50, 49, 17, 33, 17, 68, 129, + 145, 145, 96, 18, 8, 240, 240, 97, 113, 116, 65, 113, + 113, 68, 49, 51, 17, 49, 33, 19, 192, 21, 10, 241, + 145, 145, 145, 34, 83, 113, 145, 145, 145, 86, 49, 65, + 18, 17, 65, 49, 20, 240, 18, 9, 193, 145, 146, 177, + 129, 129, 52, 17, 18, 67, 98, 113, 113, 98, 82, 208, + 21, 7, 193, 33, 65, 17, 65, 17, 66, 82, 82, 82, + 17, 49, 17, 65, 81, 97, 81, 66, 160, 21, 10, 240, + 133, 129, 129, 129, 133, 66, 65, 33, 114, 129, 67, 33, + 49, 50, 65, 49, 99, 208, 31, 13, 240, 225, 193, 193, + 35, 113, 17, 49, 53, 65, 98, 65, 97, 81, 82, 81, + 82, 81, 65, 17, 81, 49, 33, 81, 33, 49, 98, 65, + 144, 18, 10, 240, 117, 145, 129, 129, 133, 65, 81, 33, + 114, 129, 145, 129, 114, 83, 224, 23, 9, 240, 240, 129, + 129, 129, 100, 19, 49, 17, 49, 34, 65, 18, 81, 18, + 82, 17, 65, 49, 49, 176, 29, 12, 241, 177, 177, 163, + 35, 34, 20, 49, 66, 97, 49, 113, 34, 113, 34, 113, + 17, 17, 97, 17, 33, 81, 81, 50, 97, 240, 80, 25, + 11, 240, 149, 161, 145, 161, 149, 67, 65, 33, 33, 82, + 33, 98, 33, 98, 17, 50, 33, 18, 33, 34, 115, 208, + 24, 12, 240, 197, 161, 149, 97, 81, 65, 97, 98, 49, + 81, 35, 115, 129, 163, 35, 49, 50, 49, 17, 131, 192, + 22, 11, 241, 161, 164, 67, 161, 82, 36, 33, 50, 50, + 49, 66, 129, 17, 113, 33, 97, 161, 182, 208, 23, 11, + 240, 17, 161, 161, 145, 161, 145, 161, 148, 113, 49, 81, + 65, 81, 65, 50, 81, 33, 17, 98, 208, 21, 11, 240, + 145, 165, 33, 113, 17, 17, 130, 38, 66, 81, 161, 161, + 161, 145, 146, 99, 145, 112, 24, 9, 0, 7, 17, 129, + 33, 37, 33, 49, 33, 18, 33, 33, 33, 17, 49, 33, + 17, 17, 17, 49, 34, 208, 20, 9, 240, 240, 241, 81, + 33, 81, 33, 39, 81, 33, 81, 33, 81, 35, 49, 113, + 113, 208, 9, 4, 97, 17, 33, 17, 0, 5, 96, 10, + 4, 82, 17, 34, 33, 18, 240, 240, 176, 11, 6, 240, + 242, 98, 97, 82, 49, 240, 240, 32, 14, 8, 240, 241, + 81, 35, 49, 66, 129, 114, 81, 240, 240, 224, 13, 8, + 0, 7, 8, 113, 49, 33, 67, 81, 97, 97, 224, 19, + 11, 240, 240, 59, 161, 81, 49, 97, 33, 115, 129, 161, + 145, 161, 145, 130, 240, 64, 15, 8, 0, 5, 113, 97, + 97, 82, 51, 17, 113, 113, 113, 113, 176, 18, 9, 240, + 177, 129, 113, 113, 98, 82, 17, 50, 49, 129, 129, 129, + 129, 129, 192, 14, 8, 240, 240, 225, 113, 57, 98, 98, + 97, 97, 97, 82, 176, 16, 10, 240, 161, 145, 145, 75, + 130, 130, 129, 129, 145, 129, 114, 98, 240, 12, 9, 0, + 8, 7, 81, 129, 129, 129, 129, 73, 144, 15, 11, 240, + 240, 249, 97, 161, 161, 161, 161, 161, 91, 240, 240, 48, + 17, 8, 240, 240, 241, 113, 40, 81, 98, 81, 17, 65, + 33, 34, 49, 113, 160, 21, 11, 240, 225, 161, 161, 59, + 98, 146, 129, 17, 113, 33, 97, 49, 81, 65, 50, 81, + 146, 224, 24, 10, 240, 145, 145, 145, 90, 65, 65, 65, + 65, 65, 65, 49, 81, 49, 81, 33, 97, 17, 97, 17, + 82, 192, 30, 12, 240, 209, 65, 17, 65, 65, 17, 65, + 65, 27, 97, 65, 97, 65, 97, 65, 81, 81, 81, 81, + 65, 97, 49, 97, 49, 82, 240, 16, 21, 11, 240, 177, + 161, 161, 35, 83, 83, 17, 161, 161, 20, 67, 68, 33, + 161, 177, 161, 161, 48, 26, 12, 240, 209, 65, 17, 65, + 65, 17, 65, 35, 17, 67, 99, 17, 177, 177, 20, 83, + 84, 33, 177, 193, 177, 177, 64, 21, 9, 240, 113, 129, + 133, 49, 65, 33, 81, 17, 81, 17, 97, 113, 113, 113, + 98, 82, 240, 16, 26, 12, 240, 209, 65, 17, 65, 65, + 17, 70, 17, 49, 65, 81, 81, 65, 81, 65, 97, 161, + 161, 161, 146, 130, 240, 112, 21, 11, 240, 145, 161, 161, + 169, 33, 65, 81, 65, 65, 81, 49, 97, 145, 145, 145, + 130, 240, 48, 27, 12, 240, 97, 17, 33, 97, 17, 33, + 97, 17, 33, 185, 49, 65, 97, 65, 81, 81, 65, 97, + 161, 161, 161, 146, 240, 80, 14, 10, 240, 240, 170, 145, + 145, 145, 145, 145, 155, 145, 240, 80, 19, 13, 240, 129, + 17, 161, 17, 161, 27, 193, 193, 193, 193, 193, 193, 58, + 193, 240, 224, 25, 12, 240, 193, 65, 97, 65, 97, 65, + 97, 65, 60, 49, 65, 97, 65, 97, 65, 97, 65, 161, + 161, 146, 240, 48, 30, 13, 240, 240, 97, 17, 49, 65, + 17, 17, 49, 65, 17, 17, 49, 65, 76, 65, 65, 113, + 65, 113, 65, 113, 65, 177, 177, 162, 240, 80, 18, 10, + 240, 240, 18, 161, 243, 113, 33, 81, 145, 129, 129, 129, + 114, 83, 240, 32, 23, 11, 240, 241, 17, 18, 81, 17, + 49, 65, 17, 178, 113, 49, 97, 145, 145, 145, 145, 130, + 99, 240, 64, 18, 11, 240, 240, 248, 161, 161, 145, 161, + 146, 129, 33, 97, 65, 50, 99, 129, 176, 25, 13, 240, + 240, 97, 17, 161, 17, 24, 17, 17, 129, 193, 177, 193, + 178, 161, 33, 129, 65, 82, 97, 34, 129, 240, 20, 11, + 240, 161, 161, 161, 161, 52, 52, 53, 81, 65, 65, 81, + 49, 97, 161, 177, 181, 192, 27, 12, 240, 193, 81, 17, + 49, 81, 17, 49, 81, 17, 49, 52, 68, 49, 20, 81, + 81, 65, 97, 49, 113, 177, 193, 198, 208, 20, 9, 240, + 240, 82, 113, 17, 97, 33, 81, 33, 65, 129, 113, 113, + 113, 98, 82, 240, 16, 23, 11, 240, 241, 17, 129, 18, + 113, 17, 17, 81, 81, 65, 81, 65, 145, 161, 145, 145, + 130, 114, 240, 80, 21, 10, 240, 161, 145, 134, 49, 81, + 33, 99, 34, 33, 113, 17, 129, 129, 129, 114, 98, 240, + 32, 28, 12, 240, 97, 17, 81, 49, 17, 81, 49, 17, + 70, 81, 81, 65, 97, 34, 34, 33, 145, 17, 161, 161, + 161, 146, 130, 240, 96, 17, 11, 240, 241, 130, 85, 161, + 161, 75, 97, 161, 161, 145, 145, 130, 240, 48, 22, 13, + 240, 129, 17, 131, 17, 98, 33, 17, 37, 193, 193, 107, + 129, 193, 193, 177, 177, 162, 240, 112, 17, 8, 0, 7, + 33, 66, 33, 49, 17, 17, 49, 17, 65, 113, 97, 82, + 176, 23, 10, 240, 240, 49, 82, 33, 82, 49, 65, 17, + 33, 65, 17, 97, 145, 129, 145, 129, 114, 98, 240, 16, + 27, 13, 240, 240, 97, 17, 49, 97, 18, 33, 97, 18, + 49, 65, 65, 33, 65, 65, 97, 193, 177, 193, 177, 162, + 146, 240, 112, 16, 11, 240, 240, 88, 240, 240, 75, 97, + 161, 161, 145, 145, 130, 240, 48, 20, 12, 240, 97, 17, + 145, 17, 40, 17, 240, 240, 107, 113, 177, 177, 161, 161, + 146, 240, 80, 17, 6, 193, 81, 81, 81, 81, 83, 49, + 34, 17, 66, 81, 81, 81, 81, 80, 22, 8, 240, 17, + 65, 18, 65, 18, 65, 18, 113, 115, 81, 34, 49, 65, + 33, 113, 113, 113, 113, 112, 17, 11, 240, 209, 161, 161, + 75, 97, 161, 161, 145, 161, 145, 145, 130, 240, 64, 10, + 12, 0, 6, 40, 0, 7, 108, 0, 6, 22, 11, 240, + 240, 88, 161, 161, 66, 49, 114, 17, 145, 145, 17, 113, + 49, 81, 81, 34, 114, 240, 80, 22, 11, 240, 177, 177, + 104, 161, 145, 145, 145, 146, 17, 82, 17, 34, 18, 49, + 65, 81, 161, 240, 16, 17, 9, 240, 177, 129, 129, 129, + 113, 129, 113, 129, 113, 113, 98, 82, 240, 16, 21, 12, + 0, 7, 113, 49, 113, 65, 97, 81, 81, 97, 49, 113, + 49, 129, 17, 146, 161, 177, 192, 28, 13, 240, 240, 97, + 17, 161, 17, 161, 17, 49, 49, 129, 65, 113, 81, 97, + 97, 65, 113, 65, 129, 33, 145, 17, 161, 193, 224, 27, + 13, 240, 130, 161, 33, 145, 33, 162, 65, 49, 129, 65, + 113, 81, 97, 97, 65, 113, 65, 129, 33, 145, 17, 161, + 193, 224, 16, 9, 240, 193, 129, 129, 129, 67, 21, 65, + 129, 129, 129, 152, 240, 48, 19, 10, 240, 241, 97, 18, + 97, 18, 97, 18, 52, 36, 97, 145, 145, 145, 168, 240, + 96, 20, 10, 240, 194, 17, 81, 34, 81, 34, 98, 17, + 52, 36, 97, 145, 145, 145, 168, 240, 96, 16, 10, 240, + 240, 170, 145, 145, 129, 145, 129, 129, 129, 114, 98, 240, + 32, 20, 13, 240, 240, 97, 17, 161, 28, 17, 145, 193, + 177, 193, 177, 177, 177, 162, 146, 240, 128, 19, 13, 240, + 240, 98, 161, 43, 33, 147, 161, 177, 193, 177, 177, 177, + 162, 146, 240, 128, 18, 13, 0, 8, 82, 161, 33, 129, + 65, 97, 97, 65, 129, 209, 210, 240, 240, 144, 24, 13, + 0, 6, 1, 17, 161, 17, 82, 49, 17, 65, 33, 129, + 65, 97, 97, 65, 129, 209, 210, 240, 240, 144, 24, 13, + 240, 240, 82, 161, 33, 145, 33, 82, 50, 81, 33, 129, + 65, 97, 97, 65, 129, 209, 210, 240, 240, 144, 27, 11, + 240, 193, 161, 161, 91, 81, 161, 113, 33, 33, 65, 33, + 49, 49, 33, 49, 33, 49, 65, 17, 49, 66, 65, 146, + 80, 33, 12, 240, 225, 49, 17, 81, 49, 17, 81, 49, + 28, 97, 177, 129, 33, 33, 81, 33, 49, 65, 33, 49, + 49, 49, 65, 33, 49, 65, 17, 65, 162, 96, 32, 12, + 240, 225, 50, 97, 33, 33, 81, 33, 44, 97, 177, 129, + 33, 33, 81, 33, 49, 65, 33, 49, 49, 49, 65, 33, + 49, 65, 17, 65, 162, 96, 16, 11, 240, 240, 235, 145, + 161, 145, 145, 82, 33, 130, 177, 177, 240, 160, 16, 8, + 240, 49, 130, 130, 129, 17, 130, 130, 129, 17, 130, 130, + 130, 129, 22, 11, 240, 193, 161, 161, 145, 161, 161, 49, + 81, 65, 81, 81, 49, 82, 49, 20, 37, 97, 161, 176, + 21, 10, 240, 209, 145, 145, 50, 65, 82, 17, 130, 129, + 17, 113, 33, 81, 129, 114, 98, 240, 48, 16, 11, 240, + 240, 72, 97, 161, 161, 107, 65, 161, 161, 161, 181, 240, + 128, 17, 9, 0, 7, 17, 129, 35, 51, 37, 49, 81, + 17, 97, 145, 129, 129, 48, 21, 11, 240, 161, 161, 177, + 36, 52, 52, 17, 65, 81, 49, 113, 17, 129, 161, 177, + 161, 161, 240, 12, 9, 0, 8, 6, 129, 129, 113, 129, + 57, 240, 48, 14, 12, 0, 7, 88, 177, 177, 161, 177, + 177, 76, 240, 240, 96, 11, 6, 240, 240, 102, 81, 87, + 81, 81, 87, 96, 14, 9, 240, 201, 129, 129, 129, 24, + 129, 129, 129, 138, 129, 144, 16, 10, 240, 240, 24, 240, + 106, 145, 145, 129, 129, 129, 114, 83, 240, 16, 16, 7, + 225, 82, 82, 82, 82, 82, 82, 81, 81, 97, 81, 81, + 66, 176, 31, 11, 240, 240, 145, 113, 33, 113, 33, 113, + 33, 113, 33, 49, 49, 33, 49, 49, 33, 33, 49, 49, + 33, 49, 49, 17, 49, 66, 49, 240, 96, 19, 8, 240, + 17, 113, 113, 113, 113, 113, 113, 98, 98, 81, 17, 65, + 33, 34, 51, 208, 14, 10, 240, 240, 171, 130, 130, 130, + 130, 130, 140, 129, 240, 80, 12, 8, 0, 7, 9, 98, + 98, 81, 113, 82, 66, 192, 16, 10, 240, 251, 130, 130, + 130, 129, 129, 145, 129, 129, 114, 98, 240, 16, 20, 11, + 240, 209, 161, 161, 89, 49, 49, 97, 49, 97, 49, 97, + 49, 75, 97, 161, 161, 240, 18, 12, 0, 6, 25, 113, + 49, 113, 33, 129, 17, 145, 177, 177, 108, 240, 240, 96, + 16, 9, 240, 201, 129, 129, 129, 23, 129, 113, 113, 113, + 98, 82, 240, 16, 17, 10, 240, 240, 162, 162, 81, 145, + 129, 145, 129, 129, 129, 114, 83, 240, 32, 25, 12, 240, + 225, 49, 17, 81, 49, 17, 81, 49, 27, 33, 129, 33, + 129, 33, 129, 161, 177, 161, 146, 130, 240, 64, 19, 8, + 240, 240, 209, 113, 72, 49, 49, 49, 49, 33, 65, 33, + 65, 17, 82, 66, 144, 16, 9, 0, 7, 1, 129, 135, + 33, 49, 49, 65, 33, 81, 113, 98, 208, 22, 12, 240, + 240, 81, 156, 17, 17, 113, 49, 113, 49, 98, 49, 97, + 162, 161, 146, 116, 240, 240, 16, 22, 12, 240, 241, 50, + 97, 33, 17, 97, 105, 81, 33, 129, 33, 129, 33, 92, + 97, 177, 177, 240, 224, 19, 13, 240, 130, 161, 18, 161, + 73, 177, 145, 18, 147, 161, 193, 193, 108, 240, 240, 160, + 19, 13, 240, 240, 98, 161, 27, 17, 161, 178, 73, 177, + 178, 177, 162, 147, 161, 240, 128, 8, 3, 240, 113, 19, + 17, 240, 16, 9, 11, 0, 9, 81, 186, 0, 8, 32, + 12, 7, 240, 240, 82, 114, 113, 113, 113, 240, 240, 80, + 14, 8, 240, 241, 81, 35, 49, 66, 129, 129, 129, 240, + 240, 176, + 0, 0, // Padding + +}; + +tFont *g_psFontWSazanamigothic7x13 = (tFont *)g_pui8Sazanamigothic7x13; diff --git a/third_party/fonts/other/fonts/fontsazanamigothic8x15.c b/third_party/fonts/other/fonts/fontsazanamigothic8x15.c new file mode 100644 index 0000000..89facfa --- /dev/null +++ b/third_party/fonts/other/fonts/fontsazanamigothic8x15.c @@ -0,0 +1,905 @@ +//***************************************************************************** +// +// fontsazanamigothic8x15.c - Font definition for the 8x15 Sazanamigothic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from Sazanami +// +// Copyright (c) 1990-2003 +// Wada Laboratory, the University of Tokyo. All rights reserved. +// Copyright (c) 2003-2004 +// Electronic Font Open Laboratory (/efont/). All rights reserved +// +// For license, please see README. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 286 in 2 blocks +// Style: sazanamigothic +// Size: 8x15 +// Bold: no +// Italic: no +// Memory usage: 7356 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Sazanamigothic8x15[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 14, + + // + // The height of the font. + // + 16, + + // + // The baseline of the font. + // + 14, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3041 - 0x30ff + // + 0x41, 0x30, 0x00, 0x00, + 0xbf, 0x00, 0x00, 0x00, + 0x58, 0x08, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8b, 0x01, 0x00, 0x00, // Offset 395 (0x18b) + 0x97, 0x01, 0x00, 0x00, // Offset 407 (0x197) + 0xb4, 0x01, 0x00, 0x00, // Offset 436 (0x1b4) + 0xd3, 0x01, 0x00, 0x00, // Offset 467 (0x1d3) + 0xf8, 0x01, 0x00, 0x00, // Offset 504 (0x1f8) + 0x16, 0x02, 0x00, 0x00, // Offset 534 (0x216) + 0x1d, 0x02, 0x00, 0x00, // Offset 541 (0x21d) + 0x2e, 0x02, 0x00, 0x00, // Offset 558 (0x22e) + 0x40, 0x02, 0x00, 0x00, // Offset 576 (0x240) + 0x56, 0x02, 0x00, 0x00, // Offset 598 (0x256) + 0x65, 0x02, 0x00, 0x00, // Offset 613 (0x265) + 0x6b, 0x02, 0x00, 0x00, // Offset 619 (0x26b) + 0x72, 0x02, 0x00, 0x00, // Offset 626 (0x272) + 0x77, 0x02, 0x00, 0x00, // Offset 631 (0x277) + 0x88, 0x02, 0x00, 0x00, // Offset 648 (0x288) + 0x9d, 0x02, 0x00, 0x00, // Offset 669 (0x29d) + 0xad, 0x02, 0x00, 0x00, // Offset 685 (0x2ad) + 0xbf, 0x02, 0x00, 0x00, // Offset 703 (0x2bf) + 0xd3, 0x02, 0x00, 0x00, // Offset 723 (0x2d3) + 0xe9, 0x02, 0x00, 0x00, // Offset 745 (0x2e9) + 0xfe, 0x02, 0x00, 0x00, // Offset 766 (0x2fe) + 0x14, 0x03, 0x00, 0x00, // Offset 788 (0x314) + 0x25, 0x03, 0x00, 0x00, // Offset 805 (0x325) + 0x3c, 0x03, 0x00, 0x00, // Offset 828 (0x33c) + 0x52, 0x03, 0x00, 0x00, // Offset 850 (0x352) + 0x57, 0x03, 0x00, 0x00, // Offset 855 (0x357) + 0x5e, 0x03, 0x00, 0x00, // Offset 862 (0x35e) + 0x6c, 0x03, 0x00, 0x00, // Offset 876 (0x36c) + 0x76, 0x03, 0x00, 0x00, // Offset 886 (0x376) + 0x84, 0x03, 0x00, 0x00, // Offset 900 (0x384) + 0x96, 0x03, 0x00, 0x00, // Offset 918 (0x396) + 0xb6, 0x03, 0x00, 0x00, // Offset 950 (0x3b6) + 0xcd, 0x03, 0x00, 0x00, // Offset 973 (0x3cd) + 0xe5, 0x03, 0x00, 0x00, // Offset 997 (0x3e5) + 0xf9, 0x03, 0x00, 0x00, // Offset 1017 (0x3f9) + 0x10, 0x04, 0x00, 0x00, // Offset 1040 (0x410) + 0x1f, 0x04, 0x00, 0x00, // Offset 1055 (0x41f) + 0x2f, 0x04, 0x00, 0x00, // Offset 1071 (0x42f) + 0x45, 0x04, 0x00, 0x00, // Offset 1093 (0x445) + 0x55, 0x04, 0x00, 0x00, // Offset 1109 (0x455) + 0x65, 0x04, 0x00, 0x00, // Offset 1125 (0x465) + 0x76, 0x04, 0x00, 0x00, // Offset 1142 (0x476) + 0x92, 0x04, 0x00, 0x00, // Offset 1170 (0x492) + 0xa2, 0x04, 0x00, 0x00, // Offset 1186 (0x4a2) + 0xbd, 0x04, 0x00, 0x00, // Offset 1213 (0x4bd) + 0xd5, 0x04, 0x00, 0x00, // Offset 1237 (0x4d5) + 0xeb, 0x04, 0x00, 0x00, // Offset 1259 (0x4eb) + 0xfe, 0x04, 0x00, 0x00, // Offset 1278 (0x4fe) + 0x15, 0x05, 0x00, 0x00, // Offset 1301 (0x515) + 0x2c, 0x05, 0x00, 0x00, // Offset 1324 (0x52c) + 0x3f, 0x05, 0x00, 0x00, // Offset 1343 (0x53f) + 0x50, 0x05, 0x00, 0x00, // Offset 1360 (0x550) + 0x63, 0x05, 0x00, 0x00, // Offset 1379 (0x563) + 0x7b, 0x05, 0x00, 0x00, // Offset 1403 (0x57b) + 0x9b, 0x05, 0x00, 0x00, // Offset 1435 (0x59b) + 0xb6, 0x05, 0x00, 0x00, // Offset 1462 (0x5b6) + 0xcd, 0x05, 0x00, 0x00, // Offset 1485 (0x5cd) + 0xdd, 0x05, 0x00, 0x00, // Offset 1501 (0x5dd) + 0xee, 0x05, 0x00, 0x00, // Offset 1518 (0x5ee) + 0xff, 0x05, 0x00, 0x00, // Offset 1535 (0x5ff) + 0x10, 0x06, 0x00, 0x00, // Offset 1552 (0x610) + 0x1c, 0x06, 0x00, 0x00, // Offset 1564 (0x61c) + 0x22, 0x06, 0x00, 0x00, // Offset 1570 (0x622) + 0x29, 0x06, 0x00, 0x00, // Offset 1577 (0x629) + 0x3a, 0x06, 0x00, 0x00, // Offset 1594 (0x63a) + 0x4f, 0x06, 0x00, 0x00, // Offset 1615 (0x64f) + 0x61, 0x06, 0x00, 0x00, // Offset 1633 (0x661) + 0x75, 0x06, 0x00, 0x00, // Offset 1653 (0x675) + 0x86, 0x06, 0x00, 0x00, // Offset 1670 (0x686) + 0x96, 0x06, 0x00, 0x00, // Offset 1686 (0x696) + 0xad, 0x06, 0x00, 0x00, // Offset 1709 (0x6ad) + 0xbf, 0x06, 0x00, 0x00, // Offset 1727 (0x6bf) + 0xcd, 0x06, 0x00, 0x00, // Offset 1741 (0x6cd) + 0xdd, 0x06, 0x00, 0x00, // Offset 1757 (0x6dd) + 0xf4, 0x06, 0x00, 0x00, // Offset 1780 (0x6f4) + 0x04, 0x07, 0x00, 0x00, // Offset 1796 (0x704) + 0x1c, 0x07, 0x00, 0x00, // Offset 1820 (0x71c) + 0x2b, 0x07, 0x00, 0x00, // Offset 1835 (0x72b) + 0x3d, 0x07, 0x00, 0x00, // Offset 1853 (0x73d) + 0x51, 0x07, 0x00, 0x00, // Offset 1873 (0x751) + 0x64, 0x07, 0x00, 0x00, // Offset 1892 (0x764) + 0x71, 0x07, 0x00, 0x00, // Offset 1905 (0x771) + 0x7f, 0x07, 0x00, 0x00, // Offset 1919 (0x77f) + 0x8e, 0x07, 0x00, 0x00, // Offset 1934 (0x78e) + 0x9d, 0x07, 0x00, 0x00, // Offset 1949 (0x79d) + 0xb1, 0x07, 0x00, 0x00, // Offset 1969 (0x7b1) + 0xcb, 0x07, 0x00, 0x00, // Offset 1995 (0x7cb) + 0xe1, 0x07, 0x00, 0x00, // Offset 2017 (0x7e1) + 0xf6, 0x07, 0x00, 0x00, // Offset 2038 (0x7f6) + 0x04, 0x08, 0x00, 0x00, // Offset 2052 (0x804) + 0x16, 0x08, 0x00, 0x00, // Offset 2070 (0x816) + 0x1a, 0x08, 0x00, 0x00, // Offset 2074 (0x81a) + 0x2d, 0x08, 0x00, 0x00, // Offset 2093 (0x82d) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 4, 9, 0, 18, 11, 2, 41, 17, 17, 17, 17, 17, + 81, 17, 48, 12, 5, 2, 18, 17, 33, 17, 34, 33, + 0, 7, 80, 29, 8, 177, 33, 65, 33, 65, 33, 39, + 33, 33, 65, 33, 65, 33, 65, 33, 65, 33, 39, 33, + 33, 65, 33, 65, 33, 65, 33, 176, 31, 7, 49, 83, + 49, 17, 17, 17, 33, 34, 33, 34, 33, 65, 17, 83, + 81, 17, 65, 34, 33, 34, 33, 33, 17, 17, 17, 51, + 81, 97, 48, 37, 8, 113, 18, 66, 33, 33, 17, 33, + 33, 17, 33, 17, 33, 33, 17, 50, 17, 113, 97, 113, + 18, 49, 17, 33, 33, 17, 33, 17, 33, 33, 17, 33, + 34, 66, 17, 112, 30, 8, 163, 65, 49, 49, 49, 49, + 49, 65, 17, 97, 98, 81, 33, 17, 17, 49, 17, 17, + 65, 33, 65, 49, 33, 17, 50, 49, 240, 16, 7, 2, + 2, 17, 18, 240, 160, 17, 4, 113, 33, 33, 49, 33, + 49, 49, 49, 49, 49, 49, 65, 49, 65, 65, 18, 4, + 65, 65, 65, 49, 65, 49, 49, 49, 49, 49, 49, 33, + 49, 33, 33, 48, 22, 7, 240, 240, 17, 49, 33, 33, + 17, 17, 17, 51, 49, 17, 17, 17, 33, 33, 49, 240, + 240, 128, 15, 7, 240, 145, 97, 97, 97, 55, 49, 97, + 97, 97, 240, 240, 16, 6, 2, 240, 146, 17, 18, 7, + 7, 0, 6, 23, 0, 7, 5, 2, 240, 148, 64, 17, + 7, 209, 97, 81, 97, 81, 97, 81, 97, 81, 97, 81, + 97, 81, 97, 208, 21, 6, 130, 49, 33, 33, 33, 17, + 66, 66, 66, 66, 66, 66, 65, 17, 33, 33, 33, 50, + 224, 16, 3, 81, 33, 19, 17, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 96, 18, 6, 130, 49, 33, 17, 66, + 65, 81, 65, 65, 65, 65, 81, 65, 81, 86, 192, 20, + 7, 147, 49, 49, 17, 82, 81, 97, 81, 51, 113, 114, + 82, 81, 17, 49, 51, 240, 16, 22, 7, 177, 82, 82, + 65, 17, 65, 17, 49, 33, 49, 33, 33, 49, 39, 65, + 97, 97, 97, 240, 16, 21, 7, 133, 33, 97, 97, 81, + 19, 34, 49, 17, 81, 97, 98, 82, 81, 17, 49, 51, + 240, 16, 22, 7, 147, 49, 49, 33, 81, 97, 97, 19, + 34, 49, 17, 82, 82, 82, 81, 17, 49, 51, 240, 16, + 17, 7, 119, 97, 81, 97, 81, 97, 97, 97, 81, 97, + 97, 97, 97, 97, 160, 23, 7, 147, 49, 49, 17, 82, + 82, 81, 17, 49, 51, 49, 49, 17, 82, 82, 81, 17, + 49, 51, 240, 16, 22, 7, 147, 49, 49, 17, 82, 82, + 82, 81, 17, 50, 35, 17, 97, 98, 81, 17, 49, 51, + 240, 16, 5, 2, 132, 164, 96, 7, 2, 132, 130, 17, + 18, 80, 14, 5, 240, 65, 49, 49, 49, 49, 65, 81, + 81, 81, 81, 240, 10, 7, 240, 240, 87, 240, 103, 240, + 240, 192, 14, 5, 241, 81, 81, 81, 81, 65, 49, 49, + 49, 49, 240, 64, 18, 7, 147, 49, 49, 17, 82, 82, + 81, 81, 81, 97, 81, 97, 240, 81, 97, 160, 32, 8, + 178, 81, 33, 49, 65, 33, 18, 17, 17, 18, 17, 18, + 17, 33, 18, 17, 33, 18, 17, 33, 18, 34, 17, 33, + 113, 129, 49, 67, 240, 48, 23, 7, 161, 97, 81, 17, + 65, 17, 65, 17, 49, 49, 33, 49, 33, 49, 37, 17, + 82, 82, 82, 81, 224, 24, 7, 116, 49, 49, 33, 65, + 17, 65, 17, 65, 17, 49, 37, 33, 65, 17, 82, 82, + 82, 65, 21, 240, 16, 20, 7, 147, 49, 49, 33, 66, + 97, 97, 97, 97, 97, 97, 113, 65, 17, 49, 51, 240, + 16, 23, 7, 116, 49, 49, 33, 65, 17, 65, 17, 82, + 82, 82, 82, 82, 65, 17, 65, 17, 49, 36, 240, 32, + 15, 7, 120, 97, 97, 97, 97, 102, 17, 97, 97, 97, + 97, 103, 224, 16, 7, 120, 97, 97, 97, 97, 102, 17, + 97, 97, 97, 97, 97, 240, 80, 22, 7, 162, 65, 33, + 33, 65, 17, 81, 97, 97, 52, 82, 82, 81, 17, 65, + 18, 34, 50, 17, 224, 16, 7, 113, 82, 82, 82, 82, + 82, 89, 82, 82, 82, 82, 82, 81, 224, 16, 3, 51, + 17, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 19, + 96, 17, 6, 177, 81, 81, 81, 81, 81, 81, 81, 81, + 82, 65, 17, 33, 50, 224, 28, 7, 113, 65, 17, 65, + 17, 49, 33, 49, 33, 33, 49, 18, 50, 17, 50, 33, + 33, 49, 33, 65, 17, 65, 17, 82, 81, 224, 16, 6, + 97, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 86, 192, 27, 7, 113, 82, 83, 52, 52, 51, 17, 17, + 18, 17, 17, 18, 17, 17, 18, 33, 34, 33, 34, 33, + 34, 33, 34, 81, 224, 24, 7, 113, 83, 67, 66, 17, + 50, 17, 50, 33, 34, 33, 34, 33, 34, 49, 18, 49, + 18, 67, 67, 81, 224, 22, 7, 147, 49, 49, 33, 49, + 17, 82, 82, 82, 82, 82, 82, 81, 17, 49, 33, 49, + 51, 240, 16, 19, 7, 117, 33, 65, 17, 82, 82, 82, + 65, 21, 33, 97, 97, 97, 97, 97, 240, 80, 23, 7, + 147, 49, 49, 33, 49, 17, 82, 82, 82, 82, 82, 82, + 19, 17, 17, 49, 33, 49, 51, 97, 114, 23, 7, 117, + 33, 65, 17, 82, 82, 82, 65, 21, 33, 49, 33, 65, + 17, 65, 17, 65, 17, 82, 81, 224, 19, 7, 147, 49, + 49, 17, 82, 82, 114, 114, 113, 114, 82, 81, 17, 49, + 51, 240, 16, 17, 7, 119, 49, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 240, 32, 19, 7, 113, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 81, 17, 49, + 51, 240, 16, 24, 7, 113, 82, 82, 82, 81, 17, 49, + 33, 49, 33, 49, 49, 17, 65, 17, 65, 17, 81, 97, + 97, 240, 32, 32, 7, 113, 33, 34, 33, 34, 33, 34, + 33, 34, 33, 34, 33, 34, 17, 17, 18, 17, 17, 17, + 18, 18, 33, 49, 33, 49, 33, 49, 33, 49, 240, 27, + 7, 113, 81, 17, 49, 33, 49, 49, 17, 65, 17, 81, + 81, 17, 65, 17, 65, 17, 49, 49, 33, 49, 17, 82, + 81, 224, 23, 7, 113, 82, 81, 17, 49, 33, 49, 33, + 49, 49, 17, 65, 17, 81, 97, 97, 97, 97, 97, 240, + 32, 16, 7, 119, 81, 97, 81, 97, 81, 97, 81, 97, + 81, 97, 81, 103, 224, 17, 4, 5, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 52, 17, 7, + 113, 97, 113, 97, 113, 97, 113, 97, 113, 97, 113, 97, + 113, 97, 112, 17, 4, 4, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 53, 12, 7, 49, 81, + 17, 49, 49, 17, 81, 0, 10, 64, 6, 7, 0, 12, + 39, 112, 7, 2, 3, 17, 33, 240, 144, 17, 7, 240, + 240, 116, 33, 65, 97, 37, 17, 66, 82, 82, 66, 20, + 17, 224, 21, 7, 113, 97, 97, 97, 97, 19, 34, 49, + 17, 82, 82, 82, 82, 83, 49, 17, 19, 240, 16, 18, + 7, 240, 240, 115, 49, 49, 17, 82, 97, 97, 97, 81, + 17, 49, 51, 240, 16, 20, 7, 209, 97, 97, 97, 35, + 17, 17, 51, 82, 82, 82, 82, 81, 17, 50, 35, 17, + 224, 17, 7, 240, 240, 115, 49, 49, 17, 82, 89, 97, + 81, 17, 49, 51, 240, 16, 16, 5, 130, 33, 65, 65, + 37, 33, 65, 65, 65, 65, 65, 65, 65, 192, 23, 8, + 240, 240, 195, 18, 17, 49, 49, 49, 49, 49, 67, 65, + 116, 49, 65, 33, 81, 17, 81, 37, 32, 18, 6, 97, + 81, 81, 81, 81, 19, 18, 50, 66, 66, 66, 66, 66, + 66, 65, 192, 14, 2, 49, 17, 66, 17, 17, 17, 17, + 17, 17, 17, 17, 64, 16, 4, 113, 49, 162, 49, 49, + 49, 49, 49, 49, 49, 49, 33, 18, 32, 23, 6, 97, + 81, 81, 81, 81, 66, 49, 17, 33, 33, 17, 50, 17, + 33, 49, 17, 49, 17, 66, 65, 192, 16, 2, 34, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 64, + 24, 7, 240, 240, 83, 18, 17, 33, 34, 33, 34, 33, + 34, 33, 34, 33, 34, 33, 34, 33, 34, 33, 33, 224, + 15, 6, 240, 241, 19, 18, 50, 66, 66, 66, 66, 66, + 66, 65, 192, 18, 7, 240, 240, 115, 49, 49, 17, 82, + 82, 82, 82, 81, 17, 49, 51, 240, 16, 20, 7, 240, + 240, 81, 19, 34, 49, 17, 82, 82, 82, 83, 49, 17, + 19, 33, 97, 97, 96, 19, 7, 240, 240, 115, 17, 17, + 51, 82, 82, 82, 81, 17, 50, 35, 17, 97, 97, 97, + 13, 4, 240, 81, 20, 33, 49, 49, 49, 49, 49, 49, + 176, 14, 6, 240, 240, 20, 17, 66, 82, 98, 98, 82, + 65, 20, 208, 15, 5, 193, 65, 65, 37, 33, 65, 65, + 65, 65, 65, 65, 82, 160, 15, 6, 240, 241, 66, 66, + 66, 66, 66, 66, 66, 50, 19, 17, 192, 20, 7, 240, + 240, 81, 82, 82, 81, 17, 49, 33, 49, 49, 17, 65, + 17, 81, 97, 240, 32, 26, 7, 240, 240, 81, 33, 34, + 33, 34, 33, 34, 33, 34, 17, 17, 18, 17, 17, 17, + 17, 49, 33, 49, 33, 49, 240, 22, 7, 240, 240, 81, + 81, 17, 49, 49, 17, 65, 17, 81, 81, 17, 65, 17, + 49, 49, 17, 81, 224, 21, 7, 240, 240, 81, 82, 81, + 17, 49, 33, 49, 49, 17, 65, 17, 82, 81, 97, 81, + 66, 80, 14, 7, 240, 240, 102, 81, 81, 97, 81, 97, + 81, 81, 87, 224, 18, 3, 33, 17, 33, 33, 33, 33, + 33, 17, 49, 33, 33, 33, 33, 33, 33, 49, 4, 1, + 15, 1, 19, 3, 1, 49, 33, 33, 33, 33, 33, 49, + 17, 33, 33, 33, 33, 33, 33, 17, 32, 11, 7, 240, + 114, 65, 33, 33, 66, 0, 8, 112, + // + // Block 1 Offsets: Codepoints 0x3041 - 0x30ff + // + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x19, 0x03, 0x00, 0x00, // Offset 793 (0x319) + 0x3b, 0x03, 0x00, 0x00, // Offset 827 (0x33b) + 0x50, 0x03, 0x00, 0x00, // Offset 848 (0x350) + 0x6a, 0x03, 0x00, 0x00, // Offset 874 (0x36a) + 0x7a, 0x03, 0x00, 0x00, // Offset 890 (0x37a) + 0x8d, 0x03, 0x00, 0x00, // Offset 909 (0x38d) + 0x9f, 0x03, 0x00, 0x00, // Offset 927 (0x39f) + 0xb5, 0x03, 0x00, 0x00, // Offset 949 (0x3b5) + 0xcd, 0x03, 0x00, 0x00, // Offset 973 (0x3cd) + 0xee, 0x03, 0x00, 0x00, // Offset 1006 (0x3ee) + 0x11, 0x04, 0x00, 0x00, // Offset 1041 (0x411) + 0x39, 0x04, 0x00, 0x00, // Offset 1081 (0x439) + 0x4e, 0x04, 0x00, 0x00, // Offset 1102 (0x44e) + 0x6a, 0x04, 0x00, 0x00, // Offset 1130 (0x46a) + 0x7c, 0x04, 0x00, 0x00, // Offset 1148 (0x47c) + 0x94, 0x04, 0x00, 0x00, // Offset 1172 (0x494) + 0xb3, 0x04, 0x00, 0x00, // Offset 1203 (0x4b3) + 0xd8, 0x04, 0x00, 0x00, // Offset 1240 (0x4d8) + 0xe7, 0x04, 0x00, 0x00, // Offset 1255 (0x4e7) + 0xfb, 0x04, 0x00, 0x00, // Offset 1275 (0x4fb) + 0x0f, 0x05, 0x00, 0x00, // Offset 1295 (0x50f) + 0x28, 0x05, 0x00, 0x00, // Offset 1320 (0x528) + 0x3b, 0x05, 0x00, 0x00, // Offset 1339 (0x53b) + 0x52, 0x05, 0x00, 0x00, // Offset 1362 (0x552) + 0x6a, 0x05, 0x00, 0x00, // Offset 1386 (0x56a) + 0x87, 0x05, 0x00, 0x00, // Offset 1415 (0x587) + 0xa1, 0x05, 0x00, 0x00, // Offset 1441 (0x5a1) + 0xc1, 0x05, 0x00, 0x00, // Offset 1473 (0x5c1) + 0xd2, 0x05, 0x00, 0x00, // Offset 1490 (0x5d2) + 0xea, 0x05, 0x00, 0x00, // Offset 1514 (0x5ea) + 0x02, 0x06, 0x00, 0x00, // Offset 1538 (0x602) + 0x1f, 0x06, 0x00, 0x00, // Offset 1567 (0x61f) + 0x37, 0x06, 0x00, 0x00, // Offset 1591 (0x637) + 0x53, 0x06, 0x00, 0x00, // Offset 1619 (0x653) + 0x60, 0x06, 0x00, 0x00, // Offset 1632 (0x660) + 0x73, 0x06, 0x00, 0x00, // Offset 1651 (0x673) + 0x8a, 0x06, 0x00, 0x00, // Offset 1674 (0x68a) + 0x9d, 0x06, 0x00, 0x00, // Offset 1693 (0x69d) + 0xb7, 0x06, 0x00, 0x00, // Offset 1719 (0x6b7) + 0xca, 0x06, 0x00, 0x00, // Offset 1738 (0x6ca) + 0xe3, 0x06, 0x00, 0x00, // Offset 1763 (0x6e3) + 0x02, 0x07, 0x00, 0x00, // Offset 1794 (0x702) + 0x1b, 0x07, 0x00, 0x00, // Offset 1819 (0x71b) + 0x45, 0x07, 0x00, 0x00, // Offset 1861 (0x745) + 0x6a, 0x07, 0x00, 0x00, // Offset 1898 (0x76a) + 0x8b, 0x07, 0x00, 0x00, // Offset 1931 (0x78b) + 0xaf, 0x07, 0x00, 0x00, // Offset 1967 (0x7af) + 0xda, 0x07, 0x00, 0x00, // Offset 2010 (0x7da) + 0x03, 0x08, 0x00, 0x00, // Offset 2051 (0x803) + 0x24, 0x08, 0x00, 0x00, // Offset 2084 (0x824) + 0x4a, 0x08, 0x00, 0x00, // Offset 2122 (0x84a) + 0x6f, 0x08, 0x00, 0x00, // Offset 2159 (0x86f) + 0x8c, 0x08, 0x00, 0x00, // Offset 2188 (0x88c) + 0xaf, 0x08, 0x00, 0x00, // Offset 2223 (0x8af) + 0xd1, 0x08, 0x00, 0x00, // Offset 2257 (0x8d1) + 0xe3, 0x08, 0x00, 0x00, // Offset 2275 (0x8e3) + 0xfb, 0x08, 0x00, 0x00, // Offset 2299 (0x8fb) + 0x12, 0x09, 0x00, 0x00, // Offset 2322 (0x912) + 0x36, 0x09, 0x00, 0x00, // Offset 2358 (0x936) + 0x5f, 0x09, 0x00, 0x00, // Offset 2399 (0x95f) + 0x87, 0x09, 0x00, 0x00, // Offset 2439 (0x987) + 0x9d, 0x09, 0x00, 0x00, // Offset 2461 (0x99d) + 0xbc, 0x09, 0x00, 0x00, // Offset 2492 (0x9bc) + 0xdc, 0x09, 0x00, 0x00, // Offset 2524 (0x9dc) + 0x05, 0x0a, 0x00, 0x00, // Offset 2565 (0xa05) + 0x1d, 0x0a, 0x00, 0x00, // Offset 2589 (0xa1d) + 0x34, 0x0a, 0x00, 0x00, // Offset 2612 (0xa34) + 0x50, 0x0a, 0x00, 0x00, // Offset 2640 (0xa50) + 0x6e, 0x0a, 0x00, 0x00, // Offset 2670 (0xa6e) + 0x93, 0x0a, 0x00, 0x00, // Offset 2707 (0xa93) + 0xa6, 0x0a, 0x00, 0x00, // Offset 2726 (0xaa6) + 0xbf, 0x0a, 0x00, 0x00, // Offset 2751 (0xabf) + 0xd5, 0x0a, 0x00, 0x00, // Offset 2773 (0xad5) + 0xec, 0x0a, 0x00, 0x00, // Offset 2796 (0xaec) + 0x05, 0x0b, 0x00, 0x00, // Offset 2821 (0xb05) + 0x2a, 0x0b, 0x00, 0x00, // Offset 2858 (0xb2a) + 0x3e, 0x0b, 0x00, 0x00, // Offset 2878 (0xb3e) + 0x57, 0x0b, 0x00, 0x00, // Offset 2903 (0xb57) + 0x77, 0x0b, 0x00, 0x00, // Offset 2935 (0xb77) + 0x98, 0x0b, 0x00, 0x00, // Offset 2968 (0xb98) + 0xb4, 0x0b, 0x00, 0x00, // Offset 2996 (0xbb4) + 0xce, 0x0b, 0x00, 0x00, // Offset 3022 (0xbce) + 0xec, 0x0b, 0x00, 0x00, // Offset 3052 (0xbec) + 0x01, 0x0c, 0x00, 0x00, // Offset 3073 (0xc01) + 0x1b, 0x0c, 0x00, 0x00, // Offset 3099 (0xc1b) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x32, 0x0c, 0x00, 0x00, // Offset 3122 (0xc32) + 0x3d, 0x0c, 0x00, 0x00, // Offset 3133 (0xc3d) + 0x47, 0x0c, 0x00, 0x00, // Offset 3143 (0xc47) + 0x56, 0x0c, 0x00, 0x00, // Offset 3158 (0xc56) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x69, 0x0c, 0x00, 0x00, // Offset 3177 (0xc69) + 0x79, 0x0c, 0x00, 0x00, // Offset 3193 (0xc79) + 0x8f, 0x0c, 0x00, 0x00, // Offset 3215 (0xc8f) + 0x9f, 0x0c, 0x00, 0x00, // Offset 3231 (0xc9f) + 0xb3, 0x0c, 0x00, 0x00, // Offset 3251 (0xcb3) + 0xc3, 0x0c, 0x00, 0x00, // Offset 3267 (0xcc3) + 0xd6, 0x0c, 0x00, 0x00, // Offset 3286 (0xcd6) + 0xe2, 0x0c, 0x00, 0x00, // Offset 3298 (0xce2) + 0xf2, 0x0c, 0x00, 0x00, // Offset 3314 (0xcf2) + 0x05, 0x0d, 0x00, 0x00, // Offset 3333 (0xd05) + 0x1e, 0x0d, 0x00, 0x00, // Offset 3358 (0xd1e) + 0x3a, 0x0d, 0x00, 0x00, // Offset 3386 (0xd3a) + 0x5b, 0x0d, 0x00, 0x00, // Offset 3419 (0xd5b) + 0x73, 0x0d, 0x00, 0x00, // Offset 3443 (0xd73) + 0x90, 0x0d, 0x00, 0x00, // Offset 3472 (0xd90) + 0xa8, 0x0d, 0x00, 0x00, // Offset 3496 (0xda8) + 0xc5, 0x0d, 0x00, 0x00, // Offset 3525 (0xdc5) + 0xdd, 0x0d, 0x00, 0x00, // Offset 3549 (0xddd) + 0xfa, 0x0d, 0x00, 0x00, // Offset 3578 (0xdfa) + 0x0a, 0x0e, 0x00, 0x00, // Offset 3594 (0xe0a) + 0x1e, 0x0e, 0x00, 0x00, // Offset 3614 (0xe1e) + 0x3a, 0x0e, 0x00, 0x00, // Offset 3642 (0xe3a) + 0x5a, 0x0e, 0x00, 0x00, // Offset 3674 (0xe5a) + 0x6e, 0x0e, 0x00, 0x00, // Offset 3694 (0xe6e) + 0x86, 0x0e, 0x00, 0x00, // Offset 3718 (0xe86) + 0x9b, 0x0e, 0x00, 0x00, // Offset 3739 (0xe9b) + 0xb6, 0x0e, 0x00, 0x00, // Offset 3766 (0xeb6) + 0xcd, 0x0e, 0x00, 0x00, // Offset 3789 (0xecd) + 0xea, 0x0e, 0x00, 0x00, // Offset 3818 (0xeea) + 0x01, 0x0f, 0x00, 0x00, // Offset 3841 (0xf01) + 0x1a, 0x0f, 0x00, 0x00, // Offset 3866 (0xf1a) + 0x33, 0x0f, 0x00, 0x00, // Offset 3891 (0xf33) + 0x50, 0x0f, 0x00, 0x00, // Offset 3920 (0xf50) + 0x63, 0x0f, 0x00, 0x00, // Offset 3939 (0xf63) + 0x7a, 0x0f, 0x00, 0x00, // Offset 3962 (0xf7a) + 0x8d, 0x0f, 0x00, 0x00, // Offset 3981 (0xf8d) + 0xa6, 0x0f, 0x00, 0x00, // Offset 4006 (0xfa6) + 0xc2, 0x0f, 0x00, 0x00, // Offset 4034 (0xfc2) + 0xd3, 0x0f, 0x00, 0x00, // Offset 4051 (0xfd3) + 0xe8, 0x0f, 0x00, 0x00, // Offset 4072 (0xfe8) + 0xfc, 0x0f, 0x00, 0x00, // Offset 4092 (0xffc) + 0x15, 0x10, 0x00, 0x00, // Offset 4117 (0x1015) + 0x28, 0x10, 0x00, 0x00, // Offset 4136 (0x1028) + 0x32, 0x10, 0x00, 0x00, // Offset 4146 (0x1032) + 0x49, 0x10, 0x00, 0x00, // Offset 4169 (0x1049) + 0x61, 0x10, 0x00, 0x00, // Offset 4193 (0x1061) + 0x74, 0x10, 0x00, 0x00, // Offset 4212 (0x1074) + 0x8f, 0x10, 0x00, 0x00, // Offset 4239 (0x108f) + 0xaf, 0x10, 0x00, 0x00, // Offset 4271 (0x10af) + 0xce, 0x10, 0x00, 0x00, // Offset 4302 (0x10ce) + 0xe1, 0x10, 0x00, 0x00, // Offset 4321 (0x10e1) + 0xf8, 0x10, 0x00, 0x00, // Offset 4344 (0x10f8) + 0x0f, 0x11, 0x00, 0x00, // Offset 4367 (0x110f) + 0x21, 0x11, 0x00, 0x00, // Offset 4385 (0x1121) + 0x35, 0x11, 0x00, 0x00, // Offset 4405 (0x1135) + 0x49, 0x11, 0x00, 0x00, // Offset 4425 (0x1149) + 0x5c, 0x11, 0x00, 0x00, // Offset 4444 (0x115c) + 0x75, 0x11, 0x00, 0x00, // Offset 4469 (0x1175) + 0x8d, 0x11, 0x00, 0x00, // Offset 4493 (0x118d) + 0xac, 0x11, 0x00, 0x00, // Offset 4524 (0x11ac) + 0xd0, 0x11, 0x00, 0x00, // Offset 4560 (0x11d0) + 0xf4, 0x11, 0x00, 0x00, // Offset 4596 (0x11f4) + 0x07, 0x12, 0x00, 0x00, // Offset 4615 (0x1207) + 0x17, 0x12, 0x00, 0x00, // Offset 4631 (0x1217) + 0x2f, 0x12, 0x00, 0x00, // Offset 4655 (0x122f) + 0x47, 0x12, 0x00, 0x00, // Offset 4679 (0x1247) + 0x58, 0x12, 0x00, 0x00, // Offset 4696 (0x1258) + 0x6d, 0x12, 0x00, 0x00, // Offset 4717 (0x126d) + 0x88, 0x12, 0x00, 0x00, // Offset 4744 (0x1288) + 0x94, 0x12, 0x00, 0x00, // Offset 4756 (0x1294) + 0xa4, 0x12, 0x00, 0x00, // Offset 4772 (0x12a4) + 0xb0, 0x12, 0x00, 0x00, // Offset 4784 (0x12b0) + 0xbf, 0x12, 0x00, 0x00, // Offset 4799 (0x12bf) + 0xd0, 0x12, 0x00, 0x00, // Offset 4816 (0x12d0) + 0xe2, 0x12, 0x00, 0x00, // Offset 4834 (0x12e2) + 0x07, 0x13, 0x00, 0x00, // Offset 4871 (0x1307) + 0x1c, 0x13, 0x00, 0x00, // Offset 4892 (0x131c) + 0x2c, 0x13, 0x00, 0x00, // Offset 4908 (0x132c) + 0x3a, 0x13, 0x00, 0x00, // Offset 4922 (0x133a) + 0x4c, 0x13, 0x00, 0x00, // Offset 4940 (0x134c) + 0x64, 0x13, 0x00, 0x00, // Offset 4964 (0x1364) + 0x76, 0x13, 0x00, 0x00, // Offset 4982 (0x1376) + 0x87, 0x13, 0x00, 0x00, // Offset 4999 (0x1387) + 0x9a, 0x13, 0x00, 0x00, // Offset 5018 (0x139a) + 0xb5, 0x13, 0x00, 0x00, // Offset 5045 (0x13b5) + 0xcc, 0x13, 0x00, 0x00, // Offset 5068 (0x13cc) + 0xe0, 0x13, 0x00, 0x00, // Offset 5088 (0x13e0) + 0xf8, 0x13, 0x00, 0x00, // Offset 5112 (0x13f8) + 0x12, 0x14, 0x00, 0x00, // Offset 5138 (0x1412) + 0x26, 0x14, 0x00, 0x00, // Offset 5158 (0x1426) + 0x3a, 0x14, 0x00, 0x00, // Offset 5178 (0x143a) + 0x3e, 0x14, 0x00, 0x00, // Offset 5182 (0x143e) + 0x46, 0x14, 0x00, 0x00, // Offset 5190 (0x1446) + 0x53, 0x14, 0x00, 0x00, // Offset 5203 (0x1453) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3041 - 0x30ff + // + 29, 10, 240, 240, 49, 145, 18, 68, 129, 33, 101, 66, + 33, 17, 33, 17, 17, 50, 33, 17, 50, 34, 66, 33, + 65, 34, 65, 114, 208, 34, 13, 65, 193, 193, 34, 86, + 161, 193, 33, 150, 97, 49, 33, 66, 49, 49, 33, 17, + 33, 82, 33, 33, 82, 50, 98, 33, 17, 81, 34, 98, + 146, 240, 32, 21, 10, 0, 7, 81, 145, 81, 33, 113, + 17, 113, 17, 130, 130, 33, 81, 17, 17, 129, 240, 32, + 26, 13, 240, 240, 161, 193, 113, 65, 129, 33, 161, 17, + 161, 17, 178, 178, 177, 17, 33, 113, 17, 33, 162, 240, + 240, 80, 16, 7, 240, 129, 114, 240, 52, 18, 65, 97, + 97, 81, 97, 81, 66, 160, 19, 10, 50, 162, 240, 181, + 35, 81, 161, 145, 145, 129, 145, 129, 129, 114, 98, 240, + 16, 18, 10, 240, 240, 209, 162, 162, 215, 129, 129, 129, + 114, 17, 81, 49, 65, 65, 164, 22, 12, 65, 193, 194, + 240, 56, 161, 161, 161, 161, 163, 129, 49, 97, 65, 81, + 81, 65, 113, 195, 192, 24, 10, 240, 240, 209, 145, 65, + 68, 37, 81, 49, 149, 66, 65, 33, 17, 82, 33, 82, + 33, 65, 34, 50, 192, 33, 14, 65, 209, 209, 66, 116, + 49, 37, 113, 81, 129, 65, 213, 115, 66, 65, 33, 97, + 33, 49, 97, 33, 49, 97, 33, 33, 97, 66, 82, 162, + 240, 80, 35, 13, 240, 17, 193, 193, 81, 97, 97, 39, + 65, 65, 49, 49, 49, 65, 65, 33, 65, 65, 33, 65, + 65, 17, 81, 97, 81, 81, 81, 97, 33, 33, 162, 240, + 80, 40, 13, 49, 193, 97, 17, 49, 97, 17, 49, 81, + 33, 49, 97, 39, 65, 65, 49, 49, 49, 65, 65, 33, + 65, 65, 33, 65, 65, 17, 81, 97, 81, 81, 81, 97, + 33, 33, 162, 240, 80, 21, 11, 81, 161, 161, 19, 38, + 161, 171, 17, 177, 161, 85, 17, 49, 82, 33, 161, 178, + 180, 224, 28, 13, 81, 81, 97, 49, 33, 81, 20, 17, + 22, 49, 129, 197, 38, 17, 209, 193, 117, 17, 81, 82, + 65, 193, 210, 212, 240, 48, 18, 6, 81, 81, 65, 65, + 65, 65, 65, 81, 97, 97, 97, 97, 81, 97, 81, 96, + 24, 10, 81, 145, 129, 49, 65, 33, 33, 33, 65, 17, + 17, 81, 33, 145, 161, 161, 161, 161, 145, 161, 145, 224, + 31, 13, 145, 65, 113, 65, 113, 65, 113, 65, 117, 54, + 49, 129, 49, 129, 49, 129, 49, 129, 49, 17, 97, 65, + 113, 65, 113, 177, 162, 240, 48, 37, 14, 145, 33, 33, + 114, 33, 17, 113, 17, 17, 17, 113, 17, 49, 116, 17, + 54, 65, 129, 65, 129, 65, 129, 65, 129, 65, 17, 97, + 81, 113, 81, 113, 193, 178, 240, 80, 15, 11, 240, 147, + 181, 0, 7, 1, 161, 161, 177, 129, 40, 240, 128, 20, + 12, 240, 97, 17, 35, 65, 17, 85, 17, 0, 7, 65, + 177, 177, 193, 129, 56, 240, 176, 20, 10, 65, 145, 145, + 58, 113, 161, 145, 161, 69, 17, 33, 82, 17, 145, 161, + 162, 164, 192, 25, 12, 65, 81, 81, 49, 33, 65, 65, + 27, 113, 193, 177, 193, 101, 17, 65, 82, 49, 177, 193, + 194, 196, 240, 16, 19, 9, 145, 129, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 114, 97, 33, 50, 67, 208, 23, + 9, 145, 129, 97, 17, 65, 34, 81, 18, 81, 33, 129, + 129, 129, 129, 129, 114, 97, 33, 50, 67, 208, 24, 13, + 113, 193, 206, 193, 193, 146, 17, 129, 34, 129, 49, 129, + 49, 129, 34, 146, 17, 193, 193, 177, 162, 112, 29, 14, + 113, 65, 129, 33, 33, 117, 25, 49, 145, 209, 162, 17, + 145, 34, 145, 49, 145, 49, 145, 34, 162, 17, 209, 209, + 193, 178, 128, 26, 14, 240, 129, 129, 65, 129, 65, 129, + 69, 70, 69, 65, 129, 65, 129, 65, 129, 65, 129, 49, + 145, 225, 230, 240, 240, 32, 15, 240, 145, 49, 81, 65, + 17, 33, 65, 65, 33, 17, 65, 68, 102, 85, 65, 145, + 65, 145, 65, 145, 65, 145, 49, 161, 241, 246, 240, 240, + 48, 17, 12, 247, 145, 161, 161, 161, 161, 76, 161, 161, + 161, 177, 177, 193, 195, 240, 24, 13, 177, 71, 33, 113, + 33, 17, 97, 49, 113, 177, 177, 68, 24, 177, 177, 177, + 193, 193, 209, 211, 240, 32, 24, 13, 49, 193, 193, 34, + 86, 161, 177, 193, 99, 49, 51, 97, 177, 193, 193, 177, + 81, 97, 81, 97, 102, 208, 29, 13, 49, 193, 113, 65, + 34, 17, 39, 65, 17, 49, 97, 65, 193, 99, 49, 51, + 97, 177, 193, 193, 177, 81, 97, 81, 97, 102, 208, 24, + 12, 65, 177, 177, 122, 97, 161, 177, 177, 36, 65, 18, + 65, 50, 113, 33, 129, 177, 161, 146, 100, 240, 16, 28, + 13, 65, 97, 81, 65, 33, 65, 81, 28, 97, 177, 193, + 193, 36, 81, 18, 65, 66, 113, 49, 129, 193, 177, 162, + 116, 240, 48, 13, 9, 0, 9, 53, 19, 81, 129, 129, + 113, 98, 82, 208, 19, 14, 0, 6, 19, 131, 50, 36, + 129, 225, 209, 209, 193, 193, 178, 147, 0, 5, 112, 23, + 15, 209, 193, 33, 193, 17, 115, 33, 99, 50, 52, 129, + 241, 225, 225, 209, 209, 194, 163, 0, 6, 48, 19, 14, + 240, 163, 86, 53, 65, 193, 193, 209, 193, 209, 209, 209, + 225, 225, 227, 240, 240, 26, 15, 240, 179, 102, 69, 65, + 49, 145, 33, 33, 113, 65, 17, 113, 65, 129, 225, 225, + 225, 241, 241, 243, 240, 240, 48, 19, 10, 177, 145, 161, + 145, 161, 66, 49, 34, 98, 113, 129, 129, 129, 145, 161, + 168, 160, 25, 12, 209, 129, 33, 97, 33, 33, 97, 17, + 33, 97, 81, 66, 81, 34, 130, 145, 161, 161, 161, 177, + 193, 200, 224, 31, 13, 49, 193, 196, 100, 82, 81, 113, + 49, 81, 49, 33, 81, 97, 81, 81, 97, 81, 97, 65, + 113, 133, 113, 67, 81, 65, 33, 84, 240, 48, 25, 12, + 209, 177, 177, 99, 33, 51, 65, 177, 177, 177, 177, 177, + 49, 113, 49, 113, 66, 81, 17, 69, 17, 240, 112, 42, + 14, 240, 97, 129, 65, 129, 65, 129, 38, 83, 33, 49, + 65, 65, 65, 49, 65, 81, 17, 17, 33, 97, 17, 17, + 33, 98, 50, 114, 49, 67, 18, 33, 17, 33, 49, 34, + 81, 49, 163, 17, 224, 37, 14, 49, 209, 209, 210, 51, + 52, 49, 49, 81, 33, 81, 65, 17, 97, 66, 113, 65, + 129, 50, 129, 50, 84, 33, 17, 65, 49, 17, 33, 65, + 50, 49, 83, 81, 240, 144, 33, 13, 240, 240, 20, 114, + 17, 33, 81, 49, 49, 49, 65, 65, 33, 65, 65, 17, + 65, 98, 65, 98, 49, 97, 17, 33, 113, 34, 113, 177, + 162, 240, 240, 36, 13, 145, 65, 113, 65, 113, 65, 113, + 65, 117, 54, 49, 129, 49, 129, 49, 129, 49, 129, 49, + 129, 49, 69, 49, 17, 17, 67, 33, 33, 65, 33, 17, + 52, 240, 32, 43, 14, 145, 81, 113, 17, 17, 17, 113, + 17, 17, 17, 113, 17, 17, 17, 116, 33, 38, 65, 129, + 65, 129, 65, 129, 65, 129, 65, 129, 65, 69, 65, 17, + 17, 67, 49, 33, 65, 33, 33, 52, 240, 64, 41, 14, + 145, 18, 33, 114, 33, 17, 114, 33, 17, 113, 18, 33, + 116, 33, 38, 65, 129, 65, 129, 65, 129, 65, 129, 65, + 129, 65, 69, 65, 17, 17, 67, 49, 33, 65, 33, 33, + 52, 240, 64, 33, 14, 240, 81, 164, 115, 33, 65, 113, + 81, 97, 98, 65, 114, 65, 113, 17, 33, 129, 33, 17, + 129, 65, 129, 65, 113, 97, 97, 113, 50, 147, 240, 96, + 38, 15, 240, 97, 97, 68, 65, 36, 33, 65, 17, 17, + 65, 81, 17, 81, 98, 81, 114, 81, 113, 17, 49, 129, + 33, 33, 129, 81, 129, 81, 113, 113, 97, 129, 50, 163, + 240, 128, 37, 15, 194, 113, 65, 33, 52, 65, 36, 33, + 65, 18, 81, 81, 113, 98, 81, 114, 81, 113, 17, 49, + 129, 33, 33, 129, 81, 129, 81, 113, 113, 97, 129, 50, + 163, 240, 128, 29, 15, 240, 81, 243, 225, 209, 209, 225, + 241, 49, 81, 81, 49, 65, 81, 65, 33, 113, 65, 17, + 113, 66, 129, 145, 49, 179, 240, 112, 35, 15, 240, 81, + 97, 131, 17, 33, 145, 33, 17, 129, 49, 145, 225, 241, + 49, 81, 81, 49, 65, 81, 65, 33, 113, 65, 17, 113, + 66, 129, 145, 49, 179, 240, 112, 34, 15, 178, 113, 65, + 33, 115, 17, 33, 145, 34, 145, 209, 225, 241, 49, 81, + 81, 49, 65, 81, 65, 33, 113, 65, 17, 113, 66, 129, + 145, 49, 179, 240, 112, 18, 14, 0, 7, 66, 177, 33, + 145, 65, 113, 97, 81, 129, 226, 226, 0, 8, 96, 24, + 14, 240, 240, 145, 177, 33, 82, 65, 17, 65, 33, 49, + 81, 65, 113, 97, 81, 129, 226, 226, 0, 8, 96, 23, + 14, 240, 240, 130, 177, 33, 161, 33, 82, 66, 81, 33, + 145, 65, 113, 97, 81, 129, 226, 226, 0, 7, 36, 13, + 225, 40, 33, 113, 65, 113, 65, 113, 49, 131, 17, 54, + 49, 129, 49, 129, 49, 129, 49, 129, 49, 69, 49, 17, + 17, 67, 33, 33, 65, 33, 17, 52, 240, 32, 41, 14, + 193, 33, 39, 33, 17, 113, 17, 17, 17, 113, 17, 49, + 113, 65, 131, 33, 54, 65, 129, 65, 129, 65, 129, 65, + 129, 65, 69, 65, 17, 17, 67, 49, 33, 65, 33, 33, + 52, 240, 64, 40, 14, 178, 33, 39, 33, 17, 114, 33, + 17, 113, 18, 33, 113, 65, 131, 33, 54, 65, 129, 65, + 129, 65, 129, 65, 129, 65, 69, 65, 17, 17, 67, 49, + 33, 65, 33, 33, 52, 240, 64, 22, 11, 97, 161, 75, + 97, 161, 164, 23, 161, 161, 161, 101, 81, 67, 33, 81, + 36, 65, 100, 240, 16, 31, 14, 240, 246, 209, 209, 193, + 65, 129, 65, 129, 65, 102, 17, 66, 17, 67, 33, 49, + 65, 34, 49, 81, 49, 33, 81, 82, 97, 193, 240, 64, + 32, 13, 49, 193, 193, 151, 49, 81, 113, 65, 113, 35, + 130, 33, 130, 33, 81, 49, 33, 97, 33, 17, 113, 50, + 113, 65, 113, 65, 97, 102, 240, 32, 41, 14, 240, 113, + 113, 81, 113, 81, 113, 53, 81, 18, 17, 49, 66, 49, + 65, 50, 49, 65, 33, 17, 33, 97, 17, 33, 17, 98, + 65, 114, 65, 97, 17, 34, 17, 81, 34, 129, 178, 240, + 32, 24, 12, 65, 177, 177, 135, 129, 177, 161, 50, 55, + 129, 177, 113, 49, 113, 49, 113, 65, 81, 97, 49, 131, + 240, 23, 11, 0, 6, 34, 81, 81, 65, 177, 36, 67, + 65, 34, 99, 33, 65, 81, 34, 113, 161, 161, 240, 16, + 28, 14, 129, 225, 97, 113, 81, 113, 97, 209, 69, 81, + 18, 81, 51, 116, 17, 129, 81, 97, 97, 51, 129, 209, + 225, 209, 209, 96, 30, 10, 240, 240, 241, 65, 65, 65, + 52, 33, 33, 17, 33, 17, 17, 33, 51, 49, 51, 49, + 50, 33, 17, 33, 17, 52, 113, 129, 129, 96, 37, 13, + 240, 65, 97, 97, 81, 85, 33, 50, 17, 49, 17, 33, + 49, 66, 17, 65, 67, 81, 67, 81, 66, 49, 33, 49, + 17, 65, 17, 33, 33, 84, 161, 177, 177, 240, 80, 19, + 9, 240, 240, 161, 129, 129, 132, 81, 129, 129, 84, 65, + 51, 33, 49, 34, 19, 224, 25, 12, 97, 177, 177, 177, + 50, 100, 129, 177, 177, 177, 177, 117, 82, 67, 49, 81, + 34, 17, 65, 81, 20, 240, 64, 22, 10, 49, 161, 162, + 49, 145, 145, 145, 145, 52, 33, 18, 65, 18, 114, 129, + 129, 129, 114, 83, 240, 23, 8, 97, 33, 81, 17, 81, + 17, 82, 98, 98, 98, 98, 17, 65, 17, 81, 97, 113, + 97, 97, 82, 192, 25, 12, 246, 161, 161, 161, 161, 166, + 82, 81, 49, 129, 17, 161, 177, 66, 81, 49, 33, 49, + 65, 51, 100, 240, 16, 37, 15, 65, 225, 225, 225, 35, + 130, 17, 49, 67, 18, 65, 129, 81, 129, 81, 129, 81, + 114, 81, 114, 81, 97, 17, 81, 49, 17, 33, 81, 33, + 17, 49, 98, 97, 240, 160, 20, 11, 214, 161, 145, 145, + 145, 150, 66, 81, 33, 130, 145, 161, 145, 145, 130, 114, + 240, 16, 25, 10, 240, 240, 193, 145, 145, 146, 19, 35, + 17, 49, 50, 81, 33, 97, 18, 98, 17, 81, 49, 50, + 65, 145, 112, 32, 14, 49, 209, 209, 211, 163, 146, 17, + 52, 97, 18, 65, 82, 113, 65, 145, 34, 145, 17, 17, + 129, 17, 33, 129, 65, 98, 81, 66, 113, 240, 144, 33, + 14, 240, 37, 209, 209, 209, 209, 182, 98, 17, 65, 65, + 49, 81, 33, 49, 114, 65, 114, 49, 51, 34, 33, 49, + 50, 34, 65, 49, 17, 131, 240, 32, 28, 13, 247, 177, + 162, 165, 113, 81, 81, 113, 98, 65, 81, 33, 33, 97, + 33, 17, 132, 145, 179, 35, 50, 50, 49, 17, 147, 208, + 26, 13, 81, 193, 196, 85, 177, 193, 98, 52, 34, 65, + 66, 81, 66, 81, 65, 17, 145, 33, 129, 49, 129, 209, + 214, 240, 30, 14, 97, 209, 193, 209, 193, 209, 209, 193, + 18, 162, 33, 130, 49, 129, 65, 113, 81, 81, 17, 81, + 65, 17, 113, 33, 33, 130, 240, 32, 21, 13, 240, 211, + 181, 34, 161, 18, 146, 55, 83, 66, 193, 193, 193, 178, + 177, 162, 147, 161, 144, 26, 10, 0, 7, 98, 129, 49, + 53, 33, 65, 33, 18, 34, 33, 33, 33, 49, 49, 17, + 49, 65, 33, 17, 65, 34, 240, 23, 9, 0, 6, 49, + 33, 81, 33, 81, 33, 39, 81, 33, 81, 33, 81, 33, + 81, 34, 50, 98, 113, 64, 11, 4, 33, 17, 33, 17, + 17, 17, 0, 6, 32, 10, 4, 82, 17, 34, 33, 18, + 240, 240, 240, 15, 8, 240, 240, 34, 130, 129, 129, 129, + 99, 65, 97, 240, 240, 96, 19, 9, 240, 161, 97, 35, + 65, 17, 34, 33, 97, 145, 145, 115, 81, 113, 240, 240, + 176, 16, 9, 0, 7, 121, 65, 49, 65, 33, 81, 17, + 97, 129, 113, 113, 240, 22, 13, 240, 240, 157, 193, 97, + 81, 97, 65, 113, 49, 129, 18, 145, 193, 177, 193, 177, + 162, 240, 112, 16, 8, 0, 5, 113, 97, 97, 97, 83, + 50, 33, 113, 113, 113, 113, 176, 20, 10, 240, 65, 145, + 129, 129, 129, 115, 82, 33, 50, 65, 145, 145, 145, 145, + 145, 145, 208, 16, 9, 240, 240, 161, 129, 129, 74, 114, + 114, 97, 129, 113, 98, 82, 224, 19, 11, 240, 17, 161, + 161, 92, 146, 146, 146, 145, 145, 161, 145, 145, 130, 114, + 240, 32, 12, 9, 0, 9, 23, 81, 129, 129, 129, 129, + 73, 144, 16, 14, 0, 7, 42, 145, 209, 209, 209, 209, + 209, 209, 110, 240, 240, 192, 19, 9, 0, 6, 33, 129, + 129, 57, 66, 97, 17, 81, 33, 65, 49, 49, 65, 114, + 192, 25, 12, 240, 65, 177, 177, 76, 113, 162, 145, 17, + 145, 17, 129, 33, 113, 49, 97, 65, 66, 81, 177, 147, + 240, 16, 28, 11, 240, 17, 161, 161, 91, 81, 65, 81, + 65, 81, 65, 81, 65, 65, 81, 65, 81, 49, 97, 33, + 113, 17, 113, 17, 98, 208, 33, 14, 240, 65, 97, 97, + 65, 33, 81, 81, 29, 113, 65, 129, 65, 129, 65, 129, + 65, 113, 81, 113, 81, 97, 97, 81, 113, 65, 113, 65, + 98, 240, 64, 24, 13, 240, 49, 193, 193, 50, 116, 84, + 17, 193, 193, 51, 100, 114, 17, 84, 49, 193, 193, 209, + 193, 193, 64, 29, 13, 240, 49, 81, 97, 49, 33, 81, + 50, 17, 84, 17, 52, 17, 193, 193, 51, 100, 114, 17, + 84, 49, 193, 193, 209, 193, 193, 64, 24, 11, 240, 17, + 161, 151, 65, 81, 49, 81, 49, 97, 33, 97, 33, 113, + 145, 145, 145, 145, 130, 114, 240, 80, 29, 14, 193, 97, + 65, 33, 81, 81, 17, 70, 17, 97, 65, 113, 81, 97, + 81, 97, 97, 81, 97, 209, 193, 193, 193, 178, 162, 240, + 176, 24, 13, 240, 17, 193, 193, 202, 49, 65, 97, 81, + 97, 81, 81, 97, 65, 113, 177, 193, 177, 177, 162, 240, + 96, 29, 14, 240, 33, 129, 65, 97, 33, 49, 113, 17, + 57, 81, 65, 113, 81, 113, 81, 97, 97, 81, 113, 193, + 209, 193, 193, 178, 240, 128, 16, 11, 240, 240, 59, 161, + 161, 161, 161, 161, 161, 161, 172, 161, 240, 112, 20, 14, + 193, 177, 33, 177, 29, 193, 209, 209, 209, 209, 209, 209, + 209, 59, 209, 240, 240, 16, 28, 14, 240, 49, 81, 113, + 81, 113, 81, 113, 81, 62, 65, 81, 113, 81, 113, 81, + 113, 81, 113, 65, 209, 193, 193, 178, 240, 96, 32, 15, + 209, 81, 82, 33, 65, 81, 17, 17, 65, 81, 17, 97, + 81, 78, 81, 81, 129, 81, 129, 81, 129, 81, 129, 65, + 225, 209, 209, 194, 240, 128, 20, 12, 240, 162, 193, 240, + 240, 19, 145, 33, 113, 177, 161, 161, 161, 146, 130, 115, + 240, 96, 24, 12, 240, 113, 34, 81, 33, 49, 81, 17, + 145, 211, 145, 33, 113, 177, 161, 161, 161, 146, 130, 115, + 240, 96, 21, 13, 240, 240, 184, 193, 193, 177, 193, 177, + 194, 161, 33, 129, 65, 97, 97, 50, 131, 161, 208, 27, + 14, 240, 177, 177, 33, 40, 17, 17, 145, 17, 177, 193, + 209, 193, 210, 177, 33, 145, 65, 113, 97, 66, 129, 18, + 161, 240, 23, 13, 240, 33, 193, 193, 193, 68, 69, 54, + 97, 81, 81, 97, 65, 113, 49, 129, 193, 209, 214, 240, + 192, 29, 14, 193, 81, 81, 33, 65, 97, 17, 65, 97, + 97, 68, 85, 49, 21, 97, 97, 81, 113, 65, 129, 49, + 145, 209, 225, 230, 240, 240, 23, 11, 240, 240, 34, 145, + 17, 129, 33, 113, 33, 97, 49, 97, 145, 161, 145, 145, + 145, 130, 114, 240, 64, 25, 13, 240, 145, 161, 34, 145, + 17, 17, 129, 65, 113, 65, 97, 81, 97, 177, 193, 177, + 177, 177, 162, 146, 240, 128, 25, 12, 240, 33, 177, 183, + 65, 97, 49, 97, 49, 113, 18, 34, 49, 130, 17, 161, + 161, 161, 161, 146, 115, 240, 96, 29, 14, 193, 97, 65, + 33, 81, 81, 17, 87, 97, 97, 81, 97, 81, 113, 50, + 34, 49, 162, 17, 193, 193, 193, 193, 178, 147, 240, 160, + 19, 13, 240, 129, 147, 86, 193, 193, 193, 93, 113, 193, + 193, 177, 193, 177, 162, 240, 96, 23, 14, 193, 177, 33, + 115, 17, 17, 38, 49, 145, 209, 209, 109, 129, 209, 209, + 193, 209, 193, 178, 240, 128, 19, 9, 0, 7, 17, 81, + 49, 49, 17, 33, 49, 17, 97, 113, 129, 113, 113, 98, + 208, 25, 12, 240, 209, 113, 65, 81, 17, 49, 81, 17, + 49, 81, 17, 129, 177, 161, 177, 161, 161, 161, 146, 130, + 240, 80, 28, 14, 193, 177, 33, 65, 97, 18, 65, 81, + 49, 49, 65, 65, 49, 65, 65, 129, 193, 209, 193, 209, + 193, 193, 178, 162, 240, 144, 17, 13, 240, 240, 185, 240, + 240, 189, 113, 193, 193, 177, 193, 177, 162, 240, 96, 21, + 13, 240, 145, 161, 33, 39, 17, 17, 161, 240, 221, 113, + 193, 193, 177, 193, 177, 162, 240, 96, 20, 7, 113, 97, + 97, 97, 97, 97, 99, 65, 34, 33, 65, 17, 82, 97, + 97, 97, 97, 96, 25, 9, 145, 97, 17, 65, 34, 81, + 18, 81, 33, 129, 131, 97, 34, 65, 65, 49, 81, 33, + 129, 129, 129, 129, 128, 19, 13, 240, 81, 193, 193, 193, + 93, 113, 193, 193, 193, 193, 177, 193, 162, 146, 240, 112, + 10, 14, 0, 7, 42, 0, 10, 110, 0, 7, 23, 12, + 240, 240, 137, 177, 161, 177, 82, 49, 130, 17, 161, 161, + 17, 129, 49, 97, 81, 50, 115, 240, 112, 24, 13, 97, + 193, 193, 122, 193, 177, 177, 177, 162, 18, 98, 17, 50, + 19, 49, 81, 97, 193, 193, 193, 240, 64, 19, 11, 240, + 97, 161, 161, 161, 145, 161, 145, 161, 145, 145, 145, 145, + 130, 114, 240, 80, 27, 14, 0, 5, 97, 49, 145, 65, + 129, 81, 113, 81, 97, 113, 81, 113, 81, 129, 49, 145, + 49, 161, 17, 178, 193, 240, 208, 32, 14, 240, 177, 177, + 33, 65, 49, 33, 17, 65, 65, 17, 97, 81, 113, 81, + 97, 113, 81, 113, 81, 129, 49, 145, 49, 161, 17, 178, + 193, 240, 208, 31, 14, 178, 177, 33, 161, 33, 65, 49, + 34, 81, 65, 129, 81, 113, 81, 97, 113, 81, 113, 81, + 129, 49, 145, 49, 161, 17, 178, 193, 240, 208, 19, 10, + 161, 145, 145, 145, 145, 98, 17, 51, 52, 97, 145, 145, + 145, 161, 168, 240, 80, 23, 12, 193, 145, 17, 113, 34, + 129, 18, 129, 33, 98, 49, 51, 84, 129, 177, 177, 177, + 193, 200, 240, 176, 23, 13, 209, 146, 17, 129, 34, 129, + 34, 146, 17, 98, 65, 51, 100, 145, 193, 193, 193, 209, + 216, 240, 224, 18, 12, 240, 240, 108, 177, 177, 161, 177, + 161, 177, 161, 161, 161, 146, 130, 240, 80, 20, 13, 177, + 161, 33, 161, 28, 193, 193, 177, 193, 177, 193, 177, 177, + 177, 162, 146, 240, 128, 20, 14, 240, 162, 177, 44, 33, + 163, 177, 193, 209, 193, 209, 193, 193, 193, 178, 162, 240, + 160, 19, 14, 0, 7, 82, 177, 33, 145, 65, 113, 97, + 81, 129, 49, 161, 225, 225, 0, 7, 25, 14, 240, 240, + 161, 177, 33, 82, 65, 17, 65, 33, 49, 81, 65, 113, + 97, 81, 129, 49, 161, 225, 225, 0, 7, 24, 14, 240, + 146, 177, 33, 161, 33, 98, 50, 97, 33, 145, 65, 113, + 97, 81, 129, 49, 161, 225, 225, 0, 7, 31, 13, 240, + 65, 193, 193, 109, 97, 193, 145, 33, 33, 97, 33, 49, + 81, 33, 65, 49, 49, 65, 49, 49, 81, 17, 65, 82, + 81, 178, 240, 64, 36, 14, 240, 81, 81, 113, 49, 33, + 97, 65, 29, 129, 209, 161, 33, 33, 113, 33, 49, 97, + 33, 65, 65, 49, 65, 65, 49, 81, 33, 65, 81, 17, + 81, 194, 240, 96, 36, 14, 240, 81, 66, 113, 49, 33, + 97, 49, 46, 113, 209, 161, 33, 33, 113, 33, 49, 97, + 33, 65, 65, 49, 65, 65, 49, 81, 33, 65, 81, 17, + 81, 194, 240, 96, 19, 13, 240, 240, 157, 177, 193, 177, + 177, 82, 65, 130, 17, 177, 209, 209, 193, 240, 240, 16, + 9, 178, 146, 146, 145, 178, 146, 145, 145, 17, 146, 146, + 146, 145, 145, 24, 12, 240, 33, 177, 177, 177, 177, 161, + 177, 49, 113, 65, 81, 81, 81, 97, 49, 38, 21, 97, + 177, 177, 192, 24, 11, 240, 81, 161, 161, 161, 50, 65, + 98, 33, 129, 17, 145, 162, 129, 33, 97, 65, 65, 130, + 114, 240, 80, 17, 13, 240, 217, 113, 193, 193, 193, 125, + 81, 193, 193, 193, 209, 213, 240, 192, 21, 10, 0, 6, + 81, 145, 161, 35, 67, 33, 35, 49, 18, 33, 33, 113, + 145, 161, 145, 145, 48, 27, 13, 240, 17, 193, 209, 83, + 65, 35, 33, 52, 65, 19, 17, 81, 113, 49, 129, 33, + 161, 193, 193, 209, 193, 193, 240, 48, 12, 11, 0, 11, + 38, 161, 161, 161, 161, 59, 240, 112, 16, 14, 0, 7, + 40, 209, 209, 209, 209, 209, 209, 209, 78, 240, 240, 192, + 12, 7, 240, 240, 199, 97, 97, 104, 97, 97, 104, 112, + 15, 10, 240, 90, 145, 145, 145, 155, 145, 145, 145, 145, + 155, 145, 160, 17, 12, 240, 170, 240, 240, 124, 177, 177, + 161, 177, 161, 146, 130, 115, 240, 64, 18, 8, 129, 98, + 98, 98, 98, 98, 98, 98, 97, 113, 97, 113, 97, 97, + 82, 192, 37, 14, 240, 97, 209, 145, 49, 145, 49, 145, + 49, 145, 49, 81, 49, 49, 81, 49, 49, 65, 65, 49, + 65, 65, 49, 49, 65, 65, 33, 81, 65, 17, 81, 82, + 81, 240, 192, 21, 9, 145, 129, 129, 129, 129, 129, 129, + 129, 114, 114, 97, 17, 81, 33, 65, 49, 34, 67, 240, + 16, 11, 240, 240, 60, 146, 146, 146, 146, 146, 146, 146, + 157, 145, 240, 112, 14, 9, 0, 6, 106, 114, 114, 113, + 113, 129, 113, 113, 98, 208, 18, 11, 240, 240, 60, 146, + 146, 146, 145, 161, 145, 161, 145, 145, 130, 114, 240, 32, + 24, 14, 240, 113, 209, 209, 108, 65, 65, 129, 65, 129, + 65, 129, 65, 129, 65, 94, 129, 209, 209, 209, 240, 64, + 18, 13, 240, 240, 186, 177, 177, 145, 17, 161, 193, 193, + 193, 193, 109, 240, 240, 144, 17, 10, 240, 90, 145, 145, + 145, 25, 129, 145, 129, 129, 129, 114, 83, 240, 192, 19, + 12, 240, 240, 98, 193, 193, 113, 177, 161, 177, 161, 161, + 161, 146, 130, 115, 240, 96, 27, 13, 81, 193, 81, 97, + 49, 33, 81, 65, 28, 33, 145, 33, 145, 33, 145, 33, + 145, 177, 193, 177, 177, 162, 146, 240, 96, 23, 9, 240, + 240, 161, 129, 129, 73, 65, 49, 65, 49, 65, 49, 49, + 65, 49, 65, 33, 81, 17, 66, 160, 20, 11, 0, 5, + 113, 161, 161, 153, 33, 65, 65, 81, 49, 81, 161, 145, + 145, 130, 240, 48, 24, 14, 240, 177, 210, 177, 42, 17, + 33, 129, 65, 129, 65, 114, 65, 114, 193, 194, 178, 163, + 133, 161, 240, 160, 26, 13, 240, 240, 49, 33, 17, 113, + 34, 129, 106, 81, 49, 129, 49, 129, 49, 129, 49, 93, + 113, 193, 193, 193, 240, 48, 20, 14, 240, 177, 178, 17, + 177, 59, 193, 194, 145, 18, 163, 177, 209, 209, 125, 240, + 240, 208, 20, 14, 240, 178, 177, 27, 33, 162, 193, 209, + 89, 194, 193, 194, 178, 163, 147, 177, 240, 160, 4, 2, + 228, 224, 8, 13, 0, 9, 97, 220, 0, 13, 13, 8, + 240, 240, 162, 130, 129, 129, 129, 129, 240, 240, 160, 17, + 8, 240, 113, 81, 33, 81, 19, 49, 66, 129, 129, 129, + 129, 240, 240, 160, +}; + +tFont *g_psFontWSazanamigothic8x15 = (tFont *)g_pui8Sazanamigothic8x15; diff --git a/third_party/fonts/other/fonts/fontsazanamigothic9x17.c b/third_party/fonts/other/fonts/fontsazanamigothic9x17.c new file mode 100644 index 0000000..c56d5bc --- /dev/null +++ b/third_party/fonts/other/fonts/fontsazanamigothic9x17.c @@ -0,0 +1,985 @@ +//***************************************************************************** +// +// fontsazanamigothic9x17.c - Font definition for the 9x17 Sazanamigothic font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from Sazanami +// +// Copyright (c) 1990-2003 +// Wada Laboratory, the University of Tokyo. All rights reserved. +// Copyright (c) 2003-2004 +// Electronic Font Open Laboratory (/efont/). All rights reserved +// +// For license, please see README. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 286 in 2 blocks +// Style: sazanamigothic +// Size: 9x17 +// Bold: no +// Italic: no +// Memory usage: 8297 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Sazanamigothic9x17[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 16, + + // + // The height of the font. + // + 18, + + // + // The baseline of the font. + // + 15, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3041 - 0x30ff + // + 0x41, 0x30, 0x00, 0x00, + 0xbf, 0x00, 0x00, 0x00, + 0xd0, 0x09, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x90, 0x01, 0x00, 0x00, // Offset 400 (0x190) + 0x9b, 0x01, 0x00, 0x00, // Offset 411 (0x19b) + 0xbb, 0x01, 0x00, 0x00, // Offset 443 (0x1bb) + 0xda, 0x01, 0x00, 0x00, // Offset 474 (0x1da) + 0xfd, 0x01, 0x00, 0x00, // Offset 509 (0x1fd) + 0x1d, 0x02, 0x00, 0x00, // Offset 541 (0x21d) + 0x26, 0x02, 0x00, 0x00, // Offset 550 (0x226) + 0x3a, 0x02, 0x00, 0x00, // Offset 570 (0x23a) + 0x4e, 0x02, 0x00, 0x00, // Offset 590 (0x24e) + 0x66, 0x02, 0x00, 0x00, // Offset 614 (0x266) + 0x77, 0x02, 0x00, 0x00, // Offset 631 (0x277) + 0x80, 0x02, 0x00, 0x00, // Offset 640 (0x280) + 0x88, 0x02, 0x00, 0x00, // Offset 648 (0x288) + 0x8f, 0x02, 0x00, 0x00, // Offset 655 (0x28f) + 0xa4, 0x02, 0x00, 0x00, // Offset 676 (0x2a4) + 0xc1, 0x02, 0x00, 0x00, // Offset 705 (0x2c1) + 0xd1, 0x02, 0x00, 0x00, // Offset 721 (0x2d1) + 0xe6, 0x02, 0x00, 0x00, // Offset 742 (0x2e6) + 0xfe, 0x02, 0x00, 0x00, // Offset 766 (0x2fe) + 0x16, 0x03, 0x00, 0x00, // Offset 790 (0x316) + 0x2c, 0x03, 0x00, 0x00, // Offset 812 (0x32c) + 0x47, 0x03, 0x00, 0x00, // Offset 839 (0x347) + 0x59, 0x03, 0x00, 0x00, // Offset 857 (0x359) + 0x75, 0x03, 0x00, 0x00, // Offset 885 (0x375) + 0x90, 0x03, 0x00, 0x00, // Offset 912 (0x390) + 0x98, 0x03, 0x00, 0x00, // Offset 920 (0x398) + 0xa2, 0x03, 0x00, 0x00, // Offset 930 (0x3a2) + 0xb4, 0x03, 0x00, 0x00, // Offset 948 (0x3b4) + 0xbe, 0x03, 0x00, 0x00, // Offset 958 (0x3be) + 0xd0, 0x03, 0x00, 0x00, // Offset 976 (0x3d0) + 0xe5, 0x03, 0x00, 0x00, // Offset 997 (0x3e5) + 0x11, 0x04, 0x00, 0x00, // Offset 1041 (0x411) + 0x2d, 0x04, 0x00, 0x00, // Offset 1069 (0x42d) + 0x49, 0x04, 0x00, 0x00, // Offset 1097 (0x449) + 0x61, 0x04, 0x00, 0x00, // Offset 1121 (0x461) + 0x7e, 0x04, 0x00, 0x00, // Offset 1150 (0x47e) + 0x90, 0x04, 0x00, 0x00, // Offset 1168 (0x490) + 0xa3, 0x04, 0x00, 0x00, // Offset 1187 (0x4a3) + 0xbf, 0x04, 0x00, 0x00, // Offset 1215 (0x4bf) + 0xdd, 0x04, 0x00, 0x00, // Offset 1245 (0x4dd) + 0xed, 0x04, 0x00, 0x00, // Offset 1261 (0x4ed) + 0x03, 0x05, 0x00, 0x00, // Offset 1283 (0x503) + 0x22, 0x05, 0x00, 0x00, // Offset 1314 (0x522) + 0x34, 0x05, 0x00, 0x00, // Offset 1332 (0x534) + 0x5f, 0x05, 0x00, 0x00, // Offset 1375 (0x55f) + 0x84, 0x05, 0x00, 0x00, // Offset 1412 (0x584) + 0xa1, 0x05, 0x00, 0x00, // Offset 1441 (0x5a1) + 0xb9, 0x05, 0x00, 0x00, // Offset 1465 (0x5b9) + 0xda, 0x05, 0x00, 0x00, // Offset 1498 (0x5da) + 0xf7, 0x05, 0x00, 0x00, // Offset 1527 (0x5f7) + 0x0e, 0x06, 0x00, 0x00, // Offset 1550 (0x60e) + 0x20, 0x06, 0x00, 0x00, // Offset 1568 (0x620) + 0x3e, 0x06, 0x00, 0x00, // Offset 1598 (0x63e) + 0x5a, 0x06, 0x00, 0x00, // Offset 1626 (0x65a) + 0x86, 0x06, 0x00, 0x00, // Offset 1670 (0x686) + 0xa4, 0x06, 0x00, 0x00, // Offset 1700 (0x6a4) + 0xbd, 0x06, 0x00, 0x00, // Offset 1725 (0x6bd) + 0xcf, 0x06, 0x00, 0x00, // Offset 1743 (0x6cf) + 0xe2, 0x06, 0x00, 0x00, // Offset 1762 (0x6e2) + 0xf5, 0x06, 0x00, 0x00, // Offset 1781 (0x6f5) + 0x08, 0x07, 0x00, 0x00, // Offset 1800 (0x708) + 0x12, 0x07, 0x00, 0x00, // Offset 1810 (0x712) + 0x18, 0x07, 0x00, 0x00, // Offset 1816 (0x718) + 0x21, 0x07, 0x00, 0x00, // Offset 1825 (0x721) + 0x36, 0x07, 0x00, 0x00, // Offset 1846 (0x736) + 0x51, 0x07, 0x00, 0x00, // Offset 1873 (0x751) + 0x64, 0x07, 0x00, 0x00, // Offset 1892 (0x764) + 0x7f, 0x07, 0x00, 0x00, // Offset 1919 (0x77f) + 0x92, 0x07, 0x00, 0x00, // Offset 1938 (0x792) + 0xa5, 0x07, 0x00, 0x00, // Offset 1957 (0x7a5) + 0xc0, 0x07, 0x00, 0x00, // Offset 1984 (0x7c0) + 0xda, 0x07, 0x00, 0x00, // Offset 2010 (0x7da) + 0xe8, 0x07, 0x00, 0x00, // Offset 2024 (0x7e8) + 0xfb, 0x07, 0x00, 0x00, // Offset 2043 (0x7fb) + 0x16, 0x08, 0x00, 0x00, // Offset 2070 (0x816) + 0x26, 0x08, 0x00, 0x00, // Offset 2086 (0x826) + 0x47, 0x08, 0x00, 0x00, // Offset 2119 (0x847) + 0x5f, 0x08, 0x00, 0x00, // Offset 2143 (0x85f) + 0x75, 0x08, 0x00, 0x00, // Offset 2165 (0x875) + 0x8f, 0x08, 0x00, 0x00, // Offset 2191 (0x88f) + 0xa8, 0x08, 0x00, 0x00, // Offset 2216 (0x8a8) + 0xb8, 0x08, 0x00, 0x00, // Offset 2232 (0x8b8) + 0xca, 0x08, 0x00, 0x00, // Offset 2250 (0x8ca) + 0xdb, 0x08, 0x00, 0x00, // Offset 2267 (0x8db) + 0xf3, 0x08, 0x00, 0x00, // Offset 2291 (0x8f3) + 0x09, 0x09, 0x00, 0x00, // Offset 2313 (0x909) + 0x2b, 0x09, 0x00, 0x00, // Offset 2347 (0x92b) + 0x42, 0x09, 0x00, 0x00, // Offset 2370 (0x942) + 0x58, 0x09, 0x00, 0x00, // Offset 2392 (0x958) + 0x67, 0x09, 0x00, 0x00, // Offset 2407 (0x967) + 0x7b, 0x09, 0x00, 0x00, // Offset 2427 (0x97b) + 0x8f, 0x09, 0x00, 0x00, // Offset 2447 (0x98f) + 0xa3, 0x09, 0x00, 0x00, // Offset 2467 (0x9a3) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 11, 0, 24, 96, 15, 3, 113, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 114, 18, 112, 11, 7, 130, 18, + 33, 33, 33, 33, 0, 12, 80, 32, 10, 209, 33, 97, + 33, 97, 33, 72, 65, 33, 97, 33, 81, 49, 81, 49, + 81, 33, 97, 33, 72, 65, 33, 97, 33, 97, 33, 97, + 33, 240, 144, 31, 8, 177, 113, 99, 65, 17, 17, 33, + 33, 33, 17, 33, 81, 17, 99, 97, 17, 81, 33, 17, + 33, 33, 33, 17, 17, 67, 97, 113, 113, 192, 35, 8, + 225, 34, 49, 17, 33, 17, 33, 33, 17, 33, 33, 17, + 50, 17, 113, 97, 113, 97, 113, 18, 49, 17, 33, 33, + 17, 33, 33, 17, 33, 17, 50, 33, 240, 32, 10, 240, + 115, 97, 49, 81, 49, 81, 49, 81, 33, 114, 129, 129, + 17, 49, 49, 33, 33, 33, 66, 49, 81, 65, 49, 17, + 67, 49, 240, 240, 16, 9, 3, 50, 18, 33, 17, 240, + 240, 176, 20, 6, 65, 65, 65, 81, 65, 81, 81, 65, + 81, 81, 97, 81, 81, 97, 81, 97, 97, 112, 20, 6, + 1, 97, 97, 81, 97, 81, 81, 97, 81, 81, 65, 81, + 81, 65, 81, 65, 65, 176, 24, 8, 240, 240, 81, 65, + 33, 33, 33, 17, 17, 67, 97, 99, 65, 17, 17, 33, + 33, 33, 65, 240, 240, 224, 17, 8, 240, 193, 113, 113, + 113, 113, 71, 65, 113, 113, 113, 113, 240, 240, 96, 9, + 3, 240, 240, 146, 18, 33, 17, 80, 8, 8, 0, 8, + 7, 0, 9, 16, 7, 3, 240, 240, 146, 18, 160, 21, + 9, 240, 17, 129, 113, 129, 113, 129, 113, 129, 113, 129, + 113, 129, 113, 129, 113, 129, 240, 32, 29, 8, 240, 51, + 65, 49, 49, 49, 33, 81, 17, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 17, 81, 33, 49, 49, 49, 67, 240, + 192, 16, 4, 161, 19, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 208, 21, 8, 240, 51, 65, 49, 33, + 81, 17, 81, 113, 97, 113, 97, 97, 97, 97, 97, 119, + 240, 160, 24, 8, 240, 51, 65, 49, 33, 81, 17, 81, + 97, 82, 129, 129, 113, 17, 81, 17, 81, 33, 49, 67, + 240, 192, 24, 8, 240, 81, 98, 98, 81, 17, 81, 17, + 65, 33, 65, 33, 49, 49, 49, 49, 55, 81, 113, 113, + 240, 192, 22, 8, 240, 23, 17, 113, 113, 113, 113, 19, + 50, 49, 129, 113, 113, 17, 81, 17, 65, 52, 240, 192, + 27, 8, 240, 51, 65, 49, 33, 81, 17, 113, 113, 19, + 50, 49, 33, 81, 17, 81, 17, 81, 17, 81, 33, 49, + 67, 240, 192, 18, 8, 240, 23, 113, 113, 97, 113, 113, + 97, 113, 97, 113, 113, 97, 113, 240, 224, 28, 8, 240, + 51, 65, 49, 33, 81, 17, 81, 17, 81, 33, 49, 67, + 65, 49, 33, 81, 17, 81, 17, 81, 33, 49, 67, 240, + 192, 27, 8, 240, 51, 65, 49, 33, 81, 17, 81, 17, + 81, 17, 81, 33, 50, 51, 17, 113, 113, 17, 81, 33, + 49, 67, 240, 192, 8, 3, 242, 18, 240, 18, 18, 208, + 10, 3, 242, 18, 240, 18, 18, 33, 17, 128, 18, 8, + 240, 241, 97, 97, 97, 97, 97, 97, 129, 129, 129, 129, + 129, 129, 240, 32, 10, 8, 0, 6, 7, 240, 167, 0, + 7, 16, 18, 8, 240, 145, 129, 129, 129, 129, 129, 129, + 97, 97, 97, 97, 97, 97, 240, 128, 21, 9, 240, 84, + 65, 65, 33, 97, 17, 97, 113, 113, 113, 129, 129, 129, + 240, 162, 114, 240, 112, 44, 9, 195, 81, 49, 49, 65, + 49, 49, 17, 17, 35, 17, 17, 17, 33, 17, 17, 17, + 33, 17, 17, 17, 33, 17, 17, 17, 33, 17, 17, 17, + 33, 17, 17, 34, 18, 33, 129, 81, 49, 49, 83, 240, + 96, 28, 8, 240, 65, 113, 97, 17, 81, 17, 81, 17, + 65, 49, 49, 49, 49, 49, 53, 33, 81, 17, 81, 17, + 81, 17, 81, 240, 160, 28, 8, 240, 21, 49, 65, 33, + 81, 17, 81, 17, 81, 17, 65, 37, 49, 65, 33, 81, + 17, 81, 17, 81, 17, 65, 37, 240, 192, 24, 8, 240, + 51, 65, 49, 49, 65, 17, 81, 17, 113, 113, 113, 113, + 113, 81, 33, 65, 33, 49, 67, 240, 192, 29, 8, 240, + 20, 65, 49, 49, 65, 33, 65, 33, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 65, 33, 65, 33, 49, 52, + 240, 208, 18, 8, 240, 23, 17, 113, 113, 113, 113, 118, + 33, 113, 113, 113, 113, 119, 240, 160, 19, 8, 240, 23, + 17, 113, 113, 113, 113, 118, 33, 113, 113, 113, 113, 113, + 240, 240, 16, 28, 8, 240, 51, 65, 49, 49, 65, 17, + 81, 17, 113, 113, 51, 17, 81, 17, 81, 17, 81, 33, + 65, 33, 50, 51, 17, 240, 160, 30, 8, 240, 17, 81, + 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 23, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 240, + 160, 16, 4, 131, 33, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 35, 208, 22, 7, 240, 65, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 17, 65, 17, 65, 33, 33, + 66, 240, 32, 31, 8, 240, 17, 81, 17, 65, 33, 49, + 49, 33, 65, 33, 65, 17, 82, 17, 65, 49, 49, 49, + 49, 65, 33, 65, 33, 81, 17, 81, 240, 160, 18, 8, + 240, 17, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 119, 240, 160, 43, 8, 240, 17, 81, 17, 81, 18, + 50, 18, 50, 18, 50, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 33, 33, + 17, 33, 33, 17, 33, 33, 17, 33, 33, 240, 160, 37, + 8, 240, 17, 81, 18, 65, 18, 65, 17, 17, 49, 17, + 17, 49, 17, 33, 33, 17, 33, 33, 17, 49, 17, 17, + 49, 17, 17, 66, 17, 66, 17, 81, 17, 81, 240, 160, + 29, 8, 240, 51, 65, 49, 33, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, + 33, 49, 67, 240, 192, 24, 8, 240, 21, 49, 65, 33, + 81, 17, 81, 17, 81, 17, 65, 37, 49, 113, 113, 113, + 113, 113, 240, 240, 16, 33, 8, 240, 51, 65, 49, 33, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 33, 33, 17, 49, 17, 33, 34, 66, 17, 129, + 240, 32, 29, 8, 240, 21, 49, 65, 33, 81, 17, 81, + 17, 81, 17, 65, 37, 49, 49, 49, 49, 49, 65, 33, + 65, 33, 81, 17, 81, 240, 160, 23, 8, 240, 51, 65, + 49, 33, 81, 17, 113, 130, 130, 129, 129, 17, 81, 17, + 81, 33, 49, 67, 240, 192, 18, 8, 240, 23, 65, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 240, 208, + 30, 8, 240, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 33, 49, 67, 240, 192, 28, 8, 240, 17, 81, 17, + 81, 17, 81, 33, 49, 49, 49, 49, 49, 49, 49, 65, + 17, 81, 17, 81, 17, 97, 113, 113, 240, 208, 44, 8, + 240, 17, 33, 33, 17, 33, 33, 17, 33, 33, 17, 33, + 33, 17, 33, 33, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 33, 49, 49, 49, + 49, 49, 49, 49, 240, 176, 30, 8, 240, 17, 81, 17, + 81, 33, 49, 49, 49, 65, 17, 81, 17, 97, 97, 17, + 81, 17, 65, 49, 49, 49, 33, 81, 17, 81, 240, 160, + 25, 8, 240, 17, 81, 17, 81, 17, 81, 33, 49, 49, + 49, 65, 17, 81, 17, 97, 113, 113, 113, 113, 113, 240, + 208, 18, 8, 240, 23, 97, 113, 97, 113, 97, 113, 97, + 113, 97, 113, 97, 119, 240, 160, 19, 5, 84, 17, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 68, 96, 19, 9, 145, 129, 145, 129, 145, 129, 145, 129, + 145, 129, 145, 129, 145, 129, 145, 129, 160, 19, 5, 84, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 20, 96, 10, 6, 33, 65, 17, 33, 49, 0, + 11, 48, 6, 10, 0, 20, 9, 176, 9, 3, 50, 18, + 17, 49, 240, 240, 160, 21, 8, 0, 6, 36, 49, 65, + 113, 68, 34, 49, 17, 81, 17, 81, 17, 66, 36, 17, + 240, 160, 27, 8, 240, 17, 113, 113, 113, 113, 19, 50, + 49, 33, 81, 17, 81, 17, 81, 17, 81, 17, 81, 18, + 49, 33, 19, 240, 192, 19, 8, 0, 6, 35, 65, 49, + 33, 81, 17, 113, 113, 113, 81, 33, 49, 67, 240, 192, + 27, 8, 240, 113, 113, 113, 113, 51, 17, 33, 50, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 33, 50, 51, + 17, 240, 160, 19, 8, 0, 6, 35, 65, 49, 33, 81, + 23, 17, 113, 113, 81, 33, 49, 67, 240, 192, 19, 8, + 240, 67, 65, 49, 49, 113, 86, 65, 113, 113, 113, 113, + 113, 113, 113, 240, 224, 27, 9, 0, 6, 65, 52, 17, + 33, 65, 49, 65, 49, 65, 49, 65, 68, 81, 113, 20, + 33, 97, 17, 97, 17, 97, 38, 32, 26, 7, 225, 97, + 97, 97, 97, 19, 34, 49, 17, 65, 17, 65, 17, 65, + 17, 65, 17, 65, 17, 65, 17, 65, 240, 112, 14, 3, + 98, 18, 129, 33, 33, 33, 33, 33, 33, 33, 33, 160, + 19, 6, 242, 66, 240, 33, 81, 81, 81, 81, 81, 81, + 81, 17, 49, 17, 49, 35, 128, 27, 8, 240, 17, 113, + 113, 113, 113, 65, 33, 49, 49, 49, 49, 33, 65, 18, + 66, 33, 49, 49, 49, 65, 33, 81, 240, 160, 16, 3, + 98, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 160, 33, 8, 0, 6, 1, 17, 18, 34, 17, 33, + 17, 33, 33, 17, 33, 33, 17, 33, 33, 17, 33, 33, + 17, 33, 33, 17, 33, 33, 17, 33, 33, 240, 160, 24, + 8, 0, 6, 1, 20, 34, 65, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 240, 160, 22, + 8, 0, 6, 35, 65, 49, 33, 81, 17, 81, 17, 81, + 17, 81, 17, 81, 33, 49, 67, 240, 192, 26, 8, 0, + 6, 1, 19, 50, 49, 33, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 18, 49, 33, 19, 49, 113, 113, 112, 25, + 8, 0, 6, 35, 17, 33, 50, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 33, 50, 51, 17, 113, 113, 113, + 16, 6, 240, 240, 97, 19, 18, 65, 81, 81, 81, 81, + 81, 81, 240, 128, 18, 8, 0, 6, 21, 33, 81, 17, + 130, 131, 129, 17, 81, 17, 81, 37, 240, 176, 17, 6, + 225, 81, 81, 81, 53, 49, 81, 81, 81, 81, 81, 81, + 98, 240, 64, 24, 7, 240, 240, 193, 65, 17, 65, 17, + 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, 50, 35, + 17, 240, 112, 22, 8, 0, 6, 1, 81, 17, 81, 33, + 49, 49, 49, 49, 49, 65, 17, 81, 17, 97, 113, 240, + 208, 34, 8, 0, 6, 1, 33, 33, 17, 33, 33, 17, + 33, 33, 17, 33, 33, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 33, 49, 49, 49, 240, 176, 23, + 8, 0, 6, 1, 81, 33, 49, 49, 49, 65, 17, 97, + 97, 17, 65, 49, 49, 49, 33, 81, 240, 160, 22, 8, + 0, 6, 1, 81, 17, 81, 33, 49, 49, 49, 65, 17, + 81, 17, 97, 113, 97, 113, 82, 224, 15, 8, 0, 6, + 7, 97, 97, 113, 97, 97, 113, 97, 103, 240, 160, 20, + 6, 65, 65, 65, 81, 81, 81, 81, 81, 50, 97, 81, + 81, 81, 81, 81, 97, 97, 112, 20, 2, 1, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 20, 6, 1, 97, 97, 81, 81, 81, 81, + 81, 98, 49, 81, 81, 81, 81, 81, 65, 65, 176, 10, + 8, 146, 81, 33, 33, 82, 0, 14, 32, + 0, 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3041 - 0x30ff + // + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x1a, 0x03, 0x00, 0x00, // Offset 794 (0x31a) + 0x45, 0x03, 0x00, 0x00, // Offset 837 (0x345) + 0x5b, 0x03, 0x00, 0x00, // Offset 859 (0x35b) + 0x7a, 0x03, 0x00, 0x00, // Offset 890 (0x37a) + 0x8b, 0x03, 0x00, 0x00, // Offset 907 (0x38b) + 0x9f, 0x03, 0x00, 0x00, // Offset 927 (0x39f) + 0xb4, 0x03, 0x00, 0x00, // Offset 948 (0x3b4) + 0xd0, 0x03, 0x00, 0x00, // Offset 976 (0x3d0) + 0xee, 0x03, 0x00, 0x00, // Offset 1006 (0x3ee) + 0x13, 0x04, 0x00, 0x00, // Offset 1043 (0x413) + 0x3a, 0x04, 0x00, 0x00, // Offset 1082 (0x43a) + 0x65, 0x04, 0x00, 0x00, // Offset 1125 (0x465) + 0x7d, 0x04, 0x00, 0x00, // Offset 1149 (0x47d) + 0x98, 0x04, 0x00, 0x00, // Offset 1176 (0x498) + 0xac, 0x04, 0x00, 0x00, // Offset 1196 (0x4ac) + 0xc5, 0x04, 0x00, 0x00, // Offset 1221 (0x4c5) + 0xe9, 0x04, 0x00, 0x00, // Offset 1257 (0x4e9) + 0x10, 0x05, 0x00, 0x00, // Offset 1296 (0x510) + 0x1f, 0x05, 0x00, 0x00, // Offset 1311 (0x51f) + 0x32, 0x05, 0x00, 0x00, // Offset 1330 (0x532) + 0x4a, 0x05, 0x00, 0x00, // Offset 1354 (0x54a) + 0x65, 0x05, 0x00, 0x00, // Offset 1381 (0x565) + 0x7c, 0x05, 0x00, 0x00, // Offset 1404 (0x57c) + 0x97, 0x05, 0x00, 0x00, // Offset 1431 (0x597) + 0xaf, 0x05, 0x00, 0x00, // Offset 1455 (0x5af) + 0xce, 0x05, 0x00, 0x00, // Offset 1486 (0x5ce) + 0xf0, 0x05, 0x00, 0x00, // Offset 1520 (0x5f0) + 0x15, 0x06, 0x00, 0x00, // Offset 1557 (0x615) + 0x2b, 0x06, 0x00, 0x00, // Offset 1579 (0x62b) + 0x46, 0x06, 0x00, 0x00, // Offset 1606 (0x646) + 0x60, 0x06, 0x00, 0x00, // Offset 1632 (0x660) + 0x7e, 0x06, 0x00, 0x00, // Offset 1662 (0x67e) + 0x99, 0x06, 0x00, 0x00, // Offset 1689 (0x699) + 0xb8, 0x06, 0x00, 0x00, // Offset 1720 (0x6b8) + 0xc7, 0x06, 0x00, 0x00, // Offset 1735 (0x6c7) + 0xdb, 0x06, 0x00, 0x00, // Offset 1755 (0x6db) + 0xf5, 0x06, 0x00, 0x00, // Offset 1781 (0x6f5) + 0x0b, 0x07, 0x00, 0x00, // Offset 1803 (0x70b) + 0x28, 0x07, 0x00, 0x00, // Offset 1832 (0x728) + 0x3d, 0x07, 0x00, 0x00, // Offset 1853 (0x73d) + 0x56, 0x07, 0x00, 0x00, // Offset 1878 (0x756) + 0x78, 0x07, 0x00, 0x00, // Offset 1912 (0x778) + 0x92, 0x07, 0x00, 0x00, // Offset 1938 (0x792) + 0xc5, 0x07, 0x00, 0x00, // Offset 1989 (0x7c5) + 0xf3, 0x07, 0x00, 0x00, // Offset 2035 (0x7f3) + 0x1c, 0x08, 0x00, 0x00, // Offset 2076 (0x81c) + 0x45, 0x08, 0x00, 0x00, // Offset 2117 (0x845) + 0x71, 0x08, 0x00, 0x00, // Offset 2161 (0x871) + 0x9f, 0x08, 0x00, 0x00, // Offset 2207 (0x89f) + 0xc4, 0x08, 0x00, 0x00, // Offset 2244 (0x8c4) + 0xec, 0x08, 0x00, 0x00, // Offset 2284 (0x8ec) + 0x15, 0x09, 0x00, 0x00, // Offset 2325 (0x915) + 0x38, 0x09, 0x00, 0x00, // Offset 2360 (0x938) + 0x5d, 0x09, 0x00, 0x00, // Offset 2397 (0x95d) + 0x83, 0x09, 0x00, 0x00, // Offset 2435 (0x983) + 0x9b, 0x09, 0x00, 0x00, // Offset 2459 (0x99b) + 0xb7, 0x09, 0x00, 0x00, // Offset 2487 (0x9b7) + 0xd5, 0x09, 0x00, 0x00, // Offset 2517 (0x9d5) + 0xfd, 0x09, 0x00, 0x00, // Offset 2557 (0x9fd) + 0x2a, 0x0a, 0x00, 0x00, // Offset 2602 (0xa2a) + 0x55, 0x0a, 0x00, 0x00, // Offset 2645 (0xa55) + 0x70, 0x0a, 0x00, 0x00, // Offset 2672 (0xa70) + 0x95, 0x0a, 0x00, 0x00, // Offset 2709 (0xa95) + 0xb5, 0x0a, 0x00, 0x00, // Offset 2741 (0xab5) + 0xe4, 0x0a, 0x00, 0x00, // Offset 2788 (0xae4) + 0xff, 0x0a, 0x00, 0x00, // Offset 2815 (0xaff) + 0x19, 0x0b, 0x00, 0x00, // Offset 2841 (0xb19) + 0x3f, 0x0b, 0x00, 0x00, // Offset 2879 (0xb3f) + 0x5f, 0x0b, 0x00, 0x00, // Offset 2911 (0xb5f) + 0x8d, 0x0b, 0x00, 0x00, // Offset 2957 (0xb8d) + 0xa1, 0x0b, 0x00, 0x00, // Offset 2977 (0xba1) + 0xbb, 0x0b, 0x00, 0x00, // Offset 3003 (0xbbb) + 0xd4, 0x0b, 0x00, 0x00, // Offset 3028 (0xbd4) + 0xf3, 0x0b, 0x00, 0x00, // Offset 3059 (0xbf3) + 0x11, 0x0c, 0x00, 0x00, // Offset 3089 (0xc11) + 0x3d, 0x0c, 0x00, 0x00, // Offset 3133 (0xc3d) + 0x55, 0x0c, 0x00, 0x00, // Offset 3157 (0xc55) + 0x72, 0x0c, 0x00, 0x00, // Offset 3186 (0xc72) + 0x9a, 0x0c, 0x00, 0x00, // Offset 3226 (0xc9a) + 0xc3, 0x0c, 0x00, 0x00, // Offset 3267 (0xcc3) + 0xe5, 0x0c, 0x00, 0x00, // Offset 3301 (0xce5) + 0x01, 0x0d, 0x00, 0x00, // Offset 3329 (0xd01) + 0x24, 0x0d, 0x00, 0x00, // Offset 3364 (0xd24) + 0x3d, 0x0d, 0x00, 0x00, // Offset 3389 (0xd3d) + 0x5c, 0x0d, 0x00, 0x00, // Offset 3420 (0xd5c) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x77, 0x0d, 0x00, 0x00, // Offset 3447 (0xd77) + 0x80, 0x0d, 0x00, 0x00, // Offset 3456 (0xd80) + 0x8b, 0x0d, 0x00, 0x00, // Offset 3467 (0xd8b) + 0x9a, 0x0d, 0x00, 0x00, // Offset 3482 (0xd9a) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xae, 0x0d, 0x00, 0x00, // Offset 3502 (0xdae) + 0xbf, 0x0d, 0x00, 0x00, // Offset 3519 (0xdbf) + 0xd6, 0x0d, 0x00, 0x00, // Offset 3542 (0xdd6) + 0xe9, 0x0d, 0x00, 0x00, // Offset 3561 (0xde9) + 0x01, 0x0e, 0x00, 0x00, // Offset 3585 (0xe01) + 0x15, 0x0e, 0x00, 0x00, // Offset 3605 (0xe15) + 0x2e, 0x0e, 0x00, 0x00, // Offset 3630 (0xe2e) + 0x3d, 0x0e, 0x00, 0x00, // Offset 3645 (0xe3d) + 0x4f, 0x0e, 0x00, 0x00, // Offset 3663 (0xe4f) + 0x64, 0x0e, 0x00, 0x00, // Offset 3684 (0xe64) + 0x80, 0x0e, 0x00, 0x00, // Offset 3712 (0xe80) + 0xa0, 0x0e, 0x00, 0x00, // Offset 3744 (0xea0) + 0xc4, 0x0e, 0x00, 0x00, // Offset 3780 (0xec4) + 0xdb, 0x0e, 0x00, 0x00, // Offset 3803 (0xedb) + 0xf8, 0x0e, 0x00, 0x00, // Offset 3832 (0xef8) + 0x11, 0x0f, 0x00, 0x00, // Offset 3857 (0xf11) + 0x2d, 0x0f, 0x00, 0x00, // Offset 3885 (0xf2d) + 0x47, 0x0f, 0x00, 0x00, // Offset 3911 (0xf47) + 0x64, 0x0f, 0x00, 0x00, // Offset 3940 (0xf64) + 0x76, 0x0f, 0x00, 0x00, // Offset 3958 (0xf76) + 0x8b, 0x0f, 0x00, 0x00, // Offset 3979 (0xf8b) + 0xab, 0x0f, 0x00, 0x00, // Offset 4011 (0xfab) + 0xce, 0x0f, 0x00, 0x00, // Offset 4046 (0xfce) + 0xe5, 0x0f, 0x00, 0x00, // Offset 4069 (0xfe5) + 0xff, 0x0f, 0x00, 0x00, // Offset 4095 (0xfff) + 0x18, 0x10, 0x00, 0x00, // Offset 4120 (0x1018) + 0x34, 0x10, 0x00, 0x00, // Offset 4148 (0x1034) + 0x4d, 0x10, 0x00, 0x00, // Offset 4173 (0x104d) + 0x71, 0x10, 0x00, 0x00, // Offset 4209 (0x1071) + 0x89, 0x10, 0x00, 0x00, // Offset 4233 (0x1089) + 0xa2, 0x10, 0x00, 0x00, // Offset 4258 (0x10a2) + 0xc0, 0x10, 0x00, 0x00, // Offset 4288 (0x10c0) + 0xe1, 0x10, 0x00, 0x00, // Offset 4321 (0x10e1) + 0xf7, 0x10, 0x00, 0x00, // Offset 4343 (0x10f7) + 0x10, 0x11, 0x00, 0x00, // Offset 4368 (0x1110) + 0x25, 0x11, 0x00, 0x00, // Offset 4389 (0x1125) + 0x41, 0x11, 0x00, 0x00, // Offset 4417 (0x1141) + 0x5e, 0x11, 0x00, 0x00, // Offset 4446 (0x115e) + 0x71, 0x11, 0x00, 0x00, // Offset 4465 (0x1171) + 0x87, 0x11, 0x00, 0x00, // Offset 4487 (0x1187) + 0x9d, 0x11, 0x00, 0x00, // Offset 4509 (0x119d) + 0xb8, 0x11, 0x00, 0x00, // Offset 4536 (0x11b8) + 0xcd, 0x11, 0x00, 0x00, // Offset 4557 (0x11cd) + 0xd8, 0x11, 0x00, 0x00, // Offset 4568 (0x11d8) + 0xf3, 0x11, 0x00, 0x00, // Offset 4595 (0x11f3) + 0x0f, 0x12, 0x00, 0x00, // Offset 4623 (0x120f) + 0x23, 0x12, 0x00, 0x00, // Offset 4643 (0x1223) + 0x3f, 0x12, 0x00, 0x00, // Offset 4671 (0x123f) + 0x5f, 0x12, 0x00, 0x00, // Offset 4703 (0x125f) + 0x80, 0x12, 0x00, 0x00, // Offset 4736 (0x1280) + 0x95, 0x12, 0x00, 0x00, // Offset 4757 (0x1295) + 0xaf, 0x12, 0x00, 0x00, // Offset 4783 (0x12af) + 0xca, 0x12, 0x00, 0x00, // Offset 4810 (0x12ca) + 0xdd, 0x12, 0x00, 0x00, // Offset 4829 (0x12dd) + 0xf3, 0x12, 0x00, 0x00, // Offset 4851 (0x12f3) + 0x0a, 0x13, 0x00, 0x00, // Offset 4874 (0x130a) + 0x20, 0x13, 0x00, 0x00, // Offset 4896 (0x1320) + 0x3a, 0x13, 0x00, 0x00, // Offset 4922 (0x133a) + 0x56, 0x13, 0x00, 0x00, // Offset 4950 (0x1356) + 0x77, 0x13, 0x00, 0x00, // Offset 4983 (0x1377) + 0x9c, 0x13, 0x00, 0x00, // Offset 5020 (0x139c) + 0xc2, 0x13, 0x00, 0x00, // Offset 5058 (0x13c2) + 0xd7, 0x13, 0x00, 0x00, // Offset 5079 (0x13d7) + 0xe8, 0x13, 0x00, 0x00, // Offset 5096 (0x13e8) + 0x05, 0x14, 0x00, 0x00, // Offset 5125 (0x1405) + 0x1f, 0x14, 0x00, 0x00, // Offset 5151 (0x141f) + 0x35, 0x14, 0x00, 0x00, // Offset 5173 (0x1435) + 0x4a, 0x14, 0x00, 0x00, // Offset 5194 (0x144a) + 0x68, 0x14, 0x00, 0x00, // Offset 5224 (0x1468) + 0x76, 0x14, 0x00, 0x00, // Offset 5238 (0x1476) + 0x88, 0x14, 0x00, 0x00, // Offset 5256 (0x1488) + 0x98, 0x14, 0x00, 0x00, // Offset 5272 (0x1498) + 0xab, 0x14, 0x00, 0x00, // Offset 5291 (0x14ab) + 0xbe, 0x14, 0x00, 0x00, // Offset 5310 (0x14be) + 0xda, 0x14, 0x00, 0x00, // Offset 5338 (0x14da) + 0x03, 0x15, 0x00, 0x00, // Offset 5379 (0x1503) + 0x1e, 0x15, 0x00, 0x00, // Offset 5406 (0x151e) + 0x3a, 0x15, 0x00, 0x00, // Offset 5434 (0x153a) + 0x4c, 0x15, 0x00, 0x00, // Offset 5452 (0x154c) + 0x65, 0x15, 0x00, 0x00, // Offset 5477 (0x1565) + 0x7f, 0x15, 0x00, 0x00, // Offset 5503 (0x157f) + 0x93, 0x15, 0x00, 0x00, // Offset 5523 (0x1593) + 0xa7, 0x15, 0x00, 0x00, // Offset 5543 (0x15a7) + 0xbc, 0x15, 0x00, 0x00, // Offset 5564 (0x15bc) + 0xd9, 0x15, 0x00, 0x00, // Offset 5593 (0x15d9) + 0xf1, 0x15, 0x00, 0x00, // Offset 5617 (0x15f1) + 0x05, 0x16, 0x00, 0x00, // Offset 5637 (0x1605) + 0x21, 0x16, 0x00, 0x00, // Offset 5665 (0x1621) + 0x3c, 0x16, 0x00, 0x00, // Offset 5692 (0x163c) + 0x53, 0x16, 0x00, 0x00, // Offset 5715 (0x1653) + 0x6b, 0x16, 0x00, 0x00, // Offset 5739 (0x166b) + 0x73, 0x16, 0x00, 0x00, // Offset 5747 (0x1673) + 0x7b, 0x16, 0x00, 0x00, // Offset 5755 (0x167b) + 0x89, 0x16, 0x00, 0x00, // Offset 5769 (0x1689) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3041 - 0x30ff + // + 30, 11, 0, 7, 33, 161, 33, 70, 113, 161, 49, 102, + 66, 33, 33, 33, 17, 33, 49, 17, 17, 17, 65, 17, + 34, 65, 34, 81, 130, 224, 43, 15, 240, 65, 225, 170, + 129, 225, 65, 145, 65, 145, 36, 131, 33, 18, 82, 65, + 49, 49, 33, 33, 81, 17, 49, 33, 81, 17, 49, 17, + 97, 17, 66, 97, 17, 50, 97, 51, 17, 66, 178, 240, + 80, 22, 12, 0, 10, 65, 177, 113, 49, 129, 33, 129, + 33, 145, 33, 17, 97, 33, 17, 161, 240, 240, 240, 31, + 15, 240, 240, 241, 225, 145, 65, 161, 49, 177, 33, 177, + 33, 193, 17, 193, 17, 193, 17, 193, 33, 33, 177, 33, + 177, 17, 210, 240, 240, 176, 17, 8, 240, 240, 179, 130, + 195, 50, 49, 129, 113, 97, 113, 97, 82, 240, 80, 20, + 11, 211, 179, 240, 228, 52, 65, 177, 161, 161, 161, 145, + 161, 145, 145, 145, 130, 240, 32, 21, 11, 0, 5, 98, + 178, 240, 215, 129, 145, 162, 129, 17, 113, 33, 97, 49, + 81, 84, 240, 128, 28, 15, 240, 67, 242, 240, 240, 197, + 85, 49, 209, 209, 211, 177, 33, 161, 49, 145, 65, 129, + 81, 113, 97, 97, 133, 240, 240, 16, 30, 13, 0, 8, + 65, 193, 193, 19, 18, 52, 97, 65, 193, 20, 99, 65, + 65, 17, 97, 33, 33, 97, 33, 33, 33, 33, 66, 66, + 240, 240, 37, 15, 240, 65, 225, 225, 97, 117, 49, 37, + 129, 81, 225, 225, 225, 22, 99, 97, 65, 17, 129, 33, + 33, 129, 17, 49, 129, 17, 49, 33, 65, 49, 33, 52, + 82, 240, 176, 39, 15, 240, 65, 225, 225, 209, 97, 117, + 49, 52, 65, 49, 65, 81, 49, 65, 81, 65, 49, 81, + 65, 33, 97, 65, 33, 97, 113, 97, 97, 113, 97, 97, + 113, 65, 17, 209, 240, 128, 43, 16, 240, 81, 129, 97, + 145, 81, 113, 97, 97, 33, 85, 49, 68, 65, 49, 81, + 81, 49, 81, 81, 65, 65, 81, 65, 49, 97, 65, 49, + 97, 129, 97, 113, 113, 113, 97, 129, 65, 17, 225, 240, + 160, 24, 14, 240, 65, 209, 209, 19, 86, 209, 209, 66, + 132, 56, 225, 209, 135, 97, 97, 81, 209, 226, 229, 240, + 64, 27, 15, 193, 113, 65, 33, 97, 81, 129, 19, 102, + 225, 225, 66, 148, 72, 241, 225, 151, 113, 97, 97, 225, + 242, 245, 240, 96, 20, 9, 240, 17, 113, 113, 113, 113, + 113, 113, 113, 145, 145, 145, 145, 145, 145, 145, 129, 160, + 25, 12, 240, 65, 161, 161, 161, 65, 81, 97, 49, 81, + 65, 113, 33, 193, 193, 193, 193, 193, 193, 193, 177, 240, + 16, 36, 15, 240, 161, 65, 145, 65, 145, 65, 148, 17, + 70, 65, 145, 65, 145, 65, 145, 65, 145, 65, 145, 65, + 145, 65, 145, 65, 17, 113, 81, 113, 97, 113, 194, 240, + 96, 39, 16, 209, 193, 49, 17, 145, 17, 49, 145, 33, + 33, 145, 81, 73, 33, 145, 81, 145, 81, 145, 81, 145, + 81, 145, 81, 145, 81, 145, 81, 17, 113, 97, 113, 113, + 113, 210, 240, 128, 15, 13, 240, 240, 179, 213, 0, 10, + 17, 193, 193, 210, 217, 240, 192, 19, 15, 240, 193, 193, + 33, 51, 97, 133, 0, 11, 113, 225, 225, 242, 249, 240, + 240, 48, 24, 13, 240, 49, 193, 209, 193, 20, 24, 209, + 193, 209, 116, 33, 66, 67, 49, 193, 193, 209, 195, 213, + 240, 16, 27, 15, 193, 113, 113, 97, 81, 145, 81, 129, + 20, 56, 241, 225, 241, 148, 33, 98, 67, 81, 225, 225, + 241, 227, 245, 240, 80, 23, 11, 240, 113, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, 129, 17, 113, 49, + 66, 84, 240, 16, 27, 11, 240, 113, 161, 97, 49, 65, + 33, 33, 81, 65, 161, 161, 161, 161, 161, 161, 161, 129, + 17, 113, 49, 66, 84, 240, 16, 24, 16, 240, 145, 241, + 241, 127, 145, 241, 196, 177, 49, 177, 49, 177, 49, 196, + 241, 241, 225, 241, 210, 240, 160, 31, 17, 225, 161, 49, + 33, 145, 65, 177, 143, 161, 240, 17, 212, 193, 49, 193, + 49, 193, 49, 212, 240, 17, 240, 17, 241, 240, 17, 226, + 240, 192, 34, 17, 240, 193, 161, 81, 161, 81, 161, 81, + 161, 56, 24, 33, 161, 81, 161, 81, 161, 81, 161, 35, + 177, 240, 17, 240, 17, 240, 33, 240, 40, 240, 240, 112, + 37, 17, 225, 193, 65, 81, 81, 33, 113, 81, 49, 97, + 81, 161, 56, 24, 33, 161, 81, 161, 81, 161, 81, 161, + 35, 177, 240, 17, 240, 17, 240, 33, 240, 40, 240, 240, + 112, 22, 15, 240, 240, 57, 193, 194, 193, 194, 193, 85, + 26, 193, 209, 225, 209, 225, 241, 226, 244, 240, 48, 27, + 16, 240, 225, 89, 33, 161, 33, 162, 65, 129, 210, 209, + 85, 42, 209, 225, 241, 225, 241, 240, 17, 242, 240, 20, + 240, 80, 26, 15, 240, 65, 225, 225, 169, 161, 225, 209, + 70, 65, 225, 225, 209, 225, 49, 161, 49, 145, 81, 129, + 102, 33, 240, 208, 30, 15, 240, 65, 113, 97, 129, 81, + 97, 57, 49, 97, 225, 209, 70, 65, 225, 225, 209, 225, + 49, 161, 49, 145, 81, 129, 102, 33, 240, 208, 27, 14, + 240, 49, 209, 209, 154, 129, 193, 209, 209, 52, 81, 34, + 65, 65, 17, 113, 65, 129, 209, 209, 193, 178, 117, 240, + 64, 31, 15, 240, 65, 113, 97, 129, 81, 97, 58, 33, + 97, 209, 225, 225, 52, 97, 34, 65, 81, 17, 113, 81, + 129, 225, 225, 209, 194, 133, 240, 96, 15, 12, 0, 12, + 84, 53, 65, 193, 177, 177, 161, 146, 115, 240, 224, 20, + 16, 0, 8, 87, 69, 113, 240, 17, 240, 17, 241, 241, + 225, 225, 210, 149, 0, 8, 96, 26, 17, 240, 240, 17, + 225, 33, 225, 135, 85, 113, 240, 33, 240, 33, 240, 17, + 240, 17, 241, 241, 226, 165, 0, 9, 48, 22, 15, 240, + 240, 134, 24, 34, 193, 209, 209, 225, 209, 225, 225, 225, + 225, 241, 241, 244, 240, 240, 32, 29, 16, 240, 240, 166, + 40, 34, 209, 225, 225, 81, 145, 97, 113, 81, 145, 97, + 129, 241, 241, 240, 17, 240, 17, 240, 20, 240, 240, 80, + 21, 11, 209, 161, 161, 161, 161, 177, 51, 65, 18, 114, + 129, 145, 145, 161, 161, 177, 184, 240, 128, 25, 13, 241, + 193, 113, 65, 129, 49, 97, 81, 113, 81, 51, 97, 18, + 146, 161, 177, 177, 193, 193, 209, 216, 240, 224, 34, 15, + 240, 65, 225, 225, 168, 34, 97, 129, 81, 145, 49, 97, + 113, 97, 97, 113, 97, 113, 81, 129, 81, 84, 161, 51, + 113, 65, 33, 97, 50, 163, 240, 112, 26, 14, 240, 209, + 209, 209, 71, 33, 209, 209, 209, 209, 209, 209, 49, 145, + 49, 145, 65, 129, 17, 55, 33, 209, 240, 176, 51, 16, + 240, 129, 241, 145, 81, 145, 68, 113, 34, 17, 34, 98, + 33, 81, 81, 49, 81, 66, 33, 113, 49, 17, 17, 113, + 33, 33, 17, 113, 33, 34, 129, 33, 49, 52, 17, 33, + 34, 33, 65, 66, 33, 17, 49, 17, 163, 49, 240, 240, + 48, 46, 17, 240, 97, 240, 17, 240, 17, 240, 17, 17, + 36, 70, 18, 65, 115, 97, 114, 129, 82, 145, 82, 145, + 65, 17, 145, 65, 17, 145, 49, 33, 68, 17, 33, 49, + 49, 65, 113, 49, 66, 97, 68, 33, 81, 240, 224, 41, + 15, 0, 6, 37, 130, 33, 34, 81, 65, 65, 49, 81, + 65, 49, 65, 97, 17, 81, 97, 17, 81, 97, 17, 81, + 97, 17, 65, 113, 17, 65, 97, 49, 33, 113, 66, 98, + 178, 240, 240, 80, 41, 15, 240, 17, 129, 81, 129, 81, + 129, 81, 129, 65, 73, 17, 145, 65, 145, 65, 145, 65, + 145, 65, 145, 65, 145, 65, 145, 65, 85, 65, 65, 67, + 33, 17, 33, 65, 33, 33, 68, 240, 80, 44, 16, 209, + 49, 129, 49, 33, 129, 17, 65, 129, 33, 49, 129, 81, + 73, 33, 145, 81, 145, 81, 145, 81, 145, 81, 145, 81, + 145, 81, 145, 81, 85, 81, 65, 67, 49, 17, 33, 65, + 33, 49, 68, 240, 112, 46, 17, 210, 49, 129, 17, 33, + 33, 129, 17, 33, 33, 129, 34, 49, 129, 97, 73, 49, + 145, 97, 145, 97, 145, 97, 145, 97, 145, 97, 145, 97, + 145, 97, 85, 97, 65, 67, 65, 17, 33, 65, 33, 65, + 68, 240, 144, 37, 15, 240, 240, 65, 65, 115, 65, 82, + 17, 97, 113, 97, 97, 114, 81, 113, 17, 65, 113, 33, + 33, 129, 81, 129, 81, 129, 81, 113, 113, 97, 114, 65, + 164, 240, 240, 112, 40, 16, 240, 225, 97, 65, 17, 33, + 51, 65, 33, 50, 17, 97, 129, 97, 113, 114, 97, 113, + 17, 81, 113, 33, 49, 129, 97, 129, 97, 129, 97, 113, + 129, 97, 130, 65, 180, 240, 240, 160, 41, 16, 194, 209, + 33, 81, 65, 17, 33, 51, 65, 34, 34, 17, 97, 129, + 97, 113, 114, 97, 113, 17, 81, 113, 33, 49, 129, 97, + 129, 97, 129, 97, 113, 129, 97, 130, 65, 180, 240, 240, + 160, 35, 16, 240, 240, 99, 240, 19, 240, 240, 209, 241, + 241, 240, 17, 240, 17, 49, 113, 65, 49, 81, 97, 49, + 49, 113, 65, 17, 49, 65, 97, 49, 49, 195, 240, 144, + 37, 16, 240, 240, 99, 97, 147, 17, 33, 209, 240, 145, + 241, 241, 240, 17, 240, 17, 49, 113, 65, 49, 81, 97, + 49, 49, 113, 65, 17, 49, 65, 97, 49, 49, 195, 240, + 144, 38, 16, 240, 210, 99, 65, 33, 131, 17, 33, 210, + 240, 129, 241, 241, 240, 17, 240, 17, 49, 113, 65, 49, + 81, 97, 49, 49, 113, 65, 17, 49, 65, 97, 49, 49, + 195, 240, 144, 24, 16, 0, 8, 82, 209, 33, 177, 65, + 145, 97, 113, 129, 81, 161, 240, 17, 240, 17, 240, 17, + 0, 10, 16, 28, 16, 240, 209, 240, 17, 193, 162, 65, + 129, 33, 177, 65, 145, 97, 113, 129, 81, 161, 240, 17, + 240, 17, 240, 17, 0, 10, 16, 30, 16, 0, 7, 50, + 130, 49, 33, 97, 33, 33, 33, 81, 65, 34, 81, 97, + 113, 129, 81, 161, 240, 17, 240, 17, 240, 17, 0, 10, + 16, 40, 16, 240, 240, 49, 57, 49, 113, 113, 129, 97, + 129, 81, 74, 17, 145, 81, 145, 81, 145, 81, 145, 81, + 145, 81, 145, 81, 85, 81, 65, 67, 49, 17, 33, 65, + 34, 33, 68, 240, 112, 45, 17, 240, 240, 17, 49, 56, + 33, 33, 113, 49, 17, 33, 129, 33, 65, 129, 97, 74, + 33, 145, 97, 145, 97, 145, 97, 145, 97, 145, 97, 145, + 97, 85, 97, 65, 67, 65, 17, 33, 65, 34, 49, 68, + 240, 144, 43, 17, 210, 225, 33, 33, 56, 33, 33, 113, + 50, 49, 129, 113, 129, 97, 74, 33, 145, 97, 145, 97, + 145, 97, 145, 97, 145, 97, 145, 97, 85, 97, 65, 67, + 65, 17, 33, 65, 34, 49, 68, 240, 144, 27, 13, 240, + 65, 193, 193, 108, 113, 193, 114, 49, 152, 129, 193, 193, + 133, 113, 67, 65, 81, 34, 33, 81, 65, 37, 240, 80, + 37, 17, 0, 6, 87, 240, 17, 240, 17, 241, 81, 161, + 81, 145, 97, 119, 17, 98, 33, 67, 65, 49, 97, 17, + 33, 65, 81, 49, 17, 49, 97, 99, 97, 241, 241, 240, + 160, 32, 15, 240, 65, 225, 225, 169, 161, 97, 113, 113, + 97, 129, 36, 161, 49, 161, 49, 161, 33, 113, 67, 129, + 81, 129, 81, 129, 97, 97, 134, 240, 64, 47, 15, 240, + 129, 225, 113, 97, 113, 68, 113, 18, 17, 34, 82, 49, + 65, 49, 17, 49, 65, 49, 17, 33, 97, 17, 49, 17, + 97, 17, 50, 113, 17, 65, 113, 17, 49, 17, 81, 49, + 17, 129, 65, 129, 179, 240, 240, 64, 27, 13, 240, 33, + 193, 193, 193, 136, 129, 193, 193, 152, 113, 129, 49, 129, + 49, 129, 49, 113, 81, 97, 82, 50, 131, 240, 48, 26, + 13, 0, 8, 113, 129, 49, 129, 65, 129, 52, 84, 65, + 19, 17, 97, 81, 81, 113, 19, 129, 193, 209, 193, 240, + 64, 38, 17, 240, 240, 113, 81, 161, 81, 177, 68, 129, + 35, 50, 114, 129, 52, 145, 18, 49, 145, 113, 34, 49, + 129, 67, 145, 240, 33, 240, 17, 240, 33, 240, 17, 240, + 17, 240, 160, 32, 11, 0, 7, 65, 161, 81, 65, 81, + 37, 49, 17, 33, 33, 34, 49, 49, 18, 49, 49, 17, + 65, 49, 17, 33, 17, 33, 100, 113, 145, 240, 48, 46, + 16, 240, 129, 240, 17, 129, 97, 129, 85, 65, 66, 17, + 50, 33, 49, 49, 65, 33, 33, 65, 81, 17, 17, 81, + 81, 17, 17, 81, 81, 33, 49, 33, 65, 49, 65, 17, + 34, 65, 84, 193, 241, 225, 225, 240, 176, 20, 10, 0, + 6, 97, 145, 145, 149, 81, 145, 145, 100, 81, 51, 49, + 49, 34, 35, 240, 176, 26, 13, 240, 65, 193, 193, 193, + 198, 113, 193, 193, 193, 193, 193, 133, 113, 67, 65, 81, + 34, 33, 65, 81, 36, 240, 96, 25, 12, 226, 195, 240, + 241, 177, 177, 161, 67, 65, 34, 50, 33, 17, 97, 34, + 129, 177, 177, 161, 162, 85, 240, 16, 31, 10, 240, 33, + 33, 113, 17, 113, 17, 113, 17, 113, 17, 113, 17, 113, + 17, 113, 17, 17, 81, 33, 97, 129, 145, 129, 129, 129, + 129, 240, 16, 30, 13, 240, 240, 36, 84, 33, 177, 177, + 177, 177, 177, 20, 99, 66, 49, 145, 17, 161, 193, 83, + 65, 65, 49, 33, 81, 66, 117, 240, 32, 44, 17, 240, + 97, 240, 17, 240, 17, 240, 19, 50, 100, 17, 18, 33, + 130, 17, 65, 129, 17, 81, 130, 97, 114, 113, 99, 113, + 81, 33, 113, 65, 49, 113, 129, 113, 33, 81, 113, 17, + 97, 129, 113, 240, 224, 24, 13, 240, 200, 177, 177, 177, + 177, 177, 20, 99, 66, 50, 113, 33, 161, 193, 193, 177, + 162, 101, 240, 240, 16, 29, 13, 0, 8, 65, 193, 179, + 130, 17, 21, 83, 81, 66, 113, 33, 17, 113, 33, 17, + 113, 17, 33, 97, 81, 51, 97, 240, 240, 80, 40, 17, + 240, 113, 240, 17, 240, 17, 240, 19, 165, 17, 226, 21, + 145, 17, 82, 99, 113, 83, 145, 65, 17, 145, 49, 33, + 145, 33, 49, 129, 33, 65, 129, 113, 98, 129, 51, 161, + 240, 208, 41, 15, 240, 240, 83, 147, 33, 225, 225, 198, + 114, 17, 66, 65, 49, 81, 49, 49, 113, 17, 65, 113, + 17, 49, 129, 17, 49, 50, 49, 17, 33, 49, 33, 17, + 50, 65, 50, 163, 240, 240, 64, 34, 16, 240, 240, 86, + 209, 225, 230, 146, 81, 113, 113, 162, 49, 145, 33, 17, + 165, 193, 226, 68, 66, 33, 18, 65, 33, 66, 97, 17, + 81, 82, 240, 240, 64, 28, 15, 240, 81, 225, 225, 154, + 145, 225, 209, 19, 147, 49, 35, 34, 83, 65, 98, 178, + 17, 161, 49, 145, 225, 241, 247, 240, 48, 35, 16, 240, + 240, 129, 241, 225, 241, 225, 241, 241, 225, 19, 178, 49, + 81, 50, 65, 81, 49, 81, 65, 49, 97, 65, 49, 97, + 49, 49, 113, 33, 65, 130, 240, 96, 25, 16, 240, 240, + 71, 50, 116, 66, 178, 33, 194, 72, 115, 82, 242, 226, + 226, 226, 210, 211, 180, 164, 209, 240, 192, 31, 12, 0, + 7, 114, 161, 177, 65, 54, 33, 49, 18, 33, 33, 65, + 49, 34, 49, 49, 49, 34, 49, 49, 33, 65, 82, 49, + 97, 50, 240, 240, 27, 11, 0, 7, 97, 49, 97, 49, + 97, 17, 17, 39, 17, 97, 49, 97, 49, 97, 49, 97, + 51, 65, 65, 65, 130, 240, 192, 9, 6, 130, 97, 18, + 97, 0, 10, 16, 11, 5, 98, 33, 33, 17, 33, 34, + 0, 8, 48, 15, 7, 240, 240, 193, 113, 113, 113, 113, + 113, 97, 82, 35, 240, 144, 20, 9, 0, 6, 49, 33, + 49, 33, 33, 49, 81, 145, 145, 145, 129, 114, 67, 240, + 240, 32, 17, 11, 0, 9, 90, 145, 97, 33, 113, 17, + 129, 161, 145, 161, 145, 240, 240, 23, 15, 240, 240, 254, + 225, 209, 145, 49, 161, 33, 177, 17, 193, 209, 225, 225, + 209, 225, 209, 209, 240, 176, 19, 10, 0, 7, 33, 129, + 129, 129, 130, 98, 17, 66, 49, 145, 145, 145, 145, 240, + 144, 24, 13, 240, 145, 193, 177, 177, 177, 177, 178, 146, + 17, 114, 49, 82, 81, 193, 193, 193, 193, 193, 193, 240, + 48, 20, 10, 0, 6, 97, 145, 89, 17, 113, 17, 113, + 17, 113, 129, 145, 129, 114, 98, 240, 176, 25, 13, 240, + 65, 193, 193, 193, 108, 17, 161, 17, 161, 17, 161, 17, + 161, 193, 177, 193, 177, 177, 162, 131, 240, 80, 15, 12, + 0, 10, 103, 129, 177, 177, 177, 177, 177, 107, 240, 240, + 112, 18, 16, 0, 8, 43, 161, 241, 241, 241, 241, 241, + 241, 241, 241, 143, 0, 6, 16, 21, 12, 0, 8, 33, + 177, 177, 91, 98, 162, 145, 17, 129, 33, 113, 49, 82, + 65, 147, 240, 224, 28, 16, 240, 161, 241, 241, 241, 111, + 146, 226, 209, 17, 209, 17, 193, 33, 177, 49, 161, 65, + 130, 81, 98, 113, 241, 211, 240, 112, 32, 14, 240, 81, + 209, 209, 209, 125, 113, 81, 113, 81, 113, 81, 97, 97, + 97, 97, 97, 97, 81, 113, 81, 113, 65, 113, 65, 129, + 49, 114, 240, 32, 36, 16, 240, 113, 97, 129, 113, 113, + 81, 145, 97, 45, 145, 81, 145, 81, 145, 81, 129, 97, + 129, 97, 129, 97, 113, 113, 113, 113, 97, 113, 97, 129, + 81, 114, 240, 96, 23, 15, 240, 97, 225, 225, 230, 70, + 241, 225, 225, 36, 101, 85, 49, 225, 225, 241, 225, 225, + 225, 240, 80, 29, 16, 240, 113, 97, 129, 65, 33, 113, + 81, 150, 86, 240, 17, 241, 241, 36, 117, 101, 49, 241, + 241, 240, 17, 241, 241, 241, 240, 112, 25, 12, 240, 209, + 177, 183, 65, 97, 65, 97, 49, 113, 33, 113, 33, 129, + 161, 177, 161, 161, 161, 146, 130, 240, 96, 28, 15, 193, + 241, 81, 97, 113, 113, 103, 113, 97, 113, 97, 97, 113, + 81, 113, 81, 129, 209, 225, 209, 209, 209, 194, 178, 240, + 192, 26, 15, 240, 65, 225, 225, 209, 235, 65, 81, 113, + 97, 113, 97, 97, 113, 81, 129, 225, 209, 225, 209, 194, + 178, 240, 160, 29, 15, 193, 97, 81, 33, 81, 97, 113, + 209, 235, 65, 81, 113, 97, 113, 97, 97, 113, 81, 129, + 225, 209, 225, 209, 194, 178, 240, 160, 18, 13, 0, 6, + 76, 193, 193, 193, 193, 193, 193, 193, 193, 193, 28, 193, + 240, 192, 21, 15, 193, 241, 193, 241, 44, 225, 225, 225, + 225, 225, 225, 225, 225, 225, 60, 225, 240, 240, 48, 32, + 17, 240, 240, 129, 97, 145, 97, 145, 97, 145, 97, 95, + 1, 81, 97, 145, 97, 145, 97, 145, 97, 240, 17, 241, + 240, 17, 241, 241, 226, 240, 176, 35, 17, 225, 240, 33, + 81, 97, 17, 113, 97, 33, 97, 97, 145, 97, 95, 1, + 81, 97, 145, 97, 145, 97, 145, 97, 240, 17, 241, 240, + 17, 241, 241, 226, 240, 176, 23, 14, 240, 240, 210, 226, + 240, 97, 209, 18, 161, 50, 113, 209, 193, 193, 193, 193, + 193, 178, 147, 240, 144, 26, 14, 240, 161, 177, 33, 34, + 113, 98, 240, 97, 209, 18, 161, 50, 113, 209, 193, 193, + 193, 193, 193, 178, 147, 240, 144, 25, 15, 0, 5, 106, + 225, 225, 225, 225, 209, 225, 210, 193, 33, 161, 65, 129, + 97, 82, 129, 19, 161, 240, 240, 16, 28, 16, 240, 225, + 209, 33, 42, 17, 209, 241, 241, 241, 225, 241, 226, 209, + 33, 177, 65, 145, 97, 98, 129, 35, 161, 240, 240, 64, + 25, 15, 240, 65, 225, 225, 225, 234, 21, 129, 81, 113, + 97, 97, 113, 81, 129, 225, 225, 225, 241, 248, 240, 240, + 16, 36, 17, 225, 97, 113, 33, 81, 129, 17, 81, 129, + 113, 240, 26, 53, 129, 113, 113, 129, 97, 145, 81, 161, + 240, 17, 240, 17, 240, 17, 240, 33, 240, 40, 240, 240, + 112, 24, 12, 0, 5, 97, 17, 145, 33, 129, 49, 113, + 49, 97, 177, 177, 161, 177, 161, 161, 161, 146, 130, 240, + 96, 25, 14, 177, 225, 177, 225, 33, 145, 65, 129, 81, + 113, 81, 97, 209, 209, 193, 209, 193, 193, 193, 178, 162, + 240, 160, 30, 12, 240, 17, 177, 183, 65, 97, 65, 97, + 49, 113, 49, 17, 81, 33, 50, 33, 33, 97, 17, 161, + 177, 161, 161, 161, 146, 130, 240, 96, 33, 15, 193, 97, + 81, 33, 81, 97, 119, 113, 97, 113, 97, 97, 113, 97, + 17, 81, 81, 50, 33, 81, 97, 17, 209, 225, 209, 209, + 209, 194, 178, 240, 192, 22, 16, 240, 178, 179, 133, 17, + 241, 241, 241, 127, 145, 241, 241, 241, 225, 241, 225, 225, + 210, 240, 192, 25, 16, 209, 194, 33, 131, 33, 85, 17, + 65, 161, 241, 241, 127, 145, 241, 241, 241, 225, 241, 225, + 225, 210, 240, 192, 21, 11, 0, 10, 1, 81, 17, 49, + 65, 33, 33, 65, 33, 97, 161, 145, 145, 145, 130, 240, + 208, 28, 14, 0, 5, 97, 113, 17, 65, 97, 33, 65, + 81, 49, 49, 81, 49, 129, 209, 209, 193, 209, 193, 193, + 193, 178, 162, 240, 128, 29, 16, 209, 209, 33, 209, 113, + 177, 65, 97, 65, 65, 81, 81, 49, 81, 81, 129, 241, + 241, 225, 241, 225, 225, 225, 210, 194, 240, 192, 19, 15, + 0, 5, 121, 0, 6, 30, 129, 225, 225, 225, 225, 209, + 225, 209, 194, 240, 160, 22, 16, 209, 240, 17, 209, 89, + 33, 0, 6, 46, 145, 241, 241, 241, 241, 225, 241, 225, + 210, 240, 192, 22, 8, 240, 17, 113, 113, 113, 113, 113, + 115, 81, 34, 49, 65, 33, 81, 17, 113, 113, 113, 113, + 240, 27, 9, 240, 49, 81, 33, 97, 17, 65, 49, 81, + 33, 129, 131, 97, 34, 65, 65, 49, 81, 33, 129, 129, + 129, 129, 240, 32, 21, 15, 240, 240, 113, 225, 225, 225, + 126, 129, 225, 225, 225, 225, 225, 209, 225, 194, 178, 240, + 176, 11, 15, 0, 9, 90, 0, 15, 62, 0, 5, 96, + 27, 13, 240, 240, 171, 193, 193, 193, 82, 65, 129, 49, + 145, 17, 177, 177, 17, 145, 49, 113, 81, 81, 97, 50, + 146, 240, 144, 28, 15, 240, 113, 225, 225, 153, 225, 209, + 209, 209, 210, 18, 130, 17, 49, 82, 49, 65, 34, 81, + 81, 129, 225, 225, 225, 240, 112, 20, 12, 0, 5, 97, + 177, 177, 161, 177, 161, 177, 161, 161, 161, 161, 146, 130, + 240, 240, 64, 28, 16, 0, 9, 17, 177, 65, 161, 81, + 145, 97, 113, 113, 113, 129, 81, 145, 81, 161, 49, 177, + 33, 193, 17, 209, 0, 6, 16, 32, 16, 240, 225, 240, + 17, 209, 193, 49, 113, 65, 161, 81, 145, 97, 113, 113, + 113, 129, 81, 145, 81, 161, 49, 177, 33, 193, 17, 209, + 0, 6, 16, 33, 17, 240, 242, 225, 33, 209, 33, 161, + 50, 113, 65, 177, 81, 161, 97, 129, 113, 129, 129, 97, + 145, 97, 161, 65, 177, 49, 193, 33, 209, 0, 6, 80, + 21, 12, 240, 145, 177, 177, 177, 114, 33, 67, 69, 113, + 177, 177, 177, 177, 177, 193, 201, 240, 160, 26, 14, 240, + 161, 33, 129, 33, 17, 145, 49, 209, 114, 65, 67, 101, + 145, 209, 209, 209, 209, 209, 225, 233, 240, 240, 16, 27, + 14, 162, 177, 33, 17, 129, 33, 17, 146, 33, 209, 114, + 65, 67, 101, 145, 209, 209, 209, 209, 209, 225, 233, 240, + 240, 16, 19, 13, 0, 6, 76, 193, 193, 193, 193, 177, + 193, 177, 193, 177, 177, 162, 131, 240, 96, 22, 15, 240, + 193, 193, 33, 193, 60, 225, 225, 225, 225, 209, 225, 209, + 225, 209, 209, 194, 163, 240, 160, 23, 15, 178, 193, 33, + 177, 33, 194, 44, 225, 225, 225, 225, 209, 225, 209, 225, + 209, 209, 194, 163, 240, 160, 22, 16, 0, 10, 82, 209, + 33, 177, 65, 145, 97, 113, 129, 81, 161, 240, 17, 240, + 18, 0, 10, 16, 26, 16, 0, 7, 49, 209, 33, 130, + 49, 145, 33, 177, 65, 145, 97, 113, 129, 81, 161, 240, + 17, 240, 18, 0, 10, 16, 28, 16, 0, 7, 50, 209, + 33, 114, 49, 33, 97, 33, 50, 97, 65, 145, 97, 113, + 129, 81, 161, 240, 17, 240, 18, 0, 10, 16, 33, 16, + 240, 129, 241, 241, 241, 143, 129, 241, 177, 49, 33, 129, + 49, 49, 97, 65, 65, 81, 65, 81, 49, 81, 81, 33, + 97, 241, 209, 17, 226, 240, 144, 37, 16, 240, 129, 81, + 145, 49, 33, 129, 65, 161, 143, 129, 241, 177, 49, 33, + 129, 49, 49, 97, 65, 65, 81, 65, 81, 49, 81, 81, + 33, 97, 241, 209, 17, 226, 240, 144, 38, 16, 194, 145, + 49, 33, 129, 49, 33, 129, 66, 145, 143, 129, 241, 177, + 49, 33, 129, 49, 49, 97, 65, 65, 81, 65, 81, 49, + 81, 81, 33, 97, 241, 209, 17, 226, 240, 144, 21, 14, + 0, 7, 13, 209, 193, 209, 193, 98, 65, 145, 33, 178, + 209, 225, 225, 209, 240, 240, 32, 17, 12, 240, 164, 195, + 194, 240, 196, 195, 193, 240, 196, 195, 194, 194, 240, 160, + 29, 15, 240, 240, 97, 225, 225, 225, 209, 225, 225, 65, + 129, 97, 113, 97, 97, 129, 81, 84, 65, 36, 65, 21, + 129, 225, 240, 240, 16, 26, 13, 240, 240, 97, 193, 193, + 193, 177, 193, 98, 65, 130, 17, 178, 177, 17, 145, 49, + 113, 81, 81, 162, 146, 240, 144, 22, 16, 0, 6, 43, + 145, 241, 241, 241, 159, 113, 241, 241, 241, 241, 240, 17, + 240, 22, 240, 240, 64, 21, 11, 0, 7, 33, 161, 161, + 21, 21, 65, 81, 49, 97, 33, 113, 161, 177, 161, 161, + 240, 192, 30, 16, 240, 97, 241, 241, 241, 84, 113, 19, + 49, 84, 81, 36, 33, 81, 145, 65, 177, 33, 193, 241, + 241, 240, 17, 241, 241, 241, 240, 128, 14, 13, 0, 11, + 87, 193, 193, 193, 193, 193, 76, 0, 6, 80, 18, 15, + 0, 7, 104, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 94, 0, 5, 96, 16, 9, 0, 6, 104, 129, 129, 129, + 39, 129, 129, 129, 24, 129, 240, 64, 19, 12, 240, 240, + 107, 177, 177, 177, 177, 42, 177, 177, 177, 177, 177, 27, + 177, 240, 160, 19, 13, 240, 216, 240, 240, 204, 193, 193, + 193, 177, 193, 177, 177, 162, 116, 240, 240, 48, 28, 9, + 240, 17, 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, + 17, 97, 17, 97, 17, 97, 129, 129, 113, 129, 113, 113, + 98, 224, 41, 16, 240, 240, 161, 241, 177, 49, 177, 49, + 177, 49, 177, 49, 177, 49, 177, 49, 81, 81, 49, 81, + 65, 65, 65, 81, 65, 65, 65, 81, 49, 81, 81, 33, + 81, 97, 17, 81, 114, 240, 112, 27, 11, 240, 113, 161, + 161, 161, 161, 161, 161, 161, 129, 17, 129, 17, 113, 33, + 97, 49, 81, 65, 50, 81, 18, 114, 240, 80, 28, 12, + 0, 6, 11, 17, 145, 17, 145, 17, 145, 17, 145, 17, + 145, 17, 145, 17, 145, 17, 145, 17, 145, 27, 17, 145, + 240, 160, 18, 9, 0, 7, 120, 17, 97, 17, 97, 17, + 97, 113, 129, 113, 113, 98, 240, 128, 25, 13, 240, 240, + 156, 17, 161, 17, 161, 17, 161, 17, 161, 17, 161, 193, + 177, 193, 177, 193, 177, 162, 131, 240, 80, 26, 16, 240, + 145, 241, 241, 241, 140, 97, 65, 161, 65, 161, 65, 161, + 65, 161, 65, 127, 145, 241, 241, 241, 241, 240, 128, 20, + 16, 0, 8, 43, 241, 225, 177, 33, 193, 17, 209, 241, + 241, 241, 241, 143, 0, 6, 16, 20, 12, 240, 240, 107, + 177, 177, 177, 42, 177, 177, 161, 177, 161, 161, 161, 146, + 130, 240, 80, 21, 14, 240, 240, 193, 226, 226, 240, 97, + 209, 193, 209, 193, 193, 193, 178, 162, 132, 240, 240, 128, + 29, 15, 240, 97, 81, 129, 97, 113, 65, 145, 81, 44, + 49, 161, 49, 161, 49, 161, 49, 161, 225, 209, 225, 209, + 209, 194, 163, 240, 144, 24, 10, 0, 6, 97, 145, 145, + 89, 81, 49, 81, 49, 65, 65, 65, 65, 49, 81, 49, + 81, 33, 66, 240, 112, 20, 11, 0, 7, 33, 161, 161, + 152, 49, 49, 81, 65, 65, 81, 145, 161, 145, 130, 240, + 224, 28, 18, 240, 240, 33, 240, 50, 225, 76, 98, 146, + 82, 130, 98, 130, 98, 130, 98, 130, 242, 243, 227, 212, + 181, 226, 0, 6, 16, 27, 17, 240, 242, 162, 33, 18, + 146, 34, 178, 155, 114, 50, 162, 50, 162, 50, 162, 50, + 127, 162, 242, 242, 242, 0, 7, 32, 23, 17, 240, 240, + 18, 210, 240, 17, 92, 242, 226, 178, 18, 196, 210, 17, + 210, 242, 242, 143, 0, 8, 96, 24, 17, 225, 240, 18, + 210, 17, 28, 18, 194, 242, 242, 106, 242, 242, 226, 226, + 226, 211, 196, 225, 0, 5, 112, 8, 3, 240, 98, 18, + 18, 240, 160, 8, 15, 0, 13, 17, 253, 0, 17, 14, + 6, 240, 240, 193, 97, 97, 81, 97, 81, 97, 81, 240, + 64, 19, 9, 0, 6, 49, 97, 33, 17, 65, 65, 145, + 129, 145, 129, 145, 129, 240, 240, 16, +}; + +tFont *g_psFontWSazanamigothic9x17 = (tFont *)g_pui8Sazanamigothic9x17; diff --git a/third_party/fonts/other/fonts/fontsazanamimincho10x19.c b/third_party/fonts/other/fonts/fontsazanamimincho10x19.c new file mode 100644 index 0000000..edcf8a0 --- /dev/null +++ b/third_party/fonts/other/fonts/fontsazanamimincho10x19.c @@ -0,0 +1,1164 @@ +//***************************************************************************** +// +// fontsazanamimincho10x19.c - Font definition for the 10x19 Sazanamimincho font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from Sazanami +// +// Copyright (c) 1990-2003 +// Wada Laboratory, the University of Tokyo. All rights reserved. +// Copyright (c) 2003-2004 +// Electronic Font Open Laboratory (/efont/). All rights reserved +// +// For license, please see README. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 286 in 2 blocks +// Style: sazanamimincho +// Size: 10x19 +// Bold: no +// Italic: no +// Memory usage: 10437 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Sazanamimincho10x19[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 19, + + // + // The height of the font. + // + 20, + + // + // The baseline of the font. + // + 17, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3041 - 0x30ff + // + 0x41, 0x30, 0x00, 0x00, + 0xbf, 0x00, 0x00, 0x00, + 0xec, 0x0a, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x90, 0x01, 0x00, 0x00, // Offset 400 (0x190) + 0x9f, 0x01, 0x00, 0x00, // Offset 415 (0x19f) + 0xc2, 0x01, 0x00, 0x00, // Offset 450 (0x1c2) + 0xe7, 0x01, 0x00, 0x00, // Offset 487 (0x1e7) + 0x14, 0x02, 0x00, 0x00, // Offset 532 (0x214) + 0x3b, 0x02, 0x00, 0x00, // Offset 571 (0x23b) + 0x46, 0x02, 0x00, 0x00, // Offset 582 (0x246) + 0x5b, 0x02, 0x00, 0x00, // Offset 603 (0x25b) + 0x70, 0x02, 0x00, 0x00, // Offset 624 (0x270) + 0x88, 0x02, 0x00, 0x00, // Offset 648 (0x288) + 0x98, 0x02, 0x00, 0x00, // Offset 664 (0x298) + 0xa3, 0x02, 0x00, 0x00, // Offset 675 (0x2a3) + 0xab, 0x02, 0x00, 0x00, // Offset 683 (0x2ab) + 0xb3, 0x02, 0x00, 0x00, // Offset 691 (0x2b3) + 0xca, 0x02, 0x00, 0x00, // Offset 714 (0x2ca) + 0xea, 0x02, 0x00, 0x00, // Offset 746 (0x2ea) + 0xfe, 0x02, 0x00, 0x00, // Offset 766 (0x2fe) + 0x17, 0x03, 0x00, 0x00, // Offset 791 (0x317) + 0x30, 0x03, 0x00, 0x00, // Offset 816 (0x330) + 0x4b, 0x03, 0x00, 0x00, // Offset 843 (0x34b) + 0x63, 0x03, 0x00, 0x00, // Offset 867 (0x363) + 0x81, 0x03, 0x00, 0x00, // Offset 897 (0x381) + 0x98, 0x03, 0x00, 0x00, // Offset 920 (0x398) + 0xb6, 0x03, 0x00, 0x00, // Offset 950 (0x3b6) + 0xd3, 0x03, 0x00, 0x00, // Offset 979 (0x3d3) + 0xde, 0x03, 0x00, 0x00, // Offset 990 (0x3de) + 0xec, 0x03, 0x00, 0x00, // Offset 1004 (0x3ec) + 0xff, 0x03, 0x00, 0x00, // Offset 1023 (0x3ff) + 0x08, 0x04, 0x00, 0x00, // Offset 1032 (0x408) + 0x1c, 0x04, 0x00, 0x00, // Offset 1052 (0x41c) + 0x35, 0x04, 0x00, 0x00, // Offset 1077 (0x435) + 0x65, 0x04, 0x00, 0x00, // Offset 1125 (0x465) + 0x85, 0x04, 0x00, 0x00, // Offset 1157 (0x485) + 0xa4, 0x04, 0x00, 0x00, // Offset 1188 (0x4a4) + 0xc1, 0x04, 0x00, 0x00, // Offset 1217 (0x4c1) + 0xe1, 0x04, 0x00, 0x00, // Offset 1249 (0x4e1) + 0xff, 0x04, 0x00, 0x00, // Offset 1279 (0x4ff) + 0x1a, 0x05, 0x00, 0x00, // Offset 1306 (0x51a) + 0x3d, 0x05, 0x00, 0x00, // Offset 1341 (0x53d) + 0x5f, 0x05, 0x00, 0x00, // Offset 1375 (0x55f) + 0x72, 0x05, 0x00, 0x00, // Offset 1394 (0x572) + 0x8b, 0x05, 0x00, 0x00, // Offset 1419 (0x58b) + 0xad, 0x05, 0x00, 0x00, // Offset 1453 (0x5ad) + 0xc4, 0x05, 0x00, 0x00, // Offset 1476 (0x5c4) + 0xf2, 0x05, 0x00, 0x00, // Offset 1522 (0x5f2) + 0x1d, 0x06, 0x00, 0x00, // Offset 1565 (0x61d) + 0x3e, 0x06, 0x00, 0x00, // Offset 1598 (0x63e) + 0x58, 0x06, 0x00, 0x00, // Offset 1624 (0x658) + 0x7c, 0x06, 0x00, 0x00, // Offset 1660 (0x67c) + 0x9d, 0x06, 0x00, 0x00, // Offset 1693 (0x69d) + 0xba, 0x06, 0x00, 0x00, // Offset 1722 (0x6ba) + 0xd4, 0x06, 0x00, 0x00, // Offset 1748 (0x6d4) + 0xf6, 0x06, 0x00, 0x00, // Offset 1782 (0x6f6) + 0x15, 0x07, 0x00, 0x00, // Offset 1813 (0x715) + 0x40, 0x07, 0x00, 0x00, // Offset 1856 (0x740) + 0x60, 0x07, 0x00, 0x00, // Offset 1888 (0x760) + 0x7b, 0x07, 0x00, 0x00, // Offset 1915 (0x77b) + 0x96, 0x07, 0x00, 0x00, // Offset 1942 (0x796) + 0xa9, 0x07, 0x00, 0x00, // Offset 1961 (0x7a9) + 0xbe, 0x07, 0x00, 0x00, // Offset 1982 (0x7be) + 0xd1, 0x07, 0x00, 0x00, // Offset 2001 (0x7d1) + 0xde, 0x07, 0x00, 0x00, // Offset 2014 (0x7de) + 0xe5, 0x07, 0x00, 0x00, // Offset 2021 (0x7e5) + 0xed, 0x07, 0x00, 0x00, // Offset 2029 (0x7ed) + 0x05, 0x08, 0x00, 0x00, // Offset 2053 (0x805) + 0x23, 0x08, 0x00, 0x00, // Offset 2083 (0x823) + 0x37, 0x08, 0x00, 0x00, // Offset 2103 (0x837) + 0x55, 0x08, 0x00, 0x00, // Offset 2133 (0x855) + 0x6a, 0x08, 0x00, 0x00, // Offset 2154 (0x86a) + 0x80, 0x08, 0x00, 0x00, // Offset 2176 (0x880) + 0x9c, 0x08, 0x00, 0x00, // Offset 2204 (0x89c) + 0xbb, 0x08, 0x00, 0x00, // Offset 2235 (0x8bb) + 0xcd, 0x08, 0x00, 0x00, // Offset 2253 (0x8cd) + 0xe4, 0x08, 0x00, 0x00, // Offset 2276 (0x8e4) + 0x01, 0x09, 0x00, 0x00, // Offset 2305 (0x901) + 0x14, 0x09, 0x00, 0x00, // Offset 2324 (0x914) + 0x39, 0x09, 0x00, 0x00, // Offset 2361 (0x939) + 0x54, 0x09, 0x00, 0x00, // Offset 2388 (0x954) + 0x6c, 0x09, 0x00, 0x00, // Offset 2412 (0x96c) + 0x87, 0x09, 0x00, 0x00, // Offset 2439 (0x987) + 0xa1, 0x09, 0x00, 0x00, // Offset 2465 (0x9a1) + 0xb5, 0x09, 0x00, 0x00, // Offset 2485 (0x9b5) + 0xcc, 0x09, 0x00, 0x00, // Offset 2508 (0x9cc) + 0xe1, 0x09, 0x00, 0x00, // Offset 2529 (0x9e1) + 0xfc, 0x09, 0x00, 0x00, // Offset 2556 (0x9fc) + 0x14, 0x0a, 0x00, 0x00, // Offset 2580 (0xa14) + 0x37, 0x0a, 0x00, 0x00, // Offset 2615 (0xa37) + 0x50, 0x0a, 0x00, 0x00, // Offset 2640 (0xa50) + 0x6c, 0x0a, 0x00, 0x00, // Offset 2668 (0xa6c) + 0x80, 0x0a, 0x00, 0x00, // Offset 2688 (0xa80) + 0x96, 0x0a, 0x00, 0x00, // Offset 2710 (0xa96) + 0xac, 0x0a, 0x00, 0x00, // Offset 2732 (0xaac) + 0xc2, 0x0a, 0x00, 0x00, // Offset 2754 (0xac2) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 4, 12, 0, 30, 16, 4, 145, 35, 19, 19, 33, 49, + 49, 49, 49, 49, 177, 35, 33, 224, 15, 7, 242, 18, + 34, 18, 49, 33, 33, 33, 33, 33, 0, 11, 96, 35, + 10, 240, 129, 49, 81, 49, 81, 49, 81, 49, 81, 49, + 56, 49, 49, 81, 49, 81, 49, 81, 49, 56, 49, 49, + 81, 49, 81, 49, 81, 49, 81, 49, 240, 144, 37, 10, + 225, 145, 117, 65, 33, 33, 33, 49, 49, 17, 49, 34, + 17, 49, 98, 17, 131, 129, 18, 97, 49, 18, 33, 49, + 17, 49, 49, 33, 33, 33, 69, 113, 145, 240, 160, 45, + 9, 240, 66, 65, 17, 33, 49, 17, 33, 33, 33, 33, + 33, 33, 33, 17, 49, 33, 17, 66, 17, 129, 113, 129, + 18, 65, 17, 33, 49, 17, 33, 33, 33, 33, 33, 33, + 33, 17, 49, 33, 17, 66, 240, 80, 39, 11, 240, 240, + 84, 97, 65, 81, 65, 81, 49, 113, 33, 113, 17, 145, + 51, 49, 17, 49, 49, 33, 49, 33, 65, 17, 49, 65, + 17, 49, 81, 81, 50, 33, 51, 34, 240, 240, 80, 11, + 4, 146, 34, 49, 49, 33, 33, 0, 6, 48, 21, 6, + 161, 65, 65, 81, 65, 81, 66, 65, 81, 81, 81, 82, + 81, 81, 97, 81, 97, 97, 112, 21, 6, 97, 97, 97, + 81, 97, 81, 82, 81, 81, 81, 81, 66, 65, 81, 65, + 81, 65, 65, 176, 24, 8, 240, 240, 209, 65, 33, 33, + 18, 17, 18, 51, 97, 99, 50, 17, 18, 17, 33, 33, + 65, 0, 6, 64, 16, 10, 0, 6, 97, 145, 145, 145, + 89, 81, 145, 145, 145, 0, 8, 16, 11, 4, 0, 7, + 18, 34, 49, 49, 33, 33, 48, 8, 9, 0, 10, 24, + 0, 11, 48, 8, 4, 0, 7, 17, 35, 33, 224, 23, + 10, 240, 49, 145, 129, 145, 129, 145, 129, 145, 129, 145, + 145, 129, 145, 129, 145, 129, 145, 129, 145, 144, 32, 9, + 240, 242, 97, 33, 65, 65, 49, 65, 33, 97, 17, 97, + 17, 97, 17, 97, 17, 97, 17, 97, 33, 65, 49, 65, + 65, 33, 98, 240, 240, 16, 20, 7, 240, 145, 82, 50, + 17, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 69, + 240, 112, 25, 9, 240, 228, 65, 65, 33, 97, 17, 97, + 129, 113, 129, 113, 113, 113, 113, 65, 33, 81, 17, 81, + 39, 240, 224, 25, 9, 240, 228, 65, 65, 33, 97, 17, + 97, 129, 113, 83, 145, 145, 129, 17, 97, 17, 97, 33, + 65, 68, 240, 240, 27, 9, 240, 240, 18, 114, 97, 17, + 97, 17, 81, 33, 81, 33, 65, 49, 65, 49, 49, 65, + 56, 97, 129, 129, 101, 240, 208, 24, 9, 240, 215, 33, + 129, 129, 129, 129, 19, 66, 49, 145, 129, 129, 17, 97, + 17, 97, 33, 65, 68, 240, 240, 30, 9, 240, 228, 65, + 65, 33, 97, 17, 129, 129, 35, 49, 17, 49, 34, 81, + 17, 97, 17, 97, 17, 97, 17, 97, 33, 65, 68, 240, + 240, 23, 9, 240, 215, 33, 81, 17, 81, 33, 65, 129, + 113, 129, 129, 129, 113, 129, 129, 129, 129, 240, 240, 32, + 30, 9, 240, 228, 65, 65, 33, 97, 17, 97, 17, 97, + 33, 65, 68, 65, 65, 33, 97, 17, 97, 17, 97, 17, + 97, 33, 65, 68, 240, 240, 29, 9, 240, 228, 65, 65, + 33, 97, 17, 97, 17, 97, 17, 97, 17, 97, 33, 66, + 52, 17, 129, 129, 17, 97, 33, 65, 68, 240, 240, 11, + 4, 240, 161, 35, 33, 240, 129, 35, 33, 224, 14, 4, + 240, 161, 35, 33, 240, 130, 34, 49, 49, 33, 33, 48, + 19, 8, 240, 240, 129, 97, 97, 97, 97, 97, 97, 129, + 129, 129, 129, 129, 129, 240, 160, 9, 9, 0, 9, 8, + 240, 216, 0, 8, 20, 8, 240, 240, 33, 129, 129, 129, + 129, 129, 129, 97, 97, 97, 97, 97, 97, 240, 240, 16, + 25, 10, 240, 240, 37, 65, 81, 33, 113, 17, 113, 33, + 97, 129, 129, 114, 129, 145, 240, 65, 131, 129, 240, 240, + 80, 48, 10, 240, 132, 81, 65, 49, 81, 49, 97, 17, + 50, 33, 17, 33, 17, 33, 17, 17, 33, 33, 17, 17, + 33, 33, 17, 17, 33, 33, 17, 17, 33, 33, 17, 17, + 33, 33, 17, 34, 18, 33, 161, 97, 49, 65, 84, 240, + 128, 32, 11, 240, 240, 114, 146, 129, 17, 129, 18, 113, + 33, 113, 33, 97, 50, 81, 65, 81, 65, 86, 65, 82, + 49, 97, 49, 97, 35, 52, 240, 240, 64, 31, 10, 240, + 247, 65, 81, 49, 97, 33, 97, 33, 97, 33, 81, 54, + 65, 81, 49, 97, 33, 97, 33, 97, 33, 97, 33, 81, + 39, 240, 240, 48, 29, 10, 240, 240, 51, 33, 49, 49, + 17, 33, 82, 33, 97, 17, 113, 17, 145, 145, 145, 145, + 161, 145, 97, 49, 65, 84, 240, 240, 48, 32, 10, 240, + 246, 81, 65, 65, 81, 49, 81, 49, 97, 33, 97, 33, + 97, 33, 97, 33, 97, 33, 97, 33, 81, 49, 81, 49, + 65, 54, 240, 240, 64, 30, 10, 240, 249, 33, 97, 33, + 97, 33, 97, 33, 65, 65, 65, 70, 65, 65, 65, 65, + 65, 145, 97, 33, 97, 33, 97, 25, 240, 240, 16, 27, + 10, 240, 249, 33, 97, 33, 97, 33, 97, 33, 49, 81, + 49, 85, 81, 49, 81, 49, 81, 145, 145, 145, 132, 240, + 240, 96, 35, 10, 240, 240, 51, 33, 49, 49, 17, 33, + 82, 33, 97, 17, 113, 17, 145, 145, 68, 17, 113, 17, + 113, 33, 97, 33, 82, 49, 49, 17, 67, 33, 240, 240, + 16, 34, 11, 240, 240, 52, 36, 33, 97, 49, 97, 49, + 97, 49, 97, 49, 97, 56, 49, 97, 49, 97, 49, 97, + 49, 97, 49, 97, 49, 97, 36, 36, 240, 240, 64, 19, + 6, 240, 53, 49, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 53, 240, 64, 25, 11, 240, 240, 133, 129, + 161, 161, 161, 161, 161, 161, 161, 50, 81, 49, 97, 49, + 97, 65, 65, 100, 240, 240, 128, 34, 11, 240, 240, 52, + 36, 33, 81, 65, 65, 81, 49, 97, 33, 113, 17, 131, + 129, 17, 129, 33, 113, 49, 97, 65, 81, 81, 65, 97, + 36, 36, 240, 240, 64, 23, 10, 240, 245, 113, 145, 145, + 145, 145, 145, 145, 145, 145, 145, 81, 49, 81, 49, 81, + 40, 240, 240, 16, 46, 11, 240, 240, 50, 98, 33, 97, + 49, 82, 50, 66, 50, 49, 17, 50, 49, 17, 49, 17, + 17, 33, 49, 17, 17, 33, 49, 17, 17, 33, 49, 33, + 49, 49, 33, 49, 49, 33, 49, 49, 97, 35, 52, 240, + 240, 64, 43, 11, 240, 240, 50, 83, 34, 81, 50, 81, + 49, 17, 65, 49, 17, 65, 49, 33, 49, 49, 33, 49, + 49, 49, 33, 49, 49, 33, 49, 65, 17, 49, 65, 17, + 49, 82, 49, 82, 35, 81, 240, 240, 80, 33, 10, 240, + 240, 37, 65, 81, 49, 81, 33, 113, 17, 113, 17, 113, + 17, 113, 17, 113, 17, 113, 17, 113, 17, 113, 33, 81, + 49, 81, 69, 240, 240, 48, 26, 10, 240, 247, 65, 81, + 49, 97, 33, 97, 33, 97, 33, 97, 33, 81, 54, 65, + 145, 145, 145, 145, 132, 240, 240, 96, 36, 11, 240, 240, + 85, 81, 81, 65, 81, 49, 113, 33, 113, 33, 113, 33, + 113, 33, 113, 33, 113, 33, 113, 33, 34, 49, 50, 33, + 17, 65, 66, 85, 161, 33, 130, 208, 33, 11, 240, 240, + 55, 81, 81, 65, 97, 49, 97, 49, 97, 49, 81, 70, + 81, 33, 113, 49, 97, 65, 81, 65, 81, 81, 65, 97, + 36, 36, 240, 240, 64, 29, 9, 240, 227, 17, 49, 50, + 33, 97, 17, 97, 17, 146, 146, 146, 145, 17, 97, 17, + 97, 18, 81, 17, 17, 49, 33, 35, 240, 240, 26, 10, + 240, 249, 17, 49, 49, 17, 49, 49, 17, 49, 49, 81, + 145, 145, 145, 145, 145, 145, 145, 145, 117, 240, 240, 48, + 34, 11, 240, 240, 52, 51, 33, 97, 49, 97, 49, 97, + 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, 49, 97, + 49, 97, 49, 97, 65, 65, 100, 240, 240, 112, 31, 11, + 240, 240, 52, 51, 33, 97, 49, 97, 50, 65, 81, 65, + 81, 65, 82, 49, 97, 33, 114, 17, 129, 17, 130, 146, + 161, 161, 240, 240, 128, 43, 10, 240, 243, 51, 33, 81, + 49, 33, 33, 49, 33, 33, 49, 33, 33, 49, 33, 33, + 49, 19, 17, 49, 17, 17, 17, 49, 17, 17, 17, 51, + 19, 65, 49, 81, 49, 81, 49, 81, 49, 240, 240, 48, + 32, 11, 240, 240, 52, 36, 33, 97, 65, 65, 81, 49, + 113, 33, 115, 145, 162, 129, 17, 129, 33, 97, 65, 81, + 65, 65, 97, 36, 36, 240, 240, 64, 27, 10, 240, 244, + 35, 33, 81, 49, 81, 65, 49, 81, 49, 97, 17, 113, + 17, 129, 145, 145, 145, 145, 145, 117, 240, 240, 48, 27, + 10, 240, 240, 24, 33, 81, 49, 65, 65, 65, 129, 145, + 129, 145, 129, 145, 129, 81, 49, 81, 33, 97, 25, 240, + 240, 16, 19, 6, 197, 17, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 85, 208, 21, 10, 161, + 145, 161, 145, 161, 145, 161, 145, 161, 145, 145, 161, 145, + 161, 145, 161, 145, 161, 145, 19, 6, 197, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 21, + 208, 13, 8, 240, 65, 97, 17, 65, 49, 33, 81, 0, + 14, 16, 7, 10, 0, 21, 41, 240, 96, 8, 5, 162, + 66, 81, 0, 9, 64, 24, 10, 0, 9, 5, 65, 81, + 34, 81, 145, 85, 50, 65, 33, 97, 33, 97, 33, 82, + 53, 18, 240, 240, 16, 30, 10, 240, 243, 145, 145, 145, + 145, 19, 82, 49, 65, 81, 49, 81, 49, 81, 49, 81, + 49, 81, 49, 81, 50, 49, 65, 19, 240, 240, 48, 20, + 9, 0, 8, 20, 65, 65, 33, 82, 17, 129, 129, 129, + 129, 97, 33, 65, 68, 240, 240, 30, 9, 240, 240, 19, + 129, 129, 129, 67, 17, 49, 50, 33, 81, 33, 81, 33, + 81, 33, 81, 33, 81, 33, 81, 49, 50, 67, 18, 240, + 208, 21, 9, 0, 8, 20, 65, 65, 33, 97, 17, 97, + 24, 17, 129, 129, 97, 33, 65, 68, 240, 240, 22, 9, + 240, 244, 65, 65, 49, 50, 49, 102, 81, 129, 129, 129, + 129, 129, 129, 129, 101, 240, 240, 16, 28, 10, 0, 8, + 65, 52, 18, 33, 65, 65, 65, 65, 65, 65, 65, 84, + 81, 161, 129, 21, 33, 113, 17, 113, 17, 113, 39, 32, + 31, 11, 240, 240, 51, 161, 161, 161, 161, 20, 82, 65, + 65, 81, 65, 81, 65, 81, 65, 81, 65, 81, 65, 81, + 65, 81, 36, 36, 240, 240, 64, 18, 9, 240, 242, 114, + 240, 132, 129, 129, 129, 129, 129, 129, 129, 129, 72, 240, + 208, 23, 9, 240, 240, 50, 114, 240, 117, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 18, 81, 17, 81, 53, 48, + 29, 10, 240, 243, 145, 145, 145, 145, 36, 49, 49, 81, + 33, 97, 17, 114, 129, 17, 113, 33, 97, 49, 81, 65, + 36, 20, 240, 240, 16, 19, 9, 240, 212, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 129, 129, 129, 72, 240, 208, + 37, 11, 0, 9, 82, 18, 18, 81, 33, 33, 65, 33, + 33, 65, 33, 33, 65, 33, 33, 65, 33, 33, 65, 33, + 33, 65, 33, 33, 65, 33, 33, 50, 33, 34, 240, 240, + 64, 27, 11, 0, 9, 83, 20, 82, 65, 65, 81, 65, + 81, 65, 81, 65, 81, 65, 81, 65, 81, 65, 81, 51, + 51, 240, 240, 64, 24, 9, 0, 8, 20, 65, 65, 33, + 97, 17, 97, 17, 97, 17, 97, 17, 97, 17, 97, 33, + 65, 68, 240, 240, 27, 10, 0, 8, 99, 19, 82, 49, + 65, 81, 49, 81, 49, 81, 49, 81, 49, 81, 50, 49, + 65, 19, 81, 145, 145, 131, 96, 26, 9, 0, 8, 19, + 17, 49, 50, 33, 81, 33, 81, 33, 81, 33, 81, 33, + 81, 49, 50, 67, 17, 129, 129, 129, 115, 20, 9, 0, + 7, 115, 19, 66, 49, 49, 50, 49, 129, 129, 129, 129, + 129, 101, 240, 240, 16, 23, 9, 0, 8, 5, 17, 17, + 82, 17, 97, 18, 147, 146, 33, 97, 17, 97, 18, 81, + 17, 21, 240, 224, 21, 9, 240, 241, 129, 129, 129, 87, + 81, 129, 129, 129, 129, 129, 129, 49, 65, 49, 83, 240, + 224, 27, 11, 0, 9, 83, 51, 65, 81, 65, 81, 65, + 81, 65, 81, 65, 81, 65, 81, 65, 81, 65, 66, 84, + 18, 240, 240, 64, 24, 11, 0, 9, 84, 36, 49, 81, + 65, 81, 81, 49, 97, 49, 97, 49, 113, 17, 131, 145, + 161, 240, 240, 128, 35, 10, 0, 8, 99, 36, 33, 81, + 49, 33, 33, 49, 33, 33, 49, 33, 33, 49, 19, 17, + 49, 17, 17, 17, 49, 17, 17, 17, 65, 49, 81, 49, + 240, 240, 48, 25, 10, 0, 8, 100, 20, 49, 49, 81, + 49, 97, 17, 129, 145, 129, 17, 97, 49, 81, 49, 52, + 20, 240, 240, 16, 28, 11, 0, 9, 84, 51, 49, 81, + 65, 81, 65, 65, 97, 49, 97, 33, 129, 17, 129, 17, + 145, 161, 82, 33, 97, 49, 115, 112, 20, 9, 0, 7, + 120, 17, 81, 33, 65, 129, 113, 113, 129, 113, 65, 33, + 81, 24, 240, 208, 22, 6, 65, 65, 81, 65, 81, 81, + 81, 81, 81, 50, 97, 81, 81, 81, 81, 81, 97, 81, + 97, 112, 22, 2, 1, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 22, 6, 1, 97, 81, 97, 81, 81, 81, 81, 81, 98, + 49, 81, 81, 81, 81, 81, 65, 81, 65, 176, 10, 9, + 162, 97, 34, 33, 98, 0, 18, 32, + // + // Block 1 Offsets: Codepoints 0x3041 - 0x30ff + // + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x24, 0x03, 0x00, 0x00, // Offset 804 (0x324) + 0x5a, 0x03, 0x00, 0x00, // Offset 858 (0x35a) + 0x79, 0x03, 0x00, 0x00, // Offset 889 (0x379) + 0xa0, 0x03, 0x00, 0x00, // Offset 928 (0x3a0) + 0xb9, 0x03, 0x00, 0x00, // Offset 953 (0x3b9) + 0xd5, 0x03, 0x00, 0x00, // Offset 981 (0x3d5) + 0xf2, 0x03, 0x00, 0x00, // Offset 1010 (0x3f2) + 0x19, 0x04, 0x00, 0x00, // Offset 1049 (0x419) + 0x41, 0x04, 0x00, 0x00, // Offset 1089 (0x441) + 0x75, 0x04, 0x00, 0x00, // Offset 1141 (0x475) + 0xa8, 0x04, 0x00, 0x00, // Offset 1192 (0x4a8) + 0xdf, 0x04, 0x00, 0x00, // Offset 1247 (0x4df) + 0x04, 0x05, 0x00, 0x00, // Offset 1284 (0x504) + 0x2f, 0x05, 0x00, 0x00, // Offset 1327 (0x52f) + 0x45, 0x05, 0x00, 0x00, // Offset 1349 (0x545) + 0x6d, 0x05, 0x00, 0x00, // Offset 1389 (0x56d) + 0x9e, 0x05, 0x00, 0x00, // Offset 1438 (0x59e) + 0xd5, 0x05, 0x00, 0x00, // Offset 1493 (0x5d5) + 0xed, 0x05, 0x00, 0x00, // Offset 1517 (0x5ed) + 0x0e, 0x06, 0x00, 0x00, // Offset 1550 (0x60e) + 0x2d, 0x06, 0x00, 0x00, // Offset 1581 (0x62d) + 0x57, 0x06, 0x00, 0x00, // Offset 1623 (0x657) + 0x72, 0x06, 0x00, 0x00, // Offset 1650 (0x672) + 0x93, 0x06, 0x00, 0x00, // Offset 1683 (0x693) + 0xbd, 0x06, 0x00, 0x00, // Offset 1725 (0x6bd) + 0xe9, 0x06, 0x00, 0x00, // Offset 1769 (0x6e9) + 0x15, 0x07, 0x00, 0x00, // Offset 1813 (0x715) + 0x44, 0x07, 0x00, 0x00, // Offset 1860 (0x744) + 0x6f, 0x07, 0x00, 0x00, // Offset 1903 (0x76f) + 0x9e, 0x07, 0x00, 0x00, // Offset 1950 (0x79e) + 0xc8, 0x07, 0x00, 0x00, // Offset 1992 (0x7c8) + 0xf4, 0x07, 0x00, 0x00, // Offset 2036 (0x7f4) + 0x15, 0x08, 0x00, 0x00, // Offset 2069 (0x815) + 0x41, 0x08, 0x00, 0x00, // Offset 2113 (0x841) + 0x55, 0x08, 0x00, 0x00, // Offset 2133 (0x855) + 0x72, 0x08, 0x00, 0x00, // Offset 2162 (0x872) + 0x99, 0x08, 0x00, 0x00, // Offset 2201 (0x899) + 0xbf, 0x08, 0x00, 0x00, // Offset 2239 (0x8bf) + 0xe7, 0x08, 0x00, 0x00, // Offset 2279 (0x8e7) + 0x01, 0x09, 0x00, 0x00, // Offset 2305 (0x901) + 0x24, 0x09, 0x00, 0x00, // Offset 2340 (0x924) + 0x4f, 0x09, 0x00, 0x00, // Offset 2383 (0x94f) + 0x7a, 0x09, 0x00, 0x00, // Offset 2426 (0x97a) + 0xb5, 0x09, 0x00, 0x00, // Offset 2485 (0x9b5) + 0xf0, 0x09, 0x00, 0x00, // Offset 2544 (0x9f0) + 0x1d, 0x0a, 0x00, 0x00, // Offset 2589 (0xa1d) + 0x52, 0x0a, 0x00, 0x00, // Offset 2642 (0xa52) + 0x8d, 0x0a, 0x00, 0x00, // Offset 2701 (0xa8d) + 0xc8, 0x0a, 0x00, 0x00, // Offset 2760 (0xac8) + 0xf6, 0x0a, 0x00, 0x00, // Offset 2806 (0xaf6) + 0x2b, 0x0b, 0x00, 0x00, // Offset 2859 (0xb2b) + 0x60, 0x0b, 0x00, 0x00, // Offset 2912 (0xb60) + 0x8e, 0x0b, 0x00, 0x00, // Offset 2958 (0xb8e) + 0xbd, 0x0b, 0x00, 0x00, // Offset 3005 (0xbbd) + 0xed, 0x0b, 0x00, 0x00, // Offset 3053 (0xbed) + 0x0a, 0x0c, 0x00, 0x00, // Offset 3082 (0xc0a) + 0x2d, 0x0c, 0x00, 0x00, // Offset 3117 (0xc2d) + 0x50, 0x0c, 0x00, 0x00, // Offset 3152 (0xc50) + 0x87, 0x0c, 0x00, 0x00, // Offset 3207 (0xc87) + 0xc3, 0x0c, 0x00, 0x00, // Offset 3267 (0xcc3) + 0xff, 0x0c, 0x00, 0x00, // Offset 3327 (0xcff) + 0x26, 0x0d, 0x00, 0x00, // Offset 3366 (0xd26) + 0x55, 0x0d, 0x00, 0x00, // Offset 3413 (0xd55) + 0x89, 0x0d, 0x00, 0x00, // Offset 3465 (0xd89) + 0xbe, 0x0d, 0x00, 0x00, // Offset 3518 (0xdbe) + 0xe5, 0x0d, 0x00, 0x00, // Offset 3557 (0xde5) + 0x09, 0x0e, 0x00, 0x00, // Offset 3593 (0xe09) + 0x37, 0x0e, 0x00, 0x00, // Offset 3639 (0xe37) + 0x68, 0x0e, 0x00, 0x00, // Offset 3688 (0xe68) + 0xa9, 0x0e, 0x00, 0x00, // Offset 3753 (0xea9) + 0xc2, 0x0e, 0x00, 0x00, // Offset 3778 (0xec2) + 0xe1, 0x0e, 0x00, 0x00, // Offset 3809 (0xee1) + 0xff, 0x0e, 0x00, 0x00, // Offset 3839 (0xeff) + 0x2b, 0x0f, 0x00, 0x00, // Offset 3883 (0xf2b) + 0x50, 0x0f, 0x00, 0x00, // Offset 3920 (0xf50) + 0x88, 0x0f, 0x00, 0x00, // Offset 3976 (0xf88) + 0xa8, 0x0f, 0x00, 0x00, // Offset 4008 (0xfa8) + 0xcf, 0x0f, 0x00, 0x00, // Offset 4047 (0xfcf) + 0x03, 0x10, 0x00, 0x00, // Offset 4099 (0x1003) + 0x35, 0x10, 0x00, 0x00, // Offset 4149 (0x1035) + 0x61, 0x10, 0x00, 0x00, // Offset 4193 (0x1061) + 0x89, 0x10, 0x00, 0x00, // Offset 4233 (0x1089) + 0xb9, 0x10, 0x00, 0x00, // Offset 4281 (0x10b9) + 0xd6, 0x10, 0x00, 0x00, // Offset 4310 (0x10d6) + 0xf2, 0x10, 0x00, 0x00, // Offset 4338 (0x10f2) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x10, 0x11, 0x00, 0x00, // Offset 4368 (0x1110) + 0x1f, 0x11, 0x00, 0x00, // Offset 4383 (0x111f) + 0x2b, 0x11, 0x00, 0x00, // Offset 4395 (0x112b) + 0x3b, 0x11, 0x00, 0x00, // Offset 4411 (0x113b) + 0x51, 0x11, 0x00, 0x00, // Offset 4433 (0x1151) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x77, 0x11, 0x00, 0x00, // Offset 4471 (0x1177) + 0x8d, 0x11, 0x00, 0x00, // Offset 4493 (0x118d) + 0xb4, 0x11, 0x00, 0x00, // Offset 4532 (0x11b4) + 0xcc, 0x11, 0x00, 0x00, // Offset 4556 (0x11cc) + 0xe9, 0x11, 0x00, 0x00, // Offset 4585 (0x11e9) + 0x04, 0x12, 0x00, 0x00, // Offset 4612 (0x1204) + 0x25, 0x12, 0x00, 0x00, // Offset 4645 (0x1225) + 0x39, 0x12, 0x00, 0x00, // Offset 4665 (0x1239) + 0x57, 0x12, 0x00, 0x00, // Offset 4695 (0x1257) + 0x75, 0x12, 0x00, 0x00, // Offset 4725 (0x1275) + 0xa0, 0x12, 0x00, 0x00, // Offset 4768 (0x12a0) + 0xca, 0x12, 0x00, 0x00, // Offset 4810 (0x12ca) + 0xf6, 0x12, 0x00, 0x00, // Offset 4854 (0x12f6) + 0x1d, 0x13, 0x00, 0x00, // Offset 4893 (0x131d) + 0x47, 0x13, 0x00, 0x00, // Offset 4935 (0x1347) + 0x67, 0x13, 0x00, 0x00, // Offset 4967 (0x1367) + 0x93, 0x13, 0x00, 0x00, // Offset 5011 (0x1393) + 0xbd, 0x13, 0x00, 0x00, // Offset 5053 (0x13bd) + 0xea, 0x13, 0x00, 0x00, // Offset 5098 (0x13ea) + 0x04, 0x14, 0x00, 0x00, // Offset 5124 (0x1404) + 0x24, 0x14, 0x00, 0x00, // Offset 5156 (0x1424) + 0x4f, 0x14, 0x00, 0x00, // Offset 5199 (0x144f) + 0x81, 0x14, 0x00, 0x00, // Offset 5249 (0x1481) + 0xa1, 0x14, 0x00, 0x00, // Offset 5281 (0x14a1) + 0xc4, 0x14, 0x00, 0x00, // Offset 5316 (0x14c4) + 0xe2, 0x14, 0x00, 0x00, // Offset 5346 (0x14e2) + 0x0b, 0x15, 0x00, 0x00, // Offset 5387 (0x150b) + 0x32, 0x15, 0x00, 0x00, // Offset 5426 (0x1532) + 0x5c, 0x15, 0x00, 0x00, // Offset 5468 (0x155c) + 0x7a, 0x15, 0x00, 0x00, // Offset 5498 (0x157a) + 0xa7, 0x15, 0x00, 0x00, // Offset 5543 (0x15a7) + 0xca, 0x15, 0x00, 0x00, // Offset 5578 (0x15ca) + 0xf8, 0x15, 0x00, 0x00, // Offset 5624 (0x15f8) + 0x20, 0x16, 0x00, 0x00, // Offset 5664 (0x1620) + 0x4d, 0x16, 0x00, 0x00, // Offset 5709 (0x164d) + 0x67, 0x16, 0x00, 0x00, // Offset 5735 (0x1667) + 0x89, 0x16, 0x00, 0x00, // Offset 5769 (0x1689) + 0xb9, 0x16, 0x00, 0x00, // Offset 5817 (0x16b9) + 0xdd, 0x16, 0x00, 0x00, // Offset 5853 (0x16dd) + 0x07, 0x17, 0x00, 0x00, // Offset 5895 (0x1707) + 0x21, 0x17, 0x00, 0x00, // Offset 5921 (0x1721) + 0x41, 0x17, 0x00, 0x00, // Offset 5953 (0x1741) + 0x6b, 0x17, 0x00, 0x00, // Offset 5995 (0x176b) + 0x7d, 0x17, 0x00, 0x00, // Offset 6013 (0x177d) + 0x9c, 0x17, 0x00, 0x00, // Offset 6044 (0x179c) + 0xc4, 0x17, 0x00, 0x00, // Offset 6084 (0x17c4) + 0xdb, 0x17, 0x00, 0x00, // Offset 6107 (0x17db) + 0xfa, 0x17, 0x00, 0x00, // Offset 6138 (0x17fa) + 0x20, 0x18, 0x00, 0x00, // Offset 6176 (0x1820) + 0x47, 0x18, 0x00, 0x00, // Offset 6215 (0x1847) + 0x5f, 0x18, 0x00, 0x00, // Offset 6239 (0x185f) + 0x86, 0x18, 0x00, 0x00, // Offset 6278 (0x1886) + 0xae, 0x18, 0x00, 0x00, // Offset 6318 (0x18ae) + 0xc7, 0x18, 0x00, 0x00, // Offset 6343 (0x18c7) + 0xf1, 0x18, 0x00, 0x00, // Offset 6385 (0x18f1) + 0x1b, 0x19, 0x00, 0x00, // Offset 6427 (0x191b) + 0x37, 0x19, 0x00, 0x00, // Offset 6455 (0x1937) + 0x58, 0x19, 0x00, 0x00, // Offset 6488 (0x1958) + 0x79, 0x19, 0x00, 0x00, // Offset 6521 (0x1979) + 0xa8, 0x19, 0x00, 0x00, // Offset 6568 (0x19a8) + 0xdb, 0x19, 0x00, 0x00, // Offset 6619 (0x19db) + 0x0c, 0x1a, 0x00, 0x00, // Offset 6668 (0x1a0c) + 0x2a, 0x1a, 0x00, 0x00, // Offset 6698 (0x1a2a) + 0x3d, 0x1a, 0x00, 0x00, // Offset 6717 (0x1a3d) + 0x62, 0x1a, 0x00, 0x00, // Offset 6754 (0x1a62) + 0x7f, 0x1a, 0x00, 0x00, // Offset 6783 (0x1a7f) + 0xa2, 0x1a, 0x00, 0x00, // Offset 6818 (0x1aa2) + 0xbe, 0x1a, 0x00, 0x00, // Offset 6846 (0x1abe) + 0xe9, 0x1a, 0x00, 0x00, // Offset 6889 (0x1ae9) + 0xfc, 0x1a, 0x00, 0x00, // Offset 6908 (0x1afc) + 0x17, 0x1b, 0x00, 0x00, // Offset 6935 (0x1b17) + 0x2d, 0x1b, 0x00, 0x00, // Offset 6957 (0x1b2d) + 0x4a, 0x1b, 0x00, 0x00, // Offset 6986 (0x1b4a) + 0x65, 0x1b, 0x00, 0x00, // Offset 7013 (0x1b65) + 0x86, 0x1b, 0x00, 0x00, // Offset 7046 (0x1b86) + 0xb1, 0x1b, 0x00, 0x00, // Offset 7089 (0x1bb1) + 0xcf, 0x1b, 0x00, 0x00, // Offset 7119 (0x1bcf) + 0xef, 0x1b, 0x00, 0x00, // Offset 7151 (0x1bef) + 0x08, 0x1c, 0x00, 0x00, // Offset 7176 (0x1c08) + 0x27, 0x1c, 0x00, 0x00, // Offset 7207 (0x1c27) + 0x51, 0x1c, 0x00, 0x00, // Offset 7249 (0x1c51) + 0x70, 0x1c, 0x00, 0x00, // Offset 7280 (0x1c70) + 0x8b, 0x1c, 0x00, 0x00, // Offset 7307 (0x1c8b) + 0xa5, 0x1c, 0x00, 0x00, // Offset 7333 (0x1ca5) + 0xd1, 0x1c, 0x00, 0x00, // Offset 7377 (0x1cd1) + 0xf1, 0x1c, 0x00, 0x00, // Offset 7409 (0x1cf1) + 0x0a, 0x1d, 0x00, 0x00, // Offset 7434 (0x1d0a) + 0x33, 0x1d, 0x00, 0x00, // Offset 7475 (0x1d33) + 0x5c, 0x1d, 0x00, 0x00, // Offset 7516 (0x1d5c) + 0x7a, 0x1d, 0x00, 0x00, // Offset 7546 (0x1d7a) + 0x9e, 0x1d, 0x00, 0x00, // Offset 7582 (0x1d9e) + 0xa9, 0x1d, 0x00, 0x00, // Offset 7593 (0x1da9) + 0xb5, 0x1d, 0x00, 0x00, // Offset 7605 (0x1db5) + 0xc4, 0x1d, 0x00, 0x00, // Offset 7620 (0x1dc4) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3041 - 0x30ff + // + 40, 14, 0, 7, 66, 209, 209, 35, 56, 113, 33, 209, + 49, 150, 114, 33, 34, 65, 17, 33, 65, 33, 33, 17, + 81, 17, 50, 97, 17, 49, 113, 17, 33, 17, 81, 50, + 98, 162, 240, 64, 54, 18, 82, 240, 34, 240, 17, 240, + 33, 66, 97, 65, 19, 135, 193, 33, 65, 193, 65, 193, + 22, 147, 49, 34, 97, 17, 49, 81, 65, 33, 33, 113, + 33, 49, 17, 129, 33, 65, 145, 17, 81, 145, 17, 65, + 17, 113, 49, 33, 145, 67, 130, 211, 240, 144, 31, 15, + 0, 11, 34, 226, 97, 97, 129, 81, 145, 65, 161, 49, + 161, 49, 130, 17, 49, 49, 82, 49, 33, 97, 65, 17, + 210, 225, 240, 240, 160, 39, 19, 0, 7, 17, 240, 65, + 161, 114, 161, 97, 193, 81, 209, 65, 209, 65, 225, 49, + 225, 49, 81, 98, 17, 49, 49, 146, 49, 33, 161, 65, + 33, 240, 18, 240, 49, 0, 8, 112, 25, 12, 0, 6, + 51, 194, 130, 18, 240, 83, 65, 34, 50, 50, 113, 177, + 177, 161, 177, 161, 161, 146, 130, 240, 64, 28, 14, 66, + 226, 211, 146, 34, 240, 240, 116, 65, 50, 65, 52, 113, + 49, 161, 209, 209, 209, 193, 209, 193, 193, 193, 178, 162, + 128, 29, 14, 0, 7, 67, 211, 177, 193, 49, 81, 84, + 85, 33, 113, 65, 193, 193, 194, 177, 33, 145, 49, 129, + 65, 113, 81, 98, 101, 240, 39, 18, 81, 240, 50, 240, + 52, 225, 240, 17, 240, 113, 113, 86, 117, 50, 145, 81, + 240, 17, 242, 241, 240, 19, 226, 33, 194, 49, 178, 65, + 162, 81, 146, 113, 82, 18, 134, 240, 80, 40, 16, 0, + 8, 50, 242, 66, 129, 114, 97, 33, 82, 17, 51, 81, + 68, 241, 241, 52, 129, 18, 50, 114, 113, 82, 129, 33, + 17, 17, 129, 34, 33, 33, 65, 81, 17, 52, 113, 240, + 208, 52, 19, 240, 130, 240, 50, 240, 33, 114, 145, 50, + 66, 113, 34, 98, 33, 51, 113, 17, 52, 129, 145, 240, + 49, 240, 49, 53, 161, 18, 82, 130, 145, 98, 161, 33, + 33, 17, 161, 50, 33, 145, 65, 17, 17, 34, 66, 114, + 68, 145, 240, 240, 48, 51, 19, 240, 146, 240, 50, 240, + 33, 240, 49, 81, 193, 97, 81, 69, 65, 85, 65, 65, + 65, 49, 65, 66, 113, 65, 81, 97, 81, 82, 81, 81, + 52, 65, 97, 81, 81, 97, 161, 97, 161, 49, 49, 146, + 65, 33, 145, 98, 240, 33, 240, 240, 55, 20, 240, 17, + 130, 97, 50, 114, 98, 33, 113, 129, 161, 81, 209, 97, + 97, 69, 65, 101, 65, 65, 81, 49, 65, 66, 129, 65, + 81, 113, 81, 82, 97, 81, 52, 81, 97, 81, 97, 97, + 177, 97, 177, 49, 49, 162, 65, 33, 161, 98, 240, 49, + 240, 240, 32, 37, 16, 82, 241, 240, 17, 241, 35, 65, + 99, 119, 240, 17, 35, 179, 50, 69, 101, 65, 240, 17, + 241, 134, 33, 82, 100, 49, 162, 49, 240, 17, 240, 18, + 240, 22, 240, 96, 43, 18, 82, 113, 145, 130, 129, 65, + 49, 129, 34, 18, 65, 99, 49, 87, 240, 49, 35, 211, + 82, 69, 133, 65, 240, 49, 240, 33, 166, 33, 114, 100, + 81, 162, 81, 240, 49, 240, 50, 240, 54, 240, 160, 22, + 11, 129, 162, 145, 145, 145, 145, 130, 114, 129, 161, 178, + 177, 177, 177, 177, 177, 177, 177, 161, 192, 40, 18, 129, + 240, 34, 65, 177, 33, 50, 129, 66, 33, 113, 97, 145, + 242, 226, 241, 240, 33, 240, 50, 240, 49, 240, 49, 240, + 49, 240, 49, 240, 49, 240, 49, 240, 49, 240, 33, 240, + 176, 49, 18, 161, 129, 146, 98, 146, 81, 161, 97, 161, + 97, 164, 33, 65, 37, 34, 17, 82, 65, 81, 177, 81, + 177, 81, 33, 129, 81, 33, 129, 81, 17, 145, 81, 17, + 130, 82, 145, 113, 145, 113, 129, 129, 129, 240, 17, 240, + 17, 144, 55, 20, 161, 81, 65, 146, 66, 34, 145, 17, + 49, 33, 161, 34, 65, 161, 49, 65, 163, 81, 65, 37, + 34, 49, 82, 65, 113, 177, 113, 177, 113, 33, 129, 113, + 33, 129, 113, 17, 145, 113, 17, 130, 114, 145, 145, 145, + 145, 129, 161, 129, 240, 49, 240, 49, 176, 24, 16, 0, + 6, 50, 240, 23, 228, 162, 209, 0, 9, 17, 225, 241, + 241, 240, 17, 240, 18, 146, 90, 240, 48, 33, 19, 241, + 240, 17, 34, 242, 17, 66, 161, 135, 240, 36, 210, 240, + 17, 0, 11, 1, 240, 33, 240, 49, 240, 49, 240, 65, + 240, 66, 146, 138, 240, 144, 31, 15, 98, 225, 225, 49, + 177, 50, 145, 35, 18, 115, 73, 225, 241, 225, 149, 17, + 98, 83, 65, 130, 49, 162, 33, 226, 225, 243, 245, 240, + 64, 42, 18, 98, 97, 161, 65, 34, 129, 82, 17, 145, + 81, 177, 34, 82, 115, 121, 240, 33, 240, 49, 240, 33, + 197, 17, 146, 83, 113, 130, 97, 162, 81, 240, 34, 240, + 33, 240, 51, 240, 53, 240, 160, 27, 15, 242, 226, 225, + 225, 225, 225, 225, 210, 209, 225, 225, 225, 225, 177, 33, + 161, 49, 145, 81, 113, 99, 50, 148, 240, 112, 33, 15, + 242, 145, 66, 146, 49, 97, 49, 49, 114, 81, 129, 81, + 225, 210, 209, 225, 225, 225, 225, 177, 33, 161, 49, 145, + 81, 113, 99, 50, 148, 240, 112, 42, 19, 130, 240, 65, + 240, 50, 240, 33, 240, 49, 66, 33, 107, 23, 49, 161, + 113, 244, 225, 49, 225, 50, 209, 50, 209, 50, 227, 17, + 240, 33, 240, 49, 240, 33, 240, 33, 240, 33, 240, 33, + 192, 44, 20, 130, 97, 209, 33, 50, 178, 34, 33, 177, + 65, 225, 145, 107, 39, 49, 177, 113, 240, 20, 241, 49, + 241, 50, 225, 50, 225, 50, 243, 17, 240, 49, 240, 65, + 240, 49, 240, 49, 240, 49, 240, 49, 208, 44, 20, 240, + 240, 18, 240, 66, 240, 50, 162, 97, 194, 81, 193, 97, + 34, 129, 73, 17, 69, 33, 119, 81, 130, 33, 97, 193, + 49, 33, 193, 67, 193, 81, 209, 240, 65, 240, 81, 240, + 66, 240, 87, 240, 160, 47, 21, 240, 33, 226, 33, 34, + 210, 34, 17, 210, 49, 114, 97, 210, 81, 209, 97, 34, + 145, 73, 33, 69, 33, 135, 81, 146, 33, 97, 209, 49, + 33, 209, 67, 209, 81, 225, 240, 81, 240, 97, 240, 82, + 240, 103, 240, 192, 43, 19, 240, 242, 161, 51, 18, 148, + 49, 193, 65, 240, 33, 240, 33, 240, 33, 83, 145, 26, + 17, 52, 18, 132, 65, 177, 81, 240, 49, 240, 33, 240, + 49, 240, 65, 240, 49, 240, 66, 240, 68, 240, 144, 47, + 20, 240, 17, 226, 66, 81, 51, 18, 65, 84, 49, 49, + 145, 65, 82, 177, 113, 161, 240, 49, 83, 161, 26, 33, + 52, 18, 148, 65, 193, 81, 240, 65, 240, 49, 240, 65, + 240, 81, 240, 65, 240, 82, 240, 84, 240, 176, 42, 18, + 240, 114, 240, 34, 240, 33, 240, 33, 34, 113, 68, 150, + 69, 65, 33, 147, 81, 130, 113, 113, 129, 240, 33, 240, + 33, 240, 17, 240, 33, 65, 178, 65, 177, 81, 162, 98, + 130, 135, 240, 64, 44, 19, 241, 114, 162, 98, 97, 49, + 113, 114, 145, 34, 65, 49, 68, 166, 69, 81, 33, 147, + 97, 130, 129, 113, 145, 240, 49, 240, 49, 240, 33, 240, + 49, 65, 194, 65, 193, 81, 178, 98, 146, 135, 240, 96, + 33, 16, 66, 242, 225, 241, 241, 66, 65, 49, 51, 103, + 193, 241, 226, 225, 69, 97, 34, 81, 66, 17, 129, 51, + 145, 50, 161, 226, 210, 194, 164, 240, 112, 44, 19, 66, + 145, 130, 146, 97, 113, 49, 97, 130, 129, 66, 49, 49, + 49, 51, 151, 241, 240, 49, 240, 34, 240, 33, 69, 145, + 34, 81, 114, 17, 129, 99, 145, 98, 161, 240, 34, 240, + 18, 242, 212, 240, 208, 20, 15, 0, 17, 101, 49, 51, + 81, 36, 145, 33, 177, 225, 225, 209, 194, 178, 163, 240, + 112, 29, 19, 0, 10, 100, 195, 66, 49, 51, 145, 37, + 193, 33, 241, 240, 49, 240, 49, 240, 33, 240, 33, 240, + 18, 242, 227, 0, 10, 64, 39, 20, 240, 17, 240, 17, + 50, 242, 33, 240, 17, 240, 240, 68, 211, 66, 65, 51, + 145, 53, 193, 49, 241, 240, 65, 240, 65, 240, 49, 240, + 49, 240, 34, 240, 18, 243, 0, 8, 80, 38, 19, 0, + 6, 67, 200, 17, 84, 18, 102, 65, 161, 97, 240, 33, + 240, 49, 240, 33, 240, 49, 240, 49, 240, 49, 240, 49, + 240, 65, 240, 50, 240, 51, 240, 52, 240, 240, 192, 40, + 19, 0, 6, 67, 200, 17, 84, 18, 102, 65, 65, 81, + 97, 98, 145, 65, 49, 145, 82, 161, 113, 161, 240, 49, + 240, 49, 240, 49, 240, 65, 240, 50, 240, 51, 240, 52, + 240, 240, 192, 26, 13, 242, 194, 193, 193, 193, 193, 81, + 97, 97, 81, 66, 113, 18, 146, 146, 161, 177, 177, 193, + 193, 210, 129, 72, 240, 35, 16, 240, 50, 129, 98, 65, + 50, 81, 82, 33, 81, 97, 129, 241, 81, 145, 97, 129, + 66, 161, 18, 194, 194, 209, 225, 225, 241, 241, 240, 18, + 129, 120, 240, 96, 43, 18, 240, 130, 240, 34, 240, 17, + 240, 33, 18, 151, 67, 81, 33, 145, 113, 131, 81, 129, + 33, 81, 113, 129, 129, 113, 129, 114, 129, 98, 145, 97, + 161, 200, 145, 81, 34, 114, 65, 49, 148, 240, 160, 43, + 17, 240, 240, 65, 240, 33, 240, 18, 101, 65, 82, 67, + 33, 162, 49, 161, 81, 240, 17, 240, 17, 240, 17, 33, + 209, 33, 209, 17, 49, 161, 17, 49, 162, 65, 177, 82, + 145, 119, 33, 240, 240, 32, 59, 19, 240, 210, 240, 50, + 240, 33, 161, 113, 177, 70, 129, 34, 17, 66, 97, 17, + 49, 97, 97, 49, 113, 82, 49, 129, 49, 17, 33, 145, + 33, 33, 18, 145, 33, 50, 161, 17, 65, 161, 33, 49, + 17, 54, 49, 33, 33, 33, 65, 17, 50, 97, 49, 34, + 179, 65, 240, 240, 144, 59, 20, 66, 240, 66, 240, 49, + 240, 65, 240, 65, 240, 65, 17, 52, 81, 36, 34, 66, + 66, 33, 33, 113, 129, 17, 145, 114, 161, 113, 177, 98, + 177, 81, 17, 177, 65, 33, 161, 65, 49, 86, 49, 17, + 33, 65, 82, 33, 33, 17, 65, 65, 18, 82, 84, 49, + 81, 240, 65, 240, 45, 19, 0, 8, 6, 178, 17, 66, + 129, 50, 66, 97, 65, 98, 65, 81, 113, 49, 81, 130, + 33, 81, 145, 17, 81, 161, 17, 81, 161, 17, 65, 161, + 49, 49, 161, 52, 161, 97, 161, 240, 18, 227, 240, 240, + 240, 53, 18, 240, 49, 162, 97, 162, 82, 145, 97, 161, + 97, 65, 81, 34, 33, 73, 49, 97, 65, 81, 177, 81, + 177, 81, 177, 81, 33, 129, 81, 33, 129, 81, 17, 145, + 81, 17, 71, 67, 49, 81, 18, 49, 65, 66, 34, 33, + 85, 65, 33, 240, 240, 64, 59, 20, 240, 17, 49, 162, + 17, 34, 33, 161, 34, 17, 34, 146, 33, 65, 161, 129, + 65, 81, 34, 65, 73, 81, 97, 65, 113, 177, 113, 177, + 113, 177, 113, 33, 129, 113, 33, 129, 113, 17, 145, 113, + 17, 71, 99, 49, 81, 18, 81, 65, 66, 34, 65, 85, + 65, 65, 240, 240, 128, 59, 20, 240, 18, 33, 162, 33, + 33, 33, 162, 17, 33, 34, 145, 50, 49, 161, 129, 65, + 81, 34, 65, 73, 81, 97, 65, 113, 177, 113, 177, 113, + 177, 113, 33, 129, 113, 33, 129, 113, 17, 145, 113, 17, + 71, 99, 49, 81, 18, 81, 65, 66, 34, 65, 85, 65, + 65, 240, 240, 128, 46, 19, 240, 240, 241, 65, 179, 65, + 98, 18, 17, 97, 98, 33, 113, 145, 130, 129, 129, 17, + 97, 145, 18, 81, 145, 34, 49, 161, 49, 49, 145, 129, + 145, 129, 145, 129, 129, 145, 129, 161, 97, 178, 65, 228, + 240, 224, 53, 20, 240, 17, 240, 82, 129, 65, 81, 99, + 65, 33, 66, 18, 17, 97, 34, 50, 33, 113, 49, 97, + 130, 145, 129, 17, 113, 145, 18, 97, 145, 34, 65, 161, + 49, 65, 145, 145, 145, 145, 145, 145, 129, 161, 129, 177, + 97, 194, 65, 244, 240, 240, 16, 53, 20, 240, 240, 98, + 145, 65, 33, 33, 99, 65, 33, 33, 18, 18, 17, 97, + 34, 50, 33, 113, 161, 130, 145, 129, 17, 113, 145, 18, + 97, 145, 34, 65, 161, 49, 65, 145, 145, 145, 145, 145, + 145, 129, 161, 129, 177, 97, 194, 65, 244, 240, 240, 16, + 46, 19, 240, 177, 240, 65, 240, 65, 240, 50, 240, 18, + 240, 17, 240, 33, 240, 49, 240, 65, 240, 65, 240, 54, + 178, 17, 66, 49, 50, 65, 81, 49, 17, 97, 82, 35, + 97, 52, 49, 53, 97, 49, 82, 0, 5, 112, 47, 19, + 240, 177, 113, 177, 114, 161, 49, 49, 162, 50, 178, 81, + 161, 240, 33, 240, 49, 240, 65, 240, 65, 240, 54, 178, + 17, 66, 49, 50, 65, 81, 49, 17, 97, 82, 35, 97, + 52, 49, 53, 97, 49, 82, 0, 5, 112, 48, 19, 240, + 177, 240, 65, 82, 193, 49, 33, 178, 33, 33, 162, 66, + 161, 240, 33, 240, 49, 240, 65, 240, 65, 240, 54, 178, + 17, 66, 49, 50, 65, 81, 49, 17, 97, 82, 35, 97, + 52, 49, 53, 97, 49, 82, 0, 5, 112, 29, 19, 0, + 12, 66, 240, 17, 33, 225, 65, 209, 65, 193, 97, 147, + 113, 145, 146, 240, 50, 240, 50, 240, 51, 240, 50, 0, + 9, 80, 35, 19, 240, 240, 65, 240, 66, 225, 49, 242, + 130, 129, 113, 33, 225, 65, 209, 65, 193, 97, 147, 113, + 145, 146, 240, 50, 240, 50, 240, 51, 240, 50, 0, 9, + 80, 35, 19, 0, 6, 50, 240, 17, 33, 241, 33, 130, + 98, 129, 33, 225, 65, 209, 65, 193, 97, 147, 113, 145, + 146, 240, 50, 240, 50, 240, 51, 240, 50, 0, 9, 80, + 55, 18, 240, 49, 240, 49, 81, 53, 50, 84, 33, 65, + 146, 97, 161, 82, 97, 49, 81, 82, 65, 18, 33, 104, + 49, 177, 81, 177, 81, 33, 129, 81, 33, 129, 81, 17, + 145, 81, 17, 71, 66, 65, 81, 18, 34, 65, 81, 34, + 33, 85, 65, 33, 240, 240, 64, 60, 20, 240, 81, 240, + 81, 81, 52, 17, 66, 84, 82, 33, 146, 33, 33, 33, + 161, 50, 49, 97, 49, 65, 34, 66, 65, 18, 65, 104, + 81, 177, 113, 177, 113, 33, 129, 113, 33, 129, 113, 17, + 145, 113, 17, 71, 98, 65, 81, 18, 66, 65, 81, 34, + 65, 85, 65, 65, 240, 240, 128, 60, 20, 240, 81, 240, + 81, 81, 52, 18, 50, 84, 49, 33, 33, 146, 33, 33, + 33, 161, 50, 49, 97, 49, 114, 66, 65, 18, 65, 104, + 81, 177, 113, 177, 113, 33, 129, 113, 33, 129, 113, 17, + 145, 113, 17, 71, 98, 65, 81, 18, 66, 65, 81, 34, + 65, 85, 65, 65, 240, 240, 128, 39, 17, 114, 240, 18, + 241, 248, 39, 17, 67, 49, 81, 49, 193, 193, 49, 162, + 65, 35, 105, 209, 240, 17, 240, 17, 240, 17, 240, 17, + 185, 98, 81, 36, 65, 81, 81, 85, 240, 176, 47, 19, + 240, 240, 177, 81, 215, 194, 49, 240, 33, 240, 49, 65, + 209, 82, 161, 98, 161, 97, 136, 33, 98, 33, 83, 81, + 49, 113, 17, 49, 65, 113, 33, 33, 49, 113, 50, 35, + 129, 65, 193, 240, 33, 240, 18, 240, 208, 52, 19, 240, + 115, 240, 50, 240, 33, 240, 49, 17, 178, 52, 82, 69, + 113, 33, 113, 113, 49, 97, 113, 17, 17, 50, 17, 113, + 34, 33, 34, 113, 49, 33, 49, 113, 97, 49, 129, 81, + 33, 145, 99, 161, 97, 177, 97, 177, 113, 130, 152, 240, + 160, 53, 19, 240, 210, 240, 50, 240, 33, 161, 113, 161, + 70, 145, 18, 33, 50, 114, 65, 81, 97, 65, 113, 65, + 17, 49, 113, 49, 33, 33, 145, 33, 50, 161, 17, 81, + 161, 17, 65, 17, 129, 33, 65, 33, 113, 49, 33, 146, + 82, 130, 227, 240, 240, 240, 39, 15, 66, 226, 210, 209, + 145, 65, 163, 17, 197, 145, 17, 177, 33, 177, 33, 97, + 81, 17, 113, 86, 49, 81, 145, 65, 145, 65, 145, 65, + 145, 65, 129, 97, 113, 113, 66, 148, 80, 36, 16, 0, + 8, 97, 240, 19, 129, 81, 161, 49, 20, 113, 34, 65, + 99, 113, 65, 17, 129, 19, 33, 49, 49, 49, 65, 51, + 145, 240, 17, 241, 242, 241, 241, 240, 128, 46, 19, 240, + 178, 240, 66, 240, 35, 146, 65, 210, 100, 145, 50, 66, + 113, 18, 129, 98, 161, 17, 34, 17, 161, 20, 49, 33, + 66, 49, 81, 52, 193, 240, 49, 240, 65, 240, 49, 240, + 50, 240, 49, 240, 49, 240, 192, 49, 15, 0, 8, 50, + 193, 33, 177, 33, 81, 65, 20, 81, 50, 33, 18, 49, + 34, 49, 49, 33, 17, 17, 49, 49, 33, 17, 17, 49, + 49, 34, 33, 49, 49, 49, 33, 49, 49, 49, 49, 33, + 33, 65, 69, 177, 225, 209, 209, 128, 65, 19, 240, 211, + 241, 49, 209, 65, 97, 97, 21, 97, 67, 49, 18, 66, + 34, 81, 49, 50, 17, 17, 81, 49, 49, 33, 17, 81, + 65, 33, 17, 33, 81, 65, 33, 17, 33, 81, 65, 33, + 17, 49, 49, 65, 50, 65, 49, 65, 50, 81, 33, 34, + 81, 101, 113, 113, 240, 49, 240, 33, 240, 33, 240, 18, + 176, 25, 12, 0, 8, 17, 193, 178, 161, 177, 34, 115, + 145, 177, 177, 177, 103, 65, 81, 18, 33, 81, 49, 37, + 65, 208, 31, 15, 97, 241, 226, 209, 225, 225, 65, 145, + 21, 131, 193, 225, 225, 225, 225, 225, 136, 98, 81, 19, + 49, 97, 66, 17, 82, 81, 37, 240, 144, 30, 14, 49, + 226, 226, 210, 149, 114, 177, 209, 209, 193, 209, 69, 65, + 34, 82, 33, 17, 129, 34, 161, 33, 161, 193, 209, 163, + 116, 240, 80, 44, 13, 1, 209, 67, 82, 33, 49, 65, + 33, 81, 49, 17, 97, 49, 17, 113, 33, 17, 113, 17, + 17, 129, 17, 17, 129, 17, 17, 129, 19, 129, 33, 129, + 49, 129, 49, 129, 177, 193, 177, 177, 177, 162, 112, 37, + 16, 240, 177, 113, 69, 116, 49, 145, 65, 225, 225, 225, + 225, 225, 21, 131, 82, 82, 145, 50, 177, 18, 193, 18, + 193, 100, 81, 81, 65, 49, 98, 49, 18, 134, 240, 96, + 56, 20, 66, 240, 66, 240, 49, 240, 65, 240, 65, 240, + 67, 51, 98, 19, 17, 18, 49, 98, 34, 17, 81, 161, + 17, 97, 162, 113, 161, 113, 162, 113, 145, 17, 97, 145, + 33, 97, 129, 49, 97, 114, 49, 97, 81, 17, 65, 113, + 49, 81, 17, 131, 114, 240, 49, 240, 32, 16, 240, 177, + 113, 69, 116, 49, 145, 65, 225, 225, 225, 225, 225, 21, + 131, 82, 82, 145, 50, 177, 18, 193, 17, 209, 225, 225, + 210, 164, 240, 112, 39, 15, 0, 7, 114, 226, 209, 226, + 146, 18, 52, 66, 17, 18, 65, 98, 113, 81, 129, 66, + 129, 49, 17, 129, 33, 33, 129, 18, 33, 113, 33, 17, + 17, 82, 98, 50, 129, 240, 176, 52, 19, 66, 240, 50, + 240, 34, 240, 33, 240, 49, 240, 51, 178, 19, 17, 36, + 98, 34, 18, 66, 129, 17, 129, 114, 145, 113, 177, 82, + 177, 65, 17, 177, 49, 33, 161, 49, 49, 161, 34, 49, + 145, 49, 65, 114, 113, 17, 67, 162, 240, 33, 224, 50, + 18, 240, 209, 161, 68, 164, 33, 193, 65, 240, 17, 240, + 33, 240, 17, 247, 146, 17, 82, 97, 49, 113, 65, 49, + 129, 49, 65, 145, 17, 65, 161, 17, 49, 177, 17, 49, + 67, 49, 33, 33, 65, 49, 33, 50, 81, 66, 196, 240, + 128, 44, 18, 240, 209, 184, 177, 49, 240, 17, 240, 17, + 240, 21, 178, 82, 114, 145, 97, 50, 81, 145, 33, 49, + 161, 33, 18, 196, 225, 242, 241, 116, 81, 18, 50, 65, + 34, 65, 17, 98, 17, 97, 82, 241, 80, 40, 16, 81, + 240, 18, 225, 241, 145, 65, 35, 88, 145, 49, 113, 97, + 130, 68, 82, 66, 49, 34, 82, 82, 98, 67, 113, 65, + 33, 177, 49, 161, 65, 145, 241, 240, 17, 240, 24, 240, + 80, 48, 19, 240, 178, 240, 50, 240, 33, 240, 33, 240, + 49, 240, 33, 240, 49, 240, 33, 240, 49, 240, 33, 18, + 242, 33, 129, 66, 65, 113, 65, 81, 113, 49, 97, 97, + 65, 97, 97, 49, 129, 65, 50, 129, 49, 65, 163, 240, + 144, 29, 15, 240, 193, 83, 65, 33, 99, 49, 98, 240, + 229, 97, 18, 81, 82, 113, 225, 225, 225, 225, 209, 225, + 209, 194, 193, 240, 240, 160, 28, 13, 0, 11, 97, 193, + 193, 180, 49, 66, 49, 49, 65, 49, 65, 33, 65, 35, + 33, 65, 97, 81, 97, 65, 178, 240, 240, 48, 30, 13, + 0, 9, 1, 209, 81, 97, 81, 97, 18, 17, 54, 49, + 113, 65, 113, 66, 97, 66, 97, 66, 97, 81, 81, 193, + 177, 240, 240, 32, 15, 8, 65, 49, 65, 49, 50, 34, + 49, 49, 49, 49, 0, 14, 80, 12, 6, 211, 33, 49, + 17, 49, 17, 49, 35, 0, 10, 16, 9, 240, 240, 241, + 145, 145, 145, 145, 146, 130, 84, 50, 0, 7, 48, 22, + 13, 240, 240, 81, 145, 50, 130, 33, 17, 113, 81, 209, + 209, 209, 210, 194, 148, 114, 0, 10, 112, 38, 15, 240, + 81, 226, 209, 34, 161, 67, 97, 84, 81, 129, 81, 209, + 36, 129, 17, 65, 114, 82, 82, 98, 81, 113, 97, 113, + 81, 114, 66, 113, 82, 97, 161, 33, 194, 240, 128, 22, + 14, 0, 11, 98, 45, 34, 113, 129, 49, 161, 17, 177, + 209, 209, 193, 209, 193, 193, 193, 240, 160, 39, 18, 0, + 6, 18, 49, 121, 39, 98, 66, 145, 177, 65, 210, 17, + 226, 240, 17, 240, 18, 240, 17, 240, 33, 240, 17, 240, + 33, 240, 17, 240, 33, 240, 17, 240, 17, 240, 240, 32, + 24, 13, 0, 9, 49, 194, 162, 162, 162, 162, 161, 18, + 129, 50, 82, 65, 66, 97, 193, 193, 193, 193, 240, 32, + 29, 16, 193, 240, 17, 242, 210, 210, 210, 210, 210, 209, + 33, 162, 50, 129, 81, 114, 97, 82, 129, 241, 241, 241, + 241, 241, 241, 240, 96, 27, 14, 0, 7, 82, 210, 193, + 209, 65, 34, 56, 36, 97, 49, 145, 49, 145, 49, 129, + 209, 193, 193, 193, 178, 162, 240, 128, 33, 17, 240, 130, + 240, 18, 241, 145, 97, 97, 49, 74, 37, 129, 49, 193, + 49, 178, 49, 177, 65, 162, 241, 241, 240, 17, 241, 241, + 241, 226, 210, 240, 208, 20, 16, 0, 15, 49, 107, 97, + 49, 242, 225, 241, 241, 241, 217, 37, 130, 33, 0, 5, + 96, 30, 19, 0, 11, 2, 125, 113, 65, 240, 50, 240, + 34, 240, 33, 240, 49, 240, 49, 240, 49, 240, 49, 240, + 42, 39, 146, 49, 0, 9, 16, 30, 15, 0, 8, 49, + 242, 209, 225, 225, 49, 46, 33, 82, 193, 17, 177, 33, + 161, 49, 145, 65, 129, 81, 98, 49, 33, 195, 209, 240, + 112, 43, 19, 161, 240, 65, 240, 50, 240, 33, 240, 49, + 240, 49, 50, 47, 3, 50, 98, 240, 19, 242, 17, 226, + 33, 210, 49, 194, 65, 178, 81, 161, 113, 145, 129, 114, + 97, 33, 240, 19, 240, 33, 240, 192, 42, 18, 240, 162, + 240, 34, 240, 17, 240, 33, 240, 33, 97, 169, 25, 97, + 66, 49, 113, 145, 113, 130, 98, 129, 113, 130, 113, 129, + 114, 113, 129, 113, 130, 97, 82, 33, 97, 131, 81, 161, + 240, 144, 44, 20, 240, 17, 162, 130, 146, 65, 49, 145, + 98, 177, 113, 177, 97, 201, 57, 97, 98, 49, 113, 177, + 113, 162, 98, 161, 113, 162, 113, 161, 114, 145, 129, 145, + 130, 129, 82, 33, 129, 131, 113, 161, 240, 208, 39, 19, + 240, 162, 240, 50, 240, 49, 240, 49, 51, 197, 121, 178, + 81, 240, 49, 97, 177, 38, 148, 195, 33, 133, 81, 146, + 113, 240, 50, 240, 49, 240, 49, 240, 50, 240, 33, 240, + 176, 42, 20, 240, 17, 146, 97, 34, 130, 98, 17, 145, + 113, 177, 51, 213, 137, 194, 81, 240, 65, 97, 193, 38, + 164, 211, 33, 149, 81, 162, 113, 240, 66, 240, 65, 240, + 65, 240, 66, 240, 49, 240, 208, 32, 16, 240, 98, 242, + 225, 97, 114, 38, 82, 18, 65, 97, 114, 81, 129, 81, + 130, 65, 145, 65, 145, 241, 225, 225, 225, 225, 225, 210, + 194, 240, 224, 44, 19, 241, 130, 146, 114, 97, 33, 113, + 130, 114, 37, 33, 98, 18, 65, 145, 114, 129, 129, 129, + 130, 113, 145, 113, 145, 240, 49, 240, 33, 240, 33, 240, + 33, 240, 33, 240, 33, 240, 18, 242, 240, 240, 80, 42, + 19, 240, 146, 240, 50, 240, 33, 240, 34, 240, 33, 130, + 114, 57, 85, 33, 161, 114, 129, 129, 129, 130, 113, 145, + 240, 49, 240, 33, 240, 49, 240, 33, 240, 33, 240, 33, + 240, 18, 240, 240, 32, 45, 20, 240, 17, 130, 97, 50, + 114, 98, 33, 113, 129, 146, 240, 49, 130, 130, 57, 101, + 33, 177, 114, 145, 129, 145, 130, 129, 145, 240, 65, 240, + 49, 240, 65, 240, 49, 240, 49, 240, 49, 240, 34, 240, + 240, 64, 26, 17, 0, 10, 33, 63, 50, 161, 240, 17, + 241, 240, 17, 240, 17, 241, 240, 17, 240, 17, 78, 66, + 161, 0, 8, 112, 32, 19, 241, 241, 50, 226, 33, 241, + 240, 158, 98, 161, 240, 49, 240, 33, 240, 49, 240, 49, + 240, 33, 240, 49, 240, 49, 110, 98, 161, 0, 10, 16, + 43, 19, 240, 242, 162, 98, 162, 97, 177, 97, 177, 97, + 33, 33, 81, 41, 26, 49, 97, 65, 97, 177, 82, 177, + 81, 178, 81, 193, 81, 240, 33, 240, 49, 240, 33, 240, + 33, 240, 33, 240, 18, 240, 240, 50, 20, 240, 17, 226, + 17, 34, 82, 98, 18, 17, 98, 97, 33, 145, 97, 193, + 97, 33, 49, 81, 41, 42, 49, 113, 65, 97, 193, 82, + 193, 81, 194, 81, 209, 81, 240, 49, 240, 65, 240, 49, + 240, 49, 240, 49, 240, 34, 240, 240, 32, 32, 17, 0, + 6, 82, 240, 34, 240, 18, 240, 17, 240, 161, 18, 193, + 66, 145, 98, 113, 129, 97, 241, 241, 241, 226, 145, 50, + 196, 225, 240, 240, 16, 35, 17, 240, 241, 209, 50, 50, + 114, 33, 82, 97, 146, 240, 17, 240, 161, 18, 193, 66, + 145, 98, 113, 129, 97, 241, 241, 241, 226, 145, 50, 196, + 225, 240, 240, 16, 30, 17, 0, 7, 113, 108, 99, 82, + 226, 241, 242, 226, 241, 241, 33, 193, 65, 161, 97, 129, + 129, 97, 146, 65, 178, 18, 194, 240, 240, 80, 41, 19, + 241, 240, 17, 34, 242, 17, 209, 33, 92, 131, 82, 240, + 18, 240, 33, 240, 34, 240, 18, 240, 33, 240, 33, 33, + 225, 65, 193, 97, 161, 129, 129, 146, 97, 178, 50, 194, + 240, 240, 176, 39, 19, 240, 240, 210, 240, 50, 240, 33, + 240, 49, 240, 49, 114, 145, 56, 116, 82, 39, 113, 82, + 49, 82, 177, 65, 209, 240, 49, 240, 49, 240, 49, 240, + 66, 82, 183, 240, 240, 192, 42, 20, 240, 17, 240, 82, + 98, 113, 49, 114, 114, 145, 145, 145, 240, 65, 114, 161, + 56, 132, 82, 55, 113, 98, 49, 82, 193, 65, 225, 240, + 65, 240, 65, 240, 65, 240, 82, 82, 199, 240, 240, 240, + 30, 15, 240, 240, 177, 49, 177, 49, 162, 49, 146, 65, + 129, 82, 98, 97, 97, 113, 82, 209, 209, 225, 209, 209, + 209, 209, 209, 194, 240, 176, 45, 19, 241, 240, 17, 34, + 193, 34, 17, 17, 177, 33, 65, 162, 113, 146, 129, 129, + 146, 98, 161, 97, 177, 82, 240, 33, 240, 33, 240, 49, + 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, 18, + 240, 240, 64, 35, 16, 240, 98, 242, 225, 97, 114, 38, + 97, 18, 65, 97, 129, 81, 130, 65, 19, 81, 65, 82, + 34, 49, 114, 17, 226, 225, 225, 225, 225, 210, 194, 194, + 240, 224, 46, 19, 241, 130, 146, 114, 97, 33, 113, 130, + 114, 38, 17, 113, 18, 65, 145, 129, 129, 130, 113, 19, + 81, 113, 82, 34, 97, 114, 17, 240, 34, 240, 33, 240, + 33, 240, 33, 240, 33, 240, 18, 242, 242, 240, 240, 80, + 40, 19, 240, 240, 33, 245, 179, 211, 35, 240, 33, 240, + 49, 249, 55, 33, 83, 34, 97, 240, 49, 240, 34, 240, + 33, 240, 49, 240, 33, 240, 49, 240, 33, 240, 33, 240, + 33, 240, 240, 48, 45, 20, 240, 17, 241, 66, 180, 17, + 33, 131, 98, 99, 35, 81, 193, 240, 65, 240, 25, 71, + 33, 83, 50, 97, 240, 65, 240, 50, 240, 49, 240, 65, + 240, 49, 240, 65, 240, 49, 240, 49, 240, 49, 240, 240, + 80, 26, 14, 0, 11, 1, 225, 65, 49, 81, 66, 33, + 65, 65, 65, 114, 65, 113, 193, 209, 193, 193, 193, 193, + 178, 240, 128, 34, 16, 240, 240, 113, 97, 145, 97, 33, + 81, 98, 33, 81, 81, 65, 65, 81, 65, 65, 66, 65, + 145, 226, 225, 225, 241, 225, 225, 225, 225, 210, 194, 240, + 208, 48, 19, 241, 240, 17, 34, 97, 130, 17, 113, 81, + 33, 49, 81, 97, 97, 81, 82, 97, 65, 81, 113, 65, + 66, 113, 145, 240, 34, 240, 33, 240, 33, 240, 49, 240, + 33, 240, 33, 240, 33, 240, 33, 240, 18, 242, 240, 240, + 64, 36, 19, 0, 6, 34, 140, 130, 0, 7, 41, 55, + 33, 83, 34, 98, 240, 33, 240, 34, 240, 33, 240, 49, + 240, 33, 240, 49, 240, 33, 240, 33, 240, 33, 240, 240, + 48, 42, 21, 240, 33, 240, 98, 210, 81, 76, 17, 130, + 178, 240, 81, 240, 249, 87, 33, 83, 66, 98, 240, 65, + 240, 66, 240, 65, 240, 81, 240, 65, 240, 81, 240, 65, + 240, 65, 240, 65, 240, 240, 112, 26, 10, 2, 146, 130, + 129, 145, 145, 145, 145, 147, 113, 35, 65, 67, 33, 97, + 33, 145, 145, 145, 130, 130, 145, 240, 48, 32, 13, 2, + 194, 97, 66, 114, 33, 81, 49, 33, 98, 65, 113, 65, + 193, 195, 161, 35, 113, 67, 81, 97, 81, 193, 193, 193, + 178, 178, 193, 240, 144, 42, 19, 240, 194, 240, 50, 240, + 33, 240, 49, 240, 49, 240, 25, 55, 33, 83, 34, 97, + 240, 49, 240, 33, 240, 49, 240, 49, 240, 33, 240, 49, + 240, 33, 240, 49, 240, 33, 240, 33, 240, 240, 48, 18, + 19, 0, 12, 33, 130, 140, 130, 0, 15, 113, 105, 70, + 131, 49, 0, 9, 16, 31, 16, 240, 240, 241, 167, 54, + 81, 82, 113, 226, 225, 162, 33, 210, 242, 209, 33, 177, + 65, 145, 82, 113, 114, 66, 145, 49, 210, 0, 5, 96, + 40, 17, 98, 240, 34, 240, 17, 240, 65, 198, 86, 50, + 113, 98, 226, 226, 226, 226, 19, 161, 33, 50, 113, 49, + 67, 50, 65, 97, 18, 97, 240, 17, 240, 17, 240, 17, + 240, 17, 240, 160, 23, 16, 240, 240, 226, 242, 225, 226, + 225, 226, 225, 225, 241, 225, 225, 225, 225, 225, 225, 210, + 194, 240, 240, 31, 20, 0, 11, 49, 209, 97, 210, 81, + 193, 113, 177, 129, 146, 129, 145, 161, 113, 178, 97, 193, + 81, 210, 49, 241, 18, 240, 17, 0, 10, 16, 38, 20, + 240, 240, 97, 240, 17, 50, 242, 33, 193, 49, 145, 97, + 210, 81, 193, 113, 177, 129, 146, 129, 145, 161, 113, 178, + 97, 193, 81, 210, 49, 241, 18, 240, 17, 0, 10, 16, + 39, 20, 240, 240, 98, 240, 33, 33, 240, 17, 33, 193, + 66, 113, 97, 210, 81, 193, 113, 177, 129, 146, 129, 145, + 161, 113, 178, 97, 193, 81, 210, 49, 241, 18, 240, 17, + 0, 10, 16, 24, 14, 226, 210, 194, 193, 209, 209, 145, + 49, 101, 39, 113, 209, 209, 209, 209, 209, 209, 226, 114, + 88, 240, 240, 39, 18, 225, 50, 210, 34, 145, 49, 34, + 162, 65, 193, 65, 240, 33, 145, 113, 101, 103, 177, 240, + 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, 33, 240, + 50, 114, 152, 240, 240, 192, 40, 18, 240, 50, 194, 50, + 161, 33, 34, 161, 33, 33, 194, 49, 240, 33, 145, 113, + 101, 103, 177, 240, 33, 240, 33, 240, 33, 240, 33, 240, + 33, 240, 33, 240, 50, 114, 152, 240, 240, 192, 25, 17, + 0, 8, 17, 33, 120, 24, 97, 50, 177, 242, 241, 242, + 241, 242, 241, 241, 241, 241, 241, 226, 210, 240, 224, 42, + 19, 241, 240, 17, 34, 242, 17, 225, 17, 49, 119, 72, + 81, 98, 161, 240, 49, 240, 34, 240, 33, 240, 34, 240, + 33, 240, 33, 240, 49, 240, 33, 240, 33, 240, 33, 240, + 18, 242, 240, 240, 48, 42, 19, 242, 240, 17, 33, 241, + 33, 225, 18, 33, 119, 72, 81, 98, 161, 240, 49, 240, + 34, 240, 33, 240, 34, 240, 33, 240, 33, 240, 49, 240, + 33, 240, 33, 240, 33, 240, 18, 242, 240, 240, 48, 28, + 19, 0, 10, 33, 240, 35, 240, 17, 33, 225, 65, 193, + 97, 161, 129, 115, 145, 113, 177, 240, 66, 240, 51, 240, + 49, 0, 12, 33, 19, 240, 240, 65, 240, 66, 225, 49, + 113, 114, 131, 113, 129, 33, 225, 65, 193, 97, 161, 129, + 115, 145, 113, 177, 240, 66, 240, 51, 240, 49, 0, 12, + 33, 19, 0, 6, 66, 240, 17, 33, 129, 97, 33, 115, + 98, 129, 33, 225, 65, 193, 97, 161, 129, 115, 145, 113, + 177, 240, 66, 240, 51, 240, 49, 0, 12, 47, 18, 240, + 162, 240, 34, 240, 18, 240, 17, 240, 33, 240, 39, 57, + 83, 50, 65, 240, 33, 240, 33, 49, 129, 65, 65, 114, + 49, 81, 97, 65, 97, 65, 81, 98, 33, 97, 113, 17, + 81, 17, 240, 18, 240, 17, 240, 208, 51, 20, 240, 17, + 162, 81, 34, 146, 82, 17, 146, 97, 177, 240, 65, 240, + 71, 89, 83, 82, 65, 240, 65, 240, 65, 49, 161, 65, + 65, 146, 49, 81, 129, 65, 97, 97, 81, 98, 65, 97, + 113, 49, 81, 17, 240, 50, 240, 49, 240, 240, 32, 49, + 19, 242, 146, 81, 33, 146, 65, 33, 146, 82, 161, 240, + 49, 240, 55, 73, 83, 66, 65, 240, 49, 240, 49, 49, + 145, 65, 65, 130, 49, 81, 113, 65, 97, 81, 81, 98, + 49, 97, 113, 33, 81, 17, 240, 34, 240, 33, 240, 240, + 30, 19, 0, 11, 65, 185, 25, 82, 82, 161, 240, 33, + 240, 33, 240, 33, 194, 34, 242, 240, 66, 240, 50, 240, + 50, 240, 49, 0, 7, 112, 19, 12, 240, 178, 195, 194, + 179, 177, 242, 195, 179, 178, 177, 227, 195, 194, 179, 178, + 177, 37, 18, 240, 240, 210, 240, 34, 240, 17, 240, 18, + 240, 17, 240, 33, 240, 17, 240, 33, 240, 33, 65, 177, + 98, 145, 129, 113, 161, 97, 57, 24, 129, 34, 209, 0, + 6, 112, 29, 16, 240, 240, 226, 242, 225, 226, 225, 226, + 130, 65, 178, 18, 210, 225, 17, 193, 49, 161, 66, 129, + 97, 113, 225, 210, 194, 240, 240, 35, 19, 0, 8, 82, + 125, 114, 33, 240, 50, 240, 33, 240, 49, 98, 161, 40, + 26, 162, 65, 240, 49, 240, 49, 240, 49, 240, 49, 240, + 65, 98, 183, 240, 240, 176, 28, 16, 0, 10, 66, 242, + 241, 241, 97, 129, 38, 85, 49, 52, 33, 65, 81, 65, + 49, 193, 241, 241, 240, 17, 241, 241, 240, 128, 43, 19, + 240, 146, 240, 19, 240, 49, 240, 49, 145, 145, 70, 129, + 19, 50, 131, 81, 70, 17, 81, 98, 81, 49, 225, 33, + 241, 240, 65, 240, 49, 240, 49, 240, 50, 240, 49, 240, + 49, 240, 49, 240, 192, 19, 15, 0, 16, 17, 121, 113, + 81, 225, 210, 209, 225, 168, 52, 115, 33, 240, 240, 208, + 27, 19, 0, 11, 17, 140, 130, 97, 240, 49, 240, 34, + 240, 33, 240, 49, 240, 33, 240, 49, 234, 54, 147, 34, + 0, 11, 64, 22, 14, 0, 11, 113, 60, 50, 113, 209, + 193, 89, 97, 97, 193, 209, 209, 75, 66, 113, 240, 240, + 16, 29, 17, 0, 8, 17, 63, 50, 161, 240, 17, 240, + 17, 241, 92, 98, 129, 240, 17, 241, 240, 17, 240, 17, + 78, 66, 161, 0, 6, 96, 27, 17, 240, 210, 108, 98, + 240, 240, 209, 33, 135, 25, 81, 50, 177, 242, 241, 242, + 241, 241, 241, 241, 241, 226, 210, 240, 208, 33, 12, 240, + 82, 34, 114, 34, 113, 49, 113, 49, 113, 49, 113, 49, + 113, 49, 113, 49, 97, 65, 97, 65, 97, 162, 161, 161, + 177, 161, 161, 146, 240, 64, 43, 20, 0, 6, 18, 240, + 66, 194, 66, 210, 49, 226, 49, 225, 65, 225, 65, 225, + 65, 210, 65, 113, 81, 81, 97, 97, 81, 81, 97, 97, + 65, 113, 97, 49, 113, 113, 18, 113, 131, 113, 161, 0, + 6, 30, 15, 240, 242, 226, 225, 225, 225, 225, 225, 209, + 177, 33, 161, 49, 145, 65, 129, 81, 113, 97, 82, 113, + 66, 129, 34, 149, 178, 240, 192, 32, 17, 0, 8, 65, + 209, 49, 104, 40, 81, 49, 193, 49, 193, 49, 193, 65, + 162, 65, 161, 81, 161, 81, 161, 81, 161, 92, 81, 161, + 0, 6, 96, 25, 13, 0, 9, 97, 145, 49, 70, 37, + 65, 49, 129, 49, 114, 49, 113, 193, 177, 193, 177, 177, + 177, 162, 240, 96, 31, 16, 240, 240, 33, 193, 49, 88, + 38, 97, 49, 177, 49, 177, 49, 162, 49, 161, 65, 146, + 225, 241, 225, 241, 225, 225, 225, 210, 194, 240, 192, 42, + 19, 240, 210, 240, 50, 240, 33, 240, 49, 240, 38, 103, + 17, 50, 113, 81, 209, 65, 210, 49, 209, 65, 209, 41, + 40, 33, 82, 34, 113, 240, 49, 240, 49, 240, 34, 240, + 34, 240, 49, 240, 192, 31, 19, 0, 10, 101, 104, 51, + 98, 114, 194, 33, 241, 17, 240, 18, 240, 33, 240, 49, + 240, 49, 240, 49, 240, 41, 55, 131, 34, 0, 9, 16, + 27, 15, 240, 240, 193, 151, 23, 81, 66, 129, 209, 225, + 151, 38, 65, 98, 97, 209, 225, 209, 209, 209, 209, 194, + 178, 240, 192, 26, 17, 0, 6, 66, 240, 34, 240, 18, + 240, 17, 145, 241, 241, 241, 241, 241, 241, 241, 226, 145, + 50, 196, 225, 0, 6, 44, 19, 241, 146, 81, 34, 130, + 82, 17, 129, 113, 49, 97, 81, 97, 73, 85, 113, 97, + 177, 97, 177, 97, 162, 97, 161, 240, 49, 240, 33, 240, + 49, 240, 33, 240, 33, 240, 33, 240, 18, 242, 240, 240, + 32, 32, 14, 0, 9, 50, 210, 193, 209, 65, 135, 23, + 65, 49, 49, 81, 113, 81, 97, 97, 97, 81, 97, 97, + 81, 49, 49, 65, 83, 65, 113, 240, 64, 25, 15, 0, + 10, 1, 226, 209, 210, 97, 97, 54, 70, 129, 82, 97, + 97, 97, 113, 209, 225, 209, 209, 194, 240, 160, 41, 18, + 240, 240, 33, 240, 17, 18, 193, 18, 50, 86, 17, 70, + 66, 97, 145, 113, 145, 113, 145, 113, 129, 129, 129, 129, + 129, 240, 17, 240, 17, 240, 17, 240, 17, 240, 17, 242, + 0, 6, 16, 41, 18, 240, 240, 49, 162, 49, 33, 161, + 65, 193, 65, 81, 97, 19, 120, 193, 49, 209, 49, 209, + 49, 209, 49, 129, 75, 52, 65, 97, 161, 240, 33, 240, + 33, 240, 33, 240, 33, 240, 240, 224, 30, 18, 240, 240, + 49, 241, 33, 241, 17, 240, 81, 103, 86, 65, 177, 65, + 212, 225, 240, 33, 240, 33, 240, 33, 235, 53, 161, 0, + 11, 64, 36, 18, 0, 6, 49, 242, 17, 17, 117, 17, + 71, 50, 240, 18, 240, 17, 183, 131, 82, 240, 17, 240, + 18, 240, 17, 240, 17, 240, 17, 240, 17, 242, 226, 0, + 6, 32, 11, 5, 240, 240, 178, 36, 20, 34, 240, 240, + 192, 12, 18, 0, 18, 1, 195, 34, 30, 51, 0, 21, + 112, 15, 10, 0, 7, 66, 161, 162, 161, 146, 146, 146, + 130, 0, 7, 80, 21, 11, 240, 240, 161, 178, 97, 49, + 18, 66, 81, 65, 98, 177, 162, 162, 162, 146, 0, 8, + 64, + 0, 0, 0, // Padding + +}; + +tFont *g_psFontWSazanamimincho10x19 = (tFont *)g_pui8Sazanamimincho10x19; diff --git a/third_party/fonts/other/fonts/fontsazanamimincho6x10.c b/third_party/fonts/other/fonts/fontsazanamimincho6x10.c new file mode 100644 index 0000000..5a6d93a --- /dev/null +++ b/third_party/fonts/other/fonts/fontsazanamimincho6x10.c @@ -0,0 +1,720 @@ +//***************************************************************************** +// +// fontsazanamimincho6x10.c - Font definition for the 6x10 Sazanamimincho font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from Sazanami +// +// Copyright (c) 1990-2003 +// Wada Laboratory, the University of Tokyo. All rights reserved. +// Copyright (c) 2003-2004 +// Electronic Font Open Laboratory (/efont/). All rights reserved +// +// For license, please see README. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 286 in 2 blocks +// Style: sazanamimincho +// Size: 6x10 +// Bold: no +// Italic: no +// Memory usage: 5088 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Sazanamimincho6x10[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 9, + + // + // The height of the font. + // + 12, + + // + // The baseline of the font. + // + 10, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3041 - 0x30ff + // + 0x41, 0x30, 0x00, 0x00, + 0xbf, 0x00, 0x00, 0x00, + 0x3c, 0x05, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x86, 0x01, 0x00, 0x00, // Offset 390 (0x186) + 0x8f, 0x01, 0x00, 0x00, // Offset 399 (0x18f) + 0x9c, 0x01, 0x00, 0x00, // Offset 412 (0x19c) + 0xa7, 0x01, 0x00, 0x00, // Offset 423 (0x1a7) + 0xb1, 0x01, 0x00, 0x00, // Offset 433 (0x1b1) + 0xbf, 0x01, 0x00, 0x00, // Offset 447 (0x1bf) + 0xc3, 0x01, 0x00, 0x00, // Offset 451 (0x1c3) + 0xcf, 0x01, 0x00, 0x00, // Offset 463 (0x1cf) + 0xdb, 0x01, 0x00, 0x00, // Offset 475 (0x1db) + 0xe6, 0x01, 0x00, 0x00, // Offset 486 (0x1e6) + 0xef, 0x01, 0x00, 0x00, // Offset 495 (0x1ef) + 0xf4, 0x01, 0x00, 0x00, // Offset 500 (0x1f4) + 0xfa, 0x01, 0x00, 0x00, // Offset 506 (0x1fa) + 0xfe, 0x01, 0x00, 0x00, // Offset 510 (0x1fe) + 0x09, 0x02, 0x00, 0x00, // Offset 521 (0x209) + 0x14, 0x02, 0x00, 0x00, // Offset 532 (0x214) + 0x1e, 0x02, 0x00, 0x00, // Offset 542 (0x21e) + 0x29, 0x02, 0x00, 0x00, // Offset 553 (0x229) + 0x33, 0x02, 0x00, 0x00, // Offset 563 (0x233) + 0x3f, 0x02, 0x00, 0x00, // Offset 575 (0x23f) + 0x48, 0x02, 0x00, 0x00, // Offset 584 (0x248) + 0x53, 0x02, 0x00, 0x00, // Offset 595 (0x253) + 0x5d, 0x02, 0x00, 0x00, // Offset 605 (0x25d) + 0x69, 0x02, 0x00, 0x00, // Offset 617 (0x269) + 0x74, 0x02, 0x00, 0x00, // Offset 628 (0x274) + 0x79, 0x02, 0x00, 0x00, // Offset 633 (0x279) + 0x7e, 0x02, 0x00, 0x00, // Offset 638 (0x27e) + 0x88, 0x02, 0x00, 0x00, // Offset 648 (0x288) + 0x8f, 0x02, 0x00, 0x00, // Offset 655 (0x28f) + 0x99, 0x02, 0x00, 0x00, // Offset 665 (0x299) + 0xa2, 0x02, 0x00, 0x00, // Offset 674 (0x2a2) + 0xad, 0x02, 0x00, 0x00, // Offset 685 (0x2ad) + 0xb7, 0x02, 0x00, 0x00, // Offset 695 (0x2b7) + 0xc1, 0x02, 0x00, 0x00, // Offset 705 (0x2c1) + 0xcb, 0x02, 0x00, 0x00, // Offset 715 (0x2cb) + 0xd5, 0x02, 0x00, 0x00, // Offset 725 (0x2d5) + 0xde, 0x02, 0x00, 0x00, // Offset 734 (0x2de) + 0xe7, 0x02, 0x00, 0x00, // Offset 743 (0x2e7) + 0xf1, 0x02, 0x00, 0x00, // Offset 753 (0x2f1) + 0xfb, 0x02, 0x00, 0x00, // Offset 763 (0x2fb) + 0x05, 0x03, 0x00, 0x00, // Offset 773 (0x305) + 0x0f, 0x03, 0x00, 0x00, // Offset 783 (0x30f) + 0x1c, 0x03, 0x00, 0x00, // Offset 796 (0x31c) + 0x26, 0x03, 0x00, 0x00, // Offset 806 (0x326) + 0x31, 0x03, 0x00, 0x00, // Offset 817 (0x331) + 0x3c, 0x03, 0x00, 0x00, // Offset 828 (0x33c) + 0x47, 0x03, 0x00, 0x00, // Offset 839 (0x347) + 0x51, 0x03, 0x00, 0x00, // Offset 849 (0x351) + 0x5d, 0x03, 0x00, 0x00, // Offset 861 (0x35d) + 0x68, 0x03, 0x00, 0x00, // Offset 872 (0x368) + 0x70, 0x03, 0x00, 0x00, // Offset 880 (0x370) + 0x7a, 0x03, 0x00, 0x00, // Offset 890 (0x37a) + 0x85, 0x03, 0x00, 0x00, // Offset 901 (0x385) + 0x90, 0x03, 0x00, 0x00, // Offset 912 (0x390) + 0x9b, 0x03, 0x00, 0x00, // Offset 923 (0x39b) + 0xa7, 0x03, 0x00, 0x00, // Offset 935 (0x3a7) + 0xb2, 0x03, 0x00, 0x00, // Offset 946 (0x3b2) + 0xbc, 0x03, 0x00, 0x00, // Offset 956 (0x3bc) + 0xc7, 0x03, 0x00, 0x00, // Offset 967 (0x3c7) + 0xd2, 0x03, 0x00, 0x00, // Offset 978 (0x3d2) + 0xdd, 0x03, 0x00, 0x00, // Offset 989 (0x3dd) + 0xe7, 0x03, 0x00, 0x00, // Offset 999 (0x3e7) + 0xed, 0x03, 0x00, 0x00, // Offset 1005 (0x3ed) + 0xf4, 0x03, 0x00, 0x00, // Offset 1012 (0x3f4) + 0xfd, 0x03, 0x00, 0x00, // Offset 1021 (0x3fd) + 0x07, 0x04, 0x00, 0x00, // Offset 1031 (0x407) + 0x10, 0x04, 0x00, 0x00, // Offset 1040 (0x410) + 0x1a, 0x04, 0x00, 0x00, // Offset 1050 (0x41a) + 0x22, 0x04, 0x00, 0x00, // Offset 1058 (0x422) + 0x2c, 0x04, 0x00, 0x00, // Offset 1068 (0x42c) + 0x36, 0x04, 0x00, 0x00, // Offset 1078 (0x436) + 0x41, 0x04, 0x00, 0x00, // Offset 1089 (0x441) + 0x4a, 0x04, 0x00, 0x00, // Offset 1098 (0x44a) + 0x53, 0x04, 0x00, 0x00, // Offset 1107 (0x453) + 0x60, 0x04, 0x00, 0x00, // Offset 1120 (0x460) + 0x6a, 0x04, 0x00, 0x00, // Offset 1130 (0x46a) + 0x78, 0x04, 0x00, 0x00, // Offset 1144 (0x478) + 0x82, 0x04, 0x00, 0x00, // Offset 1154 (0x482) + 0x8c, 0x04, 0x00, 0x00, // Offset 1164 (0x48c) + 0x97, 0x04, 0x00, 0x00, // Offset 1175 (0x497) + 0xa1, 0x04, 0x00, 0x00, // Offset 1185 (0x4a1) + 0xaa, 0x04, 0x00, 0x00, // Offset 1194 (0x4aa) + 0xb1, 0x04, 0x00, 0x00, // Offset 1201 (0x4b1) + 0xbb, 0x04, 0x00, 0x00, // Offset 1211 (0x4bb) + 0xc5, 0x04, 0x00, 0x00, // Offset 1221 (0x4c5) + 0xcf, 0x04, 0x00, 0x00, // Offset 1231 (0x4cf) + 0xd9, 0x04, 0x00, 0x00, // Offset 1241 (0x4d9) + 0xe4, 0x04, 0x00, 0x00, // Offset 1252 (0x4e4) + 0xef, 0x04, 0x00, 0x00, // Offset 1263 (0x4ef) + 0xf8, 0x04, 0x00, 0x00, // Offset 1272 (0x4f8) + 0x04, 0x05, 0x00, 0x00, // Offset 1284 (0x504) + 0x07, 0x05, 0x00, 0x00, // Offset 1287 (0x507) + 0x13, 0x05, 0x00, 0x00, // Offset 1299 (0x513) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 7, 0, 10, 64, 5, 1, 53, 17, 32, 9, 3, + 97, 18, 18, 18, 17, 240, 48, 13, 4, 209, 17, 17, + 21, 17, 21, 17, 17, 17, 17, 128, 11, 4, 225, 36, + 17, 19, 35, 17, 20, 33, 96, 10, 4, 194, 34, 81, + 18, 17, 82, 34, 128, 14, 4, 209, 33, 17, 17, 17, + 33, 33, 19, 17, 33, 17, 128, 4, 1, 36, 96, 12, + 3, 129, 17, 33, 17, 33, 33, 49, 33, 49, 48, 12, + 3, 97, 49, 33, 49, 33, 33, 17, 33, 17, 80, 11, + 4, 240, 33, 17, 33, 20, 33, 33, 17, 192, 9, 4, + 240, 49, 49, 20, 33, 49, 208, 5, 2, 240, 66, 48, + 6, 4, 240, 148, 240, 80, 4, 1, 145, 32, 11, 4, + 241, 49, 33, 49, 33, 49, 33, 49, 112, 11, 4, 210, + 17, 34, 20, 18, 34, 33, 18, 144, 10, 3, 177, 19, + 17, 33, 33, 33, 33, 96, 11, 4, 210, 17, 33, 49, + 33, 33, 33, 52, 128, 10, 4, 196, 49, 33, 34, 66, + 33, 18, 144, 12, 4, 225, 34, 17, 17, 17, 17, 20, + 33, 49, 144, 9, 4, 197, 51, 65, 50, 33, 18, 144, + 11, 4, 210, 17, 51, 17, 34, 34, 33, 18, 144, 10, + 4, 196, 49, 33, 49, 33, 49, 49, 160, 12, 4, 210, + 17, 34, 33, 18, 17, 34, 33, 18, 144, 11, 4, 210, + 17, 34, 34, 33, 19, 49, 18, 144, 5, 1, 81, 33, + 48, 5, 2, 177, 82, 80, 10, 4, 241, 33, 33, 33, + 65, 65, 65, 128, 7, 4, 240, 84, 68, 240, 16, 10, + 4, 193, 65, 65, 65, 33, 33, 33, 176, 9, 4, 195, + 65, 49, 33, 33, 113, 160, 11, 4, 210, 17, 34, 19, + 17, 17, 19, 67, 128, 10, 4, 210, 17, 34, 38, 34, + 34, 33, 128, 10, 4, 195, 17, 34, 36, 17, 34, 36, + 144, 10, 4, 210, 17, 34, 49, 49, 49, 67, 128, 10, + 4, 195, 17, 34, 34, 34, 34, 36, 144, 9, 4, 197, + 49, 51, 17, 49, 52, 128, 9, 4, 197, 49, 51, 17, + 49, 49, 176, 10, 4, 212, 49, 49, 19, 34, 33, 19, + 128, 10, 4, 193, 34, 34, 38, 34, 34, 33, 128, 10, + 3, 147, 17, 33, 33, 33, 33, 19, 96, 10, 4, 241, + 49, 49, 50, 34, 33, 18, 144, 13, 4, 193, 34, 17, + 18, 34, 33, 17, 17, 34, 33, 128, 10, 4, 193, 49, + 49, 49, 49, 49, 52, 128, 11, 4, 193, 34, 20, 18, + 34, 34, 34, 33, 128, 11, 4, 193, 35, 18, 19, 34, + 34, 34, 33, 128, 11, 4, 210, 17, 34, 34, 34, 34, + 33, 18, 144, 10, 4, 195, 17, 34, 34, 36, 17, 49, + 176, 12, 4, 210, 17, 34, 34, 34, 34, 33, 18, 33, + 66, 11, 4, 195, 17, 34, 36, 17, 34, 34, 33, 128, + 8, 4, 212, 49, 66, 65, 52, 144, 10, 5, 245, 33, + 65, 65, 65, 65, 65, 192, 11, 4, 193, 34, 34, 34, + 34, 34, 33, 18, 144, 11, 4, 193, 34, 34, 34, 34, + 34, 17, 18, 160, 11, 4, 193, 34, 34, 34, 35, 18, + 19, 33, 128, 12, 4, 193, 34, 34, 33, 18, 17, 34, + 34, 33, 128, 11, 4, 193, 34, 34, 34, 17, 33, 49, + 49, 160, 10, 4, 196, 49, 33, 33, 33, 49, 52, 128, + 11, 3, 100, 33, 33, 33, 33, 33, 33, 35, 48, 11, + 4, 193, 49, 65, 49, 65, 49, 65, 49, 64, 11, 3, + 99, 33, 33, 33, 33, 33, 33, 36, 48, 10, 5, 193, + 49, 17, 17, 49, 240, 240, 80, 6, 4, 240, 240, 164, + 64, 7, 2, 65, 17, 33, 17, 192, 9, 4, 240, 98, + 65, 20, 33, 19, 128, 10, 4, 193, 49, 51, 17, 34, + 34, 36, 144, 9, 4, 240, 98, 17, 34, 49, 67, 128, + 10, 4, 241, 49, 20, 34, 34, 33, 19, 128, 8, 4, + 240, 98, 17, 38, 67, 128, 10, 4, 226, 17, 49, 36, + 17, 49, 49, 160, 10, 4, 240, 100, 34, 34, 33, 19, + 49, 18, 11, 4, 193, 49, 51, 17, 34, 34, 34, 33, + 128, 9, 3, 113, 114, 33, 33, 33, 19, 96, 9, 3, + 129, 114, 33, 33, 33, 33, 35, 13, 4, 193, 49, 49, + 34, 17, 18, 33, 17, 17, 33, 128, 10, 3, 146, 33, + 33, 33, 33, 33, 34, 96, 14, 5, 240, 164, 17, 17, + 18, 17, 18, 17, 18, 17, 17, 160, 10, 4, 240, 83, + 17, 34, 34, 34, 33, 128, 10, 4, 240, 98, 17, 34, + 34, 33, 18, 144, 11, 4, 240, 83, 17, 34, 34, 36, + 17, 49, 48, 10, 4, 240, 100, 34, 34, 33, 19, 49, + 49, 9, 4, 240, 81, 20, 33, 49, 49, 176, 7, 4, + 240, 100, 66, 68, 144, 10, 4, 209, 49, 36, 17, 49, + 49, 66, 128, 10, 4, 240, 81, 34, 34, 34, 33, 19, + 128, 10, 4, 240, 81, 34, 34, 34, 17, 18, 160, 10, + 4, 240, 81, 34, 35, 18, 19, 33, 128, 11, 4, 240, + 81, 34, 33, 18, 17, 34, 33, 128, 11, 4, 240, 81, + 34, 34, 34, 33, 19, 49, 18, 9, 4, 240, 84, 33, + 33, 33, 52, 128, 12, 4, 162, 17, 49, 49, 33, 65, + 49, 49, 66, 64, 3, 1, 41, 12, 4, 130, 65, 49, + 49, 65, 33, 49, 49, 18, 96, 7, 4, 209, 18, 17, + 240, 224, + 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3041 - 0x30ff + // + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x0c, 0x03, 0x00, 0x00, // Offset 780 (0x30c) + 0x21, 0x03, 0x00, 0x00, // Offset 801 (0x321) + 0x30, 0x03, 0x00, 0x00, // Offset 816 (0x330) + 0x41, 0x03, 0x00, 0x00, // Offset 833 (0x341) + 0x4c, 0x03, 0x00, 0x00, // Offset 844 (0x34c) + 0x59, 0x03, 0x00, 0x00, // Offset 857 (0x359) + 0x65, 0x03, 0x00, 0x00, // Offset 869 (0x365) + 0x74, 0x03, 0x00, 0x00, // Offset 884 (0x374) + 0x84, 0x03, 0x00, 0x00, // Offset 900 (0x384) + 0x99, 0x03, 0x00, 0x00, // Offset 921 (0x399) + 0xb0, 0x03, 0x00, 0x00, // Offset 944 (0x3b0) + 0xca, 0x03, 0x00, 0x00, // Offset 970 (0x3ca) + 0xd9, 0x03, 0x00, 0x00, // Offset 985 (0x3d9) + 0xeb, 0x03, 0x00, 0x00, // Offset 1003 (0x3eb) + 0xf7, 0x03, 0x00, 0x00, // Offset 1015 (0x3f7) + 0x07, 0x04, 0x00, 0x00, // Offset 1031 (0x407) + 0x1c, 0x04, 0x00, 0x00, // Offset 1052 (0x41c) + 0x33, 0x04, 0x00, 0x00, // Offset 1075 (0x433) + 0x3e, 0x04, 0x00, 0x00, // Offset 1086 (0x43e) + 0x4c, 0x04, 0x00, 0x00, // Offset 1100 (0x44c) + 0x5b, 0x04, 0x00, 0x00, // Offset 1115 (0x45b) + 0x6e, 0x04, 0x00, 0x00, // Offset 1134 (0x46e) + 0x7c, 0x04, 0x00, 0x00, // Offset 1148 (0x47c) + 0x90, 0x04, 0x00, 0x00, // Offset 1168 (0x490) + 0x9f, 0x04, 0x00, 0x00, // Offset 1183 (0x49f) + 0xaf, 0x04, 0x00, 0x00, // Offset 1199 (0x4af) + 0xc1, 0x04, 0x00, 0x00, // Offset 1217 (0x4c1) + 0xd5, 0x04, 0x00, 0x00, // Offset 1237 (0x4d5) + 0xe2, 0x04, 0x00, 0x00, // Offset 1250 (0x4e2) + 0xf1, 0x04, 0x00, 0x00, // Offset 1265 (0x4f1) + 0x03, 0x05, 0x00, 0x00, // Offset 1283 (0x503) + 0x18, 0x05, 0x00, 0x00, // Offset 1304 (0x518) + 0x27, 0x05, 0x00, 0x00, // Offset 1319 (0x527) + 0x39, 0x05, 0x00, 0x00, // Offset 1337 (0x539) + 0x45, 0x05, 0x00, 0x00, // Offset 1349 (0x545) + 0x52, 0x05, 0x00, 0x00, // Offset 1362 (0x552) + 0x62, 0x05, 0x00, 0x00, // Offset 1378 (0x562) + 0x6e, 0x05, 0x00, 0x00, // Offset 1390 (0x56e) + 0x7f, 0x05, 0x00, 0x00, // Offset 1407 (0x57f) + 0x8c, 0x05, 0x00, 0x00, // Offset 1420 (0x58c) + 0x9d, 0x05, 0x00, 0x00, // Offset 1437 (0x59d) + 0xb3, 0x05, 0x00, 0x00, // Offset 1459 (0x5b3) + 0xc4, 0x05, 0x00, 0x00, // Offset 1476 (0x5c4) + 0xde, 0x05, 0x00, 0x00, // Offset 1502 (0x5de) + 0xf4, 0x05, 0x00, 0x00, // Offset 1524 (0x5f4) + 0x08, 0x06, 0x00, 0x00, // Offset 1544 (0x608) + 0x20, 0x06, 0x00, 0x00, // Offset 1568 (0x620) + 0x3a, 0x06, 0x00, 0x00, // Offset 1594 (0x63a) + 0x54, 0x06, 0x00, 0x00, // Offset 1620 (0x654) + 0x69, 0x06, 0x00, 0x00, // Offset 1641 (0x669) + 0x7e, 0x06, 0x00, 0x00, // Offset 1662 (0x67e) + 0x94, 0x06, 0x00, 0x00, // Offset 1684 (0x694) + 0xa7, 0x06, 0x00, 0x00, // Offset 1703 (0x6a7) + 0xbd, 0x06, 0x00, 0x00, // Offset 1725 (0x6bd) + 0xd3, 0x06, 0x00, 0x00, // Offset 1747 (0x6d3) + 0xdf, 0x06, 0x00, 0x00, // Offset 1759 (0x6df) + 0xee, 0x06, 0x00, 0x00, // Offset 1774 (0x6ee) + 0xfe, 0x06, 0x00, 0x00, // Offset 1790 (0x6fe) + 0x16, 0x07, 0x00, 0x00, // Offset 1814 (0x716) + 0x30, 0x07, 0x00, 0x00, // Offset 1840 (0x730) + 0x4a, 0x07, 0x00, 0x00, // Offset 1866 (0x74a) + 0x5a, 0x07, 0x00, 0x00, // Offset 1882 (0x75a) + 0x6e, 0x07, 0x00, 0x00, // Offset 1902 (0x76e) + 0x81, 0x07, 0x00, 0x00, // Offset 1921 (0x781) + 0x99, 0x07, 0x00, 0x00, // Offset 1945 (0x799) + 0xa8, 0x07, 0x00, 0x00, // Offset 1960 (0x7a8) + 0xb9, 0x07, 0x00, 0x00, // Offset 1977 (0x7b9) + 0xcb, 0x07, 0x00, 0x00, // Offset 1995 (0x7cb) + 0xdf, 0x07, 0x00, 0x00, // Offset 2015 (0x7df) + 0xf7, 0x07, 0x00, 0x00, // Offset 2039 (0x7f7) + 0x04, 0x08, 0x00, 0x00, // Offset 2052 (0x804) + 0x14, 0x08, 0x00, 0x00, // Offset 2068 (0x814) + 0x22, 0x08, 0x00, 0x00, // Offset 2082 (0x822) + 0x31, 0x08, 0x00, 0x00, // Offset 2097 (0x831) + 0x42, 0x08, 0x00, 0x00, // Offset 2114 (0x842) + 0x58, 0x08, 0x00, 0x00, // Offset 2136 (0x858) + 0x65, 0x08, 0x00, 0x00, // Offset 2149 (0x865) + 0x75, 0x08, 0x00, 0x00, // Offset 2165 (0x875) + 0x8a, 0x08, 0x00, 0x00, // Offset 2186 (0x88a) + 0xa0, 0x08, 0x00, 0x00, // Offset 2208 (0x8a0) + 0xb2, 0x08, 0x00, 0x00, // Offset 2226 (0x8b2) + 0xc4, 0x08, 0x00, 0x00, // Offset 2244 (0x8c4) + 0xd5, 0x08, 0x00, 0x00, // Offset 2261 (0x8d5) + 0xe6, 0x08, 0x00, 0x00, // Offset 2278 (0x8e6) + 0xf7, 0x08, 0x00, 0x00, // Offset 2295 (0x8f7) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x06, 0x09, 0x00, 0x00, // Offset 2310 (0x906) + 0x0f, 0x09, 0x00, 0x00, // Offset 2319 (0x90f) + 0x18, 0x09, 0x00, 0x00, // Offset 2328 (0x918) + 0x20, 0x09, 0x00, 0x00, // Offset 2336 (0x920) + 0x2d, 0x09, 0x00, 0x00, // Offset 2349 (0x92d) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x41, 0x09, 0x00, 0x00, // Offset 2369 (0x941) + 0x4c, 0x09, 0x00, 0x00, // Offset 2380 (0x94c) + 0x5a, 0x09, 0x00, 0x00, // Offset 2394 (0x95a) + 0x66, 0x09, 0x00, 0x00, // Offset 2406 (0x966) + 0x74, 0x09, 0x00, 0x00, // Offset 2420 (0x974) + 0x7f, 0x09, 0x00, 0x00, // Offset 2431 (0x97f) + 0x8c, 0x09, 0x00, 0x00, // Offset 2444 (0x98c) + 0x97, 0x09, 0x00, 0x00, // Offset 2455 (0x997) + 0xa3, 0x09, 0x00, 0x00, // Offset 2467 (0x9a3) + 0xb0, 0x09, 0x00, 0x00, // Offset 2480 (0x9b0) + 0xbf, 0x09, 0x00, 0x00, // Offset 2495 (0x9bf) + 0xd1, 0x09, 0x00, 0x00, // Offset 2513 (0x9d1) + 0xe8, 0x09, 0x00, 0x00, // Offset 2536 (0x9e8) + 0xf5, 0x09, 0x00, 0x00, // Offset 2549 (0x9f5) + 0x06, 0x0a, 0x00, 0x00, // Offset 2566 (0xa06) + 0x15, 0x0a, 0x00, 0x00, // Offset 2581 (0xa15) + 0x28, 0x0a, 0x00, 0x00, // Offset 2600 (0xa28) + 0x36, 0x0a, 0x00, 0x00, // Offset 2614 (0xa36) + 0x49, 0x0a, 0x00, 0x00, // Offset 2633 (0xa49) + 0x54, 0x0a, 0x00, 0x00, // Offset 2644 (0xa54) + 0x62, 0x0a, 0x00, 0x00, // Offset 2658 (0xa62) + 0x73, 0x0a, 0x00, 0x00, // Offset 2675 (0xa73) + 0x86, 0x0a, 0x00, 0x00, // Offset 2694 (0xa86) + 0x94, 0x0a, 0x00, 0x00, // Offset 2708 (0xa94) + 0xa6, 0x0a, 0x00, 0x00, // Offset 2726 (0xaa6) + 0xb4, 0x0a, 0x00, 0x00, // Offset 2740 (0xab4) + 0xc6, 0x0a, 0x00, 0x00, // Offset 2758 (0xac6) + 0xd6, 0x0a, 0x00, 0x00, // Offset 2774 (0xad6) + 0xea, 0x0a, 0x00, 0x00, // Offset 2794 (0xaea) + 0xf9, 0x0a, 0x00, 0x00, // Offset 2809 (0xaf9) + 0x0a, 0x0b, 0x00, 0x00, // Offset 2826 (0xb0a) + 0x1b, 0x0b, 0x00, 0x00, // Offset 2843 (0xb1b) + 0x30, 0x0b, 0x00, 0x00, // Offset 2864 (0xb30) + 0x3d, 0x0b, 0x00, 0x00, // Offset 2877 (0xb3d) + 0x4d, 0x0b, 0x00, 0x00, // Offset 2893 (0xb4d) + 0x5b, 0x0b, 0x00, 0x00, // Offset 2907 (0xb5b) + 0x6b, 0x0b, 0x00, 0x00, // Offset 2923 (0xb6b) + 0x7e, 0x0b, 0x00, 0x00, // Offset 2942 (0xb7e) + 0x8a, 0x0b, 0x00, 0x00, // Offset 2954 (0xb8a) + 0x98, 0x0b, 0x00, 0x00, // Offset 2968 (0xb98) + 0xa5, 0x0b, 0x00, 0x00, // Offset 2981 (0xba5) + 0xb6, 0x0b, 0x00, 0x00, // Offset 2998 (0xbb6) + 0xc3, 0x0b, 0x00, 0x00, // Offset 3011 (0xbc3) + 0xcc, 0x0b, 0x00, 0x00, // Offset 3020 (0xbcc) + 0xdc, 0x0b, 0x00, 0x00, // Offset 3036 (0xbdc) + 0xed, 0x0b, 0x00, 0x00, // Offset 3053 (0xbed) + 0xf9, 0x0b, 0x00, 0x00, // Offset 3065 (0xbf9) + 0x0a, 0x0c, 0x00, 0x00, // Offset 3082 (0xc0a) + 0x1f, 0x0c, 0x00, 0x00, // Offset 3103 (0xc1f) + 0x35, 0x0c, 0x00, 0x00, // Offset 3125 (0xc35) + 0x41, 0x0c, 0x00, 0x00, // Offset 3137 (0xc41) + 0x51, 0x0c, 0x00, 0x00, // Offset 3153 (0xc51) + 0x62, 0x0c, 0x00, 0x00, // Offset 3170 (0xc62) + 0x6e, 0x0c, 0x00, 0x00, // Offset 3182 (0xc6e) + 0x7c, 0x0c, 0x00, 0x00, // Offset 3196 (0xc7c) + 0x8a, 0x0c, 0x00, 0x00, // Offset 3210 (0xc8a) + 0x97, 0x0c, 0x00, 0x00, // Offset 3223 (0xc97) + 0xa7, 0x0c, 0x00, 0x00, // Offset 3239 (0xca7) + 0xb9, 0x0c, 0x00, 0x00, // Offset 3257 (0xcb9) + 0xca, 0x0c, 0x00, 0x00, // Offset 3274 (0xcca) + 0xde, 0x0c, 0x00, 0x00, // Offset 3294 (0xcde) + 0xf3, 0x0c, 0x00, 0x00, // Offset 3315 (0xcf3) + 0x01, 0x0d, 0x00, 0x00, // Offset 3329 (0xd01) + 0x0a, 0x0d, 0x00, 0x00, // Offset 3338 (0xd0a) + 0x1c, 0x0d, 0x00, 0x00, // Offset 3356 (0xd1c) + 0x2c, 0x0d, 0x00, 0x00, // Offset 3372 (0xd2c) + 0x38, 0x0d, 0x00, 0x00, // Offset 3384 (0xd38) + 0x45, 0x0d, 0x00, 0x00, // Offset 3397 (0xd45) + 0x56, 0x0d, 0x00, 0x00, // Offset 3414 (0xd56) + 0x60, 0x0d, 0x00, 0x00, // Offset 3424 (0xd60) + 0x6c, 0x0d, 0x00, 0x00, // Offset 3436 (0xd6c) + 0x73, 0x0d, 0x00, 0x00, // Offset 3443 (0xd73) + 0x7d, 0x0d, 0x00, 0x00, // Offset 3453 (0xd7d) + 0x89, 0x0d, 0x00, 0x00, // Offset 3465 (0xd89) + 0x96, 0x0d, 0x00, 0x00, // Offset 3478 (0xd96) + 0xb0, 0x0d, 0x00, 0x00, // Offset 3504 (0xdb0) + 0xbe, 0x0d, 0x00, 0x00, // Offset 3518 (0xdbe) + 0xc9, 0x0d, 0x00, 0x00, // Offset 3529 (0xdc9) + 0xd3, 0x0d, 0x00, 0x00, // Offset 3539 (0xdd3) + 0xdf, 0x0d, 0x00, 0x00, // Offset 3551 (0xddf) + 0xef, 0x0d, 0x00, 0x00, // Offset 3567 (0xdef) + 0xfb, 0x0d, 0x00, 0x00, // Offset 3579 (0xdfb) + 0x06, 0x0e, 0x00, 0x00, // Offset 3590 (0xe06) + 0x13, 0x0e, 0x00, 0x00, // Offset 3603 (0xe13) + 0x26, 0x0e, 0x00, 0x00, // Offset 3622 (0xe26) + 0x36, 0x0e, 0x00, 0x00, // Offset 3638 (0xe36) + 0x41, 0x0e, 0x00, 0x00, // Offset 3649 (0xe41) + 0x52, 0x0e, 0x00, 0x00, // Offset 3666 (0xe52) + 0x65, 0x0e, 0x00, 0x00, // Offset 3685 (0xe65) + 0x75, 0x0e, 0x00, 0x00, // Offset 3701 (0xe75) + 0x83, 0x0e, 0x00, 0x00, // Offset 3715 (0xe83) + 0x87, 0x0e, 0x00, 0x00, // Offset 3719 (0xe87) + 0x90, 0x0e, 0x00, 0x00, // Offset 3728 (0xe90) + 0x99, 0x0e, 0x00, 0x00, // Offset 3737 (0xe99) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3041 - 0x30ff + // + 16, 7, 240, 241, 71, 33, 85, 17, 17, 17, 18, 18, + 33, 18, 33, 128, 21, 9, 193, 129, 103, 65, 117, 50, + 33, 17, 17, 17, 17, 50, 17, 17, 49, 19, 49, 98, + 176, 15, 7, 240, 240, 97, 49, 33, 49, 17, 82, 82, + 33, 33, 18, 176, 17, 9, 240, 209, 129, 81, 17, 97, + 17, 114, 113, 17, 33, 49, 34, 240, 128, 11, 6, 240, + 164, 147, 18, 49, 81, 65, 50, 128, 13, 7, 240, 18, + 114, 164, 18, 65, 97, 97, 81, 66, 144, 12, 6, 240, + 164, 117, 65, 65, 65, 17, 33, 50, 96, 15, 8, 240, + 50, 130, 181, 97, 97, 97, 17, 65, 33, 49, 67, 128, + 16, 7, 240, 241, 33, 21, 17, 33, 85, 17, 17, 50, + 17, 51, 34, 128, 21, 9, 193, 129, 101, 17, 65, 65, + 49, 117, 49, 17, 49, 17, 33, 66, 33, 65, 18, 50, + 160, 23, 9, 193, 129, 129, 49, 21, 33, 49, 33, 33, + 33, 33, 33, 33, 33, 33, 17, 49, 65, 49, 98, 208, + 26, 9, 193, 49, 65, 17, 33, 49, 33, 37, 97, 33, + 17, 49, 33, 17, 49, 33, 33, 17, 49, 33, 17, 49, + 98, 208, 15, 8, 193, 113, 56, 81, 55, 81, 67, 17, + 33, 50, 33, 132, 160, 18, 9, 193, 49, 65, 17, 38, + 17, 97, 87, 97, 83, 17, 49, 50, 49, 148, 192, 12, + 4, 177, 33, 33, 33, 49, 65, 65, 65, 49, 64, 16, + 8, 240, 65, 97, 49, 33, 33, 34, 65, 33, 129, 129, + 129, 113, 192, 21, 9, 241, 49, 65, 49, 65, 33, 39, + 81, 33, 81, 33, 81, 33, 81, 49, 49, 65, 18, 208, + 23, 9, 240, 17, 33, 49, 33, 17, 65, 33, 39, 81, + 33, 81, 33, 81, 33, 81, 49, 49, 65, 18, 208, 11, + 7, 240, 117, 240, 129, 81, 97, 81, 21, 128, 14, 8, + 225, 81, 33, 19, 17, 240, 193, 97, 113, 81, 37, 160, + 15, 9, 225, 129, 129, 25, 129, 83, 17, 49, 50, 49, + 145, 147, 176, 19, 9, 209, 33, 81, 49, 65, 17, 38, + 17, 97, 83, 17, 49, 50, 49, 145, 147, 192, 14, 7, + 241, 97, 97, 81, 97, 97, 82, 81, 17, 49, 51, 144, + 20, 8, 240, 33, 65, 33, 33, 33, 17, 49, 33, 113, + 113, 81, 17, 81, 33, 49, 67, 176, 15, 9, 225, 129, + 57, 81, 99, 81, 33, 81, 33, 99, 113, 98, 224, 16, + 9, 209, 33, 97, 40, 113, 99, 81, 33, 81, 33, 99, + 113, 98, 224, 18, 9, 241, 65, 49, 65, 49, 65, 41, + 17, 65, 49, 65, 34, 65, 129, 149, 160, 20, 9, 240, + 17, 49, 33, 33, 33, 49, 65, 41, 17, 65, 49, 65, + 34, 65, 129, 149, 160, 13, 8, 240, 37, 113, 97, 97, + 72, 49, 97, 113, 131, 160, 15, 8, 225, 36, 33, 81, + 97, 17, 65, 72, 49, 97, 113, 131, 160, 18, 9, 193, + 129, 87, 81, 129, 20, 33, 129, 49, 65, 33, 65, 49, + 65, 67, 144, 21, 9, 177, 65, 49, 33, 38, 17, 65, + 129, 20, 33, 129, 49, 65, 33, 65, 49, 65, 67, 160, + 15, 7, 145, 97, 71, 33, 97, 81, 19, 34, 49, 97, + 81, 51, 144, 18, 9, 177, 65, 49, 33, 38, 17, 65, + 129, 113, 19, 66, 49, 129, 113, 83, 208, 12, 7, 240, + 240, 130, 35, 33, 113, 97, 81, 51, 144, 13, 8, 240, + 195, 35, 49, 129, 113, 113, 82, 51, 240, 64, 16, 9, + 209, 33, 97, 33, 51, 51, 49, 145, 129, 129, 98, 67, + 240, 112, 12, 8, 240, 200, 33, 97, 97, 113, 113, 129, + 130, 144, 17, 9, 240, 245, 19, 17, 113, 49, 49, 33, + 33, 33, 49, 65, 145, 146, 192, 13, 6, 209, 81, 81, + 97, 18, 34, 49, 65, 81, 101, 96, 17, 8, 225, 33, + 33, 33, 17, 49, 49, 129, 18, 66, 81, 97, 113, 133, + 160, 22, 9, 193, 129, 49, 22, 33, 33, 113, 65, 49, + 65, 33, 51, 33, 33, 34, 65, 33, 17, 66, 192, 17, + 8, 240, 33, 113, 37, 113, 113, 65, 33, 49, 49, 49, + 65, 51, 17, 224, 26, 9, 225, 129, 65, 49, 65, 20, + 50, 33, 17, 33, 49, 34, 17, 17, 50, 17, 19, 18, + 34, 33, 34, 34, 17, 144, 22, 9, 177, 129, 129, 99, + 19, 66, 49, 49, 81, 33, 51, 18, 33, 34, 17, 33, + 33, 33, 50, 160, 20, 9, 240, 244, 65, 17, 33, 33, + 33, 50, 49, 50, 33, 66, 33, 65, 18, 65, 98, 176, + 24, 9, 241, 49, 65, 49, 65, 33, 39, 81, 33, 81, + 33, 51, 33, 33, 34, 33, 17, 33, 17, 17, 34, 192, + 26, 9, 240, 17, 33, 49, 33, 17, 65, 33, 39, 81, + 33, 81, 33, 51, 33, 33, 34, 33, 17, 33, 17, 17, + 34, 192, 26, 9, 242, 33, 49, 33, 17, 49, 34, 37, + 17, 81, 33, 81, 33, 51, 33, 33, 34, 33, 17, 33, + 17, 17, 34, 192, 21, 9, 240, 129, 52, 17, 97, 33, + 65, 50, 49, 49, 17, 17, 65, 49, 65, 49, 49, 83, + 208, 21, 9, 240, 17, 97, 37, 33, 81, 113, 49, 65, + 50, 33, 65, 17, 17, 65, 49, 49, 83, 208, 22, 9, + 242, 97, 37, 17, 33, 49, 34, 49, 49, 17, 33, 49, + 49, 65, 49, 65, 49, 49, 83, 208, 19, 9, 240, 98, + 146, 241, 81, 33, 33, 33, 49, 17, 17, 65, 34, 65, + 33, 50, 208, 22, 9, 240, 17, 66, 49, 97, 145, 81, + 81, 33, 33, 33, 49, 17, 17, 65, 34, 65, 33, 50, + 208, 22, 9, 242, 67, 33, 81, 33, 98, 81, 81, 33, + 33, 33, 49, 17, 17, 65, 34, 65, 33, 50, 208, 12, + 9, 0, 5, 115, 81, 49, 49, 81, 146, 240, 192, 15, + 9, 240, 161, 97, 33, 97, 67, 81, 49, 49, 81, 146, + 240, 192, 16, 9, 242, 97, 33, 81, 33, 98, 51, 81, + 49, 49, 81, 146, 240, 192, 24, 9, 240, 65, 22, 17, + 65, 33, 81, 33, 39, 81, 33, 51, 33, 33, 34, 33, + 17, 33, 17, 17, 34, 192, 26, 9, 240, 17, 33, 19, + 33, 17, 65, 33, 81, 33, 39, 81, 33, 51, 33, 33, + 34, 33, 17, 33, 17, 17, 34, 192, 26, 9, 242, 33, + 19, 33, 17, 49, 34, 82, 17, 36, 33, 81, 33, 51, + 33, 33, 34, 33, 17, 33, 17, 17, 34, 192, 16, 8, + 209, 113, 40, 81, 55, 81, 68, 49, 50, 33, 49, 17, + 35, 176, 20, 9, 240, 68, 129, 33, 81, 33, 81, 33, + 39, 17, 33, 51, 33, 49, 34, 49, 98, 192, 19, 9, + 193, 129, 85, 33, 65, 65, 19, 81, 33, 81, 33, 98, + 65, 49, 65, 68, 176, 24, 9, 225, 81, 33, 81, 33, + 85, 50, 33, 17, 17, 17, 17, 50, 17, 17, 50, 33, + 65, 18, 65, 98, 176, 15, 7, 161, 97, 55, 49, 97, + 55, 33, 97, 49, 33, 49, 51, 128, 17, 7, 240, 240, + 33, 49, 33, 49, 19, 19, 49, 33, 49, 49, 17, 65, + 160, 18, 9, 225, 129, 81, 33, 81, 20, 20, 65, 49, + 65, 49, 34, 81, 129, 129, 208, 20, 7, 240, 240, 33, + 33, 35, 17, 17, 17, 18, 17, 17, 17, 17, 19, 33, + 33, 81, 160, 24, 9, 225, 129, 101, 17, 17, 33, 34, + 17, 33, 33, 17, 49, 33, 17, 17, 17, 33, 17, 36, + 97, 98, 208, 13, 6, 240, 193, 81, 83, 49, 51, 33, + 34, 34, 33, 96, 16, 7, 161, 97, 97, 100, 49, 97, + 68, 33, 50, 17, 49, 17, 19, 160, 14, 7, 242, 114, + 33, 97, 97, 35, 19, 49, 97, 81, 51, 144, 15, 5, + 161, 50, 50, 50, 50, 17, 17, 17, 33, 65, 49, 34, + 112, 17, 7, 245, 81, 81, 83, 34, 49, 50, 33, 17, + 33, 17, 17, 34, 51, 144, 22, 9, 177, 129, 129, 99, + 34, 65, 17, 33, 50, 49, 49, 49, 50, 49, 33, 17, + 49, 65, 66, 144, 13, 7, 245, 81, 81, 83, 34, 49, + 113, 97, 81, 51, 144, 16, 7, 240, 241, 97, 67, 18, + 50, 33, 33, 49, 18, 50, 17, 18, 128, 21, 9, 177, + 129, 129, 99, 34, 65, 17, 33, 50, 65, 33, 81, 18, + 82, 17, 65, 49, 34, 176, 22, 9, 240, 69, 129, 85, + 49, 33, 33, 17, 49, 50, 49, 20, 33, 17, 33, 18, + 33, 33, 98, 160, 18, 9, 240, 71, 97, 100, 50, 65, + 66, 33, 53, 65, 115, 34, 17, 50, 33, 144, 18, 8, + 177, 113, 71, 49, 114, 34, 17, 34, 33, 33, 17, 65, + 33, 65, 132, 144, 17, 8, 240, 65, 113, 97, 113, 114, + 81, 33, 65, 33, 34, 49, 34, 66, 144, 17, 9, 240, + 17, 50, 65, 65, 17, 145, 52, 50, 65, 129, 129, 98, + 82, 224, 17, 8, 240, 240, 65, 113, 115, 65, 33, 33, + 17, 33, 34, 17, 17, 97, 192, 15, 6, 240, 194, 17, + 49, 17, 21, 49, 17, 49, 17, 49, 65, 128, 9, 4, + 97, 17, 33, 17, 240, 240, 64, 9, 4, 82, 17, 34, + 33, 18, 240, 224, 8, 4, 240, 17, 65, 65, 69, 192, + 13, 7, 240, 65, 65, 34, 49, 49, 113, 113, 52, 240, + 144, 20, 7, 146, 81, 18, 49, 34, 17, 97, 18, 50, + 33, 17, 65, 17, 65, 17, 49, 66, 160, 11, 6, 240, + 246, 81, 33, 17, 49, 81, 50, 160, 14, 8, 240, 152, + 113, 49, 33, 65, 17, 81, 113, 97, 82, 224, 12, 6, + 240, 225, 65, 50, 34, 17, 81, 81, 81, 128, 14, 7, + 240, 81, 97, 81, 81, 67, 34, 33, 97, 97, 97, 144, + 11, 6, 240, 177, 81, 55, 66, 65, 65, 50, 128, 13, + 8, 177, 113, 113, 73, 98, 97, 97, 113, 82, 66, 192, + 11, 7, 240, 240, 101, 65, 97, 97, 97, 55, 112, 12, + 9, 240, 215, 81, 129, 129, 129, 129, 73, 240, 48, 13, + 6, 240, 209, 81, 22, 50, 49, 17, 18, 33, 66, 112, + 15, 9, 225, 129, 129, 57, 81, 114, 82, 17, 50, 49, + 129, 99, 192, 18, 8, 177, 113, 113, 72, 49, 49, 49, + 49, 49, 49, 33, 65, 33, 67, 50, 144, 23, 9, 193, + 49, 65, 17, 33, 49, 33, 40, 65, 49, 65, 49, 65, + 49, 49, 65, 49, 65, 18, 50, 176, 13, 9, 209, 129, + 129, 87, 81, 129, 73, 81, 129, 129, 192, 17, 9, 209, + 33, 81, 49, 65, 17, 53, 17, 81, 129, 73, 81, 129, + 129, 192, 15, 7, 145, 97, 101, 33, 49, 17, 66, 81, + 81, 97, 66, 50, 176, 19, 9, 209, 33, 49, 33, 33, + 37, 65, 49, 49, 65, 33, 81, 113, 129, 98, 82, 240, + 14, 8, 145, 113, 113, 120, 49, 49, 49, 113, 113, 97, + 82, 208, 19, 9, 161, 81, 33, 49, 33, 17, 65, 55, + 17, 49, 65, 49, 129, 129, 113, 98, 240, 11, 7, 240, + 103, 97, 97, 97, 97, 104, 97, 112, 14, 9, 209, 33, + 97, 40, 129, 129, 129, 129, 129, 39, 129, 176, 17, 9, + 241, 65, 49, 65, 49, 41, 33, 49, 65, 49, 129, 129, + 113, 98, 208, 19, 9, 240, 17, 49, 33, 33, 33, 49, + 41, 33, 49, 65, 49, 129, 129, 113, 98, 208, 14, 8, + 240, 34, 130, 163, 81, 34, 33, 113, 97, 82, 66, 208, + 18, 9, 240, 17, 18, 49, 33, 34, 33, 178, 81, 50, + 49, 113, 113, 98, 82, 240, 14, 8, 240, 166, 113, 113, + 97, 113, 97, 17, 50, 51, 81, 128, 18, 9, 209, 33, + 97, 33, 22, 129, 129, 113, 129, 113, 17, 66, 49, 18, + 81, 160, 16, 9, 193, 129, 129, 129, 25, 49, 49, 49, + 65, 33, 81, 129, 148, 160, 20, 9, 193, 49, 65, 17, + 33, 49, 33, 81, 25, 49, 49, 49, 65, 33, 81, 129, + 148, 160, 15, 8, 240, 130, 98, 97, 17, 81, 17, 65, + 113, 97, 82, 66, 208, 17, 9, 209, 33, 97, 34, 129, + 97, 33, 81, 33, 65, 129, 113, 98, 82, 240, 17, 7, + 145, 97, 101, 33, 49, 17, 17, 34, 49, 17, 81, 97, + 66, 35, 176, 21, 9, 209, 33, 49, 33, 33, 37, 65, + 49, 49, 17, 33, 33, 49, 17, 113, 129, 98, 67, 240, + 13, 9, 240, 131, 36, 129, 129, 73, 65, 129, 113, 98, + 240, 16, 9, 240, 17, 97, 33, 20, 17, 97, 129, 73, + 65, 129, 113, 98, 240, 14, 6, 240, 241, 17, 34, 17, + 34, 17, 33, 81, 65, 35, 128, 16, 8, 240, 145, 33, + 50, 33, 50, 33, 49, 113, 97, 113, 82, 51, 192, 19, + 9, 240, 17, 97, 34, 33, 33, 33, 33, 81, 33, 49, + 129, 113, 129, 98, 67, 224, 12, 9, 240, 71, 240, 73, + 65, 129, 129, 113, 98, 240, 14, 9, 240, 17, 37, 33, + 97, 185, 65, 129, 129, 113, 98, 240, 13, 6, 193, 81, + 81, 82, 65, 18, 33, 51, 81, 81, 176, 17, 7, 193, + 17, 33, 34, 49, 33, 98, 81, 18, 49, 50, 17, 97, + 97, 208, 13, 8, 193, 113, 113, 56, 65, 113, 113, 113, + 97, 82, 208, 9, 8, 240, 166, 240, 240, 184, 240, 16, + 16, 7, 240, 103, 97, 97, 33, 33, 65, 17, 81, 66, + 17, 18, 65, 112, 17, 9, 209, 129, 129, 87, 113, 113, + 98, 17, 35, 17, 33, 81, 49, 65, 208, 12, 7, 240, + 193, 97, 97, 81, 97, 81, 66, 50, 192, 17, 8, 240, + 177, 113, 49, 49, 49, 33, 65, 33, 81, 17, 82, 98, + 97, 128, 21, 9, 240, 17, 97, 33, 33, 49, 65, 129, + 113, 65, 49, 65, 49, 81, 17, 97, 17, 97, 160, 22, + 9, 242, 97, 33, 33, 33, 33, 33, 50, 49, 113, 65, + 49, 65, 49, 81, 17, 97, 17, 97, 160, 12, 7, 225, + 97, 97, 71, 33, 97, 97, 97, 118, 112, 16, 8, 225, + 17, 49, 34, 65, 33, 113, 51, 20, 65, 113, 113, 134, + 144, 17, 8, 210, 17, 49, 34, 49, 34, 66, 17, 34, + 51, 81, 113, 113, 134, 144, 12, 8, 240, 152, 113, 113, + 113, 97, 113, 82, 51, 192, 14, 9, 209, 33, 97, 41, + 129, 129, 129, 113, 129, 98, 67, 224, 14, 9, 242, 97, + 39, 33, 98, 113, 129, 113, 129, 98, 82, 240, 13, 9, + 240, 240, 130, 97, 33, 65, 65, 145, 146, 240, 192, 16, + 9, 240, 161, 97, 33, 97, 66, 97, 33, 65, 65, 145, + 146, 240, 48, 18, 9, 240, 146, 97, 33, 81, 33, 34, + 34, 33, 33, 65, 65, 145, 146, 240, 48, 17, 9, 209, + 129, 129, 73, 65, 129, 81, 33, 33, 17, 49, 49, 65, + 114, 208, 20, 9, 225, 17, 81, 17, 17, 65, 73, 65, + 129, 81, 33, 33, 17, 49, 49, 65, 114, 208, 21, 10, + 225, 34, 81, 17, 33, 65, 17, 42, 81, 145, 97, 33, + 33, 33, 49, 49, 81, 130, 240, 14, 8, 240, 152, 113, + 97, 33, 49, 65, 17, 97, 129, 129, 160, 9, 6, 195, + 99, 114, 98, 211, 99, 96, 18, 8, 240, 49, 113, 113, + 97, 65, 33, 65, 33, 65, 17, 50, 21, 49, 113, 128, + 16, 8, 240, 113, 113, 49, 49, 65, 33, 82, 113, 97, + 17, 50, 51, 224, 12, 9, 240, 215, 65, 129, 89, 49, + 129, 129, 148, 160, 13, 6, 240, 161, 81, 81, 22, 33, + 33, 17, 49, 81, 144, 17, 9, 240, 97, 129, 35, 51, + 37, 65, 49, 49, 81, 33, 81, 129, 129, 208, 10, 7, + 240, 240, 100, 97, 97, 97, 39, 224, 12, 9, 240, 214, + 129, 129, 129, 129, 129, 41, 240, 48, 7, 5, 240, 245, + 70, 70, 80, 10, 7, 240, 103, 97, 104, 97, 104, 97, + 112, 12, 8, 240, 38, 240, 40, 113, 113, 97, 82, 66, + 192, 13, 5, 161, 50, 50, 50, 50, 49, 65, 65, 49, + 34, 112, 26, 9, 240, 113, 81, 33, 81, 33, 81, 33, + 49, 17, 33, 49, 17, 33, 33, 33, 33, 33, 17, 49, + 17, 33, 50, 192, 14, 7, 225, 97, 97, 97, 97, 97, + 82, 65, 17, 34, 35, 176, 11, 8, 240, 153, 98, 98, + 98, 98, 106, 97, 128, 10, 6, 240, 247, 66, 65, 81, + 65, 50, 128, 12, 8, 240, 153, 98, 98, 97, 97, 113, + 82, 66, 192, 16, 9, 240, 129, 129, 71, 49, 33, 81, + 33, 81, 33, 57, 81, 129, 192, 12, 9, 240, 215, 129, + 113, 98, 113, 129, 73, 240, 48, 11, 7, 240, 103, 97, + 104, 97, 81, 66, 50, 176, 13, 8, 240, 146, 130, 49, + 113, 97, 113, 97, 82, 66, 208, 19, 9, 193, 49, 65, + 17, 33, 49, 33, 40, 17, 97, 17, 97, 113, 129, 98, + 82, 224, 16, 7, 240, 240, 17, 97, 55, 33, 49, 33, + 49, 17, 65, 17, 34, 128, 11, 7, 240, 225, 97, 103, + 49, 97, 81, 66, 176, 17, 9, 240, 163, 52, 20, 33, + 33, 65, 49, 65, 49, 65, 113, 113, 113, 240, 19, 9, + 240, 17, 81, 34, 65, 82, 19, 65, 17, 97, 17, 87, + 17, 49, 129, 129, 208, 16, 10, 240, 65, 129, 17, 82, + 53, 17, 99, 113, 145, 89, 33, 240, 208, 14, 9, 240, + 33, 106, 129, 69, 49, 49, 113, 129, 98, 240, 128, 4, + 2, 196, 128, 9, 8, 240, 240, 161, 135, 240, 240, 160, + 9, 4, 240, 17, 65, 65, 65, 49, 192, 13, 7, 240, + 65, 65, 34, 49, 49, 113, 113, 97, 240, 144, + 0, 0, // Padding + +}; + +tFont *g_psFontWSazanamimincho6x10 = (tFont *)g_pui8Sazanamimincho6x10; diff --git a/third_party/fonts/other/fonts/fontsazanamimincho7x13.c b/third_party/fonts/other/fonts/fontsazanamimincho7x13.c new file mode 100644 index 0000000..3eaadb7 --- /dev/null +++ b/third_party/fonts/other/fonts/fontsazanamimincho7x13.c @@ -0,0 +1,846 @@ +//***************************************************************************** +// +// fontsazanamimincho7x13.c - Font definition for the 7x13 Sazanamimincho font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from Sazanami +// +// Copyright (c) 1990-2003 +// Wada Laboratory, the University of Tokyo. All rights reserved. +// Copyright (c) 2003-2004 +// Electronic Font Open Laboratory (/efont/). All rights reserved +// +// For license, please see README. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 286 in 2 blocks +// Style: sazanamimincho +// Size: 7x13 +// Bold: no +// Italic: no +// Memory usage: 6618 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Sazanamimincho7x13[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 12, + + // + // The height of the font. + // + 14, + + // + // The baseline of the font. + // + 12, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3041 - 0x30ff + // + 0x41, 0x30, 0x00, 0x00, + 0xbf, 0x00, 0x00, 0x00, + 0xbc, 0x06, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x85, 0x01, 0x00, 0x00, // Offset 389 (0x185) + 0x91, 0x01, 0x00, 0x00, // Offset 401 (0x191) + 0xa6, 0x01, 0x00, 0x00, // Offset 422 (0x1a6) + 0xbb, 0x01, 0x00, 0x00, // Offset 443 (0x1bb) + 0xcc, 0x01, 0x00, 0x00, // Offset 460 (0x1cc) + 0xe0, 0x01, 0x00, 0x00, // Offset 480 (0x1e0) + 0xe7, 0x01, 0x00, 0x00, // Offset 487 (0x1e7) + 0xf6, 0x01, 0x00, 0x00, // Offset 502 (0x1f6) + 0x06, 0x02, 0x00, 0x00, // Offset 518 (0x206) + 0x16, 0x02, 0x00, 0x00, // Offset 534 (0x216) + 0x22, 0x02, 0x00, 0x00, // Offset 546 (0x222) + 0x28, 0x02, 0x00, 0x00, // Offset 552 (0x228) + 0x2f, 0x02, 0x00, 0x00, // Offset 559 (0x22f) + 0x34, 0x02, 0x00, 0x00, // Offset 564 (0x234) + 0x44, 0x02, 0x00, 0x00, // Offset 580 (0x244) + 0x54, 0x02, 0x00, 0x00, // Offset 596 (0x254) + 0x62, 0x02, 0x00, 0x00, // Offset 610 (0x262) + 0x70, 0x02, 0x00, 0x00, // Offset 624 (0x270) + 0x7d, 0x02, 0x00, 0x00, // Offset 637 (0x27d) + 0x90, 0x02, 0x00, 0x00, // Offset 656 (0x290) + 0x9d, 0x02, 0x00, 0x00, // Offset 669 (0x29d) + 0xac, 0x02, 0x00, 0x00, // Offset 684 (0x2ac) + 0xba, 0x02, 0x00, 0x00, // Offset 698 (0x2ba) + 0xcb, 0x02, 0x00, 0x00, // Offset 715 (0x2cb) + 0xda, 0x02, 0x00, 0x00, // Offset 730 (0x2da) + 0xdf, 0x02, 0x00, 0x00, // Offset 735 (0x2df) + 0xe6, 0x02, 0x00, 0x00, // Offset 742 (0x2e6) + 0xf3, 0x02, 0x00, 0x00, // Offset 755 (0x2f3) + 0xfa, 0x02, 0x00, 0x00, // Offset 762 (0x2fa) + 0x06, 0x03, 0x00, 0x00, // Offset 774 (0x306) + 0x13, 0x03, 0x00, 0x00, // Offset 787 (0x313) + 0x25, 0x03, 0x00, 0x00, // Offset 805 (0x325) + 0x36, 0x03, 0x00, 0x00, // Offset 822 (0x336) + 0x48, 0x03, 0x00, 0x00, // Offset 840 (0x348) + 0x57, 0x03, 0x00, 0x00, // Offset 855 (0x357) + 0x66, 0x03, 0x00, 0x00, // Offset 870 (0x366) + 0x72, 0x03, 0x00, 0x00, // Offset 882 (0x372) + 0x7f, 0x03, 0x00, 0x00, // Offset 895 (0x37f) + 0x8f, 0x03, 0x00, 0x00, // Offset 911 (0x38f) + 0x9c, 0x03, 0x00, 0x00, // Offset 924 (0x39c) + 0xa9, 0x03, 0x00, 0x00, // Offset 937 (0x3a9) + 0xb6, 0x03, 0x00, 0x00, // Offset 950 (0x3b6) + 0xcc, 0x03, 0x00, 0x00, // Offset 972 (0x3cc) + 0xd9, 0x03, 0x00, 0x00, // Offset 985 (0x3d9) + 0xe9, 0x03, 0x00, 0x00, // Offset 1001 (0x3e9) + 0xf9, 0x03, 0x00, 0x00, // Offset 1017 (0x3f9) + 0x07, 0x04, 0x00, 0x00, // Offset 1031 (0x407) + 0x15, 0x04, 0x00, 0x00, // Offset 1045 (0x415) + 0x25, 0x04, 0x00, 0x00, // Offset 1061 (0x425) + 0x35, 0x04, 0x00, 0x00, // Offset 1077 (0x435) + 0x42, 0x04, 0x00, 0x00, // Offset 1090 (0x442) + 0x50, 0x04, 0x00, 0x00, // Offset 1104 (0x450) + 0x5e, 0x04, 0x00, 0x00, // Offset 1118 (0x45e) + 0x6f, 0x04, 0x00, 0x00, // Offset 1135 (0x46f) + 0x84, 0x04, 0x00, 0x00, // Offset 1156 (0x484) + 0x97, 0x04, 0x00, 0x00, // Offset 1175 (0x497) + 0xa7, 0x04, 0x00, 0x00, // Offset 1191 (0x4a7) + 0xb4, 0x04, 0x00, 0x00, // Offset 1204 (0x4b4) + 0xc2, 0x04, 0x00, 0x00, // Offset 1218 (0x4c2) + 0xd1, 0x04, 0x00, 0x00, // Offset 1233 (0x4d1) + 0xdf, 0x04, 0x00, 0x00, // Offset 1247 (0x4df) + 0xe9, 0x04, 0x00, 0x00, // Offset 1257 (0x4e9) + 0xee, 0x04, 0x00, 0x00, // Offset 1262 (0x4ee) + 0xf5, 0x04, 0x00, 0x00, // Offset 1269 (0x4f5) + 0x02, 0x05, 0x00, 0x00, // Offset 1282 (0x502) + 0x11, 0x05, 0x00, 0x00, // Offset 1297 (0x511) + 0x1e, 0x05, 0x00, 0x00, // Offset 1310 (0x51e) + 0x2e, 0x05, 0x00, 0x00, // Offset 1326 (0x52e) + 0x3a, 0x05, 0x00, 0x00, // Offset 1338 (0x53a) + 0x48, 0x05, 0x00, 0x00, // Offset 1352 (0x548) + 0x5a, 0x05, 0x00, 0x00, // Offset 1370 (0x55a) + 0x69, 0x05, 0x00, 0x00, // Offset 1385 (0x569) + 0x75, 0x05, 0x00, 0x00, // Offset 1397 (0x575) + 0x83, 0x05, 0x00, 0x00, // Offset 1411 (0x583) + 0x96, 0x05, 0x00, 0x00, // Offset 1430 (0x596) + 0xa3, 0x05, 0x00, 0x00, // Offset 1443 (0x5a3) + 0xb5, 0x05, 0x00, 0x00, // Offset 1461 (0x5b5) + 0xc2, 0x05, 0x00, 0x00, // Offset 1474 (0x5c2) + 0xcf, 0x05, 0x00, 0x00, // Offset 1487 (0x5cf) + 0xde, 0x05, 0x00, 0x00, // Offset 1502 (0x5de) + 0xed, 0x05, 0x00, 0x00, // Offset 1517 (0x5ed) + 0xfa, 0x05, 0x00, 0x00, // Offset 1530 (0x5fa) + 0x08, 0x06, 0x00, 0x00, // Offset 1544 (0x608) + 0x16, 0x06, 0x00, 0x00, // Offset 1558 (0x616) + 0x23, 0x06, 0x00, 0x00, // Offset 1571 (0x623) + 0x31, 0x06, 0x00, 0x00, // Offset 1585 (0x631) + 0x42, 0x06, 0x00, 0x00, // Offset 1602 (0x642) + 0x53, 0x06, 0x00, 0x00, // Offset 1619 (0x653) + 0x63, 0x06, 0x00, 0x00, // Offset 1635 (0x663) + 0x6e, 0x06, 0x00, 0x00, // Offset 1646 (0x66e) + 0x7d, 0x06, 0x00, 0x00, // Offset 1661 (0x67d) + 0x80, 0x06, 0x00, 0x00, // Offset 1664 (0x680) + 0x90, 0x06, 0x00, 0x00, // Offset 1680 (0x690) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 4, 8, 0, 14, 5, 1, 39, 18, 32, 12, 5, 82, + 18, 17, 33, 17, 34, 33, 0, 5, 96, 21, 5, 177, + 17, 33, 17, 33, 17, 21, 17, 17, 33, 17, 21, 17, + 17, 33, 17, 33, 17, 176, 21, 6, 241, 52, 17, 33, + 18, 33, 17, 17, 17, 67, 65, 18, 33, 18, 33, 17, + 20, 65, 128, 17, 6, 210, 34, 33, 18, 34, 35, 81, + 65, 83, 34, 34, 17, 34, 34, 208, 20, 6, 226, 49, + 33, 33, 33, 33, 33, 50, 50, 34, 33, 18, 49, 17, + 34, 34, 33, 192, 7, 2, 34, 17, 18, 240, 64, 15, + 4, 113, 33, 33, 49, 33, 49, 49, 49, 49, 65, 49, + 65, 65, 16, 4, 65, 65, 65, 49, 65, 49, 49, 49, + 49, 33, 49, 33, 33, 48, 16, 5, 240, 113, 33, 17, + 17, 19, 49, 51, 17, 17, 17, 33, 240, 32, 12, 5, + 240, 113, 65, 65, 37, 33, 65, 65, 240, 32, 6, 2, + 240, 82, 17, 18, 7, 5, 240, 240, 85, 240, 240, 5, + 2, 240, 84, 64, 16, 6, 177, 81, 65, 81, 65, 81, + 81, 65, 81, 65, 81, 65, 81, 80, 16, 6, 226, 49, + 33, 17, 66, 66, 66, 66, 66, 65, 17, 33, 50, 224, + 14, 5, 193, 50, 33, 17, 65, 65, 65, 65, 65, 65, + 37, 160, 14, 6, 212, 17, 66, 65, 81, 65, 81, 65, + 65, 65, 70, 192, 13, 6, 198, 81, 65, 65, 67, 97, + 82, 66, 65, 20, 208, 19, 6, 240, 17, 66, 49, 17, + 49, 17, 33, 33, 33, 33, 17, 49, 22, 65, 81, 208, + 13, 6, 199, 81, 85, 17, 65, 81, 82, 66, 65, 20, + 208, 15, 6, 227, 33, 65, 81, 81, 19, 18, 50, 66, + 66, 65, 20, 208, 14, 6, 198, 81, 65, 81, 65, 81, + 65, 81, 65, 81, 240, 16, 17, 6, 212, 17, 66, 65, + 17, 33, 50, 49, 33, 17, 66, 66, 65, 20, 208, 15, + 6, 212, 17, 66, 66, 66, 50, 19, 17, 82, 66, 49, + 35, 224, 5, 2, 164, 68, 96, 7, 2, 164, 66, 17, + 18, 48, 13, 5, 240, 65, 49, 49, 49, 49, 81, 81, + 81, 81, 160, 7, 6, 240, 246, 198, 240, 240, 12, 5, + 241, 81, 81, 81, 81, 49, 49, 49, 49, 224, 13, 6, + 212, 17, 66, 65, 65, 65, 81, 81, 177, 81, 224, 18, + 6, 227, 33, 50, 36, 17, 34, 17, 34, 17, 34, 17, + 34, 35, 17, 100, 192, 17, 6, 226, 66, 49, 33, 33, + 33, 33, 33, 36, 17, 66, 66, 66, 65, 192, 18, 6, + 196, 33, 49, 17, 49, 17, 49, 20, 33, 49, 17, 66, + 66, 49, 20, 224, 15, 6, 227, 33, 50, 66, 81, 81, + 81, 81, 65, 17, 49, 35, 208, 15, 6, 196, 33, 49, + 17, 66, 66, 66, 66, 66, 66, 49, 20, 224, 12, 6, + 199, 81, 81, 84, 33, 81, 81, 81, 86, 192, 13, 6, + 199, 81, 81, 84, 33, 81, 81, 81, 81, 240, 32, 16, + 6, 227, 33, 50, 66, 81, 81, 36, 66, 65, 17, 34, + 34, 17, 192, 13, 6, 193, 66, 66, 66, 72, 66, 66, + 66, 66, 65, 192, 13, 3, 99, 17, 33, 33, 33, 33, + 33, 33, 33, 19, 96, 13, 5, 225, 65, 65, 65, 65, + 65, 66, 50, 49, 19, 176, 22, 6, 193, 66, 49, 17, + 33, 33, 33, 33, 17, 50, 17, 33, 33, 33, 49, 17, + 49, 17, 65, 192, 13, 6, 193, 81, 81, 81, 81, 81, + 81, 81, 81, 86, 192, 16, 6, 193, 67, 36, 35, 18, + 18, 18, 18, 66, 66, 66, 66, 65, 192, 16, 6, 193, + 66, 67, 51, 50, 17, 34, 33, 18, 51, 51, 66, 65, + 192, 14, 6, 212, 17, 66, 66, 66, 66, 66, 66, 66, + 65, 20, 208, 14, 6, 197, 17, 66, 66, 66, 70, 17, + 81, 81, 81, 240, 32, 16, 6, 212, 17, 66, 66, 66, + 66, 68, 34, 33, 18, 50, 20, 81, 97, 16, 6, 197, + 17, 66, 66, 66, 70, 17, 33, 33, 49, 17, 66, 65, + 192, 13, 6, 212, 17, 66, 66, 98, 98, 98, 66, 65, + 20, 208, 14, 7, 231, 49, 97, 97, 97, 97, 97, 97, + 97, 97, 240, 32, 14, 6, 193, 66, 66, 66, 66, 66, + 66, 66, 66, 65, 20, 208, 17, 6, 193, 66, 66, 66, + 65, 17, 33, 33, 33, 33, 33, 50, 66, 66, 224, 21, + 5, 161, 50, 50, 50, 17, 18, 17, 18, 17, 18, 17, + 18, 17, 17, 17, 17, 33, 17, 176, 19, 6, 193, 66, + 65, 17, 33, 33, 33, 50, 66, 49, 33, 33, 33, 17, + 66, 65, 192, 16, 5, 161, 50, 50, 49, 17, 17, 33, + 17, 49, 65, 65, 65, 65, 192, 13, 6, 198, 81, 65, + 65, 81, 65, 65, 81, 65, 86, 192, 14, 4, 69, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 52, 15, 6, + 97, 81, 97, 81, 97, 81, 81, 97, 81, 97, 81, 97, + 81, 14, 4, 68, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 53, 10, 6, 130, 49, 33, 17, 65, 0, 7, + 64, 5, 6, 0, 9, 102, 7, 2, 35, 17, 33, 240, + 48, 13, 6, 240, 240, 20, 17, 65, 81, 22, 66, 65, + 21, 192, 15, 6, 193, 81, 81, 81, 19, 18, 50, 66, + 66, 67, 50, 19, 208, 13, 6, 240, 240, 20, 17, 66, + 81, 81, 81, 65, 20, 208, 16, 6, 240, 33, 81, 81, + 19, 18, 51, 66, 66, 66, 50, 19, 17, 192, 12, 6, + 240, 240, 20, 17, 66, 72, 81, 65, 20, 208, 14, 6, + 242, 49, 33, 33, 81, 53, 49, 81, 81, 81, 81, 240, + 18, 6, 240, 240, 19, 18, 49, 17, 49, 17, 49, 35, + 49, 65, 19, 17, 65, 20, 15, 6, 193, 81, 81, 81, + 19, 18, 50, 66, 66, 66, 66, 65, 192, 12, 2, 81, + 17, 34, 17, 17, 17, 17, 17, 17, 64, 14, 4, 177, + 49, 98, 49, 49, 49, 49, 49, 49, 33, 18, 32, 19, + 6, 193, 81, 81, 81, 49, 17, 33, 33, 17, 51, 49, + 33, 33, 49, 17, 65, 192, 13, 2, 66, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 64, 18, 5, 240, 162, 17, + 17, 17, 18, 17, 18, 17, 18, 17, 18, 17, 18, 49, + 160, 13, 6, 240, 241, 19, 18, 50, 66, 66, 66, 66, + 65, 192, 13, 6, 240, 240, 20, 17, 66, 66, 66, 66, + 65, 20, 208, 15, 6, 240, 241, 19, 18, 50, 66, 66, + 67, 50, 19, 17, 81, 80, 15, 6, 240, 240, 19, 18, + 51, 66, 66, 66, 50, 19, 17, 81, 81, 13, 6, 240, + 241, 19, 18, 50, 66, 81, 81, 81, 240, 32, 14, 6, + 240, 240, 20, 17, 65, 17, 98, 97, 17, 65, 20, 208, + 14, 6, 225, 81, 81, 53, 49, 81, 81, 81, 81, 33, + 50, 208, 13, 6, 240, 241, 66, 66, 66, 66, 66, 50, + 19, 17, 192, 14, 5, 240, 161, 50, 50, 49, 17, 17, + 33, 17, 49, 65, 192, 17, 5, 240, 161, 50, 50, 17, + 18, 17, 18, 17, 17, 17, 17, 33, 17, 176, 17, 6, + 240, 241, 65, 17, 33, 33, 33, 50, 49, 33, 33, 33, + 17, 65, 192, 16, 6, 240, 241, 66, 65, 17, 33, 33, + 33, 50, 81, 65, 81, 50, 64, 11, 6, 240, 246, 65, + 65, 65, 81, 65, 70, 192, 15, 4, 98, 17, 49, 49, + 49, 49, 33, 65, 49, 49, 49, 49, 66, 3, 1, 29, + 16, 4, 66, 65, 49, 49, 49, 49, 65, 33, 49, 49, + 49, 49, 18, 32, 12, 6, 113, 65, 17, 34, 33, 17, + 65, 0, 6, 112, + // + // Block 1 Offsets: Codepoints 0x3041 - 0x30ff + // + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x16, 0x03, 0x00, 0x00, // Offset 790 (0x316) + 0x33, 0x03, 0x00, 0x00, // Offset 819 (0x333) + 0x43, 0x03, 0x00, 0x00, // Offset 835 (0x343) + 0x5c, 0x03, 0x00, 0x00, // Offset 860 (0x35c) + 0x6c, 0x03, 0x00, 0x00, // Offset 876 (0x36c) + 0x7d, 0x03, 0x00, 0x00, // Offset 893 (0x37d) + 0x8e, 0x03, 0x00, 0x00, // Offset 910 (0x38e) + 0xa2, 0x03, 0x00, 0x00, // Offset 930 (0x3a2) + 0xba, 0x03, 0x00, 0x00, // Offset 954 (0x3ba) + 0xd7, 0x03, 0x00, 0x00, // Offset 983 (0x3d7) + 0xf5, 0x03, 0x00, 0x00, // Offset 1013 (0x3f5) + 0x18, 0x04, 0x00, 0x00, // Offset 1048 (0x418) + 0x2b, 0x04, 0x00, 0x00, // Offset 1067 (0x42b) + 0x43, 0x04, 0x00, 0x00, // Offset 1091 (0x443) + 0x53, 0x04, 0x00, 0x00, // Offset 1107 (0x453) + 0x68, 0x04, 0x00, 0x00, // Offset 1128 (0x468) + 0x84, 0x04, 0x00, 0x00, // Offset 1156 (0x484) + 0xa5, 0x04, 0x00, 0x00, // Offset 1189 (0x4a5) + 0xb3, 0x04, 0x00, 0x00, // Offset 1203 (0x4b3) + 0xc4, 0x04, 0x00, 0x00, // Offset 1220 (0x4c4) + 0xd7, 0x04, 0x00, 0x00, // Offset 1239 (0x4d7) + 0xef, 0x04, 0x00, 0x00, // Offset 1263 (0x4ef) + 0x01, 0x05, 0x00, 0x00, // Offset 1281 (0x501) + 0x17, 0x05, 0x00, 0x00, // Offset 1303 (0x517) + 0x2b, 0x05, 0x00, 0x00, // Offset 1323 (0x52b) + 0x42, 0x05, 0x00, 0x00, // Offset 1346 (0x542) + 0x5b, 0x05, 0x00, 0x00, // Offset 1371 (0x55b) + 0x79, 0x05, 0x00, 0x00, // Offset 1401 (0x579) + 0x8d, 0x05, 0x00, 0x00, // Offset 1421 (0x58d) + 0xa4, 0x05, 0x00, 0x00, // Offset 1444 (0x5a4) + 0xba, 0x05, 0x00, 0x00, // Offset 1466 (0x5ba) + 0xd4, 0x05, 0x00, 0x00, // Offset 1492 (0x5d4) + 0xec, 0x05, 0x00, 0x00, // Offset 1516 (0x5ec) + 0x07, 0x06, 0x00, 0x00, // Offset 1543 (0x607) + 0x16, 0x06, 0x00, 0x00, // Offset 1558 (0x616) + 0x28, 0x06, 0x00, 0x00, // Offset 1576 (0x628) + 0x3d, 0x06, 0x00, 0x00, // Offset 1597 (0x63d) + 0x4e, 0x06, 0x00, 0x00, // Offset 1614 (0x64e) + 0x65, 0x06, 0x00, 0x00, // Offset 1637 (0x665) + 0x75, 0x06, 0x00, 0x00, // Offset 1653 (0x675) + 0x89, 0x06, 0x00, 0x00, // Offset 1673 (0x689) + 0xa4, 0x06, 0x00, 0x00, // Offset 1700 (0x6a4) + 0xbb, 0x06, 0x00, 0x00, // Offset 1723 (0x6bb) + 0xde, 0x06, 0x00, 0x00, // Offset 1758 (0x6de) + 0xfb, 0x06, 0x00, 0x00, // Offset 1787 (0x6fb) + 0x17, 0x07, 0x00, 0x00, // Offset 1815 (0x717) + 0x38, 0x07, 0x00, 0x00, // Offset 1848 (0x738) + 0x5d, 0x07, 0x00, 0x00, // Offset 1885 (0x75d) + 0x82, 0x07, 0x00, 0x00, // Offset 1922 (0x782) + 0x9e, 0x07, 0x00, 0x00, // Offset 1950 (0x79e) + 0xbd, 0x07, 0x00, 0x00, // Offset 1981 (0x7bd) + 0xda, 0x07, 0x00, 0x00, // Offset 2010 (0x7da) + 0xf4, 0x07, 0x00, 0x00, // Offset 2036 (0x7f4) + 0x12, 0x08, 0x00, 0x00, // Offset 2066 (0x812) + 0x32, 0x08, 0x00, 0x00, // Offset 2098 (0x832) + 0x43, 0x08, 0x00, 0x00, // Offset 2115 (0x843) + 0x58, 0x08, 0x00, 0x00, // Offset 2136 (0x858) + 0x6e, 0x08, 0x00, 0x00, // Offset 2158 (0x86e) + 0x8d, 0x08, 0x00, 0x00, // Offset 2189 (0x88d) + 0xb1, 0x08, 0x00, 0x00, // Offset 2225 (0x8b1) + 0xd7, 0x08, 0x00, 0x00, // Offset 2263 (0x8d7) + 0xec, 0x08, 0x00, 0x00, // Offset 2284 (0x8ec) + 0x07, 0x09, 0x00, 0x00, // Offset 2311 (0x907) + 0x21, 0x09, 0x00, 0x00, // Offset 2337 (0x921) + 0x42, 0x09, 0x00, 0x00, // Offset 2370 (0x942) + 0x5d, 0x09, 0x00, 0x00, // Offset 2397 (0x95d) + 0x70, 0x09, 0x00, 0x00, // Offset 2416 (0x970) + 0x88, 0x09, 0x00, 0x00, // Offset 2440 (0x988) + 0x9f, 0x09, 0x00, 0x00, // Offset 2463 (0x99f) + 0xc4, 0x09, 0x00, 0x00, // Offset 2500 (0x9c4) + 0xd7, 0x09, 0x00, 0x00, // Offset 2519 (0x9d7) + 0xec, 0x09, 0x00, 0x00, // Offset 2540 (0x9ec) + 0xff, 0x09, 0x00, 0x00, // Offset 2559 (0x9ff) + 0x19, 0x0a, 0x00, 0x00, // Offset 2585 (0xa19) + 0x30, 0x0a, 0x00, 0x00, // Offset 2608 (0xa30) + 0x4f, 0x0a, 0x00, 0x00, // Offset 2639 (0xa4f) + 0x63, 0x0a, 0x00, 0x00, // Offset 2659 (0xa63) + 0x7a, 0x0a, 0x00, 0x00, // Offset 2682 (0xa7a) + 0x97, 0x0a, 0x00, 0x00, // Offset 2711 (0xa97) + 0xb2, 0x0a, 0x00, 0x00, // Offset 2738 (0xab2) + 0xca, 0x0a, 0x00, 0x00, // Offset 2762 (0xaca) + 0xe3, 0x0a, 0x00, 0x00, // Offset 2787 (0xae3) + 0xf9, 0x0a, 0x00, 0x00, // Offset 2809 (0xaf9) + 0x0f, 0x0b, 0x00, 0x00, // Offset 2831 (0xb0f) + 0x22, 0x0b, 0x00, 0x00, // Offset 2850 (0xb22) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x39, 0x0b, 0x00, 0x00, // Offset 2873 (0xb39) + 0x42, 0x0b, 0x00, 0x00, // Offset 2882 (0xb42) + 0x4c, 0x0b, 0x00, 0x00, // Offset 2892 (0xb4c) + 0x57, 0x0b, 0x00, 0x00, // Offset 2903 (0xb57) + 0x65, 0x0b, 0x00, 0x00, // Offset 2917 (0xb65) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x7e, 0x0b, 0x00, 0x00, // Offset 2942 (0xb7e) + 0x8e, 0x0b, 0x00, 0x00, // Offset 2958 (0xb8e) + 0xa1, 0x0b, 0x00, 0x00, // Offset 2977 (0xba1) + 0xb1, 0x0b, 0x00, 0x00, // Offset 2993 (0xbb1) + 0xc4, 0x0b, 0x00, 0x00, // Offset 3012 (0xbc4) + 0xd5, 0x0b, 0x00, 0x00, // Offset 3029 (0xbd5) + 0xe9, 0x0b, 0x00, 0x00, // Offset 3049 (0xbe9) + 0xf6, 0x0b, 0x00, 0x00, // Offset 3062 (0xbf6) + 0x06, 0x0c, 0x00, 0x00, // Offset 3078 (0xc06) + 0x1a, 0x0c, 0x00, 0x00, // Offset 3098 (0xc1a) + 0x31, 0x0c, 0x00, 0x00, // Offset 3121 (0xc31) + 0x4b, 0x0c, 0x00, 0x00, // Offset 3147 (0xc4b) + 0x6b, 0x0c, 0x00, 0x00, // Offset 3179 (0xc6b) + 0x7f, 0x0c, 0x00, 0x00, // Offset 3199 (0xc7f) + 0x98, 0x0c, 0x00, 0x00, // Offset 3224 (0xc98) + 0xaf, 0x0c, 0x00, 0x00, // Offset 3247 (0xcaf) + 0xcc, 0x0c, 0x00, 0x00, // Offset 3276 (0xccc) + 0xe0, 0x0c, 0x00, 0x00, // Offset 3296 (0xce0) + 0xfa, 0x0c, 0x00, 0x00, // Offset 3322 (0xcfa) + 0x0b, 0x0d, 0x00, 0x00, // Offset 3339 (0xd0b) + 0x21, 0x0d, 0x00, 0x00, // Offset 3361 (0xd21) + 0x3b, 0x0d, 0x00, 0x00, // Offset 3387 (0xd3b) + 0x5a, 0x0d, 0x00, 0x00, // Offset 3418 (0xd5a) + 0x6c, 0x0d, 0x00, 0x00, // Offset 3436 (0xd6c) + 0x83, 0x0d, 0x00, 0x00, // Offset 3459 (0xd83) + 0x97, 0x0d, 0x00, 0x00, // Offset 3479 (0xd97) + 0xb1, 0x0d, 0x00, 0x00, // Offset 3505 (0xdb1) + 0xc6, 0x0d, 0x00, 0x00, // Offset 3526 (0xdc6) + 0xe2, 0x0d, 0x00, 0x00, // Offset 3554 (0xde2) + 0xf8, 0x0d, 0x00, 0x00, // Offset 3576 (0xdf8) + 0x12, 0x0e, 0x00, 0x00, // Offset 3602 (0xe12) + 0x28, 0x0e, 0x00, 0x00, // Offset 3624 (0xe28) + 0x44, 0x0e, 0x00, 0x00, // Offset 3652 (0xe44) + 0x56, 0x0e, 0x00, 0x00, // Offset 3670 (0xe56) + 0x6d, 0x0e, 0x00, 0x00, // Offset 3693 (0xe6d) + 0x80, 0x0e, 0x00, 0x00, // Offset 3712 (0xe80) + 0x98, 0x0e, 0x00, 0x00, // Offset 3736 (0xe98) + 0xb5, 0x0e, 0x00, 0x00, // Offset 3765 (0xeb5) + 0xc7, 0x0e, 0x00, 0x00, // Offset 3783 (0xec7) + 0xdd, 0x0e, 0x00, 0x00, // Offset 3805 (0xedd) + 0xef, 0x0e, 0x00, 0x00, // Offset 3823 (0xeef) + 0x07, 0x0f, 0x00, 0x00, // Offset 3847 (0xf07) + 0x19, 0x0f, 0x00, 0x00, // Offset 3865 (0xf19) + 0x27, 0x0f, 0x00, 0x00, // Offset 3879 (0xf27) + 0x3c, 0x0f, 0x00, 0x00, // Offset 3900 (0xf3c) + 0x52, 0x0f, 0x00, 0x00, // Offset 3922 (0xf52) + 0x62, 0x0f, 0x00, 0x00, // Offset 3938 (0xf62) + 0x77, 0x0f, 0x00, 0x00, // Offset 3959 (0xf77) + 0x92, 0x0f, 0x00, 0x00, // Offset 3986 (0xf92) + 0xac, 0x0f, 0x00, 0x00, // Offset 4012 (0xfac) + 0xbc, 0x0f, 0x00, 0x00, // Offset 4028 (0xfbc) + 0xd2, 0x0f, 0x00, 0x00, // Offset 4050 (0xfd2) + 0xe8, 0x0f, 0x00, 0x00, // Offset 4072 (0xfe8) + 0xf9, 0x0f, 0x00, 0x00, // Offset 4089 (0xff9) + 0x0f, 0x10, 0x00, 0x00, // Offset 4111 (0x100f) + 0x24, 0x10, 0x00, 0x00, // Offset 4132 (0x1024) + 0x35, 0x10, 0x00, 0x00, // Offset 4149 (0x1035) + 0x4b, 0x10, 0x00, 0x00, // Offset 4171 (0x104b) + 0x61, 0x10, 0x00, 0x00, // Offset 4193 (0x1061) + 0x79, 0x10, 0x00, 0x00, // Offset 4217 (0x1079) + 0x98, 0x10, 0x00, 0x00, // Offset 4248 (0x1098) + 0xb7, 0x10, 0x00, 0x00, // Offset 4279 (0x10b7) + 0xc9, 0x10, 0x00, 0x00, // Offset 4297 (0x10c9) + 0xd8, 0x10, 0x00, 0x00, // Offset 4312 (0x10d8) + 0xee, 0x10, 0x00, 0x00, // Offset 4334 (0x10ee) + 0x02, 0x11, 0x00, 0x00, // Offset 4354 (0x1102) + 0x13, 0x11, 0x00, 0x00, // Offset 4371 (0x1113) + 0x24, 0x11, 0x00, 0x00, // Offset 4388 (0x1124) + 0x39, 0x11, 0x00, 0x00, // Offset 4409 (0x1139) + 0x47, 0x11, 0x00, 0x00, // Offset 4423 (0x1147) + 0x58, 0x11, 0x00, 0x00, // Offset 4440 (0x1158) + 0x66, 0x11, 0x00, 0x00, // Offset 4454 (0x1166) + 0x77, 0x11, 0x00, 0x00, // Offset 4471 (0x1177) + 0x8a, 0x11, 0x00, 0x00, // Offset 4490 (0x118a) + 0xa1, 0x11, 0x00, 0x00, // Offset 4513 (0x11a1) + 0xbf, 0x11, 0x00, 0x00, // Offset 4543 (0x11bf) + 0xd3, 0x11, 0x00, 0x00, // Offset 4563 (0x11d3) + 0xe9, 0x11, 0x00, 0x00, // Offset 4585 (0x11e9) + 0xfb, 0x11, 0x00, 0x00, // Offset 4603 (0x11fb) + 0x11, 0x12, 0x00, 0x00, // Offset 4625 (0x1211) + 0x28, 0x12, 0x00, 0x00, // Offset 4648 (0x1228) + 0x3a, 0x12, 0x00, 0x00, // Offset 4666 (0x123a) + 0x4b, 0x12, 0x00, 0x00, // Offset 4683 (0x124b) + 0x5d, 0x12, 0x00, 0x00, // Offset 4701 (0x125d) + 0x78, 0x12, 0x00, 0x00, // Offset 4728 (0x1278) + 0x8c, 0x12, 0x00, 0x00, // Offset 4748 (0x128c) + 0x9d, 0x12, 0x00, 0x00, // Offset 4765 (0x129d) + 0xb4, 0x12, 0x00, 0x00, // Offset 4788 (0x12b4) + 0xcc, 0x12, 0x00, 0x00, // Offset 4812 (0x12cc) + 0xdf, 0x12, 0x00, 0x00, // Offset 4831 (0x12df) + 0xf3, 0x12, 0x00, 0x00, // Offset 4851 (0x12f3) + 0xfb, 0x12, 0x00, 0x00, // Offset 4859 (0x12fb) + 0x05, 0x13, 0x00, 0x00, // Offset 4869 (0x1305) + 0x10, 0x13, 0x00, 0x00, // Offset 4880 (0x1310) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3041 - 0x30ff + // + 26, 10, 240, 240, 49, 161, 97, 35, 83, 129, 33, 102, + 50, 17, 49, 17, 18, 66, 34, 66, 17, 17, 49, 33, + 66, 32, 29, 11, 49, 177, 161, 18, 69, 129, 33, 113, + 33, 118, 66, 17, 49, 33, 17, 17, 66, 49, 82, 34, + 82, 17, 17, 65, 33, 82, 208, 16, 9, 0, 6, 97, + 81, 33, 97, 17, 114, 98, 17, 17, 98, 129, 240, 25, + 12, 240, 240, 97, 193, 98, 49, 129, 33, 145, 17, 49, + 81, 17, 33, 82, 33, 17, 97, 34, 177, 240, 240, 32, + 16, 7, 240, 240, 17, 114, 129, 35, 34, 49, 97, 97, + 97, 81, 66, 32, 17, 8, 49, 131, 240, 84, 19, 65, + 113, 113, 113, 113, 97, 113, 97, 97, 48, 17, 9, 240, + 240, 145, 146, 240, 19, 51, 17, 113, 113, 115, 81, 33, + 65, 68, 20, 11, 49, 179, 240, 193, 51, 83, 17, 145, + 145, 145, 147, 113, 49, 81, 65, 81, 85, 176, 24, 10, + 240, 240, 177, 81, 65, 82, 34, 65, 19, 145, 20, 66, + 65, 34, 81, 17, 17, 81, 34, 50, 65, 112, 29, 12, + 225, 193, 66, 81, 17, 65, 66, 82, 19, 177, 50, 97, + 18, 33, 82, 81, 50, 97, 18, 17, 33, 49, 50, 51, + 81, 240, 80, 30, 12, 241, 193, 177, 50, 33, 51, 49, + 36, 33, 49, 49, 49, 34, 49, 49, 113, 49, 97, 65, + 97, 49, 97, 33, 17, 97, 49, 240, 48, 35, 13, 177, + 65, 81, 33, 65, 81, 97, 49, 65, 51, 33, 68, 33, + 33, 81, 49, 49, 65, 49, 34, 65, 49, 113, 65, 113, + 49, 113, 33, 17, 113, 49, 240, 80, 19, 9, 49, 145, + 129, 18, 37, 129, 137, 17, 145, 129, 55, 17, 97, 17, + 146, 147, 32, 24, 12, 49, 97, 81, 49, 33, 65, 18, + 17, 53, 177, 180, 53, 17, 193, 177, 103, 65, 97, 65, + 194, 195, 80, 16, 6, 65, 97, 81, 65, 65, 50, 49, + 81, 97, 97, 97, 97, 97, 81, 21, 10, 65, 161, 145, + 129, 49, 65, 33, 33, 18, 65, 33, 145, 161, 161, 161, + 161, 161, 145, 64, 28, 12, 97, 81, 97, 81, 97, 65, + 97, 65, 101, 53, 49, 113, 49, 113, 49, 113, 49, 113, + 66, 81, 65, 81, 81, 81, 161, 80, 33, 13, 97, 65, + 17, 97, 17, 33, 17, 97, 17, 49, 97, 81, 100, 17, + 53, 65, 113, 65, 113, 65, 113, 65, 113, 82, 81, 81, + 81, 97, 81, 177, 96, 14, 10, 193, 166, 113, 129, 240, + 240, 225, 145, 161, 113, 39, 176, 17, 12, 161, 49, 129, + 55, 129, 49, 97, 0, 6, 97, 177, 193, 113, 71, 240, + 19, 10, 49, 161, 161, 35, 67, 52, 17, 161, 145, 86, + 49, 81, 33, 145, 162, 164, 192, 24, 12, 49, 97, 81, + 97, 81, 34, 33, 67, 33, 36, 17, 193, 177, 118, 81, + 81, 65, 177, 194, 196, 240, 16, 18, 10, 161, 161, 145, + 145, 145, 145, 145, 145, 145, 113, 17, 97, 49, 50, 83, + 224, 22, 10, 161, 97, 49, 49, 33, 33, 65, 65, 145, + 145, 145, 145, 145, 113, 17, 97, 49, 50, 83, 224, 20, + 12, 97, 193, 65, 101, 23, 177, 147, 129, 34, 113, 49, + 132, 177, 161, 177, 161, 161, 96, 23, 13, 97, 33, 17, + 129, 33, 18, 101, 39, 193, 163, 145, 34, 129, 49, 148, + 193, 177, 193, 177, 177, 112, 25, 12, 240, 65, 97, 81, + 97, 65, 97, 69, 33, 20, 68, 49, 97, 65, 97, 65, + 97, 50, 97, 65, 113, 197, 224, 30, 13, 177, 129, 65, + 33, 81, 17, 81, 65, 33, 65, 68, 17, 33, 20, 84, + 49, 113, 65, 113, 65, 113, 50, 113, 65, 129, 213, 240, + 16, 20, 11, 209, 35, 98, 33, 145, 145, 145, 51, 53, + 51, 49, 145, 145, 161, 161, 177, 179, 32, 23, 12, 225, + 35, 33, 66, 34, 33, 97, 33, 113, 161, 51, 69, 67, + 49, 161, 161, 177, 177, 193, 195, 48, 22, 11, 209, 177, + 33, 115, 84, 145, 52, 49, 98, 33, 81, 49, 161, 161, + 49, 81, 65, 81, 85, 176, 26, 12, 161, 49, 81, 33, + 49, 33, 33, 83, 100, 161, 52, 65, 98, 49, 81, 65, + 177, 177, 49, 97, 65, 97, 85, 208, 24, 11, 49, 177, + 161, 34, 33, 51, 84, 145, 161, 50, 81, 18, 33, 51, + 81, 33, 113, 161, 145, 130, 99, 64, 27, 13, 49, 209, + 97, 81, 34, 50, 51, 49, 52, 97, 65, 193, 50, 113, + 18, 33, 83, 81, 65, 113, 193, 177, 162, 131, 96, 15, + 10, 0, 8, 19, 82, 49, 19, 97, 145, 145, 129, 114, + 83, 64, 18, 12, 240, 240, 181, 33, 34, 81, 34, 129, + 177, 177, 177, 161, 146, 115, 240, 208, 21, 13, 177, 161, + 33, 161, 117, 49, 34, 81, 50, 129, 193, 193, 193, 177, + 162, 131, 240, 240, 16, 17, 12, 240, 100, 68, 68, 33, + 161, 177, 161, 177, 177, 177, 177, 193, 195, 224, 23, 13, + 240, 115, 17, 68, 84, 33, 49, 113, 33, 33, 97, 49, + 113, 193, 193, 193, 193, 209, 211, 240, 16, 16, 9, 177, + 145, 129, 129, 129, 35, 51, 82, 97, 113, 129, 145, 151, + 144, 20, 11, 209, 97, 65, 49, 33, 49, 65, 81, 161, + 35, 83, 114, 129, 145, 161, 177, 183, 208, 27, 11, 49, + 177, 161, 17, 70, 129, 51, 49, 98, 33, 81, 49, 81, + 65, 81, 49, 97, 116, 97, 50, 81, 49, 17, 83, 64, + 23, 11, 177, 177, 161, 68, 33, 34, 51, 113, 33, 161, + 161, 161, 49, 97, 17, 17, 113, 54, 17, 161, 144, 35, + 12, 240, 49, 193, 177, 97, 37, 65, 17, 17, 49, 50, + 33, 65, 33, 33, 81, 17, 17, 17, 82, 34, 98, 34, + 50, 18, 17, 17, 33, 33, 33, 98, 17, 192, 29, 12, + 33, 193, 177, 177, 129, 34, 35, 54, 49, 66, 81, 65, + 97, 50, 97, 50, 97, 33, 17, 52, 17, 18, 33, 50, + 49, 51, 224, 28, 11, 240, 180, 82, 17, 33, 49, 49, + 49, 33, 49, 66, 49, 82, 49, 82, 33, 98, 33, 81, + 17, 17, 97, 33, 82, 114, 240, 33, 11, 113, 49, 113, + 49, 97, 49, 17, 67, 17, 37, 33, 113, 33, 113, 33, + 113, 33, 113, 33, 17, 36, 49, 33, 50, 33, 33, 49, + 17, 17, 51, 224, 37, 13, 113, 49, 17, 113, 49, 17, + 97, 17, 49, 17, 68, 33, 37, 65, 113, 65, 113, 65, + 113, 65, 113, 65, 17, 36, 81, 33, 50, 65, 33, 49, + 17, 49, 51, 240, 48, 37, 13, 113, 34, 17, 114, 33, + 17, 98, 33, 17, 17, 68, 33, 37, 65, 113, 65, 113, + 65, 113, 65, 113, 65, 17, 36, 81, 33, 50, 65, 33, + 49, 17, 49, 51, 240, 48, 28, 11, 240, 49, 97, 49, + 52, 65, 65, 81, 65, 82, 33, 97, 17, 17, 97, 49, + 97, 49, 81, 65, 81, 81, 49, 115, 240, 16, 31, 12, + 161, 129, 49, 49, 49, 17, 36, 65, 17, 49, 81, 81, + 82, 49, 97, 17, 33, 97, 65, 97, 65, 81, 81, 81, + 97, 49, 131, 240, 48, 29, 11, 130, 129, 33, 49, 49, + 37, 66, 49, 81, 65, 82, 33, 97, 17, 17, 97, 49, + 97, 49, 81, 65, 81, 81, 49, 115, 240, 16, 26, 13, + 240, 33, 211, 193, 177, 177, 193, 209, 177, 17, 18, 33, + 34, 33, 49, 35, 49, 35, 17, 33, 33, 162, 240, 64, + 30, 13, 240, 33, 211, 49, 129, 17, 33, 97, 49, 113, + 193, 209, 177, 17, 18, 33, 34, 33, 49, 35, 49, 35, + 17, 33, 33, 162, 240, 64, 32, 13, 240, 33, 211, 34, + 129, 17, 33, 97, 33, 33, 81, 66, 97, 209, 177, 17, + 18, 33, 34, 33, 49, 35, 49, 35, 17, 33, 33, 162, + 240, 64, 17, 13, 0, 7, 2, 161, 33, 97, 17, 65, + 97, 97, 210, 210, 0, 6, 64, 21, 13, 240, 240, 97, + 161, 33, 82, 49, 97, 33, 97, 17, 65, 97, 97, 210, + 210, 0, 6, 64, 22, 13, 240, 114, 161, 33, 145, 33, + 82, 50, 81, 33, 97, 17, 65, 97, 97, 210, 210, 0, + 6, 64, 31, 11, 177, 49, 50, 33, 51, 65, 81, 65, + 100, 53, 33, 113, 33, 113, 33, 113, 33, 17, 36, 49, + 33, 50, 33, 33, 49, 17, 17, 51, 224, 36, 13, 209, + 49, 50, 17, 33, 51, 65, 17, 81, 33, 49, 100, 17, + 53, 65, 113, 65, 113, 65, 113, 65, 17, 36, 81, 33, + 50, 65, 33, 49, 17, 49, 51, 240, 48, 38, 13, 162, + 17, 49, 50, 33, 17, 51, 17, 33, 17, 81, 34, 33, + 99, 33, 53, 65, 113, 65, 113, 65, 113, 65, 17, 36, + 81, 33, 50, 65, 33, 49, 17, 49, 51, 240, 48, 21, + 9, 65, 145, 49, 68, 21, 129, 49, 67, 37, 129, 129, + 69, 49, 67, 17, 65, 33, 20, 208, 27, 13, 240, 17, + 49, 148, 177, 193, 177, 49, 129, 65, 88, 50, 17, 82, + 17, 49, 65, 34, 33, 81, 66, 81, 177, 240, 48, 26, + 12, 33, 193, 129, 35, 115, 66, 81, 97, 35, 99, 33, + 129, 33, 129, 18, 65, 66, 97, 65, 97, 65, 97, 86, + 240, 33, 12, 240, 49, 193, 97, 65, 97, 36, 83, 33, + 17, 65, 49, 49, 33, 17, 33, 65, 17, 17, 17, 82, + 50, 82, 49, 98, 33, 17, 65, 34, 82, 224, 27, 10, + 65, 161, 81, 49, 99, 147, 65, 33, 81, 33, 65, 35, + 65, 67, 49, 49, 81, 49, 81, 49, 81, 65, 49, 99, + 32, 19, 10, 240, 240, 241, 97, 49, 81, 36, 51, 69, + 81, 49, 50, 81, 145, 161, 145, 64, 24, 12, 97, 193, + 163, 82, 161, 68, 65, 18, 66, 34, 97, 18, 17, 97, + 81, 35, 97, 193, 177, 193, 177, 64, 23, 10, 240, 240, + 225, 161, 65, 68, 17, 35, 50, 17, 33, 51, 49, 50, + 50, 33, 17, 67, 113, 129, 80, 37, 12, 240, 34, 81, + 97, 81, 68, 49, 49, 17, 33, 33, 33, 33, 49, 17, + 17, 49, 49, 18, 65, 49, 18, 17, 33, 49, 17, 49, + 17, 33, 33, 68, 145, 161, 161, 96, 19, 8, 240, 193, + 129, 113, 33, 67, 81, 113, 113, 68, 49, 51, 17, 49, + 33, 19, 64, 21, 10, 65, 161, 145, 145, 34, 83, 113, + 145, 145, 145, 86, 49, 65, 18, 17, 65, 49, 20, 240, + 19, 8, 33, 129, 115, 50, 81, 113, 113, 113, 36, 19, + 66, 98, 97, 97, 82, 66, 64, 26, 8, 1, 129, 34, + 49, 17, 33, 34, 65, 18, 65, 17, 81, 17, 81, 17, + 81, 17, 81, 97, 113, 97, 97, 97, 64, 23, 10, 193, + 50, 83, 17, 129, 129, 129, 133, 66, 65, 33, 114, 129, + 67, 33, 49, 50, 65, 49, 99, 48, 31, 13, 241, 209, + 193, 35, 113, 17, 49, 83, 65, 50, 18, 65, 97, 81, + 82, 81, 82, 81, 65, 17, 81, 49, 33, 81, 33, 34, + 98, 65, 144, 20, 10, 177, 50, 83, 17, 129, 129, 129, + 134, 65, 81, 33, 114, 129, 145, 129, 114, 83, 64, 23, + 9, 240, 240, 113, 145, 129, 130, 19, 19, 17, 49, 34, + 65, 18, 81, 18, 82, 17, 65, 49, 49, 32, 29, 12, + 33, 193, 177, 177, 129, 34, 35, 54, 49, 66, 97, 49, + 113, 34, 113, 34, 113, 17, 17, 97, 17, 33, 81, 66, + 50, 97, 128, 27, 11, 209, 34, 114, 17, 145, 161, 149, + 67, 65, 33, 33, 82, 33, 98, 33, 98, 17, 50, 33, + 18, 33, 34, 33, 67, 208, 24, 12, 241, 34, 131, 161, + 165, 97, 81, 65, 97, 98, 49, 81, 35, 115, 129, 163, + 35, 49, 50, 49, 17, 131, 25, 11, 49, 177, 113, 33, + 18, 84, 129, 161, 65, 68, 35, 18, 50, 49, 66, 129, + 17, 113, 33, 97, 161, 182, 32, 22, 11, 65, 177, 161, + 145, 161, 145, 161, 148, 113, 49, 81, 65, 81, 65, 50, + 81, 33, 17, 98, 208, 22, 11, 225, 82, 67, 17, 17, + 65, 162, 81, 18, 34, 65, 81, 161, 161, 145, 161, 145, + 130, 240, 32, 19, 9, 0, 5, 113, 129, 113, 18, 81, + 33, 33, 17, 49, 35, 49, 65, 19, 113, 224, 23, 9, + 240, 240, 33, 65, 65, 49, 65, 18, 37, 17, 81, 33, + 81, 34, 65, 49, 65, 49, 49, 240, 96, 9, 4, 33, + 17, 33, 17, 0, 5, 96, 10, 4, 18, 17, 34, 33, + 18, 240, 240, 176, 11, 6, 240, 146, 98, 97, 82, 49, + 240, 240, 32, 14, 8, 240, 113, 81, 35, 49, 66, 129, + 114, 81, 240, 240, 224, 25, 10, 209, 161, 129, 35, 65, + 51, 49, 129, 34, 83, 33, 65, 65, 49, 81, 49, 81, + 33, 81, 49, 65, 129, 80, 16, 9, 0, 6, 97, 68, + 20, 49, 65, 33, 98, 113, 129, 113, 113, 80, 19, 10, + 240, 81, 69, 20, 65, 129, 81, 33, 114, 129, 145, 145, + 129, 145, 129, 129, 112, 16, 8, 240, 240, 145, 97, 97, + 83, 35, 33, 113, 113, 113, 113, 113, 32, 19, 9, 240, + 33, 129, 113, 113, 98, 82, 17, 50, 65, 129, 129, 129, + 129, 129, 129, 32, 17, 8, 240, 240, 81, 129, 120, 49, + 17, 81, 17, 65, 113, 97, 97, 97, 64, 20, 10, 225, + 161, 145, 154, 65, 17, 113, 17, 97, 49, 81, 49, 65, + 145, 129, 129, 129, 80, 13, 9, 0, 7, 51, 36, 129, + 129, 129, 132, 20, 65, 144, 16, 11, 240, 240, 163, 38, + 129, 177, 161, 161, 161, 150, 20, 97, 240, 112, 20, 8, + 240, 240, 97, 129, 33, 67, 21, 98, 81, 17, 65, 33, + 49, 49, 33, 50, 113, 32, 23, 11, 240, 33, 177, 161, + 49, 100, 23, 146, 129, 17, 113, 33, 97, 49, 81, 65, + 65, 81, 146, 161, 48, 26, 10, 225, 161, 145, 65, 69, + 21, 49, 65, 65, 65, 65, 49, 65, 65, 65, 49, 81, + 33, 49, 17, 33, 82, 129, 48, 32, 12, 161, 81, 49, + 33, 81, 49, 17, 81, 49, 33, 69, 53, 49, 97, 65, + 97, 65, 81, 65, 97, 65, 81, 81, 65, 49, 17, 65, + 82, 161, 80, 20, 11, 225, 177, 161, 35, 83, 83, 17, + 161, 161, 20, 67, 68, 33, 161, 177, 161, 161, 48, 25, + 12, 161, 65, 65, 33, 65, 65, 17, 65, 35, 99, 99, + 17, 177, 177, 20, 83, 84, 33, 177, 193, 177, 177, 64, + 23, 9, 177, 145, 35, 51, 33, 49, 49, 49, 65, 49, + 49, 49, 65, 33, 65, 129, 113, 113, 113, 113, 112, 29, + 12, 161, 49, 81, 33, 49, 34, 17, 17, 51, 17, 17, + 81, 49, 97, 65, 97, 49, 97, 65, 81, 65, 177, 161, + 161, 161, 161, 160, 20, 11, 209, 177, 161, 161, 67, 38, + 81, 33, 97, 65, 65, 81, 161, 145, 161, 145, 145, 112, + 26, 12, 161, 49, 81, 33, 49, 81, 17, 49, 81, 81, + 67, 54, 97, 33, 113, 65, 81, 81, 177, 161, 177, 161, + 161, 128, 17, 10, 240, 241, 69, 20, 65, 145, 145, 145, + 129, 145, 85, 35, 65, 240, 96, 22, 13, 177, 161, 33, + 161, 18, 68, 17, 52, 49, 193, 193, 193, 177, 193, 148, + 99, 49, 240, 240, 16, 26, 11, 240, 33, 97, 65, 97, + 49, 97, 49, 49, 33, 37, 21, 17, 97, 49, 97, 49, + 97, 49, 145, 161, 145, 145, 96, 31, 12, 161, 113, 17, + 33, 33, 65, 17, 17, 49, 49, 17, 81, 49, 65, 33, + 37, 37, 17, 113, 49, 113, 49, 113, 49, 161, 177, 161, + 161, 112, 18, 10, 240, 98, 161, 240, 18, 161, 97, 129, + 129, 129, 129, 65, 34, 98, 240, 32, 23, 11, 240, 81, + 34, 65, 33, 49, 65, 17, 129, 34, 177, 97, 145, 145, + 145, 145, 81, 34, 114, 240, 64, 20, 10, 240, 97, 67, + 52, 33, 129, 145, 129, 145, 129, 17, 97, 49, 50, 83, + 113, 240, 80, 26, 13, 177, 161, 33, 17, 67, 17, 17, + 36, 33, 17, 145, 193, 177, 193, 177, 17, 145, 49, 98, + 81, 50, 113, 240, 224, 21, 11, 209, 177, 161, 161, 52, + 49, 18, 50, 34, 65, 35, 65, 81, 49, 97, 161, 177, + 181, 192, 28, 12, 161, 49, 81, 33, 49, 81, 17, 49, + 81, 81, 52, 65, 18, 49, 17, 34, 65, 51, 65, 97, + 49, 113, 177, 193, 198, 208, 22, 9, 240, 17, 17, 113, + 17, 97, 33, 81, 33, 65, 49, 65, 113, 129, 113, 129, + 113, 113, 113, 96, 26, 12, 161, 113, 17, 34, 97, 17, + 17, 17, 81, 17, 65, 65, 97, 65, 97, 65, 161, 177, + 161, 177, 161, 161, 161, 144, 22, 10, 225, 161, 149, 65, + 65, 65, 49, 65, 17, 33, 49, 50, 49, 81, 129, 129, + 129, 114, 98, 128, 28, 13, 177, 81, 65, 33, 81, 65, + 17, 86, 97, 65, 113, 65, 97, 17, 33, 97, 49, 17, + 81, 81, 177, 177, 177, 162, 146, 176, 18, 11, 240, 49, + 130, 84, 177, 182, 51, 83, 33, 161, 161, 145, 161, 145, + 145, 112, 23, 12, 161, 130, 33, 82, 33, 17, 20, 65, + 113, 197, 17, 51, 99, 33, 177, 177, 161, 177, 161, 161, + 128, 19, 8, 0, 6, 33, 49, 17, 33, 49, 17, 17, + 49, 17, 65, 113, 97, 97, 97, 64, 24, 11, 240, 161, + 81, 17, 49, 81, 17, 49, 65, 33, 33, 49, 49, 97, + 145, 161, 145, 145, 145, 145, 240, 32, 29, 13, 177, 161, + 33, 33, 65, 33, 17, 49, 65, 17, 33, 49, 49, 81, + 33, 49, 97, 81, 97, 65, 193, 177, 177, 177, 177, 240, + 112, 18, 11, 240, 129, 52, 67, 240, 149, 51, 83, 33, + 161, 145, 161, 145, 145, 145, 128, 22, 12, 161, 145, 33, + 17, 51, 17, 17, 35, 65, 225, 84, 53, 193, 177, 161, + 177, 161, 161, 161, 144, 18, 7, 113, 113, 97, 97, 97, + 99, 65, 34, 33, 65, 17, 97, 97, 97, 97, 80, 24, + 9, 113, 17, 65, 33, 17, 65, 17, 17, 65, 49, 129, + 131, 97, 34, 65, 65, 49, 129, 129, 129, 129, 112, 18, + 11, 240, 17, 177, 161, 65, 85, 22, 161, 161, 161, 145, + 161, 145, 145, 145, 128, 14, 11, 240, 240, 147, 53, 0, + 6, 101, 21, 81, 240, 240, 48, 21, 10, 240, 97, 68, + 36, 49, 129, 145, 51, 33, 115, 130, 113, 33, 81, 65, + 34, 83, 240, 48, 22, 11, 241, 177, 164, 52, 49, 145, + 145, 145, 146, 17, 82, 17, 34, 18, 49, 65, 81, 161, + 161, 80, 16, 8, 225, 129, 113, 113, 97, 113, 97, 113, + 97, 97, 97, 97, 97, 112, 21, 12, 0, 6, 49, 49, + 129, 49, 113, 65, 81, 97, 65, 97, 49, 129, 17, 146, + 161, 240, 144, 27, 13, 240, 145, 161, 33, 161, 17, 49, + 49, 33, 97, 49, 129, 65, 97, 97, 81, 97, 65, 129, + 33, 145, 17, 161, 240, 192, 26, 13, 162, 161, 33, 145, + 33, 162, 65, 49, 145, 49, 129, 65, 97, 97, 81, 97, + 65, 129, 33, 145, 17, 161, 240, 192, 16, 9, 240, 49, + 145, 129, 129, 51, 36, 81, 129, 129, 129, 145, 150, 144, + 22, 10, 240, 49, 17, 81, 33, 17, 81, 17, 17, 81, + 49, 145, 51, 52, 97, 145, 145, 161, 166, 176, 22, 10, + 240, 34, 17, 81, 33, 17, 65, 33, 17, 82, 33, 145, + 51, 52, 97, 145, 145, 161, 166, 176, 17, 9, 240, 49, + 68, 20, 49, 129, 113, 129, 113, 129, 113, 113, 113, 113, + 240, 22, 12, 161, 145, 34, 52, 17, 17, 19, 49, 17, + 145, 161, 177, 161, 177, 161, 161, 161, 161, 240, 112, 21, + 12, 146, 145, 34, 53, 33, 19, 49, 18, 129, 161, 177, + 161, 177, 161, 161, 161, 161, 240, 112, 17, 13, 0, 7, + 17, 177, 17, 97, 33, 49, 98, 81, 210, 210, 0, 6, + 64, 22, 13, 240, 113, 161, 33, 161, 17, 113, 33, 129, + 17, 97, 33, 49, 98, 81, 210, 210, 0, 6, 64, 22, + 13, 240, 98, 161, 33, 145, 33, 113, 34, 113, 17, 97, + 33, 49, 98, 81, 210, 210, 0, 6, 64, 24, 10, 225, + 161, 145, 65, 69, 21, 145, 145, 17, 65, 33, 33, 49, + 33, 49, 17, 49, 50, 65, 130, 145, 64, 31, 12, 161, + 81, 49, 33, 81, 49, 17, 81, 49, 33, 69, 53, 177, + 177, 17, 97, 33, 33, 81, 33, 49, 49, 49, 49, 33, + 65, 162, 177, 96, 31, 12, 146, 81, 49, 33, 81, 33, + 33, 81, 50, 17, 69, 53, 177, 177, 17, 97, 33, 33, + 81, 33, 49, 49, 49, 49, 33, 65, 162, 177, 96, 18, + 11, 240, 240, 49, 84, 37, 65, 145, 145, 145, 82, 33, + 130, 177, 177, 240, 160, 15, 8, 161, 130, 130, 129, 17, + 130, 130, 129, 17, 130, 130, 130, 129, 22, 11, 241, 177, + 161, 161, 145, 161, 161, 33, 97, 65, 81, 66, 17, 17, + 35, 33, 20, 81, 240, 112, 20, 10, 240, 33, 161, 145, + 145, 66, 49, 99, 145, 129, 17, 113, 33, 81, 129, 114, + 98, 128, 17, 11, 240, 129, 67, 68, 145, 161, 97, 55, + 20, 161, 161, 161, 181, 240, 128, 17, 9, 0, 5, 113, + 145, 35, 51, 37, 49, 81, 17, 97, 145, 129, 129, 48, + 21, 11, 209, 177, 161, 52, 67, 50, 34, 65, 34, 17, + 49, 113, 17, 129, 161, 177, 161, 161, 240, 14, 9, 0, + 7, 35, 51, 33, 129, 113, 116, 20, 65, 240, 48, 17, + 11, 240, 240, 241, 51, 83, 33, 161, 145, 161, 149, 21, + 81, 240, 240, 48, 14, 7, 240, 240, 135, 49, 97, 55, + 33, 97, 67, 19, 49, 112, 17, 9, 240, 121, 65, 129, + 129, 68, 35, 49, 129, 129, 129, 84, 35, 65, 144, 19, + 10, 240, 97, 51, 67, 196, 51, 33, 19, 81, 145, 129, + 145, 129, 129, 114, 98, 96, 23, 7, 193, 17, 81, 17, + 65, 17, 65, 17, 65, 17, 65, 17, 65, 17, 65, 81, + 97, 81, 81, 81, 64, 30, 11, 240, 193, 113, 49, 113, + 33, 113, 33, 113, 33, 49, 49, 33, 49, 49, 33, 33, + 49, 49, 33, 49, 49, 17, 49, 66, 49, 81, 240, 20, + 9, 145, 145, 129, 129, 129, 129, 129, 97, 17, 81, 33, + 65, 49, 49, 65, 18, 82, 240, 22, 10, 240, 241, 69, + 20, 65, 17, 113, 17, 113, 33, 81, 49, 81, 49, 36, + 51, 65, 33, 240, 192, 18, 9, 0, 6, 97, 68, 20, + 49, 17, 81, 49, 65, 49, 49, 129, 113, 113, 64, 22, + 10, 240, 81, 69, 20, 65, 17, 113, 33, 97, 33, 81, + 49, 81, 129, 145, 129, 129, 129, 129, 96, 23, 11, 240, + 17, 177, 161, 149, 36, 17, 97, 49, 113, 33, 113, 21, + 21, 17, 49, 97, 161, 161, 161, 64, 18, 11, 240, 240, + 132, 52, 49, 97, 33, 130, 145, 161, 165, 21, 81, 240, + 240, 48, 17, 9, 240, 121, 65, 129, 113, 84, 35, 49, + 113, 129, 113, 113, 98, 82, 112, 18, 10, 240, 242, 161, + 97, 49, 81, 129, 145, 129, 129, 129, 65, 34, 98, 240, + 32, 27, 13, 177, 81, 65, 33, 81, 65, 17, 81, 65, + 33, 69, 68, 65, 65, 113, 81, 81, 97, 81, 177, 193, + 177, 177, 177, 128, 20, 8, 240, 240, 209, 129, 49, 52, + 19, 49, 49, 49, 49, 49, 33, 65, 17, 50, 17, 81, + 17, 8, 240, 240, 177, 129, 113, 50, 36, 49, 49, 33, + 65, 97, 97, 97, 80, 23, 11, 240, 97, 130, 17, 69, + 21, 33, 49, 97, 49, 97, 49, 81, 65, 81, 145, 161, + 130, 129, 240, 64, 24, 12, 240, 113, 113, 33, 17, 97, + 120, 81, 33, 129, 33, 129, 33, 81, 25, 19, 49, 177, + 177, 177, 240, 32, 19, 12, 240, 129, 161, 17, 100, 38, + 33, 113, 18, 129, 177, 177, 137, 19, 240, 240, 240, 20, + 12, 240, 130, 98, 17, 38, 18, 161, 147, 84, 17, 177, + 161, 161, 161, 161, 240, 240, 32, 8, 3, 240, 65, 19, + 17, 240, 16, 10, 12, 0, 9, 1, 101, 22, 0, 9, + 80, 11, 7, 240, 210, 114, 113, 113, 113, 240, 240, 80, + 14, 8, 240, 113, 81, 35, 49, 66, 129, 129, 129, 240, + 240, 176, + 0, 0, // Padding + +}; + +tFont *g_psFontWSazanamimincho7x13 = (tFont *)g_pui8Sazanamimincho7x13; diff --git a/third_party/fonts/other/fonts/fontsazanamimincho8x15.c b/third_party/fonts/other/fonts/fontsazanamimincho8x15.c new file mode 100644 index 0000000..683b39a --- /dev/null +++ b/third_party/fonts/other/fonts/fontsazanamimincho8x15.c @@ -0,0 +1,935 @@ +//***************************************************************************** +// +// fontsazanamimincho8x15.c - Font definition for the 8x15 Sazanamimincho font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from Sazanami +// +// Copyright (c) 1990-2003 +// Wada Laboratory, the University of Tokyo. All rights reserved. +// Copyright (c) 2003-2004 +// Electronic Font Open Laboratory (/efont/). All rights reserved +// +// For license, please see README. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 286 in 2 blocks +// Style: sazanamimincho +// Size: 8x15 +// Bold: no +// Italic: no +// Memory usage: 7691 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Sazanamimincho8x15[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 14, + + // + // The height of the font. + // + 16, + + // + // The baseline of the font. + // + 14, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3041 - 0x30ff + // + 0x41, 0x30, 0x00, 0x00, + 0xbf, 0x00, 0x00, 0x00, + 0x58, 0x08, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x80, 0x01, 0x00, 0x00, // Offset 384 (0x180) + 0x8b, 0x01, 0x00, 0x00, // Offset 395 (0x18b) + 0x97, 0x01, 0x00, 0x00, // Offset 407 (0x197) + 0xb4, 0x01, 0x00, 0x00, // Offset 436 (0x1b4) + 0xd3, 0x01, 0x00, 0x00, // Offset 467 (0x1d3) + 0xf8, 0x01, 0x00, 0x00, // Offset 504 (0x1f8) + 0x16, 0x02, 0x00, 0x00, // Offset 534 (0x216) + 0x1d, 0x02, 0x00, 0x00, // Offset 541 (0x21d) + 0x2e, 0x02, 0x00, 0x00, // Offset 558 (0x22e) + 0x40, 0x02, 0x00, 0x00, // Offset 576 (0x240) + 0x56, 0x02, 0x00, 0x00, // Offset 598 (0x256) + 0x65, 0x02, 0x00, 0x00, // Offset 613 (0x265) + 0x6b, 0x02, 0x00, 0x00, // Offset 619 (0x26b) + 0x72, 0x02, 0x00, 0x00, // Offset 626 (0x272) + 0x77, 0x02, 0x00, 0x00, // Offset 631 (0x277) + 0x88, 0x02, 0x00, 0x00, // Offset 648 (0x288) + 0x9d, 0x02, 0x00, 0x00, // Offset 669 (0x29d) + 0xad, 0x02, 0x00, 0x00, // Offset 685 (0x2ad) + 0xbf, 0x02, 0x00, 0x00, // Offset 703 (0x2bf) + 0xd3, 0x02, 0x00, 0x00, // Offset 723 (0x2d3) + 0xe9, 0x02, 0x00, 0x00, // Offset 745 (0x2e9) + 0xfe, 0x02, 0x00, 0x00, // Offset 766 (0x2fe) + 0x14, 0x03, 0x00, 0x00, // Offset 788 (0x314) + 0x25, 0x03, 0x00, 0x00, // Offset 805 (0x325) + 0x3c, 0x03, 0x00, 0x00, // Offset 828 (0x33c) + 0x52, 0x03, 0x00, 0x00, // Offset 850 (0x352) + 0x57, 0x03, 0x00, 0x00, // Offset 855 (0x357) + 0x5e, 0x03, 0x00, 0x00, // Offset 862 (0x35e) + 0x6c, 0x03, 0x00, 0x00, // Offset 876 (0x36c) + 0x76, 0x03, 0x00, 0x00, // Offset 886 (0x376) + 0x84, 0x03, 0x00, 0x00, // Offset 900 (0x384) + 0x96, 0x03, 0x00, 0x00, // Offset 918 (0x396) + 0xb6, 0x03, 0x00, 0x00, // Offset 950 (0x3b6) + 0xcd, 0x03, 0x00, 0x00, // Offset 973 (0x3cd) + 0xe5, 0x03, 0x00, 0x00, // Offset 997 (0x3e5) + 0xf9, 0x03, 0x00, 0x00, // Offset 1017 (0x3f9) + 0x10, 0x04, 0x00, 0x00, // Offset 1040 (0x410) + 0x1f, 0x04, 0x00, 0x00, // Offset 1055 (0x41f) + 0x2f, 0x04, 0x00, 0x00, // Offset 1071 (0x42f) + 0x45, 0x04, 0x00, 0x00, // Offset 1093 (0x445) + 0x55, 0x04, 0x00, 0x00, // Offset 1109 (0x455) + 0x65, 0x04, 0x00, 0x00, // Offset 1125 (0x465) + 0x76, 0x04, 0x00, 0x00, // Offset 1142 (0x476) + 0x92, 0x04, 0x00, 0x00, // Offset 1170 (0x492) + 0xa2, 0x04, 0x00, 0x00, // Offset 1186 (0x4a2) + 0xbd, 0x04, 0x00, 0x00, // Offset 1213 (0x4bd) + 0xd5, 0x04, 0x00, 0x00, // Offset 1237 (0x4d5) + 0xeb, 0x04, 0x00, 0x00, // Offset 1259 (0x4eb) + 0xfe, 0x04, 0x00, 0x00, // Offset 1278 (0x4fe) + 0x15, 0x05, 0x00, 0x00, // Offset 1301 (0x515) + 0x2c, 0x05, 0x00, 0x00, // Offset 1324 (0x52c) + 0x3f, 0x05, 0x00, 0x00, // Offset 1343 (0x53f) + 0x50, 0x05, 0x00, 0x00, // Offset 1360 (0x550) + 0x63, 0x05, 0x00, 0x00, // Offset 1379 (0x563) + 0x7b, 0x05, 0x00, 0x00, // Offset 1403 (0x57b) + 0x9b, 0x05, 0x00, 0x00, // Offset 1435 (0x59b) + 0xb6, 0x05, 0x00, 0x00, // Offset 1462 (0x5b6) + 0xcd, 0x05, 0x00, 0x00, // Offset 1485 (0x5cd) + 0xdd, 0x05, 0x00, 0x00, // Offset 1501 (0x5dd) + 0xee, 0x05, 0x00, 0x00, // Offset 1518 (0x5ee) + 0xff, 0x05, 0x00, 0x00, // Offset 1535 (0x5ff) + 0x10, 0x06, 0x00, 0x00, // Offset 1552 (0x610) + 0x1c, 0x06, 0x00, 0x00, // Offset 1564 (0x61c) + 0x22, 0x06, 0x00, 0x00, // Offset 1570 (0x622) + 0x29, 0x06, 0x00, 0x00, // Offset 1577 (0x629) + 0x3a, 0x06, 0x00, 0x00, // Offset 1594 (0x63a) + 0x4f, 0x06, 0x00, 0x00, // Offset 1615 (0x64f) + 0x61, 0x06, 0x00, 0x00, // Offset 1633 (0x661) + 0x75, 0x06, 0x00, 0x00, // Offset 1653 (0x675) + 0x86, 0x06, 0x00, 0x00, // Offset 1670 (0x686) + 0x96, 0x06, 0x00, 0x00, // Offset 1686 (0x696) + 0xad, 0x06, 0x00, 0x00, // Offset 1709 (0x6ad) + 0xbf, 0x06, 0x00, 0x00, // Offset 1727 (0x6bf) + 0xcd, 0x06, 0x00, 0x00, // Offset 1741 (0x6cd) + 0xdd, 0x06, 0x00, 0x00, // Offset 1757 (0x6dd) + 0xf4, 0x06, 0x00, 0x00, // Offset 1780 (0x6f4) + 0x04, 0x07, 0x00, 0x00, // Offset 1796 (0x704) + 0x1c, 0x07, 0x00, 0x00, // Offset 1820 (0x71c) + 0x2b, 0x07, 0x00, 0x00, // Offset 1835 (0x72b) + 0x3d, 0x07, 0x00, 0x00, // Offset 1853 (0x73d) + 0x51, 0x07, 0x00, 0x00, // Offset 1873 (0x751) + 0x64, 0x07, 0x00, 0x00, // Offset 1892 (0x764) + 0x71, 0x07, 0x00, 0x00, // Offset 1905 (0x771) + 0x7f, 0x07, 0x00, 0x00, // Offset 1919 (0x77f) + 0x8e, 0x07, 0x00, 0x00, // Offset 1934 (0x78e) + 0x9d, 0x07, 0x00, 0x00, // Offset 1949 (0x79d) + 0xb1, 0x07, 0x00, 0x00, // Offset 1969 (0x7b1) + 0xcb, 0x07, 0x00, 0x00, // Offset 1995 (0x7cb) + 0xe1, 0x07, 0x00, 0x00, // Offset 2017 (0x7e1) + 0xf6, 0x07, 0x00, 0x00, // Offset 2038 (0x7f6) + 0x04, 0x08, 0x00, 0x00, // Offset 2052 (0x804) + 0x16, 0x08, 0x00, 0x00, // Offset 2070 (0x816) + 0x1a, 0x08, 0x00, 0x00, // Offset 2074 (0x81a) + 0x2d, 0x08, 0x00, 0x00, // Offset 2093 (0x82d) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 4, 9, 0, 18, 11, 2, 41, 17, 17, 17, 17, 17, + 81, 17, 48, 12, 5, 2, 18, 17, 33, 17, 34, 33, + 0, 7, 80, 29, 8, 177, 33, 65, 33, 65, 33, 39, + 33, 33, 65, 33, 65, 33, 65, 33, 65, 33, 39, 33, + 33, 65, 33, 65, 33, 65, 33, 176, 31, 7, 49, 83, + 49, 17, 17, 17, 33, 34, 33, 34, 33, 65, 17, 83, + 81, 17, 65, 34, 33, 34, 33, 33, 17, 17, 17, 51, + 81, 97, 48, 37, 8, 113, 18, 66, 33, 33, 17, 33, + 33, 17, 33, 17, 33, 33, 17, 50, 17, 113, 97, 113, + 18, 49, 17, 33, 33, 17, 33, 17, 33, 33, 17, 33, + 34, 66, 17, 112, 30, 8, 163, 65, 49, 49, 49, 49, + 49, 65, 17, 97, 98, 81, 33, 17, 17, 49, 17, 17, + 65, 33, 65, 49, 33, 17, 50, 49, 240, 16, 7, 2, + 2, 17, 18, 240, 160, 17, 4, 113, 33, 33, 49, 33, + 49, 49, 49, 49, 49, 49, 65, 49, 65, 65, 18, 4, + 65, 65, 65, 49, 65, 49, 49, 49, 49, 49, 49, 33, + 49, 33, 33, 48, 22, 7, 240, 240, 17, 49, 33, 33, + 17, 17, 17, 51, 49, 17, 17, 17, 33, 33, 49, 240, + 240, 128, 15, 7, 240, 145, 97, 97, 97, 55, 49, 97, + 97, 97, 240, 240, 16, 6, 2, 240, 146, 17, 18, 7, + 7, 0, 6, 23, 0, 7, 5, 2, 240, 148, 64, 17, + 7, 209, 97, 81, 97, 81, 97, 81, 97, 81, 97, 81, + 97, 81, 97, 208, 21, 6, 130, 49, 33, 33, 33, 17, + 66, 66, 66, 66, 66, 66, 65, 17, 33, 33, 33, 50, + 224, 16, 3, 81, 33, 19, 17, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 96, 18, 6, 130, 49, 33, 17, 66, + 65, 81, 65, 65, 65, 65, 81, 65, 81, 86, 192, 20, + 7, 147, 49, 49, 17, 82, 81, 97, 81, 51, 113, 114, + 82, 81, 17, 49, 51, 240, 16, 22, 7, 177, 82, 82, + 65, 17, 65, 17, 49, 33, 49, 33, 33, 49, 39, 65, + 97, 97, 97, 240, 16, 21, 7, 133, 33, 97, 97, 81, + 19, 34, 49, 17, 81, 97, 98, 82, 81, 17, 49, 51, + 240, 16, 22, 7, 147, 49, 49, 33, 81, 97, 97, 19, + 34, 49, 17, 82, 82, 82, 81, 17, 49, 51, 240, 16, + 17, 7, 119, 97, 81, 97, 81, 97, 97, 97, 81, 97, + 97, 97, 97, 97, 160, 23, 7, 147, 49, 49, 17, 82, + 82, 81, 17, 49, 51, 49, 49, 17, 82, 82, 81, 17, + 49, 51, 240, 16, 22, 7, 147, 49, 49, 17, 82, 82, + 82, 81, 17, 50, 35, 17, 97, 98, 81, 17, 49, 51, + 240, 16, 5, 2, 132, 164, 96, 7, 2, 132, 130, 17, + 18, 80, 14, 5, 240, 65, 49, 49, 49, 49, 65, 81, + 81, 81, 81, 240, 10, 7, 240, 240, 87, 240, 103, 240, + 240, 192, 14, 5, 241, 81, 81, 81, 81, 65, 49, 49, + 49, 49, 240, 64, 18, 7, 147, 49, 49, 17, 82, 82, + 81, 81, 81, 97, 81, 97, 240, 81, 97, 160, 32, 8, + 178, 81, 33, 49, 65, 33, 18, 17, 17, 18, 17, 18, + 17, 33, 18, 17, 33, 18, 17, 33, 18, 34, 17, 33, + 113, 129, 49, 67, 240, 48, 23, 7, 161, 97, 81, 17, + 65, 17, 65, 17, 49, 49, 33, 49, 33, 49, 37, 17, + 82, 82, 82, 81, 224, 24, 7, 116, 49, 49, 33, 65, + 17, 65, 17, 65, 17, 49, 37, 33, 65, 17, 82, 82, + 82, 65, 21, 240, 16, 20, 7, 147, 49, 49, 33, 66, + 97, 97, 97, 97, 97, 97, 113, 65, 17, 49, 51, 240, + 16, 23, 7, 116, 49, 49, 33, 65, 17, 65, 17, 82, + 82, 82, 82, 82, 65, 17, 65, 17, 49, 36, 240, 32, + 15, 7, 120, 97, 97, 97, 97, 102, 17, 97, 97, 97, + 97, 103, 224, 16, 7, 120, 97, 97, 97, 97, 102, 17, + 97, 97, 97, 97, 97, 240, 80, 22, 7, 162, 65, 33, + 33, 65, 17, 81, 97, 97, 52, 82, 82, 81, 17, 65, + 18, 34, 50, 17, 224, 16, 7, 113, 82, 82, 82, 82, + 82, 89, 82, 82, 82, 82, 82, 81, 224, 16, 3, 51, + 17, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 19, + 96, 17, 6, 177, 81, 81, 81, 81, 81, 81, 81, 81, + 82, 65, 17, 33, 50, 224, 28, 7, 113, 65, 17, 65, + 17, 49, 33, 49, 33, 33, 49, 18, 50, 17, 50, 33, + 33, 49, 33, 65, 17, 65, 17, 82, 81, 224, 16, 6, + 97, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 86, 192, 27, 7, 113, 82, 83, 52, 52, 51, 17, 17, + 18, 17, 17, 18, 17, 17, 18, 33, 34, 33, 34, 33, + 34, 33, 34, 81, 224, 24, 7, 113, 83, 67, 66, 17, + 50, 17, 50, 33, 34, 33, 34, 33, 34, 49, 18, 49, + 18, 67, 67, 81, 224, 22, 7, 147, 49, 49, 33, 49, + 17, 82, 82, 82, 82, 82, 82, 81, 17, 49, 33, 49, + 51, 240, 16, 19, 7, 117, 33, 65, 17, 82, 82, 82, + 65, 21, 33, 97, 97, 97, 97, 97, 240, 80, 23, 7, + 147, 49, 49, 33, 49, 17, 82, 82, 82, 82, 82, 82, + 19, 17, 17, 49, 33, 49, 51, 97, 114, 23, 7, 117, + 33, 65, 17, 82, 82, 82, 65, 21, 33, 49, 33, 65, + 17, 65, 17, 65, 17, 82, 81, 224, 19, 7, 147, 49, + 49, 17, 82, 82, 114, 114, 113, 114, 82, 81, 17, 49, + 51, 240, 16, 17, 7, 119, 49, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 240, 32, 19, 7, 113, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 81, 17, 49, + 51, 240, 16, 24, 7, 113, 82, 82, 82, 81, 17, 49, + 33, 49, 33, 49, 49, 17, 65, 17, 65, 17, 81, 97, + 97, 240, 32, 32, 7, 113, 33, 34, 33, 34, 33, 34, + 33, 34, 33, 34, 33, 34, 17, 17, 18, 17, 17, 17, + 18, 18, 33, 49, 33, 49, 33, 49, 33, 49, 240, 27, + 7, 113, 81, 17, 49, 33, 49, 49, 17, 65, 17, 81, + 81, 17, 65, 17, 65, 17, 49, 49, 33, 49, 17, 82, + 81, 224, 23, 7, 113, 82, 81, 17, 49, 33, 49, 33, + 49, 49, 17, 65, 17, 81, 97, 97, 97, 97, 97, 240, + 32, 16, 7, 119, 81, 97, 81, 97, 81, 97, 81, 97, + 81, 97, 81, 103, 224, 17, 4, 5, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 52, 17, 7, + 113, 97, 113, 97, 113, 97, 113, 97, 113, 97, 113, 97, + 113, 97, 112, 17, 4, 4, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 53, 12, 7, 49, 81, + 17, 49, 49, 17, 81, 0, 10, 64, 6, 7, 0, 12, + 39, 112, 7, 2, 3, 17, 33, 240, 144, 17, 7, 240, + 240, 116, 33, 65, 97, 37, 17, 66, 82, 82, 66, 20, + 17, 224, 21, 7, 113, 97, 97, 97, 97, 19, 34, 49, + 17, 82, 82, 82, 82, 83, 49, 17, 19, 240, 16, 18, + 7, 240, 240, 115, 49, 49, 17, 82, 97, 97, 97, 81, + 17, 49, 51, 240, 16, 20, 7, 209, 97, 97, 97, 35, + 17, 17, 51, 82, 82, 82, 82, 81, 17, 50, 35, 17, + 224, 17, 7, 240, 240, 115, 49, 49, 17, 82, 89, 97, + 81, 17, 49, 51, 240, 16, 16, 5, 130, 33, 65, 65, + 37, 33, 65, 65, 65, 65, 65, 65, 65, 192, 23, 8, + 240, 240, 195, 18, 17, 49, 49, 49, 49, 49, 67, 65, + 116, 49, 65, 33, 81, 17, 81, 37, 32, 18, 6, 97, + 81, 81, 81, 81, 19, 18, 50, 66, 66, 66, 66, 66, + 66, 65, 192, 14, 2, 49, 17, 66, 17, 17, 17, 17, + 17, 17, 17, 17, 64, 16, 4, 113, 49, 162, 49, 49, + 49, 49, 49, 49, 49, 49, 33, 18, 32, 23, 6, 97, + 81, 81, 81, 81, 66, 49, 17, 33, 33, 17, 50, 17, + 33, 49, 17, 49, 17, 66, 65, 192, 16, 2, 34, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 64, + 24, 7, 240, 240, 83, 18, 17, 33, 34, 33, 34, 33, + 34, 33, 34, 33, 34, 33, 34, 33, 34, 33, 33, 224, + 15, 6, 240, 241, 19, 18, 50, 66, 66, 66, 66, 66, + 66, 65, 192, 18, 7, 240, 240, 115, 49, 49, 17, 82, + 82, 82, 82, 81, 17, 49, 51, 240, 16, 20, 7, 240, + 240, 81, 19, 34, 49, 17, 82, 82, 82, 83, 49, 17, + 19, 33, 97, 97, 96, 19, 7, 240, 240, 115, 17, 17, + 51, 82, 82, 82, 81, 17, 50, 35, 17, 97, 97, 97, + 13, 4, 240, 81, 20, 33, 49, 49, 49, 49, 49, 49, + 176, 14, 6, 240, 240, 20, 17, 66, 82, 98, 98, 82, + 65, 20, 208, 15, 5, 193, 65, 65, 37, 33, 65, 65, + 65, 65, 65, 65, 82, 160, 15, 6, 240, 241, 66, 66, + 66, 66, 66, 66, 66, 50, 19, 17, 192, 20, 7, 240, + 240, 81, 82, 82, 81, 17, 49, 33, 49, 49, 17, 65, + 17, 81, 97, 240, 32, 26, 7, 240, 240, 81, 33, 34, + 33, 34, 33, 34, 33, 34, 17, 17, 18, 17, 17, 17, + 17, 49, 33, 49, 33, 49, 240, 22, 7, 240, 240, 81, + 81, 17, 49, 49, 17, 65, 17, 81, 81, 17, 65, 17, + 49, 49, 17, 81, 224, 21, 7, 240, 240, 81, 82, 81, + 17, 49, 33, 49, 49, 17, 65, 17, 82, 81, 97, 81, + 66, 80, 14, 7, 240, 240, 102, 81, 81, 97, 81, 97, + 81, 81, 87, 224, 18, 3, 33, 17, 33, 33, 33, 33, + 33, 17, 49, 33, 33, 33, 33, 33, 33, 49, 4, 1, + 15, 1, 19, 3, 1, 49, 33, 33, 33, 33, 33, 49, + 17, 33, 33, 33, 33, 33, 33, 17, 32, 11, 7, 240, + 114, 65, 33, 33, 66, 0, 8, 112, + // + // Block 1 Offsets: Codepoints 0x3041 - 0x30ff + // + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x1a, 0x03, 0x00, 0x00, // Offset 794 (0x31a) + 0x3e, 0x03, 0x00, 0x00, // Offset 830 (0x33e) + 0x52, 0x03, 0x00, 0x00, // Offset 850 (0x352) + 0x6d, 0x03, 0x00, 0x00, // Offset 877 (0x36d) + 0x7e, 0x03, 0x00, 0x00, // Offset 894 (0x37e) + 0x92, 0x03, 0x00, 0x00, // Offset 914 (0x392) + 0xa6, 0x03, 0x00, 0x00, // Offset 934 (0x3a6) + 0xbe, 0x03, 0x00, 0x00, // Offset 958 (0x3be) + 0xda, 0x03, 0x00, 0x00, // Offset 986 (0x3da) + 0xfc, 0x03, 0x00, 0x00, // Offset 1020 (0x3fc) + 0x20, 0x04, 0x00, 0x00, // Offset 1056 (0x420) + 0x4a, 0x04, 0x00, 0x00, // Offset 1098 (0x44a) + 0x62, 0x04, 0x00, 0x00, // Offset 1122 (0x462) + 0x7f, 0x04, 0x00, 0x00, // Offset 1151 (0x47f) + 0x91, 0x04, 0x00, 0x00, // Offset 1169 (0x491) + 0xa9, 0x04, 0x00, 0x00, // Offset 1193 (0x4a9) + 0xc8, 0x04, 0x00, 0x00, // Offset 1224 (0x4c8) + 0xee, 0x04, 0x00, 0x00, // Offset 1262 (0x4ee) + 0xff, 0x04, 0x00, 0x00, // Offset 1279 (0x4ff) + 0x14, 0x05, 0x00, 0x00, // Offset 1300 (0x514) + 0x2a, 0x05, 0x00, 0x00, // Offset 1322 (0x52a) + 0x46, 0x05, 0x00, 0x00, // Offset 1350 (0x546) + 0x5a, 0x05, 0x00, 0x00, // Offset 1370 (0x55a) + 0x74, 0x05, 0x00, 0x00, // Offset 1396 (0x574) + 0x8c, 0x05, 0x00, 0x00, // Offset 1420 (0x58c) + 0xa7, 0x05, 0x00, 0x00, // Offset 1447 (0x5a7) + 0xc2, 0x05, 0x00, 0x00, // Offset 1474 (0x5c2) + 0xe4, 0x05, 0x00, 0x00, // Offset 1508 (0x5e4) + 0xf9, 0x05, 0x00, 0x00, // Offset 1529 (0x5f9) + 0x14, 0x06, 0x00, 0x00, // Offset 1556 (0x614) + 0x30, 0x06, 0x00, 0x00, // Offset 1584 (0x630) + 0x52, 0x06, 0x00, 0x00, // Offset 1618 (0x652) + 0x6b, 0x06, 0x00, 0x00, // Offset 1643 (0x66b) + 0x89, 0x06, 0x00, 0x00, // Offset 1673 (0x689) + 0x96, 0x06, 0x00, 0x00, // Offset 1686 (0x696) + 0xab, 0x06, 0x00, 0x00, // Offset 1707 (0x6ab) + 0xc4, 0x06, 0x00, 0x00, // Offset 1732 (0x6c4) + 0xd7, 0x06, 0x00, 0x00, // Offset 1751 (0x6d7) + 0xf2, 0x06, 0x00, 0x00, // Offset 1778 (0x6f2) + 0x07, 0x07, 0x00, 0x00, // Offset 1799 (0x707) + 0x21, 0x07, 0x00, 0x00, // Offset 1825 (0x721) + 0x41, 0x07, 0x00, 0x00, // Offset 1857 (0x741) + 0x5c, 0x07, 0x00, 0x00, // Offset 1884 (0x75c) + 0x89, 0x07, 0x00, 0x00, // Offset 1929 (0x789) + 0xb0, 0x07, 0x00, 0x00, // Offset 1968 (0x7b0) + 0xd1, 0x07, 0x00, 0x00, // Offset 2001 (0x7d1) + 0xf7, 0x07, 0x00, 0x00, // Offset 2039 (0x7f7) + 0x22, 0x08, 0x00, 0x00, // Offset 2082 (0x822) + 0x4b, 0x08, 0x00, 0x00, // Offset 2123 (0x84b) + 0x6d, 0x08, 0x00, 0x00, // Offset 2157 (0x86d) + 0x94, 0x08, 0x00, 0x00, // Offset 2196 (0x894) + 0xba, 0x08, 0x00, 0x00, // Offset 2234 (0x8ba) + 0xd8, 0x08, 0x00, 0x00, // Offset 2264 (0x8d8) + 0xfb, 0x08, 0x00, 0x00, // Offset 2299 (0x8fb) + 0x1f, 0x09, 0x00, 0x00, // Offset 2335 (0x91f) + 0x33, 0x09, 0x00, 0x00, // Offset 2355 (0x933) + 0x4c, 0x09, 0x00, 0x00, // Offset 2380 (0x94c) + 0x66, 0x09, 0x00, 0x00, // Offset 2406 (0x966) + 0x8b, 0x09, 0x00, 0x00, // Offset 2443 (0x98b) + 0xb4, 0x09, 0x00, 0x00, // Offset 2484 (0x9b4) + 0xdd, 0x09, 0x00, 0x00, // Offset 2525 (0x9dd) + 0xf5, 0x09, 0x00, 0x00, // Offset 2549 (0x9f5) + 0x17, 0x0a, 0x00, 0x00, // Offset 2583 (0xa17) + 0x38, 0x0a, 0x00, 0x00, // Offset 2616 (0xa38) + 0x60, 0x0a, 0x00, 0x00, // Offset 2656 (0xa60) + 0x7d, 0x0a, 0x00, 0x00, // Offset 2685 (0xa7d) + 0x95, 0x0a, 0x00, 0x00, // Offset 2709 (0xa95) + 0xb1, 0x0a, 0x00, 0x00, // Offset 2737 (0xab1) + 0xd1, 0x0a, 0x00, 0x00, // Offset 2769 (0xad1) + 0xfa, 0x0a, 0x00, 0x00, // Offset 2810 (0xafa) + 0x0e, 0x0b, 0x00, 0x00, // Offset 2830 (0xb0e) + 0x27, 0x0b, 0x00, 0x00, // Offset 2855 (0xb27) + 0x3d, 0x0b, 0x00, 0x00, // Offset 2877 (0xb3d) + 0x5b, 0x0b, 0x00, 0x00, // Offset 2907 (0xb5b) + 0x75, 0x0b, 0x00, 0x00, // Offset 2933 (0xb75) + 0x9c, 0x0b, 0x00, 0x00, // Offset 2972 (0xb9c) + 0xb2, 0x0b, 0x00, 0x00, // Offset 2994 (0xbb2) + 0xcb, 0x0b, 0x00, 0x00, // Offset 3019 (0xbcb) + 0xec, 0x0b, 0x00, 0x00, // Offset 3052 (0xbec) + 0x0f, 0x0c, 0x00, 0x00, // Offset 3087 (0xc0f) + 0x2e, 0x0c, 0x00, 0x00, // Offset 3118 (0xc2e) + 0x4a, 0x0c, 0x00, 0x00, // Offset 3146 (0xc4a) + 0x68, 0x0c, 0x00, 0x00, // Offset 3176 (0xc68) + 0x80, 0x0c, 0x00, 0x00, // Offset 3200 (0xc80) + 0x97, 0x0c, 0x00, 0x00, // Offset 3223 (0xc97) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xae, 0x0c, 0x00, 0x00, // Offset 3246 (0xcae) + 0xb9, 0x0c, 0x00, 0x00, // Offset 3257 (0xcb9) + 0xc3, 0x0c, 0x00, 0x00, // Offset 3267 (0xcc3) + 0xd2, 0x0c, 0x00, 0x00, // Offset 3282 (0xcd2) + 0xe5, 0x0c, 0x00, 0x00, // Offset 3301 (0xce5) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x03, 0x0d, 0x00, 0x00, // Offset 3331 (0xd03) + 0x13, 0x0d, 0x00, 0x00, // Offset 3347 (0xd13) + 0x29, 0x0d, 0x00, 0x00, // Offset 3369 (0xd29) + 0x3b, 0x0d, 0x00, 0x00, // Offset 3387 (0xd3b) + 0x50, 0x0d, 0x00, 0x00, // Offset 3408 (0xd50) + 0x65, 0x0d, 0x00, 0x00, // Offset 3429 (0xd65) + 0x7c, 0x0d, 0x00, 0x00, // Offset 3452 (0xd7c) + 0x89, 0x0d, 0x00, 0x00, // Offset 3465 (0xd89) + 0x9b, 0x0d, 0x00, 0x00, // Offset 3483 (0xd9b) + 0xb0, 0x0d, 0x00, 0x00, // Offset 3504 (0xdb0) + 0xc9, 0x0d, 0x00, 0x00, // Offset 3529 (0xdc9) + 0xe7, 0x0d, 0x00, 0x00, // Offset 3559 (0xde7) + 0x0b, 0x0e, 0x00, 0x00, // Offset 3595 (0xe0b) + 0x23, 0x0e, 0x00, 0x00, // Offset 3619 (0xe23) + 0x40, 0x0e, 0x00, 0x00, // Offset 3648 (0xe40) + 0x5a, 0x0e, 0x00, 0x00, // Offset 3674 (0xe5a) + 0x7a, 0x0e, 0x00, 0x00, // Offset 3706 (0xe7a) + 0x92, 0x0e, 0x00, 0x00, // Offset 3730 (0xe92) + 0xaf, 0x0e, 0x00, 0x00, // Offset 3759 (0xeaf) + 0xc3, 0x0e, 0x00, 0x00, // Offset 3779 (0xec3) + 0xd9, 0x0e, 0x00, 0x00, // Offset 3801 (0xed9) + 0xf6, 0x0e, 0x00, 0x00, // Offset 3830 (0xef6) + 0x18, 0x0f, 0x00, 0x00, // Offset 3864 (0xf18) + 0x2d, 0x0f, 0x00, 0x00, // Offset 3885 (0xf2d) + 0x46, 0x0f, 0x00, 0x00, // Offset 3910 (0xf46) + 0x5d, 0x0f, 0x00, 0x00, // Offset 3933 (0xf5d) + 0x7a, 0x0f, 0x00, 0x00, // Offset 3962 (0xf7a) + 0x93, 0x0f, 0x00, 0x00, // Offset 3987 (0xf93) + 0xb3, 0x0f, 0x00, 0x00, // Offset 4019 (0xfb3) + 0xcb, 0x0f, 0x00, 0x00, // Offset 4043 (0xfcb) + 0xe7, 0x0f, 0x00, 0x00, // Offset 4071 (0xfe7) + 0x02, 0x10, 0x00, 0x00, // Offset 4098 (0x1002) + 0x21, 0x10, 0x00, 0x00, // Offset 4129 (0x1021) + 0x35, 0x10, 0x00, 0x00, // Offset 4149 (0x1035) + 0x4e, 0x10, 0x00, 0x00, // Offset 4174 (0x104e) + 0x62, 0x10, 0x00, 0x00, // Offset 4194 (0x1062) + 0x7e, 0x10, 0x00, 0x00, // Offset 4222 (0x107e) + 0x9d, 0x10, 0x00, 0x00, // Offset 4253 (0x109d) + 0xb1, 0x10, 0x00, 0x00, // Offset 4273 (0x10b1) + 0xc9, 0x10, 0x00, 0x00, // Offset 4297 (0x10c9) + 0xde, 0x10, 0x00, 0x00, // Offset 4318 (0x10de) + 0xf9, 0x10, 0x00, 0x00, // Offset 4345 (0x10f9) + 0x0d, 0x11, 0x00, 0x00, // Offset 4365 (0x110d) + 0x1c, 0x11, 0x00, 0x00, // Offset 4380 (0x111c) + 0x35, 0x11, 0x00, 0x00, // Offset 4405 (0x1135) + 0x4f, 0x11, 0x00, 0x00, // Offset 4431 (0x114f) + 0x62, 0x11, 0x00, 0x00, // Offset 4450 (0x1162) + 0x7a, 0x11, 0x00, 0x00, // Offset 4474 (0x117a) + 0x98, 0x11, 0x00, 0x00, // Offset 4504 (0x1198) + 0xb6, 0x11, 0x00, 0x00, // Offset 4534 (0x11b6) + 0xc9, 0x11, 0x00, 0x00, // Offset 4553 (0x11c9) + 0xe2, 0x11, 0x00, 0x00, // Offset 4578 (0x11e2) + 0xfb, 0x11, 0x00, 0x00, // Offset 4603 (0x11fb) + 0x0f, 0x12, 0x00, 0x00, // Offset 4623 (0x120f) + 0x27, 0x12, 0x00, 0x00, // Offset 4647 (0x1227) + 0x3d, 0x12, 0x00, 0x00, // Offset 4669 (0x123d) + 0x52, 0x12, 0x00, 0x00, // Offset 4690 (0x1252) + 0x6d, 0x12, 0x00, 0x00, // Offset 4717 (0x126d) + 0x88, 0x12, 0x00, 0x00, // Offset 4744 (0x1288) + 0xa7, 0x12, 0x00, 0x00, // Offset 4775 (0x12a7) + 0xcb, 0x12, 0x00, 0x00, // Offset 4811 (0x12cb) + 0xee, 0x12, 0x00, 0x00, // Offset 4846 (0x12ee) + 0x03, 0x13, 0x00, 0x00, // Offset 4867 (0x1303) + 0x13, 0x13, 0x00, 0x00, // Offset 4883 (0x1313) + 0x2e, 0x13, 0x00, 0x00, // Offset 4910 (0x132e) + 0x45, 0x13, 0x00, 0x00, // Offset 4933 (0x1345) + 0x58, 0x13, 0x00, 0x00, // Offset 4952 (0x1358) + 0x6d, 0x13, 0x00, 0x00, // Offset 4973 (0x136d) + 0x87, 0x13, 0x00, 0x00, // Offset 4999 (0x1387) + 0x95, 0x13, 0x00, 0x00, // Offset 5013 (0x1395) + 0xa8, 0x13, 0x00, 0x00, // Offset 5032 (0x13a8) + 0xb8, 0x13, 0x00, 0x00, // Offset 5048 (0x13b8) + 0xcb, 0x13, 0x00, 0x00, // Offset 5067 (0x13cb) + 0xe0, 0x13, 0x00, 0x00, // Offset 5088 (0x13e0) + 0xfb, 0x13, 0x00, 0x00, // Offset 5115 (0x13fb) + 0x20, 0x14, 0x00, 0x00, // Offset 5152 (0x1420) + 0x37, 0x14, 0x00, 0x00, // Offset 5175 (0x1437) + 0x53, 0x14, 0x00, 0x00, // Offset 5203 (0x1453) + 0x66, 0x14, 0x00, 0x00, // Offset 5222 (0x1466) + 0x7f, 0x14, 0x00, 0x00, // Offset 5247 (0x147f) + 0x9a, 0x14, 0x00, 0x00, // Offset 5274 (0x149a) + 0xaf, 0x14, 0x00, 0x00, // Offset 5295 (0x14af) + 0xc3, 0x14, 0x00, 0x00, // Offset 5315 (0x14c3) + 0xd8, 0x14, 0x00, 0x00, // Offset 5336 (0x14d8) + 0xf6, 0x14, 0x00, 0x00, // Offset 5366 (0x14f6) + 0x0f, 0x15, 0x00, 0x00, // Offset 5391 (0x150f) + 0x23, 0x15, 0x00, 0x00, // Offset 5411 (0x1523) + 0x3e, 0x15, 0x00, 0x00, // Offset 5438 (0x153e) + 0x5a, 0x15, 0x00, 0x00, // Offset 5466 (0x155a) + 0x71, 0x15, 0x00, 0x00, // Offset 5489 (0x1571) + 0x87, 0x15, 0x00, 0x00, // Offset 5511 (0x1587) + 0x8b, 0x15, 0x00, 0x00, // Offset 5515 (0x158b) + 0x95, 0x15, 0x00, 0x00, // Offset 5525 (0x1595) + 0xa2, 0x15, 0x00, 0x00, // Offset 5538 (0x15a2) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3041 - 0x30ff + // + 30, 10, 240, 240, 49, 145, 18, 68, 129, 33, 101, 81, + 33, 17, 50, 17, 49, 17, 17, 17, 50, 34, 66, 18, + 65, 33, 33, 33, 129, 208, 36, 13, 65, 209, 129, 49, + 18, 101, 161, 193, 33, 150, 97, 49, 33, 66, 49, 49, + 33, 17, 33, 82, 33, 17, 98, 49, 113, 17, 17, 17, + 81, 34, 98, 146, 240, 32, 20, 10, 0, 7, 65, 161, + 145, 81, 33, 113, 17, 130, 114, 17, 17, 81, 18, 145, + 240, 32, 27, 12, 240, 240, 97, 193, 97, 65, 113, 49, + 129, 17, 145, 17, 162, 49, 98, 33, 98, 17, 17, 113, + 33, 177, 240, 240, 48, 17, 7, 240, 129, 114, 240, 17, + 35, 34, 49, 97, 97, 81, 97, 81, 81, 160, 20, 9, + 49, 147, 240, 81, 51, 51, 49, 145, 129, 129, 129, 113, + 129, 113, 113, 113, 113, 80, 20, 10, 240, 240, 209, 162, + 240, 161, 36, 66, 33, 129, 129, 114, 17, 81, 49, 65, + 65, 164, 24, 12, 65, 193, 194, 240, 49, 52, 83, 33, + 161, 161, 161, 163, 129, 49, 97, 65, 81, 81, 65, 113, + 195, 192, 28, 11, 0, 5, 113, 161, 129, 17, 18, 17, + 67, 66, 49, 161, 19, 98, 49, 66, 81, 18, 17, 33, + 33, 50, 50, 81, 240, 48, 34, 15, 49, 241, 225, 81, + 129, 33, 50, 99, 97, 36, 115, 65, 225, 36, 131, 65, + 113, 113, 82, 113, 34, 33, 113, 50, 17, 49, 33, 98, + 66, 129, 240, 160, 36, 13, 241, 209, 193, 81, 97, 97, + 33, 36, 65, 35, 49, 49, 65, 49, 65, 49, 49, 50, + 33, 65, 65, 33, 65, 97, 81, 97, 17, 33, 97, 49, + 17, 177, 240, 80, 42, 14, 240, 17, 145, 65, 113, 17, + 49, 81, 17, 17, 49, 97, 49, 36, 65, 51, 49, 49, + 81, 49, 65, 65, 49, 50, 49, 65, 65, 49, 65, 113, + 81, 113, 17, 33, 113, 49, 17, 193, 240, 112, 24, 10, + 49, 161, 49, 81, 18, 53, 145, 49, 84, 21, 17, 161, + 145, 69, 17, 33, 82, 17, 145, 162, 164, 208, 29, 13, + 81, 81, 97, 49, 33, 81, 18, 17, 17, 22, 193, 49, + 132, 54, 17, 209, 193, 117, 17, 81, 82, 65, 193, 210, + 212, 240, 48, 18, 6, 81, 81, 65, 81, 65, 65, 65, + 65, 97, 97, 97, 97, 81, 97, 81, 96, 24, 10, 81, + 145, 129, 49, 81, 17, 33, 49, 49, 17, 33, 65, 49, + 129, 161, 161, 161, 161, 145, 161, 145, 224, 31, 13, 129, + 65, 113, 81, 113, 65, 113, 65, 117, 54, 49, 129, 49, + 129, 49, 129, 49, 129, 49, 17, 97, 65, 113, 65, 97, + 193, 177, 177, 96, 38, 14, 129, 49, 17, 113, 17, 33, + 17, 113, 17, 17, 17, 113, 17, 49, 116, 17, 54, 65, + 129, 65, 129, 65, 129, 65, 129, 65, 17, 97, 81, 113, + 81, 97, 209, 193, 193, 112, 17, 11, 240, 145, 183, 129, + 145, 240, 240, 113, 161, 161, 177, 129, 40, 240, 128, 21, + 12, 161, 145, 33, 33, 97, 17, 55, 145, 161, 240, 240, + 177, 177, 177, 193, 129, 56, 240, 176, 22, 10, 49, 161, + 161, 35, 67, 52, 17, 145, 161, 145, 69, 17, 33, 82, + 17, 145, 161, 162, 164, 192, 28, 12, 49, 193, 81, 97, + 33, 34, 67, 17, 17, 20, 17, 33, 129, 193, 177, 101, + 17, 65, 82, 49, 177, 193, 194, 196, 240, 16, 20, 10, + 161, 161, 145, 145, 145, 145, 145, 145, 145, 145, 145, 113, + 17, 97, 49, 50, 83, 224, 26, 10, 161, 161, 97, 33, + 65, 33, 17, 81, 17, 17, 81, 49, 145, 145, 145, 145, + 145, 113, 17, 97, 49, 50, 83, 224, 24, 13, 97, 209, + 81, 102, 23, 193, 193, 148, 130, 33, 129, 65, 129, 34, + 146, 17, 193, 177, 193, 177, 177, 112, 27, 15, 97, 97, + 129, 98, 102, 17, 23, 65, 145, 225, 180, 162, 33, 161, + 65, 161, 34, 178, 17, 225, 209, 225, 209, 209, 144, 27, + 14, 240, 113, 129, 81, 129, 65, 129, 70, 49, 20, 85, + 49, 129, 65, 129, 65, 129, 50, 129, 65, 129, 225, 230, + 240, 240, 34, 15, 209, 145, 33, 33, 49, 81, 33, 17, + 65, 65, 33, 97, 69, 17, 49, 20, 101, 49, 145, 65, + 145, 65, 145, 50, 145, 65, 145, 241, 246, 240, 240, 48, + 21, 12, 241, 35, 114, 33, 161, 161, 161, 161, 52, 53, + 67, 49, 161, 161, 177, 177, 193, 195, 240, 27, 13, 177, + 65, 36, 33, 66, 33, 17, 17, 113, 33, 129, 177, 177, + 52, 69, 83, 49, 177, 177, 193, 193, 209, 211, 240, 32, + 28, 12, 33, 193, 177, 49, 113, 18, 130, 116, 161, 83, + 49, 50, 34, 33, 97, 49, 177, 177, 49, 97, 65, 97, + 81, 81, 101, 192, 34, 13, 33, 129, 65, 81, 33, 49, + 49, 33, 17, 49, 18, 49, 82, 132, 177, 83, 65, 50, + 34, 49, 97, 65, 193, 193, 49, 113, 65, 113, 81, 97, + 101, 224, 25, 12, 49, 193, 177, 50, 33, 52, 84, 177, + 161, 177, 36, 83, 65, 50, 113, 33, 129, 177, 161, 146, + 100, 240, 16, 30, 13, 49, 113, 81, 65, 33, 65, 49, + 17, 18, 52, 33, 52, 193, 177, 193, 36, 99, 65, 66, + 113, 49, 129, 193, 177, 162, 116, 240, 48, 13, 9, 0, + 9, 53, 19, 81, 129, 129, 113, 98, 82, 208, 21, 14, + 0, 6, 35, 131, 49, 33, 34, 113, 34, 161, 209, 209, + 193, 193, 178, 147, 0, 5, 112, 25, 15, 209, 193, 33, + 193, 17, 131, 17, 115, 49, 49, 34, 113, 50, 161, 225, + 225, 209, 209, 194, 163, 0, 6, 48, 19, 14, 240, 149, + 70, 68, 65, 193, 193, 209, 193, 209, 209, 209, 225, 225, + 227, 240, 240, 27, 15, 240, 179, 17, 70, 84, 65, 49, + 145, 33, 33, 113, 65, 17, 113, 65, 129, 225, 225, 225, + 241, 241, 243, 240, 240, 48, 21, 10, 177, 161, 145, 145, + 81, 65, 66, 49, 34, 81, 17, 114, 113, 129, 129, 145, + 161, 168, 160, 26, 12, 209, 129, 49, 81, 33, 33, 97, + 17, 33, 97, 81, 66, 81, 34, 113, 17, 146, 145, 161, + 161, 177, 193, 200, 224, 32, 13, 49, 209, 33, 147, 101, + 65, 97, 98, 65, 81, 33, 33, 81, 97, 81, 81, 97, + 81, 97, 65, 113, 133, 113, 67, 81, 65, 33, 84, 240, + 48, 27, 12, 193, 193, 177, 84, 33, 50, 50, 17, 113, + 33, 177, 177, 177, 177, 65, 97, 65, 97, 17, 49, 97, + 85, 17, 240, 112, 45, 14, 240, 81, 225, 129, 65, 129, + 38, 81, 17, 33, 49, 66, 49, 65, 49, 49, 97, 17, + 17, 33, 97, 17, 17, 17, 114, 49, 130, 34, 66, 17, + 17, 17, 33, 33, 34, 33, 49, 33, 33, 17, 146, 240, + 32, 39, 14, 33, 225, 209, 209, 17, 35, 49, 34, 33, + 49, 52, 17, 81, 65, 17, 97, 66, 113, 65, 129, 50, + 129, 50, 84, 33, 17, 65, 49, 17, 33, 65, 50, 34, + 83, 81, 240, 144, 33, 13, 240, 240, 20, 114, 17, 33, + 81, 49, 49, 49, 65, 65, 33, 65, 65, 17, 65, 98, + 65, 98, 49, 97, 33, 17, 113, 34, 113, 177, 162, 240, + 240, 38, 13, 129, 65, 129, 65, 113, 65, 113, 65, 33, + 68, 17, 53, 65, 113, 49, 129, 49, 129, 49, 129, 49, + 129, 49, 17, 37, 50, 33, 67, 33, 33, 65, 33, 17, + 52, 240, 32, 43, 14, 129, 49, 17, 130, 33, 17, 113, + 17, 17, 17, 113, 17, 49, 33, 68, 33, 53, 81, 113, + 65, 129, 65, 129, 65, 129, 65, 129, 65, 17, 37, 66, + 33, 67, 49, 33, 65, 33, 33, 52, 240, 64, 41, 14, + 129, 81, 129, 18, 33, 114, 33, 17, 114, 33, 17, 33, + 68, 33, 53, 81, 113, 65, 129, 65, 129, 65, 129, 65, + 129, 65, 17, 37, 66, 33, 67, 49, 33, 65, 33, 33, + 52, 240, 64, 34, 14, 240, 129, 145, 49, 115, 50, 51, + 17, 81, 97, 97, 97, 98, 65, 113, 17, 49, 113, 33, + 17, 129, 65, 129, 65, 113, 97, 97, 113, 50, 147, 240, + 96, 39, 15, 209, 161, 17, 33, 81, 49, 33, 17, 51, + 50, 17, 35, 17, 81, 113, 97, 113, 98, 81, 113, 17, + 65, 113, 33, 33, 129, 81, 129, 81, 113, 113, 97, 129, + 50, 163, 240, 128, 38, 15, 240, 145, 34, 97, 49, 17, + 33, 51, 51, 36, 17, 81, 18, 65, 97, 113, 98, 81, + 113, 17, 65, 113, 33, 33, 129, 81, 129, 81, 113, 113, + 97, 129, 50, 163, 240, 128, 30, 15, 240, 81, 243, 225, + 209, 209, 225, 241, 241, 17, 129, 49, 34, 33, 33, 81, + 49, 34, 97, 35, 17, 33, 65, 161, 33, 194, 240, 112, + 35, 15, 193, 113, 65, 33, 115, 33, 17, 145, 33, 161, + 209, 225, 241, 241, 17, 129, 49, 34, 33, 33, 81, 49, + 34, 97, 35, 17, 33, 65, 161, 33, 194, 240, 112, 36, + 15, 240, 81, 82, 131, 17, 33, 145, 17, 33, 129, 50, + 129, 225, 241, 241, 17, 129, 49, 34, 33, 33, 81, 49, + 34, 97, 35, 17, 33, 65, 161, 33, 194, 240, 112, 20, + 15, 0, 8, 18, 193, 33, 177, 49, 145, 81, 81, 17, + 113, 81, 146, 242, 0, 9, 48, 25, 15, 240, 177, 193, + 33, 193, 17, 114, 49, 129, 33, 177, 49, 145, 81, 81, + 17, 113, 81, 146, 242, 0, 9, 48, 26, 15, 240, 240, + 162, 193, 33, 114, 33, 33, 97, 33, 34, 113, 49, 145, + 81, 81, 17, 113, 81, 146, 242, 0, 9, 48, 37, 13, + 209, 65, 66, 33, 68, 65, 113, 65, 113, 65, 116, 17, + 38, 49, 129, 49, 129, 49, 129, 49, 129, 49, 17, 37, + 50, 33, 67, 33, 33, 65, 33, 17, 52, 240, 32, 41, + 14, 193, 17, 65, 66, 17, 17, 68, 17, 17, 17, 113, + 81, 113, 81, 116, 33, 38, 65, 129, 65, 129, 65, 129, + 65, 129, 65, 17, 37, 66, 33, 67, 49, 33, 65, 33, + 33, 52, 240, 64, 41, 14, 178, 17, 65, 65, 33, 17, + 69, 33, 17, 113, 18, 33, 113, 81, 116, 33, 38, 65, + 129, 65, 129, 65, 129, 65, 129, 65, 17, 37, 66, 33, + 67, 49, 33, 65, 33, 33, 52, 240, 64, 24, 11, 81, + 177, 65, 84, 38, 161, 161, 65, 83, 54, 161, 161, 101, + 81, 67, 33, 81, 36, 65, 100, 240, 16, 34, 14, 240, + 240, 17, 49, 164, 193, 209, 49, 145, 65, 101, 33, 66, + 17, 51, 49, 49, 82, 17, 49, 81, 34, 49, 81, 49, + 33, 81, 82, 81, 193, 240, 80, 33, 13, 33, 209, 145, + 36, 115, 82, 81, 113, 65, 114, 19, 145, 33, 145, 33, + 81, 49, 33, 97, 33, 17, 113, 50, 113, 65, 113, 65, + 97, 102, 240, 32, 40, 14, 240, 97, 225, 113, 81, 113, + 52, 97, 18, 17, 34, 66, 49, 65, 50, 49, 65, 33, + 17, 33, 97, 17, 33, 17, 98, 65, 114, 50, 97, 17, + 33, 33, 81, 34, 129, 178, 240, 32, 29, 11, 65, 177, + 113, 33, 131, 163, 81, 17, 98, 33, 114, 17, 65, 68, + 49, 49, 97, 49, 97, 49, 97, 49, 81, 81, 49, 115, + 224, 24, 11, 0, 6, 33, 113, 50, 81, 161, 36, 82, + 66, 19, 81, 17, 33, 65, 81, 34, 113, 161, 161, 240, + 16, 28, 14, 240, 97, 226, 114, 66, 97, 225, 68, 81, + 19, 66, 35, 113, 18, 33, 113, 81, 97, 113, 35, 129, + 209, 225, 209, 209, 96, 32, 11, 0, 6, 17, 177, 65, + 68, 49, 33, 17, 33, 33, 17, 33, 49, 18, 49, 49, + 18, 49, 49, 17, 33, 17, 33, 33, 52, 129, 145, 145, + 96, 41, 14, 240, 82, 225, 81, 100, 65, 65, 17, 33, + 49, 49, 33, 49, 33, 33, 49, 65, 17, 17, 65, 65, + 18, 81, 65, 18, 33, 33, 49, 33, 65, 17, 33, 49, + 84, 177, 193, 193, 240, 96, 20, 9, 240, 240, 145, 145, + 129, 33, 83, 97, 129, 129, 84, 65, 51, 33, 49, 34, + 19, 224, 25, 12, 81, 193, 177, 177, 50, 100, 129, 177, + 177, 177, 177, 102, 81, 83, 49, 81, 34, 17, 65, 81, + 20, 240, 64, 22, 10, 49, 161, 147, 97, 113, 129, 145, + 145, 52, 33, 18, 65, 18, 114, 130, 113, 129, 114, 83, + 240, 30, 9, 1, 145, 35, 49, 17, 49, 33, 17, 65, + 18, 81, 18, 81, 17, 97, 17, 97, 17, 97, 17, 97, + 113, 129, 113, 113, 113, 113, 80, 26, 11, 209, 35, 98, + 33, 145, 145, 145, 149, 82, 65, 49, 113, 17, 145, 161, + 50, 81, 33, 33, 49, 49, 51, 84, 240, 39, 15, 49, + 241, 225, 225, 50, 145, 33, 33, 65, 34, 17, 49, 82, + 18, 65, 129, 81, 129, 81, 114, 81, 114, 81, 97, 17, + 81, 49, 17, 33, 81, 33, 17, 34, 98, 97, 240, 160, + 22, 11, 209, 35, 98, 33, 145, 145, 145, 150, 66, 81, + 33, 130, 145, 161, 145, 145, 130, 99, 240, 16, 25, 10, + 240, 240, 177, 161, 145, 146, 19, 35, 17, 49, 50, 81, + 33, 97, 18, 98, 17, 81, 49, 50, 65, 145, 112, 33, + 14, 33, 225, 209, 209, 17, 129, 34, 163, 52, 97, 18, + 65, 82, 113, 65, 145, 34, 145, 34, 129, 33, 17, 129, + 17, 33, 98, 66, 66, 113, 240, 144, 35, 14, 240, 33, + 65, 149, 193, 209, 196, 131, 50, 81, 33, 81, 49, 49, + 97, 17, 49, 114, 65, 114, 49, 51, 34, 33, 49, 50, + 34, 65, 49, 17, 131, 240, 32, 31, 13, 240, 17, 36, + 114, 17, 177, 180, 129, 65, 97, 97, 65, 33, 65, 97, + 17, 33, 113, 34, 147, 145, 179, 35, 50, 50, 49, 17, + 147, 208, 28, 13, 65, 209, 129, 52, 100, 177, 81, 97, + 98, 52, 34, 65, 66, 81, 66, 81, 65, 17, 145, 33, + 129, 49, 129, 209, 214, 240, 30, 14, 81, 225, 209, 193, + 209, 193, 209, 193, 18, 162, 33, 130, 49, 129, 65, 113, + 81, 81, 17, 81, 65, 17, 113, 33, 33, 130, 240, 32, + 24, 12, 225, 195, 33, 18, 67, 33, 240, 51, 81, 18, + 49, 81, 81, 177, 177, 177, 161, 177, 161, 146, 240, 64, + 23, 10, 0, 7, 98, 129, 145, 17, 84, 17, 33, 33, + 49, 49, 17, 49, 50, 65, 65, 34, 81, 49, 240, 23, + 9, 0, 6, 34, 49, 65, 49, 65, 18, 37, 17, 81, + 33, 81, 34, 65, 34, 65, 49, 49, 240, 96, 11, 4, + 33, 17, 33, 17, 17, 17, 0, 6, 32, 10, 4, 82, + 17, 34, 33, 18, 240, 240, 240, 15, 8, 240, 240, 34, + 130, 129, 129, 129, 99, 65, 97, 240, 240, 96, 19, 9, + 240, 161, 97, 35, 65, 17, 34, 33, 97, 145, 145, 115, + 81, 113, 240, 240, 176, 30, 12, 240, 18, 162, 161, 35, + 97, 52, 49, 113, 49, 177, 20, 83, 65, 66, 81, 65, + 81, 65, 97, 65, 81, 66, 17, 49, 131, 240, 32, 16, + 9, 0, 6, 97, 68, 20, 49, 113, 83, 97, 129, 129, + 113, 113, 240, 22, 12, 240, 145, 101, 22, 65, 161, 81, + 65, 113, 33, 131, 145, 177, 177, 161, 177, 161, 161, 240, + 96, 18, 8, 240, 240, 145, 113, 97, 97, 97, 82, 17, + 34, 49, 113, 113, 113, 113, 160, 21, 10, 240, 65, 145, + 129, 129, 129, 130, 113, 33, 66, 49, 34, 81, 145, 145, + 145, 145, 145, 192, 21, 9, 240, 240, 161, 129, 129, 65, + 53, 20, 49, 17, 97, 17, 81, 33, 81, 113, 113, 113, + 208, 23, 11, 241, 177, 161, 81, 75, 81, 17, 129, 17, + 113, 33, 113, 33, 97, 161, 145, 145, 145, 145, 240, 32, + 13, 9, 0, 9, 68, 36, 129, 129, 129, 117, 19, 81, + 144, 18, 14, 0, 6, 51, 71, 177, 225, 209, 209, 209, + 209, 184, 21, 129, 240, 240, 192, 21, 9, 0, 6, 33, + 129, 49, 68, 21, 114, 97, 17, 81, 33, 65, 49, 49, + 65, 114, 129, 48, 25, 12, 240, 65, 177, 65, 101, 23, + 177, 162, 162, 145, 17, 129, 33, 113, 49, 97, 65, 66, + 81, 162, 177, 240, 16, 30, 12, 240, 33, 193, 177, 97, + 70, 37, 65, 97, 65, 81, 81, 81, 81, 65, 81, 81, + 81, 65, 97, 49, 65, 17, 49, 98, 33, 113, 240, 36, + 14, 193, 97, 65, 33, 97, 65, 17, 97, 65, 49, 70, + 69, 65, 129, 65, 113, 81, 113, 81, 97, 81, 113, 81, + 97, 97, 81, 65, 17, 81, 98, 65, 113, 240, 64, 24, + 13, 240, 33, 209, 193, 50, 116, 84, 17, 193, 193, 51, + 100, 114, 17, 84, 49, 193, 209, 193, 193, 240, 32, 29, + 13, 240, 33, 97, 97, 49, 33, 81, 50, 17, 84, 17, + 52, 17, 193, 193, 51, 100, 114, 17, 84, 49, 193, 209, + 193, 193, 240, 32, 26, 10, 209, 161, 50, 68, 17, 65, + 65, 49, 81, 49, 65, 49, 81, 33, 81, 33, 97, 129, + 129, 129, 129, 129, 240, 32, 32, 14, 193, 65, 97, 33, + 65, 50, 17, 17, 68, 17, 17, 97, 65, 113, 81, 113, + 65, 113, 81, 97, 81, 97, 97, 193, 193, 193, 193, 193, + 240, 160, 24, 13, 241, 209, 193, 84, 54, 113, 49, 113, + 81, 97, 81, 81, 97, 65, 97, 193, 177, 177, 177, 177, + 240, 112, 29, 14, 193, 49, 113, 33, 49, 113, 17, 49, + 83, 86, 129, 49, 129, 81, 113, 81, 97, 97, 81, 97, + 209, 193, 193, 193, 193, 240, 144, 20, 11, 240, 240, 49, + 85, 21, 65, 161, 161, 161, 145, 161, 161, 86, 35, 81, + 240, 240, 64, 22, 14, 193, 177, 33, 177, 18, 86, 53, + 65, 209, 209, 209, 193, 209, 209, 134, 83, 81, 0, 5, + 96, 29, 13, 129, 113, 81, 113, 65, 113, 65, 49, 49, + 38, 22, 33, 113, 65, 113, 65, 113, 65, 113, 65, 177, + 193, 177, 177, 177, 240, 80, 34, 14, 129, 49, 65, 82, + 33, 65, 65, 17, 17, 65, 65, 17, 33, 49, 38, 38, + 33, 129, 65, 129, 65, 129, 65, 129, 65, 193, 209, 193, + 193, 193, 240, 112, 21, 12, 240, 162, 193, 240, 240, 34, + 145, 33, 113, 161, 161, 161, 161, 161, 97, 34, 130, 240, + 96, 25, 13, 177, 161, 33, 18, 113, 17, 49, 97, 240, + 210, 145, 49, 113, 177, 177, 177, 177, 177, 113, 34, 146, + 240, 128, 23, 13, 240, 240, 177, 67, 100, 33, 193, 177, + 193, 177, 194, 161, 33, 129, 65, 97, 97, 50, 131, 161, + 208, 29, 14, 240, 177, 177, 33, 33, 67, 17, 17, 52, + 33, 17, 177, 193, 209, 193, 210, 177, 33, 145, 65, 113, + 97, 66, 129, 18, 161, 240, 25, 13, 240, 17, 209, 193, + 193, 68, 65, 19, 50, 50, 81, 36, 81, 97, 65, 113, + 49, 129, 193, 209, 214, 240, 192, 32, 15, 209, 65, 113, + 33, 65, 113, 17, 65, 113, 97, 68, 97, 19, 49, 33, + 50, 81, 68, 81, 129, 65, 145, 49, 161, 225, 241, 246, + 240, 240, 48, 24, 11, 240, 81, 17, 145, 17, 129, 33, + 113, 33, 97, 49, 97, 145, 161, 145, 145, 145, 145, 145, + 145, 240, 64, 28, 14, 193, 145, 17, 34, 129, 17, 17, + 17, 113, 17, 65, 97, 97, 81, 113, 81, 209, 193, 209, + 193, 193, 193, 193, 193, 240, 160, 27, 11, 225, 177, 51, + 68, 33, 65, 81, 49, 81, 65, 81, 49, 34, 17, 49, + 82, 33, 97, 145, 145, 145, 130, 114, 240, 80, 31, 15, + 209, 81, 97, 33, 81, 97, 17, 86, 17, 113, 65, 129, + 81, 113, 81, 113, 34, 33, 97, 82, 97, 97, 209, 209, + 209, 194, 178, 240, 208, 20, 13, 240, 113, 162, 101, 193, + 209, 199, 52, 99, 49, 193, 193, 177, 193, 177, 177, 240, + 96, 25, 14, 193, 162, 33, 114, 33, 17, 37, 65, 129, + 225, 214, 17, 52, 115, 49, 209, 209, 193, 209, 193, 193, + 240, 128, 20, 9, 0, 7, 17, 49, 17, 49, 49, 17, + 33, 49, 17, 81, 129, 113, 113, 113, 113, 224, 28, 12, + 240, 209, 81, 17, 65, 81, 17, 65, 65, 33, 49, 65, + 33, 49, 49, 49, 113, 161, 177, 161, 161, 161, 161, 146, + 240, 64, 31, 15, 209, 193, 33, 65, 113, 18, 65, 65, + 17, 49, 65, 65, 81, 49, 65, 81, 49, 49, 97, 113, + 209, 225, 209, 209, 209, 209, 194, 240, 160, 20, 13, 240, + 209, 67, 100, 240, 240, 166, 67, 100, 33, 193, 177, 193, + 177, 177, 177, 240, 112, 24, 13, 177, 161, 33, 33, 68, + 17, 52, 49, 240, 240, 102, 67, 100, 33, 193, 177, 193, + 177, 177, 177, 240, 112, 21, 8, 129, 129, 113, 113, 113, + 115, 81, 34, 49, 65, 33, 81, 17, 113, 113, 113, 113, + 113, 96, 27, 10, 161, 113, 33, 65, 33, 17, 81, 17, + 17, 81, 49, 147, 113, 34, 81, 65, 65, 81, 49, 145, + 145, 145, 145, 145, 128, 20, 13, 240, 65, 209, 193, 193, + 81, 102, 23, 193, 193, 193, 177, 193, 177, 177, 177, 240, + 112, 15, 13, 0, 6, 97, 67, 100, 0, 9, 86, 22, + 97, 240, 240, 144, 25, 12, 240, 177, 68, 68, 49, 177, + 161, 82, 65, 114, 17, 161, 178, 145, 33, 113, 65, 81, + 97, 34, 130, 240, 112, 26, 13, 81, 209, 193, 113, 69, + 68, 65, 177, 177, 177, 162, 18, 98, 17, 50, 19, 49, + 81, 97, 193, 193, 193, 240, 64, 19, 9, 240, 17, 145, + 129, 129, 113, 129, 113, 129, 113, 113, 113, 113, 113, 113, + 240, 32, 24, 14, 0, 8, 1, 145, 65, 145, 65, 129, + 81, 97, 97, 97, 113, 65, 129, 49, 161, 17, 178, 193, + 240, 208, 30, 14, 240, 177, 177, 33, 177, 17, 65, 49, + 33, 113, 49, 145, 65, 113, 97, 97, 97, 81, 129, 65, + 129, 49, 161, 17, 178, 193, 240, 208, 30, 14, 240, 162, + 177, 33, 161, 33, 65, 49, 34, 97, 49, 145, 65, 113, + 97, 97, 97, 81, 129, 65, 129, 49, 161, 17, 178, 193, + 240, 208, 19, 11, 177, 177, 161, 161, 161, 98, 33, 51, + 68, 113, 161, 161, 161, 177, 184, 240, 112, 25, 13, 209, + 161, 33, 113, 33, 17, 129, 17, 17, 129, 49, 82, 81, + 50, 116, 145, 193, 193, 193, 209, 216, 240, 208, 25, 13, + 209, 146, 33, 113, 33, 17, 113, 33, 17, 130, 33, 82, + 81, 50, 116, 145, 193, 193, 193, 209, 216, 240, 208, 20, + 12, 240, 145, 101, 22, 65, 177, 161, 177, 161, 177, 161, + 161, 161, 161, 161, 146, 240, 80, 24, 15, 209, 193, 34, + 100, 17, 17, 22, 49, 17, 193, 209, 225, 209, 225, 209, + 209, 209, 209, 209, 194, 240, 192, 22, 14, 178, 177, 34, + 100, 33, 22, 51, 177, 193, 209, 193, 209, 193, 193, 193, + 193, 193, 178, 240, 160, 21, 15, 0, 8, 33, 209, 17, + 177, 49, 145, 81, 81, 17, 113, 81, 145, 241, 242, 0, + 7, 64, 27, 15, 240, 240, 193, 193, 33, 113, 65, 17, + 97, 17, 49, 113, 49, 145, 81, 81, 17, 113, 81, 145, + 241, 242, 0, 7, 64, 27, 15, 240, 240, 178, 193, 33, + 113, 49, 33, 97, 17, 50, 97, 49, 145, 81, 81, 17, + 113, 81, 145, 241, 242, 0, 7, 64, 31, 13, 240, 49, + 209, 193, 97, 86, 38, 193, 193, 33, 97, 33, 49, 81, + 33, 65, 49, 49, 81, 33, 49, 81, 17, 65, 97, 66, + 193, 240, 64, 36, 14, 193, 97, 65, 33, 97, 65, 17, + 97, 65, 33, 86, 54, 209, 209, 33, 113, 33, 49, 97, + 33, 65, 65, 49, 81, 49, 49, 81, 33, 65, 113, 66, + 209, 240, 96, 35, 14, 81, 82, 113, 49, 33, 97, 49, + 34, 87, 38, 209, 209, 33, 113, 33, 49, 97, 33, 65, + 65, 49, 81, 49, 49, 81, 33, 65, 113, 66, 209, 240, + 240, 80, 21, 12, 240, 240, 97, 101, 22, 65, 161, 177, + 161, 66, 65, 114, 17, 161, 193, 193, 177, 240, 192, 16, + 9, 178, 146, 146, 145, 178, 146, 145, 145, 17, 146, 146, + 146, 145, 145, 27, 13, 240, 49, 209, 193, 193, 193, 177, + 33, 145, 49, 129, 65, 97, 81, 97, 52, 17, 33, 19, + 49, 36, 113, 193, 193, 208, 23, 11, 240, 65, 177, 161, + 161, 50, 65, 98, 33, 130, 162, 145, 17, 113, 49, 81, + 145, 130, 114, 240, 80, 19, 13, 240, 209, 68, 84, 177, + 193, 193, 113, 72, 21, 193, 193, 193, 209, 213, 240, 192, + 21, 11, 0, 7, 17, 177, 161, 52, 67, 50, 34, 65, + 34, 17, 49, 113, 161, 177, 161, 161, 64, 26, 13, 241, + 209, 193, 99, 65, 20, 34, 35, 81, 34, 17, 81, 113, + 49, 129, 33, 161, 193, 193, 209, 193, 193, 240, 48, 14, + 11, 0, 11, 83, 83, 33, 161, 145, 149, 21, 81, 240, + 112, 19, 13, 0, 6, 97, 67, 100, 33, 193, 193, 177, + 193, 193, 136, 20, 129, 240, 240, 144, 16, 8, 0, 6, + 72, 49, 113, 113, 67, 35, 33, 113, 83, 20, 49, 128, + 19, 10, 240, 154, 81, 145, 145, 145, 84, 36, 49, 145, + 145, 145, 100, 21, 65, 240, 80, 21, 12, 209, 68, 68, + 240, 240, 133, 52, 49, 19, 113, 161, 177, 161, 161, 161, + 146, 130, 240, 64, 27, 8, 97, 17, 97, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 97, 113, 97, 97, 97, 192, 37, 14, 240, 81, 225, + 129, 65, 145, 49, 145, 49, 81, 49, 49, 81, 49, 49, + 65, 65, 49, 65, 65, 49, 49, 81, 49, 33, 81, 65, + 17, 97, 66, 97, 81, 97, 240, 192, 23, 10, 161, 161, + 145, 145, 145, 145, 145, 145, 113, 17, 97, 33, 81, 49, + 65, 65, 34, 83, 113, 240, 48, 28, 12, 240, 145, 193, + 70, 21, 81, 17, 145, 33, 129, 33, 129, 33, 113, 49, + 113, 49, 113, 49, 53, 52, 81, 33, 240, 240, 48, 19, + 9, 0, 6, 97, 68, 20, 49, 17, 97, 17, 81, 33, + 81, 113, 113, 113, 113, 224, 25, 12, 240, 240, 97, 101, + 22, 65, 17, 145, 33, 129, 33, 113, 49, 113, 49, 97, + 177, 161, 161, 161, 161, 240, 48, 27, 14, 240, 97, 225, + 209, 97, 86, 53, 17, 129, 65, 129, 65, 145, 49, 145, + 38, 23, 17, 65, 129, 209, 209, 209, 240, 64, 21, 13, + 240, 240, 177, 69, 68, 49, 177, 145, 17, 161, 193, 193, + 193, 198, 22, 97, 240, 240, 144, 20, 10, 240, 81, 84, + 21, 49, 145, 145, 84, 36, 49, 129, 145, 129, 129, 114, + 83, 240, 192, 21, 12, 240, 240, 98, 193, 129, 49, 113, + 161, 177, 161, 161, 161, 161, 161, 97, 34, 130, 240, 96, + 30, 13, 177, 81, 65, 33, 81, 65, 17, 81, 65, 33, + 70, 37, 81, 49, 129, 49, 113, 65, 113, 65, 97, 193, + 177, 177, 177, 177, 240, 96, 25, 9, 240, 240, 161, 129, + 129, 65, 53, 20, 49, 65, 49, 49, 65, 49, 49, 49, + 65, 33, 49, 17, 17, 81, 176, 20, 9, 240, 240, 113, + 145, 129, 51, 36, 81, 49, 49, 65, 33, 65, 129, 113, + 113, 113, 240, 27, 14, 240, 145, 17, 193, 19, 70, 53, + 49, 81, 113, 81, 113, 81, 113, 81, 97, 97, 97, 193, + 193, 193, 193, 240, 240, 112, 28, 15, 240, 209, 130, 33, + 33, 129, 49, 161, 18, 88, 145, 49, 161, 49, 161, 49, + 97, 58, 35, 65, 225, 225, 225, 225, 240, 96, 23, 14, + 240, 177, 193, 17, 193, 33, 100, 70, 33, 130, 33, 163, + 177, 209, 209, 113, 42, 35, 0, 6, 64, 22, 14, 240, + 177, 193, 18, 115, 17, 39, 18, 194, 193, 104, 193, 209, + 193, 193, 193, 193, 193, 240, 144, 4, 2, 228, 224, 10, + 13, 0, 11, 49, 102, 22, 0, 12, 16, 13, 8, 240, + 240, 162, 130, 129, 129, 129, 129, 240, 240, 160, 17, 8, + 240, 113, 81, 33, 81, 19, 49, 66, 129, 129, 129, 129, + 240, 240, 160, + 0, // Padding + +}; + +tFont *g_psFontWSazanamimincho8x15 = (tFont *)g_pui8Sazanamimincho8x15; diff --git a/third_party/fonts/other/fonts/fontsazanamimincho9x17.c b/third_party/fonts/other/fonts/fontsazanamimincho9x17.c new file mode 100644 index 0000000..64f06dc --- /dev/null +++ b/third_party/fonts/other/fonts/fontsazanamimincho9x17.c @@ -0,0 +1,1014 @@ +//***************************************************************************** +// +// fontsazanamimincho9x17.c - Font definition for the 9x17 Sazanamimincho font. +// +//***************************************************************************** + +//***************************************************************************** +// +// This font was converted from Sazanami +// +// Copyright (c) 1990-2003 +// Wada Laboratory, the University of Tokyo. All rights reserved. +// Copyright (c) 2003-2004 +// Electronic Font Open Laboratory (/efont/). All rights reserved +// +// For license, please see README. +//***************************************************************************** + +//***************************************************************************** +// +// This file is generated by ftrasterize; DO NOT EDIT BY HAND! +// +//***************************************************************************** + +#include +#include +#include "grlib/grlib.h" + +//***************************************************************************** +// +// Details of this font: +// Characters: 286 in 2 blocks +// Style: sazanamimincho +// Size: 9x17 +// Bold: no +// Italic: no +// Memory usage: 8645 bytes +// +//***************************************************************************** + +const uint8_t g_pui8Sazanamimincho9x17[] = +{ + // + // The format of the font. + // + FONT_FMT_WIDE_PIXEL_RLE, + + // + // The maximum width of the font. + // + 15, + + // + // The height of the font. + // + 18, + + // + // The baseline of the font. + // + 15, + + // + // The font codepage (CODEPAGE_UNICODE). + // + 14, 0, + + // + // The number of blocks of characters (2). + // + 2, 0, + + // + // Block header 0: Codepoints 0x20 - 0x7e + // + 0x20, 0x00, 0x00, 0x00, + 0x5f, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, + + // + // Block header 1: Codepoints 0x3041 - 0x30ff + // + 0x41, 0x30, 0x00, 0x00, + 0xbf, 0x00, 0x00, 0x00, + 0x14, 0x0a, 0x00, 0x00, + + // + // Block 0 Offsets: Codepoints 0x20 - 0x7e + // + 0x7c, 0x01, 0x00, 0x00, // Offset 380 (0x17c) + 0x81, 0x01, 0x00, 0x00, // Offset 385 (0x181) + 0x91, 0x01, 0x00, 0x00, // Offset 401 (0x191) + 0x9d, 0x01, 0x00, 0x00, // Offset 413 (0x19d) + 0xbd, 0x01, 0x00, 0x00, // Offset 445 (0x1bd) + 0xdf, 0x01, 0x00, 0x00, // Offset 479 (0x1df) + 0x02, 0x02, 0x00, 0x00, // Offset 514 (0x202) + 0x25, 0x02, 0x00, 0x00, // Offset 549 (0x225) + 0x2e, 0x02, 0x00, 0x00, // Offset 558 (0x22e) + 0x42, 0x02, 0x00, 0x00, // Offset 578 (0x242) + 0x56, 0x02, 0x00, 0x00, // Offset 598 (0x256) + 0x6e, 0x02, 0x00, 0x00, // Offset 622 (0x26e) + 0x7f, 0x02, 0x00, 0x00, // Offset 639 (0x27f) + 0x88, 0x02, 0x00, 0x00, // Offset 648 (0x288) + 0x90, 0x02, 0x00, 0x00, // Offset 656 (0x290) + 0x97, 0x02, 0x00, 0x00, // Offset 663 (0x297) + 0xac, 0x02, 0x00, 0x00, // Offset 684 (0x2ac) + 0xc9, 0x02, 0x00, 0x00, // Offset 713 (0x2c9) + 0xda, 0x02, 0x00, 0x00, // Offset 730 (0x2da) + 0xf1, 0x02, 0x00, 0x00, // Offset 753 (0x2f1) + 0x09, 0x03, 0x00, 0x00, // Offset 777 (0x309) + 0x21, 0x03, 0x00, 0x00, // Offset 801 (0x321) + 0x37, 0x03, 0x00, 0x00, // Offset 823 (0x337) + 0x52, 0x03, 0x00, 0x00, // Offset 850 (0x352) + 0x66, 0x03, 0x00, 0x00, // Offset 870 (0x366) + 0x82, 0x03, 0x00, 0x00, // Offset 898 (0x382) + 0x9d, 0x03, 0x00, 0x00, // Offset 925 (0x39d) + 0xa5, 0x03, 0x00, 0x00, // Offset 933 (0x3a5) + 0xaf, 0x03, 0x00, 0x00, // Offset 943 (0x3af) + 0xc1, 0x03, 0x00, 0x00, // Offset 961 (0x3c1) + 0xcb, 0x03, 0x00, 0x00, // Offset 971 (0x3cb) + 0xdd, 0x03, 0x00, 0x00, // Offset 989 (0x3dd) + 0xf2, 0x03, 0x00, 0x00, // Offset 1010 (0x3f2) + 0x1e, 0x04, 0x00, 0x00, // Offset 1054 (0x41e) + 0x3b, 0x04, 0x00, 0x00, // Offset 1083 (0x43b) + 0x57, 0x04, 0x00, 0x00, // Offset 1111 (0x457) + 0x70, 0x04, 0x00, 0x00, // Offset 1136 (0x470) + 0x8e, 0x04, 0x00, 0x00, // Offset 1166 (0x48e) + 0xa6, 0x04, 0x00, 0x00, // Offset 1190 (0x4a6) + 0xbd, 0x04, 0x00, 0x00, // Offset 1213 (0x4bd) + 0xda, 0x04, 0x00, 0x00, // Offset 1242 (0x4da) + 0xf8, 0x04, 0x00, 0x00, // Offset 1272 (0x4f8) + 0x09, 0x05, 0x00, 0x00, // Offset 1289 (0x509) + 0x1f, 0x05, 0x00, 0x00, // Offset 1311 (0x51f) + 0x3f, 0x05, 0x00, 0x00, // Offset 1343 (0x53f) + 0x53, 0x05, 0x00, 0x00, // Offset 1363 (0x553) + 0x7f, 0x05, 0x00, 0x00, // Offset 1407 (0x57f) + 0xa5, 0x05, 0x00, 0x00, // Offset 1445 (0x5a5) + 0xc2, 0x05, 0x00, 0x00, // Offset 1474 (0x5c2) + 0xda, 0x05, 0x00, 0x00, // Offset 1498 (0x5da) + 0xfb, 0x05, 0x00, 0x00, // Offset 1531 (0x5fb) + 0x18, 0x06, 0x00, 0x00, // Offset 1560 (0x618) + 0x32, 0x06, 0x00, 0x00, // Offset 1586 (0x632) + 0x48, 0x06, 0x00, 0x00, // Offset 1608 (0x648) + 0x67, 0x06, 0x00, 0x00, // Offset 1639 (0x667) + 0x84, 0x06, 0x00, 0x00, // Offset 1668 (0x684) + 0xb1, 0x06, 0x00, 0x00, // Offset 1713 (0x6b1) + 0xd0, 0x06, 0x00, 0x00, // Offset 1744 (0x6d0) + 0xe9, 0x06, 0x00, 0x00, // Offset 1769 (0x6e9) + 0xff, 0x06, 0x00, 0x00, // Offset 1791 (0x6ff) + 0x12, 0x07, 0x00, 0x00, // Offset 1810 (0x712) + 0x25, 0x07, 0x00, 0x00, // Offset 1829 (0x725) + 0x38, 0x07, 0x00, 0x00, // Offset 1848 (0x738) + 0x42, 0x07, 0x00, 0x00, // Offset 1858 (0x742) + 0x48, 0x07, 0x00, 0x00, // Offset 1864 (0x748) + 0x51, 0x07, 0x00, 0x00, // Offset 1873 (0x751) + 0x67, 0x07, 0x00, 0x00, // Offset 1895 (0x767) + 0x82, 0x07, 0x00, 0x00, // Offset 1922 (0x782) + 0x95, 0x07, 0x00, 0x00, // Offset 1941 (0x795) + 0xb0, 0x07, 0x00, 0x00, // Offset 1968 (0x7b0) + 0xc3, 0x07, 0x00, 0x00, // Offset 1987 (0x7c3) + 0xd6, 0x07, 0x00, 0x00, // Offset 2006 (0x7d6) + 0xf1, 0x07, 0x00, 0x00, // Offset 2033 (0x7f1) + 0x0c, 0x08, 0x00, 0x00, // Offset 2060 (0x80c) + 0x1c, 0x08, 0x00, 0x00, // Offset 2076 (0x81c) + 0x2f, 0x08, 0x00, 0x00, // Offset 2095 (0x82f) + 0x4b, 0x08, 0x00, 0x00, // Offset 2123 (0x84b) + 0x5c, 0x08, 0x00, 0x00, // Offset 2140 (0x85c) + 0x7e, 0x08, 0x00, 0x00, // Offset 2174 (0x87e) + 0x96, 0x08, 0x00, 0x00, // Offset 2198 (0x896) + 0xac, 0x08, 0x00, 0x00, // Offset 2220 (0x8ac) + 0xc6, 0x08, 0x00, 0x00, // Offset 2246 (0x8c6) + 0xdf, 0x08, 0x00, 0x00, // Offset 2271 (0x8df) + 0xf1, 0x08, 0x00, 0x00, // Offset 2289 (0x8f1) + 0x06, 0x09, 0x00, 0x00, // Offset 2310 (0x906) + 0x19, 0x09, 0x00, 0x00, // Offset 2329 (0x919) + 0x31, 0x09, 0x00, 0x00, // Offset 2353 (0x931) + 0x48, 0x09, 0x00, 0x00, // Offset 2376 (0x948) + 0x6a, 0x09, 0x00, 0x00, // Offset 2410 (0x96a) + 0x81, 0x09, 0x00, 0x00, // Offset 2433 (0x981) + 0x99, 0x09, 0x00, 0x00, // Offset 2457 (0x999) + 0xab, 0x09, 0x00, 0x00, // Offset 2475 (0x9ab) + 0xbf, 0x09, 0x00, 0x00, // Offset 2495 (0x9bf) + 0xd3, 0x09, 0x00, 0x00, // Offset 2515 (0x9d3) + 0xe7, 0x09, 0x00, 0x00, // Offset 2535 (0x9e7) + + // + // Block 0 Data: Codepoints 0x20 - 0x7e + // + 5, 11, 0, 24, 96, 16, 3, 49, 34, 18, 18, 18, + 18, 18, 17, 33, 33, 33, 130, 18, 112, 12, 6, 98, + 18, 18, 18, 33, 33, 17, 33, 0, 10, 32, 10, 209, + 33, 97, 33, 97, 33, 72, 65, 33, 97, 33, 81, 49, + 81, 49, 81, 33, 97, 33, 72, 65, 33, 97, 33, 97, + 33, 97, 33, 240, 144, 34, 8, 49, 113, 99, 65, 17, + 17, 33, 33, 33, 17, 33, 81, 17, 99, 97, 17, 81, + 33, 18, 17, 33, 17, 33, 33, 33, 17, 17, 67, 97, + 113, 240, 80, 35, 8, 225, 34, 49, 17, 33, 17, 33, + 33, 17, 33, 33, 17, 50, 17, 113, 97, 113, 97, 113, + 18, 49, 17, 33, 33, 17, 33, 33, 17, 33, 17, 50, + 33, 240, 35, 10, 240, 115, 97, 49, 81, 49, 81, 49, + 81, 33, 114, 129, 51, 33, 17, 49, 49, 17, 49, 33, + 49, 17, 49, 49, 17, 65, 49, 33, 51, 18, 240, 240, + 32, 9, 3, 50, 18, 33, 17, 240, 240, 176, 20, 6, + 65, 65, 65, 81, 65, 81, 65, 81, 81, 81, 81, 97, + 81, 97, 81, 97, 97, 112, 20, 6, 1, 97, 97, 81, + 97, 81, 97, 81, 81, 81, 81, 65, 81, 65, 81, 65, + 65, 176, 24, 8, 240, 240, 81, 65, 33, 33, 18, 17, + 18, 51, 97, 99, 50, 17, 18, 17, 33, 33, 65, 240, + 240, 224, 17, 8, 240, 193, 113, 113, 113, 113, 71, 65, + 113, 113, 113, 113, 240, 240, 96, 9, 3, 240, 240, 146, + 18, 33, 17, 80, 8, 8, 0, 8, 7, 0, 9, 16, + 7, 3, 240, 240, 146, 18, 160, 21, 9, 240, 17, 129, + 113, 129, 113, 129, 113, 129, 113, 129, 113, 129, 113, 129, + 113, 129, 240, 32, 29, 8, 240, 51, 65, 49, 49, 49, + 33, 81, 17, 81, 17, 81, 17, 81, 17, 81, 17, 81, + 17, 81, 33, 49, 49, 49, 67, 240, 192, 17, 6, 225, + 51, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 53, + 240, 64, 23, 8, 240, 51, 65, 49, 33, 81, 18, 65, + 113, 97, 97, 97, 97, 97, 113, 65, 17, 81, 23, 240, + 160, 24, 8, 240, 51, 65, 49, 33, 81, 18, 65, 97, + 82, 129, 129, 113, 18, 65, 17, 81, 33, 49, 67, 240, + 192, 24, 9, 240, 129, 114, 114, 97, 17, 97, 17, 81, + 33, 81, 33, 65, 49, 65, 49, 56, 97, 129, 115, 240, + 224, 22, 8, 240, 23, 17, 113, 113, 113, 113, 19, 50, + 49, 129, 113, 113, 18, 65, 17, 65, 52, 240, 192, 27, + 8, 240, 51, 65, 49, 33, 81, 17, 113, 113, 19, 50, + 49, 33, 81, 17, 81, 17, 81, 17, 81, 33, 49, 67, + 240, 192, 20, 8, 240, 23, 17, 81, 17, 81, 97, 113, + 113, 97, 113, 113, 97, 113, 113, 113, 240, 208, 28, 8, + 240, 51, 65, 49, 33, 81, 17, 81, 17, 81, 33, 49, + 67, 65, 49, 33, 81, 17, 81, 17, 81, 33, 49, 67, + 240, 192, 27, 8, 240, 51, 65, 49, 33, 81, 17, 81, + 17, 81, 17, 81, 33, 50, 51, 17, 113, 113, 17, 81, + 33, 49, 67, 240, 192, 8, 3, 242, 18, 240, 18, 18, + 208, 10, 3, 242, 18, 240, 18, 18, 33, 17, 128, 18, + 8, 240, 241, 97, 97, 97, 97, 97, 97, 129, 129, 129, + 129, 129, 129, 240, 32, 10, 8, 0, 6, 7, 240, 167, + 0, 7, 16, 18, 8, 240, 145, 129, 129, 129, 129, 129, + 129, 97, 97, 97, 97, 97, 97, 240, 128, 21, 9, 240, + 84, 65, 65, 33, 97, 18, 81, 129, 113, 113, 113, 129, + 129, 240, 162, 114, 240, 112, 44, 9, 195, 81, 49, 49, + 65, 49, 49, 17, 17, 35, 17, 17, 17, 33, 17, 17, + 17, 33, 17, 17, 17, 33, 17, 17, 17, 33, 17, 17, + 17, 33, 17, 17, 34, 18, 33, 129, 81, 49, 49, 83, + 240, 96, 29, 10, 240, 145, 145, 129, 17, 113, 17, 113, + 17, 97, 49, 81, 49, 85, 81, 49, 65, 81, 49, 81, + 49, 81, 35, 51, 240, 240, 16, 28, 9, 240, 54, 65, + 65, 49, 81, 33, 81, 33, 81, 33, 65, 53, 65, 65, + 49, 81, 33, 81, 33, 81, 33, 65, 38, 240, 240, 25, + 8, 240, 51, 17, 33, 50, 33, 65, 17, 81, 17, 113, + 113, 113, 113, 113, 81, 33, 65, 33, 49, 67, 240, 192, + 30, 9, 240, 53, 81, 49, 65, 65, 49, 65, 49, 81, + 33, 81, 33, 81, 33, 81, 33, 81, 33, 65, 49, 65, + 49, 49, 53, 240, 240, 16, 24, 9, 240, 56, 33, 81, + 33, 81, 33, 129, 129, 49, 69, 65, 49, 65, 129, 129, + 81, 33, 81, 24, 240, 208, 23, 9, 240, 56, 33, 81, + 33, 81, 33, 129, 129, 49, 69, 65, 49, 65, 129, 129, + 129, 115, 240, 240, 48, 29, 8, 240, 51, 17, 33, 50, + 33, 65, 17, 81, 17, 113, 113, 51, 17, 81, 17, 81, + 17, 81, 33, 65, 33, 50, 51, 17, 240, 160, 30, 9, + 240, 51, 35, 33, 65, 49, 65, 49, 65, 49, 65, 49, + 65, 54, 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, + 35, 35, 240, 208, 17, 6, 197, 49, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 53, 240, 64, 22, 8, 240, + 68, 97, 113, 113, 113, 113, 113, 113, 113, 113, 34, 49, + 33, 65, 49, 33, 82, 240, 80, 32, 10, 240, 83, 35, + 49, 65, 65, 49, 81, 33, 97, 33, 97, 17, 114, 17, + 97, 49, 81, 49, 81, 65, 65, 65, 65, 81, 35, 51, + 240, 240, 16, 20, 9, 240, 52, 97, 129, 129, 129, 129, + 129, 129, 129, 129, 129, 81, 33, 81, 24, 240, 208, 44, + 10, 240, 82, 82, 33, 81, 50, 50, 50, 50, 50, 50, + 49, 17, 17, 17, 49, 17, 17, 17, 49, 17, 17, 17, + 49, 17, 17, 17, 49, 33, 33, 49, 33, 33, 49, 33, + 33, 35, 17, 19, 240, 240, 16, 38, 10, 240, 82, 67, + 34, 65, 50, 65, 49, 17, 49, 49, 17, 49, 49, 33, + 33, 49, 33, 33, 49, 49, 17, 49, 49, 17, 49, 66, + 49, 66, 49, 81, 35, 65, 240, 240, 32, 29, 8, 240, + 51, 65, 49, 33, 81, 17, 81, 17, 81, 17, 81, 17, + 81, 17, 81, 17, 81, 17, 81, 17, 81, 33, 49, 67, + 240, 192, 24, 9, 240, 54, 65, 65, 49, 81, 33, 81, + 33, 81, 33, 65, 53, 65, 129, 129, 129, 129, 115, 240, + 240, 48, 33, 9, 240, 83, 81, 49, 49, 81, 33, 81, + 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, 33, 18, + 33, 34, 17, 33, 49, 34, 83, 33, 98, 240, 80, 29, + 9, 240, 54, 65, 65, 49, 81, 33, 81, 33, 81, 33, + 65, 53, 65, 49, 65, 49, 65, 65, 49, 65, 49, 81, + 19, 65, 240, 208, 26, 8, 240, 51, 17, 33, 50, 17, + 81, 17, 81, 17, 130, 130, 129, 129, 17, 81, 17, 81, + 18, 49, 33, 19, 240, 192, 22, 8, 240, 23, 17, 33, + 33, 17, 33, 33, 65, 113, 113, 113, 113, 113, 113, 113, + 113, 99, 240, 192, 31, 10, 240, 83, 51, 33, 81, 49, + 81, 49, 81, 49, 81, 49, 81, 49, 81, 49, 81, 49, + 81, 49, 81, 49, 81, 65, 49, 99, 240, 240, 64, 29, + 10, 240, 83, 51, 33, 81, 49, 81, 49, 81, 65, 49, + 81, 49, 81, 49, 97, 17, 113, 17, 113, 17, 129, 145, + 145, 240, 240, 80, 45, 10, 240, 83, 17, 19, 33, 33, + 33, 49, 33, 33, 49, 33, 33, 49, 33, 33, 49, 17, + 17, 17, 49, 17, 17, 17, 49, 17, 17, 17, 49, 17, + 17, 17, 65, 49, 81, 49, 81, 49, 81, 49, 240, 240, + 48, 31, 10, 240, 83, 51, 33, 81, 65, 49, 81, 49, + 97, 17, 113, 17, 129, 129, 17, 113, 17, 97, 49, 81, + 49, 65, 81, 35, 51, 240, 240, 16, 25, 10, 240, 83, + 51, 33, 81, 65, 49, 81, 49, 97, 17, 113, 17, 129, + 145, 145, 145, 145, 145, 131, 240, 240, 64, 22, 8, 240, + 23, 17, 65, 33, 65, 97, 113, 97, 113, 97, 113, 97, + 113, 65, 17, 81, 23, 240, 160, 19, 5, 84, 17, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 68, 96, 19, 9, 145, 129, 145, 129, 145, 129, 145, 129, + 145, 129, 145, 129, 145, 129, 145, 129, 160, 19, 5, 84, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 20, 96, 10, 6, 33, 65, 17, 33, 49, 0, + 11, 48, 6, 10, 0, 20, 9, 176, 9, 3, 50, 18, + 17, 49, 240, 240, 160, 22, 9, 0, 6, 116, 65, 65, + 129, 99, 66, 33, 49, 65, 49, 65, 49, 65, 17, 36, + 17, 240, 224, 27, 9, 240, 50, 129, 129, 129, 129, 19, + 66, 49, 49, 81, 33, 81, 33, 81, 33, 81, 33, 81, + 34, 49, 49, 19, 240, 240, 19, 8, 0, 6, 35, 65, + 49, 33, 81, 17, 113, 113, 113, 81, 33, 49, 67, 240, + 192, 27, 9, 240, 130, 129, 129, 129, 67, 17, 49, 50, + 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, 49, 50, + 67, 18, 240, 208, 19, 8, 0, 6, 35, 65, 49, 33, + 81, 23, 17, 113, 113, 81, 33, 49, 67, 240, 192, 19, + 8, 195, 65, 33, 49, 113, 113, 86, 65, 113, 113, 113, + 113, 113, 113, 99, 240, 208, 27, 10, 0, 7, 17, 69, + 17, 33, 65, 65, 65, 65, 65, 65, 65, 84, 97, 129, + 20, 49, 97, 33, 97, 33, 97, 54, 48, 27, 9, 240, + 50, 129, 129, 129, 129, 19, 66, 49, 49, 65, 49, 65, + 49, 65, 49, 65, 49, 65, 49, 65, 35, 35, 240, 208, + 16, 6, 210, 66, 240, 18, 81, 81, 81, 81, 81, 81, + 81, 53, 240, 64, 19, 6, 242, 66, 240, 18, 81, 81, + 81, 81, 81, 81, 81, 17, 49, 17, 49, 35, 128, 28, + 9, 240, 50, 129, 129, 129, 51, 33, 65, 49, 49, 65, + 33, 81, 18, 82, 33, 65, 49, 65, 65, 49, 65, 35, + 35, 240, 208, 17, 6, 210, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 53, 240, 64, 34, 10, 0, 7, + 66, 17, 18, 66, 17, 33, 49, 33, 33, 49, 33, 33, + 49, 33, 33, 49, 33, 33, 49, 33, 33, 49, 33, 33, + 35, 17, 19, 240, 240, 16, 24, 9, 0, 6, 98, 19, + 66, 49, 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, + 49, 65, 35, 35, 240, 208, 22, 8, 0, 6, 35, 65, + 49, 33, 81, 17, 81, 17, 81, 17, 81, 17, 81, 33, + 49, 67, 240, 192, 26, 9, 0, 6, 98, 19, 66, 49, + 49, 81, 33, 81, 33, 81, 33, 81, 33, 81, 34, 49, + 49, 19, 65, 129, 115, 96, 25, 9, 0, 7, 3, 18, + 33, 50, 33, 81, 33, 81, 33, 81, 33, 81, 33, 81, + 49, 50, 67, 17, 129, 129, 115, 18, 8, 0, 6, 2, + 19, 50, 49, 33, 65, 33, 113, 113, 113, 113, 99, 240, + 224, 21, 8, 0, 6, 35, 17, 33, 50, 33, 65, 34, + 131, 129, 17, 81, 18, 65, 17, 20, 240, 176, 19, 8, + 240, 177, 113, 113, 86, 65, 113, 113, 113, 113, 113, 49, + 49, 49, 67, 240, 176, 24, 9, 0, 6, 98, 50, 49, + 65, 49, 65, 49, 65, 49, 65, 49, 65, 49, 65, 49, + 50, 67, 18, 240, 208, 23, 10, 0, 7, 67, 51, 33, + 81, 65, 49, 81, 49, 81, 49, 97, 17, 113, 17, 129, + 145, 240, 240, 80, 34, 10, 0, 7, 67, 51, 33, 33, + 33, 49, 33, 33, 49, 33, 33, 49, 17, 17, 17, 49, + 17, 17, 17, 49, 17, 17, 17, 65, 49, 81, 49, 240, + 240, 48, 23, 8, 0, 6, 3, 19, 33, 49, 65, 17, + 81, 17, 97, 97, 17, 81, 17, 65, 49, 35, 19, 240, + 160, 24, 10, 0, 7, 67, 51, 33, 81, 65, 65, 65, + 49, 97, 33, 97, 17, 130, 129, 145, 97, 17, 114, 240, + 32, 18, 8, 0, 6, 7, 17, 65, 97, 113, 97, 97, + 113, 49, 33, 65, 23, 240, 160, 20, 6, 65, 65, 65, + 81, 81, 81, 81, 81, 50, 97, 81, 81, 81, 81, 81, + 97, 97, 112, 20, 2, 1, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 20, + 6, 1, 97, 97, 81, 81, 81, 81, 81, 98, 49, 81, + 81, 81, 81, 81, 65, 65, 176, 10, 8, 146, 81, 33, + 33, 82, 0, 14, 32, + 0, 0, 0, // Padding + + // + // Block 1 Offsets: Codepoints 0x3041 - 0x30ff + // + 0xfc, 0x02, 0x00, 0x00, // Offset 764 (0x2fc) + 0x1b, 0x03, 0x00, 0x00, // Offset 795 (0x31b) + 0x48, 0x03, 0x00, 0x00, // Offset 840 (0x348) + 0x5e, 0x03, 0x00, 0x00, // Offset 862 (0x35e) + 0x7e, 0x03, 0x00, 0x00, // Offset 894 (0x37e) + 0x8f, 0x03, 0x00, 0x00, // Offset 911 (0x38f) + 0xa6, 0x03, 0x00, 0x00, // Offset 934 (0x3a6) + 0xbd, 0x03, 0x00, 0x00, // Offset 957 (0x3bd) + 0xd9, 0x03, 0x00, 0x00, // Offset 985 (0x3d9) + 0xf8, 0x03, 0x00, 0x00, // Offset 1016 (0x3f8) + 0x1f, 0x04, 0x00, 0x00, // Offset 1055 (0x41f) + 0x48, 0x04, 0x00, 0x00, // Offset 1096 (0x448) + 0x74, 0x04, 0x00, 0x00, // Offset 1140 (0x474) + 0x8f, 0x04, 0x00, 0x00, // Offset 1167 (0x48f) + 0xb1, 0x04, 0x00, 0x00, // Offset 1201 (0x4b1) + 0xc4, 0x04, 0x00, 0x00, // Offset 1220 (0x4c4) + 0xdc, 0x04, 0x00, 0x00, // Offset 1244 (0x4dc) + 0x03, 0x05, 0x00, 0x00, // Offset 1283 (0x503) + 0x2d, 0x05, 0x00, 0x00, // Offset 1325 (0x52d) + 0x3e, 0x05, 0x00, 0x00, // Offset 1342 (0x53e) + 0x53, 0x05, 0x00, 0x00, // Offset 1363 (0x553) + 0x6b, 0x05, 0x00, 0x00, // Offset 1387 (0x56b) + 0x88, 0x05, 0x00, 0x00, // Offset 1416 (0x588) + 0x9f, 0x05, 0x00, 0x00, // Offset 1439 (0x59f) + 0xba, 0x05, 0x00, 0x00, // Offset 1466 (0x5ba) + 0xd4, 0x05, 0x00, 0x00, // Offset 1492 (0x5d4) + 0xf1, 0x05, 0x00, 0x00, // Offset 1521 (0x5f1) + 0x15, 0x06, 0x00, 0x00, // Offset 1557 (0x615) + 0x3d, 0x06, 0x00, 0x00, // Offset 1597 (0x63d) + 0x55, 0x06, 0x00, 0x00, // Offset 1621 (0x655) + 0x73, 0x06, 0x00, 0x00, // Offset 1651 (0x673) + 0x91, 0x06, 0x00, 0x00, // Offset 1681 (0x691) + 0xb3, 0x06, 0x00, 0x00, // Offset 1715 (0x6b3) + 0xce, 0x06, 0x00, 0x00, // Offset 1742 (0x6ce) + 0xed, 0x06, 0x00, 0x00, // Offset 1773 (0x6ed) + 0xfc, 0x06, 0x00, 0x00, // Offset 1788 (0x6fc) + 0x11, 0x07, 0x00, 0x00, // Offset 1809 (0x711) + 0x2c, 0x07, 0x00, 0x00, // Offset 1836 (0x72c) + 0x42, 0x07, 0x00, 0x00, // Offset 1858 (0x742) + 0x5d, 0x07, 0x00, 0x00, // Offset 1885 (0x75d) + 0x74, 0x07, 0x00, 0x00, // Offset 1908 (0x774) + 0x90, 0x07, 0x00, 0x00, // Offset 1936 (0x790) + 0xb4, 0x07, 0x00, 0x00, // Offset 1972 (0x7b4) + 0xd1, 0x07, 0x00, 0x00, // Offset 2001 (0x7d1) + 0x06, 0x08, 0x00, 0x00, // Offset 2054 (0x806) + 0x34, 0x08, 0x00, 0x00, // Offset 2100 (0x834) + 0x5b, 0x08, 0x00, 0x00, // Offset 2139 (0x85b) + 0x87, 0x08, 0x00, 0x00, // Offset 2183 (0x887) + 0xb6, 0x08, 0x00, 0x00, // Offset 2230 (0x8b6) + 0xe6, 0x08, 0x00, 0x00, // Offset 2278 (0x8e6) + 0x0b, 0x09, 0x00, 0x00, // Offset 2315 (0x90b) + 0x33, 0x09, 0x00, 0x00, // Offset 2355 (0x933) + 0x5c, 0x09, 0x00, 0x00, // Offset 2396 (0x95c) + 0x81, 0x09, 0x00, 0x00, // Offset 2433 (0x981) + 0xaa, 0x09, 0x00, 0x00, // Offset 2474 (0x9aa) + 0xd3, 0x09, 0x00, 0x00, // Offset 2515 (0x9d3) + 0xeb, 0x09, 0x00, 0x00, // Offset 2539 (0x9eb) + 0x07, 0x0a, 0x00, 0x00, // Offset 2567 (0xa07) + 0x25, 0x0a, 0x00, 0x00, // Offset 2597 (0xa25) + 0x50, 0x0a, 0x00, 0x00, // Offset 2640 (0xa50) + 0x7d, 0x0a, 0x00, 0x00, // Offset 2685 (0xa7d) + 0xab, 0x0a, 0x00, 0x00, // Offset 2731 (0xaab) + 0xc6, 0x0a, 0x00, 0x00, // Offset 2758 (0xac6) + 0xeb, 0x0a, 0x00, 0x00, // Offset 2795 (0xaeb) + 0x0f, 0x0b, 0x00, 0x00, // Offset 2831 (0xb0f) + 0x3e, 0x0b, 0x00, 0x00, // Offset 2878 (0xb3e) + 0x60, 0x0b, 0x00, 0x00, // Offset 2912 (0xb60) + 0x7a, 0x0b, 0x00, 0x00, // Offset 2938 (0xb7a) + 0x9c, 0x0b, 0x00, 0x00, // Offset 2972 (0xb9c) + 0xbd, 0x0b, 0x00, 0x00, // Offset 3005 (0xbbd) + 0xeb, 0x0b, 0x00, 0x00, // Offset 3051 (0xbeb) + 0x01, 0x0c, 0x00, 0x00, // Offset 3073 (0xc01) + 0x1b, 0x0c, 0x00, 0x00, // Offset 3099 (0xc1b) + 0x34, 0x0c, 0x00, 0x00, // Offset 3124 (0xc34) + 0x57, 0x0c, 0x00, 0x00, // Offset 3159 (0xc57) + 0x76, 0x0c, 0x00, 0x00, // Offset 3190 (0xc76) + 0xa3, 0x0c, 0x00, 0x00, // Offset 3235 (0xca3) + 0xbd, 0x0c, 0x00, 0x00, // Offset 3261 (0xcbd) + 0xd9, 0x0c, 0x00, 0x00, // Offset 3289 (0xcd9) + 0x00, 0x0d, 0x00, 0x00, // Offset 3328 (0xd00) + 0x2a, 0x0d, 0x00, 0x00, // Offset 3370 (0xd2a) + 0x51, 0x0d, 0x00, 0x00, // Offset 3409 (0xd51) + 0x70, 0x0d, 0x00, 0x00, // Offset 3440 (0xd70) + 0x95, 0x0d, 0x00, 0x00, // Offset 3477 (0xd95) + 0xb1, 0x0d, 0x00, 0x00, // Offset 3505 (0xdb1) + 0xcc, 0x0d, 0x00, 0x00, // Offset 3532 (0xdcc) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0xe8, 0x0d, 0x00, 0x00, // Offset 3560 (0xde8) + 0xf1, 0x0d, 0x00, 0x00, // Offset 3569 (0xdf1) + 0xfc, 0x0d, 0x00, 0x00, // Offset 3580 (0xdfc) + 0x0a, 0x0e, 0x00, 0x00, // Offset 3594 (0xe0a) + 0x1c, 0x0e, 0x00, 0x00, // Offset 3612 (0xe1c) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + 0x3e, 0x0e, 0x00, 0x00, // Offset 3646 (0xe3e) + 0x50, 0x0e, 0x00, 0x00, // Offset 3664 (0xe50) + 0x67, 0x0e, 0x00, 0x00, // Offset 3687 (0xe67) + 0x79, 0x0e, 0x00, 0x00, // Offset 3705 (0xe79) + 0x91, 0x0e, 0x00, 0x00, // Offset 3729 (0xe91) + 0xa7, 0x0e, 0x00, 0x00, // Offset 3751 (0xea7) + 0xc2, 0x0e, 0x00, 0x00, // Offset 3778 (0xec2) + 0xd2, 0x0e, 0x00, 0x00, // Offset 3794 (0xed2) + 0xe5, 0x0e, 0x00, 0x00, // Offset 3813 (0xee5) + 0xfd, 0x0e, 0x00, 0x00, // Offset 3837 (0xefd) + 0x1c, 0x0f, 0x00, 0x00, // Offset 3868 (0xf1c) + 0x3f, 0x0f, 0x00, 0x00, // Offset 3903 (0xf3f) + 0x67, 0x0f, 0x00, 0x00, // Offset 3943 (0xf67) + 0x82, 0x0f, 0x00, 0x00, // Offset 3970 (0xf82) + 0xa3, 0x0f, 0x00, 0x00, // Offset 4003 (0xfa3) + 0xbd, 0x0f, 0x00, 0x00, // Offset 4029 (0xfbd) + 0xdb, 0x0f, 0x00, 0x00, // Offset 4059 (0xfdb) + 0xf6, 0x0f, 0x00, 0x00, // Offset 4086 (0xff6) + 0x15, 0x10, 0x00, 0x00, // Offset 4117 (0x1015) + 0x2a, 0x10, 0x00, 0x00, // Offset 4138 (0x102a) + 0x41, 0x10, 0x00, 0x00, // Offset 4161 (0x1041) + 0x62, 0x10, 0x00, 0x00, // Offset 4194 (0x1062) + 0x86, 0x10, 0x00, 0x00, // Offset 4230 (0x1086) + 0x9e, 0x10, 0x00, 0x00, // Offset 4254 (0x109e) + 0xba, 0x10, 0x00, 0x00, // Offset 4282 (0x10ba) + 0xd6, 0x10, 0x00, 0x00, // Offset 4310 (0x10d6) + 0xf6, 0x10, 0x00, 0x00, // Offset 4342 (0x10f6) + 0x15, 0x11, 0x00, 0x00, // Offset 4373 (0x1115) + 0x3a, 0x11, 0x00, 0x00, // Offset 4410 (0x113a) + 0x53, 0x11, 0x00, 0x00, // Offset 4435 (0x1153) + 0x6d, 0x11, 0x00, 0x00, // Offset 4461 (0x116d) + 0x88, 0x11, 0x00, 0x00, // Offset 4488 (0x1188) + 0xa6, 0x11, 0x00, 0x00, // Offset 4518 (0x11a6) + 0xbc, 0x11, 0x00, 0x00, // Offset 4540 (0x11bc) + 0xd5, 0x11, 0x00, 0x00, // Offset 4565 (0x11d5) + 0xea, 0x11, 0x00, 0x00, // Offset 4586 (0x11ea) + 0x07, 0x12, 0x00, 0x00, // Offset 4615 (0x1207) + 0x24, 0x12, 0x00, 0x00, // Offset 4644 (0x1224) + 0x3a, 0x12, 0x00, 0x00, // Offset 4666 (0x123a) + 0x53, 0x12, 0x00, 0x00, // Offset 4691 (0x1253) + 0x6a, 0x12, 0x00, 0x00, // Offset 4714 (0x126a) + 0x85, 0x12, 0x00, 0x00, // Offset 4741 (0x1285) + 0x9b, 0x12, 0x00, 0x00, // Offset 4763 (0x129b) + 0xab, 0x12, 0x00, 0x00, // Offset 4779 (0x12ab) + 0xc7, 0x12, 0x00, 0x00, // Offset 4807 (0x12c7) + 0xe3, 0x12, 0x00, 0x00, // Offset 4835 (0x12e3) + 0xf6, 0x12, 0x00, 0x00, // Offset 4854 (0x12f6) + 0x12, 0x13, 0x00, 0x00, // Offset 4882 (0x1312) + 0x31, 0x13, 0x00, 0x00, // Offset 4913 (0x1331) + 0x51, 0x13, 0x00, 0x00, // Offset 4945 (0x1351) + 0x66, 0x13, 0x00, 0x00, // Offset 4966 (0x1366) + 0x80, 0x13, 0x00, 0x00, // Offset 4992 (0x1380) + 0x9c, 0x13, 0x00, 0x00, // Offset 5020 (0x139c) + 0xb1, 0x13, 0x00, 0x00, // Offset 5041 (0x13b1) + 0xc9, 0x13, 0x00, 0x00, // Offset 5065 (0x13c9) + 0xe2, 0x13, 0x00, 0x00, // Offset 5090 (0x13e2) + 0xfa, 0x13, 0x00, 0x00, // Offset 5114 (0x13fa) + 0x16, 0x14, 0x00, 0x00, // Offset 5142 (0x1416) + 0x34, 0x14, 0x00, 0x00, // Offset 5172 (0x1434) + 0x57, 0x14, 0x00, 0x00, // Offset 5207 (0x1457) + 0x7d, 0x14, 0x00, 0x00, // Offset 5245 (0x147d) + 0xa5, 0x14, 0x00, 0x00, // Offset 5285 (0x14a5) + 0xbc, 0x14, 0x00, 0x00, // Offset 5308 (0x14bc) + 0xcd, 0x14, 0x00, 0x00, // Offset 5325 (0x14cd) + 0xe8, 0x14, 0x00, 0x00, // Offset 5352 (0x14e8) + 0x02, 0x15, 0x00, 0x00, // Offset 5378 (0x1502) + 0x18, 0x15, 0x00, 0x00, // Offset 5400 (0x1518) + 0x2d, 0x15, 0x00, 0x00, // Offset 5421 (0x152d) + 0x4d, 0x15, 0x00, 0x00, // Offset 5453 (0x154d) + 0x5f, 0x15, 0x00, 0x00, // Offset 5471 (0x155f) + 0x74, 0x15, 0x00, 0x00, // Offset 5492 (0x1574) + 0x8a, 0x15, 0x00, 0x00, // Offset 5514 (0x158a) + 0xa3, 0x15, 0x00, 0x00, // Offset 5539 (0x15a3) + 0xba, 0x15, 0x00, 0x00, // Offset 5562 (0x15ba) + 0xd8, 0x15, 0x00, 0x00, // Offset 5592 (0x15d8) + 0x00, 0x16, 0x00, 0x00, // Offset 5632 (0x1600) + 0x1b, 0x16, 0x00, 0x00, // Offset 5659 (0x161b) + 0x38, 0x16, 0x00, 0x00, // Offset 5688 (0x1638) + 0x4d, 0x16, 0x00, 0x00, // Offset 5709 (0x164d) + 0x68, 0x16, 0x00, 0x00, // Offset 5736 (0x1668) + 0x83, 0x16, 0x00, 0x00, // Offset 5763 (0x1683) + 0x99, 0x16, 0x00, 0x00, // Offset 5785 (0x1699) + 0xb1, 0x16, 0x00, 0x00, // Offset 5809 (0x16b1) + 0xc7, 0x16, 0x00, 0x00, // Offset 5831 (0x16c7) + 0xe5, 0x16, 0x00, 0x00, // Offset 5861 (0x16e5) + 0xfe, 0x16, 0x00, 0x00, // Offset 5886 (0x16fe) + 0x13, 0x17, 0x00, 0x00, // Offset 5907 (0x1713) + 0x30, 0x17, 0x00, 0x00, // Offset 5936 (0x1730) + 0x4f, 0x17, 0x00, 0x00, // Offset 5967 (0x174f) + 0x6a, 0x17, 0x00, 0x00, // Offset 5994 (0x176a) + 0x84, 0x17, 0x00, 0x00, // Offset 6020 (0x1784) + 0x8d, 0x17, 0x00, 0x00, // Offset 6029 (0x178d) + 0x96, 0x17, 0x00, 0x00, // Offset 6038 (0x1796) + 0xa3, 0x17, 0x00, 0x00, // Offset 6051 (0x17a3) + 0x00, 0x00, 0x00, 0x00, // Glyph Absent + + // + // Block 1 Data: Codepoints 0x3041 - 0x30ff + // + 31, 12, 0, 7, 113, 177, 145, 17, 34, 100, 145, 49, + 118, 82, 33, 33, 49, 17, 33, 49, 17, 50, 65, 17, + 49, 81, 35, 17, 49, 146, 240, 45, 15, 240, 49, 241, + 161, 49, 50, 103, 177, 65, 145, 65, 145, 35, 147, 17, + 18, 98, 33, 65, 65, 17, 33, 81, 33, 33, 17, 97, + 17, 49, 17, 97, 17, 65, 113, 17, 50, 97, 51, 33, + 65, 194, 240, 64, 22, 11, 0, 9, 81, 161, 97, 49, + 113, 33, 129, 17, 49, 65, 33, 17, 66, 34, 161, 240, + 240, 176, 32, 15, 240, 240, 241, 241, 113, 97, 129, 65, + 161, 49, 177, 33, 177, 33, 193, 17, 65, 113, 17, 49, + 99, 33, 33, 177, 17, 210, 225, 240, 240, 176, 17, 8, + 0, 6, 19, 130, 161, 35, 50, 49, 113, 113, 97, 113, + 97, 82, 192, 23, 11, 227, 178, 129, 240, 84, 49, 18, + 65, 49, 113, 161, 161, 161, 145, 161, 145, 145, 145, 145, + 240, 32, 23, 11, 0, 7, 33, 178, 240, 33, 36, 82, + 17, 145, 145, 145, 17, 113, 49, 81, 65, 81, 84, 240, + 128, 28, 15, 240, 66, 243, 177, 240, 177, 53, 115, 49, + 209, 209, 209, 211, 177, 49, 145, 65, 129, 81, 113, 97, + 97, 133, 240, 240, 16, 31, 13, 0, 8, 49, 209, 81, + 49, 33, 34, 33, 53, 81, 65, 193, 35, 115, 49, 82, + 97, 49, 17, 97, 33, 33, 33, 33, 67, 50, 240, 240, + 39, 16, 240, 65, 240, 17, 241, 98, 65, 33, 34, 65, + 69, 83, 81, 145, 81, 241, 241, 37, 131, 81, 98, 129, + 50, 17, 129, 34, 33, 129, 65, 17, 49, 49, 98, 67, + 129, 240, 192, 41, 16, 240, 81, 240, 17, 241, 225, 97, + 132, 65, 53, 49, 65, 81, 65, 65, 81, 65, 81, 49, + 81, 36, 49, 81, 81, 33, 97, 129, 97, 129, 33, 49, + 113, 65, 17, 129, 82, 225, 240, 160, 44, 17, 240, 97, + 145, 113, 97, 33, 97, 113, 113, 97, 148, 65, 69, 49, + 65, 97, 65, 65, 97, 65, 81, 65, 81, 36, 65, 81, + 81, 49, 97, 145, 97, 145, 33, 49, 129, 65, 17, 145, + 82, 241, 240, 192, 27, 14, 240, 66, 209, 129, 65, 34, + 87, 193, 209, 65, 17, 116, 56, 225, 209, 118, 17, 66, + 98, 65, 209, 226, 230, 240, 48, 34, 16, 240, 98, 97, + 129, 65, 33, 33, 65, 34, 17, 87, 225, 241, 65, 49, + 116, 88, 240, 17, 241, 150, 17, 98, 98, 97, 241, 240, + 18, 240, 22, 240, 112, 19, 8, 209, 129, 97, 97, 97, + 97, 97, 97, 113, 129, 129, 129, 129, 129, 129, 113, 144, + 24, 11, 240, 17, 177, 145, 145, 49, 81, 33, 33, 49, + 65, 65, 145, 161, 177, 177, 177, 177, 177, 177, 161, 240, + 39, 15, 240, 145, 97, 129, 81, 129, 81, 129, 33, 17, + 65, 67, 33, 85, 65, 145, 65, 145, 65, 145, 65, 145, + 65, 145, 65, 17, 113, 65, 17, 97, 97, 113, 97, 97, + 209, 240, 112, 42, 17, 225, 177, 33, 33, 33, 129, 33, + 65, 129, 113, 129, 33, 49, 65, 67, 65, 85, 97, 145, + 97, 145, 97, 145, 97, 145, 97, 145, 97, 17, 113, 97, + 17, 97, 129, 113, 129, 97, 241, 240, 176, 17, 12, 240, + 240, 130, 198, 130, 130, 0, 6, 97, 177, 177, 194, 200, + 240, 160, 21, 15, 240, 193, 193, 33, 50, 113, 118, 178, + 178, 0, 8, 81, 225, 225, 242, 248, 240, 240, 64, 24, + 12, 240, 33, 177, 177, 193, 81, 81, 19, 39, 177, 193, + 193, 100, 17, 66, 67, 33, 177, 177, 194, 197, 240, 29, + 15, 240, 81, 225, 97, 113, 65, 33, 113, 65, 49, 81, + 19, 87, 225, 241, 241, 148, 17, 114, 67, 81, 225, 225, + 242, 245, 240, 96, 23, 12, 240, 145, 193, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 129, 33, 113, 65, 66, + 100, 240, 32, 27, 12, 240, 145, 193, 97, 65, 65, 33, + 49, 81, 81, 177, 177, 177, 177, 177, 177, 177, 129, 33, + 113, 65, 66, 100, 240, 32, 26, 15, 240, 113, 241, 97, + 113, 35, 42, 193, 225, 180, 161, 49, 161, 49, 161, 49, + 180, 225, 225, 209, 225, 194, 240, 128, 29, 16, 209, 145, + 49, 33, 145, 49, 49, 113, 35, 58, 209, 241, 196, 177, + 49, 177, 49, 177, 49, 196, 241, 241, 225, 241, 210, 240, + 160, 36, 16, 240, 161, 240, 17, 129, 97, 145, 81, 145, + 81, 19, 17, 49, 37, 86, 49, 145, 81, 145, 49, 17, + 145, 66, 145, 81, 145, 241, 240, 17, 240, 23, 240, 240, + 80, 40, 17, 240, 177, 65, 193, 17, 33, 65, 97, 33, + 113, 81, 161, 81, 19, 33, 49, 37, 102, 49, 161, 81, + 161, 49, 17, 161, 66, 161, 81, 161, 240, 17, 240, 33, + 240, 39, 240, 240, 128, 24, 14, 240, 240, 17, 36, 130, + 33, 193, 193, 178, 177, 69, 25, 177, 193, 209, 193, 209, + 209, 225, 228, 240, 48, 30, 16, 240, 240, 81, 36, 49, + 98, 33, 33, 33, 129, 65, 145, 210, 209, 69, 57, 209, + 225, 241, 225, 241, 241, 240, 17, 240, 20, 240, 112, 30, + 15, 240, 49, 241, 225, 161, 33, 34, 133, 193, 225, 70, + 49, 145, 65, 129, 81, 209, 225, 65, 145, 65, 129, 97, + 113, 118, 17, 240, 224, 34, 15, 240, 49, 113, 113, 113, + 97, 81, 65, 33, 34, 49, 69, 193, 225, 70, 49, 145, + 65, 129, 81, 209, 225, 65, 145, 65, 129, 97, 113, 118, + 17, 240, 224, 27, 13, 240, 17, 209, 193, 129, 49, 34, + 86, 145, 193, 193, 177, 52, 81, 18, 65, 66, 113, 193, + 193, 177, 162, 101, 240, 48, 31, 15, 240, 49, 129, 97, + 81, 33, 81, 97, 49, 49, 34, 118, 177, 225, 225, 209, + 52, 113, 18, 65, 98, 113, 225, 225, 209, 194, 133, 240, + 112, 15, 11, 0, 12, 49, 53, 51, 81, 161, 161, 145, + 146, 99, 240, 176, 21, 16, 0, 8, 116, 81, 51, 66, + 67, 145, 240, 17, 241, 241, 225, 225, 210, 164, 0, 8, + 96, 27, 17, 240, 240, 17, 225, 33, 225, 164, 97, 51, + 66, 83, 145, 240, 33, 240, 17, 240, 17, 241, 241, 226, + 180, 0, 9, 48, 22, 14, 240, 240, 131, 17, 70, 68, + 49, 193, 193, 209, 193, 209, 209, 209, 209, 225, 225, 228, + 240, 240, 27, 15, 240, 240, 163, 33, 70, 84, 49, 209, + 209, 81, 129, 49, 33, 97, 81, 129, 225, 225, 225, 241, + 241, 244, 240, 240, 48, 23, 11, 194, 161, 161, 161, 81, + 65, 97, 65, 51, 65, 18, 114, 129, 145, 145, 161, 161, + 177, 184, 240, 128, 28, 14, 242, 129, 65, 97, 33, 49, + 113, 81, 81, 113, 97, 113, 51, 113, 18, 162, 177, 193, + 193, 209, 209, 225, 232, 240, 240, 32, 36, 15, 240, 49, + 241, 225, 161, 33, 19, 33, 84, 97, 97, 129, 65, 114, + 17, 49, 97, 97, 113, 97, 113, 81, 129, 81, 129, 165, + 145, 67, 113, 65, 34, 100, 240, 96, 29, 15, 241, 241, + 225, 225, 71, 49, 145, 49, 145, 65, 225, 225, 225, 225, + 65, 145, 17, 33, 145, 17, 50, 129, 102, 33, 225, 240, + 208, 53, 16, 240, 113, 240, 17, 145, 81, 145, 69, 97, + 34, 17, 49, 81, 17, 33, 81, 81, 49, 97, 50, 49, + 97, 49, 17, 17, 113, 33, 33, 17, 113, 33, 34, 129, + 33, 49, 51, 17, 49, 33, 17, 17, 50, 66, 65, 49, + 17, 163, 49, 240, 240, 48, 46, 16, 240, 65, 240, 17, + 241, 177, 50, 51, 85, 18, 49, 113, 17, 97, 98, 113, + 97, 129, 82, 129, 82, 129, 65, 17, 129, 49, 33, 52, + 17, 33, 17, 17, 33, 66, 82, 33, 65, 17, 81, 52, + 33, 81, 240, 192, 39, 15, 0, 6, 37, 130, 33, 34, + 81, 65, 65, 49, 81, 65, 49, 65, 97, 17, 81, 97, + 17, 81, 97, 17, 65, 113, 17, 65, 97, 33, 49, 113, + 51, 113, 209, 194, 240, 240, 80, 44, 15, 240, 145, 81, + 145, 81, 129, 81, 129, 81, 49, 65, 18, 33, 70, 49, + 145, 65, 145, 65, 145, 65, 145, 65, 145, 65, 33, 97, + 65, 17, 53, 65, 17, 33, 67, 49, 49, 65, 33, 33, + 68, 240, 80, 47, 16, 209, 177, 65, 17, 145, 17, 65, + 129, 33, 49, 129, 97, 49, 65, 18, 49, 70, 65, 145, + 81, 145, 81, 145, 81, 145, 81, 145, 81, 33, 97, 81, + 17, 53, 81, 17, 33, 67, 65, 49, 65, 33, 49, 68, + 240, 112, 48, 16, 194, 209, 33, 17, 129, 17, 33, 33, + 129, 18, 49, 129, 97, 49, 65, 18, 49, 70, 65, 145, + 81, 145, 81, 145, 81, 145, 81, 145, 81, 33, 97, 81, + 17, 53, 81, 17, 33, 67, 65, 49, 65, 33, 49, 68, + 240, 112, 37, 15, 240, 240, 145, 81, 35, 49, 98, 17, + 81, 113, 97, 113, 98, 81, 113, 17, 65, 113, 33, 33, + 129, 81, 129, 81, 129, 81, 113, 113, 97, 114, 65, 164, + 240, 240, 112, 40, 16, 240, 225, 177, 65, 17, 35, 49, + 33, 66, 17, 81, 33, 81, 97, 129, 98, 97, 113, 17, + 81, 113, 33, 49, 129, 97, 129, 97, 129, 97, 113, 129, + 97, 130, 65, 180, 240, 240, 160, 41, 16, 194, 209, 33, + 161, 17, 33, 17, 35, 49, 34, 50, 17, 81, 129, 97, + 129, 98, 97, 113, 17, 81, 113, 33, 49, 129, 97, 129, + 97, 129, 97, 113, 129, 97, 130, 65, 180, 240, 240, 160, + 37, 16, 240, 81, 240, 18, 240, 18, 209, 240, 241, 241, + 240, 17, 241, 240, 17, 34, 65, 65, 33, 50, 33, 34, + 65, 65, 34, 97, 50, 33, 33, 65, 177, 33, 210, 240, + 144, 41, 16, 240, 81, 240, 18, 81, 162, 17, 33, 129, + 65, 17, 209, 145, 241, 240, 17, 241, 240, 17, 34, 65, + 65, 33, 50, 33, 34, 65, 65, 34, 97, 50, 33, 33, + 65, 177, 33, 210, 240, 144, 41, 16, 240, 81, 240, 18, + 82, 146, 33, 33, 113, 65, 33, 210, 113, 241, 240, 17, + 241, 240, 17, 34, 65, 65, 33, 50, 33, 34, 65, 65, + 34, 97, 50, 33, 33, 65, 177, 33, 210, 240, 144, 24, + 16, 0, 8, 81, 225, 17, 193, 49, 161, 81, 114, 113, + 240, 17, 240, 17, 240, 17, 240, 18, 0, 10, 16, 28, + 16, 240, 240, 209, 209, 33, 129, 65, 145, 17, 193, 49, + 161, 81, 114, 113, 240, 17, 240, 17, 240, 17, 240, 18, + 0, 10, 16, 30, 16, 240, 240, 226, 209, 33, 97, 81, + 33, 81, 17, 82, 81, 49, 161, 81, 114, 113, 240, 17, + 240, 17, 240, 17, 240, 18, 0, 10, 16, 43, 16, 240, + 240, 33, 147, 65, 53, 113, 129, 97, 129, 97, 129, 81, + 65, 68, 33, 85, 81, 145, 81, 145, 81, 145, 81, 33, + 97, 81, 17, 53, 81, 17, 33, 67, 65, 49, 65, 34, + 33, 68, 240, 112, 45, 17, 225, 225, 33, 17, 146, 17, + 65, 53, 129, 129, 113, 129, 113, 129, 97, 65, 68, 49, + 85, 97, 145, 97, 145, 97, 145, 97, 33, 97, 97, 17, + 53, 97, 17, 33, 67, 81, 49, 65, 34, 49, 68, 240, + 144, 46, 17, 210, 225, 33, 17, 147, 33, 33, 53, 50, + 49, 129, 113, 129, 113, 129, 97, 65, 68, 49, 85, 97, + 145, 97, 145, 97, 145, 97, 33, 97, 97, 17, 53, 97, + 17, 33, 67, 81, 49, 65, 34, 49, 68, 240, 144, 27, + 13, 240, 49, 209, 193, 98, 70, 53, 193, 113, 65, 137, + 129, 193, 193, 193, 134, 97, 65, 18, 65, 65, 50, 52, + 240, 80, 37, 16, 240, 240, 115, 163, 33, 241, 225, 241, + 65, 161, 81, 129, 97, 103, 17, 82, 33, 67, 49, 49, + 97, 17, 33, 49, 81, 49, 17, 33, 97, 98, 97, 225, + 225, 240, 144, 36, 16, 240, 65, 240, 17, 177, 49, 34, + 134, 209, 241, 98, 113, 129, 52, 130, 17, 49, 113, 49, + 49, 177, 33, 113, 83, 113, 113, 129, 97, 129, 97, 114, + 119, 240, 96, 47, 15, 240, 129, 225, 113, 97, 113, 69, + 97, 18, 17, 49, 82, 49, 65, 65, 49, 97, 33, 17, + 33, 97, 17, 33, 17, 113, 17, 33, 17, 113, 17, 49, + 129, 17, 50, 97, 33, 33, 33, 81, 50, 114, 178, 240, + 240, 80, 34, 13, 240, 17, 209, 129, 49, 146, 17, 181, + 97, 33, 129, 49, 145, 17, 97, 70, 49, 65, 113, 65, + 113, 65, 113, 65, 113, 65, 97, 97, 66, 116, 240, 32, + 26, 13, 0, 8, 113, 161, 33, 129, 19, 129, 52, 33, + 51, 65, 36, 97, 81, 81, 113, 34, 129, 209, 193, 193, + 240, 64, 34, 16, 240, 145, 179, 33, 145, 51, 161, 83, + 113, 50, 49, 115, 97, 17, 35, 129, 34, 33, 113, 129, + 51, 145, 240, 17, 241, 241, 240, 17, 241, 241, 240, 128, + 33, 12, 0, 8, 17, 193, 81, 81, 97, 52, 65, 18, + 17, 33, 50, 49, 49, 33, 65, 49, 33, 17, 33, 49, + 33, 33, 17, 33, 116, 129, 161, 240, 64, 46, 15, 240, + 98, 241, 97, 113, 113, 84, 81, 50, 17, 34, 33, 49, + 49, 49, 33, 33, 65, 65, 17, 17, 81, 65, 17, 17, + 17, 49, 65, 33, 33, 49, 49, 49, 49, 33, 33, 65, + 69, 177, 225, 209, 209, 240, 144, 22, 10, 0, 6, 81, + 161, 145, 145, 34, 83, 113, 145, 145, 100, 81, 51, 49, + 49, 34, 35, 240, 16, 26, 13, 240, 33, 209, 193, 193, + 193, 65, 117, 129, 193, 193, 193, 193, 193, 136, 65, 65, + 50, 33, 65, 81, 36, 240, 96, 25, 12, 242, 193, 164, + 98, 145, 177, 161, 177, 177, 53, 49, 18, 81, 34, 129, + 17, 145, 177, 161, 146, 100, 240, 32, 35, 10, 161, 161, + 50, 65, 33, 33, 49, 17, 65, 17, 33, 65, 17, 17, + 81, 17, 17, 81, 17, 17, 81, 18, 97, 33, 97, 33, + 81, 145, 129, 145, 129, 129, 240, 31, 14, 240, 241, 52, + 115, 49, 193, 193, 193, 193, 193, 20, 115, 66, 65, 129, + 49, 161, 17, 177, 83, 65, 81, 49, 49, 81, 67, 117, + 240, 64, 45, 17, 240, 81, 240, 33, 240, 17, 240, 17, + 67, 131, 18, 49, 67, 17, 17, 81, 130, 97, 129, 113, + 114, 113, 114, 113, 97, 17, 113, 81, 33, 113, 65, 17, + 17, 113, 33, 66, 113, 33, 81, 130, 97, 240, 224, 26, + 13, 240, 209, 51, 115, 33, 177, 177, 177, 177, 177, 35, + 100, 50, 50, 113, 33, 161, 193, 193, 177, 162, 116, 240, + 48, 28, 13, 0, 6, 97, 209, 193, 194, 147, 36, 99, + 65, 81, 113, 50, 113, 33, 17, 113, 17, 33, 97, 66, + 82, 81, 50, 240, 240, 39, 16, 240, 81, 240, 17, 241, + 241, 177, 35, 178, 17, 37, 131, 81, 114, 113, 82, 129, + 67, 129, 65, 17, 129, 49, 33, 129, 33, 49, 113, 33, + 33, 17, 82, 114, 35, 161, 240, 176, 42, 15, 240, 240, + 33, 35, 162, 33, 225, 209, 214, 114, 17, 66, 65, 33, + 97, 49, 49, 113, 17, 49, 129, 17, 49, 129, 17, 33, + 66, 49, 17, 17, 65, 33, 17, 49, 81, 50, 163, 240, + 240, 64, 39, 16, 240, 240, 81, 36, 162, 33, 225, 226, + 194, 34, 145, 97, 113, 113, 163, 33, 145, 33, 17, 180, + 209, 210, 67, 82, 17, 49, 49, 49, 65, 17, 66, 17, + 97, 65, 17, 240, 32, 31, 14, 240, 49, 225, 145, 49, + 18, 117, 193, 193, 211, 81, 66, 33, 35, 50, 51, 81, + 66, 97, 65, 17, 161, 33, 145, 209, 210, 231, 240, 16, + 37, 16, 240, 240, 113, 240, 17, 241, 225, 241, 225, 241, + 225, 34, 177, 17, 33, 145, 17, 49, 81, 50, 65, 81, + 34, 81, 65, 49, 97, 65, 33, 113, 49, 49, 131, 240, + 80, 28, 15, 240, 50, 98, 115, 33, 33, 81, 97, 240, + 131, 113, 19, 49, 113, 113, 225, 225, 210, 209, 225, 209, + 209, 194, 240, 240, 144, 27, 13, 0, 10, 18, 177, 193, + 147, 19, 33, 81, 49, 49, 65, 49, 50, 33, 65, 113, + 65, 97, 65, 113, 50, 240, 240, 48, 28, 11, 0, 6, + 113, 82, 65, 81, 65, 81, 17, 17, 53, 33, 97, 49, + 97, 50, 81, 50, 81, 65, 81, 65, 65, 145, 240, 192, + 9, 5, 113, 81, 17, 81, 0, 8, 64, 11, 5, 98, + 33, 33, 17, 33, 34, 0, 8, 48, 14, 8, 240, 240, + 162, 130, 129, 129, 129, 83, 50, 0, 6, 64, 18, 11, + 240, 240, 177, 129, 33, 18, 81, 82, 177, 177, 177, 131, + 98, 0, 9, 16, 34, 13, 50, 194, 177, 33, 145, 51, + 97, 52, 65, 193, 177, 36, 97, 17, 65, 82, 81, 81, + 97, 65, 113, 65, 97, 65, 113, 65, 33, 49, 147, 240, + 240, 32, 18, 11, 0, 8, 117, 21, 49, 145, 113, 17, + 130, 145, 161, 145, 161, 145, 240, 240, 23, 14, 240, 240, + 193, 87, 37, 81, 193, 129, 34, 162, 193, 209, 209, 193, + 209, 193, 209, 193, 193, 240, 160, 18, 10, 0, 8, 65, + 129, 129, 129, 130, 98, 17, 66, 49, 145, 145, 145, 145, + 224, 24, 12, 240, 240, 65, 177, 161, 161, 161, 161, 162, + 145, 17, 114, 33, 82, 65, 177, 177, 177, 177, 177, 240, + 32, 22, 9, 0, 6, 1, 129, 129, 19, 21, 33, 17, + 97, 17, 97, 17, 81, 129, 113, 113, 113, 240, 128, 27, + 13, 240, 33, 209, 193, 199, 22, 81, 17, 161, 17, 161, + 17, 145, 33, 145, 33, 129, 193, 177, 177, 177, 177, 162, + 240, 96, 16, 13, 0, 13, 17, 68, 84, 193, 193, 193, + 113, 71, 37, 0, 5, 96, 19, 16, 0, 10, 33, 85, + 101, 241, 241, 241, 241, 241, 241, 129, 104, 38, 0, 7, + 16, 24, 12, 0, 8, 17, 193, 181, 23, 145, 17, 145, + 17, 129, 33, 113, 49, 97, 33, 17, 81, 66, 177, 240, + 224, 31, 15, 240, 113, 241, 225, 225, 97, 118, 40, 193, + 17, 193, 17, 177, 33, 177, 33, 161, 49, 145, 65, 129, + 81, 98, 65, 17, 210, 225, 240, 96, 35, 13, 240, 33, + 209, 193, 193, 113, 71, 37, 81, 97, 81, 97, 81, 81, + 97, 81, 97, 81, 97, 65, 113, 65, 33, 49, 65, 65, + 33, 49, 99, 33, 129, 240, 16, 40, 16, 240, 81, 240, + 17, 113, 113, 81, 33, 97, 97, 49, 71, 85, 81, 145, + 81, 145, 81, 129, 97, 129, 97, 129, 97, 113, 113, 113, + 33, 49, 113, 65, 33, 97, 99, 81, 129, 240, 112, 27, + 15, 240, 81, 241, 225, 225, 35, 65, 52, 131, 33, 225, + 225, 241, 20, 17, 69, 100, 49, 225, 241, 225, 225, 225, + 240, 80, 33, 16, 240, 97, 113, 129, 65, 33, 113, 81, + 145, 35, 81, 52, 147, 33, 241, 241, 240, 17, 20, 33, + 69, 116, 49, 241, 240, 17, 241, 241, 241, 240, 112, 26, + 12, 240, 209, 177, 177, 36, 68, 49, 65, 97, 49, 97, + 49, 113, 33, 113, 177, 161, 161, 161, 161, 146, 130, 240, + 112, 30, 15, 240, 193, 97, 81, 33, 81, 97, 113, 36, + 116, 49, 113, 97, 97, 97, 97, 113, 81, 113, 225, 209, + 209, 209, 209, 194, 178, 240, 208, 27, 15, 240, 49, 241, + 225, 225, 225, 84, 65, 21, 129, 81, 113, 97, 97, 97, + 97, 113, 209, 225, 209, 209, 209, 209, 240, 176, 31, 16, + 240, 65, 145, 97, 97, 33, 81, 113, 113, 241, 84, 81, + 21, 145, 81, 129, 97, 113, 97, 113, 113, 225, 241, 225, + 225, 225, 225, 240, 208, 21, 12, 0, 6, 1, 85, 37, + 65, 177, 177, 177, 177, 177, 177, 17, 85, 37, 65, 0, + 6, 16, 23, 15, 240, 193, 193, 33, 193, 49, 85, 85, + 65, 225, 225, 225, 225, 225, 225, 65, 85, 85, 65, 0, + 8, 33, 17, 240, 177, 177, 81, 177, 65, 177, 65, 177, + 65, 97, 65, 40, 39, 33, 177, 65, 177, 65, 177, 65, + 240, 17, 241, 240, 17, 241, 241, 226, 240, 192, 36, 17, + 225, 177, 81, 81, 81, 33, 129, 65, 49, 113, 65, 177, + 65, 97, 65, 40, 39, 33, 177, 65, 177, 65, 177, 65, + 240, 17, 241, 240, 17, 241, 241, 226, 240, 192, 24, 15, + 0, 5, 114, 241, 241, 240, 146, 177, 49, 145, 81, 113, + 209, 209, 209, 209, 209, 145, 34, 178, 240, 176, 28, 15, + 240, 240, 193, 66, 97, 33, 81, 97, 129, 240, 146, 177, + 49, 145, 81, 113, 209, 209, 209, 209, 209, 145, 34, 178, + 240, 176, 28, 15, 0, 5, 113, 84, 101, 49, 209, 225, + 209, 225, 209, 209, 17, 177, 49, 145, 81, 113, 113, 66, + 145, 18, 177, 240, 240, 16, 32, 17, 225, 225, 33, 225, + 81, 84, 133, 49, 241, 240, 17, 241, 240, 17, 241, 241, + 17, 209, 49, 177, 81, 145, 113, 98, 145, 50, 177, 240, + 240, 112, 31, 16, 240, 81, 240, 17, 241, 241, 241, 69, + 17, 69, 49, 53, 97, 129, 81, 145, 65, 161, 49, 177, + 241, 241, 240, 17, 240, 23, 240, 240, 64, 37, 17, 240, + 97, 145, 113, 97, 33, 97, 113, 129, 240, 17, 69, 33, + 69, 49, 69, 97, 145, 81, 161, 65, 177, 49, 193, 240, + 17, 240, 17, 240, 33, 240, 39, 240, 240, 112, 25, 12, + 240, 240, 49, 193, 17, 145, 33, 129, 49, 97, 65, 97, + 177, 161, 177, 161, 161, 161, 161, 146, 240, 240, 32, 26, + 15, 193, 193, 33, 193, 209, 65, 145, 81, 129, 97, 97, + 113, 97, 225, 209, 225, 209, 209, 209, 209, 194, 240, 240, + 176, 27, 12, 240, 209, 193, 182, 81, 81, 81, 81, 65, + 81, 65, 18, 49, 49, 65, 17, 161, 178, 145, 161, 161, + 146, 130, 240, 112, 30, 15, 193, 193, 33, 81, 97, 129, + 230, 129, 81, 129, 81, 113, 81, 113, 18, 49, 97, 65, + 17, 209, 226, 193, 209, 209, 194, 178, 240, 208, 22, 15, + 240, 240, 146, 178, 149, 225, 225, 113, 103, 39, 225, 225, + 225, 209, 225, 209, 209, 194, 240, 176, 25, 16, 240, 225, + 178, 49, 130, 49, 101, 81, 145, 241, 129, 103, 55, 241, + 241, 241, 225, 241, 225, 225, 210, 240, 208, 21, 10, 0, + 9, 17, 65, 17, 49, 49, 33, 33, 49, 33, 81, 145, + 129, 129, 129, 129, 240, 176, 29, 14, 240, 240, 145, 97, + 113, 17, 65, 97, 33, 65, 81, 49, 49, 65, 65, 129, + 209, 193, 209, 193, 193, 193, 193, 178, 162, 240, 144, 29, + 16, 209, 209, 33, 209, 113, 177, 65, 97, 65, 65, 81, + 81, 49, 81, 81, 129, 241, 225, 241, 225, 225, 225, 225, + 210, 194, 240, 208, 22, 15, 0, 5, 113, 84, 101, 240, + 240, 113, 118, 39, 225, 225, 225, 209, 225, 209, 209, 194, + 240, 176, 25, 16, 240, 225, 209, 33, 49, 83, 17, 101, + 240, 240, 161, 118, 55, 241, 241, 241, 225, 241, 225, 225, + 210, 240, 208, 23, 9, 240, 49, 145, 129, 129, 129, 129, + 131, 97, 34, 65, 65, 49, 81, 33, 129, 129, 129, 129, + 240, 16, 27, 11, 240, 113, 113, 49, 113, 33, 65, 81, + 81, 65, 161, 163, 129, 34, 97, 65, 81, 81, 65, 161, + 161, 161, 161, 240, 80, 22, 15, 240, 240, 97, 241, 225, + 225, 113, 103, 39, 225, 225, 225, 225, 209, 225, 209, 209, + 194, 240, 176, 16, 16, 0, 10, 49, 68, 132, 0, 11, + 1, 103, 54, 113, 0, 8, 16, 28, 13, 240, 240, 161, + 85, 53, 65, 177, 193, 114, 33, 161, 17, 177, 177, 17, + 145, 49, 113, 81, 81, 97, 50, 146, 240, 240, 112, 28, + 14, 240, 49, 225, 225, 227, 86, 33, 193, 193, 193, 194, + 18, 129, 17, 50, 66, 33, 81, 18, 65, 209, 209, 209, + 209, 240, 96, 19, 10, 240, 240, 113, 161, 145, 145, 129, + 145, 129, 145, 129, 129, 129, 129, 114, 240, 208, 28, 16, + 0, 8, 65, 240, 17, 65, 161, 81, 145, 97, 113, 113, + 113, 129, 81, 145, 81, 161, 49, 177, 33, 193, 17, 0, + 7, 112, 31, 17, 0, 6, 1, 225, 33, 81, 129, 129, + 65, 177, 81, 161, 97, 129, 113, 129, 129, 97, 145, 97, + 161, 65, 177, 49, 193, 33, 0, 8, 48, 32, 17, 240, + 242, 225, 33, 209, 33, 81, 130, 113, 65, 177, 81, 161, + 97, 129, 113, 129, 129, 97, 145, 97, 161, 65, 177, 49, + 193, 33, 0, 8, 48, 21, 13, 240, 177, 209, 193, 193, + 193, 114, 49, 67, 85, 129, 193, 193, 193, 193, 209, 217, + 240, 192, 26, 15, 240, 241, 177, 49, 177, 33, 145, 65, + 161, 49, 114, 81, 67, 117, 161, 225, 225, 225, 225, 241, + 249, 240, 240, 48, 28, 15, 240, 178, 33, 145, 33, 33, + 129, 33, 33, 146, 49, 225, 114, 81, 67, 117, 161, 225, + 225, 225, 225, 241, 249, 240, 240, 48, 21, 13, 0, 6, + 65, 86, 37, 81, 193, 193, 177, 193, 177, 193, 177, 177, + 177, 162, 146, 240, 112, 24, 16, 209, 209, 33, 209, 240, + 65, 86, 85, 81, 241, 241, 225, 241, 225, 241, 225, 225, + 225, 210, 194, 240, 208, 25, 16, 194, 209, 33, 193, 33, + 210, 33, 86, 85, 81, 241, 241, 225, 241, 225, 241, 225, + 225, 225, 210, 194, 240, 208, 24, 16, 0, 8, 81, 225, + 17, 193, 49, 161, 81, 129, 113, 97, 145, 240, 17, 240, + 17, 240, 18, 0, 10, 16, 28, 16, 240, 240, 225, 209, + 33, 113, 81, 129, 17, 193, 49, 161, 81, 129, 113, 97, + 145, 240, 17, 240, 17, 240, 18, 0, 10, 16, 30, 16, + 240, 240, 210, 209, 33, 113, 65, 33, 97, 17, 66, 97, + 49, 161, 81, 129, 113, 97, 145, 240, 17, 240, 17, 240, + 18, 0, 10, 16, 35, 15, 240, 97, 241, 225, 225, 113, + 103, 39, 225, 225, 33, 113, 49, 49, 97, 49, 65, 65, + 65, 65, 65, 65, 81, 33, 81, 81, 17, 65, 17, 210, + 225, 240, 112, 38, 16, 209, 129, 113, 129, 65, 161, 81, + 145, 129, 103, 55, 241, 241, 33, 129, 49, 49, 113, 49, + 65, 81, 65, 65, 81, 65, 81, 49, 81, 81, 33, 65, + 17, 226, 241, 240, 144, 40, 16, 194, 129, 65, 33, 129, + 49, 33, 129, 66, 145, 129, 103, 55, 241, 241, 33, 129, + 49, 49, 113, 49, 65, 81, 65, 65, 81, 65, 81, 49, + 81, 81, 33, 65, 17, 226, 241, 240, 144, 23, 15, 0, + 7, 65, 103, 38, 81, 209, 209, 113, 81, 145, 49, 177, + 17, 209, 241, 241, 225, 0, 6, 48, 17, 10, 240, 99, + 162, 162, 240, 131, 162, 162, 240, 115, 163, 162, 161, 240, + 96, 27, 15, 240, 240, 81, 241, 225, 225, 209, 225, 209, + 225, 81, 113, 113, 97, 129, 65, 100, 65, 36, 65, 21, + 129, 0, 5, 96, 26, 12, 240, 240, 33, 193, 177, 177, + 177, 66, 65, 114, 33, 146, 178, 145, 33, 113, 65, 81, + 81, 65, 161, 146, 240, 112, 22, 15, 0, 5, 113, 69, + 100, 225, 225, 225, 129, 88, 38, 225, 225, 225, 225, 225, + 246, 240, 240, 32, 21, 12, 0, 7, 97, 193, 177, 177, + 22, 21, 65, 97, 49, 113, 33, 129, 193, 177, 177, 240, + 240, 32, 16, 240, 82, 241, 241, 240, 17, 83, 113, 20, + 33, 17, 52, 81, 51, 33, 81, 145, 65, 177, 33, 193, + 241, 241, 240, 17, 241, 241, 241, 240, 128, 18, 13, 0, + 13, 33, 51, 115, 33, 193, 177, 193, 81, 85, 53, 81, + 240, 240, 160, 21, 15, 0, 7, 97, 68, 116, 49, 225, + 225, 209, 225, 225, 225, 81, 102, 54, 97, 0, 7, 80, + 22, 9, 0, 6, 97, 52, 35, 49, 129, 129, 33, 36, + 50, 49, 129, 129, 17, 52, 35, 49, 240, 64, 25, 13, + 240, 240, 145, 101, 38, 65, 193, 193, 193, 33, 70, 52, + 65, 193, 193, 193, 33, 85, 53, 65, 193, 240, 208, 23, + 13, 240, 209, 53, 83, 240, 240, 49, 86, 37, 81, 193, + 193, 177, 193, 177, 177, 177, 162, 131, 240, 96, 30, 10, + 240, 33, 33, 113, 33, 97, 33, 97, 33, 97, 33, 97, + 33, 97, 33, 97, 33, 97, 33, 97, 129, 145, 129, 129, + 129, 129, 240, 16, 40, 16, 240, 240, 145, 177, 65, 177, + 49, 177, 49, 177, 49, 177, 49, 177, 49, 177, 49, 81, + 65, 65, 65, 81, 65, 49, 97, 65, 33, 97, 81, 17, + 113, 82, 113, 97, 113, 240, 240, 16, 27, 12, 240, 145, + 193, 177, 177, 177, 177, 177, 177, 129, 33, 113, 49, 97, + 65, 81, 81, 65, 97, 49, 113, 18, 130, 240, 96, 29, + 14, 0, 7, 1, 102, 38, 81, 33, 161, 33, 161, 33, + 161, 49, 129, 65, 129, 65, 129, 65, 129, 65, 85, 54, + 129, 240, 240, 144, 21, 10, 0, 8, 97, 68, 36, 49, + 33, 97, 33, 97, 33, 81, 145, 129, 129, 129, 129, 240, + 16, 27, 14, 240, 240, 193, 102, 38, 81, 33, 161, 33, + 161, 33, 161, 33, 161, 33, 145, 209, 193, 209, 193, 193, + 193, 178, 240, 96, 27, 16, 240, 129, 240, 17, 241, 245, + 87, 177, 49, 177, 49, 177, 49, 113, 49, 55, 40, 241, + 241, 241, 241, 226, 241, 240, 128, 22, 16, 0, 8, 33, + 86, 85, 65, 225, 177, 18, 193, 241, 241, 241, 241, 129, + 104, 38, 0, 7, 16, 24, 12, 240, 240, 97, 70, 36, + 81, 177, 177, 17, 69, 52, 65, 177, 161, 177, 161, 161, + 161, 146, 130, 240, 96, 22, 14, 240, 240, 193, 226, 225, + 240, 113, 193, 193, 193, 193, 193, 193, 193, 129, 34, 162, + 240, 240, 144, 30, 15, 193, 97, 129, 97, 81, 129, 97, + 119, 54, 81, 49, 161, 49, 161, 49, 145, 65, 145, 65, + 129, 225, 209, 209, 209, 209, 194, 240, 160, 25, 10, 0, + 6, 81, 161, 145, 149, 21, 49, 81, 49, 65, 65, 65, + 65, 49, 33, 17, 49, 66, 33, 97, 240, 112, 21, 11, + 0, 7, 33, 161, 161, 51, 53, 97, 49, 81, 65, 65, + 81, 145, 161, 145, 130, 240, 224, 29, 16, 209, 240, 17, + 209, 50, 85, 17, 54, 50, 81, 129, 97, 129, 97, 129, + 97, 113, 113, 113, 225, 241, 225, 225, 210, 0, 7, 32, + 31, 16, 209, 146, 33, 33, 145, 50, 161, 241, 19, 88, + 161, 49, 177, 49, 177, 49, 177, 49, 113, 59, 20, 65, + 241, 241, 241, 241, 241, 240, 128, 27, 17, 240, 240, 17, + 241, 17, 241, 49, 102, 86, 66, 146, 50, 177, 33, 209, + 17, 225, 240, 17, 145, 59, 52, 0, 12, 16, 26, 17, + 240, 240, 17, 241, 17, 17, 117, 17, 55, 50, 241, 242, + 121, 240, 17, 242, 241, 241, 241, 241, 226, 0, 7, 96, + 9, 4, 240, 225, 35, 33, 240, 240, 64, 9, 16, 0, + 16, 1, 119, 39, 0, 17, 13, 6, 240, 241, 97, 97, + 97, 81, 97, 81, 240, 240, 112, 17, 9, 240, 145, 145, + 81, 65, 65, 65, 145, 145, 129, 145, 129, 0, 7, 32, +}; + +tFont *g_psFontWSazanamimincho9x17 = (tFont *)g_pui8Sazanamimincho9x17; diff --git a/third_party/fonts/other/other_fonts.h b/third_party/fonts/other/other_fonts.h new file mode 100644 index 0000000..54bd7f8 --- /dev/null +++ b/third_party/fonts/other/other_fonts.h @@ -0,0 +1,48 @@ +//***************************************************************************** +// +// other_fonts.h - Public header declaring prototypes for the various extended +// fonts found under third_party/fonts/other. +// +//***************************************************************************** +#ifndef __OTHER_FONTS_H__ +#define __OTHER_FONTS_H__ + +//***************************************************************************** +// +// Fonts containing ASCII, Hiragana and Katakana characters. Similarly named +// fonts in the binfonts subdirectory also contain Kanji (and are, of course, +// very much larger). +// +//***************************************************************************** +extern const unsigned char g_pucSazanamigothic10x19[]; +#define g_pFontSazanamigothic10x19 \ + (const tFont *)g_pucSazanamigothic10x19 +extern const unsigned char g_pucSazanamigothic6x10[]; +#define g_pFontSazanamigothic6x10 \ + (const tFont *)g_pucSazanamigothic6x10 +extern const unsigned char g_pucSazanamigothic7x13[]; +#define g_pFontSazanamigothic7x13 \ + (const tFont *)g_pucSazanamigothic7x13 +extern const unsigned char g_pucSazanamigothic8x15[]; +#define g_pFontSazanamigothic8x15 \ + (const tFont *)g_pucSazanamigothic8x15 +extern const unsigned char g_pucSazanamigothic9x17[]; +#define g_pFontSazanamigothic9x17 \ + (const tFont *)g_pucSazanamigothic9x17 +extern const unsigned char g_pucSazanamimincho10x19[]; +#define g_pFontSazanamimincho10x19 \ + (const tFont *)g_pucSazanamimincho10x19 +extern const unsigned char g_pucSazanamimincho6x10[]; +#define g_pFontSazanamimincho6x10 \ + (const tFont *)g_pucSazanamimincho6x10 +extern const unsigned char g_pucSazanamimincho7x13[]; +#define g_pFontSazanamimincho7x13 \ + (const tFont *)g_pucSazanamimincho7x13 +extern const unsigned char g_pucSazanamimincho8x15[]; +#define g_pFontSazanamimincho8x15 \ + (const tFont *)g_pucSazanamimincho8x15 +extern const unsigned char g_pucSazanamimincho9x17[]; +#define g_pFontSazanamimincho9x17 \ + (const tFont *)g_pucSazanamimincho9x17 + +#endif // __OTHER_FONTS_H__ diff --git a/third_party/fonts/other/readme.txt b/third_party/fonts/other/readme.txt new file mode 100644 index 0000000..8700b1e --- /dev/null +++ b/third_party/fonts/other/readme.txt @@ -0,0 +1,5 @@ +The fonts in this directory are provided by the Wada Laboratory of the University of Tokyo and Electronic Font Open Library. + +Specific sources: + +Sazanami - http://sourceforge.jp/projects/efont/files/?release_id=10087#10087 diff --git a/third_party/fonts/other/ttf/sazanami-gothic.ttf b/third_party/fonts/other/ttf/sazanami-gothic.ttf new file mode 100644 index 0000000..abc5d49 Binary files /dev/null and b/third_party/fonts/other/ttf/sazanami-gothic.ttf differ diff --git a/third_party/fonts/readme.txt b/third_party/fonts/readme.txt new file mode 100644 index 0000000..883d64a --- /dev/null +++ b/third_party/fonts/readme.txt @@ -0,0 +1,43 @@ +This folder contains third party fonts shipped under various licenses +including the Open Font License and Arphic Public License. Full license +information is included in each subdirectory along with fonts converted for use +with the TivaWare Graphics Library as both C source files and binary files. + +For large character sets such as Chinese and Japanese, the C format files may +contain only a subset of characters for illustration purposes. The very +much larger binary files do, however, contain a full (or at least usable) set +of characters. + +Fonts currently included are: + +ofl/fonts/fonthandwriting - a handwriting script font converted from "Breip." + Characters U+0020-U+00FF are supported. + +ofl/fonts/fonthangul - a Korean Hangul font converted from "Nanum". C + versions include ASCII and Korean Jamo only. + Binary versions also include Hangul syllables in + the U+AC00-U+D7A3 range. + +ofl/fonts/fontoldstandard - a Latin font converted from "OldStandard" + Characters U+0020-U+00FF are supported. + +ofl/fonts/fontsansand - a Latin font converted from "Andika" + Characters U+0020-U+00FF are supported. + +ofl/fonts/fonttheano - a Latin font converted from "Theano" + Characters U+0020-U+00FF are supported. + +apl/fonts/fireflysung - a Chinese font converted from "FireflySung" + C versions include ASCII and the first 256 + ideographs from U+4E00. Binary versions include + all available ideographs from U+4E00-U+9FFF. + +other/fonts/fontsazanami - a Japanese font converted from "Sazanami". C + versions include ASCII, Katakana and Hiragana. + Binary versions add Kanji. + +lang_demo/fontcustom - a custom font built specifically for use with + the lang_demo example application included in + many releases of TivaWare. These fonts + contain only the required glyphs to support + the string table used by this application. \ No newline at end of file diff --git a/third_party/lwip-1.4.1/CHANGELOG b/third_party/lwip-1.4.1/CHANGELOG new file mode 100644 index 0000000..a3e1498 --- /dev/null +++ b/third_party/lwip-1.4.1/CHANGELOG @@ -0,0 +1,3349 @@ +HISTORY + +(CVS HEAD) + + * [Enter new changes just after this line - do not remove this line] + + ++ New features: + + + ++ Bugfixes: + + + + +(STABLE-1.4.1) + + ++ New features: + + 2012-03-25: Simon Goldschmidt (idea by Mason) + * posix/*: added posix-compatibility include files posix/netdb.h and posix/sys/socket.h + which are a simple wrapper to the correct lwIP include files. + + 2012-01-16: Simon Goldschmidt + * opt.h, icmp.c: Added option CHECKSUM_GEN_ICMP + + 2011-12-17: Simon Goldschmidt + * ip.h: implemented API functions to access so_options of IP pcbs (UDP, TCP, RAW) + (fixes bug #35061) + + 2011-09-27: Simon Goldschmidt + * opt.h, tcp.c, tcp_in.c: Implemented limiting data on ooseq queue (task #9989) + (define TCP_OOSEQ_MAX_BYTES / TCP_OOSEQ_MAX_PBUFS in lwipopts.h) + + 2011-09-21: Simon Goldschmidt + * opt.h, api.h, api_lib.c, api_msg.h/.c, sockets.c: Implemented timeout on + send (TCP only, bug #33820) + + 2011-09-21: Simon Goldschmidt + * init.c: Converted runtime-sanity-checks into compile-time checks that can + be disabled (since runtime checks can often not be seen on embedded targets) + + 2011-09-11: Simon Goldschmidt + * ppp.h, ppp_impl.h: splitted ppp.h to an internal and external header file + to get a clear separation of which functions an application or port may use + (task #11281) + + 2011-09-11: Simon Goldschmidt + * opt.h, tcp_impl.h, tcp.c, udp.h/.c: Added a config option to randomize + initial local TCP/UDP ports (so that different port ranges are used after + a reboot; bug #33818; this one added tcp_init/udp_init functions again) + + 2011-09-03: Simon Goldschmidt + * dhcp.c: DHCP uses LWIP_RAND() for xid's (bug #30302) + + 2011-08-24: Simon Goldschmidt + * opt.h, netif.h/.c: added netif remove callback (bug #32397) + + 2011-07-26: Simon Goldschmidt + * etharp.c: ETHARP_SUPPORT_VLAN: add support for an external VLAN filter + function instead of only checking for one VLAN (define ETHARP_VLAN_CHECK_FN) + + 2011-07-21: Simon Goldschmidt (patch by hanhui) + * ip4.c, etharp.c, pbuf.h: bug #33634 ip_forward() have a faulty behaviour: + Added pbuf flags to mark incoming packets as link-layer broadcast/multicast. + Also added code to allow ip_forward() to forward non-broadcast packets to + the input netif (set IP_FORWARD_ALLOW_TX_ON_RX_NETIF==1). + + 2011-06-26: Simon Goldschmidt (patch by Cameron Gutman) + * tcp.c, tcp_out.c: bug #33604: added some more asserts to check that + pcb->state != LISTEN + + 2011-05-14: Simon Goldschmidt (patch by Stéphane Lesage) + * tcpip.c/.h: patch #7449 allow tcpip callback from interrupt with static + memory message + + + ++ Bugfixes: + + 2012-09-26: Simon Goldschmidt + * api_msg.c: fixed bug #37405 'err_tcp()' uses already freed 'netconn' object + + 2012-09-26: patch by Henrik Persson + * dhcp.c: patch #7843 Fix corner case with dhcp timeouts + + 2012-09-26: patch by Henrik Persson + * dhcp.c: patch #7840 Segfault in dhcp_parse_reply if no end marker in dhcp packet + + 2012-08-22: Simon Goldschmidt + * memp.c: fixed bug #37166: memp_sanity check loops itself + + 2012-05-08: Simon Goldschmidt + * tcp_out.c: fixed bug: #36380 unsent_oversize mismatch in 1.4.1RC1 (this was + a debug-check issue only) + + 2012-03-27: Simon Goldschmidt + * vj.c: fixed bug #35756 header length calculation problem in ppp/vj.c + + 2012-03-27: Simon Goldschmidt (patch by Mason) + * tcp_out.c: fixed bug #35945: SYN packet should provide the recv MSS not the + send MSS + + 2012-03-22: Simon Goldschmidt + * ip4.c: fixed bug #35927: missing refragmentaion in ip_forward + + 2012-03-20: Simon Goldschmidt (patch by Mason) + * netdb.c: fixed bug #35907: lwip_gethostbyname_r returns an invalid h_addr_list + + 2012-03-12: Simon Goldschmidt (patch by Bostjan Meglic) + * ppp.c: fixed bug #35809: PPP GetMask(): Compiler warning on big endian, + possible bug on little endian system + + 2012-02-23: Simon Goldschmidt + * etharp.c: fixed bug #35595: Impossible to send broadcast without a gateway + (introduced when fixing bug# 33551) + + 2012-02-16: Simon Goldschmidt + * ppp.c: fixed pbuf leak when PPP session is aborted through pppSigHUP() + (bug #35541: PPP Memory Leak) + + 2012-02-16: Simon Goldschmidt + * etharp.c: fixed bug #35531: Impossible to send multicast without a gateway + (introduced when fixing bug# 33551) + + 2012-02-16: Simon Goldschmidt (patch by Stéphane Lesage) + * msg_in.c, msg_out.c: fixed bug #35536 SNMP: error too big response is malformed + + 2012-02-15: Simon Goldschmidt + * init.c: fixed bug #35537: MEMP_NUM_* sanity checks should be disabled with + MEMP_MEM_MALLOC==1 + + 2012-02-12: Simon Goldschmidt + * tcp.h, tcp_in.c, tcp_out.c: partly fixed bug #25882: TCP hangs on + MSS > pcb->snd_wnd (by not creating segments bigger than half the window) + + 2012-02-11: Simon Goldschmidt + * tcp.c: fixed bug #35435: No pcb state check before adding it to time-wait + queue while closing + + 2012-01-22: Simon Goldschmidt + * tcp.c, tcp_in.c: fixed bug #35305: pcb may be freed too early on shutdown(WR) + + 2012-01-21: Simon Goldschmidt + * tcp.c: fixed bug #34636: FIN_WAIT_2 - Incorrect shutdown of TCP pcb + + 2012-01-20: Simon Goldschmidt + * dhcp.c: fixed bug #35151: DHCP asserts on incoming option lengths + + 2012-01-20: Simon Goldschmidt + * pbuf.c: fixed bug #35291: NULL pointer in pbuf_copy + + 2011-11-25: Simon Goldschmidt + * tcp.h/.c, tcp_impl.h, tcp_in.c: fixed bug #31177: tcp timers can corrupt + tcp_active_pcbs in some cases + + 2011-11-23: Simon Goldschmidt + * sys.c: fixed bug #34884: sys_msleep() body needs to be surrounded with + '#ifndef sys_msleep' + + 2011-11-22: Simon Goldschmidt + * netif.c, etharp.h/.c: fixed bug #34684: Clear the arp table cache when + netif is brought down + + 2011-10-28: Simon Goldschmidt + * tcp_in.c: fixed bug #34638: Dead code in tcp_receive - pcb->dupacks + + 2011-10-23: Simon Goldschmidt + * mem.c: fixed bug #34429: possible memory corruption with + LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT set to 1 + + 2011-10-18: Simon Goldschmidt + * arch.h, netdb.c: fixed bug #34592: lwip_gethostbyname_r uses nonstandard + error value + + 2011-10-18: Simon Goldschmidt + * opt.h: fixed default values of TCP_SNDLOWAT and TCP_SNDQUEUELOWAT for small + windows (bug #34176 select after non-blocking send times out) + + 2011-10-18: Simon Goldschmidt + * tcp_impl.h, tcp_out.c: fixed bug #34587: TCP_BUILD_MSS_OPTION doesn't + consider netif->mtu, causes slow network + + 2011-10-18: Simon Goldschmidt + * sockets.c: fixed bug #34581 missing parentheses in udplite sockets code + + 2011-10-18: Simon Goldschmidt + * sockets.h: fixed bug #34580 fcntl() is missing in LWIP_COMPAT_SOCKETS + + 2011-10-17: Simon Goldschmidt + * api_msg.c: fixed bug #34569: shutdown(SHUT_WR) crashes netconn/socket api + + 2011-10-13: Simon Goldschmidt + * tcp_in.c, tcp_out.c: fixed bug #34517 (persist timer is started although no + zero window is received) by starting the persist timer when a zero window is + received, not when we have more data queued for sending than fits into the + window + + 2011-10-13: Simon Goldschmidt + * def.h, timers.c: fixed bug #34541: LWIP_U32_DIFF is unnecessarily complex + + 2011-10-13: Simon Goldschmidt + * sockets.c, api_lib.c: fixed bug #34540: compiler error when CORE_LOCKING is + used and not all protocols are enabled + + 2011-10-12: Simon Goldschmidt + * pbuf.c: fixed bug #34534: Error in sending fragmented IP if MEM_ALIGNMENT > 4 + + 2011-10-09: Simon Goldschmidt + * tcp_out.c: fixed bug #34426: tcp_zero_window_probe() transmits incorrect + byte value when pcb->unacked != NULL + + 2011-10-09: Simon Goldschmidt + * ip4.c: fixed bug #34447 LWIP_IP_ACCEPT_UDP_PORT(dst_port) wrong + + 2011-09-27: Simon Goldschmidt + * tcp_in.c, tcp_out.c: Reset pcb->unsent_oversize in 2 more places... + + 2011-09-27: Simon Goldschmidt + * tcp_in.c: fixed bug #28288: Data after FIN in oos queue + + 2011-09-27: Simon Goldschmidt + * dhcp.c: fixed bug #34406 dhcp_option_hostname() can overflow the pbuf + + 2011-09-24: Simon Goldschmidt + * mem.h: fixed bug #34377 MEM_SIZE_F is not defined if MEM_LIBC_MALLOC==1 + + 2011-09-23: Simon Goldschmidt + * pbuf.h, tcp.c, tcp_in.c: fixed bug #33871: rejecting TCP_EVENT_RECV() for + the last packet including FIN can lose data + + 2011-09-22: Simon Goldschmidt + * tcp_impl.h: fixed bug #34355: nagle does not take snd_buf/snd_queuelen into + account + + 2011-09-21: Simon Goldschmidt + * opt.h: fixed default value of TCP_SND_BUF to not violate the sanity checks + in init.c + + 2011-09-20: Simon Goldschmidt + * timers.c: fixed bug #34337 (possible NULL pointer in sys_check_timeouts) + + 2011-09-11: Simon Goldschmidt + * tcp_out.c: use pcb->mss instead of TCP_MSS for preallocate mss-sized pbufs + (bug #34019) + + 2011-09-09: Simon Goldschmidt + * udp.c: fixed bug #34072: UDP broadcast is received from wrong UDP pcb if + udp port matches + + 2011-09-03: Simon Goldschmidt + * tcp_in.c: fixed bug #33952 PUSH flag in incoming packet is lost when packet + is aggregated and sent to application + + 2011-09-01: Simon Goldschmidt + * opt.h: fixed bug #31809 LWIP_EVENT_API in opts.h is inconsistent compared + to other options + + 2011-09-01: Simon Goldschmidt + * tcp_in.c: fixed bug #34111 RST for ACK to listening pcb has wrong seqno + + 2011-08-24: Simon Goldschmidt + * api_msg.c, sockets.c: fixed bug #33956 Wrong error returned when calling + accept() on UDP connections + + 2011-08-24: Simon Goldschmidt + * sockets.h: fixed bug #34057 socklen_t should be a typedef + + 2011-08-24: Simon Goldschmidt + * pbuf.c: fixed bug #34112 Odd check in pbuf_alloced_custom (typo) + + 2011-08-24: Simon Goldschmidt + * dhcp.c: fixed bug #34122 dhcp: hostname can overflow + + 2011-08-24: Simon Goldschmidt + * netif.c: fixed bug #34121 netif_add/netif_set_ipaddr fail on NULL ipaddr + + 2011-08-22: Simon Goldschmidt + * tcp_out.c: fixed bug #33962 TF_FIN not always set after FIN is sent. (This + merely prevents nagle from not transmitting fast after closing.) + + 2011-07-22: Simon Goldschmidt + * api_lib.c, api_msg.c, sockets.c, api.h: fixed bug #31084 (socket API returns + always EMSGSIZE on non-blocking sockets if data size > send buffers) -> now + lwip_send() sends as much as possible for non-blocking sockets + + 2011-07-22: Simon Goldschmidt + * pbuf.c/.h, timers.c: freeing ooseq pbufs when the pbuf pool is empty implemented + for NO_SYS==1: when not using sys_check_timeouts(), call PBUF_CHECK_FREE_OOSEQ() + at regular intervals from main level. + + 2011-07-21: Simon Goldschmidt + * etharp.c: fixed bug #33551 (ARP entries may time out although in use) by + sending an ARP request when an ARP entry is used in the last minute before + it would time out. + + 2011-07-04: Simon Goldschmidt + * sys_arch.txt: Fixed documentation after changing sys arch prototypes for 1.4.0. + + 2011-06-26: Simon Goldschmidt + * tcp.c: fixed bug #31723 (tcp_kill_prio() kills pcbs with the same prio) by + updating its documentation only. + + 2011-06-26: Simon Goldschmidt + * mem.c: fixed bug #33545: With MEM_USE_POOLS==1, mem_malloc can return an + unaligned pointer. + + 2011-06-26: Simon Goldschmidt + * mem.c: fixed bug #33544 "warning in mem.c in lwip 1.4.0 with NO_SYS=1" + + 2011-05-25: Simon Goldschmidt + * tcp.c: fixed bug #33398 (pointless conversion when checking TCP port range) + + + +(STABLE-1.4.0) + + ++ New features: + + 2011-03-27: Simon Goldschmidt + * tcp_impl.h, tcp_in.c, tcp_out.c: Removed 'dataptr' from 'struct tcp_seg' and + calculate it in tcp_zero_window_probe (the only place where it was used). + + 2010-11-21: Simon Goldschmidt + * dhcp.c/.h: Added a function to deallocate the struct dhcp from a netif + (fixes bug #31525). + + 2010-07-12: Simon Goldschmidt (patch by Stephane Lesage) + * ip.c, udp.c/.h, pbuf.h, sockets.c: task #10495: Added support for + IP_MULTICAST_LOOP at socket- and raw-API level. + + 2010-06-16: Simon Goldschmidt + * ip.c: Added an optional define (LWIP_IP_ACCEPT_UDP_PORT) that can allow + link-layer-addressed UDP traffic to be received while a netif is down (just + like DHCP during configuration) + + 2010-05-22: Simon Goldschmidt + * many many files: bug #27352: removed packing from ip_addr_t, the packed + version is now only used in protocol headers. Added global storage for + current src/dest IP address while in input functions. + + 2010-05-16: Simon Goldschmidt + * def.h: task #10391: Add preprocessor-macros for compile-time htonl + calculation (and use them throughout the stack where applicable) + + 2010-05-16: Simon Goldschmidt + * opt.h, memp_std.h, memp.c, ppp_oe.h/.c: PPPoE now uses its own MEMP pool + instead of the heap (moved struct pppoe_softc from ppp_oe.c to ppp_oe.h) + + 2010-05-16: Simon Goldschmidt + * opt.h, memp_std.h, dns.h/.c: DNS_LOCAL_HOSTLIST_IS_DYNAMIC uses its own + MEMP pool instead of the heap + + 2010-05-13: Simon Goldschmidt + * tcp.c, udp.c: task #6995: Implement SO_REUSEADDR (correctly), added + new option SO_REUSE_RXTOALL to pass received UDP broadcast/multicast + packets to more than one pcb. + + 2010-05-02: Simon Goldschmidt + * netbuf.h/.c, sockets.c, api_msg.c: use checksum-on-copy for sending + UDP data for LWIP_NETIF_TX_SINGLE_PBUF==1 + + 2010-04-30: Simon Goldschmidt + * udp.h/.c, pbuf.h/.c: task #6849: added udp_send(_to/_if) functions that + take a precalculated checksum, added pbuf_fill_chksum() to copy data + into a pbuf and at the same time calculating the checksum for that data + + 2010-04-29: Simon Goldschmidt + * ip_addr.h, etharp.h/.c, autoip.c: Create overridable macros for copying + 2-byte-aligned IP addresses and MAC addresses + + 2010-04-28: Patch by Bill Auerbach + * ip.c: Inline generating IP checksum to save a function call + + 2010-04-14: Simon Goldschmidt + * tcpip.h/.c, timers.c: Added an overridable define to get informed when the + tcpip_thread processes messages or timeouts to implement a watchdog. + + 2010-03-28: Simon Goldschmidt + * ip_frag.c: create a new (contiguous) PBUF_RAM for every outgoing + fragment if LWIP_NETIF_TX_SINGLE_PBUF==1 + + 2010-03-27: Simon Goldschmidt + * etharp.c: Speedup TX by moving code from find_entry to etharp_output/ + etharp_query to prevent unnecessary function calls (inspired by + patch #7135). + + 2010-03-20: Simon Goldschmidt + * opt.h, tcpip.c/.h: Added an option to disable tcpip_(un)timeout code + since the linker cannot do this automatically to save space. + + 2010-03-20: Simon Goldschmidt + * opt.h, etharp.c/.h: Added support for static ARP table entries + + 2010-03-14: Simon Goldschmidt + * tcp_impl.h, tcp_out.c, inet_chksum.h/.c: task #6849: Calculate checksum + when creating TCP segments, not when (re-)transmitting them. + + 2010-03-07: Simon Goldschmidt + * sockets.c: bug #28775 (select/event_callback: only check select_cb_list + on change) plus use SYS_LIGHTWEIGHT_PROT to protect the select code. + This should speed up receiving data on sockets as the select code in + event_callback is only executed when select is waiting. + + 2010-03-06: Simon Goldschmidt + * tcp_out.c: task #7013 (Create option to have all packets delivered to + netif->output in one piece): Always copy to try to create single pbufs + in tcp_write. + + 2010-03-06: Simon Goldschmidt + * api.h, api_lib.c, sockets.c: task #10167 (sockets: speed up TCP recv + by not allocating a netbuf): added function netconn_recv_tcp_pbuf() + for tcp netconns to receive pbufs, not netbufs; use that function + for tcp sockets. + + 2010-03-05: Jakob Ole Stoklundsen / Simon Goldschmidt + * opt.h, tcp.h, tcp_impl.h, tcp.c, tcp_in.c, tcp_out.c: task #7040: + Work on tcp_enqueue: Don't waste memory when chaining segments, + added option TCP_OVERSIZE to prevent creating many small pbufs when + calling tcp_write with many small blocks of data. Instead, pbufs are + allocated larger than needed and the space is used for later calls to + tcp_write. + + 2010-02-21: Simon Goldschmidt + * stats.c/.h: Added const char* name to mem- and memp-stats for easier + debugging. + + 2010-02-21: Simon Goldschmidt + * tcp.h (and usages), added tcp_impl.h: Splitted API and internal + implementation of tcp to make API usage cleare to application programmers + + 2010-02-14: Simon Goldschmidt/Stephane Lesage + * ip_addr.h: Improved some defines working on ip addresses, added faster + macro to copy addresses that cannot be NULL + + 2010-02-13: Simon Goldschmidt + * api.h, api_lib.c, api_msg.c, sockets.c: task #7865 (implement non- + blocking send operation) + + 2010-02-12: Simon Goldschmidt + * sockets.c/.h: Added a minimal version of posix fctl() to have a + standardised way to set O_NONBLOCK for nonblocking sockets. + + 2010-02-12: Simon Goldschmidt + * dhcp.c/.h, autoip.c/.h: task #10139 (Prefer statically allocated + memory): added autoip_set_struct() and dhcp_set_struct() to let autoip + and dhcp work with user-allocated structs instead of callin mem_malloc + + 2010-02-12: Simon Goldschmidt/Jeff Barber + * tcp.c/h: patch #6865 (SO_REUSEADDR for TCP): if pcb.so_options has + SOF_REUSEADDR set, allow binding to endpoint in TIME_WAIT + + 2010-02-12: Simon Goldschmidt + * sys layer: task #10139 (Prefer statically allocated memory): converted + mbox and semaphore functions to take pointers to sys_mbox_t/sys_sem_t; + converted sys_mbox_new/sys_sem_new to take pointers and return err_t; + task #7212: Add Mutex concept in sys_arch (define LWIP_COMPAT_MUTEX + to let sys.h use binary semaphores instead of mutexes - as before) + + 2010-02-09: Simon Goldschmidt (Simon Kallweit) + * timers.c/.h: Added function sys_restart_timeouts() from patch #7085 + (Restart system timeout handling) + + 2010-02-09: Simon Goldschmidt + * netif.c/.h, removed loopif.c/.h: task #10153 (Integrate loopif into + netif.c) - loopif does not have to be created by the port any more, + just define LWIP_HAVE_LOOPIF to 1. + + 2010-02-08: Simon Goldschmidt + * inet.h, ip_addr.c/.h: Added reentrant versions of inet_ntoa/ipaddr_ntoa + inet_ntoa_r/ipaddr_ntoa_r + + 2010-02-08: Simon Goldschmidt + * netif.h: Added netif_s/get_igmp_mac_filter() macros + + 2010-02-05: Simon Goldschmidt + * netif.h: Added function-like macros to get/set the hostname on a netif + + 2010-02-04: Simon Goldschmidt + * nearly every file: Replaced struct ip_addr by typedef ip_addr_t to + make changing the actual implementation behind the typedef easier. + + 2010-02-01: Simon Goldschmidt + * opt.h, memp_std.h, dns.h, netdb.c, memp.c: Let netdb use a memp pool + for allocating memory when getaddrinfo() is called. + + 2010-01-31: Simon Goldschmidt + * dhcp.h, dhcp.c: Reworked the code that parses DHCP options: parse + them once instead of parsing for every option. This also removes + the need for mem_malloc from dhcp_recv and makes it possible to + correctly retrieve the BOOTP file. + + 2010-01-30: simon Goldschmidt + * sockets.c: Use SYS_LIGHTWEIGHT_PROT instead of a semaphore to protect + the sockets array. + + 2010-01-29: Simon Goldschmidt (patch by Laura Garrett) + * api.h, api_msg.c, sockets.c: Added except set support in select + (patch #6860) + + 2010-01-29: Simon Goldschmidt (patch by Laura Garrett) + * api.h, sockets.h, err.h, api_lib.c, api_msg.c, sockets.c, err.c: + Add non-blocking support for connect (partly from patch #6860), + plus many cleanups in socket & netconn API. + + 2010-01-27: Simon Goldschmidt + * opt.h, tcp.h, init.c, api_msg.c: Added TCP_SNDQUEUELOWAT corresponding + to TCP_SNDLOWAT and added tcp_sndqueuelen() - this fixes bug #28605 + + 2010-01-26: Simon Goldschmidt + * snmp: Use memp pools for snmp instead of the heap; added 4 new pools. + + 2010-01-14: Simon Goldschmidt + * ppp.c/.h: Fixed bug #27856: PPP: Set netif link- and status-callback + by adding ppp_set_netif_statuscallback()/ppp_set_netif_linkcallback() + + 2010-01-13: Simon Goldschmidt + * mem.c: The heap now may be moved to user-defined memory by defining + LWIP_RAM_HEAP_POINTER as a void pointer to that memory's address + (patch #6966 and bug #26133) + + 2010-01-10: Simon Goldschmidt (Bill Auerbach) + * opt.h, memp.c: patch #6822 (Add option to place memory pools in + separate arrays) + + 2010-01-10: Simon Goldschmidt + * init.c, igmp.c: patch #6463 (IGMP - Adding Random Delay): added define + LWIP_RAND() for lwip-wide randomization (to be defined in cc.h) + + 2009-12-31: Simon Goldschmidt + * tcpip.c, init.c, memp.c, sys.c, memp_std.h, sys.h, tcpip.h + added timers.c/.h: Separated timer implementation from semaphore/mbox + implementation, moved timer implementation to timers.c/.h, timers are + now only called from tcpip_thread or by explicitly checking them. + (TASK#7235) + + 2009-12-27: Simon Goldschmidt + * opt.h, etharp.h/.c, init.c, tcpip.c: Added an additional option + LWIP_ETHERNET to support ethernet without ARP (necessary for pure PPPoE) + + + ++ Bugfixes: + + 2011-04-20: Simon Goldschmidt + * sys_arch.txt: sys_arch_timeouts() is not needed any more. + + 2011-04-13: Simon Goldschmidt + * tcp.c, udp.c: Fixed bug #33048 (Bad range for IP source port numbers) by + using ports in the IANA private/dynamic range (49152 through 65535). + + 2011-03-29: Simon Goldschmidt, patch by Emil Lhungdahl: + * etharp.h/.c: Fixed broken VLAN support. + + 2011-03-27: Simon Goldschmidt + * tcp.c: Fixed bug #32926 (TCP_RMV(&tcp_bound_pcbs) is called on unbound tcp + pcbs) by checking if the pcb was bound (local_port != 0). + + 2011-03-27: Simon Goldschmidt + * ppp.c: Fixed bug #32280 (ppp: a pbuf is freed twice) + + 2011-03-27: Simon Goldschmidt + * sockets.c: Fixed bug #32906: lwip_connect+lwip_send did not work for udp and + raw pcbs with LWIP_TCPIP_CORE_LOCKING==1. + + 2011-03-27: Simon Goldschmidt + * tcp_out.c: Fixed bug #32820 (Outgoing TCP connections created before route + is present never times out) by starting retransmission timer before checking + route. + + 2011-03-22: Simon Goldschmidt + * ppp.c: Fixed bug #32648 (PPP code crashes when terminating a link) by only + calling sio_read_abort() if the file descriptor is valid. + + 2011-03-14: Simon Goldschmidt + * err.h/.c, sockets.c, api_msg.c: fixed bug #31748 (Calling non-blocking connect + more than once can render a socket useless) since it mainly involves changing + "FATAL" classification of error codes: ERR_USE and ERR_ISCONN just aren't fatal. + + 2011-03-13: Simon Goldschmidt + * sockets.c: fixed bug #32769 (ESHUTDOWN is linux-specific) by fixing + err_to_errno_table (ERR_CLSD: ENOTCONN instead of ESHUTDOWN), ERR_ISCONN: + use EALRADY instead of -1 + + 2011-03-13: Simon Goldschmidt + * api_lib.c: netconn_accept: return ERR_ABRT instead of ERR_CLSD if the + connection has been aborted by err_tcp (since this is not a normal closing + procedure). + + 2011-03-13: Simon Goldschmidt + * tcp.c: tcp_bind: return ERR_VAL instead of ERR_ISCONN when trying to bind + with pcb->state != CLOSED + + 2011-02-17: Simon Goldschmidt + * rawapi.txt: Fixed bug #32561 tcp_poll argument definition out-of-order in + documentation + + 2011-02-17: Simon Goldschmidt + * many files: Added missing U/UL modifiers to fix 16-bit-arch portability. + + 2011-01-24: Simon Goldschmidt + * sockets.c: Fixed bug #31741: lwip_select seems to have threading problems + + 2010-12-02: Simon Goldschmidt + * err.h: Fixed ERR_IS_FATAL so that ERR_WOULDBLOCK is not fatal. + + 2010-11-23: Simon Goldschmidt + * api.h, api_lib.c, api_msg.c, sockets.c: netconn.recv_avail is only used for + LWIP_SO_RCVBUF and ioctl/FIONREAD. + + 2010-11-23: Simon Goldschmidt + * etharp.c: Fixed bug #31720: ARP-queueing: RFC 1122 recommends to queue at + least 1 packet -> ARP_QUEUEING==0 now queues the most recent packet. + + 2010-11-23: Simon Goldschmidt + * tcp_in.c: Fixed bug #30577: tcp_input: don't discard ACK-only packets after + refusing 'refused_data' again. + + 2010-11-22: Simon Goldschmidt + * sockets.c: Fixed bug #31590: getsockopt(... SO_ERROR ...) gives EINPROGRESS + after a successful nonblocking connection. + + 2010-11-22: Simon Goldschmidt + * etharp.c: Fixed bug #31722: IP packets sent with an AutoIP source addr + must be sent link-local + + 2010-11-22: Simon Goldschmidt + * timers.c: patch #7329: tcp_timer_needed prototype was ifdef'ed out for + LWIP_TIMERS==0 + + 2010-11-20: Simon Goldschmidt + * sockets.c: Fixed bug #31170: lwip_setsockopt() does not set socket number + + 2010-11-20: Simon Goldschmidt + * sockets.h: Fixed bug #31304: Changed SHUT_RD, SHUT_WR and SHUT_RDWR to + resemble other stacks. + + 2010-11-20: Simon Goldschmidt + * dns.c: Fixed bug #31535: TCP_SND_QUEUELEN must be at least 2 or else + no-copy TCP writes will never succeed. + + 2010-11-20: Simon Goldschmidt + * dns.c: Fixed bug #31701: Error return value from dns_gethostbyname() does + not match documentation: return ERR_ARG instead of ERR_VAL if not + initialized or wrong argument. + + 2010-10-20: Simon Goldschmidt + * sockets.h: Fixed bug #31385: sizeof(struct sockaddr) is 30 but should be 16 + + 2010-10-05: Simon Goldschmidt + * dhcp.c: Once again fixed #30038: DHCP/AutoIP cooperation failed when + replugging the network cable after an AutoIP address was assigned. + + 2010-08-10: Simon Goldschmidt + * tcp.c: Fixed bug #30728: tcp_new_port() did not check listen pcbs + + 2010-08-03: Simon Goldschmidt + * udp.c, raw.c: Don't chain empty pbufs when sending them (fixes bug #30625) + + 2010-08-01: Simon Goldschmidt (patch by Greg Renda) + * ppp.c: Applied patch #7264 (PPP protocols are rejected incorrectly on big + endian architectures) + + 2010-07-28: Simon Goldschmidt + * api_lib.c, api_msg.c, sockets.c, mib2.c: Fixed compilation with TCP or UDP + disabled. + + 2010-07-27: Simon Goldschmidt + * tcp.c: Fixed bug #30565 (tcp_connect() check bound list): that check did no + harm but never did anything + + 2010-07-21: Simon Goldschmidt + * ip.c: Fixed invalid fix for bug #30402 (CHECKSUM_GEN_IP_INLINE does not + add IP options) + + 2010-07-16: Kieran Mansley + * msg_in.c: Fixed SNMP ASN constant defines to not use ! operator + + 2010-07-10: Simon Goldschmidt + * ip.c: Fixed bug #30402: CHECKSUM_GEN_IP_INLINE does not add IP options + + 2010-06-30: Simon Goldschmidt + * api_msg.c: fixed bug #30300 (shutdown parameter was not initialized in + netconn_delete) + + 2010-06-28: Kieran Mansley + * timers.c remove unportable printing of C function pointers + + 2010-06-24: Simon Goldschmidt + * init.c, timers.c/.h, opt.h, memp_std.h: From patch #7221: added flag + NO_SYS_NO_TIMERS to drop timer support for NO_SYS==1 for easier upgrading + + 2010-06-24: Simon Goldschmidt + * api(_lib).c/.h, api_msg.c/.h, sockets.c/.h: Fixed bug #10088: Correctly + implemented shutdown at socket level. + + 2010-06-21: Simon Goldschmidt + * pbuf.c/.h, ip_frag.c/.h, opt.h, memp_std.h: Fixed bug #29361 (ip_frag has + problems with zero-copy DMA MACs) by adding custom pbufs and implementing + custom pbufs that reference other (original) pbufs. Additionally set + IP_FRAG_USES_STATIC_BUF=0 as default to be on the safe side. + + 2010-06-15: Simon Goldschmidt + * dhcp.c: Fixed bug #29970: DHCP endian issue parsing option responses + + 2010-06-14: Simon Goldschmidt + * autoip.c: Fixed bug #30039: AutoIP does not reuse previous addresses + + 2010-06-12: Simon Goldschmidt + * dhcp.c: Fixed bug #30038: dhcp_network_changed doesn't reset AUTOIP coop + state + + 2010-05-17: Simon Goldschmidt + * netdb.c: Correctly NULL-terminate h_addr_list + + 2010-05-16: Simon Goldschmidt + * def.h/.c: changed the semantics of LWIP_PREFIX_BYTEORDER_FUNCS to prevent + "symbol already defined" i.e. when linking to winsock + + 2010-05-05: Simon Goldschmidt + * def.h, timers.c: Fixed bug #29769 (sys_check_timeouts: sys_now() may + overflow) + + 2010-04-21: Simon Goldschmidt + * api_msg.c: Fixed bug #29617 (sometime cause stall on delete listening + connection) + + 2010-03-28: Luca Ceresoli + * ip_addr.c/.h: patch #7143: Add a few missing const qualifiers + + 2010-03-27: Luca Ceresoli + * mib2.c: patch #7130: remove meaningless const qualifiers + + 2010-03-26: Simon Goldschmidt + * tcp_out.c: Make LWIP_NETIF_TX_SINGLE_PBUF work for TCP, too + + 2010-03-26: Simon Goldschmidt + * various files: Fixed compiling with different options disabled (TCP/UDP), + triggered by bug #29345; don't allocate acceptmbox if LWIP_TCP is disabled + + 2010-03-25: Simon Goldschmidt + * sockets.c: Fixed bug #29332: lwip_select() processes readset incorrectly + + 2010-03-25: Simon Goldschmidt + * tcp_in.c, test_tcp_oos.c: Fixed bug #29080: Correctly handle remote side + overrunning our rcv_wnd in ooseq case. + + 2010-03-22: Simon Goldschmidt + * tcp.c: tcp_listen() did not copy the pcb's prio. + + 2010-03-19: Simon Goldschmidt + * snmp_msg.c: Fixed bug #29256: SNMP Trap address was not correctly set + + 2010-03-14: Simon Goldschmidt + * opt.h, etharp.h: Fixed bug #29148 (Incorrect PBUF_POOL_BUFSIZE for ports + where ETH_PAD_SIZE > 0) by moving definition of ETH_PAD_SIZE to opt.h + and basing PBUF_LINK_HLEN on it. + + 2010-03-08: Simon Goldschmidt + * netif.c, ipv4/ip.c: task #10241 (AutoIP: don't break existing connections + when assiging routable address): when checking incoming packets and + aborting existing connection on address change, filter out link-local + addresses. + + 2010-03-06: Simon Goldschmidt + * sockets.c: Fixed LWIP_NETIF_TX_SINGLE_PBUF for LWIP_TCPIP_CORE_LOCKING + + 2010-03-06: Simon Goldschmidt + * ipv4/ip.c: Don't try to forward link-local addresses + + 2010-03-06: Simon Goldschmidt + * etharp.c: Fixed bug #29087: etharp: don't send packets for LinkLocal- + addresses to gw + + 2010-03-05: Simon Goldschmidt + * dhcp.c: Fixed bug #29072: Correctly set ciaddr based on message-type + and state. + + 2010-03-05: Simon Goldschmidt + * api_msg.c: Correctly set TCP_WRITE_FLAG_MORE when netconn_write is split + into multiple calls to tcp_write. + + 2010-02-21: Simon Goldschmidt + * opt.h, mem.h, dns.c: task #10140: Remove DNS_USES_STATIC_BUF (keep + the implementation of DNS_USES_STATIC_BUF==1) + + 2010-02-20: Simon Goldschmidt + * tcp.h, tcp.c, tcp_in.c, tcp_out.c: Task #10088: Correctly implement + close() vs. shutdown(). Now the application does not get any more + recv callbacks after calling tcp_close(). Added tcp_shutdown(). + + 2010-02-19: Simon Goldschmidt + * mem.c/.h, pbuf.c: Renamed mem_realloc() to mem_trim() to prevent + confusion with realloc() + + 2010-02-15: Simon Goldschmidt/Stephane Lesage + * netif.c/.h: Link status does not depend on LWIP_NETIF_LINK_CALLBACK + (fixes bug #28899) + + 2010-02-14: Simon Goldschmidt + * netif.c: Fixed bug #28877 (Duplicate ARP gratuitous packet with + LWIP_NETIF_LINK_CALLBACK set on) by only sending if both link- and + admin-status of a netif are up + + 2010-02-14: Simon Goldschmidt + * opt.h: Disable ETHARP_TRUST_IP_MAC by default since it slows down packet + reception and is not really necessary + + 2010-02-14: Simon Goldschmidt + * etharp.c/.h: Fixed ARP input processing: only add a new entry if a + request was directed as us (RFC 826, Packet Reception), otherwise + only update existing entries; internalized some functions + + 2010-02-14: Simon Goldschmidt + * netif.h, etharp.c, tcpip.c: Fixed bug #28183 (ARP and TCP/IP cannot be + disabled on netif used for PPPoE) by adding a new netif flag + (NETIF_FLAG_ETHERNET) that tells the stack the device is an ethernet + device but prevents usage of ARP (so that ethernet_input can be used + for PPPoE). + + 2010-02-12: Simon Goldschmidt + * netif.c: netif_set_link_up/down: only do something if the link state + actually changes + + 2010-02-12: Simon Goldschmidt/Stephane Lesage + * api_msg.c: Fixed bug #28865 (Cannot close socket/netconn in non-blocking + connect) + + 2010-02-12: Simon Goldschmidt + * mem.h: Fixed bug #28866 (mem_realloc function defined in mem.h) + + 2010-02-09: Simon Goldschmidt + * api_lib.c, api_msg.c, sockets.c, api.h, api_msg.h: Fixed bug #22110 + (recv() makes receive window update for data that wasn't received by + application) + + 2010-02-09: Simon Goldschmidt/Stephane Lesage + * sockets.c: Fixed bug #28853 (lwip_recvfrom() returns 0 on receive time-out + or any netconn_recv() error) + + 2010-02-09: Simon Goldschmidt + * ppp.c: task #10154 (PPP: Update snmp in/out counters for tx/rx packets) + + 2010-02-09: Simon Goldschmidt + * netif.c: For loopback packets, adjust the stats- and snmp-counters + for the loopback netif. + + 2010-02-08: Simon Goldschmidt + * igmp.c/.h, ip.h: Moved most defines from igmp.h to igmp.c for clarity + since they are not used anywhere else. + + 2010-02-08: Simon Goldschmidt (Stéphane Lesage) + * igmp.c, igmp.h, stats.c, stats.h: Improved IGMP stats + (patch from bug #28798) + + 2010-02-08: Simon Goldschmidt (Stéphane Lesage) + * igmp.c: Fixed bug #28798 (Error in "Max Response Time" processing) and + another bug when LWIP_RAND() returns zero. + + 2010-02-04: Simon Goldschmidt + * nearly every file: Use macros defined in ip_addr.h (some of them new) + to work with IP addresses (preparation for bug #27352 - Change ip_addr + from struct to typedef (u32_t) - and better code). + + 2010-01-31: Simon Goldschmidt + * netif.c: Don't call the link-callback from netif_set_up/down() since + this invalidly retriggers DHCP. + + 2010-01-29: Simon Goldschmidt + * ip_addr.h, inet.h, def.h, inet.c, def.c, more: Cleanly separate the + portability file inet.h and its contents from the stack: moved htonX- + functions to def.h (and the new def.c - they are not ipv4 dependent), + let inet.h depend on ip_addr.h and not the other way round. + This fixes bug #28732. + + 2010-01-28: Kieran Mansley + * tcp.c: Ensure ssthresh >= 2*MSS + + 2010-01-27: Simon Goldschmidt + * tcp.h, tcp.c, tcp_in.c: Fixed bug #27871: Calling tcp_abort() in recv + callback can lead to accessing unallocated memory. As a consequence, + ERR_ABRT means the application has called tcp_abort()! + + 2010-01-25: Simon Goldschmidt + * snmp_structs.h, msg_in.c: Partly fixed bug #22070 (MIB_OBJECT_WRITE_ONLY + not implemented in SNMP): write-only or not-accessible are still + returned by getnext (though not by get) + + 2010-01-24: Simon Goldschmidt + * snmp: Renamed the private mib node from 'private' to 'mib_private' to + not use reserved C/C++ keywords + + 2010-01-23: Simon Goldschmidt + * sockets.c: Fixed bug #28716: select() returns 0 after waiting for less + than 1 ms + + 2010-01-21: Simon Goldschmidt + * tcp.c, api_msg.c: Fixed bug #28651 (tcp_connect: no callbacks called + if tcp_enqueue fails) both in raw- and netconn-API + + 2010-01-19: Simon Goldschmidt + * api_msg.c: Fixed bug #27316: netconn: Possible deadlock in err_tcp + + 2010-01-18: Iordan Neshev/Simon Goldschmidt + * src/netif/ppp: reorganised PPP sourcecode to 2.3.11 including some + bugfix backports from 2.4.x. + + 2010-01-18: Simon Goldschmidt + * mem.c: Fixed bug #28679: mem_realloc calculates mem_stats wrong + + 2010-01-17: Simon Goldschmidt + * api_lib.c, api_msg.c, (api_msg.h, api.h, sockets.c, tcpip.c): + task #10102: "netconn: clean up conn->err threading issues" by adding + error return value to struct api_msg_msg + + 2010-01-17: Simon Goldschmidt + * api.h, api_lib.c, sockets.c: Changed netconn_recv() and netconn_accept() + to return err_t (bugs #27709 and #28087) + + 2010-01-14: Simon Goldschmidt + * ...: Use typedef for function prototypes throughout the stack. + + 2010-01-13: Simon Goldschmidt + * api_msg.h/.c, api_lib.c: Fixed bug #26672 (close connection when receive + window = 0) by correctly draining recvmbox/acceptmbox + + 2010-01-11: Simon Goldschmidt + * pap.c: Fixed bug #13315 (PPP PAP authentication can result in + erroneous callbacks) by copying the code from recent pppd + + 2010-01-10: Simon Goldschmidt + * raw.c: Fixed bug #28506 (raw_bind should filter received packets) + + 2010-01-10: Simon Goldschmidt + * tcp.h/.c: bug #28127 (remove call to tcp_output() from tcp_ack(_now)()) + + 2010-01-08: Simon Goldschmidt + * sockets.c: Fixed bug #28519 (lwip_recvfrom bug with len > 65535) + + 2010-01-08: Simon Goldschmidt + * dns.c: Copy hostname for DNS_LOCAL_HOSTLIST_IS_DYNAMIC==1 since string + passed to dns_local_addhost() might be volatile + + 2010-01-07: Simon Goldschmidt + * timers.c, tcp.h: Call tcp_timer_needed() with NO_SYS==1, too + + 2010-01-06: Simon Goldschmidt + * netdb.h: Fixed bug #28496: missing include guards in netdb.h + + 2009-12-31: Simon Goldschmidt + * many ppp files: Reorganised PPP source code from ucip structure to pppd + structure to easily compare our code against the pppd code (around v2.3.1) + + 2009-12-27: Simon Goldschmidt + * tcp_in.c: Another fix for bug #28241 (ooseq processing) and adapted + unit test + + +(STABLE-1.3.2) + + ++ New features: + + 2009-10-27 Simon Goldschmidt/Stephan Lesage + * netifapi.c/.h: Added netifapi_netif_set_addr() + + 2009-10-07 Simon Goldschmidt/Fabian Koch + * api_msg.c, netbuf.c/.h, opt.h: patch #6888: Patch for UDP Netbufs to + support dest-addr and dest-port (optional: LWIP_NETBUF_RECVINFO) + + 2009-08-26 Simon Goldschmidt/Simon Kallweit + * slipif.c/.h: bug #26397: SLIP polling support + + 2009-08-25 Simon Goldschmidt + * opt.h, etharp.h/.c: task #9033: Support IEEE 802.1q tagged frame (VLAN), + New configuration options ETHARP_SUPPORT_VLAN and ETHARP_VLAN_CHECK. + + 2009-08-25 Simon Goldschmidt + * ip_addr.h, netdb.c: patch #6900: added define ip_ntoa(struct ip_addr*) + + 2009-08-24 Jakob Stoklund Olesen + * autoip.c, dhcp.c, netif.c: patch #6725: Teach AutoIP and DHCP to respond + to netif_set_link_up(). + + 2009-08-23 Simon Goldschmidt + * tcp.h/.c: Added function tcp_debug_state_str() to convert a tcp state + to a human-readable string. + + ++ Bugfixes: + + 2009-12-24: Kieran Mansley + * tcp_in.c Apply patches from Oleg Tyshev to improve OOS processing + (BUG#28241) + + 2009-12-06: Simon Goldschmidt + * ppp.h/.c: Fixed bug #27079 (Yet another leak in PPP): outpacket_buf can + be statically allocated (like in ucip) + + 2009-12-04: Simon Goldschmidt (patch by Ioardan Neshev) + * pap.c: patch #6969: PPP: missing PAP authentication UNTIMEOUT + + 2009-12-03: Simon Goldschmidt + * tcp.h, tcp_in.c, tcp_out.c: Fixed bug #28106: dup ack for fast retransmit + could have non-zero length + + 2009-12-02: Simon Goldschmidt + * tcp_in.c: Fixed bug #27904: TCP sends too many ACKs: delay resetting + tcp_input_pcb until after calling the pcb's callbacks + + 2009-11-29: Simon Goldschmidt + * tcp_in.c: Fixed bug #28054: Two segments with FIN flag on the out-of- + sequence queue, also fixed PBUF_POOL leak in the out-of-sequence code + + 2009-11-29: Simon Goldschmidt + * pbuf.c: Fixed bug #28064: pbuf_alloc(PBUF_POOL) is not thread-safe by + queueing a call into tcpip_thread to free ooseq-bufs if the pool is empty + + 2009-11-26: Simon Goldschmidt + * tcp.h: Fixed bug #28098: Nagle can prevent fast retransmit from sending + segment + + 2009-11-26: Simon Goldschmidt + * tcp.h, sockets.c: Fixed bug #28099: API required to disable Nagle + algorithm at PCB level + + 2009-11-22: Simon Goldschmidt + * tcp_out.c: Fixed bug #27905: FIN isn't combined with data on unsent + + 2009-11-22: Simon Goldschmidt (suggested by Bill Auerbach) + * tcp.c: tcp_alloc: prevent increasing stats.err for MEMP_TCP_PCB when + reusing time-wait pcb + + 2009-11-20: Simon Goldschmidt (patch by Albert Bartel) + * sockets.c: Fixed bug #28062: Data received directly after accepting + does not wake up select + + 2009-11-11: Simon Goldschmidt + * netdb.h: Fixed bug #27994: incorrect define for freeaddrinfo(addrinfo) + + 2009-10-30: Simon Goldschmidt + * opt.h: Increased default value for TCP_MSS to 536, updated default + value for TCP_WND to 4*TCP_MSS to keep delayed ACK working. + + 2009-10-28: Kieran Mansley + * tcp_in.c, tcp_out.c, tcp.h: re-work the fast retransmission code + to follow algorithm from TCP/IP Illustrated + + 2009-10-27: Kieran Mansley + * tcp_in.c: fix BUG#27445: grow cwnd with every duplicate ACK + + 2009-10-25: Simon Goldschmidt + * tcp.h: bug-fix in the TCP_EVENT_RECV macro (has to call tcp_recved if + pcb->recv is NULL to keep rcv_wnd correct) + + 2009-10-25: Simon Goldschmidt + * tcp_in.c: Fixed bug #26251: RST process in TIME_WAIT TCP state + + 2009-10-23: Simon Goldschmidt (David Empson) + * tcp.c: Fixed bug #27783: Silly window avoidance for small window sizes + + 2009-10-21: Simon Goldschmidt + * tcp_in.c: Fixed bug #27215: TCP sent() callback gives leading and + trailing 1 byte len (SYN/FIN) + + 2009-10-21: Simon Goldschmidt + * tcp_out.c: Fixed bug #27315: zero window probe and FIN + + 2009-10-19: Simon Goldschmidt + * dhcp.c/.h: Minor code simplification (don't store received pbuf, change + conditional code to assert where applicable), check pbuf length before + testing for valid reply + + 2009-10-19: Simon Goldschmidt + * dhcp.c: Removed most calls to udp_connect since they aren't necessary + when using udp_sendto_if() - always stay connected to IP_ADDR_ANY. + + 2009-10-16: Simon Goldschmidt + * ip.c: Fixed bug #27390: Source IP check in ip_input() causes it to drop + valid DHCP packets -> allow 0.0.0.0 as source address when LWIP_DHCP is + enabled + + 2009-10-15: Simon Goldschmidt (Oleg Tyshev) + * tcp_in.c: Fixed bug #27329: dupacks by unidirectional data transmit + + 2009-10-15: Simon Goldschmidt + * api_lib.c: Fixed bug #27709: conn->err race condition on netconn_recv() + timeout + + 2009-10-15: Simon Goldschmidt + * autoip.c: Fixed bug #27704: autoip starts with wrong address + LWIP_AUTOIP_CREATE_SEED_ADDR() returned address in host byte order instead + of network byte order + + 2009-10-11 Simon Goldschmidt (Jörg Kesten) + * tcp_out.c: Fixed bug #27504: tcp_enqueue wrongly concatenates segments + which are not consecutive when retransmitting unacked segments + + 2009-10-09 Simon Goldschmidt + * opt.h: Fixed default values of some stats to only be enabled if used + Fixes bug #27338: sys_stats is defined when NO_SYS = 1 + + 2009-08-30 Simon Goldschmidt + * ip.c: Fixed bug bug #27345: "ip_frag() does not use the LWIP_NETIF_LOOPBACK + function" by checking for loopback before calling ip_frag + + 2009-08-25 Simon Goldschmidt + * dhcp.c: fixed invalid dependency to etharp_query if DHCP_DOES_ARP_CHECK==0 + + 2009-08-23 Simon Goldschmidt + * ppp.c: bug #27078: Possible memory leak in pppInit() + + 2009-08-23 Simon Goldschmidt + * netdb.c, dns.c: bug #26657: DNS, if host name is "localhost", result + is error. + + 2009-08-23 Simon Goldschmidt + * opt.h, init.c: bug #26649: TCP fails when TCP_MSS > TCP_SND_BUF + Fixed wrong parenthesis, added check in init.c + + 2009-08-23 Simon Goldschmidt + * ppp.c: bug #27266: wait-state debug message in pppMain occurs every ms + + 2009-08-23 Simon Goldschmidt + * many ppp files: bug #27267: Added include to string.h where needed + + 2009-08-23 Simon Goldschmidt + * tcp.h: patch #6843: tcp.h macro optimization patch (for little endian) + + +(STABLE-1.3.1) + + ++ New features: + + 2009-05-10 Simon Goldschmidt + * opt.h, sockets.c, pbuf.c, netbuf.h, pbuf.h: task #7013: Added option + LWIP_NETIF_TX_SINGLE_PBUF to try to create transmit packets from only + one pbuf to help MACs that don't support scatter-gather DMA. + + 2009-05-09 Simon Goldschmidt + * icmp.h, icmp.c: Shrinked ICMP code, added option to NOT check icoming + ECHO pbuf for size (just use it): LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN + + 2009-05-05 Simon Goldschmidt, Jakob Stoklund Olesen + * ip.h, ip.c: Added ip_current_netif() & ip_current_header() to receive + extended info about the currently received packet. + + 2009-04-27 Simon Goldschmidt + * sys.h: Made SYS_LIGHTWEIGHT_PROT and sys_now() work with NO_SYS=1 + + 2009-04-25 Simon Goldschmidt + * mem.c, opt.h: Added option MEM_USE_POOLS_TRY_BIGGER_POOL to try the next + bigger malloc pool if one is empty (only usable with MEM_USE_POOLS). + + 2009-04-21 Simon Goldschmidt + * dns.c, init.c, dns.h, opt.h: task #7507, patch #6786: DNS supports static + hosts table. New configuration options DNS_LOCAL_HOSTLIST and + DNS_LOCAL_HOSTLIST_IS_DYNAMIC. Also, DNS_LOOKUP_LOCAL_EXTERN() can be defined + as an external function for lookup. + + 2009-04-15 Simon Goldschmidt + * dhcp.c: patch #6763: Global DHCP XID can be redefined to something more unique + + 2009-03-31 Kieran Mansley + * tcp.c, tcp_out.c, tcp_in.c, sys.h, tcp.h, opts.h: add support for + TCP timestamp options, off by default. Rework tcp_enqueue() to + take option flags rather than specified option data + + 2009-02-18 Simon Goldschmidt + * cc.h: Added printf formatter for size_t: SZT_F + + 2009-02-16 Simon Goldschmidt (patch by Rishi Khan) + * icmp.c, opt.h: patch #6539: (configurable) response to broadcast- and multicast + pings + + 2009-02-12 Simon Goldschmidt + * init.h: Added LWIP_VERSION to get the current version of the stack + + 2009-02-11 Simon Goldschmidt (suggested by Gottfried Spitaler) + * opt.h, memp.h/.c: added MEMP_MEM_MALLOC to use mem_malloc/mem_free instead + of the pool allocator (can save code size with MEM_LIBC_MALLOC if libc-malloc + is otherwise used) + + 2009-01-28 Jonathan Larmour (suggested by Bill Bauerbach) + * ipv4/inet_chksum.c, ipv4/lwip/inet_chksum.h: inet_chksum_pseudo_partial() + is only used by UDPLITE at present, so conditionalise it. + + 2008-12-03 Simon Goldschmidt (base on patch from Luca Ceresoli) + * autoip.c: checked in (slightly modified) patch #6683: Customizable AUTOIP + "seed" address. This should reduce AUTOIP conflicts if + LWIP_AUTOIP_CREATE_SEED_ADDR is overridden. + + 2008-10-02 Jonathan Larmour and Rishi Khan + * sockets.c (lwip_accept): Return EWOULDBLOCK if would block on non-blocking + socket. + + 2008-06-30 Simon Goldschmidt + * mem.c, opt.h, stats.h: fixed bug #21433: Calling mem_free/pbuf_free from + interrupt context isn't safe: LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT allows + mem_free to run between mem_malloc iterations. Added illegal counter for + mem stats. + + 2008-06-27 Simon Goldschmidt + * stats.h/.c, some other files: patch #6483: stats module improvement: + Added defines to display each module's statistic individually, added stats + defines for MEM, MEMP and SYS modules, removed (unused) rexmit counter. + + 2008-06-17 Simon Goldschmidt + * err.h: patch #6459: Made err_t overridable to use a more efficient type + (define LWIP_ERR_T in cc.h) + + 2008-06-17 Simon Goldschmidt + * slipif.c: patch #6480: Added a configuration option for slipif for symmetry + to loopif + + 2008-06-17 Simon Goldschmidt (patch by Luca Ceresoli) + * netif.c, loopif.c, ip.c, netif.h, loopif.h, opt.h: Checked in slightly + modified version of patch # 6370: Moved loopif code to netif.c so that + loopback traffic is supported on all netifs (all local IPs). + Added option to limit loopback packets for each netifs. + + + ++ Bugfixes: + 2009-08-12 Kieran Mansley + * tcp_in.c, tcp.c: Fix bug #27209: handle trimming of segments when + out of window or out of order properly + + 2009-08-12 Kieran Mansley + * tcp_in.c: Fix bug #27199: use snd_wl2 instead of snd_wl1 + + 2009-07-28 Simon Goldschmidt + * mem.h: Fixed bug #27105: "realloc() cannot replace mem_realloc()"s + + 2009-07-27 Kieran Mansley + * api.h api_msg.h netdb.h sockets.h: add missing #include directives + + 2009-07-09 Kieran Mansley + * api_msg.c, sockets.c, api.h: BUG23240 use signed counters for + recv_avail and don't increment counters until message successfully + sent to mbox + + 2009-06-25 Kieran Mansley + * api_msg.c api.h: BUG26722: initialise netconn write variables + in netconn_alloc + + 2009-06-25 Kieran Mansley + * tcp.h: BUG26879: set ret value in TCP_EVENT macros when function is not set + + 2009-06-25 Kieran Mansley + * tcp.c, tcp_in.c, tcp_out.c, tcp.h: BUG26301 and BUG26267: correct + simultaneous close behaviour, and make snd_nxt have the same meaning + as in the RFCs. + + 2009-05-12 Simon Goldschmidt + * etharp.h, etharp.c, netif.c: fixed bug #26507: "Gratuitous ARP depends on + arp_table / uses etharp_query" by adding etharp_gratuitous() + + 2009-05-12 Simon Goldschmidt + * ip.h, ip.c, igmp.c: bug #26487: Added ip_output_if_opt that can add IP options + to the IP header (used by igmp_ip_output_if) + + 2009-05-06 Simon Goldschmidt + * inet_chksum.c: On little endian architectures, use LWIP_PLATFORM_HTONS (if + defined) for SWAP_BYTES_IN_WORD to speed up checksumming. + + 2009-05-05 Simon Goldschmidt + * sockets.c: bug #26405: Prematurely released semaphore causes lwip_select() + to crash + + 2009-05-04 Simon Goldschmidt + * init.c: snmp was not initialized in lwip_init() + + 2009-05-04 Frédéric Bernon + * dhcp.c, netbios.c: Changes if IP_SOF_BROADCAST is enabled. + + 2009-05-03 Simon Goldschmidt + * tcp.h: bug #26349: Nagle algorithm doesn't send although segment is full + (and unsent->next == NULL) + + 2009-05-02 Simon Goldschmidt + * tcpip.h, tcpip.c: fixed tcpip_untimeout (does not need the time, broken after + 1.3.0 in CVS only) - fixes compilation of ppp_oe.c + + 2009-05-02 Simon Goldschmidt + * msg_in.c: fixed bug #25636: SNMPSET value is ignored for integer fields + + 2009-05-01 Simon Goldschmidt + * pap.c: bug #21680: PPP upap_rauthnak() drops legal NAK packets + + 2009-05-01 Simon Goldschmidt + * ppp.c: bug #24228: Memory corruption with PPP and DHCP + + 2009-04-29 Frédéric Bernon + * raw.c, udp.c, init.c, opt.h, ip.h, sockets.h: bug #26309: Implement the + SO(F)_BROADCAST filter for all API layers. Avoid the unindented reception + of broadcast packets even when this option wasn't set. Port maintainers + which want to enable this filter have to set IP_SOF_BROADCAST=1 in opt.h. + If you want this option also filter broadcast on recv operations, you also + have to set IP_SOF_BROADCAST_RECV=1 in opt.h. + + 2009-04-28 Simon Goldschmidt, Jakob Stoklund Olesen + * dhcp.c: patch #6721, bugs #25575, #25576: Some small fixes to DHCP and + DHCP/AUTOIP cooperation + + 2009-04-25 Simon Goldschmidt, Oleg Tyshev + * tcp_out.c: bug #24212: Deadlocked tcp_retransmit due to exceeded pcb->cwnd + Fixed by sorting the unsent and unacked queues (segments are inserted at the + right place in tcp_output and tcp_rexmit). + + 2009-04-25 Simon Goldschmidt + * memp.c, mem.c, memp.h, mem_std.h: bug #26213 "Problem with memory allocation + when debugging": memp_sizes contained the wrong sizes (including sanity + regions); memp pools for MEM_USE_POOLS were too small + + 2009-04-24 Simon Goldschmidt, Frédéric Bernon + * inet.c: patch #6765: Fix a small problem with the last changes (incorrect + behavior, with with ip address string not ended by a '\0', a space or a + end of line) + + 2009-04-19 Simon Goldschmidt + * rawapi.txt: Fixed bug #26069: Corrected documentation: if tcp_connect fails, + pcb->err is called, not pcb->connected (with an error code). + + 2009-04-19 Simon Goldschmidt + * tcp_out.c: Fixed bug #26236: "TCP options (timestamp) don't work with + no-copy-tcpwrite": deallocate option data, only concat segments with same flags + + 2009-04-19 Simon Goldschmidt + * tcp_out.c: Fixed bug #25094: "Zero-length pbuf" (options are now allocated + in the header pbuf, not the data pbuf) + + 2009-04-18 Simon Goldschmidt + * api_msg.c: fixed bug #25695: Segmentation fault in do_writemore() + + 2009-04-15 Simon Goldschmidt + * sockets.c: tried to fix bug #23559: lwip_recvfrom problem with tcp + + 2009-04-15 Simon Goldschmidt + * dhcp.c: task #9192: mem_free of dhcp->options_in and dhcp->msg_in + + 2009-04-15 Simon Goldschmidt + * ip.c, ip6.c, tcp_out.c, ip.h: patch #6808: Add a utility function + ip_hinted_output() (for smaller code mainly) + + 2009-04-15 Simon Goldschmidt + * inet.c: patch #6765: Supporting new line characters in inet_aton() + + 2009-04-15 Simon Goldschmidt + * dhcp.c: patch #6764: DHCP rebind and renew did not send hostnam option; + Converted constant OPTION_MAX_MSG_SIZE to netif->mtu, check if netif->mtu + is big enough in dhcp_start + + 2009-04-15 Simon Goldschmidt + * netbuf.c: bug #26027: netbuf_chain resulted in pbuf memory leak + + 2009-04-15 Simon Goldschmidt + * sockets.c, ppp.c: bug #25763: corrected 4 occurrences of SMEMCPY to MEMCPY + + 2009-04-15 Simon Goldschmidt + * sockets.c: bug #26121: set_errno can be overridden + + 2009-04-09 Kieran Mansley (patch from Luca Ceresoli ) + * init.c, opt.h: Patch#6774 TCP_QUEUE_OOSEQ breaks compilation when + LWIP_TCP==0 + + 2009-04-09 Kieran Mansley (patch from Roy Lee ) + * tcp.h: Patch#6802 Add do-while-clauses to those function like + macros in tcp.h + + 2009-03-31 Kieran Mansley + * tcp.c, tcp_in.c, tcp_out.c, tcp.h, opt.h: Rework the way window + updates are calculated and sent (BUG20515) + + * tcp_in.c: cope with SYN packets received during established states, + and retransmission of initial SYN. + + * tcp_out.c: set push bit correctly when tcp segments are merged + + 2009-03-27 Kieran Mansley + * tcp_out.c set window correctly on probes (correcting change made + yesterday) + + 2009-03-26 Kieran Mansley + * tcp.c, tcp_in.c, tcp.h: add tcp_abandon() to cope with dropping + connections where no reset required (bug #25622) + + * tcp_out.c: set TCP_ACK flag on keepalive and zero window probes + (bug #20779) + + 2009-02-18 Simon Goldschmidt (Jonathan Larmour and Bill Auerbach) + * ip_frag.c: patch #6528: the buffer used for IP_FRAG_USES_STATIC_BUF could be + too small depending on MEM_ALIGNMENT + + 2009-02-16 Simon Goldschmidt + * sockets.h/.c, api_*.h/.c: fixed arguments of socket functions to match the standard; + converted size argument of netconn_write to 'size_t' + + 2009-02-16 Simon Goldschmidt + * tcp.h, tcp.c: fixed bug #24440: TCP connection close problem on 64-bit host + by moving accept callback function pointer to TCP_PCB_COMMON + + 2009-02-12 Simon Goldschmidt + * dhcp.c: fixed bug #25345 (DHCPDECLINE is sent with "Maximum message size" + option) + + 2009-02-11 Simon Goldschmidt + * dhcp.c: fixed bug #24480 (releasing old udp_pdb and pbuf in dhcp_start) + + 2009-02-11 Simon Goldschmidt + * opt.h, api_msg.c: added configurable default valud for netconn->recv_bufsize: + RECV_BUFSIZE_DEFAULT (fixes bug #23726: pbuf pool exhaustion on slow recv()) + + 2009-02-10 Simon Goldschmidt + * tcp.c: fixed bug #25467: Listen backlog is not reset on timeout in SYN_RCVD: + Accepts_pending is decrease on a corresponding listen pcb when a connection + in state SYN_RCVD is close. + + 2009-01-28 Jonathan Larmour + * pbuf.c: reclaim pbufs from TCP out-of-sequence segments if we run + out of pool pbufs. + + 2008-12-19 Simon Goldschmidt + * many files: patch #6699: fixed some warnings on platform where sizeof(int) == 2 + + 2008-12-10 Tamas Somogyi, Frédéric Bernon + * sockets.c: fixed bug #25051: lwip_recvfrom problem with udp: fromaddr and + port uses deleted netbuf. + + 2008-10-18 Simon Goldschmidt + * tcp_in.c: fixed bug ##24596: Vulnerability on faulty TCP options length + in tcp_parseopt + + 2008-10-15 Simon Goldschmidt + * ip_frag.c: fixed bug #24517: IP reassembly crashes on unaligned IP headers + by packing the struct ip_reass_helper. + + 2008-10-03 David Woodhouse, Jonathan Larmour + * etharp.c (etharp_arp_input): Fix type aliasing problem copying ip address. + + 2008-10-02 Jonathan Larmour + * dns.c: Hard-code structure sizes, to avoid issues on some compilers where + padding is included. + + 2008-09-30 Jonathan Larmour + * sockets.c (lwip_accept): check addr isn't NULL. If it's valid, do an + assertion check that addrlen isn't NULL. + + 2008-09-30 Jonathan Larmour + * tcp.c: Fix bug #24227, wrong error message in tcp_bind. + + 2008-08-26 Simon Goldschmidt + * inet.h, ip_addr.h: fixed bug #24132: Cross-dependency between ip_addr.h and + inet.h -> moved declaration of struct in_addr from ip_addr.h to inet.h + + 2008-08-14 Simon Goldschmidt + * api_msg.c: fixed bug #23847: do_close_internal references freed memory (when + tcp_close returns != ERR_OK) + + 2008-07-08 Frédéric Bernon + * stats.h: Fix some build bugs introduced with patch #6483 (missing some parameters + in macros, mainly if MEM_STATS=0 and MEMP_STATS=0). + + 2008-06-24 Jonathan Larmour + * tcp_in.c: Fix for bug #23693 as suggested by Art R. Ensure cseg is unused + if tcp_seg_copy fails. + + 2008-06-17 Simon Goldschmidt + * inet_chksum.c: Checked in some ideas of patch #6460 (loop optimizations) + and created defines for swapping bytes and folding u32 to u16. + + 2008-05-30 Kieran Mansley + * tcp_in.c Remove redundant "if" statement, and use real rcv_wnd + rather than rcv_ann_wnd when deciding if packets are in-window. + Contributed by + + 2008-05-30 Kieran Mansley + * mem.h: Fix BUG#23254. Change macro definition of mem_* to allow + passing as function pointers when MEM_LIBC_MALLOC is defined. + + 2008-05-09 Jonathan Larmour + * err.h, err.c, sockets.c: Fix bug #23119: Reorder timeout error code to + stop it being treated as a fatal error. + + 2008-04-15 Simon Goldschmidt + * dhcp.c: fixed bug #22804: dhcp_stop doesn't clear NETIF_FLAG_DHCP + (flag now cleared) + + 2008-03-27 Simon Goldschmidt + * mem.c, tcpip.c, tcpip.h, opt.h: fixed bug #21433 (Calling mem_free/pbuf_free + from interrupt context isn't safe): set LWIP_USE_HEAP_FROM_INTERRUPT to 1 + in lwipopts.h or use pbuf_free_callback(p)/mem_free_callback(m) to free pbufs + or heap memory from interrupt context + + 2008-03-26 Simon Goldschmidt + * tcp_in.c, tcp.c: fixed bug #22249: division by zero could occur if a remote + host sent a zero mss as TCP option. + + +(STABLE-1.3.0) + + ++ New features: + + 2008-03-10 Jonathan Larmour + * inet_chksum.c: Allow choice of one of the sample algorithms to be + made from lwipopts.h. Fix comment on how to override LWIP_CHKSUM. + + 2008-01-22 Frédéric Bernon + * tcp.c, tcp_in.c, tcp.h, opt.h: Rename LWIP_CALCULATE_EFF_SEND_MSS in + TCP_CALCULATE_EFF_SEND_MSS to have coherent TCP options names. + + 2008-01-14 Frédéric Bernon + * rawapi.txt, api_msg.c, tcp.c, tcp_in.c, tcp.h: changes for task #7675 "Enable + to refuse data on a TCP_EVENT_RECV call". Important, behavior changes for the + tcp_recv callback (see rawapi.txt). + + 2008-01-14 Frédéric Bernon, Marc Chaland + * ip.c: Integrate patch #6369" ip_input : checking before realloc". + + 2008-01-12 Frédéric Bernon + * tcpip.h, tcpip.c, api.h, api_lib.c, api_msg.c, sockets.c: replace the field + netconn::sem per netconn::op_completed like suggested for the task #7490 + "Add return value to sys_mbox_post". + + 2008-01-12 Frédéric Bernon + * api_msg.c, opt.h: replace DEFAULT_RECVMBOX_SIZE per DEFAULT_TCP_RECVMBOX_SIZE, + DEFAULT_UDP_RECVMBOX_SIZE and DEFAULT_RAW_RECVMBOX_SIZE (to optimize queues + sizes), like suggested for the task #7490 "Add return value to sys_mbox_post". + + 2008-01-10 Frédéric Bernon + * tcpip.h, tcpip.c: add tcpip_callback_with_block function for the task #7490 + "Add return value to sys_mbox_post". tcpip_callback is always defined as + "blocking" ("block" parameter = 1). + + 2008-01-10 Frédéric Bernon + * tcpip.h, tcpip.c, api.h, api_lib.c, api_msg.c, sockets.c: replace the field + netconn::mbox (sys_mbox_t) per netconn::sem (sys_sem_t) for the task #7490 + "Add return value to sys_mbox_post". + + 2008-01-05 Frédéric Bernon + * sys_arch.txt, api.h, api_lib.c, api_msg.h, api_msg.c, tcpip.c, sys.h, opt.h: + Introduce changes for task #7490 "Add return value to sys_mbox_post" with some + modifications in the sys_mbox api: sys_mbox_new take a "size" parameters which + indicate the number of pointers query by the mailbox. There is three defines + in opt.h to indicate sizes for tcpip::mbox, netconn::recvmbox, and for the + netconn::acceptmbox. Port maintainers, you can decide to just add this new + parameter in your implementation, but to ignore it to keep the previous behavior. + The new sys_mbox_trypost function return a value to know if the mailbox is + full or if the message is posted. Take a look to sys_arch.txt for more details. + This new function is used in tcpip_input (so, can be called in an interrupt + context since the function is not blocking), and in recv_udp and recv_raw. + + 2008-01-04 Frédéric Bernon, Simon Goldschmidt, Jonathan Larmour + * rawapi.txt, api.h, api_lib.c, api_msg.h, api_msg.c, sockets.c, tcp.h, tcp.c, + tcp_in.c, init.c, opt.h: rename backlog options with TCP_ prefix, limit the + "backlog" parameter in an u8_t, 0 is interpreted as "smallest queue", add + documentation in the rawapi.txt file. + + 2007-12-31 Kieran Mansley (based on patch from Per-Henrik Lundbolm) + * tcp.c, tcp_in.c, tcp_out.c, tcp.h: Add TCP persist timer + + 2007-12-31 Frédéric Bernon, Luca Ceresoli + * autoip.c, etharp.c: ip_addr.h: Integrate patch #6348: "Broadcast ARP packets + in autoip". The change in etharp_raw could be removed, since all calls to + etharp_raw use ethbroadcast for the "ethdst_addr" parameter. But it could be + wrong in the future. + + 2007-12-30 Frédéric Bernon, Tom Evans + * ip.c: Fix bug #21846 "LwIP doesn't appear to perform any IP Source Address + Filtering" reported by Tom Evans. + + 2007-12-21 Frédéric Bernon, Simon Goldschmidt, Jonathan Larmour + * tcp.h, opt.h, api.h, api_msg.h, tcp.c, tcp_in.c, api_lib.c, api_msg.c, + sockets.c, init.c: task #7252: Implement TCP listen backlog: Warning: raw API + applications have to call 'tcp_accepted(pcb)' in their accept callback to + keep accepting new connections. + + 2007-12-13 Frédéric Bernon + * api_msg.c, err.h, err.c, sockets.c, dns.c, dns.h: replace "enum dns_result" + by err_t type. Add a new err_t code "ERR_INPROGRESS". + + 2007-12-12 Frédéric Bernon + * dns.h, dns.c, opt.h: move DNS options to the "right" place. Most visibles + are the one which have ram usage. + + 2007-12-05 Frédéric Bernon + * netdb.c: add a LWIP_DNS_API_HOSTENT_STORAGE option to decide to use a static + set of variables (=0) or a local one (=1). In this last case, your port should + provide a function "struct hostent* sys_thread_hostent( struct hostent* h)" + which have to do a copy of "h" and return a pointer ont the "per-thread" copy. + + 2007-12-03 Simon Goldschmidt + * ip.c: ip_input: check if a packet is for inp first before checking all other + netifs on netif_list (speeds up packet receiving in most cases) + + 2007-11-30 Simon Goldschmidt + * udp.c, raw.c: task #7497: Sort lists (pcb, netif, ...) for faster access + UDP: move a (connected) pcb selected for input to the front of the list of + pcbs so that it is found faster next time. Same for RAW pcbs that have eaten + a packet. + + 2007-11-28 Simon Goldschmidt + * etharp.c, stats.c, stats.h, opt.h: Introduced ETHARP_STATS + + 2007-11-25 Simon Goldschmidt + * dhcp.c: dhcp_unfold_reply() uses pbuf_copy_partial instead of its own copy + algorithm. + + 2007-11-24 Simon Goldschmidt + * netdb.h, netdb.c, sockets.h/.c: Moved lwip_gethostbyname from sockets.c + to the new file netdb.c; included lwip_getaddrinfo. + + 2007-11-21 Simon Goldschmidt + * tcp.h, opt.h, tcp.c, tcp_in.c: implemented calculating the effective send-mss + based on the MTU of the netif used to send. Enabled by default. Disable by + setting LWIP_CALCULATE_EFF_SEND_MSS to 0. This fixes bug #21492. + + 2007-11-19 Frédéric Bernon + * api_msg.c, dns.h, dns.c: Implement DNS_DOES_NAME_CHECK option (check if name + received match the name query), implement DNS_USES_STATIC_BUF (the place where + copy dns payload to parse the response), return an error if there is no place + for a new query, and fix some minor problems. + + 2007-11-16 Simon Goldschmidt + * new files: ipv4/inet.c, ipv4/inet_chksum.c, ipv6/inet6.c + removed files: core/inet.c, core/inet6.c + Moved inet files into ipv4/ipv6 directory; splitted inet.c/inet.h into + inet and chksum part; changed includes in all lwIP files as appropriate + + 2007-11-16 Simon Goldschmidt + * api.h, api_msg.h, api_lib.c, api_msg.c, socket.h, socket.c: Added sequential + dns resolver function for netconn api (netconn_gethostbyname) and socket api + (gethostbyname/gethostbyname_r). + + 2007-11-15 Jim Pettinato, Frédéric Bernon + * opt.h, init.c, tcpip.c, dhcp.c, dns.h, dns.c: add DNS client for simple name + requests with RAW api interface. Initialization is done in lwip_init() with + build time options. DNS timer is added in tcpip_thread context. DHCP can set + DNS server ip addresses when options are received. You need to set LWIP_DNS=1 + in your lwipopts.h file (LWIP_DNS=0 in opt.h). DNS_DEBUG can be set to get + some traces with LWIP_DEBUGF. Sanity check have been added. There is a "todo" + list with points to improve. + + 2007-11-06 Simon Goldschmidt + * opt.h, mib2.c: Patch #6215: added ifAdminStatus write support (if explicitly + enabled by defining SNMP_SAFE_REQUESTS to 0); added code to check link status + for ifOperStatus if LWIP_NETIF_LINK_CALLBACK is defined. + + 2007-11-06 Simon Goldschmidt + * api.h, api_msg.h and dependent files: Task #7410: Removed the need to include + core header files in api.h (ip/tcp/udp/raw.h) to hide the internal + implementation from netconn api applications. + + 2007-11-03 Frédéric Bernon + * api.h, api_lib.c, api_msg.c, sockets.c, opt.h: add SO_RCVBUF option for UDP & + RAW netconn. You need to set LWIP_SO_RCVBUF=1 in your lwipopts.h (it's disabled + by default). Netconn API users can use the netconn_recv_bufsize macro to access + it. This is a first release which have to be improve for TCP. Note it used the + netconn::recv_avail which need to be more "thread-safe" (note there is already + the problem for FIONREAD with lwip_ioctl/ioctlsocket). + + 2007-11-01 Frédéric Bernon, Marc Chaland + * sockets.h, sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c, tcp.h, tcp_out.c: + Integrate "patch #6250 : MSG_MORE flag for send". MSG_MORE is used at socket api + layer, NETCONN_MORE at netconn api layer, and TCP_WRITE_FLAG_MORE at raw api + layer. This option enable to delayed TCP PUSH flag on multiple "write" calls. + Note that previous "copy" parameter for "write" APIs is now called "apiflags". + + 2007-10-24 Frédéric Bernon + * api.h, api_lib.c, api_msg.c: Add macro API_EVENT in the same spirit than + TCP_EVENT_xxx macros to get a code more readable. It could also help to remove + some code (like we have talk in "patch #5919 : Create compile switch to remove + select code"), but it could be done later. + + 2007-10-08 Simon Goldschmidt + * many files: Changed initialization: many init functions are not needed any + more since we now rely on the compiler initializing global and static + variables to zero! + + 2007-10-06 Simon Goldschmidt + * ip_frag.c, memp.c, mib2.c, ip_frag.h, memp_std.h, opt.h: Changed IP_REASSEMBLY + to enqueue the received pbufs so that multiple packets can be reassembled + simultaneously and no static reassembly buffer is needed. + + 2007-10-05 Simon Goldschmidt + * tcpip.c, etharp.h, etharp.c: moved ethernet_input from tcpip.c to etharp.c so + all netifs (or ports) can use it. + + 2007-10-05 Frédéric Bernon + * netifapi.h, netifapi.c: add function netifapi_netif_set_default. Change the + common function to reduce a little bit the footprint (for all functions using + only the "netif" parameter). + + 2007-10-03 Frédéric Bernon + * netifapi.h, netifapi.c: add functions netifapi_netif_set_up, netifapi_netif_set_down, + netifapi_autoip_start and netifapi_autoip_stop. Use a common function to reduce + a little bit the footprint (for all functions using only the "netif" parameter). + + 2007-09-15 Frédéric Bernon + * udp.h, udp.c, sockets.c: Changes for "#20503 IGMP Improvement". Add IP_MULTICAST_IF + option in socket API, and a new field "multicast_ip" in "struct udp_pcb" (for + netconn and raw API users), only if LWIP_IGMP=1. Add getsockopt processing for + IP_MULTICAST_TTL and IP_MULTICAST_IF. + + 2007-09-10 Frédéric Bernon + * snmp.h, mib2.c: enable to remove SNMP timer (which consumne several cycles + even when it's not necessary). snmp_agent.txt tell to call snmp_inc_sysuptime() + each 10ms (but, it's intrusive if you use sys_timeout feature). Now, you can + decide to call snmp_add_sysuptime(100) each 1000ms (which is bigger "step", but + call to a lower frequency). Or, you can decide to not call snmp_inc_sysuptime() + or snmp_add_sysuptime(), and to define the SNMP_GET_SYSUPTIME(sysuptime) macro. + This one is undefined by default in mib2.c. SNMP_GET_SYSUPTIME is called inside + snmp_get_sysuptime(u32_t *value), and enable to change "sysuptime" value only + when it's queried (any direct call to "sysuptime" is changed by a call to + snmp_get_sysuptime). + + 2007-09-09 Frédéric Bernon, Bill Florac + * igmp.h, igmp.c, netif.h, netif.c, ip.c: To enable to have interfaces with IGMP, + and others without it, there is a new NETIF_FLAG_IGMP flag to set in netif->flags + if you want IGMP on an interface. igmp_stop() is now called inside netif_remove(). + igmp_report_groups() is now called inside netif_set_link_up() (need to have + LWIP_NETIF_LINK_CALLBACK=1) to resend reports once the link is up (avoid to wait + the next query message to receive the matching multicast streams). + + 2007-09-08 Frédéric Bernon + * sockets.c, ip.h, api.h, tcp.h: declare a "struct ip_pcb" which only contains + IP_PCB. Add in the netconn's "pcb" union a "struct ip_pcb *ip;" (no size change). + Use this new field to access to common pcb fields (ttl, tos, so_options, etc...). + Enable to access to these fields with LWIP_TCP=0. + + 2007-09-05 Frédéric Bernon + * udp.c, ipv4/icmp.c, ipv4/ip.c, ipv6/icmp.c, ipv6/ip6.c, ipv4/icmp.h, + ipv6/icmp.h, opt.h: Integrate "task #7272 : LWIP_ICMP option". The new option + LWIP_ICMP enable/disable ICMP module inside the IP stack (enable per default). + Be careful, disabling ICMP make your product non-compliant to RFC1122, but + help to reduce footprint, and to reduce "visibility" on the Internet. + + 2007-09-05 Frédéric Bernon, Bill Florac + * opt.h, sys.h, tcpip.c, slipif.c, ppp.c, sys_arch.txt: Change parameters list + for sys_thread_new (see "task #7252 : Create sys_thread_new_ex()"). Two new + parameters have to be provided: a task name, and a task stack size. For this + one, since it's platform dependant, you could define the best one for you in + your lwipopts.h. For port maintainers, you can just add these new parameters + in your sys_arch.c file, and but it's not mandatory, use them in your OS + specific functions. + + 2007-09-05 Frédéric Bernon + * inet.c, autoip.c, msg_in.c, msg_out.c, init.c: Move some build time checkings + inside init.c for task #7142 "Sanity check user-configurable values". + + 2007-09-04 Frédéric Bernon, Bill Florac + * igmp.h, igmp.c, memp_std.h, memp.c, init.c, opt.h: Replace mem_malloc call by + memp_malloc, and use a new MEMP_NUM_IGMP_GROUP option (see opt.h to define the + value). It will avoid potential fragmentation problems, use a counter to know + how many times a group is used on an netif, and free it when all applications + leave it. MEMP_NUM_IGMP_GROUP got 8 as default value (and init.c got a sanity + check if LWIP_IGMP!=0). + + 2007-09-03 Frédéric Bernon + * igmp.h, igmp.c, sockets.c, api_msg.c: Changes for "#20503 IGMP Improvement". + Initialize igmp_mac_filter to NULL in netif_add (this field should be set in + the netif's "init" function). Use the "imr_interface" field (for socket layer) + and/or the "interface" field (for netconn layer), for join/leave operations. + The igmp_join/leavegroup first parameter change from a netif to an ipaddr. + This field could be a netif's ipaddr, or "any" (same meaning than ip_addr_isany). + + 2007-08-30 Frédéric Bernon + * Add netbuf.h, netbuf.c, Change api.h, api_lib.c: #7249 "Split netbuf functions + from api/api_lib". Now netbuf API is independant of netconn, and can be used + with other API (application based on raw API, or future "socket2" API). Ports + maintainers just have to add src/api/netbuf.c in their makefile/projects. + + 2007-08-30 Frédéric Bernon, Jonathan Larmour + * init.c: Add first version of lwip_sanity_check for task #7142 "Sanity check + user-configurable values". + + 2007-08-29 Frédéric Bernon + * igmp.h, igmp.c, tcpip.c, init.c, netif.c: change igmp_init and add igmp_start. + igmp_start is call inside netif_add. Now, igmp initialization is in the same + spirit than the others modules. Modify some IGMP debug traces. + + 2007-08-29 Frédéric Bernon + * Add init.h, init.c, Change opt.h, tcpip.c: Task #7213 "Add a lwip_init function" + Add lwip_init function to regroup all modules initializations, and to provide + a place to add code for task #7142 "Sanity check user-configurable values". + Ports maintainers should remove direct initializations calls from their code, + and add init.c in their makefiles. Note that lwip_init() function is called + inside tcpip_init, but can also be used by raw api users since all calls are + disabled when matching options are disabled. Also note that their is new options + in opt.h, you should configure in your lwipopts.h (they are enabled per default). + + 2007-08-26 Marc Boucher + * api_msg.c: do_close_internal(): Reset the callbacks and arg (conn) to NULL + since they can under certain circumstances be called with an invalid conn + pointer after the connection has been closed (and conn has been freed). + + 2007-08-25 Frédéric Bernon (Artem Migaev's Patch) + * netif.h, netif.c: Integrate "patch #6163 : Function to check if link layer is up". + Add a netif_is_link_up() function if LWIP_NETIF_LINK_CALLBACK option is set. + + 2007-08-22 Frédéric Bernon + * netif.h, netif.c, opt.h: Rename LWIP_NETIF_CALLBACK in LWIP_NETIF_STATUS_CALLBACK + to be coherent with new LWIP_NETIF_LINK_CALLBACK option before next release. + + 2007-08-22 Frédéric Bernon + * tcpip.h, tcpip.c, ethernetif.c, opt.h: remove options ETHARP_TCPIP_INPUT & + ETHARP_TCPIP_ETHINPUT, now, only "ethinput" code is supported, even if the + name is tcpip_input (we keep the name of 1.2.0 function). + + 2007-08-17 Jared Grubb + * memp_std.h, memp.h, memp.c, mem.c, stats.c: (Task #7136) Centralize mempool + settings into new memp_std.h and optional user file lwippools.h. This adds + more dynamic mempools, and allows the user to create an arbitrary number of + mempools for mem_malloc. + + 2007-08-16 Marc Boucher + * api_msg.c: Initialize newconn->state to NETCONN_NONE in accept_function; + otherwise it was left to NETCONN_CLOSE and sent_tcp() could prematurely + close the connection. + + 2007-08-16 Marc Boucher + * sockets.c: lwip_accept(): check netconn_peer() error return. + + 2007-08-16 Marc Boucher + * mem.c, mem.h: Added mem_calloc(). + + 2007-08-16 Marc Boucher + * tcpip.c, tcpip.h memp.c, memp.h: Added distinct memp (MEMP_TCPIP_MSG_INPKT) + for input packets to prevent floods from consuming all of MEMP_TCPIP_MSG + and starving other message types. + Renamed MEMP_TCPIP_MSG to MEMP_TCPIP_MSG_API + + 2007-08-16 Marc Boucher + * pbuf.c, pbuf.h, etharp.c, tcp_in.c, sockets.c: Split pbuf flags in pbuf + type and flgs (later renamed to flags). + Use enum pbuf_flag as pbuf_type. Renumber PBUF_FLAG_*. + Improved lwip_recvfrom(). TCP push now propagated. + + 2007-08-16 Marc Boucher + * ethernetif.c, contrib/ports/various: ethbroadcast now a shared global + provided by etharp. + + 2007-08-16 Marc Boucher + * ppp_oe.c ppp_oe.h, auth.c chap.c fsm.c lcp.c ppp.c ppp.h, + etharp.c ethernetif.c, etharp.h, opt.h tcpip.h, tcpip.c: + Added PPPoE support and various PPP improvements. + + 2007-07-25 Simon Goldschmidt + * api_lib.c, ip_frag.c, pbuf.c, api.h, pbuf.h: Introduced pbuf_copy_partial, + making netbuf_copy_partial use this function. + + 2007-07-25 Simon Goldschmidt + * tcp_in.c: Fix bug #20506: Slow start / initial congestion window starts with + 2 * mss (instead of 1 * mss previously) to comply with some newer RFCs and + other stacks. + + 2007-07-13 Jared Grubb (integrated by Frédéric Bernon) + * opt.h, netif.h, netif.c, ethernetif.c: Add new configuration option to add + a link callback in the netif struct, and functions to handle it. Be carefull + for port maintainers to add the NETIF_FLAG_LINK_UP flag (like in ethernetif.c) + if you want to be sure to be compatible with future changes... + + 2007-06-30 Frédéric Bernon + * sockets.h, sockets.c: Implement MSG_PEEK flag for recv/recvfrom functions. + + 2007-06-21 Simon Goldschmidt + * etharp.h, etharp.c: Combined etharp_request with etharp_raw for both + LWIP_AUTOIP =0 and =1 to remove redundant code. + + 2007-06-21 Simon Goldschmidt + * mem.c, memp.c, mem.h, memp.h, opt.h: task #6863: Introduced the option + MEM_USE_POOLS to use 4 pools with different sized elements instead of a + heap. This both prevents memory fragmentation and gives a higher speed + at the cost of more memory consumption. Turned off by default. + + 2007-06-21 Simon Goldschmidt + * api_lib.c, api_msg.c, api.h, api_msg.h: Converted the length argument of + netconn_write (and therefore also api_msg_msg.msg.w.len) from u16_t into + int to be able to send a bigger buffer than 64K with one time (mainly + used from lwip_send). + + 2007-06-21 Simon Goldschmidt + * tcp.h, api_msg.c: Moved the nagle algorithm from netconn_write/do_write + into a define (tcp_output_nagle) in tcp.h to provide it to raw api users, too. + + 2007-06-21 Simon Goldschmidt + * api.h, api_lib.c, api_msg.c: Fixed bug #20021: Moved sendbuf-processing in + netconn_write from api_lib.c to api_msg.c to also prevent multiple context- + changes on low memory or empty send-buffer. + + 2007-06-18 Simon Goldschmidt + * etharp.c, etharp.h: Changed etharp to use a defined hardware address length + of 6 to avoid loading netif->hwaddr_len every time (since this file is only + used for ethernet and struct eth_addr already had a defined length of 6). + + 2007-06-17 Simon Goldschmidt + * sockets.c, sockets.h: Implemented socket options SO_NO_CHECK for UDP sockets + to disable UDP checksum generation on transmit. + + 2007-06-13 Frédéric Bernon, Simon Goldschmidt + * debug.h, api_msg.c: change LWIP_ERROR to use it to check errors like invalid + pointers or parameters, and let the possibility to redefined it in cc.h. Use + this macro to check "conn" parameter in api_msg.c functions. + + 2007-06-11 Simon Goldschmidt + * sockets.c, sockets.h: Added UDP lite support for sockets + + 2007-06-10 Simon Goldschmidt + * udp.h, opt.h, api_msg.c, ip.c, udp.c: Included switch LWIP_UDPLITE (enabled + by default) to switch off UDP-Lite support if not needed (reduces udp.c code + size) + + 2007-06-09 Dominik Spies (integrated by Frédéric Bernon) + * autoip.h, autoip.c, dhcp.h, dhcp.c, netif.h, netif.c, etharp.h, etharp.c, opt.h: + AutoIP implementation available for IPv4, with new options LWIP_AUTOIP and + LWIP_DHCP_AUTOIP_COOP if you want to cooperate with DHCP. Some tips to adapt + (see TODO mark in the source code). + + 2007-06-09 Simon Goldschmidt + * etharp.h, etharp.c, ethernetif.c: Modified order of parameters for + etharp_output() to match netif->output so etharp_output() can be used + directly as netif->output to save one function call. + + 2007-06-08 Simon Goldschmidt + * netif.h, ethernetif.c, slipif.c, loopif.c: Added define + NETIF_INIT_SNMP(netif, type, speed) to initialize per-netif snmp variables, + added initialization of those to ethernetif, slipif and loopif. + + 2007-05-18 Simon Goldschmidt + * opt.h, ip_frag.c, ip_frag.h, ip.c: Added option IP_FRAG_USES_STATIC_BUF + (defaulting to off for now) that can be set to 0 to send fragmented + packets by passing PBUF_REFs down the stack. + + 2007-05-23 Frédéric Bernon + * api_lib.c: Implement SO_RCVTIMEO for accept and recv on TCP + connections, such present in patch #5959. + + 2007-05-23 Frédéric Bernon + * api.h, api_lib.c, api_msg.c, sockets.c: group the different NETCONN_UDPxxx + code in only one part... + + 2007-05-18 Simon Goldschmidt + * opt.h, memp.h, memp.c: Added option MEMP_OVERFLOW_CHECK to check for memp + elements to overflow. This is achieved by adding some bytes before and after + each pool element (increasing their size, of course), filling them with a + prominent value and checking them on freeing the element. + Set it to 2 to also check every element in every pool each time memp_malloc() + or memp_free() is called (slower but more helpful). + + 2007-05-10 Simon Goldschmidt + * opt.h, memp.h, memp.c, pbuf.c (see task #6831): use a new memp pool for + PBUF_POOL pbufs instead of the old pool implementation in pbuf.c to reduce + code size. + + 2007-05-11 Frédéric Bernon + * sockets.c, api_lib.c, api_msg.h, api_msg.c, netifapi.h, netifapi.c, tcpip.c: + Include a function pointer instead of a table index in the message to reduce + footprint. Disable some part of lwip_send and lwip_sendto if some options are + not set (LWIP_TCP, LWIP_UDP, LWIP_RAW). + + 2007-05-10 Simon Goldschmidt + * *.h (except netif/ppp/*.h): Included patch #5448: include '#ifdef __cplusplus + \ extern "C" {' in all header files. Now you can write your application using + the lwIP stack in C++ and simply #include the core files. Note I have left + out the netif/ppp/*h header files for now, since I don't know which files are + included by applications and which are for internal use only. + + 2007-05-09 Simon Goldschmidt + * opt.h, *.c/*.h: Included patch #5920: Create define to override C-library + memcpy. 2 Defines are created: MEMCPY() for normal memcpy, SMEMCPY() for + situations where some compilers might inline the copy and save a function + call. Also replaced all calls to memcpy() with calls to (S)MEMCPY(). + + 2007-05-08 Simon Goldschmidt + * mem.h: If MEM_LIBC_MALLOC==1, allow the defines (e.g. mem_malloc() -> malloc()) + to be overriden in case the C-library malloc implementation is not protected + against concurrent access. + + 2007-05-04 Simon Goldschmidt (Atte Kojo) + * etharp.c: Introduced fast one-entry-cache to speed up ARP lookup when sending + multiple packets to the same host. + + 2007-05-04 Frédéric Bernon, Jonathan Larmour + * sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c: Fix bug #19162 "lwip_sento: a possible + to corrupt remote addr/port connection state". Reduce problems "not enought memory" with + netbuf (if we receive lot of datagrams). Improve lwip_sendto (only one exchange between + sockets api and api_msg which run in tcpip_thread context). Add netconn_sento function. + Warning, if you directly access to "fromaddr" & "fromport" field from netbuf struct, + these fields are now renamed "addr" & "port". + + 2007-04-11 Jonathan Larmour + * sys.h, api_lib.c: Provide new sys_mbox_tryfetch function. Require ports to provide new + sys_arch_mbox_tryfetch function to get a message if one is there, otherwise return + with SYS_MBOX_EMPTY. sys_arch_mbox_tryfetch can be implemented as a function-like macro + by the port in sys_arch.h if desired. + + 2007-04-06 Frédéric Bernon, Simon Goldschmidt + * opt.h, tcpip.h, tcpip.c, netifapi.h, netifapi.c: New configuration option LWIP_NETIF_API + allow to use thread-safe functions to add/remove netif in list, and to start/stop dhcp + clients, using new functions from netifapi.h. Disable as default (no port change to do). + + 2007-04-05 Frédéric Bernon + * sockets.c: remplace ENOBUFS errors on alloc_socket by ENFILE to be more BSD compliant. + + 2007-04-04 Simon Goldschmidt + * arch.h, api_msg.c, dhcp.c, msg_in.c, sockets.c: Introduced #define LWIP_UNUSED_ARG(x) + use this for and architecture-independent form to tell the compiler you intentionally + are not using this variable. Can be overriden in cc.h. + + 2007-03-28 Frédéric Bernon + * opt.h, netif.h, dhcp.h, dhcp.c: New configuration option LWIP_NETIF_HOSTNAME allow to + define a hostname in netif struct (this is just a pointer, so, you can use a hardcoded + string, point on one of your's ethernetif field, or alloc a string you will free yourself). + It will be used by DHCP to register a client hostname, but can also be use when you call + snmp_set_sysname. + + 2007-03-28 Frédéric Bernon + * netif.h, netif.c: A new NETIF_FLAG_ETHARP flag is defined in netif.h, to allow to + initialize a network interface's flag with. It tell this interface is an ethernet + device, and we can use ARP with it to do a "gratuitous ARP" (RFC 3220 "IP Mobility + Support for IPv4" section 4.6) when interface is "up" with netif_set_up(). + + 2007-03-26 Frédéric Bernon, Jonathan Larmour + * opt.h, tcpip.c: New configuration option LWIP_ARP allow to disable ARP init at build + time if you only use PPP or SLIP. The default is enable. Note we don't have to call + etharp_init in your port's initilization sequence if you use tcpip.c, because this call + is done in tcpip_init function. + + 2007-03-22 Frédéric Bernon + * stats.h, stats.c, msg_in.c: Stats counters can be change to u32_t if necessary with the + new option LWIP_STATS_LARGE. If you need this option, define LWIP_STATS_LARGE to 1 in + your lwipopts.h. More, unused counters are not defined in the stats structs, and not + display by stats_display(). Note that some options (SYS_STATS and RAW_STATS) are defined + but never used. Fix msg_in.c with the correct #if test for a stat display. + + 2007-03-21 Kieran Mansley + * netif.c, netif.h: Apply patch#4197 with some changes (originator: rireland@hmgsl.com). + Provides callback on netif up/down state change. + + 2007-03-11 Frédéric Bernon, Mace Gael, Steve Reynolds + * sockets.h, sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c, igmp.h, igmp.c, + ip.c, netif.h, tcpip.c, opt.h: + New configuration option LWIP_IGMP to enable IGMP processing. Based on only one + filter per all network interfaces. Declare a new function in netif to enable to + control the MAC filter (to reduce lwIP traffic processing). + + 2007-03-11 Frédéric Bernon + * tcp.h, tcp.c, sockets.c, tcp_out.c, tcp_in.c, opt.h: Keepalive values can + be configured at run time with LWIP_TCP_KEEPALIVE, but don't change this + unless you know what you're doing (default are RFC1122 compliant). Note + that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set in seconds. + + 2007-03-08 Frédéric Bernon + * tcp.h: Keepalive values can be configured at compile time, but don't change + this unless you know what you're doing (default are RFC1122 compliant). + + 2007-03-08 Frédéric Bernon + * sockets.c, api.h, api_lib.c, tcpip.c, sys.h, sys.c, err.c, opt.h: + Implement LWIP_SO_RCVTIMEO configuration option to enable/disable SO_RCVTIMEO + on UDP sockets/netconn. + + 2007-03-08 Simon Goldschmidt + * snmp_msg.h, msg_in.c: SNMP UDP ports can be configured at compile time. + + 2007-03-06 Frédéric Bernon + * api.h, api_lib.c, sockets.h, sockets.c, tcpip.c, sys.h, sys.c, err.h: + Implement SO_RCVTIMEO on UDP sockets/netconn. + + 2007-02-28 Kieran Mansley (based on patch from Simon Goldschmidt) + * api_lib.c, tcpip.c, memp.c, memp.h: make API msg structs allocated + on the stack and remove the API msg type from memp + + 2007-02-26 Jonathan Larmour (based on patch from Simon Goldschmidt) + * sockets.h, sockets.c: Move socket initialization to new + lwip_socket_init() function. + NOTE: this changes the API with ports. Ports will have to be + updated to call lwip_socket_init() now. + + 2007-02-26 Jonathan Larmour (based on patch from Simon Goldschmidt) + * api_lib.c: Use memcpy in netbuf_copy_partial. + + + ++ Bug fixes: + + 2008-03-17 Frédéric Bernon, Ed Kerekes + * igmp.h, igmp.c: Fix bug #22613 "IGMP iphdr problem" (could have + some problems to fill the IP header on some targets, use now the + ip.h macros to do it). + + 2008-03-13 Frédéric Bernon + * sockets.c: Fix bug #22435 "lwip_recvfrom with TCP break;". Using + (lwip_)recvfrom with valid "from" and "fromlen" parameters, on a + TCP connection caused a crash. Note that using (lwip_)recvfrom + like this is a bit slow and that using (lwip)getpeername is the + good lwip way to do it (so, using recv is faster on tcp sockets). + + 2008-03-12 Frédéric Bernon, Jonathan Larmour + * api_msg.c, contrib/apps/ping.c: Fix bug #22530 "api_msg.c's + recv_raw() does not consume data", and the ping sample (with + LWIP_SOCKET=1, the code did the wrong supposition that lwip_recvfrom + returned the IP payload, without the IP header). + + 2008-03-04 Jonathan Larmour + * mem.c, stats.c, mem.h: apply patch #6414 to avoid compiler errors + and/or warnings on some systems where mem_size_t and size_t differ. + * pbuf.c, ppp.c: Fix warnings on some systems with mem_malloc. + + 2008-03-04 Kieran Mansley (contributions by others) + * Numerous small compiler error/warning fixes from contributions to + mailing list after 1.3.0 release candidate made. + + 2008-01-25 Cui hengbin (integrated by Frédéric Bernon) + * dns.c: Fix bug #22108 "DNS problem" caused by unaligned structures. + + 2008-01-15 Kieran Mansley + * tcp_out.c: BUG20511. Modify persist timer to start when we are + prevented from sending by a small send window, not just a zero + send window. + + 2008-01-09 Jonathan Larmour + * opt.h, ip.c: Rename IP_OPTIONS define to IP_OPTIONS_ALLOWED to avoid + conflict with Linux system headers. + + 2008-01-06 Jonathan Larmour + * dhcp.c: fix bug #19927: "DHCP NACK problem" by clearing any existing set IP + address entirely on receiving a DHCPNAK, and restarting discovery. + + 2007-12-21 Simon Goldschmidt + * sys.h, api_lib.c, api_msg.c, sockets.c: fix bug #21698: "netconn->recv_avail + is not protected" by using new macros for interlocked access to modify/test + netconn->recv_avail. + + 2007-12-20 Kieran Mansley (based on patch from Oleg Tyshev) + * tcp_in.c: fix bug# 21535 (nrtx not reset correctly in SYN_SENT state) + + 2007-12-20 Kieran Mansley (based on patch from Per-Henrik Lundbolm) + * tcp.c, tcp_in.c, tcp_out.c, tcp.h: fix bug #20199 (better handling + of silly window avoidance and prevent lwIP from shrinking the window) + + 2007-12-04 Simon Goldschmidt + * tcp.c, tcp_in.c: fix bug #21699 (segment leak in ooseq processing when last + data packet was lost): add assert that all segment lists are empty in + tcp_pcb_remove before setting pcb to CLOSED state; don't directly set CLOSED + state from LAST_ACK in tcp_process + + 2007-12-02 Simon Goldschmidt + * sockets.h: fix bug #21654: exclude definition of struct timeval from #ifndef FD_SET + If including for system-struct timeval, LWIP_TIMEVAL_PRIVATE now + has to be set to 0 in lwipopts.h + + 2007-12-02 Simon Goldschmidt + * api_msg.c, api_lib.c: fix bug #21656 (recvmbox problem in netconn API): always + allocate a recvmbox in netconn_new_with_proto_and_callback. For a tcp-listen + netconn, this recvmbox is later freed and a new mbox is allocated for acceptmbox. + This is a fix for thread-safety and allocates all items needed for a netconn + when the netconn is created. + + 2007-11-30 Simon Goldschmidt + * udp.c: first attempt to fix bug #21655 (DHCP doesn't work reliably with multiple + netifs): if LWIP_DHCP is enabled, UDP packets to DHCP_CLIENT_PORT are passed + to netif->dhcp->pcb only (if that exists) and not to any other pcb for the same + port (only solution to let UDP pcbs 'bind' to a netif instead of an IP address) + + 2007-11-27 Simon Goldschmidt + * ip.c: fixed bug #21643 (udp_send/raw_send don't fail if netif is down) by + letting ip_route only use netifs that are up. + + 2007-11-27 Simon Goldschmidt + * err.h, api_lib.c, api_msg.c, sockets.c: Changed error handling: ERR_MEM, ERR_BUF + and ERR_RTE are seen as non-fatal, all other errors are fatal. netconns and + sockets block most operations once they have seen a fatal error. + + 2007-11-27 Simon Goldschmidt + * udp.h, udp.c, dhcp.c: Implemented new function udp_sendto_if which takes the + netif to send as an argument (to be able to send on netifs that are down). + + 2007-11-26 Simon Goldschmidt + * tcp_in.c: Fixed bug #21582: pcb->acked accounting can be wrong when ACKs + arrive out-of-order + + 2007-11-21 Simon Goldschmidt + * tcp.h, tcp_out.c, api_msg.c: Fixed bug #20287: tcp_output_nagle sends too early + Fixed the nagle algorithm; nagle now also works for all raw API applications + and has to be explicitly disabled with 'tcp_pcb->flags |= TF_NODELAY' + + 2007-11-12 Frédéric Bernon + * sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c: Fixed bug #20900. Now, most + of the netconn_peer and netconn_addr processing is done inside tcpip_thread + context in do_getaddr. + + 2007-11-10 Simon Goldschmidt + * etharp.c: Fixed bug: assert fired when MEMP_ARP_QUEUE was empty (which can + happen any time). Now the packet simply isn't enqueued when out of memory. + + 2007-11-01 Simon Goldschmidt + * tcp.c, tcp_in.c: Fixed bug #21494: The send mss (pcb->mss) is set to 536 (or + TCP_MSS if that is smaller) as long as no MSS option is received from the + remote host. + + 2007-11-01 Simon Goldschmidt + * tcp.h, tcp.c, tcp_in.c: Fixed bug #21491: The MSS option sent (with SYN) + is now based on TCP_MSS instead of pcb->mss (on passive open now effectively + sending our configured TCP_MSS instead of the one received). + + 2007-11-01 Simon Goldschmidt + * tcp_in.c: Fixed bug #21181: On active open, the initial congestion window was + calculated based on the configured TCP_MSS, not on the MSS option received + with SYN+ACK. + + 2007-10-09 Simon Goldschmidt + * udp.c, inet.c, inet.h: Fixed UDPLite: send: Checksum was always generated too + short and also was generated wrong if checksum coverage != tot_len; + receive: checksum was calculated wrong if checksum coverage != tot_len + + 2007-10-08 Simon Goldschmidt + * mem.c: lfree was not updated in mem_realloc! + + 2007-10-07 Frédéric Bernon + * sockets.c, api.h, api_lib.c: First step to fix "bug #20900 : Potential + crash error problem with netconn_peer & netconn_addr". VERY IMPORTANT: + this change cause an API breakage for netconn_addr, since a parameter + type change. Any compiler should cause an error without any changes in + yours netconn_peer calls (so, it can't be a "silent change"). It also + reduce a little bit the footprint for socket layer (lwip_getpeername & + lwip_getsockname use now a common lwip_getaddrname function since + netconn_peer & netconn_addr have the same parameters). + + 2007-09-20 Simon Goldschmidt + * tcp.c: Fixed bug #21080 (tcp_bind without check pcbs in TIME_WAIT state) + by checking tcp_tw_pcbs also + + 2007-09-19 Simon Goldschmidt + * icmp.c: Fixed bug #21107 (didn't reset IP TTL in ICMP echo replies) + + 2007-09-15 Mike Kleshov + * mem.c: Fixed bug #21077 (inaccuracy in calculation of lwip_stat.mem.used) + + 2007-09-06 Frédéric Bernon + * several-files: replace some #include "arch/cc.h" by "lwip/arch.h", or simply remove + it as long as "lwip/opt.h" is included before (this one include "lwip/debug.h" which + already include "lwip/arch.h"). Like that, default defines are provided by "lwip/arch.h" + if they are not defined in cc.h, in the same spirit than "lwip/opt.h" for lwipopts.h. + + 2007-08-30 Frédéric Bernon + * igmp.h, igmp.c: Some changes to remove some redundant code, add some traces, + and fix some coding style. + + 2007-08-28 Frédéric Bernon + * tcpip.c: Fix TCPIP_MSG_INPKT processing: now, tcpip_input can be used for any + kind of packets. These packets are considered like Ethernet packets (payload + pointing to ethhdr) if the netif got the NETIF_FLAG_ETHARP flag. Else, packets + are considered like IP packets (payload pointing to iphdr). + + 2007-08-27 Frédéric Bernon + * api.h, api_lib.c, api_msg.c: First fix for "bug #20900 : Potential crash error + problem with netconn_peer & netconn_addr". Introduce NETCONN_LISTEN netconn_state + and remove obsolete ones (NETCONN_RECV & NETCONN_ACCEPT). + + 2007-08-24 Kieran Mansley + * inet.c Modify (acc >> 16) test to ((acc >> 16) != 0) to help buggy + compiler (Paradigm C++) + + 2007-08-09 Frédéric Bernon, Bill Florac + * stats.h, stats.c, igmp.h, igmp.c, opt.h: Fix for bug #20503 : IGMP Improvement. + Introduce IGMP_STATS to centralize statistics management. + + 2007-08-09 Frédéric Bernon, Bill Florac + * udp.c: Fix for bug #20503 : IGMP Improvement. Enable to receive a multicast + packet on a udp pcb binded on an netif's IP address, and not on "any". + + 2007-08-09 Frédéric Bernon, Bill Florac + * igmp.h, igmp.c, ip.c: Fix minor changes from bug #20503 : IGMP Improvement. + This is mainly on using lookup/lookfor, and some coding styles... + + 2007-07-26 Frédéric Bernon (and "thedoctor") + * igmp.c: Fix bug #20595 to accept IGMPv3 "Query" messages. + + 2007-07-25 Simon Goldschmidt + * api_msg.c, tcp.c: Another fix for bug #20021: by not returning an error if + tcp_output fails in tcp_close, the code in do_close_internal gets simpler + (tcp_output is called again later from tcp timers). + + 2007-07-25 Simon Goldschmidt + * ip_frag.c: Fixed bug #20429: use the new pbuf_copy_partial instead of the old + copy_from_pbuf, which illegally modified the given pbuf. + + 2007-07-25 Simon Goldschmidt + * tcp_out.c: tcp_enqueue: pcb->snd_queuelen didn't work for chaine PBUF_RAMs: + changed snd_queuelen++ to snd_queuelen += pbuf_clen(p). + + 2007-07-24 Simon Goldschmidt + * api_msg.c, tcp.c: Fix bug #20480: Check the pcb passed to tcp_listen() for the + correct state (must be CLOSED). + + 2007-07-13 Thomas Taranowski (commited by Jared Grubb) + * memp.c: Fix bug #20478: memp_malloc returned NULL+MEMP_SIZE on failed + allocation. It now returns NULL. + + 2007-07-13 Frédéric Bernon + * api_msg.c: Fix bug #20318: api_msg "recv" callbacks don't call pbuf_free in + all error cases. + + 2007-07-13 Frédéric Bernon + * api_msg.c: Fix bug #20315: possible memory leak problem if tcp_listen failed, + because current code doesn't follow rawapi.txt documentation. + + 2007-07-13 Kieran Mansley + * src/core/tcp_in.c Apply patch#5741 from Oleg Tyshev to fix bug in + out of sequence processing of received packets + + 2007-07-03 Simon Goldschmidt + * nearly-all-files: Added assertions where PBUF_RAM pbufs are used and an + assumption is made that this pbuf is in one piece (i.e. not chained). These + assumptions clash with the possibility of converting to fully pool-based + pbuf implementations, where PBUF_RAM pbufs might be chained. + + 2007-07-03 Simon Goldschmidt + * api.h, api_lib.c, api_msg.c: Final fix for bug #20021 and some other problems + when closing tcp netconns: removed conn->sem, less context switches when + closing, both netconn_close and netconn_delete should safely close tcp + connections. + + 2007-07-02 Simon Goldschmidt + * ipv4/ip.h, ipv6/ip.h, opt.h, netif.h, etharp.h, ipv4/ip.c, netif.c, raw.c, + tcp_out.c, udp.c, etharp.c: Added option LWIP_NETIF_HWADDRHINT (default=off) + to cache ARP table indices with each pcb instead of single-entry cache for + the complete stack. + + 2007-07-02 Simon Goldschmidt + * tcp.h, tcp.c, tcp_in.c, tcp_out.c: Added some ASSERTS and casts to prevent + warnings when assigning to smaller types. + + 2007-06-28 Simon Goldschmidt + * tcp_out.c: Added check to prevent tcp_pcb->snd_queuelen from overflowing. + + 2007-06-28 Simon Goldschmidt + * tcp.h: Fixed bug #20287: Fixed nagle algorithm (sending was done too early if + a segment contained chained pbufs) + + 2007-06-28 Frédéric Bernon + * autoip.c: replace most of rand() calls by a macro LWIP_AUTOIP_RAND which compute + a "pseudo-random" value based on netif's MAC and some autoip fields. It's always + possible to define this macro in your own lwipopts.h to always use C library's + rand(). Note that autoip_create_rand_addr doesn't use this macro. + + 2007-06-28 Frédéric Bernon + * netifapi.h, netifapi.c, tcpip.h, tcpip.c: Update code to handle the option + LWIP_TCPIP_CORE_LOCKING, and do some changes to be coherent with last modifications + in api_lib/api_msg (use pointers and not type with table, etc...) + + 2007-06-26 Simon Goldschmidt + * udp.h: Fixed bug #20259: struct udp_hdr was lacking the packin defines. + + 2007-06-25 Simon Goldschmidt + * udp.c: Fixed bug #20253: icmp_dest_unreach was called with a wrong p->payload + for udp packets with no matching pcb. + + 2007-06-25 Simon Goldschmidt + * udp.c: Fixed bug #20220: UDP PCB search in udp_input(): a non-local match + could get udp input packets if the remote side matched. + + 2007-06-13 Simon Goldschmidt + * netif.c: Fixed bug #20180 (TCP pcbs listening on IP_ADDR_ANY could get + changed in netif_set_ipaddr if previous netif->ip_addr.addr was 0. + + 2007-06-13 Simon Goldschmidt + * api_msg.c: pcb_new sets conn->err if protocol is not implemented + -> netconn_new_..() does not allocate a new connection for unsupported + protocols. + + 2007-06-13 Frédéric Bernon, Simon Goldschmidt + * api_lib.c: change return expression in netconn_addr and netconn_peer, because + conn->err was reset to ERR_OK without any reasons (and error was lost)... + + 2007-06-13 Frédéric Bernon, Matthias Weisser + * opt.h, mem.h, mem.c, memp.c, pbuf.c, ip_frag.c, vj.c: Fix bug #20162. Rename + MEM_ALIGN in LWIP_MEM_ALIGN and MEM_ALIGN_SIZE in LWIP_MEM_ALIGN_SIZE to avoid + some macro names collision with some OS macros. + + 2007-06-11 Simon Goldschmidt + * udp.c: UDP Lite: corrected the use of chksum_len (based on RFC3828: if it's 0, + create checksum over the complete packet. On RX, if it's < 8 (and not 0), + discard the packet. Also removed the duplicate 'udphdr->chksum = 0' for both + UDP & UDP Lite. + + 2007-06-11 Srinivas Gollakota & Oleg Tyshev + * tcp_out.c: Fix for bug #20075 : "A problem with keep-alive timer and TCP flags" + where TCP flags wasn't initialized in tcp_keepalive. + + 2007-06-03 Simon Goldschmidt + * udp.c: udp_input(): Input pbuf was not freed if pcb had no recv function + registered, p->payload was modified without modifying p->len if sending + icmp_dest_unreach() (had no negative effect but was definitively wrong). + + 2007-06-03 Simon Goldschmidt + * icmp.c: Corrected bug #19937: For responding to an icmp echo request, icmp + re-used the input pbuf even if that didn't have enough space to include the + link headers. Now the space is tested and a new pbuf is allocated for the + echo response packet if the echo request pbuf isn't big enough. + + 2007-06-01 Simon Goldschmidt + * sockets.c: Checked in patch #5914: Moved sockopt processing into tcpip_thread. + + 2007-05-23 Frédéric Bernon + * api_lib.c, sockets.c: Fixed bug #5958 for netconn_listen (acceptmbox only + allocated by do_listen if success) and netconn_accept errors handling. In + most of api_lib functions, we replace some errors checkings like "if (conn==NULL)" + by ASSERT, except for netconn_delete. + + 2007-05-23 Frédéric Bernon + * api_lib.c: Fixed bug #5957 "Safe-thread problem inside netconn_recv" to return + an error code if it's impossible to fetch a pbuf on a TCP connection (and not + directly close the recvmbox). + + 2007-05-22 Simon Goldschmidt + * tcp.c: Fixed bug #1895 (tcp_bind not correct) by introducing a list of + bound but unconnected (and non-listening) tcp_pcbs. + + 2007-05-22 Frédéric Bernon + * sys.h, sys.c, api_lib.c, tcpip.c: remove sys_mbox_fetch_timeout() (was only + used for LWIP_SO_RCVTIMEO option) and use sys_arch_mbox_fetch() instead of + sys_mbox_fetch() in api files. Now, users SHOULD NOT use internal lwIP features + like "sys_timeout" in their application threads. + + 2007-05-22 Frédéric Bernon + * api.h, api_lib.c, api_msg.h, api_msg.c: change the struct api_msg_msg to see + which parameters are used by which do_xxx function, and to avoid "misusing" + parameters (patch #5938). + + 2007-05-22 Simon Goldschmidt + * api_lib.c, api_msg.c, raw.c, api.h, api_msg.h, raw.h: Included patch #5938: + changed raw_pcb.protocol from u16_t to u8_t since for IPv4 and IPv6, proto + is only 8 bits wide. This affects the api, as there, the protocol was + u16_t, too. + + 2007-05-18 Simon Goldschmidt + * memp.c: addition to patch #5913: smaller pointer was returned but + memp_memory was the same size -> did not save memory. + + 2007-05-16 Simon Goldschmidt + * loopif.c, slipif.c: Fix bug #19729: free pbuf if netif->input() returns + != ERR_OK. + + 2007-05-16 Simon Goldschmidt + * api_msg.c, udp.c: If a udp_pcb has a local_ip set, check if it is the same + as the one of the netif used for sending to prevent sending from old + addresses after a netif address gets changed (partly fixes bug #3168). + + 2007-05-16 Frédéric Bernon + * tcpip.c, igmp.h, igmp.c: Fixed bug "#19800 : IGMP: igmp_tick() will not work + with NO_SYS=1". Note that igmp_init is always in tcpip_thread (and not in + tcpip_init) because we have to be sure that network interfaces are already + added (mac filter is updated only in igmp_init for the moment). + + 2007-05-16 Simon Goldschmidt + * mem.c, memp.c: Removed semaphores from memp, changed sys_sem_wait calls + into sys_arch_sem_wait calls to prevent timers from running while waiting + for the heap. This fixes bug #19167. + + 2007-05-13 Simon Goldschmidt + * tcp.h, sockets.h, sockets.c: Fixed bug from patch #5865 by moving the defines + for socket options (lwip_set/-getsockopt) used with level IPPROTO_TCP from + tcp.h to sockets.h. + + 2007-05-07 Simon Goldschmidt + * mem.c: Another attempt to fix bug #17922. + + 2007-05-04 Simon Goldschmidt + * pbuf.c, pbuf.h, etharp.c: Further update to ARP queueing: Changed pbuf_copy() + implementation so that it can be reused (don't allocate the target + pbuf inside pbuf_copy()). + + 2007-05-04 Simon Goldschmidt + * memp.c: checked in patch #5913: in memp_malloc() we can return memp as mem + to save a little RAM (next pointer of memp is not used while not in pool). + + 2007-05-03 "maq" + * sockets.c: Fix ioctl FIONREAD when some data remains from last recv. + (patch #3574). + + 2007-04-23 Simon Goldschmidt + * loopif.c, loopif.h, opt.h, src/netif/FILES: fix bug #2595: "loopif results + in NULL reference for incoming TCP packets". Loopif has to be configured + (using LWIP_LOOPIF_MULTITHREADING) to directly call netif->input() + (multithreading environments, e.g. netif->input() = tcpip_input()) or + putting packets on a list that is fed to the stack by calling loopif_poll() + (single-thread / NO_SYS / polling environment where e.g. + netif->input() = ip_input). + + 2007-04-17 Jonathan Larmour + * pbuf.c: Use s32_t in pbuf_realloc(), as an s16_t can't reliably hold + the difference between two u16_t's. + * sockets.h: FD_SETSIZE needs to match number of sockets, which is + MEMP_NUM_NETCONN in sockets.c right now. + + 2007-04-12 Jonathan Larmour + * icmp.c: Reset IP header TTL in ICMP ECHO responses (bug #19580). + + 2007-04-12 Kieran Mansley + * tcp.c, tcp_in.c, tcp_out.c, tcp.h: Modify way the retransmission + timer is reset to fix bug#19434, with help from Oleg Tyshev. + + 2007-04-11 Simon Goldschmidt + * etharp.c, pbuf.c, pbuf.h: 3rd fix for bug #11400 (arp-queuing): More pbufs than + previously thought need to be copied (everything but PBUF_ROM!). Cleaned up + pbuf.c: removed functions no needed any more (by etharp). + + 2007-04-11 Kieran Mansley + * inet.c, ip_addr.h, sockets.h, sys.h, tcp.h: Apply patch #5745: Fix + "Constant is long" warnings with 16bit compilers. Contributed by + avatar@mmlab.cse.yzu.edu.tw + + 2007-04-05 Frédéric Bernon, Jonathan Larmour + * api_msg.c: Fix bug #16830: "err_tcp() posts to connection mailbox when no pend on + the mailbox is active". Now, the post is only done during a connect, and do_send, + do_write and do_join_leave_group don't do anything if a previous error was signaled. + + 2007-04-03 Frédéric Bernon + * ip.c: Don't set the IP_DF ("Don't fragment") flag in the IP header in IP output + packets. See patch #5834. + + 2007-03-30 Frédéric Bernon + * api_msg.c: add a "pcb_new" helper function to avoid redundant code, and to add + missing pcb allocations checking (in do_bind, and for each raw_new). Fix style. + + 2007-03-30 Frédéric Bernon + * most of files: prefix all debug.h define with "LWIP_" to avoid any conflict with + others environment defines (these were too "generic"). + + 2007-03-28 Frédéric Bernon + * api.h, api_lib.c, sockets.c: netbuf_ref doesn't check its internal pbuf_alloc call + result and can cause a crash. lwip_send now check netbuf_ref result. + + 2007-03-28 Simon Goldschmidt + * sockets.c Remove "#include " from sockets.c to avoid multiple + definition of macros (in errno.h and lwip/arch.h) if LWIP_PROVIDE_ERRNO is + defined. This is the way it should have been already (looking at + doc/sys_arch.txt) + + 2007-03-28 Kieran Mansley + * opt.h Change default PBUF_POOL_BUFSIZE (again) to accomodate default MSS + + IP and TCP headers *and* physical link headers + + 2007-03-26 Frédéric Bernon (based on patch from Dmitry Potapov) + * api_lib.c: patch for netconn_write(), fixes a possible race condition which cause + to send some garbage. It is not a definitive solution, but the patch does solve + the problem for most cases. + + 2007-03-22 Frédéric Bernon + * api_msg.h, api_msg.c: Remove obsolete API_MSG_ACCEPT and do_accept (never used). + + 2007-03-22 Frédéric Bernon + * api_lib.c: somes resources couldn't be freed if there was errors during + netconn_new_with_proto_and_callback. + + 2007-03-22 Frédéric Bernon + * ethernetif.c: update netif->input calls to check return value. In older ports, + it's a good idea to upgrade them, even if before, there could be another problem + (access to an uninitialized mailbox). + + 2007-03-21 Simon Goldschmidt + * sockets.c: fixed bug #5067 (essentialy a signed/unsigned warning fixed + by casting to unsigned). + + 2007-03-21 Frédéric Bernon + * api_lib.c, api_msg.c, tcpip.c: integrate sys_mbox_fetch(conn->mbox, NULL) calls from + api_lib.c to tcpip.c's tcpip_apimsg(). Now, use a local variable and not a + dynamic one from memp to send tcpip_msg to tcpip_thread in a synchrone call. + Free tcpip_msg from tcpip_apimsg is not done in tcpip_thread. This give a + faster and more reliable communication between api_lib and tcpip. + + 2007-03-21 Frédéric Bernon + * opt.h: Add LWIP_NETIF_CALLBACK (to avoid compiler warning) and set it to 0. + + 2007-03-21 Frédéric Bernon + * api_msg.c, igmp.c, igmp.h: Fix C++ style comments + + 2007-03-21 Kieran Mansley + * opt.h Change default PBUF_POOL_BUFSIZE to accomodate default MSS + + IP and TCP headers + + 2007-03-21 Kieran Mansley + * Fix all uses of pbuf_header to check the return value. In some + cases just assert if it fails as I'm not sure how to fix them, but + this is no worse than before when they would carry on regardless + of the failure. + + 2007-03-21 Kieran Mansley + * sockets.c, igmp.c, igmp.h, memp.h: Fix C++ style comments and + comment out missing header include in icmp.c + + 2007-03-20 Frédéric Bernon + * memp.h, stats.c: Fix stats_display function where memp_names table wasn't + synchronized with memp.h. + + 2007-03-20 Frédéric Bernon + * tcpip.c: Initialize tcpip's mbox, and verify if initialized in tcpip_input, + tcpip_ethinput, tcpip_callback, tcpip_apimsg, to fix a init problem with + network interfaces. Also fix a compiler warning. + + 2007-03-20 Kieran Mansley + * udp.c: Only try and use pbuf_header() to make space for headers if + not a ROM or REF pbuf. + + 2007-03-19 Frédéric Bernon + * api_msg.h, api_msg.c, tcpip.h, tcpip.c: Add return types to tcpip_apimsg() + and api_msg_post(). + + 2007-03-19 Frédéric Bernon + * Remove unimplemented "memp_realloc" function from memp.h. + + 2007-03-11 Simon Goldschmidt + * pbuf.c: checked in patch #5796: pbuf_alloc: len field claculation caused + memory corruption. + + 2007-03-11 Simon Goldschmidt (based on patch from Dmitry Potapov) + * api_lib.c, sockets.c, api.h, api_msg.h, sockets.h: Fixed bug #19251 + (missing `const' qualifier in socket functions), to get more compatible to + standard POSIX sockets. + + 2007-03-11 Frédéric Bernon (based on patch from Dmitry Potapov) + * sockets.c: Add asserts inside bind, connect and sendto to check input + parameters. Remove excessive set_errno() calls after get_socket(), because + errno is set inside of get_socket(). Move last sock_set_errno() inside + lwip_close. + + 2007-03-09 Simon Goldschmidt + * memp.c: Fixed bug #11400: New etharp queueing introduced bug: memp_memory + was allocated too small. + + 2007-03-06 Simon Goldschmidt + * tcpip.c: Initialize dhcp timers in tcpip_thread (if LWIP_DHCP) to protect + the stack from concurrent access. + + 2007-03-06 Frédéric Bernon, Dmitry Potapov + * tcpip.c, ip_frag.c, ethernetif.c: Fix some build problems, and a redundancy + call to "lwip_stats.link.recv++;" in low_level_input() & ethernetif_input(). + + 2007-03-06 Simon Goldschmidt + * ip_frag.c, ip_frag.h: Reduce code size: don't include code in those files + if IP_FRAG == 0 and IP_REASSEMBLY == 0 + + 2007-03-06 Frédéric Bernon, Simon Goldschmidt + * opt.h, ip_frag.h, tcpip.h, tcpip.c, ethernetif.c: add new configuration + option named ETHARP_TCPIP_ETHINPUT, which enable the new tcpip_ethinput. + Allow to do ARP processing for incoming packets inside tcpip_thread + (protecting ARP layer against concurrent access). You can also disable + old code using tcp_input with new define ETHARP_TCPIP_INPUT set to 0. + Older ports have to use tcpip_ethinput. + + 2007-03-06 Simon Goldschmidt (based on patch from Dmitry Potapov) + * err.h, err.c: fixed compiler warning "initialization dircards qualifiers + from pointer target type" + + 2007-03-05 Frédéric Bernon + * opt.h, sockets.h: add new configuration options (LWIP_POSIX_SOCKETS_IO_NAMES, + ETHARP_TRUST_IP_MAC, review SO_REUSE) + + 2007-03-04 Frédéric Bernon + * api_msg.c: Remove some compiler warnings : parameter "pcb" was never + referenced. + + 2007-03-04 Frédéric Bernon + * api_lib.c: Fix "[patch #5764] api_lib.c cleanup: after patch #5687" (from + Dmitry Potapov). + The api_msg struct stay on the stack (not moved to netconn struct). + + 2007-03-04 Simon Goldschmidt (based on patch from Dmitry Potapov) + * pbuf.c: Fix BUG#19168 - pbuf_free can cause deadlock (if + SYS_LIGHTWEIGHT_PROT=1 & freeing PBUF_RAM when mem_sem is not available) + Also fixed cast warning in pbuf_alloc() + + 2007-03-04 Simon Goldschmidt + * etharp.c, etharp.h, memp.c, memp.h, opt.h: Fix BUG#11400 - don't corrupt + existing pbuf chain when enqueuing multiple pbufs to a pending ARP request + + 2007-03-03 Frédéric Bernon + * udp.c: remove obsolete line "static struct udp_pcb *pcb_cache = NULL;" + It is static, and never used in udp.c except udp_init(). + + 2007-03-02 Simon Goldschmidt + * tcpip.c: Moved call to ip_init(), udp_init() and tcp_init() from + tcpip_thread() to tcpip_init(). This way, raw API connections can be + initialized before tcpip_thread is running (e.g. before OS is started) + + 2007-03-02 Frédéric Bernon + * rawapi.txt: Fix documentation mismatch with etharp.h about etharp_tmr's call + interval. + + 2007-02-28 Kieran Mansley + * pbuf.c: Fix BUG#17645 - ensure pbuf payload pointer is not moved + outside the region of the pbuf by pbuf_header() + + 2007-02-28 Kieran Mansley + * sockets.c: Fix BUG#19161 - ensure milliseconds timeout is non-zero + when supplied timeout is also non-zero + +(STABLE-1.2.0) + + 2006-12-05 Leon Woestenberg + * CHANGELOG: Mention STABLE-1.2.0 release. + + ++ New features: + + 2006-12-01 Christiaan Simons + * mem.h, opt.h: Added MEM_LIBC_MALLOC option. + Note this is a workaround. Currently I have no other options left. + + 2006-10-26 Christiaan Simons (accepted patch by Jonathan Larmour) + * ipv4/ip_frag.c: rename MAX_MTU to IP_FRAG_MAX_MTU and move define + to include/lwip/opt.h. + * ipv4/lwip/ip_frag.h: Remove unused IP_REASS_INTERVAL. + Move IP_REASS_MAXAGE and IP_REASS_BUFSIZE to include/lwip/opt.h. + * opt.h: Add above new options. + + 2006-08-18 Christiaan Simons + * tcp_{in,out}.c: added SNMP counters. + * ipv4/ip.c: added SNMP counters. + * ipv4/ip_frag.c: added SNMP counters. + + 2006-08-08 Christiaan Simons + * etharp.{c,h}: added etharp_find_addr() to read + (stable) ethernet/IP address pair from ARP table + + 2006-07-14 Christiaan Simons + * mib_structs.c: added + * include/lwip/snmp_structs.h: added + * netif.{c,h}, netif/ethernetif.c: added SNMP statistics to netif struct + + 2006-07-06 Christiaan Simons + * snmp/asn1_{enc,dec}.c added + * snmp/mib2.c added + * snmp/msg_{in,out}.c added + * include/lwip/snmp_asn1.h added + * include/lwip/snmp_msg.h added + * doc/snmp_agent.txt added + + 2006-03-29 Christiaan Simons + * inet.c, inet.h: Added platform byteswap support. + Added LWIP_PLATFORM_BYTESWAP define (defaults to 0) and + optional LWIP_PLATFORM_HTONS(), LWIP_PLATFORM_HTONL() macros. + + ++ Bug fixes: + + 2006-11-30 Christiaan Simons + * dhcp.c: Fixed false triggers of request_timeout. + + 2006-11-28 Christiaan Simons + * netif.c: In netif_add() fixed missing clear of ip_addr, netmask, gw and flags. + + 2006-10-11 Christiaan Simons + * api_lib.c etharp.c, ip.c, memp.c, stats.c, sys.{c,h} tcp.h: + Partially accepted patch #5449 for ANSI C compatibility / build fixes. + * ipv4/lwip/ip.h ipv6/lwip/ip.h: Corrected UDP-Lite protocol + identifier from 170 to 136 (bug #17574). + + 2006-10-10 Christiaan Simons + * api_msg.c: Fixed Nagle algorithm as reported by Bob Grice. + + 2006-08-17 Christiaan Simons + * udp.c: Fixed bug #17200, added check for broadcast + destinations for PCBs bound to a unicast address. + + 2006-08-07 Christiaan Simons + * api_msg.c: Flushing TCP output in do_close() (bug #15926). + + 2006-06-27 Christiaan Simons + * api_msg.c: Applied patch for cold case (bug #11135). + In accept_function() ensure newconn->callback is always initialized. + + 2006-06-15 Christiaan Simons + * mem.h: added MEM_SIZE_F alias to fix an ancient cold case (bug #1748), + facilitate printing of mem_size_t and u16_t statistics. + + 2006-06-14 Christiaan Simons + * api_msg.c: Applied patch #5146 to handle allocation failures + in accept() by Kevin Lawson. + + 2006-05-26 Christiaan Simons + * api_lib.c: Removed conn->sem creation and destruction + from netconn_write() and added sys_sem_new to netconn_new_*. + +(STABLE-1_1_1) + + 2006-03-03 Christiaan Simons + * ipv4/ip_frag.c: Added bound-checking assertions on ip_reassbitmap + access and added pbuf_alloc() return value checks. + + 2006-01-01 Leon Woestenberg + * tcp_{in,out}.c, tcp_out.c: Removed 'even sndbuf' fix in TCP, which is + now handled by the checksum routine properly. + + 2006-02-27 Leon Woestenberg + * pbuf.c: Fix alignment; pbuf_init() would not work unless + pbuf_pool_memory[] was properly aligned. (Patch by Curt McDowell.) + + 2005-12-20 Leon Woestenberg + * tcp.c: Remove PCBs which stay in LAST_ACK state too long. Patch + submitted by Mitrani Hiroshi. + + 2005-12-15 Christiaan Simons + * inet.c: Disabled the added summing routine to preserve code space. + + 2005-12-14 Leon Woestenberg + * tcp_in.c: Duplicate FIN ACK race condition fix by Kelvin Lawson. + Added Curt McDowell's optimized checksumming routine for future + inclusion. Need to create test case for unaliged, aligned, odd, + even length combination of cases on various endianess machines. + + 2005-12-09 Christiaan Simons + * inet.c: Rewrote standard checksum routine in proper portable C. + + 2005-11-25 Christiaan Simons + * udp.c tcp.c: Removed SO_REUSE hack. Should reside in socket code only. + * *.c: introduced cc.h LWIP_DEBUG formatters matching the u16_t, s16_t, + u32_t, s32_t typedefs. This solves most debug word-length assumes. + + 2005-07-17 Leon Woestenberg + * inet.c: Fixed unaligned 16-bit access in the standard checksum + routine by Peter Jolasson. + * slipif.c: Fixed implementation assumption of single-pbuf datagrams. + + 2005-02-04 Leon Woestenberg + * tcp_out.c: Fixed uninitialized 'queue' referenced in memerr branch. + * tcp_{out|in}.c: Applied patch fixing unaligned access. + + 2005-01-04 Leon Woestenberg + * pbuf.c: Fixed missing semicolon after LWIP_DEBUG statement. + + 2005-01-03 Leon Woestenberg + * udp.c: UDP pcb->recv() was called even when it was NULL. + +(STABLE-1_1_0) + + 2004-12-28 Leon Woestenberg + * etharp.*: Disabled multiple packets on the ARP queue. + This clashes with TCP queueing. + + 2004-11-28 Leon Woestenberg + * etharp.*: Fixed race condition from ARP request to ARP timeout. + Halved the ARP period, doubled the period counts. + ETHARP_MAX_PENDING now should be at least 2. This prevents + the counter from reaching 0 right away (which would allow + too little time for ARP responses to be received). + + 2004-11-25 Leon Woestenberg + * dhcp.c: Decline messages were not multicast but unicast. + * etharp.c: ETHARP_CREATE is renamed to ETHARP_TRY_HARD. + Do not try hard to insert arbitrary packet's source address, + etharp_ip_input() now calls etharp_update() without ETHARP_TRY_HARD. + etharp_query() now always DOES call ETHARP_TRY_HARD so that users + querying an address will see it appear in the cache (DHCP could + suffer from this when a server invalidly gave an in-use address.) + * ipv4/ip_addr.h: Renamed ip_addr_maskcmp() to _netcmp() as we are + comparing network addresses (identifiers), not the network masks + themselves. + * ipv4/ip_addr.c: ip_addr_isbroadcast() now checks that the given + IP address actually belongs to the network of the given interface. + + 2004-11-24 Kieran Mansley + * tcp.c: Increment pcb->snd_buf when ACK is received in SYN_SENT state. + +(STABLE-1_1_0-RC1) + + 2004-10-16 Kieran Mansley + * tcp.c: Add code to tcp_recved() to send an ACK (window update) immediately, + even if one is already pending, if the rcv_wnd is above a threshold + (currently TCP_WND/2). This avoids waiting for a timer to expire to send a + delayed ACK in order to open the window if the stack is only receiving data. + + 2004-09-12 Kieran Mansley + * tcp*.*: Retransmit time-out handling improvement by Sam Jansen. + + 2004-08-20 Tony Mountifield + * etharp.c: Make sure the first pbuf queued on an ARP entry + is properly ref counted. + + 2004-07-27 Tony Mountifield + * debug.h: Added (int) cast in LWIP_DEBUGF() to avoid compiler + warnings about comparison. + * pbuf.c: Stopped compiler complaining of empty if statement + when LWIP_DEBUGF() empty. Closed an unclosed comment. + * tcp.c: Stopped compiler complaining of empty if statement + when LWIP_DEBUGF() empty. + * ip.h Corrected IPH_TOS() macro: returns a byte, so doesn't need htons(). + * inet.c: Added a couple of casts to quiet the compiler. + No need to test isascii(c) before isdigit(c) or isxdigit(c). + + 2004-07-22 Tony Mountifield + * inet.c: Made data types consistent in inet_ntoa(). + Added casts for return values of checksum routines, to pacify compiler. + * ip_frag.c, tcp_out.c, sockets.c, pbuf.c + Small corrections to some debugging statements, to pacify compiler. + + 2004-07-21 Tony Mountifield + * etharp.c: Removed spurious semicolon and added missing end-of-comment. + * ethernetif.c Updated low_level_output() to match prototype for + netif->linkoutput and changed low_level_input() similarly for consistency. + * api_msg.c: Changed recv_raw() from int to u8_t, to match prototype + of raw_recv() in raw.h and so avoid compiler error. + * sockets.c: Added trivial (int) cast to keep compiler happier. + * ip.c, netif.c Changed debug statements to use the tidier ip4_addrN() macros. + +(STABLE-1_0_0) + + ++ Changes: + + 2004-07-05 Leon Woestenberg + * sockets.*: Restructured LWIP_PRIVATE_TIMEVAL. Make sure + your cc.h file defines this either 1 or 0. If non-defined, + defaults to 1. + * .c: Added and includes where used. + * etharp.c: Made some array indices unsigned. + + 2004-06-27 Leon Woestenberg + * netif.*: Added netif_set_up()/down(). + * dhcp.c: Changes to restart program flow. + + 2004-05-07 Leon Woestenberg + * etharp.c: In find_entry(), instead of a list traversal per candidate, do a + single-pass lookup for different candidates. Should exploit locality. + + 2004-04-29 Leon Woestenberg + * tcp*.c: Cleaned up source comment documentation for Doxygen processing. + * opt.h: ETHARP_ALWAYS_INSERT option removed to comply with ARP RFC. + * etharp.c: update_arp_entry() only adds new ARP entries when adviced to by + the caller. This deprecates the ETHARP_ALWAYS_INSERT overrule option. + + ++ Bug fixes: + + 2004-04-27 Leon Woestenberg + * etharp.c: Applied patch of bug #8708 by Toni Mountifield with a solution + suggested by Timmy Brolin. Fix for 32-bit processors that cannot access + non-aligned 32-bit words, such as soms 32-bit TCP/IP header fields. Fix + is to prefix the 14-bit Ethernet headers with two padding bytes. + + 2004-04-23 Leon Woestenberg + * ip_addr.c: Fix in the ip_addr_isbroadcast() check. + * etharp.c: Fixed the case where the packet that initiates the ARP request + is not queued, and gets lost. Fixed the case where the packets destination + address is already known; we now always queue the packet and perform an ARP + request. + +(STABLE-0_7_0) + + ++ Bug fixes: + + * Fixed TCP bug for SYN_SENT to ESTABLISHED state transition. + * Fixed TCP bug in dequeueing of FIN from out of order segment queue. + * Fixed two possible NULL references in rare cases. + +(STABLE-0_6_6) + + ++ Bug fixes: + + * Fixed DHCP which did not include the IP address in DECLINE messages. + + ++ Changes: + + * etharp.c has been hauled over a bit. + +(STABLE-0_6_5) + + ++ Bug fixes: + + * Fixed TCP bug induced by bad window resizing with unidirectional TCP traffic. + * Packets sent from ARP queue had invalid source hardware address. + + ++ Changes: + + * Pass-by ARP requests do now update the cache. + + ++ New features: + + * No longer dependent on ctype.h. + * New socket options. + * Raw IP pcb support. + +(STABLE-0_6_4) + + ++ Bug fixes: + + * Some debug formatters and casts fixed. + * Numereous fixes in PPP. + + ++ Changes: + + * DEBUGF now is LWIP_DEBUGF + * pbuf_dechain() has been re-enabled. + * Mentioned the changed use of CVS branches in README. + +(STABLE-0_6_3) + + ++ Bug fixes: + + * Fixed pool pbuf memory leak in pbuf_alloc(). + Occured if not enough PBUF_POOL pbufs for a packet pbuf chain. + Reported by Savin Zlobec. + + * PBUF_POOL chains had their tot_len field not set for non-first + pbufs. Fixed in pbuf_alloc(). + + ++ New features: + + * Added PPP stack contributed by Marc Boucher + + ++ Changes: + + * Now drops short packets for ICMP/UDP/TCP protocols. More robust. + + * ARP queueuing now queues the latest packet instead of the first. + This is the RFC recommended behaviour, but can be overridden in + lwipopts.h. + +(0.6.2) + + ++ Bugfixes: + + * TCP has been fixed to deal with the new use of the pbuf->ref + counter. + + * DHCP dhcp_inform() crash bug fixed. + + ++ Changes: + + * Removed pbuf_pool_free_cache and pbuf_pool_alloc_cache. Also removed + pbuf_refresh(). This has sped up pbuf pool operations considerably. + Implemented by David Haas. + +(0.6.1) + + ++ New features: + + * The packet buffer implementation has been enhanced to support + zero-copy and copy-on-demand for packet buffers which have their + payloads in application-managed memory. + Implemented by David Haas. + + Use PBUF_REF to make a pbuf refer to RAM. lwIP will use zero-copy + if an outgoing packet can be directly sent on the link, or perform + a copy-on-demand when necessary. + + The application can safely assume the packet is sent, and the RAM + is available to the application directly after calling udp_send() + or similar function. + + ++ Bugfixes: + + * ARP_QUEUEING should now correctly work for all cases, including + PBUF_REF. + Implemented by Leon Woestenberg. + + ++ Changes: + + * IP_ADDR_ANY is no longer a NULL pointer. Instead, it is a pointer + to a '0.0.0.0' IP address. + + * The packet buffer implementation is changed. The pbuf->ref counter + meaning has changed, and several pbuf functions have been + adapted accordingly. + + * netif drivers have to be changed to set the hardware address length field + that must be initialized correctly by the driver (hint: 6 for Ethernet MAC). + See the contrib/ports/c16x cs8900 driver as a driver example. + + * netif's have a dhcp field that must be initialized to NULL by the driver. + See the contrib/ports/c16x cs8900 driver as a driver example. + +(0.5.x) This file has been unmaintained up to 0.6.1. All changes are + logged in CVS but have not been explained here. + +(0.5.3) Changes since version 0.5.2 + + ++ Bugfixes: + + * memp_malloc(MEMP_API_MSG) could fail with multiple application + threads because it wasn't protected by semaphores. + + ++ Other changes: + + * struct ip_addr now packed. + + * The name of the time variable in arp.c has been changed to ctime + to avoid conflicts with the time() function. + +(0.5.2) Changes since version 0.5.1 + + ++ New features: + + * A new TCP function, tcp_tmr(), now handles both TCP timers. + + ++ Bugfixes: + + * A bug in tcp_parseopt() could cause the stack to hang because of a + malformed TCP option. + + * The address of new connections in the accept() function in the BSD + socket library was not handled correctly. + + * pbuf_dechain() did not update the ->tot_len field of the tail. + + * Aborted TCP connections were not handled correctly in all + situations. + + ++ Other changes: + + * All protocol header structs are now packed. + + * The ->len field in the tcp_seg structure now counts the actual + amount of data, and does not add one for SYN and FIN segments. + +(0.5.1) Changes since version 0.5.0 + + ++ New features: + + * Possible to run as a user process under Linux. + + * Preliminary support for cross platform packed structs. + + * ARP timer now implemented. + + ++ Bugfixes: + + * TCP output queue length was badly initialized when opening + connections. + + * TCP delayed ACKs were not sent correctly. + + * Explicit initialization of BSS segment variables. + + * read() in BSD socket library could drop data. + + * Problems with memory alignment. + + * Situations when all TCP buffers were used could lead to + starvation. + + * TCP MSS option wasn't parsed correctly. + + * Problems with UDP checksum calculation. + + * IP multicast address tests had endianess problems. + + * ARP requests had wrong destination hardware address. + + ++ Other changes: + + * struct eth_addr changed from u16_t[3] array to u8_t[6]. + + * A ->linkoutput() member was added to struct netif. + + * TCP and UDP ->dest_* struct members where changed to ->remote_*. + + * ntoh* macros are now null definitions for big endian CPUs. + +(0.5.0) Changes since version 0.4.2 + + ++ New features: + + * Redesigned operating system emulation layer to make porting easier. + + * Better control over TCP output buffers. + + * Documenation added. + + ++ Bugfixes: + + * Locking issues in buffer management. + + * Bugfixes in the sequential API. + + * IP forwarding could cause memory leakage. This has been fixed. + + ++ Other changes: + + * Directory structure somewhat changed; the core/ tree has been + collapsed. + +(0.4.2) Changes since version 0.4.1 + + ++ New features: + + * Experimental ARP implementation added. + + * Skeleton Ethernet driver added. + + * Experimental BSD socket API library added. + + ++ Bugfixes: + + * In very intense situations, memory leakage could occur. This has + been fixed. + + ++ Other changes: + + * Variables named "data" and "code" have been renamed in order to + avoid name conflicts in certain compilers. + + * Variable++ have in appliciable cases been translated to ++variable + since some compilers generate better code in the latter case. + +(0.4.1) Changes since version 0.4 + + ++ New features: + + * TCP: Connection attempts time out earlier than data + transmissions. Nagle algorithm implemented. Push flag set on the + last segment in a burst. + + * UDP: experimental support for UDP-Lite extensions. + + ++ Bugfixes: + + * TCP: out of order segments were in some cases handled incorrectly, + and this has now been fixed. Delayed acknowledgements was broken + in 0.4, has now been fixed. Binding to an address that is in use + now results in an error. Reset connections sometimes hung an + application; this has been fixed. + + * Checksum calculation sometimes failed for chained pbufs with odd + lengths. This has been fixed. + + * API: a lot of bug fixes in the API. The UDP API has been improved + and tested. Error reporting and handling has been + improved. Logical flaws and race conditions for incoming TCP + connections has been found and removed. + + * Memory manager: alignment issues. Reallocating memory sometimes + failed, this has been fixed. + + * Generic library: bcopy was flawed and has been fixed. + + ++ Other changes: + + * API: all datatypes has been changed from generic ones such as + ints, to specified ones such as u16_t. Functions that return + errors now have the correct type (err_t). + + * General: A lot of code cleaned up and debugging code removed. Many + portability issues have been fixed. + + * The license was changed; the advertising clause was removed. + + * C64 port added. + + * Thanks: Huge thanks go to Dagan Galarneau, Horst Garnetzke, Petri + Kosunen, Mikael Caleres, and Frits Wilmink for reporting and + fixing bugs! + +(0.4) Changes since version 0.3.1 + + * Memory management has been radically changed; instead of + allocating memory from a shared heap, memory for objects that are + rapidly allocated and deallocated is now kept in pools. Allocation + and deallocation from those memory pools is very fast. The shared + heap is still present but is used less frequently. + + * The memory, memory pool, and packet buffer subsystems now support + 4-, 2-, or 1-byte alignment. + + * "Out of memory" situations are handled in a more robust way. + + * Stack usage has been reduced. + + * Easier configuration of lwIP parameters such as memory usage, + TTLs, statistics gathering, etc. All configuration parameters are + now kept in a single header file "lwipopts.h". + + * The directory structure has been changed slightly so that all + architecture specific files are kept under the src/arch + hierarchy. + + * Error propagation has been improved, both in the protocol modules + and in the API. + + * The code for the RTXC architecture has been implemented, tested + and put to use. + + * Bugs have been found and corrected in the TCP, UDP, IP, API, and + the Internet checksum modules. + + * Bugs related to porting between a 32-bit and a 16-bit architecture + have been found and corrected. + + * The license has been changed slightly to conform more with the + original BSD license, including the advertisement clause. + +(0.3.1) Changes since version 0.3 + + * Fix of a fatal bug in the buffer management. Pbufs with allocated + RAM never returned the RAM when the pbuf was deallocated. + + * TCP congestion control, window updates and retransmissions did not + work correctly. This has now been fixed. + + * Bugfixes in the API. + +(0.3) Changes since version 0.2 + + * New and improved directory structure. All include files are now + kept in a dedicated include/ directory. + + * The API now has proper error handling. A new function, + netconn_err(), now returns an error code for the connection in + case of errors. + + * Improvements in the memory management subsystem. The system now + keeps a pointer to the lowest free memory block. A new function, + mem_malloc2() tries to allocate memory once, and if it fails tries + to free some memory and retry the allocation. + + * Much testing has been done with limited memory + configurations. lwIP now does a better job when overloaded. + + * Some bugfixes and improvements to the buffer (pbuf) subsystem. + + * Many bugfixes in the TCP code: + + - Fixed a bug in tcp_close(). + + - The TCP receive window was incorrectly closed when out of + sequence segments was received. This has been fixed. + + - Connections are now timed-out of the FIN-WAIT-2 state. + + - The initial congestion window could in some cases be too + large. This has been fixed. + + - The retransmission queue could in some cases be screwed up. This + has been fixed. + + - TCP RST flag now handled correctly. + + - Out of sequence data was in some cases never delivered to the + application. This has been fixed. + + - Retransmitted segments now contain the correct acknowledgment + number and advertised window. + + - TCP retransmission timeout backoffs are not correctly computed + (ala BSD). After a number of retransmissions, TCP now gives up + the connection. + + * TCP connections now are kept on three lists, one for active + connections, one for listening connections, and one for + connections that are in TIME-WAIT. This greatly speeds up the fast + timeout processing for sending delayed ACKs. + + * TCP now provides proper feedback to the application when a + connection has been successfully set up. + + * More comments have been added to the code. The code has also been + somewhat cleaned up. + +(0.2) Initial public release. diff --git a/third_party/lwip-1.4.1/COPYING b/third_party/lwip-1.4.1/COPYING new file mode 100644 index 0000000..0d77a67 --- /dev/null +++ b/third_party/lwip-1.4.1/COPYING @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2001, 2002 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + + diff --git a/third_party/lwip-1.4.1/FILES b/third_party/lwip-1.4.1/FILES new file mode 100644 index 0000000..30d6e32 --- /dev/null +++ b/third_party/lwip-1.4.1/FILES @@ -0,0 +1,4 @@ +src/ - The source code for the lwIP TCP/IP stack. +doc/ - The documentation for lwIP. + +See also the FILES file in each subdirectory. diff --git a/third_party/lwip-1.4.1/README b/third_party/lwip-1.4.1/README new file mode 100644 index 0000000..818d209 --- /dev/null +++ b/third_party/lwip-1.4.1/README @@ -0,0 +1,89 @@ +INTRODUCTION + +lwIP is a small independent implementation of the TCP/IP protocol +suite that has been developed by Adam Dunkels at the Computer and +Networks Architectures (CNA) lab at the Swedish Institute of Computer +Science (SICS). + +The focus of the lwIP TCP/IP implementation is to reduce the RAM usage +while still having a full scale TCP. This making lwIP suitable for use +in embedded systems with tens of kilobytes of free RAM and room for +around 40 kilobytes of code ROM. + +FEATURES + + * IP (Internet Protocol) including packet forwarding over multiple network + interfaces + * ICMP (Internet Control Message Protocol) for network maintenance and debugging + * IGMP (Internet Group Management Protocol) for multicast traffic management + * UDP (User Datagram Protocol) including experimental UDP-lite extensions + * TCP (Transmission Control Protocol) with congestion control, RTT estimation + and fast recovery/fast retransmit + * Specialized raw/native API for enhanced performance + * Optional Berkeley-like socket API + * DNS (Domain names resolver) + * SNMP (Simple Network Management Protocol) + * DHCP (Dynamic Host Configuration Protocol) + * AUTOIP (for IPv4, conform with RFC 3927) + * PPP (Point-to-Point Protocol) + * ARP (Address Resolution Protocol) for Ethernet + +LICENSE + +lwIP is freely available under a BSD license. + +DEVELOPMENT + +lwIP has grown into an excellent TCP/IP stack for embedded devices, +and developers using the stack often submit bug fixes, improvements, +and additions to the stack to further increase its usefulness. + +Development of lwIP is hosted on Savannah, a central point for +software development, maintenance and distribution. Everyone can +help improve lwIP by use of Savannah's interface, CVS and the +mailing list. A core team of developers will commit changes to the +CVS source tree. + +The lwIP TCP/IP stack is maintained in the 'lwip' CVS module and +contributions (such as platform ports) are in the 'contrib' module. + +See doc/savannah.txt for details on CVS server access for users and +developers. + +Last night's CVS tar ball can be downloaded from: + http://savannah.gnu.org/cvs.backups/lwip.tar.gz [CHANGED - NEEDS FIXING] + +The current CVS trees are web-browsable: + http://savannah.nongnu.org/cgi-bin/viewcvs/lwip/lwip/ + http://savannah.nongnu.org/cgi-bin/viewcvs/lwip/contrib/ + +Submit patches and bugs via the lwIP project page: + http://savannah.nongnu.org/projects/lwip/ + + +DOCUMENTATION + +The original out-dated homepage of lwIP and Adam Dunkels' papers on +lwIP are at the official lwIP home page: + http://www.sics.se/~adam/lwip/ + +Self documentation of the source code is regularly extracted from the +current CVS sources and is available from this web page: + http://www.nongnu.org/lwip/ + +There is now a constantly growin wiki about lwIP at + http://lwip.wikia.com/wiki/LwIP_Wiki + +Also, there are mailing lists you can subscribe at + http://savannah.nongnu.org/mail/?group=lwip +plus searchable archives: + http://lists.nongnu.org/archive/html/lwip-users/ + http://lists.nongnu.org/archive/html/lwip-devel/ + +Reading Adam's papers, the files in docs/, browsing the source code +documentation and browsing the mailing list archives is a good way to +become familiar with the design of lwIP. + +Adam Dunkels +Leon Woestenberg + diff --git a/third_party/lwip-1.4.1/UPGRADING b/third_party/lwip-1.4.1/UPGRADING new file mode 100644 index 0000000..21676e1 --- /dev/null +++ b/third_party/lwip-1.4.1/UPGRADING @@ -0,0 +1,144 @@ +This file lists major changes between release versions that require +ports or applications to be changed. Use it to update a port or an +application written for an older version of lwIP to correctly work +with newer versions. + + +(CVS HEAD) + + * [Enter new changes just after this line - do not remove this line] + + ++ Application changes: + + * Replaced struct ip_addr by typedef ip_addr_t (struct ip_addr is kept for + compatibility to old applications, but will be removed in the future). + + * Renamed mem_realloc() to mem_trim() to prevent confusion with realloc() + + +++ Raw API: + * Changed the semantics of tcp_close() (since it was rather a + shutdown before): Now the application does *NOT* get any calls to the recv + callback (aside from NULL/closed) after calling tcp_close() + + * When calling tcp_abort() from a raw API TCP callback function, + make sure you return ERR_ABRT to prevent accessing unallocated memory. + (ERR_ABRT now means the applicaiton has called tcp_abort!) + + +++ Netconn API: + * Changed netconn_receive() and netconn_accept() to return + err_t, not a pointer to new data/netconn. + + +++ Socket API: + * LWIP_SO_RCVTIMEO: when accept() or recv() time out, they + now set errno to EWOULDBLOCK/EAGAIN, not ETIMEDOUT. + + * Added a minimal version of posix fctl() to have a + standardised way to set O_NONBLOCK for nonblocking sockets. + + +++ all APIs: + * correctly implemented SO(F)_REUSEADDR + + ++ Port changes + + +++ new files: + + * Added 4 new files: def.c, timers.c, timers.h, tcp_impl.h: + + * Moved stack-internal parts of tcp.h to tcp_impl.h, tcp.h now only contains + the actual application programmer's API + + * Separated timer implementation from sys.h/.c, moved to timers.h/.c; + Added timer implementation for NO_SYS==1, set NO_SYS_NO_TIMERS==1 if you + still want to use your own timer implementation for NO_SYS==0 (as before). + + +++ sys layer: + + * Converted mbox- and semaphore-functions to take pointers to sys_mbox_t/ + sys_sem_t; + + * Converted sys_mbox_new/sys_sem_new to take pointers and return err_t; + + * Added Mutex concept in sys_arch (define LWIP_COMPAT_MUTEX to let sys.h use + binary semaphores instead of mutexes - as before) + + +++ new options: + + * Don't waste memory when chaining segments, added option TCP_OVERSIZE to + prevent creating many small pbufs when calling tcp_write with many small + blocks of data. Instead, pbufs are allocated larger than needed and the + space is used for later calls to tcp_write. + + * Added LWIP_NETIF_TX_SINGLE_PBUF to always copy to try to create single pbufs + in tcp_write/udp_send. + + * Added an additional option LWIP_ETHERNET to support ethernet without ARP + (necessary for pure PPPoE) + + * Add MEMP_SEPARATE_POOLS to place memory pools in separate arrays. This may + be used to place these pools into user-defined memory by using external + declaration. + + * Added TCP_SNDQUEUELOWAT corresponding to TCP_SNDLOWAT + + +++ new pools: + + * Netdb uses a memp pool for allocating memory when getaddrinfo() is called, + so MEMP_NUM_NETDB has to be set accordingly. + + * DNS_LOCAL_HOSTLIST_IS_DYNAMIC uses a memp pool instead of the heap, so + MEMP_NUM_LOCALHOSTLIST has to be set accordingly. + + * Snmp-agent uses a memp pools instead of the heap, so MEMP_NUM_SNMP_* have + to be set accordingly. + + * PPPoE uses a MEMP pool instead of the heap, so MEMP_NUM_PPPOE_INTERFACES + has to be set accordingly + + * Integrated loopif into netif.c - loopif does not have to be created by the + port any more, just define LWIP_HAVE_LOOPIF to 1. + + * Added define LWIP_RAND() for lwip-wide randomization (needs to be defined + in cc.h, e.g. used by igmp) + + * Added printf-formatter X8_F to printf u8_t as hex + + * The heap now may be moved to user-defined memory by defining + LWIP_RAM_HEAP_POINTER as a void pointer to that memory's address + + * added autoip_set_struct() and dhcp_set_struct() to let autoip and dhcp work + with user-allocated structs instead of calling mem_malloc + + * Added const char* name to mem- and memp-stats for easier debugging. + + * Calculate the TCP/UDP checksum while copying to only fetch data once: + Define LWIP_CHKSUM_COPY to a memcpy-like function that returns the checksum + + * Added SO_REUSE_RXTOALL to pass received UDP broadcast/multicast packets to + more than one pcb. + + * Changed the semantics of ARP_QUEUEING==0: ARP_QUEUEING now cannot be turned + off any more, if this is set to 0, only one packet (the most recent one) is + queued (like demanded by RFC 1122). + + + ++ Major bugfixes/improvements + + * Implemented tcp_shutdown() to only shut down one end of a connection + * Implemented shutdown() at socket- and netconn-level + * Added errorset support to select() + improved select speed overhead + * Merged pppd to v2.3.11 (including some backported bugfixes from 2.4.x) + * Added timer implementation for NO_SYS==1 (may be disabled with NO_SYS_NO_TIMERS==1 + * Use macros defined in ip_addr.h to work with IP addresses + * Implemented many nonblocking socket/netconn functions + * Fixed ARP input processing: only add a new entry if a request was directed as us + * mem_realloc() to mem_trim() to prevent confusion with realloc() + * Some improvements for AutoIP (don't route/forward link-local addresses, don't break + existing connections when assigning a routable address) + * Correctly handle remote side overrunning our rcv_wnd in ooseq case + * Removed packing from ip_addr_t, the packed version is now only used in protocol headers + * Corrected PBUF_POOL_BUFSIZE for ports where ETH_PAD_SIZE > 0 + * Added support for static ARP table entries + +(STABLE-1.3.2) + + * initial version of this file diff --git a/third_party/lwip-1.4.1/apps/httpserver_raw/fs.c b/third_party/lwip-1.4.1/apps/httpserver_raw/fs.c new file mode 100644 index 0000000..a85a15e --- /dev/null +++ b/third_party/lwip-1.4.1/apps/httpserver_raw/fs.c @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#include "lwip/opt.h" +#include "lwip/def.h" +#include "fs.h" +#include "fsdata.h" +#include + +/** Set this to 1 to include "fsdata_custom.c" instead of "fsdata.c" for the + * file system (to prevent changing the file included in CVS) */ +#ifndef HTTPD_USE_CUSTUM_FSDATA +#define HTTPD_USE_CUSTUM_FSDATA 0 +#endif + +#if HTTPD_USE_CUSTUM_FSDATA +#include "fsdata_custom.c" +#else /* HTTPD_USE_CUSTUM_FSDATA */ +#include "fsdata.c" +#endif /* HTTPD_USE_CUSTUM_FSDATA */ + +/*-----------------------------------------------------------------------------------*/ +/* Define the number of open files that we can support. */ +#ifndef LWIP_MAX_OPEN_FILES +#define LWIP_MAX_OPEN_FILES 10 +#endif + +/* Define the file system memory allocation structure. */ +struct fs_table { + struct fs_file file; + u8_t inuse; +}; + +/* Allocate file system memory */ +struct fs_table fs_memory[LWIP_MAX_OPEN_FILES]; + +#if LWIP_HTTPD_CUSTOM_FILES +int fs_open_custom(struct fs_file *file, const char *name); +void fs_close_custom(struct fs_file *file); +#endif /* LWIP_HTTPD_CUSTOM_FILES */ + +/*-----------------------------------------------------------------------------------*/ +static struct fs_file * +fs_malloc(void) +{ + int i; + for(i = 0; i < LWIP_MAX_OPEN_FILES; i++) { + if(fs_memory[i].inuse == 0) { + fs_memory[i].inuse = 1; + return(&fs_memory[i].file); + } + } + return(NULL); +} + +/*-----------------------------------------------------------------------------------*/ +static void +fs_free(struct fs_file *file) +{ + int i; + for(i = 0; i < LWIP_MAX_OPEN_FILES; i++) { + if(&fs_memory[i].file == file) { + fs_memory[i].inuse = 0; + break; + } + } + return; +} + +/*-----------------------------------------------------------------------------------*/ +struct fs_file * +fs_open(const char *name) +{ + struct fs_file *file; + const struct fsdata_file *f; + + file = fs_malloc(); + if(file == NULL) { + return NULL; + } + +#if LWIP_HTTPD_CUSTOM_FILES + if(fs_open_custom(file, name)) { + file->is_custom_file = 1; + return file; + } + file->is_custom_file = 0; +#endif /* LWIP_HTTPD_CUSTOM_FILES */ + + for(f = FS_ROOT; f != NULL; f = f->next) { + if (!strcmp(name, (char *)f->name)) { + file->data = (const char *)f->data; + file->len = f->len; + file->index = f->len; + file->pextension = NULL; + file->http_header_included = f->http_header_included; +#if HTTPD_PRECALCULATED_CHECKSUM + file->chksum_count = f->chksum_count; + file->chksum = f->chksum; +#endif /* HTTPD_PRECALCULATED_CHECKSUM */ +#if LWIP_HTTPD_FILE_STATE + file->state = fs_state_init(file, name); +#endif /* #if LWIP_HTTPD_FILE_STATE */ + return file; + } + } + fs_free(file); + return NULL; +} + +/*-----------------------------------------------------------------------------------*/ +void +fs_close(struct fs_file *file) +{ +#if LWIP_HTTPD_CUSTOM_FILES + if (file->is_custom_file) { + fs_close_custom(file); + } +#endif /* LWIP_HTTPD_CUSTOM_FILES */ +#if LWIP_HTTPD_FILE_STATE + fs_state_free(file, file->state); +#endif /* #if LWIP_HTTPD_FILE_STATE */ + fs_free(file); +} +/*-----------------------------------------------------------------------------------*/ +int +fs_read(struct fs_file *file, char *buffer, int count) +{ + int read; + + if(file->index == file->len) { + return -1; + } + + read = file->len - file->index; + if(read > count) { + read = count; + } + + MEMCPY(buffer, (file->data + file->index), read); + file->index += read; + + return(read); +} +/*-----------------------------------------------------------------------------------*/ +int fs_bytes_left(struct fs_file *file) +{ + return file->len - file->index; +} diff --git a/third_party/lwip-1.4.1/apps/httpserver_raw/fs.h b/third_party/lwip-1.4.1/apps/httpserver_raw/fs.h new file mode 100644 index 0000000..458c356 --- /dev/null +++ b/third_party/lwip-1.4.1/apps/httpserver_raw/fs.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __FS_H__ +#define __FS_H__ + +#include "lwip/opt.h" + +/** Set this to 1 and provide the functions: + * - "int fs_open_custom(struct fs_file *file, const char *name)" + * Called first for every opened file to allow opening files + * that are not included in fsdata(_custom).c + * - "void fs_close_custom(struct fs_file *file)" + * Called to free resources allocated by fs_open_custom(). + */ +#ifndef LWIP_HTTPD_CUSTOM_FILES +#define LWIP_HTTPD_CUSTOM_FILES 0 +#endif + +/** Set this to 1 to include an application state argument per file + * that is opened. This allows to keep a state per connection/file. + */ +#ifndef LWIP_HTTPD_FILE_STATE +#define LWIP_HTTPD_FILE_STATE 0 +#endif + +/** HTTPD_PRECALCULATED_CHECKSUM==1: include precompiled checksums for + * predefined (MSS-sized) chunks of the files to prevent having to calculate + * the checksums at runtime. */ +#ifndef HTTPD_PRECALCULATED_CHECKSUM +#define HTTPD_PRECALCULATED_CHECKSUM 0 +#endif + +#if HTTPD_PRECALCULATED_CHECKSUM +struct fsdata_chksum { + u32_t offset; + u16_t chksum; + u16_t len; +}; +#endif /* HTTPD_PRECALCULATED_CHECKSUM */ + +struct fs_file { + const char *data; + int len; + int index; + void *pextension; +#if HTTPD_PRECALCULATED_CHECKSUM + const struct fsdata_chksum *chksum; + u16_t chksum_count; +#endif /* HTTPD_PRECALCULATED_CHECKSUM */ + u8_t http_header_included; +#if LWIP_HTTPD_CUSTOM_FILES + u8_t is_custom_file; +#endif /* LWIP_HTTPD_CUSTOM_FILES */ +#if LWIP_HTTPD_FILE_STATE + void *state; +#endif /* LWIP_HTTPD_FILE_STATE */ +}; + +struct fs_file *fs_open(const char *name); +void fs_close(struct fs_file *file); +int fs_read(struct fs_file *file, char *buffer, int count); +int fs_bytes_left(struct fs_file *file); + +#if LWIP_HTTPD_FILE_STATE +/** This user-defined function is called when a file is opened. */ +void *fs_state_init(struct fs_file *file, const char *name); +/** This user-defined function is called when a file is closed. */ +void fs_state_free(struct fs_file *file, void *state); +#endif /* #if LWIP_HTTPD_FILE_STATE */ + +#endif /* __FS_H__ */ diff --git a/third_party/lwip-1.4.1/apps/httpserver_raw/fsdata.c b/third_party/lwip-1.4.1/apps/httpserver_raw/fsdata.c new file mode 100644 index 0000000..81795b8 --- /dev/null +++ b/third_party/lwip-1.4.1/apps/httpserver_raw/fsdata.c @@ -0,0 +1,287 @@ +#include "fs.h" +#include "lwip/def.h" +#include "fsdata.h" + + +#define file_NULL (struct fsdata_file *) NULL + + +static const unsigned int dummy_align__img_sics_gif = 0; +static const unsigned char data__img_sics_gif[] = { +/* /img/sics.gif (14 chars) */ +0x2f,0x69,0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x00,0x00,0x00, + +/* HTTP header */ +/* "HTTP/1.0 200 OK +" (17 bytes) */ +0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d, +0x0a, +/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip) +" (63 bytes) */ +0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, +0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, +0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, +0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, +/* "Content-type: image/gif + +" (27 bytes) */ +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x69,0x6d, +0x61,0x67,0x65,0x2f,0x67,0x69,0x66,0x0d,0x0a,0x0d,0x0a, +/* raw file data (724 bytes) */ +0x47,0x49,0x46,0x38,0x39,0x61,0x46,0x00,0x22,0x00,0xa5,0x00,0x00,0xd9,0x2b,0x39, +0x6a,0x6a,0x6a,0xbf,0xbf,0xbf,0x93,0x93,0x93,0x0f,0x0f,0x0f,0xb0,0xb0,0xb0,0xa6, +0xa6,0xa6,0x80,0x80,0x80,0x76,0x76,0x76,0x1e,0x1e,0x1e,0x9d,0x9d,0x9d,0x2e,0x2e, +0x2e,0x49,0x49,0x49,0x54,0x54,0x54,0x8a,0x8a,0x8a,0x60,0x60,0x60,0xc6,0xa6,0x99, +0xbd,0xb5,0xb2,0xc2,0xab,0xa1,0xd9,0x41,0x40,0xd5,0x67,0x55,0xc0,0xb0,0xaa,0xd5, +0x5e,0x4e,0xd6,0x50,0x45,0xcc,0x93,0x7d,0xc8,0xa1,0x90,0xce,0x8b,0x76,0xd2,0x7b, +0x65,0xd1,0x84,0x6d,0xc9,0x99,0x86,0x3a,0x3a,0x3a,0x00,0x00,0x00,0xb8,0xb8,0xb8, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2c,0x00,0x00, +0x00,0x00,0x46,0x00,0x22,0x00,0x00,0x06,0xfe,0x40,0x90,0x70,0x48,0x2c,0x1a,0x8f, +0xc8,0xa4,0x72,0xc9,0x6c,0x3a,0x9f,0xd0,0xa8,0x74,0x4a,0xad,0x5a,0xaf,0xd8,0xac, +0x76,0xa9,0x40,0x04,0xbe,0x83,0xe2,0x60,0x3c,0x50,0x20,0x0d,0x8e,0x6f,0x00,0x31, +0x28,0x1c,0x0d,0x07,0xb5,0xc3,0x60,0x75,0x24,0x3e,0xf8,0xfc,0x87,0x11,0x06,0xe9, +0x3d,0x46,0x07,0x0b,0x7a,0x7a,0x7c,0x43,0x06,0x1e,0x84,0x78,0x0b,0x07,0x6e,0x51, +0x01,0x8a,0x84,0x08,0x7e,0x79,0x80,0x87,0x89,0x91,0x7a,0x93,0x0a,0x04,0x99,0x78, +0x96,0x4f,0x03,0x9e,0x79,0x01,0x94,0x9f,0x43,0x9c,0xa3,0xa4,0x05,0x77,0xa3,0xa0, +0x4e,0x98,0x79,0x0b,0x1e,0x83,0xa4,0xa6,0x1f,0x96,0x05,0x9d,0xaa,0x78,0x01,0x07, +0x84,0x04,0x1e,0x1e,0xbb,0xb8,0x51,0x84,0x0e,0x43,0x05,0x07,0x77,0xa5,0x7f,0x42, +0xb1,0xb2,0x01,0x63,0x08,0x0d,0xbb,0x01,0x0c,0x7a,0x0d,0x44,0x0e,0xd8,0xaf,0x4c, +0x05,0x7a,0x04,0x47,0x07,0x07,0xb7,0x80,0xa2,0xe1,0x7d,0x44,0x05,0x01,0x04,0x01, +0xd0,0xea,0x87,0x93,0x4f,0xe0,0x9a,0x49,0xce,0xd8,0x79,0x04,0x66,0x20,0x15,0x10, +0x10,0x11,0x92,0x29,0x80,0xb6,0xc0,0x91,0x15,0x45,0x1e,0x90,0x19,0x71,0x46,0xa8, +0x5c,0x04,0x0e,0x00,0x22,0x4e,0xe8,0x40,0x24,0x9f,0x3e,0x04,0x06,0xa7,0x58,0xd4, +0x93,0xa0,0x1c,0x91,0x3f,0xe8,0xf0,0x88,0x03,0xb1,0x21,0xa2,0x49,0x00,0x19,0x86, +0xfc,0x52,0x44,0xe0,0x01,0x9d,0x29,0x21,0x15,0x25,0x50,0xf7,0x67,0x25,0x1e,0x06, +0xfd,0x4e,0x9a,0xb4,0x90,0xac,0x15,0xfa,0xcb,0x52,0x53,0x1e,0x8c,0xf2,0xf8,0x07, +0x92,0x2d,0x08,0x3a,0x4d,0x12,0x49,0x95,0x49,0xdb,0x14,0x04,0xc4,0x14,0x85,0x29, +0xaa,0xe7,0x01,0x08,0xa4,0x49,0x01,0x14,0x51,0xe0,0x53,0x91,0xd5,0x29,0x06,0x1a, +0x64,0x02,0xf4,0xc7,0x81,0x9e,0x05,0x20,0x22,0x64,0xa5,0x30,0xae,0xab,0x9e,0x97, +0x53,0xd8,0xb9,0xfd,0x50,0xef,0x93,0x02,0x42,0x74,0x34,0xe8,0x9c,0x20,0x21,0xc9, +0x01,0x68,0x78,0xe6,0x55,0x29,0x20,0x56,0x4f,0x4c,0x40,0x51,0x71,0x82,0xc0,0x70, +0x21,0x22,0x85,0xbe,0x4b,0x1c,0x44,0x05,0xea,0xa4,0x01,0xbf,0x22,0xb5,0xf0,0x1c, +0x06,0x51,0x38,0x8f,0xe0,0x22,0xec,0x18,0xac,0x39,0x22,0xd4,0xd6,0x93,0x44,0x01, +0x32,0x82,0xc8,0xfc,0x61,0xb3,0x01,0x45,0x0c,0x2e,0x83,0x30,0xd0,0x0e,0x17,0x24, +0x0f,0x70,0x85,0x94,0xee,0x05,0x05,0x53,0x4b,0x32,0x1b,0x3f,0x98,0xd3,0x1d,0x29, +0x81,0xb0,0xae,0x1e,0x8c,0x7e,0x68,0xe0,0x60,0x5a,0x54,0x8f,0xb0,0x78,0x69,0x73, +0x06,0xa2,0x00,0x6b,0x57,0xca,0x3d,0x11,0x50,0xbd,0x04,0x30,0x4b,0x3a,0xd4,0xab, +0x5f,0x1f,0x9b,0x3d,0x13,0x74,0x27,0x88,0x3c,0x25,0xe0,0x17,0xbe,0x7a,0x79,0x45, +0x0d,0x0c,0xb0,0x8b,0xda,0x90,0xca,0x80,0x06,0x5d,0x17,0x60,0x1c,0x22,0x4c,0xd8, +0x57,0x22,0x06,0x20,0x00,0x98,0x07,0x08,0xe4,0x56,0x80,0x80,0x1c,0xc5,0xb7,0xc5, +0x82,0x0c,0x36,0xe8,0xe0,0x83,0x10,0x46,0x28,0xe1,0x84,0x14,0x56,0x68,0xa1,0x10, +0x41,0x00,0x00,0x3b,}; + +static const unsigned int dummy_align__404_html = 1; +static const unsigned char data__404_html[] = { +/* /404.html (10 chars) */ +0x2f,0x34,0x30,0x34,0x2e,0x68,0x74,0x6d,0x6c,0x00,0x00,0x00, + +/* HTTP header */ +/* "HTTP/1.0 404 File not found +" (29 bytes) */ +0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x34,0x30,0x34,0x20,0x46,0x69,0x6c, +0x65,0x20,0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x0d,0x0a, +/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip) +" (63 bytes) */ +0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, +0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, +0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, +0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, +/* "Content-type: text/html + +" (27 bytes) */ +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, +0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a, +/* raw file data (565 bytes) */ +0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74, +0x69,0x74,0x6c,0x65,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69, +0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50, +0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x3c,0x2f, +0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x3c,0x62,0x6f,0x64,0x79,0x20,0x62,0x67,0x63, +0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x77,0x68,0x69,0x74,0x65,0x22,0x20,0x74,0x65,0x78, +0x74,0x3d,0x22,0x62,0x6c,0x61,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22, +0x31,0x30,0x30,0x25,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74, +0x72,0x20,0x76,0x61,0x6c,0x69,0x67,0x6e,0x3d,0x22,0x74,0x6f,0x70,0x22,0x3e,0x3c, +0x74,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x30,0x22,0x3e,0x09,0x20, +0x20,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68, +0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73, +0x65,0x2f,0x22,0x3e,0x3c,0x69,0x6d,0x67,0x20,0x73,0x72,0x63,0x3d,0x22,0x2f,0x69, +0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x22,0x0d,0x0a,0x09,0x20, +0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,0x22,0x30,0x22,0x20,0x61,0x6c,0x74,0x3d, +0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x20,0x74,0x69,0x74,0x6c, +0x65,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x3e,0x3c,0x2f, +0x61,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x20,0x77,0x69, +0x64,0x74,0x68,0x3d,0x22,0x35,0x30,0x30,0x22,0x3e,0x09,0x20,0x20,0x0d,0x0a,0x09, +0x20,0x20,0x3c,0x68,0x31,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c, +0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49, +0x50,0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x20, +0x20,0x3c,0x68,0x32,0x3e,0x34,0x30,0x34,0x20,0x2d,0x20,0x50,0x61,0x67,0x65,0x20, +0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x3c,0x2f,0x68,0x32,0x3e,0x0d,0x0a, +0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x53,0x6f,0x72, +0x72,0x79,0x2c,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x67,0x65,0x20,0x79,0x6f,0x75, +0x20,0x61,0x72,0x65,0x20,0x72,0x65,0x71,0x75,0x65,0x73,0x74,0x69,0x6e,0x67,0x20, +0x77,0x61,0x73,0x20,0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x20,0x6f,0x6e, +0x20,0x74,0x68,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x65,0x72,0x76, +0x65,0x72,0x2e,0x20,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09, +0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x26,0x6e, +0x62,0x73,0x70,0x3b,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72, +0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65, +0x3e,0x0d,0x0a,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74, +0x6d,0x6c,0x3e,0x0d,0x0a,}; + +static const unsigned int dummy_align__index_html = 2; +static const unsigned char data__index_html[] = { +/* /index.html (12 chars) */ +0x2f,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68,0x74,0x6d,0x6c,0x00, + +/* HTTP header */ +/* "HTTP/1.0 200 OK +" (17 bytes) */ +0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d, +0x0a, +/* "Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip) +" (63 bytes) */ +0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33, +0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e, +0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70, +0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a, +/* "Content-type: text/html + +" (27 bytes) */ +0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65, +0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a, +/* raw file data (1583 bytes) */ +0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74, +0x69,0x74,0x6c,0x65,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69, +0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50, +0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x3c,0x2f, +0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x3c,0x62,0x6f,0x64,0x79,0x20,0x62,0x67,0x63, +0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x77,0x68,0x69,0x74,0x65,0x22,0x20,0x74,0x65,0x78, +0x74,0x3d,0x22,0x62,0x6c,0x61,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x20, +0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22, +0x31,0x30,0x30,0x25,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74, +0x72,0x20,0x76,0x61,0x6c,0x69,0x67,0x6e,0x3d,0x22,0x74,0x6f,0x70,0x22,0x3e,0x3c, +0x74,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x30,0x22,0x3e,0x09,0x20, +0x20,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68, +0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73, +0x65,0x2f,0x22,0x3e,0x3c,0x69,0x6d,0x67,0x20,0x73,0x72,0x63,0x3d,0x22,0x2f,0x69, +0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x22,0x0d,0x0a,0x09,0x20, +0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,0x22,0x30,0x22,0x20,0x61,0x6c,0x74,0x3d, +0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x20,0x74,0x69,0x74,0x6c, +0x65,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x3e,0x3c,0x2f, +0x61,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x20,0x77,0x69, +0x64,0x74,0x68,0x3d,0x22,0x35,0x30,0x30,0x22,0x3e,0x09,0x20,0x20,0x0d,0x0a,0x09, +0x20,0x20,0x3c,0x68,0x31,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c, +0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49, +0x50,0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x20, +0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x54,0x68,0x65,0x20,0x77, +0x65,0x62,0x20,0x70,0x61,0x67,0x65,0x20,0x79,0x6f,0x75,0x20,0x61,0x72,0x65,0x20, +0x77,0x61,0x74,0x63,0x68,0x69,0x6e,0x67,0x20,0x77,0x61,0x73,0x20,0x73,0x65,0x72, +0x76,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x73,0x69,0x6d,0x70,0x6c,0x65,0x20, +0x77,0x65,0x62,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x65,0x72,0x76,0x65,0x72, +0x20,0x72,0x75,0x6e,0x6e,0x69,0x6e,0x67,0x20,0x6f,0x6e,0x20,0x74,0x6f,0x70,0x20, +0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x6c,0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67, +0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x20,0x73,0x74,0x61,0x63,0x6b,0x20, +0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68, +0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73, +0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x6c, +0x77,0x49,0x50,0x3c,0x2f,0x61,0x3e,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70, +0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20, +0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20, +0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74, +0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50, +0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63, +0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61, +0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69, +0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e, +0x6b,0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68, +0x65,0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74, +0x75,0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20, +0x53,0x63,0x69,0x65,0x6e,0x63,0x65,0x20,0x62,0x75,0x74,0x20,0x6e,0x6f,0x77,0x20, +0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,0x67,0x20,0x61, +0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65, +0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,0x66,0x20,0x64, +0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20, +0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,0x6f,0x72,0x6c, +0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,0x20,0x69,0x74, +0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,0x77,0x49,0x50, +0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,0x75,0x72,0x72, +0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,0x6e,0x74,0x65, +0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,0x62,0x65,0x65, +0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,0x65,0x76,0x65, +0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,0x74,0x66,0x6f, +0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,0x74,0x69,0x6e, +0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,0x49,0x50,0x20, +0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,0x69,0x74,0x68, +0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,0x20,0x6f,0x72, +0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,0x6e,0x64,0x65, +0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c, +0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20, +0x20,0x20,0x54,0x68,0x65,0x20,0x66,0x6f,0x63,0x75,0x73,0x20,0x6f,0x66,0x20,0x74, +0x68,0x65,0x20,0x6c,0x77,0x49,0x50,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x20,0x69, +0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,0x20,0x69,0x73, +0x20,0x74,0x6f,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x0d,0x0a,0x09,0x20,0x20,0x20, +0x20,0x74,0x68,0x65,0x20,0x52,0x41,0x4d,0x20,0x75,0x73,0x61,0x67,0x65,0x20,0x77, +0x68,0x69,0x6c,0x65,0x20,0x73,0x74,0x69,0x6c,0x6c,0x20,0x68,0x61,0x76,0x69,0x6e, +0x67,0x20,0x61,0x20,0x66,0x75,0x6c,0x6c,0x20,0x73,0x63,0x61,0x6c,0x65,0x20,0x54, +0x43,0x50,0x2e,0x20,0x54,0x68,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6d, +0x61,0x6b,0x65,0x73,0x20,0x6c,0x77,0x49,0x50,0x20,0x73,0x75,0x69,0x74,0x61,0x62, +0x6c,0x65,0x20,0x66,0x6f,0x72,0x20,0x75,0x73,0x65,0x20,0x69,0x6e,0x20,0x65,0x6d, +0x62,0x65,0x64,0x64,0x65,0x64,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x20,0x77, +0x69,0x74,0x68,0x20,0x74,0x65,0x6e,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f, +0x66,0x20,0x6b,0x69,0x6c,0x6f,0x62,0x79,0x74,0x65,0x73,0x20,0x6f,0x66,0x20,0x66, +0x72,0x65,0x65,0x20,0x52,0x41,0x4d,0x20,0x61,0x6e,0x64,0x20,0x72,0x6f,0x6f,0x6d, +0x20,0x66,0x6f,0x72,0x20,0x61,0x72,0x6f,0x75,0x6e,0x64,0x20,0x34,0x30,0x20,0x6b, +0x69,0x6c,0x6f,0x62,0x79,0x74,0x65,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f, +0x66,0x20,0x63,0x6f,0x64,0x65,0x20,0x52,0x4f,0x4d,0x2e,0x0d,0x0a,0x09,0x20,0x20, +0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20, +0x20,0x20,0x20,0x4d,0x6f,0x72,0x65,0x20,0x69,0x6e,0x66,0x6f,0x72,0x6d,0x61,0x74, +0x69,0x6f,0x6e,0x20,0x61,0x62,0x6f,0x75,0x74,0x20,0x6c,0x77,0x49,0x50,0x20,0x63, +0x61,0x6e,0x20,0x62,0x65,0x20,0x66,0x6f,0x75,0x6e,0x64,0x20,0x61,0x74,0x20,0x74, +0x68,0x65,0x20,0x6c,0x77,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x6f, +0x6d,0x65,0x70,0x61,0x67,0x65,0x20,0x61,0x74,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20, +0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f, +0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61, +0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f, +0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61, +0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x3c,0x2f,0x61,0x3e,0x2e,0x0d,0x0a,0x09,0x20, +0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64, +0x3e,0x0d,0x0a,0x09,0x20,0x20,0x26,0x6e,0x62,0x73,0x70,0x3b,0x0d,0x0a,0x09,0x3c, +0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20, +0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65,0x3e,0x0d,0x0a,0x3c,0x2f,0x62,0x6f,0x64, +0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x0d,0x0a,}; + + + +const struct fsdata_file file__img_sics_gif[] = { { +file_NULL, +data__img_sics_gif, +data__img_sics_gif + 16, +sizeof(data__img_sics_gif) - 16, +1, +}}; + +const struct fsdata_file file__404_html[] = { { +file__img_sics_gif, +data__404_html, +data__404_html + 12, +sizeof(data__404_html) - 12, +1, +}}; + +const struct fsdata_file file__index_html[] = { { +file__404_html, +data__index_html, +data__index_html + 12, +sizeof(data__index_html) - 12, +1, +}}; + +#define FS_ROOT file__index_html +#define FS_NUMFILES 3 + diff --git a/third_party/lwip-1.4.1/apps/httpserver_raw/fsdata.h b/third_party/lwip-1.4.1/apps/httpserver_raw/fsdata.h new file mode 100644 index 0000000..ec26a9d --- /dev/null +++ b/third_party/lwip-1.4.1/apps/httpserver_raw/fsdata.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __FSDATA_H__ +#define __FSDATA_H__ + +#include "lwip/opt.h" +#include "fs.h" + +struct fsdata_file { + const struct fsdata_file *next; + const unsigned char *name; + const unsigned char *data; + int len; + u8_t http_header_included; +#if HTTPD_PRECALCULATED_CHECKSUM + u16_t chksum_count; + const struct fsdata_chksum *chksum; +#endif /* HTTPD_PRECALCULATED_CHECKSUM */ +}; + +#endif /* __FSDATA_H__ */ diff --git a/third_party/lwip-1.4.1/apps/httpserver_raw/httpd.c b/third_party/lwip-1.4.1/apps/httpserver_raw/httpd.c new file mode 100644 index 0000000..9e59267 --- /dev/null +++ b/third_party/lwip-1.4.1/apps/httpserver_raw/httpd.c @@ -0,0 +1,2184 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +/* This httpd supports for a + * rudimentary server-side-include facility which will replace tags of the form + * in any file whose extension is .shtml, .shtm or .ssi with + * strings provided by an include handler whose pointer is provided to the + * module via function http_set_ssi_handler(). + * Additionally, a simple common + * gateway interface (CGI) handling mechanism has been added to allow clients + * to hook functions to particular request URIs. + * + * To enable SSI support, define label LWIP_HTTPD_SSI in lwipopts.h. + * To enable CGI support, define label LWIP_HTTPD_CGI in lwipopts.h. + * + * By default, the server assumes that HTTP headers are already present in + * each file stored in the file system. By defining LWIP_HTTPD_DYNAMIC_HEADERS in + * lwipopts.h, this behavior can be changed such that the server inserts the + * headers automatically based on the extension of the file being served. If + * this mode is used, be careful to ensure that the file system image used + * does not already contain the header information. + * + * File system images without headers can be created using the makefsfile + * tool with the -h command line option. + * + * + * Notes about valid SSI tags + * -------------------------- + * + * The following assumptions are made about tags used in SSI markers: + * + * 1. No tag may contain '-' or whitespace characters within the tag name. + * 2. Whitespace is allowed between the tag leadin "". + * 3. The maximum tag name length is LWIP_HTTPD_MAX_TAG_NAME_LEN, currently 8 characters. + * + * Notes on CGI usage + * ------------------ + * + * The simple CGI support offered here works with GET method requests only + * and can handle up to 16 parameters encoded into the URI. The handler + * function may not write directly to the HTTP output but must return a + * filename that the HTTP server will send to the browser as a response to + * the incoming CGI request. + * + * @todo: + * - don't use mem_malloc() (for SSI/dynamic headers) + * - split too long functions into multiple smaller functions? + * - support more file types? + */ +#include "lwip/opt.h" +#include "lwip/stats.h" +#include "httpd.h" +#include "httpd_structs.h" +#include "lwip/tcp.h" +#include "fs.h" + +#include +#include + +#if LWIP_TCP + +#ifndef HTTPD_DEBUG +#define HTTPD_DEBUG LWIP_DBG_OFF +#endif + +/** Set this to 1 and add the next line to lwippools.h to use a memp pool + * for allocating struct http_state instead of the heap: + * + * LWIP_MEMPOOL(HTTPD_STATE, 20, 100, "HTTPD_STATE") + */ +#ifndef HTTPD_USE_MEM_POOL +#define HTTPD_USE_MEM_POOL 0 +#endif + +/** The server port for HTTPD to use */ +#ifndef HTTPD_SERVER_PORT +#define HTTPD_SERVER_PORT 80 +#endif + +/** Maximum retries before the connection is aborted/closed. + * - number of times pcb->poll is called -> default is 4*500ms = 2s; + * - reset when pcb->sent is called + */ +#ifndef HTTPD_MAX_RETRIES +#define HTTPD_MAX_RETRIES 4 +#endif + +/** The poll delay is X*500ms */ +#ifndef HTTPD_POLL_INTERVAL +#define HTTPD_POLL_INTERVAL 4 +#endif + +/** Priority for tcp pcbs created by HTTPD (very low by default). + * Lower priorities get killed first when running out of memroy. + */ +#ifndef HTTPD_TCP_PRIO +#define HTTPD_TCP_PRIO TCP_PRIO_MIN +#endif + +/** Set this to 1 to enabled timing each file sent */ +#ifndef LWIP_HTTPD_TIMING +#define LWIP_HTTPD_TIMING 0 +#endif +#ifndef HTTPD_DEBUG_TIMING +#define HTTPD_DEBUG_TIMING LWIP_DBG_OFF +#endif + +/** Set this to 1 on platforms where strnstr is not available */ +#ifndef LWIP_HTTPD_STRNSTR_PRIVATE +#define LWIP_HTTPD_STRNSTR_PRIVATE 1 +#endif + +/** Set this to one to show error pages when parsing a request fails instead + of simply closing the connection. */ +#ifndef LWIP_HTTPD_SUPPORT_EXTSTATUS +#define LWIP_HTTPD_SUPPORT_EXTSTATUS 0 +#endif + +/** Set this to 0 to drop support for HTTP/0.9 clients (to save some bytes) */ +#ifndef LWIP_HTTPD_SUPPORT_V09 +#define LWIP_HTTPD_SUPPORT_V09 1 +#endif + +/** Set this to 1 to support HTTP request coming in in multiple packets/pbufs */ +#ifndef LWIP_HTTPD_SUPPORT_REQUESTLIST +#define LWIP_HTTPD_SUPPORT_REQUESTLIST 0 +#endif + +#if LWIP_HTTPD_SUPPORT_REQUESTLIST +/** Number of rx pbufs to enqueue to parse an incoming request (up to the first + newline) */ +#ifndef LWIP_HTTPD_REQ_QUEUELEN +#define LWIP_HTTPD_REQ_QUEUELEN 10 +#endif + +/** Number of (TCP payload-) bytes (in pbufs) to enqueue to parse and incoming + request (up to the first double-newline) */ +#ifndef LWIP_HTTPD_REQ_BUFSIZE +#define LWIP_HTTPD_REQ_BUFSIZE LWIP_HTTPD_MAX_REQ_LENGTH +#endif + +/** Defines the maximum length of a HTTP request line (up to the first CRLF, + copied from pbuf into this a global buffer when pbuf- or packet-queues + are received - otherwise the input pbuf is used directly) */ +#ifndef LWIP_HTTPD_MAX_REQ_LENGTH +#define LWIP_HTTPD_MAX_REQ_LENGTH 1023 +#endif +#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ + +/** Maximum length of the filename to send as response to a POST request, + * filled in by the application when a POST is finished. + */ +#ifndef LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN +#define LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN 63 +#endif + +/** Set this to 0 to not send the SSI tag (default is on, so the tag will + * be sent in the HTML page */ +#ifndef LWIP_HTTPD_SSI_INCLUDE_TAG +#define LWIP_HTTPD_SSI_INCLUDE_TAG 1 +#endif + +/** Set this to 1 to call tcp_abort when tcp_close fails with memory error. + * This can be used to prevent consuming all memory in situations where the + * HTTP server has low priority compared to other communication. */ +#ifndef LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR +#define LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR 0 +#endif + +#ifndef true +#define true ((u8_t)1) +#endif + +#ifndef false +#define false ((u8_t)0) +#endif + +/** Minimum length for a valid HTTP/0.9 request: "GET /\r\n" -> 7 bytes */ +#define MIN_REQ_LEN 7 + +#define CRLF "\r\n" + +/** These defines check whether tcp_write has to copy data or not */ + +/** This was TI's check whether to let TCP copy data or not +#define HTTP_IS_DATA_VOLATILE(hs) ((hs->file < (char *)0x20000000) ? 0 : TCP_WRITE_FLAG_COPY)*/ +#ifndef HTTP_IS_DATA_VOLATILE +#if LWIP_HTTPD_SSI +/* Copy for SSI files, no copy for non-SSI files */ +#define HTTP_IS_DATA_VOLATILE(hs) ((hs)->tag_check ? TCP_WRITE_FLAG_COPY : 0) +#else /* LWIP_HTTPD_SSI */ +/** Default: don't copy if the data is sent from file-system directly */ +#define HTTP_IS_DATA_VOLATILE(hs) (((hs->file != NULL) && (hs->handle != NULL) && (hs->file == \ + (char*)hs->handle->data + hs->handle->len - hs->left)) \ + ? 0 : TCP_WRITE_FLAG_COPY) +#endif /* LWIP_HTTPD_SSI */ +#endif + +/** Default: headers are sent from ROM */ +#ifndef HTTP_IS_HDR_VOLATILE +#define HTTP_IS_HDR_VOLATILE(hs, ptr) 0 +#endif + +#if LWIP_HTTPD_SSI +/** Default: Tags are sent from struct http_state and are therefore volatile */ +#ifndef HTTP_IS_TAG_VOLATILE +#define HTTP_IS_TAG_VOLATILE(ptr) TCP_WRITE_FLAG_COPY +#endif +#endif /* LWIP_HTTPD_SSI */ + +typedef struct +{ + const char *name; + u8_t shtml; +} default_filename; + +const default_filename g_psDefaultFilenames[] = { + {"/index.shtml", true }, + {"/index.ssi", true }, + {"/index.shtm", true }, + {"/index.html", false }, + {"/index.htm", false } +}; + +#define NUM_DEFAULT_FILENAMES (sizeof(g_psDefaultFilenames) / \ + sizeof(default_filename)) + +#if LWIP_HTTPD_SUPPORT_REQUESTLIST +/** HTTP request is copied here from pbufs for simple parsing */ +static char httpd_req_buf[LWIP_HTTPD_MAX_REQ_LENGTH+1]; +#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ + +#if LWIP_HTTPD_SUPPORT_POST +/** Filename for response file to send when POST is finished */ +static char http_post_response_filename[LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN+1]; +#endif /* LWIP_HTTPD_SUPPORT_POST */ + +#if LWIP_HTTPD_DYNAMIC_HEADERS +/* The number of individual strings that comprise the headers sent before each + * requested file. + */ +#define NUM_FILE_HDR_STRINGS 3 +#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */ + +#if LWIP_HTTPD_SSI + +#define HTTPD_LAST_TAG_PART 0xFFFF + +const char * const g_pcSSIExtensions[] = { + ".shtml", ".shtm", ".ssi", ".xml" +}; + +#define NUM_SHTML_EXTENSIONS (sizeof(g_pcSSIExtensions) / sizeof(const char *)) + +enum tag_check_state { + TAG_NONE, /* Not processing an SSI tag */ + TAG_LEADIN, /* Tag lead in "" being processed */ + TAG_SENDING /* Sending tag replacement string */ +}; +#endif /* LWIP_HTTPD_SSI */ + +struct http_state { + struct fs_file *handle; + char *file; /* Pointer to first unsent byte in buf. */ + +#if LWIP_HTTPD_SUPPORT_REQUESTLIST + struct pbuf *req; +#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ + +#if LWIP_HTTPD_SSI || LWIP_HTTPD_DYNAMIC_HEADERS + char *buf; /* File read buffer. */ + int buf_len; /* Size of file read buffer, buf. */ +#endif /* LWIP_HTTPD_SSI || LWIP_HTTPD_DYNAMIC_HEADERS */ + u32_t left; /* Number of unsent bytes in buf. */ + u8_t retries; +#if LWIP_HTTPD_SSI + const char *parsed; /* Pointer to the first unparsed byte in buf. */ +#if !LWIP_HTTPD_SSI_INCLUDE_TAG + const char *tag_started;/* Poitner to the first opening '<' of the tag. */ +#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG */ + const char *tag_end; /* Pointer to char after the closing '>' of the tag. */ + u32_t parse_left; /* Number of unparsed bytes in buf. */ + u16_t tag_index; /* Counter used by tag parsing state machine */ + u16_t tag_insert_len; /* Length of insert in string tag_insert */ +#if LWIP_HTTPD_SSI_MULTIPART + u16_t tag_part; /* Counter passed to and changed by tag insertion function to insert multiple times */ +#endif /* LWIP_HTTPD_SSI_MULTIPART */ + u8_t tag_check; /* true if we are processing a .shtml file else false */ + u8_t tag_name_len; /* Length of the tag name in string tag_name */ + char tag_name[LWIP_HTTPD_MAX_TAG_NAME_LEN + 1]; /* Last tag name extracted */ + char tag_insert[LWIP_HTTPD_MAX_TAG_INSERT_LEN + 1]; /* Insert string for tag_name */ + enum tag_check_state tag_state; /* State of the tag processor */ +#endif /* LWIP_HTTPD_SSI */ +#if LWIP_HTTPD_CGI + char *params[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Params extracted from the request URI */ + char *param_vals[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Values for each extracted param */ +#endif /* LWIP_HTTPD_CGI */ +#if LWIP_HTTPD_DYNAMIC_HEADERS + const char *hdrs[NUM_FILE_HDR_STRINGS]; /* HTTP headers to be sent. */ + u16_t hdr_pos; /* The position of the first unsent header byte in the + current string */ + u16_t hdr_index; /* The index of the hdr string currently being sent. */ +#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */ +#if LWIP_HTTPD_TIMING + u32_t time_started; +#endif /* LWIP_HTTPD_TIMING */ +#if LWIP_HTTPD_SUPPORT_POST + u32_t post_content_len_left; +#if LWIP_HTTPD_POST_MANUAL_WND + u32_t unrecved_bytes; + struct tcp_pcb *pcb; + u8_t no_auto_wnd; +#endif /* LWIP_HTTPD_POST_MANUAL_WND */ +#endif /* LWIP_HTTPD_SUPPORT_POST*/ +}; + +static err_t http_find_file(struct http_state *hs, const char *uri, int is_09); +static err_t http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const char *uri); +static err_t http_poll(void *arg, struct tcp_pcb *pcb); + +#if LWIP_HTTPD_SSI +/* SSI insert handler function pointer. */ +tSSIHandler g_pfnSSIHandler = NULL; +int g_iNumTags = 0; +const char **g_ppcTags = NULL; + +#define LEN_TAG_LEAD_IN 5 +const char * const g_pcTagLeadIn = ""; +#endif /* LWIP_HTTPD_SSI */ + +#if LWIP_HTTPD_CGI +/* CGI handler information */ +const tCGI *g_pCGIs; +int g_iNumCGIs; +#endif /* LWIP_HTTPD_CGI */ + +#if LWIP_HTTPD_STRNSTR_PRIVATE +/** Like strstr but does not need 'buffer' to be NULL-terminated */ +static char* +strnstr(const char* buffer, const char* token, size_t n) +{ + const char* p; + int tokenlen = (int)strlen(token); + if (tokenlen == 0) { + return (char *)buffer; + } + for (p = buffer; *p && (p + tokenlen <= buffer + n); p++) { + if ((*p == *token) && (strncmp(p, token, tokenlen) == 0)) { + return (char *)p; + } + } + return NULL; +} +#endif /* LWIP_HTTPD_STRNSTR_PRIVATE */ + +/** Allocate a struct http_state. */ +static struct http_state* +http_state_alloc(void) +{ + struct http_state *ret; +#if HTTPD_USE_MEM_POOL + ret = (struct http_state *)memp_malloc(MEMP_HTTPD_STATE); +#else /* HTTPD_USE_MEM_POOL */ + ret = (struct http_state *)mem_malloc(sizeof(struct http_state)); +#endif /* HTTPD_USE_MEM_POOL */ + if (ret != NULL) { + /* Initialize the structure. */ + memset(ret, 0, sizeof(struct http_state)); +#if LWIP_HTTPD_DYNAMIC_HEADERS + /* Indicate that the headers are not yet valid */ + ret->hdr_index = NUM_FILE_HDR_STRINGS; +#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */ + } + return ret; +} + +/** Free a struct http_state. + * Also frees the file data if dynamic. + */ +static void +http_state_free(struct http_state *hs) +{ + if (hs != NULL) { + if(hs->handle) { +#if LWIP_HTTPD_TIMING + u32_t ms_needed = sys_now() - hs->time_started; + u32_t needed = LWIP_MAX(1, (ms_needed/100)); + LWIP_DEBUGF(HTTPD_DEBUG_TIMING, ("httpd: needed %"U32_F" ms to send file of %d bytes -> %"U32_F" bytes/sec\n", + ms_needed, hs->handle->len, ((((u32_t)hs->handle->len) * 10) / needed))); +#endif /* LWIP_HTTPD_TIMING */ + fs_close(hs->handle); + hs->handle = NULL; + } +#if LWIP_HTTPD_SSI || LWIP_HTTPD_DYNAMIC_HEADERS + if (hs->buf != NULL) { + mem_free(hs->buf); + hs->buf = NULL; + } +#endif /* LWIP_HTTPD_SSI || LWIP_HTTPD_DYNAMIC_HEADERS */ +#if HTTPD_USE_MEM_POOL + memp_free(MEMP_HTTPD_STATE, hs); +#else /* HTTPD_USE_MEM_POOL */ + mem_free(hs); +#endif /* HTTPD_USE_MEM_POOL */ + } +} + +/** Call tcp_write() in a loop trying smaller and smaller length + * + * @param pcb tcp_pcb to send + * @param ptr Data to send + * @param length Length of data to send (in/out: on return, contains the + * amount of data sent) + * @param apiflags directly passed to tcp_write + * @return the return value of tcp_write + */ +static err_t +http_write(struct tcp_pcb *pcb, const void* ptr, u16_t *length, u8_t apiflags) +{ + u16_t len; + err_t err; + LWIP_ASSERT("length != NULL", length != NULL); + len = *length; + do { + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Trying to send %d bytes\n", len)); + err = tcp_write(pcb, ptr, len, apiflags); + if (err == ERR_MEM) { + if ((tcp_sndbuf(pcb) == 0) || + (tcp_sndqueuelen(pcb) >= TCP_SND_QUEUELEN)) { + /* no need to try smaller sizes */ + len = 1; + } else { + len /= 2; + } + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, + ("Send failed, trying less (%d bytes)\n", len)); + } + } while ((err == ERR_MEM) && (len > 1)); + + if (err == ERR_OK) { + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Sent %d bytes\n", len)); + } else { + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Send failed with err %d (\"%s\")\n", err, lwip_strerr(err))); + } + + *length = len; + return err; +} + +/** + * The connection shall be actively closed. + * Reset the sent- and recv-callbacks. + * + * @param pcb the tcp pcb to reset callbacks + * @param hs connection state to free + */ +static err_t +http_close_conn(struct tcp_pcb *pcb, struct http_state *hs) +{ + err_t err; + LWIP_DEBUGF(HTTPD_DEBUG, ("Closing connection %p\n", (void*)pcb)); + +#if LWIP_HTTPD_SUPPORT_POST + if (hs != NULL) { + if ((hs->post_content_len_left != 0) +#if LWIP_HTTPD_POST_MANUAL_WND + || ((hs->no_auto_wnd != 0) && (hs->unrecved_bytes != 0)) +#endif /* LWIP_HTTPD_POST_MANUAL_WND */ + ) { + /* make sure the post code knows that the connection is closed */ + http_post_response_filename[0] = 0; + httpd_post_finished(hs, http_post_response_filename, LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN); + } + } +#endif /* LWIP_HTTPD_SUPPORT_POST*/ + + + tcp_arg(pcb, NULL); + tcp_recv(pcb, NULL); + tcp_err(pcb, NULL); + tcp_poll(pcb, NULL, 0); + tcp_sent(pcb, NULL); + if(hs != NULL) { + http_state_free(hs); + } + + err = tcp_close(pcb); + if (err != ERR_OK) { + LWIP_DEBUGF(HTTPD_DEBUG, ("Error %d closing %p\n", err, (void*)pcb)); + /* error closing, try again later in poll */ + tcp_poll(pcb, http_poll, HTTPD_POLL_INTERVAL); + } + return err; +} +#if LWIP_HTTPD_CGI +/** + * Extract URI parameters from the parameter-part of an URI in the form + * "test.cgi?x=y" @todo: better explanation! + * Pointers to the parameters are stored in hs->param_vals. + * + * @param hs http connection state + * @param params pointer to the NULL-terminated parameter string from the URI + * @return number of parameters extracted + */ +static int +extract_uri_parameters(struct http_state *hs, char *params) +{ + char *pair; + char *equals; + int loop; + + /* If we have no parameters at all, return immediately. */ + if(!params || (params[0] == '\0')) { + return(0); + } + + /* Get a pointer to our first parameter */ + pair = params; + + /* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the + * remainder (if any) */ + for(loop = 0; (loop < LWIP_HTTPD_MAX_CGI_PARAMETERS) && pair; loop++) { + + /* Save the name of the parameter */ + hs->params[loop] = pair; + + /* Remember the start of this name=value pair */ + equals = pair; + + /* Find the start of the next name=value pair and replace the delimiter + * with a 0 to terminate the previous pair string. */ + pair = strchr(pair, '&'); + if(pair) { + *pair = '\0'; + pair++; + } else { + /* We didn't find a new parameter so find the end of the URI and + * replace the space with a '\0' */ + pair = strchr(equals, ' '); + if(pair) { + *pair = '\0'; + } + + /* Revert to NULL so that we exit the loop as expected. */ + pair = NULL; + } + + /* Now find the '=' in the previous pair, replace it with '\0' and save + * the parameter value string. */ + equals = strchr(equals, '='); + if(equals) { + *equals = '\0'; + hs->param_vals[loop] = equals + 1; + } else { + hs->param_vals[loop] = NULL; + } + } + + return loop; +} +#endif /* LWIP_HTTPD_CGI */ + +#if LWIP_HTTPD_SSI +/** + * Insert a tag (found in an shtml in the form of "" into the file. + * The tag's name is stored in hs->tag_name (NULL-terminated), the replacement + * should be written to hs->tag_insert (up to a length of LWIP_HTTPD_MAX_TAG_INSERT_LEN). + * The amount of data written is stored to hs->tag_insert_len. + * + * @todo: return tag_insert_len - maybe it can be removed from struct http_state? + * + * @param hs http connection state + */ +static void +get_tag_insert(struct http_state *hs) +{ + int loop; + size_t len; +#if LWIP_HTTPD_SSI_MULTIPART + u16_t current_tag_part = hs->tag_part; + hs->tag_part = HTTPD_LAST_TAG_PART; +#endif /* LWIP_HTTPD_SSI_MULTIPART */ + + if(g_pfnSSIHandler && g_ppcTags && g_iNumTags) { + + /* Find this tag in the list we have been provided. */ + for(loop = 0; loop < g_iNumTags; loop++) { + if(strcmp(hs->tag_name, g_ppcTags[loop]) == 0) { + hs->tag_insert_len = g_pfnSSIHandler(loop, hs->tag_insert, + LWIP_HTTPD_MAX_TAG_INSERT_LEN +#if LWIP_HTTPD_SSI_MULTIPART + , current_tag_part, &hs->tag_part +#endif /* LWIP_HTTPD_SSI_MULTIPART */ +#if LWIP_HTTPD_FILE_STATE + , hs->handle->state +#endif /* LWIP_HTTPD_FILE_STATE */ + ); + return; + } + } + } + + /* If we drop out, we were asked to serve a page which contains tags that + * we don't have a handler for. Merely echo back the tags with an error + * marker. */ +#define UNKNOWN_TAG1_TEXT "***UNKNOWN TAG " +#define UNKNOWN_TAG1_LEN 18 +#define UNKNOWN_TAG2_TEXT "***" +#define UNKNOWN_TAG2_LEN 7 + len = LWIP_MIN(strlen(hs->tag_name), + LWIP_HTTPD_MAX_TAG_INSERT_LEN - (UNKNOWN_TAG1_LEN + UNKNOWN_TAG2_LEN)); + MEMCPY(hs->tag_insert, UNKNOWN_TAG1_TEXT, UNKNOWN_TAG1_LEN); + MEMCPY(&hs->tag_insert[UNKNOWN_TAG1_LEN], hs->tag_name, len); + MEMCPY(&hs->tag_insert[UNKNOWN_TAG1_LEN + len], UNKNOWN_TAG2_TEXT, UNKNOWN_TAG2_LEN); + hs->tag_insert[UNKNOWN_TAG1_LEN + len + UNKNOWN_TAG2_LEN] = 0; + + len = strlen(hs->tag_insert); + LWIP_ASSERT("len <= 0xffff", len <= 0xffff); + hs->tag_insert_len = (u16_t)len; +} +#endif /* LWIP_HTTPD_SSI */ + +#if LWIP_HTTPD_DYNAMIC_HEADERS +/** + * Generate the relevant HTTP headers for the given filename and write + * them into the supplied buffer. + */ +static void +get_http_headers(struct http_state *pState, char *pszURI) +{ + unsigned int iLoop; + char *pszWork; + char *pszExt; + char *pszVars; + + /* Ensure that we initialize the loop counter. */ + iLoop = 0; + + /* In all cases, the second header we send is the server identification + so set it here. */ + pState->hdrs[1] = g_psHTTPHeaderStrings[HTTP_HDR_SERVER]; + + /* Is this a normal file or the special case we use to send back the + default "404: Page not found" response? */ + if (pszURI == NULL) { + pState->hdrs[0] = g_psHTTPHeaderStrings[HTTP_HDR_NOT_FOUND]; + pState->hdrs[2] = g_psHTTPHeaderStrings[DEFAULT_404_HTML]; + + /* Set up to send the first header string. */ + pState->hdr_index = 0; + pState->hdr_pos = 0; + return; + } else { + /* We are dealing with a particular filename. Look for one other + special case. We assume that any filename with "404" in it must be + indicative of a 404 server error whereas all other files require + the 200 OK header. */ + if (strstr(pszURI, "404")) { + pState->hdrs[0] = g_psHTTPHeaderStrings[HTTP_HDR_NOT_FOUND]; + } else if (strstr(pszURI, "400")) { + pState->hdrs[0] = g_psHTTPHeaderStrings[HTTP_HDR_BAD_REQUEST]; + } else if (strstr(pszURI, "501")) { + pState->hdrs[0] = g_psHTTPHeaderStrings[HTTP_HDR_NOT_IMPL]; + } else { + pState->hdrs[0] = g_psHTTPHeaderStrings[HTTP_HDR_OK]; + } + + /* Determine if the URI has any variables and, if so, temporarily remove + them. */ + pszVars = strchr(pszURI, '?'); + if(pszVars) { + *pszVars = '\0'; + } + + /* Get a pointer to the file extension. We find this by looking for the + last occurrence of "." in the filename passed. */ + pszExt = NULL; + pszWork = strchr(pszURI, '.'); + while(pszWork) { + pszExt = pszWork + 1; + pszWork = strchr(pszExt, '.'); + } + + /* Now determine the content type and add the relevant header for that. */ + for(iLoop = 0; (iLoop < NUM_HTTP_HEADERS) && pszExt; iLoop++) { + /* Have we found a matching extension? */ + if(!strcmp(g_psHTTPHeaders[iLoop].extension, pszExt)) { + pState->hdrs[2] = + g_psHTTPHeaderStrings[g_psHTTPHeaders[iLoop].headerIndex]; + break; + } + } + + /* Reinstate the parameter marker if there was one in the original URI. */ + if(pszVars) { + *pszVars = '?'; + } + } + + /* Does the URL passed have any file extension? If not, we assume it + is a special-case URL used for control state notification and we do + not send any HTTP headers with the response. */ + if(!pszExt) { + /* Force the header index to a value indicating that all headers + have already been sent. */ + pState->hdr_index = NUM_FILE_HDR_STRINGS; + } else { + /* Did we find a matching extension? */ + if(iLoop == NUM_HTTP_HEADERS) { + /* No - use the default, plain text file type. */ + pState->hdrs[2] = g_psHTTPHeaderStrings[HTTP_HDR_DEFAULT_TYPE]; + } + + /* Set up to send the first header string. */ + pState->hdr_index = 0; + pState->hdr_pos = 0; + } +} +#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */ + +/** + * Try to send more data on this pcb. + * + * @param pcb the pcb to send data + * @param hs connection state + */ +static u8_t +http_send_data(struct tcp_pcb *pcb, struct http_state *hs) +{ + err_t err; + u16_t len; + u16_t mss; + u8_t data_to_send = false; +#if LWIP_HTTPD_DYNAMIC_HEADERS + u16_t hdrlen, sendlen; +#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */ + + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_send_data: pcb=%p hs=%p left=%d\n", (void*)pcb, + (void*)hs, hs != NULL ? hs->left : 0)); + +#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND + if (hs->unrecved_bytes != 0) { + return 0; + } +#endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */ + +#if LWIP_HTTPD_DYNAMIC_HEADERS + /* If we were passed a NULL state structure pointer, ignore the call. */ + if (hs == NULL) { + return 0; + } + + /* Assume no error until we find otherwise */ + err = ERR_OK; + + /* Do we have any more header data to send for this file? */ + if(hs->hdr_index < NUM_FILE_HDR_STRINGS) { + /* How much data can we send? */ + len = tcp_sndbuf(pcb); + sendlen = len; + + while(len && (hs->hdr_index < NUM_FILE_HDR_STRINGS) && sendlen) { + const void *ptr; + u16_t old_sendlen; + /* How much do we have to send from the current header? */ + hdrlen = (u16_t)strlen(hs->hdrs[hs->hdr_index]); + + /* How much of this can we send? */ + sendlen = (len < (hdrlen - hs->hdr_pos)) ? len : (hdrlen - hs->hdr_pos); + + /* Send this amount of data or as much as we can given memory + * constraints. */ + ptr = (const void *)(hs->hdrs[hs->hdr_index] + hs->hdr_pos); + old_sendlen = sendlen; + err = http_write(pcb, ptr, &sendlen, HTTP_IS_HDR_VOLATILE(hs, ptr)); + if ((err == ERR_OK) && (old_sendlen != sendlen)) { + /* Remember that we added some more data to be transmitted. */ + data_to_send = true; + } else if (err != ERR_OK) { + /* special case: http_write does not try to send 1 byte */ + sendlen = 0; + } + + /* Fix up the header position for the next time round. */ + hs->hdr_pos += sendlen; + len -= sendlen; + + /* Have we finished sending this string? */ + if(hs->hdr_pos == hdrlen) { + /* Yes - move on to the next one */ + hs->hdr_index++; + hs->hdr_pos = 0; + } + } + + /* If we get here and there are still header bytes to send, we send + * the header information we just wrote immediately. If there are no + * more headers to send, but we do have file data to send, drop through + * to try to send some file data too. */ + if((hs->hdr_index < NUM_FILE_HDR_STRINGS) || !hs->file) { + LWIP_DEBUGF(HTTPD_DEBUG, ("tcp_output\n")); + return 1; + } + } +#else /* LWIP_HTTPD_DYNAMIC_HEADERS */ + /* Assume no error until we find otherwise */ + err = ERR_OK; +#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */ + + /* Have we run out of file data to send? If so, we need to read the next + * block from the file. */ + if (hs->left == 0) { +#if LWIP_HTTPD_SSI || LWIP_HTTPD_DYNAMIC_HEADERS + int count; +#endif /* LWIP_HTTPD_SSI || LWIP_HTTPD_DYNAMIC_HEADERS */ + + /* Do we have a valid file handle? */ + if (hs->handle == NULL) { + /* No - close the connection. */ + http_close_conn(pcb, hs); + return 0; + } + if (fs_bytes_left(hs->handle) <= 0) { + /* We reached the end of the file so this request is done. + * @todo: don't close here for HTTP/1.1? */ + LWIP_DEBUGF(HTTPD_DEBUG, ("End of file.\n")); + http_close_conn(pcb, hs); + return 0; + } +#if LWIP_HTTPD_SSI || LWIP_HTTPD_DYNAMIC_HEADERS + /* Do we already have a send buffer allocated? */ + if(hs->buf) { + /* Yes - get the length of the buffer */ + count = hs->buf_len; + } else { + /* We don't have a send buffer so allocate one up to 2mss bytes long. */ + count = 2 * tcp_mss(pcb); + do { + hs->buf = (char*)mem_malloc((mem_size_t)count); + if (hs->buf != NULL) { + hs->buf_len = count; + break; + } + count = count / 2; + } while (count > 100); + + /* Did we get a send buffer? If not, return immediately. */ + if (hs->buf == NULL) { + LWIP_DEBUGF(HTTPD_DEBUG, ("No buff\n")); + return 0; + } + } + + /* Read a block of data from the file. */ + LWIP_DEBUGF(HTTPD_DEBUG, ("Trying to read %d bytes.\n", count)); + + count = fs_read(hs->handle, hs->buf, count); + if(count < 0) { + /* We reached the end of the file so this request is done. + * @todo: don't close here for HTTP/1.1? */ + LWIP_DEBUGF(HTTPD_DEBUG, ("End of file.\n")); + http_close_conn(pcb, hs); + return 1; + } + + /* Set up to send the block of data we just read */ + LWIP_DEBUGF(HTTPD_DEBUG, ("Read %d bytes.\n", count)); + hs->left = count; + hs->file = hs->buf; +#if LWIP_HTTPD_SSI + hs->parse_left = count; + hs->parsed = hs->buf; +#endif /* LWIP_HTTPD_SSI */ +#else /* LWIP_HTTPD_SSI || LWIP_HTTPD_DYNAMIC_HEADERS */ + LWIP_ASSERT("SSI and DYNAMIC_HEADERS turned off but eof not reached", 0); +#endif /* LWIP_HTTPD_SSI || LWIP_HTTPD_DYNAMIC_HEADERS */ + } + +#if LWIP_HTTPD_SSI + if(!hs->tag_check) { +#endif /* LWIP_HTTPD_SSI */ + /* We are not processing an SHTML file so no tag checking is necessary. + * Just send the data as we received it from the file. */ + + /* We cannot send more data than space available in the send + buffer. */ + if (tcp_sndbuf(pcb) < hs->left) { + len = tcp_sndbuf(pcb); + } else { + len = (u16_t)hs->left; + LWIP_ASSERT("hs->left did not fit into u16_t!", (len == hs->left)); + } + mss = tcp_mss(pcb); + if(len > (2 * mss)) { + len = 2 * mss; + } + + err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs)); + if (err == ERR_OK) { + data_to_send = true; + hs->file += len; + hs->left -= len; + } +#if LWIP_HTTPD_SSI + } else { + /* We are processing an SHTML file so need to scan for tags and replace + * them with insert strings. We need to be careful here since a tag may + * straddle the boundary of two blocks read from the file and we may also + * have to split the insert string between two tcp_write operations. */ + + /* How much data could we send? */ + len = tcp_sndbuf(pcb); + + /* Do we have remaining data to send before parsing more? */ + if(hs->parsed > hs->file) { + /* We cannot send more data than space available in the send + buffer. */ + if (tcp_sndbuf(pcb) < (hs->parsed - hs->file)) { + len = tcp_sndbuf(pcb); + } else { + LWIP_ASSERT("Data size does not fit into u16_t!", + (hs->parsed - hs->file) <= 0xffff); + len = (u16_t)(hs->parsed - hs->file); + } + mss = tcp_mss(pcb); + if(len > (2 * mss)) { + len = 2 * mss; + } + + err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs)); + if (err == ERR_OK) { + data_to_send = true; + hs->file += len; + hs->left -= len; + } + + /* If the send buffer is full, return now. */ + if(tcp_sndbuf(pcb) == 0) { + return data_to_send; + } + } + + LWIP_DEBUGF(HTTPD_DEBUG, ("State %d, %d left\n", hs->tag_state, hs->parse_left)); + + /* We have sent all the data that was already parsed so continue parsing + * the buffer contents looking for SSI tags. */ + while((hs->parse_left) && (err == ERR_OK)) { + /* @todo: somewhere in this loop, 'len' should grow again... */ + if (len == 0) { + return data_to_send; + } + switch(hs->tag_state) { + case TAG_NONE: + /* We are not currently processing an SSI tag so scan for the + * start of the lead-in marker. */ + if(*hs->parsed == g_pcTagLeadIn[0]) { + /* We found what could be the lead-in for a new tag so change + * state appropriately. */ + hs->tag_state = TAG_LEADIN; + hs->tag_index = 1; +#if !LWIP_HTTPD_SSI_INCLUDE_TAG + hs->tag_started = hs->parsed; +#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG */ + } + + /* Move on to the next character in the buffer */ + hs->parse_left--; + hs->parsed++; + break; + + case TAG_LEADIN: + /* We are processing the lead-in marker, looking for the start of + * the tag name. */ + + /* Have we reached the end of the leadin? */ + if(hs->tag_index == LEN_TAG_LEAD_IN) { + hs->tag_index = 0; + hs->tag_state = TAG_FOUND; + } else { + /* Have we found the next character we expect for the tag leadin? */ + if(*hs->parsed == g_pcTagLeadIn[hs->tag_index]) { + /* Yes - move to the next one unless we have found the complete + * leadin, in which case we start looking for the tag itself */ + hs->tag_index++; + } else { + /* We found an unexpected character so this is not a tag. Move + * back to idle state. */ + hs->tag_state = TAG_NONE; + } + + /* Move on to the next character in the buffer */ + hs->parse_left--; + hs->parsed++; + } + break; + + case TAG_FOUND: + /* We are reading the tag name, looking for the start of the + * lead-out marker and removing any whitespace found. */ + + /* Remove leading whitespace between the tag leading and the first + * tag name character. */ + if((hs->tag_index == 0) && ((*hs->parsed == ' ') || + (*hs->parsed == '\t') || (*hs->parsed == '\n') || + (*hs->parsed == '\r'))) { + /* Move on to the next character in the buffer */ + hs->parse_left--; + hs->parsed++; + break; + } + + /* Have we found the end of the tag name? This is signalled by + * us finding the first leadout character or whitespace */ + if((*hs->parsed == g_pcTagLeadOut[0]) || + (*hs->parsed == ' ') || (*hs->parsed == '\t') || + (*hs->parsed == '\n') || (*hs->parsed == '\r')) { + + if(hs->tag_index == 0) { + /* We read a zero length tag so ignore it. */ + hs->tag_state = TAG_NONE; + } else { + /* We read a non-empty tag so go ahead and look for the + * leadout string. */ + hs->tag_state = TAG_LEADOUT; + LWIP_ASSERT("hs->tag_index <= 0xff", hs->tag_index <= 0xff); + hs->tag_name_len = (u8_t)hs->tag_index; + hs->tag_name[hs->tag_index] = '\0'; + if(*hs->parsed == g_pcTagLeadOut[0]) { + hs->tag_index = 1; + } else { + hs->tag_index = 0; + } + } + } else { + /* This character is part of the tag name so save it */ + if(hs->tag_index < LWIP_HTTPD_MAX_TAG_NAME_LEN) { + hs->tag_name[hs->tag_index++] = *hs->parsed; + } else { + /* The tag was too long so ignore it. */ + hs->tag_state = TAG_NONE; + } + } + + /* Move on to the next character in the buffer */ + hs->parse_left--; + hs->parsed++; + + break; + + /* We are looking for the end of the lead-out marker. */ + case TAG_LEADOUT: + /* Remove leading whitespace between the tag leading and the first + * tag leadout character. */ + if((hs->tag_index == 0) && ((*hs->parsed == ' ') || + (*hs->parsed == '\t') || (*hs->parsed == '\n') || + (*hs->parsed == '\r'))) { + /* Move on to the next character in the buffer */ + hs->parse_left--; + hs->parsed++; + break; + } + + /* Have we found the next character we expect for the tag leadout? */ + if(*hs->parsed == g_pcTagLeadOut[hs->tag_index]) { + /* Yes - move to the next one unless we have found the complete + * leadout, in which case we need to call the client to process + * the tag. */ + + /* Move on to the next character in the buffer */ + hs->parse_left--; + hs->parsed++; + + if(hs->tag_index == (LEN_TAG_LEAD_OUT - 1)) { + /* Call the client to ask for the insert string for the + * tag we just found. */ +#if LWIP_HTTPD_SSI_MULTIPART + hs->tag_part = 0; /* start with tag part 0 */ +#endif /* LWIP_HTTPD_SSI_MULTIPART */ + get_tag_insert(hs); + + /* Next time through, we are going to be sending data + * immediately, either the end of the block we start + * sending here or the insert string. */ + hs->tag_index = 0; + hs->tag_state = TAG_SENDING; + hs->tag_end = hs->parsed; +#if !LWIP_HTTPD_SSI_INCLUDE_TAG + hs->parsed = hs->tag_started; +#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/ + + /* If there is any unsent data in the buffer prior to the + * tag, we need to send it now. */ + if (hs->tag_end > hs->file) { + /* How much of the data can we send? */ +#if LWIP_HTTPD_SSI_INCLUDE_TAG + if(len > hs->tag_end - hs->file) { + len = (u16_t)(hs->tag_end - hs->file); + } +#else /* LWIP_HTTPD_SSI_INCLUDE_TAG*/ + if(len > hs->tag_started - hs->file) { + /* we would include the tag in sending */ + len = (u16_t)(hs->tag_started - hs->file); + } +#endif /* LWIP_HTTPD_SSI_INCLUDE_TAG*/ + + err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs)); + if (err == ERR_OK) { + data_to_send = true; +#if !LWIP_HTTPD_SSI_INCLUDE_TAG + if(hs->tag_started <= hs->file) { + /* pretend to have sent the tag, too */ + len += hs->tag_end - hs->tag_started; + } +#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/ + hs->file += len; + hs->left -= len; + } + } + } else { + hs->tag_index++; + } + } else { + /* We found an unexpected character so this is not a tag. Move + * back to idle state. */ + hs->parse_left--; + hs->parsed++; + hs->tag_state = TAG_NONE; + } + break; + + /* + * We have found a valid tag and are in the process of sending + * data as a result of that discovery. We send either remaining data + * from the file prior to the insert point or the insert string itself. + */ + case TAG_SENDING: + /* Do we have any remaining file data to send from the buffer prior + * to the tag? */ + if(hs->tag_end > hs->file) { + /* How much of the data can we send? */ +#if LWIP_HTTPD_SSI_INCLUDE_TAG + if(len > hs->tag_end - hs->file) { + len = (u16_t)(hs->tag_end - hs->file); + } +#else /* LWIP_HTTPD_SSI_INCLUDE_TAG*/ + LWIP_ASSERT("hs->started >= hs->file", hs->tag_started >= hs->file); + if (len > hs->tag_started - hs->file) { + /* we would include the tag in sending */ + len = (u16_t)(hs->tag_started - hs->file); + } +#endif /* LWIP_HTTPD_SSI_INCLUDE_TAG*/ + if (len != 0) { + err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs)); + } else { + err = ERR_OK; + } + if (err == ERR_OK) { + data_to_send = true; +#if !LWIP_HTTPD_SSI_INCLUDE_TAG + if(hs->tag_started <= hs->file) { + /* pretend to have sent the tag, too */ + len += hs->tag_end - hs->tag_started; + } +#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/ + hs->file += len; + hs->left -= len; + } + } else { +#if LWIP_HTTPD_SSI_MULTIPART + if(hs->tag_index >= hs->tag_insert_len) { + /* Did the last SSIHandler have more to send? */ + if (hs->tag_part != HTTPD_LAST_TAG_PART) { + /* If so, call it again */ + hs->tag_index = 0; + get_tag_insert(hs); + } + } +#endif /* LWIP_HTTPD_SSI_MULTIPART */ + + /* Do we still have insert data left to send? */ + if(hs->tag_index < hs->tag_insert_len) { + /* We are sending the insert string itself. How much of the + * insert can we send? */ + if(len > (hs->tag_insert_len - hs->tag_index)) { + len = (hs->tag_insert_len - hs->tag_index); + } + + /* Note that we set the copy flag here since we only have a + * single tag insert buffer per connection. If we don't do + * this, insert corruption can occur if more than one insert + * is processed before we call tcp_output. */ + err = http_write(pcb, &(hs->tag_insert[hs->tag_index]), &len, + HTTP_IS_TAG_VOLATILE(hs)); + if (err == ERR_OK) { + data_to_send = true; + hs->tag_index += len; + /* Don't return here: keep on sending data */ + } + } else { + /* We have sent all the insert data so go back to looking for + * a new tag. */ + LWIP_DEBUGF(HTTPD_DEBUG, ("Everything sent.\n")); + hs->tag_index = 0; + hs->tag_state = TAG_NONE; +#if !LWIP_HTTPD_SSI_INCLUDE_TAG + hs->parsed = hs->tag_end; +#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/ + } + break; + } + } + } + + /* If we drop out of the end of the for loop, this implies we must have + * file data to send so send it now. In TAG_SENDING state, we've already + * handled this so skip the send if that's the case. */ + if((hs->tag_state != TAG_SENDING) && (hs->parsed > hs->file)) { + /* We cannot send more data than space available in the send + buffer. */ + if (tcp_sndbuf(pcb) < (hs->parsed - hs->file)) { + len = tcp_sndbuf(pcb); + } else { + LWIP_ASSERT("Data size does not fit into u16_t!", + (hs->parsed - hs->file) <= 0xffff); + len = (u16_t)(hs->parsed - hs->file); + } + if(len > (2 * tcp_mss(pcb))) { + len = 2 * tcp_mss(pcb); + } + + err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs)); + if (err == ERR_OK) { + data_to_send = true; + hs->file += len; + hs->left -= len; + } + } + } +#endif /* LWIP_HTTPD_SSI */ + + if((hs->left == 0) && (fs_bytes_left(hs->handle) <= 0)) { + /* We reached the end of the file so this request is done. + * This adds the FIN flag right into the last data segment. + * @todo: don't close here for HTTP/1.1? */ + LWIP_DEBUGF(HTTPD_DEBUG, ("End of file.\n")); + http_close_conn(pcb, hs); + return 0; + } + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("send_data end.\n")); + return data_to_send; +} + +#if LWIP_HTTPD_SUPPORT_EXTSTATUS +/** Initialize a http connection with a file to send for an error message + * + * @param hs http connection state + * @param error_nr HTTP error number + * @return ERR_OK if file was found and hs has been initialized correctly + * another err_t otherwise + */ +static err_t +http_find_error_file(struct http_state *hs, u16_t error_nr) +{ + const char *uri1, *uri2, *uri3; + struct fs_file *file; + + if (error_nr == 501) { + uri1 = "/501.html"; + uri2 = "/501.htm"; + uri3 = "/501.shtml"; + } else { + /* 400 (bad request is the default) */ + uri1 = "/400.html"; + uri2 = "/400.htm"; + uri3 = "/400.shtml"; + } + file = fs_open(uri1); + if (file == NULL) { + file = fs_open(uri2); + if (file == NULL) { + file = fs_open(uri3); + if (file == NULL) { + LWIP_DEBUGF(HTTPD_DEBUG, ("Error page for error %"U16_F" not found\n", + error_nr)); + return ERR_ARG; + } + } + } + return http_init_file(hs, file, 0, NULL); +} +#else /* LWIP_HTTPD_SUPPORT_EXTSTATUS */ +#define http_find_error_file(hs, error_nr) ERR_ARG +#endif /* LWIP_HTTPD_SUPPORT_EXTSTATUS */ + +/** + * Get the file struct for a 404 error page. + * Tries some file names and returns NULL if none found. + * + * @param uri pointer that receives the actual file name URI + * @return file struct for the error page or NULL no matching file was found + */ +static struct fs_file * +http_get_404_file(const char **uri) +{ + struct fs_file *file; + + *uri = "/404.html"; + file = fs_open(*uri); + if(file == NULL) { + /* 404.html doesn't exist. Try 404.htm instead. */ + *uri = "/404.htm"; + file = fs_open(*uri); + if(file == NULL) { + /* 404.htm doesn't exist either. Try 404.shtml instead. */ + *uri = "/404.shtml"; + file = fs_open(*uri); + if(file == NULL) { + /* 404.htm doesn't exist either. Indicate to the caller that it should + * send back a default 404 page. + */ + *uri = NULL; + } + } + } + + return file; +} + +#if LWIP_HTTPD_SUPPORT_POST +static err_t +http_handle_post_finished(struct http_state *hs) +{ + /* application error or POST finished */ + /* NULL-terminate the buffer */ + http_post_response_filename[0] = 0; + httpd_post_finished(hs, http_post_response_filename, LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN); + return http_find_file(hs, http_post_response_filename, 0); +} + +/** Pass received POST body data to the application and correctly handle + * returning a response document or closing the connection. + * ATTENTION: The application is responsible for the pbuf now, so don't free it! + * + * @param hs http connection state + * @param p pbuf to pass to the application + * @return ERR_OK if passed successfully, another err_t if the response file + * hasn't been found (after POST finished) + */ +static err_t +http_post_rxpbuf(struct http_state *hs, struct pbuf *p) +{ + err_t err; + + /* adjust remaining Content-Length */ + if (hs->post_content_len_left < p->tot_len) { + hs->post_content_len_left = 0; + } else { + hs->post_content_len_left -= p->tot_len; + } + err = httpd_post_receive_data(hs, p); + if ((err != ERR_OK) || (hs->post_content_len_left == 0)) { +#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND + if (hs->unrecved_bytes != 0) { + return ERR_OK; + } +#endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */ + /* application error or POST finished */ + return http_handle_post_finished(hs); + } + + return ERR_OK; +} + +/** Handle a post request. Called from http_parse_request when method 'POST' + * is found. + * + * @param pcb The tcp_pcb which received this packet. + * @param p The input pbuf (containing the POST header and body). + * @param hs The http connection state. + * @param data HTTP request (header and part of body) from input pbuf(s). + * @param data_len Size of 'data'. + * @param uri The HTTP URI parsed from input pbuf(s). + * @param uri_end Pointer to the end of 'uri' (here, the rest of the HTTP + * header starts). + * @return ERR_OK: POST correctly parsed and accepted by the application. + * ERR_INPROGRESS: POST not completely parsed (no error yet) + * another err_t: Error parsing POST or denied by the application + */ +static err_t +http_post_request(struct tcp_pcb *pcb, struct pbuf **inp, struct http_state *hs, + char *data, u16_t data_len, char *uri, char *uri_end) +{ + err_t err; + /* search for end-of-header (first double-CRLF) */ + char* crlfcrlf = strnstr(uri_end + 1, CRLF CRLF, data_len - (uri_end + 1 - data)); + +#if LWIP_HTTPD_POST_MANUAL_WND + hs->pcb = pcb; +#else /* LWIP_HTTPD_POST_MANUAL_WND */ + LWIP_UNUSED_ARG(pcb); /* only used for LWIP_HTTPD_POST_MANUAL_WND */ +#endif /* LWIP_HTTPD_POST_MANUAL_WND */ + + if (crlfcrlf != NULL) { + /* search for "Content-Length: " */ +#define HTTP_HDR_CONTENT_LEN "Content-Length: " +#define HTTP_HDR_CONTENT_LEN_LEN 16 +#define HTTP_HDR_CONTENT_LEN_DIGIT_MAX_LEN 10 + char *scontent_len = strnstr(uri_end + 1, HTTP_HDR_CONTENT_LEN, crlfcrlf - (uri_end + 1)); + if (scontent_len != NULL) { + char *scontent_len_end = strnstr(scontent_len + HTTP_HDR_CONTENT_LEN_LEN, CRLF, HTTP_HDR_CONTENT_LEN_DIGIT_MAX_LEN); + if (scontent_len_end != NULL) { + int content_len; + char *conten_len_num = scontent_len + HTTP_HDR_CONTENT_LEN_LEN; + *scontent_len_end = 0; + content_len = atoi(conten_len_num); + if (content_len > 0) { + /* adjust length of HTTP header passed to application */ + const char *hdr_start_after_uri = uri_end + 1; + u16_t hdr_len = LWIP_MIN(data_len, crlfcrlf + 4 - data); + u16_t hdr_data_len = LWIP_MIN(data_len, crlfcrlf + 4 - hdr_start_after_uri); + u8_t post_auto_wnd = 1; + http_post_response_filename[0] = 0; + err = httpd_post_begin(hs, uri, hdr_start_after_uri, hdr_data_len, content_len, + http_post_response_filename, LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN, &post_auto_wnd); + if (err == ERR_OK) { + /* try to pass in data of the first pbuf(s) */ + struct pbuf *q = *inp; + u16_t start_offset = hdr_len; +#if LWIP_HTTPD_POST_MANUAL_WND + hs->no_auto_wnd = !post_auto_wnd; +#endif /* LWIP_HTTPD_POST_MANUAL_WND */ + /* set the Content-Length to be received for this POST */ + hs->post_content_len_left = (u32_t)content_len; + + /* get to the pbuf where the body starts */ + while((q != NULL) && (q->len <= start_offset)) { + struct pbuf *head = q; + start_offset -= q->len; + q = q->next; + /* free the head pbuf */ + head->next = NULL; + pbuf_free(head); + } + *inp = NULL; + if (q != NULL) { + /* hide the remaining HTTP header */ + pbuf_header(q, -(s16_t)start_offset); +#if LWIP_HTTPD_POST_MANUAL_WND + if (!post_auto_wnd) { + /* already tcp_recved() this data... */ + hs->unrecved_bytes = q->tot_len; + } +#endif /* LWIP_HTTPD_POST_MANUAL_WND */ + return http_post_rxpbuf(hs, q); + } else { + return ERR_OK; + } + } else { + /* return file passed from application */ + return http_find_file(hs, http_post_response_filename, 0); + } + } else { + LWIP_DEBUGF(HTTPD_DEBUG, ("POST received invalid Content-Length: %s\n", + conten_len_num)); + return ERR_ARG; + } + } + } + } + /* if we come here, the POST is incomplete */ +#if LWIP_HTTPD_SUPPORT_REQUESTLIST + return ERR_INPROGRESS; +#else /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ + return ERR_ARG; +#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ +} + +#if LWIP_HTTPD_POST_MANUAL_WND +/** A POST implementation can call this function to update the TCP window. + * This can be used to throttle data reception (e.g. when received data is + * programmed to flash and data is received faster than programmed). + * + * @param connection A connection handle passed to httpd_post_begin for which + * httpd_post_finished has *NOT* been called yet! + * @param recved_len Length of data received (for window update) + */ +void httpd_post_data_recved(void *connection, u16_t recved_len) +{ + struct http_state *hs = (struct http_state*)connection; + if (hs != NULL) { + if (hs->no_auto_wnd) { + u16_t len = recved_len; + if (hs->unrecved_bytes >= recved_len) { + hs->unrecved_bytes -= recved_len; + } else { + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_LEVEL_WARNING, ("httpd_post_data_recved: recved_len too big\n")); + len = (u16_t)hs->unrecved_bytes; + hs->unrecved_bytes = 0; + } + if (hs->pcb != NULL) { + if (len != 0) { + tcp_recved(hs->pcb, len); + } + if ((hs->post_content_len_left == 0) && (hs->unrecved_bytes == 0)) { + /* finished handling POST */ + http_handle_post_finished(hs); + http_send_data(hs->pcb, hs); + } + } + } + } +} +#endif /* LWIP_HTTPD_POST_MANUAL_WND */ + +#endif /* LWIP_HTTPD_SUPPORT_POST */ + +/** + * When data has been received in the correct state, try to parse it + * as a HTTP request. + * + * @param p the received pbuf + * @param hs the connection state + * @param pcb the tcp_pcb which received this packet + * @return ERR_OK if request was OK and hs has been initialized correctly + * ERR_INPROGRESS if request was OK so far but not fully received + * another err_t otherwise + */ +static err_t +http_parse_request(struct pbuf **inp, struct http_state *hs, struct tcp_pcb *pcb) +{ + char *data; + char *crlf; + u16_t data_len; + struct pbuf *p = *inp; +#if LWIP_HTTPD_SUPPORT_REQUESTLIST + u16_t clen; +#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ +#if LWIP_HTTPD_SUPPORT_POST + err_t err; +#endif /* LWIP_HTTPD_SUPPORT_POST */ + + LWIP_UNUSED_ARG(pcb); /* only used for post */ + LWIP_ASSERT("p != NULL", p != NULL); + LWIP_ASSERT("hs != NULL", hs != NULL); + + if ((hs->handle != NULL) || (hs->file != NULL)) { + LWIP_DEBUGF(HTTPD_DEBUG, ("Received data while sending a file\n")); + /* already sending a file */ + /* @todo: abort? */ + return ERR_USE; + } + +#if LWIP_HTTPD_SUPPORT_REQUESTLIST + + LWIP_DEBUGF(HTTPD_DEBUG, ("Received %"U16_F" bytes\n", p->tot_len)); + + /* first check allowed characters in this pbuf? */ + + /* enqueue the pbuf */ + if (hs->req == NULL) { + LWIP_DEBUGF(HTTPD_DEBUG, ("First pbuf\n")); + hs->req = p; + } else { + LWIP_DEBUGF(HTTPD_DEBUG, ("pbuf enqueued\n")); + pbuf_cat(hs->req, p); + } + + if (hs->req->next != NULL) { + data_len = LWIP_MIN(hs->req->tot_len, LWIP_HTTPD_MAX_REQ_LENGTH); + pbuf_copy_partial(hs->req, httpd_req_buf, data_len, 0); + data = httpd_req_buf; + } else +#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ + { + data = (char *)p->payload; + data_len = p->len; + if (p->len != p->tot_len) { + LWIP_DEBUGF(HTTPD_DEBUG, ("Warning: incomplete header due to chained pbufs\n")); + } + } + + /* received enough data for minimal request? */ + if (data_len >= MIN_REQ_LEN) { + /* wait for CRLF before parsing anything */ + crlf = strnstr(data, CRLF, data_len); + if (crlf != NULL) { +#if LWIP_HTTPD_SUPPORT_POST + int is_post = 0; +#endif /* LWIP_HTTPD_SUPPORT_POST */ + int is_09 = 0; + char *sp1, *sp2; + u16_t left_len, uri_len; + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("CRLF received, parsing request\n")); + /* parse method */ + if (!strncmp(data, "GET ", 4)) { + sp1 = data + 3; + /* received GET request */ + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Received GET request\"\n")); +#if LWIP_HTTPD_SUPPORT_POST + } else if (!strncmp(data, "POST ", 5)) { + /* store request type */ + is_post = 1; + sp1 = data + 4; + /* received GET request */ + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Received POST request\n")); +#endif /* LWIP_HTTPD_SUPPORT_POST */ + } else { + /* null-terminate the METHOD (pbuf is freed anyway wen returning) */ + data[4] = 0; + /* unsupported method! */ + LWIP_DEBUGF(HTTPD_DEBUG, ("Unsupported request method (not implemented): \"%s\"\n", + data)); + return http_find_error_file(hs, 501); + } + /* if we come here, method is OK, parse URI */ + left_len = data_len - ((sp1 +1) - data); + sp2 = strnstr(sp1 + 1, " ", left_len); +#if LWIP_HTTPD_SUPPORT_V09 + if (sp2 == NULL) { + /* HTTP 0.9: respond with correct protocol version */ + sp2 = strnstr(sp1 + 1, CRLF, left_len); + is_09 = 1; +#if LWIP_HTTPD_SUPPORT_POST + if (is_post) { + /* HTTP/0.9 does not support POST */ + goto badrequest; + } +#endif /* LWIP_HTTPD_SUPPORT_POST */ + } +#endif /* LWIP_HTTPD_SUPPORT_V09 */ + uri_len = sp2 - (sp1 + 1); + if ((sp2 != 0) && (sp2 > sp1)) { + char *uri = sp1 + 1; + /* null-terminate the METHOD (pbuf is freed anyway wen returning) */ + *sp1 = 0; + uri[uri_len] = 0; + LWIP_DEBUGF(HTTPD_DEBUG, ("Received \"%s\" request for URI: \"%s\"\n", + data, uri)); +#if LWIP_HTTPD_SUPPORT_POST + if (is_post) { +#if LWIP_HTTPD_SUPPORT_REQUESTLIST + struct pbuf **q = &hs->req; +#else /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ + struct pbuf **q = inp; +#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ + err = http_post_request(pcb, q, hs, data, data_len, uri, sp2); + if (err != ERR_OK) { + /* restore header for next try */ + *sp1 = ' '; + *sp2 = ' '; + uri[uri_len] = ' '; + } + if (err == ERR_ARG) { + goto badrequest; + } + return err; + } else +#endif /* LWIP_HTTPD_SUPPORT_POST */ + { + return http_find_file(hs, uri, is_09); + } + } else { + LWIP_DEBUGF(HTTPD_DEBUG, ("invalid URI\n")); + } + } + } + +#if LWIP_HTTPD_SUPPORT_REQUESTLIST + clen = pbuf_clen(hs->req); + if ((hs->req->tot_len <= LWIP_HTTPD_REQ_BUFSIZE) && + (clen <= LWIP_HTTPD_REQ_QUEUELEN)) { + /* request not fully received (too short or CRLF is missing) */ + return ERR_INPROGRESS; + } else +#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ + { +#if LWIP_HTTPD_SUPPORT_POST +badrequest: +#endif /* LWIP_HTTPD_SUPPORT_POST */ + LWIP_DEBUGF(HTTPD_DEBUG, ("bad request\n")); + /* could not parse request */ + return http_find_error_file(hs, 400); + } +} + +/** Try to find the file specified by uri and, if found, initialize hs + * accordingly. + * + * @param hs the connection state + * @param uri the HTTP header URI + * @param is_09 1 if the request is HTTP/0.9 (no HTTP headers in response) + * @return ERR_OK if file was found and hs has been initialized correctly + * another err_t otherwise + */ +static err_t +http_find_file(struct http_state *hs, const char *uri, int is_09) +{ + size_t loop; + struct fs_file *file = NULL; + char *params; +#if LWIP_HTTPD_CGI + int i; + int count; +#endif /* LWIP_HTTPD_CGI */ + +#if LWIP_HTTPD_SSI + /* + * By default, assume we will not be processing server-side-includes + * tags + */ + hs->tag_check = false; +#endif /* LWIP_HTTPD_SSI */ + + /* Have we been asked for the default root file? */ + if((uri[0] == '/') && (uri[1] == 0)) { + /* Try each of the configured default filenames until we find one + that exists. */ + for (loop = 0; loop < NUM_DEFAULT_FILENAMES; loop++) { + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Looking for %s...\n", g_psDefaultFilenames[loop].name)); + file = fs_open((char *)g_psDefaultFilenames[loop].name); + uri = (char *)g_psDefaultFilenames[loop].name; + if(file != NULL) { + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Opened.\n")); +#if LWIP_HTTPD_SSI + hs->tag_check = g_psDefaultFilenames[loop].shtml; +#endif /* LWIP_HTTPD_SSI */ + break; + } + } + if (file == NULL) { + /* None of the default filenames exist so send back a 404 page */ + file = http_get_404_file(&uri); +#if LWIP_HTTPD_SSI + hs->tag_check = false; +#endif /* LWIP_HTTPD_SSI */ + } + } else { + /* No - we've been asked for a specific file. */ + /* First, isolate the base URI (without any parameters) */ + params = (char *)strchr(uri, '?'); + if (params != NULL) { + /* URI contains parameters. NULL-terminate the base URI */ + *params = '\0'; + params++; + } + +#if LWIP_HTTPD_CGI + /* Does the base URI we have isolated correspond to a CGI handler? */ + if (g_iNumCGIs && g_pCGIs) { + for (i = 0; i < g_iNumCGIs; i++) { + if (strcmp(uri, g_pCGIs[i].pcCGIName) == 0) { + /* + * We found a CGI that handles this URI so extract the + * parameters and call the handler. + */ + count = extract_uri_parameters(hs, params); + uri = g_pCGIs[i].pfnCGIHandler(i, count, hs->params, + hs->param_vals); + break; + } + } + } +#endif /* LWIP_HTTPD_CGI */ + + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("Opening %s\n", uri)); + + file = fs_open(uri); + if (file == NULL) { + file = http_get_404_file(&uri); + } +#if LWIP_HTTPD_SSI + if (file != NULL) { + /* + * See if we have been asked for an shtml file and, if so, + * enable tag checking. + */ + hs->tag_check = false; + for (loop = 0; loop < NUM_SHTML_EXTENSIONS; loop++) { + if (strstr(uri, g_pcSSIExtensions[loop])) { + hs->tag_check = true; + break; + } + } + } +#endif /* LWIP_HTTPD_SSI */ + } + return http_init_file(hs, file, is_09, uri); +} + +/** Initialize a http connection with a file to send (if found). + * Called by http_find_file and http_find_error_file. + * + * @param hs http connection state + * @param file file structure to send (or NULL if not found) + * @param is_09 1 if the request is HTTP/0.9 (no HTTP headers in response) + * @param uri the HTTP header URI + * @return ERR_OK if file was found and hs has been initialized correctly + * another err_t otherwise + */ +static err_t +http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const char *uri) +{ + if (file != NULL) { + /* file opened, initialise struct http_state */ +#if LWIP_HTTPD_SSI + hs->tag_index = 0; + hs->tag_state = TAG_NONE; + hs->parsed = file->data; + hs->parse_left = file->len; + hs->tag_end = file->data; +#endif /* LWIP_HTTPD_SSI */ + hs->handle = file; + hs->file = (char*)file->data; + LWIP_ASSERT("File length must be positive!", (file->len >= 0)); + hs->left = file->len; + hs->retries = 0; +#if LWIP_HTTPD_TIMING + hs->time_started = sys_now(); +#endif /* LWIP_HTTPD_TIMING */ +#if !LWIP_HTTPD_DYNAMIC_HEADERS + LWIP_ASSERT("HTTP headers not included in file system", hs->handle->http_header_included); +#endif /* !LWIP_HTTPD_DYNAMIC_HEADERS */ +#if LWIP_HTTPD_SUPPORT_V09 + if (hs->handle->http_header_included && is_09) { + /* HTTP/0.9 responses are sent without HTTP header, + search for the end of the header. */ + char *file_start = strnstr(hs->file, CRLF CRLF, hs->left); + if (file_start != NULL) { + size_t diff = file_start + 4 - hs->file; + hs->file += diff; + hs->left -= (u32_t)diff; + } + } +#endif /* LWIP_HTTPD_SUPPORT_V09*/ + } else { + hs->handle = NULL; + hs->file = NULL; + hs->left = 0; + hs->retries = 0; + } +#if LWIP_HTTPD_DYNAMIC_HEADERS + /* Determine the HTTP headers to send based on the file extension of + * the requested URI. */ + if ((hs->handle == NULL) || !hs->handle->http_header_included) { + get_http_headers(hs, (char*)uri); + } +#else /* LWIP_HTTPD_DYNAMIC_HEADERS */ + LWIP_UNUSED_ARG(uri); +#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */ + return ERR_OK; +} + +/** + * The pcb had an error and is already deallocated. + * The argument might still be valid (if != NULL). + */ +static void +http_err(void *arg, err_t err) +{ + struct http_state *hs = (struct http_state *)arg; + LWIP_UNUSED_ARG(err); + + LWIP_DEBUGF(HTTPD_DEBUG, ("http_err: %s", lwip_strerr(err))); + + if (hs != NULL) { + http_state_free(hs); + } +} + +/** + * Data has been sent and acknowledged by the remote host. + * This means that more data can be sent. + */ +static err_t +http_sent(void *arg, struct tcp_pcb *pcb, u16_t len) +{ + struct http_state *hs = (struct http_state *)arg; + + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_sent %p\n", (void*)pcb)); + + LWIP_UNUSED_ARG(len); + + if (hs == NULL) { + return ERR_OK; + } + + hs->retries = 0; + + http_send_data(pcb, hs); + + return ERR_OK; +} + +/** + * The poll function is called every 2nd second. + * If there has been no data sent (which resets the retries) in 8 seconds, close. + * If the last portion of a file has not been sent in 2 seconds, close. + * + * This could be increased, but we don't want to waste resources for bad connections. + */ +static err_t +http_poll(void *arg, struct tcp_pcb *pcb) +{ + struct http_state *hs = (struct http_state *)arg; + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_poll: pcb=%p hs=%p pcb_state=%s\n", + (void*)pcb, (void*)hs, tcp_debug_state_str(pcb->state))); + + if (hs == NULL) { + err_t closed; + /* arg is null, close. */ + LWIP_DEBUGF(HTTPD_DEBUG, ("http_poll: arg is NULL, close\n")); + closed = http_close_conn(pcb, hs); + LWIP_UNUSED_ARG(closed); +#if LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR + if (closed == ERR_MEM) { + tcp_abort(pcb); + return ERR_ABRT; + } +#endif /* LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR */ + return ERR_OK; + } else { + hs->retries++; + if (hs->retries == HTTPD_MAX_RETRIES) { + LWIP_DEBUGF(HTTPD_DEBUG, ("http_poll: too many retries, close\n")); + http_close_conn(pcb, hs); + return ERR_OK; + } + + /* If this connection has a file open, try to send some more data. If + * it has not yet received a GET request, don't do this since it will + * cause the connection to close immediately. */ + if(hs && (hs->handle)) { + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_poll: try to send more data\n")); + if(http_send_data(pcb, hs)) { + /* If we wrote anything to be sent, go ahead and send it now. */ + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("tcp_output\n")); + tcp_output(pcb); + } + } + } + + return ERR_OK; +} + +/** + * Data has been received on this pcb. + * For HTTP 1.0, this should normally only happen once (if the request fits in one packet). + */ +static err_t +http_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) +{ + err_t parsed = ERR_ABRT; + struct http_state *hs = (struct http_state *)arg; + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_recv: pcb=%p pbuf=%p err=%s\n", (void*)pcb, + (void*)p, lwip_strerr(err))); + + if ((err != ERR_OK) || (p == NULL) || (hs == NULL)) { + /* error or closed by other side? */ + if (p != NULL) { + /* Inform TCP that we have taken the data. */ + tcp_recved(pcb, p->tot_len); + pbuf_free(p); + } + if (hs == NULL) { + /* this should not happen, only to be robust */ + LWIP_DEBUGF(HTTPD_DEBUG, ("Error, http_recv: hs is NULL, close\n")); + } + http_close_conn(pcb, hs); + return ERR_OK; + } + +#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND + if (hs->no_auto_wnd) { + hs->unrecved_bytes += p->tot_len; + } else +#endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */ + { + /* Inform TCP that we have taken the data. */ + tcp_recved(pcb, p->tot_len); + } + +#if LWIP_HTTPD_SUPPORT_POST + if (hs->post_content_len_left > 0) { + /* reset idle counter when POST data is received */ + hs->retries = 0; + /* this is data for a POST, pass the complete pbuf to the application */ + http_post_rxpbuf(hs, p); + /* pbuf is passed to the application, don't free it! */ + if (hs->post_content_len_left == 0) { + /* all data received, send response or close connection */ + http_send_data(pcb, hs); + } + return ERR_OK; + } else +#endif /* LWIP_HTTPD_SUPPORT_POST */ + { + if (hs->handle == NULL) { + parsed = http_parse_request(&p, hs, pcb); + LWIP_ASSERT("http_parse_request: unexpected return value", parsed == ERR_OK + || parsed == ERR_INPROGRESS ||parsed == ERR_ARG || parsed == ERR_USE); + } else { + LWIP_DEBUGF(HTTPD_DEBUG, ("http_recv: already sending data\n")); + } +#if LWIP_HTTPD_SUPPORT_REQUESTLIST + if (parsed != ERR_INPROGRESS) { + /* request fully parsed or error */ + if (hs->req != NULL) { + pbuf_free(hs->req); + hs->req = NULL; + } + } +#else /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ + if (p != NULL) { + /* pbuf not passed to application, free it now */ + pbuf_free(p); + } +#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */ + if (parsed == ERR_OK) { +#if LWIP_HTTPD_SUPPORT_POST + if (hs->post_content_len_left == 0) +#endif /* LWIP_HTTPD_SUPPORT_POST */ + { + LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, ("http_recv: data %p len %"S32_F"\n", hs->file, hs->left)); + http_send_data(pcb, hs); + } + } else if (parsed == ERR_ARG) { + /* @todo: close on ERR_USE? */ + http_close_conn(pcb, hs); + } + } + return ERR_OK; +} + +/** + * A new incoming connection has been accepted. + */ +static err_t +http_accept(void *arg, struct tcp_pcb *pcb, err_t err) +{ + struct http_state *hs; + struct tcp_pcb_listen *lpcb = (struct tcp_pcb_listen*)arg; + LWIP_UNUSED_ARG(err); + LWIP_DEBUGF(HTTPD_DEBUG, ("http_accept %p / %p\n", (void*)pcb, arg)); + + /* Decrease the listen backlog counter */ + tcp_accepted(lpcb); + /* Set priority */ + tcp_setprio(pcb, HTTPD_TCP_PRIO); + + /* Allocate memory for the structure that holds the state of the + connection - initialized by that function. */ + hs = http_state_alloc(); + if (hs == NULL) { + LWIP_DEBUGF(HTTPD_DEBUG, ("http_accept: Out of memory, RST\n")); + return ERR_MEM; + } + + /* Tell TCP that this is the structure we wish to be passed for our + callbacks. */ + tcp_arg(pcb, hs); + + /* Set up the various callback functions */ + tcp_recv(pcb, http_recv); + tcp_err(pcb, http_err); + tcp_poll(pcb, http_poll, HTTPD_POLL_INTERVAL); + tcp_sent(pcb, http_sent); + + return ERR_OK; +} + +/** + * Initialize the httpd with the specified local address. + */ +static void +httpd_init_addr(ip_addr_t *local_addr) +{ + struct tcp_pcb *pcb; + err_t err; + + pcb = tcp_new(); + LWIP_ASSERT("httpd_init: tcp_new failed", pcb != NULL); + tcp_setprio(pcb, HTTPD_TCP_PRIO); + /* set SOF_REUSEADDR here to explicitly bind httpd to multiple interfaces */ + err = tcp_bind(pcb, local_addr, HTTPD_SERVER_PORT); + LWIP_ASSERT("httpd_init: tcp_bind failed", err == ERR_OK); + pcb = tcp_listen(pcb); + LWIP_ASSERT("httpd_init: tcp_listen failed", pcb != NULL); + /* initialize callback arg and accept callback */ + tcp_arg(pcb, pcb); + tcp_accept(pcb, http_accept); +} + +/** + * Initialize the httpd: set up a listening PCB and bind it to the defined port + */ +void +httpd_init(void) +{ +#if HTTPD_USE_MEM_POOL + LWIP_ASSERT("memp_sizes[MEMP_HTTPD_STATE] >= sizeof(http_state)", + memp_sizes[MEMP_HTTPD_STATE] >= sizeof(http_state)); +#endif + LWIP_DEBUGF(HTTPD_DEBUG, ("httpd_init\n")); + + httpd_init_addr(IP_ADDR_ANY); +} + +#if LWIP_HTTPD_SSI +/** + * Set the SSI handler function. + * + * @param ssi_handler the SSI handler function + * @param tags an array of SSI tag strings to search for in SSI-enabled files + * @param num_tags number of tags in the 'tags' array + */ +void +http_set_ssi_handler(tSSIHandler ssi_handler, const char **tags, int num_tags) +{ + LWIP_DEBUGF(HTTPD_DEBUG, ("http_set_ssi_handler\n")); + + LWIP_ASSERT("no ssi_handler given", ssi_handler != NULL); + LWIP_ASSERT("no tags given", tags != NULL); + LWIP_ASSERT("invalid number of tags", num_tags > 0); + + g_pfnSSIHandler = ssi_handler; + g_ppcTags = tags; + g_iNumTags = num_tags; +} +#endif /* LWIP_HTTPD_SSI */ + +#if LWIP_HTTPD_CGI +/** + * Set an array of CGI filenames/handler functions + * + * @param cgis an array of CGI filenames/handler functions + * @param num_handlers number of elements in the 'cgis' array + */ +void +http_set_cgi_handlers(const tCGI *cgis, int num_handlers) +{ + LWIP_ASSERT("no cgis given", cgis != NULL); + LWIP_ASSERT("invalid number of handlers", num_handlers > 0); + + g_pCGIs = cgis; + g_iNumCGIs = num_handlers; +} +#endif /* LWIP_HTTPD_CGI */ + +#endif /* LWIP_TCP */ diff --git a/third_party/lwip-1.4.1/apps/httpserver_raw/httpd.h b/third_party/lwip-1.4.1/apps/httpserver_raw/httpd.h new file mode 100644 index 0000000..9137926 --- /dev/null +++ b/third_party/lwip-1.4.1/apps/httpserver_raw/httpd.h @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * This version of the file has been modified by Texas Instruments to offer + * simple server-side-include (SSI) and Common Gateway Interface (CGI) + * capability. + */ + +#ifndef __HTTPD_H__ +#define __HTTPD_H__ + +#include "lwip/opt.h" +#include "lwip/err.h" +#include "lwip/pbuf.h" + + +/** Set this to 1 to support CGI */ +#ifndef LWIP_HTTPD_CGI +#define LWIP_HTTPD_CGI 0 +#endif + +/** Set this to 1 to support SSI (Server-Side-Includes) */ +#ifndef LWIP_HTTPD_SSI +#define LWIP_HTTPD_SSI 0 +#endif + +/** Set this to 1 to support HTTP POST */ +#ifndef LWIP_HTTPD_SUPPORT_POST +#define LWIP_HTTPD_SUPPORT_POST 0 +#endif + + +#if LWIP_HTTPD_CGI + +/* + * Function pointer for a CGI script handler. + * + * This function is called each time the HTTPD server is asked for a file + * whose name was previously registered as a CGI function using a call to + * http_set_cgi_handler. The iIndex parameter provides the index of the + * CGI within the ppcURLs array passed to http_set_cgi_handler. Parameters + * pcParam and pcValue provide access to the parameters provided along with + * the URI. iNumParams provides a count of the entries in the pcParam and + * pcValue arrays. Each entry in the pcParam array contains the name of a + * parameter with the corresponding entry in the pcValue array containing the + * value for that parameter. Note that pcParam may contain multiple elements + * with the same name if, for example, a multi-selection list control is used + * in the form generating the data. + * + * The function should return a pointer to a character string which is the + * path and filename of the response that is to be sent to the connected + * browser, for example "/thanks.htm" or "/response/error.ssi". + * + * The maximum number of parameters that will be passed to this function via + * iNumParams is defined by LWIP_HTTPD_MAX_CGI_PARAMETERS. Any parameters in the incoming + * HTTP request above this number will be discarded. + * + * Requests intended for use by this CGI mechanism must be sent using the GET + * method (which encodes all parameters within the URI rather than in a block + * later in the request). Attempts to use the POST method will result in the + * request being ignored. + * + */ +typedef const char *(*tCGIHandler)(int iIndex, int iNumParams, char *pcParam[], + char *pcValue[]); + +/* + * Structure defining the base filename (URL) of a CGI and the associated + * function which is to be called when that URL is requested. + */ +typedef struct +{ + const char *pcCGIName; + tCGIHandler pfnCGIHandler; +} tCGI; + +void http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers); + + +/* The maximum number of parameters that the CGI handler can be sent. */ +#ifndef LWIP_HTTPD_MAX_CGI_PARAMETERS +#define LWIP_HTTPD_MAX_CGI_PARAMETERS 16 +#endif + +#endif /* LWIP_HTTPD_CGI */ + +#if LWIP_HTTPD_SSI + +/** LWIP_HTTPD_SSI_MULTIPART==1: SSI handler function is called with 2 more + * arguments indicating a counter for insert string that are too long to be + * inserted at once: the SSI handler function must then set 'next_tag_part' + * which will be passed back to it in the next call. */ +#ifndef LWIP_HTTPD_SSI_MULTIPART +#define LWIP_HTTPD_SSI_MULTIPART 0 +#endif + +/* + * Function pointer for the SSI tag handler callback. + * + * This function will be called each time the HTTPD server detects a tag of the + * form in a .shtml, .ssi or .shtm file where "name" appears as + * one of the tags supplied to http_set_ssi_handler in the ppcTags array. The + * returned insert string, which will be appended after the the string + * "" in file sent back to the client,should be written to pointer + * pcInsert. iInsertLen contains the size of the buffer pointed to by + * pcInsert. The iIndex parameter provides the zero-based index of the tag as + * found in the ppcTags array and identifies the tag that is to be processed. + * + * The handler returns the number of characters written to pcInsert excluding + * any terminating NULL or a negative number to indicate a failure (tag not + * recognized, for example). + * + * Note that the behavior of this SSI mechanism is somewhat different from the + * "normal" SSI processing as found in, for example, the Apache web server. In + * this case, the inserted text is appended following the SSI tag rather than + * replacing the tag entirely. This allows for an implementation that does not + * require significant additional buffering of output data yet which will still + * offer usable SSI functionality. One downside to this approach is when + * attempting to use SSI within JavaScript. The SSI tag is structured to + * resemble an HTML comment but this syntax does not constitute a comment + * within JavaScript and, hence, leaving the tag in place will result in + * problems in these cases. To work around this, any SSI tag which needs to + * output JavaScript code must do so in an encapsulated way, sending the whole + * HTML section as a single include. + */ +typedef u16_t (*tSSIHandler)(int iIndex, char *pcInsert, int iInsertLen +#if LWIP_HTTPD_SSI_MULTIPART + , u16_t current_tag_part, u16_t *next_tag_part +#endif /* LWIP_HTTPD_SSI_MULTIPART */ +#if LWIP_HTTPD_FILE_STATE + , void *connection_state +#endif /* LWIP_HTTPD_FILE_STATE */ + ); + +void http_set_ssi_handler(tSSIHandler pfnSSIHandler, + const char **ppcTags, int iNumTags); + +/* The maximum length of the string comprising the tag name */ +#ifndef LWIP_HTTPD_MAX_TAG_NAME_LEN +#define LWIP_HTTPD_MAX_TAG_NAME_LEN 8 +#endif + +/* The maximum length of string that can be returned to replace any given tag */ +#ifndef LWIP_HTTPD_MAX_TAG_INSERT_LEN +#define LWIP_HTTPD_MAX_TAG_INSERT_LEN 192 +#endif + +#endif /* LWIP_HTTPD_SSI */ + +#if LWIP_HTTPD_SUPPORT_POST + +/* These functions must be implemented by the application */ + +/** Called when a POST request has been received. The application can decide + * whether to accept it or not. + * + * @param connection Unique connection identifier, valid until httpd_post_end + * is called. + * @param uri The HTTP header URI receiving the POST request. + * @param http_request The raw HTTP request (the first packet, normally). + * @param http_request_len Size of 'http_request'. + * @param content_len Content-Length from HTTP header. + * @param response_uri Filename of response file, to be filled when denying the + * request + * @param response_uri_len Size of the 'response_uri' buffer. + * @param post_auto_wnd Set this to 0 to let the callback code handle window + * updates by calling 'httpd_post_data_recved' (to throttle rx speed) + * default is 1 (httpd handles window updates automatically) + * @return ERR_OK: Accept the POST request, data may be passed in + * another err_t: Deny the POST request, send back 'bad request'. + */ +err_t httpd_post_begin(void *connection, const char *uri, const char *http_request, + u16_t http_request_len, int content_len, char *response_uri, + u16_t response_uri_len, u8_t *post_auto_wnd); + +/** Called for each pbuf of data that has been received for a POST. + * ATTENTION: The application is responsible for freeing the pbufs passed in! + * + * @param connection Unique connection identifier. + * @param p Received data. + * @return ERR_OK: Data accepted. + * another err_t: Data denied, http_post_get_response_uri will be called. + */ +err_t httpd_post_receive_data(void *connection, struct pbuf *p); + +/** Called when all data is received or when the connection is closed. + * The application must return the filename/URI of a file to send in response + * to this POST request. If the response_uri buffer is untouched, a 404 + * response is returned. + * + * @param connection Unique connection identifier. + * @param response_uri Filename of response file, to be filled when denying the request + * @param response_uri_len Size of the 'response_uri' buffer. + */ +void httpd_post_finished(void *connection, char *response_uri, u16_t response_uri_len); + +#ifndef LWIP_HTTPD_POST_MANUAL_WND +#define LWIP_HTTPD_POST_MANUAL_WND 0 +#endif + +#if LWIP_HTTPD_POST_MANUAL_WND +void httpd_post_data_recved(void *connection, u16_t recved_len); +#endif /* LWIP_HTTPD_POST_MANUAL_WND */ + +#endif /* LWIP_HTTPD_SUPPORT_POST */ + +void httpd_init(void); + +#endif /* __HTTPD_H__ */ diff --git a/third_party/lwip-1.4.1/apps/httpserver_raw/httpd_structs.h b/third_party/lwip-1.4.1/apps/httpserver_raw/httpd_structs.h new file mode 100644 index 0000000..fb24b19 --- /dev/null +++ b/third_party/lwip-1.4.1/apps/httpserver_raw/httpd_structs.h @@ -0,0 +1,115 @@ +#ifndef __HTTPD_STRUCTS_H__ +#define __HTTPD_STRUCTS_H__ + +#include "httpd.h" + +/** This string is passed in the HTTP header as "Server: " */ +#ifndef HTTPD_SERVER_AGENT +#define HTTPD_SERVER_AGENT "lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip)" +#endif + +/** Set this to 1 if you want to include code that creates HTTP headers + * at runtime. Default is off: HTTP headers are then created statically + * by the makefsdata tool. Static headers mean smaller code size, but + * the (readonly) fsdata will grow a bit as every file includes the HTTP + * header. */ +#ifndef LWIP_HTTPD_DYNAMIC_HEADERS +#define LWIP_HTTPD_DYNAMIC_HEADERS 0 +#endif + + +#if LWIP_HTTPD_DYNAMIC_HEADERS +/** This struct is used for a list of HTTP header strings for various + * filename extensions. */ +typedef struct +{ + const char *extension; + int headerIndex; +} tHTTPHeader; + +/** A list of strings used in HTTP headers */ +static const char * const g_psHTTPHeaderStrings[] = +{ + "Content-type: text/html\r\n\r\n", + "Content-type: text/html\r\nExpires: Fri, 10 Apr 2008 14:00:00 GMT\r\nPragma: no-cache\r\n\r\n", + "Content-type: image/gif\r\n\r\n", + "Content-type: image/png\r\n\r\n", + "Content-type: image/jpeg\r\n\r\n", + "Content-type: image/bmp\r\n\r\n", + "Content-type: image/x-icon\r\n\r\n", + "Content-type: application/octet-stream\r\n\r\n", + "Content-type: application/x-javascript\r\n\r\n", + "Content-type: application/x-javascript\r\n\r\n", + "Content-type: text/css\r\n\r\n", + "Content-type: application/x-shockwave-flash\r\n\r\n", + "Content-type: text/xml\r\n\r\n", + "Content-type: text/plain\r\n\r\n", + "HTTP/1.0 200 OK\r\n", + "HTTP/1.0 404 File not found\r\n", + "HTTP/1.0 400 Bad Request\r\n", + "HTTP/1.0 501 Not Implemented\r\n", + "HTTP/1.1 200 OK\r\n", + "HTTP/1.1 404 File not found\r\n", + "HTTP/1.1 400 Bad Request\r\n", + "HTTP/1.1 501 Not Implemented\r\n", + "Content-Length: ", + "Connection: Close\r\n", + "Server: "HTTPD_SERVER_AGENT"\r\n", + "\r\n

404: The requested file cannot be found.

\r\n" +}; + +/* Indexes into the g_psHTTPHeaderStrings array */ +#define HTTP_HDR_HTML 0 /* text/html */ +#define HTTP_HDR_SSI 1 /* text/html Expires... */ +#define HTTP_HDR_GIF 2 /* image/gif */ +#define HTTP_HDR_PNG 3 /* image/png */ +#define HTTP_HDR_JPG 4 /* image/jpeg */ +#define HTTP_HDR_BMP 5 /* image/bmp */ +#define HTTP_HDR_ICO 6 /* image/x-icon */ +#define HTTP_HDR_APP 7 /* application/octet-stream */ +#define HTTP_HDR_JS 8 /* application/x-javascript */ +#define HTTP_HDR_RA 9 /* application/x-javascript */ +#define HTTP_HDR_CSS 10 /* text/css */ +#define HTTP_HDR_SWF 11 /* application/x-shockwave-flash */ +#define HTTP_HDR_XML 12 /* text/xml */ +#define HTTP_HDR_DEFAULT_TYPE 13 /* text/plain */ +#define HTTP_HDR_OK 14 /* 200 OK */ +#define HTTP_HDR_NOT_FOUND 15 /* 404 File not found */ +#define HTTP_HDR_BAD_REQUEST 16 /* 400 Bad request */ +#define HTTP_HDR_NOT_IMPL 17 /* 501 Not Implemented */ +#define HTTP_HDR_OK_11 18 /* 200 OK */ +#define HTTP_HDR_NOT_FOUND_11 19 /* 404 File not found */ +#define HTTP_HDR_BAD_REQUEST_11 20 /* 400 Bad request */ +#define HTTP_HDR_NOT_IMPL_11 21 /* 501 Not Implemented */ +#define HTTP_HDR_CONTENT_LENGTH 22 /* Content-Length: (HTTP 1.1)*/ +#define HTTP_HDR_CONN_CLOSE 23 /* Connection: Close (HTTP 1.1) */ +#define HTTP_HDR_SERVER 24 /* Server: HTTPD_SERVER_AGENT */ +#define DEFAULT_404_HTML 25 /* default 404 body */ + +/** A list of extension-to-HTTP header strings */ +const static tHTTPHeader g_psHTTPHeaders[] = +{ + { "html", HTTP_HDR_HTML}, + { "htm", HTTP_HDR_HTML}, + { "shtml",HTTP_HDR_SSI}, + { "shtm", HTTP_HDR_SSI}, + { "ssi", HTTP_HDR_SSI}, + { "gif", HTTP_HDR_GIF}, + { "png", HTTP_HDR_PNG}, + { "jpg", HTTP_HDR_JPG}, + { "bmp", HTTP_HDR_BMP}, + { "ico", HTTP_HDR_ICO}, + { "class",HTTP_HDR_APP}, + { "cls", HTTP_HDR_APP}, + { "js", HTTP_HDR_JS}, + { "ram", HTTP_HDR_RA}, + { "css", HTTP_HDR_CSS}, + { "swf", HTTP_HDR_SWF}, + { "xml", HTTP_HDR_XML} +}; + +#define NUM_HTTP_HEADERS (sizeof(g_psHTTPHeaders) / sizeof(tHTTPHeader)) + +#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */ + +#endif /* __HTTPD_STRUCTS_H__ */ diff --git a/third_party/lwip-1.4.1/doc/FILES b/third_party/lwip-1.4.1/doc/FILES new file mode 100644 index 0000000..2553cb5 --- /dev/null +++ b/third_party/lwip-1.4.1/doc/FILES @@ -0,0 +1,6 @@ +savannah.txt - How to obtain the current development source code. +contrib.txt - How to contribute to lwIP as a developer. +rawapi.txt - The documentation for the core API of lwIP. + Also provides an overview about the other APIs and multithreading. +snmp_agent.txt - The documentation for the lwIP SNMP agent. +sys_arch.txt - The documentation for a system abstraction layer of lwIP. diff --git a/third_party/lwip-1.4.1/doc/contrib.txt b/third_party/lwip-1.4.1/doc/contrib.txt new file mode 100644 index 0000000..3057beb --- /dev/null +++ b/third_party/lwip-1.4.1/doc/contrib.txt @@ -0,0 +1,63 @@ +1 Introduction + +This document describes some guidelines for people participating +in lwIP development. + +2 How to contribute to lwIP + +Here is a short list of suggestions to anybody working with lwIP and +trying to contribute bug reports, fixes, enhancements, platform ports etc. +First of all as you may already know lwIP is a volunteer project so feedback +to fixes or questions might often come late. Hopefully the bug and patch tracking +features of Savannah help us not lose users' input. + +2.1 Source code style: + +1. do not use tabs. +2. indentation is two spaces per level (i.e. per tab). +3. end debug messages with a trailing newline (\n). +4. one space between keyword and opening bracket. +5. no space between function and opening bracket. +6. one space and no newline before opening curly braces of a block. +7. closing curly brace on a single line. +8. spaces surrounding assignment and comparisons. +9. don't initialize static and/or global variables to zero, the compiler takes care of that. +10. use current source code style as further reference. + +2.2 Source code documentation style: + +1. JavaDoc compliant and Doxygen compatible. +2. Function documentation above functions in .c files, not .h files. + (This forces you to synchronize documentation and implementation.) +3. Use current documentation style as further reference. + +2.3 Bug reports and patches: + +1. Make sure you are reporting bugs or send patches against the latest + sources. (From the latest release and/or the current CVS sources.) +2. If you think you found a bug make sure it's not already filed in the + bugtracker at Savannah. +3. If you have a fix put the patch on Savannah. If it is a patch that affects + both core and arch specific stuff please separate them so that the core can + be applied separately while leaving the other patch 'open'. The prefered way + is to NOT touch archs you can't test and let maintainers take care of them. + This is a good way to see if they are used at all - the same goes for unix + netifs except tapif. +4. Do not file a bug and post a fix to it to the patch area. Either a bug report + or a patch will be enough. + If you correct an existing bug then attach the patch to the bug rather than creating a new entry in the patch area. +5. Trivial patches (compiler warning, indentation and spelling fixes or anything obvious which takes a line or two) + can go to the lwip-users list. This is still the fastest way of interaction and the list is not so crowded + as to allow for loss of fixes. Putting bugs on Savannah and subsequently closing them is too much an overhead + for reporting a compiler warning fix. +6. Patches should be specific to a single change or to related changes.Do not mix bugfixes with spelling and other + trivial fixes unless the bugfix is trivial too.Do not reorganize code and rename identifiers in the same patch you + change behaviour if not necessary.A patch is easier to read and understand if it's to the point and short than + if it's not to the point and long :) so the chances for it to be applied are greater. + +2.4 Platform porters: + +1. If you have ported lwIP to a platform (an OS, a uC/processor or a combination of these) and + you think it could benefit others[1] you might want discuss this on the mailing list. You + can also ask for CVS access to submit and maintain your port in the contrib CVS module. + \ No newline at end of file diff --git a/third_party/lwip-1.4.1/doc/rawapi.txt b/third_party/lwip-1.4.1/doc/rawapi.txt new file mode 100644 index 0000000..1e18e19 --- /dev/null +++ b/third_party/lwip-1.4.1/doc/rawapi.txt @@ -0,0 +1,511 @@ +Raw TCP/IP interface for lwIP + +Authors: Adam Dunkels, Leon Woestenberg, Christiaan Simons + +lwIP provides three Application Program's Interfaces (APIs) for programs +to use for communication with the TCP/IP code: +* low-level "core" / "callback" or "raw" API. +* higher-level "sequential" API. +* BSD-style socket API. + +The sequential API provides a way for ordinary, sequential, programs +to use the lwIP stack. It is quite similar to the BSD socket API. The +model of execution is based on the blocking open-read-write-close +paradigm. Since the TCP/IP stack is event based by nature, the TCP/IP +code and the application program must reside in different execution +contexts (threads). + +The socket API is a compatibility API for existing applications, +currently it is built on top of the sequential API. It is meant to +provide all functions needed to run socket API applications running +on other platforms (e.g. unix / windows etc.). However, due to limitations +in the specification of this API, there might be incompatibilities +that require small modifications of existing programs. + +** Threading + +lwIP started targeting single-threaded environments. When adding multi- +threading support, instead of making the core thread-safe, another +approach was chosen: there is one main thread running the lwIP core +(also known as the "tcpip_thread"). The raw API may only be used from +this thread! Application threads using the sequential- or socket API +communicate with this main thread through message passing. + + As such, the list of functions that may be called from + other threads or an ISR is very limited! Only functions + from these API header files are thread-safe: + - api.h + - netbuf.h + - netdb.h + - netifapi.h + - sockets.h + - sys.h + + Additionaly, memory (de-)allocation functions may be + called from multiple threads (not ISR!) with NO_SYS=0 + since they are protected by SYS_LIGHTWEIGHT_PROT and/or + semaphores. + + Only since 1.3.0, if SYS_LIGHTWEIGHT_PROT is set to 1 + and LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT is set to 1, + pbuf_free() may also be called from another thread or + an ISR (since only then, mem_free - for PBUF_RAM - may + be called from an ISR: otherwise, the HEAP is only + protected by semaphores). + + +** The remainder of this document discusses the "raw" API. ** + +The raw TCP/IP interface allows the application program to integrate +better with the TCP/IP code. Program execution is event based by +having callback functions being called from within the TCP/IP +code. The TCP/IP code and the application program both run in the same +thread. The sequential API has a much higher overhead and is not very +well suited for small systems since it forces a multithreaded paradigm +on the application. + +The raw TCP/IP interface is not only faster in terms of code execution +time but is also less memory intensive. The drawback is that program +development is somewhat harder and application programs written for +the raw TCP/IP interface are more difficult to understand. Still, this +is the preferred way of writing applications that should be small in +code size and memory usage. + +Both APIs can be used simultaneously by different application +programs. In fact, the sequential API is implemented as an application +program using the raw TCP/IP interface. + +--- Callbacks + +Program execution is driven by callbacks. Each callback is an ordinary +C function that is called from within the TCP/IP code. Every callback +function is passed the current TCP or UDP connection state as an +argument. Also, in order to be able to keep program specific state, +the callback functions are called with a program specified argument +that is independent of the TCP/IP state. + +The function for setting the application connection state is: + +- void tcp_arg(struct tcp_pcb *pcb, void *arg) + + Specifies the program specific state that should be passed to all + other callback functions. The "pcb" argument is the current TCP + connection control block, and the "arg" argument is the argument + that will be passed to the callbacks. + + +--- TCP connection setup + +The functions used for setting up connections is similar to that of +the sequential API and of the BSD socket API. A new TCP connection +identifier (i.e., a protocol control block - PCB) is created with the +tcp_new() function. This PCB can then be either set to listen for new +incoming connections or be explicitly connected to another host. + +- struct tcp_pcb *tcp_new(void) + + Creates a new connection identifier (PCB). If memory is not + available for creating the new pcb, NULL is returned. + +- err_t tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, + u16_t port) + + Binds the pcb to a local IP address and port number. The IP address + can be specified as IP_ADDR_ANY in order to bind the connection to + all local IP addresses. + + If another connection is bound to the same port, the function will + return ERR_USE, otherwise ERR_OK is returned. + +- struct tcp_pcb *tcp_listen(struct tcp_pcb *pcb) + + Commands a pcb to start listening for incoming connections. When an + incoming connection is accepted, the function specified with the + tcp_accept() function will be called. The pcb will have to be bound + to a local port with the tcp_bind() function. + + The tcp_listen() function returns a new connection identifier, and + the one passed as an argument to the function will be + deallocated. The reason for this behavior is that less memory is + needed for a connection that is listening, so tcp_listen() will + reclaim the memory needed for the original connection and allocate a + new smaller memory block for the listening connection. + + tcp_listen() may return NULL if no memory was available for the + listening connection. If so, the memory associated with the pcb + passed as an argument to tcp_listen() will not be deallocated. + +- struct tcp_pcb *tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog) + + Same as tcp_listen, but limits the number of outstanding connections + in the listen queue to the value specified by the backlog argument. + To use it, your need to set TCP_LISTEN_BACKLOG=1 in your lwipopts.h. + +- void tcp_accepted(struct tcp_pcb *pcb) + + Inform lwIP that an incoming connection has been accepted. This would + usually be called from the accept callback. This allows lwIP to perform + housekeeping tasks, such as allowing further incoming connections to be + queued in the listen backlog. + ATTENTION: the PCB passed in must be the listening pcb, not the pcb passed + into the accept callback! + +- void tcp_accept(struct tcp_pcb *pcb, + err_t (* accept)(void *arg, struct tcp_pcb *newpcb, + err_t err)) + + Specified the callback function that should be called when a new + connection arrives on a listening connection. + +- err_t tcp_connect(struct tcp_pcb *pcb, ip_addr_t *ipaddr, + u16_t port, err_t (* connected)(void *arg, + struct tcp_pcb *tpcb, + err_t err)); + + Sets up the pcb to connect to the remote host and sends the + initial SYN segment which opens the connection. + + The tcp_connect() function returns immediately; it does not wait for + the connection to be properly setup. Instead, it will call the + function specified as the fourth argument (the "connected" argument) + when the connection is established. If the connection could not be + properly established, either because the other host refused the + connection or because the other host didn't answer, the "err" + callback function of this pcb (registered with tcp_err, see below) + will be called. + + The tcp_connect() function can return ERR_MEM if no memory is + available for enqueueing the SYN segment. If the SYN indeed was + enqueued successfully, the tcp_connect() function returns ERR_OK. + + +--- Sending TCP data + +TCP data is sent by enqueueing the data with a call to +tcp_write(). When the data is successfully transmitted to the remote +host, the application will be notified with a call to a specified +callback function. + +- err_t tcp_write(struct tcp_pcb *pcb, const void *dataptr, u16_t len, + u8_t apiflags) + + Enqueues the data pointed to by the argument dataptr. The length of + the data is passed as the len parameter. The apiflags can be one or more of: + - TCP_WRITE_FLAG_COPY: indicates whether the new memory should be allocated + for the data to be copied into. If this flag is not given, no new memory + should be allocated and the data should only be referenced by pointer. This + also means that the memory behind dataptr must not change until the data is + ACKed by the remote host + - TCP_WRITE_FLAG_MORE: indicates that more data follows. If this is given, + the PSH flag is set in the last segment created by this call to tcp_write. + If this flag is given, the PSH flag is not set. + + The tcp_write() function will fail and return ERR_MEM if the length + of the data exceeds the current send buffer size or if the length of + the queue of outgoing segment is larger than the upper limit defined + in lwipopts.h. The number of bytes available in the output queue can + be retrieved with the tcp_sndbuf() function. + + The proper way to use this function is to call the function with at + most tcp_sndbuf() bytes of data. If the function returns ERR_MEM, + the application should wait until some of the currently enqueued + data has been successfully received by the other host and try again. + +- void tcp_sent(struct tcp_pcb *pcb, + err_t (* sent)(void *arg, struct tcp_pcb *tpcb, + u16_t len)) + + Specifies the callback function that should be called when data has + successfully been received (i.e., acknowledged) by the remote + host. The len argument passed to the callback function gives the + amount bytes that was acknowledged by the last acknowledgment. + + +--- Receiving TCP data + +TCP data reception is callback based - an application specified +callback function is called when new data arrives. When the +application has taken the data, it has to call the tcp_recved() +function to indicate that TCP can advertise increase the receive +window. + +- void tcp_recv(struct tcp_pcb *pcb, + err_t (* recv)(void *arg, struct tcp_pcb *tpcb, + struct pbuf *p, err_t err)) + + Sets the callback function that will be called when new data + arrives. The callback function will be passed a NULL pbuf to + indicate that the remote host has closed the connection. If + there are no errors and the callback function is to return + ERR_OK, then it must free the pbuf. Otherwise, it must not + free the pbuf so that lwIP core code can store it. + +- void tcp_recved(struct tcp_pcb *pcb, u16_t len) + + Must be called when the application has received the data. The len + argument indicates the length of the received data. + + +--- Application polling + +When a connection is idle (i.e., no data is either transmitted or +received), lwIP will repeatedly poll the application by calling a +specified callback function. This can be used either as a watchdog +timer for killing connections that have stayed idle for too long, or +as a method of waiting for memory to become available. For instance, +if a call to tcp_write() has failed because memory wasn't available, +the application may use the polling functionality to call tcp_write() +again when the connection has been idle for a while. + +- void tcp_poll(struct tcp_pcb *pcb, + err_t (* poll)(void *arg, struct tcp_pcb *tpcb), + u8_t interval) + + Specifies the polling interval and the callback function that should + be called to poll the application. The interval is specified in + number of TCP coarse grained timer shots, which typically occurs + twice a second. An interval of 10 means that the application would + be polled every 5 seconds. + + +--- Closing and aborting connections + +- err_t tcp_close(struct tcp_pcb *pcb) + + Closes the connection. The function may return ERR_MEM if no memory + was available for closing the connection. If so, the application + should wait and try again either by using the acknowledgment + callback or the polling functionality. If the close succeeds, the + function returns ERR_OK. + + The pcb is deallocated by the TCP code after a call to tcp_close(). + +- void tcp_abort(struct tcp_pcb *pcb) + + Aborts the connection by sending a RST (reset) segment to the remote + host. The pcb is deallocated. This function never fails. + + ATTENTION: When calling this from one of the TCP callbacks, make + sure you always return ERR_ABRT (and never return ERR_ABRT otherwise + or you will risk accessing deallocated memory or memory leaks! + + +If a connection is aborted because of an error, the application is +alerted of this event by the err callback. Errors that might abort a +connection are when there is a shortage of memory. The callback +function to be called is set using the tcp_err() function. + +- void tcp_err(struct tcp_pcb *pcb, void (* err)(void *arg, + err_t err)) + + The error callback function does not get the pcb passed to it as a + parameter since the pcb may already have been deallocated. + + +--- Lower layer TCP interface + +TCP provides a simple interface to the lower layers of the +system. During system initialization, the function tcp_init() has +to be called before any other TCP function is called. When the system +is running, the two timer functions tcp_fasttmr() and tcp_slowtmr() +must be called with regular intervals. The tcp_fasttmr() should be +called every TCP_FAST_INTERVAL milliseconds (defined in tcp.h) and +tcp_slowtmr() should be called every TCP_SLOW_INTERVAL milliseconds. + + +--- UDP interface + +The UDP interface is similar to that of TCP, but due to the lower +level of complexity of UDP, the interface is significantly simpler. + +- struct udp_pcb *udp_new(void) + + Creates a new UDP pcb which can be used for UDP communication. The + pcb is not active until it has either been bound to a local address + or connected to a remote address. + +- void udp_remove(struct udp_pcb *pcb) + + Removes and deallocates the pcb. + +- err_t udp_bind(struct udp_pcb *pcb, ip_addr_t *ipaddr, + u16_t port) + + Binds the pcb to a local address. The IP-address argument "ipaddr" + can be IP_ADDR_ANY to indicate that it should listen to any local IP + address. The function currently always return ERR_OK. + +- err_t udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, + u16_t port) + + Sets the remote end of the pcb. This function does not generate any + network traffic, but only set the remote address of the pcb. + +- err_t udp_disconnect(struct udp_pcb *pcb) + + Remove the remote end of the pcb. This function does not generate + any network traffic, but only removes the remote address of the pcb. + +- err_t udp_send(struct udp_pcb *pcb, struct pbuf *p) + + Sends the pbuf p. The pbuf is not deallocated. + +- void udp_recv(struct udp_pcb *pcb, + void (* recv)(void *arg, struct udp_pcb *upcb, + struct pbuf *p, + ip_addr_t *addr, + u16_t port), + void *recv_arg) + + Specifies a callback function that should be called when a UDP + datagram is received. + + +--- System initalization + +A truly complete and generic sequence for initializing the lwip stack +cannot be given because it depends on the build configuration (lwipopts.h) +and additional initializations for your runtime environment (e.g. timers). + +We can give you some idea on how to proceed when using the raw API. +We assume a configuration using a single Ethernet netif and the +UDP and TCP transport layers, IPv4 and the DHCP client. + +Call these functions in the order of appearance: + +- stats_init() + + Clears the structure where runtime statistics are gathered. + +- sys_init() + + Not of much use since we set the NO_SYS 1 option in lwipopts.h, + to be called for easy configuration changes. + +- mem_init() + + Initializes the dynamic memory heap defined by MEM_SIZE. + +- memp_init() + + Initializes the memory pools defined by MEMP_NUM_x. + +- pbuf_init() + + Initializes the pbuf memory pool defined by PBUF_POOL_SIZE. + +- etharp_init() + + Initializes the ARP table and queue. + Note: you must call etharp_tmr at a ARP_TMR_INTERVAL (5 seconds) regular interval + after this initialization. + +- ip_init() + + Doesn't do much, it should be called to handle future changes. + +- udp_init() + + Clears the UDP PCB list. + +- tcp_init() + + Clears the TCP PCB list and clears some internal TCP timers. + Note: you must call tcp_fasttmr() and tcp_slowtmr() at the + predefined regular intervals after this initialization. + +- netif_add(struct netif *netif, ip_addr_t *ipaddr, + ip_addr_t *netmask, ip_addr_t *gw, + void *state, err_t (* init)(struct netif *netif), + err_t (* input)(struct pbuf *p, struct netif *netif)) + + Adds your network interface to the netif_list. Allocate a struct + netif and pass a pointer to this structure as the first argument. + Give pointers to cleared ip_addr structures when using DHCP, + or fill them with sane numbers otherwise. The state pointer may be NULL. + + The init function pointer must point to a initialization function for + your ethernet netif interface. The following code illustrates it's use. + + err_t netif_if_init(struct netif *netif) + { + u8_t i; + + for(i = 0; i < ETHARP_HWADDR_LEN; i++) netif->hwaddr[i] = some_eth_addr[i]; + init_my_eth_device(); + return ERR_OK; + } + + For ethernet drivers, the input function pointer must point to the lwip + function ethernet_input() declared in "netif/etharp.h". Other drivers + must use ip_input() declared in "lwip/ip.h". + +- netif_set_default(struct netif *netif) + + Registers the default network interface. + +- netif_set_up(struct netif *netif) + + When the netif is fully configured this function must be called. + +- dhcp_start(struct netif *netif) + + Creates a new DHCP client for this interface on the first call. + Note: you must call dhcp_fine_tmr() and dhcp_coarse_tmr() at + the predefined regular intervals after starting the client. + + You can peek in the netif->dhcp struct for the actual DHCP status. + + +--- Optimalization hints + +The first thing you want to optimize is the lwip_standard_checksum() +routine from src/core/inet.c. You can override this standard +function with the #define LWIP_CHKSUM . + +There are C examples given in inet.c or you might want to +craft an assembly function for this. RFC1071 is a good +introduction to this subject. + +Other significant improvements can be made by supplying +assembly or inline replacements for htons() and htonl() +if you're using a little-endian architecture. +#define LWIP_PLATFORM_BYTESWAP 1 +#define LWIP_PLATFORM_HTONS(x) +#define LWIP_PLATFORM_HTONL(x) + +Check your network interface driver if it reads at +a higher speed than the maximum wire-speed. If the +hardware isn't serviced frequently and fast enough +buffer overflows are likely to occur. + +E.g. when using the cs8900 driver, call cs8900if_service(ethif) +as frequently as possible. When using an RTOS let the cs8900 interrupt +wake a high priority task that services your driver using a binary +semaphore or event flag. Some drivers might allow additional tuning +to match your application and network. + +For a production release it is recommended to set LWIP_STATS to 0. +Note that speed performance isn't influenced much by simply setting +high values to the memory options. + +For more optimization hints take a look at the lwIP wiki. + +--- Zero-copy MACs + +To achieve zero-copy on transmit, the data passed to the raw API must +remain unchanged until sent. Because the send- (or write-)functions return +when the packets have been enqueued for sending, data must be kept stable +after that, too. + +This implies that PBUF_RAM/PBUF_POOL pbufs passed to raw-API send functions +must *not* be reused by the application unless their ref-count is 1. + +For no-copy pbufs (PBUF_ROM/PBUF_REF), data must be kept unchanged, too, +but the stack/driver will/must copy PBUF_REF'ed data when enqueueing, while +PBUF_ROM-pbufs are just enqueued (as ROM-data is expected to never change). + +Also, data passed to tcp_write without the copy-flag must not be changed! + +Therefore, be careful which type of PBUF you use and if you copy TCP data +or not! diff --git a/third_party/lwip-1.4.1/doc/savannah.txt b/third_party/lwip-1.4.1/doc/savannah.txt new file mode 100644 index 0000000..b4c6acb --- /dev/null +++ b/third_party/lwip-1.4.1/doc/savannah.txt @@ -0,0 +1,135 @@ +Daily Use Guide for using Savannah for lwIP + +Table of Contents: + +1 - Obtaining lwIP from the CVS repository +2 - Committers/developers CVS access using SSH (to be written) +3 - Merging from DEVEL branch to main trunk (stable branch) +4 - How to release lwIP + + + +1 Obtaining lwIP from the CVS repository +---------------------------------------- + +To perform an anonymous CVS checkout of the main trunk (this is where +bug fixes and incremental enhancements occur), do this: + +cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/sources/lwip checkout lwip + +Or, obtain a stable branch (updated with bug fixes only) as follows: +cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/sources/lwip checkout \ + -r STABLE-0_7 -d lwip-0.7 lwip + +Or, obtain a specific (fixed) release as follows: +cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/sources/lwip checkout \ + -r STABLE-0_7_0 -d lwip-0.7.0 lwip + +3 Committers/developers CVS access using SSH +-------------------------------------------- + +The Savannah server uses SSH (Secure Shell) protocol 2 authentication and encryption. +As such, CVS commits to the server occur through a SSH tunnel for project members. +To create a SSH2 key pair in UNIX-like environments, do this: + +ssh-keygen -t dsa + +Under Windows, a recommended SSH client is "PuTTY", freely available with good +documentation and a graphic user interface. Use its key generator. + +Now paste the id_dsa.pub contents into your Savannah account public key list. Wait +a while so that Savannah can update its configuration (This can take minutes). + +Try to login using SSH: + +ssh -v your_login@cvs.sv.gnu.org + +If it tells you: + +Authenticating with public key "your_key_name"... +Server refused to allocate pty + +then you could login; Savannah refuses to give you a shell - which is OK, as we +are allowed to use SSH for CVS only. Now, you should be able to do this: + +export CVS_RSH=ssh +cvs -z3 -d:ext:your_login@cvs.sv.gnu.org:/sources/lwip co lwip + +after which you can edit your local files with bug fixes or new features and +commit them. Make sure you know what you are doing when using CVS to make +changes on the repository. If in doubt, ask on the lwip-members mailing list. + +(If SSH asks about authenticity of the host, you can check the key + fingerprint against http://savannah.nongnu.org/cvs/?group=lwip) + + +3 Merging from DEVEL branch to main trunk (stable) +-------------------------------------------------- + +Merging is a delicate process in CVS and requires the +following disciplined steps in order to prevent conflicts +in the future. Conflicts can be hard to solve! + +Merging from branch A to branch B requires that the A branch +has a tag indicating the previous merger. This tag is called +'merged_from_A_to_B'. After merging, the tag is moved in the +A branch to remember this merger for future merge actions. + +IMPORTANT: AFTER COMMITTING A SUCCESFUL MERGE IN THE +REPOSITORY, THE TAG MUST BE SET ON THE SOURCE BRANCH OF THE +MERGE ACTION (REPLACING EXISTING TAGS WITH THE SAME NAME). + +Merge all changes in DEVEL since our last merge to main: + +In the working copy of the main trunk: +cvs update -P -jmerged_from_DEVEL_to_main -jDEVEL + +(This will apply the changes between 'merged_from_DEVEL_to_main' +and 'DEVEL' to your work set of files) + +We can now commit the merge result. +cvs commit -R -m "Merged from DEVEL to main." + +If this worked out OK, we now move the tag in the DEVEL branch +to this merge point, so we can use this point for future merges: + +cvs rtag -F -r DEVEL merged_from_DEVEL_to_main lwip + +4 How to release lwIP +--------------------- + +First, checkout a clean copy of the branch to be released. Tag this set with +tag name "STABLE-0_6_3". (I use release number 0.6.3 throughout this example). + +Login CVS using pserver authentication, then export a clean copy of the +tagged tree. Export is similar to a checkout, except that the CVS metadata +is not created locally. + +export CVS_RSH=ssh +cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/sources/lwip checkout \ + -r STABLE-0_6_3 -d lwip-0.6.3 lwip + +Archive this directory using tar, gzip'd, bzip2'd and zip'd. + +tar czvf lwip-0.6.3.tar.gz lwip-0.6.3 +tar cjvf lwip-0.6.3.tar.bz2 lwip-0.6.3 +zip -r lwip-0.6.3.zip lwip-0.6.3 + +Now, sign the archives with a detached GPG binary signature as follows: + +gpg -b lwip-0.6.3.tar.gz +gpg -b lwip-0.6.3.tar.bz2 +gpg -b lwip-0.6.3.zip + +Upload these files using anonymous FTP: +ncftp ftp://savannah.gnu.org/incoming/savannah/lwip + +ncftp>mput *0.6.3.* + +Additionally, you may post a news item on Savannah, like this: + +A new 0.6.3 release is now available here: +http://savannah.nongnu.org/files/?group=lwip&highlight=0.6.3 + +You will have to submit this via the user News interface, then approve +this via the Administrator News interface. \ No newline at end of file diff --git a/third_party/lwip-1.4.1/doc/snmp_agent.txt b/third_party/lwip-1.4.1/doc/snmp_agent.txt new file mode 100644 index 0000000..2fa057e --- /dev/null +++ b/third_party/lwip-1.4.1/doc/snmp_agent.txt @@ -0,0 +1,181 @@ +SNMPv1 agent for lwIP + +Author: Christiaan Simons + +This is a brief introduction how to use and configure the SNMP agent. +Note the agent uses the raw-API UDP interface so you may also want to +read rawapi.txt to gain a better understanding of the SNMP message handling. + +0 Agent Capabilities +==================== + +SNMPv1 per RFC1157 + This is an old(er) standard but is still widely supported. + For SNMPv2c and v3 have a greater complexity and need many + more lines of code. IMHO this breaks the idea of "lightweight IP". + + Note the S in SNMP stands for "Simple". Note that "Simple" is + relative. SNMP is simple compared to the complex ISO network + management protocols CMIP (Common Management Information Protocol) + and CMOT (CMip Over Tcp). + +MIB II per RFC1213 + The standard lwIP stack management information base. + This is a required MIB, so this is always enabled. + When builing lwIP without TCP, the mib-2.tcp group is omitted. + The groups EGP, CMOT and transmission are disabled by default. + + Most mib-2 objects are not writable except: + sysName, sysLocation, sysContact, snmpEnableAuthenTraps. + Writing to or changing the ARP and IP address and route + tables is not possible. + + Note lwIP has a very limited notion of IP routing. It currently + doen't have a route table and doesn't have a notion of the U,G,H flags. + Instead lwIP uses the interface list with only one default interface + acting as a single gateway interface (G) for the default route. + + The agent returns a "virtual table" with the default route 0.0.0.0 + for the default interface and network routes (no H) for each + network interface in the netif_list. + All routes are considered to be up (U). + +Loading additional MIBs + MIBs can only be added in compile-time, not in run-time. + There is no MIB compiler thus additional MIBs must be hand coded. + +Large SNMP message support + The packet decoding and encoding routines are designed + to use pbuf-chains. Larger payloads than the minimum + SNMP requirement of 484 octets are supported if the + PBUF_POOL_SIZE and IP_REASS_BUFSIZE are set to match your + local requirement. + +1 Building the Agent +==================== + +First of all you'll need to add the following define +to your local lwipopts.h: + +#define LWIP_SNMP 1 + +and add the source files in lwip/src/core/snmp +and some snmp headers in lwip/src/include/lwip to your makefile. + +Note you'll might need to adapt you network driver to update +the mib2 variables for your interface. + +2 Running the Agent +=================== + +The following function calls must be made in your program to +actually get the SNMP agent running. + +Before starting the agent you should supply pointers +to non-volatile memory for sysContact, sysLocation, +and snmpEnableAuthenTraps. You can do this by calling + +snmp_set_syscontact() +snmp_set_syslocation() +snmp_set_snmpenableauthentraps() + +Additionally you may want to set + +snmp_set_sysdescr() +snmp_set_sysobjid() (if you have a private MIB) +snmp_set_sysname() + +Also before starting the agent you need to setup +one or more trap destinations using these calls: + +snmp_trap_dst_enable(); +snmp_trap_dst_ip_set(); + +In the lwIP initialisation sequence call snmp_init() just after +the call to udp_init(). + +Exactly every 10 msec the SNMP uptime timestamp must be updated with +snmp_inc_sysuptime(). You should call this from a timer interrupt +or a timer signal handler depending on your runtime environment. + +An alternative way to update the SNMP uptime timestamp is to do a call like +snmp_add_sysuptime(100) each 1000ms (which is bigger "step", but call to +a lower frequency). Another one is to not call snmp_inc_sysuptime() or +snmp_add_sysuptime(), and to define the SNMP_GET_SYSUPTIME(sysuptime) macro. +This one is undefined by default in mib2.c. SNMP_GET_SYSUPTIME is called inside +snmp_get_sysuptime(u32_t *value), and enable to change "sysuptime" value only +when it's queried (any function which need "sysuptime" have to call +snmp_get_sysuptime). + + +3 Private MIBs +============== + +If want to extend the agent with your own private MIB you'll need to +add the following define to your local lwipopts.h: + +#define SNMP_PRIVATE_MIB 1 + +You must provide the private_mib.h and associated files yourself. +Note we don't have a "MIB compiler" that generates C source from a MIB, +so you're required to do some serious coding if you enable this! + +Note the lwIP enterprise ID (26381) is assigned to the lwIP project, +ALL OBJECT IDENTIFIERS LIVING UNDER THIS ID ARE ASSIGNED BY THE lwIP +MAINTAINERS! + +If you need to create your own private MIB you'll need +to apply for your own enterprise ID with IANA: http://www.iana.org/numbers.html + +You can set it by passing a struct snmp_obj_id to the agent +using snmp_set_sysobjid(&my_object_id), just before snmp_init(). + +Note the object identifiers for thes MIB-2 and your private MIB +tree must be kept in sorted ascending (lexicographical) order. +This to ensure correct getnext operation. + +An example for a private MIB is part of the "minimal Unix" project: +contrib/ports/unix/proj/minimal/lwip_prvmib.c + +The next chapter gives a more detailed description of the +MIB-2 tree and the optional private MIB. + +4 The Gory Details +================== + +4.0 Object identifiers and the MIB tree. + +We have three distinct parts for all object identifiers: + +The prefix + .iso.org.dod.internet + +the middle part + .mgmt.mib-2.ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaPhysAddress + +and the index part + .1.192.168.0.1 + +Objects located above the .internet hierarchy aren't supported. +Currently only the .mgmt sub-tree is available and +when the SNMP_PRIVATE_MIB is enabled the .private tree +becomes available too. + +Object identifiers from incoming requests are checked +for a matching prefix, middle part and index part +or are expanded(*) for GetNext requests with short +or inexisting names in the request. +(* we call this "expansion" but this also +resembles the "auto-completion" operation) + +The middle part is usually located in ROM (const) +to preserve precious RAM on small microcontrollers. +However RAM location is possible for a dynamically +changing private tree. + +The index part is handled by functions which in +turn use dynamically allocated index trees from RAM. +These trees are updated by e.g. the etharp code +when new entries are made or removed form the ARP cache. + +/** @todo more gory details */ diff --git a/third_party/lwip-1.4.1/doc/sys_arch.txt b/third_party/lwip-1.4.1/doc/sys_arch.txt new file mode 100644 index 0000000..260a27b --- /dev/null +++ b/third_party/lwip-1.4.1/doc/sys_arch.txt @@ -0,0 +1,267 @@ +sys_arch interface for lwIP 0.6++ + +Author: Adam Dunkels + +The operating system emulation layer provides a common interface +between the lwIP code and the underlying operating system kernel. The +general idea is that porting lwIP to new architectures requires only +small changes to a few header files and a new sys_arch +implementation. It is also possible to do a sys_arch implementation +that does not rely on any underlying operating system. + +The sys_arch provides semaphores and mailboxes to lwIP. For the full +lwIP functionality, multiple threads support can be implemented in the +sys_arch, but this is not required for the basic lwIP +functionality. Previous versions of lwIP required the sys_arch to +implement timer scheduling as well but as of lwIP 0.5 this is +implemented in a higher layer. + +In addition to the source file providing the functionality of sys_arch, +the OS emulation layer must provide several header files defining +macros used throughout lwip. The files required and the macros they +must define are listed below the sys_arch description. + +Semaphores can be either counting or binary - lwIP works with both +kinds. Mailboxes are used for message passing and can be implemented +either as a queue which allows multiple messages to be posted to a +mailbox, or as a rendez-vous point where only one message can be +posted at a time. lwIP works with both kinds, but the former type will +be more efficient. A message in a mailbox is just a pointer, nothing +more. + +Semaphores are represented by the type "sys_sem_t" which is typedef'd +in the sys_arch.h file. Mailboxes are equivalently represented by the +type "sys_mbox_t". lwIP does not place any restrictions on how +sys_sem_t or sys_mbox_t are represented internally. + +Since lwIP 1.4.0, semaphore and mailbox functions are prototyped in a way that +allows both using pointers or actual OS structures to be used. This way, memory +required for such types can be either allocated in place (globally or on the +stack) or on the heap (allocated internally in the "*_new()" functions). + +The following functions must be implemented by the sys_arch: + +- void sys_init(void) + + Is called to initialize the sys_arch layer. + +- err_t sys_sem_new(sys_sem_t *sem, u8_t count) + + Creates a new semaphore. The semaphore is allocated to the memory that 'sem' + points to (which can be both a pointer or the actual OS structure). + The "count" argument specifies the initial state of the semaphore (which is + either 0 or 1). + If the semaphore has been created, ERR_OK should be returned. Returning any + other error will provide a hint what went wrong, but except for assertions, + no real error handling is implemented. + +- void sys_sem_free(sys_sem_t *sem) + + Deallocates a semaphore. + +- void sys_sem_signal(sys_sem_t *sem) + + Signals a semaphore. + +- u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) + + Blocks the thread while waiting for the semaphore to be + signaled. If the "timeout" argument is non-zero, the thread should + only be blocked for the specified time (measured in + milliseconds). If the "timeout" argument is zero, the thread should be + blocked until the semaphore is signalled. + + If the timeout argument is non-zero, the return value is the number of + milliseconds spent waiting for the semaphore to be signaled. If the + semaphore wasn't signaled within the specified time, the return value is + SYS_ARCH_TIMEOUT. If the thread didn't have to wait for the semaphore + (i.e., it was already signaled), the function may return zero. + + Notice that lwIP implements a function with a similar name, + sys_sem_wait(), that uses the sys_arch_sem_wait() function. + +- int sys_sem_valid(sys_sem_t *sem) + + Returns 1 if the semaphore is valid, 0 if it is not valid. + When using pointers, a simple way is to check the pointer for != NULL. + When directly using OS structures, implementing this may be more complex. + This may also be a define, in which case the function is not prototyped. + +- void sys_sem_set_invalid(sys_sem_t *sem) + + Invalidate a semaphore so that sys_sem_valid() returns 0. + ATTENTION: This does NOT mean that the semaphore shall be deallocated: + sys_sem_free() is always called before calling this function! + This may also be a define, in which case the function is not prototyped. + +- err_t sys_mbox_new(sys_mbox_t *mbox, int size) + + Creates an empty mailbox for maximum "size" elements. Elements stored + in mailboxes are pointers. You have to define macros "_MBOX_SIZE" + in your lwipopts.h, or ignore this parameter in your implementation + and use a default size. + If the mailbox has been created, ERR_OK should be returned. Returning any + other error will provide a hint what went wrong, but except for assertions, + no real error handling is implemented. + +- void sys_mbox_free(sys_mbox_t *mbox) + + Deallocates a mailbox. If there are messages still present in the + mailbox when the mailbox is deallocated, it is an indication of a + programming error in lwIP and the developer should be notified. + +- void sys_mbox_post(sys_mbox_t *mbox, void *msg) + + Posts the "msg" to the mailbox. This function have to block until + the "msg" is really posted. + +- err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) + + Try to post the "msg" to the mailbox. Returns ERR_MEM if this one + is full, else, ERR_OK if the "msg" is posted. + +- u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) + + Blocks the thread until a message arrives in the mailbox, but does + not block the thread longer than "timeout" milliseconds (similar to + the sys_arch_sem_wait() function). If "timeout" is 0, the thread should + be blocked until a message arrives. The "msg" argument is a result + parameter that is set by the function (i.e., by doing "*msg = + ptr"). The "msg" parameter maybe NULL to indicate that the message + should be dropped. + + The return values are the same as for the sys_arch_sem_wait() function: + Number of milliseconds spent waiting or SYS_ARCH_TIMEOUT if there was a + timeout. + + Note that a function with a similar name, sys_mbox_fetch(), is + implemented by lwIP. + +- u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) + + This is similar to sys_arch_mbox_fetch, however if a message is not + present in the mailbox, it immediately returns with the code + SYS_MBOX_EMPTY. On success 0 is returned. + + To allow for efficient implementations, this can be defined as a + function-like macro in sys_arch.h instead of a normal function. For + example, a naive implementation could be: + #define sys_arch_mbox_tryfetch(mbox,msg) \ + sys_arch_mbox_fetch(mbox,msg,1) + although this would introduce unnecessary delays. + +- int sys_mbox_valid(sys_mbox_t *mbox) + + Returns 1 if the mailbox is valid, 0 if it is not valid. + When using pointers, a simple way is to check the pointer for != NULL. + When directly using OS structures, implementing this may be more complex. + This may also be a define, in which case the function is not prototyped. + +- void sys_mbox_set_invalid(sys_mbox_t *mbox) + + Invalidate a mailbox so that sys_mbox_valid() returns 0. + ATTENTION: This does NOT mean that the mailbox shall be deallocated: + sys_mbox_free() is always called before calling this function! + This may also be a define, in which case the function is not prototyped. + +If threads are supported by the underlying operating system and if +such functionality is needed in lwIP, the following function will have +to be implemented as well: + +- sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), void *arg, int stacksize, int prio) + + Starts a new thread named "name" with priority "prio" that will begin its + execution in the function "thread()". The "arg" argument will be passed as an + argument to the thread() function. The stack size to used for this thread is + the "stacksize" parameter. The id of the new thread is returned. Both the id + and the priority are system dependent. + +- sys_prot_t sys_arch_protect(void) + + This optional function does a "fast" critical region protection and returns + the previous protection level. This function is only called during very short + critical regions. An embedded system which supports ISR-based drivers might + want to implement this function by disabling interrupts. Task-based systems + might want to implement this by using a mutex or disabling tasking. This + function should support recursive calls from the same task or interrupt. In + other words, sys_arch_protect() could be called while already protected. In + that case the return value indicates that it is already protected. + + sys_arch_protect() is only required if your port is supporting an operating + system. + +- void sys_arch_unprotect(sys_prot_t pval) + + This optional function does a "fast" set of critical region protection to the + value specified by pval. See the documentation for sys_arch_protect() for + more information. This function is only required if your port is supporting + an operating system. + +For some configurations, you also need: + +- u32_t sys_now(void) + + This optional function returns the current time in milliseconds (don't care + for wraparound, this is only used for time diffs). + Not implementing this function means you cannot use some modules (e.g. TCP + timestamps, internal timeouts for NO_SYS==1). + + +Note: + +Be carefull with using mem_malloc() in sys_arch. When malloc() refers to +mem_malloc() you can run into a circular function call problem. In mem.c +mem_init() tries to allcate a semaphore using mem_malloc, which of course +can't be performed when sys_arch uses mem_malloc. + +------------------------------------------------------------------------------- +Additional files required for the "OS support" emulation layer: +------------------------------------------------------------------------------- + +cc.h - Architecture environment, some compiler specific, some + environment specific (probably should move env stuff + to sys_arch.h.) + + Typedefs for the types used by lwip - + u8_t, s8_t, u16_t, s16_t, u32_t, s32_t, mem_ptr_t + + Compiler hints for packing lwip's structures - + PACK_STRUCT_FIELD(x) + PACK_STRUCT_STRUCT + PACK_STRUCT_BEGIN + PACK_STRUCT_END + + Platform specific diagnostic output - + LWIP_PLATFORM_DIAG(x) - non-fatal, print a message. + LWIP_PLATFORM_ASSERT(x) - fatal, print message and abandon execution. + Portability defines for printf formatters: + U16_F, S16_F, X16_F, U32_F, S32_F, X32_F, SZT_F + + "lightweight" synchronization mechanisms - + SYS_ARCH_DECL_PROTECT(x) - declare a protection state variable. + SYS_ARCH_PROTECT(x) - enter protection mode. + SYS_ARCH_UNPROTECT(x) - leave protection mode. + + If the compiler does not provide memset() this file must include a + definition of it, or include a file which defines it. + + This file must either include a system-local which defines + the standard *nix error codes, or it should #define LWIP_PROVIDE_ERRNO + to make lwip/arch.h define the codes which are used throughout. + + +perf.h - Architecture specific performance measurement. + Measurement calls made throughout lwip, these can be defined to nothing. + PERF_START - start measuring something. + PERF_STOP(x) - stop measuring something, and record the result. + +sys_arch.h - Tied to sys_arch.c + + Arch dependent types for the following objects: + sys_sem_t, sys_mbox_t, sys_thread_t, + And, optionally: + sys_prot_t + + Defines to set vars of sys_mbox_t and sys_sem_t to NULL. + SYS_MBOX_NULL NULL + SYS_SEM_NULL NULL diff --git a/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/FILES b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/FILES new file mode 100644 index 0000000..65ca7bb --- /dev/null +++ b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/FILES @@ -0,0 +1,6 @@ +bpstruct.h - Used to define beginning of packed structures. +cc.h - System defines for Stellaris/DriverLib conventions. +epstruct.h - Used to define end of packed structures. +perf.h - Stub performance monitor include file (not used). +sys_arch.h - Stub System Architecture file for Stellaris. + diff --git a/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/bpstruct.h b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/bpstruct.h new file mode 100644 index 0000000..1e0dde0 --- /dev/null +++ b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/bpstruct.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#if defined(__IAR_SYSTEMS_ICC__) +#pragma pack(1) +#endif + diff --git a/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/cc.h b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/cc.h new file mode 100644 index 0000000..1e8337b --- /dev/null +++ b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/cc.h @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __CC_H__ +#define __CC_H__ + +typedef unsigned char u8_t; +typedef signed char s8_t; +typedef unsigned short u16_t; +typedef signed short s16_t; +typedef unsigned long u32_t; +typedef signed long s32_t; +typedef u32_t mem_ptr_t; +typedef u8_t sys_prot_t; + +#ifndef BYTE_ORDER +#define BYTE_ORDER LITTLE_ENDIAN +#endif + +#if defined(__arm__) && defined(__ARMCC_VERSION) + // + // Setup PACKing macros for KEIL/RVMDK Tools + // + #define PACK_STRUCT_BEGIN __packed + #define PACK_STRUCT_STRUCT + #define PACK_STRUCT_END + #define PACK_STRUCT_FIELD(x) x +#elif defined (__IAR_SYSTEMS_ICC__) + // + // Setup PACKing macros for IAR Tools + // + #define PACK_STRUCT_BEGIN + #define PACK_STRUCT_STRUCT + #define PACK_STRUCT_END + #define PACK_STRUCT_FIELD(x) x + #define PACK_STRUCT_USE_INCLUDES +#else + // + // Setup PACKing macros for GCC Tools + // + #define PACK_STRUCT_BEGIN + #define PACK_STRUCT_STRUCT __attribute__ ((__packed__)) + #define PACK_STRUCT_END + #define PACK_STRUCT_FIELD(x) x +#endif + +//***************************************************************************** +// +// Define LWIP_PLATFORM_DIAG and LWIP_PLATFORM_ASSERT macros. Both of these +// are expected to display the message argument using a platform/app specific +// display routine. The ASSERT macro should then abort execution. +// +// In general, the user should define these in the target/application specific +// LWIPOPTS.H file, using whatever display mechanisms are availble for the +// board/application. However, some general default macros are provided here +// to allow the LWIP code to build properly with/without the DEBUG macro +// defined. +// +//***************************************************************************** +// +// Define an empty DIAG display maro here ... since we have no knowledge of +// what display routines are available. +// +#ifndef LWIP_PLATFORM_DIAG +#define LWIP_PLATFORM_DIAG(msg) +#endif + +// +// Define a generic ASSERT display macro here ... use the DIAG macro to display +// the message, then use the __error__ function, which should always be +// defined by the user application for DEBUG builds, to abandon execution. +// +#ifndef LWIP_PLATFORM_ASSERT +#ifdef DEBUG + +#include +#include + +extern void __error__(char *pcFilename, uint32_t ui32Line); +#define LWIP_PLATFORM_ASSERT(msg) \ +{ \ + LWIP_PLATFORM_DIAG(msg); \ + __error__(__FILE__, __LINE__); \ +} +#else +#define LWIP_PLATFORM_ASSERT(msg) +#endif +#endif + +#endif /* __CC_H__ */ diff --git a/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/epstruct.h b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/epstruct.h new file mode 100644 index 0000000..41951f7 --- /dev/null +++ b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/epstruct.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#if defined(__IAR_SYSTEMS_ICC__) +#pragma pack() +#endif + diff --git a/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/perf.h b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/perf.h new file mode 100644 index 0000000..68afdb5 --- /dev/null +++ b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/perf.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __PERF_H__ +#define __PERF_H__ + +#define PERF_START /* null definition */ +#define PERF_STOP(x) /* null definition */ + +#endif /* __PERF_H__ */ diff --git a/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/sys_arch.h b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/sys_arch.h new file mode 100644 index 0000000..4753eb0 --- /dev/null +++ b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/arch/sys_arch.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __ARCH_SYS_ARCH_H__ +#define __ARCH_SYS_ARCH_H__ + +#if RTOS_FREERTOS +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" +#define portQUEUE_OVERHEAD_BYTES 1 // Constant, used for consistency +#endif /* RTOS_FREERTOS */ + +/* Find the size of the largest required mbox. */ +#define MAX1 ((TCPIP_MBOX_SIZE > DEFAULT_RAW_RECVMBOX_SIZE) ? \ + TCPIP_MBOX_SIZE : DEFAULT_RAW_RECVMBOX_SIZE) +#define MAX2 ((MAX1 > DEFAULT_UDP_RECVMBOX_SIZE) ? MAX1 : \ + DEFAULT_UDP_RECVMBOX_SIZE) +#define MAX3 ((MAX2 > DEFAULT_TCP_RECVMBOX_SIZE) ? MAX2 : \ + DEFAULT_TCP_RECVMBOX_SIZE) +#define MBOX_MAX ((MAX3 > DEFAULT_ACCEPTMBOX_SIZE) ? MAX3 : \ + DEFAULT_ACCEPTMBOX_SIZE) + +///* A structure to hold the variables for a sys_sem_t. */ +typedef struct { + xQueueHandle queue; + signed char buffer[sizeof(void *) + portQUEUE_OVERHEAD_BYTES]; +} sem_t; + +/* A structure to hold the variables for a sys_mbox_t. */ +typedef struct { + xQueueHandle queue; + signed char buffer[(sizeof(void *) * MBOX_MAX) + portQUEUE_OVERHEAD_BYTES]; +} mbox_t; + +/* Typedefs for the various port-specific types. */ +typedef mbox_t sys_mbox_t; +typedef sem_t sys_sem_t; +typedef xTaskHandle sys_thread_t; + +/* The value for an unallocated mbox. */ +#define SYS_MBOX_NULL 0 + +#endif /* __ARCH_SYS_ARCH_H__ */ + diff --git a/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/netif/FILES b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/netif/FILES new file mode 100644 index 0000000..9d09706 --- /dev/null +++ b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/netif/FILES @@ -0,0 +1,2 @@ +tivaif.h - public prototypes for the TivaWare ethernet interface driver + diff --git a/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/netif/tivaif.h b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/netif/tivaif.h new file mode 100644 index 0000000..277560a --- /dev/null +++ b/third_party/lwip-1.4.1/ports/tiva-tm4c129/include/netif/tivaif.h @@ -0,0 +1,58 @@ +/** + * @file - tivaif.h + * Prototypes for Stellaris Ethernet interface. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +/* + * Copyright (c) 2008 Texas Instruments Incorporated + * + */ + + +#ifndef __TIVAIF_H__ +#define __TIVAIF_H__ + +extern int tivaif_input(struct netif *psNetif); +extern err_t tivaif_init(struct netif *psNetif); +extern void tivaif_interrupt(struct netif *netif, uint32_t ui32Status); + +#if NETIF_DEBUG +void tivaif_debug_print(struct pbuf *psBuf); +#else +#define tivaif_debug_print(psBuf) +#endif /* NETIF_DEBUG */ + +#endif // __TIVAIF_H__ diff --git a/third_party/lwip-1.4.1/ports/tiva-tm4c129/netif/FILES b/third_party/lwip-1.4.1/ports/tiva-tm4c129/netif/FILES new file mode 100644 index 0000000..e3e2157 --- /dev/null +++ b/third_party/lwip-1.4.1/ports/tiva-tm4c129/netif/FILES @@ -0,0 +1 @@ +stellarisif.c - lwIP Ethernet interface for Stellaris devices. diff --git a/third_party/lwip-1.4.1/ports/tiva-tm4c129/netif/tiva-tm4c129.c b/third_party/lwip-1.4.1/ports/tiva-tm4c129/netif/tiva-tm4c129.c new file mode 100644 index 0000000..9506172 --- /dev/null +++ b/third_party/lwip-1.4.1/ports/tiva-tm4c129/netif/tiva-tm4c129.c @@ -0,0 +1,1126 @@ +/** + * @file - tivaif.c + * lwIP Ethernet interface for Stellaris LM4F Devices + * + */ + +/** + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICui32AR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +/** + * Copyright (c) 2008-2012 Texas Instruments Incorporated + * + * This file is derived from the ``ethernetif.c'' skeleton Ethernet network + * interface driver for lwIP. + * + */ + +#include "lwip/opt.h" +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/pbuf.h" +#include "lwip/sys.h" +#include +#include +#include "lwip/tcpip.h" +#include "netif/etharp.h" +#include "netif/ppp_oe.h" +#include "netif/tivaif.h" + +/** + * Sanity Check: This interface driver will NOT work if the following defines + * are incorrect. + * + */ +#if (PBUF_LINK_HLEN != 16) +#error "PBUF_LINK_HLEN must be 16 for this interface driver!" +#endif +#if (ETH_PAD_SIZE != 0) +#error "ETH_PAD_SIZE must be 0 for this interface driver!" +#endif +#if (!SYS_LIGHTWEIGHT_PROT) +#error "SYS_LIGHTWEIGHT_PROT must be enabled for this interface driver!" +#endif + +/** + * Set the physical address of the PHY we will be using if this is not + * specified in lwipopts.h. We assume 0 for the internal PHY. + */ +#ifndef PHY_PHYS_ADDR +#define PHY_PHYS_ADDR 0 +#endif + +#if 0 +#ifndef EMAC_PHY_CONFIG +#define EMAC_PHY_CONFIG (EMAC_PHY_TYPE_INTERNAL | EMAC_PHY_INT_MDIX_EN | \ + EMAC_PHY_AN_100B_T_FULL_DUPLEX) +#endif +#endif + +/** + * If necessary, set the defaui32t number of transmit and receive DMA descriptors + * used by the Ethernet MAC. + * + */ +#ifndef NUM_RX_DESCRIPTORS +#define NUM_RX_DESCRIPTORS 4 +#endif + +#ifndef NUM_TX_DESCRIPTORS +#define NUM_TX_DESCRIPTORS 8 +#endif + +/** + * Setup processing for PTP (IEEE-1588). + * + */ +#if LWIP_PTPD +extern uint32_t g_ui32SysClk; +extern uint32_t g_ui32PTPTickRate; +extern void lwIPHostGetTime(u32_t *time_s, u32_t *time_ns); +#endif + +/** + * Stellaris DriverLib Header Files required for this interface driver. + * + */ +#include +#include +#include "inc/hw_emac.h" +#include "inc/hw_ints.h" +#include "inc/hw_memmap.h" +#include "inc/hw_types.h" +#include "driverlib/emac.h" +#include "driverlib/interrupt.h" +#include "driverlib/sysctl.h" + +/* Define those to better describe your network interface. */ +#define IFNAME0 't' +#define IFNAME1 'i' + +/** + * A structure used to keep track of driver state and error counts. + */ +typedef struct { + uint32_t ui32TXCount; + uint32_t ui32TXCopyCount; + uint32_t ui32TXCopyFailCount; + uint32_t ui32TXNoDescCount; + uint32_t ui32TXBufQueuedCount; + uint32_t ui32TXBufFreedCount; + uint32_t ui32RXBufReadCount; + uint32_t ui32RXPacketReadCount; + uint32_t ui32RXPacketErrCount; + uint32_t ui32RXPacketCBErrCount; + uint32_t ui32RXNoBufCount; +} +tDriverStats; + +tDriverStats g_sDriverStats; + +#ifdef DEBUG +/** + * Note: This rather weird construction where we invoke the macro with the + * name of the field minus its Hungarian prefix is a workaround for a problem + * experienced with GCC which does not like concatenating tokens after an + * operator, specifically '.' or '->', in a macro. + */ +#define DRIVER_STATS_INC(x) do{ g_sDriverStats.ui32##x++; } while(0) +#define DRIVER_STATS_DEC(x) do{ g_sDriverStats.ui32##x--; } while(0) +#define DRIVER_STATS_ADD(x, inc) do{ g_sDriverStats.ui32##x += (inc); } while(0) +#define DRIVER_STATS_SUB(x, dec) do{ g_sDriverStats.ui32##x -= (dec); } while(0) +#else +#define DRIVER_STATS_INC(x) +#define DRIVER_STATS_DEC(x) +#define DRIVER_STATS_ADD(x, inc) +#define DRIVER_STATS_SUB(x, dec) +#endif + +/** + * Helper struct holding a DMA descriptor and the pbuf it currently refers + * to. + */ +typedef struct { + tEMACDMADescriptor Desc; + struct pbuf *pBuf; +} tDescriptor; + +typedef struct { + tDescriptor *pDescriptors; + uint32_t ui32NumDescs; + uint32_t ui32Read; + uint32_t ui32Write; +} tDescriptorList; + +/** + * Helper struct to hold private data used to operate your ethernet interface. + * Keeping the ethernet address of the MAC in this struct is not necessary + * as it is already kept in the struct netif. + * But this is only an example, anyway... + */ +typedef struct { + struct eth_addr *ethaddr; + /* Add whatever per-interface state that is needed here. */ + tDescriptorList *pTxDescList; + tDescriptorList *pRxDescList; +} tStellarisIF; + +/** + * Global variable for this interface's private data. Needed to allow + * the interrupt handlers access to this information outside of the + * context of the lwIP netif. + * + */ +tDescriptor g_pTxDescriptors[NUM_TX_DESCRIPTORS]; +tDescriptor g_pRxDescriptors[NUM_RX_DESCRIPTORS]; +tDescriptorList g_TxDescList = { + g_pTxDescriptors, NUM_TX_DESCRIPTORS, 0, 0 +}; +tDescriptorList g_RxDescList = { + g_pRxDescriptors, NUM_RX_DESCRIPTORS, 0, 0 +}; +static tStellarisIF g_StellarisIFData = { + 0, &g_TxDescList, &g_RxDescList +}; + +/** + * Interrupt counters (for debug purposes). + */ +volatile uint32_t g_ui32NormalInts; +volatile uint32_t g_ui32AbnormalInts; + +/** + * A macro which determines whether a pointer is within the SRAM address + * space and, hence, points to a buffer that the Ethernet MAC can directly + * DMA from. + */ +#define PTR_SAFE_FOR_EMAC_DMA(ptr) (((uint32_t)(ptr) >= 0x2000000) && \ + ((uint32_t)(ptr) < 0x20070000)) +/** + * Initialize the transmit and receive DMA descriptor lists. + */ +void +InitDMADescriptors(void) +{ + uint32_t ui32Loop; + + /* Transmit list - mark all descriptors as not owned by the hardware */ + for(ui32Loop = 0; ui32Loop < NUM_TX_DESCRIPTORS; ui32Loop++) + { + g_pTxDescriptors[ui32Loop].pBuf = (struct pbuf *)0; + g_pTxDescriptors[ui32Loop].Desc.ui32Count = 0; + g_pTxDescriptors[ui32Loop].Desc.pvBuffer1 = 0; + g_pTxDescriptors[ui32Loop].Desc.DES3.pLink = + ((ui32Loop == (NUM_TX_DESCRIPTORS - 1)) ? + &g_pTxDescriptors[0].Desc : &g_pTxDescriptors[ui32Loop + 1].Desc); + g_pTxDescriptors[ui32Loop].Desc.ui32CtrlStatus = DES0_TX_CTRL_INTERRUPT | + DES0_TX_CTRL_CHAINED | DES0_TX_CTRL_IP_ALL_CKHSUMS; + + } + + g_TxDescList.ui32Read = 0; + g_TxDescList.ui32Write = 0; + + + /* Receive list - tag each descriptor with a pbuf and set all fields to + * allow packets to be received. + */ + for(ui32Loop = 0; ui32Loop < NUM_RX_DESCRIPTORS; ui32Loop++) + { + g_pRxDescriptors[ui32Loop].pBuf = pbuf_alloc(PBUF_RAW, PBUF_POOL_BUFSIZE, + PBUF_POOL); + g_pRxDescriptors[ui32Loop].Desc.ui32Count = DES1_RX_CTRL_CHAINED; + if(g_pRxDescriptors[ui32Loop].pBuf) + { + /* Set the DMA to write directly into the pbuf payload. */ + g_pRxDescriptors[ui32Loop].Desc.pvBuffer1 = + g_pRxDescriptors[ui32Loop].pBuf->payload; + g_pRxDescriptors[ui32Loop].Desc.ui32Count |= + (g_pRxDescriptors[ui32Loop].pBuf->len << DES1_RX_CTRL_BUFF1_SIZE_S); + g_pRxDescriptors[ui32Loop].Desc.ui32CtrlStatus = DES0_RX_CTRL_OWN; + } + else + { + LWIP_DEBUGF(NETIF_DEBUG, ("tivaif_init: pbuf_alloc error\n")); + + /* No pbuf available so leave the buffer pointer empty. */ + g_pRxDescriptors[ui32Loop].Desc.pvBuffer1 = 0; + g_pRxDescriptors[ui32Loop].Desc.ui32CtrlStatus = 0; + } + g_pRxDescriptors[ui32Loop].Desc.DES3.pLink = + ((ui32Loop == (NUM_RX_DESCRIPTORS - 1)) ? + &g_pRxDescriptors[0].Desc : &g_pRxDescriptors[ui32Loop + 1].Desc); + } + + g_TxDescList.ui32Read = 0; + g_TxDescList.ui32Write = 0; + + // + // Set the descriptor pointers in the hardware. + // + EMACRxDMADescriptorListSet(EMAC0_BASE, &g_pRxDescriptors[0].Desc); + EMACTxDMADescriptorListSet(EMAC0_BASE, &g_pTxDescriptors[0].Desc); +} + +/** + * In this function, the hardware should be initialized. + * Called from tivaif_init(). + * + * @param netif the already initialized lwip network interface structure + * for this ethernetif + */ +static void +tivaif_hwinit(struct netif *psNetif) +{ + uint16_t ui16Val; + + /* Set MAC hardware address length */ + psNetif->hwaddr_len = ETHARP_HWADDR_LEN; + + /* Set MAC hardware address */ + EMACAddrGet(EMAC0_BASE, 0, &(psNetif->hwaddr[0])); + + /* Maximum transfer unit */ + psNetif->mtu = 1500; + + /* Device capabilities */ + psNetif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP; + + /* Initialize the DMA descriptors. */ + InitDMADescriptors(); + + /* Clear any stray PHY interrupts that may be set. */ + ui16Val = EMACPHYRead(EMAC0_BASE, PHY_PHYS_ADDR, EPHY_MISR1); + ui16Val = EMACPHYRead(EMAC0_BASE, PHY_PHYS_ADDR, EPHY_MISR2); + + /* Configure and enable the link status change interrupt in the PHY. */ + ui16Val = EMACPHYRead(EMAC0_BASE, PHY_PHYS_ADDR, EPHY_SCR); + ui16Val |= (EPHY_SCR_INTEN_EXT | EPHY_SCR_INTOE_EXT); + EMACPHYWrite(EMAC0_BASE, PHY_PHYS_ADDR, EPHY_SCR, ui16Val); + EMACPHYWrite(EMAC0_BASE, PHY_PHYS_ADDR, EPHY_MISR1, (EPHY_MISR1_LINKSTATEN | + EPHY_MISR1_SPEEDEN | EPHY_MISR1_DUPLEXMEN | EPHY_MISR1_ANCEN)); + + /* Read the PHY interrupt status to clear any stray events. */ + ui16Val = EMACPHYRead(EMAC0_BASE, PHY_PHYS_ADDR, EPHY_MISR1); + + /** + * Set MAC filtering options. We receive all broadcast and mui32ticast + * packets along with those addressed specifically for us. + */ + EMACFrameFilterSet(EMAC0_BASE, (EMAC_FRMFILTER_HASH_AND_PERFECT | + EMAC_FRMFILTER_PASS_MULTICAST)); + +#if LWIP_PTPD + // + // Enable timestamping on all received packets. + // + // We set the fine clock adjustment mode and configure the subsecond + // increment to half the 25MHz PTPD clock. This will give us maximum control + // over the clock rate adjustment and keep the arithmetic easy later. It + // should be possible to synchronize with higher accuracy than this with + // appropriate juggling of the subsecond increment count and the addend + // register value, though. + // + EMACTimestampConfigSet(EMAC0_BASE, (EMAC_TS_ALL_RX_FRAMES | + EMAC_TS_DIGITAL_ROLLOVER | + EMAC_TS_PROCESS_IPV4_UDP | EMAC_TS_ALL | + EMAC_TS_PTP_VERSION_1 | EMAC_TS_UPDATE_FINE), + (1000000000 / (25000000 / 2))); + EMACTimestampAddendSet(EMAC0_BASE, 0x80000000); + EMACTimestampEnable(EMAC0_BASE); +#endif + + /* Clear any pending MAC interrupts. */ + EMACIntClear(EMAC0_BASE, EMACIntStatus(EMAC0_BASE, false)); + + /* Enable the Ethernet MAC transmitter and receiver. */ + EMACTxEnable(EMAC0_BASE); + EMACRxEnable(EMAC0_BASE); + + /* Enable the Ethernet RX and TX interrupt source. */ + EMACIntEnable(EMAC0_BASE, (EMAC_INT_RECEIVE | EMAC_INT_TRANSMIT | + EMAC_INT_TX_STOPPED | EMAC_INT_RX_NO_BUFFER | + EMAC_INT_RX_STOPPED | EMAC_INT_PHY)); + + /* Enable the Ethernet interrupt. */ + IntEnable(INT_EMAC0); + + /* Enable all processor interrupts. */ + IntMasterEnable(); + + /* Tell the PHY to start an auto-negotiation cycle. */ + EMACPHYWrite(EMAC0_BASE, PHY_PHYS_ADDR, EPHY_BMCR, (EPHY_BMCR_ANEN | + EPHY_BMCR_RESTARTAN)); +} + +#ifdef DEBUG +/** + * Dump the chain of pbuf pointers to the debug output. + */ +void +tivaif_trace_pbuf(const char *pcTitle, struct pbuf *p) +{ + LWIP_DEBUGF(NETIF_DEBUG, ("%s %08x (%d, %d)", pcTitle, p, p->tot_len, + p->len)); + + do + { + p = p->next; + if(p) + { + LWIP_DEBUGF(NETIF_DEBUG, ("->%08x(%d)", p, p->len)); + } + else + { + LWIP_DEBUGF(NETIF_DEBUG, ("->%08x", p)); + } + + } while((p != NULL) && (p->tot_len != p->len)); + + LWIP_DEBUGF(NETIF_DEBUG, ("\n")); +} +#endif + +/** + * This function is used to check whether a passed pbuf contains only buffers + * resident in regions of memory that the Ethernet MAC can access. If any + * buffers in the chain are outside a directly-DMAable section of memory, + * the pbuf is copied to SRAM and a different pointer returned. If all + * buffers are safe, the pbuf reference count is incremented and the original + * pointer returned. + */ +static struct pbuf * +tivaif_check_pbuf(struct pbuf *p) +{ + struct pbuf *pBuf; + err_t Err; + + pBuf = p; + +#ifdef DEBUG + tivaif_trace_pbuf("Original:", p); +#endif + + /* Walk the list of buffers in the pbuf checking each. */ + do + { + /* Does this pbuf's payload reside in memory that the Ethernet DMA + * can access? + */ + if(!PTR_SAFE_FOR_EMAC_DMA(pBuf->payload)) + { + /* This buffer is outside the DMA-able memory space so we need + * to copy the pbuf. + */ + pBuf = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_POOL); + + /* If we got a new pbuf... */ + if(pBuf) + { + /* ...copy the old pbuf into the new one. */ + Err = pbuf_copy(pBuf, p); + + /* If we failed to copy the pbuf, free the newly allocated one + * and make sure we return a NULL to show a problem. + */ + if(Err != ERR_OK) + { + DRIVER_STATS_INC(TXCopyFailCount); + pbuf_free(pBuf); + pBuf = NULL; + } + else + { +#ifdef DEBUG + tivaif_trace_pbuf("Copied:", pBuf); +#endif + DRIVER_STATS_INC(TXCopyCount); + + /* Reduce the reference count on the original pbuf since + * we're not going to hold on to it after returning from + * tivaif_transmit. Note that we already bumped + * the reference count at the top of tivaif_transmit. + */ + pbuf_free(p); + } + } + + /* Send back the new pbuf pointer or NULL if an error occurred. */ + return(pBuf); + } + + /* Move on to the next buffer in the queue */ + pBuf = pBuf->next; + } + while(pBuf); + + /** + * If we get here, the passed pbuf can be safely used without needing to + * be copied. + */ + return(p); +} + +/** + * This function should do the actual transmission of the packet. The packet is + * contained in the pbuf that is passed to the function. This pbuf might be + * chained. + * + * @param psNetif the lwip network interface structure for this ethernetif + * @param p the MAC packet to send (e.g. IP packet including MAC addresses and type) + * @return ERR_OK if the packet coui32d be sent + * an err_t value if the packet coui32dn't be sent + */ +static err_t +tivaif_transmit(struct netif *psNetif, struct pbuf *p) +{ + tStellarisIF *pIF; + tDescriptor *pDesc; + struct pbuf *pBuf; + uint32_t ui32NumChained, ui32NumDescs; + bool bFirst; + SYS_ARCH_DECL_PROTECT(lev); + + LWIP_DEBUGF(NETIF_DEBUG, ("tivaif_transmit 0x%08x, len %d\n", p, + p->tot_len)); + + /** + * This entire function must run within a "critical section" to preserve + * the integrity of the transmit pbuf queue. + */ + SYS_ARCH_PROTECT(lev); + + /* Update our transmit attempt counter. */ + DRIVER_STATS_INC(TXCount); + + /** + * Increase the reference count on the packet provided so that we can + * hold on to it until we are finished transmitting its content. + */ + pbuf_ref(p); + + /** + * Determine whether all buffers passed are within SRAM and, if not, copy + * the pbuf into SRAM-resident buffers so that the Ethernet DMA can access + * the data. + */ + p = tivaif_check_pbuf(p); + + /* Make sure we still have a valid buffer (it may have been copied) */ + if(!p) + { + LINK_STATS_INC(link.memerr); + SYS_ARCH_UNPROTECT(lev); + return(ERR_MEM); + } + + /* Get our state data from the netif structure we were passed. */ + pIF = (tStellarisIF *)psNetif->state; + + /* Make sure that the transmit descriptors are not all in use */ + pDesc = &(pIF->pTxDescList->pDescriptors[pIF->pTxDescList->ui32Write]); + if(pDesc->pBuf) + { + /** + * The current write descriptor has a pbuf attached to it so this + * implies that the ring is fui32l. Reject this transmit request with a + * memory error since we can't satisfy it just now. + */ + pbuf_free(p); + LINK_STATS_INC(link.memerr); + DRIVER_STATS_INC(TXNoDescCount); + SYS_ARCH_UNPROTECT(lev); + return (ERR_MEM); + } + + /* How many pbufs are in the chain passed? */ + ui32NumChained = (uint32_t)pbuf_clen(p); + + /* How many free transmit descriptors do we have? */ + ui32NumDescs = (pIF->pTxDescList->ui32Read > pIF->pTxDescList->ui32Write) ? + (pIF->pTxDescList->ui32Read - pIF->pTxDescList->ui32Write) : + ((NUM_TX_DESCRIPTORS - pIF->pTxDescList->ui32Write) + + pIF->pTxDescList->ui32Read); + + /* Do we have enough free descriptors to send the whole packet? */ + if(ui32NumDescs < ui32NumChained) + { + /* No - we can't transmit this whole packet so return an error. */ + pbuf_free(p); + LINK_STATS_INC(link.memerr); + DRIVER_STATS_INC(TXNoDescCount); + SYS_ARCH_UNPROTECT(lev); + return (ERR_MEM); + } + + /* Tag the first descriptor as the start of the packet. */ + bFirst = true; + pDesc->Desc.ui32CtrlStatus = DES0_TX_CTRL_FIRST_SEG; + + /* Here, we know we can send the packet so write it to the descriptors */ + pBuf = p; + + while(ui32NumChained) + { + /* Get a pointer to the descriptor we will write next. */ + pDesc = &(pIF->pTxDescList->pDescriptors[pIF->pTxDescList->ui32Write]); + + /* Fill in the buffer pointer and length */ + pDesc->Desc.ui32Count = (uint32_t)pBuf->len; + pDesc->Desc.pvBuffer1 = pBuf->payload; + + /* Tag the first descriptor as the start of the packet. */ + if(bFirst) + { + bFirst = false; + pDesc->Desc.ui32CtrlStatus = DES0_TX_CTRL_FIRST_SEG; + } + else + { + pDesc->Desc.ui32CtrlStatus = 0; + } + + pDesc->Desc.ui32CtrlStatus |= (DES0_TX_CTRL_IP_ALL_CKHSUMS | + DES0_TX_CTRL_CHAINED); + + /* Decrement our descriptor counter, move on to the next buffer in the + * pbuf chain. */ + ui32NumChained--; + pBuf = pBuf->next; + + /* Update the descriptor list write index. */ + pIF->pTxDescList->ui32Write++; + if(pIF->pTxDescList->ui32Write == NUM_TX_DESCRIPTORS) + { + pIF->pTxDescList->ui32Write = 0; + } + + /* If this is the last descriptor, mark it as the end of the packet. */ + if(!ui32NumChained) + { + pDesc->Desc.ui32CtrlStatus |= (DES0_TX_CTRL_LAST_SEG | + DES0_TX_CTRL_INTERRUPT); + + /* Tag the descriptor with the original pbuf pointer. */ + pDesc->pBuf = p; + } + else + { + /* Set the lsb of the pbuf pointer. We use this as a signal that + * we should not free the pbuf when we are walking the descriptor + * list while processing the transmit interrupt. We only free the + * pbuf when processing the last descriptor used to transmit its + * chain. + */ + pDesc->pBuf = (struct pbuf *)((uint32_t)p + 1); + } + + DRIVER_STATS_INC(TXBufQueuedCount); + + /* Hand the descriptor over to the hardware. */ + pDesc->Desc.ui32CtrlStatus |= DES0_TX_CTRL_OWN; + } + + /* Tell the transmitter to start (in case it had stopped). */ + EMACTxDMAPollDemand(EMAC0_BASE); + + /* Update lwIP statistics */ + LINK_STATS_INC(link.xmit); + + SYS_ARCH_UNPROTECT(lev); + + return(ERR_OK); +} + +/** + * This function will process all transmit descriptors and free pbufs attached + * to any that have been transmitted since we last checked. + * + * This function is called only from the Ethernet interrupt handler. + * + * @param netif the lwip network interface structure for this ethernetif + * @return None. + */ +static void +tivaif_process_transmit(tStellarisIF *pIF) +{ + tDescriptorList *pDescList; + uint32_t ui32NumDescs; + + /* Get a pointer to the transmit descriptor list. */ + pDescList = pIF->pTxDescList; + + /* Walk the list until we have checked all descriptors or we reach the + * write pointer or find a descriptor that the hardware is still working + * on. + */ + for(ui32NumDescs = 0; ui32NumDescs < pDescList->ui32NumDescs; ui32NumDescs++) + { + /* Has the buffer attached to this descriptor been transmitted? */ + if(pDescList->pDescriptors[pDescList->ui32Read].Desc.ui32CtrlStatus & + DES0_TX_CTRL_OWN) + { + /* No - we're finished. */ + break; + } + + /* Does this descriptor have a buffer attached to it? */ + if(pDescList->pDescriptors[pDescList->ui32Read].pBuf) + { + /* Yes - free it if it's not marked as an intermediate pbuf */ + if(!((uint32_t)(pDescList->pDescriptors[pDescList->ui32Read].pBuf) & 1)) + { + pbuf_free(pDescList->pDescriptors[pDescList->ui32Read].pBuf); + DRIVER_STATS_INC(TXBufFreedCount); + } + pDescList->pDescriptors[pDescList->ui32Read].pBuf = NULL; + } + else + { + /* If the descriptor has no buffer, we are finished. */ + break; + } + + /* Move on to the next descriptor. */ + pDescList->ui32Read++; + if(pDescList->ui32Read == pDescList->ui32NumDescs) + { + pDescList->ui32Read = 0; + } + } +} + +/** + * This function will process all receive descriptors that contain newly read + * data and pass complete frames up the lwIP stack as they are found. The + * timestamp of the packet will be placed into the pbuf structure if PTPD is + * enabled. + * + * This function is called only from the Ethernet interrupt handler. + * + * @param psNetif the lwip network interface structure for this ethernetif + * @return None. + */ +static void +tivaif_receive(struct netif *psNetif) +{ + tDescriptorList *pDescList; + tStellarisIF *pIF; + struct pbuf *pBuf; + uint32_t ui32DescEnd; + + /* Get a pointer to our state data */ + pIF = (tStellarisIF *)(psNetif->state); + + /* Get a pointer to the receive descriptor list. */ + pDescList = pIF->pRxDescList; + + /* Start with a NULL pbuf so that we don't try to link chain the first + * time round. + */ + pBuf = NULL; + + /* Determine where we start and end our walk of the descriptor list */ + ui32DescEnd = pDescList->ui32Read ? (pDescList->ui32Read - 1) : (pDescList->ui32NumDescs - 1); + + /* Step through the descriptors that are marked for CPU attention. */ + while(pDescList->ui32Read != ui32DescEnd) + { + /* Does the current descriptor have a buffer attached to it? */ + if(pDescList->pDescriptors[pDescList->ui32Read].pBuf) + { + /* Yes - determine if the host has filled it yet. */ + if(pDescList->pDescriptors[pDescList->ui32Read].Desc.ui32CtrlStatus & + DES0_RX_CTRL_OWN) + { + /* The DMA engine still owns the descriptor so we are finished */ + break; + } + + DRIVER_STATS_INC(RXBufReadCount); + + /* If this descriptor contains the end of the packet, fix up the + * buffer size accordingly. + */ + if(pDescList->pDescriptors[pDescList->ui32Read].Desc.ui32CtrlStatus & + DES0_RX_STAT_LAST_DESC) + { + /* This is the last descriptor for the frame so fix up the + * length. It is safe for us to modify the internal fields + * directly here (rather than calling pbuf_realloc) since we + * know each of these pbufs is never chained. + */ + pDescList->pDescriptors[pDescList->ui32Read].pBuf->len = + (pDescList->pDescriptors[pDescList->ui32Read].Desc.ui32CtrlStatus & + DES0_RX_STAT_FRAME_LENGTH_M) >> + DES0_RX_STAT_FRAME_LENGTH_S; + pDescList->pDescriptors[pDescList->ui32Read].pBuf->tot_len = + pDescList->pDescriptors[pDescList->ui32Read].pBuf->len; + } + + if(pBuf) + { + /* Link this pbuf to the last one we looked at since this buffer + * is a continuation of an existing frame (split across mui32tiple + * pbufs). Note that we use pbuf_cat() here rather than + * pbuf_chain() since we don't want to increase the reference + * count of either pbuf - we only want to link them together. + */ + pbuf_cat(pBuf, pDescList->pDescriptors[pDescList->ui32Read].pBuf); + pDescList->pDescriptors[pDescList->ui32Read].pBuf = pBuf; + } + + /* Remember the buffer associated with this descriptor. */ + pBuf = pDescList->pDescriptors[pDescList->ui32Read].pBuf; + + /* Is this the last descriptor for the current frame? */ + if(pDescList->pDescriptors[pDescList->ui32Read].Desc.ui32CtrlStatus & + DES0_RX_STAT_LAST_DESC) + { + /* Yes - does the frame contain errors? */ + if(pDescList->pDescriptors[pDescList->ui32Read].Desc.ui32CtrlStatus & + DES0_RX_STAT_ERR) + { + /* This is a bad frame so discard it and update the relevant + * statistics. + */ + LWIP_DEBUGF(NETIF_DEBUG, ("tivaif_receive: packet error\n")); + pbuf_free(pBuf); + LINK_STATS_INC(link.drop); + DRIVER_STATS_INC(RXPacketErrCount); + } + else + { + /* This is a good frame so pass it up the stack. */ + LINK_STATS_INC(link.recv); + DRIVER_STATS_INC(RXPacketReadCount); + +#if LWIP_PTPD + /* Place the timestamp in the PBUF if PTPD is enabled */ + pBuf->time_s = + pDescList->pDescriptors[pDescList->ui32Read].Desc.ui32IEEE1588TimeHi; + pBuf->time_ns = + pDescList->pDescriptors[pDescList->ui32Read].Desc.ui32IEEE1588TimeLo; +#endif + +#if NO_SYS + if(ethernet_input(pBuf, psNetif) != ERR_OK) + { +#else + if(tcpip_input(pBuf, psNetif) != ERR_OK) + { +#endif + /* drop the packet */ + LWIP_DEBUGF(NETIF_DEBUG, ("tivaif_input: input error\n")); + pbuf_free(pBuf); + + /* Adjust the link statistics */ + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.drop); + DRIVER_STATS_INC(RXPacketCBErrCount); + } + + /* We're finished with this packet so make sure we don't try + * to link the next buffer to it. + */ + pBuf = NULL; + } + } + } + + /* Allocate a new buffer for this descriptor */ + pDescList->pDescriptors[pDescList->ui32Read].pBuf = pbuf_alloc(PBUF_RAW, + PBUF_POOL_BUFSIZE, + PBUF_POOL); + pDescList->pDescriptors[pDescList->ui32Read].Desc.ui32Count = + DES1_RX_CTRL_CHAINED; + if(pDescList->pDescriptors[pDescList->ui32Read].pBuf) + { + /* We got a buffer so fill in the payload pointer and size. */ + pDescList->pDescriptors[pDescList->ui32Read].Desc.pvBuffer1 = + pDescList->pDescriptors[pDescList->ui32Read].pBuf->payload; + pDescList->pDescriptors[pDescList->ui32Read].Desc.ui32Count |= + (pDescList->pDescriptors[pDescList->ui32Read].pBuf->len << + DES1_RX_CTRL_BUFF1_SIZE_S); + + /* Give this descriptor back to the hardware */ + pDescList->pDescriptors[pDescList->ui32Read].Desc.ui32CtrlStatus = + DES0_RX_CTRL_OWN; + } + else + { + LWIP_DEBUGF(NETIF_DEBUG, ("tivaif_receive: pbuf_alloc error\n")); + + pDescList->pDescriptors[pDescList->ui32Read].Desc.pvBuffer1 = 0; + + /* Update the stats to show we coui32dn't allocate a pbuf. */ + DRIVER_STATS_INC(RXNoBufCount); + LINK_STATS_INC(link.memerr); + + /* Stop parsing here since we can't leave a broken descriptor in + * the chain. + */ + break; + } + + /* Move on to the next descriptor in the chain, taking care to wrap. */ + pDescList->ui32Read++; + if(pDescList->ui32Read == pDescList->ui32NumDescs) + { + pDescList->ui32Read = 0; + } + } +} + +/** + * should be called at the beginning of the program to set up the + * network interface. It calls the function tivaif_hwinit() to do the + * actual setup of the hardware. + * + * This function should be passed as a parameter to netif_add(). + * + * @param psNetif the lwip network interface structure for this ethernetif + * @return ERR_OK if the loopif is initialized + * ERR_MEM if private data coui32dn't be allocated + * any other err_t on error + */ +err_t +tivaif_init(struct netif *psNetif) +{ + LWIP_ASSERT("psNetif != NULL", (psNetif != NULL)); + +#if LWIP_NETIF_HOSTNAME + /* Initialize interface hostname */ + psNetif->hostname = "lwip"; +#endif /* LWIP_NETIF_HOSTNAME */ + + /* + * Initialize the snmp variables and counters inside the struct netif. + * The last argument should be replaced with your link speed, in units + * of bits per second. + */ + NETIF_INIT_SNMP(psNetif, snmp_ifType_ethernet_csmacd, 1000000); + + psNetif->state = &g_StellarisIFData; + psNetif->name[0] = IFNAME0; + psNetif->name[1] = IFNAME1; + /* We directly use etharp_output() here to save a function call. + * You can instead declare your own function an call etharp_output() + * from it if you have to do some checks before sending (e.g. if link + * is available...) */ + psNetif->output = etharp_output; + psNetif->linkoutput = tivaif_transmit; + + /* Remember our MAC address. */ + g_StellarisIFData.ethaddr = (struct eth_addr *)&(psNetif->hwaddr[0]); + + /* Initialize the hardware */ + tivaif_hwinit(psNetif); + + return ERR_OK; +} + +/** + * Process interrupts from the PHY. + * + * should be called from the Stellaris Ethernet Interrupt Handler. This + * function will read packets from the Stellaris Ethernet fifo and place them + * into a pbuf queue. If the transmitter is idle and there is at least one packet + * on the transmit queue, it will place it in the transmit fifo and start the + * transmitter. + * + */ +void +tivaif_process_phy_interrupt(struct netif *psNetif) +{ + uint16_t ui16Val, ui16Status; + uint32_t ui32Config, ui32Mode, ui32RxMaxFrameSize; + + /* Read the PHY interrupt status. This clears all interrupt sources. + * Note that we are only enabling sources in EPHY_MISR1 so we don't + * read EPHY_MISR2. + */ + ui16Val = EMACPHYRead(EMAC0_BASE, PHY_PHYS_ADDR, EPHY_MISR1); + + /* Read the current PHY status. */ + ui16Status = EMACPHYRead(EMAC0_BASE, PHY_PHYS_ADDR, EPHY_STS); + + /* Has the link status changed? */ + if(ui16Val & EPHY_MISR1_LINKSTAT) + { + /* Is link up or down now? */ + if(ui16Status & EPHY_STS_LINK) + { + /* Tell lwIP the link is up. */ +#if NO_SYS + netif_set_link_up(psNetif); +#else + tcpip_callback((tcpip_callback_fn)netif_set_link_up, psNetif); +#endif + + /* In this case we drop through since we may need to reconfigure + * the MAC depending upon the speed and half/fui32l-duplex settings. + */ + } + else + { + /* Tell lwIP the link is down */ +#if NO_SYS + netif_set_link_down(psNetif); +#else + tcpip_callback((tcpip_callback_fn)netif_set_link_down, psNetif); +#endif + } + } + + /* Has the speed or duplex status changed? */ + if(ui16Val & (EPHY_MISR1_SPEED | EPHY_MISR1_SPEED | EPHY_MISR1_ANC)) + { + /* Get the current MAC configuration. */ + EMACConfigGet(EMAC0_BASE, &ui32Config, &ui32Mode, + &ui32RxMaxFrameSize); + + /* What speed is the interface running at now? + */ + if(ui16Status & EPHY_STS_SPEED) + { + /* 10Mbps is selected */ + ui32Config &= ~EMAC_CONFIG_100MBPS; + } + else + { + /* 100Mbps is selected */ + ui32Config |= EMAC_CONFIG_100MBPS; + } + + /* Are we in fui32l- or half-duplex mode? */ + if(ui16Status & EPHY_STS_DUPLEX) + { + /* Fui32l duplex. */ + ui32Config |= EMAC_CONFIG_FULL_DUPLEX; + } + else + { + /* Half duplex. */ + ui32Config &= ~EMAC_CONFIG_FULL_DUPLEX; + } + + /* Reconfigure the MAC */ + EMACConfigSet(EMAC0_BASE, ui32Config, ui32Mode, ui32RxMaxFrameSize); + } +} + +/** + * Process tx and rx packets at the low-level interrupt. + * + * should be called from the Stellaris Ethernet Interrupt Handler. This + * function will read packets from the Stellaris Ethernet fifo and place them + * into a pbuf queue. If the transmitter is idle and there is at least one packet + * on the transmit queue, it will place it in the transmit fifo and start the + * transmitter. + * + */ +void +tivaif_interrupt(struct netif *psNetif, uint32_t ui32Status) +{ + tStellarisIF *tivaif; + + /* setup pointer to the if state data */ + tivaif = psNetif->state; + + /* Update our debug interrupt counters. */ + if(ui32Status & EMAC_INT_NORMAL_INT) + { + g_ui32NormalInts++; + } + + if(ui32Status & EMAC_INT_ABNORMAL_INT) + { + g_ui32AbnormalInts++; + } + + /* Is this an interrupt from the PHY? */ + if(ui32Status & EMAC_INT_PHY) + { + tivaif_process_phy_interrupt(psNetif); + } + + /* Process the transmit DMA list, freeing any buffers that have been + * transmitted since our last interrupt. + */ + if(ui32Status & EMAC_INT_TRANSMIT) + { + tivaif_process_transmit(tivaif); + } + + /** + * Process the receive DMA list and pass all successfui32ly received packets + * up the stack. We also call this function in cases where the receiver has + * stalled due to missing buffers since the receive function will attempt to + * allocate new pbufs for descriptor entries which have none. + */ + if(ui32Status & (EMAC_INT_RECEIVE | EMAC_INT_RX_NO_BUFFER | + EMAC_INT_RX_STOPPED)) + { + tivaif_receive(psNetif); + } +} + +#if NETIF_DEBUG +/* Print an IP header by using LWIP_DEBUGF + * @param p an IP packet, p->payload pointing to the IP header + */ +void +tivaif_debug_print(struct pbuf *p) +{ + struct eth_hdr *ethhdr = (struct eth_hdr *)p->payload; + u16_t *plen = (u16_t *)p->payload; + + LWIP_DEBUGF(NETIF_DEBUG, ("ETH header:\n")); + LWIP_DEBUGF(NETIF_DEBUG, ("Packet Length:%5"U16_F" \n",*plen)); + LWIP_DEBUGF(NETIF_DEBUG, ("Destination: %02"X8_F"-%02"X8_F"-%02"X8_F"-%02"X8_F"-%02"X8_F"-%02"X8_F"\n", + ethhdr->dest.addr[0], + ethhdr->dest.addr[1], + ethhdr->dest.addr[2], + ethhdr->dest.addr[3], + ethhdr->dest.addr[4], + ethhdr->dest.addr[5])); + LWIP_DEBUGF(NETIF_DEBUG, ("Source: %02"X8_F"-%02"X8_F"-%02"X8_F"-%02"X8_F"-%02"X8_F"-%02"X8_F"\n", + ethhdr->src.addr[0], + ethhdr->src.addr[1], + ethhdr->src.addr[2], + ethhdr->src.addr[3], + ethhdr->src.addr[4], + ethhdr->src.addr[5])); + LWIP_DEBUGF(NETIF_DEBUG, ("Packet Type:0x%04"U16_F" \n", ethhdr->type)); +} +#endif /* NETIF_DEBUG */ diff --git a/third_party/lwip-1.4.1/ports/tiva-tm4c129/perf.c b/third_party/lwip-1.4.1/ports/tiva-tm4c129/perf.c new file mode 100644 index 0000000..29ffb28 --- /dev/null +++ b/third_party/lwip-1.4.1/ports/tiva-tm4c129/perf.c @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "arch/perf.h" + +void +perf_init(char *fname) +{ +} diff --git a/third_party/lwip-1.4.1/ports/tiva-tm4c129/sys_arch.c b/third_party/lwip-1.4.1/ports/tiva-tm4c129/sys_arch.c new file mode 100644 index 0000000..e2f9c80 --- /dev/null +++ b/third_party/lwip-1.4.1/ports/tiva-tm4c129/sys_arch.c @@ -0,0 +1,631 @@ +/** + * @file - sys_arch.c + * System Architecture support routines for TI Tiva devices. + * + */ + +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +/* Copyright (c) 2008 Texas Instruments Incorporated */ + +/* lwIP includes. */ +#include "lwip/opt.h" +#include "lwip/sys.h" + +#if NO_SYS + +#if SYS_LIGHTWEIGHT_PROT + +/* TivaWare header files required for this interface driver. */ +#include +#include +#include "inc/hw_types.h" +#include "driverlib/interrupt.h" +#include "driverlib/rom.h" +#include "driverlib/rom_map.h" + +/** + * This global is defined in lwiplib.c and contains a count of the number of + * elapsed milliseconds since lwIP started. + */ +extern uint32_t g_ui32LocalTimer; + +/** + * This function returns the system time in milliseconds. + */ +u32_t +sys_now(void) +{ + return(g_ui32LocalTimer); +} + + +/** + * This function is used to lock access to critical sections when lwipopt.h + * defines SYS_LIGHTWEIGHT_PROT. It disables interrupts and returns a value + * indicating the interrupt enable state when the function entered. This + * value must be passed back on the matching call to sys_arch_unprotect(). + * + * @return the interrupt level when the function was entered. + */ +sys_prot_t +sys_arch_protect(void) +{ + return((sys_prot_t)MAP_IntMasterDisable()); +} + +/** + * This function is used to unlock access to critical sections when lwipopt.h + * defines SYS_LIGHTWEIGHT_PROT. It enables interrupts if the value of the lev + * parameter indicates that they were enabled when the matching call to + * sys_arch_protect() was made. + * + * @param lev is the interrupt level when the matching protect function was + * called + */ +void +sys_arch_unprotect(sys_prot_t lev) +{ + /* Only turn interrupts back on if they were originally on when the matching + sys_arch_protect() call was made. */ + if(!(lev & 1)) { + MAP_IntMasterEnable(); + } +} +#endif /* SYS_LIGHTWEIGHT_PROT */ + +#else /* NO_SYS */ + +/* A structure to contain the variables for a sys_thread_t. */ +typedef struct { + void *stackstart; + void *stackend; + void (*thread)(void *arg); + void *arg; +#if RTOS_FREERTOS + xTaskHandle taskhandle; +#endif /* RTOS_FREERTOS */ +} thread_t; + +/* Provide a default maximum number of threads. */ +#ifndef SYS_THREAD_MAX +#define SYS_THREAD_MAX 4 +#endif /* SYS_THREAD_MAX */ + +/* Provide a default maximum number of semaphores. */ +#ifndef SYS_SEM_MAX +#define SYS_SEM_MAX 4 +#endif /* SYS_SEM_MAX */ + +/* Provide a default maximum number of mailboxes. */ +#ifndef SYS_MBOX_MAX +#define SYS_MBOX_MAX 4 +#endif /* SYS_MBOX_MAX */ + +/* An array to hold the memory for the available semaphores. */ +static sem_t sems[SYS_SEM_MAX]; + +/* An array to hold the memory for the available mailboxes. */ +static mbox_t mboxes[SYS_MBOX_MAX]; + +/* An array to hold the memory for the available threads. */ +static thread_t threads[SYS_THREAD_MAX]; + +/** + * Initializes the system architecture layer. + * + */ +void +sys_init(void) +{ + u32_t i; + + /* Clear out the mailboxes. */ + for(i = 0; i < SYS_MBOX_MAX; i++) { + mboxes[i].queue = 0; + } + + /* Clear out the semaphores. */ + for(i = 0; i < SYS_SEM_MAX; i++) { + sems[i].queue = 0; + } + + /* Clear out the threads. */ + for(i = 0; i < SYS_THREAD_MAX; i++) { + threads[i].stackstart = NULL; + threads[i].stackend = NULL; + } +} + +/** + * Creates a new semaphore. + * + * @param count is non-zero if the semaphore should be acquired initially. + * @return the handle of the created semaphore. + */ +err_t +sys_sem_new(sys_sem_t *sem, u8_t count) +{ + void *temp; + u32_t i; + + /* Find a semaphore that is not in use. */ + for(i = 0; i < SYS_SEM_MAX; i++) { + if(sems[i].queue == 0) { + break; + } + } + if(i == SYS_SEM_MAX) { +#if SYS_STATS + STATS_INC(sys.sem.err); +#endif /* SYS_STATS */ + return ERR_MEM; + } + + /* Create a single-entry queue to act as a semaphore. */ +#if RTOS_FREERTOS + sem->queue = xQueueCreate(1, sizeof(void *)); + if(sem->queue == NULL) { +#endif /* RTOS_FREERTOS */ + +#if SYS_STATS + STATS_INC(sys.sem.err); +#endif /* SYS_STATS */ + return ERR_MEM; + } + + /* Acquired the semaphore if necessary. */ + if(count == 0) { + temp = 0; + xQueueSend(sem->queue, &temp, 0); + } + + /* Update the semaphore statistics. */ +#if SYS_STATS + STATS_INC(sys.sem.used); +#if LWIP_STATS + if(lwip_stats.sys.sem.max < lwip_stats.sys.sem.used) { + lwip_stats.sys.sem.max = lwip_stats.sys.sem.used; + } +#endif +#endif /* SYS_STATS */ + + /* Save the queue handle. */ + sems[i].queue = sem->queue; + + /* Return this semaphore. */ + return (ERR_OK); +} + +/** + * Signal a semaphore. + * + * @param sem is the semaphore to signal. + */ +void +sys_sem_signal(sys_sem_t *sem) +{ + void *msg; + + /* Receive a message from the semaphore's queue. */ + xQueueReceive(sem->queue, &msg, 0); +} + +/** + * Wait for a semaphore to be signalled. + * + * @param sem is the semaphore + * @param timeout is the maximum number of milliseconds to wait for the + * semaphore to be signalled + * @return the number of milliseconds that passed before the semaphore was + * acquired, or SYS_ARCH_TIMEOUT if the timeout occurred + */ +u32_t +sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) +{ + portTickType starttime; + void *msg = 0; + + /* Get the starting time. */ + starttime = xTaskGetTickCount(); + + /* See if there is a timeout. */ + if(timeout != 0) { + /* Send a message to the queue. */ + if(xQueueSend(sem->queue, &msg, timeout / portTICK_RATE_MS) == pdPASS) { + /* Return the amount of time it took for the semaphore to be + signalled. */ + return (xTaskGetTickCount() - starttime) * portTICK_RATE_MS; + } else { + /* The semaphore failed to signal in the allotted time. */ + return SYS_ARCH_TIMEOUT; + } + } else { + /* Try to send a message to the queue until it succeeds. */ + while(xQueueSend(sem->queue, &msg, portMAX_DELAY) != pdPASS); + + /* Return the amount of time it took for the semaphore to be signalled. */ + return (xTaskGetTickCount() - starttime) * portTICK_RATE_MS; + } +} + +/** + * Destroys a semaphore. + * + * @param sem is the semaphore to be destroyed. + */ +void +sys_sem_free(sys_sem_t *sem) +{ + /* Clear the queue handle. */ + sem->queue = 0; + + /* Update the semaphore statistics. */ +#if SYS_STATS + STATS_DEC(sys.sem.used); +#endif /* SYS_STATS */ +} + +/** + * Creates a new mailbox. + * + * @param size is the number of entries in the mailbox. + * @return the handle of the created mailbox. + */ +err_t +sys_mbox_new(sys_mbox_t *mbox, int size) +{ + u32_t i; + + /* Fail if the mailbox size is too large. */ + if(size > MBOX_MAX) { +#if SYS_STATS + STATS_INC(sys.mbox.err); +#endif /* SYS_STATS */ + return ERR_MEM; + } + + /* Find a mailbox that is not in use. */ + for(i = 0; i < SYS_MBOX_MAX; i++) { + if(mboxes[i].queue == 0) { + break; + } + } + if(i == SYS_MBOX_MAX) { +#if SYS_STATS + STATS_INC(sys.mbox.err); +#endif /* SYS_STATS */ + return ERR_MEM; + } + +#if RTOS_FREERTOS + /* Create a queue for this mailbox. */ + mbox->queue = xQueueCreate(size, sizeof(void *)); + if(mbox == NULL) { +#endif /* RTOS_FREERTOS */ + +#if SYS_STATS + STATS_INC(sys.mbox.err); +#endif /* SYS_STATS */ + return ERR_MEM; + } + + /* Update the mailbox statistics. */ +#if SYS_STATS + STATS_INC(sys.mbox.used); +#if LWIP_STATS + if(lwip_stats.sys.mbox.max < lwip_stats.sys.mbox.used) { + lwip_stats.sys.mbox.max = lwip_stats.sys.mbox.used; + } +#endif +#endif /* SYS_STATS */ + + /* Save the queue handle. */ + mboxes[i].queue = mbox->queue; + + /* Return this mailbox. */ + return ERR_OK; +} + +/** + * Sends a message to a mailbox. + * + * @param mbox is the mailbox + * @param msg is the message to send + */ +void +sys_mbox_post(sys_mbox_t *mbox, void *msg) +{ + /* Send this message to the queue. */ + while(xQueueSend(mbox->queue, &msg, portMAX_DELAY) != pdPASS); +} + +/** + * Tries to send a message to a mailbox. + * + * @param mbox is the mailbox + * @param msg is the message to send + * @return ERR_OK if the message was sent and ERR_MEM if there was no space for + * the message + */ +err_t +sys_mbox_trypost(sys_mbox_t *mbox, void *msg) +{ + /* Send this message to the queue. */ + if(xQueueSend(mbox->queue, &msg, 0) == pdPASS) { + return ERR_OK; + } + + /* Update the mailbox statistics. */ +#if SYS_STATS + STATS_INC(sys.mbox.err); +#endif /* SYS_STATS */ + + /* The message could not be sent. */ + return ERR_MEM; +} + +/** + * Retrieve a message from a mailbox. + * + * @param mbox is the mailbox + * @param msg is a pointer to the location to receive the message + * @param timeout is the maximum number of milliseconds to wait for the message + * @return the number of milliseconds that passed before the message was + * received, or SYS_ARCH_TIMEOUT if the tmieout occurred + */ +u32_t +sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) +{ + portTickType starttime; + void *dummyptr; + + /* If the actual message contents are not required, provide a local variable + to recieve the message. */ + if(msg == NULL) { + msg = &dummyptr; + } + + /* Get the starting time. */ + starttime = xTaskGetTickCount(); + + /* See if there is a timeout. */ + if(timeout != 0) { + /* Receive a message from the queue. */ + if(xQueueReceive(mbox->queue, msg, timeout / portTICK_RATE_MS) == pdPASS) { + /* Return the amount of time it took for the message to be received. */ + return (xTaskGetTickCount() - starttime) * portTICK_RATE_MS; + } else { + /* No message arrived in the allotted time. */ + *msg = NULL; + return SYS_ARCH_TIMEOUT; + } + } else { + /* Try to receive a message until one arrives. */ + while(xQueueReceive(mbox->queue, msg, portMAX_DELAY) != pdPASS); + + /* Return the amount of time it took for the message to be received. */ + return (xTaskGetTickCount() - starttime) * portTICK_RATE_MS; + } +} + +/** + * Try to receive a message from a mailbox, returning immediately if one is not + * available. + * + * @param mbox is the mailbox + * @param msg is a pointer to the location to receive the message + * @return ERR_OK if a message was available and SYS_MBOX_EMPTY if one was not + * available + */ +u32_t +sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) +{ + void *dummyptr; + + /* If the actual message contents are not required, provide a local variable + to recieve the message. */ + if(msg == NULL) { + msg = &dummyptr; + } + + /* Recieve a message from the queue. */ + if(xQueueReceive(mbox->queue, msg, 0) == pdPASS) { + /* A message was available. */ + return ERR_OK; + } else { + /* A message was not available. */ + return SYS_MBOX_EMPTY; + } +} + +/** + * Destroys a mailbox. + * + * @param mbox is the mailbox to be destroyed. + */ +void +sys_mbox_free(sys_mbox_t *mbox) +{ + /* There should not be any messages waiting (if there are it is a bug). If + any are waiting, increment the mailbox error count. */ +#if RTOS_FREERTOS + if(uxQueueMessagesWaiting(mbox->queue) != 0) { +#endif /* RTOS_FREERTOS */ + +#if SYS_STATS + STATS_INC(sys.mbox.err); +#endif /* SYS_STATS */ + } + + /* Clear the queue handle. */ + mbox->queue = 0; + + /* Update the mailbox statistics. */ +#if SYS_STATS + STATS_DEC(sys.mbox.used); +#endif /* SYS_STATS */ +} + +/** + * Checks the validity of a mailbox. + * + * @param mbox is the mailbox whose validity is to be checked. + */ +int +sys_mbox_valid(sys_mbox_t *mbox) +{ + /*Check if a mailbox has been created*/ + if(mbox->queue == SYS_MBOX_NULL){ + return 0; + } + else{ + return 1; + } +} + +/** + * The routine for a thread. This handles some housekeeping around the + * applications's thread routine. + * + * @param arg is the index into the thread structure for this thread + */ +static void +sys_arch_thread(void *arg) +{ + u32_t i; + + /* Get this threads index. */ + i = (u32_t)arg; + + /* Call the application's thread routine. */ + threads[i].thread(threads[i].arg); + + /* Free the memory used by this thread's stack. */ + mem_free(threads[i].stackstart); + + /* Clear the stack from the thread structure. */ + threads[i].stackstart = NULL; + threads[i].stackend = NULL; + + /* Delete this task. */ +#if RTOS_FREERTOS + vTaskDelete(NULL); +#endif +} + +/** + * Creates a new thread. + * + * @param name is the name of this thread + * @param thread is a pointer to the function to run in the new thread + * @param arg is the argument to pass to the thread's function + * @param stacksize is the size of the stack to allocate for this thread + * @param prio is the priority of the new thread + * @return the handle fo the created thread + */ +sys_thread_t +sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, + int stacksize, int prio) +{ + sys_thread_t created_thread; + void *data; + u32_t i; + + /* Find a thread that is not in use. */ + for(i = 0; i < SYS_THREAD_MAX; i++) { + if(threads[i].stackstart == NULL) { + break; + } + } + if(i == SYS_THREAD_MAX) { + return NULL; + } + + /* Allocate memory for the thread's stack. */ + data = mem_malloc(stacksize); + if(!data) { + return NULL; + } + + /* Save the details of this thread. */ + threads[i].stackstart = data; + threads[i].stackend = (void *)((char *)data + stacksize); + threads[i].thread = thread; + threads[i].arg = arg; + + /* Create a new thread. */ +#if RTOS_FREERTOS + if(xTaskCreate(sys_arch_thread, (signed portCHAR *)name, + stacksize/sizeof(int), (void *)i, tskIDLE_PRIORITY+prio, + &threads[i].taskhandle) != pdTRUE){ + threads[i].stackstart = NULL; + threads[i].stackend = NULL; + return NULL; + } + created_thread = threads[i].taskhandle; +#endif /* RTOS_FREERTOS */ + + /* Return this thread. */ + return created_thread; +} + +/** + * Enters a critical section. + * + * @return the previous protection level + */ +sys_prot_t +sys_arch_protect(void) +{ +#if RTOS_FREERTOS + taskENTER_CRITICAL(); +#endif + + return 1; +} + +/** + * Leaves a critical section. + * + * @param the preivous protection level + */ +void +sys_arch_unprotect(sys_prot_t val) +{ +#if RTOS_FREERTOS + taskEXIT_CRITICAL(); +#endif +} + +#endif /* NO_SYS */ diff --git a/third_party/lwip-1.4.1/src/FILES b/third_party/lwip-1.4.1/src/FILES new file mode 100644 index 0000000..10115a7 --- /dev/null +++ b/third_party/lwip-1.4.1/src/FILES @@ -0,0 +1,13 @@ +api/ - The code for the high-level wrapper API. Not needed if + you use the lowel-level call-back/raw API. + +core/ - The core of the TPC/IP stack; protocol implementations, + memory and buffer management, and the low-level raw API. + +include/ - lwIP include files. + +netif/ - Generic network interface device drivers are kept here, + as well as the ARP module. + +For more information on the various subdirectories, check the FILES +file in each directory. diff --git a/third_party/lwip-1.4.1/src/api/api_lib.c b/third_party/lwip-1.4.1/src/api/api_lib.c new file mode 100644 index 0000000..62b17a4 --- /dev/null +++ b/third_party/lwip-1.4.1/src/api/api_lib.c @@ -0,0 +1,780 @@ +/** + * @file + * Sequential API External module + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +/* This is the part of the API that is linked with + the application */ + +#include "lwip/opt.h" + +#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/api.h" +#include "lwip/tcpip.h" +#include "lwip/memp.h" + +#include "lwip/ip.h" +#include "lwip/raw.h" +#include "lwip/udp.h" +#include "lwip/tcp.h" + +#include + +/** + * Create a new netconn (of a specific type) that has a callback function. + * The corresponding pcb is also created. + * + * @param t the type of 'connection' to create (@see enum netconn_type) + * @param proto the IP protocol for RAW IP pcbs + * @param callback a function to call on status changes (RX available, TX'ed) + * @return a newly allocated struct netconn or + * NULL on memory error + */ +struct netconn* +netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback) +{ + struct netconn *conn; + struct api_msg msg; + + conn = netconn_alloc(t, callback); + if (conn != NULL) { + msg.function = do_newconn; + msg.msg.msg.n.proto = proto; + msg.msg.conn = conn; + if (TCPIP_APIMSG(&msg) != ERR_OK) { + LWIP_ASSERT("freeing conn without freeing pcb", conn->pcb.tcp == NULL); + LWIP_ASSERT("conn has no op_completed", sys_sem_valid(&conn->op_completed)); + LWIP_ASSERT("conn has no recvmbox", sys_mbox_valid(&conn->recvmbox)); +#if LWIP_TCP + LWIP_ASSERT("conn->acceptmbox shouldn't exist", !sys_mbox_valid(&conn->acceptmbox)); +#endif /* LWIP_TCP */ + sys_sem_free(&conn->op_completed); + sys_mbox_free(&conn->recvmbox); + memp_free(MEMP_NETCONN, conn); + return NULL; + } + } + return conn; +} + +/** + * Close a netconn 'connection' and free its resources. + * UDP and RAW connection are completely closed, TCP pcbs might still be in a waitstate + * after this returns. + * + * @param conn the netconn to delete + * @return ERR_OK if the connection was deleted + */ +err_t +netconn_delete(struct netconn *conn) +{ + struct api_msg msg; + + /* No ASSERT here because possible to get a (conn == NULL) if we got an accept error */ + if (conn == NULL) { + return ERR_OK; + } + + msg.function = do_delconn; + msg.msg.conn = conn; + tcpip_apimsg(&msg); + + netconn_free(conn); + + /* don't care for return value of do_delconn since it only calls void functions */ + + return ERR_OK; +} + +/** + * Get the local or remote IP address and port of a netconn. + * For RAW netconns, this returns the protocol instead of a port! + * + * @param conn the netconn to query + * @param addr a pointer to which to save the IP address + * @param port a pointer to which to save the port (or protocol for RAW) + * @param local 1 to get the local IP address, 0 to get the remote one + * @return ERR_CONN for invalid connections + * ERR_OK if the information was retrieved + */ +err_t +netconn_getaddr(struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local) +{ + struct api_msg msg; + err_t err; + + LWIP_ERROR("netconn_getaddr: invalid conn", (conn != NULL), return ERR_ARG;); + LWIP_ERROR("netconn_getaddr: invalid addr", (addr != NULL), return ERR_ARG;); + LWIP_ERROR("netconn_getaddr: invalid port", (port != NULL), return ERR_ARG;); + + msg.function = do_getaddr; + msg.msg.conn = conn; + msg.msg.msg.ad.ipaddr = addr; + msg.msg.msg.ad.port = port; + msg.msg.msg.ad.local = local; + err = TCPIP_APIMSG(&msg); + + NETCONN_SET_SAFE_ERR(conn, err); + return err; +} + +/** + * Bind a netconn to a specific local IP address and port. + * Binding one netconn twice might not always be checked correctly! + * + * @param conn the netconn to bind + * @param addr the local IP address to bind the netconn to (use IP_ADDR_ANY + * to bind to all addresses) + * @param port the local port to bind the netconn to (not used for RAW) + * @return ERR_OK if bound, any other err_t on failure + */ +err_t +netconn_bind(struct netconn *conn, ip_addr_t *addr, u16_t port) +{ + struct api_msg msg; + err_t err; + + LWIP_ERROR("netconn_bind: invalid conn", (conn != NULL), return ERR_ARG;); + + msg.function = do_bind; + msg.msg.conn = conn; + msg.msg.msg.bc.ipaddr = addr; + msg.msg.msg.bc.port = port; + err = TCPIP_APIMSG(&msg); + + NETCONN_SET_SAFE_ERR(conn, err); + return err; +} + +/** + * Connect a netconn to a specific remote IP address and port. + * + * @param conn the netconn to connect + * @param addr the remote IP address to connect to + * @param port the remote port to connect to (no used for RAW) + * @return ERR_OK if connected, return value of tcp_/udp_/raw_connect otherwise + */ +err_t +netconn_connect(struct netconn *conn, ip_addr_t *addr, u16_t port) +{ + struct api_msg msg; + err_t err; + + LWIP_ERROR("netconn_connect: invalid conn", (conn != NULL), return ERR_ARG;); + + msg.function = do_connect; + msg.msg.conn = conn; + msg.msg.msg.bc.ipaddr = addr; + msg.msg.msg.bc.port = port; + /* This is the only function which need to not block tcpip_thread */ + err = tcpip_apimsg(&msg); + + NETCONN_SET_SAFE_ERR(conn, err); + return err; +} + +/** + * Disconnect a netconn from its current peer (only valid for UDP netconns). + * + * @param conn the netconn to disconnect + * @return TODO: return value is not set here... + */ +err_t +netconn_disconnect(struct netconn *conn) +{ + struct api_msg msg; + err_t err; + + LWIP_ERROR("netconn_disconnect: invalid conn", (conn != NULL), return ERR_ARG;); + + msg.function = do_disconnect; + msg.msg.conn = conn; + err = TCPIP_APIMSG(&msg); + + NETCONN_SET_SAFE_ERR(conn, err); + return err; +} + +/** + * Set a TCP netconn into listen mode + * + * @param conn the tcp netconn to set to listen mode + * @param backlog the listen backlog, only used if TCP_LISTEN_BACKLOG==1 + * @return ERR_OK if the netconn was set to listen (UDP and RAW netconns + * don't return any error (yet?)) + */ +err_t +netconn_listen_with_backlog(struct netconn *conn, u8_t backlog) +{ +#if LWIP_TCP + struct api_msg msg; + err_t err; + + /* This does no harm. If TCP_LISTEN_BACKLOG is off, backlog is unused. */ + LWIP_UNUSED_ARG(backlog); + + LWIP_ERROR("netconn_listen: invalid conn", (conn != NULL), return ERR_ARG;); + + msg.function = do_listen; + msg.msg.conn = conn; +#if TCP_LISTEN_BACKLOG + msg.msg.msg.lb.backlog = backlog; +#endif /* TCP_LISTEN_BACKLOG */ + err = TCPIP_APIMSG(&msg); + + NETCONN_SET_SAFE_ERR(conn, err); + return err; +#else /* LWIP_TCP */ + LWIP_UNUSED_ARG(conn); + LWIP_UNUSED_ARG(backlog); + return ERR_ARG; +#endif /* LWIP_TCP */ +} + +/** + * Accept a new connection on a TCP listening netconn. + * + * @param conn the TCP listen netconn + * @param new_conn pointer where the new connection is stored + * @return ERR_OK if a new connection has been received or an error + * code otherwise + */ +err_t +netconn_accept(struct netconn *conn, struct netconn **new_conn) +{ +#if LWIP_TCP + struct netconn *newconn; + err_t err; +#if TCP_LISTEN_BACKLOG + struct api_msg msg; +#endif /* TCP_LISTEN_BACKLOG */ + + LWIP_ERROR("netconn_accept: invalid pointer", (new_conn != NULL), return ERR_ARG;); + *new_conn = NULL; + LWIP_ERROR("netconn_accept: invalid conn", (conn != NULL), return ERR_ARG;); + LWIP_ERROR("netconn_accept: invalid acceptmbox", sys_mbox_valid(&conn->acceptmbox), return ERR_ARG;); + + err = conn->last_err; + if (ERR_IS_FATAL(err)) { + /* don't recv on fatal errors: this might block the application task + waiting on acceptmbox forever! */ + return err; + } + +#if LWIP_SO_RCVTIMEO + if (sys_arch_mbox_fetch(&conn->acceptmbox, (void **)&newconn, conn->recv_timeout) == SYS_ARCH_TIMEOUT) { + NETCONN_SET_SAFE_ERR(conn, ERR_TIMEOUT); + return ERR_TIMEOUT; + } +#else + sys_arch_mbox_fetch(&conn->acceptmbox, (void **)&newconn, 0); +#endif /* LWIP_SO_RCVTIMEO*/ + /* Register event with callback */ + API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0); + + if (newconn == NULL) { + /* connection has been aborted */ + NETCONN_SET_SAFE_ERR(conn, ERR_ABRT); + return ERR_ABRT; + } +#if TCP_LISTEN_BACKLOG + /* Let the stack know that we have accepted the connection. */ + msg.function = do_recv; + msg.msg.conn = conn; + /* don't care for the return value of do_recv */ + TCPIP_APIMSG(&msg); +#endif /* TCP_LISTEN_BACKLOG */ + + *new_conn = newconn; + /* don't set conn->last_err: it's only ERR_OK, anyway */ + return ERR_OK; +#else /* LWIP_TCP */ + LWIP_UNUSED_ARG(conn); + LWIP_UNUSED_ARG(new_conn); + return ERR_ARG; +#endif /* LWIP_TCP */ +} + +/** + * Receive data: actual implementation that doesn't care whether pbuf or netbuf + * is received + * + * @param conn the netconn from which to receive data + * @param new_buf pointer where a new pbuf/netbuf is stored when received data + * @return ERR_OK if data has been received, an error code otherwise (timeout, + * memory error or another error) + */ +static err_t +netconn_recv_data(struct netconn *conn, void **new_buf) +{ + void *buf = NULL; + u16_t len; + err_t err; +#if LWIP_TCP + struct api_msg msg; +#endif /* LWIP_TCP */ + + LWIP_ERROR("netconn_recv: invalid pointer", (new_buf != NULL), return ERR_ARG;); + *new_buf = NULL; + LWIP_ERROR("netconn_recv: invalid conn", (conn != NULL), return ERR_ARG;); + LWIP_ERROR("netconn_accept: invalid recvmbox", sys_mbox_valid(&conn->recvmbox), return ERR_CONN;); + + err = conn->last_err; + if (ERR_IS_FATAL(err)) { + /* don't recv on fatal errors: this might block the application task + waiting on recvmbox forever! */ + /* @todo: this does not allow us to fetch data that has been put into recvmbox + before the fatal error occurred - is that a problem? */ + return err; + } + +#if LWIP_SO_RCVTIMEO + if (sys_arch_mbox_fetch(&conn->recvmbox, &buf, conn->recv_timeout) == SYS_ARCH_TIMEOUT) { + NETCONN_SET_SAFE_ERR(conn, ERR_TIMEOUT); + return ERR_TIMEOUT; + } +#else + sys_arch_mbox_fetch(&conn->recvmbox, &buf, 0); +#endif /* LWIP_SO_RCVTIMEO*/ + +#if LWIP_TCP +#if (LWIP_UDP || LWIP_RAW) + if (conn->type == NETCONN_TCP) +#endif /* (LWIP_UDP || LWIP_RAW) */ + { + if (!netconn_get_noautorecved(conn) || (buf == NULL)) { + /* Let the stack know that we have taken the data. */ + /* TODO: Speedup: Don't block and wait for the answer here + (to prevent multiple thread-switches). */ + msg.function = do_recv; + msg.msg.conn = conn; + if (buf != NULL) { + msg.msg.msg.r.len = ((struct pbuf *)buf)->tot_len; + } else { + msg.msg.msg.r.len = 1; + } + /* don't care for the return value of do_recv */ + TCPIP_APIMSG(&msg); + } + + /* If we are closed, we indicate that we no longer wish to use the socket */ + if (buf == NULL) { + API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0); + /* Avoid to lose any previous error code */ + NETCONN_SET_SAFE_ERR(conn, ERR_CLSD); + return ERR_CLSD; + } + len = ((struct pbuf *)buf)->tot_len; + } +#endif /* LWIP_TCP */ +#if LWIP_TCP && (LWIP_UDP || LWIP_RAW) + else +#endif /* LWIP_TCP && (LWIP_UDP || LWIP_RAW) */ +#if (LWIP_UDP || LWIP_RAW) + { + LWIP_ASSERT("buf != NULL", buf != NULL); + len = netbuf_len((struct netbuf *)buf); + } +#endif /* (LWIP_UDP || LWIP_RAW) */ + +#if LWIP_SO_RCVBUF + SYS_ARCH_DEC(conn->recv_avail, len); +#endif /* LWIP_SO_RCVBUF */ + /* Register event with callback */ + API_EVENT(conn, NETCONN_EVT_RCVMINUS, len); + + LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_recv_data: received %p, len=%"U16_F"\n", buf, len)); + + *new_buf = buf; + /* don't set conn->last_err: it's only ERR_OK, anyway */ + return ERR_OK; +} + +/** + * Receive data (in form of a pbuf) from a TCP netconn + * + * @param conn the netconn from which to receive data + * @param new_buf pointer where a new pbuf is stored when received data + * @return ERR_OK if data has been received, an error code otherwise (timeout, + * memory error or another error) + * ERR_ARG if conn is not a TCP netconn + */ +err_t +netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf) +{ + LWIP_ERROR("netconn_recv: invalid conn", (conn != NULL) && + netconn_type(conn) == NETCONN_TCP, return ERR_ARG;); + + return netconn_recv_data(conn, (void **)new_buf); +} + +/** + * Receive data (in form of a netbuf containing a packet buffer) from a netconn + * + * @param conn the netconn from which to receive data + * @param new_buf pointer where a new netbuf is stored when received data + * @return ERR_OK if data has been received, an error code otherwise (timeout, + * memory error or another error) + */ +err_t +netconn_recv(struct netconn *conn, struct netbuf **new_buf) +{ +#if LWIP_TCP + struct netbuf *buf = NULL; + err_t err; +#endif /* LWIP_TCP */ + + LWIP_ERROR("netconn_recv: invalid pointer", (new_buf != NULL), return ERR_ARG;); + *new_buf = NULL; + LWIP_ERROR("netconn_recv: invalid conn", (conn != NULL), return ERR_ARG;); + LWIP_ERROR("netconn_accept: invalid recvmbox", sys_mbox_valid(&conn->recvmbox), return ERR_CONN;); + +#if LWIP_TCP +#if (LWIP_UDP || LWIP_RAW) + if (conn->type == NETCONN_TCP) +#endif /* (LWIP_UDP || LWIP_RAW) */ + { + struct pbuf *p = NULL; + /* This is not a listening netconn, since recvmbox is set */ + + buf = (struct netbuf *)memp_malloc(MEMP_NETBUF); + if (buf == NULL) { + NETCONN_SET_SAFE_ERR(conn, ERR_MEM); + return ERR_MEM; + } + + err = netconn_recv_data(conn, (void **)&p); + if (err != ERR_OK) { + memp_free(MEMP_NETBUF, buf); + return err; + } + LWIP_ASSERT("p != NULL", p != NULL); + + buf->p = p; + buf->ptr = p; + buf->port = 0; + ip_addr_set_any(&buf->addr); + *new_buf = buf; + /* don't set conn->last_err: it's only ERR_OK, anyway */ + return ERR_OK; + } +#endif /* LWIP_TCP */ +#if LWIP_TCP && (LWIP_UDP || LWIP_RAW) + else +#endif /* LWIP_TCP && (LWIP_UDP || LWIP_RAW) */ + { +#if (LWIP_UDP || LWIP_RAW) + return netconn_recv_data(conn, (void **)new_buf); +#endif /* (LWIP_UDP || LWIP_RAW) */ + } +} + +/** + * TCP: update the receive window: by calling this, the application + * tells the stack that it has processed data and is able to accept + * new data. + * ATTENTION: use with care, this is mainly used for sockets! + * Can only be used when calling netconn_set_noautorecved(conn, 1) before. + * + * @param conn the netconn for which to update the receive window + * @param length amount of data processed (ATTENTION: this must be accurate!) + */ +void +netconn_recved(struct netconn *conn, u32_t length) +{ +#if LWIP_TCP + if ((conn != NULL) && (conn->type == NETCONN_TCP) && + (netconn_get_noautorecved(conn))) { + struct api_msg msg; + /* Let the stack know that we have taken the data. */ + /* TODO: Speedup: Don't block and wait for the answer here + (to prevent multiple thread-switches). */ + msg.function = do_recv; + msg.msg.conn = conn; + msg.msg.msg.r.len = length; + /* don't care for the return value of do_recv */ + TCPIP_APIMSG(&msg); + } +#else /* LWIP_TCP */ + LWIP_UNUSED_ARG(conn); + LWIP_UNUSED_ARG(length); +#endif /* LWIP_TCP */ +} + +/** + * Send data (in form of a netbuf) to a specific remote IP address and port. + * Only to be used for UDP and RAW netconns (not TCP). + * + * @param conn the netconn over which to send data + * @param buf a netbuf containing the data to send + * @param addr the remote IP address to which to send the data + * @param port the remote port to which to send the data + * @return ERR_OK if data was sent, any other err_t on error + */ +err_t +netconn_sendto(struct netconn *conn, struct netbuf *buf, ip_addr_t *addr, u16_t port) +{ + if (buf != NULL) { + ip_addr_set(&buf->addr, addr); + buf->port = port; + return netconn_send(conn, buf); + } + return ERR_VAL; +} + +/** + * Send data over a UDP or RAW netconn (that is already connected). + * + * @param conn the UDP or RAW netconn over which to send data + * @param buf a netbuf containing the data to send + * @return ERR_OK if data was sent, any other err_t on error + */ +err_t +netconn_send(struct netconn *conn, struct netbuf *buf) +{ + struct api_msg msg; + err_t err; + + LWIP_ERROR("netconn_send: invalid conn", (conn != NULL), return ERR_ARG;); + + LWIP_DEBUGF(API_LIB_DEBUG, ("netconn_send: sending %"U16_F" bytes\n", buf->p->tot_len)); + msg.function = do_send; + msg.msg.conn = conn; + msg.msg.msg.b = buf; + err = TCPIP_APIMSG(&msg); + + NETCONN_SET_SAFE_ERR(conn, err); + return err; +} + +/** + * Send data over a TCP netconn. + * + * @param conn the TCP netconn over which to send data + * @param dataptr pointer to the application buffer that contains the data to send + * @param size size of the application data to send + * @param apiflags combination of following flags : + * - NETCONN_COPY: data will be copied into memory belonging to the stack + * - NETCONN_MORE: for TCP connection, PSH flag will be set on last segment sent + * - NETCONN_DONTBLOCK: only write the data if all dat can be written at once + * @param bytes_written pointer to a location that receives the number of written bytes + * @return ERR_OK if data was sent, any other err_t on error + */ +err_t +netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size, + u8_t apiflags, size_t *bytes_written) +{ + struct api_msg msg; + err_t err; + u8_t dontblock; + + LWIP_ERROR("netconn_write: invalid conn", (conn != NULL), return ERR_ARG;); + LWIP_ERROR("netconn_write: invalid conn->type", (conn->type == NETCONN_TCP), return ERR_VAL;); + if (size == 0) { + return ERR_OK; + } + dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK); + if (dontblock && !bytes_written) { + /* This implies netconn_write() cannot be used for non-blocking send, since + it has no way to return the number of bytes written. */ + return ERR_VAL; + } + + /* non-blocking write sends as much */ + msg.function = do_write; + msg.msg.conn = conn; + msg.msg.msg.w.dataptr = dataptr; + msg.msg.msg.w.apiflags = apiflags; + msg.msg.msg.w.len = size; +#if LWIP_SO_SNDTIMEO + if (conn->send_timeout != 0) { + /* get the time we started, which is later compared to + sys_now() + conn->send_timeout */ + msg.msg.msg.w.time_started = sys_now(); + } else { + msg.msg.msg.w.time_started = 0; + } +#endif /* LWIP_SO_SNDTIMEO */ + + /* For locking the core: this _can_ be delayed on low memory/low send buffer, + but if it is, this is done inside api_msg.c:do_write(), so we can use the + non-blocking version here. */ + err = TCPIP_APIMSG(&msg); + if ((err == ERR_OK) && (bytes_written != NULL)) { + if (dontblock +#if LWIP_SO_SNDTIMEO + || (conn->send_timeout != 0) +#endif /* LWIP_SO_SNDTIMEO */ + ) { + /* nonblocking write: maybe the data has been sent partly */ + *bytes_written = msg.msg.msg.w.len; + } else { + /* blocking call succeeded: all data has been sent if it */ + *bytes_written = size; + } + } + + NETCONN_SET_SAFE_ERR(conn, err); + return err; +} + +/** + * Close ot shutdown a TCP netconn (doesn't delete it). + * + * @param conn the TCP netconn to close or shutdown + * @param how fully close or only shutdown one side? + * @return ERR_OK if the netconn was closed, any other err_t on error + */ +static err_t +netconn_close_shutdown(struct netconn *conn, u8_t how) +{ + struct api_msg msg; + err_t err; + + LWIP_ERROR("netconn_close: invalid conn", (conn != NULL), return ERR_ARG;); + + msg.function = do_close; + msg.msg.conn = conn; + /* shutting down both ends is the same as closing */ + msg.msg.msg.sd.shut = how; + /* because of the LWIP_TCPIP_CORE_LOCKING implementation of do_close, + don't use TCPIP_APIMSG here */ + err = tcpip_apimsg(&msg); + + NETCONN_SET_SAFE_ERR(conn, err); + return err; +} + +/** + * Close a TCP netconn (doesn't delete it). + * + * @param conn the TCP netconn to close + * @return ERR_OK if the netconn was closed, any other err_t on error + */ +err_t +netconn_close(struct netconn *conn) +{ + /* shutting down both ends is the same as closing */ + return netconn_close_shutdown(conn, NETCONN_SHUT_RDWR); +} + +/** + * Shut down one or both sides of a TCP netconn (doesn't delete it). + * + * @param conn the TCP netconn to shut down + * @return ERR_OK if the netconn was closed, any other err_t on error + */ +err_t +netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx) +{ + return netconn_close_shutdown(conn, (shut_rx ? NETCONN_SHUT_RD : 0) | (shut_tx ? NETCONN_SHUT_WR : 0)); +} + +#if LWIP_IGMP +/** + * Join multicast groups for UDP netconns. + * + * @param conn the UDP netconn for which to change multicast addresses + * @param multiaddr IP address of the multicast group to join or leave + * @param netif_addr the IP address of the network interface on which to send + * the igmp message + * @param join_or_leave flag whether to send a join- or leave-message + * @return ERR_OK if the action was taken, any err_t on error + */ +err_t +netconn_join_leave_group(struct netconn *conn, + ip_addr_t *multiaddr, + ip_addr_t *netif_addr, + enum netconn_igmp join_or_leave) +{ + struct api_msg msg; + err_t err; + + LWIP_ERROR("netconn_join_leave_group: invalid conn", (conn != NULL), return ERR_ARG;); + + msg.function = do_join_leave_group; + msg.msg.conn = conn; + msg.msg.msg.jl.multiaddr = multiaddr; + msg.msg.msg.jl.netif_addr = netif_addr; + msg.msg.msg.jl.join_or_leave = join_or_leave; + err = TCPIP_APIMSG(&msg); + + NETCONN_SET_SAFE_ERR(conn, err); + return err; +} +#endif /* LWIP_IGMP */ + +#if LWIP_DNS +/** + * Execute a DNS query, only one IP address is returned + * + * @param name a string representation of the DNS host name to query + * @param addr a preallocated ip_addr_t where to store the resolved IP address + * @return ERR_OK: resolving succeeded + * ERR_MEM: memory error, try again later + * ERR_ARG: dns client not initialized or invalid hostname + * ERR_VAL: dns server response was invalid + */ +err_t +netconn_gethostbyname(const char *name, ip_addr_t *addr) +{ + struct dns_api_msg msg; + err_t err; + sys_sem_t sem; + + LWIP_ERROR("netconn_gethostbyname: invalid name", (name != NULL), return ERR_ARG;); + LWIP_ERROR("netconn_gethostbyname: invalid addr", (addr != NULL), return ERR_ARG;); + + err = sys_sem_new(&sem, 0); + if (err != ERR_OK) { + return err; + } + + msg.name = name; + msg.addr = addr; + msg.err = &err; + msg.sem = &sem; + + tcpip_callback(do_gethostbyname, &msg); + sys_sem_wait(&sem); + sys_sem_free(&sem); + + return err; +} +#endif /* LWIP_DNS*/ + +#endif /* LWIP_NETCONN */ diff --git a/third_party/lwip-1.4.1/src/api/api_msg.c b/third_party/lwip-1.4.1/src/api/api_msg.c new file mode 100644 index 0000000..b4d7394 --- /dev/null +++ b/third_party/lwip-1.4.1/src/api/api_msg.c @@ -0,0 +1,1565 @@ +/** + * @file + * Sequential API Internal module + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/api_msg.h" + +#include "lwip/ip.h" +#include "lwip/udp.h" +#include "lwip/tcp.h" +#include "lwip/raw.h" + +#include "lwip/memp.h" +#include "lwip/tcpip.h" +#include "lwip/igmp.h" +#include "lwip/dns.h" + +#include + +#define SET_NONBLOCKING_CONNECT(conn, val) do { if(val) { \ + (conn)->flags |= NETCONN_FLAG_IN_NONBLOCKING_CONNECT; \ +} else { \ + (conn)->flags &= ~ NETCONN_FLAG_IN_NONBLOCKING_CONNECT; }} while(0) +#define IN_NONBLOCKING_CONNECT(conn) (((conn)->flags & NETCONN_FLAG_IN_NONBLOCKING_CONNECT) != 0) + +/* forward declarations */ +#if LWIP_TCP +static err_t do_writemore(struct netconn *conn); +static void do_close_internal(struct netconn *conn); +#endif + +#if LWIP_RAW +/** + * Receive callback function for RAW netconns. + * Doesn't 'eat' the packet, only references it and sends it to + * conn->recvmbox + * + * @see raw.h (struct raw_pcb.recv) for parameters and return value + */ +static u8_t +recv_raw(void *arg, struct raw_pcb *pcb, struct pbuf *p, + ip_addr_t *addr) +{ + struct pbuf *q; + struct netbuf *buf; + struct netconn *conn; + + LWIP_UNUSED_ARG(addr); + conn = (struct netconn *)arg; + + if ((conn != NULL) && sys_mbox_valid(&conn->recvmbox)) { +#if LWIP_SO_RCVBUF + int recv_avail; + SYS_ARCH_GET(conn->recv_avail, recv_avail); + if ((recv_avail + (int)(p->tot_len)) > conn->recv_bufsize) { + return 0; + } +#endif /* LWIP_SO_RCVBUF */ + /* copy the whole packet into new pbufs */ + q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM); + if(q != NULL) { + if (pbuf_copy(q, p) != ERR_OK) { + pbuf_free(q); + q = NULL; + } + } + + if (q != NULL) { + u16_t len; + buf = (struct netbuf *)memp_malloc(MEMP_NETBUF); + if (buf == NULL) { + pbuf_free(q); + return 0; + } + + buf->p = q; + buf->ptr = q; + ip_addr_copy(buf->addr, *ip_current_src_addr()); + buf->port = pcb->protocol; + + len = q->tot_len; + if (sys_mbox_trypost(&conn->recvmbox, buf) != ERR_OK) { + netbuf_delete(buf); + return 0; + } else { +#if LWIP_SO_RCVBUF + SYS_ARCH_INC(conn->recv_avail, len); +#endif /* LWIP_SO_RCVBUF */ + /* Register event with callback */ + API_EVENT(conn, NETCONN_EVT_RCVPLUS, len); + } + } + } + + return 0; /* do not eat the packet */ +} +#endif /* LWIP_RAW*/ + +#if LWIP_UDP +/** + * Receive callback function for UDP netconns. + * Posts the packet to conn->recvmbox or deletes it on memory error. + * + * @see udp.h (struct udp_pcb.recv) for parameters + */ +static void +recv_udp(void *arg, struct udp_pcb *pcb, struct pbuf *p, + ip_addr_t *addr, u16_t port) +{ + struct netbuf *buf; + struct netconn *conn; + u16_t len; +#if LWIP_SO_RCVBUF + int recv_avail; +#endif /* LWIP_SO_RCVBUF */ + + LWIP_UNUSED_ARG(pcb); /* only used for asserts... */ + LWIP_ASSERT("recv_udp must have a pcb argument", pcb != NULL); + LWIP_ASSERT("recv_udp must have an argument", arg != NULL); + conn = (struct netconn *)arg; + LWIP_ASSERT("recv_udp: recv for wrong pcb!", conn->pcb.udp == pcb); + +#if LWIP_SO_RCVBUF + SYS_ARCH_GET(conn->recv_avail, recv_avail); + if ((conn == NULL) || !sys_mbox_valid(&conn->recvmbox) || + ((recv_avail + (int)(p->tot_len)) > conn->recv_bufsize)) { +#else /* LWIP_SO_RCVBUF */ + if ((conn == NULL) || !sys_mbox_valid(&conn->recvmbox)) { +#endif /* LWIP_SO_RCVBUF */ + pbuf_free(p); + return; + } + + buf = (struct netbuf *)memp_malloc(MEMP_NETBUF); + if (buf == NULL) { + pbuf_free(p); + return; + } else { + buf->p = p; + buf->ptr = p; + ip_addr_set(&buf->addr, addr); + buf->port = port; +#if LWIP_NETBUF_RECVINFO + { + const struct ip_hdr* iphdr = ip_current_header(); + /* get the UDP header - always in the first pbuf, ensured by udp_input */ + const struct udp_hdr* udphdr = (void*)(((char*)iphdr) + IPH_LEN(iphdr)); +#if LWIP_CHECKSUM_ON_COPY + buf->flags = NETBUF_FLAG_DESTADDR; +#endif /* LWIP_CHECKSUM_ON_COPY */ + ip_addr_set(&buf->toaddr, ip_current_dest_addr()); + buf->toport_chksum = udphdr->dest; + } +#endif /* LWIP_NETBUF_RECVINFO */ + } + + len = p->tot_len; + if (sys_mbox_trypost(&conn->recvmbox, buf) != ERR_OK) { + netbuf_delete(buf); + return; + } else { +#if LWIP_SO_RCVBUF + SYS_ARCH_INC(conn->recv_avail, len); +#endif /* LWIP_SO_RCVBUF */ + /* Register event with callback */ + API_EVENT(conn, NETCONN_EVT_RCVPLUS, len); + } +} +#endif /* LWIP_UDP */ + +#if LWIP_TCP +/** + * Receive callback function for TCP netconns. + * Posts the packet to conn->recvmbox, but doesn't delete it on errors. + * + * @see tcp.h (struct tcp_pcb.recv) for parameters and return value + */ +static err_t +recv_tcp(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) +{ + struct netconn *conn; + u16_t len; + + LWIP_UNUSED_ARG(pcb); + LWIP_ASSERT("recv_tcp must have a pcb argument", pcb != NULL); + LWIP_ASSERT("recv_tcp must have an argument", arg != NULL); + conn = (struct netconn *)arg; + LWIP_ASSERT("recv_tcp: recv for wrong pcb!", conn->pcb.tcp == pcb); + + if (conn == NULL) { + return ERR_VAL; + } + if (!sys_mbox_valid(&conn->recvmbox)) { + /* recvmbox already deleted */ + if (p != NULL) { + tcp_recved(pcb, p->tot_len); + pbuf_free(p); + } + return ERR_OK; + } + /* Unlike for UDP or RAW pcbs, don't check for available space + using recv_avail since that could break the connection + (data is already ACKed) */ + + /* don't overwrite fatal errors! */ + NETCONN_SET_SAFE_ERR(conn, err); + + if (p != NULL) { + len = p->tot_len; + } else { + len = 0; + } + + if (sys_mbox_trypost(&conn->recvmbox, p) != ERR_OK) { + /* don't deallocate p: it is presented to us later again from tcp_fasttmr! */ + return ERR_MEM; + } else { +#if LWIP_SO_RCVBUF + SYS_ARCH_INC(conn->recv_avail, len); +#endif /* LWIP_SO_RCVBUF */ + /* Register event with callback */ + API_EVENT(conn, NETCONN_EVT_RCVPLUS, len); + } + + return ERR_OK; +} + +/** + * Poll callback function for TCP netconns. + * Wakes up an application thread that waits for a connection to close + * or data to be sent. The application thread then takes the + * appropriate action to go on. + * + * Signals the conn->sem. + * netconn_close waits for conn->sem if closing failed. + * + * @see tcp.h (struct tcp_pcb.poll) for parameters and return value + */ +static err_t +poll_tcp(void *arg, struct tcp_pcb *pcb) +{ + struct netconn *conn = (struct netconn *)arg; + + LWIP_UNUSED_ARG(pcb); + LWIP_ASSERT("conn != NULL", (conn != NULL)); + + if (conn->state == NETCONN_WRITE) { + do_writemore(conn); + } else if (conn->state == NETCONN_CLOSE) { + do_close_internal(conn); + } + /* @todo: implement connect timeout here? */ + + /* Did a nonblocking write fail before? Then check available write-space. */ + if (conn->flags & NETCONN_FLAG_CHECK_WRITESPACE) { + /* If the queued byte- or pbuf-count drops below the configured low-water limit, + let select mark this pcb as writable again. */ + if ((conn->pcb.tcp != NULL) && (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT) && + (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) { + conn->flags &= ~NETCONN_FLAG_CHECK_WRITESPACE; + API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0); + } + } + + return ERR_OK; +} + +/** + * Sent callback function for TCP netconns. + * Signals the conn->sem and calls API_EVENT. + * netconn_write waits for conn->sem if send buffer is low. + * + * @see tcp.h (struct tcp_pcb.sent) for parameters and return value + */ +static err_t +sent_tcp(void *arg, struct tcp_pcb *pcb, u16_t len) +{ + struct netconn *conn = (struct netconn *)arg; + + LWIP_UNUSED_ARG(pcb); + LWIP_ASSERT("conn != NULL", (conn != NULL)); + + if (conn->state == NETCONN_WRITE) { + do_writemore(conn); + } else if (conn->state == NETCONN_CLOSE) { + do_close_internal(conn); + } + + if (conn) { + /* If the queued byte- or pbuf-count drops below the configured low-water limit, + let select mark this pcb as writable again. */ + if ((conn->pcb.tcp != NULL) && (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT) && + (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) { + conn->flags &= ~NETCONN_FLAG_CHECK_WRITESPACE; + API_EVENT(conn, NETCONN_EVT_SENDPLUS, len); + } + } + + return ERR_OK; +} + +/** + * Error callback function for TCP netconns. + * Signals conn->sem, posts to all conn mboxes and calls API_EVENT. + * The application thread has then to decide what to do. + * + * @see tcp.h (struct tcp_pcb.err) for parameters + */ +static void +err_tcp(void *arg, err_t err) +{ + struct netconn *conn; + enum netconn_state old_state; + SYS_ARCH_DECL_PROTECT(lev); + + conn = (struct netconn *)arg; + LWIP_ASSERT("conn != NULL", (conn != NULL)); + + conn->pcb.tcp = NULL; + + /* no check since this is always fatal! */ + SYS_ARCH_PROTECT(lev); + conn->last_err = err; + SYS_ARCH_UNPROTECT(lev); + + /* reset conn->state now before waking up other threads */ + old_state = conn->state; + conn->state = NETCONN_NONE; + + /* Notify the user layer about a connection error. Used to signal + select. */ + API_EVENT(conn, NETCONN_EVT_ERROR, 0); + /* Try to release selects pending on 'read' or 'write', too. + They will get an error if they actually try to read or write. */ + API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0); + API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0); + + /* pass NULL-message to recvmbox to wake up pending recv */ + if (sys_mbox_valid(&conn->recvmbox)) { + /* use trypost to prevent deadlock */ + sys_mbox_trypost(&conn->recvmbox, NULL); + } + /* pass NULL-message to acceptmbox to wake up pending accept */ + if (sys_mbox_valid(&conn->acceptmbox)) { + /* use trypost to preven deadlock */ + sys_mbox_trypost(&conn->acceptmbox, NULL); + } + + if ((old_state == NETCONN_WRITE) || (old_state == NETCONN_CLOSE) || + (old_state == NETCONN_CONNECT)) { + /* calling do_writemore/do_close_internal is not necessary + since the pcb has already been deleted! */ + int was_nonblocking_connect = IN_NONBLOCKING_CONNECT(conn); + SET_NONBLOCKING_CONNECT(conn, 0); + + if (!was_nonblocking_connect) { + /* set error return code */ + LWIP_ASSERT("conn->current_msg != NULL", conn->current_msg != NULL); + conn->current_msg->err = err; + conn->current_msg = NULL; + /* wake up the waiting task */ + sys_sem_signal(&conn->op_completed); + } + } else { + LWIP_ASSERT("conn->current_msg == NULL", conn->current_msg == NULL); + } +} + +/** + * Setup a tcp_pcb with the correct callback function pointers + * and their arguments. + * + * @param conn the TCP netconn to setup + */ +static void +setup_tcp(struct netconn *conn) +{ + struct tcp_pcb *pcb; + + pcb = conn->pcb.tcp; + tcp_arg(pcb, conn); + tcp_recv(pcb, recv_tcp); + tcp_sent(pcb, sent_tcp); + tcp_poll(pcb, poll_tcp, 4); + tcp_err(pcb, err_tcp); +} + +/** + * Accept callback function for TCP netconns. + * Allocates a new netconn and posts that to conn->acceptmbox. + * + * @see tcp.h (struct tcp_pcb_listen.accept) for parameters and return value + */ +static err_t +accept_function(void *arg, struct tcp_pcb *newpcb, err_t err) +{ + struct netconn *newconn; + struct netconn *conn = (struct netconn *)arg; + + LWIP_DEBUGF(API_MSG_DEBUG, ("accept_function: newpcb->tate: %s\n", tcp_debug_state_str(newpcb->state))); + + if (!sys_mbox_valid(&conn->acceptmbox)) { + LWIP_DEBUGF(API_MSG_DEBUG, ("accept_function: acceptmbox already deleted\n")); + return ERR_VAL; + } + + /* We have to set the callback here even though + * the new socket is unknown. conn->socket is marked as -1. */ + newconn = netconn_alloc(conn->type, conn->callback); + if (newconn == NULL) { + return ERR_MEM; + } + newconn->pcb.tcp = newpcb; + setup_tcp(newconn); + /* no protection: when creating the pcb, the netconn is not yet known + to the application thread */ + newconn->last_err = err; + + if (sys_mbox_trypost(&conn->acceptmbox, newconn) != ERR_OK) { + /* When returning != ERR_OK, the pcb is aborted in tcp_process(), + so do nothing here! */ + /* remove all references to this netconn from the pcb */ + struct tcp_pcb* pcb = newconn->pcb.tcp; + tcp_arg(pcb, NULL); + tcp_recv(pcb, NULL); + tcp_sent(pcb, NULL); + tcp_poll(pcb, NULL, 4); + tcp_err(pcb, NULL); + /* remove reference from to the pcb from this netconn */ + newconn->pcb.tcp = NULL; + /* no need to drain since we know the recvmbox is empty. */ + sys_mbox_free(&newconn->recvmbox); + sys_mbox_set_invalid(&newconn->recvmbox); + netconn_free(newconn); + return ERR_MEM; + } else { + /* Register event with callback */ + API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0); + } + + return ERR_OK; +} +#endif /* LWIP_TCP */ + +/** + * Create a new pcb of a specific type. + * Called from do_newconn(). + * + * @param msg the api_msg_msg describing the connection type + * @return msg->conn->err, but the return value is currently ignored + */ +static void +pcb_new(struct api_msg_msg *msg) +{ + LWIP_ASSERT("pcb_new: pcb already allocated", msg->conn->pcb.tcp == NULL); + + /* Allocate a PCB for this connection */ + switch(NETCONNTYPE_GROUP(msg->conn->type)) { +#if LWIP_RAW + case NETCONN_RAW: + msg->conn->pcb.raw = raw_new(msg->msg.n.proto); + if(msg->conn->pcb.raw == NULL) { + msg->err = ERR_MEM; + break; + } + raw_recv(msg->conn->pcb.raw, recv_raw, msg->conn); + break; +#endif /* LWIP_RAW */ +#if LWIP_UDP + case NETCONN_UDP: + msg->conn->pcb.udp = udp_new(); + if(msg->conn->pcb.udp == NULL) { + msg->err = ERR_MEM; + break; + } +#if LWIP_UDPLITE + if (msg->conn->type==NETCONN_UDPLITE) { + udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_UDPLITE); + } +#endif /* LWIP_UDPLITE */ + if (msg->conn->type==NETCONN_UDPNOCHKSUM) { + udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_NOCHKSUM); + } + udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn); + break; +#endif /* LWIP_UDP */ +#if LWIP_TCP + case NETCONN_TCP: + msg->conn->pcb.tcp = tcp_new(); + if(msg->conn->pcb.tcp == NULL) { + msg->err = ERR_MEM; + break; + } + setup_tcp(msg->conn); + break; +#endif /* LWIP_TCP */ + default: + /* Unsupported netconn type, e.g. protocol disabled */ + msg->err = ERR_VAL; + break; + } +} + +/** + * Create a new pcb of a specific type inside a netconn. + * Called from netconn_new_with_proto_and_callback. + * + * @param msg the api_msg_msg describing the connection type + */ +void +do_newconn(struct api_msg_msg *msg) +{ + msg->err = ERR_OK; + if(msg->conn->pcb.tcp == NULL) { + pcb_new(msg); + } + /* Else? This "new" connection already has a PCB allocated. */ + /* Is this an error condition? Should it be deleted? */ + /* We currently just are happy and return. */ + + TCPIP_APIMSG_ACK(msg); +} + +/** + * Create a new netconn (of a specific type) that has a callback function. + * The corresponding pcb is NOT created! + * + * @param t the type of 'connection' to create (@see enum netconn_type) + * @param proto the IP protocol for RAW IP pcbs + * @param callback a function to call on status changes (RX available, TX'ed) + * @return a newly allocated struct netconn or + * NULL on memory error + */ +struct netconn* +netconn_alloc(enum netconn_type t, netconn_callback callback) +{ + struct netconn *conn; + int size; + + conn = (struct netconn *)memp_malloc(MEMP_NETCONN); + if (conn == NULL) { + return NULL; + } + + conn->last_err = ERR_OK; + conn->type = t; + conn->pcb.tcp = NULL; + +#if (DEFAULT_RAW_RECVMBOX_SIZE == DEFAULT_UDP_RECVMBOX_SIZE) && \ + (DEFAULT_RAW_RECVMBOX_SIZE == DEFAULT_TCP_RECVMBOX_SIZE) + size = DEFAULT_RAW_RECVMBOX_SIZE; +#else + switch(NETCONNTYPE_GROUP(t)) { +#if LWIP_RAW + case NETCONN_RAW: + size = DEFAULT_RAW_RECVMBOX_SIZE; + break; +#endif /* LWIP_RAW */ +#if LWIP_UDP + case NETCONN_UDP: + size = DEFAULT_UDP_RECVMBOX_SIZE; + break; +#endif /* LWIP_UDP */ +#if LWIP_TCP + case NETCONN_TCP: + size = DEFAULT_TCP_RECVMBOX_SIZE; + break; +#endif /* LWIP_TCP */ + default: + LWIP_ASSERT("netconn_alloc: undefined netconn_type", 0); + goto free_and_return; + } +#endif + + if (sys_sem_new(&conn->op_completed, 0) != ERR_OK) { + goto free_and_return; + } + if (sys_mbox_new(&conn->recvmbox, size) != ERR_OK) { + sys_sem_free(&conn->op_completed); + goto free_and_return; + } + +#if LWIP_TCP + sys_mbox_set_invalid(&conn->acceptmbox); +#endif + conn->state = NETCONN_NONE; +#if LWIP_SOCKET + /* initialize socket to -1 since 0 is a valid socket */ + conn->socket = -1; +#endif /* LWIP_SOCKET */ + conn->callback = callback; +#if LWIP_TCP + conn->current_msg = NULL; + conn->write_offset = 0; +#endif /* LWIP_TCP */ +#if LWIP_SO_SNDTIMEO + conn->send_timeout = 0; +#endif /* LWIP_SO_SNDTIMEO */ +#if LWIP_SO_RCVTIMEO + conn->recv_timeout = 0; +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + conn->recv_bufsize = RECV_BUFSIZE_DEFAULT; + conn->recv_avail = 0; +#endif /* LWIP_SO_RCVBUF */ + conn->flags = 0; + return conn; +free_and_return: + memp_free(MEMP_NETCONN, conn); + return NULL; +} + +/** + * Delete a netconn and all its resources. + * The pcb is NOT freed (since we might not be in the right thread context do this). + * + * @param conn the netconn to free + */ +void +netconn_free(struct netconn *conn) +{ + LWIP_ASSERT("PCB must be deallocated outside this function", conn->pcb.tcp == NULL); + LWIP_ASSERT("recvmbox must be deallocated before calling this function", + !sys_mbox_valid(&conn->recvmbox)); +#if LWIP_TCP + LWIP_ASSERT("acceptmbox must be deallocated before calling this function", + !sys_mbox_valid(&conn->acceptmbox)); +#endif /* LWIP_TCP */ + + sys_sem_free(&conn->op_completed); + sys_sem_set_invalid(&conn->op_completed); + + memp_free(MEMP_NETCONN, conn); +} + +/** + * Delete rcvmbox and acceptmbox of a netconn and free the left-over data in + * these mboxes + * + * @param conn the netconn to free + * @bytes_drained bytes drained from recvmbox + * @accepts_drained pending connections drained from acceptmbox + */ +static void +netconn_drain(struct netconn *conn) +{ + void *mem; +#if LWIP_TCP + struct pbuf *p; +#endif /* LWIP_TCP */ + + /* This runs in tcpip_thread, so we don't need to lock against rx packets */ + + /* Delete and drain the recvmbox. */ + if (sys_mbox_valid(&conn->recvmbox)) { + while (sys_mbox_tryfetch(&conn->recvmbox, &mem) != SYS_MBOX_EMPTY) { +#if LWIP_TCP + if (conn->type == NETCONN_TCP) { + if(mem != NULL) { + p = (struct pbuf*)mem; + /* pcb might be set to NULL already by err_tcp() */ + if (conn->pcb.tcp != NULL) { + tcp_recved(conn->pcb.tcp, p->tot_len); + } + pbuf_free(p); + } + } else +#endif /* LWIP_TCP */ + { + netbuf_delete((struct netbuf *)mem); + } + } + sys_mbox_free(&conn->recvmbox); + sys_mbox_set_invalid(&conn->recvmbox); + } + + /* Delete and drain the acceptmbox. */ +#if LWIP_TCP + if (sys_mbox_valid(&conn->acceptmbox)) { + while (sys_mbox_tryfetch(&conn->acceptmbox, &mem) != SYS_MBOX_EMPTY) { + struct netconn *newconn = (struct netconn *)mem; + /* Only tcp pcbs have an acceptmbox, so no need to check conn->type */ + /* pcb might be set to NULL already by err_tcp() */ + if (conn->pcb.tcp != NULL) { + tcp_accepted(conn->pcb.tcp); + } + /* drain recvmbox */ + netconn_drain(newconn); + if (newconn->pcb.tcp != NULL) { + tcp_abort(newconn->pcb.tcp); + newconn->pcb.tcp = NULL; + } + netconn_free(newconn); + } + sys_mbox_free(&conn->acceptmbox); + sys_mbox_set_invalid(&conn->acceptmbox); + } +#endif /* LWIP_TCP */ +} + +#if LWIP_TCP +/** + * Internal helper function to close a TCP netconn: since this sometimes + * doesn't work at the first attempt, this function is called from multiple + * places. + * + * @param conn the TCP netconn to close + */ +static void +do_close_internal(struct netconn *conn) +{ + err_t err; + u8_t shut, shut_rx, shut_tx, close; + + LWIP_ASSERT("invalid conn", (conn != NULL)); + LWIP_ASSERT("this is for tcp netconns only", (conn->type == NETCONN_TCP)); + LWIP_ASSERT("conn must be in state NETCONN_CLOSE", (conn->state == NETCONN_CLOSE)); + LWIP_ASSERT("pcb already closed", (conn->pcb.tcp != NULL)); + LWIP_ASSERT("conn->current_msg != NULL", conn->current_msg != NULL); + + shut = conn->current_msg->msg.sd.shut; + shut_rx = shut & NETCONN_SHUT_RD; + shut_tx = shut & NETCONN_SHUT_WR; + /* shutting down both ends is the same as closing */ + close = shut == NETCONN_SHUT_RDWR; + + /* Set back some callback pointers */ + if (close) { + tcp_arg(conn->pcb.tcp, NULL); + } + if (conn->pcb.tcp->state == LISTEN) { + tcp_accept(conn->pcb.tcp, NULL); + } else { + /* some callbacks have to be reset if tcp_close is not successful */ + if (shut_rx) { + tcp_recv(conn->pcb.tcp, NULL); + tcp_accept(conn->pcb.tcp, NULL); + } + if (shut_tx) { + tcp_sent(conn->pcb.tcp, NULL); + } + if (close) { + tcp_poll(conn->pcb.tcp, NULL, 4); + tcp_err(conn->pcb.tcp, NULL); + } + } + /* Try to close the connection */ + if (close) { + err = tcp_close(conn->pcb.tcp); + } else { + err = tcp_shutdown(conn->pcb.tcp, shut_rx, shut_tx); + } + if (err == ERR_OK) { + /* Closing succeeded */ + conn->current_msg->err = ERR_OK; + conn->current_msg = NULL; + conn->state = NETCONN_NONE; + if (close) { + /* Set back some callback pointers as conn is going away */ + conn->pcb.tcp = NULL; + /* Trigger select() in socket layer. Make sure everybody notices activity + on the connection, error first! */ + API_EVENT(conn, NETCONN_EVT_ERROR, 0); + } + if (shut_rx) { + API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0); + } + if (shut_tx) { + API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0); + } + /* wake up the application task */ + sys_sem_signal(&conn->op_completed); + } else { + /* Closing failed, restore some of the callbacks */ + /* Closing of listen pcb will never fail! */ + LWIP_ASSERT("Closing a listen pcb may not fail!", (conn->pcb.tcp->state != LISTEN)); + tcp_sent(conn->pcb.tcp, sent_tcp); + tcp_poll(conn->pcb.tcp, poll_tcp, 4); + tcp_err(conn->pcb.tcp, err_tcp); + tcp_arg(conn->pcb.tcp, conn); + /* don't restore recv callback: we don't want to receive any more data */ + } + /* If closing didn't succeed, we get called again either + from poll_tcp or from sent_tcp */ +} +#endif /* LWIP_TCP */ + +/** + * Delete the pcb inside a netconn. + * Called from netconn_delete. + * + * @param msg the api_msg_msg pointing to the connection + */ +void +do_delconn(struct api_msg_msg *msg) +{ + /* @todo TCP: abort running write/connect? */ + if ((msg->conn->state != NETCONN_NONE) && + (msg->conn->state != NETCONN_LISTEN) && + (msg->conn->state != NETCONN_CONNECT)) { + /* this only happens for TCP netconns */ + LWIP_ASSERT("msg->conn->type == NETCONN_TCP", msg->conn->type == NETCONN_TCP); + msg->err = ERR_INPROGRESS; + } else { + LWIP_ASSERT("blocking connect in progress", + (msg->conn->state != NETCONN_CONNECT) || IN_NONBLOCKING_CONNECT(msg->conn)); + /* Drain and delete mboxes */ + netconn_drain(msg->conn); + + if (msg->conn->pcb.tcp != NULL) { + + switch (NETCONNTYPE_GROUP(msg->conn->type)) { +#if LWIP_RAW + case NETCONN_RAW: + raw_remove(msg->conn->pcb.raw); + break; +#endif /* LWIP_RAW */ +#if LWIP_UDP + case NETCONN_UDP: + msg->conn->pcb.udp->recv_arg = NULL; + udp_remove(msg->conn->pcb.udp); + break; +#endif /* LWIP_UDP */ +#if LWIP_TCP + case NETCONN_TCP: + LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL && + msg->conn->write_offset == 0); + msg->conn->state = NETCONN_CLOSE; + msg->msg.sd.shut = NETCONN_SHUT_RDWR; + msg->conn->current_msg = msg; + do_close_internal(msg->conn); + /* API_EVENT is called inside do_close_internal, before releasing + the application thread, so we can return at this point! */ + return; +#endif /* LWIP_TCP */ + default: + break; + } + msg->conn->pcb.tcp = NULL; + } + /* tcp netconns don't come here! */ + + /* @todo: this lets select make the socket readable and writable, + which is wrong! errfd instead? */ + API_EVENT(msg->conn, NETCONN_EVT_RCVPLUS, 0); + API_EVENT(msg->conn, NETCONN_EVT_SENDPLUS, 0); + } + if (sys_sem_valid(&msg->conn->op_completed)) { + sys_sem_signal(&msg->conn->op_completed); + } +} + +/** + * Bind a pcb contained in a netconn + * Called from netconn_bind. + * + * @param msg the api_msg_msg pointing to the connection and containing + * the IP address and port to bind to + */ +void +do_bind(struct api_msg_msg *msg) +{ + if (ERR_IS_FATAL(msg->conn->last_err)) { + msg->err = msg->conn->last_err; + } else { + msg->err = ERR_VAL; + if (msg->conn->pcb.tcp != NULL) { + switch (NETCONNTYPE_GROUP(msg->conn->type)) { +#if LWIP_RAW + case NETCONN_RAW: + msg->err = raw_bind(msg->conn->pcb.raw, msg->msg.bc.ipaddr); + break; +#endif /* LWIP_RAW */ +#if LWIP_UDP + case NETCONN_UDP: + msg->err = udp_bind(msg->conn->pcb.udp, msg->msg.bc.ipaddr, msg->msg.bc.port); + break; +#endif /* LWIP_UDP */ +#if LWIP_TCP + case NETCONN_TCP: + msg->err = tcp_bind(msg->conn->pcb.tcp, msg->msg.bc.ipaddr, msg->msg.bc.port); + break; +#endif /* LWIP_TCP */ + default: + break; + } + } + } + TCPIP_APIMSG_ACK(msg); +} + +#if LWIP_TCP +/** + * TCP callback function if a connection (opened by tcp_connect/do_connect) has + * been established (or reset by the remote host). + * + * @see tcp.h (struct tcp_pcb.connected) for parameters and return values + */ +static err_t +do_connected(void *arg, struct tcp_pcb *pcb, err_t err) +{ + struct netconn *conn; + int was_blocking; + + LWIP_UNUSED_ARG(pcb); + + conn = (struct netconn *)arg; + + if (conn == NULL) { + return ERR_VAL; + } + + LWIP_ASSERT("conn->state == NETCONN_CONNECT", conn->state == NETCONN_CONNECT); + LWIP_ASSERT("(conn->current_msg != NULL) || conn->in_non_blocking_connect", + (conn->current_msg != NULL) || IN_NONBLOCKING_CONNECT(conn)); + + if (conn->current_msg != NULL) { + conn->current_msg->err = err; + } + if ((conn->type == NETCONN_TCP) && (err == ERR_OK)) { + setup_tcp(conn); + } + was_blocking = !IN_NONBLOCKING_CONNECT(conn); + SET_NONBLOCKING_CONNECT(conn, 0); + conn->current_msg = NULL; + conn->state = NETCONN_NONE; + if (!was_blocking) { + NETCONN_SET_SAFE_ERR(conn, ERR_OK); + } + API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0); + + if (was_blocking) { + sys_sem_signal(&conn->op_completed); + } + return ERR_OK; +} +#endif /* LWIP_TCP */ + +/** + * Connect a pcb contained inside a netconn + * Called from netconn_connect. + * + * @param msg the api_msg_msg pointing to the connection and containing + * the IP address and port to connect to + */ +void +do_connect(struct api_msg_msg *msg) +{ + if (msg->conn->pcb.tcp == NULL) { + /* This may happen when calling netconn_connect() a second time */ + msg->err = ERR_CLSD; + } else { + switch (NETCONNTYPE_GROUP(msg->conn->type)) { +#if LWIP_RAW + case NETCONN_RAW: + msg->err = raw_connect(msg->conn->pcb.raw, msg->msg.bc.ipaddr); + break; +#endif /* LWIP_RAW */ +#if LWIP_UDP + case NETCONN_UDP: + msg->err = udp_connect(msg->conn->pcb.udp, msg->msg.bc.ipaddr, msg->msg.bc.port); + break; +#endif /* LWIP_UDP */ +#if LWIP_TCP + case NETCONN_TCP: + /* Prevent connect while doing any other action. */ + if (msg->conn->state != NETCONN_NONE) { + msg->err = ERR_ISCONN; + } else { + setup_tcp(msg->conn); + msg->err = tcp_connect(msg->conn->pcb.tcp, msg->msg.bc.ipaddr, + msg->msg.bc.port, do_connected); + if (msg->err == ERR_OK) { + u8_t non_blocking = netconn_is_nonblocking(msg->conn); + msg->conn->state = NETCONN_CONNECT; + SET_NONBLOCKING_CONNECT(msg->conn, non_blocking); + if (non_blocking) { + msg->err = ERR_INPROGRESS; + } else { + msg->conn->current_msg = msg; + /* sys_sem_signal() is called from do_connected (or err_tcp()), + * when the connection is established! */ + return; + } + } + } + break; +#endif /* LWIP_TCP */ + default: + LWIP_ERROR("Invalid netconn type", 0, do{ msg->err = ERR_VAL; }while(0)); + break; + } + } + sys_sem_signal(&msg->conn->op_completed); +} + +/** + * Connect a pcb contained inside a netconn + * Only used for UDP netconns. + * Called from netconn_disconnect. + * + * @param msg the api_msg_msg pointing to the connection to disconnect + */ +void +do_disconnect(struct api_msg_msg *msg) +{ +#if LWIP_UDP + if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) { + udp_disconnect(msg->conn->pcb.udp); + msg->err = ERR_OK; + } else +#endif /* LWIP_UDP */ + { + msg->err = ERR_VAL; + } + TCPIP_APIMSG_ACK(msg); +} + +#if LWIP_TCP +/** + * Set a TCP pcb contained in a netconn into listen mode + * Called from netconn_listen. + * + * @param msg the api_msg_msg pointing to the connection + */ +void +do_listen(struct api_msg_msg *msg) +{ + if (ERR_IS_FATAL(msg->conn->last_err)) { + msg->err = msg->conn->last_err; + } else { + msg->err = ERR_CONN; + if (msg->conn->pcb.tcp != NULL) { + if (msg->conn->type == NETCONN_TCP) { + if (msg->conn->state == NETCONN_NONE) { +#if TCP_LISTEN_BACKLOG + struct tcp_pcb* lpcb = tcp_listen_with_backlog(msg->conn->pcb.tcp, msg->msg.lb.backlog); +#else /* TCP_LISTEN_BACKLOG */ + struct tcp_pcb* lpcb = tcp_listen(msg->conn->pcb.tcp); +#endif /* TCP_LISTEN_BACKLOG */ + if (lpcb == NULL) { + /* in this case, the old pcb is still allocated */ + msg->err = ERR_MEM; + } else { + /* delete the recvmbox and allocate the acceptmbox */ + if (sys_mbox_valid(&msg->conn->recvmbox)) { + /** @todo: should we drain the recvmbox here? */ + sys_mbox_free(&msg->conn->recvmbox); + sys_mbox_set_invalid(&msg->conn->recvmbox); + } + msg->err = ERR_OK; + if (!sys_mbox_valid(&msg->conn->acceptmbox)) { + msg->err = sys_mbox_new(&msg->conn->acceptmbox, DEFAULT_ACCEPTMBOX_SIZE); + } + if (msg->err == ERR_OK) { + msg->conn->state = NETCONN_LISTEN; + msg->conn->pcb.tcp = lpcb; + tcp_arg(msg->conn->pcb.tcp, msg->conn); + tcp_accept(msg->conn->pcb.tcp, accept_function); + } else { + /* since the old pcb is already deallocated, free lpcb now */ + tcp_close(lpcb); + msg->conn->pcb.tcp = NULL; + } + } + } + } else { + msg->err = ERR_ARG; + } + } + } + TCPIP_APIMSG_ACK(msg); +} +#endif /* LWIP_TCP */ + +/** + * Send some data on a RAW or UDP pcb contained in a netconn + * Called from netconn_send + * + * @param msg the api_msg_msg pointing to the connection + */ +void +do_send(struct api_msg_msg *msg) +{ + if (ERR_IS_FATAL(msg->conn->last_err)) { + msg->err = msg->conn->last_err; + } else { + msg->err = ERR_CONN; + if (msg->conn->pcb.tcp != NULL) { + switch (NETCONNTYPE_GROUP(msg->conn->type)) { +#if LWIP_RAW + case NETCONN_RAW: + if (ip_addr_isany(&msg->msg.b->addr)) { + msg->err = raw_send(msg->conn->pcb.raw, msg->msg.b->p); + } else { + msg->err = raw_sendto(msg->conn->pcb.raw, msg->msg.b->p, &msg->msg.b->addr); + } + break; +#endif +#if LWIP_UDP + case NETCONN_UDP: +#if LWIP_CHECKSUM_ON_COPY + if (ip_addr_isany(&msg->msg.b->addr)) { + msg->err = udp_send_chksum(msg->conn->pcb.udp, msg->msg.b->p, + msg->msg.b->flags & NETBUF_FLAG_CHKSUM, msg->msg.b->toport_chksum); + } else { + msg->err = udp_sendto_chksum(msg->conn->pcb.udp, msg->msg.b->p, + &msg->msg.b->addr, msg->msg.b->port, + msg->msg.b->flags & NETBUF_FLAG_CHKSUM, msg->msg.b->toport_chksum); + } +#else /* LWIP_CHECKSUM_ON_COPY */ + if (ip_addr_isany(&msg->msg.b->addr)) { + msg->err = udp_send(msg->conn->pcb.udp, msg->msg.b->p); + } else { + msg->err = udp_sendto(msg->conn->pcb.udp, msg->msg.b->p, &msg->msg.b->addr, msg->msg.b->port); + } +#endif /* LWIP_CHECKSUM_ON_COPY */ + break; +#endif /* LWIP_UDP */ + default: + break; + } + } + } + TCPIP_APIMSG_ACK(msg); +} + +#if LWIP_TCP +/** + * Indicate data has been received from a TCP pcb contained in a netconn + * Called from netconn_recv + * + * @param msg the api_msg_msg pointing to the connection + */ +void +do_recv(struct api_msg_msg *msg) +{ + msg->err = ERR_OK; + if (msg->conn->pcb.tcp != NULL) { + if (msg->conn->type == NETCONN_TCP) { +#if TCP_LISTEN_BACKLOG + if (msg->conn->pcb.tcp->state == LISTEN) { + tcp_accepted(msg->conn->pcb.tcp); + } else +#endif /* TCP_LISTEN_BACKLOG */ + { + u32_t remaining = msg->msg.r.len; + do { + u16_t recved = (remaining > 0xffff) ? 0xffff : (u16_t)remaining; + tcp_recved(msg->conn->pcb.tcp, recved); + remaining -= recved; + }while(remaining != 0); + } + } + } + TCPIP_APIMSG_ACK(msg); +} + +/** + * See if more data needs to be written from a previous call to netconn_write. + * Called initially from do_write. If the first call can't send all data + * (because of low memory or empty send-buffer), this function is called again + * from sent_tcp() or poll_tcp() to send more data. If all data is sent, the + * blocking application thread (waiting in netconn_write) is released. + * + * @param conn netconn (that is currently in state NETCONN_WRITE) to process + * @return ERR_OK + * ERR_MEM if LWIP_TCPIP_CORE_LOCKING=1 and sending hasn't yet finished + */ +static err_t +do_writemore(struct netconn *conn) +{ + err_t err; + void *dataptr; + u16_t len, available; + u8_t write_finished = 0; + size_t diff; + u8_t dontblock = netconn_is_nonblocking(conn) || + (conn->current_msg->msg.w.apiflags & NETCONN_DONTBLOCK); + u8_t apiflags = conn->current_msg->msg.w.apiflags; + + LWIP_ASSERT("conn != NULL", conn != NULL); + LWIP_ASSERT("conn->state == NETCONN_WRITE", (conn->state == NETCONN_WRITE)); + LWIP_ASSERT("conn->current_msg != NULL", conn->current_msg != NULL); + LWIP_ASSERT("conn->pcb.tcp != NULL", conn->pcb.tcp != NULL); + LWIP_ASSERT("conn->write_offset < conn->current_msg->msg.w.len", + conn->write_offset < conn->current_msg->msg.w.len); + +#if LWIP_SO_SNDTIMEO + if ((conn->send_timeout != 0) && + ((s32_t)(sys_now() - conn->current_msg->msg.w.time_started) >= conn->send_timeout)) { + write_finished = 1; + if (conn->write_offset == 0) { + /* nothing has been written */ + err = ERR_WOULDBLOCK; + conn->current_msg->msg.w.len = 0; + } else { + /* partial write */ + err = ERR_OK; + conn->current_msg->msg.w.len = conn->write_offset; + } + } else +#endif /* LWIP_SO_SNDTIMEO */ + { + dataptr = (u8_t*)conn->current_msg->msg.w.dataptr + conn->write_offset; + diff = conn->current_msg->msg.w.len - conn->write_offset; + if (diff > 0xffffUL) { /* max_u16_t */ + len = 0xffff; +#if LWIP_TCPIP_CORE_LOCKING + conn->flags |= NETCONN_FLAG_WRITE_DELAYED; +#endif + apiflags |= TCP_WRITE_FLAG_MORE; + } else { + len = (u16_t)diff; + } + available = tcp_sndbuf(conn->pcb.tcp); + if (available < len) { + /* don't try to write more than sendbuf */ + len = available; + if (dontblock){ + if (!len) { + err = ERR_WOULDBLOCK; + goto err_mem; + } + } else { +#if LWIP_TCPIP_CORE_LOCKING + conn->flags |= NETCONN_FLAG_WRITE_DELAYED; +#endif + apiflags |= TCP_WRITE_FLAG_MORE; + } + } + LWIP_ASSERT("do_writemore: invalid length!", ((conn->write_offset + len) <= conn->current_msg->msg.w.len)); + err = tcp_write(conn->pcb.tcp, dataptr, len, apiflags); + /* if OK or memory error, check available space */ + if ((err == ERR_OK) || (err == ERR_MEM)) { +err_mem: + if (dontblock && (len < conn->current_msg->msg.w.len)) { + /* non-blocking write did not write everything: mark the pcb non-writable + and let poll_tcp check writable space to mark the pcb writable again */ + API_EVENT(conn, NETCONN_EVT_SENDMINUS, len); + conn->flags |= NETCONN_FLAG_CHECK_WRITESPACE; + } else if ((tcp_sndbuf(conn->pcb.tcp) <= TCP_SNDLOWAT) || + (tcp_sndqueuelen(conn->pcb.tcp) >= TCP_SNDQUEUELOWAT)) { + /* The queued byte- or pbuf-count exceeds the configured low-water limit, + let select mark this pcb as non-writable. */ + API_EVENT(conn, NETCONN_EVT_SENDMINUS, len); + } + } + + if (err == ERR_OK) { + conn->write_offset += len; + if ((conn->write_offset == conn->current_msg->msg.w.len) || dontblock) { + /* return sent length */ + conn->current_msg->msg.w.len = conn->write_offset; + /* everything was written */ + write_finished = 1; + conn->write_offset = 0; + } + tcp_output(conn->pcb.tcp); + } else if ((err == ERR_MEM) && !dontblock) { + /* If ERR_MEM, we wait for sent_tcp or poll_tcp to be called + we do NOT return to the application thread, since ERR_MEM is + only a temporary error! */ + + /* tcp_write returned ERR_MEM, try tcp_output anyway */ + tcp_output(conn->pcb.tcp); + +#if LWIP_TCPIP_CORE_LOCKING + conn->flags |= NETCONN_FLAG_WRITE_DELAYED; +#endif + } else { + /* On errors != ERR_MEM, we don't try writing any more but return + the error to the application thread. */ + write_finished = 1; + conn->current_msg->msg.w.len = 0; + } + } + if (write_finished) { + /* everything was written: set back connection state + and back to application task */ + conn->current_msg->err = err; + conn->current_msg = NULL; + conn->state = NETCONN_NONE; +#if LWIP_TCPIP_CORE_LOCKING + if ((conn->flags & NETCONN_FLAG_WRITE_DELAYED) != 0) +#endif + { + sys_sem_signal(&conn->op_completed); + } + } +#if LWIP_TCPIP_CORE_LOCKING + else + return ERR_MEM; +#endif + return ERR_OK; +} +#endif /* LWIP_TCP */ + +/** + * Send some data on a TCP pcb contained in a netconn + * Called from netconn_write + * + * @param msg the api_msg_msg pointing to the connection + */ +void +do_write(struct api_msg_msg *msg) +{ + if (ERR_IS_FATAL(msg->conn->last_err)) { + msg->err = msg->conn->last_err; + } else { + if (msg->conn->type == NETCONN_TCP) { +#if LWIP_TCP + if (msg->conn->state != NETCONN_NONE) { + /* netconn is connecting, closing or in blocking write */ + msg->err = ERR_INPROGRESS; + } else if (msg->conn->pcb.tcp != NULL) { + msg->conn->state = NETCONN_WRITE; + /* set all the variables used by do_writemore */ + LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL && + msg->conn->write_offset == 0); + LWIP_ASSERT("msg->msg.w.len != 0", msg->msg.w.len != 0); + msg->conn->current_msg = msg; + msg->conn->write_offset = 0; +#if LWIP_TCPIP_CORE_LOCKING + msg->conn->flags &= ~NETCONN_FLAG_WRITE_DELAYED; + if (do_writemore(msg->conn) != ERR_OK) { + LWIP_ASSERT("state!", msg->conn->state == NETCONN_WRITE); + UNLOCK_TCPIP_CORE(); + sys_arch_sem_wait(&msg->conn->op_completed, 0); + LOCK_TCPIP_CORE(); + LWIP_ASSERT("state!", msg->conn->state == NETCONN_NONE); + } +#else /* LWIP_TCPIP_CORE_LOCKING */ + do_writemore(msg->conn); +#endif /* LWIP_TCPIP_CORE_LOCKING */ + /* for both cases: if do_writemore was called, don't ACK the APIMSG + since do_writemore ACKs it! */ + return; + } else { + msg->err = ERR_CONN; + } +#else /* LWIP_TCP */ + msg->err = ERR_VAL; +#endif /* LWIP_TCP */ +#if (LWIP_UDP || LWIP_RAW) + } else { + msg->err = ERR_VAL; +#endif /* (LWIP_UDP || LWIP_RAW) */ + } + } + TCPIP_APIMSG_ACK(msg); +} + +/** + * Return a connection's local or remote address + * Called from netconn_getaddr + * + * @param msg the api_msg_msg pointing to the connection + */ +void +do_getaddr(struct api_msg_msg *msg) +{ + if (msg->conn->pcb.ip != NULL) { + *(msg->msg.ad.ipaddr) = (msg->msg.ad.local ? msg->conn->pcb.ip->local_ip : + msg->conn->pcb.ip->remote_ip); + + msg->err = ERR_OK; + switch (NETCONNTYPE_GROUP(msg->conn->type)) { +#if LWIP_RAW + case NETCONN_RAW: + if (msg->msg.ad.local) { + *(msg->msg.ad.port) = msg->conn->pcb.raw->protocol; + } else { + /* return an error as connecting is only a helper for upper layers */ + msg->err = ERR_CONN; + } + break; +#endif /* LWIP_RAW */ +#if LWIP_UDP + case NETCONN_UDP: + if (msg->msg.ad.local) { + *(msg->msg.ad.port) = msg->conn->pcb.udp->local_port; + } else { + if ((msg->conn->pcb.udp->flags & UDP_FLAGS_CONNECTED) == 0) { + msg->err = ERR_CONN; + } else { + *(msg->msg.ad.port) = msg->conn->pcb.udp->remote_port; + } + } + break; +#endif /* LWIP_UDP */ +#if LWIP_TCP + case NETCONN_TCP: + *(msg->msg.ad.port) = (msg->msg.ad.local?msg->conn->pcb.tcp->local_port:msg->conn->pcb.tcp->remote_port); + break; +#endif /* LWIP_TCP */ + default: + LWIP_ASSERT("invalid netconn_type", 0); + break; + } + } else { + msg->err = ERR_CONN; + } + TCPIP_APIMSG_ACK(msg); +} + +/** + * Close a TCP pcb contained in a netconn + * Called from netconn_close + * + * @param msg the api_msg_msg pointing to the connection + */ +void +do_close(struct api_msg_msg *msg) +{ +#if LWIP_TCP + /* @todo: abort running write/connect? */ + if ((msg->conn->state != NETCONN_NONE) && (msg->conn->state != NETCONN_LISTEN)) { + /* this only happens for TCP netconns */ + LWIP_ASSERT("msg->conn->type == NETCONN_TCP", msg->conn->type == NETCONN_TCP); + msg->err = ERR_INPROGRESS; + } else if ((msg->conn->pcb.tcp != NULL) && (msg->conn->type == NETCONN_TCP)) { + if ((msg->msg.sd.shut != NETCONN_SHUT_RDWR) && (msg->conn->state == NETCONN_LISTEN)) { + /* LISTEN doesn't support half shutdown */ + msg->err = ERR_CONN; + } else { + if (msg->msg.sd.shut & NETCONN_SHUT_RD) { + /* Drain and delete mboxes */ + netconn_drain(msg->conn); + } + LWIP_ASSERT("already writing or closing", msg->conn->current_msg == NULL && + msg->conn->write_offset == 0); + msg->conn->state = NETCONN_CLOSE; + msg->conn->current_msg = msg; + do_close_internal(msg->conn); + /* for tcp netconns, do_close_internal ACKs the message */ + return; + } + } else +#endif /* LWIP_TCP */ + { + msg->err = ERR_VAL; + } + sys_sem_signal(&msg->conn->op_completed); +} + +#if LWIP_IGMP +/** + * Join multicast groups for UDP netconns. + * Called from netconn_join_leave_group + * + * @param msg the api_msg_msg pointing to the connection + */ +void +do_join_leave_group(struct api_msg_msg *msg) +{ + if (ERR_IS_FATAL(msg->conn->last_err)) { + msg->err = msg->conn->last_err; + } else { + if (msg->conn->pcb.tcp != NULL) { + if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) { +#if LWIP_UDP + if (msg->msg.jl.join_or_leave == NETCONN_JOIN) { + msg->err = igmp_joingroup(msg->msg.jl.netif_addr, msg->msg.jl.multiaddr); + } else { + msg->err = igmp_leavegroup(msg->msg.jl.netif_addr, msg->msg.jl.multiaddr); + } +#endif /* LWIP_UDP */ +#if (LWIP_TCP || LWIP_RAW) + } else { + msg->err = ERR_VAL; +#endif /* (LWIP_TCP || LWIP_RAW) */ + } + } else { + msg->err = ERR_CONN; + } + } + TCPIP_APIMSG_ACK(msg); +} +#endif /* LWIP_IGMP */ + +#if LWIP_DNS +/** + * Callback function that is called when DNS name is resolved + * (or on timeout). A waiting application thread is waked up by + * signaling the semaphore. + */ +static void +do_dns_found(const char *name, ip_addr_t *ipaddr, void *arg) +{ + struct dns_api_msg *msg = (struct dns_api_msg*)arg; + + LWIP_ASSERT("DNS response for wrong host name", strcmp(msg->name, name) == 0); + LWIP_UNUSED_ARG(name); + + if (ipaddr == NULL) { + /* timeout or memory error */ + *msg->err = ERR_VAL; + } else { + /* address was resolved */ + *msg->err = ERR_OK; + *msg->addr = *ipaddr; + } + /* wake up the application task waiting in netconn_gethostbyname */ + sys_sem_signal(msg->sem); +} + +/** + * Execute a DNS query + * Called from netconn_gethostbyname + * + * @param arg the dns_api_msg pointing to the query + */ +void +do_gethostbyname(void *arg) +{ + struct dns_api_msg *msg = (struct dns_api_msg*)arg; + + *msg->err = dns_gethostbyname(msg->name, msg->addr, do_dns_found, msg); + if (*msg->err != ERR_INPROGRESS) { + /* on error or immediate success, wake up the application + * task waiting in netconn_gethostbyname */ + sys_sem_signal(msg->sem); + } +} +#endif /* LWIP_DNS */ + +#endif /* LWIP_NETCONN */ diff --git a/third_party/lwip-1.4.1/src/api/err.c b/third_party/lwip-1.4.1/src/api/err.c new file mode 100644 index 0000000..7c5d94c --- /dev/null +++ b/third_party/lwip-1.4.1/src/api/err.c @@ -0,0 +1,75 @@ +/** + * @file + * Error Management module + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/err.h" + +#ifdef LWIP_DEBUG + +static const char *err_strerr[] = { + "Ok.", /* ERR_OK 0 */ + "Out of memory error.", /* ERR_MEM -1 */ + "Buffer error.", /* ERR_BUF -2 */ + "Timeout.", /* ERR_TIMEOUT -3 */ + "Routing problem.", /* ERR_RTE -4 */ + "Operation in progress.", /* ERR_INPROGRESS -5 */ + "Illegal value.", /* ERR_VAL -6 */ + "Operation would block.", /* ERR_WOULDBLOCK -7 */ + "Address in use.", /* ERR_USE -8 */ + "Already connected.", /* ERR_ISCONN -9 */ + "Connection aborted.", /* ERR_ABRT -10 */ + "Connection reset.", /* ERR_RST -11 */ + "Connection closed.", /* ERR_CLSD -12 */ + "Not connected.", /* ERR_CONN -13 */ + "Illegal argument.", /* ERR_ARG -14 */ + "Low-level netif error.", /* ERR_IF -15 */ +}; + +/** + * Convert an lwip internal error to a string representation. + * + * @param err an lwip internal err_t + * @return a string representation for err + */ +const char * +lwip_strerr(err_t err) +{ + return err_strerr[-err]; + +} + +#endif /* LWIP_DEBUG */ diff --git a/third_party/lwip-1.4.1/src/api/netbuf.c b/third_party/lwip-1.4.1/src/api/netbuf.c new file mode 100644 index 0000000..cbeef97 --- /dev/null +++ b/third_party/lwip-1.4.1/src/api/netbuf.c @@ -0,0 +1,245 @@ +/** + * @file + * Network buffer management + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/netbuf.h" +#include "lwip/memp.h" + +#include + +/** + * Create (allocate) and initialize a new netbuf. + * The netbuf doesn't yet contain a packet buffer! + * + * @return a pointer to a new netbuf + * NULL on lack of memory + */ +struct +netbuf *netbuf_new(void) +{ + struct netbuf *buf; + + buf = (struct netbuf *)memp_malloc(MEMP_NETBUF); + if (buf != NULL) { + buf->p = NULL; + buf->ptr = NULL; + ip_addr_set_any(&buf->addr); + buf->port = 0; +#if LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY +#if LWIP_CHECKSUM_ON_COPY + buf->flags = 0; +#endif /* LWIP_CHECKSUM_ON_COPY */ + buf->toport_chksum = 0; +#if LWIP_NETBUF_RECVINFO + ip_addr_set_any(&buf->toaddr); +#endif /* LWIP_NETBUF_RECVINFO */ +#endif /* LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY */ + return buf; + } else { + return NULL; + } +} + +/** + * Deallocate a netbuf allocated by netbuf_new(). + * + * @param buf pointer to a netbuf allocated by netbuf_new() + */ +void +netbuf_delete(struct netbuf *buf) +{ + if (buf != NULL) { + if (buf->p != NULL) { + pbuf_free(buf->p); + buf->p = buf->ptr = NULL; + } + memp_free(MEMP_NETBUF, buf); + } +} + +/** + * Allocate memory for a packet buffer for a given netbuf. + * + * @param buf the netbuf for which to allocate a packet buffer + * @param size the size of the packet buffer to allocate + * @return pointer to the allocated memory + * NULL if no memory could be allocated + */ +void * +netbuf_alloc(struct netbuf *buf, u16_t size) +{ + LWIP_ERROR("netbuf_alloc: invalid buf", (buf != NULL), return NULL;); + + /* Deallocate any previously allocated memory. */ + if (buf->p != NULL) { + pbuf_free(buf->p); + } + buf->p = pbuf_alloc(PBUF_TRANSPORT, size, PBUF_RAM); + if (buf->p == NULL) { + return NULL; + } + LWIP_ASSERT("check that first pbuf can hold size", + (buf->p->len >= size)); + buf->ptr = buf->p; + return buf->p->payload; +} + +/** + * Free the packet buffer included in a netbuf + * + * @param buf pointer to the netbuf which contains the packet buffer to free + */ +void +netbuf_free(struct netbuf *buf) +{ + LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return;); + if (buf->p != NULL) { + pbuf_free(buf->p); + } + buf->p = buf->ptr = NULL; +} + +/** + * Let a netbuf reference existing (non-volatile) data. + * + * @param buf netbuf which should reference the data + * @param dataptr pointer to the data to reference + * @param size size of the data + * @return ERR_OK if data is referenced + * ERR_MEM if data couldn't be referenced due to lack of memory + */ +err_t +netbuf_ref(struct netbuf *buf, const void *dataptr, u16_t size) +{ + LWIP_ERROR("netbuf_ref: invalid buf", (buf != NULL), return ERR_ARG;); + if (buf->p != NULL) { + pbuf_free(buf->p); + } + buf->p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF); + if (buf->p == NULL) { + buf->ptr = NULL; + return ERR_MEM; + } + buf->p->payload = (void*)dataptr; + buf->p->len = buf->p->tot_len = size; + buf->ptr = buf->p; + return ERR_OK; +} + +/** + * Chain one netbuf to another (@see pbuf_chain) + * + * @param head the first netbuf + * @param tail netbuf to chain after head, freed by this function, may not be reference after returning + */ +void +netbuf_chain(struct netbuf *head, struct netbuf *tail) +{ + LWIP_ERROR("netbuf_ref: invalid head", (head != NULL), return;); + LWIP_ERROR("netbuf_chain: invalid tail", (tail != NULL), return;); + pbuf_cat(head->p, tail->p); + head->ptr = head->p; + memp_free(MEMP_NETBUF, tail); +} + +/** + * Get the data pointer and length of the data inside a netbuf. + * + * @param buf netbuf to get the data from + * @param dataptr pointer to a void pointer where to store the data pointer + * @param len pointer to an u16_t where the length of the data is stored + * @return ERR_OK if the information was retreived, + * ERR_BUF on error. + */ +err_t +netbuf_data(struct netbuf *buf, void **dataptr, u16_t *len) +{ + LWIP_ERROR("netbuf_data: invalid buf", (buf != NULL), return ERR_ARG;); + LWIP_ERROR("netbuf_data: invalid dataptr", (dataptr != NULL), return ERR_ARG;); + LWIP_ERROR("netbuf_data: invalid len", (len != NULL), return ERR_ARG;); + + if (buf->ptr == NULL) { + return ERR_BUF; + } + *dataptr = buf->ptr->payload; + *len = buf->ptr->len; + return ERR_OK; +} + +/** + * Move the current data pointer of a packet buffer contained in a netbuf + * to the next part. + * The packet buffer itself is not modified. + * + * @param buf the netbuf to modify + * @return -1 if there is no next part + * 1 if moved to the next part but now there is no next part + * 0 if moved to the next part and there are still more parts + */ +s8_t +netbuf_next(struct netbuf *buf) +{ + LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return -1;); + if (buf->ptr->next == NULL) { + return -1; + } + buf->ptr = buf->ptr->next; + if (buf->ptr->next == NULL) { + return 1; + } + return 0; +} + +/** + * Move the current data pointer of a packet buffer contained in a netbuf + * to the beginning of the packet. + * The packet buffer itself is not modified. + * + * @param buf the netbuf to modify + */ +void +netbuf_first(struct netbuf *buf) +{ + LWIP_ERROR("netbuf_free: invalid buf", (buf != NULL), return;); + buf->ptr = buf->p; +} + +#endif /* LWIP_NETCONN */ diff --git a/third_party/lwip-1.4.1/src/api/netdb.c b/third_party/lwip-1.4.1/src/api/netdb.c new file mode 100644 index 0000000..8f60c87 --- /dev/null +++ b/third_party/lwip-1.4.1/src/api/netdb.c @@ -0,0 +1,353 @@ +/** + * @file + * API functions for name resolving + * + */ + +/* + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#include "lwip/netdb.h" + +#if LWIP_DNS && LWIP_SOCKET + +#include "lwip/err.h" +#include "lwip/mem.h" +#include "lwip/memp.h" +#include "lwip/ip_addr.h" +#include "lwip/api.h" +#include "lwip/dns.h" + +#include +#include + +/** helper struct for gethostbyname_r to access the char* buffer */ +struct gethostbyname_r_helper { + ip_addr_t *addr_list[2]; + ip_addr_t addr; + char *aliases; +}; + +/** h_errno is exported in netdb.h for access by applications. */ +#if LWIP_DNS_API_DECLARE_H_ERRNO +int h_errno; +#endif /* LWIP_DNS_API_DECLARE_H_ERRNO */ + +/** define "hostent" variables storage: 0 if we use a static (but unprotected) + * set of variables for lwip_gethostbyname, 1 if we use a local storage */ +#ifndef LWIP_DNS_API_HOSTENT_STORAGE +#define LWIP_DNS_API_HOSTENT_STORAGE 0 +#endif + +/** define "hostent" variables storage */ +#if LWIP_DNS_API_HOSTENT_STORAGE +#define HOSTENT_STORAGE +#else +#define HOSTENT_STORAGE static +#endif /* LWIP_DNS_API_STATIC_HOSTENT */ + +/** + * Returns an entry containing addresses of address family AF_INET + * for the host with name name. + * Due to dns_gethostbyname limitations, only one address is returned. + * + * @param name the hostname to resolve + * @return an entry containing addresses of address family AF_INET + * for the host with name name + */ +struct hostent* +lwip_gethostbyname(const char *name) +{ + err_t err; + ip_addr_t addr; + + /* buffer variables for lwip_gethostbyname() */ + HOSTENT_STORAGE struct hostent s_hostent; + HOSTENT_STORAGE char *s_aliases; + HOSTENT_STORAGE ip_addr_t s_hostent_addr; + HOSTENT_STORAGE ip_addr_t *s_phostent_addr[2]; + + /* query host IP address */ + err = netconn_gethostbyname(name, &addr); + if (err != ERR_OK) { + LWIP_DEBUGF(DNS_DEBUG, ("lwip_gethostbyname(%s) failed, err=%d\n", name, err)); + h_errno = HOST_NOT_FOUND; + return NULL; + } + + /* fill hostent */ + s_hostent_addr = addr; + s_phostent_addr[0] = &s_hostent_addr; + s_phostent_addr[1] = NULL; + s_hostent.h_name = (char*)name; + s_hostent.h_aliases = &s_aliases; + s_hostent.h_addrtype = AF_INET; + s_hostent.h_length = sizeof(ip_addr_t); + s_hostent.h_addr_list = (char**)&s_phostent_addr; + +#if DNS_DEBUG + /* dump hostent */ + LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_name == %s\n", s_hostent.h_name)); + LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_aliases == %p\n", s_hostent.h_aliases)); + if (s_hostent.h_aliases != NULL) { + u8_t idx; + for ( idx=0; s_hostent.h_aliases[idx]; idx++) { + LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_aliases[%i]-> == %p\n", idx, s_hostent.h_aliases[idx])); + LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_aliases[%i]-> == %s\n", idx, s_hostent.h_aliases[idx])); + } + } + LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addrtype == %d\n", s_hostent.h_addrtype)); + LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_length == %d\n", s_hostent.h_length)); + LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list == %p\n", s_hostent.h_addr_list)); + if (s_hostent.h_addr_list != NULL) { + u8_t idx; + for ( idx=0; s_hostent.h_addr_list[idx]; idx++) { + LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list[%i] == %p\n", idx, s_hostent.h_addr_list[idx])); + LWIP_DEBUGF(DNS_DEBUG, ("hostent.h_addr_list[%i]-> == %s\n", idx, ip_ntoa((ip_addr_t*)s_hostent.h_addr_list[idx]))); + } + } +#endif /* DNS_DEBUG */ + +#if LWIP_DNS_API_HOSTENT_STORAGE + /* this function should return the "per-thread" hostent after copy from s_hostent */ + return sys_thread_hostent(&s_hostent); +#else + return &s_hostent; +#endif /* LWIP_DNS_API_HOSTENT_STORAGE */ +} + +/** + * Thread-safe variant of lwip_gethostbyname: instead of using a static + * buffer, this function takes buffer and errno pointers as arguments + * and uses these for the result. + * + * @param name the hostname to resolve + * @param ret pre-allocated struct where to store the result + * @param buf pre-allocated buffer where to store additional data + * @param buflen the size of buf + * @param result pointer to a hostent pointer that is set to ret on success + * and set to zero on error + * @param h_errnop pointer to an int where to store errors (instead of modifying + * the global h_errno) + * @return 0 on success, non-zero on error, additional error information + * is stored in *h_errnop instead of h_errno to be thread-safe + */ +int +lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, + size_t buflen, struct hostent **result, int *h_errnop) +{ + err_t err; + struct gethostbyname_r_helper *h; + char *hostname; + size_t namelen; + int lh_errno; + + if (h_errnop == NULL) { + /* ensure h_errnop is never NULL */ + h_errnop = &lh_errno; + } + + if (result == NULL) { + /* not all arguments given */ + *h_errnop = EINVAL; + return -1; + } + /* first thing to do: set *result to nothing */ + *result = NULL; + if ((name == NULL) || (ret == NULL) || (buf == NULL)) { + /* not all arguments given */ + *h_errnop = EINVAL; + return -1; + } + + namelen = strlen(name); + if (buflen < (sizeof(struct gethostbyname_r_helper) + namelen + 1 + (MEM_ALIGNMENT - 1))) { + /* buf can't hold the data needed + a copy of name */ + *h_errnop = ERANGE; + return -1; + } + + h = (struct gethostbyname_r_helper*)LWIP_MEM_ALIGN(buf); + hostname = ((char*)h) + sizeof(struct gethostbyname_r_helper); + + /* query host IP address */ + err = netconn_gethostbyname(name, &h->addr); + if (err != ERR_OK) { + LWIP_DEBUGF(DNS_DEBUG, ("lwip_gethostbyname(%s) failed, err=%d\n", name, err)); + *h_errnop = HOST_NOT_FOUND; + return -1; + } + + /* copy the hostname into buf */ + MEMCPY(hostname, name, namelen); + hostname[namelen] = 0; + + /* fill hostent */ + h->addr_list[0] = &h->addr; + h->addr_list[1] = NULL; + h->aliases = NULL; + ret->h_name = hostname; + ret->h_aliases = &h->aliases; + ret->h_addrtype = AF_INET; + ret->h_length = sizeof(ip_addr_t); + ret->h_addr_list = (char**)&h->addr_list; + + /* set result != NULL */ + *result = ret; + + /* return success */ + return 0; +} + +/** + * Frees one or more addrinfo structures returned by getaddrinfo(), along with + * any additional storage associated with those structures. If the ai_next field + * of the structure is not null, the entire list of structures is freed. + * + * @param ai struct addrinfo to free + */ +void +lwip_freeaddrinfo(struct addrinfo *ai) +{ + struct addrinfo *next; + + while (ai != NULL) { + next = ai->ai_next; + memp_free(MEMP_NETDB, ai); + ai = next; + } +} + +/** + * Translates the name of a service location (for example, a host name) and/or + * a service name and returns a set of socket addresses and associated + * information to be used in creating a socket with which to address the + * specified service. + * Memory for the result is allocated internally and must be freed by calling + * lwip_freeaddrinfo()! + * + * Due to a limitation in dns_gethostbyname, only the first address of a + * host is returned. + * Also, service names are not supported (only port numbers)! + * + * @param nodename descriptive name or address string of the host + * (may be NULL -> local address) + * @param servname port number as string of NULL + * @param hints structure containing input values that set socktype and protocol + * @param res pointer to a pointer where to store the result (set to NULL on failure) + * @return 0 on success, non-zero on failure + */ +int +lwip_getaddrinfo(const char *nodename, const char *servname, + const struct addrinfo *hints, struct addrinfo **res) +{ + err_t err; + ip_addr_t addr; + struct addrinfo *ai; + struct sockaddr_in *sa = NULL; + int port_nr = 0; + size_t total_size; + size_t namelen = 0; + + if (res == NULL) { + return EAI_FAIL; + } + *res = NULL; + if ((nodename == NULL) && (servname == NULL)) { + return EAI_NONAME; + } + + if (servname != NULL) { + /* service name specified: convert to port number + * @todo?: currently, only ASCII integers (port numbers) are supported! */ + port_nr = atoi(servname); + if ((port_nr <= 0) || (port_nr > 0xffff)) { + return EAI_SERVICE; + } + } + + if (nodename != NULL) { + /* service location specified, try to resolve */ + err = netconn_gethostbyname(nodename, &addr); + if (err != ERR_OK) { + return EAI_FAIL; + } + } else { + /* service location specified, use loopback address */ + ip_addr_set_loopback(&addr); + } + + total_size = sizeof(struct addrinfo) + sizeof(struct sockaddr_in); + if (nodename != NULL) { + namelen = strlen(nodename); + LWIP_ASSERT("namelen is too long", (namelen + 1) <= (mem_size_t)-1); + total_size += namelen + 1; + } + /* If this fails, please report to lwip-devel! :-) */ + LWIP_ASSERT("total_size <= NETDB_ELEM_SIZE: please report this!", + total_size <= NETDB_ELEM_SIZE); + ai = (struct addrinfo *)memp_malloc(MEMP_NETDB); + if (ai == NULL) { + goto memerr; + } + memset(ai, 0, total_size); + sa = (struct sockaddr_in*)((u8_t*)ai + sizeof(struct addrinfo)); + /* set up sockaddr */ + inet_addr_from_ipaddr(&sa->sin_addr, &addr); + sa->sin_family = AF_INET; + sa->sin_len = sizeof(struct sockaddr_in); + sa->sin_port = htons((u16_t)port_nr); + + /* set up addrinfo */ + ai->ai_family = AF_INET; + if (hints != NULL) { + /* copy socktype & protocol from hints if specified */ + ai->ai_socktype = hints->ai_socktype; + ai->ai_protocol = hints->ai_protocol; + } + if (nodename != NULL) { + /* copy nodename to canonname if specified */ + ai->ai_canonname = ((char*)ai + sizeof(struct addrinfo) + sizeof(struct sockaddr_in)); + MEMCPY(ai->ai_canonname, nodename, namelen); + ai->ai_canonname[namelen] = 0; + } + ai->ai_addrlen = sizeof(struct sockaddr_in); + ai->ai_addr = (struct sockaddr*)sa; + + *res = ai; + + return 0; +memerr: + if (ai != NULL) { + memp_free(MEMP_NETDB, ai); + } + return EAI_MEMORY; +} + +#endif /* LWIP_DNS && LWIP_SOCKET */ diff --git a/third_party/lwip-1.4.1/src/api/netifapi.c b/third_party/lwip-1.4.1/src/api/netifapi.c new file mode 100644 index 0000000..88f0ebd --- /dev/null +++ b/third_party/lwip-1.4.1/src/api/netifapi.c @@ -0,0 +1,160 @@ +/** + * @file + * Network Interface Sequential API module + * + */ + +/* + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#include "lwip/opt.h" + +#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/netifapi.h" +#include "lwip/tcpip.h" + +/** + * Call netif_add() inside the tcpip_thread context. + */ +void +do_netifapi_netif_add(struct netifapi_msg_msg *msg) +{ + if (!netif_add( msg->netif, + msg->msg.add.ipaddr, + msg->msg.add.netmask, + msg->msg.add.gw, + msg->msg.add.state, + msg->msg.add.init, + msg->msg.add.input)) { + msg->err = ERR_IF; + } else { + msg->err = ERR_OK; + } + TCPIP_NETIFAPI_ACK(msg); +} + +/** + * Call netif_set_addr() inside the tcpip_thread context. + */ +void +do_netifapi_netif_set_addr(struct netifapi_msg_msg *msg) +{ + netif_set_addr( msg->netif, + msg->msg.add.ipaddr, + msg->msg.add.netmask, + msg->msg.add.gw); + msg->err = ERR_OK; + TCPIP_NETIFAPI_ACK(msg); +} + +/** + * Call the "errtfunc" (or the "voidfunc" if "errtfunc" is NULL) inside the + * tcpip_thread context. + */ +void +do_netifapi_netif_common(struct netifapi_msg_msg *msg) +{ + if (msg->msg.common.errtfunc != NULL) { + msg->err = msg->msg.common.errtfunc(msg->netif); + } else { + msg->err = ERR_OK; + msg->msg.common.voidfunc(msg->netif); + } + TCPIP_NETIFAPI_ACK(msg); +} + +/** + * Call netif_add() in a thread-safe way by running that function inside the + * tcpip_thread context. + * + * @note for params @see netif_add() + */ +err_t +netifapi_netif_add(struct netif *netif, + ip_addr_t *ipaddr, + ip_addr_t *netmask, + ip_addr_t *gw, + void *state, + netif_init_fn init, + netif_input_fn input) +{ + struct netifapi_msg msg; + msg.function = do_netifapi_netif_add; + msg.msg.netif = netif; + msg.msg.msg.add.ipaddr = ipaddr; + msg.msg.msg.add.netmask = netmask; + msg.msg.msg.add.gw = gw; + msg.msg.msg.add.state = state; + msg.msg.msg.add.init = init; + msg.msg.msg.add.input = input; + TCPIP_NETIFAPI(&msg); + return msg.msg.err; +} + +/** + * Call netif_set_addr() in a thread-safe way by running that function inside the + * tcpip_thread context. + * + * @note for params @see netif_set_addr() + */ +err_t +netifapi_netif_set_addr(struct netif *netif, + ip_addr_t *ipaddr, + ip_addr_t *netmask, + ip_addr_t *gw) +{ + struct netifapi_msg msg; + msg.function = do_netifapi_netif_set_addr; + msg.msg.netif = netif; + msg.msg.msg.add.ipaddr = ipaddr; + msg.msg.msg.add.netmask = netmask; + msg.msg.msg.add.gw = gw; + TCPIP_NETIFAPI(&msg); + return msg.msg.err; +} + +/** + * call the "errtfunc" (or the "voidfunc" if "errtfunc" is NULL) in a thread-safe + * way by running that function inside the tcpip_thread context. + * + * @note use only for functions where there is only "netif" parameter. + */ +err_t +netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc, + netifapi_errt_fn errtfunc) +{ + struct netifapi_msg msg; + msg.function = do_netifapi_netif_common; + msg.msg.netif = netif; + msg.msg.msg.common.voidfunc = voidfunc; + msg.msg.msg.common.errtfunc = errtfunc; + TCPIP_NETIFAPI(&msg); + return msg.msg.err; +} + +#endif /* LWIP_NETIF_API */ diff --git a/third_party/lwip-1.4.1/src/api/sockets.c b/third_party/lwip-1.4.1/src/api/sockets.c new file mode 100644 index 0000000..21f09d9 --- /dev/null +++ b/third_party/lwip-1.4.1/src/api/sockets.c @@ -0,0 +1,2374 @@ +/** + * @file + * Sockets BSD-Like API module + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * Improved by Marc Boucher and David Haas + * + */ + +#include "lwip/opt.h" + +#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/sockets.h" +#include "lwip/api.h" +#include "lwip/sys.h" +#include "lwip/igmp.h" +#include "lwip/inet.h" +#include "lwip/tcp.h" +#include "lwip/raw.h" +#include "lwip/udp.h" +#include "lwip/tcpip.h" +#include "lwip/pbuf.h" +#if LWIP_CHECKSUM_ON_COPY +#include "lwip/inet_chksum.h" +#endif + +#include + +#define NUM_SOCKETS MEMP_NUM_NETCONN + +/** Contains all internal pointers and states used for a socket */ +struct lwip_sock { + /** sockets currently are built on netconns, each socket has one netconn */ + struct netconn *conn; + /** data that was left from the previous read */ + void *lastdata; + /** offset in the data that was left from the previous read */ + u16_t lastoffset; + /** number of times data was received, set by event_callback(), + tested by the receive and select functions */ + s16_t rcvevent; + /** number of times data was ACKed (free send buffer), set by event_callback(), + tested by select */ + u16_t sendevent; + /** error happened for this socket, set by event_callback(), tested by select */ + u16_t errevent; + /** last error that occurred on this socket */ + int err; + /** counter of how many threads are waiting for this socket using select */ + int select_waiting; +}; + +/** Description for a task waiting in select */ +struct lwip_select_cb { + /** Pointer to the next waiting task */ + struct lwip_select_cb *next; + /** Pointer to the previous waiting task */ + struct lwip_select_cb *prev; + /** readset passed to select */ + fd_set *readset; + /** writeset passed to select */ + fd_set *writeset; + /** unimplemented: exceptset passed to select */ + fd_set *exceptset; + /** don't signal the same semaphore twice: set to 1 when signalled */ + int sem_signalled; + /** semaphore to wake up a task waiting for select */ + sys_sem_t sem; +}; + +/** This struct is used to pass data to the set/getsockopt_internal + * functions running in tcpip_thread context (only a void* is allowed) */ +struct lwip_setgetsockopt_data { + /** socket struct for which to change options */ + struct lwip_sock *sock; +#ifdef LWIP_DEBUG + /** socket index for which to change options */ + int s; +#endif /* LWIP_DEBUG */ + /** level of the option to process */ + int level; + /** name of the option to process */ + int optname; + /** set: value to set the option to + * get: value of the option is stored here */ + void *optval; + /** size of *optval */ + socklen_t *optlen; + /** if an error occures, it is temporarily stored here */ + err_t err; +}; + +/** The global array of available sockets */ +static struct lwip_sock sockets[NUM_SOCKETS]; +/** The global list of tasks waiting for select */ +static struct lwip_select_cb *select_cb_list; +/** This counter is increased from lwip_select when the list is chagned + and checked in event_callback to see if it has changed. */ +static volatile int select_cb_ctr; + +/** Table to quickly map an lwIP error (err_t) to a socket error + * by using -err as an index */ +static const int err_to_errno_table[] = { + 0, /* ERR_OK 0 No error, everything OK. */ + ENOMEM, /* ERR_MEM -1 Out of memory error. */ + ENOBUFS, /* ERR_BUF -2 Buffer error. */ + EWOULDBLOCK, /* ERR_TIMEOUT -3 Timeout */ + EHOSTUNREACH, /* ERR_RTE -4 Routing problem. */ + EINPROGRESS, /* ERR_INPROGRESS -5 Operation in progress */ + EINVAL, /* ERR_VAL -6 Illegal value. */ + EWOULDBLOCK, /* ERR_WOULDBLOCK -7 Operation would block. */ + EADDRINUSE, /* ERR_USE -8 Address in use. */ + EALREADY, /* ERR_ISCONN -9 Already connected. */ + ECONNABORTED, /* ERR_ABRT -10 Connection aborted. */ + ECONNRESET, /* ERR_RST -11 Connection reset. */ + ENOTCONN, /* ERR_CLSD -12 Connection closed. */ + ENOTCONN, /* ERR_CONN -13 Not connected. */ + EIO, /* ERR_ARG -14 Illegal argument. */ + -1, /* ERR_IF -15 Low-level netif error */ +}; + +#define ERR_TO_ERRNO_TABLE_SIZE \ + (sizeof(err_to_errno_table)/sizeof(err_to_errno_table[0])) + +#define err_to_errno(err) \ + ((unsigned)(-(err)) < ERR_TO_ERRNO_TABLE_SIZE ? \ + err_to_errno_table[-(err)] : EIO) + +#ifdef ERRNO +#ifndef set_errno +#define set_errno(err) errno = (err) +#endif +#else /* ERRNO */ +#define set_errno(err) +#endif /* ERRNO */ + +#define sock_set_errno(sk, e) do { \ + sk->err = (e); \ + set_errno(sk->err); \ +} while (0) + +/* Forward delcaration of some functions */ +static void event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len); +static void lwip_getsockopt_internal(void *arg); +static void lwip_setsockopt_internal(void *arg); + +/** + * Initialize this module. This function has to be called before any other + * functions in this module! + */ +void +lwip_socket_init(void) +{ +} + +/** + * Map a externally used socket index to the internal socket representation. + * + * @param s externally used socket index + * @return struct lwip_sock for the socket or NULL if not found + */ +static struct lwip_sock * +get_socket(int s) +{ + struct lwip_sock *sock; + + if ((s < 0) || (s >= NUM_SOCKETS)) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): invalid\n", s)); + set_errno(EBADF); + return NULL; + } + + sock = &sockets[s]; + + if (!sock->conn) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("get_socket(%d): not active\n", s)); + set_errno(EBADF); + return NULL; + } + + return sock; +} + +/** + * Same as get_socket but doesn't set errno + * + * @param s externally used socket index + * @return struct lwip_sock for the socket or NULL if not found + */ +static struct lwip_sock * +tryget_socket(int s) +{ + if ((s < 0) || (s >= NUM_SOCKETS)) { + return NULL; + } + if (!sockets[s].conn) { + return NULL; + } + return &sockets[s]; +} + +/** + * Allocate a new socket for a given netconn. + * + * @param newconn the netconn for which to allocate a socket + * @param accepted 1 if socket has been created by accept(), + * 0 if socket has been created by socket() + * @return the index of the new socket; -1 on error + */ +static int +alloc_socket(struct netconn *newconn, int accepted) +{ + int i; + SYS_ARCH_DECL_PROTECT(lev); + + /* allocate a new socket identifier */ + for (i = 0; i < NUM_SOCKETS; ++i) { + /* Protect socket array */ + SYS_ARCH_PROTECT(lev); + if (!sockets[i].conn) { + sockets[i].conn = newconn; + /* The socket is not yet known to anyone, so no need to protect + after having marked it as used. */ + SYS_ARCH_UNPROTECT(lev); + sockets[i].lastdata = NULL; + sockets[i].lastoffset = 0; + sockets[i].rcvevent = 0; + /* TCP sendbuf is empty, but the socket is not yet writable until connected + * (unless it has been created by accept()). */ + sockets[i].sendevent = (newconn->type == NETCONN_TCP ? (accepted != 0) : 1); + sockets[i].errevent = 0; + sockets[i].err = 0; + sockets[i].select_waiting = 0; + return i; + } + SYS_ARCH_UNPROTECT(lev); + } + return -1; +} + +/** Free a socket. The socket's netconn must have been + * delete before! + * + * @param sock the socket to free + * @param is_tcp != 0 for TCP sockets, used to free lastdata + */ +static void +free_socket(struct lwip_sock *sock, int is_tcp) +{ + void *lastdata; + SYS_ARCH_DECL_PROTECT(lev); + + lastdata = sock->lastdata; + sock->lastdata = NULL; + sock->lastoffset = 0; + sock->err = 0; + + /* Protect socket array */ + SYS_ARCH_PROTECT(lev); + sock->conn = NULL; + SYS_ARCH_UNPROTECT(lev); + /* don't use 'sock' after this line, as another task might have allocated it */ + + if (lastdata != NULL) { + if (is_tcp) { + pbuf_free((struct pbuf *)lastdata); + } else { + netbuf_delete((struct netbuf *)lastdata); + } + } +} + +/* Below this, the well-known socket functions are implemented. + * Use google.com or opengroup.org to get a good description :-) + * + * Exceptions are documented! + */ + +int +lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen) +{ + struct lwip_sock *sock, *nsock; + struct netconn *newconn; + ip_addr_t naddr; + u16_t port; + int newsock; + struct sockaddr_in sin; + err_t err; + SYS_ARCH_DECL_PROTECT(lev); + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d)...\n", s)); + sock = get_socket(s); + if (!sock) { + return -1; + } + + if (netconn_is_nonblocking(sock->conn) && (sock->rcvevent <= 0)) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): returning EWOULDBLOCK\n", s)); + sock_set_errno(sock, EWOULDBLOCK); + return -1; + } + + /* wait for a new connection */ + err = netconn_accept(sock->conn, &newconn); + if (err != ERR_OK) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): netconn_acept failed, err=%d\n", s, err)); + if (netconn_type(sock->conn) != NETCONN_TCP) { + sock_set_errno(sock, EOPNOTSUPP); + return EOPNOTSUPP; + } + sock_set_errno(sock, err_to_errno(err)); + return -1; + } + LWIP_ASSERT("newconn != NULL", newconn != NULL); + /* Prevent automatic window updates, we do this on our own! */ + netconn_set_noautorecved(newconn, 1); + + /* get the IP address and port of the remote host */ + err = netconn_peer(newconn, &naddr, &port); + if (err != ERR_OK) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d): netconn_peer failed, err=%d\n", s, err)); + netconn_delete(newconn); + sock_set_errno(sock, err_to_errno(err)); + return -1; + } + + /* Note that POSIX only requires us to check addr is non-NULL. addrlen must + * not be NULL if addr is valid. + */ + if (NULL != addr) { + LWIP_ASSERT("addr valid but addrlen NULL", addrlen != NULL); + memset(&sin, 0, sizeof(sin)); + sin.sin_len = sizeof(sin); + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + inet_addr_from_ipaddr(&sin.sin_addr, &naddr); + + if (*addrlen > sizeof(sin)) + *addrlen = sizeof(sin); + + MEMCPY(addr, &sin, *addrlen); + } + + newsock = alloc_socket(newconn, 1); + if (newsock == -1) { + netconn_delete(newconn); + sock_set_errno(sock, ENFILE); + return -1; + } + LWIP_ASSERT("invalid socket index", (newsock >= 0) && (newsock < NUM_SOCKETS)); + LWIP_ASSERT("newconn->callback == event_callback", newconn->callback == event_callback); + nsock = &sockets[newsock]; + + /* See event_callback: If data comes in right away after an accept, even + * though the server task might not have created a new socket yet. + * In that case, newconn->socket is counted down (newconn->socket--), + * so nsock->rcvevent is >= 1 here! + */ + SYS_ARCH_PROTECT(lev); + nsock->rcvevent += (s16_t)(-1 - newconn->socket); + newconn->socket = newsock; + SYS_ARCH_UNPROTECT(lev); + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_accept(%d) returning new sock=%d addr=", s, newsock)); + ip_addr_debug_print(SOCKETS_DEBUG, &naddr); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F"\n", port)); + + sock_set_errno(sock, 0); + return newsock; +} + +int +lwip_bind(int s, const struct sockaddr *name, socklen_t namelen) +{ + struct lwip_sock *sock; + ip_addr_t local_addr; + u16_t local_port; + err_t err; + const struct sockaddr_in *name_in; + + sock = get_socket(s); + if (!sock) { + return -1; + } + + /* check size, familiy and alignment of 'name' */ + LWIP_ERROR("lwip_bind: invalid address", ((namelen == sizeof(struct sockaddr_in)) && + ((name->sa_family) == AF_INET) && ((((mem_ptr_t)name) % 4) == 0)), + sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;); + name_in = (const struct sockaddr_in *)(void*)name; + + inet_addr_to_ipaddr(&local_addr, &name_in->sin_addr); + local_port = name_in->sin_port; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d, addr=", s)); + ip_addr_debug_print(SOCKETS_DEBUG, &local_addr); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", ntohs(local_port))); + + err = netconn_bind(sock->conn, &local_addr, ntohs(local_port)); + + if (err != ERR_OK) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) failed, err=%d\n", s, err)); + sock_set_errno(sock, err_to_errno(err)); + return -1; + } + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_bind(%d) succeeded\n", s)); + sock_set_errno(sock, 0); + return 0; +} + +int +lwip_close(int s) +{ + struct lwip_sock *sock; + int is_tcp = 0; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_close(%d)\n", s)); + + sock = get_socket(s); + if (!sock) { + return -1; + } + + if(sock->conn != NULL) { + is_tcp = netconn_type(sock->conn) == NETCONN_TCP; + } else { + LWIP_ASSERT("sock->lastdata == NULL", sock->lastdata == NULL); + } + + netconn_delete(sock->conn); + + free_socket(sock, is_tcp); + set_errno(0); + return 0; +} + +int +lwip_connect(int s, const struct sockaddr *name, socklen_t namelen) +{ + struct lwip_sock *sock; + err_t err; + const struct sockaddr_in *name_in; + + sock = get_socket(s); + if (!sock) { + return -1; + } + + /* check size, familiy and alignment of 'name' */ + LWIP_ERROR("lwip_connect: invalid address", ((namelen == sizeof(struct sockaddr_in)) && + ((name->sa_family) == AF_INET) && ((((mem_ptr_t)name) % 4) == 0)), + sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;); + name_in = (const struct sockaddr_in *)(void*)name; + + if (name_in->sin_family == AF_UNSPEC) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, AF_UNSPEC)\n", s)); + err = netconn_disconnect(sock->conn); + } else { + ip_addr_t remote_addr; + u16_t remote_port; + + inet_addr_to_ipaddr(&remote_addr, &name_in->sin_addr); + remote_port = name_in->sin_port; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d, addr=", s)); + ip_addr_debug_print(SOCKETS_DEBUG, &remote_addr); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", ntohs(remote_port))); + + err = netconn_connect(sock->conn, &remote_addr, ntohs(remote_port)); + } + + if (err != ERR_OK) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) failed, err=%d\n", s, err)); + sock_set_errno(sock, err_to_errno(err)); + return -1; + } + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_connect(%d) succeeded\n", s)); + sock_set_errno(sock, 0); + return 0; +} + +/** + * Set a socket into listen mode. + * The socket may not have been used for another connection previously. + * + * @param s the socket to set to listening mode + * @param backlog (ATTENTION: needs TCP_LISTEN_BACKLOG=1) + * @return 0 on success, non-zero on failure + */ +int +lwip_listen(int s, int backlog) +{ + struct lwip_sock *sock; + err_t err; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d, backlog=%d)\n", s, backlog)); + + sock = get_socket(s); + if (!sock) { + return -1; + } + + /* limit the "backlog" parameter to fit in an u8_t */ + backlog = LWIP_MIN(LWIP_MAX(backlog, 0), 0xff); + + err = netconn_listen_with_backlog(sock->conn, (u8_t)backlog); + + if (err != ERR_OK) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_listen(%d) failed, err=%d\n", s, err)); + if (netconn_type(sock->conn) != NETCONN_TCP) { + sock_set_errno(sock, EOPNOTSUPP); + return EOPNOTSUPP; + } + sock_set_errno(sock, err_to_errno(err)); + return -1; + } + + sock_set_errno(sock, 0); + return 0; +} + +int +lwip_recvfrom(int s, void *mem, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen) +{ + struct lwip_sock *sock; + void *buf = NULL; + struct pbuf *p; + u16_t buflen, copylen; + int off = 0; + ip_addr_t *addr; + u16_t port; + u8_t done = 0; + err_t err; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d, %p, %"SZT_F", 0x%x, ..)\n", s, mem, len, flags)); + sock = get_socket(s); + if (!sock) { + return -1; + } + + do { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: top while sock->lastdata=%p\n", sock->lastdata)); + /* Check if there is data left from the last recv operation. */ + if (sock->lastdata) { + buf = sock->lastdata; + } else { + /* If this is non-blocking call, then check first */ + if (((flags & MSG_DONTWAIT) || netconn_is_nonblocking(sock->conn)) && + (sock->rcvevent <= 0)) { + if (off > 0) { + /* update receive window */ + netconn_recved(sock->conn, (u32_t)off); + /* already received data, return that */ + sock_set_errno(sock, 0); + return off; + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): returning EWOULDBLOCK\n", s)); + sock_set_errno(sock, EWOULDBLOCK); + return -1; + } + + /* No data was left from the previous operation, so we try to get + some from the network. */ + if (netconn_type(sock->conn) == NETCONN_TCP) { + err = netconn_recv_tcp_pbuf(sock->conn, (struct pbuf **)&buf); + } else { + err = netconn_recv(sock->conn, (struct netbuf **)&buf); + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: netconn_recv err=%d, netbuf=%p\n", + err, buf)); + + if (err != ERR_OK) { + if (off > 0) { + /* update receive window */ + netconn_recved(sock->conn, (u32_t)off); + /* already received data, return that */ + sock_set_errno(sock, 0); + return off; + } + /* We should really do some error checking here. */ + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): buf == NULL, error is \"%s\"!\n", + s, lwip_strerr(err))); + sock_set_errno(sock, err_to_errno(err)); + if (err == ERR_CLSD) { + return 0; + } else { + return -1; + } + } + LWIP_ASSERT("buf != NULL", buf != NULL); + sock->lastdata = buf; + } + + if (netconn_type(sock->conn) == NETCONN_TCP) { + p = (struct pbuf *)buf; + } else { + p = ((struct netbuf *)buf)->p; + } + buflen = p->tot_len; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: buflen=%"U16_F" len=%"SZT_F" off=%d sock->lastoffset=%"U16_F"\n", + buflen, len, off, sock->lastoffset)); + + buflen -= sock->lastoffset; + + if (len > buflen) { + copylen = buflen; + } else { + copylen = (u16_t)len; + } + + /* copy the contents of the received buffer into + the supplied memory pointer mem */ + pbuf_copy_partial(p, (u8_t*)mem + off, copylen, sock->lastoffset); + + off += copylen; + + if (netconn_type(sock->conn) == NETCONN_TCP) { + LWIP_ASSERT("invalid copylen, len would underflow", len >= copylen); + len -= copylen; + if ( (len <= 0) || + (p->flags & PBUF_FLAG_PUSH) || + (sock->rcvevent <= 0) || + ((flags & MSG_PEEK)!=0)) { + done = 1; + } + } else { + done = 1; + } + + /* Check to see from where the data was.*/ + if (done) { + ip_addr_t fromaddr; + if (from && fromlen) { + struct sockaddr_in sin; + + if (netconn_type(sock->conn) == NETCONN_TCP) { + addr = &fromaddr; + netconn_getaddr(sock->conn, addr, &port, 0); + } else { + addr = netbuf_fromaddr((struct netbuf *)buf); + port = netbuf_fromport((struct netbuf *)buf); + } + + memset(&sin, 0, sizeof(sin)); + sin.sin_len = sizeof(sin); + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + inet_addr_from_ipaddr(&sin.sin_addr, addr); + + if (*fromlen > sizeof(sin)) { + *fromlen = sizeof(sin); + } + + MEMCPY(from, &sin, *fromlen); + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): addr=", s)); + ip_addr_debug_print(SOCKETS_DEBUG, addr); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F" len=%d\n", port, off)); + } else { +#if SOCKETS_DEBUG + if (netconn_type(sock->conn) == NETCONN_TCP) { + addr = &fromaddr; + netconn_getaddr(sock->conn, addr, &port, 0); + } else { + addr = netbuf_fromaddr((struct netbuf *)buf); + port = netbuf_fromport((struct netbuf *)buf); + } + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom(%d): addr=", s)); + ip_addr_debug_print(SOCKETS_DEBUG, addr); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F" len=%d\n", port, off)); +#endif /* SOCKETS_DEBUG */ + } + } + + /* If we don't peek the incoming message... */ + if ((flags & MSG_PEEK) == 0) { + /* If this is a TCP socket, check if there is data left in the + buffer. If so, it should be saved in the sock structure for next + time around. */ + if ((netconn_type(sock->conn) == NETCONN_TCP) && (buflen - copylen > 0)) { + sock->lastdata = buf; + sock->lastoffset += copylen; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: lastdata now netbuf=%p\n", buf)); + } else { + sock->lastdata = NULL; + sock->lastoffset = 0; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_recvfrom: deleting netbuf=%p\n", buf)); + if (netconn_type(sock->conn) == NETCONN_TCP) { + pbuf_free((struct pbuf *)buf); + } else { + netbuf_delete((struct netbuf *)buf); + } + } + } + } while (!done); + + if (off > 0) { + /* update receive window */ + netconn_recved(sock->conn, (u32_t)off); + } + sock_set_errno(sock, 0); + return off; +} + +int +lwip_read(int s, void *mem, size_t len) +{ + return lwip_recvfrom(s, mem, len, 0, NULL, NULL); +} + +int +lwip_recv(int s, void *mem, size_t len, int flags) +{ + return lwip_recvfrom(s, mem, len, flags, NULL, NULL); +} + +int +lwip_send(int s, const void *data, size_t size, int flags) +{ + struct lwip_sock *sock; + err_t err; + u8_t write_flags; + size_t written; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d, data=%p, size=%"SZT_F", flags=0x%x)\n", + s, data, size, flags)); + + sock = get_socket(s); + if (!sock) { + return -1; + } + + if (sock->conn->type != NETCONN_TCP) { +#if (LWIP_UDP || LWIP_RAW) + return lwip_sendto(s, data, size, flags, NULL, 0); +#else /* (LWIP_UDP || LWIP_RAW) */ + sock_set_errno(sock, err_to_errno(ERR_ARG)); + return -1; +#endif /* (LWIP_UDP || LWIP_RAW) */ + } + + write_flags = NETCONN_COPY | + ((flags & MSG_MORE) ? NETCONN_MORE : 0) | + ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0); + written = 0; + err = netconn_write_partly(sock->conn, data, size, write_flags, &written); + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_send(%d) err=%d written=%"SZT_F"\n", s, err, written)); + sock_set_errno(sock, err_to_errno(err)); + return (err == ERR_OK ? (int)written : -1); +} + +int +lwip_sendto(int s, const void *data, size_t size, int flags, + const struct sockaddr *to, socklen_t tolen) +{ + struct lwip_sock *sock; + err_t err; + u16_t short_size; + const struct sockaddr_in *to_in; + u16_t remote_port; +#if !LWIP_TCPIP_CORE_LOCKING + struct netbuf buf; +#endif + + sock = get_socket(s); + if (!sock) { + return -1; + } + + if (sock->conn->type == NETCONN_TCP) { +#if LWIP_TCP + return lwip_send(s, data, size, flags); +#else /* LWIP_TCP */ + LWIP_UNUSED_ARG(flags); + sock_set_errno(sock, err_to_errno(ERR_ARG)); + return -1; +#endif /* LWIP_TCP */ + } + + /* @todo: split into multiple sendto's? */ + LWIP_ASSERT("lwip_sendto: size must fit in u16_t", size <= 0xffff); + short_size = (u16_t)size; + LWIP_ERROR("lwip_sendto: invalid address", (((to == NULL) && (tolen == 0)) || + ((tolen == sizeof(struct sockaddr_in)) && + ((to->sa_family) == AF_INET) && ((((mem_ptr_t)to) % 4) == 0))), + sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;); + to_in = (const struct sockaddr_in *)(void*)to; + +#if LWIP_TCPIP_CORE_LOCKING + /* Should only be consider like a sample or a simple way to experiment this option (no check of "to" field...) */ + { + struct pbuf* p; + ip_addr_t *remote_addr; + +#if LWIP_NETIF_TX_SINGLE_PBUF + p = pbuf_alloc(PBUF_TRANSPORT, short_size, PBUF_RAM); + if (p != NULL) { +#if LWIP_CHECKSUM_ON_COPY + u16_t chksum = 0; + if (sock->conn->type != NETCONN_RAW) { + chksum = LWIP_CHKSUM_COPY(p->payload, data, short_size); + } else +#endif /* LWIP_CHECKSUM_ON_COPY */ + MEMCPY(p->payload, data, size); +#else /* LWIP_NETIF_TX_SINGLE_PBUF */ + p = pbuf_alloc(PBUF_TRANSPORT, short_size, PBUF_REF); + if (p != NULL) { + p->payload = (void*)data; +#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ + + if (to_in != NULL) { + inet_addr_to_ipaddr_p(remote_addr, &to_in->sin_addr); + remote_port = ntohs(to_in->sin_port); + } else { + remote_addr = &sock->conn->pcb.ip->remote_ip; +#if LWIP_UDP + if (NETCONNTYPE_GROUP(sock->conn->type) == NETCONN_UDP) { + remote_port = sock->conn->pcb.udp->remote_port; + } else +#endif /* LWIP_UDP */ + { + remote_port = 0; + } + } + + LOCK_TCPIP_CORE(); + if (netconn_type(sock->conn) == NETCONN_RAW) { +#if LWIP_RAW + err = sock->conn->last_err = raw_sendto(sock->conn->pcb.raw, p, remote_addr); +#else /* LWIP_RAW */ + err = ERR_ARG; +#endif /* LWIP_RAW */ + } +#if LWIP_UDP && LWIP_RAW + else +#endif /* LWIP_UDP && LWIP_RAW */ + { +#if LWIP_UDP +#if LWIP_CHECKSUM_ON_COPY && LWIP_NETIF_TX_SINGLE_PBUF + err = sock->conn->last_err = udp_sendto_chksum(sock->conn->pcb.udp, p, + remote_addr, remote_port, 1, chksum); +#else /* LWIP_CHECKSUM_ON_COPY && LWIP_NETIF_TX_SINGLE_PBUF */ + err = sock->conn->last_err = udp_sendto(sock->conn->pcb.udp, p, + remote_addr, remote_port); +#endif /* LWIP_CHECKSUM_ON_COPY && LWIP_NETIF_TX_SINGLE_PBUF */ +#else /* LWIP_UDP */ + err = ERR_ARG; +#endif /* LWIP_UDP */ + } + UNLOCK_TCPIP_CORE(); + + pbuf_free(p); + } else { + err = ERR_MEM; + } + } +#else /* LWIP_TCPIP_CORE_LOCKING */ + /* initialize a buffer */ + buf.p = buf.ptr = NULL; +#if LWIP_CHECKSUM_ON_COPY + buf.flags = 0; +#endif /* LWIP_CHECKSUM_ON_COPY */ + if (to) { + inet_addr_to_ipaddr(&buf.addr, &to_in->sin_addr); + remote_port = ntohs(to_in->sin_port); + netbuf_fromport(&buf) = remote_port; + } else { + remote_port = 0; + ip_addr_set_any(&buf.addr); + netbuf_fromport(&buf) = 0; + } + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_sendto(%d, data=%p, short_size=%"U16_F", flags=0x%x to=", + s, data, short_size, flags)); + ip_addr_debug_print(SOCKETS_DEBUG, &buf.addr); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F"\n", remote_port)); + + /* make the buffer point to the data that should be sent */ +#if LWIP_NETIF_TX_SINGLE_PBUF + /* Allocate a new netbuf and copy the data into it. */ + if (netbuf_alloc(&buf, short_size) == NULL) { + err = ERR_MEM; + } else { +#if LWIP_CHECKSUM_ON_COPY + if (sock->conn->type != NETCONN_RAW) { + u16_t chksum = LWIP_CHKSUM_COPY(buf.p->payload, data, short_size); + netbuf_set_chksum(&buf, chksum); + err = ERR_OK; + } else +#endif /* LWIP_CHECKSUM_ON_COPY */ + { + err = netbuf_take(&buf, data, short_size); + } + } +#else /* LWIP_NETIF_TX_SINGLE_PBUF */ + err = netbuf_ref(&buf, data, short_size); +#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ + if (err == ERR_OK) { + /* send the data */ + err = netconn_send(sock->conn, &buf); + } + + /* deallocated the buffer */ + netbuf_free(&buf); +#endif /* LWIP_TCPIP_CORE_LOCKING */ + sock_set_errno(sock, err_to_errno(err)); + return (err == ERR_OK ? short_size : -1); +} + +int +lwip_socket(int domain, int type, int protocol) +{ + struct netconn *conn; + int i; + + LWIP_UNUSED_ARG(domain); + + /* create a netconn */ + switch (type) { + case SOCK_RAW: + conn = netconn_new_with_proto_and_callback(NETCONN_RAW, (u8_t)protocol, event_callback); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_RAW, %d) = ", + domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); + break; + case SOCK_DGRAM: + conn = netconn_new_with_callback( (protocol == IPPROTO_UDPLITE) ? + NETCONN_UDPLITE : NETCONN_UDP, event_callback); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_DGRAM, %d) = ", + domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); + break; + case SOCK_STREAM: + conn = netconn_new_with_callback(NETCONN_TCP, event_callback); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%s, SOCK_STREAM, %d) = ", + domain == PF_INET ? "PF_INET" : "UNKNOWN", protocol)); + if (conn != NULL) { + /* Prevent automatic window updates, we do this on our own! */ + netconn_set_noautorecved(conn, 1); + } + break; + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_socket(%d, %d/UNKNOWN, %d) = -1\n", + domain, type, protocol)); + set_errno(EINVAL); + return -1; + } + + if (!conn) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("-1 / ENOBUFS (could not create netconn)\n")); + set_errno(ENOBUFS); + return -1; + } + + i = alloc_socket(conn, 0); + + if (i == -1) { + netconn_delete(conn); + set_errno(ENFILE); + return -1; + } + conn->socket = i; + LWIP_DEBUGF(SOCKETS_DEBUG, ("%d\n", i)); + set_errno(0); + return i; +} + +int +lwip_write(int s, const void *data, size_t size) +{ + return lwip_send(s, data, size, 0); +} + +/** + * Go through the readset and writeset lists and see which socket of the sockets + * set in the sets has events. On return, readset, writeset and exceptset have + * the sockets enabled that had events. + * + * exceptset is not used for now!!! + * + * @param maxfdp1 the highest socket index in the sets + * @param readset_in: set of sockets to check for read events + * @param writeset_in: set of sockets to check for write events + * @param exceptset_in: set of sockets to check for error events + * @param readset_out: set of sockets that had read events + * @param writeset_out: set of sockets that had write events + * @param exceptset_out: set os sockets that had error events + * @return number of sockets that had events (read/write/exception) (>= 0) + */ +static int +lwip_selscan(int maxfdp1, fd_set *readset_in, fd_set *writeset_in, fd_set *exceptset_in, + fd_set *readset_out, fd_set *writeset_out, fd_set *exceptset_out) +{ + int i, nready = 0; + fd_set lreadset, lwriteset, lexceptset; + struct lwip_sock *sock; + SYS_ARCH_DECL_PROTECT(lev); + + FD_ZERO(&lreadset); + FD_ZERO(&lwriteset); + FD_ZERO(&lexceptset); + + /* Go through each socket in each list to count number of sockets which + currently match */ + for(i = 0; i < maxfdp1; i++) { + void* lastdata = NULL; + s16_t rcvevent = 0; + u16_t sendevent = 0; + u16_t errevent = 0; + /* First get the socket's status (protected)... */ + SYS_ARCH_PROTECT(lev); + sock = tryget_socket(i); + if (sock != NULL) { + lastdata = sock->lastdata; + rcvevent = sock->rcvevent; + sendevent = sock->sendevent; + errevent = sock->errevent; + } + SYS_ARCH_UNPROTECT(lev); + /* ... then examine it: */ + /* See if netconn of this socket is ready for read */ + if (readset_in && FD_ISSET(i, readset_in) && ((lastdata != NULL) || (rcvevent > 0))) { + FD_SET(i, &lreadset); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for reading\n", i)); + nready++; + } + /* See if netconn of this socket is ready for write */ + if (writeset_in && FD_ISSET(i, writeset_in) && (sendevent != 0)) { + FD_SET(i, &lwriteset); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for writing\n", i)); + nready++; + } + /* See if netconn of this socket had an error */ + if (exceptset_in && FD_ISSET(i, exceptset_in) && (errevent != 0)) { + FD_SET(i, &lexceptset); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_selscan: fd=%d ready for exception\n", i)); + nready++; + } + } + /* copy local sets to the ones provided as arguments */ + *readset_out = lreadset; + *writeset_out = lwriteset; + *exceptset_out = lexceptset; + + LWIP_ASSERT("nready >= 0", nready >= 0); + return nready; +} + +/** + * Processing exceptset is not yet implemented. + */ +int +lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, + struct timeval *timeout) +{ + u32_t waitres = 0; + int nready; + fd_set lreadset, lwriteset, lexceptset; + u32_t msectimeout; + struct lwip_select_cb select_cb; + err_t err; + int i; + SYS_ARCH_DECL_PROTECT(lev); + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select(%d, %p, %p, %p, tvsec=%"S32_F" tvusec=%"S32_F")\n", + maxfdp1, (void *)readset, (void *) writeset, (void *) exceptset, + timeout ? (s32_t)timeout->tv_sec : (s32_t)-1, + timeout ? (s32_t)timeout->tv_usec : (s32_t)-1)); + + /* Go through each socket in each list to count number of sockets which + currently match */ + nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset); + + /* If we don't have any current events, then suspend if we are supposed to */ + if (!nready) { + if (timeout && timeout->tv_sec == 0 && timeout->tv_usec == 0) { + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: no timeout, returning 0\n")); + /* This is OK as the local fdsets are empty and nready is zero, + or we would have returned earlier. */ + goto return_copy_fdsets; + } + + /* None ready: add our semaphore to list: + We don't actually need any dynamic memory. Our entry on the + list is only valid while we are in this function, so it's ok + to use local variables. */ + + select_cb.next = NULL; + select_cb.prev = NULL; + select_cb.readset = readset; + select_cb.writeset = writeset; + select_cb.exceptset = exceptset; + select_cb.sem_signalled = 0; + err = sys_sem_new(&select_cb.sem, 0); + if (err != ERR_OK) { + /* failed to create semaphore */ + set_errno(ENOMEM); + return -1; + } + + /* Protect the select_cb_list */ + SYS_ARCH_PROTECT(lev); + + /* Put this select_cb on top of list */ + select_cb.next = select_cb_list; + if (select_cb_list != NULL) { + select_cb_list->prev = &select_cb; + } + select_cb_list = &select_cb; + /* Increasing this counter tells even_callback that the list has changed. */ + select_cb_ctr++; + + /* Now we can safely unprotect */ + SYS_ARCH_UNPROTECT(lev); + + /* Increase select_waiting for each socket we are interested in */ + for(i = 0; i < maxfdp1; i++) { + if ((readset && FD_ISSET(i, readset)) || + (writeset && FD_ISSET(i, writeset)) || + (exceptset && FD_ISSET(i, exceptset))) { + struct lwip_sock *sock = tryget_socket(i); + LWIP_ASSERT("sock != NULL", sock != NULL); + SYS_ARCH_PROTECT(lev); + sock->select_waiting++; + LWIP_ASSERT("sock->select_waiting > 0", sock->select_waiting > 0); + SYS_ARCH_UNPROTECT(lev); + } + } + + /* Call lwip_selscan again: there could have been events between + the last scan (whithout us on the list) and putting us on the list! */ + nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset); + if (!nready) { + /* Still none ready, just wait to be woken */ + if (timeout == 0) { + /* Wait forever */ + msectimeout = 0; + } else { + msectimeout = ((timeout->tv_sec * 1000) + ((timeout->tv_usec + 500)/1000)); + if (msectimeout == 0) { + /* Wait 1ms at least (0 means wait forever) */ + msectimeout = 1; + } + } + + waitres = sys_arch_sem_wait(&select_cb.sem, msectimeout); + } + /* Increase select_waiting for each socket we are interested in */ + for(i = 0; i < maxfdp1; i++) { + if ((readset && FD_ISSET(i, readset)) || + (writeset && FD_ISSET(i, writeset)) || + (exceptset && FD_ISSET(i, exceptset))) { + struct lwip_sock *sock = tryget_socket(i); + LWIP_ASSERT("sock != NULL", sock != NULL); + SYS_ARCH_PROTECT(lev); + sock->select_waiting--; + LWIP_ASSERT("sock->select_waiting >= 0", sock->select_waiting >= 0); + SYS_ARCH_UNPROTECT(lev); + } + } + /* Take us off the list */ + SYS_ARCH_PROTECT(lev); + if (select_cb.next != NULL) { + select_cb.next->prev = select_cb.prev; + } + if (select_cb_list == &select_cb) { + LWIP_ASSERT("select_cb.prev == NULL", select_cb.prev == NULL); + select_cb_list = select_cb.next; + } else { + LWIP_ASSERT("select_cb.prev != NULL", select_cb.prev != NULL); + select_cb.prev->next = select_cb.next; + } + /* Increasing this counter tells even_callback that the list has changed. */ + select_cb_ctr++; + SYS_ARCH_UNPROTECT(lev); + + sys_sem_free(&select_cb.sem); + if (waitres == SYS_ARCH_TIMEOUT) { + /* Timeout */ + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: timeout expired\n")); + /* This is OK as the local fdsets are empty and nready is zero, + or we would have returned earlier. */ + goto return_copy_fdsets; + } + + /* See what's set */ + nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset); + } + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_select: nready=%d\n", nready)); +return_copy_fdsets: + set_errno(0); + if (readset) { + *readset = lreadset; + } + if (writeset) { + *writeset = lwriteset; + } + if (exceptset) { + *exceptset = lexceptset; + } + + + return nready; +} + +/** + * Callback registered in the netconn layer for each socket-netconn. + * Processes recvevent (data available) and wakes up tasks waiting for select. + */ +static void +event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len) +{ + int s; + struct lwip_sock *sock; + struct lwip_select_cb *scb; + int last_select_cb_ctr; + SYS_ARCH_DECL_PROTECT(lev); + + LWIP_UNUSED_ARG(len); + + /* Get socket */ + if (conn) { + s = conn->socket; + if (s < 0) { + /* Data comes in right away after an accept, even though + * the server task might not have created a new socket yet. + * Just count down (or up) if that's the case and we + * will use the data later. Note that only receive events + * can happen before the new socket is set up. */ + SYS_ARCH_PROTECT(lev); + if (conn->socket < 0) { + if (evt == NETCONN_EVT_RCVPLUS) { + conn->socket--; + } + SYS_ARCH_UNPROTECT(lev); + return; + } + s = conn->socket; + SYS_ARCH_UNPROTECT(lev); + } + + sock = get_socket(s); + if (!sock) { + return; + } + } else { + return; + } + + SYS_ARCH_PROTECT(lev); + /* Set event as required */ + switch (evt) { + case NETCONN_EVT_RCVPLUS: + sock->rcvevent++; + break; + case NETCONN_EVT_RCVMINUS: + sock->rcvevent--; + break; + case NETCONN_EVT_SENDPLUS: + sock->sendevent = 1; + break; + case NETCONN_EVT_SENDMINUS: + sock->sendevent = 0; + break; + case NETCONN_EVT_ERROR: + sock->errevent = 1; + break; + default: + LWIP_ASSERT("unknown event", 0); + break; + } + + if (sock->select_waiting == 0) { + /* noone is waiting for this socket, no need to check select_cb_list */ + SYS_ARCH_UNPROTECT(lev); + return; + } + + /* Now decide if anyone is waiting for this socket */ + /* NOTE: This code goes through the select_cb_list list multiple times + ONLY IF a select was actually waiting. We go through the list the number + of waiting select calls + 1. This list is expected to be small. */ + + /* At this point, SYS_ARCH is still protected! */ +again: + for (scb = select_cb_list; scb != NULL; scb = scb->next) { + if (scb->sem_signalled == 0) { + /* semaphore not signalled yet */ + int do_signal = 0; + /* Test this select call for our socket */ + if (sock->rcvevent > 0) { + if (scb->readset && FD_ISSET(s, scb->readset)) { + do_signal = 1; + } + } + if (sock->sendevent != 0) { + if (!do_signal && scb->writeset && FD_ISSET(s, scb->writeset)) { + do_signal = 1; + } + } + if (sock->errevent != 0) { + if (!do_signal && scb->exceptset && FD_ISSET(s, scb->exceptset)) { + do_signal = 1; + } + } + if (do_signal) { + scb->sem_signalled = 1; + /* Don't call SYS_ARCH_UNPROTECT() before signaling the semaphore, as this might + lead to the select thread taking itself off the list, invalidagin the semaphore. */ + sys_sem_signal(&scb->sem); + } + } + /* unlock interrupts with each step */ + last_select_cb_ctr = select_cb_ctr; + SYS_ARCH_UNPROTECT(lev); + /* this makes sure interrupt protection time is short */ + SYS_ARCH_PROTECT(lev); + if (last_select_cb_ctr != select_cb_ctr) { + /* someone has changed select_cb_list, restart at the beginning */ + goto again; + } + } + SYS_ARCH_UNPROTECT(lev); +} + +/** + * Unimplemented: Close one end of a full-duplex connection. + * Currently, the full connection is closed. + */ +int +lwip_shutdown(int s, int how) +{ + struct lwip_sock *sock; + err_t err; + u8_t shut_rx = 0, shut_tx = 0; + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_shutdown(%d, how=%d)\n", s, how)); + + sock = get_socket(s); + if (!sock) { + return -1; + } + + if (sock->conn != NULL) { + if (netconn_type(sock->conn) != NETCONN_TCP) { + sock_set_errno(sock, EOPNOTSUPP); + return EOPNOTSUPP; + } + } else { + sock_set_errno(sock, ENOTCONN); + return ENOTCONN; + } + + if (how == SHUT_RD) { + shut_rx = 1; + } else if (how == SHUT_WR) { + shut_tx = 1; + } else if(how == SHUT_RDWR) { + shut_rx = 1; + shut_tx = 1; + } else { + sock_set_errno(sock, EINVAL); + return EINVAL; + } + err = netconn_shutdown(sock->conn, shut_rx, shut_tx); + + sock_set_errno(sock, err_to_errno(err)); + return (err == ERR_OK ? 0 : -1); +} + +static int +lwip_getaddrname(int s, struct sockaddr *name, socklen_t *namelen, u8_t local) +{ + struct lwip_sock *sock; + struct sockaddr_in sin; + ip_addr_t naddr; + + sock = get_socket(s); + if (!sock) { + return -1; + } + + memset(&sin, 0, sizeof(sin)); + sin.sin_len = sizeof(sin); + sin.sin_family = AF_INET; + + /* get the IP address and port */ + netconn_getaddr(sock->conn, &naddr, &sin.sin_port, local); + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getaddrname(%d, addr=", s)); + ip_addr_debug_print(SOCKETS_DEBUG, &naddr); + LWIP_DEBUGF(SOCKETS_DEBUG, (" port=%"U16_F")\n", sin.sin_port)); + + sin.sin_port = htons(sin.sin_port); + inet_addr_from_ipaddr(&sin.sin_addr, &naddr); + + if (*namelen > sizeof(sin)) { + *namelen = sizeof(sin); + } + + MEMCPY(name, &sin, *namelen); + sock_set_errno(sock, 0); + return 0; +} + +int +lwip_getpeername(int s, struct sockaddr *name, socklen_t *namelen) +{ + return lwip_getaddrname(s, name, namelen, 0); +} + +int +lwip_getsockname(int s, struct sockaddr *name, socklen_t *namelen) +{ + return lwip_getaddrname(s, name, namelen, 1); +} + +int +lwip_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen) +{ + err_t err = ERR_OK; + struct lwip_sock *sock = get_socket(s); + struct lwip_setgetsockopt_data data; + + if (!sock) { + return -1; + } + + if ((NULL == optval) || (NULL == optlen)) { + sock_set_errno(sock, EFAULT); + return -1; + } + + /* Do length and type checks for the various options first, to keep it readable. */ + switch (level) { + +/* Level: SOL_SOCKET */ + case SOL_SOCKET: + switch (optname) { + + case SO_ACCEPTCONN: + case SO_BROADCAST: + /* UNIMPL case SO_DEBUG: */ + /* UNIMPL case SO_DONTROUTE: */ + case SO_ERROR: + case SO_KEEPALIVE: + /* UNIMPL case SO_CONTIMEO: */ +#if LWIP_SO_SNDTIMEO + case SO_SNDTIMEO: +#endif /* LWIP_SO_SNDTIMEO */ +#if LWIP_SO_RCVTIMEO + case SO_RCVTIMEO: +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + case SO_RCVBUF: +#endif /* LWIP_SO_RCVBUF */ + /* UNIMPL case SO_OOBINLINE: */ + /* UNIMPL case SO_SNDBUF: */ + /* UNIMPL case SO_RCVLOWAT: */ + /* UNIMPL case SO_SNDLOWAT: */ +#if SO_REUSE + case SO_REUSEADDR: + case SO_REUSEPORT: +#endif /* SO_REUSE */ + case SO_TYPE: + /* UNIMPL case SO_USELOOPBACK: */ + if (*optlen < sizeof(int)) { + err = EINVAL; + } + break; + + case SO_NO_CHECK: + if (*optlen < sizeof(int)) { + err = EINVAL; + } +#if LWIP_UDP + if ((sock->conn->type != NETCONN_UDP) || + ((udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_UDPLITE) != 0)) { + /* this flag is only available for UDP, not for UDP lite */ + err = EAFNOSUPPORT; + } +#endif /* LWIP_UDP */ + break; + + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + } /* switch (optname) */ + break; + +/* Level: IPPROTO_IP */ + case IPPROTO_IP: + switch (optname) { + /* UNIMPL case IP_HDRINCL: */ + /* UNIMPL case IP_RCVDSTADDR: */ + /* UNIMPL case IP_RCVIF: */ + case IP_TTL: + case IP_TOS: + if (*optlen < sizeof(int)) { + err = EINVAL; + } + break; +#if LWIP_IGMP + case IP_MULTICAST_TTL: + if (*optlen < sizeof(u8_t)) { + err = EINVAL; + } + break; + case IP_MULTICAST_IF: + if (*optlen < sizeof(struct in_addr)) { + err = EINVAL; + } + break; + case IP_MULTICAST_LOOP: + if (*optlen < sizeof(u8_t)) { + err = EINVAL; + } + if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP) { + err = EAFNOSUPPORT; + } + break; +#endif /* LWIP_IGMP */ + + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + } /* switch (optname) */ + break; + +#if LWIP_TCP +/* Level: IPPROTO_TCP */ + case IPPROTO_TCP: + if (*optlen < sizeof(int)) { + err = EINVAL; + break; + } + + /* If this is no TCP socket, ignore any options. */ + if (sock->conn->type != NETCONN_TCP) + return 0; + + switch (optname) { + case TCP_NODELAY: + case TCP_KEEPALIVE: +#if LWIP_TCP_KEEPALIVE + case TCP_KEEPIDLE: + case TCP_KEEPINTVL: + case TCP_KEEPCNT: +#endif /* LWIP_TCP_KEEPALIVE */ + break; + + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + } /* switch (optname) */ + break; +#endif /* LWIP_TCP */ +#if LWIP_UDP && LWIP_UDPLITE +/* Level: IPPROTO_UDPLITE */ + case IPPROTO_UDPLITE: + if (*optlen < sizeof(int)) { + err = EINVAL; + break; + } + + /* If this is no UDP lite socket, ignore any options. */ + if (sock->conn->type != NETCONN_UDPLITE) { + return 0; + } + + switch (optname) { + case UDPLITE_SEND_CSCOV: + case UDPLITE_RECV_CSCOV: + break; + + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + } /* switch (optname) */ + break; +#endif /* LWIP_UDP && LWIP_UDPLITE*/ +/* UNDEFINED LEVEL */ + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", + s, level, optname)); + err = ENOPROTOOPT; + } /* switch */ + + + if (err != ERR_OK) { + sock_set_errno(sock, err); + return -1; + } + + /* Now do the actual option processing */ + data.sock = sock; +#ifdef LWIP_DEBUG + data.s = s; +#endif /* LWIP_DEBUG */ + data.level = level; + data.optname = optname; + data.optval = optval; + data.optlen = optlen; + data.err = err; + tcpip_callback(lwip_getsockopt_internal, &data); + sys_arch_sem_wait(&sock->conn->op_completed, 0); + /* maybe lwip_getsockopt_internal has changed err */ + err = data.err; + + sock_set_errno(sock, err); + return err ? -1 : 0; +} + +static void +lwip_getsockopt_internal(void *arg) +{ + struct lwip_sock *sock; +#ifdef LWIP_DEBUG + int s; +#endif /* LWIP_DEBUG */ + int level, optname; + void *optval; + struct lwip_setgetsockopt_data *data; + + LWIP_ASSERT("arg != NULL", arg != NULL); + + data = (struct lwip_setgetsockopt_data*)arg; + sock = data->sock; +#ifdef LWIP_DEBUG + s = data->s; +#endif /* LWIP_DEBUG */ + level = data->level; + optname = data->optname; + optval = data->optval; + + switch (level) { + +/* Level: SOL_SOCKET */ + case SOL_SOCKET: + switch (optname) { + + /* The option flags */ + case SO_ACCEPTCONN: + case SO_BROADCAST: + /* UNIMPL case SO_DEBUG: */ + /* UNIMPL case SO_DONTROUTE: */ + case SO_KEEPALIVE: + /* UNIMPL case SO_OOBINCLUDE: */ +#if SO_REUSE + case SO_REUSEADDR: + case SO_REUSEPORT: +#endif /* SO_REUSE */ + /*case SO_USELOOPBACK: UNIMPL */ + *(int*)optval = ip_get_option(sock->conn->pcb.ip, optname); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, optname=0x%x, ..) = %s\n", + s, optname, (*(int*)optval?"on":"off"))); + break; + + case SO_TYPE: + switch (NETCONNTYPE_GROUP(sock->conn->type)) { + case NETCONN_RAW: + *(int*)optval = SOCK_RAW; + break; + case NETCONN_TCP: + *(int*)optval = SOCK_STREAM; + break; + case NETCONN_UDP: + *(int*)optval = SOCK_DGRAM; + break; + default: /* unrecognized socket type */ + *(int*)optval = sock->conn->type; + LWIP_DEBUGF(SOCKETS_DEBUG, + ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE): unrecognized socket type %d\n", + s, *(int *)optval)); + } /* switch (sock->conn->type) */ + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE) = %d\n", + s, *(int *)optval)); + break; + + case SO_ERROR: + /* only overwrite ERR_OK or tempoary errors */ + if ((sock->err == 0) || (sock->err == EINPROGRESS)) { + sock_set_errno(sock, err_to_errno(sock->conn->last_err)); + } + *(int *)optval = sock->err; + sock->err = 0; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, SOL_SOCKET, SO_ERROR) = %d\n", + s, *(int *)optval)); + break; + +#if LWIP_SO_SNDTIMEO + case SO_SNDTIMEO: + *(int *)optval = netconn_get_sendtimeout(sock->conn); + break; +#endif /* LWIP_SO_SNDTIMEO */ +#if LWIP_SO_RCVTIMEO + case SO_RCVTIMEO: + *(int *)optval = netconn_get_recvtimeout(sock->conn); + break; +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + case SO_RCVBUF: + *(int *)optval = netconn_get_recvbufsize(sock->conn); + break; +#endif /* LWIP_SO_RCVBUF */ +#if LWIP_UDP + case SO_NO_CHECK: + *(int*)optval = (udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_NOCHKSUM) ? 1 : 0; + break; +#endif /* LWIP_UDP*/ + default: + LWIP_ASSERT("unhandled optname", 0); + break; + } /* switch (optname) */ + break; + +/* Level: IPPROTO_IP */ + case IPPROTO_IP: + switch (optname) { + case IP_TTL: + *(int*)optval = sock->conn->pcb.ip->ttl; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TTL) = %d\n", + s, *(int *)optval)); + break; + case IP_TOS: + *(int*)optval = sock->conn->pcb.ip->tos; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_TOS) = %d\n", + s, *(int *)optval)); + break; +#if LWIP_IGMP + case IP_MULTICAST_TTL: + *(u8_t*)optval = sock->conn->pcb.ip->ttl; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_TTL) = %d\n", + s, *(int *)optval)); + break; + case IP_MULTICAST_IF: + inet_addr_from_ipaddr((struct in_addr*)optval, &sock->conn->pcb.udp->multicast_ip); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_IF) = 0x%"X32_F"\n", + s, *(u32_t *)optval)); + break; + case IP_MULTICAST_LOOP: + if ((sock->conn->pcb.udp->flags & UDP_FLAGS_MULTICAST_LOOP) != 0) { + *(u8_t*)optval = 1; + } else { + *(u8_t*)optval = 0; + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_LOOP) = %d\n", + s, *(int *)optval)); + break; +#endif /* LWIP_IGMP */ + default: + LWIP_ASSERT("unhandled optname", 0); + break; + } /* switch (optname) */ + break; + +#if LWIP_TCP +/* Level: IPPROTO_TCP */ + case IPPROTO_TCP: + switch (optname) { + case TCP_NODELAY: + *(int*)optval = tcp_nagle_disabled(sock->conn->pcb.tcp); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_TCP, TCP_NODELAY) = %s\n", + s, (*(int*)optval)?"on":"off") ); + break; + case TCP_KEEPALIVE: + *(int*)optval = (int)sock->conn->pcb.tcp->keep_idle; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, TCP_KEEPALIVE) = %d\n", + s, *(int *)optval)); + break; + +#if LWIP_TCP_KEEPALIVE + case TCP_KEEPIDLE: + *(int*)optval = (int)(sock->conn->pcb.tcp->keep_idle/1000); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, TCP_KEEPIDLE) = %d\n", + s, *(int *)optval)); + break; + case TCP_KEEPINTVL: + *(int*)optval = (int)(sock->conn->pcb.tcp->keep_intvl/1000); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, TCP_KEEPINTVL) = %d\n", + s, *(int *)optval)); + break; + case TCP_KEEPCNT: + *(int*)optval = (int)sock->conn->pcb.tcp->keep_cnt; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_IP, TCP_KEEPCNT) = %d\n", + s, *(int *)optval)); + break; +#endif /* LWIP_TCP_KEEPALIVE */ + default: + LWIP_ASSERT("unhandled optname", 0); + break; + } /* switch (optname) */ + break; +#endif /* LWIP_TCP */ +#if LWIP_UDP && LWIP_UDPLITE + /* Level: IPPROTO_UDPLITE */ + case IPPROTO_UDPLITE: + switch (optname) { + case UDPLITE_SEND_CSCOV: + *(int*)optval = sock->conn->pcb.udp->chksum_len_tx; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) = %d\n", + s, (*(int*)optval)) ); + break; + case UDPLITE_RECV_CSCOV: + *(int*)optval = sock->conn->pcb.udp->chksum_len_rx; + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) = %d\n", + s, (*(int*)optval)) ); + break; + default: + LWIP_ASSERT("unhandled optname", 0); + break; + } /* switch (optname) */ + break; +#endif /* LWIP_UDP */ + default: + LWIP_ASSERT("unhandled level", 0); + break; + } /* switch (level) */ + sys_sem_signal(&sock->conn->op_completed); +} + +int +lwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) +{ + struct lwip_sock *sock = get_socket(s); + err_t err = ERR_OK; + struct lwip_setgetsockopt_data data; + + if (!sock) { + return -1; + } + + if (NULL == optval) { + sock_set_errno(sock, EFAULT); + return -1; + } + + /* Do length and type checks for the various options first, to keep it readable. */ + switch (level) { + +/* Level: SOL_SOCKET */ + case SOL_SOCKET: + switch (optname) { + + case SO_BROADCAST: + /* UNIMPL case SO_DEBUG: */ + /* UNIMPL case SO_DONTROUTE: */ + case SO_KEEPALIVE: + /* UNIMPL case case SO_CONTIMEO: */ +#if LWIP_SO_SNDTIMEO + case SO_SNDTIMEO: +#endif /* LWIP_SO_SNDTIMEO */ +#if LWIP_SO_RCVTIMEO + case SO_RCVTIMEO: +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + case SO_RCVBUF: +#endif /* LWIP_SO_RCVBUF */ + /* UNIMPL case SO_OOBINLINE: */ + /* UNIMPL case SO_SNDBUF: */ + /* UNIMPL case SO_RCVLOWAT: */ + /* UNIMPL case SO_SNDLOWAT: */ +#if SO_REUSE + case SO_REUSEADDR: + case SO_REUSEPORT: +#endif /* SO_REUSE */ + /* UNIMPL case SO_USELOOPBACK: */ + if (optlen < sizeof(int)) { + err = EINVAL; + } + break; + case SO_NO_CHECK: + if (optlen < sizeof(int)) { + err = EINVAL; + } +#if LWIP_UDP + if ((sock->conn->type != NETCONN_UDP) || + ((udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_UDPLITE) != 0)) { + /* this flag is only available for UDP, not for UDP lite */ + err = EAFNOSUPPORT; + } +#endif /* LWIP_UDP */ + break; + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + } /* switch (optname) */ + break; + +/* Level: IPPROTO_IP */ + case IPPROTO_IP: + switch (optname) { + /* UNIMPL case IP_HDRINCL: */ + /* UNIMPL case IP_RCVDSTADDR: */ + /* UNIMPL case IP_RCVIF: */ + case IP_TTL: + case IP_TOS: + if (optlen < sizeof(int)) { + err = EINVAL; + } + break; +#if LWIP_IGMP + case IP_MULTICAST_TTL: + if (optlen < sizeof(u8_t)) { + err = EINVAL; + } + if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP) { + err = EAFNOSUPPORT; + } + break; + case IP_MULTICAST_IF: + if (optlen < sizeof(struct in_addr)) { + err = EINVAL; + } + if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP) { + err = EAFNOSUPPORT; + } + break; + case IP_MULTICAST_LOOP: + if (optlen < sizeof(u8_t)) { + err = EINVAL; + } + if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP) { + err = EAFNOSUPPORT; + } + break; + case IP_ADD_MEMBERSHIP: + case IP_DROP_MEMBERSHIP: + if (optlen < sizeof(struct ip_mreq)) { + err = EINVAL; + } + if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_UDP) { + err = EAFNOSUPPORT; + } + break; +#endif /* LWIP_IGMP */ + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + } /* switch (optname) */ + break; + +#if LWIP_TCP +/* Level: IPPROTO_TCP */ + case IPPROTO_TCP: + if (optlen < sizeof(int)) { + err = EINVAL; + break; + } + + /* If this is no TCP socket, ignore any options. */ + if (sock->conn->type != NETCONN_TCP) + return 0; + + switch (optname) { + case TCP_NODELAY: + case TCP_KEEPALIVE: +#if LWIP_TCP_KEEPALIVE + case TCP_KEEPIDLE: + case TCP_KEEPINTVL: + case TCP_KEEPCNT: +#endif /* LWIP_TCP_KEEPALIVE */ + break; + + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + } /* switch (optname) */ + break; +#endif /* LWIP_TCP */ +#if LWIP_UDP && LWIP_UDPLITE +/* Level: IPPROTO_UDPLITE */ + case IPPROTO_UDPLITE: + if (optlen < sizeof(int)) { + err = EINVAL; + break; + } + + /* If this is no UDP lite socket, ignore any options. */ + if (sock->conn->type != NETCONN_UDPLITE) + return 0; + + switch (optname) { + case UDPLITE_SEND_CSCOV: + case UDPLITE_RECV_CSCOV: + break; + + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\n", + s, optname)); + err = ENOPROTOOPT; + } /* switch (optname) */ + break; +#endif /* LWIP_UDP && LWIP_UDPLITE */ +/* UNDEFINED LEVEL */ + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\n", + s, level, optname)); + err = ENOPROTOOPT; + } /* switch (level) */ + + + if (err != ERR_OK) { + sock_set_errno(sock, err); + return -1; + } + + + /* Now do the actual option processing */ + data.sock = sock; +#ifdef LWIP_DEBUG + data.s = s; +#endif /* LWIP_DEBUG */ + data.level = level; + data.optname = optname; + data.optval = (void*)optval; + data.optlen = &optlen; + data.err = err; + tcpip_callback(lwip_setsockopt_internal, &data); + sys_arch_sem_wait(&sock->conn->op_completed, 0); + /* maybe lwip_setsockopt_internal has changed err */ + err = data.err; + + sock_set_errno(sock, err); + return err ? -1 : 0; +} + +static void +lwip_setsockopt_internal(void *arg) +{ + struct lwip_sock *sock; +#ifdef LWIP_DEBUG + int s; +#endif /* LWIP_DEBUG */ + int level, optname; + const void *optval; + struct lwip_setgetsockopt_data *data; + + LWIP_ASSERT("arg != NULL", arg != NULL); + + data = (struct lwip_setgetsockopt_data*)arg; + sock = data->sock; +#ifdef LWIP_DEBUG + s = data->s; +#endif /* LWIP_DEBUG */ + level = data->level; + optname = data->optname; + optval = data->optval; + + switch (level) { + +/* Level: SOL_SOCKET */ + case SOL_SOCKET: + switch (optname) { + + /* The option flags */ + case SO_BROADCAST: + /* UNIMPL case SO_DEBUG: */ + /* UNIMPL case SO_DONTROUTE: */ + case SO_KEEPALIVE: + /* UNIMPL case SO_OOBINCLUDE: */ +#if SO_REUSE + case SO_REUSEADDR: + case SO_REUSEPORT: +#endif /* SO_REUSE */ + /* UNIMPL case SO_USELOOPBACK: */ + if (*(int*)optval) { + ip_set_option(sock->conn->pcb.ip, optname); + } else { + ip_reset_option(sock->conn->pcb.ip, optname); + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, SOL_SOCKET, optname=0x%x, ..) -> %s\n", + s, optname, (*(int*)optval?"on":"off"))); + break; +#if LWIP_SO_SNDTIMEO + case SO_SNDTIMEO: + netconn_set_sendtimeout(sock->conn, (s32_t)*(int*)optval); + break; +#endif /* LWIP_SO_SNDTIMEO */ +#if LWIP_SO_RCVTIMEO + case SO_RCVTIMEO: + netconn_set_recvtimeout(sock->conn, *(int*)optval); + break; +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + case SO_RCVBUF: + netconn_set_recvbufsize(sock->conn, *(int*)optval); + break; +#endif /* LWIP_SO_RCVBUF */ +#if LWIP_UDP + case SO_NO_CHECK: + if (*(int*)optval) { + udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) | UDP_FLAGS_NOCHKSUM); + } else { + udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) & ~UDP_FLAGS_NOCHKSUM); + } + break; +#endif /* LWIP_UDP */ + default: + LWIP_ASSERT("unhandled optname", 0); + break; + } /* switch (optname) */ + break; + +/* Level: IPPROTO_IP */ + case IPPROTO_IP: + switch (optname) { + case IP_TTL: + sock->conn->pcb.ip->ttl = (u8_t)(*(int*)optval); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TTL, ..) -> %d\n", + s, sock->conn->pcb.ip->ttl)); + break; + case IP_TOS: + sock->conn->pcb.ip->tos = (u8_t)(*(int*)optval); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_IP, IP_TOS, ..)-> %d\n", + s, sock->conn->pcb.ip->tos)); + break; +#if LWIP_IGMP + case IP_MULTICAST_TTL: + sock->conn->pcb.udp->ttl = (u8_t)(*(u8_t*)optval); + break; + case IP_MULTICAST_IF: + inet_addr_to_ipaddr(&sock->conn->pcb.udp->multicast_ip, (struct in_addr*)optval); + break; + case IP_MULTICAST_LOOP: + if (*(u8_t*)optval) { + udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) | UDP_FLAGS_MULTICAST_LOOP); + } else { + udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) & ~UDP_FLAGS_MULTICAST_LOOP); + } + break; + case IP_ADD_MEMBERSHIP: + case IP_DROP_MEMBERSHIP: + { + /* If this is a TCP or a RAW socket, ignore these options. */ + struct ip_mreq *imr = (struct ip_mreq *)optval; + ip_addr_t if_addr; + ip_addr_t multi_addr; + inet_addr_to_ipaddr(&if_addr, &imr->imr_interface); + inet_addr_to_ipaddr(&multi_addr, &imr->imr_multiaddr); + if(optname == IP_ADD_MEMBERSHIP){ + data->err = igmp_joingroup(&if_addr, &multi_addr); + } else { + data->err = igmp_leavegroup(&if_addr, &multi_addr); + } + if(data->err != ERR_OK) { + data->err = EADDRNOTAVAIL; + } + } + break; +#endif /* LWIP_IGMP */ + default: + LWIP_ASSERT("unhandled optname", 0); + break; + } /* switch (optname) */ + break; + +#if LWIP_TCP +/* Level: IPPROTO_TCP */ + case IPPROTO_TCP: + switch (optname) { + case TCP_NODELAY: + if (*(int*)optval) { + tcp_nagle_disable(sock->conn->pcb.tcp); + } else { + tcp_nagle_enable(sock->conn->pcb.tcp); + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_NODELAY) -> %s\n", + s, (*(int *)optval)?"on":"off") ); + break; + case TCP_KEEPALIVE: + sock->conn->pcb.tcp->keep_idle = (u32_t)(*(int*)optval); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) -> %"U32_F"\n", + s, sock->conn->pcb.tcp->keep_idle)); + break; + +#if LWIP_TCP_KEEPALIVE + case TCP_KEEPIDLE: + sock->conn->pcb.tcp->keep_idle = 1000*(u32_t)(*(int*)optval); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPIDLE) -> %"U32_F"\n", + s, sock->conn->pcb.tcp->keep_idle)); + break; + case TCP_KEEPINTVL: + sock->conn->pcb.tcp->keep_intvl = 1000*(u32_t)(*(int*)optval); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPINTVL) -> %"U32_F"\n", + s, sock->conn->pcb.tcp->keep_intvl)); + break; + case TCP_KEEPCNT: + sock->conn->pcb.tcp->keep_cnt = (u32_t)(*(int*)optval); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPCNT) -> %"U32_F"\n", + s, sock->conn->pcb.tcp->keep_cnt)); + break; +#endif /* LWIP_TCP_KEEPALIVE */ + default: + LWIP_ASSERT("unhandled optname", 0); + break; + } /* switch (optname) */ + break; +#endif /* LWIP_TCP*/ +#if LWIP_UDP && LWIP_UDPLITE + /* Level: IPPROTO_UDPLITE */ + case IPPROTO_UDPLITE: + switch (optname) { + case UDPLITE_SEND_CSCOV: + if ((*(int*)optval != 0) && ((*(int*)optval < 8) || (*(int*)optval > 0xffff))) { + /* don't allow illegal values! */ + sock->conn->pcb.udp->chksum_len_tx = 8; + } else { + sock->conn->pcb.udp->chksum_len_tx = (u16_t)*(int*)optval; + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) -> %d\n", + s, (*(int*)optval)) ); + break; + case UDPLITE_RECV_CSCOV: + if ((*(int*)optval != 0) && ((*(int*)optval < 8) || (*(int*)optval > 0xffff))) { + /* don't allow illegal values! */ + sock->conn->pcb.udp->chksum_len_rx = 8; + } else { + sock->conn->pcb.udp->chksum_len_rx = (u16_t)*(int*)optval; + } + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) -> %d\n", + s, (*(int*)optval)) ); + break; + default: + LWIP_ASSERT("unhandled optname", 0); + break; + } /* switch (optname) */ + break; +#endif /* LWIP_UDP */ + default: + LWIP_ASSERT("unhandled level", 0); + break; + } /* switch (level) */ + sys_sem_signal(&sock->conn->op_completed); +} + +int +lwip_ioctl(int s, long cmd, void *argp) +{ + struct lwip_sock *sock = get_socket(s); + u8_t val; +#if LWIP_SO_RCVBUF + u16_t buflen = 0; + s16_t recv_avail; +#endif /* LWIP_SO_RCVBUF */ + + if (!sock) { + return -1; + } + + switch (cmd) { +#if LWIP_SO_RCVBUF + case FIONREAD: + if (!argp) { + sock_set_errno(sock, EINVAL); + return -1; + } + + SYS_ARCH_GET(sock->conn->recv_avail, recv_avail); + if (recv_avail < 0) { + recv_avail = 0; + } + *((u16_t*)argp) = (u16_t)recv_avail; + + /* Check if there is data left from the last recv operation. /maq 041215 */ + if (sock->lastdata) { + struct pbuf *p = (struct pbuf *)sock->lastdata; + if (netconn_type(sock->conn) != NETCONN_TCP) { + p = ((struct netbuf *)p)->p; + } + buflen = p->tot_len; + buflen -= sock->lastoffset; + + *((u16_t*)argp) += buflen; + } + + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONREAD, %p) = %"U16_F"\n", s, argp, *((u16_t*)argp))); + sock_set_errno(sock, 0); + return 0; +#endif /* LWIP_SO_RCVBUF */ + + case FIONBIO: + val = 0; + if (argp && *(u32_t*)argp) { + val = 1; + } + netconn_set_nonblocking(sock->conn, val); + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, FIONBIO, %d)\n", s, val)); + sock_set_errno(sock, 0); + return 0; + + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_ioctl(%d, UNIMPL: 0x%lx, %p)\n", s, cmd, argp)); + sock_set_errno(sock, ENOSYS); /* not yet implemented */ + return -1; + } /* switch (cmd) */ +} + +/** A minimal implementation of fcntl. + * Currently only the commands F_GETFL and F_SETFL are implemented. + * Only the flag O_NONBLOCK is implemented. + */ +int +lwip_fcntl(int s, int cmd, int val) +{ + struct lwip_sock *sock = get_socket(s); + int ret = -1; + + if (!sock || !sock->conn) { + return -1; + } + + switch (cmd) { + case F_GETFL: + ret = netconn_is_nonblocking(sock->conn) ? O_NONBLOCK : 0; + break; + case F_SETFL: + if ((val & ~O_NONBLOCK) == 0) { + /* only O_NONBLOCK, all other bits are zero */ + netconn_set_nonblocking(sock->conn, val & O_NONBLOCK); + ret = 0; + } + break; + default: + LWIP_DEBUGF(SOCKETS_DEBUG, ("lwip_fcntl(%d, UNIMPL: %d, %d)\n", s, cmd, val)); + break; + } + return ret; +} + +#endif /* LWIP_SOCKET */ diff --git a/third_party/lwip-1.4.1/src/api/tcpip.c b/third_party/lwip-1.4.1/src/api/tcpip.c new file mode 100644 index 0000000..e825e0a --- /dev/null +++ b/third_party/lwip-1.4.1/src/api/tcpip.c @@ -0,0 +1,511 @@ +/** + * @file + * Sequential API Main thread module + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#if !NO_SYS /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/sys.h" +#include "lwip/memp.h" +#include "lwip/mem.h" +#include "lwip/pbuf.h" +#include "lwip/tcpip.h" +#include "lwip/init.h" +#include "netif/etharp.h" +#include "netif/ppp_oe.h" + +/* global variables */ +static tcpip_init_done_fn tcpip_init_done; +static void *tcpip_init_done_arg; +static sys_mbox_t mbox; + +#if LWIP_TCPIP_CORE_LOCKING +/** The global semaphore to lock the stack. */ +sys_mutex_t lock_tcpip_core; +#endif /* LWIP_TCPIP_CORE_LOCKING */ + + +/** + * The main lwIP thread. This thread has exclusive access to lwIP core functions + * (unless access to them is not locked). Other threads communicate with this + * thread using message boxes. + * + * It also starts all the timers to make sure they are running in the right + * thread context. + * + * @param arg unused argument + */ +static void +tcpip_thread(void *arg) +{ + struct tcpip_msg *msg; + LWIP_UNUSED_ARG(arg); + + if (tcpip_init_done != NULL) { + tcpip_init_done(tcpip_init_done_arg); + } + + LOCK_TCPIP_CORE(); + while (1) { /* MAIN Loop */ + UNLOCK_TCPIP_CORE(); + LWIP_TCPIP_THREAD_ALIVE(); + /* wait for a message, timeouts are processed while waiting */ + sys_timeouts_mbox_fetch(&mbox, (void **)&msg); + LOCK_TCPIP_CORE(); + switch (msg->type) { +#if LWIP_NETCONN + case TCPIP_MSG_API: + LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: API message %p\n", (void *)msg)); + msg->msg.apimsg->function(&(msg->msg.apimsg->msg)); + break; +#endif /* LWIP_NETCONN */ + +#if !LWIP_TCPIP_CORE_LOCKING_INPUT + case TCPIP_MSG_INPKT: + LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: PACKET %p\n", (void *)msg)); +#if LWIP_ETHERNET + if (msg->msg.inp.netif->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) { + ethernet_input(msg->msg.inp.p, msg->msg.inp.netif); + } else +#endif /* LWIP_ETHERNET */ + { + ip_input(msg->msg.inp.p, msg->msg.inp.netif); + } + memp_free(MEMP_TCPIP_MSG_INPKT, msg); + break; +#endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */ + +#if LWIP_NETIF_API + case TCPIP_MSG_NETIFAPI: + LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: Netif API message %p\n", (void *)msg)); + msg->msg.netifapimsg->function(&(msg->msg.netifapimsg->msg)); + break; +#endif /* LWIP_NETIF_API */ + +#if LWIP_TCPIP_TIMEOUT + case TCPIP_MSG_TIMEOUT: + LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: TIMEOUT %p\n", (void *)msg)); + sys_timeout(msg->msg.tmo.msecs, msg->msg.tmo.h, msg->msg.tmo.arg); + memp_free(MEMP_TCPIP_MSG_API, msg); + break; + case TCPIP_MSG_UNTIMEOUT: + LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: UNTIMEOUT %p\n", (void *)msg)); + sys_untimeout(msg->msg.tmo.h, msg->msg.tmo.arg); + memp_free(MEMP_TCPIP_MSG_API, msg); + break; +#endif /* LWIP_TCPIP_TIMEOUT */ + + case TCPIP_MSG_CALLBACK: + LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK %p\n", (void *)msg)); + msg->msg.cb.function(msg->msg.cb.ctx); + memp_free(MEMP_TCPIP_MSG_API, msg); + break; + + case TCPIP_MSG_CALLBACK_STATIC: + LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: CALLBACK_STATIC %p\n", (void *)msg)); + msg->msg.cb.function(msg->msg.cb.ctx); + break; + + default: + LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_thread: invalid message: %d\n", msg->type)); + LWIP_ASSERT("tcpip_thread: invalid message", 0); + break; + } + } +} + +/** + * Pass a received packet to tcpip_thread for input processing + * + * @param p the received packet, p->payload pointing to the Ethernet header or + * to an IP header (if inp doesn't have NETIF_FLAG_ETHARP or + * NETIF_FLAG_ETHERNET flags) + * @param inp the network interface on which the packet was received + */ +err_t +tcpip_input(struct pbuf *p, struct netif *inp) +{ +#if LWIP_TCPIP_CORE_LOCKING_INPUT + err_t ret; + LWIP_DEBUGF(TCPIP_DEBUG, ("tcpip_input: PACKET %p/%p\n", (void *)p, (void *)inp)); + LOCK_TCPIP_CORE(); +#if LWIP_ETHERNET + if (inp->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) { + ret = ethernet_input(p, inp); + } else +#endif /* LWIP_ETHERNET */ + { + ret = ip_input(p, inp); + } + UNLOCK_TCPIP_CORE(); + return ret; +#else /* LWIP_TCPIP_CORE_LOCKING_INPUT */ + struct tcpip_msg *msg; + + if (!sys_mbox_valid(&mbox)) { + return ERR_VAL; + } + msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT); + if (msg == NULL) { + return ERR_MEM; + } + + msg->type = TCPIP_MSG_INPKT; + msg->msg.inp.p = p; + msg->msg.inp.netif = inp; + if (sys_mbox_trypost(&mbox, msg) != ERR_OK) { + memp_free(MEMP_TCPIP_MSG_INPKT, msg); + return ERR_MEM; + } + return ERR_OK; +#endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */ +} + +/** + * Call a specific function in the thread context of + * tcpip_thread for easy access synchronization. + * A function called in that way may access lwIP core code + * without fearing concurrent access. + * + * @param f the function to call + * @param ctx parameter passed to f + * @param block 1 to block until the request is posted, 0 to non-blocking mode + * @return ERR_OK if the function was called, another err_t if not + */ +err_t +tcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block) +{ + struct tcpip_msg *msg; + + if (sys_mbox_valid(&mbox)) { + msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API); + if (msg == NULL) { + return ERR_MEM; + } + + msg->type = TCPIP_MSG_CALLBACK; + msg->msg.cb.function = function; + msg->msg.cb.ctx = ctx; + if (block) { + sys_mbox_post(&mbox, msg); + } else { + if (sys_mbox_trypost(&mbox, msg) != ERR_OK) { + memp_free(MEMP_TCPIP_MSG_API, msg); + return ERR_MEM; + } + } + return ERR_OK; + } + return ERR_VAL; +} + +#if LWIP_TCPIP_TIMEOUT +/** + * call sys_timeout in tcpip_thread + * + * @param msec time in milliseconds for timeout + * @param h function to be called on timeout + * @param arg argument to pass to timeout function h + * @return ERR_MEM on memory error, ERR_OK otherwise + */ +err_t +tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg) +{ + struct tcpip_msg *msg; + + if (sys_mbox_valid(&mbox)) { + msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API); + if (msg == NULL) { + return ERR_MEM; + } + + msg->type = TCPIP_MSG_TIMEOUT; + msg->msg.tmo.msecs = msecs; + msg->msg.tmo.h = h; + msg->msg.tmo.arg = arg; + sys_mbox_post(&mbox, msg); + return ERR_OK; + } + return ERR_VAL; +} + +/** + * call sys_untimeout in tcpip_thread + * + * @param msec time in milliseconds for timeout + * @param h function to be called on timeout + * @param arg argument to pass to timeout function h + * @return ERR_MEM on memory error, ERR_OK otherwise + */ +err_t +tcpip_untimeout(sys_timeout_handler h, void *arg) +{ + struct tcpip_msg *msg; + + if (sys_mbox_valid(&mbox)) { + msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API); + if (msg == NULL) { + return ERR_MEM; + } + + msg->type = TCPIP_MSG_UNTIMEOUT; + msg->msg.tmo.h = h; + msg->msg.tmo.arg = arg; + sys_mbox_post(&mbox, msg); + return ERR_OK; + } + return ERR_VAL; +} +#endif /* LWIP_TCPIP_TIMEOUT */ + +#if LWIP_NETCONN +/** + * Call the lower part of a netconn_* function + * This function is then running in the thread context + * of tcpip_thread and has exclusive access to lwIP core code. + * + * @param apimsg a struct containing the function to call and its parameters + * @return ERR_OK if the function was called, another err_t if not + */ +err_t +tcpip_apimsg(struct api_msg *apimsg) +{ + struct tcpip_msg msg; +#ifdef LWIP_DEBUG + /* catch functions that don't set err */ + apimsg->msg.err = ERR_VAL; +#endif + + if (sys_mbox_valid(&mbox)) { + msg.type = TCPIP_MSG_API; + msg.msg.apimsg = apimsg; + sys_mbox_post(&mbox, &msg); + sys_arch_sem_wait(&apimsg->msg.conn->op_completed, 0); + return apimsg->msg.err; + } + return ERR_VAL; +} + +#if LWIP_TCPIP_CORE_LOCKING +/** + * Call the lower part of a netconn_* function + * This function has exclusive access to lwIP core code by locking it + * before the function is called. + * + * @param apimsg a struct containing the function to call and its parameters + * @return ERR_OK (only for compatibility fo tcpip_apimsg()) + */ +err_t +tcpip_apimsg_lock(struct api_msg *apimsg) +{ +#ifdef LWIP_DEBUG + /* catch functions that don't set err */ + apimsg->msg.err = ERR_VAL; +#endif + + LOCK_TCPIP_CORE(); + apimsg->function(&(apimsg->msg)); + UNLOCK_TCPIP_CORE(); + return apimsg->msg.err; + +} +#endif /* LWIP_TCPIP_CORE_LOCKING */ +#endif /* LWIP_NETCONN */ + +#if LWIP_NETIF_API +#if !LWIP_TCPIP_CORE_LOCKING +/** + * Much like tcpip_apimsg, but calls the lower part of a netifapi_* + * function. + * + * @param netifapimsg a struct containing the function to call and its parameters + * @return error code given back by the function that was called + */ +err_t +tcpip_netifapi(struct netifapi_msg* netifapimsg) +{ + struct tcpip_msg msg; + + if (sys_mbox_valid(&mbox)) { + err_t err = sys_sem_new(&netifapimsg->msg.sem, 0); + if (err != ERR_OK) { + netifapimsg->msg.err = err; + return err; + } + + msg.type = TCPIP_MSG_NETIFAPI; + msg.msg.netifapimsg = netifapimsg; + sys_mbox_post(&mbox, &msg); + sys_sem_wait(&netifapimsg->msg.sem); + sys_sem_free(&netifapimsg->msg.sem); + return netifapimsg->msg.err; + } + return ERR_VAL; +} +#else /* !LWIP_TCPIP_CORE_LOCKING */ +/** + * Call the lower part of a netifapi_* function + * This function has exclusive access to lwIP core code by locking it + * before the function is called. + * + * @param netifapimsg a struct containing the function to call and its parameters + * @return ERR_OK (only for compatibility fo tcpip_netifapi()) + */ +err_t +tcpip_netifapi_lock(struct netifapi_msg* netifapimsg) +{ + LOCK_TCPIP_CORE(); + netifapimsg->function(&(netifapimsg->msg)); + UNLOCK_TCPIP_CORE(); + return netifapimsg->msg.err; +} +#endif /* !LWIP_TCPIP_CORE_LOCKING */ +#endif /* LWIP_NETIF_API */ + +/** + * Allocate a structure for a static callback message and initialize it. + * This is intended to be used to send "static" messages from interrupt context. + * + * @param function the function to call + * @param ctx parameter passed to function + * @return a struct pointer to pass to tcpip_trycallback(). + */ +struct tcpip_callback_msg* tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx) +{ + struct tcpip_msg *msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API); + if (msg == NULL) { + return NULL; + } + msg->type = TCPIP_MSG_CALLBACK_STATIC; + msg->msg.cb.function = function; + msg->msg.cb.ctx = ctx; + return (struct tcpip_callback_msg*)msg; +} + +/** + * Free a callback message allocated by tcpip_callbackmsg_new(). + * + * @param msg the message to free + */ +void tcpip_callbackmsg_delete(struct tcpip_callback_msg* msg) +{ + memp_free(MEMP_TCPIP_MSG_API, msg); +} + +/** + * Try to post a callback-message to the tcpip_thread mbox + * This is intended to be used to send "static" messages from interrupt context. + * + * @param msg pointer to the message to post + * @return sys_mbox_trypost() return code + */ +err_t +tcpip_trycallback(struct tcpip_callback_msg* msg) +{ + if (!sys_mbox_valid(&mbox)) { + return ERR_VAL; + } + return sys_mbox_trypost(&mbox, msg); +} + +/** + * Initialize this module: + * - initialize all sub modules + * - start the tcpip_thread + * + * @param initfunc a function to call when tcpip_thread is running and finished initializing + * @param arg argument to pass to initfunc + */ +void +tcpip_init(tcpip_init_done_fn initfunc, void *arg) +{ + lwip_init(); + + tcpip_init_done = initfunc; + tcpip_init_done_arg = arg; + if(sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) { + LWIP_ASSERT("failed to create tcpip_thread mbox", 0); + } +#if LWIP_TCPIP_CORE_LOCKING + if(sys_mutex_new(&lock_tcpip_core) != ERR_OK) { + LWIP_ASSERT("failed to create lock_tcpip_core", 0); + } +#endif /* LWIP_TCPIP_CORE_LOCKING */ + + sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO); +} + +/** + * Simple callback function used with tcpip_callback to free a pbuf + * (pbuf_free has a wrong signature for tcpip_callback) + * + * @param p The pbuf (chain) to be dereferenced. + */ +static void +pbuf_free_int(void *p) +{ + struct pbuf *q = (struct pbuf *)p; + pbuf_free(q); +} + +/** + * A simple wrapper function that allows you to free a pbuf from interrupt context. + * + * @param p The pbuf (chain) to be dereferenced. + * @return ERR_OK if callback could be enqueued, an err_t if not + */ +err_t +pbuf_free_callback(struct pbuf *p) +{ + return tcpip_callback_with_block(pbuf_free_int, p, 0); +} + +/** + * A simple wrapper function that allows you to free heap memory from + * interrupt context. + * + * @param m the heap memory to free + * @return ERR_OK if callback could be enqueued, an err_t if not + */ +err_t +mem_free_callback(void *m) +{ + return tcpip_callback_with_block(mem_free, m, 0); +} + +#endif /* !NO_SYS */ diff --git a/third_party/lwip-1.4.1/src/core/def.c b/third_party/lwip-1.4.1/src/core/def.c new file mode 100644 index 0000000..c6514b7 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/def.c @@ -0,0 +1,108 @@ +/** + * @file + * Common functions used throughout the stack. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ + +#include "lwip/opt.h" +#include "lwip/def.h" + +/** + * These are reference implementations of the byte swapping functions. + * Again with the aim of being simple, correct and fully portable. + * Byte swapping is the second thing you would want to optimize. You will + * need to port it to your architecture and in your cc.h: + * + * #define LWIP_PLATFORM_BYTESWAP 1 + * #define LWIP_PLATFORM_HTONS(x) + * #define LWIP_PLATFORM_HTONL(x) + * + * Note ntohs() and ntohl() are merely references to the htonx counterparts. + */ + +#if (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN) + +/** + * Convert an u16_t from host- to network byte order. + * + * @param n u16_t in host byte order + * @return n in network byte order + */ +u16_t +lwip_htons(u16_t n) +{ + return ((n & 0xff) << 8) | ((n & 0xff00) >> 8); +} + +/** + * Convert an u16_t from network- to host byte order. + * + * @param n u16_t in network byte order + * @return n in host byte order + */ +u16_t +lwip_ntohs(u16_t n) +{ + return lwip_htons(n); +} + +/** + * Convert an u32_t from host- to network byte order. + * + * @param n u32_t in host byte order + * @return n in network byte order + */ +u32_t +lwip_htonl(u32_t n) +{ + return ((n & 0xff) << 24) | + ((n & 0xff00) << 8) | + ((n & 0xff0000UL) >> 8) | + ((n & 0xff000000UL) >> 24); +} + +/** + * Convert an u32_t from network- to host byte order. + * + * @param n u32_t in network byte order + * @return n in host byte order + */ +u32_t +lwip_ntohl(u32_t n) +{ + return lwip_htonl(n); +} + +#endif /* (LWIP_PLATFORM_BYTESWAP == 0) && (BYTE_ORDER == LITTLE_ENDIAN) */ diff --git a/third_party/lwip-1.4.1/src/core/dhcp.c b/third_party/lwip-1.4.1/src/core/dhcp.c new file mode 100644 index 0000000..fa54e31 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/dhcp.c @@ -0,0 +1,1770 @@ +/** + * @file + * Dynamic Host Configuration Protocol client + * + */ + +/* + * + * Copyright (c) 2001-2004 Leon Woestenberg + * Copyright (c) 2001-2004 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is a contribution to the lwIP TCP/IP stack. + * The Swedish Institute of Computer Science and Adam Dunkels + * are specifically granted permission to redistribute this + * source code. + * + * Author: Leon Woestenberg + * + * This is a DHCP client for the lwIP TCP/IP stack. It aims to conform + * with RFC 2131 and RFC 2132. + * + * TODO: + * - Support for interfaces other than Ethernet (SLIP, PPP, ...) + * + * Please coordinate changes and requests with Leon Woestenberg + * + * + * Integration with your code: + * + * In lwip/dhcp.h + * #define DHCP_COARSE_TIMER_SECS (recommended 60 which is a minute) + * #define DHCP_FINE_TIMER_MSECS (recommended 500 which equals TCP coarse timer) + * + * Then have your application call dhcp_coarse_tmr() and + * dhcp_fine_tmr() on the defined intervals. + * + * dhcp_start(struct netif *netif); + * starts a DHCP client instance which configures the interface by + * obtaining an IP address lease and maintaining it. + * + * Use dhcp_release(netif) to end the lease and use dhcp_stop(netif) + * to remove the DHCP client. + * + */ + +#include "lwip/opt.h" + +#if LWIP_DHCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/stats.h" +#include "lwip/mem.h" +#include "lwip/udp.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/def.h" +#include "lwip/dhcp.h" +#include "lwip/autoip.h" +#include "lwip/dns.h" +#include "netif/etharp.h" + +#include + +/** DHCP_CREATE_RAND_XID: if this is set to 1, the xid is created using + * LWIP_RAND() (this overrides DHCP_GLOBAL_XID) + */ +#ifndef DHCP_CREATE_RAND_XID +#define DHCP_CREATE_RAND_XID 1 +#endif + +/** Default for DHCP_GLOBAL_XID is 0xABCD0000 + * This can be changed by defining DHCP_GLOBAL_XID and DHCP_GLOBAL_XID_HEADER, e.g. + * #define DHCP_GLOBAL_XID_HEADER "stdlib.h" + * #define DHCP_GLOBAL_XID rand() + */ +#ifdef DHCP_GLOBAL_XID_HEADER +#include DHCP_GLOBAL_XID_HEADER /* include optional starting XID generation prototypes */ +#endif + +/** DHCP_OPTION_MAX_MSG_SIZE is set to the MTU + * MTU is checked to be big enough in dhcp_start */ +#define DHCP_MAX_MSG_LEN(netif) (netif->mtu) +#define DHCP_MAX_MSG_LEN_MIN_REQUIRED 576 +/** Minimum length for reply before packet is parsed */ +#define DHCP_MIN_REPLY_LEN 44 + +#define REBOOT_TRIES 2 + +/** Option handling: options are parsed in dhcp_parse_reply + * and saved in an array where other functions can load them from. + * This might be moved into the struct dhcp (not necessarily since + * lwIP is single-threaded and the array is only used while in recv + * callback). */ +#define DHCP_OPTION_IDX_OVERLOAD 0 +#define DHCP_OPTION_IDX_MSG_TYPE 1 +#define DHCP_OPTION_IDX_SERVER_ID 2 +#define DHCP_OPTION_IDX_LEASE_TIME 3 +#define DHCP_OPTION_IDX_T1 4 +#define DHCP_OPTION_IDX_T2 5 +#define DHCP_OPTION_IDX_SUBNET_MASK 6 +#define DHCP_OPTION_IDX_ROUTER 7 +#define DHCP_OPTION_IDX_DNS_SERVER 8 +#define DHCP_OPTION_IDX_MAX (DHCP_OPTION_IDX_DNS_SERVER + DNS_MAX_SERVERS) + +/** Holds the decoded option values, only valid while in dhcp_recv. + @todo: move this into struct dhcp? */ +u32_t dhcp_rx_options_val[DHCP_OPTION_IDX_MAX]; +/** Holds a flag which option was received and is contained in dhcp_rx_options_val, + only valid while in dhcp_recv. + @todo: move this into struct dhcp? */ +u8_t dhcp_rx_options_given[DHCP_OPTION_IDX_MAX]; + +#ifdef DHCP_GLOBAL_XID +static u32_t xid; +static u8_t xid_initialised; +#endif /* DHCP_GLOBAL_XID */ + +#define dhcp_option_given(dhcp, idx) (dhcp_rx_options_given[idx] != 0) +#define dhcp_got_option(dhcp, idx) (dhcp_rx_options_given[idx] = 1) +#define dhcp_clear_option(dhcp, idx) (dhcp_rx_options_given[idx] = 0) +#define dhcp_clear_all_options(dhcp) (memset(dhcp_rx_options_given, 0, sizeof(dhcp_rx_options_given))) +#define dhcp_get_option_value(dhcp, idx) (dhcp_rx_options_val[idx]) +#define dhcp_set_option_value(dhcp, idx, val) (dhcp_rx_options_val[idx] = (val)) + + +/* DHCP client state machine functions */ +static err_t dhcp_discover(struct netif *netif); +static err_t dhcp_select(struct netif *netif); +static void dhcp_bind(struct netif *netif); +#if DHCP_DOES_ARP_CHECK +static err_t dhcp_decline(struct netif *netif); +#endif /* DHCP_DOES_ARP_CHECK */ +static err_t dhcp_rebind(struct netif *netif); +static err_t dhcp_reboot(struct netif *netif); +static void dhcp_set_state(struct dhcp *dhcp, u8_t new_state); + +/* receive, unfold, parse and free incoming messages */ +static void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port); + +/* set the DHCP timers */ +static void dhcp_timeout(struct netif *netif); +static void dhcp_t1_timeout(struct netif *netif); +static void dhcp_t2_timeout(struct netif *netif); + +/* build outgoing messages */ +/* create a DHCP message, fill in common headers */ +static err_t dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type); +/* free a DHCP request */ +static void dhcp_delete_msg(struct dhcp *dhcp); +/* add a DHCP option (type, then length in bytes) */ +static void dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len); +/* add option values */ +static void dhcp_option_byte(struct dhcp *dhcp, u8_t value); +static void dhcp_option_short(struct dhcp *dhcp, u16_t value); +static void dhcp_option_long(struct dhcp *dhcp, u32_t value); +#if LWIP_NETIF_HOSTNAME +static void dhcp_option_hostname(struct dhcp *dhcp, struct netif *netif); +#endif /* LWIP_NETIF_HOSTNAME */ +/* always add the DHCP options trailer to end and pad */ +static void dhcp_option_trailer(struct dhcp *dhcp); + +/** + * Back-off the DHCP client (because of a received NAK response). + * + * Back-off the DHCP client because of a received NAK. Receiving a + * NAK means the client asked for something non-sensible, for + * example when it tries to renew a lease obtained on another network. + * + * We clear any existing set IP address and restart DHCP negotiation + * afresh (as per RFC2131 3.2.3). + * + * @param netif the netif under DHCP control + */ +static void +dhcp_handle_nak(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_nak(netif=%p) %c%c%"U16_F"\n", + (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + /* Set the interface down since the address must no longer be used, as per RFC2131 */ + netif_set_down(netif); + /* remove IP address from interface */ + netif_set_ipaddr(netif, IP_ADDR_ANY); + netif_set_gw(netif, IP_ADDR_ANY); + netif_set_netmask(netif, IP_ADDR_ANY); + /* Change to a defined state */ + dhcp_set_state(dhcp, DHCP_BACKING_OFF); + /* We can immediately restart discovery */ + dhcp_discover(netif); +} + +#if DHCP_DOES_ARP_CHECK +/** + * Checks if the offered IP address is already in use. + * + * It does so by sending an ARP request for the offered address and + * entering CHECKING state. If no ARP reply is received within a small + * interval, the address is assumed to be free for use by us. + * + * @param netif the netif under DHCP control + */ +static void +dhcp_check(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result; + u16_t msecs; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_check(netif=%p) %c%c\n", (void *)netif, (s16_t)netif->name[0], + (s16_t)netif->name[1])); + dhcp_set_state(dhcp, DHCP_CHECKING); + /* create an ARP query for the offered IP address, expecting that no host + responds, as the IP address should not be in use. */ + result = etharp_query(netif, &dhcp->offered_ip_addr, NULL); + if (result != ERR_OK) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_check: could not perform ARP query\n")); + } + dhcp->tries++; + msecs = 500; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_check(): set request timeout %"U16_F" msecs\n", msecs)); +} +#endif /* DHCP_DOES_ARP_CHECK */ + +/** + * Remember the configuration offered by a DHCP server. + * + * @param netif the netif under DHCP control + */ +static void +dhcp_handle_offer(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_handle_offer(netif=%p) %c%c%"U16_F"\n", + (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + /* obtain the server address */ + if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) { + ip4_addr_set_u32(&dhcp->server_ip_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID))); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): server 0x%08"X32_F"\n", + ip4_addr_get_u32(&dhcp->server_ip_addr))); + /* remember offered address */ + ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_handle_offer(): offer for 0x%08"X32_F"\n", + ip4_addr_get_u32(&dhcp->offered_ip_addr))); + + dhcp_select(netif); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("dhcp_handle_offer(netif=%p) did not get server ID!\n", (void*)netif)); + } +} + +/** + * Select a DHCP server offer out of all offers. + * + * Simply select the first offer received. + * + * @param netif the netif under DHCP control + * @return lwIP specific error (see error.h) + */ +static err_t +dhcp_select(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result; + u16_t msecs; + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_select(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + dhcp_set_state(dhcp, DHCP_REQUESTING); + + /* create and initialize the DHCP message header */ + result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST); + if (result == ERR_OK) { + dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); + + /* MUST request the offered IP address */ + dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); + dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr))); + + dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4); + dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->server_ip_addr))); + + dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/); + dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK); + dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER); + dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST); + dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER); + +#if LWIP_NETIF_HOSTNAME + dhcp_option_hostname(dhcp, netif); +#endif /* LWIP_NETIF_HOSTNAME */ + + dhcp_option_trailer(dhcp); + /* shrink the pbuf to the actual content length */ + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + /* send broadcast to any DHCP server */ + udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); + dhcp_delete_msg(dhcp); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_select: REQUESTING\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("dhcp_select: could not allocate DHCP request\n")); + } + dhcp->tries++; + msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_select(): set request timeout %"U16_F" msecs\n", msecs)); + return result; +} + +/** + * The DHCP timer that checks for lease renewal/rebind timeouts. + */ +void +dhcp_coarse_tmr() +{ + struct netif *netif = netif_list; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_coarse_tmr()\n")); + /* iterate through all network interfaces */ + while (netif != NULL) { + /* only act on DHCP configured interfaces */ + if (netif->dhcp != NULL) { + /* timer is active (non zero), and triggers (zeroes) now? */ + if (netif->dhcp->t2_timeout-- == 1) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t2 timeout\n")); + /* this clients' rebind timeout triggered */ + dhcp_t2_timeout(netif); + /* timer is active (non zero), and triggers (zeroes) now */ + } else if (netif->dhcp->t1_timeout-- == 1) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_coarse_tmr(): t1 timeout\n")); + /* this clients' renewal timeout triggered */ + dhcp_t1_timeout(netif); + } + } + /* proceed to next netif */ + netif = netif->next; + } +} + +/** + * DHCP transaction timeout handling + * + * A DHCP server is expected to respond within a short period of time. + * This timer checks whether an outstanding DHCP request is timed out. + */ +void +dhcp_fine_tmr() +{ + struct netif *netif = netif_list; + /* loop through netif's */ + while (netif != NULL) { + /* only act on DHCP configured interfaces */ + if (netif->dhcp != NULL) { + /* timer is active (non zero), and is about to trigger now */ + if (netif->dhcp->request_timeout > 1) { + netif->dhcp->request_timeout--; + } + else if (netif->dhcp->request_timeout == 1) { + netif->dhcp->request_timeout--; + /* { netif->dhcp->request_timeout == 0 } */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_fine_tmr(): request timeout\n")); + /* this client's request timeout triggered */ + dhcp_timeout(netif); + } + } + /* proceed to next network interface */ + netif = netif->next; + } +} + +/** + * A DHCP negotiation transaction, or ARP request, has timed out. + * + * The timer that was started with the DHCP or ARP request has + * timed out, indicating no response was received in time. + * + * @param netif the netif under DHCP control + */ +static void +dhcp_timeout(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout()\n")); + /* back-off period has passed, or server selection timed out */ + if ((dhcp->state == DHCP_BACKING_OFF) || (dhcp->state == DHCP_SELECTING)) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_timeout(): restarting discovery\n")); + dhcp_discover(netif); + /* receiving the requested lease timed out */ + } else if (dhcp->state == DHCP_REQUESTING) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, DHCP request timed out\n")); + if (dhcp->tries <= 5) { + dhcp_select(netif); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REQUESTING, releasing, restarting\n")); + dhcp_release(netif); + dhcp_discover(netif); + } +#if DHCP_DOES_ARP_CHECK + /* received no ARP reply for the offered address (which is good) */ + } else if (dhcp->state == DHCP_CHECKING) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): CHECKING, ARP request timed out\n")); + if (dhcp->tries <= 1) { + dhcp_check(netif); + /* no ARP replies on the offered address, + looks like the IP address is indeed free */ + } else { + /* bind the interface to the offered address */ + dhcp_bind(netif); + } +#endif /* DHCP_DOES_ARP_CHECK */ + } + /* did not get response to renew request? */ + else if (dhcp->state == DHCP_RENEWING) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RENEWING, DHCP request timed out\n")); + /* just retry renewal */ + /* note that the rebind timer will eventually time-out if renew does not work */ + dhcp_renew(netif); + /* did not get response to rebind request? */ + } else if (dhcp->state == DHCP_REBINDING) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): REBINDING, DHCP request timed out\n")); + if (dhcp->tries <= 8) { + dhcp_rebind(netif); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_timeout(): RELEASING, DISCOVERING\n")); + dhcp_release(netif); + dhcp_discover(netif); + } + } else if (dhcp->state == DHCP_REBOOTING) { + if (dhcp->tries < REBOOT_TRIES) { + dhcp_reboot(netif); + } else { + dhcp_discover(netif); + } + } +} + +/** + * The renewal period has timed out. + * + * @param netif the netif under DHCP control + */ +static void +dhcp_t1_timeout(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_t1_timeout()\n")); + if ((dhcp->state == DHCP_REQUESTING) || (dhcp->state == DHCP_BOUND) || + (dhcp->state == DHCP_RENEWING)) { + /* just retry to renew - note that the rebind timer (t2) will + * eventually time-out if renew tries fail. */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("dhcp_t1_timeout(): must renew\n")); + /* This slightly different to RFC2131: DHCPREQUEST will be sent from state + DHCP_RENEWING, not DHCP_BOUND */ + dhcp_renew(netif); + } +} + +/** + * The rebind period has timed out. + * + * @param netif the netif under DHCP control + */ +static void +dhcp_t2_timeout(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_t2_timeout()\n")); + if ((dhcp->state == DHCP_REQUESTING) || (dhcp->state == DHCP_BOUND) || + (dhcp->state == DHCP_RENEWING)) { + /* just retry to rebind */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("dhcp_t2_timeout(): must rebind\n")); + /* This slightly different to RFC2131: DHCPREQUEST will be sent from state + DHCP_REBINDING, not DHCP_BOUND */ + dhcp_rebind(netif); + } +} + +/** + * Handle a DHCP ACK packet + * + * @param netif the netif under DHCP control + */ +static void +dhcp_handle_ack(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; +#if LWIP_DNS + u8_t n; +#endif /* LWIP_DNS */ + + /* clear options we might not get from the ACK */ + ip_addr_set_zero(&dhcp->offered_sn_mask); + ip_addr_set_zero(&dhcp->offered_gw_addr); +#if LWIP_DHCP_BOOTP_FILE + ip_addr_set_zero(&dhcp->offered_si_addr); +#endif /* LWIP_DHCP_BOOTP_FILE */ + + /* lease time given? */ + if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) { + /* remember offered lease time */ + dhcp->offered_t0_lease = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_LEASE_TIME); + } + /* renewal period given? */ + if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T1)) { + /* remember given renewal period */ + dhcp->offered_t1_renew = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T1); + } else { + /* calculate safe periods for renewal */ + dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2; + } + + /* renewal period given? */ + if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T2)) { + /* remember given rebind period */ + dhcp->offered_t2_rebind = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T2); + } else { + /* calculate safe periods for rebinding */ + dhcp->offered_t2_rebind = dhcp->offered_t0_lease; + } + + /* (y)our internet address */ + ip_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr); + +#if LWIP_DHCP_BOOTP_FILE + /* copy boot server address, + boot file name copied in dhcp_parse_reply if not overloaded */ + ip_addr_copy(dhcp->offered_si_addr, dhcp->msg_in->siaddr); +#endif /* LWIP_DHCP_BOOTP_FILE */ + + /* subnet mask given? */ + if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) { + /* remember given subnet mask */ + ip4_addr_set_u32(&dhcp->offered_sn_mask, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK))); + dhcp->subnet_mask_given = 1; + } else { + dhcp->subnet_mask_given = 0; + } + + /* gateway router */ + if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_ROUTER)) { + ip4_addr_set_u32(&dhcp->offered_gw_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_ROUTER))); + } + +#if LWIP_DNS + /* DNS servers */ + n = 0; + while(dhcp_option_given(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n) && (n < DNS_MAX_SERVERS)) { + ip_addr_t dns_addr; + ip4_addr_set_u32(&dns_addr, htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n))); + dns_setserver(n, &dns_addr); + n++; + } +#endif /* LWIP_DNS */ +} + +/** Set a statically allocated struct dhcp to work with. + * Using this prevents dhcp_start to allocate it using mem_malloc. + * + * @param netif the netif for which to set the struct dhcp + * @param dhcp (uninitialised) dhcp struct allocated by the application + */ +void +dhcp_set_struct(struct netif *netif, struct dhcp *dhcp) +{ + LWIP_ASSERT("netif != NULL", netif != NULL); + LWIP_ASSERT("dhcp != NULL", dhcp != NULL); + LWIP_ASSERT("netif already has a struct dhcp set", netif->dhcp == NULL); + + /* clear data structure */ + memset(dhcp, 0, sizeof(struct dhcp)); + /* dhcp_set_state(&dhcp, DHCP_OFF); */ + netif->dhcp = dhcp; +} + +/** Removes a struct dhcp from a netif. + * + * ATTENTION: Only use this when not using dhcp_set_struct() to allocate the + * struct dhcp since the memory is passed back to the heap. + * + * @param netif the netif from which to remove the struct dhcp + */ +void dhcp_cleanup(struct netif *netif) +{ + LWIP_ASSERT("netif != NULL", netif != NULL); + + if (netif->dhcp != NULL) { + mem_free(netif->dhcp); + netif->dhcp = NULL; + } +} + +/** + * Start DHCP negotiation for a network interface. + * + * If no DHCP client instance was attached to this interface, + * a new client is created first. If a DHCP client instance + * was already present, it restarts negotiation. + * + * @param netif The lwIP network interface + * @return lwIP error code + * - ERR_OK - No error + * - ERR_MEM - Out of memory + */ +err_t +dhcp_start(struct netif *netif) +{ + struct dhcp *dhcp; + err_t result = ERR_OK; + + LWIP_ERROR("netif != NULL", (netif != NULL), return ERR_ARG;); + dhcp = netif->dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + /* Remove the flag that says this netif is handled by DHCP, + it is set when we succeeded starting. */ + netif->flags &= ~NETIF_FLAG_DHCP; + + /* check hwtype of the netif */ + if ((netif->flags & NETIF_FLAG_ETHARP) == 0) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): No ETHARP netif\n")); + return ERR_ARG; + } + + /* check MTU of the netif */ + if (netif->mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): Cannot use this netif with DHCP: MTU is too small\n")); + return ERR_MEM; + } + + /* no DHCP client attached yet? */ + if (dhcp == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting new DHCP client\n")); + dhcp = (struct dhcp *)mem_malloc(sizeof(struct dhcp)); + if (dhcp == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not allocate dhcp\n")); + return ERR_MEM; + } + /* store this dhcp client in the netif */ + netif->dhcp = dhcp; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): allocated dhcp")); + /* already has DHCP client attached */ + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_start(): restarting DHCP configuration\n")); + if (dhcp->pcb != NULL) { + udp_remove(dhcp->pcb); + } + LWIP_ASSERT("pbuf p_out wasn't freed", dhcp->p_out == NULL); + LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL ); + } + + /* clear data structure */ + memset(dhcp, 0, sizeof(struct dhcp)); + /* dhcp_set_state(&dhcp, DHCP_OFF); */ + /* allocate UDP PCB */ + dhcp->pcb = udp_new(); + if (dhcp->pcb == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): could not obtain pcb\n")); + return ERR_MEM; + } + ip_set_option(dhcp->pcb, SOF_BROADCAST); + /* set up local and remote port for the pcb */ + udp_bind(dhcp->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT); + udp_connect(dhcp->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT); + /* set up the recv callback and argument */ + udp_recv(dhcp->pcb, dhcp_recv, netif); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_start(): starting DHCP configuration\n")); + /* (re)start the DHCP negotiation */ + result = dhcp_discover(netif); + if (result != ERR_OK) { + /* free resources allocated above */ + dhcp_stop(netif); + return ERR_MEM; + } + /* Set the flag that says this netif is handled by DHCP. */ + netif->flags |= NETIF_FLAG_DHCP; + return result; +} + +/** + * Inform a DHCP server of our manual configuration. + * + * This informs DHCP servers of our fixed IP address configuration + * by sending an INFORM message. It does not involve DHCP address + * configuration, it is just here to be nice to the network. + * + * @param netif The lwIP network interface + */ +void +dhcp_inform(struct netif *netif) +{ + struct dhcp dhcp; + err_t result = ERR_OK; + struct udp_pcb *pcb; + + LWIP_ERROR("netif != NULL", (netif != NULL), return;); + + memset(&dhcp, 0, sizeof(struct dhcp)); + dhcp_set_state(&dhcp, DHCP_INFORM); + + if ((netif->dhcp != NULL) && (netif->dhcp->pcb != NULL)) { + /* re-use existing pcb */ + pcb = netif->dhcp->pcb; + } else { + pcb = udp_new(); + if (pcb == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_inform(): could not obtain pcb")); + return; + } + dhcp.pcb = pcb; + ip_set_option(dhcp.pcb, SOF_BROADCAST); + udp_bind(dhcp.pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_inform(): created new udp pcb\n")); + } + /* create and initialize the DHCP message header */ + result = dhcp_create_msg(netif, &dhcp, DHCP_INFORM); + if (result == ERR_OK) { + dhcp_option(&dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + dhcp_option_short(&dhcp, DHCP_MAX_MSG_LEN(netif)); + + dhcp_option_trailer(&dhcp); + + pbuf_realloc(dhcp.p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp.options_out_len); + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_inform: INFORMING\n")); + udp_sendto_if(pcb, dhcp.p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); + dhcp_delete_msg(&dhcp); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_inform: could not allocate DHCP request\n")); + } + + if (dhcp.pcb != NULL) { + /* otherwise, the existing pcb was used */ + udp_remove(dhcp.pcb); + } +} + +/** Handle a possible change in the network configuration. + * + * This enters the REBOOTING state to verify that the currently bound + * address is still valid. + */ +void +dhcp_network_changed(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + if (!dhcp) + return; + switch (dhcp->state) { + case DHCP_REBINDING: + case DHCP_RENEWING: + case DHCP_BOUND: + case DHCP_REBOOTING: + netif_set_down(netif); + dhcp->tries = 0; + dhcp_reboot(netif); + break; + case DHCP_OFF: + /* stay off */ + break; + default: + dhcp->tries = 0; +#if LWIP_DHCP_AUTOIP_COOP + if(dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) { + autoip_stop(netif); + dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF; + } +#endif /* LWIP_DHCP_AUTOIP_COOP */ + dhcp_discover(netif); + break; + } +} + +#if DHCP_DOES_ARP_CHECK +/** + * Match an ARP reply with the offered IP address. + * + * @param netif the network interface on which the reply was received + * @param addr The IP address we received a reply from + */ +void dhcp_arp_reply(struct netif *netif, ip_addr_t *addr) +{ + LWIP_ERROR("netif != NULL", (netif != NULL), return;); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_arp_reply()\n")); + /* is a DHCP client doing an ARP check? */ + if ((netif->dhcp != NULL) && (netif->dhcp->state == DHCP_CHECKING)) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_arp_reply(): CHECKING, arp reply for 0x%08"X32_F"\n", + ip4_addr_get_u32(addr))); + /* did a host respond with the address we + were offered by the DHCP server? */ + if (ip_addr_cmp(addr, &netif->dhcp->offered_ip_addr)) { + /* we will not accept the offered address */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, + ("dhcp_arp_reply(): arp reply matched with offered address, declining\n")); + dhcp_decline(netif); + } + } +} + +/** + * Decline an offered lease. + * + * Tell the DHCP server we do not accept the offered address. + * One reason to decline the lease is when we find out the address + * is already in use by another host (through ARP). + * + * @param netif the netif under DHCP control + */ +static err_t +dhcp_decline(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result = ERR_OK; + u16_t msecs; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline()\n")); + dhcp_set_state(dhcp, DHCP_BACKING_OFF); + /* create and initialize the DHCP message header */ + result = dhcp_create_msg(netif, dhcp, DHCP_DECLINE); + if (result == ERR_OK) { + dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); + dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr))); + + dhcp_option_trailer(dhcp); + /* resize pbuf to reflect true size of options */ + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + /* per section 4.4.4, broadcast DECLINE messages */ + udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); + dhcp_delete_msg(dhcp); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_decline: BACKING OFF\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("dhcp_decline: could not allocate DHCP request\n")); + } + dhcp->tries++; + msecs = 10*1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_decline(): set request timeout %"U16_F" msecs\n", msecs)); + return result; +} +#endif /* DHCP_DOES_ARP_CHECK */ + + +/** + * Start the DHCP process, discover a DHCP server. + * + * @param netif the netif under DHCP control + */ +static err_t +dhcp_discover(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result = ERR_OK; + u16_t msecs; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover()\n")); + ip_addr_set_any(&dhcp->offered_ip_addr); + dhcp_set_state(dhcp, DHCP_SELECTING); + /* create and initialize the DHCP message header */ + result = dhcp_create_msg(netif, dhcp, DHCP_DISCOVER); + if (result == ERR_OK) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: making request\n")); + + dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); + + dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, 4/*num options*/); + dhcp_option_byte(dhcp, DHCP_OPTION_SUBNET_MASK); + dhcp_option_byte(dhcp, DHCP_OPTION_ROUTER); + dhcp_option_byte(dhcp, DHCP_OPTION_BROADCAST); + dhcp_option_byte(dhcp, DHCP_OPTION_DNS_SERVER); + + dhcp_option_trailer(dhcp); + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: realloc()ing\n")); + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)\n")); + udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_discover: deleting()ing\n")); + dhcp_delete_msg(dhcp); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover: SELECTING\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_discover: could not allocate DHCP request\n")); + } + dhcp->tries++; +#if LWIP_DHCP_AUTOIP_COOP + if(dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) { + dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON; + autoip_start(netif); + } +#endif /* LWIP_DHCP_AUTOIP_COOP */ + msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_discover(): set request timeout %"U16_F" msecs\n", msecs)); + return result; +} + + +/** + * Bind the interface to the offered IP address. + * + * @param netif network interface to bind to the offered address + */ +static void +dhcp_bind(struct netif *netif) +{ + u32_t timeout; + struct dhcp *dhcp; + ip_addr_t sn_mask, gw_addr; + LWIP_ERROR("dhcp_bind: netif != NULL", (netif != NULL), return;); + dhcp = netif->dhcp; + LWIP_ERROR("dhcp_bind: dhcp != NULL", (dhcp != NULL), return;); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num)); + + /* temporary DHCP lease? */ + if (dhcp->offered_t1_renew != 0xffffffffUL) { + /* set renewal period timer */ + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t1 renewal timer %"U32_F" secs\n", dhcp->offered_t1_renew)); + timeout = (dhcp->offered_t1_renew + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS; + if(timeout > 0xffff) { + timeout = 0xffff; + } + dhcp->t1_timeout = (u16_t)timeout; + if (dhcp->t1_timeout == 0) { + dhcp->t1_timeout = 1; + } + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t1_renew*1000)); + } + /* set renewal period timer */ + if (dhcp->offered_t2_rebind != 0xffffffffUL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_bind(): t2 rebind timer %"U32_F" secs\n", dhcp->offered_t2_rebind)); + timeout = (dhcp->offered_t2_rebind + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS; + if(timeout > 0xffff) { + timeout = 0xffff; + } + dhcp->t2_timeout = (u16_t)timeout; + if (dhcp->t2_timeout == 0) { + dhcp->t2_timeout = 1; + } + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_bind(): set request timeout %"U32_F" msecs\n", dhcp->offered_t2_rebind*1000)); + } + + /* If we have sub 1 minute lease, t2 and t1 will kick in at the same time. */ + if ((dhcp->t1_timeout >= dhcp->t2_timeout) && (dhcp->t2_timeout > 0)) { + dhcp->t1_timeout = 0; + } + + if (dhcp->subnet_mask_given) { + /* copy offered network mask */ + ip_addr_copy(sn_mask, dhcp->offered_sn_mask); + } else { + /* subnet mask not given, choose a safe subnet mask given the network class */ + u8_t first_octet = ip4_addr1(&dhcp->offered_ip_addr); + if (first_octet <= 127) { + ip4_addr_set_u32(&sn_mask, PP_HTONL(0xff000000UL)); + } else if (first_octet >= 192) { + ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffffff00UL)); + } else { + ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffff0000UL)); + } + } + + ip_addr_copy(gw_addr, dhcp->offered_gw_addr); + /* gateway address not given? */ + if (ip_addr_isany(&gw_addr)) { + /* copy network address */ + ip_addr_get_network(&gw_addr, &dhcp->offered_ip_addr, &sn_mask); + /* use first host address on network as gateway */ + ip4_addr_set_u32(&gw_addr, ip4_addr_get_u32(&gw_addr) | PP_HTONL(0x00000001UL)); + } + +#if LWIP_DHCP_AUTOIP_COOP + if(dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) { + autoip_stop(netif); + dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF; + } +#endif /* LWIP_DHCP_AUTOIP_COOP */ + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): IP: 0x%08"X32_F"\n", + ip4_addr_get_u32(&dhcp->offered_ip_addr))); + netif_set_ipaddr(netif, &dhcp->offered_ip_addr); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): SN: 0x%08"X32_F"\n", + ip4_addr_get_u32(&sn_mask))); + netif_set_netmask(netif, &sn_mask); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, ("dhcp_bind(): GW: 0x%08"X32_F"\n", + ip4_addr_get_u32(&gw_addr))); + netif_set_gw(netif, &gw_addr); + /* bring the interface up */ + netif_set_up(netif); + /* netif is now bound to DHCP leased address */ + dhcp_set_state(dhcp, DHCP_BOUND); +} + +/** + * Renew an existing DHCP lease at the involved DHCP server. + * + * @param netif network interface which must renew its lease + */ +err_t +dhcp_renew(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result; + u16_t msecs; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_renew()\n")); + dhcp_set_state(dhcp, DHCP_RENEWING); + + /* create and initialize the DHCP message header */ + result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST); + if (result == ERR_OK) { + dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); + +#if 0 + dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); + dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr)); +#endif + +#if 0 + dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4); + dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr)); +#endif + +#if LWIP_NETIF_HOSTNAME + dhcp_option_hostname(dhcp, netif); +#endif /* LWIP_NETIF_HOSTNAME */ + + /* append DHCP message trailer */ + dhcp_option_trailer(dhcp); + + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + udp_sendto_if(dhcp->pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif); + dhcp_delete_msg(dhcp); + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew: RENEWING\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_renew: could not allocate DHCP request\n")); + } + dhcp->tries++; + /* back-off on retries, but to a maximum of 20 seconds */ + msecs = dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_renew(): set request timeout %"U16_F" msecs\n", msecs)); + return result; +} + +/** + * Rebind with a DHCP server for an existing DHCP lease. + * + * @param netif network interface which must rebind with a DHCP server + */ +static err_t +dhcp_rebind(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result; + u16_t msecs; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind()\n")); + dhcp_set_state(dhcp, DHCP_REBINDING); + + /* create and initialize the DHCP message header */ + result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST); + if (result == ERR_OK) { + dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif)); + +#if LWIP_NETIF_HOSTNAME + dhcp_option_hostname(dhcp, netif); +#endif /* LWIP_NETIF_HOSTNAME */ + +#if 0 + dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); + dhcp_option_long(dhcp, ntohl(dhcp->offered_ip_addr.addr)); + + dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4); + dhcp_option_long(dhcp, ntohl(dhcp->server_ip_addr.addr)); +#endif + + dhcp_option_trailer(dhcp); + + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + /* broadcast to server */ + udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); + dhcp_delete_msg(dhcp); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind: REBINDING\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_rebind: could not allocate DHCP request\n")); + } + dhcp->tries++; + msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_rebind(): set request timeout %"U16_F" msecs\n", msecs)); + return result; +} + +/** + * Enter REBOOTING state to verify an existing lease + * + * @param netif network interface which must reboot + */ +static err_t +dhcp_reboot(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result; + u16_t msecs; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot()\n")); + dhcp_set_state(dhcp, DHCP_REBOOTING); + + /* create and initialize the DHCP message header */ + result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST); + if (result == ERR_OK) { + dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN); + dhcp_option_short(dhcp, 576); + + dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4); + dhcp_option_long(dhcp, ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr))); + + dhcp_option_trailer(dhcp); + + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + /* broadcast to server */ + udp_sendto_if(dhcp->pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif); + dhcp_delete_msg(dhcp); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot: REBOOTING\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_reboot: could not allocate DHCP request\n")); + } + dhcp->tries++; + msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_reboot(): set request timeout %"U16_F" msecs\n", msecs)); + return result; +} + + +/** + * Release a DHCP lease. + * + * @param netif network interface which must release its lease + */ +err_t +dhcp_release(struct netif *netif) +{ + struct dhcp *dhcp = netif->dhcp; + err_t result; + u16_t msecs; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_release()\n")); + + /* idle DHCP client */ + dhcp_set_state(dhcp, DHCP_OFF); + /* clean old DHCP offer */ + ip_addr_set_zero(&dhcp->server_ip_addr); + ip_addr_set_zero(&dhcp->offered_ip_addr); + ip_addr_set_zero(&dhcp->offered_sn_mask); + ip_addr_set_zero(&dhcp->offered_gw_addr); +#if LWIP_DHCP_BOOTP_FILE + ip_addr_set_zero(&dhcp->offered_si_addr); +#endif /* LWIP_DHCP_BOOTP_FILE */ + dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0; + + /* create and initialize the DHCP message header */ + result = dhcp_create_msg(netif, dhcp, DHCP_RELEASE); + if (result == ERR_OK) { + dhcp_option_trailer(dhcp); + + pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len); + + udp_sendto_if(dhcp->pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif); + dhcp_delete_msg(dhcp); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release: RELEASED, DHCP_OFF\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("dhcp_release: could not allocate DHCP request\n")); + } + dhcp->tries++; + msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000; + dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("dhcp_release(): set request timeout %"U16_F" msecs\n", msecs)); + /* bring the interface down */ + netif_set_down(netif); + /* remove IP address from interface */ + netif_set_ipaddr(netif, IP_ADDR_ANY); + netif_set_gw(netif, IP_ADDR_ANY); + netif_set_netmask(netif, IP_ADDR_ANY); + + return result; +} + +/** + * Remove the DHCP client from the interface. + * + * @param netif The network interface to stop DHCP on + */ +void +dhcp_stop(struct netif *netif) +{ + struct dhcp *dhcp; + LWIP_ERROR("dhcp_stop: netif != NULL", (netif != NULL), return;); + dhcp = netif->dhcp; + /* Remove the flag that says this netif is handled by DHCP. */ + netif->flags &= ~NETIF_FLAG_DHCP; + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_stop()\n")); + /* netif is DHCP configured? */ + if (dhcp != NULL) { +#if LWIP_DHCP_AUTOIP_COOP + if(dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) { + autoip_stop(netif); + dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF; + } +#endif /* LWIP_DHCP_AUTOIP_COOP */ + + if (dhcp->pcb != NULL) { + udp_remove(dhcp->pcb); + dhcp->pcb = NULL; + } + LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL); + dhcp_set_state(dhcp, DHCP_OFF); + } +} + +/* + * Set the DHCP state of a DHCP client. + * + * If the state changed, reset the number of tries. + */ +static void +dhcp_set_state(struct dhcp *dhcp, u8_t new_state) +{ + if (new_state != dhcp->state) { + dhcp->state = new_state; + dhcp->tries = 0; + dhcp->request_timeout = 0; + } +} + +/* + * Concatenate an option type and length field to the outgoing + * DHCP message. + * + */ +static void +dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len) +{ + LWIP_ASSERT("dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN); + dhcp->msg_out->options[dhcp->options_out_len++] = option_type; + dhcp->msg_out->options[dhcp->options_out_len++] = option_len; +} +/* + * Concatenate a single byte to the outgoing DHCP message. + * + */ +static void +dhcp_option_byte(struct dhcp *dhcp, u8_t value) +{ + LWIP_ASSERT("dhcp_option_byte: dhcp->options_out_len < DHCP_OPTIONS_LEN", dhcp->options_out_len < DHCP_OPTIONS_LEN); + dhcp->msg_out->options[dhcp->options_out_len++] = value; +} + +static void +dhcp_option_short(struct dhcp *dhcp, u16_t value) +{ + LWIP_ASSERT("dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN); + dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8); + dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU); +} + +static void +dhcp_option_long(struct dhcp *dhcp, u32_t value) +{ + LWIP_ASSERT("dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN); + dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24); + dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16); + dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8); + dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x000000ffUL)); +} + +#if LWIP_NETIF_HOSTNAME +static void +dhcp_option_hostname(struct dhcp *dhcp, struct netif *netif) +{ + if (netif->hostname != NULL) { + size_t namelen = strlen(netif->hostname); + if (namelen > 0) { + u8_t len; + const char *p = netif->hostname; + /* Shrink len to available bytes (need 2 bytes for OPTION_HOSTNAME + and 1 byte for trailer) */ + size_t available = DHCP_OPTIONS_LEN - dhcp->options_out_len - 3; + LWIP_ASSERT("DHCP: hostname is too long!", namelen <= available); + len = LWIP_MIN(namelen, available); + dhcp_option(dhcp, DHCP_OPTION_HOSTNAME, len); + while (len--) { + dhcp_option_byte(dhcp, *p++); + } + } + } +} +#endif /* LWIP_NETIF_HOSTNAME */ + +/** + * Extract the DHCP message and the DHCP options. + * + * Extract the DHCP message and the DHCP options, each into a contiguous + * piece of memory. As a DHCP message is variable sized by its options, + * and also allows overriding some fields for options, the easy approach + * is to first unfold the options into a conitguous piece of memory, and + * use that further on. + * + */ +static err_t +dhcp_parse_reply(struct dhcp *dhcp, struct pbuf *p) +{ + u8_t *options; + u16_t offset; + u16_t offset_max; + u16_t options_idx; + u16_t options_idx_max; + struct pbuf *q; + int parse_file_as_options = 0; + int parse_sname_as_options = 0; + + /* clear received options */ + dhcp_clear_all_options(dhcp); + /* check that beginning of dhcp_msg (up to and including chaddr) is in first pbuf */ + if (p->len < DHCP_SNAME_OFS) { + return ERR_BUF; + } + dhcp->msg_in = (struct dhcp_msg *)p->payload; +#if LWIP_DHCP_BOOTP_FILE + /* clear boot file name */ + dhcp->boot_file_name[0] = 0; +#endif /* LWIP_DHCP_BOOTP_FILE */ + + /* parse options */ + + /* start with options field */ + options_idx = DHCP_OPTIONS_OFS; + /* parse options to the end of the received packet */ + options_idx_max = p->tot_len; +again: + q = p; + while((q != NULL) && (options_idx >= q->len)) { + options_idx -= q->len; + options_idx_max -= q->len; + q = q->next; + } + if (q == NULL) { + return ERR_BUF; + } + offset = options_idx; + offset_max = options_idx_max; + options = (u8_t*)q->payload; + /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */ + while((q != NULL) && (options[offset] != DHCP_OPTION_END) && (offset < offset_max)) { + u8_t op = options[offset]; + u8_t len; + u8_t decode_len = 0; + int decode_idx = -1; + u16_t val_offset = offset + 2; + /* len byte might be in the next pbuf */ + if (offset + 1 < q->len) { + len = options[offset + 1]; + } else { + len = (q->next != NULL ? ((u8_t*)q->next->payload)[0] : 0); + } + /* LWIP_DEBUGF(DHCP_DEBUG, ("msg_offset=%"U16_F", q->len=%"U16_F, msg_offset, q->len)); */ + decode_len = len; + switch(op) { + /* case(DHCP_OPTION_END): handled above */ + case(DHCP_OPTION_PAD): + /* special option: no len encoded */ + decode_len = len = 0; + /* will be increased below */ + offset--; + break; + case(DHCP_OPTION_SUBNET_MASK): + LWIP_ERROR("len == 4", len == 4, return ERR_VAL;); + decode_idx = DHCP_OPTION_IDX_SUBNET_MASK; + break; + case(DHCP_OPTION_ROUTER): + decode_len = 4; /* only copy the first given router */ + LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;); + decode_idx = DHCP_OPTION_IDX_ROUTER; + break; + case(DHCP_OPTION_DNS_SERVER): + /* special case: there might be more than one server */ + LWIP_ERROR("len % 4 == 0", len % 4 == 0, return ERR_VAL;); + /* limit number of DNS servers */ + decode_len = LWIP_MIN(len, 4 * DNS_MAX_SERVERS); + LWIP_ERROR("len >= decode_len", len >= decode_len, return ERR_VAL;); + decode_idx = DHCP_OPTION_IDX_DNS_SERVER; + break; + case(DHCP_OPTION_LEASE_TIME): + LWIP_ERROR("len == 4", len == 4, return ERR_VAL;); + decode_idx = DHCP_OPTION_IDX_LEASE_TIME; + break; + case(DHCP_OPTION_OVERLOAD): + LWIP_ERROR("len == 1", len == 1, return ERR_VAL;); + decode_idx = DHCP_OPTION_IDX_OVERLOAD; + break; + case(DHCP_OPTION_MESSAGE_TYPE): + LWIP_ERROR("len == 1", len == 1, return ERR_VAL;); + decode_idx = DHCP_OPTION_IDX_MSG_TYPE; + break; + case(DHCP_OPTION_SERVER_ID): + LWIP_ERROR("len == 4", len == 4, return ERR_VAL;); + decode_idx = DHCP_OPTION_IDX_SERVER_ID; + break; + case(DHCP_OPTION_T1): + LWIP_ERROR("len == 4", len == 4, return ERR_VAL;); + decode_idx = DHCP_OPTION_IDX_T1; + break; + case(DHCP_OPTION_T2): + LWIP_ERROR("len == 4", len == 4, return ERR_VAL;); + decode_idx = DHCP_OPTION_IDX_T2; + break; + default: + decode_len = 0; + LWIP_DEBUGF(DHCP_DEBUG, ("skipping option %"U16_F" in options\n", op)); + break; + } + offset += len + 2; + if (decode_len > 0) { + u32_t value = 0; + u16_t copy_len; +decode_next: + LWIP_ASSERT("check decode_idx", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX); + if (!dhcp_option_given(dhcp, decode_idx)) { + copy_len = LWIP_MIN(decode_len, 4); + pbuf_copy_partial(q, &value, copy_len, val_offset); + if (decode_len > 4) { + /* decode more than one u32_t */ + LWIP_ERROR("decode_len % 4 == 0", decode_len % 4 == 0, return ERR_VAL;); + dhcp_got_option(dhcp, decode_idx); + dhcp_set_option_value(dhcp, decode_idx, htonl(value)); + decode_len -= 4; + val_offset += 4; + decode_idx++; + goto decode_next; + } else if (decode_len == 4) { + value = ntohl(value); + } else { + LWIP_ERROR("invalid decode_len", decode_len == 1, return ERR_VAL;); + value = ((u8_t*)&value)[0]; + } + dhcp_got_option(dhcp, decode_idx); + dhcp_set_option_value(dhcp, decode_idx, value); + } + } + if (offset >= q->len) { + offset -= q->len; + offset_max -= q->len; + if ((offset < offset_max) && offset_max) { + q = q->next; + LWIP_ASSERT("next pbuf was null", q); + options = (u8_t*)q->payload; + } else { + // We've run out of bytes, probably no end marker. Don't proceed. + break; + } + } + } + /* is this an overloaded message? */ + if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) { + u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD); + dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD); + if (overload == DHCP_OVERLOAD_FILE) { + parse_file_as_options = 1; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded file field\n")); + } else if (overload == DHCP_OVERLOAD_SNAME) { + parse_sname_as_options = 1; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname field\n")); + } else if (overload == DHCP_OVERLOAD_SNAME_FILE) { + parse_sname_as_options = 1; + parse_file_as_options = 1; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("overloaded sname and file field\n")); + } else { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("invalid overload option: %d\n", (int)overload)); + } +#if LWIP_DHCP_BOOTP_FILE + if (!parse_file_as_options) { + /* only do this for ACK messages */ + if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE) && + (dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE) == DHCP_ACK)) + /* copy bootp file name, don't care for sname (server hostname) */ + pbuf_copy_partial(p, dhcp->boot_file_name, DHCP_FILE_LEN-1, DHCP_FILE_OFS); + /* make sure the string is really NULL-terminated */ + dhcp->boot_file_name[DHCP_FILE_LEN-1] = 0; + } +#endif /* LWIP_DHCP_BOOTP_FILE */ + } + if (parse_file_as_options) { + /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */ + parse_file_as_options = 0; + options_idx = DHCP_FILE_OFS; + options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN; + goto again; + } else if (parse_sname_as_options) { + parse_sname_as_options = 0; + options_idx = DHCP_SNAME_OFS; + options_idx_max = DHCP_SNAME_OFS + DHCP_SNAME_LEN; + goto again; + } + return ERR_OK; +} + +/** + * If an incoming DHCP message is in response to us, then trigger the state machine + */ +static void +dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port) +{ + struct netif *netif = (struct netif *)arg; + struct dhcp *dhcp = netif->dhcp; + struct dhcp_msg *reply_msg = (struct dhcp_msg *)p->payload; + u8_t msg_type; + u8_t i; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_recv(pbuf = %p) from DHCP server %"U16_F".%"U16_F".%"U16_F".%"U16_F" port %"U16_F"\n", (void*)p, + ip4_addr1_16(addr), ip4_addr2_16(addr), ip4_addr3_16(addr), ip4_addr4_16(addr), port)); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("pbuf->len = %"U16_F"\n", p->len)); + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("pbuf->tot_len = %"U16_F"\n", p->tot_len)); + /* prevent warnings about unused arguments */ + LWIP_UNUSED_ARG(pcb); + LWIP_UNUSED_ARG(addr); + LWIP_UNUSED_ARG(port); + + LWIP_ASSERT("reply wasn't freed", dhcp->msg_in == NULL); + + if (p->len < DHCP_MIN_REPLY_LEN) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP reply message or pbuf too short\n")); + goto free_pbuf_and_return; + } + + if (reply_msg->op != DHCP_BOOTREPLY) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("not a DHCP reply message, but type %"U16_F"\n", (u16_t)reply_msg->op)); + goto free_pbuf_and_return; + } + /* iterate through hardware address and match against DHCP message */ + for (i = 0; i < netif->hwaddr_len; i++) { + if (netif->hwaddr[i] != reply_msg->chaddr[i]) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, + ("netif->hwaddr[%"U16_F"]==%02"X16_F" != reply_msg->chaddr[%"U16_F"]==%02"X16_F"\n", + (u16_t)i, (u16_t)netif->hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i])); + goto free_pbuf_and_return; + } + } + /* match transaction ID against what we expected */ + if (ntohl(reply_msg->xid) != dhcp->xid) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, + ("transaction id mismatch reply_msg->xid(%"X32_F")!=dhcp->xid(%"X32_F")\n",ntohl(reply_msg->xid),dhcp->xid)); + goto free_pbuf_and_return; + } + /* option fields could be unfold? */ + if (dhcp_parse_reply(dhcp, p) != ERR_OK) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("problem unfolding DHCP message - too short on memory?\n")); + goto free_pbuf_and_return; + } + + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("searching DHCP_OPTION_MESSAGE_TYPE\n")); + /* obtain pointer to DHCP message type */ + if (!dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE)) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("DHCP_OPTION_MESSAGE_TYPE option not found\n")); + goto free_pbuf_and_return; + } + + /* read DHCP message type */ + msg_type = (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE); + /* message type is DHCP ACK? */ + if (msg_type == DHCP_ACK) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_ACK received\n")); + /* in requesting state? */ + if (dhcp->state == DHCP_REQUESTING) { + dhcp_handle_ack(netif); +#if DHCP_DOES_ARP_CHECK + /* check if the acknowledged lease address is already in use */ + dhcp_check(netif); +#else + /* bind interface to the acknowledged lease address */ + dhcp_bind(netif); +#endif + } + /* already bound to the given lease address? */ + else if ((dhcp->state == DHCP_REBOOTING) || (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING)) { + dhcp_bind(netif); + } + } + /* received a DHCP_NAK in appropriate state? */ + else if ((msg_type == DHCP_NAK) && + ((dhcp->state == DHCP_REBOOTING) || (dhcp->state == DHCP_REQUESTING) || + (dhcp->state == DHCP_REBINDING) || (dhcp->state == DHCP_RENEWING ))) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_NAK received\n")); + dhcp_handle_nak(netif); + } + /* received a DHCP_OFFER in DHCP_SELECTING state? */ + else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_SELECTING)) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("DHCP_OFFER received in DHCP_SELECTING state\n")); + dhcp->request_timeout = 0; + /* remember offered lease */ + dhcp_handle_offer(netif); + } +free_pbuf_and_return: + dhcp->msg_in = NULL; + pbuf_free(p); +} + +/** + * Create a DHCP request, fill in common headers + * + * @param netif the netif under DHCP control + * @param dhcp dhcp control struct + * @param message_type message type of the request + */ +static err_t +dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type) +{ + u16_t i; +#ifndef DHCP_GLOBAL_XID + /** default global transaction identifier starting value (easy to match + * with a packet analyser). We simply increment for each new request. + * Predefine DHCP_GLOBAL_XID to a better value or a function call to generate one + * at runtime, any supporting function prototypes can be defined in DHCP_GLOBAL_XID_HEADER */ +#if DHCP_CREATE_RAND_XID && defined(LWIP_RAND) + static u32_t xid; +#else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */ + static u32_t xid = 0xABCD0000; +#endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */ +#else + if (!xid_initialised) { + xid = DHCP_GLOBAL_XID; + xid_initialised = !xid_initialised; + } +#endif + LWIP_ERROR("dhcp_create_msg: netif != NULL", (netif != NULL), return ERR_ARG;); + LWIP_ERROR("dhcp_create_msg: dhcp != NULL", (dhcp != NULL), return ERR_VAL;); + LWIP_ASSERT("dhcp_create_msg: dhcp->p_out == NULL", dhcp->p_out == NULL); + LWIP_ASSERT("dhcp_create_msg: dhcp->msg_out == NULL", dhcp->msg_out == NULL); + dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM); + if (dhcp->p_out == NULL) { + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("dhcp_create_msg(): could not allocate pbuf\n")); + return ERR_MEM; + } + LWIP_ASSERT("dhcp_create_msg: check that first pbuf can hold struct dhcp_msg", + (dhcp->p_out->len >= sizeof(struct dhcp_msg))); + + /* reuse transaction identifier in retransmissions */ + if (dhcp->tries == 0) { +#if DHCP_CREATE_RAND_XID && defined(LWIP_RAND) + xid = LWIP_RAND(); +#else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */ + xid++; +#endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */ + } + dhcp->xid = xid; + LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, + ("transaction id xid(%"X32_F")\n", xid)); + + dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload; + + dhcp->msg_out->op = DHCP_BOOTREQUEST; + /* TODO: make link layer independent */ + dhcp->msg_out->htype = DHCP_HTYPE_ETH; + dhcp->msg_out->hlen = netif->hwaddr_len; + dhcp->msg_out->hops = 0; + dhcp->msg_out->xid = htonl(dhcp->xid); + dhcp->msg_out->secs = 0; + /* we don't need the broadcast flag since we can receive unicast traffic + before being fully configured! */ + dhcp->msg_out->flags = 0; + ip_addr_set_zero(&dhcp->msg_out->ciaddr); + /* set ciaddr to netif->ip_addr based on message_type and state */ + if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) || + ((message_type == DHCP_REQUEST) && /* DHCP_BOUND not used for sending! */ + ((dhcp->state==DHCP_RENEWING) || dhcp->state==DHCP_REBINDING))) { + ip_addr_copy(dhcp->msg_out->ciaddr, netif->ip_addr); + } + ip_addr_set_zero(&dhcp->msg_out->yiaddr); + ip_addr_set_zero(&dhcp->msg_out->siaddr); + ip_addr_set_zero(&dhcp->msg_out->giaddr); + for (i = 0; i < DHCP_CHADDR_LEN; i++) { + /* copy netif hardware address, pad with zeroes */ + dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len) ? netif->hwaddr[i] : 0/* pad byte*/; + } + for (i = 0; i < DHCP_SNAME_LEN; i++) { + dhcp->msg_out->sname[i] = 0; + } + for (i = 0; i < DHCP_FILE_LEN; i++) { + dhcp->msg_out->file[i] = 0; + } + dhcp->msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE); + dhcp->options_out_len = 0; + /* fill options field with an incrementing array (for debugging purposes) */ + for (i = 0; i < DHCP_OPTIONS_LEN; i++) { + dhcp->msg_out->options[i] = (u8_t)i; /* for debugging only, no matter if truncated */ + } + /* Add option MESSAGE_TYPE */ + dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN); + dhcp_option_byte(dhcp, message_type); + return ERR_OK; +} + +/** + * Free previously allocated memory used to send a DHCP request. + * + * @param dhcp the dhcp struct to free the request from + */ +static void +dhcp_delete_msg(struct dhcp *dhcp) +{ + LWIP_ERROR("dhcp_delete_msg: dhcp != NULL", (dhcp != NULL), return;); + LWIP_ASSERT("dhcp_delete_msg: dhcp->p_out != NULL", dhcp->p_out != NULL); + LWIP_ASSERT("dhcp_delete_msg: dhcp->msg_out != NULL", dhcp->msg_out != NULL); + if (dhcp->p_out != NULL) { + pbuf_free(dhcp->p_out); + } + dhcp->p_out = NULL; + dhcp->msg_out = NULL; +} + +/** + * Add a DHCP message trailer + * + * Adds the END option to the DHCP message, and if + * necessary, up to three padding bytes. + * + * @param dhcp DHCP state structure + */ +static void +dhcp_option_trailer(struct dhcp *dhcp) +{ + LWIP_ERROR("dhcp_option_trailer: dhcp != NULL", (dhcp != NULL), return;); + LWIP_ASSERT("dhcp_option_trailer: dhcp->msg_out != NULL\n", dhcp->msg_out != NULL); + LWIP_ASSERT("dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\n", dhcp->options_out_len < DHCP_OPTIONS_LEN); + dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END; + /* packet is too small, or not 4 byte aligned? */ + while (((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) && + (dhcp->options_out_len < DHCP_OPTIONS_LEN)) { + /* add a fill/padding byte */ + dhcp->msg_out->options[dhcp->options_out_len++] = 0; + } +} + +#endif /* LWIP_DHCP */ diff --git a/third_party/lwip-1.4.1/src/core/dns.c b/third_party/lwip-1.4.1/src/core/dns.c new file mode 100644 index 0000000..0beda65 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/dns.c @@ -0,0 +1,970 @@ +/** + * @file + * DNS - host name to IP address resolver. + * + */ + +/** + + * This file implements a DNS host name to IP address resolver. + + * Port to lwIP from uIP + * by Jim Pettinato April 2007 + + * uIP version Copyright (c) 2002-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * DNS.C + * + * The lwIP DNS resolver functions are used to lookup a host name and + * map it to a numerical IP address. It maintains a list of resolved + * hostnames that can be queried with the dns_lookup() function. + * New hostnames can be resolved using the dns_query() function. + * + * The lwIP version of the resolver also adds a non-blocking version of + * gethostbyname() that will work with a raw API application. This function + * checks for an IP address string first and converts it if it is valid. + * gethostbyname() then does a dns_lookup() to see if the name is + * already in the table. If so, the IP is returned. If not, a query is + * issued and the function returns with a ERR_INPROGRESS status. The app + * using the dns client must then go into a waiting state. + * + * Once a hostname has been resolved (or found to be non-existent), + * the resolver code calls a specified callback function (which + * must be implemented by the module that uses the resolver). + */ + +/*----------------------------------------------------------------------------- + * RFC 1035 - Domain names - implementation and specification + * RFC 2181 - Clarifications to the DNS Specification + *----------------------------------------------------------------------------*/ + +/** @todo: define good default values (rfc compliance) */ +/** @todo: improve answer parsing, more checkings... */ +/** @todo: check RFC1035 - 7.3. Processing responses */ + +/*----------------------------------------------------------------------------- + * Includes + *----------------------------------------------------------------------------*/ + +#include "lwip/opt.h" + +#if LWIP_DNS /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/udp.h" +#include "lwip/mem.h" +#include "lwip/memp.h" +#include "lwip/dns.h" + +#include + +/** DNS server IP address */ +#ifndef DNS_SERVER_ADDRESS +#define DNS_SERVER_ADDRESS(ipaddr) (ip4_addr_set_u32(ipaddr, ipaddr_addr("208.67.222.222"))) /* resolver1.opendns.com */ +#endif + +/** DNS server port address */ +#ifndef DNS_SERVER_PORT +#define DNS_SERVER_PORT 53 +#endif + +/** DNS maximum number of retries when asking for a name, before "timeout". */ +#ifndef DNS_MAX_RETRIES +#define DNS_MAX_RETRIES 4 +#endif + +/** DNS resource record max. TTL (one week as default) */ +#ifndef DNS_MAX_TTL +#define DNS_MAX_TTL 604800 +#endif + +/* DNS protocol flags */ +#define DNS_FLAG1_RESPONSE 0x80 +#define DNS_FLAG1_OPCODE_STATUS 0x10 +#define DNS_FLAG1_OPCODE_INVERSE 0x08 +#define DNS_FLAG1_OPCODE_STANDARD 0x00 +#define DNS_FLAG1_AUTHORATIVE 0x04 +#define DNS_FLAG1_TRUNC 0x02 +#define DNS_FLAG1_RD 0x01 +#define DNS_FLAG2_RA 0x80 +#define DNS_FLAG2_ERR_MASK 0x0f +#define DNS_FLAG2_ERR_NONE 0x00 +#define DNS_FLAG2_ERR_NAME 0x03 + +/* DNS protocol states */ +#define DNS_STATE_UNUSED 0 +#define DNS_STATE_NEW 1 +#define DNS_STATE_ASKING 2 +#define DNS_STATE_DONE 3 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** DNS message header */ +struct dns_hdr { + PACK_STRUCT_FIELD(u16_t id); + PACK_STRUCT_FIELD(u8_t flags1); + PACK_STRUCT_FIELD(u8_t flags2); + PACK_STRUCT_FIELD(u16_t numquestions); + PACK_STRUCT_FIELD(u16_t numanswers); + PACK_STRUCT_FIELD(u16_t numauthrr); + PACK_STRUCT_FIELD(u16_t numextrarr); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#define SIZEOF_DNS_HDR 12 + +/** DNS query message structure. + No packing needed: only used locally on the stack. */ +struct dns_query { + /* DNS query record starts with either a domain name or a pointer + to a name already present somewhere in the packet. */ + u16_t type; + u16_t cls; +}; +#define SIZEOF_DNS_QUERY 4 + +/** DNS answer message structure. + No packing needed: only used locally on the stack. */ +struct dns_answer { + /* DNS answer record starts with either a domain name or a pointer + to a name already present somewhere in the packet. */ + u16_t type; + u16_t cls; + u32_t ttl; + u16_t len; +}; +#define SIZEOF_DNS_ANSWER 10 + +/** DNS table entry */ +struct dns_table_entry { + u8_t state; + u8_t numdns; + u8_t tmr; + u8_t retries; + u8_t seqno; + u8_t err; + u32_t ttl; + char name[DNS_MAX_NAME_LENGTH]; + ip_addr_t ipaddr; + /* pointer to callback on DNS query done */ + dns_found_callback found; + void *arg; +}; + +#if DNS_LOCAL_HOSTLIST + +#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC +/** Local host-list. For hostnames in this list, no + * external name resolution is performed */ +static struct local_hostlist_entry *local_hostlist_dynamic; +#else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + +/** Defining this allows the local_hostlist_static to be placed in a different + * linker section (e.g. FLASH) */ +#ifndef DNS_LOCAL_HOSTLIST_STORAGE_PRE +#define DNS_LOCAL_HOSTLIST_STORAGE_PRE static +#endif /* DNS_LOCAL_HOSTLIST_STORAGE_PRE */ +/** Defining this allows the local_hostlist_static to be placed in a different + * linker section (e.g. FLASH) */ +#ifndef DNS_LOCAL_HOSTLIST_STORAGE_POST +#define DNS_LOCAL_HOSTLIST_STORAGE_POST +#endif /* DNS_LOCAL_HOSTLIST_STORAGE_POST */ +DNS_LOCAL_HOSTLIST_STORAGE_PRE struct local_hostlist_entry local_hostlist_static[] + DNS_LOCAL_HOSTLIST_STORAGE_POST = DNS_LOCAL_HOSTLIST_INIT; + +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + +static void dns_init_local(); +#endif /* DNS_LOCAL_HOSTLIST */ + + +/* forward declarations */ +static void dns_recv(void *s, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port); +static void dns_check_entries(void); + +/*----------------------------------------------------------------------------- + * Globales + *----------------------------------------------------------------------------*/ + +/* DNS variables */ +static struct udp_pcb *dns_pcb; +static u8_t dns_seqno; +static struct dns_table_entry dns_table[DNS_TABLE_SIZE]; +static ip_addr_t dns_servers[DNS_MAX_SERVERS]; +/** Contiguous buffer for processing responses */ +static u8_t dns_payload_buffer[LWIP_MEM_ALIGN_BUFFER(DNS_MSG_SIZE)]; +static u8_t* dns_payload; + +/** + * Initialize the resolver: set up the UDP pcb and configure the default server + * (DNS_SERVER_ADDRESS). + */ +void +dns_init() +{ + ip_addr_t dnsserver; + + dns_payload = (u8_t *)LWIP_MEM_ALIGN(dns_payload_buffer); + + /* initialize default DNS server address */ + DNS_SERVER_ADDRESS(&dnsserver); + + LWIP_DEBUGF(DNS_DEBUG, ("dns_init: initializing\n")); + + /* if dns client not yet initialized... */ + if (dns_pcb == NULL) { + dns_pcb = udp_new(); + + if (dns_pcb != NULL) { + /* initialize DNS table not needed (initialized to zero since it is a + * global variable) */ + LWIP_ASSERT("For implicit initialization to work, DNS_STATE_UNUSED needs to be 0", + DNS_STATE_UNUSED == 0); + + /* initialize DNS client */ + udp_bind(dns_pcb, IP_ADDR_ANY, 0); + udp_recv(dns_pcb, dns_recv, NULL); + + /* initialize default DNS primary server */ + dns_setserver(0, &dnsserver); + } + } +#if DNS_LOCAL_HOSTLIST + dns_init_local(); +#endif +} + +/** + * Initialize one of the DNS servers. + * + * @param numdns the index of the DNS server to set must be < DNS_MAX_SERVERS + * @param dnsserver IP address of the DNS server to set + */ +void +dns_setserver(u8_t numdns, ip_addr_t *dnsserver) +{ + if ((numdns < DNS_MAX_SERVERS) && (dns_pcb != NULL) && + (dnsserver != NULL) && !ip_addr_isany(dnsserver)) { + dns_servers[numdns] = (*dnsserver); + } +} + +/** + * Obtain one of the currently configured DNS server. + * + * @param numdns the index of the DNS server + * @return IP address of the indexed DNS server or "ip_addr_any" if the DNS + * server has not been configured. + */ +ip_addr_t +dns_getserver(u8_t numdns) +{ + if (numdns < DNS_MAX_SERVERS) { + return dns_servers[numdns]; + } else { + return *IP_ADDR_ANY; + } +} + +/** + * The DNS resolver client timer - handle retries and timeouts and should + * be called every DNS_TMR_INTERVAL milliseconds (every second by default). + */ +void +dns_tmr(void) +{ + if (dns_pcb != NULL) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_tmr: dns_check_entries\n")); + dns_check_entries(); + } +} + +#if DNS_LOCAL_HOSTLIST +static void +dns_init_local() +{ +#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC && defined(DNS_LOCAL_HOSTLIST_INIT) + int i; + struct local_hostlist_entry *entry; + /* Dynamic: copy entries from DNS_LOCAL_HOSTLIST_INIT to list */ + struct local_hostlist_entry local_hostlist_init[] = DNS_LOCAL_HOSTLIST_INIT; + size_t namelen; + for (i = 0; i < sizeof(local_hostlist_init) / sizeof(struct local_hostlist_entry); i++) { + struct local_hostlist_entry *init_entry = &local_hostlist_init[i]; + LWIP_ASSERT("invalid host name (NULL)", init_entry->name != NULL); + namelen = strlen(init_entry->name); + LWIP_ASSERT("namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN", namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN); + entry = (struct local_hostlist_entry *)memp_malloc(MEMP_LOCALHOSTLIST); + LWIP_ASSERT("mem-error in dns_init_local", entry != NULL); + if (entry != NULL) { + entry->name = (char*)entry + sizeof(struct local_hostlist_entry); + MEMCPY((char*)entry->name, init_entry->name, namelen); + ((char*)entry->name)[namelen] = 0; + entry->addr = init_entry->addr; + entry->next = local_hostlist_dynamic; + local_hostlist_dynamic = entry; + } + } +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC && defined(DNS_LOCAL_HOSTLIST_INIT) */ +} + +/** + * Scans the local host-list for a hostname. + * + * @param hostname Hostname to look for in the local host-list + * @return The first IP address for the hostname in the local host-list or + * IPADDR_NONE if not found. + */ +static u32_t +dns_lookup_local(const char *hostname) +{ +#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC + struct local_hostlist_entry *entry = local_hostlist_dynamic; + while(entry != NULL) { + if(strcmp(entry->name, hostname) == 0) { + return ip4_addr_get_u32(&entry->addr); + } + entry = entry->next; + } +#else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + int i; + for (i = 0; i < sizeof(local_hostlist_static) / sizeof(struct local_hostlist_entry); i++) { + if(strcmp(local_hostlist_static[i].name, hostname) == 0) { + return ip4_addr_get_u32(&local_hostlist_static[i].addr); + } + } +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + return IPADDR_NONE; +} + +#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC +/** Remove all entries from the local host-list for a specific hostname + * and/or IP addess + * + * @param hostname hostname for which entries shall be removed from the local + * host-list + * @param addr address for which entries shall be removed from the local host-list + * @return the number of removed entries + */ +int +dns_local_removehost(const char *hostname, const ip_addr_t *addr) +{ + int removed = 0; + struct local_hostlist_entry *entry = local_hostlist_dynamic; + struct local_hostlist_entry *last_entry = NULL; + while (entry != NULL) { + if (((hostname == NULL) || !strcmp(entry->name, hostname)) && + ((addr == NULL) || ip_addr_cmp(&entry->addr, addr))) { + struct local_hostlist_entry *free_entry; + if (last_entry != NULL) { + last_entry->next = entry->next; + } else { + local_hostlist_dynamic = entry->next; + } + free_entry = entry; + entry = entry->next; + memp_free(MEMP_LOCALHOSTLIST, free_entry); + removed++; + } else { + last_entry = entry; + entry = entry->next; + } + } + return removed; +} + +/** + * Add a hostname/IP address pair to the local host-list. + * Duplicates are not checked. + * + * @param hostname hostname of the new entry + * @param addr IP address of the new entry + * @return ERR_OK if succeeded or ERR_MEM on memory error + */ +err_t +dns_local_addhost(const char *hostname, const ip_addr_t *addr) +{ + struct local_hostlist_entry *entry; + size_t namelen; + LWIP_ASSERT("invalid host name (NULL)", hostname != NULL); + namelen = strlen(hostname); + LWIP_ASSERT("namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN", namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN); + entry = (struct local_hostlist_entry *)memp_malloc(MEMP_LOCALHOSTLIST); + if (entry == NULL) { + return ERR_MEM; + } + entry->name = (char*)entry + sizeof(struct local_hostlist_entry); + MEMCPY((char*)entry->name, hostname, namelen); + ((char*)entry->name)[namelen] = 0; + ip_addr_copy(entry->addr, *addr); + entry->next = local_hostlist_dynamic; + local_hostlist_dynamic = entry; + return ERR_OK; +} +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC*/ +#endif /* DNS_LOCAL_HOSTLIST */ + +/** + * Look up a hostname in the array of known hostnames. + * + * @note This function only looks in the internal array of known + * hostnames, it does not send out a query for the hostname if none + * was found. The function dns_enqueue() can be used to send a query + * for a hostname. + * + * @param name the hostname to look up + * @return the hostname's IP address, as u32_t (instead of ip_addr_t to + * better check for failure: != IPADDR_NONE) or IPADDR_NONE if the hostname + * was not found in the cached dns_table. + */ +static u32_t +dns_lookup(const char *name) +{ + u8_t i; +#if DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) + u32_t addr; +#endif /* DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) */ +#if DNS_LOCAL_HOSTLIST + if ((addr = dns_lookup_local(name)) != IPADDR_NONE) { + return addr; + } +#endif /* DNS_LOCAL_HOSTLIST */ +#ifdef DNS_LOOKUP_LOCAL_EXTERN + if((addr = DNS_LOOKUP_LOCAL_EXTERN(name)) != IPADDR_NONE) { + return addr; + } +#endif /* DNS_LOOKUP_LOCAL_EXTERN */ + + /* Walk through name list, return entry if found. If not, return NULL. */ + for (i = 0; i < DNS_TABLE_SIZE; ++i) { + if ((dns_table[i].state == DNS_STATE_DONE) && + (strcmp(name, dns_table[i].name) == 0)) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_lookup: \"%s\": found = ", name)); + ip_addr_debug_print(DNS_DEBUG, &(dns_table[i].ipaddr)); + LWIP_DEBUGF(DNS_DEBUG, ("\n")); + return ip4_addr_get_u32(&dns_table[i].ipaddr); + } + } + + return IPADDR_NONE; +} + +#if DNS_DOES_NAME_CHECK +/** + * Compare the "dotted" name "query" with the encoded name "response" + * to make sure an answer from the DNS server matches the current dns_table + * entry (otherwise, answers might arrive late for hostname not on the list + * any more). + * + * @param query hostname (not encoded) from the dns_table + * @param response encoded hostname in the DNS response + * @return 0: names equal; 1: names differ + */ +static u8_t +dns_compare_name(unsigned char *query, unsigned char *response) +{ + unsigned char n; + + do { + n = *response++; + /** @see RFC 1035 - 4.1.4. Message compression */ + if ((n & 0xc0) == 0xc0) { + /* Compressed name */ + break; + } else { + /* Not compressed name */ + while (n > 0) { + if ((*query) != (*response)) { + return 1; + } + ++response; + ++query; + --n; + }; + ++query; + } + } while (*response != 0); + + return 0; +} +#endif /* DNS_DOES_NAME_CHECK */ + +/** + * Walk through a compact encoded DNS name and return the end of the name. + * + * @param query encoded DNS name in the DNS server response + * @return end of the name + */ +static unsigned char * +dns_parse_name(unsigned char *query) +{ + unsigned char n; + + do { + n = *query++; + /** @see RFC 1035 - 4.1.4. Message compression */ + if ((n & 0xc0) == 0xc0) { + /* Compressed name */ + break; + } else { + /* Not compressed name */ + while (n > 0) { + ++query; + --n; + }; + } + } while (*query != 0); + + return query + 1; +} + +/** + * Send a DNS query packet. + * + * @param numdns index of the DNS server in the dns_servers table + * @param name hostname to query + * @param id index of the hostname in dns_table, used as transaction ID in the + * DNS query packet + * @return ERR_OK if packet is sent; an err_t indicating the problem otherwise + */ +static err_t +dns_send(u8_t numdns, const char* name, u8_t id) +{ + err_t err; + struct dns_hdr *hdr; + struct dns_query qry; + struct pbuf *p; + char *query, *nptr; + const char *pHostname; + u8_t n; + + LWIP_DEBUGF(DNS_DEBUG, ("dns_send: dns_servers[%"U16_F"] \"%s\": request\n", + (u16_t)(numdns), name)); + LWIP_ASSERT("dns server out of array", numdns < DNS_MAX_SERVERS); + LWIP_ASSERT("dns server has no IP address set", !ip_addr_isany(&dns_servers[numdns])); + + /* if here, we have either a new query or a retry on a previous query to process */ + p = pbuf_alloc(PBUF_TRANSPORT, SIZEOF_DNS_HDR + DNS_MAX_NAME_LENGTH + + SIZEOF_DNS_QUERY, PBUF_RAM); + if (p != NULL) { + LWIP_ASSERT("pbuf must be in one piece", p->next == NULL); + /* fill dns header */ + hdr = (struct dns_hdr*)p->payload; + memset(hdr, 0, SIZEOF_DNS_HDR); + hdr->id = htons(id); + hdr->flags1 = DNS_FLAG1_RD; + hdr->numquestions = PP_HTONS(1); + query = (char*)hdr + SIZEOF_DNS_HDR; + pHostname = name; + --pHostname; + + /* convert hostname into suitable query format. */ + do { + ++pHostname; + nptr = query; + ++query; + for(n = 0; *pHostname != '.' && *pHostname != 0; ++pHostname) { + *query = *pHostname; + ++query; + ++n; + } + *nptr = n; + } while(*pHostname != 0); + *query++='\0'; + + /* fill dns query */ + qry.type = PP_HTONS(DNS_RRTYPE_A); + qry.cls = PP_HTONS(DNS_RRCLASS_IN); + SMEMCPY(query, &qry, SIZEOF_DNS_QUERY); + + /* resize pbuf to the exact dns query */ + pbuf_realloc(p, (u16_t)((query + SIZEOF_DNS_QUERY) - ((char*)(p->payload)))); + + /* connect to the server for faster receiving */ + udp_connect(dns_pcb, &dns_servers[numdns], DNS_SERVER_PORT); + /* send dns packet */ + err = udp_sendto(dns_pcb, p, &dns_servers[numdns], DNS_SERVER_PORT); + + /* free pbuf */ + pbuf_free(p); + } else { + err = ERR_MEM; + } + + return err; +} + +/** + * dns_check_entry() - see if pEntry has not yet been queried and, if so, sends out a query. + * Check an entry in the dns_table: + * - send out query for new entries + * - retry old pending entries on timeout (also with different servers) + * - remove completed entries from the table if their TTL has expired + * + * @param i index of the dns_table entry to check + */ +static void +dns_check_entry(u8_t i) +{ + err_t err; + struct dns_table_entry *pEntry = &dns_table[i]; + + LWIP_ASSERT("array index out of bounds", i < DNS_TABLE_SIZE); + + switch(pEntry->state) { + + case DNS_STATE_NEW: { + /* initialize new entry */ + pEntry->state = DNS_STATE_ASKING; + pEntry->numdns = 0; + pEntry->tmr = 1; + pEntry->retries = 0; + + /* send DNS packet for this entry */ + err = dns_send(pEntry->numdns, pEntry->name, i); + if (err != ERR_OK) { + LWIP_DEBUGF(DNS_DEBUG | LWIP_DBG_LEVEL_WARNING, + ("dns_send returned error: %s\n", lwip_strerr(err))); + } + break; + } + + case DNS_STATE_ASKING: { + if (--pEntry->tmr == 0) { + if (++pEntry->retries == DNS_MAX_RETRIES) { + if ((pEntry->numdns+1numdns+1])) { + /* change of server */ + pEntry->numdns++; + pEntry->tmr = 1; + pEntry->retries = 0; + break; + } else { + LWIP_DEBUGF(DNS_DEBUG, ("dns_check_entry: \"%s\": timeout\n", pEntry->name)); + /* call specified callback function if provided */ + if (pEntry->found) + (*pEntry->found)(pEntry->name, NULL, pEntry->arg); + /* flush this entry */ + pEntry->state = DNS_STATE_UNUSED; + pEntry->found = NULL; + break; + } + } + + /* wait longer for the next retry */ + pEntry->tmr = pEntry->retries; + + /* send DNS packet for this entry */ + err = dns_send(pEntry->numdns, pEntry->name, i); + if (err != ERR_OK) { + LWIP_DEBUGF(DNS_DEBUG | LWIP_DBG_LEVEL_WARNING, + ("dns_send returned error: %s\n", lwip_strerr(err))); + } + } + break; + } + + case DNS_STATE_DONE: { + /* if the time to live is nul */ + if (--pEntry->ttl == 0) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_check_entry: \"%s\": flush\n", pEntry->name)); + /* flush this entry */ + pEntry->state = DNS_STATE_UNUSED; + pEntry->found = NULL; + } + break; + } + case DNS_STATE_UNUSED: + /* nothing to do */ + break; + default: + LWIP_ASSERT("unknown dns_table entry state:", 0); + break; + } +} + +/** + * Call dns_check_entry for each entry in dns_table - check all entries. + */ +static void +dns_check_entries(void) +{ + u8_t i; + + for (i = 0; i < DNS_TABLE_SIZE; ++i) { + dns_check_entry(i); + } +} + +/** + * Receive input function for DNS response packets arriving for the dns UDP pcb. + * + * @params see udp.h + */ +static void +dns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port) +{ + u16_t i; + char *pHostname; + struct dns_hdr *hdr; + struct dns_answer ans; + struct dns_table_entry *pEntry; + u16_t nquestions, nanswers; + + LWIP_UNUSED_ARG(arg); + LWIP_UNUSED_ARG(pcb); + LWIP_UNUSED_ARG(addr); + LWIP_UNUSED_ARG(port); + + /* is the dns message too big ? */ + if (p->tot_len > DNS_MSG_SIZE) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: pbuf too big\n")); + /* free pbuf and return */ + goto memerr; + } + + /* is the dns message big enough ? */ + if (p->tot_len < (SIZEOF_DNS_HDR + SIZEOF_DNS_QUERY + SIZEOF_DNS_ANSWER)) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: pbuf too small\n")); + /* free pbuf and return */ + goto memerr; + } + + /* copy dns payload inside static buffer for processing */ + if (pbuf_copy_partial(p, dns_payload, p->tot_len, 0) == p->tot_len) { + /* The ID in the DNS header should be our entry into the name table. */ + hdr = (struct dns_hdr*)dns_payload; + i = htons(hdr->id); + if (i < DNS_TABLE_SIZE) { + pEntry = &dns_table[i]; + if(pEntry->state == DNS_STATE_ASKING) { + /* This entry is now completed. */ + pEntry->state = DNS_STATE_DONE; + pEntry->err = hdr->flags2 & DNS_FLAG2_ERR_MASK; + + /* We only care about the question(s) and the answers. The authrr + and the extrarr are simply discarded. */ + nquestions = htons(hdr->numquestions); + nanswers = htons(hdr->numanswers); + + /* Check for error. If so, call callback to inform. */ + if (((hdr->flags1 & DNS_FLAG1_RESPONSE) == 0) || (pEntry->err != 0) || (nquestions != 1)) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in flags\n", pEntry->name)); + /* call callback to indicate error, clean up memory and return */ + goto responseerr; + } + +#if DNS_DOES_NAME_CHECK + /* Check if the name in the "question" part match with the name in the entry. */ + if (dns_compare_name((unsigned char *)(pEntry->name), (unsigned char *)dns_payload + SIZEOF_DNS_HDR) != 0) { + LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response not match to query\n", pEntry->name)); + /* call callback to indicate error, clean up memory and return */ + goto responseerr; + } +#endif /* DNS_DOES_NAME_CHECK */ + + /* Skip the name in the "question" part */ + pHostname = (char *) dns_parse_name((unsigned char *)dns_payload + SIZEOF_DNS_HDR) + SIZEOF_DNS_QUERY; + + while (nanswers > 0) { + /* skip answer resource record's host name */ + pHostname = (char *) dns_parse_name((unsigned char *)pHostname); + + /* Check for IP address type and Internet class. Others are discarded. */ + SMEMCPY(&ans, pHostname, SIZEOF_DNS_ANSWER); + if((ans.type == PP_HTONS(DNS_RRTYPE_A)) && (ans.cls == PP_HTONS(DNS_RRCLASS_IN)) && + (ans.len == PP_HTONS(sizeof(ip_addr_t))) ) { + /* read the answer resource record's TTL, and maximize it if needed */ + pEntry->ttl = ntohl(ans.ttl); + if (pEntry->ttl > DNS_MAX_TTL) { + pEntry->ttl = DNS_MAX_TTL; + } + /* read the IP address after answer resource record's header */ + SMEMCPY(&(pEntry->ipaddr), (pHostname+SIZEOF_DNS_ANSWER), sizeof(ip_addr_t)); + LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": response = ", pEntry->name)); + ip_addr_debug_print(DNS_DEBUG, (&(pEntry->ipaddr))); + LWIP_DEBUGF(DNS_DEBUG, ("\n")); + /* call specified callback function if provided */ + if (pEntry->found) { + (*pEntry->found)(pEntry->name, &pEntry->ipaddr, pEntry->arg); + } + /* deallocate memory and return */ + goto memerr; + } else { + pHostname = pHostname + SIZEOF_DNS_ANSWER + htons(ans.len); + } + --nanswers; + } + LWIP_DEBUGF(DNS_DEBUG, ("dns_recv: \"%s\": error in response\n", pEntry->name)); + /* call callback to indicate error, clean up memory and return */ + goto responseerr; + } + } + } + + /* deallocate memory and return */ + goto memerr; + +responseerr: + /* ERROR: call specified callback function with NULL as name to indicate an error */ + if (pEntry->found) { + (*pEntry->found)(pEntry->name, NULL, pEntry->arg); + } + /* flush this entry */ + pEntry->state = DNS_STATE_UNUSED; + pEntry->found = NULL; + +memerr: + /* free pbuf */ + pbuf_free(p); + return; +} + +/** + * Queues a new hostname to resolve and sends out a DNS query for that hostname + * + * @param name the hostname that is to be queried + * @param found a callback founction to be called on success, failure or timeout + * @param callback_arg argument to pass to the callback function + * @return @return a err_t return code. + */ +static err_t +dns_enqueue(const char *name, dns_found_callback found, void *callback_arg) +{ + u8_t i; + u8_t lseq, lseqi; + struct dns_table_entry *pEntry = NULL; + size_t namelen; + + /* search an unused entry, or the oldest one */ + lseq = lseqi = 0; + for (i = 0; i < DNS_TABLE_SIZE; ++i) { + pEntry = &dns_table[i]; + /* is it an unused entry ? */ + if (pEntry->state == DNS_STATE_UNUSED) + break; + + /* check if this is the oldest completed entry */ + if (pEntry->state == DNS_STATE_DONE) { + if ((dns_seqno - pEntry->seqno) > lseq) { + lseq = dns_seqno - pEntry->seqno; + lseqi = i; + } + } + } + + /* if we don't have found an unused entry, use the oldest completed one */ + if (i == DNS_TABLE_SIZE) { + if ((lseqi >= DNS_TABLE_SIZE) || (dns_table[lseqi].state != DNS_STATE_DONE)) { + /* no entry can't be used now, table is full */ + LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": DNS entries table is full\n", name)); + return ERR_MEM; + } else { + /* use the oldest completed one */ + i = lseqi; + pEntry = &dns_table[i]; + } + } + + /* use this entry */ + LWIP_DEBUGF(DNS_DEBUG, ("dns_enqueue: \"%s\": use DNS entry %"U16_F"\n", name, (u16_t)(i))); + + /* fill the entry */ + pEntry->state = DNS_STATE_NEW; + pEntry->seqno = dns_seqno++; + pEntry->found = found; + pEntry->arg = callback_arg; + namelen = LWIP_MIN(strlen(name), DNS_MAX_NAME_LENGTH-1); + MEMCPY(pEntry->name, name, namelen); + pEntry->name[namelen] = 0; + + /* force to send query without waiting timer */ + dns_check_entry(i); + + /* dns query is enqueued */ + return ERR_INPROGRESS; +} + +/** + * Resolve a hostname (string) into an IP address. + * NON-BLOCKING callback version for use with raw API!!! + * + * Returns immediately with one of err_t return codes: + * - ERR_OK if hostname is a valid IP address string or the host + * name is already in the local names table. + * - ERR_INPROGRESS enqueue a request to be sent to the DNS server + * for resolution if no errors are present. + * - ERR_ARG: dns client not initialized or invalid hostname + * + * @param hostname the hostname that is to be queried + * @param addr pointer to a ip_addr_t where to store the address if it is already + * cached in the dns_table (only valid if ERR_OK is returned!) + * @param found a callback function to be called on success, failure or timeout (only if + * ERR_INPROGRESS is returned!) + * @param callback_arg argument to pass to the callback function + * @return a err_t return code. + */ +err_t +dns_gethostbyname(const char *hostname, ip_addr_t *addr, dns_found_callback found, + void *callback_arg) +{ + u32_t ipaddr; + /* not initialized or no valid server yet, or invalid addr pointer + * or invalid hostname or invalid hostname length */ + if ((dns_pcb == NULL) || (addr == NULL) || + (!hostname) || (!hostname[0]) || + (strlen(hostname) >= DNS_MAX_NAME_LENGTH)) { + return ERR_ARG; + } + +#if LWIP_HAVE_LOOPIF + if (strcmp(hostname, "localhost")==0) { + ip_addr_set_loopback(addr); + return ERR_OK; + } +#endif /* LWIP_HAVE_LOOPIF */ + + /* host name already in octet notation? set ip addr and return ERR_OK */ + ipaddr = ipaddr_addr(hostname); + if (ipaddr == IPADDR_NONE) { + /* already have this address cached? */ + ipaddr = dns_lookup(hostname); + } + if (ipaddr != IPADDR_NONE) { + ip4_addr_set_u32(addr, ipaddr); + return ERR_OK; + } + + /* queue query with specified callback */ + return dns_enqueue(hostname, found, callback_arg); +} + +#endif /* LWIP_DNS */ diff --git a/third_party/lwip-1.4.1/src/core/init.c b/third_party/lwip-1.4.1/src/core/init.c new file mode 100644 index 0000000..8992c87 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/init.c @@ -0,0 +1,332 @@ +/** + * @file + * Modules initialization + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/init.h" +#include "lwip/stats.h" +#include "lwip/sys.h" +#include "lwip/mem.h" +#include "lwip/memp.h" +#include "lwip/pbuf.h" +#include "lwip/netif.h" +#include "lwip/sockets.h" +#include "lwip/ip.h" +#include "lwip/raw.h" +#include "lwip/udp.h" +#include "lwip/tcp_impl.h" +#include "lwip/snmp_msg.h" +#include "lwip/autoip.h" +#include "lwip/igmp.h" +#include "lwip/dns.h" +#include "lwip/timers.h" +#include "netif/etharp.h" +#include "lwip/api.h" + +/* Compile-time sanity checks for configuration errors. + * These can be done independently of LWIP_DEBUG, without penalty. + */ +#ifndef BYTE_ORDER + #error "BYTE_ORDER is not defined, you have to define it in your cc.h" +#endif +#if (!IP_SOF_BROADCAST && IP_SOF_BROADCAST_RECV) + #error "If you want to use broadcast filter per pcb on recv operations, you have to define IP_SOF_BROADCAST=1 in your lwipopts.h" +#endif +#if (!LWIP_UDP && LWIP_UDPLITE) + #error "If you want to use UDP Lite, you have to define LWIP_UDP=1 in your lwipopts.h" +#endif +#if (!LWIP_UDP && LWIP_SNMP) + #error "If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h" +#endif +#if (!LWIP_UDP && LWIP_DHCP) + #error "If you want to use DHCP, you have to define LWIP_UDP=1 in your lwipopts.h" +#endif +#if (!LWIP_UDP && LWIP_IGMP) + #error "If you want to use IGMP, you have to define LWIP_UDP=1 in your lwipopts.h" +#endif +#if (!LWIP_UDP && LWIP_SNMP) + #error "If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h" +#endif +#if (!LWIP_UDP && LWIP_DNS) + #error "If you want to use DNS, you have to define LWIP_UDP=1 in your lwipopts.h" +#endif +#if !MEMP_MEM_MALLOC /* MEMP_NUM_* checks are disabled when not using the pool allocator */ +#if (LWIP_ARP && ARP_QUEUEING && (MEMP_NUM_ARP_QUEUE<=0)) + #error "If you want to use ARP Queueing, you have to define MEMP_NUM_ARP_QUEUE>=1 in your lwipopts.h" +#endif +#if (LWIP_RAW && (MEMP_NUM_RAW_PCB<=0)) + #error "If you want to use RAW, you have to define MEMP_NUM_RAW_PCB>=1 in your lwipopts.h" +#endif +#if (LWIP_UDP && (MEMP_NUM_UDP_PCB<=0)) + #error "If you want to use UDP, you have to define MEMP_NUM_UDP_PCB>=1 in your lwipopts.h" +#endif +#if (LWIP_TCP && (MEMP_NUM_TCP_PCB<=0)) + #error "If you want to use TCP, you have to define MEMP_NUM_TCP_PCB>=1 in your lwipopts.h" +#endif +#if (LWIP_IGMP && (MEMP_NUM_IGMP_GROUP<=1)) + #error "If you want to use IGMP, you have to define MEMP_NUM_IGMP_GROUP>1 in your lwipopts.h" +#endif +#if ((LWIP_NETCONN || LWIP_SOCKET) && (MEMP_NUM_TCPIP_MSG_API<=0)) + #error "If you want to use Sequential API, you have to define MEMP_NUM_TCPIP_MSG_API>=1 in your lwipopts.h" +#endif +/* There must be sufficient timeouts, taking into account requirements of the subsystems. */ +#if LWIP_TIMERS && (MEMP_NUM_SYS_TIMEOUT < (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_SUPPORT)) + #error "MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts" +#endif +#if (IP_REASSEMBLY && (MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS)) + #error "MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS doesn't make sense since each struct ip_reassdata must hold 2 pbufs at least!" +#endif +#endif /* !MEMP_MEM_MALLOC */ +#if (LWIP_TCP && (TCP_WND > 0xffff)) + #error "If you want to use TCP, TCP_WND must fit in an u16_t, so, you have to reduce it in your lwipopts.h" +#endif +#if (LWIP_TCP && (TCP_SND_QUEUELEN > 0xffff)) + #error "If you want to use TCP, TCP_SND_QUEUELEN must fit in an u16_t, so, you have to reduce it in your lwipopts.h" +#endif +#if (LWIP_TCP && (TCP_SND_QUEUELEN < 2)) + #error "TCP_SND_QUEUELEN must be at least 2 for no-copy TCP writes to work" +#endif +#if (LWIP_TCP && ((TCP_MAXRTX > 12) || (TCP_SYNMAXRTX > 12))) + #error "If you want to use TCP, TCP_MAXRTX and TCP_SYNMAXRTX must less or equal to 12 (due to tcp_backoff table), so, you have to reduce them in your lwipopts.h" +#endif +#if (LWIP_TCP && TCP_LISTEN_BACKLOG && (TCP_DEFAULT_LISTEN_BACKLOG < 0) || (TCP_DEFAULT_LISTEN_BACKLOG > 0xff)) + #error "If you want to use TCP backlog, TCP_DEFAULT_LISTEN_BACKLOG must fit into an u8_t" +#endif +#if (LWIP_NETIF_API && (NO_SYS==1)) + #error "If you want to use NETIF API, you have to define NO_SYS=0 in your lwipopts.h" +#endif +#if ((LWIP_SOCKET || LWIP_NETCONN) && (NO_SYS==1)) + #error "If you want to use Sequential API, you have to define NO_SYS=0 in your lwipopts.h" +#endif +#if (!LWIP_NETCONN && LWIP_SOCKET) + #error "If you want to use Socket API, you have to define LWIP_NETCONN=1 in your lwipopts.h" +#endif +#if (((!LWIP_DHCP) || (!LWIP_AUTOIP)) && LWIP_DHCP_AUTOIP_COOP) + #error "If you want to use DHCP/AUTOIP cooperation mode, you have to define LWIP_DHCP=1 and LWIP_AUTOIP=1 in your lwipopts.h" +#endif +#if (((!LWIP_DHCP) || (!LWIP_ARP)) && DHCP_DOES_ARP_CHECK) + #error "If you want to use DHCP ARP checking, you have to define LWIP_DHCP=1 and LWIP_ARP=1 in your lwipopts.h" +#endif +#if (!LWIP_ARP && LWIP_AUTOIP) + #error "If you want to use AUTOIP, you have to define LWIP_ARP=1 in your lwipopts.h" +#endif +#if (LWIP_SNMP && (SNMP_CONCURRENT_REQUESTS<=0)) + #error "If you want to use SNMP, you have to define SNMP_CONCURRENT_REQUESTS>=1 in your lwipopts.h" +#endif +#if (LWIP_SNMP && (SNMP_TRAP_DESTINATIONS<=0)) + #error "If you want to use SNMP, you have to define SNMP_TRAP_DESTINATIONS>=1 in your lwipopts.h" +#endif +#if (LWIP_TCP && ((LWIP_EVENT_API && LWIP_CALLBACK_API) || (!LWIP_EVENT_API && !LWIP_CALLBACK_API))) + #error "One and exactly one of LWIP_EVENT_API and LWIP_CALLBACK_API has to be enabled in your lwipopts.h" +#endif +#if (MEM_LIBC_MALLOC && MEM_USE_POOLS) + #error "MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h" +#endif +#if (MEM_USE_POOLS && !MEMP_USE_CUSTOM_POOLS) + #error "MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h" +#endif +#if (PBUF_POOL_BUFSIZE <= MEM_ALIGNMENT) + #error "PBUF_POOL_BUFSIZE must be greater than MEM_ALIGNMENT or the offset may take the full first pbuf" +#endif +#if (DNS_LOCAL_HOSTLIST && !DNS_LOCAL_HOSTLIST_IS_DYNAMIC && !(defined(DNS_LOCAL_HOSTLIST_INIT))) + #error "you have to define define DNS_LOCAL_HOSTLIST_INIT {{'host1', 0x123}, {'host2', 0x234}} to initialize DNS_LOCAL_HOSTLIST" +#endif +#if PPP_SUPPORT && !PPPOS_SUPPORT & !PPPOE_SUPPORT + #error "PPP_SUPPORT needs either PPPOS_SUPPORT or PPPOE_SUPPORT turned on" +#endif +#if !LWIP_ETHERNET && (LWIP_ARP || PPPOE_SUPPORT) + #error "LWIP_ETHERNET needs to be turned on for LWIP_ARP or PPPOE_SUPPORT" +#endif +#if LWIP_IGMP && !defined(LWIP_RAND) + #error "When using IGMP, LWIP_RAND() needs to be defined to a random-function returning an u32_t random value" +#endif +#if LWIP_TCPIP_CORE_LOCKING_INPUT && !LWIP_TCPIP_CORE_LOCKING + #error "When using LWIP_TCPIP_CORE_LOCKING_INPUT, LWIP_TCPIP_CORE_LOCKING must be enabled, too" +#endif +#if LWIP_TCP && LWIP_NETIF_TX_SINGLE_PBUF && !TCP_OVERSIZE + #error "LWIP_NETIF_TX_SINGLE_PBUF needs TCP_OVERSIZE enabled to create single-pbuf TCP packets" +#endif +#if IP_FRAG && IP_FRAG_USES_STATIC_BUF && LWIP_NETIF_TX_SINGLE_PBUF + #error "LWIP_NETIF_TX_SINGLE_PBUF does not work with IP_FRAG_USES_STATIC_BUF==1 as that creates pbuf queues" +#endif +#if LWIP_NETCONN && LWIP_TCP +#if NETCONN_COPY != TCP_WRITE_FLAG_COPY + #error "NETCONN_COPY != TCP_WRITE_FLAG_COPY" +#endif +#if NETCONN_MORE != TCP_WRITE_FLAG_MORE + #error "NETCONN_MORE != TCP_WRITE_FLAG_MORE" +#endif +#endif /* LWIP_NETCONN && LWIP_TCP */ +#if LWIP_SOCKET +/* Check that the SO_* socket options and SOF_* lwIP-internal flags match */ +#if SO_ACCEPTCONN != SOF_ACCEPTCONN + #error "SO_ACCEPTCONN != SOF_ACCEPTCONN" +#endif +#if SO_REUSEADDR != SOF_REUSEADDR + #error "WARNING: SO_REUSEADDR != SOF_REUSEADDR" +#endif +#if SO_KEEPALIVE != SOF_KEEPALIVE + #error "WARNING: SO_KEEPALIVE != SOF_KEEPALIVE" +#endif +#if SO_BROADCAST != SOF_BROADCAST + #error "WARNING: SO_BROADCAST != SOF_BROADCAST" +#endif +#if SO_LINGER != SOF_LINGER + #error "WARNING: SO_LINGER != SOF_LINGER" +#endif +#endif /* LWIP_SOCKET */ + + +/* Compile-time checks for deprecated options. + */ +#ifdef MEMP_NUM_TCPIP_MSG + #error "MEMP_NUM_TCPIP_MSG option is deprecated. Remove it from your lwipopts.h." +#endif +#ifdef MEMP_NUM_API_MSG + #error "MEMP_NUM_API_MSG option is deprecated. Remove it from your lwipopts.h." +#endif +#ifdef TCP_REXMIT_DEBUG + #error "TCP_REXMIT_DEBUG option is deprecated. Remove it from your lwipopts.h." +#endif +#ifdef RAW_STATS + #error "RAW_STATS option is deprecated. Remove it from your lwipopts.h." +#endif +#ifdef ETHARP_QUEUE_FIRST + #error "ETHARP_QUEUE_FIRST option is deprecated. Remove it from your lwipopts.h." +#endif +#ifdef ETHARP_ALWAYS_INSERT + #error "ETHARP_ALWAYS_INSERT option is deprecated. Remove it from your lwipopts.h." +#endif + +#ifndef LWIP_DISABLE_TCP_SANITY_CHECKS +#define LWIP_DISABLE_TCP_SANITY_CHECKS 0 +#endif +#ifndef LWIP_DISABLE_MEMP_SANITY_CHECKS +#define LWIP_DISABLE_MEMP_SANITY_CHECKS 0 +#endif + +/* MEMP sanity checks */ +#if !LWIP_DISABLE_MEMP_SANITY_CHECKS +#if LWIP_NETCONN +#if MEMP_MEM_MALLOC +#if !MEMP_NUM_NETCONN && LWIP_SOCKET +#error "lwip_sanity_check: WARNING: MEMP_NUM_NETCONN cannot be 0 when using sockets!" +#endif +#else /* MEMP_MEM_MALLOC */ +#if MEMP_NUM_NETCONN > (MEMP_NUM_TCP_PCB+MEMP_NUM_TCP_PCB_LISTEN+MEMP_NUM_UDP_PCB+MEMP_NUM_RAW_PCB) +#error "lwip_sanity_check: WARNING: MEMP_NUM_NETCONN should be less than the sum of MEMP_NUM_{TCP,RAW,UDP}_PCB+MEMP_NUM_TCP_PCB_LISTEN. If you know what you are doing, define LWIP_DISABLE_MEMP_SANITY_CHECKS to 1 to disable this error." +#endif +#endif /* MEMP_MEM_MALLOC */ +#endif /* LWIP_NETCONN */ +#endif /* !LWIP_DISABLE_MEMP_SANITY_CHECKS */ + +/* TCP sanity checks */ +#if !LWIP_DISABLE_TCP_SANITY_CHECKS +#if LWIP_TCP +#if !MEMP_MEM_MALLOC && (MEMP_NUM_TCP_SEG < TCP_SND_QUEUELEN) + #error "lwip_sanity_check: WARNING: MEMP_NUM_TCP_SEG should be at least as big as TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#endif +#if TCP_SND_BUF < (2 * TCP_MSS) + #error "lwip_sanity_check: WARNING: TCP_SND_BUF must be at least as much as (2 * TCP_MSS) for things to work smoothly. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#endif +#if TCP_SND_QUEUELEN < (2 * (TCP_SND_BUF / TCP_MSS)) + #error "lwip_sanity_check: WARNING: TCP_SND_QUEUELEN must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#endif +#if TCP_SNDLOWAT >= TCP_SND_BUF + #error "lwip_sanity_check: WARNING: TCP_SNDLOWAT must be less than TCP_SND_BUF. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#endif +#if TCP_SNDQUEUELOWAT >= TCP_SND_QUEUELEN + #error "lwip_sanity_check: WARNING: TCP_SNDQUEUELOWAT must be less than TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#endif +#if !MEMP_MEM_MALLOC && (TCP_WND > (PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - (PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)))) + #error "lwip_sanity_check: WARNING: TCP_WND is larger than space provided by PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - protocol headers). If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#endif +#if TCP_WND < TCP_MSS + #error "lwip_sanity_check: WARNING: TCP_WND is smaller than MSS. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error." +#endif +#endif /* LWIP_TCP */ +#endif /* !LWIP_DISABLE_TCP_SANITY_CHECKS */ + +/** + * Perform Sanity check of user-configurable values, and initialize all modules. + */ +void +lwip_init(void) +{ + /* Modules initialization */ + stats_init(); +#if !NO_SYS + sys_init(); +#endif /* !NO_SYS */ + mem_init(); + memp_init(); + pbuf_init(); + netif_init(); +#if LWIP_SOCKET + lwip_socket_init(); +#endif /* LWIP_SOCKET */ + ip_init(); +#if LWIP_ARP + etharp_init(); +#endif /* LWIP_ARP */ +#if LWIP_RAW + raw_init(); +#endif /* LWIP_RAW */ +#if LWIP_UDP + udp_init(); +#endif /* LWIP_UDP */ +#if LWIP_TCP + tcp_init(); +#endif /* LWIP_TCP */ +#if LWIP_SNMP + snmp_init(); +#endif /* LWIP_SNMP */ +#if LWIP_AUTOIP + autoip_init(); +#endif /* LWIP_AUTOIP */ +#if LWIP_IGMP + igmp_init(); +#endif /* LWIP_IGMP */ +#if LWIP_DNS + dns_init(); +#endif /* LWIP_DNS */ + +#if LWIP_TIMERS + sys_timeouts_init(); +#endif /* LWIP_TIMERS */ +} diff --git a/third_party/lwip-1.4.1/src/core/ipv4/autoip.c b/third_party/lwip-1.4.1/src/core/ipv4/autoip.c new file mode 100644 index 0000000..c2de547 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/ipv4/autoip.c @@ -0,0 +1,528 @@ +/** + * @file + * AutoIP Automatic LinkLocal IP Configuration + * + */ + +/* + * + * Copyright (c) 2007 Dominik Spies + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Dominik Spies + * + * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform + * with RFC 3927. + * + * + * Please coordinate changes and requests with Dominik Spies + * + */ + +/******************************************************************************* + * USAGE: + * + * define LWIP_AUTOIP 1 in your lwipopts.h + * + * If you don't use tcpip.c (so, don't call, you don't call tcpip_init): + * - First, call autoip_init(). + * - call autoip_tmr() all AUTOIP_TMR_INTERVAL msces, + * that should be defined in autoip.h. + * I recommend a value of 100. The value must divide 1000 with a remainder almost 0. + * Possible values are 1000, 500, 333, 250, 200, 166, 142, 125, 111, 100 .... + * + * Without DHCP: + * - Call autoip_start() after netif_add(). + * + * With DHCP: + * - define LWIP_DHCP_AUTOIP_COOP 1 in your lwipopts.h. + * - Configure your DHCP Client. + * + */ + +#include "lwip/opt.h" + +#if LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/mem.h" +#include "lwip/udp.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/autoip.h" +#include "netif/etharp.h" + +#include +#include + +/* 169.254.0.0 */ +#define AUTOIP_NET 0xA9FE0000 +/* 169.254.1.0 */ +#define AUTOIP_RANGE_START (AUTOIP_NET | 0x0100) +/* 169.254.254.255 */ +#define AUTOIP_RANGE_END (AUTOIP_NET | 0xFEFF) + + +/** Pseudo random macro based on netif informations. + * You could use "rand()" from the C Library if you define LWIP_AUTOIP_RAND in lwipopts.h */ +#ifndef LWIP_AUTOIP_RAND +#define LWIP_AUTOIP_RAND(netif) ( (((u32_t)((netif->hwaddr[5]) & 0xff) << 24) | \ + ((u32_t)((netif->hwaddr[3]) & 0xff) << 16) | \ + ((u32_t)((netif->hwaddr[2]) & 0xff) << 8) | \ + ((u32_t)((netif->hwaddr[4]) & 0xff))) + \ + (netif->autoip?netif->autoip->tried_llipaddr:0)) +#endif /* LWIP_AUTOIP_RAND */ + +/** + * Macro that generates the initial IP address to be tried by AUTOIP. + * If you want to override this, define it to something else in lwipopts.h. + */ +#ifndef LWIP_AUTOIP_CREATE_SEED_ADDR +#define LWIP_AUTOIP_CREATE_SEED_ADDR(netif) \ + htonl(AUTOIP_RANGE_START + ((u32_t)(((u8_t)(netif->hwaddr[4])) | \ + ((u32_t)((u8_t)(netif->hwaddr[5]))) << 8))) +#endif /* LWIP_AUTOIP_CREATE_SEED_ADDR */ + +/* static functions */ +static void autoip_handle_arp_conflict(struct netif *netif); + +/* creates a pseudo random LL IP-Address for a network interface */ +static void autoip_create_addr(struct netif *netif, ip_addr_t *ipaddr); + +/* sends an ARP probe */ +static err_t autoip_arp_probe(struct netif *netif); + +/* sends an ARP announce */ +static err_t autoip_arp_announce(struct netif *netif); + +/* configure interface for use with current LL IP-Address */ +static err_t autoip_bind(struct netif *netif); + +/* start sending probes for llipaddr */ +static void autoip_start_probing(struct netif *netif); + + +/** Set a statically allocated struct autoip to work with. + * Using this prevents autoip_start to allocate it using mem_malloc. + * + * @param netif the netif for which to set the struct autoip + * @param dhcp (uninitialised) dhcp struct allocated by the application + */ +void +autoip_set_struct(struct netif *netif, struct autoip *autoip) +{ + LWIP_ASSERT("netif != NULL", netif != NULL); + LWIP_ASSERT("autoip != NULL", autoip != NULL); + LWIP_ASSERT("netif already has a struct autoip set", netif->autoip == NULL); + + /* clear data structure */ + memset(autoip, 0, sizeof(struct autoip)); + /* autoip->state = AUTOIP_STATE_OFF; */ + netif->autoip = autoip; +} + +/** Restart AutoIP client and check the next address (conflict detected) + * + * @param netif The netif under AutoIP control + */ +static void +autoip_restart(struct netif *netif) +{ + netif->autoip->tried_llipaddr++; + autoip_start(netif); +} + +/** + * Handle a IP address conflict after an ARP conflict detection + */ +static void +autoip_handle_arp_conflict(struct netif *netif) +{ + /* Somehow detect if we are defending or retreating */ + unsigned char defend = 1; /* tbd */ + + if (defend) { + if (netif->autoip->lastconflict > 0) { + /* retreat, there was a conflicting ARP in the last + * DEFEND_INTERVAL seconds + */ + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_handle_arp_conflict(): we are defending, but in DEFEND_INTERVAL, retreating\n")); + + /* TODO: close all TCP sessions */ + autoip_restart(netif); + } else { + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_handle_arp_conflict(): we are defend, send ARP Announce\n")); + autoip_arp_announce(netif); + netif->autoip->lastconflict = DEFEND_INTERVAL * AUTOIP_TICKS_PER_SECOND; + } + } else { + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_handle_arp_conflict(): we do not defend, retreating\n")); + /* TODO: close all TCP sessions */ + autoip_restart(netif); + } +} + +/** + * Create an IP-Address out of range 169.254.1.0 to 169.254.254.255 + * + * @param netif network interface on which create the IP-Address + * @param ipaddr ip address to initialize + */ +static void +autoip_create_addr(struct netif *netif, ip_addr_t *ipaddr) +{ + /* Here we create an IP-Address out of range 169.254.1.0 to 169.254.254.255 + * compliant to RFC 3927 Section 2.1 + * We have 254 * 256 possibilities */ + + u32_t addr = ntohl(LWIP_AUTOIP_CREATE_SEED_ADDR(netif)); + addr += netif->autoip->tried_llipaddr; + addr = AUTOIP_NET | (addr & 0xffff); + /* Now, 169.254.0.0 <= addr <= 169.254.255.255 */ + + if (addr < AUTOIP_RANGE_START) { + addr += AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1; + } + if (addr > AUTOIP_RANGE_END) { + addr -= AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1; + } + LWIP_ASSERT("AUTOIP address not in range", (addr >= AUTOIP_RANGE_START) && + (addr <= AUTOIP_RANGE_END)); + ip4_addr_set_u32(ipaddr, htonl(addr)); + + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_create_addr(): tried_llipaddr=%"U16_F", %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + (u16_t)(netif->autoip->tried_llipaddr), ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), + ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr))); +} + +/** + * Sends an ARP probe from a network interface + * + * @param netif network interface used to send the probe + */ +static err_t +autoip_arp_probe(struct netif *netif) +{ + return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, + (struct eth_addr *)netif->hwaddr, IP_ADDR_ANY, ðzero, + &netif->autoip->llipaddr, ARP_REQUEST); +} + +/** + * Sends an ARP announce from a network interface + * + * @param netif network interface used to send the announce + */ +static err_t +autoip_arp_announce(struct netif *netif) +{ + return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, + (struct eth_addr *)netif->hwaddr, &netif->autoip->llipaddr, ðzero, + &netif->autoip->llipaddr, ARP_REQUEST); +} + +/** + * Configure interface for use with current LL IP-Address + * + * @param netif network interface to configure with current LL IP-Address + */ +static err_t +autoip_bind(struct netif *netif) +{ + struct autoip *autoip = netif->autoip; + ip_addr_t sn_mask, gw_addr; + + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, + ("autoip_bind(netif=%p) %c%c%"U16_F" %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num, + ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr), + ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr))); + + IP4_ADDR(&sn_mask, 255, 255, 0, 0); + IP4_ADDR(&gw_addr, 0, 0, 0, 0); + + netif_set_ipaddr(netif, &autoip->llipaddr); + netif_set_netmask(netif, &sn_mask); + netif_set_gw(netif, &gw_addr); + + /* bring the interface up */ + netif_set_up(netif); + + return ERR_OK; +} + +/** + * Start AutoIP client + * + * @param netif network interface on which start the AutoIP client + */ +err_t +autoip_start(struct netif *netif) +{ + struct autoip *autoip = netif->autoip; + err_t result = ERR_OK; + + if (netif_is_up(netif)) { + netif_set_down(netif); + } + + /* Set IP-Address, Netmask and Gateway to 0 to make sure that + * ARP Packets are formed correctly + */ + ip_addr_set_zero(&netif->ip_addr); + ip_addr_set_zero(&netif->netmask); + ip_addr_set_zero(&netif->gw); + + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_start(netif=%p) %c%c%"U16_F"\n", (void*)netif, netif->name[0], + netif->name[1], (u16_t)netif->num)); + if (autoip == NULL) { + /* no AutoIP client attached yet? */ + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, + ("autoip_start(): starting new AUTOIP client\n")); + autoip = (struct autoip *)mem_malloc(sizeof(struct autoip)); + if (autoip == NULL) { + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, + ("autoip_start(): could not allocate autoip\n")); + return ERR_MEM; + } + memset(autoip, 0, sizeof(struct autoip)); + /* store this AutoIP client in the netif */ + netif->autoip = autoip; + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_start(): allocated autoip")); + } else { + autoip->state = AUTOIP_STATE_OFF; + autoip->ttw = 0; + autoip->sent_num = 0; + ip_addr_set_zero(&autoip->llipaddr); + autoip->lastconflict = 0; + } + + autoip_create_addr(netif, &(autoip->llipaddr)); + autoip_start_probing(netif); + + return result; +} + +static void +autoip_start_probing(struct netif *netif) +{ + struct autoip *autoip = netif->autoip; + + autoip->state = AUTOIP_STATE_PROBING; + autoip->sent_num = 0; + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_start_probing(): changing state to PROBING: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(&netif->autoip->llipaddr), ip4_addr2_16(&netif->autoip->llipaddr), + ip4_addr3_16(&netif->autoip->llipaddr), ip4_addr4_16(&netif->autoip->llipaddr))); + + /* time to wait to first probe, this is randomly + * choosen out of 0 to PROBE_WAIT seconds. + * compliant to RFC 3927 Section 2.2.1 + */ + autoip->ttw = (u16_t)(LWIP_AUTOIP_RAND(netif) % (PROBE_WAIT * AUTOIP_TICKS_PER_SECOND)); + + /* + * if we tried more then MAX_CONFLICTS we must limit our rate for + * accquiring and probing address + * compliant to RFC 3927 Section 2.2.1 + */ + if (autoip->tried_llipaddr > MAX_CONFLICTS) { + autoip->ttw = RATE_LIMIT_INTERVAL * AUTOIP_TICKS_PER_SECOND; + } +} + +/** + * Handle a possible change in the network configuration. + * + * If there is an AutoIP address configured, take the interface down + * and begin probing with the same address. + */ +void +autoip_network_changed(struct netif *netif) +{ + if (netif->autoip && netif->autoip->state != AUTOIP_STATE_OFF) { + netif_set_down(netif); + autoip_start_probing(netif); + } +} + +/** + * Stop AutoIP client + * + * @param netif network interface on which stop the AutoIP client + */ +err_t +autoip_stop(struct netif *netif) +{ + netif->autoip->state = AUTOIP_STATE_OFF; + netif_set_down(netif); + return ERR_OK; +} + +/** + * Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds + */ +void +autoip_tmr() +{ + struct netif *netif = netif_list; + /* loop through netif's */ + while (netif != NULL) { + /* only act on AutoIP configured interfaces */ + if (netif->autoip != NULL) { + if (netif->autoip->lastconflict > 0) { + netif->autoip->lastconflict--; + } + + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, + ("autoip_tmr() AutoIP-State: %"U16_F", ttw=%"U16_F"\n", + (u16_t)(netif->autoip->state), netif->autoip->ttw)); + + switch(netif->autoip->state) { + case AUTOIP_STATE_PROBING: + if (netif->autoip->ttw > 0) { + netif->autoip->ttw--; + } else { + if (netif->autoip->sent_num >= PROBE_NUM) { + netif->autoip->state = AUTOIP_STATE_ANNOUNCING; + netif->autoip->sent_num = 0; + netif->autoip->ttw = ANNOUNCE_WAIT * AUTOIP_TICKS_PER_SECOND; + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_tmr(): changing state to ANNOUNCING: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(&netif->autoip->llipaddr), ip4_addr2_16(&netif->autoip->llipaddr), + ip4_addr3_16(&netif->autoip->llipaddr), ip4_addr4_16(&netif->autoip->llipaddr))); + } else { + autoip_arp_probe(netif); + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, + ("autoip_tmr() PROBING Sent Probe\n")); + netif->autoip->sent_num++; + /* calculate time to wait to next probe */ + netif->autoip->ttw = (u16_t)((LWIP_AUTOIP_RAND(netif) % + ((PROBE_MAX - PROBE_MIN) * AUTOIP_TICKS_PER_SECOND) ) + + PROBE_MIN * AUTOIP_TICKS_PER_SECOND); + } + } + break; + + case AUTOIP_STATE_ANNOUNCING: + if (netif->autoip->ttw > 0) { + netif->autoip->ttw--; + } else { + if (netif->autoip->sent_num == 0) { + /* We are here the first time, so we waited ANNOUNCE_WAIT seconds + * Now we can bind to an IP address and use it. + * + * autoip_bind calls netif_set_up. This triggers a gratuitous ARP + * which counts as an announcement. + */ + autoip_bind(netif); + } else { + autoip_arp_announce(netif); + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, + ("autoip_tmr() ANNOUNCING Sent Announce\n")); + } + netif->autoip->ttw = ANNOUNCE_INTERVAL * AUTOIP_TICKS_PER_SECOND; + netif->autoip->sent_num++; + + if (netif->autoip->sent_num >= ANNOUNCE_NUM) { + netif->autoip->state = AUTOIP_STATE_BOUND; + netif->autoip->sent_num = 0; + netif->autoip->ttw = 0; + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("autoip_tmr(): changing state to BOUND: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(&netif->autoip->llipaddr), ip4_addr2_16(&netif->autoip->llipaddr), + ip4_addr3_16(&netif->autoip->llipaddr), ip4_addr4_16(&netif->autoip->llipaddr))); + } + } + break; + } + } + /* proceed to next network interface */ + netif = netif->next; + } +} + +/** + * Handles every incoming ARP Packet, called by etharp_arp_input. + * + * @param netif network interface to use for autoip processing + * @param hdr Incoming ARP packet + */ +void +autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr) +{ + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, ("autoip_arp_reply()\n")); + if ((netif->autoip != NULL) && (netif->autoip->state != AUTOIP_STATE_OFF)) { + /* when ip.src == llipaddr && hw.src != netif->hwaddr + * + * when probing ip.dst == llipaddr && hw.src != netif->hwaddr + * we have a conflict and must solve it + */ + ip_addr_t sipaddr, dipaddr; + struct eth_addr netifaddr; + ETHADDR16_COPY(netifaddr.addr, netif->hwaddr); + + /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without + * structure packing (not using structure copy which breaks strict-aliasing rules). + */ + IPADDR2_COPY(&sipaddr, &hdr->sipaddr); + IPADDR2_COPY(&dipaddr, &hdr->dipaddr); + + if ((netif->autoip->state == AUTOIP_STATE_PROBING) || + ((netif->autoip->state == AUTOIP_STATE_ANNOUNCING) && + (netif->autoip->sent_num == 0))) { + /* RFC 3927 Section 2.2.1: + * from beginning to after ANNOUNCE_WAIT + * seconds we have a conflict if + * ip.src == llipaddr OR + * ip.dst == llipaddr && hw.src != own hwaddr + */ + if ((ip_addr_cmp(&sipaddr, &netif->autoip->llipaddr)) || + (ip_addr_cmp(&dipaddr, &netif->autoip->llipaddr) && + !eth_addr_cmp(&netifaddr, &hdr->shwaddr))) { + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, + ("autoip_arp_reply(): Probe Conflict detected\n")); + autoip_restart(netif); + } + } else { + /* RFC 3927 Section 2.5: + * in any state we have a conflict if + * ip.src == llipaddr && hw.src != own hwaddr + */ + if (ip_addr_cmp(&sipaddr, &netif->autoip->llipaddr) && + !eth_addr_cmp(&netifaddr, &hdr->shwaddr)) { + LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING, + ("autoip_arp_reply(): Conflicting ARP-Packet detected\n")); + autoip_handle_arp_conflict(netif); + } + } + } +} + +#endif /* LWIP_AUTOIP */ diff --git a/third_party/lwip-1.4.1/src/core/ipv4/icmp.c b/third_party/lwip-1.4.1/src/core/ipv4/icmp.c new file mode 100644 index 0000000..30f7cab --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/ipv4/icmp.c @@ -0,0 +1,339 @@ +/** + * @file + * ICMP - Internet Control Message Protocol + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +/* Some ICMP messages should be passed to the transport protocols. This + is not implemented. */ + +#include "lwip/opt.h" + +#if LWIP_ICMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/icmp.h" +#include "lwip/inet_chksum.h" +#include "lwip/ip.h" +#include "lwip/def.h" +#include "lwip/stats.h" +#include "lwip/snmp.h" + +#include + +/** Small optimization: set to 0 if incoming PBUF_POOL pbuf always can be + * used to modify and send a response packet (and to 1 if this is not the case, + * e.g. when link header is stripped of when receiving) */ +#ifndef LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN +#define LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN 1 +#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ + +/* The amount of data from the original packet to return in a dest-unreachable */ +#define ICMP_DEST_UNREACH_DATASIZE 8 + +static void icmp_send_response(struct pbuf *p, u8_t type, u8_t code); + +/** + * Processes ICMP input packets, called from ip_input(). + * + * Currently only processes icmp echo requests and sends + * out the echo response. + * + * @param p the icmp echo request packet, p->payload pointing to the ip header + * @param inp the netif on which this packet was received + */ +void +icmp_input(struct pbuf *p, struct netif *inp) +{ + u8_t type; +#ifdef LWIP_DEBUG + u8_t code; +#endif /* LWIP_DEBUG */ + struct icmp_echo_hdr *iecho; + struct ip_hdr *iphdr; + s16_t hlen; + + ICMP_STATS_INC(icmp.recv); + snmp_inc_icmpinmsgs(); + + + iphdr = (struct ip_hdr *)p->payload; + hlen = IPH_HL(iphdr) * 4; + if (pbuf_header(p, -hlen) || (p->tot_len < sizeof(u16_t)*2)) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: short ICMP (%"U16_F" bytes) received\n", p->tot_len)); + goto lenerr; + } + + type = *((u8_t *)p->payload); +#ifdef LWIP_DEBUG + code = *(((u8_t *)p->payload)+1); +#endif /* LWIP_DEBUG */ + switch (type) { + case ICMP_ER: + /* This is OK, echo reply might have been parsed by a raw PCB + (as obviously, an echo request has been sent, too). */ + break; + case ICMP_ECHO: +#if !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING + { + int accepted = 1; +#if !LWIP_MULTICAST_PING + /* multicast destination address? */ + if (ip_addr_ismulticast(¤t_iphdr_dest)) { + accepted = 0; + } +#endif /* LWIP_MULTICAST_PING */ +#if !LWIP_BROADCAST_PING + /* broadcast destination address? */ + if (ip_addr_isbroadcast(¤t_iphdr_dest, inp)) { + accepted = 0; + } +#endif /* LWIP_BROADCAST_PING */ + /* broadcast or multicast destination address not acceptd? */ + if (!accepted) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: Not echoing to multicast or broadcast pings\n")); + ICMP_STATS_INC(icmp.err); + pbuf_free(p); + return; + } + } +#endif /* !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING */ + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n")); + if (p->tot_len < sizeof(struct icmp_echo_hdr)) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n")); + goto lenerr; + } + if (inet_chksum_pbuf(p) != 0) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo\n")); + pbuf_free(p); + ICMP_STATS_INC(icmp.chkerr); + snmp_inc_icmpinerrors(); + return; + } +#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN + if (pbuf_header(p, (PBUF_IP_HLEN + PBUF_LINK_HLEN))) { + /* p is not big enough to contain link headers + * allocate a new one and copy p into it + */ + struct pbuf *r; + /* switch p->payload to ip header */ + if (pbuf_header(p, hlen)) { + LWIP_ASSERT("icmp_input: moving p->payload to ip header failed\n", 0); + goto memerr; + } + /* allocate new packet buffer with space for link headers */ + r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM); + if (r == NULL) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: allocating new pbuf failed\n")); + goto memerr; + } + LWIP_ASSERT("check that first pbuf can hold struct the ICMP header", + (r->len >= hlen + sizeof(struct icmp_echo_hdr))); + /* copy the whole packet including ip header */ + if (pbuf_copy(r, p) != ERR_OK) { + LWIP_ASSERT("icmp_input: copying to new pbuf failed\n", 0); + goto memerr; + } + iphdr = (struct ip_hdr *)r->payload; + /* switch r->payload back to icmp header */ + if (pbuf_header(r, -hlen)) { + LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0); + goto memerr; + } + /* free the original p */ + pbuf_free(p); + /* we now have an identical copy of p that has room for link headers */ + p = r; + } else { + /* restore p->payload to point to icmp header */ + if (pbuf_header(p, -(s16_t)(PBUF_IP_HLEN + PBUF_LINK_HLEN))) { + LWIP_ASSERT("icmp_input: restoring original p->payload failed\n", 0); + goto memerr; + } + } +#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ + /* At this point, all checks are OK. */ + /* We generate an answer by switching the dest and src ip addresses, + * setting the icmp type to ECHO_RESPONSE and updating the checksum. */ + iecho = (struct icmp_echo_hdr *)p->payload; + ip_addr_copy(iphdr->src, *ip_current_dest_addr()); + ip_addr_copy(iphdr->dest, *ip_current_src_addr()); + ICMPH_TYPE_SET(iecho, ICMP_ER); +#if CHECKSUM_GEN_ICMP + /* adjust the checksum */ + if (iecho->chksum >= PP_HTONS(0xffffU - (ICMP_ECHO << 8))) { + iecho->chksum += PP_HTONS(ICMP_ECHO << 8) + 1; + } else { + iecho->chksum += PP_HTONS(ICMP_ECHO << 8); + } +#else /* CHECKSUM_GEN_ICMP */ + iecho->chksum = 0; +#endif /* CHECKSUM_GEN_ICMP */ + + /* Set the correct TTL and recalculate the header checksum. */ + IPH_TTL_SET(iphdr, ICMP_TTL); + IPH_CHKSUM_SET(iphdr, 0); +#if CHECKSUM_GEN_IP + IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN)); +#endif /* CHECKSUM_GEN_IP */ + + ICMP_STATS_INC(icmp.xmit); + /* increase number of messages attempted to send */ + snmp_inc_icmpoutmsgs(); + /* increase number of echo replies attempted to send */ + snmp_inc_icmpoutechoreps(); + + if(pbuf_header(p, hlen)) { + LWIP_ASSERT("Can't move over header in packet", 0); + } else { + err_t ret; + /* send an ICMP packet, src addr is the dest addr of the curren packet */ + ret = ip_output_if(p, ip_current_dest_addr(), IP_HDRINCL, + ICMP_TTL, 0, IP_PROTO_ICMP, inp); + if (ret != ERR_OK) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ip_output_if returned an error: %c.\n", ret)); + } + } + break; + default: + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" code %"S16_F" not supported.\n", + (s16_t)type, (s16_t)code)); + ICMP_STATS_INC(icmp.proterr); + ICMP_STATS_INC(icmp.drop); + } + pbuf_free(p); + return; +lenerr: + pbuf_free(p); + ICMP_STATS_INC(icmp.lenerr); + snmp_inc_icmpinerrors(); + return; +#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN +memerr: + pbuf_free(p); + ICMP_STATS_INC(icmp.err); + snmp_inc_icmpinerrors(); + return; +#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */ +} + +/** + * Send an icmp 'destination unreachable' packet, called from ip_input() if + * the transport layer protocol is unknown and from udp_input() if the local + * port is not bound. + * + * @param p the input packet for which the 'unreachable' should be sent, + * p->payload pointing to the IP header + * @param t type of the 'unreachable' packet + */ +void +icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t) +{ + icmp_send_response(p, ICMP_DUR, t); +} + +#if IP_FORWARD || IP_REASSEMBLY +/** + * Send a 'time exceeded' packet, called from ip_forward() if TTL is 0. + * + * @param p the input packet for which the 'time exceeded' should be sent, + * p->payload pointing to the IP header + * @param t type of the 'time exceeded' packet + */ +void +icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t) +{ + icmp_send_response(p, ICMP_TE, t); +} + +#endif /* IP_FORWARD || IP_REASSEMBLY */ + +/** + * Send an icmp packet in response to an incoming packet. + * + * @param p the input packet for which the 'unreachable' should be sent, + * p->payload pointing to the IP header + * @param type Type of the ICMP header + * @param code Code of the ICMP header + */ +static void +icmp_send_response(struct pbuf *p, u8_t type, u8_t code) +{ + struct pbuf *q; + struct ip_hdr *iphdr; + /* we can use the echo header here */ + struct icmp_echo_hdr *icmphdr; + ip_addr_t iphdr_src; + + /* ICMP header + IP header + 8 bytes of data */ + q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE, + PBUF_RAM); + if (q == NULL) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded: failed to allocate pbuf for ICMP packet.\n")); + return; + } + LWIP_ASSERT("check that first pbuf can hold icmp message", + (q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE))); + + iphdr = (struct ip_hdr *)p->payload; + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded from ")); + ip_addr_debug_print(ICMP_DEBUG, &(iphdr->src)); + LWIP_DEBUGF(ICMP_DEBUG, (" to ")); + ip_addr_debug_print(ICMP_DEBUG, &(iphdr->dest)); + LWIP_DEBUGF(ICMP_DEBUG, ("\n")); + + icmphdr = (struct icmp_echo_hdr *)q->payload; + icmphdr->type = type; + icmphdr->code = code; + icmphdr->id = 0; + icmphdr->seqno = 0; + + /* copy fields from original packet */ + SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload, + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE); + + /* calculate checksum */ + icmphdr->chksum = 0; + icmphdr->chksum = inet_chksum(icmphdr, q->len); + ICMP_STATS_INC(icmp.xmit); + /* increase number of messages attempted to send */ + snmp_inc_icmpoutmsgs(); + /* increase number of destination unreachable messages attempted to send */ + snmp_inc_icmpouttimeexcds(); + ip_addr_copy(iphdr_src, iphdr->src); + ip_output(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP); + pbuf_free(q); +} + +#endif /* LWIP_ICMP */ diff --git a/third_party/lwip-1.4.1/src/core/ipv4/igmp.c b/third_party/lwip-1.4.1/src/core/ipv4/igmp.c new file mode 100644 index 0000000..f2a770b --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/ipv4/igmp.c @@ -0,0 +1,805 @@ +/** + * @file + * IGMP - Internet Group Management Protocol + * + */ + +/* + * Copyright (c) 2002 CITEL Technologies Ltd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of CITEL Technologies Ltd nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY CITEL TECHNOLOGIES AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL CITEL TECHNOLOGIES OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is a contribution to the lwIP TCP/IP stack. + * The Swedish Institute of Computer Science and Adam Dunkels + * are specifically granted permission to redistribute this + * source code. +*/ + +/*------------------------------------------------------------- +Note 1) +Although the rfc requires V1 AND V2 capability +we will only support v2 since now V1 is very old (August 1989) +V1 can be added if required + +a debug print and statistic have been implemented to +show this up. +------------------------------------------------------------- +------------------------------------------------------------- +Note 2) +A query for a specific group address (as opposed to ALLHOSTS) +has now been implemented as I am unsure if it is required + +a debug print and statistic have been implemented to +show this up. +------------------------------------------------------------- +------------------------------------------------------------- +Note 3) +The router alert rfc 2113 is implemented in outgoing packets +but not checked rigorously incoming +------------------------------------------------------------- +Steve Reynolds +------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- + * RFC 988 - Host extensions for IP multicasting - V0 + * RFC 1054 - Host extensions for IP multicasting - + * RFC 1112 - Host extensions for IP multicasting - V1 + * RFC 2236 - Internet Group Management Protocol, Version 2 - V2 <- this code is based on this RFC (it's the "de facto" standard) + * RFC 3376 - Internet Group Management Protocol, Version 3 - V3 + * RFC 4604 - Using Internet Group Management Protocol Version 3... - V3+ + * RFC 2113 - IP Router Alert Option - + *----------------------------------------------------------------------------*/ + +/*----------------------------------------------------------------------------- + * Includes + *----------------------------------------------------------------------------*/ + +#include "lwip/opt.h" + +#if LWIP_IGMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/igmp.h" +#include "lwip/debug.h" +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/ip.h" +#include "lwip/inet_chksum.h" +#include "lwip/netif.h" +#include "lwip/icmp.h" +#include "lwip/udp.h" +#include "lwip/tcp.h" +#include "lwip/stats.h" + +#include "string.h" + +/* + * IGMP constants + */ +#define IGMP_TTL 1 +#define IGMP_MINLEN 8 +#define ROUTER_ALERT 0x9404U +#define ROUTER_ALERTLEN 4 + +/* + * IGMP message types, including version number. + */ +#define IGMP_MEMB_QUERY 0x11 /* Membership query */ +#define IGMP_V1_MEMB_REPORT 0x12 /* Ver. 1 membership report */ +#define IGMP_V2_MEMB_REPORT 0x16 /* Ver. 2 membership report */ +#define IGMP_LEAVE_GROUP 0x17 /* Leave-group message */ + +/* Group membership states */ +#define IGMP_GROUP_NON_MEMBER 0 +#define IGMP_GROUP_DELAYING_MEMBER 1 +#define IGMP_GROUP_IDLE_MEMBER 2 + +/** + * IGMP packet format. + */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct igmp_msg { + PACK_STRUCT_FIELD(u8_t igmp_msgtype); + PACK_STRUCT_FIELD(u8_t igmp_maxresp); + PACK_STRUCT_FIELD(u16_t igmp_checksum); + PACK_STRUCT_FIELD(ip_addr_p_t igmp_group_address); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + + +static struct igmp_group *igmp_lookup_group(struct netif *ifp, ip_addr_t *addr); +static err_t igmp_remove_group(struct igmp_group *group); +static void igmp_timeout( struct igmp_group *group); +static void igmp_start_timer(struct igmp_group *group, u8_t max_time); +static void igmp_delaying_member(struct igmp_group *group, u8_t maxresp); +static err_t igmp_ip_output_if(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, struct netif *netif); +static void igmp_send(struct igmp_group *group, u8_t type); + + +static struct igmp_group* igmp_group_list; +static ip_addr_t allsystems; +static ip_addr_t allrouters; + + +/** + * Initialize the IGMP module + */ +void +igmp_init(void) +{ + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_init: initializing\n")); + + IP4_ADDR(&allsystems, 224, 0, 0, 1); + IP4_ADDR(&allrouters, 224, 0, 0, 2); +} + +#ifdef LWIP_DEBUG +/** + * Dump global IGMP groups list + */ +void +igmp_dump_group_list() +{ + struct igmp_group *group = igmp_group_list; + + while (group != NULL) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_dump_group_list: [%"U32_F"] ", (u32_t)(group->group_state))); + ip_addr_debug_print(IGMP_DEBUG, &group->group_address); + LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", group->netif)); + group = group->next; + } + LWIP_DEBUGF(IGMP_DEBUG, ("\n")); +} +#else +#define igmp_dump_group_list() +#endif /* LWIP_DEBUG */ + +/** + * Start IGMP processing on interface + * + * @param netif network interface on which start IGMP processing + */ +err_t +igmp_start(struct netif *netif) +{ + struct igmp_group* group; + + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_start: starting IGMP processing on if %p\n", netif)); + + group = igmp_lookup_group(netif, &allsystems); + + if (group != NULL) { + group->group_state = IGMP_GROUP_IDLE_MEMBER; + group->use++; + + /* Allow the igmp messages at the MAC level */ + if (netif->igmp_mac_filter != NULL) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_start: igmp_mac_filter(ADD ")); + ip_addr_debug_print(IGMP_DEBUG, &allsystems); + LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", netif)); + netif->igmp_mac_filter(netif, &allsystems, IGMP_ADD_MAC_FILTER); + } + + return ERR_OK; + } + + return ERR_MEM; +} + +/** + * Stop IGMP processing on interface + * + * @param netif network interface on which stop IGMP processing + */ +err_t +igmp_stop(struct netif *netif) +{ + struct igmp_group *group = igmp_group_list; + struct igmp_group *prev = NULL; + struct igmp_group *next; + + /* look for groups joined on this interface further down the list */ + while (group != NULL) { + next = group->next; + /* is it a group joined on this interface? */ + if (group->netif == netif) { + /* is it the first group of the list? */ + if (group == igmp_group_list) { + igmp_group_list = next; + } + /* is there a "previous" group defined? */ + if (prev != NULL) { + prev->next = next; + } + /* disable the group at the MAC level */ + if (netif->igmp_mac_filter != NULL) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_stop: igmp_mac_filter(DEL ")); + ip_addr_debug_print(IGMP_DEBUG, &group->group_address); + LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", netif)); + netif->igmp_mac_filter(netif, &(group->group_address), IGMP_DEL_MAC_FILTER); + } + /* free group */ + memp_free(MEMP_IGMP_GROUP, group); + } else { + /* change the "previous" */ + prev = group; + } + /* move to "next" */ + group = next; + } + return ERR_OK; +} + +/** + * Report IGMP memberships for this interface + * + * @param netif network interface on which report IGMP memberships + */ +void +igmp_report_groups(struct netif *netif) +{ + struct igmp_group *group = igmp_group_list; + + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_report_groups: sending IGMP reports on if %p\n", netif)); + + while (group != NULL) { + if (group->netif == netif) { + igmp_delaying_member(group, IGMP_JOIN_DELAYING_MEMBER_TMR); + } + group = group->next; + } +} + +/** + * Search for a group in the global igmp_group_list + * + * @param ifp the network interface for which to look + * @param addr the group ip address to search for + * @return a struct igmp_group* if the group has been found, + * NULL if the group wasn't found. + */ +struct igmp_group * +igmp_lookfor_group(struct netif *ifp, ip_addr_t *addr) +{ + struct igmp_group *group = igmp_group_list; + + while (group != NULL) { + if ((group->netif == ifp) && (ip_addr_cmp(&(group->group_address), addr))) { + return group; + } + group = group->next; + } + + /* to be clearer, we return NULL here instead of + * 'group' (which is also NULL at this point). + */ + return NULL; +} + +/** + * Search for a specific igmp group and create a new one if not found- + * + * @param ifp the network interface for which to look + * @param addr the group ip address to search + * @return a struct igmp_group*, + * NULL on memory error. + */ +struct igmp_group * +igmp_lookup_group(struct netif *ifp, ip_addr_t *addr) +{ + struct igmp_group *group = igmp_group_list; + + /* Search if the group already exists */ + group = igmp_lookfor_group(ifp, addr); + if (group != NULL) { + /* Group already exists. */ + return group; + } + + /* Group doesn't exist yet, create a new one */ + group = (struct igmp_group *)memp_malloc(MEMP_IGMP_GROUP); + if (group != NULL) { + group->netif = ifp; + ip_addr_set(&(group->group_address), addr); + group->timer = 0; /* Not running */ + group->group_state = IGMP_GROUP_NON_MEMBER; + group->last_reporter_flag = 0; + group->use = 0; + group->next = igmp_group_list; + + igmp_group_list = group; + } + + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_lookup_group: %sallocated a new group with address ", (group?"":"impossible to "))); + ip_addr_debug_print(IGMP_DEBUG, addr); + LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", ifp)); + + return group; +} + +/** + * Remove a group in the global igmp_group_list + * + * @param group the group to remove from the global igmp_group_list + * @return ERR_OK if group was removed from the list, an err_t otherwise + */ +static err_t +igmp_remove_group(struct igmp_group *group) +{ + err_t err = ERR_OK; + + /* Is it the first group? */ + if (igmp_group_list == group) { + igmp_group_list = group->next; + } else { + /* look for group further down the list */ + struct igmp_group *tmpGroup; + for (tmpGroup = igmp_group_list; tmpGroup != NULL; tmpGroup = tmpGroup->next) { + if (tmpGroup->next == group) { + tmpGroup->next = group->next; + break; + } + } + /* Group not found in the global igmp_group_list */ + if (tmpGroup == NULL) + err = ERR_ARG; + } + /* free group */ + memp_free(MEMP_IGMP_GROUP, group); + + return err; +} + +/** + * Called from ip_input() if a new IGMP packet is received. + * + * @param p received igmp packet, p->payload pointing to the ip header + * @param inp network interface on which the packet was received + * @param dest destination ip address of the igmp packet + */ +void +igmp_input(struct pbuf *p, struct netif *inp, ip_addr_t *dest) +{ + struct ip_hdr * iphdr; + struct igmp_msg* igmp; + struct igmp_group* group; + struct igmp_group* groupref; + + IGMP_STATS_INC(igmp.recv); + + /* Note that the length CAN be greater than 8 but only 8 are used - All are included in the checksum */ + iphdr = (struct ip_hdr *)p->payload; + if (pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4)) || (p->len < IGMP_MINLEN)) { + pbuf_free(p); + IGMP_STATS_INC(igmp.lenerr); + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: length error\n")); + return; + } + + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: message from ")); + ip_addr_debug_print(IGMP_DEBUG, &(iphdr->src)); + LWIP_DEBUGF(IGMP_DEBUG, (" to address ")); + ip_addr_debug_print(IGMP_DEBUG, &(iphdr->dest)); + LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", inp)); + + /* Now calculate and check the checksum */ + igmp = (struct igmp_msg *)p->payload; + if (inet_chksum(igmp, p->len)) { + pbuf_free(p); + IGMP_STATS_INC(igmp.chkerr); + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: checksum error\n")); + return; + } + + /* Packet is ok so find an existing group */ + group = igmp_lookfor_group(inp, dest); /* use the destination IP address of incoming packet */ + + /* If group can be found or create... */ + if (!group) { + pbuf_free(p); + IGMP_STATS_INC(igmp.drop); + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP frame not for us\n")); + return; + } + + /* NOW ACT ON THE INCOMING MESSAGE TYPE... */ + switch (igmp->igmp_msgtype) { + case IGMP_MEMB_QUERY: { + /* IGMP_MEMB_QUERY to the "all systems" address ? */ + if ((ip_addr_cmp(dest, &allsystems)) && ip_addr_isany(&igmp->igmp_group_address)) { + /* THIS IS THE GENERAL QUERY */ + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: General IGMP_MEMB_QUERY on \"ALL SYSTEMS\" address (224.0.0.1) [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); + + if (igmp->igmp_maxresp == 0) { + IGMP_STATS_INC(igmp.rx_v1); + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: got an all hosts query with time== 0 - this is V1 and not implemented - treat as v2\n")); + igmp->igmp_maxresp = IGMP_V1_DELAYING_MEMBER_TMR; + } else { + IGMP_STATS_INC(igmp.rx_general); + } + + groupref = igmp_group_list; + while (groupref) { + /* Do not send messages on the all systems group address! */ + if ((groupref->netif == inp) && (!(ip_addr_cmp(&(groupref->group_address), &allsystems)))) { + igmp_delaying_member(groupref, igmp->igmp_maxresp); + } + groupref = groupref->next; + } + } else { + /* IGMP_MEMB_QUERY to a specific group ? */ + if (!ip_addr_isany(&igmp->igmp_group_address)) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP_MEMB_QUERY to a specific group ")); + ip_addr_debug_print(IGMP_DEBUG, &igmp->igmp_group_address); + if (ip_addr_cmp(dest, &allsystems)) { + ip_addr_t groupaddr; + LWIP_DEBUGF(IGMP_DEBUG, (" using \"ALL SYSTEMS\" address (224.0.0.1) [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); + /* we first need to re-look for the group since we used dest last time */ + ip_addr_copy(groupaddr, igmp->igmp_group_address); + group = igmp_lookfor_group(inp, &groupaddr); + } else { + LWIP_DEBUGF(IGMP_DEBUG, (" with the group address as destination [igmp_maxresp=%i]\n", (int)(igmp->igmp_maxresp))); + } + + if (group != NULL) { + IGMP_STATS_INC(igmp.rx_group); + igmp_delaying_member(group, igmp->igmp_maxresp); + } else { + IGMP_STATS_INC(igmp.drop); + } + } else { + IGMP_STATS_INC(igmp.proterr); + } + } + break; + } + case IGMP_V2_MEMB_REPORT: { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: IGMP_V2_MEMB_REPORT\n")); + IGMP_STATS_INC(igmp.rx_report); + if (group->group_state == IGMP_GROUP_DELAYING_MEMBER) { + /* This is on a specific group we have already looked up */ + group->timer = 0; /* stopped */ + group->group_state = IGMP_GROUP_IDLE_MEMBER; + group->last_reporter_flag = 0; + } + break; + } + default: { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_input: unexpected msg %d in state %d on group %p on if %p\n", + igmp->igmp_msgtype, group->group_state, &group, group->netif)); + IGMP_STATS_INC(igmp.proterr); + break; + } + } + + pbuf_free(p); + return; +} + +/** + * Join a group on one network interface. + * + * @param ifaddr ip address of the network interface which should join a new group + * @param groupaddr the ip address of the group which to join + * @return ERR_OK if group was joined on the netif(s), an err_t otherwise + */ +err_t +igmp_joingroup(ip_addr_t *ifaddr, ip_addr_t *groupaddr) +{ + err_t err = ERR_VAL; /* no matching interface */ + struct igmp_group *group; + struct netif *netif; + + /* make sure it is multicast address */ + LWIP_ERROR("igmp_joingroup: attempt to join non-multicast address", ip_addr_ismulticast(groupaddr), return ERR_VAL;); + LWIP_ERROR("igmp_joingroup: attempt to join allsystems address", (!ip_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;); + + /* loop through netif's */ + netif = netif_list; + while (netif != NULL) { + /* Should we join this interface ? */ + if ((netif->flags & NETIF_FLAG_IGMP) && ((ip_addr_isany(ifaddr) || ip_addr_cmp(&(netif->ip_addr), ifaddr)))) { + /* find group or create a new one if not found */ + group = igmp_lookup_group(netif, groupaddr); + + if (group != NULL) { + /* This should create a new group, check the state to make sure */ + if (group->group_state != IGMP_GROUP_NON_MEMBER) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup: join to group not in state IGMP_GROUP_NON_MEMBER\n")); + } else { + /* OK - it was new group */ + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup: join to new group: ")); + ip_addr_debug_print(IGMP_DEBUG, groupaddr); + LWIP_DEBUGF(IGMP_DEBUG, ("\n")); + + /* If first use of the group, allow the group at the MAC level */ + if ((group->use==0) && (netif->igmp_mac_filter != NULL)) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup: igmp_mac_filter(ADD ")); + ip_addr_debug_print(IGMP_DEBUG, groupaddr); + LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", netif)); + netif->igmp_mac_filter(netif, groupaddr, IGMP_ADD_MAC_FILTER); + } + + IGMP_STATS_INC(igmp.tx_join); + igmp_send(group, IGMP_V2_MEMB_REPORT); + + igmp_start_timer(group, IGMP_JOIN_DELAYING_MEMBER_TMR); + + /* Need to work out where this timer comes from */ + group->group_state = IGMP_GROUP_DELAYING_MEMBER; + } + /* Increment group use */ + group->use++; + /* Join on this interface */ + err = ERR_OK; + } else { + /* Return an error even if some network interfaces are joined */ + /** @todo undo any other netif already joined */ + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_joingroup: Not enought memory to join to group\n")); + return ERR_MEM; + } + } + /* proceed to next network interface */ + netif = netif->next; + } + + return err; +} + +/** + * Leave a group on one network interface. + * + * @param ifaddr ip address of the network interface which should leave a group + * @param groupaddr the ip address of the group which to leave + * @return ERR_OK if group was left on the netif(s), an err_t otherwise + */ +err_t +igmp_leavegroup(ip_addr_t *ifaddr, ip_addr_t *groupaddr) +{ + err_t err = ERR_VAL; /* no matching interface */ + struct igmp_group *group; + struct netif *netif; + + /* make sure it is multicast address */ + LWIP_ERROR("igmp_leavegroup: attempt to leave non-multicast address", ip_addr_ismulticast(groupaddr), return ERR_VAL;); + LWIP_ERROR("igmp_leavegroup: attempt to leave allsystems address", (!ip_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;); + + /* loop through netif's */ + netif = netif_list; + while (netif != NULL) { + /* Should we leave this interface ? */ + if ((netif->flags & NETIF_FLAG_IGMP) && ((ip_addr_isany(ifaddr) || ip_addr_cmp(&(netif->ip_addr), ifaddr)))) { + /* find group */ + group = igmp_lookfor_group(netif, groupaddr); + + if (group != NULL) { + /* Only send a leave if the flag is set according to the state diagram */ + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: Leaving group: ")); + ip_addr_debug_print(IGMP_DEBUG, groupaddr); + LWIP_DEBUGF(IGMP_DEBUG, ("\n")); + + /* If there is no other use of the group */ + if (group->use <= 1) { + /* If we are the last reporter for this group */ + if (group->last_reporter_flag) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: sending leaving group\n")); + IGMP_STATS_INC(igmp.tx_leave); + igmp_send(group, IGMP_LEAVE_GROUP); + } + + /* Disable the group at the MAC level */ + if (netif->igmp_mac_filter != NULL) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: igmp_mac_filter(DEL ")); + ip_addr_debug_print(IGMP_DEBUG, groupaddr); + LWIP_DEBUGF(IGMP_DEBUG, (") on if %p\n", netif)); + netif->igmp_mac_filter(netif, groupaddr, IGMP_DEL_MAC_FILTER); + } + + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: remove group: ")); + ip_addr_debug_print(IGMP_DEBUG, groupaddr); + LWIP_DEBUGF(IGMP_DEBUG, ("\n")); + + /* Free the group */ + igmp_remove_group(group); + } else { + /* Decrement group use */ + group->use--; + } + /* Leave on this interface */ + err = ERR_OK; + } else { + /* It's not a fatal error on "leavegroup" */ + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_leavegroup: not member of group\n")); + } + } + /* proceed to next network interface */ + netif = netif->next; + } + + return err; +} + +/** + * The igmp timer function (both for NO_SYS=1 and =0) + * Should be called every IGMP_TMR_INTERVAL milliseconds (100 ms is default). + */ +void +igmp_tmr(void) +{ + struct igmp_group *group = igmp_group_list; + + while (group != NULL) { + if (group->timer > 0) { + group->timer--; + if (group->timer == 0) { + igmp_timeout(group); + } + } + group = group->next; + } +} + +/** + * Called if a timeout for one group is reached. + * Sends a report for this group. + * + * @param group an igmp_group for which a timeout is reached + */ +static void +igmp_timeout(struct igmp_group *group) +{ + /* If the state is IGMP_GROUP_DELAYING_MEMBER then we send a report for this group */ + if (group->group_state == IGMP_GROUP_DELAYING_MEMBER) { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_timeout: report membership for group with address ")); + ip_addr_debug_print(IGMP_DEBUG, &(group->group_address)); + LWIP_DEBUGF(IGMP_DEBUG, (" on if %p\n", group->netif)); + + IGMP_STATS_INC(igmp.tx_report); + igmp_send(group, IGMP_V2_MEMB_REPORT); + } +} + +/** + * Start a timer for an igmp group + * + * @param group the igmp_group for which to start a timer + * @param max_time the time in multiples of IGMP_TMR_INTERVAL (decrease with + * every call to igmp_tmr()) + */ +static void +igmp_start_timer(struct igmp_group *group, u8_t max_time) +{ + /* ensure the input value is > 0 */ + if (max_time == 0) { + max_time = 1; + } + /* ensure the random value is > 0 */ + group->timer = (LWIP_RAND() % (max_time - 1)) + 1; +} + +/** + * Delaying membership report for a group if necessary + * + * @param group the igmp_group for which "delaying" membership report + * @param maxresp query delay + */ +static void +igmp_delaying_member(struct igmp_group *group, u8_t maxresp) +{ + if ((group->group_state == IGMP_GROUP_IDLE_MEMBER) || + ((group->group_state == IGMP_GROUP_DELAYING_MEMBER) && + ((group->timer == 0) || (maxresp < group->timer)))) { + igmp_start_timer(group, maxresp); + group->group_state = IGMP_GROUP_DELAYING_MEMBER; + } +} + + +/** + * Sends an IP packet on a network interface. This function constructs the IP header + * and calculates the IP header checksum. If the source IP address is NULL, + * the IP address of the outgoing network interface is filled in as source address. + * + * @param p the packet to send (p->payload points to the data, e.g. next + protocol header; if dest == IP_HDRINCL, p already includes an IP + header and p->payload points to that IP header) + * @param src the source IP address to send from (if src == IP_ADDR_ANY, the + * IP address of the netif used to send is used as source address) + * @param dest the destination IP address to send the packet to + * @param ttl the TTL value to be set in the IP header + * @param proto the PROTOCOL to be set in the IP header + * @param netif the netif on which to send this packet + * @return ERR_OK if the packet was sent OK + * ERR_BUF if p doesn't have enough space for IP/LINK headers + * returns errors returned by netif->output + */ +static err_t +igmp_ip_output_if(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, struct netif *netif) +{ + /* This is the "router alert" option */ + u16_t ra[2]; + ra[0] = PP_HTONS(ROUTER_ALERT); + ra[1] = 0x0000; /* Router shall examine packet */ + IGMP_STATS_INC(igmp.xmit); + return ip_output_if_opt(p, src, dest, IGMP_TTL, 0, IP_PROTO_IGMP, netif, ra, ROUTER_ALERTLEN); +} + +/** + * Send an igmp packet to a specific group. + * + * @param group the group to which to send the packet + * @param type the type of igmp packet to send + */ +static void +igmp_send(struct igmp_group *group, u8_t type) +{ + struct pbuf* p = NULL; + struct igmp_msg* igmp = NULL; + ip_addr_t src = *IP_ADDR_ANY; + ip_addr_t* dest = NULL; + + /* IP header + "router alert" option + IGMP header */ + p = pbuf_alloc(PBUF_TRANSPORT, IGMP_MINLEN, PBUF_RAM); + + if (p) { + igmp = (struct igmp_msg *)p->payload; + LWIP_ASSERT("igmp_send: check that first pbuf can hold struct igmp_msg", + (p->len >= sizeof(struct igmp_msg))); + ip_addr_copy(src, group->netif->ip_addr); + + if (type == IGMP_V2_MEMB_REPORT) { + dest = &(group->group_address); + ip_addr_copy(igmp->igmp_group_address, group->group_address); + group->last_reporter_flag = 1; /* Remember we were the last to report */ + } else { + if (type == IGMP_LEAVE_GROUP) { + dest = &allrouters; + ip_addr_copy(igmp->igmp_group_address, group->group_address); + } + } + + if ((type == IGMP_V2_MEMB_REPORT) || (type == IGMP_LEAVE_GROUP)) { + igmp->igmp_msgtype = type; + igmp->igmp_maxresp = 0; + igmp->igmp_checksum = 0; + igmp->igmp_checksum = inet_chksum(igmp, IGMP_MINLEN); + + igmp_ip_output_if(p, &src, dest, group->netif); + } + + pbuf_free(p); + } else { + LWIP_DEBUGF(IGMP_DEBUG, ("igmp_send: not enough memory for igmp_send\n")); + IGMP_STATS_INC(igmp.memerr); + } +} + +#endif /* LWIP_IGMP */ diff --git a/third_party/lwip-1.4.1/src/core/ipv4/inet.c b/third_party/lwip-1.4.1/src/core/ipv4/inet.c new file mode 100644 index 0000000..9fdada6 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/ipv4/inet.c @@ -0,0 +1,42 @@ +/** + * @file + * Functions common to all TCP/IPv4 modules, such as the byte order functions. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/inet.h" + diff --git a/third_party/lwip-1.4.1/src/core/ipv4/inet_chksum.c b/third_party/lwip-1.4.1/src/core/ipv4/inet_chksum.c new file mode 100644 index 0000000..59e1b4a --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/ipv4/inet_chksum.c @@ -0,0 +1,450 @@ +/** + * @file + * Incluse internet checksum functions. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/inet_chksum.h" +#include "lwip/def.h" + +#include +#include + +/* These are some reference implementations of the checksum algorithm, with the + * aim of being simple, correct and fully portable. Checksumming is the + * first thing you would want to optimize for your platform. If you create + * your own version, link it in and in your cc.h put: + * + * #define LWIP_CHKSUM + * + * Or you can select from the implementations below by defining + * LWIP_CHKSUM_ALGORITHM to 1, 2 or 3. + */ + +#ifndef LWIP_CHKSUM +# define LWIP_CHKSUM lwip_standard_chksum +# ifndef LWIP_CHKSUM_ALGORITHM +# define LWIP_CHKSUM_ALGORITHM 2 +# endif +#endif +/* If none set: */ +#ifndef LWIP_CHKSUM_ALGORITHM +# define LWIP_CHKSUM_ALGORITHM 0 +#endif + +#if (LWIP_CHKSUM_ALGORITHM == 1) /* Version #1 */ +/** + * lwip checksum + * + * @param dataptr points to start of data to be summed at any boundary + * @param len length of data to be summed + * @return host order (!) lwip checksum (non-inverted Internet sum) + * + * @note accumulator size limits summable length to 64k + * @note host endianess is irrelevant (p3 RFC1071) + */ +static u16_t +lwip_standard_chksum(void *dataptr, u16_t len) +{ + u32_t acc; + u16_t src; + u8_t *octetptr; + + acc = 0; + /* dataptr may be at odd or even addresses */ + octetptr = (u8_t*)dataptr; + while (len > 1) { + /* declare first octet as most significant + thus assume network order, ignoring host order */ + src = (*octetptr) << 8; + octetptr++; + /* declare second octet as least significant */ + src |= (*octetptr); + octetptr++; + acc += src; + len -= 2; + } + if (len > 0) { + /* accumulate remaining octet */ + src = (*octetptr) << 8; + acc += src; + } + /* add deferred carry bits */ + acc = (acc >> 16) + (acc & 0x0000ffffUL); + if ((acc & 0xffff0000UL) != 0) { + acc = (acc >> 16) + (acc & 0x0000ffffUL); + } + /* This maybe a little confusing: reorder sum using htons() + instead of ntohs() since it has a little less call overhead. + The caller must invert bits for Internet sum ! */ + return htons((u16_t)acc); +} +#endif + +#if (LWIP_CHKSUM_ALGORITHM == 2) /* Alternative version #2 */ +/* + * Curt McDowell + * Broadcom Corp. + * csm@broadcom.com + * + * IP checksum two bytes at a time with support for + * unaligned buffer. + * Works for len up to and including 0x20000. + * by Curt McDowell, Broadcom Corp. 12/08/2005 + * + * @param dataptr points to start of data to be summed at any boundary + * @param len length of data to be summed + * @return host order (!) lwip checksum (non-inverted Internet sum) + */ + +static u16_t +lwip_standard_chksum(void *dataptr, int len) +{ + u8_t *pb = (u8_t *)dataptr; + u16_t *ps, t = 0; + u32_t sum = 0; + int odd = ((mem_ptr_t)pb & 1); + + /* Get aligned to u16_t */ + if (odd && len > 0) { + ((u8_t *)&t)[1] = *pb++; + len--; + } + + /* Add the bulk of the data */ + ps = (u16_t *)(void *)pb; + while (len > 1) { + sum += *ps++; + len -= 2; + } + + /* Consume left-over byte, if any */ + if (len > 0) { + ((u8_t *)&t)[0] = *(u8_t *)ps; + } + + /* Add end bytes */ + sum += t; + + /* Fold 32-bit sum to 16 bits + calling this twice is propably faster than if statements... */ + sum = FOLD_U32T(sum); + sum = FOLD_U32T(sum); + + /* Swap if alignment was odd */ + if (odd) { + sum = SWAP_BYTES_IN_WORD(sum); + } + + return (u16_t)sum; +} +#endif + +#if (LWIP_CHKSUM_ALGORITHM == 3) /* Alternative version #3 */ +/** + * An optimized checksum routine. Basically, it uses loop-unrolling on + * the checksum loop, treating the head and tail bytes specially, whereas + * the inner loop acts on 8 bytes at a time. + * + * @arg start of buffer to be checksummed. May be an odd byte address. + * @len number of bytes in the buffer to be checksummed. + * @return host order (!) lwip checksum (non-inverted Internet sum) + * + * by Curt McDowell, Broadcom Corp. December 8th, 2005 + */ + +static u16_t +lwip_standard_chksum(void *dataptr, int len) +{ + u8_t *pb = (u8_t *)dataptr; + u16_t *ps, t = 0; + u32_t *pl; + u32_t sum = 0, tmp; + /* starts at odd byte address? */ + int odd = ((mem_ptr_t)pb & 1); + + if (odd && len > 0) { + ((u8_t *)&t)[1] = *pb++; + len--; + } + + ps = (u16_t *)pb; + + if (((mem_ptr_t)ps & 3) && len > 1) { + sum += *ps++; + len -= 2; + } + + pl = (u32_t *)ps; + + while (len > 7) { + tmp = sum + *pl++; /* ping */ + if (tmp < sum) { + tmp++; /* add back carry */ + } + + sum = tmp + *pl++; /* pong */ + if (sum < tmp) { + sum++; /* add back carry */ + } + + len -= 8; + } + + /* make room in upper bits */ + sum = FOLD_U32T(sum); + + ps = (u16_t *)pl; + + /* 16-bit aligned word remaining? */ + while (len > 1) { + sum += *ps++; + len -= 2; + } + + /* dangling tail byte remaining? */ + if (len > 0) { /* include odd byte */ + ((u8_t *)&t)[0] = *(u8_t *)ps; + } + + sum += t; /* add end bytes */ + + /* Fold 32-bit sum to 16 bits + calling this twice is propably faster than if statements... */ + sum = FOLD_U32T(sum); + sum = FOLD_U32T(sum); + + if (odd) { + sum = SWAP_BYTES_IN_WORD(sum); + } + + return (u16_t)sum; +} +#endif + +/* inet_chksum_pseudo: + * + * Calculates the pseudo Internet checksum used by TCP and UDP for a pbuf chain. + * IP addresses are expected to be in network byte order. + * + * @param p chain of pbufs over that a checksum should be calculated (ip data part) + * @param src source ip address (used for checksum of pseudo header) + * @param dst destination ip address (used for checksum of pseudo header) + * @param proto ip protocol (used for checksum of pseudo header) + * @param proto_len length of the ip data part (used for checksum of pseudo header) + * @return checksum (as u16_t) to be saved directly in the protocol header + */ +u16_t +inet_chksum_pseudo(struct pbuf *p, + ip_addr_t *src, ip_addr_t *dest, + u8_t proto, u16_t proto_len) +{ + u32_t acc; + u32_t addr; + struct pbuf *q; + u8_t swapped; + + acc = 0; + swapped = 0; + /* iterate through all pbuf in chain */ + for(q = p; q != NULL; q = q->next) { + LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n", + (void *)q, (void *)q->next)); + acc += LWIP_CHKSUM(q->payload, q->len); + /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/ + /* just executing this next line is probably faster that the if statement needed + to check whether we really need to execute it, and does no harm */ + acc = FOLD_U32T(acc); + if (q->len % 2 != 0) { + swapped = 1 - swapped; + acc = SWAP_BYTES_IN_WORD(acc); + } + /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/ + } + + if (swapped) { + acc = SWAP_BYTES_IN_WORD(acc); + } + addr = ip4_addr_get_u32(src); + acc += (addr & 0xffffUL); + acc += ((addr >> 16) & 0xffffUL); + addr = ip4_addr_get_u32(dest); + acc += (addr & 0xffffUL); + acc += ((addr >> 16) & 0xffffUL); + acc += (u32_t)htons((u16_t)proto); + acc += (u32_t)htons(proto_len); + + /* Fold 32-bit sum to 16 bits + calling this twice is propably faster than if statements... */ + acc = FOLD_U32T(acc); + acc = FOLD_U32T(acc); + LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F"\n", acc)); + return (u16_t)~(acc & 0xffffUL); +} + +/* inet_chksum_pseudo: + * + * Calculates the pseudo Internet checksum used by TCP and UDP for a pbuf chain. + * IP addresses are expected to be in network byte order. + * + * @param p chain of pbufs over that a checksum should be calculated (ip data part) + * @param src source ip address (used for checksum of pseudo header) + * @param dst destination ip address (used for checksum of pseudo header) + * @param proto ip protocol (used for checksum of pseudo header) + * @param proto_len length of the ip data part (used for checksum of pseudo header) + * @return checksum (as u16_t) to be saved directly in the protocol header + */ +u16_t +inet_chksum_pseudo_partial(struct pbuf *p, + ip_addr_t *src, ip_addr_t *dest, + u8_t proto, u16_t proto_len, u16_t chksum_len) +{ + u32_t acc; + u32_t addr; + struct pbuf *q; + u8_t swapped; + u16_t chklen; + + acc = 0; + swapped = 0; + /* iterate through all pbuf in chain */ + for(q = p; (q != NULL) && (chksum_len > 0); q = q->next) { + LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \n", + (void *)q, (void *)q->next)); + chklen = q->len; + if (chklen > chksum_len) { + chklen = chksum_len; + } + acc += LWIP_CHKSUM(q->payload, chklen); + chksum_len -= chklen; + LWIP_ASSERT("delete me", chksum_len < 0x7fff); + /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): unwrapped lwip_chksum()=%"X32_F" \n", acc));*/ + /* fold the upper bit down */ + acc = FOLD_U32T(acc); + if (q->len % 2 != 0) { + swapped = 1 - swapped; + acc = SWAP_BYTES_IN_WORD(acc); + } + /*LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): wrapped lwip_chksum()=%"X32_F" \n", acc));*/ + } + + if (swapped) { + acc = SWAP_BYTES_IN_WORD(acc); + } + addr = ip4_addr_get_u32(src); + acc += (addr & 0xffffUL); + acc += ((addr >> 16) & 0xffffUL); + addr = ip4_addr_get_u32(dest); + acc += (addr & 0xffffUL); + acc += ((addr >> 16) & 0xffffUL); + acc += (u32_t)htons((u16_t)proto); + acc += (u32_t)htons(proto_len); + + /* Fold 32-bit sum to 16 bits + calling this twice is propably faster than if statements... */ + acc = FOLD_U32T(acc); + acc = FOLD_U32T(acc); + LWIP_DEBUGF(INET_DEBUG, ("inet_chksum_pseudo(): pbuf chain lwip_chksum()=%"X32_F"\n", acc)); + return (u16_t)~(acc & 0xffffUL); +} + +/* inet_chksum: + * + * Calculates the Internet checksum over a portion of memory. Used primarily for IP + * and ICMP. + * + * @param dataptr start of the buffer to calculate the checksum (no alignment needed) + * @param len length of the buffer to calculate the checksum + * @return checksum (as u16_t) to be saved directly in the protocol header + */ + +u16_t +inet_chksum(void *dataptr, u16_t len) +{ + return ~LWIP_CHKSUM(dataptr, len); +} + +/** + * Calculate a checksum over a chain of pbufs (without pseudo-header, much like + * inet_chksum only pbufs are used). + * + * @param p pbuf chain over that the checksum should be calculated + * @return checksum (as u16_t) to be saved directly in the protocol header + */ +u16_t +inet_chksum_pbuf(struct pbuf *p) +{ + u32_t acc; + struct pbuf *q; + u8_t swapped; + + acc = 0; + swapped = 0; + for(q = p; q != NULL; q = q->next) { + acc += LWIP_CHKSUM(q->payload, q->len); + acc = FOLD_U32T(acc); + if (q->len % 2 != 0) { + swapped = 1 - swapped; + acc = SWAP_BYTES_IN_WORD(acc); + } + } + + if (swapped) { + acc = SWAP_BYTES_IN_WORD(acc); + } + return (u16_t)~(acc & 0xffffUL); +} + +/* These are some implementations for LWIP_CHKSUM_COPY, which copies data + * like MEMCPY but generates a checksum at the same time. Since this is a + * performance-sensitive function, you might want to create your own version + * in assembly targeted at your hardware by defining it in lwipopts.h: + * #define LWIP_CHKSUM_COPY(dst, src, len) your_chksum_copy(dst, src, len) + */ + +#if (LWIP_CHKSUM_COPY_ALGORITHM == 1) /* Version #1 */ +/** Safe but slow: first call MEMCPY, then call LWIP_CHKSUM. + * For architectures with big caches, data might still be in cache when + * generating the checksum after copying. + */ +u16_t +lwip_chksum_copy(void *dst, const void *src, u16_t len) +{ + MEMCPY(dst, src, len); + return LWIP_CHKSUM(dst, len); +} +#endif /* (LWIP_CHKSUM_COPY_ALGORITHM == 1) */ diff --git a/third_party/lwip-1.4.1/src/core/ipv4/ip.c b/third_party/lwip-1.4.1/src/core/ipv4/ip.c new file mode 100644 index 0000000..47b2c39 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/ipv4/ip.c @@ -0,0 +1,924 @@ +/** + * @file + * This is the IPv4 layer implementation for incoming and outgoing IP traffic. + * + * @see ip_frag.c + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" +#include "lwip/ip.h" +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/ip_frag.h" +#include "lwip/inet_chksum.h" +#include "lwip/netif.h" +#include "lwip/icmp.h" +#include "lwip/igmp.h" +#include "lwip/raw.h" +#include "lwip/udp.h" +#include "lwip/tcp_impl.h" +#include "lwip/snmp.h" +#include "lwip/dhcp.h" +#include "lwip/autoip.h" +#include "lwip/stats.h" +#include "arch/perf.h" + +#include + +/** Set this to 0 in the rare case of wanting to call an extra function to + * generate the IP checksum (in contrast to calculating it on-the-fly). */ +#ifndef LWIP_INLINE_IP_CHKSUM +#define LWIP_INLINE_IP_CHKSUM 1 +#endif +#if LWIP_INLINE_IP_CHKSUM && CHECKSUM_GEN_IP +#define CHECKSUM_GEN_IP_INLINE 1 +#else +#define CHECKSUM_GEN_IP_INLINE 0 +#endif + +#if LWIP_DHCP || defined(LWIP_IP_ACCEPT_UDP_PORT) +#define IP_ACCEPT_LINK_LAYER_ADDRESSING 1 + +/** Some defines for DHCP to let link-layer-addressed packets through while the + * netif is down. + * To use this in your own application/protocol, define LWIP_IP_ACCEPT_UDP_PORT + * to return 1 if the port is accepted and 0 if the port is not accepted. + */ +#if LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) +/* accept DHCP client port and custom port */ +#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) (((port) == PP_NTOHS(DHCP_CLIENT_PORT)) \ + || (LWIP_IP_ACCEPT_UDP_PORT(port))) +#elif defined(LWIP_IP_ACCEPT_UDP_PORT) /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */ +/* accept custom port only */ +#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) (LWIP_IP_ACCEPT_UDP_PORT(port)) +#else /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */ +/* accept DHCP client port only */ +#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) ((port) == PP_NTOHS(DHCP_CLIENT_PORT)) +#endif /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */ + +#else /* LWIP_DHCP */ +#define IP_ACCEPT_LINK_LAYER_ADDRESSING 0 +#endif /* LWIP_DHCP */ + +/** + * The interface that provided the packet for the current callback + * invocation. + */ +struct netif *current_netif; + +/** + * Header of the input packet currently being processed. + */ +const struct ip_hdr *current_header; +/** Source IP address of current_header */ +ip_addr_t current_iphdr_src; +/** Destination IP address of current_header */ +ip_addr_t current_iphdr_dest; + +/** The IP header ID of the next outgoing IP packet */ +static u16_t ip_id; + +/** + * Finds the appropriate network interface for a given IP address. It + * searches the list of network interfaces linearly. A match is found + * if the masked IP address of the network interface equals the masked + * IP address given to the function. + * + * @param dest the destination IP address for which to find the route + * @return the netif on which to send to reach dest + */ +struct netif * +ip_route(ip_addr_t *dest) +{ + struct netif *netif; + +#ifdef LWIP_HOOK_IP4_ROUTE + netif = LWIP_HOOK_IP4_ROUTE(dest); + if (netif != NULL) { + return netif; + } +#endif + + /* iterate through netifs */ + for (netif = netif_list; netif != NULL; netif = netif->next) { + /* network mask matches? */ + if (netif_is_up(netif)) { + if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) { + /* return netif on which to forward IP packet */ + return netif; + } + } + } + if ((netif_default == NULL) || (!netif_is_up(netif_default))) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_route: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest))); + IP_STATS_INC(ip.rterr); + snmp_inc_ipoutnoroutes(); + return NULL; + } + /* no matching netif found, use default netif */ + return netif_default; +} + +#if IP_FORWARD +/** + * Determine whether an IP address is in a reserved set of addresses + * that may not be forwarded, or whether datagrams to that destination + * may be forwarded. + * @param p the packet to forward + * @param dest the destination IP address + * @return 1: can forward 0: discard + */ +static int +ip_canforward(struct pbuf *p) +{ + u32_t addr = ip4_addr_get_u32(ip_current_dest_addr()); + + if (p->flags & PBUF_FLAG_LLBCAST) { + /* don't route link-layer broadcasts */ + return 0; + } + if ((p->flags & PBUF_FLAG_LLMCAST) && !IP_MULTICAST(addr)) { + /* don't route link-layer multicasts unless the destination address is an IP + multicast address */ + return 0; + } + if (IP_EXPERIMENTAL(addr)) { + return 0; + } + if (IP_CLASSA(addr)) { + u32_t net = addr & IP_CLASSA_NET; + if ((net == 0) || (net == (IP_LOOPBACKNET << IP_CLASSA_NSHIFT))) { + /* don't route loopback packets */ + return 0; + } + } + return 1; +} + +/** + * Forwards an IP packet. It finds an appropriate route for the + * packet, decrements the TTL value of the packet, adjusts the + * checksum and outputs the packet on the appropriate interface. + * + * @param p the packet to forward (p->payload points to IP header) + * @param iphdr the IP header of the input packet + * @param inp the netif on which this packet was received + */ +static void +ip_forward(struct pbuf *p, struct ip_hdr *iphdr, struct netif *inp) +{ + struct netif *netif; + + PERF_START; + + if (!ip_canforward(p)) { + goto return_noroute; + } + + /* RFC3927 2.7: do not forward link-local addresses */ + if (ip_addr_islinklocal(¤t_iphdr_dest)) { + LWIP_DEBUGF(IP_DEBUG, ("ip_forward: not forwarding LLA %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(¤t_iphdr_dest), ip4_addr2_16(¤t_iphdr_dest), + ip4_addr3_16(¤t_iphdr_dest), ip4_addr4_16(¤t_iphdr_dest))); + goto return_noroute; + } + + /* Find network interface where to forward this IP packet to. */ + netif = ip_route(¤t_iphdr_dest); + if (netif == NULL) { + LWIP_DEBUGF(IP_DEBUG, ("ip_forward: no forwarding route for %"U16_F".%"U16_F".%"U16_F".%"U16_F" found\n", + ip4_addr1_16(¤t_iphdr_dest), ip4_addr2_16(¤t_iphdr_dest), + ip4_addr3_16(¤t_iphdr_dest), ip4_addr4_16(¤t_iphdr_dest))); + /* @todo: send ICMP_DUR_NET? */ + goto return_noroute; + } +#if !IP_FORWARD_ALLOW_TX_ON_RX_NETIF + /* Do not forward packets onto the same network interface on which + * they arrived. */ + if (netif == inp) { + LWIP_DEBUGF(IP_DEBUG, ("ip_forward: not bouncing packets back on incoming interface.\n")); + goto return_noroute; + } +#endif /* IP_FORWARD_ALLOW_TX_ON_RX_NETIF */ + + /* decrement TTL */ + IPH_TTL_SET(iphdr, IPH_TTL(iphdr) - 1); + /* send ICMP if TTL == 0 */ + if (IPH_TTL(iphdr) == 0) { + snmp_inc_ipinhdrerrors(); +#if LWIP_ICMP + /* Don't send ICMP messages in response to ICMP messages */ + if (IPH_PROTO(iphdr) != IP_PROTO_ICMP) { + icmp_time_exceeded(p, ICMP_TE_TTL); + } +#endif /* LWIP_ICMP */ + return; + } + + /* Incrementally update the IP checksum. */ + if (IPH_CHKSUM(iphdr) >= PP_HTONS(0xffffU - 0x100)) { + IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + PP_HTONS(0x100) + 1); + } else { + IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + PP_HTONS(0x100)); + } + + LWIP_DEBUGF(IP_DEBUG, ("ip_forward: forwarding packet to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(¤t_iphdr_dest), ip4_addr2_16(¤t_iphdr_dest), + ip4_addr3_16(¤t_iphdr_dest), ip4_addr4_16(¤t_iphdr_dest))); + + IP_STATS_INC(ip.fw); + IP_STATS_INC(ip.xmit); + snmp_inc_ipforwdatagrams(); + + PERF_STOP("ip_forward"); + /* don't fragment if interface has mtu set to 0 [loopif] */ + if (netif->mtu && (p->tot_len > netif->mtu)) { + if ((IPH_OFFSET(iphdr) & PP_NTOHS(IP_DF)) == 0) { +#if IP_FRAG + ip_frag(p, netif, ip_current_dest_addr()); +#else /* IP_FRAG */ + /* @todo: send ICMP Destination Unreacheable code 13 "Communication administratively prohibited"? */ +#endif /* IP_FRAG */ + } else { + /* send ICMP Destination Unreacheable code 4: "Fragmentation Needed and DF Set" */ + icmp_dest_unreach(p, ICMP_DUR_FRAG); + } + return; + } + /* transmit pbuf on chosen interface */ + netif->output(netif, p, ¤t_iphdr_dest); + return; +return_noroute: + snmp_inc_ipoutnoroutes(); +} +#endif /* IP_FORWARD */ + +/** + * This function is called by the network interface device driver when + * an IP packet is received. The function does the basic checks of the + * IP header such as packet size being at least larger than the header + * size etc. If the packet was not destined for us, the packet is + * forwarded (using ip_forward). The IP checksum is always checked. + * + * Finally, the packet is sent to the upper layer protocol input function. + * + * @param p the received IP packet (p->payload points to IP header) + * @param inp the netif on which this packet was received + * @return ERR_OK if the packet was processed (could return ERR_* if it wasn't + * processed, but currently always returns ERR_OK) + */ +err_t +ip_input(struct pbuf *p, struct netif *inp) +{ + struct ip_hdr *iphdr; + struct netif *netif; + u16_t iphdr_hlen; + u16_t iphdr_len; +#if IP_ACCEPT_LINK_LAYER_ADDRESSING + int check_ip_src=1; +#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */ + + IP_STATS_INC(ip.recv); + snmp_inc_ipinreceives(); + + /* identify the IP header */ + iphdr = (struct ip_hdr *)p->payload; + if (IPH_V(iphdr) != 4) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_WARNING, ("IP packet dropped due to bad version number %"U16_F"\n", IPH_V(iphdr))); + ip_debug_print(p); + pbuf_free(p); + IP_STATS_INC(ip.err); + IP_STATS_INC(ip.drop); + snmp_inc_ipinhdrerrors(); + return ERR_OK; + } + +#ifdef LWIP_HOOK_IP4_INPUT + if (LWIP_HOOK_IP4_INPUT(p, inp)) { + /* the packet has been eaten */ + return ERR_OK; + } +#endif + + /* obtain IP header length in number of 32-bit words */ + iphdr_hlen = IPH_HL(iphdr); + /* calculate IP header length in bytes */ + iphdr_hlen *= 4; + /* obtain ip length in bytes */ + iphdr_len = ntohs(IPH_LEN(iphdr)); + + /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */ + if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len)) { + if (iphdr_hlen > p->len) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("IP header (len %"U16_F") does not fit in first pbuf (len %"U16_F"), IP packet dropped.\n", + iphdr_hlen, p->len)); + } + if (iphdr_len > p->tot_len) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("IP (len %"U16_F") is longer than pbuf (len %"U16_F"), IP packet dropped.\n", + iphdr_len, p->tot_len)); + } + /* free (drop) packet pbufs */ + pbuf_free(p); + IP_STATS_INC(ip.lenerr); + IP_STATS_INC(ip.drop); + snmp_inc_ipindiscards(); + return ERR_OK; + } + + /* verify checksum */ +#if CHECKSUM_CHECK_IP + if (inet_chksum(iphdr, iphdr_hlen) != 0) { + + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("Checksum (0x%"X16_F") failed, IP packet dropped.\n", inet_chksum(iphdr, iphdr_hlen))); + ip_debug_print(p); + pbuf_free(p); + IP_STATS_INC(ip.chkerr); + IP_STATS_INC(ip.drop); + snmp_inc_ipinhdrerrors(); + return ERR_OK; + } +#endif + + /* Trim pbuf. This should have been done at the netif layer, + * but we'll do it anyway just to be sure that its done. */ + pbuf_realloc(p, iphdr_len); + + /* copy IP addresses to aligned ip_addr_t */ + ip_addr_copy(current_iphdr_dest, iphdr->dest); + ip_addr_copy(current_iphdr_src, iphdr->src); + + /* match packet against an interface, i.e. is this packet for us? */ +#if LWIP_IGMP + if (ip_addr_ismulticast(¤t_iphdr_dest)) { + if ((inp->flags & NETIF_FLAG_IGMP) && (igmp_lookfor_group(inp, ¤t_iphdr_dest))) { + netif = inp; + } else { + netif = NULL; + } + } else +#endif /* LWIP_IGMP */ + { + /* start trying with inp. if that's not acceptable, start walking the + list of configured netifs. + 'first' is used as a boolean to mark whether we started walking the list */ + int first = 1; + netif = inp; + do { + LWIP_DEBUGF(IP_DEBUG, ("ip_input: iphdr->dest 0x%"X32_F" netif->ip_addr 0x%"X32_F" (0x%"X32_F", 0x%"X32_F", 0x%"X32_F")\n", + ip4_addr_get_u32(&iphdr->dest), ip4_addr_get_u32(&netif->ip_addr), + ip4_addr_get_u32(&iphdr->dest) & ip4_addr_get_u32(&netif->netmask), + ip4_addr_get_u32(&netif->ip_addr) & ip4_addr_get_u32(&netif->netmask), + ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(&netif->netmask))); + + /* interface is up and configured? */ + if ((netif_is_up(netif)) && (!ip_addr_isany(&(netif->ip_addr)))) { + /* unicast to this interface address? */ + if (ip_addr_cmp(¤t_iphdr_dest, &(netif->ip_addr)) || + /* or broadcast on this interface network address? */ + ip_addr_isbroadcast(¤t_iphdr_dest, netif)) { + LWIP_DEBUGF(IP_DEBUG, ("ip_input: packet accepted on interface %c%c\n", + netif->name[0], netif->name[1])); + /* break out of for loop */ + break; + } +#if LWIP_AUTOIP + /* connections to link-local addresses must persist after changing + the netif's address (RFC3927 ch. 1.9) */ + if ((netif->autoip != NULL) && + ip_addr_cmp(¤t_iphdr_dest, &(netif->autoip->llipaddr))) { + LWIP_DEBUGF(IP_DEBUG, ("ip_input: LLA packet accepted on interface %c%c\n", + netif->name[0], netif->name[1])); + /* break out of for loop */ + break; + } +#endif /* LWIP_AUTOIP */ + } + if (first) { + first = 0; + netif = netif_list; + } else { + netif = netif->next; + } + if (netif == inp) { + netif = netif->next; + } + } while(netif != NULL); + } + +#if IP_ACCEPT_LINK_LAYER_ADDRESSING + /* Pass DHCP messages regardless of destination address. DHCP traffic is addressed + * using link layer addressing (such as Ethernet MAC) so we must not filter on IP. + * According to RFC 1542 section 3.1.1, referred by RFC 2131). + * + * If you want to accept private broadcast communication while a netif is down, + * define LWIP_IP_ACCEPT_UDP_PORT(dst_port), e.g.: + * + * #define LWIP_IP_ACCEPT_UDP_PORT(dst_port) ((dst_port) == PP_NTOHS(12345)) + */ + if (netif == NULL) { + /* remote port is DHCP server? */ + if (IPH_PROTO(iphdr) == IP_PROTO_UDP) { + struct udp_hdr *udphdr = (struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen); + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: UDP packet to DHCP client port %"U16_F"\n", + ntohs(udphdr->dest))); + if (IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(udphdr->dest)) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: DHCP packet accepted.\n")); + netif = inp; + check_ip_src = 0; + } + } + } +#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */ + + /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */ +#if IP_ACCEPT_LINK_LAYER_ADDRESSING + /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */ + if (check_ip_src && !ip_addr_isany(¤t_iphdr_src)) +#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */ + { if ((ip_addr_isbroadcast(¤t_iphdr_src, inp)) || + (ip_addr_ismulticast(¤t_iphdr_src))) { + /* packet source is not valid */ + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, ("ip_input: packet source is not valid.\n")); + /* free (drop) packet pbufs */ + pbuf_free(p); + IP_STATS_INC(ip.drop); + snmp_inc_ipinaddrerrors(); + snmp_inc_ipindiscards(); + return ERR_OK; + } + } + + /* packet not for us? */ + if (netif == NULL) { + /* packet not for us, route or discard */ + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, ("ip_input: packet not for us.\n")); +#if IP_FORWARD + /* non-broadcast packet? */ + if (!ip_addr_isbroadcast(¤t_iphdr_dest, inp)) { + /* try to forward IP packet on (other) interfaces */ + ip_forward(p, iphdr, inp); + } else +#endif /* IP_FORWARD */ + { + snmp_inc_ipinaddrerrors(); + snmp_inc_ipindiscards(); + } + pbuf_free(p); + return ERR_OK; + } + /* packet consists of multiple fragments? */ + if ((IPH_OFFSET(iphdr) & PP_HTONS(IP_OFFMASK | IP_MF)) != 0) { +#if IP_REASSEMBLY /* packet fragment reassembly code present? */ + LWIP_DEBUGF(IP_DEBUG, ("IP packet is a fragment (id=0x%04"X16_F" tot_len=%"U16_F" len=%"U16_F" MF=%"U16_F" offset=%"U16_F"), calling ip_reass()\n", + ntohs(IPH_ID(iphdr)), p->tot_len, ntohs(IPH_LEN(iphdr)), !!(IPH_OFFSET(iphdr) & PP_HTONS(IP_MF)), (ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)*8)); + /* reassemble the packet*/ + p = ip_reass(p); + /* packet not fully reassembled yet? */ + if (p == NULL) { + return ERR_OK; + } + iphdr = (struct ip_hdr *)p->payload; +#else /* IP_REASSEMBLY == 0, no packet fragment reassembly code present */ + pbuf_free(p); + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since it was fragmented (0x%"X16_F") (while IP_REASSEMBLY == 0).\n", + ntohs(IPH_OFFSET(iphdr)))); + IP_STATS_INC(ip.opterr); + IP_STATS_INC(ip.drop); + /* unsupported protocol feature */ + snmp_inc_ipinunknownprotos(); + return ERR_OK; +#endif /* IP_REASSEMBLY */ + } + +#if IP_OPTIONS_ALLOWED == 0 /* no support for IP options in the IP header? */ + +#if LWIP_IGMP + /* there is an extra "router alert" option in IGMP messages which we allow for but do not police */ + if((iphdr_hlen > IP_HLEN) && (IPH_PROTO(iphdr) != IP_PROTO_IGMP)) { +#else + if (iphdr_hlen > IP_HLEN) { +#endif /* LWIP_IGMP */ + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("IP packet dropped since there were IP options (while IP_OPTIONS_ALLOWED == 0).\n")); + pbuf_free(p); + IP_STATS_INC(ip.opterr); + IP_STATS_INC(ip.drop); + /* unsupported protocol feature */ + snmp_inc_ipinunknownprotos(); + return ERR_OK; + } +#endif /* IP_OPTIONS_ALLOWED == 0 */ + + /* send to upper layers */ + LWIP_DEBUGF(IP_DEBUG, ("ip_input: \n")); + ip_debug_print(p); + LWIP_DEBUGF(IP_DEBUG, ("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len)); + + current_netif = inp; + current_header = iphdr; + +#if LWIP_RAW + /* raw input did not eat the packet? */ + if (raw_input(p, inp) == 0) +#endif /* LWIP_RAW */ + { + switch (IPH_PROTO(iphdr)) { +#if LWIP_UDP + case IP_PROTO_UDP: +#if LWIP_UDPLITE + case IP_PROTO_UDPLITE: +#endif /* LWIP_UDPLITE */ + snmp_inc_ipindelivers(); + udp_input(p, inp); + break; +#endif /* LWIP_UDP */ +#if LWIP_TCP + case IP_PROTO_TCP: + snmp_inc_ipindelivers(); + tcp_input(p, inp); + break; +#endif /* LWIP_TCP */ +#if LWIP_ICMP + case IP_PROTO_ICMP: + snmp_inc_ipindelivers(); + icmp_input(p, inp); + break; +#endif /* LWIP_ICMP */ +#if LWIP_IGMP + case IP_PROTO_IGMP: + igmp_input(p, inp, ¤t_iphdr_dest); + break; +#endif /* LWIP_IGMP */ + default: +#if LWIP_ICMP + /* send ICMP destination protocol unreachable unless is was a broadcast */ + if (!ip_addr_isbroadcast(¤t_iphdr_dest, inp) && + !ip_addr_ismulticast(¤t_iphdr_dest)) { + p->payload = iphdr; + icmp_dest_unreach(p, ICMP_DUR_PROTO); + } +#endif /* LWIP_ICMP */ + pbuf_free(p); + + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("Unsupported transport protocol %"U16_F"\n", IPH_PROTO(iphdr))); + + IP_STATS_INC(ip.proterr); + IP_STATS_INC(ip.drop); + snmp_inc_ipinunknownprotos(); + } + } + + current_netif = NULL; + current_header = NULL; + ip_addr_set_any(¤t_iphdr_src); + ip_addr_set_any(¤t_iphdr_dest); + + return ERR_OK; +} + +/** + * Sends an IP packet on a network interface. This function constructs + * the IP header and calculates the IP header checksum. If the source + * IP address is NULL, the IP address of the outgoing network + * interface is filled in as source address. + * If the destination IP address is IP_HDRINCL, p is assumed to already + * include an IP header and p->payload points to it instead of the data. + * + * @param p the packet to send (p->payload points to the data, e.g. next + protocol header; if dest == IP_HDRINCL, p already includes an IP + header and p->payload points to that IP header) + * @param src the source IP address to send from (if src == IP_ADDR_ANY, the + * IP address of the netif used to send is used as source address) + * @param dest the destination IP address to send the packet to + * @param ttl the TTL value to be set in the IP header + * @param tos the TOS value to be set in the IP header + * @param proto the PROTOCOL to be set in the IP header + * @param netif the netif on which to send this packet + * @return ERR_OK if the packet was sent OK + * ERR_BUF if p doesn't have enough space for IP/LINK headers + * returns errors returned by netif->output + * + * @note ip_id: RFC791 "some host may be able to simply use + * unique identifiers independent of destination" + */ +err_t +ip_output_if(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, + u8_t ttl, u8_t tos, + u8_t proto, struct netif *netif) +{ +#if IP_OPTIONS_SEND + return ip_output_if_opt(p, src, dest, ttl, tos, proto, netif, NULL, 0); +} + +/** + * Same as ip_output_if() but with the possibility to include IP options: + * + * @ param ip_options pointer to the IP options, copied into the IP header + * @ param optlen length of ip_options + */ +err_t ip_output_if_opt(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, + u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, + u16_t optlen) +{ +#endif /* IP_OPTIONS_SEND */ + struct ip_hdr *iphdr; + ip_addr_t dest_addr; +#if CHECKSUM_GEN_IP_INLINE + u32_t chk_sum = 0; +#endif /* CHECKSUM_GEN_IP_INLINE */ + + /* pbufs passed to IP must have a ref-count of 1 as their payload pointer + gets altered as the packet is passed down the stack */ + LWIP_ASSERT("p->ref == 1", p->ref == 1); + + snmp_inc_ipoutrequests(); + + /* Should the IP header be generated or is it already included in p? */ + if (dest != IP_HDRINCL) { + u16_t ip_hlen = IP_HLEN; +#if IP_OPTIONS_SEND + u16_t optlen_aligned = 0; + if (optlen != 0) { +#if CHECKSUM_GEN_IP_INLINE + int i; +#endif /* CHECKSUM_GEN_IP_INLINE */ + /* round up to a multiple of 4 */ + optlen_aligned = ((optlen + 3) & ~3); + ip_hlen += optlen_aligned; + /* First write in the IP options */ + if (pbuf_header(p, optlen_aligned)) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_output_if_opt: not enough room for IP options in pbuf\n")); + IP_STATS_INC(ip.err); + snmp_inc_ipoutdiscards(); + return ERR_BUF; + } + MEMCPY(p->payload, ip_options, optlen); + if (optlen < optlen_aligned) { + /* zero the remaining bytes */ + memset(((char*)p->payload) + optlen, 0, optlen_aligned - optlen); + } +#if CHECKSUM_GEN_IP_INLINE + for (i = 0; i < optlen_aligned/2; i++) { + chk_sum += ((u16_t*)p->payload)[i]; + } +#endif /* CHECKSUM_GEN_IP_INLINE */ + } +#endif /* IP_OPTIONS_SEND */ + /* generate IP header */ + if (pbuf_header(p, IP_HLEN)) { + LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("ip_output: not enough room for IP header in pbuf\n")); + + IP_STATS_INC(ip.err); + snmp_inc_ipoutdiscards(); + return ERR_BUF; + } + + iphdr = (struct ip_hdr *)p->payload; + LWIP_ASSERT("check that first pbuf can hold struct ip_hdr", + (p->len >= sizeof(struct ip_hdr))); + + IPH_TTL_SET(iphdr, ttl); + IPH_PROTO_SET(iphdr, proto); +#if CHECKSUM_GEN_IP_INLINE + chk_sum += LWIP_MAKE_U16(proto, ttl); +#endif /* CHECKSUM_GEN_IP_INLINE */ + + /* dest cannot be NULL here */ + ip_addr_copy(iphdr->dest, *dest); +#if CHECKSUM_GEN_IP_INLINE + chk_sum += ip4_addr_get_u32(&iphdr->dest) & 0xFFFF; + chk_sum += ip4_addr_get_u32(&iphdr->dest) >> 16; +#endif /* CHECKSUM_GEN_IP_INLINE */ + + IPH_VHL_SET(iphdr, 4, ip_hlen / 4); + IPH_TOS_SET(iphdr, tos); +#if CHECKSUM_GEN_IP_INLINE + chk_sum += LWIP_MAKE_U16(tos, iphdr->_v_hl); +#endif /* CHECKSUM_GEN_IP_INLINE */ + IPH_LEN_SET(iphdr, htons(p->tot_len)); +#if CHECKSUM_GEN_IP_INLINE + chk_sum += iphdr->_len; +#endif /* CHECKSUM_GEN_IP_INLINE */ + IPH_OFFSET_SET(iphdr, 0); + IPH_ID_SET(iphdr, htons(ip_id)); +#if CHECKSUM_GEN_IP_INLINE + chk_sum += iphdr->_id; +#endif /* CHECKSUM_GEN_IP_INLINE */ + ++ip_id; + + if (ip_addr_isany(src)) { + ip_addr_copy(iphdr->src, netif->ip_addr); + } else { + /* src cannot be NULL here */ + ip_addr_copy(iphdr->src, *src); + } + +#if CHECKSUM_GEN_IP_INLINE + chk_sum += ip4_addr_get_u32(&iphdr->src) & 0xFFFF; + chk_sum += ip4_addr_get_u32(&iphdr->src) >> 16; + chk_sum = (chk_sum >> 16) + (chk_sum & 0xFFFF); + chk_sum = (chk_sum >> 16) + chk_sum; + chk_sum = ~chk_sum; + iphdr->_chksum = chk_sum; /* network order */ +#else /* CHECKSUM_GEN_IP_INLINE */ + IPH_CHKSUM_SET(iphdr, 0); +#if CHECKSUM_GEN_IP + IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, ip_hlen)); +#endif +#endif /* CHECKSUM_GEN_IP_INLINE */ + } else { + /* IP header already included in p */ + iphdr = (struct ip_hdr *)p->payload; + ip_addr_copy(dest_addr, iphdr->dest); + dest = &dest_addr; + } + + IP_STATS_INC(ip.xmit); + + LWIP_DEBUGF(IP_DEBUG, ("ip_output_if: %c%c%"U16_F"\n", netif->name[0], netif->name[1], netif->num)); + ip_debug_print(p); + +#if ENABLE_LOOPBACK + if (ip_addr_cmp(dest, &netif->ip_addr)) { + /* Packet to self, enqueue it for loopback */ + LWIP_DEBUGF(IP_DEBUG, ("netif_loop_output()")); + return netif_loop_output(netif, p, dest); + } +#if LWIP_IGMP + if ((p->flags & PBUF_FLAG_MCASTLOOP) != 0) { + netif_loop_output(netif, p, dest); + } +#endif /* LWIP_IGMP */ +#endif /* ENABLE_LOOPBACK */ +#if IP_FRAG + /* don't fragment if interface has mtu set to 0 [loopif] */ + if (netif->mtu && (p->tot_len > netif->mtu)) { + return ip_frag(p, netif, dest); + } +#endif /* IP_FRAG */ + + LWIP_DEBUGF(IP_DEBUG, ("netif->output()")); + return netif->output(netif, p, dest); +} + +/** + * Simple interface to ip_output_if. It finds the outgoing network + * interface and calls upon ip_output_if to do the actual work. + * + * @param p the packet to send (p->payload points to the data, e.g. next + protocol header; if dest == IP_HDRINCL, p already includes an IP + header and p->payload points to that IP header) + * @param src the source IP address to send from (if src == IP_ADDR_ANY, the + * IP address of the netif used to send is used as source address) + * @param dest the destination IP address to send the packet to + * @param ttl the TTL value to be set in the IP header + * @param tos the TOS value to be set in the IP header + * @param proto the PROTOCOL to be set in the IP header + * + * @return ERR_RTE if no route is found + * see ip_output_if() for more return values + */ +err_t +ip_output(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, + u8_t ttl, u8_t tos, u8_t proto) +{ + struct netif *netif; + + /* pbufs passed to IP must have a ref-count of 1 as their payload pointer + gets altered as the packet is passed down the stack */ + LWIP_ASSERT("p->ref == 1", p->ref == 1); + + if ((netif = ip_route(dest)) == NULL) { + LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest))); + IP_STATS_INC(ip.rterr); + return ERR_RTE; + } + + return ip_output_if(p, src, dest, ttl, tos, proto, netif); +} + +#if LWIP_NETIF_HWADDRHINT +/** Like ip_output, but takes and addr_hint pointer that is passed on to netif->addr_hint + * before calling ip_output_if. + * + * @param p the packet to send (p->payload points to the data, e.g. next + protocol header; if dest == IP_HDRINCL, p already includes an IP + header and p->payload points to that IP header) + * @param src the source IP address to send from (if src == IP_ADDR_ANY, the + * IP address of the netif used to send is used as source address) + * @param dest the destination IP address to send the packet to + * @param ttl the TTL value to be set in the IP header + * @param tos the TOS value to be set in the IP header + * @param proto the PROTOCOL to be set in the IP header + * @param addr_hint address hint pointer set to netif->addr_hint before + * calling ip_output_if() + * + * @return ERR_RTE if no route is found + * see ip_output_if() for more return values + */ +err_t +ip_output_hinted(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, + u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint) +{ + struct netif *netif; + err_t err; + + /* pbufs passed to IP must have a ref-count of 1 as their payload pointer + gets altered as the packet is passed down the stack */ + LWIP_ASSERT("p->ref == 1", p->ref == 1); + + if ((netif = ip_route(dest)) == NULL) { + LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest))); + IP_STATS_INC(ip.rterr); + return ERR_RTE; + } + + NETIF_SET_HWADDRHINT(netif, addr_hint); + err = ip_output_if(p, src, dest, ttl, tos, proto, netif); + NETIF_SET_HWADDRHINT(netif, NULL); + + return err; +} +#endif /* LWIP_NETIF_HWADDRHINT*/ + +#if IP_DEBUG +/* Print an IP header by using LWIP_DEBUGF + * @param p an IP packet, p->payload pointing to the IP header + */ +void +ip_debug_print(struct pbuf *p) +{ + struct ip_hdr *iphdr = (struct ip_hdr *)p->payload; + + LWIP_DEBUGF(IP_DEBUG, ("IP header:\n")); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("|%2"S16_F" |%2"S16_F" | 0x%02"X16_F" | %5"U16_F" | (v, hl, tos, len)\n", + IPH_V(iphdr), + IPH_HL(iphdr), + IPH_TOS(iphdr), + ntohs(IPH_LEN(iphdr)))); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("| %5"U16_F" |%"U16_F"%"U16_F"%"U16_F"| %4"U16_F" | (id, flags, offset)\n", + ntohs(IPH_ID(iphdr)), + ntohs(IPH_OFFSET(iphdr)) >> 15 & 1, + ntohs(IPH_OFFSET(iphdr)) >> 14 & 1, + ntohs(IPH_OFFSET(iphdr)) >> 13 & 1, + ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | 0x%04"X16_F" | (ttl, proto, chksum)\n", + IPH_TTL(iphdr), + IPH_PROTO(iphdr), + ntohs(IPH_CHKSUM(iphdr)))); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (src)\n", + ip4_addr1_16(&iphdr->src), + ip4_addr2_16(&iphdr->src), + ip4_addr3_16(&iphdr->src), + ip4_addr4_16(&iphdr->src))); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("| %3"U16_F" | %3"U16_F" | %3"U16_F" | %3"U16_F" | (dest)\n", + ip4_addr1_16(&iphdr->dest), + ip4_addr2_16(&iphdr->dest), + ip4_addr3_16(&iphdr->dest), + ip4_addr4_16(&iphdr->dest))); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); +} +#endif /* IP_DEBUG */ diff --git a/third_party/lwip-1.4.1/src/core/ipv4/ip_addr.c b/third_party/lwip-1.4.1/src/core/ipv4/ip_addr.c new file mode 100644 index 0000000..2687617 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/ipv4/ip_addr.c @@ -0,0 +1,312 @@ +/** + * @file + * This is the IPv4 address tools implementation. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" + +/* used by IP_ADDR_ANY and IP_ADDR_BROADCAST in ip_addr.h */ +const ip_addr_t ip_addr_any = { IPADDR_ANY }; +const ip_addr_t ip_addr_broadcast = { IPADDR_BROADCAST }; + +/** + * Determine if an address is a broadcast address on a network interface + * + * @param addr address to be checked + * @param netif the network interface against which the address is checked + * @return returns non-zero if the address is a broadcast address + */ +u8_t +ip4_addr_isbroadcast(u32_t addr, const struct netif *netif) +{ + ip_addr_t ipaddr; + ip4_addr_set_u32(&ipaddr, addr); + + /* all ones (broadcast) or all zeroes (old skool broadcast) */ + if ((~addr == IPADDR_ANY) || + (addr == IPADDR_ANY)) { + return 1; + /* no broadcast support on this network interface? */ + } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) { + /* the given address cannot be a broadcast address + * nor can we check against any broadcast addresses */ + return 0; + /* address matches network interface address exactly? => no broadcast */ + } else if (addr == ip4_addr_get_u32(&netif->ip_addr)) { + return 0; + /* on the same (sub) network... */ + } else if (ip_addr_netcmp(&ipaddr, &(netif->ip_addr), &(netif->netmask)) + /* ...and host identifier bits are all ones? =>... */ + && ((addr & ~ip4_addr_get_u32(&netif->netmask)) == + (IPADDR_BROADCAST & ~ip4_addr_get_u32(&netif->netmask)))) { + /* => network broadcast address */ + return 1; + } else { + return 0; + } +} + +/** Checks if a netmask is valid (starting with ones, then only zeros) + * + * @param netmask the IPv4 netmask to check (in network byte order!) + * @return 1 if the netmask is valid, 0 if it is not + */ +u8_t +ip4_addr_netmask_valid(u32_t netmask) +{ + u32_t mask; + u32_t nm_hostorder = lwip_htonl(netmask); + + /* first, check for the first zero */ + for (mask = 1UL << 31 ; mask != 0; mask >>= 1) { + if ((nm_hostorder & mask) == 0) { + break; + } + } + /* then check that there is no one */ + for (; mask != 0; mask >>= 1) { + if ((nm_hostorder & mask) != 0) { + /* there is a one after the first zero -> invalid */ + return 0; + } + } + /* no one after the first zero -> valid */ + return 1; +} + +/* Here for now until needed in other places in lwIP */ +#ifndef isprint +#define in_range(c, lo, up) ((u8_t)c >= lo && (u8_t)c <= up) +#define isprint(c) in_range(c, 0x20, 0x7f) +#define isdigit(c) in_range(c, '0', '9') +#define isxdigit(c) (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F')) +#define islower(c) in_range(c, 'a', 'z') +#define isspace(c) (c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' || c == '\v') +#endif + +/** + * Ascii internet address interpretation routine. + * The value returned is in network order. + * + * @param cp IP address in ascii represenation (e.g. "127.0.0.1") + * @return ip address in network order + */ +u32_t +ipaddr_addr(const char *cp) +{ + ip_addr_t val; + + if (ipaddr_aton(cp, &val)) { + return ip4_addr_get_u32(&val); + } + return (IPADDR_NONE); +} + +/** + * Check whether "cp" is a valid ascii representation + * of an Internet address and convert to a binary address. + * Returns 1 if the address is valid, 0 if not. + * This replaces inet_addr, the return value from which + * cannot distinguish between failure and a local broadcast address. + * + * @param cp IP address in ascii represenation (e.g. "127.0.0.1") + * @param addr pointer to which to save the ip address in network order + * @return 1 if cp could be converted to addr, 0 on failure + */ +int +ipaddr_aton(const char *cp, ip_addr_t *addr) +{ + u32_t val; + u8_t base; + char c; + u32_t parts[4]; + u32_t *pp = parts; + + c = *cp; + for (;;) { + /* + * Collect number up to ``.''. + * Values are specified as for C: + * 0x=hex, 0=octal, 1-9=decimal. + */ + if (!isdigit(c)) + return (0); + val = 0; + base = 10; + if (c == '0') { + c = *++cp; + if (c == 'x' || c == 'X') { + base = 16; + c = *++cp; + } else + base = 8; + } + for (;;) { + if (isdigit(c)) { + val = (val * base) + (int)(c - '0'); + c = *++cp; + } else if (base == 16 && isxdigit(c)) { + val = (val << 4) | (int)(c + 10 - (islower(c) ? 'a' : 'A')); + c = *++cp; + } else + break; + } + if (c == '.') { + /* + * Internet format: + * a.b.c.d + * a.b.c (with c treated as 16 bits) + * a.b (with b treated as 24 bits) + */ + if (pp >= parts + 3) { + return (0); + } + *pp++ = val; + c = *++cp; + } else + break; + } + /* + * Check for trailing characters. + */ + if (c != '\0' && !isspace(c)) { + return (0); + } + /* + * Concoct the address according to + * the number of parts specified. + */ + switch (pp - parts + 1) { + + case 0: + return (0); /* initial nondigit */ + + case 1: /* a -- 32 bits */ + break; + + case 2: /* a.b -- 8.24 bits */ + if (val > 0xffffffUL) { + return (0); + } + val |= parts[0] << 24; + break; + + case 3: /* a.b.c -- 8.8.16 bits */ + if (val > 0xffff) { + return (0); + } + val |= (parts[0] << 24) | (parts[1] << 16); + break; + + case 4: /* a.b.c.d -- 8.8.8.8 bits */ + if (val > 0xff) { + return (0); + } + val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8); + break; + default: + LWIP_ASSERT("unhandled", 0); + break; + } + if (addr) { + ip4_addr_set_u32(addr, htonl(val)); + } + return (1); +} + +/** + * Convert numeric IP address into decimal dotted ASCII representation. + * returns ptr to static buffer; not reentrant! + * + * @param addr ip address in network order to convert + * @return pointer to a global static (!) buffer that holds the ASCII + * represenation of addr + */ +char * +ipaddr_ntoa(const ip_addr_t *addr) +{ + static char str[16]; + return ipaddr_ntoa_r(addr, str, 16); +} + +/** + * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used. + * + * @param addr ip address in network order to convert + * @param buf target buffer where the string is stored + * @param buflen length of buf + * @return either pointer to buf which now holds the ASCII + * representation of addr or NULL if buf was too small + */ +char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen) +{ + u32_t s_addr; + char inv[3]; + char *rp; + u8_t *ap; + u8_t rem; + u8_t n; + u8_t i; + int len = 0; + + s_addr = ip4_addr_get_u32(addr); + + rp = buf; + ap = (u8_t *)&s_addr; + for(n = 0; n < 4; n++) { + i = 0; + do { + rem = *ap % (u8_t)10; + *ap /= (u8_t)10; + inv[i++] = '0' + rem; + } while(*ap); + while(i--) { + if (len++ >= buflen) { + return NULL; + } + *rp++ = inv[i]; + } + if (len++ >= buflen) { + return NULL; + } + *rp++ = '.'; + ap++; + } + *--rp = 0; + return buf; +} diff --git a/third_party/lwip-1.4.1/src/core/ipv4/ip_frag.c b/third_party/lwip-1.4.1/src/core/ipv4/ip_frag.c new file mode 100644 index 0000000..7267432 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/ipv4/ip_frag.c @@ -0,0 +1,863 @@ +/** + * @file + * This is the IPv4 packet segmentation and reassembly implementation. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Jani Monoses + * Simon Goldschmidt + * original reassembly code by Adam Dunkels + * + */ + +#include "lwip/opt.h" +#include "lwip/ip_frag.h" +#include "lwip/def.h" +#include "lwip/inet_chksum.h" +#include "lwip/netif.h" +#include "lwip/snmp.h" +#include "lwip/stats.h" +#include "lwip/icmp.h" + +#include + +#if IP_REASSEMBLY +/** + * The IP reassembly code currently has the following limitations: + * - IP header options are not supported + * - fragments must not overlap (e.g. due to different routes), + * currently, overlapping or duplicate fragments are thrown away + * if IP_REASS_CHECK_OVERLAP=1 (the default)! + * + * @todo: work with IP header options + */ + +/** Setting this to 0, you can turn off checking the fragments for overlapping + * regions. The code gets a little smaller. Only use this if you know that + * overlapping won't occur on your network! */ +#ifndef IP_REASS_CHECK_OVERLAP +#define IP_REASS_CHECK_OVERLAP 1 +#endif /* IP_REASS_CHECK_OVERLAP */ + +/** Set to 0 to prevent freeing the oldest datagram when the reassembly buffer is + * full (IP_REASS_MAX_PBUFS pbufs are enqueued). The code gets a little smaller. + * Datagrams will be freed by timeout only. Especially useful when MEMP_NUM_REASSDATA + * is set to 1, so one datagram can be reassembled at a time, only. */ +#ifndef IP_REASS_FREE_OLDEST +#define IP_REASS_FREE_OLDEST 1 +#endif /* IP_REASS_FREE_OLDEST */ + +#define IP_REASS_FLAG_LASTFRAG 0x01 + +/** This is a helper struct which holds the starting + * offset and the ending offset of this fragment to + * easily chain the fragments. + * It has the same packing requirements as the IP header, since it replaces + * the IP header in memory in incoming fragments (after copying it) to keep + * track of the various fragments. (-> If the IP header doesn't need packing, + * this struct doesn't need packing, too.) + */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip_reass_helper { + PACK_STRUCT_FIELD(struct pbuf *next_pbuf); + PACK_STRUCT_FIELD(u16_t start); + PACK_STRUCT_FIELD(u16_t end); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define IP_ADDRESSES_AND_ID_MATCH(iphdrA, iphdrB) \ + (ip_addr_cmp(&(iphdrA)->src, &(iphdrB)->src) && \ + ip_addr_cmp(&(iphdrA)->dest, &(iphdrB)->dest) && \ + IPH_ID(iphdrA) == IPH_ID(iphdrB)) ? 1 : 0 + +/* global variables */ +static struct ip_reassdata *reassdatagrams; +static u16_t ip_reass_pbufcount; + +/* function prototypes */ +static void ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev); +static int ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev); + +/** + * Reassembly timer base function + * for both NO_SYS == 0 and 1 (!). + * + * Should be called every 1000 msec (defined by IP_TMR_INTERVAL). + */ +void +ip_reass_tmr(void) +{ + struct ip_reassdata *r, *prev = NULL; + + r = reassdatagrams; + while (r != NULL) { + /* Decrement the timer. Once it reaches 0, + * clean up the incomplete fragment assembly */ + if (r->timer > 0) { + r->timer--; + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer dec %"U16_F"\n",(u16_t)r->timer)); + prev = r; + r = r->next; + } else { + /* reassembly timed out */ + struct ip_reassdata *tmp; + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass_tmr: timer timed out\n")); + tmp = r; + /* get the next pointer before freeing */ + r = r->next; + /* free the helper struct and all enqueued pbufs */ + ip_reass_free_complete_datagram(tmp, prev); + } + } +} + +/** + * Free a datagram (struct ip_reassdata) and all its pbufs. + * Updates the total count of enqueued pbufs (ip_reass_pbufcount), + * SNMP counters and sends an ICMP time exceeded packet. + * + * @param ipr datagram to free + * @param prev the previous datagram in the linked list + * @return the number of pbufs freed + */ +static int +ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev) +{ + u16_t pbufs_freed = 0; + u8_t clen; + struct pbuf *p; + struct ip_reass_helper *iprh; + + LWIP_ASSERT("prev != ipr", prev != ipr); + if (prev != NULL) { + LWIP_ASSERT("prev->next == ipr", prev->next == ipr); + } + + snmp_inc_ipreasmfails(); +#if LWIP_ICMP + iprh = (struct ip_reass_helper *)ipr->p->payload; + if (iprh->start == 0) { + /* The first fragment was received, send ICMP time exceeded. */ + /* First, de-queue the first pbuf from r->p. */ + p = ipr->p; + ipr->p = iprh->next_pbuf; + /* Then, copy the original header into it. */ + SMEMCPY(p->payload, &ipr->iphdr, IP_HLEN); + icmp_time_exceeded(p, ICMP_TE_FRAG); + clen = pbuf_clen(p); + LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); + pbufs_freed += clen; + pbuf_free(p); + } +#endif /* LWIP_ICMP */ + + /* First, free all received pbufs. The individual pbufs need to be released + separately as they have not yet been chained */ + p = ipr->p; + while (p != NULL) { + struct pbuf *pcur; + iprh = (struct ip_reass_helper *)p->payload; + pcur = p; + /* get the next pointer before freeing */ + p = iprh->next_pbuf; + clen = pbuf_clen(pcur); + LWIP_ASSERT("pbufs_freed + clen <= 0xffff", pbufs_freed + clen <= 0xffff); + pbufs_freed += clen; + pbuf_free(pcur); + } + /* Then, unchain the struct ip_reassdata from the list and free it. */ + ip_reass_dequeue_datagram(ipr, prev); + LWIP_ASSERT("ip_reass_pbufcount >= clen", ip_reass_pbufcount >= pbufs_freed); + ip_reass_pbufcount -= pbufs_freed; + + return pbufs_freed; +} + +#if IP_REASS_FREE_OLDEST +/** + * Free the oldest datagram to make room for enqueueing new fragments. + * The datagram 'fraghdr' belongs to is not freed! + * + * @param fraghdr IP header of the current fragment + * @param pbufs_needed number of pbufs needed to enqueue + * (used for freeing other datagrams if not enough space) + * @return the number of pbufs freed + */ +static int +ip_reass_remove_oldest_datagram(struct ip_hdr *fraghdr, int pbufs_needed) +{ + /* @todo Can't we simply remove the last datagram in the + * linked list behind reassdatagrams? + */ + struct ip_reassdata *r, *oldest, *prev; + int pbufs_freed = 0, pbufs_freed_current; + int other_datagrams; + + /* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs, + * but don't free the datagram that 'fraghdr' belongs to! */ + do { + oldest = NULL; + prev = NULL; + other_datagrams = 0; + r = reassdatagrams; + while (r != NULL) { + if (!IP_ADDRESSES_AND_ID_MATCH(&r->iphdr, fraghdr)) { + /* Not the same datagram as fraghdr */ + other_datagrams++; + if (oldest == NULL) { + oldest = r; + } else if (r->timer <= oldest->timer) { + /* older than the previous oldest */ + oldest = r; + } + } + if (r->next != NULL) { + prev = r; + } + r = r->next; + } + if (oldest != NULL) { + pbufs_freed_current = ip_reass_free_complete_datagram(oldest, prev); + pbufs_freed += pbufs_freed_current; + } + } while ((pbufs_freed < pbufs_needed) && (other_datagrams > 1)); + return pbufs_freed; +} +#endif /* IP_REASS_FREE_OLDEST */ + +/** + * Enqueues a new fragment into the fragment queue + * @param fraghdr points to the new fragments IP hdr + * @param clen number of pbufs needed to enqueue (used for freeing other datagrams if not enough space) + * @return A pointer to the queue location into which the fragment was enqueued + */ +static struct ip_reassdata* +ip_reass_enqueue_new_datagram(struct ip_hdr *fraghdr, int clen) +{ + struct ip_reassdata* ipr; + /* No matching previous fragment found, allocate a new reassdata struct */ + ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA); + if (ipr == NULL) { +#if IP_REASS_FREE_OLDEST + if (ip_reass_remove_oldest_datagram(fraghdr, clen) >= clen) { + ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA); + } + if (ipr == NULL) +#endif /* IP_REASS_FREE_OLDEST */ + { + IPFRAG_STATS_INC(ip_frag.memerr); + LWIP_DEBUGF(IP_REASS_DEBUG,("Failed to alloc reassdata struct\n")); + return NULL; + } + } + memset(ipr, 0, sizeof(struct ip_reassdata)); + ipr->timer = IP_REASS_MAXAGE; + + /* enqueue the new structure to the front of the list */ + ipr->next = reassdatagrams; + reassdatagrams = ipr; + /* copy the ip header for later tests and input */ + /* @todo: no ip options supported? */ + SMEMCPY(&(ipr->iphdr), fraghdr, IP_HLEN); + return ipr; +} + +/** + * Dequeues a datagram from the datagram queue. Doesn't deallocate the pbufs. + * @param ipr points to the queue entry to dequeue + */ +static void +ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev) +{ + + /* dequeue the reass struct */ + if (reassdatagrams == ipr) { + /* it was the first in the list */ + reassdatagrams = ipr->next; + } else { + /* it wasn't the first, so it must have a valid 'prev' */ + LWIP_ASSERT("sanity check linked list", prev != NULL); + prev->next = ipr->next; + } + + /* now we can free the ip_reass struct */ + memp_free(MEMP_REASSDATA, ipr); +} + +/** + * Chain a new pbuf into the pbuf list that composes the datagram. The pbuf list + * will grow over time as new pbufs are rx. + * Also checks that the datagram passes basic continuity checks (if the last + * fragment was received at least once). + * @param root_p points to the 'root' pbuf for the current datagram being assembled. + * @param new_p points to the pbuf for the current fragment + * @return 0 if invalid, >0 otherwise + */ +static int +ip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct pbuf *new_p) +{ + struct ip_reass_helper *iprh, *iprh_tmp, *iprh_prev=NULL; + struct pbuf *q; + u16_t offset,len; + struct ip_hdr *fraghdr; + int valid = 1; + + /* Extract length and fragment offset from current fragment */ + fraghdr = (struct ip_hdr*)new_p->payload; + len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4; + offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8; + + /* overwrite the fragment's ip header from the pbuf with our helper struct, + * and setup the embedded helper structure. */ + /* make sure the struct ip_reass_helper fits into the IP header */ + LWIP_ASSERT("sizeof(struct ip_reass_helper) <= IP_HLEN", + sizeof(struct ip_reass_helper) <= IP_HLEN); + iprh = (struct ip_reass_helper*)new_p->payload; + iprh->next_pbuf = NULL; + iprh->start = offset; + iprh->end = offset + len; + + /* Iterate through until we either get to the end of the list (append), + * or we find on with a larger offset (insert). */ + for (q = ipr->p; q != NULL;) { + iprh_tmp = (struct ip_reass_helper*)q->payload; + if (iprh->start < iprh_tmp->start) { + /* the new pbuf should be inserted before this */ + iprh->next_pbuf = q; + if (iprh_prev != NULL) { + /* not the fragment with the lowest offset */ +#if IP_REASS_CHECK_OVERLAP + if ((iprh->start < iprh_prev->end) || (iprh->end > iprh_tmp->start)) { + /* fragment overlaps with previous or following, throw away */ + goto freepbuf; + } +#endif /* IP_REASS_CHECK_OVERLAP */ + iprh_prev->next_pbuf = new_p; + } else { + /* fragment with the lowest offset */ + ipr->p = new_p; + } + break; + } else if(iprh->start == iprh_tmp->start) { + /* received the same datagram twice: no need to keep the datagram */ + goto freepbuf; +#if IP_REASS_CHECK_OVERLAP + } else if(iprh->start < iprh_tmp->end) { + /* overlap: no need to keep the new datagram */ + goto freepbuf; +#endif /* IP_REASS_CHECK_OVERLAP */ + } else { + /* Check if the fragments received so far have no wholes. */ + if (iprh_prev != NULL) { + if (iprh_prev->end != iprh_tmp->start) { + /* There is a fragment missing between the current + * and the previous fragment */ + valid = 0; + } + } + } + q = iprh_tmp->next_pbuf; + iprh_prev = iprh_tmp; + } + + /* If q is NULL, then we made it to the end of the list. Determine what to do now */ + if (q == NULL) { + if (iprh_prev != NULL) { + /* this is (for now), the fragment with the highest offset: + * chain it to the last fragment */ +#if IP_REASS_CHECK_OVERLAP + LWIP_ASSERT("check fragments don't overlap", iprh_prev->end <= iprh->start); +#endif /* IP_REASS_CHECK_OVERLAP */ + iprh_prev->next_pbuf = new_p; + if (iprh_prev->end != iprh->start) { + valid = 0; + } + } else { +#if IP_REASS_CHECK_OVERLAP + LWIP_ASSERT("no previous fragment, this must be the first fragment!", + ipr->p == NULL); +#endif /* IP_REASS_CHECK_OVERLAP */ + /* this is the first fragment we ever received for this ip datagram */ + ipr->p = new_p; + } + } + + /* At this point, the validation part begins: */ + /* If we already received the last fragment */ + if ((ipr->flags & IP_REASS_FLAG_LASTFRAG) != 0) { + /* and had no wholes so far */ + if (valid) { + /* then check if the rest of the fragments is here */ + /* Check if the queue starts with the first datagram */ + if (((struct ip_reass_helper*)ipr->p->payload)->start != 0) { + valid = 0; + } else { + /* and check that there are no wholes after this datagram */ + iprh_prev = iprh; + q = iprh->next_pbuf; + while (q != NULL) { + iprh = (struct ip_reass_helper*)q->payload; + if (iprh_prev->end != iprh->start) { + valid = 0; + break; + } + iprh_prev = iprh; + q = iprh->next_pbuf; + } + /* if still valid, all fragments are received + * (because to the MF==0 already arrived */ + if (valid) { + LWIP_ASSERT("sanity check", ipr->p != NULL); + LWIP_ASSERT("sanity check", + ((struct ip_reass_helper*)ipr->p->payload) != iprh); + LWIP_ASSERT("validate_datagram:next_pbuf!=NULL", + iprh->next_pbuf == NULL); + LWIP_ASSERT("validate_datagram:datagram end!=datagram len", + iprh->end == ipr->datagram_len); + } + } + } + /* If valid is 0 here, there are some fragments missing in the middle + * (since MF == 0 has already arrived). Such datagrams simply time out if + * no more fragments are received... */ + return valid; + } + /* If we come here, not all fragments were received, yet! */ + return 0; /* not yet valid! */ +#if IP_REASS_CHECK_OVERLAP +freepbuf: + ip_reass_pbufcount -= pbuf_clen(new_p); + pbuf_free(new_p); + return 0; +#endif /* IP_REASS_CHECK_OVERLAP */ +} + +/** + * Reassembles incoming IP fragments into an IP datagram. + * + * @param p points to a pbuf chain of the fragment + * @return NULL if reassembly is incomplete, ? otherwise + */ +struct pbuf * +ip_reass(struct pbuf *p) +{ + struct pbuf *r; + struct ip_hdr *fraghdr; + struct ip_reassdata *ipr; + struct ip_reass_helper *iprh; + u16_t offset, len; + u8_t clen; + struct ip_reassdata *ipr_prev = NULL; + + IPFRAG_STATS_INC(ip_frag.recv); + snmp_inc_ipreasmreqds(); + + fraghdr = (struct ip_hdr*)p->payload; + + if ((IPH_HL(fraghdr) * 4) != IP_HLEN) { + LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass: IP options currently not supported!\n")); + IPFRAG_STATS_INC(ip_frag.err); + goto nullreturn; + } + + offset = (ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8; + len = ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4; + + /* Check if we are allowed to enqueue more datagrams. */ + clen = pbuf_clen(p); + if ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) { +#if IP_REASS_FREE_OLDEST + if (!ip_reass_remove_oldest_datagram(fraghdr, clen) || + ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS)) +#endif /* IP_REASS_FREE_OLDEST */ + { + /* No datagram could be freed and still too many pbufs enqueued */ + LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass: Overflow condition: pbufct=%d, clen=%d, MAX=%d\n", + ip_reass_pbufcount, clen, IP_REASS_MAX_PBUFS)); + IPFRAG_STATS_INC(ip_frag.memerr); + /* @todo: send ICMP time exceeded here? */ + /* drop this pbuf */ + goto nullreturn; + } + } + + /* Look for the datagram the fragment belongs to in the current datagram queue, + * remembering the previous in the queue for later dequeueing. */ + for (ipr = reassdatagrams; ipr != NULL; ipr = ipr->next) { + /* Check if the incoming fragment matches the one currently present + in the reassembly buffer. If so, we proceed with copying the + fragment into the buffer. */ + if (IP_ADDRESSES_AND_ID_MATCH(&ipr->iphdr, fraghdr)) { + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_reass: matching previous fragment ID=%"X16_F"\n", + ntohs(IPH_ID(fraghdr)))); + IPFRAG_STATS_INC(ip_frag.cachehit); + break; + } + ipr_prev = ipr; + } + + if (ipr == NULL) { + /* Enqueue a new datagram into the datagram queue */ + ipr = ip_reass_enqueue_new_datagram(fraghdr, clen); + /* Bail if unable to enqueue */ + if(ipr == NULL) { + goto nullreturn; + } + } else { + if (((ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) && + ((ntohs(IPH_OFFSET(&ipr->iphdr)) & IP_OFFMASK) != 0)) { + /* ipr->iphdr is not the header from the first fragment, but fraghdr is + * -> copy fraghdr into ipr->iphdr since we want to have the header + * of the first fragment (for ICMP time exceeded and later, for copying + * all options, if supported)*/ + SMEMCPY(&ipr->iphdr, fraghdr, IP_HLEN); + } + } + /* Track the current number of pbufs current 'in-flight', in order to limit + the number of fragments that may be enqueued at any one time */ + ip_reass_pbufcount += clen; + + /* At this point, we have either created a new entry or pointing + * to an existing one */ + + /* check for 'no more fragments', and update queue entry*/ + if ((IPH_OFFSET(fraghdr) & PP_NTOHS(IP_MF)) == 0) { + ipr->flags |= IP_REASS_FLAG_LASTFRAG; + ipr->datagram_len = offset + len; + LWIP_DEBUGF(IP_REASS_DEBUG, + ("ip_reass: last fragment seen, total len %"S16_F"\n", + ipr->datagram_len)); + } + /* find the right place to insert this pbuf */ + /* @todo: trim pbufs if fragments are overlapping */ + if (ip_reass_chain_frag_into_datagram_and_validate(ipr, p)) { + /* the totally last fragment (flag more fragments = 0) was received at least + * once AND all fragments are received */ + ipr->datagram_len += IP_HLEN; + + /* save the second pbuf before copying the header over the pointer */ + r = ((struct ip_reass_helper*)ipr->p->payload)->next_pbuf; + + /* copy the original ip header back to the first pbuf */ + fraghdr = (struct ip_hdr*)(ipr->p->payload); + SMEMCPY(fraghdr, &ipr->iphdr, IP_HLEN); + IPH_LEN_SET(fraghdr, htons(ipr->datagram_len)); + IPH_OFFSET_SET(fraghdr, 0); + IPH_CHKSUM_SET(fraghdr, 0); + /* @todo: do we need to set calculate the correct checksum? */ + IPH_CHKSUM_SET(fraghdr, inet_chksum(fraghdr, IP_HLEN)); + + p = ipr->p; + + /* chain together the pbufs contained within the reass_data list. */ + while(r != NULL) { + iprh = (struct ip_reass_helper*)r->payload; + + /* hide the ip header for every succeding fragment */ + pbuf_header(r, -IP_HLEN); + pbuf_cat(p, r); + r = iprh->next_pbuf; + } + /* release the sources allocate for the fragment queue entry */ + ip_reass_dequeue_datagram(ipr, ipr_prev); + + /* and adjust the number of pbufs currently queued for reassembly. */ + ip_reass_pbufcount -= pbuf_clen(p); + + /* Return the pbuf chain */ + return p; + } + /* the datagram is not (yet?) reassembled completely */ + LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass_pbufcount: %d out\n", ip_reass_pbufcount)); + return NULL; + +nullreturn: + LWIP_DEBUGF(IP_REASS_DEBUG,("ip_reass: nullreturn\n")); + IPFRAG_STATS_INC(ip_frag.drop); + pbuf_free(p); + return NULL; +} +#endif /* IP_REASSEMBLY */ + +#if IP_FRAG +#if IP_FRAG_USES_STATIC_BUF +static u8_t buf[LWIP_MEM_ALIGN_SIZE(IP_FRAG_MAX_MTU + MEM_ALIGNMENT - 1)]; +#else /* IP_FRAG_USES_STATIC_BUF */ + +#if !LWIP_NETIF_TX_SINGLE_PBUF +/** Allocate a new struct pbuf_custom_ref */ +static struct pbuf_custom_ref* +ip_frag_alloc_pbuf_custom_ref(void) +{ + return (struct pbuf_custom_ref*)memp_malloc(MEMP_FRAG_PBUF); +} + +/** Free a struct pbuf_custom_ref */ +static void +ip_frag_free_pbuf_custom_ref(struct pbuf_custom_ref* p) +{ + LWIP_ASSERT("p != NULL", p != NULL); + memp_free(MEMP_FRAG_PBUF, p); +} + +/** Free-callback function to free a 'struct pbuf_custom_ref', called by + * pbuf_free. */ +static void +ipfrag_free_pbuf_custom(struct pbuf *p) +{ + struct pbuf_custom_ref *pcr = (struct pbuf_custom_ref*)p; + LWIP_ASSERT("pcr != NULL", pcr != NULL); + LWIP_ASSERT("pcr == p", (void*)pcr == (void*)p); + if (pcr->original != NULL) { + pbuf_free(pcr->original); + } + ip_frag_free_pbuf_custom_ref(pcr); +} +#endif /* !LWIP_NETIF_TX_SINGLE_PBUF */ +#endif /* IP_FRAG_USES_STATIC_BUF */ + +/** + * Fragment an IP datagram if too large for the netif. + * + * Chop the datagram in MTU sized chunks and send them in order + * by using a fixed size static memory buffer (PBUF_REF) or + * point PBUF_REFs into p (depending on IP_FRAG_USES_STATIC_BUF). + * + * @param p ip packet to send + * @param netif the netif on which to send + * @param dest destination ip address to which to send + * + * @return ERR_OK if sent successfully, err_t otherwise + */ +err_t +ip_frag(struct pbuf *p, struct netif *netif, ip_addr_t *dest) +{ + struct pbuf *rambuf; +#if IP_FRAG_USES_STATIC_BUF + struct pbuf *header; +#else +#if !LWIP_NETIF_TX_SINGLE_PBUF + struct pbuf *newpbuf; +#endif + struct ip_hdr *original_iphdr; +#endif + struct ip_hdr *iphdr; + u16_t nfb; + u16_t left, cop; + u16_t mtu = netif->mtu; + u16_t ofo, omf; + u16_t last; + u16_t poff = IP_HLEN; + u16_t tmp; +#if !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF + u16_t newpbuflen = 0; + u16_t left_to_copy; +#endif + + /* Get a RAM based MTU sized pbuf */ +#if IP_FRAG_USES_STATIC_BUF + /* When using a static buffer, we use a PBUF_REF, which we will + * use to reference the packet (without link header). + * Layer and length is irrelevant. + */ + rambuf = pbuf_alloc(PBUF_LINK, 0, PBUF_REF); + if (rambuf == NULL) { + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc(PBUF_LINK, 0, PBUF_REF) failed\n")); + return ERR_MEM; + } + rambuf->tot_len = rambuf->len = mtu; + rambuf->payload = LWIP_MEM_ALIGN((void *)buf); + + /* Copy the IP header in it */ + iphdr = (struct ip_hdr *)rambuf->payload; + SMEMCPY(iphdr, p->payload, IP_HLEN); +#else /* IP_FRAG_USES_STATIC_BUF */ + original_iphdr = (struct ip_hdr *)p->payload; + iphdr = original_iphdr; +#endif /* IP_FRAG_USES_STATIC_BUF */ + + /* Save original offset */ + tmp = ntohs(IPH_OFFSET(iphdr)); + ofo = tmp & IP_OFFMASK; + omf = tmp & IP_MF; + + left = p->tot_len - IP_HLEN; + + nfb = (mtu - IP_HLEN) / 8; + + while (left) { + last = (left <= mtu - IP_HLEN); + + /* Set new offset and MF flag */ + tmp = omf | (IP_OFFMASK & (ofo)); + if (!last) { + tmp = tmp | IP_MF; + } + + /* Fill this fragment */ + cop = last ? left : nfb * 8; + +#if IP_FRAG_USES_STATIC_BUF + poff += pbuf_copy_partial(p, (u8_t*)iphdr + IP_HLEN, cop, poff); +#else /* IP_FRAG_USES_STATIC_BUF */ +#if LWIP_NETIF_TX_SINGLE_PBUF + rambuf = pbuf_alloc(PBUF_IP, cop, PBUF_RAM); + if (rambuf == NULL) { + return ERR_MEM; + } + LWIP_ASSERT("this needs a pbuf in one piece!", + (rambuf->len == rambuf->tot_len) && (rambuf->next == NULL)); + poff += pbuf_copy_partial(p, rambuf->payload, cop, poff); + /* make room for the IP header */ + if(pbuf_header(rambuf, IP_HLEN)) { + pbuf_free(rambuf); + return ERR_MEM; + } + /* fill in the IP header */ + SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN); + iphdr = rambuf->payload; +#else /* LWIP_NETIF_TX_SINGLE_PBUF */ + /* When not using a static buffer, create a chain of pbufs. + * The first will be a PBUF_RAM holding the link and IP header. + * The rest will be PBUF_REFs mirroring the pbuf chain to be fragged, + * but limited to the size of an mtu. + */ + rambuf = pbuf_alloc(PBUF_LINK, IP_HLEN, PBUF_RAM); + if (rambuf == NULL) { + return ERR_MEM; + } + LWIP_ASSERT("this needs a pbuf in one piece!", + (p->len >= (IP_HLEN))); + SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN); + iphdr = (struct ip_hdr *)rambuf->payload; + + /* Can just adjust p directly for needed offset. */ + p->payload = (u8_t *)p->payload + poff; + p->len -= poff; + + left_to_copy = cop; + while (left_to_copy) { + struct pbuf_custom_ref *pcr; + newpbuflen = (left_to_copy < p->len) ? left_to_copy : p->len; + /* Is this pbuf already empty? */ + if (!newpbuflen) { + p = p->next; + continue; + } + pcr = ip_frag_alloc_pbuf_custom_ref(); + if (pcr == NULL) { + pbuf_free(rambuf); + return ERR_MEM; + } + /* Mirror this pbuf, although we might not need all of it. */ + newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc, p->payload, newpbuflen); + if (newpbuf == NULL) { + ip_frag_free_pbuf_custom_ref(pcr); + pbuf_free(rambuf); + return ERR_MEM; + } + pbuf_ref(p); + pcr->original = p; + pcr->pc.custom_free_function = ipfrag_free_pbuf_custom; + + /* Add it to end of rambuf's chain, but using pbuf_cat, not pbuf_chain + * so that it is removed when pbuf_dechain is later called on rambuf. + */ + pbuf_cat(rambuf, newpbuf); + left_to_copy -= newpbuflen; + if (left_to_copy) { + p = p->next; + } + } + poff = newpbuflen; +#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ +#endif /* IP_FRAG_USES_STATIC_BUF */ + + /* Correct header */ + IPH_OFFSET_SET(iphdr, htons(tmp)); + IPH_LEN_SET(iphdr, htons(cop + IP_HLEN)); + IPH_CHKSUM_SET(iphdr, 0); + IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN)); + +#if IP_FRAG_USES_STATIC_BUF + if (last) { + pbuf_realloc(rambuf, left + IP_HLEN); + } + + /* This part is ugly: we alloc a RAM based pbuf for + * the link level header for each chunk and then + * free it.A PBUF_ROM style pbuf for which pbuf_header + * worked would make things simpler. + */ + header = pbuf_alloc(PBUF_LINK, 0, PBUF_RAM); + if (header != NULL) { + pbuf_chain(header, rambuf); + netif->output(netif, header, dest); + IPFRAG_STATS_INC(ip_frag.xmit); + snmp_inc_ipfragcreates(); + pbuf_free(header); + } else { + LWIP_DEBUGF(IP_REASS_DEBUG, ("ip_frag: pbuf_alloc() for header failed\n")); + pbuf_free(rambuf); + return ERR_MEM; + } +#else /* IP_FRAG_USES_STATIC_BUF */ + /* No need for separate header pbuf - we allowed room for it in rambuf + * when allocated. + */ + netif->output(netif, rambuf, dest); + IPFRAG_STATS_INC(ip_frag.xmit); + + /* Unfortunately we can't reuse rambuf - the hardware may still be + * using the buffer. Instead we free it (and the ensuing chain) and + * recreate it next time round the loop. If we're lucky the hardware + * will have already sent the packet, the free will really free, and + * there will be zero memory penalty. + */ + + pbuf_free(rambuf); +#endif /* IP_FRAG_USES_STATIC_BUF */ + left -= cop; + ofo += nfb; + } +#if IP_FRAG_USES_STATIC_BUF + pbuf_free(rambuf); +#endif /* IP_FRAG_USES_STATIC_BUF */ + snmp_inc_ipfragoks(); + return ERR_OK; +} +#endif /* IP_FRAG */ diff --git a/third_party/lwip-1.4.1/src/core/ipv6/README b/third_party/lwip-1.4.1/src/core/ipv6/README new file mode 100644 index 0000000..a59caef --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/ipv6/README @@ -0,0 +1 @@ +IPv6 support in lwIP is very experimental. diff --git a/third_party/lwip-1.4.1/src/core/ipv6/icmp6.c b/third_party/lwip-1.4.1/src/core/ipv6/icmp6.c new file mode 100644 index 0000000..1661ace --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/ipv6/icmp6.c @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +/* Some ICMP messages should be passed to the transport protocols. This + is not implemented. */ + +#include "lwip/opt.h" + +#if LWIP_ICMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/icmp.h" +#include "lwip/inet.h" +#include "lwip/ip.h" +#include "lwip/def.h" +#include "lwip/stats.h" + +void +icmp_input(struct pbuf *p, struct netif *inp) +{ + u8_t type; + struct icmp_echo_hdr *iecho; + struct ip_hdr *iphdr; + struct ip_addr tmpaddr; + + ICMP_STATS_INC(icmp.recv); + + /* TODO: check length before accessing payload! */ + + type = ((u8_t *)p->payload)[0]; + + switch (type) { + case ICMP6_ECHO: + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ping\n")); + + if (p->tot_len < sizeof(struct icmp_echo_hdr)) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: bad ICMP echo received\n")); + + pbuf_free(p); + ICMP_STATS_INC(icmp.lenerr); + return; + } + iecho = p->payload; + iphdr = (struct ip_hdr *)((u8_t *)p->payload - IP_HLEN); + if (inet_chksum_pbuf(p) != 0) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo (%"X16_F")\n", inet_chksum_pseudo(p, &(iphdr->src), &(iphdr->dest), IP_PROTO_ICMP, p->tot_len))); + ICMP_STATS_INC(icmp.chkerr); + /* return;*/ + } + LWIP_DEBUGF(ICMP_DEBUG, ("icmp: p->len %"S16_F" p->tot_len %"S16_F"\n", p->len, p->tot_len)); + ip_addr_set(&tmpaddr, &(iphdr->src)); + ip_addr_set(&(iphdr->src), &(iphdr->dest)); + ip_addr_set(&(iphdr->dest), &tmpaddr); + iecho->type = ICMP6_ER; + /* adjust the checksum */ + if (iecho->chksum >= htons(0xffff - (ICMP6_ECHO << 8))) { + iecho->chksum += htons(ICMP6_ECHO << 8) + 1; + } else { + iecho->chksum += htons(ICMP6_ECHO << 8); + } + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: checksum failed for received ICMP echo (%"X16_F")\n", inet_chksum_pseudo(p, &(iphdr->src), &(iphdr->dest), IP_PROTO_ICMP, p->tot_len))); + ICMP_STATS_INC(icmp.xmit); + + /* LWIP_DEBUGF("icmp: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len);*/ + ip_output_if (p, &(iphdr->src), IP_HDRINCL, + iphdr->hoplim, IP_PROTO_ICMP, inp); + break; + default: + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_input: ICMP type %"S16_F" not supported.\n", (s16_t)type)); + ICMP_STATS_INC(icmp.proterr); + ICMP_STATS_INC(icmp.drop); + } + + pbuf_free(p); +} + +void +icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t) +{ + struct pbuf *q; + struct ip_hdr *iphdr; + struct icmp_dur_hdr *idur; + + /* @todo: can this be PBUF_LINK instead of PBUF_IP? */ + q = pbuf_alloc(PBUF_IP, 8 + IP_HLEN + 8, PBUF_RAM); + /* ICMP header + IP header + 8 bytes of data */ + if (q == NULL) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_dest_unreach: failed to allocate pbuf for ICMP packet.\n")); + pbuf_free(p); + return; + } + LWIP_ASSERT("check that first pbuf can hold icmp message", + (q->len >= (8 + IP_HLEN + 8))); + + iphdr = p->payload; + + idur = q->payload; + idur->type = (u8_t)ICMP6_DUR; + idur->icode = (u8_t)t; + + SMEMCPY((u8_t *)q->payload + 8, p->payload, IP_HLEN + 8); + + /* calculate checksum */ + idur->chksum = 0; + idur->chksum = inet_chksum(idur, q->len); + ICMP_STATS_INC(icmp.xmit); + + ip_output(q, NULL, + (struct ip_addr *)&(iphdr->src), ICMP_TTL, IP_PROTO_ICMP); + pbuf_free(q); +} + +void +icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t) +{ + struct pbuf *q; + struct ip_hdr *iphdr; + struct icmp_te_hdr *tehdr; + + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_time_exceeded\n")); + + /* @todo: can this be PBUF_LINK instead of PBUF_IP? */ + q = pbuf_alloc(PBUF_IP, 8 + IP_HLEN + 8, PBUF_RAM); + /* ICMP header + IP header + 8 bytes of data */ + if (q == NULL) { + LWIP_DEBUGF(ICMP_DEBUG, ("icmp_dest_unreach: failed to allocate pbuf for ICMP packet.\n")); + pbuf_free(p); + return; + } + LWIP_ASSERT("check that first pbuf can hold icmp message", + (q->len >= (8 + IP_HLEN + 8))); + + iphdr = p->payload; + + tehdr = q->payload; + tehdr->type = (u8_t)ICMP6_TE; + tehdr->icode = (u8_t)t; + + /* copy fields from original packet */ + SMEMCPY((u8_t *)q->payload + 8, (u8_t *)p->payload, IP_HLEN + 8); + + /* calculate checksum */ + tehdr->chksum = 0; + tehdr->chksum = inet_chksum(tehdr, q->len); + ICMP_STATS_INC(icmp.xmit); + ip_output(q, NULL, + (struct ip_addr *)&(iphdr->src), ICMP_TTL, IP_PROTO_ICMP); + pbuf_free(q); +} + +#endif /* LWIP_ICMP */ diff --git a/third_party/lwip-1.4.1/src/core/ipv6/inet6.c b/third_party/lwip-1.4.1/src/core/ipv6/inet6.c new file mode 100644 index 0000000..8214f05 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/ipv6/inet6.c @@ -0,0 +1,163 @@ +/** + * @file + * Functions common to all TCP/IPv6 modules, such as the Internet checksum and the + * byte order functions. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/def.h" +#include "lwip/inet.h" + +/* chksum: + * + * Sums up all 16 bit words in a memory portion. Also includes any odd byte. + * This function is used by the other checksum functions. + * + * For now, this is not optimized. Must be optimized for the particular processor + * arcitecture on which it is to run. Preferebly coded in assembler. + */ + +static u32_t +chksum(void *dataptr, u16_t len) +{ + u16_t *sdataptr = dataptr; + u32_t acc; + + + for(acc = 0; len > 1; len -= 2) { + acc += *sdataptr++; + } + + /* add up any odd byte */ + if (len == 1) { + acc += htons((u16_t)(*(u8_t *)dataptr) << 8); + } + + return acc; + +} + +/* inet_chksum_pseudo: + * + * Calculates the pseudo Internet checksum used by TCP and UDP for a pbuf chain. + */ + +u16_t +inet_chksum_pseudo(struct pbuf *p, + struct ip_addr *src, struct ip_addr *dest, + u8_t proto, u32_t proto_len) +{ + u32_t acc; + struct pbuf *q; + u8_t swapped, i; + + acc = 0; + swapped = 0; + for(q = p; q != NULL; q = q->next) { + acc += chksum(q->payload, q->len); + while (acc >> 16) { + acc = (acc & 0xffff) + (acc >> 16); + } + if (q->len % 2 != 0) { + swapped = 1 - swapped; + acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8); + } + } + + if (swapped) { + acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8); + } + + for(i = 0; i < 8; i++) { + acc += ((u16_t *)src->addr)[i] & 0xffff; + acc += ((u16_t *)dest->addr)[i] & 0xffff; + while (acc >> 16) { + acc = (acc & 0xffff) + (acc >> 16); + } + } + acc += (u16_t)htons((u16_t)proto); + acc += ((u16_t *)&proto_len)[0] & 0xffff; + acc += ((u16_t *)&proto_len)[1] & 0xffff; + + while (acc >> 16) { + acc = (acc & 0xffff) + (acc >> 16); + } + return ~(acc & 0xffff); +} + +/* inet_chksum: + * + * Calculates the Internet checksum over a portion of memory. Used primarely for IP + * and ICMP. + */ + +u16_t +inet_chksum(void *dataptr, u16_t len) +{ + u32_t acc, sum; + + acc = chksum(dataptr, len); + sum = (acc & 0xffff) + (acc >> 16); + sum += (sum >> 16); + return ~(sum & 0xffff); +} + +u16_t +inet_chksum_pbuf(struct pbuf *p) +{ + u32_t acc; + struct pbuf *q; + u8_t swapped; + + acc = 0; + swapped = 0; + for(q = p; q != NULL; q = q->next) { + acc += chksum(q->payload, q->len); + while (acc >> 16) { + acc = (acc & 0xffff) + (acc >> 16); + } + if (q->len % 2 != 0) { + swapped = 1 - swapped; + acc = (acc & 0xff << 8) | (acc & 0xff00 >> 8); + } + } + + if (swapped) { + acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8); + } + return ~(acc & 0xffff); +} diff --git a/third_party/lwip-1.4.1/src/core/ipv6/ip6.c b/third_party/lwip-1.4.1/src/core/ipv6/ip6.c new file mode 100644 index 0000000..3d4a47a --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/ipv6/ip6.c @@ -0,0 +1,397 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + + + +/* ip.c + * + * This is the code for the IP layer for IPv6. + * + */ + + +#include "lwip/opt.h" + +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/ip.h" +#include "lwip/inet.h" +#include "lwip/netif.h" +#include "lwip/icmp.h" +#include "lwip/udp.h" +#include "lwip/tcp_impl.h" + +#include "lwip/stats.h" + +#include "arch/perf.h" + +/* ip_init: + * + * Initializes the IP layer. + */ + +void +ip_init(void) +{ +} + +/* ip_route: + * + * Finds the appropriate network interface for a given IP address. It searches the + * list of network interfaces linearly. A match is found if the masked IP address of + * the network interface equals the masked IP address given to the function. + */ + +struct netif * +ip_route(struct ip_addr *dest) +{ + struct netif *netif; + + for(netif = netif_list; netif != NULL; netif = netif->next) { + if (ip_addr_netcmp(dest, &(netif->ip_addr), &(netif->netmask))) { + return netif; + } + } + + return netif_default; +} + +/* ip_forward: + * + * Forwards an IP packet. It finds an appropriate route for the packet, decrements + * the TTL value of the packet, adjusts the checksum and outputs the packet on the + * appropriate interface. + */ + +static void +ip_forward(struct pbuf *p, struct ip_hdr *iphdr) +{ + struct netif *netif; + + PERF_START; + + if ((netif = ip_route((struct ip_addr *)&(iphdr->dest))) == NULL) { + + LWIP_DEBUGF(IP_DEBUG, ("ip_input: no forwarding route found for ")); +#if IP_DEBUG + ip_addr_debug_print(IP_DEBUG, ((struct ip_addr *)&(iphdr->dest))); +#endif /* IP_DEBUG */ + LWIP_DEBUGF(IP_DEBUG, ("\n")); + pbuf_free(p); + return; + } + /* Decrement TTL and send ICMP if ttl == 0. */ + if (--iphdr->hoplim == 0) { +#if LWIP_ICMP + /* Don't send ICMP messages in response to ICMP messages */ + if (iphdr->nexthdr != IP_PROTO_ICMP) { + icmp_time_exceeded(p, ICMP_TE_TTL); + } +#endif /* LWIP_ICMP */ + pbuf_free(p); + return; + } + + /* Incremental update of the IP checksum. */ + /* if (iphdr->chksum >= htons(0xffff - 0x100)) { + iphdr->chksum += htons(0x100) + 1; + } else { + iphdr->chksum += htons(0x100); + }*/ + + + LWIP_DEBUGF(IP_DEBUG, ("ip_forward: forwarding packet to ")); +#if IP_DEBUG + ip_addr_debug_print(IP_DEBUG, ((struct ip_addr *)&(iphdr->dest))); +#endif /* IP_DEBUG */ + LWIP_DEBUGF(IP_DEBUG, ("\n")); + + IP_STATS_INC(ip.fw); + IP_STATS_INC(ip.xmit); + + PERF_STOP("ip_forward"); + + netif->output(netif, p, (struct ip_addr *)&(iphdr->dest)); +} + +/* ip_input: + * + * This function is called by the network interface device driver when an IP packet is + * received. The function does the basic checks of the IP header such as packet size + * being at least larger than the header size etc. If the packet was not destined for + * us, the packet is forwarded (using ip_forward). The IP checksum is always checked. + * + * Finally, the packet is sent to the upper layer protocol input function. + */ + +void +ip_input(struct pbuf *p, struct netif *inp) { + struct ip_hdr *iphdr; + struct netif *netif; + + + PERF_START; + +#if IP_DEBUG + ip_debug_print(p); +#endif /* IP_DEBUG */ + + + IP_STATS_INC(ip.recv); + + /* identify the IP header */ + iphdr = p->payload; + + + if (iphdr->v != 6) { + LWIP_DEBUGF(IP_DEBUG, ("IP packet dropped due to bad version number\n")); +#if IP_DEBUG + ip_debug_print(p); +#endif /* IP_DEBUG */ + pbuf_free(p); + IP_STATS_INC(ip.err); + IP_STATS_INC(ip.drop); + return; + } + + /* is this packet for us? */ + for(netif = netif_list; netif != NULL; netif = netif->next) { +#if IP_DEBUG + LWIP_DEBUGF(IP_DEBUG, ("ip_input: iphdr->dest ")); + ip_addr_debug_print(IP_DEBUG, ((struct ip_addr *)&(iphdr->dest))); + LWIP_DEBUGF(IP_DEBUG, ("netif->ip_addr ")); + ip_addr_debug_print(IP_DEBUG, ((struct ip_addr *)&(iphdr->dest))); + LWIP_DEBUGF(IP_DEBUG, ("\n")); +#endif /* IP_DEBUG */ + if (ip_addr_cmp(&(iphdr->dest), &(netif->ip_addr))) { + break; + } + } + + + if (netif == NULL) { + /* packet not for us, route or discard */ +#if IP_FORWARD + ip_forward(p, iphdr); +#endif + pbuf_free(p); + return; + } + + pbuf_realloc(p, IP_HLEN + ntohs(iphdr->len)); + + /* send to upper layers */ +#if IP_DEBUG + /* LWIP_DEBUGF("ip_input: \n"); + ip_debug_print(p); + LWIP_DEBUGF("ip_input: p->len %"U16_F" p->tot_len %"U16_F"\n", p->len, p->tot_len);*/ +#endif /* IP_DEBUG */ + + if(pbuf_header(p, -IP_HLEN)) { + LWIP_ASSERT("Can't move over header in packet", 0); + return; + } + + switch (iphdr->nexthdr) { + case IP_PROTO_UDP: + udp_input(p, inp); + break; + case IP_PROTO_TCP: + tcp_input(p, inp); + break; +#if LWIP_ICMP + case IP_PROTO_ICMP: + icmp_input(p, inp); + break; +#endif /* LWIP_ICMP */ + default: +#if LWIP_ICMP + /* send ICMP destination protocol unreachable */ + icmp_dest_unreach(p, ICMP_DUR_PROTO); +#endif /* LWIP_ICMP */ + pbuf_free(p); + LWIP_DEBUGF(IP_DEBUG, ("Unsupported transport protocol %"U16_F"\n", + iphdr->nexthdr)); + + IP_STATS_INC(ip.proterr); + IP_STATS_INC(ip.drop); + } + PERF_STOP("ip_input"); +} + + +/* ip_output_if: + * + * Sends an IP packet on a network interface. This function constructs the IP header + * and calculates the IP header checksum. If the source IP address is NULL, + * the IP address of the outgoing network interface is filled in as source address. + */ + +err_t +ip_output_if (struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, + u8_t proto, struct netif *netif) +{ + struct ip_hdr *iphdr; + + PERF_START; + + LWIP_DEBUGF(IP_DEBUG, ("len %"U16_F" tot_len %"U16_F"\n", p->len, p->tot_len)); + if (pbuf_header(p, IP_HLEN)) { + LWIP_DEBUGF(IP_DEBUG, ("ip_output: not enough room for IP header in pbuf\n")); + IP_STATS_INC(ip.err); + + return ERR_BUF; + } + LWIP_DEBUGF(IP_DEBUG, ("len %"U16_F" tot_len %"U16_F"\n", p->len, p->tot_len)); + + iphdr = p->payload; + + + if (dest != IP_HDRINCL) { + LWIP_DEBUGF(IP_DEBUG, ("!IP_HDRLINCL\n")); + iphdr->hoplim = ttl; + iphdr->nexthdr = proto; + iphdr->len = htons(p->tot_len - IP_HLEN); + ip_addr_set(&(iphdr->dest), dest); + + iphdr->v = 6; + + if (ip_addr_isany(src)) { + ip_addr_set(&(iphdr->src), &(netif->ip_addr)); + } else { + ip_addr_set(&(iphdr->src), src); + } + + } else { + dest = &(iphdr->dest); + } + + IP_STATS_INC(ip.xmit); + + LWIP_DEBUGF(IP_DEBUG, ("ip_output_if: %c%c (len %"U16_F")\n", netif->name[0], netif->name[1], p->tot_len)); +#if IP_DEBUG + ip_debug_print(p); +#endif /* IP_DEBUG */ + + PERF_STOP("ip_output_if"); + return netif->output(netif, p, dest); +} + +/* ip_output: + * + * Simple interface to ip_output_if. It finds the outgoing network interface and + * calls upon ip_output_if to do the actual work. + */ + +err_t +ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, u8_t proto) +{ + struct netif *netif; + if ((netif = ip_route(dest)) == NULL) { + LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to 0x%"X32_F"\n", dest->addr)); + IP_STATS_INC(ip.rterr); + return ERR_RTE; + } + + return ip_output_if (p, src, dest, ttl, proto, netif); +} + +#if LWIP_NETIF_HWADDRHINT +err_t +ip_output_hinted(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint) +{ + struct netif *netif; + err_t err; + + if ((netif = ip_route(dest)) == NULL) { + LWIP_DEBUGF(IP_DEBUG, ("ip_output: No route to 0x%"X32_F"\n", dest->addr)); + IP_STATS_INC(ip.rterr); + return ERR_RTE; + } + + LWIP_NETIF_HWADDRHINT(netif, addr_hint); + err = ip_output_if(p, src, dest, ttl, tos, proto, netif); + LWIP_NETIF_HWADDRHINT(netif, NULL); + + return err; +} +#endif /* LWIP_NETIF_HWADDRHINT*/ + +#if IP_DEBUG +void +ip_debug_print(struct pbuf *p) +{ + struct ip_hdr *iphdr = p->payload; + + LWIP_DEBUGF(IP_DEBUG, ("IP header:\n")); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("|%2"S16_F" | %"X16_F"%"X16_F" | %"X16_F"%"X16_F" | (v, traffic class, flow label)\n", + iphdr->v, + iphdr->tclass1, iphdr->tclass2, + iphdr->flow1, iphdr->flow2)); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("| %5"U16_F" | %2"U16_F" | %2"U16_F" | (len, nexthdr, hoplim)\n", + ntohs(iphdr->len), + iphdr->nexthdr, + iphdr->hoplim)); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (src)\n", + (ntohl(iphdr->src.addr[0]) >> 16) & 0xffff, + ntohl(iphdr->src.addr[0]) & 0xffff)); + LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (src)\n", + (ntohl(iphdr->src.addr[1]) >> 16) & 0xffff, + ntohl(iphdr->src.addr[1]) & 0xffff)); + LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (src)\n", + (ntohl(iphdr->src.addr[2]) >> 16) & 0xffff, + ntohl(iphdr->src.addr[2]) & 0xffff)); + LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (src)\n", + (ntohl(iphdr->src.addr[3]) >> 16) & 0xffff, + ntohl(iphdr->src.addr[3]) & 0xffff)); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (dest)\n", + (ntohl(iphdr->dest.addr[0]) >> 16) & 0xffff, + ntohl(iphdr->dest.addr[0]) & 0xffff)); + LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (dest)\n", + (ntohl(iphdr->dest.addr[1]) >> 16) & 0xffff, + ntohl(iphdr->dest.addr[1]) & 0xffff)); + LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (dest)\n", + (ntohl(iphdr->dest.addr[2]) >> 16) & 0xffff, + ntohl(iphdr->dest.addr[2]) & 0xffff)); + LWIP_DEBUGF(IP_DEBUG, ("| %4"X32_F" | %4"X32_F" | (dest)\n", + (ntohl(iphdr->dest.addr[3]) >> 16) & 0xffff, + ntohl(iphdr->dest.addr[3]) & 0xffff)); + LWIP_DEBUGF(IP_DEBUG, ("+-------------------------------+\n")); +} +#endif /* IP_DEBUG */ diff --git a/third_party/lwip-1.4.1/src/core/ipv6/ip6_addr.c b/third_party/lwip-1.4.1/src/core/ipv6/ip6_addr.c new file mode 100644 index 0000000..d898526 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/ipv6/ip6_addr.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" +#include "lwip/ip_addr.h" +#include "lwip/inet.h" + +u8_t +ip_addr_netcmp(struct ip_addr *addr1, struct ip_addr *addr2, + struct ip_addr *mask) +{ + return((addr1->addr[0] & mask->addr[0]) == (addr2->addr[0] & mask->addr[0]) && + (addr1->addr[1] & mask->addr[1]) == (addr2->addr[1] & mask->addr[1]) && + (addr1->addr[2] & mask->addr[2]) == (addr2->addr[2] & mask->addr[2]) && + (addr1->addr[3] & mask->addr[3]) == (addr2->addr[3] & mask->addr[3])); + +} + +u8_t +ip_addr_cmp(struct ip_addr *addr1, struct ip_addr *addr2) +{ + return(addr1->addr[0] == addr2->addr[0] && + addr1->addr[1] == addr2->addr[1] && + addr1->addr[2] == addr2->addr[2] && + addr1->addr[3] == addr2->addr[3]); +} + +void +ip_addr_set(struct ip_addr *dest, struct ip_addr *src) +{ + SMEMCPY(dest, src, sizeof(struct ip_addr)); + /* dest->addr[0] = src->addr[0]; + dest->addr[1] = src->addr[1]; + dest->addr[2] = src->addr[2]; + dest->addr[3] = src->addr[3];*/ +} + +u8_t +ip_addr_isany(struct ip_addr *addr) +{ + if (addr == NULL) return 1; + return((addr->addr[0] | addr->addr[1] | addr->addr[2] | addr->addr[3]) == 0); +} diff --git a/third_party/lwip-1.4.1/src/core/mem.c b/third_party/lwip-1.4.1/src/core/mem.c new file mode 100644 index 0000000..b0bac6e --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/mem.c @@ -0,0 +1,659 @@ +/** + * @file + * Dynamic memory manager + * + * This is a lightweight replacement for the standard C library malloc(). + * + * If you want to use the standard C library malloc() instead, define + * MEM_LIBC_MALLOC to 1 in your lwipopts.h + * + * To let mem_malloc() use pools (prevents fragmentation and is much faster than + * a heap but might waste some memory), define MEM_USE_POOLS to 1, define + * MEM_USE_CUSTOM_POOLS to 1 and create a file "lwippools.h" that includes a list + * of pools like this (more pools can be added between _START and _END): + * + * Define three pools with sizes 256, 512, and 1512 bytes + * LWIP_MALLOC_MEMPOOL_START + * LWIP_MALLOC_MEMPOOL(20, 256) + * LWIP_MALLOC_MEMPOOL(10, 512) + * LWIP_MALLOC_MEMPOOL(5, 1512) + * LWIP_MALLOC_MEMPOOL_END + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * Simon Goldschmidt + * + */ + +#include "lwip/opt.h" + +#if !MEM_LIBC_MALLOC /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/sys.h" +#include "lwip/stats.h" +#include "lwip/err.h" + +#include + +#if MEM_USE_POOLS +/* lwIP head implemented with different sized pools */ + +/** + * Allocate memory: determine the smallest pool that is big enough + * to contain an element of 'size' and get an element from that pool. + * + * @param size the size in bytes of the memory needed + * @return a pointer to the allocated memory or NULL if the pool is empty + */ +void * +mem_malloc(mem_size_t size) +{ + void *ret; + struct memp_malloc_helper *element; + memp_t poolnr; + mem_size_t required_size = size + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper)); + + for (poolnr = MEMP_POOL_FIRST; poolnr <= MEMP_POOL_LAST; poolnr = (memp_t)(poolnr + 1)) { +#if MEM_USE_POOLS_TRY_BIGGER_POOL +again: +#endif /* MEM_USE_POOLS_TRY_BIGGER_POOL */ + /* is this pool big enough to hold an element of the required size + plus a struct memp_malloc_helper that saves the pool this element came from? */ + if (required_size <= memp_sizes[poolnr]) { + break; + } + } + if (poolnr > MEMP_POOL_LAST) { + LWIP_ASSERT("mem_malloc(): no pool is that big!", 0); + return NULL; + } + element = (struct memp_malloc_helper*)memp_malloc(poolnr); + if (element == NULL) { + /* No need to DEBUGF or ASSERT: This error is already + taken care of in memp.c */ +#if MEM_USE_POOLS_TRY_BIGGER_POOL + /** Try a bigger pool if this one is empty! */ + if (poolnr < MEMP_POOL_LAST) { + poolnr++; + goto again; + } +#endif /* MEM_USE_POOLS_TRY_BIGGER_POOL */ + return NULL; + } + + /* save the pool number this element came from */ + element->poolnr = poolnr; + /* and return a pointer to the memory directly after the struct memp_malloc_helper */ + ret = (u8_t*)element + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper)); + + return ret; +} + +/** + * Free memory previously allocated by mem_malloc. Loads the pool number + * and calls memp_free with that pool number to put the element back into + * its pool + * + * @param rmem the memory element to free + */ +void +mem_free(void *rmem) +{ + struct memp_malloc_helper *hmem; + + LWIP_ASSERT("rmem != NULL", (rmem != NULL)); + LWIP_ASSERT("rmem == MEM_ALIGN(rmem)", (rmem == LWIP_MEM_ALIGN(rmem))); + + /* get the original struct memp_malloc_helper */ + hmem = (struct memp_malloc_helper*)(void*)((u8_t*)rmem - LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper))); + + LWIP_ASSERT("hmem != NULL", (hmem != NULL)); + LWIP_ASSERT("hmem == MEM_ALIGN(hmem)", (hmem == LWIP_MEM_ALIGN(hmem))); + LWIP_ASSERT("hmem->poolnr < MEMP_MAX", (hmem->poolnr < MEMP_MAX)); + + /* and put it in the pool we saved earlier */ + memp_free(hmem->poolnr, hmem); +} + +#else /* MEM_USE_POOLS */ +/* lwIP replacement for your libc malloc() */ + +/** + * The heap is made up as a list of structs of this type. + * This does not have to be aligned since for getting its size, + * we only use the macro SIZEOF_STRUCT_MEM, which automatically alignes. + */ +struct mem { + /** index (-> ram[next]) of the next struct */ + mem_size_t next; + /** index (-> ram[prev]) of the previous struct */ + mem_size_t prev; + /** 1: this area is used; 0: this area is unused */ + u8_t used; +}; + +/** All allocated blocks will be MIN_SIZE bytes big, at least! + * MIN_SIZE can be overridden to suit your needs. Smaller values save space, + * larger values could prevent too small blocks to fragment the RAM too much. */ +#ifndef MIN_SIZE +#define MIN_SIZE 12 +#endif /* MIN_SIZE */ +/* some alignment macros: we define them here for better source code layout */ +#define MIN_SIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(MIN_SIZE) +#define SIZEOF_STRUCT_MEM LWIP_MEM_ALIGN_SIZE(sizeof(struct mem)) +#define MEM_SIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEM_SIZE) + +/** If you want to relocate the heap to external memory, simply define + * LWIP_RAM_HEAP_POINTER as a void-pointer to that location. + * If so, make sure the memory at that location is big enough (see below on + * how that space is calculated). */ +#ifndef LWIP_RAM_HEAP_POINTER +/** the heap. we need one struct mem at the end and some room for alignment */ +u8_t ram_heap[MEM_SIZE_ALIGNED + (2*SIZEOF_STRUCT_MEM) + MEM_ALIGNMENT]; +#define LWIP_RAM_HEAP_POINTER ram_heap +#endif /* LWIP_RAM_HEAP_POINTER */ + +/** pointer to the heap (ram_heap): for alignment, ram is now a pointer instead of an array */ +static u8_t *ram; +/** the last entry, always unused! */ +static struct mem *ram_end; +/** pointer to the lowest free block, this is used for faster search */ +static struct mem *lfree; + +/** concurrent access protection */ +#if !NO_SYS +static sys_mutex_t mem_mutex; +#endif + +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + +static volatile u8_t mem_free_count; + +/* Allow mem_free from other (e.g. interrupt) context */ +#define LWIP_MEM_FREE_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_free) +#define LWIP_MEM_FREE_PROTECT() SYS_ARCH_PROTECT(lev_free) +#define LWIP_MEM_FREE_UNPROTECT() SYS_ARCH_UNPROTECT(lev_free) +#define LWIP_MEM_ALLOC_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_alloc) +#define LWIP_MEM_ALLOC_PROTECT() SYS_ARCH_PROTECT(lev_alloc) +#define LWIP_MEM_ALLOC_UNPROTECT() SYS_ARCH_UNPROTECT(lev_alloc) + +#else /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + +/* Protect the heap only by using a semaphore */ +#define LWIP_MEM_FREE_DECL_PROTECT() +#define LWIP_MEM_FREE_PROTECT() sys_mutex_lock(&mem_mutex) +#define LWIP_MEM_FREE_UNPROTECT() sys_mutex_unlock(&mem_mutex) +/* mem_malloc is protected using semaphore AND LWIP_MEM_ALLOC_PROTECT */ +#define LWIP_MEM_ALLOC_DECL_PROTECT() +#define LWIP_MEM_ALLOC_PROTECT() +#define LWIP_MEM_ALLOC_UNPROTECT() + +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + + +/** + * "Plug holes" by combining adjacent empty struct mems. + * After this function is through, there should not exist + * one empty struct mem pointing to another empty struct mem. + * + * @param mem this points to a struct mem which just has been freed + * @internal this function is only called by mem_free() and mem_trim() + * + * This assumes access to the heap is protected by the calling function + * already. + */ +static void +plug_holes(struct mem *mem) +{ + struct mem *nmem; + struct mem *pmem; + + LWIP_ASSERT("plug_holes: mem >= ram", (u8_t *)mem >= ram); + LWIP_ASSERT("plug_holes: mem < ram_end", (u8_t *)mem < (u8_t *)ram_end); + LWIP_ASSERT("plug_holes: mem->used == 0", mem->used == 0); + + /* plug hole forward */ + LWIP_ASSERT("plug_holes: mem->next <= MEM_SIZE_ALIGNED", mem->next <= MEM_SIZE_ALIGNED); + + nmem = (struct mem *)(void *)&ram[mem->next]; + if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) { + /* if mem->next is unused and not end of ram, combine mem and mem->next */ + if (lfree == nmem) { + lfree = mem; + } + mem->next = nmem->next; + ((struct mem *)(void *)&ram[nmem->next])->prev = (mem_size_t)((u8_t *)mem - ram); + } + + /* plug hole backward */ + pmem = (struct mem *)(void *)&ram[mem->prev]; + if (pmem != mem && pmem->used == 0) { + /* if mem->prev is unused, combine mem and mem->prev */ + if (lfree == mem) { + lfree = pmem; + } + pmem->next = mem->next; + ((struct mem *)(void *)&ram[mem->next])->prev = (mem_size_t)((u8_t *)pmem - ram); + } +} + +/** + * Zero the heap and initialize start, end and lowest-free + */ +void +mem_init(void) +{ + struct mem *mem; + + LWIP_ASSERT("Sanity check alignment", + (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0); + + /* align the heap */ + ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER); + /* initialize the start of the heap */ + mem = (struct mem *)(void *)ram; + mem->next = MEM_SIZE_ALIGNED; + mem->prev = 0; + mem->used = 0; + /* initialize the end of the heap */ + ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED]; + ram_end->used = 1; + ram_end->next = MEM_SIZE_ALIGNED; + ram_end->prev = MEM_SIZE_ALIGNED; + + /* initialize the lowest-free pointer to the start of the heap */ + lfree = (struct mem *)(void *)ram; + + MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED); + + if(sys_mutex_new(&mem_mutex) != ERR_OK) { + LWIP_ASSERT("failed to create mem_mutex", 0); + } +} + +/** + * Put a struct mem back on the heap + * + * @param rmem is the data portion of a struct mem as returned by a previous + * call to mem_malloc() + */ +void +mem_free(void *rmem) +{ + struct mem *mem; + LWIP_MEM_FREE_DECL_PROTECT(); + + if (rmem == NULL) { + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("mem_free(p == NULL) was called.\n")); + return; + } + LWIP_ASSERT("mem_free: sanity check alignment", (((mem_ptr_t)rmem) & (MEM_ALIGNMENT-1)) == 0); + + LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram && + (u8_t *)rmem < (u8_t *)ram_end); + + if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { + SYS_ARCH_DECL_PROTECT(lev); + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_free: illegal memory\n")); + /* protect mem stats from concurrent access */ + SYS_ARCH_PROTECT(lev); + MEM_STATS_INC(illegal); + SYS_ARCH_UNPROTECT(lev); + return; + } + /* protect the heap from concurrent access */ + LWIP_MEM_FREE_PROTECT(); + /* Get the corresponding struct mem ... */ + mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM); + /* ... which has to be in a used state ... */ + LWIP_ASSERT("mem_free: mem->used", mem->used); + /* ... and is now unused. */ + mem->used = 0; + + if (mem < lfree) { + /* the newly freed struct is now the lowest */ + lfree = mem; + } + + MEM_STATS_DEC_USED(used, mem->next - (mem_size_t)(((u8_t *)mem - ram))); + + /* finally, see if prev or next are free also */ + plug_holes(mem); +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + mem_free_count = 1; +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + LWIP_MEM_FREE_UNPROTECT(); +} + +/** + * Shrink memory returned by mem_malloc(). + * + * @param rmem pointer to memory allocated by mem_malloc the is to be shrinked + * @param newsize required size after shrinking (needs to be smaller than or + * equal to the previous size) + * @return for compatibility reasons: is always == rmem, at the moment + * or NULL if newsize is > old size, in which case rmem is NOT touched + * or freed! + */ +void * +mem_trim(void *rmem, mem_size_t newsize) +{ + mem_size_t size; + mem_size_t ptr, ptr2; + struct mem *mem, *mem2; + /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */ + LWIP_MEM_FREE_DECL_PROTECT(); + + /* Expand the size of the allocated memory region so that we can + adjust for alignment. */ + newsize = LWIP_MEM_ALIGN_SIZE(newsize); + + if(newsize < MIN_SIZE_ALIGNED) { + /* every data block must be at least MIN_SIZE_ALIGNED long */ + newsize = MIN_SIZE_ALIGNED; + } + + if (newsize > MEM_SIZE_ALIGNED) { + return NULL; + } + + LWIP_ASSERT("mem_trim: legal memory", (u8_t *)rmem >= (u8_t *)ram && + (u8_t *)rmem < (u8_t *)ram_end); + + if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { + SYS_ARCH_DECL_PROTECT(lev); + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, ("mem_trim: illegal memory\n")); + /* protect mem stats from concurrent access */ + SYS_ARCH_PROTECT(lev); + MEM_STATS_INC(illegal); + SYS_ARCH_UNPROTECT(lev); + return rmem; + } + /* Get the corresponding struct mem ... */ + mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM); + /* ... and its offset pointer */ + ptr = (mem_size_t)((u8_t *)mem - ram); + + size = mem->next - ptr - SIZEOF_STRUCT_MEM; + LWIP_ASSERT("mem_trim can only shrink memory", newsize <= size); + if (newsize > size) { + /* not supported */ + return NULL; + } + if (newsize == size) { + /* No change in size, simply return */ + return rmem; + } + + /* protect the heap from concurrent access */ + LWIP_MEM_FREE_PROTECT(); + + mem2 = (struct mem *)(void *)&ram[mem->next]; + if(mem2->used == 0) { + /* The next struct is unused, we can simply move it at little */ + mem_size_t next; + /* remember the old next pointer */ + next = mem2->next; + /* create new struct mem which is moved directly after the shrinked mem */ + ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize; + if (lfree == mem2) { + lfree = (struct mem *)(void *)&ram[ptr2]; + } + mem2 = (struct mem *)(void *)&ram[ptr2]; + mem2->used = 0; + /* restore the next pointer */ + mem2->next = next; + /* link it back to mem */ + mem2->prev = ptr; + /* link mem to it */ + mem->next = ptr2; + /* last thing to restore linked list: as we have moved mem2, + * let 'mem2->next->prev' point to mem2 again. but only if mem2->next is not + * the end of the heap */ + if (mem2->next != MEM_SIZE_ALIGNED) { + ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2; + } + MEM_STATS_DEC_USED(used, (size - newsize)); + /* no need to plug holes, we've already done that */ + } else if (newsize + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED <= size) { + /* Next struct is used but there's room for another struct mem with + * at least MIN_SIZE_ALIGNED of data. + * Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem + * ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED'). + * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty + * region that couldn't hold data, but when mem->next gets freed, + * the 2 regions would be combined, resulting in more free memory */ + ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize; + mem2 = (struct mem *)(void *)&ram[ptr2]; + if (mem2 < lfree) { + lfree = mem2; + } + mem2->used = 0; + mem2->next = mem->next; + mem2->prev = ptr; + mem->next = ptr2; + if (mem2->next != MEM_SIZE_ALIGNED) { + ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2; + } + MEM_STATS_DEC_USED(used, (size - newsize)); + /* the original mem->next is used, so no need to plug holes! */ + } + /* else { + next struct mem is used but size between mem and mem2 is not big enough + to create another struct mem + -> don't do anyhting. + -> the remaining space stays unused since it is too small + } */ +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + mem_free_count = 1; +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + LWIP_MEM_FREE_UNPROTECT(); + return rmem; +} + +/** + * Adam's mem_malloc() plus solution for bug #17922 + * Allocate a block of memory with a minimum of 'size' bytes. + * + * @param size is the minimum size of the requested block in bytes. + * @return pointer to allocated memory or NULL if no free memory was found. + * + * Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT). + */ +void * +mem_malloc(mem_size_t size) +{ + mem_size_t ptr, ptr2; + struct mem *mem, *mem2; +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + u8_t local_mem_free_count = 0; +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + LWIP_MEM_ALLOC_DECL_PROTECT(); + + if (size == 0) { + return NULL; + } + + /* Expand the size of the allocated memory region so that we can + adjust for alignment. */ + size = LWIP_MEM_ALIGN_SIZE(size); + + if(size < MIN_SIZE_ALIGNED) { + /* every data block must be at least MIN_SIZE_ALIGNED long */ + size = MIN_SIZE_ALIGNED; + } + + if (size > MEM_SIZE_ALIGNED) { + return NULL; + } + + /* protect the heap from concurrent access */ + sys_mutex_lock(&mem_mutex); + LWIP_MEM_ALLOC_PROTECT(); +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + /* run as long as a mem_free disturbed mem_malloc or mem_trim */ + do { + local_mem_free_count = 0; +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + + /* Scan through the heap searching for a free block that is big enough, + * beginning with the lowest free block. + */ + for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size; + ptr = ((struct mem *)(void *)&ram[ptr])->next) { + mem = (struct mem *)(void *)&ram[ptr]; +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + mem_free_count = 0; + LWIP_MEM_ALLOC_UNPROTECT(); + /* allow mem_free or mem_trim to run */ + LWIP_MEM_ALLOC_PROTECT(); + if (mem_free_count != 0) { + /* If mem_free or mem_trim have run, we have to restart since they + could have altered our current struct mem. */ + local_mem_free_count = 1; + break; + } +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + + if ((!mem->used) && + (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) { + /* mem is not used and at least perfect fit is possible: + * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */ + + if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) { + /* (in addition to the above, we test if another struct mem (SIZEOF_STRUCT_MEM) containing + * at least MIN_SIZE_ALIGNED of data also fits in the 'user data space' of 'mem') + * -> split large block, create empty remainder, + * remainder must be large enough to contain MIN_SIZE_ALIGNED data: if + * mem->next - (ptr + (2*SIZEOF_STRUCT_MEM)) == size, + * struct mem would fit in but no data between mem2 and mem2->next + * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty + * region that couldn't hold data, but when mem->next gets freed, + * the 2 regions would be combined, resulting in more free memory + */ + ptr2 = ptr + SIZEOF_STRUCT_MEM + size; + /* create mem2 struct */ + mem2 = (struct mem *)(void *)&ram[ptr2]; + mem2->used = 0; + mem2->next = mem->next; + mem2->prev = ptr; + /* and insert it between mem and mem->next */ + mem->next = ptr2; + mem->used = 1; + + if (mem2->next != MEM_SIZE_ALIGNED) { + ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2; + } + MEM_STATS_INC_USED(used, (size + SIZEOF_STRUCT_MEM)); + } else { + /* (a mem2 struct does no fit into the user data space of mem and mem->next will always + * be used at this point: if not we have 2 unused structs in a row, plug_holes should have + * take care of this). + * -> near fit or excact fit: do not split, no mem2 creation + * also can't move mem->next directly behind mem, since mem->next + * will always be used at this point! + */ + mem->used = 1; + MEM_STATS_INC_USED(used, mem->next - (mem_size_t)((u8_t *)mem - ram)); + } +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT +mem_malloc_adjust_lfree: +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + if (mem == lfree) { + struct mem *cur = lfree; + /* Find next free block after mem and update lowest free pointer */ + while (cur->used && cur != ram_end) { +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + mem_free_count = 0; + LWIP_MEM_ALLOC_UNPROTECT(); + /* prevent high interrupt latency... */ + LWIP_MEM_ALLOC_PROTECT(); + if (mem_free_count != 0) { + /* If mem_free or mem_trim have run, we have to restart since they + could have altered our current struct mem or lfree. */ + goto mem_malloc_adjust_lfree; + } +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + cur = (struct mem *)(void *)&ram[cur->next]; + } + lfree = cur; + LWIP_ASSERT("mem_malloc: !lfree->used", ((lfree == ram_end) || (!lfree->used))); + } + LWIP_MEM_ALLOC_UNPROTECT(); + sys_mutex_unlock(&mem_mutex); + LWIP_ASSERT("mem_malloc: allocated memory not above ram_end.", + (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end); + LWIP_ASSERT("mem_malloc: allocated memory properly aligned.", + ((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0); + LWIP_ASSERT("mem_malloc: sanity check alignment", + (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0); + + return (u8_t *)mem + SIZEOF_STRUCT_MEM; + } + } +#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT + /* if we got interrupted by a mem_free, try again */ + } while(local_mem_free_count != 0); +#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */ + LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("mem_malloc: could not allocate %"S16_F" bytes\n", (s16_t)size)); + MEM_STATS_INC(err); + LWIP_MEM_ALLOC_UNPROTECT(); + sys_mutex_unlock(&mem_mutex); + return NULL; +} + +#endif /* MEM_USE_POOLS */ +/** + * Contiguously allocates enough space for count objects that are size bytes + * of memory each and returns a pointer to the allocated memory. + * + * The allocated memory is filled with bytes of value zero. + * + * @param count number of objects to allocate + * @param size size of the objects to allocate + * @return pointer to allocated memory / NULL pointer if there is an error + */ +void *mem_calloc(mem_size_t count, mem_size_t size) +{ + void *p; + + /* allocate 'count' objects of size 'size' */ + p = mem_malloc(count * size); + if (p) { + /* zero the memory */ + memset(p, 0, count * size); + } + return p; +} + +#endif /* !MEM_LIBC_MALLOC */ diff --git a/third_party/lwip-1.4.1/src/core/memp.c b/third_party/lwip-1.4.1/src/core/memp.c new file mode 100644 index 0000000..fbb2959 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/memp.c @@ -0,0 +1,470 @@ +/** + * @file + * Dynamic pool memory manager + * + * lwIP has dedicated pools for many structures (netconn, protocol control blocks, + * packet buffers, ...). All these pools are managed here. + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/memp.h" +#include "lwip/pbuf.h" +#include "lwip/udp.h" +#include "lwip/raw.h" +#include "lwip/tcp_impl.h" +#include "lwip/igmp.h" +#include "lwip/api.h" +#include "lwip/api_msg.h" +#include "lwip/tcpip.h" +#include "lwip/sys.h" +#include "lwip/timers.h" +#include "lwip/stats.h" +#include "netif/etharp.h" +#include "lwip/ip_frag.h" +#include "lwip/snmp_structs.h" +#include "lwip/snmp_msg.h" +#include "lwip/dns.h" +#include "netif/ppp_oe.h" + +#include + +#if !MEMP_MEM_MALLOC /* don't build if not configured for use in lwipopts.h */ + +struct memp { + struct memp *next; +#if MEMP_OVERFLOW_CHECK + const char *file; + int line; +#endif /* MEMP_OVERFLOW_CHECK */ +}; + +#if MEMP_OVERFLOW_CHECK +/* if MEMP_OVERFLOW_CHECK is turned on, we reserve some bytes at the beginning + * and at the end of each element, initialize them as 0xcd and check + * them later. */ +/* If MEMP_OVERFLOW_CHECK is >= 2, on every call to memp_malloc or memp_free, + * every single element in each pool is checked! + * This is VERY SLOW but also very helpful. */ +/* MEMP_SANITY_REGION_BEFORE and MEMP_SANITY_REGION_AFTER can be overridden in + * lwipopts.h to change the amount reserved for checking. */ +#ifndef MEMP_SANITY_REGION_BEFORE +#define MEMP_SANITY_REGION_BEFORE 16 +#endif /* MEMP_SANITY_REGION_BEFORE*/ +#if MEMP_SANITY_REGION_BEFORE > 0 +#define MEMP_SANITY_REGION_BEFORE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_BEFORE) +#else +#define MEMP_SANITY_REGION_BEFORE_ALIGNED 0 +#endif /* MEMP_SANITY_REGION_BEFORE*/ +#ifndef MEMP_SANITY_REGION_AFTER +#define MEMP_SANITY_REGION_AFTER 16 +#endif /* MEMP_SANITY_REGION_AFTER*/ +#if MEMP_SANITY_REGION_AFTER > 0 +#define MEMP_SANITY_REGION_AFTER_ALIGNED LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_AFTER) +#else +#define MEMP_SANITY_REGION_AFTER_ALIGNED 0 +#endif /* MEMP_SANITY_REGION_AFTER*/ + +/* MEMP_SIZE: save space for struct memp and for sanity check */ +#define MEMP_SIZE (LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEMP_SANITY_REGION_BEFORE_ALIGNED) +#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x) + MEMP_SANITY_REGION_AFTER_ALIGNED) + +#else /* MEMP_OVERFLOW_CHECK */ + +/* No sanity checks + * We don't need to preserve the struct memp while not allocated, so we + * can save a little space and set MEMP_SIZE to 0. + */ +#define MEMP_SIZE 0 +#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x)) + +#endif /* MEMP_OVERFLOW_CHECK */ + +/** This array holds the first free element of each pool. + * Elements form a linked list. */ +static struct memp *memp_tab[MEMP_MAX]; + +#else /* MEMP_MEM_MALLOC */ + +#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x)) + +#endif /* MEMP_MEM_MALLOC */ + +/** This array holds the element sizes of each pool. */ +#if !MEM_USE_POOLS && !MEMP_MEM_MALLOC +static +#endif +const u16_t memp_sizes[MEMP_MAX] = { +#define LWIP_MEMPOOL(name,num,size,desc) LWIP_MEM_ALIGN_SIZE(size), +#include "lwip/memp_std.h" +}; + +#if !MEMP_MEM_MALLOC /* don't build if not configured for use in lwipopts.h */ + +/** This array holds the number of elements in each pool. */ +static const u16_t memp_num[MEMP_MAX] = { +#define LWIP_MEMPOOL(name,num,size,desc) (num), +#include "lwip/memp_std.h" +}; + +/** This array holds a textual description of each pool. */ +#ifdef LWIP_DEBUG +static const char *memp_desc[MEMP_MAX] = { +#define LWIP_MEMPOOL(name,num,size,desc) (desc), +#include "lwip/memp_std.h" +}; +#endif /* LWIP_DEBUG */ + +#if MEMP_SEPARATE_POOLS + +/** This creates each memory pool. These are named memp_memory_XXX_base (where + * XXX is the name of the pool defined in memp_std.h). + * To relocate a pool, declare it as extern in cc.h. Example for GCC: + * extern u8_t __attribute__((section(".onchip_mem"))) memp_memory_UDP_PCB_base[]; + */ +#define LWIP_MEMPOOL(name,num,size,desc) u8_t memp_memory_ ## name ## _base \ + [((num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size)))]; +#include "lwip/memp_std.h" + +/** This array holds the base of each memory pool. */ +static u8_t *const memp_bases[] = { +#define LWIP_MEMPOOL(name,num,size,desc) memp_memory_ ## name ## _base, +#include "lwip/memp_std.h" +}; + +#else /* MEMP_SEPARATE_POOLS */ + +/** This is the actual memory used by the pools (all pools in one big block). */ +static u8_t memp_memory[MEM_ALIGNMENT - 1 +#define LWIP_MEMPOOL(name,num,size,desc) + ( (num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size) ) ) +#include "lwip/memp_std.h" +]; + +#endif /* MEMP_SEPARATE_POOLS */ + +#if MEMP_SANITY_CHECK +/** + * Check that memp-lists don't form a circle, using "Floyd's cycle-finding algorithm". + */ +static int +memp_sanity(void) +{ + s16_t i; + struct memp *t, *h; + + for (i = 0; i < MEMP_MAX; i++) { + t = memp_tab[i]; + if(t != NULL) { + for (h = t->next; (t != NULL) && (h != NULL); t = t->next, + h = (((h->next != NULL) && (h->next->next != NULL)) ? h->next->next : NULL)) { + if (t == h) { + return 0; + } + } + } + } + return 1; +} +#endif /* MEMP_SANITY_CHECK*/ +#if MEMP_OVERFLOW_CHECK +#if defined(LWIP_DEBUG) && MEMP_STATS +static const char * memp_overflow_names[] = { +#define LWIP_MEMPOOL(name,num,size,desc) "/"desc, +#include "lwip/memp_std.h" + }; +#endif + +/** + * Check if a memp element was victim of an overflow + * (e.g. the restricted area after it has been altered) + * + * @param p the memp element to check + * @param memp_type the pool p comes from + */ +static void +memp_overflow_check_element_overflow(struct memp *p, u16_t memp_type) +{ + u16_t k; + u8_t *m; +#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0 + m = (u8_t*)p + MEMP_SIZE + memp_sizes[memp_type]; + for (k = 0; k < MEMP_SANITY_REGION_AFTER_ALIGNED; k++) { + if (m[k] != 0xcd) { + char errstr[128] = "detected memp overflow in pool "; + char digit[] = "0"; + if(memp_type >= 10) { + digit[0] = '0' + (memp_type/10); + strcat(errstr, digit); + } + digit[0] = '0' + (memp_type%10); + strcat(errstr, digit); +#if defined(LWIP_DEBUG) && MEMP_STATS + strcat(errstr, memp_overflow_names[memp_type]); +#endif + LWIP_ASSERT(errstr, 0); + } + } +#endif +} + +/** + * Check if a memp element was victim of an underflow + * (e.g. the restricted area before it has been altered) + * + * @param p the memp element to check + * @param memp_type the pool p comes from + */ +static void +memp_overflow_check_element_underflow(struct memp *p, u16_t memp_type) +{ + u16_t k; + u8_t *m; +#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 + m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED; + for (k = 0; k < MEMP_SANITY_REGION_BEFORE_ALIGNED; k++) { + if (m[k] != 0xcd) { + char errstr[128] = "detected memp underflow in pool "; + char digit[] = "0"; + if(memp_type >= 10) { + digit[0] = '0' + (memp_type/10); + strcat(errstr, digit); + } + digit[0] = '0' + (memp_type%10); + strcat(errstr, digit); +#if defined(LWIP_DEBUG) && MEMP_STATS + strcat(errstr, memp_overflow_names[memp_type]); +#endif + LWIP_ASSERT(errstr, 0); + } + } +#endif +} + +/** + * Do an overflow check for all elements in every pool. + * + * @see memp_overflow_check_element for a description of the check + */ +static void +memp_overflow_check_all(void) +{ + u16_t i, j; + struct memp *p; + + p = (struct memp *)LWIP_MEM_ALIGN(memp_memory); + for (i = 0; i < MEMP_MAX; ++i) { + p = p; + for (j = 0; j < memp_num[i]; ++j) { + memp_overflow_check_element_overflow(p, i); + p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED); + } + } + p = (struct memp *)LWIP_MEM_ALIGN(memp_memory); + for (i = 0; i < MEMP_MAX; ++i) { + p = p; + for (j = 0; j < memp_num[i]; ++j) { + memp_overflow_check_element_underflow(p, i); + p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED); + } + } +} + +/** + * Initialize the restricted areas of all memp elements in every pool. + */ +static void +memp_overflow_init(void) +{ + u16_t i, j; + struct memp *p; + u8_t *m; + + p = (struct memp *)LWIP_MEM_ALIGN(memp_memory); + for (i = 0; i < MEMP_MAX; ++i) { + p = p; + for (j = 0; j < memp_num[i]; ++j) { +#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 + m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED; + memset(m, 0xcd, MEMP_SANITY_REGION_BEFORE_ALIGNED); +#endif +#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0 + m = (u8_t*)p + MEMP_SIZE + memp_sizes[i]; + memset(m, 0xcd, MEMP_SANITY_REGION_AFTER_ALIGNED); +#endif + p = (struct memp*)((u8_t*)p + MEMP_SIZE + memp_sizes[i] + MEMP_SANITY_REGION_AFTER_ALIGNED); + } + } +} +#endif /* MEMP_OVERFLOW_CHECK */ + +/** + * Initialize this module. + * + * Carves out memp_memory into linked lists for each pool-type. + */ +void +memp_init(void) +{ + struct memp *memp; + u16_t i, j; + + for (i = 0; i < MEMP_MAX; ++i) { + MEMP_STATS_AVAIL(used, i, 0); + MEMP_STATS_AVAIL(max, i, 0); + MEMP_STATS_AVAIL(err, i, 0); + MEMP_STATS_AVAIL(avail, i, memp_num[i]); + } + +#if !MEMP_SEPARATE_POOLS + memp = (struct memp *)LWIP_MEM_ALIGN(memp_memory); +#endif /* !MEMP_SEPARATE_POOLS */ + /* for every pool: */ + for (i = 0; i < MEMP_MAX; ++i) { + memp_tab[i] = NULL; +#if MEMP_SEPARATE_POOLS + memp = (struct memp*)memp_bases[i]; +#endif /* MEMP_SEPARATE_POOLS */ + /* create a linked list of memp elements */ + for (j = 0; j < memp_num[i]; ++j) { + memp->next = memp_tab[i]; + memp_tab[i] = memp; + memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i] +#if MEMP_OVERFLOW_CHECK + + MEMP_SANITY_REGION_AFTER_ALIGNED +#endif + ); + } + } +#if MEMP_OVERFLOW_CHECK + memp_overflow_init(); + /* check everything a first time to see if it worked */ + memp_overflow_check_all(); +#endif /* MEMP_OVERFLOW_CHECK */ +} + +/** + * Get an element from a specific pool. + * + * @param type the pool to get an element from + * + * the debug version has two more parameters: + * @param file file name calling this function + * @param line number of line where this function is called + * + * @return a pointer to the allocated memory or a NULL pointer on error + */ +void * +#if !MEMP_OVERFLOW_CHECK +memp_malloc(memp_t type) +#else +memp_malloc_fn(memp_t type, const char* file, const int line) +#endif +{ + struct memp *memp; + SYS_ARCH_DECL_PROTECT(old_level); + + LWIP_ERROR("memp_malloc: type < MEMP_MAX", (type < MEMP_MAX), return NULL;); + + SYS_ARCH_PROTECT(old_level); +#if MEMP_OVERFLOW_CHECK >= 2 + memp_overflow_check_all(); +#endif /* MEMP_OVERFLOW_CHECK >= 2 */ + + memp = memp_tab[type]; + + if (memp != NULL) { + memp_tab[type] = memp->next; +#if MEMP_OVERFLOW_CHECK + memp->next = NULL; + memp->file = file; + memp->line = line; +#endif /* MEMP_OVERFLOW_CHECK */ + MEMP_STATS_INC_USED(used, type); + LWIP_ASSERT("memp_malloc: memp properly aligned", + ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0); + memp = (struct memp*)(void *)((u8_t*)memp + MEMP_SIZE); + } else { + LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("memp_malloc: out of memory in pool %s\n", memp_desc[type])); + MEMP_STATS_INC(err, type); + } + + SYS_ARCH_UNPROTECT(old_level); + + return memp; +} + +/** + * Put an element back into its pool. + * + * @param type the pool where to put mem + * @param mem the memp element to free + */ +void +memp_free(memp_t type, void *mem) +{ + struct memp *memp; + SYS_ARCH_DECL_PROTECT(old_level); + + if (mem == NULL) { + return; + } + LWIP_ASSERT("memp_free: mem properly aligned", + ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0); + + memp = (struct memp *)(void *)((u8_t*)mem - MEMP_SIZE); + + SYS_ARCH_PROTECT(old_level); +#if MEMP_OVERFLOW_CHECK +#if MEMP_OVERFLOW_CHECK >= 2 + memp_overflow_check_all(); +#else + memp_overflow_check_element_overflow(memp, type); + memp_overflow_check_element_underflow(memp, type); +#endif /* MEMP_OVERFLOW_CHECK >= 2 */ +#endif /* MEMP_OVERFLOW_CHECK */ + + MEMP_STATS_DEC(used, type); + + memp->next = memp_tab[type]; + memp_tab[type] = memp; + +#if MEMP_SANITY_CHECK + LWIP_ASSERT("memp sanity", memp_sanity()); +#endif /* MEMP_SANITY_CHECK */ + + SYS_ARCH_UNPROTECT(old_level); +} + +#endif /* MEMP_MEM_MALLOC */ diff --git a/third_party/lwip-1.4.1/src/core/netif.c b/third_party/lwip-1.4.1/src/core/netif.c new file mode 100644 index 0000000..600910a --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/netif.c @@ -0,0 +1,774 @@ +/** + * @file + * lwIP network interface abstraction + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/def.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/tcp_impl.h" +#include "lwip/snmp.h" +#include "lwip/igmp.h" +#include "netif/etharp.h" +#include "lwip/stats.h" +#if ENABLE_LOOPBACK +#include "lwip/sys.h" +#if LWIP_NETIF_LOOPBACK_MULTITHREADING +#include "lwip/tcpip.h" +#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ +#endif /* ENABLE_LOOPBACK */ + +#if LWIP_AUTOIP +#include "lwip/autoip.h" +#endif /* LWIP_AUTOIP */ +#if LWIP_DHCP +#include "lwip/dhcp.h" +#endif /* LWIP_DHCP */ + +#if LWIP_NETIF_STATUS_CALLBACK +#define NETIF_STATUS_CALLBACK(n) do{ if (n->status_callback) { (n->status_callback)(n); }}while(0) +#else +#define NETIF_STATUS_CALLBACK(n) +#endif /* LWIP_NETIF_STATUS_CALLBACK */ + +#if LWIP_NETIF_LINK_CALLBACK +#define NETIF_LINK_CALLBACK(n) do{ if (n->link_callback) { (n->link_callback)(n); }}while(0) +#else +#define NETIF_LINK_CALLBACK(n) +#endif /* LWIP_NETIF_LINK_CALLBACK */ + +struct netif *netif_list; +struct netif *netif_default; + +static u8_t netif_num; + +#if LWIP_HAVE_LOOPIF +static struct netif loop_netif; + +/** + * Initialize a lwip network interface structure for a loopback interface + * + * @param netif the lwip network interface structure for this loopif + * @return ERR_OK if the loopif is initialized + * ERR_MEM if private data couldn't be allocated + */ +static err_t +netif_loopif_init(struct netif *netif) +{ + /* initialize the snmp variables and counters inside the struct netif + * ifSpeed: no assumption can be made! + */ + NETIF_INIT_SNMP(netif, snmp_ifType_softwareLoopback, 0); + + netif->name[0] = 'l'; + netif->name[1] = 'o'; + netif->output = netif_loop_output; + return ERR_OK; +} +#endif /* LWIP_HAVE_LOOPIF */ + +void +netif_init(void) +{ +#if LWIP_HAVE_LOOPIF + ip_addr_t loop_ipaddr, loop_netmask, loop_gw; + IP4_ADDR(&loop_gw, 127,0,0,1); + IP4_ADDR(&loop_ipaddr, 127,0,0,1); + IP4_ADDR(&loop_netmask, 255,0,0,0); + +#if NO_SYS + netif_add(&loop_netif, &loop_ipaddr, &loop_netmask, &loop_gw, NULL, netif_loopif_init, ip_input); +#else /* NO_SYS */ + netif_add(&loop_netif, &loop_ipaddr, &loop_netmask, &loop_gw, NULL, netif_loopif_init, tcpip_input); +#endif /* NO_SYS */ + netif_set_up(&loop_netif); + +#endif /* LWIP_HAVE_LOOPIF */ +} + +/** + * Add a network interface to the list of lwIP netifs. + * + * @param netif a pre-allocated netif structure + * @param ipaddr IP address for the new netif + * @param netmask network mask for the new netif + * @param gw default gateway IP address for the new netif + * @param state opaque data passed to the new netif + * @param init callback function that initializes the interface + * @param input callback function that is called to pass + * ingress packets up in the protocol layer stack. + * + * @return netif, or NULL if failed. + */ +struct netif * +netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask, + ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input) +{ + + LWIP_ASSERT("No init function given", init != NULL); + + /* reset new interface configuration state */ + ip_addr_set_zero(&netif->ip_addr); + ip_addr_set_zero(&netif->netmask); + ip_addr_set_zero(&netif->gw); + netif->flags = 0; +#if LWIP_DHCP + /* netif not under DHCP control by default */ + netif->dhcp = NULL; +#endif /* LWIP_DHCP */ +#if LWIP_AUTOIP + /* netif not under AutoIP control by default */ + netif->autoip = NULL; +#endif /* LWIP_AUTOIP */ +#if LWIP_NETIF_STATUS_CALLBACK + netif->status_callback = NULL; +#endif /* LWIP_NETIF_STATUS_CALLBACK */ +#if LWIP_NETIF_LINK_CALLBACK + netif->link_callback = NULL; +#endif /* LWIP_NETIF_LINK_CALLBACK */ +#if LWIP_IGMP + netif->igmp_mac_filter = NULL; +#endif /* LWIP_IGMP */ +#if ENABLE_LOOPBACK + netif->loop_first = NULL; + netif->loop_last = NULL; +#endif /* ENABLE_LOOPBACK */ + + /* remember netif specific state information data */ + netif->state = state; + netif->num = netif_num++; + netif->input = input; + NETIF_SET_HWADDRHINT(netif, NULL); +#if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS + netif->loop_cnt_current = 0; +#endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */ + + netif_set_addr(netif, ipaddr, netmask, gw); + + /* call user specified initialization function for netif */ + if (init(netif) != ERR_OK) { + return NULL; + } + + /* add this netif to the list */ + netif->next = netif_list; + netif_list = netif; + snmp_inc_iflist(); + +#if LWIP_IGMP + /* start IGMP processing */ + if (netif->flags & NETIF_FLAG_IGMP) { + igmp_start(netif); + } +#endif /* LWIP_IGMP */ + + LWIP_DEBUGF(NETIF_DEBUG, ("netif: added interface %c%c IP addr ", + netif->name[0], netif->name[1])); + ip_addr_debug_print(NETIF_DEBUG, ipaddr); + LWIP_DEBUGF(NETIF_DEBUG, (" netmask ")); + ip_addr_debug_print(NETIF_DEBUG, netmask); + LWIP_DEBUGF(NETIF_DEBUG, (" gw ")); + ip_addr_debug_print(NETIF_DEBUG, gw); + LWIP_DEBUGF(NETIF_DEBUG, ("\n")); + return netif; +} + +/** + * Change IP address configuration for a network interface (including netmask + * and default gateway). + * + * @param netif the network interface to change + * @param ipaddr the new IP address + * @param netmask the new netmask + * @param gw the new default gateway + */ +void +netif_set_addr(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask, + ip_addr_t *gw) +{ + netif_set_ipaddr(netif, ipaddr); + netif_set_netmask(netif, netmask); + netif_set_gw(netif, gw); +} + +/** + * Remove a network interface from the list of lwIP netifs. + * + * @param netif the network interface to remove + */ +void +netif_remove(struct netif *netif) +{ + if (netif == NULL) { + return; + } + +#if LWIP_IGMP + /* stop IGMP processing */ + if (netif->flags & NETIF_FLAG_IGMP) { + igmp_stop(netif); + } +#endif /* LWIP_IGMP */ + if (netif_is_up(netif)) { + /* set netif down before removing (call callback function) */ + netif_set_down(netif); + } + + snmp_delete_ipaddridx_tree(netif); + + /* is it the first netif? */ + if (netif_list == netif) { + netif_list = netif->next; + } else { + /* look for netif further down the list */ + struct netif * tmpNetif; + for (tmpNetif = netif_list; tmpNetif != NULL; tmpNetif = tmpNetif->next) { + if (tmpNetif->next == netif) { + tmpNetif->next = netif->next; + break; + } + } + if (tmpNetif == NULL) + return; /* we didn't find any netif today */ + } + snmp_dec_iflist(); + /* this netif is default? */ + if (netif_default == netif) { + /* reset default netif */ + netif_set_default(NULL); + } +#if LWIP_NETIF_REMOVE_CALLBACK + if (netif->remove_callback) { + netif->remove_callback(netif); + } +#endif /* LWIP_NETIF_REMOVE_CALLBACK */ + LWIP_DEBUGF( NETIF_DEBUG, ("netif_remove: removed netif\n") ); +} + +/** + * Find a network interface by searching for its name + * + * @param name the name of the netif (like netif->name) plus concatenated number + * in ascii representation (e.g. 'en0') + */ +struct netif * +netif_find(char *name) +{ + struct netif *netif; + u8_t num; + + if (name == NULL) { + return NULL; + } + + num = name[2] - '0'; + + for(netif = netif_list; netif != NULL; netif = netif->next) { + if (num == netif->num && + name[0] == netif->name[0] && + name[1] == netif->name[1]) { + LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: found %c%c\n", name[0], name[1])); + return netif; + } + } + LWIP_DEBUGF(NETIF_DEBUG, ("netif_find: didn't find %c%c\n", name[0], name[1])); + return NULL; +} + +/** + * Change the IP address of a network interface + * + * @param netif the network interface to change + * @param ipaddr the new IP address + * + * @note call netif_set_addr() if you also want to change netmask and + * default gateway + */ +void +netif_set_ipaddr(struct netif *netif, ip_addr_t *ipaddr) +{ + /* TODO: Handling of obsolete pcbs */ + /* See: http://mail.gnu.org/archive/html/lwip-users/2003-03/msg00118.html */ +#if LWIP_TCP + struct tcp_pcb *pcb; + struct tcp_pcb_listen *lpcb; + + /* address is actually being changed? */ + if (ipaddr && (ip_addr_cmp(ipaddr, &(netif->ip_addr))) == 0) { + /* extern struct tcp_pcb *tcp_active_pcbs; defined by tcp.h */ + LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: netif address being changed\n")); + pcb = tcp_active_pcbs; + while (pcb != NULL) { + /* PCB bound to current local interface address? */ + if (ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr)) +#if LWIP_AUTOIP + /* connections to link-local addresses must persist (RFC3927 ch. 1.9) */ + && !ip_addr_islinklocal(&(pcb->local_ip)) +#endif /* LWIP_AUTOIP */ + ) { + /* this connection must be aborted */ + struct tcp_pcb *next = pcb->next; + LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, ("netif_set_ipaddr: aborting TCP pcb %p\n", (void *)pcb)); + tcp_abort(pcb); + pcb = next; + } else { + pcb = pcb->next; + } + } + for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { + /* PCB bound to current local interface address? */ + if ((!(ip_addr_isany(&(lpcb->local_ip)))) && + (ip_addr_cmp(&(lpcb->local_ip), &(netif->ip_addr)))) { + /* The PCB is listening to the old ipaddr and + * is set to listen to the new one instead */ + ip_addr_set(&(lpcb->local_ip), ipaddr); + } + } + } +#endif + snmp_delete_ipaddridx_tree(netif); + snmp_delete_iprteidx_tree(0,netif); + /* set new IP address to netif */ + ip_addr_set(&(netif->ip_addr), ipaddr); + snmp_insert_ipaddridx_tree(netif); + snmp_insert_iprteidx_tree(0,netif); + + LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: IP address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + netif->name[0], netif->name[1], + ip4_addr1_16(&netif->ip_addr), + ip4_addr2_16(&netif->ip_addr), + ip4_addr3_16(&netif->ip_addr), + ip4_addr4_16(&netif->ip_addr))); +} + +/** + * Change the default gateway for a network interface + * + * @param netif the network interface to change + * @param gw the new default gateway + * + * @note call netif_set_addr() if you also want to change ip address and netmask + */ +void +netif_set_gw(struct netif *netif, ip_addr_t *gw) +{ + ip_addr_set(&(netif->gw), gw); + LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: GW address of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + netif->name[0], netif->name[1], + ip4_addr1_16(&netif->gw), + ip4_addr2_16(&netif->gw), + ip4_addr3_16(&netif->gw), + ip4_addr4_16(&netif->gw))); +} + +/** + * Change the netmask of a network interface + * + * @param netif the network interface to change + * @param netmask the new netmask + * + * @note call netif_set_addr() if you also want to change ip address and + * default gateway + */ +void +netif_set_netmask(struct netif *netif, ip_addr_t *netmask) +{ + snmp_delete_iprteidx_tree(0, netif); + /* set new netmask to netif */ + ip_addr_set(&(netif->netmask), netmask); + snmp_insert_iprteidx_tree(0, netif); + LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, ("netif: netmask of interface %c%c set to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + netif->name[0], netif->name[1], + ip4_addr1_16(&netif->netmask), + ip4_addr2_16(&netif->netmask), + ip4_addr3_16(&netif->netmask), + ip4_addr4_16(&netif->netmask))); +} + +/** + * Set a network interface as the default network interface + * (used to output all packets for which no specific route is found) + * + * @param netif the default network interface + */ +void +netif_set_default(struct netif *netif) +{ + if (netif == NULL) { + /* remove default route */ + snmp_delete_iprteidx_tree(1, netif); + } else { + /* install default route */ + snmp_insert_iprteidx_tree(1, netif); + } + netif_default = netif; + LWIP_DEBUGF(NETIF_DEBUG, ("netif: setting default interface %c%c\n", + netif ? netif->name[0] : '\'', netif ? netif->name[1] : '\'')); +} + +/** + * Bring an interface up, available for processing + * traffic. + * + * @note: Enabling DHCP on a down interface will make it come + * up once configured. + * + * @see dhcp_start() + */ +void netif_set_up(struct netif *netif) +{ + if (!(netif->flags & NETIF_FLAG_UP)) { + netif->flags |= NETIF_FLAG_UP; + +#if LWIP_SNMP + snmp_get_sysuptime(&netif->ts); +#endif /* LWIP_SNMP */ + + NETIF_STATUS_CALLBACK(netif); + + if (netif->flags & NETIF_FLAG_LINK_UP) { +#if LWIP_ARP + /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */ + if (netif->flags & (NETIF_FLAG_ETHARP)) { + etharp_gratuitous(netif); + } +#endif /* LWIP_ARP */ + +#if LWIP_IGMP + /* resend IGMP memberships */ + if (netif->flags & NETIF_FLAG_IGMP) { + igmp_report_groups( netif); + } +#endif /* LWIP_IGMP */ + } + } +} + +/** + * Bring an interface down, disabling any traffic processing. + * + * @note: Enabling DHCP on a down interface will make it come + * up once configured. + * + * @see dhcp_start() + */ +void netif_set_down(struct netif *netif) +{ + if (netif->flags & NETIF_FLAG_UP) { + netif->flags &= ~NETIF_FLAG_UP; +#if LWIP_SNMP + snmp_get_sysuptime(&netif->ts); +#endif + +#if LWIP_ARP + if (netif->flags & NETIF_FLAG_ETHARP) { + etharp_cleanup_netif(netif); + } +#endif /* LWIP_ARP */ + NETIF_STATUS_CALLBACK(netif); + } +} + +#if LWIP_NETIF_STATUS_CALLBACK +/** + * Set callback to be called when interface is brought up/down + */ +void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback) +{ + if (netif) { + netif->status_callback = status_callback; + } +} +#endif /* LWIP_NETIF_STATUS_CALLBACK */ + +#if LWIP_NETIF_REMOVE_CALLBACK +/** + * Set callback to be called when the interface has been removed + */ +void +netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback) +{ + if (netif) { + netif->remove_callback = remove_callback; + } +} +#endif /* LWIP_NETIF_REMOVE_CALLBACK */ + +/** + * Called by a driver when its link goes up + */ +void netif_set_link_up(struct netif *netif ) +{ + if (!(netif->flags & NETIF_FLAG_LINK_UP)) { + netif->flags |= NETIF_FLAG_LINK_UP; + +#if LWIP_DHCP + if (netif->dhcp) { + dhcp_network_changed(netif); + } +#endif /* LWIP_DHCP */ + +#if LWIP_AUTOIP + if (netif->autoip) { + autoip_network_changed(netif); + } +#endif /* LWIP_AUTOIP */ + + if (netif->flags & NETIF_FLAG_UP) { +#if LWIP_ARP + /* For Ethernet network interfaces, we would like to send a "gratuitous ARP" */ + if (netif->flags & NETIF_FLAG_ETHARP) { + etharp_gratuitous(netif); + } +#endif /* LWIP_ARP */ + +#if LWIP_IGMP + /* resend IGMP memberships */ + if (netif->flags & NETIF_FLAG_IGMP) { + igmp_report_groups( netif); + } +#endif /* LWIP_IGMP */ + } + NETIF_LINK_CALLBACK(netif); + } +} + +/** + * Called by a driver when its link goes down + */ +void netif_set_link_down(struct netif *netif ) +{ + if (netif->flags & NETIF_FLAG_LINK_UP) { + netif->flags &= ~NETIF_FLAG_LINK_UP; + NETIF_LINK_CALLBACK(netif); + } +} + +#if LWIP_NETIF_LINK_CALLBACK +/** + * Set callback to be called when link is brought up/down + */ +void netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback) +{ + if (netif) { + netif->link_callback = link_callback; + } +} +#endif /* LWIP_NETIF_LINK_CALLBACK */ + +#if ENABLE_LOOPBACK +/** + * Send an IP packet to be received on the same netif (loopif-like). + * The pbuf is simply copied and handed back to netif->input. + * In multithreaded mode, this is done directly since netif->input must put + * the packet on a queue. + * In callback mode, the packet is put on an internal queue and is fed to + * netif->input by netif_poll(). + * + * @param netif the lwip network interface structure + * @param p the (IP) packet to 'send' + * @param ipaddr the ip address to send the packet to (not used) + * @return ERR_OK if the packet has been sent + * ERR_MEM if the pbuf used to copy the packet couldn't be allocated + */ +err_t +netif_loop_output(struct netif *netif, struct pbuf *p, + ip_addr_t *ipaddr) +{ + struct pbuf *r; + err_t err; + struct pbuf *last; +#if LWIP_LOOPBACK_MAX_PBUFS + u8_t clen = 0; +#endif /* LWIP_LOOPBACK_MAX_PBUFS */ + /* If we have a loopif, SNMP counters are adjusted for it, + * if not they are adjusted for 'netif'. */ +#if LWIP_SNMP +#if LWIP_HAVE_LOOPIF + struct netif *stats_if = &loop_netif; +#else /* LWIP_HAVE_LOOPIF */ + struct netif *stats_if = netif; +#endif /* LWIP_HAVE_LOOPIF */ +#endif /* LWIP_SNMP */ + SYS_ARCH_DECL_PROTECT(lev); + LWIP_UNUSED_ARG(ipaddr); + + /* Allocate a new pbuf */ + r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM); + if (r == NULL) { + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.drop); + snmp_inc_ifoutdiscards(stats_if); + return ERR_MEM; + } +#if LWIP_LOOPBACK_MAX_PBUFS + clen = pbuf_clen(r); + /* check for overflow or too many pbuf on queue */ + if(((netif->loop_cnt_current + clen) < netif->loop_cnt_current) || + ((netif->loop_cnt_current + clen) > LWIP_LOOPBACK_MAX_PBUFS)) { + pbuf_free(r); + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.drop); + snmp_inc_ifoutdiscards(stats_if); + return ERR_MEM; + } + netif->loop_cnt_current += clen; +#endif /* LWIP_LOOPBACK_MAX_PBUFS */ + + /* Copy the whole pbuf queue p into the single pbuf r */ + if ((err = pbuf_copy(r, p)) != ERR_OK) { + pbuf_free(r); + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.drop); + snmp_inc_ifoutdiscards(stats_if); + return err; + } + + /* Put the packet on a linked list which gets emptied through calling + netif_poll(). */ + + /* let last point to the last pbuf in chain r */ + for (last = r; last->next != NULL; last = last->next); + + SYS_ARCH_PROTECT(lev); + if(netif->loop_first != NULL) { + LWIP_ASSERT("if first != NULL, last must also be != NULL", netif->loop_last != NULL); + netif->loop_last->next = r; + netif->loop_last = last; + } else { + netif->loop_first = r; + netif->loop_last = last; + } + SYS_ARCH_UNPROTECT(lev); + + LINK_STATS_INC(link.xmit); + snmp_add_ifoutoctets(stats_if, p->tot_len); + snmp_inc_ifoutucastpkts(stats_if); + +#if LWIP_NETIF_LOOPBACK_MULTITHREADING + /* For multithreading environment, schedule a call to netif_poll */ + tcpip_callback((tcpip_callback_fn)netif_poll, netif); +#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */ + + return ERR_OK; +} + +/** + * Call netif_poll() in the main loop of your application. This is to prevent + * reentering non-reentrant functions like tcp_input(). Packets passed to + * netif_loop_output() are put on a list that is passed to netif->input() by + * netif_poll(). + */ +void +netif_poll(struct netif *netif) +{ + struct pbuf *in; + /* If we have a loopif, SNMP counters are adjusted for it, + * if not they are adjusted for 'netif'. */ +#if LWIP_SNMP +#if LWIP_HAVE_LOOPIF + struct netif *stats_if = &loop_netif; +#else /* LWIP_HAVE_LOOPIF */ + struct netif *stats_if = netif; +#endif /* LWIP_HAVE_LOOPIF */ +#endif /* LWIP_SNMP */ + SYS_ARCH_DECL_PROTECT(lev); + + do { + /* Get a packet from the list. With SYS_LIGHTWEIGHT_PROT=1, this is protected */ + SYS_ARCH_PROTECT(lev); + in = netif->loop_first; + if (in != NULL) { + struct pbuf *in_end = in; +#if LWIP_LOOPBACK_MAX_PBUFS + u8_t clen = pbuf_clen(in); + /* adjust the number of pbufs on queue */ + LWIP_ASSERT("netif->loop_cnt_current underflow", + ((netif->loop_cnt_current - clen) < netif->loop_cnt_current)); + netif->loop_cnt_current -= clen; +#endif /* LWIP_LOOPBACK_MAX_PBUFS */ + while (in_end->len != in_end->tot_len) { + LWIP_ASSERT("bogus pbuf: len != tot_len but next == NULL!", in_end->next != NULL); + in_end = in_end->next; + } + /* 'in_end' now points to the last pbuf from 'in' */ + if (in_end == netif->loop_last) { + /* this was the last pbuf in the list */ + netif->loop_first = netif->loop_last = NULL; + } else { + /* pop the pbuf off the list */ + netif->loop_first = in_end->next; + LWIP_ASSERT("should not be null since first != last!", netif->loop_first != NULL); + } + /* De-queue the pbuf from its successors on the 'loop_' list. */ + in_end->next = NULL; + } + SYS_ARCH_UNPROTECT(lev); + + if (in != NULL) { + LINK_STATS_INC(link.recv); + snmp_add_ifinoctets(stats_if, in->tot_len); + snmp_inc_ifinucastpkts(stats_if); + /* loopback packets are always IP packets! */ + if (ip_input(in, netif) != ERR_OK) { + pbuf_free(in); + } + /* Don't reference the packet any more! */ + in = NULL; + } + /* go on while there is a packet on the list */ + } while (netif->loop_first != NULL); +} + +#if !LWIP_NETIF_LOOPBACK_MULTITHREADING +/** + * Calls netif_poll() for every netif on the netif_list. + */ +void +netif_poll_all(void) +{ + struct netif *netif = netif_list; + /* loop through netifs */ + while (netif != NULL) { + netif_poll(netif); + /* proceed to next network interface */ + netif = netif->next; + } +} +#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ +#endif /* ENABLE_LOOPBACK */ diff --git a/third_party/lwip-1.4.1/src/core/pbuf.c b/third_party/lwip-1.4.1/src/core/pbuf.c new file mode 100644 index 0000000..61146bf --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/pbuf.c @@ -0,0 +1,1179 @@ +/** + * @file + * Packet buffer management + * + * Packets are built from the pbuf data structure. It supports dynamic + * memory allocation for packet contents or can reference externally + * managed packet contents both in RAM and ROM. Quick allocation for + * incoming packets is provided through pools with fixed sized pbufs. + * + * A packet may span over multiple pbufs, chained as a singly linked + * list. This is called a "pbuf chain". + * + * Multiple packets may be queued, also using this singly linked list. + * This is called a "packet queue". + * + * So, a packet queue consists of one or more pbuf chains, each of + * which consist of one or more pbufs. CURRENTLY, PACKET QUEUES ARE + * NOT SUPPORTED!!! Use helper structs to queue multiple packets. + * + * The differences between a pbuf chain and a packet queue are very + * precise but subtle. + * + * The last pbuf of a packet has a ->tot_len field that equals the + * ->len field. It can be found by traversing the list. If the last + * pbuf of a packet has a ->next field other than NULL, more packets + * are on the queue. + * + * Therefore, looping through a pbuf of a single packet, has an + * loop end condition (tot_len == p->len), NOT (next == NULL). + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/stats.h" +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/memp.h" +#include "lwip/pbuf.h" +#include "lwip/sys.h" +#include "arch/perf.h" +#if LWIP_TCP && TCP_QUEUE_OOSEQ +#include "lwip/tcp_impl.h" +#endif +#if LWIP_CHECKSUM_ON_COPY +#include "lwip/inet_chksum.h" +#endif + +#include + +#define SIZEOF_STRUCT_PBUF LWIP_MEM_ALIGN_SIZE(sizeof(struct pbuf)) +/* Since the pool is created in memp, PBUF_POOL_BUFSIZE will be automatically + aligned there. Therefore, PBUF_POOL_BUFSIZE_ALIGNED can be used here. */ +#define PBUF_POOL_BUFSIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE) + +#if !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ +#define PBUF_POOL_IS_EMPTY() +#else /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ */ + +#if !NO_SYS +#ifndef PBUF_POOL_FREE_OOSEQ_QUEUE_CALL +#include "lwip/tcpip.h" +#define PBUF_POOL_FREE_OOSEQ_QUEUE_CALL() do { \ + if(tcpip_callback_with_block(pbuf_free_ooseq_callback, NULL, 0) != ERR_OK) { \ + SYS_ARCH_PROTECT(old_level); \ + pbuf_free_ooseq_pending = 0; \ + SYS_ARCH_UNPROTECT(old_level); \ + } } while(0) +#endif /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */ +#endif /* !NO_SYS */ + +volatile u8_t pbuf_free_ooseq_pending; +#define PBUF_POOL_IS_EMPTY() pbuf_pool_is_empty() + +/** + * Attempt to reclaim some memory from queued out-of-sequence TCP segments + * if we run out of pool pbufs. It's better to give priority to new packets + * if we're running out. + * + * This must be done in the correct thread context therefore this function + * can only be used with NO_SYS=0 and through tcpip_callback. + */ +#if !NO_SYS +static +#endif /* !NO_SYS */ +void +pbuf_free_ooseq(void) +{ + struct tcp_pcb* pcb; + SYS_ARCH_DECL_PROTECT(old_level); + + SYS_ARCH_PROTECT(old_level); + pbuf_free_ooseq_pending = 0; + SYS_ARCH_UNPROTECT(old_level); + + for (pcb = tcp_active_pcbs; NULL != pcb; pcb = pcb->next) { + if (NULL != pcb->ooseq) { + /** Free the ooseq pbufs of one PCB only */ + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free_ooseq: freeing out-of-sequence pbufs\n")); + tcp_segs_free(pcb->ooseq); + pcb->ooseq = NULL; + return; + } + } +} + +#if !NO_SYS +/** + * Just a callback function for tcpip_timeout() that calls pbuf_free_ooseq(). + */ +static void +pbuf_free_ooseq_callback(void *arg) +{ + LWIP_UNUSED_ARG(arg); + pbuf_free_ooseq(); +} +#endif /* !NO_SYS */ + +/** Queue a call to pbuf_free_ooseq if not already queued. */ +static void +pbuf_pool_is_empty(void) +{ +#ifndef PBUF_POOL_FREE_OOSEQ_QUEUE_CALL + SYS_ARCH_DECL_PROTECT(old_level); + SYS_ARCH_PROTECT(old_level); + pbuf_free_ooseq_pending = 1; + SYS_ARCH_UNPROTECT(old_level); +#else /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */ + u8_t queued; + SYS_ARCH_DECL_PROTECT(old_level); + SYS_ARCH_PROTECT(old_level); + queued = pbuf_free_ooseq_pending; + pbuf_free_ooseq_pending = 1; + SYS_ARCH_UNPROTECT(old_level); + + if(!queued) { + /* queue a call to pbuf_free_ooseq if not already queued */ + PBUF_POOL_FREE_OOSEQ_QUEUE_CALL(); + } +#endif /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */ +} +#endif /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ */ + +/** + * Allocates a pbuf of the given type (possibly a chain for PBUF_POOL type). + * + * The actual memory allocated for the pbuf is determined by the + * layer at which the pbuf is allocated and the requested size + * (from the size parameter). + * + * @param layer flag to define header size + * @param length size of the pbuf's payload + * @param type this parameter decides how and where the pbuf + * should be allocated as follows: + * + * - PBUF_RAM: buffer memory for pbuf is allocated as one large + * chunk. This includes protocol headers as well. + * - PBUF_ROM: no buffer memory is allocated for the pbuf, even for + * protocol headers. Additional headers must be prepended + * by allocating another pbuf and chain in to the front of + * the ROM pbuf. It is assumed that the memory used is really + * similar to ROM in that it is immutable and will not be + * changed. Memory which is dynamic should generally not + * be attached to PBUF_ROM pbufs. Use PBUF_REF instead. + * - PBUF_REF: no buffer memory is allocated for the pbuf, even for + * protocol headers. It is assumed that the pbuf is only + * being used in a single thread. If the pbuf gets queued, + * then pbuf_take should be called to copy the buffer. + * - PBUF_POOL: the pbuf is allocated as a pbuf chain, with pbufs from + * the pbuf pool that is allocated during pbuf_init(). + * + * @return the allocated pbuf. If multiple pbufs where allocated, this + * is the first pbuf of a pbuf chain. + */ +struct pbuf * +pbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type) +{ + struct pbuf *p, *q, *r; + u16_t offset; + s32_t rem_len; /* remaining length */ + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F")\n", length)); + + /* determine header offset */ + switch (layer) { + case PBUF_TRANSPORT: + /* add room for transport (often TCP) layer header */ + offset = PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN; + break; + case PBUF_IP: + /* add room for IP layer header */ + offset = PBUF_LINK_HLEN + PBUF_IP_HLEN; + break; + case PBUF_LINK: + /* add room for link layer header */ + offset = PBUF_LINK_HLEN; + break; + case PBUF_RAW: + offset = 0; + break; + default: + LWIP_ASSERT("pbuf_alloc: bad pbuf layer", 0); + return NULL; + } + + switch (type) { + case PBUF_POOL: + /* allocate head of pbuf chain into p */ + p = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL); + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc: allocated pbuf %p\n", (void *)p)); + if (p == NULL) { + PBUF_POOL_IS_EMPTY(); + return NULL; + } + p->type = type; + p->next = NULL; + + /* make the payload pointer point 'offset' bytes into pbuf data memory */ + p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset))); + LWIP_ASSERT("pbuf_alloc: pbuf p->payload properly aligned", + ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0); + /* the total length of the pbuf chain is the requested size */ + p->tot_len = length; + /* set the length of the first pbuf in the chain */ + p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)); + LWIP_ASSERT("check p->payload + p->len does not overflow pbuf", + ((u8_t*)p->payload + p->len <= + (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED)); + LWIP_ASSERT("PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT", + (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 ); + /* set reference count (needed here in case we fail) */ + p->ref = 1; + + /* now allocate the tail of the pbuf chain */ + + /* remember first pbuf for linkage in next iteration */ + r = p; + /* remaining length to be allocated */ + rem_len = length - p->len; + /* any remaining pbufs to be allocated? */ + while (rem_len > 0) { + q = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL); + if (q == NULL) { + PBUF_POOL_IS_EMPTY(); + /* free chain so far allocated */ + pbuf_free(p); + /* bail out unsuccesfully */ + return NULL; + } + q->type = type; + q->flags = 0; + q->next = NULL; + /* make previous pbuf point to this pbuf */ + r->next = q; + /* set total length of this pbuf and next in chain */ + LWIP_ASSERT("rem_len < max_u16_t", rem_len < 0xffff); + q->tot_len = (u16_t)rem_len; + /* this pbuf length is pool size, unless smaller sized tail */ + q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED); + q->payload = (void *)((u8_t *)q + SIZEOF_STRUCT_PBUF); + LWIP_ASSERT("pbuf_alloc: pbuf q->payload properly aligned", + ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0); + LWIP_ASSERT("check p->payload + p->len does not overflow pbuf", + ((u8_t*)p->payload + p->len <= + (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED)); + q->ref = 1; + /* calculate remaining length to be allocated */ + rem_len -= q->len; + /* remember this pbuf for linkage in next iteration */ + r = q; + } + /* end of chain */ + /*r->next = NULL;*/ + + break; + case PBUF_RAM: + /* If pbuf is to be allocated in RAM, allocate memory for it. */ + p = (struct pbuf*)mem_malloc(LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length)); + if (p == NULL) { + return NULL; + } + /* Set up internal structure of the pbuf. */ + p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset)); + p->len = p->tot_len = length; + p->next = NULL; + p->type = type; + + LWIP_ASSERT("pbuf_alloc: pbuf->payload properly aligned", + ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0); + break; + /* pbuf references existing (non-volatile static constant) ROM payload? */ + case PBUF_ROM: + /* pbuf references existing (externally allocated) RAM payload? */ + case PBUF_REF: + /* only allocate memory for the pbuf structure */ + p = (struct pbuf *)memp_malloc(MEMP_PBUF); + if (p == NULL) { + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("pbuf_alloc: Could not allocate MEMP_PBUF for PBUF_%s.\n", + (type == PBUF_ROM) ? "ROM" : "REF")); + return NULL; + } + /* caller must set this field properly, afterwards */ + p->payload = NULL; + p->len = p->tot_len = length; + p->next = NULL; + p->type = type; + break; + default: + LWIP_ASSERT("pbuf_alloc: erroneous type", 0); + return NULL; + } + /* set reference count */ + p->ref = 1; + /* set flags */ + p->flags = 0; + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloc(length=%"U16_F") == %p\n", length, (void *)p)); + return p; +} + +#if LWIP_SUPPORT_CUSTOM_PBUF +/** Initialize a custom pbuf (already allocated). + * + * @param layer flag to define header size + * @param length size of the pbuf's payload + * @param type type of the pbuf (only used to treat the pbuf accordingly, as + * this function allocates no memory) + * @param p pointer to the custom pbuf to initialize (already allocated) + * @param payload_mem pointer to the buffer that is used for payload and headers, + * must be at least big enough to hold 'length' plus the header size, + * may be NULL if set later. + * ATTENTION: The caller is responsible for correct alignment of this buffer!! + * @param payload_mem_len the size of the 'payload_mem' buffer, must be at least + * big enough to hold 'length' plus the header size + */ +struct pbuf* +pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p, + void *payload_mem, u16_t payload_mem_len) +{ + u16_t offset; + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_alloced_custom(length=%"U16_F")\n", length)); + + /* determine header offset */ + switch (l) { + case PBUF_TRANSPORT: + /* add room for transport (often TCP) layer header */ + offset = PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN; + break; + case PBUF_IP: + /* add room for IP layer header */ + offset = PBUF_LINK_HLEN + PBUF_IP_HLEN; + break; + case PBUF_LINK: + /* add room for link layer header */ + offset = PBUF_LINK_HLEN; + break; + case PBUF_RAW: + offset = 0; + break; + default: + LWIP_ASSERT("pbuf_alloced_custom: bad pbuf layer", 0); + return NULL; + } + + if (LWIP_MEM_ALIGN_SIZE(offset) + length > payload_mem_len) { + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_WARNING, ("pbuf_alloced_custom(length=%"U16_F") buffer too short\n", length)); + return NULL; + } + + p->pbuf.next = NULL; + if (payload_mem != NULL) { + p->pbuf.payload = (u8_t *)payload_mem + LWIP_MEM_ALIGN_SIZE(offset); + } else { + p->pbuf.payload = NULL; + } + p->pbuf.flags = PBUF_FLAG_IS_CUSTOM; + p->pbuf.len = p->pbuf.tot_len = length; + p->pbuf.type = type; + p->pbuf.ref = 1; + return &p->pbuf; +} +#endif /* LWIP_SUPPORT_CUSTOM_PBUF */ + +/** + * Shrink a pbuf chain to a desired length. + * + * @param p pbuf to shrink. + * @param new_len desired new length of pbuf chain + * + * Depending on the desired length, the first few pbufs in a chain might + * be skipped and left unchanged. The new last pbuf in the chain will be + * resized, and any remaining pbufs will be freed. + * + * @note If the pbuf is ROM/REF, only the ->tot_len and ->len fields are adjusted. + * @note May not be called on a packet queue. + * + * @note Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain). + */ +void +pbuf_realloc(struct pbuf *p, u16_t new_len) +{ + struct pbuf *q; + u16_t rem_len; /* remaining length */ + s32_t grow; + + LWIP_ASSERT("pbuf_realloc: p != NULL", p != NULL); + LWIP_ASSERT("pbuf_realloc: sane p->type", p->type == PBUF_POOL || + p->type == PBUF_ROM || + p->type == PBUF_RAM || + p->type == PBUF_REF); + + /* desired length larger than current length? */ + if (new_len >= p->tot_len) { + /* enlarging not yet supported */ + return; + } + + /* the pbuf chain grows by (new_len - p->tot_len) bytes + * (which may be negative in case of shrinking) */ + grow = new_len - p->tot_len; + + /* first, step over any pbufs that should remain in the chain */ + rem_len = new_len; + q = p; + /* should this pbuf be kept? */ + while (rem_len > q->len) { + /* decrease remaining length by pbuf length */ + rem_len -= q->len; + /* decrease total length indicator */ + LWIP_ASSERT("grow < max_u16_t", grow < 0xffff); + q->tot_len += (u16_t)grow; + /* proceed to next pbuf in chain */ + q = q->next; + LWIP_ASSERT("pbuf_realloc: q != NULL", q != NULL); + } + /* we have now reached the new last pbuf (in q) */ + /* rem_len == desired length for pbuf q */ + + /* shrink allocated memory for PBUF_RAM */ + /* (other types merely adjust their length fields */ + if ((q->type == PBUF_RAM) && (rem_len != q->len)) { + /* reallocate and adjust the length of the pbuf that will be split */ + q = (struct pbuf *)mem_trim(q, (u16_t)((u8_t *)q->payload - (u8_t *)q) + rem_len); + LWIP_ASSERT("mem_trim returned q == NULL", q != NULL); + } + /* adjust length fields for new last pbuf */ + q->len = rem_len; + q->tot_len = q->len; + + /* any remaining pbufs in chain? */ + if (q->next != NULL) { + /* free remaining pbufs in chain */ + pbuf_free(q->next); + } + /* q is last packet in chain */ + q->next = NULL; + +} + +/** + * Adjusts the payload pointer to hide or reveal headers in the payload. + * + * Adjusts the ->payload pointer so that space for a header + * (dis)appears in the pbuf payload. + * + * The ->payload, ->tot_len and ->len fields are adjusted. + * + * @param p pbuf to change the header size. + * @param header_size_increment Number of bytes to increment header size which + * increases the size of the pbuf. New space is on the front. + * (Using a negative value decreases the header size.) + * If hdr_size_inc is 0, this function does nothing and returns succesful. + * + * PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so + * the call will fail. A check is made that the increase in header size does + * not move the payload pointer in front of the start of the buffer. + * @return non-zero on failure, zero on success. + * + */ +u8_t +pbuf_header(struct pbuf *p, s16_t header_size_increment) +{ + u16_t type; + void *payload; + u16_t increment_magnitude; + + LWIP_ASSERT("p != NULL", p != NULL); + if ((header_size_increment == 0) || (p == NULL)) { + return 0; + } + + if (header_size_increment < 0){ + increment_magnitude = -header_size_increment; + /* Check that we aren't going to move off the end of the pbuf */ + LWIP_ERROR("increment_magnitude <= p->len", (increment_magnitude <= p->len), return 1;); + } else { + increment_magnitude = header_size_increment; +#if 0 + /* Can't assert these as some callers speculatively call + pbuf_header() to see if it's OK. Will return 1 below instead. */ + /* Check that we've got the correct type of pbuf to work with */ + LWIP_ASSERT("p->type == PBUF_RAM || p->type == PBUF_POOL", + p->type == PBUF_RAM || p->type == PBUF_POOL); + /* Check that we aren't going to move off the beginning of the pbuf */ + LWIP_ASSERT("p->payload - increment_magnitude >= p + SIZEOF_STRUCT_PBUF", + (u8_t *)p->payload - increment_magnitude >= (u8_t *)p + SIZEOF_STRUCT_PBUF); +#endif + } + + type = p->type; + /* remember current payload pointer */ + payload = p->payload; + + /* pbuf types containing payloads? */ + if (type == PBUF_RAM || type == PBUF_POOL) { + /* set new payload pointer */ + p->payload = (u8_t *)p->payload - header_size_increment; + /* boundary check fails? */ + if ((u8_t *)p->payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) { + LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("pbuf_header: failed as %p < %p (not enough space for new header size)\n", + (void *)p->payload, (void *)(p + 1))); + /* restore old payload pointer */ + p->payload = payload; + /* bail out unsuccesfully */ + return 1; + } + /* pbuf types refering to external payloads? */ + } else if (type == PBUF_REF || type == PBUF_ROM) { + /* hide a header in the payload? */ + if ((header_size_increment < 0) && (increment_magnitude <= p->len)) { + /* increase payload pointer */ + p->payload = (u8_t *)p->payload - header_size_increment; + } else { + /* cannot expand payload to front (yet!) + * bail out unsuccesfully */ + return 1; + } + } else { + /* Unknown type */ + LWIP_ASSERT("bad pbuf type", 0); + return 1; + } + /* modify pbuf length fields */ + p->len += header_size_increment; + p->tot_len += header_size_increment; + + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_header: old %p new %p (%"S16_F")\n", + (void *)payload, (void *)p->payload, header_size_increment)); + + return 0; +} + +/** + * Dereference a pbuf chain or queue and deallocate any no-longer-used + * pbufs at the head of this chain or queue. + * + * Decrements the pbuf reference count. If it reaches zero, the pbuf is + * deallocated. + * + * For a pbuf chain, this is repeated for each pbuf in the chain, + * up to the first pbuf which has a non-zero reference count after + * decrementing. So, when all reference counts are one, the whole + * chain is free'd. + * + * @param p The pbuf (chain) to be dereferenced. + * + * @return the number of pbufs that were de-allocated + * from the head of the chain. + * + * @note MUST NOT be called on a packet queue (Not verified to work yet). + * @note the reference counter of a pbuf equals the number of pointers + * that refer to the pbuf (or into the pbuf). + * + * @internal examples: + * + * Assuming existing chains a->b->c with the following reference + * counts, calling pbuf_free(a) results in: + * + * 1->2->3 becomes ...1->3 + * 3->3->3 becomes 2->3->3 + * 1->1->2 becomes ......1 + * 2->1->1 becomes 1->1->1 + * 1->1->1 becomes ....... + * + */ +u8_t +pbuf_free(struct pbuf *p) +{ + u16_t type; + struct pbuf *q; + u8_t count; + + if (p == NULL) { + LWIP_ASSERT("p != NULL", p != NULL); + /* if assertions are disabled, proceed with debug output */ + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("pbuf_free(p == NULL) was called.\n")); + return 0; + } + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free(%p)\n", (void *)p)); + + PERF_START; + + LWIP_ASSERT("pbuf_free: sane type", + p->type == PBUF_RAM || p->type == PBUF_ROM || + p->type == PBUF_REF || p->type == PBUF_POOL); + + count = 0; + /* de-allocate all consecutive pbufs from the head of the chain that + * obtain a zero reference count after decrementing*/ + while (p != NULL) { + u16_t ref; + SYS_ARCH_DECL_PROTECT(old_level); + /* Since decrementing ref cannot be guaranteed to be a single machine operation + * we must protect it. We put the new ref into a local variable to prevent + * further protection. */ + SYS_ARCH_PROTECT(old_level); + /* all pbufs in a chain are referenced at least once */ + LWIP_ASSERT("pbuf_free: p->ref > 0", p->ref > 0); + /* decrease reference count (number of pointers to pbuf) */ + ref = --(p->ref); + SYS_ARCH_UNPROTECT(old_level); + /* this pbuf is no longer referenced to? */ + if (ref == 0) { + /* remember next pbuf in chain for next iteration */ + q = p->next; + LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: deallocating %p\n", (void *)p)); + type = p->type; +#if LWIP_SUPPORT_CUSTOM_PBUF + /* is this a custom pbuf? */ + if ((p->flags & PBUF_FLAG_IS_CUSTOM) != 0) { + struct pbuf_custom *pc = (struct pbuf_custom*)p; + LWIP_ASSERT("pc->custom_free_function != NULL", pc->custom_free_function != NULL); + pc->custom_free_function(p); + } else +#endif /* LWIP_SUPPORT_CUSTOM_PBUF */ + { + /* is this a pbuf from the pool? */ + if (type == PBUF_POOL) { + memp_free(MEMP_PBUF_POOL, p); + /* is this a ROM or RAM referencing pbuf? */ + } else if (type == PBUF_ROM || type == PBUF_REF) { + memp_free(MEMP_PBUF, p); + /* type == PBUF_RAM */ + } else { + mem_free(p); + } + } + count++; + /* proceed to next pbuf */ + p = q; + /* p->ref > 0, this pbuf is still referenced to */ + /* (and so the remaining pbufs in chain as well) */ + } else { + LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_free: %p has ref %"U16_F", ending here.\n", (void *)p, ref)); + /* stop walking through the chain */ + p = NULL; + } + } + PERF_STOP("pbuf_free"); + /* return number of de-allocated pbufs */ + return count; +} + +/** + * Count number of pbufs in a chain + * + * @param p first pbuf of chain + * @return the number of pbufs in a chain + */ + +u8_t +pbuf_clen(struct pbuf *p) +{ + u8_t len; + + len = 0; + while (p != NULL) { + ++len; + p = p->next; + } + return len; +} + +/** + * Increment the reference count of the pbuf. + * + * @param p pbuf to increase reference counter of + * + */ +void +pbuf_ref(struct pbuf *p) +{ + SYS_ARCH_DECL_PROTECT(old_level); + /* pbuf given? */ + if (p != NULL) { + SYS_ARCH_PROTECT(old_level); + ++(p->ref); + SYS_ARCH_UNPROTECT(old_level); + } +} + +/** + * Concatenate two pbufs (each may be a pbuf chain) and take over + * the caller's reference of the tail pbuf. + * + * @note The caller MAY NOT reference the tail pbuf afterwards. + * Use pbuf_chain() for that purpose. + * + * @see pbuf_chain() + */ + +void +pbuf_cat(struct pbuf *h, struct pbuf *t) +{ + struct pbuf *p; + + LWIP_ERROR("(h != NULL) && (t != NULL) (programmer violates API)", + ((h != NULL) && (t != NULL)), return;); + + /* proceed to last pbuf of chain */ + for (p = h; p->next != NULL; p = p->next) { + /* add total length of second chain to all totals of first chain */ + p->tot_len += t->tot_len; + } + /* { p is last pbuf of first h chain, p->next == NULL } */ + LWIP_ASSERT("p->tot_len == p->len (of last pbuf in chain)", p->tot_len == p->len); + LWIP_ASSERT("p->next == NULL", p->next == NULL); + /* add total length of second chain to last pbuf total of first chain */ + p->tot_len += t->tot_len; + /* chain last pbuf of head (p) with first of tail (t) */ + p->next = t; + /* p->next now references t, but the caller will drop its reference to t, + * so netto there is no change to the reference count of t. + */ +} + +/** + * Chain two pbufs (or pbuf chains) together. + * + * The caller MUST call pbuf_free(t) once it has stopped + * using it. Use pbuf_cat() instead if you no longer use t. + * + * @param h head pbuf (chain) + * @param t tail pbuf (chain) + * @note The pbufs MUST belong to the same packet. + * @note MAY NOT be called on a packet queue. + * + * The ->tot_len fields of all pbufs of the head chain are adjusted. + * The ->next field of the last pbuf of the head chain is adjusted. + * The ->ref field of the first pbuf of the tail chain is adjusted. + * + */ +void +pbuf_chain(struct pbuf *h, struct pbuf *t) +{ + pbuf_cat(h, t); + /* t is now referenced by h */ + pbuf_ref(t); + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_chain: %p references %p\n", (void *)h, (void *)t)); +} + +/** + * Dechains the first pbuf from its succeeding pbufs in the chain. + * + * Makes p->tot_len field equal to p->len. + * @param p pbuf to dechain + * @return remainder of the pbuf chain, or NULL if it was de-allocated. + * @note May not be called on a packet queue. + */ +struct pbuf * +pbuf_dechain(struct pbuf *p) +{ + struct pbuf *q; + u8_t tail_gone = 1; + /* tail */ + q = p->next; + /* pbuf has successor in chain? */ + if (q != NULL) { + /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */ + LWIP_ASSERT("p->tot_len == p->len + q->tot_len", q->tot_len == p->tot_len - p->len); + /* enforce invariant if assertion is disabled */ + q->tot_len = p->tot_len - p->len; + /* decouple pbuf from remainder */ + p->next = NULL; + /* total length of pbuf p is its own length only */ + p->tot_len = p->len; + /* q is no longer referenced by p, free it */ + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_dechain: unreferencing %p\n", (void *)q)); + tail_gone = pbuf_free(q); + if (tail_gone > 0) { + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, + ("pbuf_dechain: deallocated %p (as it is no longer referenced)\n", (void *)q)); + } + /* return remaining tail or NULL if deallocated */ + } + /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */ + LWIP_ASSERT("p->tot_len == p->len", p->tot_len == p->len); + return ((tail_gone > 0) ? NULL : q); +} + +/** + * + * Create PBUF_RAM copies of pbufs. + * + * Used to queue packets on behalf of the lwIP stack, such as + * ARP based queueing. + * + * @note You MUST explicitly use p = pbuf_take(p); + * + * @note Only one packet is copied, no packet queue! + * + * @param p_to pbuf destination of the copy + * @param p_from pbuf source of the copy + * + * @return ERR_OK if pbuf was copied + * ERR_ARG if one of the pbufs is NULL or p_to is not big + * enough to hold p_from + */ +err_t +pbuf_copy(struct pbuf *p_to, struct pbuf *p_from) +{ + u16_t offset_to=0, offset_from=0, len; + + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy(%p, %p)\n", + (void*)p_to, (void*)p_from)); + + /* is the target big enough to hold the source? */ + LWIP_ERROR("pbuf_copy: target not big enough to hold source", ((p_to != NULL) && + (p_from != NULL) && (p_to->tot_len >= p_from->tot_len)), return ERR_ARG;); + + /* iterate through pbuf chain */ + do + { + /* copy one part of the original chain */ + if ((p_to->len - offset_to) >= (p_from->len - offset_from)) { + /* complete current p_from fits into current p_to */ + len = p_from->len - offset_from; + } else { + /* current p_from does not fit into current p_to */ + len = p_to->len - offset_to; + } + MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len); + offset_to += len; + offset_from += len; + LWIP_ASSERT("offset_to <= p_to->len", offset_to <= p_to->len); + LWIP_ASSERT("offset_from <= p_from->len", offset_from <= p_from->len); + if (offset_from >= p_from->len) { + /* on to next p_from (if any) */ + offset_from = 0; + p_from = p_from->next; + } + if (offset_to == p_to->len) { + /* on to next p_to (if any) */ + offset_to = 0; + p_to = p_to->next; + LWIP_ERROR("p_to != NULL", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;); + } + + if((p_from != NULL) && (p_from->len == p_from->tot_len)) { + /* don't copy more than one packet! */ + LWIP_ERROR("pbuf_copy() does not allow packet queues!\n", + (p_from->next == NULL), return ERR_VAL;); + } + if((p_to != NULL) && (p_to->len == p_to->tot_len)) { + /* don't copy more than one packet! */ + LWIP_ERROR("pbuf_copy() does not allow packet queues!\n", + (p_to->next == NULL), return ERR_VAL;); + } + } while (p_from); + LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, ("pbuf_copy: end of chain reached.\n")); + return ERR_OK; +} + +/** + * Copy (part of) the contents of a packet buffer + * to an application supplied buffer. + * + * @param buf the pbuf from which to copy data + * @param dataptr the application supplied buffer + * @param len length of data to copy (dataptr must be big enough). No more + * than buf->tot_len will be copied, irrespective of len + * @param offset offset into the packet buffer from where to begin copying len bytes + * @return the number of bytes copied, or 0 on failure + */ +u16_t +pbuf_copy_partial(struct pbuf *buf, void *dataptr, u16_t len, u16_t offset) +{ + struct pbuf *p; + u16_t left; + u16_t buf_copy_len; + u16_t copied_total = 0; + + LWIP_ERROR("pbuf_copy_partial: invalid buf", (buf != NULL), return 0;); + LWIP_ERROR("pbuf_copy_partial: invalid dataptr", (dataptr != NULL), return 0;); + + left = 0; + + if((buf == NULL) || (dataptr == NULL)) { + return 0; + } + + /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */ + for(p = buf; len != 0 && p != NULL; p = p->next) { + if ((offset != 0) && (offset >= p->len)) { + /* don't copy from this buffer -> on to the next */ + offset -= p->len; + } else { + /* copy from this buffer. maybe only partially. */ + buf_copy_len = p->len - offset; + if (buf_copy_len > len) + buf_copy_len = len; + /* copy the necessary parts of the buffer */ + MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len); + copied_total += buf_copy_len; + left += buf_copy_len; + len -= buf_copy_len; + offset = 0; + } + } + return copied_total; +} + +/** + * Copy application supplied data into a pbuf. + * This function can only be used to copy the equivalent of buf->tot_len data. + * + * @param buf pbuf to fill with data + * @param dataptr application supplied data buffer + * @param len length of the application supplied data buffer + * + * @return ERR_OK if successful, ERR_MEM if the pbuf is not big enough + */ +err_t +pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len) +{ + struct pbuf *p; + u16_t buf_copy_len; + u16_t total_copy_len = len; + u16_t copied_total = 0; + + LWIP_ERROR("pbuf_take: invalid buf", (buf != NULL), return 0;); + LWIP_ERROR("pbuf_take: invalid dataptr", (dataptr != NULL), return 0;); + + if ((buf == NULL) || (dataptr == NULL) || (buf->tot_len < len)) { + return ERR_ARG; + } + + /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */ + for(p = buf; total_copy_len != 0; p = p->next) { + LWIP_ASSERT("pbuf_take: invalid pbuf", p != NULL); + buf_copy_len = total_copy_len; + if (buf_copy_len > p->len) { + /* this pbuf cannot hold all remaining data */ + buf_copy_len = p->len; + } + /* copy the necessary parts of the buffer */ + MEMCPY(p->payload, &((char*)dataptr)[copied_total], buf_copy_len); + total_copy_len -= buf_copy_len; + copied_total += buf_copy_len; + } + LWIP_ASSERT("did not copy all data", total_copy_len == 0 && copied_total == len); + return ERR_OK; +} + +/** + * Creates a single pbuf out of a queue of pbufs. + * + * @remark: Either the source pbuf 'p' is freed by this function or the original + * pbuf 'p' is returned, therefore the caller has to check the result! + * + * @param p the source pbuf + * @param layer pbuf_layer of the new pbuf + * + * @return a new, single pbuf (p->next is NULL) + * or the old pbuf if allocation fails + */ +struct pbuf* +pbuf_coalesce(struct pbuf *p, pbuf_layer layer) +{ + struct pbuf *q; + err_t err; + if (p->next == NULL) { + return p; + } + q = pbuf_alloc(layer, p->tot_len, PBUF_RAM); + if (q == NULL) { + /* @todo: what do we do now? */ + return p; + } + err = pbuf_copy(q, p); + LWIP_ASSERT("pbuf_copy failed", err == ERR_OK); + pbuf_free(p); + return q; +} + +#if LWIP_CHECKSUM_ON_COPY +/** + * Copies data into a single pbuf (*not* into a pbuf queue!) and updates + * the checksum while copying + * + * @param p the pbuf to copy data into + * @param start_offset offset of p->payload where to copy the data to + * @param dataptr data to copy into the pbuf + * @param len length of data to copy into the pbuf + * @param chksum pointer to the checksum which is updated + * @return ERR_OK if successful, another error if the data does not fit + * within the (first) pbuf (no pbuf queues!) + */ +err_t +pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr, + u16_t len, u16_t *chksum) +{ + u32_t acc; + u16_t copy_chksum; + char *dst_ptr; + LWIP_ASSERT("p != NULL", p != NULL); + LWIP_ASSERT("dataptr != NULL", dataptr != NULL); + LWIP_ASSERT("chksum != NULL", chksum != NULL); + LWIP_ASSERT("len != 0", len != 0); + + if ((start_offset >= p->len) || (start_offset + len > p->len)) { + return ERR_ARG; + } + + dst_ptr = ((char*)p->payload) + start_offset; + copy_chksum = LWIP_CHKSUM_COPY(dst_ptr, dataptr, len); + if ((start_offset & 1) != 0) { + copy_chksum = SWAP_BYTES_IN_WORD(copy_chksum); + } + acc = *chksum; + acc += copy_chksum; + *chksum = FOLD_U32T(acc); + return ERR_OK; +} +#endif /* LWIP_CHECKSUM_ON_COPY */ + + /** Get one byte from the specified position in a pbuf + * WARNING: returns zero for offset >= p->tot_len + * + * @param p pbuf to parse + * @param offset offset into p of the byte to return + * @return byte at an offset into p OR ZERO IF 'offset' >= p->tot_len + */ +u8_t +pbuf_get_at(struct pbuf* p, u16_t offset) +{ + u16_t copy_from = offset; + struct pbuf* q = p; + + /* get the correct pbuf */ + while ((q != NULL) && (q->len <= copy_from)) { + copy_from -= q->len; + q = q->next; + } + /* return requested data if pbuf is OK */ + if ((q != NULL) && (q->len > copy_from)) { + return ((u8_t*)q->payload)[copy_from]; + } + return 0; +} + +/** Compare pbuf contents at specified offset with memory s2, both of length n + * + * @param p pbuf to compare + * @param offset offset into p at wich to start comparing + * @param s2 buffer to compare + * @param n length of buffer to compare + * @return zero if equal, nonzero otherwise + * (0xffff if p is too short, diffoffset+1 otherwise) + */ +u16_t +pbuf_memcmp(struct pbuf* p, u16_t offset, const void* s2, u16_t n) +{ + u16_t start = offset; + struct pbuf* q = p; + + /* get the correct pbuf */ + while ((q != NULL) && (q->len <= start)) { + start -= q->len; + q = q->next; + } + /* return requested data if pbuf is OK */ + if ((q != NULL) && (q->len > start)) { + u16_t i; + for(i = 0; i < n; i++) { + u8_t a = pbuf_get_at(q, start + i); + u8_t b = ((u8_t*)s2)[i]; + if (a != b) { + return i+1; + } + } + return 0; + } + return 0xffff; +} + +/** Find occurrence of mem (with length mem_len) in pbuf p, starting at offset + * start_offset. + * + * @param p pbuf to search, maximum length is 0xFFFE since 0xFFFF is used as + * return value 'not found' + * @param mem search for the contents of this buffer + * @param mem_len length of 'mem' + * @param start_offset offset into p at which to start searching + * @return 0xFFFF if substr was not found in p or the index where it was found + */ +u16_t +pbuf_memfind(struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset) +{ + u16_t i; + u16_t max = p->tot_len - mem_len; + if (p->tot_len >= mem_len + start_offset) { + for(i = start_offset; i <= max; ) { + u16_t plus = pbuf_memcmp(p, i, mem, mem_len); + if (plus == 0) { + return i; + } else { + i += plus; + } + } + } + return 0xFFFF; +} + +/** Find occurrence of substr with length substr_len in pbuf p, start at offset + * start_offset + * WARNING: in contrast to strstr(), this one does not stop at the first \0 in + * the pbuf/source string! + * + * @param p pbuf to search, maximum length is 0xFFFE since 0xFFFF is used as + * return value 'not found' + * @param substr string to search for in p, maximum length is 0xFFFE + * @return 0xFFFF if substr was not found in p or the index where it was found + */ +u16_t +pbuf_strstr(struct pbuf* p, const char* substr) +{ + size_t substr_len; + if ((substr == NULL) || (substr[0] == 0) || (p->tot_len == 0xFFFF)) { + return 0xFFFF; + } + substr_len = strlen(substr); + if (substr_len >= 0xFFFF) { + return 0xFFFF; + } + return pbuf_memfind(p, substr, (u16_t)substr_len, 0); +} diff --git a/third_party/lwip-1.4.1/src/core/raw.c b/third_party/lwip-1.4.1/src/core/raw.c new file mode 100644 index 0000000..528caab --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/raw.c @@ -0,0 +1,350 @@ +/** + * @file + * Implementation of raw protocol PCBs for low-level handling of + * different types of protocols besides (or overriding) those + * already available in lwIP. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/def.h" +#include "lwip/memp.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/raw.h" +#include "lwip/stats.h" +#include "arch/perf.h" + +#include + +/** The list of RAW PCBs */ +static struct raw_pcb *raw_pcbs; + +/** + * Determine if in incoming IP packet is covered by a RAW PCB + * and if so, pass it to a user-provided receive callback function. + * + * Given an incoming IP datagram (as a chain of pbufs) this function + * finds a corresponding RAW PCB and calls the corresponding receive + * callback function. + * + * @param p pbuf to be demultiplexed to a RAW PCB. + * @param inp network interface on which the datagram was received. + * @return - 1 if the packet has been eaten by a RAW PCB receive + * callback function. The caller MAY NOT not reference the + * packet any longer, and MAY NOT call pbuf_free(). + * @return - 0 if packet is not eaten (pbuf is still referenced by the + * caller). + * + */ +u8_t +raw_input(struct pbuf *p, struct netif *inp) +{ + struct raw_pcb *pcb, *prev; + struct ip_hdr *iphdr; + s16_t proto; + u8_t eaten = 0; + + LWIP_UNUSED_ARG(inp); + + iphdr = (struct ip_hdr *)p->payload; + proto = IPH_PROTO(iphdr); + + prev = NULL; + pcb = raw_pcbs; + /* loop through all raw pcbs until the packet is eaten by one */ + /* this allows multiple pcbs to match against the packet by design */ + while ((eaten == 0) && (pcb != NULL)) { + if ((pcb->protocol == proto) && + (ip_addr_isany(&pcb->local_ip) || + ip_addr_cmp(&(pcb->local_ip), ¤t_iphdr_dest))) { +#if IP_SOF_BROADCAST_RECV + /* broadcast filter? */ + if (ip_get_option(pcb, SOF_BROADCAST) || !ip_addr_isbroadcast(¤t_iphdr_dest, inp)) +#endif /* IP_SOF_BROADCAST_RECV */ + { + /* receive callback function available? */ + if (pcb->recv != NULL) { + /* the receive callback function did not eat the packet? */ + if (pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr()) != 0) { + /* receive function ate the packet */ + p = NULL; + eaten = 1; + if (prev != NULL) { + /* move the pcb to the front of raw_pcbs so that is + found faster next time */ + prev->next = pcb->next; + pcb->next = raw_pcbs; + raw_pcbs = pcb; + } + } + } + /* no receive callback function was set for this raw PCB */ + } + /* drop the packet */ + } + prev = pcb; + pcb = pcb->next; + } + return eaten; +} + +/** + * Bind a RAW PCB. + * + * @param pcb RAW PCB to be bound with a local address ipaddr. + * @param ipaddr local IP address to bind with. Use IP_ADDR_ANY to + * bind to all local interfaces. + * + * @return lwIP error code. + * - ERR_OK. Successful. No error occured. + * - ERR_USE. The specified IP address is already bound to by + * another RAW PCB. + * + * @see raw_disconnect() + */ +err_t +raw_bind(struct raw_pcb *pcb, ip_addr_t *ipaddr) +{ + ip_addr_set(&pcb->local_ip, ipaddr); + return ERR_OK; +} + +/** + * Connect an RAW PCB. This function is required by upper layers + * of lwip. Using the raw api you could use raw_sendto() instead + * + * This will associate the RAW PCB with the remote address. + * + * @param pcb RAW PCB to be connected with remote address ipaddr and port. + * @param ipaddr remote IP address to connect with. + * + * @return lwIP error code + * + * @see raw_disconnect() and raw_sendto() + */ +err_t +raw_connect(struct raw_pcb *pcb, ip_addr_t *ipaddr) +{ + ip_addr_set(&pcb->remote_ip, ipaddr); + return ERR_OK; +} + + +/** + * Set the callback function for received packets that match the + * raw PCB's protocol and binding. + * + * The callback function MUST either + * - eat the packet by calling pbuf_free() and returning non-zero. The + * packet will not be passed to other raw PCBs or other protocol layers. + * - not free the packet, and return zero. The packet will be matched + * against further PCBs and/or forwarded to another protocol layers. + * + * @return non-zero if the packet was free()d, zero if the packet remains + * available for others. + */ +void +raw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg) +{ + /* remember recv() callback and user data */ + pcb->recv = recv; + pcb->recv_arg = recv_arg; +} + +/** + * Send the raw IP packet to the given address. Note that actually you cannot + * modify the IP headers (this is inconsistent with the receive callback where + * you actually get the IP headers), you can only specify the IP payload here. + * It requires some more changes in lwIP. (there will be a raw_send() function + * then.) + * + * @param pcb the raw pcb which to send + * @param p the IP payload to send + * @param ipaddr the destination address of the IP packet + * + */ +err_t +raw_sendto(struct raw_pcb *pcb, struct pbuf *p, ip_addr_t *ipaddr) +{ + err_t err; + struct netif *netif; + ip_addr_t *src_ip; + struct pbuf *q; /* q will be sent down the stack */ + + LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_sendto\n")); + + /* not enough space to add an IP header to first pbuf in given p chain? */ + if (pbuf_header(p, IP_HLEN)) { + /* allocate header in new pbuf */ + q = pbuf_alloc(PBUF_IP, 0, PBUF_RAM); + /* new header pbuf could not be allocated? */ + if (q == NULL) { + LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("raw_sendto: could not allocate header\n")); + return ERR_MEM; + } + if (p->tot_len != 0) { + /* chain header q in front of given pbuf p */ + pbuf_chain(q, p); + } + /* { first pbuf q points to header pbuf } */ + LWIP_DEBUGF(RAW_DEBUG, ("raw_sendto: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p)); + } else { + /* first pbuf q equals given pbuf */ + q = p; + if(pbuf_header(q, -IP_HLEN)) { + LWIP_ASSERT("Can't restore header we just removed!", 0); + return ERR_MEM; + } + } + + if ((netif = ip_route(ipaddr)) == NULL) { + LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr))); + /* free any temporary header pbuf allocated by pbuf_header() */ + if (q != p) { + pbuf_free(q); + } + return ERR_RTE; + } + +#if IP_SOF_BROADCAST + /* broadcast filter? */ + if (!ip_get_option(pcb, SOF_BROADCAST) && ip_addr_isbroadcast(ipaddr, netif)) { + LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ("raw_sendto: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb)); + /* free any temporary header pbuf allocated by pbuf_header() */ + if (q != p) { + pbuf_free(q); + } + return ERR_VAL; + } +#endif /* IP_SOF_BROADCAST */ + + if (ip_addr_isany(&pcb->local_ip)) { + /* use outgoing network interface IP address as source address */ + src_ip = &(netif->ip_addr); + } else { + /* use RAW PCB local IP address as source address */ + src_ip = &(pcb->local_ip); + } + + NETIF_SET_HWADDRHINT(netif, &pcb->addr_hint); + err = ip_output_if (q, src_ip, ipaddr, pcb->ttl, pcb->tos, pcb->protocol, netif); + NETIF_SET_HWADDRHINT(netif, NULL); + + /* did we chain a header earlier? */ + if (q != p) { + /* free the header */ + pbuf_free(q); + } + return err; +} + +/** + * Send the raw IP packet to the address given by raw_connect() + * + * @param pcb the raw pcb which to send + * @param p the IP payload to send + * + */ +err_t +raw_send(struct raw_pcb *pcb, struct pbuf *p) +{ + return raw_sendto(pcb, p, &pcb->remote_ip); +} + +/** + * Remove an RAW PCB. + * + * @param pcb RAW PCB to be removed. The PCB is removed from the list of + * RAW PCB's and the data structure is freed from memory. + * + * @see raw_new() + */ +void +raw_remove(struct raw_pcb *pcb) +{ + struct raw_pcb *pcb2; + /* pcb to be removed is first in list? */ + if (raw_pcbs == pcb) { + /* make list start at 2nd pcb */ + raw_pcbs = raw_pcbs->next; + /* pcb not 1st in list */ + } else { + for(pcb2 = raw_pcbs; pcb2 != NULL; pcb2 = pcb2->next) { + /* find pcb in raw_pcbs list */ + if (pcb2->next != NULL && pcb2->next == pcb) { + /* remove pcb from list */ + pcb2->next = pcb->next; + } + } + } + memp_free(MEMP_RAW_PCB, pcb); +} + +/** + * Create a RAW PCB. + * + * @return The RAW PCB which was created. NULL if the PCB data structure + * could not be allocated. + * + * @param proto the protocol number of the IPs payload (e.g. IP_PROTO_ICMP) + * + * @see raw_remove() + */ +struct raw_pcb * +raw_new(u8_t proto) +{ + struct raw_pcb *pcb; + + LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, ("raw_new\n")); + + pcb = (struct raw_pcb *)memp_malloc(MEMP_RAW_PCB); + /* could allocate RAW PCB? */ + if (pcb != NULL) { + /* initialize PCB to all zeroes */ + memset(pcb, 0, sizeof(struct raw_pcb)); + pcb->protocol = proto; + pcb->ttl = RAW_TTL; + pcb->next = raw_pcbs; + raw_pcbs = pcb; + } + return pcb; +} + +#endif /* LWIP_RAW */ diff --git a/third_party/lwip-1.4.1/src/core/snmp/asn1_dec.c b/third_party/lwip-1.4.1/src/core/snmp/asn1_dec.c new file mode 100644 index 0000000..ffa536e --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/snmp/asn1_dec.c @@ -0,0 +1,657 @@ +/** + * @file + * Abstract Syntax Notation One (ISO 8824, 8825) decoding + * + * @todo not optimised (yet), favor correctness over speed, favor speed over size + */ + +/* + * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Christiaan Simons + */ + +#include "lwip/opt.h" + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/snmp_asn1.h" + +/** + * Retrieves type field from incoming pbuf chain. + * + * @param p points to a pbuf holding an ASN1 coded type field + * @param ofs points to the offset within the pbuf chain of the ASN1 coded type field + * @param type return ASN1 type + * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode + */ +err_t +snmp_asn1_dec_type(struct pbuf *p, u16_t ofs, u8_t *type) +{ + u16_t plen, base; + u8_t *msg_ptr; + + plen = 0; + while (p != NULL) + { + base = plen; + plen += p->len; + if (ofs < plen) + { + msg_ptr = (u8_t*)p->payload; + msg_ptr += ofs - base; + *type = *msg_ptr; + return ERR_OK; + } + p = p->next; + } + /* p == NULL, ofs >= plen */ + return ERR_ARG; +} + +/** + * Decodes length field from incoming pbuf chain into host length. + * + * @param p points to a pbuf holding an ASN1 coded length + * @param ofs points to the offset within the pbuf chain of the ASN1 coded length + * @param octets_used returns number of octets used by the length code + * @param length return host order length, upto 64k + * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode + */ +err_t +snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length) +{ + u16_t plen, base; + u8_t *msg_ptr; + + plen = 0; + while (p != NULL) + { + base = plen; + plen += p->len; + if (ofs < plen) + { + msg_ptr = (u8_t*)p->payload; + msg_ptr += ofs - base; + + if (*msg_ptr < 0x80) + { + /* primitive definite length format */ + *octets_used = 1; + *length = *msg_ptr; + return ERR_OK; + } + else if (*msg_ptr == 0x80) + { + /* constructed indefinite length format, termination with two zero octets */ + u8_t zeros; + u8_t i; + + *length = 0; + zeros = 0; + while (zeros != 2) + { + i = 2; + while (i > 0) + { + i--; + (*length) += 1; + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + if (*msg_ptr == 0) + { + zeros++; + if (zeros == 2) + { + /* stop while (i > 0) */ + i = 0; + } + } + else + { + zeros = 0; + } + } + } + *octets_used = 1; + return ERR_OK; + } + else if (*msg_ptr == 0x81) + { + /* constructed definite length format, one octet */ + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + *length = *msg_ptr; + *octets_used = 2; + return ERR_OK; + } + else if (*msg_ptr == 0x82) + { + u8_t i; + + /* constructed definite length format, two octets */ + i = 2; + while (i > 0) + { + i--; + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + if (i == 0) + { + /* least significant length octet */ + *length |= *msg_ptr; + } + else + { + /* most significant length octet */ + *length = (*msg_ptr) << 8; + } + } + *octets_used = 3; + return ERR_OK; + } + else + { + /* constructed definite length format 3..127 octets, this is too big (>64k) */ + /** @todo: do we need to accept inefficient codings with many leading zero's? */ + *octets_used = 1 + ((*msg_ptr) & 0x7f); + return ERR_ARG; + } + } + p = p->next; + } + + /* p == NULL, ofs >= plen */ + return ERR_ARG; +} + +/** + * Decodes positive integer (counter, gauge, timeticks) into u32_t. + * + * @param p points to a pbuf holding an ASN1 coded integer + * @param ofs points to the offset within the pbuf chain of the ASN1 coded integer + * @param len length of the coded integer field + * @param value return host order integer + * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode + * + * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded + * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value + * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!! + */ +err_t +snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value) +{ + u16_t plen, base; + u8_t *msg_ptr; + + plen = 0; + while (p != NULL) + { + base = plen; + plen += p->len; + if (ofs < plen) + { + msg_ptr = (u8_t*)p->payload; + msg_ptr += ofs - base; + if ((len > 0) && (len < 6)) + { + /* start from zero */ + *value = 0; + if (*msg_ptr & 0x80) + { + /* negative, expecting zero sign bit! */ + return ERR_ARG; + } + else + { + /* positive */ + if ((len > 1) && (*msg_ptr == 0)) + { + /* skip leading "sign byte" octet 0x00 */ + len--; + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + } + } + /* OR octets with value */ + while (len > 1) + { + len--; + *value |= *msg_ptr; + *value <<= 8; + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + } + *value |= *msg_ptr; + return ERR_OK; + } + else + { + return ERR_ARG; + } + } + p = p->next; + } + /* p == NULL, ofs >= plen */ + return ERR_ARG; +} + +/** + * Decodes integer into s32_t. + * + * @param p points to a pbuf holding an ASN1 coded integer + * @param ofs points to the offset within the pbuf chain of the ASN1 coded integer + * @param len length of the coded integer field + * @param value return host order integer + * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode + * + * @note ASN coded integers are _always_ signed! + */ +err_t +snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value) +{ + u16_t plen, base; + u8_t *msg_ptr; +#if BYTE_ORDER == LITTLE_ENDIAN + u8_t *lsb_ptr = (u8_t*)value; +#endif +#if BYTE_ORDER == BIG_ENDIAN + u8_t *lsb_ptr = (u8_t*)value + sizeof(s32_t) - 1; +#endif + u8_t sign; + + plen = 0; + while (p != NULL) + { + base = plen; + plen += p->len; + if (ofs < plen) + { + msg_ptr = (u8_t*)p->payload; + msg_ptr += ofs - base; + if ((len > 0) && (len < 5)) + { + if (*msg_ptr & 0x80) + { + /* negative, start from -1 */ + *value = -1; + sign = 1; + } + else + { + /* positive, start from 0 */ + *value = 0; + sign = 0; + } + /* OR/AND octets with value */ + while (len > 1) + { + len--; + if (sign) + { + *lsb_ptr &= *msg_ptr; + *value <<= 8; + *lsb_ptr |= 255; + } + else + { + *lsb_ptr |= *msg_ptr; + *value <<= 8; + } + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + } + if (sign) + { + *lsb_ptr &= *msg_ptr; + } + else + { + *lsb_ptr |= *msg_ptr; + } + return ERR_OK; + } + else + { + return ERR_ARG; + } + } + p = p->next; + } + /* p == NULL, ofs >= plen */ + return ERR_ARG; +} + +/** + * Decodes object identifier from incoming message into array of s32_t. + * + * @param p points to a pbuf holding an ASN1 coded object identifier + * @param ofs points to the offset within the pbuf chain of the ASN1 coded object identifier + * @param len length of the coded object identifier + * @param oid return object identifier struct + * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode + */ +err_t +snmp_asn1_dec_oid(struct pbuf *p, u16_t ofs, u16_t len, struct snmp_obj_id *oid) +{ + u16_t plen, base; + u8_t *msg_ptr; + s32_t *oid_ptr; + + plen = 0; + while (p != NULL) + { + base = plen; + plen += p->len; + if (ofs < plen) + { + msg_ptr = (u8_t*)p->payload; + msg_ptr += ofs - base; + + oid->len = 0; + oid_ptr = &oid->id[0]; + if (len > 0) + { + /* first compressed octet */ + if (*msg_ptr == 0x2B) + { + /* (most) common case 1.3 (iso.org) */ + *oid_ptr = 1; + oid_ptr++; + *oid_ptr = 3; + oid_ptr++; + } + else if (*msg_ptr < 40) + { + *oid_ptr = 0; + oid_ptr++; + *oid_ptr = *msg_ptr; + oid_ptr++; + } + else if (*msg_ptr < 80) + { + *oid_ptr = 1; + oid_ptr++; + *oid_ptr = (*msg_ptr) - 40; + oid_ptr++; + } + else + { + *oid_ptr = 2; + oid_ptr++; + *oid_ptr = (*msg_ptr) - 80; + oid_ptr++; + } + oid->len = 2; + } + else + { + /* accepting zero length identifiers e.g. for + getnext operation. uncommon but valid */ + return ERR_OK; + } + len--; + if (len > 0) + { + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + } + while ((len > 0) && (oid->len < LWIP_SNMP_OBJ_ID_LEN)) + { + /* sub-identifier uses multiple octets */ + if (*msg_ptr & 0x80) + { + s32_t sub_id = 0; + + while ((*msg_ptr & 0x80) && (len > 1)) + { + len--; + sub_id = (sub_id << 7) + (*msg_ptr & ~0x80); + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + } + if (!(*msg_ptr & 0x80) && (len > 0)) + { + /* last octet sub-identifier */ + len--; + sub_id = (sub_id << 7) + *msg_ptr; + *oid_ptr = sub_id; + } + } + else + { + /* !(*msg_ptr & 0x80) sub-identifier uses single octet */ + len--; + *oid_ptr = *msg_ptr; + } + if (len > 0) + { + /* remaining oid bytes available ... */ + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + } + oid_ptr++; + oid->len++; + } + if (len == 0) + { + /* len == 0, end of oid */ + return ERR_OK; + } + else + { + /* len > 0, oid->len == LWIP_SNMP_OBJ_ID_LEN or malformed encoding */ + return ERR_ARG; + } + + } + p = p->next; + } + /* p == NULL, ofs >= plen */ + return ERR_ARG; +} + +/** + * Decodes (copies) raw data (ip-addresses, octet strings, opaque encoding) + * from incoming message into array. + * + * @param p points to a pbuf holding an ASN1 coded raw data + * @param ofs points to the offset within the pbuf chain of the ASN1 coded raw data + * @param len length of the coded raw data (zero is valid, e.g. empty string!) + * @param raw_len length of the raw return value + * @param raw return raw bytes + * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) decode + */ +err_t +snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw) +{ + u16_t plen, base; + u8_t *msg_ptr; + + if (len > 0) + { + plen = 0; + while (p != NULL) + { + base = plen; + plen += p->len; + if (ofs < plen) + { + msg_ptr = (u8_t*)p->payload; + msg_ptr += ofs - base; + if (raw_len >= len) + { + while (len > 1) + { + /* copy len - 1 octets */ + len--; + *raw = *msg_ptr; + raw++; + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + } + /* copy last octet */ + *raw = *msg_ptr; + return ERR_OK; + } + else + { + /* raw_len < len, not enough dst space */ + return ERR_ARG; + } + } + p = p->next; + } + /* p == NULL, ofs >= plen */ + return ERR_ARG; + } + else + { + /* len == 0, empty string */ + return ERR_OK; + } +} + +#endif /* LWIP_SNMP */ diff --git a/third_party/lwip-1.4.1/src/core/snmp/asn1_enc.c b/third_party/lwip-1.4.1/src/core/snmp/asn1_enc.c new file mode 100644 index 0000000..a6169dc --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/snmp/asn1_enc.c @@ -0,0 +1,611 @@ +/** + * @file + * Abstract Syntax Notation One (ISO 8824, 8825) encoding + * + * @todo not optimised (yet), favor correctness over speed, favor speed over size + */ + +/* + * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Christiaan Simons + */ + +#include "lwip/opt.h" + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/snmp_asn1.h" + +/** + * Returns octet count for length. + * + * @param length + * @param octets_needed points to the return value + */ +void +snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed) +{ + if (length < 0x80U) + { + *octets_needed = 1; + } + else if (length < 0x100U) + { + *octets_needed = 2; + } + else + { + *octets_needed = 3; + } +} + +/** + * Returns octet count for an u32_t. + * + * @param value + * @param octets_needed points to the return value + * + * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded + * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value + * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!! + */ +void +snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed) +{ + if (value < 0x80UL) + { + *octets_needed = 1; + } + else if (value < 0x8000UL) + { + *octets_needed = 2; + } + else if (value < 0x800000UL) + { + *octets_needed = 3; + } + else if (value < 0x80000000UL) + { + *octets_needed = 4; + } + else + { + *octets_needed = 5; + } +} + +/** + * Returns octet count for an s32_t. + * + * @param value + * @param octets_needed points to the return value + * + * @note ASN coded integers are _always_ signed. + */ +void +snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed) +{ + if (value < 0) + { + value = ~value; + } + if (value < 0x80L) + { + *octets_needed = 1; + } + else if (value < 0x8000L) + { + *octets_needed = 2; + } + else if (value < 0x800000L) + { + *octets_needed = 3; + } + else + { + *octets_needed = 4; + } +} + +/** + * Returns octet count for an object identifier. + * + * @param ident_len object identifier array length + * @param ident points to object identifier array + * @param octets_needed points to the return value + */ +void +snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed) +{ + s32_t sub_id; + u8_t cnt; + + cnt = 0; + if (ident_len > 1) + { + /* compressed prefix in one octet */ + cnt++; + ident_len -= 2; + ident += 2; + } + while(ident_len > 0) + { + ident_len--; + sub_id = *ident; + + sub_id >>= 7; + cnt++; + while(sub_id > 0) + { + sub_id >>= 7; + cnt++; + } + ident++; + } + *octets_needed = cnt; +} + +/** + * Encodes ASN type field into a pbuf chained ASN1 msg. + * + * @param p points to output pbuf to encode value into + * @param ofs points to the offset within the pbuf chain + * @param type input ASN1 type + * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode + */ +err_t +snmp_asn1_enc_type(struct pbuf *p, u16_t ofs, u8_t type) +{ + u16_t plen, base; + u8_t *msg_ptr; + + plen = 0; + while (p != NULL) + { + base = plen; + plen += p->len; + if (ofs < plen) + { + msg_ptr = (u8_t*)p->payload; + msg_ptr += ofs - base; + *msg_ptr = type; + return ERR_OK; + } + p = p->next; + } + /* p == NULL, ofs >= plen */ + return ERR_ARG; +} + +/** + * Encodes host order length field into a pbuf chained ASN1 msg. + * + * @param p points to output pbuf to encode length into + * @param ofs points to the offset within the pbuf chain + * @param length is the host order length to be encoded + * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode + */ +err_t +snmp_asn1_enc_length(struct pbuf *p, u16_t ofs, u16_t length) +{ + u16_t plen, base; + u8_t *msg_ptr; + + plen = 0; + while (p != NULL) + { + base = plen; + plen += p->len; + if (ofs < plen) + { + msg_ptr = (u8_t*)p->payload; + msg_ptr += ofs - base; + + if (length < 0x80) + { + *msg_ptr = (u8_t)length; + return ERR_OK; + } + else if (length < 0x100) + { + *msg_ptr = 0x81; + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + *msg_ptr = (u8_t)length; + return ERR_OK; + } + else + { + u8_t i; + + /* length >= 0x100 && length <= 0xFFFF */ + *msg_ptr = 0x82; + i = 2; + while (i > 0) + { + i--; + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + if (i == 0) + { + /* least significant length octet */ + *msg_ptr = (u8_t)length; + } + else + { + /* most significant length octet */ + *msg_ptr = (u8_t)(length >> 8); + } + } + return ERR_OK; + } + } + p = p->next; + } + /* p == NULL, ofs >= plen */ + return ERR_ARG; +} + +/** + * Encodes u32_t (counter, gauge, timeticks) into a pbuf chained ASN1 msg. + * + * @param p points to output pbuf to encode value into + * @param ofs points to the offset within the pbuf chain + * @param octets_needed encoding length (from snmp_asn1_enc_u32t_cnt()) + * @param value is the host order u32_t value to be encoded + * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode + * + * @see snmp_asn1_enc_u32t_cnt() + */ +err_t +snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value) +{ + u16_t plen, base; + u8_t *msg_ptr; + + plen = 0; + while (p != NULL) + { + base = plen; + plen += p->len; + if (ofs < plen) + { + msg_ptr = (u8_t*)p->payload; + msg_ptr += ofs - base; + + if (octets_needed == 5) + { + /* not enough bits in 'value' add leading 0x00 */ + octets_needed--; + *msg_ptr = 0x00; + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + } + while (octets_needed > 1) + { + octets_needed--; + *msg_ptr = (u8_t)(value >> (octets_needed << 3)); + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + } + /* (only) one least significant octet */ + *msg_ptr = (u8_t)value; + return ERR_OK; + } + p = p->next; + } + /* p == NULL, ofs >= plen */ + return ERR_ARG; +} + +/** + * Encodes s32_t integer into a pbuf chained ASN1 msg. + * + * @param p points to output pbuf to encode value into + * @param ofs points to the offset within the pbuf chain + * @param octets_needed encoding length (from snmp_asn1_enc_s32t_cnt()) + * @param value is the host order s32_t value to be encoded + * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode + * + * @see snmp_asn1_enc_s32t_cnt() + */ +err_t +snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value) +{ + u16_t plen, base; + u8_t *msg_ptr; + + plen = 0; + while (p != NULL) + { + base = plen; + plen += p->len; + if (ofs < plen) + { + msg_ptr = (u8_t*)p->payload; + msg_ptr += ofs - base; + + while (octets_needed > 1) + { + octets_needed--; + *msg_ptr = (u8_t)(value >> (octets_needed << 3)); + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + } + /* (only) one least significant octet */ + *msg_ptr = (u8_t)value; + return ERR_OK; + } + p = p->next; + } + /* p == NULL, ofs >= plen */ + return ERR_ARG; +} + +/** + * Encodes object identifier into a pbuf chained ASN1 msg. + * + * @param p points to output pbuf to encode oid into + * @param ofs points to the offset within the pbuf chain + * @param ident_len object identifier array length + * @param ident points to object identifier array + * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode + */ +err_t +snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident) +{ + u16_t plen, base; + u8_t *msg_ptr; + + plen = 0; + while (p != NULL) + { + base = plen; + plen += p->len; + if (ofs < plen) + { + msg_ptr = (u8_t*)p->payload; + msg_ptr += ofs - base; + + if (ident_len > 1) + { + if ((ident[0] == 1) && (ident[1] == 3)) + { + /* compressed (most common) prefix .iso.org */ + *msg_ptr = 0x2b; + } + else + { + /* calculate prefix */ + *msg_ptr = (u8_t)((ident[0] * 40) + ident[1]); + } + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + ident_len -= 2; + ident += 2; + } + else + { +/* @bug: allow empty varbinds for symmetry (we must decode them for getnext), allow partial compression?? */ + /* ident_len <= 1, at least we need zeroDotZero (0.0) (ident_len == 2) */ + return ERR_ARG; + } + while (ident_len > 0) + { + s32_t sub_id; + u8_t shift, tail; + + ident_len--; + sub_id = *ident; + tail = 0; + shift = 28; + while(shift > 0) + { + u8_t code; + + code = (u8_t)(sub_id >> shift); + if ((code != 0) || (tail != 0)) + { + tail = 1; + *msg_ptr = code | 0x80; + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + } + shift -= 7; + } + *msg_ptr = (u8_t)sub_id & 0x7F; + if (ident_len > 0) + { + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + } + /* proceed to next sub-identifier */ + ident++; + } + return ERR_OK; + } + p = p->next; + } + /* p == NULL, ofs >= plen */ + return ERR_ARG; +} + +/** + * Encodes raw data (octet string, opaque) into a pbuf chained ASN1 msg. + * + * @param p points to output pbuf to encode raw data into + * @param ofs points to the offset within the pbuf chain + * @param raw_len raw data length + * @param raw points raw data + * @return ERR_OK if successfull, ERR_ARG if we can't (or won't) encode + */ +err_t +snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw) +{ + u16_t plen, base; + u8_t *msg_ptr; + + plen = 0; + while (p != NULL) + { + base = plen; + plen += p->len; + if (ofs < plen) + { + msg_ptr = (u8_t*)p->payload; + msg_ptr += ofs - base; + + while (raw_len > 1) + { + /* copy raw_len - 1 octets */ + raw_len--; + *msg_ptr = *raw; + raw++; + ofs += 1; + if (ofs >= plen) + { + /* next octet in next pbuf */ + p = p->next; + if (p == NULL) { return ERR_ARG; } + msg_ptr = (u8_t*)p->payload; + plen += p->len; + } + else + { + /* next octet in same pbuf */ + msg_ptr++; + } + } + if (raw_len > 0) + { + /* copy last or single octet */ + *msg_ptr = *raw; + } + return ERR_OK; + } + p = p->next; + } + /* p == NULL, ofs >= plen */ + return ERR_ARG; +} + +#endif /* LWIP_SNMP */ diff --git a/third_party/lwip-1.4.1/src/core/snmp/mib2.c b/third_party/lwip-1.4.1/src/core/snmp/mib2.c new file mode 100644 index 0000000..0c1f35b --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/snmp/mib2.c @@ -0,0 +1,4146 @@ +/** + * @file + * Management Information Base II (RFC1213) objects and functions. + * + * @note the object identifiers for this MIB-2 and private MIB tree + * must be kept in sorted ascending order. This to ensure correct getnext operation. + */ + +/* + * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Christiaan Simons + */ + +#include "lwip/opt.h" + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/snmp.h" +#include "lwip/netif.h" +#include "lwip/ip.h" +#include "lwip/ip_frag.h" +#include "lwip/mem.h" +#include "lwip/tcp_impl.h" +#include "lwip/udp.h" +#include "lwip/snmp_asn1.h" +#include "lwip/snmp_structs.h" +#include "lwip/sys.h" +#include "netif/etharp.h" + +/** + * IANA assigned enterprise ID for lwIP is 26381 + * @see http://www.iana.org/assignments/enterprise-numbers + * + * @note this enterprise ID is assigned to the lwIP project, + * all object identifiers living under this ID are assigned + * by the lwIP maintainers (contact Christiaan Simons)! + * @note don't change this define, use snmp_set_sysobjid() + * + * If you need to create your own private MIB you'll need + * to apply for your own enterprise ID with IANA: + * http://www.iana.org/numbers.html + */ +#define SNMP_ENTERPRISE_ID 26381 +#define SNMP_SYSOBJID_LEN 7 +#define SNMP_SYSOBJID {1, 3, 6, 1, 4, 1, SNMP_ENTERPRISE_ID} + +#ifndef SNMP_SYSSERVICES +#define SNMP_SYSSERVICES ((1 << 6) | (1 << 3) | ((IP_FORWARD) << 2)) +#endif + +#ifndef SNMP_GET_SYSUPTIME +#define SNMP_GET_SYSUPTIME(sysuptime) (sysuptime = (sys_now() / 10)) +#endif + +static void system_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void system_get_value(struct obj_def *od, u16_t len, void *value); +static u8_t system_set_test(struct obj_def *od, u16_t len, void *value); +static void system_set_value(struct obj_def *od, u16_t len, void *value); +static void interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void interfaces_get_value(struct obj_def *od, u16_t len, void *value); +static void ifentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void ifentry_get_value(struct obj_def *od, u16_t len, void *value); +#if !SNMP_SAFE_REQUESTS +static u8_t ifentry_set_test (struct obj_def *od, u16_t len, void *value); +static void ifentry_set_value (struct obj_def *od, u16_t len, void *value); +#endif /* SNMP_SAFE_REQUESTS */ +static void atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void atentry_get_value(struct obj_def *od, u16_t len, void *value); +static void ip_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void ip_get_value(struct obj_def *od, u16_t len, void *value); +static u8_t ip_set_test(struct obj_def *od, u16_t len, void *value); +static void ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value); +static void ip_rteentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value); +static void ip_ntomentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value); +static void icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void icmp_get_value(struct obj_def *od, u16_t len, void *value); +#if LWIP_TCP +static void tcp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void tcp_get_value(struct obj_def *od, u16_t len, void *value); +#ifdef THIS_SEEMS_UNUSED +static void tcpconnentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void tcpconnentry_get_value(struct obj_def *od, u16_t len, void *value); +#endif +#endif +static void udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void udp_get_value(struct obj_def *od, u16_t len, void *value); +static void udpentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void udpentry_get_value(struct obj_def *od, u16_t len, void *value); +static void snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +static void snmp_get_value(struct obj_def *od, u16_t len, void *value); +static u8_t snmp_set_test(struct obj_def *od, u16_t len, void *value); +static void snmp_set_value(struct obj_def *od, u16_t len, void *value); + + +/* snmp .1.3.6.1.2.1.11 */ +const mib_scalar_node snmp_scalar = { + &snmp_get_object_def, + &snmp_get_value, + &snmp_set_test, + &snmp_set_value, + MIB_NODE_SC, + 0 +}; +const s32_t snmp_ids[28] = { + 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 24, 25, 26, 27, 28, 29, 30 +}; +struct mib_node* const snmp_nodes[28] = { + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar, + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar, + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar, + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar, + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar, + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar, + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar, + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar, + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar, + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar, + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar, + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar, + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar, + (struct mib_node*)&snmp_scalar, (struct mib_node*)&snmp_scalar +}; +const struct mib_array_node snmp = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 28, + snmp_ids, + snmp_nodes +}; + +/* dot3 and EtherLike MIB not planned. (transmission .1.3.6.1.2.1.10) */ +/* historical (some say hysterical). (cmot .1.3.6.1.2.1.9) */ +/* lwIP has no EGP, thus may not implement it. (egp .1.3.6.1.2.1.8) */ + +/* udp .1.3.6.1.2.1.7 */ +/** index root node for udpTable */ +struct mib_list_rootnode udp_root = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_LR, + 0, + NULL, + NULL, + 0 +}; +const s32_t udpentry_ids[2] = { 1, 2 }; +struct mib_node* const udpentry_nodes[2] = { + (struct mib_node*)&udp_root, (struct mib_node*)&udp_root, +}; +const struct mib_array_node udpentry = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 2, + udpentry_ids, + udpentry_nodes +}; + +s32_t udptable_id = 1; +struct mib_node* udptable_node = (struct mib_node*)&udpentry; +struct mib_ram_array_node udptable = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_RA, + 0, + &udptable_id, + &udptable_node +}; + +const mib_scalar_node udp_scalar = { + &udp_get_object_def, + &udp_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_SC, + 0 +}; +const s32_t udp_ids[5] = { 1, 2, 3, 4, 5 }; +struct mib_node* const udp_nodes[5] = { + (struct mib_node*)&udp_scalar, (struct mib_node*)&udp_scalar, + (struct mib_node*)&udp_scalar, (struct mib_node*)&udp_scalar, + (struct mib_node*)&udptable +}; +const struct mib_array_node udp = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 5, + udp_ids, + udp_nodes +}; + +/* tcp .1.3.6.1.2.1.6 */ +#if LWIP_TCP +/* only if the TCP protocol is available may implement this group */ +/** index root node for tcpConnTable */ +struct mib_list_rootnode tcpconntree_root = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_LR, + 0, + NULL, + NULL, + 0 +}; +const s32_t tcpconnentry_ids[5] = { 1, 2, 3, 4, 5 }; +struct mib_node* const tcpconnentry_nodes[5] = { + (struct mib_node*)&tcpconntree_root, (struct mib_node*)&tcpconntree_root, + (struct mib_node*)&tcpconntree_root, (struct mib_node*)&tcpconntree_root, + (struct mib_node*)&tcpconntree_root +}; +const struct mib_array_node tcpconnentry = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 5, + tcpconnentry_ids, + tcpconnentry_nodes +}; + +s32_t tcpconntable_id = 1; +struct mib_node* tcpconntable_node = (struct mib_node*)&tcpconnentry; +struct mib_ram_array_node tcpconntable = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_RA, +/** @todo update maxlength when inserting / deleting from table + 0 when table is empty, 1 when more than one entry */ + 0, + &tcpconntable_id, + &tcpconntable_node +}; + +const mib_scalar_node tcp_scalar = { + &tcp_get_object_def, + &tcp_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_SC, + 0 +}; +const s32_t tcp_ids[15] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; +struct mib_node* const tcp_nodes[15] = { + (struct mib_node*)&tcp_scalar, (struct mib_node*)&tcp_scalar, + (struct mib_node*)&tcp_scalar, (struct mib_node*)&tcp_scalar, + (struct mib_node*)&tcp_scalar, (struct mib_node*)&tcp_scalar, + (struct mib_node*)&tcp_scalar, (struct mib_node*)&tcp_scalar, + (struct mib_node*)&tcp_scalar, (struct mib_node*)&tcp_scalar, + (struct mib_node*)&tcp_scalar, (struct mib_node*)&tcp_scalar, + (struct mib_node*)&tcpconntable, (struct mib_node*)&tcp_scalar, + (struct mib_node*)&tcp_scalar +}; +const struct mib_array_node tcp = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 15, + tcp_ids, + tcp_nodes +}; +#endif + +/* icmp .1.3.6.1.2.1.5 */ +const mib_scalar_node icmp_scalar = { + &icmp_get_object_def, + &icmp_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_SC, + 0 +}; +const s32_t icmp_ids[26] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26 }; +struct mib_node* const icmp_nodes[26] = { + (struct mib_node*)&icmp_scalar, (struct mib_node*)&icmp_scalar, + (struct mib_node*)&icmp_scalar, (struct mib_node*)&icmp_scalar, + (struct mib_node*)&icmp_scalar, (struct mib_node*)&icmp_scalar, + (struct mib_node*)&icmp_scalar, (struct mib_node*)&icmp_scalar, + (struct mib_node*)&icmp_scalar, (struct mib_node*)&icmp_scalar, + (struct mib_node*)&icmp_scalar, (struct mib_node*)&icmp_scalar, + (struct mib_node*)&icmp_scalar, (struct mib_node*)&icmp_scalar, + (struct mib_node*)&icmp_scalar, (struct mib_node*)&icmp_scalar, + (struct mib_node*)&icmp_scalar, (struct mib_node*)&icmp_scalar, + (struct mib_node*)&icmp_scalar, (struct mib_node*)&icmp_scalar, + (struct mib_node*)&icmp_scalar, (struct mib_node*)&icmp_scalar, + (struct mib_node*)&icmp_scalar, (struct mib_node*)&icmp_scalar, + (struct mib_node*)&icmp_scalar, (struct mib_node*)&icmp_scalar +}; +const struct mib_array_node icmp = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 26, + icmp_ids, + icmp_nodes +}; + +/** index root node for ipNetToMediaTable */ +struct mib_list_rootnode ipntomtree_root = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_LR, + 0, + NULL, + NULL, + 0 +}; +const s32_t ipntomentry_ids[4] = { 1, 2, 3, 4 }; +struct mib_node* const ipntomentry_nodes[4] = { + (struct mib_node*)&ipntomtree_root, (struct mib_node*)&ipntomtree_root, + (struct mib_node*)&ipntomtree_root, (struct mib_node*)&ipntomtree_root +}; +const struct mib_array_node ipntomentry = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 4, + ipntomentry_ids, + ipntomentry_nodes +}; + +s32_t ipntomtable_id = 1; +struct mib_node* ipntomtable_node = (struct mib_node*)&ipntomentry; +struct mib_ram_array_node ipntomtable = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_RA, + 0, + &ipntomtable_id, + &ipntomtable_node +}; + +/** index root node for ipRouteTable */ +struct mib_list_rootnode iprtetree_root = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_LR, + 0, + NULL, + NULL, + 0 +}; +const s32_t iprteentry_ids[13] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }; +struct mib_node* const iprteentry_nodes[13] = { + (struct mib_node*)&iprtetree_root, (struct mib_node*)&iprtetree_root, + (struct mib_node*)&iprtetree_root, (struct mib_node*)&iprtetree_root, + (struct mib_node*)&iprtetree_root, (struct mib_node*)&iprtetree_root, + (struct mib_node*)&iprtetree_root, (struct mib_node*)&iprtetree_root, + (struct mib_node*)&iprtetree_root, (struct mib_node*)&iprtetree_root, + (struct mib_node*)&iprtetree_root, (struct mib_node*)&iprtetree_root, + (struct mib_node*)&iprtetree_root +}; +const struct mib_array_node iprteentry = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 13, + iprteentry_ids, + iprteentry_nodes +}; + +s32_t iprtetable_id = 1; +struct mib_node* iprtetable_node = (struct mib_node*)&iprteentry; +struct mib_ram_array_node iprtetable = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_RA, + 0, + &iprtetable_id, + &iprtetable_node +}; + +/** index root node for ipAddrTable */ +struct mib_list_rootnode ipaddrtree_root = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_LR, + 0, + NULL, + NULL, + 0 +}; +const s32_t ipaddrentry_ids[5] = { 1, 2, 3, 4, 5 }; +struct mib_node* const ipaddrentry_nodes[5] = { + (struct mib_node*)&ipaddrtree_root, + (struct mib_node*)&ipaddrtree_root, + (struct mib_node*)&ipaddrtree_root, + (struct mib_node*)&ipaddrtree_root, + (struct mib_node*)&ipaddrtree_root +}; +const struct mib_array_node ipaddrentry = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 5, + ipaddrentry_ids, + ipaddrentry_nodes +}; + +s32_t ipaddrtable_id = 1; +struct mib_node* ipaddrtable_node = (struct mib_node*)&ipaddrentry; +struct mib_ram_array_node ipaddrtable = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_RA, + 0, + &ipaddrtable_id, + &ipaddrtable_node +}; + +/* ip .1.3.6.1.2.1.4 */ +const mib_scalar_node ip_scalar = { + &ip_get_object_def, + &ip_get_value, + &ip_set_test, + &noleafs_set_value, + MIB_NODE_SC, + 0 +}; +const s32_t ip_ids[23] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }; +struct mib_node* const ip_nodes[23] = { + (struct mib_node*)&ip_scalar, (struct mib_node*)&ip_scalar, + (struct mib_node*)&ip_scalar, (struct mib_node*)&ip_scalar, + (struct mib_node*)&ip_scalar, (struct mib_node*)&ip_scalar, + (struct mib_node*)&ip_scalar, (struct mib_node*)&ip_scalar, + (struct mib_node*)&ip_scalar, (struct mib_node*)&ip_scalar, + (struct mib_node*)&ip_scalar, (struct mib_node*)&ip_scalar, + (struct mib_node*)&ip_scalar, (struct mib_node*)&ip_scalar, + (struct mib_node*)&ip_scalar, (struct mib_node*)&ip_scalar, + (struct mib_node*)&ip_scalar, (struct mib_node*)&ip_scalar, + (struct mib_node*)&ip_scalar, (struct mib_node*)&ipaddrtable, + (struct mib_node*)&iprtetable, (struct mib_node*)&ipntomtable, + (struct mib_node*)&ip_scalar +}; +const struct mib_array_node mib2_ip = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 23, + ip_ids, + ip_nodes +}; + +/** index root node for atTable */ +struct mib_list_rootnode arptree_root = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_LR, + 0, + NULL, + NULL, + 0 +}; +const s32_t atentry_ids[3] = { 1, 2, 3 }; +struct mib_node* const atentry_nodes[3] = { + (struct mib_node*)&arptree_root, + (struct mib_node*)&arptree_root, + (struct mib_node*)&arptree_root +}; +const struct mib_array_node atentry = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 3, + atentry_ids, + atentry_nodes +}; + +const s32_t attable_id = 1; +struct mib_node* const attable_node = (struct mib_node*)&atentry; +const struct mib_array_node attable = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 1, + &attable_id, + &attable_node +}; + +/* at .1.3.6.1.2.1.3 */ +s32_t at_id = 1; +struct mib_node* mib2_at_node = (struct mib_node*)&attable; +struct mib_ram_array_node at = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_RA, + 0, + &at_id, + &mib2_at_node +}; + +/** index root node for ifTable */ +struct mib_list_rootnode iflist_root = { + &ifentry_get_object_def, + &ifentry_get_value, +#if SNMP_SAFE_REQUESTS + &noleafs_set_test, + &noleafs_set_value, +#else /* SNMP_SAFE_REQUESTS */ + &ifentry_set_test, + &ifentry_set_value, +#endif /* SNMP_SAFE_REQUESTS */ + MIB_NODE_LR, + 0, + NULL, + NULL, + 0 +}; +const s32_t ifentry_ids[22] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22 }; +struct mib_node* const ifentry_nodes[22] = { + (struct mib_node*)&iflist_root, (struct mib_node*)&iflist_root, + (struct mib_node*)&iflist_root, (struct mib_node*)&iflist_root, + (struct mib_node*)&iflist_root, (struct mib_node*)&iflist_root, + (struct mib_node*)&iflist_root, (struct mib_node*)&iflist_root, + (struct mib_node*)&iflist_root, (struct mib_node*)&iflist_root, + (struct mib_node*)&iflist_root, (struct mib_node*)&iflist_root, + (struct mib_node*)&iflist_root, (struct mib_node*)&iflist_root, + (struct mib_node*)&iflist_root, (struct mib_node*)&iflist_root, + (struct mib_node*)&iflist_root, (struct mib_node*)&iflist_root, + (struct mib_node*)&iflist_root, (struct mib_node*)&iflist_root, + (struct mib_node*)&iflist_root, (struct mib_node*)&iflist_root +}; +const struct mib_array_node ifentry = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 22, + ifentry_ids, + ifentry_nodes +}; + +s32_t iftable_id = 1; +struct mib_node* iftable_node = (struct mib_node*)&ifentry; +struct mib_ram_array_node iftable = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_RA, + 0, + &iftable_id, + &iftable_node +}; + +/* interfaces .1.3.6.1.2.1.2 */ +const mib_scalar_node interfaces_scalar = { + &interfaces_get_object_def, + &interfaces_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_SC, + 0 +}; +const s32_t interfaces_ids[2] = { 1, 2 }; +struct mib_node* const interfaces_nodes[2] = { + (struct mib_node*)&interfaces_scalar, (struct mib_node*)&iftable +}; +const struct mib_array_node interfaces = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 2, + interfaces_ids, + interfaces_nodes +}; + + +/* 0 1 2 3 4 5 6 */ +/* system .1.3.6.1.2.1.1 */ +const mib_scalar_node sys_tem_scalar = { + &system_get_object_def, + &system_get_value, + &system_set_test, + &system_set_value, + MIB_NODE_SC, + 0 +}; +const s32_t sys_tem_ids[7] = { 1, 2, 3, 4, 5, 6, 7 }; +struct mib_node* const sys_tem_nodes[7] = { + (struct mib_node*)&sys_tem_scalar, (struct mib_node*)&sys_tem_scalar, + (struct mib_node*)&sys_tem_scalar, (struct mib_node*)&sys_tem_scalar, + (struct mib_node*)&sys_tem_scalar, (struct mib_node*)&sys_tem_scalar, + (struct mib_node*)&sys_tem_scalar +}; +/* work around name issue with 'sys_tem', some compiler(s?) seem to reserve 'system' */ +const struct mib_array_node sys_tem = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 7, + sys_tem_ids, + sys_tem_nodes +}; + +/* mib-2 .1.3.6.1.2.1 */ +#if LWIP_TCP +#define MIB2_GROUPS 8 +#else +#define MIB2_GROUPS 7 +#endif +const s32_t mib2_ids[MIB2_GROUPS] = +{ + 1, + 2, + 3, + 4, + 5, +#if LWIP_TCP + 6, +#endif + 7, + 11 +}; +struct mib_node* const mib2_nodes[MIB2_GROUPS] = { + (struct mib_node*)&sys_tem, + (struct mib_node*)&interfaces, + (struct mib_node*)&at, + (struct mib_node*)&mib2_ip, + (struct mib_node*)&icmp, +#if LWIP_TCP + (struct mib_node*)&tcp, +#endif + (struct mib_node*)&udp, + (struct mib_node*)&snmp +}; + +const struct mib_array_node mib2 = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + MIB2_GROUPS, + mib2_ids, + mib2_nodes +}; + +/* mgmt .1.3.6.1.2 */ +const s32_t mgmt_ids[1] = { 1 }; +struct mib_node* const mgmt_nodes[1] = { (struct mib_node*)&mib2 }; +const struct mib_array_node mgmt = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 1, + mgmt_ids, + mgmt_nodes +}; + +/* internet .1.3.6.1 */ +#if SNMP_PRIVATE_MIB +/* When using a private MIB, you have to create a file 'private_mib.h' that contains + * a 'struct mib_array_node mib_private' which contains your MIB. */ +s32_t internet_ids[2] = { 2, 4 }; +struct mib_node* const internet_nodes[2] = { (struct mib_node*)&mgmt, (struct mib_node*)&mib_private }; +const struct mib_array_node internet = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 2, + internet_ids, + internet_nodes +}; +#else +const s32_t internet_ids[1] = { 2 }; +struct mib_node* const internet_nodes[1] = { (struct mib_node*)&mgmt }; +const struct mib_array_node internet = { + &noleafs_get_object_def, + &noleafs_get_value, + &noleafs_set_test, + &noleafs_set_value, + MIB_NODE_AR, + 1, + internet_ids, + internet_nodes +}; +#endif + +/** mib-2.system.sysObjectID */ +static struct snmp_obj_id sysobjid = {SNMP_SYSOBJID_LEN, SNMP_SYSOBJID}; +/** enterprise ID for generic TRAPs, .iso.org.dod.internet.mgmt.mib-2.snmp */ +static struct snmp_obj_id snmpgrp_id = {7,{1,3,6,1,2,1,11}}; +/** mib-2.system.sysServices */ +static const s32_t sysservices = SNMP_SYSSERVICES; + +/** mib-2.system.sysDescr */ +static const u8_t sysdescr_len_default = 4; +static const u8_t sysdescr_default[] = "lwIP"; +static u8_t* sysdescr_len_ptr = (u8_t*)&sysdescr_len_default; +static u8_t* sysdescr_ptr = (u8_t*)&sysdescr_default[0]; +/** mib-2.system.sysContact */ +static const u8_t syscontact_len_default = 0; +static const u8_t syscontact_default[] = ""; +static u8_t* syscontact_len_ptr = (u8_t*)&syscontact_len_default; +static u8_t* syscontact_ptr = (u8_t*)&syscontact_default[0]; +/** mib-2.system.sysName */ +static const u8_t sysname_len_default = 8; +static const u8_t sysname_default[] = "FQDN-unk"; +static u8_t* sysname_len_ptr = (u8_t*)&sysname_len_default; +static u8_t* sysname_ptr = (u8_t*)&sysname_default[0]; +/** mib-2.system.sysLocation */ +static const u8_t syslocation_len_default = 0; +static const u8_t syslocation_default[] = ""; +static u8_t* syslocation_len_ptr = (u8_t*)&syslocation_len_default; +static u8_t* syslocation_ptr = (u8_t*)&syslocation_default[0]; +/** mib-2.snmp.snmpEnableAuthenTraps */ +static const u8_t snmpenableauthentraps_default = 2; /* disabled */ +static u8_t* snmpenableauthentraps_ptr = (u8_t*)&snmpenableauthentraps_default; + +/** mib-2.interfaces.ifTable.ifEntry.ifSpecific (zeroDotZero) */ +static const struct snmp_obj_id ifspecific = {2, {0, 0}}; +/** mib-2.ip.ipRouteTable.ipRouteEntry.ipRouteInfo (zeroDotZero) */ +static const struct snmp_obj_id iprouteinfo = {2, {0, 0}}; + + + +/* mib-2.system counter(s) */ +static u32_t sysuptime = 0; + +/* mib-2.ip counter(s) */ +static u32_t ipinreceives = 0, + ipinhdrerrors = 0, + ipinaddrerrors = 0, + ipforwdatagrams = 0, + ipinunknownprotos = 0, + ipindiscards = 0, + ipindelivers = 0, + ipoutrequests = 0, + ipoutdiscards = 0, + ipoutnoroutes = 0, + ipreasmreqds = 0, + ipreasmoks = 0, + ipreasmfails = 0, + ipfragoks = 0, + ipfragfails = 0, + ipfragcreates = 0, + iproutingdiscards = 0; +/* mib-2.icmp counter(s) */ +static u32_t icmpinmsgs = 0, + icmpinerrors = 0, + icmpindestunreachs = 0, + icmpintimeexcds = 0, + icmpinparmprobs = 0, + icmpinsrcquenchs = 0, + icmpinredirects = 0, + icmpinechos = 0, + icmpinechoreps = 0, + icmpintimestamps = 0, + icmpintimestampreps = 0, + icmpinaddrmasks = 0, + icmpinaddrmaskreps = 0, + icmpoutmsgs = 0, + icmpouterrors = 0, + icmpoutdestunreachs = 0, + icmpouttimeexcds = 0, + icmpoutparmprobs = 0, + icmpoutsrcquenchs = 0, + icmpoutredirects = 0, + icmpoutechos = 0, + icmpoutechoreps = 0, + icmpouttimestamps = 0, + icmpouttimestampreps = 0, + icmpoutaddrmasks = 0, + icmpoutaddrmaskreps = 0; +/* mib-2.tcp counter(s) */ +static u32_t tcpactiveopens = 0, + tcppassiveopens = 0, + tcpattemptfails = 0, + tcpestabresets = 0, + tcpinsegs = 0, + tcpoutsegs = 0, + tcpretranssegs = 0, + tcpinerrs = 0, + tcpoutrsts = 0; +/* mib-2.udp counter(s) */ +static u32_t udpindatagrams = 0, + udpnoports = 0, + udpinerrors = 0, + udpoutdatagrams = 0; +/* mib-2.snmp counter(s) */ +static u32_t snmpinpkts = 0, + snmpoutpkts = 0, + snmpinbadversions = 0, + snmpinbadcommunitynames = 0, + snmpinbadcommunityuses = 0, + snmpinasnparseerrs = 0, + snmpintoobigs = 0, + snmpinnosuchnames = 0, + snmpinbadvalues = 0, + snmpinreadonlys = 0, + snmpingenerrs = 0, + snmpintotalreqvars = 0, + snmpintotalsetvars = 0, + snmpingetrequests = 0, + snmpingetnexts = 0, + snmpinsetrequests = 0, + snmpingetresponses = 0, + snmpintraps = 0, + snmpouttoobigs = 0, + snmpoutnosuchnames = 0, + snmpoutbadvalues = 0, + snmpoutgenerrs = 0, + snmpoutgetrequests = 0, + snmpoutgetnexts = 0, + snmpoutsetrequests = 0, + snmpoutgetresponses = 0, + snmpouttraps = 0; + + + +/* prototypes of the following functions are in lwip/src/include/lwip/snmp.h */ +/** + * Copy octet string. + * + * @param dst points to destination + * @param src points to source + * @param n number of octets to copy. + */ +static void ocstrncpy(u8_t *dst, u8_t *src, u16_t n) +{ + u16_t i = n; + while (i > 0) { + i--; + *dst++ = *src++; + } +} + +/** + * Copy object identifier (s32_t) array. + * + * @param dst points to destination + * @param src points to source + * @param n number of sub identifiers to copy. + */ +void objectidncpy(s32_t *dst, s32_t *src, u8_t n) +{ + u8_t i = n; + while(i > 0) { + i--; + *dst++ = *src++; + } +} + +/** + * Initializes sysDescr pointers. + * + * @param str if non-NULL then copy str pointer + * @param len points to string length, excluding zero terminator + */ +void snmp_set_sysdesr(u8_t *str, u8_t *len) +{ + if (str != NULL) + { + sysdescr_ptr = str; + sysdescr_len_ptr = len; + } +} + +void snmp_get_sysobjid_ptr(struct snmp_obj_id **oid) +{ + *oid = &sysobjid; +} + +/** + * Initializes sysObjectID value. + * + * @param oid points to stuct snmp_obj_id to copy + */ +void snmp_set_sysobjid(struct snmp_obj_id *oid) +{ + sysobjid = *oid; +} + +/** + * Must be called at regular 10 msec interval from a timer interrupt + * or signal handler depending on your runtime environment. + */ +void snmp_inc_sysuptime(void) +{ + sysuptime++; +} + +void snmp_add_sysuptime(u32_t value) +{ + sysuptime+=value; +} + +void snmp_get_sysuptime(u32_t *value) +{ + SNMP_GET_SYSUPTIME(sysuptime); + *value = sysuptime; +} + +/** + * Initializes sysContact pointers, + * e.g. ptrs to non-volatile memory external to lwIP. + * + * @param ocstr if non-NULL then copy str pointer + * @param ocstrlen points to string length, excluding zero terminator + */ +void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen) +{ + if (ocstr != NULL) + { + syscontact_ptr = ocstr; + syscontact_len_ptr = ocstrlen; + } +} + +/** + * Initializes sysName pointers, + * e.g. ptrs to non-volatile memory external to lwIP. + * + * @param ocstr if non-NULL then copy str pointer + * @param ocstrlen points to string length, excluding zero terminator + */ +void snmp_set_sysname(u8_t *ocstr, u8_t *ocstrlen) +{ + if (ocstr != NULL) + { + sysname_ptr = ocstr; + sysname_len_ptr = ocstrlen; + } +} + +/** + * Initializes sysLocation pointers, + * e.g. ptrs to non-volatile memory external to lwIP. + * + * @param ocstr if non-NULL then copy str pointer + * @param ocstrlen points to string length, excluding zero terminator + */ +void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen) +{ + if (ocstr != NULL) + { + syslocation_ptr = ocstr; + syslocation_len_ptr = ocstrlen; + } +} + + +void snmp_add_ifinoctets(struct netif *ni, u32_t value) +{ + ni->ifinoctets += value; +} + +void snmp_inc_ifinucastpkts(struct netif *ni) +{ + (ni->ifinucastpkts)++; +} + +void snmp_inc_ifinnucastpkts(struct netif *ni) +{ + (ni->ifinnucastpkts)++; +} + +void snmp_inc_ifindiscards(struct netif *ni) +{ + (ni->ifindiscards)++; +} + +void snmp_add_ifoutoctets(struct netif *ni, u32_t value) +{ + ni->ifoutoctets += value; +} + +void snmp_inc_ifoutucastpkts(struct netif *ni) +{ + (ni->ifoutucastpkts)++; +} + +void snmp_inc_ifoutnucastpkts(struct netif *ni) +{ + (ni->ifoutnucastpkts)++; +} + +void snmp_inc_ifoutdiscards(struct netif *ni) +{ + (ni->ifoutdiscards)++; +} + +void snmp_inc_iflist(void) +{ + struct mib_list_node *if_node = NULL; + + snmp_mib_node_insert(&iflist_root, iflist_root.count + 1, &if_node); + /* enable getnext traversal on filled table */ + iftable.maxlength = 1; +} + +void snmp_dec_iflist(void) +{ + snmp_mib_node_delete(&iflist_root, iflist_root.tail); + /* disable getnext traversal on empty table */ + if(iflist_root.count == 0) iftable.maxlength = 0; +} + +/** + * Inserts ARP table indexes (.xIfIndex.xNetAddress) + * into arp table index trees (both atTable and ipNetToMediaTable). + */ +void snmp_insert_arpidx_tree(struct netif *ni, ip_addr_t *ip) +{ + struct mib_list_rootnode *at_rn; + struct mib_list_node *at_node; + s32_t arpidx[5]; + u8_t level, tree; + + LWIP_ASSERT("ni != NULL", ni != NULL); + snmp_netiftoifindex(ni, &arpidx[0]); + snmp_iptooid(ip, &arpidx[1]); + + for (tree = 0; tree < 2; tree++) + { + if (tree == 0) + { + at_rn = &arptree_root; + } + else + { + at_rn = &ipntomtree_root; + } + for (level = 0; level < 5; level++) + { + at_node = NULL; + snmp_mib_node_insert(at_rn, arpidx[level], &at_node); + if ((level != 4) && (at_node != NULL)) + { + if (at_node->nptr == NULL) + { + at_rn = snmp_mib_lrn_alloc(); + at_node->nptr = (struct mib_node*)at_rn; + if (at_rn != NULL) + { + if (level == 3) + { + if (tree == 0) + { + at_rn->get_object_def = atentry_get_object_def; + at_rn->get_value = atentry_get_value; + } + else + { + at_rn->get_object_def = ip_ntomentry_get_object_def; + at_rn->get_value = ip_ntomentry_get_value; + } + at_rn->set_test = noleafs_set_test; + at_rn->set_value = noleafs_set_value; + } + } + else + { + /* at_rn == NULL, malloc failure */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_arpidx_tree() insert failed, mem full")); + break; + } + } + else + { + at_rn = (struct mib_list_rootnode*)at_node->nptr; + } + } + } + } + /* enable getnext traversal on filled tables */ + at.maxlength = 1; + ipntomtable.maxlength = 1; +} + +/** + * Removes ARP table indexes (.xIfIndex.xNetAddress) + * from arp table index trees. + */ +void snmp_delete_arpidx_tree(struct netif *ni, ip_addr_t *ip) +{ + struct mib_list_rootnode *at_rn, *next, *del_rn[5]; + struct mib_list_node *at_n, *del_n[5]; + s32_t arpidx[5]; + u8_t fc, tree, level, del_cnt; + + snmp_netiftoifindex(ni, &arpidx[0]); + snmp_iptooid(ip, &arpidx[1]); + + for (tree = 0; tree < 2; tree++) + { + /* mark nodes for deletion */ + if (tree == 0) + { + at_rn = &arptree_root; + } + else + { + at_rn = &ipntomtree_root; + } + level = 0; + del_cnt = 0; + while ((level < 5) && (at_rn != NULL)) + { + fc = snmp_mib_node_find(at_rn, arpidx[level], &at_n); + if (fc == 0) + { + /* arpidx[level] does not exist */ + del_cnt = 0; + at_rn = NULL; + } + else if (fc == 1) + { + del_rn[del_cnt] = at_rn; + del_n[del_cnt] = at_n; + del_cnt++; + at_rn = (struct mib_list_rootnode*)(at_n->nptr); + } + else if (fc == 2) + { + /* reset delete (2 or more childs) */ + del_cnt = 0; + at_rn = (struct mib_list_rootnode*)(at_n->nptr); + } + level++; + } + /* delete marked index nodes */ + while (del_cnt > 0) + { + del_cnt--; + + at_rn = del_rn[del_cnt]; + at_n = del_n[del_cnt]; + + next = snmp_mib_node_delete(at_rn, at_n); + if (next != NULL) + { + LWIP_ASSERT("next_count == 0",next->count == 0); + snmp_mib_lrn_free(next); + } + } + } + /* disable getnext traversal on empty tables */ + if(arptree_root.count == 0) at.maxlength = 0; + if(ipntomtree_root.count == 0) ipntomtable.maxlength = 0; +} + +void snmp_inc_ipinreceives(void) +{ + ipinreceives++; +} + +void snmp_inc_ipinhdrerrors(void) +{ + ipinhdrerrors++; +} + +void snmp_inc_ipinaddrerrors(void) +{ + ipinaddrerrors++; +} + +void snmp_inc_ipforwdatagrams(void) +{ + ipforwdatagrams++; +} + +void snmp_inc_ipinunknownprotos(void) +{ + ipinunknownprotos++; +} + +void snmp_inc_ipindiscards(void) +{ + ipindiscards++; +} + +void snmp_inc_ipindelivers(void) +{ + ipindelivers++; +} + +void snmp_inc_ipoutrequests(void) +{ + ipoutrequests++; +} + +void snmp_inc_ipoutdiscards(void) +{ + ipoutdiscards++; +} + +void snmp_inc_ipoutnoroutes(void) +{ + ipoutnoroutes++; +} + +void snmp_inc_ipreasmreqds(void) +{ + ipreasmreqds++; +} + +void snmp_inc_ipreasmoks(void) +{ + ipreasmoks++; +} + +void snmp_inc_ipreasmfails(void) +{ + ipreasmfails++; +} + +void snmp_inc_ipfragoks(void) +{ + ipfragoks++; +} + +void snmp_inc_ipfragfails(void) +{ + ipfragfails++; +} + +void snmp_inc_ipfragcreates(void) +{ + ipfragcreates++; +} + +void snmp_inc_iproutingdiscards(void) +{ + iproutingdiscards++; +} + +/** + * Inserts ipAddrTable indexes (.ipAdEntAddr) + * into index tree. + */ +void snmp_insert_ipaddridx_tree(struct netif *ni) +{ + struct mib_list_rootnode *ipa_rn; + struct mib_list_node *ipa_node; + s32_t ipaddridx[4]; + u8_t level; + + LWIP_ASSERT("ni != NULL", ni != NULL); + snmp_iptooid(&ni->ip_addr, &ipaddridx[0]); + + level = 0; + ipa_rn = &ipaddrtree_root; + while (level < 4) + { + ipa_node = NULL; + snmp_mib_node_insert(ipa_rn, ipaddridx[level], &ipa_node); + if ((level != 3) && (ipa_node != NULL)) + { + if (ipa_node->nptr == NULL) + { + ipa_rn = snmp_mib_lrn_alloc(); + ipa_node->nptr = (struct mib_node*)ipa_rn; + if (ipa_rn != NULL) + { + if (level == 2) + { + ipa_rn->get_object_def = ip_addrentry_get_object_def; + ipa_rn->get_value = ip_addrentry_get_value; + ipa_rn->set_test = noleafs_set_test; + ipa_rn->set_value = noleafs_set_value; + } + } + else + { + /* ipa_rn == NULL, malloc failure */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_ipaddridx_tree() insert failed, mem full")); + break; + } + } + else + { + ipa_rn = (struct mib_list_rootnode*)ipa_node->nptr; + } + } + level++; + } + /* enable getnext traversal on filled table */ + ipaddrtable.maxlength = 1; +} + +/** + * Removes ipAddrTable indexes (.ipAdEntAddr) + * from index tree. + */ +void snmp_delete_ipaddridx_tree(struct netif *ni) +{ + struct mib_list_rootnode *ipa_rn, *next, *del_rn[4]; + struct mib_list_node *ipa_n, *del_n[4]; + s32_t ipaddridx[4]; + u8_t fc, level, del_cnt; + + LWIP_ASSERT("ni != NULL", ni != NULL); + snmp_iptooid(&ni->ip_addr, &ipaddridx[0]); + + /* mark nodes for deletion */ + level = 0; + del_cnt = 0; + ipa_rn = &ipaddrtree_root; + while ((level < 4) && (ipa_rn != NULL)) + { + fc = snmp_mib_node_find(ipa_rn, ipaddridx[level], &ipa_n); + if (fc == 0) + { + /* ipaddridx[level] does not exist */ + del_cnt = 0; + ipa_rn = NULL; + } + else if (fc == 1) + { + del_rn[del_cnt] = ipa_rn; + del_n[del_cnt] = ipa_n; + del_cnt++; + ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr); + } + else if (fc == 2) + { + /* reset delete (2 or more childs) */ + del_cnt = 0; + ipa_rn = (struct mib_list_rootnode*)(ipa_n->nptr); + } + level++; + } + /* delete marked index nodes */ + while (del_cnt > 0) + { + del_cnt--; + + ipa_rn = del_rn[del_cnt]; + ipa_n = del_n[del_cnt]; + + next = snmp_mib_node_delete(ipa_rn, ipa_n); + if (next != NULL) + { + LWIP_ASSERT("next_count == 0",next->count == 0); + snmp_mib_lrn_free(next); + } + } + /* disable getnext traversal on empty table */ + if (ipaddrtree_root.count == 0) ipaddrtable.maxlength = 0; +} + +/** + * Inserts ipRouteTable indexes (.ipRouteDest) + * into index tree. + * + * @param dflt non-zero for the default rte, zero for network rte + * @param ni points to network interface for this rte + * + * @todo record sysuptime for _this_ route when it is installed + * (needed for ipRouteAge) in the netif. + */ +void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni) +{ + u8_t insert = 0; + ip_addr_t dst; + + if (dflt != 0) + { + /* the default route 0.0.0.0 */ + ip_addr_set_any(&dst); + insert = 1; + } + else + { + /* route to the network address */ + ip_addr_get_network(&dst, &ni->ip_addr, &ni->netmask); + /* exclude 0.0.0.0 network (reserved for default rte) */ + if (!ip_addr_isany(&dst)) { + insert = 1; + } + } + if (insert) + { + struct mib_list_rootnode *iprte_rn; + struct mib_list_node *iprte_node; + s32_t iprteidx[4]; + u8_t level; + + snmp_iptooid(&dst, &iprteidx[0]); + level = 0; + iprte_rn = &iprtetree_root; + while (level < 4) + { + iprte_node = NULL; + snmp_mib_node_insert(iprte_rn, iprteidx[level], &iprte_node); + if ((level != 3) && (iprte_node != NULL)) + { + if (iprte_node->nptr == NULL) + { + iprte_rn = snmp_mib_lrn_alloc(); + iprte_node->nptr = (struct mib_node*)iprte_rn; + if (iprte_rn != NULL) + { + if (level == 2) + { + iprte_rn->get_object_def = ip_rteentry_get_object_def; + iprte_rn->get_value = ip_rteentry_get_value; + iprte_rn->set_test = noleafs_set_test; + iprte_rn->set_value = noleafs_set_value; + } + } + else + { + /* iprte_rn == NULL, malloc failure */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_iprteidx_tree() insert failed, mem full")); + break; + } + } + else + { + iprte_rn = (struct mib_list_rootnode*)iprte_node->nptr; + } + } + level++; + } + } + /* enable getnext traversal on filled table */ + iprtetable.maxlength = 1; +} + +/** + * Removes ipRouteTable indexes (.ipRouteDest) + * from index tree. + * + * @param dflt non-zero for the default rte, zero for network rte + * @param ni points to network interface for this rte or NULL + * for default route to be removed. + */ +void snmp_delete_iprteidx_tree(u8_t dflt, struct netif *ni) +{ + u8_t del = 0; + ip_addr_t dst; + + if (dflt != 0) + { + /* the default route 0.0.0.0 */ + ip_addr_set_any(&dst); + del = 1; + } + else + { + /* route to the network address */ + ip_addr_get_network(&dst, &ni->ip_addr, &ni->netmask); + /* exclude 0.0.0.0 network (reserved for default rte) */ + if (!ip_addr_isany(&dst)) { + del = 1; + } + } + if (del) + { + struct mib_list_rootnode *iprte_rn, *next, *del_rn[4]; + struct mib_list_node *iprte_n, *del_n[4]; + s32_t iprteidx[4]; + u8_t fc, level, del_cnt; + + snmp_iptooid(&dst, &iprteidx[0]); + /* mark nodes for deletion */ + level = 0; + del_cnt = 0; + iprte_rn = &iprtetree_root; + while ((level < 4) && (iprte_rn != NULL)) + { + fc = snmp_mib_node_find(iprte_rn, iprteidx[level], &iprte_n); + if (fc == 0) + { + /* iprteidx[level] does not exist */ + del_cnt = 0; + iprte_rn = NULL; + } + else if (fc == 1) + { + del_rn[del_cnt] = iprte_rn; + del_n[del_cnt] = iprte_n; + del_cnt++; + iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr); + } + else if (fc == 2) + { + /* reset delete (2 or more childs) */ + del_cnt = 0; + iprte_rn = (struct mib_list_rootnode*)(iprte_n->nptr); + } + level++; + } + /* delete marked index nodes */ + while (del_cnt > 0) + { + del_cnt--; + + iprte_rn = del_rn[del_cnt]; + iprte_n = del_n[del_cnt]; + + next = snmp_mib_node_delete(iprte_rn, iprte_n); + if (next != NULL) + { + LWIP_ASSERT("next_count == 0",next->count == 0); + snmp_mib_lrn_free(next); + } + } + } + /* disable getnext traversal on empty table */ + if (iprtetree_root.count == 0) iprtetable.maxlength = 0; +} + + +void snmp_inc_icmpinmsgs(void) +{ + icmpinmsgs++; +} + +void snmp_inc_icmpinerrors(void) +{ + icmpinerrors++; +} + +void snmp_inc_icmpindestunreachs(void) +{ + icmpindestunreachs++; +} + +void snmp_inc_icmpintimeexcds(void) +{ + icmpintimeexcds++; +} + +void snmp_inc_icmpinparmprobs(void) +{ + icmpinparmprobs++; +} + +void snmp_inc_icmpinsrcquenchs(void) +{ + icmpinsrcquenchs++; +} + +void snmp_inc_icmpinredirects(void) +{ + icmpinredirects++; +} + +void snmp_inc_icmpinechos(void) +{ + icmpinechos++; +} + +void snmp_inc_icmpinechoreps(void) +{ + icmpinechoreps++; +} + +void snmp_inc_icmpintimestamps(void) +{ + icmpintimestamps++; +} + +void snmp_inc_icmpintimestampreps(void) +{ + icmpintimestampreps++; +} + +void snmp_inc_icmpinaddrmasks(void) +{ + icmpinaddrmasks++; +} + +void snmp_inc_icmpinaddrmaskreps(void) +{ + icmpinaddrmaskreps++; +} + +void snmp_inc_icmpoutmsgs(void) +{ + icmpoutmsgs++; +} + +void snmp_inc_icmpouterrors(void) +{ + icmpouterrors++; +} + +void snmp_inc_icmpoutdestunreachs(void) +{ + icmpoutdestunreachs++; +} + +void snmp_inc_icmpouttimeexcds(void) +{ + icmpouttimeexcds++; +} + +void snmp_inc_icmpoutparmprobs(void) +{ + icmpoutparmprobs++; +} + +void snmp_inc_icmpoutsrcquenchs(void) +{ + icmpoutsrcquenchs++; +} + +void snmp_inc_icmpoutredirects(void) +{ + icmpoutredirects++; +} + +void snmp_inc_icmpoutechos(void) +{ + icmpoutechos++; +} + +void snmp_inc_icmpoutechoreps(void) +{ + icmpoutechoreps++; +} + +void snmp_inc_icmpouttimestamps(void) +{ + icmpouttimestamps++; +} + +void snmp_inc_icmpouttimestampreps(void) +{ + icmpouttimestampreps++; +} + +void snmp_inc_icmpoutaddrmasks(void) +{ + icmpoutaddrmasks++; +} + +void snmp_inc_icmpoutaddrmaskreps(void) +{ + icmpoutaddrmaskreps++; +} + +void snmp_inc_tcpactiveopens(void) +{ + tcpactiveopens++; +} + +void snmp_inc_tcppassiveopens(void) +{ + tcppassiveopens++; +} + +void snmp_inc_tcpattemptfails(void) +{ + tcpattemptfails++; +} + +void snmp_inc_tcpestabresets(void) +{ + tcpestabresets++; +} + +void snmp_inc_tcpinsegs(void) +{ + tcpinsegs++; +} + +void snmp_inc_tcpoutsegs(void) +{ + tcpoutsegs++; +} + +void snmp_inc_tcpretranssegs(void) +{ + tcpretranssegs++; +} + +void snmp_inc_tcpinerrs(void) +{ + tcpinerrs++; +} + +void snmp_inc_tcpoutrsts(void) +{ + tcpoutrsts++; +} + +void snmp_inc_udpindatagrams(void) +{ + udpindatagrams++; +} + +void snmp_inc_udpnoports(void) +{ + udpnoports++; +} + +void snmp_inc_udpinerrors(void) +{ + udpinerrors++; +} + +void snmp_inc_udpoutdatagrams(void) +{ + udpoutdatagrams++; +} + +/** + * Inserts udpTable indexes (.udpLocalAddress.udpLocalPort) + * into index tree. + */ +void snmp_insert_udpidx_tree(struct udp_pcb *pcb) +{ + struct mib_list_rootnode *udp_rn; + struct mib_list_node *udp_node; + s32_t udpidx[5]; + u8_t level; + + LWIP_ASSERT("pcb != NULL", pcb != NULL); + snmp_iptooid(&pcb->local_ip, &udpidx[0]); + udpidx[4] = pcb->local_port; + + udp_rn = &udp_root; + for (level = 0; level < 5; level++) + { + udp_node = NULL; + snmp_mib_node_insert(udp_rn, udpidx[level], &udp_node); + if ((level != 4) && (udp_node != NULL)) + { + if (udp_node->nptr == NULL) + { + udp_rn = snmp_mib_lrn_alloc(); + udp_node->nptr = (struct mib_node*)udp_rn; + if (udp_rn != NULL) + { + if (level == 3) + { + udp_rn->get_object_def = udpentry_get_object_def; + udp_rn->get_value = udpentry_get_value; + udp_rn->set_test = noleafs_set_test; + udp_rn->set_value = noleafs_set_value; + } + } + else + { + /* udp_rn == NULL, malloc failure */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_insert_udpidx_tree() insert failed, mem full")); + break; + } + } + else + { + udp_rn = (struct mib_list_rootnode*)udp_node->nptr; + } + } + } + udptable.maxlength = 1; +} + +/** + * Removes udpTable indexes (.udpLocalAddress.udpLocalPort) + * from index tree. + */ +void snmp_delete_udpidx_tree(struct udp_pcb *pcb) +{ + struct udp_pcb *npcb; + struct mib_list_rootnode *udp_rn, *next, *del_rn[5]; + struct mib_list_node *udp_n, *del_n[5]; + s32_t udpidx[5]; + u8_t bindings, fc, level, del_cnt; + + LWIP_ASSERT("pcb != NULL", pcb != NULL); + snmp_iptooid(&pcb->local_ip, &udpidx[0]); + udpidx[4] = pcb->local_port; + + /* count PCBs for a given binding + (e.g. when reusing ports or for temp output PCBs) */ + bindings = 0; + npcb = udp_pcbs; + while ((npcb != NULL)) + { + if (ip_addr_cmp(&npcb->local_ip, &pcb->local_ip) && + (npcb->local_port == udpidx[4])) + { + bindings++; + } + npcb = npcb->next; + } + if (bindings == 1) + { + /* selectively remove */ + /* mark nodes for deletion */ + level = 0; + del_cnt = 0; + udp_rn = &udp_root; + while ((level < 5) && (udp_rn != NULL)) + { + fc = snmp_mib_node_find(udp_rn, udpidx[level], &udp_n); + if (fc == 0) + { + /* udpidx[level] does not exist */ + del_cnt = 0; + udp_rn = NULL; + } + else if (fc == 1) + { + del_rn[del_cnt] = udp_rn; + del_n[del_cnt] = udp_n; + del_cnt++; + udp_rn = (struct mib_list_rootnode*)(udp_n->nptr); + } + else if (fc == 2) + { + /* reset delete (2 or more childs) */ + del_cnt = 0; + udp_rn = (struct mib_list_rootnode*)(udp_n->nptr); + } + level++; + } + /* delete marked index nodes */ + while (del_cnt > 0) + { + del_cnt--; + + udp_rn = del_rn[del_cnt]; + udp_n = del_n[del_cnt]; + + next = snmp_mib_node_delete(udp_rn, udp_n); + if (next != NULL) + { + LWIP_ASSERT("next_count == 0",next->count == 0); + snmp_mib_lrn_free(next); + } + } + } + /* disable getnext traversal on empty table */ + if (udp_root.count == 0) udptable.maxlength = 0; +} + + +void snmp_inc_snmpinpkts(void) +{ + snmpinpkts++; +} + +void snmp_inc_snmpoutpkts(void) +{ + snmpoutpkts++; +} + +void snmp_inc_snmpinbadversions(void) +{ + snmpinbadversions++; +} + +void snmp_inc_snmpinbadcommunitynames(void) +{ + snmpinbadcommunitynames++; +} + +void snmp_inc_snmpinbadcommunityuses(void) +{ + snmpinbadcommunityuses++; +} + +void snmp_inc_snmpinasnparseerrs(void) +{ + snmpinasnparseerrs++; +} + +void snmp_inc_snmpintoobigs(void) +{ + snmpintoobigs++; +} + +void snmp_inc_snmpinnosuchnames(void) +{ + snmpinnosuchnames++; +} + +void snmp_inc_snmpinbadvalues(void) +{ + snmpinbadvalues++; +} + +void snmp_inc_snmpinreadonlys(void) +{ + snmpinreadonlys++; +} + +void snmp_inc_snmpingenerrs(void) +{ + snmpingenerrs++; +} + +void snmp_add_snmpintotalreqvars(u8_t value) +{ + snmpintotalreqvars += value; +} + +void snmp_add_snmpintotalsetvars(u8_t value) +{ + snmpintotalsetvars += value; +} + +void snmp_inc_snmpingetrequests(void) +{ + snmpingetrequests++; +} + +void snmp_inc_snmpingetnexts(void) +{ + snmpingetnexts++; +} + +void snmp_inc_snmpinsetrequests(void) +{ + snmpinsetrequests++; +} + +void snmp_inc_snmpingetresponses(void) +{ + snmpingetresponses++; +} + +void snmp_inc_snmpintraps(void) +{ + snmpintraps++; +} + +void snmp_inc_snmpouttoobigs(void) +{ + snmpouttoobigs++; +} + +void snmp_inc_snmpoutnosuchnames(void) +{ + snmpoutnosuchnames++; +} + +void snmp_inc_snmpoutbadvalues(void) +{ + snmpoutbadvalues++; +} + +void snmp_inc_snmpoutgenerrs(void) +{ + snmpoutgenerrs++; +} + +void snmp_inc_snmpoutgetrequests(void) +{ + snmpoutgetrequests++; +} + +void snmp_inc_snmpoutgetnexts(void) +{ + snmpoutgetnexts++; +} + +void snmp_inc_snmpoutsetrequests(void) +{ + snmpoutsetrequests++; +} + +void snmp_inc_snmpoutgetresponses(void) +{ + snmpoutgetresponses++; +} + +void snmp_inc_snmpouttraps(void) +{ + snmpouttraps++; +} + +void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid) +{ + *oid = &snmpgrp_id; +} + +void snmp_set_snmpenableauthentraps(u8_t *value) +{ + if (value != NULL) + { + snmpenableauthentraps_ptr = value; + } +} + +void snmp_get_snmpenableauthentraps(u8_t *value) +{ + *value = *snmpenableauthentraps_ptr; +} + +void +noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + LWIP_UNUSED_ARG(ident_len); + LWIP_UNUSED_ARG(ident); + od->instance = MIB_OBJECT_NONE; +} + +void +noleafs_get_value(struct obj_def *od, u16_t len, void *value) +{ + LWIP_UNUSED_ARG(od); + LWIP_UNUSED_ARG(len); + LWIP_UNUSED_ARG(value); +} + +u8_t +noleafs_set_test(struct obj_def *od, u16_t len, void *value) +{ + LWIP_UNUSED_ARG(od); + LWIP_UNUSED_ARG(len); + LWIP_UNUSED_ARG(value); + /* can't set */ + return 0; +} + +void +noleafs_set_value(struct obj_def *od, u16_t len, void *value) +{ + LWIP_UNUSED_ARG(od); + LWIP_UNUSED_ARG(len); + LWIP_UNUSED_ARG(value); +} + + +/** + * Returns systems object definitions. + * + * @param ident_len the address length (2) + * @param ident points to objectname.0 (object id trailer) + * @param od points to object definition. + */ +static void +system_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + u8_t id; + + /* return to object name, adding index depth (1) */ + ident_len += 1; + ident -= 1; + if (ident_len == 2) + { + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff)); + id = (u8_t)ident[0]; + LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def system.%"U16_F".0\n",(u16_t)id)); + switch (id) + { + case 1: /* sysDescr */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR); + od->v_len = *sysdescr_len_ptr; + break; + case 2: /* sysObjectID */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID); + od->v_len = sysobjid.len * sizeof(s32_t); + break; + case 3: /* sysUpTime */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS); + od->v_len = sizeof(u32_t); + break; + case 4: /* sysContact */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR); + od->v_len = *syscontact_len_ptr; + break; + case 5: /* sysName */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR); + od->v_len = *sysname_len_ptr; + break; + case 6: /* sysLocation */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR); + od->v_len = *syslocation_len_ptr; + break; + case 7: /* sysServices */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def: no such object\n")); + od->instance = MIB_OBJECT_NONE; + break; + }; + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("system_get_object_def: no scalar\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +/** + * Returns system object value. + * + * @param ident_len the address length (2) + * @param ident points to objectname.0 (object id trailer) + * @param len return value space (in bytes) + * @param value points to (varbind) space to copy value into. + */ +static void +system_get_value(struct obj_def *od, u16_t len, void *value) +{ + u8_t id; + + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 1: /* sysDescr */ + ocstrncpy((u8_t*)value, sysdescr_ptr, len); + break; + case 2: /* sysObjectID */ + objectidncpy((s32_t*)value, (s32_t*)sysobjid.id, (u8_t)(len / sizeof(s32_t))); + break; + case 3: /* sysUpTime */ + { + snmp_get_sysuptime((u32_t*)value); + } + break; + case 4: /* sysContact */ + ocstrncpy((u8_t*)value, syscontact_ptr, len); + break; + case 5: /* sysName */ + ocstrncpy((u8_t*)value, sysname_ptr, len); + break; + case 6: /* sysLocation */ + ocstrncpy((u8_t*)value, syslocation_ptr, len); + break; + case 7: /* sysServices */ + { + s32_t *sint_ptr = (s32_t*)value; + *sint_ptr = sysservices; + } + break; + }; +} + +static u8_t +system_set_test(struct obj_def *od, u16_t len, void *value) +{ + u8_t id, set_ok; + + LWIP_UNUSED_ARG(value); + set_ok = 0; + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 4: /* sysContact */ + if ((syscontact_ptr != syscontact_default) && + (len <= 255)) + { + set_ok = 1; + } + break; + case 5: /* sysName */ + if ((sysname_ptr != sysname_default) && + (len <= 255)) + { + set_ok = 1; + } + break; + case 6: /* sysLocation */ + if ((syslocation_ptr != syslocation_default) && + (len <= 255)) + { + set_ok = 1; + } + break; + }; + return set_ok; +} + +static void +system_set_value(struct obj_def *od, u16_t len, void *value) +{ + u8_t id; + + LWIP_ASSERT("invalid len", len <= 0xff); + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 4: /* sysContact */ + ocstrncpy(syscontact_ptr, (u8_t*)value, len); + *syscontact_len_ptr = (u8_t)len; + break; + case 5: /* sysName */ + ocstrncpy(sysname_ptr, (u8_t*)value, len); + *sysname_len_ptr = (u8_t)len; + break; + case 6: /* sysLocation */ + ocstrncpy(syslocation_ptr, (u8_t*)value, len); + *syslocation_len_ptr = (u8_t)len; + break; + }; +} + +/** + * Returns interfaces.ifnumber object definition. + * + * @param ident_len the address length (2) + * @param ident points to objectname.index + * @param od points to object definition. + */ +static void +interfaces_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + /* return to object name, adding index depth (1) */ + ident_len += 1; + ident -= 1; + if (ident_len == 2) + { + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("interfaces_get_object_def: no scalar\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +/** + * Returns interfaces.ifnumber object value. + * + * @param ident_len the address length (2) + * @param ident points to objectname.0 (object id trailer) + * @param len return value space (in bytes) + * @param value points to (varbind) space to copy value into. + */ +static void +interfaces_get_value(struct obj_def *od, u16_t len, void *value) +{ + LWIP_UNUSED_ARG(len); + if (od->id_inst_ptr[0] == 1) + { + s32_t *sint_ptr = (s32_t*)value; + *sint_ptr = iflist_root.count; + } +} + +/** + * Returns ifentry object definitions. + * + * @param ident_len the address length (2) + * @param ident points to objectname.index + * @param od points to object definition. + */ +static void +ifentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + u8_t id; + + /* return to object name, adding index depth (1) */ + ident_len += 1; + ident -= 1; + if (ident_len == 2) + { + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff)); + id = (u8_t)ident[0]; + LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ifentry.%"U16_F"\n",(u16_t)id)); + switch (id) + { + case 1: /* ifIndex */ + case 3: /* ifType */ + case 4: /* ifMtu */ + case 8: /* ifOperStatus */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + case 2: /* ifDescr */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR); + /** @todo this should be some sort of sizeof(struct netif.name) */ + od->v_len = 2; + break; + case 5: /* ifSpeed */ + case 21: /* ifOutQLen */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE); + od->v_len = sizeof(u32_t); + break; + case 6: /* ifPhysAddress */ + { + struct netif *netif; + + snmp_ifindextonetif(ident[1], &netif); + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR); + od->v_len = netif->hwaddr_len; + } + break; + case 7: /* ifAdminStatus */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + case 9: /* ifLastChange */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS); + od->v_len = sizeof(u32_t); + break; + case 10: /* ifInOctets */ + case 11: /* ifInUcastPkts */ + case 12: /* ifInNUcastPkts */ + case 13: /* ifInDiscarts */ + case 14: /* ifInErrors */ + case 15: /* ifInUnkownProtos */ + case 16: /* ifOutOctets */ + case 17: /* ifOutUcastPkts */ + case 18: /* ifOutNUcastPkts */ + case 19: /* ifOutDiscarts */ + case 20: /* ifOutErrors */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER); + od->v_len = sizeof(u32_t); + break; + case 22: /* ifSpecific */ + /** @note returning zeroDotZero (0.0) no media specific MIB support */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID); + od->v_len = ifspecific.len * sizeof(s32_t); + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ifentry_get_object_def: no such object\n")); + od->instance = MIB_OBJECT_NONE; + break; + }; + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ifentry_get_object_def: no scalar\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +/** + * Returns ifentry object value. + * + * @param ident_len the address length (2) + * @param ident points to objectname.0 (object id trailer) + * @param len return value space (in bytes) + * @param value points to (varbind) space to copy value into. + */ +static void +ifentry_get_value(struct obj_def *od, u16_t len, void *value) +{ + struct netif *netif; + u8_t id; + + snmp_ifindextonetif(od->id_inst_ptr[1], &netif); + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 1: /* ifIndex */ + { + s32_t *sint_ptr = (s32_t*)value; + *sint_ptr = od->id_inst_ptr[1]; + } + break; + case 2: /* ifDescr */ + ocstrncpy((u8_t*)value, (u8_t*)netif->name, len); + break; + case 3: /* ifType */ + { + s32_t *sint_ptr = (s32_t*)value; + *sint_ptr = netif->link_type; + } + break; + case 4: /* ifMtu */ + { + s32_t *sint_ptr = (s32_t*)value; + *sint_ptr = netif->mtu; + } + break; + case 5: /* ifSpeed */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = netif->link_speed; + } + break; + case 6: /* ifPhysAddress */ + ocstrncpy((u8_t*)value, netif->hwaddr, len); + break; + case 7: /* ifAdminStatus */ + { + s32_t *sint_ptr = (s32_t*)value; + if (netif_is_up(netif)) + { + if (netif_is_link_up(netif)) + { + *sint_ptr = 1; /* up */ + } + else + { + *sint_ptr = 7; /* lowerLayerDown */ + } + } + else + { + *sint_ptr = 2; /* down */ + } + } + break; + case 8: /* ifOperStatus */ + { + s32_t *sint_ptr = (s32_t*)value; + if (netif_is_up(netif)) + { + *sint_ptr = 1; + } + else + { + *sint_ptr = 2; + } + } + break; + case 9: /* ifLastChange */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = netif->ts; + } + break; + case 10: /* ifInOctets */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = netif->ifinoctets; + } + break; + case 11: /* ifInUcastPkts */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = netif->ifinucastpkts; + } + break; + case 12: /* ifInNUcastPkts */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = netif->ifinnucastpkts; + } + break; + case 13: /* ifInDiscarts */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = netif->ifindiscards; + } + break; + case 14: /* ifInErrors */ + case 15: /* ifInUnkownProtos */ + /** @todo add these counters! */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = 0; + } + break; + case 16: /* ifOutOctets */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = netif->ifoutoctets; + } + break; + case 17: /* ifOutUcastPkts */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = netif->ifoutucastpkts; + } + break; + case 18: /* ifOutNUcastPkts */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = netif->ifoutnucastpkts; + } + break; + case 19: /* ifOutDiscarts */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = netif->ifoutdiscards; + } + break; + case 20: /* ifOutErrors */ + /** @todo add this counter! */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = 0; + } + break; + case 21: /* ifOutQLen */ + /** @todo figure out if this must be 0 (no queue) or 1? */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = 0; + } + break; + case 22: /* ifSpecific */ + objectidncpy((s32_t*)value, (s32_t*)ifspecific.id, (u8_t)(len / sizeof(s32_t))); + break; + }; +} + +#if !SNMP_SAFE_REQUESTS +static u8_t +ifentry_set_test(struct obj_def *od, u16_t len, void *value) +{ + struct netif *netif; + u8_t id, set_ok; + LWIP_UNUSED_ARG(len); + + set_ok = 0; + snmp_ifindextonetif(od->id_inst_ptr[1], &netif); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 7: /* ifAdminStatus */ + { + s32_t *sint_ptr = (s32_t*)value; + if (*sint_ptr == 1 || *sint_ptr == 2) + set_ok = 1; + } + break; + } + return set_ok; +} + +static void +ifentry_set_value(struct obj_def *od, u16_t len, void *value) +{ + struct netif *netif; + u8_t id; + LWIP_UNUSED_ARG(len); + + snmp_ifindextonetif(od->id_inst_ptr[1], &netif); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 7: /* ifAdminStatus */ + { + s32_t *sint_ptr = (s32_t*)value; + if (*sint_ptr == 1) + { + netif_set_up(netif); + } + else if (*sint_ptr == 2) + { + netif_set_down(netif); + } + } + break; + } +} +#endif /* SNMP_SAFE_REQUESTS */ + +/** + * Returns atentry object definitions. + * + * @param ident_len the address length (6) + * @param ident points to objectname.atifindex.atnetaddress + * @param od points to object definition. + */ +static void +atentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + /* return to object name, adding index depth (5) */ + ident_len += 5; + ident -= 5; + + if (ident_len == 6) + { + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + switch (ident[0]) + { + case 1: /* atIfIndex */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + case 2: /* atPhysAddress */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR); + od->v_len = 6; /** @todo try to use netif::hwaddr_len */ + break; + case 3: /* atNetAddress */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR); + od->v_len = 4; + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG,("atentry_get_object_def: no such object\n")); + od->instance = MIB_OBJECT_NONE; + break; + } + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("atentry_get_object_def: no scalar\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +static void +atentry_get_value(struct obj_def *od, u16_t len, void *value) +{ +#if LWIP_ARP + u8_t id; + struct eth_addr* ethaddr_ret; + ip_addr_t* ipaddr_ret; +#endif /* LWIP_ARP */ + ip_addr_t ip; + struct netif *netif; + + LWIP_UNUSED_ARG(len); + LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */ + + snmp_ifindextonetif(od->id_inst_ptr[1], &netif); + snmp_oidtoip(&od->id_inst_ptr[2], &ip); + +#if LWIP_ARP /** @todo implement a netif_find_addr */ + if (etharp_find_addr(netif, &ip, ðaddr_ret, &ipaddr_ret) > -1) + { + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 1: /* atIfIndex */ + { + s32_t *sint_ptr = (s32_t*)value; + *sint_ptr = od->id_inst_ptr[1]; + } + break; + case 2: /* atPhysAddress */ + { + struct eth_addr *dst = (struct eth_addr*)value; + + *dst = *ethaddr_ret; + } + break; + case 3: /* atNetAddress */ + { + ip_addr_t *dst = (ip_addr_t*)value; + + *dst = *ipaddr_ret; + } + break; + } + } +#endif /* LWIP_ARP */ +} + +static void +ip_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + u8_t id; + + /* return to object name, adding index depth (1) */ + ident_len += 1; + ident -= 1; + if (ident_len == 2) + { + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff)); + id = (u8_t)ident[0]; + LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def ip.%"U16_F".0\n",(u16_t)id)); + switch (id) + { + case 1: /* ipForwarding */ + case 2: /* ipDefaultTTL */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + case 3: /* ipInReceives */ + case 4: /* ipInHdrErrors */ + case 5: /* ipInAddrErrors */ + case 6: /* ipForwDatagrams */ + case 7: /* ipInUnknownProtos */ + case 8: /* ipInDiscards */ + case 9: /* ipInDelivers */ + case 10: /* ipOutRequests */ + case 11: /* ipOutDiscards */ + case 12: /* ipOutNoRoutes */ + case 14: /* ipReasmReqds */ + case 15: /* ipReasmOKs */ + case 16: /* ipReasmFails */ + case 17: /* ipFragOKs */ + case 18: /* ipFragFails */ + case 19: /* ipFragCreates */ + case 23: /* ipRoutingDiscards */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER); + od->v_len = sizeof(u32_t); + break; + case 13: /* ipReasmTimeout */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_get_object_def: no such object\n")); + od->instance = MIB_OBJECT_NONE; + break; + }; + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_get_object_def: no scalar\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +static void +ip_get_value(struct obj_def *od, u16_t len, void *value) +{ + u8_t id; + + LWIP_UNUSED_ARG(len); + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 1: /* ipForwarding */ + { + s32_t *sint_ptr = (s32_t*)value; +#if IP_FORWARD + /* forwarding */ + *sint_ptr = 1; +#else + /* not-forwarding */ + *sint_ptr = 2; +#endif + } + break; + case 2: /* ipDefaultTTL */ + { + s32_t *sint_ptr = (s32_t*)value; + *sint_ptr = IP_DEFAULT_TTL; + } + break; + case 3: /* ipInReceives */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipinreceives; + } + break; + case 4: /* ipInHdrErrors */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipinhdrerrors; + } + break; + case 5: /* ipInAddrErrors */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipinaddrerrors; + } + break; + case 6: /* ipForwDatagrams */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipforwdatagrams; + } + break; + case 7: /* ipInUnknownProtos */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipinunknownprotos; + } + break; + case 8: /* ipInDiscards */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipindiscards; + } + break; + case 9: /* ipInDelivers */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipindelivers; + } + break; + case 10: /* ipOutRequests */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipoutrequests; + } + break; + case 11: /* ipOutDiscards */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipoutdiscards; + } + break; + case 12: /* ipOutNoRoutes */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipoutnoroutes; + } + break; + case 13: /* ipReasmTimeout */ + { + s32_t *sint_ptr = (s32_t*)value; +#if IP_REASSEMBLY + *sint_ptr = IP_REASS_MAXAGE; +#else + *sint_ptr = 0; +#endif + } + break; + case 14: /* ipReasmReqds */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipreasmreqds; + } + break; + case 15: /* ipReasmOKs */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipreasmoks; + } + break; + case 16: /* ipReasmFails */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipreasmfails; + } + break; + case 17: /* ipFragOKs */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipfragoks; + } + break; + case 18: /* ipFragFails */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipfragfails; + } + break; + case 19: /* ipFragCreates */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = ipfragcreates; + } + break; + case 23: /* ipRoutingDiscards */ + /** @todo can lwIP discard routes at all?? hardwire this to 0?? */ + { + u32_t *uint_ptr = (u32_t*)value; + *uint_ptr = iproutingdiscards; + } + break; + }; +} + +/** + * Test ip object value before setting. + * + * @param od is the object definition + * @param len return value space (in bytes) + * @param value points to (varbind) space to copy value from. + * + * @note we allow set if the value matches the hardwired value, + * otherwise return badvalue. + */ +static u8_t +ip_set_test(struct obj_def *od, u16_t len, void *value) +{ + u8_t id, set_ok; + s32_t *sint_ptr = (s32_t*)value; + + LWIP_UNUSED_ARG(len); + set_ok = 0; + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 1: /* ipForwarding */ +#if IP_FORWARD + /* forwarding */ + if (*sint_ptr == 1) +#else + /* not-forwarding */ + if (*sint_ptr == 2) +#endif + { + set_ok = 1; + } + break; + case 2: /* ipDefaultTTL */ + if (*sint_ptr == IP_DEFAULT_TTL) + { + set_ok = 1; + } + break; + }; + return set_ok; +} + +static void +ip_addrentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + /* return to object name, adding index depth (4) */ + ident_len += 4; + ident -= 4; + + if (ident_len == 5) + { + u8_t id; + + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff)); + id = (u8_t)ident[0]; + switch (id) + { + case 1: /* ipAdEntAddr */ + case 3: /* ipAdEntNetMask */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR); + od->v_len = 4; + break; + case 2: /* ipAdEntIfIndex */ + case 4: /* ipAdEntBcastAddr */ + case 5: /* ipAdEntReasmMaxSize */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_addrentry_get_object_def: no such object\n")); + od->instance = MIB_OBJECT_NONE; + break; + } + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_addrentry_get_object_def: no scalar\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +static void +ip_addrentry_get_value(struct obj_def *od, u16_t len, void *value) +{ + u8_t id; + u16_t ifidx; + ip_addr_t ip; + struct netif *netif = netif_list; + + LWIP_UNUSED_ARG(len); + snmp_oidtoip(&od->id_inst_ptr[1], &ip); + ifidx = 0; + while ((netif != NULL) && !ip_addr_cmp(&ip, &netif->ip_addr)) + { + netif = netif->next; + ifidx++; + } + + if (netif != NULL) + { + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 1: /* ipAdEntAddr */ + { + ip_addr_t *dst = (ip_addr_t*)value; + *dst = netif->ip_addr; + } + break; + case 2: /* ipAdEntIfIndex */ + { + s32_t *sint_ptr = (s32_t*)value; + *sint_ptr = ifidx + 1; + } + break; + case 3: /* ipAdEntNetMask */ + { + ip_addr_t *dst = (ip_addr_t*)value; + *dst = netif->netmask; + } + break; + case 4: /* ipAdEntBcastAddr */ + { + s32_t *sint_ptr = (s32_t*)value; + + /* lwIP oddity, there's no broadcast + address in the netif we can rely on */ + *sint_ptr = IPADDR_BROADCAST & 1; + } + break; + case 5: /* ipAdEntReasmMaxSize */ + { + s32_t *sint_ptr = (s32_t*)value; +#if IP_REASSEMBLY + /* @todo The theoretical maximum is IP_REASS_MAX_PBUFS * size of the pbufs, + * but only if receiving one fragmented packet at a time. + * The current solution is to calculate for 2 simultaneous packets... + */ + *sint_ptr = (IP_HLEN + ((IP_REASS_MAX_PBUFS/2) * + (PBUF_POOL_BUFSIZE - PBUF_LINK_HLEN - IP_HLEN))); +#else + /** @todo returning MTU would be a bad thing and + returning a wild guess like '576' isn't good either */ + *sint_ptr = 0; +#endif + } + break; + } + } +} + +/** + * @note + * lwIP IP routing is currently using the network addresses in netif_list. + * if no suitable network IP is found in netif_list, the default_netif is used. + */ +static void +ip_rteentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + u8_t id; + + /* return to object name, adding index depth (4) */ + ident_len += 4; + ident -= 4; + + if (ident_len == 5) + { + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff)); + id = (u8_t)ident[0]; + switch (id) + { + case 1: /* ipRouteDest */ + case 7: /* ipRouteNextHop */ + case 11: /* ipRouteMask */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR); + od->v_len = 4; + break; + case 2: /* ipRouteIfIndex */ + case 3: /* ipRouteMetric1 */ + case 4: /* ipRouteMetric2 */ + case 5: /* ipRouteMetric3 */ + case 6: /* ipRouteMetric4 */ + case 8: /* ipRouteType */ + case 10: /* ipRouteAge */ + case 12: /* ipRouteMetric5 */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + case 9: /* ipRouteProto */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + case 13: /* ipRouteInfo */ + /** @note returning zeroDotZero (0.0) no routing protocol specific MIB */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID); + od->v_len = iprouteinfo.len * sizeof(s32_t); + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_rteentry_get_object_def: no such object\n")); + od->instance = MIB_OBJECT_NONE; + break; + } + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_rteentry_get_object_def: no scalar\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +static void +ip_rteentry_get_value(struct obj_def *od, u16_t len, void *value) +{ + struct netif *netif; + ip_addr_t dest; + s32_t *ident; + u8_t id; + + ident = od->id_inst_ptr; + snmp_oidtoip(&ident[1], &dest); + + if (ip_addr_isany(&dest)) + { + /* ip_route() uses default netif for default route */ + netif = netif_default; + } + else + { + /* not using ip_route(), need exact match! */ + netif = netif_list; + while ((netif != NULL) && + !ip_addr_netcmp(&dest, &(netif->ip_addr), &(netif->netmask)) ) + { + netif = netif->next; + } + } + if (netif != NULL) + { + LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff)); + id = (u8_t)ident[0]; + switch (id) + { + case 1: /* ipRouteDest */ + { + ip_addr_t *dst = (ip_addr_t*)value; + + if (ip_addr_isany(&dest)) + { + /* default rte has 0.0.0.0 dest */ + ip_addr_set_zero(dst); + } + else + { + /* netifs have netaddress dest */ + ip_addr_get_network(dst, &netif->ip_addr, &netif->netmask); + } + } + break; + case 2: /* ipRouteIfIndex */ + { + s32_t *sint_ptr = (s32_t*)value; + + snmp_netiftoifindex(netif, sint_ptr); + } + break; + case 3: /* ipRouteMetric1 */ + { + s32_t *sint_ptr = (s32_t*)value; + + if (ip_addr_isany(&dest)) + { + /* default rte has metric 1 */ + *sint_ptr = 1; + } + else + { + /* other rtes have metric 0 */ + *sint_ptr = 0; + } + } + break; + case 4: /* ipRouteMetric2 */ + case 5: /* ipRouteMetric3 */ + case 6: /* ipRouteMetric4 */ + case 12: /* ipRouteMetric5 */ + { + s32_t *sint_ptr = (s32_t*)value; + /* not used */ + *sint_ptr = -1; + } + break; + case 7: /* ipRouteNextHop */ + { + ip_addr_t *dst = (ip_addr_t*)value; + + if (ip_addr_isany(&dest)) + { + /* default rte: gateway */ + *dst = netif->gw; + } + else + { + /* other rtes: netif ip_addr */ + *dst = netif->ip_addr; + } + } + break; + case 8: /* ipRouteType */ + { + s32_t *sint_ptr = (s32_t*)value; + + if (ip_addr_isany(&dest)) + { + /* default rte is indirect */ + *sint_ptr = 4; + } + else + { + /* other rtes are direct */ + *sint_ptr = 3; + } + } + break; + case 9: /* ipRouteProto */ + { + s32_t *sint_ptr = (s32_t*)value; + /* locally defined routes */ + *sint_ptr = 2; + } + break; + case 10: /* ipRouteAge */ + { + s32_t *sint_ptr = (s32_t*)value; + /** @todo (sysuptime - timestamp last change) / 100 + @see snmp_insert_iprteidx_tree() */ + *sint_ptr = 0; + } + break; + case 11: /* ipRouteMask */ + { + ip_addr_t *dst = (ip_addr_t*)value; + + if (ip_addr_isany(&dest)) + { + /* default rte use 0.0.0.0 mask */ + ip_addr_set_zero(dst); + } + else + { + /* other rtes use netmask */ + *dst = netif->netmask; + } + } + break; + case 13: /* ipRouteInfo */ + objectidncpy((s32_t*)value, (s32_t*)iprouteinfo.id, (u8_t)(len / sizeof(s32_t))); + break; + } + } +} + +static void +ip_ntomentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + /* return to object name, adding index depth (5) */ + ident_len += 5; + ident -= 5; + + if (ident_len == 6) + { + u8_t id; + + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff)); + id = (u8_t)ident[0]; + switch (id) + { + case 1: /* ipNetToMediaIfIndex */ + case 4: /* ipNetToMediaType */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + case 2: /* ipNetToMediaPhysAddress */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR); + od->v_len = 6; /** @todo try to use netif::hwaddr_len */ + break; + case 3: /* ipNetToMediaNetAddress */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR); + od->v_len = 4; + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_ntomentry_get_object_def: no such object\n")); + od->instance = MIB_OBJECT_NONE; + break; + } + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ip_ntomentry_get_object_def: no scalar\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +static void +ip_ntomentry_get_value(struct obj_def *od, u16_t len, void *value) +{ +#if LWIP_ARP + u8_t id; + struct eth_addr* ethaddr_ret; + ip_addr_t* ipaddr_ret; +#endif /* LWIP_ARP */ + ip_addr_t ip; + struct netif *netif; + + LWIP_UNUSED_ARG(len); + LWIP_UNUSED_ARG(value);/* if !LWIP_ARP */ + + snmp_ifindextonetif(od->id_inst_ptr[1], &netif); + snmp_oidtoip(&od->id_inst_ptr[2], &ip); + +#if LWIP_ARP /** @todo implement a netif_find_addr */ + if (etharp_find_addr(netif, &ip, ðaddr_ret, &ipaddr_ret) > -1) + { + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 1: /* ipNetToMediaIfIndex */ + { + s32_t *sint_ptr = (s32_t*)value; + *sint_ptr = od->id_inst_ptr[1]; + } + break; + case 2: /* ipNetToMediaPhysAddress */ + { + struct eth_addr *dst = (struct eth_addr*)value; + + *dst = *ethaddr_ret; + } + break; + case 3: /* ipNetToMediaNetAddress */ + { + ip_addr_t *dst = (ip_addr_t*)value; + + *dst = *ipaddr_ret; + } + break; + case 4: /* ipNetToMediaType */ + { + s32_t *sint_ptr = (s32_t*)value; + /* dynamic (?) */ + *sint_ptr = 3; + } + break; + } + } +#endif /* LWIP_ARP */ +} + +static void +icmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + /* return to object name, adding index depth (1) */ + ident_len += 1; + ident -= 1; + if ((ident_len == 2) && + (ident[0] > 0) && (ident[0] < 27)) + { + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER); + od->v_len = sizeof(u32_t); + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("icmp_get_object_def: no scalar\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +static void +icmp_get_value(struct obj_def *od, u16_t len, void *value) +{ + u32_t *uint_ptr = (u32_t*)value; + u8_t id; + + LWIP_UNUSED_ARG(len); + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 1: /* icmpInMsgs */ + *uint_ptr = icmpinmsgs; + break; + case 2: /* icmpInErrors */ + *uint_ptr = icmpinerrors; + break; + case 3: /* icmpInDestUnreachs */ + *uint_ptr = icmpindestunreachs; + break; + case 4: /* icmpInTimeExcds */ + *uint_ptr = icmpintimeexcds; + break; + case 5: /* icmpInParmProbs */ + *uint_ptr = icmpinparmprobs; + break; + case 6: /* icmpInSrcQuenchs */ + *uint_ptr = icmpinsrcquenchs; + break; + case 7: /* icmpInRedirects */ + *uint_ptr = icmpinredirects; + break; + case 8: /* icmpInEchos */ + *uint_ptr = icmpinechos; + break; + case 9: /* icmpInEchoReps */ + *uint_ptr = icmpinechoreps; + break; + case 10: /* icmpInTimestamps */ + *uint_ptr = icmpintimestamps; + break; + case 11: /* icmpInTimestampReps */ + *uint_ptr = icmpintimestampreps; + break; + case 12: /* icmpInAddrMasks */ + *uint_ptr = icmpinaddrmasks; + break; + case 13: /* icmpInAddrMaskReps */ + *uint_ptr = icmpinaddrmaskreps; + break; + case 14: /* icmpOutMsgs */ + *uint_ptr = icmpoutmsgs; + break; + case 15: /* icmpOutErrors */ + *uint_ptr = icmpouterrors; + break; + case 16: /* icmpOutDestUnreachs */ + *uint_ptr = icmpoutdestunreachs; + break; + case 17: /* icmpOutTimeExcds */ + *uint_ptr = icmpouttimeexcds; + break; + case 18: /* icmpOutParmProbs */ + *uint_ptr = icmpoutparmprobs; + break; + case 19: /* icmpOutSrcQuenchs */ + *uint_ptr = icmpoutsrcquenchs; + break; + case 20: /* icmpOutRedirects */ + *uint_ptr = icmpoutredirects; + break; + case 21: /* icmpOutEchos */ + *uint_ptr = icmpoutechos; + break; + case 22: /* icmpOutEchoReps */ + *uint_ptr = icmpoutechoreps; + break; + case 23: /* icmpOutTimestamps */ + *uint_ptr = icmpouttimestamps; + break; + case 24: /* icmpOutTimestampReps */ + *uint_ptr = icmpouttimestampreps; + break; + case 25: /* icmpOutAddrMasks */ + *uint_ptr = icmpoutaddrmasks; + break; + case 26: /* icmpOutAddrMaskReps */ + *uint_ptr = icmpoutaddrmaskreps; + break; + } +} + +#if LWIP_TCP +/** @todo tcp grp */ +static void +tcp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + u8_t id; + + /* return to object name, adding index depth (1) */ + ident_len += 1; + ident -= 1; + if (ident_len == 2) + { + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff)); + id = (u8_t)ident[0]; + LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def tcp.%"U16_F".0\n",(u16_t)id)); + + switch (id) + { + case 1: /* tcpRtoAlgorithm */ + case 2: /* tcpRtoMin */ + case 3: /* tcpRtoMax */ + case 4: /* tcpMaxConn */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + case 5: /* tcpActiveOpens */ + case 6: /* tcpPassiveOpens */ + case 7: /* tcpAttemptFails */ + case 8: /* tcpEstabResets */ + case 10: /* tcpInSegs */ + case 11: /* tcpOutSegs */ + case 12: /* tcpRetransSegs */ + case 14: /* tcpInErrs */ + case 15: /* tcpOutRsts */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER); + od->v_len = sizeof(u32_t); + break; + case 9: /* tcpCurrEstab */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE); + od->v_len = sizeof(u32_t); + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcp_get_object_def: no such object\n")); + od->instance = MIB_OBJECT_NONE; + break; + }; + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcp_get_object_def: no scalar\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +static void +tcp_get_value(struct obj_def *od, u16_t len, void *value) +{ + u32_t *uint_ptr = (u32_t*)value; + s32_t *sint_ptr = (s32_t*)value; + u8_t id; + + LWIP_UNUSED_ARG(len); + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 1: /* tcpRtoAlgorithm, vanj(4) */ + *sint_ptr = 4; + break; + case 2: /* tcpRtoMin */ + /* @todo not the actual value, a guess, + needs to be calculated */ + *sint_ptr = 1000; + break; + case 3: /* tcpRtoMax */ + /* @todo not the actual value, a guess, + needs to be calculated */ + *sint_ptr = 60000; + break; + case 4: /* tcpMaxConn */ + *sint_ptr = MEMP_NUM_TCP_PCB; + break; + case 5: /* tcpActiveOpens */ + *uint_ptr = tcpactiveopens; + break; + case 6: /* tcpPassiveOpens */ + *uint_ptr = tcppassiveopens; + break; + case 7: /* tcpAttemptFails */ + *uint_ptr = tcpattemptfails; + break; + case 8: /* tcpEstabResets */ + *uint_ptr = tcpestabresets; + break; + case 9: /* tcpCurrEstab */ + { + u16_t tcpcurrestab = 0; + struct tcp_pcb *pcb = tcp_active_pcbs; + while (pcb != NULL) + { + if ((pcb->state == ESTABLISHED) || + (pcb->state == CLOSE_WAIT)) + { + tcpcurrestab++; + } + pcb = pcb->next; + } + *uint_ptr = tcpcurrestab; + } + break; + case 10: /* tcpInSegs */ + *uint_ptr = tcpinsegs; + break; + case 11: /* tcpOutSegs */ + *uint_ptr = tcpoutsegs; + break; + case 12: /* tcpRetransSegs */ + *uint_ptr = tcpretranssegs; + break; + case 14: /* tcpInErrs */ + *uint_ptr = tcpinerrs; + break; + case 15: /* tcpOutRsts */ + *uint_ptr = tcpoutrsts; + break; + } +} +#ifdef THIS_SEEMS_UNUSED +static void +tcpconnentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + /* return to object name, adding index depth (10) */ + ident_len += 10; + ident -= 10; + + if (ident_len == 11) + { + u8_t id; + + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + id = ident[0]; + LWIP_DEBUGF(SNMP_MIB_DEBUG,("get_object_def tcp.%"U16_F".0\n",(u16_t)id)); + + switch (id) + { + case 1: /* tcpConnState */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + case 2: /* tcpConnLocalAddress */ + case 4: /* tcpConnRemAddress */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR); + od->v_len = 4; + break; + case 3: /* tcpConnLocalPort */ + case 5: /* tcpConnRemPort */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcpconnentry_get_object_def: no such object\n")); + od->instance = MIB_OBJECT_NONE; + break; + }; + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("tcpconnentry_get_object_def: no such object\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +static void +tcpconnentry_get_value(struct obj_def *od, u16_t len, void *value) +{ + ip_addr_t lip, rip; + u16_t lport, rport; + s32_t *ident; + + ident = od->id_inst_ptr; + snmp_oidtoip(&ident[1], &lip); + lport = ident[5]; + snmp_oidtoip(&ident[6], &rip); + rport = ident[10]; + + /** @todo find matching PCB */ +} +#endif /* if 0 */ +#endif + +static void +udp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + /* return to object name, adding index depth (1) */ + ident_len += 1; + ident -= 1; + if ((ident_len == 2) && + (ident[0] > 0) && (ident[0] < 6)) + { + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER); + od->v_len = sizeof(u32_t); + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("udp_get_object_def: no scalar\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +static void +udp_get_value(struct obj_def *od, u16_t len, void *value) +{ + u32_t *uint_ptr = (u32_t*)value; + u8_t id; + + LWIP_UNUSED_ARG(len); + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 1: /* udpInDatagrams */ + *uint_ptr = udpindatagrams; + break; + case 2: /* udpNoPorts */ + *uint_ptr = udpnoports; + break; + case 3: /* udpInErrors */ + *uint_ptr = udpinerrors; + break; + case 4: /* udpOutDatagrams */ + *uint_ptr = udpoutdatagrams; + break; + } +} + +static void +udpentry_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + /* return to object name, adding index depth (5) */ + ident_len += 5; + ident -= 5; + + if (ident_len == 6) + { + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + switch (ident[0]) + { + case 1: /* udpLocalAddress */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR); + od->v_len = 4; + break; + case 2: /* udpLocalPort */ + od->instance = MIB_OBJECT_TAB; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG,("udpentry_get_object_def: no such object\n")); + od->instance = MIB_OBJECT_NONE; + break; + } + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("udpentry_get_object_def: no scalar\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +static void +udpentry_get_value(struct obj_def *od, u16_t len, void *value) +{ + u8_t id; + struct udp_pcb *pcb; + ip_addr_t ip; + u16_t port; + + LWIP_UNUSED_ARG(len); + snmp_oidtoip(&od->id_inst_ptr[1], &ip); + LWIP_ASSERT("invalid port", (od->id_inst_ptr[5] >= 0) && (od->id_inst_ptr[5] <= 0xffff)); + port = (u16_t)od->id_inst_ptr[5]; + + pcb = udp_pcbs; + while ((pcb != NULL) && + !(ip_addr_cmp(&pcb->local_ip, &ip) && + (pcb->local_port == port))) + { + pcb = pcb->next; + } + + if (pcb != NULL) + { + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 1: /* udpLocalAddress */ + { + ip_addr_t *dst = (ip_addr_t*)value; + *dst = pcb->local_ip; + } + break; + case 2: /* udpLocalPort */ + { + s32_t *sint_ptr = (s32_t*)value; + *sint_ptr = pcb->local_port; + } + break; + } + } +} + +static void +snmp_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od) +{ + /* return to object name, adding index depth (1) */ + ident_len += 1; + ident -= 1; + if (ident_len == 2) + { + u8_t id; + + od->id_inst_len = ident_len; + od->id_inst_ptr = ident; + + LWIP_ASSERT("invalid id", (ident[0] >= 0) && (ident[0] <= 0xff)); + id = (u8_t)ident[0]; + switch (id) + { + case 1: /* snmpInPkts */ + case 2: /* snmpOutPkts */ + case 3: /* snmpInBadVersions */ + case 4: /* snmpInBadCommunityNames */ + case 5: /* snmpInBadCommunityUses */ + case 6: /* snmpInASNParseErrs */ + case 8: /* snmpInTooBigs */ + case 9: /* snmpInNoSuchNames */ + case 10: /* snmpInBadValues */ + case 11: /* snmpInReadOnlys */ + case 12: /* snmpInGenErrs */ + case 13: /* snmpInTotalReqVars */ + case 14: /* snmpInTotalSetVars */ + case 15: /* snmpInGetRequests */ + case 16: /* snmpInGetNexts */ + case 17: /* snmpInSetRequests */ + case 18: /* snmpInGetResponses */ + case 19: /* snmpInTraps */ + case 20: /* snmpOutTooBigs */ + case 21: /* snmpOutNoSuchNames */ + case 22: /* snmpOutBadValues */ + case 24: /* snmpOutGenErrs */ + case 25: /* snmpOutGetRequests */ + case 26: /* snmpOutGetNexts */ + case 27: /* snmpOutSetRequests */ + case 28: /* snmpOutGetResponses */ + case 29: /* snmpOutTraps */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_ONLY; + od->asn_type = (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER); + od->v_len = sizeof(u32_t); + break; + case 30: /* snmpEnableAuthenTraps */ + od->instance = MIB_OBJECT_SCALAR; + od->access = MIB_OBJECT_READ_WRITE; + od->asn_type = (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG); + od->v_len = sizeof(s32_t); + break; + default: + LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_get_object_def: no such object\n")); + od->instance = MIB_OBJECT_NONE; + break; + }; + } + else + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("snmp_get_object_def: no scalar\n")); + od->instance = MIB_OBJECT_NONE; + } +} + +static void +snmp_get_value(struct obj_def *od, u16_t len, void *value) +{ + u32_t *uint_ptr = (u32_t*)value; + u8_t id; + + LWIP_UNUSED_ARG(len); + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + switch (id) + { + case 1: /* snmpInPkts */ + *uint_ptr = snmpinpkts; + break; + case 2: /* snmpOutPkts */ + *uint_ptr = snmpoutpkts; + break; + case 3: /* snmpInBadVersions */ + *uint_ptr = snmpinbadversions; + break; + case 4: /* snmpInBadCommunityNames */ + *uint_ptr = snmpinbadcommunitynames; + break; + case 5: /* snmpInBadCommunityUses */ + *uint_ptr = snmpinbadcommunityuses; + break; + case 6: /* snmpInASNParseErrs */ + *uint_ptr = snmpinasnparseerrs; + break; + case 8: /* snmpInTooBigs */ + *uint_ptr = snmpintoobigs; + break; + case 9: /* snmpInNoSuchNames */ + *uint_ptr = snmpinnosuchnames; + break; + case 10: /* snmpInBadValues */ + *uint_ptr = snmpinbadvalues; + break; + case 11: /* snmpInReadOnlys */ + *uint_ptr = snmpinreadonlys; + break; + case 12: /* snmpInGenErrs */ + *uint_ptr = snmpingenerrs; + break; + case 13: /* snmpInTotalReqVars */ + *uint_ptr = snmpintotalreqvars; + break; + case 14: /* snmpInTotalSetVars */ + *uint_ptr = snmpintotalsetvars; + break; + case 15: /* snmpInGetRequests */ + *uint_ptr = snmpingetrequests; + break; + case 16: /* snmpInGetNexts */ + *uint_ptr = snmpingetnexts; + break; + case 17: /* snmpInSetRequests */ + *uint_ptr = snmpinsetrequests; + break; + case 18: /* snmpInGetResponses */ + *uint_ptr = snmpingetresponses; + break; + case 19: /* snmpInTraps */ + *uint_ptr = snmpintraps; + break; + case 20: /* snmpOutTooBigs */ + *uint_ptr = snmpouttoobigs; + break; + case 21: /* snmpOutNoSuchNames */ + *uint_ptr = snmpoutnosuchnames; + break; + case 22: /* snmpOutBadValues */ + *uint_ptr = snmpoutbadvalues; + break; + case 24: /* snmpOutGenErrs */ + *uint_ptr = snmpoutgenerrs; + break; + case 25: /* snmpOutGetRequests */ + *uint_ptr = snmpoutgetrequests; + break; + case 26: /* snmpOutGetNexts */ + *uint_ptr = snmpoutgetnexts; + break; + case 27: /* snmpOutSetRequests */ + *uint_ptr = snmpoutsetrequests; + break; + case 28: /* snmpOutGetResponses */ + *uint_ptr = snmpoutgetresponses; + break; + case 29: /* snmpOutTraps */ + *uint_ptr = snmpouttraps; + break; + case 30: /* snmpEnableAuthenTraps */ + *uint_ptr = *snmpenableauthentraps_ptr; + break; + }; +} + +/** + * Test snmp object value before setting. + * + * @param od is the object definition + * @param len return value space (in bytes) + * @param value points to (varbind) space to copy value from. + */ +static u8_t +snmp_set_test(struct obj_def *od, u16_t len, void *value) +{ + u8_t id, set_ok; + + LWIP_UNUSED_ARG(len); + set_ok = 0; + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + if (id == 30) + { + /* snmpEnableAuthenTraps */ + s32_t *sint_ptr = (s32_t*)value; + + if (snmpenableauthentraps_ptr != &snmpenableauthentraps_default) + { + /* we should have writable non-volatile mem here */ + if ((*sint_ptr == 1) || (*sint_ptr == 2)) + { + set_ok = 1; + } + } + else + { + /* const or hardwired value */ + if (*sint_ptr == snmpenableauthentraps_default) + { + set_ok = 1; + } + } + } + return set_ok; +} + +static void +snmp_set_value(struct obj_def *od, u16_t len, void *value) +{ + u8_t id; + + LWIP_UNUSED_ARG(len); + LWIP_ASSERT("invalid id", (od->id_inst_ptr[0] >= 0) && (od->id_inst_ptr[0] <= 0xff)); + id = (u8_t)od->id_inst_ptr[0]; + if (id == 30) + { + /* snmpEnableAuthenTraps */ + /* @todo @fixme: which kind of pointer is 'value'? s32_t or u8_t??? */ + u8_t *ptr = (u8_t*)value; + *snmpenableauthentraps_ptr = *ptr; + } +} + +#endif /* LWIP_SNMP */ diff --git a/third_party/lwip-1.4.1/src/core/snmp/mib_structs.c b/third_party/lwip-1.4.1/src/core/snmp/mib_structs.c new file mode 100644 index 0000000..cffbc70 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/snmp/mib_structs.c @@ -0,0 +1,1174 @@ +/** + * @file + * MIB tree access/construction functions. + */ + +/* + * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Christiaan Simons + */ + +#include "lwip/opt.h" + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/snmp_structs.h" +#include "lwip/memp.h" +#include "lwip/netif.h" + +/** .iso.org.dod.internet address prefix, @see snmp_iso_*() */ +const s32_t prefix[4] = {1, 3, 6, 1}; + +#define NODE_STACK_SIZE (LWIP_SNMP_OBJ_ID_LEN) +/** node stack entry (old news?) */ +struct nse +{ + /** right child */ + struct mib_node* r_ptr; + /** right child identifier */ + s32_t r_id; + /** right child next level */ + u8_t r_nl; +}; +static u8_t node_stack_cnt; +static struct nse node_stack[NODE_STACK_SIZE]; + +/** + * Pushes nse struct onto stack. + */ +static void +push_node(struct nse* node) +{ + LWIP_ASSERT("node_stack_cnt < NODE_STACK_SIZE",node_stack_cnt < NODE_STACK_SIZE); + LWIP_DEBUGF(SNMP_MIB_DEBUG,("push_node() node=%p id=%"S32_F"\n",(void*)(node->r_ptr),node->r_id)); + if (node_stack_cnt < NODE_STACK_SIZE) + { + node_stack[node_stack_cnt] = *node; + node_stack_cnt++; + } +} + +/** + * Pops nse struct from stack. + */ +static void +pop_node(struct nse* node) +{ + if (node_stack_cnt > 0) + { + node_stack_cnt--; + *node = node_stack[node_stack_cnt]; + } + LWIP_DEBUGF(SNMP_MIB_DEBUG,("pop_node() node=%p id=%"S32_F"\n",(void *)(node->r_ptr),node->r_id)); +} + +/** + * Conversion from ifIndex to lwIP netif + * @param ifindex is a s32_t object sub-identifier + * @param netif points to returned netif struct pointer + */ +void +snmp_ifindextonetif(s32_t ifindex, struct netif **netif) +{ + struct netif *nif = netif_list; + s32_t i, ifidx; + + ifidx = ifindex - 1; + i = 0; + while ((nif != NULL) && (i < ifidx)) + { + nif = nif->next; + i++; + } + *netif = nif; +} + +/** + * Conversion from lwIP netif to ifIndex + * @param netif points to a netif struct + * @param ifidx points to s32_t object sub-identifier + */ +void +snmp_netiftoifindex(struct netif *netif, s32_t *ifidx) +{ + struct netif *nif = netif_list; + u16_t i; + + i = 0; + while ((nif != NULL) && (nif != netif)) + { + nif = nif->next; + i++; + } + *ifidx = i+1; +} + +/** + * Conversion from oid to lwIP ip_addr + * @param ident points to s32_t ident[4] input + * @param ip points to output struct + */ +void +snmp_oidtoip(s32_t *ident, ip_addr_t *ip) +{ + IP4_ADDR(ip, ident[0], ident[1], ident[2], ident[3]); +} + +/** + * Conversion from lwIP ip_addr to oid + * @param ip points to input struct + * @param ident points to s32_t ident[4] output + */ +void +snmp_iptooid(ip_addr_t *ip, s32_t *ident) +{ + ident[0] = ip4_addr1(ip); + ident[1] = ip4_addr2(ip); + ident[2] = ip4_addr3(ip); + ident[3] = ip4_addr4(ip); +} + +struct mib_list_node * +snmp_mib_ln_alloc(s32_t id) +{ + struct mib_list_node *ln; + + ln = (struct mib_list_node *)memp_malloc(MEMP_SNMP_NODE); + if (ln != NULL) + { + ln->prev = NULL; + ln->next = NULL; + ln->objid = id; + ln->nptr = NULL; + } + return ln; +} + +void +snmp_mib_ln_free(struct mib_list_node *ln) +{ + memp_free(MEMP_SNMP_NODE, ln); +} + +struct mib_list_rootnode * +snmp_mib_lrn_alloc(void) +{ + struct mib_list_rootnode *lrn; + + lrn = (struct mib_list_rootnode*)memp_malloc(MEMP_SNMP_ROOTNODE); + if (lrn != NULL) + { + lrn->get_object_def = noleafs_get_object_def; + lrn->get_value = noleafs_get_value; + lrn->set_test = noleafs_set_test; + lrn->set_value = noleafs_set_value; + lrn->node_type = MIB_NODE_LR; + lrn->maxlength = 0; + lrn->head = NULL; + lrn->tail = NULL; + lrn->count = 0; + } + return lrn; +} + +void +snmp_mib_lrn_free(struct mib_list_rootnode *lrn) +{ + memp_free(MEMP_SNMP_ROOTNODE, lrn); +} + +/** + * Inserts node in idx list in a sorted + * (ascending order) fashion and + * allocates the node if needed. + * + * @param rn points to the root node + * @param objid is the object sub identifier + * @param insn points to a pointer to the inserted node + * used for constructing the tree. + * @return -1 if failed, 1 if inserted, 2 if present. + */ +s8_t +snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn) +{ + struct mib_list_node *nn; + s8_t insert; + + LWIP_ASSERT("rn != NULL",rn != NULL); + + /* -1 = malloc failure, 0 = not inserted, 1 = inserted, 2 = was present */ + insert = 0; + if (rn->head == NULL) + { + /* empty list, add first node */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc empty list objid==%"S32_F"\n",objid)); + nn = snmp_mib_ln_alloc(objid); + if (nn != NULL) + { + rn->head = nn; + rn->tail = nn; + *insn = nn; + insert = 1; + } + else + { + insert = -1; + } + } + else + { + struct mib_list_node *n; + /* at least one node is present */ + n = rn->head; + while ((n != NULL) && (insert == 0)) + { + if (n->objid == objid) + { + /* node is already there */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("node already there objid==%"S32_F"\n",objid)); + *insn = n; + insert = 2; + } + else if (n->objid < objid) + { + if (n->next == NULL) + { + /* alloc and insert at the tail */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins tail objid==%"S32_F"\n",objid)); + nn = snmp_mib_ln_alloc(objid); + if (nn != NULL) + { + nn->next = NULL; + nn->prev = n; + n->next = nn; + rn->tail = nn; + *insn = nn; + insert = 1; + } + else + { + /* insertion failure */ + insert = -1; + } + } + else + { + /* there's more to explore: traverse list */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("traverse list\n")); + n = n->next; + } + } + else + { + /* n->objid > objid */ + /* alloc and insert between n->prev and n */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("alloc ins n->prev, objid==%"S32_F", n\n",objid)); + nn = snmp_mib_ln_alloc(objid); + if (nn != NULL) + { + if (n->prev == NULL) + { + /* insert at the head */ + nn->next = n; + nn->prev = NULL; + rn->head = nn; + n->prev = nn; + } + else + { + /* insert in the middle */ + nn->next = n; + nn->prev = n->prev; + n->prev->next = nn; + n->prev = nn; + } + *insn = nn; + insert = 1; + } + else + { + /* insertion failure */ + insert = -1; + } + } + } + } + if (insert == 1) + { + rn->count += 1; + } + LWIP_ASSERT("insert != 0",insert != 0); + return insert; +} + +/** + * Finds node in idx list and returns deletion mark. + * + * @param rn points to the root node + * @param objid is the object sub identifier + * @param fn returns pointer to found node + * @return 0 if not found, 1 if deletable, + * 2 can't delete (2 or more children), 3 not a list_node + */ +s8_t +snmp_mib_node_find(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **fn) +{ + s8_t fc; + struct mib_list_node *n; + + LWIP_ASSERT("rn != NULL",rn != NULL); + n = rn->head; + while ((n != NULL) && (n->objid != objid)) + { + n = n->next; + } + if (n == NULL) + { + fc = 0; + } + else if (n->nptr == NULL) + { + /* leaf, can delete node */ + fc = 1; + } + else + { + struct mib_list_rootnode *r; + + if (n->nptr->node_type == MIB_NODE_LR) + { + r = (struct mib_list_rootnode *)n->nptr; + if (r->count > 1) + { + /* can't delete node */ + fc = 2; + } + else + { + /* count <= 1, can delete node */ + fc = 1; + } + } + else + { + /* other node type */ + fc = 3; + } + } + *fn = n; + return fc; +} + +/** + * Removes node from idx list + * if it has a single child left. + * + * @param rn points to the root node + * @param n points to the node to delete + * @return the nptr to be freed by caller + */ +struct mib_list_rootnode * +snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n) +{ + struct mib_list_rootnode *next; + + LWIP_ASSERT("rn != NULL",rn != NULL); + LWIP_ASSERT("n != NULL",n != NULL); + + /* caller must remove this sub-tree */ + next = (struct mib_list_rootnode*)(n->nptr); + rn->count -= 1; + + if (n == rn->head) + { + rn->head = n->next; + if (n->next != NULL) + { + /* not last node, new list begin */ + n->next->prev = NULL; + } + } + else if (n == rn->tail) + { + rn->tail = n->prev; + if (n->prev != NULL) + { + /* not last node, new list end */ + n->prev->next = NULL; + } + } + else + { + /* node must be in the middle */ + n->prev->next = n->next; + n->next->prev = n->prev; + } + LWIP_DEBUGF(SNMP_MIB_DEBUG,("free list objid==%"S32_F"\n",n->objid)); + snmp_mib_ln_free(n); + if (rn->count == 0) + { + rn->head = NULL; + rn->tail = NULL; + } + return next; +} + + + +/** + * Searches tree for the supplied (scalar?) object identifier. + * + * @param node points to the root of the tree ('.internet') + * @param ident_len the length of the supplied object identifier + * @param ident points to the array of sub identifiers + * @param np points to the found object instance (return) + * @return pointer to the requested parent (!) node if success, NULL otherwise + */ +struct mib_node * +snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np) +{ + u8_t node_type, ext_level; + + ext_level = 0; + LWIP_DEBUGF(SNMP_MIB_DEBUG,("node==%p *ident==%"S32_F"\n",(void*)node,*ident)); + while (node != NULL) + { + node_type = node->node_type; + if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA)) + { + struct mib_array_node *an; + u16_t i; + + if (ident_len > 0) + { + /* array node (internal ROM or RAM, fixed length) */ + an = (struct mib_array_node *)node; + i = 0; + while ((i < an->maxlength) && (an->objid[i] != *ident)) + { + i++; + } + if (i < an->maxlength) + { + /* found it, if available proceed to child, otherwise inspect leaf */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident)); + if (an->nptr[i] == NULL) + { + /* a scalar leaf OR table, + inspect remaining instance number / table index */ + np->ident_len = ident_len; + np->ident = ident; + return (struct mib_node*)an; + } + else + { + /* follow next child pointer */ + ident++; + ident_len--; + node = an->nptr[i]; + } + } + else + { + /* search failed, identifier mismatch (nosuchname) */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("an search failed *ident==%"S32_F"\n",*ident)); + return NULL; + } + } + else + { + /* search failed, short object identifier (nosuchname) */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("an search failed, short object identifier\n")); + return NULL; + } + } + else if(node_type == MIB_NODE_LR) + { + struct mib_list_rootnode *lrn; + struct mib_list_node *ln; + + if (ident_len > 0) + { + /* list root node (internal 'RAM', variable length) */ + lrn = (struct mib_list_rootnode *)node; + ln = lrn->head; + /* iterate over list, head to tail */ + while ((ln != NULL) && (ln->objid != *ident)) + { + ln = ln->next; + } + if (ln != NULL) + { + /* found it, proceed to child */; + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident)); + if (ln->nptr == NULL) + { + np->ident_len = ident_len; + np->ident = ident; + return (struct mib_node*)lrn; + } + else + { + /* follow next child pointer */ + ident_len--; + ident++; + node = ln->nptr; + } + } + else + { + /* search failed */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln search failed *ident==%"S32_F"\n",*ident)); + return NULL; + } + } + else + { + /* search failed, short object identifier (nosuchname) */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln search failed, short object identifier\n")); + return NULL; + } + } + else if(node_type == MIB_NODE_EX) + { + struct mib_external_node *en; + u16_t i, len; + + if (ident_len > 0) + { + /* external node (addressing and access via functions) */ + en = (struct mib_external_node *)node; + + i = 0; + len = en->level_length(en->addr_inf,ext_level); + while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) != 0)) + { + i++; + } + if (i < len) + { + s32_t debug_id; + + en->get_objid(en->addr_inf,ext_level,i,&debug_id); + LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid==%"S32_F" *ident==%"S32_F"\n",debug_id,*ident)); + if ((ext_level + 1) == en->tree_levels) + { + np->ident_len = ident_len; + np->ident = ident; + return (struct mib_node*)en; + } + else + { + /* found it, proceed to child */ + ident_len--; + ident++; + ext_level++; + } + } + else + { + /* search failed */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("en search failed *ident==%"S32_F"\n",*ident)); + return NULL; + } + } + else + { + /* search failed, short object identifier (nosuchname) */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("en search failed, short object identifier\n")); + return NULL; + } + } + else if (node_type == MIB_NODE_SC) + { + mib_scalar_node *sn; + + sn = (mib_scalar_node *)node; + if ((ident_len == 1) && (*ident == 0)) + { + np->ident_len = ident_len; + np->ident = ident; + return (struct mib_node*)sn; + } + else + { + /* search failed, short object identifier (nosuchname) */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed, invalid object identifier length\n")); + return NULL; + } + } + else + { + /* unknown node_type */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node_type %"U16_F" unkown\n",(u16_t)node_type)); + return NULL; + } + } + /* done, found nothing */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("search failed node==%p\n",(void*)node)); + return NULL; +} + +/** + * Test table for presence of at least one table entry. + */ +static u8_t +empty_table(struct mib_node *node) +{ + u8_t node_type; + u8_t empty = 0; + + if (node != NULL) + { + node_type = node->node_type; + if (node_type == MIB_NODE_LR) + { + struct mib_list_rootnode *lrn; + lrn = (struct mib_list_rootnode *)node; + if ((lrn->count == 0) || (lrn->head == NULL)) + { + empty = 1; + } + } + else if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA)) + { + struct mib_array_node *an; + an = (struct mib_array_node *)node; + if ((an->maxlength == 0) || (an->nptr == NULL)) + { + empty = 1; + } + } + else if (node_type == MIB_NODE_EX) + { + struct mib_external_node *en; + en = (struct mib_external_node *)node; + if (en->tree_levels == 0) + { + empty = 1; + } + } + } + return empty; +} + +/** + * Tree expansion. + */ +struct mib_node * +snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret) +{ + u8_t node_type, ext_level, climb_tree; + + ext_level = 0; + /* reset node stack */ + node_stack_cnt = 0; + while (node != NULL) + { + climb_tree = 0; + node_type = node->node_type; + if ((node_type == MIB_NODE_AR) || (node_type == MIB_NODE_RA)) + { + struct mib_array_node *an; + u16_t i; + + /* array node (internal ROM or RAM, fixed length) */ + an = (struct mib_array_node *)node; + if (ident_len > 0) + { + i = 0; + while ((i < an->maxlength) && (an->objid[i] < *ident)) + { + i++; + } + if (i < an->maxlength) + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("an->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,an->objid[i],*ident)); + /* add identifier to oidret */ + oidret->id[oidret->len] = an->objid[i]; + (oidret->len)++; + + if (an->nptr[i] == NULL) + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n")); + /* leaf node (e.g. in a fixed size table) */ + if (an->objid[i] > *ident) + { + return (struct mib_node*)an; + } + else if ((i + 1) < an->maxlength) + { + /* an->objid[i] == *ident */ + (oidret->len)--; + oidret->id[oidret->len] = an->objid[i + 1]; + (oidret->len)++; + return (struct mib_node*)an; + } + else + { + /* (i + 1) == an->maxlength */ + (oidret->len)--; + climb_tree = 1; + } + } + else + { + u8_t j; + struct nse cur_node; + + LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n")); + /* non-leaf, store right child ptr and id */ + LWIP_ASSERT("i < 0xff", i < 0xff); + j = (u8_t)i + 1; + while ((j < an->maxlength) && (empty_table(an->nptr[j]))) + { + j++; + } + if (j < an->maxlength) + { + cur_node.r_ptr = an->nptr[j]; + cur_node.r_id = an->objid[j]; + cur_node.r_nl = 0; + } + else + { + cur_node.r_ptr = NULL; + } + push_node(&cur_node); + if (an->objid[i] == *ident) + { + ident_len--; + ident++; + } + else + { + /* an->objid[i] < *ident */ + ident_len = 0; + } + /* follow next child pointer */ + node = an->nptr[i]; + } + } + else + { + /* i == an->maxlength */ + climb_tree = 1; + } + } + else + { + u8_t j; + /* ident_len == 0, complete with leftmost '.thing' */ + j = 0; + while ((j < an->maxlength) && empty_table(an->nptr[j])) + { + j++; + } + if (j < an->maxlength) + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("left an->objid[j]==%"S32_F"\n",an->objid[j])); + oidret->id[oidret->len] = an->objid[j]; + (oidret->len)++; + if (an->nptr[j] == NULL) + { + /* leaf node */ + return (struct mib_node*)an; + } + else + { + /* no leaf, continue */ + node = an->nptr[j]; + } + } + else + { + /* j == an->maxlength */ + climb_tree = 1; + } + } + } + else if(node_type == MIB_NODE_LR) + { + struct mib_list_rootnode *lrn; + struct mib_list_node *ln; + + /* list root node (internal 'RAM', variable length) */ + lrn = (struct mib_list_rootnode *)node; + if (ident_len > 0) + { + ln = lrn->head; + /* iterate over list, head to tail */ + while ((ln != NULL) && (ln->objid < *ident)) + { + ln = ln->next; + } + if (ln != NULL) + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("ln->objid==%"S32_F" *ident==%"S32_F"\n",ln->objid,*ident)); + oidret->id[oidret->len] = ln->objid; + (oidret->len)++; + if (ln->nptr == NULL) + { + /* leaf node */ + if (ln->objid > *ident) + { + return (struct mib_node*)lrn; + } + else if (ln->next != NULL) + { + /* ln->objid == *ident */ + (oidret->len)--; + oidret->id[oidret->len] = ln->next->objid; + (oidret->len)++; + return (struct mib_node*)lrn; + } + else + { + /* ln->next == NULL */ + (oidret->len)--; + climb_tree = 1; + } + } + else + { + struct mib_list_node *jn; + struct nse cur_node; + + /* non-leaf, store right child ptr and id */ + jn = ln->next; + while ((jn != NULL) && empty_table(jn->nptr)) + { + jn = jn->next; + } + if (jn != NULL) + { + cur_node.r_ptr = jn->nptr; + cur_node.r_id = jn->objid; + cur_node.r_nl = 0; + } + else + { + cur_node.r_ptr = NULL; + } + push_node(&cur_node); + if (ln->objid == *ident) + { + ident_len--; + ident++; + } + else + { + /* ln->objid < *ident */ + ident_len = 0; + } + /* follow next child pointer */ + node = ln->nptr; + } + + } + else + { + /* ln == NULL */ + climb_tree = 1; + } + } + else + { + struct mib_list_node *jn; + /* ident_len == 0, complete with leftmost '.thing' */ + jn = lrn->head; + while ((jn != NULL) && empty_table(jn->nptr)) + { + jn = jn->next; + } + if (jn != NULL) + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("left jn->objid==%"S32_F"\n",jn->objid)); + oidret->id[oidret->len] = jn->objid; + (oidret->len)++; + if (jn->nptr == NULL) + { + /* leaf node */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("jn->nptr == NULL\n")); + return (struct mib_node*)lrn; + } + else + { + /* no leaf, continue */ + node = jn->nptr; + } + } + else + { + /* jn == NULL */ + climb_tree = 1; + } + } + } + else if(node_type == MIB_NODE_EX) + { + struct mib_external_node *en; + s32_t ex_id; + + /* external node (addressing and access via functions) */ + en = (struct mib_external_node *)node; + if (ident_len > 0) + { + u16_t i, len; + + i = 0; + len = en->level_length(en->addr_inf,ext_level); + while ((i < len) && (en->ident_cmp(en->addr_inf,ext_level,i,*ident) < 0)) + { + i++; + } + if (i < len) + { + /* add identifier to oidret */ + en->get_objid(en->addr_inf,ext_level,i,&ex_id); + LWIP_DEBUGF(SNMP_MIB_DEBUG,("en->objid[%"U16_F"]==%"S32_F" *ident==%"S32_F"\n",i,ex_id,*ident)); + oidret->id[oidret->len] = ex_id; + (oidret->len)++; + + if ((ext_level + 1) == en->tree_levels) + { + LWIP_DEBUGF(SNMP_MIB_DEBUG,("leaf node\n")); + /* leaf node */ + if (ex_id > *ident) + { + return (struct mib_node*)en; + } + else if ((i + 1) < len) + { + /* ex_id == *ident */ + en->get_objid(en->addr_inf,ext_level,i + 1,&ex_id); + (oidret->len)--; + oidret->id[oidret->len] = ex_id; + (oidret->len)++; + return (struct mib_node*)en; + } + else + { + /* (i + 1) == len */ + (oidret->len)--; + climb_tree = 1; + } + } + else + { + u8_t j; + struct nse cur_node; + + LWIP_DEBUGF(SNMP_MIB_DEBUG,("non-leaf node\n")); + /* non-leaf, store right child ptr and id */ + LWIP_ASSERT("i < 0xff", i < 0xff); + j = (u8_t)i + 1; + if (j < len) + { + /* right node is the current external node */ + cur_node.r_ptr = node; + en->get_objid(en->addr_inf,ext_level,j,&cur_node.r_id); + cur_node.r_nl = ext_level + 1; + } + else + { + cur_node.r_ptr = NULL; + } + push_node(&cur_node); + if (en->ident_cmp(en->addr_inf,ext_level,i,*ident) == 0) + { + ident_len--; + ident++; + } + else + { + /* external id < *ident */ + ident_len = 0; + } + /* proceed to child */ + ext_level++; + } + } + else + { + /* i == len (en->level_len()) */ + climb_tree = 1; + } + } + else + { + /* ident_len == 0, complete with leftmost '.thing' */ + en->get_objid(en->addr_inf,ext_level,0,&ex_id); + LWIP_DEBUGF(SNMP_MIB_DEBUG,("left en->objid==%"S32_F"\n",ex_id)); + oidret->id[oidret->len] = ex_id; + (oidret->len)++; + if ((ext_level + 1) == en->tree_levels) + { + /* leaf node */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("(ext_level + 1) == en->tree_levels\n")); + return (struct mib_node*)en; + } + else + { + /* no leaf, proceed to child */ + ext_level++; + } + } + } + else if(node_type == MIB_NODE_SC) + { + mib_scalar_node *sn; + + /* scalar node */ + sn = (mib_scalar_node *)node; + if (ident_len > 0) + { + /* at .0 */ + climb_tree = 1; + } + else + { + /* ident_len == 0, complete object identifier */ + oidret->id[oidret->len] = 0; + (oidret->len)++; + /* leaf node */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("completed scalar leaf\n")); + return (struct mib_node*)sn; + } + } + else + { + /* unknown/unhandled node_type */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node_type %"U16_F" unkown\n",(u16_t)node_type)); + return NULL; + } + + if (climb_tree) + { + struct nse child; + + /* find right child ptr */ + child.r_ptr = NULL; + child.r_id = 0; + child.r_nl = 0; + while ((node_stack_cnt > 0) && (child.r_ptr == NULL)) + { + pop_node(&child); + /* trim returned oid */ + (oidret->len)--; + } + if (child.r_ptr != NULL) + { + /* incoming ident is useless beyond this point */ + ident_len = 0; + oidret->id[oidret->len] = child.r_id; + oidret->len++; + node = child.r_ptr; + ext_level = child.r_nl; + } + else + { + /* tree ends here ... */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed, tree ends here\n")); + return NULL; + } + } + } + /* done, found nothing */ + LWIP_DEBUGF(SNMP_MIB_DEBUG,("expand failed node==%p\n",(void*)node)); + return NULL; +} + +/** + * Test object identifier for the iso.org.dod.internet prefix. + * + * @param ident_len the length of the supplied object identifier + * @param ident points to the array of sub identifiers + * @return 1 if it matches, 0 otherwise + */ +u8_t +snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident) +{ + if ((ident_len > 3) && + (ident[0] == 1) && (ident[1] == 3) && + (ident[2] == 6) && (ident[3] == 1)) + { + return 1; + } + else + { + return 0; + } +} + +/** + * Expands object identifier to the iso.org.dod.internet + * prefix for use in getnext operation. + * + * @param ident_len the length of the supplied object identifier + * @param ident points to the array of sub identifiers + * @param oidret points to returned expanded object identifier + * @return 1 if it matches, 0 otherwise + * + * @note ident_len 0 is allowed, expanding to the first known object id!! + */ +u8_t +snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret) +{ + const s32_t *prefix_ptr; + s32_t *ret_ptr; + u8_t i; + + i = 0; + prefix_ptr = &prefix[0]; + ret_ptr = &oidret->id[0]; + ident_len = ((ident_len < 4)?ident_len:4); + while ((i < ident_len) && ((*ident) <= (*prefix_ptr))) + { + *ret_ptr++ = *prefix_ptr++; + ident++; + i++; + } + if (i == ident_len) + { + /* match, complete missing bits */ + while (i < 4) + { + *ret_ptr++ = *prefix_ptr++; + i++; + } + oidret->len = i; + return 1; + } + else + { + /* i != ident_len */ + return 0; + } +} + +#endif /* LWIP_SNMP */ diff --git a/third_party/lwip-1.4.1/src/core/snmp/msg_in.c b/third_party/lwip-1.4.1/src/core/snmp/msg_in.c new file mode 100644 index 0000000..2dfbdc9 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/snmp/msg_in.c @@ -0,0 +1,1453 @@ +/** + * @file + * SNMP input message processing (RFC1157). + */ + +/* + * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Christiaan Simons + */ + +#include "lwip/opt.h" + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/snmp.h" +#include "lwip/snmp_asn1.h" +#include "lwip/snmp_msg.h" +#include "lwip/snmp_structs.h" +#include "lwip/ip_addr.h" +#include "lwip/memp.h" +#include "lwip/udp.h" +#include "lwip/stats.h" + +#include + +/* public (non-static) constants */ +/** SNMP v1 == 0 */ +const s32_t snmp_version = 0; +/** default SNMP community string */ +const char snmp_publiccommunity[7] = "public"; + +/* statically allocated buffers for SNMP_CONCURRENT_REQUESTS */ +struct snmp_msg_pstat msg_input_list[SNMP_CONCURRENT_REQUESTS]; +/* UDP Protocol Control Block */ +struct udp_pcb *snmp1_pcb; + +static void snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port); +static err_t snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat); +static err_t snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat); + + +/** + * Starts SNMP Agent. + * Allocates UDP pcb and binds it to IP_ADDR_ANY port 161. + */ +void +snmp_init(void) +{ + struct snmp_msg_pstat *msg_ps; + u8_t i; + + snmp1_pcb = udp_new(); + if (snmp1_pcb != NULL) + { + udp_recv(snmp1_pcb, snmp_recv, (void *)SNMP_IN_PORT); + udp_bind(snmp1_pcb, IP_ADDR_ANY, SNMP_IN_PORT); + } + msg_ps = &msg_input_list[0]; + for (i=0; istate = SNMP_MSG_EMPTY; + msg_ps->error_index = 0; + msg_ps->error_status = SNMP_ES_NOERROR; + msg_ps++; + } + trap_msg.pcb = snmp1_pcb; + +#ifdef SNMP_PRIVATE_MIB_INIT + /* If defined, this must be a function-like define to initialize the + * private MIB after the stack has been initialized. + * The private MIB can also be initialized in tcpip_callback (or after + * the stack is initialized), this define is only for convenience. */ + SNMP_PRIVATE_MIB_INIT(); +#endif /* SNMP_PRIVATE_MIB_INIT */ + + /* The coldstart trap will only be output + if our outgoing interface is up & configured */ + snmp_coldstart_trap(); +} + +static void +snmp_error_response(struct snmp_msg_pstat *msg_ps, u8_t error) +{ + /* move names back from outvb to invb */ + int v; + struct snmp_varbind *vbi = msg_ps->invb.head; + struct snmp_varbind *vbo = msg_ps->outvb.head; + for (v=0; vvb_idx; v++) { + vbi->ident_len = vbo->ident_len; + vbo->ident_len = 0; + vbi->ident = vbo->ident; + vbo->ident = NULL; + vbi = vbi->next; + vbo = vbo->next; + } + /* free outvb */ + snmp_varbind_list_free(&msg_ps->outvb); + /* we send invb back */ + msg_ps->outvb = msg_ps->invb; + msg_ps->invb.head = NULL; + msg_ps->invb.tail = NULL; + msg_ps->invb.count = 0; + msg_ps->error_status = error; + /* error index must be 0 for error too big */ + msg_ps->error_index = (error != SNMP_ES_TOOBIG) ? (1 + msg_ps->vb_idx) : 0; + snmp_send_response(msg_ps); + snmp_varbind_list_free(&msg_ps->outvb); + msg_ps->state = SNMP_MSG_EMPTY; +} + +static void +snmp_ok_response(struct snmp_msg_pstat *msg_ps) +{ + err_t err_ret; + + err_ret = snmp_send_response(msg_ps); + if (err_ret == ERR_MEM) + { + /* serious memory problem, can't return tooBig */ + } + else + { + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event = %"S32_F"\n",msg_ps->error_status)); + } + /* free varbinds (if available) */ + snmp_varbind_list_free(&msg_ps->invb); + snmp_varbind_list_free(&msg_ps->outvb); + msg_ps->state = SNMP_MSG_EMPTY; +} + +/** + * Service an internal or external event for SNMP GET. + * + * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1) + * @param msg_ps points to the assosicated message process state + */ +static void +snmp_msg_get_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) +{ + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_get_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state)); + + if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF) + { + struct mib_external_node *en; + struct snmp_name_ptr np; + + /* get_object_def() answer*/ + en = msg_ps->ext_mib_node; + np = msg_ps->ext_name_ptr; + + /* translate answer into a known lifeform */ + en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def); + if ((msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) && + (msg_ps->ext_object_def.access & MIB_ACCESS_READ)) + { + msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE; + en->get_value_q(request_id, &msg_ps->ext_object_def); + } + else + { + en->get_object_def_pc(request_id, np.ident_len, np.ident); + /* search failed, object id points to unknown object (nosuchname) */ + snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME); + } + } + else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_VALUE) + { + struct mib_external_node *en; + struct snmp_varbind *vb; + + /* get_value() answer */ + en = msg_ps->ext_mib_node; + + /* allocate output varbind */ + vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND); + if (vb != NULL) + { + vb->next = NULL; + vb->prev = NULL; + + /* move name from invb to outvb */ + vb->ident = msg_ps->vb_ptr->ident; + vb->ident_len = msg_ps->vb_ptr->ident_len; + /* ensure this memory is refereced once only */ + msg_ps->vb_ptr->ident = NULL; + msg_ps->vb_ptr->ident_len = 0; + + vb->value_type = msg_ps->ext_object_def.asn_type; + LWIP_ASSERT("invalid length", msg_ps->ext_object_def.v_len <= 0xff); + vb->value_len = (u8_t)msg_ps->ext_object_def.v_len; + if (vb->value_len > 0) + { + LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low", vb->value_len <= SNMP_MAX_VALUE_SIZE); + vb->value = memp_malloc(MEMP_SNMP_VALUE); + if (vb->value != NULL) + { + en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value); + snmp_varbind_tail_add(&msg_ps->outvb, vb); + /* search again (if vb_idx < msg_ps->invb.count) */ + msg_ps->state = SNMP_MSG_SEARCH_OBJ; + msg_ps->vb_idx += 1; + } + else + { + en->get_value_pc(request_id, &msg_ps->ext_object_def); + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no variable space\n")); + msg_ps->vb_ptr->ident = vb->ident; + msg_ps->vb_ptr->ident_len = vb->ident_len; + memp_free(MEMP_SNMP_VARBIND, vb); + snmp_error_response(msg_ps,SNMP_ES_TOOBIG); + } + } + else + { + /* vb->value_len == 0, empty value (e.g. empty string) */ + en->get_value_a(request_id, &msg_ps->ext_object_def, 0, NULL); + vb->value = NULL; + snmp_varbind_tail_add(&msg_ps->outvb, vb); + /* search again (if vb_idx < msg_ps->invb.count) */ + msg_ps->state = SNMP_MSG_SEARCH_OBJ; + msg_ps->vb_idx += 1; + } + } + else + { + en->get_value_pc(request_id, &msg_ps->ext_object_def); + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: no outvb space\n")); + snmp_error_response(msg_ps,SNMP_ES_TOOBIG); + } + } + + while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) && + (msg_ps->vb_idx < msg_ps->invb.count)) + { + struct mib_node *mn; + struct snmp_name_ptr np; + + if (msg_ps->vb_idx == 0) + { + msg_ps->vb_ptr = msg_ps->invb.head; + } + else + { + msg_ps->vb_ptr = msg_ps->vb_ptr->next; + } + /** test object identifier for .iso.org.dod.internet prefix */ + if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident)) + { + mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4, + msg_ps->vb_ptr->ident + 4, &np); + if (mn != NULL) + { + if (mn->node_type == MIB_NODE_EX) + { + /* external object */ + struct mib_external_node *en = (struct mib_external_node*)mn; + + msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF; + /* save en && args in msg_ps!! */ + msg_ps->ext_mib_node = en; + msg_ps->ext_name_ptr = np; + + en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident); + } + else + { + /* internal object */ + struct obj_def object_def; + + msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF; + mn->get_object_def(np.ident_len, np.ident, &object_def); + if ((object_def.instance != MIB_OBJECT_NONE) && + (object_def.access & MIB_ACCESS_READ)) + { + mn = mn; + } + else + { + /* search failed, object id points to unknown object (nosuchname) */ + mn = NULL; + } + if (mn != NULL) + { + struct snmp_varbind *vb; + + msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE; + /* allocate output varbind */ + vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND); + if (vb != NULL) + { + vb->next = NULL; + vb->prev = NULL; + + /* move name from invb to outvb */ + vb->ident = msg_ps->vb_ptr->ident; + vb->ident_len = msg_ps->vb_ptr->ident_len; + /* ensure this memory is refereced once only */ + msg_ps->vb_ptr->ident = NULL; + msg_ps->vb_ptr->ident_len = 0; + + vb->value_type = object_def.asn_type; + LWIP_ASSERT("invalid length", object_def.v_len <= 0xff); + vb->value_len = (u8_t)object_def.v_len; + if (vb->value_len > 0) + { + LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low", + vb->value_len <= SNMP_MAX_VALUE_SIZE); + vb->value = memp_malloc(MEMP_SNMP_VALUE); + if (vb->value != NULL) + { + mn->get_value(&object_def, vb->value_len, vb->value); + snmp_varbind_tail_add(&msg_ps->outvb, vb); + msg_ps->state = SNMP_MSG_SEARCH_OBJ; + msg_ps->vb_idx += 1; + } + else + { + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: couldn't allocate variable space\n")); + msg_ps->vb_ptr->ident = vb->ident; + msg_ps->vb_ptr->ident_len = vb->ident_len; + vb->ident = NULL; + vb->ident_len = 0; + memp_free(MEMP_SNMP_VARBIND, vb); + snmp_error_response(msg_ps,SNMP_ES_TOOBIG); + } + } + else + { + /* vb->value_len == 0, empty value (e.g. empty string) */ + vb->value = NULL; + snmp_varbind_tail_add(&msg_ps->outvb, vb); + msg_ps->state = SNMP_MSG_SEARCH_OBJ; + msg_ps->vb_idx += 1; + } + } + else + { + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_event: couldn't allocate outvb space\n")); + snmp_error_response(msg_ps,SNMP_ES_TOOBIG); + } + } + } + } + } + else + { + mn = NULL; + } + if (mn == NULL) + { + /* mn == NULL, noSuchName */ + snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME); + } + } + if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) && + (msg_ps->vb_idx == msg_ps->invb.count)) + { + snmp_ok_response(msg_ps); + } +} + +/** + * Service an internal or external event for SNMP GETNEXT. + * + * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1) + * @param msg_ps points to the assosicated message process state + */ +static void +snmp_msg_getnext_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) +{ + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state)); + + if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF) + { + struct mib_external_node *en; + + /* get_object_def() answer*/ + en = msg_ps->ext_mib_node; + + /* translate answer into a known lifeform */ + en->get_object_def_a(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1], &msg_ps->ext_object_def); + if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) + { + msg_ps->state = SNMP_MSG_EXTERNAL_GET_VALUE; + en->get_value_q(request_id, &msg_ps->ext_object_def); + } + else + { + en->get_object_def_pc(request_id, 1, &msg_ps->ext_oid.id[msg_ps->ext_oid.len - 1]); + /* search failed, object id points to unknown object (nosuchname) */ + snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME); + } + } + else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_VALUE) + { + struct mib_external_node *en; + struct snmp_varbind *vb; + + /* get_value() answer */ + en = msg_ps->ext_mib_node; + + LWIP_ASSERT("invalid length", msg_ps->ext_object_def.v_len <= 0xff); + vb = snmp_varbind_alloc(&msg_ps->ext_oid, + msg_ps->ext_object_def.asn_type, + (u8_t)msg_ps->ext_object_def.v_len); + if (vb != NULL) + { + en->get_value_a(request_id, &msg_ps->ext_object_def, vb->value_len, vb->value); + snmp_varbind_tail_add(&msg_ps->outvb, vb); + msg_ps->state = SNMP_MSG_SEARCH_OBJ; + msg_ps->vb_idx += 1; + } + else + { + en->get_value_pc(request_id, &msg_ps->ext_object_def); + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_getnext_event: couldn't allocate outvb space\n")); + snmp_error_response(msg_ps,SNMP_ES_TOOBIG); + } + } + + while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) && + (msg_ps->vb_idx < msg_ps->invb.count)) + { + struct mib_node *mn; + struct snmp_obj_id oid; + + if (msg_ps->vb_idx == 0) + { + msg_ps->vb_ptr = msg_ps->invb.head; + } + else + { + msg_ps->vb_ptr = msg_ps->vb_ptr->next; + } + if (snmp_iso_prefix_expand(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident, &oid)) + { + if (msg_ps->vb_ptr->ident_len > 3) + { + /* can offset ident_len and ident */ + mn = snmp_expand_tree((struct mib_node*)&internet, + msg_ps->vb_ptr->ident_len - 4, + msg_ps->vb_ptr->ident + 4, &oid); + } + else + { + /* can't offset ident_len -4, ident + 4 */ + mn = snmp_expand_tree((struct mib_node*)&internet, 0, NULL, &oid); + } + } + else + { + mn = NULL; + } + if (mn != NULL) + { + if (mn->node_type == MIB_NODE_EX) + { + /* external object */ + struct mib_external_node *en = (struct mib_external_node*)mn; + + msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF; + /* save en && args in msg_ps!! */ + msg_ps->ext_mib_node = en; + msg_ps->ext_oid = oid; + + en->get_object_def_q(en->addr_inf, request_id, 1, &oid.id[oid.len - 1]); + } + else + { + /* internal object */ + struct obj_def object_def; + struct snmp_varbind *vb; + + msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF; + mn->get_object_def(1, &oid.id[oid.len - 1], &object_def); + + LWIP_ASSERT("invalid length", object_def.v_len <= 0xff); + vb = snmp_varbind_alloc(&oid, object_def.asn_type, (u8_t)object_def.v_len); + if (vb != NULL) + { + msg_ps->state = SNMP_MSG_INTERNAL_GET_VALUE; + mn->get_value(&object_def, object_def.v_len, vb->value); + snmp_varbind_tail_add(&msg_ps->outvb, vb); + msg_ps->state = SNMP_MSG_SEARCH_OBJ; + msg_ps->vb_idx += 1; + } + else + { + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv couldn't allocate outvb space\n")); + snmp_error_response(msg_ps,SNMP_ES_TOOBIG); + } + } + } + if (mn == NULL) + { + /* mn == NULL, noSuchName */ + snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME); + } + } + if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) && + (msg_ps->vb_idx == msg_ps->invb.count)) + { + snmp_ok_response(msg_ps); + } +} + +/** + * Service an internal or external event for SNMP SET. + * + * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1) + * @param msg_ps points to the assosicated message process state + */ +static void +snmp_msg_set_event(u8_t request_id, struct snmp_msg_pstat *msg_ps) +{ + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_msg_set_event: msg_ps->state==%"U16_F"\n",(u16_t)msg_ps->state)); + + if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF) + { + struct mib_external_node *en; + struct snmp_name_ptr np; + + /* get_object_def() answer*/ + en = msg_ps->ext_mib_node; + np = msg_ps->ext_name_ptr; + + /* translate answer into a known lifeform */ + en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def); + if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) + { + msg_ps->state = SNMP_MSG_EXTERNAL_SET_TEST; + en->set_test_q(request_id, &msg_ps->ext_object_def); + } + else + { + en->get_object_def_pc(request_id, np.ident_len, np.ident); + /* search failed, object id points to unknown object (nosuchname) */ + snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME); + } + } + else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_TEST) + { + struct mib_external_node *en; + + /* set_test() answer*/ + en = msg_ps->ext_mib_node; + + if (msg_ps->ext_object_def.access & MIB_ACCESS_WRITE) + { + if ((msg_ps->ext_object_def.asn_type == msg_ps->vb_ptr->value_type) && + (en->set_test_a(request_id,&msg_ps->ext_object_def, + msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0)) + { + msg_ps->state = SNMP_MSG_SEARCH_OBJ; + msg_ps->vb_idx += 1; + } + else + { + en->set_test_pc(request_id,&msg_ps->ext_object_def); + /* bad value */ + snmp_error_response(msg_ps,SNMP_ES_BADVALUE); + } + } + else + { + en->set_test_pc(request_id,&msg_ps->ext_object_def); + /* object not available for set */ + snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME); + } + } + else if (msg_ps->state == SNMP_MSG_EXTERNAL_GET_OBJDEF_S) + { + struct mib_external_node *en; + struct snmp_name_ptr np; + + /* get_object_def() answer*/ + en = msg_ps->ext_mib_node; + np = msg_ps->ext_name_ptr; + + /* translate answer into a known lifeform */ + en->get_object_def_a(request_id, np.ident_len, np.ident, &msg_ps->ext_object_def); + if (msg_ps->ext_object_def.instance != MIB_OBJECT_NONE) + { + msg_ps->state = SNMP_MSG_EXTERNAL_SET_VALUE; + en->set_value_q(request_id, &msg_ps->ext_object_def, + msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value); + } + else + { + en->get_object_def_pc(request_id, np.ident_len, np.ident); + /* set_value failed, object has disappeared for some odd reason?? */ + snmp_error_response(msg_ps,SNMP_ES_GENERROR); + } + } + else if (msg_ps->state == SNMP_MSG_EXTERNAL_SET_VALUE) + { + struct mib_external_node *en; + + /** set_value_a() */ + en = msg_ps->ext_mib_node; + en->set_value_a(request_id, &msg_ps->ext_object_def, + msg_ps->vb_ptr->value_len, msg_ps->vb_ptr->value); + + /** @todo use set_value_pc() if toobig */ + msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE; + msg_ps->vb_idx += 1; + } + + /* test all values before setting */ + while ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) && + (msg_ps->vb_idx < msg_ps->invb.count)) + { + struct mib_node *mn; + struct snmp_name_ptr np; + + if (msg_ps->vb_idx == 0) + { + msg_ps->vb_ptr = msg_ps->invb.head; + } + else + { + msg_ps->vb_ptr = msg_ps->vb_ptr->next; + } + /** test object identifier for .iso.org.dod.internet prefix */ + if (snmp_iso_prefix_tst(msg_ps->vb_ptr->ident_len, msg_ps->vb_ptr->ident)) + { + mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4, + msg_ps->vb_ptr->ident + 4, &np); + if (mn != NULL) + { + if (mn->node_type == MIB_NODE_EX) + { + /* external object */ + struct mib_external_node *en = (struct mib_external_node*)mn; + + msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF; + /* save en && args in msg_ps!! */ + msg_ps->ext_mib_node = en; + msg_ps->ext_name_ptr = np; + + en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident); + } + else + { + /* internal object */ + struct obj_def object_def; + + msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF; + mn->get_object_def(np.ident_len, np.ident, &object_def); + if (object_def.instance != MIB_OBJECT_NONE) + { + mn = mn; + } + else + { + /* search failed, object id points to unknown object (nosuchname) */ + mn = NULL; + } + if (mn != NULL) + { + msg_ps->state = SNMP_MSG_INTERNAL_SET_TEST; + + if (object_def.access & MIB_ACCESS_WRITE) + { + if ((object_def.asn_type == msg_ps->vb_ptr->value_type) && + (mn->set_test(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value) != 0)) + { + msg_ps->state = SNMP_MSG_SEARCH_OBJ; + msg_ps->vb_idx += 1; + } + else + { + /* bad value */ + snmp_error_response(msg_ps,SNMP_ES_BADVALUE); + } + } + else + { + /* object not available for set */ + snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME); + } + } + } + } + } + else + { + mn = NULL; + } + if (mn == NULL) + { + /* mn == NULL, noSuchName */ + snmp_error_response(msg_ps,SNMP_ES_NOSUCHNAME); + } + } + + if ((msg_ps->state == SNMP_MSG_SEARCH_OBJ) && + (msg_ps->vb_idx == msg_ps->invb.count)) + { + msg_ps->vb_idx = 0; + msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE; + } + + /* set all values "atomically" (be as "atomic" as possible) */ + while ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) && + (msg_ps->vb_idx < msg_ps->invb.count)) + { + struct mib_node *mn; + struct snmp_name_ptr np; + + if (msg_ps->vb_idx == 0) + { + msg_ps->vb_ptr = msg_ps->invb.head; + } + else + { + msg_ps->vb_ptr = msg_ps->vb_ptr->next; + } + /* skip iso prefix test, was done previously while settesting() */ + mn = snmp_search_tree((struct mib_node*)&internet, msg_ps->vb_ptr->ident_len - 4, + msg_ps->vb_ptr->ident + 4, &np); + /* check if object is still available + (e.g. external hot-plug thingy present?) */ + if (mn != NULL) + { + if (mn->node_type == MIB_NODE_EX) + { + /* external object */ + struct mib_external_node *en = (struct mib_external_node*)mn; + + msg_ps->state = SNMP_MSG_EXTERNAL_GET_OBJDEF_S; + /* save en && args in msg_ps!! */ + msg_ps->ext_mib_node = en; + msg_ps->ext_name_ptr = np; + + en->get_object_def_q(en->addr_inf, request_id, np.ident_len, np.ident); + } + else + { + /* internal object */ + struct obj_def object_def; + + msg_ps->state = SNMP_MSG_INTERNAL_GET_OBJDEF_S; + mn->get_object_def(np.ident_len, np.ident, &object_def); + msg_ps->state = SNMP_MSG_INTERNAL_SET_VALUE; + mn->set_value(&object_def,msg_ps->vb_ptr->value_len,msg_ps->vb_ptr->value); + msg_ps->vb_idx += 1; + } + } + } + if ((msg_ps->state == SNMP_MSG_INTERNAL_SET_VALUE) && + (msg_ps->vb_idx == msg_ps->invb.count)) + { + /* simply echo the input if we can set it + @todo do we need to return the actual value? + e.g. if value is silently modified or behaves sticky? */ + msg_ps->outvb = msg_ps->invb; + msg_ps->invb.head = NULL; + msg_ps->invb.tail = NULL; + msg_ps->invb.count = 0; + snmp_ok_response(msg_ps); + } +} + + +/** + * Handle one internal or external event. + * Called for one async event. (recv external/private answer) + * + * @param request_id identifies requests from 0 to (SNMP_CONCURRENT_REQUESTS-1) + */ +void +snmp_msg_event(u8_t request_id) +{ + struct snmp_msg_pstat *msg_ps; + + if (request_id < SNMP_CONCURRENT_REQUESTS) + { + msg_ps = &msg_input_list[request_id]; + if (msg_ps->rt == SNMP_ASN1_PDU_GET_NEXT_REQ) + { + snmp_msg_getnext_event(request_id, msg_ps); + } + else if (msg_ps->rt == SNMP_ASN1_PDU_GET_REQ) + { + snmp_msg_get_event(request_id, msg_ps); + } + else if(msg_ps->rt == SNMP_ASN1_PDU_SET_REQ) + { + snmp_msg_set_event(request_id, msg_ps); + } + } +} + + +/* lwIP UDP receive callback function */ +static void +snmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *addr, u16_t port) +{ + struct snmp_msg_pstat *msg_ps; + u8_t req_idx; + err_t err_ret; + u16_t payload_len = p->tot_len; + u16_t payload_ofs = 0; + u16_t varbind_ofs = 0; + + /* suppress unused argument warning */ + LWIP_UNUSED_ARG(arg); + + /* traverse input message process list, look for SNMP_MSG_EMPTY */ + msg_ps = &msg_input_list[0]; + req_idx = 0; + while ((req_idx < SNMP_CONCURRENT_REQUESTS) && (msg_ps->state != SNMP_MSG_EMPTY)) + { + req_idx++; + msg_ps++; + } + if (req_idx == SNMP_CONCURRENT_REQUESTS) + { + /* exceeding number of concurrent requests */ + pbuf_free(p); + return; + } + + /* accepting request */ + snmp_inc_snmpinpkts(); + /* record used 'protocol control block' */ + msg_ps->pcb = pcb; + /* source address (network order) */ + msg_ps->sip = *addr; + /* source port (host order (lwIP oddity)) */ + msg_ps->sp = port; + + /* check total length, version, community, pdu type */ + err_ret = snmp_pdu_header_check(p, payload_ofs, payload_len, &varbind_ofs, msg_ps); + /* Only accept requests and requests without error (be robust) */ + /* Reject response and trap headers or error requests as input! */ + if ((err_ret != ERR_OK) || + ((msg_ps->rt != SNMP_ASN1_PDU_GET_REQ) && + (msg_ps->rt != SNMP_ASN1_PDU_GET_NEXT_REQ) && + (msg_ps->rt != SNMP_ASN1_PDU_SET_REQ)) || + ((msg_ps->error_status != SNMP_ES_NOERROR) || + (msg_ps->error_index != 0)) ) + { + /* header check failed drop request silently, do not return error! */ + pbuf_free(p); + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_pdu_header_check() failed\n")); + return; + } + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv ok, community %s\n", msg_ps->community)); + + /* Builds a list of variable bindings. Copy the varbinds from the pbuf + chain to glue them when these are divided over two or more pbuf's. */ + err_ret = snmp_pdu_dec_varbindlist(p, varbind_ofs, &varbind_ofs, msg_ps); + /* we've decoded the incoming message, release input msg now */ + pbuf_free(p); + if ((err_ret != ERR_OK) || (msg_ps->invb.count == 0)) + { + /* varbind-list decode failed, or varbind list empty. + drop request silently, do not return error! + (errors are only returned for a specific varbind failure) */ + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_pdu_dec_varbindlist() failed\n")); + return; + } + + msg_ps->error_status = SNMP_ES_NOERROR; + msg_ps->error_index = 0; + /* find object for each variable binding */ + msg_ps->state = SNMP_MSG_SEARCH_OBJ; + /* first variable binding from list to inspect */ + msg_ps->vb_idx = 0; + + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_recv varbind cnt=%"U16_F"\n",(u16_t)msg_ps->invb.count)); + + /* handle input event and as much objects as possible in one go */ + snmp_msg_event(req_idx); +} + +/** + * Checks and decodes incoming SNMP message header, logs header errors. + * + * @param p points to pbuf chain of SNMP message (UDP payload) + * @param ofs points to first octet of SNMP message + * @param pdu_len the length of the UDP payload + * @param ofs_ret returns the ofset of the variable bindings + * @param m_stat points to the current message request state return + * @return + * - ERR_OK SNMP header is sane and accepted + * - ERR_ARG SNMP header is either malformed or rejected + */ +static err_t +snmp_pdu_header_check(struct pbuf *p, u16_t ofs, u16_t pdu_len, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat) +{ + err_t derr; + u16_t len, ofs_base; + u8_t len_octets; + u8_t type; + s32_t version; + + ofs_base = ofs; + snmp_asn1_dec_type(p, ofs, &type); + derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len); + if ((derr != ERR_OK) || + (pdu_len != (1 + len_octets + len)) || + (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ))) + { + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + ofs += (1 + len_octets); + snmp_asn1_dec_type(p, ofs, &type); + derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len); + if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG))) + { + /* can't decode or no integer (version) */ + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &version); + if (derr != ERR_OK) + { + /* can't decode */ + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + if (version != 0) + { + /* not version 1 */ + snmp_inc_snmpinbadversions(); + return ERR_ARG; + } + ofs += (1 + len_octets + len); + snmp_asn1_dec_type(p, ofs, &type); + derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len); + if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR))) + { + /* can't decode or no octet string (community) */ + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, SNMP_COMMUNITY_STR_LEN, m_stat->community); + if (derr != ERR_OK) + { + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + /* add zero terminator */ + len = ((len < (SNMP_COMMUNITY_STR_LEN))?(len):(SNMP_COMMUNITY_STR_LEN)); + m_stat->community[len] = 0; + m_stat->com_strlen = (u8_t)len; + if (strncmp(snmp_publiccommunity, (const char*)m_stat->community, SNMP_COMMUNITY_STR_LEN) != 0) + { + /** @todo: move this if we need to check more names */ + snmp_inc_snmpinbadcommunitynames(); + snmp_authfail_trap(); + return ERR_ARG; + } + ofs += (1 + len_octets + len); + snmp_asn1_dec_type(p, ofs, &type); + derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len); + if (derr != ERR_OK) + { + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + switch(type) + { + case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_REQ): + /* GetRequest PDU */ + snmp_inc_snmpingetrequests(); + derr = ERR_OK; + break; + case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_NEXT_REQ): + /* GetNextRequest PDU */ + snmp_inc_snmpingetnexts(); + derr = ERR_OK; + break; + case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP): + /* GetResponse PDU */ + snmp_inc_snmpingetresponses(); + derr = ERR_ARG; + break; + case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_SET_REQ): + /* SetRequest PDU */ + snmp_inc_snmpinsetrequests(); + derr = ERR_OK; + break; + case (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP): + /* Trap PDU */ + snmp_inc_snmpintraps(); + derr = ERR_ARG; + break; + default: + snmp_inc_snmpinasnparseerrs(); + derr = ERR_ARG; + break; + } + if (derr != ERR_OK) + { + /* unsupported input PDU for this agent (no parse error) */ + return ERR_ARG; + } + m_stat->rt = type & 0x1F; + ofs += (1 + len_octets); + if (len != (pdu_len - (ofs - ofs_base))) + { + /* decoded PDU length does not equal actual payload length */ + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + snmp_asn1_dec_type(p, ofs, &type); + derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len); + if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG))) + { + /* can't decode or no integer (request ID) */ + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->rid); + if (derr != ERR_OK) + { + /* can't decode */ + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + ofs += (1 + len_octets + len); + snmp_asn1_dec_type(p, ofs, &type); + derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len); + if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG))) + { + /* can't decode or no integer (error-status) */ + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + /* must be noError (0) for incoming requests. + log errors for mib-2 completeness and for debug purposes */ + derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_status); + if (derr != ERR_OK) + { + /* can't decode */ + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + switch (m_stat->error_status) + { + case SNMP_ES_TOOBIG: + snmp_inc_snmpintoobigs(); + break; + case SNMP_ES_NOSUCHNAME: + snmp_inc_snmpinnosuchnames(); + break; + case SNMP_ES_BADVALUE: + snmp_inc_snmpinbadvalues(); + break; + case SNMP_ES_READONLY: + snmp_inc_snmpinreadonlys(); + break; + case SNMP_ES_GENERROR: + snmp_inc_snmpingenerrs(); + break; + } + ofs += (1 + len_octets + len); + snmp_asn1_dec_type(p, ofs, &type); + derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len); + if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG))) + { + /* can't decode or no integer (error-index) */ + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + /* must be 0 for incoming requests. + decode anyway to catch bad integers (and dirty tricks) */ + derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, &m_stat->error_index); + if (derr != ERR_OK) + { + /* can't decode */ + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + ofs += (1 + len_octets + len); + *ofs_ret = ofs; + return ERR_OK; +} + +static err_t +snmp_pdu_dec_varbindlist(struct pbuf *p, u16_t ofs, u16_t *ofs_ret, struct snmp_msg_pstat *m_stat) +{ + err_t derr; + u16_t len, vb_len; + u8_t len_octets; + u8_t type; + + /* variable binding list */ + snmp_asn1_dec_type(p, ofs, &type); + derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &vb_len); + if ((derr != ERR_OK) || + (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ))) + { + snmp_inc_snmpinasnparseerrs(); + return ERR_ARG; + } + ofs += (1 + len_octets); + + /* start with empty list */ + m_stat->invb.count = 0; + m_stat->invb.head = NULL; + m_stat->invb.tail = NULL; + + while (vb_len > 0) + { + struct snmp_obj_id oid, oid_value; + struct snmp_varbind *vb; + + snmp_asn1_dec_type(p, ofs, &type); + derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len); + if ((derr != ERR_OK) || + (type != (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)) || + (len == 0) || (len > vb_len)) + { + snmp_inc_snmpinasnparseerrs(); + /* free varbinds (if available) */ + snmp_varbind_list_free(&m_stat->invb); + return ERR_ARG; + } + ofs += (1 + len_octets); + vb_len -= (1 + len_octets); + + snmp_asn1_dec_type(p, ofs, &type); + derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len); + if ((derr != ERR_OK) || (type != (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID))) + { + /* can't decode object name length */ + snmp_inc_snmpinasnparseerrs(); + /* free varbinds (if available) */ + snmp_varbind_list_free(&m_stat->invb); + return ERR_ARG; + } + derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid); + if (derr != ERR_OK) + { + /* can't decode object name */ + snmp_inc_snmpinasnparseerrs(); + /* free varbinds (if available) */ + snmp_varbind_list_free(&m_stat->invb); + return ERR_ARG; + } + ofs += (1 + len_octets + len); + vb_len -= (1 + len_octets + len); + + snmp_asn1_dec_type(p, ofs, &type); + derr = snmp_asn1_dec_length(p, ofs+1, &len_octets, &len); + if (derr != ERR_OK) + { + /* can't decode object value length */ + snmp_inc_snmpinasnparseerrs(); + /* free varbinds (if available) */ + snmp_varbind_list_free(&m_stat->invb); + return ERR_ARG; + } + + switch (type) + { + case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG): + vb = snmp_varbind_alloc(&oid, type, sizeof(s32_t)); + if (vb != NULL) + { + s32_t *vptr = (s32_t*)vb->value; + + derr = snmp_asn1_dec_s32t(p, ofs + 1 + len_octets, len, vptr); + snmp_varbind_tail_add(&m_stat->invb, vb); + } + else + { + derr = ERR_ARG; + } + break; + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER): + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE): + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS): + vb = snmp_varbind_alloc(&oid, type, sizeof(u32_t)); + if (vb != NULL) + { + u32_t *vptr = (u32_t*)vb->value; + + derr = snmp_asn1_dec_u32t(p, ofs + 1 + len_octets, len, vptr); + snmp_varbind_tail_add(&m_stat->invb, vb); + } + else + { + derr = ERR_ARG; + } + break; + case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR): + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE): + LWIP_ASSERT("invalid length", len <= 0xff); + vb = snmp_varbind_alloc(&oid, type, (u8_t)len); + if (vb != NULL) + { + derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, vb->value_len, (u8_t*)vb->value); + snmp_varbind_tail_add(&m_stat->invb, vb); + } + else + { + derr = ERR_ARG; + } + break; + case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL): + vb = snmp_varbind_alloc(&oid, type, 0); + if (vb != NULL) + { + snmp_varbind_tail_add(&m_stat->invb, vb); + derr = ERR_OK; + } + else + { + derr = ERR_ARG; + } + break; + case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID): + derr = snmp_asn1_dec_oid(p, ofs + 1 + len_octets, len, &oid_value); + if (derr == ERR_OK) + { + vb = snmp_varbind_alloc(&oid, type, oid_value.len * sizeof(s32_t)); + if (vb != NULL) + { + u8_t i = oid_value.len; + s32_t *vptr = (s32_t*)vb->value; + + while(i > 0) + { + i--; + vptr[i] = oid_value.id[i]; + } + snmp_varbind_tail_add(&m_stat->invb, vb); + derr = ERR_OK; + } + else + { + derr = ERR_ARG; + } + } + break; + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR): + if (len == 4) + { + /* must be exactly 4 octets! */ + vb = snmp_varbind_alloc(&oid, type, 4); + if (vb != NULL) + { + derr = snmp_asn1_dec_raw(p, ofs + 1 + len_octets, len, vb->value_len, (u8_t*)vb->value); + snmp_varbind_tail_add(&m_stat->invb, vb); + } + else + { + derr = ERR_ARG; + } + } + else + { + derr = ERR_ARG; + } + break; + default: + derr = ERR_ARG; + break; + } + if (derr != ERR_OK) + { + snmp_inc_snmpinasnparseerrs(); + /* free varbinds (if available) */ + snmp_varbind_list_free(&m_stat->invb); + return ERR_ARG; + } + ofs += (1 + len_octets + len); + vb_len -= (1 + len_octets + len); + } + + if (m_stat->rt == SNMP_ASN1_PDU_SET_REQ) + { + snmp_add_snmpintotalsetvars(m_stat->invb.count); + } + else + { + snmp_add_snmpintotalreqvars(m_stat->invb.count); + } + + *ofs_ret = ofs; + return ERR_OK; +} + +struct snmp_varbind* +snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len) +{ + struct snmp_varbind *vb; + + vb = (struct snmp_varbind *)memp_malloc(MEMP_SNMP_VARBIND); + if (vb != NULL) + { + u8_t i; + + vb->next = NULL; + vb->prev = NULL; + i = oid->len; + vb->ident_len = i; + if (i > 0) + { + LWIP_ASSERT("SNMP_MAX_TREE_DEPTH is configured too low", i <= SNMP_MAX_TREE_DEPTH); + /* allocate array of s32_t for our object identifier */ + vb->ident = (s32_t*)memp_malloc(MEMP_SNMP_VALUE); + if (vb->ident == NULL) + { + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate ident value space\n")); + memp_free(MEMP_SNMP_VARBIND, vb); + return NULL; + } + while(i > 0) + { + i--; + vb->ident[i] = oid->id[i]; + } + } + else + { + /* i == 0, pass zero length object identifier */ + vb->ident = NULL; + } + vb->value_type = type; + vb->value_len = len; + if (len > 0) + { + LWIP_ASSERT("SNMP_MAX_OCTET_STRING_LEN is configured too low", vb->value_len <= SNMP_MAX_VALUE_SIZE); + /* allocate raw bytes for our object value */ + vb->value = memp_malloc(MEMP_SNMP_VALUE); + if (vb->value == NULL) + { + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate value space\n")); + if (vb->ident != NULL) + { + memp_free(MEMP_SNMP_VALUE, vb->ident); + } + memp_free(MEMP_SNMP_VARBIND, vb); + return NULL; + } + } + else + { + /* ASN1_NUL type, or zero length ASN1_OC_STR */ + vb->value = NULL; + } + } + else + { + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_varbind_alloc: couldn't allocate varbind space\n")); + } + return vb; +} + +void +snmp_varbind_free(struct snmp_varbind *vb) +{ + if (vb->value != NULL ) + { + memp_free(MEMP_SNMP_VALUE, vb->value); + } + if (vb->ident != NULL ) + { + memp_free(MEMP_SNMP_VALUE, vb->ident); + } + memp_free(MEMP_SNMP_VARBIND, vb); +} + +void +snmp_varbind_list_free(struct snmp_varbind_root *root) +{ + struct snmp_varbind *vb, *prev; + + vb = root->tail; + while ( vb != NULL ) + { + prev = vb->prev; + snmp_varbind_free(vb); + vb = prev; + } + root->count = 0; + root->head = NULL; + root->tail = NULL; +} + +void +snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb) +{ + if (root->count == 0) + { + /* add first varbind to list */ + root->head = vb; + root->tail = vb; + } + else + { + /* add nth varbind to list tail */ + root->tail->next = vb; + vb->prev = root->tail; + root->tail = vb; + } + root->count += 1; +} + +struct snmp_varbind* +snmp_varbind_tail_remove(struct snmp_varbind_root *root) +{ + struct snmp_varbind* vb; + + if (root->count > 0) + { + /* remove tail varbind */ + vb = root->tail; + root->tail = vb->prev; + vb->prev->next = NULL; + root->count -= 1; + } + else + { + /* nothing to remove */ + vb = NULL; + } + return vb; +} + +#endif /* LWIP_SNMP */ diff --git a/third_party/lwip-1.4.1/src/core/snmp/msg_out.c b/third_party/lwip-1.4.1/src/core/snmp/msg_out.c new file mode 100644 index 0000000..c2595ee --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/snmp/msg_out.c @@ -0,0 +1,674 @@ +/** + * @file + * SNMP output message processing (RFC1157). + * + * Output responses and traps are build in two passes: + * + * Pass 0: iterate over the output message backwards to determine encoding lengths + * Pass 1: the actual forward encoding of internal form into ASN1 + * + * The single-pass encoding method described by Comer & Stevens + * requires extra buffer space and copying for reversal of the packet. + * The buffer requirement can be prohibitively large for big payloads + * (>= 484) therefore we use the two encoding passes. + */ + +/* + * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Christiaan Simons + */ + +#include "lwip/opt.h" + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/udp.h" +#include "lwip/netif.h" +#include "lwip/snmp.h" +#include "lwip/snmp_asn1.h" +#include "lwip/snmp_msg.h" + +struct snmp_trap_dst +{ + /* destination IP address in network order */ + ip_addr_t dip; + /* set to 0 when disabled, >0 when enabled */ + u8_t enable; +}; +struct snmp_trap_dst trap_dst[SNMP_TRAP_DESTINATIONS]; + +/** TRAP message structure */ +struct snmp_msg_trap trap_msg; + +static u16_t snmp_resp_header_sum(struct snmp_msg_pstat *m_stat, u16_t vb_len); +static u16_t snmp_trap_header_sum(struct snmp_msg_trap *m_trap, u16_t vb_len); +static u16_t snmp_varbind_list_sum(struct snmp_varbind_root *root); + +static u16_t snmp_resp_header_enc(struct snmp_msg_pstat *m_stat, struct pbuf *p); +static u16_t snmp_trap_header_enc(struct snmp_msg_trap *m_trap, struct pbuf *p); +static u16_t snmp_varbind_list_enc(struct snmp_varbind_root *root, struct pbuf *p, u16_t ofs); + +/** + * Sets enable switch for this trap destination. + * @param dst_idx index in 0 .. SNMP_TRAP_DESTINATIONS-1 + * @param enable switch if 0 destination is disabled >0 enabled. + */ +void +snmp_trap_dst_enable(u8_t dst_idx, u8_t enable) +{ + if (dst_idx < SNMP_TRAP_DESTINATIONS) + { + trap_dst[dst_idx].enable = enable; + } +} + +/** + * Sets IPv4 address for this trap destination. + * @param dst_idx index in 0 .. SNMP_TRAP_DESTINATIONS-1 + * @param dst IPv4 address in host order. + */ +void +snmp_trap_dst_ip_set(u8_t dst_idx, ip_addr_t *dst) +{ + if (dst_idx < SNMP_TRAP_DESTINATIONS) + { + ip_addr_set(&trap_dst[dst_idx].dip, dst); + } +} + +/** + * Sends a 'getresponse' message to the request originator. + * + * @param m_stat points to the current message request state source + * @return ERR_OK when success, ERR_MEM if we're out of memory + * + * @note the caller is responsible for filling in outvb in the m_stat + * and provide error-status and index (except for tooBig errors) ... + */ +err_t +snmp_send_response(struct snmp_msg_pstat *m_stat) +{ + struct snmp_varbind_root emptyvb = {NULL, NULL, 0, 0, 0}; + struct pbuf *p; + u16_t tot_len; + err_t err; + + /* pass 0, calculate length fields */ + tot_len = snmp_varbind_list_sum(&m_stat->outvb); + tot_len = snmp_resp_header_sum(m_stat, tot_len); + + /* try allocating pbuf(s) for complete response */ + p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL); + if (p == NULL) + { + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_snd_response() tooBig\n")); + + /* can't construct reply, return error-status tooBig */ + m_stat->error_status = SNMP_ES_TOOBIG; + m_stat->error_index = 0; + /* pass 0, recalculate lengths, for empty varbind-list */ + tot_len = snmp_varbind_list_sum(&emptyvb); + tot_len = snmp_resp_header_sum(m_stat, tot_len); + /* retry allocation once for header and empty varbind-list */ + p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL); + } + if (p != NULL) + { + /* first pbuf alloc try or retry alloc success */ + u16_t ofs; + + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_snd_response() p != NULL\n")); + + /* pass 1, size error, encode packet ino the pbuf(s) */ + ofs = snmp_resp_header_enc(m_stat, p); + snmp_varbind_list_enc(&m_stat->outvb, p, ofs); + + switch (m_stat->error_status) + { + case SNMP_ES_TOOBIG: + snmp_inc_snmpouttoobigs(); + break; + case SNMP_ES_NOSUCHNAME: + snmp_inc_snmpoutnosuchnames(); + break; + case SNMP_ES_BADVALUE: + snmp_inc_snmpoutbadvalues(); + break; + case SNMP_ES_GENERROR: + snmp_inc_snmpoutgenerrs(); + break; + } + snmp_inc_snmpoutgetresponses(); + snmp_inc_snmpoutpkts(); + + /** @todo do we need separate rx and tx pcbs for threaded case? */ + /** connect to the originating source */ + udp_connect(m_stat->pcb, &m_stat->sip, m_stat->sp); + err = udp_send(m_stat->pcb, p); + if (err == ERR_MEM) + { + /** @todo release some memory, retry and return tooBig? tooMuchHassle? */ + err = ERR_MEM; + } + else + { + err = ERR_OK; + } + /** disassociate remote address and port with this pcb */ + udp_disconnect(m_stat->pcb); + + pbuf_free(p); + LWIP_DEBUGF(SNMP_MSG_DEBUG, ("snmp_snd_response() done\n")); + return err; + } + else + { + /* first pbuf alloc try or retry alloc failed + very low on memory, couldn't return tooBig */ + return ERR_MEM; + } +} + + +/** + * Sends an generic or enterprise specific trap message. + * + * @param generic_trap is the trap code + * @param eoid points to enterprise object identifier + * @param specific_trap used for enterprise traps when generic_trap == 6 + * @return ERR_OK when success, ERR_MEM if we're out of memory + * + * @note the caller is responsible for filling in outvb in the trap_msg + * @note the use of the enterpise identifier field + * is per RFC1215. + * Use .iso.org.dod.internet.mgmt.mib-2.snmp for generic traps + * and .iso.org.dod.internet.private.enterprises.yourenterprise + * (sysObjectID) for specific traps. + */ +err_t +snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap) +{ + struct snmp_trap_dst *td; + struct netif *dst_if; + ip_addr_t dst_ip; + struct pbuf *p; + u16_t i,tot_len; + + for (i=0, td = &trap_dst[0]; ienable != 0) && !ip_addr_isany(&td->dip)) + { + /* network order trap destination */ + ip_addr_copy(trap_msg.dip, td->dip); + /* lookup current source address for this dst */ + dst_if = ip_route(&td->dip); + ip_addr_copy(dst_ip, dst_if->ip_addr); + /* @todo: what about IPv6? */ + trap_msg.sip_raw[0] = ip4_addr1(&dst_ip); + trap_msg.sip_raw[1] = ip4_addr2(&dst_ip); + trap_msg.sip_raw[2] = ip4_addr3(&dst_ip); + trap_msg.sip_raw[3] = ip4_addr4(&dst_ip); + trap_msg.gen_trap = generic_trap; + trap_msg.spc_trap = specific_trap; + if (generic_trap == SNMP_GENTRAP_ENTERPRISESPC) + { + /* enterprise-Specific trap */ + trap_msg.enterprise = eoid; + } + else + { + /* generic (MIB-II) trap */ + snmp_get_snmpgrpid_ptr(&trap_msg.enterprise); + } + snmp_get_sysuptime(&trap_msg.ts); + + /* pass 0, calculate length fields */ + tot_len = snmp_varbind_list_sum(&trap_msg.outvb); + tot_len = snmp_trap_header_sum(&trap_msg, tot_len); + + /* allocate pbuf(s) */ + p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_POOL); + if (p != NULL) + { + u16_t ofs; + + /* pass 1, encode packet ino the pbuf(s) */ + ofs = snmp_trap_header_enc(&trap_msg, p); + snmp_varbind_list_enc(&trap_msg.outvb, p, ofs); + + snmp_inc_snmpouttraps(); + snmp_inc_snmpoutpkts(); + + /** send to the TRAP destination */ + udp_sendto(trap_msg.pcb, p, &trap_msg.dip, SNMP_TRAP_PORT); + + pbuf_free(p); + } + else + { + return ERR_MEM; + } + } + } + return ERR_OK; +} + +void +snmp_coldstart_trap(void) +{ + trap_msg.outvb.head = NULL; + trap_msg.outvb.tail = NULL; + trap_msg.outvb.count = 0; + snmp_send_trap(SNMP_GENTRAP_COLDSTART, NULL, 0); +} + +void +snmp_authfail_trap(void) +{ + u8_t enable; + snmp_get_snmpenableauthentraps(&enable); + if (enable == 1) + { + trap_msg.outvb.head = NULL; + trap_msg.outvb.tail = NULL; + trap_msg.outvb.count = 0; + snmp_send_trap(SNMP_GENTRAP_AUTHFAIL, NULL, 0); + } +} + +/** + * Sums response header field lengths from tail to head and + * returns resp_header_lengths for second encoding pass. + * + * @param vb_len varbind-list length + * @param rhl points to returned header lengths + * @return the required lenght for encoding the response header + */ +static u16_t +snmp_resp_header_sum(struct snmp_msg_pstat *m_stat, u16_t vb_len) +{ + u16_t tot_len; + struct snmp_resp_header_lengths *rhl; + + rhl = &m_stat->rhl; + tot_len = vb_len; + snmp_asn1_enc_s32t_cnt(m_stat->error_index, &rhl->erridxlen); + snmp_asn1_enc_length_cnt(rhl->erridxlen, &rhl->erridxlenlen); + tot_len += 1 + rhl->erridxlenlen + rhl->erridxlen; + + snmp_asn1_enc_s32t_cnt(m_stat->error_status, &rhl->errstatlen); + snmp_asn1_enc_length_cnt(rhl->errstatlen, &rhl->errstatlenlen); + tot_len += 1 + rhl->errstatlenlen + rhl->errstatlen; + + snmp_asn1_enc_s32t_cnt(m_stat->rid, &rhl->ridlen); + snmp_asn1_enc_length_cnt(rhl->ridlen, &rhl->ridlenlen); + tot_len += 1 + rhl->ridlenlen + rhl->ridlen; + + rhl->pdulen = tot_len; + snmp_asn1_enc_length_cnt(rhl->pdulen, &rhl->pdulenlen); + tot_len += 1 + rhl->pdulenlen; + + rhl->comlen = m_stat->com_strlen; + snmp_asn1_enc_length_cnt(rhl->comlen, &rhl->comlenlen); + tot_len += 1 + rhl->comlenlen + rhl->comlen; + + snmp_asn1_enc_s32t_cnt(snmp_version, &rhl->verlen); + snmp_asn1_enc_length_cnt(rhl->verlen, &rhl->verlenlen); + tot_len += 1 + rhl->verlen + rhl->verlenlen; + + rhl->seqlen = tot_len; + snmp_asn1_enc_length_cnt(rhl->seqlen, &rhl->seqlenlen); + tot_len += 1 + rhl->seqlenlen; + + return tot_len; +} + +/** + * Sums trap header field lengths from tail to head and + * returns trap_header_lengths for second encoding pass. + * + * @param vb_len varbind-list length + * @param thl points to returned header lengths + * @return the required lenght for encoding the trap header + */ +static u16_t +snmp_trap_header_sum(struct snmp_msg_trap *m_trap, u16_t vb_len) +{ + u16_t tot_len; + struct snmp_trap_header_lengths *thl; + + thl = &m_trap->thl; + tot_len = vb_len; + + snmp_asn1_enc_u32t_cnt(m_trap->ts, &thl->tslen); + snmp_asn1_enc_length_cnt(thl->tslen, &thl->tslenlen); + tot_len += 1 + thl->tslen + thl->tslenlen; + + snmp_asn1_enc_s32t_cnt(m_trap->spc_trap, &thl->strplen); + snmp_asn1_enc_length_cnt(thl->strplen, &thl->strplenlen); + tot_len += 1 + thl->strplen + thl->strplenlen; + + snmp_asn1_enc_s32t_cnt(m_trap->gen_trap, &thl->gtrplen); + snmp_asn1_enc_length_cnt(thl->gtrplen, &thl->gtrplenlen); + tot_len += 1 + thl->gtrplen + thl->gtrplenlen; + + thl->aaddrlen = 4; + snmp_asn1_enc_length_cnt(thl->aaddrlen, &thl->aaddrlenlen); + tot_len += 1 + thl->aaddrlen + thl->aaddrlenlen; + + snmp_asn1_enc_oid_cnt(m_trap->enterprise->len, &m_trap->enterprise->id[0], &thl->eidlen); + snmp_asn1_enc_length_cnt(thl->eidlen, &thl->eidlenlen); + tot_len += 1 + thl->eidlen + thl->eidlenlen; + + thl->pdulen = tot_len; + snmp_asn1_enc_length_cnt(thl->pdulen, &thl->pdulenlen); + tot_len += 1 + thl->pdulenlen; + + thl->comlen = sizeof(snmp_publiccommunity) - 1; + snmp_asn1_enc_length_cnt(thl->comlen, &thl->comlenlen); + tot_len += 1 + thl->comlenlen + thl->comlen; + + snmp_asn1_enc_s32t_cnt(snmp_version, &thl->verlen); + snmp_asn1_enc_length_cnt(thl->verlen, &thl->verlenlen); + tot_len += 1 + thl->verlen + thl->verlenlen; + + thl->seqlen = tot_len; + snmp_asn1_enc_length_cnt(thl->seqlen, &thl->seqlenlen); + tot_len += 1 + thl->seqlenlen; + + return tot_len; +} + +/** + * Sums varbind lengths from tail to head and + * annotates lengths in varbind for second encoding pass. + * + * @param root points to the root of the variable binding list + * @return the required lenght for encoding the variable bindings + */ +static u16_t +snmp_varbind_list_sum(struct snmp_varbind_root *root) +{ + struct snmp_varbind *vb; + u32_t *uint_ptr; + s32_t *sint_ptr; + u16_t tot_len; + + tot_len = 0; + vb = root->tail; + while ( vb != NULL ) + { + /* encoded value lenght depends on type */ + switch (vb->value_type) + { + case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG): + sint_ptr = (s32_t*)vb->value; + snmp_asn1_enc_s32t_cnt(*sint_ptr, &vb->vlen); + break; + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER): + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE): + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS): + uint_ptr = (u32_t*)vb->value; + snmp_asn1_enc_u32t_cnt(*uint_ptr, &vb->vlen); + break; + case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR): + case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL): + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR): + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE): + vb->vlen = vb->value_len; + break; + case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID): + sint_ptr = (s32_t*)vb->value; + snmp_asn1_enc_oid_cnt(vb->value_len / sizeof(s32_t), sint_ptr, &vb->vlen); + break; + default: + /* unsupported type */ + vb->vlen = 0; + break; + }; + /* encoding length of value length field */ + snmp_asn1_enc_length_cnt(vb->vlen, &vb->vlenlen); + snmp_asn1_enc_oid_cnt(vb->ident_len, vb->ident, &vb->olen); + snmp_asn1_enc_length_cnt(vb->olen, &vb->olenlen); + + vb->seqlen = 1 + vb->vlenlen + vb->vlen; + vb->seqlen += 1 + vb->olenlen + vb->olen; + snmp_asn1_enc_length_cnt(vb->seqlen, &vb->seqlenlen); + + /* varbind seq */ + tot_len += 1 + vb->seqlenlen + vb->seqlen; + + vb = vb->prev; + } + + /* varbind-list seq */ + root->seqlen = tot_len; + snmp_asn1_enc_length_cnt(root->seqlen, &root->seqlenlen); + tot_len += 1 + root->seqlenlen; + + return tot_len; +} + +/** + * Encodes response header from head to tail. + */ +static u16_t +snmp_resp_header_enc(struct snmp_msg_pstat *m_stat, struct pbuf *p) +{ + u16_t ofs; + + ofs = 0; + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_stat->rhl.seqlen); + ofs += m_stat->rhl.seqlenlen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_stat->rhl.verlen); + ofs += m_stat->rhl.verlenlen; + snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.verlen, snmp_version); + ofs += m_stat->rhl.verlen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_stat->rhl.comlen); + ofs += m_stat->rhl.comlenlen; + snmp_asn1_enc_raw(p, ofs, m_stat->rhl.comlen, m_stat->community); + ofs += m_stat->rhl.comlen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_GET_RESP)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_stat->rhl.pdulen); + ofs += m_stat->rhl.pdulenlen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_stat->rhl.ridlen); + ofs += m_stat->rhl.ridlenlen; + snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.ridlen, m_stat->rid); + ofs += m_stat->rhl.ridlen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_stat->rhl.errstatlen); + ofs += m_stat->rhl.errstatlenlen; + snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.errstatlen, m_stat->error_status); + ofs += m_stat->rhl.errstatlen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_stat->rhl.erridxlen); + ofs += m_stat->rhl.erridxlenlen; + snmp_asn1_enc_s32t(p, ofs, m_stat->rhl.erridxlen, m_stat->error_index); + ofs += m_stat->rhl.erridxlen; + + return ofs; +} + +/** + * Encodes trap header from head to tail. + */ +static u16_t +snmp_trap_header_enc(struct snmp_msg_trap *m_trap, struct pbuf *p) +{ + u16_t ofs; + + ofs = 0; + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_trap->thl.seqlen); + ofs += m_trap->thl.seqlenlen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_trap->thl.verlen); + ofs += m_trap->thl.verlenlen; + snmp_asn1_enc_s32t(p, ofs, m_trap->thl.verlen, snmp_version); + ofs += m_trap->thl.verlen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_trap->thl.comlen); + ofs += m_trap->thl.comlenlen; + snmp_asn1_enc_raw(p, ofs, m_trap->thl.comlen, (u8_t *)&snmp_publiccommunity[0]); + ofs += m_trap->thl.comlen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_CONTXT | SNMP_ASN1_CONSTR | SNMP_ASN1_PDU_TRAP)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_trap->thl.pdulen); + ofs += m_trap->thl.pdulenlen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_trap->thl.eidlen); + ofs += m_trap->thl.eidlenlen; + snmp_asn1_enc_oid(p, ofs, m_trap->enterprise->len, &m_trap->enterprise->id[0]); + ofs += m_trap->thl.eidlen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_trap->thl.aaddrlen); + ofs += m_trap->thl.aaddrlenlen; + snmp_asn1_enc_raw(p, ofs, m_trap->thl.aaddrlen, &m_trap->sip_raw[0]); + ofs += m_trap->thl.aaddrlen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_trap->thl.gtrplen); + ofs += m_trap->thl.gtrplenlen; + snmp_asn1_enc_u32t(p, ofs, m_trap->thl.gtrplen, m_trap->gen_trap); + ofs += m_trap->thl.gtrplen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_trap->thl.strplen); + ofs += m_trap->thl.strplenlen; + snmp_asn1_enc_u32t(p, ofs, m_trap->thl.strplen, m_trap->spc_trap); + ofs += m_trap->thl.strplen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, m_trap->thl.tslen); + ofs += m_trap->thl.tslenlen; + snmp_asn1_enc_u32t(p, ofs, m_trap->thl.tslen, m_trap->ts); + ofs += m_trap->thl.tslen; + + return ofs; +} + +/** + * Encodes varbind list from head to tail. + */ +static u16_t +snmp_varbind_list_enc(struct snmp_varbind_root *root, struct pbuf *p, u16_t ofs) +{ + struct snmp_varbind *vb; + s32_t *sint_ptr; + u32_t *uint_ptr; + u8_t *raw_ptr; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, root->seqlen); + ofs += root->seqlenlen; + + vb = root->head; + while ( vb != NULL ) + { + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_CONSTR | SNMP_ASN1_SEQ)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, vb->seqlen); + ofs += vb->seqlenlen; + + snmp_asn1_enc_type(p, ofs, (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID)); + ofs += 1; + snmp_asn1_enc_length(p, ofs, vb->olen); + ofs += vb->olenlen; + snmp_asn1_enc_oid(p, ofs, vb->ident_len, &vb->ident[0]); + ofs += vb->olen; + + snmp_asn1_enc_type(p, ofs, vb->value_type); + ofs += 1; + snmp_asn1_enc_length(p, ofs, vb->vlen); + ofs += vb->vlenlen; + + switch (vb->value_type) + { + case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_INTEG): + sint_ptr = (s32_t*)vb->value; + snmp_asn1_enc_s32t(p, ofs, vb->vlen, *sint_ptr); + break; + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_COUNTER): + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_GAUGE): + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_TIMETICKS): + uint_ptr = (u32_t*)vb->value; + snmp_asn1_enc_u32t(p, ofs, vb->vlen, *uint_ptr); + break; + case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OC_STR): + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_IPADDR): + case (SNMP_ASN1_APPLIC | SNMP_ASN1_PRIMIT | SNMP_ASN1_OPAQUE): + raw_ptr = (u8_t*)vb->value; + snmp_asn1_enc_raw(p, ofs, vb->vlen, raw_ptr); + break; + case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_NUL): + break; + case (SNMP_ASN1_UNIV | SNMP_ASN1_PRIMIT | SNMP_ASN1_OBJ_ID): + sint_ptr = (s32_t*)vb->value; + snmp_asn1_enc_oid(p, ofs, vb->value_len / sizeof(s32_t), sint_ptr); + break; + default: + /* unsupported type */ + break; + }; + ofs += vb->vlen; + vb = vb->next; + } + return ofs; +} + +#endif /* LWIP_SNMP */ diff --git a/third_party/lwip-1.4.1/src/core/stats.c b/third_party/lwip-1.4.1/src/core/stats.c new file mode 100644 index 0000000..0833301 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/stats.c @@ -0,0 +1,176 @@ +/** + * @file + * Statistics module + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#if LWIP_STATS /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/def.h" +#include "lwip/stats.h" +#include "lwip/mem.h" + +#include + +struct stats_ lwip_stats; + +void stats_init(void) +{ +#ifdef LWIP_DEBUG +#if MEMP_STATS + const char * memp_names[] = { +#define LWIP_MEMPOOL(name,num,size,desc) desc, +#include "lwip/memp_std.h" + }; + int i; + for (i = 0; i < MEMP_MAX; i++) { + lwip_stats.memp[i].name = memp_names[i]; + } +#endif /* MEMP_STATS */ +#if MEM_STATS + lwip_stats.mem.name = "MEM"; +#endif /* MEM_STATS */ +#endif /* LWIP_DEBUG */ +} + +#if LWIP_STATS_DISPLAY +void +stats_display_proto(struct stats_proto *proto, const char *name) +{ + LWIP_PLATFORM_DIAG(("\n%s\n\t", name)); + LWIP_PLATFORM_DIAG(("xmit: %"STAT_COUNTER_F"\n\t", proto->xmit)); + LWIP_PLATFORM_DIAG(("recv: %"STAT_COUNTER_F"\n\t", proto->recv)); + LWIP_PLATFORM_DIAG(("fw: %"STAT_COUNTER_F"\n\t", proto->fw)); + LWIP_PLATFORM_DIAG(("drop: %"STAT_COUNTER_F"\n\t", proto->drop)); + LWIP_PLATFORM_DIAG(("chkerr: %"STAT_COUNTER_F"\n\t", proto->chkerr)); + LWIP_PLATFORM_DIAG(("lenerr: %"STAT_COUNTER_F"\n\t", proto->lenerr)); + LWIP_PLATFORM_DIAG(("memerr: %"STAT_COUNTER_F"\n\t", proto->memerr)); + LWIP_PLATFORM_DIAG(("rterr: %"STAT_COUNTER_F"\n\t", proto->rterr)); + LWIP_PLATFORM_DIAG(("proterr: %"STAT_COUNTER_F"\n\t", proto->proterr)); + LWIP_PLATFORM_DIAG(("opterr: %"STAT_COUNTER_F"\n\t", proto->opterr)); + LWIP_PLATFORM_DIAG(("err: %"STAT_COUNTER_F"\n\t", proto->err)); + LWIP_PLATFORM_DIAG(("cachehit: %"STAT_COUNTER_F"\n", proto->cachehit)); +} + +#if IGMP_STATS +void +stats_display_igmp(struct stats_igmp *igmp) +{ + LWIP_PLATFORM_DIAG(("\nIGMP\n\t")); + LWIP_PLATFORM_DIAG(("xmit: %"STAT_COUNTER_F"\n\t", igmp->xmit)); + LWIP_PLATFORM_DIAG(("recv: %"STAT_COUNTER_F"\n\t", igmp->recv)); + LWIP_PLATFORM_DIAG(("drop: %"STAT_COUNTER_F"\n\t", igmp->drop)); + LWIP_PLATFORM_DIAG(("chkerr: %"STAT_COUNTER_F"\n\t", igmp->chkerr)); + LWIP_PLATFORM_DIAG(("lenerr: %"STAT_COUNTER_F"\n\t", igmp->lenerr)); + LWIP_PLATFORM_DIAG(("memerr: %"STAT_COUNTER_F"\n\t", igmp->memerr)); + LWIP_PLATFORM_DIAG(("proterr: %"STAT_COUNTER_F"\n\t", igmp->proterr)); + LWIP_PLATFORM_DIAG(("rx_v1: %"STAT_COUNTER_F"\n\t", igmp->rx_v1)); + LWIP_PLATFORM_DIAG(("rx_group: %"STAT_COUNTER_F"\n", igmp->rx_group)); + LWIP_PLATFORM_DIAG(("rx_general: %"STAT_COUNTER_F"\n", igmp->rx_general)); + LWIP_PLATFORM_DIAG(("rx_report: %"STAT_COUNTER_F"\n\t", igmp->rx_report)); + LWIP_PLATFORM_DIAG(("tx_join: %"STAT_COUNTER_F"\n\t", igmp->tx_join)); + LWIP_PLATFORM_DIAG(("tx_leave: %"STAT_COUNTER_F"\n\t", igmp->tx_leave)); + LWIP_PLATFORM_DIAG(("tx_report: %"STAT_COUNTER_F"\n\t", igmp->tx_report)); +} +#endif /* IGMP_STATS */ + +#if MEM_STATS || MEMP_STATS +void +stats_display_mem(struct stats_mem *mem, const char *name) +{ + LWIP_PLATFORM_DIAG(("\nMEM %s\n\t", name)); + LWIP_PLATFORM_DIAG(("avail: %"U32_F"\n\t", (u32_t)mem->avail)); + LWIP_PLATFORM_DIAG(("used: %"U32_F"\n\t", (u32_t)mem->used)); + LWIP_PLATFORM_DIAG(("max: %"U32_F"\n\t", (u32_t)mem->max)); + LWIP_PLATFORM_DIAG(("err: %"U32_F"\n", (u32_t)mem->err)); +} + +#if MEMP_STATS +void +stats_display_memp(struct stats_mem *mem, int index) +{ + char * memp_names[] = { +#define LWIP_MEMPOOL(name,num,size,desc) desc, +#include "lwip/memp_std.h" + }; + if(index < MEMP_MAX) { + stats_display_mem(mem, memp_names[index]); + } +} +#endif /* MEMP_STATS */ +#endif /* MEM_STATS || MEMP_STATS */ + +#if SYS_STATS +void +stats_display_sys(struct stats_sys *sys) +{ + LWIP_PLATFORM_DIAG(("\nSYS\n\t")); + LWIP_PLATFORM_DIAG(("sem.used: %"U32_F"\n\t", (u32_t)sys->sem.used)); + LWIP_PLATFORM_DIAG(("sem.max: %"U32_F"\n\t", (u32_t)sys->sem.max)); + LWIP_PLATFORM_DIAG(("sem.err: %"U32_F"\n\t", (u32_t)sys->sem.err)); + LWIP_PLATFORM_DIAG(("mutex.used: %"U32_F"\n\t", (u32_t)sys->mutex.used)); + LWIP_PLATFORM_DIAG(("mutex.max: %"U32_F"\n\t", (u32_t)sys->mutex.max)); + LWIP_PLATFORM_DIAG(("mutex.err: %"U32_F"\n\t", (u32_t)sys->mutex.err)); + LWIP_PLATFORM_DIAG(("mbox.used: %"U32_F"\n\t", (u32_t)sys->mbox.used)); + LWIP_PLATFORM_DIAG(("mbox.max: %"U32_F"\n\t", (u32_t)sys->mbox.max)); + LWIP_PLATFORM_DIAG(("mbox.err: %"U32_F"\n\t", (u32_t)sys->mbox.err)); +} +#endif /* SYS_STATS */ + +void +stats_display(void) +{ + s16_t i; + + LINK_STATS_DISPLAY(); + ETHARP_STATS_DISPLAY(); + IPFRAG_STATS_DISPLAY(); + IP_STATS_DISPLAY(); + IGMP_STATS_DISPLAY(); + ICMP_STATS_DISPLAY(); + UDP_STATS_DISPLAY(); + TCP_STATS_DISPLAY(); + MEM_STATS_DISPLAY(); + for (i = 0; i < MEMP_MAX; i++) { + MEMP_STATS_DISPLAY(i); + } + SYS_STATS_DISPLAY(); +} +#endif /* LWIP_STATS_DISPLAY */ + +#endif /* LWIP_STATS */ + diff --git a/third_party/lwip-1.4.1/src/core/sys.c b/third_party/lwip-1.4.1/src/core/sys.c new file mode 100644 index 0000000..391e1e7 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/sys.c @@ -0,0 +1,68 @@ +/** + * @file + * lwIP Operating System abstraction + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#include "lwip/sys.h" + +/* Most of the functions defined in sys.h must be implemented in the + * architecture-dependent file sys_arch.c */ + +#if !NO_SYS + +#ifndef sys_msleep +/** + * Sleep for some ms. Timeouts are NOT processed while sleeping. + * + * @param ms number of milliseconds to sleep + */ +void +sys_msleep(u32_t ms) +{ + if (ms > 0) { + sys_sem_t delaysem; + err_t err = sys_sem_new(&delaysem, 0); + if (err == ERR_OK) { + sys_arch_sem_wait(&delaysem, ms); + sys_sem_free(&delaysem); + } + } +} +#endif /* sys_msleep */ + +#endif /* !NO_SYS */ diff --git a/third_party/lwip-1.4.1/src/core/tcp.c b/third_party/lwip-1.4.1/src/core/tcp.c new file mode 100644 index 0000000..3936b76 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/tcp.c @@ -0,0 +1,1742 @@ +/** + * @file + * Transmission Control Protocol for IP + * + * This file contains common functions for the TCP implementation, such as functinos + * for manipulating the data structures and the TCP timer functions. TCP functions + * related to input and output is found in tcp_in.c and tcp_out.c respectively. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/memp.h" +#include "lwip/snmp.h" +#include "lwip/tcp.h" +#include "lwip/tcp_impl.h" +#include "lwip/debug.h" +#include "lwip/stats.h" + +#include + +#ifndef TCP_LOCAL_PORT_RANGE_START +/* From http://www.iana.org/assignments/port-numbers: + "The Dynamic and/or Private Ports are those from 49152 through 65535" */ +#define TCP_LOCAL_PORT_RANGE_START 0xc000 +#define TCP_LOCAL_PORT_RANGE_END 0xffff +#define TCP_ENSURE_LOCAL_PORT_RANGE(port) (((port) & ~TCP_LOCAL_PORT_RANGE_START) + TCP_LOCAL_PORT_RANGE_START) +#endif + +#if LWIP_TCP_KEEPALIVE +#define TCP_KEEP_DUR(pcb) ((pcb)->keep_cnt * (pcb)->keep_intvl) +#define TCP_KEEP_INTVL(pcb) ((pcb)->keep_intvl) +#else /* LWIP_TCP_KEEPALIVE */ +#define TCP_KEEP_DUR(pcb) TCP_MAXIDLE +#define TCP_KEEP_INTVL(pcb) TCP_KEEPINTVL_DEFAULT +#endif /* LWIP_TCP_KEEPALIVE */ + +const char * const tcp_state_str[] = { + "CLOSED", + "LISTEN", + "SYN_SENT", + "SYN_RCVD", + "ESTABLISHED", + "FIN_WAIT_1", + "FIN_WAIT_2", + "CLOSE_WAIT", + "CLOSING", + "LAST_ACK", + "TIME_WAIT" +}; + +/* last local TCP port */ +static u16_t tcp_port = TCP_LOCAL_PORT_RANGE_START; + +/* Incremented every coarse grained timer shot (typically every 500 ms). */ +u32_t tcp_ticks; +const u8_t tcp_backoff[13] = + { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7}; + /* Times per slowtmr hits */ +const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 }; + +/* The TCP PCB lists. */ + +/** List of all TCP PCBs bound but not yet (connected || listening) */ +struct tcp_pcb *tcp_bound_pcbs; +/** List of all TCP PCBs in LISTEN state */ +union tcp_listen_pcbs_t tcp_listen_pcbs; +/** List of all TCP PCBs that are in a state in which + * they accept or send data. */ +struct tcp_pcb *tcp_active_pcbs; +/** List of all TCP PCBs in TIME-WAIT state */ +struct tcp_pcb *tcp_tw_pcbs; + +#define NUM_TCP_PCB_LISTS 4 +#define NUM_TCP_PCB_LISTS_NO_TIME_WAIT 3 +/** An array with all (non-temporary) PCB lists, mainly used for smaller code size */ +struct tcp_pcb ** const tcp_pcb_lists[] = {&tcp_listen_pcbs.pcbs, &tcp_bound_pcbs, + &tcp_active_pcbs, &tcp_tw_pcbs}; + +/** Only used for temporary storage. */ +struct tcp_pcb *tcp_tmp_pcb; + +u8_t tcp_active_pcbs_changed; + +/** Timer counter to handle calling slow-timer from tcp_tmr() */ +static u8_t tcp_timer; +static u8_t tcp_timer_ctr; +static u16_t tcp_new_port(void); + +/** + * Initialize this module. + */ +void +tcp_init(void) +{ +#if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) + tcp_port = TCP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND()); +#endif /* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) */ +} + +/** + * Called periodically to dispatch TCP timers. + */ +void +tcp_tmr(void) +{ + /* Call tcp_fasttmr() every 250 ms */ + tcp_fasttmr(); + + if (++tcp_timer & 1) { + /* Call tcp_tmr() every 500 ms, i.e., every other timer + tcp_tmr() is called. */ + tcp_slowtmr(); + } +} + +/** + * Closes the TX side of a connection held by the PCB. + * For tcp_close(), a RST is sent if the application didn't receive all data + * (tcp_recved() not called for all data passed to recv callback). + * + * Listening pcbs are freed and may not be referenced any more. + * Connection pcbs are freed if not yet connected and may not be referenced + * any more. If a connection is established (at least SYN received or in + * a closing state), the connection is closed, and put in a closing state. + * The pcb is then automatically freed in tcp_slowtmr(). It is therefore + * unsafe to reference it. + * + * @param pcb the tcp_pcb to close + * @return ERR_OK if connection has been closed + * another err_t if closing failed and pcb is not freed + */ +static err_t +tcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data) +{ + err_t err; + + if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) { + if ((pcb->refused_data != NULL) || (pcb->rcv_wnd != TCP_WND)) { + /* Not all data received by application, send RST to tell the remote + side about this. */ + LWIP_ASSERT("pcb->flags & TF_RXCLOSED", pcb->flags & TF_RXCLOSED); + + /* don't call tcp_abort here: we must not deallocate the pcb since + that might not be expected when calling tcp_close */ + tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip, + pcb->local_port, pcb->remote_port); + + tcp_pcb_purge(pcb); + TCP_RMV_ACTIVE(pcb); + if (pcb->state == ESTABLISHED) { + /* move to TIME_WAIT since we close actively */ + pcb->state = TIME_WAIT; + TCP_REG(&tcp_tw_pcbs, pcb); + } else { + /* CLOSE_WAIT: deallocate the pcb since we already sent a RST for it */ + memp_free(MEMP_TCP_PCB, pcb); + } + return ERR_OK; + } + } + + switch (pcb->state) { + case CLOSED: + /* Closing a pcb in the CLOSED state might seem erroneous, + * however, it is in this state once allocated and as yet unused + * and the user needs some way to free it should the need arise. + * Calling tcp_close() with a pcb that has already been closed, (i.e. twice) + * or for a pcb that has been used and then entered the CLOSED state + * is erroneous, but this should never happen as the pcb has in those cases + * been freed, and so any remaining handles are bogus. */ + err = ERR_OK; + if (pcb->local_port != 0) { + TCP_RMV(&tcp_bound_pcbs, pcb); + } + memp_free(MEMP_TCP_PCB, pcb); + pcb = NULL; + break; + case LISTEN: + err = ERR_OK; + tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb); + memp_free(MEMP_TCP_PCB_LISTEN, pcb); + pcb = NULL; + break; + case SYN_SENT: + err = ERR_OK; + TCP_PCB_REMOVE_ACTIVE(pcb); + memp_free(MEMP_TCP_PCB, pcb); + pcb = NULL; + snmp_inc_tcpattemptfails(); + break; + case SYN_RCVD: + err = tcp_send_fin(pcb); + if (err == ERR_OK) { + snmp_inc_tcpattemptfails(); + pcb->state = FIN_WAIT_1; + } + break; + case ESTABLISHED: + err = tcp_send_fin(pcb); + if (err == ERR_OK) { + snmp_inc_tcpestabresets(); + pcb->state = FIN_WAIT_1; + } + break; + case CLOSE_WAIT: + err = tcp_send_fin(pcb); + if (err == ERR_OK) { + snmp_inc_tcpestabresets(); + pcb->state = LAST_ACK; + } + break; + default: + /* Has already been closed, do nothing. */ + err = ERR_OK; + pcb = NULL; + break; + } + + if (pcb != NULL && err == ERR_OK) { + /* To ensure all data has been sent when tcp_close returns, we have + to make sure tcp_output doesn't fail. + Since we don't really have to ensure all data has been sent when tcp_close + returns (unsent data is sent from tcp timer functions, also), we don't care + for the return value of tcp_output for now. */ + /* @todo: When implementing SO_LINGER, this must be changed somehow: + If SOF_LINGER is set, the data should be sent and acked before close returns. + This can only be valid for sequential APIs, not for the raw API. */ + tcp_output(pcb); + } + return err; +} + +/** + * Closes the connection held by the PCB. + * + * Listening pcbs are freed and may not be referenced any more. + * Connection pcbs are freed if not yet connected and may not be referenced + * any more. If a connection is established (at least SYN received or in + * a closing state), the connection is closed, and put in a closing state. + * The pcb is then automatically freed in tcp_slowtmr(). It is therefore + * unsafe to reference it (unless an error is returned). + * + * @param pcb the tcp_pcb to close + * @return ERR_OK if connection has been closed + * another err_t if closing failed and pcb is not freed + */ +err_t +tcp_close(struct tcp_pcb *pcb) +{ +#if TCP_DEBUG + LWIP_DEBUGF(TCP_DEBUG, ("tcp_close: closing in ")); + tcp_debug_print_state(pcb->state); +#endif /* TCP_DEBUG */ + + if (pcb->state != LISTEN) { + /* Set a flag not to receive any more data... */ + pcb->flags |= TF_RXCLOSED; + } + /* ... and close */ + return tcp_close_shutdown(pcb, 1); +} + +/** + * Causes all or part of a full-duplex connection of this PCB to be shut down. + * This doesn't deallocate the PCB unless shutting down both sides! + * Shutting down both sides is the same as calling tcp_close, so if it succeds, + * the PCB should not be referenced any more. + * + * @param pcb PCB to shutdown + * @param shut_rx shut down receive side if this is != 0 + * @param shut_tx shut down send side if this is != 0 + * @return ERR_OK if shutdown succeeded (or the PCB has already been shut down) + * another err_t on error. + */ +err_t +tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx) +{ + if (pcb->state == LISTEN) { + return ERR_CONN; + } + if (shut_rx) { + /* shut down the receive side: set a flag not to receive any more data... */ + pcb->flags |= TF_RXCLOSED; + if (shut_tx) { + /* shutting down the tx AND rx side is the same as closing for the raw API */ + return tcp_close_shutdown(pcb, 1); + } + /* ... and free buffered data */ + if (pcb->refused_data != NULL) { + pbuf_free(pcb->refused_data); + pcb->refused_data = NULL; + } + } + if (shut_tx) { + /* This can't happen twice since if it succeeds, the pcb's state is changed. + Only close in these states as the others directly deallocate the PCB */ + switch (pcb->state) { + case SYN_RCVD: + case ESTABLISHED: + case CLOSE_WAIT: + return tcp_close_shutdown(pcb, shut_rx); + default: + /* Not (yet?) connected, cannot shutdown the TX side as that would bring us + into CLOSED state, where the PCB is deallocated. */ + return ERR_CONN; + } + } + return ERR_OK; +} + +/** + * Abandons a connection and optionally sends a RST to the remote + * host. Deletes the local protocol control block. This is done when + * a connection is killed because of shortage of memory. + * + * @param pcb the tcp_pcb to abort + * @param reset boolean to indicate whether a reset should be sent + */ +void +tcp_abandon(struct tcp_pcb *pcb, int reset) +{ + u32_t seqno, ackno; +#if LWIP_CALLBACK_API + tcp_err_fn errf; +#endif /* LWIP_CALLBACK_API */ + void *errf_arg; + + /* pcb->state LISTEN not allowed here */ + LWIP_ASSERT("don't call tcp_abort/tcp_abandon for listen-pcbs", + pcb->state != LISTEN); + /* Figure out on which TCP PCB list we are, and remove us. If we + are in an active state, call the receive function associated with + the PCB with a NULL argument, and send an RST to the remote end. */ + if (pcb->state == TIME_WAIT) { + tcp_pcb_remove(&tcp_tw_pcbs, pcb); + memp_free(MEMP_TCP_PCB, pcb); + } else { + seqno = pcb->snd_nxt; + ackno = pcb->rcv_nxt; +#if LWIP_CALLBACK_API + errf = pcb->errf; +#endif /* LWIP_CALLBACK_API */ + errf_arg = pcb->callback_arg; + TCP_PCB_REMOVE_ACTIVE(pcb); + if (pcb->unacked != NULL) { + tcp_segs_free(pcb->unacked); + } + if (pcb->unsent != NULL) { + tcp_segs_free(pcb->unsent); + } +#if TCP_QUEUE_OOSEQ + if (pcb->ooseq != NULL) { + tcp_segs_free(pcb->ooseq); + } +#endif /* TCP_QUEUE_OOSEQ */ + if (reset) { + LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_abandon: sending RST\n")); + tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, pcb->local_port, pcb->remote_port); + } + memp_free(MEMP_TCP_PCB, pcb); + TCP_EVENT_ERR(errf, errf_arg, ERR_ABRT); + } +} + +/** + * Aborts the connection by sending a RST (reset) segment to the remote + * host. The pcb is deallocated. This function never fails. + * + * ATTENTION: When calling this from one of the TCP callbacks, make + * sure you always return ERR_ABRT (and never return ERR_ABRT otherwise + * or you will risk accessing deallocated memory or memory leaks! + * + * @param pcb the tcp pcb to abort + */ +void +tcp_abort(struct tcp_pcb *pcb) +{ + tcp_abandon(pcb, 1); +} + +/** + * Binds the connection to a local portnumber and IP address. If the + * IP address is not given (i.e., ipaddr == NULL), the IP address of + * the outgoing network interface is used instead. + * + * @param pcb the tcp_pcb to bind (no check is done whether this pcb is + * already bound!) + * @param ipaddr the local ip address to bind to (use IP_ADDR_ANY to bind + * to any local address + * @param port the local port to bind to + * @return ERR_USE if the port is already in use + * ERR_VAL if bind failed because the PCB is not in a valid state + * ERR_OK if bound + */ +err_t +tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port) +{ + int i; + int max_pcb_list = NUM_TCP_PCB_LISTS; + struct tcp_pcb *cpcb; + + LWIP_ERROR("tcp_bind: can only bind in state CLOSED", pcb->state == CLOSED, return ERR_VAL); + +#if SO_REUSE + /* Unless the REUSEADDR flag is set, + we have to check the pcbs in TIME-WAIT state, also. + We do not dump TIME_WAIT pcb's; they can still be matched by incoming + packets using both local and remote IP addresses and ports to distinguish. + */ + if (ip_get_option(pcb, SOF_REUSEADDR)) { + max_pcb_list = NUM_TCP_PCB_LISTS_NO_TIME_WAIT; + } +#endif /* SO_REUSE */ + + if (port == 0) { + port = tcp_new_port(); + if (port == 0) { + return ERR_BUF; + } + } + + /* Check if the address already is in use (on all lists) */ + for (i = 0; i < max_pcb_list; i++) { + for(cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) { + if (cpcb->local_port == port) { +#if SO_REUSE + /* Omit checking for the same port if both pcbs have REUSEADDR set. + For SO_REUSEADDR, the duplicate-check for a 5-tuple is done in + tcp_connect. */ + if (!ip_get_option(pcb, SOF_REUSEADDR) || + !ip_get_option(cpcb, SOF_REUSEADDR)) +#endif /* SO_REUSE */ + { + if (ip_addr_isany(&(cpcb->local_ip)) || + ip_addr_isany(ipaddr) || + ip_addr_cmp(&(cpcb->local_ip), ipaddr)) { + return ERR_USE; + } + } + } + } + } + + if (!ip_addr_isany(ipaddr)) { + pcb->local_ip = *ipaddr; + } + pcb->local_port = port; + TCP_REG(&tcp_bound_pcbs, pcb); + LWIP_DEBUGF(TCP_DEBUG, ("tcp_bind: bind to port %"U16_F"\n", port)); + return ERR_OK; +} +#if LWIP_CALLBACK_API +/** + * Default accept callback if no accept callback is specified by the user. + */ +static err_t +tcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err) +{ + LWIP_UNUSED_ARG(arg); + LWIP_UNUSED_ARG(pcb); + LWIP_UNUSED_ARG(err); + + return ERR_ABRT; +} +#endif /* LWIP_CALLBACK_API */ + +/** + * Set the state of the connection to be LISTEN, which means that it + * is able to accept incoming connections. The protocol control block + * is reallocated in order to consume less memory. Setting the + * connection to LISTEN is an irreversible process. + * + * @param pcb the original tcp_pcb + * @param backlog the incoming connections queue limit + * @return tcp_pcb used for listening, consumes less memory. + * + * @note The original tcp_pcb is freed. This function therefore has to be + * called like this: + * tpcb = tcp_listen(tpcb); + */ +struct tcp_pcb * +tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog) +{ + struct tcp_pcb_listen *lpcb; + + LWIP_UNUSED_ARG(backlog); + LWIP_ERROR("tcp_listen: pcb already connected", pcb->state == CLOSED, return NULL); + + /* already listening? */ + if (pcb->state == LISTEN) { + return pcb; + } +#if SO_REUSE + if (ip_get_option(pcb, SOF_REUSEADDR)) { + /* Since SOF_REUSEADDR allows reusing a local address before the pcb's usage + is declared (listen-/connection-pcb), we have to make sure now that + this port is only used once for every local IP. */ + for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { + if (lpcb->local_port == pcb->local_port) { + if (ip_addr_cmp(&lpcb->local_ip, &pcb->local_ip)) { + /* this address/port is already used */ + return NULL; + } + } + } + } +#endif /* SO_REUSE */ + lpcb = (struct tcp_pcb_listen *)memp_malloc(MEMP_TCP_PCB_LISTEN); + if (lpcb == NULL) { + return NULL; + } + lpcb->callback_arg = pcb->callback_arg; + lpcb->local_port = pcb->local_port; + lpcb->state = LISTEN; + lpcb->prio = pcb->prio; + lpcb->so_options = pcb->so_options; + ip_set_option(lpcb, SOF_ACCEPTCONN); + lpcb->ttl = pcb->ttl; + lpcb->tos = pcb->tos; + ip_addr_copy(lpcb->local_ip, pcb->local_ip); + if (pcb->local_port != 0) { + TCP_RMV(&tcp_bound_pcbs, pcb); + } + memp_free(MEMP_TCP_PCB, pcb); +#if LWIP_CALLBACK_API + lpcb->accept = tcp_accept_null; +#endif /* LWIP_CALLBACK_API */ +#if TCP_LISTEN_BACKLOG + lpcb->accepts_pending = 0; + lpcb->backlog = (backlog ? backlog : 1); +#endif /* TCP_LISTEN_BACKLOG */ + TCP_REG(&tcp_listen_pcbs.pcbs, (struct tcp_pcb *)lpcb); + return (struct tcp_pcb *)lpcb; +} + +/** + * Update the state that tracks the available window space to advertise. + * + * Returns how much extra window would be advertised if we sent an + * update now. + */ +u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb) +{ + u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd; + + if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) { + /* we can advertise more window */ + pcb->rcv_ann_wnd = pcb->rcv_wnd; + return new_right_edge - pcb->rcv_ann_right_edge; + } else { + if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) { + /* Can happen due to other end sending out of advertised window, + * but within actual available (but not yet advertised) window */ + pcb->rcv_ann_wnd = 0; + } else { + /* keep the right edge of window constant */ + u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt; + LWIP_ASSERT("new_rcv_ann_wnd <= 0xffff", new_rcv_ann_wnd <= 0xffff); + pcb->rcv_ann_wnd = (u16_t)new_rcv_ann_wnd; + } + return 0; + } +} + +/** + * This function should be called by the application when it has + * processed the data. The purpose is to advertise a larger window + * when the data has been processed. + * + * @param pcb the tcp_pcb for which data is read + * @param len the amount of bytes that have been read by the application + */ +void +tcp_recved(struct tcp_pcb *pcb, u16_t len) +{ + int wnd_inflation; + + /* pcb->state LISTEN not allowed here */ + LWIP_ASSERT("don't call tcp_recved for listen-pcbs", + pcb->state != LISTEN); + LWIP_ASSERT("tcp_recved: len would wrap rcv_wnd\n", + len <= 0xffff - pcb->rcv_wnd ); + + pcb->rcv_wnd += len; + if (pcb->rcv_wnd > TCP_WND) { + pcb->rcv_wnd = TCP_WND; + } + + wnd_inflation = tcp_update_rcv_ann_wnd(pcb); + + /* If the change in the right edge of window is significant (default + * watermark is TCP_WND/4), then send an explicit update now. + * Otherwise wait for a packet to be sent in the normal course of + * events (or more window to be available later) */ + if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) { + tcp_ack_now(pcb); + tcp_output(pcb); + } + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_recved: recveived %"U16_F" bytes, wnd %"U16_F" (%"U16_F").\n", + len, pcb->rcv_wnd, TCP_WND - pcb->rcv_wnd)); +} + +/** + * Allocate a new local TCP port. + * + * @return a new (free) local TCP port number + */ +static u16_t +tcp_new_port(void) +{ + u8_t i; + u16_t n = 0; + struct tcp_pcb *pcb; + +again: + if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) { + tcp_port = TCP_LOCAL_PORT_RANGE_START; + } + /* Check all PCB lists. */ + for (i = 0; i < NUM_TCP_PCB_LISTS; i++) { + for(pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) { + if (pcb->local_port == tcp_port) { + if (++n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) { + return 0; + } + goto again; + } + } + } + return tcp_port; +} + +/** + * Connects to another host. The function given as the "connected" + * argument will be called when the connection has been established. + * + * @param pcb the tcp_pcb used to establish the connection + * @param ipaddr the remote ip address to connect to + * @param port the remote tcp port to connect to + * @param connected callback function to call when connected (or on error) + * @return ERR_VAL if invalid arguments are given + * ERR_OK if connect request has been sent + * other err_t values if connect request couldn't be sent + */ +err_t +tcp_connect(struct tcp_pcb *pcb, ip_addr_t *ipaddr, u16_t port, + tcp_connected_fn connected) +{ + err_t ret; + u32_t iss; + u16_t old_local_port; + + LWIP_ERROR("tcp_connect: can only connect from state CLOSED", pcb->state == CLOSED, return ERR_ISCONN); + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_connect to port %"U16_F"\n", port)); + if (ipaddr != NULL) { + pcb->remote_ip = *ipaddr; + } else { + return ERR_VAL; + } + pcb->remote_port = port; + + /* check if we have a route to the remote host */ + if (ip_addr_isany(&(pcb->local_ip))) { + /* no local IP address set, yet. */ + struct netif *netif = ip_route(&(pcb->remote_ip)); + if (netif == NULL) { + /* Don't even try to send a SYN packet if we have no route + since that will fail. */ + return ERR_RTE; + } + /* Use the netif's IP address as local address. */ + ip_addr_copy(pcb->local_ip, netif->ip_addr); + } + + old_local_port = pcb->local_port; + if (pcb->local_port == 0) { + pcb->local_port = tcp_new_port(); + if (pcb->local_port == 0) { + return ERR_BUF; + } + } +#if SO_REUSE + if (ip_get_option(pcb, SOF_REUSEADDR)) { + /* Since SOF_REUSEADDR allows reusing a local address, we have to make sure + now that the 5-tuple is unique. */ + struct tcp_pcb *cpcb; + int i; + /* Don't check listen- and bound-PCBs, check active- and TIME-WAIT PCBs. */ + for (i = 2; i < NUM_TCP_PCB_LISTS; i++) { + for(cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) { + if ((cpcb->local_port == pcb->local_port) && + (cpcb->remote_port == port) && + ip_addr_cmp(&cpcb->local_ip, &pcb->local_ip) && + ip_addr_cmp(&cpcb->remote_ip, ipaddr)) { + /* linux returns EISCONN here, but ERR_USE should be OK for us */ + return ERR_USE; + } + } + } + } +#endif /* SO_REUSE */ + iss = tcp_next_iss(); + pcb->rcv_nxt = 0; + pcb->snd_nxt = iss; + pcb->lastack = iss - 1; + pcb->snd_lbb = iss - 1; + pcb->rcv_wnd = TCP_WND; + pcb->rcv_ann_wnd = TCP_WND; + pcb->rcv_ann_right_edge = pcb->rcv_nxt; + pcb->snd_wnd = TCP_WND; + /* As initial send MSS, we use TCP_MSS but limit it to 536. + The send MSS is updated when an MSS option is received. */ + pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS; +#if TCP_CALCULATE_EFF_SEND_MSS + pcb->mss = tcp_eff_send_mss(pcb->mss, ipaddr); +#endif /* TCP_CALCULATE_EFF_SEND_MSS */ + pcb->cwnd = 1; + pcb->ssthresh = pcb->mss * 10; +#if LWIP_CALLBACK_API + pcb->connected = connected; +#else /* LWIP_CALLBACK_API */ + LWIP_UNUSED_ARG(connected); +#endif /* LWIP_CALLBACK_API */ + + /* Send a SYN together with the MSS option. */ + ret = tcp_enqueue_flags(pcb, TCP_SYN); + if (ret == ERR_OK) { + /* SYN segment was enqueued, changed the pcbs state now */ + pcb->state = SYN_SENT; + if (old_local_port != 0) { + TCP_RMV(&tcp_bound_pcbs, pcb); + } + TCP_REG_ACTIVE(pcb); + snmp_inc_tcpactiveopens(); + + tcp_output(pcb); + } + return ret; +} + +/** + * Called every 500 ms and implements the retransmission timer and the timer that + * removes PCBs that have been in TIME-WAIT for enough time. It also increments + * various timers such as the inactivity timer in each PCB. + * + * Automatically called from tcp_tmr(). + */ +void +tcp_slowtmr(void) +{ + struct tcp_pcb *pcb, *prev; + u16_t eff_wnd; + u8_t pcb_remove; /* flag if a PCB should be removed */ + u8_t pcb_reset; /* flag if a RST should be sent when removing */ + err_t err; + + err = ERR_OK; + + ++tcp_ticks; + ++tcp_timer_ctr; + +tcp_slowtmr_start: + /* Steps through all of the active PCBs. */ + prev = NULL; + pcb = tcp_active_pcbs; + if (pcb == NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: no active pcbs\n")); + } + while (pcb != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: processing active pcb\n")); + LWIP_ASSERT("tcp_slowtmr: active pcb->state != CLOSED\n", pcb->state != CLOSED); + LWIP_ASSERT("tcp_slowtmr: active pcb->state != LISTEN\n", pcb->state != LISTEN); + LWIP_ASSERT("tcp_slowtmr: active pcb->state != TIME-WAIT\n", pcb->state != TIME_WAIT); + if (pcb->last_timer == tcp_timer_ctr) { + /* skip this pcb, we have already processed it */ + pcb = pcb->next; + continue; + } + pcb->last_timer = tcp_timer_ctr; + + pcb_remove = 0; + pcb_reset = 0; + + if (pcb->state == SYN_SENT && pcb->nrtx == TCP_SYNMAXRTX) { + ++pcb_remove; + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max SYN retries reached\n")); + } + else if (pcb->nrtx == TCP_MAXRTX) { + ++pcb_remove; + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: max DATA retries reached\n")); + } else { + if (pcb->persist_backoff > 0) { + /* If snd_wnd is zero, use persist timer to send 1 byte probes + * instead of using the standard retransmission mechanism. */ + pcb->persist_cnt++; + if (pcb->persist_cnt >= tcp_persist_backoff[pcb->persist_backoff-1]) { + pcb->persist_cnt = 0; + if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) { + pcb->persist_backoff++; + } + tcp_zero_window_probe(pcb); + } + } else { + /* Increase the retransmission timer if it is running */ + if(pcb->rtime >= 0) { + ++pcb->rtime; + } + + if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) { + /* Time for a retransmission. */ + LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_slowtmr: rtime %"S16_F + " pcb->rto %"S16_F"\n", + pcb->rtime, pcb->rto)); + + /* Double retransmission time-out unless we are trying to + * connect to somebody (i.e., we are in SYN_SENT). */ + if (pcb->state != SYN_SENT) { + pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[pcb->nrtx]; + } + + /* Reset the retransmission timer. */ + pcb->rtime = 0; + + /* Reduce congestion window and ssthresh. */ + eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd); + pcb->ssthresh = eff_wnd >> 1; + if (pcb->ssthresh < (pcb->mss << 1)) { + pcb->ssthresh = (pcb->mss << 1); + } + pcb->cwnd = pcb->mss; + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: cwnd %"U16_F + " ssthresh %"U16_F"\n", + pcb->cwnd, pcb->ssthresh)); + + /* The following needs to be called AFTER cwnd is set to one + mss - STJ */ + tcp_rexmit_rto(pcb); + } + } + } + /* Check if this PCB has stayed too long in FIN-WAIT-2 */ + if (pcb->state == FIN_WAIT_2) { + /* If this PCB is in FIN_WAIT_2 because of SHUT_WR don't let it time out. */ + if (pcb->flags & TF_RXCLOSED) { + /* PCB was fully closed (either through close() or SHUT_RDWR): + normal FIN-WAIT timeout handling. */ + if ((u32_t)(tcp_ticks - pcb->tmr) > + TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) { + ++pcb_remove; + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in FIN-WAIT-2\n")); + } + } + } + + /* Check if KEEPALIVE should be sent */ + if(ip_get_option(pcb, SOF_KEEPALIVE) && + ((pcb->state == ESTABLISHED) || + (pcb->state == CLOSE_WAIT))) { + if((u32_t)(tcp_ticks - pcb->tmr) > + (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL) + { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: KEEPALIVE timeout. Aborting connection to %"U16_F".%"U16_F".%"U16_F".%"U16_F".\n", + ip4_addr1_16(&pcb->remote_ip), ip4_addr2_16(&pcb->remote_ip), + ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip))); + + ++pcb_remove; + ++pcb_reset; + } + else if((u32_t)(tcp_ticks - pcb->tmr) > + (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb)) + / TCP_SLOW_INTERVAL) + { + tcp_keepalive(pcb); + pcb->keep_cnt_sent++; + } + } + + /* If this PCB has queued out of sequence data, but has been + inactive for too long, will drop the data (it will eventually + be retransmitted). */ +#if TCP_QUEUE_OOSEQ + if (pcb->ooseq != NULL && + (u32_t)tcp_ticks - pcb->tmr >= pcb->rto * TCP_OOSEQ_TIMEOUT) { + tcp_segs_free(pcb->ooseq); + pcb->ooseq = NULL; + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_slowtmr: dropping OOSEQ queued data\n")); + } +#endif /* TCP_QUEUE_OOSEQ */ + + /* Check if this PCB has stayed too long in SYN-RCVD */ + if (pcb->state == SYN_RCVD) { + if ((u32_t)(tcp_ticks - pcb->tmr) > + TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) { + ++pcb_remove; + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in SYN-RCVD\n")); + } + } + + /* Check if this PCB has stayed too long in LAST-ACK */ + if (pcb->state == LAST_ACK) { + if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) { + ++pcb_remove; + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: removing pcb stuck in LAST-ACK\n")); + } + } + + /* If the PCB should be removed, do it. */ + if (pcb_remove) { + struct tcp_pcb *pcb2; + tcp_err_fn err_fn; + void *err_arg; + tcp_pcb_purge(pcb); + /* Remove PCB from tcp_active_pcbs list. */ + if (prev != NULL) { + LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_active_pcbs", pcb != tcp_active_pcbs); + prev->next = pcb->next; + } else { + /* This PCB was the first. */ + LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_active_pcbs", tcp_active_pcbs == pcb); + tcp_active_pcbs = pcb->next; + } + + if (pcb_reset) { + tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip, + pcb->local_port, pcb->remote_port); + } + + err_fn = pcb->errf; + err_arg = pcb->callback_arg; + pcb2 = pcb; + pcb = pcb->next; + memp_free(MEMP_TCP_PCB, pcb2); + + tcp_active_pcbs_changed = 0; + TCP_EVENT_ERR(err_fn, err_arg, ERR_ABRT); + if (tcp_active_pcbs_changed) { + goto tcp_slowtmr_start; + } + } else { + /* get the 'next' element now and work with 'prev' below (in case of abort) */ + prev = pcb; + pcb = pcb->next; + + /* We check if we should poll the connection. */ + ++prev->polltmr; + if (prev->polltmr >= prev->pollinterval) { + prev->polltmr = 0; + LWIP_DEBUGF(TCP_DEBUG, ("tcp_slowtmr: polling application\n")); + tcp_active_pcbs_changed = 0; + TCP_EVENT_POLL(prev, err); + if (tcp_active_pcbs_changed) { + goto tcp_slowtmr_start; + } + /* if err == ERR_ABRT, 'prev' is already deallocated */ + if (err == ERR_OK) { + tcp_output(prev); + } + } + } + } + + + /* Steps through all of the TIME-WAIT PCBs. */ + prev = NULL; + pcb = tcp_tw_pcbs; + while (pcb != NULL) { + LWIP_ASSERT("tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); + pcb_remove = 0; + + /* Check if this PCB has stayed long enough in TIME-WAIT */ + if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) { + ++pcb_remove; + } + + + + /* If the PCB should be removed, do it. */ + if (pcb_remove) { + struct tcp_pcb *pcb2; + tcp_pcb_purge(pcb); + /* Remove PCB from tcp_tw_pcbs list. */ + if (prev != NULL) { + LWIP_ASSERT("tcp_slowtmr: middle tcp != tcp_tw_pcbs", pcb != tcp_tw_pcbs); + prev->next = pcb->next; + } else { + /* This PCB was the first. */ + LWIP_ASSERT("tcp_slowtmr: first pcb == tcp_tw_pcbs", tcp_tw_pcbs == pcb); + tcp_tw_pcbs = pcb->next; + } + pcb2 = pcb; + pcb = pcb->next; + memp_free(MEMP_TCP_PCB, pcb2); + } else { + prev = pcb; + pcb = pcb->next; + } + } +} + +/** + * Is called every TCP_FAST_INTERVAL (250 ms) and process data previously + * "refused" by upper layer (application) and sends delayed ACKs. + * + * Automatically called from tcp_tmr(). + */ +void +tcp_fasttmr(void) +{ + struct tcp_pcb *pcb; + + ++tcp_timer_ctr; + +tcp_fasttmr_start: + pcb = tcp_active_pcbs; + + while(pcb != NULL) { + if (pcb->last_timer != tcp_timer_ctr) { + struct tcp_pcb *next; + pcb->last_timer = tcp_timer_ctr; + /* send delayed ACKs */ + if (pcb->flags & TF_ACK_DELAY) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_fasttmr: delayed ACK\n")); + tcp_ack_now(pcb); + tcp_output(pcb); + pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); + } + + next = pcb->next; + + /* If there is data which was previously "refused" by upper layer */ + if (pcb->refused_data != NULL) { + tcp_active_pcbs_changed = 0; + tcp_process_refused_data(pcb); + if (tcp_active_pcbs_changed) { + /* application callback has changed the pcb list: restart the loop */ + goto tcp_fasttmr_start; + } + } + pcb = next; + } + } +} + +/** Pass pcb->refused_data to the recv callback */ +err_t +tcp_process_refused_data(struct tcp_pcb *pcb) +{ + err_t err; + u8_t refused_flags = pcb->refused_data->flags; + /* set pcb->refused_data to NULL in case the callback frees it and then + closes the pcb */ + struct pbuf *refused_data = pcb->refused_data; + pcb->refused_data = NULL; + /* Notify again application with data previously received. */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: notify kept packet\n")); + TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err); + if (err == ERR_OK) { + /* did refused_data include a FIN? */ + if (refused_flags & PBUF_FLAG_TCP_FIN) { + /* correct rcv_wnd as the application won't call tcp_recved() + for the FIN's seqno */ + if (pcb->rcv_wnd != TCP_WND) { + pcb->rcv_wnd++; + } + TCP_EVENT_CLOSED(pcb, err); + if (err == ERR_ABRT) { + return ERR_ABRT; + } + } + } else if (err == ERR_ABRT) { + /* if err == ERR_ABRT, 'pcb' is already deallocated */ + /* Drop incoming packets because pcb is "full" (only if the incoming + segment contains data). */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: drop incoming packets, because pcb is \"full\"\n")); + return ERR_ABRT; + } else { + /* data is still refused, pbuf is still valid (go on for ACK-only packets) */ + pcb->refused_data = refused_data; + } + return ERR_OK; +} + +/** + * Deallocates a list of TCP segments (tcp_seg structures). + * + * @param seg tcp_seg list of TCP segments to free + */ +void +tcp_segs_free(struct tcp_seg *seg) +{ + while (seg != NULL) { + struct tcp_seg *next = seg->next; + tcp_seg_free(seg); + seg = next; + } +} + +/** + * Frees a TCP segment (tcp_seg structure). + * + * @param seg single tcp_seg to free + */ +void +tcp_seg_free(struct tcp_seg *seg) +{ + if (seg != NULL) { + if (seg->p != NULL) { + pbuf_free(seg->p); +#if TCP_DEBUG + seg->p = NULL; +#endif /* TCP_DEBUG */ + } + memp_free(MEMP_TCP_SEG, seg); + } +} + +/** + * Sets the priority of a connection. + * + * @param pcb the tcp_pcb to manipulate + * @param prio new priority + */ +void +tcp_setprio(struct tcp_pcb *pcb, u8_t prio) +{ + pcb->prio = prio; +} + +#if TCP_QUEUE_OOSEQ +/** + * Returns a copy of the given TCP segment. + * The pbuf and data are not copied, only the pointers + * + * @param seg the old tcp_seg + * @return a copy of seg + */ +struct tcp_seg * +tcp_seg_copy(struct tcp_seg *seg) +{ + struct tcp_seg *cseg; + + cseg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG); + if (cseg == NULL) { + return NULL; + } + SMEMCPY((u8_t *)cseg, (const u8_t *)seg, sizeof(struct tcp_seg)); + pbuf_ref(cseg->p); + return cseg; +} +#endif /* TCP_QUEUE_OOSEQ */ + +#if LWIP_CALLBACK_API +/** + * Default receive callback that is called if the user didn't register + * a recv callback for the pcb. + */ +err_t +tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err) +{ + LWIP_UNUSED_ARG(arg); + if (p != NULL) { + tcp_recved(pcb, p->tot_len); + pbuf_free(p); + } else if (err == ERR_OK) { + return tcp_close(pcb); + } + return ERR_OK; +} +#endif /* LWIP_CALLBACK_API */ + +/** + * Kills the oldest active connection that has the same or lower priority than + * 'prio'. + * + * @param prio minimum priority + */ +static void +tcp_kill_prio(u8_t prio) +{ + struct tcp_pcb *pcb, *inactive; + u32_t inactivity; + u8_t mprio; + + + mprio = TCP_PRIO_MAX; + + /* We kill the oldest active connection that has lower priority than prio. */ + inactivity = 0; + inactive = NULL; + for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { + if (pcb->prio <= prio && + pcb->prio <= mprio && + (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { + inactivity = tcp_ticks - pcb->tmr; + inactive = pcb; + mprio = pcb->prio; + } + } + if (inactive != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_prio: killing oldest PCB %p (%"S32_F")\n", + (void *)inactive, inactivity)); + tcp_abort(inactive); + } +} + +/** + * Kills the oldest connection that is in TIME_WAIT state. + * Called from tcp_alloc() if no more connections are available. + */ +static void +tcp_kill_timewait(void) +{ + struct tcp_pcb *pcb, *inactive; + u32_t inactivity; + + inactivity = 0; + inactive = NULL; + /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */ + for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { + if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) { + inactivity = tcp_ticks - pcb->tmr; + inactive = pcb; + } + } + if (inactive != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%"S32_F")\n", + (void *)inactive, inactivity)); + tcp_abort(inactive); + } +} + +/** + * Allocate a new tcp_pcb structure. + * + * @param prio priority for the new pcb + * @return a new tcp_pcb that initially is in state CLOSED + */ +struct tcp_pcb * +tcp_alloc(u8_t prio) +{ + struct tcp_pcb *pcb; + u32_t iss; + + pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); + if (pcb == NULL) { + /* Try killing oldest connection in TIME-WAIT. */ + LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing off oldest TIME-WAIT connection\n")); + tcp_kill_timewait(); + /* Try to allocate a tcp_pcb again. */ + pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); + if (pcb == NULL) { + /* Try killing active connections with lower priority than the new one. */ + LWIP_DEBUGF(TCP_DEBUG, ("tcp_alloc: killing connection with prio lower than %d\n", prio)); + tcp_kill_prio(prio); + /* Try to allocate a tcp_pcb again. */ + pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB); + if (pcb != NULL) { + /* adjust err stats: memp_malloc failed twice before */ + MEMP_STATS_DEC(err, MEMP_TCP_PCB); + } + } + if (pcb != NULL) { + /* adjust err stats: timewait PCB was freed above */ + MEMP_STATS_DEC(err, MEMP_TCP_PCB); + } + } + if (pcb != NULL) { + memset(pcb, 0, sizeof(struct tcp_pcb)); + pcb->prio = prio; + pcb->snd_buf = TCP_SND_BUF; + pcb->snd_queuelen = 0; + pcb->rcv_wnd = TCP_WND; + pcb->rcv_ann_wnd = TCP_WND; + pcb->tos = 0; + pcb->ttl = TCP_TTL; + /* As initial send MSS, we use TCP_MSS but limit it to 536. + The send MSS is updated when an MSS option is received. */ + pcb->mss = (TCP_MSS > 536) ? 536 : TCP_MSS; + pcb->rto = 3000 / TCP_SLOW_INTERVAL; + pcb->sa = 0; + pcb->sv = 3000 / TCP_SLOW_INTERVAL; + pcb->rtime = -1; + pcb->cwnd = 1; + iss = tcp_next_iss(); + pcb->snd_wl2 = iss; + pcb->snd_nxt = iss; + pcb->lastack = iss; + pcb->snd_lbb = iss; + pcb->tmr = tcp_ticks; + pcb->last_timer = tcp_timer_ctr; + + pcb->polltmr = 0; + +#if LWIP_CALLBACK_API + pcb->recv = tcp_recv_null; +#endif /* LWIP_CALLBACK_API */ + + /* Init KEEPALIVE timer */ + pcb->keep_idle = TCP_KEEPIDLE_DEFAULT; + +#if LWIP_TCP_KEEPALIVE + pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT; + pcb->keep_cnt = TCP_KEEPCNT_DEFAULT; +#endif /* LWIP_TCP_KEEPALIVE */ + + pcb->keep_cnt_sent = 0; + } + return pcb; +} + +/** + * Creates a new TCP protocol control block but doesn't place it on + * any of the TCP PCB lists. + * The pcb is not put on any list until binding using tcp_bind(). + * + * @internal: Maybe there should be a idle TCP PCB list where these + * PCBs are put on. Port reservation using tcp_bind() is implemented but + * allocated pcbs that are not bound can't be killed automatically if wanting + * to allocate a pcb with higher prio (@see tcp_kill_prio()) + * + * @return a new tcp_pcb that initially is in state CLOSED + */ +struct tcp_pcb * +tcp_new(void) +{ + return tcp_alloc(TCP_PRIO_NORMAL); +} + +/** + * Used to specify the argument that should be passed callback + * functions. + * + * @param pcb tcp_pcb to set the callback argument + * @param arg void pointer argument to pass to callback functions + */ +void +tcp_arg(struct tcp_pcb *pcb, void *arg) +{ + /* This function is allowed to be called for both listen pcbs and + connection pcbs. */ + pcb->callback_arg = arg; +} +#if LWIP_CALLBACK_API + +/** + * Used to specify the function that should be called when a TCP + * connection receives data. + * + * @param pcb tcp_pcb to set the recv callback + * @param recv callback function to call for this pcb when data is received + */ +void +tcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv) +{ + LWIP_ASSERT("invalid socket state for recv callback", pcb->state != LISTEN); + pcb->recv = recv; +} + +/** + * Used to specify the function that should be called when TCP data + * has been successfully delivered to the remote host. + * + * @param pcb tcp_pcb to set the sent callback + * @param sent callback function to call for this pcb when data is successfully sent + */ +void +tcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent) +{ + LWIP_ASSERT("invalid socket state for sent callback", pcb->state != LISTEN); + pcb->sent = sent; +} + +/** + * Used to specify the function that should be called when a fatal error + * has occured on the connection. + * + * @param pcb tcp_pcb to set the err callback + * @param err callback function to call for this pcb when a fatal error + * has occured on the connection + */ +void +tcp_err(struct tcp_pcb *pcb, tcp_err_fn err) +{ + LWIP_ASSERT("invalid socket state for err callback", pcb->state != LISTEN); + pcb->errf = err; +} + +/** + * Used for specifying the function that should be called when a + * LISTENing connection has been connected to another host. + * + * @param pcb tcp_pcb to set the accept callback + * @param accept callback function to call for this pcb when LISTENing + * connection has been connected to another host + */ +void +tcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept) +{ + /* This function is allowed to be called for both listen pcbs and + connection pcbs. */ + pcb->accept = accept; +} +#endif /* LWIP_CALLBACK_API */ + + +/** + * Used to specify the function that should be called periodically + * from TCP. The interval is specified in terms of the TCP coarse + * timer interval, which is called twice a second. + * + */ +void +tcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval) +{ + LWIP_ASSERT("invalid socket state for poll", pcb->state != LISTEN); +#if LWIP_CALLBACK_API + pcb->poll = poll; +#else /* LWIP_CALLBACK_API */ + LWIP_UNUSED_ARG(poll); +#endif /* LWIP_CALLBACK_API */ + pcb->pollinterval = interval; +} + +/** + * Purges a TCP PCB. Removes any buffered data and frees the buffer memory + * (pcb->ooseq, pcb->unsent and pcb->unacked are freed). + * + * @param pcb tcp_pcb to purge. The pcb itself is not deallocated! + */ +void +tcp_pcb_purge(struct tcp_pcb *pcb) +{ + if (pcb->state != CLOSED && + pcb->state != TIME_WAIT && + pcb->state != LISTEN) { + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge\n")); + +#if TCP_LISTEN_BACKLOG + if (pcb->state == SYN_RCVD) { + /* Need to find the corresponding listen_pcb and decrease its accepts_pending */ + struct tcp_pcb_listen *lpcb; + LWIP_ASSERT("tcp_pcb_purge: pcb->state == SYN_RCVD but tcp_listen_pcbs is NULL", + tcp_listen_pcbs.listen_pcbs != NULL); + for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { + if ((lpcb->local_port == pcb->local_port) && + (ip_addr_isany(&lpcb->local_ip) || + ip_addr_cmp(&pcb->local_ip, &lpcb->local_ip))) { + /* port and address of the listen pcb match the timed-out pcb */ + LWIP_ASSERT("tcp_pcb_purge: listen pcb does not have accepts pending", + lpcb->accepts_pending > 0); + lpcb->accepts_pending--; + break; + } + } + } +#endif /* TCP_LISTEN_BACKLOG */ + + + if (pcb->refused_data != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->refused_data\n")); + pbuf_free(pcb->refused_data); + pcb->refused_data = NULL; + } + if (pcb->unsent != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: not all data sent\n")); + } + if (pcb->unacked != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->unacked\n")); + } +#if TCP_QUEUE_OOSEQ + if (pcb->ooseq != NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_pcb_purge: data left on ->ooseq\n")); + } + tcp_segs_free(pcb->ooseq); + pcb->ooseq = NULL; +#endif /* TCP_QUEUE_OOSEQ */ + + /* Stop the retransmission timer as it will expect data on unacked + queue if it fires */ + pcb->rtime = -1; + + tcp_segs_free(pcb->unsent); + tcp_segs_free(pcb->unacked); + pcb->unacked = pcb->unsent = NULL; +#if TCP_OVERSIZE + pcb->unsent_oversize = 0; +#endif /* TCP_OVERSIZE */ + } +} + +/** + * Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first. + * + * @param pcblist PCB list to purge. + * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated! + */ +void +tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb) +{ + TCP_RMV(pcblist, pcb); + + tcp_pcb_purge(pcb); + + /* if there is an outstanding delayed ACKs, send it */ + if (pcb->state != TIME_WAIT && + pcb->state != LISTEN && + pcb->flags & TF_ACK_DELAY) { + pcb->flags |= TF_ACK_NOW; + tcp_output(pcb); + } + + if (pcb->state != LISTEN) { + LWIP_ASSERT("unsent segments leaking", pcb->unsent == NULL); + LWIP_ASSERT("unacked segments leaking", pcb->unacked == NULL); +#if TCP_QUEUE_OOSEQ + LWIP_ASSERT("ooseq segments leaking", pcb->ooseq == NULL); +#endif /* TCP_QUEUE_OOSEQ */ + } + + pcb->state = CLOSED; + + LWIP_ASSERT("tcp_pcb_remove: tcp_pcbs_sane()", tcp_pcbs_sane()); +} + +/** + * Calculates a new initial sequence number for new connections. + * + * @return u32_t pseudo random sequence number + */ +u32_t +tcp_next_iss(void) +{ + static u32_t iss = 6510; + + iss += tcp_ticks; /* XXX */ + return iss; +} + +#if TCP_CALCULATE_EFF_SEND_MSS +/** + * Calcluates the effective send mss that can be used for a specific IP address + * by using ip_route to determin the netif used to send to the address and + * calculating the minimum of TCP_MSS and that netif's mtu (if set). + */ +u16_t +tcp_eff_send_mss(u16_t sendmss, ip_addr_t *addr) +{ + u16_t mss_s; + struct netif *outif; + + outif = ip_route(addr); + if ((outif != NULL) && (outif->mtu != 0)) { + mss_s = outif->mtu - IP_HLEN - TCP_HLEN; + /* RFC 1122, chap 4.2.2.6: + * Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize + * We correct for TCP options in tcp_write(), and don't support IP options. + */ + sendmss = LWIP_MIN(sendmss, mss_s); + } + return sendmss; +} +#endif /* TCP_CALCULATE_EFF_SEND_MSS */ + +const char* +tcp_debug_state_str(enum tcp_state s) +{ + return tcp_state_str[s]; +} + +#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG +/** + * Print a tcp header for debugging purposes. + * + * @param tcphdr pointer to a struct tcp_hdr + */ +void +tcp_debug_print(struct tcp_hdr *tcphdr) +{ + LWIP_DEBUGF(TCP_DEBUG, ("TCP header:\n")); + LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(TCP_DEBUG, ("| %5"U16_F" | %5"U16_F" | (src port, dest port)\n", + ntohs(tcphdr->src), ntohs(tcphdr->dest))); + LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (seq no)\n", + ntohl(tcphdr->seqno))); + LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(TCP_DEBUG, ("| %010"U32_F" | (ack no)\n", + ntohl(tcphdr->ackno))); + LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(TCP_DEBUG, ("| %2"U16_F" | |%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"%"U16_F"| %5"U16_F" | (hdrlen, flags (", + TCPH_HDRLEN(tcphdr), + TCPH_FLAGS(tcphdr) >> 5 & 1, + TCPH_FLAGS(tcphdr) >> 4 & 1, + TCPH_FLAGS(tcphdr) >> 3 & 1, + TCPH_FLAGS(tcphdr) >> 2 & 1, + TCPH_FLAGS(tcphdr) >> 1 & 1, + TCPH_FLAGS(tcphdr) & 1, + ntohs(tcphdr->wnd))); + tcp_debug_print_flags(TCPH_FLAGS(tcphdr)); + LWIP_DEBUGF(TCP_DEBUG, ("), win)\n")); + LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(TCP_DEBUG, ("| 0x%04"X16_F" | %5"U16_F" | (chksum, urgp)\n", + ntohs(tcphdr->chksum), ntohs(tcphdr->urgp))); + LWIP_DEBUGF(TCP_DEBUG, ("+-------------------------------+\n")); +} + +/** + * Print a tcp state for debugging purposes. + * + * @param s enum tcp_state to print + */ +void +tcp_debug_print_state(enum tcp_state s) +{ + LWIP_DEBUGF(TCP_DEBUG, ("State: %s\n", tcp_state_str[s])); +} + +/** + * Print tcp flags for debugging purposes. + * + * @param flags tcp flags, all active flags are printed + */ +void +tcp_debug_print_flags(u8_t flags) +{ + if (flags & TCP_FIN) { + LWIP_DEBUGF(TCP_DEBUG, ("FIN ")); + } + if (flags & TCP_SYN) { + LWIP_DEBUGF(TCP_DEBUG, ("SYN ")); + } + if (flags & TCP_RST) { + LWIP_DEBUGF(TCP_DEBUG, ("RST ")); + } + if (flags & TCP_PSH) { + LWIP_DEBUGF(TCP_DEBUG, ("PSH ")); + } + if (flags & TCP_ACK) { + LWIP_DEBUGF(TCP_DEBUG, ("ACK ")); + } + if (flags & TCP_URG) { + LWIP_DEBUGF(TCP_DEBUG, ("URG ")); + } + if (flags & TCP_ECE) { + LWIP_DEBUGF(TCP_DEBUG, ("ECE ")); + } + if (flags & TCP_CWR) { + LWIP_DEBUGF(TCP_DEBUG, ("CWR ")); + } + LWIP_DEBUGF(TCP_DEBUG, ("\n")); +} + +/** + * Print all tcp_pcbs in every list for debugging purposes. + */ +void +tcp_debug_print_pcbs(void) +{ + struct tcp_pcb *pcb; + LWIP_DEBUGF(TCP_DEBUG, ("Active PCB states:\n")); + for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", + pcb->local_port, pcb->remote_port, + pcb->snd_nxt, pcb->rcv_nxt)); + tcp_debug_print_state(pcb->state); + } + LWIP_DEBUGF(TCP_DEBUG, ("Listen PCB states:\n")); + for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", + pcb->local_port, pcb->remote_port, + pcb->snd_nxt, pcb->rcv_nxt)); + tcp_debug_print_state(pcb->state); + } + LWIP_DEBUGF(TCP_DEBUG, ("TIME-WAIT PCB states:\n")); + for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_DEBUGF(TCP_DEBUG, ("Local port %"U16_F", foreign port %"U16_F" snd_nxt %"U32_F" rcv_nxt %"U32_F" ", + pcb->local_port, pcb->remote_port, + pcb->snd_nxt, pcb->rcv_nxt)); + tcp_debug_print_state(pcb->state); + } +} + +/** + * Check state consistency of the tcp_pcb lists. + */ +s16_t +tcp_pcbs_sane(void) +{ + struct tcp_pcb *pcb; + for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != CLOSED", pcb->state != CLOSED); + LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != LISTEN", pcb->state != LISTEN); + LWIP_ASSERT("tcp_pcbs_sane: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); + } + for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_ASSERT("tcp_pcbs_sane: tw pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); + } + return 1; +} +#endif /* TCP_DEBUG */ + +#endif /* LWIP_TCP */ diff --git a/third_party/lwip-1.4.1/src/core/tcp_in.c b/third_party/lwip-1.4.1/src/core/tcp_in.c new file mode 100644 index 0000000..aa71960 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/tcp_in.c @@ -0,0 +1,1619 @@ +/** + * @file + * Transmission Control Protocol, incoming traffic + * + * The input processing functions of the TCP layer. + * + * These functions are generally called in the order (ip_input() ->) + * tcp_input() -> * tcp_process() -> tcp_receive() (-> application). + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/tcp_impl.h" +#include "lwip/def.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/mem.h" +#include "lwip/memp.h" +#include "lwip/inet_chksum.h" +#include "lwip/stats.h" +#include "lwip/snmp.h" +#include "arch/perf.h" + +/* These variables are global to all functions involved in the input + processing of TCP segments. They are set by the tcp_input() + function. */ +static struct tcp_seg inseg; +static struct tcp_hdr *tcphdr; +static struct ip_hdr *iphdr; +static u32_t seqno, ackno; +static u8_t flags; +static u16_t tcplen; + +static u8_t recv_flags; +static struct pbuf *recv_data; + +struct tcp_pcb *tcp_input_pcb; + +/* Forward declarations. */ +static err_t tcp_process(struct tcp_pcb *pcb); +static void tcp_receive(struct tcp_pcb *pcb); +static void tcp_parseopt(struct tcp_pcb *pcb); + +static err_t tcp_listen_input(struct tcp_pcb_listen *pcb); +static err_t tcp_timewait_input(struct tcp_pcb *pcb); + +/** + * The initial input processing of TCP. It verifies the TCP header, demultiplexes + * the segment between the PCBs and passes it on to tcp_process(), which implements + * the TCP finite state machine. This function is called by the IP layer (in + * ip_input()). + * + * @param p received TCP segment to process (p->payload pointing to the IP header) + * @param inp network interface on which this segment was received + */ +void +tcp_input(struct pbuf *p, struct netif *inp) +{ + struct tcp_pcb *pcb, *prev; + struct tcp_pcb_listen *lpcb; +#if SO_REUSE + struct tcp_pcb *lpcb_prev = NULL; + struct tcp_pcb_listen *lpcb_any = NULL; +#endif /* SO_REUSE */ + u8_t hdrlen; + err_t err; + + PERF_START; + + TCP_STATS_INC(tcp.recv); + snmp_inc_tcpinsegs(); + + iphdr = (struct ip_hdr *)p->payload; + tcphdr = (struct tcp_hdr *)((u8_t *)p->payload + IPH_HL(iphdr) * 4); + +#if TCP_INPUT_DEBUG + tcp_debug_print(tcphdr); +#endif + + /* remove header from payload */ + if (pbuf_header(p, -((s16_t)(IPH_HL(iphdr) * 4))) || (p->tot_len < sizeof(struct tcp_hdr))) { + /* drop short packets */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: short packet (%"U16_F" bytes) discarded\n", p->tot_len)); + TCP_STATS_INC(tcp.lenerr); + goto dropped; + } + + /* Don't even process incoming broadcasts/multicasts. */ + if (ip_addr_isbroadcast(¤t_iphdr_dest, inp) || + ip_addr_ismulticast(¤t_iphdr_dest)) { + TCP_STATS_INC(tcp.proterr); + goto dropped; + } + +#if CHECKSUM_CHECK_TCP + /* Verify TCP checksum. */ + if (inet_chksum_pseudo(p, ip_current_src_addr(), ip_current_dest_addr(), + IP_PROTO_TCP, p->tot_len) != 0) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packet discarded due to failing checksum 0x%04"X16_F"\n", + inet_chksum_pseudo(p, ip_current_src_addr(), ip_current_dest_addr(), + IP_PROTO_TCP, p->tot_len))); +#if TCP_DEBUG + tcp_debug_print(tcphdr); +#endif /* TCP_DEBUG */ + TCP_STATS_INC(tcp.chkerr); + goto dropped; + } +#endif + + /* Move the payload pointer in the pbuf so that it points to the + TCP data instead of the TCP header. */ + hdrlen = TCPH_HDRLEN(tcphdr); + if(pbuf_header(p, -(hdrlen * 4))){ + /* drop short packets */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: short packet\n")); + TCP_STATS_INC(tcp.lenerr); + goto dropped; + } + + /* Convert fields in TCP header to host byte order. */ + tcphdr->src = ntohs(tcphdr->src); + tcphdr->dest = ntohs(tcphdr->dest); + seqno = tcphdr->seqno = ntohl(tcphdr->seqno); + ackno = tcphdr->ackno = ntohl(tcphdr->ackno); + tcphdr->wnd = ntohs(tcphdr->wnd); + + flags = TCPH_FLAGS(tcphdr); + tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0); + + /* Demultiplex an incoming segment. First, we check if it is destined + for an active connection. */ + prev = NULL; + + + for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_ASSERT("tcp_input: active pcb->state != CLOSED", pcb->state != CLOSED); + LWIP_ASSERT("tcp_input: active pcb->state != TIME-WAIT", pcb->state != TIME_WAIT); + LWIP_ASSERT("tcp_input: active pcb->state != LISTEN", pcb->state != LISTEN); + if (pcb->remote_port == tcphdr->src && + pcb->local_port == tcphdr->dest && + ip_addr_cmp(&(pcb->remote_ip), ¤t_iphdr_src) && + ip_addr_cmp(&(pcb->local_ip), ¤t_iphdr_dest)) { + + /* Move this PCB to the front of the list so that subsequent + lookups will be faster (we exploit locality in TCP segment + arrivals). */ + LWIP_ASSERT("tcp_input: pcb->next != pcb (before cache)", pcb->next != pcb); + if (prev != NULL) { + prev->next = pcb->next; + pcb->next = tcp_active_pcbs; + tcp_active_pcbs = pcb; + } + LWIP_ASSERT("tcp_input: pcb->next != pcb (after cache)", pcb->next != pcb); + break; + } + prev = pcb; + } + + if (pcb == NULL) { + /* If it did not go to an active connection, we check the connections + in the TIME-WAIT state. */ + for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) { + LWIP_ASSERT("tcp_input: TIME-WAIT pcb->state == TIME-WAIT", pcb->state == TIME_WAIT); + if (pcb->remote_port == tcphdr->src && + pcb->local_port == tcphdr->dest && + ip_addr_cmp(&(pcb->remote_ip), ¤t_iphdr_src) && + ip_addr_cmp(&(pcb->local_ip), ¤t_iphdr_dest)) { + /* We don't really care enough to move this PCB to the front + of the list since we are not very likely to receive that + many segments for connections in TIME-WAIT. */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for TIME_WAITing connection.\n")); + tcp_timewait_input(pcb); + pbuf_free(p); + return; + } + } + + /* Finally, if we still did not get a match, we check all PCBs that + are LISTENing for incoming connections. */ + prev = NULL; + for(lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) { + if (lpcb->local_port == tcphdr->dest) { +#if SO_REUSE + if (ip_addr_cmp(&(lpcb->local_ip), ¤t_iphdr_dest)) { + /* found an exact match */ + break; + } else if(ip_addr_isany(&(lpcb->local_ip))) { + /* found an ANY-match */ + lpcb_any = lpcb; + lpcb_prev = prev; + } +#else /* SO_REUSE */ + if (ip_addr_cmp(&(lpcb->local_ip), ¤t_iphdr_dest) || + ip_addr_isany(&(lpcb->local_ip))) { + /* found a match */ + break; + } +#endif /* SO_REUSE */ + } + prev = (struct tcp_pcb *)lpcb; + } +#if SO_REUSE + /* first try specific local IP */ + if (lpcb == NULL) { + /* only pass to ANY if no specific local IP has been found */ + lpcb = lpcb_any; + prev = lpcb_prev; + } +#endif /* SO_REUSE */ + if (lpcb != NULL) { + /* Move this PCB to the front of the list so that subsequent + lookups will be faster (we exploit locality in TCP segment + arrivals). */ + if (prev != NULL) { + ((struct tcp_pcb_listen *)prev)->next = lpcb->next; + /* our successor is the remainder of the listening list */ + lpcb->next = tcp_listen_pcbs.listen_pcbs; + /* put this listening pcb at the head of the listening list */ + tcp_listen_pcbs.listen_pcbs = lpcb; + } + + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: packed for LISTENing connection.\n")); + tcp_listen_input(lpcb); + pbuf_free(p); + return; + } + } + +#if TCP_INPUT_DEBUG + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("+-+-+-+-+-+-+-+-+-+-+-+-+-+- tcp_input: flags ")); + tcp_debug_print_flags(TCPH_FLAGS(tcphdr)); + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n")); +#endif /* TCP_INPUT_DEBUG */ + + + if (pcb != NULL) { + /* The incoming segment belongs to a connection. */ +#if TCP_INPUT_DEBUG +#if TCP_DEBUG + tcp_debug_print_state(pcb->state); +#endif /* TCP_DEBUG */ +#endif /* TCP_INPUT_DEBUG */ + + /* Set up a tcp_seg structure. */ + inseg.next = NULL; + inseg.len = p->tot_len; + inseg.p = p; + inseg.tcphdr = tcphdr; + + recv_data = NULL; + recv_flags = 0; + + if (flags & TCP_PSH) { + p->flags |= PBUF_FLAG_PUSH; + } + + /* If there is data which was previously "refused" by upper layer */ + if (pcb->refused_data != NULL) { + if ((tcp_process_refused_data(pcb) == ERR_ABRT) || + ((pcb->refused_data != NULL) && (tcplen > 0))) { + /* pcb has been aborted or refused data is still refused and the new + segment contains data */ + TCP_STATS_INC(tcp.drop); + snmp_inc_tcpinerrs(); + goto aborted; + } + } + tcp_input_pcb = pcb; + err = tcp_process(pcb); + /* A return value of ERR_ABRT means that tcp_abort() was called + and that the pcb has been freed. If so, we don't do anything. */ + if (err != ERR_ABRT) { + if (recv_flags & TF_RESET) { + /* TF_RESET means that the connection was reset by the other + end. We then call the error callback to inform the + application that the connection is dead before we + deallocate the PCB. */ + TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_RST); + tcp_pcb_remove(&tcp_active_pcbs, pcb); + memp_free(MEMP_TCP_PCB, pcb); + } else if (recv_flags & TF_CLOSED) { + /* The connection has been closed and we will deallocate the + PCB. */ + if (!(pcb->flags & TF_RXCLOSED)) { + /* Connection closed although the application has only shut down the + tx side: call the PCB's err callback and indicate the closure to + ensure the application doesn't continue using the PCB. */ + TCP_EVENT_ERR(pcb->errf, pcb->callback_arg, ERR_CLSD); + } + tcp_pcb_remove(&tcp_active_pcbs, pcb); + memp_free(MEMP_TCP_PCB, pcb); + } else { + err = ERR_OK; + /* If the application has registered a "sent" function to be + called when new send buffer space is available, we call it + now. */ + if (pcb->acked > 0) { + TCP_EVENT_SENT(pcb, pcb->acked, err); + if (err == ERR_ABRT) { + goto aborted; + } + } + + if (recv_data != NULL) { + LWIP_ASSERT("pcb->refused_data == NULL", pcb->refused_data == NULL); + if (pcb->flags & TF_RXCLOSED) { + /* received data although already closed -> abort (send RST) to + notify the remote host that not all data has been processed */ + pbuf_free(recv_data); + tcp_abort(pcb); + goto aborted; + } + + /* Notify application that data has been received. */ + TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err); + if (err == ERR_ABRT) { + goto aborted; + } + + /* If the upper layer can't receive this data, store it */ + if (err != ERR_OK) { + pcb->refused_data = recv_data; + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_input: keep incoming packet, because pcb is \"full\"\n")); + } + } + + /* If a FIN segment was received, we call the callback + function with a NULL buffer to indicate EOF. */ + if (recv_flags & TF_GOT_FIN) { + if (pcb->refused_data != NULL) { + /* Delay this if we have refused data. */ + pcb->refused_data->flags |= PBUF_FLAG_TCP_FIN; + } else { + /* correct rcv_wnd as the application won't call tcp_recved() + for the FIN's seqno */ + if (pcb->rcv_wnd != TCP_WND) { + pcb->rcv_wnd++; + } + TCP_EVENT_CLOSED(pcb, err); + if (err == ERR_ABRT) { + goto aborted; + } + } + } + + tcp_input_pcb = NULL; + /* Try to send something out. */ + tcp_output(pcb); +#if TCP_INPUT_DEBUG +#if TCP_DEBUG + tcp_debug_print_state(pcb->state); +#endif /* TCP_DEBUG */ +#endif /* TCP_INPUT_DEBUG */ + } + } + /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()). + Below this line, 'pcb' may not be dereferenced! */ +aborted: + tcp_input_pcb = NULL; + recv_data = NULL; + + /* give up our reference to inseg.p */ + if (inseg.p != NULL) + { + pbuf_free(inseg.p); + inseg.p = NULL; + } + } else { + + /* If no matching PCB was found, send a TCP RST (reset) to the + sender. */ + LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_input: no PCB match found, resetting.\n")); + if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) { + TCP_STATS_INC(tcp.proterr); + TCP_STATS_INC(tcp.drop); + tcp_rst(ackno, seqno + tcplen, + ip_current_dest_addr(), ip_current_src_addr(), + tcphdr->dest, tcphdr->src); + } + pbuf_free(p); + } + + LWIP_ASSERT("tcp_input: tcp_pcbs_sane()", tcp_pcbs_sane()); + PERF_STOP("tcp_input"); + return; +dropped: + TCP_STATS_INC(tcp.drop); + snmp_inc_tcpinerrs(); + pbuf_free(p); +} + +/** + * Called by tcp_input() when a segment arrives for a listening + * connection (from tcp_input()). + * + * @param pcb the tcp_pcb_listen for which a segment arrived + * @return ERR_OK if the segment was processed + * another err_t on error + * + * @note the return value is not (yet?) used in tcp_input() + * @note the segment which arrived is saved in global variables, therefore only the pcb + * involved is passed as a parameter to this function + */ +static err_t +tcp_listen_input(struct tcp_pcb_listen *pcb) +{ + struct tcp_pcb *npcb; + err_t rc; + + if (flags & TCP_RST) { + /* An incoming RST should be ignored. Return. */ + return ERR_OK; + } + + /* In the LISTEN state, we check for incoming SYN segments, + creates a new PCB, and responds with a SYN|ACK. */ + if (flags & TCP_ACK) { + /* For incoming segments with the ACK flag set, respond with a + RST. */ + LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_listen_input: ACK in LISTEN, sending reset\n")); + tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), + ip_current_src_addr(), tcphdr->dest, tcphdr->src); + } else if (flags & TCP_SYN) { + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection request %"U16_F" -> %"U16_F".\n", tcphdr->src, tcphdr->dest)); +#if TCP_LISTEN_BACKLOG + if (pcb->accepts_pending >= pcb->backlog) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: listen backlog exceeded for port %"U16_F"\n", tcphdr->dest)); + return ERR_ABRT; + } +#endif /* TCP_LISTEN_BACKLOG */ + npcb = tcp_alloc(pcb->prio); + /* If a new PCB could not be created (probably due to lack of memory), + we don't do anything, but rely on the sender will retransmit the + SYN at a time when we have more memory available. */ + if (npcb == NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_listen_input: could not allocate PCB\n")); + TCP_STATS_INC(tcp.memerr); + return ERR_MEM; + } +#if TCP_LISTEN_BACKLOG + pcb->accepts_pending++; +#endif /* TCP_LISTEN_BACKLOG */ + /* Set up the new PCB. */ + ip_addr_copy(npcb->local_ip, current_iphdr_dest); + npcb->local_port = pcb->local_port; + ip_addr_copy(npcb->remote_ip, current_iphdr_src); + npcb->remote_port = tcphdr->src; + npcb->state = SYN_RCVD; + npcb->rcv_nxt = seqno + 1; + npcb->rcv_ann_right_edge = npcb->rcv_nxt; + npcb->snd_wnd = tcphdr->wnd; + npcb->snd_wnd_max = tcphdr->wnd; + npcb->ssthresh = npcb->snd_wnd; + npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */ + npcb->callback_arg = pcb->callback_arg; +#if LWIP_CALLBACK_API + npcb->accept = pcb->accept; +#endif /* LWIP_CALLBACK_API */ + /* inherit socket options */ + npcb->so_options = pcb->so_options & SOF_INHERITED; + /* Register the new PCB so that we can begin receiving segments + for it. */ + TCP_REG_ACTIVE(npcb); + + /* Parse any options in the SYN. */ + tcp_parseopt(npcb); +#if TCP_CALCULATE_EFF_SEND_MSS + npcb->mss = tcp_eff_send_mss(npcb->mss, &(npcb->remote_ip)); +#endif /* TCP_CALCULATE_EFF_SEND_MSS */ + + snmp_inc_tcppassiveopens(); + + /* Send a SYN|ACK together with the MSS option. */ + rc = tcp_enqueue_flags(npcb, TCP_SYN | TCP_ACK); + if (rc != ERR_OK) { + tcp_abandon(npcb, 0); + return rc; + } + return tcp_output(npcb); + } + return ERR_OK; +} + +/** + * Called by tcp_input() when a segment arrives for a connection in + * TIME_WAIT. + * + * @param pcb the tcp_pcb for which a segment arrived + * + * @note the segment which arrived is saved in global variables, therefore only the pcb + * involved is passed as a parameter to this function + */ +static err_t +tcp_timewait_input(struct tcp_pcb *pcb) +{ + /* RFC 1337: in TIME_WAIT, ignore RST and ACK FINs + any 'acceptable' segments */ + /* RFC 793 3.9 Event Processing - Segment Arrives: + * - first check sequence number - we skip that one in TIME_WAIT (always + * acceptable since we only send ACKs) + * - second check the RST bit (... return) */ + if (flags & TCP_RST) { + return ERR_OK; + } + /* - fourth, check the SYN bit, */ + if (flags & TCP_SYN) { + /* If an incoming segment is not acceptable, an acknowledgment + should be sent in reply */ + if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt+pcb->rcv_wnd)) { + /* If the SYN is in the window it is an error, send a reset */ + tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(), + tcphdr->dest, tcphdr->src); + return ERR_OK; + } + } else if (flags & TCP_FIN) { + /* - eighth, check the FIN bit: Remain in the TIME-WAIT state. + Restart the 2 MSL time-wait timeout.*/ + pcb->tmr = tcp_ticks; + } + + if ((tcplen > 0)) { + /* Acknowledge data, FIN or out-of-window SYN */ + pcb->flags |= TF_ACK_NOW; + return tcp_output(pcb); + } + return ERR_OK; +} + +/** + * Implements the TCP state machine. Called by tcp_input. In some + * states tcp_receive() is called to receive data. The tcp_seg + * argument will be freed by the caller (tcp_input()) unless the + * recv_data pointer in the pcb is set. + * + * @param pcb the tcp_pcb for which a segment arrived + * + * @note the segment which arrived is saved in global variables, therefore only the pcb + * involved is passed as a parameter to this function + */ +static err_t +tcp_process(struct tcp_pcb *pcb) +{ + struct tcp_seg *rseg; + u8_t acceptable = 0; + err_t err; + + err = ERR_OK; + + /* Process incoming RST segments. */ + if (flags & TCP_RST) { + /* First, determine if the reset is acceptable. */ + if (pcb->state == SYN_SENT) { + if (ackno == pcb->snd_nxt) { + acceptable = 1; + } + } else { + if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, + pcb->rcv_nxt+pcb->rcv_wnd)) { + acceptable = 1; + } + } + + if (acceptable) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: Connection RESET\n")); + LWIP_ASSERT("tcp_input: pcb->state != CLOSED", pcb->state != CLOSED); + recv_flags |= TF_RESET; + pcb->flags &= ~TF_ACK_DELAY; + return ERR_RST; + } else { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n", + seqno, pcb->rcv_nxt)); + LWIP_DEBUGF(TCP_DEBUG, ("tcp_process: unacceptable reset seqno %"U32_F" rcv_nxt %"U32_F"\n", + seqno, pcb->rcv_nxt)); + return ERR_OK; + } + } + + if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) { + /* Cope with new connection attempt after remote end crashed */ + tcp_ack_now(pcb); + return ERR_OK; + } + + if ((pcb->flags & TF_RXCLOSED) == 0) { + /* Update the PCB (in)activity timer unless rx is closed (see tcp_shutdown) */ + pcb->tmr = tcp_ticks; + } + pcb->keep_cnt_sent = 0; + + tcp_parseopt(pcb); + + /* Do different things depending on the TCP state. */ + switch (pcb->state) { + case SYN_SENT: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("SYN-SENT: ackno %"U32_F" pcb->snd_nxt %"U32_F" unacked %"U32_F"\n", ackno, + pcb->snd_nxt, ntohl(pcb->unacked->tcphdr->seqno))); + /* received SYN ACK with expected sequence number? */ + if ((flags & TCP_ACK) && (flags & TCP_SYN) + && ackno == ntohl(pcb->unacked->tcphdr->seqno) + 1) { + pcb->snd_buf++; + pcb->rcv_nxt = seqno + 1; + pcb->rcv_ann_right_edge = pcb->rcv_nxt; + pcb->lastack = ackno; + pcb->snd_wnd = tcphdr->wnd; + pcb->snd_wnd_max = tcphdr->wnd; + pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */ + pcb->state = ESTABLISHED; + +#if TCP_CALCULATE_EFF_SEND_MSS + pcb->mss = tcp_eff_send_mss(pcb->mss, &(pcb->remote_ip)); +#endif /* TCP_CALCULATE_EFF_SEND_MSS */ + + /* Set ssthresh again after changing pcb->mss (already set in tcp_connect + * but for the default value of pcb->mss) */ + pcb->ssthresh = pcb->mss * 10; + + pcb->cwnd = ((pcb->cwnd == 1) ? (pcb->mss * 2) : pcb->mss); + LWIP_ASSERT("pcb->snd_queuelen > 0", (pcb->snd_queuelen > 0)); + --pcb->snd_queuelen; + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_process: SYN-SENT --queuelen %"U16_F"\n", (u16_t)pcb->snd_queuelen)); + rseg = pcb->unacked; + pcb->unacked = rseg->next; + tcp_seg_free(rseg); + + /* If there's nothing left to acknowledge, stop the retransmit + timer, otherwise reset it to start again */ + if(pcb->unacked == NULL) + pcb->rtime = -1; + else { + pcb->rtime = 0; + pcb->nrtx = 0; + } + + /* Call the user specified function to call when sucessfully + * connected. */ + TCP_EVENT_CONNECTED(pcb, ERR_OK, err); + if (err == ERR_ABRT) { + return ERR_ABRT; + } + tcp_ack_now(pcb); + } + /* received ACK? possibly a half-open connection */ + else if (flags & TCP_ACK) { + /* send a RST to bring the other side in a non-synchronized state. */ + tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(), + tcphdr->dest, tcphdr->src); + } + break; + case SYN_RCVD: + if (flags & TCP_ACK) { + /* expected ACK number? */ + if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) { + u16_t old_cwnd; + pcb->state = ESTABLISHED; + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection established %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); +#if LWIP_CALLBACK_API + LWIP_ASSERT("pcb->accept != NULL", pcb->accept != NULL); +#endif + /* Call the accept function. */ + TCP_EVENT_ACCEPT(pcb, ERR_OK, err); + if (err != ERR_OK) { + /* If the accept function returns with an error, we abort + * the connection. */ + /* Already aborted? */ + if (err != ERR_ABRT) { + tcp_abort(pcb); + } + return ERR_ABRT; + } + old_cwnd = pcb->cwnd; + /* If there was any data contained within this ACK, + * we'd better pass it on to the application as well. */ + tcp_receive(pcb); + + /* Prevent ACK for SYN to generate a sent event */ + if (pcb->acked != 0) { + pcb->acked--; + } + + pcb->cwnd = ((old_cwnd == 1) ? (pcb->mss * 2) : pcb->mss); + + if (recv_flags & TF_GOT_FIN) { + tcp_ack_now(pcb); + pcb->state = CLOSE_WAIT; + } + } else { + /* incorrect ACK number, send RST */ + tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(), ip_current_src_addr(), + tcphdr->dest, tcphdr->src); + } + } else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) { + /* Looks like another copy of the SYN - retransmit our SYN-ACK */ + tcp_rexmit(pcb); + } + break; + case CLOSE_WAIT: + /* FALLTHROUGH */ + case ESTABLISHED: + tcp_receive(pcb); + if (recv_flags & TF_GOT_FIN) { /* passive close */ + tcp_ack_now(pcb); + pcb->state = CLOSE_WAIT; + } + break; + case FIN_WAIT_1: + tcp_receive(pcb); + if (recv_flags & TF_GOT_FIN) { + if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) { + LWIP_DEBUGF(TCP_DEBUG, + ("TCP connection closed: FIN_WAIT_1 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); + tcp_ack_now(pcb); + tcp_pcb_purge(pcb); + TCP_RMV_ACTIVE(pcb); + pcb->state = TIME_WAIT; + TCP_REG(&tcp_tw_pcbs, pcb); + } else { + tcp_ack_now(pcb); + pcb->state = CLOSING; + } + } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt)) { + pcb->state = FIN_WAIT_2; + } + break; + case FIN_WAIT_2: + tcp_receive(pcb); + if (recv_flags & TF_GOT_FIN) { + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: FIN_WAIT_2 %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); + tcp_ack_now(pcb); + tcp_pcb_purge(pcb); + TCP_RMV_ACTIVE(pcb); + pcb->state = TIME_WAIT; + TCP_REG(&tcp_tw_pcbs, pcb); + } + break; + case CLOSING: + tcp_receive(pcb); + if (flags & TCP_ACK && ackno == pcb->snd_nxt) { + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: CLOSING %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); + tcp_pcb_purge(pcb); + TCP_RMV_ACTIVE(pcb); + pcb->state = TIME_WAIT; + TCP_REG(&tcp_tw_pcbs, pcb); + } + break; + case LAST_ACK: + tcp_receive(pcb); + if (flags & TCP_ACK && ackno == pcb->snd_nxt) { + LWIP_DEBUGF(TCP_DEBUG, ("TCP connection closed: LAST_ACK %"U16_F" -> %"U16_F".\n", inseg.tcphdr->src, inseg.tcphdr->dest)); + /* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */ + recv_flags |= TF_CLOSED; + } + break; + default: + break; + } + return ERR_OK; +} + +#if TCP_QUEUE_OOSEQ +/** + * Insert segment into the list (segments covered with new one will be deleted) + * + * Called from tcp_receive() + */ +static void +tcp_oos_insert_segment(struct tcp_seg *cseg, struct tcp_seg *next) +{ + struct tcp_seg *old_seg; + + if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) { + /* received segment overlaps all following segments */ + tcp_segs_free(next); + next = NULL; + } + else { + /* delete some following segments + oos queue may have segments with FIN flag */ + while (next && + TCP_SEQ_GEQ((seqno + cseg->len), + (next->tcphdr->seqno + next->len))) { + /* cseg with FIN already processed */ + if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) { + TCPH_SET_FLAG(cseg->tcphdr, TCP_FIN); + } + old_seg = next; + next = next->next; + tcp_seg_free(old_seg); + } + if (next && + TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) { + /* We need to trim the incoming segment. */ + cseg->len = (u16_t)(next->tcphdr->seqno - seqno); + pbuf_realloc(cseg->p, cseg->len); + } + } + cseg->next = next; +} +#endif /* TCP_QUEUE_OOSEQ */ + +/** + * Called by tcp_process. Checks if the given segment is an ACK for outstanding + * data, and if so frees the memory of the buffered data. Next, is places the + * segment on any of the receive queues (pcb->recved or pcb->ooseq). If the segment + * is buffered, the pbuf is referenced by pbuf_ref so that it will not be freed until + * it has been removed from the buffer. + * + * If the incoming segment constitutes an ACK for a segment that was used for RTT + * estimation, the RTT is estimated here as well. + * + * Called from tcp_process(). + */ +static void +tcp_receive(struct tcp_pcb *pcb) +{ + struct tcp_seg *next; +#if TCP_QUEUE_OOSEQ + struct tcp_seg *prev, *cseg; +#endif /* TCP_QUEUE_OOSEQ */ + struct pbuf *p; + s32_t off; + s16_t m; + u32_t right_wnd_edge; + u16_t new_tot_len; + int found_dupack = 0; +#if TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS + u32_t ooseq_blen; + u16_t ooseq_qlen; +#endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */ + + LWIP_ASSERT("tcp_receive: wrong state", pcb->state >= ESTABLISHED); + + if (flags & TCP_ACK) { + right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2; + + /* Update window. */ + if (TCP_SEQ_LT(pcb->snd_wl1, seqno) || + (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) || + (pcb->snd_wl2 == ackno && tcphdr->wnd > pcb->snd_wnd)) { + pcb->snd_wnd = tcphdr->wnd; + /* keep track of the biggest window announced by the remote host to calculate + the maximum segment size */ + if (pcb->snd_wnd_max < tcphdr->wnd) { + pcb->snd_wnd_max = tcphdr->wnd; + } + pcb->snd_wl1 = seqno; + pcb->snd_wl2 = ackno; + if (pcb->snd_wnd == 0) { + if (pcb->persist_backoff == 0) { + /* start persist timer */ + pcb->persist_cnt = 0; + pcb->persist_backoff = 1; + } + } else if (pcb->persist_backoff > 0) { + /* stop persist timer */ + pcb->persist_backoff = 0; + } + LWIP_DEBUGF(TCP_WND_DEBUG, ("tcp_receive: window update %"U16_F"\n", pcb->snd_wnd)); +#if TCP_WND_DEBUG + } else { + if (pcb->snd_wnd != tcphdr->wnd) { + LWIP_DEBUGF(TCP_WND_DEBUG, + ("tcp_receive: no window update lastack %"U32_F" ackno %" + U32_F" wl1 %"U32_F" seqno %"U32_F" wl2 %"U32_F"\n", + pcb->lastack, ackno, pcb->snd_wl1, seqno, pcb->snd_wl2)); + } +#endif /* TCP_WND_DEBUG */ + } + + /* (From Stevens TCP/IP Illustrated Vol II, p970.) Its only a + * duplicate ack if: + * 1) It doesn't ACK new data + * 2) length of received packet is zero (i.e. no payload) + * 3) the advertised window hasn't changed + * 4) There is outstanding unacknowledged data (retransmission timer running) + * 5) The ACK is == biggest ACK sequence number so far seen (snd_una) + * + * If it passes all five, should process as a dupack: + * a) dupacks < 3: do nothing + * b) dupacks == 3: fast retransmit + * c) dupacks > 3: increase cwnd + * + * If it only passes 1-3, should reset dupack counter (and add to + * stats, which we don't do in lwIP) + * + * If it only passes 1, should reset dupack counter + * + */ + + /* Clause 1 */ + if (TCP_SEQ_LEQ(ackno, pcb->lastack)) { + pcb->acked = 0; + /* Clause 2 */ + if (tcplen == 0) { + /* Clause 3 */ + if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge){ + /* Clause 4 */ + if (pcb->rtime >= 0) { + /* Clause 5 */ + if (pcb->lastack == ackno) { + found_dupack = 1; + if ((u8_t)(pcb->dupacks + 1) > pcb->dupacks) { + ++pcb->dupacks; + } + if (pcb->dupacks > 3) { + /* Inflate the congestion window, but not if it means that + the value overflows. */ + if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) { + pcb->cwnd += pcb->mss; + } + } else if (pcb->dupacks == 3) { + /* Do fast retransmit */ + tcp_rexmit_fast(pcb); + } + } + } + } + } + /* If Clause (1) or more is true, but not a duplicate ack, reset + * count of consecutive duplicate acks */ + if (!found_dupack) { + pcb->dupacks = 0; + } + } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)){ + /* We come here when the ACK acknowledges new data. */ + + /* Reset the "IN Fast Retransmit" flag, since we are no longer + in fast retransmit. Also reset the congestion window to the + slow start threshold. */ + if (pcb->flags & TF_INFR) { + pcb->flags &= ~TF_INFR; + pcb->cwnd = pcb->ssthresh; + } + + /* Reset the number of retransmissions. */ + pcb->nrtx = 0; + + /* Reset the retransmission time-out. */ + pcb->rto = (pcb->sa >> 3) + pcb->sv; + + /* Update the send buffer space. Diff between the two can never exceed 64K? */ + pcb->acked = (u16_t)(ackno - pcb->lastack); + + pcb->snd_buf += pcb->acked; + + /* Reset the fast retransmit variables. */ + pcb->dupacks = 0; + pcb->lastack = ackno; + + /* Update the congestion control variables (cwnd and + ssthresh). */ + if (pcb->state >= ESTABLISHED) { + if (pcb->cwnd < pcb->ssthresh) { + if ((u16_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) { + pcb->cwnd += pcb->mss; + } + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: slow start cwnd %"U16_F"\n", pcb->cwnd)); + } else { + u16_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd); + if (new_cwnd > pcb->cwnd) { + pcb->cwnd = new_cwnd; + } + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_receive: congestion avoidance cwnd %"U16_F"\n", pcb->cwnd)); + } + } + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: ACK for %"U32_F", unacked->seqno %"U32_F":%"U32_F"\n", + ackno, + pcb->unacked != NULL? + ntohl(pcb->unacked->tcphdr->seqno): 0, + pcb->unacked != NULL? + ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0)); + + /* Remove segment from the unacknowledged list if the incoming + ACK acknowlegdes them. */ + while (pcb->unacked != NULL && + TCP_SEQ_LEQ(ntohl(pcb->unacked->tcphdr->seqno) + + TCP_TCPLEN(pcb->unacked), ackno)) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unacked\n", + ntohl(pcb->unacked->tcphdr->seqno), + ntohl(pcb->unacked->tcphdr->seqno) + + TCP_TCPLEN(pcb->unacked))); + + next = pcb->unacked; + pcb->unacked = pcb->unacked->next; + + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen)); + LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p))); + /* Prevent ACK for FIN to generate a sent event */ + if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) { + pcb->acked--; + } + + pcb->snd_queuelen -= pbuf_clen(next->p); + tcp_seg_free(next); + + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"U16_F" (after freeing unacked)\n", (u16_t)pcb->snd_queuelen)); + if (pcb->snd_queuelen != 0) { + LWIP_ASSERT("tcp_receive: valid queue length", pcb->unacked != NULL || + pcb->unsent != NULL); + } + } + + /* If there's nothing left to acknowledge, stop the retransmit + timer, otherwise reset it to start again */ + if(pcb->unacked == NULL) + pcb->rtime = -1; + else + pcb->rtime = 0; + + pcb->polltmr = 0; + } else { + /* Fix bug bug #21582: out of sequence ACK, didn't really ack anything */ + pcb->acked = 0; + } + + /* We go through the ->unsent list to see if any of the segments + on the list are acknowledged by the ACK. This may seem + strange since an "unsent" segment shouldn't be acked. The + rationale is that lwIP puts all outstanding segments on the + ->unsent list after a retransmission, so these segments may + in fact have been sent once. */ + while (pcb->unsent != NULL && + TCP_SEQ_BETWEEN(ackno, ntohl(pcb->unsent->tcphdr->seqno) + + TCP_TCPLEN(pcb->unsent), pcb->snd_nxt)) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: removing %"U32_F":%"U32_F" from pcb->unsent\n", + ntohl(pcb->unsent->tcphdr->seqno), ntohl(pcb->unsent->tcphdr->seqno) + + TCP_TCPLEN(pcb->unsent))); + + next = pcb->unsent; + pcb->unsent = pcb->unsent->next; +#if TCP_OVERSIZE + if (pcb->unsent == NULL) { + pcb->unsent_oversize = 0; + } +#endif /* TCP_OVERSIZE */ + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_receive: queuelen %"U16_F" ... ", (u16_t)pcb->snd_queuelen)); + LWIP_ASSERT("pcb->snd_queuelen >= pbuf_clen(next->p)", (pcb->snd_queuelen >= pbuf_clen(next->p))); + /* Prevent ACK for FIN to generate a sent event */ + if ((pcb->acked != 0) && ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0)) { + pcb->acked--; + } + pcb->snd_queuelen -= pbuf_clen(next->p); + tcp_seg_free(next); + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("%"U16_F" (after freeing unsent)\n", (u16_t)pcb->snd_queuelen)); + if (pcb->snd_queuelen != 0) { + LWIP_ASSERT("tcp_receive: valid queue length", + pcb->unacked != NULL || pcb->unsent != NULL); + } + } + /* End of ACK for new data processing. */ + + LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: pcb->rttest %"U32_F" rtseq %"U32_F" ackno %"U32_F"\n", + pcb->rttest, pcb->rtseq, ackno)); + + /* RTT estimation calculations. This is done by checking if the + incoming segment acknowledges the segment we use to take a + round-trip time measurement. */ + if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) { + /* diff between this shouldn't exceed 32K since this are tcp timer ticks + and a round-trip shouldn't be that long... */ + m = (s16_t)(tcp_ticks - pcb->rttest); + + LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: experienced rtt %"U16_F" ticks (%"U16_F" msec).\n", + m, m * TCP_SLOW_INTERVAL)); + + /* This is taken directly from VJs original code in his paper */ + m = m - (pcb->sa >> 3); + pcb->sa += m; + if (m < 0) { + m = -m; + } + m = m - (pcb->sv >> 2); + pcb->sv += m; + pcb->rto = (pcb->sa >> 3) + pcb->sv; + + LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_receive: RTO %"U16_F" (%"U16_F" milliseconds)\n", + pcb->rto, pcb->rto * TCP_SLOW_INTERVAL)); + + pcb->rttest = 0; + } + } + + /* If the incoming segment contains data, we must process it + further unless the pcb already received a FIN. + (RFC 793, chapeter 3.9, "SEGMENT ARRIVES" in states CLOSE-WAIT, CLOSING, + LAST-ACK and TIME-WAIT: "Ignore the segment text.") */ + if ((tcplen > 0) && (pcb->state < CLOSE_WAIT)) { + /* This code basically does three things: + + +) If the incoming segment contains data that is the next + in-sequence data, this data is passed to the application. This + might involve trimming the first edge of the data. The rcv_nxt + variable and the advertised window are adjusted. + + +) If the incoming segment has data that is above the next + sequence number expected (->rcv_nxt), the segment is placed on + the ->ooseq queue. This is done by finding the appropriate + place in the ->ooseq queue (which is ordered by sequence + number) and trim the segment in both ends if needed. An + immediate ACK is sent to indicate that we received an + out-of-sequence segment. + + +) Finally, we check if the first segment on the ->ooseq queue + now is in sequence (i.e., if rcv_nxt >= ooseq->seqno). If + rcv_nxt > ooseq->seqno, we must trim the first edge of the + segment on ->ooseq before we adjust rcv_nxt. The data in the + segments that are now on sequence are chained onto the + incoming segment so that we only need to call the application + once. + */ + + /* First, we check if we must trim the first edge. We have to do + this if the sequence number of the incoming segment is less + than rcv_nxt, and the sequence number plus the length of the + segment is larger than rcv_nxt. */ + /* if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){ + if (TCP_SEQ_LT(pcb->rcv_nxt, seqno + tcplen)) {*/ + if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)){ + /* Trimming the first edge is done by pushing the payload + pointer in the pbuf downwards. This is somewhat tricky since + we do not want to discard the full contents of the pbuf up to + the new starting point of the data since we have to keep the + TCP header which is present in the first pbuf in the chain. + + What is done is really quite a nasty hack: the first pbuf in + the pbuf chain is pointed to by inseg.p. Since we need to be + able to deallocate the whole pbuf, we cannot change this + inseg.p pointer to point to any of the later pbufs in the + chain. Instead, we point the ->payload pointer in the first + pbuf to data in one of the later pbufs. We also set the + inseg.data pointer to point to the right place. This way, the + ->p pointer will still point to the first pbuf, but the + ->p->payload pointer will point to data in another pbuf. + + After we are done with adjusting the pbuf pointers we must + adjust the ->data pointer in the seg and the segment + length.*/ + + off = pcb->rcv_nxt - seqno; + p = inseg.p; + LWIP_ASSERT("inseg.p != NULL", inseg.p); + LWIP_ASSERT("insane offset!", (off < 0x7fff)); + if (inseg.p->len < off) { + LWIP_ASSERT("pbuf too short!", (((s32_t)inseg.p->tot_len) >= off)); + new_tot_len = (u16_t)(inseg.p->tot_len - off); + while (p->len < off) { + off -= p->len; + /* KJM following line changed (with addition of new_tot_len var) + to fix bug #9076 + inseg.p->tot_len -= p->len; */ + p->tot_len = new_tot_len; + p->len = 0; + p = p->next; + } + if(pbuf_header(p, (s16_t)-off)) { + /* Do we need to cope with this failing? Assert for now */ + LWIP_ASSERT("pbuf_header failed", 0); + } + } else { + if(pbuf_header(inseg.p, (s16_t)-off)) { + /* Do we need to cope with this failing? Assert for now */ + LWIP_ASSERT("pbuf_header failed", 0); + } + } + inseg.len -= (u16_t)(pcb->rcv_nxt - seqno); + inseg.tcphdr->seqno = seqno = pcb->rcv_nxt; + } + else { + if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)){ + /* the whole segment is < rcv_nxt */ + /* must be a duplicate of a packet that has already been correctly handled */ + + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: duplicate seqno %"U32_F"\n", seqno)); + tcp_ack_now(pcb); + } + } + + /* The sequence number must be within the window (above rcv_nxt + and below rcv_nxt + rcv_wnd) in order to be further + processed. */ + if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, + pcb->rcv_nxt + pcb->rcv_wnd - 1)){ + if (pcb->rcv_nxt == seqno) { + /* The incoming segment is the next in sequence. We check if + we have to trim the end of the segment and update rcv_nxt + and pass the data to the application. */ + tcplen = TCP_TCPLEN(&inseg); + + if (tcplen > pcb->rcv_wnd) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, + ("tcp_receive: other end overran receive window" + "seqno %"U32_F" len %"U16_F" right edge %"U32_F"\n", + seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd)); + if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { + /* Must remove the FIN from the header as we're trimming + * that byte of sequence-space from the packet */ + TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) &~ TCP_FIN); + } + /* Adjust length of segment to fit in the window. */ + inseg.len = pcb->rcv_wnd; + if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) { + inseg.len -= 1; + } + pbuf_realloc(inseg.p, inseg.len); + tcplen = TCP_TCPLEN(&inseg); + LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n", + (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd)); + } +#if TCP_QUEUE_OOSEQ + /* Received in-sequence data, adjust ooseq data if: + - FIN has been received or + - inseq overlaps with ooseq */ + if (pcb->ooseq != NULL) { + if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, + ("tcp_receive: received in-order FIN, binning ooseq queue\n")); + /* Received in-order FIN means anything that was received + * out of order must now have been received in-order, so + * bin the ooseq queue */ + while (pcb->ooseq != NULL) { + struct tcp_seg *old_ooseq = pcb->ooseq; + pcb->ooseq = pcb->ooseq->next; + tcp_seg_free(old_ooseq); + } + } else { + next = pcb->ooseq; + /* Remove all segments on ooseq that are covered by inseg already. + * FIN is copied from ooseq to inseg if present. */ + while (next && + TCP_SEQ_GEQ(seqno + tcplen, + next->tcphdr->seqno + next->len)) { + /* inseg cannot have FIN here (already processed above) */ + if (TCPH_FLAGS(next->tcphdr) & TCP_FIN && + (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) == 0) { + TCPH_SET_FLAG(inseg.tcphdr, TCP_FIN); + tcplen = TCP_TCPLEN(&inseg); + } + prev = next; + next = next->next; + tcp_seg_free(prev); + } + /* Now trim right side of inseg if it overlaps with the first + * segment on ooseq */ + if (next && + TCP_SEQ_GT(seqno + tcplen, + next->tcphdr->seqno)) { + /* inseg cannot have FIN here (already processed above) */ + inseg.len = (u16_t)(next->tcphdr->seqno - seqno); + if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) { + inseg.len -= 1; + } + pbuf_realloc(inseg.p, inseg.len); + tcplen = TCP_TCPLEN(&inseg); + LWIP_ASSERT("tcp_receive: segment not trimmed correctly to ooseq queue\n", + (seqno + tcplen) == next->tcphdr->seqno); + } + pcb->ooseq = next; + } + } +#endif /* TCP_QUEUE_OOSEQ */ + + pcb->rcv_nxt = seqno + tcplen; + + /* Update the receiver's (our) window. */ + LWIP_ASSERT("tcp_receive: tcplen > rcv_wnd\n", pcb->rcv_wnd >= tcplen); + pcb->rcv_wnd -= tcplen; + + tcp_update_rcv_ann_wnd(pcb); + + /* If there is data in the segment, we make preparations to + pass this up to the application. The ->recv_data variable + is used for holding the pbuf that goes to the + application. The code for reassembling out-of-sequence data + chains its data on this pbuf as well. + + If the segment was a FIN, we set the TF_GOT_FIN flag that will + be used to indicate to the application that the remote side has + closed its end of the connection. */ + if (inseg.p->tot_len > 0) { + recv_data = inseg.p; + /* Since this pbuf now is the responsibility of the + application, we delete our reference to it so that we won't + (mistakingly) deallocate it. */ + inseg.p = NULL; + } + if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: received FIN.\n")); + recv_flags |= TF_GOT_FIN; + } + +#if TCP_QUEUE_OOSEQ + /* We now check if we have segments on the ->ooseq queue that + are now in sequence. */ + while (pcb->ooseq != NULL && + pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) { + + cseg = pcb->ooseq; + seqno = pcb->ooseq->tcphdr->seqno; + + pcb->rcv_nxt += TCP_TCPLEN(cseg); + LWIP_ASSERT("tcp_receive: ooseq tcplen > rcv_wnd\n", + pcb->rcv_wnd >= TCP_TCPLEN(cseg)); + pcb->rcv_wnd -= TCP_TCPLEN(cseg); + + tcp_update_rcv_ann_wnd(pcb); + + if (cseg->p->tot_len > 0) { + /* Chain this pbuf onto the pbuf that we will pass to + the application. */ + if (recv_data) { + pbuf_cat(recv_data, cseg->p); + } else { + recv_data = cseg->p; + } + cseg->p = NULL; + } + if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_receive: dequeued FIN.\n")); + recv_flags |= TF_GOT_FIN; + if (pcb->state == ESTABLISHED) { /* force passive close or we can move to active close */ + pcb->state = CLOSE_WAIT; + } + } + + pcb->ooseq = cseg->next; + tcp_seg_free(cseg); + } +#endif /* TCP_QUEUE_OOSEQ */ + + + /* Acknowledge the segment(s). */ + tcp_ack(pcb); + + } else { + /* We get here if the incoming segment is out-of-sequence. */ + tcp_send_empty_ack(pcb); +#if TCP_QUEUE_OOSEQ + /* We queue the segment on the ->ooseq queue. */ + if (pcb->ooseq == NULL) { + pcb->ooseq = tcp_seg_copy(&inseg); + } else { + /* If the queue is not empty, we walk through the queue and + try to find a place where the sequence number of the + incoming segment is between the sequence numbers of the + previous and the next segment on the ->ooseq queue. That is + the place where we put the incoming segment. If needed, we + trim the second edges of the previous and the incoming + segment so that it will fit into the sequence. + + If the incoming segment has the same sequence number as a + segment on the ->ooseq queue, we discard the segment that + contains less data. */ + + prev = NULL; + for(next = pcb->ooseq; next != NULL; next = next->next) { + if (seqno == next->tcphdr->seqno) { + /* The sequence number of the incoming segment is the + same as the sequence number of the segment on + ->ooseq. We check the lengths to see which one to + discard. */ + if (inseg.len > next->len) { + /* The incoming segment is larger than the old + segment. We replace some segments with the new + one. */ + cseg = tcp_seg_copy(&inseg); + if (cseg != NULL) { + if (prev != NULL) { + prev->next = cseg; + } else { + pcb->ooseq = cseg; + } + tcp_oos_insert_segment(cseg, next); + } + break; + } else { + /* Either the lenghts are the same or the incoming + segment was smaller than the old one; in either + case, we ditch the incoming segment. */ + break; + } + } else { + if (prev == NULL) { + if (TCP_SEQ_LT(seqno, next->tcphdr->seqno)) { + /* The sequence number of the incoming segment is lower + than the sequence number of the first segment on the + queue. We put the incoming segment first on the + queue. */ + cseg = tcp_seg_copy(&inseg); + if (cseg != NULL) { + pcb->ooseq = cseg; + tcp_oos_insert_segment(cseg, next); + } + break; + } + } else { + /*if (TCP_SEQ_LT(prev->tcphdr->seqno, seqno) && + TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {*/ + if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno+1, next->tcphdr->seqno-1)) { + /* The sequence number of the incoming segment is in + between the sequence numbers of the previous and + the next segment on ->ooseq. We trim trim the previous + segment, delete next segments that included in received segment + and trim received, if needed. */ + cseg = tcp_seg_copy(&inseg); + if (cseg != NULL) { + if (TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) { + /* We need to trim the prev segment. */ + prev->len = (u16_t)(seqno - prev->tcphdr->seqno); + pbuf_realloc(prev->p, prev->len); + } + prev->next = cseg; + tcp_oos_insert_segment(cseg, next); + } + break; + } + } + /* If the "next" segment is the last segment on the + ooseq queue, we add the incoming segment to the end + of the list. */ + if (next->next == NULL && + TCP_SEQ_GT(seqno, next->tcphdr->seqno)) { + if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) { + /* segment "next" already contains all data */ + break; + } + next->next = tcp_seg_copy(&inseg); + if (next->next != NULL) { + if (TCP_SEQ_GT(next->tcphdr->seqno + next->len, seqno)) { + /* We need to trim the last segment. */ + next->len = (u16_t)(seqno - next->tcphdr->seqno); + pbuf_realloc(next->p, next->len); + } + /* check if the remote side overruns our receive window */ + if ((u32_t)tcplen + seqno > pcb->rcv_nxt + (u32_t)pcb->rcv_wnd) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, + ("tcp_receive: other end overran receive window" + "seqno %"U32_F" len %"U16_F" right edge %"U32_F"\n", + seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd)); + if (TCPH_FLAGS(next->next->tcphdr) & TCP_FIN) { + /* Must remove the FIN from the header as we're trimming + * that byte of sequence-space from the packet */ + TCPH_FLAGS_SET(next->next->tcphdr, TCPH_FLAGS(next->next->tcphdr) &~ TCP_FIN); + } + /* Adjust length of segment to fit in the window. */ + next->next->len = pcb->rcv_nxt + pcb->rcv_wnd - seqno; + pbuf_realloc(next->next->p, next->next->len); + tcplen = TCP_TCPLEN(next->next); + LWIP_ASSERT("tcp_receive: segment not trimmed correctly to rcv_wnd\n", + (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd)); + } + } + break; + } + } + prev = next; + } + } +#if TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS + /* Check that the data on ooseq doesn't exceed one of the limits + and throw away everything above that limit. */ + ooseq_blen = 0; + ooseq_qlen = 0; + prev = NULL; + for(next = pcb->ooseq; next != NULL; prev = next, next = next->next) { + struct pbuf *p = next->p; + ooseq_blen += p->tot_len; + ooseq_qlen += pbuf_clen(p); + if ((ooseq_blen > TCP_OOSEQ_MAX_BYTES) || + (ooseq_qlen > TCP_OOSEQ_MAX_PBUFS)) { + /* too much ooseq data, dump this and everything after it */ + tcp_segs_free(next); + if (prev == NULL) { + /* first ooseq segment is too much, dump the whole queue */ + pcb->ooseq = NULL; + } else { + /* just dump 'next' and everything after it */ + prev->next = NULL; + } + break; + } + } +#endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */ +#endif /* TCP_QUEUE_OOSEQ */ + } + } else { + /* The incoming segment is not withing the window. */ + tcp_send_empty_ack(pcb); + } + } else { + /* Segments with length 0 is taken care of here. Segments that + fall out of the window are ACKed. */ + /*if (TCP_SEQ_GT(pcb->rcv_nxt, seqno) || + TCP_SEQ_GEQ(seqno, pcb->rcv_nxt + pcb->rcv_wnd)) {*/ + if(!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd-1)){ + tcp_ack_now(pcb); + } + } +} + +/** + * Parses the options contained in the incoming segment. + * + * Called from tcp_listen_input() and tcp_process(). + * Currently, only the MSS option is supported! + * + * @param pcb the tcp_pcb for which a segment arrived + */ +static void +tcp_parseopt(struct tcp_pcb *pcb) +{ + u16_t c, max_c; + u16_t mss; + u8_t *opts, opt; +#if LWIP_TCP_TIMESTAMPS + u32_t tsval; +#endif + + opts = (u8_t *)tcphdr + TCP_HLEN; + + /* Parse the TCP MSS option, if present. */ + if(TCPH_HDRLEN(tcphdr) > 0x5) { + max_c = (TCPH_HDRLEN(tcphdr) - 5) << 2; + for (c = 0; c < max_c; ) { + opt = opts[c]; + switch (opt) { + case 0x00: + /* End of options. */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: EOL\n")); + return; + case 0x01: + /* NOP option. */ + ++c; + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: NOP\n")); + break; + case 0x02: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: MSS\n")); + if (opts[c + 1] != 0x04 || c + 0x04 > max_c) { + /* Bad length */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); + return; + } + /* An MSS option with the right option length. */ + mss = (opts[c + 2] << 8) | opts[c + 3]; + /* Limit the mss to the configured TCP_MSS and prevent division by zero */ + pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss; + /* Advance to next option */ + c += 0x04; + break; +#if LWIP_TCP_TIMESTAMPS + case 0x08: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: TS\n")); + if (opts[c + 1] != 0x0A || c + 0x0A > max_c) { + /* Bad length */ + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); + return; + } + /* TCP timestamp option with valid length */ + tsval = (opts[c+2]) | (opts[c+3] << 8) | + (opts[c+4] << 16) | (opts[c+5] << 24); + if (flags & TCP_SYN) { + pcb->ts_recent = ntohl(tsval); + pcb->flags |= TF_TIMESTAMP; + } else if (TCP_SEQ_BETWEEN(pcb->ts_lastacksent, seqno, seqno+tcplen)) { + pcb->ts_recent = ntohl(tsval); + } + /* Advance to next option */ + c += 0x0A; + break; +#endif + default: + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: other\n")); + if (opts[c + 1] == 0) { + LWIP_DEBUGF(TCP_INPUT_DEBUG, ("tcp_parseopt: bad length\n")); + /* If the length field is zero, the options are malformed + and we don't process them further. */ + return; + } + /* All other options have a length field, so that we easily + can skip past them. */ + c += opts[c + 1]; + } + } + } +} + +#endif /* LWIP_TCP */ diff --git a/third_party/lwip-1.4.1/src/core/tcp_out.c b/third_party/lwip-1.4.1/src/core/tcp_out.c new file mode 100644 index 0000000..3237c4b --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/tcp_out.c @@ -0,0 +1,1485 @@ +/** + * @file + * Transmission Control Protocol, outgoing traffic + * + * The output functions of TCP. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#include "lwip/opt.h" + +#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/tcp_impl.h" +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/memp.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/inet_chksum.h" +#include "lwip/stats.h" +#include "lwip/snmp.h" +#if LWIP_TCP_TIMESTAMPS +#include "lwip/sys.h" +#endif + +#include + +/* Define some copy-macros for checksum-on-copy so that the code looks + nicer by preventing too many ifdef's. */ +#if TCP_CHECKSUM_ON_COPY +#define TCP_DATA_COPY(dst, src, len, seg) do { \ + tcp_seg_add_chksum(LWIP_CHKSUM_COPY(dst, src, len), \ + len, &seg->chksum, &seg->chksum_swapped); \ + seg->flags |= TF_SEG_DATA_CHECKSUMMED; } while(0) +#define TCP_DATA_COPY2(dst, src, len, chksum, chksum_swapped) \ + tcp_seg_add_chksum(LWIP_CHKSUM_COPY(dst, src, len), len, chksum, chksum_swapped); +#else /* TCP_CHECKSUM_ON_COPY*/ +#define TCP_DATA_COPY(dst, src, len, seg) MEMCPY(dst, src, len) +#define TCP_DATA_COPY2(dst, src, len, chksum, chksum_swapped) MEMCPY(dst, src, len) +#endif /* TCP_CHECKSUM_ON_COPY*/ + +/** Define this to 1 for an extra check that the output checksum is valid + * (usefule when the checksum is generated by the application, not the stack) */ +#ifndef TCP_CHECKSUM_ON_COPY_SANITY_CHECK +#define TCP_CHECKSUM_ON_COPY_SANITY_CHECK 0 +#endif + +/* Forward declarations.*/ +static void tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb); + +/** Allocate a pbuf and create a tcphdr at p->payload, used for output + * functions other than the default tcp_output -> tcp_output_segment + * (e.g. tcp_send_empty_ack, etc.) + * + * @param pcb tcp pcb for which to send a packet (used to initialize tcp_hdr) + * @param optlen length of header-options + * @param datalen length of tcp data to reserve in pbuf + * @param seqno_be seqno in network byte order (big-endian) + * @return pbuf with p->payload being the tcp_hdr + */ +static struct pbuf * +tcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen, + u32_t seqno_be /* already in network byte order */) +{ + struct tcp_hdr *tcphdr; + struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM); + if (p != NULL) { + LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", + (p->len >= TCP_HLEN + optlen)); + tcphdr = (struct tcp_hdr *)p->payload; + tcphdr->src = htons(pcb->local_port); + tcphdr->dest = htons(pcb->remote_port); + tcphdr->seqno = seqno_be; + tcphdr->ackno = htonl(pcb->rcv_nxt); + TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), TCP_ACK); + tcphdr->wnd = htons(pcb->rcv_ann_wnd); + tcphdr->chksum = 0; + tcphdr->urgp = 0; + + /* If we're sending a packet, update the announced right window edge */ + pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd; + } + return p; +} + +/** + * Called by tcp_close() to send a segment including FIN flag but not data. + * + * @param pcb the tcp_pcb over which to send a segment + * @return ERR_OK if sent, another err_t otherwise + */ +err_t +tcp_send_fin(struct tcp_pcb *pcb) +{ + /* first, try to add the fin to the last unsent segment */ + if (pcb->unsent != NULL) { + struct tcp_seg *last_unsent; + for (last_unsent = pcb->unsent; last_unsent->next != NULL; + last_unsent = last_unsent->next); + + if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) { + /* no SYN/FIN/RST flag in the header, we can add the FIN flag */ + TCPH_SET_FLAG(last_unsent->tcphdr, TCP_FIN); + pcb->flags |= TF_FIN; + return ERR_OK; + } + } + /* no data, no length, flags, copy=1, no optdata */ + return tcp_enqueue_flags(pcb, TCP_FIN); +} + +/** + * Create a TCP segment with prefilled header. + * + * Called by tcp_write and tcp_enqueue_flags. + * + * @param pcb Protocol control block for the TCP connection. + * @param p pbuf that is used to hold the TCP header. + * @param flags TCP flags for header. + * @param seqno TCP sequence number of this packet + * @param optflags options to include in TCP header + * @return a new tcp_seg pointing to p, or NULL. + * The TCP header is filled in except ackno and wnd. + * p is freed on failure. + */ +static struct tcp_seg * +tcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags) +{ + struct tcp_seg *seg; + u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags); + + if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no memory.\n")); + pbuf_free(p); + return NULL; + } + seg->flags = optflags; + seg->next = NULL; + seg->p = p; + seg->len = p->tot_len - optlen; +#if TCP_OVERSIZE_DBGCHECK + seg->oversize_left = 0; +#endif /* TCP_OVERSIZE_DBGCHECK */ +#if TCP_CHECKSUM_ON_COPY + seg->chksum = 0; + seg->chksum_swapped = 0; + /* check optflags */ + LWIP_ASSERT("invalid optflags passed: TF_SEG_DATA_CHECKSUMMED", + (optflags & TF_SEG_DATA_CHECKSUMMED) == 0); +#endif /* TCP_CHECKSUM_ON_COPY */ + + /* build TCP header */ + if (pbuf_header(p, TCP_HLEN)) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_create_segment: no room for TCP header in pbuf.\n")); + TCP_STATS_INC(tcp.err); + tcp_seg_free(seg); + return NULL; + } + seg->tcphdr = (struct tcp_hdr *)seg->p->payload; + seg->tcphdr->src = htons(pcb->local_port); + seg->tcphdr->dest = htons(pcb->remote_port); + seg->tcphdr->seqno = htonl(seqno); + /* ackno is set in tcp_output */ + TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), flags); + /* wnd and chksum are set in tcp_output */ + seg->tcphdr->urgp = 0; + return seg; +} + +/** + * Allocate a PBUF_RAM pbuf, perhaps with extra space at the end. + * + * This function is like pbuf_alloc(layer, length, PBUF_RAM) except + * there may be extra bytes available at the end. + * + * @param layer flag to define header size. + * @param length size of the pbuf's payload. + * @param max_length maximum usable size of payload+oversize. + * @param oversize pointer to a u16_t that will receive the number of usable tail bytes. + * @param pcb The TCP connection that willo enqueue the pbuf. + * @param apiflags API flags given to tcp_write. + * @param first_seg true when this pbuf will be used in the first enqueued segment. + * @param + */ +#if TCP_OVERSIZE +static struct pbuf * +tcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length, + u16_t *oversize, struct tcp_pcb *pcb, u8_t apiflags, + u8_t first_seg) +{ + struct pbuf *p; + u16_t alloc = length; + +#if LWIP_NETIF_TX_SINGLE_PBUF + LWIP_UNUSED_ARG(max_length); + LWIP_UNUSED_ARG(pcb); + LWIP_UNUSED_ARG(apiflags); + LWIP_UNUSED_ARG(first_seg); + /* always create MSS-sized pbufs */ + alloc = max_length; +#else /* LWIP_NETIF_TX_SINGLE_PBUF */ + if (length < max_length) { + /* Should we allocate an oversized pbuf, or just the minimum + * length required? If tcp_write is going to be called again + * before this segment is transmitted, we want the oversized + * buffer. If the segment will be transmitted immediately, we can + * save memory by allocating only length. We use a simple + * heuristic based on the following information: + * + * Did the user set TCP_WRITE_FLAG_MORE? + * + * Will the Nagle algorithm defer transmission of this segment? + */ + if ((apiflags & TCP_WRITE_FLAG_MORE) || + (!(pcb->flags & TF_NODELAY) && + (!first_seg || + pcb->unsent != NULL || + pcb->unacked != NULL))) { + alloc = LWIP_MIN(max_length, LWIP_MEM_ALIGN_SIZE(length + TCP_OVERSIZE)); + } + } +#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ + p = pbuf_alloc(layer, alloc, PBUF_RAM); + if (p == NULL) { + return NULL; + } + LWIP_ASSERT("need unchained pbuf", p->next == NULL); + *oversize = p->len - length; + /* trim p->len to the currently used size */ + p->len = p->tot_len = length; + return p; +} +#else /* TCP_OVERSIZE */ +#define tcp_pbuf_prealloc(layer, length, mx, os, pcb, api, fst) pbuf_alloc((layer), (length), PBUF_RAM) +#endif /* TCP_OVERSIZE */ + +#if TCP_CHECKSUM_ON_COPY +/** Add a checksum of newly added data to the segment */ +static void +tcp_seg_add_chksum(u16_t chksum, u16_t len, u16_t *seg_chksum, + u8_t *seg_chksum_swapped) +{ + u32_t helper; + /* add chksum to old chksum and fold to u16_t */ + helper = chksum + *seg_chksum; + chksum = FOLD_U32T(helper); + if ((len & 1) != 0) { + *seg_chksum_swapped = 1 - *seg_chksum_swapped; + chksum = SWAP_BYTES_IN_WORD(chksum); + } + *seg_chksum = chksum; +} +#endif /* TCP_CHECKSUM_ON_COPY */ + +/** Checks if tcp_write is allowed or not (checks state, snd_buf and snd_queuelen). + * + * @param pcb the tcp pcb to check for + * @param len length of data to send (checked agains snd_buf) + * @return ERR_OK if tcp_write is allowed to proceed, another err_t otherwise + */ +static err_t +tcp_write_checks(struct tcp_pcb *pcb, u16_t len) +{ + /* connection is in invalid state for data transmission? */ + if ((pcb->state != ESTABLISHED) && + (pcb->state != CLOSE_WAIT) && + (pcb->state != SYN_SENT) && + (pcb->state != SYN_RCVD)) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, ("tcp_write() called in invalid state\n")); + return ERR_CONN; + } else if (len == 0) { + return ERR_OK; + } + + /* fail on too much data */ + if (len > pcb->snd_buf) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_write: too much data (len=%"U16_F" > snd_buf=%"U16_F")\n", + len, pcb->snd_buf)); + pcb->flags |= TF_NAGLEMEMERR; + return ERR_MEM; + } + + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen)); + + /* If total number of pbufs on the unsent/unacked queues exceeds the + * configured maximum, return an error */ + /* check for configured max queuelen and possible overflow */ + if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_write: too long queue %"U16_F" (max %"U16_F")\n", + pcb->snd_queuelen, TCP_SND_QUEUELEN)); + TCP_STATS_INC(tcp.memerr); + pcb->flags |= TF_NAGLEMEMERR; + return ERR_MEM; + } + if (pcb->snd_queuelen != 0) { + LWIP_ASSERT("tcp_write: pbufs on queue => at least one queue non-empty", + pcb->unacked != NULL || pcb->unsent != NULL); + } else { + LWIP_ASSERT("tcp_write: no pbufs on queue => both queues empty", + pcb->unacked == NULL && pcb->unsent == NULL); + } + return ERR_OK; +} + +/** + * Write data for sending (but does not send it immediately). + * + * It waits in the expectation of more data being sent soon (as + * it can send them more efficiently by combining them together). + * To prompt the system to send data now, call tcp_output() after + * calling tcp_write(). + * + * @param pcb Protocol control block for the TCP connection to enqueue data for. + * @param arg Pointer to the data to be enqueued for sending. + * @param len Data length in bytes + * @param apiflags combination of following flags : + * - TCP_WRITE_FLAG_COPY (0x01) data will be copied into memory belonging to the stack + * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will be set on last segment sent, + * @return ERR_OK if enqueued, another err_t on error + */ +err_t +tcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags) +{ + struct pbuf *concat_p = NULL; + struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL; + u16_t pos = 0; /* position in 'arg' data */ + u16_t queuelen; + u8_t optlen = 0; + u8_t optflags = 0; +#if TCP_OVERSIZE + u16_t oversize = 0; + u16_t oversize_used = 0; +#endif /* TCP_OVERSIZE */ +#if TCP_CHECKSUM_ON_COPY + u16_t concat_chksum = 0; + u8_t concat_chksum_swapped = 0; + u16_t concat_chksummed = 0; +#endif /* TCP_CHECKSUM_ON_COPY */ + err_t err; + /* don't allocate segments bigger than half the maximum window we ever received */ + u16_t mss_local = LWIP_MIN(pcb->mss, pcb->snd_wnd_max/2); + +#if LWIP_NETIF_TX_SINGLE_PBUF + /* Always copy to try to create single pbufs for TX */ + apiflags |= TCP_WRITE_FLAG_COPY; +#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ + + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_write(pcb=%p, data=%p, len=%"U16_F", apiflags=%"U16_F")\n", + (void *)pcb, arg, len, (u16_t)apiflags)); + LWIP_ERROR("tcp_write: arg == NULL (programmer violates API)", + arg != NULL, return ERR_ARG;); + + err = tcp_write_checks(pcb, len); + if (err != ERR_OK) { + return err; + } + queuelen = pcb->snd_queuelen; + +#if LWIP_TCP_TIMESTAMPS + if ((pcb->flags & TF_TIMESTAMP)) { + optflags = TF_SEG_OPTS_TS; + optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS); + } +#endif /* LWIP_TCP_TIMESTAMPS */ + + + /* + * TCP segmentation is done in three phases with increasing complexity: + * + * 1. Copy data directly into an oversized pbuf. + * 2. Chain a new pbuf to the end of pcb->unsent. + * 3. Create new segments. + * + * We may run out of memory at any point. In that case we must + * return ERR_MEM and not change anything in pcb. Therefore, all + * changes are recorded in local variables and committed at the end + * of the function. Some pcb fields are maintained in local copies: + * + * queuelen = pcb->snd_queuelen + * oversize = pcb->unsent_oversize + * + * These variables are set consistently by the phases: + * + * seg points to the last segment tampered with. + * + * pos records progress as data is segmented. + */ + + /* Find the tail of the unsent queue. */ + if (pcb->unsent != NULL) { + u16_t space; + u16_t unsent_optlen; + + /* @todo: this could be sped up by keeping last_unsent in the pcb */ + for (last_unsent = pcb->unsent; last_unsent->next != NULL; + last_unsent = last_unsent->next); + + /* Usable space at the end of the last unsent segment */ + unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags); + space = mss_local - (last_unsent->len + unsent_optlen); + + /* + * Phase 1: Copy data directly into an oversized pbuf. + * + * The number of bytes copied is recorded in the oversize_used + * variable. The actual copying is done at the bottom of the + * function. + */ +#if TCP_OVERSIZE +#if TCP_OVERSIZE_DBGCHECK + /* check that pcb->unsent_oversize matches last_unsent->unsent_oversize */ + LWIP_ASSERT("unsent_oversize mismatch (pcb vs. last_unsent)", + pcb->unsent_oversize == last_unsent->oversize_left); +#endif /* TCP_OVERSIZE_DBGCHECK */ + oversize = pcb->unsent_oversize; + if (oversize > 0) { + LWIP_ASSERT("inconsistent oversize vs. space", oversize_used <= space); + seg = last_unsent; + oversize_used = oversize < len ? oversize : len; + pos += oversize_used; + oversize -= oversize_used; + space -= oversize_used; + } + /* now we are either finished or oversize is zero */ + LWIP_ASSERT("inconsistend oversize vs. len", (oversize == 0) || (pos == len)); +#endif /* TCP_OVERSIZE */ + + /* + * Phase 2: Chain a new pbuf to the end of pcb->unsent. + * + * We don't extend segments containing SYN/FIN flags or options + * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at + * the end. + */ + if ((pos < len) && (space > 0) && (last_unsent->len > 0)) { + u16_t seglen = space < len - pos ? space : len - pos; + seg = last_unsent; + + /* Create a pbuf with a copy or reference to seglen bytes. We + * can use PBUF_RAW here since the data appears in the middle of + * a segment. A header will never be prepended. */ + if (apiflags & TCP_WRITE_FLAG_COPY) { + /* Data is copied */ + if ((concat_p = tcp_pbuf_prealloc(PBUF_RAW, seglen, space, &oversize, pcb, apiflags, 1)) == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, + ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n", + seglen)); + goto memerr; + } +#if TCP_OVERSIZE_DBGCHECK + last_unsent->oversize_left += oversize; +#endif /* TCP_OVERSIZE_DBGCHECK */ + TCP_DATA_COPY2(concat_p->payload, (u8_t*)arg + pos, seglen, &concat_chksum, &concat_chksum_swapped); +#if TCP_CHECKSUM_ON_COPY + concat_chksummed += seglen; +#endif /* TCP_CHECKSUM_ON_COPY */ + } else { + /* Data is not copied */ + if ((concat_p = pbuf_alloc(PBUF_RAW, seglen, PBUF_ROM)) == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, + ("tcp_write: could not allocate memory for zero-copy pbuf\n")); + goto memerr; + } +#if TCP_CHECKSUM_ON_COPY + /* calculate the checksum of nocopy-data */ + tcp_seg_add_chksum(~inet_chksum((u8_t*)arg + pos, seglen), seglen, + &concat_chksum, &concat_chksum_swapped); + concat_chksummed += seglen; +#endif /* TCP_CHECKSUM_ON_COPY */ + /* reference the non-volatile payload data */ + concat_p->payload = (u8_t*)arg + pos; + } + + pos += seglen; + queuelen += pbuf_clen(concat_p); + } + } else { +#if TCP_OVERSIZE + LWIP_ASSERT("unsent_oversize mismatch (pcb->unsent is NULL)", + pcb->unsent_oversize == 0); +#endif /* TCP_OVERSIZE */ + } + + /* + * Phase 3: Create new segments. + * + * The new segments are chained together in the local 'queue' + * variable, ready to be appended to pcb->unsent. + */ + while (pos < len) { + struct pbuf *p; + u16_t left = len - pos; + u16_t max_len = mss_local - optlen; + u16_t seglen = left > max_len ? max_len : left; +#if TCP_CHECKSUM_ON_COPY + u16_t chksum = 0; + u8_t chksum_swapped = 0; +#endif /* TCP_CHECKSUM_ON_COPY */ + + if (apiflags & TCP_WRITE_FLAG_COPY) { + /* If copy is set, memory should be allocated and data copied + * into pbuf */ + if ((p = tcp_pbuf_prealloc(PBUF_TRANSPORT, seglen + optlen, mss_local, &oversize, pcb, apiflags, queue == NULL)) == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write : could not allocate memory for pbuf copy size %"U16_F"\n", seglen)); + goto memerr; + } + LWIP_ASSERT("tcp_write: check that first pbuf can hold the complete seglen", + (p->len >= seglen)); + TCP_DATA_COPY2((char *)p->payload + optlen, (u8_t*)arg + pos, seglen, &chksum, &chksum_swapped); + } else { + /* Copy is not set: First allocate a pbuf for holding the data. + * Since the referenced data is available at least until it is + * sent out on the link (as it has to be ACKed by the remote + * party) we can safely use PBUF_ROM instead of PBUF_REF here. + */ + struct pbuf *p2; +#if TCP_OVERSIZE + LWIP_ASSERT("oversize == 0", oversize == 0); +#endif /* TCP_OVERSIZE */ + if ((p2 = pbuf_alloc(PBUF_TRANSPORT, seglen, PBUF_ROM)) == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write: could not allocate memory for zero-copy pbuf\n")); + goto memerr; + } +#if TCP_CHECKSUM_ON_COPY + /* calculate the checksum of nocopy-data */ + chksum = ~inet_chksum((u8_t*)arg + pos, seglen); +#endif /* TCP_CHECKSUM_ON_COPY */ + /* reference the non-volatile payload data */ + p2->payload = (u8_t*)arg + pos; + + /* Second, allocate a pbuf for the headers. */ + if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) { + /* If allocation fails, we have to deallocate the data pbuf as + * well. */ + pbuf_free(p2); + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write: could not allocate memory for header pbuf\n")); + goto memerr; + } + /* Concatenate the headers and data pbufs together. */ + pbuf_cat(p/*header*/, p2/*data*/); + } + + queuelen += pbuf_clen(p); + + /* Now that there are more segments queued, we check again if the + * length of the queue exceeds the configured maximum or + * overflows. */ + if ((queuelen > TCP_SND_QUEUELEN) || (queuelen > TCP_SNDQUEUELEN_OVERFLOW)) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 2, ("tcp_write: queue too long %"U16_F" (%"U16_F")\n", queuelen, TCP_SND_QUEUELEN)); + pbuf_free(p); + goto memerr; + } + + if ((seg = tcp_create_segment(pcb, p, 0, pcb->snd_lbb + pos, optflags)) == NULL) { + goto memerr; + } +#if TCP_OVERSIZE_DBGCHECK + seg->oversize_left = oversize; +#endif /* TCP_OVERSIZE_DBGCHECK */ +#if TCP_CHECKSUM_ON_COPY + seg->chksum = chksum; + seg->chksum_swapped = chksum_swapped; + seg->flags |= TF_SEG_DATA_CHECKSUMMED; +#endif /* TCP_CHECKSUM_ON_COPY */ + + /* first segment of to-be-queued data? */ + if (queue == NULL) { + queue = seg; + } else { + /* Attach the segment to the end of the queued segments */ + LWIP_ASSERT("prev_seg != NULL", prev_seg != NULL); + prev_seg->next = seg; + } + /* remember last segment of to-be-queued data for next iteration */ + prev_seg = seg; + + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, ("tcp_write: queueing %"U32_F":%"U32_F"\n", + ntohl(seg->tcphdr->seqno), + ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg))); + + pos += seglen; + } + + /* + * All three segmentation phases were successful. We can commit the + * transaction. + */ + + /* + * Phase 1: If data has been added to the preallocated tail of + * last_unsent, we update the length fields of the pbuf chain. + */ +#if TCP_OVERSIZE + if (oversize_used > 0) { + struct pbuf *p; + /* Bump tot_len of whole chain, len of tail */ + for (p = last_unsent->p; p; p = p->next) { + p->tot_len += oversize_used; + if (p->next == NULL) { + TCP_DATA_COPY((char *)p->payload + p->len, arg, oversize_used, last_unsent); + p->len += oversize_used; + } + } + last_unsent->len += oversize_used; +#if TCP_OVERSIZE_DBGCHECK + LWIP_ASSERT("last_unsent->oversize_left >= oversize_used", + last_unsent->oversize_left >= oversize_used); + last_unsent->oversize_left -= oversize_used; +#endif /* TCP_OVERSIZE_DBGCHECK */ + } + pcb->unsent_oversize = oversize; +#endif /* TCP_OVERSIZE */ + + /* + * Phase 2: concat_p can be concatenated onto last_unsent->p + */ + if (concat_p != NULL) { + LWIP_ASSERT("tcp_write: cannot concatenate when pcb->unsent is empty", + (last_unsent != NULL)); + pbuf_cat(last_unsent->p, concat_p); + last_unsent->len += concat_p->tot_len; +#if TCP_CHECKSUM_ON_COPY + if (concat_chksummed) { + tcp_seg_add_chksum(concat_chksum, concat_chksummed, &last_unsent->chksum, + &last_unsent->chksum_swapped); + last_unsent->flags |= TF_SEG_DATA_CHECKSUMMED; + } +#endif /* TCP_CHECKSUM_ON_COPY */ + } + + /* + * Phase 3: Append queue to pcb->unsent. Queue may be NULL, but that + * is harmless + */ + if (last_unsent == NULL) { + pcb->unsent = queue; + } else { + last_unsent->next = queue; + } + + /* + * Finally update the pcb state. + */ + pcb->snd_lbb += len; + pcb->snd_buf -= len; + pcb->snd_queuelen = queuelen; + + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_write: %"S16_F" (after enqueued)\n", + pcb->snd_queuelen)); + if (pcb->snd_queuelen != 0) { + LWIP_ASSERT("tcp_write: valid queue length", + pcb->unacked != NULL || pcb->unsent != NULL); + } + + /* Set the PSH flag in the last segment that we enqueued. */ + if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE)==0)) { + TCPH_SET_FLAG(seg->tcphdr, TCP_PSH); + } + + return ERR_OK; +memerr: + pcb->flags |= TF_NAGLEMEMERR; + TCP_STATS_INC(tcp.memerr); + + if (concat_p != NULL) { + pbuf_free(concat_p); + } + if (queue != NULL) { + tcp_segs_free(queue); + } + if (pcb->snd_queuelen != 0) { + LWIP_ASSERT("tcp_write: valid queue length", pcb->unacked != NULL || + pcb->unsent != NULL); + } + LWIP_DEBUGF(TCP_QLEN_DEBUG | LWIP_DBG_STATE, ("tcp_write: %"S16_F" (with mem err)\n", pcb->snd_queuelen)); + return ERR_MEM; +} + +/** + * Enqueue TCP options for transmission. + * + * Called by tcp_connect(), tcp_listen_input(), and tcp_send_ctrl(). + * + * @param pcb Protocol control block for the TCP connection. + * @param flags TCP header flags to set in the outgoing segment. + * @param optdata pointer to TCP options, or NULL. + * @param optlen length of TCP options in bytes. + */ +err_t +tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags) +{ + struct pbuf *p; + struct tcp_seg *seg; + u8_t optflags = 0; + u8_t optlen = 0; + + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue_flags: queuelen: %"U16_F"\n", (u16_t)pcb->snd_queuelen)); + + LWIP_ASSERT("tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)", + (flags & (TCP_SYN | TCP_FIN)) != 0); + + /* check for configured max queuelen and possible overflow */ + if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_enqueue_flags: too long queue %"U16_F" (max %"U16_F")\n", + pcb->snd_queuelen, TCP_SND_QUEUELEN)); + TCP_STATS_INC(tcp.memerr); + pcb->flags |= TF_NAGLEMEMERR; + return ERR_MEM; + } + + if (flags & TCP_SYN) { + optflags = TF_SEG_OPTS_MSS; + } +#if LWIP_TCP_TIMESTAMPS + if ((pcb->flags & TF_TIMESTAMP)) { + optflags |= TF_SEG_OPTS_TS; + } +#endif /* LWIP_TCP_TIMESTAMPS */ + optlen = LWIP_TCP_OPT_LENGTH(optflags); + + /* tcp_enqueue_flags is always called with either SYN or FIN in flags. + * We need one available snd_buf byte to do that. + * This means we can't send FIN while snd_buf==0. A better fix would be to + * not include SYN and FIN sequence numbers in the snd_buf count. */ + if (pcb->snd_buf == 0) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | 3, ("tcp_enqueue_flags: no send buffer available\n")); + TCP_STATS_INC(tcp.memerr); + return ERR_MEM; + } + + /* Allocate pbuf with room for TCP header + options */ + if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) { + pcb->flags |= TF_NAGLEMEMERR; + TCP_STATS_INC(tcp.memerr); + return ERR_MEM; + } + LWIP_ASSERT("tcp_enqueue_flags: check that first pbuf can hold optlen", + (p->len >= optlen)); + + /* Allocate memory for tcp_seg, and fill in fields. */ + if ((seg = tcp_create_segment(pcb, p, flags, pcb->snd_lbb, optflags)) == NULL) { + pcb->flags |= TF_NAGLEMEMERR; + TCP_STATS_INC(tcp.memerr); + return ERR_MEM; + } + LWIP_ASSERT("seg->tcphdr not aligned", ((mem_ptr_t)seg->tcphdr % MEM_ALIGNMENT) == 0); + LWIP_ASSERT("tcp_enqueue_flags: invalid segment length", seg->len == 0); + + LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, + ("tcp_enqueue_flags: queueing %"U32_F":%"U32_F" (0x%"X16_F")\n", + ntohl(seg->tcphdr->seqno), + ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg), + (u16_t)flags)); + + /* Now append seg to pcb->unsent queue */ + if (pcb->unsent == NULL) { + pcb->unsent = seg; + } else { + struct tcp_seg *useg; + for (useg = pcb->unsent; useg->next != NULL; useg = useg->next); + useg->next = seg; + } +#if TCP_OVERSIZE + /* The new unsent tail has no space */ + pcb->unsent_oversize = 0; +#endif /* TCP_OVERSIZE */ + + /* SYN and FIN bump the sequence number */ + if ((flags & TCP_SYN) || (flags & TCP_FIN)) { + pcb->snd_lbb++; + /* optlen does not influence snd_buf */ + pcb->snd_buf--; + } + if (flags & TCP_FIN) { + pcb->flags |= TF_FIN; + } + + /* update number of segments on the queues */ + pcb->snd_queuelen += pbuf_clen(seg->p); + LWIP_DEBUGF(TCP_QLEN_DEBUG, ("tcp_enqueue_flags: %"S16_F" (after enqueued)\n", pcb->snd_queuelen)); + if (pcb->snd_queuelen != 0) { + LWIP_ASSERT("tcp_enqueue_flags: invalid queue length", + pcb->unacked != NULL || pcb->unsent != NULL); + } + + return ERR_OK; +} + +#if LWIP_TCP_TIMESTAMPS +/* Build a timestamp option (12 bytes long) at the specified options pointer) + * + * @param pcb tcp_pcb + * @param opts option pointer where to store the timestamp option + */ +static void +tcp_build_timestamp_option(struct tcp_pcb *pcb, u32_t *opts) +{ + /* Pad with two NOP options to make everything nicely aligned */ + opts[0] = PP_HTONL(0x0101080A); + opts[1] = htonl(sys_now()); + opts[2] = htonl(pcb->ts_recent); +} +#endif + +/** Send an ACK without data. + * + * @param pcb Protocol control block for the TCP connection to send the ACK + */ +err_t +tcp_send_empty_ack(struct tcp_pcb *pcb) +{ + struct pbuf *p; + struct tcp_hdr *tcphdr; + u8_t optlen = 0; + +#if LWIP_TCP_TIMESTAMPS + if (pcb->flags & TF_TIMESTAMP) { + optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS); + } +#endif + + p = tcp_output_alloc_header(pcb, optlen, 0, htonl(pcb->snd_nxt)); + if (p == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: (ACK) could not allocate pbuf\n")); + return ERR_BUF; + } + tcphdr = (struct tcp_hdr *)p->payload; + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, + ("tcp_output: sending ACK for %"U32_F"\n", pcb->rcv_nxt)); + /* remove ACK flags from the PCB, as we send an empty ACK now */ + pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); + + /* NB. MSS option is only sent on SYNs, so ignore it here */ +#if LWIP_TCP_TIMESTAMPS + pcb->ts_lastacksent = pcb->rcv_nxt; + + if (pcb->flags & TF_TIMESTAMP) { + tcp_build_timestamp_option(pcb, (u32_t *)(tcphdr + 1)); + } +#endif + +#if CHECKSUM_GEN_TCP + tcphdr->chksum = inet_chksum_pseudo(p, &(pcb->local_ip), &(pcb->remote_ip), + IP_PROTO_TCP, p->tot_len); +#endif +#if LWIP_NETIF_HWADDRHINT + ip_output_hinted(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, + IP_PROTO_TCP, &(pcb->addr_hint)); +#else /* LWIP_NETIF_HWADDRHINT*/ + ip_output(p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, + IP_PROTO_TCP); +#endif /* LWIP_NETIF_HWADDRHINT*/ + pbuf_free(p); + + return ERR_OK; +} + +/** + * Find out what we can send and send it + * + * @param pcb Protocol control block for the TCP connection to send data + * @return ERR_OK if data has been sent or nothing to send + * another err_t on error + */ +err_t +tcp_output(struct tcp_pcb *pcb) +{ + struct tcp_seg *seg, *useg; + u32_t wnd, snd_nxt; +#if TCP_CWND_DEBUG + s16_t i = 0; +#endif /* TCP_CWND_DEBUG */ + + /* pcb->state LISTEN not allowed here */ + LWIP_ASSERT("don't call tcp_output for listen-pcbs", + pcb->state != LISTEN); + + /* First, check if we are invoked by the TCP input processing + code. If so, we do not output anything. Instead, we rely on the + input processing code to call us when input processing is done + with. */ + if (tcp_input_pcb == pcb) { + return ERR_OK; + } + + wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd); + + seg = pcb->unsent; + + /* If the TF_ACK_NOW flag is set and no data will be sent (either + * because the ->unsent queue is empty or because the window does + * not allow it), construct an empty ACK segment and send it. + * + * If data is to be sent, we will just piggyback the ACK (see below). + */ + if (pcb->flags & TF_ACK_NOW && + (seg == NULL || + ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) { + return tcp_send_empty_ack(pcb); + } + + /* useg should point to last segment on unacked queue */ + useg = pcb->unacked; + if (useg != NULL) { + for (; useg->next != NULL; useg = useg->next); + } + +#if TCP_OUTPUT_DEBUG + if (seg == NULL) { + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output: nothing to send (%p)\n", + (void*)pcb->unsent)); + } +#endif /* TCP_OUTPUT_DEBUG */ +#if TCP_CWND_DEBUG + if (seg == NULL) { + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"U16_F + ", cwnd %"U16_F", wnd %"U32_F + ", seg == NULL, ack %"U32_F"\n", + pcb->snd_wnd, pcb->cwnd, wnd, pcb->lastack)); + } else { + LWIP_DEBUGF(TCP_CWND_DEBUG, + ("tcp_output: snd_wnd %"U16_F", cwnd %"U16_F", wnd %"U32_F + ", effwnd %"U32_F", seq %"U32_F", ack %"U32_F"\n", + pcb->snd_wnd, pcb->cwnd, wnd, + ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len, + ntohl(seg->tcphdr->seqno), pcb->lastack)); + } +#endif /* TCP_CWND_DEBUG */ + /* data available and window allows it to be sent? */ + while (seg != NULL && + ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) { + LWIP_ASSERT("RST not expected here!", + (TCPH_FLAGS(seg->tcphdr) & TCP_RST) == 0); + /* Stop sending if the nagle algorithm would prevent it + * Don't stop: + * - if tcp_write had a memory error before (prevent delayed ACK timeout) or + * - if FIN was already enqueued for this PCB (SYN is always alone in a segment - + * either seg->next != NULL or pcb->unacked == NULL; + * RST is no sent using tcp_write/tcp_output. + */ + if((tcp_do_output_nagle(pcb) == 0) && + ((pcb->flags & (TF_NAGLEMEMERR | TF_FIN)) == 0)){ + break; + } +#if TCP_CWND_DEBUG + LWIP_DEBUGF(TCP_CWND_DEBUG, ("tcp_output: snd_wnd %"U16_F", cwnd %"U16_F", wnd %"U32_F", effwnd %"U32_F", seq %"U32_F", ack %"U32_F", i %"S16_F"\n", + pcb->snd_wnd, pcb->cwnd, wnd, + ntohl(seg->tcphdr->seqno) + seg->len - + pcb->lastack, + ntohl(seg->tcphdr->seqno), pcb->lastack, i)); + ++i; +#endif /* TCP_CWND_DEBUG */ + + pcb->unsent = seg->next; + + if (pcb->state != SYN_SENT) { + TCPH_SET_FLAG(seg->tcphdr, TCP_ACK); + pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW); + } + + tcp_output_segment(seg, pcb); + snd_nxt = ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg); + if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) { + pcb->snd_nxt = snd_nxt; + } + /* put segment on unacknowledged list if length > 0 */ + if (TCP_TCPLEN(seg) > 0) { + seg->next = NULL; + /* unacked list is empty? */ + if (pcb->unacked == NULL) { + pcb->unacked = seg; + useg = seg; + /* unacked list is not empty? */ + } else { + /* In the case of fast retransmit, the packet should not go to the tail + * of the unacked queue, but rather somewhere before it. We need to check for + * this case. -STJ Jul 27, 2004 */ + if (TCP_SEQ_LT(ntohl(seg->tcphdr->seqno), ntohl(useg->tcphdr->seqno))) { + /* add segment to before tail of unacked list, keeping the list sorted */ + struct tcp_seg **cur_seg = &(pcb->unacked); + while (*cur_seg && + TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) { + cur_seg = &((*cur_seg)->next ); + } + seg->next = (*cur_seg); + (*cur_seg) = seg; + } else { + /* add segment to tail of unacked list */ + useg->next = seg; + useg = useg->next; + } + } + /* do not queue empty segments on the unacked list */ + } else { + tcp_seg_free(seg); + } + seg = pcb->unsent; + } +#if TCP_OVERSIZE + if (pcb->unsent == NULL) { + /* last unsent has been removed, reset unsent_oversize */ + pcb->unsent_oversize = 0; + } +#endif /* TCP_OVERSIZE */ + + pcb->flags &= ~TF_NAGLEMEMERR; + return ERR_OK; +} + +/** + * Called by tcp_output() to actually send a TCP segment over IP. + * + * @param seg the tcp_seg to send + * @param pcb the tcp_pcb for the TCP connection used to send the segment + */ +static void +tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb) +{ + u16_t len; + struct netif *netif; + u32_t *opts; + + /** @bug Exclude retransmitted segments from this count. */ + snmp_inc_tcpoutsegs(); + + /* The TCP header has already been constructed, but the ackno and + wnd fields remain. */ + seg->tcphdr->ackno = htonl(pcb->rcv_nxt); + + /* advertise our receive window size in this TCP segment */ + seg->tcphdr->wnd = htons(pcb->rcv_ann_wnd); + + pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd; + + /* Add any requested options. NB MSS option is only set on SYN + packets, so ignore it here */ + opts = (u32_t *)(void *)(seg->tcphdr + 1); + if (seg->flags & TF_SEG_OPTS_MSS) { + u16_t mss; +#if TCP_CALCULATE_EFF_SEND_MSS + mss = tcp_eff_send_mss(TCP_MSS, &pcb->remote_ip); +#else /* TCP_CALCULATE_EFF_SEND_MSS */ + mss = TCP_MSS; +#endif /* TCP_CALCULATE_EFF_SEND_MSS */ + *opts = TCP_BUILD_MSS_OPTION(mss); + opts += 1; + } +#if LWIP_TCP_TIMESTAMPS + pcb->ts_lastacksent = pcb->rcv_nxt; + + if (seg->flags & TF_SEG_OPTS_TS) { + tcp_build_timestamp_option(pcb, opts); + opts += 3; + } +#endif + + /* Set retransmission timer running if it is not currently enabled + This must be set before checking the route. */ + if (pcb->rtime == -1) { + pcb->rtime = 0; + } + + /* If we don't have a local IP address, we get one by + calling ip_route(). */ + if (ip_addr_isany(&(pcb->local_ip))) { + netif = ip_route(&(pcb->remote_ip)); + if (netif == NULL) { + return; + } + ip_addr_copy(pcb->local_ip, netif->ip_addr); + } + + if (pcb->rttest == 0) { + pcb->rttest = tcp_ticks; + pcb->rtseq = ntohl(seg->tcphdr->seqno); + + LWIP_DEBUGF(TCP_RTO_DEBUG, ("tcp_output_segment: rtseq %"U32_F"\n", pcb->rtseq)); + } + LWIP_DEBUGF(TCP_OUTPUT_DEBUG, ("tcp_output_segment: %"U32_F":%"U32_F"\n", + htonl(seg->tcphdr->seqno), htonl(seg->tcphdr->seqno) + + seg->len)); + + len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload); + + seg->p->len -= len; + seg->p->tot_len -= len; + + seg->p->payload = seg->tcphdr; + + seg->tcphdr->chksum = 0; +#if CHECKSUM_GEN_TCP +#if TCP_CHECKSUM_ON_COPY + { + u32_t acc; +#if TCP_CHECKSUM_ON_COPY_SANITY_CHECK + u16_t chksum_slow = inet_chksum_pseudo(seg->p, &(pcb->local_ip), + &(pcb->remote_ip), + IP_PROTO_TCP, seg->p->tot_len); +#endif /* TCP_CHECKSUM_ON_COPY_SANITY_CHECK */ + if ((seg->flags & TF_SEG_DATA_CHECKSUMMED) == 0) { + LWIP_ASSERT("data included but not checksummed", + seg->p->tot_len == (TCPH_HDRLEN(seg->tcphdr) * 4)); + } + + /* rebuild TCP header checksum (TCP header changes for retransmissions!) */ + acc = inet_chksum_pseudo_partial(seg->p, &(pcb->local_ip), + &(pcb->remote_ip), + IP_PROTO_TCP, seg->p->tot_len, TCPH_HDRLEN(seg->tcphdr) * 4); + /* add payload checksum */ + if (seg->chksum_swapped) { + seg->chksum = SWAP_BYTES_IN_WORD(seg->chksum); + seg->chksum_swapped = 0; + } + acc += (u16_t)~(seg->chksum); + seg->tcphdr->chksum = FOLD_U32T(acc); +#if TCP_CHECKSUM_ON_COPY_SANITY_CHECK + if (chksum_slow != seg->tcphdr->chksum) { + LWIP_DEBUGF(TCP_DEBUG | LWIP_DBG_LEVEL_WARNING, + ("tcp_output_segment: calculated checksum is %"X16_F" instead of %"X16_F"\n", + seg->tcphdr->chksum, chksum_slow)); + seg->tcphdr->chksum = chksum_slow; + } +#endif /* TCP_CHECKSUM_ON_COPY_SANITY_CHECK */ + } +#else /* TCP_CHECKSUM_ON_COPY */ + seg->tcphdr->chksum = inet_chksum_pseudo(seg->p, &(pcb->local_ip), + &(pcb->remote_ip), + IP_PROTO_TCP, seg->p->tot_len); +#endif /* TCP_CHECKSUM_ON_COPY */ +#endif /* CHECKSUM_GEN_TCP */ + TCP_STATS_INC(tcp.xmit); + +#if LWIP_NETIF_HWADDRHINT + ip_output_hinted(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, + IP_PROTO_TCP, &(pcb->addr_hint)); +#else /* LWIP_NETIF_HWADDRHINT*/ + ip_output(seg->p, &(pcb->local_ip), &(pcb->remote_ip), pcb->ttl, pcb->tos, + IP_PROTO_TCP); +#endif /* LWIP_NETIF_HWADDRHINT*/ +} + +/** + * Send a TCP RESET packet (empty segment with RST flag set) either to + * abort a connection or to show that there is no matching local connection + * for a received segment. + * + * Called by tcp_abort() (to abort a local connection), tcp_input() (if no + * matching local pcb was found), tcp_listen_input() (if incoming segment + * has ACK flag set) and tcp_process() (received segment in the wrong state) + * + * Since a RST segment is in most cases not sent for an active connection, + * tcp_rst() has a number of arguments that are taken from a tcp_pcb for + * most other segment output functions. + * + * @param seqno the sequence number to use for the outgoing segment + * @param ackno the acknowledge number to use for the outgoing segment + * @param local_ip the local IP address to send the segment from + * @param remote_ip the remote IP address to send the segment to + * @param local_port the local TCP port to send the segment from + * @param remote_port the remote TCP port to send the segment to + */ +void +tcp_rst(u32_t seqno, u32_t ackno, + ip_addr_t *local_ip, ip_addr_t *remote_ip, + u16_t local_port, u16_t remote_port) +{ + struct pbuf *p; + struct tcp_hdr *tcphdr; + p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM); + if (p == NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_rst: could not allocate memory for pbuf\n")); + return; + } + LWIP_ASSERT("check that first pbuf can hold struct tcp_hdr", + (p->len >= sizeof(struct tcp_hdr))); + + tcphdr = (struct tcp_hdr *)p->payload; + tcphdr->src = htons(local_port); + tcphdr->dest = htons(remote_port); + tcphdr->seqno = htonl(seqno); + tcphdr->ackno = htonl(ackno); + TCPH_HDRLEN_FLAGS_SET(tcphdr, TCP_HLEN/4, TCP_RST | TCP_ACK); + tcphdr->wnd = PP_HTONS(TCP_WND); + tcphdr->chksum = 0; + tcphdr->urgp = 0; + +#if CHECKSUM_GEN_TCP + tcphdr->chksum = inet_chksum_pseudo(p, local_ip, remote_ip, + IP_PROTO_TCP, p->tot_len); +#endif + TCP_STATS_INC(tcp.xmit); + snmp_inc_tcpoutrsts(); + /* Send output with hardcoded TTL since we have no access to the pcb */ + ip_output(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP); + pbuf_free(p); + LWIP_DEBUGF(TCP_RST_DEBUG, ("tcp_rst: seqno %"U32_F" ackno %"U32_F".\n", seqno, ackno)); +} + +/** + * Requeue all unacked segments for retransmission + * + * Called by tcp_slowtmr() for slow retransmission. + * + * @param pcb the tcp_pcb for which to re-enqueue all unacked segments + */ +void +tcp_rexmit_rto(struct tcp_pcb *pcb) +{ + struct tcp_seg *seg; + + if (pcb->unacked == NULL) { + return; + } + + /* Move all unacked segments to the head of the unsent queue */ + for (seg = pcb->unacked; seg->next != NULL; seg = seg->next); + /* concatenate unsent queue after unacked queue */ + seg->next = pcb->unsent; + /* unsent queue is the concatenated queue (of unacked, unsent) */ + pcb->unsent = pcb->unacked; + /* unacked queue is now empty */ + pcb->unacked = NULL; + /* last unsent hasn't changed, no need to reset unsent_oversize */ + + /* increment number of retransmissions */ + ++pcb->nrtx; + + /* Don't take any RTT measurements after retransmitting. */ + pcb->rttest = 0; + + /* Do the actual retransmission */ + tcp_output(pcb); +} + +/** + * Requeue the first unacked segment for retransmission + * + * Called by tcp_receive() for fast retramsmit. + * + * @param pcb the tcp_pcb for which to retransmit the first unacked segment + */ +void +tcp_rexmit(struct tcp_pcb *pcb) +{ + struct tcp_seg *seg; + struct tcp_seg **cur_seg; + + if (pcb->unacked == NULL) { + return; + } + + /* Move the first unacked segment to the unsent queue */ + /* Keep the unsent queue sorted. */ + seg = pcb->unacked; + pcb->unacked = seg->next; + + cur_seg = &(pcb->unsent); + while (*cur_seg && + TCP_SEQ_LT(ntohl((*cur_seg)->tcphdr->seqno), ntohl(seg->tcphdr->seqno))) { + cur_seg = &((*cur_seg)->next ); + } + seg->next = *cur_seg; + *cur_seg = seg; +#if TCP_OVERSIZE + if (seg->next == NULL) { + /* the retransmitted segment is last in unsent, so reset unsent_oversize */ + pcb->unsent_oversize = 0; + } +#endif /* TCP_OVERSIZE */ + + ++pcb->nrtx; + + /* Don't take any rtt measurements after retransmitting. */ + pcb->rttest = 0; + + /* Do the actual retransmission. */ + snmp_inc_tcpretranssegs(); + /* No need to call tcp_output: we are always called from tcp_input() + and thus tcp_output directly returns. */ +} + + +/** + * Handle retransmission after three dupacks received + * + * @param pcb the tcp_pcb for which to retransmit the first unacked segment + */ +void +tcp_rexmit_fast(struct tcp_pcb *pcb) +{ + if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) { + /* This is fast retransmit. Retransmit the first unacked segment. */ + LWIP_DEBUGF(TCP_FR_DEBUG, + ("tcp_receive: dupacks %"U16_F" (%"U32_F + "), fast retransmit %"U32_F"\n", + (u16_t)pcb->dupacks, pcb->lastack, + ntohl(pcb->unacked->tcphdr->seqno))); + tcp_rexmit(pcb); + + /* Set ssthresh to half of the minimum of the current + * cwnd and the advertised window */ + if (pcb->cwnd > pcb->snd_wnd) { + pcb->ssthresh = pcb->snd_wnd / 2; + } else { + pcb->ssthresh = pcb->cwnd / 2; + } + + /* The minimum value for ssthresh should be 2 MSS */ + if (pcb->ssthresh < 2*pcb->mss) { + LWIP_DEBUGF(TCP_FR_DEBUG, + ("tcp_receive: The minimum value for ssthresh %"U16_F + " should be min 2 mss %"U16_F"...\n", + pcb->ssthresh, 2*pcb->mss)); + pcb->ssthresh = 2*pcb->mss; + } + + pcb->cwnd = pcb->ssthresh + 3 * pcb->mss; + pcb->flags |= TF_INFR; + } +} + + +/** + * Send keepalive packets to keep a connection active although + * no data is sent over it. + * + * Called by tcp_slowtmr() + * + * @param pcb the tcp_pcb for which to send a keepalive packet + */ +void +tcp_keepalive(struct tcp_pcb *pcb) +{ + struct pbuf *p; + struct tcp_hdr *tcphdr; + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: sending KEEPALIVE probe to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(&pcb->remote_ip), ip4_addr2_16(&pcb->remote_ip), + ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip))); + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: tcp_ticks %"U32_F" pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n", + tcp_ticks, pcb->tmr, pcb->keep_cnt_sent)); + + p = tcp_output_alloc_header(pcb, 0, 0, htonl(pcb->snd_nxt - 1)); + if(p == NULL) { + LWIP_DEBUGF(TCP_DEBUG, + ("tcp_keepalive: could not allocate memory for pbuf\n")); + return; + } + tcphdr = (struct tcp_hdr *)p->payload; + +#if CHECKSUM_GEN_TCP + tcphdr->chksum = inet_chksum_pseudo(p, &pcb->local_ip, &pcb->remote_ip, + IP_PROTO_TCP, p->tot_len); +#endif + TCP_STATS_INC(tcp.xmit); + + /* Send output to IP */ +#if LWIP_NETIF_HWADDRHINT + ip_output_hinted(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP, + &(pcb->addr_hint)); +#else /* LWIP_NETIF_HWADDRHINT*/ + ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP); +#endif /* LWIP_NETIF_HWADDRHINT*/ + + pbuf_free(p); + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_keepalive: seqno %"U32_F" ackno %"U32_F".\n", + pcb->snd_nxt - 1, pcb->rcv_nxt)); +} + + +/** + * Send persist timer zero-window probes to keep a connection active + * when a window update is lost. + * + * Called by tcp_slowtmr() + * + * @param pcb the tcp_pcb for which to send a zero-window probe packet + */ +void +tcp_zero_window_probe(struct tcp_pcb *pcb) +{ + struct pbuf *p; + struct tcp_hdr *tcphdr; + struct tcp_seg *seg; + u16_t len; + u8_t is_fin; + + LWIP_DEBUGF(TCP_DEBUG, + ("tcp_zero_window_probe: sending ZERO WINDOW probe to %" + U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(&pcb->remote_ip), ip4_addr2_16(&pcb->remote_ip), + ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip))); + + LWIP_DEBUGF(TCP_DEBUG, + ("tcp_zero_window_probe: tcp_ticks %"U32_F + " pcb->tmr %"U32_F" pcb->keep_cnt_sent %"U16_F"\n", + tcp_ticks, pcb->tmr, pcb->keep_cnt_sent)); + + seg = pcb->unacked; + + if(seg == NULL) { + seg = pcb->unsent; + } + if(seg == NULL) { + return; + } + + is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0); + /* we want to send one seqno: either FIN or data (no options) */ + len = is_fin ? 0 : 1; + + p = tcp_output_alloc_header(pcb, 0, len, seg->tcphdr->seqno); + if(p == NULL) { + LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: no memory for pbuf\n")); + return; + } + tcphdr = (struct tcp_hdr *)p->payload; + + if (is_fin) { + /* FIN segment, no data */ + TCPH_FLAGS_SET(tcphdr, TCP_ACK | TCP_FIN); + } else { + /* Data segment, copy in one byte from the head of the unacked queue */ + char *d = ((char *)p->payload + TCP_HLEN); + /* Depending on whether the segment has already been sent (unacked) or not + (unsent), seg->p->payload points to the IP header or TCP header. + Ensure we copy the first TCP data byte: */ + pbuf_copy_partial(seg->p, d, 1, seg->p->tot_len - seg->len); + } + +#if CHECKSUM_GEN_TCP + tcphdr->chksum = inet_chksum_pseudo(p, &pcb->local_ip, &pcb->remote_ip, + IP_PROTO_TCP, p->tot_len); +#endif + TCP_STATS_INC(tcp.xmit); + + /* Send output to IP */ +#if LWIP_NETIF_HWADDRHINT + ip_output_hinted(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP, + &(pcb->addr_hint)); +#else /* LWIP_NETIF_HWADDRHINT*/ + ip_output(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP); +#endif /* LWIP_NETIF_HWADDRHINT*/ + + pbuf_free(p); + + LWIP_DEBUGF(TCP_DEBUG, ("tcp_zero_window_probe: seqno %"U32_F + " ackno %"U32_F".\n", + pcb->snd_nxt - 1, pcb->rcv_nxt)); +} +#endif /* LWIP_TCP */ diff --git a/third_party/lwip-1.4.1/src/core/timers.c b/third_party/lwip-1.4.1/src/core/timers.c new file mode 100644 index 0000000..5879b6a --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/timers.c @@ -0,0 +1,487 @@ +/** + * @file + * Stack-internal timers implementation. + * This file includes timer callbacks for stack-internal timers as well as + * functions to set up or stop timers and check for expired timers. + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * Simon Goldschmidt + * + */ + +#include "lwip/opt.h" + +#include "lwip/timers.h" +#include "lwip/tcp_impl.h" + +#if LWIP_TIMERS + +#include "lwip/def.h" +#include "lwip/memp.h" +#include "lwip/tcpip.h" + +#include "lwip/ip_frag.h" +#include "netif/etharp.h" +#include "lwip/dhcp.h" +#include "lwip/autoip.h" +#include "lwip/igmp.h" +#include "lwip/dns.h" +#include "lwip/sys.h" +#include "lwip/pbuf.h" + + +/** The one and only timeout list */ +static struct sys_timeo *next_timeout; +#if NO_SYS +static u32_t timeouts_last_time; +#endif /* NO_SYS */ + +#if LWIP_TCP +/** global variable that shows if the tcp timer is currently scheduled or not */ +static int tcpip_tcp_timer_active; + +/** + * Timer callback function that calls tcp_tmr() and reschedules itself. + * + * @param arg unused argument + */ +static void +tcpip_tcp_timer(void *arg) +{ + LWIP_UNUSED_ARG(arg); + + /* call TCP timer handler */ + tcp_tmr(); + /* timer still needed? */ + if (tcp_active_pcbs || tcp_tw_pcbs) { + /* restart timer */ + sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL); + } else { + /* disable timer */ + tcpip_tcp_timer_active = 0; + } +} + +/** + * Called from TCP_REG when registering a new PCB: + * the reason is to have the TCP timer only running when + * there are active (or time-wait) PCBs. + */ +void +tcp_timer_needed(void) +{ + /* timer is off but needed again? */ + if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) { + /* enable and start timer */ + tcpip_tcp_timer_active = 1; + sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL); + } +} +#endif /* LWIP_TCP */ + +#if IP_REASSEMBLY +/** + * Timer callback function that calls ip_reass_tmr() and reschedules itself. + * + * @param arg unused argument + */ +static void +ip_reass_timer(void *arg) +{ + LWIP_UNUSED_ARG(arg); + LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: ip_reass_tmr()\n")); + ip_reass_tmr(); + sys_timeout(IP_TMR_INTERVAL, ip_reass_timer, NULL); +} +#endif /* IP_REASSEMBLY */ + +#if LWIP_ARP +/** + * Timer callback function that calls etharp_tmr() and reschedules itself. + * + * @param arg unused argument + */ +static void +arp_timer(void *arg) +{ + LWIP_UNUSED_ARG(arg); + LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: etharp_tmr()\n")); + etharp_tmr(); + sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL); +} +#endif /* LWIP_ARP */ + +#if LWIP_DHCP +/** + * Timer callback function that calls dhcp_coarse_tmr() and reschedules itself. + * + * @param arg unused argument + */ +static void +dhcp_timer_coarse(void *arg) +{ + LWIP_UNUSED_ARG(arg); + LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_coarse_tmr()\n")); + dhcp_coarse_tmr(); + sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL); +} + +/** + * Timer callback function that calls dhcp_fine_tmr() and reschedules itself. + * + * @param arg unused argument + */ +static void +dhcp_timer_fine(void *arg) +{ + LWIP_UNUSED_ARG(arg); + LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dhcp_fine_tmr()\n")); + dhcp_fine_tmr(); + sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL); +} +#endif /* LWIP_DHCP */ + +#if LWIP_AUTOIP +/** + * Timer callback function that calls autoip_tmr() and reschedules itself. + * + * @param arg unused argument + */ +static void +autoip_timer(void *arg) +{ + LWIP_UNUSED_ARG(arg); + LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: autoip_tmr()\n")); + autoip_tmr(); + sys_timeout(AUTOIP_TMR_INTERVAL, autoip_timer, NULL); +} +#endif /* LWIP_AUTOIP */ + +#if LWIP_IGMP +/** + * Timer callback function that calls igmp_tmr() and reschedules itself. + * + * @param arg unused argument + */ +static void +igmp_timer(void *arg) +{ + LWIP_UNUSED_ARG(arg); + LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: igmp_tmr()\n")); + igmp_tmr(); + sys_timeout(IGMP_TMR_INTERVAL, igmp_timer, NULL); +} +#endif /* LWIP_IGMP */ + +#if LWIP_DNS +/** + * Timer callback function that calls dns_tmr() and reschedules itself. + * + * @param arg unused argument + */ +static void +dns_timer(void *arg) +{ + LWIP_UNUSED_ARG(arg); + LWIP_DEBUGF(TIMERS_DEBUG, ("tcpip: dns_tmr()\n")); + dns_tmr(); + sys_timeout(DNS_TMR_INTERVAL, dns_timer, NULL); +} +#endif /* LWIP_DNS */ + +/** Initialize this module */ +void sys_timeouts_init(void) +{ +#if IP_REASSEMBLY + sys_timeout(IP_TMR_INTERVAL, ip_reass_timer, NULL); +#endif /* IP_REASSEMBLY */ +#if LWIP_ARP + sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL); +#endif /* LWIP_ARP */ +#if LWIP_DHCP + sys_timeout(DHCP_COARSE_TIMER_MSECS, dhcp_timer_coarse, NULL); + sys_timeout(DHCP_FINE_TIMER_MSECS, dhcp_timer_fine, NULL); +#endif /* LWIP_DHCP */ +#if LWIP_AUTOIP + sys_timeout(AUTOIP_TMR_INTERVAL, autoip_timer, NULL); +#endif /* LWIP_AUTOIP */ +#if LWIP_IGMP + sys_timeout(IGMP_TMR_INTERVAL, igmp_timer, NULL); +#endif /* LWIP_IGMP */ +#if LWIP_DNS + sys_timeout(DNS_TMR_INTERVAL, dns_timer, NULL); +#endif /* LWIP_DNS */ + +#if NO_SYS + /* Initialise timestamp for sys_check_timeouts */ + timeouts_last_time = sys_now(); +#endif +} + +/** + * Create a one-shot timer (aka timeout). Timeouts are processed in the + * following cases: + * - while waiting for a message using sys_timeouts_mbox_fetch() + * - by calling sys_check_timeouts() (NO_SYS==1 only) + * + * @param msecs time in milliseconds after that the timer should expire + * @param handler callback function to call when msecs have elapsed + * @param arg argument to pass to the callback function + */ +#if LWIP_DEBUG_TIMERNAMES +void +sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name) +#else /* LWIP_DEBUG_TIMERNAMES */ +void +sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg) +#endif /* LWIP_DEBUG_TIMERNAMES */ +{ + struct sys_timeo *timeout, *t; + + timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT); + if (timeout == NULL) { + LWIP_ASSERT("sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty", timeout != NULL); + return; + } + timeout->next = NULL; + timeout->h = handler; + timeout->arg = arg; + timeout->time = msecs; +#if LWIP_DEBUG_TIMERNAMES + timeout->handler_name = handler_name; + LWIP_DEBUGF(TIMERS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" handler=%s arg=%p\n", + (void *)timeout, msecs, handler_name, (void *)arg)); +#endif /* LWIP_DEBUG_TIMERNAMES */ + + if (next_timeout == NULL) { + next_timeout = timeout; + return; + } + + if (next_timeout->time > msecs) { + next_timeout->time -= msecs; + timeout->next = next_timeout; + next_timeout = timeout; + } else { + for(t = next_timeout; t != NULL; t = t->next) { + timeout->time -= t->time; + if (t->next == NULL || t->next->time > timeout->time) { + if (t->next != NULL) { + t->next->time -= timeout->time; + } + timeout->next = t->next; + t->next = timeout; + break; + } + } + } +} + +/** + * Go through timeout list (for this task only) and remove the first matching + * entry, even though the timeout has not triggered yet. + * + * @note This function only works as expected if there is only one timeout + * calling 'handler' in the list of timeouts. + * + * @param handler callback function that would be called by the timeout + * @param arg callback argument that would be passed to handler +*/ +void +sys_untimeout(sys_timeout_handler handler, void *arg) +{ + struct sys_timeo *prev_t, *t; + + if (next_timeout == NULL) { + return; + } + + for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next) { + if ((t->h == handler) && (t->arg == arg)) { + /* We have a match */ + /* Unlink from previous in list */ + if (prev_t == NULL) { + next_timeout = t->next; + } else { + prev_t->next = t->next; + } + /* If not the last one, add time of this one back to next */ + if (t->next != NULL) { + t->next->time += t->time; + } + memp_free(MEMP_SYS_TIMEOUT, t); + return; + } + } + return; +} + +#if NO_SYS + +/** Handle timeouts for NO_SYS==1 (i.e. without using + * tcpip_thread/sys_timeouts_mbox_fetch(). Uses sys_now() to call timeout + * handler functions when timeouts expire. + * + * Must be called periodically from your main loop. + */ +void +sys_check_timeouts(void) +{ + if (next_timeout) { + struct sys_timeo *tmptimeout; + u32_t diff; + sys_timeout_handler handler; + void *arg; + u8_t had_one; + u32_t now; + + now = sys_now(); + /* this cares for wraparounds */ + diff = now - timeouts_last_time; + do + { +#if PBUF_POOL_FREE_OOSEQ + PBUF_CHECK_FREE_OOSEQ(); +#endif /* PBUF_POOL_FREE_OOSEQ */ + had_one = 0; + tmptimeout = next_timeout; + if (tmptimeout && (tmptimeout->time <= diff)) { + /* timeout has expired */ + had_one = 1; + timeouts_last_time = now; + diff -= tmptimeout->time; + next_timeout = tmptimeout->next; + handler = tmptimeout->h; + arg = tmptimeout->arg; +#if LWIP_DEBUG_TIMERNAMES + if (handler != NULL) { + LWIP_DEBUGF(TIMERS_DEBUG, ("sct calling h=%s arg=%p\n", + tmptimeout->handler_name, arg)); + } +#endif /* LWIP_DEBUG_TIMERNAMES */ + memp_free(MEMP_SYS_TIMEOUT, tmptimeout); + if (handler != NULL) { + handler(arg); + } + } + /* repeat until all expired timers have been called */ + }while(had_one); + } +} + +/** Set back the timestamp of the last call to sys_check_timeouts() + * This is necessary if sys_check_timeouts() hasn't been called for a long + * time (e.g. while saving energy) to prevent all timer functions of that + * period being called. + */ +void +sys_restart_timeouts(void) +{ + timeouts_last_time = sys_now(); +} + +#else /* NO_SYS */ + +/** + * Wait (forever) for a message to arrive in an mbox. + * While waiting, timeouts are processed. + * + * @param mbox the mbox to fetch the message from + * @param msg the place to store the message + */ +void +sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg) +{ + u32_t time_needed; + struct sys_timeo *tmptimeout; + sys_timeout_handler handler; + void *arg; + + again: + if (!next_timeout) { + time_needed = sys_arch_mbox_fetch(mbox, msg, 0); + } else { + if (next_timeout->time > 0) { + time_needed = sys_arch_mbox_fetch(mbox, msg, next_timeout->time); + } else { + time_needed = SYS_ARCH_TIMEOUT; + } + + if (time_needed == SYS_ARCH_TIMEOUT) { + /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message + could be fetched. We should now call the timeout handler and + deallocate the memory allocated for the timeout. */ + tmptimeout = next_timeout; + next_timeout = tmptimeout->next; + handler = tmptimeout->h; + arg = tmptimeout->arg; +#if LWIP_DEBUG_TIMERNAMES + if (handler != NULL) { + LWIP_DEBUGF(TIMERS_DEBUG, ("stmf calling h=%s arg=%p\n", + tmptimeout->handler_name, arg)); + } +#endif /* LWIP_DEBUG_TIMERNAMES */ + memp_free(MEMP_SYS_TIMEOUT, tmptimeout); + if (handler != NULL) { + /* For LWIP_TCPIP_CORE_LOCKING, lock the core before calling the + timeout handler function. */ + LOCK_TCPIP_CORE(); + handler(arg); + UNLOCK_TCPIP_CORE(); + } + LWIP_TCPIP_THREAD_ALIVE(); + + /* We try again to fetch a message from the mbox. */ + goto again; + } else { + /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout + occured. The time variable is set to the number of + milliseconds we waited for the message. */ + if (time_needed < next_timeout->time) { + next_timeout->time -= time_needed; + } else { + next_timeout->time = 0; + } + } + } +} + +#endif /* NO_SYS */ + +#else /* LWIP_TIMERS */ +/* Satisfy the TCP code which calls this function */ +void +tcp_timer_needed(void) +{ +} +#endif /* LWIP_TIMERS */ diff --git a/third_party/lwip-1.4.1/src/core/udp.c b/third_party/lwip-1.4.1/src/core/udp.c new file mode 100644 index 0000000..f05aba3 --- /dev/null +++ b/third_party/lwip-1.4.1/src/core/udp.c @@ -0,0 +1,1013 @@ +/** + * @file + * User Datagram Protocol module + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + + +/* udp.c + * + * The code for the User Datagram Protocol UDP & UDPLite (RFC 3828). + * + */ + +/* @todo Check the use of '(struct udp_pcb).chksum_len_rx'! + */ + +#include "lwip/opt.h" + +#if LWIP_UDP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/udp.h" +#include "lwip/def.h" +#include "lwip/memp.h" +#include "lwip/inet_chksum.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/icmp.h" +#include "lwip/stats.h" +#include "lwip/snmp.h" +#include "arch/perf.h" +#include "lwip/dhcp.h" + +#include + +#ifndef UDP_LOCAL_PORT_RANGE_START +/* From http://www.iana.org/assignments/port-numbers: + "The Dynamic and/or Private Ports are those from 49152 through 65535" */ +#define UDP_LOCAL_PORT_RANGE_START 0xc000 +#define UDP_LOCAL_PORT_RANGE_END 0xffff +#define UDP_ENSURE_LOCAL_PORT_RANGE(port) (((port) & ~UDP_LOCAL_PORT_RANGE_START) + UDP_LOCAL_PORT_RANGE_START) +#endif + +/* last local UDP port */ +static u16_t udp_port = UDP_LOCAL_PORT_RANGE_START; + +/* The list of UDP PCBs */ +/* exported in udp.h (was static) */ +struct udp_pcb *udp_pcbs; + +/** + * Initialize this module. + */ +void +udp_init(void) +{ +#if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) + udp_port = UDP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND()); +#endif /* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) */ +} + +/** + * Allocate a new local UDP port. + * + * @return a new (free) local UDP port number + */ +static u16_t +udp_new_port(void) +{ + u16_t n = 0; + struct udp_pcb *pcb; + +again: + if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) { + udp_port = UDP_LOCAL_PORT_RANGE_START; + } + /* Check all PCBs. */ + for(pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { + if (pcb->local_port == udp_port) { + if (++n > (UDP_LOCAL_PORT_RANGE_END - UDP_LOCAL_PORT_RANGE_START)) { + return 0; + } + goto again; + } + } + return udp_port; +#if 0 + struct udp_pcb *ipcb = udp_pcbs; + while ((ipcb != NULL) && (udp_port != UDP_LOCAL_PORT_RANGE_END)) { + if (ipcb->local_port == udp_port) { + /* port is already used by another udp_pcb */ + udp_port++; + /* restart scanning all udp pcbs */ + ipcb = udp_pcbs; + } else { + /* go on with next udp pcb */ + ipcb = ipcb->next; + } + } + if (ipcb != NULL) { + return 0; + } + return udp_port; +#endif +} + +/** + * Process an incoming UDP datagram. + * + * Given an incoming UDP datagram (as a chain of pbufs) this function + * finds a corresponding UDP PCB and hands over the pbuf to the pcbs + * recv function. If no pcb is found or the datagram is incorrect, the + * pbuf is freed. + * + * @param p pbuf to be demultiplexed to a UDP PCB. + * @param inp network interface on which the datagram was received. + * + */ +void +udp_input(struct pbuf *p, struct netif *inp) +{ + struct udp_hdr *udphdr; + struct udp_pcb *pcb, *prev; + struct udp_pcb *uncon_pcb; + struct ip_hdr *iphdr; + u16_t src, dest; + u8_t local_match; + u8_t broadcast; + + PERF_START; + + UDP_STATS_INC(udp.recv); + + iphdr = (struct ip_hdr *)p->payload; + + /* Check minimum length (IP header + UDP header) + * and move payload pointer to UDP header */ + if (p->tot_len < (IPH_HL(iphdr) * 4 + UDP_HLEN) || pbuf_header(p, -(s16_t)(IPH_HL(iphdr) * 4))) { + /* drop short packets */ + LWIP_DEBUGF(UDP_DEBUG, + ("udp_input: short UDP datagram (%"U16_F" bytes) discarded\n", p->tot_len)); + UDP_STATS_INC(udp.lenerr); + UDP_STATS_INC(udp.drop); + snmp_inc_udpinerrors(); + pbuf_free(p); + goto end; + } + + udphdr = (struct udp_hdr *)p->payload; + + /* is broadcast packet ? */ + broadcast = ip_addr_isbroadcast(¤t_iphdr_dest, inp); + + LWIP_DEBUGF(UDP_DEBUG, ("udp_input: received datagram of length %"U16_F"\n", p->tot_len)); + + /* convert src and dest ports to host byte order */ + src = ntohs(udphdr->src); + dest = ntohs(udphdr->dest); + + udp_debug_print(udphdr); + + /* print the UDP source and destination */ + LWIP_DEBUGF(UDP_DEBUG, + ("udp (%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F") <-- " + "(%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F")\n", + ip4_addr1_16(&iphdr->dest), ip4_addr2_16(&iphdr->dest), + ip4_addr3_16(&iphdr->dest), ip4_addr4_16(&iphdr->dest), ntohs(udphdr->dest), + ip4_addr1_16(&iphdr->src), ip4_addr2_16(&iphdr->src), + ip4_addr3_16(&iphdr->src), ip4_addr4_16(&iphdr->src), ntohs(udphdr->src))); + +#if LWIP_DHCP + pcb = NULL; + /* when LWIP_DHCP is active, packets to DHCP_CLIENT_PORT may only be processed by + the dhcp module, no other UDP pcb may use the local UDP port DHCP_CLIENT_PORT */ + if (dest == DHCP_CLIENT_PORT) { + /* all packets for DHCP_CLIENT_PORT not coming from DHCP_SERVER_PORT are dropped! */ + if (src == DHCP_SERVER_PORT) { + if ((inp->dhcp != NULL) && (inp->dhcp->pcb != NULL)) { + /* accept the packe if + (- broadcast or directed to us) -> DHCP is link-layer-addressed, local ip is always ANY! + - inp->dhcp->pcb->remote == ANY or iphdr->src */ + if ((ip_addr_isany(&inp->dhcp->pcb->remote_ip) || + ip_addr_cmp(&(inp->dhcp->pcb->remote_ip), ¤t_iphdr_src))) { + pcb = inp->dhcp->pcb; + } + } + } + } else +#endif /* LWIP_DHCP */ + { + prev = NULL; + local_match = 0; + uncon_pcb = NULL; + /* Iterate through the UDP pcb list for a matching pcb. + * 'Perfect match' pcbs (connected to the remote port & ip address) are + * preferred. If no perfect match is found, the first unconnected pcb that + * matches the local port and ip address gets the datagram. */ + for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) { + local_match = 0; + /* print the PCB local and remote address */ + LWIP_DEBUGF(UDP_DEBUG, + ("pcb (%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F") --- " + "(%"U16_F".%"U16_F".%"U16_F".%"U16_F", %"U16_F")\n", + ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip), + ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip), pcb->local_port, + ip4_addr1_16(&pcb->remote_ip), ip4_addr2_16(&pcb->remote_ip), + ip4_addr3_16(&pcb->remote_ip), ip4_addr4_16(&pcb->remote_ip), pcb->remote_port)); + + /* compare PCB local addr+port to UDP destination addr+port */ + if (pcb->local_port == dest) { + if ( + (!broadcast && ip_addr_isany(&pcb->local_ip)) || + ip_addr_cmp(&(pcb->local_ip), ¤t_iphdr_dest) || +#if LWIP_IGMP + ip_addr_ismulticast(¤t_iphdr_dest) || +#endif /* LWIP_IGMP */ +#if IP_SOF_BROADCAST_RECV + (broadcast && ip_get_option(pcb, SOF_BROADCAST) && + (ip_addr_isany(&pcb->local_ip) || + ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) { +#else /* IP_SOF_BROADCAST_RECV */ + (broadcast && + (ip_addr_isany(&pcb->local_ip) || + ip_addr_netcmp(&pcb->local_ip, ip_current_dest_addr(), &inp->netmask)))) { +#endif /* IP_SOF_BROADCAST_RECV */ + local_match = 1; + if ((uncon_pcb == NULL) && + ((pcb->flags & UDP_FLAGS_CONNECTED) == 0)) { + /* the first unconnected matching PCB */ + uncon_pcb = pcb; + } + } + } + /* compare PCB remote addr+port to UDP source addr+port */ + if ((local_match != 0) && + (pcb->remote_port == src) && + (ip_addr_isany(&pcb->remote_ip) || + ip_addr_cmp(&(pcb->remote_ip), ¤t_iphdr_src))) { + /* the first fully matching PCB */ + if (prev != NULL) { + /* move the pcb to the front of udp_pcbs so that is + found faster next time */ + prev->next = pcb->next; + pcb->next = udp_pcbs; + udp_pcbs = pcb; + } else { + UDP_STATS_INC(udp.cachehit); + } + break; + } + prev = pcb; + } + /* no fully matching pcb found? then look for an unconnected pcb */ + if (pcb == NULL) { + pcb = uncon_pcb; + } + } + + /* Check checksum if this is a match or if it was directed at us. */ + if (pcb != NULL || ip_addr_cmp(&inp->ip_addr, ¤t_iphdr_dest)) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: calculating checksum\n")); +#if LWIP_UDPLITE + if (IPH_PROTO(iphdr) == IP_PROTO_UDPLITE) { + /* Do the UDP Lite checksum */ +#if CHECKSUM_CHECK_UDP + u16_t chklen = ntohs(udphdr->len); + if (chklen < sizeof(struct udp_hdr)) { + if (chklen == 0) { + /* For UDP-Lite, checksum length of 0 means checksum + over the complete packet (See RFC 3828 chap. 3.1) */ + chklen = p->tot_len; + } else { + /* At least the UDP-Lite header must be covered by the + checksum! (Again, see RFC 3828 chap. 3.1) */ + UDP_STATS_INC(udp.chkerr); + UDP_STATS_INC(udp.drop); + snmp_inc_udpinerrors(); + pbuf_free(p); + goto end; + } + } + if (inet_chksum_pseudo_partial(p, ¤t_iphdr_src, ¤t_iphdr_dest, + IP_PROTO_UDPLITE, p->tot_len, chklen) != 0) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("udp_input: UDP Lite datagram discarded due to failing checksum\n")); + UDP_STATS_INC(udp.chkerr); + UDP_STATS_INC(udp.drop); + snmp_inc_udpinerrors(); + pbuf_free(p); + goto end; + } +#endif /* CHECKSUM_CHECK_UDP */ + } else +#endif /* LWIP_UDPLITE */ + { +#if CHECKSUM_CHECK_UDP + if (udphdr->chksum != 0) { + if (inet_chksum_pseudo(p, ip_current_src_addr(), ip_current_dest_addr(), + IP_PROTO_UDP, p->tot_len) != 0) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("udp_input: UDP datagram discarded due to failing checksum\n")); + UDP_STATS_INC(udp.chkerr); + UDP_STATS_INC(udp.drop); + snmp_inc_udpinerrors(); + pbuf_free(p); + goto end; + } + } +#endif /* CHECKSUM_CHECK_UDP */ + } + if(pbuf_header(p, -UDP_HLEN)) { + /* Can we cope with this failing? Just assert for now */ + LWIP_ASSERT("pbuf_header failed\n", 0); + UDP_STATS_INC(udp.drop); + snmp_inc_udpinerrors(); + pbuf_free(p); + goto end; + } + if (pcb != NULL) { + snmp_inc_udpindatagrams(); +#if SO_REUSE && SO_REUSE_RXTOALL + if ((broadcast || ip_addr_ismulticast(¤t_iphdr_dest)) && + ip_get_option(pcb, SOF_REUSEADDR)) { + /* pass broadcast- or multicast packets to all multicast pcbs + if SOF_REUSEADDR is set on the first match */ + struct udp_pcb *mpcb; + u8_t p_header_changed = 0; + for (mpcb = udp_pcbs; mpcb != NULL; mpcb = mpcb->next) { + if (mpcb != pcb) { + /* compare PCB local addr+port to UDP destination addr+port */ + if ((mpcb->local_port == dest) && + ((!broadcast && ip_addr_isany(&mpcb->local_ip)) || + ip_addr_cmp(&(mpcb->local_ip), ¤t_iphdr_dest) || +#if LWIP_IGMP + ip_addr_ismulticast(¤t_iphdr_dest) || +#endif /* LWIP_IGMP */ +#if IP_SOF_BROADCAST_RECV + (broadcast && ip_get_option(mpcb, SOF_BROADCAST)))) { +#else /* IP_SOF_BROADCAST_RECV */ + (broadcast))) { +#endif /* IP_SOF_BROADCAST_RECV */ + /* pass a copy of the packet to all local matches */ + if (mpcb->recv != NULL) { + struct pbuf *q; + /* for that, move payload to IP header again */ + if (p_header_changed == 0) { + pbuf_header(p, (s16_t)((IPH_HL(iphdr) * 4) + UDP_HLEN)); + p_header_changed = 1; + } + q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM); + if (q != NULL) { + err_t err = pbuf_copy(q, p); + if (err == ERR_OK) { + /* move payload to UDP data */ + pbuf_header(q, -(s16_t)((IPH_HL(iphdr) * 4) + UDP_HLEN)); + mpcb->recv(mpcb->recv_arg, mpcb, q, ip_current_src_addr(), src); + } + } + } + } + } + } + if (p_header_changed) { + /* and move payload to UDP data again */ + pbuf_header(p, -(s16_t)((IPH_HL(iphdr) * 4) + UDP_HLEN)); + } + } +#endif /* SO_REUSE && SO_REUSE_RXTOALL */ + /* callback */ + if (pcb->recv != NULL) { + /* now the recv function is responsible for freeing p */ + pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src); + } else { + /* no recv function registered? then we have to free the pbuf! */ + pbuf_free(p); + goto end; + } + } else { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_input: not for us.\n")); + +#if LWIP_ICMP + /* No match was found, send ICMP destination port unreachable unless + destination address was broadcast/multicast. */ + if (!broadcast && + !ip_addr_ismulticast(¤t_iphdr_dest)) { + /* move payload pointer back to ip header */ + pbuf_header(p, (IPH_HL(iphdr) * 4) + UDP_HLEN); + LWIP_ASSERT("p->payload == iphdr", (p->payload == iphdr)); + icmp_dest_unreach(p, ICMP_DUR_PORT); + } +#endif /* LWIP_ICMP */ + UDP_STATS_INC(udp.proterr); + UDP_STATS_INC(udp.drop); + snmp_inc_udpnoports(); + pbuf_free(p); + } + } else { + pbuf_free(p); + } +end: + PERF_STOP("udp_input"); +} + +/** + * Send data using UDP. + * + * @param pcb UDP PCB used to send the data. + * @param p chain of pbuf's to be sent. + * + * The datagram will be sent to the current remote_ip & remote_port + * stored in pcb. If the pcb is not bound to a port, it will + * automatically be bound to a random port. + * + * @return lwIP error code. + * - ERR_OK. Successful. No error occured. + * - ERR_MEM. Out of memory. + * - ERR_RTE. Could not find route to destination address. + * - More errors could be returned by lower protocol layers. + * + * @see udp_disconnect() udp_sendto() + */ +err_t +udp_send(struct udp_pcb *pcb, struct pbuf *p) +{ + /* send to the packet using remote ip and port stored in the pcb */ + return udp_sendto(pcb, p, &pcb->remote_ip, pcb->remote_port); +} + +#if LWIP_CHECKSUM_ON_COPY +/** Same as udp_send() but with checksum + */ +err_t +udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p, + u8_t have_chksum, u16_t chksum) +{ + /* send to the packet using remote ip and port stored in the pcb */ + return udp_sendto_chksum(pcb, p, &pcb->remote_ip, pcb->remote_port, + have_chksum, chksum); +} +#endif /* LWIP_CHECKSUM_ON_COPY */ + +/** + * Send data to a specified address using UDP. + * + * @param pcb UDP PCB used to send the data. + * @param p chain of pbuf's to be sent. + * @param dst_ip Destination IP address. + * @param dst_port Destination UDP port. + * + * dst_ip & dst_port are expected to be in the same byte order as in the pcb. + * + * If the PCB already has a remote address association, it will + * be restored after the data is sent. + * + * @return lwIP error code (@see udp_send for possible error codes) + * + * @see udp_disconnect() udp_send() + */ +err_t +udp_sendto(struct udp_pcb *pcb, struct pbuf *p, + ip_addr_t *dst_ip, u16_t dst_port) +{ +#if LWIP_CHECKSUM_ON_COPY + return udp_sendto_chksum(pcb, p, dst_ip, dst_port, 0, 0); +} + +/** Same as udp_sendto(), but with checksum */ +err_t +udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *dst_ip, + u16_t dst_port, u8_t have_chksum, u16_t chksum) +{ +#endif /* LWIP_CHECKSUM_ON_COPY */ + struct netif *netif; + + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send\n")); + + /* find the outgoing network interface for this packet */ +#if LWIP_IGMP + netif = ip_route((ip_addr_ismulticast(dst_ip))?(&(pcb->multicast_ip)):(dst_ip)); +#else + netif = ip_route(dst_ip); +#endif /* LWIP_IGMP */ + + /* no outgoing network interface could be found? */ + if (netif == NULL) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: No route to %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(dst_ip), ip4_addr2_16(dst_ip), ip4_addr3_16(dst_ip), ip4_addr4_16(dst_ip))); + UDP_STATS_INC(udp.rterr); + return ERR_RTE; + } +#if LWIP_CHECKSUM_ON_COPY + return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum); +#else /* LWIP_CHECKSUM_ON_COPY */ + return udp_sendto_if(pcb, p, dst_ip, dst_port, netif); +#endif /* LWIP_CHECKSUM_ON_COPY */ +} + +/** + * Send data to a specified address using UDP. + * The netif used for sending can be specified. + * + * This function exists mainly for DHCP, to be able to send UDP packets + * on a netif that is still down. + * + * @param pcb UDP PCB used to send the data. + * @param p chain of pbuf's to be sent. + * @param dst_ip Destination IP address. + * @param dst_port Destination UDP port. + * @param netif the netif used for sending. + * + * dst_ip & dst_port are expected to be in the same byte order as in the pcb. + * + * @return lwIP error code (@see udp_send for possible error codes) + * + * @see udp_disconnect() udp_send() + */ +err_t +udp_sendto_if(struct udp_pcb *pcb, struct pbuf *p, + ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif) +{ +#if LWIP_CHECKSUM_ON_COPY + return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, 0, 0); +} + +/** Same as udp_sendto_if(), but with checksum */ +err_t +udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p, ip_addr_t *dst_ip, + u16_t dst_port, struct netif *netif, u8_t have_chksum, + u16_t chksum) +{ +#endif /* LWIP_CHECKSUM_ON_COPY */ + struct udp_hdr *udphdr; + ip_addr_t *src_ip; + err_t err; + struct pbuf *q; /* q will be sent down the stack */ + +#if IP_SOF_BROADCAST + /* broadcast filter? */ + if (!ip_get_option(pcb, SOF_BROADCAST) && ip_addr_isbroadcast(dst_ip, netif)) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, + ("udp_sendto_if: SOF_BROADCAST not enabled on pcb %p\n", (void *)pcb)); + return ERR_VAL; + } +#endif /* IP_SOF_BROADCAST */ + + /* if the PCB is not yet bound to a port, bind it here */ + if (pcb->local_port == 0) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_send: not yet bound to a port, binding now\n")); + err = udp_bind(pcb, &pcb->local_ip, pcb->local_port); + if (err != ERR_OK) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: forced port bind failed\n")); + return err; + } + } + + /* not enough space to add an UDP header to first pbuf in given p chain? */ + if (pbuf_header(p, UDP_HLEN)) { + /* allocate header in a separate new pbuf */ + q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM); + /* new header pbuf could not be allocated? */ + if (q == NULL) { + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, ("udp_send: could not allocate header\n")); + return ERR_MEM; + } + if (p->tot_len != 0) { + /* chain header q in front of given pbuf p (only if p contains data) */ + pbuf_chain(q, p); + } + /* first pbuf q points to header pbuf */ + LWIP_DEBUGF(UDP_DEBUG, + ("udp_send: added header pbuf %p before given pbuf %p\n", (void *)q, (void *)p)); + } else { + /* adding space for header within p succeeded */ + /* first pbuf q equals given pbuf */ + q = p; + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: added header in given pbuf %p\n", (void *)p)); + } + LWIP_ASSERT("check that first pbuf can hold struct udp_hdr", + (q->len >= sizeof(struct udp_hdr))); + /* q now represents the packet to be sent */ + udphdr = (struct udp_hdr *)q->payload; + udphdr->src = htons(pcb->local_port); + udphdr->dest = htons(dst_port); + /* in UDP, 0 checksum means 'no checksum' */ + udphdr->chksum = 0x0000; + + /* Multicast Loop? */ +#if LWIP_IGMP + if (ip_addr_ismulticast(dst_ip) && ((pcb->flags & UDP_FLAGS_MULTICAST_LOOP) != 0)) { + q->flags |= PBUF_FLAG_MCASTLOOP; + } +#endif /* LWIP_IGMP */ + + + /* PCB local address is IP_ANY_ADDR? */ + if (ip_addr_isany(&pcb->local_ip)) { + /* use outgoing network interface IP address as source address */ + src_ip = &(netif->ip_addr); + } else { + /* check if UDP PCB local IP address is correct + * this could be an old address if netif->ip_addr has changed */ + if (!ip_addr_cmp(&(pcb->local_ip), &(netif->ip_addr))) { + /* local_ip doesn't match, drop the packet */ + if (q != p) { + /* free the header pbuf */ + pbuf_free(q); + q = NULL; + /* p is still referenced by the caller, and will live on */ + } + return ERR_VAL; + } + /* use UDP PCB local IP address as source address */ + src_ip = &(pcb->local_ip); + } + + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: sending datagram of length %"U16_F"\n", q->tot_len)); + +#if LWIP_UDPLITE + /* UDP Lite protocol? */ + if (pcb->flags & UDP_FLAGS_UDPLITE) { + u16_t chklen, chklen_hdr; + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP LITE packet length %"U16_F"\n", q->tot_len)); + /* set UDP message length in UDP header */ + chklen_hdr = chklen = pcb->chksum_len_tx; + if ((chklen < sizeof(struct udp_hdr)) || (chklen > q->tot_len)) { + if (chklen != 0) { + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP LITE pcb->chksum_len is illegal: %"U16_F"\n", chklen)); + } + /* For UDP-Lite, checksum length of 0 means checksum + over the complete packet. (See RFC 3828 chap. 3.1) + At least the UDP-Lite header must be covered by the + checksum, therefore, if chksum_len has an illegal + value, we generate the checksum over the complete + packet to be safe. */ + chklen_hdr = 0; + chklen = q->tot_len; + } + udphdr->len = htons(chklen_hdr); + /* calculate checksum */ +#if CHECKSUM_GEN_UDP + udphdr->chksum = inet_chksum_pseudo_partial(q, src_ip, dst_ip, + IP_PROTO_UDPLITE, q->tot_len, +#if !LWIP_CHECKSUM_ON_COPY + chklen); +#else /* !LWIP_CHECKSUM_ON_COPY */ + (have_chksum ? UDP_HLEN : chklen)); + if (have_chksum) { + u32_t acc; + acc = udphdr->chksum + (u16_t)~(chksum); + udphdr->chksum = FOLD_U32T(acc); + } +#endif /* !LWIP_CHECKSUM_ON_COPY */ + + /* chksum zero must become 0xffff, as zero means 'no checksum' */ + if (udphdr->chksum == 0x0000) { + udphdr->chksum = 0xffff; + } +#endif /* CHECKSUM_GEN_UDP */ + /* output to IP */ + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDPLITE,)\n")); + NETIF_SET_HWADDRHINT(netif, &pcb->addr_hint); + err = ip_output_if(q, src_ip, dst_ip, pcb->ttl, pcb->tos, IP_PROTO_UDPLITE, netif); + NETIF_SET_HWADDRHINT(netif, NULL); + } else +#endif /* LWIP_UDPLITE */ + { /* UDP */ + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP packet length %"U16_F"\n", q->tot_len)); + udphdr->len = htons(q->tot_len); + /* calculate checksum */ +#if CHECKSUM_GEN_UDP + if ((pcb->flags & UDP_FLAGS_NOCHKSUM) == 0) { + u16_t udpchksum; +#if LWIP_CHECKSUM_ON_COPY + if (have_chksum) { + u32_t acc; + udpchksum = inet_chksum_pseudo_partial(q, src_ip, dst_ip, IP_PROTO_UDP, + q->tot_len, UDP_HLEN); + acc = udpchksum + (u16_t)~(chksum); + udpchksum = FOLD_U32T(acc); + } else +#endif /* LWIP_CHECKSUM_ON_COPY */ + { + udpchksum = inet_chksum_pseudo(q, src_ip, dst_ip, IP_PROTO_UDP, q->tot_len); + } + + /* chksum zero must become 0xffff, as zero means 'no checksum' */ + if (udpchksum == 0x0000) { + udpchksum = 0xffff; + } + udphdr->chksum = udpchksum; + } +#endif /* CHECKSUM_GEN_UDP */ + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: UDP checksum 0x%04"X16_F"\n", udphdr->chksum)); + LWIP_DEBUGF(UDP_DEBUG, ("udp_send: ip_output_if (,,,,IP_PROTO_UDP,)\n")); + /* output to IP */ + NETIF_SET_HWADDRHINT(netif, &pcb->addr_hint); + err = ip_output_if(q, src_ip, dst_ip, pcb->ttl, pcb->tos, IP_PROTO_UDP, netif); + NETIF_SET_HWADDRHINT(netif, NULL); + } + /* TODO: must this be increased even if error occured? */ + snmp_inc_udpoutdatagrams(); + + /* did we chain a separate header pbuf earlier? */ + if (q != p) { + /* free the header pbuf */ + pbuf_free(q); + q = NULL; + /* p is still referenced by the caller, and will live on */ + } + + UDP_STATS_INC(udp.xmit); + return err; +} + +/** + * Bind an UDP PCB. + * + * @param pcb UDP PCB to be bound with a local address ipaddr and port. + * @param ipaddr local IP address to bind with. Use IP_ADDR_ANY to + * bind to all local interfaces. + * @param port local UDP port to bind with. Use 0 to automatically bind + * to a random port between UDP_LOCAL_PORT_RANGE_START and + * UDP_LOCAL_PORT_RANGE_END. + * + * ipaddr & port are expected to be in the same byte order as in the pcb. + * + * @return lwIP error code. + * - ERR_OK. Successful. No error occured. + * - ERR_USE. The specified ipaddr and port are already bound to by + * another UDP PCB. + * + * @see udp_disconnect() + */ +err_t +udp_bind(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port) +{ + struct udp_pcb *ipcb; + u8_t rebind; + + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, ("udp_bind(ipaddr = ")); + ip_addr_debug_print(UDP_DEBUG, ipaddr); + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (", port = %"U16_F")\n", port)); + + rebind = 0; + /* Check for double bind and rebind of the same pcb */ + for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { + /* is this UDP PCB already on active list? */ + if (pcb == ipcb) { + /* pcb may occur at most once in active list */ + LWIP_ASSERT("rebind == 0", rebind == 0); + /* pcb already in list, just rebind */ + rebind = 1; + } + + /* By default, we don't allow to bind to a port that any other udp + PCB is alread bound to, unless *all* PCBs with that port have tha + REUSEADDR flag set. */ +#if SO_REUSE + else if (!ip_get_option(pcb, SOF_REUSEADDR) && + !ip_get_option(ipcb, SOF_REUSEADDR)) { +#else /* SO_REUSE */ + /* port matches that of PCB in list and REUSEADDR not set -> reject */ + else { +#endif /* SO_REUSE */ + if ((ipcb->local_port == port) && + /* IP address matches, or one is IP_ADDR_ANY? */ + (ip_addr_isany(&(ipcb->local_ip)) || + ip_addr_isany(ipaddr) || + ip_addr_cmp(&(ipcb->local_ip), ipaddr))) { + /* other PCB already binds to this local IP and port */ + LWIP_DEBUGF(UDP_DEBUG, + ("udp_bind: local port %"U16_F" already bound by another pcb\n", port)); + return ERR_USE; + } + } + } + + ip_addr_set(&pcb->local_ip, ipaddr); + + /* no port specified? */ + if (port == 0) { + port = udp_new_port(); + if (port == 0) { + /* no more ports available in local range */ + LWIP_DEBUGF(UDP_DEBUG, ("udp_bind: out of free UDP ports\n")); + return ERR_USE; + } + } + pcb->local_port = port; + snmp_insert_udpidx_tree(pcb); + /* pcb not active yet? */ + if (rebind == 0) { + /* place the PCB on the active list if not already there */ + pcb->next = udp_pcbs; + udp_pcbs = pcb; + } + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("udp_bind: bound to %"U16_F".%"U16_F".%"U16_F".%"U16_F", port %"U16_F"\n", + ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip), + ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip), + pcb->local_port)); + return ERR_OK; +} +/** + * Connect an UDP PCB. + * + * This will associate the UDP PCB with the remote address. + * + * @param pcb UDP PCB to be connected with remote address ipaddr and port. + * @param ipaddr remote IP address to connect with. + * @param port remote UDP port to connect with. + * + * @return lwIP error code + * + * ipaddr & port are expected to be in the same byte order as in the pcb. + * + * The udp pcb is bound to a random local port if not already bound. + * + * @see udp_disconnect() + */ +err_t +udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr, u16_t port) +{ + struct udp_pcb *ipcb; + + if (pcb->local_port == 0) { + err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port); + if (err != ERR_OK) { + return err; + } + } + + ip_addr_set(&pcb->remote_ip, ipaddr); + pcb->remote_port = port; + pcb->flags |= UDP_FLAGS_CONNECTED; +/** TODO: this functionality belongs in upper layers */ +#ifdef LWIP_UDP_TODO + /* Nail down local IP for netconn_addr()/getsockname() */ + if (ip_addr_isany(&pcb->local_ip) && !ip_addr_isany(&pcb->remote_ip)) { + struct netif *netif; + + if ((netif = ip_route(&(pcb->remote_ip))) == NULL) { + LWIP_DEBUGF(UDP_DEBUG, ("udp_connect: No route to 0x%lx\n", pcb->remote_ip.addr)); + UDP_STATS_INC(udp.rterr); + return ERR_RTE; + } + /** TODO: this will bind the udp pcb locally, to the interface which + is used to route output packets to the remote address. However, we + might want to accept incoming packets on any interface! */ + pcb->local_ip = netif->ip_addr; + } else if (ip_addr_isany(&pcb->remote_ip)) { + pcb->local_ip.addr = 0; + } +#endif + LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, + ("udp_connect: connected to %"U16_F".%"U16_F".%"U16_F".%"U16_F",port %"U16_F"\n", + ip4_addr1_16(&pcb->local_ip), ip4_addr2_16(&pcb->local_ip), + ip4_addr3_16(&pcb->local_ip), ip4_addr4_16(&pcb->local_ip), + pcb->local_port)); + + /* Insert UDP PCB into the list of active UDP PCBs. */ + for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) { + if (pcb == ipcb) { + /* already on the list, just return */ + return ERR_OK; + } + } + /* PCB not yet on the list, add PCB now */ + pcb->next = udp_pcbs; + udp_pcbs = pcb; + return ERR_OK; +} + +/** + * Disconnect a UDP PCB + * + * @param pcb the udp pcb to disconnect. + */ +void +udp_disconnect(struct udp_pcb *pcb) +{ + /* reset remote address association */ + ip_addr_set_any(&pcb->remote_ip); + pcb->remote_port = 0; + /* mark PCB as unconnected */ + pcb->flags &= ~UDP_FLAGS_CONNECTED; +} + +/** + * Set a receive callback for a UDP PCB + * + * This callback will be called when receiving a datagram for the pcb. + * + * @param pcb the pcb for wich to set the recv callback + * @param recv function pointer of the callback function + * @param recv_arg additional argument to pass to the callback function + */ +void +udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg) +{ + /* remember recv() callback and user data */ + pcb->recv = recv; + pcb->recv_arg = recv_arg; +} + +/** + * Remove an UDP PCB. + * + * @param pcb UDP PCB to be removed. The PCB is removed from the list of + * UDP PCB's and the data structure is freed from memory. + * + * @see udp_new() + */ +void +udp_remove(struct udp_pcb *pcb) +{ + struct udp_pcb *pcb2; + + snmp_delete_udpidx_tree(pcb); + /* pcb to be removed is first in list? */ + if (udp_pcbs == pcb) { + /* make list start at 2nd pcb */ + udp_pcbs = udp_pcbs->next; + /* pcb not 1st in list */ + } else { + for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) { + /* find pcb in udp_pcbs list */ + if (pcb2->next != NULL && pcb2->next == pcb) { + /* remove pcb from list */ + pcb2->next = pcb->next; + } + } + } + memp_free(MEMP_UDP_PCB, pcb); +} + +/** + * Create a UDP PCB. + * + * @return The UDP PCB which was created. NULL if the PCB data structure + * could not be allocated. + * + * @see udp_remove() + */ +struct udp_pcb * +udp_new(void) +{ + struct udp_pcb *pcb; + pcb = (struct udp_pcb *)memp_malloc(MEMP_UDP_PCB); + /* could allocate UDP PCB? */ + if (pcb != NULL) { + /* UDP Lite: by initializing to all zeroes, chksum_len is set to 0 + * which means checksum is generated over the whole datagram per default + * (recommended as default by RFC 3828). */ + /* initialize PCB to all zeroes */ + memset(pcb, 0, sizeof(struct udp_pcb)); + pcb->ttl = UDP_TTL; + } + return pcb; +} + +#if UDP_DEBUG +/** + * Print UDP header information for debug purposes. + * + * @param udphdr pointer to the udp header in memory. + */ +void +udp_debug_print(struct udp_hdr *udphdr) +{ + LWIP_DEBUGF(UDP_DEBUG, ("UDP header:\n")); + LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(UDP_DEBUG, ("| %5"U16_F" | %5"U16_F" | (src port, dest port)\n", + ntohs(udphdr->src), ntohs(udphdr->dest))); + LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n")); + LWIP_DEBUGF(UDP_DEBUG, ("| %5"U16_F" | 0x%04"X16_F" | (len, chksum)\n", + ntohs(udphdr->len), ntohs(udphdr->chksum))); + LWIP_DEBUGF(UDP_DEBUG, ("+-------------------------------+\n")); +} +#endif /* UDP_DEBUG */ + +#endif /* LWIP_UDP */ diff --git a/third_party/lwip-1.4.1/src/include/ipv4/lwip/autoip.h b/third_party/lwip-1.4.1/src/include/ipv4/lwip/autoip.h new file mode 100644 index 0000000..064ef87 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/ipv4/lwip/autoip.h @@ -0,0 +1,118 @@ +/** + * @file + * + * AutoIP Automatic LinkLocal IP Configuration + */ + +/* + * + * Copyright (c) 2007 Dominik Spies + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Dominik Spies + * + * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform + * with RFC 3927. + * + * + * Please coordinate changes and requests with Dominik Spies + * + */ + +#ifndef __LWIP_AUTOIP_H__ +#define __LWIP_AUTOIP_H__ + +#include "lwip/opt.h" + +#if LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/netif.h" +#include "lwip/udp.h" +#include "netif/etharp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* AutoIP Timing */ +#define AUTOIP_TMR_INTERVAL 100 +#define AUTOIP_TICKS_PER_SECOND (1000 / AUTOIP_TMR_INTERVAL) + +/* RFC 3927 Constants */ +#define PROBE_WAIT 1 /* second (initial random delay) */ +#define PROBE_MIN 1 /* second (minimum delay till repeated probe) */ +#define PROBE_MAX 2 /* seconds (maximum delay till repeated probe) */ +#define PROBE_NUM 3 /* (number of probe packets) */ +#define ANNOUNCE_NUM 2 /* (number of announcement packets) */ +#define ANNOUNCE_INTERVAL 2 /* seconds (time between announcement packets) */ +#define ANNOUNCE_WAIT 2 /* seconds (delay before announcing) */ +#define MAX_CONFLICTS 10 /* (max conflicts before rate limiting) */ +#define RATE_LIMIT_INTERVAL 60 /* seconds (delay between successive attempts) */ +#define DEFEND_INTERVAL 10 /* seconds (min. wait between defensive ARPs) */ + +/* AutoIP client states */ +#define AUTOIP_STATE_OFF 0 +#define AUTOIP_STATE_PROBING 1 +#define AUTOIP_STATE_ANNOUNCING 2 +#define AUTOIP_STATE_BOUND 3 + +struct autoip +{ + ip_addr_t llipaddr; /* the currently selected, probed, announced or used LL IP-Address */ + u8_t state; /* current AutoIP state machine state */ + u8_t sent_num; /* sent number of probes or announces, dependent on state */ + u16_t ttw; /* ticks to wait, tick is AUTOIP_TMR_INTERVAL long */ + u8_t lastconflict; /* ticks until a conflict can be solved by defending */ + u8_t tried_llipaddr; /* total number of probed/used Link Local IP-Addresses */ +}; + + +#define autoip_init() /* Compatibility define, no init needed. */ + +/** Set a struct autoip allocated by the application to work with */ +void autoip_set_struct(struct netif *netif, struct autoip *autoip); + +/** Start AutoIP client */ +err_t autoip_start(struct netif *netif); + +/** Stop AutoIP client */ +err_t autoip_stop(struct netif *netif); + +/** Handles every incoming ARP Packet, called by etharp_arp_input */ +void autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr); + +/** Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds */ +void autoip_tmr(void); + +/** Handle a possible change in the network configuration */ +void autoip_network_changed(struct netif *netif); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_AUTOIP */ + +#endif /* __LWIP_AUTOIP_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/ipv4/lwip/icmp.h b/third_party/lwip-1.4.1/src/include/ipv4/lwip/icmp.h new file mode 100644 index 0000000..c937c63 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/ipv4/lwip/icmp.h @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_ICMP_H__ +#define __LWIP_ICMP_H__ + +#include "lwip/opt.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ICMP_ER 0 /* echo reply */ +#define ICMP_DUR 3 /* destination unreachable */ +#define ICMP_SQ 4 /* source quench */ +#define ICMP_RD 5 /* redirect */ +#define ICMP_ECHO 8 /* echo */ +#define ICMP_TE 11 /* time exceeded */ +#define ICMP_PP 12 /* parameter problem */ +#define ICMP_TS 13 /* timestamp */ +#define ICMP_TSR 14 /* timestamp reply */ +#define ICMP_IRQ 15 /* information request */ +#define ICMP_IR 16 /* information reply */ + +enum icmp_dur_type { + ICMP_DUR_NET = 0, /* net unreachable */ + ICMP_DUR_HOST = 1, /* host unreachable */ + ICMP_DUR_PROTO = 2, /* protocol unreachable */ + ICMP_DUR_PORT = 3, /* port unreachable */ + ICMP_DUR_FRAG = 4, /* fragmentation needed and DF set */ + ICMP_DUR_SR = 5 /* source route failed */ +}; + +enum icmp_te_type { + ICMP_TE_TTL = 0, /* time to live exceeded in transit */ + ICMP_TE_FRAG = 1 /* fragment reassembly time exceeded */ +}; + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +/** This is the standard ICMP header only that the u32_t data + * is splitted to two u16_t like ICMP echo needs it. + * This header is also used for other ICMP types that do not + * use the data part. + */ +PACK_STRUCT_BEGIN +struct icmp_echo_hdr { + PACK_STRUCT_FIELD(u8_t type); + PACK_STRUCT_FIELD(u8_t code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u16_t id); + PACK_STRUCT_FIELD(u16_t seqno); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define ICMPH_TYPE(hdr) ((hdr)->type) +#define ICMPH_CODE(hdr) ((hdr)->code) + +/** Combines type and code to an u16_t */ +#define ICMPH_TYPE_SET(hdr, t) ((hdr)->type = (t)) +#define ICMPH_CODE_SET(hdr, c) ((hdr)->code = (c)) + + +#if LWIP_ICMP /* don't build if not configured for use in lwipopts.h */ + +void icmp_input(struct pbuf *p, struct netif *inp); +void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t); +void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t); + +#endif /* LWIP_ICMP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_ICMP_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/ipv4/lwip/igmp.h b/third_party/lwip-1.4.1/src/include/ipv4/lwip/igmp.h new file mode 100644 index 0000000..7bb18ea --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/ipv4/lwip/igmp.h @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2002 CITEL Technologies Ltd. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of CITEL Technologies Ltd nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY CITEL TECHNOLOGIES AND CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL CITEL TECHNOLOGIES OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is a contribution to the lwIP TCP/IP stack. + * The Swedish Institute of Computer Science and Adam Dunkels + * are specifically granted permission to redistribute this + * source code. +*/ + +#ifndef __LWIP_IGMP_H__ +#define __LWIP_IGMP_H__ + +#include "lwip/opt.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/pbuf.h" + +#if LWIP_IGMP /* don't build if not configured for use in lwipopts.h */ + +#ifdef __cplusplus +extern "C" { +#endif + + +/* IGMP timer */ +#define IGMP_TMR_INTERVAL 100 /* Milliseconds */ +#define IGMP_V1_DELAYING_MEMBER_TMR (1000/IGMP_TMR_INTERVAL) +#define IGMP_JOIN_DELAYING_MEMBER_TMR (500 /IGMP_TMR_INTERVAL) + +/* MAC Filter Actions, these are passed to a netif's + * igmp_mac_filter callback function. */ +#define IGMP_DEL_MAC_FILTER 0 +#define IGMP_ADD_MAC_FILTER 1 + + +/** + * igmp group structure - there is + * a list of groups for each interface + * these should really be linked from the interface, but + * if we keep them separate we will not affect the lwip original code + * too much + * + * There will be a group for the all systems group address but this + * will not run the state machine as it is used to kick off reports + * from all the other groups + */ +struct igmp_group { + /** next link */ + struct igmp_group *next; + /** interface on which the group is active */ + struct netif *netif; + /** multicast address */ + ip_addr_t group_address; + /** signifies we were the last person to report */ + u8_t last_reporter_flag; + /** current state of the group */ + u8_t group_state; + /** timer for reporting, negative is OFF */ + u16_t timer; + /** counter of simultaneous uses */ + u8_t use; +}; + +/* Prototypes */ +void igmp_init(void); +err_t igmp_start(struct netif *netif); +err_t igmp_stop(struct netif *netif); +void igmp_report_groups(struct netif *netif); +struct igmp_group *igmp_lookfor_group(struct netif *ifp, ip_addr_t *addr); +void igmp_input(struct pbuf *p, struct netif *inp, ip_addr_t *dest); +err_t igmp_joingroup(ip_addr_t *ifaddr, ip_addr_t *groupaddr); +err_t igmp_leavegroup(ip_addr_t *ifaddr, ip_addr_t *groupaddr); +void igmp_tmr(void); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_IGMP */ + +#endif /* __LWIP_IGMP_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/ipv4/lwip/inet.h b/third_party/lwip-1.4.1/src/include/ipv4/lwip/inet.h new file mode 100644 index 0000000..61084a4 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/ipv4/lwip/inet.h @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_INET_H__ +#define __LWIP_INET_H__ + +#include "lwip/opt.h" +#include "lwip/def.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** For compatibility with BSD code */ +struct in_addr { + u32_t s_addr; +}; + +/** 255.255.255.255 */ +#define INADDR_NONE IPADDR_NONE +/** 127.0.0.1 */ +#define INADDR_LOOPBACK IPADDR_LOOPBACK +/** 0.0.0.0 */ +#define INADDR_ANY IPADDR_ANY +/** 255.255.255.255 */ +#define INADDR_BROADCAST IPADDR_BROADCAST + +/* Definitions of the bits in an Internet address integer. + + On subnets, host and network parts are found according to + the subnet mask, not these masks. */ +#define IN_CLASSA(a) IP_CLASSA(a) +#define IN_CLASSA_NET IP_CLASSA_NET +#define IN_CLASSA_NSHIFT IP_CLASSA_NSHIFT +#define IN_CLASSA_HOST IP_CLASSA_HOST +#define IN_CLASSA_MAX IP_CLASSA_MAX + +#define IN_CLASSB(b) IP_CLASSB(b) +#define IN_CLASSB_NET IP_CLASSB_NET +#define IN_CLASSB_NSHIFT IP_CLASSB_NSHIFT +#define IN_CLASSB_HOST IP_CLASSB_HOST +#define IN_CLASSB_MAX IP_CLASSB_MAX + +#define IN_CLASSC(c) IP_CLASSC(c) +#define IN_CLASSC_NET IP_CLASSC_NET +#define IN_CLASSC_NSHIFT IP_CLASSC_NSHIFT +#define IN_CLASSC_HOST IP_CLASSC_HOST +#define IN_CLASSC_MAX IP_CLASSC_MAX + +#define IN_CLASSD(d) IP_CLASSD(d) +#define IN_CLASSD_NET IP_CLASSD_NET /* These ones aren't really */ +#define IN_CLASSD_NSHIFT IP_CLASSD_NSHIFT /* net and host fields, but */ +#define IN_CLASSD_HOST IP_CLASSD_HOST /* routing needn't know. */ +#define IN_CLASSD_MAX IP_CLASSD_MAX + +#define IN_MULTICAST(a) IP_MULTICAST(a) + +#define IN_EXPERIMENTAL(a) IP_EXPERIMENTAL(a) +#define IN_BADCLASS(a) IP_BADCLASS(a) + +#define IN_LOOPBACKNET IP_LOOPBACKNET + +#define inet_addr_from_ipaddr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr)) +#define inet_addr_to_ipaddr(target_ipaddr, source_inaddr) (ip4_addr_set_u32(target_ipaddr, (source_inaddr)->s_addr)) +/* ATTENTION: the next define only works because both s_addr and ip_addr_t are an u32_t effectively! */ +#define inet_addr_to_ipaddr_p(target_ipaddr_p, source_inaddr) ((target_ipaddr_p) = (ip_addr_t*)&((source_inaddr)->s_addr)) + +/* directly map this to the lwip internal functions */ +#define inet_addr(cp) ipaddr_addr(cp) +#define inet_aton(cp, addr) ipaddr_aton(cp, (ip_addr_t*)addr) +#define inet_ntoa(addr) ipaddr_ntoa((ip_addr_t*)&(addr)) +#define inet_ntoa_r(addr, buf, buflen) ipaddr_ntoa_r((ip_addr_t*)&(addr), buf, buflen) + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_INET_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/ipv4/lwip/inet_chksum.h b/third_party/lwip-1.4.1/src/include/ipv4/lwip/inet_chksum.h new file mode 100644 index 0000000..9737420 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/ipv4/lwip/inet_chksum.h @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_INET_CHKSUM_H__ +#define __LWIP_INET_CHKSUM_H__ + +#include "lwip/opt.h" + +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" + +/** Swap the bytes in an u16_t: much like htons() for little-endian */ +#ifndef SWAP_BYTES_IN_WORD +#if LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN) +/* little endian and PLATFORM_BYTESWAP defined */ +#define SWAP_BYTES_IN_WORD(w) LWIP_PLATFORM_HTONS(w) +#else /* LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN) */ +/* can't use htons on big endian (or PLATFORM_BYTESWAP not defined)... */ +#define SWAP_BYTES_IN_WORD(w) (((w) & 0xff) << 8) | (((w) & 0xff00) >> 8) +#endif /* LWIP_PLATFORM_BYTESWAP && (BYTE_ORDER == LITTLE_ENDIAN)*/ +#endif /* SWAP_BYTES_IN_WORD */ + +/** Split an u32_t in two u16_ts and add them up */ +#ifndef FOLD_U32T +#define FOLD_U32T(u) (((u) >> 16) + ((u) & 0x0000ffffUL)) +#endif + +#if LWIP_CHECKSUM_ON_COPY +/** Function-like macro: same as MEMCPY but returns the checksum of copied data + as u16_t */ +#ifndef LWIP_CHKSUM_COPY +#define LWIP_CHKSUM_COPY(dst, src, len) lwip_chksum_copy(dst, src, len) +#ifndef LWIP_CHKSUM_COPY_ALGORITHM +#define LWIP_CHKSUM_COPY_ALGORITHM 1 +#endif /* LWIP_CHKSUM_COPY_ALGORITHM */ +#endif /* LWIP_CHKSUM_COPY */ +#else /* LWIP_CHECKSUM_ON_COPY */ +#define LWIP_CHKSUM_COPY_ALGORITHM 0 +#endif /* LWIP_CHECKSUM_ON_COPY */ + +#ifdef __cplusplus +extern "C" { +#endif + +u16_t inet_chksum(void *dataptr, u16_t len); +u16_t inet_chksum_pbuf(struct pbuf *p); +u16_t inet_chksum_pseudo(struct pbuf *p, + ip_addr_t *src, ip_addr_t *dest, + u8_t proto, u16_t proto_len); +u16_t inet_chksum_pseudo_partial(struct pbuf *p, + ip_addr_t *src, ip_addr_t *dest, + u8_t proto, u16_t proto_len, u16_t chksum_len); +#if LWIP_CHKSUM_COPY_ALGORITHM +u16_t lwip_chksum_copy(void *dst, const void *src, u16_t len); +#endif /* LWIP_CHKSUM_COPY_ALGORITHM */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_INET_H__ */ + diff --git a/third_party/lwip-1.4.1/src/include/ipv4/lwip/ip.h b/third_party/lwip-1.4.1/src/include/ipv4/lwip/ip.h new file mode 100644 index 0000000..b7087af --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/ipv4/lwip/ip.h @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_IP_H__ +#define __LWIP_IP_H__ + +#include "lwip/opt.h" + +#include "lwip/def.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" +#include "lwip/err.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Currently, the function ip_output_if_opt() is only used with IGMP */ +#define IP_OPTIONS_SEND LWIP_IGMP + +#define IP_HLEN 20 + +#define IP_PROTO_ICMP 1 +#define IP_PROTO_IGMP 2 +#define IP_PROTO_UDP 17 +#define IP_PROTO_UDPLITE 136 +#define IP_PROTO_TCP 6 + +/* This is passed as the destination address to ip_output_if (not + to ip_output), meaning that an IP header already is constructed + in the pbuf. This is used when TCP retransmits. */ +#ifdef IP_HDRINCL +#undef IP_HDRINCL +#endif /* IP_HDRINCL */ +#define IP_HDRINCL NULL + +#if LWIP_NETIF_HWADDRHINT +#define IP_PCB_ADDRHINT ;u8_t addr_hint +#else +#define IP_PCB_ADDRHINT +#endif /* LWIP_NETIF_HWADDRHINT */ + +/* This is the common part of all PCB types. It needs to be at the + beginning of a PCB type definition. It is located here so that + changes to this common part are made in one location instead of + having to change all PCB structs. */ +#define IP_PCB \ + /* ip addresses in network byte order */ \ + ip_addr_t local_ip; \ + ip_addr_t remote_ip; \ + /* Socket options */ \ + u8_t so_options; \ + /* Type Of Service */ \ + u8_t tos; \ + /* Time To Live */ \ + u8_t ttl \ + /* link layer address resolution hint */ \ + IP_PCB_ADDRHINT + +struct ip_pcb { +/* Common members of all PCB types */ + IP_PCB; +}; + +/* + * Option flags per-socket. These are the same like SO_XXX. + */ +/*#define SOF_DEBUG 0x01U Unimplemented: turn on debugging info recording */ +#define SOF_ACCEPTCONN 0x02U /* socket has had listen() */ +#define SOF_REUSEADDR 0x04U /* allow local address reuse */ +#define SOF_KEEPALIVE 0x08U /* keep connections alive */ +/*#define SOF_DONTROUTE 0x10U Unimplemented: just use interface addresses */ +#define SOF_BROADCAST 0x20U /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ +/*#define SOF_USELOOPBACK 0x40U Unimplemented: bypass hardware when possible */ +#define SOF_LINGER 0x80U /* linger on close if data present */ +/*#define SOF_OOBINLINE 0x0100U Unimplemented: leave received OOB data in line */ +/*#define SOF_REUSEPORT 0x0200U Unimplemented: allow local address & port reuse */ + +/* These flags are inherited (e.g. from a listen-pcb to a connection-pcb): */ +#define SOF_INHERITED (SOF_REUSEADDR|SOF_KEEPALIVE|SOF_LINGER/*|SOF_DEBUG|SOF_DONTROUTE|SOF_OOBINLINE*/) + + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip_hdr { + /* version / header length */ + PACK_STRUCT_FIELD(u8_t _v_hl); + /* type of service */ + PACK_STRUCT_FIELD(u8_t _tos); + /* total length */ + PACK_STRUCT_FIELD(u16_t _len); + /* identification */ + PACK_STRUCT_FIELD(u16_t _id); + /* fragment offset field */ + PACK_STRUCT_FIELD(u16_t _offset); +#define IP_RF 0x8000U /* reserved fragment flag */ +#define IP_DF 0x4000U /* dont fragment flag */ +#define IP_MF 0x2000U /* more fragments flag */ +#define IP_OFFMASK 0x1fffU /* mask for fragmenting bits */ + /* time to live */ + PACK_STRUCT_FIELD(u8_t _ttl); + /* protocol*/ + PACK_STRUCT_FIELD(u8_t _proto); + /* checksum */ + PACK_STRUCT_FIELD(u16_t _chksum); + /* source and destination IP addresses */ + PACK_STRUCT_FIELD(ip_addr_p_t src); + PACK_STRUCT_FIELD(ip_addr_p_t dest); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define IPH_V(hdr) ((hdr)->_v_hl >> 4) +#define IPH_HL(hdr) ((hdr)->_v_hl & 0x0f) +#define IPH_TOS(hdr) ((hdr)->_tos) +#define IPH_LEN(hdr) ((hdr)->_len) +#define IPH_ID(hdr) ((hdr)->_id) +#define IPH_OFFSET(hdr) ((hdr)->_offset) +#define IPH_TTL(hdr) ((hdr)->_ttl) +#define IPH_PROTO(hdr) ((hdr)->_proto) +#define IPH_CHKSUM(hdr) ((hdr)->_chksum) + +#define IPH_VHL_SET(hdr, v, hl) (hdr)->_v_hl = (((v) << 4) | (hl)) +#define IPH_TOS_SET(hdr, tos) (hdr)->_tos = (tos) +#define IPH_LEN_SET(hdr, len) (hdr)->_len = (len) +#define IPH_ID_SET(hdr, id) (hdr)->_id = (id) +#define IPH_OFFSET_SET(hdr, off) (hdr)->_offset = (off) +#define IPH_TTL_SET(hdr, ttl) (hdr)->_ttl = (u8_t)(ttl) +#define IPH_PROTO_SET(hdr, proto) (hdr)->_proto = (u8_t)(proto) +#define IPH_CHKSUM_SET(hdr, chksum) (hdr)->_chksum = (chksum) + +/** The interface that provided the packet for the current callback invocation. */ +extern struct netif *current_netif; +/** Header of the input packet currently being processed. */ +extern const struct ip_hdr *current_header; +/** Source IP address of current_header */ +extern ip_addr_t current_iphdr_src; +/** Destination IP address of current_header */ +extern ip_addr_t current_iphdr_dest; + +#define ip_init() /* Compatibility define, not init needed. */ +struct netif *ip_route(ip_addr_t *dest); +err_t ip_input(struct pbuf *p, struct netif *inp); +err_t ip_output(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, + u8_t ttl, u8_t tos, u8_t proto); +err_t ip_output_if(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, + u8_t ttl, u8_t tos, u8_t proto, + struct netif *netif); +#if LWIP_NETIF_HWADDRHINT +err_t ip_output_hinted(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, + u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint); +#endif /* LWIP_NETIF_HWADDRHINT */ +#if IP_OPTIONS_SEND +err_t ip_output_if_opt(struct pbuf *p, ip_addr_t *src, ip_addr_t *dest, + u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options, + u16_t optlen); +#endif /* IP_OPTIONS_SEND */ +/** Get the interface that received the current packet. + * This function must only be called from a receive callback (udp_recv, + * raw_recv, tcp_accept). It will return NULL otherwise. */ +#define ip_current_netif() (current_netif) +/** Get the IP header of the current packet. + * This function must only be called from a receive callback (udp_recv, + * raw_recv, tcp_accept). It will return NULL otherwise. */ +#define ip_current_header() (current_header) +/** Source IP address of current_header */ +#define ip_current_src_addr() (¤t_iphdr_src) +/** Destination IP address of current_header */ +#define ip_current_dest_addr() (¤t_iphdr_dest) + +/** Gets an IP pcb option (SOF_* flags) */ +#define ip_get_option(pcb, opt) ((pcb)->so_options & (opt)) +/** Sets an IP pcb option (SOF_* flags) */ +#define ip_set_option(pcb, opt) ((pcb)->so_options |= (opt)) +/** Resets an IP pcb option (SOF_* flags) */ +#define ip_reset_option(pcb, opt) ((pcb)->so_options &= ~(opt)) + +#if IP_DEBUG +void ip_debug_print(struct pbuf *p); +#else +#define ip_debug_print(p) +#endif /* IP_DEBUG */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_IP_H__ */ + + diff --git a/third_party/lwip-1.4.1/src/include/ipv4/lwip/ip_addr.h b/third_party/lwip-1.4.1/src/include/ipv4/lwip/ip_addr.h new file mode 100644 index 0000000..422c0cd --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/ipv4/lwip/ip_addr.h @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_IP_ADDR_H__ +#define __LWIP_IP_ADDR_H__ + +#include "lwip/opt.h" +#include "lwip/def.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* This is the aligned version of ip_addr_t, + used as local variable, on the stack, etc. */ +struct ip_addr { + u32_t addr; +}; + +/* This is the packed version of ip_addr_t, + used in network headers that are itself packed */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip_addr_packed { + PACK_STRUCT_FIELD(u32_t addr); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/** ip_addr_t uses a struct for convenience only, so that the same defines can + * operate both on ip_addr_t as well as on ip_addr_p_t. */ +typedef struct ip_addr ip_addr_t; +typedef struct ip_addr_packed ip_addr_p_t; + +/* + * struct ipaddr2 is used in the definition of the ARP packet format in + * order to support compilers that don't have structure packing. + */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip_addr2 { + PACK_STRUCT_FIELD(u16_t addrw[2]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/* Forward declaration to not include netif.h */ +struct netif; + +extern const ip_addr_t ip_addr_any; +extern const ip_addr_t ip_addr_broadcast; + +/** IP_ADDR_ can be used as a fixed IP address + * for the wildcard and the broadcast address + */ +#define IP_ADDR_ANY ((ip_addr_t *)&ip_addr_any) +#define IP_ADDR_BROADCAST ((ip_addr_t *)&ip_addr_broadcast) + +/** 255.255.255.255 */ +#define IPADDR_NONE ((u32_t)0xffffffffUL) +/** 127.0.0.1 */ +#define IPADDR_LOOPBACK ((u32_t)0x7f000001UL) +/** 0.0.0.0 */ +#define IPADDR_ANY ((u32_t)0x00000000UL) +/** 255.255.255.255 */ +#define IPADDR_BROADCAST ((u32_t)0xffffffffUL) + +/* Definitions of the bits in an Internet address integer. + + On subnets, host and network parts are found according to + the subnet mask, not these masks. */ +#define IP_CLASSA(a) ((((u32_t)(a)) & 0x80000000UL) == 0) +#define IP_CLASSA_NET 0xff000000 +#define IP_CLASSA_NSHIFT 24 +#define IP_CLASSA_HOST (0xffffffff & ~IP_CLASSA_NET) +#define IP_CLASSA_MAX 128 + +#define IP_CLASSB(a) ((((u32_t)(a)) & 0xc0000000UL) == 0x80000000UL) +#define IP_CLASSB_NET 0xffff0000 +#define IP_CLASSB_NSHIFT 16 +#define IP_CLASSB_HOST (0xffffffff & ~IP_CLASSB_NET) +#define IP_CLASSB_MAX 65536 + +#define IP_CLASSC(a) ((((u32_t)(a)) & 0xe0000000UL) == 0xc0000000UL) +#define IP_CLASSC_NET 0xffffff00 +#define IP_CLASSC_NSHIFT 8 +#define IP_CLASSC_HOST (0xffffffff & ~IP_CLASSC_NET) + +#define IP_CLASSD(a) (((u32_t)(a) & 0xf0000000UL) == 0xe0000000UL) +#define IP_CLASSD_NET 0xf0000000 /* These ones aren't really */ +#define IP_CLASSD_NSHIFT 28 /* net and host fields, but */ +#define IP_CLASSD_HOST 0x0fffffff /* routing needn't know. */ +#define IP_MULTICAST(a) IP_CLASSD(a) + +#define IP_EXPERIMENTAL(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) +#define IP_BADCLASS(a) (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL) + +#define IP_LOOPBACKNET 127 /* official! */ + + +#if BYTE_ORDER == BIG_ENDIAN +/** Set an IP address given by the four byte-parts */ +#define IP4_ADDR(ipaddr, a,b,c,d) \ + (ipaddr)->addr = ((u32_t)((a) & 0xff) << 24) | \ + ((u32_t)((b) & 0xff) << 16) | \ + ((u32_t)((c) & 0xff) << 8) | \ + (u32_t)((d) & 0xff) +#else +/** Set an IP address given by the four byte-parts. + Little-endian version that prevents the use of htonl. */ +#define IP4_ADDR(ipaddr, a,b,c,d) \ + (ipaddr)->addr = ((u32_t)((d) & 0xff) << 24) | \ + ((u32_t)((c) & 0xff) << 16) | \ + ((u32_t)((b) & 0xff) << 8) | \ + (u32_t)((a) & 0xff) +#endif + +/** MEMCPY-like copying of IP addresses where addresses are known to be + * 16-bit-aligned if the port is correctly configured (so a port could define + * this to copying 2 u16_t's) - no NULL-pointer-checking needed. */ +#ifndef IPADDR2_COPY +#define IPADDR2_COPY(dest, src) SMEMCPY(dest, src, sizeof(ip_addr_t)) +#endif + +/** Copy IP address - faster than ip_addr_set: no NULL check */ +#define ip_addr_copy(dest, src) ((dest).addr = (src).addr) +/** Safely copy one IP address to another (src may be NULL) */ +#define ip_addr_set(dest, src) ((dest)->addr = \ + ((src) == NULL ? 0 : \ + (src)->addr)) +/** Set complete address to zero */ +#define ip_addr_set_zero(ipaddr) ((ipaddr)->addr = 0) +/** Set address to IPADDR_ANY (no need for htonl()) */ +#define ip_addr_set_any(ipaddr) ((ipaddr)->addr = IPADDR_ANY) +/** Set address to loopback address */ +#define ip_addr_set_loopback(ipaddr) ((ipaddr)->addr = PP_HTONL(IPADDR_LOOPBACK)) +/** Safely copy one IP address to another and change byte order + * from host- to network-order. */ +#define ip_addr_set_hton(dest, src) ((dest)->addr = \ + ((src) == NULL ? 0:\ + htonl((src)->addr))) +/** IPv4 only: set the IP address given as an u32_t */ +#define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32)) +/** IPv4 only: get the IP address as an u32_t */ +#define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr) + +/** Get the network address by combining host address with netmask */ +#define ip_addr_get_network(target, host, netmask) ((target)->addr = ((host)->addr) & ((netmask)->addr)) + +/** + * Determine if two address are on the same network. + * + * @arg addr1 IP address 1 + * @arg addr2 IP address 2 + * @arg mask network identifier mask + * @return !0 if the network identifiers of both address match + */ +#define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \ + (mask)->addr) == \ + ((addr2)->addr & \ + (mask)->addr)) +#define ip_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr) + +#define ip_addr_isany(addr1) ((addr1) == NULL || (addr1)->addr == IPADDR_ANY) + +#define ip_addr_isbroadcast(ipaddr, netif) ip4_addr_isbroadcast((ipaddr)->addr, (netif)) +u8_t ip4_addr_isbroadcast(u32_t addr, const struct netif *netif); + +#define ip_addr_netmask_valid(netmask) ip4_addr_netmask_valid((netmask)->addr) +u8_t ip4_addr_netmask_valid(u32_t netmask); + +#define ip_addr_ismulticast(addr1) (((addr1)->addr & PP_HTONL(0xf0000000UL)) == PP_HTONL(0xe0000000UL)) + +#define ip_addr_islinklocal(addr1) (((addr1)->addr & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xa9fe0000UL)) + +#define ip_addr_debug_print(debug, ipaddr) \ + LWIP_DEBUGF(debug, ("%"U16_F".%"U16_F".%"U16_F".%"U16_F, \ + ipaddr != NULL ? ip4_addr1_16(ipaddr) : 0, \ + ipaddr != NULL ? ip4_addr2_16(ipaddr) : 0, \ + ipaddr != NULL ? ip4_addr3_16(ipaddr) : 0, \ + ipaddr != NULL ? ip4_addr4_16(ipaddr) : 0)) + +/* Get one byte from the 4-byte address */ +#define ip4_addr1(ipaddr) (((u8_t*)(ipaddr))[0]) +#define ip4_addr2(ipaddr) (((u8_t*)(ipaddr))[1]) +#define ip4_addr3(ipaddr) (((u8_t*)(ipaddr))[2]) +#define ip4_addr4(ipaddr) (((u8_t*)(ipaddr))[3]) +/* These are cast to u16_t, with the intent that they are often arguments + * to printf using the U16_F format from cc.h. */ +#define ip4_addr1_16(ipaddr) ((u16_t)ip4_addr1(ipaddr)) +#define ip4_addr2_16(ipaddr) ((u16_t)ip4_addr2(ipaddr)) +#define ip4_addr3_16(ipaddr) ((u16_t)ip4_addr3(ipaddr)) +#define ip4_addr4_16(ipaddr) ((u16_t)ip4_addr4(ipaddr)) + +/** For backwards compatibility */ +#define ip_ntoa(ipaddr) ipaddr_ntoa(ipaddr) + +u32_t ipaddr_addr(const char *cp); +int ipaddr_aton(const char *cp, ip_addr_t *addr); +/** returns ptr to static buffer; not reentrant! */ +char *ipaddr_ntoa(const ip_addr_t *addr); +char *ipaddr_ntoa_r(const ip_addr_t *addr, char *buf, int buflen); + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_IP_ADDR_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/ipv4/lwip/ip_frag.h b/third_party/lwip-1.4.1/src/include/ipv4/lwip/ip_frag.h new file mode 100644 index 0000000..86350cd --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/ipv4/lwip/ip_frag.h @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Jani Monoses + * + */ + +#ifndef __LWIP_IP_FRAG_H__ +#define __LWIP_IP_FRAG_H__ + +#include "lwip/opt.h" +#include "lwip/err.h" +#include "lwip/pbuf.h" +#include "lwip/netif.h" +#include "lwip/ip_addr.h" +#include "lwip/ip.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if IP_REASSEMBLY +/* The IP reassembly timer interval in milliseconds. */ +#define IP_TMR_INTERVAL 1000 + +/* IP reassembly helper struct. + * This is exported because memp needs to know the size. + */ +struct ip_reassdata { + struct ip_reassdata *next; + struct pbuf *p; + struct ip_hdr iphdr; + u16_t datagram_len; + u8_t flags; + u8_t timer; +}; + +void ip_reass_init(void); +void ip_reass_tmr(void); +struct pbuf * ip_reass(struct pbuf *p); +#endif /* IP_REASSEMBLY */ + +#if IP_FRAG +#if !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF +/** A custom pbuf that holds a reference to another pbuf, which is freed + * when this custom pbuf is freed. This is used to create a custom PBUF_REF + * that points into the original pbuf. */ +struct pbuf_custom_ref { + /** 'base class' */ + struct pbuf_custom pc; + /** pointer to the original pbuf that is referenced */ + struct pbuf *original; +}; +#endif /* !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF */ + +err_t ip_frag(struct pbuf *p, struct netif *netif, ip_addr_t *dest); +#endif /* IP_FRAG */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_IP_FRAG_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/ipv6/lwip/icmp.h b/third_party/lwip-1.4.1/src/include/ipv6/lwip/icmp.h new file mode 100644 index 0000000..cbdf07a --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/ipv6/lwip/icmp.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_ICMP_H__ +#define __LWIP_ICMP_H__ + +#include "lwip/opt.h" + +#if LWIP_ICMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ICMP6_DUR 1 +#define ICMP6_TE 3 +#define ICMP6_ECHO 128 /* echo */ +#define ICMP6_ER 129 /* echo reply */ + + +enum icmp_dur_type { + ICMP_DUR_NET = 0, /* net unreachable */ + ICMP_DUR_HOST = 1, /* host unreachable */ + ICMP_DUR_PROTO = 2, /* protocol unreachable */ + ICMP_DUR_PORT = 3, /* port unreachable */ + ICMP_DUR_FRAG = 4, /* fragmentation needed and DF set */ + ICMP_DUR_SR = 5 /* source route failed */ +}; + +enum icmp_te_type { + ICMP_TE_TTL = 0, /* time to live exceeded in transit */ + ICMP_TE_FRAG = 1 /* fragment reassembly time exceeded */ +}; + +void icmp_input(struct pbuf *p, struct netif *inp); + +void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t); +void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t); + +struct icmp_echo_hdr { + u8_t type; + u8_t icode; + u16_t chksum; + u16_t id; + u16_t seqno; +}; + +struct icmp_dur_hdr { + u8_t type; + u8_t icode; + u16_t chksum; + u32_t unused; +}; + +struct icmp_te_hdr { + u8_t type; + u8_t icode; + u16_t chksum; + u32_t unused; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_ICMP */ + +#endif /* __LWIP_ICMP_H__ */ + diff --git a/third_party/lwip-1.4.1/src/include/ipv6/lwip/inet.h b/third_party/lwip-1.4.1/src/include/ipv6/lwip/inet.h new file mode 100644 index 0000000..216ebd7 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/ipv6/lwip/inet.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_INET_H__ +#define __LWIP_INET_H__ + +#include "lwip/opt.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +u16_t inet_chksum(void *data, u16_t len); +u16_t inet_chksum_pbuf(struct pbuf *p); +u16_t inet_chksum_pseudo(struct pbuf *p, + struct ip_addr *src, struct ip_addr *dest, + u8_t proto, u32_t proto_len); + +u32_t inet_addr(const char *cp); +s8_t inet_aton(const char *cp, struct in_addr *addr); + +#ifndef _MACHINE_ENDIAN_H_ +#ifndef _NETINET_IN_H +#ifndef _LINUX_BYTEORDER_GENERIC_H +u16_t htons(u16_t n); +u16_t ntohs(u16_t n); +u32_t htonl(u32_t n); +u32_t ntohl(u32_t n); +#endif /* _LINUX_BYTEORDER_GENERIC_H */ +#endif /* _NETINET_IN_H */ +#endif /* _MACHINE_ENDIAN_H_ */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_INET_H__ */ + diff --git a/third_party/lwip-1.4.1/src/include/ipv6/lwip/ip.h b/third_party/lwip-1.4.1/src/include/ipv6/lwip/ip.h new file mode 100644 index 0000000..3bf37ab --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/ipv6/lwip/ip.h @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_IP_H__ +#define __LWIP_IP_H__ + +#include "lwip/opt.h" +#include "lwip/def.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" + +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define IP_HLEN 40 + +#define IP_PROTO_ICMP 58 +#define IP_PROTO_UDP 17 +#define IP_PROTO_UDPLITE 136 +#define IP_PROTO_TCP 6 + +/* This is passed as the destination address to ip_output_if (not + to ip_output), meaning that an IP header already is constructed + in the pbuf. This is used when TCP retransmits. */ +#ifdef IP_HDRINCL +#undef IP_HDRINCL +#endif /* IP_HDRINCL */ +#define IP_HDRINCL NULL + +#if LWIP_NETIF_HWADDRHINT +#define IP_PCB_ADDRHINT ;u8_t addr_hint +#else +#define IP_PCB_ADDRHINT +#endif /* LWIP_NETIF_HWADDRHINT */ + +/* This is the common part of all PCB types. It needs to be at the + beginning of a PCB type definition. It is located here so that + changes to this common part are made in one location instead of + having to change all PCB structs. */ +#define IP_PCB struct ip_addr local_ip; \ + struct ip_addr remote_ip; \ + /* Socket options */ \ + u16_t so_options; \ + /* Type Of Service */ \ + u8_t tos; \ + /* Time To Live */ \ + u8_t ttl; \ + /* link layer address resolution hint */ \ + IP_PCB_ADDRHINT + + +/* The IPv6 header. */ +struct ip_hdr { +#if BYTE_ORDER == LITTLE_ENDIAN + u8_t tclass1:4, v:4; + u8_t flow1:4, tclass2:4; +#else + u8_t v:4, tclass1:4; + u8_t tclass2:8, flow1:4; +#endif + u16_t flow2; + u16_t len; /* payload length */ + u8_t nexthdr; /* next header */ + u8_t hoplim; /* hop limit (TTL) */ + struct ip_addr src, dest; /* source and destination IP addresses */ +}; + +#define IPH_PROTO(hdr) (iphdr->nexthdr) + +void ip_init(void); + +#include "lwip/netif.h" + +struct netif *ip_route(struct ip_addr *dest); + +void ip_input(struct pbuf *p, struct netif *inp); + +/* source and destination addresses in network byte order, please */ +err_t ip_output(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, u8_t proto); + +err_t ip_output_if(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, + u8_t ttl, u8_t proto, + struct netif *netif); + +#define ip_current_netif() NULL +#define ip_current_header() NULL + +#if IP_DEBUG +void ip_debug_print(struct pbuf *p); +#endif /* IP_DEBUG */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_IP_H__ */ + + diff --git a/third_party/lwip-1.4.1/src/include/ipv6/lwip/ip_addr.h b/third_party/lwip-1.4.1/src/include/ipv6/lwip/ip_addr.h new file mode 100644 index 0000000..85971c9 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/ipv6/lwip/ip_addr.h @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_IP_ADDR_H__ +#define __LWIP_IP_ADDR_H__ + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define IP_ADDR_ANY 0 + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN + struct ip_addr { + PACK_STRUCT_FIELD(u32_t addr[4]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +/* + * struct ipaddr2 is used in the definition of the ARP packet format in + * order to support compilers that don't have structure packing. + */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct ip_addr2 { + PACK_STRUCT_FIELD(u16_t addrw[2]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define IP6_ADDR(ipaddr, a,b,c,d,e,f,g,h) do { (ipaddr)->addr[0] = htonl((u32_t)((a & 0xffff) << 16) | (b & 0xffff)); \ + (ipaddr)->addr[1] = htonl(((c & 0xffff) << 16) | (d & 0xffff)); \ + (ipaddr)->addr[2] = htonl(((e & 0xffff) << 16) | (f & 0xffff)); \ + (ipaddr)->addr[3] = htonl(((g & 0xffff) << 16) | (h & 0xffff)); } while(0) + +u8_t ip_addr_netcmp(struct ip_addr *addr1, struct ip_addr *addr2, + struct ip_addr *mask); +u8_t ip_addr_cmp(struct ip_addr *addr1, struct ip_addr *addr2); +void ip_addr_set(struct ip_addr *dest, struct ip_addr *src); +u8_t ip_addr_isany(struct ip_addr *addr); + +#define ip_addr_debug_print(debug, ipaddr) \ + LWIP_DEBUGF(debug, ("%"X32_F":%"X32_F":%"X32_F":%"X32_F":%"X32_F":%"X32_F":%"X32_F":%"X32_F"\n", \ + (ntohl(ipaddr->addr[0]) >> 16) & 0xffff, \ + ntohl(ipaddr->addr[0]) & 0xffff, \ + (ntohl(ipaddr->addr[1]) >> 16) & 0xffff, \ + ntohl(ipaddr->addr[1]) & 0xffff, \ + (ntohl(ipaddr->addr[2]) >> 16) & 0xffff, \ + ntohl(ipaddr->addr[2]) & 0xffff, \ + (ntohl(ipaddr->addr[3]) >> 16) & 0xffff, \ + ntohl(ipaddr->addr[3]) & 0xffff)); + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_IP_ADDR_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/api.h b/third_party/lwip-1.4.1/src/include/lwip/api.h new file mode 100644 index 0000000..f7cc52a --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/api.h @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_API_H__ +#define __LWIP_API_H__ + +#include "lwip/opt.h" + +#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */ + +#include /* for size_t */ + +#include "lwip/netbuf.h" +#include "lwip/sys.h" +#include "lwip/ip_addr.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Throughout this file, IP addresses and port numbers are expected to be in + * the same byte order as in the corresponding pcb. + */ + +/* Flags for netconn_write (u8_t) */ +#define NETCONN_NOFLAG 0x00 +#define NETCONN_NOCOPY 0x00 /* Only for source code compatibility */ +#define NETCONN_COPY 0x01 +#define NETCONN_MORE 0x02 +#define NETCONN_DONTBLOCK 0x04 + +/* Flags for struct netconn.flags (u8_t) */ +/** TCP: when data passed to netconn_write doesn't fit into the send buffer, + this temporarily stores whether to wake up the original application task + if data couldn't be sent in the first try. */ +#define NETCONN_FLAG_WRITE_DELAYED 0x01 +/** Should this netconn avoid blocking? */ +#define NETCONN_FLAG_NON_BLOCKING 0x02 +/** Was the last connect action a non-blocking one? */ +#define NETCONN_FLAG_IN_NONBLOCKING_CONNECT 0x04 +/** If this is set, a TCP netconn must call netconn_recved() to update + the TCP receive window (done automatically if not set). */ +#define NETCONN_FLAG_NO_AUTO_RECVED 0x08 +/** If a nonblocking write has been rejected before, poll_tcp needs to + check if the netconn is writable again */ +#define NETCONN_FLAG_CHECK_WRITESPACE 0x10 + + +/* Helpers to process several netconn_types by the same code */ +#define NETCONNTYPE_GROUP(t) (t&0xF0) +#define NETCONNTYPE_DATAGRAM(t) (t&0xE0) + +/** Protocol family and type of the netconn */ +enum netconn_type { + NETCONN_INVALID = 0, + /* NETCONN_TCP Group */ + NETCONN_TCP = 0x10, + /* NETCONN_UDP Group */ + NETCONN_UDP = 0x20, + NETCONN_UDPLITE = 0x21, + NETCONN_UDPNOCHKSUM= 0x22, + /* NETCONN_RAW Group */ + NETCONN_RAW = 0x40 +}; + +/** Current state of the netconn. Non-TCP netconns are always + * in state NETCONN_NONE! */ +enum netconn_state { + NETCONN_NONE, + NETCONN_WRITE, + NETCONN_LISTEN, + NETCONN_CONNECT, + NETCONN_CLOSE +}; + +/** Use to inform the callback function about changes */ +enum netconn_evt { + NETCONN_EVT_RCVPLUS, + NETCONN_EVT_RCVMINUS, + NETCONN_EVT_SENDPLUS, + NETCONN_EVT_SENDMINUS, + NETCONN_EVT_ERROR +}; + +#if LWIP_IGMP +/** Used for netconn_join_leave_group() */ +enum netconn_igmp { + NETCONN_JOIN, + NETCONN_LEAVE +}; +#endif /* LWIP_IGMP */ + +/* forward-declare some structs to avoid to include their headers */ +struct ip_pcb; +struct tcp_pcb; +struct udp_pcb; +struct raw_pcb; +struct netconn; +struct api_msg_msg; + +/** A callback prototype to inform about events for a netconn */ +typedef void (* netconn_callback)(struct netconn *, enum netconn_evt, u16_t len); + +/** A netconn descriptor */ +struct netconn { + /** type of the netconn (TCP, UDP or RAW) */ + enum netconn_type type; + /** current state of the netconn */ + enum netconn_state state; + /** the lwIP internal protocol control block */ + union { + struct ip_pcb *ip; + struct tcp_pcb *tcp; + struct udp_pcb *udp; + struct raw_pcb *raw; + } pcb; + /** the last error this netconn had */ + err_t last_err; + /** sem that is used to synchroneously execute functions in the core context */ + sys_sem_t op_completed; + /** mbox where received packets are stored until they are fetched + by the netconn application thread (can grow quite big) */ + sys_mbox_t recvmbox; +#if LWIP_TCP + /** mbox where new connections are stored until processed + by the application thread */ + sys_mbox_t acceptmbox; +#endif /* LWIP_TCP */ + /** only used for socket layer */ +#if LWIP_SOCKET + int socket; +#endif /* LWIP_SOCKET */ +#if LWIP_SO_SNDTIMEO + /** timeout to wait for sending data (which means enqueueing data for sending + in internal buffers) */ + s32_t send_timeout; +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVTIMEO + /** timeout to wait for new data to be received + (or connections to arrive for listening netconns) */ + int recv_timeout; +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF + /** maximum amount of bytes queued in recvmbox + not used for TCP: adjust TCP_WND instead! */ + int recv_bufsize; + /** number of bytes currently in recvmbox to be received, + tested against recv_bufsize to limit bytes on recvmbox + for UDP and RAW, used for FIONREAD */ + s16_t recv_avail; +#endif /* LWIP_SO_RCVBUF */ + /** flags holding more netconn-internal state, see NETCONN_FLAG_* defines */ + u8_t flags; +#if LWIP_TCP + /** TCP: when data passed to netconn_write doesn't fit into the send buffer, + this temporarily stores how much is already sent. */ + size_t write_offset; + /** TCP: when data passed to netconn_write doesn't fit into the send buffer, + this temporarily stores the message. + Also used during connect and close. */ + struct api_msg_msg *current_msg; +#endif /* LWIP_TCP */ + /** A callback function that is informed about events for this netconn */ + netconn_callback callback; +}; + +/** Register an Network connection event */ +#define API_EVENT(c,e,l) if (c->callback) { \ + (*c->callback)(c, e, l); \ + } + +/** Set conn->last_err to err but don't overwrite fatal errors */ +#define NETCONN_SET_SAFE_ERR(conn, err) do { \ + SYS_ARCH_DECL_PROTECT(lev); \ + SYS_ARCH_PROTECT(lev); \ + if (!ERR_IS_FATAL((conn)->last_err)) { \ + (conn)->last_err = err; \ + } \ + SYS_ARCH_UNPROTECT(lev); \ +} while(0); + +/* Network connection functions: */ +#define netconn_new(t) netconn_new_with_proto_and_callback(t, 0, NULL) +#define netconn_new_with_callback(t, c) netconn_new_with_proto_and_callback(t, 0, c) +struct +netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, + netconn_callback callback); +err_t netconn_delete(struct netconn *conn); +/** Get the type of a netconn (as enum netconn_type). */ +#define netconn_type(conn) (conn->type) + +err_t netconn_getaddr(struct netconn *conn, ip_addr_t *addr, + u16_t *port, u8_t local); +#define netconn_peer(c,i,p) netconn_getaddr(c,i,p,0) +#define netconn_addr(c,i,p) netconn_getaddr(c,i,p,1) + +err_t netconn_bind(struct netconn *conn, ip_addr_t *addr, u16_t port); +err_t netconn_connect(struct netconn *conn, ip_addr_t *addr, u16_t port); +err_t netconn_disconnect (struct netconn *conn); +err_t netconn_listen_with_backlog(struct netconn *conn, u8_t backlog); +#define netconn_listen(conn) netconn_listen_with_backlog(conn, TCP_DEFAULT_LISTEN_BACKLOG) +err_t netconn_accept(struct netconn *conn, struct netconn **new_conn); +err_t netconn_recv(struct netconn *conn, struct netbuf **new_buf); +err_t netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf); +void netconn_recved(struct netconn *conn, u32_t length); +err_t netconn_sendto(struct netconn *conn, struct netbuf *buf, + ip_addr_t *addr, u16_t port); +err_t netconn_send(struct netconn *conn, struct netbuf *buf); +err_t netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size, + u8_t apiflags, size_t *bytes_written); +#define netconn_write(conn, dataptr, size, apiflags) \ + netconn_write_partly(conn, dataptr, size, apiflags, NULL) +err_t netconn_close(struct netconn *conn); +err_t netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx); + +#if LWIP_IGMP +err_t netconn_join_leave_group(struct netconn *conn, ip_addr_t *multiaddr, + ip_addr_t *netif_addr, enum netconn_igmp join_or_leave); +#endif /* LWIP_IGMP */ +#if LWIP_DNS +err_t netconn_gethostbyname(const char *name, ip_addr_t *addr); +#endif /* LWIP_DNS */ + +#define netconn_err(conn) ((conn)->last_err) +#define netconn_recv_bufsize(conn) ((conn)->recv_bufsize) + +/** Set the blocking status of netconn calls (@todo: write/send is missing) */ +#define netconn_set_nonblocking(conn, val) do { if(val) { \ + (conn)->flags |= NETCONN_FLAG_NON_BLOCKING; \ +} else { \ + (conn)->flags &= ~ NETCONN_FLAG_NON_BLOCKING; }} while(0) +/** Get the blocking status of netconn calls (@todo: write/send is missing) */ +#define netconn_is_nonblocking(conn) (((conn)->flags & NETCONN_FLAG_NON_BLOCKING) != 0) + +/** TCP: Set the no-auto-recved status of netconn calls (see NETCONN_FLAG_NO_AUTO_RECVED) */ +#define netconn_set_noautorecved(conn, val) do { if(val) { \ + (conn)->flags |= NETCONN_FLAG_NO_AUTO_RECVED; \ +} else { \ + (conn)->flags &= ~ NETCONN_FLAG_NO_AUTO_RECVED; }} while(0) +/** TCP: Get the no-auto-recved status of netconn calls (see NETCONN_FLAG_NO_AUTO_RECVED) */ +#define netconn_get_noautorecved(conn) (((conn)->flags & NETCONN_FLAG_NO_AUTO_RECVED) != 0) + +#if LWIP_SO_SNDTIMEO +/** Set the send timeout in milliseconds */ +#define netconn_set_sendtimeout(conn, timeout) ((conn)->send_timeout = (timeout)) +/** Get the send timeout in milliseconds */ +#define netconn_get_sendtimeout(conn) ((conn)->send_timeout) +#endif /* LWIP_SO_SNDTIMEO */ +#if LWIP_SO_RCVTIMEO +/** Set the receive timeout in milliseconds */ +#define netconn_set_recvtimeout(conn, timeout) ((conn)->recv_timeout = (timeout)) +/** Get the receive timeout in milliseconds */ +#define netconn_get_recvtimeout(conn) ((conn)->recv_timeout) +#endif /* LWIP_SO_RCVTIMEO */ +#if LWIP_SO_RCVBUF +/** Set the receive buffer in bytes */ +#define netconn_set_recvbufsize(conn, recvbufsize) ((conn)->recv_bufsize = (recvbufsize)) +/** Get the receive buffer in bytes */ +#define netconn_get_recvbufsize(conn) ((conn)->recv_bufsize) +#endif /* LWIP_SO_RCVBUF*/ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_NETCONN */ + +#endif /* __LWIP_API_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/api_msg.h b/third_party/lwip-1.4.1/src/include/lwip/api_msg.h new file mode 100644 index 0000000..318477f --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/api_msg.h @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_API_MSG_H__ +#define __LWIP_API_MSG_H__ + +#include "lwip/opt.h" + +#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */ + +#include /* for size_t */ + +#include "lwip/ip_addr.h" +#include "lwip/err.h" +#include "lwip/sys.h" +#include "lwip/igmp.h" +#include "lwip/api.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* For the netconn API, these values are use as a bitmask! */ +#define NETCONN_SHUT_RD 1 +#define NETCONN_SHUT_WR 2 +#define NETCONN_SHUT_RDWR (NETCONN_SHUT_RD | NETCONN_SHUT_WR) + +/* IP addresses and port numbers are expected to be in + * the same byte order as in the corresponding pcb. + */ +/** This struct includes everything that is necessary to execute a function + for a netconn in another thread context (mainly used to process netconns + in the tcpip_thread context to be thread safe). */ +struct api_msg_msg { + /** The netconn which to process - always needed: it includes the semaphore + which is used to block the application thread until the function finished. */ + struct netconn *conn; + /** The return value of the function executed in tcpip_thread. */ + err_t err; + /** Depending on the executed function, one of these union members is used */ + union { + /** used for do_send */ + struct netbuf *b; + /** used for do_newconn */ + struct { + u8_t proto; + } n; + /** used for do_bind and do_connect */ + struct { + ip_addr_t *ipaddr; + u16_t port; + } bc; + /** used for do_getaddr */ + struct { + ip_addr_t *ipaddr; + u16_t *port; + u8_t local; + } ad; + /** used for do_write */ + struct { + const void *dataptr; + size_t len; + u8_t apiflags; +#if LWIP_SO_SNDTIMEO + u32_t time_started; +#endif /* LWIP_SO_SNDTIMEO */ + } w; + /** used for do_recv */ + struct { + u32_t len; + } r; + /** used for do_close (/shutdown) */ + struct { + u8_t shut; + } sd; +#if LWIP_IGMP + /** used for do_join_leave_group */ + struct { + ip_addr_t *multiaddr; + ip_addr_t *netif_addr; + enum netconn_igmp join_or_leave; + } jl; +#endif /* LWIP_IGMP */ +#if TCP_LISTEN_BACKLOG + struct { + u8_t backlog; + } lb; +#endif /* TCP_LISTEN_BACKLOG */ + } msg; +}; + +/** This struct contains a function to execute in another thread context and + a struct api_msg_msg that serves as an argument for this function. + This is passed to tcpip_apimsg to execute functions in tcpip_thread context. */ +struct api_msg { + /** function to execute in tcpip_thread context */ + void (* function)(struct api_msg_msg *msg); + /** arguments for this function */ + struct api_msg_msg msg; +}; + +#if LWIP_DNS +/** As do_gethostbyname requires more arguments but doesn't require a netconn, + it has its own struct (to avoid struct api_msg getting bigger than necessary). + do_gethostbyname must be called using tcpip_callback instead of tcpip_apimsg + (see netconn_gethostbyname). */ +struct dns_api_msg { + /** Hostname to query or dotted IP address string */ + const char *name; + /** Rhe resolved address is stored here */ + ip_addr_t *addr; + /** This semaphore is posted when the name is resolved, the application thread + should wait on it. */ + sys_sem_t *sem; + /** Errors are given back here */ + err_t *err; +}; +#endif /* LWIP_DNS */ + +void do_newconn ( struct api_msg_msg *msg); +void do_delconn ( struct api_msg_msg *msg); +void do_bind ( struct api_msg_msg *msg); +void do_connect ( struct api_msg_msg *msg); +void do_disconnect ( struct api_msg_msg *msg); +void do_listen ( struct api_msg_msg *msg); +void do_send ( struct api_msg_msg *msg); +void do_recv ( struct api_msg_msg *msg); +void do_write ( struct api_msg_msg *msg); +void do_getaddr ( struct api_msg_msg *msg); +void do_close ( struct api_msg_msg *msg); +void do_shutdown ( struct api_msg_msg *msg); +#if LWIP_IGMP +void do_join_leave_group( struct api_msg_msg *msg); +#endif /* LWIP_IGMP */ + +#if LWIP_DNS +void do_gethostbyname(void *arg); +#endif /* LWIP_DNS */ + +struct netconn* netconn_alloc(enum netconn_type t, netconn_callback callback); +void netconn_free(struct netconn *conn); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_NETCONN */ + +#endif /* __LWIP_API_MSG_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/arch.h b/third_party/lwip-1.4.1/src/include/lwip/arch.h new file mode 100644 index 0000000..919a6cf --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/arch.h @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_ARCH_H__ +#define __LWIP_ARCH_H__ + +#ifndef LITTLE_ENDIAN +#define LITTLE_ENDIAN 1234 +#endif + +#ifndef BIG_ENDIAN +#define BIG_ENDIAN 4321 +#endif + +#include "arch/cc.h" + +/** Temporary: define format string for size_t if not defined in cc.h */ +#ifndef SZT_F +#define SZT_F U32_F +#endif /* SZT_F */ +/** Temporary upgrade helper: define format string for u8_t as hex if not + defined in cc.h */ +#ifndef X8_F +#define X8_F "02x" +#endif /* X8_F */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef PACK_STRUCT_BEGIN +#define PACK_STRUCT_BEGIN +#endif /* PACK_STRUCT_BEGIN */ + +#ifndef PACK_STRUCT_END +#define PACK_STRUCT_END +#endif /* PACK_STRUCT_END */ + +#ifndef PACK_STRUCT_FIELD +#define PACK_STRUCT_FIELD(x) x +#endif /* PACK_STRUCT_FIELD */ + + +#ifndef LWIP_UNUSED_ARG +#define LWIP_UNUSED_ARG(x) (void)x +#endif /* LWIP_UNUSED_ARG */ + + +#ifdef LWIP_PROVIDE_ERRNO + +#define EPERM 1 /* Operation not permitted */ +#define ENOENT 2 /* No such file or directory */ +#define ESRCH 3 /* No such process */ +#define EINTR 4 /* Interrupted system call */ +#define EIO 5 /* I/O error */ +#define ENXIO 6 /* No such device or address */ +#define E2BIG 7 /* Arg list too long */ +#define ENOEXEC 8 /* Exec format error */ +#define EBADF 9 /* Bad file number */ +#define ECHILD 10 /* No child processes */ +#define EAGAIN 11 /* Try again */ +#define ENOMEM 12 /* Out of memory */ +#define EACCES 13 /* Permission denied */ +#define EFAULT 14 /* Bad address */ +#define ENOTBLK 15 /* Block device required */ +#define EBUSY 16 /* Device or resource busy */ +#define EEXIST 17 /* File exists */ +#define EXDEV 18 /* Cross-device link */ +#define ENODEV 19 /* No such device */ +#define ENOTDIR 20 /* Not a directory */ +#define EISDIR 21 /* Is a directory */ +#define EINVAL 22 /* Invalid argument */ +#define ENFILE 23 /* File table overflow */ +#define EMFILE 24 /* Too many open files */ +#define ENOTTY 25 /* Not a typewriter */ +#define ETXTBSY 26 /* Text file busy */ +#define EFBIG 27 /* File too large */ +#define ENOSPC 28 /* No space left on device */ +#define ESPIPE 29 /* Illegal seek */ +#define EROFS 30 /* Read-only file system */ +#define EMLINK 31 /* Too many links */ +#define EPIPE 32 /* Broken pipe */ +#define EDOM 33 /* Math argument out of domain of func */ +#define ERANGE 34 /* Math result not representable */ +#define EDEADLK 35 /* Resource deadlock would occur */ +#define ENAMETOOLONG 36 /* File name too long */ +#define ENOLCK 37 /* No record locks available */ +#define ENOSYS 38 /* Function not implemented */ +#define ENOTEMPTY 39 /* Directory not empty */ +#define ELOOP 40 /* Too many symbolic links encountered */ +#define EWOULDBLOCK EAGAIN /* Operation would block */ +#define ENOMSG 42 /* No message of desired type */ +#define EIDRM 43 /* Identifier removed */ +#define ECHRNG 44 /* Channel number out of range */ +#define EL2NSYNC 45 /* Level 2 not synchronized */ +#define EL3HLT 46 /* Level 3 halted */ +#define EL3RST 47 /* Level 3 reset */ +#define ELNRNG 48 /* Link number out of range */ +#define EUNATCH 49 /* Protocol driver not attached */ +#define ENOCSI 50 /* No CSI structure available */ +#define EL2HLT 51 /* Level 2 halted */ +#define EBADE 52 /* Invalid exchange */ +#define EBADR 53 /* Invalid request descriptor */ +#define EXFULL 54 /* Exchange full */ +#define ENOANO 55 /* No anode */ +#define EBADRQC 56 /* Invalid request code */ +#define EBADSLT 57 /* Invalid slot */ + +#define EDEADLOCK EDEADLK + +#define EBFONT 59 /* Bad font file format */ +#define ENOSTR 60 /* Device not a stream */ +#define ENODATA 61 /* No data available */ +#define ETIME 62 /* Timer expired */ +#define ENOSR 63 /* Out of streams resources */ +#define ENONET 64 /* Machine is not on the network */ +#define ENOPKG 65 /* Package not installed */ +#define EREMOTE 66 /* Object is remote */ +#define ENOLINK 67 /* Link has been severed */ +#define EADV 68 /* Advertise error */ +#define ESRMNT 69 /* Srmount error */ +#define ECOMM 70 /* Communication error on send */ +#define EPROTO 71 /* Protocol error */ +#define EMULTIHOP 72 /* Multihop attempted */ +#define EDOTDOT 73 /* RFS specific error */ +#define EBADMSG 74 /* Not a data message */ +#define EOVERFLOW 75 /* Value too large for defined data type */ +#define ENOTUNIQ 76 /* Name not unique on network */ +#define EBADFD 77 /* File descriptor in bad state */ +#define EREMCHG 78 /* Remote address changed */ +#define ELIBACC 79 /* Can not access a needed shared library */ +#define ELIBBAD 80 /* Accessing a corrupted shared library */ +#define ELIBSCN 81 /* .lib section in a.out corrupted */ +#define ELIBMAX 82 /* Attempting to link in too many shared libraries */ +#define ELIBEXEC 83 /* Cannot exec a shared library directly */ +#define EILSEQ 84 /* Illegal byte sequence */ +#define ERESTART 85 /* Interrupted system call should be restarted */ +#define ESTRPIPE 86 /* Streams pipe error */ +#define EUSERS 87 /* Too many users */ +#define ENOTSOCK 88 /* Socket operation on non-socket */ +#define EDESTADDRREQ 89 /* Destination address required */ +#define EMSGSIZE 90 /* Message too long */ +#define EPROTOTYPE 91 /* Protocol wrong type for socket */ +#define ENOPROTOOPT 92 /* Protocol not available */ +#define EPROTONOSUPPORT 93 /* Protocol not supported */ +#define ESOCKTNOSUPPORT 94 /* Socket type not supported */ +#define EOPNOTSUPP 95 /* Operation not supported on transport endpoint */ +#define EPFNOSUPPORT 96 /* Protocol family not supported */ +#define EAFNOSUPPORT 97 /* Address family not supported by protocol */ +#define EADDRINUSE 98 /* Address already in use */ +#define EADDRNOTAVAIL 99 /* Cannot assign requested address */ +#define ENETDOWN 100 /* Network is down */ +#define ENETUNREACH 101 /* Network is unreachable */ +#define ENETRESET 102 /* Network dropped connection because of reset */ +#define ECONNABORTED 103 /* Software caused connection abort */ +#define ECONNRESET 104 /* Connection reset by peer */ +#define ENOBUFS 105 /* No buffer space available */ +#define EISCONN 106 /* Transport endpoint is already connected */ +#define ENOTCONN 107 /* Transport endpoint is not connected */ +#define ESHUTDOWN 108 /* Cannot send after transport endpoint shutdown */ +#define ETOOMANYREFS 109 /* Too many references: cannot splice */ +#define ETIMEDOUT 110 /* Connection timed out */ +#define ECONNREFUSED 111 /* Connection refused */ +#define EHOSTDOWN 112 /* Host is down */ +#define EHOSTUNREACH 113 /* No route to host */ +#define EALREADY 114 /* Operation already in progress */ +#define EINPROGRESS 115 /* Operation now in progress */ +#define ESTALE 116 /* Stale NFS file handle */ +#define EUCLEAN 117 /* Structure needs cleaning */ +#define ENOTNAM 118 /* Not a XENIX named type file */ +#define ENAVAIL 119 /* No XENIX semaphores available */ +#define EISNAM 120 /* Is a named type file */ +#define EREMOTEIO 121 /* Remote I/O error */ +#define EDQUOT 122 /* Quota exceeded */ + +#define ENOMEDIUM 123 /* No medium found */ +#define EMEDIUMTYPE 124 /* Wrong medium type */ + +#ifndef errno +extern int errno; +#endif + +#endif /* LWIP_PROVIDE_ERRNO */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_ARCH_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/debug.h b/third_party/lwip-1.4.1/src/include/lwip/debug.h new file mode 100644 index 0000000..7c4143a --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/debug.h @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_DEBUG_H__ +#define __LWIP_DEBUG_H__ + +#include "lwip/arch.h" +#include "lwip/opt.h" + +/** lower two bits indicate debug level + * - 0 all + * - 1 warning + * - 2 serious + * - 3 severe + */ +#define LWIP_DBG_LEVEL_ALL 0x00 +#define LWIP_DBG_LEVEL_OFF LWIP_DBG_LEVEL_ALL /* compatibility define only */ +#define LWIP_DBG_LEVEL_WARNING 0x01 /* bad checksums, dropped packets, ... */ +#define LWIP_DBG_LEVEL_SERIOUS 0x02 /* memory allocation failures, ... */ +#define LWIP_DBG_LEVEL_SEVERE 0x03 +#define LWIP_DBG_MASK_LEVEL 0x03 + +/** flag for LWIP_DEBUGF to enable that debug message */ +#define LWIP_DBG_ON 0x80U +/** flag for LWIP_DEBUGF to disable that debug message */ +#define LWIP_DBG_OFF 0x00U + +/** flag for LWIP_DEBUGF indicating a tracing message (to follow program flow) */ +#define LWIP_DBG_TRACE 0x40U +/** flag for LWIP_DEBUGF indicating a state debug message (to follow module states) */ +#define LWIP_DBG_STATE 0x20U +/** flag for LWIP_DEBUGF indicating newly added code, not thoroughly tested yet */ +#define LWIP_DBG_FRESH 0x10U +/** flag for LWIP_DEBUGF to halt after printing this debug message */ +#define LWIP_DBG_HALT 0x08U + +#ifndef LWIP_NOASSERT +#define LWIP_ASSERT(message, assertion) do { if(!(assertion)) \ + LWIP_PLATFORM_ASSERT(message); } while(0) +#else /* LWIP_NOASSERT */ +#define LWIP_ASSERT(message, assertion) +#endif /* LWIP_NOASSERT */ + +/** if "expression" isn't true, then print "message" and execute "handler" expression */ +#ifndef LWIP_ERROR +#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \ + LWIP_PLATFORM_ASSERT(message); handler;}} while(0) +#endif /* LWIP_ERROR */ + +#ifdef LWIP_DEBUG +/** print debug message only if debug message type is enabled... + * AND is of correct type AND is at least LWIP_DBG_LEVEL + */ +#define LWIP_DEBUGF(debug, message) do { \ + if ( \ + ((debug) & LWIP_DBG_ON) && \ + ((debug) & LWIP_DBG_TYPES_ON) && \ + ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \ + LWIP_PLATFORM_DIAG(message); \ + if ((debug) & LWIP_DBG_HALT) { \ + while(1); \ + } \ + } \ + } while(0) + +#else /* LWIP_DEBUG */ +#define LWIP_DEBUGF(debug, message) +#endif /* LWIP_DEBUG */ + +#endif /* __LWIP_DEBUG_H__ */ + diff --git a/third_party/lwip-1.4.1/src/include/lwip/def.h b/third_party/lwip-1.4.1/src/include/lwip/def.h new file mode 100644 index 0000000..93b7ca9 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/def.h @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_DEF_H__ +#define __LWIP_DEF_H__ + +/* arch.h might define NULL already */ +#include "lwip/arch.h" +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define LWIP_MAX(x , y) (((x) > (y)) ? (x) : (y)) +#define LWIP_MIN(x , y) (((x) < (y)) ? (x) : (y)) + +#ifndef NULL +#define NULL ((void *)0) +#endif + +/* Endianess-optimized shifting of two u8_t to create one u16_t */ +#if BYTE_ORDER == LITTLE_ENDIAN +#define LWIP_MAKE_U16(a, b) ((a << 8) | b) +#else +#define LWIP_MAKE_U16(a, b) ((b << 8) | a) +#endif + +#ifndef LWIP_PLATFORM_BYTESWAP +#define LWIP_PLATFORM_BYTESWAP 0 +#endif + +#ifndef LWIP_PREFIX_BYTEORDER_FUNCS +/* workaround for naming collisions on some platforms */ + +#ifdef htons +#undef htons +#endif /* htons */ +#ifdef htonl +#undef htonl +#endif /* htonl */ +#ifdef ntohs +#undef ntohs +#endif /* ntohs */ +#ifdef ntohl +#undef ntohl +#endif /* ntohl */ + +#define htons(x) lwip_htons(x) +#define ntohs(x) lwip_ntohs(x) +#define htonl(x) lwip_htonl(x) +#define ntohl(x) lwip_ntohl(x) +#endif /* LWIP_PREFIX_BYTEORDER_FUNCS */ + +#if BYTE_ORDER == BIG_ENDIAN +#define lwip_htons(x) (x) +#define lwip_ntohs(x) (x) +#define lwip_htonl(x) (x) +#define lwip_ntohl(x) (x) +#define PP_HTONS(x) (x) +#define PP_NTOHS(x) (x) +#define PP_HTONL(x) (x) +#define PP_NTOHL(x) (x) +#else /* BYTE_ORDER != BIG_ENDIAN */ +#if LWIP_PLATFORM_BYTESWAP +#define lwip_htons(x) LWIP_PLATFORM_HTONS(x) +#define lwip_ntohs(x) LWIP_PLATFORM_HTONS(x) +#define lwip_htonl(x) LWIP_PLATFORM_HTONL(x) +#define lwip_ntohl(x) LWIP_PLATFORM_HTONL(x) +#else /* LWIP_PLATFORM_BYTESWAP */ +u16_t lwip_htons(u16_t x); +u16_t lwip_ntohs(u16_t x); +u32_t lwip_htonl(u32_t x); +u32_t lwip_ntohl(u32_t x); +#endif /* LWIP_PLATFORM_BYTESWAP */ + +/* These macros should be calculated by the preprocessor and are used + with compile-time constants only (so that there is no little-endian + overhead at runtime). */ +#define PP_HTONS(x) ((((x) & 0xff) << 8) | (((x) & 0xff00) >> 8)) +#define PP_NTOHS(x) PP_HTONS(x) +#define PP_HTONL(x) ((((x) & 0xff) << 24) | \ + (((x) & 0xff00) << 8) | \ + (((x) & 0xff0000UL) >> 8) | \ + (((x) & 0xff000000UL) >> 24)) +#define PP_NTOHL(x) PP_HTONL(x) + +#endif /* BYTE_ORDER == BIG_ENDIAN */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_DEF_H__ */ + diff --git a/third_party/lwip-1.4.1/src/include/lwip/dhcp.h b/third_party/lwip-1.4.1/src/include/lwip/dhcp.h new file mode 100644 index 0000000..e7afd30 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/dhcp.h @@ -0,0 +1,242 @@ +/** @file + */ + +#ifndef __LWIP_DHCP_H__ +#define __LWIP_DHCP_H__ + +#include "lwip/opt.h" + +#if LWIP_DHCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/netif.h" +#include "lwip/udp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** period (in seconds) of the application calling dhcp_coarse_tmr() */ +#define DHCP_COARSE_TIMER_SECS 60 +/** period (in milliseconds) of the application calling dhcp_coarse_tmr() */ +#define DHCP_COARSE_TIMER_MSECS (DHCP_COARSE_TIMER_SECS * 1000UL) +/** period (in milliseconds) of the application calling dhcp_fine_tmr() */ +#define DHCP_FINE_TIMER_MSECS 500 + +#define DHCP_CHADDR_LEN 16U +#define DHCP_SNAME_LEN 64U +#define DHCP_FILE_LEN 128U + +struct dhcp +{ + /** transaction identifier of last sent request */ + u32_t xid; + /** our connection to the DHCP server */ + struct udp_pcb *pcb; + /** incoming msg */ + struct dhcp_msg *msg_in; + /** current DHCP state machine state */ + u8_t state; + /** retries of current request */ + u8_t tries; +#if LWIP_DHCP_AUTOIP_COOP + u8_t autoip_coop_state; +#endif + u8_t subnet_mask_given; + + struct pbuf *p_out; /* pbuf of outcoming msg */ + struct dhcp_msg *msg_out; /* outgoing msg */ + u16_t options_out_len; /* outgoing msg options length */ + u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */ + u16_t t1_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */ + u16_t t2_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */ + ip_addr_t server_ip_addr; /* dhcp server address that offered this lease */ + ip_addr_t offered_ip_addr; + ip_addr_t offered_sn_mask; + ip_addr_t offered_gw_addr; + + u32_t offered_t0_lease; /* lease period (in seconds) */ + u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */ + u32_t offered_t2_rebind; /* recommended rebind time (usually 66% of lease period) */ + /* @todo: LWIP_DHCP_BOOTP_FILE configuration option? + integrate with possible TFTP-client for booting? */ +#if LWIP_DHCP_BOOTP_FILE + ip_addr_t offered_si_addr; + char boot_file_name[DHCP_FILE_LEN]; +#endif /* LWIP_DHCP_BOOTPFILE */ +}; + +/* MUST be compiled with "pack structs" or equivalent! */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** minimum set of fields of any DHCP message */ +struct dhcp_msg +{ + PACK_STRUCT_FIELD(u8_t op); + PACK_STRUCT_FIELD(u8_t htype); + PACK_STRUCT_FIELD(u8_t hlen); + PACK_STRUCT_FIELD(u8_t hops); + PACK_STRUCT_FIELD(u32_t xid); + PACK_STRUCT_FIELD(u16_t secs); + PACK_STRUCT_FIELD(u16_t flags); + PACK_STRUCT_FIELD(ip_addr_p_t ciaddr); + PACK_STRUCT_FIELD(ip_addr_p_t yiaddr); + PACK_STRUCT_FIELD(ip_addr_p_t siaddr); + PACK_STRUCT_FIELD(ip_addr_p_t giaddr); + PACK_STRUCT_FIELD(u8_t chaddr[DHCP_CHADDR_LEN]); + PACK_STRUCT_FIELD(u8_t sname[DHCP_SNAME_LEN]); + PACK_STRUCT_FIELD(u8_t file[DHCP_FILE_LEN]); + PACK_STRUCT_FIELD(u32_t cookie); +#define DHCP_MIN_OPTIONS_LEN 68U +/** make sure user does not configure this too small */ +#if ((defined(DHCP_OPTIONS_LEN)) && (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN)) +# undef DHCP_OPTIONS_LEN +#endif +/** allow this to be configured in lwipopts.h, but not too small */ +#if (!defined(DHCP_OPTIONS_LEN)) +/** set this to be sufficient for your options in outgoing DHCP msgs */ +# define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN +#endif + PACK_STRUCT_FIELD(u8_t options[DHCP_OPTIONS_LEN]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +void dhcp_set_struct(struct netif *netif, struct dhcp *dhcp); +/** Remove a struct dhcp previously set to the netif using dhcp_set_struct() */ +#define dhcp_remove_struct(netif) do { (netif)->dhcp = NULL; } while(0) +void dhcp_cleanup(struct netif *netif); +/** start DHCP configuration */ +err_t dhcp_start(struct netif *netif); +/** enforce early lease renewal (not needed normally)*/ +err_t dhcp_renew(struct netif *netif); +/** release the DHCP lease, usually called before dhcp_stop()*/ +err_t dhcp_release(struct netif *netif); +/** stop DHCP configuration */ +void dhcp_stop(struct netif *netif); +/** inform server of our manual IP address */ +void dhcp_inform(struct netif *netif); +/** Handle a possible change in the network configuration */ +void dhcp_network_changed(struct netif *netif); + +/** if enabled, check whether the offered IP address is not in use, using ARP */ +#if DHCP_DOES_ARP_CHECK +void dhcp_arp_reply(struct netif *netif, ip_addr_t *addr); +#endif + +/** to be called every minute */ +void dhcp_coarse_tmr(void); +/** to be called every half second */ +void dhcp_fine_tmr(void); + +/** DHCP message item offsets and length */ +#define DHCP_OP_OFS 0 +#define DHCP_HTYPE_OFS 1 +#define DHCP_HLEN_OFS 2 +#define DHCP_HOPS_OFS 3 +#define DHCP_XID_OFS 4 +#define DHCP_SECS_OFS 8 +#define DHCP_FLAGS_OFS 10 +#define DHCP_CIADDR_OFS 12 +#define DHCP_YIADDR_OFS 16 +#define DHCP_SIADDR_OFS 20 +#define DHCP_GIADDR_OFS 24 +#define DHCP_CHADDR_OFS 28 +#define DHCP_SNAME_OFS 44 +#define DHCP_FILE_OFS 108 +#define DHCP_MSG_LEN 236 + +#define DHCP_COOKIE_OFS DHCP_MSG_LEN +#define DHCP_OPTIONS_OFS (DHCP_MSG_LEN + 4) + +#define DHCP_CLIENT_PORT 68 +#define DHCP_SERVER_PORT 67 + +/** DHCP client states */ +#define DHCP_OFF 0 +#define DHCP_REQUESTING 1 +#define DHCP_INIT 2 +#define DHCP_REBOOTING 3 +#define DHCP_REBINDING 4 +#define DHCP_RENEWING 5 +#define DHCP_SELECTING 6 +#define DHCP_INFORMING 7 +#define DHCP_CHECKING 8 +#define DHCP_PERMANENT 9 +#define DHCP_BOUND 10 +/** not yet implemented #define DHCP_RELEASING 11 */ +#define DHCP_BACKING_OFF 12 + +/** AUTOIP cooperatation flags */ +#define DHCP_AUTOIP_COOP_STATE_OFF 0 +#define DHCP_AUTOIP_COOP_STATE_ON 1 + +#define DHCP_BOOTREQUEST 1 +#define DHCP_BOOTREPLY 2 + +/** DHCP message types */ +#define DHCP_DISCOVER 1 +#define DHCP_OFFER 2 +#define DHCP_REQUEST 3 +#define DHCP_DECLINE 4 +#define DHCP_ACK 5 +#define DHCP_NAK 6 +#define DHCP_RELEASE 7 +#define DHCP_INFORM 8 + +/** DHCP hardware type, currently only ethernet is supported */ +#define DHCP_HTYPE_ETH 1 + +#define DHCP_MAGIC_COOKIE 0x63825363UL + +/* This is a list of options for BOOTP and DHCP, see RFC 2132 for descriptions */ + +/** BootP options */ +#define DHCP_OPTION_PAD 0 +#define DHCP_OPTION_SUBNET_MASK 1 /* RFC 2132 3.3 */ +#define DHCP_OPTION_ROUTER 3 +#define DHCP_OPTION_DNS_SERVER 6 +#define DHCP_OPTION_HOSTNAME 12 +#define DHCP_OPTION_IP_TTL 23 +#define DHCP_OPTION_MTU 26 +#define DHCP_OPTION_BROADCAST 28 +#define DHCP_OPTION_TCP_TTL 37 +#define DHCP_OPTION_END 255 + +/** DHCP options */ +#define DHCP_OPTION_REQUESTED_IP 50 /* RFC 2132 9.1, requested IP address */ +#define DHCP_OPTION_LEASE_TIME 51 /* RFC 2132 9.2, time in seconds, in 4 bytes */ +#define DHCP_OPTION_OVERLOAD 52 /* RFC2132 9.3, use file and/or sname field for options */ + +#define DHCP_OPTION_MESSAGE_TYPE 53 /* RFC 2132 9.6, important for DHCP */ +#define DHCP_OPTION_MESSAGE_TYPE_LEN 1 + +#define DHCP_OPTION_SERVER_ID 54 /* RFC 2132 9.7, server IP address */ +#define DHCP_OPTION_PARAMETER_REQUEST_LIST 55 /* RFC 2132 9.8, requested option types */ + +#define DHCP_OPTION_MAX_MSG_SIZE 57 /* RFC 2132 9.10, message size accepted >= 576 */ +#define DHCP_OPTION_MAX_MSG_SIZE_LEN 2 + +#define DHCP_OPTION_T1 58 /* T1 renewal time */ +#define DHCP_OPTION_T2 59 /* T2 rebinding time */ +#define DHCP_OPTION_US 60 +#define DHCP_OPTION_CLIENT_ID 61 +#define DHCP_OPTION_TFTP_SERVERNAME 66 +#define DHCP_OPTION_BOOTFILE 67 + +/** possible combinations of overloading the file and sname fields with options */ +#define DHCP_OVERLOAD_NONE 0 +#define DHCP_OVERLOAD_FILE 1 +#define DHCP_OVERLOAD_SNAME 2 +#define DHCP_OVERLOAD_SNAME_FILE 3 + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_DHCP */ + +#endif /*__LWIP_DHCP_H__*/ diff --git a/third_party/lwip-1.4.1/src/include/lwip/dns.h b/third_party/lwip-1.4.1/src/include/lwip/dns.h new file mode 100644 index 0000000..b41d23d --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/dns.h @@ -0,0 +1,124 @@ +/** + * lwip DNS resolver header file. + + * Author: Jim Pettinato + * April 2007 + + * ported from uIP resolv.c Copyright (c) 2002-2003, Adam Dunkels. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __LWIP_DNS_H__ +#define __LWIP_DNS_H__ + +#include "lwip/opt.h" + +#if LWIP_DNS /* don't build if not configured for use in lwipopts.h */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** DNS timer period */ +#define DNS_TMR_INTERVAL 1000 + +/** DNS field TYPE used for "Resource Records" */ +#define DNS_RRTYPE_A 1 /* a host address */ +#define DNS_RRTYPE_NS 2 /* an authoritative name server */ +#define DNS_RRTYPE_MD 3 /* a mail destination (Obsolete - use MX) */ +#define DNS_RRTYPE_MF 4 /* a mail forwarder (Obsolete - use MX) */ +#define DNS_RRTYPE_CNAME 5 /* the canonical name for an alias */ +#define DNS_RRTYPE_SOA 6 /* marks the start of a zone of authority */ +#define DNS_RRTYPE_MB 7 /* a mailbox domain name (EXPERIMENTAL) */ +#define DNS_RRTYPE_MG 8 /* a mail group member (EXPERIMENTAL) */ +#define DNS_RRTYPE_MR 9 /* a mail rename domain name (EXPERIMENTAL) */ +#define DNS_RRTYPE_NULL 10 /* a null RR (EXPERIMENTAL) */ +#define DNS_RRTYPE_WKS 11 /* a well known service description */ +#define DNS_RRTYPE_PTR 12 /* a domain name pointer */ +#define DNS_RRTYPE_HINFO 13 /* host information */ +#define DNS_RRTYPE_MINFO 14 /* mailbox or mail list information */ +#define DNS_RRTYPE_MX 15 /* mail exchange */ +#define DNS_RRTYPE_TXT 16 /* text strings */ + +/** DNS field CLASS used for "Resource Records" */ +#define DNS_RRCLASS_IN 1 /* the Internet */ +#define DNS_RRCLASS_CS 2 /* the CSNET class (Obsolete - used only for examples in some obsolete RFCs) */ +#define DNS_RRCLASS_CH 3 /* the CHAOS class */ +#define DNS_RRCLASS_HS 4 /* Hesiod [Dyer 87] */ +#define DNS_RRCLASS_FLUSH 0x800 /* Flush bit */ + +/* The size used for the next line is rather a hack, but it prevents including socket.h in all files + that include memp.h, and that would possibly break portability (since socket.h defines some types + and constants possibly already define by the OS). + Calculation rule: + sizeof(struct addrinfo) + sizeof(struct sockaddr_in) + DNS_MAX_NAME_LENGTH + 1 byte zero-termination */ +#define NETDB_ELEM_SIZE (32 + 16 + DNS_MAX_NAME_LENGTH + 1) + +#if DNS_LOCAL_HOSTLIST +/** struct used for local host-list */ +struct local_hostlist_entry { + /** static hostname */ + const char *name; + /** static host address in network byteorder */ + ip_addr_t addr; + struct local_hostlist_entry *next; +}; +#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC +#ifndef DNS_LOCAL_HOSTLIST_MAX_NAMELEN +#define DNS_LOCAL_HOSTLIST_MAX_NAMELEN DNS_MAX_NAME_LENGTH +#endif +#define LOCALHOSTLIST_ELEM_SIZE ((sizeof(struct local_hostlist_entry) + DNS_LOCAL_HOSTLIST_MAX_NAMELEN + 1)) +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ +#endif /* DNS_LOCAL_HOSTLIST */ + +/** Callback which is invoked when a hostname is found. + * A function of this type must be implemented by the application using the DNS resolver. + * @param name pointer to the name that was looked up. + * @param ipaddr pointer to an ip_addr_t containing the IP address of the hostname, + * or NULL if the name could not be found (or on any other error). + * @param callback_arg a user-specified callback argument passed to dns_gethostbyname +*/ +typedef void (*dns_found_callback)(const char *name, ip_addr_t *ipaddr, void *callback_arg); + +void dns_init(void); +void dns_tmr(void); +void dns_setserver(u8_t numdns, ip_addr_t *dnsserver); +ip_addr_t dns_getserver(u8_t numdns); +err_t dns_gethostbyname(const char *hostname, ip_addr_t *addr, + dns_found_callback found, void *callback_arg); + +#if DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC +int dns_local_removehost(const char *hostname, const ip_addr_t *addr); +err_t dns_local_addhost(const char *hostname, const ip_addr_t *addr); +#endif /* DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_DNS */ + +#endif /* __LWIP_DNS_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/err.h b/third_party/lwip-1.4.1/src/include/lwip/err.h new file mode 100644 index 0000000..837203d --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/err.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_ERR_H__ +#define __LWIP_ERR_H__ + +#include "lwip/opt.h" +#include "lwip/arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Define LWIP_ERR_T in cc.h if you want to use + * a different type for your platform (must be signed). */ +#ifdef LWIP_ERR_T +typedef LWIP_ERR_T err_t; +#else /* LWIP_ERR_T */ +typedef s8_t err_t; +#endif /* LWIP_ERR_T*/ + +/* Definitions for error constants. */ + +#define ERR_OK 0 /* No error, everything OK. */ +#define ERR_MEM -1 /* Out of memory error. */ +#define ERR_BUF -2 /* Buffer error. */ +#define ERR_TIMEOUT -3 /* Timeout. */ +#define ERR_RTE -4 /* Routing problem. */ +#define ERR_INPROGRESS -5 /* Operation in progress */ +#define ERR_VAL -6 /* Illegal value. */ +#define ERR_WOULDBLOCK -7 /* Operation would block. */ +#define ERR_USE -8 /* Address in use. */ +#define ERR_ISCONN -9 /* Already connected. */ + +#define ERR_IS_FATAL(e) ((e) < ERR_ISCONN) + +#define ERR_ABRT -10 /* Connection aborted. */ +#define ERR_RST -11 /* Connection reset. */ +#define ERR_CLSD -12 /* Connection closed. */ +#define ERR_CONN -13 /* Not connected. */ + +#define ERR_ARG -14 /* Illegal argument. */ + +#define ERR_IF -15 /* Low-level netif error */ + + +#ifdef LWIP_DEBUG +extern const char *lwip_strerr(err_t err); +#else +#define lwip_strerr(x) "" +#endif /* LWIP_DEBUG */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_ERR_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/init.h b/third_party/lwip-1.4.1/src/include/lwip/init.h new file mode 100644 index 0000000..e31e900 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/init.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_INIT_H__ +#define __LWIP_INIT_H__ + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** X.x.x: Major version of the stack */ +#define LWIP_VERSION_MAJOR 1U +/** x.X.x: Minor version of the stack */ +#define LWIP_VERSION_MINOR 4U +/** x.x.X: Revision of the stack */ +#define LWIP_VERSION_REVISION 1U +/** For release candidates, this is set to 1..254 + * For official releases, this is set to 255 (LWIP_RC_RELEASE) + * For development versions (CVS), this is set to 0 (LWIP_RC_DEVELOPMENT) */ +#define LWIP_VERSION_RC 255U + +/** LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases */ +#define LWIP_RC_RELEASE 255U +/** LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for CVS versions */ +#define LWIP_RC_DEVELOPMENT 0U + +#define LWIP_VERSION_IS_RELEASE (LWIP_VERSION_RC == LWIP_RC_RELEASE) +#define LWIP_VERSION_IS_DEVELOPMENT (LWIP_VERSION_RC == LWIP_RC_DEVELOPMENT) +#define LWIP_VERSION_IS_RC ((LWIP_VERSION_RC != LWIP_RC_RELEASE) && (LWIP_VERSION_RC != LWIP_RC_DEVELOPMENT)) + +/** Provides the version of the stack */ +#define LWIP_VERSION (LWIP_VERSION_MAJOR << 24 | LWIP_VERSION_MINOR << 16 | \ + LWIP_VERSION_REVISION << 8 | LWIP_VERSION_RC) + +/* Modules initialization */ +void lwip_init(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_INIT_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/mem.h b/third_party/lwip-1.4.1/src/include/lwip/mem.h new file mode 100644 index 0000000..26f79e8 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/mem.h @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_MEM_H__ +#define __LWIP_MEM_H__ + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if MEM_LIBC_MALLOC + +#include /* for size_t */ + +typedef size_t mem_size_t; +#define MEM_SIZE_F SZT_F + +/* aliases for C library malloc() */ +#define mem_init() +/* in case C library malloc() needs extra protection, + * allow these defines to be overridden. + */ +#ifndef mem_free +#define mem_free free +#endif +#ifndef mem_malloc +#define mem_malloc malloc +#endif +#ifndef mem_calloc +#define mem_calloc calloc +#endif +/* Since there is no C library allocation function to shrink memory without + moving it, define this to nothing. */ +#ifndef mem_trim +#define mem_trim(mem, size) (mem) +#endif +#else /* MEM_LIBC_MALLOC */ + +/* MEM_SIZE would have to be aligned, but using 64000 here instead of + * 65535 leaves some room for alignment... + */ +#if MEM_SIZE > 64000L +typedef u32_t mem_size_t; +#define MEM_SIZE_F U32_F +#else +typedef u16_t mem_size_t; +#define MEM_SIZE_F U16_F +#endif /* MEM_SIZE > 64000 */ + +#if MEM_USE_POOLS +/** mem_init is not used when using pools instead of a heap */ +#define mem_init() +/** mem_trim is not used when using pools instead of a heap: + we can't free part of a pool element and don't want to copy the rest */ +#define mem_trim(mem, size) (mem) +#else /* MEM_USE_POOLS */ +/* lwIP alternative malloc */ +void mem_init(void); +void *mem_trim(void *mem, mem_size_t size); +#endif /* MEM_USE_POOLS */ +void *mem_malloc(mem_size_t size); +void *mem_calloc(mem_size_t count, mem_size_t size); +void mem_free(void *mem); +#endif /* MEM_LIBC_MALLOC */ + +/** Calculate memory size for an aligned buffer - returns the next highest + * multiple of MEM_ALIGNMENT (e.g. LWIP_MEM_ALIGN_SIZE(3) and + * LWIP_MEM_ALIGN_SIZE(4) will both yield 4 for MEM_ALIGNMENT == 4). + */ +#ifndef LWIP_MEM_ALIGN_SIZE +#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1) & ~(MEM_ALIGNMENT-1)) +#endif + +/** Calculate safe memory size for an aligned buffer when using an unaligned + * type as storage. This includes a safety-margin on (MEM_ALIGNMENT - 1) at the + * start (e.g. if buffer is u8_t[] and actual data will be u32_t*) + */ +#ifndef LWIP_MEM_ALIGN_BUFFER +#define LWIP_MEM_ALIGN_BUFFER(size) (((size) + MEM_ALIGNMENT - 1)) +#endif + +/** Align a memory pointer to the alignment defined by MEM_ALIGNMENT + * so that ADDR % MEM_ALIGNMENT == 0 + */ +#ifndef LWIP_MEM_ALIGN +#define LWIP_MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1))) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_MEM_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/memp.h b/third_party/lwip-1.4.1/src/include/lwip/memp.h new file mode 100644 index 0000000..895217b --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/memp.h @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __LWIP_MEMP_H__ +#define __LWIP_MEMP_H__ + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end */ +typedef enum { +#define LWIP_MEMPOOL(name,num,size,desc) MEMP_##name, +#include "lwip/memp_std.h" + MEMP_MAX +} memp_t; + +#if MEM_USE_POOLS +/* Use a helper type to get the start and end of the user "memory pools" for mem_malloc */ +typedef enum { + /* Get the first (via: + MEMP_POOL_HELPER_START = ((u8_t) 1*MEMP_POOL_A + 0*MEMP_POOL_B + 0*MEMP_POOL_C + 0)*/ + MEMP_POOL_HELPER_FIRST = ((u8_t) +#define LWIP_MEMPOOL(name,num,size,desc) +#define LWIP_MALLOC_MEMPOOL_START 1 +#define LWIP_MALLOC_MEMPOOL(num, size) * MEMP_POOL_##size + 0 +#define LWIP_MALLOC_MEMPOOL_END +#include "lwip/memp_std.h" + ) , + /* Get the last (via: + MEMP_POOL_HELPER_END = ((u8_t) 0 + MEMP_POOL_A*0 + MEMP_POOL_B*0 + MEMP_POOL_C*1) */ + MEMP_POOL_HELPER_LAST = ((u8_t) +#define LWIP_MEMPOOL(name,num,size,desc) +#define LWIP_MALLOC_MEMPOOL_START +#define LWIP_MALLOC_MEMPOOL(num, size) 0 + MEMP_POOL_##size * +#define LWIP_MALLOC_MEMPOOL_END 1 +#include "lwip/memp_std.h" + ) +} memp_pool_helper_t; + +/* The actual start and stop values are here (cast them over) + We use this helper type and these defines so we can avoid using const memp_t values */ +#define MEMP_POOL_FIRST ((memp_t) MEMP_POOL_HELPER_FIRST) +#define MEMP_POOL_LAST ((memp_t) MEMP_POOL_HELPER_LAST) +#endif /* MEM_USE_POOLS */ + +#if MEMP_MEM_MALLOC || MEM_USE_POOLS +extern const u16_t memp_sizes[MEMP_MAX]; +#endif /* MEMP_MEM_MALLOC || MEM_USE_POOLS */ + +#if MEMP_MEM_MALLOC + +#include "mem.h" + +#define memp_init() +#define memp_malloc(type) mem_malloc(memp_sizes[type]) +#define memp_free(type, mem) mem_free(mem) + +#else /* MEMP_MEM_MALLOC */ + +#if MEM_USE_POOLS +/** This structure is used to save the pool one element came from. */ +struct memp_malloc_helper +{ + memp_t poolnr; +}; +#endif /* MEM_USE_POOLS */ + +void memp_init(void); + +#if MEMP_OVERFLOW_CHECK +void *memp_malloc_fn(memp_t type, const char* file, const int line); +#define memp_malloc(t) memp_malloc_fn((t), __FILE__, __LINE__) +#else +void *memp_malloc(memp_t type); +#endif +void memp_free(memp_t type, void *mem); + +#endif /* MEMP_MEM_MALLOC */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_MEMP_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/memp_std.h b/third_party/lwip-1.4.1/src/include/lwip/memp_std.h new file mode 100644 index 0000000..7c3b6d4 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/memp_std.h @@ -0,0 +1,122 @@ +/* + * SETUP: Make sure we define everything we will need. + * + * We have create three types of pools: + * 1) MEMPOOL - standard pools + * 2) MALLOC_MEMPOOL - to be used by mem_malloc in mem.c + * 3) PBUF_MEMPOOL - a mempool of pbuf's, so include space for the pbuf struct + * + * If the include'r doesn't require any special treatment of each of the types + * above, then will declare #2 & #3 to be just standard mempools. + */ +#ifndef LWIP_MALLOC_MEMPOOL +/* This treats "malloc pools" just like any other pool. + The pools are a little bigger to provide 'size' as the amount of user data. */ +#define LWIP_MALLOC_MEMPOOL(num, size) LWIP_MEMPOOL(POOL_##size, num, (size + sizeof(struct memp_malloc_helper)), "MALLOC_"#size) +#define LWIP_MALLOC_MEMPOOL_START +#define LWIP_MALLOC_MEMPOOL_END +#endif /* LWIP_MALLOC_MEMPOOL */ + +#ifndef LWIP_PBUF_MEMPOOL +/* This treats "pbuf pools" just like any other pool. + * Allocates buffers for a pbuf struct AND a payload size */ +#define LWIP_PBUF_MEMPOOL(name, num, payload, desc) LWIP_MEMPOOL(name, num, (MEMP_ALIGN_SIZE(sizeof(struct pbuf)) + MEMP_ALIGN_SIZE(payload)), desc) +#endif /* LWIP_PBUF_MEMPOOL */ + + +/* + * A list of internal pools used by LWIP. + * + * LWIP_MEMPOOL(pool_name, number_elements, element_size, pool_description) + * creates a pool name MEMP_pool_name. description is used in stats.c + */ +#if LWIP_RAW +LWIP_MEMPOOL(RAW_PCB, MEMP_NUM_RAW_PCB, sizeof(struct raw_pcb), "RAW_PCB") +#endif /* LWIP_RAW */ + +#if LWIP_UDP +LWIP_MEMPOOL(UDP_PCB, MEMP_NUM_UDP_PCB, sizeof(struct udp_pcb), "UDP_PCB") +#endif /* LWIP_UDP */ + +#if LWIP_TCP +LWIP_MEMPOOL(TCP_PCB, MEMP_NUM_TCP_PCB, sizeof(struct tcp_pcb), "TCP_PCB") +LWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN, sizeof(struct tcp_pcb_listen), "TCP_PCB_LISTEN") +LWIP_MEMPOOL(TCP_SEG, MEMP_NUM_TCP_SEG, sizeof(struct tcp_seg), "TCP_SEG") +#endif /* LWIP_TCP */ + +#if IP_REASSEMBLY +LWIP_MEMPOOL(REASSDATA, MEMP_NUM_REASSDATA, sizeof(struct ip_reassdata), "REASSDATA") +#endif /* IP_REASSEMBLY */ +#if IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF +LWIP_MEMPOOL(FRAG_PBUF, MEMP_NUM_FRAG_PBUF, sizeof(struct pbuf_custom_ref),"FRAG_PBUF") +#endif /* IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF */ + +#if LWIP_NETCONN +LWIP_MEMPOOL(NETBUF, MEMP_NUM_NETBUF, sizeof(struct netbuf), "NETBUF") +LWIP_MEMPOOL(NETCONN, MEMP_NUM_NETCONN, sizeof(struct netconn), "NETCONN") +#endif /* LWIP_NETCONN */ + +#if NO_SYS==0 +LWIP_MEMPOOL(TCPIP_MSG_API, MEMP_NUM_TCPIP_MSG_API, sizeof(struct tcpip_msg), "TCPIP_MSG_API") +#if !LWIP_TCPIP_CORE_LOCKING_INPUT +LWIP_MEMPOOL(TCPIP_MSG_INPKT,MEMP_NUM_TCPIP_MSG_INPKT, sizeof(struct tcpip_msg), "TCPIP_MSG_INPKT") +#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */ +#endif /* NO_SYS==0 */ + +#if LWIP_ARP && ARP_QUEUEING +LWIP_MEMPOOL(ARP_QUEUE, MEMP_NUM_ARP_QUEUE, sizeof(struct etharp_q_entry), "ARP_QUEUE") +#endif /* LWIP_ARP && ARP_QUEUEING */ + +#if LWIP_IGMP +LWIP_MEMPOOL(IGMP_GROUP, MEMP_NUM_IGMP_GROUP, sizeof(struct igmp_group), "IGMP_GROUP") +#endif /* LWIP_IGMP */ + +#if (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS)) /* LWIP_TIMERS */ +LWIP_MEMPOOL(SYS_TIMEOUT, MEMP_NUM_SYS_TIMEOUT, sizeof(struct sys_timeo), "SYS_TIMEOUT") +#endif /* LWIP_TIMERS */ + +#if LWIP_SNMP +LWIP_MEMPOOL(SNMP_ROOTNODE, MEMP_NUM_SNMP_ROOTNODE, sizeof(struct mib_list_rootnode), "SNMP_ROOTNODE") +LWIP_MEMPOOL(SNMP_NODE, MEMP_NUM_SNMP_NODE, sizeof(struct mib_list_node), "SNMP_NODE") +LWIP_MEMPOOL(SNMP_VARBIND, MEMP_NUM_SNMP_VARBIND, sizeof(struct snmp_varbind), "SNMP_VARBIND") +LWIP_MEMPOOL(SNMP_VALUE, MEMP_NUM_SNMP_VALUE, SNMP_MAX_VALUE_SIZE, "SNMP_VALUE") +#endif /* LWIP_SNMP */ +#if LWIP_DNS && LWIP_SOCKET +LWIP_MEMPOOL(NETDB, MEMP_NUM_NETDB, NETDB_ELEM_SIZE, "NETDB") +#endif /* LWIP_DNS && LWIP_SOCKET */ +#if LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC +LWIP_MEMPOOL(LOCALHOSTLIST, MEMP_NUM_LOCALHOSTLIST, LOCALHOSTLIST_ELEM_SIZE, "LOCALHOSTLIST") +#endif /* LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ +#if PPP_SUPPORT && PPPOE_SUPPORT +LWIP_MEMPOOL(PPPOE_IF, MEMP_NUM_PPPOE_INTERFACES, sizeof(struct pppoe_softc), "PPPOE_IF") +#endif /* PPP_SUPPORT && PPPOE_SUPPORT */ + +/* + * A list of pools of pbuf's used by LWIP. + * + * LWIP_PBUF_MEMPOOL(pool_name, number_elements, pbuf_payload_size, pool_description) + * creates a pool name MEMP_pool_name. description is used in stats.c + * This allocates enough space for the pbuf struct and a payload. + * (Example: pbuf_payload_size=0 allocates only size for the struct) + */ +LWIP_PBUF_MEMPOOL(PBUF, MEMP_NUM_PBUF, 0, "PBUF_REF/ROM") +LWIP_PBUF_MEMPOOL(PBUF_POOL, PBUF_POOL_SIZE, PBUF_POOL_BUFSIZE, "PBUF_POOL") + + +/* + * Allow for user-defined pools; this must be explicitly set in lwipopts.h + * since the default is to NOT look for lwippools.h + */ +#if MEMP_USE_CUSTOM_POOLS +#include "lwippools.h" +#endif /* MEMP_USE_CUSTOM_POOLS */ + +/* + * REQUIRED CLEANUP: Clear up so we don't get "multiply defined" error later + * (#undef is ignored for something that is not defined) + */ +#undef LWIP_MEMPOOL +#undef LWIP_MALLOC_MEMPOOL +#undef LWIP_MALLOC_MEMPOOL_START +#undef LWIP_MALLOC_MEMPOOL_END +#undef LWIP_PBUF_MEMPOOL diff --git a/third_party/lwip-1.4.1/src/include/lwip/netbuf.h b/third_party/lwip-1.4.1/src/include/lwip/netbuf.h new file mode 100644 index 0000000..1f254bd --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/netbuf.h @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_NETBUF_H__ +#define __LWIP_NETBUF_H__ + +#include "lwip/opt.h" +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** This netbuf has dest-addr/port set */ +#define NETBUF_FLAG_DESTADDR 0x01 +/** This netbuf includes a checksum */ +#define NETBUF_FLAG_CHKSUM 0x02 + +struct netbuf { + struct pbuf *p, *ptr; + ip_addr_t addr; + u16_t port; +#if LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY +#if LWIP_CHECKSUM_ON_COPY + u8_t flags; +#endif /* LWIP_CHECKSUM_ON_COPY */ + u16_t toport_chksum; +#if LWIP_NETBUF_RECVINFO + ip_addr_t toaddr; +#endif /* LWIP_NETBUF_RECVINFO */ +#endif /* LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY */ +}; + +/* Network buffer functions: */ +struct netbuf * netbuf_new (void); +void netbuf_delete (struct netbuf *buf); +void * netbuf_alloc (struct netbuf *buf, u16_t size); +void netbuf_free (struct netbuf *buf); +err_t netbuf_ref (struct netbuf *buf, + const void *dataptr, u16_t size); +void netbuf_chain (struct netbuf *head, + struct netbuf *tail); + +err_t netbuf_data (struct netbuf *buf, + void **dataptr, u16_t *len); +s8_t netbuf_next (struct netbuf *buf); +void netbuf_first (struct netbuf *buf); + + +#define netbuf_copy_partial(buf, dataptr, len, offset) \ + pbuf_copy_partial((buf)->p, (dataptr), (len), (offset)) +#define netbuf_copy(buf,dataptr,len) netbuf_copy_partial(buf, dataptr, len, 0) +#define netbuf_take(buf, dataptr, len) pbuf_take((buf)->p, dataptr, len) +#define netbuf_len(buf) ((buf)->p->tot_len) +#define netbuf_fromaddr(buf) (&((buf)->addr)) +#define netbuf_set_fromaddr(buf, fromaddr) ip_addr_set((&(buf)->addr), fromaddr) +#define netbuf_fromport(buf) ((buf)->port) +#if LWIP_NETBUF_RECVINFO +#define netbuf_destaddr(buf) (&((buf)->toaddr)) +#define netbuf_set_destaddr(buf, destaddr) ip_addr_set((&(buf)->addr), destaddr) +#define netbuf_destport(buf) (((buf)->flags & NETBUF_FLAG_DESTADDR) ? (buf)->toport_chksum : 0) +#endif /* LWIP_NETBUF_RECVINFO */ +#if LWIP_CHECKSUM_ON_COPY +#define netbuf_set_chksum(buf, chksum) do { (buf)->flags = NETBUF_FLAG_CHKSUM; \ + (buf)->toport_chksum = chksum; } while(0) +#endif /* LWIP_CHECKSUM_ON_COPY */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_NETBUF_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/netdb.h b/third_party/lwip-1.4.1/src/include/lwip/netdb.h new file mode 100644 index 0000000..4b7c07a --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/netdb.h @@ -0,0 +1,124 @@ +/* + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef __LWIP_NETDB_H__ +#define __LWIP_NETDB_H__ + +#include "lwip/opt.h" + +#if LWIP_DNS && LWIP_SOCKET + +#include /* for size_t */ + +#include "lwip/inet.h" +#include "lwip/sockets.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* some rarely used options */ +#ifndef LWIP_DNS_API_DECLARE_H_ERRNO +#define LWIP_DNS_API_DECLARE_H_ERRNO 1 +#endif + +#ifndef LWIP_DNS_API_DEFINE_ERRORS +#define LWIP_DNS_API_DEFINE_ERRORS 1 +#endif + +#ifndef LWIP_DNS_API_DECLARE_STRUCTS +#define LWIP_DNS_API_DECLARE_STRUCTS 1 +#endif + +#if LWIP_DNS_API_DEFINE_ERRORS +/** Errors used by the DNS API functions, h_errno can be one of them */ +#define EAI_NONAME 200 +#define EAI_SERVICE 201 +#define EAI_FAIL 202 +#define EAI_MEMORY 203 + +#define HOST_NOT_FOUND 210 +#define NO_DATA 211 +#define NO_RECOVERY 212 +#define TRY_AGAIN 213 +#endif /* LWIP_DNS_API_DEFINE_ERRORS */ + +#if LWIP_DNS_API_DECLARE_STRUCTS +struct hostent { + char *h_name; /* Official name of the host. */ + char **h_aliases; /* A pointer to an array of pointers to alternative host names, + terminated by a null pointer. */ + int h_addrtype; /* Address type. */ + int h_length; /* The length, in bytes, of the address. */ + char **h_addr_list; /* A pointer to an array of pointers to network addresses (in + network byte order) for the host, terminated by a null pointer. */ +#define h_addr h_addr_list[0] /* for backward compatibility */ +}; + +struct addrinfo { + int ai_flags; /* Input flags. */ + int ai_family; /* Address family of socket. */ + int ai_socktype; /* Socket type. */ + int ai_protocol; /* Protocol of socket. */ + socklen_t ai_addrlen; /* Length of socket address. */ + struct sockaddr *ai_addr; /* Socket address of socket. */ + char *ai_canonname; /* Canonical name of service location. */ + struct addrinfo *ai_next; /* Pointer to next in list. */ +}; +#endif /* LWIP_DNS_API_DECLARE_STRUCTS */ + +#if LWIP_DNS_API_DECLARE_H_ERRNO +/* application accessable error code set by the DNS API functions */ +extern int h_errno; +#endif /* LWIP_DNS_API_DECLARE_H_ERRNO*/ + +struct hostent *lwip_gethostbyname(const char *name); +int lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf, + size_t buflen, struct hostent **result, int *h_errnop); +void lwip_freeaddrinfo(struct addrinfo *ai); +int lwip_getaddrinfo(const char *nodename, + const char *servname, + const struct addrinfo *hints, + struct addrinfo **res); + +#if LWIP_COMPAT_SOCKETS +#define gethostbyname(name) lwip_gethostbyname(name) +#define gethostbyname_r(name, ret, buf, buflen, result, h_errnop) \ + lwip_gethostbyname_r(name, ret, buf, buflen, result, h_errnop) +#define freeaddrinfo(addrinfo) lwip_freeaddrinfo(addrinfo) +#define getaddrinfo(nodname, servname, hints, res) \ + lwip_getaddrinfo(nodname, servname, hints, res) +#endif /* LWIP_COMPAT_SOCKETS */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_DNS && LWIP_SOCKET */ + +#endif /* __LWIP_NETDB_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/netif.h b/third_party/lwip-1.4.1/src/include/lwip/netif.h new file mode 100644 index 0000000..633ed27 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/netif.h @@ -0,0 +1,328 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_NETIF_H__ +#define __LWIP_NETIF_H__ + +#include "lwip/opt.h" + +#define ENABLE_LOOPBACK (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF) + +#include "lwip/err.h" + +#include "lwip/ip_addr.h" + +#include "lwip/def.h" +#include "lwip/pbuf.h" +#if LWIP_DHCP +struct dhcp; +#endif +#if LWIP_AUTOIP +struct autoip; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Throughout this file, IP addresses are expected to be in + * the same byte order as in IP_PCB. */ + +/** must be the maximum of all used hardware address lengths + across all types of interfaces in use */ +#define NETIF_MAX_HWADDR_LEN 6U + +/** Whether the network interface is 'up'. This is + * a software flag used to control whether this network + * interface is enabled and processes traffic. + * It is set by the startup code (for static IP configuration) or + * by dhcp/autoip when an address has been assigned. + */ +#define NETIF_FLAG_UP 0x01U +/** If set, the netif has broadcast capability. + * Set by the netif driver in its init function. */ +#define NETIF_FLAG_BROADCAST 0x02U +/** If set, the netif is one end of a point-to-point connection. + * Set by the netif driver in its init function. */ +#define NETIF_FLAG_POINTTOPOINT 0x04U +/** If set, the interface is configured using DHCP. + * Set by the DHCP code when starting or stopping DHCP. */ +#define NETIF_FLAG_DHCP 0x08U +/** If set, the interface has an active link + * (set by the network interface driver). + * Either set by the netif driver in its init function (if the link + * is up at that time) or at a later point once the link comes up + * (if link detection is supported by the hardware). */ +#define NETIF_FLAG_LINK_UP 0x10U +/** If set, the netif is an ethernet device using ARP. + * Set by the netif driver in its init function. + * Used to check input packet types and use of DHCP. */ +#define NETIF_FLAG_ETHARP 0x20U +/** If set, the netif is an ethernet device. It might not use + * ARP or TCP/IP if it is used for PPPoE only. + */ +#define NETIF_FLAG_ETHERNET 0x40U +/** If set, the netif has IGMP capability. + * Set by the netif driver in its init function. */ +#define NETIF_FLAG_IGMP 0x80U + +/** Function prototype for netif init functions. Set up flags and output/linkoutput + * callback functions in this function. + * + * @param netif The netif to initialize + */ +typedef err_t (*netif_init_fn)(struct netif *netif); +/** Function prototype for netif->input functions. This function is saved as 'input' + * callback function in the netif struct. Call it when a packet has been received. + * + * @param p The received packet, copied into a pbuf + * @param inp The netif which received the packet + */ +typedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp); +/** Function prototype for netif->output functions. Called by lwIP when a packet + * shall be sent. For ethernet netif, set this to 'etharp_output' and set + * 'linkoutput'. + * + * @param netif The netif which shall send a packet + * @param p The packet to send (p->payload points to IP header) + * @param ipaddr The IP address to which the packet shall be sent + */ +typedef err_t (*netif_output_fn)(struct netif *netif, struct pbuf *p, + ip_addr_t *ipaddr); +/** Function prototype for netif->linkoutput functions. Only used for ethernet + * netifs. This function is called by ARP when a packet shall be sent. + * + * @param netif The netif which shall send a packet + * @param p The packet to send (raw ethernet packet) + */ +typedef err_t (*netif_linkoutput_fn)(struct netif *netif, struct pbuf *p); +/** Function prototype for netif status- or link-callback functions. */ +typedef void (*netif_status_callback_fn)(struct netif *netif); +/** Function prototype for netif igmp_mac_filter functions */ +typedef err_t (*netif_igmp_mac_filter_fn)(struct netif *netif, + ip_addr_t *group, u8_t action); + +/** Generic data structure used for all lwIP network interfaces. + * The following fields should be filled in by the initialization + * function for the device driver: hwaddr_len, hwaddr[], mtu, flags */ +struct netif { + /** pointer to next in linked list */ + struct netif *next; + + /** IP address configuration in network byte order */ + ip_addr_t ip_addr; + ip_addr_t netmask; + ip_addr_t gw; + + /** This function is called by the network device driver + * to pass a packet up the TCP/IP stack. */ + netif_input_fn input; + /** This function is called by the IP module when it wants + * to send a packet on the interface. This function typically + * first resolves the hardware address, then sends the packet. */ + netif_output_fn output; + /** This function is called by the ARP module when it wants + * to send a packet on the interface. This function outputs + * the pbuf as-is on the link medium. */ + netif_linkoutput_fn linkoutput; +#if LWIP_NETIF_STATUS_CALLBACK + /** This function is called when the netif state is set to up or down + */ + netif_status_callback_fn status_callback; +#endif /* LWIP_NETIF_STATUS_CALLBACK */ +#if LWIP_NETIF_LINK_CALLBACK + /** This function is called when the netif link is set to up or down + */ + netif_status_callback_fn link_callback; +#endif /* LWIP_NETIF_LINK_CALLBACK */ +#if LWIP_NETIF_REMOVE_CALLBACK + /** This function is called when the netif has been removed */ + netif_status_callback_fn remove_callback; +#endif /* LWIP_NETIF_REMOVE_CALLBACK */ + /** This field can be set by the device driver and could point + * to state information for the device. */ + void *state; +#if LWIP_DHCP + /** the DHCP client state information for this netif */ + struct dhcp *dhcp; +#endif /* LWIP_DHCP */ +#if LWIP_AUTOIP + /** the AutoIP client state information for this netif */ + struct autoip *autoip; +#endif +#if LWIP_NETIF_HOSTNAME + /* the hostname for this netif, NULL is a valid value */ + char* hostname; +#endif /* LWIP_NETIF_HOSTNAME */ + /** maximum transfer unit (in bytes) */ + u16_t mtu; + /** number of bytes used in hwaddr */ + u8_t hwaddr_len; + /** link level hardware address of this interface */ + u8_t hwaddr[NETIF_MAX_HWADDR_LEN]; + /** flags (see NETIF_FLAG_ above) */ + u8_t flags; + /** descriptive abbreviation */ + char name[2]; + /** number of this interface */ + u8_t num; +#if LWIP_SNMP + /** link type (from "snmp_ifType" enum from snmp.h) */ + u8_t link_type; + /** (estimate) link speed */ + u32_t link_speed; + /** timestamp at last change made (up/down) */ + u32_t ts; + /** counters */ + u32_t ifinoctets; + u32_t ifinucastpkts; + u32_t ifinnucastpkts; + u32_t ifindiscards; + u32_t ifoutoctets; + u32_t ifoutucastpkts; + u32_t ifoutnucastpkts; + u32_t ifoutdiscards; +#endif /* LWIP_SNMP */ +#if LWIP_IGMP + /** This function could be called to add or delete a entry in the multicast + filter table of the ethernet MAC.*/ + netif_igmp_mac_filter_fn igmp_mac_filter; +#endif /* LWIP_IGMP */ +#if LWIP_NETIF_HWADDRHINT + u8_t *addr_hint; +#endif /* LWIP_NETIF_HWADDRHINT */ +#if ENABLE_LOOPBACK + /* List of packets to be queued for ourselves. */ + struct pbuf *loop_first; + struct pbuf *loop_last; +#if LWIP_LOOPBACK_MAX_PBUFS + u16_t loop_cnt_current; +#endif /* LWIP_LOOPBACK_MAX_PBUFS */ +#endif /* ENABLE_LOOPBACK */ +}; + +#if LWIP_SNMP +#define NETIF_INIT_SNMP(netif, type, speed) \ + /* use "snmp_ifType" enum from snmp.h for "type", snmp_ifType_ethernet_csmacd by example */ \ + (netif)->link_type = (type); \ + /* your link speed here (units: bits per second) */ \ + (netif)->link_speed = (speed); \ + (netif)->ts = 0; \ + (netif)->ifinoctets = 0; \ + (netif)->ifinucastpkts = 0; \ + (netif)->ifinnucastpkts = 0; \ + (netif)->ifindiscards = 0; \ + (netif)->ifoutoctets = 0; \ + (netif)->ifoutucastpkts = 0; \ + (netif)->ifoutnucastpkts = 0; \ + (netif)->ifoutdiscards = 0 +#else /* LWIP_SNMP */ +#define NETIF_INIT_SNMP(netif, type, speed) +#endif /* LWIP_SNMP */ + + +/** The list of network interfaces. */ +extern struct netif *netif_list; +/** The default network interface. */ +extern struct netif *netif_default; + +void netif_init(void); + +struct netif *netif_add(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask, + ip_addr_t *gw, void *state, netif_init_fn init, netif_input_fn input); + +void +netif_set_addr(struct netif *netif, ip_addr_t *ipaddr, ip_addr_t *netmask, + ip_addr_t *gw); +void netif_remove(struct netif * netif); + +/* Returns a network interface given its name. The name is of the form + "et0", where the first two letters are the "name" field in the + netif structure, and the digit is in the num field in the same + structure. */ +struct netif *netif_find(char *name); + +void netif_set_default(struct netif *netif); + +void netif_set_ipaddr(struct netif *netif, ip_addr_t *ipaddr); +void netif_set_netmask(struct netif *netif, ip_addr_t *netmask); +void netif_set_gw(struct netif *netif, ip_addr_t *gw); + +void netif_set_up(struct netif *netif); +void netif_set_down(struct netif *netif); +/** Ask if an interface is up */ +#define netif_is_up(netif) (((netif)->flags & NETIF_FLAG_UP) ? (u8_t)1 : (u8_t)0) + +#if LWIP_NETIF_STATUS_CALLBACK +void netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback); +#endif /* LWIP_NETIF_STATUS_CALLBACK */ +#if LWIP_NETIF_REMOVE_CALLBACK +void netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback); +#endif /* LWIP_NETIF_REMOVE_CALLBACK */ + +void netif_set_link_up(struct netif *netif); +void netif_set_link_down(struct netif *netif); +/** Ask if a link is up */ +#define netif_is_link_up(netif) (((netif)->flags & NETIF_FLAG_LINK_UP) ? (u8_t)1 : (u8_t)0) + +#if LWIP_NETIF_LINK_CALLBACK +void netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback); +#endif /* LWIP_NETIF_LINK_CALLBACK */ + +#if LWIP_NETIF_HOSTNAME +#define netif_set_hostname(netif, name) do { if((netif) != NULL) { (netif)->hostname = name; }}while(0) +#define netif_get_hostname(netif) (((netif) != NULL) ? ((netif)->hostname) : NULL) +#endif /* LWIP_NETIF_HOSTNAME */ + +#if LWIP_IGMP +#define netif_set_igmp_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->igmp_mac_filter = function; }}while(0) +#define netif_get_igmp_mac_filter(netif) (((netif) != NULL) ? ((netif)->igmp_mac_filter) : NULL) +#endif /* LWIP_IGMP */ + +#if ENABLE_LOOPBACK +err_t netif_loop_output(struct netif *netif, struct pbuf *p, ip_addr_t *dest_ip); +void netif_poll(struct netif *netif); +#if !LWIP_NETIF_LOOPBACK_MULTITHREADING +void netif_poll_all(void); +#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */ +#endif /* ENABLE_LOOPBACK */ + +#if LWIP_NETIF_HWADDRHINT +#define NETIF_SET_HWADDRHINT(netif, hint) ((netif)->addr_hint = (hint)) +#else /* LWIP_NETIF_HWADDRHINT */ +#define NETIF_SET_HWADDRHINT(netif, hint) +#endif /* LWIP_NETIF_HWADDRHINT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_NETIF_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/netifapi.h b/third_party/lwip-1.4.1/src/include/lwip/netifapi.h new file mode 100644 index 0000000..141ac14 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/netifapi.h @@ -0,0 +1,108 @@ +/* + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#ifndef __LWIP_NETIFAPI_H__ +#define __LWIP_NETIFAPI_H__ + +#include "lwip/opt.h" + +#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/sys.h" +#include "lwip/netif.h" +#include "lwip/dhcp.h" +#include "lwip/autoip.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void (*netifapi_void_fn)(struct netif *netif); +typedef err_t (*netifapi_errt_fn)(struct netif *netif); + +struct netifapi_msg_msg { +#if !LWIP_TCPIP_CORE_LOCKING + sys_sem_t sem; +#endif /* !LWIP_TCPIP_CORE_LOCKING */ + err_t err; + struct netif *netif; + union { + struct { + ip_addr_t *ipaddr; + ip_addr_t *netmask; + ip_addr_t *gw; + void *state; + netif_init_fn init; + netif_input_fn input; + } add; + struct { + netifapi_void_fn voidfunc; + netifapi_errt_fn errtfunc; + } common; + } msg; +}; + +struct netifapi_msg { + void (* function)(struct netifapi_msg_msg *msg); + struct netifapi_msg_msg msg; +}; + + +/* API for application */ +err_t netifapi_netif_add ( struct netif *netif, + ip_addr_t *ipaddr, + ip_addr_t *netmask, + ip_addr_t *gw, + void *state, + netif_init_fn init, + netif_input_fn input); + +err_t netifapi_netif_set_addr ( struct netif *netif, + ip_addr_t *ipaddr, + ip_addr_t *netmask, + ip_addr_t *gw ); + +err_t netifapi_netif_common ( struct netif *netif, + netifapi_void_fn voidfunc, + netifapi_errt_fn errtfunc); + +#define netifapi_netif_remove(n) netifapi_netif_common(n, netif_remove, NULL) +#define netifapi_netif_set_up(n) netifapi_netif_common(n, netif_set_up, NULL) +#define netifapi_netif_set_down(n) netifapi_netif_common(n, netif_set_down, NULL) +#define netifapi_netif_set_default(n) netifapi_netif_common(n, netif_set_default, NULL) +#define netifapi_dhcp_start(n) netifapi_netif_common(n, NULL, dhcp_start) +#define netifapi_dhcp_stop(n) netifapi_netif_common(n, dhcp_stop, NULL) +#define netifapi_autoip_start(n) netifapi_netif_common(n, NULL, autoip_start) +#define netifapi_autoip_stop(n) netifapi_netif_common(n, NULL, autoip_stop) + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_NETIF_API */ + +#endif /* __LWIP_NETIFAPI_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/opt.h b/third_party/lwip-1.4.1/src/include/lwip/opt.h new file mode 100644 index 0000000..70c6086 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/opt.h @@ -0,0 +1,2133 @@ +/** + * @file + * + * lwIP Options Configuration + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_OPT_H__ +#define __LWIP_OPT_H__ + +/* + * Include user defined options first. Anything not defined in these files + * will be set to standard values. Override anything you dont like! + */ +#include "lwipopts.h" +#include "lwip/debug.h" + +/* + ----------------------------------------------- + ---------- Platform specific locking ---------- + ----------------------------------------------- +*/ + +/** + * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain + * critical regions during buffer allocation, deallocation and memory + * allocation and deallocation. + */ +#ifndef SYS_LIGHTWEIGHT_PROT +#define SYS_LIGHTWEIGHT_PROT 0 +#endif + +/** + * NO_SYS==1: Provides VERY minimal functionality. Otherwise, + * use lwIP facilities. + */ +#ifndef NO_SYS +#define NO_SYS 0 +#endif + +/** + * NO_SYS_NO_TIMERS==1: Drop support for sys_timeout when NO_SYS==1 + * Mainly for compatibility to old versions. + */ +#ifndef NO_SYS_NO_TIMERS +#define NO_SYS_NO_TIMERS 0 +#endif + +/** + * MEMCPY: override this if you have a faster implementation at hand than the + * one included in your C library + */ +#ifndef MEMCPY +#define MEMCPY(dst,src,len) memcpy(dst,src,len) +#endif + +/** + * SMEMCPY: override this with care! Some compilers (e.g. gcc) can inline a + * call to memcpy() if the length is known at compile time and is small. + */ +#ifndef SMEMCPY +#define SMEMCPY(dst,src,len) memcpy(dst,src,len) +#endif + +/* + ------------------------------------ + ---------- Memory options ---------- + ------------------------------------ +*/ +/** + * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library + * instead of the lwip internal allocator. Can save code size if you + * already use it. + */ +#ifndef MEM_LIBC_MALLOC +#define MEM_LIBC_MALLOC 0 +#endif + +/** +* MEMP_MEM_MALLOC==1: Use mem_malloc/mem_free instead of the lwip pool allocator. +* Especially useful with MEM_LIBC_MALLOC but handle with care regarding execution +* speed and usage from interrupts! +*/ +#ifndef MEMP_MEM_MALLOC +#define MEMP_MEM_MALLOC 0 +#endif + +/** + * MEM_ALIGNMENT: should be set to the alignment of the CPU + * 4 byte alignment -> #define MEM_ALIGNMENT 4 + * 2 byte alignment -> #define MEM_ALIGNMENT 2 + */ +#ifndef MEM_ALIGNMENT +#define MEM_ALIGNMENT 1 +#endif + +/** + * MEM_SIZE: the size of the heap memory. If the application will send + * a lot of data that needs to be copied, this should be set high. + */ +#ifndef MEM_SIZE +#define MEM_SIZE 1600 +#endif + +/** + * MEMP_SEPARATE_POOLS: if defined to 1, each pool is placed in its own array. + * This can be used to individually change the location of each pool. + * Default is one big array for all pools + */ +#ifndef MEMP_SEPARATE_POOLS +#define MEMP_SEPARATE_POOLS 0 +#endif + +/** + * MEMP_OVERFLOW_CHECK: memp overflow protection reserves a configurable + * amount of bytes before and after each memp element in every pool and fills + * it with a prominent default value. + * MEMP_OVERFLOW_CHECK == 0 no checking + * MEMP_OVERFLOW_CHECK == 1 checks each element when it is freed + * MEMP_OVERFLOW_CHECK >= 2 checks each element in every pool every time + * memp_malloc() or memp_free() is called (useful but slow!) + */ +#ifndef MEMP_OVERFLOW_CHECK +#define MEMP_OVERFLOW_CHECK 0 +#endif + +/** + * MEMP_SANITY_CHECK==1: run a sanity check after each memp_free() to make + * sure that there are no cycles in the linked lists. + */ +#ifndef MEMP_SANITY_CHECK +#define MEMP_SANITY_CHECK 0 +#endif + +/** + * MEM_USE_POOLS==1: Use an alternative to malloc() by allocating from a set + * of memory pools of various sizes. When mem_malloc is called, an element of + * the smallest pool that can provide the length needed is returned. + * To use this, MEMP_USE_CUSTOM_POOLS also has to be enabled. + */ +#ifndef MEM_USE_POOLS +#define MEM_USE_POOLS 0 +#endif + +/** + * MEM_USE_POOLS_TRY_BIGGER_POOL==1: if one malloc-pool is empty, try the next + * bigger pool - WARNING: THIS MIGHT WASTE MEMORY but it can make a system more + * reliable. */ +#ifndef MEM_USE_POOLS_TRY_BIGGER_POOL +#define MEM_USE_POOLS_TRY_BIGGER_POOL 0 +#endif + +/** + * MEMP_USE_CUSTOM_POOLS==1: whether to include a user file lwippools.h + * that defines additional pools beyond the "standard" ones required + * by lwIP. If you set this to 1, you must have lwippools.h in your + * inlude path somewhere. + */ +#ifndef MEMP_USE_CUSTOM_POOLS +#define MEMP_USE_CUSTOM_POOLS 0 +#endif + +/** + * Set this to 1 if you want to free PBUF_RAM pbufs (or call mem_free()) from + * interrupt context (or another context that doesn't allow waiting for a + * semaphore). + * If set to 1, mem_malloc will be protected by a semaphore and SYS_ARCH_PROTECT, + * while mem_free will only use SYS_ARCH_PROTECT. mem_malloc SYS_ARCH_UNPROTECTs + * with each loop so that mem_free can run. + * + * ATTENTION: As you can see from the above description, this leads to dis-/ + * enabling interrupts often, which can be slow! Also, on low memory, mem_malloc + * can need longer. + * + * If you don't want that, at least for NO_SYS=0, you can still use the following + * functions to enqueue a deallocation call which then runs in the tcpip_thread + * context: + * - pbuf_free_callback(p); + * - mem_free_callback(m); + */ +#ifndef LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT +#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0 +#endif + +/* + ------------------------------------------------ + ---------- Internal Memory Pool Sizes ---------- + ------------------------------------------------ +*/ +/** + * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF). + * If the application sends a lot of data out of ROM (or other static memory), + * this should be set high. + */ +#ifndef MEMP_NUM_PBUF +#define MEMP_NUM_PBUF 16 +#endif + +/** + * MEMP_NUM_RAW_PCB: Number of raw connection PCBs + * (requires the LWIP_RAW option) + */ +#ifndef MEMP_NUM_RAW_PCB +#define MEMP_NUM_RAW_PCB 4 +#endif + +/** + * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One + * per active UDP "connection". + * (requires the LWIP_UDP option) + */ +#ifndef MEMP_NUM_UDP_PCB +#define MEMP_NUM_UDP_PCB 4 +#endif + +/** + * MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. + * (requires the LWIP_TCP option) + */ +#ifndef MEMP_NUM_TCP_PCB +#define MEMP_NUM_TCP_PCB 5 +#endif + +/** + * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. + * (requires the LWIP_TCP option) + */ +#ifndef MEMP_NUM_TCP_PCB_LISTEN +#define MEMP_NUM_TCP_PCB_LISTEN 8 +#endif + +/** + * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. + * (requires the LWIP_TCP option) + */ +#ifndef MEMP_NUM_TCP_SEG +#define MEMP_NUM_TCP_SEG 16 +#endif + +/** + * MEMP_NUM_REASSDATA: the number of IP packets simultaneously queued for + * reassembly (whole packets, not fragments!) + */ +#ifndef MEMP_NUM_REASSDATA +#define MEMP_NUM_REASSDATA 5 +#endif + +/** + * MEMP_NUM_FRAG_PBUF: the number of IP fragments simultaneously sent + * (fragments, not whole packets!). + * This is only used with IP_FRAG_USES_STATIC_BUF==0 and + * LWIP_NETIF_TX_SINGLE_PBUF==0 and only has to be > 1 with DMA-enabled MACs + * where the packet is not yet sent when netif->output returns. + */ +#ifndef MEMP_NUM_FRAG_PBUF +#define MEMP_NUM_FRAG_PBUF 15 +#endif + +/** + * MEMP_NUM_ARP_QUEUE: the number of simulateously queued outgoing + * packets (pbufs) that are waiting for an ARP request (to resolve + * their destination address) to finish. + * (requires the ARP_QUEUEING option) + */ +#ifndef MEMP_NUM_ARP_QUEUE +#define MEMP_NUM_ARP_QUEUE 30 +#endif + +/** + * MEMP_NUM_IGMP_GROUP: The number of multicast groups whose network interfaces + * can be members et the same time (one per netif - allsystems group -, plus one + * per netif membership). + * (requires the LWIP_IGMP option) + */ +#ifndef MEMP_NUM_IGMP_GROUP +#define MEMP_NUM_IGMP_GROUP 8 +#endif + +/** + * MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. + * (requires NO_SYS==0) + * The default number of timeouts is calculated here for all enabled modules. + * The formula expects settings to be either '0' or '1'. + */ +#ifndef MEMP_NUM_SYS_TIMEOUT +#define MEMP_NUM_SYS_TIMEOUT (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_SUPPORT) +#endif + +/** + * MEMP_NUM_NETBUF: the number of struct netbufs. + * (only needed if you use the sequential API, like api_lib.c) + */ +#ifndef MEMP_NUM_NETBUF +#define MEMP_NUM_NETBUF 2 +#endif + +/** + * MEMP_NUM_NETCONN: the number of struct netconns. + * (only needed if you use the sequential API, like api_lib.c) + */ +#ifndef MEMP_NUM_NETCONN +#define MEMP_NUM_NETCONN 4 +#endif + +/** + * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used + * for callback/timeout API communication. + * (only needed if you use tcpip.c) + */ +#ifndef MEMP_NUM_TCPIP_MSG_API +#define MEMP_NUM_TCPIP_MSG_API 8 +#endif + +/** + * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used + * for incoming packets. + * (only needed if you use tcpip.c) + */ +#ifndef MEMP_NUM_TCPIP_MSG_INPKT +#define MEMP_NUM_TCPIP_MSG_INPKT 8 +#endif + +/** + * MEMP_NUM_SNMP_NODE: the number of leafs in the SNMP tree. + */ +#ifndef MEMP_NUM_SNMP_NODE +#define MEMP_NUM_SNMP_NODE 50 +#endif + +/** + * MEMP_NUM_SNMP_ROOTNODE: the number of branches in the SNMP tree. + * Every branch has one leaf (MEMP_NUM_SNMP_NODE) at least! + */ +#ifndef MEMP_NUM_SNMP_ROOTNODE +#define MEMP_NUM_SNMP_ROOTNODE 30 +#endif + +/** + * MEMP_NUM_SNMP_VARBIND: the number of concurrent requests (does not have to + * be changed normally) - 2 of these are used per request (1 for input, + * 1 for output) + */ +#ifndef MEMP_NUM_SNMP_VARBIND +#define MEMP_NUM_SNMP_VARBIND 2 +#endif + +/** + * MEMP_NUM_SNMP_VALUE: the number of OID or values concurrently used + * (does not have to be changed normally) - 3 of these are used per request + * (1 for the value read and 2 for OIDs - input and output) + */ +#ifndef MEMP_NUM_SNMP_VALUE +#define MEMP_NUM_SNMP_VALUE 3 +#endif + +/** + * MEMP_NUM_NETDB: the number of concurrently running lwip_addrinfo() calls + * (before freeing the corresponding memory using lwip_freeaddrinfo()). + */ +#ifndef MEMP_NUM_NETDB +#define MEMP_NUM_NETDB 1 +#endif + +/** + * MEMP_NUM_LOCALHOSTLIST: the number of host entries in the local host list + * if DNS_LOCAL_HOSTLIST_IS_DYNAMIC==1. + */ +#ifndef MEMP_NUM_LOCALHOSTLIST +#define MEMP_NUM_LOCALHOSTLIST 1 +#endif + +/** + * MEMP_NUM_PPPOE_INTERFACES: the number of concurrently active PPPoE + * interfaces (only used with PPPOE_SUPPORT==1) + */ +#ifndef MEMP_NUM_PPPOE_INTERFACES +#define MEMP_NUM_PPPOE_INTERFACES 1 +#endif + +/** + * PBUF_POOL_SIZE: the number of buffers in the pbuf pool. + */ +#ifndef PBUF_POOL_SIZE +#define PBUF_POOL_SIZE 16 +#endif + +/* + --------------------------------- + ---------- ARP options ---------- + --------------------------------- +*/ +/** + * LWIP_ARP==1: Enable ARP functionality. + */ +#ifndef LWIP_ARP +#define LWIP_ARP 1 +#endif + +/** + * ARP_TABLE_SIZE: Number of active MAC-IP address pairs cached. + */ +#ifndef ARP_TABLE_SIZE +#define ARP_TABLE_SIZE 10 +#endif + +/** + * ARP_QUEUEING==1: Multiple outgoing packets are queued during hardware address + * resolution. By default, only the most recent packet is queued per IP address. + * This is sufficient for most protocols and mainly reduces TCP connection + * startup time. Set this to 1 if you know your application sends more than one + * packet in a row to an IP address that is not in the ARP cache. + */ +#ifndef ARP_QUEUEING +#define ARP_QUEUEING 0 +#endif + +/** + * ETHARP_TRUST_IP_MAC==1: Incoming IP packets cause the ARP table to be + * updated with the source MAC and IP addresses supplied in the packet. + * You may want to disable this if you do not trust LAN peers to have the + * correct addresses, or as a limited approach to attempt to handle + * spoofing. If disabled, lwIP will need to make a new ARP request if + * the peer is not already in the ARP table, adding a little latency. + * The peer *is* in the ARP table if it requested our address before. + * Also notice that this slows down input processing of every IP packet! + */ +#ifndef ETHARP_TRUST_IP_MAC +#define ETHARP_TRUST_IP_MAC 0 +#endif + +/** + * ETHARP_SUPPORT_VLAN==1: support receiving ethernet packets with VLAN header. + * Additionally, you can define ETHARP_VLAN_CHECK to an u16_t VLAN ID to check. + * If ETHARP_VLAN_CHECK is defined, only VLAN-traffic for this VLAN is accepted. + * If ETHARP_VLAN_CHECK is not defined, all traffic is accepted. + * Alternatively, define a function/define ETHARP_VLAN_CHECK_FN(eth_hdr, vlan) + * that returns 1 to accept a packet or 0 to drop a packet. + */ +#ifndef ETHARP_SUPPORT_VLAN +#define ETHARP_SUPPORT_VLAN 0 +#endif + +/** LWIP_ETHERNET==1: enable ethernet support for PPPoE even though ARP + * might be disabled + */ +#ifndef LWIP_ETHERNET +#define LWIP_ETHERNET (LWIP_ARP || PPPOE_SUPPORT) +#endif + +/** ETH_PAD_SIZE: number of bytes added before the ethernet header to ensure + * alignment of payload after that header. Since the header is 14 bytes long, + * without this padding e.g. addresses in the IP header will not be aligned + * on a 32-bit boundary, so setting this to 2 can speed up 32-bit-platforms. + */ +#ifndef ETH_PAD_SIZE +#define ETH_PAD_SIZE 0 +#endif + +/** ETHARP_SUPPORT_STATIC_ENTRIES==1: enable code to support static ARP table + * entries (using etharp_add_static_entry/etharp_remove_static_entry). + */ +#ifndef ETHARP_SUPPORT_STATIC_ENTRIES +#define ETHARP_SUPPORT_STATIC_ENTRIES 0 +#endif + + +/* + -------------------------------- + ---------- IP options ---------- + -------------------------------- +*/ +/** + * IP_FORWARD==1: Enables the ability to forward IP packets across network + * interfaces. If you are going to run lwIP on a device with only one network + * interface, define this to 0. + */ +#ifndef IP_FORWARD +#define IP_FORWARD 0 +#endif + +/** + * IP_OPTIONS_ALLOWED: Defines the behavior for IP options. + * IP_OPTIONS_ALLOWED==0: All packets with IP options are dropped. + * IP_OPTIONS_ALLOWED==1: IP options are allowed (but not parsed). + */ +#ifndef IP_OPTIONS_ALLOWED +#define IP_OPTIONS_ALLOWED 1 +#endif + +/** + * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that + * this option does not affect outgoing packet sizes, which can be controlled + * via IP_FRAG. + */ +#ifndef IP_REASSEMBLY +#define IP_REASSEMBLY 1 +#endif + +/** + * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note + * that this option does not affect incoming packet sizes, which can be + * controlled via IP_REASSEMBLY. + */ +#ifndef IP_FRAG +#define IP_FRAG 1 +#endif + +/** + * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally) + * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived + * in this time, the whole packet is discarded. + */ +#ifndef IP_REASS_MAXAGE +#define IP_REASS_MAXAGE 3 +#endif + +/** + * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled. + * Since the received pbufs are enqueued, be sure to configure + * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive + * packets even if the maximum amount of fragments is enqueued for reassembly! + */ +#ifndef IP_REASS_MAX_PBUFS +#define IP_REASS_MAX_PBUFS 10 +#endif + +/** + * IP_FRAG_USES_STATIC_BUF==1: Use a static MTU-sized buffer for IP + * fragmentation. Otherwise pbufs are allocated and reference the original + * packet data to be fragmented (or with LWIP_NETIF_TX_SINGLE_PBUF==1, + * new PBUF_RAM pbufs are used for fragments). + * ATTENTION: IP_FRAG_USES_STATIC_BUF==1 may not be used for DMA-enabled MACs! + */ +#ifndef IP_FRAG_USES_STATIC_BUF +#define IP_FRAG_USES_STATIC_BUF 0 +#endif + +/** + * IP_FRAG_MAX_MTU: Assumed max MTU on any interface for IP frag buffer + * (requires IP_FRAG_USES_STATIC_BUF==1) + */ +#if IP_FRAG_USES_STATIC_BUF && !defined(IP_FRAG_MAX_MTU) +#define IP_FRAG_MAX_MTU 1500 +#endif + +/** + * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers. + */ +#ifndef IP_DEFAULT_TTL +#define IP_DEFAULT_TTL 255 +#endif + +/** + * IP_SOF_BROADCAST=1: Use the SOF_BROADCAST field to enable broadcast + * filter per pcb on udp and raw send operations. To enable broadcast filter + * on recv operations, you also have to set IP_SOF_BROADCAST_RECV=1. + */ +#ifndef IP_SOF_BROADCAST +#define IP_SOF_BROADCAST 0 +#endif + +/** + * IP_SOF_BROADCAST_RECV (requires IP_SOF_BROADCAST=1) enable the broadcast + * filter on recv operations. + */ +#ifndef IP_SOF_BROADCAST_RECV +#define IP_SOF_BROADCAST_RECV 0 +#endif + +/** + * IP_FORWARD_ALLOW_TX_ON_RX_NETIF==1: allow ip_forward() to send packets back + * out on the netif where it was received. This should only be used for + * wireless networks. + * ATTENTION: When this is 1, make sure your netif driver correctly marks incoming + * link-layer-broadcast/multicast packets as such using the corresponding pbuf flags! + */ +#ifndef IP_FORWARD_ALLOW_TX_ON_RX_NETIF +#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0 +#endif + +/** + * LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS==1: randomize the local port for the first + * local TCP/UDP pcb (default==0). This can prevent creating predictable port + * numbers after booting a device. + */ +#ifndef LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS +#define LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS 0 +#endif + +/* + ---------------------------------- + ---------- ICMP options ---------- + ---------------------------------- +*/ +/** + * LWIP_ICMP==1: Enable ICMP module inside the IP stack. + * Be careful, disable that make your product non-compliant to RFC1122 + */ +#ifndef LWIP_ICMP +#define LWIP_ICMP 1 +#endif + +/** + * ICMP_TTL: Default value for Time-To-Live used by ICMP packets. + */ +#ifndef ICMP_TTL +#define ICMP_TTL (IP_DEFAULT_TTL) +#endif + +/** + * LWIP_BROADCAST_PING==1: respond to broadcast pings (default is unicast only) + */ +#ifndef LWIP_BROADCAST_PING +#define LWIP_BROADCAST_PING 0 +#endif + +/** + * LWIP_MULTICAST_PING==1: respond to multicast pings (default is unicast only) + */ +#ifndef LWIP_MULTICAST_PING +#define LWIP_MULTICAST_PING 0 +#endif + +/* + --------------------------------- + ---------- RAW options ---------- + --------------------------------- +*/ +/** + * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. + */ +#ifndef LWIP_RAW +#define LWIP_RAW 1 +#endif + +/** + * LWIP_RAW==1: Enable application layer to hook into the IP layer itself. + */ +#ifndef RAW_TTL +#define RAW_TTL (IP_DEFAULT_TTL) +#endif + +/* + ---------------------------------- + ---------- DHCP options ---------- + ---------------------------------- +*/ +/** + * LWIP_DHCP==1: Enable DHCP module. + */ +#ifndef LWIP_DHCP +#define LWIP_DHCP 0 +#endif + +/** + * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address. + */ +#ifndef DHCP_DOES_ARP_CHECK +#define DHCP_DOES_ARP_CHECK ((LWIP_DHCP) && (LWIP_ARP)) +#endif + +/* + ------------------------------------ + ---------- AUTOIP options ---------- + ------------------------------------ +*/ +/** + * LWIP_AUTOIP==1: Enable AUTOIP module. + */ +#ifndef LWIP_AUTOIP +#define LWIP_AUTOIP 0 +#endif + +/** + * LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on + * the same interface at the same time. + */ +#ifndef LWIP_DHCP_AUTOIP_COOP +#define LWIP_DHCP_AUTOIP_COOP 0 +#endif + +/** + * LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes + * that should be sent before falling back on AUTOIP. This can be set + * as low as 1 to get an AutoIP address very quickly, but you should + * be prepared to handle a changing IP address when DHCP overrides + * AutoIP. + */ +#ifndef LWIP_DHCP_AUTOIP_COOP_TRIES +#define LWIP_DHCP_AUTOIP_COOP_TRIES 9 +#endif + +/* + ---------------------------------- + ---------- SNMP options ---------- + ---------------------------------- +*/ +/** + * LWIP_SNMP==1: Turn on SNMP module. UDP must be available for SNMP + * transport. + */ +#ifndef LWIP_SNMP +#define LWIP_SNMP 0 +#endif + +/** + * SNMP_CONCURRENT_REQUESTS: Number of concurrent requests the module will + * allow. At least one request buffer is required. + * Does not have to be changed unless external MIBs answer request asynchronously + */ +#ifndef SNMP_CONCURRENT_REQUESTS +#define SNMP_CONCURRENT_REQUESTS 1 +#endif + +/** + * SNMP_TRAP_DESTINATIONS: Number of trap destinations. At least one trap + * destination is required + */ +#ifndef SNMP_TRAP_DESTINATIONS +#define SNMP_TRAP_DESTINATIONS 1 +#endif + +/** + * SNMP_PRIVATE_MIB: + * When using a private MIB, you have to create a file 'private_mib.h' that contains + * a 'struct mib_array_node mib_private' which contains your MIB. + */ +#ifndef SNMP_PRIVATE_MIB +#define SNMP_PRIVATE_MIB 0 +#endif + +/** + * Only allow SNMP write actions that are 'safe' (e.g. disabeling netifs is not + * a safe action and disabled when SNMP_SAFE_REQUESTS = 1). + * Unsafe requests are disabled by default! + */ +#ifndef SNMP_SAFE_REQUESTS +#define SNMP_SAFE_REQUESTS 1 +#endif + +/** + * The maximum length of strings used. This affects the size of + * MEMP_SNMP_VALUE elements. + */ +#ifndef SNMP_MAX_OCTET_STRING_LEN +#define SNMP_MAX_OCTET_STRING_LEN 127 +#endif + +/** + * The maximum depth of the SNMP tree. + * With private MIBs enabled, this depends on your MIB! + * This affects the size of MEMP_SNMP_VALUE elements. + */ +#ifndef SNMP_MAX_TREE_DEPTH +#define SNMP_MAX_TREE_DEPTH 15 +#endif + +/** + * The size of the MEMP_SNMP_VALUE elements, normally calculated from + * SNMP_MAX_OCTET_STRING_LEN and SNMP_MAX_TREE_DEPTH. + */ +#ifndef SNMP_MAX_VALUE_SIZE +#define SNMP_MAX_VALUE_SIZE LWIP_MAX((SNMP_MAX_OCTET_STRING_LEN)+1, sizeof(s32_t)*(SNMP_MAX_TREE_DEPTH)) +#endif + +/* + ---------------------------------- + ---------- IGMP options ---------- + ---------------------------------- +*/ +/** + * LWIP_IGMP==1: Turn on IGMP module. + */ +#ifndef LWIP_IGMP +#define LWIP_IGMP 0 +#endif + +/* + ---------------------------------- + ---------- DNS options ----------- + ---------------------------------- +*/ +/** + * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS + * transport. + */ +#ifndef LWIP_DNS +#define LWIP_DNS 0 +#endif + +/** DNS maximum number of entries to maintain locally. */ +#ifndef DNS_TABLE_SIZE +#define DNS_TABLE_SIZE 4 +#endif + +/** DNS maximum host name length supported in the name table. */ +#ifndef DNS_MAX_NAME_LENGTH +#define DNS_MAX_NAME_LENGTH 256 +#endif + +/** The maximum of DNS servers */ +#ifndef DNS_MAX_SERVERS +#define DNS_MAX_SERVERS 2 +#endif + +/** DNS do a name checking between the query and the response. */ +#ifndef DNS_DOES_NAME_CHECK +#define DNS_DOES_NAME_CHECK 1 +#endif + +/** DNS message max. size. Default value is RFC compliant. */ +#ifndef DNS_MSG_SIZE +#define DNS_MSG_SIZE 512 +#endif + +/** DNS_LOCAL_HOSTLIST: Implements a local host-to-address list. If enabled, + * you have to define + * #define DNS_LOCAL_HOSTLIST_INIT {{"host1", 0x123}, {"host2", 0x234}} + * (an array of structs name/address, where address is an u32_t in network + * byte order). + * + * Instead, you can also use an external function: + * #define DNS_LOOKUP_LOCAL_EXTERN(x) extern u32_t my_lookup_function(const char *name) + * that returns the IP address or INADDR_NONE if not found. + */ +#ifndef DNS_LOCAL_HOSTLIST +#define DNS_LOCAL_HOSTLIST 0 +#endif /* DNS_LOCAL_HOSTLIST */ + +/** If this is turned on, the local host-list can be dynamically changed + * at runtime. */ +#ifndef DNS_LOCAL_HOSTLIST_IS_DYNAMIC +#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC 0 +#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */ + +/* + --------------------------------- + ---------- UDP options ---------- + --------------------------------- +*/ +/** + * LWIP_UDP==1: Turn on UDP. + */ +#ifndef LWIP_UDP +#define LWIP_UDP 1 +#endif + +/** + * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP) + */ +#ifndef LWIP_UDPLITE +#define LWIP_UDPLITE 0 +#endif + +/** + * UDP_TTL: Default Time-To-Live value. + */ +#ifndef UDP_TTL +#define UDP_TTL (IP_DEFAULT_TTL) +#endif + +/** + * LWIP_NETBUF_RECVINFO==1: append destination addr and port to every netbuf. + */ +#ifndef LWIP_NETBUF_RECVINFO +#define LWIP_NETBUF_RECVINFO 0 +#endif + +/* + --------------------------------- + ---------- TCP options ---------- + --------------------------------- +*/ +/** + * LWIP_TCP==1: Turn on TCP. + */ +#ifndef LWIP_TCP +#define LWIP_TCP 1 +#endif + +/** + * TCP_TTL: Default Time-To-Live value. + */ +#ifndef TCP_TTL +#define TCP_TTL (IP_DEFAULT_TTL) +#endif + +/** + * TCP_WND: The size of a TCP window. This must be at least + * (2 * TCP_MSS) for things to work well + */ +#ifndef TCP_WND +#define TCP_WND (4 * TCP_MSS) +#endif + +/** + * TCP_MAXRTX: Maximum number of retransmissions of data segments. + */ +#ifndef TCP_MAXRTX +#define TCP_MAXRTX 12 +#endif + +/** + * TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments. + */ +#ifndef TCP_SYNMAXRTX +#define TCP_SYNMAXRTX 6 +#endif + +/** + * TCP_QUEUE_OOSEQ==1: TCP will queue segments that arrive out of order. + * Define to 0 if your device is low on memory. + */ +#ifndef TCP_QUEUE_OOSEQ +#define TCP_QUEUE_OOSEQ (LWIP_TCP) +#endif + +/** + * TCP_MSS: TCP Maximum segment size. (default is 536, a conservative default, + * you might want to increase this.) + * For the receive side, this MSS is advertised to the remote side + * when opening a connection. For the transmit size, this MSS sets + * an upper limit on the MSS advertised by the remote host. + */ +#ifndef TCP_MSS +#define TCP_MSS 536 +#endif + +/** + * TCP_CALCULATE_EFF_SEND_MSS: "The maximum size of a segment that TCP really + * sends, the 'effective send MSS,' MUST be the smaller of the send MSS (which + * reflects the available reassembly buffer size at the remote host) and the + * largest size permitted by the IP layer" (RFC 1122) + * Setting this to 1 enables code that checks TCP_MSS against the MTU of the + * netif used for a connection and limits the MSS if it would be too big otherwise. + */ +#ifndef TCP_CALCULATE_EFF_SEND_MSS +#define TCP_CALCULATE_EFF_SEND_MSS 1 +#endif + + +/** + * TCP_SND_BUF: TCP sender buffer space (bytes). + * To achieve good performance, this should be at least 2 * TCP_MSS. + */ +#ifndef TCP_SND_BUF +#define TCP_SND_BUF (2 * TCP_MSS) +#endif + +/** + * TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least + * as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. + */ +#ifndef TCP_SND_QUEUELEN +#define TCP_SND_QUEUELEN ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS)) +#endif + +/** + * TCP_SNDLOWAT: TCP writable space (bytes). This must be less than + * TCP_SND_BUF. It is the amount of space which must be available in the + * TCP snd_buf for select to return writable (combined with TCP_SNDQUEUELOWAT). + */ +#ifndef TCP_SNDLOWAT +#define TCP_SNDLOWAT LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1) +#endif + +/** + * TCP_SNDQUEUELOWAT: TCP writable bufs (pbuf count). This must be less + * than TCP_SND_QUEUELEN. If the number of pbufs queued on a pcb drops below + * this number, select returns writable (combined with TCP_SNDLOWAT). + */ +#ifndef TCP_SNDQUEUELOWAT +#define TCP_SNDQUEUELOWAT LWIP_MAX(((TCP_SND_QUEUELEN)/2), 5) +#endif + +/** + * TCP_OOSEQ_MAX_BYTES: The maximum number of bytes queued on ooseq per pcb. + * Default is 0 (no limit). Only valid for TCP_QUEUE_OOSEQ==0. + */ +#ifndef TCP_OOSEQ_MAX_BYTES +#define TCP_OOSEQ_MAX_BYTES 0 +#endif + +/** + * TCP_OOSEQ_MAX_PBUFS: The maximum number of pbufs queued on ooseq per pcb. + * Default is 0 (no limit). Only valid for TCP_QUEUE_OOSEQ==0. + */ +#ifndef TCP_OOSEQ_MAX_PBUFS +#define TCP_OOSEQ_MAX_PBUFS 0 +#endif + +/** + * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb. + */ +#ifndef TCP_LISTEN_BACKLOG +#define TCP_LISTEN_BACKLOG 0 +#endif + +/** + * The maximum allowed backlog for TCP listen netconns. + * This backlog is used unless another is explicitly specified. + * 0xff is the maximum (u8_t). + */ +#ifndef TCP_DEFAULT_LISTEN_BACKLOG +#define TCP_DEFAULT_LISTEN_BACKLOG 0xff +#endif + +/** + * TCP_OVERSIZE: The maximum number of bytes that tcp_write may + * allocate ahead of time in an attempt to create shorter pbuf chains + * for transmission. The meaningful range is 0 to TCP_MSS. Some + * suggested values are: + * + * 0: Disable oversized allocation. Each tcp_write() allocates a new + pbuf (old behaviour). + * 1: Allocate size-aligned pbufs with minimal excess. Use this if your + * scatter-gather DMA requires aligned fragments. + * 128: Limit the pbuf/memory overhead to 20%. + * TCP_MSS: Try to create unfragmented TCP packets. + * TCP_MSS/4: Try to create 4 fragments or less per TCP packet. + */ +#ifndef TCP_OVERSIZE +#define TCP_OVERSIZE TCP_MSS +#endif + +/** + * LWIP_TCP_TIMESTAMPS==1: support the TCP timestamp option. + */ +#ifndef LWIP_TCP_TIMESTAMPS +#define LWIP_TCP_TIMESTAMPS 0 +#endif + +/** + * TCP_WND_UPDATE_THRESHOLD: difference in window to trigger an + * explicit window update + */ +#ifndef TCP_WND_UPDATE_THRESHOLD +#define TCP_WND_UPDATE_THRESHOLD (TCP_WND / 4) +#endif + +/** + * LWIP_EVENT_API and LWIP_CALLBACK_API: Only one of these should be set to 1. + * LWIP_EVENT_API==1: The user defines lwip_tcp_event() to receive all + * events (accept, sent, etc) that happen in the system. + * LWIP_CALLBACK_API==1: The PCB callback function is called directly + * for the event. This is the default. + */ +#if !defined(LWIP_EVENT_API) && !defined(LWIP_CALLBACK_API) +#define LWIP_EVENT_API 0 +#define LWIP_CALLBACK_API 1 +#endif + + +/* + ---------------------------------- + ---------- Pbuf options ---------- + ---------------------------------- +*/ +/** + * PBUF_LINK_HLEN: the number of bytes that should be allocated for a + * link level header. The default is 14, the standard value for + * Ethernet. + */ +#ifndef PBUF_LINK_HLEN +#define PBUF_LINK_HLEN (14 + ETH_PAD_SIZE) +#endif + +/** + * PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is + * designed to accomodate single full size TCP frame in one pbuf, including + * TCP_MSS, IP header, and link header. + */ +#ifndef PBUF_POOL_BUFSIZE +#define PBUF_POOL_BUFSIZE LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN) +#endif + +/* + ------------------------------------------------ + ---------- Network Interfaces options ---------- + ------------------------------------------------ +*/ +/** + * LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname + * field. + */ +#ifndef LWIP_NETIF_HOSTNAME +#define LWIP_NETIF_HOSTNAME 0 +#endif + +/** + * LWIP_NETIF_API==1: Support netif api (in netifapi.c) + */ +#ifndef LWIP_NETIF_API +#define LWIP_NETIF_API 0 +#endif + +/** + * LWIP_NETIF_STATUS_CALLBACK==1: Support a callback function whenever an interface + * changes its up/down status (i.e., due to DHCP IP acquistion) + */ +#ifndef LWIP_NETIF_STATUS_CALLBACK +#define LWIP_NETIF_STATUS_CALLBACK 0 +#endif + +/** + * LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface + * whenever the link changes (i.e., link down) + */ +#ifndef LWIP_NETIF_LINK_CALLBACK +#define LWIP_NETIF_LINK_CALLBACK 0 +#endif + +/** + * LWIP_NETIF_REMOVE_CALLBACK==1: Support a callback function that is called + * when a netif has been removed + */ +#ifndef LWIP_NETIF_REMOVE_CALLBACK +#define LWIP_NETIF_REMOVE_CALLBACK 0 +#endif + +/** + * LWIP_NETIF_HWADDRHINT==1: Cache link-layer-address hints (e.g. table + * indices) in struct netif. TCP and UDP can make use of this to prevent + * scanning the ARP table for every sent packet. While this is faster for big + * ARP tables or many concurrent connections, it might be counterproductive + * if you have a tiny ARP table or if there never are concurrent connections. + */ +#ifndef LWIP_NETIF_HWADDRHINT +#define LWIP_NETIF_HWADDRHINT 0 +#endif + +/** + * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP + * address equal to the netif IP address, looping them back up the stack. + */ +#ifndef LWIP_NETIF_LOOPBACK +#define LWIP_NETIF_LOOPBACK 0 +#endif + +/** + * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback + * sending for each netif (0 = disabled) + */ +#ifndef LWIP_LOOPBACK_MAX_PBUFS +#define LWIP_LOOPBACK_MAX_PBUFS 0 +#endif + +/** + * LWIP_NETIF_LOOPBACK_MULTITHREADING: Indicates whether threading is enabled in + * the system, as netifs must change how they behave depending on this setting + * for the LWIP_NETIF_LOOPBACK option to work. + * Setting this is needed to avoid reentering non-reentrant functions like + * tcp_input(). + * LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using a + * multithreaded environment like tcpip.c. In this case, netif->input() + * is called directly. + * LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup. + * The packets are put on a list and netif_poll() must be called in + * the main application loop. + */ +#ifndef LWIP_NETIF_LOOPBACK_MULTITHREADING +#define LWIP_NETIF_LOOPBACK_MULTITHREADING (!NO_SYS) +#endif + +/** + * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP tries to put all data + * to be sent into one single pbuf. This is for compatibility with DMA-enabled + * MACs that do not support scatter-gather. + * Beware that this might involve CPU-memcpy before transmitting that would not + * be needed without this flag! Use this only if you need to! + * + * @todo: TCP and IP-frag do not work with this, yet: + */ +#ifndef LWIP_NETIF_TX_SINGLE_PBUF +#define LWIP_NETIF_TX_SINGLE_PBUF 0 +#endif /* LWIP_NETIF_TX_SINGLE_PBUF */ + +/* + ------------------------------------ + ---------- LOOPIF options ---------- + ------------------------------------ +*/ +/** + * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1) and loopif.c + */ +#ifndef LWIP_HAVE_LOOPIF +#define LWIP_HAVE_LOOPIF 0 +#endif + +/* + ------------------------------------ + ---------- SLIPIF options ---------- + ------------------------------------ +*/ +/** + * LWIP_HAVE_SLIPIF==1: Support slip interface and slipif.c + */ +#ifndef LWIP_HAVE_SLIPIF +#define LWIP_HAVE_SLIPIF 0 +#endif + +/* + ------------------------------------ + ---------- Thread options ---------- + ------------------------------------ +*/ +/** + * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread. + */ +#ifndef TCPIP_THREAD_NAME +#define TCPIP_THREAD_NAME "tcpip_thread" +#endif + +/** + * TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread. + * The stack size value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef TCPIP_THREAD_STACKSIZE +#define TCPIP_THREAD_STACKSIZE 0 +#endif + +/** + * TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread. + * The priority value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef TCPIP_THREAD_PRIO +#define TCPIP_THREAD_PRIO 1 +#endif + +/** + * TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages + * The queue size value itself is platform-dependent, but is passed to + * sys_mbox_new() when tcpip_init is called. + */ +#ifndef TCPIP_MBOX_SIZE +#define TCPIP_MBOX_SIZE 0 +#endif + +/** + * SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread. + */ +#ifndef SLIPIF_THREAD_NAME +#define SLIPIF_THREAD_NAME "slipif_loop" +#endif + +/** + * SLIP_THREAD_STACKSIZE: The stack size used by the slipif_loop thread. + * The stack size value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef SLIPIF_THREAD_STACKSIZE +#define SLIPIF_THREAD_STACKSIZE 0 +#endif + +/** + * SLIPIF_THREAD_PRIO: The priority assigned to the slipif_loop thread. + * The priority value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef SLIPIF_THREAD_PRIO +#define SLIPIF_THREAD_PRIO 1 +#endif + +/** + * PPP_THREAD_NAME: The name assigned to the pppInputThread. + */ +#ifndef PPP_THREAD_NAME +#define PPP_THREAD_NAME "pppInputThread" +#endif + +/** + * PPP_THREAD_STACKSIZE: The stack size used by the pppInputThread. + * The stack size value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef PPP_THREAD_STACKSIZE +#define PPP_THREAD_STACKSIZE 0 +#endif + +/** + * PPP_THREAD_PRIO: The priority assigned to the pppInputThread. + * The priority value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef PPP_THREAD_PRIO +#define PPP_THREAD_PRIO 1 +#endif + +/** + * DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread. + */ +#ifndef DEFAULT_THREAD_NAME +#define DEFAULT_THREAD_NAME "lwIP" +#endif + +/** + * DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP thread. + * The stack size value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef DEFAULT_THREAD_STACKSIZE +#define DEFAULT_THREAD_STACKSIZE 0 +#endif + +/** + * DEFAULT_THREAD_PRIO: The priority assigned to any other lwIP thread. + * The priority value itself is platform-dependent, but is passed to + * sys_thread_new() when the thread is created. + */ +#ifndef DEFAULT_THREAD_PRIO +#define DEFAULT_THREAD_PRIO 1 +#endif + +/** + * DEFAULT_RAW_RECVMBOX_SIZE: The mailbox size for the incoming packets on a + * NETCONN_RAW. The queue size value itself is platform-dependent, but is passed + * to sys_mbox_new() when the recvmbox is created. + */ +#ifndef DEFAULT_RAW_RECVMBOX_SIZE +#define DEFAULT_RAW_RECVMBOX_SIZE 0 +#endif + +/** + * DEFAULT_UDP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a + * NETCONN_UDP. The queue size value itself is platform-dependent, but is passed + * to sys_mbox_new() when the recvmbox is created. + */ +#ifndef DEFAULT_UDP_RECVMBOX_SIZE +#define DEFAULT_UDP_RECVMBOX_SIZE 0 +#endif + +/** + * DEFAULT_TCP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a + * NETCONN_TCP. The queue size value itself is platform-dependent, but is passed + * to sys_mbox_new() when the recvmbox is created. + */ +#ifndef DEFAULT_TCP_RECVMBOX_SIZE +#define DEFAULT_TCP_RECVMBOX_SIZE 0 +#endif + +/** + * DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections. + * The queue size value itself is platform-dependent, but is passed to + * sys_mbox_new() when the acceptmbox is created. + */ +#ifndef DEFAULT_ACCEPTMBOX_SIZE +#define DEFAULT_ACCEPTMBOX_SIZE 0 +#endif + +/* + ---------------------------------------------- + ---------- Sequential layer options ---------- + ---------------------------------------------- +*/ +/** + * LWIP_TCPIP_CORE_LOCKING: (EXPERIMENTAL!) + * Don't use it if you're not an active lwIP project member + */ +#ifndef LWIP_TCPIP_CORE_LOCKING +#define LWIP_TCPIP_CORE_LOCKING 0 +#endif + +/** + * LWIP_TCPIP_CORE_LOCKING_INPUT: (EXPERIMENTAL!) + * Don't use it if you're not an active lwIP project member + */ +#ifndef LWIP_TCPIP_CORE_LOCKING_INPUT +#define LWIP_TCPIP_CORE_LOCKING_INPUT 0 +#endif + +/** + * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c) + */ +#ifndef LWIP_NETCONN +#define LWIP_NETCONN 1 +#endif + +/** LWIP_TCPIP_TIMEOUT==1: Enable tcpip_timeout/tcpip_untimeout tod create + * timers running in tcpip_thread from another thread. + */ +#ifndef LWIP_TCPIP_TIMEOUT +#define LWIP_TCPIP_TIMEOUT 1 +#endif + +/* + ------------------------------------ + ---------- Socket options ---------- + ------------------------------------ +*/ +/** + * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c) + */ +#ifndef LWIP_SOCKET +#define LWIP_SOCKET 1 +#endif + +/** + * LWIP_COMPAT_SOCKETS==1: Enable BSD-style sockets functions names. + * (only used if you use sockets.c) + */ +#ifndef LWIP_COMPAT_SOCKETS +#define LWIP_COMPAT_SOCKETS 1 +#endif + +/** + * LWIP_POSIX_SOCKETS_IO_NAMES==1: Enable POSIX-style sockets functions names. + * Disable this option if you use a POSIX operating system that uses the same + * names (read, write & close). (only used if you use sockets.c) + */ +#ifndef LWIP_POSIX_SOCKETS_IO_NAMES +#define LWIP_POSIX_SOCKETS_IO_NAMES 1 +#endif + +/** + * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT + * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set + * in seconds. (does not require sockets.c, and will affect tcp.c) + */ +#ifndef LWIP_TCP_KEEPALIVE +#define LWIP_TCP_KEEPALIVE 0 +#endif + +/** + * LWIP_SO_SNDTIMEO==1: Enable send timeout for sockets/netconns and + * SO_SNDTIMEO processing. + */ +#ifndef LWIP_SO_SNDTIMEO +#define LWIP_SO_SNDTIMEO 0 +#endif + +/** + * LWIP_SO_RCVTIMEO==1: Enable receive timeout for sockets/netconns and + * SO_RCVTIMEO processing. + */ +#ifndef LWIP_SO_RCVTIMEO +#define LWIP_SO_RCVTIMEO 0 +#endif + +/** + * LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing. + */ +#ifndef LWIP_SO_RCVBUF +#define LWIP_SO_RCVBUF 0 +#endif + +/** + * If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize. + */ +#ifndef RECV_BUFSIZE_DEFAULT +#define RECV_BUFSIZE_DEFAULT INT_MAX +#endif + +/** + * SO_REUSE==1: Enable SO_REUSEADDR option. + */ +#ifndef SO_REUSE +#define SO_REUSE 0 +#endif + +/** + * SO_REUSE_RXTOALL==1: Pass a copy of incoming broadcast/multicast packets + * to all local matches if SO_REUSEADDR is turned on. + * WARNING: Adds a memcpy for every packet if passing to more than one pcb! + */ +#ifndef SO_REUSE_RXTOALL +#define SO_REUSE_RXTOALL 0 +#endif + +/* + ---------------------------------------- + ---------- Statistics options ---------- + ---------------------------------------- +*/ +/** + * LWIP_STATS==1: Enable statistics collection in lwip_stats. + */ +#ifndef LWIP_STATS +#define LWIP_STATS 1 +#endif + +#if LWIP_STATS + +/** + * LWIP_STATS_DISPLAY==1: Compile in the statistics output functions. + */ +#ifndef LWIP_STATS_DISPLAY +#define LWIP_STATS_DISPLAY 0 +#endif + +/** + * LINK_STATS==1: Enable link stats. + */ +#ifndef LINK_STATS +#define LINK_STATS 1 +#endif + +/** + * ETHARP_STATS==1: Enable etharp stats. + */ +#ifndef ETHARP_STATS +#define ETHARP_STATS (LWIP_ARP) +#endif + +/** + * IP_STATS==1: Enable IP stats. + */ +#ifndef IP_STATS +#define IP_STATS 1 +#endif + +/** + * IPFRAG_STATS==1: Enable IP fragmentation stats. Default is + * on if using either frag or reass. + */ +#ifndef IPFRAG_STATS +#define IPFRAG_STATS (IP_REASSEMBLY || IP_FRAG) +#endif + +/** + * ICMP_STATS==1: Enable ICMP stats. + */ +#ifndef ICMP_STATS +#define ICMP_STATS 1 +#endif + +/** + * IGMP_STATS==1: Enable IGMP stats. + */ +#ifndef IGMP_STATS +#define IGMP_STATS (LWIP_IGMP) +#endif + +/** + * UDP_STATS==1: Enable UDP stats. Default is on if + * UDP enabled, otherwise off. + */ +#ifndef UDP_STATS +#define UDP_STATS (LWIP_UDP) +#endif + +/** + * TCP_STATS==1: Enable TCP stats. Default is on if TCP + * enabled, otherwise off. + */ +#ifndef TCP_STATS +#define TCP_STATS (LWIP_TCP) +#endif + +/** + * MEM_STATS==1: Enable mem.c stats. + */ +#ifndef MEM_STATS +#define MEM_STATS ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0)) +#endif + +/** + * MEMP_STATS==1: Enable memp.c pool stats. + */ +#ifndef MEMP_STATS +#define MEMP_STATS (MEMP_MEM_MALLOC == 0) +#endif + +/** + * SYS_STATS==1: Enable system stats (sem and mbox counts, etc). + */ +#ifndef SYS_STATS +#define SYS_STATS (NO_SYS == 0) +#endif + +#else + +#define LINK_STATS 0 +#define IP_STATS 0 +#define IPFRAG_STATS 0 +#define ICMP_STATS 0 +#define IGMP_STATS 0 +#define UDP_STATS 0 +#define TCP_STATS 0 +#define MEM_STATS 0 +#define MEMP_STATS 0 +#define SYS_STATS 0 +#define LWIP_STATS_DISPLAY 0 + +#endif /* LWIP_STATS */ + +/* + --------------------------------- + ---------- PPP options ---------- + --------------------------------- +*/ +/** + * PPP_SUPPORT==1: Enable PPP. + */ +#ifndef PPP_SUPPORT +#define PPP_SUPPORT 0 +#endif + +/** + * PPPOE_SUPPORT==1: Enable PPP Over Ethernet + */ +#ifndef PPPOE_SUPPORT +#define PPPOE_SUPPORT 0 +#endif + +/** + * PPPOS_SUPPORT==1: Enable PPP Over Serial + */ +#ifndef PPPOS_SUPPORT +#define PPPOS_SUPPORT PPP_SUPPORT +#endif + +#if PPP_SUPPORT + +/** + * NUM_PPP: Max PPP sessions. + */ +#ifndef NUM_PPP +#define NUM_PPP 1 +#endif + +/** + * PAP_SUPPORT==1: Support PAP. + */ +#ifndef PAP_SUPPORT +#define PAP_SUPPORT 0 +#endif + +/** + * CHAP_SUPPORT==1: Support CHAP. + */ +#ifndef CHAP_SUPPORT +#define CHAP_SUPPORT 0 +#endif + +/** + * MSCHAP_SUPPORT==1: Support MSCHAP. CURRENTLY NOT SUPPORTED! DO NOT SET! + */ +#ifndef MSCHAP_SUPPORT +#define MSCHAP_SUPPORT 0 +#endif + +/** + * CBCP_SUPPORT==1: Support CBCP. CURRENTLY NOT SUPPORTED! DO NOT SET! + */ +#ifndef CBCP_SUPPORT +#define CBCP_SUPPORT 0 +#endif + +/** + * CCP_SUPPORT==1: Support CCP. CURRENTLY NOT SUPPORTED! DO NOT SET! + */ +#ifndef CCP_SUPPORT +#define CCP_SUPPORT 0 +#endif + +/** + * VJ_SUPPORT==1: Support VJ header compression. + */ +#ifndef VJ_SUPPORT +#define VJ_SUPPORT 0 +#endif + +/** + * MD5_SUPPORT==1: Support MD5 (see also CHAP). + */ +#ifndef MD5_SUPPORT +#define MD5_SUPPORT 0 +#endif + +/* + * Timeouts + */ +#ifndef FSM_DEFTIMEOUT +#define FSM_DEFTIMEOUT 6 /* Timeout time in seconds */ +#endif + +#ifndef FSM_DEFMAXTERMREQS +#define FSM_DEFMAXTERMREQS 2 /* Maximum Terminate-Request transmissions */ +#endif + +#ifndef FSM_DEFMAXCONFREQS +#define FSM_DEFMAXCONFREQS 10 /* Maximum Configure-Request transmissions */ +#endif + +#ifndef FSM_DEFMAXNAKLOOPS +#define FSM_DEFMAXNAKLOOPS 5 /* Maximum number of nak loops */ +#endif + +#ifndef UPAP_DEFTIMEOUT +#define UPAP_DEFTIMEOUT 6 /* Timeout (seconds) for retransmitting req */ +#endif + +#ifndef UPAP_DEFREQTIME +#define UPAP_DEFREQTIME 30 /* Time to wait for auth-req from peer */ +#endif + +#ifndef CHAP_DEFTIMEOUT +#define CHAP_DEFTIMEOUT 6 /* Timeout time in seconds */ +#endif + +#ifndef CHAP_DEFTRANSMITS +#define CHAP_DEFTRANSMITS 10 /* max # times to send challenge */ +#endif + +/* Interval in seconds between keepalive echo requests, 0 to disable. */ +#ifndef LCP_ECHOINTERVAL +#define LCP_ECHOINTERVAL 0 +#endif + +/* Number of unanswered echo requests before failure. */ +#ifndef LCP_MAXECHOFAILS +#define LCP_MAXECHOFAILS 3 +#endif + +/* Max Xmit idle time (in jiffies) before resend flag char. */ +#ifndef PPP_MAXIDLEFLAG +#define PPP_MAXIDLEFLAG 100 +#endif + +/* + * Packet sizes + * + * Note - lcp shouldn't be allowed to negotiate stuff outside these + * limits. See lcp.h in the pppd directory. + * (XXX - these constants should simply be shared by lcp.c instead + * of living in lcp.h) + */ +#define PPP_MTU 1500 /* Default MTU (size of Info field) */ +#ifndef PPP_MAXMTU +/* #define PPP_MAXMTU 65535 - (PPP_HDRLEN + PPP_FCSLEN) */ +#define PPP_MAXMTU 1500 /* Largest MTU we allow */ +#endif +#define PPP_MINMTU 64 +#define PPP_MRU 1500 /* default MRU = max length of info field */ +#define PPP_MAXMRU 1500 /* Largest MRU we allow */ +#ifndef PPP_DEFMRU +#define PPP_DEFMRU 296 /* Try for this */ +#endif +#define PPP_MINMRU 128 /* No MRUs below this */ + +#ifndef MAXNAMELEN +#define MAXNAMELEN 256 /* max length of hostname or name for auth */ +#endif +#ifndef MAXSECRETLEN +#define MAXSECRETLEN 256 /* max length of password or secret */ +#endif + +#endif /* PPP_SUPPORT */ + +/* + -------------------------------------- + ---------- Checksum options ---------- + -------------------------------------- +*/ +/** + * CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets. + */ +#ifndef CHECKSUM_GEN_IP +#define CHECKSUM_GEN_IP 1 +#endif + +/** + * CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets. + */ +#ifndef CHECKSUM_GEN_UDP +#define CHECKSUM_GEN_UDP 1 +#endif + +/** + * CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets. + */ +#ifndef CHECKSUM_GEN_TCP +#define CHECKSUM_GEN_TCP 1 +#endif + +/** + * CHECKSUM_GEN_ICMP==1: Generate checksums in software for outgoing ICMP packets. + */ +#ifndef CHECKSUM_GEN_ICMP +#define CHECKSUM_GEN_ICMP 1 +#endif + +/** + * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets. + */ +#ifndef CHECKSUM_CHECK_IP +#define CHECKSUM_CHECK_IP 1 +#endif + +/** + * CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets. + */ +#ifndef CHECKSUM_CHECK_UDP +#define CHECKSUM_CHECK_UDP 1 +#endif + +/** + * CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets. + */ +#ifndef CHECKSUM_CHECK_TCP +#define CHECKSUM_CHECK_TCP 1 +#endif + +/** + * LWIP_CHECKSUM_ON_COPY==1: Calculate checksum when copying data from + * application buffers to pbufs. + */ +#ifndef LWIP_CHECKSUM_ON_COPY +#define LWIP_CHECKSUM_ON_COPY 0 +#endif + +/* + --------------------------------------- + ---------- Hook options --------------- + --------------------------------------- +*/ + +/* Hooks are undefined by default, define them to a function if you need them. */ + +/** + * LWIP_HOOK_IP4_INPUT(pbuf, input_netif): + * - called from ip_input() (IPv4) + * - pbuf: received struct pbuf passed to ip_input() + * - input_netif: struct netif on which the packet has been received + * Return values: + * - 0: Hook has not consumed the packet, packet is processed as normal + * - != 0: Hook has consumed the packet. + * If the hook consumed the packet, 'pbuf' is in the responsibility of the hook + * (i.e. free it when done). + */ + +/** + * LWIP_HOOK_IP4_ROUTE(dest): + * - called from ip_route() (IPv4) + * - dest: destination IPv4 address + * Returns the destination netif or NULL if no destination netif is found. In + * that case, ip_route() continues as normal. + */ + +/* + --------------------------------------- + ---------- Debugging options ---------- + --------------------------------------- +*/ +/** + * LWIP_DBG_MIN_LEVEL: After masking, the value of the debug is + * compared against this value. If it is smaller, then debugging + * messages are written. + */ +#ifndef LWIP_DBG_MIN_LEVEL +#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL +#endif + +/** + * LWIP_DBG_TYPES_ON: A mask that can be used to globally enable/disable + * debug messages of certain types. + */ +#ifndef LWIP_DBG_TYPES_ON +#define LWIP_DBG_TYPES_ON LWIP_DBG_ON +#endif + +/** + * ETHARP_DEBUG: Enable debugging in etharp.c. + */ +#ifndef ETHARP_DEBUG +#define ETHARP_DEBUG LWIP_DBG_OFF +#endif + +/** + * NETIF_DEBUG: Enable debugging in netif.c. + */ +#ifndef NETIF_DEBUG +#define NETIF_DEBUG LWIP_DBG_OFF +#endif + +/** + * PBUF_DEBUG: Enable debugging in pbuf.c. + */ +#ifndef PBUF_DEBUG +#define PBUF_DEBUG LWIP_DBG_OFF +#endif + +/** + * API_LIB_DEBUG: Enable debugging in api_lib.c. + */ +#ifndef API_LIB_DEBUG +#define API_LIB_DEBUG LWIP_DBG_OFF +#endif + +/** + * API_MSG_DEBUG: Enable debugging in api_msg.c. + */ +#ifndef API_MSG_DEBUG +#define API_MSG_DEBUG LWIP_DBG_OFF +#endif + +/** + * SOCKETS_DEBUG: Enable debugging in sockets.c. + */ +#ifndef SOCKETS_DEBUG +#define SOCKETS_DEBUG LWIP_DBG_OFF +#endif + +/** + * ICMP_DEBUG: Enable debugging in icmp.c. + */ +#ifndef ICMP_DEBUG +#define ICMP_DEBUG LWIP_DBG_OFF +#endif + +/** + * IGMP_DEBUG: Enable debugging in igmp.c. + */ +#ifndef IGMP_DEBUG +#define IGMP_DEBUG LWIP_DBG_OFF +#endif + +/** + * INET_DEBUG: Enable debugging in inet.c. + */ +#ifndef INET_DEBUG +#define INET_DEBUG LWIP_DBG_OFF +#endif + +/** + * IP_DEBUG: Enable debugging for IP. + */ +#ifndef IP_DEBUG +#define IP_DEBUG LWIP_DBG_OFF +#endif + +/** + * IP_REASS_DEBUG: Enable debugging in ip_frag.c for both frag & reass. + */ +#ifndef IP_REASS_DEBUG +#define IP_REASS_DEBUG LWIP_DBG_OFF +#endif + +/** + * RAW_DEBUG: Enable debugging in raw.c. + */ +#ifndef RAW_DEBUG +#define RAW_DEBUG LWIP_DBG_OFF +#endif + +/** + * MEM_DEBUG: Enable debugging in mem.c. + */ +#ifndef MEM_DEBUG +#define MEM_DEBUG LWIP_DBG_OFF +#endif + +/** + * MEMP_DEBUG: Enable debugging in memp.c. + */ +#ifndef MEMP_DEBUG +#define MEMP_DEBUG LWIP_DBG_OFF +#endif + +/** + * SYS_DEBUG: Enable debugging in sys.c. + */ +#ifndef SYS_DEBUG +#define SYS_DEBUG LWIP_DBG_OFF +#endif + +/** + * TIMERS_DEBUG: Enable debugging in timers.c. + */ +#ifndef TIMERS_DEBUG +#define TIMERS_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_DEBUG: Enable debugging for TCP. + */ +#ifndef TCP_DEBUG +#define TCP_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_INPUT_DEBUG: Enable debugging in tcp_in.c for incoming debug. + */ +#ifndef TCP_INPUT_DEBUG +#define TCP_INPUT_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_FR_DEBUG: Enable debugging in tcp_in.c for fast retransmit. + */ +#ifndef TCP_FR_DEBUG +#define TCP_FR_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_RTO_DEBUG: Enable debugging in TCP for retransmit + * timeout. + */ +#ifndef TCP_RTO_DEBUG +#define TCP_RTO_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_CWND_DEBUG: Enable debugging for TCP congestion window. + */ +#ifndef TCP_CWND_DEBUG +#define TCP_CWND_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_WND_DEBUG: Enable debugging in tcp_in.c for window updating. + */ +#ifndef TCP_WND_DEBUG +#define TCP_WND_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_OUTPUT_DEBUG: Enable debugging in tcp_out.c output functions. + */ +#ifndef TCP_OUTPUT_DEBUG +#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_RST_DEBUG: Enable debugging for TCP with the RST message. + */ +#ifndef TCP_RST_DEBUG +#define TCP_RST_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCP_QLEN_DEBUG: Enable debugging for TCP queue lengths. + */ +#ifndef TCP_QLEN_DEBUG +#define TCP_QLEN_DEBUG LWIP_DBG_OFF +#endif + +/** + * UDP_DEBUG: Enable debugging in UDP. + */ +#ifndef UDP_DEBUG +#define UDP_DEBUG LWIP_DBG_OFF +#endif + +/** + * TCPIP_DEBUG: Enable debugging in tcpip.c. + */ +#ifndef TCPIP_DEBUG +#define TCPIP_DEBUG LWIP_DBG_OFF +#endif + +/** + * PPP_DEBUG: Enable debugging for PPP. + */ +#ifndef PPP_DEBUG +#define PPP_DEBUG LWIP_DBG_OFF +#endif + +/** + * SLIP_DEBUG: Enable debugging in slipif.c. + */ +#ifndef SLIP_DEBUG +#define SLIP_DEBUG LWIP_DBG_OFF +#endif + +/** + * DHCP_DEBUG: Enable debugging in dhcp.c. + */ +#ifndef DHCP_DEBUG +#define DHCP_DEBUG LWIP_DBG_OFF +#endif + +/** + * AUTOIP_DEBUG: Enable debugging in autoip.c. + */ +#ifndef AUTOIP_DEBUG +#define AUTOIP_DEBUG LWIP_DBG_OFF +#endif + +/** + * SNMP_MSG_DEBUG: Enable debugging for SNMP messages. + */ +#ifndef SNMP_MSG_DEBUG +#define SNMP_MSG_DEBUG LWIP_DBG_OFF +#endif + +/** + * SNMP_MIB_DEBUG: Enable debugging for SNMP MIBs. + */ +#ifndef SNMP_MIB_DEBUG +#define SNMP_MIB_DEBUG LWIP_DBG_OFF +#endif + +/** + * DNS_DEBUG: Enable debugging for DNS. + */ +#ifndef DNS_DEBUG +#define DNS_DEBUG LWIP_DBG_OFF +#endif + +#endif /* __LWIP_OPT_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/pbuf.h b/third_party/lwip-1.4.1/src/include/lwip/pbuf.h new file mode 100644 index 0000000..18e8c65 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/pbuf.h @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __LWIP_PBUF_H__ +#define __LWIP_PBUF_H__ + +#include "lwip/opt.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Currently, the pbuf_custom code is only needed for one specific configuration + * of IP_FRAG */ +#define LWIP_SUPPORT_CUSTOM_PBUF (IP_FRAG && !IP_FRAG_USES_STATIC_BUF && !LWIP_NETIF_TX_SINGLE_PBUF) + +#define PBUF_TRANSPORT_HLEN 20 +#define PBUF_IP_HLEN 20 + +typedef enum { + PBUF_TRANSPORT, + PBUF_IP, + PBUF_LINK, + PBUF_RAW +} pbuf_layer; + +typedef enum { + PBUF_RAM, /* pbuf data is stored in RAM */ + PBUF_ROM, /* pbuf data is stored in ROM */ + PBUF_REF, /* pbuf comes from the pbuf pool */ + PBUF_POOL /* pbuf payload refers to RAM */ +} pbuf_type; + + +/** indicates this packet's data should be immediately passed to the application */ +#define PBUF_FLAG_PUSH 0x01U +/** indicates this is a custom pbuf: pbuf_free and pbuf_header handle such a + a pbuf differently */ +#define PBUF_FLAG_IS_CUSTOM 0x02U +/** indicates this pbuf is UDP multicast to be looped back */ +#define PBUF_FLAG_MCASTLOOP 0x04U +/** indicates this pbuf was received as link-level broadcast */ +#define PBUF_FLAG_LLBCAST 0x08U +/** indicates this pbuf was received as link-level multicast */ +#define PBUF_FLAG_LLMCAST 0x10U +/** indicates this pbuf includes a TCP FIN flag */ +#define PBUF_FLAG_TCP_FIN 0x20U + +struct pbuf { + /** next pbuf in singly linked pbuf chain */ + struct pbuf *next; + + /** pointer to the actual data in the buffer */ + void *payload; + + /** + * total length of this buffer and all next buffers in chain + * belonging to the same packet. + * + * For non-queue packet chains this is the invariant: + * p->tot_len == p->len + (p->next? p->next->tot_len: 0) + */ + u16_t tot_len; + + /** length of this buffer */ + u16_t len; + + /** pbuf_type as u8_t instead of enum to save space */ + u8_t /*pbuf_type*/ type; + + /** misc flags */ + u8_t flags; + + /** + * the reference count always equals the number of pointers + * that refer to this pbuf. This can be pointers from an application, + * the stack itself, or pbuf->next pointers from a chain. + */ + u16_t ref; + +#if LWIP_PTPD + /* the time at which the packet was received, seconds component */ + u32_t time_s; + + /* the time at which the packet was received, nanoseconds component */ + u32_t time_ns; +#endif /* #if LWIP_PTPD */ +}; + +#if LWIP_SUPPORT_CUSTOM_PBUF +/** Prototype for a function to free a custom pbuf */ +typedef void (*pbuf_free_custom_fn)(struct pbuf *p); + +/** A custom pbuf: like a pbuf, but following a function pointer to free it. */ +struct pbuf_custom { + /** The actual pbuf */ + struct pbuf pbuf; + /** This function is called when pbuf_free deallocates this pbuf(_custom) */ + pbuf_free_custom_fn custom_free_function; +}; +#endif /* LWIP_SUPPORT_CUSTOM_PBUF */ + +#if LWIP_TCP && TCP_QUEUE_OOSEQ +/** Define this to 0 to prevent freeing ooseq pbufs when the PBUF_POOL is empty */ +#ifndef PBUF_POOL_FREE_OOSEQ +#define PBUF_POOL_FREE_OOSEQ 1 +#endif /* PBUF_POOL_FREE_OOSEQ */ +#if NO_SYS && PBUF_POOL_FREE_OOSEQ +extern volatile u8_t pbuf_free_ooseq_pending; +void pbuf_free_ooseq(); +/** When not using sys_check_timeouts(), call PBUF_CHECK_FREE_OOSEQ() + at regular intervals from main level to check if ooseq pbufs need to be + freed! */ +#define PBUF_CHECK_FREE_OOSEQ() do { if(pbuf_free_ooseq_pending) { \ + /* pbuf_alloc() reported PBUF_POOL to be empty -> try to free some \ + ooseq queued pbufs now */ \ + pbuf_free_ooseq(); }}while(0) +#endif /* NO_SYS && PBUF_POOL_FREE_OOSEQ*/ +#endif /* LWIP_TCP && TCP_QUEUE_OOSEQ */ + +/* Initializes the pbuf module. This call is empty for now, but may not be in future. */ +#define pbuf_init() + +struct pbuf *pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type); +#if LWIP_SUPPORT_CUSTOM_PBUF +struct pbuf *pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, + struct pbuf_custom *p, void *payload_mem, + u16_t payload_mem_len); +#endif /* LWIP_SUPPORT_CUSTOM_PBUF */ +void pbuf_realloc(struct pbuf *p, u16_t size); +u8_t pbuf_header(struct pbuf *p, s16_t header_size); +void pbuf_ref(struct pbuf *p); +u8_t pbuf_free(struct pbuf *p); +u8_t pbuf_clen(struct pbuf *p); +void pbuf_cat(struct pbuf *head, struct pbuf *tail); +void pbuf_chain(struct pbuf *head, struct pbuf *tail); +struct pbuf *pbuf_dechain(struct pbuf *p); +err_t pbuf_copy(struct pbuf *p_to, struct pbuf *p_from); +u16_t pbuf_copy_partial(struct pbuf *p, void *dataptr, u16_t len, u16_t offset); +err_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len); +struct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer); +#if LWIP_CHECKSUM_ON_COPY +err_t pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr, + u16_t len, u16_t *chksum); +#endif /* LWIP_CHECKSUM_ON_COPY */ + +u8_t pbuf_get_at(struct pbuf* p, u16_t offset); +u16_t pbuf_memcmp(struct pbuf* p, u16_t offset, const void* s2, u16_t n); +u16_t pbuf_memfind(struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset); +u16_t pbuf_strstr(struct pbuf* p, const char* substr); + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_PBUF_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/raw.h b/third_party/lwip-1.4.1/src/include/lwip/raw.h new file mode 100644 index 0000000..1a56700 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/raw.h @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_RAW_H__ +#define __LWIP_RAW_H__ + +#include "lwip/opt.h" + +#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/def.h" +#include "lwip/ip.h" +#include "lwip/ip_addr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct raw_pcb; + +/** Function prototype for raw pcb receive callback functions. + * @param arg user supplied argument (raw_pcb.recv_arg) + * @param pcb the raw_pcb which received data + * @param p the packet buffer that was received + * @param addr the remote IP address from which the packet was received + * @return 1 if the packet was 'eaten' (aka. deleted), + * 0 if the packet lives on + * If returning 1, the callback is responsible for freeing the pbuf + * if it's not used any more. + */ +typedef u8_t (*raw_recv_fn)(void *arg, struct raw_pcb *pcb, struct pbuf *p, + ip_addr_t *addr); + +struct raw_pcb { + /* Common members of all PCB types */ + IP_PCB; + + struct raw_pcb *next; + + u8_t protocol; + + /** receive callback function */ + raw_recv_fn recv; + /* user-supplied argument for the recv callback */ + void *recv_arg; +}; + +/* The following functions is the application layer interface to the + RAW code. */ +struct raw_pcb * raw_new (u8_t proto); +void raw_remove (struct raw_pcb *pcb); +err_t raw_bind (struct raw_pcb *pcb, ip_addr_t *ipaddr); +err_t raw_connect (struct raw_pcb *pcb, ip_addr_t *ipaddr); + +void raw_recv (struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg); +err_t raw_sendto (struct raw_pcb *pcb, struct pbuf *p, ip_addr_t *ipaddr); +err_t raw_send (struct raw_pcb *pcb, struct pbuf *p); + +/* The following functions are the lower layer interface to RAW. */ +u8_t raw_input (struct pbuf *p, struct netif *inp); +#define raw_init() /* Compatibility define, not init needed. */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_RAW */ + +#endif /* __LWIP_RAW_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/sio.h b/third_party/lwip-1.4.1/src/include/lwip/sio.h new file mode 100644 index 0000000..39d778b --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/sio.h @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + */ + +/* + * This is the interface to the platform specific serial IO module + * It needs to be implemented by those platforms which need SLIP or PPP + */ + +#ifndef __SIO_H__ +#define __SIO_H__ + +#include "lwip/arch.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* If you want to define sio_fd_t elsewhere or differently, + define this in your cc.h file. */ +#ifndef __sio_fd_t_defined +typedef void * sio_fd_t; +#endif + +/* The following functions can be defined to something else in your cc.h file + or be implemented in your custom sio.c file. */ + +#ifndef sio_open +/** + * Opens a serial device for communication. + * + * @param devnum device number + * @return handle to serial device if successful, NULL otherwise + */ +sio_fd_t sio_open(u8_t devnum); +#endif + +#ifndef sio_send +/** + * Sends a single character to the serial device. + * + * @param c character to send + * @param fd serial device handle + * + * @note This function will block until the character can be sent. + */ +void sio_send(u8_t c, sio_fd_t fd); +#endif + +#ifndef sio_recv +/** + * Receives a single character from the serial device. + * + * @param fd serial device handle + * + * @note This function will block until a character is received. + */ +u8_t sio_recv(sio_fd_t fd); +#endif + +#ifndef sio_read +/** + * Reads from the serial device. + * + * @param fd serial device handle + * @param data pointer to data buffer for receiving + * @param len maximum length (in bytes) of data to receive + * @return number of bytes actually received - may be 0 if aborted by sio_read_abort + * + * @note This function will block until data can be received. The blocking + * can be cancelled by calling sio_read_abort(). + */ +u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len); +#endif + +#ifndef sio_tryread +/** + * Tries to read from the serial device. Same as sio_read but returns + * immediately if no data is available and never blocks. + * + * @param fd serial device handle + * @param data pointer to data buffer for receiving + * @param len maximum length (in bytes) of data to receive + * @return number of bytes actually received + */ +u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len); +#endif + +#ifndef sio_write +/** + * Writes to the serial device. + * + * @param fd serial device handle + * @param data pointer to data to send + * @param len length (in bytes) of data to send + * @return number of bytes actually sent + * + * @note This function will block until all data can be sent. + */ +u32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len); +#endif + +#ifndef sio_read_abort +/** + * Aborts a blocking sio_read() call. + * + * @param fd serial device handle + */ +void sio_read_abort(sio_fd_t fd); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __SIO_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/snmp.h b/third_party/lwip-1.4.1/src/include/lwip/snmp.h new file mode 100644 index 0000000..3548ba2 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/snmp.h @@ -0,0 +1,367 @@ +/* + * Copyright (c) 2001, 2002 Leon Woestenberg + * Copyright (c) 2001, 2002 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Leon Woestenberg + * + */ +#ifndef __LWIP_SNMP_H__ +#define __LWIP_SNMP_H__ + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#include "lwip/ip_addr.h" + +struct udp_pcb; +struct netif; + +/** + * @see RFC1213, "MIB-II, 6. Definitions" + */ +enum snmp_ifType { + snmp_ifType_other=1, /* none of the following */ + snmp_ifType_regular1822, + snmp_ifType_hdh1822, + snmp_ifType_ddn_x25, + snmp_ifType_rfc877_x25, + snmp_ifType_ethernet_csmacd, + snmp_ifType_iso88023_csmacd, + snmp_ifType_iso88024_tokenBus, + snmp_ifType_iso88025_tokenRing, + snmp_ifType_iso88026_man, + snmp_ifType_starLan, + snmp_ifType_proteon_10Mbit, + snmp_ifType_proteon_80Mbit, + snmp_ifType_hyperchannel, + snmp_ifType_fddi, + snmp_ifType_lapb, + snmp_ifType_sdlc, + snmp_ifType_ds1, /* T-1 */ + snmp_ifType_e1, /* european equiv. of T-1 */ + snmp_ifType_basicISDN, + snmp_ifType_primaryISDN, /* proprietary serial */ + snmp_ifType_propPointToPointSerial, + snmp_ifType_ppp, + snmp_ifType_softwareLoopback, + snmp_ifType_eon, /* CLNP over IP [11] */ + snmp_ifType_ethernet_3Mbit, + snmp_ifType_nsip, /* XNS over IP */ + snmp_ifType_slip, /* generic SLIP */ + snmp_ifType_ultra, /* ULTRA technologies */ + snmp_ifType_ds3, /* T-3 */ + snmp_ifType_sip, /* SMDS */ + snmp_ifType_frame_relay +}; + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +/** SNMP "sysuptime" Interval */ +#define SNMP_SYSUPTIME_INTERVAL 10 + +/** fixed maximum length for object identifier type */ +#define LWIP_SNMP_OBJ_ID_LEN 32 + +/** internal object identifier representation */ +struct snmp_obj_id +{ + u8_t len; + s32_t id[LWIP_SNMP_OBJ_ID_LEN]; +}; + +/* system */ +void snmp_set_sysdesr(u8_t* str, u8_t* len); +void snmp_set_sysobjid(struct snmp_obj_id *oid); +void snmp_get_sysobjid_ptr(struct snmp_obj_id **oid); +void snmp_inc_sysuptime(void); +void snmp_add_sysuptime(u32_t value); +void snmp_get_sysuptime(u32_t *value); +void snmp_set_syscontact(u8_t *ocstr, u8_t *ocstrlen); +void snmp_set_sysname(u8_t *ocstr, u8_t *ocstrlen); +void snmp_set_syslocation(u8_t *ocstr, u8_t *ocstrlen); + +/* network interface */ +void snmp_add_ifinoctets(struct netif *ni, u32_t value); +void snmp_inc_ifinucastpkts(struct netif *ni); +void snmp_inc_ifinnucastpkts(struct netif *ni); +void snmp_inc_ifindiscards(struct netif *ni); +void snmp_add_ifoutoctets(struct netif *ni, u32_t value); +void snmp_inc_ifoutucastpkts(struct netif *ni); +void snmp_inc_ifoutnucastpkts(struct netif *ni); +void snmp_inc_ifoutdiscards(struct netif *ni); +void snmp_inc_iflist(void); +void snmp_dec_iflist(void); + +/* ARP (for atTable and ipNetToMediaTable) */ +void snmp_insert_arpidx_tree(struct netif *ni, ip_addr_t *ip); +void snmp_delete_arpidx_tree(struct netif *ni, ip_addr_t *ip); + +/* IP */ +void snmp_inc_ipinreceives(void); +void snmp_inc_ipinhdrerrors(void); +void snmp_inc_ipinaddrerrors(void); +void snmp_inc_ipforwdatagrams(void); +void snmp_inc_ipinunknownprotos(void); +void snmp_inc_ipindiscards(void); +void snmp_inc_ipindelivers(void); +void snmp_inc_ipoutrequests(void); +void snmp_inc_ipoutdiscards(void); +void snmp_inc_ipoutnoroutes(void); +void snmp_inc_ipreasmreqds(void); +void snmp_inc_ipreasmoks(void); +void snmp_inc_ipreasmfails(void); +void snmp_inc_ipfragoks(void); +void snmp_inc_ipfragfails(void); +void snmp_inc_ipfragcreates(void); +void snmp_inc_iproutingdiscards(void); +void snmp_insert_ipaddridx_tree(struct netif *ni); +void snmp_delete_ipaddridx_tree(struct netif *ni); +void snmp_insert_iprteidx_tree(u8_t dflt, struct netif *ni); +void snmp_delete_iprteidx_tree(u8_t dflt, struct netif *ni); + +/* ICMP */ +void snmp_inc_icmpinmsgs(void); +void snmp_inc_icmpinerrors(void); +void snmp_inc_icmpindestunreachs(void); +void snmp_inc_icmpintimeexcds(void); +void snmp_inc_icmpinparmprobs(void); +void snmp_inc_icmpinsrcquenchs(void); +void snmp_inc_icmpinredirects(void); +void snmp_inc_icmpinechos(void); +void snmp_inc_icmpinechoreps(void); +void snmp_inc_icmpintimestamps(void); +void snmp_inc_icmpintimestampreps(void); +void snmp_inc_icmpinaddrmasks(void); +void snmp_inc_icmpinaddrmaskreps(void); +void snmp_inc_icmpoutmsgs(void); +void snmp_inc_icmpouterrors(void); +void snmp_inc_icmpoutdestunreachs(void); +void snmp_inc_icmpouttimeexcds(void); +void snmp_inc_icmpoutparmprobs(void); +void snmp_inc_icmpoutsrcquenchs(void); +void snmp_inc_icmpoutredirects(void); +void snmp_inc_icmpoutechos(void); +void snmp_inc_icmpoutechoreps(void); +void snmp_inc_icmpouttimestamps(void); +void snmp_inc_icmpouttimestampreps(void); +void snmp_inc_icmpoutaddrmasks(void); +void snmp_inc_icmpoutaddrmaskreps(void); + +/* TCP */ +void snmp_inc_tcpactiveopens(void); +void snmp_inc_tcppassiveopens(void); +void snmp_inc_tcpattemptfails(void); +void snmp_inc_tcpestabresets(void); +void snmp_inc_tcpinsegs(void); +void snmp_inc_tcpoutsegs(void); +void snmp_inc_tcpretranssegs(void); +void snmp_inc_tcpinerrs(void); +void snmp_inc_tcpoutrsts(void); + +/* UDP */ +void snmp_inc_udpindatagrams(void); +void snmp_inc_udpnoports(void); +void snmp_inc_udpinerrors(void); +void snmp_inc_udpoutdatagrams(void); +void snmp_insert_udpidx_tree(struct udp_pcb *pcb); +void snmp_delete_udpidx_tree(struct udp_pcb *pcb); + +/* SNMP */ +void snmp_inc_snmpinpkts(void); +void snmp_inc_snmpoutpkts(void); +void snmp_inc_snmpinbadversions(void); +void snmp_inc_snmpinbadcommunitynames(void); +void snmp_inc_snmpinbadcommunityuses(void); +void snmp_inc_snmpinasnparseerrs(void); +void snmp_inc_snmpintoobigs(void); +void snmp_inc_snmpinnosuchnames(void); +void snmp_inc_snmpinbadvalues(void); +void snmp_inc_snmpinreadonlys(void); +void snmp_inc_snmpingenerrs(void); +void snmp_add_snmpintotalreqvars(u8_t value); +void snmp_add_snmpintotalsetvars(u8_t value); +void snmp_inc_snmpingetrequests(void); +void snmp_inc_snmpingetnexts(void); +void snmp_inc_snmpinsetrequests(void); +void snmp_inc_snmpingetresponses(void); +void snmp_inc_snmpintraps(void); +void snmp_inc_snmpouttoobigs(void); +void snmp_inc_snmpoutnosuchnames(void); +void snmp_inc_snmpoutbadvalues(void); +void snmp_inc_snmpoutgenerrs(void); +void snmp_inc_snmpoutgetrequests(void); +void snmp_inc_snmpoutgetnexts(void); +void snmp_inc_snmpoutsetrequests(void); +void snmp_inc_snmpoutgetresponses(void); +void snmp_inc_snmpouttraps(void); +void snmp_get_snmpgrpid_ptr(struct snmp_obj_id **oid); +void snmp_set_snmpenableauthentraps(u8_t *value); +void snmp_get_snmpenableauthentraps(u8_t *value); + +/* LWIP_SNMP support not available */ +/* define everything to be empty */ +#else + +/* system */ +#define snmp_set_sysdesr(str, len) +#define snmp_set_sysobjid(oid); +#define snmp_get_sysobjid_ptr(oid) +#define snmp_inc_sysuptime() +#define snmp_add_sysuptime(value) +#define snmp_get_sysuptime(value) +#define snmp_set_syscontact(ocstr, ocstrlen); +#define snmp_set_sysname(ocstr, ocstrlen); +#define snmp_set_syslocation(ocstr, ocstrlen); + +/* network interface */ +#define snmp_add_ifinoctets(ni,value) +#define snmp_inc_ifinucastpkts(ni) +#define snmp_inc_ifinnucastpkts(ni) +#define snmp_inc_ifindiscards(ni) +#define snmp_add_ifoutoctets(ni,value) +#define snmp_inc_ifoutucastpkts(ni) +#define snmp_inc_ifoutnucastpkts(ni) +#define snmp_inc_ifoutdiscards(ni) +#define snmp_inc_iflist() +#define snmp_dec_iflist() + +/* ARP */ +#define snmp_insert_arpidx_tree(ni,ip) +#define snmp_delete_arpidx_tree(ni,ip) + +/* IP */ +#define snmp_inc_ipinreceives() +#define snmp_inc_ipinhdrerrors() +#define snmp_inc_ipinaddrerrors() +#define snmp_inc_ipforwdatagrams() +#define snmp_inc_ipinunknownprotos() +#define snmp_inc_ipindiscards() +#define snmp_inc_ipindelivers() +#define snmp_inc_ipoutrequests() +#define snmp_inc_ipoutdiscards() +#define snmp_inc_ipoutnoroutes() +#define snmp_inc_ipreasmreqds() +#define snmp_inc_ipreasmoks() +#define snmp_inc_ipreasmfails() +#define snmp_inc_ipfragoks() +#define snmp_inc_ipfragfails() +#define snmp_inc_ipfragcreates() +#define snmp_inc_iproutingdiscards() +#define snmp_insert_ipaddridx_tree(ni) +#define snmp_delete_ipaddridx_tree(ni) +#define snmp_insert_iprteidx_tree(dflt, ni) +#define snmp_delete_iprteidx_tree(dflt, ni) + +/* ICMP */ +#define snmp_inc_icmpinmsgs() +#define snmp_inc_icmpinerrors() +#define snmp_inc_icmpindestunreachs() +#define snmp_inc_icmpintimeexcds() +#define snmp_inc_icmpinparmprobs() +#define snmp_inc_icmpinsrcquenchs() +#define snmp_inc_icmpinredirects() +#define snmp_inc_icmpinechos() +#define snmp_inc_icmpinechoreps() +#define snmp_inc_icmpintimestamps() +#define snmp_inc_icmpintimestampreps() +#define snmp_inc_icmpinaddrmasks() +#define snmp_inc_icmpinaddrmaskreps() +#define snmp_inc_icmpoutmsgs() +#define snmp_inc_icmpouterrors() +#define snmp_inc_icmpoutdestunreachs() +#define snmp_inc_icmpouttimeexcds() +#define snmp_inc_icmpoutparmprobs() +#define snmp_inc_icmpoutsrcquenchs() +#define snmp_inc_icmpoutredirects() +#define snmp_inc_icmpoutechos() +#define snmp_inc_icmpoutechoreps() +#define snmp_inc_icmpouttimestamps() +#define snmp_inc_icmpouttimestampreps() +#define snmp_inc_icmpoutaddrmasks() +#define snmp_inc_icmpoutaddrmaskreps() +/* TCP */ +#define snmp_inc_tcpactiveopens() +#define snmp_inc_tcppassiveopens() +#define snmp_inc_tcpattemptfails() +#define snmp_inc_tcpestabresets() +#define snmp_inc_tcpinsegs() +#define snmp_inc_tcpoutsegs() +#define snmp_inc_tcpretranssegs() +#define snmp_inc_tcpinerrs() +#define snmp_inc_tcpoutrsts() + +/* UDP */ +#define snmp_inc_udpindatagrams() +#define snmp_inc_udpnoports() +#define snmp_inc_udpinerrors() +#define snmp_inc_udpoutdatagrams() +#define snmp_insert_udpidx_tree(pcb) +#define snmp_delete_udpidx_tree(pcb) + +/* SNMP */ +#define snmp_inc_snmpinpkts() +#define snmp_inc_snmpoutpkts() +#define snmp_inc_snmpinbadversions() +#define snmp_inc_snmpinbadcommunitynames() +#define snmp_inc_snmpinbadcommunityuses() +#define snmp_inc_snmpinasnparseerrs() +#define snmp_inc_snmpintoobigs() +#define snmp_inc_snmpinnosuchnames() +#define snmp_inc_snmpinbadvalues() +#define snmp_inc_snmpinreadonlys() +#define snmp_inc_snmpingenerrs() +#define snmp_add_snmpintotalreqvars(value) +#define snmp_add_snmpintotalsetvars(value) +#define snmp_inc_snmpingetrequests() +#define snmp_inc_snmpingetnexts() +#define snmp_inc_snmpinsetrequests() +#define snmp_inc_snmpingetresponses() +#define snmp_inc_snmpintraps() +#define snmp_inc_snmpouttoobigs() +#define snmp_inc_snmpoutnosuchnames() +#define snmp_inc_snmpoutbadvalues() +#define snmp_inc_snmpoutgenerrs() +#define snmp_inc_snmpoutgetrequests() +#define snmp_inc_snmpoutgetnexts() +#define snmp_inc_snmpoutsetrequests() +#define snmp_inc_snmpoutgetresponses() +#define snmp_inc_snmpouttraps() +#define snmp_get_snmpgrpid_ptr(oid) +#define snmp_set_snmpenableauthentraps(value) +#define snmp_get_snmpenableauthentraps(value) + +#endif /* LWIP_SNMP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_SNMP_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/snmp_asn1.h b/third_party/lwip-1.4.1/src/include/lwip/snmp_asn1.h new file mode 100644 index 0000000..fbfb68b --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/snmp_asn1.h @@ -0,0 +1,101 @@ +/** + * @file + * Abstract Syntax Notation One (ISO 8824, 8825) codec. + */ + +/* + * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Christiaan Simons + */ + +#ifndef __LWIP_SNMP_ASN1_H__ +#define __LWIP_SNMP_ASN1_H__ + +#include "lwip/opt.h" +#include "lwip/err.h" +#include "lwip/pbuf.h" +#include "lwip/snmp.h" + +#if LWIP_SNMP + +#ifdef __cplusplus +extern "C" { +#endif + +#define SNMP_ASN1_UNIV (0) /* (!0x80 | !0x40) */ +#define SNMP_ASN1_APPLIC (0x40) /* (!0x80 | 0x40) */ +#define SNMP_ASN1_CONTXT (0x80) /* ( 0x80 | !0x40) */ + +#define SNMP_ASN1_CONSTR (0x20) /* ( 0x20) */ +#define SNMP_ASN1_PRIMIT (0) /* (!0x20) */ + +/* universal tags */ +#define SNMP_ASN1_INTEG 2 +#define SNMP_ASN1_OC_STR 4 +#define SNMP_ASN1_NUL 5 +#define SNMP_ASN1_OBJ_ID 6 +#define SNMP_ASN1_SEQ 16 + +/* application specific (SNMP) tags */ +#define SNMP_ASN1_IPADDR 0 /* octet string size(4) */ +#define SNMP_ASN1_COUNTER 1 /* u32_t */ +#define SNMP_ASN1_GAUGE 2 /* u32_t */ +#define SNMP_ASN1_TIMETICKS 3 /* u32_t */ +#define SNMP_ASN1_OPAQUE 4 /* octet string */ + +/* context specific (SNMP) tags */ +#define SNMP_ASN1_PDU_GET_REQ 0 +#define SNMP_ASN1_PDU_GET_NEXT_REQ 1 +#define SNMP_ASN1_PDU_GET_RESP 2 +#define SNMP_ASN1_PDU_SET_REQ 3 +#define SNMP_ASN1_PDU_TRAP 4 + +err_t snmp_asn1_dec_type(struct pbuf *p, u16_t ofs, u8_t *type); +err_t snmp_asn1_dec_length(struct pbuf *p, u16_t ofs, u8_t *octets_used, u16_t *length); +err_t snmp_asn1_dec_u32t(struct pbuf *p, u16_t ofs, u16_t len, u32_t *value); +err_t snmp_asn1_dec_s32t(struct pbuf *p, u16_t ofs, u16_t len, s32_t *value); +err_t snmp_asn1_dec_oid(struct pbuf *p, u16_t ofs, u16_t len, struct snmp_obj_id *oid); +err_t snmp_asn1_dec_raw(struct pbuf *p, u16_t ofs, u16_t len, u16_t raw_len, u8_t *raw); + +void snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed); +void snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed); +void snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed); +void snmp_asn1_enc_oid_cnt(u8_t ident_len, s32_t *ident, u16_t *octets_needed); +err_t snmp_asn1_enc_type(struct pbuf *p, u16_t ofs, u8_t type); +err_t snmp_asn1_enc_length(struct pbuf *p, u16_t ofs, u16_t length); +err_t snmp_asn1_enc_u32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, u32_t value); +err_t snmp_asn1_enc_s32t(struct pbuf *p, u16_t ofs, u16_t octets_needed, s32_t value); +err_t snmp_asn1_enc_oid(struct pbuf *p, u16_t ofs, u8_t ident_len, s32_t *ident); +err_t snmp_asn1_enc_raw(struct pbuf *p, u16_t ofs, u16_t raw_len, u8_t *raw); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_SNMP */ + +#endif /* __LWIP_SNMP_ASN1_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/snmp_msg.h b/third_party/lwip-1.4.1/src/include/lwip/snmp_msg.h new file mode 100644 index 0000000..656924e --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/snmp_msg.h @@ -0,0 +1,315 @@ +/** + * @file + * SNMP Agent message handling structures. + */ + +/* + * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Christiaan Simons + */ + +#ifndef __LWIP_SNMP_MSG_H__ +#define __LWIP_SNMP_MSG_H__ + +#include "lwip/opt.h" +#include "lwip/snmp.h" +#include "lwip/snmp_structs.h" +#include "lwip/ip_addr.h" +#include "lwip/err.h" + +#if LWIP_SNMP + +#if SNMP_PRIVATE_MIB +/* When using a private MIB, you have to create a file 'private_mib.h' that contains + * a 'struct mib_array_node mib_private' which contains your MIB. */ +#include "private_mib.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* The listen port of the SNMP agent. Clients have to make their requests to + this port. Most standard clients won't work if you change this! */ +#ifndef SNMP_IN_PORT +#define SNMP_IN_PORT 161 +#endif +/* The remote port the SNMP agent sends traps to. Most standard trap sinks won't + work if you change this! */ +#ifndef SNMP_TRAP_PORT +#define SNMP_TRAP_PORT 162 +#endif + +#define SNMP_ES_NOERROR 0 +#define SNMP_ES_TOOBIG 1 +#define SNMP_ES_NOSUCHNAME 2 +#define SNMP_ES_BADVALUE 3 +#define SNMP_ES_READONLY 4 +#define SNMP_ES_GENERROR 5 + +#define SNMP_GENTRAP_COLDSTART 0 +#define SNMP_GENTRAP_WARMSTART 1 +#define SNMP_GENTRAP_AUTHFAIL 4 +#define SNMP_GENTRAP_ENTERPRISESPC 6 + +struct snmp_varbind +{ + /* next pointer, NULL for last in list */ + struct snmp_varbind *next; + /* previous pointer, NULL for first in list */ + struct snmp_varbind *prev; + + /* object identifier length (in s32_t) */ + u8_t ident_len; + /* object identifier array */ + s32_t *ident; + + /* object value ASN1 type */ + u8_t value_type; + /* object value length (in u8_t) */ + u8_t value_len; + /* object value */ + void *value; + + /* encoding varbind seq length length */ + u8_t seqlenlen; + /* encoding object identifier length length */ + u8_t olenlen; + /* encoding object value length length */ + u8_t vlenlen; + /* encoding varbind seq length */ + u16_t seqlen; + /* encoding object identifier length */ + u16_t olen; + /* encoding object value length */ + u16_t vlen; +}; + +struct snmp_varbind_root +{ + struct snmp_varbind *head; + struct snmp_varbind *tail; + /* number of variable bindings in list */ + u8_t count; + /* encoding varbind-list seq length length */ + u8_t seqlenlen; + /* encoding varbind-list seq length */ + u16_t seqlen; +}; + +/** output response message header length fields */ +struct snmp_resp_header_lengths +{ + /* encoding error-index length length */ + u8_t erridxlenlen; + /* encoding error-status length length */ + u8_t errstatlenlen; + /* encoding request id length length */ + u8_t ridlenlen; + /* encoding pdu length length */ + u8_t pdulenlen; + /* encoding community length length */ + u8_t comlenlen; + /* encoding version length length */ + u8_t verlenlen; + /* encoding sequence length length */ + u8_t seqlenlen; + + /* encoding error-index length */ + u16_t erridxlen; + /* encoding error-status length */ + u16_t errstatlen; + /* encoding request id length */ + u16_t ridlen; + /* encoding pdu length */ + u16_t pdulen; + /* encoding community length */ + u16_t comlen; + /* encoding version length */ + u16_t verlen; + /* encoding sequence length */ + u16_t seqlen; +}; + +/** output response message header length fields */ +struct snmp_trap_header_lengths +{ + /* encoding timestamp length length */ + u8_t tslenlen; + /* encoding specific-trap length length */ + u8_t strplenlen; + /* encoding generic-trap length length */ + u8_t gtrplenlen; + /* encoding agent-addr length length */ + u8_t aaddrlenlen; + /* encoding enterprise-id length length */ + u8_t eidlenlen; + /* encoding pdu length length */ + u8_t pdulenlen; + /* encoding community length length */ + u8_t comlenlen; + /* encoding version length length */ + u8_t verlenlen; + /* encoding sequence length length */ + u8_t seqlenlen; + + /* encoding timestamp length */ + u16_t tslen; + /* encoding specific-trap length */ + u16_t strplen; + /* encoding generic-trap length */ + u16_t gtrplen; + /* encoding agent-addr length */ + u16_t aaddrlen; + /* encoding enterprise-id length */ + u16_t eidlen; + /* encoding pdu length */ + u16_t pdulen; + /* encoding community length */ + u16_t comlen; + /* encoding version length */ + u16_t verlen; + /* encoding sequence length */ + u16_t seqlen; +}; + +/* Accepting new SNMP messages. */ +#define SNMP_MSG_EMPTY 0 +/* Search for matching object for variable binding. */ +#define SNMP_MSG_SEARCH_OBJ 1 +/* Perform SNMP operation on in-memory object. + Pass-through states, for symmetry only. */ +#define SNMP_MSG_INTERNAL_GET_OBJDEF 2 +#define SNMP_MSG_INTERNAL_GET_VALUE 3 +#define SNMP_MSG_INTERNAL_SET_TEST 4 +#define SNMP_MSG_INTERNAL_GET_OBJDEF_S 5 +#define SNMP_MSG_INTERNAL_SET_VALUE 6 +/* Perform SNMP operation on object located externally. + In theory this could be used for building a proxy agent. + Practical use is for an enterprise spc. app. gateway. */ +#define SNMP_MSG_EXTERNAL_GET_OBJDEF 7 +#define SNMP_MSG_EXTERNAL_GET_VALUE 8 +#define SNMP_MSG_EXTERNAL_SET_TEST 9 +#define SNMP_MSG_EXTERNAL_GET_OBJDEF_S 10 +#define SNMP_MSG_EXTERNAL_SET_VALUE 11 + +#define SNMP_COMMUNITY_STR_LEN 64 +struct snmp_msg_pstat +{ + /* lwIP local port (161) binding */ + struct udp_pcb *pcb; + /* source IP address */ + ip_addr_t sip; + /* source UDP port */ + u16_t sp; + /* request type */ + u8_t rt; + /* request ID */ + s32_t rid; + /* error status */ + s32_t error_status; + /* error index */ + s32_t error_index; + /* community name (zero terminated) */ + u8_t community[SNMP_COMMUNITY_STR_LEN + 1]; + /* community string length (exclusive zero term) */ + u8_t com_strlen; + /* one out of MSG_EMPTY, MSG_DEMUX, MSG_INTERNAL, MSG_EXTERNAL_x */ + u8_t state; + /* saved arguments for MSG_EXTERNAL_x */ + struct mib_external_node *ext_mib_node; + struct snmp_name_ptr ext_name_ptr; + struct obj_def ext_object_def; + struct snmp_obj_id ext_oid; + /* index into input variable binding list */ + u8_t vb_idx; + /* ptr into input variable binding list */ + struct snmp_varbind *vb_ptr; + /* list of variable bindings from input */ + struct snmp_varbind_root invb; + /* list of variable bindings to output */ + struct snmp_varbind_root outvb; + /* output response lengths used in ASN encoding */ + struct snmp_resp_header_lengths rhl; +}; + +struct snmp_msg_trap +{ + /* lwIP local port (161) binding */ + struct udp_pcb *pcb; + /* destination IP address in network order */ + ip_addr_t dip; + + /* source enterprise ID (sysObjectID) */ + struct snmp_obj_id *enterprise; + /* source IP address, raw network order format */ + u8_t sip_raw[4]; + /* generic trap code */ + u32_t gen_trap; + /* specific trap code */ + u32_t spc_trap; + /* timestamp */ + u32_t ts; + /* list of variable bindings to output */ + struct snmp_varbind_root outvb; + /* output trap lengths used in ASN encoding */ + struct snmp_trap_header_lengths thl; +}; + +/** Agent Version constant, 0 = v1 oddity */ +extern const s32_t snmp_version; +/** Agent default "public" community string */ +extern const char snmp_publiccommunity[7]; + +extern struct snmp_msg_trap trap_msg; + +/** Agent setup, start listening to port 161. */ +void snmp_init(void); +void snmp_trap_dst_enable(u8_t dst_idx, u8_t enable); +void snmp_trap_dst_ip_set(u8_t dst_idx, ip_addr_t *dst); + +/** Varbind-list functions. */ +struct snmp_varbind* snmp_varbind_alloc(struct snmp_obj_id *oid, u8_t type, u8_t len); +void snmp_varbind_free(struct snmp_varbind *vb); +void snmp_varbind_list_free(struct snmp_varbind_root *root); +void snmp_varbind_tail_add(struct snmp_varbind_root *root, struct snmp_varbind *vb); +struct snmp_varbind* snmp_varbind_tail_remove(struct snmp_varbind_root *root); + +/** Handle an internal (recv) or external (private response) event. */ +void snmp_msg_event(u8_t request_id); +err_t snmp_send_response(struct snmp_msg_pstat *m_stat); +err_t snmp_send_trap(s8_t generic_trap, struct snmp_obj_id *eoid, s32_t specific_trap); +void snmp_coldstart_trap(void); +void snmp_authfail_trap(void); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_SNMP */ + +#endif /* __LWIP_SNMP_MSG_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/snmp_structs.h b/third_party/lwip-1.4.1/src/include/lwip/snmp_structs.h new file mode 100644 index 0000000..f7193b9 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/snmp_structs.h @@ -0,0 +1,268 @@ +/** + * @file + * Generic MIB tree structures. + * + * @todo namespace prefixes + */ + +/* + * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * Author: Christiaan Simons + */ + +#ifndef __LWIP_SNMP_STRUCTS_H__ +#define __LWIP_SNMP_STRUCTS_H__ + +#include "lwip/opt.h" + +#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/snmp.h" + +#if SNMP_PRIVATE_MIB +/* When using a private MIB, you have to create a file 'private_mib.h' that contains + * a 'struct mib_array_node mib_private' which contains your MIB. */ +#include "private_mib.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* MIB object instance */ +#define MIB_OBJECT_NONE 0 +#define MIB_OBJECT_SCALAR 1 +#define MIB_OBJECT_TAB 2 + +/* MIB access types */ +#define MIB_ACCESS_READ 1 +#define MIB_ACCESS_WRITE 2 + +/* MIB object access */ +#define MIB_OBJECT_READ_ONLY MIB_ACCESS_READ +#define MIB_OBJECT_READ_WRITE (MIB_ACCESS_READ | MIB_ACCESS_WRITE) +#define MIB_OBJECT_WRITE_ONLY MIB_ACCESS_WRITE +#define MIB_OBJECT_NOT_ACCESSIBLE 0 + +/** object definition returned by (get_object_def)() */ +struct obj_def +{ + /* MIB_OBJECT_NONE (0), MIB_OBJECT_SCALAR (1), MIB_OBJECT_TAB (2) */ + u8_t instance; + /* 0 read-only, 1 read-write, 2 write-only, 3 not-accessible */ + u8_t access; + /* ASN type for this object */ + u8_t asn_type; + /* value length (host length) */ + u16_t v_len; + /* length of instance part of supplied object identifier */ + u8_t id_inst_len; + /* instance part of supplied object identifier */ + s32_t *id_inst_ptr; +}; + +struct snmp_name_ptr +{ + u8_t ident_len; + s32_t *ident; +}; + +/** MIB const scalar (.0) node */ +#define MIB_NODE_SC 0x01 +/** MIB const array node */ +#define MIB_NODE_AR 0x02 +/** MIB array node (mem_malloced from RAM) */ +#define MIB_NODE_RA 0x03 +/** MIB list root node (mem_malloced from RAM) */ +#define MIB_NODE_LR 0x04 +/** MIB node for external objects */ +#define MIB_NODE_EX 0x05 + +/** node "base class" layout, the mandatory fields for a node */ +struct mib_node +{ + /** returns struct obj_def for the given object identifier */ + void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); + /** returns object value for the given object identifier, + @note the caller must allocate at least len bytes for the value */ + void (*get_value)(struct obj_def *od, u16_t len, void *value); + /** tests length and/or range BEFORE setting */ + u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); + /** sets object value, only to be called when set_test() */ + void (*set_value)(struct obj_def *od, u16_t len, void *value); + /** One out of MIB_NODE_AR, MIB_NODE_LR or MIB_NODE_EX */ + u8_t node_type; + /* array or max list length */ + u16_t maxlength; +}; + +/** derived node for scalars .0 index */ +typedef struct mib_node mib_scalar_node; + +/** derived node, points to a fixed size const array + of sub-identifiers plus a 'child' pointer */ +struct mib_array_node +{ + /* inherited "base class" members */ + void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); + void (*get_value)(struct obj_def *od, u16_t len, void *value); + u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); + void (*set_value)(struct obj_def *od, u16_t len, void *value); + + u8_t node_type; + u16_t maxlength; + + /* additional struct members */ + const s32_t *objid; + struct mib_node* const *nptr; +}; + +/** derived node, points to a fixed size mem_malloced array + of sub-identifiers plus a 'child' pointer */ +struct mib_ram_array_node +{ + /* inherited "base class" members */ + void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); + void (*get_value)(struct obj_def *od, u16_t len, void *value); + u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); + void (*set_value)(struct obj_def *od, u16_t len, void *value); + + u8_t node_type; + u16_t maxlength; + + /* aditional struct members */ + s32_t *objid; + struct mib_node **nptr; +}; + +struct mib_list_node +{ + struct mib_list_node *prev; + struct mib_list_node *next; + s32_t objid; + struct mib_node *nptr; +}; + +/** derived node, points to a doubly linked list + of sub-identifiers plus a 'child' pointer */ +struct mib_list_rootnode +{ + /* inherited "base class" members */ + void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); + void (*get_value)(struct obj_def *od, u16_t len, void *value); + u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); + void (*set_value)(struct obj_def *od, u16_t len, void *value); + + u8_t node_type; + u16_t maxlength; + + /* additional struct members */ + struct mib_list_node *head; + struct mib_list_node *tail; + /* counts list nodes in list */ + u16_t count; +}; + +/** derived node, has access functions for mib object in external memory or device + using 'tree_level' and 'idx', with a range 0 .. (level_length() - 1) */ +struct mib_external_node +{ + /* inherited "base class" members */ + void (*get_object_def)(u8_t ident_len, s32_t *ident, struct obj_def *od); + void (*get_value)(struct obj_def *od, u16_t len, void *value); + u8_t (*set_test)(struct obj_def *od, u16_t len, void *value); + void (*set_value)(struct obj_def *od, u16_t len, void *value); + + u8_t node_type; + u16_t maxlength; + + /* additional struct members */ + /** points to an external (in memory) record of some sort of addressing + information, passed to and interpreted by the funtions below */ + void* addr_inf; + /** tree levels under this node */ + u8_t tree_levels; + /** number of objects at this level */ + u16_t (*level_length)(void* addr_inf, u8_t level); + /** compares object sub identifier with external id + return zero when equal, nonzero when unequal */ + s32_t (*ident_cmp)(void* addr_inf, u8_t level, u16_t idx, s32_t sub_id); + void (*get_objid)(void* addr_inf, u8_t level, u16_t idx, s32_t *sub_id); + + /** async Questions */ + void (*get_object_def_q)(void* addr_inf, u8_t rid, u8_t ident_len, s32_t *ident); + void (*get_value_q)(u8_t rid, struct obj_def *od); + void (*set_test_q)(u8_t rid, struct obj_def *od); + void (*set_value_q)(u8_t rid, struct obj_def *od, u16_t len, void *value); + /** async Answers */ + void (*get_object_def_a)(u8_t rid, u8_t ident_len, s32_t *ident, struct obj_def *od); + void (*get_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); + u8_t (*set_test_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); + void (*set_value_a)(u8_t rid, struct obj_def *od, u16_t len, void *value); + /** async Panic Close (agent returns error reply, + e.g. used for external transaction cleanup) */ + void (*get_object_def_pc)(u8_t rid, u8_t ident_len, s32_t *ident); + void (*get_value_pc)(u8_t rid, struct obj_def *od); + void (*set_test_pc)(u8_t rid, struct obj_def *od); + void (*set_value_pc)(u8_t rid, struct obj_def *od); +}; + +/** export MIB tree from mib2.c */ +extern const struct mib_array_node internet; + +/** dummy function pointers for non-leaf MIB nodes from mib2.c */ +void noleafs_get_object_def(u8_t ident_len, s32_t *ident, struct obj_def *od); +void noleafs_get_value(struct obj_def *od, u16_t len, void *value); +u8_t noleafs_set_test(struct obj_def *od, u16_t len, void *value); +void noleafs_set_value(struct obj_def *od, u16_t len, void *value); + +void snmp_oidtoip(s32_t *ident, ip_addr_t *ip); +void snmp_iptooid(ip_addr_t *ip, s32_t *ident); +void snmp_ifindextonetif(s32_t ifindex, struct netif **netif); +void snmp_netiftoifindex(struct netif *netif, s32_t *ifidx); + +struct mib_list_node* snmp_mib_ln_alloc(s32_t id); +void snmp_mib_ln_free(struct mib_list_node *ln); +struct mib_list_rootnode* snmp_mib_lrn_alloc(void); +void snmp_mib_lrn_free(struct mib_list_rootnode *lrn); + +s8_t snmp_mib_node_insert(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **insn); +s8_t snmp_mib_node_find(struct mib_list_rootnode *rn, s32_t objid, struct mib_list_node **fn); +struct mib_list_rootnode *snmp_mib_node_delete(struct mib_list_rootnode *rn, struct mib_list_node *n); + +struct mib_node* snmp_search_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_name_ptr *np); +struct mib_node* snmp_expand_tree(struct mib_node *node, u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret); +u8_t snmp_iso_prefix_tst(u8_t ident_len, s32_t *ident); +u8_t snmp_iso_prefix_expand(u8_t ident_len, s32_t *ident, struct snmp_obj_id *oidret); + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_SNMP */ + +#endif /* __LWIP_SNMP_STRUCTS_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/sockets.h b/third_party/lwip-1.4.1/src/include/lwip/sockets.h new file mode 100644 index 0000000..d1fbc63 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/sockets.h @@ -0,0 +1,379 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + + +#ifndef __LWIP_SOCKETS_H__ +#define __LWIP_SOCKETS_H__ + +#include "lwip/opt.h" + +#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */ + +#include /* for size_t */ + +#include "lwip/ip_addr.h" +#include "lwip/inet.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* members are in network byte order */ +struct sockaddr_in { + u8_t sin_len; + u8_t sin_family; + u16_t sin_port; + struct in_addr sin_addr; + char sin_zero[8]; +}; + +struct sockaddr { + u8_t sa_len; + u8_t sa_family; + char sa_data[14]; +}; + +/* If your port already typedef's socklen_t, define SOCKLEN_T_DEFINED + to prevent this code from redefining it. */ +#if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED) +typedef u32_t socklen_t; +#endif + +/* Socket protocol types (TCP/UDP/RAW) */ +#define SOCK_STREAM 1 +#define SOCK_DGRAM 2 +#define SOCK_RAW 3 + +/* + * Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c) + */ +#define SO_DEBUG 0x0001 /* Unimplemented: turn on debugging info recording */ +#define SO_ACCEPTCONN 0x0002 /* socket has had listen() */ +#define SO_REUSEADDR 0x0004 /* Allow local address reuse */ +#define SO_KEEPALIVE 0x0008 /* keep connections alive */ +#define SO_DONTROUTE 0x0010 /* Unimplemented: just use interface addresses */ +#define SO_BROADCAST 0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */ +#define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */ +#define SO_LINGER 0x0080 /* linger on close if data present */ +#define SO_OOBINLINE 0x0100 /* Unimplemented: leave received OOB data in line */ +#define SO_REUSEPORT 0x0200 /* Unimplemented: allow local address & port reuse */ + +#define SO_DONTLINGER ((int)(~SO_LINGER)) + +/* + * Additional options, not kept in so_options. + */ +#define SO_SNDBUF 0x1001 /* Unimplemented: send buffer size */ +#define SO_RCVBUF 0x1002 /* receive buffer size */ +#define SO_SNDLOWAT 0x1003 /* Unimplemented: send low-water mark */ +#define SO_RCVLOWAT 0x1004 /* Unimplemented: receive low-water mark */ +#define SO_SNDTIMEO 0x1005 /* Unimplemented: send timeout */ +#define SO_RCVTIMEO 0x1006 /* receive timeout */ +#define SO_ERROR 0x1007 /* get error status and clear */ +#define SO_TYPE 0x1008 /* get socket type */ +#define SO_CONTIMEO 0x1009 /* Unimplemented: connect timeout */ +#define SO_NO_CHECK 0x100a /* don't create UDP checksum */ + + +/* + * Structure used for manipulating linger option. + */ +struct linger { + int l_onoff; /* option on/off */ + int l_linger; /* linger time */ +}; + +/* + * Level number for (get/set)sockopt() to apply to socket itself. + */ +#define SOL_SOCKET 0xfff /* options for socket level */ + + +#define AF_UNSPEC 0 +#define AF_INET 2 +#define PF_INET AF_INET +#define PF_UNSPEC AF_UNSPEC + +#define IPPROTO_IP 0 +#define IPPROTO_TCP 6 +#define IPPROTO_UDP 17 +#define IPPROTO_UDPLITE 136 + +/* Flags we can use with send and recv. */ +#define MSG_PEEK 0x01 /* Peeks at an incoming message */ +#define MSG_WAITALL 0x02 /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */ +#define MSG_OOB 0x04 /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */ +#define MSG_DONTWAIT 0x08 /* Nonblocking i/o for this operation only */ +#define MSG_MORE 0x10 /* Sender will send more */ + + +/* + * Options for level IPPROTO_IP + */ +#define IP_TOS 1 +#define IP_TTL 2 + +#if LWIP_TCP +/* + * Options for level IPPROTO_TCP + */ +#define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ +#define TCP_KEEPALIVE 0x02 /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */ +#define TCP_KEEPIDLE 0x03 /* set pcb->keep_idle - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */ +#define TCP_KEEPINTVL 0x04 /* set pcb->keep_intvl - Use seconds for get/setsockopt */ +#define TCP_KEEPCNT 0x05 /* set pcb->keep_cnt - Use number of probes sent for get/setsockopt */ +#endif /* LWIP_TCP */ + +#if LWIP_UDP && LWIP_UDPLITE +/* + * Options for level IPPROTO_UDPLITE + */ +#define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */ +#define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */ +#endif /* LWIP_UDP && LWIP_UDPLITE*/ + + +#if LWIP_IGMP +/* + * Options and types for UDP multicast traffic handling + */ +#define IP_ADD_MEMBERSHIP 3 +#define IP_DROP_MEMBERSHIP 4 +#define IP_MULTICAST_TTL 5 +#define IP_MULTICAST_IF 6 +#define IP_MULTICAST_LOOP 7 + +typedef struct ip_mreq { + struct in_addr imr_multiaddr; /* IP multicast address of group */ + struct in_addr imr_interface; /* local IP address of interface */ +} ip_mreq; +#endif /* LWIP_IGMP */ + +/* + * The Type of Service provides an indication of the abstract + * parameters of the quality of service desired. These parameters are + * to be used to guide the selection of the actual service parameters + * when transmitting a datagram through a particular network. Several + * networks offer service precedence, which somehow treats high + * precedence traffic as more important than other traffic (generally + * by accepting only traffic above a certain precedence at time of high + * load). The major choice is a three way tradeoff between low-delay, + * high-reliability, and high-throughput. + * The use of the Delay, Throughput, and Reliability indications may + * increase the cost (in some sense) of the service. In many networks + * better performance for one of these parameters is coupled with worse + * performance on another. Except for very unusual cases at most two + * of these three indications should be set. + */ +#define IPTOS_TOS_MASK 0x1E +#define IPTOS_TOS(tos) ((tos) & IPTOS_TOS_MASK) +#define IPTOS_LOWDELAY 0x10 +#define IPTOS_THROUGHPUT 0x08 +#define IPTOS_RELIABILITY 0x04 +#define IPTOS_LOWCOST 0x02 +#define IPTOS_MINCOST IPTOS_LOWCOST + +/* + * The Network Control precedence designation is intended to be used + * within a network only. The actual use and control of that + * designation is up to each network. The Internetwork Control + * designation is intended for use by gateway control originators only. + * If the actual use of these precedence designations is of concern to + * a particular network, it is the responsibility of that network to + * control the access to, and use of, those precedence designations. + */ +#define IPTOS_PREC_MASK 0xe0 +#define IPTOS_PREC(tos) ((tos) & IPTOS_PREC_MASK) +#define IPTOS_PREC_NETCONTROL 0xe0 +#define IPTOS_PREC_INTERNETCONTROL 0xc0 +#define IPTOS_PREC_CRITIC_ECP 0xa0 +#define IPTOS_PREC_FLASHOVERRIDE 0x80 +#define IPTOS_PREC_FLASH 0x60 +#define IPTOS_PREC_IMMEDIATE 0x40 +#define IPTOS_PREC_PRIORITY 0x20 +#define IPTOS_PREC_ROUTINE 0x00 + + +/* + * Commands for ioctlsocket(), taken from the BSD file fcntl.h. + * lwip_ioctl only supports FIONREAD and FIONBIO, for now + * + * Ioctl's have the command encoded in the lower word, + * and the size of any in or out parameters in the upper + * word. The high 2 bits of the upper word are used + * to encode the in/out status of the parameter; for now + * we restrict parameters to at most 128 bytes. + */ +#if !defined(FIONREAD) || !defined(FIONBIO) +#define IOCPARM_MASK 0x7fU /* parameters must be < 128 bytes */ +#define IOC_VOID 0x20000000UL /* no parameters */ +#define IOC_OUT 0x40000000UL /* copy out parameters */ +#define IOC_IN 0x80000000UL /* copy in parameters */ +#define IOC_INOUT (IOC_IN|IOC_OUT) + /* 0x20000000 distinguishes new & + old ioctl's */ +#define _IO(x,y) (IOC_VOID|((x)<<8)|(y)) + +#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) + +#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y)) +#endif /* !defined(FIONREAD) || !defined(FIONBIO) */ + +#ifndef FIONREAD +#define FIONREAD _IOR('f', 127, unsigned long) /* get # bytes to read */ +#endif +#ifndef FIONBIO +#define FIONBIO _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */ +#endif + +/* Socket I/O Controls: unimplemented */ +#ifndef SIOCSHIWAT +#define SIOCSHIWAT _IOW('s', 0, unsigned long) /* set high watermark */ +#define SIOCGHIWAT _IOR('s', 1, unsigned long) /* get high watermark */ +#define SIOCSLOWAT _IOW('s', 2, unsigned long) /* set low watermark */ +#define SIOCGLOWAT _IOR('s', 3, unsigned long) /* get low watermark */ +#define SIOCATMARK _IOR('s', 7, unsigned long) /* at oob mark? */ +#endif + +/* commands for fnctl */ +#ifndef F_GETFL +#define F_GETFL 3 +#endif +#ifndef F_SETFL +#define F_SETFL 4 +#endif + +/* File status flags and file access modes for fnctl, + these are bits in an int. */ +#ifndef O_NONBLOCK +#define O_NONBLOCK 1 /* nonblocking I/O */ +#endif +#ifndef O_NDELAY +#define O_NDELAY 1 /* same as O_NONBLOCK, for compatibility */ +#endif + +#ifndef SHUT_RD + #define SHUT_RD 0 + #define SHUT_WR 1 + #define SHUT_RDWR 2 +#endif + +/* FD_SET used for lwip_select */ +#ifndef FD_SET + #undef FD_SETSIZE + /* Make FD_SETSIZE match NUM_SOCKETS in socket.c */ + #define FD_SETSIZE MEMP_NUM_NETCONN + #define FD_SET(n, p) ((p)->fd_bits[(n)/8] |= (1 << ((n) & 7))) + #define FD_CLR(n, p) ((p)->fd_bits[(n)/8] &= ~(1 << ((n) & 7))) + #define FD_ISSET(n,p) ((p)->fd_bits[(n)/8] & (1 << ((n) & 7))) + #define FD_ZERO(p) memset((void*)(p),0,sizeof(*(p))) + + typedef struct fd_set { + unsigned char fd_bits [(FD_SETSIZE+7)/8]; + } fd_set; + +#endif /* FD_SET */ + +/** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided + * by your system, set this to 0 and include in cc.h */ +#ifndef LWIP_TIMEVAL_PRIVATE +#define LWIP_TIMEVAL_PRIVATE 1 +#endif + +#if LWIP_TIMEVAL_PRIVATE +struct timeval { + long tv_sec; /* seconds */ + long tv_usec; /* and microseconds */ +}; +#endif /* LWIP_TIMEVAL_PRIVATE */ + +void lwip_socket_init(void); + +int lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen); +int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen); +int lwip_shutdown(int s, int how); +int lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen); +int lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen); +int lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen); +int lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen); +int lwip_close(int s); +int lwip_connect(int s, const struct sockaddr *name, socklen_t namelen); +int lwip_listen(int s, int backlog); +int lwip_recv(int s, void *mem, size_t len, int flags); +int lwip_read(int s, void *mem, size_t len); +int lwip_recvfrom(int s, void *mem, size_t len, int flags, + struct sockaddr *from, socklen_t *fromlen); +int lwip_send(int s, const void *dataptr, size_t size, int flags); +int lwip_sendto(int s, const void *dataptr, size_t size, int flags, + const struct sockaddr *to, socklen_t tolen); +int lwip_socket(int domain, int type, int protocol); +int lwip_write(int s, const void *dataptr, size_t size); +int lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, + struct timeval *timeout); +int lwip_ioctl(int s, long cmd, void *argp); +int lwip_fcntl(int s, int cmd, int val); + +#if LWIP_COMPAT_SOCKETS +#define accept(a,b,c) lwip_accept(a,b,c) +#define bind(a,b,c) lwip_bind(a,b,c) +#define shutdown(a,b) lwip_shutdown(a,b) +#define closesocket(s) lwip_close(s) +#define connect(a,b,c) lwip_connect(a,b,c) +#define getsockname(a,b,c) lwip_getsockname(a,b,c) +#define getpeername(a,b,c) lwip_getpeername(a,b,c) +#define setsockopt(a,b,c,d,e) lwip_setsockopt(a,b,c,d,e) +#define getsockopt(a,b,c,d,e) lwip_getsockopt(a,b,c,d,e) +#define listen(a,b) lwip_listen(a,b) +#define recv(a,b,c,d) lwip_recv(a,b,c,d) +#define recvfrom(a,b,c,d,e,f) lwip_recvfrom(a,b,c,d,e,f) +#define send(a,b,c,d) lwip_send(a,b,c,d) +#define sendto(a,b,c,d,e,f) lwip_sendto(a,b,c,d,e,f) +#define socket(a,b,c) lwip_socket(a,b,c) +#define select(a,b,c,d,e) lwip_select(a,b,c,d,e) +#define ioctlsocket(a,b,c) lwip_ioctl(a,b,c) + +#if LWIP_POSIX_SOCKETS_IO_NAMES +#define read(a,b,c) lwip_read(a,b,c) +#define write(a,b,c) lwip_write(a,b,c) +#define close(s) lwip_close(s) +#define fcntl(a,b,c) lwip_fcntl(a,b,c) +#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */ + +#endif /* LWIP_COMPAT_SOCKETS */ + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_SOCKET */ + +#endif /* __LWIP_SOCKETS_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/stats.h b/third_party/lwip-1.4.1/src/include/lwip/stats.h new file mode 100644 index 0000000..7e0764d --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/stats.h @@ -0,0 +1,292 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_STATS_H__ +#define __LWIP_STATS_H__ + +#include "lwip/opt.h" + +#include "lwip/mem.h" +#include "lwip/memp.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if LWIP_STATS + +#ifndef LWIP_STATS_LARGE +#define LWIP_STATS_LARGE 0 +#endif + +#if LWIP_STATS_LARGE +#define STAT_COUNTER u32_t +#define STAT_COUNTER_F U32_F +#else +#define STAT_COUNTER u16_t +#define STAT_COUNTER_F U16_F +#endif + +struct stats_proto { + STAT_COUNTER xmit; /* Transmitted packets. */ + STAT_COUNTER recv; /* Received packets. */ + STAT_COUNTER fw; /* Forwarded packets. */ + STAT_COUNTER drop; /* Dropped packets. */ + STAT_COUNTER chkerr; /* Checksum error. */ + STAT_COUNTER lenerr; /* Invalid length error. */ + STAT_COUNTER memerr; /* Out of memory error. */ + STAT_COUNTER rterr; /* Routing error. */ + STAT_COUNTER proterr; /* Protocol error. */ + STAT_COUNTER opterr; /* Error in options. */ + STAT_COUNTER err; /* Misc error. */ + STAT_COUNTER cachehit; +}; + +struct stats_igmp { + STAT_COUNTER xmit; /* Transmitted packets. */ + STAT_COUNTER recv; /* Received packets. */ + STAT_COUNTER drop; /* Dropped packets. */ + STAT_COUNTER chkerr; /* Checksum error. */ + STAT_COUNTER lenerr; /* Invalid length error. */ + STAT_COUNTER memerr; /* Out of memory error. */ + STAT_COUNTER proterr; /* Protocol error. */ + STAT_COUNTER rx_v1; /* Received v1 frames. */ + STAT_COUNTER rx_group; /* Received group-specific queries. */ + STAT_COUNTER rx_general; /* Received general queries. */ + STAT_COUNTER rx_report; /* Received reports. */ + STAT_COUNTER tx_join; /* Sent joins. */ + STAT_COUNTER tx_leave; /* Sent leaves. */ + STAT_COUNTER tx_report; /* Sent reports. */ +}; + +struct stats_mem { +#ifdef LWIP_DEBUG + const char *name; +#endif /* LWIP_DEBUG */ + mem_size_t avail; + mem_size_t used; + mem_size_t max; + STAT_COUNTER err; + STAT_COUNTER illegal; +}; + +struct stats_syselem { + STAT_COUNTER used; + STAT_COUNTER max; + STAT_COUNTER err; +}; + +struct stats_sys { + struct stats_syselem sem; + struct stats_syselem mutex; + struct stats_syselem mbox; +}; + +struct stats_ { +#if LINK_STATS + struct stats_proto link; +#endif +#if ETHARP_STATS + struct stats_proto etharp; +#endif +#if IPFRAG_STATS + struct stats_proto ip_frag; +#endif +#if IP_STATS + struct stats_proto ip; +#endif +#if ICMP_STATS + struct stats_proto icmp; +#endif +#if IGMP_STATS + struct stats_igmp igmp; +#endif +#if UDP_STATS + struct stats_proto udp; +#endif +#if TCP_STATS + struct stats_proto tcp; +#endif +#if MEM_STATS + struct stats_mem mem; +#endif +#if MEMP_STATS + struct stats_mem memp[MEMP_MAX]; +#endif +#if SYS_STATS + struct stats_sys sys; +#endif +}; + +extern struct stats_ lwip_stats; + +void stats_init(void); + +#define STATS_INC(x) ++lwip_stats.x +#define STATS_DEC(x) --lwip_stats.x +#define STATS_INC_USED(x, y) do { lwip_stats.x.used += y; \ + if (lwip_stats.x.max < lwip_stats.x.used) { \ + lwip_stats.x.max = lwip_stats.x.used; \ + } \ + } while(0) +#else /* LWIP_STATS */ +#define stats_init() +#define STATS_INC(x) +#define STATS_DEC(x) +#define STATS_INC_USED(x) +#endif /* LWIP_STATS */ + +#if TCP_STATS +#define TCP_STATS_INC(x) STATS_INC(x) +#define TCP_STATS_DISPLAY() stats_display_proto(&lwip_stats.tcp, "TCP") +#else +#define TCP_STATS_INC(x) +#define TCP_STATS_DISPLAY() +#endif + +#if UDP_STATS +#define UDP_STATS_INC(x) STATS_INC(x) +#define UDP_STATS_DISPLAY() stats_display_proto(&lwip_stats.udp, "UDP") +#else +#define UDP_STATS_INC(x) +#define UDP_STATS_DISPLAY() +#endif + +#if ICMP_STATS +#define ICMP_STATS_INC(x) STATS_INC(x) +#define ICMP_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp, "ICMP") +#else +#define ICMP_STATS_INC(x) +#define ICMP_STATS_DISPLAY() +#endif + +#if IGMP_STATS +#define IGMP_STATS_INC(x) STATS_INC(x) +#define IGMP_STATS_DISPLAY() stats_display_igmp(&lwip_stats.igmp) +#else +#define IGMP_STATS_INC(x) +#define IGMP_STATS_DISPLAY() +#endif + +#if IP_STATS +#define IP_STATS_INC(x) STATS_INC(x) +#define IP_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip, "IP") +#else +#define IP_STATS_INC(x) +#define IP_STATS_DISPLAY() +#endif + +#if IPFRAG_STATS +#define IPFRAG_STATS_INC(x) STATS_INC(x) +#define IPFRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip_frag, "IP_FRAG") +#else +#define IPFRAG_STATS_INC(x) +#define IPFRAG_STATS_DISPLAY() +#endif + +#if ETHARP_STATS +#define ETHARP_STATS_INC(x) STATS_INC(x) +#define ETHARP_STATS_DISPLAY() stats_display_proto(&lwip_stats.etharp, "ETHARP") +#else +#define ETHARP_STATS_INC(x) +#define ETHARP_STATS_DISPLAY() +#endif + +#if LINK_STATS +#define LINK_STATS_INC(x) STATS_INC(x) +#define LINK_STATS_DISPLAY() stats_display_proto(&lwip_stats.link, "LINK") +#else +#define LINK_STATS_INC(x) +#define LINK_STATS_DISPLAY() +#endif + +#if MEM_STATS +#define MEM_STATS_AVAIL(x, y) lwip_stats.mem.x = y +#define MEM_STATS_INC(x) STATS_INC(mem.x) +#define MEM_STATS_INC_USED(x, y) STATS_INC_USED(mem, y) +#define MEM_STATS_DEC_USED(x, y) lwip_stats.mem.x -= y +#define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, "HEAP") +#else +#define MEM_STATS_AVAIL(x, y) +#define MEM_STATS_INC(x) +#define MEM_STATS_INC_USED(x, y) +#define MEM_STATS_DEC_USED(x, y) +#define MEM_STATS_DISPLAY() +#endif + +#if MEMP_STATS +#define MEMP_STATS_AVAIL(x, i, y) lwip_stats.memp[i].x = y +#define MEMP_STATS_INC(x, i) STATS_INC(memp[i].x) +#define MEMP_STATS_DEC(x, i) STATS_DEC(memp[i].x) +#define MEMP_STATS_INC_USED(x, i) STATS_INC_USED(memp[i], 1) +#define MEMP_STATS_DISPLAY(i) stats_display_memp(&lwip_stats.memp[i], i) +#else +#define MEMP_STATS_AVAIL(x, i, y) +#define MEMP_STATS_INC(x, i) +#define MEMP_STATS_DEC(x, i) +#define MEMP_STATS_INC_USED(x, i) +#define MEMP_STATS_DISPLAY(i) +#endif + +#if SYS_STATS +#define SYS_STATS_INC(x) STATS_INC(sys.x) +#define SYS_STATS_DEC(x) STATS_DEC(sys.x) +#define SYS_STATS_INC_USED(x) STATS_INC_USED(sys.x, 1) +#define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys) +#else +#define SYS_STATS_INC(x) +#define SYS_STATS_DEC(x) +#define SYS_STATS_INC_USED(x) +#define SYS_STATS_DISPLAY() +#endif + +/* Display of statistics */ +#if LWIP_STATS_DISPLAY +void stats_display(void); +void stats_display_proto(struct stats_proto *proto, const char *name); +void stats_display_igmp(struct stats_igmp *igmp); +void stats_display_mem(struct stats_mem *mem, const char *name); +void stats_display_memp(struct stats_mem *mem, int index); +void stats_display_sys(struct stats_sys *sys); +#else /* LWIP_STATS_DISPLAY */ +#define stats_display() +#define stats_display_proto(proto, name) +#define stats_display_igmp(igmp) +#define stats_display_mem(mem, name) +#define stats_display_memp(mem, index) +#define stats_display_sys(sys) +#endif /* LWIP_STATS_DISPLAY */ + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_STATS_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/sys.h b/third_party/lwip-1.4.1/src/include/lwip/sys.h new file mode 100644 index 0000000..1fa507e --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/sys.h @@ -0,0 +1,337 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_SYS_H__ +#define __LWIP_SYS_H__ + +#include "lwip/opt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#if NO_SYS + +/* For a totally minimal and standalone system, we provide null + definitions of the sys_ functions. */ +typedef u8_t sys_sem_t; +typedef u8_t sys_mutex_t; +typedef u8_t sys_mbox_t; + +#define sys_sem_new(s, c) ERR_OK +#define sys_sem_signal(s) +#define sys_sem_wait(s) +#define sys_arch_sem_wait(s,t) +#define sys_sem_free(s) +#define sys_sem_valid(s) 0 +#define sys_sem_set_invalid(s) +#define sys_mutex_new(mu) ERR_OK +#define sys_mutex_lock(mu) +#define sys_mutex_unlock(mu) +#define sys_mutex_free(mu) +#define sys_mutex_valid(mu) 0 +#define sys_mutex_set_invalid(mu) +#define sys_mbox_new(m, s) ERR_OK +#define sys_mbox_fetch(m,d) +#define sys_mbox_tryfetch(m,d) +#define sys_mbox_post(m,d) +#define sys_mbox_trypost(m,d) +#define sys_mbox_free(m) +#define sys_mbox_valid(m) +#define sys_mbox_set_invalid(m) + +#define sys_thread_new(n,t,a,s,p) + +#define sys_msleep(t) + +#else /* NO_SYS */ + +/** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */ +#define SYS_ARCH_TIMEOUT 0xffffffffUL + +/** sys_mbox_tryfetch() returns SYS_MBOX_EMPTY if appropriate. + * For now we use the same magic value, but we allow this to change in future. + */ +#define SYS_MBOX_EMPTY SYS_ARCH_TIMEOUT + +#include "lwip/err.h" +#include "arch/sys_arch.h" + +/** Function prototype for thread functions */ +typedef void (*lwip_thread_fn)(void *arg); + +/* Function prototypes for functions to be implemented by platform ports + (in sys_arch.c) */ + +/* Mutex functions: */ + +/** Define LWIP_COMPAT_MUTEX if the port has no mutexes and binary semaphores + should be used instead */ +#if LWIP_COMPAT_MUTEX +/* for old ports that don't have mutexes: define them to binary semaphores */ +#define sys_mutex_t sys_sem_t +#define sys_mutex_new(mutex) sys_sem_new(mutex, 1) +#define sys_mutex_lock(mutex) sys_sem_wait(mutex) +#define sys_mutex_unlock(mutex) sys_sem_signal(mutex) +#define sys_mutex_free(mutex) sys_sem_free(mutex) +#define sys_mutex_valid(mutex) sys_sem_valid(mutex) +#define sys_mutex_set_invalid(mutex) sys_sem_set_invalid(mutex) + +#else /* LWIP_COMPAT_MUTEX */ + +/** Create a new mutex + * @param mutex pointer to the mutex to create + * @return a new mutex */ +err_t sys_mutex_new(sys_mutex_t *mutex); +/** Lock a mutex + * @param mutex the mutex to lock */ +void sys_mutex_lock(sys_mutex_t *mutex); +/** Unlock a mutex + * @param mutex the mutex to unlock */ +void sys_mutex_unlock(sys_mutex_t *mutex); +/** Delete a semaphore + * @param mutex the mutex to delete */ +void sys_mutex_free(sys_mutex_t *mutex); +#ifndef sys_mutex_valid +/** Check if a mutex is valid/allocated: return 1 for valid, 0 for invalid */ +int sys_mutex_valid(sys_mutex_t *mutex); +#endif +#ifndef sys_mutex_set_invalid +/** Set a mutex invalid so that sys_mutex_valid returns 0 */ +void sys_mutex_set_invalid(sys_mutex_t *mutex); +#endif +#endif /* LWIP_COMPAT_MUTEX */ + +/* Semaphore functions: */ + +/** Create a new semaphore + * @param sem pointer to the semaphore to create + * @param count initial count of the semaphore + * @return ERR_OK if successful, another err_t otherwise */ +err_t sys_sem_new(sys_sem_t *sem, u8_t count); +/** Signals a semaphore + * @param sem the semaphore to signal */ +void sys_sem_signal(sys_sem_t *sem); +/** Wait for a semaphore for the specified timeout + * @param sem the semaphore to wait for + * @param timeout timeout in milliseconds to wait (0 = wait forever) + * @return time (in milliseconds) waited for the semaphore + * or SYS_ARCH_TIMEOUT on timeout */ +u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout); +/** Delete a semaphore + * @param sem semaphore to delete */ +void sys_sem_free(sys_sem_t *sem); +/** Wait for a semaphore - forever/no timeout */ +#define sys_sem_wait(sem) sys_arch_sem_wait(sem, 0) +#ifndef sys_sem_valid +/** Check if a sempahore is valid/allocated: return 1 for valid, 0 for invalid */ +int sys_sem_valid(sys_sem_t *sem); +#endif +#ifndef sys_sem_set_invalid +/** Set a semaphore invalid so that sys_sem_valid returns 0 */ +void sys_sem_set_invalid(sys_sem_t *sem); +#endif + +/* Time functions. */ +#ifndef sys_msleep +void sys_msleep(u32_t ms); /* only has a (close to) 1 jiffy resolution. */ +#endif + +/* Mailbox functions. */ + +/** Create a new mbox of specified size + * @param mbox pointer to the mbox to create + * @param size (miminum) number of messages in this mbox + * @return ERR_OK if successful, another err_t otherwise */ +err_t sys_mbox_new(sys_mbox_t *mbox, int size); +/** Post a message to an mbox - may not fail + * -> blocks if full, only used from tasks not from ISR + * @param mbox mbox to posts the message + * @param msg message to post (ATTENTION: can be NULL) */ +void sys_mbox_post(sys_mbox_t *mbox, void *msg); +/** Try to post a message to an mbox - may fail if full or ISR + * @param mbox mbox to posts the message + * @param msg message to post (ATTENTION: can be NULL) */ +err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg); +/** Wait for a new message to arrive in the mbox + * @param mbox mbox to get a message from + * @param msg pointer where the message is stored + * @param timeout maximum time (in milliseconds) to wait for a message + * @return time (in milliseconds) waited for a message, may be 0 if not waited + or SYS_ARCH_TIMEOUT on timeout + * The returned time has to be accurate to prevent timer jitter! */ +u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout); +/* Allow port to override with a macro, e.g. special timout for sys_arch_mbox_fetch() */ +#ifndef sys_arch_mbox_tryfetch +/** Wait for a new message to arrive in the mbox + * @param mbox mbox to get a message from + * @param msg pointer where the message is stored + * @param timeout maximum time (in milliseconds) to wait for a message + * @return 0 (milliseconds) if a message has been received + * or SYS_MBOX_EMPTY if the mailbox is empty */ +u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg); +#endif +/** For now, we map straight to sys_arch implementation. */ +#define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg) +/** Delete an mbox + * @param mbox mbox to delete */ +void sys_mbox_free(sys_mbox_t *mbox); +#define sys_mbox_fetch(mbox, msg) sys_arch_mbox_fetch(mbox, msg, 0) +#ifndef sys_mbox_valid +/** Check if an mbox is valid/allocated: return 1 for valid, 0 for invalid */ +int sys_mbox_valid(sys_mbox_t *mbox); +#endif +#ifndef sys_mbox_set_invalid +/** Set an mbox invalid so that sys_mbox_valid returns 0 */ +void sys_mbox_set_invalid(sys_mbox_t *mbox); +#endif + +/** The only thread function: + * Creates a new thread + * @param name human-readable name for the thread (used for debugging purposes) + * @param thread thread-function + * @param arg parameter passed to 'thread' + * @param stacksize stack size in bytes for the new thread (may be ignored by ports) + * @param prio priority of the new thread (may be ignored by ports) */ +sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio); + +#endif /* NO_SYS */ + +/* sys_init() must be called before anthing else. */ +void sys_init(void); + +#ifndef sys_jiffies +/** Ticks/jiffies since power up. */ +u32_t sys_jiffies(void); +#endif + +/** Returns the current time in milliseconds, + * may be the same as sys_jiffies or at least based on it. */ +u32_t sys_now(void); + +/* Critical Region Protection */ +/* These functions must be implemented in the sys_arch.c file. + In some implementations they can provide a more light-weight protection + mechanism than using semaphores. Otherwise semaphores can be used for + implementation */ +#ifndef SYS_ARCH_PROTECT +/** SYS_LIGHTWEIGHT_PROT + * define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection + * for certain critical regions during buffer allocation, deallocation and memory + * allocation and deallocation. + */ +#if SYS_LIGHTWEIGHT_PROT + +/** SYS_ARCH_DECL_PROTECT + * declare a protection variable. This macro will default to defining a variable of + * type sys_prot_t. If a particular port needs a different implementation, then + * this macro may be defined in sys_arch.h. + */ +#define SYS_ARCH_DECL_PROTECT(lev) sys_prot_t lev +/** SYS_ARCH_PROTECT + * Perform a "fast" protect. This could be implemented by + * disabling interrupts for an embedded system or by using a semaphore or + * mutex. The implementation should allow calling SYS_ARCH_PROTECT when + * already protected. The old protection level is returned in the variable + * "lev". This macro will default to calling the sys_arch_protect() function + * which should be implemented in sys_arch.c. If a particular port needs a + * different implementation, then this macro may be defined in sys_arch.h + */ +#define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect() +/** SYS_ARCH_UNPROTECT + * Perform a "fast" set of the protection level to "lev". This could be + * implemented by setting the interrupt level to "lev" within the MACRO or by + * using a semaphore or mutex. This macro will default to calling the + * sys_arch_unprotect() function which should be implemented in + * sys_arch.c. If a particular port needs a different implementation, then + * this macro may be defined in sys_arch.h + */ +#define SYS_ARCH_UNPROTECT(lev) sys_arch_unprotect(lev) +sys_prot_t sys_arch_protect(void); +void sys_arch_unprotect(sys_prot_t pval); + +#else + +#define SYS_ARCH_DECL_PROTECT(lev) +#define SYS_ARCH_PROTECT(lev) +#define SYS_ARCH_UNPROTECT(lev) + +#endif /* SYS_LIGHTWEIGHT_PROT */ + +#endif /* SYS_ARCH_PROTECT */ + +/* + * Macros to set/get and increase/decrease variables in a thread-safe way. + * Use these for accessing variable that are used from more than one thread. + */ + +#ifndef SYS_ARCH_INC +#define SYS_ARCH_INC(var, val) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + var += val; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_INC */ + +#ifndef SYS_ARCH_DEC +#define SYS_ARCH_DEC(var, val) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + var -= val; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_DEC */ + +#ifndef SYS_ARCH_GET +#define SYS_ARCH_GET(var, ret) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + ret = var; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_GET */ + +#ifndef SYS_ARCH_SET +#define SYS_ARCH_SET(var, val) do { \ + SYS_ARCH_DECL_PROTECT(old_level); \ + SYS_ARCH_PROTECT(old_level); \ + var = val; \ + SYS_ARCH_UNPROTECT(old_level); \ + } while(0) +#endif /* SYS_ARCH_SET */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __LWIP_SYS_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/tcp.h b/third_party/lwip-1.4.1/src/include/lwip/tcp.h new file mode 100644 index 0000000..1401c56 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/tcp.h @@ -0,0 +1,379 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_TCP_H__ +#define __LWIP_TCP_H__ + +#include "lwip/opt.h" + +#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/mem.h" +#include "lwip/pbuf.h" +#include "lwip/ip.h" +#include "lwip/icmp.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct tcp_pcb; + +/** Function prototype for tcp accept callback functions. Called when a new + * connection can be accepted on a listening pcb. + * + * @param arg Additional argument to pass to the callback function (@see tcp_arg()) + * @param newpcb The new connection pcb + * @param err An error code if there has been an error accepting. + * Only return ERR_ABRT if you have called tcp_abort from within the + * callback function! + */ +typedef err_t (*tcp_accept_fn)(void *arg, struct tcp_pcb *newpcb, err_t err); + +/** Function prototype for tcp receive callback functions. Called when data has + * been received. + * + * @param arg Additional argument to pass to the callback function (@see tcp_arg()) + * @param tpcb The connection pcb which received data + * @param p The received data (or NULL when the connection has been closed!) + * @param err An error code if there has been an error receiving + * Only return ERR_ABRT if you have called tcp_abort from within the + * callback function! + */ +typedef err_t (*tcp_recv_fn)(void *arg, struct tcp_pcb *tpcb, + struct pbuf *p, err_t err); + +/** Function prototype for tcp sent callback functions. Called when sent data has + * been acknowledged by the remote side. Use it to free corresponding resources. + * This also means that the pcb has now space available to send new data. + * + * @param arg Additional argument to pass to the callback function (@see tcp_arg()) + * @param tpcb The connection pcb for which data has been acknowledged + * @param len The amount of bytes acknowledged + * @return ERR_OK: try to send some data by calling tcp_output + * Only return ERR_ABRT if you have called tcp_abort from within the + * callback function! + */ +typedef err_t (*tcp_sent_fn)(void *arg, struct tcp_pcb *tpcb, + u16_t len); + +/** Function prototype for tcp poll callback functions. Called periodically as + * specified by @see tcp_poll. + * + * @param arg Additional argument to pass to the callback function (@see tcp_arg()) + * @param tpcb tcp pcb + * @return ERR_OK: try to send some data by calling tcp_output + * Only return ERR_ABRT if you have called tcp_abort from within the + * callback function! + */ +typedef err_t (*tcp_poll_fn)(void *arg, struct tcp_pcb *tpcb); + +/** Function prototype for tcp error callback functions. Called when the pcb + * receives a RST or is unexpectedly closed for any other reason. + * + * @note The corresponding pcb is already freed when this callback is called! + * + * @param arg Additional argument to pass to the callback function (@see tcp_arg()) + * @param err Error code to indicate why the pcb has been closed + * ERR_ABRT: aborted through tcp_abort or by a TCP timer + * ERR_RST: the connection was reset by the remote host + */ +typedef void (*tcp_err_fn)(void *arg, err_t err); + +/** Function prototype for tcp connected callback functions. Called when a pcb + * is connected to the remote side after initiating a connection attempt by + * calling tcp_connect(). + * + * @param arg Additional argument to pass to the callback function (@see tcp_arg()) + * @param tpcb The connection pcb which is connected + * @param err An unused error code, always ERR_OK currently ;-) TODO! + * Only return ERR_ABRT if you have called tcp_abort from within the + * callback function! + * + * @note When a connection attempt fails, the error callback is currently called! + */ +typedef err_t (*tcp_connected_fn)(void *arg, struct tcp_pcb *tpcb, err_t err); + +enum tcp_state { + CLOSED = 0, + LISTEN = 1, + SYN_SENT = 2, + SYN_RCVD = 3, + ESTABLISHED = 4, + FIN_WAIT_1 = 5, + FIN_WAIT_2 = 6, + CLOSE_WAIT = 7, + CLOSING = 8, + LAST_ACK = 9, + TIME_WAIT = 10 +}; + +#if LWIP_CALLBACK_API + /* Function to call when a listener has been connected. + * @param arg user-supplied argument (tcp_pcb.callback_arg) + * @param pcb a new tcp_pcb that now is connected + * @param err an error argument (TODO: that is current always ERR_OK?) + * @return ERR_OK: accept the new connection, + * any other err_t abortsthe new connection + */ +#define DEF_ACCEPT_CALLBACK tcp_accept_fn accept; +#else /* LWIP_CALLBACK_API */ +#define DEF_ACCEPT_CALLBACK +#endif /* LWIP_CALLBACK_API */ + +/** + * members common to struct tcp_pcb and struct tcp_listen_pcb + */ +#define TCP_PCB_COMMON(type) \ + type *next; /* for the linked list */ \ + void *callback_arg; \ + /* the accept callback for listen- and normal pcbs, if LWIP_CALLBACK_API */ \ + DEF_ACCEPT_CALLBACK \ + enum tcp_state state; /* TCP state */ \ + u8_t prio; \ + /* ports are in host byte order */ \ + u16_t local_port + + +/* the TCP protocol control block */ +struct tcp_pcb { +/** common PCB members */ + IP_PCB; +/** protocol specific PCB members */ + TCP_PCB_COMMON(struct tcp_pcb); + + /* ports are in host byte order */ + u16_t remote_port; + + u8_t flags; +#define TF_ACK_DELAY ((u8_t)0x01U) /* Delayed ACK. */ +#define TF_ACK_NOW ((u8_t)0x02U) /* Immediate ACK. */ +#define TF_INFR ((u8_t)0x04U) /* In fast recovery. */ +#define TF_TIMESTAMP ((u8_t)0x08U) /* Timestamp option enabled */ +#define TF_RXCLOSED ((u8_t)0x10U) /* rx closed by tcp_shutdown */ +#define TF_FIN ((u8_t)0x20U) /* Connection was closed locally (FIN segment enqueued). */ +#define TF_NODELAY ((u8_t)0x40U) /* Disable Nagle algorithm */ +#define TF_NAGLEMEMERR ((u8_t)0x80U) /* nagle enabled, memerr, try to output to prevent delayed ACK to happen */ + + /* the rest of the fields are in host byte order + as we have to do some math with them */ + + /* Timers */ + u8_t polltmr, pollinterval; + u8_t last_timer; + u32_t tmr; + + /* receiver variables */ + u32_t rcv_nxt; /* next seqno expected */ + u16_t rcv_wnd; /* receiver window available */ + u16_t rcv_ann_wnd; /* receiver window to announce */ + u32_t rcv_ann_right_edge; /* announced right edge of window */ + + /* Retransmission timer. */ + s16_t rtime; + + u16_t mss; /* maximum segment size */ + + /* RTT (round trip time) estimation variables */ + u32_t rttest; /* RTT estimate in 500ms ticks */ + u32_t rtseq; /* sequence number being timed */ + s16_t sa, sv; /* @todo document this */ + + s16_t rto; /* retransmission time-out */ + u8_t nrtx; /* number of retransmissions */ + + /* fast retransmit/recovery */ + u8_t dupacks; + u32_t lastack; /* Highest acknowledged seqno. */ + + /* congestion avoidance/control variables */ + u16_t cwnd; + u16_t ssthresh; + + /* sender variables */ + u32_t snd_nxt; /* next new seqno to be sent */ + u32_t snd_wl1, snd_wl2; /* Sequence and acknowledgement numbers of last + window update. */ + u32_t snd_lbb; /* Sequence number of next byte to be buffered. */ + u16_t snd_wnd; /* sender window */ + u16_t snd_wnd_max; /* the maximum sender window announced by the remote host */ + + u16_t acked; + + u16_t snd_buf; /* Available buffer space for sending (in bytes). */ +#define TCP_SNDQUEUELEN_OVERFLOW (0xffffU-3) + u16_t snd_queuelen; /* Available buffer space for sending (in tcp_segs). */ + +#if TCP_OVERSIZE + /* Extra bytes available at the end of the last pbuf in unsent. */ + u16_t unsent_oversize; +#endif /* TCP_OVERSIZE */ + + /* These are ordered by sequence number: */ + struct tcp_seg *unsent; /* Unsent (queued) segments. */ + struct tcp_seg *unacked; /* Sent but unacknowledged segments. */ +#if TCP_QUEUE_OOSEQ + struct tcp_seg *ooseq; /* Received out of sequence segments. */ +#endif /* TCP_QUEUE_OOSEQ */ + + struct pbuf *refused_data; /* Data previously received but not yet taken by upper layer */ + +#if LWIP_CALLBACK_API + /* Function to be called when more send buffer space is available. */ + tcp_sent_fn sent; + /* Function to be called when (in-sequence) data has arrived. */ + tcp_recv_fn recv; + /* Function to be called when a connection has been set up. */ + tcp_connected_fn connected; + /* Function which is called periodically. */ + tcp_poll_fn poll; + /* Function to be called whenever a fatal error occurs. */ + tcp_err_fn errf; +#endif /* LWIP_CALLBACK_API */ + +#if LWIP_TCP_TIMESTAMPS + u32_t ts_lastacksent; + u32_t ts_recent; +#endif /* LWIP_TCP_TIMESTAMPS */ + + /* idle time before KEEPALIVE is sent */ + u32_t keep_idle; +#if LWIP_TCP_KEEPALIVE + u32_t keep_intvl; + u32_t keep_cnt; +#endif /* LWIP_TCP_KEEPALIVE */ + + /* Persist timer counter */ + u8_t persist_cnt; + /* Persist timer back-off */ + u8_t persist_backoff; + + /* KEEPALIVE counter */ + u8_t keep_cnt_sent; +}; + +struct tcp_pcb_listen { +/* Common members of all PCB types */ + IP_PCB; +/* Protocol specific PCB members */ + TCP_PCB_COMMON(struct tcp_pcb_listen); + +#if TCP_LISTEN_BACKLOG + u8_t backlog; + u8_t accepts_pending; +#endif /* TCP_LISTEN_BACKLOG */ +}; + +#if LWIP_EVENT_API + +enum lwip_event { + LWIP_EVENT_ACCEPT, + LWIP_EVENT_SENT, + LWIP_EVENT_RECV, + LWIP_EVENT_CONNECTED, + LWIP_EVENT_POLL, + LWIP_EVENT_ERR +}; + +err_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb, + enum lwip_event, + struct pbuf *p, + u16_t size, + err_t err); + +#endif /* LWIP_EVENT_API */ + +/* Application program's interface: */ +struct tcp_pcb * tcp_new (void); + +void tcp_arg (struct tcp_pcb *pcb, void *arg); +void tcp_accept (struct tcp_pcb *pcb, tcp_accept_fn accept); +void tcp_recv (struct tcp_pcb *pcb, tcp_recv_fn recv); +void tcp_sent (struct tcp_pcb *pcb, tcp_sent_fn sent); +void tcp_poll (struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval); +void tcp_err (struct tcp_pcb *pcb, tcp_err_fn err); + +#define tcp_mss(pcb) (((pcb)->flags & TF_TIMESTAMP) ? ((pcb)->mss - 12) : (pcb)->mss) +#define tcp_sndbuf(pcb) ((pcb)->snd_buf) +#define tcp_sndqueuelen(pcb) ((pcb)->snd_queuelen) +#define tcp_nagle_disable(pcb) ((pcb)->flags |= TF_NODELAY) +#define tcp_nagle_enable(pcb) ((pcb)->flags &= ~TF_NODELAY) +#define tcp_nagle_disabled(pcb) (((pcb)->flags & TF_NODELAY) != 0) + +#if TCP_LISTEN_BACKLOG +#define tcp_accepted(pcb) do { \ + LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", pcb->state == LISTEN); \ + (((struct tcp_pcb_listen *)(pcb))->accepts_pending--); } while(0) +#else /* TCP_LISTEN_BACKLOG */ +#define tcp_accepted(pcb) LWIP_ASSERT("pcb->state == LISTEN (called for wrong pcb?)", \ + (pcb)->state == LISTEN) +#endif /* TCP_LISTEN_BACKLOG */ + +void tcp_recved (struct tcp_pcb *pcb, u16_t len); +err_t tcp_bind (struct tcp_pcb *pcb, ip_addr_t *ipaddr, + u16_t port); +err_t tcp_connect (struct tcp_pcb *pcb, ip_addr_t *ipaddr, + u16_t port, tcp_connected_fn connected); + +struct tcp_pcb * tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog); +#define tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG) + +void tcp_abort (struct tcp_pcb *pcb); +err_t tcp_close (struct tcp_pcb *pcb); +err_t tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx); + +/* Flags for "apiflags" parameter in tcp_write */ +#define TCP_WRITE_FLAG_COPY 0x01 +#define TCP_WRITE_FLAG_MORE 0x02 + +err_t tcp_write (struct tcp_pcb *pcb, const void *dataptr, u16_t len, + u8_t apiflags); + +void tcp_setprio (struct tcp_pcb *pcb, u8_t prio); + +#define TCP_PRIO_MIN 1 +#define TCP_PRIO_NORMAL 64 +#define TCP_PRIO_MAX 127 + +err_t tcp_output (struct tcp_pcb *pcb); + + +const char* tcp_debug_state_str(enum tcp_state s); + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_TCP */ + +#endif /* __LWIP_TCP_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/tcp_impl.h b/third_party/lwip-1.4.1/src/include/lwip/tcp_impl.h new file mode 100644 index 0000000..f906d21 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/tcp_impl.h @@ -0,0 +1,486 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_TCP_IMPL_H__ +#define __LWIP_TCP_IMPL_H__ + +#include "lwip/opt.h" + +#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/tcp.h" +#include "lwip/mem.h" +#include "lwip/pbuf.h" +#include "lwip/ip.h" +#include "lwip/icmp.h" +#include "lwip/err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Functions for interfacing with TCP: */ + +/* Lower layer interface to TCP: */ +void tcp_init (void); /* Initialize this module. */ +void tcp_tmr (void); /* Must be called every + TCP_TMR_INTERVAL + ms. (Typically 250 ms). */ +/* It is also possible to call these two functions at the right + intervals (instead of calling tcp_tmr()). */ +void tcp_slowtmr (void); +void tcp_fasttmr (void); + + +/* Only used by IP to pass a TCP segment to TCP: */ +void tcp_input (struct pbuf *p, struct netif *inp); +/* Used within the TCP code only: */ +struct tcp_pcb * tcp_alloc (u8_t prio); +void tcp_abandon (struct tcp_pcb *pcb, int reset); +err_t tcp_send_empty_ack(struct tcp_pcb *pcb); +void tcp_rexmit (struct tcp_pcb *pcb); +void tcp_rexmit_rto (struct tcp_pcb *pcb); +void tcp_rexmit_fast (struct tcp_pcb *pcb); +u32_t tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb); +err_t tcp_process_refused_data(struct tcp_pcb *pcb); + +/** + * This is the Nagle algorithm: try to combine user data to send as few TCP + * segments as possible. Only send if + * - no previously transmitted data on the connection remains unacknowledged or + * - the TF_NODELAY flag is set (nagle algorithm turned off for this pcb) or + * - the only unsent segment is at least pcb->mss bytes long (or there is more + * than one unsent segment - with lwIP, this can happen although unsent->len < mss) + * - or if we are in fast-retransmit (TF_INFR) + */ +#define tcp_do_output_nagle(tpcb) ((((tpcb)->unacked == NULL) || \ + ((tpcb)->flags & (TF_NODELAY | TF_INFR)) || \ + (((tpcb)->unsent != NULL) && (((tpcb)->unsent->next != NULL) || \ + ((tpcb)->unsent->len >= (tpcb)->mss))) || \ + ((tcp_sndbuf(tpcb) == 0) || (tcp_sndqueuelen(tpcb) >= TCP_SND_QUEUELEN)) \ + ) ? 1 : 0) +#define tcp_output_nagle(tpcb) (tcp_do_output_nagle(tpcb) ? tcp_output(tpcb) : ERR_OK) + + +#define TCP_SEQ_LT(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) < 0) +#define TCP_SEQ_LEQ(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) <= 0) +#define TCP_SEQ_GT(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) > 0) +#define TCP_SEQ_GEQ(a,b) ((s32_t)((u32_t)(a) - (u32_t)(b)) >= 0) +/* is b<=a<=c? */ +#if 0 /* see bug #10548 */ +#define TCP_SEQ_BETWEEN(a,b,c) ((c)-(b) >= (a)-(b)) +#endif +#define TCP_SEQ_BETWEEN(a,b,c) (TCP_SEQ_GEQ(a,b) && TCP_SEQ_LEQ(a,c)) +#define TCP_FIN 0x01U +#define TCP_SYN 0x02U +#define TCP_RST 0x04U +#define TCP_PSH 0x08U +#define TCP_ACK 0x10U +#define TCP_URG 0x20U +#define TCP_ECE 0x40U +#define TCP_CWR 0x80U + +#define TCP_FLAGS 0x3fU + +/* Length of the TCP header, excluding options. */ +#define TCP_HLEN 20 + +#ifndef TCP_TMR_INTERVAL +#define TCP_TMR_INTERVAL 250 /* The TCP timer interval in milliseconds. */ +#endif /* TCP_TMR_INTERVAL */ + +#ifndef TCP_FAST_INTERVAL +#define TCP_FAST_INTERVAL TCP_TMR_INTERVAL /* the fine grained timeout in milliseconds */ +#endif /* TCP_FAST_INTERVAL */ + +#ifndef TCP_SLOW_INTERVAL +#define TCP_SLOW_INTERVAL (2*TCP_TMR_INTERVAL) /* the coarse grained timeout in milliseconds */ +#endif /* TCP_SLOW_INTERVAL */ + +#define TCP_FIN_WAIT_TIMEOUT 20000 /* milliseconds */ +#define TCP_SYN_RCVD_TIMEOUT 20000 /* milliseconds */ + +#define TCP_OOSEQ_TIMEOUT 6U /* x RTO */ + +#ifndef TCP_MSL +#define TCP_MSL 60000UL /* The maximum segment lifetime in milliseconds */ +#endif + +/* Keepalive values, compliant with RFC 1122. Don't change this unless you know what you're doing */ +#ifndef TCP_KEEPIDLE_DEFAULT +#define TCP_KEEPIDLE_DEFAULT 7200000UL /* Default KEEPALIVE timer in milliseconds */ +#endif + +#ifndef TCP_KEEPINTVL_DEFAULT +#define TCP_KEEPINTVL_DEFAULT 75000UL /* Default Time between KEEPALIVE probes in milliseconds */ +#endif + +#ifndef TCP_KEEPCNT_DEFAULT +#define TCP_KEEPCNT_DEFAULT 9U /* Default Counter for KEEPALIVE probes */ +#endif + +#define TCP_MAXIDLE TCP_KEEPCNT_DEFAULT * TCP_KEEPINTVL_DEFAULT /* Maximum KEEPALIVE probe time */ + +/* Fields are (of course) in network byte order. + * Some fields are converted to host byte order in tcp_input(). + */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct tcp_hdr { + PACK_STRUCT_FIELD(u16_t src); + PACK_STRUCT_FIELD(u16_t dest); + PACK_STRUCT_FIELD(u32_t seqno); + PACK_STRUCT_FIELD(u32_t ackno); + PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags); + PACK_STRUCT_FIELD(u16_t wnd); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u16_t urgp); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12) +#define TCPH_FLAGS(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS) + +#define TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | TCPH_FLAGS(phdr)) +#define TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = (((phdr)->_hdrlen_rsvd_flags & PP_HTONS((u16_t)(~(u16_t)(TCP_FLAGS)))) | htons(flags)) +#define TCPH_HDRLEN_FLAGS_SET(phdr, len, flags) (phdr)->_hdrlen_rsvd_flags = htons(((len) << 12) | (flags)) + +#define TCPH_SET_FLAG(phdr, flags ) (phdr)->_hdrlen_rsvd_flags = ((phdr)->_hdrlen_rsvd_flags | htons(flags)) +#define TCPH_UNSET_FLAG(phdr, flags) (phdr)->_hdrlen_rsvd_flags = htons(ntohs((phdr)->_hdrlen_rsvd_flags) | (TCPH_FLAGS(phdr) & ~(flags)) ) + +#define TCP_TCPLEN(seg) ((seg)->len + ((TCPH_FLAGS((seg)->tcphdr) & (TCP_FIN | TCP_SYN)) != 0)) + +/** Flags used on input processing, not on pcb->flags +*/ +#define TF_RESET (u8_t)0x08U /* Connection was reset. */ +#define TF_CLOSED (u8_t)0x10U /* Connection was sucessfully closed. */ +#define TF_GOT_FIN (u8_t)0x20U /* Connection was closed by the remote end. */ + + +#if LWIP_EVENT_API + +#define TCP_EVENT_ACCEPT(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_ACCEPT, NULL, 0, err) +#define TCP_EVENT_SENT(pcb,space,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_SENT, NULL, space, ERR_OK) +#define TCP_EVENT_RECV(pcb,p,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_RECV, (p), 0, (err)) +#define TCP_EVENT_CLOSED(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_RECV, NULL, 0, ERR_OK) +#define TCP_EVENT_CONNECTED(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_CONNECTED, NULL, 0, (err)) +#define TCP_EVENT_POLL(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\ + LWIP_EVENT_POLL, NULL, 0, ERR_OK) +#define TCP_EVENT_ERR(errf,arg,err) lwip_tcp_event((arg), NULL, \ + LWIP_EVENT_ERR, NULL, 0, (err)) + +#else /* LWIP_EVENT_API */ + +#define TCP_EVENT_ACCEPT(pcb,err,ret) \ + do { \ + if((pcb)->accept != NULL) \ + (ret) = (pcb)->accept((pcb)->callback_arg,(pcb),(err)); \ + else (ret) = ERR_ARG; \ + } while (0) + +#define TCP_EVENT_SENT(pcb,space,ret) \ + do { \ + if((pcb)->sent != NULL) \ + (ret) = (pcb)->sent((pcb)->callback_arg,(pcb),(space)); \ + else (ret) = ERR_OK; \ + } while (0) + +#define TCP_EVENT_RECV(pcb,p,err,ret) \ + do { \ + if((pcb)->recv != NULL) { \ + (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err));\ + } else { \ + (ret) = tcp_recv_null(NULL, (pcb), (p), (err)); \ + } \ + } while (0) + +#define TCP_EVENT_CLOSED(pcb,ret) \ + do { \ + if(((pcb)->recv != NULL)) { \ + (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),NULL,ERR_OK);\ + } else { \ + (ret) = ERR_OK; \ + } \ + } while (0) + +#define TCP_EVENT_CONNECTED(pcb,err,ret) \ + do { \ + if((pcb)->connected != NULL) \ + (ret) = (pcb)->connected((pcb)->callback_arg,(pcb),(err)); \ + else (ret) = ERR_OK; \ + } while (0) + +#define TCP_EVENT_POLL(pcb,ret) \ + do { \ + if((pcb)->poll != NULL) \ + (ret) = (pcb)->poll((pcb)->callback_arg,(pcb)); \ + else (ret) = ERR_OK; \ + } while (0) + +#define TCP_EVENT_ERR(errf,arg,err) \ + do { \ + if((errf) != NULL) \ + (errf)((arg),(err)); \ + } while (0) + +#endif /* LWIP_EVENT_API */ + +/** Enabled extra-check for TCP_OVERSIZE if LWIP_DEBUG is enabled */ +#if TCP_OVERSIZE && defined(LWIP_DEBUG) +#define TCP_OVERSIZE_DBGCHECK 1 +#else +#define TCP_OVERSIZE_DBGCHECK 0 +#endif + +/** Don't generate checksum on copy if CHECKSUM_GEN_TCP is disabled */ +#define TCP_CHECKSUM_ON_COPY (LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_TCP) + +/* This structure represents a TCP segment on the unsent, unacked and ooseq queues */ +struct tcp_seg { + struct tcp_seg *next; /* used when putting segements on a queue */ + struct pbuf *p; /* buffer containing data + TCP header */ + u16_t len; /* the TCP length of this segment */ +#if TCP_OVERSIZE_DBGCHECK + u16_t oversize_left; /* Extra bytes available at the end of the last + pbuf in unsent (used for asserting vs. + tcp_pcb.unsent_oversized only) */ +#endif /* TCP_OVERSIZE_DBGCHECK */ +#if TCP_CHECKSUM_ON_COPY + u16_t chksum; + u8_t chksum_swapped; +#endif /* TCP_CHECKSUM_ON_COPY */ + u8_t flags; +#define TF_SEG_OPTS_MSS (u8_t)0x01U /* Include MSS option. */ +#define TF_SEG_OPTS_TS (u8_t)0x02U /* Include timestamp option. */ +#define TF_SEG_DATA_CHECKSUMMED (u8_t)0x04U /* ALL data (not the header) is + checksummed into 'chksum' */ + struct tcp_hdr *tcphdr; /* the TCP header */ +}; + +#define LWIP_TCP_OPT_LENGTH(flags) \ + (flags & TF_SEG_OPTS_MSS ? 4 : 0) + \ + (flags & TF_SEG_OPTS_TS ? 12 : 0) + +/** This returns a TCP header option for MSS in an u32_t */ +#define TCP_BUILD_MSS_OPTION(mss) htonl(0x02040000 | ((mss) & 0xFFFF)) + +/* Global variables: */ +extern struct tcp_pcb *tcp_input_pcb; +extern u32_t tcp_ticks; +extern u8_t tcp_active_pcbs_changed; + +/* The TCP PCB lists. */ +union tcp_listen_pcbs_t { /* List of all TCP PCBs in LISTEN state. */ + struct tcp_pcb_listen *listen_pcbs; + struct tcp_pcb *pcbs; +}; +extern struct tcp_pcb *tcp_bound_pcbs; +extern union tcp_listen_pcbs_t tcp_listen_pcbs; +extern struct tcp_pcb *tcp_active_pcbs; /* List of all TCP PCBs that are in a + state in which they accept or send + data. */ +extern struct tcp_pcb *tcp_tw_pcbs; /* List of all TCP PCBs in TIME-WAIT. */ + +extern struct tcp_pcb *tcp_tmp_pcb; /* Only used for temporary storage. */ + +/* Axioms about the above lists: + 1) Every TCP PCB that is not CLOSED is in one of the lists. + 2) A PCB is only in one of the lists. + 3) All PCBs in the tcp_listen_pcbs list is in LISTEN state. + 4) All PCBs in the tcp_tw_pcbs list is in TIME-WAIT state. +*/ +/* Define two macros, TCP_REG and TCP_RMV that registers a TCP PCB + with a PCB list or removes a PCB from a list, respectively. */ +#ifndef TCP_DEBUG_PCB_LISTS +#define TCP_DEBUG_PCB_LISTS 0 +#endif +#if TCP_DEBUG_PCB_LISTS +#define TCP_REG(pcbs, npcb) do {\ + LWIP_DEBUGF(TCP_DEBUG, ("TCP_REG %p local port %d\n", (npcb), (npcb)->local_port)); \ + for(tcp_tmp_pcb = *(pcbs); \ + tcp_tmp_pcb != NULL; \ + tcp_tmp_pcb = tcp_tmp_pcb->next) { \ + LWIP_ASSERT("TCP_REG: already registered\n", tcp_tmp_pcb != (npcb)); \ + } \ + LWIP_ASSERT("TCP_REG: pcb->state != CLOSED", ((pcbs) == &tcp_bound_pcbs) || ((npcb)->state != CLOSED)); \ + (npcb)->next = *(pcbs); \ + LWIP_ASSERT("TCP_REG: npcb->next != npcb", (npcb)->next != (npcb)); \ + *(pcbs) = (npcb); \ + LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \ + tcp_timer_needed(); \ + } while(0) +#define TCP_RMV(pcbs, npcb) do { \ + LWIP_ASSERT("TCP_RMV: pcbs != NULL", *(pcbs) != NULL); \ + LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removing %p from %p\n", (npcb), *(pcbs))); \ + if(*(pcbs) == (npcb)) { \ + *(pcbs) = (*pcbs)->next; \ + } else for(tcp_tmp_pcb = *(pcbs); tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \ + if(tcp_tmp_pcb->next == (npcb)) { \ + tcp_tmp_pcb->next = (npcb)->next; \ + break; \ + } \ + } \ + (npcb)->next = NULL; \ + LWIP_ASSERT("TCP_RMV: tcp_pcbs sane", tcp_pcbs_sane()); \ + LWIP_DEBUGF(TCP_DEBUG, ("TCP_RMV: removed %p from %p\n", (npcb), *(pcbs))); \ + } while(0) + +#else /* LWIP_DEBUG */ + +#define TCP_REG(pcbs, npcb) \ + do { \ + (npcb)->next = *pcbs; \ + *(pcbs) = (npcb); \ + tcp_timer_needed(); \ + } while (0) + +#define TCP_RMV(pcbs, npcb) \ + do { \ + if(*(pcbs) == (npcb)) { \ + (*(pcbs)) = (*pcbs)->next; \ + } \ + else { \ + for(tcp_tmp_pcb = *pcbs; \ + tcp_tmp_pcb != NULL; \ + tcp_tmp_pcb = tcp_tmp_pcb->next) { \ + if(tcp_tmp_pcb->next == (npcb)) { \ + tcp_tmp_pcb->next = (npcb)->next; \ + break; \ + } \ + } \ + } \ + (npcb)->next = NULL; \ + } while(0) + +#endif /* LWIP_DEBUG */ + +#define TCP_REG_ACTIVE(npcb) \ + do { \ + TCP_REG(&tcp_active_pcbs, npcb); \ + tcp_active_pcbs_changed = 1; \ + } while (0) + +#define TCP_RMV_ACTIVE(npcb) \ + do { \ + TCP_RMV(&tcp_active_pcbs, npcb); \ + tcp_active_pcbs_changed = 1; \ + } while (0) + +#define TCP_PCB_REMOVE_ACTIVE(pcb) \ + do { \ + tcp_pcb_remove(&tcp_active_pcbs, pcb); \ + tcp_active_pcbs_changed = 1; \ + } while (0) + + +/* Internal functions: */ +struct tcp_pcb *tcp_pcb_copy(struct tcp_pcb *pcb); +void tcp_pcb_purge(struct tcp_pcb *pcb); +void tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb); + +void tcp_segs_free(struct tcp_seg *seg); +void tcp_seg_free(struct tcp_seg *seg); +struct tcp_seg *tcp_seg_copy(struct tcp_seg *seg); + +#define tcp_ack(pcb) \ + do { \ + if((pcb)->flags & TF_ACK_DELAY) { \ + (pcb)->flags &= ~TF_ACK_DELAY; \ + (pcb)->flags |= TF_ACK_NOW; \ + } \ + else { \ + (pcb)->flags |= TF_ACK_DELAY; \ + } \ + } while (0) + +#define tcp_ack_now(pcb) \ + do { \ + (pcb)->flags |= TF_ACK_NOW; \ + } while (0) + +err_t tcp_send_fin(struct tcp_pcb *pcb); +err_t tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags); + +void tcp_rexmit_seg(struct tcp_pcb *pcb, struct tcp_seg *seg); + +void tcp_rst(u32_t seqno, u32_t ackno, + ip_addr_t *local_ip, ip_addr_t *remote_ip, + u16_t local_port, u16_t remote_port); + +u32_t tcp_next_iss(void); + +void tcp_keepalive(struct tcp_pcb *pcb); +void tcp_zero_window_probe(struct tcp_pcb *pcb); + +#if TCP_CALCULATE_EFF_SEND_MSS +u16_t tcp_eff_send_mss(u16_t sendmss, ip_addr_t *addr); +#endif /* TCP_CALCULATE_EFF_SEND_MSS */ + +#if LWIP_CALLBACK_API +err_t tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err); +#endif /* LWIP_CALLBACK_API */ + +#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG +void tcp_debug_print(struct tcp_hdr *tcphdr); +void tcp_debug_print_flags(u8_t flags); +void tcp_debug_print_state(enum tcp_state s); +void tcp_debug_print_pcbs(void); +s16_t tcp_pcbs_sane(void); +#else +# define tcp_debug_print(tcphdr) +# define tcp_debug_print_flags(flags) +# define tcp_debug_print_state(s) +# define tcp_debug_print_pcbs() +# define tcp_pcbs_sane() 1 +#endif /* TCP_DEBUG */ + +/** External function (implemented in timers.c), called when TCP detects + * that a timer is needed (i.e. active- or time-wait-pcb found). */ +void tcp_timer_needed(void); + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_TCP */ + +#endif /* __LWIP_TCP_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/tcpip.h b/third_party/lwip-1.4.1/src/include/lwip/tcpip.h new file mode 100644 index 0000000..a2c9a5b --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/tcpip.h @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_TCPIP_H__ +#define __LWIP_TCPIP_H__ + +#include "lwip/opt.h" + +#if !NO_SYS /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/api_msg.h" +#include "lwip/netifapi.h" +#include "lwip/pbuf.h" +#include "lwip/api.h" +#include "lwip/sys.h" +#include "lwip/timers.h" +#include "lwip/netif.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** Define this to something that triggers a watchdog. This is called from + * tcpip_thread after processing a message. */ +#ifndef LWIP_TCPIP_THREAD_ALIVE +#define LWIP_TCPIP_THREAD_ALIVE() +#endif + +#if LWIP_TCPIP_CORE_LOCKING +/** The global semaphore to lock the stack. */ +extern sys_mutex_t lock_tcpip_core; +#define LOCK_TCPIP_CORE() sys_mutex_lock(&lock_tcpip_core) +#define UNLOCK_TCPIP_CORE() sys_mutex_unlock(&lock_tcpip_core) +#define TCPIP_APIMSG(m) tcpip_apimsg_lock(m) +#define TCPIP_APIMSG_ACK(m) +#define TCPIP_NETIFAPI(m) tcpip_netifapi_lock(m) +#define TCPIP_NETIFAPI_ACK(m) +#else /* LWIP_TCPIP_CORE_LOCKING */ +#define LOCK_TCPIP_CORE() +#define UNLOCK_TCPIP_CORE() +#define TCPIP_APIMSG(m) tcpip_apimsg(m) +#define TCPIP_APIMSG_ACK(m) sys_sem_signal(&m->conn->op_completed) +#define TCPIP_NETIFAPI(m) tcpip_netifapi(m) +#define TCPIP_NETIFAPI_ACK(m) sys_sem_signal(&m->sem) +#endif /* LWIP_TCPIP_CORE_LOCKING */ + +/** Function prototype for the init_done function passed to tcpip_init */ +typedef void (*tcpip_init_done_fn)(void *arg); +/** Function prototype for functions passed to tcpip_callback() */ +typedef void (*tcpip_callback_fn)(void *ctx); + +/* Forward declarations */ +struct tcpip_callback_msg; + +void tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg); + +#if LWIP_NETCONN +err_t tcpip_apimsg(struct api_msg *apimsg); +#if LWIP_TCPIP_CORE_LOCKING +err_t tcpip_apimsg_lock(struct api_msg *apimsg); +#endif /* LWIP_TCPIP_CORE_LOCKING */ +#endif /* LWIP_NETCONN */ + +err_t tcpip_input(struct pbuf *p, struct netif *inp); + +#if LWIP_NETIF_API +err_t tcpip_netifapi(struct netifapi_msg *netifapimsg); +#if LWIP_TCPIP_CORE_LOCKING +err_t tcpip_netifapi_lock(struct netifapi_msg *netifapimsg); +#endif /* LWIP_TCPIP_CORE_LOCKING */ +#endif /* LWIP_NETIF_API */ + +err_t tcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block); +#define tcpip_callback(f, ctx) tcpip_callback_with_block(f, ctx, 1) + +struct tcpip_callback_msg* tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx); +void tcpip_callbackmsg_delete(struct tcpip_callback_msg* msg); +err_t tcpip_trycallback(struct tcpip_callback_msg* msg); + +/* free pbufs or heap memory from another context without blocking */ +err_t pbuf_free_callback(struct pbuf *p); +err_t mem_free_callback(void *m); + +#if LWIP_TCPIP_TIMEOUT +err_t tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg); +err_t tcpip_untimeout(sys_timeout_handler h, void *arg); +#endif /* LWIP_TCPIP_TIMEOUT */ + +enum tcpip_msg_type { +#if LWIP_NETCONN + TCPIP_MSG_API, +#endif /* LWIP_NETCONN */ + TCPIP_MSG_INPKT, +#if LWIP_NETIF_API + TCPIP_MSG_NETIFAPI, +#endif /* LWIP_NETIF_API */ +#if LWIP_TCPIP_TIMEOUT + TCPIP_MSG_TIMEOUT, + TCPIP_MSG_UNTIMEOUT, +#endif /* LWIP_TCPIP_TIMEOUT */ + TCPIP_MSG_CALLBACK, + TCPIP_MSG_CALLBACK_STATIC +}; + +struct tcpip_msg { + enum tcpip_msg_type type; + sys_sem_t *sem; + union { +#if LWIP_NETCONN + struct api_msg *apimsg; +#endif /* LWIP_NETCONN */ +#if LWIP_NETIF_API + struct netifapi_msg *netifapimsg; +#endif /* LWIP_NETIF_API */ + struct { + struct pbuf *p; + struct netif *netif; + } inp; + struct { + tcpip_callback_fn function; + void *ctx; + } cb; +#if LWIP_TCPIP_TIMEOUT + struct { + u32_t msecs; + sys_timeout_handler h; + void *arg; + } tmo; +#endif /* LWIP_TCPIP_TIMEOUT */ + } msg; +}; + +#ifdef __cplusplus +} +#endif + +#endif /* !NO_SYS */ + +#endif /* __LWIP_TCPIP_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/timers.h b/third_party/lwip-1.4.1/src/include/lwip/timers.h new file mode 100644 index 0000000..03612f9 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/timers.h @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * Simon Goldschmidt + * + */ +#ifndef __LWIP_TIMERS_H__ +#define __LWIP_TIMERS_H__ + +#include "lwip/opt.h" + +/* Timers are not supported when NO_SYS==1 and NO_SYS_NO_TIMERS==1 */ +#define LWIP_TIMERS (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS)) + +#if LWIP_TIMERS + +#include "lwip/err.h" +#if !NO_SYS +#include "lwip/sys.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef LWIP_DEBUG_TIMERNAMES +#ifdef LWIP_DEBUG +#define LWIP_DEBUG_TIMERNAMES SYS_DEBUG +#else /* LWIP_DEBUG */ +#define LWIP_DEBUG_TIMERNAMES 0 +#endif /* LWIP_DEBUG*/ +#endif + +/** Function prototype for a timeout callback function. Register such a function + * using sys_timeout(). + * + * @param arg Additional argument to pass to the function - set up by sys_timeout() + */ +typedef void (* sys_timeout_handler)(void *arg); + +struct sys_timeo { + struct sys_timeo *next; + u32_t time; + sys_timeout_handler h; + void *arg; +#if LWIP_DEBUG_TIMERNAMES + const char* handler_name; +#endif /* LWIP_DEBUG_TIMERNAMES */ +}; + +void sys_timeouts_init(void); + +#if LWIP_DEBUG_TIMERNAMES +void sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name); +#define sys_timeout(msecs, handler, arg) sys_timeout_debug(msecs, handler, arg, #handler) +#else /* LWIP_DEBUG_TIMERNAMES */ +void sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg); +#endif /* LWIP_DEBUG_TIMERNAMES */ + +void sys_untimeout(sys_timeout_handler handler, void *arg); +#if NO_SYS +void sys_check_timeouts(void); +void sys_restart_timeouts(void); +#else /* NO_SYS */ +void sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg); +#endif /* NO_SYS */ + + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_TIMERS */ +#endif /* __LWIP_TIMERS_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/lwip/udp.h b/third_party/lwip-1.4.1/src/include/lwip/udp.h new file mode 100644 index 0000000..1ddb734 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/lwip/udp.h @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __LWIP_UDP_H__ +#define __LWIP_UDP_H__ + +#include "lwip/opt.h" + +#if LWIP_UDP /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/netif.h" +#include "lwip/ip_addr.h" +#include "lwip/ip.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define UDP_HLEN 8 + +/* Fields are (of course) in network byte order. */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct udp_hdr { + PACK_STRUCT_FIELD(u16_t src); + PACK_STRUCT_FIELD(u16_t dest); /* src/dest UDP ports */ + PACK_STRUCT_FIELD(u16_t len); + PACK_STRUCT_FIELD(u16_t chksum); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define UDP_FLAGS_NOCHKSUM 0x01U +#define UDP_FLAGS_UDPLITE 0x02U +#define UDP_FLAGS_CONNECTED 0x04U +#define UDP_FLAGS_MULTICAST_LOOP 0x08U + +struct udp_pcb; + +/** Function prototype for udp pcb receive callback functions + * addr and port are in same byte order as in the pcb + * The callback is responsible for freeing the pbuf + * if it's not used any more. + * + * ATTENTION: Be aware that 'addr' points into the pbuf 'p' so freeing this pbuf + * makes 'addr' invalid, too. + * + * @param arg user supplied argument (udp_pcb.recv_arg) + * @param pcb the udp_pcb which received data + * @param p the packet buffer that was received + * @param addr the remote IP address from which the packet was received + * @param port the remote port from which the packet was received + */ +typedef void (*udp_recv_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p, + ip_addr_t *addr, u16_t port); + + +struct udp_pcb { +/* Common members of all PCB types */ + IP_PCB; + +/* Protocol specific PCB members */ + + struct udp_pcb *next; + + u8_t flags; + /** ports are in host byte order */ + u16_t local_port, remote_port; + +#if LWIP_IGMP + /** outgoing network interface for multicast packets */ + ip_addr_t multicast_ip; +#endif /* LWIP_IGMP */ + +#if LWIP_UDPLITE + /** used for UDP_LITE only */ + u16_t chksum_len_rx, chksum_len_tx; +#endif /* LWIP_UDPLITE */ + + /** receive callback function */ + udp_recv_fn recv; + /** user-supplied argument for the recv callback */ + void *recv_arg; +}; +/* udp_pcbs export for exernal reference (e.g. SNMP agent) */ +extern struct udp_pcb *udp_pcbs; + +/* The following functions is the application layer interface to the + UDP code. */ +struct udp_pcb * udp_new (void); +void udp_remove (struct udp_pcb *pcb); +err_t udp_bind (struct udp_pcb *pcb, ip_addr_t *ipaddr, + u16_t port); +err_t udp_connect (struct udp_pcb *pcb, ip_addr_t *ipaddr, + u16_t port); +void udp_disconnect (struct udp_pcb *pcb); +void udp_recv (struct udp_pcb *pcb, udp_recv_fn recv, + void *recv_arg); +err_t udp_sendto_if (struct udp_pcb *pcb, struct pbuf *p, + ip_addr_t *dst_ip, u16_t dst_port, + struct netif *netif); +err_t udp_sendto (struct udp_pcb *pcb, struct pbuf *p, + ip_addr_t *dst_ip, u16_t dst_port); +err_t udp_send (struct udp_pcb *pcb, struct pbuf *p); + +#if LWIP_CHECKSUM_ON_COPY +err_t udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p, + ip_addr_t *dst_ip, u16_t dst_port, + struct netif *netif, u8_t have_chksum, + u16_t chksum); +err_t udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p, + ip_addr_t *dst_ip, u16_t dst_port, + u8_t have_chksum, u16_t chksum); +err_t udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p, + u8_t have_chksum, u16_t chksum); +#endif /* LWIP_CHECKSUM_ON_COPY */ + +#define udp_flags(pcb) ((pcb)->flags) +#define udp_setflags(pcb, f) ((pcb)->flags = (f)) + +/* The following functions are the lower layer interface to UDP. */ +void udp_input (struct pbuf *p, struct netif *inp); + +void udp_init (void); + +#if UDP_DEBUG +void udp_debug_print(struct udp_hdr *udphdr); +#else +#define udp_debug_print(udphdr) +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* LWIP_UDP */ + +#endif /* __LWIP_UDP_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/netif/etharp.h b/third_party/lwip-1.4.1/src/include/netif/etharp.h new file mode 100644 index 0000000..a5fb8ec --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/netif/etharp.h @@ -0,0 +1,222 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (c) 2003-2004 Leon Woestenberg + * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __NETIF_ETHARP_H__ +#define __NETIF_ETHARP_H__ + +#include "lwip/opt.h" + +#if LWIP_ARP || LWIP_ETHERNET /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/pbuf.h" +#include "lwip/ip_addr.h" +#include "lwip/netif.h" +#include "lwip/ip.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ETHARP_HWADDR_LEN +#define ETHARP_HWADDR_LEN 6 +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct eth_addr { + PACK_STRUCT_FIELD(u8_t addr[ETHARP_HWADDR_LEN]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** Ethernet header */ +struct eth_hdr { +#if ETH_PAD_SIZE + PACK_STRUCT_FIELD(u8_t padding[ETH_PAD_SIZE]); +#endif + PACK_STRUCT_FIELD(struct eth_addr dest); + PACK_STRUCT_FIELD(struct eth_addr src); + PACK_STRUCT_FIELD(u16_t type); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE) + +#if ETHARP_SUPPORT_VLAN + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** VLAN header inserted between ethernet header and payload + * if 'type' in ethernet header is ETHTYPE_VLAN. + * See IEEE802.Q */ +struct eth_vlan_hdr { + PACK_STRUCT_FIELD(u16_t prio_vid); + PACK_STRUCT_FIELD(u16_t tpid); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define SIZEOF_VLAN_HDR 4 +#define VLAN_ID(vlan_hdr) (htons((vlan_hdr)->prio_vid) & 0xFFF) + +#endif /* ETHARP_SUPPORT_VLAN */ + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +/** the ARP message, see RFC 826 ("Packet format") */ +struct etharp_hdr { + PACK_STRUCT_FIELD(u16_t hwtype); + PACK_STRUCT_FIELD(u16_t proto); + PACK_STRUCT_FIELD(u8_t hwlen); + PACK_STRUCT_FIELD(u8_t protolen); + PACK_STRUCT_FIELD(u16_t opcode); + PACK_STRUCT_FIELD(struct eth_addr shwaddr); + PACK_STRUCT_FIELD(struct ip_addr2 sipaddr); + PACK_STRUCT_FIELD(struct eth_addr dhwaddr); + PACK_STRUCT_FIELD(struct ip_addr2 dipaddr); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#define SIZEOF_ETHARP_HDR 28 +#define SIZEOF_ETHARP_PACKET (SIZEOF_ETH_HDR + SIZEOF_ETHARP_HDR) + +/** 5 seconds period */ +#define ARP_TMR_INTERVAL 5000 + +#define ETHTYPE_ARP 0x0806U +#define ETHTYPE_IP 0x0800U +#define ETHTYPE_VLAN 0x8100U +#define ETHTYPE_PPPOEDISC 0x8863U /* PPP Over Ethernet Discovery Stage */ +#define ETHTYPE_PPPOE 0x8864U /* PPP Over Ethernet Session Stage */ + +/** MEMCPY-like macro to copy to/from struct eth_addr's that are local variables + * or known to be 32-bit aligned within the protocol header. */ +#ifndef ETHADDR32_COPY +#define ETHADDR32_COPY(src, dst) SMEMCPY(src, dst, ETHARP_HWADDR_LEN) +#endif + +/** MEMCPY-like macro to copy to/from struct eth_addr's that are no local + * variables and known to be 16-bit aligned within the protocol header. */ +#ifndef ETHADDR16_COPY +#define ETHADDR16_COPY(src, dst) SMEMCPY(src, dst, ETHARP_HWADDR_LEN) +#endif + +#if LWIP_ARP /* don't build if not configured for use in lwipopts.h */ + +/** ARP message types (opcodes) */ +#define ARP_REQUEST 1 +#define ARP_REPLY 2 + +/** Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type) + * to a filter function that returns the correct netif when using multiple + * netifs on one hardware interface where the netif's low-level receive + * routine cannot decide for the correct netif (e.g. when mapping multiple + * IP addresses to one hardware interface). + */ +#ifndef LWIP_ARP_FILTER_NETIF +#define LWIP_ARP_FILTER_NETIF 0 +#endif + +#if ARP_QUEUEING +/** struct for queueing outgoing packets for unknown address + * defined here to be accessed by memp.h + */ +struct etharp_q_entry { + struct etharp_q_entry *next; + struct pbuf *p; +}; +#endif /* ARP_QUEUEING */ + +#define etharp_init() /* Compatibility define, not init needed. */ +void etharp_tmr(void); +s8_t etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr, + struct eth_addr **eth_ret, ip_addr_t **ip_ret); +err_t etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr); +err_t etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q); +err_t etharp_request(struct netif *netif, ip_addr_t *ipaddr); +/** For Ethernet network interfaces, we might want to send "gratuitous ARP"; + * this is an ARP packet sent by a node in order to spontaneously cause other + * nodes to update an entry in their ARP cache. + * From RFC 3220 "IP Mobility Support for IPv4" section 4.6. */ +#define etharp_gratuitous(netif) etharp_request((netif), &(netif)->ip_addr) +void etharp_cleanup_netif(struct netif *netif); + +#if ETHARP_SUPPORT_STATIC_ENTRIES +err_t etharp_add_static_entry(ip_addr_t *ipaddr, struct eth_addr *ethaddr); +err_t etharp_remove_static_entry(ip_addr_t *ipaddr); +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ + +#if LWIP_AUTOIP +err_t etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, + const struct eth_addr *ethdst_addr, + const struct eth_addr *hwsrc_addr, const ip_addr_t *ipsrc_addr, + const struct eth_addr *hwdst_addr, const ip_addr_t *ipdst_addr, + const u16_t opcode); +#endif /* LWIP_AUTOIP */ + +#endif /* LWIP_ARP */ + +err_t ethernet_input(struct pbuf *p, struct netif *netif); + +#define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETHARP_HWADDR_LEN) == 0) + +extern const struct eth_addr ethbroadcast, ethzero; + +#endif /* LWIP_ARP || LWIP_ETHERNET */ + +#ifdef __cplusplus +} +#endif + +#endif /* __NETIF_ARP_H__ */ diff --git a/third_party/lwip-1.4.1/src/include/netif/ppp_oe.h b/third_party/lwip-1.4.1/src/include/netif/ppp_oe.h new file mode 100644 index 0000000..67d8fe0 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/netif/ppp_oe.h @@ -0,0 +1,190 @@ +/***************************************************************************** +* ppp_oe.h - PPP Over Ethernet implementation for lwIP. +* +* Copyright (c) 2006 by Marc Boucher, Services Informatiques (MBSI) inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 06-01-01 Marc Boucher +* Ported to lwIP. +*****************************************************************************/ + + + +/* based on NetBSD: if_pppoe.c,v 1.64 2006/01/31 23:50:15 martin Exp */ + +/*- + * Copyright (c) 2002 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Martin Husemann . + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef PPP_OE_H +#define PPP_OE_H + +#include "lwip/opt.h" + +#if PPPOE_SUPPORT > 0 + +#include "netif/etharp.h" + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct pppoehdr { + PACK_STRUCT_FIELD(u8_t vertype); + PACK_STRUCT_FIELD(u8_t code); + PACK_STRUCT_FIELD(u16_t session); + PACK_STRUCT_FIELD(u16_t plen); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN +struct pppoetag { + PACK_STRUCT_FIELD(u16_t tag); + PACK_STRUCT_FIELD(u16_t len); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif + + +#define PPPOE_STATE_INITIAL 0 +#define PPPOE_STATE_PADI_SENT 1 +#define PPPOE_STATE_PADR_SENT 2 +#define PPPOE_STATE_SESSION 3 +#define PPPOE_STATE_CLOSING 4 +/* passive */ +#define PPPOE_STATE_PADO_SENT 1 + +#define PPPOE_HEADERLEN sizeof(struct pppoehdr) +#define PPPOE_VERTYPE 0x11 /* VER=1, TYPE = 1 */ + +#define PPPOE_TAG_EOL 0x0000 /* end of list */ +#define PPPOE_TAG_SNAME 0x0101 /* service name */ +#define PPPOE_TAG_ACNAME 0x0102 /* access concentrator name */ +#define PPPOE_TAG_HUNIQUE 0x0103 /* host unique */ +#define PPPOE_TAG_ACCOOKIE 0x0104 /* AC cookie */ +#define PPPOE_TAG_VENDOR 0x0105 /* vendor specific */ +#define PPPOE_TAG_RELAYSID 0x0110 /* relay session id */ +#define PPPOE_TAG_SNAME_ERR 0x0201 /* service name error */ +#define PPPOE_TAG_ACSYS_ERR 0x0202 /* AC system error */ +#define PPPOE_TAG_GENERIC_ERR 0x0203 /* gerneric error */ + +#define PPPOE_CODE_PADI 0x09 /* Active Discovery Initiation */ +#define PPPOE_CODE_PADO 0x07 /* Active Discovery Offer */ +#define PPPOE_CODE_PADR 0x19 /* Active Discovery Request */ +#define PPPOE_CODE_PADS 0x65 /* Active Discovery Session confirmation */ +#define PPPOE_CODE_PADT 0xA7 /* Active Discovery Terminate */ + +#ifndef ETHERMTU +#define ETHERMTU 1500 +#endif + +/* two byte PPP protocol discriminator, then IP data */ +#define PPPOE_MAXMTU (ETHERMTU-PPPOE_HEADERLEN-2) + +#ifndef PPPOE_MAX_AC_COOKIE_LEN +#define PPPOE_MAX_AC_COOKIE_LEN 64 +#endif + +struct pppoe_softc { + struct pppoe_softc *next; + struct netif *sc_ethif; /* ethernet interface we are using */ + int sc_pd; /* ppp unit number */ + void (*sc_linkStatusCB)(int pd, int up); + + int sc_state; /* discovery phase or session connected */ + struct eth_addr sc_dest; /* hardware address of concentrator */ + u16_t sc_session; /* PPPoE session id */ + +#ifdef PPPOE_TODO + char *sc_service_name; /* if != NULL: requested name of service */ + char *sc_concentrator_name; /* if != NULL: requested concentrator id */ +#endif /* PPPOE_TODO */ + u8_t sc_ac_cookie[PPPOE_MAX_AC_COOKIE_LEN]; /* content of AC cookie we must echo back */ + size_t sc_ac_cookie_len; /* length of cookie data */ +#ifdef PPPOE_SERVER + u8_t *sc_hunique; /* content of host unique we must echo back */ + size_t sc_hunique_len; /* length of host unique */ +#endif + int sc_padi_retried; /* number of PADI retries already done */ + int sc_padr_retried; /* number of PADR retries already done */ +}; + + +#define pppoe_init() /* compatibility define, no initialization needed */ + +err_t pppoe_create(struct netif *ethif, int pd, void (*linkStatusCB)(int pd, int up), struct pppoe_softc **scptr); +err_t pppoe_destroy(struct netif *ifp); + +int pppoe_connect(struct pppoe_softc *sc); +void pppoe_disconnect(struct pppoe_softc *sc); + +void pppoe_disc_input(struct netif *netif, struct pbuf *p); +void pppoe_data_input(struct netif *netif, struct pbuf *p); + +err_t pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb); + +/** used in ppp.c */ +#define PPPOE_HDRLEN (sizeof(struct eth_hdr) + PPPOE_HEADERLEN) + +#endif /* PPPOE_SUPPORT */ + +#endif /* PPP_OE_H */ diff --git a/third_party/lwip-1.4.1/src/include/netif/slipif.h b/third_party/lwip-1.4.1/src/include/netif/slipif.h new file mode 100644 index 0000000..9689c3f --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/netif/slipif.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ +#ifndef __NETIF_SLIPIF_H__ +#define __NETIF_SLIPIF_H__ + +#include "lwip/opt.h" +#include "lwip/netif.h" + +/** Set this to 1 to start a thread that blocks reading on the serial line + * (using sio_read()). + */ +#ifndef SLIP_USE_RX_THREAD +#define SLIP_USE_RX_THREAD !NO_SYS +#endif + +/** Set this to 1 to enable functions to pass in RX bytes from ISR context. + * If enabled, slipif_received_byte[s]() process incoming bytes and put assembled + * packets on a queue, which is fed into lwIP from slipif_poll(). + * If disabled, slipif_poll() polls the serila line (using sio_tryread()). + */ +#ifndef SLIP_RX_FROM_ISR +#define SLIP_RX_FROM_ISR 0 +#endif + +/** Set this to 1 (default for SLIP_RX_FROM_ISR) to queue incoming packets + * received by slipif_received_byte[s]() as long as PBUF_POOL pbufs are available. + * If disabled, packets will be dropped if more than one packet is received. + */ +#ifndef SLIP_RX_QUEUE +#define SLIP_RX_QUEUE SLIP_RX_FROM_ISR +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +err_t slipif_init(struct netif * netif); +void slipif_poll(struct netif *netif); +#if SLIP_RX_FROM_ISR +void slipif_process_rxqueue(struct netif *netif); +void slipif_received_byte(struct netif *netif, u8_t data); +void slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len); +#endif /* SLIP_RX_FROM_ISR */ + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/third_party/lwip-1.4.1/src/include/posix/netdb.h b/third_party/lwip-1.4.1/src/include/posix/netdb.h new file mode 100644 index 0000000..8fc2596 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/posix/netdb.h @@ -0,0 +1,33 @@ +/** + * @file + * This file is a posix wrapper for lwip/netdb.h. + */ + +/* + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#include "lwip/netdb.h" diff --git a/third_party/lwip-1.4.1/src/include/posix/sys/socket.h b/third_party/lwip-1.4.1/src/include/posix/sys/socket.h new file mode 100644 index 0000000..5d2ab84 --- /dev/null +++ b/third_party/lwip-1.4.1/src/include/posix/sys/socket.h @@ -0,0 +1,33 @@ +/** + * @file + * This file is a posix wrapper for lwip/sockets.h. + */ + +/* + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#include "lwip/sockets.h" diff --git a/third_party/lwip-1.4.1/src/netif/FILES b/third_party/lwip-1.4.1/src/netif/FILES new file mode 100644 index 0000000..e28952e --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/FILES @@ -0,0 +1,29 @@ +This directory contains generic network interface device drivers that +do not contain any hardware or architecture specific code. The files +are: + +etharp.c + Implements the ARP (Address Resolution Protocol) over + Ethernet. The code in this file should be used together with + Ethernet device drivers. Note that this module has been + largely made Ethernet independent so you should be able to + adapt this for other link layers (such as Firewire). + +ethernetif.c + An example of how an Ethernet device driver could look. This + file can be used as a "skeleton" for developing new Ethernet + network device drivers. It uses the etharp.c ARP code. + +loopif.c + A "loopback" network interface driver. It requires configuration + through the define LWIP_LOOPIF_MULTITHREADING (see opt.h). + +slipif.c + A generic implementation of the SLIP (Serial Line IP) + protocol. It requires a sio (serial I/O) module to work. + +ppp/ Point-to-Point Protocol stack + The PPP stack has been ported from ucip (http://ucip.sourceforge.net). + It matches quite well to pppd 2.3.1 (http://ppp.samba.org), although + compared to that, it has some modifications for embedded systems and + the source code has been reordered a bit. \ No newline at end of file diff --git a/third_party/lwip-1.4.1/src/netif/etharp.c b/third_party/lwip-1.4.1/src/netif/etharp.c new file mode 100644 index 0000000..d94c870 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/etharp.c @@ -0,0 +1,1399 @@ +/** + * @file + * Address Resolution Protocol module for IP over Ethernet + * + * Functionally, ARP is divided into two parts. The first maps an IP address + * to a physical address when sending a packet, and the second part answers + * requests from other machines for our physical address. + * + * This implementation complies with RFC 826 (Ethernet ARP). It supports + * Gratuitious ARP from RFC3220 (IP Mobility Support for IPv4) section 4.6 + * if an interface calls etharp_gratuitous(our_netif) upon address change. + */ + +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (c) 2003-2004 Leon Woestenberg + * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#include "lwip/opt.h" + +#if LWIP_ARP || LWIP_ETHERNET + +#include "lwip/ip_addr.h" +#include "lwip/def.h" +#include "lwip/ip.h" +#include "lwip/stats.h" +#include "lwip/snmp.h" +#include "lwip/dhcp.h" +#include "lwip/autoip.h" +#include "netif/etharp.h" + +#if PPPOE_SUPPORT +#include "netif/ppp_oe.h" +#endif /* PPPOE_SUPPORT */ + +#include + +const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}}; +const struct eth_addr ethzero = {{0,0,0,0,0,0}}; + +/** The 24-bit IANA multicast OUI is 01-00-5e: */ +#define LL_MULTICAST_ADDR_0 0x01 +#define LL_MULTICAST_ADDR_1 0x00 +#define LL_MULTICAST_ADDR_2 0x5e + +#if LWIP_ARP /* don't build if not configured for use in lwipopts.h */ + +/** the time an ARP entry stays valid after its last update, + * for ARP_TMR_INTERVAL = 5000, this is + * (240 * 5) seconds = 20 minutes. + */ +#define ARP_MAXAGE 240 +/** Re-request a used ARP entry 1 minute before it would expire to prevent + * breaking a steadily used connection because the ARP entry timed out. */ +#define ARP_AGE_REREQUEST_USED (ARP_MAXAGE - 12) + +/** the time an ARP entry stays pending after first request, + * for ARP_TMR_INTERVAL = 5000, this is + * (2 * 5) seconds = 10 seconds. + * + * @internal Keep this number at least 2, otherwise it might + * run out instantly if the timeout occurs directly after a request. + */ +#define ARP_MAXPENDING 2 + +#define HWTYPE_ETHERNET 1 + +enum etharp_state { + ETHARP_STATE_EMPTY = 0, + ETHARP_STATE_PENDING, + ETHARP_STATE_STABLE, + ETHARP_STATE_STABLE_REREQUESTING +#if ETHARP_SUPPORT_STATIC_ENTRIES + ,ETHARP_STATE_STATIC +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ +}; + +struct etharp_entry { +#if ARP_QUEUEING + /** Pointer to queue of pending outgoing packets on this ARP entry. */ + struct etharp_q_entry *q; +#else /* ARP_QUEUEING */ + /** Pointer to a single pending outgoing packet on this ARP entry. */ + struct pbuf *q; +#endif /* ARP_QUEUEING */ + ip_addr_t ipaddr; + struct netif *netif; + struct eth_addr ethaddr; + u8_t state; + u8_t ctime; +}; + +static struct etharp_entry arp_table[ARP_TABLE_SIZE]; + +#if !LWIP_NETIF_HWADDRHINT +static u8_t etharp_cached_entry; +#endif /* !LWIP_NETIF_HWADDRHINT */ + +/** Try hard to create a new entry - we want the IP address to appear in + the cache (even if this means removing an active entry or so). */ +#define ETHARP_FLAG_TRY_HARD 1 +#define ETHARP_FLAG_FIND_ONLY 2 +#if ETHARP_SUPPORT_STATIC_ENTRIES +#define ETHARP_FLAG_STATIC_ENTRY 4 +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ + +#if LWIP_NETIF_HWADDRHINT +#define ETHARP_SET_HINT(netif, hint) if (((netif) != NULL) && ((netif)->addr_hint != NULL)) \ + *((netif)->addr_hint) = (hint); +#else /* LWIP_NETIF_HWADDRHINT */ +#define ETHARP_SET_HINT(netif, hint) (etharp_cached_entry = (hint)) +#endif /* LWIP_NETIF_HWADDRHINT */ + + +/* Some checks, instead of etharp_init(): */ +#if (LWIP_ARP && (ARP_TABLE_SIZE > 0x7f)) + #error "ARP_TABLE_SIZE must fit in an s8_t, you have to reduce it in your lwipopts.h" +#endif + + +#if ARP_QUEUEING +/** + * Free a complete queue of etharp entries + * + * @param q a qeueue of etharp_q_entry's to free + */ +static void +free_etharp_q(struct etharp_q_entry *q) +{ + struct etharp_q_entry *r; + LWIP_ASSERT("q != NULL", q != NULL); + LWIP_ASSERT("q->p != NULL", q->p != NULL); + while (q) { + r = q; + q = q->next; + LWIP_ASSERT("r->p != NULL", (r->p != NULL)); + pbuf_free(r->p); + memp_free(MEMP_ARP_QUEUE, r); + } +} +#else /* ARP_QUEUEING */ + +/** Compatibility define: free the queued pbuf */ +#define free_etharp_q(q) pbuf_free(q) + +#endif /* ARP_QUEUEING */ + +/** Clean up ARP table entries */ +static void +etharp_free_entry(int i) +{ + /* remove from SNMP ARP index tree */ + snmp_delete_arpidx_tree(arp_table[i].netif, &arp_table[i].ipaddr); + /* and empty packet queue */ + if (arp_table[i].q != NULL) { + /* remove all queued packets */ + LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_free_entry: freeing entry %"U16_F", packet queue %p.\n", (u16_t)i, (void *)(arp_table[i].q))); + free_etharp_q(arp_table[i].q); + arp_table[i].q = NULL; + } + /* recycle entry for re-use */ + arp_table[i].state = ETHARP_STATE_EMPTY; +#ifdef LWIP_DEBUG + /* for debugging, clean out the complete entry */ + arp_table[i].ctime = 0; + arp_table[i].netif = NULL; + ip_addr_set_zero(&arp_table[i].ipaddr); + arp_table[i].ethaddr = ethzero; +#endif /* LWIP_DEBUG */ +} + +/** + * Clears expired entries in the ARP table. + * + * This function should be called every ETHARP_TMR_INTERVAL milliseconds (5 seconds), + * in order to expire entries in the ARP table. + */ +void +etharp_tmr(void) +{ + u8_t i; + + LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer\n")); + /* remove expired entries from the ARP table */ + for (i = 0; i < ARP_TABLE_SIZE; ++i) { + u8_t state = arp_table[i].state; + if (state != ETHARP_STATE_EMPTY +#if ETHARP_SUPPORT_STATIC_ENTRIES + && (state != ETHARP_STATE_STATIC) +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ + ) { + arp_table[i].ctime++; + if ((arp_table[i].ctime >= ARP_MAXAGE) || + ((arp_table[i].state == ETHARP_STATE_PENDING) && + (arp_table[i].ctime >= ARP_MAXPENDING))) { + /* pending or stable entry has become old! */ + LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_timer: expired %s entry %"U16_F".\n", + arp_table[i].state >= ETHARP_STATE_STABLE ? "stable" : "pending", (u16_t)i)); + /* clean up entries that have just been expired */ + etharp_free_entry(i); + } + else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING) { + /* Reset state to stable, so that the next transmitted packet will + re-send an ARP request. */ + arp_table[i].state = ETHARP_STATE_STABLE; + } +#if ARP_QUEUEING + /* still pending entry? (not expired) */ + if (arp_table[i].state == ETHARP_STATE_PENDING) { + /* resend an ARP query here? */ + } +#endif /* ARP_QUEUEING */ + } + } +} + +/** + * Search the ARP table for a matching or new entry. + * + * If an IP address is given, return a pending or stable ARP entry that matches + * the address. If no match is found, create a new entry with this address set, + * but in state ETHARP_EMPTY. The caller must check and possibly change the + * state of the returned entry. + * + * If ipaddr is NULL, return a initialized new entry in state ETHARP_EMPTY. + * + * In all cases, attempt to create new entries from an empty entry. If no + * empty entries are available and ETHARP_FLAG_TRY_HARD flag is set, recycle + * old entries. Heuristic choose the least important entry for recycling. + * + * @param ipaddr IP address to find in ARP cache, or to add if not found. + * @param flags @see definition of ETHARP_FLAG_* + * @param netif netif related to this address (used for NETIF_HWADDRHINT) + * + * @return The ARP entry index that matched or is created, ERR_MEM if no + * entry is found or could be recycled. + */ +static s8_t +etharp_find_entry(ip_addr_t *ipaddr, u8_t flags) +{ + s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE; + s8_t empty = ARP_TABLE_SIZE; + u8_t i = 0, age_pending = 0, age_stable = 0; + /* oldest entry with packets on queue */ + s8_t old_queue = ARP_TABLE_SIZE; + /* its age */ + u8_t age_queue = 0; + + /** + * a) do a search through the cache, remember candidates + * b) select candidate entry + * c) create new entry + */ + + /* a) in a single search sweep, do all of this + * 1) remember the first empty entry (if any) + * 2) remember the oldest stable entry (if any) + * 3) remember the oldest pending entry without queued packets (if any) + * 4) remember the oldest pending entry with queued packets (if any) + * 5) search for a matching IP entry, either pending or stable + * until 5 matches, or all entries are searched for. + */ + + for (i = 0; i < ARP_TABLE_SIZE; ++i) { + u8_t state = arp_table[i].state; + /* no empty entry found yet and now we do find one? */ + if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) { + LWIP_DEBUGF(ETHARP_DEBUG, ("etharp_find_entry: found empty entry %"U16_F"\n", (u16_t)i)); + /* remember first empty entry */ + empty = i; + } else if (state != ETHARP_STATE_EMPTY) { + LWIP_ASSERT("state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE", + state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE); + /* if given, does IP address match IP address in ARP entry? */ + if (ipaddr && ip_addr_cmp(ipaddr, &arp_table[i].ipaddr)) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: found matching entry %"U16_F"\n", (u16_t)i)); + /* found exact IP address match, simply bail out */ + return i; + } + /* pending entry? */ + if (state == ETHARP_STATE_PENDING) { + /* pending with queued packets? */ + if (arp_table[i].q != NULL) { + if (arp_table[i].ctime >= age_queue) { + old_queue = i; + age_queue = arp_table[i].ctime; + } + } else + /* pending without queued packets? */ + { + if (arp_table[i].ctime >= age_pending) { + old_pending = i; + age_pending = arp_table[i].ctime; + } + } + /* stable entry? */ + } else if (state >= ETHARP_STATE_STABLE) { +#if ETHARP_SUPPORT_STATIC_ENTRIES + /* don't record old_stable for static entries since they never expire */ + if (state < ETHARP_STATE_STATIC) +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ + { + /* remember entry with oldest stable entry in oldest, its age in maxtime */ + if (arp_table[i].ctime >= age_stable) { + old_stable = i; + age_stable = arp_table[i].ctime; + } + } + } + } + } + /* { we have no match } => try to create a new entry */ + + /* don't create new entry, only search? */ + if (((flags & ETHARP_FLAG_FIND_ONLY) != 0) || + /* or no empty entry found and not allowed to recycle? */ + ((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_FLAG_TRY_HARD) == 0))) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: no empty entry found and not allowed to recycle\n")); + return (s8_t)ERR_MEM; + } + + /* b) choose the least destructive entry to recycle: + * 1) empty entry + * 2) oldest stable entry + * 3) oldest pending entry without queued packets + * 4) oldest pending entry with queued packets + * + * { ETHARP_FLAG_TRY_HARD is set at this point } + */ + + /* 1) empty entry available? */ + if (empty < ARP_TABLE_SIZE) { + i = empty; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting empty entry %"U16_F"\n", (u16_t)i)); + } else { + /* 2) found recyclable stable entry? */ + if (old_stable < ARP_TABLE_SIZE) { + /* recycle oldest stable*/ + i = old_stable; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest stable entry %"U16_F"\n", (u16_t)i)); + /* no queued packets should exist on stable entries */ + LWIP_ASSERT("arp_table[i].q == NULL", arp_table[i].q == NULL); + /* 3) found recyclable pending entry without queued packets? */ + } else if (old_pending < ARP_TABLE_SIZE) { + /* recycle oldest pending */ + i = old_pending; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %"U16_F" (without queue)\n", (u16_t)i)); + /* 4) found recyclable pending entry with queued packets? */ + } else if (old_queue < ARP_TABLE_SIZE) { + /* recycle oldest pending (queued packets are free in etharp_free_entry) */ + i = old_queue; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: selecting oldest pending entry %"U16_F", freeing packet queue %p\n", (u16_t)i, (void *)(arp_table[i].q))); + /* no empty or recyclable entries found */ + } else { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_find_entry: no empty or recyclable entries found\n")); + return (s8_t)ERR_MEM; + } + + /* { empty or recyclable entry found } */ + LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE); + etharp_free_entry(i); + } + + LWIP_ASSERT("i < ARP_TABLE_SIZE", i < ARP_TABLE_SIZE); + LWIP_ASSERT("arp_table[i].state == ETHARP_STATE_EMPTY", + arp_table[i].state == ETHARP_STATE_EMPTY); + + /* IP address given? */ + if (ipaddr != NULL) { + /* set IP address */ + ip_addr_copy(arp_table[i].ipaddr, *ipaddr); + } + arp_table[i].ctime = 0; + return (err_t)i; +} + +/** + * Send an IP packet on the network using netif->linkoutput + * The ethernet header is filled in before sending. + * + * @params netif the lwIP network interface on which to send the packet + * @params p the packet to send, p->payload pointing to the (uninitialized) ethernet header + * @params src the source MAC address to be copied into the ethernet header + * @params dst the destination MAC address to be copied into the ethernet header + * @return ERR_OK if the packet was sent, any other err_t on failure + */ +static err_t +etharp_send_ip(struct netif *netif, struct pbuf *p, struct eth_addr *src, struct eth_addr *dst) +{ + struct eth_hdr *ethhdr = (struct eth_hdr *)p->payload; + + LWIP_ASSERT("netif->hwaddr_len must be the same as ETHARP_HWADDR_LEN for etharp!", + (netif->hwaddr_len == ETHARP_HWADDR_LEN)); + ETHADDR32_COPY(ðhdr->dest, dst); + ETHADDR16_COPY(ðhdr->src, src); + ethhdr->type = PP_HTONS(ETHTYPE_IP); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_send_ip: sending packet %p\n", (void *)p)); + /* send the packet */ + return netif->linkoutput(netif, p); +} + +/** + * Update (or insert) a IP/MAC address pair in the ARP cache. + * + * If a pending entry is resolved, any queued packets will be sent + * at this point. + * + * @param netif netif related to this entry (used for NETIF_ADDRHINT) + * @param ipaddr IP address of the inserted ARP entry. + * @param ethaddr Ethernet address of the inserted ARP entry. + * @param flags @see definition of ETHARP_FLAG_* + * + * @return + * - ERR_OK Succesfully updated ARP cache. + * - ERR_MEM If we could not add a new ARP entry when ETHARP_FLAG_TRY_HARD was set. + * - ERR_ARG Non-unicast address given, those will not appear in ARP cache. + * + * @see pbuf_free() + */ +static err_t +etharp_update_arp_entry(struct netif *netif, ip_addr_t *ipaddr, struct eth_addr *ethaddr, u8_t flags) +{ + s8_t i; + LWIP_ASSERT("netif->hwaddr_len == ETHARP_HWADDR_LEN", netif->hwaddr_len == ETHARP_HWADDR_LEN); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F" - %02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F"\n", + ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr), + ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2], + ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5])); + /* non-unicast address? */ + if (ip_addr_isany(ipaddr) || + ip_addr_isbroadcast(ipaddr, netif) || + ip_addr_ismulticast(ipaddr)) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: will not add non-unicast IP address to ARP cache\n")); + return ERR_ARG; + } + /* find or create ARP entry */ + i = etharp_find_entry(ipaddr, flags); + /* bail out if no entry could be found */ + if (i < 0) { + return (err_t)i; + } + +#if ETHARP_SUPPORT_STATIC_ENTRIES + if (flags & ETHARP_FLAG_STATIC_ENTRY) { + /* record static type */ + arp_table[i].state = ETHARP_STATE_STATIC; + } else +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ + { + /* mark it stable */ + arp_table[i].state = ETHARP_STATE_STABLE; + } + + /* record network interface */ + arp_table[i].netif = netif; + /* insert in SNMP ARP index tree */ + snmp_insert_arpidx_tree(netif, &arp_table[i].ipaddr); + + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_update_arp_entry: updating stable entry %"S16_F"\n", (s16_t)i)); + /* update address */ + ETHADDR32_COPY(&arp_table[i].ethaddr, ethaddr); + /* reset time stamp */ + arp_table[i].ctime = 0; + /* this is where we will send out queued packets! */ +#if ARP_QUEUEING + while (arp_table[i].q != NULL) { + struct pbuf *p; + /* remember remainder of queue */ + struct etharp_q_entry *q = arp_table[i].q; + /* pop first item off the queue */ + arp_table[i].q = q->next; + /* get the packet pointer */ + p = q->p; + /* now queue entry can be freed */ + memp_free(MEMP_ARP_QUEUE, q); +#else /* ARP_QUEUEING */ + if (arp_table[i].q != NULL) { + struct pbuf *p = arp_table[i].q; + arp_table[i].q = NULL; +#endif /* ARP_QUEUEING */ + /* send the queued IP packet */ + etharp_send_ip(netif, p, (struct eth_addr*)(netif->hwaddr), ethaddr); + /* free the queued IP packet */ + pbuf_free(p); + } + return ERR_OK; +} + +#if ETHARP_SUPPORT_STATIC_ENTRIES +/** Add a new static entry to the ARP table. If an entry exists for the + * specified IP address, this entry is overwritten. + * If packets are queued for the specified IP address, they are sent out. + * + * @param ipaddr IP address for the new static entry + * @param ethaddr ethernet address for the new static entry + * @return @see return values of etharp_add_static_entry + */ +err_t +etharp_add_static_entry(ip_addr_t *ipaddr, struct eth_addr *ethaddr) +{ + struct netif *netif; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_add_static_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F" - %02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F"\n", + ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr), + ethaddr->addr[0], ethaddr->addr[1], ethaddr->addr[2], + ethaddr->addr[3], ethaddr->addr[4], ethaddr->addr[5])); + + netif = ip_route(ipaddr); + if (netif == NULL) { + return ERR_RTE; + } + + return etharp_update_arp_entry(netif, ipaddr, ethaddr, ETHARP_FLAG_TRY_HARD | ETHARP_FLAG_STATIC_ENTRY); +} + +/** Remove a static entry from the ARP table previously added with a call to + * etharp_add_static_entry. + * + * @param ipaddr IP address of the static entry to remove + * @return ERR_OK: entry removed + * ERR_MEM: entry wasn't found + * ERR_ARG: entry wasn't a static entry but a dynamic one + */ +err_t +etharp_remove_static_entry(ip_addr_t *ipaddr) +{ + s8_t i; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_remove_static_entry: %"U16_F".%"U16_F".%"U16_F".%"U16_F"\n", + ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr))); + + /* find or create ARP entry */ + i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY); + /* bail out if no entry could be found */ + if (i < 0) { + return (err_t)i; + } + + if (arp_table[i].state != ETHARP_STATE_STATIC) { + /* entry wasn't a static entry, cannot remove it */ + return ERR_ARG; + } + /* entry found, free it */ + etharp_free_entry(i); + return ERR_OK; +} +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ + +/** + * Remove all ARP table entries of the specified netif. + * + * @param netif points to a network interface + */ +void etharp_cleanup_netif(struct netif *netif) +{ + u8_t i; + + for (i = 0; i < ARP_TABLE_SIZE; ++i) { + u8_t state = arp_table[i].state; + if ((state != ETHARP_STATE_EMPTY) && (arp_table[i].netif == netif)) { + etharp_free_entry(i); + } + } +} + +/** + * Finds (stable) ethernet/IP address pair from ARP table + * using interface and IP address index. + * @note the addresses in the ARP table are in network order! + * + * @param netif points to interface index + * @param ipaddr points to the (network order) IP address index + * @param eth_ret points to return pointer + * @param ip_ret points to return pointer + * @return table index if found, -1 otherwise + */ +s8_t +etharp_find_addr(struct netif *netif, ip_addr_t *ipaddr, + struct eth_addr **eth_ret, ip_addr_t **ip_ret) +{ + s8_t i; + + LWIP_ASSERT("eth_ret != NULL && ip_ret != NULL", + eth_ret != NULL && ip_ret != NULL); + + LWIP_UNUSED_ARG(netif); + + i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY); + if((i >= 0) && (arp_table[i].state >= ETHARP_STATE_STABLE)) { + *eth_ret = &arp_table[i].ethaddr; + *ip_ret = &arp_table[i].ipaddr; + return i; + } + return -1; +} + +#if ETHARP_TRUST_IP_MAC +/** + * Updates the ARP table using the given IP packet. + * + * Uses the incoming IP packet's source address to update the + * ARP cache for the local network. The function does not alter + * or free the packet. This function must be called before the + * packet p is passed to the IP layer. + * + * @param netif The lwIP network interface on which the IP packet pbuf arrived. + * @param p The IP packet that arrived on netif. + * + * @return NULL + * + * @see pbuf_free() + */ +static void +etharp_ip_input(struct netif *netif, struct pbuf *p) +{ + struct eth_hdr *ethhdr; + struct ip_hdr *iphdr; + ip_addr_t iphdr_src; + LWIP_ERROR("netif != NULL", (netif != NULL), return;); + + /* Only insert an entry if the source IP address of the + incoming IP packet comes from a host on the local network. */ + ethhdr = (struct eth_hdr *)p->payload; + iphdr = (struct ip_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR); +#if ETHARP_SUPPORT_VLAN + if (ethhdr->type == PP_HTONS(ETHTYPE_VLAN)) { + iphdr = (struct ip_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR); + } +#endif /* ETHARP_SUPPORT_VLAN */ + + ip_addr_copy(iphdr_src, iphdr->src); + + /* source is not on the local network? */ + if (!ip_addr_netcmp(&iphdr_src, &(netif->ip_addr), &(netif->netmask))) { + /* do nothing */ + return; + } + + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_ip_input: updating ETHARP table.\n")); + /* update the source IP address in the cache, if present */ + /* @todo We could use ETHARP_FLAG_TRY_HARD if we think we are going to talk + * back soon (for example, if the destination IP address is ours. */ + etharp_update_arp_entry(netif, &iphdr_src, &(ethhdr->src), ETHARP_FLAG_FIND_ONLY); +} +#endif /* ETHARP_TRUST_IP_MAC */ + +/** + * Responds to ARP requests to us. Upon ARP replies to us, add entry to cache + * send out queued IP packets. Updates cache with snooped address pairs. + * + * Should be called for incoming ARP packets. The pbuf in the argument + * is freed by this function. + * + * @param netif The lwIP network interface on which the ARP packet pbuf arrived. + * @param ethaddr Ethernet address of netif. + * @param p The ARP packet that arrived on netif. Is freed by this function. + * + * @return NULL + * + * @see pbuf_free() + */ +static void +etharp_arp_input(struct netif *netif, struct eth_addr *ethaddr, struct pbuf *p) +{ + struct etharp_hdr *hdr; + struct eth_hdr *ethhdr; + /* these are aligned properly, whereas the ARP header fields might not be */ + ip_addr_t sipaddr, dipaddr; + u8_t for_us; +#if LWIP_AUTOIP + const u8_t * ethdst_hwaddr; +#endif /* LWIP_AUTOIP */ + + LWIP_ERROR("netif != NULL", (netif != NULL), return;); + + /* drop short ARP packets: we have to check for p->len instead of p->tot_len here + since a struct etharp_hdr is pointed to p->payload, so it musn't be chained! */ + if (p->len < SIZEOF_ETHARP_PACKET) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, + ("etharp_arp_input: packet dropped, too short (%"S16_F"/%"S16_F")\n", p->tot_len, + (s16_t)SIZEOF_ETHARP_PACKET)); + ETHARP_STATS_INC(etharp.lenerr); + ETHARP_STATS_INC(etharp.drop); + pbuf_free(p); + return; + } + + ethhdr = (struct eth_hdr *)p->payload; + hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR); +#if ETHARP_SUPPORT_VLAN + if (ethhdr->type == PP_HTONS(ETHTYPE_VLAN)) { + hdr = (struct etharp_hdr *)(((u8_t*)ethhdr) + SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR); + } +#endif /* ETHARP_SUPPORT_VLAN */ + + /* RFC 826 "Packet Reception": */ + if ((hdr->hwtype != PP_HTONS(HWTYPE_ETHERNET)) || + (hdr->hwlen != ETHARP_HWADDR_LEN) || + (hdr->protolen != sizeof(ip_addr_t)) || + (hdr->proto != PP_HTONS(ETHTYPE_IP))) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, + ("etharp_arp_input: packet dropped, wrong hw type, hwlen, proto, protolen or ethernet type (%"U16_F"/%"U16_F"/%"U16_F"/%"U16_F")\n", + hdr->hwtype, hdr->hwlen, hdr->proto, hdr->protolen)); + ETHARP_STATS_INC(etharp.proterr); + ETHARP_STATS_INC(etharp.drop); + pbuf_free(p); + return; + } + ETHARP_STATS_INC(etharp.recv); + +#if LWIP_AUTOIP + /* We have to check if a host already has configured our random + * created link local address and continously check if there is + * a host with this IP-address so we can detect collisions */ + autoip_arp_reply(netif, hdr); +#endif /* LWIP_AUTOIP */ + + /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without + * structure packing (not using structure copy which breaks strict-aliasing rules). */ + IPADDR2_COPY(&sipaddr, &hdr->sipaddr); + IPADDR2_COPY(&dipaddr, &hdr->dipaddr); + + /* this interface is not configured? */ + if (ip_addr_isany(&netif->ip_addr)) { + for_us = 0; + } else { + /* ARP packet directed to us? */ + for_us = (u8_t)ip_addr_cmp(&dipaddr, &(netif->ip_addr)); + } + + /* ARP message directed to us? + -> add IP address in ARP cache; assume requester wants to talk to us, + can result in directly sending the queued packets for this host. + ARP message not directed to us? + -> update the source IP address in the cache, if present */ + etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr), + for_us ? ETHARP_FLAG_TRY_HARD : ETHARP_FLAG_FIND_ONLY); + + /* now act on the message itself */ + switch (hdr->opcode) { + /* ARP request? */ + case PP_HTONS(ARP_REQUEST): + /* ARP request. If it asked for our address, we send out a + * reply. In any case, we time-stamp any existing ARP entry, + * and possiby send out an IP packet that was queued on it. */ + + LWIP_DEBUGF (ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: incoming ARP request\n")); + /* ARP request for our address? */ + if (for_us) { + + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: replying to ARP request for our IP address\n")); + /* Re-use pbuf to send ARP reply. + Since we are re-using an existing pbuf, we can't call etharp_raw since + that would allocate a new pbuf. */ + hdr->opcode = htons(ARP_REPLY); + + IPADDR2_COPY(&hdr->dipaddr, &hdr->sipaddr); + IPADDR2_COPY(&hdr->sipaddr, &netif->ip_addr); + + LWIP_ASSERT("netif->hwaddr_len must be the same as ETHARP_HWADDR_LEN for etharp!", + (netif->hwaddr_len == ETHARP_HWADDR_LEN)); +#if LWIP_AUTOIP + /* If we are using Link-Local, all ARP packets that contain a Link-Local + * 'sender IP address' MUST be sent using link-layer broadcast instead of + * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */ + ethdst_hwaddr = ip_addr_islinklocal(&netif->ip_addr) ? (u8_t*)(ethbroadcast.addr) : hdr->shwaddr.addr; +#endif /* LWIP_AUTOIP */ + + ETHADDR16_COPY(&hdr->dhwaddr, &hdr->shwaddr); +#if LWIP_AUTOIP + ETHADDR16_COPY(ðhdr->dest, ethdst_hwaddr); +#else /* LWIP_AUTOIP */ + ETHADDR16_COPY(ðhdr->dest, &hdr->shwaddr); +#endif /* LWIP_AUTOIP */ + ETHADDR16_COPY(&hdr->shwaddr, ethaddr); + ETHADDR16_COPY(ðhdr->src, ethaddr); + + /* hwtype, hwaddr_len, proto, protolen and the type in the ethernet header + are already correct, we tested that before */ + + /* return ARP reply */ + netif->linkoutput(netif, p); + /* we are not configured? */ + } else if (ip_addr_isany(&netif->ip_addr)) { + /* { for_us == 0 and netif->ip_addr.addr == 0 } */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: we are unconfigured, ARP request ignored.\n")); + /* request was not directed to us */ + } else { + /* { for_us == 0 and netif->ip_addr.addr != 0 } */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: ARP request was not for us.\n")); + } + break; + case PP_HTONS(ARP_REPLY): + /* ARP reply. We already updated the ARP cache earlier. */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: incoming ARP reply\n")); +#if (LWIP_DHCP && DHCP_DOES_ARP_CHECK) + /* DHCP wants to know about ARP replies from any host with an + * IP address also offered to us by the DHCP server. We do not + * want to take a duplicate IP address on a single network. + * @todo How should we handle redundant (fail-over) interfaces? */ + dhcp_arp_reply(netif, &sipaddr); +#endif /* (LWIP_DHCP && DHCP_DOES_ARP_CHECK) */ + break; + default: + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_arp_input: ARP unknown opcode type %"S16_F"\n", htons(hdr->opcode))); + ETHARP_STATS_INC(etharp.err); + break; + } + /* free ARP packet */ + pbuf_free(p); +} + +/** Just a small helper function that sends a pbuf to an ethernet address + * in the arp_table specified by the index 'arp_idx'. + */ +static err_t +etharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx) +{ + LWIP_ASSERT("arp_table[arp_idx].state >= ETHARP_STATE_STABLE", + arp_table[arp_idx].state >= ETHARP_STATE_STABLE); + /* if arp table entry is about to expire: re-request it, + but only if its state is ETHARP_STATE_STABLE to prevent flooding the + network with ARP requests if this address is used frequently. */ + if ((arp_table[arp_idx].state == ETHARP_STATE_STABLE) && + (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED)) { + if (etharp_request(netif, &arp_table[arp_idx].ipaddr) == ERR_OK) { + arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING; + } + } + + return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr), + &arp_table[arp_idx].ethaddr); +} + +/** + * Resolve and fill-in Ethernet address header for outgoing IP packet. + * + * For IP multicast and broadcast, corresponding Ethernet addresses + * are selected and the packet is transmitted on the link. + * + * For unicast addresses, the packet is submitted to etharp_query(). In + * case the IP address is outside the local network, the IP address of + * the gateway is used. + * + * @param netif The lwIP network interface which the IP packet will be sent on. + * @param q The pbuf(s) containing the IP packet to be sent. + * @param ipaddr The IP address of the packet destination. + * + * @return + * - ERR_RTE No route to destination (no gateway to external networks), + * or the return type of either etharp_query() or etharp_send_ip(). + */ +err_t +etharp_output(struct netif *netif, struct pbuf *q, ip_addr_t *ipaddr) +{ + struct eth_addr *dest; + struct eth_addr mcastaddr; + ip_addr_t *dst_addr = ipaddr; + + LWIP_ASSERT("netif != NULL", netif != NULL); + LWIP_ASSERT("q != NULL", q != NULL); + LWIP_ASSERT("ipaddr != NULL", ipaddr != NULL); + + /* make room for Ethernet header - should not fail */ + if (pbuf_header(q, sizeof(struct eth_hdr)) != 0) { + /* bail out */ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("etharp_output: could not allocate room for header.\n")); + LINK_STATS_INC(link.lenerr); + return ERR_BUF; + } + + /* Determine on destination hardware address. Broadcasts and multicasts + * are special, other IP addresses are looked up in the ARP table. */ + + /* broadcast destination IP address? */ + if (ip_addr_isbroadcast(ipaddr, netif)) { + /* broadcast on Ethernet also */ + dest = (struct eth_addr *)ðbroadcast; + /* multicast destination IP address? */ + } else if (ip_addr_ismulticast(ipaddr)) { + /* Hash IP multicast address to MAC address.*/ + mcastaddr.addr[0] = LL_MULTICAST_ADDR_0; + mcastaddr.addr[1] = LL_MULTICAST_ADDR_1; + mcastaddr.addr[2] = LL_MULTICAST_ADDR_2; + mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f; + mcastaddr.addr[4] = ip4_addr3(ipaddr); + mcastaddr.addr[5] = ip4_addr4(ipaddr); + /* destination Ethernet address is multicast */ + dest = &mcastaddr; + /* unicast destination IP address? */ + } else { + s8_t i; + /* outside local network? if so, this can neither be a global broadcast nor + a subnet broadcast. */ + if (!ip_addr_netcmp(ipaddr, &(netif->ip_addr), &(netif->netmask)) && + !ip_addr_islinklocal(ipaddr)) { +#if LWIP_AUTOIP + struct ip_hdr *iphdr = (struct ip_hdr*)((u8_t*)q->payload + + sizeof(struct eth_hdr)); + /* According to RFC 3297, chapter 2.6.2 (Forwarding Rules), a packet with + a link-local source address must always be "directly to its destination + on the same physical link. The host MUST NOT send the packet to any + router for forwarding". */ + if (!ip_addr_islinklocal(&iphdr->src)) +#endif /* LWIP_AUTOIP */ + { + /* interface has default gateway? */ + if (!ip_addr_isany(&netif->gw)) { + /* send to hardware address of default gateway IP address */ + dst_addr = &(netif->gw); + /* no default gateway available */ + } else { + /* no route to destination error (default gateway missing) */ + return ERR_RTE; + } + } + } +#if LWIP_NETIF_HWADDRHINT + if (netif->addr_hint != NULL) { + /* per-pcb cached entry was given */ + u8_t etharp_cached_entry = *(netif->addr_hint); + if (etharp_cached_entry < ARP_TABLE_SIZE) { +#endif /* LWIP_NETIF_HWADDRHINT */ + if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) && + (ip_addr_cmp(dst_addr, &arp_table[etharp_cached_entry].ipaddr))) { + /* the per-pcb-cached entry is stable and the right one! */ + ETHARP_STATS_INC(etharp.cachehit); + return etharp_output_to_arp_index(netif, q, etharp_cached_entry); + } +#if LWIP_NETIF_HWADDRHINT + } + } +#endif /* LWIP_NETIF_HWADDRHINT */ + + /* find stable entry: do this here since this is a critical path for + throughput and etharp_find_entry() is kind of slow */ + for (i = 0; i < ARP_TABLE_SIZE; i++) { + if ((arp_table[i].state >= ETHARP_STATE_STABLE) && + (ip_addr_cmp(dst_addr, &arp_table[i].ipaddr))) { + /* found an existing, stable entry */ + ETHARP_SET_HINT(netif, i); + return etharp_output_to_arp_index(netif, q, i); + } + } + /* no stable entry found, use the (slower) query function: + queue on destination Ethernet address belonging to ipaddr */ + return etharp_query(netif, dst_addr, q); + } + + /* continuation for multicast/broadcast destinations */ + /* obtain source Ethernet address of the given interface */ + /* send packet directly on the link */ + return etharp_send_ip(netif, q, (struct eth_addr*)(netif->hwaddr), dest); +} + +/** + * Send an ARP request for the given IP address and/or queue a packet. + * + * If the IP address was not yet in the cache, a pending ARP cache entry + * is added and an ARP request is sent for the given address. The packet + * is queued on this entry. + * + * If the IP address was already pending in the cache, a new ARP request + * is sent for the given address. The packet is queued on this entry. + * + * If the IP address was already stable in the cache, and a packet is + * given, it is directly sent and no ARP request is sent out. + * + * If the IP address was already stable in the cache, and no packet is + * given, an ARP request is sent out. + * + * @param netif The lwIP network interface on which ipaddr + * must be queried for. + * @param ipaddr The IP address to be resolved. + * @param q If non-NULL, a pbuf that must be delivered to the IP address. + * q is not freed by this function. + * + * @note q must only be ONE packet, not a packet queue! + * + * @return + * - ERR_BUF Could not make room for Ethernet header. + * - ERR_MEM Hardware address unknown, and no more ARP entries available + * to query for address or queue the packet. + * - ERR_MEM Could not queue packet due to memory shortage. + * - ERR_RTE No route to destination (no gateway to external networks). + * - ERR_ARG Non-unicast address given, those will not appear in ARP cache. + * + */ +err_t +etharp_query(struct netif *netif, ip_addr_t *ipaddr, struct pbuf *q) +{ + struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr; + err_t result = ERR_MEM; + s8_t i; /* ARP entry index */ + + /* non-unicast address? */ + if (ip_addr_isbroadcast(ipaddr, netif) || + ip_addr_ismulticast(ipaddr) || + ip_addr_isany(ipaddr)) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: will not add non-unicast IP address to ARP cache\n")); + return ERR_ARG; + } + + /* find entry in ARP cache, ask to create entry if queueing packet */ + i = etharp_find_entry(ipaddr, ETHARP_FLAG_TRY_HARD); + + /* could not find or create entry? */ + if (i < 0) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not create ARP entry\n")); + if (q) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: packet dropped\n")); + ETHARP_STATS_INC(etharp.memerr); + } + return (err_t)i; + } + + /* mark a fresh entry as pending (we just sent a request) */ + if (arp_table[i].state == ETHARP_STATE_EMPTY) { + arp_table[i].state = ETHARP_STATE_PENDING; + } + + /* { i is either a STABLE or (new or existing) PENDING entry } */ + LWIP_ASSERT("arp_table[i].state == PENDING or STABLE", + ((arp_table[i].state == ETHARP_STATE_PENDING) || + (arp_table[i].state >= ETHARP_STATE_STABLE))); + + /* do we have a pending entry? or an implicit query request? */ + if ((arp_table[i].state == ETHARP_STATE_PENDING) || (q == NULL)) { + /* try to resolve it; send out ARP request */ + result = etharp_request(netif, ipaddr); + if (result != ERR_OK) { + /* ARP request couldn't be sent */ + /* We don't re-send arp request in etharp_tmr, but we still queue packets, + since this failure could be temporary, and the next packet calling + etharp_query again could lead to sending the queued packets. */ + } + if (q == NULL) { + return result; + } + } + + /* packet given? */ + LWIP_ASSERT("q != NULL", q != NULL); + /* stable entry? */ + if (arp_table[i].state >= ETHARP_STATE_STABLE) { + /* we have a valid IP->Ethernet address mapping */ + ETHARP_SET_HINT(netif, i); + /* send the packet */ + result = etharp_send_ip(netif, q, srcaddr, &(arp_table[i].ethaddr)); + /* pending entry? (either just created or already pending */ + } else if (arp_table[i].state == ETHARP_STATE_PENDING) { + /* entry is still pending, queue the given packet 'q' */ + struct pbuf *p; + int copy_needed = 0; + /* IF q includes a PBUF_REF, PBUF_POOL or PBUF_RAM, we have no choice but + * to copy the whole queue into a new PBUF_RAM (see bug #11400) + * PBUF_ROMs can be left as they are, since ROM must not get changed. */ + p = q; + while (p) { + LWIP_ASSERT("no packet queues allowed!", (p->len != p->tot_len) || (p->next == 0)); + if(p->type != PBUF_ROM) { + copy_needed = 1; + break; + } + p = p->next; + } + if(copy_needed) { + /* copy the whole packet into new pbufs */ + p = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM); + if(p != NULL) { + if (pbuf_copy(p, q) != ERR_OK) { + pbuf_free(p); + p = NULL; + } + } + } else { + /* referencing the old pbuf is enough */ + p = q; + pbuf_ref(p); + } + /* packet could be taken over? */ + if (p != NULL) { + /* queue packet ... */ +#if ARP_QUEUEING + struct etharp_q_entry *new_entry; + /* allocate a new arp queue entry */ + new_entry = (struct etharp_q_entry *)memp_malloc(MEMP_ARP_QUEUE); + if (new_entry != NULL) { + new_entry->next = 0; + new_entry->p = p; + if(arp_table[i].q != NULL) { + /* queue was already existent, append the new entry to the end */ + struct etharp_q_entry *r; + r = arp_table[i].q; + while (r->next != NULL) { + r = r->next; + } + r->next = new_entry; + } else { + /* queue did not exist, first item in queue */ + arp_table[i].q = new_entry; + } + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i)); + result = ERR_OK; + } else { + /* the pool MEMP_ARP_QUEUE is empty */ + pbuf_free(p); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\n", (void *)q)); + result = ERR_MEM; + } +#else /* ARP_QUEUEING */ + /* always queue one packet per ARP request only, freeing a previously queued packet */ + if (arp_table[i].q != NULL) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: dropped previously queued packet %p for ARP entry %"S16_F"\n", (void *)q, (s16_t)i)); + pbuf_free(arp_table[i].q); + } + arp_table[i].q = p; + result = ERR_OK; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: queued packet %p on ARP entry %"S16_F"\n", (void *)q, (s16_t)i)); +#endif /* ARP_QUEUEING */ + } else { + ETHARP_STATS_INC(etharp.memerr); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\n", (void *)q)); + result = ERR_MEM; + } + } + return result; +} + +/** + * Send a raw ARP packet (opcode and all addresses can be modified) + * + * @param netif the lwip network interface on which to send the ARP packet + * @param ethsrc_addr the source MAC address for the ethernet header + * @param ethdst_addr the destination MAC address for the ethernet header + * @param hwsrc_addr the source MAC address for the ARP protocol header + * @param ipsrc_addr the source IP address for the ARP protocol header + * @param hwdst_addr the destination MAC address for the ARP protocol header + * @param ipdst_addr the destination IP address for the ARP protocol header + * @param opcode the type of the ARP packet + * @return ERR_OK if the ARP packet has been sent + * ERR_MEM if the ARP packet couldn't be allocated + * any other err_t on failure + */ +#if !LWIP_AUTOIP +static +#endif /* LWIP_AUTOIP */ +err_t +etharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr, + const struct eth_addr *ethdst_addr, + const struct eth_addr *hwsrc_addr, const ip_addr_t *ipsrc_addr, + const struct eth_addr *hwdst_addr, const ip_addr_t *ipdst_addr, + const u16_t opcode) +{ + struct pbuf *p; + err_t result = ERR_OK; + struct eth_hdr *ethhdr; + struct etharp_hdr *hdr; +#if LWIP_AUTOIP + const u8_t * ethdst_hwaddr; +#endif /* LWIP_AUTOIP */ + + LWIP_ASSERT("netif != NULL", netif != NULL); + + /* allocate a pbuf for the outgoing ARP request packet */ + p = pbuf_alloc(PBUF_RAW, SIZEOF_ETHARP_PACKET, PBUF_RAM); + /* could allocate a pbuf for an ARP request? */ + if (p == NULL) { + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, + ("etharp_raw: could not allocate pbuf for ARP request.\n")); + ETHARP_STATS_INC(etharp.memerr); + return ERR_MEM; + } + LWIP_ASSERT("check that first pbuf can hold struct etharp_hdr", + (p->len >= SIZEOF_ETHARP_PACKET)); + + ethhdr = (struct eth_hdr *)p->payload; + hdr = (struct etharp_hdr *)((u8_t*)ethhdr + SIZEOF_ETH_HDR); + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_raw: sending raw ARP packet.\n")); + hdr->opcode = htons(opcode); + + LWIP_ASSERT("netif->hwaddr_len must be the same as ETHARP_HWADDR_LEN for etharp!", + (netif->hwaddr_len == ETHARP_HWADDR_LEN)); +#if LWIP_AUTOIP + /* If we are using Link-Local, all ARP packets that contain a Link-Local + * 'sender IP address' MUST be sent using link-layer broadcast instead of + * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */ + ethdst_hwaddr = ip_addr_islinklocal(ipsrc_addr) ? (u8_t*)(ethbroadcast.addr) : ethdst_addr->addr; +#endif /* LWIP_AUTOIP */ + /* Write the ARP MAC-Addresses */ + ETHADDR16_COPY(&hdr->shwaddr, hwsrc_addr); + ETHADDR16_COPY(&hdr->dhwaddr, hwdst_addr); + /* Write the Ethernet MAC-Addresses */ +#if LWIP_AUTOIP + ETHADDR16_COPY(ðhdr->dest, ethdst_hwaddr); +#else /* LWIP_AUTOIP */ + ETHADDR16_COPY(ðhdr->dest, ethdst_addr); +#endif /* LWIP_AUTOIP */ + ETHADDR16_COPY(ðhdr->src, ethsrc_addr); + /* Copy struct ip_addr2 to aligned ip_addr, to support compilers without + * structure packing. */ + IPADDR2_COPY(&hdr->sipaddr, ipsrc_addr); + IPADDR2_COPY(&hdr->dipaddr, ipdst_addr); + + hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET); + hdr->proto = PP_HTONS(ETHTYPE_IP); + /* set hwlen and protolen */ + hdr->hwlen = ETHARP_HWADDR_LEN; + hdr->protolen = sizeof(ip_addr_t); + + ethhdr->type = PP_HTONS(ETHTYPE_ARP); + /* send ARP query */ + result = netif->linkoutput(netif, p); + ETHARP_STATS_INC(etharp.xmit); + /* free ARP query packet */ + pbuf_free(p); + p = NULL; + /* could not allocate pbuf for ARP request */ + + return result; +} + +/** + * Send an ARP request packet asking for ipaddr. + * + * @param netif the lwip network interface on which to send the request + * @param ipaddr the IP address for which to ask + * @return ERR_OK if the request has been sent + * ERR_MEM if the ARP packet couldn't be allocated + * any other err_t on failure + */ +err_t +etharp_request(struct netif *netif, ip_addr_t *ipaddr) +{ + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, ("etharp_request: sending ARP request.\n")); + return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, ðbroadcast, + (struct eth_addr *)netif->hwaddr, &netif->ip_addr, ðzero, + ipaddr, ARP_REQUEST); +} +#endif /* LWIP_ARP */ + +/** + * Process received ethernet frames. Using this function instead of directly + * calling ip_input and passing ARP frames through etharp in ethernetif_input, + * the ARP cache is protected from concurrent access. + * + * @param p the recevied packet, p->payload pointing to the ethernet header + * @param netif the network interface on which the packet was received + */ +err_t +ethernet_input(struct pbuf *p, struct netif *netif) +{ + struct eth_hdr* ethhdr; + u16_t type; +#if LWIP_ARP || ETHARP_SUPPORT_VLAN + s16_t ip_hdr_offset = SIZEOF_ETH_HDR; +#endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */ + + if (p->len <= SIZEOF_ETH_HDR) { + /* a packet with only an ethernet header (or less) is not valid for us */ + ETHARP_STATS_INC(etharp.proterr); + ETHARP_STATS_INC(etharp.drop); + goto free_and_return; + } + + /* points to packet payload, which starts with an Ethernet header */ + ethhdr = (struct eth_hdr *)p->payload; + LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, + ("ethernet_input: dest:%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F", src:%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F":%"X8_F", type:%"X16_F"\n", + (unsigned)ethhdr->dest.addr[0], (unsigned)ethhdr->dest.addr[1], (unsigned)ethhdr->dest.addr[2], + (unsigned)ethhdr->dest.addr[3], (unsigned)ethhdr->dest.addr[4], (unsigned)ethhdr->dest.addr[5], + (unsigned)ethhdr->src.addr[0], (unsigned)ethhdr->src.addr[1], (unsigned)ethhdr->src.addr[2], + (unsigned)ethhdr->src.addr[3], (unsigned)ethhdr->src.addr[4], (unsigned)ethhdr->src.addr[5], + (unsigned)htons(ethhdr->type))); + + type = ethhdr->type; +#if ETHARP_SUPPORT_VLAN + if (type == PP_HTONS(ETHTYPE_VLAN)) { + struct eth_vlan_hdr *vlan = (struct eth_vlan_hdr*)(((char*)ethhdr) + SIZEOF_ETH_HDR); + if (p->len <= SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR) { + /* a packet with only an ethernet/vlan header (or less) is not valid for us */ + ETHARP_STATS_INC(etharp.proterr); + ETHARP_STATS_INC(etharp.drop); + goto free_and_return; + } +#if defined(ETHARP_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK_FN) /* if not, allow all VLANs */ +#ifdef ETHARP_VLAN_CHECK_FN + if (!ETHARP_VLAN_CHECK_FN(ethhdr, vlan)) { +#elif defined(ETHARP_VLAN_CHECK) + if (VLAN_ID(vlan) != ETHARP_VLAN_CHECK) { +#endif + /* silently ignore this packet: not for our VLAN */ + pbuf_free(p); + return ERR_OK; + } +#endif /* defined(ETHARP_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK_FN) */ + type = vlan->tpid; + ip_hdr_offset = SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR; + } +#endif /* ETHARP_SUPPORT_VLAN */ + +#if LWIP_ARP_FILTER_NETIF + netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, htons(type)); +#endif /* LWIP_ARP_FILTER_NETIF*/ + + if (ethhdr->dest.addr[0] & 1) { + /* this might be a multicast or broadcast packet */ + if (ethhdr->dest.addr[0] == LL_MULTICAST_ADDR_0) { + if ((ethhdr->dest.addr[1] == LL_MULTICAST_ADDR_1) && + (ethhdr->dest.addr[2] == LL_MULTICAST_ADDR_2)) { + /* mark the pbuf as link-layer multicast */ + p->flags |= PBUF_FLAG_LLMCAST; + } + } else if (eth_addr_cmp(ðhdr->dest, ðbroadcast)) { + /* mark the pbuf as link-layer broadcast */ + p->flags |= PBUF_FLAG_LLBCAST; + } + } + + switch (type) { +#if LWIP_ARP + /* IP packet? */ + case PP_HTONS(ETHTYPE_IP): + if (!(netif->flags & NETIF_FLAG_ETHARP)) { + goto free_and_return; + } +#if ETHARP_TRUST_IP_MAC + /* update ARP table */ + etharp_ip_input(netif, p); +#endif /* ETHARP_TRUST_IP_MAC */ + /* skip Ethernet header */ + if(pbuf_header(p, -ip_hdr_offset)) { + LWIP_ASSERT("Can't move over header in packet", 0); + goto free_and_return; + } else { + /* pass to IP layer */ + ip_input(p, netif); + } + break; + + case PP_HTONS(ETHTYPE_ARP): + if (!(netif->flags & NETIF_FLAG_ETHARP)) { + goto free_and_return; + } + /* pass p to ARP module */ + etharp_arp_input(netif, (struct eth_addr*)(netif->hwaddr), p); + break; +#endif /* LWIP_ARP */ +#if PPPOE_SUPPORT + case PP_HTONS(ETHTYPE_PPPOEDISC): /* PPP Over Ethernet Discovery Stage */ + pppoe_disc_input(netif, p); + break; + + case PP_HTONS(ETHTYPE_PPPOE): /* PPP Over Ethernet Session Stage */ + pppoe_data_input(netif, p); + break; +#endif /* PPPOE_SUPPORT */ + + default: + ETHARP_STATS_INC(etharp.proterr); + ETHARP_STATS_INC(etharp.drop); + goto free_and_return; + } + + /* This means the pbuf is freed or consumed, + so the caller doesn't have to free it again */ + return ERR_OK; + +free_and_return: + pbuf_free(p); + return ERR_OK; +} +#endif /* LWIP_ARP || LWIP_ETHERNET */ diff --git a/third_party/lwip-1.4.1/src/netif/ethernetif.c b/third_party/lwip-1.4.1/src/netif/ethernetif.c new file mode 100644 index 0000000..84be4dd --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ethernetif.c @@ -0,0 +1,317 @@ +/** + * @file + * Ethernet Interface Skeleton + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +/* + * This file is a skeleton for developing Ethernet network interface + * drivers for lwIP. Add code to the low_level functions and do a + * search-and-replace for the word "ethernetif" to replace it with + * something that better describes your network interface. + */ + +#include "lwip/opt.h" + +#if 0 /* don't build, this is only a skeleton, see previous comment */ + +#include "lwip/def.h" +#include "lwip/mem.h" +#include "lwip/pbuf.h" +#include +#include +#include "netif/etharp.h" +#include "netif/ppp_oe.h" + +/* Define those to better describe your network interface. */ +#define IFNAME0 'e' +#define IFNAME1 'n' + +/** + * Helper struct to hold private data used to operate your ethernet interface. + * Keeping the ethernet address of the MAC in this struct is not necessary + * as it is already kept in the struct netif. + * But this is only an example, anyway... + */ +struct ethernetif { + struct eth_addr *ethaddr; + /* Add whatever per-interface state that is needed here. */ +}; + +/* Forward declarations. */ +static void ethernetif_input(struct netif *netif); + +/** + * In this function, the hardware should be initialized. + * Called from ethernetif_init(). + * + * @param netif the already initialized lwip network interface structure + * for this ethernetif + */ +static void +low_level_init(struct netif *netif) +{ + struct ethernetif *ethernetif = netif->state; + + /* set MAC hardware address length */ + netif->hwaddr_len = ETHARP_HWADDR_LEN; + + /* set MAC hardware address */ + netif->hwaddr[0] = ; + ... + netif->hwaddr[5] = ; + + /* maximum transfer unit */ + netif->mtu = 1500; + + /* device capabilities */ + /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */ + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP; + + /* Do whatever else is needed to initialize interface. */ +} + +/** + * This function should do the actual transmission of the packet. The packet is + * contained in the pbuf that is passed to the function. This pbuf + * might be chained. + * + * @param netif the lwip network interface structure for this ethernetif + * @param p the MAC packet to send (e.g. IP packet including MAC addresses and type) + * @return ERR_OK if the packet could be sent + * an err_t value if the packet couldn't be sent + * + * @note Returning ERR_MEM here if a DMA queue of your MAC is full can lead to + * strange results. You might consider waiting for space in the DMA queue + * to become availale since the stack doesn't retry to send a packet + * dropped because of memory failure (except for the TCP timers). + */ + +static err_t +low_level_output(struct netif *netif, struct pbuf *p) +{ + struct ethernetif *ethernetif = netif->state; + struct pbuf *q; + + initiate transfer(); + +#if ETH_PAD_SIZE + pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */ +#endif + + for(q = p; q != NULL; q = q->next) { + /* Send the data from the pbuf to the interface, one pbuf at a + time. The size of the data in each pbuf is kept in the ->len + variable. */ + send data from(q->payload, q->len); + } + + signal that packet should be sent(); + +#if ETH_PAD_SIZE + pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */ +#endif + + LINK_STATS_INC(link.xmit); + + return ERR_OK; +} + +/** + * Should allocate a pbuf and transfer the bytes of the incoming + * packet from the interface into the pbuf. + * + * @param netif the lwip network interface structure for this ethernetif + * @return a pbuf filled with the received packet (including MAC header) + * NULL on memory error + */ +static struct pbuf * +low_level_input(struct netif *netif) +{ + struct ethernetif *ethernetif = netif->state; + struct pbuf *p, *q; + u16_t len; + + /* Obtain the size of the packet and put it into the "len" + variable. */ + len = ; + +#if ETH_PAD_SIZE + len += ETH_PAD_SIZE; /* allow room for Ethernet padding */ +#endif + + /* We allocate a pbuf chain of pbufs from the pool. */ + p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL); + + if (p != NULL) { + +#if ETH_PAD_SIZE + pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */ +#endif + + /* We iterate over the pbuf chain until we have read the entire + * packet into the pbuf. */ + for(q = p; q != NULL; q = q->next) { + /* Read enough bytes to fill this pbuf in the chain. The + * available data in the pbuf is given by the q->len + * variable. + * This does not necessarily have to be a memcpy, you can also preallocate + * pbufs for a DMA-enabled MAC and after receiving truncate it to the + * actually received size. In this case, ensure the tot_len member of the + * pbuf is the sum of the chained pbuf len members. + */ + read data into(q->payload, q->len); + } + acknowledge that packet has been read(); + +#if ETH_PAD_SIZE + pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */ +#endif + + LINK_STATS_INC(link.recv); + } else { + drop packet(); + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.drop); + } + + return p; +} + +/** + * This function should be called when a packet is ready to be read + * from the interface. It uses the function low_level_input() that + * should handle the actual reception of bytes from the network + * interface. Then the type of the received packet is determined and + * the appropriate input function is called. + * + * @param netif the lwip network interface structure for this ethernetif + */ +static void +ethernetif_input(struct netif *netif) +{ + struct ethernetif *ethernetif; + struct eth_hdr *ethhdr; + struct pbuf *p; + + ethernetif = netif->state; + + /* move received packet into a new pbuf */ + p = low_level_input(netif); + /* no packet could be read, silently ignore this */ + if (p == NULL) return; + /* points to packet payload, which starts with an Ethernet header */ + ethhdr = p->payload; + + switch (htons(ethhdr->type)) { + /* IP or ARP packet? */ + case ETHTYPE_IP: + case ETHTYPE_ARP: +#if PPPOE_SUPPORT + /* PPPoE packet? */ + case ETHTYPE_PPPOEDISC: + case ETHTYPE_PPPOE: +#endif /* PPPOE_SUPPORT */ + /* full packet send to tcpip_thread to process */ + if (netif->input(p, netif)!=ERR_OK) + { LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n")); + pbuf_free(p); + p = NULL; + } + break; + + default: + pbuf_free(p); + p = NULL; + break; + } +} + +/** + * Should be called at the beginning of the program to set up the + * network interface. It calls the function low_level_init() to do the + * actual setup of the hardware. + * + * This function should be passed as a parameter to netif_add(). + * + * @param netif the lwip network interface structure for this ethernetif + * @return ERR_OK if the loopif is initialized + * ERR_MEM if private data couldn't be allocated + * any other err_t on error + */ +err_t +ethernetif_init(struct netif *netif) +{ + struct ethernetif *ethernetif; + + LWIP_ASSERT("netif != NULL", (netif != NULL)); + + ethernetif = mem_malloc(sizeof(struct ethernetif)); + if (ethernetif == NULL) { + LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_init: out of memory\n")); + return ERR_MEM; + } + +#if LWIP_NETIF_HOSTNAME + /* Initialize interface hostname */ + netif->hostname = "lwip"; +#endif /* LWIP_NETIF_HOSTNAME */ + + /* + * Initialize the snmp variables and counters inside the struct netif. + * The last argument should be replaced with your link speed, in units + * of bits per second. + */ + NETIF_INIT_SNMP(netif, snmp_ifType_ethernet_csmacd, LINK_SPEED_OF_YOUR_NETIF_IN_BPS); + + netif->state = ethernetif; + netif->name[0] = IFNAME0; + netif->name[1] = IFNAME1; + /* We directly use etharp_output() here to save a function call. + * You can instead declare your own function an call etharp_output() + * from it if you have to do some checks before sending (e.g. if link + * is available...) */ + netif->output = etharp_output; + netif->linkoutput = low_level_output; + + ethernetif->ethaddr = (struct eth_addr *)&(netif->hwaddr[0]); + + /* initialize the hardware */ + low_level_init(netif); + + return ERR_OK; +} + +#endif /* 0 */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/auth.c b/third_party/lwip-1.4.1/src/netif/ppp/auth.c new file mode 100644 index 0000000..ecec59c --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/auth.c @@ -0,0 +1,1334 @@ +/***************************************************************************** +* auth.c - Network Authentication and Phase Control program file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* Copyright (c) 1997 by Global Election Systems Inc. All rights reserved. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-12-08 Guy Lancaster , Global Election Systems Inc. +* Ported from public pppd code. +*****************************************************************************/ +/* + * auth.c - PPP authentication and phase control. + * + * Copyright (c) 1993 The Australian National University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the Australian National University. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "lwip/opt.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#include "ppp_impl.h" +#include "pppdebug.h" + +#include "fsm.h" +#include "lcp.h" +#include "pap.h" +#include "chap.h" +#include "auth.h" +#include "ipcp.h" + +#if CBCP_SUPPORT +#include "cbcp.h" +#endif /* CBCP_SUPPORT */ + +#include "lwip/inet.h" + +#include + +#if 0 /* UNUSED */ +/* Bits in scan_authfile return value */ +#define NONWILD_SERVER 1 +#define NONWILD_CLIENT 2 + +#define ISWILD(word) (word[0] == '*' && word[1] == 0) +#endif /* UNUSED */ + +#if PAP_SUPPORT || CHAP_SUPPORT +/* The name by which the peer authenticated itself to us. */ +static char peer_authname[MAXNAMELEN]; +#endif /* PAP_SUPPORT || CHAP_SUPPORT */ + +/* Records which authentication operations haven't completed yet. */ +static int auth_pending[NUM_PPP]; + +/* Set if we have successfully called plogin() */ +static int logged_in; + +/* Set if we have run the /etc/ppp/auth-up script. */ +static int did_authup; /* @todo, we don't need this in lwip*/ + +/* List of addresses which the peer may use. */ +static struct wordlist *addresses[NUM_PPP]; + +#if 0 /* UNUSED */ +/* Wordlist giving addresses which the peer may use + without authenticating itself. */ +static struct wordlist *noauth_addrs; + +/* Extra options to apply, from the secrets file entry for the peer. */ +static struct wordlist *extra_options; +#endif /* UNUSED */ + +/* Number of network protocols which we have opened. */ +static int num_np_open; + +/* Number of network protocols which have come up. */ +static int num_np_up; + +#if PAP_SUPPORT || CHAP_SUPPORT +/* Set if we got the contents of passwd[] from the pap-secrets file. */ +static int passwd_from_file; +#endif /* PAP_SUPPORT || CHAP_SUPPORT */ + +#if 0 /* UNUSED */ +/* Set if we require authentication only because we have a default route. */ +static bool default_auth; + +/* Hook to enable a plugin to control the idle time limit */ +int (*idle_time_hook) __P((struct ppp_idle *)) = NULL; + +/* Hook for a plugin to say whether we can possibly authenticate any peer */ +int (*pap_check_hook) __P((void)) = NULL; + +/* Hook for a plugin to check the PAP user and password */ +int (*pap_auth_hook) __P((char *user, char *passwd, char **msgp, + struct wordlist **paddrs, + struct wordlist **popts)) = NULL; + +/* Hook for a plugin to know about the PAP user logout */ +void (*pap_logout_hook) __P((void)) = NULL; + +/* Hook for a plugin to get the PAP password for authenticating us */ +int (*pap_passwd_hook) __P((char *user, char *passwd)) = NULL; + +/* + * This is used to ensure that we don't start an auth-up/down + * script while one is already running. + */ +enum script_state { + s_down, + s_up +}; + +static enum script_state auth_state = s_down; +static enum script_state auth_script_state = s_down; +static pid_t auth_script_pid = 0; + +/* + * Option variables. + * lwip: some of these are present in the ppp_settings structure + */ +bool uselogin = 0; /* Use /etc/passwd for checking PAP */ +bool cryptpap = 0; /* Passwords in pap-secrets are encrypted */ +bool refuse_pap = 0; /* Don't wanna auth. ourselves with PAP */ +bool refuse_chap = 0; /* Don't wanna auth. ourselves with CHAP */ +bool usehostname = 0; /* Use hostname for our_name */ +bool auth_required = 0; /* Always require authentication from peer */ +bool allow_any_ip = 0; /* Allow peer to use any IP address */ +bool explicit_remote = 0; /* User specified explicit remote name */ +char remote_name[MAXNAMELEN]; /* Peer's name for authentication */ + +#endif /* UNUSED */ + +/* Bits in auth_pending[] */ +#define PAP_WITHPEER 1 +#define PAP_PEER 2 +#define CHAP_WITHPEER 4 +#define CHAP_PEER 8 + +/* @todo, move this somewhere */ +/* Used for storing a sequence of words. Usually malloced. */ +struct wordlist { + struct wordlist *next; + char word[1]; +}; + + +extern char *crypt (const char *, const char *); + +/* Prototypes for procedures local to this file. */ + +static void network_phase (int); +static void check_idle (void *); +static void connect_time_expired (void *); +#if 0 +static int plogin (char *, char *, char **, int *); +#endif +static void plogout (void); +static int null_login (int); +static int get_pap_passwd (int, char *, char *); +static int have_pap_secret (void); +static int have_chap_secret (char *, char *, u32_t); +static int ip_addr_check (u32_t, struct wordlist *); + +#if 0 /* PAP_SUPPORT || CHAP_SUPPORT */ +static int scan_authfile (FILE *, char *, char *, char *, + struct wordlist **, struct wordlist **, + char *); +static void free_wordlist (struct wordlist *); +static void auth_script (char *); +static void auth_script_done (void *); +static void set_allowed_addrs (int unit, struct wordlist *addrs); +static int some_ip_ok (struct wordlist *); +static int setupapfile (char **); +static int privgroup (char **); +static int set_noauth_addr (char **); +static void check_access (FILE *, char *); +#endif /* 0 */ /* PAP_SUPPORT || CHAP_SUPPORT */ + +#if 0 /* UNUSED */ +/* + * Authentication-related options. + */ +option_t auth_options[] = { + { "require-pap", o_bool, &lcp_wantoptions[0].neg_upap, + "Require PAP authentication from peer", 1, &auth_required }, + { "+pap", o_bool, &lcp_wantoptions[0].neg_upap, + "Require PAP authentication from peer", 1, &auth_required }, + { "refuse-pap", o_bool, &refuse_pap, + "Don't agree to auth to peer with PAP", 1 }, + { "-pap", o_bool, &refuse_pap, + "Don't allow PAP authentication with peer", 1 }, + { "require-chap", o_bool, &lcp_wantoptions[0].neg_chap, + "Require CHAP authentication from peer", 1, &auth_required }, + { "+chap", o_bool, &lcp_wantoptions[0].neg_chap, + "Require CHAP authentication from peer", 1, &auth_required }, + { "refuse-chap", o_bool, &refuse_chap, + "Don't agree to auth to peer with CHAP", 1 }, + { "-chap", o_bool, &refuse_chap, + "Don't allow CHAP authentication with peer", 1 }, + { "name", o_string, our_name, + "Set local name for authentication", + OPT_PRIV|OPT_STATIC, NULL, MAXNAMELEN }, + { "user", o_string, user, + "Set name for auth with peer", OPT_STATIC, NULL, MAXNAMELEN }, + { "usehostname", o_bool, &usehostname, + "Must use hostname for authentication", 1 }, + { "remotename", o_string, remote_name, + "Set remote name for authentication", OPT_STATIC, + &explicit_remote, MAXNAMELEN }, + { "auth", o_bool, &auth_required, + "Require authentication from peer", 1 }, + { "noauth", o_bool, &auth_required, + "Don't require peer to authenticate", OPT_PRIV, &allow_any_ip }, + { "login", o_bool, &uselogin, + "Use system password database for PAP", 1 }, + { "papcrypt", o_bool, &cryptpap, + "PAP passwords are encrypted", 1 }, + { "+ua", o_special, (void *)setupapfile, + "Get PAP user and password from file" }, + { "password", o_string, passwd, + "Password for authenticating us to the peer", OPT_STATIC, + NULL, MAXSECRETLEN }, + { "privgroup", o_special, (void *)privgroup, + "Allow group members to use privileged options", OPT_PRIV }, + { "allow-ip", o_special, (void *)set_noauth_addr, + "Set IP address(es) which can be used without authentication", + OPT_PRIV }, + { NULL } +}; +#endif /* UNUSED */ +#if 0 /* UNUSED */ +/* + * setupapfile - specifies UPAP info for authenticating with peer. + */ +static int +setupapfile(char **argv) +{ + FILE * ufile; + int l; + + lcp_allowoptions[0].neg_upap = 1; + + /* open user info file */ + seteuid(getuid()); + ufile = fopen(*argv, "r"); + seteuid(0); + if (ufile == NULL) { + option_error("unable to open user login data file %s", *argv); + return 0; + } + check_access(ufile, *argv); + + /* get username */ + if (fgets(user, MAXNAMELEN - 1, ufile) == NULL + || fgets(passwd, MAXSECRETLEN - 1, ufile) == NULL){ + option_error("unable to read user login data file %s", *argv); + return 0; + } + fclose(ufile); + + /* get rid of newlines */ + l = strlen(user); + if (l > 0 && user[l-1] == '\n') + user[l-1] = 0; + l = strlen(passwd); + if (l > 0 && passwd[l-1] == '\n') + passwd[l-1] = 0; + + return (1); +} +#endif /* UNUSED */ + +#if 0 /* UNUSED */ +/* + * privgroup - allow members of the group to have privileged access. + */ +static int +privgroup(char **argv) +{ + struct group *g; + int i; + + g = getgrnam(*argv); + if (g == 0) { + option_error("group %s is unknown", *argv); + return 0; + } + for (i = 0; i < ngroups; ++i) { + if (groups[i] == g->gr_gid) { + privileged = 1; + break; + } + } + return 1; +} +#endif + +#if 0 /* UNUSED */ +/* + * set_noauth_addr - set address(es) that can be used without authentication. + * Equivalent to specifying an entry like `"" * "" addr' in pap-secrets. + */ +static int +set_noauth_addr(char **argv) +{ + char *addr = *argv; + int l = strlen(addr); + struct wordlist *wp; + + wp = (struct wordlist *) malloc(sizeof(struct wordlist) + l + 1); + if (wp == NULL) + novm("allow-ip argument"); + wp->word = (char *) (wp + 1); + wp->next = noauth_addrs; + BCOPY(addr, wp->word, l); + noauth_addrs = wp; + return 1; +} +#endif /* UNUSED */ + +/* + * An Open on LCP has requested a change from Dead to Establish phase. + * Do what's necessary to bring the physical layer up. + */ +void +link_required(int unit) +{ + LWIP_UNUSED_ARG(unit); + + AUTHDEBUG(LOG_INFO, ("link_required: %d\n", unit)); +} + +/* + * LCP has terminated the link; go to the Dead phase and take the + * physical layer down. + */ +void +link_terminated(int unit) +{ + AUTHDEBUG(LOG_INFO, ("link_terminated: %d\n", unit)); + if (lcp_phase[unit] == PHASE_DEAD) { + return; + } + if (logged_in) { + plogout(); + } + lcp_phase[unit] = PHASE_DEAD; + AUTHDEBUG(LOG_NOTICE, ("Connection terminated.\n")); + pppLinkTerminated(unit); +} + +/* + * LCP has gone down; it will either die or try to re-establish. + */ +void +link_down(int unit) +{ + int i; + struct protent *protp; + + AUTHDEBUG(LOG_INFO, ("link_down: %d\n", unit)); + + if (did_authup) { + /* XXX Do link down processing. */ + did_authup = 0; + } + for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i) { + if (!protp->enabled_flag) { + continue; + } + if (protp->protocol != PPP_LCP && protp->lowerdown != NULL) { + (*protp->lowerdown)(unit); + } + if (protp->protocol < 0xC000 && protp->close != NULL) { + (*protp->close)(unit, "LCP down"); + } + } + num_np_open = 0; /* number of network protocols we have opened */ + num_np_up = 0; /* Number of network protocols which have come up */ + + if (lcp_phase[unit] != PHASE_DEAD) { + lcp_phase[unit] = PHASE_TERMINATE; + } + pppLinkDown(unit); +} + +/* + * The link is established. + * Proceed to the Dead, Authenticate or Network phase as appropriate. + */ +void +link_established(int unit) +{ + int auth; + int i; + struct protent *protp; + lcp_options *wo = &lcp_wantoptions[unit]; + lcp_options *go = &lcp_gotoptions[unit]; +#if PAP_SUPPORT || CHAP_SUPPORT + lcp_options *ho = &lcp_hisoptions[unit]; +#endif /* PAP_SUPPORT || CHAP_SUPPORT */ + + AUTHDEBUG(LOG_INFO, ("link_established: unit %d; Lowering up all protocols...\n", unit)); + /* + * Tell higher-level protocols that LCP is up. + */ + for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i) { + if (protp->protocol != PPP_LCP && protp->enabled_flag && protp->lowerup != NULL) { + (*protp->lowerup)(unit); + } + } + if (ppp_settings.auth_required && !(go->neg_chap || go->neg_upap)) { + /* + * We wanted the peer to authenticate itself, and it refused: + * treat it as though it authenticated with PAP using a username + * of "" and a password of "". If that's not OK, boot it out. + */ + if (!wo->neg_upap || !null_login(unit)) { + AUTHDEBUG(LOG_WARNING, ("peer refused to authenticate\n")); + lcp_close(unit, "peer refused to authenticate"); + return; + } + } + + lcp_phase[unit] = PHASE_AUTHENTICATE; + auth = 0; +#if CHAP_SUPPORT + if (go->neg_chap) { + ChapAuthPeer(unit, ppp_settings.our_name, go->chap_mdtype); + auth |= CHAP_PEER; + } +#endif /* CHAP_SUPPORT */ +#if PAP_SUPPORT && CHAP_SUPPORT + else +#endif /* PAP_SUPPORT && CHAP_SUPPORT */ +#if PAP_SUPPORT + if (go->neg_upap) { + upap_authpeer(unit); + auth |= PAP_PEER; + } +#endif /* PAP_SUPPORT */ +#if CHAP_SUPPORT + if (ho->neg_chap) { + ChapAuthWithPeer(unit, ppp_settings.user, ho->chap_mdtype); + auth |= CHAP_WITHPEER; + } +#endif /* CHAP_SUPPORT */ +#if PAP_SUPPORT && CHAP_SUPPORT + else +#endif /* PAP_SUPPORT && CHAP_SUPPORT */ +#if PAP_SUPPORT + if (ho->neg_upap) { + if (ppp_settings.passwd[0] == 0) { + passwd_from_file = 1; + if (!get_pap_passwd(unit, ppp_settings.user, ppp_settings.passwd)) { + AUTHDEBUG(LOG_ERR, ("No secret found for PAP login\n")); + } + } + upap_authwithpeer(unit, ppp_settings.user, ppp_settings.passwd); + auth |= PAP_WITHPEER; + } +#endif /* PAP_SUPPORT */ + auth_pending[unit] = auth; + + if (!auth) { + network_phase(unit); + } +} + +/* + * Proceed to the network phase. + */ +static void +network_phase(int unit) +{ + int i; + struct protent *protp; + lcp_options *go = &lcp_gotoptions[unit]; + + /* + * If the peer had to authenticate, run the auth-up script now. + */ + if ((go->neg_chap || go->neg_upap) && !did_authup) { + /* XXX Do setup for peer authentication. */ + did_authup = 1; + } + +#if CBCP_SUPPORT + /* + * If we negotiated callback, do it now. + */ + if (go->neg_cbcp) { + lcp_phase[unit] = PHASE_CALLBACK; + (*cbcp_protent.open)(unit); + return; + } +#endif /* CBCP_SUPPORT */ + + lcp_phase[unit] = PHASE_NETWORK; + for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i) { + if (protp->protocol < 0xC000 && protp->enabled_flag && protp->open != NULL) { + (*protp->open)(unit); + if (protp->protocol != PPP_CCP) { + ++num_np_open; + } + } + } + + if (num_np_open == 0) { + /* nothing to do */ + lcp_close(0, "No network protocols running"); + } +} +/* @todo: add void start_networks(void) here (pppd 2.3.11) */ + +/* + * The peer has failed to authenticate himself using `protocol'. + */ +void +auth_peer_fail(int unit, u16_t protocol) +{ + LWIP_UNUSED_ARG(protocol); + + AUTHDEBUG(LOG_INFO, ("auth_peer_fail: %d proto=%X\n", unit, protocol)); + /* + * Authentication failure: take the link down + */ + lcp_close(unit, "Authentication failed"); +} + + +#if PAP_SUPPORT || CHAP_SUPPORT +/* + * The peer has been successfully authenticated using `protocol'. + */ +void +auth_peer_success(int unit, u16_t protocol, char *name, int namelen) +{ + int pbit; + + AUTHDEBUG(LOG_INFO, ("auth_peer_success: %d proto=%X\n", unit, protocol)); + switch (protocol) { + case PPP_CHAP: + pbit = CHAP_PEER; + break; + case PPP_PAP: + pbit = PAP_PEER; + break; + default: + AUTHDEBUG(LOG_WARNING, ("auth_peer_success: unknown protocol %x\n", protocol)); + return; + } + + /* + * Save the authenticated name of the peer for later. + */ + if (namelen > (int)sizeof(peer_authname) - 1) { + namelen = sizeof(peer_authname) - 1; + } + BCOPY(name, peer_authname, namelen); + peer_authname[namelen] = 0; + + /* + * If there is no more authentication still to be done, + * proceed to the network (or callback) phase. + */ + if ((auth_pending[unit] &= ~pbit) == 0) { + network_phase(unit); + } +} + +/* + * We have failed to authenticate ourselves to the peer using `protocol'. + */ +void +auth_withpeer_fail(int unit, u16_t protocol) +{ + int errCode = PPPERR_AUTHFAIL; + + LWIP_UNUSED_ARG(protocol); + + AUTHDEBUG(LOG_INFO, ("auth_withpeer_fail: %d proto=%X\n", unit, protocol)); + if (passwd_from_file) { + BZERO(ppp_settings.passwd, MAXSECRETLEN); + } + + /* + * We've failed to authenticate ourselves to our peer. + * He'll probably take the link down, and there's not much + * we can do except wait for that. + */ + pppIOCtl(unit, PPPCTLS_ERRCODE, &errCode); + lcp_close(unit, "Failed to authenticate ourselves to peer"); +} + +/* + * We have successfully authenticated ourselves with the peer using `protocol'. + */ +void +auth_withpeer_success(int unit, u16_t protocol) +{ + int pbit; + + AUTHDEBUG(LOG_INFO, ("auth_withpeer_success: %d proto=%X\n", unit, protocol)); + switch (protocol) { + case PPP_CHAP: + pbit = CHAP_WITHPEER; + break; + case PPP_PAP: + if (passwd_from_file) { + BZERO(ppp_settings.passwd, MAXSECRETLEN); + } + pbit = PAP_WITHPEER; + break; + default: + AUTHDEBUG(LOG_WARNING, ("auth_peer_success: unknown protocol %x\n", protocol)); + pbit = 0; + } + + /* + * If there is no more authentication still being done, + * proceed to the network (or callback) phase. + */ + if ((auth_pending[unit] &= ~pbit) == 0) { + network_phase(unit); + } +} +#endif /* PAP_SUPPORT || CHAP_SUPPORT */ + + +/* + * np_up - a network protocol has come up. + */ +void +np_up(int unit, u16_t proto) +{ + LWIP_UNUSED_ARG(unit); + LWIP_UNUSED_ARG(proto); + + AUTHDEBUG(LOG_INFO, ("np_up: %d proto=%X\n", unit, proto)); + if (num_np_up == 0) { + AUTHDEBUG(LOG_INFO, ("np_up: maxconnect=%d idle_time_limit=%d\n",ppp_settings.maxconnect,ppp_settings.idle_time_limit)); + /* + * At this point we consider that the link has come up successfully. + */ + if (ppp_settings.idle_time_limit > 0) { + TIMEOUT(check_idle, NULL, ppp_settings.idle_time_limit); + } + + /* + * Set a timeout to close the connection once the maximum + * connect time has expired. + */ + if (ppp_settings.maxconnect > 0) { + TIMEOUT(connect_time_expired, 0, ppp_settings.maxconnect); + } + } + ++num_np_up; +} + +/* + * np_down - a network protocol has gone down. + */ +void +np_down(int unit, u16_t proto) +{ + LWIP_UNUSED_ARG(unit); + LWIP_UNUSED_ARG(proto); + + AUTHDEBUG(LOG_INFO, ("np_down: %d proto=%X\n", unit, proto)); + if (--num_np_up == 0 && ppp_settings.idle_time_limit > 0) { + UNTIMEOUT(check_idle, NULL); + } +} + +/* + * np_finished - a network protocol has finished using the link. + */ +void +np_finished(int unit, u16_t proto) +{ + LWIP_UNUSED_ARG(unit); + LWIP_UNUSED_ARG(proto); + + AUTHDEBUG(LOG_INFO, ("np_finished: %d proto=%X\n", unit, proto)); + if (--num_np_open <= 0) { + /* no further use for the link: shut up shop. */ + lcp_close(0, "No network protocols running"); + } +} + +/* + * check_idle - check whether the link has been idle for long + * enough that we can shut it down. + */ +static void +check_idle(void *arg) +{ + struct ppp_idle idle; + u_short itime; + + LWIP_UNUSED_ARG(arg); + if (!get_idle_time(0, &idle)) { + return; + } + itime = LWIP_MIN(idle.xmit_idle, idle.recv_idle); + if (itime >= ppp_settings.idle_time_limit) { + /* link is idle: shut it down. */ + AUTHDEBUG(LOG_INFO, ("Terminating connection due to lack of activity.\n")); + lcp_close(0, "Link inactive"); + } else { + TIMEOUT(check_idle, NULL, ppp_settings.idle_time_limit - itime); + } +} + +/* + * connect_time_expired - log a message and close the connection. + */ +static void +connect_time_expired(void *arg) +{ + LWIP_UNUSED_ARG(arg); + + AUTHDEBUG(LOG_INFO, ("Connect time expired\n")); + lcp_close(0, "Connect time expired"); /* Close connection */ +} + +#if 0 /* UNUSED */ +/* + * auth_check_options - called to check authentication options. + */ +void +auth_check_options(void) +{ + lcp_options *wo = &lcp_wantoptions[0]; + int can_auth; + ipcp_options *ipwo = &ipcp_wantoptions[0]; + u32_t remote; + + /* Default our_name to hostname, and user to our_name */ + if (ppp_settings.our_name[0] == 0 || ppp_settings.usehostname) { + strcpy(ppp_settings.our_name, ppp_settings.hostname); + } + + if (ppp_settings.user[0] == 0) { + strcpy(ppp_settings.user, ppp_settings.our_name); + } + + /* If authentication is required, ask peer for CHAP or PAP. */ + if (ppp_settings.auth_required && !wo->neg_chap && !wo->neg_upap) { + wo->neg_chap = 1; + wo->neg_upap = 1; + } + + /* + * Check whether we have appropriate secrets to use + * to authenticate the peer. + */ + can_auth = wo->neg_upap && have_pap_secret(); + if (!can_auth && wo->neg_chap) { + remote = ipwo->accept_remote? 0: ipwo->hisaddr; + can_auth = have_chap_secret(ppp_settings.remote_name, ppp_settings.our_name, remote); + } + + if (ppp_settings.auth_required && !can_auth) { + ppp_panic("No auth secret"); + } +} +#endif /* UNUSED */ + +/* + * auth_reset - called when LCP is starting negotiations to recheck + * authentication options, i.e. whether we have appropriate secrets + * to use for authenticating ourselves and/or the peer. + */ +void +auth_reset(int unit) +{ + lcp_options *go = &lcp_gotoptions[unit]; + lcp_options *ao = &lcp_allowoptions[0]; + ipcp_options *ipwo = &ipcp_wantoptions[0]; + u32_t remote; + + AUTHDEBUG(LOG_INFO, ("auth_reset: %d\n", unit)); + ao->neg_upap = !ppp_settings.refuse_pap && (ppp_settings.passwd[0] != 0 || get_pap_passwd(unit, NULL, NULL)); + ao->neg_chap = !ppp_settings.refuse_chap && ppp_settings.passwd[0] != 0 /*have_chap_secret(ppp_settings.user, ppp_settings.remote_name, (u32_t)0)*/; + + if (go->neg_upap && !have_pap_secret()) { + go->neg_upap = 0; + } + if (go->neg_chap) { + remote = ipwo->accept_remote? 0: ipwo->hisaddr; + if (!have_chap_secret(ppp_settings.remote_name, ppp_settings.our_name, remote)) { + go->neg_chap = 0; + } + } +} + +#if PAP_SUPPORT +/* + * check_passwd - Check the user name and passwd against the PAP secrets + * file. If requested, also check against the system password database, + * and login the user if OK. + * + * returns: + * UPAP_AUTHNAK: Authentication failed. + * UPAP_AUTHACK: Authentication succeeded. + * In either case, msg points to an appropriate message. + */ +u_char +check_passwd( int unit, char *auser, int userlen, char *apasswd, int passwdlen, char **msg, int *msglen) +{ +#if 1 /* XXX Assume all entries OK. */ + LWIP_UNUSED_ARG(unit); + LWIP_UNUSED_ARG(auser); + LWIP_UNUSED_ARG(userlen); + LWIP_UNUSED_ARG(apasswd); + LWIP_UNUSED_ARG(passwdlen); + LWIP_UNUSED_ARG(msglen); + *msg = (char *) 0; + return UPAP_AUTHACK; /* XXX Assume all entries OK. */ +#else + u_char ret = 0; + struct wordlist *addrs = NULL; + char passwd[256], user[256]; + char secret[MAXWORDLEN]; + static u_short attempts = 0; + + /* + * Make copies of apasswd and auser, then null-terminate them. + */ + BCOPY(apasswd, passwd, passwdlen); + passwd[passwdlen] = '\0'; + BCOPY(auser, user, userlen); + user[userlen] = '\0'; + *msg = (char *) 0; + + /* XXX Validate user name and password. */ + ret = UPAP_AUTHACK; /* XXX Assume all entries OK. */ + + if (ret == UPAP_AUTHNAK) { + if (*msg == (char *) 0) { + *msg = "Login incorrect"; + } + *msglen = strlen(*msg); + /* + * Frustrate passwd stealer programs. + * Allow 10 tries, but start backing off after 3 (stolen from login). + * On 10'th, drop the connection. + */ + if (attempts++ >= 10) { + AUTHDEBUG(LOG_WARNING, ("%d LOGIN FAILURES BY %s\n", attempts, user)); + /*ppp_panic("Excess Bad Logins");*/ + } + if (attempts > 3) { + /* @todo: this was sleep(), i.e. seconds, not milliseconds + * I don't think we really need this in lwIP - we would block tcpip_thread! + */ + /*sys_msleep((attempts - 3) * 5);*/ + } + if (addrs != NULL) { + free_wordlist(addrs); + } + } else { + attempts = 0; /* Reset count */ + if (*msg == (char *) 0) { + *msg = "Login ok"; + } + *msglen = strlen(*msg); + set_allowed_addrs(unit, addrs); + } + + BZERO(passwd, sizeof(passwd)); + BZERO(secret, sizeof(secret)); + + return ret; +#endif +} +#endif /* PAP_SUPPORT */ + +#if 0 /* UNUSED */ +/* + * This function is needed for PAM. + */ + +#ifdef USE_PAM + +/* lwip does not support PAM*/ + +#endif /* USE_PAM */ + +#endif /* UNUSED */ + + +#if 0 /* UNUSED */ +/* + * plogin - Check the user name and password against the system + * password database, and login the user if OK. + * + * returns: + * UPAP_AUTHNAK: Login failed. + * UPAP_AUTHACK: Login succeeded. + * In either case, msg points to an appropriate message. + */ +static int +plogin(char *user, char *passwd, char **msg, int *msglen) +{ + + LWIP_UNUSED_ARG(user); + LWIP_UNUSED_ARG(passwd); + LWIP_UNUSED_ARG(msg); + LWIP_UNUSED_ARG(msglen); + + + /* The new lines are here align the file when + * compared against the pppd 2.3.11 code */ + + + + + + + + + + + + + + + + + /* XXX Fail until we decide that we want to support logins. */ + return (UPAP_AUTHNAK); +} +#endif + + + +/* + * plogout - Logout the user. + */ +static void +plogout(void) +{ + logged_in = 0; +} + +/* + * null_login - Check if a username of "" and a password of "" are + * acceptable, and iff so, set the list of acceptable IP addresses + * and return 1. + */ +static int +null_login(int unit) +{ + LWIP_UNUSED_ARG(unit); + /* XXX Fail until we decide that we want to support logins. */ + return 0; +} + + +/* + * get_pap_passwd - get a password for authenticating ourselves with + * our peer using PAP. Returns 1 on success, 0 if no suitable password + * could be found. + */ +static int +get_pap_passwd(int unit, char *user, char *passwd) +{ + LWIP_UNUSED_ARG(unit); +/* normally we would reject PAP if no password is provided, + but this causes problems with some providers (like CHT in Taiwan) + who incorrectly request PAP and expect a bogus/empty password, so + always provide a default user/passwd of "none"/"none" + + @todo: This should be configured by the user, instead of being hardcoded here! +*/ + if(user) { + strcpy(user, "none"); + } + if(passwd) { + strcpy(passwd, "none"); + } + return 1; +} + +/* + * have_pap_secret - check whether we have a PAP file with any + * secrets that we could possibly use for authenticating the peer. + */ +static int +have_pap_secret(void) +{ + /* XXX Fail until we set up our passwords. */ + return 0; +} + +/* + * have_chap_secret - check whether we have a CHAP file with a + * secret that we could possibly use for authenticating `client' + * on `server'. Either can be the null string, meaning we don't + * know the identity yet. + */ +static int +have_chap_secret(char *client, char *server, u32_t remote) +{ + LWIP_UNUSED_ARG(client); + LWIP_UNUSED_ARG(server); + LWIP_UNUSED_ARG(remote); + + /* XXX Fail until we set up our passwords. */ + return 0; +} +#if CHAP_SUPPORT + +/* + * get_secret - open the CHAP secret file and return the secret + * for authenticating the given client on the given server. + * (We could be either client or server). + */ +int +get_secret(int unit, char *client, char *server, char *secret, int *secret_len, int save_addrs) +{ +#if 1 + int len; + struct wordlist *addrs; + + LWIP_UNUSED_ARG(unit); + LWIP_UNUSED_ARG(server); + LWIP_UNUSED_ARG(save_addrs); + + addrs = NULL; + + if(!client || !client[0] || strcmp(client, ppp_settings.user)) { + return 0; + } + + len = (int)strlen(ppp_settings.passwd); + if (len > MAXSECRETLEN) { + AUTHDEBUG(LOG_ERR, ("Secret for %s on %s is too long\n", client, server)); + len = MAXSECRETLEN; + } + + BCOPY(ppp_settings.passwd, secret, len); + *secret_len = len; + + return 1; +#else + int ret = 0, len; + struct wordlist *addrs; + char secbuf[MAXWORDLEN]; + + addrs = NULL; + secbuf[0] = 0; + + /* XXX Find secret. */ + if (ret < 0) { + return 0; + } + + if (save_addrs) { + set_allowed_addrs(unit, addrs); + } + + len = strlen(secbuf); + if (len > MAXSECRETLEN) { + AUTHDEBUG(LOG_ERR, ("Secret for %s on %s is too long\n", client, server)); + len = MAXSECRETLEN; + } + + BCOPY(secbuf, secret, len); + BZERO(secbuf, sizeof(secbuf)); + *secret_len = len; + + return 1; +#endif +} +#endif /* CHAP_SUPPORT */ + + +#if 0 /* PAP_SUPPORT || CHAP_SUPPORT */ +/* + * set_allowed_addrs() - set the list of allowed addresses. + */ +static void +set_allowed_addrs(int unit, struct wordlist *addrs) +{ + if (addresses[unit] != NULL) { + free_wordlist(addresses[unit]); + } + addresses[unit] = addrs; + +#if 0 + /* + * If there's only one authorized address we might as well + * ask our peer for that one right away + */ + if (addrs != NULL && addrs->next == NULL) { + char *p = addrs->word; + struct ipcp_options *wo = &ipcp_wantoptions[unit]; + u32_t a; + struct hostent *hp; + + if (wo->hisaddr == 0 && *p != '!' && *p != '-' && strchr(p, '/') == NULL) { + hp = gethostbyname(p); + if (hp != NULL && hp->h_addrtype == AF_INET) { + a = *(u32_t *)hp->h_addr; + } else { + a = inet_addr(p); + } + if (a != (u32_t) -1) { + wo->hisaddr = a; + } + } + } +#endif +} +#endif /* 0 */ /* PAP_SUPPORT || CHAP_SUPPORT */ + +/* + * auth_ip_addr - check whether the peer is authorized to use + * a given IP address. Returns 1 if authorized, 0 otherwise. + */ +int +auth_ip_addr(int unit, u32_t addr) +{ + return ip_addr_check(addr, addresses[unit]); +} + +static int /* @todo: integrate this funtion into auth_ip_addr()*/ +ip_addr_check(u32_t addr, struct wordlist *addrs) +{ + /* don't allow loopback or multicast address */ + if (bad_ip_adrs(addr)) { + return 0; + } + + if (addrs == NULL) { + return !ppp_settings.auth_required; /* no addresses authorized */ + } + + /* XXX All other addresses allowed. */ + return 1; +} + +/* + * bad_ip_adrs - return 1 if the IP address is one we don't want + * to use, such as an address in the loopback net or a multicast address. + * addr is in network byte order. + */ +int +bad_ip_adrs(u32_t addr) +{ + addr = ntohl(addr); + return (addr >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET + || IN_MULTICAST(addr) || IN_BADCLASS(addr); +} + +#if 0 /* UNUSED */ /* PAP_SUPPORT || CHAP_SUPPORT */ +/* + * some_ip_ok - check a wordlist to see if it authorizes any + * IP address(es). + */ +static int +some_ip_ok(struct wordlist *addrs) +{ + for (; addrs != 0; addrs = addrs->next) { + if (addrs->word[0] == '-') + break; + if (addrs->word[0] != '!') + return 1; /* some IP address is allowed */ + } + return 0; +} + +/* + * check_access - complain if a secret file has too-liberal permissions. + */ +static void +check_access(FILE *f, char *filename) +{ + struct stat sbuf; + + if (fstat(fileno(f), &sbuf) < 0) { + warn("cannot stat secret file %s: %m", filename); + } else if ((sbuf.st_mode & (S_IRWXG | S_IRWXO)) != 0) { + warn("Warning - secret file %s has world and/or group access", + filename); + } +} + + +/* + * scan_authfile - Scan an authorization file for a secret suitable + * for authenticating `client' on `server'. The return value is -1 + * if no secret is found, otherwise >= 0. The return value has + * NONWILD_CLIENT set if the secret didn't have "*" for the client, and + * NONWILD_SERVER set if the secret didn't have "*" for the server. + * Any following words on the line up to a "--" (i.e. address authorization + * info) are placed in a wordlist and returned in *addrs. Any + * following words (extra options) are placed in a wordlist and + * returned in *opts. + * We assume secret is NULL or points to MAXWORDLEN bytes of space. + */ +static int +scan_authfile(FILE *f, char *client, char *server, char *secret, struct wordlist **addrs, struct wordlist **opts, char *filename) +{ + /* We do not (currently) need this in lwip */ + return 0; /* dummy */ +} +/* + * free_wordlist - release memory allocated for a wordlist. + */ +static void +free_wordlist(struct wordlist *wp) +{ + struct wordlist *next; + + while (wp != NULL) { + next = wp->next; + free(wp); + wp = next; + } +} + +/* + * auth_script_done - called when the auth-up or auth-down script + * has finished. + */ +static void +auth_script_done(void *arg) +{ + auth_script_pid = 0; + switch (auth_script_state) { + case s_up: + if (auth_state == s_down) { + auth_script_state = s_down; + auth_script(_PATH_AUTHDOWN); + } + break; + case s_down: + if (auth_state == s_up) { + auth_script_state = s_up; + auth_script(_PATH_AUTHUP); + } + break; + } +} + +/* + * auth_script - execute a script with arguments + * interface-name peer-name real-user tty speed + */ +static void +auth_script(char *script) +{ + char strspeed[32]; + struct passwd *pw; + char struid[32]; + char *user_name; + char *argv[8]; + + if ((pw = getpwuid(getuid())) != NULL && pw->pw_name != NULL) + user_name = pw->pw_name; + else { + slprintf(struid, sizeof(struid), "%d", getuid()); + user_name = struid; + } + slprintf(strspeed, sizeof(strspeed), "%d", baud_rate); + + argv[0] = script; + argv[1] = ifname; + argv[2] = peer_authname; + argv[3] = user_name; + argv[4] = devnam; + argv[5] = strspeed; + argv[6] = NULL; + + auth_script_pid = run_program(script, argv, 0, auth_script_done, NULL); +} +#endif /* 0 */ /* PAP_SUPPORT || CHAP_SUPPORT */ +#endif /* PPP_SUPPORT */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/auth.h b/third_party/lwip-1.4.1/src/netif/ppp/auth.h new file mode 100644 index 0000000..593e17d --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/auth.h @@ -0,0 +1,111 @@ +/***************************************************************************** +* auth.h - PPP Authentication and phase control header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1998 Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-12-04 Guy Lancaster , Global Election Systems Inc. +* Original derived from BSD pppd.h. +*****************************************************************************/ +/* + * pppd.h - PPP daemon global declarations. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +#ifndef AUTH_H +#define AUTH_H + +/*********************** +*** PUBLIC FUNCTIONS *** +***********************/ + +/* we are starting to use the link */ +void link_required (int); + +/* we are finished with the link */ +void link_terminated (int); + +/* the LCP layer has left the Opened state */ +void link_down (int); + +/* the link is up; authenticate now */ +void link_established (int); + +/* a network protocol has come up */ +void np_up (int, u16_t); + +/* a network protocol has gone down */ +void np_down (int, u16_t); + +/* a network protocol no longer needs link */ +void np_finished (int, u16_t); + +/* peer failed to authenticate itself */ +void auth_peer_fail (int, u16_t); + +/* peer successfully authenticated itself */ +void auth_peer_success (int, u16_t, char *, int); + +/* we failed to authenticate ourselves */ +void auth_withpeer_fail (int, u16_t); + +/* we successfully authenticated ourselves */ +void auth_withpeer_success (int, u16_t); + +/* check authentication options supplied */ +void auth_check_options (void); + +/* check what secrets we have */ +void auth_reset (int); + +/* Check peer-supplied username/password */ +u_char check_passwd (int, char *, int, char *, int, char **, int *); + +/* get "secret" for chap */ +int get_secret (int, char *, char *, char *, int *, int); + +/* check if IP address is authorized */ +int auth_ip_addr (int, u32_t); + +/* check if IP address is unreasonable */ +int bad_ip_adrs (u32_t); + +#endif /* AUTH_H */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/chap.c b/third_party/lwip-1.4.1/src/netif/ppp/chap.c new file mode 100644 index 0000000..6692d40 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/chap.c @@ -0,0 +1,908 @@ +/*** WARNING - THIS HAS NEVER BEEN FINISHED ***/ +/***************************************************************************** +* chap.c - Network Challenge Handshake Authentication Protocol program file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 by Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-12-04 Guy Lancaster , Global Election Systems Inc. +* Original based on BSD chap.c. +*****************************************************************************/ +/* + * chap.c - Challenge Handshake Authentication Protocol. + * + * Copyright (c) 1993 The Australian National University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the Australian National University. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Copyright (c) 1991 Gregory M. Christy. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Gregory M. Christy. The name of the author may not be used to + * endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "lwip/opt.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#if CHAP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#include "ppp_impl.h" +#include "pppdebug.h" + +#include "magic.h" +#include "randm.h" +#include "auth.h" +#include "md5.h" +#include "chap.h" +#include "chpms.h" + +#include + +#if 0 /* UNUSED */ +/* + * Command-line options. + */ +static option_t chap_option_list[] = { + { "chap-restart", o_int, &chap[0].timeouttime, + "Set timeout for CHAP" }, + { "chap-max-challenge", o_int, &chap[0].max_transmits, + "Set max #xmits for challenge" }, + { "chap-interval", o_int, &chap[0].chal_interval, + "Set interval for rechallenge" }, +#ifdef MSLANMAN + { "ms-lanman", o_bool, &ms_lanman, + "Use LanMan passwd when using MS-CHAP", 1 }, +#endif + { NULL } +}; +#endif /* UNUSED */ + +/* + * Protocol entry points. + */ +static void ChapInit (int); +static void ChapLowerUp (int); +static void ChapLowerDown (int); +static void ChapInput (int, u_char *, int); +static void ChapProtocolReject (int); +#if PPP_ADDITIONAL_CALLBACKS +static int ChapPrintPkt (u_char *, int, void (*) (void *, char *, ...), void *); +#endif + +struct protent chap_protent = { + PPP_CHAP, + ChapInit, + ChapInput, + ChapProtocolReject, + ChapLowerUp, + ChapLowerDown, + NULL, + NULL, +#if PPP_ADDITIONAL_CALLBACKS + ChapPrintPkt, + NULL, +#endif /* PPP_ADDITIONAL_CALLBACKS */ + 1, + "CHAP", +#if PPP_ADDITIONAL_CALLBACKS + NULL, + NULL, + NULL +#endif /* PPP_ADDITIONAL_CALLBACKS */ +}; + +chap_state chap[NUM_PPP]; /* CHAP state; one for each unit */ + +static void ChapChallengeTimeout (void *); +static void ChapResponseTimeout (void *); +static void ChapReceiveChallenge (chap_state *, u_char *, u_char, int); +static void ChapRechallenge (void *); +static void ChapReceiveResponse (chap_state *, u_char *, int, int); +static void ChapReceiveSuccess(chap_state *cstate, u_char *inp, u_char id, int len); +static void ChapReceiveFailure(chap_state *cstate, u_char *inp, u_char id, int len); +static void ChapSendStatus (chap_state *, int); +static void ChapSendChallenge (chap_state *); +static void ChapSendResponse (chap_state *); +static void ChapGenChallenge (chap_state *); + +/* + * ChapInit - Initialize a CHAP unit. + */ +static void +ChapInit(int unit) +{ + chap_state *cstate = &chap[unit]; + + BZERO(cstate, sizeof(*cstate)); + cstate->unit = unit; + cstate->clientstate = CHAPCS_INITIAL; + cstate->serverstate = CHAPSS_INITIAL; + cstate->timeouttime = CHAP_DEFTIMEOUT; + cstate->max_transmits = CHAP_DEFTRANSMITS; + /* random number generator is initialized in magic_init */ +} + + +/* + * ChapAuthWithPeer - Authenticate us with our peer (start client). + * + */ +void +ChapAuthWithPeer(int unit, char *our_name, u_char digest) +{ + chap_state *cstate = &chap[unit]; + + cstate->resp_name = our_name; + cstate->resp_type = digest; + + if (cstate->clientstate == CHAPCS_INITIAL || + cstate->clientstate == CHAPCS_PENDING) { + /* lower layer isn't up - wait until later */ + cstate->clientstate = CHAPCS_PENDING; + return; + } + + /* + * We get here as a result of LCP coming up. + * So even if CHAP was open before, we will + * have to re-authenticate ourselves. + */ + cstate->clientstate = CHAPCS_LISTEN; +} + + +/* + * ChapAuthPeer - Authenticate our peer (start server). + */ +void +ChapAuthPeer(int unit, char *our_name, u_char digest) +{ + chap_state *cstate = &chap[unit]; + + cstate->chal_name = our_name; + cstate->chal_type = digest; + + if (cstate->serverstate == CHAPSS_INITIAL || + cstate->serverstate == CHAPSS_PENDING) { + /* lower layer isn't up - wait until later */ + cstate->serverstate = CHAPSS_PENDING; + return; + } + + ChapGenChallenge(cstate); + ChapSendChallenge(cstate); /* crank it up dude! */ + cstate->serverstate = CHAPSS_INITIAL_CHAL; +} + + +/* + * ChapChallengeTimeout - Timeout expired on sending challenge. + */ +static void +ChapChallengeTimeout(void *arg) +{ + chap_state *cstate = (chap_state *) arg; + + /* if we aren't sending challenges, don't worry. then again we */ + /* probably shouldn't be here either */ + if (cstate->serverstate != CHAPSS_INITIAL_CHAL && + cstate->serverstate != CHAPSS_RECHALLENGE) { + return; + } + + if (cstate->chal_transmits >= cstate->max_transmits) { + /* give up on peer */ + CHAPDEBUG(LOG_ERR, ("Peer failed to respond to CHAP challenge\n")); + cstate->serverstate = CHAPSS_BADAUTH; + auth_peer_fail(cstate->unit, PPP_CHAP); + return; + } + + ChapSendChallenge(cstate); /* Re-send challenge */ +} + + +/* + * ChapResponseTimeout - Timeout expired on sending response. + */ +static void +ChapResponseTimeout(void *arg) +{ + chap_state *cstate = (chap_state *) arg; + + /* if we aren't sending a response, don't worry. */ + if (cstate->clientstate != CHAPCS_RESPONSE) { + return; + } + + ChapSendResponse(cstate); /* re-send response */ +} + + +/* + * ChapRechallenge - Time to challenge the peer again. + */ +static void +ChapRechallenge(void *arg) +{ + chap_state *cstate = (chap_state *) arg; + + /* if we aren't sending a response, don't worry. */ + if (cstate->serverstate != CHAPSS_OPEN) { + return; + } + + ChapGenChallenge(cstate); + ChapSendChallenge(cstate); + cstate->serverstate = CHAPSS_RECHALLENGE; +} + + +/* + * ChapLowerUp - The lower layer is up. + * + * Start up if we have pending requests. + */ +static void +ChapLowerUp(int unit) +{ + chap_state *cstate = &chap[unit]; + + if (cstate->clientstate == CHAPCS_INITIAL) { + cstate->clientstate = CHAPCS_CLOSED; + } else if (cstate->clientstate == CHAPCS_PENDING) { + cstate->clientstate = CHAPCS_LISTEN; + } + + if (cstate->serverstate == CHAPSS_INITIAL) { + cstate->serverstate = CHAPSS_CLOSED; + } else if (cstate->serverstate == CHAPSS_PENDING) { + ChapGenChallenge(cstate); + ChapSendChallenge(cstate); + cstate->serverstate = CHAPSS_INITIAL_CHAL; + } +} + + +/* + * ChapLowerDown - The lower layer is down. + * + * Cancel all timeouts. + */ +static void +ChapLowerDown(int unit) +{ + chap_state *cstate = &chap[unit]; + + /* Timeout(s) pending? Cancel if so. */ + if (cstate->serverstate == CHAPSS_INITIAL_CHAL || + cstate->serverstate == CHAPSS_RECHALLENGE) { + UNTIMEOUT(ChapChallengeTimeout, cstate); + } else if (cstate->serverstate == CHAPSS_OPEN + && cstate->chal_interval != 0) { + UNTIMEOUT(ChapRechallenge, cstate); + } + if (cstate->clientstate == CHAPCS_RESPONSE) { + UNTIMEOUT(ChapResponseTimeout, cstate); + } + cstate->clientstate = CHAPCS_INITIAL; + cstate->serverstate = CHAPSS_INITIAL; +} + + +/* + * ChapProtocolReject - Peer doesn't grok CHAP. + */ +static void +ChapProtocolReject(int unit) +{ + chap_state *cstate = &chap[unit]; + + if (cstate->serverstate != CHAPSS_INITIAL && + cstate->serverstate != CHAPSS_CLOSED) { + auth_peer_fail(unit, PPP_CHAP); + } + if (cstate->clientstate != CHAPCS_INITIAL && + cstate->clientstate != CHAPCS_CLOSED) { + auth_withpeer_fail(unit, PPP_CHAP); /* lwip: just sets the PPP error code on this unit to PPPERR_AUTHFAIL */ + } + ChapLowerDown(unit); /* shutdown chap */ +} + + +/* + * ChapInput - Input CHAP packet. + */ +static void +ChapInput(int unit, u_char *inpacket, int packet_len) +{ + chap_state *cstate = &chap[unit]; + u_char *inp; + u_char code, id; + int len; + + /* + * Parse header (code, id and length). + * If packet too short, drop it. + */ + inp = inpacket; + if (packet_len < CHAP_HEADERLEN) { + CHAPDEBUG(LOG_INFO, ("ChapInput: rcvd short header.\n")); + return; + } + GETCHAR(code, inp); + GETCHAR(id, inp); + GETSHORT(len, inp); + if (len < CHAP_HEADERLEN) { + CHAPDEBUG(LOG_INFO, ("ChapInput: rcvd illegal length.\n")); + return; + } + if (len > packet_len) { + CHAPDEBUG(LOG_INFO, ("ChapInput: rcvd short packet.\n")); + return; + } + len -= CHAP_HEADERLEN; + + /* + * Action depends on code (as in fact it usually does :-). + */ + switch (code) { + case CHAP_CHALLENGE: + ChapReceiveChallenge(cstate, inp, id, len); + break; + + case CHAP_RESPONSE: + ChapReceiveResponse(cstate, inp, id, len); + break; + + case CHAP_FAILURE: + ChapReceiveFailure(cstate, inp, id, len); + break; + + case CHAP_SUCCESS: + ChapReceiveSuccess(cstate, inp, id, len); + break; + + default: /* Need code reject? */ + CHAPDEBUG(LOG_WARNING, ("Unknown CHAP code (%d) received.\n", code)); + break; + } +} + + +/* + * ChapReceiveChallenge - Receive Challenge and send Response. + */ +static void +ChapReceiveChallenge(chap_state *cstate, u_char *inp, u_char id, int len) +{ + int rchallenge_len; + u_char *rchallenge; + int secret_len; + char secret[MAXSECRETLEN]; + char rhostname[256]; + MD5_CTX mdContext; + u_char hash[MD5_SIGNATURE_SIZE]; + + CHAPDEBUG(LOG_INFO, ("ChapReceiveChallenge: Rcvd id %d.\n", id)); + if (cstate->clientstate == CHAPCS_CLOSED || + cstate->clientstate == CHAPCS_PENDING) { + CHAPDEBUG(LOG_INFO, ("ChapReceiveChallenge: in state %d\n", + cstate->clientstate)); + return; + } + + if (len < 2) { + CHAPDEBUG(LOG_INFO, ("ChapReceiveChallenge: rcvd short packet.\n")); + return; + } + + GETCHAR(rchallenge_len, inp); + len -= sizeof (u_char) + rchallenge_len; /* now name field length */ + if (len < 0) { + CHAPDEBUG(LOG_INFO, ("ChapReceiveChallenge: rcvd short packet.\n")); + return; + } + rchallenge = inp; + INCPTR(rchallenge_len, inp); + + if (len >= (int)sizeof(rhostname)) { + len = sizeof(rhostname) - 1; + } + BCOPY(inp, rhostname, len); + rhostname[len] = '\000'; + + CHAPDEBUG(LOG_INFO, ("ChapReceiveChallenge: received name field '%s'\n", + rhostname)); + + /* Microsoft doesn't send their name back in the PPP packet */ + if (ppp_settings.remote_name[0] != 0 && (ppp_settings.explicit_remote || rhostname[0] == 0)) { + strncpy(rhostname, ppp_settings.remote_name, sizeof(rhostname)); + rhostname[sizeof(rhostname) - 1] = 0; + CHAPDEBUG(LOG_INFO, ("ChapReceiveChallenge: using '%s' as remote name\n", + rhostname)); + } + + /* get secret for authenticating ourselves with the specified host */ + if (!get_secret(cstate->unit, cstate->resp_name, rhostname, + secret, &secret_len, 0)) { + secret_len = 0; /* assume null secret if can't find one */ + CHAPDEBUG(LOG_WARNING, ("No CHAP secret found for authenticating us to %s\n", + rhostname)); + } + + /* cancel response send timeout if necessary */ + if (cstate->clientstate == CHAPCS_RESPONSE) { + UNTIMEOUT(ChapResponseTimeout, cstate); + } + + cstate->resp_id = id; + cstate->resp_transmits = 0; + + /* generate MD based on negotiated type */ + switch (cstate->resp_type) { + + case CHAP_DIGEST_MD5: + MD5Init(&mdContext); + MD5Update(&mdContext, &cstate->resp_id, 1); + MD5Update(&mdContext, (u_char*)secret, secret_len); + MD5Update(&mdContext, rchallenge, rchallenge_len); + MD5Final(hash, &mdContext); + BCOPY(hash, cstate->response, MD5_SIGNATURE_SIZE); + cstate->resp_length = MD5_SIGNATURE_SIZE; + break; + +#if MSCHAP_SUPPORT + case CHAP_MICROSOFT: + ChapMS(cstate, rchallenge, rchallenge_len, secret, secret_len); + break; +#endif + + default: + CHAPDEBUG(LOG_INFO, ("unknown digest type %d\n", cstate->resp_type)); + return; + } + + BZERO(secret, sizeof(secret)); + ChapSendResponse(cstate); +} + + +/* + * ChapReceiveResponse - Receive and process response. + */ +static void +ChapReceiveResponse(chap_state *cstate, u_char *inp, int id, int len) +{ + u_char *remmd, remmd_len; + int secret_len, old_state; + int code; + char rhostname[256]; + MD5_CTX mdContext; + char secret[MAXSECRETLEN]; + u_char hash[MD5_SIGNATURE_SIZE]; + + CHAPDEBUG(LOG_INFO, ("ChapReceiveResponse: Rcvd id %d.\n", id)); + + if (cstate->serverstate == CHAPSS_CLOSED || + cstate->serverstate == CHAPSS_PENDING) { + CHAPDEBUG(LOG_INFO, ("ChapReceiveResponse: in state %d\n", + cstate->serverstate)); + return; + } + + if (id != cstate->chal_id) { + return; /* doesn't match ID of last challenge */ + } + + /* + * If we have received a duplicate or bogus Response, + * we have to send the same answer (Success/Failure) + * as we did for the first Response we saw. + */ + if (cstate->serverstate == CHAPSS_OPEN) { + ChapSendStatus(cstate, CHAP_SUCCESS); + return; + } + if (cstate->serverstate == CHAPSS_BADAUTH) { + ChapSendStatus(cstate, CHAP_FAILURE); + return; + } + + if (len < 2) { + CHAPDEBUG(LOG_INFO, ("ChapReceiveResponse: rcvd short packet.\n")); + return; + } + GETCHAR(remmd_len, inp); /* get length of MD */ + remmd = inp; /* get pointer to MD */ + INCPTR(remmd_len, inp); + + len -= sizeof (u_char) + remmd_len; + if (len < 0) { + CHAPDEBUG(LOG_INFO, ("ChapReceiveResponse: rcvd short packet.\n")); + return; + } + + UNTIMEOUT(ChapChallengeTimeout, cstate); + + if (len >= (int)sizeof(rhostname)) { + len = sizeof(rhostname) - 1; + } + BCOPY(inp, rhostname, len); + rhostname[len] = '\000'; + + CHAPDEBUG(LOG_INFO, ("ChapReceiveResponse: received name field: %s\n", + rhostname)); + + /* + * Get secret for authenticating them with us, + * do the hash ourselves, and compare the result. + */ + code = CHAP_FAILURE; + if (!get_secret(cstate->unit, rhostname, cstate->chal_name, + secret, &secret_len, 1)) { + CHAPDEBUG(LOG_WARNING, ("No CHAP secret found for authenticating %s\n", + rhostname)); + } else { + /* generate MD based on negotiated type */ + switch (cstate->chal_type) { + + case CHAP_DIGEST_MD5: /* only MD5 is defined for now */ + if (remmd_len != MD5_SIGNATURE_SIZE) { + break; /* it's not even the right length */ + } + MD5Init(&mdContext); + MD5Update(&mdContext, &cstate->chal_id, 1); + MD5Update(&mdContext, (u_char*)secret, secret_len); + MD5Update(&mdContext, cstate->challenge, cstate->chal_len); + MD5Final(hash, &mdContext); + + /* compare local and remote MDs and send the appropriate status */ + if (memcmp (hash, remmd, MD5_SIGNATURE_SIZE) == 0) { + code = CHAP_SUCCESS; /* they are the same! */ + } + break; + + default: + CHAPDEBUG(LOG_INFO, ("unknown digest type %d\n", cstate->chal_type)); + } + } + + BZERO(secret, sizeof(secret)); + ChapSendStatus(cstate, code); + + if (code == CHAP_SUCCESS) { + old_state = cstate->serverstate; + cstate->serverstate = CHAPSS_OPEN; + if (old_state == CHAPSS_INITIAL_CHAL) { + auth_peer_success(cstate->unit, PPP_CHAP, rhostname, len); + } + if (cstate->chal_interval != 0) { + TIMEOUT(ChapRechallenge, cstate, cstate->chal_interval); + } + } else { + CHAPDEBUG(LOG_ERR, ("CHAP peer authentication failed\n")); + cstate->serverstate = CHAPSS_BADAUTH; + auth_peer_fail(cstate->unit, PPP_CHAP); + } +} + +/* + * ChapReceiveSuccess - Receive Success + */ +static void +ChapReceiveSuccess(chap_state *cstate, u_char *inp, u_char id, int len) +{ + LWIP_UNUSED_ARG(id); + LWIP_UNUSED_ARG(inp); + + CHAPDEBUG(LOG_INFO, ("ChapReceiveSuccess: Rcvd id %d.\n", id)); + + if (cstate->clientstate == CHAPCS_OPEN) { + /* presumably an answer to a duplicate response */ + return; + } + + if (cstate->clientstate != CHAPCS_RESPONSE) { + /* don't know what this is */ + CHAPDEBUG(LOG_INFO, ("ChapReceiveSuccess: in state %d\n", + cstate->clientstate)); + return; + } + + UNTIMEOUT(ChapResponseTimeout, cstate); + + /* + * Print message. + */ + if (len > 0) { + PRINTMSG(inp, len); + } + + cstate->clientstate = CHAPCS_OPEN; + + auth_withpeer_success(cstate->unit, PPP_CHAP); +} + + +/* + * ChapReceiveFailure - Receive failure. + */ +static void +ChapReceiveFailure(chap_state *cstate, u_char *inp, u_char id, int len) +{ + LWIP_UNUSED_ARG(id); + LWIP_UNUSED_ARG(inp); + + CHAPDEBUG(LOG_INFO, ("ChapReceiveFailure: Rcvd id %d.\n", id)); + + if (cstate->clientstate != CHAPCS_RESPONSE) { + /* don't know what this is */ + CHAPDEBUG(LOG_INFO, ("ChapReceiveFailure: in state %d\n", + cstate->clientstate)); + return; + } + + UNTIMEOUT(ChapResponseTimeout, cstate); + + /* + * Print message. + */ + if (len > 0) { + PRINTMSG(inp, len); + } + + CHAPDEBUG(LOG_ERR, ("CHAP authentication failed\n")); + auth_withpeer_fail(cstate->unit, PPP_CHAP); /* lwip: just sets the PPP error code on this unit to PPPERR_AUTHFAIL */ +} + + +/* + * ChapSendChallenge - Send an Authenticate challenge. + */ +static void +ChapSendChallenge(chap_state *cstate) +{ + u_char *outp; + int chal_len, name_len; + int outlen; + + chal_len = cstate->chal_len; + name_len = (int)strlen(cstate->chal_name); + outlen = CHAP_HEADERLEN + sizeof (u_char) + chal_len + name_len; + outp = outpacket_buf[cstate->unit]; + + MAKEHEADER(outp, PPP_CHAP); /* paste in a CHAP header */ + + PUTCHAR(CHAP_CHALLENGE, outp); + PUTCHAR(cstate->chal_id, outp); + PUTSHORT(outlen, outp); + + PUTCHAR(chal_len, outp); /* put length of challenge */ + BCOPY(cstate->challenge, outp, chal_len); + INCPTR(chal_len, outp); + + BCOPY(cstate->chal_name, outp, name_len); /* append hostname */ + + pppWrite(cstate->unit, outpacket_buf[cstate->unit], outlen + PPP_HDRLEN); + + CHAPDEBUG(LOG_INFO, ("ChapSendChallenge: Sent id %d.\n", cstate->chal_id)); + + TIMEOUT(ChapChallengeTimeout, cstate, cstate->timeouttime); + ++cstate->chal_transmits; +} + + +/* + * ChapSendStatus - Send a status response (ack or nak). + */ +static void +ChapSendStatus(chap_state *cstate, int code) +{ + u_char *outp; + int outlen, msglen; + char msg[256]; /* @todo: this can be a char*, no strcpy needed */ + + if (code == CHAP_SUCCESS) { + strcpy(msg, "Welcome!"); + } else { + strcpy(msg, "I don't like you. Go 'way."); + } + msglen = (int)strlen(msg); + + outlen = CHAP_HEADERLEN + msglen; + outp = outpacket_buf[cstate->unit]; + + MAKEHEADER(outp, PPP_CHAP); /* paste in a header */ + + PUTCHAR(code, outp); + PUTCHAR(cstate->chal_id, outp); + PUTSHORT(outlen, outp); + BCOPY(msg, outp, msglen); + pppWrite(cstate->unit, outpacket_buf[cstate->unit], outlen + PPP_HDRLEN); + + CHAPDEBUG(LOG_INFO, ("ChapSendStatus: Sent code %d, id %d.\n", code, + cstate->chal_id)); +} + +/* + * ChapGenChallenge is used to generate a pseudo-random challenge string of + * a pseudo-random length between min_len and max_len. The challenge + * string and its length are stored in *cstate, and various other fields of + * *cstate are initialized. + */ + +static void +ChapGenChallenge(chap_state *cstate) +{ + int chal_len; + u_char *ptr = cstate->challenge; + int i; + + /* pick a random challenge length between MIN_CHALLENGE_LENGTH and + MAX_CHALLENGE_LENGTH */ + chal_len = (unsigned) + ((((magic() >> 16) * + (MAX_CHALLENGE_LENGTH - MIN_CHALLENGE_LENGTH)) >> 16) + + MIN_CHALLENGE_LENGTH); + LWIP_ASSERT("chal_len <= 0xff", chal_len <= 0xffff); + cstate->chal_len = (u_char)chal_len; + cstate->chal_id = ++cstate->id; + cstate->chal_transmits = 0; + + /* generate a random string */ + for (i = 0; i < chal_len; i++ ) { + *ptr++ = (char) (magic() & 0xff); + } +} + +/* + * ChapSendResponse - send a response packet with values as specified + * in *cstate. + */ +/* ARGSUSED */ +static void +ChapSendResponse(chap_state *cstate) +{ + u_char *outp; + int outlen, md_len, name_len; + + md_len = cstate->resp_length; + name_len = (int)strlen(cstate->resp_name); + outlen = CHAP_HEADERLEN + sizeof (u_char) + md_len + name_len; + outp = outpacket_buf[cstate->unit]; + + MAKEHEADER(outp, PPP_CHAP); + + PUTCHAR(CHAP_RESPONSE, outp); /* we are a response */ + PUTCHAR(cstate->resp_id, outp); /* copy id from challenge packet */ + PUTSHORT(outlen, outp); /* packet length */ + + PUTCHAR(md_len, outp); /* length of MD */ + BCOPY(cstate->response, outp, md_len); /* copy MD to buffer */ + INCPTR(md_len, outp); + + BCOPY(cstate->resp_name, outp, name_len); /* append our name */ + + /* send the packet */ + pppWrite(cstate->unit, outpacket_buf[cstate->unit], outlen + PPP_HDRLEN); + + cstate->clientstate = CHAPCS_RESPONSE; + TIMEOUT(ChapResponseTimeout, cstate, cstate->timeouttime); + ++cstate->resp_transmits; +} + +#if PPP_ADDITIONAL_CALLBACKS +static char *ChapCodenames[] = { + "Challenge", "Response", "Success", "Failure" +}; +/* + * ChapPrintPkt - print the contents of a CHAP packet. + */ +static int +ChapPrintPkt( u_char *p, int plen, void (*printer) (void *, char *, ...), void *arg) +{ + int code, id, len; + int clen, nlen; + u_char x; + + if (plen < CHAP_HEADERLEN) { + return 0; + } + GETCHAR(code, p); + GETCHAR(id, p); + GETSHORT(len, p); + if (len < CHAP_HEADERLEN || len > plen) { + return 0; + } + + if (code >= 1 && code <= sizeof(ChapCodenames) / sizeof(char *)) { + printer(arg, " %s", ChapCodenames[code-1]); + } else { + printer(arg, " code=0x%x", code); + } + printer(arg, " id=0x%x", id); + len -= CHAP_HEADERLEN; + switch (code) { + case CHAP_CHALLENGE: + case CHAP_RESPONSE: + if (len < 1) { + break; + } + clen = p[0]; + if (len < clen + 1) { + break; + } + ++p; + nlen = len - clen - 1; + printer(arg, " <"); + for (; clen > 0; --clen) { + GETCHAR(x, p); + printer(arg, "%.2x", x); + } + printer(arg, ">, name = %.*Z", nlen, p); + break; + case CHAP_FAILURE: + case CHAP_SUCCESS: + printer(arg, " %.*Z", len, p); + break; + default: + for (clen = len; clen > 0; --clen) { + GETCHAR(x, p); + printer(arg, " %.2x", x); + } + } + + return len + CHAP_HEADERLEN; +} +#endif /* PPP_ADDITIONAL_CALLBACKS */ + +#endif /* CHAP_SUPPORT */ + +#endif /* PPP_SUPPORT */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/chap.h b/third_party/lwip-1.4.1/src/netif/ppp/chap.h new file mode 100644 index 0000000..9591c95 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/chap.h @@ -0,0 +1,150 @@ +/***************************************************************************** +* chap.h - Network Challenge Handshake Authentication Protocol header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1998 Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-12-03 Guy Lancaster , Global Election Systems Inc. +* Original built from BSD network code. +******************************************************************************/ +/* + * chap.h - Challenge Handshake Authentication Protocol definitions. + * + * Copyright (c) 1993 The Australian National University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the Australian National University. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Copyright (c) 1991 Gregory M. Christy + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the author. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * $Id: chap.h,v 1.6 2010/01/24 13:19:34 goldsimon Exp $ + */ + +#ifndef CHAP_H +#define CHAP_H + +/* Code + ID + length */ +#define CHAP_HEADERLEN 4 + +/* + * CHAP codes. + */ + +#define CHAP_DIGEST_MD5 5 /* use MD5 algorithm */ +#define MD5_SIGNATURE_SIZE 16 /* 16 bytes in a MD5 message digest */ +#define CHAP_MICROSOFT 0x80 /* use Microsoft-compatible alg. */ +#define MS_CHAP_RESPONSE_LEN 49 /* Response length for MS-CHAP */ + +#define CHAP_CHALLENGE 1 +#define CHAP_RESPONSE 2 +#define CHAP_SUCCESS 3 +#define CHAP_FAILURE 4 + +/* + * Challenge lengths (for challenges we send) and other limits. + */ +#define MIN_CHALLENGE_LENGTH 32 +#define MAX_CHALLENGE_LENGTH 64 +#define MAX_RESPONSE_LENGTH 64 /* sufficient for MD5 or MS-CHAP */ + +/* + * Each interface is described by a chap structure. + */ + +typedef struct chap_state { + int unit; /* Interface unit number */ + int clientstate; /* Client state */ + int serverstate; /* Server state */ + u_char challenge[MAX_CHALLENGE_LENGTH]; /* last challenge string sent */ + u_char chal_len; /* challenge length */ + u_char chal_id; /* ID of last challenge */ + u_char chal_type; /* hash algorithm for challenges */ + u_char id; /* Current id */ + char *chal_name; /* Our name to use with challenge */ + int chal_interval; /* Time until we challenge peer again */ + int timeouttime; /* Timeout time in seconds */ + int max_transmits; /* Maximum # of challenge transmissions */ + int chal_transmits; /* Number of transmissions of challenge */ + int resp_transmits; /* Number of transmissions of response */ + u_char response[MAX_RESPONSE_LENGTH]; /* Response to send */ + u_char resp_length; /* length of response */ + u_char resp_id; /* ID for response messages */ + u_char resp_type; /* hash algorithm for responses */ + char *resp_name; /* Our name to send with response */ +} chap_state; + + +/* + * Client (peer) states. + */ +#define CHAPCS_INITIAL 0 /* Lower layer down, not opened */ +#define CHAPCS_CLOSED 1 /* Lower layer up, not opened */ +#define CHAPCS_PENDING 2 /* Auth us to peer when lower up */ +#define CHAPCS_LISTEN 3 /* Listening for a challenge */ +#define CHAPCS_RESPONSE 4 /* Sent response, waiting for status */ +#define CHAPCS_OPEN 5 /* We've received Success */ + +/* + * Server (authenticator) states. + */ +#define CHAPSS_INITIAL 0 /* Lower layer down, not opened */ +#define CHAPSS_CLOSED 1 /* Lower layer up, not opened */ +#define CHAPSS_PENDING 2 /* Auth peer when lower up */ +#define CHAPSS_INITIAL_CHAL 3 /* We've sent the first challenge */ +#define CHAPSS_OPEN 4 /* We've sent a Success msg */ +#define CHAPSS_RECHALLENGE 5 /* We've sent another challenge */ +#define CHAPSS_BADAUTH 6 /* We've sent a Failure msg */ + +extern chap_state chap[]; + +void ChapAuthWithPeer (int, char *, u_char); +void ChapAuthPeer (int, char *, u_char); + +extern struct protent chap_protent; + +#endif /* CHAP_H */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/chpms.c b/third_party/lwip-1.4.1/src/netif/ppp/chpms.c new file mode 100644 index 0000000..d039f05 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/chpms.c @@ -0,0 +1,396 @@ +/*** WARNING - THIS CODE HAS NOT BEEN FINISHED! ***/ +/*** The original PPPD code is written in a way to require either the UNIX DES + encryption functions encrypt(3) and setkey(3) or the DES library libdes. + Since both is not included in lwIP, MSCHAP currently does not work! */ +/***************************************************************************** +* chpms.c - Network MicroSoft Challenge Handshake Authentication Protocol program file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* Copyright (c) 1997 by Global Election Systems Inc. All rights reserved. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-12-08 Guy Lancaster , Global Election Systems Inc. +* Original based on BSD chap_ms.c. +*****************************************************************************/ +/* + * chap_ms.c - Microsoft MS-CHAP compatible implementation. + * + * Copyright (c) 1995 Eric Rosenquist, Strata Software Limited. + * http://www.strataware.com/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Eric Rosenquist. The name of the author may not be used to + * endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * Modifications by Lauri Pesonen / lpesonen@clinet.fi, april 1997 + * + * Implemented LANManager type password response to MS-CHAP challenges. + * Now pppd provides both NT style and LANMan style blocks, and the + * prefered is set by option "ms-lanman". Default is to use NT. + * The hash text (StdText) was taken from Win95 RASAPI32.DLL. + * + * You should also use DOMAIN\\USERNAME as described in README.MSCHAP80 + */ + +#define USE_CRYPT + +#include "lwip/opt.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#if MSCHAP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#include "ppp_impl.h" +#include "pppdebug.h" + +#include "md4.h" +#ifndef USE_CRYPT +#include "des.h" +#endif +#include "chap.h" +#include "chpms.h" + +#include + + +/*************************/ +/*** LOCAL DEFINITIONS ***/ +/*************************/ + + +/************************/ +/*** LOCAL DATA TYPES ***/ +/************************/ +typedef struct { + u_char LANManResp[24]; + u_char NTResp[24]; + u_char UseNT; /* If 1, ignore the LANMan response field */ +} MS_ChapResponse; +/* We use MS_CHAP_RESPONSE_LEN, rather than sizeof(MS_ChapResponse), + in case this struct gets padded. */ + + + +/***********************************/ +/*** LOCAL FUNCTION DECLARATIONS ***/ +/***********************************/ + +/* XXX Don't know what to do with these. */ +extern void setkey(const char *); +extern void encrypt(char *, int); + +static void DesEncrypt (u_char *, u_char *, u_char *); +static void MakeKey (u_char *, u_char *); + +#ifdef USE_CRYPT +static void Expand (u_char *, u_char *); +static void Collapse (u_char *, u_char *); +#endif + +static void ChallengeResponse( + u_char *challenge, /* IN 8 octets */ + u_char *pwHash, /* IN 16 octets */ + u_char *response /* OUT 24 octets */ +); +static void ChapMS_NT( + char *rchallenge, + int rchallenge_len, + char *secret, + int secret_len, + MS_ChapResponse *response +); +static u_char Get7Bits( + u_char *input, + int startBit +); + +static void +ChallengeResponse( u_char *challenge, /* IN 8 octets */ + u_char *pwHash, /* IN 16 octets */ + u_char *response /* OUT 24 octets */) +{ + u_char ZPasswordHash[21]; + + BZERO(ZPasswordHash, sizeof(ZPasswordHash)); + BCOPY(pwHash, ZPasswordHash, 16); + +#if 0 + log_packet(ZPasswordHash, sizeof(ZPasswordHash), "ChallengeResponse - ZPasswordHash", LOG_DEBUG); +#endif + + DesEncrypt(challenge, ZPasswordHash + 0, response + 0); + DesEncrypt(challenge, ZPasswordHash + 7, response + 8); + DesEncrypt(challenge, ZPasswordHash + 14, response + 16); + +#if 0 + log_packet(response, 24, "ChallengeResponse - response", LOG_DEBUG); +#endif +} + + +#ifdef USE_CRYPT +static void +DesEncrypt( u_char *clear, /* IN 8 octets */ + u_char *key, /* IN 7 octets */ + u_char *cipher /* OUT 8 octets */) +{ + u_char des_key[8]; + u_char crypt_key[66]; + u_char des_input[66]; + + MakeKey(key, des_key); + + Expand(des_key, crypt_key); + setkey((char*)crypt_key); + +#if 0 + CHAPDEBUG(LOG_INFO, ("DesEncrypt: 8 octet input : %02X%02X%02X%02X%02X%02X%02X%02X\n", + clear[0], clear[1], clear[2], clear[3], clear[4], clear[5], clear[6], clear[7])); +#endif + + Expand(clear, des_input); + encrypt((char*)des_input, 0); + Collapse(des_input, cipher); + +#if 0 + CHAPDEBUG(LOG_INFO, ("DesEncrypt: 8 octet output: %02X%02X%02X%02X%02X%02X%02X%02X\n", + cipher[0], cipher[1], cipher[2], cipher[3], cipher[4], cipher[5], cipher[6], cipher[7])); +#endif +} + +#else /* USE_CRYPT */ + +static void +DesEncrypt( u_char *clear, /* IN 8 octets */ + u_char *key, /* IN 7 octets */ + u_char *cipher /* OUT 8 octets */) +{ + des_cblock des_key; + des_key_schedule key_schedule; + + MakeKey(key, des_key); + + des_set_key(&des_key, key_schedule); + +#if 0 + CHAPDEBUG(LOG_INFO, ("DesEncrypt: 8 octet input : %02X%02X%02X%02X%02X%02X%02X%02X\n", + clear[0], clear[1], clear[2], clear[3], clear[4], clear[5], clear[6], clear[7])); +#endif + + des_ecb_encrypt((des_cblock *)clear, (des_cblock *)cipher, key_schedule, 1); + +#if 0 + CHAPDEBUG(LOG_INFO, ("DesEncrypt: 8 octet output: %02X%02X%02X%02X%02X%02X%02X%02X\n", + cipher[0], cipher[1], cipher[2], cipher[3], cipher[4], cipher[5], cipher[6], cipher[7])); +#endif +} + +#endif /* USE_CRYPT */ + + +static u_char +Get7Bits( u_char *input, int startBit) +{ + register unsigned int word; + + word = (unsigned)input[startBit / 8] << 8; + word |= (unsigned)input[startBit / 8 + 1]; + + word >>= 15 - (startBit % 8 + 7); + + return word & 0xFE; +} + +#ifdef USE_CRYPT + +/* in == 8-byte string (expanded version of the 56-bit key) + * out == 64-byte string where each byte is either 1 or 0 + * Note that the low-order "bit" is always ignored by by setkey() + */ +static void +Expand(u_char *in, u_char *out) +{ + int j, c; + int i; + + for(i = 0; i < 64; in++){ + c = *in; + for(j = 7; j >= 0; j--) { + *out++ = (c >> j) & 01; + } + i += 8; + } +} + +/* The inverse of Expand + */ +static void +Collapse(u_char *in, u_char *out) +{ + int j; + int i; + unsigned int c; + + for (i = 0; i < 64; i += 8, out++) { + c = 0; + for (j = 7; j >= 0; j--, in++) { + c |= *in << j; + } + *out = c & 0xff; + } +} +#endif + +static void +MakeKey( u_char *key, /* IN 56 bit DES key missing parity bits */ + u_char *des_key /* OUT 64 bit DES key with parity bits added */) +{ + des_key[0] = Get7Bits(key, 0); + des_key[1] = Get7Bits(key, 7); + des_key[2] = Get7Bits(key, 14); + des_key[3] = Get7Bits(key, 21); + des_key[4] = Get7Bits(key, 28); + des_key[5] = Get7Bits(key, 35); + des_key[6] = Get7Bits(key, 42); + des_key[7] = Get7Bits(key, 49); + +#ifndef USE_CRYPT + des_set_odd_parity((des_cblock *)des_key); +#endif + +#if 0 + CHAPDEBUG(LOG_INFO, ("MakeKey: 56-bit input : %02X%02X%02X%02X%02X%02X%02X\n", + key[0], key[1], key[2], key[3], key[4], key[5], key[6])); + CHAPDEBUG(LOG_INFO, ("MakeKey: 64-bit output: %02X%02X%02X%02X%02X%02X%02X%02X\n", + des_key[0], des_key[1], des_key[2], des_key[3], des_key[4], des_key[5], des_key[6], des_key[7])); +#endif +} + +static void +ChapMS_NT( char *rchallenge, + int rchallenge_len, + char *secret, + int secret_len, + MS_ChapResponse *response) +{ + int i; + MDstruct md4Context; + u_char unicodePassword[MAX_NT_PASSWORD * 2]; + static int low_byte_first = -1; + + LWIP_UNUSED_ARG(rchallenge_len); + + /* Initialize the Unicode version of the secret (== password). */ + /* This implicitly supports 8-bit ISO8859/1 characters. */ + BZERO(unicodePassword, sizeof(unicodePassword)); + for (i = 0; i < secret_len; i++) { + unicodePassword[i * 2] = (u_char)secret[i]; + } + MDbegin(&md4Context); + MDupdate(&md4Context, unicodePassword, secret_len * 2 * 8); /* Unicode is 2 bytes/char, *8 for bit count */ + + if (low_byte_first == -1) { + low_byte_first = (PP_HTONS((unsigned short int)1) != 1); + } + if (low_byte_first == 0) { + /* @todo: arg type - u_long* or u_int* ? */ + MDreverse((unsigned int*)&md4Context); /* sfb 961105 */ + } + + MDupdate(&md4Context, NULL, 0); /* Tell MD4 we're done */ + + ChallengeResponse((u_char*)rchallenge, (u_char*)md4Context.buffer, response->NTResp); +} + +#ifdef MSLANMAN +static u_char *StdText = (u_char *)"KGS!@#$%"; /* key from rasapi32.dll */ + +static void +ChapMS_LANMan( char *rchallenge, + int rchallenge_len, + char *secret, + int secret_len, + MS_ChapResponse *response) +{ + int i; + u_char UcasePassword[MAX_NT_PASSWORD]; /* max is actually 14 */ + u_char PasswordHash[16]; + + /* LANMan password is case insensitive */ + BZERO(UcasePassword, sizeof(UcasePassword)); + for (i = 0; i < secret_len; i++) { + UcasePassword[i] = (u_char)toupper(secret[i]); + } + DesEncrypt( StdText, UcasePassword + 0, PasswordHash + 0 ); + DesEncrypt( StdText, UcasePassword + 7, PasswordHash + 8 ); + ChallengeResponse(rchallenge, PasswordHash, response->LANManResp); +} +#endif + +void +ChapMS( chap_state *cstate, char *rchallenge, int rchallenge_len, char *secret, int secret_len) +{ + MS_ChapResponse response; +#ifdef MSLANMAN + extern int ms_lanman; +#endif + +#if 0 + CHAPDEBUG(LOG_INFO, ("ChapMS: secret is '%.*s'\n", secret_len, secret)); +#endif + BZERO(&response, sizeof(response)); + + /* Calculate both always */ + ChapMS_NT(rchallenge, rchallenge_len, secret, secret_len, &response); + +#ifdef MSLANMAN + ChapMS_LANMan(rchallenge, rchallenge_len, secret, secret_len, &response); + + /* prefered method is set by option */ + response.UseNT = !ms_lanman; +#else + response.UseNT = 1; +#endif + + BCOPY(&response, cstate->response, MS_CHAP_RESPONSE_LEN); + cstate->resp_length = MS_CHAP_RESPONSE_LEN; +} + +#endif /* MSCHAP_SUPPORT */ + +#endif /* PPP_SUPPORT */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/chpms.h b/third_party/lwip-1.4.1/src/netif/ppp/chpms.h new file mode 100644 index 0000000..f023cce --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/chpms.h @@ -0,0 +1,64 @@ +/***************************************************************************** +* chpms.h - Network Microsoft Challenge Handshake Protocol header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1998 Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 98-01-30 Guy Lancaster , Global Election Systems Inc. +* Original built from BSD network code. +******************************************************************************/ +/* + * chap.h - Challenge Handshake Authentication Protocol definitions. + * + * Copyright (c) 1995 Eric Rosenquist, Strata Software Limited. + * http://www.strataware.com/ + * + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Eric Rosenquist. The name of the author may not be used to + * endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * $Id: chpms.h,v 1.5 2007/12/19 20:47:23 fbernon Exp $ + */ + +#ifndef CHPMS_H +#define CHPMS_H + +#define MAX_NT_PASSWORD 256 /* Maximum number of (Unicode) chars in an NT password */ + +void ChapMS (chap_state *, char *, int, char *, int); + +#endif /* CHPMS_H */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/fsm.c b/third_party/lwip-1.4.1/src/netif/ppp/fsm.c new file mode 100644 index 0000000..49d0154 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/fsm.c @@ -0,0 +1,890 @@ +/***************************************************************************** +* fsm.c - Network Control Protocol Finite State Machine program file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 by Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-12-01 Guy Lancaster , Global Election Systems Inc. +* Original based on BSD fsm.c. +*****************************************************************************/ +/* + * fsm.c - {Link, IP} Control Protocol Finite State Machine. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* + * TODO: + * Randomize fsm id on link/init. + * Deal with variable outgoing MTU. + */ + +#include "lwip/opt.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#include "ppp_impl.h" +#include "pppdebug.h" + +#include "fsm.h" + +#include + +#if PPP_DEBUG +static const char *ppperr_strerr[] = { + "LS_INITIAL", /* LS_INITIAL 0 */ + "LS_STARTING", /* LS_STARTING 1 */ + "LS_CLOSED", /* LS_CLOSED 2 */ + "LS_STOPPED", /* LS_STOPPED 3 */ + "LS_CLOSING", /* LS_CLOSING 4 */ + "LS_STOPPING", /* LS_STOPPING 5 */ + "LS_REQSENT", /* LS_REQSENT 6 */ + "LS_ACKRCVD", /* LS_ACKRCVD 7 */ + "LS_ACKSENT", /* LS_ACKSENT 8 */ + "LS_OPENED" /* LS_OPENED 9 */ +}; +#endif /* PPP_DEBUG */ + +static void fsm_timeout (void *); +static void fsm_rconfreq (fsm *, u_char, u_char *, int); +static void fsm_rconfack (fsm *, int, u_char *, int); +static void fsm_rconfnakrej (fsm *, int, int, u_char *, int); +static void fsm_rtermreq (fsm *, int, u_char *, int); +static void fsm_rtermack (fsm *); +static void fsm_rcoderej (fsm *, u_char *, int); +static void fsm_sconfreq (fsm *, int); + +#define PROTO_NAME(f) ((f)->callbacks->proto_name) + +int peer_mru[NUM_PPP]; + + +/* + * fsm_init - Initialize fsm. + * + * Initialize fsm state. + */ +void +fsm_init(fsm *f) +{ + f->state = LS_INITIAL; + f->flags = 0; + f->id = 0; /* XXX Start with random id? */ + f->timeouttime = FSM_DEFTIMEOUT; + f->maxconfreqtransmits = FSM_DEFMAXCONFREQS; + f->maxtermtransmits = FSM_DEFMAXTERMREQS; + f->maxnakloops = FSM_DEFMAXNAKLOOPS; + f->term_reason_len = 0; +} + + +/* + * fsm_lowerup - The lower layer is up. + */ +void +fsm_lowerup(fsm *f) +{ + int oldState = f->state; + + LWIP_UNUSED_ARG(oldState); + + switch( f->state ) { + case LS_INITIAL: + f->state = LS_CLOSED; + break; + + case LS_STARTING: + if( f->flags & OPT_SILENT ) { + f->state = LS_STOPPED; + } else { + /* Send an initial configure-request */ + fsm_sconfreq(f, 0); + f->state = LS_REQSENT; + } + break; + + default: + FSMDEBUG(LOG_INFO, ("%s: Up event in state %d (%s)!\n", + PROTO_NAME(f), f->state, ppperr_strerr[f->state])); + } + + FSMDEBUG(LOG_INFO, ("%s: lowerup state %d (%s) -> %d (%s)\n", + PROTO_NAME(f), oldState, ppperr_strerr[oldState], f->state, ppperr_strerr[f->state])); +} + + +/* + * fsm_lowerdown - The lower layer is down. + * + * Cancel all timeouts and inform upper layers. + */ +void +fsm_lowerdown(fsm *f) +{ + int oldState = f->state; + + LWIP_UNUSED_ARG(oldState); + + switch( f->state ) { + case LS_CLOSED: + f->state = LS_INITIAL; + break; + + case LS_STOPPED: + f->state = LS_STARTING; + if( f->callbacks->starting ) { + (*f->callbacks->starting)(f); + } + break; + + case LS_CLOSING: + f->state = LS_INITIAL; + UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ + break; + + case LS_STOPPING: + case LS_REQSENT: + case LS_ACKRCVD: + case LS_ACKSENT: + f->state = LS_STARTING; + UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ + break; + + case LS_OPENED: + if( f->callbacks->down ) { + (*f->callbacks->down)(f); + } + f->state = LS_STARTING; + break; + + default: + FSMDEBUG(LOG_INFO, ("%s: Down event in state %d (%s)!\n", + PROTO_NAME(f), f->state, ppperr_strerr[f->state])); + } + + FSMDEBUG(LOG_INFO, ("%s: lowerdown state %d (%s) -> %d (%s)\n", + PROTO_NAME(f), oldState, ppperr_strerr[oldState], f->state, ppperr_strerr[f->state])); +} + + +/* + * fsm_open - Link is allowed to come up. + */ +void +fsm_open(fsm *f) +{ + int oldState = f->state; + + LWIP_UNUSED_ARG(oldState); + + switch( f->state ) { + case LS_INITIAL: + f->state = LS_STARTING; + if( f->callbacks->starting ) { + (*f->callbacks->starting)(f); + } + break; + + case LS_CLOSED: + if( f->flags & OPT_SILENT ) { + f->state = LS_STOPPED; + } else { + /* Send an initial configure-request */ + fsm_sconfreq(f, 0); + f->state = LS_REQSENT; + } + break; + + case LS_CLOSING: + f->state = LS_STOPPING; + /* fall through */ + case LS_STOPPED: + case LS_OPENED: + if( f->flags & OPT_RESTART ) { + fsm_lowerdown(f); + fsm_lowerup(f); + } + break; + } + + FSMDEBUG(LOG_INFO, ("%s: open state %d (%s) -> %d (%s)\n", + PROTO_NAME(f), oldState, ppperr_strerr[oldState], f->state, ppperr_strerr[f->state])); +} + +#if 0 /* backport pppd 2.4.4b1; */ +/* + * terminate_layer - Start process of shutting down the FSM + * + * Cancel any timeout running, notify upper layers we're done, and + * send a terminate-request message as configured. + */ +static void +terminate_layer(fsm *f, int nextstate) +{ + /* @todo */ +} +#endif + +/* + * fsm_close - Start closing connection. + * + * Cancel timeouts and either initiate close or possibly go directly to + * the LS_CLOSED state. + */ +void +fsm_close(fsm *f, char *reason) +{ + int oldState = f->state; + + LWIP_UNUSED_ARG(oldState); + + f->term_reason = reason; + f->term_reason_len = (reason == NULL ? 0 : (int)strlen(reason)); + switch( f->state ) { + case LS_STARTING: + f->state = LS_INITIAL; + break; + case LS_STOPPED: + f->state = LS_CLOSED; + break; + case LS_STOPPING: + f->state = LS_CLOSING; + break; + + case LS_REQSENT: + case LS_ACKRCVD: + case LS_ACKSENT: + case LS_OPENED: + if( f->state != LS_OPENED ) { + UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ + } else if( f->callbacks->down ) { + (*f->callbacks->down)(f); /* Inform upper layers we're down */ + } + /* Init restart counter, send Terminate-Request */ + f->retransmits = f->maxtermtransmits; + fsm_sdata(f, TERMREQ, f->reqid = ++f->id, + (u_char *) f->term_reason, f->term_reason_len); + TIMEOUT(fsm_timeout, f, f->timeouttime); + --f->retransmits; + + f->state = LS_CLOSING; + break; + } + + FSMDEBUG(LOG_INFO, ("%s: close reason=%s state %d (%s) -> %d (%s)\n", + PROTO_NAME(f), reason, oldState, ppperr_strerr[oldState], f->state, ppperr_strerr[f->state])); +} + + +/* + * fsm_timeout - Timeout expired. + */ +static void +fsm_timeout(void *arg) +{ + fsm *f = (fsm *) arg; + + switch (f->state) { + case LS_CLOSING: + case LS_STOPPING: + if( f->retransmits <= 0 ) { + FSMDEBUG(LOG_WARNING, ("%s: timeout sending Terminate-Request state=%d (%s)\n", + PROTO_NAME(f), f->state, ppperr_strerr[f->state])); + /* + * We've waited for an ack long enough. Peer probably heard us. + */ + f->state = (f->state == LS_CLOSING)? LS_CLOSED: LS_STOPPED; + if( f->callbacks->finished ) { + (*f->callbacks->finished)(f); + } + } else { + FSMDEBUG(LOG_WARNING, ("%s: timeout resending Terminate-Requests state=%d (%s)\n", + PROTO_NAME(f), f->state, ppperr_strerr[f->state])); + /* Send Terminate-Request */ + fsm_sdata(f, TERMREQ, f->reqid = ++f->id, + (u_char *) f->term_reason, f->term_reason_len); + TIMEOUT(fsm_timeout, f, f->timeouttime); + --f->retransmits; + } + break; + + case LS_REQSENT: + case LS_ACKRCVD: + case LS_ACKSENT: + if (f->retransmits <= 0) { + FSMDEBUG(LOG_WARNING, ("%s: timeout sending Config-Requests state=%d (%s)\n", + PROTO_NAME(f), f->state, ppperr_strerr[f->state])); + f->state = LS_STOPPED; + if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished ) { + (*f->callbacks->finished)(f); + } + } else { + FSMDEBUG(LOG_WARNING, ("%s: timeout resending Config-Request state=%d (%s)\n", + PROTO_NAME(f), f->state, ppperr_strerr[f->state])); + /* Retransmit the configure-request */ + if (f->callbacks->retransmit) { + (*f->callbacks->retransmit)(f); + } + fsm_sconfreq(f, 1); /* Re-send Configure-Request */ + if( f->state == LS_ACKRCVD ) { + f->state = LS_REQSENT; + } + } + break; + + default: + FSMDEBUG(LOG_INFO, ("%s: UNHANDLED timeout event in state %d (%s)!\n", + PROTO_NAME(f), f->state, ppperr_strerr[f->state])); + } +} + + +/* + * fsm_input - Input packet. + */ +void +fsm_input(fsm *f, u_char *inpacket, int l) +{ + u_char *inp = inpacket; + u_char code, id; + int len; + + /* + * Parse header (code, id and length). + * If packet too short, drop it. + */ + if (l < HEADERLEN) { + FSMDEBUG(LOG_WARNING, ("fsm_input(%x): Rcvd short header.\n", + f->protocol)); + return; + } + GETCHAR(code, inp); + GETCHAR(id, inp); + GETSHORT(len, inp); + if (len < HEADERLEN) { + FSMDEBUG(LOG_INFO, ("fsm_input(%x): Rcvd illegal length.\n", + f->protocol)); + return; + } + if (len > l) { + FSMDEBUG(LOG_INFO, ("fsm_input(%x): Rcvd short packet.\n", + f->protocol)); + return; + } + len -= HEADERLEN; /* subtract header length */ + + if( f->state == LS_INITIAL || f->state == LS_STARTING ) { + FSMDEBUG(LOG_INFO, ("fsm_input(%x): Rcvd packet in state %d (%s).\n", + f->protocol, f->state, ppperr_strerr[f->state])); + return; + } + FSMDEBUG(LOG_INFO, ("fsm_input(%s):%d,%d,%d\n", PROTO_NAME(f), code, id, l)); + /* + * Action depends on code. + */ + switch (code) { + case CONFREQ: + fsm_rconfreq(f, id, inp, len); + break; + + case CONFACK: + fsm_rconfack(f, id, inp, len); + break; + + case CONFNAK: + case CONFREJ: + fsm_rconfnakrej(f, code, id, inp, len); + break; + + case TERMREQ: + fsm_rtermreq(f, id, inp, len); + break; + + case TERMACK: + fsm_rtermack(f); + break; + + case CODEREJ: + fsm_rcoderej(f, inp, len); + break; + + default: + FSMDEBUG(LOG_INFO, ("fsm_input(%s): default: \n", PROTO_NAME(f))); + if( !f->callbacks->extcode || + !(*f->callbacks->extcode)(f, code, id, inp, len) ) { + fsm_sdata(f, CODEREJ, ++f->id, inpacket, len + HEADERLEN); + } + break; + } +} + + +/* + * fsm_rconfreq - Receive Configure-Request. + */ +static void +fsm_rconfreq(fsm *f, u_char id, u_char *inp, int len) +{ + int code, reject_if_disagree; + + FSMDEBUG(LOG_INFO, ("fsm_rconfreq(%s): Rcvd id %d state=%d (%s)\n", + PROTO_NAME(f), id, f->state, ppperr_strerr[f->state])); + switch( f->state ) { + case LS_CLOSED: + /* Go away, we're closed */ + fsm_sdata(f, TERMACK, id, NULL, 0); + return; + case LS_CLOSING: + case LS_STOPPING: + return; + + case LS_OPENED: + /* Go down and restart negotiation */ + if( f->callbacks->down ) { + (*f->callbacks->down)(f); /* Inform upper layers */ + } + fsm_sconfreq(f, 0); /* Send initial Configure-Request */ + break; + + case LS_STOPPED: + /* Negotiation started by our peer */ + fsm_sconfreq(f, 0); /* Send initial Configure-Request */ + f->state = LS_REQSENT; + break; + } + + /* + * Pass the requested configuration options + * to protocol-specific code for checking. + */ + if (f->callbacks->reqci) { /* Check CI */ + reject_if_disagree = (f->nakloops >= f->maxnakloops); + code = (*f->callbacks->reqci)(f, inp, &len, reject_if_disagree); + } else if (len) { + code = CONFREJ; /* Reject all CI */ + } else { + code = CONFACK; + } + + /* send the Ack, Nak or Rej to the peer */ + fsm_sdata(f, (u_char)code, id, inp, len); + + if (code == CONFACK) { + if (f->state == LS_ACKRCVD) { + UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ + f->state = LS_OPENED; + if (f->callbacks->up) { + (*f->callbacks->up)(f); /* Inform upper layers */ + } + } else { + f->state = LS_ACKSENT; + } + f->nakloops = 0; + } else { + /* we sent CONFACK or CONFREJ */ + if (f->state != LS_ACKRCVD) { + f->state = LS_REQSENT; + } + if( code == CONFNAK ) { + ++f->nakloops; + } + } +} + + +/* + * fsm_rconfack - Receive Configure-Ack. + */ +static void +fsm_rconfack(fsm *f, int id, u_char *inp, int len) +{ + FSMDEBUG(LOG_INFO, ("fsm_rconfack(%s): Rcvd id %d state=%d (%s)\n", + PROTO_NAME(f), id, f->state, ppperr_strerr[f->state])); + + if (id != f->reqid || f->seen_ack) { /* Expected id? */ + return; /* Nope, toss... */ + } + if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len): (len == 0)) ) { + /* Ack is bad - ignore it */ + FSMDEBUG(LOG_INFO, ("%s: received bad Ack (length %d)\n", + PROTO_NAME(f), len)); + return; + } + f->seen_ack = 1; + + switch (f->state) { + case LS_CLOSED: + case LS_STOPPED: + fsm_sdata(f, TERMACK, (u_char)id, NULL, 0); + break; + + case LS_REQSENT: + f->state = LS_ACKRCVD; + f->retransmits = f->maxconfreqtransmits; + break; + + case LS_ACKRCVD: + /* Huh? an extra valid Ack? oh well... */ + UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ + fsm_sconfreq(f, 0); + f->state = LS_REQSENT; + break; + + case LS_ACKSENT: + UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ + f->state = LS_OPENED; + f->retransmits = f->maxconfreqtransmits; + if (f->callbacks->up) { + (*f->callbacks->up)(f); /* Inform upper layers */ + } + break; + + case LS_OPENED: + /* Go down and restart negotiation */ + if (f->callbacks->down) { + (*f->callbacks->down)(f); /* Inform upper layers */ + } + fsm_sconfreq(f, 0); /* Send initial Configure-Request */ + f->state = LS_REQSENT; + break; + } +} + + +/* + * fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject. + */ +static void +fsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len) +{ + int (*proc) (fsm *, u_char *, int); + int ret; + + FSMDEBUG(LOG_INFO, ("fsm_rconfnakrej(%s): Rcvd id %d state=%d (%s)\n", + PROTO_NAME(f), id, f->state, ppperr_strerr[f->state])); + + if (id != f->reqid || f->seen_ack) { /* Expected id? */ + return; /* Nope, toss... */ + } + proc = (code == CONFNAK)? f->callbacks->nakci: f->callbacks->rejci; + if (!proc || !((ret = proc(f, inp, len)))) { + /* Nak/reject is bad - ignore it */ + FSMDEBUG(LOG_INFO, ("%s: received bad %s (length %d)\n", + PROTO_NAME(f), (code==CONFNAK? "Nak": "reject"), len)); + return; + } + f->seen_ack = 1; + + switch (f->state) { + case LS_CLOSED: + case LS_STOPPED: + fsm_sdata(f, TERMACK, (u_char)id, NULL, 0); + break; + + case LS_REQSENT: + case LS_ACKSENT: + /* They didn't agree to what we wanted - try another request */ + UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ + if (ret < 0) { + f->state = LS_STOPPED; /* kludge for stopping CCP */ + } else { + fsm_sconfreq(f, 0); /* Send Configure-Request */ + } + break; + + case LS_ACKRCVD: + /* Got a Nak/reject when we had already had an Ack?? oh well... */ + UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ + fsm_sconfreq(f, 0); + f->state = LS_REQSENT; + break; + + case LS_OPENED: + /* Go down and restart negotiation */ + if (f->callbacks->down) { + (*f->callbacks->down)(f); /* Inform upper layers */ + } + fsm_sconfreq(f, 0); /* Send initial Configure-Request */ + f->state = LS_REQSENT; + break; + } +} + + +/* + * fsm_rtermreq - Receive Terminate-Req. + */ +static void +fsm_rtermreq(fsm *f, int id, u_char *p, int len) +{ + LWIP_UNUSED_ARG(p); + + FSMDEBUG(LOG_INFO, ("fsm_rtermreq(%s): Rcvd id %d state=%d (%s)\n", + PROTO_NAME(f), id, f->state, ppperr_strerr[f->state])); + + switch (f->state) { + case LS_ACKRCVD: + case LS_ACKSENT: + f->state = LS_REQSENT; /* Start over but keep trying */ + break; + + case LS_OPENED: + if (len > 0) { + FSMDEBUG(LOG_INFO, ("%s terminated by peer (%p)\n", PROTO_NAME(f), p)); + } else { + FSMDEBUG(LOG_INFO, ("%s terminated by peer\n", PROTO_NAME(f))); + } + if (f->callbacks->down) { + (*f->callbacks->down)(f); /* Inform upper layers */ + } + f->retransmits = 0; + f->state = LS_STOPPING; + TIMEOUT(fsm_timeout, f, f->timeouttime); + break; + } + + fsm_sdata(f, TERMACK, (u_char)id, NULL, 0); +} + + +/* + * fsm_rtermack - Receive Terminate-Ack. + */ +static void +fsm_rtermack(fsm *f) +{ + FSMDEBUG(LOG_INFO, ("fsm_rtermack(%s): state=%d (%s)\n", + PROTO_NAME(f), f->state, ppperr_strerr[f->state])); + + switch (f->state) { + case LS_CLOSING: + UNTIMEOUT(fsm_timeout, f); + f->state = LS_CLOSED; + if( f->callbacks->finished ) { + (*f->callbacks->finished)(f); + } + break; + + case LS_STOPPING: + UNTIMEOUT(fsm_timeout, f); + f->state = LS_STOPPED; + if( f->callbacks->finished ) { + (*f->callbacks->finished)(f); + } + break; + + case LS_ACKRCVD: + f->state = LS_REQSENT; + break; + + case LS_OPENED: + if (f->callbacks->down) { + (*f->callbacks->down)(f); /* Inform upper layers */ + } + fsm_sconfreq(f, 0); + break; + default: + FSMDEBUG(LOG_INFO, ("fsm_rtermack(%s): UNHANDLED state=%d (%s)!!!\n", + PROTO_NAME(f), f->state, ppperr_strerr[f->state])); + } +} + + +/* + * fsm_rcoderej - Receive an Code-Reject. + */ +static void +fsm_rcoderej(fsm *f, u_char *inp, int len) +{ + u_char code, id; + + FSMDEBUG(LOG_INFO, ("fsm_rcoderej(%s): state=%d (%s)\n", + PROTO_NAME(f), f->state, ppperr_strerr[f->state])); + + if (len < HEADERLEN) { + FSMDEBUG(LOG_INFO, ("fsm_rcoderej: Rcvd short Code-Reject packet!\n")); + return; + } + GETCHAR(code, inp); + GETCHAR(id, inp); + FSMDEBUG(LOG_WARNING, ("%s: Rcvd Code-Reject for code %d, id %d\n", + PROTO_NAME(f), code, id)); + + if( f->state == LS_ACKRCVD ) { + f->state = LS_REQSENT; + } +} + + +/* + * fsm_protreject - Peer doesn't speak this protocol. + * + * Treat this as a catastrophic error (RXJ-). + */ +void +fsm_protreject(fsm *f) +{ + switch( f->state ) { + case LS_CLOSING: + UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ + /* fall through */ + case LS_CLOSED: + f->state = LS_CLOSED; + if( f->callbacks->finished ) { + (*f->callbacks->finished)(f); + } + break; + + case LS_STOPPING: + case LS_REQSENT: + case LS_ACKRCVD: + case LS_ACKSENT: + UNTIMEOUT(fsm_timeout, f); /* Cancel timeout */ + /* fall through */ + case LS_STOPPED: + f->state = LS_STOPPED; + if( f->callbacks->finished ) { + (*f->callbacks->finished)(f); + } + break; + + case LS_OPENED: + if( f->callbacks->down ) { + (*f->callbacks->down)(f); + } + /* Init restart counter, send Terminate-Request */ + f->retransmits = f->maxtermtransmits; + fsm_sdata(f, TERMREQ, f->reqid = ++f->id, + (u_char *) f->term_reason, f->term_reason_len); + TIMEOUT(fsm_timeout, f, f->timeouttime); + --f->retransmits; + + f->state = LS_STOPPING; + break; + + default: + FSMDEBUG(LOG_INFO, ("%s: Protocol-reject event in state %d (%s)!\n", + PROTO_NAME(f), f->state, ppperr_strerr[f->state])); + } +} + + +/* + * fsm_sconfreq - Send a Configure-Request. + */ +static void +fsm_sconfreq(fsm *f, int retransmit) +{ + u_char *outp; + int cilen; + + if( f->state != LS_REQSENT && f->state != LS_ACKRCVD && f->state != LS_ACKSENT ) { + /* Not currently negotiating - reset options */ + if( f->callbacks->resetci ) { + (*f->callbacks->resetci)(f); + } + f->nakloops = 0; + } + + if( !retransmit ) { + /* New request - reset retransmission counter, use new ID */ + f->retransmits = f->maxconfreqtransmits; + f->reqid = ++f->id; + } + + f->seen_ack = 0; + + /* + * Make up the request packet + */ + outp = outpacket_buf[f->unit] + PPP_HDRLEN + HEADERLEN; + if( f->callbacks->cilen && f->callbacks->addci ) { + cilen = (*f->callbacks->cilen)(f); + if( cilen > peer_mru[f->unit] - (int)HEADERLEN ) { + cilen = peer_mru[f->unit] - HEADERLEN; + } + if (f->callbacks->addci) { + (*f->callbacks->addci)(f, outp, &cilen); + } + } else { + cilen = 0; + } + + /* send the request to our peer */ + fsm_sdata(f, CONFREQ, f->reqid, outp, cilen); + + /* start the retransmit timer */ + --f->retransmits; + TIMEOUT(fsm_timeout, f, f->timeouttime); + + FSMDEBUG(LOG_INFO, ("%s: sending Configure-Request, id %d\n", + PROTO_NAME(f), f->reqid)); +} + + +/* + * fsm_sdata - Send some data. + * + * Used for all packets sent to our peer by this module. + */ +void +fsm_sdata( fsm *f, u_char code, u_char id, u_char *data, int datalen) +{ + u_char *outp; + int outlen; + + /* Adjust length to be smaller than MTU */ + outp = outpacket_buf[f->unit]; + if (datalen > peer_mru[f->unit] - (int)HEADERLEN) { + datalen = peer_mru[f->unit] - HEADERLEN; + } + if (datalen && data != outp + PPP_HDRLEN + HEADERLEN) { + BCOPY(data, outp + PPP_HDRLEN + HEADERLEN, datalen); + } + outlen = datalen + HEADERLEN; + MAKEHEADER(outp, f->protocol); + PUTCHAR(code, outp); + PUTCHAR(id, outp); + PUTSHORT(outlen, outp); + pppWrite(f->unit, outpacket_buf[f->unit], outlen + PPP_HDRLEN); + FSMDEBUG(LOG_INFO, ("fsm_sdata(%s): Sent code %d,%d,%d.\n", + PROTO_NAME(f), code, id, outlen)); +} + +#endif /* PPP_SUPPORT */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/fsm.h b/third_party/lwip-1.4.1/src/netif/ppp/fsm.h new file mode 100644 index 0000000..9bc7832 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/fsm.h @@ -0,0 +1,157 @@ +/***************************************************************************** +* fsm.h - Network Control Protocol Finite State Machine header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* Copyright (c) 1997 Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-11-05 Guy Lancaster , Global Election Systems Inc. +* Original based on BSD code. +*****************************************************************************/ +/* + * fsm.h - {Link, IP} Control Protocol Finite State Machine definitions. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * $Id: fsm.h,v 1.5 2009/12/31 17:08:08 goldsimon Exp $ + */ + +#ifndef FSM_H +#define FSM_H + +/* + * LCP Packet header = Code, id, length. + */ +#define HEADERLEN (sizeof (u_char) + sizeof (u_char) + sizeof (u_short)) + + +/* + * CP (LCP, IPCP, etc.) codes. + */ +#define CONFREQ 1 /* Configuration Request */ +#define CONFACK 2 /* Configuration Ack */ +#define CONFNAK 3 /* Configuration Nak */ +#define CONFREJ 4 /* Configuration Reject */ +#define TERMREQ 5 /* Termination Request */ +#define TERMACK 6 /* Termination Ack */ +#define CODEREJ 7 /* Code Reject */ + + +/* + * Each FSM is described by an fsm structure and fsm callbacks. + */ +typedef struct fsm { + int unit; /* Interface unit number */ + u_short protocol; /* Data Link Layer Protocol field value */ + int state; /* State */ + int flags; /* Contains option bits */ + u_char id; /* Current id */ + u_char reqid; /* Current request id */ + u_char seen_ack; /* Have received valid Ack/Nak/Rej to Req */ + int timeouttime; /* Timeout time in milliseconds */ + int maxconfreqtransmits; /* Maximum Configure-Request transmissions */ + int retransmits; /* Number of retransmissions left */ + int maxtermtransmits; /* Maximum Terminate-Request transmissions */ + int nakloops; /* Number of nak loops since last ack */ + int maxnakloops; /* Maximum number of nak loops tolerated */ + struct fsm_callbacks* callbacks; /* Callback routines */ + char* term_reason; /* Reason for closing protocol */ + int term_reason_len; /* Length of term_reason */ +} fsm; + + +typedef struct fsm_callbacks { + void (*resetci)(fsm*); /* Reset our Configuration Information */ + int (*cilen)(fsm*); /* Length of our Configuration Information */ + void (*addci)(fsm*, u_char*, int*); /* Add our Configuration Information */ + int (*ackci)(fsm*, u_char*, int); /* ACK our Configuration Information */ + int (*nakci)(fsm*, u_char*, int); /* NAK our Configuration Information */ + int (*rejci)(fsm*, u_char*, int); /* Reject our Configuration Information */ + int (*reqci)(fsm*, u_char*, int*, int); /* Request peer's Configuration Information */ + void (*up)(fsm*); /* Called when fsm reaches LS_OPENED state */ + void (*down)(fsm*); /* Called when fsm leaves LS_OPENED state */ + void (*starting)(fsm*); /* Called when we want the lower layer */ + void (*finished)(fsm*); /* Called when we don't want the lower layer */ + void (*protreject)(int); /* Called when Protocol-Reject received */ + void (*retransmit)(fsm*); /* Retransmission is necessary */ + int (*extcode)(fsm*, int, u_char, u_char*, int); /* Called when unknown code received */ + char *proto_name; /* String name for protocol (for messages) */ +} fsm_callbacks; + + +/* + * Link states. + */ +#define LS_INITIAL 0 /* Down, hasn't been opened */ +#define LS_STARTING 1 /* Down, been opened */ +#define LS_CLOSED 2 /* Up, hasn't been opened */ +#define LS_STOPPED 3 /* Open, waiting for down event */ +#define LS_CLOSING 4 /* Terminating the connection, not open */ +#define LS_STOPPING 5 /* Terminating, but open */ +#define LS_REQSENT 6 /* We've sent a Config Request */ +#define LS_ACKRCVD 7 /* We've received a Config Ack */ +#define LS_ACKSENT 8 /* We've sent a Config Ack */ +#define LS_OPENED 9 /* Connection available */ + +/* + * Flags - indicate options controlling FSM operation + */ +#define OPT_PASSIVE 1 /* Don't die if we don't get a response */ +#define OPT_RESTART 2 /* Treat 2nd OPEN as DOWN, UP */ +#define OPT_SILENT 4 /* Wait for peer to speak first */ + + +/* + * Prototypes + */ +void fsm_init (fsm*); +void fsm_lowerup (fsm*); +void fsm_lowerdown (fsm*); +void fsm_open (fsm*); +void fsm_close (fsm*, char*); +void fsm_input (fsm*, u_char*, int); +void fsm_protreject (fsm*); +void fsm_sdata (fsm*, u_char, u_char, u_char*, int); + + +/* + * Variables + */ +extern int peer_mru[]; /* currently negotiated peer MRU (per unit) */ + +#endif /* FSM_H */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/ipcp.c b/third_party/lwip-1.4.1/src/netif/ppp/ipcp.c new file mode 100644 index 0000000..d9aee84 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/ipcp.c @@ -0,0 +1,1411 @@ +/** In contrast to pppd 2.3.1, DNS support has been added, proxy-ARP and + dial-on-demand has been stripped. */ +/***************************************************************************** +* ipcp.c - Network PPP IP Control Protocol program file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 by Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-12-08 Guy Lancaster , Global Election Systems Inc. +* Original. +*****************************************************************************/ +/* + * ipcp.c - PPP IP Control Protocol. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "lwip/opt.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#include "ppp_impl.h" +#include "pppdebug.h" + +#include "auth.h" +#include "fsm.h" +#include "vj.h" +#include "ipcp.h" + +#include "lwip/inet.h" + +#include + +/* #define OLD_CI_ADDRS 1 */ /* Support deprecated address negotiation. */ + +/* global vars */ +ipcp_options ipcp_wantoptions[NUM_PPP]; /* Options that we want to request */ +ipcp_options ipcp_gotoptions[NUM_PPP]; /* Options that peer ack'd */ +ipcp_options ipcp_allowoptions[NUM_PPP]; /* Options we allow peer to request */ +ipcp_options ipcp_hisoptions[NUM_PPP]; /* Options that we ack'd */ + +/* local vars */ +static int default_route_set[NUM_PPP]; /* Have set up a default route */ +static int cis_received[NUM_PPP]; /* # Conf-Reqs received */ + + +/* + * Callbacks for fsm code. (CI = Configuration Information) + */ +static void ipcp_resetci (fsm *); /* Reset our CI */ +static int ipcp_cilen (fsm *); /* Return length of our CI */ +static void ipcp_addci (fsm *, u_char *, int *); /* Add our CI */ +static int ipcp_ackci (fsm *, u_char *, int); /* Peer ack'd our CI */ +static int ipcp_nakci (fsm *, u_char *, int); /* Peer nak'd our CI */ +static int ipcp_rejci (fsm *, u_char *, int); /* Peer rej'd our CI */ +static int ipcp_reqci (fsm *, u_char *, int *, int); /* Rcv CI */ +static void ipcp_up (fsm *); /* We're UP */ +static void ipcp_down (fsm *); /* We're DOWN */ +#if PPP_ADDITIONAL_CALLBACKS +static void ipcp_script (fsm *, char *); /* Run an up/down script */ +#endif +static void ipcp_finished (fsm *); /* Don't need lower layer */ + + +fsm ipcp_fsm[NUM_PPP]; /* IPCP fsm structure */ + + +static fsm_callbacks ipcp_callbacks = { /* IPCP callback routines */ + ipcp_resetci, /* Reset our Configuration Information */ + ipcp_cilen, /* Length of our Configuration Information */ + ipcp_addci, /* Add our Configuration Information */ + ipcp_ackci, /* ACK our Configuration Information */ + ipcp_nakci, /* NAK our Configuration Information */ + ipcp_rejci, /* Reject our Configuration Information */ + ipcp_reqci, /* Request peer's Configuration Information */ + ipcp_up, /* Called when fsm reaches LS_OPENED state */ + ipcp_down, /* Called when fsm leaves LS_OPENED state */ + NULL, /* Called when we want the lower layer up */ + ipcp_finished, /* Called when we want the lower layer down */ + NULL, /* Called when Protocol-Reject received */ + NULL, /* Retransmission is necessary */ + NULL, /* Called to handle protocol-specific codes */ + "IPCP" /* String name of protocol */ +}; + +/* + * Protocol entry points from main code. + */ +static void ipcp_init (int); +static void ipcp_open (int); +static void ipcp_close (int, char *); +static void ipcp_lowerup (int); +static void ipcp_lowerdown (int); +static void ipcp_input (int, u_char *, int); +static void ipcp_protrej (int); + + +struct protent ipcp_protent = { + PPP_IPCP, + ipcp_init, + ipcp_input, + ipcp_protrej, + ipcp_lowerup, + ipcp_lowerdown, + ipcp_open, + ipcp_close, +#if PPP_ADDITIONAL_CALLBACKS + ipcp_printpkt, + NULL, +#endif /* PPP_ADDITIONAL_CALLBACKS */ + 1, + "IPCP", +#if PPP_ADDITIONAL_CALLBACKS + ip_check_options, + NULL, + ip_active_pkt +#endif /* PPP_ADDITIONAL_CALLBACKS */ +}; + +static void ipcp_clear_addrs (int); + +/* + * Lengths of configuration options. + */ +#define CILEN_VOID 2 +#define CILEN_COMPRESS 4 /* min length for compression protocol opt. */ +#define CILEN_VJ 6 /* length for RFC1332 Van-Jacobson opt. */ +#define CILEN_ADDR 6 /* new-style single address option */ +#define CILEN_ADDRS 10 /* old-style dual address option */ + + +#define CODENAME(x) ((x) == CONFACK ? "ACK" : \ + (x) == CONFNAK ? "NAK" : "REJ") + + +/* + * ipcp_init - Initialize IPCP. + */ +static void +ipcp_init(int unit) +{ + fsm *f = &ipcp_fsm[unit]; + ipcp_options *wo = &ipcp_wantoptions[unit]; + ipcp_options *ao = &ipcp_allowoptions[unit]; + + f->unit = unit; + f->protocol = PPP_IPCP; + f->callbacks = &ipcp_callbacks; + fsm_init(&ipcp_fsm[unit]); + + memset(wo, 0, sizeof(*wo)); + memset(ao, 0, sizeof(*ao)); + + wo->neg_addr = 1; + wo->ouraddr = 0; +#if VJ_SUPPORT + wo->neg_vj = 1; +#else /* VJ_SUPPORT */ + wo->neg_vj = 0; +#endif /* VJ_SUPPORT */ + wo->vj_protocol = IPCP_VJ_COMP; + wo->maxslotindex = MAX_SLOTS - 1; + wo->cflag = 0; + wo->default_route = 1; + + ao->neg_addr = 1; +#if VJ_SUPPORT + ao->neg_vj = 1; +#else /* VJ_SUPPORT */ + ao->neg_vj = 0; +#endif /* VJ_SUPPORT */ + ao->maxslotindex = MAX_SLOTS - 1; + ao->cflag = 1; + ao->default_route = 1; +} + + +/* + * ipcp_open - IPCP is allowed to come up. + */ +static void +ipcp_open(int unit) +{ + fsm_open(&ipcp_fsm[unit]); +} + + +/* + * ipcp_close - Take IPCP down. + */ +static void +ipcp_close(int unit, char *reason) +{ + fsm_close(&ipcp_fsm[unit], reason); +} + + +/* + * ipcp_lowerup - The lower layer is up. + */ +static void +ipcp_lowerup(int unit) +{ + fsm_lowerup(&ipcp_fsm[unit]); +} + + +/* + * ipcp_lowerdown - The lower layer is down. + */ +static void +ipcp_lowerdown(int unit) +{ + fsm_lowerdown(&ipcp_fsm[unit]); +} + + +/* + * ipcp_input - Input IPCP packet. + */ +static void +ipcp_input(int unit, u_char *p, int len) +{ + fsm_input(&ipcp_fsm[unit], p, len); +} + + +/* + * ipcp_protrej - A Protocol-Reject was received for IPCP. + * + * Pretend the lower layer went down, so we shut up. + */ +static void +ipcp_protrej(int unit) +{ + fsm_lowerdown(&ipcp_fsm[unit]); +} + + +/* + * ipcp_resetci - Reset our CI. + */ +static void +ipcp_resetci(fsm *f) +{ + ipcp_options *wo = &ipcp_wantoptions[f->unit]; + + wo->req_addr = wo->neg_addr && ipcp_allowoptions[f->unit].neg_addr; + if (wo->ouraddr == 0) { + wo->accept_local = 1; + } + if (wo->hisaddr == 0) { + wo->accept_remote = 1; + } + /* Request DNS addresses from the peer */ + wo->req_dns1 = ppp_settings.usepeerdns; + wo->req_dns2 = ppp_settings.usepeerdns; + ipcp_gotoptions[f->unit] = *wo; + cis_received[f->unit] = 0; +} + + +/* + * ipcp_cilen - Return length of our CI. + */ +static int +ipcp_cilen(fsm *f) +{ + ipcp_options *go = &ipcp_gotoptions[f->unit]; + ipcp_options *wo = &ipcp_wantoptions[f->unit]; + ipcp_options *ho = &ipcp_hisoptions[f->unit]; + +#define LENCIVJ(neg, old) (neg ? (old? CILEN_COMPRESS : CILEN_VJ) : 0) +#define LENCIADDR(neg, old) (neg ? (old? CILEN_ADDRS : CILEN_ADDR) : 0) +#define LENCIDNS(neg) (neg ? (CILEN_ADDR) : 0) + + /* + * First see if we want to change our options to the old + * forms because we have received old forms from the peer. + */ + if (wo->neg_addr && !go->neg_addr && !go->old_addrs) { + /* use the old style of address negotiation */ + go->neg_addr = 1; + go->old_addrs = 1; + } + if (wo->neg_vj && !go->neg_vj && !go->old_vj) { + /* try an older style of VJ negotiation */ + if (cis_received[f->unit] == 0) { + /* keep trying the new style until we see some CI from the peer */ + go->neg_vj = 1; + } else { + /* use the old style only if the peer did */ + if (ho->neg_vj && ho->old_vj) { + go->neg_vj = 1; + go->old_vj = 1; + go->vj_protocol = ho->vj_protocol; + } + } + } + + return (LENCIADDR(go->neg_addr, go->old_addrs) + + LENCIVJ(go->neg_vj, go->old_vj) + + LENCIDNS(go->req_dns1) + + LENCIDNS(go->req_dns2)); +} + + +/* + * ipcp_addci - Add our desired CIs to a packet. + */ +static void +ipcp_addci(fsm *f, u_char *ucp, int *lenp) +{ + ipcp_options *go = &ipcp_gotoptions[f->unit]; + int len = *lenp; + +#define ADDCIVJ(opt, neg, val, old, maxslotindex, cflag) \ + if (neg) { \ + int vjlen = old? CILEN_COMPRESS : CILEN_VJ; \ + if (len >= vjlen) { \ + PUTCHAR(opt, ucp); \ + PUTCHAR(vjlen, ucp); \ + PUTSHORT(val, ucp); \ + if (!old) { \ + PUTCHAR(maxslotindex, ucp); \ + PUTCHAR(cflag, ucp); \ + } \ + len -= vjlen; \ + } else { \ + neg = 0; \ + } \ + } + +#define ADDCIADDR(opt, neg, old, val1, val2) \ + if (neg) { \ + int addrlen = (old? CILEN_ADDRS: CILEN_ADDR); \ + if (len >= addrlen) { \ + u32_t l; \ + PUTCHAR(opt, ucp); \ + PUTCHAR(addrlen, ucp); \ + l = ntohl(val1); \ + PUTLONG(l, ucp); \ + if (old) { \ + l = ntohl(val2); \ + PUTLONG(l, ucp); \ + } \ + len -= addrlen; \ + } else { \ + neg = 0; \ + } \ + } + +#define ADDCIDNS(opt, neg, addr) \ + if (neg) { \ + if (len >= CILEN_ADDR) { \ + u32_t l; \ + PUTCHAR(opt, ucp); \ + PUTCHAR(CILEN_ADDR, ucp); \ + l = ntohl(addr); \ + PUTLONG(l, ucp); \ + len -= CILEN_ADDR; \ + } else { \ + neg = 0; \ + } \ + } + + ADDCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), go->neg_addr, + go->old_addrs, go->ouraddr, go->hisaddr); + + ADDCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj, + go->maxslotindex, go->cflag); + + ADDCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]); + + ADDCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]); + + *lenp -= len; +} + + +/* + * ipcp_ackci - Ack our CIs. + * + * Returns: + * 0 - Ack was bad. + * 1 - Ack was good. + */ +static int +ipcp_ackci(fsm *f, u_char *p, int len) +{ + ipcp_options *go = &ipcp_gotoptions[f->unit]; + u_short cilen, citype, cishort; + u32_t cilong; + u_char cimaxslotindex, cicflag; + + /* + * CIs must be in exactly the same order that we sent... + * Check packet length and CI length at each step. + * If we find any deviations, then this packet is bad. + */ + +#define ACKCIVJ(opt, neg, val, old, maxslotindex, cflag) \ + if (neg) { \ + int vjlen = old? CILEN_COMPRESS : CILEN_VJ; \ + if ((len -= vjlen) < 0) { \ + goto bad; \ + } \ + GETCHAR(citype, p); \ + GETCHAR(cilen, p); \ + if (cilen != vjlen || \ + citype != opt) { \ + goto bad; \ + } \ + GETSHORT(cishort, p); \ + if (cishort != val) { \ + goto bad; \ + } \ + if (!old) { \ + GETCHAR(cimaxslotindex, p); \ + if (cimaxslotindex != maxslotindex) { \ + goto bad; \ + } \ + GETCHAR(cicflag, p); \ + if (cicflag != cflag) { \ + goto bad; \ + } \ + } \ + } + +#define ACKCIADDR(opt, neg, old, val1, val2) \ + if (neg) { \ + int addrlen = (old? CILEN_ADDRS: CILEN_ADDR); \ + u32_t l; \ + if ((len -= addrlen) < 0) { \ + goto bad; \ + } \ + GETCHAR(citype, p); \ + GETCHAR(cilen, p); \ + if (cilen != addrlen || \ + citype != opt) { \ + goto bad; \ + } \ + GETLONG(l, p); \ + cilong = htonl(l); \ + if (val1 != cilong) { \ + goto bad; \ + } \ + if (old) { \ + GETLONG(l, p); \ + cilong = htonl(l); \ + if (val2 != cilong) { \ + goto bad; \ + } \ + } \ + } + +#define ACKCIDNS(opt, neg, addr) \ + if (neg) { \ + u32_t l; \ + if ((len -= CILEN_ADDR) < 0) { \ + goto bad; \ + } \ + GETCHAR(citype, p); \ + GETCHAR(cilen, p); \ + if (cilen != CILEN_ADDR || \ + citype != opt) { \ + goto bad; \ + } \ + GETLONG(l, p); \ + cilong = htonl(l); \ + if (addr != cilong) { \ + goto bad; \ + } \ + } + + ACKCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), go->neg_addr, + go->old_addrs, go->ouraddr, go->hisaddr); + + ACKCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj, + go->maxslotindex, go->cflag); + + ACKCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]); + + ACKCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]); + + /* + * If there are any remaining CIs, then this packet is bad. + */ + if (len != 0) { + goto bad; + } + return (1); + +bad: + IPCPDEBUG(LOG_INFO, ("ipcp_ackci: received bad Ack!\n")); + return (0); +} + +/* + * ipcp_nakci - Peer has sent a NAK for some of our CIs. + * This should not modify any state if the Nak is bad + * or if IPCP is in the LS_OPENED state. + * + * Returns: + * 0 - Nak was bad. + * 1 - Nak was good. + */ +static int +ipcp_nakci(fsm *f, u_char *p, int len) +{ + ipcp_options *go = &ipcp_gotoptions[f->unit]; + u_char cimaxslotindex, cicflag; + u_char citype, cilen, *next; + u_short cishort; + u32_t ciaddr1, ciaddr2, l, cidnsaddr; + ipcp_options no; /* options we've seen Naks for */ + ipcp_options try; /* options to request next time */ + + BZERO(&no, sizeof(no)); + try = *go; + + /* + * Any Nak'd CIs must be in exactly the same order that we sent. + * Check packet length and CI length at each step. + * If we find any deviations, then this packet is bad. + */ +#define NAKCIADDR(opt, neg, old, code) \ + if (go->neg && \ + len >= (cilen = (old? CILEN_ADDRS: CILEN_ADDR)) && \ + p[1] == cilen && \ + p[0] == opt) { \ + len -= cilen; \ + INCPTR(2, p); \ + GETLONG(l, p); \ + ciaddr1 = htonl(l); \ + if (old) { \ + GETLONG(l, p); \ + ciaddr2 = htonl(l); \ + no.old_addrs = 1; \ + } else { \ + ciaddr2 = 0; \ + } \ + no.neg = 1; \ + code \ + } + +#define NAKCIVJ(opt, neg, code) \ + if (go->neg && \ + ((cilen = p[1]) == CILEN_COMPRESS || cilen == CILEN_VJ) && \ + len >= cilen && \ + p[0] == opt) { \ + len -= cilen; \ + INCPTR(2, p); \ + GETSHORT(cishort, p); \ + no.neg = 1; \ + code \ + } + +#define NAKCIDNS(opt, neg, code) \ + if (go->neg && \ + ((cilen = p[1]) == CILEN_ADDR) && \ + len >= cilen && \ + p[0] == opt) { \ + len -= cilen; \ + INCPTR(2, p); \ + GETLONG(l, p); \ + cidnsaddr = htonl(l); \ + no.neg = 1; \ + code \ + } + + /* + * Accept the peer's idea of {our,his} address, if different + * from our idea, only if the accept_{local,remote} flag is set. + */ + NAKCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), neg_addr, go->old_addrs, + if (go->accept_local && ciaddr1) { /* Do we know our address? */ + try.ouraddr = ciaddr1; + IPCPDEBUG(LOG_INFO, ("local IP address %s\n", + inet_ntoa(ciaddr1))); + } + if (go->accept_remote && ciaddr2) { /* Does he know his? */ + try.hisaddr = ciaddr2; + IPCPDEBUG(LOG_INFO, ("remote IP address %s\n", + inet_ntoa(ciaddr2))); + } + ); + + /* + * Accept the peer's value of maxslotindex provided that it + * is less than what we asked for. Turn off slot-ID compression + * if the peer wants. Send old-style compress-type option if + * the peer wants. + */ + NAKCIVJ(CI_COMPRESSTYPE, neg_vj, + if (cilen == CILEN_VJ) { + GETCHAR(cimaxslotindex, p); + GETCHAR(cicflag, p); + if (cishort == IPCP_VJ_COMP) { + try.old_vj = 0; + if (cimaxslotindex < go->maxslotindex) { + try.maxslotindex = cimaxslotindex; + } + if (!cicflag) { + try.cflag = 0; + } + } else { + try.neg_vj = 0; + } + } else { + if (cishort == IPCP_VJ_COMP || cishort == IPCP_VJ_COMP_OLD) { + try.old_vj = 1; + try.vj_protocol = cishort; + } else { + try.neg_vj = 0; + } + } + ); + + NAKCIDNS(CI_MS_DNS1, req_dns1, + try.dnsaddr[0] = cidnsaddr; + IPCPDEBUG(LOG_INFO, ("primary DNS address %s\n", inet_ntoa(cidnsaddr))); + ); + + NAKCIDNS(CI_MS_DNS2, req_dns2, + try.dnsaddr[1] = cidnsaddr; + IPCPDEBUG(LOG_INFO, ("secondary DNS address %s\n", inet_ntoa(cidnsaddr))); + ); + + /* + * There may be remaining CIs, if the peer is requesting negotiation + * on an option that we didn't include in our request packet. + * If they want to negotiate about IP addresses, we comply. + * If they want us to ask for compression, we refuse. + */ + while (len > CILEN_VOID) { + GETCHAR(citype, p); + GETCHAR(cilen, p); + if( (len -= cilen) < 0 ) { + goto bad; + } + next = p + cilen - 2; + + switch (citype) { + case CI_COMPRESSTYPE: + if (go->neg_vj || no.neg_vj || + (cilen != CILEN_VJ && cilen != CILEN_COMPRESS)) { + goto bad; + } + no.neg_vj = 1; + break; + case CI_ADDRS: + if ((go->neg_addr && go->old_addrs) || no.old_addrs + || cilen != CILEN_ADDRS) { + goto bad; + } + try.neg_addr = 1; + try.old_addrs = 1; + GETLONG(l, p); + ciaddr1 = htonl(l); + if (ciaddr1 && go->accept_local) { + try.ouraddr = ciaddr1; + } + GETLONG(l, p); + ciaddr2 = htonl(l); + if (ciaddr2 && go->accept_remote) { + try.hisaddr = ciaddr2; + } + no.old_addrs = 1; + break; + case CI_ADDR: + if (go->neg_addr || no.neg_addr || cilen != CILEN_ADDR) { + goto bad; + } + try.old_addrs = 0; + GETLONG(l, p); + ciaddr1 = htonl(l); + if (ciaddr1 && go->accept_local) { + try.ouraddr = ciaddr1; + } + if (try.ouraddr != 0) { + try.neg_addr = 1; + } + no.neg_addr = 1; + break; + } + p = next; + } + + /* If there is still anything left, this packet is bad. */ + if (len != 0) { + goto bad; + } + + /* + * OK, the Nak is good. Now we can update state. + */ + if (f->state != LS_OPENED) { + *go = try; + } + + return 1; + +bad: + IPCPDEBUG(LOG_INFO, ("ipcp_nakci: received bad Nak!\n")); + return 0; +} + + +/* + * ipcp_rejci - Reject some of our CIs. + */ +static int +ipcp_rejci(fsm *f, u_char *p, int len) +{ + ipcp_options *go = &ipcp_gotoptions[f->unit]; + u_char cimaxslotindex, ciflag, cilen; + u_short cishort; + u32_t cilong; + ipcp_options try; /* options to request next time */ + + try = *go; + /* + * Any Rejected CIs must be in exactly the same order that we sent. + * Check packet length and CI length at each step. + * If we find any deviations, then this packet is bad. + */ +#define REJCIADDR(opt, neg, old, val1, val2) \ + if (go->neg && \ + len >= (cilen = old? CILEN_ADDRS: CILEN_ADDR) && \ + p[1] == cilen && \ + p[0] == opt) { \ + u32_t l; \ + len -= cilen; \ + INCPTR(2, p); \ + GETLONG(l, p); \ + cilong = htonl(l); \ + /* Check rejected value. */ \ + if (cilong != val1) { \ + goto bad; \ + } \ + if (old) { \ + GETLONG(l, p); \ + cilong = htonl(l); \ + /* Check rejected value. */ \ + if (cilong != val2) { \ + goto bad; \ + } \ + } \ + try.neg = 0; \ + } + +#define REJCIVJ(opt, neg, val, old, maxslot, cflag) \ + if (go->neg && \ + p[1] == (old? CILEN_COMPRESS : CILEN_VJ) && \ + len >= p[1] && \ + p[0] == opt) { \ + len -= p[1]; \ + INCPTR(2, p); \ + GETSHORT(cishort, p); \ + /* Check rejected value. */ \ + if (cishort != val) { \ + goto bad; \ + } \ + if (!old) { \ + GETCHAR(cimaxslotindex, p); \ + if (cimaxslotindex != maxslot) { \ + goto bad; \ + } \ + GETCHAR(ciflag, p); \ + if (ciflag != cflag) { \ + goto bad; \ + } \ + } \ + try.neg = 0; \ + } + +#define REJCIDNS(opt, neg, dnsaddr) \ + if (go->neg && \ + ((cilen = p[1]) == CILEN_ADDR) && \ + len >= cilen && \ + p[0] == opt) { \ + u32_t l; \ + len -= cilen; \ + INCPTR(2, p); \ + GETLONG(l, p); \ + cilong = htonl(l); \ + /* Check rejected value. */ \ + if (cilong != dnsaddr) { \ + goto bad; \ + } \ + try.neg = 0; \ + } + + REJCIADDR((go->old_addrs? CI_ADDRS: CI_ADDR), neg_addr, + go->old_addrs, go->ouraddr, go->hisaddr); + + REJCIVJ(CI_COMPRESSTYPE, neg_vj, go->vj_protocol, go->old_vj, + go->maxslotindex, go->cflag); + + REJCIDNS(CI_MS_DNS1, req_dns1, go->dnsaddr[0]); + + REJCIDNS(CI_MS_DNS2, req_dns2, go->dnsaddr[1]); + + /* + * If there are any remaining CIs, then this packet is bad. + */ + if (len != 0) { + goto bad; + } + /* + * Now we can update state. + */ + if (f->state != LS_OPENED) { + *go = try; + } + return 1; + +bad: + IPCPDEBUG(LOG_INFO, ("ipcp_rejci: received bad Reject!\n")); + return 0; +} + + +/* + * ipcp_reqci - Check the peer's requested CIs and send appropriate response. + * + * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified + * appropriately. If reject_if_disagree is non-zero, doesn't return + * CONFNAK; returns CONFREJ if it can't return CONFACK. + */ +static int +ipcp_reqci(fsm *f, u_char *inp/* Requested CIs */,int *len/* Length of requested CIs */,int reject_if_disagree) +{ + ipcp_options *wo = &ipcp_wantoptions[f->unit]; + ipcp_options *ho = &ipcp_hisoptions[f->unit]; + ipcp_options *ao = &ipcp_allowoptions[f->unit]; +#ifdef OLD_CI_ADDRS + ipcp_options *go = &ipcp_gotoptions[f->unit]; +#endif + u_char *cip, *next; /* Pointer to current and next CIs */ + u_short cilen, citype; /* Parsed len, type */ + u_short cishort; /* Parsed short value */ + u32_t tl, ciaddr1; /* Parsed address values */ +#ifdef OLD_CI_ADDRS + u32_t ciaddr2; /* Parsed address values */ +#endif + int rc = CONFACK; /* Final packet return code */ + int orc; /* Individual option return code */ + u_char *p; /* Pointer to next char to parse */ + u_char *ucp = inp; /* Pointer to current output char */ + int l = *len; /* Length left */ + u_char maxslotindex, cflag; + int d; + + cis_received[f->unit] = 1; + + /* + * Reset all his options. + */ + BZERO(ho, sizeof(*ho)); + + /* + * Process all his options. + */ + next = inp; + while (l) { + orc = CONFACK; /* Assume success */ + cip = p = next; /* Remember begining of CI */ + if (l < 2 || /* Not enough data for CI header or */ + p[1] < 2 || /* CI length too small or */ + p[1] > l) { /* CI length too big? */ + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: bad CI length!\n")); + orc = CONFREJ; /* Reject bad CI */ + cilen = (u_short)l;/* Reject till end of packet */ + l = 0; /* Don't loop again */ + goto endswitch; + } + GETCHAR(citype, p); /* Parse CI type */ + GETCHAR(cilen, p); /* Parse CI length */ + l -= cilen; /* Adjust remaining length */ + next += cilen; /* Step to next CI */ + + switch (citype) { /* Check CI type */ +#ifdef OLD_CI_ADDRS /* Need to save space... */ + case CI_ADDRS: + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: received ADDRS\n")); + if (!ao->neg_addr || + cilen != CILEN_ADDRS) { /* Check CI length */ + orc = CONFREJ; /* Reject CI */ + break; + } + + /* + * If he has no address, or if we both have his address but + * disagree about it, then NAK it with our idea. + * In particular, if we don't know his address, but he does, + * then accept it. + */ + GETLONG(tl, p); /* Parse source address (his) */ + ciaddr1 = htonl(tl); + IPCPDEBUG(LOG_INFO, ("his addr %s\n", inet_ntoa(ciaddr1))); + if (ciaddr1 != wo->hisaddr + && (ciaddr1 == 0 || !wo->accept_remote)) { + orc = CONFNAK; + if (!reject_if_disagree) { + DECPTR(sizeof(u32_t), p); + tl = ntohl(wo->hisaddr); + PUTLONG(tl, p); + } + } else if (ciaddr1 == 0 && wo->hisaddr == 0) { + /* + * If neither we nor he knows his address, reject the option. + */ + orc = CONFREJ; + wo->req_addr = 0; /* don't NAK with 0.0.0.0 later */ + break; + } + + /* + * If he doesn't know our address, or if we both have our address + * but disagree about it, then NAK it with our idea. + */ + GETLONG(tl, p); /* Parse desination address (ours) */ + ciaddr2 = htonl(tl); + IPCPDEBUG(LOG_INFO, ("our addr %s\n", inet_ntoa(ciaddr2))); + if (ciaddr2 != wo->ouraddr) { + if (ciaddr2 == 0 || !wo->accept_local) { + orc = CONFNAK; + if (!reject_if_disagree) { + DECPTR(sizeof(u32_t), p); + tl = ntohl(wo->ouraddr); + PUTLONG(tl, p); + } + } else { + go->ouraddr = ciaddr2; /* accept peer's idea */ + } + } + + ho->neg_addr = 1; + ho->old_addrs = 1; + ho->hisaddr = ciaddr1; + ho->ouraddr = ciaddr2; + break; +#endif + + case CI_ADDR: + if (!ao->neg_addr) { + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Reject ADDR not allowed\n")); + orc = CONFREJ; /* Reject CI */ + break; + } else if (cilen != CILEN_ADDR) { /* Check CI length */ + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Reject ADDR bad len\n")); + orc = CONFREJ; /* Reject CI */ + break; + } + + /* + * If he has no address, or if we both have his address but + * disagree about it, then NAK it with our idea. + * In particular, if we don't know his address, but he does, + * then accept it. + */ + GETLONG(tl, p); /* Parse source address (his) */ + ciaddr1 = htonl(tl); + if (ciaddr1 != wo->hisaddr + && (ciaddr1 == 0 || !wo->accept_remote)) { + orc = CONFNAK; + if (!reject_if_disagree) { + DECPTR(sizeof(u32_t), p); + tl = ntohl(wo->hisaddr); + PUTLONG(tl, p); + } + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Nak ADDR %s\n", inet_ntoa(ciaddr1))); + } else if (ciaddr1 == 0 && wo->hisaddr == 0) { + /* + * Don't ACK an address of 0.0.0.0 - reject it instead. + */ + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Reject ADDR %s\n", inet_ntoa(ciaddr1))); + orc = CONFREJ; + wo->req_addr = 0; /* don't NAK with 0.0.0.0 later */ + break; + } + + ho->neg_addr = 1; + ho->hisaddr = ciaddr1; + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: ADDR %s\n", inet_ntoa(ciaddr1))); + break; + + case CI_MS_DNS1: + case CI_MS_DNS2: + /* Microsoft primary or secondary DNS request */ + d = citype == CI_MS_DNS2; + + /* If we do not have a DNS address then we cannot send it */ + if (ao->dnsaddr[d] == 0 || + cilen != CILEN_ADDR) { /* Check CI length */ + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Rejecting DNS%d Request\n", d+1)); + orc = CONFREJ; /* Reject CI */ + break; + } + GETLONG(tl, p); + if (htonl(tl) != ao->dnsaddr[d]) { + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Naking DNS%d Request %s\n", + d+1, inet_ntoa(tl))); + DECPTR(sizeof(u32_t), p); + tl = ntohl(ao->dnsaddr[d]); + PUTLONG(tl, p); + orc = CONFNAK; + } + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: received DNS%d Request\n", d+1)); + break; + + case CI_MS_WINS1: + case CI_MS_WINS2: + /* Microsoft primary or secondary WINS request */ + d = citype == CI_MS_WINS2; + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: received WINS%d Request\n", d+1)); + + /* If we do not have a DNS address then we cannot send it */ + if (ao->winsaddr[d] == 0 || + cilen != CILEN_ADDR) { /* Check CI length */ + orc = CONFREJ; /* Reject CI */ + break; + } + GETLONG(tl, p); + if (htonl(tl) != ao->winsaddr[d]) { + DECPTR(sizeof(u32_t), p); + tl = ntohl(ao->winsaddr[d]); + PUTLONG(tl, p); + orc = CONFNAK; + } + break; + + case CI_COMPRESSTYPE: + if (!ao->neg_vj) { + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Rejecting COMPRESSTYPE not allowed\n")); + orc = CONFREJ; + break; + } else if (cilen != CILEN_VJ && cilen != CILEN_COMPRESS) { + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Rejecting COMPRESSTYPE len=%d\n", cilen)); + orc = CONFREJ; + break; + } + GETSHORT(cishort, p); + + if (!(cishort == IPCP_VJ_COMP || + (cishort == IPCP_VJ_COMP_OLD && cilen == CILEN_COMPRESS))) { + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Rejecting COMPRESSTYPE %d\n", cishort)); + orc = CONFREJ; + break; + } + + ho->neg_vj = 1; + ho->vj_protocol = cishort; + if (cilen == CILEN_VJ) { + GETCHAR(maxslotindex, p); + if (maxslotindex > ao->maxslotindex) { + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Naking VJ max slot %d\n", maxslotindex)); + orc = CONFNAK; + if (!reject_if_disagree) { + DECPTR(1, p); + PUTCHAR(ao->maxslotindex, p); + } + } + GETCHAR(cflag, p); + if (cflag && !ao->cflag) { + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Naking VJ cflag %d\n", cflag)); + orc = CONFNAK; + if (!reject_if_disagree) { + DECPTR(1, p); + PUTCHAR(wo->cflag, p); + } + } + ho->maxslotindex = maxslotindex; + ho->cflag = cflag; + } else { + ho->old_vj = 1; + ho->maxslotindex = MAX_SLOTS - 1; + ho->cflag = 1; + } + IPCPDEBUG(LOG_INFO, ( + "ipcp_reqci: received COMPRESSTYPE p=%d old=%d maxslot=%d cflag=%d\n", + ho->vj_protocol, ho->old_vj, ho->maxslotindex, ho->cflag)); + break; + + default: + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Rejecting unknown CI type %d\n", citype)); + orc = CONFREJ; + break; + } + +endswitch: + if (orc == CONFACK && /* Good CI */ + rc != CONFACK) { /* but prior CI wasnt? */ + continue; /* Don't send this one */ + } + + if (orc == CONFNAK) { /* Nak this CI? */ + if (reject_if_disagree) { /* Getting fed up with sending NAKs? */ + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Rejecting too many naks\n")); + orc = CONFREJ; /* Get tough if so */ + } else { + if (rc == CONFREJ) { /* Rejecting prior CI? */ + continue; /* Don't send this one */ + } + if (rc == CONFACK) { /* Ack'd all prior CIs? */ + rc = CONFNAK; /* Not anymore... */ + ucp = inp; /* Backup */ + } + } + } + + if (orc == CONFREJ && /* Reject this CI */ + rc != CONFREJ) { /* but no prior ones? */ + rc = CONFREJ; + ucp = inp; /* Backup */ + } + + /* Need to move CI? */ + if (ucp != cip) { + BCOPY(cip, ucp, cilen); /* Move it */ + } + + /* Update output pointer */ + INCPTR(cilen, ucp); + } + + /* + * If we aren't rejecting this packet, and we want to negotiate + * their address, and they didn't send their address, then we + * send a NAK with a CI_ADDR option appended. We assume the + * input buffer is long enough that we can append the extra + * option safely. + */ + if (rc != CONFREJ && !ho->neg_addr && + wo->req_addr && !reject_if_disagree) { + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: Requesting peer address\n")); + if (rc == CONFACK) { + rc = CONFNAK; + ucp = inp; /* reset pointer */ + wo->req_addr = 0; /* don't ask again */ + } + PUTCHAR(CI_ADDR, ucp); + PUTCHAR(CILEN_ADDR, ucp); + tl = ntohl(wo->hisaddr); + PUTLONG(tl, ucp); + } + + *len = (int)(ucp - inp); /* Compute output length */ + IPCPDEBUG(LOG_INFO, ("ipcp_reqci: returning Configure-%s\n", CODENAME(rc))); + return (rc); /* Return final code */ +} + + +#if 0 +/* + * ip_check_options - check that any IP-related options are OK, + * and assign appropriate defaults. + */ +static void +ip_check_options(u_long localAddr) +{ + ipcp_options *wo = &ipcp_wantoptions[0]; + + /* + * Load our default IP address but allow the remote host to give us + * a new address. + */ + if (wo->ouraddr == 0 && !ppp_settings.disable_defaultip) { + wo->accept_local = 1; /* don't insist on this default value */ + wo->ouraddr = htonl(localAddr); + } +} +#endif + + +/* + * ipcp_up - IPCP has come UP. + * + * Configure the IP network interface appropriately and bring it up. + */ +static void +ipcp_up(fsm *f) +{ + u32_t mask; + ipcp_options *ho = &ipcp_hisoptions[f->unit]; + ipcp_options *go = &ipcp_gotoptions[f->unit]; + ipcp_options *wo = &ipcp_wantoptions[f->unit]; + + np_up(f->unit, PPP_IP); + IPCPDEBUG(LOG_INFO, ("ipcp: up\n")); + + /* + * We must have a non-zero IP address for both ends of the link. + */ + if (!ho->neg_addr) { + ho->hisaddr = wo->hisaddr; + } + + if (ho->hisaddr == 0) { + IPCPDEBUG(LOG_ERR, ("Could not determine remote IP address\n")); + ipcp_close(f->unit, "Could not determine remote IP address"); + return; + } + if (go->ouraddr == 0) { + IPCPDEBUG(LOG_ERR, ("Could not determine local IP address\n")); + ipcp_close(f->unit, "Could not determine local IP address"); + return; + } + + if (ppp_settings.usepeerdns && (go->dnsaddr[0] || go->dnsaddr[1])) { + /*pppGotDNSAddrs(go->dnsaddr[0], go->dnsaddr[1]);*/ + } + + /* + * Check that the peer is allowed to use the IP address it wants. + */ + if (!auth_ip_addr(f->unit, ho->hisaddr)) { + IPCPDEBUG(LOG_ERR, ("Peer is not authorized to use remote address %s\n", + inet_ntoa(ho->hisaddr))); + ipcp_close(f->unit, "Unauthorized remote IP address"); + return; + } + + /* set tcp compression */ + sifvjcomp(f->unit, ho->neg_vj, ho->cflag, ho->maxslotindex); + + /* + * Set IP addresses and (if specified) netmask. + */ + mask = GetMask(go->ouraddr); + + if (!sifaddr(f->unit, go->ouraddr, ho->hisaddr, mask, go->dnsaddr[0], go->dnsaddr[1])) { + IPCPDEBUG(LOG_WARNING, ("sifaddr failed\n")); + ipcp_close(f->unit, "Interface configuration failed"); + return; + } + + /* bring the interface up for IP */ + if (!sifup(f->unit)) { + IPCPDEBUG(LOG_WARNING, ("sifup failed\n")); + ipcp_close(f->unit, "Interface configuration failed"); + return; + } + + sifnpmode(f->unit, PPP_IP, NPMODE_PASS); + + /* assign a default route through the interface if required */ + if (ipcp_wantoptions[f->unit].default_route) { + if (sifdefaultroute(f->unit, go->ouraddr, ho->hisaddr)) { + default_route_set[f->unit] = 1; + } + } + + IPCPDEBUG(LOG_NOTICE, ("local IP address %s\n", inet_ntoa(go->ouraddr))); + IPCPDEBUG(LOG_NOTICE, ("remote IP address %s\n", inet_ntoa(ho->hisaddr))); + if (go->dnsaddr[0]) { + IPCPDEBUG(LOG_NOTICE, ("primary DNS address %s\n", inet_ntoa(go->dnsaddr[0]))); + } + if (go->dnsaddr[1]) { + IPCPDEBUG(LOG_NOTICE, ("secondary DNS address %s\n", inet_ntoa(go->dnsaddr[1]))); + } +} + + +/* + * ipcp_down - IPCP has gone DOWN. + * + * Take the IP network interface down, clear its addresses + * and delete routes through it. + */ +static void +ipcp_down(fsm *f) +{ + IPCPDEBUG(LOG_INFO, ("ipcp: down\n")); + np_down(f->unit, PPP_IP); + sifvjcomp(f->unit, 0, 0, 0); + + sifdown(f->unit); + ipcp_clear_addrs(f->unit); +} + + +/* + * ipcp_clear_addrs() - clear the interface addresses, routes, etc. + */ +static void +ipcp_clear_addrs(int unit) +{ + u32_t ouraddr, hisaddr; + + ouraddr = ipcp_gotoptions[unit].ouraddr; + hisaddr = ipcp_hisoptions[unit].hisaddr; + if (default_route_set[unit]) { + cifdefaultroute(unit, ouraddr, hisaddr); + default_route_set[unit] = 0; + } + cifaddr(unit, ouraddr, hisaddr); +} + + +/* + * ipcp_finished - possibly shut down the lower layers. + */ +static void +ipcp_finished(fsm *f) +{ + np_finished(f->unit, PPP_IP); +} + +#if PPP_ADDITIONAL_CALLBACKS +static int +ipcp_printpkt(u_char *p, int plen, void (*printer) (void *, char *, ...), void *arg) +{ + LWIP_UNUSED_ARG(p); + LWIP_UNUSED_ARG(plen); + LWIP_UNUSED_ARG(printer); + LWIP_UNUSED_ARG(arg); + return 0; +} + +/* + * ip_active_pkt - see if this IP packet is worth bringing the link up for. + * We don't bring the link up for IP fragments or for TCP FIN packets + * with no data. + */ +#define IP_HDRLEN 20 /* bytes */ +#define IP_OFFMASK 0x1fff +#define IPPROTO_TCP 6 +#define TCP_HDRLEN 20 +#define TH_FIN 0x01 + +/* + * We use these macros because the IP header may be at an odd address, + * and some compilers might use word loads to get th_off or ip_hl. + */ + +#define net_short(x) (((x)[0] << 8) + (x)[1]) +#define get_iphl(x) (((unsigned char *)(x))[0] & 0xF) +#define get_ipoff(x) net_short((unsigned char *)(x) + 6) +#define get_ipproto(x) (((unsigned char *)(x))[9]) +#define get_tcpoff(x) (((unsigned char *)(x))[12] >> 4) +#define get_tcpflags(x) (((unsigned char *)(x))[13]) + +static int +ip_active_pkt(u_char *pkt, int len) +{ + u_char *tcp; + int hlen; + + len -= PPP_HDRLEN; + pkt += PPP_HDRLEN; + if (len < IP_HDRLEN) { + return 0; + } + if ((get_ipoff(pkt) & IP_OFFMASK) != 0) { + return 0; + } + if (get_ipproto(pkt) != IPPROTO_TCP) { + return 1; + } + hlen = get_iphl(pkt) * 4; + if (len < hlen + TCP_HDRLEN) { + return 0; + } + tcp = pkt + hlen; + if ((get_tcpflags(tcp) & TH_FIN) != 0 && len == hlen + get_tcpoff(tcp) * 4) { + return 0; + } + return 1; +} +#endif /* PPP_ADDITIONAL_CALLBACKS */ + +#endif /* PPP_SUPPORT */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/ipcp.h b/third_party/lwip-1.4.1/src/netif/ppp/ipcp.h new file mode 100644 index 0000000..9ef748e --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/ipcp.h @@ -0,0 +1,106 @@ +/***************************************************************************** +* ipcp.h - PPP IP NCP: Internet Protocol Network Control Protocol header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-12-04 Guy Lancaster , Global Election Systems Inc. +* Original derived from BSD codes. +*****************************************************************************/ +/* + * ipcp.h - IP Control Protocol definitions. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * $Id: ipcp.h,v 1.4 2010/01/18 20:49:43 goldsimon Exp $ + */ + +#ifndef IPCP_H +#define IPCP_H + +/* + * Options. + */ +#define CI_ADDRS 1 /* IP Addresses */ +#define CI_COMPRESSTYPE 2 /* Compression Type */ +#define CI_ADDR 3 + +#define CI_MS_DNS1 129 /* Primary DNS value */ +#define CI_MS_WINS1 128 /* Primary WINS value */ +#define CI_MS_DNS2 131 /* Secondary DNS value */ +#define CI_MS_WINS2 130 /* Secondary WINS value */ + +#define IPCP_VJMODE_OLD 1 /* "old" mode (option # = 0x0037) */ +#define IPCP_VJMODE_RFC1172 2 /* "old-rfc"mode (option # = 0x002d) */ +#define IPCP_VJMODE_RFC1332 3 /* "new-rfc"mode (option # = 0x002d, */ + /* maxslot and slot number compression) */ + +#define IPCP_VJ_COMP 0x002d /* current value for VJ compression option */ +#define IPCP_VJ_COMP_OLD 0x0037 /* "old" (i.e, broken) value for VJ */ + /* compression option */ + +typedef struct ipcp_options { + u_int neg_addr : 1; /* Negotiate IP Address? */ + u_int old_addrs : 1; /* Use old (IP-Addresses) option? */ + u_int req_addr : 1; /* Ask peer to send IP address? */ + u_int default_route : 1; /* Assign default route through interface? */ + u_int proxy_arp : 1; /* Make proxy ARP entry for peer? */ + u_int neg_vj : 1; /* Van Jacobson Compression? */ + u_int old_vj : 1; /* use old (short) form of VJ option? */ + u_int accept_local : 1; /* accept peer's value for ouraddr */ + u_int accept_remote : 1; /* accept peer's value for hisaddr */ + u_int req_dns1 : 1; /* Ask peer to send primary DNS address? */ + u_int req_dns2 : 1; /* Ask peer to send secondary DNS address? */ + u_short vj_protocol; /* protocol value to use in VJ option */ + u_char maxslotindex; /* VJ slots - 1. */ + u_char cflag; /* VJ slot compression flag. */ + u32_t ouraddr, hisaddr; /* Addresses in NETWORK BYTE ORDER */ + u32_t dnsaddr[2]; /* Primary and secondary MS DNS entries */ + u32_t winsaddr[2]; /* Primary and secondary MS WINS entries */ +} ipcp_options; + +extern fsm ipcp_fsm[]; +extern ipcp_options ipcp_wantoptions[]; +extern ipcp_options ipcp_gotoptions[]; +extern ipcp_options ipcp_allowoptions[]; +extern ipcp_options ipcp_hisoptions[]; + +extern struct protent ipcp_protent; + +#endif /* IPCP_H */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/lcp.c b/third_party/lwip-1.4.1/src/netif/ppp/lcp.c new file mode 100644 index 0000000..b551a04 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/lcp.c @@ -0,0 +1,2066 @@ +/***************************************************************************** +* lcp.c - Network Link Control Protocol program file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 by Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-12-01 Guy Lancaster , Global Election Systems Inc. +* Original. +*****************************************************************************/ + +/* + * lcp.c - PPP Link Control Protocol. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + + +#include "lwip/opt.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#include "ppp_impl.h" +#include "pppdebug.h" + +#include "fsm.h" +#include "chap.h" +#include "magic.h" +#include "auth.h" +#include "lcp.h" + +#include + +#if PPPOE_SUPPORT +#include "netif/ppp_oe.h" +#else +#define PPPOE_MAXMTU PPP_MAXMRU +#endif + +#if 0 /* UNUSED */ +/* + * LCP-related command-line options. + */ +int lcp_echo_interval = 0; /* Interval between LCP echo-requests */ +int lcp_echo_fails = 0; /* Tolerance to unanswered echo-requests */ +bool lax_recv = 0; /* accept control chars in asyncmap */ + +static int setescape (char **); + +static option_t lcp_option_list[] = { + /* LCP options */ + /* list stripped for simplicity */ + {NULL} +}; +#endif /* UNUSED */ + +/* options */ +LinkPhase lcp_phase[NUM_PPP]; /* Phase of link session (RFC 1661) */ +static u_int lcp_echo_interval = LCP_ECHOINTERVAL; /* Interval between LCP echo-requests */ +static u_int lcp_echo_fails = LCP_MAXECHOFAILS; /* Tolerance to unanswered echo-requests */ + +/* global vars */ +static fsm lcp_fsm[NUM_PPP]; /* LCP fsm structure (global)*/ +lcp_options lcp_wantoptions[NUM_PPP]; /* Options that we want to request */ +lcp_options lcp_gotoptions[NUM_PPP]; /* Options that peer ack'd */ +lcp_options lcp_allowoptions[NUM_PPP]; /* Options we allow peer to request */ +lcp_options lcp_hisoptions[NUM_PPP]; /* Options that we ack'd */ +ext_accm xmit_accm[NUM_PPP]; /* extended transmit ACCM */ + +static u32_t lcp_echos_pending = 0; /* Number of outstanding echo msgs */ +static u32_t lcp_echo_number = 0; /* ID number of next echo frame */ +static u32_t lcp_echo_timer_running = 0; /* TRUE if a timer is running */ + +/* @todo: do we really need such a large buffer? The typical 1500 bytes seem too much. */ +static u_char nak_buffer[PPP_MRU]; /* where we construct a nak packet */ + +/* + * Callbacks for fsm code. (CI = Configuration Information) + */ +static void lcp_resetci (fsm*); /* Reset our CI */ +static int lcp_cilen (fsm*); /* Return length of our CI */ +static void lcp_addci (fsm*, u_char*, int*); /* Add our CI to pkt */ +static int lcp_ackci (fsm*, u_char*, int); /* Peer ack'd our CI */ +static int lcp_nakci (fsm*, u_char*, int); /* Peer nak'd our CI */ +static int lcp_rejci (fsm*, u_char*, int); /* Peer rej'd our CI */ +static int lcp_reqci (fsm*, u_char*, int*, int); /* Rcv peer CI */ +static void lcp_up (fsm*); /* We're UP */ +static void lcp_down (fsm*); /* We're DOWN */ +static void lcp_starting (fsm*); /* We need lower layer up */ +static void lcp_finished (fsm*); /* We need lower layer down */ +static int lcp_extcode (fsm*, int, u_char, u_char*, int); +static void lcp_rprotrej (fsm*, u_char*, int); + +/* + * routines to send LCP echos to peer + */ + +static void lcp_echo_lowerup (int); +static void lcp_echo_lowerdown (int); +static void LcpEchoTimeout (void*); +static void lcp_received_echo_reply (fsm*, int, u_char*, int); +static void LcpSendEchoRequest (fsm*); +static void LcpLinkFailure (fsm*); +static void LcpEchoCheck (fsm*); + +static fsm_callbacks lcp_callbacks = { /* LCP callback routines */ + lcp_resetci, /* Reset our Configuration Information */ + lcp_cilen, /* Length of our Configuration Information */ + lcp_addci, /* Add our Configuration Information */ + lcp_ackci, /* ACK our Configuration Information */ + lcp_nakci, /* NAK our Configuration Information */ + lcp_rejci, /* Reject our Configuration Information */ + lcp_reqci, /* Request peer's Configuration Information */ + lcp_up, /* Called when fsm reaches LS_OPENED state */ + lcp_down, /* Called when fsm leaves LS_OPENED state */ + lcp_starting, /* Called when we want the lower layer up */ + lcp_finished, /* Called when we want the lower layer down */ + NULL, /* Called when Protocol-Reject received */ + NULL, /* Retransmission is necessary */ + lcp_extcode, /* Called to handle LCP-specific codes */ + "LCP" /* String name of protocol */ +}; + +/* + * Protocol entry points. + * Some of these are called directly. + */ + +static void lcp_input (int, u_char *, int); +static void lcp_protrej (int); + +struct protent lcp_protent = { + PPP_LCP, + lcp_init, + lcp_input, + lcp_protrej, + lcp_lowerup, + lcp_lowerdown, + lcp_open, + lcp_close, +#if PPP_ADDITIONAL_CALLBACKS + lcp_printpkt, + NULL, +#endif /* PPP_ADDITIONAL_CALLBACKS */ + 1, + "LCP", +#if PPP_ADDITIONAL_CALLBACKS + NULL, + NULL, + NULL +#endif /* PPP_ADDITIONAL_CALLBACKS */ +}; + +int lcp_loopbackfail = DEFLOOPBACKFAIL; + +/* + * Length of each type of configuration option (in octets) + */ +#define CILEN_VOID 2 +#define CILEN_CHAR 3 +#define CILEN_SHORT 4 /* CILEN_VOID + sizeof(short) */ +#define CILEN_CHAP 5 /* CILEN_VOID + sizeof(short) + 1 */ +#define CILEN_LONG 6 /* CILEN_VOID + sizeof(long) */ +#define CILEN_LQR 8 /* CILEN_VOID + sizeof(short) + sizeof(long) */ +#define CILEN_CBCP 3 + +#define CODENAME(x) ((x) == CONFACK ? "ACK" : (x) == CONFNAK ? "NAK" : "REJ") + +#if 0 /* UNUSED */ +/* + * setescape - add chars to the set we escape on transmission. + */ +static int +setescape(argv) + char **argv; +{ + int n, ret; + char *p, *endp; + + p = *argv; + ret = 1; + while (*p) { + n = strtol(p, &endp, 16); + if (p == endp) { + option_error("escape parameter contains invalid hex number '%s'", p); + return 0; + } + p = endp; + if (n < 0 || n == 0x5E || n > 0xFF) { + option_error("can't escape character 0x%x", n); + ret = 0; + } else + xmit_accm[0][n >> 5] |= 1 << (n & 0x1F); + while (*p == ',' || *p == ' ') + ++p; + } + return ret; +} +#endif /* UNUSED */ + +/* + * lcp_init - Initialize LCP. + */ +void +lcp_init(int unit) +{ + fsm *f = &lcp_fsm[unit]; + lcp_options *wo = &lcp_wantoptions[unit]; + lcp_options *ao = &lcp_allowoptions[unit]; + + f->unit = unit; + f->protocol = PPP_LCP; + f->callbacks = &lcp_callbacks; + + fsm_init(f); + + wo->passive = 0; + wo->silent = 0; + wo->restart = 0; /* Set to 1 in kernels or multi-line implementations */ + wo->neg_mru = 1; + wo->mru = PPP_DEFMRU; + wo->neg_asyncmap = 1; + wo->asyncmap = 0x00000000l; /* Assume don't need to escape any ctl chars. */ + wo->neg_chap = 0; /* Set to 1 on server */ + wo->neg_upap = 0; /* Set to 1 on server */ + wo->chap_mdtype = CHAP_DIGEST_MD5; + wo->neg_magicnumber = 1; + wo->neg_pcompression = 1; + wo->neg_accompression = 1; + wo->neg_lqr = 0; /* no LQR implementation yet */ + wo->neg_cbcp = 0; + + ao->neg_mru = 1; + ao->mru = PPP_MAXMRU; + ao->neg_asyncmap = 1; + ao->asyncmap = 0x00000000l; /* Assume don't need to escape any ctl chars. */ + ao->neg_chap = (CHAP_SUPPORT != 0); + ao->chap_mdtype = CHAP_DIGEST_MD5; + ao->neg_upap = (PAP_SUPPORT != 0); + ao->neg_magicnumber = 1; + ao->neg_pcompression = 1; + ao->neg_accompression = 1; + ao->neg_lqr = 0; /* no LQR implementation yet */ + ao->neg_cbcp = (CBCP_SUPPORT != 0); + + /* + * Set transmit escape for the flag and escape characters plus anything + * set for the allowable options. + */ + memset(xmit_accm[unit], 0, sizeof(xmit_accm[0])); + xmit_accm[unit][15] = 0x60; + xmit_accm[unit][0] = (u_char)((ao->asyncmap & 0xFF)); + xmit_accm[unit][1] = (u_char)((ao->asyncmap >> 8) & 0xFF); + xmit_accm[unit][2] = (u_char)((ao->asyncmap >> 16) & 0xFF); + xmit_accm[unit][3] = (u_char)((ao->asyncmap >> 24) & 0xFF); + LCPDEBUG(LOG_INFO, ("lcp_init: xmit_accm=%X %X %X %X\n", + xmit_accm[unit][0], + xmit_accm[unit][1], + xmit_accm[unit][2], + xmit_accm[unit][3])); + + lcp_phase[unit] = PHASE_INITIALIZE; +} + + +/* + * lcp_open - LCP is allowed to come up. + */ +void +lcp_open(int unit) +{ + fsm *f = &lcp_fsm[unit]; + lcp_options *wo = &lcp_wantoptions[unit]; + + f->flags = 0; + if (wo->passive) { + f->flags |= OPT_PASSIVE; + } + if (wo->silent) { + f->flags |= OPT_SILENT; + } + fsm_open(f); + + lcp_phase[unit] = PHASE_ESTABLISH; +} + + +/* + * lcp_close - Take LCP down. + */ +void +lcp_close(int unit, char *reason) +{ + fsm *f = &lcp_fsm[unit]; + + if (lcp_phase[unit] != PHASE_DEAD) { + lcp_phase[unit] = PHASE_TERMINATE; + } + if (f->state == LS_STOPPED && f->flags & (OPT_PASSIVE|OPT_SILENT)) { + /* + * This action is not strictly according to the FSM in RFC1548, + * but it does mean that the program terminates if you do an + * lcp_close() in passive/silent mode when a connection hasn't + * been established. + */ + f->state = LS_CLOSED; + lcp_finished(f); + } else { + fsm_close(f, reason); + } +} + + +/* + * lcp_lowerup - The lower layer is up. + */ +void +lcp_lowerup(int unit) +{ + lcp_options *wo = &lcp_wantoptions[unit]; + + /* + * Don't use A/C or protocol compression on transmission, + * but accept A/C and protocol compressed packets + * if we are going to ask for A/C and protocol compression. + */ + ppp_set_xaccm(unit, &xmit_accm[unit]); + ppp_send_config(unit, PPP_MRU, 0xffffffffl, 0, 0); + ppp_recv_config(unit, PPP_MRU, 0x00000000l, + wo->neg_pcompression, wo->neg_accompression); + peer_mru[unit] = PPP_MRU; + lcp_allowoptions[unit].asyncmap = (u_long)xmit_accm[unit][0] + | ((u_long)xmit_accm[unit][1] << 8) + | ((u_long)xmit_accm[unit][2] << 16) + | ((u_long)xmit_accm[unit][3] << 24); + LCPDEBUG(LOG_INFO, ("lcp_lowerup: asyncmap=%X %X %X %X\n", + xmit_accm[unit][3], + xmit_accm[unit][2], + xmit_accm[unit][1], + xmit_accm[unit][0])); + + fsm_lowerup(&lcp_fsm[unit]); +} + + +/* + * lcp_lowerdown - The lower layer is down. + */ +void +lcp_lowerdown(int unit) +{ + fsm_lowerdown(&lcp_fsm[unit]); +} + + +/* + * lcp_input - Input LCP packet. + */ +static void +lcp_input(int unit, u_char *p, int len) +{ + fsm *f = &lcp_fsm[unit]; + + fsm_input(f, p, len); +} + + +/* + * lcp_extcode - Handle a LCP-specific code. + */ +static int +lcp_extcode(fsm *f, int code, u_char id, u_char *inp, int len) +{ + u_char *magp; + + switch( code ){ + case PROTREJ: + lcp_rprotrej(f, inp, len); + break; + + case ECHOREQ: + if (f->state != LS_OPENED) { + break; + } + LCPDEBUG(LOG_INFO, ("lcp: Echo-Request, Rcvd id %d\n", id)); + magp = inp; + PUTLONG(lcp_gotoptions[f->unit].magicnumber, magp); + fsm_sdata(f, ECHOREP, id, inp, len); + break; + + case ECHOREP: + lcp_received_echo_reply(f, id, inp, len); + break; + + case DISCREQ: + break; + + default: + return 0; + } + return 1; +} + + +/* + * lcp_rprotrej - Receive an Protocol-Reject. + * + * Figure out which protocol is rejected and inform it. + */ +static void +lcp_rprotrej(fsm *f, u_char *inp, int len) +{ + int i; + struct protent *protp; + u_short prot; + + if (len < (int)sizeof (u_short)) { + LCPDEBUG(LOG_INFO, ("lcp_rprotrej: Rcvd short Protocol-Reject packet!\n")); + return; + } + + GETSHORT(prot, inp); + + LCPDEBUG(LOG_INFO, ("lcp_rprotrej: Rcvd Protocol-Reject packet for %x!\n", prot)); + + /* + * Protocol-Reject packets received in any state other than the LCP + * LS_OPENED state SHOULD be silently discarded. + */ + if( f->state != LS_OPENED ) { + LCPDEBUG(LOG_INFO, ("Protocol-Reject discarded: LCP in state %d\n", f->state)); + return; + } + + /* + * Upcall the proper Protocol-Reject routine. + */ + for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i) { + if (protp->protocol == prot && protp->enabled_flag) { + (*protp->protrej)(f->unit); + return; + } + } + + LCPDEBUG(LOG_WARNING, ("Protocol-Reject for unsupported protocol 0x%x\n", prot)); +} + + +/* + * lcp_protrej - A Protocol-Reject was received. + */ +static void +lcp_protrej(int unit) +{ + LWIP_UNUSED_ARG(unit); + /* + * Can't reject LCP! + */ + LCPDEBUG(LOG_WARNING, ("lcp_protrej: Received Protocol-Reject for LCP!\n")); + fsm_protreject(&lcp_fsm[unit]); +} + + +/* + * lcp_sprotrej - Send a Protocol-Reject for some protocol. + */ +void +lcp_sprotrej(int unit, u_char *p, int len) +{ + /* + * Send back the protocol and the information field of the + * rejected packet. We only get here if LCP is in the LS_OPENED state. + */ + + fsm_sdata(&lcp_fsm[unit], PROTREJ, ++lcp_fsm[unit].id, p, len); +} + + +/* + * lcp_resetci - Reset our CI. + */ +static void +lcp_resetci(fsm *f) +{ + lcp_wantoptions[f->unit].magicnumber = magic(); + lcp_wantoptions[f->unit].numloops = 0; + lcp_gotoptions[f->unit] = lcp_wantoptions[f->unit]; + peer_mru[f->unit] = PPP_MRU; + auth_reset(f->unit); +} + + +/* + * lcp_cilen - Return length of our CI. + */ +static int +lcp_cilen(fsm *f) +{ + lcp_options *go = &lcp_gotoptions[f->unit]; + +#define LENCIVOID(neg) ((neg) ? CILEN_VOID : 0) +#define LENCICHAP(neg) ((neg) ? CILEN_CHAP : 0) +#define LENCISHORT(neg) ((neg) ? CILEN_SHORT : 0) +#define LENCILONG(neg) ((neg) ? CILEN_LONG : 0) +#define LENCILQR(neg) ((neg) ? CILEN_LQR: 0) +#define LENCICBCP(neg) ((neg) ? CILEN_CBCP: 0) + /* + * NB: we only ask for one of CHAP and UPAP, even if we will + * accept either. + */ + return (LENCISHORT(go->neg_mru && go->mru != PPP_DEFMRU) + + LENCILONG(go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl) + + LENCICHAP(go->neg_chap) + + LENCISHORT(!go->neg_chap && go->neg_upap) + + LENCILQR(go->neg_lqr) + + LENCICBCP(go->neg_cbcp) + + LENCILONG(go->neg_magicnumber) + + LENCIVOID(go->neg_pcompression) + + LENCIVOID(go->neg_accompression)); +} + + +/* + * lcp_addci - Add our desired CIs to a packet. + */ +static void +lcp_addci(fsm *f, u_char *ucp, int *lenp) +{ + lcp_options *go = &lcp_gotoptions[f->unit]; + u_char *start_ucp = ucp; + +#define ADDCIVOID(opt, neg) \ + if (neg) { \ + LCPDEBUG(LOG_INFO, ("lcp_addci: opt=%d\n", opt)); \ + PUTCHAR(opt, ucp); \ + PUTCHAR(CILEN_VOID, ucp); \ + } +#define ADDCISHORT(opt, neg, val) \ + if (neg) { \ + LCPDEBUG(LOG_INFO, ("lcp_addci: INT opt=%d %X\n", opt, val)); \ + PUTCHAR(opt, ucp); \ + PUTCHAR(CILEN_SHORT, ucp); \ + PUTSHORT(val, ucp); \ + } +#define ADDCICHAP(opt, neg, val, digest) \ + if (neg) { \ + LCPDEBUG(LOG_INFO, ("lcp_addci: CHAP opt=%d %X\n", opt, val)); \ + PUTCHAR(opt, ucp); \ + PUTCHAR(CILEN_CHAP, ucp); \ + PUTSHORT(val, ucp); \ + PUTCHAR(digest, ucp); \ + } +#define ADDCILONG(opt, neg, val) \ + if (neg) { \ + LCPDEBUG(LOG_INFO, ("lcp_addci: L opt=%d %lX\n", opt, val)); \ + PUTCHAR(opt, ucp); \ + PUTCHAR(CILEN_LONG, ucp); \ + PUTLONG(val, ucp); \ + } +#define ADDCILQR(opt, neg, val) \ + if (neg) { \ + LCPDEBUG(LOG_INFO, ("lcp_addci: LQR opt=%d %lX\n", opt, val)); \ + PUTCHAR(opt, ucp); \ + PUTCHAR(CILEN_LQR, ucp); \ + PUTSHORT(PPP_LQR, ucp); \ + PUTLONG(val, ucp); \ + } +#define ADDCICHAR(opt, neg, val) \ + if (neg) { \ + LCPDEBUG(LOG_INFO, ("lcp_addci: CHAR opt=%d %X '%z'\n", opt, val, val)); \ + PUTCHAR(opt, ucp); \ + PUTCHAR(CILEN_CHAR, ucp); \ + PUTCHAR(val, ucp); \ + } + + ADDCISHORT(CI_MRU, go->neg_mru && go->mru != PPP_DEFMRU, go->mru); + ADDCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl, go->asyncmap); + ADDCICHAP(CI_AUTHTYPE, go->neg_chap, PPP_CHAP, go->chap_mdtype); + ADDCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP); + ADDCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period); + ADDCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT); + ADDCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber); + ADDCIVOID(CI_PCOMPRESSION, go->neg_pcompression); + ADDCIVOID(CI_ACCOMPRESSION, go->neg_accompression); + + if (ucp - start_ucp != *lenp) { + /* this should never happen, because peer_mtu should be 1500 */ + LCPDEBUG(LOG_ERR, ("Bug in lcp_addci: wrong length\n")); + } +} + + +/* + * lcp_ackci - Ack our CIs. + * This should not modify any state if the Ack is bad. + * + * Returns: + * 0 - Ack was bad. + * 1 - Ack was good. + */ +static int +lcp_ackci(fsm *f, u_char *p, int len) +{ + lcp_options *go = &lcp_gotoptions[f->unit]; + u_char cilen, citype, cichar; + u_short cishort; + u32_t cilong; + + /* + * CIs must be in exactly the same order that we sent. + * Check packet length and CI length at each step. + * If we find any deviations, then this packet is bad. + */ +#define ACKCIVOID(opt, neg) \ + if (neg) { \ + if ((len -= CILEN_VOID) < 0) \ + goto bad; \ + GETCHAR(citype, p); \ + GETCHAR(cilen, p); \ + if (cilen != CILEN_VOID || citype != opt) \ + goto bad; \ + } +#define ACKCISHORT(opt, neg, val) \ + if (neg) { \ + if ((len -= CILEN_SHORT) < 0) \ + goto bad; \ + GETCHAR(citype, p); \ + GETCHAR(cilen, p); \ + if (cilen != CILEN_SHORT || citype != opt) \ + goto bad; \ + GETSHORT(cishort, p); \ + if (cishort != val) \ + goto bad; \ + } +#define ACKCICHAR(opt, neg, val) \ + if (neg) { \ + if ((len -= CILEN_CHAR) < 0) \ + goto bad; \ + GETCHAR(citype, p); \ + GETCHAR(cilen, p); \ + if (cilen != CILEN_CHAR || citype != opt) \ + goto bad; \ + GETCHAR(cichar, p); \ + if (cichar != val) \ + goto bad; \ + } +#define ACKCICHAP(opt, neg, val, digest) \ + if (neg) { \ + if ((len -= CILEN_CHAP) < 0) \ + goto bad; \ + GETCHAR(citype, p); \ + GETCHAR(cilen, p); \ + if (cilen != CILEN_CHAP || citype != opt) \ + goto bad; \ + GETSHORT(cishort, p); \ + if (cishort != val) \ + goto bad; \ + GETCHAR(cichar, p); \ + if (cichar != digest) \ + goto bad; \ + } +#define ACKCILONG(opt, neg, val) \ + if (neg) { \ + if ((len -= CILEN_LONG) < 0) \ + goto bad; \ + GETCHAR(citype, p); \ + GETCHAR(cilen, p); \ + if (cilen != CILEN_LONG || citype != opt) \ + goto bad; \ + GETLONG(cilong, p); \ + if (cilong != val) \ + goto bad; \ + } +#define ACKCILQR(opt, neg, val) \ + if (neg) { \ + if ((len -= CILEN_LQR) < 0) \ + goto bad; \ + GETCHAR(citype, p); \ + GETCHAR(cilen, p); \ + if (cilen != CILEN_LQR || citype != opt) \ + goto bad; \ + GETSHORT(cishort, p); \ + if (cishort != PPP_LQR) \ + goto bad; \ + GETLONG(cilong, p); \ + if (cilong != val) \ + goto bad; \ + } + + ACKCISHORT(CI_MRU, go->neg_mru && go->mru != PPP_DEFMRU, go->mru); + ACKCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl, go->asyncmap); + ACKCICHAP(CI_AUTHTYPE, go->neg_chap, PPP_CHAP, go->chap_mdtype); + ACKCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP); + ACKCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period); + ACKCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT); + ACKCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber); + ACKCIVOID(CI_PCOMPRESSION, go->neg_pcompression); + ACKCIVOID(CI_ACCOMPRESSION, go->neg_accompression); + + /* + * If there are any remaining CIs, then this packet is bad. + */ + if (len != 0) { + goto bad; + } + LCPDEBUG(LOG_INFO, ("lcp_acki: Ack\n")); + return (1); +bad: + LCPDEBUG(LOG_WARNING, ("lcp_acki: received bad Ack!\n")); + return (0); +} + + +/* + * lcp_nakci - Peer has sent a NAK for some of our CIs. + * This should not modify any state if the Nak is bad + * or if LCP is in the LS_OPENED state. + * + * Returns: + * 0 - Nak was bad. + * 1 - Nak was good. + */ +static int +lcp_nakci(fsm *f, u_char *p, int len) +{ + lcp_options *go = &lcp_gotoptions[f->unit]; + lcp_options *wo = &lcp_wantoptions[f->unit]; + u_char citype, cichar, *next; + u_short cishort; + u32_t cilong; + lcp_options no; /* options we've seen Naks for */ + lcp_options try; /* options to request next time */ + int looped_back = 0; + int cilen; + + BZERO(&no, sizeof(no)); + try = *go; + + /* + * Any Nak'd CIs must be in exactly the same order that we sent. + * Check packet length and CI length at each step. + * If we find any deviations, then this packet is bad. + */ +#define NAKCIVOID(opt, neg, code) \ + if (go->neg && \ + len >= CILEN_VOID && \ + p[1] == CILEN_VOID && \ + p[0] == opt) { \ + len -= CILEN_VOID; \ + INCPTR(CILEN_VOID, p); \ + no.neg = 1; \ + code \ + } +#define NAKCICHAP(opt, neg, code) \ + if (go->neg && \ + len >= CILEN_CHAP && \ + p[1] == CILEN_CHAP && \ + p[0] == opt) { \ + len -= CILEN_CHAP; \ + INCPTR(2, p); \ + GETSHORT(cishort, p); \ + GETCHAR(cichar, p); \ + no.neg = 1; \ + code \ + } +#define NAKCICHAR(opt, neg, code) \ + if (go->neg && \ + len >= CILEN_CHAR && \ + p[1] == CILEN_CHAR && \ + p[0] == opt) { \ + len -= CILEN_CHAR; \ + INCPTR(2, p); \ + GETCHAR(cichar, p); \ + no.neg = 1; \ + code \ + } +#define NAKCISHORT(opt, neg, code) \ + if (go->neg && \ + len >= CILEN_SHORT && \ + p[1] == CILEN_SHORT && \ + p[0] == opt) { \ + len -= CILEN_SHORT; \ + INCPTR(2, p); \ + GETSHORT(cishort, p); \ + no.neg = 1; \ + code \ + } +#define NAKCILONG(opt, neg, code) \ + if (go->neg && \ + len >= CILEN_LONG && \ + p[1] == CILEN_LONG && \ + p[0] == opt) { \ + len -= CILEN_LONG; \ + INCPTR(2, p); \ + GETLONG(cilong, p); \ + no.neg = 1; \ + code \ + } +#define NAKCILQR(opt, neg, code) \ + if (go->neg && \ + len >= CILEN_LQR && \ + p[1] == CILEN_LQR && \ + p[0] == opt) { \ + len -= CILEN_LQR; \ + INCPTR(2, p); \ + GETSHORT(cishort, p); \ + GETLONG(cilong, p); \ + no.neg = 1; \ + code \ + } + + /* + * We don't care if they want to send us smaller packets than + * we want. Therefore, accept any MRU less than what we asked for, + * but then ignore the new value when setting the MRU in the kernel. + * If they send us a bigger MRU than what we asked, accept it, up to + * the limit of the default MRU we'd get if we didn't negotiate. + */ + if (go->neg_mru && go->mru != PPP_DEFMRU) { + NAKCISHORT(CI_MRU, neg_mru, + if (cishort <= wo->mru || cishort < PPP_DEFMRU) { + try.mru = cishort; + } + ); + } + + /* + * Add any characters they want to our (receive-side) asyncmap. + */ + if (go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl) { + NAKCILONG(CI_ASYNCMAP, neg_asyncmap, + try.asyncmap = go->asyncmap | cilong; + ); + } + + /* + * If they've nak'd our authentication-protocol, check whether + * they are proposing a different protocol, or a different + * hash algorithm for CHAP. + */ + if ((go->neg_chap || go->neg_upap) + && len >= CILEN_SHORT + && p[0] == CI_AUTHTYPE && p[1] >= CILEN_SHORT && p[1] <= len) { + cilen = p[1]; + len -= cilen; + no.neg_chap = go->neg_chap; + no.neg_upap = go->neg_upap; + INCPTR(2, p); + GETSHORT(cishort, p); + if (cishort == PPP_PAP && cilen == CILEN_SHORT) { + /* + * If we were asking for CHAP, they obviously don't want to do it. + * If we weren't asking for CHAP, then we were asking for PAP, + * in which case this Nak is bad. + */ + if (!go->neg_chap) { + goto bad; + } + try.neg_chap = 0; + + } else if (cishort == PPP_CHAP && cilen == CILEN_CHAP) { + GETCHAR(cichar, p); + if (go->neg_chap) { + /* + * We were asking for CHAP/MD5; they must want a different + * algorithm. If they can't do MD5, we'll have to stop + * asking for CHAP. + */ + if (cichar != go->chap_mdtype) { + try.neg_chap = 0; + } + } else { + /* + * Stop asking for PAP if we were asking for it. + */ + try.neg_upap = 0; + } + + } else { + /* + * We don't recognize what they're suggesting. + * Stop asking for what we were asking for. + */ + if (go->neg_chap) { + try.neg_chap = 0; + } else { + try.neg_upap = 0; + } + p += cilen - CILEN_SHORT; + } + } + + /* + * If they can't cope with our link quality protocol, we'll have + * to stop asking for LQR. We haven't got any other protocol. + * If they Nak the reporting period, take their value XXX ? + */ + NAKCILQR(CI_QUALITY, neg_lqr, + if (cishort != PPP_LQR) { + try.neg_lqr = 0; + } else { + try.lqr_period = cilong; + } + ); + + /* + * Only implementing CBCP...not the rest of the callback options + */ + NAKCICHAR(CI_CALLBACK, neg_cbcp, + try.neg_cbcp = 0; + ); + + /* + * Check for a looped-back line. + */ + NAKCILONG(CI_MAGICNUMBER, neg_magicnumber, + try.magicnumber = magic(); + looped_back = 1; + ); + + /* + * Peer shouldn't send Nak for protocol compression or + * address/control compression requests; they should send + * a Reject instead. If they send a Nak, treat it as a Reject. + */ + NAKCIVOID(CI_PCOMPRESSION, neg_pcompression, + try.neg_pcompression = 0; + ); + NAKCIVOID(CI_ACCOMPRESSION, neg_accompression, + try.neg_accompression = 0; + ); + + /* + * There may be remaining CIs, if the peer is requesting negotiation + * on an option that we didn't include in our request packet. + * If we see an option that we requested, or one we've already seen + * in this packet, then this packet is bad. + * If we wanted to respond by starting to negotiate on the requested + * option(s), we could, but we don't, because except for the + * authentication type and quality protocol, if we are not negotiating + * an option, it is because we were told not to. + * For the authentication type, the Nak from the peer means + * `let me authenticate myself with you' which is a bit pointless. + * For the quality protocol, the Nak means `ask me to send you quality + * reports', but if we didn't ask for them, we don't want them. + * An option we don't recognize represents the peer asking to + * negotiate some option we don't support, so ignore it. + */ + while (len > CILEN_VOID) { + GETCHAR(citype, p); + GETCHAR(cilen, p); + if (cilen < CILEN_VOID || (len -= cilen) < 0) { + goto bad; + } + next = p + cilen - 2; + + switch (citype) { + case CI_MRU: + if ((go->neg_mru && go->mru != PPP_DEFMRU) + || no.neg_mru || cilen != CILEN_SHORT) { + goto bad; + } + GETSHORT(cishort, p); + if (cishort < PPP_DEFMRU) { + try.mru = cishort; + } + break; + case CI_ASYNCMAP: + if ((go->neg_asyncmap && go->asyncmap != 0xFFFFFFFFl) + || no.neg_asyncmap || cilen != CILEN_LONG) { + goto bad; + } + break; + case CI_AUTHTYPE: + if (go->neg_chap || no.neg_chap || go->neg_upap || no.neg_upap) { + goto bad; + } + break; + case CI_MAGICNUMBER: + if (go->neg_magicnumber || no.neg_magicnumber || + cilen != CILEN_LONG) { + goto bad; + } + break; + case CI_PCOMPRESSION: + if (go->neg_pcompression || no.neg_pcompression + || cilen != CILEN_VOID) { + goto bad; + } + break; + case CI_ACCOMPRESSION: + if (go->neg_accompression || no.neg_accompression + || cilen != CILEN_VOID) { + goto bad; + } + break; + case CI_QUALITY: + if (go->neg_lqr || no.neg_lqr || cilen != CILEN_LQR) { + goto bad; + } + break; + } + p = next; + } + + /* If there is still anything left, this packet is bad. */ + if (len != 0) { + goto bad; + } + + /* + * OK, the Nak is good. Now we can update state. + */ + if (f->state != LS_OPENED) { + if (looped_back) { + if (++try.numloops >= lcp_loopbackfail) { + LCPDEBUG(LOG_NOTICE, ("Serial line is looped back.\n")); + lcp_close(f->unit, "Loopback detected"); + } + } else { + try.numloops = 0; + } + *go = try; + } + + return 1; + +bad: + LCPDEBUG(LOG_WARNING, ("lcp_nakci: received bad Nak!\n")); + return 0; +} + + +/* + * lcp_rejci - Peer has Rejected some of our CIs. + * This should not modify any state if the Reject is bad + * or if LCP is in the LS_OPENED state. + * + * Returns: + * 0 - Reject was bad. + * 1 - Reject was good. + */ +static int +lcp_rejci(fsm *f, u_char *p, int len) +{ + lcp_options *go = &lcp_gotoptions[f->unit]; + u_char cichar; + u_short cishort; + u32_t cilong; + lcp_options try; /* options to request next time */ + + try = *go; + + /* + * Any Rejected CIs must be in exactly the same order that we sent. + * Check packet length and CI length at each step. + * If we find any deviations, then this packet is bad. + */ +#define REJCIVOID(opt, neg) \ + if (go->neg && \ + len >= CILEN_VOID && \ + p[1] == CILEN_VOID && \ + p[0] == opt) { \ + len -= CILEN_VOID; \ + INCPTR(CILEN_VOID, p); \ + try.neg = 0; \ + LCPDEBUG(LOG_INFO, ("lcp_rejci: void opt %d rejected\n", opt)); \ + } +#define REJCISHORT(opt, neg, val) \ + if (go->neg && \ + len >= CILEN_SHORT && \ + p[1] == CILEN_SHORT && \ + p[0] == opt) { \ + len -= CILEN_SHORT; \ + INCPTR(2, p); \ + GETSHORT(cishort, p); \ + /* Check rejected value. */ \ + if (cishort != val) { \ + goto bad; \ + } \ + try.neg = 0; \ + LCPDEBUG(LOG_INFO, ("lcp_rejci: short opt %d rejected\n", opt)); \ + } +#define REJCICHAP(opt, neg, val, digest) \ + if (go->neg && \ + len >= CILEN_CHAP && \ + p[1] == CILEN_CHAP && \ + p[0] == opt) { \ + len -= CILEN_CHAP; \ + INCPTR(2, p); \ + GETSHORT(cishort, p); \ + GETCHAR(cichar, p); \ + /* Check rejected value. */ \ + if (cishort != val || cichar != digest) { \ + goto bad; \ + } \ + try.neg = 0; \ + try.neg_upap = 0; \ + LCPDEBUG(LOG_INFO, ("lcp_rejci: chap opt %d rejected\n", opt)); \ + } +#define REJCILONG(opt, neg, val) \ + if (go->neg && \ + len >= CILEN_LONG && \ + p[1] == CILEN_LONG && \ + p[0] == opt) { \ + len -= CILEN_LONG; \ + INCPTR(2, p); \ + GETLONG(cilong, p); \ + /* Check rejected value. */ \ + if (cilong != val) { \ + goto bad; \ + } \ + try.neg = 0; \ + LCPDEBUG(LOG_INFO, ("lcp_rejci: long opt %d rejected\n", opt)); \ + } +#define REJCILQR(opt, neg, val) \ + if (go->neg && \ + len >= CILEN_LQR && \ + p[1] == CILEN_LQR && \ + p[0] == opt) { \ + len -= CILEN_LQR; \ + INCPTR(2, p); \ + GETSHORT(cishort, p); \ + GETLONG(cilong, p); \ + /* Check rejected value. */ \ + if (cishort != PPP_LQR || cilong != val) { \ + goto bad; \ + } \ + try.neg = 0; \ + LCPDEBUG(LOG_INFO, ("lcp_rejci: LQR opt %d rejected\n", opt)); \ + } +#define REJCICBCP(opt, neg, val) \ + if (go->neg && \ + len >= CILEN_CBCP && \ + p[1] == CILEN_CBCP && \ + p[0] == opt) { \ + len -= CILEN_CBCP; \ + INCPTR(2, p); \ + GETCHAR(cichar, p); \ + /* Check rejected value. */ \ + if (cichar != val) { \ + goto bad; \ + } \ + try.neg = 0; \ + LCPDEBUG(LOG_INFO, ("lcp_rejci: Callback opt %d rejected\n", opt)); \ + } + + REJCISHORT(CI_MRU, neg_mru, go->mru); + REJCILONG(CI_ASYNCMAP, neg_asyncmap, go->asyncmap); + REJCICHAP(CI_AUTHTYPE, neg_chap, PPP_CHAP, go->chap_mdtype); + if (!go->neg_chap) { + REJCISHORT(CI_AUTHTYPE, neg_upap, PPP_PAP); + } + REJCILQR(CI_QUALITY, neg_lqr, go->lqr_period); + REJCICBCP(CI_CALLBACK, neg_cbcp, CBCP_OPT); + REJCILONG(CI_MAGICNUMBER, neg_magicnumber, go->magicnumber); + REJCIVOID(CI_PCOMPRESSION, neg_pcompression); + REJCIVOID(CI_ACCOMPRESSION, neg_accompression); + + /* + * If there are any remaining CIs, then this packet is bad. + */ + if (len != 0) { + goto bad; + } + /* + * Now we can update state. + */ + if (f->state != LS_OPENED) { + *go = try; + } + return 1; + +bad: + LCPDEBUG(LOG_WARNING, ("lcp_rejci: received bad Reject!\n")); + return 0; +} + + +/* + * lcp_reqci - Check the peer's requested CIs and send appropriate response. + * + * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified + * appropriately. If reject_if_disagree is non-zero, doesn't return + * CONFNAK; returns CONFREJ if it can't return CONFACK. + */ +static int +lcp_reqci(fsm *f, + u_char *inp, /* Requested CIs */ + int *lenp, /* Length of requested CIs */ + int reject_if_disagree) +{ + lcp_options *go = &lcp_gotoptions[f->unit]; + lcp_options *ho = &lcp_hisoptions[f->unit]; + lcp_options *ao = &lcp_allowoptions[f->unit]; + u_char *cip, *next; /* Pointer to current and next CIs */ + int cilen, citype; /* Parsed len, type */ + u_char cichar; /* Parsed char value */ + u_short cishort; /* Parsed short value */ + u32_t cilong; /* Parse long value */ + int rc = CONFACK; /* Final packet return code */ + int orc; /* Individual option return code */ + u_char *p; /* Pointer to next char to parse */ + u_char *rejp; /* Pointer to next char in reject frame */ + u_char *nakp; /* Pointer to next char in Nak frame */ + int l = *lenp; /* Length left */ +#if TRACELCP > 0 + char traceBuf[80]; + size_t traceNdx = 0; +#endif + + /* + * Reset all his options. + */ + BZERO(ho, sizeof(*ho)); + + /* + * Process all his options. + */ + next = inp; + nakp = nak_buffer; + rejp = inp; + while (l) { + orc = CONFACK; /* Assume success */ + cip = p = next; /* Remember begining of CI */ + if (l < 2 || /* Not enough data for CI header or */ + p[1] < 2 || /* CI length too small or */ + p[1] > l) { /* CI length too big? */ + LCPDEBUG(LOG_WARNING, ("lcp_reqci: bad CI length!\n")); + orc = CONFREJ; /* Reject bad CI */ + cilen = l; /* Reject till end of packet */ + l = 0; /* Don't loop again */ + citype = 0; + goto endswitch; + } + GETCHAR(citype, p); /* Parse CI type */ + GETCHAR(cilen, p); /* Parse CI length */ + l -= cilen; /* Adjust remaining length */ + next += cilen; /* Step to next CI */ + + switch (citype) { /* Check CI type */ + case CI_MRU: + if (!ao->neg_mru) { /* Allow option? */ + LCPDEBUG(LOG_INFO, ("lcp_reqci: Reject MRU - not allowed\n")); + orc = CONFREJ; /* Reject CI */ + break; + } else if (cilen != CILEN_SHORT) { /* Check CI length */ + LCPDEBUG(LOG_INFO, ("lcp_reqci: Reject MRU - bad length\n")); + orc = CONFREJ; /* Reject CI */ + break; + } + GETSHORT(cishort, p); /* Parse MRU */ + + /* + * He must be able to receive at least our minimum. + * No need to check a maximum. If he sends a large number, + * we'll just ignore it. + */ + if (cishort < PPP_MINMRU) { + LCPDEBUG(LOG_INFO, ("lcp_reqci: Nak - MRU too small\n")); + orc = CONFNAK; /* Nak CI */ + PUTCHAR(CI_MRU, nakp); + PUTCHAR(CILEN_SHORT, nakp); + PUTSHORT(PPP_MINMRU, nakp); /* Give him a hint */ + break; + } + ho->neg_mru = 1; /* Remember he sent MRU */ + ho->mru = cishort; /* And remember value */ +#if TRACELCP > 0 + snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " MRU %d", cishort); + traceNdx = strlen(traceBuf); +#endif + break; + + case CI_ASYNCMAP: + if (!ao->neg_asyncmap) { + LCPDEBUG(LOG_INFO, ("lcp_reqci: Reject ASYNCMAP not allowed\n")); + orc = CONFREJ; + break; + } else if (cilen != CILEN_LONG) { + LCPDEBUG(LOG_INFO, ("lcp_reqci: Reject ASYNCMAP bad length\n")); + orc = CONFREJ; + break; + } + GETLONG(cilong, p); + + /* + * Asyncmap must have set at least the bits + * which are set in lcp_allowoptions[unit].asyncmap. + */ + if ((ao->asyncmap & ~cilong) != 0) { + LCPDEBUG(LOG_INFO, ("lcp_reqci: Nak ASYNCMAP %lX missing %lX\n", + cilong, ao->asyncmap)); + orc = CONFNAK; + PUTCHAR(CI_ASYNCMAP, nakp); + PUTCHAR(CILEN_LONG, nakp); + PUTLONG(ao->asyncmap | cilong, nakp); + break; + } + ho->neg_asyncmap = 1; + ho->asyncmap = cilong; +#if TRACELCP > 0 + snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " ASYNCMAP=%lX", cilong); + traceNdx = strlen(traceBuf); +#endif + break; + + case CI_AUTHTYPE: + if (cilen < CILEN_SHORT) { + LCPDEBUG(LOG_INFO, ("lcp_reqci: Reject AUTHTYPE missing arg\n")); + orc = CONFREJ; + break; + } else if (!(ao->neg_upap || ao->neg_chap)) { + /* + * Reject the option if we're not willing to authenticate. + */ + LCPDEBUG(LOG_INFO, ("lcp_reqci: Reject AUTHTYPE not allowed\n")); + orc = CONFREJ; + break; + } + GETSHORT(cishort, p); + + /* + * Authtype must be UPAP or CHAP. + * + * Note: if both ao->neg_upap and ao->neg_chap are set, + * and the peer sends a Configure-Request with two + * authenticate-protocol requests, one for CHAP and one + * for UPAP, then we will reject the second request. + * Whether we end up doing CHAP or UPAP depends then on + * the ordering of the CIs in the peer's Configure-Request. + */ + + if (cishort == PPP_PAP) { + if (ho->neg_chap) { /* we've already accepted CHAP */ + LCPDEBUG(LOG_WARNING, ("lcp_reqci: Reject AUTHTYPE PAP already accepted\n")); + orc = CONFREJ; + break; + } else if (cilen != CILEN_SHORT) { + LCPDEBUG(LOG_WARNING, ("lcp_reqci: Reject AUTHTYPE PAP bad len\n")); + orc = CONFREJ; + break; + } + if (!ao->neg_upap) { /* we don't want to do PAP */ + LCPDEBUG(LOG_WARNING, ("lcp_reqci: Nak AUTHTYPE PAP not allowed\n")); + orc = CONFNAK; /* NAK it and suggest CHAP */ + PUTCHAR(CI_AUTHTYPE, nakp); + PUTCHAR(CILEN_CHAP, nakp); + PUTSHORT(PPP_CHAP, nakp); + PUTCHAR(ao->chap_mdtype, nakp); + break; + } + ho->neg_upap = 1; +#if TRACELCP > 0 + snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " PAP (%X)", cishort); + traceNdx = strlen(traceBuf); +#endif + break; + } + if (cishort == PPP_CHAP) { + if (ho->neg_upap) { /* we've already accepted PAP */ + LCPDEBUG(LOG_WARNING, ("lcp_reqci: Reject AUTHTYPE CHAP accepted PAP\n")); + orc = CONFREJ; + break; + } else if (cilen != CILEN_CHAP) { + LCPDEBUG(LOG_WARNING, ("lcp_reqci: Reject AUTHTYPE CHAP bad len\n")); + orc = CONFREJ; + break; + } + if (!ao->neg_chap) { /* we don't want to do CHAP */ + LCPDEBUG(LOG_WARNING, ("lcp_reqci: Nak AUTHTYPE CHAP not allowed\n")); + orc = CONFNAK; /* NAK it and suggest PAP */ + PUTCHAR(CI_AUTHTYPE, nakp); + PUTCHAR(CILEN_SHORT, nakp); + PUTSHORT(PPP_PAP, nakp); + break; + } + GETCHAR(cichar, p); /* get digest type*/ + if (cichar != CHAP_DIGEST_MD5 +#if MSCHAP_SUPPORT + && cichar != CHAP_MICROSOFT +#endif + ) { + LCPDEBUG(LOG_WARNING, ("lcp_reqci: Nak AUTHTYPE CHAP digest=%d\n", (int)cichar)); + orc = CONFNAK; + PUTCHAR(CI_AUTHTYPE, nakp); + PUTCHAR(CILEN_CHAP, nakp); + PUTSHORT(PPP_CHAP, nakp); + PUTCHAR(ao->chap_mdtype, nakp); + break; + } +#if TRACELCP > 0 + snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " CHAP %X,%d", cishort, (int)cichar); + traceNdx = strlen(traceBuf); +#endif + ho->chap_mdtype = cichar; /* save md type */ + ho->neg_chap = 1; + break; + } + + /* + * We don't recognize the protocol they're asking for. + * Nak it with something we're willing to do. + * (At this point we know ao->neg_upap || ao->neg_chap.) + */ + orc = CONFNAK; + PUTCHAR(CI_AUTHTYPE, nakp); + if (ao->neg_chap) { + LCPDEBUG(LOG_WARNING, ("lcp_reqci: Nak AUTHTYPE %d req CHAP\n", cishort)); + PUTCHAR(CILEN_CHAP, nakp); + PUTSHORT(PPP_CHAP, nakp); + PUTCHAR(ao->chap_mdtype, nakp); + } else { + LCPDEBUG(LOG_WARNING, ("lcp_reqci: Nak AUTHTYPE %d req PAP\n", cishort)); + PUTCHAR(CILEN_SHORT, nakp); + PUTSHORT(PPP_PAP, nakp); + } + break; + + case CI_QUALITY: + GETSHORT(cishort, p); + GETLONG(cilong, p); +#if TRACELCP > 0 + snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " QUALITY (%x %x)", cishort, (unsigned int) cilong); + traceNdx = strlen(traceBuf); +#endif + + if (!ao->neg_lqr || + cilen != CILEN_LQR) { + orc = CONFREJ; + break; + } + + /* + * Check the protocol and the reporting period. + * XXX When should we Nak this, and what with? + */ + if (cishort != PPP_LQR) { + orc = CONFNAK; + PUTCHAR(CI_QUALITY, nakp); + PUTCHAR(CILEN_LQR, nakp); + PUTSHORT(PPP_LQR, nakp); + PUTLONG(ao->lqr_period, nakp); + break; + } + break; + + case CI_MAGICNUMBER: + if (!(ao->neg_magicnumber || go->neg_magicnumber) || + cilen != CILEN_LONG) { + orc = CONFREJ; + break; + } + GETLONG(cilong, p); +#if TRACELCP > 0 + snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " MAGICNUMBER (%lX)", cilong); + traceNdx = strlen(traceBuf); +#endif + + /* + * He must have a different magic number. + */ + if (go->neg_magicnumber && + cilong == go->magicnumber) { + cilong = magic(); /* Don't put magic() inside macro! */ + orc = CONFNAK; + PUTCHAR(CI_MAGICNUMBER, nakp); + PUTCHAR(CILEN_LONG, nakp); + PUTLONG(cilong, nakp); + break; + } + ho->neg_magicnumber = 1; + ho->magicnumber = cilong; + break; + + + case CI_PCOMPRESSION: +#if TRACELCP > 0 + snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " PCOMPRESSION"); + traceNdx = strlen(traceBuf); +#endif + if (!ao->neg_pcompression || + cilen != CILEN_VOID) { + orc = CONFREJ; + break; + } + ho->neg_pcompression = 1; + break; + + case CI_ACCOMPRESSION: +#if TRACELCP > 0 + snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " ACCOMPRESSION"); + traceNdx = strlen(traceBuf); +#endif + if (!ao->neg_accompression || + cilen != CILEN_VOID) { + orc = CONFREJ; + break; + } + ho->neg_accompression = 1; + break; + + case CI_MRRU: +#if TRACELCP > 0 + snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " CI_MRRU"); + traceNdx = strlen(traceBuf); +#endif + orc = CONFREJ; + break; + + case CI_SSNHF: +#if TRACELCP > 0 + snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " CI_SSNHF"); + traceNdx = strlen(traceBuf); +#endif + orc = CONFREJ; + break; + + case CI_EPDISC: +#if TRACELCP > 0 + snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " CI_EPDISC"); + traceNdx = strlen(traceBuf); +#endif + orc = CONFREJ; + break; + + default: +#if TRACELCP + snprintf(&traceBuf[traceNdx], sizeof(traceBuf), " unknown %d", citype); + traceNdx = strlen(traceBuf); +#endif + orc = CONFREJ; + break; + } + + endswitch: +#if TRACELCP + if (traceNdx >= 80 - 32) { + LCPDEBUG(LOG_INFO, ("lcp_reqci: rcvd%s\n", traceBuf)); + traceNdx = 0; + } +#endif + if (orc == CONFACK && /* Good CI */ + rc != CONFACK) { /* but prior CI wasnt? */ + continue; /* Don't send this one */ + } + + if (orc == CONFNAK) { /* Nak this CI? */ + if (reject_if_disagree /* Getting fed up with sending NAKs? */ + && citype != CI_MAGICNUMBER) { + orc = CONFREJ; /* Get tough if so */ + } else { + if (rc == CONFREJ) { /* Rejecting prior CI? */ + continue; /* Don't send this one */ + } + rc = CONFNAK; + } + } + if (orc == CONFREJ) { /* Reject this CI */ + rc = CONFREJ; + if (cip != rejp) { /* Need to move rejected CI? */ + BCOPY(cip, rejp, cilen); /* Move it */ + } + INCPTR(cilen, rejp); /* Update output pointer */ + } + } + + /* + * If we wanted to send additional NAKs (for unsent CIs), the + * code would go here. The extra NAKs would go at *nakp. + * At present there are no cases where we want to ask the + * peer to negotiate an option. + */ + + switch (rc) { + case CONFACK: + *lenp = (int)(next - inp); + break; + case CONFNAK: + /* + * Copy the Nak'd options from the nak_buffer to the caller's buffer. + */ + *lenp = (int)(nakp - nak_buffer); + BCOPY(nak_buffer, inp, *lenp); + break; + case CONFREJ: + *lenp = (int)(rejp - inp); + break; + } + +#if TRACELCP > 0 + if (traceNdx > 0) { + LCPDEBUG(LOG_INFO, ("lcp_reqci: %s\n", traceBuf)); + } +#endif + LCPDEBUG(LOG_INFO, ("lcp_reqci: returning CONF%s.\n", CODENAME(rc))); + return (rc); /* Return final code */ +} + + +/* + * lcp_up - LCP has come UP. + */ +static void +lcp_up(fsm *f) +{ + lcp_options *wo = &lcp_wantoptions[f->unit]; + lcp_options *ho = &lcp_hisoptions[f->unit]; + lcp_options *go = &lcp_gotoptions[f->unit]; + lcp_options *ao = &lcp_allowoptions[f->unit]; + + if (!go->neg_magicnumber) { + go->magicnumber = 0; + } + if (!ho->neg_magicnumber) { + ho->magicnumber = 0; + } + + /* + * Set our MTU to the smaller of the MTU we wanted and + * the MRU our peer wanted. If we negotiated an MRU, + * set our MRU to the larger of value we wanted and + * the value we got in the negotiation. + */ + ppp_send_config(f->unit, LWIP_MIN(ao->mru, (ho->neg_mru? ho->mru: PPP_MRU)), + (ho->neg_asyncmap? ho->asyncmap: 0xffffffffl), + ho->neg_pcompression, ho->neg_accompression); + /* + * If the asyncmap hasn't been negotiated, we really should + * set the receive asyncmap to ffffffff, but we set it to 0 + * for backwards contemptibility. + */ + ppp_recv_config(f->unit, (go->neg_mru? LWIP_MAX(wo->mru, go->mru): PPP_MRU), + (go->neg_asyncmap? go->asyncmap: 0x00000000), + go->neg_pcompression, go->neg_accompression); + + if (ho->neg_mru) { + peer_mru[f->unit] = ho->mru; + } + + lcp_echo_lowerup(f->unit); /* Enable echo messages */ + + link_established(f->unit); /* The link is up; authenticate now */ +} + + +/* + * lcp_down - LCP has gone DOWN. + * + * Alert other protocols. + */ +static void +lcp_down(fsm *f) +{ + lcp_options *go = &lcp_gotoptions[f->unit]; + + lcp_echo_lowerdown(f->unit); + + link_down(f->unit); + + ppp_send_config(f->unit, PPP_MRU, 0xffffffffl, 0, 0); + ppp_recv_config(f->unit, PPP_MRU, + (go->neg_asyncmap? go->asyncmap: 0x00000000), + go->neg_pcompression, go->neg_accompression); + peer_mru[f->unit] = PPP_MRU; +} + + +/* + * lcp_starting - LCP needs the lower layer up. + */ +static void +lcp_starting(fsm *f) +{ + link_required(f->unit); /* lwip: currently does nothing */ +} + + +/* + * lcp_finished - LCP has finished with the lower layer. + */ +static void +lcp_finished(fsm *f) +{ + link_terminated(f->unit); /* we are finished with the link */ +} + + +#if PPP_ADDITIONAL_CALLBACKS +/* + * print_string - print a readable representation of a string using + * printer. + */ +static void +print_string( char *p, int len, void (*printer) (void *, char *, ...), void *arg) +{ + int c; + + printer(arg, "\""); + for (; len > 0; --len) { + c = *p++; + if (' ' <= c && c <= '~') { + if (c == '\\' || c == '"') { + printer(arg, "\\"); + } + printer(arg, "%c", c); + } else { + switch (c) { + case '\n': + printer(arg, "\\n"); + break; + case '\r': + printer(arg, "\\r"); + break; + case '\t': + printer(arg, "\\t"); + break; + default: + printer(arg, "\\%.3o", c); + } + } + } + printer(arg, "\""); +} + + +/* + * lcp_printpkt - print the contents of an LCP packet. + */ +static char *lcp_codenames[] = { + "ConfReq", "ConfAck", "ConfNak", "ConfRej", + "TermReq", "TermAck", "CodeRej", "ProtRej", + "EchoReq", "EchoRep", "DiscReq" +}; + +static int +lcp_printpkt( u_char *p, int plen, void (*printer) (void *, char *, ...), void *arg) +{ + int code, id, len, olen; + u_char *pstart, *optend; + u_short cishort; + u32_t cilong; + + if (plen < HEADERLEN) { + return 0; + } + pstart = p; + GETCHAR(code, p); + GETCHAR(id, p); + GETSHORT(len, p); + if (len < HEADERLEN || len > plen) { + return 0; + } + + if (code >= 1 && code <= sizeof(lcp_codenames) / sizeof(char *)) { + printer(arg, " %s", lcp_codenames[code-1]); + } else { + printer(arg, " code=0x%x", code); + } + printer(arg, " id=0x%x", id); + len -= HEADERLEN; + switch (code) { + case CONFREQ: + case CONFACK: + case CONFNAK: + case CONFREJ: + /* print option list */ + while (len >= 2) { + GETCHAR(code, p); + GETCHAR(olen, p); + p -= 2; + if (olen < 2 || olen > len) { + break; + } + printer(arg, " <"); + len -= olen; + optend = p + olen; + switch (code) { + case CI_MRU: + if (olen == CILEN_SHORT) { + p += 2; + GETSHORT(cishort, p); + printer(arg, "mru %d", cishort); + } + break; + case CI_ASYNCMAP: + if (olen == CILEN_LONG) { + p += 2; + GETLONG(cilong, p); + printer(arg, "asyncmap 0x%lx", cilong); + } + break; + case CI_AUTHTYPE: + if (olen >= CILEN_SHORT) { + p += 2; + printer(arg, "auth "); + GETSHORT(cishort, p); + switch (cishort) { + case PPP_PAP: + printer(arg, "pap"); + break; + case PPP_CHAP: + printer(arg, "chap"); + break; + default: + printer(arg, "0x%x", cishort); + } + } + break; + case CI_QUALITY: + if (olen >= CILEN_SHORT) { + p += 2; + printer(arg, "quality "); + GETSHORT(cishort, p); + switch (cishort) { + case PPP_LQR: + printer(arg, "lqr"); + break; + default: + printer(arg, "0x%x", cishort); + } + } + break; + case CI_CALLBACK: + if (olen >= CILEN_CHAR) { + p += 2; + printer(arg, "callback "); + GETSHORT(cishort, p); + switch (cishort) { + case CBCP_OPT: + printer(arg, "CBCP"); + break; + default: + printer(arg, "0x%x", cishort); + } + } + break; + case CI_MAGICNUMBER: + if (olen == CILEN_LONG) { + p += 2; + GETLONG(cilong, p); + printer(arg, "magic 0x%x", cilong); + } + break; + case CI_PCOMPRESSION: + if (olen == CILEN_VOID) { + p += 2; + printer(arg, "pcomp"); + } + break; + case CI_ACCOMPRESSION: + if (olen == CILEN_VOID) { + p += 2; + printer(arg, "accomp"); + } + break; + } + while (p < optend) { + GETCHAR(code, p); + printer(arg, " %.2x", code); + } + printer(arg, ">"); + } + break; + + case TERMACK: + case TERMREQ: + if (len > 0 && *p >= ' ' && *p < 0x7f) { + printer(arg, " "); + print_string((char*)p, len, printer, arg); + p += len; + len = 0; + } + break; + + case ECHOREQ: + case ECHOREP: + case DISCREQ: + if (len >= 4) { + GETLONG(cilong, p); + printer(arg, " magic=0x%x", cilong); + p += 4; + len -= 4; + } + break; + } + + /* print the rest of the bytes in the packet */ + for (; len > 0; --len) { + GETCHAR(code, p); + printer(arg, " %.2x", code); + } + + return (int)(p - pstart); +} +#endif /* PPP_ADDITIONAL_CALLBACKS */ + +/* + * Time to shut down the link because there is nothing out there. + */ +static void +LcpLinkFailure (fsm *f) +{ + if (f->state == LS_OPENED) { + LCPDEBUG(LOG_INFO, ("No response to %d echo-requests\n", lcp_echos_pending)); + LCPDEBUG(LOG_NOTICE, ("Serial link appears to be disconnected.\n")); + lcp_close(f->unit, "Peer not responding"); + } +} + +/* + * Timer expired for the LCP echo requests from this process. + */ +static void +LcpEchoCheck (fsm *f) +{ + LcpSendEchoRequest (f); + + /* + * Start the timer for the next interval. + */ + LWIP_ASSERT("lcp_echo_timer_running == 0", lcp_echo_timer_running == 0); + + TIMEOUT (LcpEchoTimeout, f, lcp_echo_interval); + lcp_echo_timer_running = 1; +} + +/* + * LcpEchoTimeout - Timer expired on the LCP echo + */ +static void +LcpEchoTimeout (void *arg) +{ + if (lcp_echo_timer_running != 0) { + lcp_echo_timer_running = 0; + LcpEchoCheck ((fsm *) arg); + } +} + +/* + * LcpEchoReply - LCP has received a reply to the echo + */ +static void +lcp_received_echo_reply (fsm *f, int id, u_char *inp, int len) +{ + u32_t magic; + + LWIP_UNUSED_ARG(id); + + /* Check the magic number - don't count replies from ourselves. */ + if (len < 4) { + LCPDEBUG(LOG_WARNING, ("lcp: received short Echo-Reply, length %d\n", len)); + return; + } + GETLONG(magic, inp); + if (lcp_gotoptions[f->unit].neg_magicnumber && magic == lcp_gotoptions[f->unit].magicnumber) { + LCPDEBUG(LOG_WARNING, ("appear to have received our own echo-reply!\n")); + return; + } + + /* Reset the number of outstanding echo frames */ + lcp_echos_pending = 0; +} + +/* + * LcpSendEchoRequest - Send an echo request frame to the peer + */ +static void +LcpSendEchoRequest (fsm *f) +{ + u32_t lcp_magic; + u_char pkt[4], *pktp; + + /* + * Detect the failure of the peer at this point. + */ + if (lcp_echo_fails != 0) { + if (lcp_echos_pending >= lcp_echo_fails) { + LcpLinkFailure(f); + lcp_echos_pending = 0; + } + } + + /* + * Make and send the echo request frame. + */ + if (f->state == LS_OPENED) { + lcp_magic = lcp_gotoptions[f->unit].magicnumber; + pktp = pkt; + PUTLONG(lcp_magic, pktp); + fsm_sdata(f, ECHOREQ, (u_char)(lcp_echo_number++ & 0xFF), pkt, (int)(pktp - pkt)); + ++lcp_echos_pending; + } +} + +/* + * lcp_echo_lowerup - Start the timer for the LCP frame + */ + +static void +lcp_echo_lowerup (int unit) +{ + fsm *f = &lcp_fsm[unit]; + + /* Clear the parameters for generating echo frames */ + lcp_echos_pending = 0; + lcp_echo_number = 0; + lcp_echo_timer_running = 0; + + /* If a timeout interval is specified then start the timer */ + if (lcp_echo_interval != 0) { + LcpEchoCheck (f); + } +} + +/* + * lcp_echo_lowerdown - Stop the timer for the LCP frame + */ + +static void +lcp_echo_lowerdown (int unit) +{ + fsm *f = &lcp_fsm[unit]; + + if (lcp_echo_timer_running != 0) { + UNTIMEOUT (LcpEchoTimeout, f); + lcp_echo_timer_running = 0; + } +} + +#endif /* PPP_SUPPORT */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/lcp.h b/third_party/lwip-1.4.1/src/netif/ppp/lcp.h new file mode 100644 index 0000000..49478c8 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/lcp.h @@ -0,0 +1,151 @@ +/***************************************************************************** +* lcp.h - Network Link Control Protocol header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-11-05 Guy Lancaster , Global Election Systems Inc. +* Original derived from BSD codes. +*****************************************************************************/ +/* + * lcp.h - Link Control Protocol definitions. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * $Id: lcp.h,v 1.4 2010/01/18 20:49:43 goldsimon Exp $ + */ + +#ifndef LCP_H +#define LCP_H +/* + * Options. + */ +#define CI_MRU 1 /* Maximum Receive Unit */ +#define CI_ASYNCMAP 2 /* Async Control Character Map */ +#define CI_AUTHTYPE 3 /* Authentication Type */ +#define CI_QUALITY 4 /* Quality Protocol */ +#define CI_MAGICNUMBER 5 /* Magic Number */ +#define CI_PCOMPRESSION 7 /* Protocol Field Compression */ +#define CI_ACCOMPRESSION 8 /* Address/Control Field Compression */ +#define CI_CALLBACK 13 /* callback */ +#define CI_MRRU 17 /* max reconstructed receive unit; multilink */ +#define CI_SSNHF 18 /* short sequence numbers for multilink */ +#define CI_EPDISC 19 /* endpoint discriminator */ + +/* + * LCP-specific packet types (code numbers). + */ +#define PROTREJ 8 /* Protocol Reject */ +#define ECHOREQ 9 /* Echo Request */ +#define ECHOREP 10 /* Echo Reply */ +#define DISCREQ 11 /* Discard Request */ +#define CBCP_OPT 6 /* Use callback control protocol */ + +/* + * The state of options is described by an lcp_options structure. + */ +typedef struct lcp_options { + u_int passive : 1; /* Don't die if we don't get a response */ + u_int silent : 1; /* Wait for the other end to start first */ + u_int restart : 1; /* Restart vs. exit after close */ + u_int neg_mru : 1; /* Negotiate the MRU? */ + u_int neg_asyncmap : 1; /* Negotiate the async map? */ + u_int neg_upap : 1; /* Ask for UPAP authentication? */ + u_int neg_chap : 1; /* Ask for CHAP authentication? */ + u_int neg_magicnumber : 1; /* Ask for magic number? */ + u_int neg_pcompression : 1; /* HDLC Protocol Field Compression? */ + u_int neg_accompression : 1; /* HDLC Address/Control Field Compression? */ + u_int neg_lqr : 1; /* Negotiate use of Link Quality Reports */ + u_int neg_cbcp : 1; /* Negotiate use of CBCP */ +#ifdef PPP_MULTILINK + u_int neg_mrru : 1; /* Negotiate multilink MRRU */ + u_int neg_ssnhf : 1; /* Negotiate short sequence numbers */ + u_int neg_endpoint : 1; /* Negotiate endpoint discriminator */ +#endif + u_short mru; /* Value of MRU */ +#ifdef PPP_MULTILINK + u_short mrru; /* Value of MRRU, and multilink enable */ +#endif + u_char chap_mdtype; /* which MD type (hashing algorithm) */ + u32_t asyncmap; /* Value of async map */ + u32_t magicnumber; + int numloops; /* Number of loops during magic number neg. */ + u32_t lqr_period; /* Reporting period for LQR 1/100ths second */ +#ifdef PPP_MULTILINK + struct epdisc endpoint; /* endpoint discriminator */ +#endif +} lcp_options; + +/* + * Values for phase from BSD pppd.h based on RFC 1661. + */ +typedef enum { + PHASE_DEAD = 0, + PHASE_INITIALIZE, + PHASE_ESTABLISH, + PHASE_AUTHENTICATE, + PHASE_CALLBACK, + PHASE_NETWORK, + PHASE_TERMINATE +} LinkPhase; + + + +extern LinkPhase lcp_phase[NUM_PPP]; /* Phase of link session (RFC 1661) */ +extern lcp_options lcp_wantoptions[]; +extern lcp_options lcp_gotoptions[]; +extern lcp_options lcp_allowoptions[]; +extern lcp_options lcp_hisoptions[]; +extern ext_accm xmit_accm[]; + + +void lcp_init (int); +void lcp_open (int); +void lcp_close (int, char *); +void lcp_lowerup (int); +void lcp_lowerdown(int); +void lcp_sprotrej (int, u_char *, int); /* send protocol reject */ + +extern struct protent lcp_protent; + +/* Default number of times we receive our magic number from the peer + before deciding the link is looped-back. */ +#define DEFLOOPBACKFAIL 10 + +#endif /* LCP_H */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/magic.c b/third_party/lwip-1.4.1/src/netif/ppp/magic.c new file mode 100644 index 0000000..0c53c83 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/magic.c @@ -0,0 +1,80 @@ +/***************************************************************************** +* magic.c - Network Random Number Generator program file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 by Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-12-04 Guy Lancaster , Global Election Systems Inc. +* Original based on BSD magic.c. +*****************************************************************************/ +/* + * magic.c - PPP Magic Number routines. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "lwip/opt.h" + +#if PPP_SUPPORT + +#include "ppp_impl.h" +#include "randm.h" +#include "magic.h" + + +/* + * magicInit - Initialize the magic number generator. + * + * Since we use another random number generator that has its own + * initialization, we do nothing here. + */ +void magicInit() +{ + return; +} + +/* + * magic - Returns the next magic number. + */ +u32_t magic() +{ + return avRandom(); +} + +#endif /* PPP_SUPPORT */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/magic.h b/third_party/lwip-1.4.1/src/netif/ppp/magic.h new file mode 100644 index 0000000..e308037 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/magic.h @@ -0,0 +1,63 @@ +/***************************************************************************** +* magic.h - Network Random Number Generator header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-12-04 Guy Lancaster , Global Election Systems Inc. +* Original derived from BSD codes. +*****************************************************************************/ +/* + * magic.h - PPP Magic Number definitions. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * $Id: magic.h,v 1.3 2010/01/18 20:49:43 goldsimon Exp $ + */ + +#ifndef MAGIC_H +#define MAGIC_H + +/* Initialize the magic number generator */ +void magicInit(void); + +/* Returns the next magic number */ +u32_t magic(void); + +#endif /* MAGIC_H */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/md5.c b/third_party/lwip-1.4.1/src/netif/ppp/md5.c new file mode 100644 index 0000000..befbbab --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/md5.c @@ -0,0 +1,320 @@ +/* + *********************************************************************** + ** md5.c -- the source code for MD5 routines ** + ** RSA Data Security, Inc. MD5 Message-Digest Algorithm ** + ** Created: 2/17/90 RLR ** + ** Revised: 1/91 SRD,AJ,BSK,JT Reference C ver., 7/10 constant corr. ** + *********************************************************************** + */ + +/* + *********************************************************************** + ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. ** + ** ** + ** License to copy and use this software is granted provided that ** + ** it is identified as the "RSA Data Security, Inc. MD5 Message- ** + ** Digest Algorithm" in all material mentioning or referencing this ** + ** software or this function. ** + ** ** + ** License is also granted to make and use derivative works ** + ** provided that such works are identified as "derived from the RSA ** + ** Data Security, Inc. MD5 Message-Digest Algorithm" in all ** + ** material mentioning or referencing the derived work. ** + ** ** + ** RSA Data Security, Inc. makes no representations concerning ** + ** either the merchantability of this software or the suitability ** + ** of this software for any particular purpose. It is provided "as ** + ** is" without express or implied warranty of any kind. ** + ** ** + ** These notices must be retained in any copies of any part of this ** + ** documentation and/or software. ** + *********************************************************************** + */ + +#include "lwip/opt.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#if CHAP_SUPPORT || MD5_SUPPORT + +#include "ppp_impl.h" +#include "pppdebug.h" + +#include "md5.h" + +#include + +/* + *********************************************************************** + ** Message-digest routines: ** + ** To form the message digest for a message M ** + ** (1) Initialize a context buffer mdContext using MD5Init ** + ** (2) Call MD5Update on mdContext and M ** + ** (3) Call MD5Final on mdContext ** + ** The message digest is now in mdContext->digest[0...15] ** + *********************************************************************** + */ + +/* forward declaration */ +static void Transform (u32_t *buf, u32_t *in); + +static unsigned char PADDING[64] = { + 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +/* F, G, H and I are basic MD5 functions */ +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +/* ROTATE_LEFT rotates x left n bits */ +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) + +/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */ +/* Rotation is separate from addition to prevent recomputation */ +#define FF(a, b, c, d, x, s, ac) \ + {(a) += F ((b), (c), (d)) + (x) + (u32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) \ + {(a) += G ((b), (c), (d)) + (x) + (u32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) \ + {(a) += H ((b), (c), (d)) + (x) + (u32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) \ + {(a) += I ((b), (c), (d)) + (x) + (u32_t)(ac); \ + (a) = ROTATE_LEFT ((a), (s)); \ + (a) += (b); \ + } + +#ifdef __STDC__ +#define UL(x) x##UL +#else +#ifdef WIN32 +#define UL(x) x##UL +#else +#define UL(x) x +#endif +#endif + +/* The routine MD5Init initializes the message-digest context + mdContext. All fields are set to zero. + */ +void +MD5Init (MD5_CTX *mdContext) +{ + mdContext->i[0] = mdContext->i[1] = (u32_t)0; + + /* Load magic initialization constants. */ + mdContext->buf[0] = (u32_t)0x67452301UL; + mdContext->buf[1] = (u32_t)0xefcdab89UL; + mdContext->buf[2] = (u32_t)0x98badcfeUL; + mdContext->buf[3] = (u32_t)0x10325476UL; +} + +/* The routine MD5Update updates the message-digest context to + account for the presence of each of the characters inBuf[0..inLen-1] + in the message whose digest is being computed. + */ +void +MD5Update(MD5_CTX *mdContext, unsigned char *inBuf, unsigned int inLen) +{ + u32_t in[16]; + int mdi; + unsigned int i, ii; + +#if 0 + PPPDEBUG(LOG_INFO, ("MD5Update: %u:%.*H\n", inLen, LWIP_MIN(inLen, 20) * 2, inBuf)); + PPPDEBUG(LOG_INFO, ("MD5Update: %u:%s\n", inLen, inBuf)); +#endif + + /* compute number of bytes mod 64 */ + mdi = (int)((mdContext->i[0] >> 3) & 0x3F); + + /* update number of bits */ + if ((mdContext->i[0] + ((u32_t)inLen << 3)) < mdContext->i[0]) { + mdContext->i[1]++; + } + mdContext->i[0] += ((u32_t)inLen << 3); + mdContext->i[1] += ((u32_t)inLen >> 29); + + while (inLen--) { + /* add new character to buffer, increment mdi */ + mdContext->in[mdi++] = *inBuf++; + + /* transform if necessary */ + if (mdi == 0x40) { + for (i = 0, ii = 0; i < 16; i++, ii += 4) { + in[i] = (((u32_t)mdContext->in[ii+3]) << 24) | + (((u32_t)mdContext->in[ii+2]) << 16) | + (((u32_t)mdContext->in[ii+1]) << 8) | + ((u32_t)mdContext->in[ii]); + } + Transform (mdContext->buf, in); + mdi = 0; + } + } +} + +/* The routine MD5Final terminates the message-digest computation and + ends with the desired message digest in mdContext->digest[0...15]. + */ +void +MD5Final (unsigned char hash[], MD5_CTX *mdContext) +{ + u32_t in[16]; + int mdi; + unsigned int i, ii; + unsigned int padLen; + + /* save number of bits */ + in[14] = mdContext->i[0]; + in[15] = mdContext->i[1]; + + /* compute number of bytes mod 64 */ + mdi = (int)((mdContext->i[0] >> 3) & 0x3F); + + /* pad out to 56 mod 64 */ + padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi); + MD5Update (mdContext, PADDING, padLen); + + /* append length in bits and transform */ + for (i = 0, ii = 0; i < 14; i++, ii += 4) { + in[i] = (((u32_t)mdContext->in[ii+3]) << 24) | + (((u32_t)mdContext->in[ii+2]) << 16) | + (((u32_t)mdContext->in[ii+1]) << 8) | + ((u32_t)mdContext->in[ii]); + } + Transform (mdContext->buf, in); + + /* store buffer in digest */ + for (i = 0, ii = 0; i < 4; i++, ii += 4) { + mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF); + mdContext->digest[ii+1] = + (unsigned char)((mdContext->buf[i] >> 8) & 0xFF); + mdContext->digest[ii+2] = + (unsigned char)((mdContext->buf[i] >> 16) & 0xFF); + mdContext->digest[ii+3] = + (unsigned char)((mdContext->buf[i] >> 24) & 0xFF); + } + SMEMCPY(hash, mdContext->digest, 16); +} + +/* Basic MD5 step. Transforms buf based on in. + */ +static void +Transform (u32_t *buf, u32_t *in) +{ + u32_t a = buf[0], b = buf[1], c = buf[2], d = buf[3]; + + /* Round 1 */ +#define S11 7 +#define S12 12 +#define S13 17 +#define S14 22 + FF ( a, b, c, d, in[ 0], S11, UL(3614090360)); /* 1 */ + FF ( d, a, b, c, in[ 1], S12, UL(3905402710)); /* 2 */ + FF ( c, d, a, b, in[ 2], S13, UL( 606105819)); /* 3 */ + FF ( b, c, d, a, in[ 3], S14, UL(3250441966)); /* 4 */ + FF ( a, b, c, d, in[ 4], S11, UL(4118548399)); /* 5 */ + FF ( d, a, b, c, in[ 5], S12, UL(1200080426)); /* 6 */ + FF ( c, d, a, b, in[ 6], S13, UL(2821735955)); /* 7 */ + FF ( b, c, d, a, in[ 7], S14, UL(4249261313)); /* 8 */ + FF ( a, b, c, d, in[ 8], S11, UL(1770035416)); /* 9 */ + FF ( d, a, b, c, in[ 9], S12, UL(2336552879)); /* 10 */ + FF ( c, d, a, b, in[10], S13, UL(4294925233)); /* 11 */ + FF ( b, c, d, a, in[11], S14, UL(2304563134)); /* 12 */ + FF ( a, b, c, d, in[12], S11, UL(1804603682)); /* 13 */ + FF ( d, a, b, c, in[13], S12, UL(4254626195)); /* 14 */ + FF ( c, d, a, b, in[14], S13, UL(2792965006)); /* 15 */ + FF ( b, c, d, a, in[15], S14, UL(1236535329)); /* 16 */ + + /* Round 2 */ +#define S21 5 +#define S22 9 +#define S23 14 +#define S24 20 + GG ( a, b, c, d, in[ 1], S21, UL(4129170786)); /* 17 */ + GG ( d, a, b, c, in[ 6], S22, UL(3225465664)); /* 18 */ + GG ( c, d, a, b, in[11], S23, UL( 643717713)); /* 19 */ + GG ( b, c, d, a, in[ 0], S24, UL(3921069994)); /* 20 */ + GG ( a, b, c, d, in[ 5], S21, UL(3593408605)); /* 21 */ + GG ( d, a, b, c, in[10], S22, UL( 38016083)); /* 22 */ + GG ( c, d, a, b, in[15], S23, UL(3634488961)); /* 23 */ + GG ( b, c, d, a, in[ 4], S24, UL(3889429448)); /* 24 */ + GG ( a, b, c, d, in[ 9], S21, UL( 568446438)); /* 25 */ + GG ( d, a, b, c, in[14], S22, UL(3275163606)); /* 26 */ + GG ( c, d, a, b, in[ 3], S23, UL(4107603335)); /* 27 */ + GG ( b, c, d, a, in[ 8], S24, UL(1163531501)); /* 28 */ + GG ( a, b, c, d, in[13], S21, UL(2850285829)); /* 29 */ + GG ( d, a, b, c, in[ 2], S22, UL(4243563512)); /* 30 */ + GG ( c, d, a, b, in[ 7], S23, UL(1735328473)); /* 31 */ + GG ( b, c, d, a, in[12], S24, UL(2368359562)); /* 32 */ + + /* Round 3 */ +#define S31 4 +#define S32 11 +#define S33 16 +#define S34 23 + HH ( a, b, c, d, in[ 5], S31, UL(4294588738)); /* 33 */ + HH ( d, a, b, c, in[ 8], S32, UL(2272392833)); /* 34 */ + HH ( c, d, a, b, in[11], S33, UL(1839030562)); /* 35 */ + HH ( b, c, d, a, in[14], S34, UL(4259657740)); /* 36 */ + HH ( a, b, c, d, in[ 1], S31, UL(2763975236)); /* 37 */ + HH ( d, a, b, c, in[ 4], S32, UL(1272893353)); /* 38 */ + HH ( c, d, a, b, in[ 7], S33, UL(4139469664)); /* 39 */ + HH ( b, c, d, a, in[10], S34, UL(3200236656)); /* 40 */ + HH ( a, b, c, d, in[13], S31, UL( 681279174)); /* 41 */ + HH ( d, a, b, c, in[ 0], S32, UL(3936430074)); /* 42 */ + HH ( c, d, a, b, in[ 3], S33, UL(3572445317)); /* 43 */ + HH ( b, c, d, a, in[ 6], S34, UL( 76029189)); /* 44 */ + HH ( a, b, c, d, in[ 9], S31, UL(3654602809)); /* 45 */ + HH ( d, a, b, c, in[12], S32, UL(3873151461)); /* 46 */ + HH ( c, d, a, b, in[15], S33, UL( 530742520)); /* 47 */ + HH ( b, c, d, a, in[ 2], S34, UL(3299628645)); /* 48 */ + + /* Round 4 */ +#define S41 6 +#define S42 10 +#define S43 15 +#define S44 21 + II ( a, b, c, d, in[ 0], S41, UL(4096336452)); /* 49 */ + II ( d, a, b, c, in[ 7], S42, UL(1126891415)); /* 50 */ + II ( c, d, a, b, in[14], S43, UL(2878612391)); /* 51 */ + II ( b, c, d, a, in[ 5], S44, UL(4237533241)); /* 52 */ + II ( a, b, c, d, in[12], S41, UL(1700485571)); /* 53 */ + II ( d, a, b, c, in[ 3], S42, UL(2399980690)); /* 54 */ + II ( c, d, a, b, in[10], S43, UL(4293915773)); /* 55 */ + II ( b, c, d, a, in[ 1], S44, UL(2240044497)); /* 56 */ + II ( a, b, c, d, in[ 8], S41, UL(1873313359)); /* 57 */ + II ( d, a, b, c, in[15], S42, UL(4264355552)); /* 58 */ + II ( c, d, a, b, in[ 6], S43, UL(2734768916)); /* 59 */ + II ( b, c, d, a, in[13], S44, UL(1309151649)); /* 60 */ + II ( a, b, c, d, in[ 4], S41, UL(4149444226)); /* 61 */ + II ( d, a, b, c, in[11], S42, UL(3174756917)); /* 62 */ + II ( c, d, a, b, in[ 2], S43, UL( 718787259)); /* 63 */ + II ( b, c, d, a, in[ 9], S44, UL(3951481745)); /* 64 */ + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} + +#endif /* CHAP_SUPPORT || MD5_SUPPORT */ + +#endif /* PPP_SUPPORT */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/md5.h b/third_party/lwip-1.4.1/src/netif/ppp/md5.h new file mode 100644 index 0000000..0bcb23c --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/md5.h @@ -0,0 +1,55 @@ +/* + *********************************************************************** + ** md5.h -- header file for implementation of MD5 ** + ** RSA Data Security, Inc. MD5 Message-Digest Algorithm ** + ** Created: 2/17/90 RLR ** + ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version ** + ** Revised (for MD5): RLR 4/27/91 ** + ** -- G modified to have y&~z instead of y&z ** + ** -- FF, GG, HH modified to add in last register done ** + ** -- Access pattern: round 2 works mod 5, round 3 works mod 3 ** + ** -- distinct additive constant for each step ** + ** -- round 4 added, working mod 7 ** + *********************************************************************** + */ + +/* + *********************************************************************** + ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. ** + ** ** + ** License to copy and use this software is granted provided that ** + ** it is identified as the "RSA Data Security, Inc. MD5 Message- ** + ** Digest Algorithm" in all material mentioning or referencing this ** + ** software or this function. ** + ** ** + ** License is also granted to make and use derivative works ** + ** provided that such works are identified as "derived from the RSA ** + ** Data Security, Inc. MD5 Message-Digest Algorithm" in all ** + ** material mentioning or referencing the derived work. ** + ** ** + ** RSA Data Security, Inc. makes no representations concerning ** + ** either the merchantability of this software or the suitability ** + ** of this software for any particular purpose. It is provided "as ** + ** is" without express or implied warranty of any kind. ** + ** ** + ** These notices must be retained in any copies of any part of this ** + ** documentation and/or software. ** + *********************************************************************** + */ + +#ifndef MD5_H +#define MD5_H + +/* Data structure for MD5 (Message-Digest) computation */ +typedef struct { + u32_t i[2]; /* number of _bits_ handled mod 2^64 */ + u32_t buf[4]; /* scratch buffer */ + unsigned char in[64]; /* input buffer */ + unsigned char digest[16]; /* actual digest after MD5Final call */ +} MD5_CTX; + +void MD5Init ( MD5_CTX *mdContext); +void MD5Update( MD5_CTX *mdContext, unsigned char *inBuf, unsigned int inLen); +void MD5Final ( unsigned char hash[], MD5_CTX *mdContext); + +#endif /* MD5_H */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/pap.c b/third_party/lwip-1.4.1/src/netif/ppp/pap.c new file mode 100644 index 0000000..8f62172 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/pap.c @@ -0,0 +1,628 @@ +/***************************************************************************** +* pap.c - Network Password Authentication Protocol program file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 by Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-12-12 Guy Lancaster , Global Election Systems Inc. +* Original. +*****************************************************************************/ +/* + * upap.c - User/Password Authentication Protocol. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "lwip/opt.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#if PAP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#include "ppp_impl.h" +#include "pppdebug.h" + +#include "auth.h" +#include "pap.h" + +#include + +#if 0 /* UNUSED */ +static bool hide_password = 1; + +/* + * Command-line options. + */ +static option_t pap_option_list[] = { + { "hide-password", o_bool, &hide_password, + "Don't output passwords to log", 1 }, + { "show-password", o_bool, &hide_password, + "Show password string in debug log messages", 0 }, + { "pap-restart", o_int, &upap[0].us_timeouttime, + "Set retransmit timeout for PAP" }, + { "pap-max-authreq", o_int, &upap[0].us_maxtransmits, + "Set max number of transmissions for auth-reqs" }, + { "pap-timeout", o_int, &upap[0].us_reqtimeout, + "Set time limit for peer PAP authentication" }, + { NULL } +}; +#endif + +/* + * Protocol entry points. + */ +static void upap_init (int); +static void upap_lowerup (int); +static void upap_lowerdown (int); +static void upap_input (int, u_char *, int); +static void upap_protrej (int); +#if PPP_ADDITIONAL_CALLBACKS +static int upap_printpkt (u_char *, int, void (*)(void *, char *, ...), void *); +#endif /* PPP_ADDITIONAL_CALLBACKS */ + +struct protent pap_protent = { + PPP_PAP, + upap_init, + upap_input, + upap_protrej, + upap_lowerup, + upap_lowerdown, + NULL, + NULL, +#if PPP_ADDITIONAL_CALLBACKS + upap_printpkt, + NULL, +#endif /* PPP_ADDITIONAL_CALLBACKS */ + 1, + "PAP", +#if PPP_ADDITIONAL_CALLBACKS + NULL, + NULL, + NULL +#endif /* PPP_ADDITIONAL_CALLBACKS */ +}; + +upap_state upap[NUM_PPP]; /* UPAP state; one for each unit */ + +static void upap_timeout (void *); +static void upap_reqtimeout(void *); +static void upap_rauthreq (upap_state *, u_char *, u_char, int); +static void upap_rauthack (upap_state *, u_char *, int, int); +static void upap_rauthnak (upap_state *, u_char *, int, int); +static void upap_sauthreq (upap_state *); +static void upap_sresp (upap_state *, u_char, u_char, char *, int); + + +/* + * upap_init - Initialize a UPAP unit. + */ +static void +upap_init(int unit) +{ + upap_state *u = &upap[unit]; + + UPAPDEBUG(LOG_INFO, ("upap_init: %d\n", unit)); + u->us_unit = unit; + u->us_user = NULL; + u->us_userlen = 0; + u->us_passwd = NULL; + u->us_passwdlen = 0; + u->us_clientstate = UPAPCS_INITIAL; + u->us_serverstate = UPAPSS_INITIAL; + u->us_id = 0; + u->us_timeouttime = UPAP_DEFTIMEOUT; + u->us_maxtransmits = 10; + u->us_reqtimeout = UPAP_DEFREQTIME; +} + +/* + * upap_authwithpeer - Authenticate us with our peer (start client). + * + * Set new state and send authenticate's. + */ +void +upap_authwithpeer(int unit, char *user, char *password) +{ + upap_state *u = &upap[unit]; + + UPAPDEBUG(LOG_INFO, ("upap_authwithpeer: %d user=%s password=%s s=%d\n", + unit, user, password, u->us_clientstate)); + + /* Save the username and password we're given */ + u->us_user = user; + u->us_userlen = (int)strlen(user); + u->us_passwd = password; + u->us_passwdlen = (int)strlen(password); + + u->us_transmits = 0; + + /* Lower layer up yet? */ + if (u->us_clientstate == UPAPCS_INITIAL || + u->us_clientstate == UPAPCS_PENDING) { + u->us_clientstate = UPAPCS_PENDING; + return; + } + + upap_sauthreq(u); /* Start protocol */ +} + + +/* + * upap_authpeer - Authenticate our peer (start server). + * + * Set new state. + */ +void +upap_authpeer(int unit) +{ + upap_state *u = &upap[unit]; + + /* Lower layer up yet? */ + if (u->us_serverstate == UPAPSS_INITIAL || + u->us_serverstate == UPAPSS_PENDING) { + u->us_serverstate = UPAPSS_PENDING; + return; + } + + u->us_serverstate = UPAPSS_LISTEN; + if (u->us_reqtimeout > 0) { + TIMEOUT(upap_reqtimeout, u, u->us_reqtimeout); + } +} + +/* + * upap_timeout - Retransmission timer for sending auth-reqs expired. + */ +static void +upap_timeout(void *arg) +{ + upap_state *u = (upap_state *) arg; + + UPAPDEBUG(LOG_INFO, ("upap_timeout: %d timeout %d expired s=%d\n", + u->us_unit, u->us_timeouttime, u->us_clientstate)); + + if (u->us_clientstate != UPAPCS_AUTHREQ) { + UPAPDEBUG(LOG_INFO, ("upap_timeout: not in AUTHREQ state!\n")); + return; + } + + if (u->us_transmits >= u->us_maxtransmits) { + /* give up in disgust */ + UPAPDEBUG(LOG_ERR, ("No response to PAP authenticate-requests\n")); + u->us_clientstate = UPAPCS_BADAUTH; + auth_withpeer_fail(u->us_unit, PPP_PAP); + return; + } + + upap_sauthreq(u); /* Send Authenticate-Request and set upap timeout*/ +} + + +/* + * upap_reqtimeout - Give up waiting for the peer to send an auth-req. + */ +static void +upap_reqtimeout(void *arg) +{ + upap_state *u = (upap_state *) arg; + + if (u->us_serverstate != UPAPSS_LISTEN) { + return; /* huh?? */ + } + + auth_peer_fail(u->us_unit, PPP_PAP); + u->us_serverstate = UPAPSS_BADAUTH; +} + + +/* + * upap_lowerup - The lower layer is up. + * + * Start authenticating if pending. + */ +static void +upap_lowerup(int unit) +{ + upap_state *u = &upap[unit]; + + UPAPDEBUG(LOG_INFO, ("upap_lowerup: init %d clientstate s=%d\n", unit, u->us_clientstate)); + + if (u->us_clientstate == UPAPCS_INITIAL) { + u->us_clientstate = UPAPCS_CLOSED; + } else if (u->us_clientstate == UPAPCS_PENDING) { + upap_sauthreq(u); /* send an auth-request */ + /* now client state is UPAPCS__AUTHREQ */ + } + + if (u->us_serverstate == UPAPSS_INITIAL) { + u->us_serverstate = UPAPSS_CLOSED; + } else if (u->us_serverstate == UPAPSS_PENDING) { + u->us_serverstate = UPAPSS_LISTEN; + if (u->us_reqtimeout > 0) { + TIMEOUT(upap_reqtimeout, u, u->us_reqtimeout); + } + } +} + + +/* + * upap_lowerdown - The lower layer is down. + * + * Cancel all timeouts. + */ +static void +upap_lowerdown(int unit) +{ + upap_state *u = &upap[unit]; + + UPAPDEBUG(LOG_INFO, ("upap_lowerdown: %d s=%d\n", unit, u->us_clientstate)); + + if (u->us_clientstate == UPAPCS_AUTHREQ) { /* Timeout pending? */ + UNTIMEOUT(upap_timeout, u); /* Cancel timeout */ + } + if (u->us_serverstate == UPAPSS_LISTEN && u->us_reqtimeout > 0) { + UNTIMEOUT(upap_reqtimeout, u); + } + + u->us_clientstate = UPAPCS_INITIAL; + u->us_serverstate = UPAPSS_INITIAL; +} + + +/* + * upap_protrej - Peer doesn't speak this protocol. + * + * This shouldn't happen. In any case, pretend lower layer went down. + */ +static void +upap_protrej(int unit) +{ + upap_state *u = &upap[unit]; + + if (u->us_clientstate == UPAPCS_AUTHREQ) { + UPAPDEBUG(LOG_ERR, ("PAP authentication failed due to protocol-reject\n")); + auth_withpeer_fail(unit, PPP_PAP); + } + if (u->us_serverstate == UPAPSS_LISTEN) { + UPAPDEBUG(LOG_ERR, ("PAP authentication of peer failed (protocol-reject)\n")); + auth_peer_fail(unit, PPP_PAP); + } + upap_lowerdown(unit); +} + + +/* + * upap_input - Input UPAP packet. + */ +static void +upap_input(int unit, u_char *inpacket, int l) +{ + upap_state *u = &upap[unit]; + u_char *inp; + u_char code, id; + int len; + + /* + * Parse header (code, id and length). + * If packet too short, drop it. + */ + inp = inpacket; + if (l < (int)UPAP_HEADERLEN) { + UPAPDEBUG(LOG_INFO, ("pap_input: rcvd short header.\n")); + return; + } + GETCHAR(code, inp); + GETCHAR(id, inp); + GETSHORT(len, inp); + if (len < (int)UPAP_HEADERLEN) { + UPAPDEBUG(LOG_INFO, ("pap_input: rcvd illegal length.\n")); + return; + } + if (len > l) { + UPAPDEBUG(LOG_INFO, ("pap_input: rcvd short packet.\n")); + return; + } + len -= UPAP_HEADERLEN; + + /* + * Action depends on code. + */ + switch (code) { + case UPAP_AUTHREQ: + upap_rauthreq(u, inp, id, len); + break; + + case UPAP_AUTHACK: + upap_rauthack(u, inp, id, len); + break; + + case UPAP_AUTHNAK: + upap_rauthnak(u, inp, id, len); + break; + + default: /* XXX Need code reject */ + UPAPDEBUG(LOG_INFO, ("pap_input: UNHANDLED default: code: %d, id: %d, len: %d.\n", code, id, len)); + break; + } +} + + +/* + * upap_rauth - Receive Authenticate. + */ +static void +upap_rauthreq(upap_state *u, u_char *inp, u_char id, int len) +{ + u_char ruserlen, rpasswdlen; + char *ruser, *rpasswd; + u_char retcode; + char *msg; + int msglen; + + UPAPDEBUG(LOG_INFO, ("pap_rauth: Rcvd id %d.\n", id)); + + if (u->us_serverstate < UPAPSS_LISTEN) { + return; + } + + /* + * If we receive a duplicate authenticate-request, we are + * supposed to return the same status as for the first request. + */ + if (u->us_serverstate == UPAPSS_OPEN) { + upap_sresp(u, UPAP_AUTHACK, id, "", 0); /* return auth-ack */ + return; + } + if (u->us_serverstate == UPAPSS_BADAUTH) { + upap_sresp(u, UPAP_AUTHNAK, id, "", 0); /* return auth-nak */ + return; + } + + /* + * Parse user/passwd. + */ + if (len < (int)sizeof (u_char)) { + UPAPDEBUG(LOG_INFO, ("pap_rauth: rcvd short packet.\n")); + return; + } + GETCHAR(ruserlen, inp); + len -= sizeof (u_char) + ruserlen + sizeof (u_char); + if (len < 0) { + UPAPDEBUG(LOG_INFO, ("pap_rauth: rcvd short packet.\n")); + return; + } + ruser = (char *) inp; + INCPTR(ruserlen, inp); + GETCHAR(rpasswdlen, inp); + if (len < rpasswdlen) { + UPAPDEBUG(LOG_INFO, ("pap_rauth: rcvd short packet.\n")); + return; + } + rpasswd = (char *) inp; + + /* + * Check the username and password given. + */ + retcode = check_passwd(u->us_unit, ruser, ruserlen, rpasswd, rpasswdlen, &msg, &msglen); + /* lwip: currently retcode is always UPAP_AUTHACK */ + BZERO(rpasswd, rpasswdlen); + + upap_sresp(u, retcode, id, msg, msglen); + + if (retcode == UPAP_AUTHACK) { + u->us_serverstate = UPAPSS_OPEN; + auth_peer_success(u->us_unit, PPP_PAP, ruser, ruserlen); + } else { + u->us_serverstate = UPAPSS_BADAUTH; + auth_peer_fail(u->us_unit, PPP_PAP); + } + + if (u->us_reqtimeout > 0) { + UNTIMEOUT(upap_reqtimeout, u); + } +} + + +/* + * upap_rauthack - Receive Authenticate-Ack. + */ +static void +upap_rauthack(upap_state *u, u_char *inp, int id, int len) +{ + u_char msglen; + char *msg; + + LWIP_UNUSED_ARG(id); + + UPAPDEBUG(LOG_INFO, ("pap_rauthack: Rcvd id %d s=%d\n", id, u->us_clientstate)); + + if (u->us_clientstate != UPAPCS_AUTHREQ) { /* XXX */ + UPAPDEBUG(LOG_INFO, ("pap_rauthack: us_clientstate != UPAPCS_AUTHREQ\n")); + return; + } + + /* + * Parse message. + */ + if (len < (int)sizeof (u_char)) { + UPAPDEBUG(LOG_INFO, ("pap_rauthack: ignoring missing msg-length.\n")); + } else { + GETCHAR(msglen, inp); + if (msglen > 0) { + len -= sizeof (u_char); + if (len < msglen) { + UPAPDEBUG(LOG_INFO, ("pap_rauthack: rcvd short packet.\n")); + return; + } + msg = (char *) inp; + PRINTMSG(msg, msglen); + } + } + UNTIMEOUT(upap_timeout, u); /* Cancel timeout */ + u->us_clientstate = UPAPCS_OPEN; + + auth_withpeer_success(u->us_unit, PPP_PAP); +} + + +/* + * upap_rauthnak - Receive Authenticate-Nak. + */ +static void +upap_rauthnak(upap_state *u, u_char *inp, int id, int len) +{ + u_char msglen; + char *msg; + + LWIP_UNUSED_ARG(id); + + UPAPDEBUG(LOG_INFO, ("pap_rauthnak: Rcvd id %d s=%d\n", id, u->us_clientstate)); + + if (u->us_clientstate != UPAPCS_AUTHREQ) { /* XXX */ + return; + } + + /* + * Parse message. + */ + if (len < sizeof (u_char)) { + UPAPDEBUG(LOG_INFO, ("pap_rauthnak: ignoring missing msg-length.\n")); + } else { + GETCHAR(msglen, inp); + if(msglen > 0) { + len -= sizeof (u_char); + if (len < msglen) { + UPAPDEBUG(LOG_INFO, ("pap_rauthnak: rcvd short packet.\n")); + return; + } + msg = (char *) inp; + PRINTMSG(msg, msglen); + } + } + + u->us_clientstate = UPAPCS_BADAUTH; + + UPAPDEBUG(LOG_ERR, ("PAP authentication failed\n")); + auth_withpeer_fail(u->us_unit, PPP_PAP); +} + + +/* + * upap_sauthreq - Send an Authenticate-Request. + */ +static void +upap_sauthreq(upap_state *u) +{ + u_char *outp; + int outlen; + + outlen = UPAP_HEADERLEN + 2 * sizeof (u_char) + + u->us_userlen + u->us_passwdlen; + outp = outpacket_buf[u->us_unit]; + + MAKEHEADER(outp, PPP_PAP); + + PUTCHAR(UPAP_AUTHREQ, outp); + PUTCHAR(++u->us_id, outp); + PUTSHORT(outlen, outp); + PUTCHAR(u->us_userlen, outp); + BCOPY(u->us_user, outp, u->us_userlen); + INCPTR(u->us_userlen, outp); + PUTCHAR(u->us_passwdlen, outp); + BCOPY(u->us_passwd, outp, u->us_passwdlen); + + pppWrite(u->us_unit, outpacket_buf[u->us_unit], outlen + PPP_HDRLEN); + + UPAPDEBUG(LOG_INFO, ("pap_sauth: Sent id %d\n", u->us_id)); + + TIMEOUT(upap_timeout, u, u->us_timeouttime); + ++u->us_transmits; + u->us_clientstate = UPAPCS_AUTHREQ; +} + + +/* + * upap_sresp - Send a response (ack or nak). + */ +static void +upap_sresp(upap_state *u, u_char code, u_char id, char *msg, int msglen) +{ + u_char *outp; + int outlen; + + outlen = UPAP_HEADERLEN + sizeof (u_char) + msglen; + outp = outpacket_buf[u->us_unit]; + MAKEHEADER(outp, PPP_PAP); + + PUTCHAR(code, outp); + PUTCHAR(id, outp); + PUTSHORT(outlen, outp); + PUTCHAR(msglen, outp); + BCOPY(msg, outp, msglen); + pppWrite(u->us_unit, outpacket_buf[u->us_unit], outlen + PPP_HDRLEN); + + UPAPDEBUG(LOG_INFO, ("pap_sresp: Sent code %d, id %d s=%d\n", code, id, u->us_clientstate)); +} + +#if PPP_ADDITIONAL_CALLBACKS +static char *upap_codenames[] = { + "AuthReq", "AuthAck", "AuthNak" +}; + +/* + * upap_printpkt - print the contents of a PAP packet. + */ +static int upap_printpkt( + u_char *p, + int plen, + void (*printer) (void *, char *, ...), + void *arg +) +{ + LWIP_UNUSED_ARG(p); + LWIP_UNUSED_ARG(plen); + LWIP_UNUSED_ARG(printer); + LWIP_UNUSED_ARG(arg); + return 0; +} +#endif /* PPP_ADDITIONAL_CALLBACKS */ + +#endif /* PAP_SUPPORT */ + +#endif /* PPP_SUPPORT */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/pap.h b/third_party/lwip-1.4.1/src/netif/ppp/pap.h new file mode 100644 index 0000000..4d1c424 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/pap.h @@ -0,0 +1,118 @@ +/***************************************************************************** +* pap.h - PPP Password Authentication Protocol header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-12-04 Guy Lancaster , Global Election Systems Inc. +* Original derived from BSD codes. +*****************************************************************************/ +/* + * upap.h - User/Password Authentication Protocol definitions. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef PAP_H +#define PAP_H + +#if PAP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +/* + * Packet header = Code, id, length. + */ +#define UPAP_HEADERLEN (sizeof (u_char) + sizeof (u_char) + sizeof (u_short)) + + +/* + * UPAP codes. + */ +#define UPAP_AUTHREQ 1 /* Authenticate-Request */ +#define UPAP_AUTHACK 2 /* Authenticate-Ack */ +#define UPAP_AUTHNAK 3 /* Authenticate-Nak */ + +/* + * Each interface is described by upap structure. + */ +typedef struct upap_state { + int us_unit; /* Interface unit number */ + const char *us_user; /* User */ + int us_userlen; /* User length */ + const char *us_passwd; /* Password */ + int us_passwdlen; /* Password length */ + int us_clientstate; /* Client state */ + int us_serverstate; /* Server state */ + u_char us_id; /* Current id */ + int us_timeouttime; /* Timeout (seconds) for auth-req retrans. */ + int us_transmits; /* Number of auth-reqs sent */ + int us_maxtransmits; /* Maximum number of auth-reqs to send */ + int us_reqtimeout; /* Time to wait for auth-req from peer */ +} upap_state; + +/* + * Client states. + */ +#define UPAPCS_INITIAL 0 /* Connection down */ +#define UPAPCS_CLOSED 1 /* Connection up, haven't requested auth */ +#define UPAPCS_PENDING 2 /* Connection down, have requested auth */ +#define UPAPCS_AUTHREQ 3 /* We've sent an Authenticate-Request */ +#define UPAPCS_OPEN 4 /* We've received an Ack */ +#define UPAPCS_BADAUTH 5 /* We've received a Nak */ + +/* + * Server states. + */ +#define UPAPSS_INITIAL 0 /* Connection down */ +#define UPAPSS_CLOSED 1 /* Connection up, haven't requested auth */ +#define UPAPSS_PENDING 2 /* Connection down, have requested auth */ +#define UPAPSS_LISTEN 3 /* Listening for an Authenticate */ +#define UPAPSS_OPEN 4 /* We've sent an Ack */ +#define UPAPSS_BADAUTH 5 /* We've sent a Nak */ + + +extern upap_state upap[]; + +void upap_authwithpeer (int, char *, char *); +void upap_authpeer (int); + +extern struct protent pap_protent; + +#endif /* PAP_SUPPORT */ + +#endif /* PAP_H */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/ppp.c b/third_party/lwip-1.4.1/src/netif/ppp/ppp.c new file mode 100644 index 0000000..a0e950c --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/ppp.c @@ -0,0 +1,2045 @@ +/***************************************************************************** +* ppp.c - Network Point to Point Protocol program file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 by Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-11-05 Guy Lancaster , Global Election Systems Inc. +* Original. +*****************************************************************************/ + +/* + * ppp_defs.h - PPP definitions. + * + * if_pppvar.h - private structures and declarations for PPP. + * + * Copyright (c) 1994 The Australian National University. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation is hereby granted, provided that the above copyright + * notice appears in all copies. This software is provided without any + * warranty, express or implied. The Australian National University + * makes no representations about the suitability of this software for + * any purpose. + * + * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY + * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF + * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, + * OR MODIFICATIONS. + */ + +/* + * if_ppp.h - Point-to-Point Protocol definitions. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "lwip/opt.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#include "ppp_impl.h" +#include "lwip/ip.h" /* for ip_input() */ + +#include "pppdebug.h" + +#include "randm.h" +#include "fsm.h" +#if PAP_SUPPORT +#include "pap.h" +#endif /* PAP_SUPPORT */ +#if CHAP_SUPPORT +#include "chap.h" +#endif /* CHAP_SUPPORT */ +#include "ipcp.h" +#include "lcp.h" +#include "magic.h" +#include "auth.h" +#if VJ_SUPPORT +#include "vj.h" +#endif /* VJ_SUPPORT */ +#if PPPOE_SUPPORT +#include "netif/ppp_oe.h" +#endif /* PPPOE_SUPPORT */ + +#include "lwip/tcpip.h" +#include "lwip/api.h" +#include "lwip/snmp.h" + +#include + +/*************************/ +/*** LOCAL DEFINITIONS ***/ +/*************************/ + +/** PPP_INPROC_MULTITHREADED==1 call pppInput using tcpip_callback(). + * Set this to 0 if pppInProc is called inside tcpip_thread or with NO_SYS==1. + * Default is 1 for NO_SYS==0 (multithreaded) and 0 for NO_SYS==1 (single-threaded). + */ +#ifndef PPP_INPROC_MULTITHREADED +#define PPP_INPROC_MULTITHREADED (NO_SYS==0) +#endif + +/** PPP_INPROC_OWNTHREAD==1: start a dedicated RX thread per PPP session. + * Default is 0: call pppos_input() for received raw characters, charcater + * reception is up to the port */ +#ifndef PPP_INPROC_OWNTHREAD +#define PPP_INPROC_OWNTHREAD PPP_INPROC_MULTITHREADED +#endif + +#if PPP_INPROC_OWNTHREAD && !PPP_INPROC_MULTITHREADED + #error "PPP_INPROC_OWNTHREAD needs PPP_INPROC_MULTITHREADED==1" +#endif + +/* + * The basic PPP frame. + */ +#define PPP_ADDRESS(p) (((u_char *)(p))[0]) +#define PPP_CONTROL(p) (((u_char *)(p))[1]) +#define PPP_PROTOCOL(p) ((((u_char *)(p))[2] << 8) + ((u_char *)(p))[3]) + +/* PPP packet parser states. Current state indicates operation yet to be + * completed. */ +typedef enum { + PDIDLE = 0, /* Idle state - waiting. */ + PDSTART, /* Process start flag. */ + PDADDRESS, /* Process address field. */ + PDCONTROL, /* Process control field. */ + PDPROTOCOL1, /* Process protocol field 1. */ + PDPROTOCOL2, /* Process protocol field 2. */ + PDDATA /* Process data byte. */ +} PPPDevStates; + +#define ESCAPE_P(accm, c) ((accm)[(c) >> 3] & pppACCMMask[c & 0x07]) + +/************************/ +/*** LOCAL DATA TYPES ***/ +/************************/ + +/** RX buffer size: this may be configured smaller! */ +#ifndef PPPOS_RX_BUFSIZE +#define PPPOS_RX_BUFSIZE (PPP_MRU + PPP_HDRLEN) +#endif + +typedef struct PPPControlRx_s { + /** unit number / ppp descriptor */ + int pd; + /** the rx file descriptor */ + sio_fd_t fd; + /** receive buffer - encoded data is stored here */ +#if PPP_INPROC_OWNTHREAD + u_char rxbuf[PPPOS_RX_BUFSIZE]; +#endif /* PPP_INPROC_OWNTHREAD */ + + /* The input packet. */ + struct pbuf *inHead, *inTail; + +#if PPPOS_SUPPORT + u16_t inProtocol; /* The input protocol code. */ + u16_t inFCS; /* Input Frame Check Sequence value. */ +#endif /* PPPOS_SUPPORT */ + PPPDevStates inState; /* The input process state. */ + char inEscaped; /* Escape next character. */ + ext_accm inACCM; /* Async-Ctl-Char-Map for input. */ +} PPPControlRx; + +/* + * PPP interface control block. + */ +typedef struct PPPControl_s { + PPPControlRx rx; + char openFlag; /* True when in use. */ +#if PPPOE_SUPPORT + struct netif *ethif; + struct pppoe_softc *pppoe_sc; +#endif /* PPPOE_SUPPORT */ + int if_up; /* True when the interface is up. */ + int errCode; /* Code indicating why interface is down. */ +#if PPPOS_SUPPORT + sio_fd_t fd; /* File device ID of port. */ +#endif /* PPPOS_SUPPORT */ + u16_t mtu; /* Peer's mru */ + int pcomp; /* Does peer accept protocol compression? */ + int accomp; /* Does peer accept addr/ctl compression? */ + u_long lastXMit; /* Time of last transmission. */ + ext_accm outACCM; /* Async-Ctl-Char-Map for output. */ +#if PPPOS_SUPPORT && VJ_SUPPORT + int vjEnabled; /* Flag indicating VJ compression enabled. */ + struct vjcompress vjComp; /* Van Jacobson compression header. */ +#endif /* PPPOS_SUPPORT && VJ_SUPPORT */ + + struct netif netif; + + struct ppp_addrs addrs; + + void (*linkStatusCB)(void *ctx, int errCode, void *arg); + void *linkStatusCtx; + +} PPPControl; + + +/* + * Ioctl definitions. + */ + +struct npioctl { + int protocol; /* PPP procotol, e.g. PPP_IP */ + enum NPmode mode; +}; + + + +/***********************************/ +/*** LOCAL FUNCTION DECLARATIONS ***/ +/***********************************/ +#if PPPOS_SUPPORT +#if PPP_INPROC_OWNTHREAD +static void pppInputThread(void *arg); +#endif /* PPP_INPROC_OWNTHREAD */ +static void pppDrop(PPPControlRx *pcrx); +static void pppInProc(PPPControlRx *pcrx, u_char *s, int l); +static void pppFreeCurrentInputPacket(PPPControlRx *pcrx); +#endif /* PPPOS_SUPPORT */ + + +/******************************/ +/*** PUBLIC DATA STRUCTURES ***/ +/******************************/ +u_long subnetMask; + +static PPPControl pppControl[NUM_PPP]; /* The PPP interface control blocks. */ + +/* + * PPP Data Link Layer "protocol" table. + * One entry per supported protocol. + * The last entry must be NULL. + */ +struct protent *ppp_protocols[] = { + &lcp_protent, +#if PAP_SUPPORT + &pap_protent, +#endif /* PAP_SUPPORT */ +#if CHAP_SUPPORT + &chap_protent, +#endif /* CHAP_SUPPORT */ +#if CBCP_SUPPORT + &cbcp_protent, +#endif /* CBCP_SUPPORT */ + &ipcp_protent, +#if CCP_SUPPORT + &ccp_protent, +#endif /* CCP_SUPPORT */ + NULL +}; + + +/* + * Buffers for outgoing packets. This must be accessed only from the appropriate + * PPP task so that it doesn't need to be protected to avoid collisions. + */ +u_char outpacket_buf[NUM_PPP][PPP_MRU+PPP_HDRLEN]; + + +/*****************************/ +/*** LOCAL DATA STRUCTURES ***/ +/*****************************/ + +#if PPPOS_SUPPORT +/* + * FCS lookup table as calculated by genfcstab. + * @todo: smaller, slower implementation for lower memory footprint? + */ +static const u_short fcstab[256] = { + 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, + 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, + 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e, + 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, + 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, + 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5, + 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, + 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, + 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, + 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, + 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, + 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72, + 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, + 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, + 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738, + 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, + 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7, + 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, + 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, + 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, + 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5, + 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, + 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134, + 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c, + 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, + 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, + 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, + 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, + 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, + 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, + 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, + 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 +}; + +/* PPP's Asynchronous-Control-Character-Map. The mask array is used + * to select the specific bit for a character. */ +static u_char pppACCMMask[] = { + 0x01, + 0x02, + 0x04, + 0x08, + 0x10, + 0x20, + 0x40, + 0x80 +}; + +#if PPP_INPROC_OWNTHREAD +/** Wake up the task blocked in reading from serial line (if any) */ +static void +pppRecvWakeup(int pd) +{ + PPPDEBUG(LOG_DEBUG, ("pppRecvWakeup: unit %d\n", pd)); + if (pppControl[pd].openFlag != 0) { + sio_read_abort(pppControl[pd].fd); + } +} +#endif /* PPP_INPROC_OWNTHREAD */ +#endif /* PPPOS_SUPPORT */ + +void +pppLinkTerminated(int pd) +{ + PPPDEBUG(LOG_DEBUG, ("pppLinkTerminated: unit %d\n", pd)); + +#if PPPOE_SUPPORT + if (pppControl[pd].ethif) { + pppoe_disconnect(pppControl[pd].pppoe_sc); + } else +#endif /* PPPOE_SUPPORT */ + { +#if PPPOS_SUPPORT + PPPControl* pc; +#if PPP_INPROC_OWNTHREAD + pppRecvWakeup(pd); +#endif /* PPP_INPROC_OWNTHREAD */ + pc = &pppControl[pd]; + + PPPDEBUG(LOG_DEBUG, ("pppLinkTerminated: unit %d: linkStatusCB=%p errCode=%d\n", pd, pc->linkStatusCB, pc->errCode)); + if (pc->linkStatusCB) { + pc->linkStatusCB(pc->linkStatusCtx, pc->errCode ? pc->errCode : PPPERR_PROTOCOL, NULL); + } + + pc->openFlag = 0;/**/ +#endif /* PPPOS_SUPPORT */ + } + PPPDEBUG(LOG_DEBUG, ("pppLinkTerminated: finished.\n")); +} + +void +pppLinkDown(int pd) +{ + PPPDEBUG(LOG_DEBUG, ("pppLinkDown: unit %d\n", pd)); + +#if PPPOE_SUPPORT + if (pppControl[pd].ethif) { + pppoe_disconnect(pppControl[pd].pppoe_sc); + } else +#endif /* PPPOE_SUPPORT */ + { +#if PPPOS_SUPPORT && PPP_INPROC_OWNTHREAD + pppRecvWakeup(pd); +#endif /* PPPOS_SUPPORT && PPP_INPROC_OWNTHREAD*/ + } +} + +/** Initiate LCP open request */ +static void +pppStart(int pd) +{ + PPPDEBUG(LOG_DEBUG, ("pppStart: unit %d\n", pd)); + lcp_lowerup(pd); + lcp_open(pd); /* Start protocol */ + PPPDEBUG(LOG_DEBUG, ("pppStart: finished\n")); +} + +/** LCP close request */ +static void +pppStop(int pd) +{ + PPPDEBUG(LOG_DEBUG, ("pppStop: unit %d\n", pd)); + lcp_close(pd, "User request"); +} + +/** Called when carrier/link is lost */ +static void +pppHup(int pd) +{ + PPPDEBUG(LOG_DEBUG, ("pppHupCB: unit %d\n", pd)); + lcp_lowerdown(pd); + link_terminated(pd); +} + +/***********************************/ +/*** PUBLIC FUNCTION DEFINITIONS ***/ +/***********************************/ +/* Initialize the PPP subsystem. */ + +struct ppp_settings ppp_settings; + +void +pppInit(void) +{ + struct protent *protp; + int i, j; + + memset(&ppp_settings, 0, sizeof(ppp_settings)); + ppp_settings.usepeerdns = 1; + pppSetAuth(PPPAUTHTYPE_NONE, NULL, NULL); + + magicInit(); + + subnetMask = PP_HTONL(0xffffff00UL); + + for (i = 0; i < NUM_PPP; i++) { + /* Initialize each protocol to the standard option set. */ + for (j = 0; (protp = ppp_protocols[j]) != NULL; ++j) { + (*protp->init)(i); + } + } +} + +void +pppSetAuth(enum pppAuthType authType, const char *user, const char *passwd) +{ + switch(authType) { + case PPPAUTHTYPE_NONE: + default: +#ifdef LWIP_PPP_STRICT_PAP_REJECT + ppp_settings.refuse_pap = 1; +#else /* LWIP_PPP_STRICT_PAP_REJECT */ + /* some providers request pap and accept an empty login/pw */ + ppp_settings.refuse_pap = 0; +#endif /* LWIP_PPP_STRICT_PAP_REJECT */ + ppp_settings.refuse_chap = 1; + break; + + case PPPAUTHTYPE_ANY: + /* Warning: Using PPPAUTHTYPE_ANY might have security consequences. + * RFC 1994 says: + * + * In practice, within or associated with each PPP server, there is a + * database which associates "user" names with authentication + * information ("secrets"). It is not anticipated that a particular + * named user would be authenticated by multiple methods. This would + * make the user vulnerable to attacks which negotiate the least secure + * method from among a set (such as PAP rather than CHAP). If the same + * secret was used, PAP would reveal the secret to be used later with + * CHAP. + * + * Instead, for each user name there should be an indication of exactly + * one method used to authenticate that user name. If a user needs to + * make use of different authentication methods under different + * circumstances, then distinct user names SHOULD be employed, each of + * which identifies exactly one authentication method. + * + */ + ppp_settings.refuse_pap = 0; + ppp_settings.refuse_chap = 0; + break; + + case PPPAUTHTYPE_PAP: + ppp_settings.refuse_pap = 0; + ppp_settings.refuse_chap = 1; + break; + + case PPPAUTHTYPE_CHAP: + ppp_settings.refuse_pap = 1; + ppp_settings.refuse_chap = 0; + break; + } + + if(user) { + strncpy(ppp_settings.user, user, sizeof(ppp_settings.user)-1); + ppp_settings.user[sizeof(ppp_settings.user)-1] = '\0'; + } else { + ppp_settings.user[0] = '\0'; + } + + if(passwd) { + strncpy(ppp_settings.passwd, passwd, sizeof(ppp_settings.passwd)-1); + ppp_settings.passwd[sizeof(ppp_settings.passwd)-1] = '\0'; + } else { + ppp_settings.passwd[0] = '\0'; + } +} + +#if PPPOS_SUPPORT +/** Open a new PPP connection using the given I/O device. + * This initializes the PPP control block but does not + * attempt to negotiate the LCP session. If this port + * connects to a modem, the modem connection must be + * established before calling this. + * Return a new PPP connection descriptor on success or + * an error code (negative) on failure. + * + * pppOpen() is directly defined to this function. + */ +int +pppOverSerialOpen(sio_fd_t fd, pppLinkStatusCB_fn linkStatusCB, void *linkStatusCtx) +{ + PPPControl *pc; + int pd; + + if (linkStatusCB == NULL) { + /* PPP is single-threaded: without a callback, + * there is no way to know when the link is up. */ + return PPPERR_PARAM; + } + + /* Find a free PPP session descriptor. */ + for (pd = 0; pd < NUM_PPP && pppControl[pd].openFlag != 0; pd++); + + if (pd >= NUM_PPP) { + pd = PPPERR_OPEN; + } else { + pc = &pppControl[pd]; + /* input pbuf left over from last session? */ + pppFreeCurrentInputPacket(&pc->rx); + /* @todo: is this correct or do I overwrite something? */ + memset(pc, 0, sizeof(PPPControl)); + pc->rx.pd = pd; + pc->rx.fd = fd; + + pc->openFlag = 1; + pc->fd = fd; + +#if VJ_SUPPORT + vj_compress_init(&pc->vjComp); +#endif /* VJ_SUPPORT */ + + /* + * Default the in and out accm so that escape and flag characters + * are always escaped. + */ + pc->rx.inACCM[15] = 0x60; /* no need to protect since RX is not running */ + pc->outACCM[15] = 0x60; + + pc->linkStatusCB = linkStatusCB; + pc->linkStatusCtx = linkStatusCtx; + + /* + * Start the connection and handle incoming events (packet or timeout). + */ + PPPDEBUG(LOG_INFO, ("pppOverSerialOpen: unit %d: Connecting\n", pd)); + pppStart(pd); +#if PPP_INPROC_OWNTHREAD + sys_thread_new(PPP_THREAD_NAME, pppInputThread, (void*)&pc->rx, PPP_THREAD_STACKSIZE, PPP_THREAD_PRIO); +#endif /* PPP_INPROC_OWNTHREAD */ + } + + return pd; +} +#endif /* PPPOS_SUPPORT */ + +#if PPPOE_SUPPORT +static void pppOverEthernetLinkStatusCB(int pd, int up); + +void +pppOverEthernetClose(int pd) +{ + PPPControl* pc = &pppControl[pd]; + + /* *TJL* There's no lcp_deinit */ + lcp_close(pd, NULL); + + pppoe_destroy(&pc->netif); +} + +int pppOverEthernetOpen(struct netif *ethif, const char *service_name, const char *concentrator_name, + pppLinkStatusCB_fn linkStatusCB, void *linkStatusCtx) +{ + PPPControl *pc; + int pd; + + LWIP_UNUSED_ARG(service_name); + LWIP_UNUSED_ARG(concentrator_name); + + if (linkStatusCB == NULL) { + /* PPP is single-threaded: without a callback, + * there is no way to know when the link is up. */ + return PPPERR_PARAM; + } + + /* Find a free PPP session descriptor. Critical region? */ + for (pd = 0; pd < NUM_PPP && pppControl[pd].openFlag != 0; pd++); + if (pd >= NUM_PPP) { + pd = PPPERR_OPEN; + } else { + pc = &pppControl[pd]; + memset(pc, 0, sizeof(PPPControl)); + pc->openFlag = 1; + pc->ethif = ethif; + + pc->linkStatusCB = linkStatusCB; + pc->linkStatusCtx = linkStatusCtx; + + lcp_wantoptions[pd].mru = PPPOE_MAXMTU; + lcp_wantoptions[pd].neg_asyncmap = 0; + lcp_wantoptions[pd].neg_pcompression = 0; + lcp_wantoptions[pd].neg_accompression = 0; + + lcp_allowoptions[pd].mru = PPPOE_MAXMTU; + lcp_allowoptions[pd].neg_asyncmap = 0; + lcp_allowoptions[pd].neg_pcompression = 0; + lcp_allowoptions[pd].neg_accompression = 0; + + if(pppoe_create(ethif, pd, pppOverEthernetLinkStatusCB, &pc->pppoe_sc) != ERR_OK) { + pc->openFlag = 0; + return PPPERR_OPEN; + } + + pppoe_connect(pc->pppoe_sc); + } + + return pd; +} +#endif /* PPPOE_SUPPORT */ + + +/* Close a PPP connection and release the descriptor. + * Any outstanding packets in the queues are dropped. + * Return 0 on success, an error code on failure. */ +int +pppClose(int pd) +{ + PPPControl *pc = &pppControl[pd]; + int st = 0; + + PPPDEBUG(LOG_DEBUG, ("pppClose() called\n")); + + /* Disconnect */ +#if PPPOE_SUPPORT + if(pc->ethif) { + PPPDEBUG(LOG_DEBUG, ("pppClose: unit %d kill_link -> pppStop\n", pd)); + pc->errCode = PPPERR_USER; + /* This will leave us at PHASE_DEAD. */ + pppStop(pd); + } else +#endif /* PPPOE_SUPPORT */ + { +#if PPPOS_SUPPORT + PPPDEBUG(LOG_DEBUG, ("pppClose: unit %d kill_link -> pppStop\n", pd)); + pc->errCode = PPPERR_USER; + /* This will leave us at PHASE_DEAD. */ + pppStop(pd); +#if PPP_INPROC_OWNTHREAD + pppRecvWakeup(pd); +#endif /* PPP_INPROC_OWNTHREAD */ +#endif /* PPPOS_SUPPORT */ + } + + return st; +} + +/* This function is called when carrier is lost on the PPP channel. */ +void +pppSigHUP(int pd) +{ + PPPDEBUG(LOG_DEBUG, ("pppSigHUP: unit %d sig_hup -> pppHupCB\n", pd)); + pppHup(pd); +} + +#if PPPOS_SUPPORT +static void +nPut(PPPControl *pc, struct pbuf *nb) +{ + struct pbuf *b; + int c; + + for(b = nb; b != NULL; b = b->next) { + if((c = sio_write(pc->fd, b->payload, b->len)) != b->len) { + PPPDEBUG(LOG_WARNING, + ("PPP nPut: incomplete sio_write(fd:%"SZT_F", len:%d, c: 0x%"X8_F") c = %d\n", (size_t)pc->fd, b->len, c, c)); + LINK_STATS_INC(link.err); + pc->lastXMit = 0; /* prepend PPP_FLAG to next packet */ + snmp_inc_ifoutdiscards(&pc->netif); + pbuf_free(nb); + return; + } + } + + snmp_add_ifoutoctets(&pc->netif, nb->tot_len); + snmp_inc_ifoutucastpkts(&pc->netif); + pbuf_free(nb); + LINK_STATS_INC(link.xmit); +} + +/* + * pppAppend - append given character to end of given pbuf. If outACCM + * is not NULL and the character needs to be escaped, do so. + * If pbuf is full, append another. + * Return the current pbuf. + */ +static struct pbuf * +pppAppend(u_char c, struct pbuf *nb, ext_accm *outACCM) +{ + struct pbuf *tb = nb; + + /* Make sure there is room for the character and an escape code. + * Sure we don't quite fill the buffer if the character doesn't + * get escaped but is one character worth complicating this? */ + /* Note: We assume no packet header. */ + if (nb && (PBUF_POOL_BUFSIZE - nb->len) < 2) { + tb = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL); + if (tb) { + nb->next = tb; + } else { + LINK_STATS_INC(link.memerr); + } + nb = tb; + } + + if (nb) { + if (outACCM && ESCAPE_P(*outACCM, c)) { + *((u_char*)nb->payload + nb->len++) = PPP_ESCAPE; + *((u_char*)nb->payload + nb->len++) = c ^ PPP_TRANS; + } else { + *((u_char*)nb->payload + nb->len++) = c; + } + } + + return tb; +} +#endif /* PPPOS_SUPPORT */ + +#if PPPOE_SUPPORT +static err_t +pppifOutputOverEthernet(int pd, struct pbuf *p) +{ + PPPControl *pc = &pppControl[pd]; + struct pbuf *pb; + u_short protocol = PPP_IP; + int i=0; + u16_t tot_len; + + /* @todo: try to use pbuf_header() here! */ + pb = pbuf_alloc(PBUF_LINK, PPPOE_HDRLEN + sizeof(protocol), PBUF_RAM); + if(!pb) { + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.proterr); + snmp_inc_ifoutdiscards(&pc->netif); + return ERR_MEM; + } + + pbuf_header(pb, -(s16_t)PPPOE_HDRLEN); + + pc->lastXMit = sys_jiffies(); + + if (!pc->pcomp || protocol > 0xFF) { + *((u_char*)pb->payload + i++) = (protocol >> 8) & 0xFF; + } + *((u_char*)pb->payload + i) = protocol & 0xFF; + + pbuf_chain(pb, p); + tot_len = pb->tot_len; + + if(pppoe_xmit(pc->pppoe_sc, pb) != ERR_OK) { + LINK_STATS_INC(link.err); + snmp_inc_ifoutdiscards(&pc->netif); + return PPPERR_DEVICE; + } + + snmp_add_ifoutoctets(&pc->netif, tot_len); + snmp_inc_ifoutucastpkts(&pc->netif); + LINK_STATS_INC(link.xmit); + return ERR_OK; +} +#endif /* PPPOE_SUPPORT */ + +/* Send a packet on the given connection. */ +static err_t +pppifOutput(struct netif *netif, struct pbuf *pb, ip_addr_t *ipaddr) +{ + int pd = (int)(size_t)netif->state; + PPPControl *pc = &pppControl[pd]; +#if PPPOS_SUPPORT + u_short protocol = PPP_IP; + u_int fcsOut = PPP_INITFCS; + struct pbuf *headMB = NULL, *tailMB = NULL, *p; + u_char c; +#endif /* PPPOS_SUPPORT */ + + LWIP_UNUSED_ARG(ipaddr); + + /* Validate parameters. */ + /* We let any protocol value go through - it can't hurt us + * and the peer will just drop it if it's not accepting it. */ + if (pd < 0 || pd >= NUM_PPP || !pc->openFlag || !pb) { + PPPDEBUG(LOG_WARNING, ("pppifOutput[%d]: bad parms prot=%d pb=%p\n", + pd, PPP_IP, pb)); + LINK_STATS_INC(link.opterr); + LINK_STATS_INC(link.drop); + snmp_inc_ifoutdiscards(netif); + return ERR_ARG; + } + + /* Check that the link is up. */ + if (lcp_phase[pd] == PHASE_DEAD) { + PPPDEBUG(LOG_ERR, ("pppifOutput[%d]: link not up\n", pd)); + LINK_STATS_INC(link.rterr); + LINK_STATS_INC(link.drop); + snmp_inc_ifoutdiscards(netif); + return ERR_RTE; + } + +#if PPPOE_SUPPORT + if(pc->ethif) { + return pppifOutputOverEthernet(pd, pb); + } +#endif /* PPPOE_SUPPORT */ + +#if PPPOS_SUPPORT + /* Grab an output buffer. */ + headMB = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL); + if (headMB == NULL) { + PPPDEBUG(LOG_WARNING, ("pppifOutput[%d]: first alloc fail\n", pd)); + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.drop); + snmp_inc_ifoutdiscards(netif); + return ERR_MEM; + } + +#if VJ_SUPPORT + /* + * Attempt Van Jacobson header compression if VJ is configured and + * this is an IP packet. + */ + if (protocol == PPP_IP && pc->vjEnabled) { + switch (vj_compress_tcp(&pc->vjComp, pb)) { + case TYPE_IP: + /* No change... + protocol = PPP_IP_PROTOCOL; */ + break; + case TYPE_COMPRESSED_TCP: + protocol = PPP_VJC_COMP; + break; + case TYPE_UNCOMPRESSED_TCP: + protocol = PPP_VJC_UNCOMP; + break; + default: + PPPDEBUG(LOG_WARNING, ("pppifOutput[%d]: bad IP packet\n", pd)); + LINK_STATS_INC(link.proterr); + LINK_STATS_INC(link.drop); + snmp_inc_ifoutdiscards(netif); + pbuf_free(headMB); + return ERR_VAL; + } + } +#endif /* VJ_SUPPORT */ + + tailMB = headMB; + + /* Build the PPP header. */ + if ((sys_jiffies() - pc->lastXMit) >= PPP_MAXIDLEFLAG) { + tailMB = pppAppend(PPP_FLAG, tailMB, NULL); + } + + pc->lastXMit = sys_jiffies(); + if (!pc->accomp) { + fcsOut = PPP_FCS(fcsOut, PPP_ALLSTATIONS); + tailMB = pppAppend(PPP_ALLSTATIONS, tailMB, &pc->outACCM); + fcsOut = PPP_FCS(fcsOut, PPP_UI); + tailMB = pppAppend(PPP_UI, tailMB, &pc->outACCM); + } + if (!pc->pcomp || protocol > 0xFF) { + c = (protocol >> 8) & 0xFF; + fcsOut = PPP_FCS(fcsOut, c); + tailMB = pppAppend(c, tailMB, &pc->outACCM); + } + c = protocol & 0xFF; + fcsOut = PPP_FCS(fcsOut, c); + tailMB = pppAppend(c, tailMB, &pc->outACCM); + + /* Load packet. */ + for(p = pb; p; p = p->next) { + int n; + u_char *sPtr; + + sPtr = (u_char*)p->payload; + n = p->len; + while (n-- > 0) { + c = *sPtr++; + + /* Update FCS before checking for special characters. */ + fcsOut = PPP_FCS(fcsOut, c); + + /* Copy to output buffer escaping special characters. */ + tailMB = pppAppend(c, tailMB, &pc->outACCM); + } + } + + /* Add FCS and trailing flag. */ + c = ~fcsOut & 0xFF; + tailMB = pppAppend(c, tailMB, &pc->outACCM); + c = (~fcsOut >> 8) & 0xFF; + tailMB = pppAppend(c, tailMB, &pc->outACCM); + tailMB = pppAppend(PPP_FLAG, tailMB, NULL); + + /* If we failed to complete the packet, throw it away. */ + if (!tailMB) { + PPPDEBUG(LOG_WARNING, + ("pppifOutput[%d]: Alloc err - dropping proto=%d\n", + pd, protocol)); + pbuf_free(headMB); + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.drop); + snmp_inc_ifoutdiscards(netif); + return ERR_MEM; + } + + /* Send it. */ + PPPDEBUG(LOG_INFO, ("pppifOutput[%d]: proto=0x%"X16_F"\n", pd, protocol)); + + nPut(pc, headMB); +#endif /* PPPOS_SUPPORT */ + + return ERR_OK; +} + +/* Get and set parameters for the given connection. + * Return 0 on success, an error code on failure. */ +int +pppIOCtl(int pd, int cmd, void *arg) +{ + PPPControl *pc = &pppControl[pd]; + int st = 0; + + if (pd < 0 || pd >= NUM_PPP) { + st = PPPERR_PARAM; + } else { + switch(cmd) { + case PPPCTLG_UPSTATUS: /* Get the PPP up status. */ + if (arg) { + *(int *)arg = (int)(pc->if_up); + } else { + st = PPPERR_PARAM; + } + break; + case PPPCTLS_ERRCODE: /* Set the PPP error code. */ + if (arg) { + pc->errCode = *(int *)arg; + } else { + st = PPPERR_PARAM; + } + break; + case PPPCTLG_ERRCODE: /* Get the PPP error code. */ + if (arg) { + *(int *)arg = (int)(pc->errCode); + } else { + st = PPPERR_PARAM; + } + break; +#if PPPOS_SUPPORT + case PPPCTLG_FD: /* Get the fd associated with the ppp */ + if (arg) { + *(sio_fd_t *)arg = pc->fd; + } else { + st = PPPERR_PARAM; + } + break; +#endif /* PPPOS_SUPPORT */ + default: + st = PPPERR_PARAM; + break; + } + } + + return st; +} + +/* + * Return the Maximum Transmission Unit for the given PPP connection. + */ +u_short +pppMTU(int pd) +{ + PPPControl *pc = &pppControl[pd]; + u_short st; + + /* Validate parameters. */ + if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) { + st = 0; + } else { + st = pc->mtu; + } + + return st; +} + +#if PPPOE_SUPPORT +int +pppWriteOverEthernet(int pd, const u_char *s, int n) +{ + PPPControl *pc = &pppControl[pd]; + struct pbuf *pb; + + /* skip address & flags */ + s += 2; + n -= 2; + + LWIP_ASSERT("PPPOE_HDRLEN + n <= 0xffff", PPPOE_HDRLEN + n <= 0xffff); + pb = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HDRLEN + n), PBUF_RAM); + if(!pb) { + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.proterr); + snmp_inc_ifoutdiscards(&pc->netif); + return PPPERR_ALLOC; + } + + pbuf_header(pb, -(s16_t)PPPOE_HDRLEN); + + pc->lastXMit = sys_jiffies(); + + MEMCPY(pb->payload, s, n); + + if(pppoe_xmit(pc->pppoe_sc, pb) != ERR_OK) { + LINK_STATS_INC(link.err); + snmp_inc_ifoutdiscards(&pc->netif); + return PPPERR_DEVICE; + } + + snmp_add_ifoutoctets(&pc->netif, (u16_t)n); + snmp_inc_ifoutucastpkts(&pc->netif); + LINK_STATS_INC(link.xmit); + return PPPERR_NONE; +} +#endif /* PPPOE_SUPPORT */ + +/* + * Write n characters to a ppp link. + * RETURN: >= 0 Number of characters written + * -1 Failed to write to device + */ +int +pppWrite(int pd, const u_char *s, int n) +{ + PPPControl *pc = &pppControl[pd]; +#if PPPOS_SUPPORT + u_char c; + u_int fcsOut; + struct pbuf *headMB, *tailMB; +#endif /* PPPOS_SUPPORT */ + +#if PPPOE_SUPPORT + if(pc->ethif) { + return pppWriteOverEthernet(pd, s, n); + } +#endif /* PPPOE_SUPPORT */ + +#if PPPOS_SUPPORT + headMB = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL); + if (headMB == NULL) { + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.proterr); + snmp_inc_ifoutdiscards(&pc->netif); + return PPPERR_ALLOC; + } + + tailMB = headMB; + + /* If the link has been idle, we'll send a fresh flag character to + * flush any noise. */ + if ((sys_jiffies() - pc->lastXMit) >= PPP_MAXIDLEFLAG) { + tailMB = pppAppend(PPP_FLAG, tailMB, NULL); + } + pc->lastXMit = sys_jiffies(); + + fcsOut = PPP_INITFCS; + /* Load output buffer. */ + while (n-- > 0) { + c = *s++; + + /* Update FCS before checking for special characters. */ + fcsOut = PPP_FCS(fcsOut, c); + + /* Copy to output buffer escaping special characters. */ + tailMB = pppAppend(c, tailMB, &pc->outACCM); + } + + /* Add FCS and trailing flag. */ + c = ~fcsOut & 0xFF; + tailMB = pppAppend(c, tailMB, &pc->outACCM); + c = (~fcsOut >> 8) & 0xFF; + tailMB = pppAppend(c, tailMB, &pc->outACCM); + tailMB = pppAppend(PPP_FLAG, tailMB, NULL); + + /* If we failed to complete the packet, throw it away. + * Otherwise send it. */ + if (!tailMB) { + PPPDEBUG(LOG_WARNING, + ("pppWrite[%d]: Alloc err - dropping pbuf len=%d\n", pd, headMB->len)); + /*"pppWrite[%d]: Alloc err - dropping %d:%.*H", pd, headMB->len, LWIP_MIN(headMB->len * 2, 40), headMB->payload)); */ + pbuf_free(headMB); + LINK_STATS_INC(link.memerr); + LINK_STATS_INC(link.proterr); + snmp_inc_ifoutdiscards(&pc->netif); + return PPPERR_ALLOC; + } + + PPPDEBUG(LOG_INFO, ("pppWrite[%d]: len=%d\n", pd, headMB->len)); + /* "pppWrite[%d]: %d:%.*H", pd, headMB->len, LWIP_MIN(headMB->len * 2, 40), headMB->payload)); */ + nPut(pc, headMB); +#endif /* PPPOS_SUPPORT */ + + return PPPERR_NONE; +} + +/* + * ppp_send_config - configure the transmit characteristics of + * the ppp interface. + */ +void +ppp_send_config( int unit, u16_t mtu, u32_t asyncmap, int pcomp, int accomp) +{ + PPPControl *pc = &pppControl[unit]; + int i; + + pc->mtu = mtu; + pc->pcomp = pcomp; + pc->accomp = accomp; + + /* Load the ACCM bits for the 32 control codes. */ + for (i = 0; i < 32/8; i++) { + pc->outACCM[i] = (u_char)((asyncmap >> (8 * i)) & 0xFF); + } + PPPDEBUG(LOG_INFO, ("ppp_send_config[%d]: outACCM=%X %X %X %X\n", + unit, + pc->outACCM[0], pc->outACCM[1], pc->outACCM[2], pc->outACCM[3])); +} + + +/* + * ppp_set_xaccm - set the extended transmit ACCM for the interface. + */ +void +ppp_set_xaccm(int unit, ext_accm *accm) +{ + SMEMCPY(pppControl[unit].outACCM, accm, sizeof(ext_accm)); + PPPDEBUG(LOG_INFO, ("ppp_set_xaccm[%d]: outACCM=%X %X %X %X\n", + unit, + pppControl[unit].outACCM[0], + pppControl[unit].outACCM[1], + pppControl[unit].outACCM[2], + pppControl[unit].outACCM[3])); +} + + +/* + * ppp_recv_config - configure the receive-side characteristics of + * the ppp interface. + */ +void +ppp_recv_config( int unit, int mru, u32_t asyncmap, int pcomp, int accomp) +{ + PPPControl *pc = &pppControl[unit]; + int i; + SYS_ARCH_DECL_PROTECT(lev); + + LWIP_UNUSED_ARG(accomp); + LWIP_UNUSED_ARG(pcomp); + LWIP_UNUSED_ARG(mru); + + /* Load the ACCM bits for the 32 control codes. */ + SYS_ARCH_PROTECT(lev); + for (i = 0; i < 32 / 8; i++) { + /* @todo: does this work? ext_accm has been modified from pppd! */ + pc->rx.inACCM[i] = (u_char)(asyncmap >> (i * 8)); + } + SYS_ARCH_UNPROTECT(lev); + PPPDEBUG(LOG_INFO, ("ppp_recv_config[%d]: inACCM=%X %X %X %X\n", + unit, + pc->rx.inACCM[0], pc->rx.inACCM[1], pc->rx.inACCM[2], pc->rx.inACCM[3])); +} + +#if 0 +/* + * ccp_test - ask kernel whether a given compression method + * is acceptable for use. Returns 1 if the method and parameters + * are OK, 0 if the method is known but the parameters are not OK + * (e.g. code size should be reduced), or -1 if the method is unknown. + */ +int +ccp_test( int unit, int opt_len, int for_transmit, u_char *opt_ptr) +{ + return 0; /* XXX Currently no compression. */ +} + +/* + * ccp_flags_set - inform kernel about the current state of CCP. + */ +void +ccp_flags_set(int unit, int isopen, int isup) +{ + /* XXX */ +} + +/* + * ccp_fatal_error - returns 1 if decompression was disabled as a + * result of an error detected after decompression of a packet, + * 0 otherwise. This is necessary because of patent nonsense. + */ +int +ccp_fatal_error(int unit) +{ + /* XXX */ + return 0; +} +#endif + +/* + * get_idle_time - return how long the link has been idle. + */ +int +get_idle_time(int u, struct ppp_idle *ip) +{ + /* XXX */ + LWIP_UNUSED_ARG(u); + LWIP_UNUSED_ARG(ip); + + return 0; +} + + +/* + * Return user specified netmask, modified by any mask we might determine + * for address `addr' (in network byte order). + * Here we scan through the system's list of interfaces, looking for + * any non-point-to-point interfaces which might appear to be on the same + * network as `addr'. If we find any, we OR in their netmask to the + * user-specified netmask. + */ +u32_t +GetMask(u32_t addr) +{ + u32_t mask, nmask; + + addr = htonl(addr); + if (IP_CLASSA(addr)) { /* determine network mask for address class */ + nmask = IP_CLASSA_NET; + } else if (IP_CLASSB(addr)) { + nmask = IP_CLASSB_NET; + } else { + nmask = IP_CLASSC_NET; + } + + /* class D nets are disallowed by bad_ip_adrs */ + mask = subnetMask | htonl(nmask); + + /* XXX + * Scan through the system's network interfaces. + * Get each netmask and OR them into our mask. + */ + + return mask; +} + +/* + * sifvjcomp - config tcp header compression + */ +int +sifvjcomp(int pd, int vjcomp, u8_t cidcomp, u8_t maxcid) +{ +#if PPPOS_SUPPORT && VJ_SUPPORT + PPPControl *pc = &pppControl[pd]; + + pc->vjEnabled = vjcomp; + pc->vjComp.compressSlot = cidcomp; + pc->vjComp.maxSlotIndex = maxcid; + PPPDEBUG(LOG_INFO, ("sifvjcomp: VJ compress enable=%d slot=%d max slot=%d\n", + vjcomp, cidcomp, maxcid)); +#else /* PPPOS_SUPPORT && VJ_SUPPORT */ + LWIP_UNUSED_ARG(pd); + LWIP_UNUSED_ARG(vjcomp); + LWIP_UNUSED_ARG(cidcomp); + LWIP_UNUSED_ARG(maxcid); +#endif /* PPPOS_SUPPORT && VJ_SUPPORT */ + + return 0; +} + +/* + * pppifNetifInit - netif init callback + */ +static err_t +pppifNetifInit(struct netif *netif) +{ + netif->name[0] = 'p'; + netif->name[1] = 'p'; + netif->output = pppifOutput; + netif->mtu = pppMTU((int)(size_t)netif->state); + netif->flags = NETIF_FLAG_POINTTOPOINT | NETIF_FLAG_LINK_UP; +#if LWIP_NETIF_HOSTNAME + /* @todo: Initialize interface hostname */ + /* netif_set_hostname(netif, "lwip"); */ +#endif /* LWIP_NETIF_HOSTNAME */ + return ERR_OK; +} + + +/* + * sifup - Config the interface up and enable IP packets to pass. + */ +int +sifup(int pd) +{ + PPPControl *pc = &pppControl[pd]; + int st = 1; + + if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) { + st = 0; + PPPDEBUG(LOG_WARNING, ("sifup[%d]: bad parms\n", pd)); + } else { + netif_remove(&pc->netif); + if (netif_add(&pc->netif, &pc->addrs.our_ipaddr, &pc->addrs.netmask, + &pc->addrs.his_ipaddr, (void *)(size_t)pd, pppifNetifInit, ip_input)) { + netif_set_up(&pc->netif); + pc->if_up = 1; + pc->errCode = PPPERR_NONE; + + PPPDEBUG(LOG_DEBUG, ("sifup: unit %d: linkStatusCB=%p errCode=%d\n", pd, pc->linkStatusCB, pc->errCode)); + if (pc->linkStatusCB) { + pc->linkStatusCB(pc->linkStatusCtx, pc->errCode, &pc->addrs); + } + } else { + st = 0; + PPPDEBUG(LOG_ERR, ("sifup[%d]: netif_add failed\n", pd)); + } + } + + return st; +} + +/* + * sifnpmode - Set the mode for handling packets for a given NP. + */ +int +sifnpmode(int u, int proto, enum NPmode mode) +{ + LWIP_UNUSED_ARG(u); + LWIP_UNUSED_ARG(proto); + LWIP_UNUSED_ARG(mode); + return 0; +} + +/* + * sifdown - Config the interface down and disable IP. + */ +int +sifdown(int pd) +{ + PPPControl *pc = &pppControl[pd]; + int st = 1; + + if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) { + st = 0; + PPPDEBUG(LOG_WARNING, ("sifdown[%d]: bad parms\n", pd)); + } else { + pc->if_up = 0; + /* make sure the netif status callback is called */ + netif_set_down(&pc->netif); + netif_remove(&pc->netif); + PPPDEBUG(LOG_DEBUG, ("sifdown: unit %d: linkStatusCB=%p errCode=%d\n", pd, pc->linkStatusCB, pc->errCode)); + if (pc->linkStatusCB) { + pc->linkStatusCB(pc->linkStatusCtx, PPPERR_CONNECT, NULL); + } + } + return st; +} + +/** + * sifaddr - Config the interface IP addresses and netmask. + * @param pd Interface unit ??? + * @param o Our IP address ??? + * @param h His IP address ??? + * @param m IP subnet mask ??? + * @param ns1 Primary DNS + * @param ns2 Secondary DNS + */ +int +sifaddr( int pd, u32_t o, u32_t h, u32_t m, u32_t ns1, u32_t ns2) +{ + PPPControl *pc = &pppControl[pd]; + int st = 1; + + if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) { + st = 0; + PPPDEBUG(LOG_WARNING, ("sifup[%d]: bad parms\n", pd)); + } else { + SMEMCPY(&pc->addrs.our_ipaddr, &o, sizeof(o)); + SMEMCPY(&pc->addrs.his_ipaddr, &h, sizeof(h)); + SMEMCPY(&pc->addrs.netmask, &m, sizeof(m)); + SMEMCPY(&pc->addrs.dns1, &ns1, sizeof(ns1)); + SMEMCPY(&pc->addrs.dns2, &ns2, sizeof(ns2)); + } + return st; +} + +/** + * cifaddr - Clear the interface IP addresses, and delete routes + * through the interface if possible. + * @param pd Interface unit ??? + * @param o Our IP address ??? + * @param h IP broadcast address ??? + */ +int +cifaddr( int pd, u32_t o, u32_t h) +{ + PPPControl *pc = &pppControl[pd]; + int st = 1; + + LWIP_UNUSED_ARG(o); + LWIP_UNUSED_ARG(h); + if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) { + st = 0; + PPPDEBUG(LOG_WARNING, ("sifup[%d]: bad parms\n", pd)); + } else { + IP4_ADDR(&pc->addrs.our_ipaddr, 0,0,0,0); + IP4_ADDR(&pc->addrs.his_ipaddr, 0,0,0,0); + IP4_ADDR(&pc->addrs.netmask, 255,255,255,0); + IP4_ADDR(&pc->addrs.dns1, 0,0,0,0); + IP4_ADDR(&pc->addrs.dns2, 0,0,0,0); + } + return st; +} + +/* + * sifdefaultroute - assign a default route through the address given. + */ +int +sifdefaultroute(int pd, u32_t l, u32_t g) +{ + PPPControl *pc = &pppControl[pd]; + int st = 1; + + LWIP_UNUSED_ARG(l); + LWIP_UNUSED_ARG(g); + + if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) { + st = 0; + PPPDEBUG(LOG_WARNING, ("sifup[%d]: bad parms\n", pd)); + } else { + netif_set_default(&pc->netif); + } + + /* TODO: check how PPP handled the netMask, previously not set by ipSetDefault */ + + return st; +} + +/* + * cifdefaultroute - delete a default route through the address given. + */ +int +cifdefaultroute(int pd, u32_t l, u32_t g) +{ + PPPControl *pc = &pppControl[pd]; + int st = 1; + + LWIP_UNUSED_ARG(l); + LWIP_UNUSED_ARG(g); + + if (pd < 0 || pd >= NUM_PPP || !pc->openFlag) { + st = 0; + PPPDEBUG(LOG_WARNING, ("sifup[%d]: bad parms\n", pd)); + } else { + netif_set_default(NULL); + } + + return st; +} + +/**********************************/ +/*** LOCAL FUNCTION DEFINITIONS ***/ +/**********************************/ + +#if PPPOS_SUPPORT && PPP_INPROC_OWNTHREAD +/* The main PPP process function. This implements the state machine according + * to section 4 of RFC 1661: The Point-To-Point Protocol. */ +static void +pppInputThread(void *arg) +{ + int count; + PPPControlRx *pcrx = arg; + + while (lcp_phase[pcrx->pd] != PHASE_DEAD) { + count = sio_read(pcrx->fd, pcrx->rxbuf, PPPOS_RX_BUFSIZE); + if(count > 0) { + pppInProc(pcrx, pcrx->rxbuf, count); + } else { + /* nothing received, give other tasks a chance to run */ + sys_msleep(1); + } + } +} +#endif /* PPPOS_SUPPORT && PPP_INPROC_OWNTHREAD */ + +#if PPPOE_SUPPORT + +void +pppOverEthernetInitFailed(int pd) +{ + PPPControl* pc; + + pppHup(pd); + pppStop(pd); + + pc = &pppControl[pd]; + pppoe_destroy(&pc->netif); + pc->openFlag = 0; + + if(pc->linkStatusCB) { + pc->linkStatusCB(pc->linkStatusCtx, pc->errCode ? pc->errCode : PPPERR_PROTOCOL, NULL); + } +} + +static void +pppOverEthernetLinkStatusCB(int pd, int up) +{ + if(up) { + PPPDEBUG(LOG_INFO, ("pppOverEthernetLinkStatusCB: unit %d: Connecting\n", pd)); + pppStart(pd); + } else { + pppOverEthernetInitFailed(pd); + } +} +#endif /* PPPOE_SUPPORT */ + +struct pbuf * +pppSingleBuf(struct pbuf *p) +{ + struct pbuf *q, *b; + u_char *pl; + + if(p->tot_len == p->len) { + return p; + } + + q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM); + if(!q) { + PPPDEBUG(LOG_ERR, + ("pppSingleBuf: unable to alloc new buf (%d)\n", p->tot_len)); + return p; /* live dangerously */ + } + + for(b = p, pl = q->payload; b != NULL; b = b->next) { + MEMCPY(pl, b->payload, b->len); + pl += b->len; + } + + pbuf_free(p); + + return q; +} + +struct pppInputHeader { + int unit; + u16_t proto; +}; + +/* + * Pass the processed input packet to the appropriate handler. + * This function and all handlers run in the context of the tcpip_thread + */ +static void +pppInput(void *arg) +{ + struct pbuf *nb = (struct pbuf *)arg; + u16_t protocol; + int pd; + + pd = ((struct pppInputHeader *)nb->payload)->unit; + protocol = ((struct pppInputHeader *)nb->payload)->proto; + + if(pbuf_header(nb, -(int)sizeof(struct pppInputHeader))) { + LWIP_ASSERT("pbuf_header failed\n", 0); + goto drop; + } + + LINK_STATS_INC(link.recv); + snmp_inc_ifinucastpkts(&pppControl[pd].netif); + snmp_add_ifinoctets(&pppControl[pd].netif, nb->tot_len); + + /* + * Toss all non-LCP packets unless LCP is OPEN. + * Until we get past the authentication phase, toss all packets + * except LCP, LQR and authentication packets. + */ + if((lcp_phase[pd] <= PHASE_AUTHENTICATE) && (protocol != PPP_LCP)) { + if(!((protocol == PPP_LQR) || (protocol == PPP_PAP) || (protocol == PPP_CHAP)) || + (lcp_phase[pd] != PHASE_AUTHENTICATE)) { + PPPDEBUG(LOG_INFO, ("pppInput: discarding proto 0x%"X16_F" in phase %d\n", protocol, lcp_phase[pd])); + goto drop; + } + } + + switch(protocol) { + case PPP_VJC_COMP: /* VJ compressed TCP */ +#if PPPOS_SUPPORT && VJ_SUPPORT + PPPDEBUG(LOG_INFO, ("pppInput[%d]: vj_comp in pbuf len=%d\n", pd, nb->len)); + /* + * Clip off the VJ header and prepend the rebuilt TCP/IP header and + * pass the result to IP. + */ + if ((vj_uncompress_tcp(&nb, &pppControl[pd].vjComp) >= 0) && (pppControl[pd].netif.input)) { + pppControl[pd].netif.input(nb, &pppControl[pd].netif); + return; + } + /* Something's wrong so drop it. */ + PPPDEBUG(LOG_WARNING, ("pppInput[%d]: Dropping VJ compressed\n", pd)); +#else /* PPPOS_SUPPORT && VJ_SUPPORT */ + /* No handler for this protocol so drop the packet. */ + PPPDEBUG(LOG_INFO, ("pppInput[%d]: drop VJ Comp in %d:%s\n", pd, nb->len, nb->payload)); +#endif /* PPPOS_SUPPORT && VJ_SUPPORT */ + break; + + case PPP_VJC_UNCOMP: /* VJ uncompressed TCP */ +#if PPPOS_SUPPORT && VJ_SUPPORT + PPPDEBUG(LOG_INFO, ("pppInput[%d]: vj_un in pbuf len=%d\n", pd, nb->len)); + /* + * Process the TCP/IP header for VJ header compression and then pass + * the packet to IP. + */ + if ((vj_uncompress_uncomp(nb, &pppControl[pd].vjComp) >= 0) && pppControl[pd].netif.input) { + pppControl[pd].netif.input(nb, &pppControl[pd].netif); + return; + } + /* Something's wrong so drop it. */ + PPPDEBUG(LOG_WARNING, ("pppInput[%d]: Dropping VJ uncompressed\n", pd)); +#else /* PPPOS_SUPPORT && VJ_SUPPORT */ + /* No handler for this protocol so drop the packet. */ + PPPDEBUG(LOG_INFO, + ("pppInput[%d]: drop VJ UnComp in %d:.*H\n", + pd, nb->len, LWIP_MIN(nb->len * 2, 40), nb->payload)); +#endif /* PPPOS_SUPPORT && VJ_SUPPORT */ + break; + + case PPP_IP: /* Internet Protocol */ + PPPDEBUG(LOG_INFO, ("pppInput[%d]: ip in pbuf len=%d\n", pd, nb->len)); + if (pppControl[pd].netif.input) { + pppControl[pd].netif.input(nb, &pppControl[pd].netif); + return; + } + break; + + default: { + struct protent *protp; + int i; + + /* + * Upcall the proper protocol input routine. + */ + for (i = 0; (protp = ppp_protocols[i]) != NULL; ++i) { + if (protp->protocol == protocol && protp->enabled_flag) { + PPPDEBUG(LOG_INFO, ("pppInput[%d]: %s len=%d\n", pd, protp->name, nb->len)); + nb = pppSingleBuf(nb); + (*protp->input)(pd, nb->payload, nb->len); + PPPDEBUG(LOG_DETAIL, ("pppInput[%d]: packet processed\n", pd)); + goto out; + } + } + + /* No handler for this protocol so reject the packet. */ + PPPDEBUG(LOG_INFO, ("pppInput[%d]: rejecting unsupported proto 0x%"X16_F" len=%d\n", pd, protocol, nb->len)); + if (pbuf_header(nb, sizeof(protocol))) { + LWIP_ASSERT("pbuf_header failed\n", 0); + goto drop; + } +#if BYTE_ORDER == LITTLE_ENDIAN + protocol = htons(protocol); +#endif /* BYTE_ORDER == LITTLE_ENDIAN */ + SMEMCPY(nb->payload, &protocol, sizeof(protocol)); + lcp_sprotrej(pd, nb->payload, nb->len); + } + break; + } + +drop: + LINK_STATS_INC(link.drop); + snmp_inc_ifindiscards(&pppControl[pd].netif); + +out: + pbuf_free(nb); + return; +} + +#if PPPOS_SUPPORT +/* + * Drop the input packet. + */ +static void +pppFreeCurrentInputPacket(PPPControlRx *pcrx) +{ + if (pcrx->inHead != NULL) { + if (pcrx->inTail && (pcrx->inTail != pcrx->inHead)) { + pbuf_free(pcrx->inTail); + } + pbuf_free(pcrx->inHead); + pcrx->inHead = NULL; + } + pcrx->inTail = NULL; +} + +/* + * Drop the input packet and increase error counters. + */ +static void +pppDrop(PPPControlRx *pcrx) +{ + if (pcrx->inHead != NULL) { +#if 0 + PPPDEBUG(LOG_INFO, ("pppDrop: %d:%.*H\n", pcrx->inHead->len, min(60, pcrx->inHead->len * 2), pcrx->inHead->payload)); +#endif + PPPDEBUG(LOG_INFO, ("pppDrop: pbuf len=%d, addr %p\n", pcrx->inHead->len, (void*)pcrx->inHead)); + } + pppFreeCurrentInputPacket(pcrx); +#if VJ_SUPPORT + vj_uncompress_err(&pppControl[pcrx->pd].vjComp); +#endif /* VJ_SUPPORT */ + + LINK_STATS_INC(link.drop); + snmp_inc_ifindiscards(&pppControl[pcrx->pd].netif); +} + +#if !PPP_INPROC_OWNTHREAD +/** Pass received raw characters to PPPoS to be decoded. This function is + * thread-safe and can be called from a dedicated RX-thread or from a main-loop. + * + * @param pd PPP descriptor index, returned by pppOpen() + * @param data received data + * @param len length of received data + */ +void +pppos_input(int pd, u_char* data, int len) +{ + pppInProc(&pppControl[pd].rx, data, len); +} +#endif + +/** + * Process a received octet string. + */ +static void +pppInProc(PPPControlRx *pcrx, u_char *s, int l) +{ + struct pbuf *nextNBuf; + u_char curChar; + u_char escaped; + SYS_ARCH_DECL_PROTECT(lev); + + PPPDEBUG(LOG_DEBUG, ("pppInProc[%d]: got %d bytes\n", pcrx->pd, l)); + while (l-- > 0) { + curChar = *s++; + + SYS_ARCH_PROTECT(lev); + escaped = ESCAPE_P(pcrx->inACCM, curChar); + SYS_ARCH_UNPROTECT(lev); + /* Handle special characters. */ + if (escaped) { + /* Check for escape sequences. */ + /* XXX Note that this does not handle an escaped 0x5d character which + * would appear as an escape character. Since this is an ASCII ']' + * and there is no reason that I know of to escape it, I won't complicate + * the code to handle this case. GLL */ + if (curChar == PPP_ESCAPE) { + pcrx->inEscaped = 1; + /* Check for the flag character. */ + } else if (curChar == PPP_FLAG) { + /* If this is just an extra flag character, ignore it. */ + if (pcrx->inState <= PDADDRESS) { + /* ignore it */; + /* If we haven't received the packet header, drop what has come in. */ + } else if (pcrx->inState < PDDATA) { + PPPDEBUG(LOG_WARNING, + ("pppInProc[%d]: Dropping incomplete packet %d\n", + pcrx->pd, pcrx->inState)); + LINK_STATS_INC(link.lenerr); + pppDrop(pcrx); + /* If the fcs is invalid, drop the packet. */ + } else if (pcrx->inFCS != PPP_GOODFCS) { + PPPDEBUG(LOG_INFO, + ("pppInProc[%d]: Dropping bad fcs 0x%"X16_F" proto=0x%"X16_F"\n", + pcrx->pd, pcrx->inFCS, pcrx->inProtocol)); + /* Note: If you get lots of these, check for UART frame errors or try different baud rate */ + LINK_STATS_INC(link.chkerr); + pppDrop(pcrx); + /* Otherwise it's a good packet so pass it on. */ + } else { + struct pbuf *inp; + /* Trim off the checksum. */ + if(pcrx->inTail->len >= 2) { + pcrx->inTail->len -= 2; + + pcrx->inTail->tot_len = pcrx->inTail->len; + if (pcrx->inTail != pcrx->inHead) { + pbuf_cat(pcrx->inHead, pcrx->inTail); + } + } else { + pcrx->inTail->tot_len = pcrx->inTail->len; + if (pcrx->inTail != pcrx->inHead) { + pbuf_cat(pcrx->inHead, pcrx->inTail); + } + + pbuf_realloc(pcrx->inHead, pcrx->inHead->tot_len - 2); + } + + /* Dispatch the packet thereby consuming it. */ + inp = pcrx->inHead; + /* Packet consumed, release our references. */ + pcrx->inHead = NULL; + pcrx->inTail = NULL; +#if PPP_INPROC_MULTITHREADED + if(tcpip_callback_with_block(pppInput, inp, 0) != ERR_OK) { + PPPDEBUG(LOG_ERR, ("pppInProc[%d]: tcpip_callback() failed, dropping packet\n", pcrx->pd)); + pbuf_free(inp); + LINK_STATS_INC(link.drop); + snmp_inc_ifindiscards(&pppControl[pcrx->pd].netif); + } +#else /* PPP_INPROC_MULTITHREADED */ + pppInput(inp); +#endif /* PPP_INPROC_MULTITHREADED */ + } + + /* Prepare for a new packet. */ + pcrx->inFCS = PPP_INITFCS; + pcrx->inState = PDADDRESS; + pcrx->inEscaped = 0; + /* Other characters are usually control characters that may have + * been inserted by the physical layer so here we just drop them. */ + } else { + PPPDEBUG(LOG_WARNING, + ("pppInProc[%d]: Dropping ACCM char <%d>\n", pcrx->pd, curChar)); + } + /* Process other characters. */ + } else { + /* Unencode escaped characters. */ + if (pcrx->inEscaped) { + pcrx->inEscaped = 0; + curChar ^= PPP_TRANS; + } + + /* Process character relative to current state. */ + switch(pcrx->inState) { + case PDIDLE: /* Idle state - waiting. */ + /* Drop the character if it's not 0xff + * we would have processed a flag character above. */ + if (curChar != PPP_ALLSTATIONS) { + break; + } + + /* Fall through */ + case PDSTART: /* Process start flag. */ + /* Prepare for a new packet. */ + pcrx->inFCS = PPP_INITFCS; + + /* Fall through */ + case PDADDRESS: /* Process address field. */ + if (curChar == PPP_ALLSTATIONS) { + pcrx->inState = PDCONTROL; + break; + } + /* Else assume compressed address and control fields so + * fall through to get the protocol... */ + case PDCONTROL: /* Process control field. */ + /* If we don't get a valid control code, restart. */ + if (curChar == PPP_UI) { + pcrx->inState = PDPROTOCOL1; + break; + } +#if 0 + else { + PPPDEBUG(LOG_WARNING, + ("pppInProc[%d]: Invalid control <%d>\n", pcrx->pd, curChar)); + pcrx->inState = PDSTART; + } +#endif + case PDPROTOCOL1: /* Process protocol field 1. */ + /* If the lower bit is set, this is the end of the protocol + * field. */ + if (curChar & 1) { + pcrx->inProtocol = curChar; + pcrx->inState = PDDATA; + } else { + pcrx->inProtocol = (u_int)curChar << 8; + pcrx->inState = PDPROTOCOL2; + } + break; + case PDPROTOCOL2: /* Process protocol field 2. */ + pcrx->inProtocol |= curChar; + pcrx->inState = PDDATA; + break; + case PDDATA: /* Process data byte. */ + /* Make space to receive processed data. */ + if (pcrx->inTail == NULL || pcrx->inTail->len == PBUF_POOL_BUFSIZE) { + if (pcrx->inTail != NULL) { + pcrx->inTail->tot_len = pcrx->inTail->len; + if (pcrx->inTail != pcrx->inHead) { + pbuf_cat(pcrx->inHead, pcrx->inTail); + /* give up the inTail reference now */ + pcrx->inTail = NULL; + } + } + /* If we haven't started a packet, we need a packet header. */ + nextNBuf = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL); + if (nextNBuf == NULL) { + /* No free buffers. Drop the input packet and let the + * higher layers deal with it. Continue processing + * the received pbuf chain in case a new packet starts. */ + PPPDEBUG(LOG_ERR, ("pppInProc[%d]: NO FREE MBUFS!\n", pcrx->pd)); + LINK_STATS_INC(link.memerr); + pppDrop(pcrx); + pcrx->inState = PDSTART; /* Wait for flag sequence. */ + break; + } + if (pcrx->inHead == NULL) { + struct pppInputHeader *pih = nextNBuf->payload; + + pih->unit = pcrx->pd; + pih->proto = pcrx->inProtocol; + + nextNBuf->len += sizeof(*pih); + + pcrx->inHead = nextNBuf; + } + pcrx->inTail = nextNBuf; + } + /* Load character into buffer. */ + ((u_char*)pcrx->inTail->payload)[pcrx->inTail->len++] = curChar; + break; + } + + /* update the frame check sequence number. */ + pcrx->inFCS = PPP_FCS(pcrx->inFCS, curChar); + } + } /* while (l-- > 0), all bytes processed */ + + avRandomize(); +} +#endif /* PPPOS_SUPPORT */ + +#if PPPOE_SUPPORT +void +pppInProcOverEthernet(int pd, struct pbuf *pb) +{ + struct pppInputHeader *pih; + u16_t inProtocol; + + if(pb->len < sizeof(inProtocol)) { + PPPDEBUG(LOG_ERR, ("pppInProcOverEthernet: too small for protocol field\n")); + goto drop; + } + + inProtocol = (((u8_t *)pb->payload)[0] << 8) | ((u8_t*)pb->payload)[1]; + + /* make room for pppInputHeader - should not fail */ + if (pbuf_header(pb, sizeof(*pih) - sizeof(inProtocol)) != 0) { + PPPDEBUG(LOG_ERR, ("pppInProcOverEthernet: could not allocate room for header\n")); + goto drop; + } + + pih = pb->payload; + + pih->unit = pd; + pih->proto = inProtocol; + + /* Dispatch the packet thereby consuming it. */ + pppInput(pb); + return; + +drop: + LINK_STATS_INC(link.drop); + snmp_inc_ifindiscards(&pppControl[pd].netif); + pbuf_free(pb); + return; +} +#endif /* PPPOE_SUPPORT */ + +#if LWIP_NETIF_STATUS_CALLBACK +/** Set the status callback of a PPP's netif + * + * @param pd The PPP descriptor returned by pppOpen() + * @param status_callback pointer to the status callback function + * + * @see netif_set_status_callback + */ +void +ppp_set_netif_statuscallback(int pd, netif_status_callback_fn status_callback) +{ + netif_set_status_callback(&pppControl[pd].netif, status_callback); +} +#endif /* LWIP_NETIF_STATUS_CALLBACK */ + +#if LWIP_NETIF_LINK_CALLBACK +/** Set the link callback of a PPP's netif + * + * @param pd The PPP descriptor returned by pppOpen() + * @param link_callback pointer to the link callback function + * + * @see netif_set_link_callback + */ +void +ppp_set_netif_linkcallback(int pd, netif_status_callback_fn link_callback) +{ + netif_set_link_callback(&pppControl[pd].netif, link_callback); +} +#endif /* LWIP_NETIF_LINK_CALLBACK */ + +#endif /* PPP_SUPPORT */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/ppp.h b/third_party/lwip-1.4.1/src/netif/ppp/ppp.h new file mode 100644 index 0000000..f8ec6c3 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/ppp.h @@ -0,0 +1,201 @@ +/***************************************************************************** +* ppp.h - Network Point to Point Protocol header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-11-05 Guy Lancaster , Global Election Systems Inc. +* Original derived from BSD codes. +*****************************************************************************/ + +#ifndef PPP_H +#define PPP_H + +#include "lwip/opt.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#include "lwip/def.h" +#include "lwip/sio.h" +#include "lwip/stats.h" +#include "lwip/mem.h" +#include "lwip/netif.h" +#include "lwip/sys.h" +#include "lwip/timers.h" + + +#ifndef __u_char_defined + +/* Type definitions for BSD code. */ +typedef unsigned long u_long; +typedef unsigned int u_int; +typedef unsigned short u_short; +typedef unsigned char u_char; + +#endif + + +/************************* +*** PUBLIC DEFINITIONS *** +*************************/ + +/* Error codes. */ +#define PPPERR_NONE 0 /* No error. */ +#define PPPERR_PARAM -1 /* Invalid parameter. */ +#define PPPERR_OPEN -2 /* Unable to open PPP session. */ +#define PPPERR_DEVICE -3 /* Invalid I/O device for PPP. */ +#define PPPERR_ALLOC -4 /* Unable to allocate resources. */ +#define PPPERR_USER -5 /* User interrupt. */ +#define PPPERR_CONNECT -6 /* Connection lost. */ +#define PPPERR_AUTHFAIL -7 /* Failed authentication challenge. */ +#define PPPERR_PROTOCOL -8 /* Failed to meet protocol. */ + +/* + * PPP IOCTL commands. + */ +/* + * Get the up status - 0 for down, non-zero for up. The argument must + * point to an int. + */ +#define PPPCTLG_UPSTATUS 100 /* Get the up status - 0 down else up */ +#define PPPCTLS_ERRCODE 101 /* Set the error code */ +#define PPPCTLG_ERRCODE 102 /* Get the error code */ +#define PPPCTLG_FD 103 /* Get the fd associated with the ppp */ + +/************************ +*** PUBLIC DATA TYPES *** +************************/ + +struct ppp_addrs { + ip_addr_t our_ipaddr, his_ipaddr, netmask, dns1, dns2; +}; + + +/*********************** +*** PUBLIC FUNCTIONS *** +***********************/ + +/* Initialize the PPP subsystem. */ +void pppInit(void); + +/* Warning: Using PPPAUTHTYPE_ANY might have security consequences. + * RFC 1994 says: + * + * In practice, within or associated with each PPP server, there is a + * database which associates "user" names with authentication + * information ("secrets"). It is not anticipated that a particular + * named user would be authenticated by multiple methods. This would + * make the user vulnerable to attacks which negotiate the least secure + * method from among a set (such as PAP rather than CHAP). If the same + * secret was used, PAP would reveal the secret to be used later with + * CHAP. + * + * Instead, for each user name there should be an indication of exactly + * one method used to authenticate that user name. If a user needs to + * make use of different authentication methods under different + * circumstances, then distinct user names SHOULD be employed, each of + * which identifies exactly one authentication method. + * + */ +enum pppAuthType { + PPPAUTHTYPE_NONE, + PPPAUTHTYPE_ANY, + PPPAUTHTYPE_PAP, + PPPAUTHTYPE_CHAP +}; + +void pppSetAuth(enum pppAuthType authType, const char *user, const char *passwd); + +/* Link status callback function prototype */ +typedef void (*pppLinkStatusCB_fn)(void *ctx, int errCode, void *arg); + +#if PPPOS_SUPPORT +/* + * Open a new PPP connection using the given serial I/O device. + * This initializes the PPP control block but does not + * attempt to negotiate the LCP session. + * Return a new PPP connection descriptor on success or + * an error code (negative) on failure. + */ +int pppOverSerialOpen(sio_fd_t fd, pppLinkStatusCB_fn linkStatusCB, void *linkStatusCtx); +#endif /* PPPOS_SUPPORT */ + +#if PPPOE_SUPPORT +/* + * Open a new PPP Over Ethernet (PPPOE) connection. + */ +int pppOverEthernetOpen(struct netif *ethif, const char *service_name, const char *concentrator_name, + pppLinkStatusCB_fn linkStatusCB, void *linkStatusCtx); +#endif /* PPPOE_SUPPORT */ + +/* for source code compatibility */ +#define pppOpen(fd,cb,ls) pppOverSerialOpen(fd,cb,ls) + +/* + * Close a PPP connection and release the descriptor. + * Any outstanding packets in the queues are dropped. + * Return 0 on success, an error code on failure. + */ +int pppClose(int pd); + +/* + * Indicate to the PPP process that the line has disconnected. + */ +void pppSigHUP(int pd); + +/* + * Get and set parameters for the given connection. + * Return 0 on success, an error code on failure. + */ +int pppIOCtl(int pd, int cmd, void *arg); + +/* + * Return the Maximum Transmission Unit for the given PPP connection. + */ +u_short pppMTU(int pd); + +#if PPPOS_SUPPORT && !PPP_INPROC_OWNTHREAD +/* + * PPP over Serial: this is the input function to be called for received data. + * If PPP_INPROC_OWNTHREAD==1, a seperate input thread using the blocking + * sio_read() is used, so this is deactivated. + */ +void pppos_input(int pd, u_char* data, int len); +#endif /* PPPOS_SUPPORT && !PPP_INPROC_OWNTHREAD */ + + +#if LWIP_NETIF_STATUS_CALLBACK +/* Set an lwIP-style status-callback for the selected PPP device */ +void ppp_set_netif_statuscallback(int pd, netif_status_callback_fn status_callback); +#endif /* LWIP_NETIF_STATUS_CALLBACK */ +#if LWIP_NETIF_LINK_CALLBACK +/* Set an lwIP-style link-callback for the selected PPP device */ +void ppp_set_netif_linkcallback(int pd, netif_status_callback_fn link_callback); +#endif /* LWIP_NETIF_LINK_CALLBACK */ + +#endif /* PPP_SUPPORT */ + +#endif /* PPP_H */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/ppp_impl.h b/third_party/lwip-1.4.1/src/netif/ppp/ppp_impl.h new file mode 100644 index 0000000..aadfc4e --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/ppp_impl.h @@ -0,0 +1,363 @@ +/***************************************************************************** +* ppp.h - Network Point to Point Protocol header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1997 Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 97-11-05 Guy Lancaster , Global Election Systems Inc. +* Original derived from BSD codes. +*****************************************************************************/ + +#ifndef PPP_IMPL_H +#define PPP_IMPL_H + +#include "lwip/opt.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#include "ppp.h" +#include "lwip/def.h" +#include "lwip/sio.h" +#include "lwip/stats.h" +#include "lwip/mem.h" +#include "lwip/netif.h" +#include "lwip/sys.h" +#include "lwip/timers.h" + +/** Some defines for code we skip compared to the original pppd. + * These are just here to minimise the use of the ugly "#if 0". */ +#define PPP_ADDITIONAL_CALLBACKS 0 + +/** Some error checks to test for unsupported code */ +#if CBCP_SUPPORT +#error "CBCP is not supported in lwIP PPP" +#endif +#if CCP_SUPPORT +#error "CCP is not supported in lwIP PPP" +#endif + +/* + * pppd.h - PPP daemon global declarations. + * + * Copyright (c) 1989 Carnegie Mellon University. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by Carnegie Mellon University. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + */ +/* + * ppp_defs.h - PPP definitions. + * + * Copyright (c) 1994 The Australian National University. + * All rights reserved. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation is hereby granted, provided that the above copyright + * notice appears in all copies. This software is provided without any + * warranty, express or implied. The Australian National University + * makes no representations about the suitability of this software for + * any purpose. + * + * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY + * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF + * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO + * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, + * OR MODIFICATIONS. + */ + +#define TIMEOUT(f, a, t) do { sys_untimeout((f), (a)); sys_timeout((t)*1000, (f), (a)); } while(0) +#define UNTIMEOUT(f, a) sys_untimeout((f), (a)) + + +/* + * Constants and structures defined by the internet system, + * Per RFC 790, September 1981, and numerous additions. + */ + +/* + * The basic PPP frame. + */ +#define PPP_HDRLEN 4 /* octets for standard ppp header */ +#define PPP_FCSLEN 2 /* octets for FCS */ + + +/* + * Significant octet values. + */ +#define PPP_ALLSTATIONS 0xff /* All-Stations broadcast address */ +#define PPP_UI 0x03 /* Unnumbered Information */ +#define PPP_FLAG 0x7e /* Flag Sequence */ +#define PPP_ESCAPE 0x7d /* Asynchronous Control Escape */ +#define PPP_TRANS 0x20 /* Asynchronous transparency modifier */ + +/* + * Protocol field values. + */ +#define PPP_IP 0x21 /* Internet Protocol */ +#define PPP_AT 0x29 /* AppleTalk Protocol */ +#define PPP_VJC_COMP 0x2d /* VJ compressed TCP */ +#define PPP_VJC_UNCOMP 0x2f /* VJ uncompressed TCP */ +#define PPP_COMP 0xfd /* compressed packet */ +#define PPP_IPCP 0x8021 /* IP Control Protocol */ +#define PPP_ATCP 0x8029 /* AppleTalk Control Protocol */ +#define PPP_CCP 0x80fd /* Compression Control Protocol */ +#define PPP_LCP 0xc021 /* Link Control Protocol */ +#define PPP_PAP 0xc023 /* Password Authentication Protocol */ +#define PPP_LQR 0xc025 /* Link Quality Report protocol */ +#define PPP_CHAP 0xc223 /* Cryptographic Handshake Auth. Protocol */ +#define PPP_CBCP 0xc029 /* Callback Control Protocol */ + +/* + * Values for FCS calculations. + */ +#define PPP_INITFCS 0xffff /* Initial FCS value */ +#define PPP_GOODFCS 0xf0b8 /* Good final FCS value */ +#define PPP_FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff]) + +/* + * Extended asyncmap - allows any character to be escaped. + */ +typedef u_char ext_accm[32]; + +/* + * What to do with network protocol (NP) packets. + */ +enum NPmode { + NPMODE_PASS, /* pass the packet through */ + NPMODE_DROP, /* silently drop the packet */ + NPMODE_ERROR, /* return an error */ + NPMODE_QUEUE /* save it up for later. */ +}; + +/* + * Inline versions of get/put char/short/long. + * Pointer is advanced; we assume that both arguments + * are lvalues and will already be in registers. + * cp MUST be u_char *. + */ +#define GETCHAR(c, cp) { \ + (c) = *(cp)++; \ +} +#define PUTCHAR(c, cp) { \ + *(cp)++ = (u_char) (c); \ +} + + +#define GETSHORT(s, cp) { \ + (s) = *(cp); (cp)++; (s) <<= 8; \ + (s) |= *(cp); (cp)++; \ +} +#define PUTSHORT(s, cp) { \ + *(cp)++ = (u_char) ((s) >> 8); \ + *(cp)++ = (u_char) (s & 0xff); \ +} + +#define GETLONG(l, cp) { \ + (l) = *(cp); (cp)++; (l) <<= 8; \ + (l) |= *(cp); (cp)++; (l) <<= 8; \ + (l) |= *(cp); (cp)++; (l) <<= 8; \ + (l) |= *(cp); (cp)++; \ +} +#define PUTLONG(l, cp) { \ + *(cp)++ = (u_char) ((l) >> 24); \ + *(cp)++ = (u_char) ((l) >> 16); \ + *(cp)++ = (u_char) ((l) >> 8); \ + *(cp)++ = (u_char) (l); \ +} + + +#define INCPTR(n, cp) ((cp) += (n)) +#define DECPTR(n, cp) ((cp) -= (n)) + +#define BCMP(s0, s1, l) memcmp((u_char *)(s0), (u_char *)(s1), (l)) +#define BCOPY(s, d, l) MEMCPY((d), (s), (l)) +#define BZERO(s, n) memset(s, 0, n) + +#if PPP_DEBUG +#define PRINTMSG(m, l) { m[l] = '\0'; LWIP_DEBUGF(LOG_INFO, ("Remote message: %s\n", m)); } +#else /* PPP_DEBUG */ +#define PRINTMSG(m, l) +#endif /* PPP_DEBUG */ + +/* + * MAKEHEADER - Add PPP Header fields to a packet. + */ +#define MAKEHEADER(p, t) { \ + PUTCHAR(PPP_ALLSTATIONS, p); \ + PUTCHAR(PPP_UI, p); \ + PUTSHORT(t, p); } + +/************************ +*** PUBLIC DATA TYPES *** +************************/ + +/* + * The following struct gives the addresses of procedures to call + * for a particular protocol. + */ +struct protent { + u_short protocol; /* PPP protocol number */ + /* Initialization procedure */ + void (*init) (int unit); + /* Process a received packet */ + void (*input) (int unit, u_char *pkt, int len); + /* Process a received protocol-reject */ + void (*protrej) (int unit); + /* Lower layer has come up */ + void (*lowerup) (int unit); + /* Lower layer has gone down */ + void (*lowerdown) (int unit); + /* Open the protocol */ + void (*open) (int unit); + /* Close the protocol */ + void (*close) (int unit, char *reason); +#if PPP_ADDITIONAL_CALLBACKS + /* Print a packet in readable form */ + int (*printpkt) (u_char *pkt, int len, + void (*printer) (void *, char *, ...), + void *arg); + /* Process a received data packet */ + void (*datainput) (int unit, u_char *pkt, int len); +#endif /* PPP_ADDITIONAL_CALLBACKS */ + int enabled_flag; /* 0 if protocol is disabled */ + char *name; /* Text name of protocol */ +#if PPP_ADDITIONAL_CALLBACKS + /* Check requested options, assign defaults */ + void (*check_options) (u_long); + /* Configure interface for demand-dial */ + int (*demand_conf) (int unit); + /* Say whether to bring up link for this pkt */ + int (*active_pkt) (u_char *pkt, int len); +#endif /* PPP_ADDITIONAL_CALLBACKS */ +}; + +/* + * The following structure records the time in seconds since + * the last NP packet was sent or received. + */ +struct ppp_idle { + u_short xmit_idle; /* seconds since last NP packet sent */ + u_short recv_idle; /* seconds since last NP packet received */ +}; + +struct ppp_settings { + + u_int disable_defaultip : 1; /* Don't use hostname for default IP addrs */ + u_int auth_required : 1; /* Peer is required to authenticate */ + u_int explicit_remote : 1; /* remote_name specified with remotename opt */ + u_int refuse_pap : 1; /* Don't wanna auth. ourselves with PAP */ + u_int refuse_chap : 1; /* Don't wanna auth. ourselves with CHAP */ + u_int usehostname : 1; /* Use hostname for our_name */ + u_int usepeerdns : 1; /* Ask peer for DNS adds */ + + u_short idle_time_limit; /* Shut down link if idle for this long */ + int maxconnect; /* Maximum connect time (seconds) */ + + char user [MAXNAMELEN + 1]; /* Username for PAP */ + char passwd [MAXSECRETLEN + 1]; /* Password for PAP, secret for CHAP */ + char our_name [MAXNAMELEN + 1]; /* Our name for authentication purposes */ + char remote_name[MAXNAMELEN + 1]; /* Peer's name for authentication */ +}; + +/***************************** +*** PUBLIC DATA STRUCTURES *** +*****************************/ + +/* Buffers for outgoing packets. */ +extern u_char outpacket_buf[NUM_PPP][PPP_MRU+PPP_HDRLEN]; + +extern struct ppp_settings ppp_settings; + +extern struct protent *ppp_protocols[]; /* Table of pointers to supported protocols */ + + +/*********************** +*** PUBLIC FUNCTIONS *** +***********************/ + +/* + * Write n characters to a ppp link. + * RETURN: >= 0 Number of characters written, -1 Failed to write to device. + */ +int pppWrite(int pd, const u_char *s, int n); + +void pppInProcOverEthernet(int pd, struct pbuf *pb); + +struct pbuf *pppSingleBuf(struct pbuf *p); + +void pppLinkTerminated(int pd); + +void pppLinkDown(int pd); + +/* Configure i/f transmit parameters */ +void ppp_send_config (int, u16_t, u32_t, int, int); +/* Set extended transmit ACCM */ +void ppp_set_xaccm (int, ext_accm *); +/* Configure i/f receive parameters */ +void ppp_recv_config (int, int, u32_t, int, int); +/* Find out how long link has been idle */ +int get_idle_time (int, struct ppp_idle *); + +/* Configure VJ TCP header compression */ +int sifvjcomp (int, int, u8_t, u8_t); +/* Configure i/f down (for IP) */ +int sifup (int); +/* Set mode for handling packets for proto */ +int sifnpmode (int u, int proto, enum NPmode mode); +/* Configure i/f down (for IP) */ +int sifdown (int); +/* Configure IP addresses for i/f */ +int sifaddr (int, u32_t, u32_t, u32_t, u32_t, u32_t); +/* Reset i/f IP addresses */ +int cifaddr (int, u32_t, u32_t); +/* Create default route through i/f */ +int sifdefaultroute (int, u32_t, u32_t); +/* Delete default route through i/f */ +int cifdefaultroute (int, u32_t, u32_t); + +/* Get appropriate netmask for address */ +u32_t GetMask (u32_t); + +#endif /* PPP_SUPPORT */ + +#endif /* PPP_IMPL_H */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/ppp_oe.c b/third_party/lwip-1.4.1/src/netif/ppp/ppp_oe.c new file mode 100644 index 0000000..9718bcb --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/ppp_oe.c @@ -0,0 +1,1132 @@ +/***************************************************************************** +* ppp_oe.c - PPP Over Ethernet implementation for lwIP. +* +* Copyright (c) 2006 by Marc Boucher, Services Informatiques (MBSI) inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 06-01-01 Marc Boucher +* Ported to lwIP. +*****************************************************************************/ + + + +/* based on NetBSD: if_pppoe.c,v 1.64 2006/01/31 23:50:15 martin Exp */ + +/*- + * Copyright (c) 2002 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Martin Husemann . + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "lwip/opt.h" + +#if PPPOE_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#include "netif/ppp_oe.h" + +#include "ppp_impl.h" +#include "pppdebug.h" + +#include "lwip/timers.h" +#include "lwip/memp.h" + +#include +#include + + +/* Add a 16 bit unsigned value to a buffer pointed to by PTR */ +#define PPPOE_ADD_16(PTR, VAL) \ + *(PTR)++ = (u8_t)((VAL) / 256); \ + *(PTR)++ = (u8_t)((VAL) % 256) + +/* Add a complete PPPoE header to the buffer pointed to by PTR */ +#define PPPOE_ADD_HEADER(PTR, CODE, SESS, LEN) \ + *(PTR)++ = PPPOE_VERTYPE; \ + *(PTR)++ = (CODE); \ + PPPOE_ADD_16(PTR, SESS); \ + PPPOE_ADD_16(PTR, LEN) + +#define PPPOE_DISC_TIMEOUT (5*1000) /* base for quick timeout calculation */ +#define PPPOE_SLOW_RETRY (60*1000) /* persistent retry interval */ +#define PPPOE_DISC_MAXPADI 4 /* retry PADI four times (quickly) */ +#define PPPOE_DISC_MAXPADR 2 /* retry PADR twice */ + +#ifdef PPPOE_SERVER +#error "PPPOE_SERVER is not yet supported under lwIP!" +/* from if_spppsubr.c */ +#define IFF_PASSIVE IFF_LINK0 /* wait passively for connection */ +#endif + +#ifndef PPPOE_ERRORSTRING_LEN +#define PPPOE_ERRORSTRING_LEN 64 +#endif +static char pppoe_error_tmp[PPPOE_ERRORSTRING_LEN]; + + +/* input routines */ +static void pppoe_dispatch_disc_pkt(struct netif *, struct pbuf *); + +/* management routines */ +static int pppoe_do_disconnect(struct pppoe_softc *); +static void pppoe_abort_connect(struct pppoe_softc *); +static void pppoe_clear_softc(struct pppoe_softc *, const char *); + +/* internal timeout handling */ +static void pppoe_timeout(void *); + +/* sending actual protocol controll packets */ +static err_t pppoe_send_padi(struct pppoe_softc *); +static err_t pppoe_send_padr(struct pppoe_softc *); +#ifdef PPPOE_SERVER +static err_t pppoe_send_pado(struct pppoe_softc *); +static err_t pppoe_send_pads(struct pppoe_softc *); +#endif +static err_t pppoe_send_padt(struct netif *, u_int, const u8_t *); + +/* internal helper functions */ +static struct pppoe_softc * pppoe_find_softc_by_session(u_int, struct netif *); +static struct pppoe_softc * pppoe_find_softc_by_hunique(u8_t *, size_t, struct netif *); + +/** linked list of created pppoe interfaces */ +static struct pppoe_softc *pppoe_softc_list; + +err_t +pppoe_create(struct netif *ethif, int pd, void (*linkStatusCB)(int pd, int up), struct pppoe_softc **scptr) +{ + struct pppoe_softc *sc; + + sc = (struct pppoe_softc *)memp_malloc(MEMP_PPPOE_IF); + if (sc == NULL) { + *scptr = NULL; + return ERR_MEM; + } + memset(sc, 0, sizeof(struct pppoe_softc)); + + /* changed to real address later */ + MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest)); + + sc->sc_pd = pd; + sc->sc_linkStatusCB = linkStatusCB; + sc->sc_ethif = ethif; + + /* put the new interface at the head of the list */ + sc->next = pppoe_softc_list; + pppoe_softc_list = sc; + + *scptr = sc; + + return ERR_OK; +} + +err_t +pppoe_destroy(struct netif *ifp) +{ + struct pppoe_softc *sc, *prev = NULL; + + for (sc = pppoe_softc_list; sc != NULL; prev = sc, sc = sc->next) { + if (sc->sc_ethif == ifp) { + break; + } + } + + if(!(sc && (sc->sc_ethif == ifp))) { + return ERR_IF; + } + + sys_untimeout(pppoe_timeout, sc); + if (prev == NULL) { + /* remove sc from the head of the list */ + pppoe_softc_list = sc->next; + } else { + /* remove sc from the list */ + prev->next = sc->next; + } + +#ifdef PPPOE_TODO + if (sc->sc_concentrator_name) { + mem_free(sc->sc_concentrator_name); + } + if (sc->sc_service_name) { + mem_free(sc->sc_service_name); + } +#endif /* PPPOE_TODO */ + memp_free(MEMP_PPPOE_IF, sc); + + return ERR_OK; +} + +/* + * Find the interface handling the specified session. + * Note: O(number of sessions open), this is a client-side only, mean + * and lean implementation, so number of open sessions typically should + * be 1. + */ +static struct pppoe_softc * +pppoe_find_softc_by_session(u_int session, struct netif *rcvif) +{ + struct pppoe_softc *sc; + + if (session == 0) { + return NULL; + } + + for (sc = pppoe_softc_list; sc != NULL; sc = sc->next) { + if (sc->sc_state == PPPOE_STATE_SESSION + && sc->sc_session == session) { + if (sc->sc_ethif == rcvif) { + return sc; + } else { + return NULL; + } + } + } + return NULL; +} + +/* Check host unique token passed and return appropriate softc pointer, + * or NULL if token is bogus. */ +static struct pppoe_softc * +pppoe_find_softc_by_hunique(u8_t *token, size_t len, struct netif *rcvif) +{ + struct pppoe_softc *sc, *t; + + if (pppoe_softc_list == NULL) { + return NULL; + } + + if (len != sizeof sc) { + return NULL; + } + MEMCPY(&t, token, len); + + for (sc = pppoe_softc_list; sc != NULL; sc = sc->next) { + if (sc == t) { + break; + } + } + + if (sc == NULL) { + PPPDEBUG(LOG_DEBUG, ("pppoe: alien host unique tag, no session found\n")); + return NULL; + } + + /* should be safe to access *sc now */ + if (sc->sc_state < PPPOE_STATE_PADI_SENT || sc->sc_state >= PPPOE_STATE_SESSION) { + printf("%c%c%"U16_F": host unique tag found, but it belongs to a connection in state %d\n", + sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, sc->sc_state); + return NULL; + } + if (sc->sc_ethif != rcvif) { + printf("%c%c%"U16_F": wrong interface, not accepting host unique\n", + sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num); + return NULL; + } + return sc; +} + +static void +pppoe_linkstatus_up(struct pppoe_softc *sc) +{ + sc->sc_linkStatusCB(sc->sc_pd, 1); +} + +/* analyze and handle a single received packet while not in session state */ +static void +pppoe_dispatch_disc_pkt(struct netif *netif, struct pbuf *pb) +{ + u16_t tag, len; + u16_t session, plen; + struct pppoe_softc *sc; + const char *err_msg; + char devname[6]; + u8_t *ac_cookie; + u16_t ac_cookie_len; +#ifdef PPPOE_SERVER + u8_t *hunique; + size_t hunique_len; +#endif + struct pppoehdr *ph; + struct pppoetag pt; + int off, err, errortag; + struct eth_hdr *ethhdr; + + pb = pppSingleBuf(pb); + + strcpy(devname, "pppoe"); /* as long as we don't know which instance */ + err_msg = NULL; + errortag = 0; + if (pb->len < sizeof(*ethhdr)) { + goto done; + } + ethhdr = (struct eth_hdr *)pb->payload; + off = sizeof(*ethhdr); + + ac_cookie = NULL; + ac_cookie_len = 0; +#ifdef PPPOE_SERVER + hunique = NULL; + hunique_len = 0; +#endif + session = 0; + if (pb->len - off < PPPOE_HEADERLEN) { + printf("pppoe: packet too short: %d\n", pb->len); + goto done; + } + + ph = (struct pppoehdr *) (ethhdr + 1); + if (ph->vertype != PPPOE_VERTYPE) { + printf("pppoe: unknown version/type packet: 0x%x\n", ph->vertype); + goto done; + } + session = ntohs(ph->session); + plen = ntohs(ph->plen); + off += sizeof(*ph); + + if (plen + off > pb->len) { + printf("pppoe: packet content does not fit: data available = %d, packet size = %u\n", + pb->len - off, plen); + goto done; + } + if(pb->tot_len == pb->len) { + pb->tot_len = pb->len = (u16_t)off + plen; /* ignore trailing garbage */ + } + tag = 0; + len = 0; + sc = NULL; + while (off + sizeof(pt) <= pb->len) { + MEMCPY(&pt, (u8_t*)pb->payload + off, sizeof(pt)); + tag = ntohs(pt.tag); + len = ntohs(pt.len); + if (off + sizeof(pt) + len > pb->len) { + printf("pppoe: tag 0x%x len 0x%x is too long\n", tag, len); + goto done; + } + switch (tag) { + case PPPOE_TAG_EOL: + goto breakbreak; + case PPPOE_TAG_SNAME: + break; /* ignored */ + case PPPOE_TAG_ACNAME: + break; /* ignored */ + case PPPOE_TAG_HUNIQUE: + if (sc != NULL) { + break; + } +#ifdef PPPOE_SERVER + hunique = (u8_t*)pb->payload + off + sizeof(pt); + hunique_len = len; +#endif + sc = pppoe_find_softc_by_hunique((u8_t*)pb->payload + off + sizeof(pt), len, netif); + if (sc != NULL) { + snprintf(devname, sizeof(devname), "%c%c%"U16_F, sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num); + } + break; + case PPPOE_TAG_ACCOOKIE: + if (ac_cookie == NULL) { + ac_cookie = (u8_t*)pb->payload + off + sizeof(pt); + ac_cookie_len = len; + } + break; + case PPPOE_TAG_SNAME_ERR: + err_msg = "SERVICE NAME ERROR"; + errortag = 1; + break; + case PPPOE_TAG_ACSYS_ERR: + err_msg = "AC SYSTEM ERROR"; + errortag = 1; + break; + case PPPOE_TAG_GENERIC_ERR: + err_msg = "GENERIC ERROR"; + errortag = 1; + break; + } + if (err_msg) { + if (errortag && len) { + u16_t error_len = LWIP_MIN(len, sizeof(pppoe_error_tmp)-1); + strncpy(pppoe_error_tmp, (char*)pb->payload + off + sizeof(pt), error_len); + pppoe_error_tmp[error_len-1] = '\0'; + printf("%s: %s: %s\n", devname, err_msg, pppoe_error_tmp); + } else { + printf("%s: %s\n", devname, err_msg); + } + if (errortag) { + goto done; + } + } + off += sizeof(pt) + len; + } + +breakbreak:; + switch (ph->code) { + case PPPOE_CODE_PADI: +#ifdef PPPOE_SERVER + /* + * got service name, concentrator name, and/or host unique. + * ignore if we have no interfaces with IFF_PASSIVE|IFF_UP. + */ + if (LIST_EMPTY(&pppoe_softc_list)) { + goto done; + } + LIST_FOREACH(sc, &pppoe_softc_list, sc_list) { + if (!(sc->sc_sppp.pp_if.if_flags & IFF_UP)) { + continue; + } + if (!(sc->sc_sppp.pp_if.if_flags & IFF_PASSIVE)) { + continue; + } + if (sc->sc_state == PPPOE_STATE_INITIAL) { + break; + } + } + if (sc == NULL) { + /* printf("pppoe: free passive interface is not found\n"); */ + goto done; + } + if (hunique) { + if (sc->sc_hunique) { + mem_free(sc->sc_hunique); + } + sc->sc_hunique = mem_malloc(hunique_len); + if (sc->sc_hunique == NULL) { + goto done; + } + sc->sc_hunique_len = hunique_len; + MEMCPY(sc->sc_hunique, hunique, hunique_len); + } + MEMCPY(&sc->sc_dest, eh->ether_shost, sizeof sc->sc_dest); + sc->sc_state = PPPOE_STATE_PADO_SENT; + pppoe_send_pado(sc); + break; +#endif /* PPPOE_SERVER */ + case PPPOE_CODE_PADR: +#ifdef PPPOE_SERVER + /* + * get sc from ac_cookie if IFF_PASSIVE + */ + if (ac_cookie == NULL) { + /* be quiet if there is not a single pppoe instance */ + printf("pppoe: received PADR but not includes ac_cookie\n"); + goto done; + } + sc = pppoe_find_softc_by_hunique(ac_cookie, ac_cookie_len, netif); + if (sc == NULL) { + /* be quiet if there is not a single pppoe instance */ + if (!LIST_EMPTY(&pppoe_softc_list)) { + printf("pppoe: received PADR but could not find request for it\n"); + } + goto done; + } + if (sc->sc_state != PPPOE_STATE_PADO_SENT) { + printf("%c%c%"U16_F": received unexpected PADR\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num); + goto done; + } + if (hunique) { + if (sc->sc_hunique) { + mem_free(sc->sc_hunique); + } + sc->sc_hunique = mem_malloc(hunique_len); + if (sc->sc_hunique == NULL) { + goto done; + } + sc->sc_hunique_len = hunique_len; + MEMCPY(sc->sc_hunique, hunique, hunique_len); + } + pppoe_send_pads(sc); + sc->sc_state = PPPOE_STATE_SESSION; + pppoe_linkstatus_up(sc); /* notify upper layers */ + break; +#else + /* ignore, we are no access concentrator */ + goto done; +#endif /* PPPOE_SERVER */ + case PPPOE_CODE_PADO: + if (sc == NULL) { + /* be quiet if there is not a single pppoe instance */ + if (pppoe_softc_list != NULL) { + printf("pppoe: received PADO but could not find request for it\n"); + } + goto done; + } + if (sc->sc_state != PPPOE_STATE_PADI_SENT) { + printf("%c%c%"U16_F": received unexpected PADO\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num); + goto done; + } + if (ac_cookie) { + sc->sc_ac_cookie_len = ac_cookie_len; + MEMCPY(sc->sc_ac_cookie, ac_cookie, ac_cookie_len); + } + MEMCPY(&sc->sc_dest, ethhdr->src.addr, sizeof(sc->sc_dest.addr)); + sys_untimeout(pppoe_timeout, sc); + sc->sc_padr_retried = 0; + sc->sc_state = PPPOE_STATE_PADR_SENT; + if ((err = pppoe_send_padr(sc)) != 0) { + PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to send PADR, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err)); + } + sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padr_retried), pppoe_timeout, sc); + break; + case PPPOE_CODE_PADS: + if (sc == NULL) { + goto done; + } + sc->sc_session = session; + sys_untimeout(pppoe_timeout, sc); + PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": session 0x%x connected\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, session)); + sc->sc_state = PPPOE_STATE_SESSION; + pppoe_linkstatus_up(sc); /* notify upper layers */ + break; + case PPPOE_CODE_PADT: + if (sc == NULL) { + goto done; + } + pppoe_clear_softc(sc, "received PADT"); + break; + default: + if(sc) { + printf("%c%c%"U16_F": unknown code (0x%"X16_F") session = 0x%"X16_F"\n", + sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, + (u16_t)ph->code, session); + } else { + printf("pppoe: unknown code (0x%"X16_F") session = 0x%"X16_F"\n", (u16_t)ph->code, session); + } + break; + } + +done: + pbuf_free(pb); + return; +} + +void +pppoe_disc_input(struct netif *netif, struct pbuf *p) +{ + /* avoid error messages if there is not a single pppoe instance */ + if (pppoe_softc_list != NULL) { + pppoe_dispatch_disc_pkt(netif, p); + } else { + pbuf_free(p); + } +} + +void +pppoe_data_input(struct netif *netif, struct pbuf *pb) +{ + u16_t session, plen; + struct pppoe_softc *sc; + struct pppoehdr *ph; +#ifdef PPPOE_TERM_UNKNOWN_SESSIONS + u8_t shost[ETHER_ADDR_LEN]; +#endif + +#ifdef PPPOE_TERM_UNKNOWN_SESSIONS + MEMCPY(shost, ((struct eth_hdr *)pb->payload)->src.addr, sizeof(shost)); +#endif + if (pbuf_header(pb, -(int)sizeof(struct eth_hdr)) != 0) { + /* bail out */ + PPPDEBUG(LOG_ERR, ("pppoe_data_input: pbuf_header failed\n")); + LINK_STATS_INC(link.lenerr); + goto drop; + } + + pb = pppSingleBuf (pb); + + if (pb->len <= PPPOE_HEADERLEN) { + printf("pppoe (data): dropping too short packet: %d bytes\n", pb->len); + goto drop; + } + + if (pb->len < sizeof(*ph)) { + printf("pppoe_data_input: could not get PPPoE header\n"); + goto drop; + } + ph = (struct pppoehdr *)pb->payload; + + if (ph->vertype != PPPOE_VERTYPE) { + printf("pppoe (data): unknown version/type packet: 0x%x\n", ph->vertype); + goto drop; + } + if (ph->code != 0) { + goto drop; + } + + session = ntohs(ph->session); + sc = pppoe_find_softc_by_session(session, netif); + if (sc == NULL) { +#ifdef PPPOE_TERM_UNKNOWN_SESSIONS + printf("pppoe: input for unknown session 0x%x, sending PADT\n", session); + pppoe_send_padt(netif, session, shost); +#endif + goto drop; + } + + plen = ntohs(ph->plen); + + if (pbuf_header(pb, -(int)(PPPOE_HEADERLEN)) != 0) { + /* bail out */ + PPPDEBUG(LOG_ERR, ("pppoe_data_input: pbuf_header PPPOE_HEADERLEN failed\n")); + LINK_STATS_INC(link.lenerr); + goto drop; + } + + PPPDEBUG(LOG_DEBUG, ("pppoe_data_input: %c%c%"U16_F": pkthdr.len=%d, pppoe.len=%d\n", + sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, + pb->len, plen)); + + if (pb->len < plen) { + goto drop; + } + + pppInProcOverEthernet(sc->sc_pd, pb); + + return; + +drop: + pbuf_free(pb); +} + +static err_t +pppoe_output(struct pppoe_softc *sc, struct pbuf *pb) +{ + struct eth_hdr *ethhdr; + u16_t etype; + err_t res; + + if (!sc->sc_ethif) { + pbuf_free(pb); + return ERR_IF; + } + + ethhdr = (struct eth_hdr *)pb->payload; + etype = sc->sc_state == PPPOE_STATE_SESSION ? ETHTYPE_PPPOE : ETHTYPE_PPPOEDISC; + ethhdr->type = htons(etype); + MEMCPY(ethhdr->dest.addr, sc->sc_dest.addr, sizeof(ethhdr->dest.addr)); + MEMCPY(ethhdr->src.addr, ((struct eth_addr *)sc->sc_ethif->hwaddr)->addr, sizeof(ethhdr->src.addr)); + + PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F" (%x) state=%d, session=0x%x output -> %02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F":%02"X16_F", len=%d\n", + sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, etype, + sc->sc_state, sc->sc_session, + sc->sc_dest.addr[0], sc->sc_dest.addr[1], sc->sc_dest.addr[2], sc->sc_dest.addr[3], sc->sc_dest.addr[4], sc->sc_dest.addr[5], + pb->tot_len)); + + res = sc->sc_ethif->linkoutput(sc->sc_ethif, pb); + + pbuf_free(pb); + + return res; +} + +static err_t +pppoe_send_padi(struct pppoe_softc *sc) +{ + struct pbuf *pb; + u8_t *p; + int len; +#ifdef PPPOE_TODO + int l1 = 0, l2 = 0; /* XXX: gcc */ +#endif /* PPPOE_TODO */ + + if (sc->sc_state >PPPOE_STATE_PADI_SENT) { + PPPDEBUG(LOG_ERR, ("ERROR: pppoe_send_padi in state %d", sc->sc_state)); + } + + /* calculate length of frame (excluding ethernet header + pppoe header) */ + len = 2 + 2 + 2 + 2 + sizeof sc; /* service name tag is required, host unique is send too */ +#ifdef PPPOE_TODO + if (sc->sc_service_name != NULL) { + l1 = (int)strlen(sc->sc_service_name); + len += l1; + } + if (sc->sc_concentrator_name != NULL) { + l2 = (int)strlen(sc->sc_concentrator_name); + len += 2 + 2 + l2; + } +#endif /* PPPOE_TODO */ + LWIP_ASSERT("sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff", + sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff); + + /* allocate a buffer */ + pb = pbuf_alloc(PBUF_LINK, (u16_t)(sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len), PBUF_RAM); + if (!pb) { + return ERR_MEM; + } + LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len); + + p = (u8_t*)pb->payload + sizeof (struct eth_hdr); + /* fill in pkt */ + PPPOE_ADD_HEADER(p, PPPOE_CODE_PADI, 0, (u16_t)len); + PPPOE_ADD_16(p, PPPOE_TAG_SNAME); +#ifdef PPPOE_TODO + if (sc->sc_service_name != NULL) { + PPPOE_ADD_16(p, l1); + MEMCPY(p, sc->sc_service_name, l1); + p += l1; + } else +#endif /* PPPOE_TODO */ + { + PPPOE_ADD_16(p, 0); + } +#ifdef PPPOE_TODO + if (sc->sc_concentrator_name != NULL) { + PPPOE_ADD_16(p, PPPOE_TAG_ACNAME); + PPPOE_ADD_16(p, l2); + MEMCPY(p, sc->sc_concentrator_name, l2); + p += l2; + } +#endif /* PPPOE_TODO */ + PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE); + PPPOE_ADD_16(p, sizeof(sc)); + MEMCPY(p, &sc, sizeof sc); + + /* send pkt */ + return pppoe_output(sc, pb); +} + +static void +pppoe_timeout(void *arg) +{ + int retry_wait, err; + struct pppoe_softc *sc = (struct pppoe_softc*)arg; + + PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": timeout\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num)); + + switch (sc->sc_state) { + case PPPOE_STATE_PADI_SENT: + /* + * We have two basic ways of retrying: + * - Quick retry mode: try a few times in short sequence + * - Slow retry mode: we already had a connection successfully + * established and will try infinitely (without user + * intervention) + * We only enter slow retry mode if IFF_LINK1 (aka autodial) + * is not set. + */ + + /* initialize for quick retry mode */ + retry_wait = PPPOE_DISC_TIMEOUT * (1 + sc->sc_padi_retried); + + sc->sc_padi_retried++; + if (sc->sc_padi_retried >= PPPOE_DISC_MAXPADI) { +#if 0 + if ((sc->sc_sppp.pp_if.if_flags & IFF_LINK1) == 0) { + /* slow retry mode */ + retry_wait = PPPOE_SLOW_RETRY; + } else +#endif + { + pppoe_abort_connect(sc); + return; + } + } + if ((err = pppoe_send_padi(sc)) != 0) { + sc->sc_padi_retried--; + PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to transmit PADI, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err)); + } + sys_timeout(retry_wait, pppoe_timeout, sc); + break; + + case PPPOE_STATE_PADR_SENT: + sc->sc_padr_retried++; + if (sc->sc_padr_retried >= PPPOE_DISC_MAXPADR) { + MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest)); + sc->sc_state = PPPOE_STATE_PADI_SENT; + sc->sc_padr_retried = 0; + if ((err = pppoe_send_padi(sc)) != 0) { + PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to send PADI, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err)); + } + sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padi_retried), pppoe_timeout, sc); + return; + } + if ((err = pppoe_send_padr(sc)) != 0) { + sc->sc_padr_retried--; + PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to send PADR, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err)); + } + sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padr_retried), pppoe_timeout, sc); + break; + case PPPOE_STATE_CLOSING: + pppoe_do_disconnect(sc); + break; + default: + return; /* all done, work in peace */ + } +} + +/* Start a connection (i.e. initiate discovery phase) */ +int +pppoe_connect(struct pppoe_softc *sc) +{ + int err; + + if (sc->sc_state != PPPOE_STATE_INITIAL) { + return EBUSY; + } + +#ifdef PPPOE_SERVER + /* wait PADI if IFF_PASSIVE */ + if ((sc->sc_sppp.pp_if.if_flags & IFF_PASSIVE)) { + return 0; + } +#endif + /* save state, in case we fail to send PADI */ + sc->sc_state = PPPOE_STATE_PADI_SENT; + sc->sc_padr_retried = 0; + err = pppoe_send_padi(sc); + PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": failed to send PADI, error=%d\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err)); + sys_timeout(PPPOE_DISC_TIMEOUT, pppoe_timeout, sc); + return err; +} + +/* disconnect */ +void +pppoe_disconnect(struct pppoe_softc *sc) +{ + if (sc->sc_state < PPPOE_STATE_SESSION) { + return; + } + /* + * Do not call pppoe_disconnect here, the upper layer state + * machine gets confused by this. We must return from this + * function and defer disconnecting to the timeout handler. + */ + sc->sc_state = PPPOE_STATE_CLOSING; + sys_timeout(20, pppoe_timeout, sc); +} + +static int +pppoe_do_disconnect(struct pppoe_softc *sc) +{ + int err; + + if (sc->sc_state < PPPOE_STATE_SESSION) { + err = EBUSY; + } else { + PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": disconnecting\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num)); + err = pppoe_send_padt(sc->sc_ethif, sc->sc_session, (const u8_t *)&sc->sc_dest); + } + + /* cleanup softc */ + sc->sc_state = PPPOE_STATE_INITIAL; + MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest)); + sc->sc_ac_cookie_len = 0; +#ifdef PPPOE_SERVER + if (sc->sc_hunique) { + mem_free(sc->sc_hunique); + sc->sc_hunique = NULL; + } + sc->sc_hunique_len = 0; +#endif + sc->sc_session = 0; + + sc->sc_linkStatusCB(sc->sc_pd, 0); /* notify upper layers */ + + return err; +} + +/* Connection attempt aborted */ +static void +pppoe_abort_connect(struct pppoe_softc *sc) +{ + printf("%c%c%"U16_F": could not establish connection\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num); + sc->sc_state = PPPOE_STATE_CLOSING; + + sc->sc_linkStatusCB(sc->sc_pd, 0); /* notify upper layers */ + + /* clear connection state */ + MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest)); + sc->sc_state = PPPOE_STATE_INITIAL; +} + +/* Send a PADR packet */ +static err_t +pppoe_send_padr(struct pppoe_softc *sc) +{ + struct pbuf *pb; + u8_t *p; + size_t len; +#ifdef PPPOE_TODO + size_t l1 = 0; /* XXX: gcc */ +#endif /* PPPOE_TODO */ + + if (sc->sc_state != PPPOE_STATE_PADR_SENT) { + return ERR_CONN; + } + + len = 2 + 2 + 2 + 2 + sizeof(sc); /* service name, host unique */ +#ifdef PPPOE_TODO + if (sc->sc_service_name != NULL) { /* service name tag maybe empty */ + l1 = strlen(sc->sc_service_name); + len += l1; + } +#endif /* PPPOE_TODO */ + if (sc->sc_ac_cookie_len > 0) { + len += 2 + 2 + sc->sc_ac_cookie_len; /* AC cookie */ + } + LWIP_ASSERT("sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff", + sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff); + pb = pbuf_alloc(PBUF_LINK, (u16_t)(sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len), PBUF_RAM); + if (!pb) { + return ERR_MEM; + } + LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len); + p = (u8_t*)pb->payload + sizeof (struct eth_hdr); + PPPOE_ADD_HEADER(p, PPPOE_CODE_PADR, 0, len); + PPPOE_ADD_16(p, PPPOE_TAG_SNAME); +#ifdef PPPOE_TODO + if (sc->sc_service_name != NULL) { + PPPOE_ADD_16(p, l1); + MEMCPY(p, sc->sc_service_name, l1); + p += l1; + } else +#endif /* PPPOE_TODO */ + { + PPPOE_ADD_16(p, 0); + } + if (sc->sc_ac_cookie_len > 0) { + PPPOE_ADD_16(p, PPPOE_TAG_ACCOOKIE); + PPPOE_ADD_16(p, sc->sc_ac_cookie_len); + MEMCPY(p, sc->sc_ac_cookie, sc->sc_ac_cookie_len); + p += sc->sc_ac_cookie_len; + } + PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE); + PPPOE_ADD_16(p, sizeof(sc)); + MEMCPY(p, &sc, sizeof sc); + + return pppoe_output(sc, pb); +} + +/* send a PADT packet */ +static err_t +pppoe_send_padt(struct netif *outgoing_if, u_int session, const u8_t *dest) +{ + struct pbuf *pb; + struct eth_hdr *ethhdr; + err_t res; + u8_t *p; + + pb = pbuf_alloc(PBUF_LINK, sizeof(struct eth_hdr) + PPPOE_HEADERLEN, PBUF_RAM); + if (!pb) { + return ERR_MEM; + } + LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len); + + ethhdr = (struct eth_hdr *)pb->payload; + ethhdr->type = PP_HTONS(ETHTYPE_PPPOEDISC); + MEMCPY(ethhdr->dest.addr, dest, sizeof(ethhdr->dest.addr)); + MEMCPY(ethhdr->src.addr, ((struct eth_addr *)outgoing_if->hwaddr)->addr, sizeof(ethhdr->src.addr)); + + p = (u8_t*)(ethhdr + 1); + PPPOE_ADD_HEADER(p, PPPOE_CODE_PADT, session, 0); + + res = outgoing_if->linkoutput(outgoing_if, pb); + + pbuf_free(pb); + + return res; +} + +#ifdef PPPOE_SERVER +static err_t +pppoe_send_pado(struct pppoe_softc *sc) +{ + struct pbuf *pb; + u8_t *p; + size_t len; + + if (sc->sc_state != PPPOE_STATE_PADO_SENT) { + return ERR_CONN; + } + + /* calc length */ + len = 0; + /* include ac_cookie */ + len += 2 + 2 + sizeof(sc); + /* include hunique */ + len += 2 + 2 + sc->sc_hunique_len; + pb = pbuf_alloc(PBUF_LINK, sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len, PBUF_RAM); + if (!pb) { + return ERR_MEM; + } + LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len); + p = (u8_t*)pb->payload + sizeof (struct eth_hdr); + PPPOE_ADD_HEADER(p, PPPOE_CODE_PADO, 0, len); + PPPOE_ADD_16(p, PPPOE_TAG_ACCOOKIE); + PPPOE_ADD_16(p, sizeof(sc)); + MEMCPY(p, &sc, sizeof(sc)); + p += sizeof(sc); + PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE); + PPPOE_ADD_16(p, sc->sc_hunique_len); + MEMCPY(p, sc->sc_hunique, sc->sc_hunique_len); + return pppoe_output(sc, pb); +} + +static err_t +pppoe_send_pads(struct pppoe_softc *sc) +{ + struct pbuf *pb; + u8_t *p; + size_t len, l1 = 0; /* XXX: gcc */ + + if (sc->sc_state != PPPOE_STATE_PADO_SENT) { + return ERR_CONN; + } + + sc->sc_session = mono_time.tv_sec % 0xff + 1; + /* calc length */ + len = 0; + /* include hunique */ + len += 2 + 2 + 2 + 2 + sc->sc_hunique_len; /* service name, host unique*/ + if (sc->sc_service_name != NULL) { /* service name tag maybe empty */ + l1 = strlen(sc->sc_service_name); + len += l1; + } + pb = pbuf_alloc(PBUF_LINK, sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len, PBUF_RAM); + if (!pb) { + return ERR_MEM; + } + LWIP_ASSERT("pb->tot_len == pb->len", pb->tot_len == pb->len); + p = (u8_t*)pb->payload + sizeof (struct eth_hdr); + PPPOE_ADD_HEADER(p, PPPOE_CODE_PADS, sc->sc_session, len); + PPPOE_ADD_16(p, PPPOE_TAG_SNAME); + if (sc->sc_service_name != NULL) { + PPPOE_ADD_16(p, l1); + MEMCPY(p, sc->sc_service_name, l1); + p += l1; + } else { + PPPOE_ADD_16(p, 0); + } + PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE); + PPPOE_ADD_16(p, sc->sc_hunique_len); + MEMCPY(p, sc->sc_hunique, sc->sc_hunique_len); + return pppoe_output(sc, pb); +} +#endif + +err_t +pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb) +{ + u8_t *p; + size_t len; + + /* are we ready to process data yet? */ + if (sc->sc_state < PPPOE_STATE_SESSION) { + /*sppp_flush(&sc->sc_sppp.pp_if);*/ + pbuf_free(pb); + return ERR_CONN; + } + + len = pb->tot_len; + + /* make room for Ethernet header - should not fail */ + if (pbuf_header(pb, sizeof(struct eth_hdr) + PPPOE_HEADERLEN) != 0) { + /* bail out */ + PPPDEBUG(LOG_ERR, ("pppoe: %c%c%"U16_F": pppoe_xmit: could not allocate room for header\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num)); + LINK_STATS_INC(link.lenerr); + pbuf_free(pb); + return ERR_BUF; + } + + p = (u8_t*)pb->payload + sizeof(struct eth_hdr); + PPPOE_ADD_HEADER(p, 0, sc->sc_session, len); + + return pppoe_output(sc, pb); +} + +#if 0 /*def PFIL_HOOKS*/ +static int +pppoe_ifattach_hook(void *arg, struct pbuf **mp, struct netif *ifp, int dir) +{ + struct pppoe_softc *sc; + int s; + + if (mp != (struct pbuf **)PFIL_IFNET_DETACH) { + return 0; + } + + LIST_FOREACH(sc, &pppoe_softc_list, sc_list) { + if (sc->sc_ethif != ifp) { + continue; + } + if (sc->sc_sppp.pp_if.if_flags & IFF_UP) { + sc->sc_sppp.pp_if.if_flags &= ~(IFF_UP|IFF_RUNNING); + printf("%c%c%"U16_F": ethernet interface detached, going down\n", + sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num); + } + sc->sc_ethif = NULL; + pppoe_clear_softc(sc, "ethernet interface detached"); + } + + return 0; +} +#endif + +static void +pppoe_clear_softc(struct pppoe_softc *sc, const char *message) +{ + LWIP_UNUSED_ARG(message); + + /* stop timer */ + sys_untimeout(pppoe_timeout, sc); + PPPDEBUG(LOG_DEBUG, ("pppoe: %c%c%"U16_F": session 0x%x terminated, %s\n", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, sc->sc_session, message)); + + /* fix our state */ + sc->sc_state = PPPOE_STATE_INITIAL; + + /* notify upper layers */ + sc->sc_linkStatusCB(sc->sc_pd, 0); + + /* clean up softc */ + MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest)); + sc->sc_ac_cookie_len = 0; + sc->sc_session = 0; +} + +#endif /* PPPOE_SUPPORT */ + diff --git a/third_party/lwip-1.4.1/src/netif/ppp/pppdebug.h b/third_party/lwip-1.4.1/src/netif/ppp/pppdebug.h new file mode 100644 index 0000000..08ba7b5 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/pppdebug.h @@ -0,0 +1,73 @@ +/***************************************************************************** +* pppdebug.h - System debugging utilities. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* portions Copyright (c) 1998 Global Election Systems Inc. +* portions Copyright (c) 2001 by Cognizant Pty Ltd. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY (please don't use tabs!) +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 98-07-29 Guy Lancaster , Global Election Systems Inc. +* Original. +* +***************************************************************************** +*/ +#ifndef PPPDEBUG_H +#define PPPDEBUG_H + +/* Trace levels. */ +#define LOG_CRITICAL (PPP_DEBUG | LWIP_DBG_LEVEL_SEVERE) +#define LOG_ERR (PPP_DEBUG | LWIP_DBG_LEVEL_SEVERE) +#define LOG_NOTICE (PPP_DEBUG | LWIP_DBG_LEVEL_WARNING) +#define LOG_WARNING (PPP_DEBUG | LWIP_DBG_LEVEL_WARNING) +#define LOG_INFO (PPP_DEBUG) +#define LOG_DETAIL (PPP_DEBUG) +#define LOG_DEBUG (PPP_DEBUG) + + +#define TRACELCP PPP_DEBUG + +#if PPP_DEBUG + +#define AUTHDEBUG(a, b) LWIP_DEBUGF(a, b) +#define IPCPDEBUG(a, b) LWIP_DEBUGF(a, b) +#define UPAPDEBUG(a, b) LWIP_DEBUGF(a, b) +#define LCPDEBUG(a, b) LWIP_DEBUGF(a, b) +#define FSMDEBUG(a, b) LWIP_DEBUGF(a, b) +#define CHAPDEBUG(a, b) LWIP_DEBUGF(a, b) +#define PPPDEBUG(a, b) LWIP_DEBUGF(a, b) + +#else /* PPP_DEBUG */ + +#define AUTHDEBUG(a, b) +#define IPCPDEBUG(a, b) +#define UPAPDEBUG(a, b) +#define LCPDEBUG(a, b) +#define FSMDEBUG(a, b) +#define CHAPDEBUG(a, b) +#define PPPDEBUG(a, b) + +#endif /* PPP_DEBUG */ + +#endif /* PPPDEBUG_H */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/randm.c b/third_party/lwip-1.4.1/src/netif/ppp/randm.c new file mode 100644 index 0000000..09340f3 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/randm.c @@ -0,0 +1,249 @@ +/***************************************************************************** +* randm.c - Random number generator program file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* Copyright (c) 1998 by Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 98-06-03 Guy Lancaster , Global Election Systems Inc. +* Extracted from avos. +*****************************************************************************/ + +#include "lwip/opt.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#include "md5.h" +#include "randm.h" + +#include "ppp_impl.h" +#include "pppdebug.h" + +#include + +#if MD5_SUPPORT /* this module depends on MD5 */ +#define RANDPOOLSZ 16 /* Bytes stored in the pool of randomness. */ + +/*****************************/ +/*** LOCAL DATA STRUCTURES ***/ +/*****************************/ +static char randPool[RANDPOOLSZ]; /* Pool of randomness. */ +static long randCount = 0; /* Pseudo-random incrementer */ + + +/***********************************/ +/*** PUBLIC FUNCTION DEFINITIONS ***/ +/***********************************/ +/* + * Initialize the random number generator. + * + * Since this is to be called on power up, we don't have much + * system randomess to work with. Here all we use is the + * real-time clock. We'll accumulate more randomness as soon + * as things start happening. + */ +void +avRandomInit() +{ + avChurnRand(NULL, 0); +} + +/* + * Churn the randomness pool on a random event. Call this early and often + * on random and semi-random system events to build randomness in time for + * usage. For randomly timed events, pass a null pointer and a zero length + * and this will use the system timer and other sources to add randomness. + * If new random data is available, pass a pointer to that and it will be + * included. + * + * Ref: Applied Cryptography 2nd Ed. by Bruce Schneier p. 427 + */ +void +avChurnRand(char *randData, u32_t randLen) +{ + MD5_CTX md5; + + /* LWIP_DEBUGF(LOG_INFO, ("churnRand: %u@%P\n", randLen, randData)); */ + MD5Init(&md5); + MD5Update(&md5, (u_char *)randPool, sizeof(randPool)); + if (randData) { + MD5Update(&md5, (u_char *)randData, randLen); + } else { + struct { + /* INCLUDE fields for any system sources of randomness */ + char foobar; + } sysData; + + /* Load sysData fields here. */ + MD5Update(&md5, (u_char *)&sysData, sizeof(sysData)); + } + MD5Final((u_char *)randPool, &md5); +/* LWIP_DEBUGF(LOG_INFO, ("churnRand: -> 0\n")); */ +} + +/* + * Use the random pool to generate random data. This degrades to pseudo + * random when used faster than randomness is supplied using churnRand(). + * Note: It's important that there be sufficient randomness in randPool + * before this is called for otherwise the range of the result may be + * narrow enough to make a search feasible. + * + * Ref: Applied Cryptography 2nd Ed. by Bruce Schneier p. 427 + * + * XXX Why does he not just call churnRand() for each block? Probably + * so that you don't ever publish the seed which could possibly help + * predict future values. + * XXX Why don't we preserve md5 between blocks and just update it with + * randCount each time? Probably there is a weakness but I wish that + * it was documented. + */ +void +avGenRand(char *buf, u32_t bufLen) +{ + MD5_CTX md5; + u_char tmp[16]; + u32_t n; + + while (bufLen > 0) { + n = LWIP_MIN(bufLen, RANDPOOLSZ); + MD5Init(&md5); + MD5Update(&md5, (u_char *)randPool, sizeof(randPool)); + MD5Update(&md5, (u_char *)&randCount, sizeof(randCount)); + MD5Final(tmp, &md5); + randCount++; + MEMCPY(buf, tmp, n); + buf += n; + bufLen -= n; + } +} + +/* + * Return a new random number. + */ +u32_t +avRandom() +{ + u32_t newRand; + + avGenRand((char *)&newRand, sizeof(newRand)); + + return newRand; +} + +#else /* MD5_SUPPORT */ + +/*****************************/ +/*** LOCAL DATA STRUCTURES ***/ +/*****************************/ +static int avRandomized = 0; /* Set when truely randomized. */ +static u32_t avRandomSeed = 0; /* Seed used for random number generation. */ + + +/***********************************/ +/*** PUBLIC FUNCTION DEFINITIONS ***/ +/***********************************/ +/* + * Initialize the random number generator. + * + * Here we attempt to compute a random number seed but even if + * it isn't random, we'll randomize it later. + * + * The current method uses the fields from the real time clock, + * the idle process counter, the millisecond counter, and the + * hardware timer tick counter. When this is invoked + * in startup(), then the idle counter and timer values may + * repeat after each boot and the real time clock may not be + * operational. Thus we call it again on the first random + * event. + */ +void +avRandomInit() +{ +#if 0 + /* Get a pointer into the last 4 bytes of clockBuf. */ + u32_t *lptr1 = (u32_t *)((char *)&clockBuf[3]); + + /* + * Initialize our seed using the real-time clock, the idle + * counter, the millisecond timer, and the hardware timer + * tick counter. The real-time clock and the hardware + * tick counter are the best sources of randomness but + * since the tick counter is only 16 bit (and truncated + * at that), the idle counter and millisecond timer + * (which may be small values) are added to help + * randomize the lower 16 bits of the seed. + */ + readClk(); + avRandomSeed += *(u32_t *)clockBuf + *lptr1 + OSIdleCtr + + ppp_mtime() + ((u32_t)TM1 << 16) + TM1; +#else + avRandomSeed += sys_jiffies(); /* XXX */ +#endif + + /* Initialize the Borland random number generator. */ + srand((unsigned)avRandomSeed); +} + +/* + * Randomize our random seed value. Here we use the fact that + * this function is called at *truely random* times by the polling + * and network functions. Here we only get 16 bits of new random + * value but we use the previous value to randomize the other 16 + * bits. + */ +void +avRandomize(void) +{ + static u32_t last_jiffies; + + if (!avRandomized) { + avRandomized = !0; + avRandomInit(); + /* The initialization function also updates the seed. */ + } else { + /* avRandomSeed += (avRandomSeed << 16) + TM1; */ + avRandomSeed += (sys_jiffies() - last_jiffies); /* XXX */ + } + last_jiffies = sys_jiffies(); +} + +/* + * Return a new random number. + * Here we use the Borland rand() function to supply a pseudo random + * number which we make truely random by combining it with our own + * seed which is randomized by truely random events. + * Thus the numbers will be truely random unless there have been no + * operator or network events in which case it will be pseudo random + * seeded by the real time clock. + */ +u32_t +avRandom() +{ + return ((((u32_t)rand() << 16) + rand()) + avRandomSeed); +} + +#endif /* MD5_SUPPORT */ + +#endif /* PPP_SUPPORT */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/randm.h b/third_party/lwip-1.4.1/src/netif/ppp/randm.h new file mode 100644 index 0000000..5fb99ef --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/randm.h @@ -0,0 +1,81 @@ +/***************************************************************************** +* randm.h - Random number generator header file. +* +* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc. +* Copyright (c) 1998 Global Election Systems Inc. +* +* The authors hereby grant permission to use, copy, modify, distribute, +* and license this software and its documentation for any purpose, provided +* that existing copyright notices are retained in all copies and that this +* notice and the following disclaimer are included verbatim in any +* distributions. No written agreement, license, or royalty fee is required +* for any of the authorized uses. +* +* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR +* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +****************************************************************************** +* REVISION HISTORY +* +* 03-01-01 Marc Boucher +* Ported to lwIP. +* 98-05-29 Guy Lancaster , Global Election Systems Inc. +* Extracted from avos. +*****************************************************************************/ + +#ifndef RANDM_H +#define RANDM_H + +/*********************** +*** PUBLIC FUNCTIONS *** +***********************/ +/* + * Initialize the random number generator. + */ +void avRandomInit(void); + +/* + * Churn the randomness pool on a random event. Call this early and often + * on random and semi-random system events to build randomness in time for + * usage. For randomly timed events, pass a null pointer and a zero length + * and this will use the system timer and other sources to add randomness. + * If new random data is available, pass a pointer to that and it will be + * included. + */ +void avChurnRand(char *randData, u32_t randLen); + +/* + * Randomize our random seed value. To be called for truely random events + * such as user operations and network traffic. + */ +#if MD5_SUPPORT +#define avRandomize() avChurnRand(NULL, 0) +#else /* MD5_SUPPORT */ +void avRandomize(void); +#endif /* MD5_SUPPORT */ + +/* + * Use the random pool to generate random data. This degrades to pseudo + * random when used faster than randomness is supplied using churnRand(). + * Thus it's important to make sure that the results of this are not + * published directly because one could predict the next result to at + * least some degree. Also, it's important to get a good seed before + * the first use. + */ +void avGenRand(char *buf, u32_t bufLen); + +/* + * Return a new random number. + */ +u32_t avRandom(void); + + +#endif /* RANDM_H */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/vj.c b/third_party/lwip-1.4.1/src/netif/ppp/vj.c new file mode 100644 index 0000000..6bed149 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/vj.c @@ -0,0 +1,652 @@ +/* + * Routines to compress and uncompess tcp packets (for transmission + * over low speed serial lines. + * + * Copyright (c) 1989 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989: + * Initial distribution. + * + * Modified June 1993 by Paul Mackerras, paulus@cs.anu.edu.au, + * so that the entire packet being decompressed doesn't have + * to be in contiguous memory (just the compressed header). + * + * Modified March 1998 by Guy Lancaster, glanca@gesn.com, + * for a 16 bit processor. + */ + +#include "lwip/opt.h" + +#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */ + +#include "ppp_impl.h" +#include "pppdebug.h" + +#include "vj.h" + +#include + +#if VJ_SUPPORT + +#if LINK_STATS +#define INCR(counter) ++comp->stats.counter +#else +#define INCR(counter) +#endif + +void +vj_compress_init(struct vjcompress *comp) +{ + register u_char i; + register struct cstate *tstate = comp->tstate; + +#if MAX_SLOTS == 0 + memset((char *)comp, 0, sizeof(*comp)); +#endif + comp->maxSlotIndex = MAX_SLOTS - 1; + comp->compressSlot = 0; /* Disable slot ID compression by default. */ + for (i = MAX_SLOTS - 1; i > 0; --i) { + tstate[i].cs_id = i; + tstate[i].cs_next = &tstate[i - 1]; + } + tstate[0].cs_next = &tstate[MAX_SLOTS - 1]; + tstate[0].cs_id = 0; + comp->last_cs = &tstate[0]; + comp->last_recv = 255; + comp->last_xmit = 255; + comp->flags = VJF_TOSS; +} + + +/* ENCODE encodes a number that is known to be non-zero. ENCODEZ + * checks for zero (since zero has to be encoded in the long, 3 byte + * form). + */ +#define ENCODE(n) { \ + if ((u_short)(n) >= 256) { \ + *cp++ = 0; \ + cp[1] = (u_char)(n); \ + cp[0] = (u_char)((n) >> 8); \ + cp += 2; \ + } else { \ + *cp++ = (u_char)(n); \ + } \ +} +#define ENCODEZ(n) { \ + if ((u_short)(n) >= 256 || (u_short)(n) == 0) { \ + *cp++ = 0; \ + cp[1] = (u_char)(n); \ + cp[0] = (u_char)((n) >> 8); \ + cp += 2; \ + } else { \ + *cp++ = (u_char)(n); \ + } \ +} + +#define DECODEL(f) { \ + if (*cp == 0) {\ + u32_t tmp = ntohl(f) + ((cp[1] << 8) | cp[2]); \ + (f) = htonl(tmp); \ + cp += 3; \ + } else { \ + u32_t tmp = ntohl(f) + (u32_t)*cp++; \ + (f) = htonl(tmp); \ + } \ +} + +#define DECODES(f) { \ + if (*cp == 0) {\ + u_short tmp = ntohs(f) + (((u_short)cp[1] << 8) | cp[2]); \ + (f) = htons(tmp); \ + cp += 3; \ + } else { \ + u_short tmp = ntohs(f) + (u_short)*cp++; \ + (f) = htons(tmp); \ + } \ +} + +#define DECODEU(f) { \ + if (*cp == 0) {\ + (f) = htons(((u_short)cp[1] << 8) | cp[2]); \ + cp += 3; \ + } else { \ + (f) = htons((u_short)*cp++); \ + } \ +} + +/* + * vj_compress_tcp - Attempt to do Van Jacobson header compression on a + * packet. This assumes that nb and comp are not null and that the first + * buffer of the chain contains a valid IP header. + * Return the VJ type code indicating whether or not the packet was + * compressed. + */ +u_int +vj_compress_tcp(struct vjcompress *comp, struct pbuf *pb) +{ + register struct ip_hdr *ip = (struct ip_hdr *)pb->payload; + register struct cstate *cs = comp->last_cs->cs_next; + register u_short hlen = IPH_HL(ip); + register struct tcp_hdr *oth; + register struct tcp_hdr *th; + register u_short deltaS, deltaA; + register u_long deltaL; + register u_int changes = 0; + u_char new_seq[16]; + register u_char *cp = new_seq; + + /* + * Check that the packet is IP proto TCP. + */ + if (IPH_PROTO(ip) != IP_PROTO_TCP) { + return (TYPE_IP); + } + + /* + * Bail if this is an IP fragment or if the TCP packet isn't + * `compressible' (i.e., ACK isn't set or some other control bit is + * set). + */ + if ((IPH_OFFSET(ip) & PP_HTONS(0x3fff)) || pb->tot_len < 40) { + return (TYPE_IP); + } + th = (struct tcp_hdr *)&((long *)ip)[hlen]; + if ((TCPH_FLAGS(th) & (TCP_SYN|TCP_FIN|TCP_RST|TCP_ACK)) != TCP_ACK) { + return (TYPE_IP); + } + /* + * Packet is compressible -- we're going to send either a + * COMPRESSED_TCP or UNCOMPRESSED_TCP packet. Either way we need + * to locate (or create) the connection state. Special case the + * most recently used connection since it's most likely to be used + * again & we don't have to do any reordering if it's used. + */ + INCR(vjs_packets); + if (!ip_addr_cmp(&ip->src, &cs->cs_ip.src) + || !ip_addr_cmp(&ip->dest, &cs->cs_ip.dest) + || *(long *)th != ((long *)&cs->cs_ip)[IPH_HL(&cs->cs_ip)]) { + /* + * Wasn't the first -- search for it. + * + * States are kept in a circularly linked list with + * last_cs pointing to the end of the list. The + * list is kept in lru order by moving a state to the + * head of the list whenever it is referenced. Since + * the list is short and, empirically, the connection + * we want is almost always near the front, we locate + * states via linear search. If we don't find a state + * for the datagram, the oldest state is (re-)used. + */ + register struct cstate *lcs; + register struct cstate *lastcs = comp->last_cs; + + do { + lcs = cs; cs = cs->cs_next; + INCR(vjs_searches); + if (ip_addr_cmp(&ip->src, &cs->cs_ip.src) + && ip_addr_cmp(&ip->dest, &cs->cs_ip.dest) + && *(long *)th == ((long *)&cs->cs_ip)[IPH_HL(&cs->cs_ip)]) { + goto found; + } + } while (cs != lastcs); + + /* + * Didn't find it -- re-use oldest cstate. Send an + * uncompressed packet that tells the other side what + * connection number we're using for this conversation. + * Note that since the state list is circular, the oldest + * state points to the newest and we only need to set + * last_cs to update the lru linkage. + */ + INCR(vjs_misses); + comp->last_cs = lcs; + hlen += TCPH_HDRLEN(th); + hlen <<= 2; + /* Check that the IP/TCP headers are contained in the first buffer. */ + if (hlen > pb->len) { + return (TYPE_IP); + } + goto uncompressed; + + found: + /* + * Found it -- move to the front on the connection list. + */ + if (cs == lastcs) { + comp->last_cs = lcs; + } else { + lcs->cs_next = cs->cs_next; + cs->cs_next = lastcs->cs_next; + lastcs->cs_next = cs; + } + } + + oth = (struct tcp_hdr *)&((long *)&cs->cs_ip)[hlen]; + deltaS = hlen; + hlen += TCPH_HDRLEN(th); + hlen <<= 2; + /* Check that the IP/TCP headers are contained in the first buffer. */ + if (hlen > pb->len) { + PPPDEBUG(LOG_INFO, ("vj_compress_tcp: header len %d spans buffers\n", hlen)); + return (TYPE_IP); + } + + /* + * Make sure that only what we expect to change changed. The first + * line of the `if' checks the IP protocol version, header length & + * type of service. The 2nd line checks the "Don't fragment" bit. + * The 3rd line checks the time-to-live and protocol (the protocol + * check is unnecessary but costless). The 4th line checks the TCP + * header length. The 5th line checks IP options, if any. The 6th + * line checks TCP options, if any. If any of these things are + * different between the previous & current datagram, we send the + * current datagram `uncompressed'. + */ + if (((u_short *)ip)[0] != ((u_short *)&cs->cs_ip)[0] + || ((u_short *)ip)[3] != ((u_short *)&cs->cs_ip)[3] + || ((u_short *)ip)[4] != ((u_short *)&cs->cs_ip)[4] + || TCPH_HDRLEN(th) != TCPH_HDRLEN(oth) + || (deltaS > 5 && BCMP(ip + 1, &cs->cs_ip + 1, (deltaS - 5) << 2)) + || (TCPH_HDRLEN(th) > 5 && BCMP(th + 1, oth + 1, (TCPH_HDRLEN(th) - 5) << 2))) { + goto uncompressed; + } + + /* + * Figure out which of the changing fields changed. The + * receiver expects changes in the order: urgent, window, + * ack, seq (the order minimizes the number of temporaries + * needed in this section of code). + */ + if (TCPH_FLAGS(th) & TCP_URG) { + deltaS = ntohs(th->urgp); + ENCODEZ(deltaS); + changes |= NEW_U; + } else if (th->urgp != oth->urgp) { + /* argh! URG not set but urp changed -- a sensible + * implementation should never do this but RFC793 + * doesn't prohibit the change so we have to deal + * with it. */ + goto uncompressed; + } + + if ((deltaS = (u_short)(ntohs(th->wnd) - ntohs(oth->wnd))) != 0) { + ENCODE(deltaS); + changes |= NEW_W; + } + + if ((deltaL = ntohl(th->ackno) - ntohl(oth->ackno)) != 0) { + if (deltaL > 0xffff) { + goto uncompressed; + } + deltaA = (u_short)deltaL; + ENCODE(deltaA); + changes |= NEW_A; + } + + if ((deltaL = ntohl(th->seqno) - ntohl(oth->seqno)) != 0) { + if (deltaL > 0xffff) { + goto uncompressed; + } + deltaS = (u_short)deltaL; + ENCODE(deltaS); + changes |= NEW_S; + } + + switch(changes) { + case 0: + /* + * Nothing changed. If this packet contains data and the + * last one didn't, this is probably a data packet following + * an ack (normal on an interactive connection) and we send + * it compressed. Otherwise it's probably a retransmit, + * retransmitted ack or window probe. Send it uncompressed + * in case the other side missed the compressed version. + */ + if (IPH_LEN(ip) != IPH_LEN(&cs->cs_ip) && + ntohs(IPH_LEN(&cs->cs_ip)) == hlen) { + break; + } + + /* (fall through) */ + + case SPECIAL_I: + case SPECIAL_D: + /* + * actual changes match one of our special case encodings -- + * send packet uncompressed. + */ + goto uncompressed; + + case NEW_S|NEW_A: + if (deltaS == deltaA && deltaS == ntohs(IPH_LEN(&cs->cs_ip)) - hlen) { + /* special case for echoed terminal traffic */ + changes = SPECIAL_I; + cp = new_seq; + } + break; + + case NEW_S: + if (deltaS == ntohs(IPH_LEN(&cs->cs_ip)) - hlen) { + /* special case for data xfer */ + changes = SPECIAL_D; + cp = new_seq; + } + break; + } + + deltaS = (u_short)(ntohs(IPH_ID(ip)) - ntohs(IPH_ID(&cs->cs_ip))); + if (deltaS != 1) { + ENCODEZ(deltaS); + changes |= NEW_I; + } + if (TCPH_FLAGS(th) & TCP_PSH) { + changes |= TCP_PUSH_BIT; + } + /* + * Grab the cksum before we overwrite it below. Then update our + * state with this packet's header. + */ + deltaA = ntohs(th->chksum); + BCOPY(ip, &cs->cs_ip, hlen); + + /* + * We want to use the original packet as our compressed packet. + * (cp - new_seq) is the number of bytes we need for compressed + * sequence numbers. In addition we need one byte for the change + * mask, one for the connection id and two for the tcp checksum. + * So, (cp - new_seq) + 4 bytes of header are needed. hlen is how + * many bytes of the original packet to toss so subtract the two to + * get the new packet size. + */ + deltaS = (u_short)(cp - new_seq); + if (!comp->compressSlot || comp->last_xmit != cs->cs_id) { + comp->last_xmit = cs->cs_id; + hlen -= deltaS + 4; + if(pbuf_header(pb, -hlen)){ + /* Can we cope with this failing? Just assert for now */ + LWIP_ASSERT("pbuf_header failed\n", 0); + } + cp = (u_char *)pb->payload; + *cp++ = (u_char)(changes | NEW_C); + *cp++ = cs->cs_id; + } else { + hlen -= deltaS + 3; + if(pbuf_header(pb, -hlen)) { + /* Can we cope with this failing? Just assert for now */ + LWIP_ASSERT("pbuf_header failed\n", 0); + } + cp = (u_char *)pb->payload; + *cp++ = (u_char)changes; + } + *cp++ = (u_char)(deltaA >> 8); + *cp++ = (u_char)deltaA; + BCOPY(new_seq, cp, deltaS); + INCR(vjs_compressed); + return (TYPE_COMPRESSED_TCP); + + /* + * Update connection state cs & send uncompressed packet (that is, + * a regular ip/tcp packet but with the 'conversation id' we hope + * to use on future compressed packets in the protocol field). + */ +uncompressed: + BCOPY(ip, &cs->cs_ip, hlen); + IPH_PROTO_SET(ip, cs->cs_id); + comp->last_xmit = cs->cs_id; + return (TYPE_UNCOMPRESSED_TCP); +} + +/* + * Called when we may have missed a packet. + */ +void +vj_uncompress_err(struct vjcompress *comp) +{ + comp->flags |= VJF_TOSS; + INCR(vjs_errorin); +} + +/* + * "Uncompress" a packet of type TYPE_UNCOMPRESSED_TCP. + * Return 0 on success, -1 on failure. + */ +int +vj_uncompress_uncomp(struct pbuf *nb, struct vjcompress *comp) +{ + register u_int hlen; + register struct cstate *cs; + register struct ip_hdr *ip; + + ip = (struct ip_hdr *)nb->payload; + hlen = IPH_HL(ip) << 2; + if (IPH_PROTO(ip) >= MAX_SLOTS + || hlen + sizeof(struct tcp_hdr) > nb->len + || (hlen += TCPH_HDRLEN(((struct tcp_hdr *)&((char *)ip)[hlen])) << 2) + > nb->len + || hlen > MAX_HDR) { + PPPDEBUG(LOG_INFO, ("vj_uncompress_uncomp: bad cid=%d, hlen=%d buflen=%d\n", + IPH_PROTO(ip), hlen, nb->len)); + comp->flags |= VJF_TOSS; + INCR(vjs_errorin); + return -1; + } + cs = &comp->rstate[comp->last_recv = IPH_PROTO(ip)]; + comp->flags &=~ VJF_TOSS; + IPH_PROTO_SET(ip, IP_PROTO_TCP); + BCOPY(ip, &cs->cs_ip, hlen); + cs->cs_hlen = (u_short)hlen; + INCR(vjs_uncompressedin); + return 0; +} + +/* + * Uncompress a packet of type TYPE_COMPRESSED_TCP. + * The packet is composed of a buffer chain and the first buffer + * must contain an accurate chain length. + * The first buffer must include the entire compressed TCP/IP header. + * This procedure replaces the compressed header with the uncompressed + * header and returns the length of the VJ header. + */ +int +vj_uncompress_tcp(struct pbuf **nb, struct vjcompress *comp) +{ + u_char *cp; + struct tcp_hdr *th; + struct cstate *cs; + u_short *bp; + struct pbuf *n0 = *nb; + u32_t tmp; + u_int vjlen, hlen, changes; + + INCR(vjs_compressedin); + cp = (u_char *)n0->payload; + changes = *cp++; + if (changes & NEW_C) { + /* + * Make sure the state index is in range, then grab the state. + * If we have a good state index, clear the 'discard' flag. + */ + if (*cp >= MAX_SLOTS) { + PPPDEBUG(LOG_INFO, ("vj_uncompress_tcp: bad cid=%d\n", *cp)); + goto bad; + } + + comp->flags &=~ VJF_TOSS; + comp->last_recv = *cp++; + } else { + /* + * this packet has an implicit state index. If we've + * had a line error since the last time we got an + * explicit state index, we have to toss the packet. + */ + if (comp->flags & VJF_TOSS) { + PPPDEBUG(LOG_INFO, ("vj_uncompress_tcp: tossing\n")); + INCR(vjs_tossed); + return (-1); + } + } + cs = &comp->rstate[comp->last_recv]; + hlen = IPH_HL(&cs->cs_ip) << 2; + th = (struct tcp_hdr *)&((u_char *)&cs->cs_ip)[hlen]; + th->chksum = htons((*cp << 8) | cp[1]); + cp += 2; + if (changes & TCP_PUSH_BIT) { + TCPH_SET_FLAG(th, TCP_PSH); + } else { + TCPH_UNSET_FLAG(th, TCP_PSH); + } + + switch (changes & SPECIALS_MASK) { + case SPECIAL_I: + { + register u32_t i = ntohs(IPH_LEN(&cs->cs_ip)) - cs->cs_hlen; + /* some compilers can't nest inline assembler.. */ + tmp = ntohl(th->ackno) + i; + th->ackno = htonl(tmp); + tmp = ntohl(th->seqno) + i; + th->seqno = htonl(tmp); + } + break; + + case SPECIAL_D: + /* some compilers can't nest inline assembler.. */ + tmp = ntohl(th->seqno) + ntohs(IPH_LEN(&cs->cs_ip)) - cs->cs_hlen; + th->seqno = htonl(tmp); + break; + + default: + if (changes & NEW_U) { + TCPH_SET_FLAG(th, TCP_URG); + DECODEU(th->urgp); + } else { + TCPH_UNSET_FLAG(th, TCP_URG); + } + if (changes & NEW_W) { + DECODES(th->wnd); + } + if (changes & NEW_A) { + DECODEL(th->ackno); + } + if (changes & NEW_S) { + DECODEL(th->seqno); + } + break; + } + if (changes & NEW_I) { + DECODES(cs->cs_ip._id); + } else { + IPH_ID_SET(&cs->cs_ip, ntohs(IPH_ID(&cs->cs_ip)) + 1); + IPH_ID_SET(&cs->cs_ip, htons(IPH_ID(&cs->cs_ip))); + } + + /* + * At this point, cp points to the first byte of data in the + * packet. Fill in the IP total length and update the IP + * header checksum. + */ + vjlen = (u_short)(cp - (u_char*)n0->payload); + if (n0->len < vjlen) { + /* + * We must have dropped some characters (crc should detect + * this but the old slip framing won't) + */ + PPPDEBUG(LOG_INFO, ("vj_uncompress_tcp: head buffer %d too short %d\n", + n0->len, vjlen)); + goto bad; + } + +#if BYTE_ORDER == LITTLE_ENDIAN + tmp = n0->tot_len - vjlen + cs->cs_hlen; + IPH_LEN_SET(&cs->cs_ip, htons((u_short)tmp)); +#else + IPH_LEN_SET(&cs->cs_ip, htons(n0->tot_len - vjlen + cs->cs_hlen)); +#endif + + /* recompute the ip header checksum */ + bp = (u_short *) &cs->cs_ip; + IPH_CHKSUM_SET(&cs->cs_ip, 0); + for (tmp = 0; hlen > 0; hlen -= 2) { + tmp += *bp++; + } + tmp = (tmp & 0xffff) + (tmp >> 16); + tmp = (tmp & 0xffff) + (tmp >> 16); + IPH_CHKSUM_SET(&cs->cs_ip, (u_short)(~tmp)); + + /* Remove the compressed header and prepend the uncompressed header. */ + if(pbuf_header(n0, -((s16_t)(vjlen)))) { + /* Can we cope with this failing? Just assert for now */ + LWIP_ASSERT("pbuf_header failed\n", 0); + goto bad; + } + + if(LWIP_MEM_ALIGN(n0->payload) != n0->payload) { + struct pbuf *np, *q; + u8_t *bufptr; + + np = pbuf_alloc(PBUF_RAW, n0->len + cs->cs_hlen, PBUF_POOL); + if(!np) { + PPPDEBUG(LOG_WARNING, ("vj_uncompress_tcp: realign failed\n")); + goto bad; + } + + if(pbuf_header(np, -cs->cs_hlen)) { + /* Can we cope with this failing? Just assert for now */ + LWIP_ASSERT("pbuf_header failed\n", 0); + goto bad; + } + + bufptr = n0->payload; + for(q = np; q != NULL; q = q->next) { + MEMCPY(q->payload, bufptr, q->len); + bufptr += q->len; + } + + if(n0->next) { + pbuf_chain(np, n0->next); + pbuf_dechain(n0); + } + pbuf_free(n0); + n0 = np; + } + + if(pbuf_header(n0, cs->cs_hlen)) { + struct pbuf *np; + + LWIP_ASSERT("vj_uncompress_tcp: cs->cs_hlen <= PBUF_POOL_BUFSIZE", cs->cs_hlen <= PBUF_POOL_BUFSIZE); + np = pbuf_alloc(PBUF_RAW, cs->cs_hlen, PBUF_POOL); + if(!np) { + PPPDEBUG(LOG_WARNING, ("vj_uncompress_tcp: prepend failed\n")); + goto bad; + } + pbuf_cat(np, n0); + n0 = np; + } + LWIP_ASSERT("n0->len >= cs->cs_hlen", n0->len >= cs->cs_hlen); + MEMCPY(n0->payload, &cs->cs_ip, cs->cs_hlen); + + *nb = n0; + + return vjlen; + +bad: + comp->flags |= VJF_TOSS; + INCR(vjs_errorin); + return (-1); +} + +#endif /* VJ_SUPPORT */ + +#endif /* PPP_SUPPORT */ diff --git a/third_party/lwip-1.4.1/src/netif/ppp/vj.h b/third_party/lwip-1.4.1/src/netif/ppp/vj.h new file mode 100644 index 0000000..373fd93 --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/ppp/vj.h @@ -0,0 +1,156 @@ +/* + * Definitions for tcp compression routines. + * + * $Id: vj.h,v 1.7 2010/02/22 17:52:09 goldsimon Exp $ + * + * Copyright (c) 1989 Regents of the University of California. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the University of California, Berkeley. The name of the + * University may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989: + * - Initial distribution. + */ + +#ifndef VJ_H +#define VJ_H + +#include "lwip/ip.h" +#include "lwip/tcp_impl.h" + +#define MAX_SLOTS 16 /* must be > 2 and < 256 */ +#define MAX_HDR 128 + +/* + * Compressed packet format: + * + * The first octet contains the packet type (top 3 bits), TCP + * 'push' bit, and flags that indicate which of the 4 TCP sequence + * numbers have changed (bottom 5 bits). The next octet is a + * conversation number that associates a saved IP/TCP header with + * the compressed packet. The next two octets are the TCP checksum + * from the original datagram. The next 0 to 15 octets are + * sequence number changes, one change per bit set in the header + * (there may be no changes and there are two special cases where + * the receiver implicitly knows what changed -- see below). + * + * There are 5 numbers which can change (they are always inserted + * in the following order): TCP urgent pointer, window, + * acknowlegement, sequence number and IP ID. (The urgent pointer + * is different from the others in that its value is sent, not the + * change in value.) Since typical use of SLIP links is biased + * toward small packets (see comments on MTU/MSS below), changes + * use a variable length coding with one octet for numbers in the + * range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the + * range 256 - 65535 or 0. (If the change in sequence number or + * ack is more than 65535, an uncompressed packet is sent.) + */ + +/* + * Packet types (must not conflict with IP protocol version) + * + * The top nibble of the first octet is the packet type. There are + * three possible types: IP (not proto TCP or tcp with one of the + * control flags set); uncompressed TCP (a normal IP/TCP packet but + * with the 8-bit protocol field replaced by an 8-bit connection id -- + * this type of packet syncs the sender & receiver); and compressed + * TCP (described above). + * + * LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and + * is logically part of the 4-bit "changes" field that follows. Top + * three bits are actual packet type. For backward compatibility + * and in the interest of conserving bits, numbers are chosen so the + * IP protocol version number (4) which normally appears in this nibble + * means "IP packet". + */ + +/* packet types */ +#define TYPE_IP 0x40 +#define TYPE_UNCOMPRESSED_TCP 0x70 +#define TYPE_COMPRESSED_TCP 0x80 +#define TYPE_ERROR 0x00 + +/* Bits in first octet of compressed packet */ +#define NEW_C 0x40 /* flag bits for what changed in a packet */ +#define NEW_I 0x20 +#define NEW_S 0x08 +#define NEW_A 0x04 +#define NEW_W 0x02 +#define NEW_U 0x01 + +/* reserved, special-case values of above */ +#define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */ +#define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */ +#define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U) + +#define TCP_PUSH_BIT 0x10 + + +/* + * "state" data for each active tcp conversation on the wire. This is + * basically a copy of the entire IP/TCP header from the last packet + * we saw from the conversation together with a small identifier + * the transmit & receive ends of the line use to locate saved header. + */ +struct cstate { + struct cstate *cs_next; /* next most recently used state (xmit only) */ + u_short cs_hlen; /* size of hdr (receive only) */ + u_char cs_id; /* connection # associated with this state */ + u_char cs_filler; + union { + char csu_hdr[MAX_HDR]; + struct ip_hdr csu_ip; /* ip/tcp hdr from most recent packet */ + } vjcs_u; +}; +#define cs_ip vjcs_u.csu_ip +#define cs_hdr vjcs_u.csu_hdr + + +struct vjstat { + unsigned long vjs_packets; /* outbound packets */ + unsigned long vjs_compressed; /* outbound compressed packets */ + unsigned long vjs_searches; /* searches for connection state */ + unsigned long vjs_misses; /* times couldn't find conn. state */ + unsigned long vjs_uncompressedin; /* inbound uncompressed packets */ + unsigned long vjs_compressedin; /* inbound compressed packets */ + unsigned long vjs_errorin; /* inbound unknown type packets */ + unsigned long vjs_tossed; /* inbound packets tossed because of error */ +}; + +/* + * all the state data for one serial line (we need one of these per line). + */ +struct vjcompress { + struct cstate *last_cs; /* most recently used tstate */ + u_char last_recv; /* last rcvd conn. id */ + u_char last_xmit; /* last sent conn. id */ + u_short flags; + u_char maxSlotIndex; + u_char compressSlot; /* Flag indicating OK to compress slot ID. */ +#if LINK_STATS + struct vjstat stats; +#endif + struct cstate tstate[MAX_SLOTS]; /* xmit connection states */ + struct cstate rstate[MAX_SLOTS]; /* receive connection states */ +}; + +/* flag values */ +#define VJF_TOSS 1U /* tossing rcvd frames because of input err */ + +extern void vj_compress_init (struct vjcompress *comp); +extern u_int vj_compress_tcp (struct vjcompress *comp, struct pbuf *pb); +extern void vj_uncompress_err (struct vjcompress *comp); +extern int vj_uncompress_uncomp(struct pbuf *nb, struct vjcompress *comp); +extern int vj_uncompress_tcp (struct pbuf **nb, struct vjcompress *comp); + +#endif /* VJ_H */ diff --git a/third_party/lwip-1.4.1/src/netif/slipif.c b/third_party/lwip-1.4.1/src/netif/slipif.c new file mode 100644 index 0000000..149f81c --- /dev/null +++ b/third_party/lwip-1.4.1/src/netif/slipif.c @@ -0,0 +1,510 @@ +/** + * @file + * SLIP Interface + * + */ + +/* + * Copyright (c) 2001-2004 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is built upon the file: src/arch/rtxc/netif/sioslip.c + * + * Author: Magnus Ivarsson + * Simon Goldschmidt + * + * Usage: This netif can be used in three ways: + * 1) For NO_SYS==0, an RX thread can be used which blocks on sio_read() + * until data is received. + * 2) In your main loop, call slipif_poll() to check for new RX bytes, + * completed packets are fed into netif->input(). + * 3) Call slipif_received_byte[s]() from your serial RX ISR and + * slipif_process_rxqueue() from your main loop. ISR level decodes + * packets and puts completed packets on a queue which is fed into + * the stack from the main loop (needs SYS_LIGHTWEIGHT_PROT for + * pbuf_alloc to work on ISR level!). + * + */ + +/* + * This is an arch independent SLIP netif. The specific serial hooks must be + * provided by another file. They are sio_open, sio_read/sio_tryread and sio_send + */ + +#include "netif/slipif.h" +#include "lwip/opt.h" + +#if LWIP_HAVE_SLIPIF + +#include "lwip/def.h" +#include "lwip/pbuf.h" +#include "lwip/stats.h" +#include "lwip/snmp.h" +#include "lwip/sio.h" +#include "lwip/sys.h" + +#define SLIP_END 0xC0 /* 0300: start and end of every packet */ +#define SLIP_ESC 0xDB /* 0333: escape start (one byte escaped data follows) */ +#define SLIP_ESC_END 0xDC /* 0334: following escape: original byte is 0xC0 (END) */ +#define SLIP_ESC_ESC 0xDD /* 0335: following escape: original byte is 0xDB (ESC) */ + +/** Maximum packet size that is received by this netif */ +#ifndef SLIP_MAX_SIZE +#define SLIP_MAX_SIZE 1500 +#endif + +/** Define this to the interface speed for SNMP + * (sio_fd is the sio_fd_t returned by sio_open). + * The default value of zero means 'unknown'. + */ +#ifndef SLIP_SIO_SPEED +#define SLIP_SIO_SPEED(sio_fd) 0 +#endif + +enum slipif_recv_state { + SLIP_RECV_NORMAL, + SLIP_RECV_ESCAPE, +}; + +struct slipif_priv { + sio_fd_t sd; + /* q is the whole pbuf chain for a packet, p is the current pbuf in the chain */ + struct pbuf *p, *q; + u8_t state; + u16_t i, recved; +#if SLIP_RX_FROM_ISR + struct pbuf *rxpackets; +#endif +}; + +/** + * Send a pbuf doing the necessary SLIP encapsulation + * + * Uses the serial layer's sio_send() + * + * @param netif the lwip network interface structure for this slipif + * @param p the pbuf chaing packet to send + * @param ipaddr the ip address to send the packet to (not used for slipif) + * @return always returns ERR_OK since the serial layer does not provide return values + */ +err_t +slipif_output(struct netif *netif, struct pbuf *p, ip_addr_t *ipaddr) +{ + struct slipif_priv *priv; + struct pbuf *q; + u16_t i; + u8_t c; + + LWIP_ASSERT("netif != NULL", (netif != NULL)); + LWIP_ASSERT("netif->state != NULL", (netif->state != NULL)); + LWIP_ASSERT("p != NULL", (p != NULL)); + + LWIP_UNUSED_ARG(ipaddr); + + LWIP_DEBUGF(SLIP_DEBUG, ("slipif_output(%"U16_F"): sending %"U16_F" bytes\n", (u16_t)netif->num, p->tot_len)); + priv = netif->state; + + /* Send pbuf out on the serial I/O device. */ + /* Start with packet delimiter. */ + sio_send(SLIP_END, priv->sd); + + for (q = p; q != NULL; q = q->next) { + for (i = 0; i < q->len; i++) { + c = ((u8_t *)q->payload)[i]; + switch (c) { + case SLIP_END: + /* need to escape this byte (0xC0 -> 0xDB, 0xDC) */ + sio_send(SLIP_ESC, priv->sd); + sio_send(SLIP_ESC_END, priv->sd); + break; + case SLIP_ESC: + /* need to escape this byte (0xDB -> 0xDB, 0xDD) */ + sio_send(SLIP_ESC, priv->sd); + sio_send(SLIP_ESC_ESC, priv->sd); + break; + default: + /* normal byte - no need for escaping */ + sio_send(c, priv->sd); + break; + } + } + } + /* End with packet delimiter. */ + sio_send(SLIP_END, priv->sd); + return ERR_OK; +} + +/** + * Handle the incoming SLIP stream character by character + * + * @param netif the lwip network interface structure for this slipif + * @param c received character (multiple calls to this function will + * return a complete packet, NULL is returned before - used for polling) + * @return The IP packet when SLIP_END is received + */ +static struct pbuf* +slipif_rxbyte(struct netif *netif, u8_t c) +{ + struct slipif_priv *priv; + struct pbuf *t; + + LWIP_ASSERT("netif != NULL", (netif != NULL)); + LWIP_ASSERT("netif->state != NULL", (netif->state != NULL)); + + priv = netif->state; + + switch (priv->state) { + case SLIP_RECV_NORMAL: + switch (c) { + case SLIP_END: + if (priv->recved > 0) { + /* Received whole packet. */ + /* Trim the pbuf to the size of the received packet. */ + pbuf_realloc(priv->q, priv->recved); + + LINK_STATS_INC(link.recv); + + LWIP_DEBUGF(SLIP_DEBUG, ("slipif: Got packet (%"U16_F" bytes)\n", priv->recved)); + t = priv->q; + priv->p = priv->q = NULL; + priv->i = priv->recved = 0; + return t; + } + return NULL; + case SLIP_ESC: + priv->state = SLIP_RECV_ESCAPE; + return NULL; + } /* end switch (c) */ + break; + case SLIP_RECV_ESCAPE: + /* un-escape END or ESC bytes, leave other bytes + (although that would be a protocol error) */ + switch (c) { + case SLIP_ESC_END: + c = SLIP_END; + break; + case SLIP_ESC_ESC: + c = SLIP_ESC; + break; + } + priv->state = SLIP_RECV_NORMAL; + break; + } /* end switch (priv->state) */ + + /* byte received, packet not yet completely received */ + if (priv->p == NULL) { + /* allocate a new pbuf */ + LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: alloc\n")); + priv->p = pbuf_alloc(PBUF_LINK, (PBUF_POOL_BUFSIZE - PBUF_LINK_HLEN), PBUF_POOL); + + if (priv->p == NULL) { + LINK_STATS_INC(link.drop); + LWIP_DEBUGF(SLIP_DEBUG, ("slipif_input: no new pbuf! (DROP)\n")); + /* don't process any further since we got no pbuf to receive to */ + return NULL; + } + + if (priv->q != NULL) { + /* 'chain' the pbuf to the existing chain */ + pbuf_cat(priv->q, priv->p); + } else { + /* p is the first pbuf in the chain */ + priv->q = priv->p; + } + } + + /* this automatically drops bytes if > SLIP_MAX_SIZE */ + if ((priv->p != NULL) && (priv->recved <= SLIP_MAX_SIZE)) { + ((u8_t *)priv->p->payload)[priv->i] = c; + priv->recved++; + priv->i++; + if (priv->i >= priv->p->len) { + /* on to the next pbuf */ + priv->i = 0; + if (priv->p->next != NULL && priv->p->next->len > 0) { + /* p is a chain, on to the next in the chain */ + priv->p = priv->p->next; + } else { + /* p is a single pbuf, set it to NULL so next time a new + * pbuf is allocated */ + priv->p = NULL; + } + } + } + return NULL; +} + +/** Like slipif_rxbyte, but passes completed packets to netif->input + * + * @param netif The lwip network interface structure for this slipif + * @param data received character + */ +static void +slipif_rxbyte_input(struct netif *netif, u8_t c) +{ + struct pbuf *p; + p = slipif_rxbyte(netif, c); + if (p != NULL) { + if (netif->input(p, netif) != ERR_OK) { + pbuf_free(p); + } + } +} + +#if SLIP_USE_RX_THREAD +/** + * The SLIP input thread. + * + * Feed the IP layer with incoming packets + * + * @param nf the lwip network interface structure for this slipif + */ +static void +slipif_loop_thread(void *nf) +{ + u8_t c; + struct netif *netif = (struct netif *)nf; + struct slipif_priv *priv = (struct slipif_priv *)netif->state; + + while (1) { + if (sio_read(priv->sd, &c, 1) > 0) { + slipif_rxbyte_input(netif, c); + } + } +} +#endif /* SLIP_USE_RX_THREAD */ + +/** + * SLIP netif initialization + * + * Call the arch specific sio_open and remember + * the opened device in the state field of the netif. + * + * @param netif the lwip network interface structure for this slipif + * @return ERR_OK if serial line could be opened, + * ERR_MEM if no memory could be allocated, + * ERR_IF is serial line couldn't be opened + * + * @note netif->num must contain the number of the serial port to open + * (0 by default). If netif->state is != NULL, it is interpreted as an + * u8_t pointer pointing to the serial port number instead of netif->num. + * + */ +err_t +slipif_init(struct netif *netif) +{ + struct slipif_priv *priv; + u8_t sio_num; + + LWIP_DEBUGF(SLIP_DEBUG, ("slipif_init: netif->num=%"U16_F"\n", (u16_t)netif->num)); + + /* Allocate private data */ + priv = (struct slipif_priv *)mem_malloc(sizeof(struct slipif_priv)); + if (!priv) { + return ERR_MEM; + } + + netif->name[0] = 's'; + netif->name[1] = 'l'; + netif->output = slipif_output; + netif->mtu = SLIP_MAX_SIZE; + netif->flags |= NETIF_FLAG_POINTTOPOINT; + + /* netif->state or netif->num contain the port number */ + if (netif->state != NULL) { + sio_num = *(u8_t*)netif->state; + } else { + sio_num = netif->num; + } + /* Try to open the serial port. */ + priv->sd = sio_open(sio_num); + if (!priv->sd) { + /* Opening the serial port failed. */ + mem_free(priv); + return ERR_IF; + } + + /* Initialize private data */ + priv->p = NULL; + priv->q = NULL; + priv->state = SLIP_RECV_NORMAL; + priv->i = 0; + priv->recved = 0; +#if SLIP_RX_FROM_ISR + priv->rxpackets = NULL; +#endif + + netif->state = priv; + + /* initialize the snmp variables and counters inside the struct netif */ + NETIF_INIT_SNMP(netif, snmp_ifType_slip, SLIP_SIO_SPEED(priv->sd)); + +#if SLIP_USE_RX_THREAD + /* Create a thread to poll the serial line. */ + sys_thread_new(SLIPIF_THREAD_NAME, slipif_loop_thread, netif, + SLIPIF_THREAD_STACKSIZE, SLIPIF_THREAD_PRIO); +#endif /* SLIP_USE_RX_THREAD */ + return ERR_OK; +} + +/** + * Polls the serial device and feeds the IP layer with incoming packets. + * + * @param netif The lwip network interface structure for this slipif + */ +void +slipif_poll(struct netif *netif) +{ + u8_t c; + struct slipif_priv *priv; + + LWIP_ASSERT("netif != NULL", (netif != NULL)); + LWIP_ASSERT("netif->state != NULL", (netif->state != NULL)); + + priv = (struct slipif_priv *)netif->state; + + while (sio_tryread(priv->sd, &c, 1) > 0) { + slipif_rxbyte_input(netif, c); + } +} + +#if SLIP_RX_FROM_ISR +/** + * Feeds the IP layer with incoming packets that were receive + * + * @param netif The lwip network interface structure for this slipif + */ +void +slipif_process_rxqueue(struct netif *netif) +{ + struct slipif_priv *priv; + SYS_ARCH_DECL_PROTECT(old_level); + + LWIP_ASSERT("netif != NULL", (netif != NULL)); + LWIP_ASSERT("netif->state != NULL", (netif->state != NULL)); + + priv = (struct slipif_priv *)netif->state; + + SYS_ARCH_PROTECT(old_level); + while (priv->rxpackets != NULL) { + struct pbuf *p = priv->rxpackets; +#if SLIP_RX_QUEUE + /* dequeue packet */ + struct pbuf *q = p; + while ((q->len != q->tot_len) && (q->next != NULL)) { + q = q->next; + } + priv->rxpackets = q->next; + q->next = NULL; +#else /* SLIP_RX_QUEUE */ + priv->rxpackets = NULL; +#endif /* SLIP_RX_QUEUE */ + SYS_ARCH_UNPROTECT(old_level); + if (netif->input(p, netif) != ERR_OK) { + pbuf_free(p); + } + SYS_ARCH_PROTECT(old_level); + } +} + +/** Like slipif_rxbyte, but queues completed packets. + * + * @param netif The lwip network interface structure for this slipif + * @param data Received serial byte + */ +static void +slipif_rxbyte_enqueue(struct netif *netif, u8_t data) +{ + struct pbuf *p; + struct slipif_priv *priv = (struct slipif_priv *)netif->state; + SYS_ARCH_DECL_PROTECT(old_level); + + p = slipif_rxbyte(netif, data); + if (p != NULL) { + SYS_ARCH_PROTECT(old_level); + if (priv->rxpackets != NULL) { +#if SLIP_RX_QUEUE + /* queue multiple pbufs */ + struct pbuf *q = p; + while(q->next != NULL) { + q = q->next; + } + q->next = p; + } else { +#else /* SLIP_RX_QUEUE */ + pbuf_free(priv->rxpackets); + } + { +#endif /* SLIP_RX_QUEUE */ + priv->rxpackets = p; + } + SYS_ARCH_UNPROTECT(old_level); + } +} + +/** + * Process a received byte, completed packets are put on a queue that is + * fed into IP through slipif_process_rxqueue(). + * + * This function can be called from ISR if SYS_LIGHTWEIGHT_PROT is enabled. + * + * @param netif The lwip network interface structure for this slipif + * @param data received character + */ +void +slipif_received_byte(struct netif *netif, u8_t data) +{ + LWIP_ASSERT("netif != NULL", (netif != NULL)); + LWIP_ASSERT("netif->state != NULL", (netif->state != NULL)); + slipif_rxbyte_enqueue(netif, data); +} + +/** + * Process multiple received byte, completed packets are put on a queue that is + * fed into IP through slipif_process_rxqueue(). + * + * This function can be called from ISR if SYS_LIGHTWEIGHT_PROT is enabled. + * + * @param netif The lwip network interface structure for this slipif + * @param data received character + * @param len Number of received characters + */ +void +slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len) +{ + u8_t i; + u8_t *rxdata = data; + LWIP_ASSERT("netif != NULL", (netif != NULL)); + LWIP_ASSERT("netif->state != NULL", (netif->state != NULL)); + + for (i = 0; i < len; i++, rxdata++) { + slipif_rxbyte_enqueue(netif, *rxdata); + } +} +#endif /* SLIP_RX_FROM_ISR */ + +#endif /* LWIP_HAVE_SLIPIF */ diff --git a/third_party/lwip-1.4.1/test/unit/core/test_mem.c b/third_party/lwip-1.4.1/test/unit/core/test_mem.c new file mode 100644 index 0000000..74a8373 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/core/test_mem.c @@ -0,0 +1,73 @@ +#include "test_mem.h" + +#include "lwip/mem.h" +#include "lwip/stats.h" + +#if !LWIP_STATS || !MEM_STATS +#error "This tests needs MEM-statistics enabled" +#endif +#if LWIP_DNS +#error "This test needs DNS turned off (as it mallocs on init)" +#endif + +/* Setups/teardown functions */ + +static void +mem_setup(void) +{ +} + +static void +mem_teardown(void) +{ +} + + +/* Test functions */ + +/** Call mem_malloc, mem_free and mem_trim and check stats */ +START_TEST(test_mem_one) +{ +#define SIZE1 16 +#define SIZE1_2 12 +#define SIZE2 16 + void *p1, *p2; + mem_size_t s1, s2; + LWIP_UNUSED_ARG(_i); + +#if LWIP_DNS + fail("This test needs DNS turned off (as it mallocs on init)"); +#endif + + fail_unless(lwip_stats.mem.used == 0); + + p1 = mem_malloc(SIZE1); + fail_unless(p1 != NULL); + fail_unless(lwip_stats.mem.used >= SIZE1); + s1 = lwip_stats.mem.used; + + p2 = mem_malloc(SIZE2); + fail_unless(p2 != NULL); + fail_unless(lwip_stats.mem.used >= SIZE2 + s1); + s2 = lwip_stats.mem.used; + + mem_trim(p1, SIZE1_2); + + mem_free(p2); + fail_unless(lwip_stats.mem.used <= s2 - SIZE2); + + mem_free(p1); + fail_unless(lwip_stats.mem.used == 0); +} +END_TEST + + +/** Create the suite including all tests for this module */ +Suite * +mem_suite(void) +{ + TFun tests[] = { + test_mem_one + }; + return create_suite("MEM", tests, sizeof(tests)/sizeof(TFun), mem_setup, mem_teardown); +} diff --git a/third_party/lwip-1.4.1/test/unit/core/test_mem.h b/third_party/lwip-1.4.1/test/unit/core/test_mem.h new file mode 100644 index 0000000..f381151 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/core/test_mem.h @@ -0,0 +1,8 @@ +#ifndef __TEST_MEM_H__ +#define __TEST_MEM_H__ + +#include "../lwip_check.h" + +Suite *mem_suite(void); + +#endif diff --git a/third_party/lwip-1.4.1/test/unit/etharp/test_etharp.c b/third_party/lwip-1.4.1/test/unit/etharp/test_etharp.c new file mode 100644 index 0000000..d0ea044 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/etharp/test_etharp.c @@ -0,0 +1,262 @@ +#include "test_etharp.h" + +#include "lwip/udp.h" +#include "netif/etharp.h" +#include "lwip/stats.h" + +#if !LWIP_STATS || !UDP_STATS || !MEMP_STATS || !ETHARP_STATS +#error "This tests needs UDP-, MEMP- and ETHARP-statistics enabled" +#endif +#if !ETHARP_SUPPORT_STATIC_ENTRIES +#error "This test needs ETHARP_SUPPORT_STATIC_ENTRIES enabled" +#endif + +static struct netif test_netif; +static ip_addr_t test_ipaddr, test_netmask, test_gw; +struct eth_addr test_ethaddr = {1,1,1,1,1,1}; +struct eth_addr test_ethaddr2 = {1,1,1,1,1,2}; +struct eth_addr test_ethaddr3 = {1,1,1,1,1,3}; +struct eth_addr test_ethaddr4 = {1,1,1,1,1,4}; +static int linkoutput_ctr; + +/* Helper functions */ +static void +etharp_remove_all(void) +{ + int i; + /* call etharp_tmr often enough to have all entries cleaned */ + for(i = 0; i < 0xff; i++) { + etharp_tmr(); + } +} + +static err_t +default_netif_linkoutput(struct netif *netif, struct pbuf *p) +{ + fail_unless(netif == &test_netif); + fail_unless(p != NULL); + linkoutput_ctr++; + return ERR_OK; +} + +static err_t +default_netif_init(struct netif *netif) +{ + fail_unless(netif != NULL); + netif->linkoutput = default_netif_linkoutput; + netif->output = etharp_output; + netif->mtu = 1500; + netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP; + netif->hwaddr_len = ETHARP_HWADDR_LEN; + return ERR_OK; +} + +static void +default_netif_add(void) +{ + IP4_ADDR(&test_gw, 192,168,0,1); + IP4_ADDR(&test_ipaddr, 192,168,0,1); + IP4_ADDR(&test_netmask, 255,255,0,0); + + fail_unless(netif_default == NULL); + netif_set_default(netif_add(&test_netif, &test_ipaddr, &test_netmask, + &test_gw, NULL, default_netif_init, NULL)); + netif_set_up(&test_netif); +} + +static void +default_netif_remove(void) +{ + fail_unless(netif_default == &test_netif); + netif_remove(&test_netif); +} + +static void +create_arp_response(ip_addr_t *adr) +{ + int k; + struct eth_hdr *ethhdr; + struct etharp_hdr *etharphdr; + struct pbuf *p = pbuf_alloc(PBUF_RAW, sizeof(struct eth_hdr) + sizeof(struct etharp_hdr), PBUF_RAM); + if(p == NULL) { + FAIL_RET(); + } + ethhdr = (struct eth_hdr*)p->payload; + etharphdr = (struct etharp_hdr*)(ethhdr + 1); + + ethhdr->dest = test_ethaddr; + ethhdr->src = test_ethaddr2; + ethhdr->type = htons(ETHTYPE_ARP); + + etharphdr->hwtype = htons(/*HWTYPE_ETHERNET*/ 1); + etharphdr->proto = htons(ETHTYPE_IP); + etharphdr->hwlen = ETHARP_HWADDR_LEN; + etharphdr->protolen = sizeof(ip_addr_t); + etharphdr->opcode = htons(ARP_REPLY); + + SMEMCPY(ðarphdr->sipaddr, adr, sizeof(ip_addr_t)); + SMEMCPY(ðarphdr->dipaddr, &test_ipaddr, sizeof(ip_addr_t)); + + k = 6; + while(k > 0) { + k--; + /* Write the ARP MAC-Addresses */ + etharphdr->shwaddr.addr[k] = test_ethaddr2.addr[k]; + etharphdr->dhwaddr.addr[k] = test_ethaddr.addr[k]; + /* Write the Ethernet MAC-Addresses */ + ethhdr->dest.addr[k] = test_ethaddr.addr[k]; + ethhdr->src.addr[k] = test_ethaddr2.addr[k]; + } + + ethernet_input(p, &test_netif); +} + +/* Setups/teardown functions */ + +static void +etharp_setup(void) +{ + etharp_remove_all(); + default_netif_add(); +} + +static void +etharp_teardown(void) +{ + etharp_remove_all(); + default_netif_remove(); +} + + +/* Test functions */ + +START_TEST(test_etharp_table) +{ +#if ETHARP_SUPPORT_STATIC_ENTRIES + err_t err; +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ + s8_t idx; + ip_addr_t *unused_ipaddr; + struct eth_addr *unused_ethaddr; + struct udp_pcb* pcb; + LWIP_UNUSED_ARG(_i); + + if (netif_default != &test_netif) { + fail("This test needs a default netif"); + } + + linkoutput_ctr = 0; + + pcb = udp_new(); + fail_unless(pcb != NULL); + if (pcb != NULL) { + ip_addr_t adrs[ARP_TABLE_SIZE + 2]; + int i; + for(i = 0; i < ARP_TABLE_SIZE + 2; i++) { + IP4_ADDR(&adrs[i], 192,168,0,i+2); + } + /* fill ARP-table with dynamic entries */ + for(i = 0; i < ARP_TABLE_SIZE; i++) { + struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, 10, PBUF_RAM); + fail_unless(p != NULL); + if (p != NULL) { + err_t err = udp_sendto(pcb, p, &adrs[i], 123); + fail_unless(err == ERR_OK); + /* etharp request sent? */ + fail_unless(linkoutput_ctr == (2*i) + 1); + pbuf_free(p); + + /* create an ARP response */ + create_arp_response(&adrs[i]); + /* queued UDP packet sent? */ + fail_unless(linkoutput_ctr == (2*i) + 2); + + idx = etharp_find_addr(NULL, &adrs[i], &unused_ethaddr, &unused_ipaddr); + fail_unless(idx == i); + etharp_tmr(); + } + } + linkoutput_ctr = 0; +#if ETHARP_SUPPORT_STATIC_ENTRIES + /* create one static entry */ + err = etharp_add_static_entry(&adrs[ARP_TABLE_SIZE], &test_ethaddr3); + fail_unless(err == ERR_OK); + idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr); + fail_unless(idx == 0); + fail_unless(linkoutput_ctr == 0); +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ + + linkoutput_ctr = 0; + /* fill ARP-table with dynamic entries */ + for(i = 0; i < ARP_TABLE_SIZE; i++) { + struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, 10, PBUF_RAM); + fail_unless(p != NULL); + if (p != NULL) { + err_t err = udp_sendto(pcb, p, &adrs[i], 123); + fail_unless(err == ERR_OK); + /* etharp request sent? */ + fail_unless(linkoutput_ctr == (2*i) + 1); + pbuf_free(p); + + /* create an ARP response */ + create_arp_response(&adrs[i]); + /* queued UDP packet sent? */ + fail_unless(linkoutput_ctr == (2*i) + 2); + + idx = etharp_find_addr(NULL, &adrs[i], &unused_ethaddr, &unused_ipaddr); + if (i < ARP_TABLE_SIZE - 1) { + fail_unless(idx == i+1); + } else { + /* the last entry must not overwrite the static entry! */ + fail_unless(idx == 1); + } + etharp_tmr(); + } + } +#if ETHARP_SUPPORT_STATIC_ENTRIES + /* create a second static entry */ + err = etharp_add_static_entry(&adrs[ARP_TABLE_SIZE+1], &test_ethaddr4); + fail_unless(err == ERR_OK); + idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr); + fail_unless(idx == 0); + idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE+1], &unused_ethaddr, &unused_ipaddr); + fail_unless(idx == 2); + /* and remove it again */ + err = etharp_remove_static_entry(&adrs[ARP_TABLE_SIZE+1]); + fail_unless(err == ERR_OK); + idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr); + fail_unless(idx == 0); + idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE+1], &unused_ethaddr, &unused_ipaddr); + fail_unless(idx == -1); +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ + + /* check that static entries don't time out */ + etharp_remove_all(); + idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr); + fail_unless(idx == 0); + +#if ETHARP_SUPPORT_STATIC_ENTRIES + /* remove the first static entry */ + err = etharp_remove_static_entry(&adrs[ARP_TABLE_SIZE]); + fail_unless(err == ERR_OK); + idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr); + fail_unless(idx == -1); + idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE+1], &unused_ethaddr, &unused_ipaddr); + fail_unless(idx == -1); +#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */ + + udp_remove(pcb); + } +} +END_TEST + + +/** Create the suite including all tests for this module */ +Suite * +etharp_suite(void) +{ + TFun tests[] = { + test_etharp_table + }; + return create_suite("ETHARP", tests, sizeof(tests)/sizeof(TFun), etharp_setup, etharp_teardown); +} diff --git a/third_party/lwip-1.4.1/test/unit/etharp/test_etharp.h b/third_party/lwip-1.4.1/test/unit/etharp/test_etharp.h new file mode 100644 index 0000000..4a06c32 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/etharp/test_etharp.h @@ -0,0 +1,8 @@ +#ifndef __TEST_ETHARP_H__ +#define __TEST_ETHARP_H__ + +#include "../lwip_check.h" + +Suite* etharp_suite(void); + +#endif diff --git a/third_party/lwip-1.4.1/test/unit/lwip_check.h b/third_party/lwip-1.4.1/test/unit/lwip_check.h new file mode 100644 index 0000000..9753234 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/lwip_check.h @@ -0,0 +1,37 @@ +#ifndef __LWIP_CHECK_H__ +#define __LWIP_CHECK_H__ + +/* Common header file for lwIP unit tests using the check framework */ + +#include +#include +#include + +#define FAIL_RET() do { fail(); return; } while(0) +#define EXPECT(x) fail_unless(x) +#define EXPECT_RET(x) do { fail_unless(x); if(!(x)) { return; }} while(0) +#define EXPECT_RETX(x, y) do { fail_unless(x); if(!(x)) { return y; }} while(0) +#define EXPECT_RETNULL(x) EXPECT_RETX(x, NULL) + +/** typedef for a function returning a test suite */ +typedef Suite* (suite_getter_fn)(void); + +/** Create a test suite */ +static Suite* create_suite(const char* name, TFun *tests, size_t num_tests, SFun setup, SFun teardown) +{ + size_t i; + Suite *s = suite_create(name); + + for(i = 0; i < num_tests; i++) { + /* Core test case */ + TCase *tc_core = tcase_create("Core"); + if ((setup != NULL) || (teardown != NULL)) { + tcase_add_checked_fixture(tc_core, setup, teardown); + } + tcase_add_test(tc_core, tests[i]); + suite_add_tcase(s, tc_core); + } + return s; +} + +#endif /* __LWIP_CHECK_H__ */ diff --git a/third_party/lwip-1.4.1/test/unit/lwip_unittests.c b/third_party/lwip-1.4.1/test/unit/lwip_unittests.c new file mode 100644 index 0000000..7d81fb7 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/lwip_unittests.c @@ -0,0 +1,45 @@ +#include "lwip_check.h" + +#include "udp/test_udp.h" +#include "tcp/test_tcp.h" +#include "tcp/test_tcp_oos.h" +#include "core/test_mem.h" +#include "etharp/test_etharp.h" + +#include "lwip/init.h" + + +int main() +{ + int number_failed; + SRunner *sr; + size_t i; + suite_getter_fn* suites[] = { + udp_suite, + tcp_suite, + tcp_oos_suite, + mem_suite, + etharp_suite + }; + size_t num = sizeof(suites)/sizeof(void*); + LWIP_ASSERT("No suites defined", num > 0); + + lwip_init(); + + sr = srunner_create((suites[0])()); + for(i = 1; i < num; i++) { + srunner_add_suite(sr, ((suite_getter_fn*)suites[i])()); + } + +#ifdef LWIP_UNITTESTS_NOFORK + srunner_set_fork_status(sr, CK_NOFORK); +#endif +#ifdef LWIP_UNITTESTS_FORK + srunner_set_fork_status(sr, CK_FORK); +#endif + + srunner_run_all(sr, CK_NORMAL); + number_failed = srunner_ntests_failed(sr); + srunner_free(sr); + return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; +} diff --git a/third_party/lwip-1.4.1/test/unit/lwipopts.h b/third_party/lwip-1.4.1/test/unit/lwipopts.h new file mode 100644 index 0000000..ce91fe2 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/lwipopts.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT + * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT + * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Simon Goldschmidt + * + */ +#ifndef __LWIPOPTS_H__ +#define __LWIPOPTS_H__ + +/* Prevent having to link sys_arch.c (we don't test the API layers in unit tests) */ +#define NO_SYS 1 +#define LWIP_NETCONN 0 +#define LWIP_SOCKET 0 + +/* Minimal changes to opt.h required for tcp unit tests: */ +#define MEM_SIZE 16000 +#define TCP_SND_QUEUELEN 40 +#define MEMP_NUM_TCP_SEG TCP_SND_QUEUELEN +#define TCP_SND_BUF (12 * TCP_MSS) +#define TCP_WND (10 * TCP_MSS) + +/* Minimal changes to opt.h required for etharp unit tests: */ +#define ETHARP_SUPPORT_STATIC_ENTRIES 1 + +#endif /* __LWIPOPTS_H__ */ diff --git a/third_party/lwip-1.4.1/test/unit/tcp/tcp_helper.c b/third_party/lwip-1.4.1/test/unit/tcp/tcp_helper.c new file mode 100644 index 0000000..9aae6e0 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/tcp/tcp_helper.c @@ -0,0 +1,294 @@ +#include "tcp_helper.h" + +#include "lwip/tcp_impl.h" +#include "lwip/stats.h" +#include "lwip/pbuf.h" +#include "lwip/inet_chksum.h" + +#if !LWIP_STATS || !TCP_STATS || !MEMP_STATS +#error "This tests needs TCP- and MEMP-statistics enabled" +#endif + +/** Remove all pcbs on the given list. */ +static void +tcp_remove(struct tcp_pcb* pcb_list) +{ + struct tcp_pcb *pcb = pcb_list; + struct tcp_pcb *pcb2; + + while(pcb != NULL) { + pcb2 = pcb; + pcb = pcb->next; + tcp_abort(pcb2); + } +} + +/** Remove all pcbs on listen-, active- and time-wait-list (bound- isn't exported). */ +void +tcp_remove_all(void) +{ + tcp_remove(tcp_listen_pcbs.pcbs); + tcp_remove(tcp_active_pcbs); + tcp_remove(tcp_tw_pcbs); + fail_unless(lwip_stats.memp[MEMP_TCP_PCB].used == 0); + fail_unless(lwip_stats.memp[MEMP_TCP_PCB_LISTEN].used == 0); + fail_unless(lwip_stats.memp[MEMP_TCP_SEG].used == 0); + fail_unless(lwip_stats.memp[MEMP_PBUF_POOL].used == 0); +} + +/** Create a TCP segment usable for passing to tcp_input */ +static struct pbuf* +tcp_create_segment_wnd(ip_addr_t* src_ip, ip_addr_t* dst_ip, + u16_t src_port, u16_t dst_port, void* data, size_t data_len, + u32_t seqno, u32_t ackno, u8_t headerflags, u16_t wnd) +{ + struct pbuf *p, *q; + struct ip_hdr* iphdr; + struct tcp_hdr* tcphdr; + u16_t pbuf_len = (u16_t)(sizeof(struct ip_hdr) + sizeof(struct tcp_hdr) + data_len); + + p = pbuf_alloc(PBUF_RAW, pbuf_len, PBUF_POOL); + EXPECT_RETNULL(p != NULL); + /* first pbuf must be big enough to hold the headers */ + EXPECT_RETNULL(p->len >= (sizeof(struct ip_hdr) + sizeof(struct tcp_hdr))); + if (data_len > 0) { + /* first pbuf must be big enough to hold at least 1 data byte, too */ + EXPECT_RETNULL(p->len > (sizeof(struct ip_hdr) + sizeof(struct tcp_hdr))); + } + + for(q = p; q != NULL; q = q->next) { + memset(q->payload, 0, q->len); + } + + iphdr = p->payload; + /* fill IP header */ + iphdr->dest.addr = dst_ip->addr; + iphdr->src.addr = src_ip->addr; + IPH_VHL_SET(iphdr, 4, IP_HLEN / 4); + IPH_TOS_SET(iphdr, 0); + IPH_LEN_SET(iphdr, htons(p->tot_len)); + IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN)); + + /* let p point to TCP header */ + pbuf_header(p, -(s16_t)sizeof(struct ip_hdr)); + + tcphdr = p->payload; + tcphdr->src = htons(src_port); + tcphdr->dest = htons(dst_port); + tcphdr->seqno = htonl(seqno); + tcphdr->ackno = htonl(ackno); + TCPH_HDRLEN_SET(tcphdr, sizeof(struct tcp_hdr)/4); + TCPH_FLAGS_SET(tcphdr, headerflags); + tcphdr->wnd = htons(wnd); + + if (data_len > 0) { + /* let p point to TCP data */ + pbuf_header(p, -(s16_t)sizeof(struct tcp_hdr)); + /* copy data */ + pbuf_take(p, data, data_len); + /* let p point to TCP header again */ + pbuf_header(p, sizeof(struct tcp_hdr)); + } + + /* calculate checksum */ + + tcphdr->chksum = inet_chksum_pseudo(p, src_ip, dst_ip, + IP_PROTO_TCP, p->tot_len); + + pbuf_header(p, sizeof(struct ip_hdr)); + + return p; +} + +/** Create a TCP segment usable for passing to tcp_input */ +struct pbuf* +tcp_create_segment(ip_addr_t* src_ip, ip_addr_t* dst_ip, + u16_t src_port, u16_t dst_port, void* data, size_t data_len, + u32_t seqno, u32_t ackno, u8_t headerflags) +{ + return tcp_create_segment_wnd(src_ip, dst_ip, src_port, dst_port, data, + data_len, seqno, ackno, headerflags, TCP_WND); +} + +/** Create a TCP segment usable for passing to tcp_input + * - IP-addresses, ports, seqno and ackno are taken from pcb + * - seqno and ackno can be altered with an offset + */ +struct pbuf* +tcp_create_rx_segment(struct tcp_pcb* pcb, void* data, size_t data_len, u32_t seqno_offset, + u32_t ackno_offset, u8_t headerflags) +{ + return tcp_create_segment(&pcb->remote_ip, &pcb->local_ip, pcb->remote_port, pcb->local_port, + data, data_len, pcb->rcv_nxt + seqno_offset, pcb->lastack + ackno_offset, headerflags); +} + +/** Create a TCP segment usable for passing to tcp_input + * - IP-addresses, ports, seqno and ackno are taken from pcb + * - seqno and ackno can be altered with an offset + * - TCP window can be adjusted + */ +struct pbuf* tcp_create_rx_segment_wnd(struct tcp_pcb* pcb, void* data, size_t data_len, + u32_t seqno_offset, u32_t ackno_offset, u8_t headerflags, u16_t wnd) +{ + return tcp_create_segment_wnd(&pcb->remote_ip, &pcb->local_ip, pcb->remote_port, pcb->local_port, + data, data_len, pcb->rcv_nxt + seqno_offset, pcb->lastack + ackno_offset, headerflags, wnd); +} + +/** Safely bring a tcp_pcb into the requested state */ +void +tcp_set_state(struct tcp_pcb* pcb, enum tcp_state state, ip_addr_t* local_ip, + ip_addr_t* remote_ip, u16_t local_port, u16_t remote_port) +{ + /* @todo: are these all states? */ + /* @todo: remove from previous list */ + pcb->state = state; + if (state == ESTABLISHED) { + TCP_REG(&tcp_active_pcbs, pcb); + pcb->local_ip.addr = local_ip->addr; + pcb->local_port = local_port; + pcb->remote_ip.addr = remote_ip->addr; + pcb->remote_port = remote_port; + } else if(state == LISTEN) { + TCP_REG(&tcp_listen_pcbs.pcbs, pcb); + pcb->local_ip.addr = local_ip->addr; + pcb->local_port = local_port; + } else if(state == TIME_WAIT) { + TCP_REG(&tcp_tw_pcbs, pcb); + pcb->local_ip.addr = local_ip->addr; + pcb->local_port = local_port; + pcb->remote_ip.addr = remote_ip->addr; + pcb->remote_port = remote_port; + } else { + fail(); + } +} + +void +test_tcp_counters_err(void* arg, err_t err) +{ + struct test_tcp_counters* counters = arg; + EXPECT_RET(arg != NULL); + counters->err_calls++; + counters->last_err = err; +} + +static void +test_tcp_counters_check_rxdata(struct test_tcp_counters* counters, struct pbuf* p) +{ + struct pbuf* q; + u32_t i, received; + if(counters->expected_data == NULL) { + /* no data to compare */ + return; + } + EXPECT_RET(counters->recved_bytes + p->tot_len <= counters->expected_data_len); + received = counters->recved_bytes; + for(q = p; q != NULL; q = q->next) { + char *data = q->payload; + for(i = 0; i < q->len; i++) { + EXPECT_RET(data[i] == counters->expected_data[received]); + received++; + } + } + EXPECT(received == counters->recved_bytes + p->tot_len); +} + +err_t +test_tcp_counters_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err) +{ + struct test_tcp_counters* counters = arg; + EXPECT_RETX(arg != NULL, ERR_OK); + EXPECT_RETX(pcb != NULL, ERR_OK); + EXPECT_RETX(err == ERR_OK, ERR_OK); + + if (p != NULL) { + if (counters->close_calls == 0) { + counters->recv_calls++; + test_tcp_counters_check_rxdata(counters, p); + counters->recved_bytes += p->tot_len; + } else { + counters->recv_calls_after_close++; + counters->recved_bytes_after_close += p->tot_len; + } + pbuf_free(p); + } else { + counters->close_calls++; + } + EXPECT(counters->recv_calls_after_close == 0 && counters->recved_bytes_after_close == 0); + return ERR_OK; +} + +/** Allocate a pcb and set up the test_tcp_counters_* callbacks */ +struct tcp_pcb* +test_tcp_new_counters_pcb(struct test_tcp_counters* counters) +{ + struct tcp_pcb* pcb = tcp_new(); + if (pcb != NULL) { + /* set up args and callbacks */ + tcp_arg(pcb, counters); + tcp_recv(pcb, test_tcp_counters_recv); + tcp_err(pcb, test_tcp_counters_err); + pcb->snd_wnd = TCP_WND; + pcb->snd_wnd_max = TCP_WND; + } + return pcb; +} + +/** Calls tcp_input() after adjusting current_iphdr_dest */ +void test_tcp_input(struct pbuf *p, struct netif *inp) +{ + struct ip_hdr *iphdr = (struct ip_hdr*)p->payload; + ip_addr_copy(current_iphdr_dest, iphdr->dest); + ip_addr_copy(current_iphdr_src, iphdr->src); + current_netif = inp; + current_header = iphdr; + + tcp_input(p, inp); + + current_iphdr_dest.addr = 0; + current_iphdr_src.addr = 0; + current_netif = NULL; + current_header = NULL; +} + +static err_t test_tcp_netif_output(struct netif *netif, struct pbuf *p, + ip_addr_t *ipaddr) +{ + struct test_tcp_txcounters *txcounters = (struct test_tcp_txcounters*)netif->state; + LWIP_UNUSED_ARG(ipaddr); + txcounters->num_tx_calls++; + txcounters->num_tx_bytes += p->tot_len; + if (txcounters->copy_tx_packets) { + struct pbuf *p_copy = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM); + err_t err; + EXPECT(p_copy != NULL); + err = pbuf_copy(p_copy, p); + EXPECT(err == ERR_OK); + if (txcounters->tx_packets == NULL) { + txcounters->tx_packets = p_copy; + } else { + pbuf_cat(txcounters->tx_packets, p_copy); + } + } + return ERR_OK; +} + +void test_tcp_init_netif(struct netif *netif, struct test_tcp_txcounters *txcounters, + ip_addr_t *ip_addr, ip_addr_t *netmask) +{ + struct netif *n; + memset(netif, 0, sizeof(struct netif)); + memset(txcounters, 0, sizeof(struct test_tcp_txcounters)); + netif->output = test_tcp_netif_output; + netif->state = txcounters; + netif->flags |= NETIF_FLAG_UP; + ip_addr_copy(netif->netmask, *netmask); + ip_addr_copy(netif->ip_addr, *ip_addr); + for (n = netif_list; n != NULL; n = n->next) { + if (n == netif) { + return; + } + } + netif->next = NULL; + netif_list = netif; +} diff --git a/third_party/lwip-1.4.1/test/unit/tcp/tcp_helper.h b/third_party/lwip-1.4.1/test/unit/tcp/tcp_helper.h new file mode 100644 index 0000000..152a990 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/tcp/tcp_helper.h @@ -0,0 +1,52 @@ +#ifndef __TCP_HELPER_H__ +#define __TCP_HELPER_H__ + +#include "../lwip_check.h" +#include "lwip/arch.h" +#include "lwip/tcp.h" +#include "lwip/netif.h" + +/* counters used for test_tcp_counters_* callback functions */ +struct test_tcp_counters { + u32_t recv_calls; + u32_t recved_bytes; + u32_t recv_calls_after_close; + u32_t recved_bytes_after_close; + u32_t close_calls; + u32_t err_calls; + err_t last_err; + char* expected_data; + u32_t expected_data_len; +}; + +struct test_tcp_txcounters { + u32_t num_tx_calls; + u32_t num_tx_bytes; + u8_t copy_tx_packets; + struct pbuf *tx_packets; +}; + +/* Helper functions */ +void tcp_remove_all(void); + +struct pbuf* tcp_create_segment(ip_addr_t* src_ip, ip_addr_t* dst_ip, + u16_t src_port, u16_t dst_port, void* data, size_t data_len, + u32_t seqno, u32_t ackno, u8_t headerflags); +struct pbuf* tcp_create_rx_segment(struct tcp_pcb* pcb, void* data, size_t data_len, + u32_t seqno_offset, u32_t ackno_offset, u8_t headerflags); +struct pbuf* tcp_create_rx_segment_wnd(struct tcp_pcb* pcb, void* data, size_t data_len, + u32_t seqno_offset, u32_t ackno_offset, u8_t headerflags, u16_t wnd); +void tcp_set_state(struct tcp_pcb* pcb, enum tcp_state state, ip_addr_t* local_ip, + ip_addr_t* remote_ip, u16_t local_port, u16_t remote_port); +void test_tcp_counters_err(void* arg, err_t err); +err_t test_tcp_counters_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err); + +struct tcp_pcb* test_tcp_new_counters_pcb(struct test_tcp_counters* counters); + +void test_tcp_input(struct pbuf *p, struct netif *inp); + +void test_tcp_init_netif(struct netif *netif, struct test_tcp_txcounters *txcounters, + ip_addr_t *ip_addr, ip_addr_t *netmask); + + +#endif diff --git a/third_party/lwip-1.4.1/test/unit/tcp/test_tcp.c b/third_party/lwip-1.4.1/test/unit/tcp/test_tcp.c new file mode 100644 index 0000000..bcc98e2 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/tcp/test_tcp.c @@ -0,0 +1,667 @@ +#include "test_tcp.h" + +#include "lwip/tcp_impl.h" +#include "lwip/stats.h" +#include "tcp_helper.h" + +#ifdef _MSC_VER +#pragma warning(disable: 4307) /* we explicitly wrap around TCP seqnos */ +#endif + +#if !LWIP_STATS || !TCP_STATS || !MEMP_STATS +#error "This tests needs TCP- and MEMP-statistics enabled" +#endif +#if TCP_SND_BUF <= TCP_WND +#error "This tests needs TCP_SND_BUF to be > TCP_WND" +#endif + +static u8_t test_tcp_timer; + +/* our own version of tcp_tmr so we can reset fast/slow timer state */ +static void +test_tcp_tmr(void) +{ + tcp_fasttmr(); + if (++test_tcp_timer & 1) { + tcp_slowtmr(); + } +} + +/* Setups/teardown functions */ + +static void +tcp_setup(void) +{ + /* reset iss to default (6510) */ + tcp_ticks = 0; + tcp_ticks = 0 - (tcp_next_iss() - 6510); + tcp_next_iss(); + tcp_ticks = 0; + + test_tcp_timer = 0; + tcp_remove_all(); +} + +static void +tcp_teardown(void) +{ + netif_list = NULL; + tcp_remove_all(); +} + + +/* Test functions */ + +/** Call tcp_new() and tcp_abort() and test memp stats */ +START_TEST(test_tcp_new_abort) +{ + struct tcp_pcb* pcb; + LWIP_UNUSED_ARG(_i); + + fail_unless(lwip_stats.memp[MEMP_TCP_PCB].used == 0); + + pcb = tcp_new(); + fail_unless(pcb != NULL); + if (pcb != NULL) { + fail_unless(lwip_stats.memp[MEMP_TCP_PCB].used == 1); + tcp_abort(pcb); + fail_unless(lwip_stats.memp[MEMP_TCP_PCB].used == 0); + } +} +END_TEST + +/** Create an ESTABLISHED pcb and check if receive callback is called */ +START_TEST(test_tcp_recv_inseq) +{ + struct test_tcp_counters counters; + struct tcp_pcb* pcb; + struct pbuf* p; + char data[] = {1, 2, 3, 4}; + ip_addr_t remote_ip, local_ip; + u16_t data_len; + u16_t remote_port = 0x100, local_port = 0x101; + struct netif netif; + LWIP_UNUSED_ARG(_i); + + /* initialize local vars */ + memset(&netif, 0, sizeof(netif)); + IP4_ADDR(&local_ip, 192, 168, 1, 1); + IP4_ADDR(&remote_ip, 192, 168, 1, 2); + data_len = sizeof(data); + /* initialize counter struct */ + memset(&counters, 0, sizeof(counters)); + counters.expected_data_len = data_len; + counters.expected_data = data; + + /* create and initialize the pcb */ + pcb = test_tcp_new_counters_pcb(&counters); + EXPECT_RET(pcb != NULL); + tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); + + /* create a segment */ + p = tcp_create_rx_segment(pcb, counters.expected_data, data_len, 0, 0, 0); + EXPECT(p != NULL); + if (p != NULL) { + /* pass the segment to tcp_input */ + test_tcp_input(p, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 1); + EXPECT(counters.recved_bytes == data_len); + EXPECT(counters.err_calls == 0); + } + + /* make sure the pcb is freed */ + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); + tcp_abort(pcb); + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); +} +END_TEST + +/** Provoke fast retransmission by duplicate ACKs and then recover by ACKing all sent data. + * At the end, send more data. */ +START_TEST(test_tcp_fast_retx_recover) +{ + struct netif netif; + struct test_tcp_txcounters txcounters; + struct test_tcp_counters counters; + struct tcp_pcb* pcb; + struct pbuf* p; + char data1[] = { 1, 2, 3, 4}; + char data2[] = { 5, 6, 7, 8}; + char data3[] = { 9, 10, 11, 12}; + char data4[] = {13, 14, 15, 16}; + char data5[] = {17, 18, 19, 20}; + char data6[] = {21, 22, 23, 24}; + ip_addr_t remote_ip, local_ip, netmask; + u16_t remote_port = 0x100, local_port = 0x101; + err_t err; + LWIP_UNUSED_ARG(_i); + + /* initialize local vars */ + IP4_ADDR(&local_ip, 192, 168, 1, 1); + IP4_ADDR(&remote_ip, 192, 168, 1, 2); + IP4_ADDR(&netmask, 255, 255, 255, 0); + test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask); + memset(&counters, 0, sizeof(counters)); + + /* create and initialize the pcb */ + pcb = test_tcp_new_counters_pcb(&counters); + EXPECT_RET(pcb != NULL); + tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); + pcb->mss = TCP_MSS; + /* disable initial congestion window (we don't send a SYN here...) */ + pcb->cwnd = pcb->snd_wnd; + + /* send data1 */ + err = tcp_write(pcb, data1, sizeof(data1), TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + EXPECT_RET(txcounters.num_tx_calls == 1); + EXPECT_RET(txcounters.num_tx_bytes == sizeof(data1) + sizeof(struct tcp_hdr) + sizeof(struct ip_hdr)); + memset(&txcounters, 0, sizeof(txcounters)); + /* "recv" ACK for data1 */ + p = tcp_create_rx_segment(pcb, NULL, 0, 0, 4, TCP_ACK); + EXPECT_RET(p != NULL); + test_tcp_input(p, &netif); + EXPECT_RET(txcounters.num_tx_calls == 0); + EXPECT_RET(pcb->unacked == NULL); + /* send data2 */ + err = tcp_write(pcb, data2, sizeof(data2), TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + EXPECT_RET(txcounters.num_tx_calls == 1); + EXPECT_RET(txcounters.num_tx_bytes == sizeof(data2) + sizeof(struct tcp_hdr) + sizeof(struct ip_hdr)); + memset(&txcounters, 0, sizeof(txcounters)); + /* duplicate ACK for data1 (data2 is lost) */ + p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); + EXPECT_RET(p != NULL); + test_tcp_input(p, &netif); + EXPECT_RET(txcounters.num_tx_calls == 0); + EXPECT_RET(pcb->dupacks == 1); + /* send data3 */ + err = tcp_write(pcb, data3, sizeof(data3), TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + /* nagle enabled, no tx calls */ + EXPECT_RET(txcounters.num_tx_calls == 0); + EXPECT_RET(txcounters.num_tx_bytes == 0); + memset(&txcounters, 0, sizeof(txcounters)); + /* 2nd duplicate ACK for data1 (data2 and data3 are lost) */ + p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); + EXPECT_RET(p != NULL); + test_tcp_input(p, &netif); + EXPECT_RET(txcounters.num_tx_calls == 0); + EXPECT_RET(pcb->dupacks == 2); + /* queue data4, don't send it (unsent-oversize is != 0) */ + err = tcp_write(pcb, data4, sizeof(data4), TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + /* 3nd duplicate ACK for data1 (data2 and data3 are lost) -> fast retransmission */ + p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); + EXPECT_RET(p != NULL); + test_tcp_input(p, &netif); + /*EXPECT_RET(txcounters.num_tx_calls == 1);*/ + EXPECT_RET(pcb->dupacks == 3); + memset(&txcounters, 0, sizeof(txcounters)); + /* TODO: check expected data?*/ + + /* send data5, not output yet */ + err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + /*err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK);*/ + EXPECT_RET(txcounters.num_tx_calls == 0); + EXPECT_RET(txcounters.num_tx_bytes == 0); + memset(&txcounters, 0, sizeof(txcounters)); + { + int i = 0; + do + { + err = tcp_write(pcb, data6, TCP_MSS, TCP_WRITE_FLAG_COPY); + i++; + }while(err == ERR_OK); + EXPECT_RET(err != ERR_OK); + } + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + /*EXPECT_RET(txcounters.num_tx_calls == 0); + EXPECT_RET(txcounters.num_tx_bytes == 0);*/ + memset(&txcounters, 0, sizeof(txcounters)); + + /* send even more data */ + err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + /* ...and even more data */ + err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + /* ...and even more data */ + err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + /* ...and even more data */ + err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + + /* send ACKs for data2 and data3 */ + p = tcp_create_rx_segment(pcb, NULL, 0, 0, 12, TCP_ACK); + EXPECT_RET(p != NULL); + test_tcp_input(p, &netif); + /*EXPECT_RET(txcounters.num_tx_calls == 0);*/ + + /* ...and even more data */ + err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + /* ...and even more data */ + err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + +#if 0 + /* create expected segment */ + p1 = tcp_create_rx_segment(pcb, counters.expected_data, data_len, 0, 0, 0); + EXPECT_RET(p != NULL); + if (p != NULL) { + /* pass the segment to tcp_input */ + test_tcp_input(p, &netif); + /* check if counters are as expected */ + EXPECT_RET(counters.close_calls == 0); + EXPECT_RET(counters.recv_calls == 1); + EXPECT_RET(counters.recved_bytes == data_len); + EXPECT_RET(counters.err_calls == 0); + } +#endif + /* make sure the pcb is freed */ + EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 1); + tcp_abort(pcb); + EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 0); +} +END_TEST + +static u8_t tx_data[TCP_WND*2]; + +static void +check_seqnos(struct tcp_seg *segs, int num_expected, u32_t *seqnos_expected) +{ + struct tcp_seg *s = segs; + int i; + for (i = 0; i < num_expected; i++, s = s->next) { + EXPECT_RET(s != NULL); + EXPECT(s->tcphdr->seqno == htonl(seqnos_expected[i])); + } + EXPECT(s == NULL); +} + +/** Send data with sequence numbers that wrap around the u32_t range. + * Then, provoke fast retransmission by duplicate ACKs and check that all + * segment lists are still properly sorted. */ +START_TEST(test_tcp_fast_rexmit_wraparound) +{ + struct netif netif; + struct test_tcp_txcounters txcounters; + struct test_tcp_counters counters; + struct tcp_pcb* pcb; + struct pbuf* p; + ip_addr_t remote_ip, local_ip, netmask; + u16_t remote_port = 0x100, local_port = 0x101; + err_t err; +#define SEQNO1 (0xFFFFFF00 - TCP_MSS) +#define ISS 6510 + u16_t i, sent_total = 0; + u32_t seqnos[] = { + SEQNO1, + SEQNO1 + (1 * TCP_MSS), + SEQNO1 + (2 * TCP_MSS), + SEQNO1 + (3 * TCP_MSS), + SEQNO1 + (4 * TCP_MSS), + SEQNO1 + (5 * TCP_MSS)}; + LWIP_UNUSED_ARG(_i); + + for (i = 0; i < sizeof(tx_data); i++) { + tx_data[i] = (u8_t)i; + } + + /* initialize local vars */ + IP4_ADDR(&local_ip, 192, 168, 1, 1); + IP4_ADDR(&remote_ip, 192, 168, 1, 2); + IP4_ADDR(&netmask, 255, 255, 255, 0); + test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask); + memset(&counters, 0, sizeof(counters)); + + /* create and initialize the pcb */ + tcp_ticks = SEQNO1 - ISS; + pcb = test_tcp_new_counters_pcb(&counters); + EXPECT_RET(pcb != NULL); + EXPECT(pcb->lastack == SEQNO1); + tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); + pcb->mss = TCP_MSS; + /* disable initial congestion window (we don't send a SYN here...) */ + pcb->cwnd = 2*TCP_MSS; + + /* send 6 mss-sized segments */ + for (i = 0; i < 6; i++) { + err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + sent_total += TCP_MSS; + } + check_seqnos(pcb->unsent, 6, seqnos); + EXPECT(pcb->unacked == NULL); + err = tcp_output(pcb); + EXPECT(txcounters.num_tx_calls == 2); + EXPECT(txcounters.num_tx_bytes == 2 * (TCP_MSS + 40U)); + memset(&txcounters, 0, sizeof(txcounters)); + + check_seqnos(pcb->unacked, 2, seqnos); + check_seqnos(pcb->unsent, 4, &seqnos[2]); + + /* ACK the first segment */ + p = tcp_create_rx_segment(pcb, NULL, 0, 0, TCP_MSS, TCP_ACK); + test_tcp_input(p, &netif); + /* ensure this didn't trigger a retransmission */ + EXPECT(txcounters.num_tx_calls == 1); + EXPECT(txcounters.num_tx_bytes == TCP_MSS + 40U); + memset(&txcounters, 0, sizeof(txcounters)); + check_seqnos(pcb->unacked, 2, &seqnos[1]); + check_seqnos(pcb->unsent, 3, &seqnos[3]); + + /* 3 dupacks */ + EXPECT(pcb->dupacks == 0); + p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); + test_tcp_input(p, &netif); + EXPECT(txcounters.num_tx_calls == 0); + EXPECT(pcb->dupacks == 1); + p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); + test_tcp_input(p, &netif); + EXPECT(txcounters.num_tx_calls == 0); + EXPECT(pcb->dupacks == 2); + /* 3rd dupack -> fast rexmit */ + p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); + test_tcp_input(p, &netif); + EXPECT(pcb->dupacks == 3); + EXPECT(txcounters.num_tx_calls == 4); + memset(&txcounters, 0, sizeof(txcounters)); + EXPECT(pcb->unsent == NULL); + check_seqnos(pcb->unacked, 5, &seqnos[1]); + + /* make sure the pcb is freed */ + EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 1); + tcp_abort(pcb); + EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 0); +} +END_TEST + +/** Send data with sequence numbers that wrap around the u32_t range. + * Then, provoke RTO retransmission and check that all + * segment lists are still properly sorted. */ +START_TEST(test_tcp_rto_rexmit_wraparound) +{ + struct netif netif; + struct test_tcp_txcounters txcounters; + struct test_tcp_counters counters; + struct tcp_pcb* pcb; + ip_addr_t remote_ip, local_ip, netmask; + u16_t remote_port = 0x100, local_port = 0x101; + err_t err; +#define SEQNO1 (0xFFFFFF00 - TCP_MSS) +#define ISS 6510 + u16_t i, sent_total = 0; + u32_t seqnos[] = { + SEQNO1, + SEQNO1 + (1 * TCP_MSS), + SEQNO1 + (2 * TCP_MSS), + SEQNO1 + (3 * TCP_MSS), + SEQNO1 + (4 * TCP_MSS), + SEQNO1 + (5 * TCP_MSS)}; + LWIP_UNUSED_ARG(_i); + + for (i = 0; i < sizeof(tx_data); i++) { + tx_data[i] = (u8_t)i; + } + + /* initialize local vars */ + IP4_ADDR(&local_ip, 192, 168, 1, 1); + IP4_ADDR(&remote_ip, 192, 168, 1, 2); + IP4_ADDR(&netmask, 255, 255, 255, 0); + test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask); + memset(&counters, 0, sizeof(counters)); + + /* create and initialize the pcb */ + tcp_ticks = 0; + tcp_ticks = 0 - tcp_next_iss(); + tcp_ticks = SEQNO1 - tcp_next_iss(); + pcb = test_tcp_new_counters_pcb(&counters); + EXPECT_RET(pcb != NULL); + EXPECT(pcb->lastack == SEQNO1); + tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); + pcb->mss = TCP_MSS; + /* disable initial congestion window (we don't send a SYN here...) */ + pcb->cwnd = 2*TCP_MSS; + + /* send 6 mss-sized segments */ + for (i = 0; i < 6; i++) { + err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + sent_total += TCP_MSS; + } + check_seqnos(pcb->unsent, 6, seqnos); + EXPECT(pcb->unacked == NULL); + err = tcp_output(pcb); + EXPECT(txcounters.num_tx_calls == 2); + EXPECT(txcounters.num_tx_bytes == 2 * (TCP_MSS + 40U)); + memset(&txcounters, 0, sizeof(txcounters)); + + check_seqnos(pcb->unacked, 2, seqnos); + check_seqnos(pcb->unsent, 4, &seqnos[2]); + + /* call the tcp timer some times */ + for (i = 0; i < 10; i++) { + test_tcp_tmr(); + EXPECT(txcounters.num_tx_calls == 0); + } + /* 11th call to tcp_tmr: RTO rexmit fires */ + test_tcp_tmr(); + EXPECT(txcounters.num_tx_calls == 1); + check_seqnos(pcb->unacked, 1, seqnos); + check_seqnos(pcb->unsent, 5, &seqnos[1]); + + /* fake greater cwnd */ + pcb->cwnd = pcb->snd_wnd; + /* send more data */ + err = tcp_output(pcb); + EXPECT(err == ERR_OK); + /* check queues are sorted */ + EXPECT(pcb->unsent == NULL); + check_seqnos(pcb->unacked, 6, seqnos); + + /* make sure the pcb is freed */ + EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 1); + tcp_abort(pcb); + EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 0); +} +END_TEST + +/** Provoke fast retransmission by duplicate ACKs and then recover by ACKing all sent data. + * At the end, send more data. */ +static void test_tcp_tx_full_window_lost(u8_t zero_window_probe_from_unsent) +{ + struct netif netif; + struct test_tcp_txcounters txcounters; + struct test_tcp_counters counters; + struct tcp_pcb* pcb; + struct pbuf *p; + ip_addr_t remote_ip, local_ip, netmask; + u16_t remote_port = 0x100, local_port = 0x101; + err_t err; + u16_t sent_total, i; + u8_t expected = 0xFE; + + for (i = 0; i < sizeof(tx_data); i++) { + u8_t d = (u8_t)i; + if (d == 0xFE) { + d = 0xF0; + } + tx_data[i] = d; + } + if (zero_window_probe_from_unsent) { + tx_data[TCP_WND] = expected; + } else { + tx_data[0] = expected; + } + + /* initialize local vars */ + IP4_ADDR(&local_ip, 192, 168, 1, 1); + IP4_ADDR(&remote_ip, 192, 168, 1, 2); + IP4_ADDR(&netmask, 255, 255, 255, 0); + test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask); + memset(&counters, 0, sizeof(counters)); + memset(&txcounters, 0, sizeof(txcounters)); + + /* create and initialize the pcb */ + pcb = test_tcp_new_counters_pcb(&counters); + EXPECT_RET(pcb != NULL); + tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); + pcb->mss = TCP_MSS; + /* disable initial congestion window (we don't send a SYN here...) */ + pcb->cwnd = pcb->snd_wnd; + + /* send a full window (minus 1 packets) of TCP data in MSS-sized chunks */ + sent_total = 0; + if ((TCP_WND - TCP_MSS) % TCP_MSS != 0) { + u16_t initial_data_len = (TCP_WND - TCP_MSS) % TCP_MSS; + err = tcp_write(pcb, &tx_data[sent_total], initial_data_len, TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + EXPECT(txcounters.num_tx_calls == 1); + EXPECT(txcounters.num_tx_bytes == initial_data_len + 40U); + memset(&txcounters, 0, sizeof(txcounters)); + sent_total += initial_data_len; + } + for (; sent_total < (TCP_WND - TCP_MSS); sent_total += TCP_MSS) { + err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + EXPECT(txcounters.num_tx_calls == 1); + EXPECT(txcounters.num_tx_bytes == TCP_MSS + 40U); + memset(&txcounters, 0, sizeof(txcounters)); + } + EXPECT(sent_total == (TCP_WND - TCP_MSS)); + + /* now ACK the packet before the first */ + p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK); + test_tcp_input(p, &netif); + /* ensure this didn't trigger a retransmission */ + EXPECT(txcounters.num_tx_calls == 0); + EXPECT(txcounters.num_tx_bytes == 0); + + EXPECT(pcb->persist_backoff == 0); + /* send the last packet, now a complete window has been sent */ + err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY); + sent_total += TCP_MSS; + EXPECT_RET(err == ERR_OK); + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + EXPECT(txcounters.num_tx_calls == 1); + EXPECT(txcounters.num_tx_bytes == TCP_MSS + 40U); + memset(&txcounters, 0, sizeof(txcounters)); + EXPECT(pcb->persist_backoff == 0); + + if (zero_window_probe_from_unsent) { + /* ACK all data but close the TX window */ + p = tcp_create_rx_segment_wnd(pcb, NULL, 0, 0, TCP_WND, TCP_ACK, 0); + test_tcp_input(p, &netif); + /* ensure this didn't trigger any transmission */ + EXPECT(txcounters.num_tx_calls == 0); + EXPECT(txcounters.num_tx_bytes == 0); + EXPECT(pcb->persist_backoff == 1); + } + + /* send one byte more (out of window) -> persist timer starts */ + err = tcp_write(pcb, &tx_data[sent_total], 1, TCP_WRITE_FLAG_COPY); + EXPECT_RET(err == ERR_OK); + err = tcp_output(pcb); + EXPECT_RET(err == ERR_OK); + EXPECT(txcounters.num_tx_calls == 0); + EXPECT(txcounters.num_tx_bytes == 0); + memset(&txcounters, 0, sizeof(txcounters)); + if (!zero_window_probe_from_unsent) { + /* no persist timer unless a zero window announcement has been received */ + EXPECT(pcb->persist_backoff == 0); + } else { + EXPECT(pcb->persist_backoff == 1); + + /* call tcp_timer some more times to let persist timer count up */ + for (i = 0; i < 4; i++) { + test_tcp_tmr(); + EXPECT(txcounters.num_tx_calls == 0); + EXPECT(txcounters.num_tx_bytes == 0); + } + + /* this should trigger the zero-window-probe */ + txcounters.copy_tx_packets = 1; + test_tcp_tmr(); + txcounters.copy_tx_packets = 0; + EXPECT(txcounters.num_tx_calls == 1); + EXPECT(txcounters.num_tx_bytes == 1 + 40U); + EXPECT(txcounters.tx_packets != NULL); + if (txcounters.tx_packets != NULL) { + u8_t sent; + u16_t ret; + ret = pbuf_copy_partial(txcounters.tx_packets, &sent, 1, 40U); + EXPECT(ret == 1); + EXPECT(sent == expected); + } + if (txcounters.tx_packets != NULL) { + pbuf_free(txcounters.tx_packets); + txcounters.tx_packets = NULL; + } + } + + /* make sure the pcb is freed */ + EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 1); + tcp_abort(pcb); + EXPECT_RET(lwip_stats.memp[MEMP_TCP_PCB].used == 0); +} + +START_TEST(test_tcp_tx_full_window_lost_from_unsent) +{ + LWIP_UNUSED_ARG(_i); + test_tcp_tx_full_window_lost(1); +} +END_TEST + +START_TEST(test_tcp_tx_full_window_lost_from_unacked) +{ + LWIP_UNUSED_ARG(_i); + test_tcp_tx_full_window_lost(0); +} +END_TEST + +/** Create the suite including all tests for this module */ +Suite * +tcp_suite(void) +{ + TFun tests[] = { + test_tcp_new_abort, + test_tcp_recv_inseq, + test_tcp_fast_retx_recover, + test_tcp_fast_rexmit_wraparound, + test_tcp_rto_rexmit_wraparound, + test_tcp_tx_full_window_lost_from_unacked, + test_tcp_tx_full_window_lost_from_unsent + }; + return create_suite("TCP", tests, sizeof(tests)/sizeof(TFun), tcp_setup, tcp_teardown); +} diff --git a/third_party/lwip-1.4.1/test/unit/tcp/test_tcp.h b/third_party/lwip-1.4.1/test/unit/tcp/test_tcp.h new file mode 100644 index 0000000..98046c9 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/tcp/test_tcp.h @@ -0,0 +1,8 @@ +#ifndef __TEST_TCP_H__ +#define __TEST_TCP_H__ + +#include "../lwip_check.h" + +Suite *tcp_suite(void); + +#endif diff --git a/third_party/lwip-1.4.1/test/unit/tcp/test_tcp_oos.c b/third_party/lwip-1.4.1/test/unit/tcp/test_tcp_oos.c new file mode 100644 index 0000000..9aa2e2e --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/tcp/test_tcp_oos.c @@ -0,0 +1,944 @@ +#include "test_tcp_oos.h" + +#include "lwip/tcp_impl.h" +#include "lwip/stats.h" +#include "tcp_helper.h" + +#if !LWIP_STATS || !TCP_STATS || !MEMP_STATS +#error "This tests needs TCP- and MEMP-statistics enabled" +#endif +#if !TCP_QUEUE_OOSEQ +#error "This tests needs TCP_QUEUE_OOSEQ enabled" +#endif + +/** CHECK_SEGMENTS_ON_OOSEQ: + * 1: check count, seqno and len of segments on pcb->ooseq (strict) + * 0: only check that bytes are received in correct order (less strict) */ +#define CHECK_SEGMENTS_ON_OOSEQ 1 + +#if CHECK_SEGMENTS_ON_OOSEQ +#define EXPECT_OOSEQ(x) EXPECT(x) +#else +#define EXPECT_OOSEQ(x) +#endif + +/* helper functions */ + +/** Get the numbers of segments on the ooseq list */ +static int tcp_oos_count(struct tcp_pcb* pcb) +{ + int num = 0; + struct tcp_seg* seg = pcb->ooseq; + while(seg != NULL) { + num++; + seg = seg->next; + } + return num; +} + +/** Get the numbers of pbufs on the ooseq list */ +static int tcp_oos_pbuf_count(struct tcp_pcb* pcb) +{ + int num = 0; + struct tcp_seg* seg = pcb->ooseq; + while(seg != NULL) { + num += pbuf_clen(seg->p); + seg = seg->next; + } + return num; +} + +/** Get the seqno of a segment (by index) on the ooseq list + * + * @param pcb the pcb to check for ooseq segments + * @param seg_index index of the segment on the ooseq list + * @return seqno of the segment + */ +static u32_t +tcp_oos_seg_seqno(struct tcp_pcb* pcb, int seg_index) +{ + int num = 0; + struct tcp_seg* seg = pcb->ooseq; + + /* then check the actual segment */ + while(seg != NULL) { + if(num == seg_index) { + return seg->tcphdr->seqno; + } + num++; + seg = seg->next; + } + fail(); + return 0; +} + +/** Get the tcplen (datalen + SYN/FIN) of a segment (by index) on the ooseq list + * + * @param pcb the pcb to check for ooseq segments + * @param seg_index index of the segment on the ooseq list + * @return tcplen of the segment + */ +static int +tcp_oos_seg_tcplen(struct tcp_pcb* pcb, int seg_index) +{ + int num = 0; + struct tcp_seg* seg = pcb->ooseq; + + /* then check the actual segment */ + while(seg != NULL) { + if(num == seg_index) { + return TCP_TCPLEN(seg); + } + num++; + seg = seg->next; + } + fail(); + return -1; +} + +/** Get the tcplen (datalen + SYN/FIN) of all segments on the ooseq list + * + * @param pcb the pcb to check for ooseq segments + * @return tcplen of all segment + */ +static int +tcp_oos_tcplen(struct tcp_pcb* pcb) +{ + int len = 0; + struct tcp_seg* seg = pcb->ooseq; + + /* then check the actual segment */ + while(seg != NULL) { + len += TCP_TCPLEN(seg); + seg = seg->next; + } + return len; +} + +/* Setup/teardown functions */ + +static void +tcp_oos_setup(void) +{ + tcp_remove_all(); +} + +static void +tcp_oos_teardown(void) +{ + tcp_remove_all(); +} + + + +/* Test functions */ + +/** create multiple segments and pass them to tcp_input in a wrong + * order to see if ooseq-caching works correctly + * FIN is received in out-of-sequence segments only */ +START_TEST(test_tcp_recv_ooseq_FIN_OOSEQ) +{ + struct test_tcp_counters counters; + struct tcp_pcb* pcb; + struct pbuf *p_8_9, *p_4_8, *p_4_10, *p_2_14, *p_fin, *pinseq; + char data[] = { + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16}; + ip_addr_t remote_ip, local_ip; + u16_t data_len; + u16_t remote_port = 0x100, local_port = 0x101; + struct netif netif; + LWIP_UNUSED_ARG(_i); + + /* initialize local vars */ + memset(&netif, 0, sizeof(netif)); + IP4_ADDR(&local_ip, 192, 168, 1, 1); + IP4_ADDR(&remote_ip, 192, 168, 1, 2); + data_len = sizeof(data); + /* initialize counter struct */ + memset(&counters, 0, sizeof(counters)); + counters.expected_data_len = data_len; + counters.expected_data = data; + + /* create and initialize the pcb */ + pcb = test_tcp_new_counters_pcb(&counters); + EXPECT_RET(pcb != NULL); + tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); + + /* create segments */ + /* pinseq is sent as last segment! */ + pinseq = tcp_create_rx_segment(pcb, &data[0], 4, 0, 0, TCP_ACK); + /* p1: 8 bytes before FIN */ + /* seqno: 8..16 */ + p_8_9 = tcp_create_rx_segment(pcb, &data[8], 8, 8, 0, TCP_ACK|TCP_FIN); + /* p2: 4 bytes before p1, including the first 4 bytes of p1 (partly duplicate) */ + /* seqno: 4..11 */ + p_4_8 = tcp_create_rx_segment(pcb, &data[4], 8, 4, 0, TCP_ACK); + /* p3: same as p2 but 2 bytes longer */ + /* seqno: 4..13 */ + p_4_10 = tcp_create_rx_segment(pcb, &data[4], 10, 4, 0, TCP_ACK); + /* p4: 14 bytes before FIN, includes data from p1 and p2, plus partly from pinseq */ + /* seqno: 2..15 */ + p_2_14 = tcp_create_rx_segment(pcb, &data[2], 14, 2, 0, TCP_ACK); + /* FIN, seqno 16 */ + p_fin = tcp_create_rx_segment(pcb, NULL, 0,16, 0, TCP_ACK|TCP_FIN); + EXPECT(pinseq != NULL); + EXPECT(p_8_9 != NULL); + EXPECT(p_4_8 != NULL); + EXPECT(p_4_10 != NULL); + EXPECT(p_2_14 != NULL); + EXPECT(p_fin != NULL); + if ((pinseq != NULL) && (p_8_9 != NULL) && (p_4_8 != NULL) && (p_4_10 != NULL) && (p_2_14 != NULL) && (p_fin != NULL)) { + /* pass the segment to tcp_input */ + test_tcp_input(p_8_9, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* check ooseq queue */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 8); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 9); /* includes FIN */ + + /* pass the segment to tcp_input */ + test_tcp_input(p_4_8, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* check ooseq queue */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 4); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 4); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 8); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 9); /* includes FIN */ + + /* pass the segment to tcp_input */ + test_tcp_input(p_4_10, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* ooseq queue: unchanged */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 4); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 4); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 8); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 9); /* includes FIN */ + + /* pass the segment to tcp_input */ + test_tcp_input(p_2_14, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* check ooseq queue */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 2); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 15); /* includes FIN */ + + /* pass the segment to tcp_input */ + test_tcp_input(p_fin, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* ooseq queue: unchanged */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 2); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 15); /* includes FIN */ + + /* pass the segment to tcp_input */ + test_tcp_input(pinseq, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 1); + EXPECT(counters.recv_calls == 1); + EXPECT(counters.recved_bytes == data_len); + EXPECT(counters.err_calls == 0); + EXPECT(pcb->ooseq == NULL); + } + + /* make sure the pcb is freed */ + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); + tcp_abort(pcb); + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); +} +END_TEST + + +/** create multiple segments and pass them to tcp_input in a wrong + * order to see if ooseq-caching works correctly + * FIN is received IN-SEQUENCE at the end */ +START_TEST(test_tcp_recv_ooseq_FIN_INSEQ) +{ + struct test_tcp_counters counters; + struct tcp_pcb* pcb; + struct pbuf *p_1_2, *p_4_8, *p_3_11, *p_2_12, *p_15_1, *p_15_1a, *pinseq, *pinseqFIN; + char data[] = { + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16}; + ip_addr_t remote_ip, local_ip; + u16_t data_len; + u16_t remote_port = 0x100, local_port = 0x101; + struct netif netif; + LWIP_UNUSED_ARG(_i); + + /* initialize local vars */ + memset(&netif, 0, sizeof(netif)); + IP4_ADDR(&local_ip, 192, 168, 1, 1); + IP4_ADDR(&remote_ip, 192, 168, 1, 2); + data_len = sizeof(data); + /* initialize counter struct */ + memset(&counters, 0, sizeof(counters)); + counters.expected_data_len = data_len; + counters.expected_data = data; + + /* create and initialize the pcb */ + pcb = test_tcp_new_counters_pcb(&counters); + EXPECT_RET(pcb != NULL); + tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); + + /* create segments */ + /* p1: 7 bytes - 2 before FIN */ + /* seqno: 1..2 */ + p_1_2 = tcp_create_rx_segment(pcb, &data[1], 2, 1, 0, TCP_ACK); + /* p2: 4 bytes before p1, including the first 4 bytes of p1 (partly duplicate) */ + /* seqno: 4..11 */ + p_4_8 = tcp_create_rx_segment(pcb, &data[4], 8, 4, 0, TCP_ACK); + /* p3: same as p2 but 2 bytes longer and one byte more at the front */ + /* seqno: 3..13 */ + p_3_11 = tcp_create_rx_segment(pcb, &data[3], 11, 3, 0, TCP_ACK); + /* p4: 13 bytes - 2 before FIN - should be ignored as contained in p1 and p3 */ + /* seqno: 2..13 */ + p_2_12 = tcp_create_rx_segment(pcb, &data[2], 12, 2, 0, TCP_ACK); + /* pinseq is the first segment that is held back to create ooseq! */ + /* seqno: 0..3 */ + pinseq = tcp_create_rx_segment(pcb, &data[0], 4, 0, 0, TCP_ACK); + /* p5: last byte before FIN */ + /* seqno: 15 */ + p_15_1 = tcp_create_rx_segment(pcb, &data[15], 1, 15, 0, TCP_ACK); + /* p6: same as p5, should be ignored */ + p_15_1a= tcp_create_rx_segment(pcb, &data[15], 1, 15, 0, TCP_ACK); + /* pinseqFIN: last 2 bytes plus FIN */ + /* only segment containing seqno 14 and FIN */ + pinseqFIN = tcp_create_rx_segment(pcb, &data[14], 2, 14, 0, TCP_ACK|TCP_FIN); + EXPECT(pinseq != NULL); + EXPECT(p_1_2 != NULL); + EXPECT(p_4_8 != NULL); + EXPECT(p_3_11 != NULL); + EXPECT(p_2_12 != NULL); + EXPECT(p_15_1 != NULL); + EXPECT(p_15_1a != NULL); + EXPECT(pinseqFIN != NULL); + if ((pinseq != NULL) && (p_1_2 != NULL) && (p_4_8 != NULL) && (p_3_11 != NULL) && (p_2_12 != NULL) + && (p_15_1 != NULL) && (p_15_1a != NULL) && (pinseqFIN != NULL)) { + /* pass the segment to tcp_input */ + test_tcp_input(p_1_2, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* check ooseq queue */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 2); + + /* pass the segment to tcp_input */ + test_tcp_input(p_4_8, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* check ooseq queue */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 2); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 4); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 8); + + /* pass the segment to tcp_input */ + test_tcp_input(p_3_11, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* check ooseq queue */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 2); + /* p_3_11 has removed p_4_8 from ooseq */ + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 3); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 11); + + /* pass the segment to tcp_input */ + test_tcp_input(p_2_12, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* check ooseq queue */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == 2); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 1); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 2); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 12); + + /* pass the segment to tcp_input */ + test_tcp_input(pinseq, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 1); + EXPECT(counters.recved_bytes == 14); + EXPECT(counters.err_calls == 0); + EXPECT(pcb->ooseq == NULL); + + /* pass the segment to tcp_input */ + test_tcp_input(p_15_1, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 1); + EXPECT(counters.recved_bytes == 14); + EXPECT(counters.err_calls == 0); + /* check ooseq queue */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 15); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 1); + + /* pass the segment to tcp_input */ + test_tcp_input(p_15_1a, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 1); + EXPECT(counters.recved_bytes == 14); + EXPECT(counters.err_calls == 0); + /* check ooseq queue: unchanged */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == 1); + EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 15); + EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 1); + + /* pass the segment to tcp_input */ + test_tcp_input(pinseqFIN, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 1); + EXPECT(counters.recv_calls == 2); + EXPECT(counters.recved_bytes == data_len); + EXPECT(counters.err_calls == 0); + EXPECT(pcb->ooseq == NULL); + } + + /* make sure the pcb is freed */ + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); + tcp_abort(pcb); + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); +} +END_TEST + +static char data_full_wnd[TCP_WND]; + +/** create multiple segments and pass them to tcp_input with the first segment missing + * to simulate overruning the rxwin with ooseq queueing enabled */ +START_TEST(test_tcp_recv_ooseq_overrun_rxwin) +{ +#if !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS + int i, k; + struct test_tcp_counters counters; + struct tcp_pcb* pcb; + struct pbuf *pinseq, *p_ovr; + ip_addr_t remote_ip, local_ip; + u16_t remote_port = 0x100, local_port = 0x101; + struct netif netif; + int datalen = 0; + int datalen2; + + for(i = 0; i < sizeof(data_full_wnd); i++) { + data_full_wnd[i] = (char)i; + } + + /* initialize local vars */ + memset(&netif, 0, sizeof(netif)); + IP4_ADDR(&local_ip, 192, 168, 1, 1); + IP4_ADDR(&remote_ip, 192, 168, 1, 2); + /* initialize counter struct */ + memset(&counters, 0, sizeof(counters)); + counters.expected_data_len = TCP_WND; + counters.expected_data = data_full_wnd; + + /* create and initialize the pcb */ + pcb = test_tcp_new_counters_pcb(&counters); + EXPECT_RET(pcb != NULL); + tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); + pcb->rcv_nxt = 0x8000; + + /* create segments */ + /* pinseq is sent as last segment! */ + pinseq = tcp_create_rx_segment(pcb, &data_full_wnd[0], TCP_MSS, 0, 0, TCP_ACK); + + for(i = TCP_MSS, k = 0; i < TCP_WND; i += TCP_MSS, k++) { + int count, expected_datalen; + struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)], + TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK); + EXPECT_RET(p != NULL); + /* pass the segment to tcp_input */ + test_tcp_input(p, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* check ooseq queue */ + count = tcp_oos_count(pcb); + EXPECT_OOSEQ(count == k+1); + datalen = tcp_oos_tcplen(pcb); + if (i + TCP_MSS < TCP_WND) { + expected_datalen = (k+1)*TCP_MSS; + } else { + expected_datalen = TCP_WND - TCP_MSS; + } + if (datalen != expected_datalen) { + EXPECT_OOSEQ(datalen == expected_datalen); + } + } + + /* pass in one more segment, cleary overrunning the rxwin */ + p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)], TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK); + EXPECT_RET(p_ovr != NULL); + /* pass the segment to tcp_input */ + test_tcp_input(p_ovr, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* check ooseq queue */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == k); + datalen2 = tcp_oos_tcplen(pcb); + EXPECT_OOSEQ(datalen == datalen2); + + /* now pass inseq */ + test_tcp_input(pinseq, &netif); + EXPECT(pcb->ooseq == NULL); + + /* make sure the pcb is freed */ + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); + tcp_abort(pcb); + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); +#endif /* !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS */ + LWIP_UNUSED_ARG(_i); +} +END_TEST + +START_TEST(test_tcp_recv_ooseq_max_bytes) +{ +#if TCP_OOSEQ_MAX_BYTES && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) + int i, k; + struct test_tcp_counters counters; + struct tcp_pcb* pcb; + struct pbuf *p_ovr; + ip_addr_t remote_ip, local_ip; + u16_t remote_port = 0x100, local_port = 0x101; + struct netif netif; + int datalen = 0; + int datalen2; + + for(i = 0; i < sizeof(data_full_wnd); i++) { + data_full_wnd[i] = (char)i; + } + + /* initialize local vars */ + memset(&netif, 0, sizeof(netif)); + IP4_ADDR(&local_ip, 192, 168, 1, 1); + IP4_ADDR(&remote_ip, 192, 168, 1, 2); + /* initialize counter struct */ + memset(&counters, 0, sizeof(counters)); + counters.expected_data_len = TCP_WND; + counters.expected_data = data_full_wnd; + + /* create and initialize the pcb */ + pcb = test_tcp_new_counters_pcb(&counters); + EXPECT_RET(pcb != NULL); + tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); + pcb->rcv_nxt = 0x8000; + + /* don't 'recv' the first segment (1 byte) so that all other segments will be ooseq */ + + /* create segments and 'recv' them */ + for(k = 1, i = 1; k < TCP_OOSEQ_MAX_BYTES; k += TCP_MSS, i++) { + int count; + struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[k], + TCP_MSS, k, 0, TCP_ACK); + EXPECT_RET(p != NULL); + EXPECT_RET(p->next == NULL); + /* pass the segment to tcp_input */ + test_tcp_input(p, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* check ooseq queue */ + count = tcp_oos_pbuf_count(pcb); + EXPECT_OOSEQ(count == i); + datalen = tcp_oos_tcplen(pcb); + EXPECT_OOSEQ(datalen == (i * TCP_MSS)); + } + + /* pass in one more segment, overrunning the limit */ + p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[k+1], 1, k+1, 0, TCP_ACK); + EXPECT_RET(p_ovr != NULL); + /* pass the segment to tcp_input */ + test_tcp_input(p_ovr, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* check ooseq queue (ensure the new segment was not accepted) */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == (i-1)); + datalen2 = tcp_oos_tcplen(pcb); + EXPECT_OOSEQ(datalen2 == ((i-1) * TCP_MSS)); + + /* make sure the pcb is freed */ + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); + tcp_abort(pcb); + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); +#endif /* TCP_OOSEQ_MAX_BYTES && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) */ + LWIP_UNUSED_ARG(_i); +} +END_TEST + +START_TEST(test_tcp_recv_ooseq_max_pbufs) +{ +#if TCP_OOSEQ_MAX_PBUFS && (TCP_OOSEQ_MAX_PBUFS < ((TCP_WND / TCP_MSS) + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) + int i; + struct test_tcp_counters counters; + struct tcp_pcb* pcb; + struct pbuf *p_ovr; + ip_addr_t remote_ip, local_ip; + u16_t remote_port = 0x100, local_port = 0x101; + struct netif netif; + int datalen = 0; + int datalen2; + + for(i = 0; i < sizeof(data_full_wnd); i++) { + data_full_wnd[i] = (char)i; + } + + /* initialize local vars */ + memset(&netif, 0, sizeof(netif)); + IP4_ADDR(&local_ip, 192, 168, 1, 1); + IP4_ADDR(&remote_ip, 192, 168, 1, 2); + /* initialize counter struct */ + memset(&counters, 0, sizeof(counters)); + counters.expected_data_len = TCP_WND; + counters.expected_data = data_full_wnd; + + /* create and initialize the pcb */ + pcb = test_tcp_new_counters_pcb(&counters); + EXPECT_RET(pcb != NULL); + tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); + pcb->rcv_nxt = 0x8000; + + /* don't 'recv' the first segment (1 byte) so that all other segments will be ooseq */ + + /* create segments and 'recv' them */ + for(i = 1; i <= TCP_OOSEQ_MAX_PBUFS; i++) { + int count; + struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[i], + 1, i, 0, TCP_ACK); + EXPECT_RET(p != NULL); + EXPECT_RET(p->next == NULL); + /* pass the segment to tcp_input */ + test_tcp_input(p, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* check ooseq queue */ + count = tcp_oos_pbuf_count(pcb); + EXPECT_OOSEQ(count == i); + datalen = tcp_oos_tcplen(pcb); + EXPECT_OOSEQ(datalen == i); + } + + /* pass in one more segment, overrunning the limit */ + p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[i+1], 1, i+1, 0, TCP_ACK); + EXPECT_RET(p_ovr != NULL); + /* pass the segment to tcp_input */ + test_tcp_input(p_ovr, &netif); + /* check if counters are as expected */ + EXPECT(counters.close_calls == 0); + EXPECT(counters.recv_calls == 0); + EXPECT(counters.recved_bytes == 0); + EXPECT(counters.err_calls == 0); + /* check ooseq queue (ensure the new segment was not accepted) */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == (i-1)); + datalen2 = tcp_oos_tcplen(pcb); + EXPECT_OOSEQ(datalen2 == (i-1)); + + /* make sure the pcb is freed */ + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); + tcp_abort(pcb); + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); +#endif /* TCP_OOSEQ_MAX_PBUFS && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) */ + LWIP_UNUSED_ARG(_i); +} +END_TEST + +static void +check_rx_counters(struct tcp_pcb *pcb, struct test_tcp_counters *counters, u32_t exp_close_calls, u32_t exp_rx_calls, + u32_t exp_rx_bytes, u32_t exp_err_calls, int exp_oos_count, int exp_oos_len) +{ + int oos_len; + EXPECT(counters->close_calls == exp_close_calls); + EXPECT(counters->recv_calls == exp_rx_calls); + EXPECT(counters->recved_bytes == exp_rx_bytes); + EXPECT(counters->err_calls == exp_err_calls); + /* check that pbuf is queued in ooseq */ + EXPECT_OOSEQ(tcp_oos_count(pcb) == exp_oos_count); + oos_len = tcp_oos_tcplen(pcb); + EXPECT_OOSEQ(exp_oos_len == oos_len); +} + +/* this test uses 4 packets: + * - data (len=TCP_MSS) + * - FIN + * - data after FIN (len=1) (invalid) + * - 2nd FIN (invalid) + * + * the parameter 'delay_packet' is a bitmask that choses which on these packets is ooseq + */ +static void test_tcp_recv_ooseq_double_FINs(int delay_packet) +{ + int i, k; + struct test_tcp_counters counters; + struct tcp_pcb* pcb; + struct pbuf *p_normal_fin, *p_data_after_fin, *p, *p_2nd_fin_ooseq; + ip_addr_t remote_ip, local_ip; + u16_t remote_port = 0x100, local_port = 0x101; + struct netif netif; + u32_t exp_rx_calls = 0, exp_rx_bytes = 0, exp_close_calls = 0, exp_oos_pbufs = 0, exp_oos_tcplen = 0; + int first_dropped = 0xff; + int last_dropped = 0; + + for(i = 0; i < sizeof(data_full_wnd); i++) { + data_full_wnd[i] = (char)i; + } + + /* initialize local vars */ + memset(&netif, 0, sizeof(netif)); + IP4_ADDR(&local_ip, 192, 168, 1, 1); + IP4_ADDR(&remote_ip, 192, 168, 1, 2); + /* initialize counter struct */ + memset(&counters, 0, sizeof(counters)); + counters.expected_data_len = TCP_WND; + counters.expected_data = data_full_wnd; + + /* create and initialize the pcb */ + pcb = test_tcp_new_counters_pcb(&counters); + EXPECT_RET(pcb != NULL); + tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port); + pcb->rcv_nxt = 0x8000; + + /* create segments */ + p = tcp_create_rx_segment(pcb, &data_full_wnd[0], TCP_MSS, 0, 0, TCP_ACK); + p_normal_fin = tcp_create_rx_segment(pcb, NULL, 0, TCP_MSS, 0, TCP_ACK|TCP_FIN); + k = 1; + p_data_after_fin = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS+1], k, TCP_MSS+1, 0, TCP_ACK); + p_2nd_fin_ooseq = tcp_create_rx_segment(pcb, NULL, 0, TCP_MSS+1+k, 0, TCP_ACK|TCP_FIN); + + if(delay_packet & 1) { + /* drop normal data */ + first_dropped = 1; + last_dropped = 1; + } else { + /* send normal data */ + test_tcp_input(p, &netif); + exp_rx_calls++; + exp_rx_bytes += TCP_MSS; + } + /* check if counters are as expected */ + check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); + + if(delay_packet & 2) { + /* drop FIN */ + if(first_dropped > 2) { + first_dropped = 2; + } + last_dropped = 2; + } else { + /* send FIN */ + test_tcp_input(p_normal_fin, &netif); + if (first_dropped < 2) { + /* already dropped packets, this one is ooseq */ + exp_oos_pbufs++; + exp_oos_tcplen++; + } else { + /* inseq */ + exp_close_calls++; + } + } + /* check if counters are as expected */ + check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); + + if(delay_packet & 4) { + /* drop data-after-FIN */ + if(first_dropped > 3) { + first_dropped = 3; + } + last_dropped = 3; + } else { + /* send data-after-FIN */ + test_tcp_input(p_data_after_fin, &netif); + if (first_dropped < 3) { + /* already dropped packets, this one is ooseq */ + if (delay_packet & 2) { + /* correct FIN was ooseq */ + exp_oos_pbufs++; + exp_oos_tcplen += k; + } + } else { + /* inseq: no change */ + } + } + /* check if counters are as expected */ + check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); + + if(delay_packet & 8) { + /* drop 2nd-FIN */ + if(first_dropped > 4) { + first_dropped = 4; + } + last_dropped = 4; + } else { + /* send 2nd-FIN */ + test_tcp_input(p_2nd_fin_ooseq, &netif); + if (first_dropped < 3) { + /* already dropped packets, this one is ooseq */ + if (delay_packet & 2) { + /* correct FIN was ooseq */ + exp_oos_pbufs++; + exp_oos_tcplen++; + } + } else { + /* inseq: no change */ + } + } + /* check if counters are as expected */ + check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); + + if(delay_packet & 1) { + /* dropped normal data before */ + test_tcp_input(p, &netif); + exp_rx_calls++; + exp_rx_bytes += TCP_MSS; + if((delay_packet & 2) == 0) { + /* normal FIN was NOT delayed */ + exp_close_calls++; + exp_oos_pbufs = exp_oos_tcplen = 0; + } + } + /* check if counters are as expected */ + check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); + + if(delay_packet & 2) { + /* dropped normal FIN before */ + test_tcp_input(p_normal_fin, &netif); + exp_close_calls++; + exp_oos_pbufs = exp_oos_tcplen = 0; + } + /* check if counters are as expected */ + check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); + + if(delay_packet & 4) { + /* dropped data-after-FIN before */ + test_tcp_input(p_data_after_fin, &netif); + } + /* check if counters are as expected */ + check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); + + if(delay_packet & 8) { + /* dropped 2nd-FIN before */ + test_tcp_input(p_2nd_fin_ooseq, &netif); + } + /* check if counters are as expected */ + check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen); + + /* check that ooseq data has been dumped */ + EXPECT(pcb->ooseq == NULL); + + /* make sure the pcb is freed */ + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 1); + tcp_abort(pcb); + EXPECT(lwip_stats.memp[MEMP_TCP_PCB].used == 0); +} + +/** create multiple segments and pass them to tcp_input with the first segment missing + * to simulate overruning the rxwin with ooseq queueing enabled */ +#define FIN_TEST(name, num) \ + START_TEST(name) \ + { \ + LWIP_UNUSED_ARG(_i); \ + test_tcp_recv_ooseq_double_FINs(num); \ + } \ + END_TEST +FIN_TEST(test_tcp_recv_ooseq_double_FIN_0, 0) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_1, 1) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_2, 2) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_3, 3) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_4, 4) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_5, 5) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_6, 6) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_7, 7) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_8, 8) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_9, 9) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_10, 10) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_11, 11) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_12, 12) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_13, 13) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_14, 14) +FIN_TEST(test_tcp_recv_ooseq_double_FIN_15, 15) + + +/** Create the suite including all tests for this module */ +Suite * +tcp_oos_suite(void) +{ + TFun tests[] = { + test_tcp_recv_ooseq_FIN_OOSEQ, + test_tcp_recv_ooseq_FIN_INSEQ, + test_tcp_recv_ooseq_overrun_rxwin, + test_tcp_recv_ooseq_max_bytes, + test_tcp_recv_ooseq_max_pbufs, + test_tcp_recv_ooseq_double_FIN_0, + test_tcp_recv_ooseq_double_FIN_1, + test_tcp_recv_ooseq_double_FIN_2, + test_tcp_recv_ooseq_double_FIN_3, + test_tcp_recv_ooseq_double_FIN_4, + test_tcp_recv_ooseq_double_FIN_5, + test_tcp_recv_ooseq_double_FIN_6, + test_tcp_recv_ooseq_double_FIN_7, + test_tcp_recv_ooseq_double_FIN_8, + test_tcp_recv_ooseq_double_FIN_9, + test_tcp_recv_ooseq_double_FIN_10, + test_tcp_recv_ooseq_double_FIN_11, + test_tcp_recv_ooseq_double_FIN_12, + test_tcp_recv_ooseq_double_FIN_13, + test_tcp_recv_ooseq_double_FIN_14, + test_tcp_recv_ooseq_double_FIN_15 + }; + return create_suite("TCP_OOS", tests, sizeof(tests)/sizeof(TFun), tcp_oos_setup, tcp_oos_teardown); +} diff --git a/third_party/lwip-1.4.1/test/unit/tcp/test_tcp_oos.h b/third_party/lwip-1.4.1/test/unit/tcp/test_tcp_oos.h new file mode 100644 index 0000000..6b1af34 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/tcp/test_tcp_oos.h @@ -0,0 +1,8 @@ +#ifndef __TEST_TCP_OOS_H__ +#define __TEST_TCP_OOS_H__ + +#include "../lwip_check.h" + +Suite *tcp_oos_suite(void); + +#endif diff --git a/third_party/lwip-1.4.1/test/unit/udp/test_udp.c b/third_party/lwip-1.4.1/test/unit/udp/test_udp.c new file mode 100644 index 0000000..3157db8 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/udp/test_udp.c @@ -0,0 +1,68 @@ +#include "test_udp.h" + +#include "lwip/udp.h" +#include "lwip/stats.h" + +#if !LWIP_STATS || !UDP_STATS || !MEMP_STATS +#error "This tests needs UDP- and MEMP-statistics enabled" +#endif + +/* Helper functions */ +static void +udp_remove_all(void) +{ + struct udp_pcb *pcb = udp_pcbs; + struct udp_pcb *pcb2; + + while(pcb != NULL) { + pcb2 = pcb; + pcb = pcb->next; + udp_remove(pcb2); + } + fail_unless(lwip_stats.memp[MEMP_UDP_PCB].used == 0); +} + +/* Setups/teardown functions */ + +static void +udp_setup(void) +{ + udp_remove_all(); +} + +static void +udp_teardown(void) +{ + udp_remove_all(); +} + + +/* Test functions */ + +START_TEST(test_udp_new_remove) +{ + struct udp_pcb* pcb; + LWIP_UNUSED_ARG(_i); + + fail_unless(lwip_stats.memp[MEMP_UDP_PCB].used == 0); + + pcb = udp_new(); + fail_unless(pcb != NULL); + if (pcb != NULL) { + fail_unless(lwip_stats.memp[MEMP_UDP_PCB].used == 1); + udp_remove(pcb); + fail_unless(lwip_stats.memp[MEMP_UDP_PCB].used == 0); + } +} +END_TEST + + +/** Create the suite including all tests for this module */ +Suite * +udp_suite(void) +{ + TFun tests[] = { + test_udp_new_remove, + }; + return create_suite("UDP", tests, sizeof(tests)/sizeof(TFun), udp_setup, udp_teardown); +} diff --git a/third_party/lwip-1.4.1/test/unit/udp/test_udp.h b/third_party/lwip-1.4.1/test/unit/udp/test_udp.h new file mode 100644 index 0000000..af790d1 --- /dev/null +++ b/third_party/lwip-1.4.1/test/unit/udp/test_udp.h @@ -0,0 +1,8 @@ +#ifndef __TEST_UDP_H__ +#define __TEST_UDP_H__ + +#include "../lwip_check.h" + +Suite* udp_suite(void); + +#endif diff --git a/third_party/no_license.txt b/third_party/no_license.txt new file mode 100644 index 0000000..c00e223 --- /dev/null +++ b/third_party/no_license.txt @@ -0,0 +1,10 @@ +This directory contains an assortment of third party software packages that +have been ported to the Tiva microcontroller family. These packages are not +owned by Texas Instruments and are not subject to the Texas Instruments +Software License Agreement. Each package has its own copyright and license +agreement, and it is your responsibility to comply with the terms of those +agreements. + +THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS +OR IMPLIED, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. diff --git a/third_party/ptpd-1.1.0/COPYRIGHT b/third_party/ptpd-1.1.0/COPYRIGHT new file mode 100644 index 0000000..cbc5b04 --- /dev/null +++ b/third_party/ptpd-1.1.0/COPYRIGHT @@ -0,0 +1,18 @@ +The following copyright notice applies to all files which compose the +PTPd. This notice applies as if the text was explicitly included each +file. + +Copyright (c) 2009-2010 George V. Neville-Neil, Steven Kreuzer, Martin Burnicki +Copyright (c) 2005-2008 Kendall Correll, Aidan Williams + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/third_party/ptpd-1.1.0/ChangeLog b/third_party/ptpd-1.1.0/ChangeLog new file mode 100644 index 0000000..787b424 --- /dev/null +++ b/third_party/ptpd-1.1.0/ChangeLog @@ -0,0 +1,17 @@ +2010-10-12 George Neville-Neil + + * 1.1.0 Release + + * Add code to limit how much of an offset or delay the client is + willing to tolerate. + + * Add support for BINTIME on FreeBSD which gives more accurate + packet timestamps. + + * Add quality file support + + * Add support for syslog. + + * Add support for user configurable TTL. + + * Clean up code formatting, headers, comments etc. diff --git a/third_party/ptpd-1.1.0/Makefile b/third_party/ptpd-1.1.0/Makefile new file mode 100644 index 0000000..8de8a93 --- /dev/null +++ b/third_party/ptpd-1.1.0/Makefile @@ -0,0 +1,17 @@ +# Root Makefile for ptpd, used for cutting releases + +VERSION = ptpd-1.1.0 + +release: + (cd src; make clean) + mkdir $(VERSION) + (cd $(VERSION); \ + ln -s ../src .; \ + ln -s ../doc .; \ + ln -s ../tools .; \ + ln -s ../COPYRIGHT .; \ + ln -s ../ChangeLog .; \ + ln -s ../Makefile .; \ + ln -s ../README .; \ + ln -s ../RELEASE_NOTES .) + tar cvzf $(VERSION).tar.gz -L --exclude .o --exclude Doxygen --exclude .svn --exclude .dep --exclude core $(VERSION) diff --git a/third_party/ptpd-1.1.0/README b/third_party/ptpd-1.1.0/README new file mode 100644 index 0000000..8261176 --- /dev/null +++ b/third_party/ptpd-1.1.0/README @@ -0,0 +1,37 @@ +README for PTPd + + +- Introduction - + +This is the source code for the PTP daemon (PTPd). PTPd implements the +Precision Time Protocol (PTP) as defined by 'IEEE Std 1588-2002'. PTP +provides precise time coordination of Ethernet LAN connected computers. It +was designed primarily for instrumentation and control systems. + + +- Use - + +PTPd can coordinate the clocks of a group of LAN connected computers with each +other. It has been shown to achieve microsecond level coordination, even on +limited platforms. + +The 'ptpd' program can be built from the included source code; see the release +notes about platform compatibility. To use the program, run 'ptpd' on a group of +LAN connected computers. Compile with 'PTPD_DBG' defined and run with the '-c' +argument to watch what's going on. + +If you are just looking for software to update the time on your desktop, you +probably want something that implements the Network Time Protocol. It can +coordinate computer clocks with an absolute time reference such as UTC. + + +- Legal notice - + +PTPd was written by using only information contained within 'IEEE Std +1588-2002'. IEEE 1588 may contain patented technology, the use of which is not +under the control of the authors of PTPd. Users of IEEE 1588 may need to obtain +a license for the patented technology in the protocol. Contact the IEEE for +licensing information. + +PTPd comes with absolutely no warranty. + diff --git a/third_party/ptpd-1.1.0/RELEASE_NOTES b/third_party/ptpd-1.1.0/RELEASE_NOTES new file mode 100644 index 0000000..2c79ca3 --- /dev/null +++ b/third_party/ptpd-1.1.0/RELEASE_NOTES @@ -0,0 +1,148 @@ +RELEASE_NOTES for PTPd + +v1.0.0, 9 August 2008: + +The long over due 1.0 release. A few small fixes, the most notable of which is a +fix to check the revision of an IEEE-1588 message to prevent PTPd from +interfering with IEEE-1588 v2 devices on the same network. There are some extras +thanks to contributors, including an updated MPC8313E patch, a QNX patch, and a +man page. PTPd v1 will be branched in the repository, and work toward IEEE-1588 +v2 will begin on the trunk. + +v1rc1, 17 June 2007: + +This release fixes a regression in v1b5 that broke unicast support. It also adds +a PTPd patch posted on the website for 1588 hardware support on MPC8313E +processors. + +v1b5, 3 December 2006: + +PTPd is now ported to *BSD. Also, there are small fixes for 64-bit +architectures, better interface search on Linux, and disallow master mode if the +stratum is 255 for 1588 spec compliance. There is a fairly large change to +separate the internal time representation from the external IEEE 1588 time +representation. This significantly simplifies the time arithmetic functions, and +it should allow PTPd to work properly after 2038 despite the fact that the Linux +clock will rollover. PTPd should run seamlessly through 2038 as a slave, but to +run PTPd as a master after 2038, you need to set the 'half epoch' flag with the +'-h' command line option. Finally, there is a change so that PTPd no longer +needs a kernel modification to retrieve send time stamps. PTPd now retrieves +send time stamps from looped back received messages. + + -kendall + + +v1b4, 28 June 2006: + +More fixes, including some to make PTPd work with the PTPManager program. The +default UTC offset has also been changed again. Now it is zero to comply with +the 1588 spec, which says that unless a clock is otherwise synced to UTC, it +should report a UTC offset of zero. The '-t' option (don't adjust the clock) has +been fixed so that it also prevents zeroing the frequency at start up. The +ability to query a network with management messages has been added with the '-k' +option. Finally, PTPd's timer and polling mechanism has been changed to allow it +to respond immediately to received messages. + + -kendall + + +v1b3, 6 March 2006: + +There has been some useful feedback since the last release. This release +contains some requested bug fixes including an update of the default UTC offset. +This release also adds a requested slave-only mode. Thanks to everyone for the +input. + + -kendall + + +v1b2, 8 December 2005: + +There has been no feedback from the previous release, so this release does not +contain any significant changes to the source. This release is just the few +minor source changes still sitting in CVS, along with some cleaning of the extra +bits like the documentation and tools. Also, I have removed the 'parpp' tool +from the distribution because its use is not straightforward, and I think it may +be more confusing than helpful to casual users. Finally, I included a PDF of the +paper I wrote for the 2005 Conference on IEEE 1588 to make up for my languishing +source code documentation effort. + + -kendall + + +v1b1, 18 October 2005: + +The site seems to be getting some downloads, so I want this latest code out +there. There are only small changes. The number of foreign master records now +has a command-line option. Also, the the 'Q' randomization of Delay Request +messages is essentially disabled because I realized it was not implemented +correctly. This is no big deal, because PTPd's Delay Requests do not occur in a +consistent part of the Sync interval window, so they are implicitly randomized. +Anyway, PTPd has been plug-fested a couple of times, and everything seems to +work well, so I am comfortable calling this a beta release. Hopefully people +will try the program out and help shake out some bugs. + + -kendall + + +v1a4, 24 September 2005: + +A fair amount of changes, most of which I do not recall. Fixing support for all +of the management messages is one that comes to mind. A fix that sets socket +reuse is another one. Also, there's a fix to the initial clock reset that +allows it to start up very close to master clock time. In general, this release +is more stream-lining and tightening up core functionality. I think that the +protocol stack and the clock servo are feature complete for v1. I will be +testing this release at the IEEE 1588 conference in Zurich. After that, I will +probably tag my next release as beta. + + -kendall + + +v1a3, 17 August 2005: + +Lots of changes. PTPd functions essentially the same as before, but the code has +been reorganized and trimmed. Also, PTPd now has a real clock servo, and there +is a hook for kernel send time stamps. The stock Linux kernel does not have +a send time stamp, so you'll have to implement your own. I'd be glad to provide +instructions how or kernel patches if anyone is interested. PTPd has shown the +ability to hold coordination solidly within 10us running on a 66MHz M68k. + + -kendall + + +v1a2, 4 June 2005: + +PTPd can now be built with 'make'. It also includes a little bit of usage +information in README. This release also fixes a broken clock servo that +caused a slave with a time greater than master clock time to run away from +master clock time. Finally, it includes an updated 'parpp' that hopefully +can be used to precisely quantify the precision of clock coordination. + + -kendall + + +v1a1, 25 May 2005: + +This is the first public source code release of PTPd. The source has been +compiled with gcc and tested on an x86 Linux machine. The code may work on +big-endian machines as well, but it will only work on 32-bit Linux machines. + +This release also includes a kernel module that generates a pulse-per-second +(PPS) on the most significant data bit of a PC parallel port. The PPS +generated by PTP systems can be used to verify their clock coordination. The +included PPS generator is not precise, so it does not provide a good way to +quantify the time coordination precision. + +All of this code is a work in progress. Please feel free to mess around with +it and use it as you wish. While I can offer no support, I welcome any +questions/comments on porting, bugs, features, or anything else. One +exception, please do not ask me what PTP is. One can learn more about PTP +from the IEEE 1588 specification, and one can join the LXI Consortium to +work with the companies using PTP. + +Finally, this release is not intended to be a functional PTP system +(although one can be built from it using 'gcc ptpd.c -o ptpd'). It should +not be too hard to figure out how to use it if you dig into the source. + + -kendall diff --git a/third_party/ptpd-1.1.0/doc/clock_servo.svg b/third_party/ptpd-1.1.0/doc/clock_servo.svg new file mode 100644 index 0000000..713d77d --- /dev/null +++ b/third_party/ptpd-1.1.0/doc/clock_servo.svg @@ -0,0 +1,350 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PIcontroller + master-to-slave delay + slave-to-masterdelay + interval + 1/2 + one-waydelay + LP IIR + LP FIR + offset frommaster + tick rateadjustment + + ∑ + + ∑ + KernelFLL + Clock + PTPd + – + + diff --git a/third_party/ptpd-1.1.0/doc/data_paths.svg b/third_party/ptpd-1.1.0/doc/data_paths.svg new file mode 100644 index 0000000..7930acd --- /dev/null +++ b/third_party/ptpd-1.1.0/doc/data_paths.svg @@ -0,0 +1,424 @@ + + + + + + + + + + + PHY + + MAC + + + HWBuff + Tx + Rx + IRQ + + NICDriver + + UDP/IP + + jitter + JITTER + + + PTPd + Time + + + Servo + + + + + + + + + + + + + + + + Hardware + Kernel-Space + User-Space + send() + recv() + ioctl() + adjtimex() + + + + + + + + + + + + Tx + Rx + Clock + + diff --git a/third_party/ptpd-1.1.0/doc/doc.html b/third_party/ptpd-1.1.0/doc/doc.html new file mode 100644 index 0000000..dd3bc33 --- /dev/null +++ b/third_party/ptpd-1.1.0/doc/doc.html @@ -0,0 +1,210 @@ + + + + +PTPd Source Documentation + + + + +

PTPd Source Code Documentation

+ +

+This is a brief overview of PTPd's source code intended to aid developers looking through PTPd. +

+ +

This documentation is incomplete, and it will be worked on as time permits. +More information, particularly on PTPd's clock servo, is available in this paper written for the 2005 +Conference on IEEE 1588.

+ + +

The IEEE 1588 Precision Time Protocol

+ +

The PTP daemon (PTPd) implements the Precision Time protocol (PTP) as +defined by the IEEE 1588 standard. PTP was developed to provide very precise +time coordination of LAN connected computers. The IEEE 1558 specification +dictates most of PTPd's operation, so one should obtain a copy of the spec +before going through PTPd's source code. PTPd keeps all of the names used in the +spec, so it should be easy to match up PTPd's source code with the spec. +Descriptions herein will assume knowledge of the spec.

+ +

Playing with PTPd

+ +

The best way to become familiar with a program is to use it. One should be +able to run PTPd on standard Linux systems without much trouble. To better +observe the operation of PTPd, compile it with the PTPD_DBG flag to have the +program produce debugging output, and run PTPd with the '-c' argument to prevent +it from backgrounding itself.

+ +

PTPd coordinates the local clock by adjusting the effective tick rate, or +slewing, the clock. This is a slow but precise process. To quickly +coordinate a local clock that is off by more than one second, PTPd will reset +the clock instead of slewing. This results in a step change in the time base, +which can can cause problems for applications that require a smooth and +monotonically increasing time base. The '-x' option will prevent PTPd from +resetting the clock, while still allowing it to adjust the clock frequency. +(This is different from the '-t' option that entirely prevents PTPd from +adjusting the clock.)

+ +

For PTPd to operate, it must be run on at least two computers connected +through an Ethernet hub or switch. It is possible to have PTPd coordinate two +(and only two) computers through a routed connection by running PTPd on each +computer with the '-u' argument followed by the IP address of the other +computer.

+ +

PTPd can send management messages to query PTP nodes on a LAN or a PTPd +server on the same machine. To send a management message, run PTPd with the '-k +NUMBER' option, where the number is the management message key to send, or zero +to send a sweep of different management messages. To query only a local PTPd +server, bind the program to the loopback device with '-b lo'.

+ +

PTPd should be able to coordinate the clocks of your computers within tens +of microseconds. The default distribution achieved coordination below ten +microseconds running on fairly busy embedded systems with 66MHz m68k processors. +For the best performance, you will need to tweak the servo gains with the '-a' +command line argument. Also, you must compensate for asymmetric inbound versus +outbound message latency with the '-l' argument. This will remove any constant +offset in the time coordination. As a rule of thumb, you can eliminate a time +offset T by specifying an inbound and outbound latency that have a difference of +2*T.

+ +

PTPd's precision is dependent upon the precision of message send and receive +time stamps. PTPd previously required a kernel patch to improve its precision, +but now it needs only a Berkeley sockets interface that has the +SO_TIMESTAMP socket option. PTPd uses a few platform specific APIs to +query network interfaces, but otherwise it should be very portable to any Posix +platform that implements David Mills' ntp_adjtime/adtimex +system call. PTPd runs on Linux, uClinux, NetBSD, and FreeBSD.

+ +

While it is fairly easy to get PTPd to provide a precisely coordinated time +base, it is much more difficult to use the coordinated time base. This is +because platforms like Linux do not provide interfaces to generate precisely +timed events. Projects like RTAI are working on 'real-time' turnaround in Linux. +

+ +

PTPd's Source Code Organization

+ +

PTPd's source is grouped into a few components. The component delineations +are based on the functionality defined by the spec, but the delineations are not +specifically defined by the spec.

+ +

The following is a block diagram of PTPd's major components, in which +occlusion indicates interfaces between components.

+ +

+[organization block diagram]

+ +

In general, PTPd's source is divided into platform-independent and +platform-dependent code. Platform-independent code is located in the top level +of the PTPd source tree, and platform-dependent code is located the +dep/ sub-directory.

+ +

PTPd's major source code components are:

+ +
Protocol Engine, protocol.c
+ +
The main protocol state machine defined in the spec. The state machine is +implemented as a forever loop with cases for each state. It is called with +protocol() after start-up, and only returns on an error. Normal +execution is expected to be halted externally and asynchronously. The loop +sleeps in a select() call on the network sockets. The primary states, handled by +doState(), are master, slave, inactive, and faulty. State transitions, +handled by toState(), occur primarily due to the results of the BMC +algorithm. The primary events are message receives, which are checked for in +handle(), and timer expiration. The primary actions are message sends, +which are done in issue(), timer resets, regular runs of the BMC +algorithm, foreign master data updates, and system clock servo updates after +sync message receipts.
+ +
BMC, bmc.c
+ +
The Best Master Clock algorithm defined by the spec. It is called with +bmc(), and it returns the proper state, master or slave, based on the +reported clock statistics of other PTP clocks that have sent Sync messages +(foreign masters).
+ +
Clock Servo, dep/servo.c
+ +
The clock servo computes the offset-from-master from the master-to-slave +delay and slave-to-master delays. It uses the offset-from-master to compute +clock tick rate adjustments to minimize the offset-from-master. The clock servo +also performs filtering to remove jitter from its input.
+ +
Message Packer, dep/msg.c
+ +
Gathers data into and extracts data from PTP messages, the format of which +is defined by the spec.
+ +
Network Layer, dep/net.c
+ +
Initializes connections, sends, and receives data between PTP clocks. +The network layer also retrieves time stamps for Event messages from the Time +Stamp component.
+ +
Time Stamp
+ +
Records message send and receive times. The send and receive times are used +to compute the master-to-slave and slave-to-master delay. The delays are then +used to coordinate slave clocks with master clock time. Time stamps should be +recorded as close to the networking hardware as possible. This minimizes jitter +in the time stamps, which is the most significant detriment to PTPd's clock +coordination.
+ +
Timer, dep/timer.c
+ +
Low resolution interval timers used in the protocol engine. The timers +control periodic Sync message sends by masters, Delay Request sends by slaves, periodic +runs of the BMC (state change events), and Sync receive timeouts.
+ +
Start-up, dep/startup.c
+ +
Sets the program's execution state, and retrieves run-time options from the +user.
+ +
Other code
+ +
The ptpd.c file contains the execution entry point. The +ptpd header files contain function prototype declarations. The +datatypes header files contain structure and data type declarations. +Finally, the constants header files contain constant declarations. +
+ +

PTPd's Clock Servo

+ +

The IEEE 1588 spec does not define how the offset from master produced by a +PTP slave is used to bring the slave clock into coordination with master clock +time. This procedure, called clock discipline, is not trivial, and there are +many possible design approaches and trade-offs. For these reasons, this +documentation devotes a section exclusively to the clock servo component.

+ +

The following shows the message send and receive paths in a typical system +running PTPd, along with the associated time stamps that form the basis of the +master-to-slave and slave-to-master delay measurements.

+ +

+ +[data path diagram] +

+ +

The following is a system diagram of PTPd's clock servo. The FIR filtering +of the offset from master input is a simple, two-sample average. The IIR +filtering of the input one-way delay is described below. The PI controller that +mediates the tick rate adjustment output has the difference equation: y[n] = +e[n]/Ap + a[n], a[n] = e[n]/Ai + a[n-1].

+ +

+[clock servo system diagram]

+ +

The following are plots of the frequency response of the one-way delay +filter. It is a variable cutoff/delay low-pass, infinite impulse response (IIR) +filter. The one-way delay filter has the difference equation: s*y[n] - +(s-1)*y[n-1] = x[n]/2 + x[n-1]/2, where increasing the stiffness +(s) lowers the cutoff and increases the delay.

+ +

+[offset filter plot]

+ + + + diff --git a/third_party/ptpd-1.1.0/doc/filter.svg b/third_party/ptpd-1.1.0/doc/filter.svg new file mode 100644 index 0000000..0bdd38a --- /dev/null +++ b/third_party/ptpd-1.1.0/doc/filter.svg @@ -0,0 +1,483 @@ + + + + + + + + + + -3 + + + + -2.5 + + + + -2 + + + + -1.5 + + + + -1 + + + + -0.5 + + + + 0 + + + + 1e-05 + + + + 1e-04 + + + + 0.001 + + + + 0.01 + + + + 0.1 + + + + 1 + + + phase (rad) + + + frequency + + + + + -200 + + + + -150 + + + + -100 + + + + -50 + + + + 0 + + + + 1e-05 + + + + 1e-04 + + + + 0.001 + + + + 0.01 + + + + 0.1 + + + + 1 + + + + gain (dB) + + + frequency + + + + s = 2^0 + + + + + + + + s = 2^4 + + + + + + + + s = 2^8 + + + + + + + + s = 2^16 + + + + + + + + s = 2^0 + + + + + + + + s = 2^4 + + + + + + + + s = 2^8 + + + + + + + + s = 2^16 + + + + + + + diff --git a/third_party/ptpd-1.1.0/doc/index.html b/third_party/ptpd-1.1.0/doc/index.html new file mode 100644 index 0000000..5c39e94 --- /dev/null +++ b/third_party/ptpd-1.1.0/doc/index.html @@ -0,0 +1,125 @@ + + + + +PTPd - Precision Time Protocol daemon + + + + + + + + + + +
+

+Last site update: 12 October 2010 | Latest PTPd version 1: 1.1.0 Latest PTPd version 2: 2.1.0 +| PTPd is hosted by +SourceForge.net Logo +

+
+
+ + + + + +
+
PTPd
+ (Version 1 and Version 2) +
+ + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

The PTP daemon (PTPd) implements the Precision Time protocol (PTP) +as defined by the relevant IEEE 1588 standard. PTP Version 1 +implements IEEE-1588-2002, and PTP Version 2 implements +IEEE-1588-2008. PTP was developed to provide very precise time +coordination of LAN connected computers.

+ +

PTPd is a complete implementation of the IEEE 1588 specification +for a standard (non-boundary) clock. PTPd has been tested with and is +known to work properly with other IEEE 1588 implementations. The +source code for PTPd is freely available under a BSD-style +license. Thanks to contributions from users, PTPd is becoming an +increasingly portable, interoperable, and stable IEEE 1588 +implementation.

+ +

PTPd can run on most 32-bit or 64-bit, little- or big-endian processors. It +does not require an FPU, so it is great for embedded processors. PTPd +currently runs on Linux, uClinux, FreeBSD, and NetBSD. It should also +be easy to port to other platforms.

+ +

PTPd is free. Everyone is welcome to use and contribute to PTPd.

+ +

The PTPd project would like to thank the following for their kind + donations of equipment and time: + +

+
Meinberg Corp +
Donation of an m600 PTPv2 GPS Grandmaster Clock +
Sentex Data Communications +
Hosting the FreeBSD Network Test Cluster +
The FreeBSD Foundation +
Providing testing resources for the PTPd Project +
+
+ + +
+ + + + diff --git a/third_party/ptpd-1.1.0/doc/organization.svg b/third_party/ptpd-1.1.0/doc/organization.svg new file mode 100644 index 0000000..7207b46 --- /dev/null +++ b/third_party/ptpd-1.1.0/doc/organization.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + NetLayer + MsgPacker + Protocol Engine + BMCAlgorithm + Start-up + TimeStamp + ClockServo + Kernel + Timers + + diff --git a/third_party/ptpd-1.1.0/doc/ptpd_2005_1588_conference_paper.pdf b/third_party/ptpd-1.1.0/doc/ptpd_2005_1588_conference_paper.pdf new file mode 100644 index 0000000..3d4f80d Binary files /dev/null and b/third_party/ptpd-1.1.0/doc/ptpd_2005_1588_conference_paper.pdf differ diff --git a/third_party/ptpd-1.1.0/doc/stylesheet.css b/third_party/ptpd-1.1.0/doc/stylesheet.css new file mode 100644 index 0000000..3f86770 --- /dev/null +++ b/third_party/ptpd-1.1.0/doc/stylesheet.css @@ -0,0 +1,74 @@ +body { + margin-left: 0px; + margin-top: 0px; + margin-right: 0px; + margin-bottom: 0px; + background-color: #ffffff; + color: #000000; +} + +a:link { + text-decoration: none; +} +a:visited { + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +a:active { + text-decoration: none; +} + +.vline { + background-color: #000000; + width: 1px; +} + +.info_table { + background-color: #fafae0; +} + +.info_text { + font-family: sans-serif; + font-size: small; + color: #555555; + margin: 0px; +} + +.title_text { + font-family: sans-serif; + font-size: 60px; +} + +.subtitle_text { + font-family: sans-serif; + font-size: 20px; +} + +.sidebar_table { + background-color: #ffffff; + margin: 20px; +} + +.sidebar_heading { + font-family: sans-serif; + color: #000000; + font-weight: bold; + margin: 3px; + white-space: nowrap +} + +.sidebar_link { + font-family: sans-serif; + color: #000000; + margin: 3px; + margin-left: 6px; + white-space: nowrap +} + +.content_table { + background-color: #ffffff; + margin: 40px; +} + diff --git a/third_party/ptpd-1.1.0/src/Doxyfile b/third_party/ptpd-1.1.0/src/Doxyfile new file mode 100644 index 0000000..6a2d4c4 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/Doxyfile @@ -0,0 +1,1511 @@ +# Doxyfile 1.5.8 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# http://www.gnu.org/software/libiconv for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = PTPD + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = Doxygen + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, +# Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, +# Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, +# Spanish, Swedish, and Ukrainian. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful is your file systems +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it parses. +# With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this tag. +# The format is ext=language, where ext is a file extension, and language is one of +# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, +# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat +# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen to replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penality. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will rougly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = YES + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespace are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or define consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and defines in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. +# This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by +# doxygen. The layout file controls the global structure of the generated output files +# in an output format independent way. The create the layout file that represents +# doxygen's defaults, run doxygen with the -l option. You can optionally specify a +# file name after the option, if omitted DoxygenLayout.xml will be used as the name +# of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be abled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx +# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix filesystem feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. +# If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. +# Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. +# The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER +# is applied to all files. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. +# Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see http://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = YES + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +GENERATE_HTMLHELP = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER +# are set, an additional index file will be generated that can be used as input for +# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated +# HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. +# For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's +# filter section matches. +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to FRAME, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, +# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are +# probably better off using the HTML help feature. Other possible values +# for this tag are: HIERARCHIES, which will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list; +# ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which +# disables this behavior completely. For backwards compatibility with previous +# releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE +# respectively. + +GENERATE_TREEVIEW = NONE + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = YES + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. +# This is useful +# if you want to understand what is going on. +# On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all function-like macros that are alone +# on a line, have an all uppercase name, and do not end with a semicolon. Such +# function macros are typically used for boiler-plate code, and will confuse +# the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option is superseded by the HAVE_DOT option below. This is only a +# fallback. It is recommended to install and use dot, since it yields more +# powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# By default doxygen will write a font called FreeSans.ttf to the output +# directory and reference it in all dot files that doxygen generates. This +# font does not include all possible unicode characters however, so when you need +# these (or just want a differently looking font) you can specify the font name +# using DOT_FONTNAME. You need need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = FreeSans + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are png, jpg, or gif +# If left blank png will be used. + +DOT_IMAGE_FORMAT = png + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = YES + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES + +#--------------------------------------------------------------------------- +# Options related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = YES + diff --git a/third_party/ptpd-1.1.0/src/Makefile b/third_party/ptpd-1.1.0/src/Makefile new file mode 100644 index 0000000..589981b --- /dev/null +++ b/third_party/ptpd-1.1.0/src/Makefile @@ -0,0 +1,35 @@ +# Makefile for ptpd + +RM = rm -f +CFLAGS+= -Wall #-DBSD_INTERFACE_FUNCTIONS +#CPPFLAGS = -DPTPD_DBG -DPTPD_NO_DAEMON + +PROG = ptpd +SRCS = ptpd.c arith.c bmc.c probe.c protocol.c \ + dep/msg.c dep/net.c dep/servo.c dep/startup.c dep/sys.c dep/timer.c +OBJS = $(SRCS:.c=.o) + +HDRS = ptpd.h constants.h datatypes.h \ + dep/ptpd_dep.h dep/constants_dep.h dep/datatypes_dep.h + +CSCOPE = cscope +GTAGS = gtags +DOXYGEN = doxygen + +TAGFILES = GPATH GRTAGS GSYMS GTAGS cscope.in.out cscope.out cscope.po.out + +.c.o: + $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< + +all: $(PROG) + +$(PROG): $(OBJS) + $(CC) $(LDFLAGS) -o $@ $(OBJS) + +tags: + $(CSCOPE) -R -q -b + $(GTAGS) + $(DOXYGEN) Doxyfile + +clean: + $(RM) $(PROG) $(OBJS) $(TAGFILES) make.out diff --git a/third_party/ptpd-1.1.0/src/arith.c b/third_party/ptpd-1.1.0/src/arith.c new file mode 100644 index 0000000..a258a9e --- /dev/null +++ b/third_party/ptpd-1.1.0/src/arith.c @@ -0,0 +1,113 @@ +/** + * @file arith.c + * @date Tue Jul 20 16:12:51 2010 + * + * @brief Time format conversion routines and additional math functions. + * + * + */ + +#include "ptpd.h" + +/* from annex C of the spec */ +UInteger32 +crc_algorithm(Octet * buf, Integer16 length) +{ + Integer16 i; + UInteger8 data; + UInteger32 polynomial = 0xedb88320, crc = 0xffffffff; + + while (length-- > 0) { + data = *(UInteger8 *) (buf++); + + for (i = 0; i < 8; i++) { + if ((crc ^ data) & 1) { + crc = (crc >> 1); + crc ^= polynomial; + } else { + crc = (crc >> 1); + } + data >>= 1; + } + } + + return crc ^ 0xffffffff; +} + +UInteger32 +sum(Octet * buf, Integer16 length) +{ + UInteger32 sum = 0; + + while (length-- > 0) + sum += *(UInteger8 *) (buf++); + + return sum; +} + +void +fromInternalTime(TimeInternal * internal, TimeRepresentation * external, Boolean halfEpoch) +{ + external->seconds = labs(internal->seconds) + halfEpoch * INT_MAX; + + if (internal->seconds < 0 || internal->nanoseconds < 0) { + external->nanoseconds = labs(internal->nanoseconds) | ~INT_MAX; + } else { + external->nanoseconds = labs(internal->nanoseconds); + } + + DBGV("fromInternalTime: %10ds %11dns -> %10us %11dns\n", + internal->seconds, internal->nanoseconds, + external->seconds, external->nanoseconds); +} + +void +toInternalTime(TimeInternal * internal, TimeRepresentation * external, Boolean * halfEpoch) +{ + *halfEpoch = external->seconds / INT_MAX; + + if (external->nanoseconds & ~INT_MAX) { + internal->seconds = -(external->seconds % INT_MAX); + internal->nanoseconds = -(external->nanoseconds & INT_MAX); + } else { + internal->seconds = external->seconds % INT_MAX; + internal->nanoseconds = external->nanoseconds; + } + + DBGV("toInternalTime: %10ds %11dns <- %10us %11dns\n", + internal->seconds, internal->nanoseconds, + external->seconds, external->nanoseconds); +} + +void +normalizeTime(TimeInternal * r) +{ + r->seconds += r->nanoseconds / 1000000000; + r->nanoseconds -= r->nanoseconds / 1000000000 * 1000000000; + + if (r->seconds > 0 && r->nanoseconds < 0) { + r->seconds -= 1; + r->nanoseconds += 1000000000; + } else if (r->seconds < 0 && r->nanoseconds > 0) { + r->seconds += 1; + r->nanoseconds -= 1000000000; + } +} + +void +addTime(TimeInternal * r, TimeInternal * x, TimeInternal * y) +{ + r->seconds = x->seconds + y->seconds; + r->nanoseconds = x->nanoseconds + y->nanoseconds; + + normalizeTime(r); +} + +void +subTime(TimeInternal * r, TimeInternal * x, TimeInternal * y) +{ + r->seconds = x->seconds - y->seconds; + r->nanoseconds = x->nanoseconds - y->nanoseconds; + + normalizeTime(r); +} diff --git a/third_party/ptpd-1.1.0/src/bmc.c b/third_party/ptpd-1.1.0/src/bmc.c new file mode 100644 index 0000000..0b3ce74 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/bmc.c @@ -0,0 +1,330 @@ +/** + * @file bmc.c + * @date Wed Jun 23 09:36:09 2010 + * + * @brief Best master clock selection code. + * + * The functions in this file are used by the daemon to select the + * best master clock from any number of possibilities. + */ + +#include "ptpd.h" + +void +initData(RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + DBG("initData\n"); + + if (rtOpts->slaveOnly) + rtOpts->clockStratum = 255; + + /* Port configuration data set */ + ptpClock->last_sync_event_sequence_number = 0; + ptpClock->last_general_event_sequence_number = 0; + ptpClock->port_id_field = 1; + ptpClock->burst_enabled = BURST_ENABLED; + + /* Default data set */ + ptpClock->clock_communication_technology = ptpClock->port_communication_technology; + memcpy(ptpClock->clock_uuid_field, ptpClock->port_uuid_field, PTP_UUID_LENGTH); + ptpClock->clock_port_id_field = 0; + ptpClock->clock_stratum = rtOpts->clockStratum; + memcpy(ptpClock->clock_identifier, rtOpts->clockIdentifier, PTP_CODE_STRING_LENGTH); + ptpClock->sync_interval = rtOpts->syncInterval; + + ptpClock->clock_variance = rtOpts->clockVariance; /* see spec 7.7 */ + ptpClock->clock_followup_capable = CLOCK_FOLLOWUP; + ptpClock->preferred = rtOpts->clockPreferred; + ptpClock->initializable = INITIALIZABLE; + ptpClock->external_timing = EXTERNAL_TIMING; + ptpClock->is_boundary_clock = BOUNDARY_CLOCK; + memcpy(ptpClock->subdomain_name, rtOpts->subdomainName, PTP_SUBDOMAIN_NAME_LENGTH); + ptpClock->number_ports = NUMBER_PORTS; + ptpClock->number_foreign_records = 0; + ptpClock->max_foreign_records = rtOpts->max_foreign_records; + + /* Global time properties data set */ + ptpClock->current_utc_offset = rtOpts->currentUtcOffset; + ptpClock->epoch_number = rtOpts->epochNumber; + + /* other stuff */ + ptpClock->random_seed = ptpClock->port_uuid_field[PTP_UUID_LENGTH - 1]; +} + +/* see spec table 18 */ +void +m1(PtpClock * ptpClock) +{ + /* Default data set */ + ptpClock->steps_removed = 0; + ptpClock->offset_from_master.seconds = 0; + ptpClock->offset_from_master.nanoseconds = 0; + ptpClock->one_way_delay.seconds = 0; + ptpClock->one_way_delay.nanoseconds = 0; + + /* Parent data set */ + ptpClock->parent_communication_technology = ptpClock->clock_communication_technology; + memcpy(ptpClock->parent_uuid, ptpClock->clock_uuid_field, PTP_UUID_LENGTH); + ptpClock->parent_port_id = ptpClock->clock_port_id_field; + ptpClock->parent_last_sync_sequence_number = 0; + ptpClock->parent_followup_capable = ptpClock->clock_followup_capable; + ptpClock->parent_external_timing = ptpClock->external_timing; + ptpClock->parent_variance = ptpClock->clock_variance; + ptpClock->grandmaster_communication_technology = ptpClock->clock_communication_technology; + memcpy(ptpClock->grandmaster_uuid_field, ptpClock->clock_uuid_field, PTP_UUID_LENGTH); + ptpClock->grandmaster_port_id_field = ptpClock->clock_port_id_field; + ptpClock->grandmaster_stratum = ptpClock->clock_stratum; + memcpy(ptpClock->grandmaster_identifier, ptpClock->clock_identifier, PTP_CODE_STRING_LENGTH); + ptpClock->grandmaster_variance = ptpClock->clock_variance; + ptpClock->grandmaster_preferred = ptpClock->preferred; + ptpClock->grandmaster_is_boundary_clock = ptpClock->is_boundary_clock; + ptpClock->grandmaster_sequence_number = ptpClock->last_sync_event_sequence_number; +} + +/* see spec table 21 */ +void +s1(MsgHeader * header, MsgSync * sync, PtpClock * ptpClock) +{ + /* Current data set */ + ptpClock->steps_removed = sync->localStepsRemoved + 1; + + /* Parent data set */ + ptpClock->parent_communication_technology = header->sourceCommunicationTechnology; + memcpy(ptpClock->parent_uuid, header->sourceUuid, PTP_UUID_LENGTH); + ptpClock->parent_port_id = header->sourcePortId; + ptpClock->parent_last_sync_sequence_number = header->sequenceId; + ptpClock->parent_followup_capable = getFlag(header->flags, PTP_ASSIST); + ptpClock->parent_external_timing = getFlag(header->flags, PTP_EXT_SYNC); + ptpClock->parent_variance = sync->localClockVariance; + ptpClock->grandmaster_communication_technology = sync->grandmasterCommunicationTechnology; + memcpy(ptpClock->grandmaster_uuid_field, sync->grandmasterClockUuid, PTP_UUID_LENGTH); + ptpClock->grandmaster_port_id_field = sync->grandmasterPortId; + ptpClock->grandmaster_stratum = sync->grandmasterClockStratum; + memcpy(ptpClock->grandmaster_identifier, sync->grandmasterClockIdentifier, PTP_CODE_STRING_LENGTH); + ptpClock->grandmaster_variance = sync->grandmasterClockVariance; + ptpClock->grandmaster_preferred = sync->grandmasterPreferred; + ptpClock->grandmaster_is_boundary_clock = sync->grandmasterIsBoundaryClock; + ptpClock->grandmaster_sequence_number = sync->grandmasterSequenceId; + + /* Global time properties data set */ + ptpClock->current_utc_offset = sync->currentUTCOffset; + ptpClock->leap_59 = getFlag(header->flags, PTP_LI_59); + ptpClock->leap_61 = getFlag(header->flags, PTP_LI_61); + ptpClock->epoch_number = sync->epochNumber; +} + +void +copyD0(MsgHeader * header, MsgSync * sync, PtpClock * ptpClock) +{ + sync->grandmasterCommunicationTechnology = ptpClock->clock_communication_technology; + memcpy(sync->grandmasterClockUuid, ptpClock->port_uuid_field, PTP_UUID_LENGTH); + sync->grandmasterPortId = ptpClock->port_id_field; + sync->grandmasterClockStratum = ptpClock->clock_stratum; + memcpy(sync->grandmasterClockIdentifier, ptpClock->clock_identifier, PTP_CODE_STRING_LENGTH); + sync->grandmasterClockVariance = ptpClock->clock_variance; + sync->grandmasterIsBoundaryClock = ptpClock->is_boundary_clock; + sync->grandmasterPreferred = ptpClock->preferred; + sync->localStepsRemoved = ptpClock->steps_removed; + header->sourceCommunicationTechnology = ptpClock->clock_communication_technology; + memcpy(header->sourceUuid, ptpClock->port_uuid_field, PTP_UUID_LENGTH); + header->sourcePortId = ptpClock->port_id_field; + sync->grandmasterSequenceId = ptpClock->grandmaster_sequence_number; + header->sequenceId = ptpClock->grandmaster_sequence_number; +} + +int +getIdentifierOrder(Octet identifier[PTP_CODE_STRING_LENGTH]) +{ + if (!memcmp(identifier, IDENTIFIER_ATOM, PTP_CODE_STRING_LENGTH)) + return 1; + else if (!memcmp(identifier, IDENTIFIER_GPS, PTP_CODE_STRING_LENGTH)) + return 1; + else if (!memcmp(identifier, IDENTIFIER_NTP, PTP_CODE_STRING_LENGTH)) + return 2; + else if (!memcmp(identifier, IDENTIFIER_HAND, PTP_CODE_STRING_LENGTH)) + return 3; + else if (!memcmp(identifier, IDENTIFIER_INIT, PTP_CODE_STRING_LENGTH)) + return 4; + else if (!memcmp(identifier, IDENTIFIER_DFLT, PTP_CODE_STRING_LENGTH)) + return 5; + + return 6; +} + +/* return similar to memcmp()s + note: communicationTechnology can be ignored because + if they differed they would not have made it here */ +Integer8 +bmcDataSetComparison(MsgHeader * headerA, MsgSync * syncA, + MsgHeader * headerB, MsgSync * syncB, PtpClock * ptpClock) +{ + DBGV("bmcDataSetComparison: start\n"); + if (!(syncA->grandmasterPortId == syncB->grandmasterPortId + && !memcmp(syncA->grandmasterClockUuid, syncB->grandmasterClockUuid, PTP_UUID_LENGTH))) { + if (syncA->grandmasterClockStratum < syncB->grandmasterClockStratum) + goto A; + else if (syncA->grandmasterClockStratum > syncB->grandmasterClockStratum) + goto B; + + /* grandmasterClockStratums same */ + if (getIdentifierOrder(syncA->grandmasterClockIdentifier) < getIdentifierOrder(syncB->grandmasterClockIdentifier)) + goto A; + if (getIdentifierOrder(syncA->grandmasterClockIdentifier) > getIdentifierOrder(syncB->grandmasterClockIdentifier)) + goto B; + + /* grandmasterClockIdentifiers same */ + if (syncA->grandmasterClockStratum > 2) { + if (syncA->grandmasterClockVariance > syncB->grandmasterClockVariance + PTP_LOG_VARIANCE_THRESHOLD + || syncA->grandmasterClockVariance < syncB->grandmasterClockVariance - PTP_LOG_VARIANCE_THRESHOLD) { + /* grandmasterClockVariances are not similar */ + if (syncA->grandmasterClockVariance < syncB->grandmasterClockVariance) + goto A; + else + goto B; + } + /* grandmasterClockVariances are similar */ + if (!syncA->grandmasterIsBoundaryClock != !syncB->grandmasterIsBoundaryClock) { /* XOR */ + if (syncA->grandmasterIsBoundaryClock) + goto A; + else + goto B; + } + /* neither is grandmasterIsBoundaryClock */ + if (memcmp(syncA->grandmasterClockUuid, syncB->grandmasterClockUuid, PTP_UUID_LENGTH) < 0) + goto A; + else + goto B; + } + /* syncA->grandmasterClockStratum <= 2 */ + if (!syncA->grandmasterPreferred != !syncB->grandmasterPreferred) { /* XOR */ + if (syncA->grandmasterPreferred) + return 1; /* A1 */ + else + return -1; /* B1 */ + } + /* neither or both grandmasterPreferred */ + } + DBGV("bmcDataSetComparison: X\n"); + if (syncA->localStepsRemoved > syncB->localStepsRemoved + 1 + || syncA->localStepsRemoved < syncB->localStepsRemoved - 1) { + /* localStepsRemoved not within 1 */ + if (syncA->localStepsRemoved < syncB->localStepsRemoved) + return 1; /* A1 */ + else + return -1; /* B1 */ + } + /* localStepsRemoved within 1 */ + if (syncA->localStepsRemoved < syncB->localStepsRemoved) { + DBGV("bmcDataSetComparison: A3\n"); + if (memcmp(ptpClock->port_uuid_field, headerB->sourceUuid, PTP_UUID_LENGTH) < 0) + return 1; /* A1 */ + else if (memcmp(ptpClock->port_uuid_field, headerB->sourceUuid, PTP_UUID_LENGTH) > 0) + return 2; /* A2 */ + + /* this port_uuid_field same as headerB->sourceUuid */ + if (ptpClock->port_id_field < headerB->sourcePortId) + return 1; /* A1 */ + else if (ptpClock->port_id_field > headerB->sourcePortId) + return 2; /* A2 */ + + /* this port_id_field same as headerB->sourcePortId */ + return 0; /* same */ + } + if (syncA->localStepsRemoved > syncB->localStepsRemoved) { + DBGV("bmcDataSetComparison: B3\n"); + if (memcmp(ptpClock->port_uuid_field, headerA->sourceUuid, PTP_UUID_LENGTH) < 0) + return -1; /* B1 */ + else if (memcmp(ptpClock->port_uuid_field, headerB->sourceUuid, PTP_UUID_LENGTH) > 0) + return -2; /* B2 */ + + /* this port_uuid_field same as headerA->sourceUuid */ + if (ptpClock->port_id_field < headerA->sourcePortId) + return -1; /* B1 */ + else if (ptpClock->port_id_field > headerA->sourcePortId) + return -2; /* B2 */ + + /* this port_id_field same as headerA->sourcePortId */ + return 0; /* same */ + } + /* localStepsRemoved same */ + if (memcmp(headerA->sourceUuid, headerB->sourceUuid, PTP_UUID_LENGTH) < 0) + return 2; /* A2 */ + else if (memcmp(headerA->sourceUuid, headerB->sourceUuid, PTP_UUID_LENGTH) > 0) + return -2; /* B2 */ + + /* sourceUuid same */ + DBGV("bmcDataSetComparison: Z\n"); + if (syncA->grandmasterSequenceId > syncB->grandmasterSequenceId) + return 3; + else if (syncA->grandmasterSequenceId < syncB->grandmasterSequenceId) + return -3; + + /* grandmasterSequenceId same */ + if (headerA->sequenceId > headerB->sequenceId) + return 3; + else if (headerA->sequenceId < headerB->sequenceId) + return -3; + + /* sequenceId same */ + return 0; /* same */ + + /* oh no, a goto label! the horror! */ +A: + if (!syncA->grandmasterPreferred && syncB->grandmasterPreferred) + return -1; /* B1 */ + else + return 1; /* A1 */ +B: + if (syncA->grandmasterPreferred && !syncB->grandmasterPreferred) + return 1; /* A1 */ + else + return -1; /* B1 */ +} + +UInteger8 +bmcStateDecision(MsgHeader * header, MsgSync * sync, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + if (rtOpts->slaveOnly) { + s1(header, sync, ptpClock); + return PTP_SLAVE; + } + copyD0(&ptpClock->msgTmpHeader, &ptpClock->msgTmp.sync, ptpClock); + + if (ptpClock->msgTmp.sync.grandmasterClockStratum < 3) { + if (bmcDataSetComparison(&ptpClock->msgTmpHeader, &ptpClock->msgTmp.sync, header, sync, ptpClock) > 0) { + m1(ptpClock); + return PTP_MASTER; + } + s1(header, sync, ptpClock); + return PTP_PASSIVE; + } else if (bmcDataSetComparison(&ptpClock->msgTmpHeader, &ptpClock->msgTmp.sync, header, sync, ptpClock) > 0 + && ptpClock->msgTmp.sync.grandmasterClockStratum != 255) { + m1(ptpClock); + return PTP_MASTER; + } else { + s1(header, sync, ptpClock); + return PTP_SLAVE; + } +} + +UInteger8 +bmc(ForeignMasterRecord * foreign, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + Integer16 i, best; + + if (!ptpClock->number_foreign_records) { + if (ptpClock->port_state == PTP_MASTER) + m1(ptpClock); + return ptpClock->port_state; /* no change */ + } + for (i = 1, best = 0; i < ptpClock->number_foreign_records; ++i) { + if (bmcDataSetComparison(&foreign[i].header, &foreign[i].sync, + &foreign[best].header, &foreign[best].sync, ptpClock) > 0) + best = i; + } + + DBGV("bmc: best record %d\n", best); + ptpClock->foreign_record_best = best; + + return bmcStateDecision(&foreign[best].header, &foreign[best].sync, rtOpts, ptpClock); +} diff --git a/third_party/ptpd-1.1.0/src/constants.h b/third_party/ptpd-1.1.0/src/constants.h new file mode 100644 index 0000000..503aee8 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/constants.h @@ -0,0 +1,120 @@ +/** + * @file constants.h + * @date Wed Jun 23 10:02:39 2010 + * + * @brief All of the defined constants for the daemon. + * + * + */ + +#ifndef CONSTANTS_H +#define CONSTANTS_H + +/* implementation specific constants */ +#define MANUFACTURER_ID \ + "PTPD;1.2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" + +#define DEFAULT_SYNC_INTERVAL 1 +#define DEFAULT_UTC_OFFSET 0 +#define DEFAULT_CLOCK_VARIANCE (-4000) +#define DEFAULT_CLOCK_STRATUM 4 +#define DEFAULT_INBOUND_LATENCY 0 /* in nsec */ +#define DEFAULT_OUTBOUND_LATENCY 0 /* in nsec */ +#define DEFAULT_NO_RESET_CLOCK FALSE +#define DEFAULT_AP 10 +#define DEFAULT_AI 1000 +#define DEFAULT_DELAY_S 6 +#define DEFAULT_MAX_FOREIGN_RECORDS 5 + +/* features, only change to refelect changes in implementation */ +#define CLOCK_FOLLOWUP TRUE +#define INITIALIZABLE TRUE +#define BURST_ENABLED FALSE +#define EXTERNAL_TIMING FALSE +#define BOUNDARY_CLOCK FALSE +#define NUMBER_PORTS 1 +#define VERSION_PTP 1 +#define VERSION_NETWORK 1 + +/* spec defined constants */ +#define DEFAULT_PTP_DOMAIN_NAME "_DFLT\0\0\0\0\0\0\0\0\0\0\0" +#define ALTERNATE_PTP_DOMAIN1_NAME "_ALT1\0\0\0\0\0\0\0\0\0\0\0" +#define ALTERNATE_PTP_DOMAIN2_NAME "_ALT2\0\0\0\0\0\0\0\0\0\0\0" +#define ALTERNATE_PTP_DOMAIN3_NAME "_ALT3\0\0\0\0\0\0\0\0\0\0\0" + +#define IDENTIFIER_ATOM "ATOM" +#define IDENTIFIER_GPS "GPS\0" +#define IDENTIFIER_NTP "NTP\0" +#define IDENTIFIER_HAND "HAND" +#define IDENTIFIER_INIT "INIT" +#define IDENTIFIER_DFLT "DFLT" + +/* ptp constants */ +#define PTP_UUID_LENGTH 6 +#define PTP_CODE_STRING_LENGTH 4 +#define PTP_SUBDOMAIN_NAME_LENGTH 16 +#define PTP_MAX_MANAGEMENT_PAYLOAD_SIZE 90 +/* no support for intervals less than one */ +#define PTP_SYNC_INTERVAL_TIMEOUT(x) (1<<((x)<0?1:(x))) +#define PTP_SYNC_RECEIPT_TIMEOUT(x) (10*(1<<((x)<0?0:(x)))) +#define PTP_DELAY_REQ_INTERVAL 30 +#define PTP_FOREIGN_MASTER_THRESHOLD 2 +#define PTP_FOREIGN_MASTER_TIME_WINDOW(x) (4*(1<<((x)<0?0:(x)))) +#define PTP_RANDOMIZING_SLOTS 18 +#define PTP_LOG_VARIANCE_THRESHOLD 256 +#define PTP_LOG_VARIANCE_HYSTERESIS 128 +/* used in spec but not named */ +#define MANUFACTURER_ID_LENGTH 48 + +/* ptp data enums */ +enum { + PTP_CLOSED = 0, PTP_ETHER, PTP_FFBUS = 4, + PTP_PROFIBUS, PTP_LON, PTP_DNET, + PTP_SDS, PTP_CONTROLNET, PTP_CANOPEN, + PTP_IEEE1394 = 243, PTP_IEEE802_11A, PTP_IEEE_WIRELESS, + PTP_INFINIBAND, PTP_BLUETOOTH, PTP_IEEE802_15_1, + PTP_IEEE1451_2, PTP_IEEE1451_5, PTP_USB, + PTP_ISA, PTP_PCI, PTP_VXI, PTP_DEFAULT +}; + +enum { + PTP_INITIALIZING = 0, PTP_FAULTY, PTP_DISABLED, + PTP_LISTENING, PTP_PRE_MASTER, PTP_MASTER, + PTP_PASSIVE, PTP_UNCALIBRATED, PTP_SLAVE +}; + +enum { + PTP_SYNC_MESSAGE = 0, PTP_DELAY_REQ_MESSAGE, PTP_FOLLOWUP_MESSAGE, + PTP_DELAY_RESP_MESSAGE, PTP_MANAGEMENT_MESSAGE, + PTP_SYNC_MESSAGE_BURST, PTP_DELAY_REQ_MESSAGE_BURST +}; + +enum { + PTP_LI_61 = 0, PTP_LI_59, PTP_BOUNDARY_CLOCK, + PTP_ASSIST, PTP_EXT_SYNC, PARENT_STATS, PTP_SYNC_BURST +}; + +enum { + PTP_MM_NULL = 0, PTP_MM_OBTAIN_IDENTITY, PTP_MM_CLOCK_IDENTITY, + PTP_MM_INITIALIZE_CLOCK, PTP_MM_SET_SUBDOMAIN, + PTP_MM_CLEAR_DESIGNATED_PREFERRED_MASTER, + PTP_MM_SET_DESIGNATED_PREFERRED_MASTER, + PTP_MM_GET_DEFAULT_DATA_SET, PTP_MM_DEFAULT_DATA_SET, + PTP_MM_UPDATE_DEFAULT_DATA_SET, PTP_MM_GET_CURRENT_DATA_SET, + PTP_MM_CURRENT_DATA_SET, PTP_MM_GET_PARENT_DATA_SET, + PTP_MM_PARENT_DATA_SET, PTP_MM_GET_PORT_DATA_SET, + PTP_MM_PORT_DATA_SET, PTP_MM_GET_GLOBAL_TIME_DATA_SET, + PTP_MM_GLOBAL_TIME_DATA_SET, PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES, + PTP_MM_GOTO_FAULTY_STATE, PTP_MM_GET_FOREIGN_DATA_SET, + PTP_MM_FOREIGN_DATA_SET, PTP_MM_SET_SYNC_INTERVAL, + PTP_MM_DISABLE_PORT, PTP_MM_ENABLE_PORT, + PTP_MM_DISABLE_BURST, PTP_MM_ENABLE_BURST, PTP_MM_SET_TIME +}; + +/* enum used by this implementation */ +enum { + SYNC_RECEIPT_TIMER = 0, SYNC_INTERVAL_TIMER, QUALIFICATION_TIMER, + TIMER_ARRAY_SIZE /* these two are non-spec */ +}; + +#endif diff --git a/third_party/ptpd-1.1.0/src/datatypes.h b/third_party/ptpd-1.1.0/src/datatypes.h new file mode 100644 index 0000000..1f0e21e --- /dev/null +++ b/third_party/ptpd-1.1.0/src/datatypes.h @@ -0,0 +1,362 @@ +/** + * @file datatypes.h + * @date Wed Jun 23 09:37:14 2010 + * + * @brief All of the datatypes used by the daemon. + * + * + */ + + +#ifndef DATATYPES_H +#define DATATYPES_H + +#include + +typedef struct { + UInteger32 seconds; + Integer32 nanoseconds; +} TimeRepresentation; + +typedef struct { + Integer32 seconds; + Integer32 nanoseconds; +} TimeInternal; + +typedef struct { + Integer32 interval; + Integer32 left; + Boolean expire; +} IntervalTimer; + +/* Message header */ +typedef struct { + UInteger16 versionPTP; + UInteger16 versionNetwork; + Octet subdomain[PTP_SUBDOMAIN_NAME_LENGTH]; + UInteger8 messageType; + UInteger8 sourceCommunicationTechnology; + Octet sourceUuid[PTP_UUID_LENGTH]; + UInteger16 sourcePortId; + UInteger16 sequenceId; + UInteger8 control; + Octet flags[2]; + +} MsgHeader; + +/* Sync or Delay_Req message */ +typedef struct { + TimeRepresentation originTimestamp; + UInteger16 epochNumber; + Integer16 currentUTCOffset; + UInteger8 grandmasterCommunicationTechnology; + Octet grandmasterClockUuid[PTP_UUID_LENGTH]; + UInteger16 grandmasterPortId; + UInteger16 grandmasterSequenceId; + UInteger8 grandmasterClockStratum; + Octet grandmasterClockIdentifier[PTP_CODE_STRING_LENGTH]; + Integer16 grandmasterClockVariance; + Boolean grandmasterPreferred; + Boolean grandmasterIsBoundaryClock; + Integer8 syncInterval; + Integer16 localClockVariance; + UInteger16 localStepsRemoved; + UInteger8 localClockStratum; + Octet localClockIdentifer[PTP_CODE_STRING_LENGTH]; + UInteger8 parentCommunicationTechnology; + Octet parentUuid[PTP_UUID_LENGTH]; + UInteger16 parentPortField; + Integer16 estimatedMasterVariance; + Integer32 estimatedMasterDrift; + Boolean utcReasonable; + +} MsgSync; + +typedef MsgSync MsgDelayReq; + +/* Follow_Up message */ +typedef struct { + UInteger16 associatedSequenceId; + TimeRepresentation preciseOriginTimestamp; + +} MsgFollowUp; + +/* Delay_Resp message */ +typedef struct { + TimeRepresentation delayReceiptTimestamp; + UInteger8 requestingSourceCommunicationTechnology; + Octet requestingSourceUuid[PTP_UUID_LENGTH]; + UInteger16 requestingSourcePortId; + UInteger16 requestingSourceSequenceId; + +} MsgDelayResp; + +/* Management message */ +typedef union { + struct ClockIdentity { + UInteger8 clockCommunicationTechnology; + Octet clockUuidField[PTP_UUID_LENGTH]; + UInteger16 clockPortField; + Octet manufacturerIdentity[MANUFACTURER_ID_LENGTH]; + } clockIdentity; + + struct DefaultData { + UInteger8 clockCommunicationTechnology; + Octet clockUuidField[PTP_UUID_LENGTH]; + UInteger16 clockPortField; + UInteger8 clockStratum; + Octet clockIdentifier[PTP_CODE_STRING_LENGTH]; + Integer16 clockVariance; + Boolean clockFollowupCapable; + Boolean preferred; + Boolean initializable; + Boolean externalTiming; + Boolean isBoundaryClock; + Integer8 syncInterval; + Octet subdomainName[PTP_SUBDOMAIN_NAME_LENGTH]; + UInteger16 numberPorts; + UInteger16 numberForeignRecords; + } defaultData; + + struct Current { + UInteger16 stepsRemoved; + TimeRepresentation offsetFromMaster; + TimeRepresentation oneWayDelay; + } current; + + struct Parent { + UInteger8 parentCommunicationTechnology; + Octet parentUuid[PTP_UUID_LENGTH]; + UInteger16 parentPortId; + UInteger16 parentLastSyncSequenceNumber; + Boolean parentFollowupCapable; + Boolean parentExternalTiming; + Integer16 parentVariance; + Boolean parentStats; + Integer16 observedVariance; + Integer32 observedDrift; + Boolean utcReasonable; + UInteger8 grandmasterCommunicationTechnology; + Octet grandmasterUuidField[PTP_UUID_LENGTH]; + UInteger16 grandmasterPortIdField; + UInteger8 grandmasterStratum; + Octet grandmasterIdentifier[PTP_CODE_STRING_LENGTH]; + Integer16 grandmasterVariance; + Boolean grandmasterPreferred; + Boolean grandmasterIsBoundaryClock; + UInteger16 grandmasterSequenceNumber; + } parent; + + struct Port { + UInteger16 returnedPortNumber; + UInteger8 portState; + UInteger16 lastSyncEventSequenceNumber; + UInteger16 lastGeneralEventSequenceNumber; + UInteger8 portCommunicationTechnology; + Octet portUuidField[PTP_UUID_LENGTH]; + UInteger16 portIdField; + Boolean burstEnabled; + UInteger8 subdomainAddressOctets; + UInteger8 eventPortAddressOctets; + UInteger8 generalPortAddressOctets; + Octet subdomainAddress[SUBDOMAIN_ADDRESS_LENGTH]; + Octet eventPortAddress[PORT_ADDRESS_LENGTH]; + Octet generalPortAddress[PORT_ADDRESS_LENGTH]; + } port; + + struct GlobalTime { + TimeRepresentation localTime; + Integer16 currentUtcOffset; + Boolean leap59; + Boolean leap61; + UInteger16 epochNumber; + } globalTime; + + struct Foreign { + UInteger16 returnedPortNumber; + UInteger16 returnedRecordNumber; + UInteger8 foreignMasterCommunicationTechnology; + Octet foreignMasterUuid[PTP_UUID_LENGTH]; + UInteger16 foreignMasterPortId; + UInteger16 foreignMasterSyncs; + } foreign; + +} MsgManagementPayload; + +typedef struct { + UInteger8 targetCommunicationTechnology; + Octet targetUuid[PTP_UUID_LENGTH]; + UInteger16 targetPortId; + Integer16 startingBoundaryHops; + Integer16 boundaryHops; + UInteger8 managementMessageKey; + UInteger16 parameterLength; + UInteger16 recordKey; + + MsgManagementPayload payload; +} MsgManagement; + +typedef struct { + UInteger8 foreign_master_communication_technology; + Octet foreign_master_uuid[PTP_UUID_LENGTH]; + UInteger16 foreign_master_port_id; + UInteger16 foreign_master_syncs; + + MsgHeader header; + MsgSync sync; +} ForeignMasterRecord; + +/* main program data structure */ +typedef struct { + /* Default data set */ + UInteger8 clock_communication_technology; + Octet clock_uuid_field[PTP_UUID_LENGTH]; + UInteger16 clock_port_id_field; + UInteger8 clock_stratum; + Octet clock_identifier[PTP_CODE_STRING_LENGTH]; + Integer16 clock_variance; + Boolean clock_followup_capable; + Boolean preferred; + Boolean initializable; + Boolean external_timing; + Boolean is_boundary_clock; + Integer8 sync_interval; + Octet subdomain_name[PTP_SUBDOMAIN_NAME_LENGTH]; + UInteger16 number_ports; + UInteger16 number_foreign_records; + + /* Current data set */ + UInteger16 steps_removed; + TimeInternal offset_from_master; + TimeInternal one_way_delay; + + /* Parent data set */ + UInteger8 parent_communication_technology; + Octet parent_uuid[PTP_UUID_LENGTH]; + UInteger16 parent_port_id; + UInteger16 parent_last_sync_sequence_number; + Boolean parent_followup_capable; + Boolean parent_external_timing; + Integer16 parent_variance; + Boolean parent_stats; + Integer16 observed_variance; + Integer32 observed_drift; + Boolean utc_reasonable; + UInteger8 grandmaster_communication_technology; + Octet grandmaster_uuid_field[PTP_UUID_LENGTH]; + UInteger16 grandmaster_port_id_field; + UInteger8 grandmaster_stratum; + Octet grandmaster_identifier[PTP_CODE_STRING_LENGTH]; + Integer16 grandmaster_variance; + Boolean grandmaster_preferred; + Boolean grandmaster_is_boundary_clock; + UInteger16 grandmaster_sequence_number; + + /* Global time properties data set */ + Integer16 current_utc_offset; + Boolean leap_59; + Boolean leap_61; + UInteger16 epoch_number; + + /* Port configuration data set */ + UInteger8 port_state; + UInteger16 last_sync_event_sequence_number; + UInteger16 last_general_event_sequence_number; + Octet subdomain_address[SUBDOMAIN_ADDRESS_LENGTH]; + Octet event_port_address[PORT_ADDRESS_LENGTH]; + Octet general_port_address[PORT_ADDRESS_LENGTH]; + UInteger8 port_communication_technology; + Octet port_uuid_field[PTP_UUID_LENGTH]; + UInteger16 port_id_field; + Boolean burst_enabled; + + /* Foreign master data set */ + ForeignMasterRecord *foreign; + + /* Other things we need for the protocol */ + Boolean halfEpoch; + + Integer16 max_foreign_records; + Integer16 foreign_record_i; + Integer16 foreign_record_best; + Boolean record_update; + UInteger32 random_seed; + + MsgHeader msgTmpHeader; + + union { + MsgSync sync; + MsgFollowUp follow; + MsgDelayReq req; + MsgDelayResp resp; + MsgManagement manage; + } msgTmp; + + Octet msgObuf[PACKET_SIZE]; + Octet msgIbuf[PACKET_SIZE]; + + TimeInternal master_to_slave_delay; + TimeInternal slave_to_master_delay; + + TimeInternal delay_req_receive_time; + TimeInternal delay_req_send_time; + TimeInternal sync_receive_time; + + UInteger16 Q; + UInteger16 R; + + Boolean sentDelayReq; + UInteger16 sentDelayReqSequenceId; + Boolean waitingForFollow; + + offset_from_master_filter ofm_filt; + one_way_delay_filter owd_filt; + + Boolean message_activity; + + IntervalTimer itimer[TIMER_ARRAY_SIZE]; + + NetPath netPath; + +} PtpClock; + +/* program options set at run-time */ +typedef struct { + Integer8 syncInterval; + Octet subdomainName[PTP_SUBDOMAIN_NAME_LENGTH]; + Octet clockIdentifier[PTP_CODE_STRING_LENGTH]; + UInteger32 clockVariance; + UInteger8 clockStratum; + Boolean clockPreferred; + Integer16 currentUtcOffset; + UInteger16 epochNumber; + Octet ifaceName[IFACE_NAME_LENGTH]; + Boolean noResetClock; + Integer32 maxReset; /* Maximum number of nanoseconds to reset */ + Integer32 maxDelay; /* Maximum number of nanoseconds of delay */ + Boolean noAdjust; + Boolean displayStats; + Boolean csvStats; + Octet unicastAddress[NET_ADDRESS_LENGTH]; + Integer16 ap, ai; + Integer16 s; + TimeInternal inboundLatency, outboundLatency; + Integer16 max_foreign_records; + Boolean slaveOnly; + Boolean probe; + UInteger8 probe_management_key; + UInteger16 probe_record_key; + Boolean halfEpoch; +#ifndef NO_FILE_SYSTEM + char file[PATH_MAX]; +#endif + int logFd; + Boolean useSysLog; + int ttl; +#ifndef NO_FILE_SYSTEM + char recordFile[PATH_MAX]; + FILE *recordFP; +#endif +} RunTimeOpts; + +#endif diff --git a/third_party/ptpd-1.1.0/src/dep-tiva/constants_dep.h b/third_party/ptpd-1.1.0/src/dep-tiva/constants_dep.h new file mode 100644 index 0000000..952bddd --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep-tiva/constants_dep.h @@ -0,0 +1,87 @@ +/* constants_dep.h */ + +#ifndef CONSTANTS_DEP_H +#define CONSTANTS_DEP_H + +/* platform dependent */ + +#ifdef IF_NAMESIZE + #define IFACE_NAME_LENGTH IF_NAMESIZE +#else + #define IFACE_NAME_LENGTH 16 +#endif + +#ifdef INET_ADDRSTRLEN + #define NET_ADDRESS_LENGTH INET_ADDRSTRLEN +#else + #define NET_ADDRESS_LENGTH 16 +#endif + +#define IFCONF_LENGTH 10 + +#define PTPD_LSBF + +#define ADJ_MAX 10000000 + +/* UDP/IPv4 dependent */ + +#define SUBDOMAIN_ADDRESS_LENGTH 4 +#define PORT_ADDRESS_LENGTH 2 + +#define PACKET_SIZE 300 + +#define PTP_EVENT_PORT 319 +#define PTP_GENERAL_PORT 320 + +#define DEFAULT_PTP_DOMAIN_ADDRESS "224.0.1.129" +#define ALTERNATE_PTP_DOMAIN1_ADDRESS "224.0.1.130" +#define ALTERNATE_PTP_DOMAIN2_ADDRESS "224.0.1.131" +#define ALTERNATE_PTP_DOMAIN3_ADDRESS "224.0.1.132" + +#define HEADER_LENGTH 40 +#define SYNC_PACKET_LENGTH 124 +#define DELAY_REQ_PACKET_LENGTH 124 +#define FOLLOW_UP_PACKET_LENGTH 52 +#define DELAY_RESP_PACKET_LENGTH 60 +#define MANAGEMENT_PACKET_LENGTH 136 + +#define MM_STARTING_BOUNDARY_HOPS 0x7fff + +/* others */ + +#define SCREEN_BUFSZ 128 +#define SCREEN_MAXSZ 80 + +#define PBUF_QUEUE_SIZE 16 + +/* override default values */ +#ifdef DEFAULT_AP +# undef DEFAULT_AP +# define DEFAULT_AP 2 +#endif + +#ifdef DEFAULT_AI +# undef DEFAULT_AI +# define DEFAULT_AI 200 +#endif + +#define MAX_AP 10 +#define MAX_AI 1000 + +#ifdef DEFAULT_INBOUND_LATENCY +# undef DEFAULT_INBOUND_LATENCY +# define DEFAULT_INBOUND_LATENCY 16500 +#endif + +#ifdef DEFAULT_OUTBOUND_LATENCY +# undef DEFAULT_OUTBOUND_LATENCY +# define DEFAULT_OUTBOUND_LATENCY 16500 +#endif + +#ifdef CLOCK_FOLLOWUP +# undef CLOCK_FOLLOWUP +# define CLOCK_FOLLOWUP FALSE +#endif + +#endif /* #ifndef CONSTANTS_DEP_H */ + diff --git a/third_party/ptpd-1.1.0/src/dep-tiva/datatypes_dep.h b/third_party/ptpd-1.1.0/src/dep-tiva/datatypes_dep.h new file mode 100644 index 0000000..af9f67d --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep-tiva/datatypes_dep.h @@ -0,0 +1,42 @@ +/* datatypes_dep.h */ + +#ifndef DATATYPES_DEP_H +#define DATATYPES_DEP_H + +typedef enum {FALSE=0, TRUE} Boolean; +typedef char Octet; +typedef signed char Integer8; +typedef signed short Integer16; +typedef signed int Integer32; +typedef unsigned char UInteger8; +typedef unsigned short UInteger16; +typedef unsigned int UInteger32; + +typedef struct { + Integer32 nsec_prev, y; +} offset_from_master_filter; + +typedef struct { + Integer32 nsec_prev, y; + Integer32 s_exp; +} one_way_delay_filter; + +typedef struct { + void *pbuf[PBUF_QUEUE_SIZE]; + Integer32 get; + Integer32 put; + Integer32 count; +} BufQueue; + +typedef struct { + Integer32 multicastAddr; + Integer32 unicastAddr; + void *eventPcb; + void *generalPcb; + BufQueue eventQ; + BufQueue generalQ; + void *eventTxBuf; + void *generalTxBuf; +} NetPath; + +#endif diff --git a/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_dep.h b/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_dep.h new file mode 100644 index 0000000..10b297e --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_dep.h @@ -0,0 +1,138 @@ +/* ptpd_dep.h */ + +#ifndef PTPD_DEP_H +#define PTPD_DEP_H + +#include + +/* + * Remove the following #if 0 and its matching #endif to enable PTPd debug + * output on UART0. This is disabled by default even in debug builds due to + * the volume of information transmitted. + */ +#if 0 +#ifdef DEBUG +#include "utils/uartstdio.h" +#define PTPD_DBG +/* + * Define the following to enable verbose debug. + */ +#undef PTPD_DBGV +#endif +#endif + +#ifndef INT_MAX +#define INT_MAX 2147483647 +#endif +#ifndef size_t +#define size_t long +#endif +#ifndef ssize_t +#define ssize_t long +#endif + +/* system messages */ +#ifndef PTPD_DBG +#define ERROR(...) +#define PERROR(...) +#define NOTIFY(...) +#else +#define ERROR(x, ...) UARTprintf("(ptpd error) " x, ##__VA_ARGS__) +#define PERROR(x, ...) UARTprintf("(ptpd error) " x ": %m\n", ##__VA_ARGS__) +#define NOTIFY(x, ...) UARTprintf("(ptpd notice) " x, ##__VA_ARGS__) +#endif + +/* debug messages */ +#ifdef PTPD_DBGV +#define PTPD_DBG +#define DBGV(x, ...) UARTprintf("(ptpd debug) " x, ##__VA_ARGS__) +#else +#define DBGV(...) +#endif + +#ifdef PTPD_DBG +#define DBG(x, ...) UARTprintf("(ptpd debug) " x, ##__VA_ARGS__) +#else +#define DBG(...) +#endif + +/* endian corrections */ +#if defined(PTPD_MSBF) +#define shift8(x,y) ( (x) << ((3-y)<<3) ) +#define shift16(x,y) ( (x) << ((1-y)<<4) ) +#define flip16(x) (x) +#define flip32(x) (x) + +#elif defined(PTPD_LSBF) +#define shift8(x,y) ( (x) << ((y)<<3) ) +#define shift16(x,y) ( (x) << ((y)<<4) ) +#define flip16(x) ((((x) >> 8) & 0x00ff) | (((x) << 8) & 0xff00)) +#define flip32(x) ((((x) >> 24) & 0x000000ff) | \ + (((x) >> 8 ) & 0x0000ff00) | \ + (((x) << 8 ) & 0x00ff0000) | \ + (((x) << 24) & 0xff000000)) +#endif + + +/* bit array manipulation */ +#define getFlag(x,y) !!( *(UInteger8*)((x)+((y)<8?1:0)) & (1<<((y)<8?(y):(y)-8)) ) +#define setFlag(x,y) ( *(UInteger8*)((x)+((y)<8?1:0)) |= 1<<((y)<8?(y):(y)-8) ) +#define clearFlag(x,y) ( *(UInteger8*)((x)+((y)<8?1:0)) &= ~(1<<((y)<8?(y):(y)-8)) ) + + +#define labs(x) (((x) >= 0) ? (x) : -(x)) + +/* msg.c */ +Boolean msgPeek(char*,size_t); +void msgUnpackHeader(char*,MsgHeader*); +void msgUnpackSync(char*,MsgSync*); +void msgUnpackDelayReq(char*,MsgDelayReq*); +void msgUnpackFollowUp(char*,MsgFollowUp*); +void msgUnpackDelayResp(char*,MsgDelayResp*); +void msgUnpackManagement(char*,MsgManagement*); +UInteger8 msgUnloadManagement(char*,MsgManagement*,PtpClock*,RunTimeOpts*); +void msgUnpackManagementPayload(char *buf, MsgManagement *manage); +void msgPackHeader(char*,PtpClock*); +void msgPackSync(char*,Boolean,TimeRepresentation*,PtpClock*); +void msgPackDelayReq(char*,Boolean,TimeRepresentation*,PtpClock*); +void msgPackFollowUp(char*,UInteger16,TimeRepresentation*,PtpClock*); +void msgPackDelayResp(char*,MsgHeader*,TimeRepresentation*,PtpClock*); +UInteger16 msgPackManagement(char*,MsgManagement*,PtpClock*); +UInteger16 msgPackManagementResponse(char*,MsgHeader*,MsgManagement*,PtpClock*); + +/* net.c */ +Boolean netInit(NetPath*,RunTimeOpts*,PtpClock*); +Boolean netShutdown(NetPath*); +int netSelect(TimeInternal*,NetPath*); +size_t netRecvEvent(Octet*,TimeInternal*,NetPath*); +size_t netRecvGeneral(Octet*,NetPath*); +size_t netSendEvent(Octet*,UInteger16,NetPath*); +size_t netSendGeneral(Octet*,UInteger16,NetPath*); + +/* servo.c */ +void initClock(RunTimeOpts*,PtpClock*); +void updateDelay(TimeInternal*,TimeInternal*, + one_way_delay_filter*,RunTimeOpts*,PtpClock*); +void updateOffset(TimeInternal*,TimeInternal*, + offset_from_master_filter*,RunTimeOpts*,PtpClock*); +void updateClock(RunTimeOpts*,PtpClock*); + +/* sys.c */ +void displayStats(RunTimeOpts*,PtpClock*); +Boolean nanoSleep(TimeInternal*); +void getTime(TimeInternal*); +void setTime(TimeInternal*); +UInteger16 getRand(UInteger32*); +Boolean adjFreq(Integer32); + +/* timer.c */ +void initTimer(void); +void timerTick(int); +void timerUpdate(IntervalTimer*); +void timerStop(UInteger16,IntervalTimer*); +void timerStart(UInteger16,UInteger16,IntervalTimer*); +Boolean timerExpired(UInteger16,IntervalTimer*); + + +#endif + diff --git a/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_msg.c b/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_msg.c new file mode 100644 index 0000000..6827ec0 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_msg.c @@ -0,0 +1,655 @@ +/* ptpd_msg.c */ +/* see spec annex d */ + +#include "../ptpd.h" + +Boolean msgPeek(char *buf, size_t length) +{ + /* not imlpemented yet */ + return TRUE; +} + +void msgUnpackHeader(char *buf, MsgHeader *header) +{ + header->versionPTP = flip16(*(UInteger16*)(buf + 0)); + header->versionNetwork = flip16(*(UInteger16*)(buf + 2)); + DBGV("msgUnpackHeader: versionPTP %d\n", header->versionPTP); + DBGV("msgUnpackHeader: versionNetwork %d\n", header->versionNetwork); + + memcpy(header->subdomain, (buf + 4), 16); + DBGV("msgUnpackHeader: subdomain %s\n", header->subdomain); + + header->messageType = *(UInteger8*)(buf + 20); + header->sourceCommunicationTechnology = *(UInteger8*)(buf + 21); + DBGV("msgUnpackHeader: messageType %d\n", header->messageType); + DBGV("msgUnpackHeader: sourceCommunicationTechnology %d\n", header->sourceCommunicationTechnology); + + memcpy(header->sourceUuid, (buf + 22), 6); + DBGV("msgUnpackHeader: sourceUuid %02x:%02x:%02x:%02x:%02x:%02x\n", + header->sourceUuid[0], header->sourceUuid[1], header->sourceUuid[2], + header->sourceUuid[3], header->sourceUuid[4], header->sourceUuid[5]); + + header->sourcePortId = flip16(*(UInteger16*)(buf + 28)); + header->sequenceId = flip16(*(UInteger16*)(buf + 30)); + DBGV("msgUnpackHeader: sourcePortId %d\n", header->sourcePortId); + DBGV("msgUnpackHeader: sequenceId %d\n", header->sequenceId); + + header->control = *(UInteger8*)(buf + 32); + DBGV("msgUnpackHeader: control %d\n", header->control); + + memcpy(header->flags, (buf + 34), 2); + DBGV("msgUnpackHeader: flags %02x %02x\n", header->flags[0], header->flags[1]); +} + +void msgUnpackSync(char *buf, MsgSync *sync) +{ + sync->originTimestamp.seconds = flip32(*(UInteger32*)(buf + 40)); + DBG("msgUnpackSync: originTimestamp.seconds %u\n", sync->originTimestamp.seconds); + sync->originTimestamp.nanoseconds = flip32(*(Integer32*)(buf + 44)); + DBG("msgUnpackSync: originTimestamp.nanoseconds %d\n", sync->originTimestamp.nanoseconds); + sync->epochNumber = flip16(*(UInteger16*)(buf + 48)); + DBGV("msgUnpackSync: epochNumber %d\n", sync->epochNumber); + sync->currentUTCOffset = flip16(*(Integer16*)(buf + 50)); + DBGV("msgUnpackSync: currentUTCOffset %d\n", sync->currentUTCOffset); + sync->grandmasterCommunicationTechnology = *(UInteger8*)(buf + 53); + DBGV("msgUnpackSync: grandmasterCommunicationTechnology %d\n", sync->grandmasterCommunicationTechnology); + memcpy(sync->grandmasterClockUuid, (buf + 54), 6); + DBGV("msgUnpackSync: grandmasterClockUuid %02x:%02x:%02x:%02x:%02x:%02x\n", + sync->grandmasterClockUuid[0], sync->grandmasterClockUuid[1], sync->grandmasterClockUuid[2], + sync->grandmasterClockUuid[3], sync->grandmasterClockUuid[4], sync->grandmasterClockUuid[5]); + sync->grandmasterPortId = flip16(*(UInteger16*)(buf + 60)); + DBGV("msgUnpackSync: grandmasterPortId %d\n", sync->grandmasterPortId); + sync->grandmasterSequenceId = flip16(*(UInteger16*)(buf + 62)); + DBGV("msgUnpackSync: grandmasterSequenceId %d\n", sync->grandmasterSequenceId); + sync->grandmasterClockStratum = *(UInteger8*)(buf + 67); + DBGV("msgUnpackSync: grandmasterClockStratum %d\n", sync->grandmasterClockStratum); + memcpy(sync->grandmasterClockIdentifier, (buf + 68), 4); + DBGV("msgUnpackSync: grandmasterClockIdentifier %c%c%c%c\n", + sync->grandmasterClockIdentifier[0], sync->grandmasterClockIdentifier[1], + sync->grandmasterClockIdentifier[2], sync->grandmasterClockIdentifier[3]); + sync->grandmasterClockVariance = flip16(*(Integer16*)(buf + 74)); + DBGV("msgUnpackSync: grandmasterClockVariance %d\n", sync->grandmasterClockVariance); + sync->grandmasterPreferred = *(UInteger8*)(buf + 77); + DBGV("msgUnpackSync: grandmasterPreferred %d\n", sync->grandmasterPreferred); + sync->grandmasterIsBoundaryClock = *(UInteger8*)(buf + 79); + DBGV("msgUnpackSync: grandmasterIsBoundaryClock %d\n", sync->grandmasterIsBoundaryClock); + sync->syncInterval = *(Integer8*)(buf + 83); + DBGV("msgUnpackSync: syncInterval %d\n", sync->syncInterval); + sync->localClockVariance = flip16(*(Integer16*)(buf + 86)); + DBGV("msgUnpackSync: localClockVariance %d\n", sync->localClockVariance); + sync->localStepsRemoved = flip16(*(UInteger16*)(buf + 90)); + DBGV("msgUnpackSync: localStepsRemoved %d\n", sync->localStepsRemoved); + sync->localClockStratum = *(UInteger8*)(buf + 95); + DBGV("msgUnpackSync: localClockStratum %d\n", sync->localClockStratum); + memcpy(sync->localClockIdentifer, (buf + 96), PTP_CODE_STRING_LENGTH); + DBGV("msgUnpackSync: localClockIdentifer %c%c%c%c\n", + sync->localClockIdentifer[0], sync->localClockIdentifer[1], + sync->localClockIdentifer[2], sync->localClockIdentifer[3]); + sync->parentCommunicationTechnology = *(UInteger8*)(buf + 101); + DBGV("msgUnpackSync: parentCommunicationTechnology %d\n", sync->parentCommunicationTechnology); + memcpy(sync->parentUuid, (buf + 102), PTP_UUID_LENGTH); + DBGV("msgUnpackSync: parentUuid %02x:%02x:%02x:%02x:%02x:%02x\n", + sync->parentUuid[0], sync->parentUuid[1], sync->parentUuid[2], + sync->parentUuid[3], sync->parentUuid[4], sync->parentUuid[5]); + sync->parentPortField = flip16(*(UInteger16*)(buf + 110)); + DBGV("msgUnpackSync: parentPortField %d\n", sync->parentPortField); + sync->estimatedMasterVariance = flip16(*(Integer16*)(buf + 114)); + DBGV("msgUnpackSync: estimatedMasterVariance %d\n", sync->estimatedMasterVariance); + sync->estimatedMasterDrift = flip32(*(Integer32*)(buf + 116)); + DBGV("msgUnpackSync: estimatedMasterDrift %d\n", sync->estimatedMasterDrift); + sync->utcReasonable = *(UInteger8*)(buf + 123); + DBGV("msgUnpackSync: utcReasonable %d\n", sync->utcReasonable); +} + +void msgUnpackDelayReq(char *buf, MsgDelayReq *req) {} + +void msgUnpackFollowUp(char *buf, MsgFollowUp *follow) +{ + follow->associatedSequenceId = flip16(*(UInteger16*)(buf + 42)); + DBGV("msgUnpackFollowUp: associatedSequenceId %u\n", follow->associatedSequenceId); + follow->preciseOriginTimestamp.seconds = flip32(*(UInteger32*)(buf + 44)); + DBG("msgUnpackFollowUp: preciseOriginTimestamp.seconds %u\n", follow->preciseOriginTimestamp.seconds); + follow->preciseOriginTimestamp.nanoseconds = flip32(*(Integer32*)(buf + 48)); + DBG("msgUnpackFollowUp: preciseOriginTimestamp.nanoseconds %d\n", follow->preciseOriginTimestamp.nanoseconds); +} + +void msgUnpackDelayResp(char *buf, MsgDelayResp *resp) +{ + resp->delayReceiptTimestamp.seconds = flip32(*(UInteger32*)(buf + 40)); + DBGV("msgUnpackDelayResp: delayReceiptTimestamp.seconds %u\n", resp->delayReceiptTimestamp.seconds); + resp->delayReceiptTimestamp.nanoseconds = flip32(*(Integer32*)(buf + 44)); + DBGV("msgUnpackDelayResp: delayReceiptTimestamp.nanoseconds %d\n", resp->delayReceiptTimestamp.nanoseconds); + resp->requestingSourceCommunicationTechnology = *(UInteger8*)(buf + 49); + DBGV("msgUnpackDelayResp: requestingSourceCommunicationTechnology %d\n", resp->requestingSourceCommunicationTechnology); + memcpy(resp->requestingSourceUuid, (buf + 50), 6); + DBGV("msgUnpackDelayResp: requestingSourceUuid %02x:%02x:%02x:%02x:%02x:%02x\n", + resp->requestingSourceUuid[0], resp->requestingSourceUuid[1], resp->requestingSourceUuid[2], + resp->requestingSourceUuid[3], resp->requestingSourceUuid[4], resp->requestingSourceUuid[5]); + resp->requestingSourcePortId = flip16(*(UInteger16*)(buf + 56)); + DBGV("msgUnpackDelayResp: requestingSourcePortId %d\n", resp->requestingSourcePortId); + resp->requestingSourceSequenceId = flip16(*(UInteger16*)(buf + 58)); + DBGV("msgUnpackDelayResp: requestingSourceSequenceId %d\n", resp->requestingSourceSequenceId); +} + +void msgUnpackManagement(char *buf, MsgManagement *manage) +{ + manage->targetCommunicationTechnology = *(UInteger8*)(buf + 41); + DBGV("msgUnpackManagement: targetCommunicationTechnology %d\n", manage->targetCommunicationTechnology); + memcpy(manage->targetUuid, (buf + 42), 6); + DBGV("msgUnpackManagement: targetUuid %02x:%02x:%02x:%02x:%02x:%02x\n", + manage->targetUuid[0], manage->targetUuid[1], manage->targetUuid[2], + manage->targetUuid[3], manage->targetUuid[4], manage->targetUuid[5]); + manage->targetPortId = flip16(*(UInteger16*)(buf + 48)); + DBGV("msgUnpackManagement: targetPortId %d\n", manage->targetPortId); + manage->startingBoundaryHops = flip16(*(Integer16*)(buf + 50)); + DBGV("msgUnpackManagement: startingBoundaryHops %d\n", manage->startingBoundaryHops); + manage->boundaryHops = flip16(*(Integer16*)(buf + 52)); + DBGV("msgUnpackManagement: boundaryHops %d\n", manage->boundaryHops); + manage->managementMessageKey = *(UInteger8*)(buf + 55); + DBGV("msgUnpackManagement: managementMessageKey %d\n", manage->managementMessageKey); + manage->parameterLength = flip16(*(UInteger16*)(buf + 58)); + DBGV("msgUnpackManagement: parameterLength %d\n", manage->parameterLength); + + if(manage->managementMessageKey == PTP_MM_GET_FOREIGN_DATA_SET) + manage->recordKey = flip16(*(UInteger16*)(buf + 62)); +} + +UInteger8 msgUnloadManagement(char *buf, MsgManagement *manage, + PtpClock *ptpClock, RunTimeOpts *rtOpts) +{ + TimeInternal internalTime; + TimeRepresentation externalTime; + + switch(manage->managementMessageKey) + { + case PTP_MM_INITIALIZE_CLOCK: + if(ptpClock->initializable) + return PTP_INITIALIZING; + break; + + case PTP_MM_GOTO_FAULTY_STATE: + DBG("event FAULT_DETECTED (forced by management message)\n"); + return PTP_FAULTY; + break; + + case PTP_MM_DISABLE_PORT: + if(manage->targetPortId == 1) + { + DBG("event DESIGNATED_DISABLED\n"); + return PTP_DISABLED; + } + break; + + case PTP_MM_ENABLE_PORT: + if(manage->targetPortId == 1) + { + DBG("event DESIGNATED_ENABLED\n"); + return PTP_INITIALIZING; + } + break; + + case PTP_MM_CLEAR_DESIGNATED_PREFERRED_MASTER: + ptpClock->preferred = FALSE; + break; + + case PTP_MM_SET_DESIGNATED_PREFERRED_MASTER: + ptpClock->preferred = TRUE; + break; + + case PTP_MM_DISABLE_BURST: + break; + + case PTP_MM_ENABLE_BURST: + break; + + case PTP_MM_SET_SYNC_INTERVAL: + rtOpts->syncInterval = *(Integer8*)(buf + 63); + break; + + case PTP_MM_SET_SUBDOMAIN: + memcpy(rtOpts->subdomainName, buf + 60, 16); + DBG("set subdomain to %s\n", rtOpts->subdomainName); + break; + + case PTP_MM_SET_TIME: + externalTime.seconds = flip32(*(UInteger32*)(buf + 60)); + externalTime.nanoseconds = flip32(*(Integer32*)(buf + 64)); + toInternalTime(&internalTime, &externalTime, &ptpClock->halfEpoch); + setTime(&internalTime); + break; + + case PTP_MM_UPDATE_DEFAULT_DATA_SET: + if(!rtOpts->slaveOnly) + ptpClock->clock_stratum = *(UInteger8*)(buf + 63); + memcpy(ptpClock->clock_identifier, buf + 64, 4); + ptpClock->clock_variance = flip16(*(Integer16*)(buf + 70)); + ptpClock->preferred = *(UInteger8*)(buf + 75); + rtOpts->syncInterval = *(UInteger8*)(buf + 79); + memcpy(rtOpts->subdomainName, buf + 80, 16); + break; + + case PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES: + ptpClock->current_utc_offset = flip16(*(Integer16*)(buf + 62)); + ptpClock->leap_59 = *(UInteger8*)(buf + 67); + ptpClock->leap_61 = *(UInteger8*)(buf + 71); + ptpClock->epoch_number = flip16(*(UInteger16*)(buf + 74)); + break; + + default: + break; + } + + return ptpClock->port_state; +} + +void msgUnpackManagementPayload(char *buf, MsgManagement *manage) +{ + switch(manage->managementMessageKey) + { + case PTP_MM_CLOCK_IDENTITY: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_CLOCK_IDENTITY\n"); + manage->payload.clockIdentity.clockCommunicationTechnology = *(UInteger8*)(buf + 63); + memcpy(manage->payload.clockIdentity.clockUuidField, buf + 64, PTP_UUID_LENGTH); + manage->payload.clockIdentity.clockPortField = flip16(*(UInteger16*)(buf + 74)); + memcpy(manage->payload.clockIdentity.manufacturerIdentity, buf + 76, MANUFACTURER_ID_LENGTH); + break; + + case PTP_MM_DEFAULT_DATA_SET: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_DEFAULT_DATA_SET\n"); + manage->payload.defaultData.clockCommunicationTechnology = *(UInteger8*)(buf + 63); + memcpy(manage->payload.defaultData.clockUuidField, buf + 64, PTP_UUID_LENGTH); + manage->payload.defaultData.clockPortField = flip16(*(UInteger16*)(buf + 74)); + manage->payload.defaultData.clockStratum = *(UInteger16*)(buf + 79); + memcpy(manage->payload.defaultData.clockIdentifier, buf + 80, PTP_CODE_STRING_LENGTH); + manage->payload.defaultData.clockVariance = flip16(*(UInteger16*)(buf + 86)); + manage->payload.defaultData.clockFollowupCapable = *(UInteger8*)(buf + 91); + manage->payload.defaultData.preferred = *(UInteger8*)(buf + 95); + manage->payload.defaultData.initializable = *(UInteger8*)(buf + 99); + manage->payload.defaultData.externalTiming = *(UInteger8*)(buf + 103); + manage->payload.defaultData.isBoundaryClock = *(UInteger8*)(buf + 107); + manage->payload.defaultData.syncInterval = *(UInteger8*)(buf + 111); + memcpy(manage->payload.defaultData.subdomainName, buf + 112, PTP_SUBDOMAIN_NAME_LENGTH); + manage->payload.defaultData.numberPorts = flip16(*(UInteger16*)(buf + 130)); + manage->payload.defaultData.numberForeignRecords = flip16(*(UInteger16*)(buf + 134)); + break; + + case PTP_MM_CURRENT_DATA_SET: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_CURRENT_DATA_SET\n"); + manage->payload.current.stepsRemoved = flip16(*(UInteger16*)(buf + 62)); + manage->payload.current.offsetFromMaster.seconds = flip32(*(UInteger32*)(buf + 64)); + manage->payload.current.offsetFromMaster.nanoseconds = flip32(*(UInteger32*)(buf + 68)); + manage->payload.current.oneWayDelay.seconds = flip32(*(UInteger32*)(buf + 72)); + manage->payload.current.oneWayDelay.nanoseconds = flip32(*(Integer32*)(buf + 76)); + break; + + case PTP_MM_PARENT_DATA_SET: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_PORT_DATA_SET\n"); + manage->payload.parent.parentCommunicationTechnology = *(UInteger8*)(buf + 63); + memcpy(manage->payload.parent.parentUuid, buf + 64, PTP_UUID_LENGTH); + manage->payload.parent.parentPortId = flip16(*(UInteger16*)(buf + 74)); + manage->payload.parent.parentLastSyncSequenceNumber = flip16(*(UInteger16*)(buf + 74)); + manage->payload.parent.parentFollowupCapable = *(UInteger8*)(buf + 83); + manage->payload.parent.parentExternalTiming = *(UInteger8*)(buf + 87); + manage->payload.parent.parentVariance = flip16(*(UInteger16*)(buf + 90)); + manage->payload.parent.parentStats = *(UInteger8*)(buf + 85); + manage->payload.parent.observedVariance = flip16(*(Integer16*)(buf + 98)); + manage->payload.parent.observedDrift = flip32(*(Integer32*)(buf + 100)); + manage->payload.parent.utcReasonable = *(UInteger8*)(buf + 107); + manage->payload.parent.grandmasterCommunicationTechnology = *(UInteger8*)(buf + 111); + memcpy(manage->payload.parent.grandmasterUuidField, buf + 112, PTP_UUID_LENGTH); + manage->payload.parent.grandmasterPortIdField = flip16(*(UInteger16*)(buf + 122)); + manage->payload.parent.grandmasterStratum = *(UInteger8*)(buf + 127); + memcpy(manage->payload.parent.grandmasterIdentifier, buf + 128, PTP_CODE_STRING_LENGTH); + manage->payload.parent.grandmasterVariance = flip16(*(Integer16*)(buf + 134)); + manage->payload.parent.grandmasterPreferred = *(UInteger8*)(buf + 139); + manage->payload.parent.grandmasterIsBoundaryClock = *(UInteger8*)(buf + 144); + manage->payload.parent.grandmasterSequenceNumber = flip16(*(UInteger16*)(buf + 146)); + break; + + case PTP_MM_PORT_DATA_SET: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_FOREIGN_DATA_SET\n"); + manage->payload.port.returnedPortNumber = flip16(*(UInteger16*)(buf + 62)); + manage->payload.port.portState = *(UInteger8*)(buf + 67); + manage->payload.port.lastSyncEventSequenceNumber = flip16(*(UInteger16*)(buf + 70)); + manage->payload.port.lastGeneralEventSequenceNumber = flip16(*(UInteger16*)(buf + 74)); + manage->payload.port.portCommunicationTechnology = *(UInteger8*)(buf + 79); + memcpy(manage->payload.port.portUuidField, buf + 80, PTP_UUID_LENGTH); + manage->payload.port.portIdField = flip16(*(UInteger16*)(buf + 90)); + manage->payload.port.burstEnabled = *(UInteger8*)(buf + 95); + manage->payload.port.subdomainAddressOctets = *(UInteger8*)(buf + 97); + manage->payload.port.eventPortAddressOctets = *(UInteger8*)(buf + 98); + manage->payload.port.generalPortAddressOctets = *(UInteger8*)(buf + 99); + memcpy(manage->payload.port.subdomainAddress, buf + 100, SUBDOMAIN_ADDRESS_LENGTH); + memcpy(manage->payload.port.eventPortAddress, buf + 106, PORT_ADDRESS_LENGTH); + memcpy(manage->payload.port.generalPortAddress, buf + 110, PORT_ADDRESS_LENGTH); + break; + + case PTP_MM_GLOBAL_TIME_DATA_SET: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_GLOBAL_TIME_DATA_SET\n"); + manage->payload.globalTime.localTime.seconds = flip32(*(UInteger32*)(buf + 60)); + manage->payload.globalTime.localTime.nanoseconds = flip32(*(Integer32*)(buf + 64)); + manage->payload.globalTime.currentUtcOffset = flip16(*(Integer16*)(buf + 70)); + manage->payload.globalTime.leap59 = *(UInteger8*)(buf + 75); + manage->payload.globalTime.leap61 = *(UInteger8*)(buf + 79); + manage->payload.globalTime.epochNumber = flip16(*(UInteger16*)(buf + 82)); + break; + + + case PTP_MM_FOREIGN_DATA_SET: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_FOREIGN_DATA_SET\n"); + manage->payload.foreign.returnedPortNumber = flip16(*(UInteger16*)(buf + 62)); + manage->payload.foreign.returnedRecordNumber = flip16(*(UInteger16*)(buf + 68)); + manage->payload.foreign.foreignMasterCommunicationTechnology = *(UInteger8*)(buf + 71); + memcpy(manage->payload.foreign.foreignMasterUuid, buf + 72, PTP_UUID_LENGTH); + manage->payload.foreign.foreignMasterPortId = flip16(*(UInteger16*)(buf + 82)); + manage->payload.foreign.foreignMasterSyncs = flip16(*(UInteger16*)(buf + 66)); + break; + + case PTP_MM_NULL: + DBGV("msgUnloadManagementPayload: managementMessageKey NULL\n"); + break; + + default: + DBGV("msgUnloadManagementPayload: managementMessageKey ?\n"); + break; + } + + return; +} + +void msgPackHeader(char *buf, PtpClock *ptpClock) +{ + *(Integer32*)(buf + 0) = shift16(flip16(VERSION_PTP), 0) | shift16(flip16(VERSION_NETWORK), 1); + memcpy((buf + 4), ptpClock->subdomain_name, 16); + *(Integer32*)(buf + 20) = shift8(ptpClock->port_communication_technology, 1); + memcpy((buf + 22), ptpClock->port_uuid_field, 6); + + if(ptpClock->external_timing) + setFlag((buf + 34), PTP_EXT_SYNC); + if(ptpClock->clock_followup_capable) + setFlag((buf + 34), PTP_ASSIST); + if(ptpClock->is_boundary_clock) + setFlag((buf + 34), PTP_BOUNDARY_CLOCK); +} + +void msgPackSync(char *buf, Boolean burst, + TimeRepresentation *originTimestamp, PtpClock *ptpClock) +{ + *(UInteger8*)(buf +20) = 1; /* messageType */ + *(Integer32*)(buf + 28) = shift16(flip16(ptpClock->port_id_field), 0) | shift16(flip16(ptpClock->last_sync_event_sequence_number), 1); + *(UInteger8*)(buf +32) = PTP_SYNC_MESSAGE; /* control */ + if(ptpClock->burst_enabled && burst) + setFlag((buf + 34), PTP_SYNC_BURST); + else + clearFlag((buf + 34), PTP_SYNC_BURST); + if(ptpClock->parent_stats) + setFlag((buf + 34), PARENT_STATS); + else + clearFlag((buf + 34), PARENT_STATS); + + + *(Integer32*)(buf + 40) = flip32(originTimestamp->seconds); + *(Integer32*)(buf + 44) = flip32(originTimestamp->nanoseconds); + *(Integer32*)(buf + 48) = shift16(flip16(ptpClock->epoch_number), 0) | shift16(flip16(ptpClock->current_utc_offset), 1); + *(Integer32*)(buf + 52) = shift8(ptpClock->grandmaster_communication_technology, 1); + memcpy((buf + 54), ptpClock->grandmaster_uuid_field, 6); + *(Integer32*)(buf + 60) = shift16(flip16(ptpClock->grandmaster_port_id_field), 0) | shift16(flip16(ptpClock->grandmaster_sequence_number), 1); + *(Integer32*)(buf + 64) = shift8(ptpClock->grandmaster_stratum, 3); + memcpy((buf + 68), ptpClock->grandmaster_identifier, 4); + *(Integer32*)(buf + 72) = shift16(flip16(ptpClock->grandmaster_variance), 1); + *(Integer32*)(buf + 76) = shift16(flip16(ptpClock->grandmaster_preferred), 0) | shift16(flip16(ptpClock->grandmaster_is_boundary_clock), 1); + *(Integer32*)(buf + 80) = shift16(flip16(ptpClock->sync_interval), 1); + *(Integer32*)(buf + 84) = shift16(flip16(ptpClock->clock_variance), 1); + *(Integer32*)(buf + 88) = shift16(flip16(ptpClock->steps_removed), 1); + *(Integer32*)(buf + 92) = shift8(ptpClock->clock_stratum, 3); + memcpy((buf + 96), ptpClock->clock_identifier, 4); + *(Integer32*)(buf + 100) = shift8(ptpClock->parent_communication_technology, 1); + memcpy((buf + 102), ptpClock->parent_uuid, 6); + *(Integer32*)(buf + 108) = shift16(flip16(ptpClock->parent_port_id), 1); + *(Integer32*)(buf + 112) = shift16(flip16(ptpClock->observed_variance), 1); + *(Integer32*)(buf + 116) = flip32(ptpClock->observed_drift); + *(Integer32*)(buf + 120) = shift8(ptpClock->utc_reasonable, 3); +} + +void msgPackDelayReq(char *buf, Boolean burst, + TimeRepresentation *originTimestamp, PtpClock *ptpClock) +{ + *(UInteger8*)(buf + 20) = 1; /* messageType */ + *(Integer32*)(buf + 28) = shift16(flip16(ptpClock->port_id_field), 0) | shift16(flip16(ptpClock->last_sync_event_sequence_number), 1); + *(UInteger8*)(buf + 32) = PTP_DELAY_REQ_MESSAGE; /* control */ + if(ptpClock->burst_enabled && burst) + setFlag((buf + 34), PTP_SYNC_BURST); + else + clearFlag((buf + 34), PTP_SYNC_BURST); + if(ptpClock->parent_stats) + setFlag((buf + 34), PARENT_STATS); + else + clearFlag((buf + 34), PARENT_STATS); + + *(Integer32*)(buf + 40) = flip32(originTimestamp->seconds); + *(Integer32*)(buf + 44) = flip32(originTimestamp->nanoseconds); + *(Integer32*)(buf + 48) = shift16(flip16(ptpClock->epoch_number), 0) | shift16(flip16(ptpClock->current_utc_offset), 1); + *(Integer32*)(buf + 52) = shift8(ptpClock->grandmaster_communication_technology, 1); + memcpy((buf + 54), ptpClock->grandmaster_uuid_field, 6); + *(Integer32*)(buf + 60) = shift16(flip16(ptpClock->grandmaster_port_id_field), 0) | shift16(flip16(ptpClock->grandmaster_sequence_number), 1); + *(Integer32*)(buf + 64) = shift8(ptpClock->grandmaster_stratum, 3); + memcpy((buf + 68), ptpClock->grandmaster_identifier, 4); + *(Integer32*)(buf + 72) = shift16(flip16(ptpClock->grandmaster_variance), 1); + *(Integer32*)(buf + 76) = shift16(flip16(ptpClock->grandmaster_preferred), 0) | shift16(flip16(ptpClock->grandmaster_is_boundary_clock), 1); + *(Integer32*)(buf + 80) = shift16(flip16(ptpClock->sync_interval), 1); + *(Integer32*)(buf + 84) = shift16(flip16(ptpClock->clock_variance), 1); + *(Integer32*)(buf + 88) = shift16(flip16(ptpClock->steps_removed), 1); + *(Integer32*)(buf + 92) = shift8(ptpClock->clock_stratum, 3); + memcpy((buf + 96), ptpClock->clock_identifier, 4); + *(Integer32*)(buf + 100) = shift8(ptpClock->parent_communication_technology, 1); + memcpy((buf + 102), ptpClock->parent_uuid, 6); + *(Integer32*)(buf + 108) = shift16(flip16(ptpClock->parent_port_id), 1); + *(Integer32*)(buf + 112) = shift16(flip16(ptpClock->observed_variance), 1); + *(Integer32*)(buf + 116) = flip32(ptpClock->observed_drift); + *(Integer32*)(buf + 120) = shift8(ptpClock->utc_reasonable, 3); +} + +void msgPackFollowUp(char *buf, UInteger16 associatedSequenceId, + TimeRepresentation *preciseOriginTimestamp, PtpClock *ptpClock) +{ + *(UInteger8*)(buf + 20) = 2; /* messageType */ + *(Integer32*)(buf + 28) = shift16(flip16(ptpClock->port_id_field), 0) | shift16(flip16(ptpClock->last_general_event_sequence_number), 1); + *(UInteger8*)(buf + 32) = PTP_FOLLOWUP_MESSAGE; /* control */ + clearFlag((buf + 34), PTP_SYNC_BURST); + clearFlag((buf + 34), PARENT_STATS); + + *(Integer32*)(buf + 40) = shift16(flip16(associatedSequenceId), 1); + *(Integer32*)(buf + 44) = flip32(preciseOriginTimestamp->seconds); + *(Integer32*)(buf + 48) = flip32(preciseOriginTimestamp->nanoseconds); +} + +void msgPackDelayResp(char *buf, MsgHeader *header, + TimeRepresentation *delayReceiptTimestamp, PtpClock *ptpClock) +{ + *(UInteger8*)(buf + 20) = 2; /* messageType */ + *(Integer32*)(buf + 28) = shift16(flip16(ptpClock->port_id_field), 0) | shift16(flip16(ptpClock->last_general_event_sequence_number), 1); + *(UInteger8*)(buf + 32) = PTP_DELAY_RESP_MESSAGE; /* control */ + clearFlag((buf + 34), PTP_SYNC_BURST); + clearFlag((buf + 34), PARENT_STATS); + + *(Integer32*)(buf + 40) = flip32(delayReceiptTimestamp->seconds); + *(Integer32*)(buf + 44) = flip32(delayReceiptTimestamp->nanoseconds); + *(Integer32*)(buf + 48) = shift8(header->sourceCommunicationTechnology, 1); + memcpy(buf + 50, header->sourceUuid, 6); + *(Integer32*)(buf + 56) = shift16(flip16(header->sourcePortId), 0) | shift16(flip16(header->sequenceId), 1); +} + +UInteger16 msgPackManagement(char *buf, MsgManagement *manage, PtpClock *ptpClock) +{ + *(UInteger8*)(buf + 20) = 2; /* messageType */ + *(Integer32*)(buf + 28) = shift16(flip16(ptpClock->port_id_field), 0) | shift16(flip16(ptpClock->last_general_event_sequence_number), 1); + *(UInteger8*)(buf + 32) = PTP_MANAGEMENT_MESSAGE; /* control */ + clearFlag((buf + 34), PTP_SYNC_BURST); + clearFlag((buf + 34), PARENT_STATS); + *(Integer32*)(buf + 40) = shift8(manage->targetCommunicationTechnology, 1); + memcpy(buf + 42, manage->targetUuid, 6); + *(Integer32*)(buf + 48) = shift16(flip16(manage->targetPortId), 0) | shift16(flip16(MM_STARTING_BOUNDARY_HOPS), 1); + *(Integer32*)(buf + 52) = shift16(flip16(MM_STARTING_BOUNDARY_HOPS), 0); + + *(UInteger8*)(buf + 55) = manage->managementMessageKey; + + switch(manage->managementMessageKey) + { + case PTP_MM_GET_FOREIGN_DATA_SET: + *(UInteger16*)(buf + 62) = manage->recordKey; + *(Integer32*)(buf + 56) = shift16(flip16(4), 1); + return 64; + + default: + *(Integer32*)(buf + 56) = shift16(flip16(0), 1); + return 60; + } +} + +UInteger16 msgPackManagementResponse(char *buf, MsgHeader *header, MsgManagement *manage, PtpClock *ptpClock) +{ + TimeInternal internalTime; + TimeRepresentation externalTime; + + *(UInteger8*)(buf + 20) = 2; /* messageType */ + *(Integer32*)(buf + 28) = shift16(flip16(ptpClock->port_id_field), 0) | shift16(flip16(ptpClock->last_general_event_sequence_number), 1); + *(UInteger8*)(buf + 32) = PTP_MANAGEMENT_MESSAGE; /* control */ + clearFlag((buf + 34), PTP_SYNC_BURST); + clearFlag((buf + 34), PARENT_STATS); + *(Integer32*)(buf + 40) = shift8(header->sourceCommunicationTechnology, 1); + memcpy(buf + 42, header->sourceUuid, 6); + *(Integer32*)(buf + 48) = shift16(flip16(header->sourcePortId), 0) | shift16(flip16(MM_STARTING_BOUNDARY_HOPS), 1); + *(Integer32*)(buf + 52) = shift16(flip16(manage->startingBoundaryHops - manage->boundaryHops + 1), 0); + + switch(manage->managementMessageKey) + { + case PTP_MM_OBTAIN_IDENTITY: + *(UInteger8*)(buf + 55) = PTP_MM_CLOCK_IDENTITY; + *(Integer32*)(buf + 56) = shift16(flip16(64), 1); + *(Integer32*)(buf + 60) = shift8(ptpClock->clock_communication_technology, 3); + memcpy(buf + 64, ptpClock->clock_uuid_field, 6); + *(Integer32*)(buf + 72) = shift16(flip16(ptpClock->clock_port_id_field), 1); + memcpy((buf + 76), MANUFACTURER_ID, 48); + return 124; + + case PTP_MM_GET_DEFAULT_DATA_SET: + *(UInteger8*)(buf + 55) = PTP_MM_DEFAULT_DATA_SET; + *(Integer32*)(buf + 56) = shift16(flip16(76), 1); + *(Integer32*)(buf + 60) = shift8(ptpClock->clock_communication_technology, 3); + memcpy(buf + 64, ptpClock->clock_uuid_field, 6); + *(Integer32*)(buf + 72) = shift16(flip16(ptpClock->clock_port_id_field), 1); + *(Integer32*)(buf + 76) = shift8(ptpClock->clock_stratum, 3); + memcpy(buf + 80, ptpClock->clock_identifier, 4); + *(Integer32*)(buf + 84) = shift16(flip16(ptpClock->clock_variance), 1); + *(Integer32*)(buf + 88) = shift8(ptpClock->clock_followup_capable, 3); + *(Integer32*)(buf + 92) = shift8(ptpClock->preferred, 3); + *(Integer32*)(buf + 96) = shift8(ptpClock->initializable, 3); + *(Integer32*)(buf + 100) = shift8(ptpClock->external_timing, 3); + *(Integer32*)(buf + 104) = shift8(ptpClock->is_boundary_clock, 3); + *(Integer32*)(buf + 108) = shift8(ptpClock->sync_interval, 3); + memcpy(buf + 112, ptpClock->subdomain_name, 16); + *(Integer32*)(buf + 128) = shift16(flip16(ptpClock->number_ports), 1); + *(Integer32*)(buf + 132) = shift16(flip16(ptpClock->number_foreign_records), 1); + return 136; + + case PTP_MM_GET_CURRENT_DATA_SET: + *(UInteger8*)(buf + 55) = PTP_MM_CURRENT_DATA_SET; + *(Integer32*)(buf + 56) = shift16(flip16(20), 1); + *(Integer32*)(buf + 60) = shift16(flip16(ptpClock->steps_removed), 1); + + fromInternalTime(&ptpClock->offset_from_master, &externalTime, 0); + *(Integer32*)(buf + 64) = flip32(externalTime.seconds); + *(Integer32*)(buf + 68) = flip32(externalTime.nanoseconds); + + fromInternalTime(&ptpClock->one_way_delay, &externalTime, 0); + *(Integer32*)(buf + 72) = flip32(externalTime.seconds); + *(Integer32*)(buf + 76) = flip32(externalTime.nanoseconds); + return 80; + + case PTP_MM_GET_PARENT_DATA_SET: + *(UInteger8*)(buf + 55) = PTP_MM_PARENT_DATA_SET; + *(Integer32*)(buf + 56) = shift16(flip16(90), 1); + *(Integer32*)(buf + 60) = shift8(ptpClock->parent_communication_technology, 3); + memcpy(buf + 64, ptpClock->parent_uuid, 6); + *(Integer32*)(buf + 72) = shift16(flip16(ptpClock->parent_port_id), 1); + *(Integer32*)(buf + 76) = shift16(flip16(ptpClock->parent_last_sync_sequence_number), 1); + *(Integer32*)(buf + 80) = shift8(ptpClock->parent_followup_capable, 1); + *(Integer32*)(buf + 84) = shift8(ptpClock->parent_external_timing, 3); + *(Integer32*)(buf + 88) = shift16(flip16(ptpClock->parent_variance), 1); + *(Integer32*)(buf + 92) = shift8(ptpClock->parent_stats, 3); + *(Integer32*)(buf + 96) = shift16(flip16(ptpClock->observed_variance), 1); + *(Integer32*)(buf + 100) = flip32(ptpClock->observed_drift); + *(Integer32*)(buf + 104) = shift8(ptpClock->utc_reasonable, 3); + *(Integer32*)(buf + 108) = shift8(ptpClock->grandmaster_communication_technology, 3); + memcpy(buf + 112, ptpClock->grandmaster_uuid_field, 6); + *(Integer32*)(buf + 120) = shift16(flip16(ptpClock->grandmaster_port_id_field), 1); + *(Integer32*)(buf + 124) = shift8(ptpClock->grandmaster_stratum, 3); + memcpy(buf + 128, ptpClock->grandmaster_identifier, 4); + *(Integer32*)(buf + 132) = shift16(flip16(ptpClock->grandmaster_variance), 1); + *(Integer32*)(buf + 136) = shift8(ptpClock->grandmaster_preferred, 3); + *(Integer32*)(buf + 140) = shift8(ptpClock->grandmaster_is_boundary_clock, 3); + *(Integer32*)(buf + 144) = shift16(flip16(ptpClock->grandmaster_sequence_number), 1); + return 148; + + case PTP_MM_GET_PORT_DATA_SET: + if(manage->targetPortId && manage->targetPortId != ptpClock->port_id_field) + { + *(UInteger8*)(buf + 55) = PTP_MM_NULL; + *(Integer32*)(buf + 56) = shift16(flip16(0), 1); + return 0; + } + + *(UInteger8*)(buf + 55) = PTP_MM_PORT_DATA_SET; + *(Integer32*)(buf + 56) = shift16(flip16(52), 1); + *(Integer32*)(buf + 60) = shift16(flip16(ptpClock->port_id_field), 1); + *(Integer32*)(buf + 64) = shift8(ptpClock->port_state, 3); + *(Integer32*)(buf + 68) = shift16(flip16(ptpClock->last_sync_event_sequence_number), 1); + *(Integer32*)(buf + 72) = shift16(flip16(ptpClock->last_general_event_sequence_number), 1); + *(Integer32*)(buf + 76) = shift8(ptpClock->port_communication_technology, 3); + memcpy(buf + 80, ptpClock->port_uuid_field, 6); + *(Integer32*)(buf + 88) = shift16(flip16(ptpClock->port_id_field), 1); + *(Integer32*)(buf + 92) = shift8(ptpClock->burst_enabled, 3); + *(Integer32*)(buf + 96) = shift8(4, 1) | shift8(2, 2) | shift8(2, 3); + memcpy(buf + 100, ptpClock->subdomain_address, 4); + memcpy(buf + 106, ptpClock->event_port_address, 2); + memcpy(buf + 110, ptpClock->general_port_address, 2); + return 112; + + case PTP_MM_GET_GLOBAL_TIME_DATA_SET: + *(UInteger8*)(buf + 55) = PTP_MM_GLOBAL_TIME_DATA_SET; + *(Integer32*)(buf + 56) = shift16(flip16(24), 1); + + getTime(&internalTime); + fromInternalTime(&internalTime, &externalTime, ptpClock->halfEpoch); + *(Integer32*)(buf + 60) = flip32(externalTime.seconds); + *(Integer32*)(buf + 64) = flip32(externalTime.nanoseconds); + + *(Integer32*)(buf + 68) = shift16(flip16(ptpClock->current_utc_offset), 1); + *(Integer32*)(buf + 72) = shift8(ptpClock->leap_59, 3); + *(Integer32*)(buf + 76) = shift8(ptpClock->leap_61, 3); + *(Integer32*)(buf + 80) = shift16(flip16(ptpClock->epoch_number), 1); + return 84; + + case PTP_MM_GET_FOREIGN_DATA_SET: + if((manage->targetPortId && manage->targetPortId != ptpClock->port_id_field) + || !manage->recordKey || manage->recordKey > ptpClock->number_foreign_records) + { + *(UInteger8*)(buf + 55) = PTP_MM_NULL; + *(Integer32*)(buf + 56) = shift16(flip16(0), 1); + return 0; + } + + *(UInteger8*)(buf + 55) = PTP_MM_FOREIGN_DATA_SET; + *(Integer32*)(buf + 56) = shift16(flip16(28), 1); + *(Integer32*)(buf + 60) = shift16(flip16(ptpClock->port_id_field), 1); + *(Integer32*)(buf + 64) = shift16(flip16(manage->recordKey - 1), 1); + *(Integer32*)(buf + 68) = shift8(ptpClock->foreign[manage->recordKey - 1].foreign_master_communication_technology, 3); + memcpy(buf + 72, ptpClock->foreign[manage->recordKey - 1].foreign_master_uuid, 6); + *(Integer32*)(buf + 80) = shift16(flip16(ptpClock->foreign[manage->recordKey - 1].foreign_master_port_id), 1); + *(Integer32*)(buf + 84) = shift16(flip16(ptpClock->foreign[manage->recordKey - 1].foreign_master_syncs), 1); + return 88; + + default: + return 0; + } +} diff --git a/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_net.c b/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_net.c new file mode 100644 index 0000000..5826ebc --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_net.c @@ -0,0 +1,401 @@ +/* net.c */ + +#include "utils/lwiplib.h" +#include "utils/ptpdlib.h" +#include "lwip/inet.h" + +/* Network Buffer Queue Functions. */ +static void netQInit(BufQueue *pQ) +{ + pQ->get = 0; + pQ->put = 0; + pQ->count = 0; +} + +static Integer32 netQPut(BufQueue *pQ, void *pbuf) +{ + if(pQ->count >= PBUF_QUEUE_SIZE) + return FALSE; + pQ->pbuf[pQ->put] = pbuf; + pQ->put = (pQ->put + 1) % PBUF_QUEUE_SIZE; + pQ->count++; + return TRUE; +} + +void *netQGet(BufQueue *pQ) +{ + void *pbuf; + + if(!pQ->count) + return NULL; + pbuf = pQ->pbuf[pQ->get]; + pQ->get = (pQ->get + 1) % PBUF_QUEUE_SIZE; + pQ->count--; + return pbuf; +} + +static Integer32 netQCheck(BufQueue *pQ) +{ + if(!pQ->count) + return FALSE; + return TRUE; +} + +/* Processing an incoming message on the Event port. */ +static void eventRecv(void *arg, struct udp_pcb *pcb, struct pbuf *p, + struct ip_addr *addr, u16_t port) +{ + NetPath *netPath = (NetPath *)arg; + + /* prevent warnings about unused arguments */ + (void)pcb; (void)addr; (void)port; + + /* Place the incoming message on the Event Port QUEUE. */ + if(!netQPut(&netPath->eventQ, p)) + PERROR("Event Queue Full!\n"); +} + +/* Processing an incoming message on the Event port. */ +static void generalRecv(void *arg, struct udp_pcb *pcb, struct pbuf *p, + struct ip_addr *addr, u16_t port) +{ + NetPath *netPath = (NetPath *)arg; + + /* prevent warnings about unused arguments */ + (void)pcb; (void)addr; (void)port; + + /* Place the incoming message on the Event Port QUEUE. */ + if(!netQPut(&netPath->generalQ, p)) + { + PERROR("Event Queue Full!\n"); + } +} + +Boolean lookupSubdomainAddress(Octet *subdomainName, Octet *subdomainAddress) +{ + UInteger32 h; + + /* set multicast group address based on subdomainName */ + if (!memcmp(subdomainName, DEFAULT_PTP_DOMAIN_NAME, PTP_SUBDOMAIN_NAME_LENGTH)) + memcpy(subdomainAddress, DEFAULT_PTP_DOMAIN_ADDRESS, NET_ADDRESS_LENGTH); + else if(!memcmp(subdomainName, ALTERNATE_PTP_DOMAIN1_NAME, PTP_SUBDOMAIN_NAME_LENGTH)) + memcpy(subdomainAddress, ALTERNATE_PTP_DOMAIN1_ADDRESS, NET_ADDRESS_LENGTH); + else if(!memcmp(subdomainName, ALTERNATE_PTP_DOMAIN2_NAME, PTP_SUBDOMAIN_NAME_LENGTH)) + memcpy(subdomainAddress, ALTERNATE_PTP_DOMAIN2_ADDRESS, NET_ADDRESS_LENGTH); + else if(!memcmp(subdomainName, ALTERNATE_PTP_DOMAIN3_NAME, PTP_SUBDOMAIN_NAME_LENGTH)) + memcpy(subdomainAddress, ALTERNATE_PTP_DOMAIN3_ADDRESS, NET_ADDRESS_LENGTH); + else + { + h = crc_algorithm(subdomainName, PTP_SUBDOMAIN_NAME_LENGTH) % 3; + switch(h) + { + case 0: + memcpy(subdomainAddress, ALTERNATE_PTP_DOMAIN1_ADDRESS, NET_ADDRESS_LENGTH); + break; + case 1: + memcpy(subdomainAddress, ALTERNATE_PTP_DOMAIN2_ADDRESS, NET_ADDRESS_LENGTH); + break; + case 2: + memcpy(subdomainAddress, ALTERNATE_PTP_DOMAIN3_ADDRESS, NET_ADDRESS_LENGTH); + break; + default: + ERROR("handle out of range for '%s'!\n", subdomainName); + return FALSE; + } + } + + return TRUE; +} + +Boolean netInit(NetPath *netPath, RunTimeOpts *rtOpts, PtpClock *ptpClock) +{ + int i; + struct in_addr netAddr; + char addrStr[NET_ADDRESS_LENGTH]; + + DBG("netInit\n"); + + /* Allocate tx buffer for the event port. */ + netPath->eventTxBuf = pbuf_alloc(PBUF_TRANSPORT, PACKET_SIZE, PBUF_RAM); + if(netPath->eventTxBuf == NULL) + { + PERROR("Failed to allocate Event Tx Buffer\n"); + return FALSE; + } + + /* Allocate tx buffer for the general port. */ + netPath->generalTxBuf = pbuf_alloc(PBUF_TRANSPORT, PACKET_SIZE, PBUF_RAM); + if(netPath->generalTxBuf == NULL) + { + PERROR("Failed to allocate Event Tx Buffer\n"); + pbuf_free(netPath->eventTxBuf); + return FALSE; + } + + /* Open lwIP raw udp interfaces for the event port. */ + netPath->eventPcb = udp_new(); + if(netPath->eventPcb == NULL) + { + PERROR("Failed to open Event UDP PCB\n"); + pbuf_free(netPath->eventTxBuf); + pbuf_free(netPath->generalTxBuf); + return FALSE; + } + + /* Open lwIP raw udp interfaces for the general port. */ + netPath->generalPcb = udp_new(); + if(netPath->generalPcb == NULL) + { + PERROR("Failed to open General UDP PCB\n"); + udp_remove(netPath->eventPcb); + pbuf_free(netPath->eventTxBuf); + pbuf_free(netPath->generalTxBuf); + return FALSE; + } + + /* Initialize the buffer queues. */ + netQInit(&netPath->eventQ); + netQInit(&netPath->generalQ); + + /* Configure network (broadcast/unicast) addresses. */ + netPath->unicastAddr = 0; + if(!lookupSubdomainAddress(rtOpts->subdomainName, addrStr)) + { + udp_disconnect(netPath->eventPcb); + udp_disconnect(netPath->generalPcb); + udp_remove(netPath->eventPcb); + udp_remove(netPath->generalPcb); + pbuf_free(netPath->eventTxBuf); + pbuf_free(netPath->generalTxBuf); + return FALSE; + } + if(!inet_aton(addrStr, &netAddr)) + { + ERROR("failed to encode multi-cast address: %s\n", addrStr); + udp_disconnect(netPath->eventPcb); + udp_disconnect(netPath->generalPcb); + udp_remove(netPath->eventPcb); + udp_remove(netPath->generalPcb); + pbuf_free(netPath->eventTxBuf); + pbuf_free(netPath->generalTxBuf); + return FALSE; + } + netPath->multicastAddr = netAddr.s_addr; + + /* Setup subdomain address string. */ + for(i = 0; i < SUBDOMAIN_ADDRESS_LENGTH; ++i) + { + ptpClock->subdomain_address[i] = (netAddr.s_addr >> (i * 8)) & 0xff; + } + + /* Establish the appropriate UDP bindings/connections for events. */ + + udp_recv(netPath->eventPcb, eventRecv, netPath); + udp_bind(netPath->eventPcb, IP_ADDR_ANY, PTP_EVENT_PORT); +// udp_connect(netPath->eventPcb, IP_ADDR_ANY, PTP_EVENT_PORT); + *(Integer16*)ptpClock->event_port_address = PTP_EVENT_PORT; + + /* Establish the appropriate UDP bindings/connections for general. */ + udp_recv(netPath->generalPcb, generalRecv, netPath); + udp_bind(netPath->generalPcb, IP_ADDR_ANY, PTP_GENERAL_PORT); +// udp_connect(netPath->generalPcb, IP_ADDR_ANY, PTP_GENERAL_PORT); + *(Integer16*)ptpClock->general_port_address = PTP_GENERAL_PORT; + + /* Return a success code. */ + return TRUE; +} + +/* shut down the UDP stuff */ +Boolean netShutdown(NetPath *netPath) +{ + /* Disconnect and close the Event UDP interface */ + if(netPath->eventPcb) + { + udp_disconnect(netPath->eventPcb); + udp_remove(netPath->eventPcb); + } + + /* Disconnect and close the General UDP interface */ + if(netPath->generalPcb) + { + udp_disconnect(netPath->generalPcb); + udp_remove(netPath->generalPcb); + } + + /* Free up the Event and General Tx PBUFs. */ + if(netPath->eventTxBuf) + { + pbuf_free(netPath->eventTxBuf); + } + if(netPath->generalTxBuf) + { + pbuf_free(netPath->generalTxBuf); + } + + /* Clear the network addresses. */ + netPath->multicastAddr = 0; + netPath->unicastAddr = 0; + + /* Return a success code. */ + return TRUE; +} + +/* Wait for a packet to come in on either port. For now, there is no wait. + * Simply check to see if a packet is available on either port and return 1, + * otherwise return 0. */ +int netSelect(TimeInternal *timeout, NetPath *netPath) +{ + /* Check the packet queues. If there is data, return TRUE. */ + if(netQCheck(&netPath->eventQ) || netQCheck(&netPath->generalQ)) + return 1; + return 0; +} + +/* Pop a message off of the event queue and copy it to the passed in buffer. */ +size_t netRecvEvent(Octet *buf, TimeInternal *time, NetPath *netPath) +{ + int i, j; + int iPacketSize; + struct pbuf *p, *pcopy; + + /* Attempt to get a buffer from the Q. If none is available, + * return length of 0. */ + + p = netQGet(&netPath->eventQ); + if(p == NULL) + return 0; + pcopy = p; + + + /* Here, p points to a valid PBUF structure. Verify that we have + * enough space to store the contents. */ + if(p->tot_len > PACKET_SIZE) + { + ERROR("received truncated message\n"); + return 0; + } + + /* Copy the PBUF payload into the buffer. */ + j = 0; + iPacketSize = p->tot_len; + for(i = 0; i < iPacketSize; i++) + { + buf[i] = ((u8_t *)pcopy->payload)[j++]; + if(j == pcopy->len) + { + pcopy = pcopy->next; + j = 0; + } + } + + /* Get the timestamp information. */ + time->seconds = p->time_s; + time->nanoseconds = p->time_ns; + + /* Free up the pbuf (chain). */ + pbuf_free(p); + + /* Return the length of data copied. */ + return iPacketSize; +} + +/* Pop a message off of the general queue and copy to the passed in buffer. */ +size_t netRecvGeneral(Octet *buf, NetPath *netPath) +{ + int i, j; + int iPacketSize; + struct pbuf *p, *pcopy; + + + /* Attempt to get a buffer from the Q. If none is available, + * return length of 0. */ + p = netQGet(&netPath->generalQ); + if(p == NULL) + return 0; + pcopy = p; + + /* Here, p points to a valid PBUF structure. Verify that we have + * enough space to store the contents. */ + if(p->tot_len > PACKET_SIZE) + { + ERROR("received truncated message\n"); + return 0; + } + + /* Copy the PBUF payload into the buffer. */ + j = 0; + iPacketSize = p->tot_len; + for(i = 0; i < iPacketSize; i++) + { + buf[i] = ((u8_t *)pcopy->payload)[j++]; + if(j == pcopy->len) + { + pcopy = pcopy->next; + j = 0; + } + } + + /* Free up the pbuf (chain). */ + pbuf_free(p); + + /* Return the length of data copied. */ + return iPacketSize; +} + +/* Transmit a packet on the Event Port. */ +size_t netSendEvent(Octet *buf, UInteger16 length, NetPath *netPath) +{ + int i, j; + struct pbuf *pcopy; + + /* Reallocate the tx pbuf based on the current size. */ + pbuf_realloc(netPath->eventTxBuf, length); + pcopy = netPath->eventTxBuf; + + /* Copy the incoming data into the pbuf payload. */ + j = 0; + for(i = 0; i < length; i++) + { + ((u8_t *)pcopy->payload)[j++] = buf[i]; + if(j == pcopy->len) + { + pcopy = pcopy->next; + j = 0; + } + } + + /* send the buffer. */ + udp_sendto(netPath->eventPcb, netPath->eventTxBuf, + (void *)&netPath->multicastAddr, PTP_EVENT_PORT); + + return(length); +} + +/* Transmit a packet on the General Port. */ +size_t netSendGeneral(Octet *buf, UInteger16 length, NetPath *netPath) +{ + int i, j; + struct pbuf *pcopy; + + /* Reallocate the tx pbuf based on the current size. */ + pbuf_realloc(netPath->generalTxBuf, length); + pcopy = netPath->generalTxBuf; + + /* Copy the incoming data into the pbuf payload. */ + j = 0; + for(i = 0; i < length; i++) + { + ((u8_t *)pcopy->payload)[j++] = buf[i]; + if(j == pcopy->len) + { + pcopy = pcopy->next; + j = 0; + } + } + + /* send the buffer. */ + udp_sendto(netPath->eventPcb, netPath->generalTxBuf, + (void *)&netPath->multicastAddr, PTP_GENERAL_PORT); + + return(length); +} diff --git a/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_servo.c b/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_servo.c new file mode 100644 index 0000000..c6a3eae --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_servo.c @@ -0,0 +1,179 @@ +/* ptpd_servo.c */ + +#include "../ptpd.h" + +void initClock(RunTimeOpts *rtOpts, PtpClock *ptpClock) +{ + DBG("initClock\n"); + + /* clear vars */ + ptpClock->master_to_slave_delay.seconds = ptpClock->master_to_slave_delay.nanoseconds = 0; + ptpClock->slave_to_master_delay.seconds = ptpClock->slave_to_master_delay.nanoseconds = 0; + ptpClock->observed_variance = 0; + ptpClock->observed_drift = 0; /* clears clock servo accumulator (the I term) */ + ptpClock->owd_filt.s_exp = 0; /* clears one-way delay filter */ + ptpClock->halfEpoch = ptpClock->halfEpoch || rtOpts->halfEpoch; + rtOpts->halfEpoch = 0; + + rtOpts->ai = DEFAULT_AI; + rtOpts->ap = DEFAULT_AP; + + /* level clock */ + if(!rtOpts->noAdjust) + adjFreq(0); +} + +void updateDelay(TimeInternal *send_time, TimeInternal *recv_time, + one_way_delay_filter *owd_filt, RunTimeOpts *rtOpts, PtpClock *ptpClock) +{ + Integer16 s; + + DBGV("updateDelay\n"); + + /* calc 'slave_to_master_delay' */ + subTime(&ptpClock->slave_to_master_delay, recv_time, send_time); + + /* update 'one_way_delay' */ + addTime(&ptpClock->one_way_delay, &ptpClock->master_to_slave_delay, &ptpClock->slave_to_master_delay); + + // + // TODO: This looks wrong. If seconds is odd, surely we need to add half + // a second's worth of nanoseconds to the result? I'm assuming that + // these two lines intend to divide the one_way_delay as a whole by 2. + // + ptpClock->one_way_delay.seconds /= 2; + ptpClock->one_way_delay.nanoseconds /= 2; + + if(ptpClock->one_way_delay.seconds) + { + /* cannot filter with secs, clear filter */ + owd_filt->s_exp = owd_filt->nsec_prev = 0; + return; + } + + /* avoid overflowing filter */ + s = rtOpts->s; + while(labs(owd_filt->y)>>(31-s)) + --s; + + /* crank down filter cutoff by increasing 's_exp' */ + if(owd_filt->s_exp < 1) + owd_filt->s_exp = 1; + else if(owd_filt->s_exp < 1<s_exp; + else if(owd_filt->s_exp > 1<s_exp = 1<y = (owd_filt->s_exp-1)*owd_filt->y/owd_filt->s_exp + + (ptpClock->one_way_delay.nanoseconds/2 + owd_filt->nsec_prev/2)/owd_filt->s_exp; + + owd_filt->nsec_prev = ptpClock->one_way_delay.nanoseconds; + ptpClock->one_way_delay.nanoseconds = owd_filt->y; + + DBG("delay filter %d, %d\n", owd_filt->y, owd_filt->s_exp); +} + +void updateOffset(TimeInternal *send_time, TimeInternal *recv_time, + offset_from_master_filter *ofm_filt, RunTimeOpts *rtOpts, PtpClock *ptpClock) +{ + DBGV("updateOffset\n"); + + /* calc 'master_to_slave_delay' */ + subTime(&ptpClock->master_to_slave_delay, recv_time, send_time); + + /* update 'offset_from_master' */ + subTime(&ptpClock->offset_from_master, &ptpClock->master_to_slave_delay, &ptpClock->one_way_delay); + + if(ptpClock->offset_from_master.seconds) + { + /* cannot filter with secs, clear filter */ + ofm_filt->nsec_prev = 0; + return; + } + + /* filter 'offset_from_master' */ + ofm_filt->y = ptpClock->offset_from_master.nanoseconds/2 + ofm_filt->nsec_prev/2; + ofm_filt->nsec_prev = ptpClock->offset_from_master.nanoseconds; + ptpClock->offset_from_master.nanoseconds = ofm_filt->y; + + DBGV("offset filter %d\n", ofm_filt->y); +} + +void updateClock(RunTimeOpts *rtOpts, PtpClock *ptpClock) +{ + Integer32 adj; + TimeInternal timeTmp; + static unsigned long ulCount = 0; + + DBGV("updateClock\n"); + + if(ptpClock->offset_from_master.seconds) + { + /* if secs, reset clock or set freq adjustment to max */ + if(!rtOpts->noAdjust) + { + if(!rtOpts->noResetClock) + { + getTime(&timeTmp); + subTime(&timeTmp, &timeTmp, &ptpClock->offset_from_master); + setTime(&timeTmp); + initClock(rtOpts, ptpClock); + } + else + { + adj = ptpClock->offset_from_master.nanoseconds > 0 ? ADJ_MAX : -ADJ_MAX; + adjFreq(-adj); + } + } + } + else + { + /* the PI controller */ + + /* no negative or zero attenuation */ + if(rtOpts->ap < 1) + rtOpts->ap = 1; + if(rtOpts->ai < 1) + rtOpts->ai = 1; + + /* adjust the filter components each time, till we reach the max */ + ulCount++; + if(!ulCount % 2) + { + rtOpts->ai++; + if(rtOpts->ai > MAX_AI) + { + rtOpts->ai = MAX_AI; + } + rtOpts->ap = rtOpts->ai / 100; + if(rtOpts->ap < DEFAULT_AP) + { + rtOpts->ap = DEFAULT_AP; + } + } + + /* the accumulator for the I component */ + ptpClock->observed_drift += ptpClock->offset_from_master.nanoseconds/rtOpts->ai; + + adj = ptpClock->offset_from_master.nanoseconds/rtOpts->ap + ptpClock->observed_drift; + + /* apply controller output as a clock tick rate adjustment */ + if(!rtOpts->noAdjust) + adjFreq(-adj); + } + + if(rtOpts->displayStats) + displayStats(rtOpts, ptpClock); + + DBGV("master-to-slave delay: %10ds %11dns\n", + ptpClock->master_to_slave_delay.seconds, ptpClock->master_to_slave_delay.nanoseconds); + DBGV("slave-to-master delay: %10ds %11dns\n", + ptpClock->slave_to_master_delay.seconds, ptpClock->slave_to_master_delay.nanoseconds); + DBGV("one-way delay: %10ds %11dns\n", + ptpClock->one_way_delay.seconds, ptpClock->one_way_delay.nanoseconds); + DBG("offset from master: %10ds %11dns\n", + ptpClock->offset_from_master.seconds, ptpClock->offset_from_master.nanoseconds); + DBG("observed drift: %10d\n", ptpClock->observed_drift); +} + diff --git a/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_timer.c b/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_timer.c new file mode 100644 index 0000000..47b0bb5 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep-tiva/ptpd_timer.c @@ -0,0 +1,75 @@ +/* ptpd_timer.c */ + +#include "../ptpd.h" + +static int iElapsedMilliSeconds = 0; + +void initTimer(void) +{ + DBG("initTimer\n"); + + iElapsedMilliSeconds = 0; +} + +void timerTick(int iTickMilliSeconds) +{ + iElapsedMilliSeconds += iTickMilliSeconds; +} + +void timerUpdate(IntervalTimer *itimer) +{ + int i, delta; + + delta = iElapsedMilliSeconds / 1000; + + if(delta <= 0) + return; + + iElapsedMilliSeconds %= 1000; + + for(i = 0; i < TIMER_ARRAY_SIZE; ++i) + { + if(itimer[i].interval > 0 && (itimer[i].left -= delta) <= 0) + { + itimer[i].left = itimer[i].interval; + itimer[i].expire = TRUE; + DBGV("timerUpdate: timer %u expired\n", i); + } + } +} + +void timerStop(UInteger16 index, IntervalTimer *itimer) +{ + if(index >= TIMER_ARRAY_SIZE) + return; + + itimer[index].interval = 0; +} + +void timerStart(UInteger16 index, UInteger16 interval, IntervalTimer *itimer) +{ + if(index >= TIMER_ARRAY_SIZE) + return; + + itimer[index].expire = FALSE; + itimer[index].left = interval; + itimer[index].interval = itimer[index].left; + + DBGV("timerStart: set timer %d to %d\n", index, interval); +} + +Boolean timerExpired(UInteger16 index, IntervalTimer *itimer) +{ + timerUpdate(itimer); + + if(index >= TIMER_ARRAY_SIZE) + return FALSE; + + if(!itimer[index].expire) + return FALSE; + + itimer[index].expire = FALSE; + + return TRUE; +} + diff --git a/third_party/ptpd-1.1.0/src/dep/constants_dep.h b/third_party/ptpd-1.1.0/src/dep/constants_dep.h new file mode 100644 index 0000000..54afaf1 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep/constants_dep.h @@ -0,0 +1,99 @@ +/** + * @file constants_dep.h + * @date Tue Jul 20 16:16:23 2010 + * + * @brief Platform dependent constants + * + * + */ + +#ifndef CONSTANTS_DEP_H +#define CONSTANTS_DEP_H + +#include + +#if !defined(linux) && !defined(__NetBSD__) && !defined(__FreeBSD__) +#error Not ported to this architecture, please update. +#endif + +#ifdef linux +#include +#include +#include +#define IFACE_NAME_LENGTH IF_NAMESIZE +#define NET_ADDRESS_LENGTH INET_ADDRSTRLEN + +#define IFCONF_LENGTH 10 + +#include +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define PTPD_LSBF +#elif __BYTE_ORDER == __BIG_ENDIAN +#define PTPD_MSBF +#endif +#endif /* linux */ + + +#if defined(__NetBSD__) || defined(__FreeBSD__) +#include +#include +#include +#include +#include +#include +#if defined(__FreeBSD__) +#include +#include +#else +#include +#endif +#include +#define IFACE_NAME_LENGTH IF_NAMESIZE +#define NET_ADDRESS_LENGTH INET_ADDRSTRLEN + +#define IFCONF_LENGTH 10 + +#define adjtimex ntp_adjtime + +#include +#if BYTE_ORDER == LITTLE_ENDIAN +#define PTPD_LSBF +#elif BYTE_ORDER == BIG_ENDIAN +#define PTPD_MSBF +#endif +#endif + + +#define ADJ_FREQ_MAX 512000 + +/* UDP/IPv4 dependent */ + +#define SUBDOMAIN_ADDRESS_LENGTH 4 +#define PORT_ADDRESS_LENGTH 2 + +#define PACKET_SIZE 300 + +#define PTP_EVENT_PORT 319 +#define PTP_GENERAL_PORT 320 + +#define DEFAULT_PTP_DOMAIN_ADDRESS "224.0.1.129" +#define ALTERNATE_PTP_DOMAIN1_ADDRESS "224.0.1.130" +#define ALTERNATE_PTP_DOMAIN2_ADDRESS "224.0.1.131" +#define ALTERNATE_PTP_DOMAIN3_ADDRESS "224.0.1.132" + +#define HEADER_LENGTH 40 +#define SYNC_PACKET_LENGTH 124 +#define DELAY_REQ_PACKET_LENGTH 124 +#define FOLLOW_UP_PACKET_LENGTH 52 +#define DELAY_RESP_PACKET_LENGTH 60 +#define MANAGEMENT_PACKET_LENGTH 136 + +#define MM_STARTING_BOUNDARY_HOPS 0x7fff + +/* others */ + +#define SCREEN_BUFSZ 128 +#define SCREEN_MAXSZ 80 + +#define MAXTIMESTR 32 +#endif diff --git a/third_party/ptpd-1.1.0/src/dep/datatypes_dep.h b/third_party/ptpd-1.1.0/src/dep/datatypes_dep.h new file mode 100644 index 0000000..b105130 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep/datatypes_dep.h @@ -0,0 +1,37 @@ +/** + * @file datatypes_dep.h + * @date Tue Jul 20 16:16:48 2010 + * + * @brief Platform dependent datatypes. + * + * + */ + +#ifndef DATATYPES_DEP_H +#define DATATYPES_DEP_H + +typedef enum { + FALSE = 0, TRUE +} Boolean; +typedef char Octet; +typedef signed char Integer8; +typedef signed short Integer16; +typedef signed int Integer32; +typedef unsigned char UInteger8; +typedef unsigned short UInteger16; +typedef unsigned int UInteger32; + +typedef struct { + Integer32 nsec_prev, y; +} offset_from_master_filter; + +typedef struct { + Integer32 nsec_prev, y; + Integer32 s_exp; +} one_way_delay_filter; + +typedef struct { + Integer32 eventSock, generalSock, multicastAddr, unicastAddr; +} NetPath; + +#endif diff --git a/third_party/ptpd-1.1.0/src/dep/msg.c b/third_party/ptpd-1.1.0/src/dep/msg.c new file mode 100644 index 0000000..cd2dbb9 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep/msg.c @@ -0,0 +1,671 @@ +/** + * @file msg.c + * @author George Neville-Neil + * @date Tue Jul 20 16:17:05 2010 + * + * @brief Functions to pack and unpack messages. + * + * See spec annex d + */ + + +#include "../ptpd.h" + +Boolean +msgPeek(void *buf, ssize_t length) +{ + /* not imlpemented yet */ + return TRUE; +} + +void +msgUnpackHeader(void *buf, MsgHeader * header) +{ + header->versionPTP = flip16(*(UInteger16 *) (buf + 0)); + header->versionNetwork = flip16(*(UInteger16 *) (buf + 2)); + DBGV("msgUnpackHeader: versionPTP %d\n", header->versionPTP); + DBGV("msgUnpackHeader: versionNetwork %d\n", header->versionNetwork); + + memcpy(header->subdomain, (buf + 4), 16); + DBGV("msgUnpackHeader: subdomain %s\n", header->subdomain); + + header->messageType = *(UInteger8 *) (buf + 20); + header->sourceCommunicationTechnology = *(UInteger8 *) (buf + 21); + DBGV("msgUnpackHeader: messageType %d\n", header->messageType); + DBGV("msgUnpackHeader: sourceCommunicationTechnology %d\n", header->sourceCommunicationTechnology); + + memcpy(header->sourceUuid, (buf + 22), 6); + DBGV("msgUnpackHeader: sourceUuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + header->sourceUuid[0], header->sourceUuid[1], header->sourceUuid[2], + header->sourceUuid[3], header->sourceUuid[4], header->sourceUuid[5]); + + header->sourcePortId = flip16(*(UInteger16 *) (buf + 28)); + header->sequenceId = flip16(*(UInteger16 *) (buf + 30)); + DBGV("msgUnpackHeader: sourcePortId %d\n", header->sourcePortId); + DBGV("msgUnpackHeader: sequenceId %d\n", header->sequenceId); + + header->control = *(UInteger8 *) (buf + 32); + DBGV("msgUnpackHeader: control %d\n", header->control); + + memcpy(header->flags, (buf + 34), 2); + DBGV("msgUnpackHeader: flags %02hhx %02hhx\n", header->flags[0], header->flags[1]); +} + +void +msgUnpackSync(void *buf, MsgSync * sync) +{ + sync->originTimestamp.seconds = flip32(*(UInteger32 *) (buf + 40)); + DBGV("msgUnpackSync: originTimestamp.seconds %u\n", sync->originTimestamp.seconds); + sync->originTimestamp.nanoseconds = flip32(*(Integer32 *) (buf + 44)); + DBGV("msgUnpackSync: originTimestamp.nanoseconds %d\n", sync->originTimestamp.nanoseconds); + sync->epochNumber = flip16(*(UInteger16 *) (buf + 48)); + DBGV("msgUnpackSync: epochNumber %d\n", sync->epochNumber); + sync->currentUTCOffset = flip16(*(Integer16 *) (buf + 50)); + DBGV("msgUnpackSync: currentUTCOffset %d\n", sync->currentUTCOffset); + sync->grandmasterCommunicationTechnology = *(UInteger8 *) (buf + 53); + DBGV("msgUnpackSync: grandmasterCommunicationTechnology %d\n", sync->grandmasterCommunicationTechnology); + memcpy(sync->grandmasterClockUuid, (buf + 54), 6); + DBGV("msgUnpackSync: grandmasterClockUuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + sync->grandmasterClockUuid[0], sync->grandmasterClockUuid[1], sync->grandmasterClockUuid[2], + sync->grandmasterClockUuid[3], sync->grandmasterClockUuid[4], sync->grandmasterClockUuid[5]); + sync->grandmasterPortId = flip16(*(UInteger16 *) (buf + 60)); + DBGV("msgUnpackSync: grandmasterPortId %d\n", sync->grandmasterPortId); + sync->grandmasterSequenceId = flip16(*(UInteger16 *) (buf + 62)); + DBGV("msgUnpackSync: grandmasterSequenceId %d\n", sync->grandmasterSequenceId); + sync->grandmasterClockStratum = *(UInteger8 *) (buf + 67); + DBGV("msgUnpackSync: grandmasterClockStratum %d\n", sync->grandmasterClockStratum); + memcpy(sync->grandmasterClockIdentifier, (buf + 68), 4); + DBGV("msgUnpackSync: grandmasterClockIdentifier %c%c%c%c\n", + sync->grandmasterClockIdentifier[0], sync->grandmasterClockIdentifier[1], + sync->grandmasterClockIdentifier[2], sync->grandmasterClockIdentifier[3]); + sync->grandmasterClockVariance = flip16(*(Integer16 *) (buf + 74)); + DBGV("msgUnpackSync: grandmasterClockVariance %d\n", sync->grandmasterClockVariance); + sync->grandmasterPreferred = *(UInteger8 *) (buf + 77); + DBGV("msgUnpackSync: grandmasterPreferred %d\n", sync->grandmasterPreferred); + sync->grandmasterIsBoundaryClock = *(UInteger8 *) (buf + 79); + DBGV("msgUnpackSync: grandmasterIsBoundaryClock %d\n", sync->grandmasterIsBoundaryClock); + sync->syncInterval = *(Integer8 *) (buf + 83); + DBGV("msgUnpackSync: syncInterval %d\n", sync->syncInterval); + sync->localClockVariance = flip16(*(Integer16 *) (buf + 86)); + DBGV("msgUnpackSync: localClockVariance %d\n", sync->localClockVariance); + sync->localStepsRemoved = flip16(*(UInteger16 *) (buf + 90)); + DBGV("msgUnpackSync: localStepsRemoved %d\n", sync->localStepsRemoved); + sync->localClockStratum = *(UInteger8 *) (buf + 95); + DBGV("msgUnpackSync: localClockStratum %d\n", sync->localClockStratum); + memcpy(sync->localClockIdentifer, (buf + 96), PTP_CODE_STRING_LENGTH); + DBGV("msgUnpackSync: localClockIdentifer %c%c%c%c\n", + sync->localClockIdentifer[0], sync->localClockIdentifer[1], + sync->localClockIdentifer[2], sync->localClockIdentifer[3]); + sync->parentCommunicationTechnology = *(UInteger8 *) (buf + 101); + DBGV("msgUnpackSync: parentCommunicationTechnology %d\n", sync->parentCommunicationTechnology); + memcpy(sync->parentUuid, (buf + 102), PTP_UUID_LENGTH); + DBGV("msgUnpackSync: parentUuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + sync->parentUuid[0], sync->parentUuid[1], sync->parentUuid[2], + sync->parentUuid[3], sync->parentUuid[4], sync->parentUuid[5]); + sync->parentPortField = flip16(*(UInteger16 *) (buf + 110)); + DBGV("msgUnpackSync: parentPortField %d\n", sync->parentPortField); + sync->estimatedMasterVariance = flip16(*(Integer16 *) (buf + 114)); + DBGV("msgUnpackSync: estimatedMasterVariance %d\n", sync->estimatedMasterVariance); + sync->estimatedMasterDrift = flip32(*(Integer32 *) (buf + 116)); + DBGV("msgUnpackSync: estimatedMasterDrift %d\n", sync->estimatedMasterDrift); + sync->utcReasonable = *(UInteger8 *) (buf + 123); + DBGV("msgUnpackSync: utcReasonable %d\n", sync->utcReasonable); +} + +void +msgUnpackDelayReq(void *buf, MsgDelayReq * req) +{ +} + +void +msgUnpackFollowUp(void *buf, MsgFollowUp * follow) +{ + follow->associatedSequenceId = flip16(*(UInteger16 *) (buf + 42)); + DBGV("msgUnpackFollowUp: associatedSequenceId %u\n", follow->associatedSequenceId); + follow->preciseOriginTimestamp.seconds = flip32(*(UInteger32 *) (buf + 44)); + DBGV("msgUnpackFollowUp: preciseOriginTimestamp.seconds %u\n", follow->preciseOriginTimestamp.seconds); + follow->preciseOriginTimestamp.nanoseconds = flip32(*(Integer32 *) (buf + 48)); + DBGV("msgUnpackFollowUp: preciseOriginTimestamp.nanoseconds %d\n", follow->preciseOriginTimestamp.nanoseconds); +} + +void +msgUnpackDelayResp(void *buf, MsgDelayResp * resp) +{ + resp->delayReceiptTimestamp.seconds = flip32(*(UInteger32 *) (buf + 40)); + DBGV("msgUnpackDelayResp: delayReceiptTimestamp.seconds %u\n", resp->delayReceiptTimestamp.seconds); + resp->delayReceiptTimestamp.nanoseconds = flip32(*(Integer32 *) (buf + 44)); + DBGV("msgUnpackDelayResp: delayReceiptTimestamp.nanoseconds %d\n", resp->delayReceiptTimestamp.nanoseconds); + resp->requestingSourceCommunicationTechnology = *(UInteger8 *) (buf + 49); + DBGV("msgUnpackDelayResp: requestingSourceCommunicationTechnology %d\n", resp->requestingSourceCommunicationTechnology); + memcpy(resp->requestingSourceUuid, (buf + 50), 6); + DBGV("msgUnpackDelayResp: requestingSourceUuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + resp->requestingSourceUuid[0], resp->requestingSourceUuid[1], resp->requestingSourceUuid[2], + resp->requestingSourceUuid[3], resp->requestingSourceUuid[4], resp->requestingSourceUuid[5]); + resp->requestingSourcePortId = flip16(*(UInteger16 *) (buf + 56)); + DBGV("msgUnpackDelayResp: requestingSourcePortId %d\n", resp->requestingSourcePortId); + resp->requestingSourceSequenceId = flip16(*(UInteger16 *) (buf + 58)); + DBGV("msgUnpackDelayResp: requestingSourceSequenceId %d\n", resp->requestingSourceSequenceId); +} + +void +msgUnpackManagement(void *buf, MsgManagement * manage) +{ + manage->targetCommunicationTechnology = *(UInteger8 *) (buf + 41); + DBGV("msgUnpackManagement: targetCommunicationTechnology %d\n", manage->targetCommunicationTechnology); + memcpy(manage->targetUuid, (buf + 42), 6); + DBGV("msgUnpackManagement: targetUuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + manage->targetUuid[0], manage->targetUuid[1], manage->targetUuid[2], + manage->targetUuid[3], manage->targetUuid[4], manage->targetUuid[5]); + manage->targetPortId = flip16(*(UInteger16 *) (buf + 48)); + DBGV("msgUnpackManagement: targetPortId %d\n", manage->targetPortId); + manage->startingBoundaryHops = flip16(*(Integer16 *) (buf + 50)); + DBGV("msgUnpackManagement: startingBoundaryHops %d\n", manage->startingBoundaryHops); + manage->boundaryHops = flip16(*(Integer16 *) (buf + 52)); + DBGV("msgUnpackManagement: boundaryHops %d\n", manage->boundaryHops); + manage->managementMessageKey = *(UInteger8 *) (buf + 55); + DBGV("msgUnpackManagement: managementMessageKey %d\n", manage->managementMessageKey); + manage->parameterLength = flip16(*(UInteger16 *) (buf + 58)); + DBGV("msgUnpackManagement: parameterLength %d\n", manage->parameterLength); + + if (manage->managementMessageKey == PTP_MM_GET_FOREIGN_DATA_SET) + manage->recordKey = flip16(*(UInteger16 *) (buf + 62)); +} + +UInteger8 +msgUnloadManagement(void *buf, MsgManagement * manage, + PtpClock * ptpClock, RunTimeOpts * rtOpts) +{ + TimeInternal internalTime; + TimeRepresentation externalTime; + + switch (manage->managementMessageKey) { + case PTP_MM_INITIALIZE_CLOCK: + if (ptpClock->initializable) + return PTP_INITIALIZING; + break; + + case PTP_MM_GOTO_FAULTY_STATE: + DBG("event FAULT_DETECTED (forced by management message)\n"); + return PTP_FAULTY; + break; + + case PTP_MM_DISABLE_PORT: + if (manage->targetPortId == 1) { + DBG("event DESIGNATED_DISABLED\n"); + return PTP_DISABLED; + } + break; + + case PTP_MM_ENABLE_PORT: + if (manage->targetPortId == 1) { + DBG("event DESIGNATED_ENABLED\n"); + return PTP_INITIALIZING; + } + break; + + case PTP_MM_CLEAR_DESIGNATED_PREFERRED_MASTER: + ptpClock->preferred = FALSE; + break; + + case PTP_MM_SET_DESIGNATED_PREFERRED_MASTER: + ptpClock->preferred = TRUE; + break; + + case PTP_MM_DISABLE_BURST: + break; + + case PTP_MM_ENABLE_BURST: + break; + + case PTP_MM_SET_SYNC_INTERVAL: + rtOpts->syncInterval = *(Integer8 *) (buf + 63); + break; + + case PTP_MM_SET_SUBDOMAIN: + memcpy(rtOpts->subdomainName, buf + 60, 16); + DBG("set subdomain to %s\n", rtOpts->subdomainName); + break; + + case PTP_MM_SET_TIME: + externalTime.seconds = flip32(*(UInteger32 *) (buf + 60)); + externalTime.nanoseconds = flip32(*(Integer32 *) (buf + 64)); + toInternalTime(&internalTime, &externalTime, &ptpClock->halfEpoch); + setTime(&internalTime); + break; + + case PTP_MM_UPDATE_DEFAULT_DATA_SET: + if (!rtOpts->slaveOnly) + ptpClock->clock_stratum = *(UInteger8 *) (buf + 63); + memcpy(ptpClock->clock_identifier, buf + 64, 4); + ptpClock->clock_variance = flip16(*(Integer16 *) (buf + 70)); + ptpClock->preferred = *(UInteger8 *) (buf + 75); + rtOpts->syncInterval = *(UInteger8 *) (buf + 79); + memcpy(rtOpts->subdomainName, buf + 80, 16); + break; + + case PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES: + ptpClock->current_utc_offset = flip16(*(Integer16 *) (buf + 62)); + ptpClock->leap_59 = *(UInteger8 *) (buf + 67); + ptpClock->leap_61 = *(UInteger8 *) (buf + 71); + ptpClock->epoch_number = flip16(*(UInteger16 *) (buf + 74)); + break; + + default: + break; + } + + return ptpClock->port_state; +} + +void +msgUnpackManagementPayload(void *buf, MsgManagement * manage) +{ + switch (manage->managementMessageKey) { + case PTP_MM_CLOCK_IDENTITY: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_CLOCK_IDENTITY\n"); + manage->payload.clockIdentity.clockCommunicationTechnology = *(UInteger8 *) (buf + 63); + memcpy(manage->payload.clockIdentity.clockUuidField, buf + 64, PTP_UUID_LENGTH); + manage->payload.clockIdentity.clockPortField = flip16(*(UInteger16 *) (buf + 74)); + memcpy(manage->payload.clockIdentity.manufacturerIdentity, buf + 76, MANUFACTURER_ID_LENGTH); + break; + + case PTP_MM_DEFAULT_DATA_SET: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_DEFAULT_DATA_SET\n"); + manage->payload.defaultData.clockCommunicationTechnology = *(UInteger8 *) (buf + 63); + memcpy(manage->payload.defaultData.clockUuidField, buf + 64, PTP_UUID_LENGTH); + manage->payload.defaultData.clockPortField = flip16(*(UInteger16 *) (buf + 74)); + manage->payload.defaultData.clockStratum = *(UInteger16 *) (buf + 79); + memcpy(manage->payload.defaultData.clockIdentifier, buf + 80, PTP_CODE_STRING_LENGTH); + manage->payload.defaultData.clockVariance = flip16(*(UInteger16 *) (buf + 86)); + manage->payload.defaultData.clockFollowupCapable = *(UInteger8 *) (buf + 91); + manage->payload.defaultData.preferred = *(UInteger8 *) (buf + 95); + manage->payload.defaultData.initializable = *(UInteger8 *) (buf + 99); + manage->payload.defaultData.externalTiming = *(UInteger8 *) (buf + 103); + manage->payload.defaultData.isBoundaryClock = *(UInteger8 *) (buf + 107); + manage->payload.defaultData.syncInterval = *(UInteger8 *) (buf + 111); + memcpy(manage->payload.defaultData.subdomainName, buf + 112, PTP_SUBDOMAIN_NAME_LENGTH); + manage->payload.defaultData.numberPorts = flip16(*(UInteger16 *) (buf + 130)); + manage->payload.defaultData.numberForeignRecords = flip16(*(UInteger16 *) (buf + 134)); + break; + + case PTP_MM_CURRENT_DATA_SET: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_CURRENT_DATA_SET\n"); + manage->payload.current.stepsRemoved = flip16(*(UInteger16 *) (buf + 62)); + manage->payload.current.offsetFromMaster.seconds = flip32(*(UInteger32 *) (buf + 64)); + manage->payload.current.offsetFromMaster.nanoseconds = flip32(*(UInteger32 *) (buf + 68)); + manage->payload.current.oneWayDelay.seconds = flip32(*(UInteger32 *) (buf + 72)); + manage->payload.current.oneWayDelay.nanoseconds = flip32(*(Integer32 *) (buf + 76)); + break; + + case PTP_MM_PARENT_DATA_SET: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_PORT_DATA_SET\n"); + manage->payload.parent.parentCommunicationTechnology = *(UInteger8 *) (buf + 63); + memcpy(manage->payload.parent.parentUuid, buf + 64, PTP_UUID_LENGTH); + manage->payload.parent.parentPortId = flip16(*(UInteger16 *) (buf + 74)); + manage->payload.parent.parentLastSyncSequenceNumber = flip16(*(UInteger16 *) (buf + 74)); + manage->payload.parent.parentFollowupCapable = *(UInteger8 *) (buf + 83); + manage->payload.parent.parentExternalTiming = *(UInteger8 *) (buf + 87); + manage->payload.parent.parentVariance = flip16(*(UInteger16 *) (buf + 90)); + manage->payload.parent.parentStats = *(UInteger8 *) (buf + 85); + manage->payload.parent.observedVariance = flip16(*(Integer16 *) (buf + 98)); + manage->payload.parent.observedDrift = flip32(*(Integer32 *) (buf + 100)); + manage->payload.parent.utcReasonable = *(UInteger8 *) (buf + 107); + manage->payload.parent.grandmasterCommunicationTechnology = *(UInteger8 *) (buf + 111); + memcpy(manage->payload.parent.grandmasterUuidField, buf + 112, PTP_UUID_LENGTH); + manage->payload.parent.grandmasterPortIdField = flip16(*(UInteger16 *) (buf + 122)); + manage->payload.parent.grandmasterStratum = *(UInteger8 *) (buf + 127); + memcpy(manage->payload.parent.grandmasterIdentifier, buf + 128, PTP_CODE_STRING_LENGTH); + manage->payload.parent.grandmasterVariance = flip16(*(Integer16 *) (buf + 134)); + manage->payload.parent.grandmasterPreferred = *(UInteger8 *) (buf + 139); + manage->payload.parent.grandmasterIsBoundaryClock = *(UInteger8 *) (buf + 144); + manage->payload.parent.grandmasterSequenceNumber = flip16(*(UInteger16 *) (buf + 146)); + break; + + case PTP_MM_PORT_DATA_SET: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_FOREIGN_DATA_SET\n"); + manage->payload.port.returnedPortNumber = flip16(*(UInteger16 *) (buf + 62)); + manage->payload.port.portState = *(UInteger8 *) (buf + 67); + manage->payload.port.lastSyncEventSequenceNumber = flip16(*(UInteger16 *) (buf + 70)); + manage->payload.port.lastGeneralEventSequenceNumber = flip16(*(UInteger16 *) (buf + 74)); + manage->payload.port.portCommunicationTechnology = *(UInteger8 *) (buf + 79); + memcpy(manage->payload.port.portUuidField, buf + 80, PTP_UUID_LENGTH); + manage->payload.port.portIdField = flip16(*(UInteger16 *) (buf + 90)); + manage->payload.port.burstEnabled = *(UInteger8 *) (buf + 95); + manage->payload.port.subdomainAddressOctets = *(UInteger8 *) (buf + 97); + manage->payload.port.eventPortAddressOctets = *(UInteger8 *) (buf + 98); + manage->payload.port.generalPortAddressOctets = *(UInteger8 *) (buf + 99); + memcpy(manage->payload.port.subdomainAddress, buf + 100, SUBDOMAIN_ADDRESS_LENGTH); + memcpy(manage->payload.port.eventPortAddress, buf + 106, PORT_ADDRESS_LENGTH); + memcpy(manage->payload.port.generalPortAddress, buf + 110, PORT_ADDRESS_LENGTH); + break; + + case PTP_MM_GLOBAL_TIME_DATA_SET: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_GLOBAL_TIME_DATA_SET\n"); + manage->payload.globalTime.localTime.seconds = flip32(*(UInteger32 *) (buf + 60)); + manage->payload.globalTime.localTime.nanoseconds = flip32(*(Integer32 *) (buf + 64)); + manage->payload.globalTime.currentUtcOffset = flip16(*(Integer16 *) (buf + 70)); + manage->payload.globalTime.leap59 = *(UInteger8 *) (buf + 75); + manage->payload.globalTime.leap61 = *(UInteger8 *) (buf + 79); + manage->payload.globalTime.epochNumber = flip16(*(UInteger16 *) (buf + 82)); + break; + + + case PTP_MM_FOREIGN_DATA_SET: + DBGV("msgUnloadManagementPayload: managementMessageKey PTP_MM_FOREIGN_DATA_SET\n"); + manage->payload.foreign.returnedPortNumber = flip16(*(UInteger16 *) (buf + 62)); + manage->payload.foreign.returnedRecordNumber = flip16(*(UInteger16 *) (buf + 68)); + manage->payload.foreign.foreignMasterCommunicationTechnology = *(UInteger8 *) (buf + 71); + memcpy(manage->payload.foreign.foreignMasterUuid, buf + 72, PTP_UUID_LENGTH); + manage->payload.foreign.foreignMasterPortId = flip16(*(UInteger16 *) (buf + 82)); + manage->payload.foreign.foreignMasterSyncs = flip16(*(UInteger16 *) (buf + 66)); + break; + + case PTP_MM_NULL: + DBGV("msgUnloadManagementPayload: managementMessageKey NULL\n"); + break; + + default: + DBGV("msgUnloadManagementPayload: managementMessageKey ?\n"); + break; + } + + return; +} + +void +msgPackHeader(void *buf, PtpClock * ptpClock) +{ + *(Integer32 *) (buf + 0) = shift16(flip16(VERSION_PTP), 0) | shift16(flip16(VERSION_NETWORK), 1); + memcpy((buf + 4), ptpClock->subdomain_name, 16); + *(Integer32 *) (buf + 20) = shift8(ptpClock->port_communication_technology, 1); + memcpy((buf + 22), ptpClock->port_uuid_field, 6); + + if (ptpClock->external_timing) + setFlag((buf + 34), PTP_EXT_SYNC); + if (ptpClock->clock_followup_capable) + setFlag((buf + 34), PTP_ASSIST); + if (ptpClock->is_boundary_clock) + setFlag((buf + 34), PTP_BOUNDARY_CLOCK); +} + +void +msgPackSync(void *buf, Boolean burst, + TimeRepresentation * originTimestamp, PtpClock * ptpClock) +{ + *(UInteger8 *) (buf + 20) = 1; /* messageType */ + *(Integer32 *) (buf + 28) = shift16(flip16(ptpClock->port_id_field), 0) | shift16(flip16(ptpClock->last_sync_event_sequence_number), 1); + *(UInteger8 *) (buf + 32) = PTP_SYNC_MESSAGE; /* control */ + if (ptpClock->burst_enabled && burst) + setFlag((buf + 34), PTP_SYNC_BURST); + else + clearFlag((buf + 34), PTP_SYNC_BURST); + if (ptpClock->parent_stats) + setFlag((buf + 34), PARENT_STATS); + else + clearFlag((buf + 34), PARENT_STATS); + + + *(Integer32 *) (buf + 40) = flip32(originTimestamp->seconds); + *(Integer32 *) (buf + 44) = flip32(originTimestamp->nanoseconds); + *(Integer32 *) (buf + 48) = shift16(flip16(ptpClock->epoch_number), 0) | shift16(flip16(ptpClock->current_utc_offset), 1); + *(Integer32 *) (buf + 52) = shift8(ptpClock->grandmaster_communication_technology, 1); + memcpy((buf + 54), ptpClock->grandmaster_uuid_field, 6); + *(Integer32 *) (buf + 60) = shift16(flip16(ptpClock->grandmaster_port_id_field), 0) | shift16(flip16(ptpClock->grandmaster_sequence_number), 1); + *(Integer32 *) (buf + 64) = shift8(ptpClock->grandmaster_stratum, 3); + memcpy((buf + 68), ptpClock->grandmaster_identifier, 4); + *(Integer32 *) (buf + 72) = shift16(flip16(ptpClock->grandmaster_variance), 1); + *(Integer32 *) (buf + 76) = shift16(flip16(ptpClock->grandmaster_preferred), 0) | shift16(flip16(ptpClock->grandmaster_is_boundary_clock), 1); + *(Integer32 *) (buf + 80) = shift16(flip16(ptpClock->sync_interval), 1); + *(Integer32 *) (buf + 84) = shift16(flip16(ptpClock->clock_variance), 1); + *(Integer32 *) (buf + 88) = shift16(flip16(ptpClock->steps_removed), 1); + *(Integer32 *) (buf + 92) = shift8(ptpClock->clock_stratum, 3); + memcpy((buf + 96), ptpClock->clock_identifier, 4); + *(Integer32 *) (buf + 100) = shift8(ptpClock->parent_communication_technology, 1); + memcpy((buf + 102), ptpClock->parent_uuid, 6); + *(Integer32 *) (buf + 108) = shift16(flip16(ptpClock->parent_port_id), 1); + *(Integer32 *) (buf + 112) = shift16(flip16(ptpClock->observed_variance), 1); + *(Integer32 *) (buf + 116) = flip32(ptpClock->observed_drift); + *(Integer32 *) (buf + 120) = shift8(ptpClock->utc_reasonable, 3); +} + +void +msgPackDelayReq(void *buf, Boolean burst, + TimeRepresentation * originTimestamp, PtpClock * ptpClock) +{ + *(UInteger8 *) (buf + 20) = 1; /* messageType */ + *(Integer32 *) (buf + 28) = shift16(flip16(ptpClock->port_id_field), 0) | shift16(flip16(ptpClock->last_sync_event_sequence_number), 1); + *(UInteger8 *) (buf + 32) = PTP_DELAY_REQ_MESSAGE; /* control */ + if (ptpClock->burst_enabled && burst) + setFlag((buf + 34), PTP_SYNC_BURST); + else + clearFlag((buf + 34), PTP_SYNC_BURST); + if (ptpClock->parent_stats) + setFlag((buf + 34), PARENT_STATS); + else + clearFlag((buf + 34), PARENT_STATS); + + *(Integer32 *) (buf + 40) = flip32(originTimestamp->seconds); + *(Integer32 *) (buf + 44) = flip32(originTimestamp->nanoseconds); + *(Integer32 *) (buf + 48) = shift16(flip16(ptpClock->epoch_number), 0) | shift16(flip16(ptpClock->current_utc_offset), 1); + *(Integer32 *) (buf + 52) = shift8(ptpClock->grandmaster_communication_technology, 1); + memcpy((buf + 54), ptpClock->grandmaster_uuid_field, 6); + *(Integer32 *) (buf + 60) = shift16(flip16(ptpClock->grandmaster_port_id_field), 0) | shift16(flip16(ptpClock->grandmaster_sequence_number), 1); + *(Integer32 *) (buf + 64) = shift8(ptpClock->grandmaster_stratum, 3); + memcpy((buf + 68), ptpClock->grandmaster_identifier, 4); + *(Integer32 *) (buf + 72) = shift16(flip16(ptpClock->grandmaster_variance), 1); + *(Integer32 *) (buf + 76) = shift16(flip16(ptpClock->grandmaster_preferred), 0) | shift16(flip16(ptpClock->grandmaster_is_boundary_clock), 1); + *(Integer32 *) (buf + 80) = shift16(flip16(ptpClock->sync_interval), 1); + *(Integer32 *) (buf + 84) = shift16(flip16(ptpClock->clock_variance), 1); + *(Integer32 *) (buf + 88) = shift16(flip16(ptpClock->steps_removed), 1); + *(Integer32 *) (buf + 92) = shift8(ptpClock->clock_stratum, 3); + memcpy((buf + 96), ptpClock->clock_identifier, 4); + *(Integer32 *) (buf + 100) = shift8(ptpClock->parent_communication_technology, 1); + memcpy((buf + 102), ptpClock->parent_uuid, 6); + *(Integer32 *) (buf + 108) = shift16(flip16(ptpClock->parent_port_id), 1); + *(Integer32 *) (buf + 112) = shift16(flip16(ptpClock->observed_variance), 1); + *(Integer32 *) (buf + 116) = flip32(ptpClock->observed_drift); + *(Integer32 *) (buf + 120) = shift8(ptpClock->utc_reasonable, 3); +} + +void +msgPackFollowUp(void *buf, UInteger16 associatedSequenceId, + TimeRepresentation * preciseOriginTimestamp, PtpClock * ptpClock) +{ + *(UInteger8 *) (buf + 20) = 2; /* messageType */ + *(Integer32 *) (buf + 28) = shift16(flip16(ptpClock->port_id_field), 0) | shift16(flip16(ptpClock->last_general_event_sequence_number), 1); + *(UInteger8 *) (buf + 32) = PTP_FOLLOWUP_MESSAGE; /* control */ + clearFlag((buf + 34), PTP_SYNC_BURST); + clearFlag((buf + 34), PARENT_STATS); + + *(Integer32 *) (buf + 40) = shift16(flip16(associatedSequenceId), 1); + *(Integer32 *) (buf + 44) = flip32(preciseOriginTimestamp->seconds); + *(Integer32 *) (buf + 48) = flip32(preciseOriginTimestamp->nanoseconds); +} + +void +msgPackDelayResp(void *buf, MsgHeader * header, + TimeRepresentation * delayReceiptTimestamp, PtpClock * ptpClock) +{ + *(UInteger8 *) (buf + 20) = 2; /* messageType */ + *(Integer32 *) (buf + 28) = shift16(flip16(ptpClock->port_id_field), 0) | shift16(flip16(ptpClock->last_general_event_sequence_number), 1); + *(UInteger8 *) (buf + 32) = PTP_DELAY_RESP_MESSAGE; /* control */ + clearFlag((buf + 34), PTP_SYNC_BURST); + clearFlag((buf + 34), PARENT_STATS); + + *(Integer32 *) (buf + 40) = flip32(delayReceiptTimestamp->seconds); + *(Integer32 *) (buf + 44) = flip32(delayReceiptTimestamp->nanoseconds); + *(Integer32 *) (buf + 48) = shift8(header->sourceCommunicationTechnology, 1); + memcpy(buf + 50, header->sourceUuid, 6); + *(Integer32 *) (buf + 56) = shift16(flip16(header->sourcePortId), 0) | shift16(flip16(header->sequenceId), 1); +} + +UInteger16 +msgPackManagement(void *buf, MsgManagement * manage, PtpClock * ptpClock) +{ + *(UInteger8 *) (buf + 20) = 2; /* messageType */ + *(Integer32 *) (buf + 28) = shift16(flip16(ptpClock->port_id_field), 0) | shift16(flip16(ptpClock->last_general_event_sequence_number), 1); + *(UInteger8 *) (buf + 32) = PTP_MANAGEMENT_MESSAGE; /* control */ + clearFlag((buf + 34), PTP_SYNC_BURST); + clearFlag((buf + 34), PARENT_STATS); + *(Integer32 *) (buf + 40) = shift8(manage->targetCommunicationTechnology, 1); + memcpy(buf + 42, manage->targetUuid, 6); + *(Integer32 *) (buf + 48) = shift16(flip16(manage->targetPortId), 0) | shift16(flip16(MM_STARTING_BOUNDARY_HOPS), 1); + *(Integer32 *) (buf + 52) = shift16(flip16(MM_STARTING_BOUNDARY_HOPS), 0); + + *(UInteger8 *) (buf + 55) = manage->managementMessageKey; + + switch (manage->managementMessageKey) { + case PTP_MM_GET_FOREIGN_DATA_SET: + *(UInteger16 *) (buf + 62) = manage->recordKey; + *(Integer32 *) (buf + 56) = shift16(flip16(4), 1); + return 64; + + default: + *(Integer32 *) (buf + 56) = shift16(flip16(0), 1); + return 60; + } +} + +UInteger16 +msgPackManagementResponse(void *buf, MsgHeader * header, MsgManagement * manage, PtpClock * ptpClock) +{ + TimeInternal internalTime; + TimeRepresentation externalTime; + + *(UInteger8 *) (buf + 20) = 2; /* messageType */ + *(Integer32 *) (buf + 28) = shift16(flip16(ptpClock->port_id_field), 0) | shift16(flip16(ptpClock->last_general_event_sequence_number), 1); + *(UInteger8 *) (buf + 32) = PTP_MANAGEMENT_MESSAGE; /* control */ + clearFlag((buf + 34), PTP_SYNC_BURST); + clearFlag((buf + 34), PARENT_STATS); + *(Integer32 *) (buf + 40) = shift8(header->sourceCommunicationTechnology, 1); + memcpy(buf + 42, header->sourceUuid, 6); + *(Integer32 *) (buf + 48) = shift16(flip16(header->sourcePortId), 0) | shift16(flip16(MM_STARTING_BOUNDARY_HOPS), 1); + *(Integer32 *) (buf + 52) = shift16(flip16(manage->startingBoundaryHops - manage->boundaryHops + 1), 0); + + switch (manage->managementMessageKey) { + case PTP_MM_OBTAIN_IDENTITY: + *(UInteger8 *) (buf + 55) = PTP_MM_CLOCK_IDENTITY; + *(Integer32 *) (buf + 56) = shift16(flip16(64), 1); + *(Integer32 *) (buf + 60) = shift8(ptpClock->clock_communication_technology, 3); + memcpy(buf + 64, ptpClock->clock_uuid_field, 6); + *(Integer32 *) (buf + 72) = shift16(flip16(ptpClock->clock_port_id_field), 1); + memcpy((buf + 76), MANUFACTURER_ID, 48); + return 124; + + case PTP_MM_GET_DEFAULT_DATA_SET: + *(UInteger8 *) (buf + 55) = PTP_MM_DEFAULT_DATA_SET; + *(Integer32 *) (buf + 56) = shift16(flip16(76), 1); + *(Integer32 *) (buf + 60) = shift8(ptpClock->clock_communication_technology, 3); + memcpy(buf + 64, ptpClock->clock_uuid_field, 6); + *(Integer32 *) (buf + 72) = shift16(flip16(ptpClock->clock_port_id_field), 1); + *(Integer32 *) (buf + 76) = shift8(ptpClock->clock_stratum, 3); + memcpy(buf + 80, ptpClock->clock_identifier, 4); + *(Integer32 *) (buf + 84) = shift16(flip16(ptpClock->clock_variance), 1); + *(Integer32 *) (buf + 88) = shift8(ptpClock->clock_followup_capable, 3); + *(Integer32 *) (buf + 92) = shift8(ptpClock->preferred, 3); + *(Integer32 *) (buf + 96) = shift8(ptpClock->initializable, 3); + *(Integer32 *) (buf + 100) = shift8(ptpClock->external_timing, 3); + *(Integer32 *) (buf + 104) = shift8(ptpClock->is_boundary_clock, 3); + *(Integer32 *) (buf + 108) = shift8(ptpClock->sync_interval, 3); + memcpy(buf + 112, ptpClock->subdomain_name, 16); + *(Integer32 *) (buf + 128) = shift16(flip16(ptpClock->number_ports), 1); + *(Integer32 *) (buf + 132) = shift16(flip16(ptpClock->number_foreign_records), 1); + return 136; + + case PTP_MM_GET_CURRENT_DATA_SET: + *(UInteger8 *) (buf + 55) = PTP_MM_CURRENT_DATA_SET; + *(Integer32 *) (buf + 56) = shift16(flip16(20), 1); + *(Integer32 *) (buf + 60) = shift16(flip16(ptpClock->steps_removed), 1); + + fromInternalTime(&ptpClock->offset_from_master, &externalTime, 0); + *(Integer32 *) (buf + 64) = flip32(externalTime.seconds); + *(Integer32 *) (buf + 68) = flip32(externalTime.nanoseconds); + + fromInternalTime(&ptpClock->one_way_delay, &externalTime, 0); + *(Integer32 *) (buf + 72) = flip32(externalTime.seconds); + *(Integer32 *) (buf + 76) = flip32(externalTime.nanoseconds); + return 80; + + case PTP_MM_GET_PARENT_DATA_SET: + *(UInteger8 *) (buf + 55) = PTP_MM_PARENT_DATA_SET; + *(Integer32 *) (buf + 56) = shift16(flip16(90), 1); + *(Integer32 *) (buf + 60) = shift8(ptpClock->parent_communication_technology, 3); + memcpy(buf + 64, ptpClock->parent_uuid, 6); + *(Integer32 *) (buf + 72) = shift16(flip16(ptpClock->parent_port_id), 1); + *(Integer32 *) (buf + 76) = shift16(flip16(ptpClock->parent_last_sync_sequence_number), 1); + *(Integer32 *) (buf + 80) = shift8(ptpClock->parent_followup_capable, 1); + *(Integer32 *) (buf + 84) = shift8(ptpClock->parent_external_timing, 3); + *(Integer32 *) (buf + 88) = shift16(flip16(ptpClock->parent_variance), 1); + *(Integer32 *) (buf + 92) = shift8(ptpClock->parent_stats, 3); + *(Integer32 *) (buf + 96) = shift16(flip16(ptpClock->observed_variance), 1); + *(Integer32 *) (buf + 100) = flip32(ptpClock->observed_drift); + *(Integer32 *) (buf + 104) = shift8(ptpClock->utc_reasonable, 3); + *(Integer32 *) (buf + 108) = shift8(ptpClock->grandmaster_communication_technology, 3); + memcpy(buf + 112, ptpClock->grandmaster_uuid_field, 6); + *(Integer32 *) (buf + 120) = shift16(flip16(ptpClock->grandmaster_port_id_field), 1); + *(Integer32 *) (buf + 124) = shift8(ptpClock->grandmaster_stratum, 3); + memcpy(buf + 128, ptpClock->grandmaster_identifier, 4); + *(Integer32 *) (buf + 132) = shift16(flip16(ptpClock->grandmaster_variance), 1); + *(Integer32 *) (buf + 136) = shift8(ptpClock->grandmaster_preferred, 3); + *(Integer32 *) (buf + 140) = shift8(ptpClock->grandmaster_is_boundary_clock, 3); + *(Integer32 *) (buf + 144) = shift16(flip16(ptpClock->grandmaster_sequence_number), 1); + return 148; + + case PTP_MM_GET_PORT_DATA_SET: + if (manage->targetPortId && manage->targetPortId != ptpClock->port_id_field) { + *(UInteger8 *) (buf + 55) = PTP_MM_NULL; + *(Integer32 *) (buf + 56) = shift16(flip16(0), 1); + return 0; + } + *(UInteger8 *) (buf + 55) = PTP_MM_PORT_DATA_SET; + *(Integer32 *) (buf + 56) = shift16(flip16(52), 1); + *(Integer32 *) (buf + 60) = shift16(flip16(ptpClock->port_id_field), 1); + *(Integer32 *) (buf + 64) = shift8(ptpClock->port_state, 3); + *(Integer32 *) (buf + 68) = shift16(flip16(ptpClock->last_sync_event_sequence_number), 1); + *(Integer32 *) (buf + 72) = shift16(flip16(ptpClock->last_general_event_sequence_number), 1); + *(Integer32 *) (buf + 76) = shift8(ptpClock->port_communication_technology, 3); + memcpy(buf + 80, ptpClock->port_uuid_field, 6); + *(Integer32 *) (buf + 88) = shift16(flip16(ptpClock->port_id_field), 1); + *(Integer32 *) (buf + 92) = shift8(ptpClock->burst_enabled, 3); + *(Integer32 *) (buf + 96) = shift8(4, 1) | shift8(2, 2) | shift8(2, 3); + memcpy(buf + 100, ptpClock->subdomain_address, 4); + memcpy(buf + 106, ptpClock->event_port_address, 2); + memcpy(buf + 110, ptpClock->general_port_address, 2); + return 112; + + case PTP_MM_GET_GLOBAL_TIME_DATA_SET: + *(UInteger8 *) (buf + 55) = PTP_MM_GLOBAL_TIME_DATA_SET; + *(Integer32 *) (buf + 56) = shift16(flip16(24), 1); + + getTime(&internalTime); + fromInternalTime(&internalTime, &externalTime, ptpClock->halfEpoch); + *(Integer32 *) (buf + 60) = flip32(externalTime.seconds); + *(Integer32 *) (buf + 64) = flip32(externalTime.nanoseconds); + + *(Integer32 *) (buf + 68) = shift16(flip16(ptpClock->current_utc_offset), 1); + *(Integer32 *) (buf + 72) = shift8(ptpClock->leap_59, 3); + *(Integer32 *) (buf + 76) = shift8(ptpClock->leap_61, 3); + *(Integer32 *) (buf + 80) = shift16(flip16(ptpClock->epoch_number), 1); + return 84; + + case PTP_MM_GET_FOREIGN_DATA_SET: + if ((manage->targetPortId && manage->targetPortId != ptpClock->port_id_field) + || !manage->recordKey || manage->recordKey > ptpClock->number_foreign_records) { + *(UInteger8 *) (buf + 55) = PTP_MM_NULL; + *(Integer32 *) (buf + 56) = shift16(flip16(0), 1); + return 0; + } + *(UInteger8 *) (buf + 55) = PTP_MM_FOREIGN_DATA_SET; + *(Integer32 *) (buf + 56) = shift16(flip16(28), 1); + *(Integer32 *) (buf + 60) = shift16(flip16(ptpClock->port_id_field), 1); + *(Integer32 *) (buf + 64) = shift16(flip16(manage->recordKey - 1), 1); + *(Integer32 *) (buf + 68) = shift8(ptpClock->foreign[manage->recordKey - 1].foreign_master_communication_technology, 3); + memcpy(buf + 72, ptpClock->foreign[manage->recordKey - 1].foreign_master_uuid, 6); + *(Integer32 *) (buf + 80) = shift16(flip16(ptpClock->foreign[manage->recordKey - 1].foreign_master_port_id), 1); + *(Integer32 *) (buf + 84) = shift16(flip16(ptpClock->foreign[manage->recordKey - 1].foreign_master_syncs), 1); + return 88; + + default: + return 0; + } +} diff --git a/third_party/ptpd-1.1.0/src/dep/net.c b/third_party/ptpd-1.1.0/src/dep/net.c new file mode 100644 index 0000000..76c1ac3 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep/net.c @@ -0,0 +1,570 @@ +/** + * @file net.c + * @date Tue Jul 20 16:17:49 2010 + * + * @brief Functions to interact with the network sockets and NIC driver. + * + * + */ + +#include "../ptpd.h" + +Boolean +lookupSubdomainAddress(Octet * subdomainName, Octet * subdomainAddress) +{ + UInteger32 h; + + /* set multicast group address based on subdomainName */ + if (!memcmp(subdomainName, DEFAULT_PTP_DOMAIN_NAME, PTP_SUBDOMAIN_NAME_LENGTH)) + memcpy(subdomainAddress, DEFAULT_PTP_DOMAIN_ADDRESS, NET_ADDRESS_LENGTH); + else if (!memcmp(subdomainName, ALTERNATE_PTP_DOMAIN1_NAME, PTP_SUBDOMAIN_NAME_LENGTH)) + memcpy(subdomainAddress, ALTERNATE_PTP_DOMAIN1_ADDRESS, NET_ADDRESS_LENGTH); + else if (!memcmp(subdomainName, ALTERNATE_PTP_DOMAIN2_NAME, PTP_SUBDOMAIN_NAME_LENGTH)) + memcpy(subdomainAddress, ALTERNATE_PTP_DOMAIN2_ADDRESS, NET_ADDRESS_LENGTH); + else if (!memcmp(subdomainName, ALTERNATE_PTP_DOMAIN3_NAME, PTP_SUBDOMAIN_NAME_LENGTH)) + memcpy(subdomainAddress, ALTERNATE_PTP_DOMAIN3_ADDRESS, NET_ADDRESS_LENGTH); + else { + h = crc_algorithm(subdomainName, PTP_SUBDOMAIN_NAME_LENGTH) % 3; + switch (h) { + case 0: + memcpy(subdomainAddress, ALTERNATE_PTP_DOMAIN1_ADDRESS, NET_ADDRESS_LENGTH); + break; + case 1: + memcpy(subdomainAddress, ALTERNATE_PTP_DOMAIN2_ADDRESS, NET_ADDRESS_LENGTH); + break; + case 2: + memcpy(subdomainAddress, ALTERNATE_PTP_DOMAIN3_ADDRESS, NET_ADDRESS_LENGTH); + break; + default: + ERROR("handle out of range for '%s'!\n", subdomainName); + return FALSE; + } + } + + return TRUE; +} + +UInteger8 +lookupCommunicationTechnology(UInteger8 communicationTechnology) +{ +#if defined(linux) + + switch (communicationTechnology) { + case ARPHRD_ETHER: + case ARPHRD_EETHER: + case ARPHRD_IEEE802: + return PTP_ETHER; + + default: + break; + } + +#elif defined(BSD_INTERFACE_FUNCTIONS) + +#endif + + return PTP_DEFAULT; +} + +UInteger32 +findIface(Octet * ifaceName, UInteger8 * communicationTechnology, + Octet * uuid, NetPath * netPath) +{ +#if defined(linux) + + /* depends on linux specific ioctls (see 'netdevice' man page) */ + int i, flags; + struct ifconf data; + struct ifreq device[IFCONF_LENGTH]; + + data.ifc_len = sizeof(device); + data.ifc_req = device; + + memset(data.ifc_buf, 0, data.ifc_len); + + flags = IFF_UP | IFF_RUNNING | IFF_MULTICAST; + + /* look for an interface if none specified */ + if (ifaceName[0] != '\0') { + i = 0; + memcpy(device[i].ifr_name, ifaceName, IFACE_NAME_LENGTH); + + if (ioctl(netPath->eventSock, SIOCGIFHWADDR, &device[i]) < 0) + DBGV("failed to get hardware address\n"); + else if ((*communicationTechnology = lookupCommunicationTechnology(device[i].ifr_hwaddr.sa_family)) == PTP_DEFAULT) + DBGV("unsupported communication technology (%d)\n", *communicationTechnology); + else + memcpy(uuid, device[i].ifr_hwaddr.sa_data, PTP_UUID_LENGTH); + } else { + /* no iface specified */ + /* get list of network interfaces */ + if (ioctl(netPath->eventSock, SIOCGIFCONF, &data) < 0) { + PERROR("failed query network interfaces"); + return 0; + } + if (data.ifc_len >= sizeof(device)) + DBG("device list may exceed allocated space\n"); + + /* search through interfaces */ + for (i = 0; i < data.ifc_len / sizeof(device[0]); ++i) { + DBGV("%d %s %s\n", i, device[i].ifr_name, inet_ntoa(((struct sockaddr_in *)&device[i].ifr_addr)->sin_addr)); + + if (ioctl(netPath->eventSock, SIOCGIFFLAGS, &device[i]) < 0) + DBGV("failed to get device flags\n"); + else if ((device[i].ifr_flags & flags) != flags) + DBGV("does not meet requirements (%08x, %08x)\n", device[i].ifr_flags, flags); + else if (ioctl(netPath->eventSock, SIOCGIFHWADDR, &device[i]) < 0) + DBGV("failed to get hardware address\n"); + else if ((*communicationTechnology = lookupCommunicationTechnology(device[i].ifr_hwaddr.sa_family)) == PTP_DEFAULT) + DBGV("unsupported communication technology (%d)\n", *communicationTechnology); + else { + DBGV("found interface (%s)\n", device[i].ifr_name); + + memcpy(uuid, device[i].ifr_hwaddr.sa_data, PTP_UUID_LENGTH); + memcpy(ifaceName, device[i].ifr_name, IFACE_NAME_LENGTH); + + break; + } + } + } + + if (ifaceName[0] == '\0') { + ERROR("failed to find a usable interface\n"); + return 0; + } + if (ioctl(netPath->eventSock, SIOCGIFADDR, &device[i]) < 0) { + PERROR("failed to get ip address"); + return 0; + } + return ((struct sockaddr_in *)&device[i].ifr_addr)->sin_addr.s_addr; + +#elif defined(BSD_INTERFACE_FUNCTIONS) + + struct ifaddrs *if_list, *ifv4, *ifh; + + if (getifaddrs(&if_list) < 0) { + PERROR("getifaddrs() failed"); + return FALSE; + } + /* find an IPv4, multicast, UP interface, right name(if supplied) */ + for (ifv4 = if_list; ifv4 != NULL; ifv4 = ifv4->ifa_next) { + if ((ifv4->ifa_flags & IFF_UP) == 0) + continue; + if ((ifv4->ifa_flags & IFF_RUNNING) == 0) + continue; + if ((ifv4->ifa_flags & IFF_LOOPBACK)) + continue; + if ((ifv4->ifa_flags & IFF_MULTICAST) == 0) + continue; + if (ifv4->ifa_addr->sa_family != AF_INET) /* must have IPv4 + * address */ + continue; + + if (ifaceName[0] && strncmp(ifv4->ifa_name, ifaceName, IF_NAMESIZE) != 0) + continue; + + break; + } + + if (ifv4 == NULL) { + if (ifaceName[0]) { + ERROR("interface \"%s\" does not exist, or is not appropriate\n", ifaceName); + return FALSE; + } + ERROR("no suitable interfaces found!"); + return FALSE; + } + /* find the AF_LINK info associated with the chosen interface */ + for (ifh = if_list; ifh != NULL; ifh = ifh->ifa_next) { + if (ifh->ifa_addr->sa_family != AF_LINK) + continue; + if (strncmp(ifv4->ifa_name, ifh->ifa_name, IF_NAMESIZE) == 0) + break; + } + + if (ifh == NULL) { + ERROR("could not get hardware address for interface \"%s\"\n", ifv4->ifa_name); + return FALSE; + } + /* check that the interface TYPE is OK */ + if (((struct sockaddr_dl *)ifh->ifa_addr)->sdl_type != IFT_ETHER) { + ERROR("\"%s\" is not an ethernet interface!\n", ifh->ifa_name); + return FALSE; + } + + DBG("==> %s %s %s\n", ifv4->ifa_name, + inet_ntoa(((struct sockaddr_in *)ifv4->ifa_addr)->sin_addr), + ether_ntoa((struct ether_addr *) + LLADDR((struct sockaddr_dl *)ifh->ifa_addr))); + + *communicationTechnology = PTP_ETHER; + memcpy(ifaceName, ifh->ifa_name, IFACE_NAME_LENGTH); + memcpy(uuid, LLADDR((struct sockaddr_dl *)ifh->ifa_addr), PTP_UUID_LENGTH); + + return ((struct sockaddr_in *)ifv4->ifa_addr)->sin_addr.s_addr; + +#endif +} + +/* start all of the UDP stuff */ +/* must specify 'subdomainName', optionally 'ifaceName', if not then pass ifaceName == "" */ +/* returns other args */ +/* on socket options, see the 'socket(7)' and 'ip' man pages */ +Boolean +netInit(NetPath * netPath, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + int temp, i; + struct in_addr interfaceAddr, netAddr; + struct sockaddr_in addr; + struct ip_mreq imr; + char addrStr[NET_ADDRESS_LENGTH]; + char *s; + + DBG("netInit\n"); + + /* open sockets */ + if ((netPath->eventSock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 + || (netPath->generalSock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { + PERROR("failed to initalize sockets"); + return FALSE; + } + /* find a network interface */ + if (!(interfaceAddr.s_addr = findIface(rtOpts->ifaceName, &ptpClock->port_communication_technology, + ptpClock->port_uuid_field, netPath))) + return FALSE; + + temp = 1; /* allow address reuse */ + if (setsockopt(netPath->eventSock, SOL_SOCKET, SO_REUSEADDR, &temp, sizeof(int)) < 0 + || setsockopt(netPath->generalSock, SOL_SOCKET, SO_REUSEADDR, &temp, sizeof(int)) < 0) { + DBG("failed to set socket reuse\n"); + } + /* bind sockets */ + /* + * need INADDR_ANY to allow receipt of multi-cast and uni-cast + * messages + */ + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr.sin_port = htons(PTP_EVENT_PORT); + if (bind(netPath->eventSock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { + PERROR("failed to bind event socket"); + return FALSE; + } + addr.sin_port = htons(PTP_GENERAL_PORT); + if (bind(netPath->generalSock, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { + PERROR("failed to bind general socket"); + return FALSE; + } + /* set general and port address */ + *(Integer16 *) ptpClock->event_port_address = PTP_EVENT_PORT; + *(Integer16 *) ptpClock->general_port_address = PTP_GENERAL_PORT; + + /* send a uni-cast address if specified (useful for testing) */ + if (rtOpts->unicastAddress[0]) { + if (!inet_aton(rtOpts->unicastAddress, &netAddr)) { + ERROR("failed to encode uni-cast address: %s\n", rtOpts->unicastAddress); + return FALSE; + } + netPath->unicastAddr = netAddr.s_addr; + } else + netPath->unicastAddr = 0; + + /* resolve PTP subdomain */ + if (!lookupSubdomainAddress(rtOpts->subdomainName, addrStr)) + return FALSE; + + if (!inet_aton(addrStr, &netAddr)) { + ERROR("failed to encode multi-cast address: %s\n", addrStr); + return FALSE; + } + netPath->multicastAddr = netAddr.s_addr; + + s = addrStr; + for (i = 0; i < SUBDOMAIN_ADDRESS_LENGTH; ++i) { + ptpClock->subdomain_address[i] = strtol(s, &s, 0); + + if (!s) + break; + + ++s; + } + + /* multicast send only on specified interface */ + imr.imr_multiaddr.s_addr = netAddr.s_addr; + imr.imr_interface.s_addr = interfaceAddr.s_addr; + if (setsockopt(netPath->eventSock, IPPROTO_IP, IP_MULTICAST_IF, &imr.imr_interface.s_addr, sizeof(struct in_addr)) < 0 + || setsockopt(netPath->generalSock, IPPROTO_IP, IP_MULTICAST_IF, &imr.imr_interface.s_addr, sizeof(struct in_addr)) < 0) { + PERROR("failed to enable multi-cast on the interface"); + return FALSE; + } + /* join multicast group (for receiving) on specified interface */ + if (setsockopt(netPath->eventSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(struct ip_mreq)) < 0 + || setsockopt(netPath->generalSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &imr, sizeof(struct ip_mreq)) < 0) { + PERROR("failed to join the multi-cast group"); + return FALSE; + } + /* set socket time-to-live */ + if (setsockopt(netPath->eventSock, IPPROTO_IP, IP_MULTICAST_TTL, &rtOpts->ttl, sizeof(int)) < 0 + || setsockopt(netPath->generalSock, IPPROTO_IP, IP_MULTICAST_TTL, &rtOpts->ttl, sizeof(int)) < 0) { + PERROR("failed to set the multi-cast time-to-live"); + return FALSE; + } + /* enable loopback */ + temp = 1; + if (setsockopt(netPath->eventSock, IPPROTO_IP, IP_MULTICAST_LOOP, &temp, sizeof(int)) < 0 + || setsockopt(netPath->generalSock, IPPROTO_IP, IP_MULTICAST_LOOP, &temp, sizeof(int)) < 0) { + PERROR("failed to enable multi-cast loopback"); + return FALSE; + } + /* make timestamps available through recvmsg() */ + + temp = 1; +#if defined(linux) + if (setsockopt(netPath->eventSock, SOL_SOCKET, SO_TIMESTAMP, &temp, sizeof(int)) < 0 + || setsockopt(netPath->generalSock, SOL_SOCKET, SO_TIMESTAMP, &temp, sizeof(int)) < 0) { +#else /* BSD */ + if (setsockopt(netPath->eventSock, SOL_SOCKET, SO_BINTIME, &temp, sizeof(int)) < 0 + || setsockopt(netPath->generalSock, SOL_SOCKET, SO_BINTIME, &temp, sizeof(int)) < 0) { +#endif /* linux or BSD */ + PERROR("failed to enable receive time stamps"); + return FALSE; + } + + return TRUE; +} + +/* shut down the UDP stuff */ +Boolean +netShutdown(NetPath * netPath) +{ + struct ip_mreq imr; + + imr.imr_multiaddr.s_addr = netPath->multicastAddr; + imr.imr_interface.s_addr = htonl(INADDR_ANY); + + setsockopt(netPath->eventSock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &imr, sizeof(struct ip_mreq)); + setsockopt(netPath->generalSock, IPPROTO_IP, IP_DROP_MEMBERSHIP, &imr, sizeof(struct ip_mreq)); + + netPath->multicastAddr = 0; + netPath->unicastAddr = 0; + + if (netPath->eventSock > 0) + close(netPath->eventSock); + netPath->eventSock = -1; + + if (netPath->generalSock > 0) + close(netPath->generalSock); + netPath->generalSock = -1; + + return TRUE; +} + +int +netSelect(TimeInternal * timeout, NetPath * netPath) +{ + int ret, nfds; + fd_set readfds; + struct timeval tv, *tv_ptr; + + if (timeout < 0) + return FALSE; + + FD_ZERO(&readfds); + FD_SET(netPath->eventSock, &readfds); + FD_SET(netPath->generalSock, &readfds); + + if (timeout) { + tv.tv_sec = timeout->seconds; + tv.tv_usec = timeout->nanoseconds / 1000; + tv_ptr = &tv; + } else + tv_ptr = 0; + + if (netPath->eventSock > netPath->generalSock) + nfds = netPath->eventSock; + else + nfds = netPath->generalSock; + + ret = select(nfds + 1, &readfds, 0, 0, tv_ptr) > 0; + if (ret < 0) { + if (errno == EAGAIN || errno == EINTR) + return 0; + } + return ret; +} + +ssize_t +netRecvEvent(Octet * buf, TimeInternal * time, NetPath * netPath) +{ + ssize_t ret; + struct msghdr msg; + struct iovec vec[1]; + struct sockaddr_in from_addr; + union { + struct cmsghdr cm; + char control[CMSG_SPACE(sizeof(struct timeval))]; + } cmsg_un; + struct cmsghdr *cmsg; +#if defined(linux) + struct timeval *tv; +#else /* FreeBSD */ + struct timespec ts; +#endif /* FreeBSD or Linux */ + + vec[0].iov_base = buf; + vec[0].iov_len = PACKET_SIZE; + + memset(&msg, 0, sizeof(msg)); + memset(&from_addr, 0, sizeof(from_addr)); + memset(buf, 0, PACKET_SIZE); + memset(&cmsg_un, 0, sizeof(cmsg_un)); + + msg.msg_name = (caddr_t)&from_addr; + msg.msg_namelen = sizeof(from_addr); + msg.msg_iov = vec; + msg.msg_iovlen = 1; + msg.msg_control = cmsg_un.control; + msg.msg_controllen = sizeof(cmsg_un.control); + msg.msg_flags = 0; + + ret = recvmsg(netPath->eventSock, &msg, MSG_DONTWAIT); + if (ret <= 0) { + if (errno == EAGAIN || errno == EINTR) + return 0; + + return ret; + } + if (msg.msg_flags & MSG_TRUNC) { + ERROR("received truncated message\n"); + return 0; + } + /* get time stamp of packet */ + if (!time) { + ERROR("null receive time stamp argument\n"); + return 0; + } + if (msg.msg_flags & MSG_CTRUNC) { + ERROR("received truncated ancillary data\n"); + return 0; + } + if (msg.msg_controllen < sizeof(cmsg_un.control)) { + ERROR("received short ancillary data (%d/%d)\n", + msg.msg_controllen, (int)sizeof(cmsg_un.control)); + + return 0; + } + +#if defined(linux) + tv = 0; + for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; + cmsg = CMSG_NXTHDR(&msg, cmsg)) + if (cmsg->cmsg_level == SOL_SOCKET && + cmsg->cmsg_type == SCM_TIMESTAMP) + tv = (struct timeval *)CMSG_DATA(cmsg); + + if (tv) { + time->seconds = tv->tv_sec; + time->nanoseconds = tv->tv_usec * 1000; + DBGV("kernel recv time stamp %us %dns\n", time->seconds, time->nanoseconds); + } else { + /* + * do not try to get by with recording the time here, better + * to fail because the time recorded could be well after the + * message receive, which would put a big spike in the + * offset signal sent to the clock servo + */ + DBG("no recieve time stamp\n"); + return 0; + } +#else /* FreeBSD */ + bzero(&ts, sizeof(ts)); + for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL; + cmsg = CMSG_NXTHDR(&msg, cmsg)) + if (cmsg->cmsg_level == SOL_SOCKET && + cmsg->cmsg_type == SCM_BINTIME) + bintime2timespec((struct bintime *)CMSG_DATA(cmsg), + &ts); + + if (ts.tv_sec != 0) { + time->seconds = ts.tv_sec; + time->nanoseconds = ts.tv_nsec; + DBGV("kernel recv time stamp %us %dns\n", time->seconds, time->nanoseconds); + } else { + /* + * do not try to get by with recording the time here, better + * to fail because the time recorded could be well after the + * message receive, which would put a big spike in the + * offset signal sent to the clock servo + */ + DBG("no recieve time stamp\n"); + return 0; + } +#endif /* FreeBSD or Linux */ + + return ret; +} + +ssize_t +netRecvGeneral(Octet * buf, NetPath * netPath) +{ + ssize_t ret; + struct sockaddr_in addr; + socklen_t addr_len = sizeof(struct sockaddr_in); + + ret = recvfrom(netPath->generalSock, buf, PACKET_SIZE, MSG_DONTWAIT, (struct sockaddr *)&addr, &addr_len); + if (ret <= 0) { + if (errno == EAGAIN || errno == EINTR) + return 0; + + return ret; + } + return ret; +} + +ssize_t +netSendEvent(Octet * buf, UInteger16 length, NetPath * netPath) +{ + ssize_t ret; + struct sockaddr_in addr; + + addr.sin_family = AF_INET; + addr.sin_port = htons(PTP_EVENT_PORT); + addr.sin_addr.s_addr = netPath->multicastAddr; + + ret = sendto(netPath->eventSock, buf, length, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); + if (ret <= 0) + DBG("error sending multi-cast event message\n"); + + if (netPath->unicastAddr) { + addr.sin_addr.s_addr = netPath->unicastAddr; + + ret = sendto(netPath->eventSock, buf, length, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); + if (ret <= 0) + DBG("error sending uni-cast event message\n"); + } + return ret; +} + +ssize_t +netSendGeneral(Octet * buf, UInteger16 length, NetPath * netPath) +{ + ssize_t ret; + struct sockaddr_in addr; + + addr.sin_family = AF_INET; + addr.sin_port = htons(PTP_GENERAL_PORT); + addr.sin_addr.s_addr = netPath->multicastAddr; + + ret = sendto(netPath->generalSock, buf, length, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); + if (ret <= 0) + DBG("error sending multi-cast general message\n"); + + if (netPath->unicastAddr) { + addr.sin_addr.s_addr = netPath->unicastAddr; + + ret = sendto(netPath->eventSock, buf, length, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); + if (ret <= 0) + DBG("error sending uni-cast general message\n"); + } + return ret; +} diff --git a/third_party/ptpd-1.1.0/src/dep/ptpd_dep.h b/third_party/ptpd-1.1.0/src/dep/ptpd_dep.h new file mode 100644 index 0000000..63cf674 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep/ptpd_dep.h @@ -0,0 +1,154 @@ +/** + * @file ptpd_dep.h + * @date Tue Jul 20 16:18:39 2010 + * + * @brief External definitions for inclusion elsewhere. + * + * + */ + +#ifndef PTPD_DEP_H +#define PTPD_DEP_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* system messages */ +#define ERROR(x, ...) message(LOG_ERR, x, ##__VA_ARGS__) +#define PERROR(x, ...) message(LOG_ERR, x ": %m\n", ##__VA_ARGS__) +#define NOTIFY(x, ...) message(LOG_NOTICE, x, ##__VA_ARGS__) +#define INFO(x, ...) message(LOG_INFO, x, ##__VA_ARGS__) + +/* debug messages */ +#ifdef PTPD_DBGV +#define PTPD_DBG +#define DBGV(x, ...) message(LOG_DEBUG, x, ##__VA_ARGS__) +#else +#define DBGV(x, ...) +#endif + +#ifdef PTPD_DBG +#define DBG(x, ...) message(LOG_DEBUG, x, ##__VA_ARGS__) +#else +#define DBG(x, ...) +#endif + +/* endian corrections */ +#if defined(PTPD_MSBF) +#define shift8(x,y) ( (x) << ((3-y)<<3) ) +#define shift16(x,y) ( (x) << ((1-y)<<4) ) +#elif defined(PTPD_LSBF) +#define shift8(x,y) ( (x) << ((y)<<3) ) +#define shift16(x,y) ( (x) << ((y)<<4) ) +#endif + +#define flip16(x) htons(x) +#define flip32(x) htonl(x) + +/* i don't know any target platforms that do not have htons and htonl, + but here are generic funtions just in case */ +/* +#if defined(PTPD_MSBF) +#define flip16(x) (x) +#define flip32(x) (x) +#elif defined(PTPD_LSBF) +static inline Integer16 flip16(Integer16 x) +{ + return (((x) >> 8) & 0x00ff) | (((x) << 8) & 0xff00); +} + +static inline Integer32 flip32(x) +{ + return (((x) >> 24) & 0x000000ff) | (((x) >> 8 ) & 0x0000ff00) | + (((x) << 8 ) & 0x00ff0000) | (((x) << 24) & 0xff000000); +} +#endif +*/ + +/* bit array manipulation */ +#define getFlag(x,y) !!( *(UInteger8*)((x)+((y)<8?1:0)) & (1<<((y)<8?(y):(y)-8)) ) +#define setFlag(x,y) ( *(UInteger8*)((x)+((y)<8?1:0)) |= 1<<((y)<8?(y):(y)-8) ) +#define clearFlag(x,y) ( *(UInteger8*)((x)+((y)<8?1:0)) &= ~(1<<((y)<8?(y):(y)-8)) ) + + +/* msg.c */ +Boolean msgPeek(void *, ssize_t); +void msgUnpackHeader(void *, MsgHeader *); +void msgUnpackSync(void *, MsgSync *); +void msgUnpackDelayReq(void *, MsgDelayReq *); +void msgUnpackFollowUp(void *, MsgFollowUp *); +void msgUnpackDelayResp(void *, MsgDelayResp *); +void msgUnpackManagement(void *, MsgManagement *); +UInteger8 msgUnloadManagement(void *, MsgManagement *, PtpClock *, RunTimeOpts *); +void msgUnpackManagementPayload(void *buf, MsgManagement * manage); +void msgPackHeader(void *, PtpClock *); +void msgPackSync(void *, Boolean, TimeRepresentation *, PtpClock *); +void msgPackDelayReq(void *, Boolean, TimeRepresentation *, PtpClock *); +void msgPackFollowUp(void *, UInteger16, TimeRepresentation *, PtpClock *); +void msgPackDelayResp(void *, MsgHeader *, TimeRepresentation *, PtpClock *); +UInteger16 msgPackManagement(void *, MsgManagement *, PtpClock *); +UInteger16 msgPackManagementResponse(void *, MsgHeader *, MsgManagement *, PtpClock *); + +/* net.c */ +/* linux API dependent */ +Boolean netInit(NetPath *, RunTimeOpts *, PtpClock *); +Boolean netShutdown(NetPath *); +int netSelect(TimeInternal *, NetPath *); +ssize_t netRecvEvent(Octet *, TimeInternal *, NetPath *); +ssize_t netRecvGeneral(Octet *, NetPath *); +ssize_t netSendEvent(Octet *, UInteger16, NetPath *); +ssize_t netSendGeneral(Octet *, UInteger16, NetPath *); + +/* servo.c */ +void initClock(RunTimeOpts *, PtpClock *); +void +updateDelay(TimeInternal *, TimeInternal *, + one_way_delay_filter *, RunTimeOpts *, PtpClock *); +void +updateOffset(TimeInternal *, TimeInternal *, + offset_from_master_filter *, RunTimeOpts *, PtpClock *); +void updateClock(RunTimeOpts *, PtpClock *); + +/* startup.c */ +/* unix API dependent */ +int logToFile(); +int recordToFile(); +PtpClock *ptpdStartup(int, char **, Integer16 *, RunTimeOpts *); +void ptpdShutdown(void); + +/* sys.c */ +char *translatePortState(PtpClock *ptpClock); +/* unix API dependent */ +void message(int priority, const char *format, ...); +void displayStats(RunTimeOpts *, PtpClock *); +Boolean nanoSleep(TimeInternal *); +void getTime(TimeInternal *); +void setTime(TimeInternal *); +UInteger16 getRand(UInteger32 *); +Boolean adjFreq(Integer32); + +/* timer.c */ +void initTimer(void); +void timerUpdate(IntervalTimer *); +void timerStop(UInteger16, IntervalTimer *); +void timerStart(UInteger16, UInteger16, IntervalTimer *); +Boolean timerExpired(UInteger16, IntervalTimer *); + + +#endif diff --git a/third_party/ptpd-1.1.0/src/dep/servo.c b/third_party/ptpd-1.1.0/src/dep/servo.c new file mode 100644 index 0000000..b888593 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep/servo.c @@ -0,0 +1,215 @@ +/** + * @file servo.c + * @date Tue Jul 20 16:19:19 2010 + * + * @brief Code which implements the clock servo in software. + * + * + */ + +#include "../ptpd.h" + +void +initClock(RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + DBG("initClock\n"); + + /* clear vars */ + ptpClock->master_to_slave_delay.seconds = ptpClock->master_to_slave_delay.nanoseconds = 0; + ptpClock->slave_to_master_delay.seconds = ptpClock->slave_to_master_delay.nanoseconds = 0; + ptpClock->observed_variance = 0; + ptpClock->observed_drift = 0; /* clears clock servo accumulator (the + * I term) */ + ptpClock->owd_filt.s_exp = 0; /* clears one-way delay filter */ + ptpClock->halfEpoch = ptpClock->halfEpoch || rtOpts->halfEpoch; + rtOpts->halfEpoch = 0; + + /* level clock */ + if (!rtOpts->noAdjust) + adjFreq(0); +} + +void +updateDelay(TimeInternal * send_time, TimeInternal * recv_time, + one_way_delay_filter * owd_filt, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + Integer16 s; + TimeInternal slave_to_master_delay; + + DBGV("updateDelay\n"); + + /* calc 'slave_to_master_delay' */ + subTime(&slave_to_master_delay, recv_time, send_time); + + if (rtOpts->maxDelay) { /* If maxDelay is 0 then it's OFF */ + if (slave_to_master_delay.seconds && rtOpts->maxDelay) { + INFO("updateDelay aborted, delay greater than 1" + " second."); + return; + } + + if (slave_to_master_delay.nanoseconds > rtOpts->maxDelay) { + INFO("updateDelay aborted, delay %d greater than " + "administratively set maximum %d\n", + slave_to_master_delay.nanoseconds, + rtOpts->maxDelay); + return; + } + } + + ptpClock->slave_to_master_delay = slave_to_master_delay; + + /* update 'one_way_delay' */ + addTime(&ptpClock->one_way_delay, &ptpClock->master_to_slave_delay, &ptpClock->slave_to_master_delay); + ptpClock->one_way_delay.seconds /= 2; + ptpClock->one_way_delay.nanoseconds /= 2; + + if (ptpClock->one_way_delay.seconds) { + /* cannot filter with secs, clear filter */ + owd_filt->s_exp = owd_filt->nsec_prev = 0; + return; + } + /* avoid overflowing filter */ + s = rtOpts->s; + while (abs(owd_filt->y) >> (31 - s)) + --s; + + /* crank down filter cutoff by increasing 's_exp' */ + if (owd_filt->s_exp < 1) + owd_filt->s_exp = 1; + else if (owd_filt->s_exp < 1 << s) + ++owd_filt->s_exp; + else if (owd_filt->s_exp > 1 << s) + owd_filt->s_exp = 1 << s; + + /* filter 'one_way_delay' */ + owd_filt->y = (owd_filt->s_exp - 1) * owd_filt->y / owd_filt->s_exp + + (ptpClock->one_way_delay.nanoseconds / 2 + owd_filt->nsec_prev / 2) / owd_filt->s_exp; + + owd_filt->nsec_prev = ptpClock->one_way_delay.nanoseconds; + ptpClock->one_way_delay.nanoseconds = owd_filt->y; + + DBG("delay filter %d, %d\n", owd_filt->y, owd_filt->s_exp); +} + +void +updateOffset(TimeInternal * send_time, TimeInternal * recv_time, + offset_from_master_filter * ofm_filt, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + TimeInternal master_to_slave_delay; + DBGV("updateOffset\n"); + + /* calc 'master_to_slave_delay' */ + subTime(&master_to_slave_delay, recv_time, send_time); + + if (rtOpts->maxDelay) { /* If maxDelay is 0 then it's OFF */ + if (master_to_slave_delay.seconds && rtOpts->maxDelay) { + INFO("updateDelay aborted, delay greater than 1" + " second."); + return; + } + + if (master_to_slave_delay.nanoseconds > rtOpts->maxDelay) { + INFO("updateDelay aborted, delay %d greater than " + "administratively set maximum %d\n", + master_to_slave_delay.nanoseconds, + rtOpts->maxDelay); + return; + } + } + ptpClock->master_to_slave_delay = master_to_slave_delay; + + /* update 'offset_from_master' */ + subTime(&ptpClock->offset_from_master, &ptpClock->master_to_slave_delay, &ptpClock->one_way_delay); + + if (ptpClock->offset_from_master.seconds) { + /* cannot filter with secs, clear filter */ + ofm_filt->nsec_prev = 0; + return; + } + /* filter 'offset_from_master' */ + ofm_filt->y = ptpClock->offset_from_master.nanoseconds / 2 + ofm_filt->nsec_prev / 2; + ofm_filt->nsec_prev = ptpClock->offset_from_master.nanoseconds; + ptpClock->offset_from_master.nanoseconds = ofm_filt->y; + + DBGV("offset filter %d\n", ofm_filt->y); +} + +void +updateClock(RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + Integer32 adj; + TimeInternal timeTmp; + + DBGV("updateClock\n"); + + if (rtOpts->maxReset) { /* If maxReset is 0 then it's OFF */ + if (ptpClock->offset_from_master.seconds) { + INFO("updateClock aborted, offset greater than 1" + " second."); + goto display; + } + + if (ptpClock->offset_from_master.nanoseconds > + rtOpts->maxReset) { + INFO("updateClock aborted, offset %d greater than " + "administratively set maximum %d\n", + ptpClock->offset_from_master.nanoseconds, + rtOpts->maxReset); + goto display; + } + } + + if (ptpClock->offset_from_master.seconds) { + /* if secs, reset clock or set freq adjustment to max */ + if (!rtOpts->noAdjust) { + if (!rtOpts->noResetClock) { + getTime(&timeTmp); + subTime(&timeTmp, &timeTmp, &ptpClock->offset_from_master); + setTime(&timeTmp); + initClock(rtOpts, ptpClock); + } else { + adj = ptpClock->offset_from_master.nanoseconds > 0 ? ADJ_FREQ_MAX : -ADJ_FREQ_MAX; + adjFreq(-adj); + } + } + } else { + /* the PI controller */ + + /* no negative or zero attenuation */ + if (rtOpts->ap < 1) + rtOpts->ap = 1; + if (rtOpts->ai < 1) + rtOpts->ai = 1; + + /* the accumulator for the I component */ + ptpClock->observed_drift += ptpClock->offset_from_master.nanoseconds / rtOpts->ai; + + /* clamp the accumulator to ADJ_FREQ_MAX for sanity */ + if (ptpClock->observed_drift > ADJ_FREQ_MAX) + ptpClock->observed_drift = ADJ_FREQ_MAX; + else if (ptpClock->observed_drift < -ADJ_FREQ_MAX) + ptpClock->observed_drift = -ADJ_FREQ_MAX; + + adj = ptpClock->offset_from_master.nanoseconds / rtOpts->ap + ptpClock->observed_drift; + + /* apply controller output as a clock tick rate adjustment */ + if (!rtOpts->noAdjust) + adjFreq(-adj); + } + +display: + + if (rtOpts->displayStats) + displayStats(rtOpts, ptpClock); + + DBGV("master-to-slave delay: %10ds %11dns\n", + ptpClock->master_to_slave_delay.seconds, ptpClock->master_to_slave_delay.nanoseconds); + DBGV("slave-to-master delay: %10ds %11dns\n", + ptpClock->slave_to_master_delay.seconds, ptpClock->slave_to_master_delay.nanoseconds); + DBGV("one-way delay: %10ds %11dns\n", + ptpClock->one_way_delay.seconds, ptpClock->one_way_delay.nanoseconds); + DBG("offset from master: %10ds %11dns\n", + ptpClock->offset_from_master.seconds, ptpClock->offset_from_master.nanoseconds); + DBG("observed drift: %10d\n", ptpClock->observed_drift); +} diff --git a/third_party/ptpd-1.1.0/src/dep/startup.c b/third_party/ptpd-1.1.0/src/dep/startup.c new file mode 100644 index 0000000..edbcbfd --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep/startup.c @@ -0,0 +1,364 @@ +/** + * @file startup.c + * @date Wed Jun 23 09:33:27 2010 + * + * @brief Code to handle daemon startup, including command line args + * + * The function in this file are called when the daemon starts up + * and include the getopt() command line argument parsing. + */ + +#include "../ptpd.h" + +PtpClock *ptpClock; + +/** + * Signal handler for catching a close signal + * + * @param sig + */ +void +catch_close(int sig) +{ + char *s; + + ptpdShutdown(); + + switch (sig) { + case SIGINT: + s = "interrupt"; + break; + + case SIGTERM: + s = "terminate"; + break; + + default: + s = "?"; + } + + NOTIFY("shutdown on %s signal\n", s); + + exit(0); +} + +/** + * Signal handler for HUP which tells us to swap the log file. + * + * @param sig + */ +void +catch_sighup(int sig) +{ + if(!logToFile()) + NOTIFY("SIGHUP failed\n"); + else + NOTIFY("I've been SIGHUP'd\n"); + if(!recordToFile()) + NOTIFY("SIGHUP failed\n"); + else + NOTIFY("I've been SIGHUP'd\n"); + +} + +/** + * Log output to a file + * + * + * @return True if success, False if failure + */ +int +logToFile() +{ + extern RunTimeOpts rtOpts; + if(rtOpts.logFd != -1) + close(rtOpts.logFd); + + if((rtOpts.logFd = creat(rtOpts.file, 0444)) != -1) { + dup2(rtOpts.logFd, STDOUT_FILENO); + dup2(rtOpts.logFd, STDERR_FILENO); + } + return (rtOpts.logFd != -1); +} + +/** + * Record quality data for later correlation + * + * + * @return True if success, False if failure + */ +int +recordToFile() +{ + extern RunTimeOpts rtOpts; + + if (rtOpts.recordFP != NULL) + fclose(rtOpts.recordFP); + + if ((rtOpts.recordFP = fopen(rtOpts.recordFile, "w")) == NULL) + PERROR("could not open sync recording file"); + else + setlinebuf(rtOpts.recordFP); + return (rtOpts.recordFP != NULL); +} + +void +ptpdShutdown() +{ + netShutdown(&ptpClock->netPath); + + free(ptpClock->foreign); + free(ptpClock); +} + +PtpClock * +ptpdStartup(int argc, char **argv, Integer16 * ret, RunTimeOpts * rtOpts) +{ + int c, nondaemon = 0, noclose = 0; + + /* parse command line arguments */ + while ((c = getopt(argc, argv, "?cf:dDR:xM:O:ta:w:b:u:l:o:e:hy:m:gpSs:i:v:n:k:rT:")) != -1) { + switch (c) { + case '?': + printf( + "\nUsage: ptpd [OPTION]\n\n" + "-? show this page\n" + "\n" + "-c run in command line (non-daemon) mode\n" + "-f FILE send stats to FILE\n" + "-S send output to syslog \n" + "-T set multicast time to live\n" + "-d display stats\n" + "-D display stats in .csv format\n" + "-R record data about sync packets in a file\n" + "\n" + "-x do not reset the clock if off by more than one second\n" + "-O do not reset the clock if offset is more than NUMBER nanoseconds\n" + "-M do not accept delay values of more than NUMBER nanoseconds\n" + "-t do not adjust the system clock\n" + "-a NUMBER,NUMBER specify clock servo P and I attenuations\n" + "-w NUMBER specify one way delay filter stiffness\n" + "\n" + "-b NAME bind PTP to network interface NAME\n" + "-u ADDRESS also send uni-cast to ADDRESS\n" + "-l NUMBER,NUMBER specify inbound, outbound latency in nsec\n" + "\n" + "-o NUMBER specify current UTC offset\n" + "-e NUMBER specify epoch NUMBER\n" + "-h specify half epoch\n" + "\n" + "-y NUMBER specify sync interval in 2^NUMBER sec\n" + "-m NUMBER specify max number of foreign master records\n" + "\n" + "-g run as slave only\n" + "-p make this a preferred clock\n" + "-s NUMBER specify system clock stratum\n" + "-i NAME specify system clock identifier\n" + "-v NUMBER specify system clock allen variance\n" + "\n" + "-n NAME specify PTP subdomain name (not related to IP or DNS)\n" + "\n" + "-k NUMBER,NUMBER send a management message of key, record, then exit\n" + "\n" + ); + *ret = 0; + return 0; + + case 'c': + nondaemon = 1; + break; + + case 'S': + rtOpts->useSysLog = TRUE; + break; + case 'T': + rtOpts->ttl = atoi(optarg); + break; + case 'f': + strncpy(rtOpts->file, optarg, PATH_MAX); + if(logToFile()) + noclose = 1; + else + PERROR("could not open output file"); + break; + + case 'd': +#ifndef PTPD_DBG + rtOpts->displayStats = TRUE; +#endif + break; + + case 'D': +#ifndef PTPD_DBG + rtOpts->displayStats = TRUE; + rtOpts->csvStats = TRUE; +#endif + break; + + case 'R': + strncpy(rtOpts->recordFile, optarg, PATH_MAX); + if (recordToFile()) + noclose = 1; + else + PERROR("could not open quality file"); + break; + + case 'x': + rtOpts->noResetClock = TRUE; + break; + + case 'O': + rtOpts->maxReset = atoi(optarg); + if (rtOpts->maxReset > 1000000000) { + PERROR("Use -x to prevent jumps of more" + " than one second."); + *ret = 1; + return (0); + } + break; + case 'M': + rtOpts->maxDelay = atoi(optarg); + if (rtOpts->maxDelay > 1000000000) { + PERROR("Use -x to prevent jumps of more" + " than one second."); + *ret = 1; + return (0); + } + break; + case 't': + rtOpts->noAdjust = TRUE; + break; + + case 'a': + rtOpts->ap = strtol(optarg, &optarg, 0); + if (optarg[0]) + rtOpts->ai = strtol(optarg + 1, 0, 0); + break; + + case 'w': + rtOpts->s = strtol(optarg, &optarg, 0); + break; + + case 'b': + memset(rtOpts->ifaceName, 0, IFACE_NAME_LENGTH); + strncpy(rtOpts->ifaceName, optarg, IFACE_NAME_LENGTH); + break; + + case 'u': + strncpy(rtOpts->unicastAddress, optarg, NET_ADDRESS_LENGTH); + break; + + case 'l': + rtOpts->inboundLatency.nanoseconds = strtol(optarg, &optarg, 0); + if (optarg[0]) + rtOpts->outboundLatency.nanoseconds = strtol(optarg + 1, 0, 0); + break; + + case 'o': + rtOpts->currentUtcOffset = strtol(optarg, &optarg, 0); + break; + + case 'e': + rtOpts->epochNumber = strtoul(optarg, &optarg, 0); + break; + + case 'h': + rtOpts->halfEpoch = TRUE; + break; + + case 'y': + rtOpts->syncInterval = strtol(optarg, 0, 0); + break; + + case 'm': + rtOpts->max_foreign_records = strtol(optarg, 0, 0); + if (rtOpts->max_foreign_records < 1) + rtOpts->max_foreign_records = 1; + break; + + case 'g': + rtOpts->slaveOnly = TRUE; + break; + + case 'p': + rtOpts->clockPreferred = TRUE; + break; + + case 's': + rtOpts->clockStratum = strtol(optarg, 0, 0); + if (rtOpts->clockStratum <= 0) + rtOpts->clockStratum = 255; + break; + + case 'i': + memset(rtOpts->clockIdentifier, 0, PTP_CODE_STRING_LENGTH); + strncpy(rtOpts->clockIdentifier, optarg, PTP_CODE_STRING_LENGTH); + break; + + case 'v': + rtOpts->clockVariance = strtol(optarg, 0, 0); + break; + + case 'n': + memset(rtOpts->subdomainName, 0, PTP_SUBDOMAIN_NAME_LENGTH); + strncpy(rtOpts->subdomainName, optarg, PTP_SUBDOMAIN_NAME_LENGTH); + break; + + case 'k': + rtOpts->probe = TRUE; + + rtOpts->probe_management_key = strtol(optarg, &optarg, 0); + if (optarg[0]) + rtOpts->probe_record_key = strtol(optarg + 1, 0, 0); + + nondaemon = 1; + break; + + case 'r': + ERROR("The '-r' option has been removed because it is now the default behaviour.\n"); + ERROR("Use the '-x' option to disable clock resetting.\n"); + *ret = 1; + return 0; + + default: + *ret = 1; + return 0; + } + } + + ptpClock = (PtpClock *) calloc(1, sizeof(PtpClock)); + if (!ptpClock) { + PERROR("failed to allocate memory for protocol engine data"); + *ret = 2; + return 0; + } else { + DBG("allocated %d bytes for protocol engine data\n", (int)sizeof(PtpClock)); + ptpClock->foreign = (ForeignMasterRecord *) calloc(rtOpts->max_foreign_records, sizeof(ForeignMasterRecord)); + if (!ptpClock->foreign) { + PERROR("failed to allocate memory for foreign master data"); + *ret = 2; + free(ptpClock); + return 0; + } else { + DBG("allocated %d bytes for foreign master data\n", (int)(rtOpts->max_foreign_records * sizeof(ForeignMasterRecord))); + } + } + +#ifndef PTPD_NO_DAEMON + if (!nondaemon) { + if (daemon(0, noclose) == -1) { + PERROR("failed to start as daemon"); + *ret = 3; + return 0; + } + DBG("running as daemon\n"); + } +#endif + + signal(SIGINT, catch_close); + signal(SIGTERM, catch_close); + signal(SIGHUP, catch_sighup); + + *ret = 0; + return ptpClock; +} diff --git a/third_party/ptpd-1.1.0/src/dep/sys.c b/third_party/ptpd-1.1.0/src/dep/sys.c new file mode 100644 index 0000000..9e1221e --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep/sys.c @@ -0,0 +1,282 @@ +/** + * @file sys.c + * @date Tue Jul 20 16:19:46 2010 + * + * @brief Code to call kernel time routines and also display server statistics. + * + * + */ + +#include "../ptpd.h" + + +int +isTimeInternalNegative(const TimeInternal * p) +{ + return (p->seconds < 0) || (p->nanoseconds < 0); +} + + +int +snprint_TimeInternal(char *s, int max_len, const TimeInternal * p) +{ + int len = 0; + + if (isTimeInternalNegative(p)) + len += snprintf(&s[len], max_len - len, "-"); + + len += snprintf(&s[len], max_len - len, "%d.%09d", + abs(p->seconds), abs(p->nanoseconds)); + + return len; +} + + + +int +snprint_ClockIdentity(char *s, int max_len, const Octet uuid[PTP_UUID_LENGTH], const char *info) +{ + int len = 0; + int i; + + if (info) + len += snprintf(&s[len], max_len - len, "%s", info); + + for (i = 0; ;) { + len += snprintf(&s[len], max_len - len, "%02x", (unsigned char) uuid[i]); + + if (++i >= PTP_UUID_LENGTH) + break; + + // uncomment the line below to print a separator after each byte except the last one + // len += snprintf(&s[len], max_len - len, "%s", "-"); + } + + return len; +} + + +int +snprint_PortIdentity(char *s, int max_len, const Octet uuid[PTP_UUID_LENGTH], + UInteger16 portId, const char *info) +{ + int len = 0; + + if (info) + len += snprintf(&s[len], max_len - len, "%s", info); + + len += snprint_ClockIdentity(&s[len], max_len - len, uuid, NULL); + len += snprintf(&s[len], max_len - len, ":%02x", portId); + return len; +} + + +void +message(int priority, const char *format, ...) +{ + extern RunTimeOpts rtOpts; + va_list ap; + va_start(ap, format); + if(rtOpts.useSysLog) { + static Boolean logOpened; + if(!logOpened) { + openlog("ptpd", 0, LOG_USER); + logOpened = TRUE; + } + vsyslog(priority, format, ap); + } else { + fprintf(stderr, "(ptpd %s) ", + priority == LOG_EMERG ? "emergency" : + priority == LOG_ALERT ? "alert" : + priority == LOG_CRIT ? "critical" : + priority == LOG_ERR ? "error" : + priority == LOG_WARNING ? "warning" : + priority == LOG_NOTICE ? "notice" : + priority == LOG_INFO ? "info" : + priority == LOG_DEBUG ? "debug" : + "???"); + vfprintf(stderr, format, ap); + } + va_end(ap); +} + +char * +translatePortState(PtpClock *ptpClock) +{ + char *s; + switch(ptpClock->port_state) { + case PTP_INITIALIZING: s = "init"; break; + case PTP_FAULTY: s = "flt"; break; + case PTP_LISTENING: s = "lstn"; break; + case PTP_PASSIVE: s = "pass"; break; + case PTP_UNCALIBRATED: s = "uncl"; break; + case PTP_SLAVE: s = "slv"; break; + case PTP_PRE_MASTER: s = "pmst"; break; + case PTP_MASTER: s = "mst"; break; + case PTP_DISABLED: s = "dsbl"; break; + default: s = "?"; break; + } + return s; +} + +void +displayStats(RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + static int start = 1; + static char sbuf[SCREEN_BUFSZ]; + int len = 0; + struct timeval now; + char time_str[MAXTIMESTR]; + + if (start && rtOpts->csvStats) { + start = 0; + printf("timestamp, state, clock ID, one way delay, " + "offset from master, master to slave, " + "slave to master, drift, variance"); + fflush(stdout); + } + memset(sbuf, ' ', sizeof(sbuf)); + + gettimeofday(&now, 0); + strftime(time_str, MAXTIMESTR, "%Y-%m-%d %X", localtime(&now.tv_sec)); + + len += snprintf(sbuf + len, sizeof(sbuf) - len, "%s%s:%06d, %s", + rtOpts->csvStats ? "\n" : "\rstate: ", + time_str, (int)now.tv_usec, + translatePortState(ptpClock)); + + if (ptpClock->port_state == PTP_SLAVE) { + len += snprint_PortIdentity(sbuf + len, sizeof(sbuf) - len, + ptpClock->parent_uuid, ptpClock->parent_port_id, ", "); + + /* + * if grandmaster ID differs from parent port ID then also + * print GM ID + */ + if (memcmp(ptpClock->grandmaster_uuid_field, + ptpClock->parent_uuid, PTP_UUID_LENGTH)) { + len += snprint_ClockIdentity(sbuf + len, + sizeof(sbuf) - len, + ptpClock->grandmaster_uuid_field, + " GM:"); + } + + len += snprintf(sbuf + len, sizeof(sbuf) - len, ", "); + + if (!rtOpts->csvStats) + len += snprintf(sbuf + len, + sizeof(sbuf) - len, "owd: "); + + len += snprint_TimeInternal(sbuf + len, sizeof(sbuf) - len, + &ptpClock->one_way_delay); + + len += snprintf(sbuf + len, sizeof(sbuf) - len, ", "); + + if (!rtOpts->csvStats) + len += snprintf(sbuf + len, sizeof(sbuf) - len, + "ofm: "); + + len += snprint_TimeInternal(sbuf + len, sizeof(sbuf) - len, + &ptpClock->offset_from_master); + + len += snprintf(sbuf + len, sizeof(sbuf) - len, + ", %s%d.%09d" ", %s%d.%09d", + rtOpts->csvStats ? "" : "stm: ", + ptpClock->slave_to_master_delay.seconds, + abs(ptpClock->slave_to_master_delay.nanoseconds), + rtOpts->csvStats ? "" : "mts: ", + ptpClock->master_to_slave_delay.seconds, + abs(ptpClock->master_to_slave_delay.nanoseconds)); + + len += snprintf(sbuf + len, sizeof(sbuf) - len, + ", %s%d", + rtOpts->csvStats ? "" : "drift: ", + ptpClock->observed_drift); + + len += snprintf(sbuf + len, sizeof(sbuf) - len, + ", %s%d", + rtOpts->csvStats ? "" : "var: ", + ptpClock->observed_variance); + } + else { + if (ptpClock->port_state == PTP_MASTER) { + len += snprint_ClockIdentity(sbuf + len, sizeof(sbuf) - len, + ptpClock->clock_uuid_field, " (ID:"); + len += snprintf(sbuf + len, sizeof(sbuf) - len, ")"); + } + } + write(1, sbuf, rtOpts->csvStats ? len : SCREEN_MAXSZ + 1); +} + +Boolean +nanoSleep(TimeInternal * t) +{ + struct timespec ts, tr; + + ts.tv_sec = t->seconds; + ts.tv_nsec = t->nanoseconds; + + if (nanosleep(&ts, &tr) < 0) { + t->seconds = tr.tv_sec; + t->nanoseconds = tr.tv_nsec; + return FALSE; + } + return TRUE; +} + +void +getTime(TimeInternal * time) +{ +#if defined(linux) + + struct timeval tv; + gettimeofday(&tv, 0); + time->seconds = tv.tv_sec; + time->nanoseconds = tv.tv_usec * 1000; + +#else /* FreeBSD */ + + struct timespec tp; + if (clock_gettime(CLOCK_REALTIME, &tp) < 0) { + PERROR("clock_gettime() failed, exiting."); + exit(0); + } + time->seconds = tp.tv_sec; + time->nanoseconds = tp.tv_nsec; +#endif /* FreeBSD or Linux */ +} + +void +setTime(TimeInternal * time) +{ + struct timeval tv; + + tv.tv_sec = time->seconds; + tv.tv_usec = time->nanoseconds / 1000; + settimeofday(&tv, 0); + + NOTIFY("resetting system clock to %ds %dns\n", + time->seconds, time->nanoseconds); +} + +UInteger16 +getRand(UInteger32 * seed) +{ + return rand_r((unsigned int *)seed); +} + +Boolean +adjFreq(Integer32 adj) +{ + struct timex t; + + if (adj > ADJ_FREQ_MAX) + adj = ADJ_FREQ_MAX; + else if (adj < -ADJ_FREQ_MAX) + adj = -ADJ_FREQ_MAX; + + t.modes = MOD_FREQUENCY; + t.freq = adj * ((1 << 16) / 1000); + + return !adjtimex(&t); +} diff --git a/third_party/ptpd-1.1.0/src/dep/timer.c b/third_party/ptpd-1.1.0/src/dep/timer.c new file mode 100644 index 0000000..4bd7f80 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/dep/timer.c @@ -0,0 +1,96 @@ +/** + * @file timer.c + * @date Wed Jun 23 09:41:26 2010 + * + * @brief The timers which run the state machine. + * + * Timers in the PTP daemon are run off of the signal system. + */ + +#include "../ptpd.h" + +#define TIMER_INTERVAL 1 +int elapsed; + +void +catch_alarm(int sig) +{ + elapsed += TIMER_INTERVAL; + + DBGV("catch_alarm: elapsed %d\n", elapsed); +} + +void +initTimer(void) +{ + struct itimerval itimer; + + DBG("initTimer\n"); + + signal(SIGALRM, SIG_IGN); + + elapsed = 0; + itimer.it_value.tv_sec = itimer.it_interval.tv_sec = TIMER_INTERVAL; + itimer.it_value.tv_usec = itimer.it_interval.tv_usec = 0; + + signal(SIGALRM, catch_alarm); + setitimer(ITIMER_REAL, &itimer, 0); +} + +void +timerUpdate(IntervalTimer * itimer) +{ + int i, delta; + + delta = elapsed; + elapsed = 0; + + if (delta <= 0) + return; + + for (i = 0; i < TIMER_ARRAY_SIZE; ++i) { + if (itimer[i].interval > 0 && (itimer[i].left -= delta) <= 0) { + itimer[i].left = itimer[i].interval; + itimer[i].expire = TRUE; + DBGV("timerUpdate: timer %u expired\n", i); + } + } +} + +void +timerStop(UInteger16 index, IntervalTimer * itimer) +{ + if (index >= TIMER_ARRAY_SIZE) + return; + + itimer[index].interval = 0; +} + +void +timerStart(UInteger16 index, UInteger16 interval, IntervalTimer * itimer) +{ + if (index >= TIMER_ARRAY_SIZE) + return; + + itimer[index].expire = FALSE; + itimer[index].left = interval; + itimer[index].interval = itimer[index].left; + + DBGV("timerStart: set timer %d to %d\n", index, interval); +} + +Boolean +timerExpired(UInteger16 index, IntervalTimer * itimer) +{ + timerUpdate(itimer); + + if (index >= TIMER_ARRAY_SIZE) + return FALSE; + + if (!itimer[index].expire) + return FALSE; + + itimer[index].expire = FALSE; + + return TRUE; +} diff --git a/third_party/ptpd-1.1.0/src/probe.c b/third_party/ptpd-1.1.0/src/probe.c new file mode 100644 index 0000000..8fdadcf --- /dev/null +++ b/third_party/ptpd-1.1.0/src/probe.c @@ -0,0 +1,284 @@ +/** + * @file probe.c + * @date Tue Jul 20 16:13:30 2010 + * + * @brief Management packet handling + * + * + */ + +#include "ptpd.h" + +#define KEY_ARRAY_LEN 6 +UInteger8 management_key_array[KEY_ARRAY_LEN] = +{PTP_MM_OBTAIN_IDENTITY, PTP_MM_GET_DEFAULT_DATA_SET, PTP_MM_GET_CURRENT_DATA_SET, +PTP_MM_GET_PARENT_DATA_SET, PTP_MM_GET_PORT_DATA_SET, PTP_MM_GET_GLOBAL_TIME_DATA_SET}; + +void displayHeader(MsgHeader *); +void displayManagement(MsgHeader *, MsgManagement *); + +void +probe(RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + UInteger16 i; + UInteger16 length; + TimeInternal interval, now, finish, timestamp; + + /* check */ + if (rtOpts->probe_management_key == PTP_MM_UPDATE_DEFAULT_DATA_SET + || rtOpts->probe_management_key == PTP_MM_UPDATE_GLOBAL_TIME_PROPERTIES + || rtOpts->probe_management_key == PTP_MM_SET_SYNC_INTERVAL) { + ERROR("send not supported for that management message\n"); + return; + } + /* init */ + if (!netInit(&ptpClock->netPath, rtOpts, ptpClock)) { + ERROR("failed to initialize network\n"); + return; + } + initData(rtOpts, ptpClock); + msgPackHeader(ptpClock->msgObuf, ptpClock); + + memset(&ptpClock->msgTmp.manage, 0, sizeof(MsgManagement)); + ptpClock->msgTmp.manage.targetCommunicationTechnology = PTP_DEFAULT; + + /* send */ + for (i = 0; i < KEY_ARRAY_LEN; ++i) { + if (rtOpts->probe_management_key > 0) { + ptpClock->msgTmp.manage.managementMessageKey = rtOpts->probe_management_key; + ptpClock->msgTmp.manage.recordKey = rtOpts->probe_record_key; + } else + ptpClock->msgTmp.manage.managementMessageKey = management_key_array[i]; + + if (!(length = msgPackManagement(ptpClock->msgObuf, &ptpClock->msgTmp.manage, ptpClock))) { + ERROR("failed to pack management message\n"); + return; + } + printf("\n(sending managementMessageKey %hhu)\n", ptpClock->msgTmp.manage.managementMessageKey); + + if (!netSendGeneral(ptpClock->msgObuf, length, &ptpClock->netPath)) { + ERROR("failed to send message\n"); + return; + } + if (rtOpts->probe_management_key > 0) + break; + } + + getTime(&finish); + finish.seconds += PTP_SYNC_INTERVAL_TIMEOUT(ptpClock->sync_interval); + for (;;) { + interval.seconds = PTP_SYNC_INTERVAL_TIMEOUT(ptpClock->sync_interval); + interval.nanoseconds = 0; + netSelect(&interval, &ptpClock->netPath); + + netRecvEvent(ptpClock->msgIbuf, ×tamp, &ptpClock->netPath); + + if (netRecvGeneral(ptpClock->msgIbuf, &ptpClock->netPath)) { + msgUnpackHeader(ptpClock->msgIbuf, &ptpClock->msgTmpHeader); + + if (ptpClock->msgTmpHeader.control == PTP_MANAGEMENT_MESSAGE) { + msgUnpackManagement(ptpClock->msgIbuf, &ptpClock->msgTmp.manage); + msgUnpackManagementPayload(ptpClock->msgIbuf, &ptpClock->msgTmp.manage); + + displayManagement(&ptpClock->msgTmpHeader, &ptpClock->msgTmp.manage); + } + fflush(stdout); + } + getTime(&now); + if (now.seconds > finish.seconds || (now.seconds == finish.seconds + && now.nanoseconds > finish.nanoseconds)) + break; + } + + /* done */ + printf("\n"); + ptpdShutdown(); + + exit(0); +} + +void +displayHeader(MsgHeader * header) +{ + printf( + " sourceCommunicationTechnology %hhu\n" + " sourceUuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n" + " sourcePortId %hu\n", + header->sourceCommunicationTechnology, + header->sourceUuid[0], header->sourceUuid[1], header->sourceUuid[2], + header->sourceUuid[3], header->sourceUuid[4], header->sourceUuid[5], + header->sourcePortId); +} + +void +displayManagement(MsgHeader * header, MsgManagement * manage) +{ + Integer16 i; + + switch (manage->managementMessageKey) { + case PTP_MM_CLOCK_IDENTITY: + printf("\n"); + displayHeader(header); + printf(" managementMessageKey %hhu (PTP_MM_CLOCK_IDENTITY)\n", manage->managementMessageKey); + printf(" clockCommunicationTechnology %hhu\n", manage->payload.clockIdentity.clockCommunicationTechnology); + printf(" clockUuidField %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + manage->payload.clockIdentity.clockUuidField[0], manage->payload.clockIdentity.clockUuidField[1], + manage->payload.clockIdentity.clockUuidField[2], manage->payload.clockIdentity.clockUuidField[3], + manage->payload.clockIdentity.clockUuidField[4], manage->payload.clockIdentity.clockUuidField[5]); + printf(" clockPortField %hu\n", manage->payload.clockIdentity.clockPortField); + printf(" manufacturerIdentity "); + for (i = 0; i < MANUFACTURER_ID_LENGTH && manage->payload.clockIdentity.manufacturerIdentity[i]; ++i) + putchar(manage->payload.clockIdentity.manufacturerIdentity[i]); + putchar('\n'); + break; + + case PTP_MM_DEFAULT_DATA_SET: + printf("\n"); + displayHeader(header); + printf(" managementMessageKey %hhu (PTP_MM_DEFAULT_DATA_SET)\n", manage->managementMessageKey); + printf(" clockCommunicationTechnology %hhu\n", manage->payload.defaultData.clockCommunicationTechnology); + printf(" clockUuidField %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + manage->payload.defaultData.clockUuidField[0], manage->payload.defaultData.clockUuidField[1], + manage->payload.defaultData.clockUuidField[2], manage->payload.defaultData.clockUuidField[3], + manage->payload.defaultData.clockUuidField[4], manage->payload.defaultData.clockUuidField[5]); + printf(" clockPortField %hu\n", manage->payload.defaultData.clockPortField); + printf(" clockStratum %hhu\n", manage->payload.defaultData.clockStratum); + printf(" clockIdentifier "); + for (i = 0; i < PTP_CODE_STRING_LENGTH && manage->payload.defaultData.clockIdentifier[i]; ++i) + putchar(manage->payload.defaultData.clockIdentifier[i]); + putchar('\n'); + printf(" clockVariance %hd\n", manage->payload.defaultData.clockVariance); + printf(" clockFollowupCapable %hhu\n", manage->payload.defaultData.clockFollowupCapable); + printf(" preferred %hhu\n", manage->payload.defaultData.preferred); + printf(" initializable %hhu\n", manage->payload.defaultData.initializable); + printf(" externalTiming %hhu\n", manage->payload.defaultData.externalTiming); + printf(" isBoundaryClock %hhu\n", manage->payload.defaultData.isBoundaryClock); + printf(" syncInterval %hhd\n", manage->payload.defaultData.syncInterval); + printf(" subdomainName "); + for (i = 0; i < PTP_SUBDOMAIN_NAME_LENGTH && manage->payload.defaultData.subdomainName[i]; ++i) + putchar(manage->payload.defaultData.subdomainName[i]); + putchar('\n'); + printf(" numberPorts %hu\n", manage->payload.defaultData.numberPorts); + printf(" numberForeignRecords %hu\n", manage->payload.defaultData.numberForeignRecords); + break; + + case PTP_MM_CURRENT_DATA_SET: + printf("\n"); + displayHeader(header); + printf(" managementMessageKey %hhu (PTP_MM_CURRENT_DATA_SET)\n", manage->managementMessageKey); + printf(" stepsRemoved %hu\n", manage->payload.current.stepsRemoved); + printf(" offsetFromMaster %s%u.%09d\n", + manage->payload.current.offsetFromMaster.nanoseconds & 0x80000000 ? "-" : "", + manage->payload.current.offsetFromMaster.seconds, + manage->payload.current.offsetFromMaster.nanoseconds & ~0x80000000); + printf(" oneWayDelay %s%u.%09d\n", + manage->payload.current.oneWayDelay.nanoseconds & 0x80000000 ? "-" : "", + manage->payload.current.oneWayDelay.seconds, + manage->payload.current.oneWayDelay.nanoseconds & ~0x80000000); + break; + + case PTP_MM_PARENT_DATA_SET: + printf("\n"); + displayHeader(header); + printf(" managementMessageKey %hhu (PTP_MM_PARENT_DATA_SET)\n", manage->managementMessageKey); + printf(" parentCommunicationTechnology %hhu\n", manage->payload.parent.parentCommunicationTechnology); + printf(" parentUuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + manage->payload.parent.parentUuid[0], manage->payload.parent.parentUuid[1], + manage->payload.parent.parentUuid[2], manage->payload.parent.parentUuid[3], + manage->payload.parent.parentUuid[4], manage->payload.parent.parentUuid[5]); + printf(" parentPortId %hu\n", manage->payload.parent.parentPortId); + printf(" parentLastSyncSequenceNumber %hu\n", manage->payload.parent.parentLastSyncSequenceNumber); + printf(" parentFollowupCapable %hhu\n", manage->payload.parent.parentFollowupCapable); + printf(" parentExternalTiming %hhu\n", manage->payload.parent.parentExternalTiming); + printf(" parentVariance %hd\n", manage->payload.parent.parentVariance); + printf(" parentStats %hhu\n", manage->payload.parent.parentStats); + printf(" observedVariance %hd\n", manage->payload.parent.observedVariance); + printf(" observedDrift %d\n", manage->payload.parent.observedDrift); + printf(" utcReasonable %hhu\n", manage->payload.parent.utcReasonable); + printf(" grandmasterCommunicationTechnology %hhu\n", manage->payload.parent.grandmasterCommunicationTechnology); + printf(" grandmasterUuidField %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + manage->payload.parent.grandmasterUuidField[0], manage->payload.parent.grandmasterUuidField[1], + manage->payload.parent.grandmasterUuidField[2], manage->payload.parent.grandmasterUuidField[3], + manage->payload.parent.grandmasterUuidField[4], manage->payload.parent.grandmasterUuidField[5]); + printf(" grandmasterPortIdField %hu\n", manage->payload.parent.grandmasterPortIdField); + printf(" grandmasterStratum %hhu\n", manage->payload.parent.grandmasterStratum); + printf(" grandmasterIdentifier "); + for (i = 0; i < PTP_CODE_STRING_LENGTH && manage->payload.parent.grandmasterIdentifier[i]; ++i) + putchar(manage->payload.parent.grandmasterIdentifier[i]); + putchar('\n'); + printf(" grandmasterVariance %hd\n", manage->payload.parent.grandmasterVariance); + printf(" grandmasterPreferred %hhu\n", manage->payload.parent.grandmasterPreferred); + printf(" grandmasterIsBoundaryClock %hhu\n", manage->payload.parent.grandmasterIsBoundaryClock); + printf(" grandmasterSequenceNumber %hu\n", manage->payload.parent.grandmasterSequenceNumber); + break; + + case PTP_MM_PORT_DATA_SET: + printf("\n"); + displayHeader(header); + printf(" managementMessageKey %hhu (PTP_MM_PORT_DATA_SET)\n", manage->managementMessageKey); + printf(" returnedPortNumber %hu\n", manage->payload.port.returnedPortNumber); + printf(" portState %hhu\n", manage->payload.port.portState); + printf(" lastSyncEventSequenceNumber %hu\n", manage->payload.port.lastSyncEventSequenceNumber); + printf(" lastGeneralEventSequenceNumber %hu\n", manage->payload.port.lastGeneralEventSequenceNumber); + printf(" portCommunicationTechnology %hhu\n", manage->payload.port.portCommunicationTechnology); + printf(" portUuidField %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + manage->payload.port.portUuidField[0], manage->payload.port.portUuidField[1], + manage->payload.port.portUuidField[2], manage->payload.port.portUuidField[3], + manage->payload.port.portUuidField[4], manage->payload.port.portUuidField[5]); + printf(" portIdField %hu\n", manage->payload.port.portIdField); + printf(" burstEnabled %hhu\n", manage->payload.port.burstEnabled); + printf(" subdomainAddressOctets %hhu\n", manage->payload.port.subdomainAddressOctets); + printf(" eventPortAddressOctets %hhu\n", manage->payload.port.eventPortAddressOctets); + printf(" generalPortAddressOctets %hhu\n", manage->payload.port.generalPortAddressOctets); + printf(" subdomainAddress "); + printf("%hhu", manage->payload.port.subdomainAddress[0]); + for (i = 1; i < SUBDOMAIN_ADDRESS_LENGTH; ++i) + printf(".%hhu", manage->payload.port.subdomainAddress[i]); + putchar('\n'); + printf(" eventPortAddress %hu\n", *(UInteger16 *) manage->payload.port.eventPortAddress); + printf(" generalPortAddress %hu\n", *(UInteger16 *) manage->payload.port.generalPortAddress); + break; + + case PTP_MM_GLOBAL_TIME_DATA_SET: + printf("\n"); + displayHeader(header); + printf(" managementMessageKey %hhu (PTP_MM_GLOBAL_TIME_DATA_SET)\n", manage->managementMessageKey); + printf(" localTime %s%u.%09d\n", + manage->payload.globalTime.localTime.nanoseconds & 0x80000000 ? "-" : "", + manage->payload.globalTime.localTime.seconds, + manage->payload.globalTime.localTime.nanoseconds & ~0x80000000); + printf(" currentUtcOffset %hd\n", manage->payload.globalTime.currentUtcOffset); + printf(" leap59 %hhu\n", manage->payload.globalTime.leap59); + printf(" leap61 %hhu\n", manage->payload.globalTime.leap61); + printf(" epochNumber %hu\n", manage->payload.globalTime.epochNumber); + break; + + + case PTP_MM_FOREIGN_DATA_SET: + printf("\n"); + displayHeader(header); + printf(" managementMessageKey %hhu (PTP_MM_FOREIGN_DATA_SET)\n", manage->managementMessageKey); + printf(" returnedPortNumber %hu\n", manage->payload.foreign.returnedPortNumber); + printf(" returnedRecordNumber %hu\n", manage->payload.foreign.returnedRecordNumber); + printf(" foreignMasterCommunicationTechnology %hu\n", manage->payload.foreign.foreignMasterCommunicationTechnology); + printf(" foreignMasterUuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + manage->payload.foreign.foreignMasterUuid[0], manage->payload.foreign.foreignMasterUuid[1], + manage->payload.foreign.foreignMasterUuid[2], manage->payload.foreign.foreignMasterUuid[3], + manage->payload.foreign.foreignMasterUuid[4], manage->payload.foreign.foreignMasterUuid[5]); + + printf(" foreignMasterPortId %hu\n", manage->payload.foreign.foreignMasterPortId); + printf(" foreignMasterSyncs %hu\n", manage->payload.foreign.foreignMasterSyncs); + break; + + case PTP_MM_NULL: + printf("\n"); + displayHeader(header); + printf(" managementMessageKey %hhu (NULL)\n", manage->managementMessageKey); + break; + + default: + break; + } + + return; +} diff --git a/third_party/ptpd-1.1.0/src/protocol.c b/third_party/ptpd-1.1.0/src/protocol.c new file mode 100644 index 0000000..4db8e95 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/protocol.c @@ -0,0 +1,865 @@ +/** + * @file protocol.c + * @date Wed Jun 23 09:40:39 2010 + * + * @brief The code that handles the IEEE-1588 protocol and state machine + * + * + */ + +#include "ptpd.h" + +Boolean doInit(RunTimeOpts *, PtpClock *); +void doState(RunTimeOpts *, PtpClock *); +void toState(UInteger8, RunTimeOpts *, PtpClock *); + +void handle(RunTimeOpts *, PtpClock *); +void handleSync(MsgHeader *, Octet *, ssize_t, TimeInternal *, Boolean, RunTimeOpts *, PtpClock *); +void handleFollowUp(MsgHeader *, Octet *, ssize_t, Boolean, RunTimeOpts *, PtpClock *); +void handleDelayReq(MsgHeader *, Octet *, ssize_t, TimeInternal *, Boolean, RunTimeOpts *, PtpClock *); +void handleDelayResp(MsgHeader *, Octet *, ssize_t, Boolean, RunTimeOpts *, PtpClock *); +void handleManagement(MsgHeader *, Octet *, ssize_t, Boolean, RunTimeOpts *, PtpClock *); + +void issueSync(RunTimeOpts *, PtpClock *); +void issueFollowup(TimeInternal *, RunTimeOpts *, PtpClock *); +void issueDelayReq(RunTimeOpts *, PtpClock *); +void issueDelayResp(TimeInternal *, MsgHeader *, RunTimeOpts *, PtpClock *); +void issueManagement(MsgHeader *, MsgManagement *, RunTimeOpts *, PtpClock *); + +MsgSync *addForeign(Octet *, MsgHeader *, PtpClock *); + +/* Initialize the PTPD stack. + * + * NB: This function was added by TI! + */ +void protocol_first(RunTimeOpts *rtOpts, PtpClock *ptpClock) +{ + DBG("event POWERUP\n"); + + toState(PTP_INITIALIZING, rtOpts, ptpClock); + + if(ptpClock->port_state != PTP_INITIALIZING) + doState(rtOpts, ptpClock); + else if(!doInit(rtOpts, ptpClock)) + return; + + if(ptpClock->message_activity) + DBGV("activity\n"); +#if 0 + else + DBGV("no activity\n"); +#endif +} + +/* Perform one iteration of the PTPD state machine. This function does not + * block and may be used in non-RTOS systems where the main loop needs to do + * more than process the PTPD stack. + * + * NB: This function was added by TI! + */ +void protocol_loop(RunTimeOpts *rtOpts, PtpClock *ptpClock) +{ + if(ptpClock->port_state != PTP_INITIALIZING) + doState(rtOpts, ptpClock); + else if(!doInit(rtOpts, ptpClock)) + return; + + if(ptpClock->message_activity) + DBGV("activity\n"); +#if 0 + else + DBGV("no activity\n"); +#endif +} + +/* loop forever. doState() has a switch for the actions and events to be + checked for 'port_state'. the actions and events may or may not change + 'port_state' by calling toState(), but once they are done we loop around + again and perform the actions required for the new 'port_state'. */ +void +protocol(RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + DBG("event POWERUP\n"); + + toState(PTP_INITIALIZING, rtOpts, ptpClock); + + DBGV("Debug Initializing..."); + + for (;;) { + if (ptpClock->port_state != PTP_INITIALIZING) + doState(rtOpts, ptpClock); + else if (!doInit(rtOpts, ptpClock)) + return; + + if (ptpClock->message_activity) + DBGV("activity\n"); + else + DBGV("no activity\n"); + } +} + +Boolean +doInit(RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + DBG("manufacturerIdentity: %s\n", MANUFACTURER_ID); + + /* initialize networking */ + netShutdown(&ptpClock->netPath); + if (!netInit(&ptpClock->netPath, rtOpts, ptpClock)) { + ERROR("failed to initialize network\n"); + toState(PTP_FAULTY, rtOpts, ptpClock); + return FALSE; + } + /* initialize other stuff */ + initData(rtOpts, ptpClock); + initTimer(); + initClock(rtOpts, ptpClock); + m1(ptpClock); + msgPackHeader(ptpClock->msgObuf, ptpClock); + + DBG("sync message interval: %d\n", PTP_SYNC_INTERVAL_TIMEOUT(ptpClock->sync_interval)); + DBG("clock identifier: %s\n", ptpClock->clock_identifier); + DBG("256*log2(clock variance): %d\n", ptpClock->clock_variance); + DBG("clock stratum: %d\n", ptpClock->clock_stratum); + DBG("clock preferred?: %s\n", ptpClock->preferred ? "yes" : "no"); + DBG("bound interface name: %s\n", rtOpts->ifaceName); + DBG("communication technology: %d\n", ptpClock->port_communication_technology); + DBG("uuid: %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + ptpClock->port_uuid_field[0], ptpClock->port_uuid_field[1], ptpClock->port_uuid_field[2], + ptpClock->port_uuid_field[3], ptpClock->port_uuid_field[4], ptpClock->port_uuid_field[5]); + DBG("PTP subdomain name: %s\n", ptpClock->subdomain_name); + DBG("subdomain address: %hhx.%hhx.%hhx.%hhx\n", + ptpClock->subdomain_address[0], ptpClock->subdomain_address[1], + ptpClock->subdomain_address[2], ptpClock->subdomain_address[3]); + DBG("event port address: %hhx %hhx\n", + ptpClock->event_port_address[0], ptpClock->event_port_address[1]); + DBG("general port address: %hhx %hhx\n", + ptpClock->general_port_address[0], ptpClock->general_port_address[1]); + + toState(PTP_LISTENING, rtOpts, ptpClock); + return TRUE; +} + +/* handle actions and events for 'port_state' */ +void +doState(RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + UInteger8 state; + + ptpClock->message_activity = FALSE; + + switch (ptpClock->port_state) { + case PTP_LISTENING: + case PTP_PASSIVE: + case PTP_SLAVE: + case PTP_MASTER: + if (ptpClock->record_update) { + ptpClock->record_update = FALSE; + state = bmc(ptpClock->foreign, rtOpts, ptpClock); + if (state != ptpClock->port_state) + toState(state, rtOpts, ptpClock); + } + break; + + default: + break; + } + + switch (ptpClock->port_state) { + case PTP_FAULTY: + /* imaginary troubleshooting */ + + DBG("event FAULT_CLEARED\n"); + toState(PTP_INITIALIZING, rtOpts, ptpClock); + return; + + case PTP_LISTENING: + case PTP_PASSIVE: + case PTP_UNCALIBRATED: + case PTP_SLAVE: + handle(rtOpts, ptpClock); + + if (timerExpired(SYNC_RECEIPT_TIMER, ptpClock->itimer)) { + DBG("event SYNC_RECEIPT_TIMEOUT_EXPIRES\n"); + ptpClock->number_foreign_records = 0; + ptpClock->foreign_record_i = 0; + if (!rtOpts->slaveOnly && ptpClock->clock_stratum != 255) { + m1(ptpClock); + toState(PTP_MASTER, rtOpts, ptpClock); + } else if (ptpClock->port_state != PTP_LISTENING) + toState(PTP_LISTENING, rtOpts, ptpClock); + } + break; + + case PTP_MASTER: + if (timerExpired(SYNC_INTERVAL_TIMER, ptpClock->itimer)) { + DBGV("event SYNC_INTERVAL_TIMEOUT_EXPIRES\n"); + issueSync(rtOpts, ptpClock); + } + handle(rtOpts, ptpClock); + + if (rtOpts->slaveOnly || ptpClock->clock_stratum == 255) + toState(PTP_LISTENING, rtOpts, ptpClock); + + break; + + case PTP_DISABLED: + handle(rtOpts, ptpClock); + break; + + default: + DBG("do unrecognized state\n"); + break; + } +} + +/* perform actions required when leaving 'port_state' and entering 'state' */ +void +toState(UInteger8 state, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + ptpClock->message_activity = TRUE; + + /* leaving state tasks */ + switch (ptpClock->port_state) { + case PTP_MASTER: + timerStop(SYNC_INTERVAL_TIMER, ptpClock->itimer); + timerStart(SYNC_RECEIPT_TIMER, PTP_SYNC_RECEIPT_TIMEOUT(ptpClock->sync_interval), ptpClock->itimer); + break; + + case PTP_SLAVE: + initClock(rtOpts, ptpClock); + break; + + default: + break; + } + + /* entering state tasks */ + switch (state) { + case PTP_INITIALIZING: + DBG("state PTP_INITIALIZING\n"); + timerStop(SYNC_RECEIPT_TIMER, ptpClock->itimer); + + ptpClock->port_state = PTP_INITIALIZING; + break; + + case PTP_FAULTY: + DBG("state PTP_FAULTY\n"); + timerStop(SYNC_RECEIPT_TIMER, ptpClock->itimer); + + ptpClock->port_state = PTP_FAULTY; + break; + + case PTP_DISABLED: + DBG("state change to PTP_DISABLED\n"); + timerStop(SYNC_RECEIPT_TIMER, ptpClock->itimer); + + ptpClock->port_state = PTP_DISABLED; + break; + + case PTP_LISTENING: + DBG("state PTP_LISTENING\n"); + + timerStart(SYNC_RECEIPT_TIMER, PTP_SYNC_RECEIPT_TIMEOUT(ptpClock->sync_interval), ptpClock->itimer); + + ptpClock->port_state = PTP_LISTENING; + break; + + case PTP_MASTER: + DBG("state PTP_MASTER\n"); + + if (ptpClock->port_state != PTP_PRE_MASTER) + timerStart(SYNC_INTERVAL_TIMER, PTP_SYNC_INTERVAL_TIMEOUT(ptpClock->sync_interval), ptpClock->itimer); + + timerStop(SYNC_RECEIPT_TIMER, ptpClock->itimer); + + ptpClock->port_state = PTP_MASTER; + break; + + case PTP_PASSIVE: + DBG("state PTP_PASSIVE\n"); + ptpClock->port_state = PTP_PASSIVE; + break; + + case PTP_UNCALIBRATED: + DBG("state PTP_UNCALIBRATED\n"); + ptpClock->port_state = PTP_UNCALIBRATED; + break; + + case PTP_SLAVE: + DBG("state PTP_PTP_SLAVE\n"); + + initClock(rtOpts, ptpClock); + + /* + * R is chosen to allow a few syncs before we first get a + * one-way delay estimate + */ + /* + * this is to allow the offset filter to fill for an + * accurate initial clock reset + */ + ptpClock->Q = 0; + ptpClock->R = getRand(&ptpClock->random_seed) % 4 + 4; + DBG("Q = %d, R = %d\n", ptpClock->Q, ptpClock->R); + + ptpClock->waitingForFollow = FALSE; + ptpClock->delay_req_send_time.seconds = 0; + ptpClock->delay_req_send_time.nanoseconds = 0; + ptpClock->delay_req_receive_time.seconds = 0; + ptpClock->delay_req_receive_time.nanoseconds = 0; + + timerStart(SYNC_RECEIPT_TIMER, PTP_SYNC_RECEIPT_TIMEOUT(ptpClock->sync_interval), ptpClock->itimer); + + ptpClock->port_state = PTP_SLAVE; + break; + + default: + DBG("to unrecognized state\n"); + break; + } + + NOTIFY("Port state changed to %s\n", translatePortState(ptpClock)); + + if (rtOpts->displayStats) + displayStats(rtOpts, ptpClock); +} + +/* check and handle received messages */ +void +handle(RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + int ret; + ssize_t length; + Boolean isFromSelf; + TimeInternal time = {0, 0}; + + if (!ptpClock->message_activity) { + ret = netSelect(0, &ptpClock->netPath); + if (ret < 0) { + PERROR("failed to poll sockets"); + toState(PTP_FAULTY, rtOpts, ptpClock); + return; + } else if (!ret) { + DBGV("handle: nothing\n"); + return; + } + /* else length > 0 */ + } + DBGV("handle: something\n"); + + length = netRecvEvent(ptpClock->msgIbuf, &time, &ptpClock->netPath); + if (length < 0) { + PERROR("failed to receive on the event socket"); + toState(PTP_FAULTY, rtOpts, ptpClock); + return; + } else if (!length) { + length = netRecvGeneral(ptpClock->msgIbuf, &ptpClock->netPath); + if (length < 0) { + PERROR("failed to receive on the general socket"); + toState(PTP_FAULTY, rtOpts, ptpClock); + return; + } else if (!length) + return; + } + ptpClock->message_activity = TRUE; + + if (!msgPeek(ptpClock->msgIbuf, length)) + return; + + if (length < HEADER_LENGTH) { + ERROR("message shorter than header length\n"); + toState(PTP_FAULTY, rtOpts, ptpClock); + return; + } + msgUnpackHeader(ptpClock->msgIbuf, &ptpClock->msgTmpHeader); + + DBGV("event Receipt of Message\n" + " version %d\n" + " type %d\n" + " uuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n" + " sequence %d\n" + " time %us %dns\n", + ptpClock->msgTmpHeader.versionPTP, + ptpClock->msgTmpHeader.control, + ptpClock->msgTmpHeader.sourceUuid[0], ptpClock->msgTmpHeader.sourceUuid[1], + ptpClock->msgTmpHeader.sourceUuid[2], ptpClock->msgTmpHeader.sourceUuid[3], + ptpClock->msgTmpHeader.sourceUuid[4], ptpClock->msgTmpHeader.sourceUuid[5], + ptpClock->msgTmpHeader.sequenceId, + time.seconds, time.nanoseconds); + + if (ptpClock->msgTmpHeader.versionPTP != VERSION_PTP) { + DBGV("ignore version %d message\n", ptpClock->msgTmpHeader.versionPTP); + return; + } + if (memcmp(ptpClock->msgTmpHeader.subdomain, ptpClock->subdomain_name, + PTP_SUBDOMAIN_NAME_LENGTH)) { + DBGV("ignore message from subdomain %s\n", ptpClock->msgTmpHeader.subdomain); + return; + } + isFromSelf = ptpClock->msgTmpHeader.sourceCommunicationTechnology == ptpClock->port_communication_technology + && ptpClock->msgTmpHeader.sourcePortId == ptpClock->port_id_field + && !memcmp(ptpClock->msgTmpHeader.sourceUuid, ptpClock->port_uuid_field, PTP_UUID_LENGTH); + + /* + * subtract the inbound latency adjustment if it is not a loop back + * and the time stamp seems reasonable + */ + if (!isFromSelf && time.seconds > 0) + subTime(&time, &time, &rtOpts->inboundLatency); + + switch (ptpClock->msgTmpHeader.control) { + case PTP_SYNC_MESSAGE: + handleSync(&ptpClock->msgTmpHeader, ptpClock->msgIbuf, length, &time, isFromSelf, rtOpts, ptpClock); + break; + + case PTP_FOLLOWUP_MESSAGE: + handleFollowUp(&ptpClock->msgTmpHeader, ptpClock->msgIbuf, length, isFromSelf, rtOpts, ptpClock); + break; + + case PTP_DELAY_REQ_MESSAGE: + handleDelayReq(&ptpClock->msgTmpHeader, ptpClock->msgIbuf, length, &time, isFromSelf, rtOpts, ptpClock); + break; + + case PTP_DELAY_RESP_MESSAGE: + handleDelayResp(&ptpClock->msgTmpHeader, ptpClock->msgIbuf, length, isFromSelf, rtOpts, ptpClock); + break; + + case PTP_MANAGEMENT_MESSAGE: + handleManagement(&ptpClock->msgTmpHeader, ptpClock->msgIbuf, length, isFromSelf, rtOpts, ptpClock); + break; + + default: + DBG("handle: unrecognized message\n"); + break; + } +} + +void +handleSync(MsgHeader * header, Octet * msgIbuf, ssize_t length, TimeInternal * time, Boolean isFromSelf, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + MsgSync *sync; + TimeInternal originTimestamp; + + if (length < SYNC_PACKET_LENGTH) { + ERROR("short sync message\n"); + toState(PTP_FAULTY, rtOpts, ptpClock); + return; + } + switch (ptpClock->port_state) { + case PTP_FAULTY: + case PTP_INITIALIZING: + case PTP_DISABLED: + DBGV("handleSync: disreguard\n"); + return; + + case PTP_UNCALIBRATED: + case PTP_SLAVE: + if (isFromSelf) { + DBG("handleSync: ignore from self\n"); + return; + } + if (getFlag(header->flags, PTP_SYNC_BURST) && !ptpClock->burst_enabled) + return; + + DBGV("handleSync: looking for uuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + ptpClock->parent_uuid[0], ptpClock->parent_uuid[1], ptpClock->parent_uuid[2], + ptpClock->parent_uuid[3], ptpClock->parent_uuid[4], ptpClock->parent_uuid[5]); + + if (header->sequenceId > ptpClock->parent_last_sync_sequence_number + && header->sourceCommunicationTechnology == ptpClock->parent_communication_technology + && header->sourcePortId == ptpClock->parent_port_id + && !memcmp(header->sourceUuid, ptpClock->parent_uuid, PTP_UUID_LENGTH)) { + /* addForeign() takes care of msgUnpackSync() */ + ptpClock->record_update = TRUE; + sync = addForeign(ptpClock->msgIbuf, &ptpClock->msgTmpHeader, ptpClock); + + if (sync->syncInterval != ptpClock->sync_interval) { + DBGV("message's sync interval is %d, but clock's is %d\n", sync->syncInterval, ptpClock->sync_interval); + /* + * spec recommends handling a sync interval + * discrepancy as a fault + */ + } + ptpClock->sync_receive_time.seconds = time->seconds; + ptpClock->sync_receive_time.nanoseconds = time->nanoseconds; + + if (!getFlag(header->flags, PTP_ASSIST)) { + ptpClock->waitingForFollow = FALSE; + + toInternalTime(&originTimestamp, &sync->originTimestamp, &ptpClock->halfEpoch); + updateOffset(&originTimestamp, &ptpClock->sync_receive_time, + &ptpClock->ofm_filt, rtOpts, ptpClock); + updateClock(rtOpts, ptpClock); + } else { + ptpClock->waitingForFollow = TRUE; + } + + s1(header, sync, ptpClock); + + if (!(--ptpClock->R)) { + issueDelayReq(rtOpts, ptpClock); + + ptpClock->Q = 0; + ptpClock->R = getRand(&ptpClock->random_seed) % (PTP_DELAY_REQ_INTERVAL - 2) + 2; + DBG("Q = %d, R = %d\n", ptpClock->Q, ptpClock->R); + } + DBGV("SYNC_RECEIPT_TIMER reset\n"); + timerStart(SYNC_RECEIPT_TIMER, PTP_SYNC_RECEIPT_TIMEOUT(ptpClock->sync_interval), ptpClock->itimer); + +#ifndef NO_FILE_SYSTEM + if (rtOpts->recordFP != NULL) + fprintf(rtOpts->recordFP, "%d %llu\n", + header->sequenceId, + ((time->seconds * 1000000000ULL) + + time->nanoseconds)); +#endif + } else { + DBGV("handleSync: unwanted\n"); + } + + case PTP_MASTER: + default: + if (header->sourceCommunicationTechnology == ptpClock->clock_communication_technology + || header->sourceCommunicationTechnology == PTP_DEFAULT + || ptpClock->clock_communication_technology == PTP_DEFAULT) { + if (!isFromSelf) { + ptpClock->record_update = TRUE; + addForeign(ptpClock->msgIbuf, &ptpClock->msgTmpHeader, ptpClock); + } else if (ptpClock->port_state == PTP_MASTER && ptpClock->clock_followup_capable) { + addTime(time, time, &rtOpts->outboundLatency); + issueFollowup(time, rtOpts, ptpClock); + } + } + break; + } +} + +void +handleFollowUp(MsgHeader * header, Octet * msgIbuf, ssize_t length, Boolean isFromSelf, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + MsgFollowUp *follow; + TimeInternal preciseOriginTimestamp; + + if (length < FOLLOW_UP_PACKET_LENGTH) { + ERROR("short folow up message\n"); + toState(PTP_FAULTY, rtOpts, ptpClock); + return; + } + switch (ptpClock->port_state) { + case PTP_SLAVE: + if (isFromSelf) { + DBG("handleFollowUp: ignore from self\n"); + return; + } + if (getFlag(header->flags, PTP_SYNC_BURST) && !ptpClock->burst_enabled) + return; + + DBGV("handleFollowUp: looking for uuid %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + ptpClock->parent_uuid[0], ptpClock->parent_uuid[1], ptpClock->parent_uuid[2], + ptpClock->parent_uuid[3], ptpClock->parent_uuid[4], ptpClock->parent_uuid[5]); + + follow = &ptpClock->msgTmp.follow; + msgUnpackFollowUp(ptpClock->msgIbuf, follow); + + if (ptpClock->waitingForFollow + && follow->associatedSequenceId == ptpClock->parent_last_sync_sequence_number + && header->sourceCommunicationTechnology == ptpClock->parent_communication_technology + && header->sourcePortId == ptpClock->parent_port_id + && !memcmp(header->sourceUuid, ptpClock->parent_uuid, PTP_UUID_LENGTH)) { + ptpClock->waitingForFollow = FALSE; + + toInternalTime(&preciseOriginTimestamp, &follow->preciseOriginTimestamp, &ptpClock->halfEpoch); + updateOffset(&preciseOriginTimestamp, &ptpClock->sync_receive_time, + &ptpClock->ofm_filt, rtOpts, ptpClock); + updateClock(rtOpts, ptpClock); + } else { + DBGV("handleFollowUp: unwanted\n"); + } + break; + + default: + DBGV("handleFollowUp: disreguard\n"); + return; + } +} + +void +handleDelayReq(MsgHeader * header, Octet * msgIbuf, ssize_t length, TimeInternal * time, Boolean isFromSelf, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + if (length < DELAY_REQ_PACKET_LENGTH) { + ERROR("short delay request message\n"); + toState(PTP_FAULTY, rtOpts, ptpClock); + return; + } + switch (ptpClock->port_state) { + case PTP_MASTER: + if (isFromSelf) { + DBG("handleDelayReq: ignore from self\n"); + return; + } + if (header->sourceCommunicationTechnology == ptpClock->clock_communication_technology + || header->sourceCommunicationTechnology == PTP_DEFAULT + || ptpClock->clock_communication_technology == PTP_DEFAULT) { + issueDelayResp(time, &ptpClock->msgTmpHeader, rtOpts, ptpClock); + } + break; + + case PTP_SLAVE: + if (isFromSelf) { + DBG("handleDelayReq: self\n"); + + ptpClock->delay_req_send_time.seconds = time->seconds; + ptpClock->delay_req_send_time.nanoseconds = time->nanoseconds; + + addTime(&ptpClock->delay_req_send_time, &ptpClock->delay_req_send_time, &rtOpts->outboundLatency); + + if (ptpClock->delay_req_receive_time.seconds) { + updateDelay(&ptpClock->delay_req_send_time, + &ptpClock->delay_req_receive_time, + &ptpClock->owd_filt, rtOpts, + ptpClock); + + ptpClock->delay_req_send_time.seconds = 0; + ptpClock->delay_req_send_time.nanoseconds = 0; + ptpClock->delay_req_receive_time.seconds = 0; + ptpClock->delay_req_receive_time.nanoseconds = 0; + } + } + break; + + default: + DBGV("handleDelayReq: disreguard\n"); + return; + } +} + +void +handleDelayResp(MsgHeader * header, Octet * msgIbuf, ssize_t length, Boolean isFromSelf, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + MsgDelayResp *resp; + + if (length < DELAY_RESP_PACKET_LENGTH) { + ERROR("short delay request message\n"); + toState(PTP_FAULTY, rtOpts, ptpClock); + return; + } + switch (ptpClock->port_state) { + case PTP_SLAVE: + if (isFromSelf) { + DBG("handleDelayResp: ignore from self\n"); + return; + } + resp = &ptpClock->msgTmp.resp; + msgUnpackDelayResp(ptpClock->msgIbuf, resp); + + if (ptpClock->sentDelayReq + && resp->requestingSourceSequenceId == ptpClock->sentDelayReqSequenceId + && resp->requestingSourceCommunicationTechnology == ptpClock->port_communication_technology + && resp->requestingSourcePortId == ptpClock->port_id_field + && !memcmp(resp->requestingSourceUuid, ptpClock->port_uuid_field, PTP_UUID_LENGTH) + && header->sourceCommunicationTechnology == ptpClock->parent_communication_technology + && header->sourcePortId == ptpClock->parent_port_id + && !memcmp(header->sourceUuid, ptpClock->parent_uuid, PTP_UUID_LENGTH)) { + ptpClock->sentDelayReq = FALSE; + + toInternalTime(&ptpClock->delay_req_receive_time, &resp->delayReceiptTimestamp, &ptpClock->halfEpoch); + + if (ptpClock->delay_req_send_time.seconds) { + updateDelay(&ptpClock->delay_req_send_time, &ptpClock->delay_req_receive_time, + &ptpClock->owd_filt, rtOpts, ptpClock); + + ptpClock->delay_req_send_time.seconds = 0; + ptpClock->delay_req_send_time.nanoseconds = 0; + ptpClock->delay_req_receive_time.seconds = 0; + ptpClock->delay_req_receive_time.nanoseconds = 0; + } + } else { + DBGV("handleDelayResp: unwanted\n"); + } + break; + + default: + DBGV("handleDelayResp: disreguard\n"); + return; + } +} + +void +handleManagement(MsgHeader * header, Octet * msgIbuf, ssize_t length, Boolean isFromSelf, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + MsgManagement *manage; + + UInteger8 state; + + if (ptpClock->port_state == PTP_INITIALIZING) + return; + + manage = &ptpClock->msgTmp.manage; + msgUnpackManagement(ptpClock->msgIbuf, manage); + + if ((manage->targetCommunicationTechnology == ptpClock->clock_communication_technology + && !memcmp(manage->targetUuid, ptpClock->clock_uuid_field, PTP_UUID_LENGTH)) + || ((manage->targetCommunicationTechnology == PTP_DEFAULT + || manage->targetCommunicationTechnology == ptpClock->clock_communication_technology) + && !sum(manage->targetUuid, PTP_UUID_LENGTH))) { + switch (manage->managementMessageKey) { + case PTP_MM_OBTAIN_IDENTITY: + case PTP_MM_GET_DEFAULT_DATA_SET: + case PTP_MM_GET_CURRENT_DATA_SET: + case PTP_MM_GET_PARENT_DATA_SET: + case PTP_MM_GET_PORT_DATA_SET: + case PTP_MM_GET_GLOBAL_TIME_DATA_SET: + case PTP_MM_GET_FOREIGN_DATA_SET: + issueManagement(header, manage, rtOpts, ptpClock); + break; + + default: + ptpClock->record_update = TRUE; + state = msgUnloadManagement(ptpClock->msgIbuf, manage, ptpClock, rtOpts); + if (state != ptpClock->port_state) + toState(state, rtOpts, ptpClock); + break; + } + } else { + DBG("handleManagement: unwanted\n"); + } +} + +/* pack and send various messages */ +void +issueSync(RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + TimeInternal internalTime; + TimeRepresentation originTimestamp; + + ++ptpClock->last_sync_event_sequence_number; + ptpClock->grandmaster_sequence_number = ptpClock->last_sync_event_sequence_number; + + getTime(&internalTime); + fromInternalTime(&internalTime, &originTimestamp, ptpClock->halfEpoch); + msgPackSync(ptpClock->msgObuf, FALSE, &originTimestamp, ptpClock); + + if (!netSendEvent(ptpClock->msgObuf, SYNC_PACKET_LENGTH, &ptpClock->netPath)) + toState(PTP_FAULTY, rtOpts, ptpClock); + else + DBGV("sent sync message\n"); +} + +void +issueFollowup(TimeInternal * time, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + TimeRepresentation preciseOriginTimestamp; + + ++ptpClock->last_general_event_sequence_number; + + fromInternalTime(time, &preciseOriginTimestamp, ptpClock->halfEpoch); + msgPackFollowUp(ptpClock->msgObuf, ptpClock->last_sync_event_sequence_number, &preciseOriginTimestamp, ptpClock); + + if (!netSendGeneral(ptpClock->msgObuf, FOLLOW_UP_PACKET_LENGTH, &ptpClock->netPath)) + toState(PTP_FAULTY, rtOpts, ptpClock); + else + DBGV("sent followup message\n"); +} + +void +issueDelayReq(RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + TimeInternal internalTime; + TimeRepresentation originTimestamp; + + ptpClock->sentDelayReq = TRUE; + ptpClock->sentDelayReqSequenceId = ++ptpClock->last_sync_event_sequence_number; + + getTime(&internalTime); + fromInternalTime(&internalTime, &originTimestamp, ptpClock->halfEpoch); + msgPackDelayReq(ptpClock->msgObuf, FALSE, &originTimestamp, ptpClock); + + if (!netSendEvent(ptpClock->msgObuf, DELAY_REQ_PACKET_LENGTH, &ptpClock->netPath)) + toState(PTP_FAULTY, rtOpts, ptpClock); + else + DBGV("sent delay request message\n"); +} + +void +issueDelayResp(TimeInternal * time, MsgHeader * header, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + TimeRepresentation delayReceiptTimestamp; + + ++ptpClock->last_general_event_sequence_number; + + fromInternalTime(time, &delayReceiptTimestamp, ptpClock->halfEpoch); + msgPackDelayResp(ptpClock->msgObuf, header, &delayReceiptTimestamp, ptpClock); + + if (!netSendGeneral(ptpClock->msgObuf, DELAY_RESP_PACKET_LENGTH, &ptpClock->netPath)) + toState(PTP_FAULTY, rtOpts, ptpClock); + else + DBGV("sent delay response message\n"); +} + +void +issueManagement(MsgHeader * header, MsgManagement * manage, RunTimeOpts * rtOpts, PtpClock * ptpClock) +{ + UInteger16 length; + + ++ptpClock->last_general_event_sequence_number; + + if (!(length = msgPackManagementResponse(ptpClock->msgObuf, header, manage, ptpClock))) + return; + + if (!netSendGeneral(ptpClock->msgObuf, length, &ptpClock->netPath)) + toState(PTP_FAULTY, rtOpts, ptpClock); + else + DBGV("sent management message\n"); +} + +/* add or update an entry in the foreign master data set */ +MsgSync * +addForeign(Octet * buf, MsgHeader * header, PtpClock * ptpClock) +{ + int i, j; + Boolean found = FALSE; + + DBGV("updateForeign\n"); + + j = ptpClock->foreign_record_best; + for (i = 0; i < ptpClock->number_foreign_records; ++i) { + if (header->sourceCommunicationTechnology == ptpClock->foreign[j].foreign_master_communication_technology + && header->sourcePortId == ptpClock->foreign[j].foreign_master_port_id + && !memcmp(header->sourceUuid, ptpClock->foreign[j].foreign_master_uuid, PTP_UUID_LENGTH)) { + ++ptpClock->foreign[j].foreign_master_syncs; + found = TRUE; + DBGV("updateForeign: update record %d\n", j); + break; + } + j = (j + 1) % ptpClock->number_foreign_records; + } + + if (!found) { + if (ptpClock->number_foreign_records < ptpClock->max_foreign_records) + ++ptpClock->number_foreign_records; + + j = ptpClock->foreign_record_i; + + ptpClock->foreign[j].foreign_master_communication_technology = + header->sourceCommunicationTechnology; + ptpClock->foreign[j].foreign_master_port_id = + header->sourcePortId; + memcpy(ptpClock->foreign[j].foreign_master_uuid, + header->sourceUuid, PTP_UUID_LENGTH); + + DBG("updateForeign: new record (%d,%d) %d %d %02hhx:%02hhx:%02hhx:%02hhx:%02hhx:%02hhx\n", + ptpClock->foreign_record_i, ptpClock->number_foreign_records, + ptpClock->foreign[j].foreign_master_communication_technology, + ptpClock->foreign[j].foreign_master_port_id, + ptpClock->foreign[j].foreign_master_uuid[0], ptpClock->foreign[j].foreign_master_uuid[1], + ptpClock->foreign[j].foreign_master_uuid[2], ptpClock->foreign[j].foreign_master_uuid[3], + ptpClock->foreign[j].foreign_master_uuid[4], ptpClock->foreign[j].foreign_master_uuid[5]); + + ptpClock->foreign_record_i = (ptpClock->foreign_record_i + 1) % ptpClock->max_foreign_records; + } + msgUnpackHeader(buf, &ptpClock->foreign[j].header); + msgUnpackSync(buf, &ptpClock->foreign[j].sync); + + return &ptpClock->foreign[j].sync; +} diff --git a/third_party/ptpd-1.1.0/src/ptpd.8 b/third_party/ptpd-1.1.0/src/ptpd.8 new file mode 100644 index 0000000..2452d7f --- /dev/null +++ b/third_party/ptpd-1.1.0/src/ptpd.8 @@ -0,0 +1,143 @@ +.\" -*- nroff -*" +.TH ptpd 8 "August 9, 2010" "version 1.1.0" "Precision Time Protocol daemon" +.SH NAME +ptpd \- Precision Time Protocol daemon +.SH SYNOPSIS +.B ptpd + +[-?] +[-c] +[-S] +[-f FILE] +[-R FILE] +[-d] +[-D] +[-x] +[-M NUMBER] +[-t] +[-T ttl] +[-a NUMBER,NUMBER] +[-w NUMBER] +[-b NAME] +[-u ADDRESS] +[-l NUMBER,NUMBER] +[-o NUMBER] +[-e NUMBER] +[-y NUMBER] +[-m NUMBER] +[-g] +[-p] +[-s NUMBER] +[-i NAME] +[-v NUMBER] +[-n NAME] +[-k NUMBER,NUMBER] + +.SH DESCRIPTION +Implements version 1 of the Precision Time Protocol (PTP) as defined +by the IEEE 1588 standard. PTP was developed to provide very precise +time coordination of LAN connected computers. +.PP +PTPd is a complete implementation of the IEEE 1588 specification for a +standard (non-boundary) clock. PTPd has been tested with and is known +to work properly with other IEEE 1588 implementations. The source code +for PTPd is freely available under a BSD-style license. Thanks to +contributions from users, PTPd is becoming an increasingly portable, +interoperable, and stable IEEE 1588 implementation. +.PP +For more information, see http://ptpd.sourceforge.net/ +.SH OPTIONS +.TP +.B \-? +display a short help text +.TP +.B \-c +run in command line (non-daemon) mode +.TP +.B \-S +log information to syslog +.TP +.B \-f FILE +send output to FILE +.TP +.B \-R FILE +record quality data to FILE +.TP +.B \-d +display stats +.TP +.B \-D +display stats in .csv format +.TP +.B \-x +do not reset the clock if off by more than one second +.TP +.B \-M NUMBER +do not reset the clock if off by more than NUMBER nanoseconds +.TP +.B \-t +do not adjust the system clock +.TP +.B \-T +set multicast TTL for packets. Defaults to 1. +.TP +.B \-a NUMBER,NUMBER +specify clock servo P and I attenuations +.TP +.B \-w NUMBER +specify one way delay filter stiffness +.TP +.B \-b NAME +bind PTP to network interface NAME +.TP +.B \-u ADDRESS +don't multicast, send messages unicast to ADDRESS +.TP +.B \-l NUMBER,NUMBER +specify inbound, outbound latency in nsec +.TP +.B \-o NUMBER +specify current UTC offset +.TP +.B \-e NUMBER +specify epoch NUMBER +.TP +.B \-y NUMBER +specify sync interval in 2^NUMBER sec +.TP +.B \-m NUMBER +specify max number of foreign master records +.TP +.B \-g +run as slave only +.TP +.B \-p +make this a preferred clock +.TP +.B \-s NUMBER +specify system clock stratum +.TP +.B \-i NAME +specify system clock identifier +.TP +.B \-v NUMBER +specify system clock allen variance +.TP +.B \-n NAME +specify PTP subdomain name (not related to IP or DNS) +.TP +.B \-k NUMBER,NUMBER +send a management message of key, record, then exit + +.SH AUTHORS +.PP +Originally written and maintained by Kendall Correll + +.PP +Steven Kreuzer +.PP +George Neville-Neil +.PP +This manual page was originally written by Andrew Straw + for the Debian Project (but may be used by +others). diff --git a/third_party/ptpd-1.1.0/src/ptpd.c b/third_party/ptpd-1.1.0/src/ptpd.c new file mode 100644 index 0000000..f137ae5 --- /dev/null +++ b/third_party/ptpd-1.1.0/src/ptpd.c @@ -0,0 +1,59 @@ +/** + * @file ptpd.c + * @date Wed Jun 23 10:13:38 2010 + * + * @brief The main() function for the PTP daemon + * + * This file contains very little code, as should be obvious, + * and only serves to tie together the rest of the daemon. + * All of the default options are set here, but command line + * arguments are processed in the ptpdStartup() routine called + * below. + */ + +#include "ptpd.h" + +RunTimeOpts rtOpts; /* statically allocated run-time + * configuration data */ + +int +main(int argc, char **argv) +{ + PtpClock *ptpClock; + Integer16 ret; + + /* initialize run-time options to reasonable values */ + rtOpts.syncInterval = DEFAULT_SYNC_INTERVAL; + memcpy(rtOpts.subdomainName, DEFAULT_PTP_DOMAIN_NAME, PTP_SUBDOMAIN_NAME_LENGTH); + memcpy(rtOpts.clockIdentifier, IDENTIFIER_DFLT, PTP_CODE_STRING_LENGTH); + rtOpts.clockVariance = DEFAULT_CLOCK_VARIANCE; + rtOpts.clockStratum = DEFAULT_CLOCK_STRATUM; + rtOpts.unicastAddress[0] = 0; + rtOpts.inboundLatency.nanoseconds = DEFAULT_INBOUND_LATENCY; + rtOpts.outboundLatency.nanoseconds = DEFAULT_OUTBOUND_LATENCY; + rtOpts.noResetClock = DEFAULT_NO_RESET_CLOCK; + rtOpts.s = DEFAULT_DELAY_S; + rtOpts.ap = DEFAULT_AP; + rtOpts.ai = DEFAULT_AI; + rtOpts.max_foreign_records = DEFAULT_MAX_FOREIGN_RECORDS; + rtOpts.currentUtcOffset = DEFAULT_UTC_OFFSET; + rtOpts.logFd = -1; + rtOpts.recordFP = NULL; + rtOpts.useSysLog = FALSE; + rtOpts.ttl = 1; + + if (!(ptpClock = ptpdStartup(argc, argv, &ret, &rtOpts))) + return ret; + + if (rtOpts.probe) { + probe(&rtOpts, ptpClock); + } else { + /* do the protocol engine */ + protocol(&rtOpts, ptpClock); + } + + ptpdShutdown(); + + NOTIFY("self shutdown, probably due to an error\n"); + return 1; +} diff --git a/third_party/ptpd-1.1.0/src/ptpd.h b/third_party/ptpd-1.1.0/src/ptpd.h new file mode 100644 index 0000000..b0abe7e --- /dev/null +++ b/third_party/ptpd-1.1.0/src/ptpd.h @@ -0,0 +1,49 @@ +/** + * @file ptpd.h + * @mainpage Ptpd Documentation + * @authors Martin Burnicki, Alexandre van Kempen, Steven Kreuzer, + * George Neville-Neil + * @version 1.0 + * @date Tue Jul 20 16:15:04 2010 + * + * + */ + +#ifndef PTPD_H +#define PTPD_H + +/* Definitions and dependencies for the TI TivaWare port */ +#include "constants.h" +#include "dep-tiva/constants_dep.h" +#include "dep-tiva/datatypes_dep.h" +#include "datatypes.h" +#include "dep-tiva/ptpd_dep.h" + +/* arith.c */ +UInteger32 crc_algorithm(Octet *, Integer16); +UInteger32 sum(Octet *, Integer16); +void fromInternalTime(TimeInternal *, TimeRepresentation *, Boolean); +void toInternalTime(TimeInternal *, TimeRepresentation *, Boolean *); +void normalizeTime(TimeInternal *); +void addTime(TimeInternal *, TimeInternal *, TimeInternal *); +void subTime(TimeInternal *, TimeInternal *, TimeInternal *); + +/* bmc.c */ +UInteger8 bmc(ForeignMasterRecord *, RunTimeOpts *, PtpClock *); +void m1 (PtpClock *); +void s1 (MsgHeader *, MsgSync *, PtpClock *); +void initData(RunTimeOpts *, PtpClock *); + +/* probe.c */ +void probe(RunTimeOpts *, PtpClock *); + +/* protocol.c */ +void protocol(RunTimeOpts *, PtpClock *); + +/* Split versions of protocol() that may be used when no RTOS is present. + * These functions were added by TI. + */ +void protocol_first(RunTimeOpts*,PtpClock*); +void protocol_loop(RunTimeOpts*,PtpClock*); + +#endif diff --git a/third_party/ptpd-1.1.0/tools/filter_response.m b/third_party/ptpd-1.1.0/tools/filter_response.m new file mode 100644 index 0000000..5c20163 --- /dev/null +++ b/third_party/ptpd-1.1.0/tools/filter_response.m @@ -0,0 +1,29 @@ +#!/usr/bin/octave -qf + +# the IIR filter +s = 2^4; +a = [ s -(s-1) ]; +b = [ 1/2 1/2 ]; + +[h w] = freqz(b, a, 100000); + +subplot(211); +plot(w/pi,abs(h),";;"); +axis(); +#plot(w/pi,20*log(abs(h))); +#axis([0 1 -120 0]); +#semilogx(w/pi,20*log(abs(h)),";;"); +#axis([1e-3 1 -120 0]); +ylabel("gain"); + +subplot(212); +plot(w/pi,unwrap(angle(h)),";;"); +axis([0 1 -pi 0]); +#semilogx(w/pi,unwrap(angle(h)),";;"); +#axis([1e-3 1 -pi 0]); +ylabel("phase (rad)"); +xlabel("frequency"); +replot; + +pause; + diff --git a/third_party/ptpd-1.1.0/tools/offset_stats.m b/third_party/ptpd-1.1.0/tools/offset_stats.m new file mode 100644 index 0000000..26af4c2 --- /dev/null +++ b/third_party/ptpd-1.1.0/tools/offset_stats.m @@ -0,0 +1,102 @@ +#!/usr/bin/octave -qf + +printf("start\n"); + +load t; +load tr; + +# time window to analyze +t_beg = 1; +t_fin = length(t); + +# parameters for synthetic reference time +#start_time = round(t(t_beg)); +#sample_interval = 1; + +# parameters for histogram +h_beg = -15e-6; +h_fin = 15e-6; +h_sz = 1e-6; + +# parameters for allan variance +# tune for your computational power +tau_beg = 1; +tau_fin = length(t)/10; +tau_maxsamps = 100; + +# ---------- + +printf("data loaded\n"); + +# create synthetic reference time +#tr = t; +#tr(t_beg) = start_time; +#for k = (t_beg+1):t_fin +# +# tr(k) = tr(k-1) + sample_interval; +# +#endfor + +# time offset computation +o = t - tr; + +o_min = min(o(t_beg:t_fin)); +o_max = max(o(t_beg:t_fin)); +o_mean = mean(o(t_beg:t_fin)); + +# relative tick rate computation +r = t; +for k = (t_beg+1):t_fin + + r(k) = o(k) - o(k-1); + +endfor + +r_min = min(r((t_beg+1):t_fin)); +r_max = max(r((t_beg+1):t_fin)); +r_mean = mean(r((t_beg+1):t_fin)); + +figure; +h_bins = h_beg:h_sz:h_fin; +hist( o(t_beg:t_fin), h_bins, 1); + +printf("histogram plotted\n"); + +figure; +subplot(211); +plot( t_beg:t_fin, o(t_beg:t_fin), "r;time offset;", + [t_beg t_fin], [o_min o_min], "g;;", + [t_beg t_fin], [o_max o_max], "g;;", + [t_beg t_fin], [o_mean o_mean], "b;;"); +subplot(212); +plot( (t_beg+1):t_fin, r((t_beg+1):t_fin), "r;relative tick rate;", + [(t_beg+1) t_fin], [r_min r_min], "g;;", + [(t_beg+1) t_fin], [r_max r_max], "g;;", + [(t_beg+1) t_fin], [r_mean r_mean], "b;;") +replot; + +printf("offset plotted\n"); + +# the allan vaiance computation from the IEEE 1588 spec +a = t; +for tau = tau_beg:tau_fin + + beg = t_beg; + if (t_fin-2*tau) > tau_maxsamps + fin = tau_maxsamps; + else + fin = (t_fin-2*tau); + end + + a(tau) = sum((t(beg:fin) - 2*t((beg+tau):(fin+tau)) + t((beg+2*tau):(fin+2*tau))).^2); + a(tau) /= 2*(fin-beg)*(tau^2); + +endfor + +figure; +loglog( tau_beg:tau_fin, a(tau_beg:tau_fin), ";allan variance;"); +replot; + +printf("variance plotted\n"); +input("done\n"); + diff --git a/third_party/ptpd-1.1.0/tools/ptp_plot.py b/third_party/ptpd-1.1.0/tools/ptp_plot.py new file mode 100644 index 0000000..7c43dec --- /dev/null +++ b/third_party/ptpd-1.1.0/tools/ptp_plot.py @@ -0,0 +1,170 @@ +#! /usr/bin/env python2.6 +# Copyright (c) 2010, Neville-Neil Consulting +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name of Neville-Neil Consulting nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Author: George V. Neville-Neil +# +# Description: + +"""ptp_plot.py -- Plot PTP delays reported by the slave. + +This program takes a ptp log file generated by the slave +and plots various times on a graph + +This program requires at least python2.6 as well as numpy +and gnuplot support. + +""" + +import csv +import datetime +import subprocess +import sys +import tempfile + +from numpy import * + +import Gnuplot, Gnuplot.funcutils + +def usage(): + sys.exit() + +def main(): + + from optparse import OptionParser + + parser = OptionParser() + parser.add_option("-a", "--all", dest="all", default=0, + help="show all entries") + parser.add_option("-t", "--type", dest="type", default="delay", + help="plot the delay or offset") + parser.add_option("-l", "--logfile", dest="logfile", default=None, + help="logfile to use") + parser.add_option("-s", "--start", dest="start", default="09:30:00", + help="start time") + parser.add_option("-e", "--end", dest="end", default="16:30:00", + help="end time") + parser.add_option("-r", "--roll", dest="roll", type=int, default=0, + help="number of days to roll at the start") + parser.add_option("-p", "--print", dest="png", default=None, + help="file to print the graph to") + parser.add_option("-y", "--ymin", dest="ymin", default="0.000000", + help="minimum y value") + parser.add_option("-Y", "--ymax", dest="ymax", default="0.001000", + help="maximum y value") + parser.add_option("-S", "--save", dest="save", default=None, + help="save file name") + + + (options, args) = parser.parse_args() + + if ((options.type != "delay") and (options.type != "offset")): + print "You must choose either delay or offset." + usage() + + try: + logfile = csv.reader(open(options.logfile, "rb")) + except: + print "Could not open %s" % options.logfile + sys.exit() + + # + # This is an ugly hack, but it turns out that gnuplot + # is better able to plot time data if we write it out + # in the familiar format to a temporary file and + # then plot from the file rather than building up + # arrays of data. + # + tmpfile = tempfile.NamedTemporaryFile() + + savefile = None + + if (options.save != None): + savefile = open(options.save, "w") + + + first = True + for line in logfile: + # Split off the microseconds + try: + dt = line[0].rpartition(':')[0] + except: + continue + now = datetime.datetime.strptime(dt, "%Y-%m-%d %H:%M:%S") + if (first == True): + if (options.all == 0): + start = datetime.datetime.strptime(options.start, "%H:%M:%S") + else: + start = now + start = start.replace(year=now.year, month=now.month, + day=now.day + options.roll) + end = datetime.datetime.strptime(options.end, "%H:%M:%S") + end = end.replace(year=now.year, month=now.month, + day=now.day + options.roll) + first = False + if ((now > end) and (options.all == 0)): + break + if ((now > start) or (options.all != 0)): + if (options.type == "delay"): + tmpfile.write("%s %f\n" % (dt, float(line[3]))) + if (savefile != None): + savefile.write("%s %f\n" % (dt, float(line[3]))) + else: + tmpfile.write("%s %f\n" % (dt, float(line[4]))) + if (savefile != None): + savefile.write("%s %f\n" % (dt, float(line[4]))) + + plotter = Gnuplot.Gnuplot(debug=1) + plotter('set data style dots') + if (options.type == "delay"): + plotter.set_range('yrange', [options.ymin, options.ymax]) + plotter.ylabel('Seconds\\nOne Way Delay') + else: + plotter.set_range('yrange', [options.ymin, options.ymax]) + plotter.ylabel('Seconds\\nOffset') + if (options.all == 0): + plotter.xlabel(options.logfile + " " + options.start + " - " + options.end) + else: + plotter.xlabel(options.logfile + " " + str(start) + " - " + str(now)) + plotter('set xdata time') + plotter('set timefmt "%Y-%m-%d %H:%M:%S"') + + tmpfile.flush() + plotter.plot(Gnuplot.File(tmpfile.name, using='1:3')) + + if (options.png != None): + plotter.hardcopy(options.logfile + "-" + options.type + ".png", terminal='png') + raw_input('Press return to exit') + else: + raw_input('Press return to exit') + + +if __name__ == "__main__": + main() diff --git a/third_party/ptpd-1.1.0/tools/quality_correlate.py b/third_party/ptpd-1.1.0/tools/quality_correlate.py new file mode 100644 index 0000000..cea5dd0 --- /dev/null +++ b/third_party/ptpd-1.1.0/tools/quality_correlate.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python2.6 +# Copyright (c) 2010, Neville-Neil Consulting +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# Neither the name of Neville-Neil Consulting nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Author: George V. Neville-Neil +# +# Description: This program reads a pair of PTPd quality files, +# generated with the -R option, correlates and graphs the differences +# between the time each host saw a SYNC which is an easy way to +# measure the quality of time synchronization between two clients +# a timing service. + +import sys + +from numpy import * + +import Gnuplot, Gnuplot.funcutils + +import gzip +import os + +def main(): + + from optparse import OptionParser + + parser = OptionParser() + parser.add_option("-y", "--ymin", dest="ymin", default=0, + help="minimum y value") + parser.add_option("-Y", "--ymax", dest="ymax", default=1000000, + help="maximum y value") + parser.add_option("-N", "--Names", dest="hosts", nargs=2, default=None, + help="host list for sync graph") + parser.add_option("-s", "--start", dest="start", type="int", default=0, + help="starting sequence number") + parser.add_option("-p", "--print", dest="png", default=None, + help="print the graph to a file") + parser.add_option("-o", "--output", dest="output", default=None, + help="save the correlated data to a file.") + parser.add_option("-d", "--debug", dest="debug", type="int", default=0, + help="print debugging info (verbose)") + (options, args) = parser.parse_args() + + if (options.output != None): + try: + outfile = open(options.output, "w") + except: + print "cannot open %s for writing" % options.output + + files = [] + for filename in options.hosts: + if (os.path.splitext(filename)[1] == '.gz'): + file = gzip.open(filename) + else: + file = open(filename) + + trace = {} + done = False + while not done: + try: + (seq, ts) = file.readline().split() + sequence = int(seq) + timestamp = long(ts) + except StopIteration: + done = True + except: + break + + trace[sequence] = timestamp + + files.append(trace) + + sequences = [] + sequences.append(sorted(files[0].keys())) + sequences.append(sorted(files[1].keys())) + + if ((min(sequences[0]) > max(sequences[1])) or + (min(sequences[1]) > max(sequences[1]))): + print "sequences do not overlap" + sys.exit(1) + + # Trim the dictionaries of non overlapping elements + + index = 0 + if ((min(sequences[0]) < min(sequences[1]))): + start = min(sequences[0]) + end = min(sequences[1]) + index = 0 + else: + start = min(sequences[1]) + end = min(sequences[0]) + index = 1 + + for i in range(start, end): + del files[index][i] + + if ((max(sequences[0]) > max(sequences[1]))): + start = max(sequences[1]) + end = max(sequences[0]) + index = 0 + else: + start = max(sequences[0]) + end = max(sequences[1]) + index = 1 + + for i in range(start, end): + del files[index][i] + + if options.start == 0: + options.start = min(files[0].keys()) + + graph = [] + + minimum = sys.maxint + maximum = -sys.maxint -1 + + for i in range(options.start,options.start + len(files[0])): + try: + delta = abs(files[1][i] - files[0][i]) + except KeyError: + print "9:99:99.000900" + print "missing packet %d" % i + continue + + if delta > maximum: + maximum = delta + if delta < minimum: + minimum = delta + + if (options.output != None): + outfile.write(("%d %d\n" % (delta, (files[0][i] / 1000000000)))) + + graph.append(delta) + + if (options.output != None): + outfile.close() + + print "min %d, max %d" % (minimum, maximum) + + # if (minimum.seconds > 1): + # print "Time difference exceeded one second maximum, " \ + # "cannot graph differences" + # sys.exit(1) + + plotter = Gnuplot.Gnuplot(debug=1) + + if ((options.ymin != 0) or (options.ymax != 10)): + plotter.set_range('yrange', [options.ymin, options.ymax]) + + plotter.ylabel('Time Difference\\nNanoseconds') + plotter.xlabel('Sample Number') + plotter.plot(graph) + + if (options.png != None): + plotter.hardcopy(options.png + ".png", terminal='png') + raw_input('Press return to exit') + else: + raw_input('Press return to exit') + +# The canonical way to make a python module into a script. +# Remove if unnecessary. + +if __name__ == "__main__": + main() diff --git a/third_party/uip-1.0/README b/third_party/uip-1.0/README new file mode 100644 index 0000000..909f652 --- /dev/null +++ b/third_party/uip-1.0/README @@ -0,0 +1,13 @@ +uIP is a very small implementation of the TCP/IP stack that is written +by Adam Dunkels . More information can be obtained +at the uIP homepage at http://www.sics.se/~adam/uip/. + +This is version $Name: uip-1-0 $. + +The directory structure look as follows: + +apps/ - Example applications +doc/ - Documentation +lib/ - Library code used by some applications +uip/ - uIP TCP/IP stack code +unix/ - uIP as a user space process under FreeBSD or Linux diff --git a/third_party/uip-1.0/apps/README b/third_party/uip-1.0/apps/README new file mode 100644 index 0000000..f889209 --- /dev/null +++ b/third_party/uip-1.0/apps/README @@ -0,0 +1,2 @@ +This directory contains a few example applications. They are not all +heavily tested, however. diff --git a/third_party/uip-1.0/apps/dhcpc/Makefile.dhcpc b/third_party/uip-1.0/apps/dhcpc/Makefile.dhcpc new file mode 100644 index 0000000..6a1580d --- /dev/null +++ b/third_party/uip-1.0/apps/dhcpc/Makefile.dhcpc @@ -0,0 +1 @@ +APP_SOURCES += dhcpc.c timer.c diff --git a/third_party/uip-1.0/apps/dhcpc/dhcpc.c b/third_party/uip-1.0/apps/dhcpc/dhcpc.c new file mode 100644 index 0000000..9c88185 --- /dev/null +++ b/third_party/uip-1.0/apps/dhcpc/dhcpc.c @@ -0,0 +1,358 @@ +/* + * Copyright (c) 2005, Swedish Institute of Computer Science + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * @(#)$Id: dhcpc.c,v 1.2 2006/06/11 21:46:37 adam Exp $ + */ + +#include +#include + +#include "uip.h" +#include "dhcpc.h" +#include "uip_timer.h" +#include "pt.h" + +#define STATE_INITIAL 0 +#define STATE_SENDING 1 +#define STATE_OFFER_RECEIVED 2 +#define STATE_CONFIG_RECEIVED 3 + +static struct dhcpc_state s; + +struct dhcp_msg { + u8_t op, htype, hlen, hops; + u8_t xid[4]; + u16_t secs, flags; + u8_t ciaddr[4]; + u8_t yiaddr[4]; + u8_t siaddr[4]; + u8_t giaddr[4]; + u8_t chaddr[16]; +#ifndef UIP_CONF_DHCP_LIGHT + u8_t sname[64]; + u8_t file[128]; +#endif + u8_t options[312]; +}; + +#define BOOTP_BROADCAST 0x8000 + +#define DHCP_REQUEST 1 +#define DHCP_REPLY 2 +#define DHCP_HTYPE_ETHERNET 1 +#define DHCP_HLEN_ETHERNET 6 +#define DHCP_MSG_LEN 236 + +#define DHCPC_SERVER_PORT 67 +#define DHCPC_CLIENT_PORT 68 + +#define DHCPDISCOVER 1 +#define DHCPOFFER 2 +#define DHCPREQUEST 3 +#define DHCPDECLINE 4 +#define DHCPACK 5 +#define DHCPNAK 6 +#define DHCPRELEASE 7 + +#define DHCP_OPTION_SUBNET_MASK 1 +#define DHCP_OPTION_ROUTER 3 +#define DHCP_OPTION_DNS_SERVER 6 +#define DHCP_OPTION_REQ_IPADDR 50 +#define DHCP_OPTION_LEASE_TIME 51 +#define DHCP_OPTION_MSG_TYPE 53 +#define DHCP_OPTION_SERVER_ID 54 +#define DHCP_OPTION_REQ_LIST 55 +#define DHCP_OPTION_END 255 + +static const u8_t xid[4] = {0xad, 0xde, 0x12, 0x23}; +static const u8_t magic_cookie[4] = {99, 130, 83, 99}; +/*---------------------------------------------------------------------------*/ +static u8_t * +add_msg_type(u8_t *optptr, u8_t type) +{ + *optptr++ = DHCP_OPTION_MSG_TYPE; + *optptr++ = 1; + *optptr++ = type; + return optptr; +} +/*---------------------------------------------------------------------------*/ +static u8_t * +add_server_id(u8_t *optptr) +{ + *optptr++ = DHCP_OPTION_SERVER_ID; + *optptr++ = 4; + memcpy(optptr, s.serverid, 4); + return optptr + 4; +} +/*---------------------------------------------------------------------------*/ +static u8_t * +add_req_ipaddr(u8_t *optptr) +{ + *optptr++ = DHCP_OPTION_REQ_IPADDR; + *optptr++ = 4; + memcpy(optptr, s.ipaddr, 4); + return optptr + 4; +} +/*---------------------------------------------------------------------------*/ +static u8_t * +add_req_options(u8_t *optptr) +{ + *optptr++ = DHCP_OPTION_REQ_LIST; + *optptr++ = 3; + *optptr++ = DHCP_OPTION_SUBNET_MASK; + *optptr++ = DHCP_OPTION_ROUTER; + *optptr++ = DHCP_OPTION_DNS_SERVER; + return optptr; +} +/*---------------------------------------------------------------------------*/ +static u8_t * +add_end(u8_t *optptr) +{ + *optptr++ = DHCP_OPTION_END; + return optptr; +} +/*---------------------------------------------------------------------------*/ +static void +create_msg(register struct dhcp_msg *m) +{ + m->op = DHCP_REQUEST; + m->htype = DHCP_HTYPE_ETHERNET; + m->hlen = s.mac_len; + m->hops = 0; + memcpy(m->xid, xid, sizeof(m->xid)); + m->secs = 0; + m->flags = HTONS(BOOTP_BROADCAST); /* Broadcast bit. */ + /* uip_ipaddr_copy(m->ciaddr, uip_hostaddr);*/ + memcpy(m->ciaddr, uip_hostaddr, sizeof(m->ciaddr)); + memset(m->yiaddr, 0, sizeof(m->yiaddr)); + memset(m->siaddr, 0, sizeof(m->siaddr)); + memset(m->giaddr, 0, sizeof(m->giaddr)); + memcpy(m->chaddr, s.mac_addr, s.mac_len); + memset(&m->chaddr[s.mac_len], 0, sizeof(m->chaddr) - s.mac_len); +#ifndef UIP_CONF_DHCP_LIGHT + memset(m->sname, 0, sizeof(m->sname)); + memset(m->file, 0, sizeof(m->file)); +#endif + + memcpy(m->options, magic_cookie, sizeof(magic_cookie)); +} +/*---------------------------------------------------------------------------*/ +static void +send_discover(void) +{ + u8_t *end; + struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata; + + create_msg(m); + + end = add_msg_type(&m->options[4], DHCPDISCOVER); + end = add_req_options(end); + end = add_end(end); + + uip_send(uip_appdata, end - (u8_t *)uip_appdata); +} +/*---------------------------------------------------------------------------*/ +static void +send_request(void) +{ + u8_t *end; + struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata; + + create_msg(m); + + end = add_msg_type(&m->options[4], DHCPREQUEST); + end = add_server_id(end); + end = add_req_ipaddr(end); + end = add_end(end); + + uip_send(uip_appdata, end - (u8_t *)uip_appdata); +} +/*---------------------------------------------------------------------------*/ +static u8_t +parse_options(u8_t *optptr, int len) +{ + u8_t *end = optptr + len; + u8_t type = 0; + + while(optptr < end) { + switch(*optptr) { + case DHCP_OPTION_SUBNET_MASK: + memcpy(s.netmask, optptr + 2, 4); + break; + case DHCP_OPTION_ROUTER: + memcpy(s.default_router, optptr + 2, 4); + break; + case DHCP_OPTION_DNS_SERVER: + memcpy(s.dnsaddr, optptr + 2, 4); + break; + case DHCP_OPTION_MSG_TYPE: + type = *(optptr + 2); + break; + case DHCP_OPTION_SERVER_ID: + memcpy(s.serverid, optptr + 2, 4); + break; + case DHCP_OPTION_LEASE_TIME: + memcpy(s.lease_time, optptr + 2, 4); + break; + case DHCP_OPTION_END: + return type; + } + + optptr += optptr[1] + 2; + } + return type; +} +/*---------------------------------------------------------------------------*/ +static u8_t +parse_msg(void) +{ + struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata; + + if(m->op == DHCP_REPLY && + memcmp(m->xid, xid, sizeof(xid)) == 0 && + memcmp(m->chaddr, s.mac_addr, s.mac_len) == 0) { + memcpy(s.ipaddr, m->yiaddr, 4); + return parse_options(&m->options[4], uip_datalen()); + } + return 0; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_dhcp(void)) +{ + PT_BEGIN(&s.pt); + + /* try_again:*/ + s.state = STATE_SENDING; + s.ticks = CLOCK_SECOND; + + do { + send_discover(); + timer_set(&s.timer, s.ticks); + PT_YIELD(&s.pt); + PT_WAIT_UNTIL(&s.pt, uip_newdata() || timer_expired(&s.timer)); + + if(uip_newdata() && parse_msg() == DHCPOFFER) { + s.state = STATE_OFFER_RECEIVED; + break; + } + + if(s.ticks < CLOCK_SECOND * 60) { + s.ticks *= 2; + } + } while(s.state != STATE_OFFER_RECEIVED); + + s.ticks = CLOCK_SECOND; + + do { + send_request(); + timer_set(&s.timer, s.ticks); + PT_YIELD(&s.pt); + PT_WAIT_UNTIL(&s.pt, uip_newdata() || timer_expired(&s.timer)); + + if(uip_newdata() && parse_msg() == DHCPACK) { + s.state = STATE_CONFIG_RECEIVED; + break; + } + + if(s.ticks <= CLOCK_SECOND * 10) { + s.ticks += CLOCK_SECOND; + } else { + PT_RESTART(&s.pt); + } + } while(s.state != STATE_CONFIG_RECEIVED); + +#if 0 + printf("Got IP address %d.%d.%d.%d\n", + uip_ipaddr1(s.ipaddr), uip_ipaddr2(s.ipaddr), + uip_ipaddr3(s.ipaddr), uip_ipaddr4(s.ipaddr)); + printf("Got netmask %d.%d.%d.%d\n", + uip_ipaddr1(s.netmask), uip_ipaddr2(s.netmask), + uip_ipaddr3(s.netmask), uip_ipaddr4(s.netmask)); + printf("Got DNS server %d.%d.%d.%d\n", + uip_ipaddr1(s.dnsaddr), uip_ipaddr2(s.dnsaddr), + uip_ipaddr3(s.dnsaddr), uip_ipaddr4(s.dnsaddr)); + printf("Got default router %d.%d.%d.%d\n", + uip_ipaddr1(s.default_router), uip_ipaddr2(s.default_router), + uip_ipaddr3(s.default_router), uip_ipaddr4(s.default_router)); + printf("Lease expires in %ld seconds\n", + ntohs(s.lease_time[0])*65536ul + ntohs(s.lease_time[1])); +#endif + + dhcpc_configured(&s); + + /* timer_stop(&s.timer);*/ + + /* + * PT_END restarts the thread so we do this instead. Eventually we + * should reacquire expired leases here. + */ + while(1) { + PT_YIELD(&s.pt); + } + + PT_END(&s.pt); +} +/*---------------------------------------------------------------------------*/ +void +dhcpc_init(const void *mac_addr, int mac_len) +{ + uip_ipaddr_t addr; + + s.mac_addr = mac_addr; + s.mac_len = mac_len; + + s.state = STATE_INITIAL; + uip_ipaddr(addr, 255,255,255,255); + s.conn = uip_udp_new(&addr, HTONS(DHCPC_SERVER_PORT)); + if(s.conn != NULL) { + uip_udp_bind(s.conn, HTONS(DHCPC_CLIENT_PORT)); + } + PT_INIT(&s.pt); +} +/*---------------------------------------------------------------------------*/ +void +dhcpc_appcall(void) +{ + handle_dhcp(); +} +/*---------------------------------------------------------------------------*/ +void +dhcpc_request(void) +{ + u16_t ipaddr[2]; + + if(s.state == STATE_INITIAL) { + uip_ipaddr(ipaddr, 0,0,0,0); + uip_sethostaddr(ipaddr); + /* handle_dhcp(PROCESS_EVENT_NONE, NULL);*/ + } +} +/*---------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/apps/dhcpc/dhcpc.h b/third_party/uip-1.0/apps/dhcpc/dhcpc.h new file mode 100644 index 0000000..0d65e92 --- /dev/null +++ b/third_party/uip-1.0/apps/dhcpc/dhcpc.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2005, Swedish Institute of Computer Science + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * @(#)$Id: dhcpc.h,v 1.3 2006/06/11 21:46:37 adam Exp $ + */ +#ifndef __DHCPC_H__ +#define __DHCPC_H__ + +#include "uip_timer.h" +#include "pt.h" + +struct dhcpc_state { + struct pt pt; + char state; + struct uip_udp_conn *conn; + struct timer timer; + u16_t ticks; + const void *mac_addr; + int mac_len; + + u8_t serverid[4]; + + u16_t lease_time[2]; + u16_t ipaddr[2]; + u16_t netmask[2]; + u16_t dnsaddr[2]; + u16_t default_router[2]; +}; + +void dhcpc_init(const void *mac_addr, int mac_len); +void dhcpc_request(void); + +void dhcpc_appcall(void); + +void dhcpc_configured(const struct dhcpc_state *s); + +typedef struct dhcpc_state uip_udp_appstate_t; +#define UIP_UDP_APPCALL dhcpc_appcall + + +#endif /* __DHCPC_H__ */ diff --git a/third_party/uip-1.0/apps/hello-world/Makefile.hello-world b/third_party/uip-1.0/apps/hello-world/Makefile.hello-world new file mode 100644 index 0000000..b94a4fb --- /dev/null +++ b/third_party/uip-1.0/apps/hello-world/Makefile.hello-world @@ -0,0 +1 @@ +APP_SOURCES += hello-world.c diff --git a/third_party/uip-1.0/apps/hello-world/hello-world.c b/third_party/uip-1.0/apps/hello-world/hello-world.c new file mode 100644 index 0000000..ebf4855 --- /dev/null +++ b/third_party/uip-1.0/apps/hello-world/hello-world.c @@ -0,0 +1,100 @@ +/** + * \addtogroup helloworld + * @{ + */ + +/** + * \file + * An example of how to write uIP applications + * with protosockets. + * \author + * Adam Dunkels + */ + +/* + * This is a short example of how to write uIP applications using + * protosockets. + */ + +/* + * We define the application state (struct hello_world_state) in the + * hello-world.h file, so we need to include it here. We also include + * uip.h (since this cannot be included in hello-world.h) and + * , since we use the memcpy() function in the code. + */ +#include "hello-world.h" +#include "uip.h" +#include + +/* + * Declaration of the protosocket function that handles the connection + * (defined at the end of the code). + */ +static int handle_connection(struct hello_world_state *s); +/*---------------------------------------------------------------------------*/ +/* + * The initialization function. We must explicitly call this function + * from the system initialization code, some time after uip_init() is + * called. + */ +void +hello_world_init(void) +{ + /* We start to listen for connections on TCP port 1000. */ + uip_listen(HTONS(1000)); +} +/*---------------------------------------------------------------------------*/ +/* + * In hello-world.h we have defined the UIP_APPCALL macro to + * hello_world_appcall so that this funcion is uIP's application + * function. This function is called whenever an uIP event occurs + * (e.g. when a new connection is established, new data arrives, sent + * data is acknowledged, data needs to be retransmitted, etc.). + */ +void +hello_world_appcall(void) +{ + /* + * The uip_conn structure has a field called "appstate" that holds + * the application state of the connection. We make a pointer to + * this to access it easier. + */ + struct hello_world_state *s = &(uip_conn->appstate); + + /* + * If a new connection was just established, we should initialize + * the protosocket in our applications' state structure. + */ + if(uip_connected()) { + PSOCK_INIT(&s->p, s->inputbuffer, sizeof(s->inputbuffer)); + } + + /* + * Finally, we run the protosocket function that actually handles + * the communication. We pass it a pointer to the application state + * of the current connection. + */ + handle_connection(s); +} +/*---------------------------------------------------------------------------*/ +/* + * This is the protosocket function that handles the communication. A + * protosocket function must always return an int, but must never + * explicitly return - all return statements are hidden in the PSOCK + * macros. + */ +static int +handle_connection(struct hello_world_state *s) +{ + PSOCK_BEGIN(&s->p); + + PSOCK_SEND_STR(&s->p, "Hello. What is your name?\n"); + PSOCK_READTO(&s->p, '\n'); + strncpy(s->name, s->inputbuffer, sizeof(s->name)); + PSOCK_SEND_STR(&s->p, "Hello "); + PSOCK_SEND_STR(&s->p, s->name); + PSOCK_CLOSE(&s->p); + + PSOCK_END(&s->p); +} +/*---------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/apps/hello-world/hello-world.h b/third_party/uip-1.0/apps/hello-world/hello-world.h new file mode 100644 index 0000000..35a85ea --- /dev/null +++ b/third_party/uip-1.0/apps/hello-world/hello-world.h @@ -0,0 +1,52 @@ +/** + * \addtogroup apps + * @{ + */ + +/** + * \defgroup helloworld Hello, world + * @{ + * + * A small example showing how to write applications with + * \ref psock "protosockets". + */ + +/** + * \file + * Header file for an example of how to write uIP applications + * with protosockets. + * \author + * Adam Dunkels + */ + +#ifndef __HELLO_WORLD_H__ +#define __HELLO_WORLD_H__ + +/* Since this file will be included by uip.h, we cannot include uip.h + here. But we might need to include uipopt.h if we need the u8_t and + u16_t datatypes. */ +#include "uipopt.h" + +#include "psock.h" + +/* Next, we define the uip_tcp_appstate_t datatype. This is the state + of our application, and the memory required for this state is + allocated together with each TCP connection. One application state + for each TCP connection. */ +typedef struct hello_world_state { + struct psock p; + char inputbuffer[10]; + char name[40]; +} uip_tcp_appstate_t; + +/* Finally we define the application function to be called by uIP. */ +void hello_world_appcall(void); +#ifndef UIP_APPCALL +#define UIP_APPCALL hello_world_appcall +#endif /* UIP_APPCALL */ + +void hello_world_init(void); + +#endif /* __HELLO_WORLD_H__ */ +/** @} */ +/** @} */ diff --git a/third_party/uip-1.0/apps/httpd/httpd.c b/third_party/uip-1.0/apps/httpd/httpd.c new file mode 100644 index 0000000..f28c6e7 --- /dev/null +++ b/third_party/uip-1.0/apps/httpd/httpd.c @@ -0,0 +1,325 @@ +//***************************************************************************** +// HTTP server. +// Adam Dunkels +// +// Copyright (c) 2001, Adam Dunkels. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. The name of the author may not be used to endorse or promote +// products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS +// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// This file is part of the uIP TCP/IP stack. +// +//***************************************************************************** + +#include "uip.h" +#include "httpd.h" + +//***************************************************************************** +// +// Macro for easy access to buffer data +// +//***************************************************************************** +#define BUF_APPDATA ((u8_t *)uip_appdata) + +//***************************************************************************** +// +// Definitions of HTTP Server States +// +//***************************************************************************** +#define HTTP_NOGET 0 +#define HTTP_FILE 1 +#define HTTP_TEXT 2 +#define HTTP_FUNC 3 +#define HTTP_END 4 + +//***************************************************************************** +// +// Global for keeping up with web server state. +// +//***************************************************************************** +struct httpd_state *hs; + +//***************************************************************************** +// +// Default Web Page - allocated in three segments to allow easy update of a +// counter that is incremented each time the page is sent. +// +//***************************************************************************** +static const char page_not_found[] = +"HTTP/1.0 404 OK\r\n" +"Server: UIP/1.0 (http://www.sics.se/~adam/uip/)\r\n" +"Content-type: text/html\r\n\r\n" +"" +"" + "" + "Page Not Found!" + "" + "" + "Page Not Found!" + "" +""; + +//***************************************************************************** +// +// Default Web Page - allocated in three segments to allow easy update of a +// counter that is incremented each time the page is sent. +// +//***************************************************************************** +static const char default_page_buf1of3[] = +"HTTP/1.0 200 OK\r\n" +"Server: UIP/1.0 (http://www.sics.se/~adam/uip/)\r\n" +"Content-type: text/html\r\n\r\n" +"" +"" + "" + "Welcome to the uIP web server!" + "" + "" + "
" + "

µIP Web Server

" + "

This web page is served by a small web server running on top of " + "the µIP embedded TCP/IP " + "stack." + "


" + "

The µIP stack is running on a " + "Texas Instruments " + "Tiva C Series" + "


" + "

This page has been sent "; +static char default_page_buf2of3[] = + "00001"; +static const char default_page_buf3of3[] = + " times since reset!" + "

" + "" +""; + +//***************************************************************************** +// +// Increment the view count. This routine will increment the 5-digit ascii +// counter that is sent with the web page. +// +//***************************************************************************** +static void +httpd_inc_page_count(void) +{ + // + // Increment the 'ones' digit. If it wraps, then increment the 'tens' + // digit. + // + default_page_buf2of3[4]++; + if(default_page_buf2of3[4] == 0x3a) + { + default_page_buf2of3[4] = 0x30; + default_page_buf2of3[3]++; + } + + // + // If the 'tens' digit wraps, increment the 'hundreds' digit. + // + if(default_page_buf2of3[3] == 0x3a) + { + default_page_buf2of3[3] = 0x30; + default_page_buf2of3[2]++; + } + + // + // If the 'hundreds' digit wraps, increment the 'thousands' digit. + // + if(default_page_buf2of3[2] == 0x3a) + { + default_page_buf2of3[2] = 0x30; + default_page_buf2of3[1]++; + } + + // + // If the 'thousands' digit wraps, increment the 'ten-thousands' digit. + // + if(default_page_buf2of3[1] == 0x3a) + { + default_page_buf2of3[1] = 0x30; + default_page_buf2of3[0]++; + } + + // + // If the 'ten-thousands' digit wrapped, start over. + // + if(default_page_buf2of3[0] == 0x3a) + { + default_page_buf2of3[0] = 0x30; + } +} + +//***************************************************************************** +// +// Initialize the web server. +// +// Starts to listen for incoming connection requests on TCP port 80. +// +//***************************************************************************** +void +httpd_init(void) +{ + // + // Listen to port 80. + // + uip_listen(HTONS(80)); +} + +//***************************************************************************** +// +// HTTP Application Callback Function +// +//***************************************************************************** +void +httpd_appcall(void) +{ + switch(uip_conn->lport) + { + // + // This is the web server: + // + case HTONS(80): + { + // + // Pick out the application state from the uip_conn structure. + // + hs = (struct httpd_state *)&(uip_conn->appstate); + + // + // We use the uip_ test functions to deduce why we were + // called. If uip_connected() is non-zero, we were called + // because a remote host has connected to us. If + // uip_newdata() is non-zero, we were called because the + // remote host has sent us new data, and if uip_acked() is + // non-zero, the remote host has acknowledged the data we + // previously sent to it. */ + if(uip_connected()) + { + // + // Since we have just been connected with the remote host, we + // reset the state for this connection. The ->count variable + // contains the amount of data that is yet to be sent to the + // remote host, and the ->state is set to HTTP_NOGET to signal + // that we haven't received any HTTP GET request for this + // connection yet. + // + hs->state = HTTP_NOGET; + hs->count = 0; + hs->bufcount = 0; + return; + } + else if(uip_poll()) + { + // + // If we are polled ten times, we abort the connection. This is + // because we don't want connections lingering indefinately in + // the system. + // + if(hs->count++ >= 10) + { + uip_abort(); + } + return; + } + else if(uip_newdata() && hs->state == HTTP_NOGET) + { + // + // This is the first data we receive, and it should contain a + // GET. + // + // Check for GET. + // + if(BUF_APPDATA[0] != 'G' || + BUF_APPDATA[1] != 'E' || + BUF_APPDATA[2] != 'T' || + BUF_APPDATA[3] != ' ') + { + // + // If it isn't a GET, we abort the connection. + // + uip_abort(); + return; + } + + // + // Check to see what we should send. + // + if((BUF_APPDATA[4] == '/') && + (BUF_APPDATA[5] == ' ')) + { + // + // Send buffer 1 + // + uip_send(default_page_buf1of3, + sizeof(default_page_buf1of3) - 1); + } + else + { + uip_send(page_not_found, + sizeof(page_not_found) - 1); + hs->bufcount = 3; + } + } + else if(uip_acked()) + { + hs->bufcount++; + if(hs->bufcount == 1) + { + uip_send(default_page_buf2of3, + sizeof(default_page_buf2of3) - 1); + } + else if(hs->bufcount == 2) + { + uip_send(default_page_buf3of3, + sizeof(default_page_buf3of3) - 1); + } + else if(hs->bufcount == 3) + { + httpd_inc_page_count(); + uip_close(); + } + else + { + uip_close(); + } + } + // + // Finally, return to uIP. Our outgoing packet will soon be on its + // way... + // + return; + } + + default: + { + // + // Should never happen. + // + uip_abort(); + break; + } + } +} diff --git a/third_party/uip-1.0/apps/httpd/httpd.h b/third_party/uip-1.0/apps/httpd/httpd.h new file mode 100644 index 0000000..c401062 --- /dev/null +++ b/third_party/uip-1.0/apps/httpd/httpd.h @@ -0,0 +1,59 @@ +//***************************************************************************** +// HTTP server header file. +// Adam Dunkels +// +// Copyright (c) 2001, Adam Dunkels. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. The name of the author may not be used to endorse or promote +// products derived from this software without specific prior +// written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS +// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// This file is part of the uIP TCP/IP stack. +// +//***************************************************************************** + +#ifndef __HTTPD_H__ +#define __HTTPD_H__ + +//***************************************************************************** +// +// Web Server Application Entry Points. +// +//***************************************************************************** +void httpd_init(void); +void httpd_appcall(void); + +//***************************************************************************** +// +// Web Server Application State Variable Definition. +// +//***************************************************************************** +struct httpd_state +{ + u8_t state; + u16_t count; + u16_t bufcount; +}; + +#endif // __HTTPD_H__ diff --git a/third_party/uip-1.0/apps/resolv/Makefile.resolv b/third_party/uip-1.0/apps/resolv/Makefile.resolv new file mode 100644 index 0000000..1f6a9f2 --- /dev/null +++ b/third_party/uip-1.0/apps/resolv/Makefile.resolv @@ -0,0 +1 @@ +APP_SOURCES += resolv.c diff --git a/third_party/uip-1.0/apps/resolv/resolv.c b/third_party/uip-1.0/apps/resolv/resolv.c new file mode 100644 index 0000000..4b8dd9a --- /dev/null +++ b/third_party/uip-1.0/apps/resolv/resolv.c @@ -0,0 +1,464 @@ +/** + * \addtogroup apps + * @{ + */ + +/** + * \defgroup resolv DNS resolver + * @{ + * + * The uIP DNS resolver functions are used to lookup a hostname and + * map it to a numerical IP address. It maintains a list of resolved + * hostnames that can be queried with the resolv_lookup() + * function. New hostnames can be resolved using the resolv_query() + * function. + * + * When a hostname has been resolved (or found to be non-existant), + * the resolver code calls a callback function called resolv_found() + * that must be implemented by the module that uses the resolver. + */ + +/** + * \file + * DNS host name to IP address resolver. + * \author Adam Dunkels + * + * This file implements a DNS host name to IP address resolver. + */ + +/* + * Copyright (c) 2002-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: resolv.c,v 1.5 2006/06/11 21:46:37 adam Exp $ + * + */ + +#include "resolv.h" +#include "uip.h" + +#include + +#ifndef NULL +#define NULL (void *)0 +#endif /* NULL */ + +/** \internal The maximum number of retries when asking for a name. */ +#define MAX_RETRIES 8 + +/** \internal The DNS message header. */ +struct dns_hdr { + u16_t id; + u8_t flags1, flags2; +#define DNS_FLAG1_RESPONSE 0x80 +#define DNS_FLAG1_OPCODE_STATUS 0x10 +#define DNS_FLAG1_OPCODE_INVERSE 0x08 +#define DNS_FLAG1_OPCODE_STANDARD 0x00 +#define DNS_FLAG1_AUTHORATIVE 0x04 +#define DNS_FLAG1_TRUNC 0x02 +#define DNS_FLAG1_RD 0x01 +#define DNS_FLAG2_RA 0x80 +#define DNS_FLAG2_ERR_MASK 0x0f +#define DNS_FLAG2_ERR_NONE 0x00 +#define DNS_FLAG2_ERR_NAME 0x03 + u16_t numquestions; + u16_t numanswers; + u16_t numauthrr; + u16_t numextrarr; +}; + +/** \internal The DNS answer message structure. */ +struct dns_answer { + /* DNS answer record starts with either a domain name or a pointer + to a name already present somewhere in the packet. */ + u16_t type; + u16_t class; + u16_t ttl[2]; + u16_t len; + uip_ipaddr_t ipaddr; +}; + +struct namemap { +#define STATE_UNUSED 0 +#define STATE_NEW 1 +#define STATE_ASKING 2 +#define STATE_DONE 3 +#define STATE_ERROR 4 + u8_t state; + u8_t tmr; + u8_t retries; + u8_t seqno; + u8_t err; + char name[32]; + uip_ipaddr_t ipaddr; +}; + +#ifndef UIP_CONF_RESOLV_ENTRIES +#define RESOLV_ENTRIES 4 +#else /* UIP_CONF_RESOLV_ENTRIES */ +#define RESOLV_ENTRIES UIP_CONF_RESOLV_ENTRIES +#endif /* UIP_CONF_RESOLV_ENTRIES */ + + +static struct namemap names[RESOLV_ENTRIES]; + +static u8_t seqno; + +static struct uip_udp_conn *resolv_conn = NULL; + + +/*---------------------------------------------------------------------------*/ +/** \internal + * Walk through a compact encoded DNS name and return the end of it. + * + * \return The end of the name. + */ +/*---------------------------------------------------------------------------*/ +static unsigned char * +parse_name(unsigned char *query) +{ + unsigned char n; + + do { + n = *query++; + + while(n > 0) { + /* printf("%c", *query);*/ + ++query; + --n; + }; + /* printf(".");*/ + } while(*query != 0); + /* printf("\n");*/ + return query + 1; +} +/*---------------------------------------------------------------------------*/ +/** \internal + * Runs through the list of names to see if there are any that have + * not yet been queried and, if so, sends out a query. + */ +/*---------------------------------------------------------------------------*/ +static void +check_entries(void) +{ + register struct dns_hdr *hdr; + char *query, *nptr, *nameptr; + static u8_t i; + static u8_t n; + register struct namemap *namemapptr; + + for(i = 0; i < RESOLV_ENTRIES; ++i) { + namemapptr = &names[i]; + if(namemapptr->state == STATE_NEW || + namemapptr->state == STATE_ASKING) { + if(namemapptr->state == STATE_ASKING) { + if(--namemapptr->tmr == 0) { + if(++namemapptr->retries == MAX_RETRIES) { + namemapptr->state = STATE_ERROR; + resolv_found(namemapptr->name, NULL); + continue; + } + namemapptr->tmr = namemapptr->retries; + } else { + /* printf("Timer %d\n", namemapptr->tmr);*/ + /* Its timer has not run out, so we move on to next + entry. */ + continue; + } + } else { + namemapptr->state = STATE_ASKING; + namemapptr->tmr = 1; + namemapptr->retries = 0; + } + hdr = (struct dns_hdr *)uip_appdata; + memset(hdr, 0, sizeof(struct dns_hdr)); + hdr->id = htons(i); + hdr->flags1 = DNS_FLAG1_RD; + hdr->numquestions = HTONS(1); + query = (char *)uip_appdata + 12; + nameptr = namemapptr->name; + --nameptr; + /* Convert hostname into suitable query format. */ + do { + ++nameptr; + nptr = query; + ++query; + for(n = 0; *nameptr != '.' && *nameptr != 0; ++nameptr) { + *query = *nameptr; + ++query; + ++n; + } + *nptr = n; + } while(*nameptr != 0); + { + static unsigned char endquery[] = + {0,0,1,0,1}; + memcpy(query, endquery, 5); + } + uip_udp_send((unsigned char)(query + 5 - (char *)uip_appdata)); + break; + } + } +} +/*---------------------------------------------------------------------------*/ +/** \internal + * Called when new UDP data arrives. + */ +/*---------------------------------------------------------------------------*/ +static void +newdata(void) +{ + char *nameptr; + struct dns_answer *ans; + struct dns_hdr *hdr; + static u8_t nquestions, nanswers; + static u8_t i; + register struct namemap *namemapptr; + + hdr = (struct dns_hdr *)uip_appdata; + /* printf("ID %d\n", htons(hdr->id)); + printf("Query %d\n", hdr->flags1 & DNS_FLAG1_RESPONSE); + printf("Error %d\n", hdr->flags2 & DNS_FLAG2_ERR_MASK); + printf("Num questions %d, answers %d, authrr %d, extrarr %d\n", + htons(hdr->numquestions), + htons(hdr->numanswers), + htons(hdr->numauthrr), + htons(hdr->numextrarr)); + */ + + /* The ID in the DNS header should be our entry into the name + table. */ + i = htons(hdr->id); + namemapptr = &names[i]; + if(i < RESOLV_ENTRIES && + namemapptr->state == STATE_ASKING) { + + /* This entry is now finished. */ + namemapptr->state = STATE_DONE; + namemapptr->err = hdr->flags2 & DNS_FLAG2_ERR_MASK; + + /* Check for error. If so, call callback to inform. */ + if(namemapptr->err != 0) { + namemapptr->state = STATE_ERROR; + resolv_found(namemapptr->name, NULL); + return; + } + + /* We only care about the question(s) and the answers. The authrr + and the extrarr are simply discarded. */ + nquestions = htons(hdr->numquestions); + nanswers = htons(hdr->numanswers); + + /* Skip the name in the question. XXX: This should really be + checked agains the name in the question, to be sure that they + match. */ + nameptr = parse_name((char *)uip_appdata + 12) + 4; + + while(nanswers > 0) { + /* The first byte in the answer resource record determines if it + is a compressed record or a normal one. */ + if(*nameptr & 0xc0) { + /* Compressed name. */ + nameptr +=2; + /* printf("Compressed anwser\n");*/ + } else { + /* Not compressed name. */ + nameptr = parse_name((char *)nameptr); + } + + ans = (struct dns_answer *)nameptr; + /* printf("Answer: type %x, class %x, ttl %x, length %x\n", + htons(ans->type), htons(ans->class), (htons(ans->ttl[0]) + << 16) | htons(ans->ttl[1]), htons(ans->len));*/ + + /* Check for IP address type and Internet class. Others are + discarded. */ + if(ans->type == HTONS(1) && + ans->class == HTONS(1) && + ans->len == HTONS(4)) { + /* printf("IP address %d.%d.%d.%d\n", + htons(ans->ipaddr[0]) >> 8, + htons(ans->ipaddr[0]) & 0xff, + htons(ans->ipaddr[1]) >> 8, + htons(ans->ipaddr[1]) & 0xff);*/ + /* XXX: we should really check that this IP address is the one + we want. */ + namemapptr->ipaddr[0] = ans->ipaddr[0]; + namemapptr->ipaddr[1] = ans->ipaddr[1]; + + resolv_found(namemapptr->name, namemapptr->ipaddr); + return; + } else { + nameptr = nameptr + 10 + htons(ans->len); + } + --nanswers; + } + } + +} +/*---------------------------------------------------------------------------*/ +/** \internal + * The main UDP function. + */ +/*---------------------------------------------------------------------------*/ +void +resolv_appcall(void) +{ + if(uip_udp_conn->rport == HTONS(53)) { + if(uip_poll()) { + check_entries(); + } + if(uip_newdata()) { + newdata(); + } + } +} +/*---------------------------------------------------------------------------*/ +/** + * Queues a name so that a question for the name will be sent out. + * + * \param name The hostname that is to be queried. + */ +/*---------------------------------------------------------------------------*/ +void +resolv_query(char *name) +{ + static u8_t i; + static u8_t lseq, lseqi; + register struct namemap *nameptr; + + lseq = lseqi = 0; + + for(i = 0; i < RESOLV_ENTRIES; ++i) { + nameptr = &names[i]; + if(nameptr->state == STATE_UNUSED) { + break; + } + if(seqno - nameptr->seqno > lseq) { + lseq = seqno - nameptr->seqno; + lseqi = i; + } + } + + if(i == RESOLV_ENTRIES) { + i = lseqi; + nameptr = &names[i]; + } + + /* printf("Using entry %d\n", i);*/ + + strcpy(nameptr->name, name); + nameptr->state = STATE_NEW; + nameptr->seqno = seqno; + ++seqno; +} +/*---------------------------------------------------------------------------*/ +/** + * Look up a hostname in the array of known hostnames. + * + * \note This function only looks in the internal array of known + * hostnames, it does not send out a query for the hostname if none + * was found. The function resolv_query() can be used to send a query + * for a hostname. + * + * \return A pointer to a 4-byte representation of the hostname's IP + * address, or NULL if the hostname was not found in the array of + * hostnames. + */ +/*---------------------------------------------------------------------------*/ +u16_t * +resolv_lookup(char *name) +{ + static u8_t i; + struct namemap *nameptr; + + /* Walk through the list to see if the name is in there. If it is + not, we return NULL. */ + for(i = 0; i < RESOLV_ENTRIES; ++i) { + nameptr = &names[i]; + if(nameptr->state == STATE_DONE && + strcmp(name, nameptr->name) == 0) { + return nameptr->ipaddr; + } + } + return NULL; +} +/*---------------------------------------------------------------------------*/ +/** + * Obtain the currently configured DNS server. + * + * \return A pointer to a 4-byte representation of the IP address of + * the currently configured DNS server or NULL if no DNS server has + * been configured. + */ +/*---------------------------------------------------------------------------*/ +u16_t * +resolv_getserver(void) +{ + if(resolv_conn == NULL) { + return NULL; + } + return resolv_conn->ripaddr; +} +/*---------------------------------------------------------------------------*/ +/** + * Configure which DNS server to use for queries. + * + * \param dnsserver A pointer to a 4-byte representation of the IP + * address of the DNS server to be configured. + */ +/*---------------------------------------------------------------------------*/ +void +resolv_conf(u16_t *dnsserver) +{ + if(resolv_conn != NULL) { + uip_udp_remove(resolv_conn); + } + + resolv_conn = uip_udp_new(dnsserver, HTONS(53)); +} +/*---------------------------------------------------------------------------*/ +/** + * Initalize the resolver. + */ +/*---------------------------------------------------------------------------*/ +void +resolv_init(void) +{ + static u8_t i; + + for(i = 0; i < RESOLV_ENTRIES; ++i) { + names[i].state = STATE_DONE; + } + +} +/*---------------------------------------------------------------------------*/ + +/** @} */ +/** @} */ diff --git a/third_party/uip-1.0/apps/resolv/resolv.h b/third_party/uip-1.0/apps/resolv/resolv.h new file mode 100644 index 0000000..722c528 --- /dev/null +++ b/third_party/uip-1.0/apps/resolv/resolv.h @@ -0,0 +1,75 @@ +/** + * \addtogroup resolv + * @{ + */ +/** + * \file + * DNS resolver code header file. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2002-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: resolv.h,v 1.4 2006/06/11 21:46:37 adam Exp $ + * + */ +#ifndef __RESOLV_H__ +#define __RESOLV_H__ + +typedef int uip_udp_appstate_t; +void resolv_appcall(void); +#define UIP_UDP_APPCALL resolv_appcall + +#include "uipopt.h" + +/** + * Callback function which is called when a hostname is found. + * + * This function must be implemented by the module that uses the DNS + * resolver. It is called when a hostname is found, or when a hostname + * was not found. + * + * \param name A pointer to the name that was looked up. \param + * ipaddr A pointer to a 4-byte array containing the IP address of the + * hostname, or NULL if the hostname could not be found. + */ +void resolv_found(char *name, u16_t *ipaddr); + +/* Functions. */ +void resolv_conf(u16_t *dnsserver); +u16_t *resolv_getserver(void); +void resolv_init(void); +u16_t *resolv_lookup(char *name); +void resolv_query(char *name); + +#endif /* __RESOLV_H__ */ + +/** @} */ diff --git a/third_party/uip-1.0/apps/smtp/Makefile.smtp b/third_party/uip-1.0/apps/smtp/Makefile.smtp new file mode 100644 index 0000000..74223d4 --- /dev/null +++ b/third_party/uip-1.0/apps/smtp/Makefile.smtp @@ -0,0 +1 @@ +APP_SOURCES += smtp.c smtp-strings.c memb.c diff --git a/third_party/uip-1.0/apps/smtp/makestrings b/third_party/uip-1.0/apps/smtp/makestrings new file mode 100644 index 0000000..5e79758 --- /dev/null +++ b/third_party/uip-1.0/apps/smtp/makestrings @@ -0,0 +1,40 @@ +#!/usr/bin/perl + + +sub stringify { + my $name = shift(@_); + open(OUTPUTC, "> $name.c"); + open(OUTPUTH, "> $name.h"); + + open(FILE, "$name"); + + while() { + if(/(.+) "(.+)"/) { + $var = $1; + $data = $2; + + $datan = $data; + $datan =~ s/\\r/\r/g; + $datan =~ s/\\n/\n/g; + $datan =~ s/\\01/\01/g; + $datan =~ s/\\0/\0/g; + + printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1); + printf(OUTPUTC "/* \"$data\" */\n"); + printf(OUTPUTC "{"); + for($j = 0; $j < length($datan); $j++) { + printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1))); + } + printf(OUTPUTC "};\n"); + + printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1); + + } + } + close(OUTPUTC); + close(OUTPUTH); +} +stringify("smtp-strings"); + +exit 0; + diff --git a/third_party/uip-1.0/apps/smtp/smtp-strings b/third_party/uip-1.0/apps/smtp/smtp-strings new file mode 100644 index 0000000..5f9b72c --- /dev/null +++ b/third_party/uip-1.0/apps/smtp/smtp-strings @@ -0,0 +1,11 @@ +smtp_220 "220" +smtp_helo "HELO " +smtp_mail_from "MAIL FROM: " +smtp_rcpt_to "RCPT TO: " +smtp_data "DATA\r\n" +smtp_to "To: " +smtp_from "From: " +smtp_subject "Subject: " +smtp_quit "QUIT\r\n" +smtp_crnl "\r\n" +smtp_crnlperiodcrnl "\r\n.\r\n" \ No newline at end of file diff --git a/third_party/uip-1.0/apps/smtp/smtp-strings.c b/third_party/uip-1.0/apps/smtp/smtp-strings.c new file mode 100644 index 0000000..7c1190c --- /dev/null +++ b/third_party/uip-1.0/apps/smtp/smtp-strings.c @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2004, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: smtp-strings.c,v 1.3 2006/06/11 21:46:37 adam Exp $ + */ +const char smtp_220[4] = +/* "220" */ +{0x32, 0x32, 0x30, }; +const char smtp_helo[6] = +/* "HELO " */ +{0x48, 0x45, 0x4c, 0x4f, 0x20, }; +const char smtp_mail_from[12] = +/* "MAIL FROM: " */ +{0x4d, 0x41, 0x49, 0x4c, 0x20, 0x46, 0x52, 0x4f, 0x4d, 0x3a, 0x20, }; +const char smtp_rcpt_to[10] = +/* "RCPT TO: " */ +{0x52, 0x43, 0x50, 0x54, 0x20, 0x54, 0x4f, 0x3a, 0x20, }; +const char smtp_data[7] = +/* "DATA\r\n" */ +{0x44, 0x41, 0x54, 0x41, 0xd, 0xa, }; +const char smtp_to[5] = +/* "To: " */ +{0x54, 0x6f, 0x3a, 0x20, }; +const char smtp_cc[5] = +/* "Cc: " */ +{0x43, 0x63, 0x3a, 0x20, }; +const char smtp_from[7] = +/* "From: " */ +{0x46, 0x72, 0x6f, 0x6d, 0x3a, 0x20, }; +const char smtp_subject[10] = +/* "Subject: " */ +{0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x20, }; +const char smtp_quit[7] = +/* "QUIT\r\n" */ +{0x51, 0x55, 0x49, 0x54, 0xd, 0xa, }; +const char smtp_crnl[3] = +/* "\r\n" */ +{0xd, 0xa, }; +const char smtp_crnlperiodcrnl[6] = +/* "\r\n.\r\n" */ +{0xd, 0xa, 0x2e, 0xd, 0xa, }; diff --git a/third_party/uip-1.0/apps/smtp/smtp-strings.h b/third_party/uip-1.0/apps/smtp/smtp-strings.h new file mode 100644 index 0000000..800598c --- /dev/null +++ b/third_party/uip-1.0/apps/smtp/smtp-strings.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2004, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: smtp-strings.h,v 1.3 2006/06/11 21:46:37 adam Exp $ + */ +extern const char smtp_220[4]; +extern const char smtp_helo[6]; +extern const char smtp_mail_from[12]; +extern const char smtp_rcpt_to[10]; +extern const char smtp_data[7]; +extern const char smtp_to[5]; +extern const char smtp_cc[5]; +extern const char smtp_from[7]; +extern const char smtp_subject[10]; +extern const char smtp_quit[7]; +extern const char smtp_crnl[3]; +extern const char smtp_crnlperiodcrnl[6]; diff --git a/third_party/uip-1.0/apps/smtp/smtp.c b/third_party/uip-1.0/apps/smtp/smtp.c new file mode 100644 index 0000000..4ed1814 --- /dev/null +++ b/third_party/uip-1.0/apps/smtp/smtp.c @@ -0,0 +1,262 @@ +/** + * \addtogroup apps + * @{ + */ + +/** + * \defgroup smtp SMTP E-mail sender + * @{ + * + * The Simple Mail Transfer Protocol (SMTP) as defined by RFC821 is + * the standard way of sending and transfering e-mail on the + * Internet. This simple example implementation is intended as an + * example of how to implement protocols in uIP, and is able to send + * out e-mail but has not been extensively tested. + */ + +/** + * \file + * SMTP example implementation + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2004, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: smtp.c,v 1.4 2006/06/11 21:46:37 adam Exp $ + */ +#include "smtp.h" + +#include "smtp-strings.h" +#include "psock.h" +#include "uip.h" + +#include + +static struct smtp_state s; + +static char *localhostname; +static uip_ipaddr_t smtpserver; + +#define ISO_nl 0x0a +#define ISO_cr 0x0d + +#define ISO_period 0x2e + +#define ISO_2 0x32 +#define ISO_3 0x33 +#define ISO_4 0x34 +#define ISO_5 0x35 + + +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(smtp_thread(void)) +{ + PSOCK_BEGIN(&s.psock); + + PSOCK_READTO(&s.psock, ISO_nl); + + if(strncmp(s.inputbuffer, smtp_220, 3) != 0) { + PSOCK_CLOSE(&s.psock); + smtp_done(2); + PSOCK_EXIT(&s.psock); + } + + PSOCK_SEND_STR(&s.psock, (char *)smtp_helo); + PSOCK_SEND_STR(&s.psock, localhostname); + PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); + + PSOCK_READTO(&s.psock, ISO_nl); + + if(s.inputbuffer[0] != ISO_2) { + PSOCK_CLOSE(&s.psock); + smtp_done(3); + PSOCK_EXIT(&s.psock); + } + + PSOCK_SEND_STR(&s.psock, (char *)smtp_mail_from); + PSOCK_SEND_STR(&s.psock, s.from); + PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); + + PSOCK_READTO(&s.psock, ISO_nl); + + if(s.inputbuffer[0] != ISO_2) { + PSOCK_CLOSE(&s.psock); + smtp_done(4); + PSOCK_EXIT(&s.psock); + } + + PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to); + PSOCK_SEND_STR(&s.psock, s.to); + PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); + + PSOCK_READTO(&s.psock, ISO_nl); + + if(s.inputbuffer[0] != ISO_2) { + PSOCK_CLOSE(&s.psock); + smtp_done(5); + PSOCK_EXIT(&s.psock); + } + + if(s.cc != 0) { + PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to); + PSOCK_SEND_STR(&s.psock, s.cc); + PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); + + PSOCK_READTO(&s.psock, ISO_nl); + + if(s.inputbuffer[0] != ISO_2) { + PSOCK_CLOSE(&s.psock); + smtp_done(6); + PSOCK_EXIT(&s.psock); + } + } + + PSOCK_SEND_STR(&s.psock, (char *)smtp_data); + + PSOCK_READTO(&s.psock, ISO_nl); + + if(s.inputbuffer[0] != ISO_3) { + PSOCK_CLOSE(&s.psock); + smtp_done(7); + PSOCK_EXIT(&s.psock); + } + + PSOCK_SEND_STR(&s.psock, (char *)smtp_to); + PSOCK_SEND_STR(&s.psock, s.to); + PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); + + if(s.cc != 0) { + PSOCK_SEND_STR(&s.psock, (char *)smtp_cc); + PSOCK_SEND_STR(&s.psock, s.cc); + PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); + } + + PSOCK_SEND_STR(&s.psock, (char *)smtp_from); + PSOCK_SEND_STR(&s.psock, s.from); + PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); + + PSOCK_SEND_STR(&s.psock, (char *)smtp_subject); + PSOCK_SEND_STR(&s.psock, s.subject); + PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl); + + PSOCK_SEND(&s.psock, s.msg, s.msglen); + + PSOCK_SEND_STR(&s.psock, (char *)smtp_crnlperiodcrnl); + + PSOCK_READTO(&s.psock, ISO_nl); + if(s.inputbuffer[0] != ISO_2) { + PSOCK_CLOSE(&s.psock); + smtp_done(8); + PSOCK_EXIT(&s.psock); + } + + PSOCK_SEND_STR(&s.psock, (char *)smtp_quit); + smtp_done(SMTP_ERR_OK); + PSOCK_END(&s.psock); +} +/*---------------------------------------------------------------------------*/ +void +smtp_appcall(void) +{ + if(uip_closed()) { + s.connected = 0; + return; + } + if(uip_aborted() || uip_timedout()) { + s.connected = 0; + smtp_done(1); + return; + } + smtp_thread(); +} +/*---------------------------------------------------------------------------*/ +/** + * Specificy an SMTP server and hostname. + * + * This function is used to configure the SMTP module with an SMTP + * server and the hostname of the host. + * + * \param lhostname The hostname of the uIP host. + * + * \param server A pointer to a 4-byte array representing the IP + * address of the SMTP server to be configured. + */ +void +smtp_configure(char *lhostname, void *server) +{ + localhostname = lhostname; + uip_ipaddr_copy(smtpserver, server); +} +/*---------------------------------------------------------------------------*/ +/** + * Send an e-mail. + * + * \param to The e-mail address of the receiver of the e-mail. + * \param cc The e-mail address of the CC: receivers of the e-mail. + * \param from The e-mail address of the sender of the e-mail. + * \param subject The subject of the e-mail. + * \param msg The actual e-mail message. + * \param msglen The length of the e-mail message. + */ +unsigned char +smtp_send(char *to, char *cc, char *from, + char *subject, char *msg, u16_t msglen) +{ + struct uip_conn *conn; + + conn = uip_connect(smtpserver, HTONS(25)); + if(conn == NULL) { + return 0; + } + s.connected = 1; + s.to = to; + s.cc = cc; + s.from = from; + s.subject = subject; + s.msg = msg; + s.msglen = msglen; + + PSOCK_INIT(&s.psock, s.inputbuffer, sizeof(s.inputbuffer)); + + return 1; +} +/*---------------------------------------------------------------------------*/ +void +smtp_init(void) +{ + s.connected = 0; +} +/*---------------------------------------------------------------------------*/ +/** @} */ +/** @} */ diff --git a/third_party/uip-1.0/apps/smtp/smtp.h b/third_party/uip-1.0/apps/smtp/smtp.h new file mode 100644 index 0000000..5cd9258 --- /dev/null +++ b/third_party/uip-1.0/apps/smtp/smtp.h @@ -0,0 +1,103 @@ + +/** + * \addtogroup smtp + * @{ + */ + + +/** + * \file + * SMTP header file + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: smtp.h,v 1.4 2006/06/11 21:46:37 adam Exp $ + * + */ +#ifndef __SMTP_H__ +#define __SMTP_H__ + +#include "uipopt.h" + +/** + * Error number that signifies a non-error condition. + */ +#define SMTP_ERR_OK 0 + +/** + * Callback function that is called when an e-mail transmission is + * done. + * + * This function must be implemented by the module that uses the SMTP + * module. + * + * \param error The number of the error if an error occured, or + * SMTP_ERR_OK. + */ +void smtp_done(unsigned char error); + +void smtp_init(void); + +/* Functions. */ +void smtp_configure(char *localhostname, u16_t *smtpserver); +unsigned char smtp_send(char *to, char *from, + char *subject, char *msg, + u16_t msglen); +#define SMTP_SEND(to, cc, from, subject, msg) \ + smtp_send(to, cc, from, subject, msg, strlen(msg)) + +void smtp_appcall(void); + +struct smtp_state { + u8_t state; + char *to; + char *from; + char *subject; + char *msg; + u16_t msglen; + + u16_t sentlen, textlen; + u16_t sendptr; + +}; + + +#ifndef UIP_APPCALL +#define UIP_APPCALL smtp_appcall +#endif +typedef struct smtp_state uip_tcp_appstate_t; + + +#endif /* __SMTP_H__ */ + +/** @} */ diff --git a/third_party/uip-1.0/apps/telnetd/Makefile.telnetd b/third_party/uip-1.0/apps/telnetd/Makefile.telnetd new file mode 100644 index 0000000..46a8924 --- /dev/null +++ b/third_party/uip-1.0/apps/telnetd/Makefile.telnetd @@ -0,0 +1 @@ +APP_SOURCES += telnetd.c shell.c memb.c diff --git a/third_party/uip-1.0/apps/telnetd/shell.c b/third_party/uip-1.0/apps/telnetd/shell.c new file mode 100644 index 0000000..fbd18b7 --- /dev/null +++ b/third_party/uip-1.0/apps/telnetd/shell.c @@ -0,0 +1,123 @@ + /* + * Copyright (c) 2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: shell.c,v 1.1 2006/06/07 09:43:54 adam Exp $ + * + */ + +#include "shell.h" + +#include + +struct ptentry { + char *commandstr; + void (* pfunc)(char *str); +}; + +#define SHELL_PROMPT "uIP 1.0> " + +/*---------------------------------------------------------------------------*/ +static void +parse(register char *str, struct ptentry *t) +{ + struct ptentry *p; + for(p = t; p->commandstr != NULL; ++p) { + if(strncmp(p->commandstr, str, strlen(p->commandstr)) == 0) { + break; + } + } + + p->pfunc(str); +} +/*---------------------------------------------------------------------------*/ +static void +inttostr(register char *str, unsigned int i) +{ + str[0] = '0' + i / 100; + if(str[0] == '0') { + str[0] = ' '; + } + str[1] = '0' + (i / 10) % 10; + if(str[0] == ' ' && str[1] == '0') { + str[1] = ' '; + } + str[2] = '0' + i % 10; + str[3] = ' '; + str[4] = 0; +} +/*---------------------------------------------------------------------------*/ +static void +help(char *str) +{ + shell_output("Available commands:", ""); + shell_output("stats - show network statistics", ""); + shell_output("conn - show TCP connections", ""); + shell_output("help, ? - show help", ""); + shell_output("exit - exit shell", ""); +} +/*---------------------------------------------------------------------------*/ +static void +unknown(char *str) +{ + if(strlen(str) > 0) { + shell_output("Unknown command: ", str); + } +} +/*---------------------------------------------------------------------------*/ +static struct ptentry parsetab[] = + {{"stats", help}, + {"conn", help}, + {"help", help}, + {"exit", shell_quit}, + {"?", help}, + + /* Default action */ + {NULL, unknown}}; +/*---------------------------------------------------------------------------*/ +void +shell_init(void) +{ +} +/*---------------------------------------------------------------------------*/ +void +shell_start(void) +{ + shell_output("uIP command shell", ""); + shell_output("Type '?' and return for help", ""); + shell_prompt(SHELL_PROMPT); +} +/*---------------------------------------------------------------------------*/ +void +shell_input(char *cmd) +{ + parse(cmd, parsetab); + shell_prompt(SHELL_PROMPT); +} +/*---------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/apps/telnetd/shell.h b/third_party/uip-1.0/apps/telnetd/shell.h new file mode 100644 index 0000000..0928fa3 --- /dev/null +++ b/third_party/uip-1.0/apps/telnetd/shell.h @@ -0,0 +1,104 @@ +/** + * \file + * Interface for the Contiki shell. + * \author Adam Dunkels + * + * Some of the functions declared in this file must be implemented as + * a shell back-end in the architecture specific files of a Contiki + * port. + */ + + +/* + * Copyright (c) 2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the Contiki desktop OS. + * + * $Id: shell.h,v 1.1 2006/06/07 09:43:54 adam Exp $ + * + */ +#ifndef __SHELL_H__ +#define __SHELL_H__ + +/** + * Initialize the shell. + * + * Called when the shell front-end process starts. This function may + * be used to start listening for signals. + */ +void shell_init(void); + +/** + * Start the shell back-end. + * + * Called by the front-end when a new shell is started. + */ +void shell_start(void); + +/** + * Process a shell command. + * + * This function will be called by the shell GUI / telnet server whan + * a command has been entered that should be processed by the shell + * back-end. + * + * \param command The command to be processed. + */ +void shell_input(char *command); + +/** + * Quit the shell. + * + */ +void shell_quit(char *); + + +/** + * Print a string to the shell window. + * + * This function is implemented by the shell GUI / telnet server and + * can be called by the shell back-end to output a string in the + * shell window. The string is automatically appended with a linebreak. + * + * \param str1 The first half of the string to be output. + * \param str2 The second half of the string to be output. + */ +void shell_output(char *str1, char *str2); + +/** + * Print a prompt to the shell window. + * + * This function can be used by the shell back-end to print out a + * prompt to the shell window. + * + * \param prompt The prompt to be printed. + * + */ +void shell_prompt(char *prompt); + +#endif /* __SHELL_H__ */ diff --git a/third_party/uip-1.0/apps/telnetd/telnetd.c b/third_party/uip-1.0/apps/telnetd/telnetd.c new file mode 100644 index 0000000..e8e7ba9 --- /dev/null +++ b/third_party/uip-1.0/apps/telnetd/telnetd.c @@ -0,0 +1,350 @@ +/* + * Copyright (c) 2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: telnetd.c,v 1.2 2006/06/07 09:43:54 adam Exp $ + * + */ + +#include "uip.h" +#include "telnetd.h" +#include "memb.h" +#include "shell.h" + +#include + +#define ISO_nl 0x0a +#define ISO_cr 0x0d + +struct telnetd_line { + char line[TELNETD_CONF_LINELEN]; +}; +MEMB(linemem, struct telnetd_line, TELNETD_CONF_NUMLINES); + +#define STATE_NORMAL 0 +#define STATE_IAC 1 +#define STATE_WILL 2 +#define STATE_WONT 3 +#define STATE_DO 4 +#define STATE_DONT 5 +#define STATE_CLOSE 6 + +static struct telnetd_state s; + +#define TELNET_IAC 255 +#define TELNET_WILL 251 +#define TELNET_WONT 252 +#define TELNET_DO 253 +#define TELNET_DONT 254 +/*---------------------------------------------------------------------------*/ +static char * +alloc_line(void) +{ + return memb_alloc(&linemem); +} +/*---------------------------------------------------------------------------*/ +static void +dealloc_line(char *line) +{ + memb_free(&linemem, line); +} +/*---------------------------------------------------------------------------*/ +void +shell_quit(char *str) +{ + s.state = STATE_CLOSE; +} +/*---------------------------------------------------------------------------*/ +static void +sendline(char *line) +{ + static unsigned int i; + + for(i = 0; i < TELNETD_CONF_NUMLINES; ++i) { + if(s.lines[i] == NULL) { + s.lines[i] = line; + break; + } + } + if(i == TELNETD_CONF_NUMLINES) { + dealloc_line(line); + } +} +/*---------------------------------------------------------------------------*/ +void +shell_prompt(char *str) +{ + char *line; + line = alloc_line(); + if(line != NULL) { + strncpy(line, str, TELNETD_CONF_LINELEN); + /* petsciiconv_toascii(line, TELNETD_CONF_LINELEN);*/ + sendline(line); + } +} +/*---------------------------------------------------------------------------*/ +void +shell_output(char *str1, char *str2) +{ + static unsigned len; + char *line; + + line = alloc_line(); + if(line != NULL) { + len = strlen(str1); + strncpy(line, str1, TELNETD_CONF_LINELEN); + if(len < TELNETD_CONF_LINELEN) { + strncpy(line + len, str2, TELNETD_CONF_LINELEN - len); + } + len = strlen(line); + if(len < TELNETD_CONF_LINELEN - 2) { + line[len] = ISO_cr; + line[len+1] = ISO_nl; + line[len+2] = 0; + } + /* petsciiconv_toascii(line, TELNETD_CONF_LINELEN);*/ + sendline(line); + } +} +/*---------------------------------------------------------------------------*/ +void +telnetd_init(void) +{ + uip_listen(HTONS(23)); + memb_init(&linemem); + shell_init(); +} +/*---------------------------------------------------------------------------*/ +static void +acked(void) +{ + static unsigned int i; + + while(s.numsent > 0) { + dealloc_line(s.lines[0]); + for(i = 1; i < TELNETD_CONF_NUMLINES; ++i) { + s.lines[i - 1] = s.lines[i]; + } + s.lines[TELNETD_CONF_NUMLINES - 1] = NULL; + --s.numsent; + } +} +/*---------------------------------------------------------------------------*/ +static void +senddata(void) +{ + static char *bufptr, *lineptr; + static int buflen, linelen; + + bufptr = uip_appdata; + buflen = 0; + for(s.numsent = 0; s.numsent < TELNETD_CONF_NUMLINES && + s.lines[s.numsent] != NULL ; ++s.numsent) { + lineptr = s.lines[s.numsent]; + linelen = strlen(lineptr); + if(linelen > TELNETD_CONF_LINELEN) { + linelen = TELNETD_CONF_LINELEN; + } + if(buflen + linelen < uip_mss()) { + memcpy(bufptr, lineptr, linelen); + bufptr += linelen; + buflen += linelen; + } else { + break; + } + } + uip_send(uip_appdata, buflen); +} +/*---------------------------------------------------------------------------*/ +static void +closed(void) +{ + static unsigned int i; + + for(i = 0; i < TELNETD_CONF_NUMLINES; ++i) { + if(s.lines[i] != NULL) { + dealloc_line(s.lines[i]); + } + } +} +/*---------------------------------------------------------------------------*/ +static void +get_char(u8_t c) +{ + if(c == ISO_cr) { + return; + } + + s.buf[(int)s.bufptr] = c; + if(s.buf[(int)s.bufptr] == ISO_nl || + s.bufptr == sizeof(s.buf) - 1) { + if(s.bufptr > 0) { + s.buf[(int)s.bufptr] = 0; + /* petsciiconv_topetscii(s.buf, TELNETD_CONF_LINELEN);*/ + } + shell_input(s.buf); + s.bufptr = 0; + } else { + ++s.bufptr; + } +} +/*---------------------------------------------------------------------------*/ +static void +sendopt(u8_t option, u8_t value) +{ + char *line; + line = alloc_line(); + if(line != NULL) { + line[0] = TELNET_IAC; + line[1] = option; + line[2] = value; + line[3] = 0; + sendline(line); + } +} +/*---------------------------------------------------------------------------*/ +static void +newdata(void) +{ + u16_t len; + u8_t c; + char *dataptr; + + + len = uip_datalen(); + dataptr = (char *)uip_appdata; + + while(len > 0 && s.bufptr < sizeof(s.buf)) { + c = *dataptr; + ++dataptr; + --len; + switch(s.state) { + case STATE_IAC: + if(c == TELNET_IAC) { + get_char(c); + s.state = STATE_NORMAL; + } else { + switch(c) { + case TELNET_WILL: + s.state = STATE_WILL; + break; + case TELNET_WONT: + s.state = STATE_WONT; + break; + case TELNET_DO: + s.state = STATE_DO; + break; + case TELNET_DONT: + s.state = STATE_DONT; + break; + default: + s.state = STATE_NORMAL; + break; + } + } + break; + case STATE_WILL: + /* Reply with a DONT */ + sendopt(TELNET_DONT, c); + s.state = STATE_NORMAL; + break; + + case STATE_WONT: + /* Reply with a DONT */ + sendopt(TELNET_DONT, c); + s.state = STATE_NORMAL; + break; + case STATE_DO: + /* Reply with a WONT */ + sendopt(TELNET_WONT, c); + s.state = STATE_NORMAL; + break; + case STATE_DONT: + /* Reply with a WONT */ + sendopt(TELNET_WONT, c); + s.state = STATE_NORMAL; + break; + case STATE_NORMAL: + if(c == TELNET_IAC) { + s.state = STATE_IAC; + } else { + get_char(c); + } + break; + } + + + } + +} +/*---------------------------------------------------------------------------*/ +void +telnetd_appcall(void) +{ + static unsigned int i; + if(uip_connected()) { + /* tcp_markconn(uip_conn, &s);*/ + for(i = 0; i < TELNETD_CONF_NUMLINES; ++i) { + s.lines[i] = NULL; + } + s.bufptr = 0; + s.state = STATE_NORMAL; + + shell_start(); + } + + if(s.state == STATE_CLOSE) { + s.state = STATE_NORMAL; + uip_close(); + return; + } + + if(uip_closed() || + uip_aborted() || + uip_timedout()) { + closed(); + } + + if(uip_acked()) { + acked(); + } + + if(uip_newdata()) { + newdata(); + } + + if(uip_rexmit() || + uip_newdata() || + uip_acked() || + uip_connected() || + uip_poll()) { + senddata(); + } +} +/*---------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/apps/telnetd/telnetd.h b/third_party/uip-1.0/apps/telnetd/telnetd.h new file mode 100644 index 0000000..17a5161 --- /dev/null +++ b/third_party/uip-1.0/apps/telnetd/telnetd.h @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: telnetd.h,v 1.2 2006/06/07 09:43:54 adam Exp $ + * + */ +#ifndef __TELNETD_H__ +#define __TELNETD_H__ + +#include "uipopt.h" + +void telnetd_appcall(void); + +#ifndef TELNETD_CONF_LINELEN +#define TELNETD_CONF_LINELEN 40 +#endif +#ifndef TELNETD_CONF_NUMLINES +#define TELNETD_CONF_NUMLINES 16 +#endif + +struct telnetd_state { + char *lines[TELNETD_CONF_NUMLINES]; + char buf[TELNETD_CONF_LINELEN]; + char bufptr; + u8_t numsent; + u8_t state; +}; + +typedef struct telnetd_state uip_tcp_appstate_t; + +#ifndef UIP_APPCALL +#define UIP_APPCALL telnetd_appcall +#endif + +#endif /* __TELNETD_H__ */ diff --git a/third_party/uip-1.0/apps/webclient/Makefile.webclient b/third_party/uip-1.0/apps/webclient/Makefile.webclient new file mode 100644 index 0000000..a494f8f --- /dev/null +++ b/third_party/uip-1.0/apps/webclient/Makefile.webclient @@ -0,0 +1 @@ +APP_SOURCES += webclient-strings.c webclient.c diff --git a/third_party/uip-1.0/apps/webclient/makestrings b/third_party/uip-1.0/apps/webclient/makestrings new file mode 100644 index 0000000..a87735c --- /dev/null +++ b/third_party/uip-1.0/apps/webclient/makestrings @@ -0,0 +1,40 @@ +#!/usr/bin/perl + + +sub stringify { + my $name = shift(@_); + open(OUTPUTC, "> $name.c"); + open(OUTPUTH, "> $name.h"); + + open(FILE, "$name"); + + while() { + if(/(.+) "(.+)"/) { + $var = $1; + $data = $2; + + $datan = $data; + $datan =~ s/\\r/\r/g; + $datan =~ s/\\n/\n/g; + $datan =~ s/\\01/\01/g; + $datan =~ s/\\0/\0/g; + + printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1); + printf(OUTPUTC "/* \"$data\" */\n"); + printf(OUTPUTC "{"); + for($j = 0; $j < length($datan); $j++) { + printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1))); + } + printf(OUTPUTC "0 };\n"); + + printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1); + + } + } + close(OUTPUTC); + close(OUTPUTH); +} +stringify("webclient-strings"); + +exit 0; + diff --git a/third_party/uip-1.0/apps/webclient/webclient-strings b/third_party/uip-1.0/apps/webclient/webclient-strings new file mode 100644 index 0000000..8fe6e62 --- /dev/null +++ b/third_party/uip-1.0/apps/webclient/webclient-strings @@ -0,0 +1,31 @@ +http_http "http://" +http_200 "200 " +http_301 "301 " +http_302 "302 " +http_get "GET " +http_10 "HTTP/1.0" +http_11 "HTTP/1.1" +http_content_type "content-type: " +http_texthtml "text/html" +http_location "location: " +http_host "host: " +http_crnl "\r\n" +http_index_html "/index.html" +http_404_html "/404.html" +http_content_type_html "Content-type: text/html\r\n\r\n" +http_content_type_css "Content-type: text/css\r\n\r\n" +http_content_type_text "Content-type: text/text\r\n\r\n" +http_content_type_png "Content-type: image/png\r\n\r\n" +http_content_type_gif "Content-type: image/gif\r\n\r\n" +http_content_type_jpg "Content-type: image/jpeg\r\n\r\n" +http_content_type_binary "Content-type: application/octet-stream\r\n\r\n" +http_html ".html" +http_shtml ".shtml" +http_htm ".htm" +http_css ".css" +http_png ".png" +http_gif ".gif" +http_jpg ".jpg" +http_text ".text" +http_txt ".txt" +http_user_agent_fields "Connection: close\r\nUser-Agent: uIP/1.0 (; http://www.sics.se/~adam/uip/)\r\n\r\n" diff --git a/third_party/uip-1.0/apps/webclient/webclient-strings.c b/third_party/uip-1.0/apps/webclient/webclient-strings.c new file mode 100644 index 0000000..66e7795 --- /dev/null +++ b/third_party/uip-1.0/apps/webclient/webclient-strings.c @@ -0,0 +1,93 @@ +const char http_http[8] = +/* "http://" */ +{0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0 }; +const char http_200[5] = +/* "200 " */ +{0x32, 0x30, 0x30, 0x20, 0 }; +const char http_301[5] = +/* "301 " */ +{0x33, 0x30, 0x31, 0x20, 0 }; +const char http_302[5] = +/* "302 " */ +{0x33, 0x30, 0x32, 0x20, 0 }; +const char http_get[5] = +/* "GET " */ +{0x47, 0x45, 0x54, 0x20, 0 }; +const char http_10[9] = +/* "HTTP/1.0" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0 }; +const char http_11[9] = +/* "HTTP/1.1" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0 }; +const char http_content_type[15] = +/* "content-type: " */ +{0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0 }; +const char http_texthtml[10] = +/* "text/html" */ +{0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0 }; +const char http_location[11] = +/* "location: " */ +{0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0 }; +const char http_host[7] = +/* "host: " */ +{0x68, 0x6f, 0x73, 0x74, 0x3a, 0x20, 0 }; +const char http_crnl[3] = +/* "\r\n" */ +{0xd, 0xa, 0 }; +const char http_index_html[12] = +/* "/index.html" */ +{0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0 }; +const char http_404_html[10] = +/* "/404.html" */ +{0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0 }; +const char http_content_type_html[28] = +/* "Content-type: text/html\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd, 0xa, 0 }; +const char http_content_type_css [27] = +/* "Content-type: text/css\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0xd, 0xa, 0xd, 0xa, 0 }; +const char http_content_type_text[28] = +/* "Content-type: text/text\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x78, 0x74, 0xd, 0xa, 0xd, 0xa, 0 }; +const char http_content_type_png [28] = +/* "Content-type: image/png\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0xd, 0xa, 0xd, 0xa, 0 }; +const char http_content_type_gif [28] = +/* "Content-type: image/gif\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0xd, 0xa, 0xd, 0xa, 0 }; +const char http_content_type_jpg [29] = +/* "Content-type: image/jpeg\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x65, 0x67, 0xd, 0xa, 0xd, 0xa, 0 }; +const char http_content_type_binary[43] = +/* "Content-type: application/octet-stream\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0xd, 0xa, 0 }; +const char http_html[6] = +/* ".html" */ +{0x2e, 0x68, 0x74, 0x6d, 0x6c, 0 }; +const char http_shtml[7] = +/* ".shtml" */ +{0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0 }; +const char http_htm[5] = +/* ".htm" */ +{0x2e, 0x68, 0x74, 0x6d, 0 }; +const char http_css[5] = +/* ".css" */ +{0x2e, 0x63, 0x73, 0x73, 0 }; +const char http_png[5] = +/* ".png" */ +{0x2e, 0x70, 0x6e, 0x67, 0 }; +const char http_gif[5] = +/* ".gif" */ +{0x2e, 0x67, 0x69, 0x66, 0 }; +const char http_jpg[5] = +/* ".jpg" */ +{0x2e, 0x6a, 0x70, 0x67, 0 }; +const char http_text[6] = +/* ".text" */ +{0x2e, 0x74, 0x65, 0x78, 0x74, 0 }; +const char http_txt[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, 0 }; +const char http_user_agent_fields[77] = +/* "Connection: close\r\nUser-Agent: uIP/1.0 (; http://www.sics.se/~adam/uip/)\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x28, 0x3b, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0x29, 0xd, 0xa, 0xd, 0xa, 0 }; diff --git a/third_party/uip-1.0/apps/webclient/webclient-strings.h b/third_party/uip-1.0/apps/webclient/webclient-strings.h new file mode 100644 index 0000000..b4ce510 --- /dev/null +++ b/third_party/uip-1.0/apps/webclient/webclient-strings.h @@ -0,0 +1,31 @@ +extern const char http_http[8]; +extern const char http_200[5]; +extern const char http_301[5]; +extern const char http_302[5]; +extern const char http_get[5]; +extern const char http_10[9]; +extern const char http_11[9]; +extern const char http_content_type[15]; +extern const char http_texthtml[10]; +extern const char http_location[11]; +extern const char http_host[7]; +extern const char http_crnl[3]; +extern const char http_index_html[12]; +extern const char http_404_html[10]; +extern const char http_content_type_html[28]; +extern const char http_content_type_css [27]; +extern const char http_content_type_text[28]; +extern const char http_content_type_png [28]; +extern const char http_content_type_gif [28]; +extern const char http_content_type_jpg [29]; +extern const char http_content_type_binary[43]; +extern const char http_html[6]; +extern const char http_shtml[7]; +extern const char http_htm[5]; +extern const char http_css[5]; +extern const char http_png[5]; +extern const char http_gif[5]; +extern const char http_jpg[5]; +extern const char http_text[6]; +extern const char http_txt[5]; +extern const char http_user_agent_fields[77]; diff --git a/third_party/uip-1.0/apps/webclient/webclient.c b/third_party/uip-1.0/apps/webclient/webclient.c new file mode 100644 index 0000000..b6238f4 --- /dev/null +++ b/third_party/uip-1.0/apps/webclient/webclient.c @@ -0,0 +1,439 @@ +/** + * \addtogroup apps + * @{ + */ + +/** + * \defgroup webclient Web client + * @{ + * + * This example shows a HTTP client that is able to download web pages + * and files from web servers. It requires a number of callback + * functions to be implemented by the module that utilizes the code: + * webclient_datahandler(), webclient_connected(), + * webclient_timedout(), webclient_aborted(), webclient_closed(). + */ + +/** + * \file + * Implementation of the HTTP client. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: webclient.c,v 1.2 2006/06/11 21:46:37 adam Exp $ + * + */ + +#include "uip.h" +#include "uiplib.h" +#include "webclient.h" +#include "resolv.h" + +#include + +#define WEBCLIENT_TIMEOUT 100 + +#define WEBCLIENT_STATE_STATUSLINE 0 +#define WEBCLIENT_STATE_HEADERS 1 +#define WEBCLIENT_STATE_DATA 2 +#define WEBCLIENT_STATE_CLOSE 3 + +#define HTTPFLAG_NONE 0 +#define HTTPFLAG_OK 1 +#define HTTPFLAG_MOVED 2 +#define HTTPFLAG_ERROR 3 + + +#define ISO_nl 0x0a +#define ISO_cr 0x0d +#define ISO_space 0x20 + + +static struct webclient_state s; + +/*-----------------------------------------------------------------------------------*/ +char * +webclient_mimetype(void) +{ + return s.mimetype; +} +/*-----------------------------------------------------------------------------------*/ +char * +webclient_filename(void) +{ + return s.file; +} +/*-----------------------------------------------------------------------------------*/ +char * +webclient_hostname(void) +{ + return s.host; +} +/*-----------------------------------------------------------------------------------*/ +unsigned short +webclient_port(void) +{ + return s.port; +} +/*-----------------------------------------------------------------------------------*/ +void +webclient_init(void) +{ + +} +/*-----------------------------------------------------------------------------------*/ +static void +init_connection(void) +{ + s.state = WEBCLIENT_STATE_STATUSLINE; + + s.getrequestleft = sizeof(http_get) - 1 + 1 + + sizeof(http_10) - 1 + + sizeof(http_crnl) - 1 + + sizeof(http_host) - 1 + + sizeof(http_crnl) - 1 + + strlen(http_user_agent_fields) + + strlen(s.file) + strlen(s.host); + s.getrequestptr = 0; + + s.httpheaderlineptr = 0; +} +/*-----------------------------------------------------------------------------------*/ +void +webclient_close(void) +{ + s.state = WEBCLIENT_STATE_CLOSE; +} +/*-----------------------------------------------------------------------------------*/ +unsigned char +webclient_get(char *host, u16_t port, char *file) +{ + struct uip_conn *conn; + uip_ipaddr_t *ipaddr; + static uip_ipaddr_t addr; + + /* First check if the host is an IP address. */ + ipaddr = &addr; + if(uiplib_ipaddrconv(host, (unsigned char *)addr) == 0) { + ipaddr = (uip_ipaddr_t *)resolv_lookup(host); + + if(ipaddr == NULL) { + return 0; + } + } + + conn = uip_connect(ipaddr, htons(port)); + + if(conn == NULL) { + return 0; + } + + s.port = port; + strncpy(s.file, file, sizeof(s.file)); + strncpy(s.host, host, sizeof(s.host)); + + init_connection(); + return 1; +} +/*-----------------------------------------------------------------------------------*/ +static unsigned char * +copy_string(unsigned char *dest, + const unsigned char *src, unsigned char len) +{ + strncpy(dest, src, len); + return dest + len; +} +/*-----------------------------------------------------------------------------------*/ +static void +senddata(void) +{ + u16_t len; + char *getrequest; + char *cptr; + + if(s.getrequestleft > 0) { + cptr = getrequest = (char *)uip_appdata; + + cptr = copy_string(cptr, http_get, sizeof(http_get) - 1); + cptr = copy_string(cptr, s.file, strlen(s.file)); + *cptr++ = ISO_space; + cptr = copy_string(cptr, http_10, sizeof(http_10) - 1); + + cptr = copy_string(cptr, http_crnl, sizeof(http_crnl) - 1); + + cptr = copy_string(cptr, http_host, sizeof(http_host) - 1); + cptr = copy_string(cptr, s.host, strlen(s.host)); + cptr = copy_string(cptr, http_crnl, sizeof(http_crnl) - 1); + + cptr = copy_string(cptr, http_user_agent_fields, + strlen(http_user_agent_fields)); + + len = s.getrequestleft > uip_mss()? + uip_mss(): + s.getrequestleft; + uip_send(&(getrequest[s.getrequestptr]), len); + } +} +/*-----------------------------------------------------------------------------------*/ +static void +acked(void) +{ + u16_t len; + + if(s.getrequestleft > 0) { + len = s.getrequestleft > uip_mss()? + uip_mss(): + s.getrequestleft; + s.getrequestleft -= len; + s.getrequestptr += len; + } +} +/*-----------------------------------------------------------------------------------*/ +static u16_t +parse_statusline(u16_t len) +{ + char *cptr; + + while(len > 0 && s.httpheaderlineptr < sizeof(s.httpheaderline)) { + s.httpheaderline[s.httpheaderlineptr] = *(char *)uip_appdata; + ++((char *)uip_appdata); + --len; + if(s.httpheaderline[s.httpheaderlineptr] == ISO_nl) { + + if((strncmp(s.httpheaderline, http_10, + sizeof(http_10) - 1) == 0) || + (strncmp(s.httpheaderline, http_11, + sizeof(http_11) - 1) == 0)) { + cptr = &(s.httpheaderline[9]); + s.httpflag = HTTPFLAG_NONE; + if(strncmp(cptr, http_200, sizeof(http_200) - 1) == 0) { + /* 200 OK */ + s.httpflag = HTTPFLAG_OK; + } else if(strncmp(cptr, http_301, sizeof(http_301) - 1) == 0 || + strncmp(cptr, http_302, sizeof(http_302) - 1) == 0) { + /* 301 Moved permanently or 302 Found. Location: header line + will contain thw new location. */ + s.httpflag = HTTPFLAG_MOVED; + } else { + s.httpheaderline[s.httpheaderlineptr - 1] = 0; + } + } else { + uip_abort(); + webclient_aborted(); + return 0; + } + + /* We're done parsing the status line, so we reset the pointer + and start parsing the HTTP headers.*/ + s.httpheaderlineptr = 0; + s.state = WEBCLIENT_STATE_HEADERS; + break; + } else { + ++s.httpheaderlineptr; + } + } + return len; +} +/*-----------------------------------------------------------------------------------*/ +static char +casecmp(char *str1, const char *str2, char len) +{ + static char c; + + while(len > 0) { + c = *str1; + /* Force lower-case characters. */ + if(c & 0x40) { + c |= 0x20; + } + if(*str2 != c) { + return 1; + } + ++str1; + ++str2; + --len; + } + return 0; +} +/*-----------------------------------------------------------------------------------*/ +static u16_t +parse_headers(u16_t len) +{ + char *cptr; + static unsigned char i; + + while(len > 0 && s.httpheaderlineptr < sizeof(s.httpheaderline)) { + s.httpheaderline[s.httpheaderlineptr] = *(char *)uip_appdata; + ++((char *)uip_appdata); + --len; + if(s.httpheaderline[s.httpheaderlineptr] == ISO_nl) { + /* We have an entire HTTP header line in s.httpheaderline, so + we parse it. */ + if(s.httpheaderline[0] == ISO_cr) { + /* This was the last header line (i.e., and empty "\r\n"), so + we are done with the headers and proceed with the actual + data. */ + s.state = WEBCLIENT_STATE_DATA; + return len; + } + + s.httpheaderline[s.httpheaderlineptr - 1] = 0; + /* Check for specific HTTP header fields. */ + if(casecmp(s.httpheaderline, http_content_type, + sizeof(http_content_type) - 1) == 0) { + /* Found Content-type field. */ + cptr = strchr(s.httpheaderline, ';'); + if(cptr != NULL) { + *cptr = 0; + } + strncpy(s.mimetype, s.httpheaderline + + sizeof(http_content_type) - 1, sizeof(s.mimetype)); + } else if(casecmp(s.httpheaderline, http_location, + sizeof(http_location) - 1) == 0) { + cptr = s.httpheaderline + + sizeof(http_location) - 1; + + if(strncmp(cptr, http_http, 7) == 0) { + cptr += 7; + for(i = 0; i < s.httpheaderlineptr - 7; ++i) { + if(*cptr == 0 || + *cptr == '/' || + *cptr == ' ' || + *cptr == ':') { + s.host[i] = 0; + break; + } + s.host[i] = *cptr; + ++cptr; + } + } + strncpy(s.file, cptr, sizeof(s.file)); + /* s.file[s.httpheaderlineptr - i] = 0;*/ + } + + + /* We're done parsing, so we reset the pointer and start the + next line. */ + s.httpheaderlineptr = 0; + } else { + ++s.httpheaderlineptr; + } + } + return len; +} +/*-----------------------------------------------------------------------------------*/ +static void +newdata(void) +{ + u16_t len; + + len = uip_datalen(); + + if(s.state == WEBCLIENT_STATE_STATUSLINE) { + len = parse_statusline(len); + } + + if(s.state == WEBCLIENT_STATE_HEADERS && len > 0) { + len = parse_headers(len); + } + + if(len > 0 && s.state == WEBCLIENT_STATE_DATA && + s.httpflag != HTTPFLAG_MOVED) { + webclient_datahandler((char *)uip_appdata, len); + } +} +/*-----------------------------------------------------------------------------------*/ +void +webclient_appcall(void) +{ + if(uip_connected()) { + s.timer = 0; + s.state = WEBCLIENT_STATE_STATUSLINE; + senddata(); + webclient_connected(); + return; + } + + if(s.state == WEBCLIENT_STATE_CLOSE) { + webclient_closed(); + uip_abort(); + return; + } + + if(uip_aborted()) { + webclient_aborted(); + } + if(uip_timedout()) { + webclient_timedout(); + } + + + if(uip_acked()) { + s.timer = 0; + acked(); + } + if(uip_newdata()) { + s.timer = 0; + newdata(); + } + if(uip_rexmit() || + uip_newdata() || + uip_acked()) { + senddata(); + } else if(uip_poll()) { + ++s.timer; + if(s.timer == WEBCLIENT_TIMEOUT) { + webclient_timedout(); + uip_abort(); + return; + } + /* senddata();*/ + } + + if(uip_closed()) { + if(s.httpflag != HTTPFLAG_MOVED) { + /* Send NULL data to signal EOF. */ + webclient_datahandler(NULL, 0); + } else { + if(resolv_lookup(s.host) == NULL) { + resolv_query(s.host); + } + webclient_get(s.host, s.port, s.file); + } + } +} +/*-----------------------------------------------------------------------------------*/ + +/** @} */ +/** @} */ diff --git a/third_party/uip-1.0/apps/webclient/webclient.h b/third_party/uip-1.0/apps/webclient/webclient.h new file mode 100644 index 0000000..af0e9d9 --- /dev/null +++ b/third_party/uip-1.0/apps/webclient/webclient.h @@ -0,0 +1,228 @@ +/** + * \addtogroup webclient + * @{ + */ + +/** + * \file + * Header file for the HTTP client. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: webclient.h,v 1.2 2006/06/11 21:46:37 adam Exp $ + * + */ +#ifndef __WEBCLIENT_H__ +#define __WEBCLIENT_H__ + + +#include "webclient-strings.h" +#include "uipopt.h" + +#define WEBCLIENT_CONF_MAX_URLLEN 100 + +struct webclient_state { + u8_t timer; + u8_t state; + u8_t httpflag; + + u16_t port; + char host[40]; + char file[WEBCLIENT_CONF_MAX_URLLEN]; + u16_t getrequestptr; + u16_t getrequestleft; + + char httpheaderline[200]; + u16_t httpheaderlineptr; + + char mimetype[32]; +}; + +typedef struct webclient_state uip_tcp_appstate_t; +#define UIP_APPCALL webclient_appcall + +/** + * Callback function that is called from the webclient code when HTTP + * data has been received. + * + * This function must be implemented by the module that uses the + * webclient code. The function is called from the webclient module + * when HTTP data has been received. The function is not called when + * HTTP headers are received, only for the actual data. + * + * \note This function is called many times, repetedly, when data is + * being received, and not once when all data has been received. + * + * \param data A pointer to the data that has been received. + * \param len The length of the data that has been received. + */ +void webclient_datahandler(char *data, u16_t len); + +/** + * Callback function that is called from the webclient code when the + * HTTP connection has been connected to the web server. + * + * This function must be implemented by the module that uses the + * webclient code. + */ +void webclient_connected(void); + +/** + * Callback function that is called from the webclient code if the + * HTTP connection to the web server has timed out. + * + * This function must be implemented by the module that uses the + * webclient code. + */ +void webclient_timedout(void); + +/** + * Callback function that is called from the webclient code if the + * HTTP connection to the web server has been aborted by the web + * server. + * + * This function must be implemented by the module that uses the + * webclient code. + */ +void webclient_aborted(void); + +/** + * Callback function that is called from the webclient code when the + * HTTP connection to the web server has been closed. + * + * This function must be implemented by the module that uses the + * webclient code. + */ +void webclient_closed(void); + + + +/** + * Initialize the webclient module. + */ +void webclient_init(void); + +/** + * Open an HTTP connection to a web server and ask for a file using + * the GET method. + * + * This function opens an HTTP connection to the specified web server + * and requests the specified file using the GET method. When the HTTP + * connection has been connected, the webclient_connected() callback + * function is called and when the HTTP data arrives the + * webclient_datahandler() callback function is called. + * + * The callback function webclient_timedout() is called if the web + * server could not be contacted, and the webclient_aborted() callback + * function is called if the HTTP connection is aborted by the web + * server. + * + * When the HTTP request has been completed and the HTTP connection is + * closed, the webclient_closed() callback function will be called. + * + * \note If the function is passed a host name, it must already be in + * the resolver cache in order for the function to connect to the web + * server. It is therefore up to the calling module to implement the + * resolver calls and the signal handler used for reporting a resolv + * query answer. + * + * \param host A pointer to a string containing either a host name or + * a numerical IP address in dotted decimal notation (e.g., 192.168.23.1). + * + * \param port The port number to which to connect, in host byte order. + * + * \param file A pointer to the name of the file to get. + * + * \retval 0 if the host name could not be found in the cache, or + * if a TCP connection could not be created. + * + * \retval 1 if the connection was initiated. + */ +unsigned char webclient_get(char *host, u16_t port, char *file); + +/** + * Close the currently open HTTP connection. + */ +void webclient_close(void); +void webclient_appcall(void); + +/** + * Obtain the MIME type of the current HTTP data stream. + * + * \return A pointer to a string contaning the MIME type. The string + * may be empty if no MIME type was reported by the web server. + */ +char *webclient_mimetype(void); + +/** + * Obtain the filename of the current HTTP data stream. + * + * The filename of an HTTP request may be changed by the web server, + * and may therefore not be the same as when the original GET request + * was made with webclient_get(). This function is used for obtaining + * the current filename. + * + * \return A pointer to the current filename. + */ +char *webclient_filename(void); + +/** + * Obtain the hostname of the current HTTP data stream. + * + * The hostname of the web server of an HTTP request may be changed + * by the web server, and may therefore not be the same as when the + * original GET request was made with webclient_get(). This function + * is used for obtaining the current hostname. + * + * \return A pointer to the current hostname. + */ +char *webclient_hostname(void); + +/** + * Obtain the port number of the current HTTP data stream. + * + * The port number of an HTTP request may be changed by the web + * server, and may therefore not be the same as when the original GET + * request was made with webclient_get(). This function is used for + * obtaining the current port number. + * + * \return The port number of the current HTTP data stream, in host byte order. + */ +unsigned short webclient_port(void); + + + +#endif /* __WEBCLIENT_H__ */ + +/** @} */ diff --git a/third_party/uip-1.0/apps/webserver/Makefile.webserver b/third_party/uip-1.0/apps/webserver/Makefile.webserver new file mode 100644 index 0000000..f38c47a --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/Makefile.webserver @@ -0,0 +1 @@ +APP_SOURCES += httpd.c http-strings.c httpd-fs.c httpd-cgi.c diff --git a/third_party/uip-1.0/apps/webserver/http-strings b/third_party/uip-1.0/apps/webserver/http-strings new file mode 100644 index 0000000..0d3c30c --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/http-strings @@ -0,0 +1,35 @@ +http_http "http://" +http_200 "200 " +http_301 "301 " +http_302 "302 " +http_get "GET " +http_10 "HTTP/1.0" +http_11 "HTTP/1.1" +http_content_type "content-type: " +http_texthtml "text/html" +http_location "location: " +http_host "host: " +http_crnl "\r\n" +http_index_html "/index.html" +http_404_html "/404.html" +http_referer "Referer:" +http_header_200 "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_header_404 "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" +http_content_type_plain "Content-type: text/plain\r\n\r\n" +http_content_type_html "Content-type: text/html\r\n\r\n" +http_content_type_css "Content-type: text/css\r\n\r\n" +http_content_type_text "Content-type: text/text\r\n\r\n" +http_content_type_png "Content-type: image/png\r\n\r\n" +http_content_type_gif "Content-type: image/gif\r\n\r\n" +http_content_type_jpg "Content-type: image/jpeg\r\n\r\n" +http_content_type_binary "Content-type: application/octet-stream\r\n\r\n" +http_html ".html" +http_shtml ".shtml" +http_htm ".htm" +http_css ".css" +http_png ".png" +http_gif ".gif" +http_jpg ".jpg" +http_text ".txt" +http_txt ".txt" + diff --git a/third_party/uip-1.0/apps/webserver/http-strings.c b/third_party/uip-1.0/apps/webserver/http-strings.c new file mode 100644 index 0000000..ef7a41c --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/http-strings.c @@ -0,0 +1,102 @@ +const char http_http[8] = +/* "http://" */ +{0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, }; +const char http_200[5] = +/* "200 " */ +{0x32, 0x30, 0x30, 0x20, }; +const char http_301[5] = +/* "301 " */ +{0x33, 0x30, 0x31, 0x20, }; +const char http_302[5] = +/* "302 " */ +{0x33, 0x30, 0x32, 0x20, }; +const char http_get[5] = +/* "GET " */ +{0x47, 0x45, 0x54, 0x20, }; +const char http_10[9] = +/* "HTTP/1.0" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, }; +const char http_11[9] = +/* "HTTP/1.1" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, }; +const char http_content_type[15] = +/* "content-type: " */ +{0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, }; +const char http_texthtml[10] = +/* "text/html" */ +{0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_location[11] = +/* "location: " */ +{0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, }; +const char http_host[7] = +/* "host: " */ +{0x68, 0x6f, 0x73, 0x74, 0x3a, 0x20, }; +const char http_crnl[3] = +/* "\r\n" */ +{0xd, 0xa, }; +const char http_index_html[12] = +/* "/index.html" */ +{0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_404_html[10] = +/* "/404.html" */ +{0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_referer[9] = +/* "Referer:" */ +{0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, 0x3a, }; +const char http_header_200[84] = +/* "HTTP/1.0 200 OK\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x32, 0x30, 0x30, 0x20, 0x4f, 0x4b, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_header_404[91] = +/* "HTTP/1.0 404 Not found\r\nServer: uIP/1.0 http://www.sics.se/~adam/uip/\r\nConnection: close\r\n" */ +{0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x34, 0x30, 0x34, 0x20, 0x4e, 0x6f, 0x74, 0x20, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0xd, 0xa, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x3a, 0x20, 0x75, 0x49, 0x50, 0x2f, 0x31, 0x2e, 0x30, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, 0x2f, 0x75, 0x69, 0x70, 0x2f, 0xd, 0xa, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0xd, 0xa, }; +const char http_content_type_plain[29] = +/* "Content-type: text/plain\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_html[28] = +/* "Content-type: text/html\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_css [27] = +/* "Content-type: text/css\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_text[28] = +/* "Content-type: text/text\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x74, 0x65, 0x78, 0x74, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_png [28] = +/* "Content-type: image/png\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_gif [28] = +/* "Content-type: image/gif\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_jpg [29] = +/* "Content-type: image/jpeg\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x65, 0x67, 0xd, 0xa, 0xd, 0xa, }; +const char http_content_type_binary[43] = +/* "Content-type: application/octet-stream\r\n\r\n" */ +{0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x63, 0x74, 0x65, 0x74, 0x2d, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xd, 0xa, 0xd, 0xa, }; +const char http_html[6] = +/* ".html" */ +{0x2e, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_shtml[7] = +/* ".shtml" */ +{0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, }; +const char http_htm[5] = +/* ".htm" */ +{0x2e, 0x68, 0x74, 0x6d, }; +const char http_css[5] = +/* ".css" */ +{0x2e, 0x63, 0x73, 0x73, }; +const char http_png[5] = +/* ".png" */ +{0x2e, 0x70, 0x6e, 0x67, }; +const char http_gif[5] = +/* ".gif" */ +{0x2e, 0x67, 0x69, 0x66, }; +const char http_jpg[5] = +/* ".jpg" */ +{0x2e, 0x6a, 0x70, 0x67, }; +const char http_text[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; +const char http_txt[5] = +/* ".txt" */ +{0x2e, 0x74, 0x78, 0x74, }; diff --git a/third_party/uip-1.0/apps/webserver/http-strings.h b/third_party/uip-1.0/apps/webserver/http-strings.h new file mode 100644 index 0000000..acbe7e1 --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/http-strings.h @@ -0,0 +1,34 @@ +extern const char http_http[8]; +extern const char http_200[5]; +extern const char http_301[5]; +extern const char http_302[5]; +extern const char http_get[5]; +extern const char http_10[9]; +extern const char http_11[9]; +extern const char http_content_type[15]; +extern const char http_texthtml[10]; +extern const char http_location[11]; +extern const char http_host[7]; +extern const char http_crnl[3]; +extern const char http_index_html[12]; +extern const char http_404_html[10]; +extern const char http_referer[9]; +extern const char http_header_200[84]; +extern const char http_header_404[91]; +extern const char http_content_type_plain[29]; +extern const char http_content_type_html[28]; +extern const char http_content_type_css [27]; +extern const char http_content_type_text[28]; +extern const char http_content_type_png [28]; +extern const char http_content_type_gif [28]; +extern const char http_content_type_jpg [29]; +extern const char http_content_type_binary[43]; +extern const char http_html[6]; +extern const char http_shtml[7]; +extern const char http_htm[5]; +extern const char http_css[5]; +extern const char http_png[5]; +extern const char http_gif[5]; +extern const char http_jpg[5]; +extern const char http_text[5]; +extern const char http_txt[5]; diff --git a/third_party/uip-1.0/apps/webserver/httpd-cgi.c b/third_party/uip-1.0/apps/webserver/httpd-cgi.c new file mode 100644 index 0000000..f845c7a --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-cgi.c @@ -0,0 +1,203 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface + * \author + * Adam Dunkels + * + */ + +/* + * Copyright (c) 2001-2006, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $ + * + */ + +#include "uip.h" +#include "psock.h" +#include "httpd.h" +#include "httpd-cgi.h" +#include "httpd-fs.h" + +#include +#include + +HTTPD_CGI_CALL(file, "file-stats", file_stats); +HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats); +HTTPD_CGI_CALL(net, "net-stats", net_stats); + +static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, NULL }; + +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(nullfunction(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +httpd_cgifunction +httpd_cgi(char *name) +{ + const struct httpd_cgi_call **f; + + /* Find the matching name in the table, return the function. */ + for(f = calls; *f != NULL; ++f) { + if(strncmp((*f)->name, name, strlen((*f)->name)) == 0) { + return (*f)->function; + } + } + return nullfunction; +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_file_stats(void *arg) +{ + char *f = (char *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f)); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(file_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, strchr(ptr, ' ') + 1); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static const char closed[] = /* "CLOSED",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0}; +static const char syn_rcvd[] = /* "SYN-RCVD",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56, + 0x44, 0}; +static const char syn_sent[] = /* "SYN-SENT",*/ +{0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e, + 0x54, 0}; +static const char established[] = /* "ESTABLISHED",*/ +{0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48, + 0x45, 0x44, 0}; +static const char fin_wait_1[] = /* "FIN-WAIT-1",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x31, 0}; +static const char fin_wait_2[] = /* "FIN-WAIT-2",*/ +{0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49, + 0x54, 0x2d, 0x32, 0}; +static const char closing[] = /* "CLOSING",*/ +{0x43, 0x4c, 0x4f, 0x53, 0x49, + 0x4e, 0x47, 0}; +static const char time_wait[] = /* "TIME-WAIT,"*/ +{0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41, + 0x49, 0x54, 0}; +static const char last_ack[] = /* "LAST-ACK"*/ +{0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43, + 0x4b, 0}; + +static const char *states[] = { + closed, + syn_rcvd, + syn_sent, + established, + fin_wait_1, + fin_wait_2, + closing, + time_wait, + last_ack}; + + +static unsigned short +generate_tcp_stats(void *arg) +{ + struct uip_conn *conn; + struct httpd_state *s = (struct httpd_state *)arg; + + conn = &uip_conns[s->count]; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "%d%u.%u.%u.%u:%u%s%u%u%c %c\r\n", + htons(conn->lport), + htons(conn->ripaddr[0]) >> 8, + htons(conn->ripaddr[0]) & 0xff, + htons(conn->ripaddr[1]) >> 8, + htons(conn->ripaddr[1]) & 0xff, + htons(conn->rport), + states[conn->tcpstateflags & UIP_TS_MASK], + conn->nrtx, + conn->timer, + (uip_outstanding(conn))? '*':' ', + (uip_stopped(conn))? '!':' '); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr)) +{ + + PSOCK_BEGIN(&s->sout); + + for(s->count = 0; s->count < UIP_CONNS; ++s->count) { + if((uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) { + PSOCK_GENERATOR_SEND(&s->sout, generate_tcp_stats, s); + } + } + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_net_stats(void *arg) +{ + struct httpd_state *s = (struct httpd_state *)arg; + return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, + "%5u\n", ((uip_stats_t *)&uip_stat)[s->count]); +} + +static +PT_THREAD(net_stats(struct httpd_state *s, char *ptr)) +{ + PSOCK_BEGIN(&s->sout); + +#if UIP_STATISTICS + + for(s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t); + ++s->count) { + PSOCK_GENERATOR_SEND(&s->sout, generate_net_stats, s); + } + +#endif /* UIP_STATISTICS */ + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/third_party/uip-1.0/apps/webserver/httpd-cgi.h b/third_party/uip-1.0/apps/webserver/httpd-cgi.h new file mode 100644 index 0000000..7ae9283 --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-cgi.h @@ -0,0 +1,84 @@ +/** + * \addtogroup httpd + * @{ + */ + +/** + * \file + * Web server script interface header file + * \author + * Adam Dunkels + * + */ + + + +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd-cgi.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_CGI_H__ +#define __HTTPD_CGI_H__ + +#include "psock.h" +#include "httpd.h" + +typedef PT_THREAD((* httpd_cgifunction)(struct httpd_state *, char *)); + +httpd_cgifunction httpd_cgi(char *name); + +struct httpd_cgi_call { + const char *name; + const httpd_cgifunction function; +}; + +/** + * \brief HTTPD CGI function declaration + * \param name The C variable name of the function + * \param str The string name of the function, used in the script file + * \param function A pointer to the function that implements it + * + * This macro is used for declaring a HTTPD CGI + * function. This function is then added to the list of + * HTTPD CGI functions with the httpd_cgi_add() function. + * + * \hideinitializer + */ +#define HTTPD_CGI_CALL(name, str, function) \ +static PT_THREAD(function(struct httpd_state *, char *)); \ +static const struct httpd_cgi_call name = {str, function} + +void httpd_cgi_init(void); +#endif /* __HTTPD_CGI_H__ */ + +/** @} */ diff --git a/third_party/uip-1.0/apps/webserver/httpd-fs.c b/third_party/uip-1.0/apps/webserver/httpd-fs.c new file mode 100644 index 0000000..dc4aef0 --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-fs.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.c,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ + +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-fsdata.h" + +#ifndef NULL +#define NULL 0 +#endif /* NULL */ + +#include "httpd-fsdata.c" + +#if HTTPD_FS_STATISTICS +static u16_t count[HTTPD_FS_NUMFILES]; +#endif /* HTTPD_FS_STATISTICS */ + +/*-----------------------------------------------------------------------------------*/ +static u8_t +httpd_fs_strcmp(const char *str1, const char *str2) +{ + u8_t i; + i = 0; + loop: + + if(str2[i] == 0 || + str1[i] == '\r' || + str1[i] == '\n') { + return 0; + } + + if(str1[i] != str2[i]) { + return 1; + } + + + ++i; + goto loop; +} +/*-----------------------------------------------------------------------------------*/ +int +httpd_fs_open(const char *name, struct httpd_fs_file *file) +{ +#if HTTPD_FS_STATISTICS + u16_t i = 0; +#endif /* HTTPD_FS_STATISTICS */ + struct httpd_fsdata_file_noconst *f; + + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + file->data = f->data; + file->len = f->len; +#if HTTPD_FS_STATISTICS + ++count[i]; +#endif /* HTTPD_FS_STATISTICS */ + return 1; + } +#if HTTPD_FS_STATISTICS + ++i; +#endif /* HTTPD_FS_STATISTICS */ + + } + return 0; +} +/*-----------------------------------------------------------------------------------*/ +void +httpd_fs_init(void) +{ +#if HTTPD_FS_STATISTICS + u16_t i; + for(i = 0; i < HTTPD_FS_NUMFILES; i++) { + count[i] = 0; + } +#endif /* HTTPD_FS_STATISTICS */ +} +/*-----------------------------------------------------------------------------------*/ +#if HTTPD_FS_STATISTICS +u16_t httpd_fs_count +(char *name) +{ + struct httpd_fsdata_file_noconst *f; + u16_t i; + + i = 0; + for(f = (struct httpd_fsdata_file_noconst *)HTTPD_FS_ROOT; + f != NULL; + f = (struct httpd_fsdata_file_noconst *)f->next) { + + if(httpd_fs_strcmp(name, f->name) == 0) { + return count[i]; + } + ++i; + } + return 0; +} +#endif /* HTTPD_FS_STATISTICS */ +/*-----------------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/apps/webserver/httpd-fs.h b/third_party/uip-1.0/apps/webserver/httpd-fs.h new file mode 100644 index 0000000..b594eea --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-fs.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fs.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FS_H__ +#define __HTTPD_FS_H__ + +#define HTTPD_FS_STATISTICS 1 + +struct httpd_fs_file { + char *data; + int len; +}; + +/* file must be allocated by caller and will be filled in + by the function. */ +int httpd_fs_open(const char *name, struct httpd_fs_file *file); + +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 +u16_t httpd_fs_count(char *name); +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ + +void httpd_fs_init(void); + +#endif /* __HTTPD_FS_H__ */ diff --git a/third_party/uip-1.0/apps/webserver/httpd-fs/404.html b/third_party/uip-1.0/apps/webserver/httpd-fs/404.html new file mode 100644 index 0000000..43e7f4c --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-fs/404.html @@ -0,0 +1,8 @@ + + +
+

404 - file not found

+

Go here instead.

+
+ + \ No newline at end of file diff --git a/third_party/uip-1.0/apps/webserver/httpd-fs/fade.png b/third_party/uip-1.0/apps/webserver/httpd-fs/fade.png new file mode 100644 index 0000000..a9e69f7 Binary files /dev/null and b/third_party/uip-1.0/apps/webserver/httpd-fs/fade.png differ diff --git a/third_party/uip-1.0/apps/webserver/httpd-fs/files.shtml b/third_party/uip-1.0/apps/webserver/httpd-fs/files.shtml new file mode 100644 index 0000000..361cc1d --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-fs/files.shtml @@ -0,0 +1,35 @@ +%!: /header.html +

File statistics

+
+ + + + + + + + + + + + + + + +
/index.html%! file-stats /index.html +
/files.shtml%! file-stats /files.shtml +
/tcp.shtml%! file-stats /tcp.shtml +
/stats.shtml%! file-stats /stats.shtml +
/style.css%! file-stats /style.css +
/404.html%! file-stats /404.html +
/fade.png%! file-stats /fade.png +
+
+%!: /footer.html diff --git a/third_party/uip-1.0/apps/webserver/httpd-fs/footer.html b/third_party/uip-1.0/apps/webserver/httpd-fs/footer.html new file mode 100644 index 0000000..290832d --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-fs/footer.html @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/third_party/uip-1.0/apps/webserver/httpd-fs/header.html b/third_party/uip-1.0/apps/webserver/httpd-fs/header.html new file mode 100644 index 0000000..0c3c4ef --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-fs/header.html @@ -0,0 +1,18 @@ + + + + Welcome to the uIP web server! + + + + + + +
diff --git a/third_party/uip-1.0/apps/webserver/httpd-fs/index.html b/third_party/uip-1.0/apps/webserver/httpd-fs/index.html new file mode 100644 index 0000000..7af64c8 --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-fs/index.html @@ -0,0 +1,29 @@ + + + + Welcome to the uIP web server! + + + + + + +
+

+ These web pages are served by a small web server running on top of + the uIP embedded TCP/IP + stack. +

+

+ Click on the links above for web server statistics. +

+ + + diff --git a/third_party/uip-1.0/apps/webserver/httpd-fs/processes.shtml b/third_party/uip-1.0/apps/webserver/httpd-fs/processes.shtml new file mode 100644 index 0000000..be857f9 --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-fs/processes.shtml @@ -0,0 +1,5 @@ +%!: /header.html +

System processes


+ +%! processes +%!: /footer.html \ No newline at end of file diff --git a/third_party/uip-1.0/apps/webserver/httpd-fs/stats.shtml b/third_party/uip-1.0/apps/webserver/httpd-fs/stats.shtml new file mode 100644 index 0000000..7eb381a --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-fs/stats.shtml @@ -0,0 +1,31 @@ +%!: /header.html +

Network statistics

+
+
IDNamePriorityPoll handlerEvent handlerProcstate
+
+IP           Packets received
+             Packets sent
+	     Packets dropped
+IP errors    IP version/header length
+             IP length, high byte
+             IP length, low byte
+             IP fragments
+             Header checksum
+             Wrong protocol
+ICMP	     Packets received
+             Packets sent
+             Packets dropped
+             Type errors
+TCP          Packets received
+             Packets sent
+             Packets dropped
+             Checksum errors
+             Data packets without ACKs
+             Resets
+             Retransmissions
+	     No connection avaliable
+	     Connection attempts to closed ports
+
%! net-stats
+
+ +%!: /footer.html diff --git a/third_party/uip-1.0/apps/webserver/httpd-fs/style.css b/third_party/uip-1.0/apps/webserver/httpd-fs/style.css new file mode 100644 index 0000000..089fe84 --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-fs/style.css @@ -0,0 +1,92 @@ +h1 +{ + text-align: center; + font-size:14pt; + font-family:arial,helvetica; + font-weight:bold; + padding:10px; +} + +body +{ + + background-color: #fffeec; + color:black; + + font-size:8pt; + font-family:arial,helvetica; +} + +.menu +{ + margin: 4px; + width:60%; + + padding:2px; + + border: solid 1px; + background-color: #fffcd2; + text-align:left; + + font-size:9pt; + font-family:arial,helvetica; +} + +div.menubox +{ + width: 25%; + border: 0; + float: left; +text-align: center; +} + +.contentblock +{ + margin: 4px; + width:60%; + + padding:2px; + + border: 1px dotted; + background-color: white; + + font-size:8pt; + font-family:arial,helvetica; + +} + +p.intro +{ + margin-left:20px; + margin-right:20px; + + font-size:10pt; +/* font-weight:bold; */ + font-family:arial,helvetica; +} + +p.clink +{ + font-size:12pt; + font-family:courier,monospace; + text-align:center; +} + +p.clink9 +{ + font-size:9pt; + font-family:courier,monospace; + text-align:center; +} + + +p +{ + padding-left:10px; +} + +p.right +{ + text-align:right; +} + diff --git a/third_party/uip-1.0/apps/webserver/httpd-fs/tcp.shtml b/third_party/uip-1.0/apps/webserver/httpd-fs/tcp.shtml new file mode 100644 index 0000000..2404aed --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-fs/tcp.shtml @@ -0,0 +1,5 @@ +%!: /header.html +

Current connections


+ +%! tcp-connections +%!: /footer.html \ No newline at end of file diff --git a/third_party/uip-1.0/apps/webserver/httpd-fsdata.c b/third_party/uip-1.0/apps/webserver/httpd-fsdata.c new file mode 100644 index 0000000..29e5a1b --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-fsdata.c @@ -0,0 +1,607 @@ +static const unsigned char data_processes_shtml[] = { + /* /processes.shtml */ + 0x2f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x25, 0x21, 0x3a, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3c, 0x68, 0x31, + 0x3e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x70, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x3c, 0x2f, 0x68, + 0x31, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x3c, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, + 0x31, 0x30, 0x30, 0x25, 0x22, 0x3e, 0xa, 0x3c, 0x74, 0x72, + 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x49, 0x44, 0x3c, 0x2f, 0x74, + 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x4e, 0x61, 0x6d, 0x65, + 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x50, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x3c, 0x2f, 0x74, + 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x50, 0x6f, 0x6c, 0x6c, + 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0x3c, 0x2f, + 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, + 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x50, + 0x72, 0x6f, 0x63, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3c, 0x2f, + 0x74, 0x68, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x25, + 0x21, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, + 0x73, 0xa, 0x25, 0x21, 0x3a, 0x20, 0x2f, 0x66, 0x6f, 0x6f, + 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0}; + +static const unsigned char data_404_html[] = { + /* /404.html */ + 0x2f, 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, 0x20, 0x20, 0x3c, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x62, 0x67, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3d, 0x22, 0x77, 0x68, 0x69, 0x74, 0x65, 0x22, + 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x63, 0x65, 0x6e, + 0x74, 0x65, 0x72, 0x3e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x3c, 0x68, 0x31, 0x3e, 0x34, 0x30, 0x34, 0x20, 0x2d, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x3c, 0x2f, 0x68, 0x31, 0x3e, + 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x33, + 0x3e, 0x47, 0x6f, 0x20, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x68, 0x65, 0x72, 0x65, + 0x3c, 0x2f, 0x61, 0x3e, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x65, + 0x61, 0x64, 0x2e, 0x3c, 0x2f, 0x68, 0x33, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x63, 0x65, 0x6e, 0x74, 0x65, + 0x72, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, + 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, +0}; + +static const unsigned char data_files_shtml[] = { + /* /files.shtml */ + 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x25, 0x21, 0x3a, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3c, 0x68, 0x31, + 0x3e, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x68, 0x31, + 0x3e, 0xa, 0x3c, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3e, + 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x3d, 0x22, 0x33, 0x30, 0x30, 0x22, 0x3e, + 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, + 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, + 0x3e, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, + 0x6d, 0x6c, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0xa, 0x3c, 0x74, 0x64, 0x3e, 0x25, 0x21, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, + 0x6c, 0xa, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, + 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, + 0x22, 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, 0x70, 0x6e, 0x67, + 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x31, + 0x30, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x25, 0x21, + 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x20, 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, + 0x74, 0x6d, 0x6c, 0xa, 0x3e, 0x20, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x3c, 0x74, 0x72, + 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x2f, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0xa, + 0x3c, 0x74, 0x64, 0x3e, 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, + 0x65, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x2f, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, + 0xa, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, + 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, + 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x22, + 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x31, 0x30, + 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x25, 0x21, 0x20, + 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, + 0x20, 0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0xa, 0x3e, 0x20, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x3c, 0x74, 0x72, + 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, + 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x2f, 0x74, 0x63, 0x70, + 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0xa, 0x3c, 0x74, 0x64, 0x3e, + 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x20, 0x2f, 0x74, 0x63, 0x70, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3c, 0x2f, 0x74, 0x64, 0x3e, + 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, + 0x72, 0x63, 0x3d, 0x22, 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, + 0x70, 0x6e, 0x67, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3d, 0x31, 0x30, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x3d, 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x20, 0x2f, 0x74, 0x63, 0x70, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3e, 0x20, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x3c, + 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, + 0x6d, 0x6c, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0xa, 0x3c, 0x74, 0x64, 0x3e, 0x25, 0x21, 0x20, 0x66, + 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, + 0x6d, 0x6c, 0xa, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, + 0x64, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, 0x63, + 0x3d, 0x22, 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, 0x70, 0x6e, + 0x67, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, + 0x31, 0x30, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x25, + 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x20, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, + 0x73, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3e, 0x20, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x3c, + 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x3e, 0x2f, 0x73, + 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0x3c, 0x2f, + 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0xa, 0x3c, 0x74, + 0x64, 0x3e, 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x2f, 0x73, 0x74, 0x79, + 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0xa, 0x3c, 0x2f, 0x74, + 0x64, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x69, 0x6d, 0x67, + 0x20, 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2f, 0x66, 0x61, 0x64, + 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x20, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x3d, 0x31, 0x30, 0x20, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x3d, 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, + 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x2f, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0xa, 0x3e, 0x20, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, + 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, + 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x34, + 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x2f, + 0x34, 0x30, 0x34, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x3c, 0x2f, + 0x61, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0xa, 0x3c, 0x74, + 0x64, 0x3e, 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x2f, 0x34, 0x30, 0x34, + 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, + 0x73, 0x72, 0x63, 0x3d, 0x22, 0x2f, 0x66, 0x61, 0x64, 0x65, + 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3d, 0x31, 0x30, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3d, 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x2f, 0x34, 0x30, 0x34, + 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3e, 0x20, 0x3c, 0x2f, + 0x74, 0x64, 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x3c, + 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x64, 0x3e, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x66, 0x61, 0x64, + 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x22, 0x3e, 0x2f, 0x66, 0x61, + 0x64, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0x3c, 0x2f, 0x61, 0x3e, + 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0xa, 0x3c, 0x74, 0x64, 0x3e, + 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x20, 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, + 0x70, 0x6e, 0x67, 0xa, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, + 0x74, 0x64, 0x3e, 0x3c, 0x69, 0x6d, 0x67, 0x20, 0x73, 0x72, + 0x63, 0x3d, 0x22, 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, 0x70, + 0x6e, 0x67, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3d, 0x31, 0x30, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, + 0x25, 0x21, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x2d, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x20, 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, + 0x70, 0x6e, 0x67, 0xa, 0x3e, 0x20, 0x3c, 0x2f, 0x74, 0x64, + 0x3e, 0x3c, 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x3c, 0x2f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x3e, 0xa, 0x3c, 0x2f, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x3e, 0xa, 0x25, 0x21, 0x3a, 0x20, + 0x2f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, + 0x6d, 0x6c, 0xa, 0}; + +static const unsigned char data_footer_html[] = { + /* /footer.html */ + 0x2f, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x20, 0x20, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0xa, + 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0}; + +static const unsigned char data_header_html[] = { + /* /header.html */ + 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x57, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x49, 0x50, 0x20, 0x77, + 0x65, 0x62, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x21, + 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, + 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, + 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, + 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x3e, 0x20, + 0x20, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x23, + 0x66, 0x66, 0x66, 0x65, 0x65, 0x63, 0x22, 0x20, 0x74, 0x65, + 0x78, 0x74, 0x3d, 0x22, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x22, + 0x3e, 0xa, 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, + 0x75, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, + 0x6e, 0x75, 0x62, 0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x46, + 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, 0x75, 0x62, 0x6f, + 0x78, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x46, 0x69, 0x6c, 0x65, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, 0x75, 0x62, + 0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, + 0x65, 0x6e, 0x75, 0x62, 0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, + 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0xa, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x62, 0x72, 0x3e, 0xa, 0x20, 0x20, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0x20, 0x20, 0xa, 0x20, + 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0x3e, 0xa, 0}; + +static const unsigned char data_index_html[] = { + /* /index.html */ + 0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, + 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x57, 0x33, 0x43, 0x2f, + 0x2f, 0x44, 0x54, 0x44, 0x20, 0x48, 0x54, 0x4d, 0x4c, 0x20, + 0x34, 0x2e, 0x30, 0x31, 0x20, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x2f, 0x45, + 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, + 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2f, 0x54, 0x52, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x34, + 0x2f, 0x6c, 0x6f, 0x6f, 0x73, 0x65, 0x2e, 0x64, 0x74, 0x64, + 0x22, 0x3e, 0xa, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, + 0x57, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x49, 0x50, 0x20, 0x77, + 0x65, 0x62, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x21, + 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x3c, 0x6c, 0x69, 0x6e, 0x6b, 0x20, 0x72, + 0x65, 0x6c, 0x3d, 0x22, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x73, + 0x68, 0x65, 0x65, 0x74, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, + 0x22, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x73, 0x74, + 0x79, 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0x22, 0x3e, 0x20, + 0x20, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, + 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x62, 0x67, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3d, 0x22, 0x23, + 0x66, 0x66, 0x66, 0x65, 0x65, 0x63, 0x22, 0x20, 0x74, 0x65, + 0x78, 0x74, 0x3d, 0x22, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x22, + 0x3e, 0xa, 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, + 0x75, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, + 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, + 0x6e, 0x75, 0x62, 0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x2f, 0x22, 0x3e, 0x46, + 0x72, 0x6f, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x67, 0x65, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, 0x75, 0x62, 0x6f, + 0x78, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, + 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, + 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x46, 0x69, 0x6c, 0x65, 0x20, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, + 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, + 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x65, 0x6e, 0x75, 0x62, + 0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, + 0x66, 0x3d, 0x22, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, + 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, + 0x64, 0x69, 0x76, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x64, 0x69, + 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, + 0x65, 0x6e, 0x75, 0x62, 0x6f, 0x78, 0x22, 0x3e, 0x3c, 0x61, + 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x74, 0x63, 0x70, + 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0x22, 0x3e, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0xa, 0x20, 0x20, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3c, + 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, + 0x20, 0x20, 0x3c, 0x62, 0x72, 0x3e, 0xa, 0x20, 0x20, 0x3c, + 0x2f, 0x64, 0x69, 0x76, 0x3e, 0xa, 0xa, 0x20, 0x20, 0x3c, + 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, + 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x22, 0x3e, 0xa, 0x20, 0x20, 0x3c, 0x70, + 0x3e, 0xa, 0x20, 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x20, + 0x77, 0x65, 0x62, 0x20, 0x70, 0x61, 0x67, 0x65, 0x73, 0x20, + 0x61, 0x72, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x61, 0x20, 0x73, 0x6d, 0x61, 0x6c, + 0x6c, 0x20, 0x77, 0x65, 0x62, 0x20, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x70, 0x20, 0x6f, 0x66, + 0xa, 0x20, 0x20, 0x74, 0x68, 0x65, 0x20, 0x3c, 0x61, 0x20, + 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, + 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x69, 0x63, + 0x73, 0x2e, 0x73, 0x65, 0x2f, 0x7e, 0x61, 0x64, 0x61, 0x6d, + 0x2f, 0x75, 0x69, 0x70, 0x2f, 0x22, 0x3e, 0x75, 0x49, 0x50, + 0x20, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x20, + 0x54, 0x43, 0x50, 0x2f, 0x49, 0x50, 0xa, 0x20, 0x20, 0x73, + 0x74, 0x61, 0x63, 0x6b, 0x3c, 0x2f, 0x61, 0x3e, 0x2e, 0xa, + 0x20, 0x20, 0x3c, 0x2f, 0x70, 0x3e, 0xa, 0x20, 0x20, 0x3c, + 0x70, 0x3e, 0xa, 0x20, 0x20, 0x43, 0x6c, 0x69, 0x63, 0x6b, + 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, + 0x6e, 0x6b, 0x73, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x77, 0x65, 0x62, 0x20, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x73, 0x74, 0x69, 0x63, 0x73, 0x2e, 0xa, 0x20, 0x20, 0x3c, + 0x2f, 0x70, 0x3e, 0xa, 0xa, 0x20, 0x20, 0x3c, 0x2f, 0x62, + 0x6f, 0x64, 0x79, 0x3e, 0xa, 0x3c, 0x2f, 0x68, 0x74, 0x6d, + 0x6c, 0x3e, 0xa, 0}; + +static const unsigned char data_style_css[] = { + /* /style.css */ + 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x2e, 0x63, 0x73, 0x73, 0, + 0x68, 0x31, 0x20, 0xa, 0x7b, 0xa, 0x20, 0x20, 0x74, 0x65, + 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0xa, 0x20, 0x20, + 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, + 0x31, 0x34, 0x70, 0x74, 0x3b, 0xa, 0x20, 0x20, 0x66, 0x6f, + 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, + 0x61, 0x72, 0x69, 0x61, 0x6c, 0x2c, 0x68, 0x65, 0x6c, 0x76, + 0x65, 0x74, 0x69, 0x63, 0x61, 0x3b, 0xa, 0x20, 0x20, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x62, 0x6f, 0x6c, 0x64, 0x3b, 0xa, 0x20, 0x20, 0x70, + 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x31, 0x30, 0x70, + 0x78, 0x3b, 0x20, 0xa, 0x7d, 0xa, 0xa, 0x62, 0x6f, 0x64, + 0x79, 0xa, 0x7b, 0xa, 0xa, 0x20, 0x20, 0x62, 0x61, 0x63, + 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, + 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x66, 0x66, 0x66, 0x65, + 0x65, 0x63, 0x3b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, + 0x72, 0x3a, 0x62, 0x6c, 0x61, 0x63, 0x6b, 0x3b, 0xa, 0xa, + 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, + 0x65, 0x3a, 0x38, 0x70, 0x74, 0x3b, 0xa, 0x20, 0x20, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, + 0x3a, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x2c, 0x68, 0x65, 0x6c, + 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 0x3b, 0xa, 0x7d, 0xa, + 0xa, 0x2e, 0x6d, 0x65, 0x6e, 0x75, 0xa, 0x7b, 0xa, 0x20, + 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x34, + 0x70, 0x78, 0x3b, 0xa, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x36, 0x30, 0x25, 0x3b, 0xa, 0xa, 0x20, 0x20, + 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x32, 0x70, + 0x78, 0x3b, 0xa, 0x9, 0xa, 0x20, 0x20, 0x62, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x3a, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x20, 0x31, 0x70, 0x78, 0x3b, 0xa, 0x20, 0x20, 0x62, 0x61, + 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, + 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x66, 0x66, 0x66, + 0x63, 0x64, 0x32, 0x3b, 0xa, 0x20, 0x20, 0x74, 0x65, 0x78, + 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x6c, 0x65, + 0x66, 0x74, 0x3b, 0xa, 0x20, 0x20, 0xa, 0x20, 0x20, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x39, + 0x70, 0x74, 0x3b, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, + 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x61, 0x72, + 0x69, 0x61, 0x6c, 0x2c, 0x68, 0x65, 0x6c, 0x76, 0x65, 0x74, + 0x69, 0x63, 0x61, 0x3b, 0x20, 0x20, 0xa, 0x7d, 0xa, 0xa, + 0x64, 0x69, 0x76, 0x2e, 0x6d, 0x65, 0x6e, 0x75, 0x62, 0x6f, + 0x78, 0xa, 0x7b, 0xa, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3a, 0x20, 0x32, 0x35, 0x25, 0x3b, 0xa, 0x20, 0x20, + 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x30, 0x3b, + 0xa, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20, + 0x6c, 0x65, 0x66, 0x74, 0x3b, 0xa, 0x74, 0x65, 0x78, 0x74, + 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, + 0x6e, 0x74, 0x65, 0x72, 0x3b, 0xa, 0x7d, 0xa, 0xa, 0x2e, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0xa, 0x7b, 0x20, 0x20, 0xa, 0x20, 0x20, 0x6d, + 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x34, 0x70, 0x78, + 0x3b, 0xa, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, + 0x36, 0x30, 0x25, 0x3b, 0xa, 0xa, 0x20, 0x20, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x32, 0x70, 0x78, 0x3b, + 0xa, 0xa, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, + 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x64, 0x6f, 0x74, 0x74, + 0x65, 0x64, 0x3b, 0xa, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, + 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, + 0x6f, 0x72, 0x3a, 0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x3b, + 0xa, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, + 0x69, 0x7a, 0x65, 0x3a, 0x38, 0x70, 0x74, 0x3b, 0xa, 0x20, + 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, + 0x6c, 0x79, 0x3a, 0x61, 0x72, 0x69, 0x61, 0x6c, 0x2c, 0x68, + 0x65, 0x6c, 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 0x3b, 0x20, + 0x20, 0xa, 0xa, 0x7d, 0xa, 0xa, 0x70, 0x2e, 0x69, 0x6e, + 0x74, 0x72, 0x6f, 0xa, 0x7b, 0xa, 0x20, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, + 0x32, 0x30, 0x70, 0x78, 0x3b, 0xa, 0x20, 0x20, 0x6d, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x3a, 0x32, 0x30, 0x70, 0x78, 0x3b, 0xa, 0xa, 0x20, 0x20, + 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, + 0x31, 0x30, 0x70, 0x74, 0x3b, 0xa, 0x2f, 0x2a, 0x20, 0x20, + 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x3a, 0x62, 0x6f, 0x6c, 0x64, 0x3b, 0x20, 0x2a, 0x2f, + 0xa, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, + 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x61, 0x72, 0x69, 0x61, 0x6c, + 0x2c, 0x68, 0x65, 0x6c, 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, + 0x3b, 0x20, 0x20, 0xa, 0x7d, 0xa, 0xa, 0x70, 0x2e, 0x63, + 0x6c, 0x69, 0x6e, 0x6b, 0xa, 0x7b, 0xa, 0x20, 0x20, 0x66, + 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x31, + 0x32, 0x70, 0x74, 0x3b, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x63, + 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x2c, 0x6d, 0x6f, 0x6e, + 0x6f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3b, 0x20, 0x20, 0xa, + 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3a, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, + 0xa, 0x7d, 0xa, 0xa, 0x70, 0x2e, 0x63, 0x6c, 0x69, 0x6e, + 0x6b, 0x39, 0xa, 0x7b, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x6e, + 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x39, 0x70, 0x74, + 0x3b, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, + 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x63, 0x6f, 0x75, 0x72, + 0x69, 0x65, 0x72, 0x2c, 0x6d, 0x6f, 0x6e, 0x6f, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x3b, 0x20, 0x20, 0xa, 0x20, 0x20, 0x74, + 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, + 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0xa, 0x7d, 0xa, + 0xa, 0xa, 0x70, 0xa, 0x7b, 0xa, 0x20, 0x20, 0x70, 0x61, + 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x6c, 0x65, 0x66, 0x74, + 0x3a, 0x31, 0x30, 0x70, 0x78, 0x3b, 0xa, 0x7d, 0xa, 0xa, + 0x70, 0x2e, 0x72, 0x69, 0x67, 0x68, 0x74, 0xa, 0x7b, 0xa, + 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, + 0x67, 0x6e, 0x3a, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x20, + 0xa, 0x7d, 0xa, 0xa, 0}; + +static const unsigned char data_tcp_shtml[] = { + /* /tcp.shtml */ + 0x2f, 0x74, 0x63, 0x70, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x25, 0x21, 0x3a, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3c, 0x68, 0x31, + 0x3e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x3c, 0x62, 0x72, 0x3e, 0x3c, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x77, 0x69, 0x64, 0x74, + 0x68, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x25, 0x22, 0x3e, 0xa, + 0x3c, 0x74, 0x72, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, + 0x68, 0x3e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x3c, 0x2f, + 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, + 0x3e, 0x52, 0x65, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x3c, 0x2f, 0x74, 0x68, + 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, 0x74, 0x68, 0x3e, 0x46, + 0x6c, 0x61, 0x67, 0x73, 0x3c, 0x2f, 0x74, 0x68, 0x3e, 0x3c, + 0x2f, 0x74, 0x72, 0x3e, 0xa, 0x25, 0x21, 0x20, 0x74, 0x63, + 0x70, 0x2d, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0xa, 0x25, 0x21, 0x3a, 0x20, 0x2f, 0x66, + 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, +0}; + +static const unsigned char data_fade_png[] = { + /* /fade.png */ + 0x2f, 0x66, 0x61, 0x64, 0x65, 0x2e, 0x70, 0x6e, 0x67, 0, + 0x89, 0x50, 0x4e, 0x47, 0xd, 0xa, 0x1a, 0xa, 00, 00, + 00, 0xd, 0x49, 0x48, 0x44, 0x52, 00, 00, 00, 0x4, + 00, 00, 00, 0xa, 0x8, 0x2, 00, 00, 00, 0x1c, + 0x99, 0x68, 0x59, 00, 00, 00, 0x9, 0x70, 0x48, 0x59, + 0x73, 00, 00, 0xb, 0x13, 00, 00, 0xb, 0x13, 0x1, + 00, 0x9a, 0x9c, 0x18, 00, 00, 00, 0x7, 0x74, 0x49, + 0x4d, 0x45, 0x7, 0xd6, 0x6, 0x8, 0x14, 0x1b, 0x39, 0xaf, + 0x5b, 0xc0, 0xe3, 00, 00, 00, 0x1d, 0x74, 0x45, 0x58, + 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 00, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x54, 0x68, 0x65, 0x20, 0x47, 0x49, 0x4d, 0x50, + 0xef, 0x64, 0x25, 0x6e, 00, 00, 00, 0x3a, 0x49, 0x44, + 0x41, 0x54, 0x8, 0xd7, 0x75, 0x8c, 0x31, 0x12, 00, 0x10, + 0x10, 0xc4, 0x2e, 0x37, 0x9e, 0x40, 0x65, 0xfd, 0xff, 0x83, + 0xf4, 0xa, 0x1c, 0x8d, 0x54, 0x9b, 0xc9, 0xcc, 0x9a, 0x3d, + 0x90, 0x73, 0x71, 0x67, 0x91, 0xd4, 0x74, 0x36, 0xa9, 0x55, + 0x1, 0xf8, 0x29, 0x58, 0xc8, 0xbf, 0x48, 0xc4, 0x81, 0x74, + 0xb, 0xa3, 0xf, 0x7c, 0xdb, 0x4, 0xe8, 0x40, 0x5, 0xdf, + 0xa1, 0xf3, 0xfc, 0x73, 00, 00, 00, 00, 0x49, 0x45, + 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82, 0}; + +static const unsigned char data_stats_shtml[] = { + /* /stats.shtml */ + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0, + 0x25, 0x21, 0x3a, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3c, 0x68, 0x31, + 0x3e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x3c, + 0x2f, 0x68, 0x31, 0x3e, 0xa, 0x3c, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x3e, 0xa, 0x3c, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x33, 0x30, + 0x30, 0x22, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3d, + 0x22, 0x30, 0x22, 0x3e, 0xa, 0x3c, 0x74, 0x72, 0x3e, 0x3c, + 0x74, 0x64, 0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, 0xa, 0x49, + 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, + 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, + 0x73, 0x65, 0x6e, 0x74, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x64, + 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0xa, 0x49, 0x50, 0x20, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x20, 0x20, 0x20, 0x20, + 0x49, 0x50, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, + 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x68, + 0x69, 0x67, 0x68, 0x20, 0x62, 0x79, 0x74, 0x65, 0xa, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x49, 0x50, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x2c, 0x20, 0x6c, 0x6f, 0x77, 0x20, 0x62, 0x79, 0x74, + 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x49, 0x50, 0x20, 0x66, 0x72, + 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x57, 0x72, 0x6f, 0x6e, 0x67, 0x20, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0xa, 0x49, 0x43, 0x4d, 0x50, 0x9, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x64, + 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x54, 0x79, 0x70, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0xa, 0x54, 0x43, 0x50, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, + 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, + 0x74, 0x73, 0x20, 0x73, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x50, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x20, 0x64, + 0x72, 0x6f, 0x70, 0x70, 0x65, 0x64, 0xa, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x20, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x44, + 0x61, 0x74, 0x61, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, + 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, + 0x41, 0x43, 0x4b, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, + 0x73, 0x65, 0x74, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x65, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x4e, 0x6f, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x76, 0x61, 0x6c, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0xa, 0x9, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x20, + 0x74, 0x6f, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x64, 0x20, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0xa, 0x3c, 0x2f, 0x70, 0x72, + 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x64, 0x3e, 0x3c, 0x74, 0x64, + 0x3e, 0x3c, 0x70, 0x72, 0x65, 0x3e, 0x25, 0x21, 0x20, 0x6e, + 0x65, 0x74, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0x3c, + 0x2f, 0x70, 0x72, 0x65, 0x3e, 0x3c, 0x2f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x3e, 0xa, 0x3c, 0x2f, 0x63, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x3e, 0xa, 0x25, 0x21, 0x3a, 0x20, 0x2f, 0x66, + 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, + 0xa, 0}; + +const struct httpd_fsdata_file file_processes_shtml[] = {{NULL, data_processes_shtml, data_processes_shtml + 17, sizeof(data_processes_shtml) - 17}}; + +const struct httpd_fsdata_file file_404_html[] = {{file_processes_shtml, data_404_html, data_404_html + 10, sizeof(data_404_html) - 10}}; + +const struct httpd_fsdata_file file_files_shtml[] = {{file_404_html, data_files_shtml, data_files_shtml + 13, sizeof(data_files_shtml) - 13}}; + +const struct httpd_fsdata_file file_footer_html[] = {{file_files_shtml, data_footer_html, data_footer_html + 13, sizeof(data_footer_html) - 13}}; + +const struct httpd_fsdata_file file_header_html[] = {{file_footer_html, data_header_html, data_header_html + 13, sizeof(data_header_html) - 13}}; + +const struct httpd_fsdata_file file_index_html[] = {{file_header_html, data_index_html, data_index_html + 12, sizeof(data_index_html) - 12}}; + +const struct httpd_fsdata_file file_style_css[] = {{file_index_html, data_style_css, data_style_css + 11, sizeof(data_style_css) - 11}}; + +const struct httpd_fsdata_file file_tcp_shtml[] = {{file_style_css, data_tcp_shtml, data_tcp_shtml + 11, sizeof(data_tcp_shtml) - 11}}; + +const struct httpd_fsdata_file file_fade_png[] = {{file_tcp_shtml, data_fade_png, data_fade_png + 10, sizeof(data_fade_png) - 10}}; + +const struct httpd_fsdata_file file_stats_shtml[] = {{file_fade_png, data_stats_shtml, data_stats_shtml + 13, sizeof(data_stats_shtml) - 13}}; + +#define HTTPD_FS_ROOT file_stats_shtml + +#define HTTPD_FS_NUMFILES 10 diff --git a/third_party/uip-1.0/apps/webserver/httpd-fsdata.h b/third_party/uip-1.0/apps/webserver/httpd-fsdata.h new file mode 100644 index 0000000..52d35c2 --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd-fsdata.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd-fsdata.h,v 1.1 2006/06/07 09:13:08 adam Exp $ + */ +#ifndef __HTTPD_FSDATA_H__ +#define __HTTPD_FSDATA_H__ + +#include "uip.h" + +struct httpd_fsdata_file { + const struct httpd_fsdata_file *next; + const char *name; + const char *data; + const int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +struct httpd_fsdata_file_noconst { + struct httpd_fsdata_file *next; + char *name; + char *data; + int len; +#ifdef HTTPD_FS_STATISTICS +#if HTTPD_FS_STATISTICS == 1 + u16_t count; +#endif /* HTTPD_FS_STATISTICS */ +#endif /* HTTPD_FS_STATISTICS */ +}; + +#endif /* __HTTPD_FSDATA_H__ */ diff --git a/third_party/uip-1.0/apps/webserver/httpd.c b/third_party/uip-1.0/apps/webserver/httpd.c new file mode 100644 index 0000000..e808688 --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd.c @@ -0,0 +1,338 @@ +/** + * \addtogroup apps + * @{ + */ + +/** + * \defgroup httpd Web server + * @{ + * The uIP web server is a very simplistic implementation of an HTTP + * server. It can serve web pages and files from a read-only ROM + * filesystem, and provides a very small scripting language. + + */ + +/** + * \file + * Web server + * \author + * Adam Dunkels + */ + + +/* + * Copyright (c) 2004, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * Author: Adam Dunkels + * + * $Id: httpd.c,v 1.2 2006/06/11 21:46:38 adam Exp $ + */ + +#include "uip.h" +#include "httpd.h" +#include "httpd-fs.h" +#include "httpd-cgi.h" +#include "http-strings.h" + +#include + +#define STATE_WAITING 0 +#define STATE_OUTPUT 1 + +#define ISO_nl 0x0a +#define ISO_space 0x20 +#define ISO_bang 0x21 +#define ISO_percent 0x25 +#define ISO_period 0x2e +#define ISO_slash 0x2f +#define ISO_colon 0x3a + + +/*---------------------------------------------------------------------------*/ +static unsigned short +generate_part_of_file(void *state) +{ + struct httpd_state *s = (struct httpd_state *)state; + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + memcpy(uip_appdata, s->file.data, s->len); + + return s->len; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + do { + PSOCK_GENERATOR_SEND(&s->sout, generate_part_of_file, s); + s->file.len -= s->len; + s->file.data += s->len; + } while(s->file.len > 0); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_part_of_file(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND(&s->sout, s->file.data, s->len); + + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static void +next_scriptstate(struct httpd_state *s) +{ + char *p; + p = strchr(s->scriptptr, ISO_nl) + 1; + s->scriptlen -= (unsigned short)(p - s->scriptptr); + s->scriptptr = p; +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_script(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->scriptpt); + + + while(s->file.len > 0) { + + /* Check if we should start executing a script. */ + if(*s->file.data == ISO_percent && + *(s->file.data + 1) == ISO_bang) { + s->scriptptr = s->file.data + 3; + s->scriptlen = s->file.len - 3; + if(*(s->scriptptr - 1) == ISO_colon) { + httpd_fs_open(s->scriptptr + 1, &s->file); + PT_WAIT_THREAD(&s->scriptpt, send_file(s)); + } else { + PT_WAIT_THREAD(&s->scriptpt, + httpd_cgi(s->scriptptr)(s, s->scriptptr)); + } + next_scriptstate(s); + + /* The script is over, so we reset the pointers and continue + sending the rest of the file. */ + s->file.data = s->scriptptr; + s->file.len = s->scriptlen; + } else { + /* See if we find the start of script marker in the block of HTML + to be sent. */ + + if(s->file.len > uip_mss()) { + s->len = uip_mss(); + } else { + s->len = s->file.len; + } + + if(*s->file.data == ISO_percent) { + ptr = strchr(s->file.data + 1, ISO_percent); + } else { + ptr = strchr(s->file.data, ISO_percent); + } + if(ptr != NULL && + ptr != s->file.data) { + s->len = (int)(ptr - s->file.data); + if(s->len >= uip_mss()) { + s->len = uip_mss(); + } + } + PT_WAIT_THREAD(&s->scriptpt, send_part_of_file(s)); + s->file.data += s->len; + s->file.len -= s->len; + + } + } + + PT_END(&s->scriptpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(send_headers(struct httpd_state *s, const char *statushdr)) +{ + char *ptr; + + PSOCK_BEGIN(&s->sout); + + PSOCK_SEND_STR(&s->sout, statushdr); + + ptr = strrchr(s->filename, ISO_period); + if(ptr == NULL) { + PSOCK_SEND_STR(&s->sout, http_content_type_binary); + } else if(strncmp(http_html, ptr, 5) == 0 || + strncmp(http_shtml, ptr, 6) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_html); + } else if(strncmp(http_css, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_css); + } else if(strncmp(http_png, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_png); + } else if(strncmp(http_gif, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_gif); + } else if(strncmp(http_jpg, ptr, 4) == 0) { + PSOCK_SEND_STR(&s->sout, http_content_type_jpg); + } else { + PSOCK_SEND_STR(&s->sout, http_content_type_plain); + } + PSOCK_END(&s->sout); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_output(struct httpd_state *s)) +{ + char *ptr; + + PT_BEGIN(&s->outputpt); + + if(!httpd_fs_open(s->filename, &s->file)) { + httpd_fs_open(http_404_html, &s->file); + strcpy(s->filename, http_404_html); + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_404)); + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_headers(s, + http_header_200)); + ptr = strchr(s->filename, ISO_period); + if(ptr != NULL && strncmp(ptr, http_shtml, 6) == 0) { + PT_INIT(&s->scriptpt); + PT_WAIT_THREAD(&s->outputpt, handle_script(s)); + } else { + PT_WAIT_THREAD(&s->outputpt, + send_file(s)); + } + } + PSOCK_CLOSE(&s->sout); + PT_END(&s->outputpt); +} +/*---------------------------------------------------------------------------*/ +static +PT_THREAD(handle_input(struct httpd_state *s)) +{ + PSOCK_BEGIN(&s->sin); + + PSOCK_READTO(&s->sin, ISO_space); + + + if(strncmp(s->inputbuf, http_get, 4) != 0) { + PSOCK_CLOSE_EXIT(&s->sin); + } + PSOCK_READTO(&s->sin, ISO_space); + + if(s->inputbuf[0] != ISO_slash) { + PSOCK_CLOSE_EXIT(&s->sin); + } + + if(s->inputbuf[1] == ISO_space) { + strncpy(s->filename, http_index_html, sizeof(s->filename)); + } else { + s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; + strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); + } + + /* httpd_log_file(uip_conn->ripaddr, s->filename);*/ + + s->state = STATE_OUTPUT; + + while(1) { + PSOCK_READTO(&s->sin, ISO_nl); + + if(strncmp(s->inputbuf, http_referer, 8) == 0) { + s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0; + /* httpd_log(&s->inputbuf[9]);*/ + } + } + + PSOCK_END(&s->sin); +} +/*---------------------------------------------------------------------------*/ +static void +handle_connection(struct httpd_state *s) +{ + handle_input(s); + if(s->state == STATE_OUTPUT) { + handle_output(s); + } +} +/*---------------------------------------------------------------------------*/ +void +httpd_appcall(void) +{ + struct httpd_state *s = (struct httpd_state *)&(uip_conn->appstate); + + if(uip_closed() || uip_aborted() || uip_timedout()) { + } else if(uip_connected()) { + PSOCK_INIT(&s->sin, s->inputbuf, sizeof(s->inputbuf) - 1); + PSOCK_INIT(&s->sout, s->inputbuf, sizeof(s->inputbuf) - 1); + PT_INIT(&s->outputpt); + s->state = STATE_WAITING; + /* timer_set(&s->timer, CLOCK_SECOND * 100);*/ + s->timer = 0; + handle_connection(s); + } else if(s != NULL) { + if(uip_poll()) { + ++s->timer; + if(s->timer >= 20) { + uip_abort(); + } + } else { + s->timer = 0; + } + handle_connection(s); + } else { + uip_abort(); + } +} +/*---------------------------------------------------------------------------*/ +/** + * \brief Initialize the web server + * + * This function initializes the web server and should be + * called at system boot-up. + */ +void +httpd_init(void) +{ + uip_listen(HTONS(80)); +} +/*---------------------------------------------------------------------------*/ +/** @} */ diff --git a/third_party/uip-1.0/apps/webserver/httpd.h b/third_party/uip-1.0/apps/webserver/httpd.h new file mode 100644 index 0000000..7f7a666 --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/httpd.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2001-2005, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: httpd.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ + +#ifndef __HTTPD_H__ +#define __HTTPD_H__ + +#include "psock.h" +#include "httpd-fs.h" + +struct httpd_state { + unsigned char timer; + struct psock sin, sout; + struct pt outputpt, scriptpt; + char inputbuf[50]; + char filename[20]; + char state; + struct httpd_fs_file file; + int len; + char *scriptptr; + int scriptlen; + + unsigned short count; +}; + +void httpd_init(void); +void httpd_appcall(void); + +void httpd_log(char *msg); +void httpd_log_file(u16_t *requester, char *file); + +#endif /* __HTTPD_H__ */ diff --git a/third_party/uip-1.0/apps/webserver/makefsdata b/third_party/uip-1.0/apps/webserver/makefsdata new file mode 100644 index 0000000..8d2715a --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/makefsdata @@ -0,0 +1,78 @@ +#!/usr/bin/perl + +open(OUTPUT, "> httpd-fsdata.c"); + +chdir("httpd-fs"); + +opendir(DIR, "."); +@files = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); +closedir(DIR); + +foreach $file (@files) { + + if(-d $file && $file !~ /^\./) { + print "Processing directory $file\n"; + opendir(DIR, $file); + @newfiles = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); + closedir(DIR); + printf "Adding files @newfiles\n"; + @files = (@files, map { $_ = "$file/$_" } @newfiles); + next; + } +} + +foreach $file (@files) { + if(-f $file) { + + print "Adding file $file\n"; + + open(FILE, $file) || die "Could not open file $file\n"; + + $file =~ s-^-/-; + $fvar = $file; + $fvar =~ s-/-_-g; + $fvar =~ s-\.-_-g; + # for AVR, add PROGMEM here + print(OUTPUT "static const unsigned char data".$fvar."[] = {\n"); + print(OUTPUT "\t/* $file */\n\t"); + for($j = 0; $j < length($file); $j++) { + printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1))); + } + printf(OUTPUT "0,\n"); + + + $i = 0; + while(read(FILE, $data, 1)) { + if($i == 0) { + print(OUTPUT "\t"); + } + printf(OUTPUT "%#02x, ", unpack("C", $data)); + $i++; + if($i == 10) { + print(OUTPUT "\n"); + $i = 0; + } + } + print(OUTPUT "0};\n\n"); + close(FILE); + push(@fvars, $fvar); + push(@pfiles, $file); + } +} + +for($i = 0; $i < @fvars; $i++) { + $file = $pfiles[$i]; + $fvar = $fvars[$i]; + + if($i == 0) { + $prevfile = "NULL"; + } else { + $prevfile = "file" . $fvars[$i - 1]; + } + print(OUTPUT "const struct httpd_fsdata_file file".$fvar."[] = {{$prevfile, data$fvar, "); + print(OUTPUT "data$fvar + ". (length($file) + 1) .", "); + print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n"); +} + +print(OUTPUT "#define HTTPD_FS_ROOT file$fvars[$i - 1]\n\n"); +print(OUTPUT "#define HTTPD_FS_NUMFILES $i\n"); diff --git a/third_party/uip-1.0/apps/webserver/makestrings b/third_party/uip-1.0/apps/webserver/makestrings new file mode 100644 index 0000000..8a13c6d --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/makestrings @@ -0,0 +1,40 @@ +#!/usr/bin/perl + + +sub stringify { + my $name = shift(@_); + open(OUTPUTC, "> $name.c"); + open(OUTPUTH, "> $name.h"); + + open(FILE, "$name"); + + while() { + if(/(.+) "(.+)"/) { + $var = $1; + $data = $2; + + $datan = $data; + $datan =~ s/\\r/\r/g; + $datan =~ s/\\n/\n/g; + $datan =~ s/\\01/\01/g; + $datan =~ s/\\0/\0/g; + + printf(OUTPUTC "const char $var\[%d] = \n", length($datan) + 1); + printf(OUTPUTC "/* \"$data\" */\n"); + printf(OUTPUTC "{"); + for($j = 0; $j < length($datan); $j++) { + printf(OUTPUTC "%#02x, ", unpack("C", substr($datan, $j, 1))); + } + printf(OUTPUTC "};\n"); + + printf(OUTPUTH "extern const char $var\[%d];\n", length($datan) + 1); + + } + } + close(OUTPUTC); + close(OUTPUTH); +} +stringify("http-strings"); + +exit 0; + diff --git a/third_party/uip-1.0/apps/webserver/webserver.h b/third_party/uip-1.0/apps/webserver/webserver.h new file mode 100644 index 0000000..1acb290 --- /dev/null +++ b/third_party/uip-1.0/apps/webserver/webserver.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: webserver.h,v 1.2 2006/06/11 21:46:38 adam Exp $ + * + */ +#ifndef __WEBSERVER_H__ +#define __WEBSERVER_H__ + +#include "httpd.h" + +typedef struct httpd_state uip_tcp_appstate_t; +/* UIP_APPCALL: the name of the application function. This function + must return void and take no arguments (i.e., C type "void + appfunc(void)"). */ +#ifndef UIP_APPCALL +#define UIP_APPCALL httpd_appcall +#endif + + +#endif /* __WEBSERVER_H__ */ diff --git a/third_party/uip-1.0/doc/Doxyfile b/third_party/uip-1.0/doc/Doxyfile new file mode 100644 index 0000000..e7b0397 --- /dev/null +++ b/third_party/uip-1.0/doc/Doxyfile @@ -0,0 +1,279 @@ +# Doxyfile 1.4.6 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = "uIP 1.0" +PROJECT_NUMBER = +OUTPUT_DIRECTORY = . +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = YES +STRIP_FROM_PATH = ../ \ + ../../ +STRIP_FROM_INC_PATH = +SHORT_NAMES = YES +JAVADOC_AUTOBRIEF = YES +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = YES +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 8 +ALIASES = +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +BUILTIN_STL_SUPPORT = NO +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = YES +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = NO +GENERATE_DEPRECATEDLIST= NO +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = NO +SHOW_DIRECTORIES = NO +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = uip-doc.txt \ + pt-doc.txt \ + examples.txt \ + uip-code-style.txt \ + ../uip/uip.h \ + ../uip/uip.c \ + ../uip/uip_arch.h \ + ../uip/uip_arp.h \ + ../uip/uip_arp.c \ + ../unix/uip-conf.h \ + ../uip/uipopt.h \ + ../uip/uip-split.h \ + ../uip/uip-split.c \ + ../uip/uip-neighbor.h \ + ../uip/uip-neighbor.c \ + ../uip/pt.h \ + ../uip/lc.h \ + ../uip/lc-switch.h \ + ../uip/lc-addrlabels.h \ + ../uip/timer.h \ + ../uip/timer.c \ + ../uip/clock.h \ + ../uip/psock.h \ + ../uip/psock.c \ + ../lib/memb.c \ + ../lib/memb.h \ + ../apps/resolv/resolv.h \ + ../apps/resolv/resolv.c \ + ../apps/dhcpc/dhcpc.h \ + ../apps/dhcpc/dhcpc.c \ + ../apps/smtp/smtp.h \ + ../apps/smtp/smtp.c \ + ../apps/telnetd/telnetd.h \ + ../apps/telnetd/telnetd.c \ + ../apps/telnetd/shell.h \ + ../apps/telnetd/shell.c \ + ../apps/hello-world/hello-world.h \ + ../apps/hello-world/hello-world.c \ + ../apps/webclient/webclient.h \ + ../apps/webclient/webclient.c \ + ../apps/webserver/httpd.h \ + ../apps/webserver/httpd-cgi.h \ + ../apps/webserver/httpd-cgi.c \ + ../apps/webserver/httpd.c +FILE_PATTERNS = +RECURSIVE = NO +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = . ../apps/hello-world ../apps/smtp \ + ../apps/telnetd ../apps/resolv ../apps/webclient \ + ../apps/webserver ../unix ../apps/dhcpc +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = YES +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = NO +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +USE_HTAGS = NO +VERBATIM_HEADERS = NO +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = YES +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = YES +BINARY_TOC = YES +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = YES +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = YES +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = header.tex +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = UIP_UDP +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = NO +HIDE_UNDOC_RELATIONS = NO +HAVE_DOT = NO +CLASS_GRAPH = NO +COLLABORATION_GRAPH = NO +GROUP_GRAPHS = NO +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = NO +INCLUDED_BY_GRAPH = NO +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = NO +DIRECTORY_GRAPH = NO +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/third_party/uip-1.0/doc/Makefile b/third_party/uip-1.0/doc/Makefile new file mode 100644 index 0000000..d495453 --- /dev/null +++ b/third_party/uip-1.0/doc/Makefile @@ -0,0 +1,7 @@ +all: htmldoc pdfdoc + +htmldoc: + doxygen Doxyfile + +pdfdoc: htmldoc + cd latex; make refman.pdf && mv refman.pdf ../uip-refman.pdf diff --git a/third_party/uip-1.0/doc/README b/third_party/uip-1.0/doc/README new file mode 100644 index 0000000..46894db --- /dev/null +++ b/third_party/uip-1.0/doc/README @@ -0,0 +1,12 @@ +The files in this directory comprise the uIP documentation. The files +are: + +html/ The uIP reference manual in HTML format. + +uip-refman.pdf The uIP reference manual in a printable PDF version. + +mobisys2003.pdf Conference paper about uIP from the First + International Conference on Mobile Systems, + Applications and Services (MobiSys), San + Francisco, May 2003. + diff --git a/third_party/uip-1.0/doc/doxygen.sty b/third_party/uip-1.0/doc/doxygen.sty new file mode 100644 index 0000000..099e037 --- /dev/null +++ b/third_party/uip-1.0/doc/doxygen.sty @@ -0,0 +1,62 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{doxygen} +\RequirePackage{calc} +\RequirePackage{array} +\pagestyle{fancyplain} +\newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}} +\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}} +\lhead[\fancyplain{}{\bfseries\thepage}] + {\fancyplain{}{\bfseries\rightmark}} +\rhead[\fancyplain{}{\bfseries\leftmark}] + {\fancyplain{}{\bfseries\thepage}} +\rfoot[\fancyplain{}{\bfseries\scriptsize Generated on Wed Jun 7 11:37:14 2006 for uIP 1.0-rc0 by doxygen\lfoot[]{\fancyplain{}{\bfseries\scriptsize Generated on Wed Jun 7 11:37:14 2006 for uIP 1.0-rc0 by doxygen}} +\cfoot{} +\newenvironment{CompactList} +{\begin{list}{}{ + \setlength{\leftmargin}{0.5cm} + \setlength{\itemsep}{0pt} + \setlength{\parsep}{0pt} + \setlength{\topsep}{0pt} + \renewcommand{\makelabel}{}}} +{\end{list}} +\newenvironment{CompactItemize} +{ + \begin{itemize} + \setlength{\itemsep}{-3pt} + \setlength{\parsep}{0pt} + \setlength{\topsep}{0pt} + \setlength{\partopsep}{0pt} +} +{\end{itemize}} +\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp} +\newlength{\tmplength} +\newenvironment{TabularC}[1] +{ +\setlength{\tmplength} + {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)} + \par\begin{tabular*}{\linewidth} + {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|} +} +{\end{tabular*}\par} +\newcommand{\entrylabel}[1]{ + {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\\}}} +\newenvironment{Desc} +{\begin{list}{} + { + \settowidth{\labelwidth}{40pt} + \setlength{\leftmargin}{\labelwidth} + \setlength{\parsep}{0pt} + \setlength{\itemsep}{-4pt} + \renewcommand{\makelabel}{\entrylabel} + } +} +{\end{list}} +\newenvironment{Indent} + {\begin{list}{}{\setlength{\leftmargin}{0.5cm}} + \item[]\ignorespaces} + {\unskip\end{list}} +\setlength{\parindent}{0cm} +\setlength{\parskip}{0.2cm} +\addtocounter{secnumdepth}{1} +\sloppy +\usepackage[T1]{fontenc} diff --git a/third_party/uip-1.0/doc/example-mainloop-with-arp.c b/third_party/uip-1.0/doc/example-mainloop-with-arp.c new file mode 100644 index 0000000..03df5fb --- /dev/null +++ b/third_party/uip-1.0/doc/example-mainloop-with-arp.c @@ -0,0 +1,86 @@ +#include "uip.h" +#include "uip_arp.h" +#include "network-device.h" +#include "httpd.h" +#include "timer.h" + +#define BUF ((struct uip_eth_hdr *)&uip_buf[0]) + +/*---------------------------------------------------------------------------*/ +int +main(void) +{ + int i; + uip_ipaddr_t ipaddr; + struct timer periodic_timer, arp_timer; + + timer_set(&periodic_timer, CLOCK_SECOND / 2); + timer_set(&arp_timer, CLOCK_SECOND * 10); + + network_device_init(); + uip_init(); + + uip_ipaddr(ipaddr, 192,168,0,2); + uip_sethostaddr(ipaddr); + + httpd_init(); + + while(1) { + uip_len = network_device_read(); + if(uip_len > 0) { + if(BUF->type == htons(UIP_ETHTYPE_IP)) { + uip_arp_ipin(); + uip_input(); + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if(uip_len > 0) { + uip_arp_out(); + network_device_send(); + } + } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) { + uip_arp_arpin(); + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if(uip_len > 0) { + network_device_send(); + } + } + + } else if(timer_expired(&periodic_timer)) { + timer_reset(&periodic_timer); + for(i = 0; i < UIP_CONNS; i++) { + uip_periodic(i); + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if(uip_len > 0) { + uip_arp_out(); + network_device_send(); + } + } + +#if UIP_UDP + for(i = 0; i < UIP_UDP_CONNS; i++) { + uip_udp_periodic(i); + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if(uip_len > 0) { + uip_arp_out(); + network_device_send(); + } + } +#endif /* UIP_UDP */ + + /* Call the ARP timer function every 10 seconds. */ + if(timer_expired(&arp_timer)) { + timer_reset(&arp_timer); + uip_arp_timer(); + } + } + } + return 0; +} +/*---------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/doc/example-mainloop-without-arp.c b/third_party/uip-1.0/doc/example-mainloop-without-arp.c new file mode 100644 index 0000000..acc3e95 --- /dev/null +++ b/third_party/uip-1.0/doc/example-mainloop-without-arp.c @@ -0,0 +1,62 @@ +#include "uip.h" +#include "uip_arp.h" +#include "network-device.h" +#include "httpd.h" +#include "timer.h" + +/*---------------------------------------------------------------------------*/ +int +main(void) +{ + int i; + uip_ipaddr_t ipaddr; + struct timer periodic_timer; + + timer_set(&periodic_timer, CLOCK_SECOND / 2); + + network_device_init(); + uip_init(); + + uip_ipaddr(ipaddr, 192,168,0,2); + uip_sethostaddr(ipaddr); + + httpd_init(); + + while(1) { + uip_len = network_device_read(); + if(uip_len > 0) { + uip_input(); + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if(uip_len > 0) { + network_device_send(); + } + } else if(timer_expired(&periodic_timer)) { + timer_reset(&periodic_timer); + for(i = 0; i < UIP_CONNS; i++) { + uip_periodic(i); + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if(uip_len > 0) { + network_device_send(); + } + } + +#if UIP_UDP + for(i = 0; i < UIP_UDP_CONNS; i++) { + uip_udp_periodic(i); + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if(uip_len > 0) { + network_device_send(); + } + } +#endif /* UIP_UDP */ + } + } + return 0; +} +/*---------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/doc/examples.txt b/third_party/uip-1.0/doc/examples.txt new file mode 100644 index 0000000..ec509d7 --- /dev/null +++ b/third_party/uip-1.0/doc/examples.txt @@ -0,0 +1,34 @@ +/** +\defgroup apps Applications +@{ + +The uIP distribution contains a number of example applications that +can be either used directory or studied when learning to develop +applications for uIP. + +*/ + +/** \example hello-world.c */ +/** \example hello-world.h */ + +/** \example smtp.c */ +/** \example smtp.h */ + +/** \example webclient.c */ +/** \example webclient.h */ + +/** \example example-mainloop-with-arp.c */ +/** \example example-mainloop-without-arp.c */ + +/** \example telnetd.c */ +/** \example telnetd.h */ + +/** \example resolv.c */ +/** \example resolv.h */ + +/** \example dhcpc.c */ +/** \example dhcpc.h */ + +/** \example uip-conf.h */ + +/** @} */ diff --git a/third_party/uip-1.0/doc/header.tex b/third_party/uip-1.0/doc/header.tex new file mode 100644 index 0000000..56121cc --- /dev/null +++ b/third_party/uip-1.0/doc/header.tex @@ -0,0 +1,53 @@ +\documentclass[a4paper]{book} +\usepackage{a4wide} +\usepackage{makeidx} +\usepackage{fancyhdr} +\usepackage{graphicx} +\usepackage{multicol} +\usepackage{float} +\usepackage{textcomp} +\usepackage{alltt} +\usepackage{times} +\ifx\pdfoutput\undefined +\usepackage[ps2pdf, + pagebackref=true, + colorlinks=true, + linkcolor=blue + ]{hyperref} +\usepackage{pspicture} +\else +\usepackage[pdftex, + pagebackref=true, + colorlinks=true, + linkcolor=blue + ]{hyperref} +\fi +\usepackage{doxygen} +\makeindex +\setcounter{tocdepth}{1} +\renewcommand{\footrulewidth}{0.4pt} +\begin{document} +\begin{titlepage} +\vspace*{5cm} +\begin{center} +{\Huge The uIP Embedded TCP/IP Stack}\\ +\vspace*{1cm} +{\LARGE The uIP 1.0 Reference Manual}\\ +\vspace*{3cm} +{\Large June 2006}\\ +\vspace*{2cm} +\includegraphics[width=6cm]{../sicslogo.pdf}\\ +\vspace*{1cm} +{\Large Adam Dunkels}\\ +{\Large \texttt{adam@sics.se}}\\ +\vspace*{1cm} +{\LARGE Swedish Institute of Computer Science}\\ +\vspace*{0.5cm} + +\end{center} +\end{titlepage} +\clearemptydoublepage +\pagenumbering{roman} +\tableofcontents +\clearemptydoublepage +\pagenumbering{arabic} diff --git a/third_party/uip-1.0/doc/html/a00036.html b/third_party/uip-1.0/doc/html/a00036.html new file mode 100644 index 0000000..fdef4e3 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00036.html @@ -0,0 +1,120 @@ + + +uIP 1.0: hello-world.c + + + + + +

hello-world.c

00001 /**
+00002  * \addtogroup helloworld
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \file
+00008  *         An example of how to write uIP applications
+00009  *         with protosockets.
+00010  * \author
+00011  *         Adam Dunkels <adam@sics.se>
+00012  */
+00013 
+00014 /*
+00015  * This is a short example of how to write uIP applications using
+00016  * protosockets.
+00017  */
+00018 
+00019 /*
+00020  * We define the application state (struct hello_world_state) in the
+00021  * hello-world.h file, so we need to include it here. We also include
+00022  * uip.h (since this cannot be included in hello-world.h) and
+00023  * <string.h>, since we use the memcpy() function in the code.
+00024  */
+00025 #include "hello-world.h"
+00026 #include "uip.h"
+00027 #include <string.h>
+00028 
+00029 /*
+00030  * Declaration of the protosocket function that handles the connection
+00031  * (defined at the end of the code).
+00032  */
+00033 static int handle_connection(struct hello_world_state *s);
+00034 /*---------------------------------------------------------------------------*/
+00035 /*
+00036  * The initialization function. We must explicitly call this function
+00037  * from the system initialization code, some time after uip_init() is
+00038  * called.
+00039  */
+00040 void
+00041 hello_world_init(void)
+00042 {
+00043   /* We start to listen for connections on TCP port 1000. */
+00044   uip_listen(HTONS(1000));
+00045 }
+00046 /*---------------------------------------------------------------------------*/
+00047 /*
+00048  * In hello-world.h we have defined the UIP_APPCALL macro to
+00049  * hello_world_appcall so that this funcion is uIP's application
+00050  * function. This function is called whenever an uIP event occurs
+00051  * (e.g. when a new connection is established, new data arrives, sent
+00052  * data is acknowledged, data needs to be retransmitted, etc.).
+00053  */
+00054 void
+00055 hello_world_appcall(void)
+00056 {
+00057   /*
+00058    * The uip_conn structure has a field called "appstate" that holds
+00059    * the application state of the connection. We make a pointer to
+00060    * this to access it easier.
+00061    */
+00062   struct hello_world_state *s = &(uip_conn->appstate);
+00063 
+00064   /*
+00065    * If a new connection was just established, we should initialize
+00066    * the protosocket in our applications' state structure.
+00067    */
+00068   if(uip_connected()) {
+00069     PSOCK_INIT(&s->p, s->inputbuffer, sizeof(s->inputbuffer));
+00070   }
+00071 
+00072   /*
+00073    * Finally, we run the protosocket function that actually handles
+00074    * the communication. We pass it a pointer to the application state
+00075    * of the current connection.
+00076    */
+00077   handle_connection(s);
+00078 }
+00079 /*---------------------------------------------------------------------------*/
+00080 /*
+00081  * This is the protosocket function that handles the communication. A
+00082  * protosocket function must always return an int, but must never
+00083  * explicitly return - all return statements are hidden in the PSOCK
+00084  * macros.
+00085  */
+00086 static int
+00087 handle_connection(struct hello_world_state *s)
+00088 {
+00089   PSOCK_BEGIN(&s->p);
+00090 
+00091   PSOCK_SEND_STR(&s->p, "Hello. What is your name?\n");
+00092   PSOCK_READTO(&s->p, '\n');
+00093   strncpy(s->name, s->inputbuffer, sizeof(s->name));
+00094   PSOCK_SEND_STR(&s->p, "Hello ");
+00095   PSOCK_SEND_STR(&s->p, s->name);
+00096   PSOCK_CLOSE(&s->p);
+00097   
+00098   PSOCK_END(&s->p);
+00099 }
+00100 /*---------------------------------------------------------------------------*/
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00037.html b/third_party/uip-1.0/doc/html/a00037.html new file mode 100644 index 0000000..243168a --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00037.html @@ -0,0 +1,72 @@ + + +uIP 1.0: hello-world.h + + + + + +

hello-world.h

00001 /**
+00002  * \addtogroup apps
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \defgroup helloworld Hello, world
+00008  * @{
+00009  *
+00010  * A small example showing how to write applications with
+00011  * \ref psock "protosockets".
+00012  */
+00013 
+00014 /**
+00015  * \file
+00016  *         Header file for an example of how to write uIP applications
+00017  *         with protosockets.
+00018  * \author
+00019  *         Adam Dunkels <adam@sics.se>
+00020  */
+00021 
+00022 #ifndef __HELLO_WORLD_H__
+00023 #define __HELLO_WORLD_H__
+00024 
+00025 /* Since this file will be included by uip.h, we cannot include uip.h
+00026    here. But we might need to include uipopt.h if we need the u8_t and
+00027    u16_t datatypes. */
+00028 #include "uipopt.h"
+00029 
+00030 #include "psock.h"
+00031 
+00032 /* Next, we define the uip_tcp_appstate_t datatype. This is the state
+00033    of our application, and the memory required for this state is
+00034    allocated together with each TCP connection. One application state
+00035    for each TCP connection. */
+00036 typedef struct hello_world_state {
+00037   struct psock p;
+00038   char inputbuffer[10];
+00039   char name[40];
+00040 } uip_tcp_appstate_t;
+00041 
+00042 /* Finally we define the application function to be called by uIP. */
+00043 void hello_world_appcall(void);
+00044 #ifndef UIP_APPCALL
+00045 #define UIP_APPCALL hello_world_appcall
+00046 #endif /* UIP_APPCALL */
+00047 
+00048 void hello_world_init(void);
+00049 
+00050 #endif /* __HELLO_WORLD_H__ */
+00051 /** @} */
+00052 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00038.html b/third_party/uip-1.0/doc/html/a00038.html new file mode 100644 index 0000000..e0621cb --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00038.html @@ -0,0 +1,282 @@ + + +uIP 1.0: smtp.c + + + + + +

smtp.c

00001 /**
+00002  * \addtogroup apps
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \defgroup smtp SMTP E-mail sender
+00008  * @{
+00009  *
+00010  * The Simple Mail Transfer Protocol (SMTP) as defined by RFC821 is
+00011  * the standard way of sending and transfering e-mail on the
+00012  * Internet. This simple example implementation is intended as an
+00013  * example of how to implement protocols in uIP, and is able to send
+00014  * out e-mail but has not been extensively tested.
+00015  */
+00016 
+00017 /**
+00018  * \file
+00019  * SMTP example implementation
+00020  * \author Adam Dunkels <adam@dunkels.com>
+00021  */
+00022 
+00023 /*
+00024  * Copyright (c) 2004, Adam Dunkels.
+00025  * All rights reserved.
+00026  *
+00027  * Redistribution and use in source and binary forms, with or without
+00028  * modification, are permitted provided that the following conditions
+00029  * are met:
+00030  * 1. Redistributions of source code must retain the above copyright
+00031  *    notice, this list of conditions and the following disclaimer.
+00032  * 2. Redistributions in binary form must reproduce the above copyright
+00033  *    notice, this list of conditions and the following disclaimer in the
+00034  *    documentation and/or other materials provided with the distribution.
+00035  * 3. Neither the name of the Institute nor the names of its contributors
+00036  *    may be used to endorse or promote products derived from this software
+00037  *    without specific prior written permission.
+00038  *
+00039  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00040  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00041  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00042  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00043  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00044  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00045  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00046  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00047  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00048  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00049  * SUCH DAMAGE.
+00050  *
+00051  * This file is part of the uIP TCP/IP stack.
+00052  *
+00053  * Author: Adam Dunkels <adam@sics.se>
+00054  *
+00055  * $Id: smtp.c,v 1.4 2006/06/11 21:46:37 adam Exp $
+00056  */
+00057 #include "smtp.h"
+00058 
+00059 #include "smtp-strings.h"
+00060 #include "psock.h"
+00061 #include "uip.h"
+00062 
+00063 #include <string.h>
+00064 
+00065 static struct smtp_state s;
+00066 
+00067 static char *localhostname;
+00068 static uip_ipaddr_t smtpserver;
+00069 
+00070 #define ISO_nl 0x0a
+00071 #define ISO_cr 0x0d
+00072 
+00073 #define ISO_period 0x2e
+00074 
+00075 #define ISO_2  0x32
+00076 #define ISO_3  0x33
+00077 #define ISO_4  0x34
+00078 #define ISO_5  0x35
+00079 
+00080 
+00081 /*---------------------------------------------------------------------------*/
+00082 static
+00083 PT_THREAD(smtp_thread(void))
+00084 {
+00085   PSOCK_BEGIN(&s.psock);
+00086 
+00087   PSOCK_READTO(&s.psock, ISO_nl);
+00088    
+00089   if(strncmp(s.inputbuffer, smtp_220, 3) != 0) {
+00090     PSOCK_CLOSE(&s.psock);
+00091     smtp_done(2);
+00092     PSOCK_EXIT(&s.psock);
+00093   }
+00094   
+00095   PSOCK_SEND_STR(&s.psock, (char *)smtp_helo);
+00096   PSOCK_SEND_STR(&s.psock, localhostname);
+00097   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00098 
+00099   PSOCK_READTO(&s.psock, ISO_nl);
+00100   
+00101   if(s.inputbuffer[0] != ISO_2) {
+00102     PSOCK_CLOSE(&s.psock);
+00103     smtp_done(3);
+00104     PSOCK_EXIT(&s.psock);
+00105   }
+00106 
+00107   PSOCK_SEND_STR(&s.psock, (char *)smtp_mail_from);
+00108   PSOCK_SEND_STR(&s.psock, s.from);
+00109   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00110 
+00111   PSOCK_READTO(&s.psock, ISO_nl);
+00112   
+00113   if(s.inputbuffer[0] != ISO_2) {
+00114     PSOCK_CLOSE(&s.psock);
+00115     smtp_done(4);
+00116     PSOCK_EXIT(&s.psock);
+00117   }
+00118 
+00119   PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to);
+00120   PSOCK_SEND_STR(&s.psock, s.to);
+00121   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00122 
+00123   PSOCK_READTO(&s.psock, ISO_nl);
+00124   
+00125   if(s.inputbuffer[0] != ISO_2) {
+00126     PSOCK_CLOSE(&s.psock);
+00127     smtp_done(5);
+00128     PSOCK_EXIT(&s.psock);
+00129   }
+00130   
+00131   if(s.cc != 0) {
+00132     PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to);
+00133     PSOCK_SEND_STR(&s.psock, s.cc);
+00134     PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00135 
+00136     PSOCK_READTO(&s.psock, ISO_nl);
+00137   
+00138     if(s.inputbuffer[0] != ISO_2) {
+00139       PSOCK_CLOSE(&s.psock);
+00140       smtp_done(6);
+00141       PSOCK_EXIT(&s.psock);
+00142     }
+00143   }
+00144   
+00145   PSOCK_SEND_STR(&s.psock, (char *)smtp_data);
+00146   
+00147   PSOCK_READTO(&s.psock, ISO_nl);
+00148   
+00149   if(s.inputbuffer[0] != ISO_3) {
+00150     PSOCK_CLOSE(&s.psock);
+00151     smtp_done(7);
+00152     PSOCK_EXIT(&s.psock);
+00153   }
+00154 
+00155   PSOCK_SEND_STR(&s.psock, (char *)smtp_to);
+00156   PSOCK_SEND_STR(&s.psock, s.to);
+00157   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00158   
+00159   if(s.cc != 0) {
+00160     PSOCK_SEND_STR(&s.psock, (char *)smtp_cc);
+00161     PSOCK_SEND_STR(&s.psock, s.cc);
+00162     PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00163   }
+00164   
+00165   PSOCK_SEND_STR(&s.psock, (char *)smtp_from);
+00166   PSOCK_SEND_STR(&s.psock, s.from);
+00167   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00168   
+00169   PSOCK_SEND_STR(&s.psock, (char *)smtp_subject);
+00170   PSOCK_SEND_STR(&s.psock, s.subject);
+00171   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00172 
+00173   PSOCK_SEND(&s.psock, s.msg, s.msglen);
+00174   
+00175   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnlperiodcrnl);
+00176 
+00177   PSOCK_READTO(&s.psock, ISO_nl);
+00178   if(s.inputbuffer[0] != ISO_2) {
+00179     PSOCK_CLOSE(&s.psock);
+00180     smtp_done(8);
+00181     PSOCK_EXIT(&s.psock);
+00182   }
+00183 
+00184   PSOCK_SEND_STR(&s.psock, (char *)smtp_quit);
+00185   smtp_done(SMTP_ERR_OK);
+00186   PSOCK_END(&s.psock);
+00187 }
+00188 /*---------------------------------------------------------------------------*/
+00189 void
+00190 smtp_appcall(void)
+00191 {
+00192   if(uip_closed()) {
+00193     s.connected = 0;
+00194     return;
+00195   }
+00196   if(uip_aborted() || uip_timedout()) {
+00197     s.connected = 0;
+00198     smtp_done(1);
+00199     return;
+00200   }
+00201   smtp_thread();
+00202 }
+00203 /*---------------------------------------------------------------------------*/
+00204 /**
+00205  * Specificy an SMTP server and hostname.
+00206  *
+00207  * This function is used to configure the SMTP module with an SMTP
+00208  * server and the hostname of the host.
+00209  *
+00210  * \param lhostname The hostname of the uIP host.
+00211  *
+00212  * \param server A pointer to a 4-byte array representing the IP
+00213  * address of the SMTP server to be configured.
+00214  */
+00215 void
+00216 smtp_configure(char *lhostname, void *server)
+00217 {
+00218   localhostname = lhostname;
+00219   uip_ipaddr_copy(smtpserver, server);
+00220 }
+00221 /*---------------------------------------------------------------------------*/
+00222 /**
+00223  * Send an e-mail.
+00224  *
+00225  * \param to The e-mail address of the receiver of the e-mail.
+00226  * \param cc The e-mail address of the CC: receivers of the e-mail.
+00227  * \param from The e-mail address of the sender of the e-mail.
+00228  * \param subject The subject of the e-mail.
+00229  * \param msg The actual e-mail message.
+00230  * \param msglen The length of the e-mail message.
+00231  */
+00232 unsigned char
+00233 smtp_send(char *to, char *cc, char *from,
+00234           char *subject, char *msg, u16_t msglen)
+00235 {
+00236   struct uip_conn *conn;
+00237 
+00238   conn = uip_connect(smtpserver, HTONS(25));
+00239   if(conn == NULL) {
+00240     return 0;
+00241   }
+00242   s.connected = 1;
+00243   s.to = to;
+00244   s.cc = cc;
+00245   s.from = from;
+00246   s.subject = subject;
+00247   s.msg = msg;
+00248   s.msglen = msglen;
+00249 
+00250   PSOCK_INIT(&s.psock, s.inputbuffer, sizeof(s.inputbuffer));
+00251   
+00252   return 1;
+00253 }
+00254 /*---------------------------------------------------------------------------*/
+00255 void
+00256 smtp_init(void)
+00257 {
+00258   s.connected = 0;
+00259 }
+00260 /*---------------------------------------------------------------------------*/
+00261 /** @} */
+00262 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00039.html b/third_party/uip-1.0/doc/html/a00039.html new file mode 100644 index 0000000..04b8dfe --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00039.html @@ -0,0 +1,123 @@ + + +uIP 1.0: smtp.h + + + + + +

smtp.h

00001 
+00002 /**
+00003  * \addtogroup smtp
+00004  * @{
+00005  */
+00006 
+00007 
+00008 /**
+00009  * \file
+00010  * SMTP header file
+00011  * \author Adam Dunkels <adam@dunkels.com>
+00012  */
+00013 
+00014 /*
+00015  * Copyright (c) 2002, Adam Dunkels.
+00016  * All rights reserved.
+00017  *
+00018  * Redistribution and use in source and binary forms, with or without
+00019  * modification, are permitted provided that the following conditions
+00020  * are met:
+00021  * 1. Redistributions of source code must retain the above copyright
+00022  *    notice, this list of conditions and the following disclaimer.
+00023  * 2. Redistributions in binary form must reproduce the above copyright
+00024  *    notice, this list of conditions and the following disclaimer in the
+00025  *    documentation and/or other materials provided with the distribution.
+00026  * 3. The name of the author may not be used to endorse or promote
+00027  *    products derived from this software without specific prior
+00028  *    written permission.
+00029  *
+00030  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00031  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00032  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00033  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00034  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00035  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00036  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00037  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00038  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00039  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00040  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00041  *
+00042  * This file is part of the uIP TCP/IP stack.
+00043  *
+00044  * $Id: smtp.h,v 1.4 2006/06/11 21:46:37 adam Exp $
+00045  *
+00046  */
+00047 #ifndef __SMTP_H__
+00048 #define __SMTP_H__
+00049 
+00050 #include "uipopt.h"
+00051 
+00052 /**
+00053  * Error number that signifies a non-error condition.
+00054  */
+00055 #define SMTP_ERR_OK 0
+00056 
+00057 /**
+00058  * Callback function that is called when an e-mail transmission is
+00059  * done.
+00060  *
+00061  * This function must be implemented by the module that uses the SMTP
+00062  * module.
+00063  *
+00064  * \param error The number of the error if an error occured, or
+00065  * SMTP_ERR_OK.
+00066  */
+00067 void smtp_done(unsigned char error);
+00068 
+00069 void smtp_init(void);
+00070 
+00071 /* Functions. */
+00072 void smtp_configure(char *localhostname, u16_t *smtpserver);
+00073 unsigned char smtp_send(char *to, char *from,
+00074                         char *subject, char *msg,
+00075                         u16_t msglen);
+00076 #define SMTP_SEND(to, cc, from, subject, msg) \
+00077         smtp_send(to, cc, from, subject, msg, strlen(msg))
+00078 
+00079 void smtp_appcall(void);
+00080 
+00081 struct smtp_state {
+00082   u8_t state;
+00083   char *to;
+00084   char *from;
+00085   char *subject;
+00086   char *msg;
+00087   u16_t msglen;
+00088   
+00089   u16_t sentlen, textlen;
+00090   u16_t sendptr;
+00091 
+00092 };
+00093 
+00094 
+00095 #ifndef UIP_APPCALL
+00096 #define UIP_APPCALL     smtp_appcall
+00097 #endif
+00098 typedef struct smtp_state uip_tcp_appstate_t;
+00099 
+00100 
+00101 #endif /* __SMTP_H__ */
+00102 
+00103 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00040.html b/third_party/uip-1.0/doc/html/a00040.html new file mode 100644 index 0000000..c5d2eb8 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00040.html @@ -0,0 +1,459 @@ + + +uIP 1.0: webclient.c + + + + + +

webclient.c

00001 /**
+00002  * \addtogroup apps
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \defgroup webclient Web client
+00008  * @{
+00009  *
+00010  * This example shows a HTTP client that is able to download web pages
+00011  * and files from web servers. It requires a number of callback
+00012  * functions to be implemented by the module that utilizes the code:
+00013  * webclient_datahandler(), webclient_connected(),
+00014  * webclient_timedout(), webclient_aborted(), webclient_closed().
+00015  */
+00016 
+00017 /**
+00018  * \file
+00019  * Implementation of the HTTP client.
+00020  * \author Adam Dunkels <adam@dunkels.com>
+00021  */
+00022 
+00023 /*
+00024  * Copyright (c) 2002, Adam Dunkels.
+00025  * All rights reserved.
+00026  *
+00027  * Redistribution and use in source and binary forms, with or without
+00028  * modification, are permitted provided that the following conditions
+00029  * are met:
+00030  * 1. Redistributions of source code must retain the above copyright
+00031  *    notice, this list of conditions and the following disclaimer.
+00032  * 2. Redistributions in binary form must reproduce the above
+00033  *    copyright notice, this list of conditions and the following
+00034  *    disclaimer in the documentation and/or other materials provided
+00035  *    with the distribution.
+00036  * 3. The name of the author may not be used to endorse or promote
+00037  *    products derived from this software without specific prior
+00038  *    written permission.
+00039  *
+00040  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00041  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00042  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00043  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00044  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00045  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00046  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00047  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00048  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00049  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00050  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00051  *
+00052  * This file is part of the uIP TCP/IP stack.
+00053  *
+00054  * $Id: webclient.c,v 1.2 2006/06/11 21:46:37 adam Exp $
+00055  *
+00056  */
+00057 
+00058 #include "uip.h"
+00059 #include "uiplib.h"
+00060 #include "webclient.h"
+00061 #include "resolv.h"
+00062 
+00063 #include <string.h>
+00064 
+00065 #define WEBCLIENT_TIMEOUT 100
+00066 
+00067 #define WEBCLIENT_STATE_STATUSLINE 0
+00068 #define WEBCLIENT_STATE_HEADERS    1
+00069 #define WEBCLIENT_STATE_DATA       2
+00070 #define WEBCLIENT_STATE_CLOSE      3
+00071 
+00072 #define HTTPFLAG_NONE   0
+00073 #define HTTPFLAG_OK     1
+00074 #define HTTPFLAG_MOVED  2
+00075 #define HTTPFLAG_ERROR  3
+00076 
+00077 
+00078 #define ISO_nl       0x0a
+00079 #define ISO_cr       0x0d
+00080 #define ISO_space    0x20
+00081 
+00082 
+00083 static struct webclient_state s;
+00084 
+00085 /*-----------------------------------------------------------------------------------*/
+00086 char *
+00087 webclient_mimetype(void)
+00088 {
+00089   return s.mimetype;
+00090 }
+00091 /*-----------------------------------------------------------------------------------*/
+00092 char *
+00093 webclient_filename(void)
+00094 {
+00095   return s.file;
+00096 }
+00097 /*-----------------------------------------------------------------------------------*/
+00098 char *
+00099 webclient_hostname(void)
+00100 {
+00101   return s.host;
+00102 }
+00103 /*-----------------------------------------------------------------------------------*/
+00104 unsigned short
+00105 webclient_port(void)
+00106 {
+00107   return s.port;
+00108 }
+00109 /*-----------------------------------------------------------------------------------*/
+00110 void
+00111 webclient_init(void)
+00112 {
+00113 
+00114 }
+00115 /*-----------------------------------------------------------------------------------*/
+00116 static void
+00117 init_connection(void)
+00118 {
+00119   s.state = WEBCLIENT_STATE_STATUSLINE;
+00120 
+00121   s.getrequestleft = sizeof(http_get) - 1 + 1 +
+00122     sizeof(http_10) - 1 +
+00123     sizeof(http_crnl) - 1 +
+00124     sizeof(http_host) - 1 +
+00125     sizeof(http_crnl) - 1 +
+00126     strlen(http_user_agent_fields) +
+00127     strlen(s.file) + strlen(s.host);
+00128   s.getrequestptr = 0;
+00129 
+00130   s.httpheaderlineptr = 0;
+00131 }
+00132 /*-----------------------------------------------------------------------------------*/
+00133 void
+00134 webclient_close(void)
+00135 {
+00136   s.state = WEBCLIENT_STATE_CLOSE;
+00137 }
+00138 /*-----------------------------------------------------------------------------------*/
+00139 unsigned char
+00140 webclient_get(char *host, u16_t port, char *file)
+00141 {
+00142   struct uip_conn *conn;
+00143   uip_ipaddr_t *ipaddr;
+00144   static uip_ipaddr_t addr;
+00145   
+00146   /* First check if the host is an IP address. */
+00147   ipaddr = &addr;
+00148   if(uiplib_ipaddrconv(host, (unsigned char *)addr) == 0) {
+00149     ipaddr = (uip_ipaddr_t *)resolv_lookup(host);
+00150     
+00151     if(ipaddr == NULL) {
+00152       return 0;
+00153     }
+00154   }
+00155   
+00156   conn = uip_connect(ipaddr, htons(port));
+00157   
+00158   if(conn == NULL) {
+00159     return 0;
+00160   }
+00161   
+00162   s.port = port;
+00163   strncpy(s.file, file, sizeof(s.file));
+00164   strncpy(s.host, host, sizeof(s.host));
+00165   
+00166   init_connection();
+00167   return 1;
+00168 }
+00169 /*-----------------------------------------------------------------------------------*/
+00170 static unsigned char *
+00171 copy_string(unsigned char *dest,
+00172             const unsigned char *src, unsigned char len)
+00173 {
+00174   strncpy(dest, src, len);
+00175   return dest + len;
+00176 }
+00177 /*-----------------------------------------------------------------------------------*/
+00178 static void
+00179 senddata(void)
+00180 {
+00181   u16_t len;
+00182   char *getrequest;
+00183   char *cptr;
+00184   
+00185   if(s.getrequestleft > 0) {
+00186     cptr = getrequest = (char *)uip_appdata;
+00187 
+00188     cptr = copy_string(cptr, http_get, sizeof(http_get) - 1);
+00189     cptr = copy_string(cptr, s.file, strlen(s.file));
+00190     *cptr++ = ISO_space;
+00191     cptr = copy_string(cptr, http_10, sizeof(http_10) - 1);
+00192 
+00193     cptr = copy_string(cptr, http_crnl, sizeof(http_crnl) - 1);
+00194     
+00195     cptr = copy_string(cptr, http_host, sizeof(http_host) - 1);
+00196     cptr = copy_string(cptr, s.host, strlen(s.host));
+00197     cptr = copy_string(cptr, http_crnl, sizeof(http_crnl) - 1);
+00198 
+00199     cptr = copy_string(cptr, http_user_agent_fields,
+00200                        strlen(http_user_agent_fields));
+00201     
+00202     len = s.getrequestleft > uip_mss()?
+00203       uip_mss():
+00204       s.getrequestleft;
+00205     uip_send(&(getrequest[s.getrequestptr]), len);
+00206   }
+00207 }
+00208 /*-----------------------------------------------------------------------------------*/
+00209 static void
+00210 acked(void)
+00211 {
+00212   u16_t len;
+00213   
+00214   if(s.getrequestleft > 0) {
+00215     len = s.getrequestleft > uip_mss()?
+00216       uip_mss():
+00217       s.getrequestleft;
+00218     s.getrequestleft -= len;
+00219     s.getrequestptr += len;
+00220   }
+00221 }
+00222 /*-----------------------------------------------------------------------------------*/
+00223 static u16_t
+00224 parse_statusline(u16_t len)
+00225 {
+00226   char *cptr;
+00227   
+00228   while(len > 0 && s.httpheaderlineptr < sizeof(s.httpheaderline)) {
+00229     s.httpheaderline[s.httpheaderlineptr] = *(char *)uip_appdata;
+00230     ++((char *)uip_appdata);
+00231     --len;
+00232     if(s.httpheaderline[s.httpheaderlineptr] == ISO_nl) {
+00233 
+00234       if((strncmp(s.httpheaderline, http_10,
+00235                   sizeof(http_10) - 1) == 0) ||
+00236          (strncmp(s.httpheaderline, http_11,
+00237                   sizeof(http_11) - 1) == 0)) {
+00238         cptr = &(s.httpheaderline[9]);
+00239         s.httpflag = HTTPFLAG_NONE;
+00240         if(strncmp(cptr, http_200, sizeof(http_200) - 1) == 0) {
+00241           /* 200 OK */
+00242           s.httpflag = HTTPFLAG_OK;
+00243         } else if(strncmp(cptr, http_301, sizeof(http_301) - 1) == 0 ||
+00244                   strncmp(cptr, http_302, sizeof(http_302) - 1) == 0) {
+00245           /* 301 Moved permanently or 302 Found. Location: header line
+00246              will contain thw new location. */
+00247           s.httpflag = HTTPFLAG_MOVED;
+00248         } else {
+00249           s.httpheaderline[s.httpheaderlineptr - 1] = 0;
+00250         }
+00251       } else {
+00252         uip_abort();
+00253         webclient_aborted();
+00254         return 0;
+00255       }
+00256       
+00257       /* We're done parsing the status line, so we reset the pointer
+00258          and start parsing the HTTP headers.*/
+00259       s.httpheaderlineptr = 0;
+00260       s.state = WEBCLIENT_STATE_HEADERS;
+00261       break;
+00262     } else {
+00263       ++s.httpheaderlineptr;
+00264     }
+00265   }
+00266   return len;
+00267 }
+00268 /*-----------------------------------------------------------------------------------*/
+00269 static char
+00270 casecmp(char *str1, const char *str2, char len)
+00271 {
+00272   static char c;
+00273   
+00274   while(len > 0) {
+00275     c = *str1;
+00276     /* Force lower-case characters. */
+00277     if(c & 0x40) {
+00278       c |= 0x20;
+00279     }
+00280     if(*str2 != c) {
+00281       return 1;
+00282     }
+00283     ++str1;
+00284     ++str2;
+00285     --len;
+00286   }
+00287   return 0;
+00288 }
+00289 /*-----------------------------------------------------------------------------------*/
+00290 static u16_t
+00291 parse_headers(u16_t len)
+00292 {
+00293   char *cptr;
+00294   static unsigned char i;
+00295   
+00296   while(len > 0 && s.httpheaderlineptr < sizeof(s.httpheaderline)) {
+00297     s.httpheaderline[s.httpheaderlineptr] = *(char *)uip_appdata;
+00298     ++((char *)uip_appdata);
+00299     --len;
+00300     if(s.httpheaderline[s.httpheaderlineptr] == ISO_nl) {
+00301       /* We have an entire HTTP header line in s.httpheaderline, so
+00302          we parse it. */
+00303       if(s.httpheaderline[0] == ISO_cr) {
+00304         /* This was the last header line (i.e., and empty "\r\n"), so
+00305            we are done with the headers and proceed with the actual
+00306            data. */
+00307         s.state = WEBCLIENT_STATE_DATA;
+00308         return len;
+00309       }
+00310 
+00311       s.httpheaderline[s.httpheaderlineptr - 1] = 0;
+00312       /* Check for specific HTTP header fields. */
+00313       if(casecmp(s.httpheaderline, http_content_type,
+00314                      sizeof(http_content_type) - 1) == 0) {
+00315         /* Found Content-type field. */
+00316         cptr = strchr(s.httpheaderline, ';');
+00317         if(cptr != NULL) {
+00318           *cptr = 0;
+00319         }
+00320         strncpy(s.mimetype, s.httpheaderline +
+00321                 sizeof(http_content_type) - 1, sizeof(s.mimetype));
+00322       } else if(casecmp(s.httpheaderline, http_location,
+00323                             sizeof(http_location) - 1) == 0) {
+00324         cptr = s.httpheaderline +
+00325           sizeof(http_location) - 1;
+00326         
+00327         if(strncmp(cptr, http_http, 7) == 0) {
+00328           cptr += 7;
+00329           for(i = 0; i < s.httpheaderlineptr - 7; ++i) {
+00330             if(*cptr == 0 ||
+00331                *cptr == '/' ||
+00332                *cptr == ' ' ||
+00333                *cptr == ':') {
+00334               s.host[i] = 0;
+00335               break;
+00336             }
+00337             s.host[i] = *cptr;
+00338             ++cptr;
+00339           }
+00340         }
+00341         strncpy(s.file, cptr, sizeof(s.file));
+00342         /*      s.file[s.httpheaderlineptr - i] = 0;*/
+00343       }
+00344 
+00345 
+00346       /* We're done parsing, so we reset the pointer and start the
+00347          next line. */
+00348       s.httpheaderlineptr = 0;
+00349     } else {
+00350       ++s.httpheaderlineptr;
+00351     }
+00352   }
+00353   return len;
+00354 }
+00355 /*-----------------------------------------------------------------------------------*/
+00356 static void
+00357 newdata(void)
+00358 {
+00359   u16_t len;
+00360 
+00361   len = uip_datalen();
+00362 
+00363   if(s.state == WEBCLIENT_STATE_STATUSLINE) {
+00364     len = parse_statusline(len);
+00365   }
+00366   
+00367   if(s.state == WEBCLIENT_STATE_HEADERS && len > 0) {
+00368     len = parse_headers(len);
+00369   }
+00370 
+00371   if(len > 0 && s.state == WEBCLIENT_STATE_DATA &&
+00372      s.httpflag != HTTPFLAG_MOVED) {
+00373     webclient_datahandler((char *)uip_appdata, len);
+00374   }
+00375 }
+00376 /*-----------------------------------------------------------------------------------*/
+00377 void
+00378 webclient_appcall(void)
+00379 {
+00380   if(uip_connected()) {
+00381     s.timer = 0;
+00382     s.state = WEBCLIENT_STATE_STATUSLINE;
+00383     senddata();
+00384     webclient_connected();
+00385     return;
+00386   }
+00387 
+00388   if(s.state == WEBCLIENT_STATE_CLOSE) {
+00389     webclient_closed();
+00390     uip_abort();
+00391     return;
+00392   }
+00393 
+00394   if(uip_aborted()) {
+00395     webclient_aborted();
+00396   }
+00397   if(uip_timedout()) {
+00398     webclient_timedout();
+00399   }
+00400 
+00401   
+00402   if(uip_acked()) {
+00403     s.timer = 0;
+00404     acked();
+00405   }
+00406   if(uip_newdata()) {
+00407     s.timer = 0;
+00408     newdata();
+00409   }
+00410   if(uip_rexmit() ||
+00411      uip_newdata() ||
+00412      uip_acked()) {
+00413     senddata();
+00414   } else if(uip_poll()) {
+00415     ++s.timer;
+00416     if(s.timer == WEBCLIENT_TIMEOUT) {
+00417       webclient_timedout();
+00418       uip_abort();
+00419       return;
+00420     }
+00421         /*    senddata();*/
+00422   }
+00423 
+00424   if(uip_closed()) {
+00425     if(s.httpflag != HTTPFLAG_MOVED) {
+00426       /* Send NULL data to signal EOF. */
+00427       webclient_datahandler(NULL, 0);
+00428     } else {
+00429       if(resolv_lookup(s.host) == NULL) {
+00430         resolv_query(s.host);
+00431       }
+00432       webclient_get(s.host, s.port, s.file);
+00433     }
+00434   }
+00435 }
+00436 /*-----------------------------------------------------------------------------------*/
+00437 
+00438 /** @} */
+00439 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00041.html b/third_party/uip-1.0/doc/html/a00041.html new file mode 100644 index 0000000..8d0125a --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00041.html @@ -0,0 +1,248 @@ + + +uIP 1.0: webclient.h + + + + + +

webclient.h

00001 /**
+00002  * \addtogroup webclient
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \file
+00008  * Header file for the HTTP client.
+00009  * \author Adam Dunkels <adam@dunkels.com>
+00010  */
+00011 
+00012 /*
+00013  * Copyright (c) 2002, Adam Dunkels.
+00014  * All rights reserved.
+00015  *
+00016  * Redistribution and use in source and binary forms, with or without
+00017  * modification, are permitted provided that the following conditions
+00018  * are met:
+00019  * 1. Redistributions of source code must retain the above copyright
+00020  *    notice, this list of conditions and the following disclaimer.
+00021  * 2. Redistributions in binary form must reproduce the above
+00022  *    copyright notice, this list of conditions and the following
+00023  *    disclaimer in the documentation and/or other materials provided
+00024  *    with the distribution.
+00025  * 3. The name of the author may not be used to endorse or promote
+00026  *    products derived from this software without specific prior
+00027  *    written permission.
+00028  *
+00029  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00030  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00031  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00032  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00033  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00034  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00035  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00036  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00037  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00038  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00039  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00040  *
+00041  * This file is part of the uIP TCP/IP stack.
+00042  *
+00043  * $Id: webclient.h,v 1.2 2006/06/11 21:46:37 adam Exp $
+00044  *
+00045  */
+00046 #ifndef __WEBCLIENT_H__
+00047 #define __WEBCLIENT_H__
+00048 
+00049 
+00050 #include "webclient-strings.h"
+00051 #include "uipopt.h"
+00052 
+00053 #define WEBCLIENT_CONF_MAX_URLLEN 100
+00054 
+00055 struct webclient_state {
+00056   u8_t timer;
+00057   u8_t state;
+00058   u8_t httpflag;
+00059 
+00060   u16_t port;
+00061   char host[40];
+00062   char file[WEBCLIENT_CONF_MAX_URLLEN];
+00063   u16_t getrequestptr;
+00064   u16_t getrequestleft;
+00065   
+00066   char httpheaderline[200];
+00067   u16_t httpheaderlineptr;
+00068 
+00069   char mimetype[32];
+00070 };
+00071 
+00072 typedef struct webclient_state uip_tcp_appstate_t;
+00073 #define UIP_APPCALL webclient_appcall
+00074 
+00075 /**
+00076  * Callback function that is called from the webclient code when HTTP
+00077  * data has been received.
+00078  *
+00079  * This function must be implemented by the module that uses the
+00080  * webclient code. The function is called from the webclient module
+00081  * when HTTP data has been received. The function is not called when
+00082  * HTTP headers are received, only for the actual data.
+00083  *
+00084  * \note This function is called many times, repetedly, when data is
+00085  * being received, and not once when all data has been received.
+00086  *
+00087  * \param data A pointer to the data that has been received.
+00088  * \param len The length of the data that has been received.
+00089  */
+00090 void webclient_datahandler(char *data, u16_t len);
+00091 
+00092 /**
+00093  * Callback function that is called from the webclient code when the
+00094  * HTTP connection has been connected to the web server.
+00095  *
+00096  * This function must be implemented by the module that uses the
+00097  * webclient code.
+00098  */
+00099 void webclient_connected(void);
+00100 
+00101 /**
+00102  * Callback function that is called from the webclient code if the
+00103  * HTTP connection to the web server has timed out.
+00104  *
+00105  * This function must be implemented by the module that uses the
+00106  * webclient code.
+00107  */
+00108 void webclient_timedout(void);
+00109 
+00110 /**
+00111  * Callback function that is called from the webclient code if the
+00112  * HTTP connection to the web server has been aborted by the web
+00113  * server.
+00114  *
+00115  * This function must be implemented by the module that uses the
+00116  * webclient code.
+00117  */
+00118 void webclient_aborted(void);
+00119 
+00120 /**
+00121  * Callback function that is called from the webclient code when the
+00122  * HTTP connection to the web server has been closed.
+00123  *
+00124  * This function must be implemented by the module that uses the
+00125  * webclient code.
+00126  */
+00127 void webclient_closed(void);
+00128 
+00129 
+00130 
+00131 /**
+00132  * Initialize the webclient module.
+00133  */
+00134 void webclient_init(void);
+00135 
+00136 /**
+00137  * Open an HTTP connection to a web server and ask for a file using
+00138  * the GET method.
+00139  *
+00140  * This function opens an HTTP connection to the specified web server
+00141  * and requests the specified file using the GET method. When the HTTP
+00142  * connection has been connected, the webclient_connected() callback
+00143  * function is called and when the HTTP data arrives the
+00144  * webclient_datahandler() callback function is called.
+00145  *
+00146  * The callback function webclient_timedout() is called if the web
+00147  * server could not be contacted, and the webclient_aborted() callback
+00148  * function is called if the HTTP connection is aborted by the web
+00149  * server.
+00150  *
+00151  * When the HTTP request has been completed and the HTTP connection is
+00152  * closed, the webclient_closed() callback function will be called.
+00153  *
+00154  * \note If the function is passed a host name, it must already be in
+00155  * the resolver cache in order for the function to connect to the web
+00156  * server. It is therefore up to the calling module to implement the
+00157  * resolver calls and the signal handler used for reporting a resolv
+00158  * query answer.
+00159  *
+00160  * \param host A pointer to a string containing either a host name or
+00161  * a numerical IP address in dotted decimal notation (e.g., 192.168.23.1).
+00162  *
+00163  * \param port The port number to which to connect, in host byte order.
+00164  *
+00165  * \param file A pointer to the name of the file to get.
+00166  *
+00167  * \retval 0 if the host name could not be found in the cache, or
+00168  * if a TCP connection could not be created.
+00169  *
+00170  * \retval 1 if the connection was initiated.
+00171  */
+00172 unsigned char webclient_get(char *host, u16_t port, char *file);
+00173 
+00174 /**
+00175  * Close the currently open HTTP connection.
+00176  */
+00177 void webclient_close(void);
+00178 void webclient_appcall(void);
+00179 
+00180 /**
+00181  * Obtain the MIME type of the current HTTP data stream.
+00182  *
+00183  * \return A pointer to a string contaning the MIME type. The string
+00184  * may be empty if no MIME type was reported by the web server.
+00185  */
+00186 char *webclient_mimetype(void);
+00187 
+00188 /**
+00189  * Obtain the filename of the current HTTP data stream.
+00190  *
+00191  * The filename of an HTTP request may be changed by the web server,
+00192  * and may therefore not be the same as when the original GET request
+00193  * was made with webclient_get(). This function is used for obtaining
+00194  * the current filename.
+00195  *
+00196  * \return A pointer to the current filename.
+00197  */
+00198 char *webclient_filename(void);
+00199 
+00200 /**
+00201  * Obtain the hostname of the current HTTP data stream.
+00202  *
+00203  * The hostname of the web server of an HTTP request may be changed
+00204  * by the web server, and may therefore not be the same as when the
+00205  * original GET request was made with webclient_get(). This function
+00206  * is used for obtaining the current hostname.
+00207  *
+00208  * \return A pointer to the current hostname.
+00209  */
+00210 char *webclient_hostname(void);
+00211 
+00212 /**
+00213  * Obtain the port number of the current HTTP data stream.
+00214  *
+00215  * The port number of an HTTP request may be changed by the web
+00216  * server, and may therefore not be the same as when the original GET
+00217  * request was made with webclient_get(). This function is used for
+00218  * obtaining the current port number.
+00219  *
+00220  * \return The port number of the current HTTP data stream, in host byte order.
+00221  */
+00222 unsigned short webclient_port(void);
+00223 
+00224 
+00225 
+00226 #endif /* __WEBCLIENT_H__ */
+00227 
+00228 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00042.html b/third_party/uip-1.0/doc/html/a00042.html new file mode 100644 index 0000000..c7ed516 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00042.html @@ -0,0 +1,106 @@ + + +uIP 1.0: example-mainloop-with-arp.c + + + + + +

example-mainloop-with-arp.c

00001 #include "uip.h"
+00002 #include "uip_arp.h"
+00003 #include "network-device.h"
+00004 #include "httpd.h"
+00005 #include "timer.h"
+00006 
+00007 #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
+00008 
+00009 /*---------------------------------------------------------------------------*/
+00010 int
+00011 main(void)
+00012 {
+00013   int i;
+00014   uip_ipaddr_t ipaddr;
+00015   struct timer periodic_timer, arp_timer;
+00016   
+00017   timer_set(&periodic_timer, CLOCK_SECOND / 2);
+00018   timer_set(&arp_timer, CLOCK_SECOND * 10);
+00019   
+00020   network_device_init();
+00021   uip_init();
+00022 
+00023   uip_ipaddr(ipaddr, 192,168,0,2);
+00024   uip_sethostaddr(ipaddr);
+00025 
+00026   httpd_init();
+00027   
+00028   while(1) {
+00029     uip_len = network_device_read();
+00030     if(uip_len > 0) {
+00031       if(BUF->type == htons(UIP_ETHTYPE_IP)) {
+00032         uip_arp_ipin();
+00033         uip_input();
+00034         /* If the above function invocation resulted in data that
+00035            should be sent out on the network, the global variable
+00036            uip_len is set to a value > 0. */
+00037         if(uip_len > 0) {
+00038           uip_arp_out();
+00039           network_device_send();
+00040         }
+00041       } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
+00042         uip_arp_arpin();
+00043         /* If the above function invocation resulted in data that
+00044            should be sent out on the network, the global variable
+00045            uip_len is set to a value > 0. */
+00046         if(uip_len > 0) {
+00047           network_device_send();
+00048         }
+00049       }
+00050 
+00051     } else if(timer_expired(&periodic_timer)) {
+00052       timer_reset(&periodic_timer);
+00053       for(i = 0; i < UIP_CONNS; i++) {
+00054         uip_periodic(i);
+00055         /* If the above function invocation resulted in data that
+00056            should be sent out on the network, the global variable
+00057            uip_len is set to a value > 0. */
+00058         if(uip_len > 0) {
+00059           uip_arp_out();
+00060           network_device_send();
+00061         }
+00062       }
+00063 
+00064 #if UIP_UDP
+00065       for(i = 0; i < UIP_UDP_CONNS; i++) {
+00066         uip_udp_periodic(i);
+00067         /* If the above function invocation resulted in data that
+00068            should be sent out on the network, the global variable
+00069            uip_len is set to a value > 0. */
+00070         if(uip_len > 0) {
+00071           uip_arp_out();
+00072           network_device_send();
+00073         }
+00074       }
+00075 #endif /* UIP_UDP */
+00076       
+00077       /* Call the ARP timer function every 10 seconds. */
+00078       if(timer_expired(&arp_timer)) {
+00079         timer_reset(&arp_timer);
+00080         uip_arp_timer();
+00081       }
+00082     }
+00083   }
+00084   return 0;
+00085 }
+00086 /*---------------------------------------------------------------------------*/
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00043.html b/third_party/uip-1.0/doc/html/a00043.html new file mode 100644 index 0000000..53361f1 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00043.html @@ -0,0 +1,82 @@ + + +uIP 1.0: example-mainloop-without-arp.c + + + + + +

example-mainloop-without-arp.c

00001 #include "uip.h"
+00002 #include "uip_arp.h"
+00003 #include "network-device.h"
+00004 #include "httpd.h"
+00005 #include "timer.h"
+00006 
+00007 /*---------------------------------------------------------------------------*/
+00008 int
+00009 main(void)
+00010 {
+00011   int i;
+00012   uip_ipaddr_t ipaddr;
+00013   struct timer periodic_timer;
+00014   
+00015   timer_set(&periodic_timer, CLOCK_SECOND / 2);
+00016   
+00017   network_device_init();
+00018   uip_init();
+00019 
+00020   uip_ipaddr(ipaddr, 192,168,0,2);
+00021   uip_sethostaddr(ipaddr);
+00022 
+00023   httpd_init();
+00024   
+00025   while(1) {
+00026     uip_len = network_device_read();
+00027     if(uip_len > 0) {
+00028       uip_input();
+00029       /* If the above function invocation resulted in data that
+00030          should be sent out on the network, the global variable
+00031          uip_len is set to a value > 0. */
+00032       if(uip_len > 0) {
+00033         network_device_send();
+00034       }
+00035     } else if(timer_expired(&periodic_timer)) {
+00036       timer_reset(&periodic_timer);
+00037       for(i = 0; i < UIP_CONNS; i++) {
+00038         uip_periodic(i);
+00039         /* If the above function invocation resulted in data that
+00040            should be sent out on the network, the global variable
+00041            uip_len is set to a value > 0. */
+00042         if(uip_len > 0) {
+00043           network_device_send();
+00044         }
+00045       }
+00046 
+00047 #if UIP_UDP
+00048       for(i = 0; i < UIP_UDP_CONNS; i++) {
+00049         uip_udp_periodic(i);
+00050         /* If the above function invocation resulted in data that
+00051            should be sent out on the network, the global variable
+00052            uip_len is set to a value > 0. */
+00053         if(uip_len > 0) {
+00054           network_device_send();
+00055         }
+00056       }
+00057 #endif /* UIP_UDP */
+00058     }
+00059   }
+00060   return 0;
+00061 }
+00062 /*---------------------------------------------------------------------------*/
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00044.html b/third_party/uip-1.0/doc/html/a00044.html new file mode 100644 index 0000000..40e5ad2 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00044.html @@ -0,0 +1,370 @@ + + +uIP 1.0: telnetd.c + + + + + +

telnetd.c

00001 /*
+00002  * Copyright (c) 2003, Adam Dunkels.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. The name of the author may not be used to endorse or promote
+00014  *    products derived from this software without specific prior
+00015  *    written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00018  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00019  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00021  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00023  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00024  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00025  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00026  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00027  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * $Id: telnetd.c,v 1.2 2006/06/07 09:43:54 adam Exp $
+00032  *
+00033  */
+00034 
+00035 #include "uip.h"
+00036 #include "telnetd.h"
+00037 #include "memb.h"
+00038 #include "shell.h"
+00039 
+00040 #include <string.h>
+00041 
+00042 #define ISO_nl       0x0a
+00043 #define ISO_cr       0x0d
+00044 
+00045 struct telnetd_line {
+00046   char line[TELNETD_CONF_LINELEN];
+00047 };
+00048 MEMB(linemem, struct telnetd_line, TELNETD_CONF_NUMLINES);
+00049 
+00050 #define STATE_NORMAL 0
+00051 #define STATE_IAC    1
+00052 #define STATE_WILL   2
+00053 #define STATE_WONT   3
+00054 #define STATE_DO     4
+00055 #define STATE_DONT   5
+00056 #define STATE_CLOSE  6
+00057 
+00058 static struct telnetd_state s;
+00059 
+00060 #define TELNET_IAC   255
+00061 #define TELNET_WILL  251
+00062 #define TELNET_WONT  252
+00063 #define TELNET_DO    253
+00064 #define TELNET_DONT  254
+00065 /*---------------------------------------------------------------------------*/
+00066 static char *
+00067 alloc_line(void)
+00068 {
+00069   return memb_alloc(&linemem);
+00070 }
+00071 /*---------------------------------------------------------------------------*/
+00072 static void
+00073 dealloc_line(char *line)
+00074 {
+00075   memb_free(&linemem, line);
+00076 }
+00077 /*---------------------------------------------------------------------------*/
+00078 void
+00079 shell_quit(char *str)
+00080 {
+00081   s.state = STATE_CLOSE;
+00082 }
+00083 /*---------------------------------------------------------------------------*/
+00084 static void
+00085 sendline(char *line)
+00086 {
+00087   static unsigned int i;
+00088   
+00089   for(i = 0; i < TELNETD_CONF_NUMLINES; ++i) {
+00090     if(s.lines[i] == NULL) {
+00091       s.lines[i] = line;
+00092       break;
+00093     }
+00094   }
+00095   if(i == TELNETD_CONF_NUMLINES) {
+00096     dealloc_line(line);
+00097   }
+00098 }
+00099 /*---------------------------------------------------------------------------*/
+00100 void
+00101 shell_prompt(char *str)
+00102 {
+00103   char *line;
+00104   line = alloc_line();
+00105   if(line != NULL) {
+00106     strncpy(line, str, TELNETD_CONF_LINELEN);
+00107     /*    petsciiconv_toascii(line, TELNETD_CONF_LINELEN);*/
+00108     sendline(line);
+00109   }
+00110 }
+00111 /*---------------------------------------------------------------------------*/
+00112 void
+00113 shell_output(char *str1, char *str2)
+00114 {
+00115   static unsigned len;
+00116   char *line;
+00117 
+00118   line = alloc_line();
+00119   if(line != NULL) {
+00120     len = strlen(str1);
+00121     strncpy(line, str1, TELNETD_CONF_LINELEN);
+00122     if(len < TELNETD_CONF_LINELEN) {
+00123       strncpy(line + len, str2, TELNETD_CONF_LINELEN - len);
+00124     }
+00125     len = strlen(line);
+00126     if(len < TELNETD_CONF_LINELEN - 2) {
+00127       line[len] = ISO_cr;
+00128       line[len+1] = ISO_nl;
+00129       line[len+2] = 0;
+00130     }
+00131     /*    petsciiconv_toascii(line, TELNETD_CONF_LINELEN);*/
+00132     sendline(line);
+00133   }
+00134 }
+00135 /*---------------------------------------------------------------------------*/
+00136 void
+00137 telnetd_init(void)
+00138 {
+00139   uip_listen(HTONS(23));
+00140   memb_init(&linemem);
+00141   shell_init();
+00142 }
+00143 /*---------------------------------------------------------------------------*/
+00144 static void
+00145 acked(void)
+00146 {
+00147   static unsigned int i;
+00148   
+00149   while(s.numsent > 0) {
+00150     dealloc_line(s.lines[0]);
+00151     for(i = 1; i < TELNETD_CONF_NUMLINES; ++i) {
+00152       s.lines[i - 1] = s.lines[i];
+00153     }
+00154     s.lines[TELNETD_CONF_NUMLINES - 1] = NULL;
+00155     --s.numsent;
+00156   }
+00157 }
+00158 /*---------------------------------------------------------------------------*/
+00159 static void
+00160 senddata(void)
+00161 {
+00162   static char *bufptr, *lineptr;
+00163   static int buflen, linelen;
+00164   
+00165   bufptr = uip_appdata;
+00166   buflen = 0;
+00167   for(s.numsent = 0; s.numsent < TELNETD_CONF_NUMLINES &&
+00168         s.lines[s.numsent] != NULL ; ++s.numsent) {
+00169     lineptr = s.lines[s.numsent];
+00170     linelen = strlen(lineptr);
+00171     if(linelen > TELNETD_CONF_LINELEN) {
+00172       linelen = TELNETD_CONF_LINELEN;
+00173     }
+00174     if(buflen + linelen < uip_mss()) {
+00175       memcpy(bufptr, lineptr, linelen);
+00176       bufptr += linelen;
+00177       buflen += linelen;
+00178     } else {
+00179       break;
+00180     }
+00181   }
+00182   uip_send(uip_appdata, buflen);
+00183 }
+00184 /*---------------------------------------------------------------------------*/
+00185 static void
+00186 closed(void)
+00187 {
+00188   static unsigned int i;
+00189   
+00190   for(i = 0; i < TELNETD_CONF_NUMLINES; ++i) {
+00191     if(s.lines[i] != NULL) {
+00192       dealloc_line(s.lines[i]);
+00193     }
+00194   }
+00195 }
+00196 /*---------------------------------------------------------------------------*/
+00197 static void
+00198 get_char(u8_t c)
+00199 {
+00200   if(c == ISO_cr) {
+00201     return;
+00202   }
+00203   
+00204   s.buf[(int)s.bufptr] = c;
+00205   if(s.buf[(int)s.bufptr] == ISO_nl ||
+00206      s.bufptr == sizeof(s.buf) - 1) {
+00207     if(s.bufptr > 0) {
+00208       s.buf[(int)s.bufptr] = 0;
+00209       /*      petsciiconv_topetscii(s.buf, TELNETD_CONF_LINELEN);*/
+00210     }
+00211     shell_input(s.buf);
+00212     s.bufptr = 0;
+00213   } else {
+00214     ++s.bufptr;
+00215   }
+00216 }
+00217 /*---------------------------------------------------------------------------*/
+00218 static void
+00219 sendopt(u8_t option, u8_t value)
+00220 {
+00221   char *line;
+00222   line = alloc_line();
+00223   if(line != NULL) {
+00224     line[0] = TELNET_IAC;
+00225     line[1] = option;
+00226     line[2] = value;
+00227     line[3] = 0;
+00228     sendline(line);
+00229   }
+00230 }
+00231 /*---------------------------------------------------------------------------*/
+00232 static void
+00233 newdata(void)
+00234 {
+00235   u16_t len;
+00236   u8_t c;
+00237   char *dataptr;
+00238     
+00239   
+00240   len = uip_datalen();
+00241   dataptr = (char *)uip_appdata;
+00242   
+00243   while(len > 0 && s.bufptr < sizeof(s.buf)) {
+00244     c = *dataptr;
+00245     ++dataptr;
+00246     --len;
+00247     switch(s.state) {
+00248     case STATE_IAC:
+00249       if(c == TELNET_IAC) {
+00250         get_char(c);
+00251         s.state = STATE_NORMAL;
+00252       } else {
+00253         switch(c) {
+00254         case TELNET_WILL:
+00255           s.state = STATE_WILL;
+00256           break;
+00257         case TELNET_WONT:
+00258           s.state = STATE_WONT;
+00259           break;
+00260         case TELNET_DO:
+00261           s.state = STATE_DO;
+00262           break;
+00263         case TELNET_DONT:
+00264           s.state = STATE_DONT;
+00265           break;
+00266         default:
+00267           s.state = STATE_NORMAL;
+00268           break;
+00269         }
+00270       }
+00271       break;
+00272     case STATE_WILL:
+00273       /* Reply with a DONT */
+00274       sendopt(TELNET_DONT, c);
+00275       s.state = STATE_NORMAL;
+00276       break;
+00277       
+00278     case STATE_WONT:
+00279       /* Reply with a DONT */
+00280       sendopt(TELNET_DONT, c);
+00281       s.state = STATE_NORMAL;
+00282       break;
+00283     case STATE_DO:
+00284       /* Reply with a WONT */
+00285       sendopt(TELNET_WONT, c);
+00286       s.state = STATE_NORMAL;
+00287       break;
+00288     case STATE_DONT:
+00289       /* Reply with a WONT */
+00290       sendopt(TELNET_WONT, c);
+00291       s.state = STATE_NORMAL;
+00292       break;
+00293     case STATE_NORMAL:
+00294       if(c == TELNET_IAC) {
+00295         s.state = STATE_IAC;
+00296       } else {
+00297         get_char(c);
+00298       }
+00299       break;
+00300     }
+00301 
+00302     
+00303   }
+00304   
+00305 }
+00306 /*---------------------------------------------------------------------------*/
+00307 void
+00308 telnetd_appcall(void)
+00309 {
+00310   static unsigned int i;
+00311   if(uip_connected()) {
+00312     /*    tcp_markconn(uip_conn, &s);*/
+00313     for(i = 0; i < TELNETD_CONF_NUMLINES; ++i) {
+00314       s.lines[i] = NULL;
+00315     }
+00316     s.bufptr = 0;
+00317     s.state = STATE_NORMAL;
+00318 
+00319     shell_start();
+00320   }
+00321 
+00322   if(s.state == STATE_CLOSE) {
+00323     s.state = STATE_NORMAL;
+00324     uip_close();
+00325     return;
+00326   }
+00327   
+00328   if(uip_closed() ||
+00329      uip_aborted() ||
+00330      uip_timedout()) {
+00331     closed();
+00332   }
+00333   
+00334   if(uip_acked()) {
+00335     acked();
+00336   }
+00337   
+00338   if(uip_newdata()) {
+00339     newdata();
+00340   }
+00341   
+00342   if(uip_rexmit() ||
+00343      uip_newdata() ||
+00344      uip_acked() ||
+00345      uip_connected() ||
+00346      uip_poll()) {
+00347     senddata();
+00348   }
+00349 }
+00350 /*---------------------------------------------------------------------------*/
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00045.html b/third_party/uip-1.0/doc/html/a00045.html new file mode 100644 index 0000000..5f108bf --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00045.html @@ -0,0 +1,83 @@ + + +uIP 1.0: telnetd.h + + + + + +

telnetd.h

00001 /*
+00002  * Copyright (c) 2003, Adam Dunkels.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above
+00011  *    copyright notice, this list of conditions and the following
+00012  *    disclaimer in the documentation and/or other materials provided
+00013  *    with the distribution.
+00014  * 3. The name of the author may not be used to endorse or promote
+00015  *    products derived from this software without specific prior
+00016  *    written permission.
+00017  *
+00018  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00019  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00020  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00021  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00022  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00023  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00024  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00025  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00026  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00027  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00028  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00029  *
+00030  * This file is part of the uIP TCP/IP stack
+00031  *
+00032  * $Id: telnetd.h,v 1.2 2006/06/07 09:43:54 adam Exp $
+00033  *
+00034  */
+00035 #ifndef __TELNETD_H__
+00036 #define __TELNETD_H__
+00037 
+00038 #include "uipopt.h"
+00039 
+00040 void telnetd_appcall(void);
+00041 
+00042 #ifndef TELNETD_CONF_LINELEN
+00043 #define TELNETD_CONF_LINELEN 40
+00044 #endif
+00045 #ifndef TELNETD_CONF_NUMLINES
+00046 #define TELNETD_CONF_NUMLINES 16
+00047 #endif
+00048 
+00049 struct telnetd_state {
+00050   char *lines[TELNETD_CONF_NUMLINES];
+00051   char buf[TELNETD_CONF_LINELEN];
+00052   char bufptr;
+00053   u8_t numsent;
+00054   u8_t state;
+00055 };
+00056 
+00057 typedef struct telnetd_state uip_tcp_appstate_t;
+00058 
+00059 #ifndef UIP_APPCALL
+00060 #define UIP_APPCALL     telnetd_appcall
+00061 #endif
+00062 
+00063 #endif /* __TELNETD_H__ */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00046.html b/third_party/uip-1.0/doc/html/a00046.html new file mode 100644 index 0000000..8299885 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00046.html @@ -0,0 +1,484 @@ + + +uIP 1.0: resolv.c + + + + + +

resolv.c

00001 /**
+00002  * \addtogroup apps
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \defgroup resolv DNS resolver
+00008  * @{
+00009  *
+00010  * The uIP DNS resolver functions are used to lookup a hostname and
+00011  * map it to a numerical IP address. It maintains a list of resolved
+00012  * hostnames that can be queried with the resolv_lookup()
+00013  * function. New hostnames can be resolved using the resolv_query()
+00014  * function.
+00015  *
+00016  * When a hostname has been resolved (or found to be non-existant),
+00017  * the resolver code calls a callback function called resolv_found()
+00018  * that must be implemented by the module that uses the resolver.
+00019  */
+00020 
+00021 /**
+00022  * \file
+00023  * DNS host name to IP address resolver.
+00024  * \author Adam Dunkels <adam@dunkels.com>
+00025  *
+00026  * This file implements a DNS host name to IP address resolver.
+00027  */
+00028 
+00029 /*
+00030  * Copyright (c) 2002-2003, Adam Dunkels.
+00031  * All rights reserved.
+00032  *
+00033  * Redistribution and use in source and binary forms, with or without
+00034  * modification, are permitted provided that the following conditions
+00035  * are met:
+00036  * 1. Redistributions of source code must retain the above copyright
+00037  *    notice, this list of conditions and the following disclaimer.
+00038  * 2. Redistributions in binary form must reproduce the above copyright
+00039  *    notice, this list of conditions and the following disclaimer in the
+00040  *    documentation and/or other materials provided with the distribution.
+00041  * 3. The name of the author may not be used to endorse or promote
+00042  *    products derived from this software without specific prior
+00043  *    written permission.
+00044  *
+00045  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00046  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00047  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00048  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00049  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00050  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00051  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00052  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00053  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00054  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00055  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00056  *
+00057  * This file is part of the uIP TCP/IP stack.
+00058  *
+00059  * $Id: resolv.c,v 1.5 2006/06/11 21:46:37 adam Exp $
+00060  *
+00061  */
+00062 
+00063 #include "resolv.h"
+00064 #include "uip.h"
+00065 
+00066 #include <string.h>
+00067 
+00068 #ifndef NULL
+00069 #define NULL (void *)0
+00070 #endif /* NULL */
+00071 
+00072 /** \internal The maximum number of retries when asking for a name. */
+00073 #define MAX_RETRIES 8
+00074 
+00075 /** \internal The DNS message header. */
+00076 struct dns_hdr {
+00077   u16_t id;
+00078   u8_t flags1, flags2;
+00079 #define DNS_FLAG1_RESPONSE        0x80
+00080 #define DNS_FLAG1_OPCODE_STATUS   0x10
+00081 #define DNS_FLAG1_OPCODE_INVERSE  0x08
+00082 #define DNS_FLAG1_OPCODE_STANDARD 0x00
+00083 #define DNS_FLAG1_AUTHORATIVE     0x04
+00084 #define DNS_FLAG1_TRUNC           0x02
+00085 #define DNS_FLAG1_RD              0x01
+00086 #define DNS_FLAG2_RA              0x80
+00087 #define DNS_FLAG2_ERR_MASK        0x0f
+00088 #define DNS_FLAG2_ERR_NONE        0x00
+00089 #define DNS_FLAG2_ERR_NAME        0x03
+00090   u16_t numquestions;
+00091   u16_t numanswers;
+00092   u16_t numauthrr;
+00093   u16_t numextrarr;
+00094 };
+00095 
+00096 /** \internal The DNS answer message structure. */
+00097 struct dns_answer {
+00098   /* DNS answer record starts with either a domain name or a pointer
+00099      to a name already present somewhere in the packet. */
+00100   u16_t type;
+00101   u16_t class;
+00102   u16_t ttl[2];
+00103   u16_t len;
+00104   uip_ipaddr_t ipaddr;
+00105 };
+00106 
+00107 struct namemap {
+00108 #define STATE_UNUSED 0
+00109 #define STATE_NEW    1
+00110 #define STATE_ASKING 2
+00111 #define STATE_DONE   3
+00112 #define STATE_ERROR  4
+00113   u8_t state;
+00114   u8_t tmr;
+00115   u8_t retries;
+00116   u8_t seqno;
+00117   u8_t err;
+00118   char name[32];
+00119   uip_ipaddr_t ipaddr;
+00120 };
+00121 
+00122 #ifndef UIP_CONF_RESOLV_ENTRIES
+00123 #define RESOLV_ENTRIES 4
+00124 #else /* UIP_CONF_RESOLV_ENTRIES */
+00125 #define RESOLV_ENTRIES UIP_CONF_RESOLV_ENTRIES
+00126 #endif /* UIP_CONF_RESOLV_ENTRIES */
+00127 
+00128 
+00129 static struct namemap names[RESOLV_ENTRIES];
+00130 
+00131 static u8_t seqno;
+00132 
+00133 static struct uip_udp_conn *resolv_conn = NULL;
+00134 
+00135 
+00136 /*---------------------------------------------------------------------------*/
+00137 /** \internal
+00138  * Walk through a compact encoded DNS name and return the end of it.
+00139  *
+00140  * \return The end of the name.
+00141  */
+00142 /*---------------------------------------------------------------------------*/
+00143 static unsigned char *
+00144 parse_name(unsigned char *query)
+00145 {
+00146   unsigned char n;
+00147 
+00148   do {
+00149     n = *query++;
+00150     
+00151     while(n > 0) {
+00152       /*      printf("%c", *query);*/
+00153       ++query;
+00154       --n;
+00155     };
+00156     /*    printf(".");*/
+00157   } while(*query != 0);
+00158   /*  printf("\n");*/
+00159   return query + 1;
+00160 }
+00161 /*---------------------------------------------------------------------------*/
+00162 /** \internal
+00163  * Runs through the list of names to see if there are any that have
+00164  * not yet been queried and, if so, sends out a query.
+00165  */
+00166 /*---------------------------------------------------------------------------*/
+00167 static void
+00168 check_entries(void)
+00169 {
+00170   register struct dns_hdr *hdr;
+00171   char *query, *nptr, *nameptr;
+00172   static u8_t i;
+00173   static u8_t n;
+00174   register struct namemap *namemapptr;
+00175   
+00176   for(i = 0; i < RESOLV_ENTRIES; ++i) {
+00177     namemapptr = &names[i];
+00178     if(namemapptr->state == STATE_NEW ||
+00179        namemapptr->state == STATE_ASKING) {
+00180       if(namemapptr->state == STATE_ASKING) {
+00181         if(--namemapptr->tmr == 0) {
+00182           if(++namemapptr->retries == MAX_RETRIES) {
+00183             namemapptr->state = STATE_ERROR;
+00184             resolv_found(namemapptr->name, NULL);
+00185             continue;
+00186           }
+00187           namemapptr->tmr = namemapptr->retries;
+00188         } else {
+00189           /*      printf("Timer %d\n", namemapptr->tmr);*/
+00190           /* Its timer has not run out, so we move on to next
+00191              entry. */
+00192           continue;
+00193         }
+00194       } else {
+00195         namemapptr->state = STATE_ASKING;
+00196         namemapptr->tmr = 1;
+00197         namemapptr->retries = 0;
+00198       }
+00199       hdr = (struct dns_hdr *)uip_appdata;
+00200       memset(hdr, 0, sizeof(struct dns_hdr));
+00201       hdr->id = htons(i);
+00202       hdr->flags1 = DNS_FLAG1_RD;
+00203       hdr->numquestions = HTONS(1);
+00204       query = (char *)uip_appdata + 12;
+00205       nameptr = namemapptr->name;
+00206       --nameptr;
+00207       /* Convert hostname into suitable query format. */
+00208       do {
+00209         ++nameptr;
+00210         nptr = query;
+00211         ++query;
+00212         for(n = 0; *nameptr != '.' && *nameptr != 0; ++nameptr) {
+00213           *query = *nameptr;
+00214           ++query;
+00215           ++n;
+00216         }
+00217         *nptr = n;
+00218       } while(*nameptr != 0);
+00219       {
+00220         static unsigned char endquery[] =
+00221           {0,0,1,0,1};
+00222         memcpy(query, endquery, 5);
+00223       }
+00224       uip_udp_send((unsigned char)(query + 5 - (char *)uip_appdata));
+00225       break;
+00226     }
+00227   }
+00228 }
+00229 /*---------------------------------------------------------------------------*/
+00230 /** \internal
+00231  * Called when new UDP data arrives.
+00232  */
+00233 /*---------------------------------------------------------------------------*/
+00234 static void
+00235 newdata(void)
+00236 {
+00237   char *nameptr;
+00238   struct dns_answer *ans;
+00239   struct dns_hdr *hdr;
+00240   static u8_t nquestions, nanswers;
+00241   static u8_t i;
+00242   register struct namemap *namemapptr;
+00243   
+00244   hdr = (struct dns_hdr *)uip_appdata;
+00245   /*  printf("ID %d\n", htons(hdr->id));
+00246       printf("Query %d\n", hdr->flags1 & DNS_FLAG1_RESPONSE);
+00247       printf("Error %d\n", hdr->flags2 & DNS_FLAG2_ERR_MASK);
+00248       printf("Num questions %d, answers %d, authrr %d, extrarr %d\n",
+00249       htons(hdr->numquestions),
+00250       htons(hdr->numanswers),
+00251       htons(hdr->numauthrr),
+00252       htons(hdr->numextrarr));
+00253   */
+00254 
+00255   /* The ID in the DNS header should be our entry into the name
+00256      table. */
+00257   i = htons(hdr->id);
+00258   namemapptr = &names[i];
+00259   if(i < RESOLV_ENTRIES &&
+00260      namemapptr->state == STATE_ASKING) {
+00261 
+00262     /* This entry is now finished. */
+00263     namemapptr->state = STATE_DONE;
+00264     namemapptr->err = hdr->flags2 & DNS_FLAG2_ERR_MASK;
+00265 
+00266     /* Check for error. If so, call callback to inform. */
+00267     if(namemapptr->err != 0) {
+00268       namemapptr->state = STATE_ERROR;
+00269       resolv_found(namemapptr->name, NULL);
+00270       return;
+00271     }
+00272 
+00273     /* We only care about the question(s) and the answers. The authrr
+00274        and the extrarr are simply discarded. */
+00275     nquestions = htons(hdr->numquestions);
+00276     nanswers = htons(hdr->numanswers);
+00277 
+00278     /* Skip the name in the question. XXX: This should really be
+00279        checked agains the name in the question, to be sure that they
+00280        match. */
+00281     nameptr = parse_name((char *)uip_appdata + 12) + 4;
+00282 
+00283     while(nanswers > 0) {
+00284       /* The first byte in the answer resource record determines if it
+00285          is a compressed record or a normal one. */
+00286       if(*nameptr & 0xc0) {
+00287         /* Compressed name. */
+00288         nameptr +=2;
+00289         /*      printf("Compressed anwser\n");*/
+00290       } else {
+00291         /* Not compressed name. */
+00292         nameptr = parse_name((char *)nameptr);
+00293       }
+00294 
+00295       ans = (struct dns_answer *)nameptr;
+00296       /*      printf("Answer: type %x, class %x, ttl %x, length %x\n",
+00297              htons(ans->type), htons(ans->class), (htons(ans->ttl[0])
+00298              << 16) | htons(ans->ttl[1]), htons(ans->len));*/
+00299 
+00300       /* Check for IP address type and Internet class. Others are
+00301          discarded. */
+00302       if(ans->type == HTONS(1) &&
+00303          ans->class == HTONS(1) &&
+00304          ans->len == HTONS(4)) {
+00305         /*      printf("IP address %d.%d.%d.%d\n",
+00306                htons(ans->ipaddr[0]) >> 8,
+00307                htons(ans->ipaddr[0]) & 0xff,
+00308                htons(ans->ipaddr[1]) >> 8,
+00309                htons(ans->ipaddr[1]) & 0xff);*/
+00310         /* XXX: we should really check that this IP address is the one
+00311            we want. */
+00312         namemapptr->ipaddr[0] = ans->ipaddr[0];
+00313         namemapptr->ipaddr[1] = ans->ipaddr[1];
+00314         
+00315         resolv_found(namemapptr->name, namemapptr->ipaddr);
+00316         return;
+00317       } else {
+00318         nameptr = nameptr + 10 + htons(ans->len);
+00319       }
+00320       --nanswers;
+00321     }
+00322   }
+00323 
+00324 }
+00325 /*---------------------------------------------------------------------------*/
+00326 /** \internal
+00327  * The main UDP function.
+00328  */
+00329 /*---------------------------------------------------------------------------*/
+00330 void
+00331 resolv_appcall(void)
+00332 {
+00333   if(uip_udp_conn->rport == HTONS(53)) {
+00334     if(uip_poll()) {
+00335       check_entries();
+00336     }
+00337     if(uip_newdata()) {
+00338       newdata();
+00339     }
+00340   }
+00341 }
+00342 /*---------------------------------------------------------------------------*/
+00343 /**
+00344  * Queues a name so that a question for the name will be sent out.
+00345  *
+00346  * \param name The hostname that is to be queried.
+00347  */
+00348 /*---------------------------------------------------------------------------*/
+00349 void
+00350 resolv_query(char *name)
+00351 {
+00352   static u8_t i;
+00353   static u8_t lseq, lseqi;
+00354   register struct namemap *nameptr;
+00355       
+00356   lseq = lseqi = 0;
+00357   
+00358   for(i = 0; i < RESOLV_ENTRIES; ++i) {
+00359     nameptr = &names[i];
+00360     if(nameptr->state == STATE_UNUSED) {
+00361       break;
+00362     }
+00363     if(seqno - nameptr->seqno > lseq) {
+00364       lseq = seqno - nameptr->seqno;
+00365       lseqi = i;
+00366     }
+00367   }
+00368 
+00369   if(i == RESOLV_ENTRIES) {
+00370     i = lseqi;
+00371     nameptr = &names[i];
+00372   }
+00373 
+00374   /*  printf("Using entry %d\n", i);*/
+00375 
+00376   strcpy(nameptr->name, name);
+00377   nameptr->state = STATE_NEW;
+00378   nameptr->seqno = seqno;
+00379   ++seqno;
+00380 }
+00381 /*---------------------------------------------------------------------------*/
+00382 /**
+00383  * Look up a hostname in the array of known hostnames.
+00384  *
+00385  * \note This function only looks in the internal array of known
+00386  * hostnames, it does not send out a query for the hostname if none
+00387  * was found. The function resolv_query() can be used to send a query
+00388  * for a hostname.
+00389  *
+00390  * \return A pointer to a 4-byte representation of the hostname's IP
+00391  * address, or NULL if the hostname was not found in the array of
+00392  * hostnames.
+00393  */
+00394 /*---------------------------------------------------------------------------*/
+00395 u16_t *
+00396 resolv_lookup(char *name)
+00397 {
+00398   static u8_t i;
+00399   struct namemap *nameptr;
+00400   
+00401   /* Walk through the list to see if the name is in there. If it is
+00402      not, we return NULL. */
+00403   for(i = 0; i < RESOLV_ENTRIES; ++i) {
+00404     nameptr = &names[i];
+00405     if(nameptr->state == STATE_DONE &&
+00406        strcmp(name, nameptr->name) == 0) {
+00407       return nameptr->ipaddr;
+00408     }
+00409   }
+00410   return NULL;
+00411 }
+00412 /*---------------------------------------------------------------------------*/
+00413 /**
+00414  * Obtain the currently configured DNS server.
+00415  *
+00416  * \return A pointer to a 4-byte representation of the IP address of
+00417  * the currently configured DNS server or NULL if no DNS server has
+00418  * been configured.
+00419  */
+00420 /*---------------------------------------------------------------------------*/
+00421 u16_t *
+00422 resolv_getserver(void)
+00423 {
+00424   if(resolv_conn == NULL) {
+00425     return NULL;
+00426   }
+00427   return resolv_conn->ripaddr;
+00428 }
+00429 /*---------------------------------------------------------------------------*/
+00430 /**
+00431  * Configure which DNS server to use for queries.
+00432  *
+00433  * \param dnsserver A pointer to a 4-byte representation of the IP
+00434  * address of the DNS server to be configured.
+00435  */
+00436 /*---------------------------------------------------------------------------*/
+00437 void
+00438 resolv_conf(u16_t *dnsserver)
+00439 {
+00440   if(resolv_conn != NULL) {
+00441     uip_udp_remove(resolv_conn);
+00442   }
+00443   
+00444   resolv_conn = uip_udp_new(dnsserver, HTONS(53));
+00445 }
+00446 /*---------------------------------------------------------------------------*/
+00447 /**
+00448  * Initalize the resolver.
+00449  */
+00450 /*---------------------------------------------------------------------------*/
+00451 void
+00452 resolv_init(void)
+00453 {
+00454   static u8_t i;
+00455   
+00456   for(i = 0; i < RESOLV_ENTRIES; ++i) {
+00457     names[i].state = STATE_DONE;
+00458   }
+00459 
+00460 }
+00461 /*---------------------------------------------------------------------------*/
+00462 
+00463 /** @} */
+00464 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00047.html b/third_party/uip-1.0/doc/html/a00047.html new file mode 100644 index 0000000..b036e83 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00047.html @@ -0,0 +1,95 @@ + + +uIP 1.0: resolv.h + + + + + +

resolv.h

00001 /**
+00002  * \addtogroup resolv
+00003  * @{
+00004  */
+00005 /**
+00006  * \file
+00007  * DNS resolver code header file.
+00008  * \author Adam Dunkels <adam@dunkels.com>
+00009  */
+00010 
+00011 /*
+00012  * Copyright (c) 2002-2003, Adam Dunkels.
+00013  * All rights reserved.
+00014  *
+00015  * Redistribution and use in source and binary forms, with or without
+00016  * modification, are permitted provided that the following conditions
+00017  * are met:
+00018  * 1. Redistributions of source code must retain the above copyright
+00019  *    notice, this list of conditions and the following disclaimer.
+00020  * 2. Redistributions in binary form must reproduce the above copyright
+00021  *    notice, this list of conditions and the following disclaimer in the
+00022  *    documentation and/or other materials provided with the distribution.
+00023  * 3. The name of the author may not be used to endorse or promote
+00024  *    products derived from this software without specific prior
+00025  *    written permission.
+00026  *
+00027  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00028  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00029  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00030  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00031  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00032  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00033  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00034  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00035  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00036  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00037  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00038  *
+00039  * This file is part of the uIP TCP/IP stack.
+00040  *
+00041  * $Id: resolv.h,v 1.4 2006/06/11 21:46:37 adam Exp $
+00042  *
+00043  */
+00044 #ifndef __RESOLV_H__
+00045 #define __RESOLV_H__
+00046 
+00047 typedef int uip_udp_appstate_t;
+00048 void resolv_appcall(void);
+00049 #define UIP_UDP_APPCALL resolv_appcall
+00050 
+00051 #include "uipopt.h"
+00052 
+00053 /**
+00054  * Callback function which is called when a hostname is found.
+00055  *
+00056  * This function must be implemented by the module that uses the DNS
+00057  * resolver. It is called when a hostname is found, or when a hostname
+00058  * was not found.
+00059  *
+00060  * \param name A pointer to the name that was looked up.  \param
+00061  * ipaddr A pointer to a 4-byte array containing the IP address of the
+00062  * hostname, or NULL if the hostname could not be found.
+00063  */
+00064 void resolv_found(char *name, u16_t *ipaddr);
+00065 
+00066 /* Functions. */
+00067 void resolv_conf(u16_t *dnsserver);
+00068 u16_t *resolv_getserver(void);
+00069 void resolv_init(void);
+00070 u16_t *resolv_lookup(char *name);
+00071 void resolv_query(char *name);
+00072 
+00073 #endif /* __RESOLV_H__ */
+00074 
+00075 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00048.html b/third_party/uip-1.0/doc/html/a00048.html new file mode 100644 index 0000000..7dcba69 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00048.html @@ -0,0 +1,376 @@ + + +uIP 1.0: dhcpc.c + + + + + +

dhcpc.c

00001 /*
+00002  * Copyright (c) 2005, Swedish Institute of Computer Science
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * @(#)$Id: dhcpc.c,v 1.2 2006/06/11 21:46:37 adam Exp $
+00032  */
+00033 
+00034 #include <stdio.h>
+00035 #include <string.h>
+00036 
+00037 #include "uip.h"
+00038 #include "dhcpc.h"
+00039 #include "timer.h"
+00040 #include "pt.h"
+00041 
+00042 #define STATE_INITIAL         0
+00043 #define STATE_SENDING         1
+00044 #define STATE_OFFER_RECEIVED  2
+00045 #define STATE_CONFIG_RECEIVED 3
+00046 
+00047 static struct dhcpc_state s;
+00048 
+00049 struct dhcp_msg {
+00050   u8_t op, htype, hlen, hops;
+00051   u8_t xid[4];
+00052   u16_t secs, flags;
+00053   u8_t ciaddr[4];
+00054   u8_t yiaddr[4];
+00055   u8_t siaddr[4];
+00056   u8_t giaddr[4];
+00057   u8_t chaddr[16];
+00058 #ifndef UIP_CONF_DHCP_LIGHT
+00059   u8_t sname[64];
+00060   u8_t file[128];
+00061 #endif
+00062   u8_t options[312];
+00063 };
+00064 
+00065 #define BOOTP_BROADCAST 0x8000
+00066 
+00067 #define DHCP_REQUEST        1
+00068 #define DHCP_REPLY          2
+00069 #define DHCP_HTYPE_ETHERNET 1
+00070 #define DHCP_HLEN_ETHERNET  6
+00071 #define DHCP_MSG_LEN      236
+00072 
+00073 #define DHCPC_SERVER_PORT  67
+00074 #define DHCPC_CLIENT_PORT  68
+00075 
+00076 #define DHCPDISCOVER  1
+00077 #define DHCPOFFER     2
+00078 #define DHCPREQUEST   3
+00079 #define DHCPDECLINE   4
+00080 #define DHCPACK       5
+00081 #define DHCPNAK       6
+00082 #define DHCPRELEASE   7
+00083 
+00084 #define DHCP_OPTION_SUBNET_MASK   1
+00085 #define DHCP_OPTION_ROUTER        3
+00086 #define DHCP_OPTION_DNS_SERVER    6
+00087 #define DHCP_OPTION_REQ_IPADDR   50
+00088 #define DHCP_OPTION_LEASE_TIME   51
+00089 #define DHCP_OPTION_MSG_TYPE     53
+00090 #define DHCP_OPTION_SERVER_ID    54
+00091 #define DHCP_OPTION_REQ_LIST     55
+00092 #define DHCP_OPTION_END         255
+00093 
+00094 static const u8_t xid[4] = {0xad, 0xde, 0x12, 0x23};
+00095 static const u8_t magic_cookie[4] = {99, 130, 83, 99};
+00096 /*---------------------------------------------------------------------------*/
+00097 static u8_t *
+00098 add_msg_type(u8_t *optptr, u8_t type)
+00099 {
+00100   *optptr++ = DHCP_OPTION_MSG_TYPE;
+00101   *optptr++ = 1;
+00102   *optptr++ = type;
+00103   return optptr;
+00104 }
+00105 /*---------------------------------------------------------------------------*/
+00106 static u8_t *
+00107 add_server_id(u8_t *optptr)
+00108 {
+00109   *optptr++ = DHCP_OPTION_SERVER_ID;
+00110   *optptr++ = 4;
+00111   memcpy(optptr, s.serverid, 4);
+00112   return optptr + 4;
+00113 }
+00114 /*---------------------------------------------------------------------------*/
+00115 static u8_t *
+00116 add_req_ipaddr(u8_t *optptr)
+00117 {
+00118   *optptr++ = DHCP_OPTION_REQ_IPADDR;
+00119   *optptr++ = 4;
+00120   memcpy(optptr, s.ipaddr, 4);
+00121   return optptr + 4;
+00122 }
+00123 /*---------------------------------------------------------------------------*/
+00124 static u8_t *
+00125 add_req_options(u8_t *optptr)
+00126 {
+00127   *optptr++ = DHCP_OPTION_REQ_LIST;
+00128   *optptr++ = 3;
+00129   *optptr++ = DHCP_OPTION_SUBNET_MASK;
+00130   *optptr++ = DHCP_OPTION_ROUTER;
+00131   *optptr++ = DHCP_OPTION_DNS_SERVER;
+00132   return optptr;
+00133 }
+00134 /*---------------------------------------------------------------------------*/
+00135 static u8_t *
+00136 add_end(u8_t *optptr)
+00137 {
+00138   *optptr++ = DHCP_OPTION_END;
+00139   return optptr;
+00140 }
+00141 /*---------------------------------------------------------------------------*/
+00142 static void
+00143 create_msg(register struct dhcp_msg *m)
+00144 {
+00145   m->op = DHCP_REQUEST;
+00146   m->htype = DHCP_HTYPE_ETHERNET;
+00147   m->hlen = s.mac_len;
+00148   m->hops = 0;
+00149   memcpy(m->xid, xid, sizeof(m->xid));
+00150   m->secs = 0;
+00151   m->flags = HTONS(BOOTP_BROADCAST); /*  Broadcast bit. */
+00152   /*  uip_ipaddr_copy(m->ciaddr, uip_hostaddr);*/
+00153   memcpy(m->ciaddr, uip_hostaddr, sizeof(m->ciaddr));
+00154   memset(m->yiaddr, 0, sizeof(m->yiaddr));
+00155   memset(m->siaddr, 0, sizeof(m->siaddr));
+00156   memset(m->giaddr, 0, sizeof(m->giaddr));
+00157   memcpy(m->chaddr, s.mac_addr, s.mac_len);
+00158   memset(&m->chaddr[s.mac_len], 0, sizeof(m->chaddr) - s.mac_len);
+00159 #ifndef UIP_CONF_DHCP_LIGHT
+00160   memset(m->sname, 0, sizeof(m->sname));
+00161   memset(m->file, 0, sizeof(m->file));
+00162 #endif
+00163 
+00164   memcpy(m->options, magic_cookie, sizeof(magic_cookie));
+00165 }
+00166 /*---------------------------------------------------------------------------*/
+00167 static void
+00168 send_discover(void)
+00169 {
+00170   u8_t *end;
+00171   struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;
+00172 
+00173   create_msg(m);
+00174 
+00175   end = add_msg_type(&m->options[4], DHCPDISCOVER);
+00176   end = add_req_options(end);
+00177   end = add_end(end);
+00178 
+00179   uip_send(uip_appdata, end - (u8_t *)uip_appdata);
+00180 }
+00181 /*---------------------------------------------------------------------------*/
+00182 static void
+00183 send_request(void)
+00184 {
+00185   u8_t *end;
+00186   struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;
+00187 
+00188   create_msg(m);
+00189   
+00190   end = add_msg_type(&m->options[4], DHCPREQUEST);
+00191   end = add_server_id(end);
+00192   end = add_req_ipaddr(end);
+00193   end = add_end(end);
+00194   
+00195   uip_send(uip_appdata, end - (u8_t *)uip_appdata);
+00196 }
+00197 /*---------------------------------------------------------------------------*/
+00198 static u8_t
+00199 parse_options(u8_t *optptr, int len)
+00200 {
+00201   u8_t *end = optptr + len;
+00202   u8_t type = 0;
+00203 
+00204   while(optptr < end) {
+00205     switch(*optptr) {
+00206     case DHCP_OPTION_SUBNET_MASK:
+00207       memcpy(s.netmask, optptr + 2, 4);
+00208       break;
+00209     case DHCP_OPTION_ROUTER:
+00210       memcpy(s.default_router, optptr + 2, 4);
+00211       break;
+00212     case DHCP_OPTION_DNS_SERVER:
+00213       memcpy(s.dnsaddr, optptr + 2, 4);
+00214       break;
+00215     case DHCP_OPTION_MSG_TYPE:
+00216       type = *(optptr + 2);
+00217       break;
+00218     case DHCP_OPTION_SERVER_ID:
+00219       memcpy(s.serverid, optptr + 2, 4);
+00220       break;
+00221     case DHCP_OPTION_LEASE_TIME:
+00222       memcpy(s.lease_time, optptr + 2, 4);
+00223       break;
+00224     case DHCP_OPTION_END:
+00225       return type;
+00226     }
+00227 
+00228     optptr += optptr[1] + 2;
+00229   }
+00230   return type;
+00231 }
+00232 /*---------------------------------------------------------------------------*/
+00233 static u8_t
+00234 parse_msg(void)
+00235 {
+00236   struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;
+00237   
+00238   if(m->op == DHCP_REPLY &&
+00239      memcmp(m->xid, xid, sizeof(xid)) == 0 &&
+00240      memcmp(m->chaddr, s.mac_addr, s.mac_len) == 0) {
+00241     memcpy(s.ipaddr, m->yiaddr, 4);
+00242     return parse_options(&m->options[4], uip_datalen());
+00243   }
+00244   return 0;
+00245 }
+00246 /*---------------------------------------------------------------------------*/
+00247 static
+00248 PT_THREAD(handle_dhcp(void))
+00249 {
+00250   PT_BEGIN(&s.pt);
+00251   
+00252   /* try_again:*/
+00253   s.state = STATE_SENDING;
+00254   s.ticks = CLOCK_SECOND;
+00255 
+00256   do {
+00257     send_discover();
+00258     timer_set(&s.timer, s.ticks);
+00259     PT_WAIT_UNTIL(&s.pt, uip_newdata() || timer_expired(&s.timer));
+00260 
+00261     if(uip_newdata() && parse_msg() == DHCPOFFER) {
+00262       s.state = STATE_OFFER_RECEIVED;
+00263       break;
+00264     }
+00265 
+00266     if(s.ticks < CLOCK_SECOND * 60) {
+00267       s.ticks *= 2;
+00268     }
+00269   } while(s.state != STATE_OFFER_RECEIVED);
+00270   
+00271   s.ticks = CLOCK_SECOND;
+00272 
+00273   do {
+00274     send_request();
+00275     timer_set(&s.timer, s.ticks);
+00276     PT_WAIT_UNTIL(&s.pt, uip_newdata() || timer_expired(&s.timer));
+00277 
+00278     if(uip_newdata() && parse_msg() == DHCPACK) {
+00279       s.state = STATE_CONFIG_RECEIVED;
+00280       break;
+00281     }
+00282 
+00283     if(s.ticks <= CLOCK_SECOND * 10) {
+00284       s.ticks += CLOCK_SECOND;
+00285     } else {
+00286       PT_RESTART(&s.pt);
+00287     }
+00288   } while(s.state != STATE_CONFIG_RECEIVED);
+00289   
+00290 #if 0
+00291   printf("Got IP address %d.%d.%d.%d\n",
+00292          uip_ipaddr1(s.ipaddr), uip_ipaddr2(s.ipaddr),
+00293          uip_ipaddr3(s.ipaddr), uip_ipaddr4(s.ipaddr));
+00294   printf("Got netmask %d.%d.%d.%d\n",
+00295          uip_ipaddr1(s.netmask), uip_ipaddr2(s.netmask),
+00296          uip_ipaddr3(s.netmask), uip_ipaddr4(s.netmask));
+00297   printf("Got DNS server %d.%d.%d.%d\n",
+00298          uip_ipaddr1(s.dnsaddr), uip_ipaddr2(s.dnsaddr),
+00299          uip_ipaddr3(s.dnsaddr), uip_ipaddr4(s.dnsaddr));
+00300   printf("Got default router %d.%d.%d.%d\n",
+00301          uip_ipaddr1(s.default_router), uip_ipaddr2(s.default_router),
+00302          uip_ipaddr3(s.default_router), uip_ipaddr4(s.default_router));
+00303   printf("Lease expires in %ld seconds\n",
+00304          ntohs(s.lease_time[0])*65536ul + ntohs(s.lease_time[1]));
+00305 #endif
+00306 
+00307   dhcpc_configured(&s);
+00308   
+00309   /*  timer_stop(&s.timer);*/
+00310 
+00311   /*
+00312    * PT_END restarts the thread so we do this instead. Eventually we
+00313    * should reacquire expired leases here.
+00314    */
+00315   while(1) {
+00316     PT_YIELD(&s.pt);
+00317   }
+00318 
+00319   PT_END(&s.pt);
+00320 }
+00321 /*---------------------------------------------------------------------------*/
+00322 void
+00323 dhcpc_init(const void *mac_addr, int mac_len)
+00324 {
+00325   uip_ipaddr_t addr;
+00326   
+00327   s.mac_addr = mac_addr;
+00328   s.mac_len  = mac_len;
+00329 
+00330   s.state = STATE_INITIAL;
+00331   uip_ipaddr(addr, 255,255,255,255);
+00332   s.conn = uip_udp_new(&addr, HTONS(DHCPC_SERVER_PORT));
+00333   if(s.conn != NULL) {
+00334     uip_udp_bind(s.conn, HTONS(DHCPC_CLIENT_PORT));
+00335   }
+00336   PT_INIT(&s.pt);
+00337 }
+00338 /*---------------------------------------------------------------------------*/
+00339 void
+00340 dhcpc_appcall(void)
+00341 {
+00342   handle_dhcp();
+00343 }
+00344 /*---------------------------------------------------------------------------*/
+00345 void
+00346 dhcpc_request(void)
+00347 {
+00348   u16_t ipaddr[2];
+00349   
+00350   if(s.state == STATE_INITIAL) {
+00351     uip_ipaddr(ipaddr, 0,0,0,0);
+00352     uip_sethostaddr(ipaddr);
+00353     /*    handle_dhcp(PROCESS_EVENT_NONE, NULL);*/
+00354   }
+00355 }
+00356 /*---------------------------------------------------------------------------*/
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00049.html b/third_party/uip-1.0/doc/html/a00049.html new file mode 100644 index 0000000..481e47d --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00049.html @@ -0,0 +1,88 @@ + + +uIP 1.0: dhcpc.h + + + + + +

dhcpc.h

00001 /*
+00002  * Copyright (c) 2005, Swedish Institute of Computer Science
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * @(#)$Id: dhcpc.h,v 1.3 2006/06/11 21:46:37 adam Exp $
+00032  */
+00033 #ifndef __DHCPC_H__
+00034 #define __DHCPC_H__
+00035 
+00036 #include "timer.h"
+00037 #include "pt.h"
+00038 
+00039 struct dhcpc_state {
+00040   struct pt pt;
+00041   char state;
+00042   struct uip_udp_conn *conn;
+00043   struct timer timer;
+00044   u16_t ticks;
+00045   const void *mac_addr;
+00046   int mac_len;
+00047   
+00048   u8_t serverid[4];
+00049 
+00050   u16_t lease_time[2];
+00051   u16_t ipaddr[2];
+00052   u16_t netmask[2];
+00053   u16_t dnsaddr[2];
+00054   u16_t default_router[2];
+00055 };
+00056 
+00057 void dhcpc_init(const void *mac_addr, int mac_len);
+00058 void dhcpc_request(void);
+00059 
+00060 void dhcpc_appcall(void);
+00061 
+00062 void dhcpc_configured(const struct dhcpc_state *s);
+00063 
+00064 typedef struct dhcpc_state uip_udp_appstate_t;
+00065 #define UIP_UDP_APPCALL dhcpc_appcall
+00066 
+00067 
+00068 #endif /* __DHCPC_H__ */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00050.html b/third_party/uip-1.0/doc/html/a00050.html new file mode 100644 index 0000000..e5f483f --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00050.html @@ -0,0 +1,177 @@ + + +uIP 1.0: uip-conf.h + + + + + +

uip-conf.h

00001 /**
+00002  * \addtogroup uipopt
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \name Project-specific configuration options
+00008  * @{
+00009  *
+00010  * uIP has a number of configuration options that can be overridden
+00011  * for each project. These are kept in a project-specific uip-conf.h
+00012  * file and all configuration names have the prefix UIP_CONF.
+00013  */
+00014 
+00015 /*
+00016  * Copyright (c) 2006, Swedish Institute of Computer Science.
+00017  * All rights reserved.
+00018  *
+00019  * Redistribution and use in source and binary forms, with or without
+00020  * modification, are permitted provided that the following conditions
+00021  * are met:
+00022  * 1. Redistributions of source code must retain the above copyright
+00023  *    notice, this list of conditions and the following disclaimer.
+00024  * 2. Redistributions in binary form must reproduce the above copyright
+00025  *    notice, this list of conditions and the following disclaimer in the
+00026  *    documentation and/or other materials provided with the distribution.
+00027  * 3. Neither the name of the Institute nor the names of its contributors
+00028  *    may be used to endorse or promote products derived from this software
+00029  *    without specific prior written permission.
+00030  *
+00031  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00032  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00033  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00034  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00035  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00036  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00037  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00038  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00039  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00040  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00041  * SUCH DAMAGE.
+00042  *
+00043  * This file is part of the uIP TCP/IP stack
+00044  *
+00045  * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $
+00046  */
+00047 
+00048 /**
+00049  * \file
+00050  *         An example uIP configuration file
+00051  * \author
+00052  *         Adam Dunkels <adam@sics.se>
+00053  */
+00054 
+00055 #ifndef __UIP_CONF_H__
+00056 #define __UIP_CONF_H__
+00057 
+00058 #include <inttypes.h>
+00059 
+00060 /**
+00061  * 8 bit datatype
+00062  *
+00063  * This typedef defines the 8-bit type used throughout uIP.
+00064  *
+00065  * \hideinitializer
+00066  */
+00067 typedef uint8_t u8_t;
+00068 
+00069 /**
+00070  * 16 bit datatype
+00071  *
+00072  * This typedef defines the 16-bit type used throughout uIP.
+00073  *
+00074  * \hideinitializer
+00075  */
+00076 typedef uint16_t u16_t;
+00077 
+00078 /**
+00079  * Statistics datatype
+00080  *
+00081  * This typedef defines the dataype used for keeping statistics in
+00082  * uIP.
+00083  *
+00084  * \hideinitializer
+00085  */
+00086 typedef unsigned short uip_stats_t;
+00087 
+00088 /**
+00089  * Maximum number of TCP connections.
+00090  *
+00091  * \hideinitializer
+00092  */
+00093 #define UIP_CONF_MAX_CONNECTIONS 40
+00094 
+00095 /**
+00096  * Maximum number of listening TCP ports.
+00097  *
+00098  * \hideinitializer
+00099  */
+00100 #define UIP_CONF_MAX_LISTENPORTS 40
+00101 
+00102 /**
+00103  * uIP buffer size.
+00104  *
+00105  * \hideinitializer
+00106  */
+00107 #define UIP_CONF_BUFFER_SIZE     420
+00108 
+00109 /**
+00110  * CPU byte order.
+00111  *
+00112  * \hideinitializer
+00113  */
+00114 #define UIP_CONF_BYTE_ORDER      LITTLE_ENDIAN
+00115 
+00116 /**
+00117  * Logging on or off
+00118  *
+00119  * \hideinitializer
+00120  */
+00121 #define UIP_CONF_LOGGING         1
+00122 
+00123 /**
+00124  * UDP support on or off
+00125  *
+00126  * \hideinitializer
+00127  */
+00128 #define UIP_CONF_UDP             0
+00129 
+00130 /**
+00131  * UDP checksums on or off
+00132  *
+00133  * \hideinitializer
+00134  */
+00135 #define UIP_CONF_UDP_CHECKSUMS   1
+00136 
+00137 /**
+00138  * uIP statistics on or off
+00139  *
+00140  * \hideinitializer
+00141  */
+00142 #define UIP_CONF_STATISTICS      1
+00143 
+00144 /* Here we include the header file for the application(s) we use in
+00145    our project. */
+00146 /*#include "smtp.h"*/
+00147 /*#include "hello-world.h"*/
+00148 /*#include "telnetd.h"*/
+00149 #include "webserver.h"
+00150 /*#include "dhcpc.h"*/
+00151 /*#include "resolv.h"*/
+00152 /*#include "webclient.h"*/
+00153 
+00154 #endif /* __UIP_CONF_H__ */
+00155 
+00156 /** @} */
+00157 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00051.html b/third_party/uip-1.0/doc/html/a00051.html new file mode 100644 index 0000000..ba8fe52 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00051.html @@ -0,0 +1,138 @@ + + +uIP 1.0: uip-code-style.c + + + + + +

uip-code-style.c

00001 /* This is the official code style of uIP. */
+00002 
+00003 /**
+00004  * \defgroup codestyle Coding style
+00005  *
+00006  * This is how a Doxygen module is documented - start with a \defgroup
+00007  * Doxygen keyword at the beginning of the file to define a module,
+00008  * and use the \addtogroup Doxygen keyword in all other files that
+00009  * belong to the same module. Typically, the \defgroup is placed in
+00010  * the .h file and \addtogroup in the .c file.
+00011  *
+00012  * @{
+00013  */
+00014 
+00015 /**
+00016  * \file
+00017  *         A brief description of what this file is.
+00018  * \author
+00019  *         Adam Dunkels <adam@sics.se>
+00020  *
+00021  *         Every file that is part of a documented module has to have
+00022  *         a \file block, else it will not show up in the Doxygen
+00023  *         "Modules" * section.
+00024  */
+00025 
+00026 /* Single line comments look like this. */
+00027 
+00028 /*
+00029  * Multi-line comments look like this. Comments should prefferably be
+00030  * full sentences, filled to look like real paragraphs.
+00031  */
+00032 
+00033 #include "uip.h"
+00034 
+00035 /*
+00036  * Make sure that non-global variables are all maked with the static
+00037  * keyword. This keeps the size of the symbol table down.
+00038  */
+00039 static int flag;
+00040 
+00041 /*
+00042  * All variables and functions that are visible outside of the file
+00043  * should have the module name prepended to them. This makes it easy
+00044  * to know where to look for function and variable definitions.
+00045  *
+00046  * Put dividers (a single-line comment consisting only of dashes)
+00047  * between functions.
+00048  */
+00049 /*---------------------------------------------------------------------------*/
+00050 /**
+00051  * \brief      Use Doxygen documentation for functions.
+00052  * \param c    Briefly describe all parameters.
+00053  * \return     Briefly describe the return value.
+00054  * \retval 0   Functions that return a few specified values
+00055  * \retval 1   can use the \retval keyword instead of \return.
+00056  *
+00057  *             Put a longer description of what the function does
+00058  *             after the preamble of Doxygen keywords.
+00059  *
+00060  *             This template should always be used to document
+00061  *             functions. The text following the introduction is used
+00062  *             as the function's documentation.
+00063  *
+00064  *             Function prototypes have the return type on one line,
+00065  *             the name and arguments on one line (with no space
+00066  *             between the name and the first parenthesis), followed
+00067  *             by a single curly bracket on its own line.
+00068  */
+00069 void
+00070 code_style_example_function(void)
+00071 {
+00072   /*
+00073    * Local variables should always be declared at the start of the
+00074    * function.
+00075    */
+00076   int i;                   /* Use short variable names for loop
+00077                               counters. */
+00078 
+00079   /*
+00080    * There should be no space between keywords and the first
+00081    * parenthesis. There should be spaces around binary operators, no
+00082    * spaces between a unary operator and its operand.
+00083    *
+00084    * Curly brackets following for(), if(), do, and case() statements
+00085    * should follow the statement on the same line.
+00086    */
+00087   for(i = 0; i < 10; ++i) {
+00088     /*
+00089      * Always use full blocks (curly brackets) after if(), for(), and
+00090      * while() statements, even though the statement is a single line
+00091      * of code. This makes the code easier to read and modifications
+00092      * are less error prone.
+00093      */
+00094     if(i == c) {
+00095       return c;           /* No parentesis around return values. */
+00096     } else {              /* The else keyword is placed inbetween
+00097                              curly brackers, always on its own line. */
+00098       c++;
+00099     }
+00100   }
+00101 }
+00102 /*---------------------------------------------------------------------------*/
+00103 /*
+00104  * Static (non-global) functions do not need Doxygen comments. The
+00105  * name should not be prepended with the module name - doing so would
+00106  * create confusion.
+00107  */
+00108 static void
+00109 an_example_function(void)
+00110 {
+00111   
+00112 }
+00113 /*---------------------------------------------------------------------------*/
+00114 
+00115 /* The following stuff ends the \defgroup block at the beginning of
+00116    the file: */
+00117 
+00118 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00077.html b/third_party/uip-1.0/doc/html/a00077.html new file mode 100644 index 0000000..ce3bdf8 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00077.html @@ -0,0 +1,78 @@ + + +uIP 1.0: dhcpc_state Struct Reference + + + + + + +

dhcpc_state Struct Reference


Detailed Description

+
Examples:
+ +

+dhcpc.c, and dhcpc.h.

+

+ +

+Definition at line 39 of file dhcpc.h.

LocalRemoteStateRetransmissionsTimerFlags
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

+pt pt
+char state
+uip_udp_connconn
+timer timer
+u16_t ticks
+const void * mac_addr
+int mac_len
+u8_t serverid [4]
+u16_t lease_time [2]
+u16_t ipaddr [2]
+u16_t netmask [2]
+u16_t dnsaddr [2]
+u16_t default_router [2]
+
Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00078.html b/third_party/uip-1.0/doc/html/a00078.html new file mode 100644 index 0000000..3b71d67 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00078.html @@ -0,0 +1,51 @@ + + +uIP 1.0: hello_world_state Struct Reference + + + + + + +

hello_world_state Struct Reference
+ +[Hello, world] +


Detailed Description

+
Examples:
+ +

+hello-world.c, and hello-world.h.

+

+ +

+Definition at line 36 of file hello-world.h. + + + + + + + + +

Data Fields

+psock p
+char inputbuffer [10]
+char name [40]
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00079.html b/third_party/uip-1.0/doc/html/a00079.html new file mode 100644 index 0000000..36e884e --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00079.html @@ -0,0 +1,45 @@ + + +uIP 1.0: httpd_cgi_call Struct Reference + + + + + + +

httpd_cgi_call Struct Reference
+ +[Web server] +


Detailed Description

+ +

+ +

+Definition at line 60 of file httpd-cgi.h. + + + + + + +

Data Fields

+const char * name
+const httpd_cgifunction function
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00080.html b/third_party/uip-1.0/doc/html/a00080.html new file mode 100644 index 0000000..3531046 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00080.html @@ -0,0 +1,69 @@ + + +uIP 1.0: httpd_state Struct Reference + + + + + + +

httpd_state Struct Reference


Detailed Description

+ +

+ +

+Definition at line 41 of file httpd.h. + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

+unsigned char timer
+psock sin sout
+pt outputpt scriptpt
+char inputbuf [50]
+char filename [20]
+char state
+httpd_fs_file file
+int len
+char * scriptptr
+int scriptlen
+unsigned short count
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00081.html b/third_party/uip-1.0/doc/html/a00081.html new file mode 100644 index 0000000..abe0701 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00081.html @@ -0,0 +1,51 @@ + + +uIP 1.0: memb_blocks Struct Reference + + + + + + +

memb_blocks Struct Reference
+ +[Memory block management functions] +


Detailed Description

+ +

+ +

+Definition at line 105 of file memb.h. + + + + + + + + + + +

Data Fields

+unsigned short size
+unsigned short num
+char * count
+void * mem
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00082.html b/third_party/uip-1.0/doc/html/a00082.html new file mode 100644 index 0000000..adc9082 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00082.html @@ -0,0 +1,73 @@ + + +uIP 1.0: psock Struct Reference + + + + + + +

psock Struct Reference
+ +[Protosockets library] +

#include <psock.h> +

+


Detailed Description

+The representation of a protosocket. +

+The protosocket structrure is an opaque structure with no user-visible elements.

Examples:
+ +

+hello-world.h.

+

+ +

+Definition at line 106 of file psock.h. + + + + + + + + + + + + + + + + + + + + +

Data Fields

+pt pt psockpt
+const u8_tsendptr
+u8_treadptr
+char * bufptr
+u16_t sendlen
+u16_t readlen
+psock_buf buf
+unsigned int bufsize
+unsigned char state
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00083.html b/third_party/uip-1.0/doc/html/a00083.html new file mode 100644 index 0000000..081035f --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00083.html @@ -0,0 +1,45 @@ + + +uIP 1.0: psock_buf Struct Reference + + + + + + +

psock_buf Struct Reference
+ +[Protosockets library] +


Detailed Description

+ +

+ +

+Definition at line 95 of file psock.h. + + + + + + +

Data Fields

+u8_tptr
+unsigned short left
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00084.html b/third_party/uip-1.0/doc/html/a00084.html new file mode 100644 index 0000000..a53f6c7 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00084.html @@ -0,0 +1,45 @@ + + +uIP 1.0: pt Struct Reference + + + + + + +

pt Struct Reference
+ +[Protothreads] +


Detailed Description

+
Examples:
+ +

+dhcpc.h.

+

+ +

+Definition at line 54 of file pt.h. + + + + +

Data Fields

+lc_t lc
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00085.html b/third_party/uip-1.0/doc/html/a00085.html new file mode 100644 index 0000000..c058765 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00085.html @@ -0,0 +1,69 @@ + + +uIP 1.0: smtp_state Struct Reference + + + + + + +

smtp_state Struct Reference
+ +[SMTP E-mail sender] +


Detailed Description

+
Examples:
+ +

+hello-world.h, smtp.c, and smtp.h.

+

+ +

+Definition at line 81 of file smtp.h. + + + + + + + + + + + + + + + + + + + + +

Data Fields

+u8_t state
+char * to
+char * from
+char * subject
+char * msg
+u16_t msglen
+u16_t sentlen
+u16_t textlen
+u16_t sendptr
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00086.html b/third_party/uip-1.0/doc/html/a00086.html new file mode 100644 index 0000000..746368a --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00086.html @@ -0,0 +1,54 @@ + + +uIP 1.0: telnetd_state Struct Reference + + + + + + +

telnetd_state Struct Reference


Detailed Description

+
Examples:
+ +

+telnetd.c, and telnetd.h.

+

+ +

+Definition at line 49 of file telnetd.h. + + + + + + + + + + + + +

Data Fields

+char * lines [TELNETD_CONF_NUMLINES]
+char buf [TELNETD_CONF_LINELEN]
+char bufptr
+u8_t numsent
+u8_t state
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00087.html b/third_party/uip-1.0/doc/html/a00087.html new file mode 100644 index 0000000..dcdc578 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00087.html @@ -0,0 +1,52 @@ + + +uIP 1.0: timer Struct Reference + + + + + + +

timer Struct Reference
+ +[Timer library] +

#include <timer.h> +

+


Detailed Description

+A timer. +

+This structure is used for declaring a timer. The timer must be set with timer_set() before it can be used.

Examples:
+ +

+dhcpc.h, example-mainloop-with-arp.c, example-mainloop-without-arp.c, and webclient.h.

+

+ +

+Definition at line 74 of file timer.h. + + + + + + +

Data Fields

+clock_time_t start
+clock_time_t interval
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00088.html b/third_party/uip-1.0/doc/html/a00088.html new file mode 100644 index 0000000..250eb98 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00088.html @@ -0,0 +1,103 @@ + + +uIP 1.0: uip_conn Struct Reference + + + + + + +

uip_conn Struct Reference
+ +[The uIP TCP/IP stack] +

#include <uip.h> +

+


Detailed Description

+Representation of a uIP TCP connection. +

+The uip_conn structure is used for identifying a connection. All but one field in the structure are to be considered read-only by an application. The only exception is the appstate field whos purpose is to let the application store application-specific state (e.g., file pointers) for the connection. The type of this field is configured in the "uipopt.h" header file. +

+ +

+Definition at line 1153 of file uip.h. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

+uip_ipaddr_t ripaddr
 The IP address of the remote host.
+u16_t lport
 The local TCP port, in network byte order.
+u16_t rport
 The local remote TCP port, in network byte order.
+u8_t rcv_nxt [4]
 The sequence number that we expect to receive next.
+u8_t snd_nxt [4]
 The sequence number that was last sent by us.
+u16_t len
 Length of the data that was previously sent.
+u16_t mss
 Current maximum segment size for the connection.
+u16_t initialmss
 Initial maximum segment size for the connection.
+u8_t sa
 Retransmission time-out calculation state variable.
+u8_t sv
 Retransmission time-out calculation state variable.
+u8_t rto
 Retransmission time-out.
+u8_t tcpstateflags
 TCP state and flags.
+u8_t timer
 The retransmission timer.
+u8_t nrtx
 The number of retransmissions for the last segment sent.
+uip_tcp_appstate_t appstate
 The application state.
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00089.html b/third_party/uip-1.0/doc/html/a00089.html new file mode 100644 index 0000000..7ab1aad --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00089.html @@ -0,0 +1,44 @@ + + +uIP 1.0: uip_eth_addr Struct Reference + + + + + + +

uip_eth_addr Struct Reference
+ +[The uIP TCP/IP stack] +

#include <uip.h> +

+


Detailed Description

+Representation of a 48-bit Ethernet address. +

+ +

+Definition at line 1542 of file uip.h. + + + + +

Data Fields

+u8_t addr [6]
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00090.html b/third_party/uip-1.0/doc/html/a00090.html new file mode 100644 index 0000000..46027a6 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00090.html @@ -0,0 +1,50 @@ + + +uIP 1.0: uip_eth_hdr Struct Reference + + + + + + +

uip_eth_hdr Struct Reference
+ +[uIP Address Resolution Protocol] +

#include <uip_arp.h> +

+


Detailed Description

+The Ethernet header. +

+ +

+Definition at line 63 of file uip_arp.h. + + + + + + + + +

Data Fields

+uip_eth_addr dest
+uip_eth_addr src
+u16_t type
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00091.html b/third_party/uip-1.0/doc/html/a00091.html new file mode 100644 index 0000000..048f9a3 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00091.html @@ -0,0 +1,84 @@ + + +uIP 1.0: uip_icmpip_hdr Struct Reference + + + + + + +

uip_icmpip_hdr Struct Reference
+ +[The uIP TCP/IP stack] +


Detailed Description

+ +

+ +

+Definition at line 1423 of file uip.h. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

+u8_t vhl
+u8_t tos
+u8_t len [2]
+u8_t ipid [2]
+u8_t ipoffset [2]
+u8_t ttl
+u8_t proto
+u16_t ipchksum
+u16_t srcipaddr [2]
+u16_t destipaddr [2]
+u8_t type
+u8_t icode
+u16_t icmpchksum
+u16_t id
+u16_t seqno
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00092.html b/third_party/uip-1.0/doc/html/a00092.html new file mode 100644 index 0000000..f5ccaca --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00092.html @@ -0,0 +1,39 @@ + + +uIP 1.0: uip_neighbor_addr Struct Reference + + + + + + +

uip_neighbor_addr Struct Reference


Detailed Description

+ +

+ +

+Definition at line 47 of file uip-neighbor.h. + + + + +

Data Fields

+uip_eth_addr addr
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00093.html b/third_party/uip-1.0/doc/html/a00093.html new file mode 100644 index 0000000..40bb9d1 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00093.html @@ -0,0 +1,143 @@ + + +uIP 1.0: uip_stats Struct Reference + + + + + + +

uip_stats Struct Reference
+ +[The uIP TCP/IP stack] +

#include <uip.h> +

+


Detailed Description

+The structure holding the TCP/IP statistics that are gathered if UIP_STATISTICS is set to 1. +

+ +

+Definition at line 1232 of file uip.h. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

+struct {
   uip_stats_t   drop
 Number of dropped packets at the IP layer.
   uip_stats_t   recv
 Number of received packets at the IP layer.
   uip_stats_t   sent
 Number of sent packets at the IP layer.
   uip_stats_t   vhlerr
 Number of packets dropped due to wrong IP version or header length.
   uip_stats_t   hblenerr
 Number of packets dropped due to wrong IP length, high byte.
   uip_stats_t   lblenerr
 Number of packets dropped due to wrong IP length, low byte.
   uip_stats_t   fragerr
 Number of packets dropped since they were IP fragments.
   uip_stats_t   chkerr
 Number of packets dropped due to IP checksum errors.
   uip_stats_t   protoerr
 Number of packets dropped since they were neither ICMP, UDP nor TCP.
ip
 IP statistics.
+struct {
   uip_stats_t   drop
 Number of dropped ICMP packets.
   uip_stats_t   recv
 Number of received ICMP packets.
   uip_stats_t   sent
 Number of sent ICMP packets.
   uip_stats_t   typeerr
 Number of ICMP packets with a wrong type.
icmp
 ICMP statistics.
+struct {
   uip_stats_t   drop
 Number of dropped TCP segments.
   uip_stats_t   recv
 Number of recived TCP segments.
   uip_stats_t   sent
 Number of sent TCP segments.
   uip_stats_t   chkerr
 Number of TCP segments with a bad checksum.
   uip_stats_t   ackerr
 Number of TCP segments with a bad ACK number.
   uip_stats_t   rst
 Number of recevied TCP RST (reset) segments.
   uip_stats_t   rexmit
 Number of retransmitted TCP segments.
   uip_stats_t   syndrop
 Number of dropped SYNs due to too few connections was avaliable.
   uip_stats_t   synrst
 Number of SYNs for closed ports, triggering a RST.
tcp
 TCP statistics.
+struct {
   uip_stats_t   drop
 Number of dropped UDP segments.
   uip_stats_t   recv
 Number of recived UDP segments.
   uip_stats_t   sent
 Number of sent UDP segments.
   uip_stats_t   chkerr
 Number of UDP segments with a bad checksum.
udp
 UDP statistics.
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00094.html b/third_party/uip-1.0/doc/html/a00094.html new file mode 100644 index 0000000..d7415bc --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00094.html @@ -0,0 +1,99 @@ + + +uIP 1.0: uip_tcpip_hdr Struct Reference + + + + + + +

uip_tcpip_hdr Struct Reference
+ +[The uIP TCP/IP stack] +


Detailed Description

+ +

+ +

+Definition at line 1386 of file uip.h. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

+u8_t vhl
+u8_t tos
+u8_t len [2]
+u8_t ipid [2]
+u8_t ipoffset [2]
+u8_t ttl
+u8_t proto
+u16_t ipchksum
+u16_t srcipaddr [2]
+u16_t destipaddr [2]
+u16_t srcport
+u16_t destport
+u8_t seqno [4]
+u8_t ackno [4]
+u8_t tcpoffset
+u8_t flags
+u8_t wnd [2]
+u16_t tcpchksum
+u8_t urgp [2]
+u8_t optdata [4]
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00095.html b/third_party/uip-1.0/doc/html/a00095.html new file mode 100644 index 0000000..0ef01d5 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00095.html @@ -0,0 +1,64 @@ + + +uIP 1.0: uip_udp_conn Struct Reference + + + + + + +

uip_udp_conn Struct Reference
+ +[The uIP TCP/IP stack] +

#include <uip.h> +

+


Detailed Description

+Representation of a uIP UDP connection.
Examples:
+ +

+dhcpc.h, and resolv.c.

+

+ +

+Definition at line 1210 of file uip.h. + + + + + + + + + + + + + + + + + +

Data Fields

+uip_ipaddr_t ripaddr
 The IP address of the remote peer.
+u16_t lport
 The local port number in network byte order.
+u16_t rport
 The remote port number in network byte order.
+u8_t ttl
 Default time-to-live.
+uip_udp_appstate_t appstate
 The application state.
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00096.html b/third_party/uip-1.0/doc/html/a00096.html new file mode 100644 index 0000000..2f5acb4 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00096.html @@ -0,0 +1,81 @@ + + +uIP 1.0: uip_udpip_hdr Struct Reference + + + + + + +

uip_udpip_hdr Struct Reference
+ +[The uIP TCP/IP stack] +


Detailed Description

+ +

+ +

+Definition at line 1460 of file uip.h. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

+u8_t vhl
+u8_t tos
+u8_t len [2]
+u8_t ipid [2]
+u8_t ipoffset [2]
+u8_t ttl
+u8_t proto
+u16_t ipchksum
+u16_t srcipaddr [2]
+u16_t destipaddr [2]
+u16_t srcport
+u16_t destport
+u16_t udplen
+u16_t udpchksum
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00097.html b/third_party/uip-1.0/doc/html/a00097.html new file mode 100644 index 0000000..a74d8ef --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00097.html @@ -0,0 +1,75 @@ + + +uIP 1.0: webclient_state Struct Reference + + + + + + +

webclient_state Struct Reference
+ +[Web client] +


Detailed Description

+
Examples:
+ +

+webclient.c, and webclient.h.

+

+ +

+Definition at line 55 of file webclient.h. + + + + + + + + + + + + + + + + + + + + + + + + +

Data Fields

+u8_t timer
+u8_t state
+u8_t httpflag
+u16_t port
+char host [40]
+char file [WEBCLIENT_CONF_MAX_URLLEN]
+u16_t getrequestptr
+u16_t getrequestleft
+char httpheaderline [200]
+u16_t httpheaderlineptr
+char mimetype [32]
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00100.html b/third_party/uip-1.0/doc/html/a00100.html new file mode 100644 index 0000000..2bcd6ea --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00100.html @@ -0,0 +1,48 @@ + + +uIP 1.0: apps/hello-world/hello-world.c File Reference + + + + + + +

apps/hello-world/hello-world.c File Reference


Detailed Description

+An example of how to write uIP applications with protosockets. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file hello-world.c. +

+#include "hello-world.h"
+#include "uip.h"
+#include <string.h>
+ +

+Go to the source code of this file. + + + + + + +

Functions

+void hello_world_init (void)
+void hello_world_appcall (void)
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00101.html b/third_party/uip-1.0/doc/html/a00101.html new file mode 100644 index 0000000..fc408be --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00101.html @@ -0,0 +1,54 @@ + + +uIP 1.0: apps/hello-world/hello-world.h File Reference + + + + + + +

apps/hello-world/hello-world.h File Reference


Detailed Description

+Header file for an example of how to write uIP applications with protosockets. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file hello-world.h. +

+#include "uipopt.h"
+#include "psock.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + +

Data Structures

struct  hello_world_state

Defines

+#define UIP_APPCALL   hello_world_appcall

Functions

+void hello_world_appcall (void)
+void hello_world_init (void)
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00102.html b/third_party/uip-1.0/doc/html/a00102.html new file mode 100644 index 0000000..eed00f0 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00102.html @@ -0,0 +1,119 @@ + + +uIP 1.0: apps/resolv/resolv.c File Reference + + + + + + +

apps/resolv/resolv.c File Reference


Detailed Description

+DNS host name to IP address resolver. +

+

Author:
Adam Dunkels <adam@dunkels.com>
+This file implements a DNS host name to IP address resolver. +

+Definition in file resolv.c. +

+#include "resolv.h"
+#include "uip.h"
+#include <string.h>
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

+#define NULL   (void *)0
+#define MAX_RETRIES   8
+#define DNS_FLAG1_RESPONSE   0x80
+#define DNS_FLAG1_OPCODE_STATUS   0x10
+#define DNS_FLAG1_OPCODE_INVERSE   0x08
+#define DNS_FLAG1_OPCODE_STANDARD   0x00
+#define DNS_FLAG1_AUTHORATIVE   0x04
+#define DNS_FLAG1_TRUNC   0x02
+#define DNS_FLAG1_RD   0x01
+#define DNS_FLAG2_RA   0x80
+#define DNS_FLAG2_ERR_MASK   0x0f
+#define DNS_FLAG2_ERR_NONE   0x00
+#define DNS_FLAG2_ERR_NAME   0x03
+#define STATE_UNUSED   0
+#define STATE_NEW   1
+#define STATE_ASKING   2
+#define STATE_DONE   3
+#define STATE_ERROR   4
+#define RESOLV_ENTRIES   4

Functions

+void resolv_appcall (void)
void resolv_query (char *name)
 Queues a name so that a question for the name will be sent out.
u16_tresolv_lookup (char *name)
 Look up a hostname in the array of known hostnames.
u16_tresolv_getserver (void)
 Obtain the currently configured DNS server.
void resolv_conf (u16_t *dnsserver)
 Configure which DNS server to use for queries.
+void resolv_init (void)
 Initalize the resolver.
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00103.html b/third_party/uip-1.0/doc/html/a00103.html new file mode 100644 index 0000000..28a0fe4 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00103.html @@ -0,0 +1,84 @@ + + +uIP 1.0: apps/resolv/resolv.h File Reference + + + + + + +

apps/resolv/resolv.h File Reference


Detailed Description

+DNS resolver code header file. +

+

Author:
Adam Dunkels <adam@dunkels.com>
+ +

+Definition in file resolv.h. +

+#include "uipopt.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Appication specific configurations

An uIP application is implemented using a single application function that is called by uIP whenever a TCP/IP event occurs. The name of this function must be registered with uIP at compile time using the UIP_APPCALL definition.

+uIP applications can store the application state within the uip_conn structure by specifying the type of the application structure by typedef:ing the type uip_tcp_appstate_t and uip_udp_appstate_t.

+The file containing the definitions must be included in the uipopt.h file.

+The following example illustrates how this can look.

void httpd_appcall(void);
+#define UIP_APPCALL     httpd_appcall
+
+struct httpd_state {
+  u8_t state;
+  u16_t count;
+  char *dataptr;
+  char *script;
+};
+typedef struct httpd_state uip_tcp_appstate_t
+


typedef int uip_udp_appstate_t
 The type of the application state that is to be stored in the uip_conn structure.

Defines

+#define UIP_UDP_APPCALL   resolv_appcall

Functions

+void resolv_appcall (void)
void resolv_found (char *name, u16_t *ipaddr)
 Callback function which is called when a hostname is found.
void resolv_conf (u16_t *dnsserver)
 Configure which DNS server to use for queries.
u16_tresolv_getserver (void)
 Obtain the currently configured DNS server.
+void resolv_init (void)
 Initalize the resolver.
u16_tresolv_lookup (char *name)
 Look up a hostname in the array of known hostnames.
void resolv_query (char *name)
 Queues a name so that a question for the name will be sent out.
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00104.html b/third_party/uip-1.0/doc/html/a00104.html new file mode 100644 index 0000000..1e0cac0 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00104.html @@ -0,0 +1,78 @@ + + +uIP 1.0: apps/smtp/smtp.c File Reference + + + + + + +

apps/smtp/smtp.c File Reference


Detailed Description

+SMTP example implementation. +

+

Author:
Adam Dunkels <adam@dunkels.com>
+ +

+Definition in file smtp.c. +

+#include "smtp.h"
+#include "smtp-strings.h"
+#include "psock.h"
+#include "uip.h"
+#include <string.h>
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

+#define ISO_nl   0x0a
+#define ISO_cr   0x0d
+#define ISO_period   0x2e
+#define ISO_2   0x32
+#define ISO_3   0x33
+#define ISO_4   0x34
+#define ISO_5   0x35

Functions

+void smtp_appcall (void)
void smtp_configure (char *lhostname, void *server)
 Specificy an SMTP server and hostname.
unsigned char smtp_send (char *to, char *cc, char *from, char *subject, char *msg, u16_t msglen)
 Send an e-mail.
+void smtp_init (void)
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00105.html b/third_party/uip-1.0/doc/html/a00105.html new file mode 100644 index 0000000..a774ba0 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00105.html @@ -0,0 +1,82 @@ + + +uIP 1.0: apps/smtp/smtp.h File Reference + + + + + + +

apps/smtp/smtp.h File Reference


Detailed Description

+SMTP header file. +

+

Author:
Adam Dunkels <adam@dunkels.com>
+ +

+Definition in file smtp.h. +

+#include "uipopt.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Structures

struct  smtp_state

Appication specific configurations

An uIP application is implemented using a single application function that is called by uIP whenever a TCP/IP event occurs. The name of this function must be registered with uIP at compile time using the UIP_APPCALL definition.

+uIP applications can store the application state within the uip_conn structure by specifying the type of the application structure by typedef:ing the type uip_tcp_appstate_t and uip_udp_appstate_t.

+The file containing the definitions must be included in the uipopt.h file.

+The following example illustrates how this can look.

void httpd_appcall(void);
+#define UIP_APPCALL     httpd_appcall
+
+struct httpd_state {
+  u8_t state;
+  u16_t count;
+  char *dataptr;
+  char *script;
+};
+typedef struct httpd_state uip_tcp_appstate_t
+


+#define UIP_APPCALL   smtp_appcall
 The name of the application function that uIP should call in response to TCP/IP events.
typedef smtp_state uip_tcp_appstate_t
 The type of the application state that is to be stored in the uip_conn structure.

Defines

+#define SMTP_ERR_OK   0
 Error number that signifies a non-error condition.
+#define SMTP_SEND(to, cc, from, subject, msg)   smtp_send(to, cc, from, subject, msg, strlen(msg))

Functions

void smtp_done (unsigned char error)
 Callback function that is called when an e-mail transmission is done.
+void smtp_init (void)
+void smtp_appcall (void)
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00107.html b/third_party/uip-1.0/doc/html/a00107.html new file mode 100644 index 0000000..067bb4b --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00107.html @@ -0,0 +1,268 @@ + + +uIP 1.0: apps/telnetd/shell.h File Reference + + + + + + +

apps/telnetd/shell.h File Reference


Detailed Description

+Interface for the Contiki shell. +

+

Author:
Adam Dunkels <adam@dunkels.com>
+Some of the functions declared in this file must be implemented as a shell back-end in the architecture specific files of a Contiki port. +

+Definition in file shell.h. +

+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + +

Functions

void shell_init (void)
 Initialize the shell.
void shell_start (void)
 Start the shell back-end.
void shell_input (char *command)
 Process a shell command.
+void shell_quit (char *)
 Quit the shell.
void shell_output (char *str1, char *str2)
 Print a string to the shell window.
void shell_prompt (char *prompt)
 Print a prompt to the shell window.
+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
void shell_init void   ) 
+
+ + + + + +
+   + + +

+Initialize the shell. +

+Called when the shell front-end process starts. This function may be used to start listening for signals.

Examples:
+telnetd.c.
+

+Definition at line 105 of file shell.c. +

+References shell_init(). +

+Referenced by shell_init().

+

+ + + + +
+ + + + + + + + + +
void shell_input char *  command  ) 
+
+ + + + + +
+   + + +

+Process a shell command. +

+This function will be called by the shell GUI / telnet server whan a command has been entered that should be processed by the shell back-end.

+

Parameters:
+ + +
command The command to be processed.
+
+
Examples:
+telnetd.c.
+

+Definition at line 118 of file shell.c. +

+References shell_input(). +

+Referenced by shell_input().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
void shell_output char *  str1,
char *  str2
+
+ + + + + +
+   + + +

+Print a string to the shell window. +

+This function is implemented by the shell GUI / telnet server and can be called by the shell back-end to output a string in the shell window. The string is automatically appended with a linebreak.

+

Parameters:
+ + + +
str1 The first half of the string to be output.
str2 The second half of the string to be output.
+
+
Examples:
+telnetd.c.
+

+Definition at line 113 of file telnetd.c. +

+References ISO_cr, ISO_nl, and NULL.

+

+ + + + +
+ + + + + + + + + +
void shell_prompt char *  prompt  ) 
+
+ + + + + +
+   + + +

+Print a prompt to the shell window. +

+This function can be used by the shell back-end to print out a prompt to the shell window.

+

Parameters:
+ + +
prompt The prompt to be printed.
+
+
Examples:
+telnetd.c.
+

+Definition at line 101 of file telnetd.c. +

+References NULL.

+

+ + + + +
+ + + + + + + + + +
void shell_start void   ) 
+
+ + + + + +
+   + + +

+Start the shell back-end. +

+Called by the front-end when a new shell is started.

Examples:
+telnetd.c.
+

+Definition at line 110 of file shell.c. +

+References shell_start(). +

+Referenced by shell_start().

+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00110.html b/third_party/uip-1.0/doc/html/a00110.html new file mode 100644 index 0000000..66cd8e4 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00110.html @@ -0,0 +1,107 @@ + + +uIP 1.0: apps/webclient/webclient.c File Reference + + + + + + +

apps/webclient/webclient.c File Reference


Detailed Description

+Implementation of the HTTP client. +

+

Author:
Adam Dunkels <adam@dunkels.com>
+ +

+Definition in file webclient.c. +

+#include "uip.h"
+#include "uiplib.h"
+#include "webclient.h"
+#include "resolv.h"
+#include <string.h>
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

+#define WEBCLIENT_TIMEOUT   100
+#define WEBCLIENT_STATE_STATUSLINE   0
+#define WEBCLIENT_STATE_HEADERS   1
+#define WEBCLIENT_STATE_DATA   2
+#define WEBCLIENT_STATE_CLOSE   3
+#define HTTPFLAG_NONE   0
+#define HTTPFLAG_OK   1
+#define HTTPFLAG_MOVED   2
+#define HTTPFLAG_ERROR   3
+#define ISO_nl   0x0a
+#define ISO_cr   0x0d
+#define ISO_space   0x20

Functions

char * webclient_mimetype (void)
 Obtain the MIME type of the current HTTP data stream.
char * webclient_filename (void)
 Obtain the filename of the current HTTP data stream.
char * webclient_hostname (void)
 Obtain the hostname of the current HTTP data stream.
unsigned short webclient_port (void)
 Obtain the port number of the current HTTP data stream.
+void webclient_init (void)
 Initialize the webclient module.
+void webclient_close (void)
 Close the currently open HTTP connection.
unsigned char webclient_get (char *host, u16_t port, char *file)
 Open an HTTP connection to a web server and ask for a file using the GET method.
+void webclient_appcall (void)
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00111.html b/third_party/uip-1.0/doc/html/a00111.html new file mode 100644 index 0000000..d210afa --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00111.html @@ -0,0 +1,96 @@ + + +uIP 1.0: apps/webclient/webclient.h File Reference + + + + + + +

apps/webclient/webclient.h File Reference


Detailed Description

+Header file for the HTTP client. +

+

Author:
Adam Dunkels <adam@dunkels.com>
+ +

+Definition in file webclient.h. +

+#include "webclient-strings.h"
+#include "uipopt.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Structures

struct  webclient_state

Defines

+#define WEBCLIENT_CONF_MAX_URLLEN   100
+#define UIP_APPCALL   webclient_appcall

Typedefs

+typedef webclient_state uip_tcp_appstate_t

Functions

void webclient_datahandler (char *data, u16_t len)
 Callback function that is called from the webclient code when HTTP data has been received.
void webclient_connected (void)
 Callback function that is called from the webclient code when the HTTP connection has been connected to the web server.
void webclient_timedout (void)
 Callback function that is called from the webclient code if the HTTP connection to the web server has timed out.
void webclient_aborted (void)
 Callback function that is called from the webclient code if the HTTP connection to the web server has been aborted by the web server.
void webclient_closed (void)
 Callback function that is called from the webclient code when the HTTP connection to the web server has been closed.
+void webclient_init (void)
 Initialize the webclient module.
unsigned char webclient_get (char *host, u16_t port, char *file)
 Open an HTTP connection to a web server and ask for a file using the GET method.
+void webclient_close (void)
 Close the currently open HTTP connection.
+void webclient_appcall (void)
char * webclient_mimetype (void)
 Obtain the MIME type of the current HTTP data stream.
char * webclient_filename (void)
 Obtain the filename of the current HTTP data stream.
char * webclient_hostname (void)
 Obtain the hostname of the current HTTP data stream.
unsigned short webclient_port (void)
 Obtain the port number of the current HTTP data stream.
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00112.html b/third_party/uip-1.0/doc/html/a00112.html new file mode 100644 index 0000000..f1c3e98 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00112.html @@ -0,0 +1,49 @@ + + +uIP 1.0: apps/webserver/httpd-cgi.c File Reference + + + + + + +

apps/webserver/httpd-cgi.c File Reference


Detailed Description

+Web server script interface. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file httpd-cgi.c. +

+#include "uip.h"
+#include "psock.h"
+#include "httpd.h"
+#include "httpd-cgi.h"
+#include "httpd-fs.h"
+#include <stdio.h>
+#include <string.h>
+ +

+Go to the source code of this file. + + + + +

Functions

+httpd_cgifunction httpd_cgi (char *name)
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00113.html b/third_party/uip-1.0/doc/html/a00113.html new file mode 100644 index 0000000..6e7d8f4 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00113.html @@ -0,0 +1,51 @@ + + +uIP 1.0: apps/webserver/httpd-cgi.h File Reference + + + + + + +

apps/webserver/httpd-cgi.h File Reference


Detailed Description

+Web server script interface header file. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file httpd-cgi.h. +

+#include "psock.h"
+#include "httpd.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + +

Data Structures

struct  httpd_cgi_call

Defines

#define HTTPD_CGI_CALL(name, str, function)
 HTTPD CGI function declaration.

Functions

+httpd_cgifunction httpd_cgi (char *name)
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00114.html b/third_party/uip-1.0/doc/html/a00114.html new file mode 100644 index 0000000..24a3e84 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00114.html @@ -0,0 +1,79 @@ + + +uIP 1.0: apps/webserver/httpd.c File Reference + + + + + + +

apps/webserver/httpd.c File Reference


Detailed Description

+Web server. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file httpd.c. +

+#include "uip.h"
+#include "httpd.h"
+#include "httpd-fs.h"
+#include "httpd-cgi.h"
+#include "http-strings.h"
+#include <string.h>
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

+#define STATE_WAITING   0
+#define STATE_OUTPUT   1
+#define ISO_nl   0x0a
+#define ISO_space   0x20
+#define ISO_bang   0x21
+#define ISO_percent   0x25
+#define ISO_period   0x2e
+#define ISO_slash   0x2f
+#define ISO_colon   0x3a

Functions

+void httpd_appcall (void)
void httpd_init (void)
 Initialize the web server.
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00120.html b/third_party/uip-1.0/doc/html/a00120.html new file mode 100644 index 0000000..3cdb238 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00120.html @@ -0,0 +1,50 @@ + + +uIP 1.0: lib/memb.c File Reference + + + + + + +

lib/memb.c File Reference


Detailed Description

+Memory block allocation routines. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file memb.c. +

+#include <string.h>
+#include "memb.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + +

Functions

void memb_init (struct memb_blocks *m)
 Initialize a memory block that was declared with MEMB().
void * memb_alloc (struct memb_blocks *m)
 Allocate a memory block from a block of memory declared with MEMB().
char memb_free (struct memb_blocks *m, void *ptr)
 Deallocate a memory block from a memory block previously declared with MEMB().
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00121.html b/third_party/uip-1.0/doc/html/a00121.html new file mode 100644 index 0000000..eaae7fb --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00121.html @@ -0,0 +1,61 @@ + + +uIP 1.0: lib/memb.h File Reference + + + + + + +

lib/memb.h File Reference


Detailed Description

+Memory block allocation routines. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file memb.h. +

+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + +

Data Structures

struct  memb_blocks

Defines

+#define MEMB_CONCAT2(s1, s2)   s1##s2
+#define MEMB_CONCAT(s1, s2)   MEMB_CONCAT2(s1, s2)
#define MEMB(name, structure, num)
 Declare a memory block.

Functions

void memb_init (struct memb_blocks *m)
 Initialize a memory block that was declared with MEMB().
void * memb_alloc (struct memb_blocks *m)
 Allocate a memory block from a block of memory declared with MEMB().
char memb_free (struct memb_blocks *m, void *ptr)
 Deallocate a memory block from a memory block previously declared with MEMB().
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00123.html b/third_party/uip-1.0/doc/html/a00123.html new file mode 100644 index 0000000..4a9ff16 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00123.html @@ -0,0 +1,57 @@ + + +uIP 1.0: uip/lc-addrlabels.h File Reference + + + + + + +

uip/lc-addrlabels.h File Reference


Detailed Description

+Implementation of local continuations based on the "Labels as values" feature of gcc. +

+

Author:
Adam Dunkels <adam@sics.se>
+This implementation of local continuations is based on a special feature of the GCC C compiler called "labels as values". This feature allows assigning pointers with the address of the code corresponding to a particular C label.

+For more information, see the GCC documentation: http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html

+Thanks to dividuum for finding the nice local scope label implementation. +

+Definition in file lc-addrlabels.h. +

+ +

+Go to the source code of this file. + + + + + + + + + + + + + +

Defines

+#define LC_INIT(s)   s = NULL
+#define LC_RESUME(s)
+#define LC_SET(s)   do { ({ __label__ resume; resume: (s) = &&resume; }); }while(0)
+#define LC_END(s)

Typedefs

+typedef void * lc_t
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00124.html b/third_party/uip-1.0/doc/html/a00124.html new file mode 100644 index 0000000..fe0d6bb --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00124.html @@ -0,0 +1,59 @@ + + +uIP 1.0: uip/lc-switch.h File Reference + + + + + + +

uip/lc-switch.h File Reference


Detailed Description

+Implementation of local continuations based on switch() statment. +

+

Author:
Adam Dunkels <adam@sics.se>
+This implementation of local continuations uses the C switch() statement to resume execution of a function somewhere inside the function's body. The implementation is based on the fact that switch() statements are able to jump directly into the bodies of control structures such as if() or while() statmenets.

+This implementation borrows heavily from Simon Tatham's coroutines implementation in C: http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html +

+Definition in file lc-switch.h. +

+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + +

Defines

+#define __LC_SWTICH_H__
+#define LC_INIT(s)   s = 0;
+#define LC_RESUME(s)   switch(s) { case 0:
+#define LC_SET(s)   s = __LINE__; case __LINE__:
+#define LC_END(s)   }

Typedefs

+typedef unsigned short lc_t
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00125.html b/third_party/uip-1.0/doc/html/a00125.html new file mode 100644 index 0000000..c1ce259 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00125.html @@ -0,0 +1,39 @@ + + +uIP 1.0: uip/lc.h File Reference + + + + + + +

uip/lc.h File Reference


Detailed Description

+Local continuations. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file lc.h. +

+#include "lc-switch.h"
+ +

+Go to the source code of this file. + +
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00127.html b/third_party/uip-1.0/doc/html/a00127.html new file mode 100644 index 0000000..a0bd3f4 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00127.html @@ -0,0 +1,99 @@ + + +uIP 1.0: uip/psock.h File Reference + + + + + + +

uip/psock.h File Reference


Detailed Description

+Protosocket library header file. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file psock.h. +

+#include "uipopt.h"
+#include "pt.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Structures

struct  psock_buf
struct  psock
 The representation of a protosocket. More...

Defines

#define PSOCK_INIT(psock, buffer, buffersize)
 Initialize a protosocket.
#define PSOCK_BEGIN(psock)
 Start the protosocket protothread in a function.
#define PSOCK_SEND(psock, data, datalen)
 Send data.
#define PSOCK_SEND_STR(psock, str)
 Send a null-terminated string.
#define PSOCK_GENERATOR_SEND(psock, generator, arg)
 Generate data with a function and send it.
#define PSOCK_CLOSE(psock)
 Close a protosocket.
#define PSOCK_READBUF(psock)
 Read data until the buffer is full.
#define PSOCK_READTO(psock, c)
 Read data up to a specified character.
#define PSOCK_DATALEN(psock)
 The length of the data that was previously read.
#define PSOCK_EXIT(psock)
 Exit the protosocket's protothread.
#define PSOCK_CLOSE_EXIT(psock)
 Close a protosocket and exit the protosocket's protothread.
#define PSOCK_END(psock)
 Declare the end of a protosocket's protothread.
#define PSOCK_NEWDATA(psock)
 Check if new data has arrived on a protosocket.
#define PSOCK_WAIT_UNTIL(psock, condition)
 Wait until a condition is true.
+#define PSOCK_WAIT_THREAD(psock, condition)   PT_WAIT_THREAD(&((psock)->pt), (condition))

Functions

+u16_t psock_datalen (struct psock *psock)
+char psock_newdata (struct psock *s)
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00128.html b/third_party/uip-1.0/doc/html/a00128.html new file mode 100644 index 0000000..18790f0 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00128.html @@ -0,0 +1,101 @@ + + +uIP 1.0: uip/pt.h File Reference + + + + + + +

uip/pt.h File Reference


Detailed Description

+Protothreads implementation. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file pt.h. +

+#include "lc.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Structures

struct  pt

Initialization

#define PT_INIT(pt)
 Initialize a protothread.

Declaration and definition

#define PT_THREAD(name_args)
 Declaration of a protothread.
#define PT_BEGIN(pt)
 Declare the start of a protothread inside the C function implementing the protothread.
#define PT_END(pt)
 Declare the end of a protothread.

Blocked wait

#define PT_WAIT_UNTIL(pt, condition)
 Block and wait until condition is true.
#define PT_WAIT_WHILE(pt, cond)
 Block and wait while condition is true.

Hierarchical protothreads

#define PT_WAIT_THREAD(pt, thread)
 Block and wait until a child protothread completes.
#define PT_SPAWN(pt, child, thread)
 Spawn a child protothread and wait until it exits.

Exiting and restarting

#define PT_RESTART(pt)
 Restart the protothread.
#define PT_EXIT(pt)
 Exit the protothread.

Calling a protothread

#define PT_SCHEDULE(f)
 Schedule a protothread.

Yielding from a protothread

#define PT_YIELD(pt)
 Yield from the current protothread.
#define PT_YIELD_UNTIL(pt, cond)
 Yield from the protothread until a condition occurs.

Defines

+#define PT_WAITING   0
+#define PT_EXITED   1
+#define PT_ENDED   2
+#define PT_YIELDED   3
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00129.html b/third_party/uip-1.0/doc/html/a00129.html new file mode 100644 index 0000000..f12ac2d --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00129.html @@ -0,0 +1,53 @@ + + +uIP 1.0: uip/timer.c File Reference + + + + + + +

uip/timer.c File Reference


Detailed Description

+Timer library implementation. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file timer.c. +

+#include "clock.h"
+#include "timer.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + +

Functions

void timer_set (struct timer *t, clock_time_t interval)
 Set a timer.
void timer_reset (struct timer *t)
 Reset the timer with the same interval.
void timer_restart (struct timer *t)
 Restart the timer from the current point in time.
int timer_expired (struct timer *t)
 Check if a timer has expired.
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00130.html b/third_party/uip-1.0/doc/html/a00130.html new file mode 100644 index 0000000..d2f11cd --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00130.html @@ -0,0 +1,56 @@ + + +uIP 1.0: uip/timer.h File Reference + + + + + + +

uip/timer.h File Reference


Detailed Description

+Timer library header file. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file timer.h. +

+#include "clock.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + +

Data Structures

struct  timer
 A timer. More...

Functions

void timer_set (struct timer *t, clock_time_t interval)
 Set a timer.
void timer_reset (struct timer *t)
 Reset the timer with the same interval.
void timer_restart (struct timer *t)
 Restart the timer from the current point in time.
int timer_expired (struct timer *t)
 Check if a timer has expired.
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00131.html b/third_party/uip-1.0/doc/html/a00131.html new file mode 100644 index 0000000..e19e50c --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00131.html @@ -0,0 +1,63 @@ + + +uIP 1.0: uip/uip-neighbor.c File Reference + + + + + + +

uip/uip-neighbor.c File Reference


Detailed Description

+Database of link-local neighbors, used by IPv6 code and to be used by a future ARP code rewrite. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file uip-neighbor.c. +

+#include "uip-neighbor.h"
+#include <string.h>
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + +

Defines

+#define MAX_TIME   128
+#define ENTRIES   8

Functions

+void uip_neighbor_init (void)
+void uip_neighbor_periodic (void)
+void uip_neighbor_add (uip_ipaddr_t ipaddr, struct uip_neighbor_addr *addr)
+void uip_neighbor_update (uip_ipaddr_t ipaddr)
+uip_neighbor_addruip_neighbor_lookup (uip_ipaddr_t ipaddr)
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00132.html b/third_party/uip-1.0/doc/html/a00132.html new file mode 100644 index 0000000..a1e5f02 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00132.html @@ -0,0 +1,58 @@ + + +uIP 1.0: uip/uip-neighbor.h File Reference + + + + + + +

uip/uip-neighbor.h File Reference


Detailed Description

+Header file for database of link-local neighbors, used by IPv6 code and to be used by future ARP code. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file uip-neighbor.h. +

+#include "uip.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + +

Data Structures

struct  uip_neighbor_addr

Functions

+void uip_neighbor_init (void)
+void uip_neighbor_add (uip_ipaddr_t ipaddr, struct uip_neighbor_addr *addr)
+void uip_neighbor_update (uip_ipaddr_t ipaddr)
+uip_neighbor_addruip_neighbor_lookup (uip_ipaddr_t ipaddr)
+void uip_neighbor_periodic (void)
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00134.html b/third_party/uip-1.0/doc/html/a00134.html new file mode 100644 index 0000000..161fdd3 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00134.html @@ -0,0 +1,42 @@ + + +uIP 1.0: uip/uip-split.h File Reference + + + + + + +

uip/uip-split.h File Reference


Detailed Description

+Module for splitting outbound TCP segments in two to avoid the delayed ACK throughput degradation. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file uip-split.h. +

+ +

+Go to the source code of this file. + + + + + +

Functions

void uip_split_output (void)
 Handle outgoing packets.
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00135.html b/third_party/uip-1.0/doc/html/a00135.html new file mode 100644 index 0000000..a561a9a --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00135.html @@ -0,0 +1,215 @@ + + +uIP 1.0: uip/uip.c File Reference + + + + + + +

uip/uip.c File Reference


Detailed Description

+The uIP TCP/IP stack code. +

+

Author:
Adam Dunkels <adam@dunkels.com>
+ +

+Definition in file uip.c. +

+#include "uip.h"
+#include "uipopt.h"
+#include "uip_arch.h"
+#include <string.h>
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

+#define DEBUG_PRINTF()
+#define TCP_FIN   0x01
+#define TCP_SYN   0x02
+#define TCP_RST   0x04
+#define TCP_PSH   0x08
+#define TCP_ACK   0x10
+#define TCP_URG   0x20
+#define TCP_CTL   0x3f
+#define TCP_OPT_END   0
+#define TCP_OPT_NOOP   1
+#define TCP_OPT_MSS   2
+#define TCP_OPT_MSS_LEN   4
+#define ICMP_ECHO_REPLY   0
+#define ICMP_ECHO   8
+#define ICMP6_ECHO_REPLY   129
+#define ICMP6_ECHO   128
+#define ICMP6_NEIGHBOR_SOLICITATION   135
+#define ICMP6_NEIGHBOR_ADVERTISEMENT   136
+#define ICMP6_FLAG_S   (1 << 6)
+#define ICMP6_OPTION_SOURCE_LINK_ADDRESS   1
+#define ICMP6_OPTION_TARGET_LINK_ADDRESS   2
+#define BUF   ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
+#define FBUF   ((struct uip_tcpip_hdr *)&uip_reassbuf[0])
+#define ICMPBUF   ((struct uip_icmpip_hdr *)&uip_buf[UIP_LLH_LEN])
+#define UDPBUF   ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN])
+#define UIP_STAT(s)
+#define UIP_LOG(m)

Functions

void uip_setipid (u16_t id)
 uIP initialization function.
void uip_add32 (u8_t *op32, u16_t op16)
 Carry out a 32-bit addition.
u16_t uip_chksum (u16_t *buf, u16_t len)
 Calculate the Internet checksum over a buffer.
u16_t uip_ipchksum (void)
 Calculate the IP header checksum of the packet header in uip_buf.
u16_t uip_tcpchksum (void)
 Calculate the TCP checksum of the packet in uip_buf and uip_appdata.
void uip_init (void)
 uIP initialization function.
uip_connuip_connect (uip_ipaddr_t *ripaddr, u16_t rport)
 Connect to a remote host using TCP.
uip_udp_connuip_udp_new (uip_ipaddr_t *ripaddr, u16_t rport)
 Set up a new UDP connection.
void uip_unlisten (u16_t port)
 Stop listening to the specified port.
void uip_listen (u16_t port)
 Start listening to the specified port.
+void uip_process (u8_t flag)
u16_t htons (u16_t val)
 Convert 16-bit quantity from host byte order to network byte order.
void uip_send (const void *data, int len)
 Send data on the current connection.

Variables

+uip_ipaddr_t uip_hostaddr
+uip_ipaddr_t uip_draddr
+uip_ipaddr_t uip_netmask
+uip_eth_addr uip_ethaddr = {{0,0,0,0,0,0}}
u8_t uip_buf [UIP_BUFSIZE+2]
 The uIP packet buffer.
void * uip_appdata
 Pointer to the application data in the packet buffer.
+void * uip_sappdata
u16_t uip_len
 The length of the packet in the uip_buf buffer.
+u16_t uip_slen
+u8_t uip_flags
uip_connuip_conn
 Pointer to the current TCP connection.
+uip_conn uip_conns [UIP_CONNS]
+u16_t uip_listenports [UIP_LISTENPORTS]
+uip_udp_connuip_udp_conn
 The current UDP connection.
+uip_udp_conn uip_udp_conns [UIP_UDP_CONNS]
+u8_t uip_acc32 [4]
 4-byte array used for the 32-bit sequence number calculations.
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00136.html b/third_party/uip-1.0/doc/html/a00136.html new file mode 100644 index 0000000..afc4d0e --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00136.html @@ -0,0 +1,400 @@ + + +uIP 1.0: uip/uip.h File Reference + + + + + + +

uip/uip.h File Reference


Detailed Description

+Header file for the uIP TCP/IP stack. +

+

Author:
Adam Dunkels <adam@dunkels.com>
+The uIP TCP/IP stack header file contains definitions for a number of C macros that are used by uIP programs as well as internal uIP structures, TCP/IP header structures and function declarations. +

+Definition in file uip.h. +

+#include "uipopt.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Structures

struct  uip_conn
 Representation of a uIP TCP connection. More...
struct  uip_udp_conn
 Representation of a uIP UDP connection. More...
struct  uip_stats
 The structure holding the TCP/IP statistics that are gathered if UIP_STATISTICS is set to 1. More...
struct  uip_tcpip_hdr
struct  uip_icmpip_hdr
struct  uip_udpip_hdr
struct  uip_eth_addr
 Representation of a 48-bit Ethernet address. More...

Defines

#define uip_sethostaddr(addr)
 Set the IP address of this host.
#define uip_gethostaddr(addr)
 Get the IP address of this host.
#define uip_setdraddr(addr)
 Set the default router's IP address.
#define uip_setnetmask(addr)
 Set the netmask.
#define uip_getdraddr(addr)
 Get the default router's IP address.
#define uip_getnetmask(addr)
 Get the netmask.
#define uip_input()
 Process an incoming packet.
#define uip_periodic(conn)
 Periodic processing for a connection identified by its number.
+#define uip_conn_active(conn)   (uip_conns[conn].tcpstateflags != UIP_CLOSED)
#define uip_periodic_conn(conn)
 Perform periodic processing for a connection identified by a pointer to its structure.
#define uip_poll_conn(conn)
 Reuqest that a particular connection should be polled.
#define uip_udp_periodic(conn)
 Periodic processing for a UDP connection identified by its number.
#define uip_udp_periodic_conn(conn)
 Periodic processing for a UDP connection identified by a pointer to its structure.
+#define uip_outstanding(conn)   ((conn)->len)
#define uip_datalen()
 The length of any incoming data that is currently avaliable (if avaliable) in the uip_appdata buffer.
#define uip_urgdatalen()
 The length of any out-of-band data (urgent data) that has arrived on the connection.
#define uip_close()
 Close the current connection.
#define uip_abort()
 Abort the current connection.
#define uip_stop()
 Tell the sending host to stop sending data.
+#define uip_stopped(conn)
 Find out if the current connection has been previously stopped with uip_stop().
#define uip_restart()
 Restart the current connection, if is has previously been stopped with uip_stop().
#define uip_udpconnection()
 Is the current connection a UDP connection?
#define uip_newdata()
 Is new incoming data available?
#define uip_acked()
 Has previously sent data been acknowledged?
#define uip_connected()
 Has the connection just been connected?
#define uip_closed()
 Has the connection been closed by the other end?
#define uip_aborted()
 Has the connection been aborted by the other end?
#define uip_timedout()
 Has the connection timed out?
#define uip_rexmit()
 Do we need to retransmit previously data?
#define uip_poll()
 Is the connection being polled by uIP?
+#define uip_initialmss()
 Get the initial maxium segment size (MSS) of the current connection.
#define uip_mss()
 Get the current maxium segment size that can be sent on the current connection.
#define uip_udp_remove(conn)
 Removed a UDP connection.
#define uip_udp_bind(conn, port)
 Bind a UDP connection to a local port.
#define uip_udp_send(len)
 Send a UDP datagram of length len on the current connection.
#define uip_ipaddr(addr, addr0, addr1, addr2, addr3)
 Construct an IP address from four bytes.
#define uip_ip6addr(addr, addr0, addr1, addr2, addr3, addr4, addr5, addr6, addr7)
 Construct an IPv6 address from eight 16-bit words.
#define uip_ipaddr_copy(dest, src)
 Copy an IP address to another IP address.
#define uip_ipaddr_cmp(addr1, addr2)
 Compare two IP addresses.
#define uip_ipaddr_maskcmp(addr1, addr2, mask)
 Compare two IP addresses with netmasks.
#define uip_ipaddr_mask(dest, src, mask)
 Mask out the network part of an IP address.
#define uip_ipaddr1(addr)
 Pick the first octet of an IP address.
#define uip_ipaddr2(addr)
 Pick the second octet of an IP address.
#define uip_ipaddr3(addr)
 Pick the third octet of an IP address.
#define uip_ipaddr4(addr)
 Pick the fourth octet of an IP address.
#define HTONS(n)
 Convert 16-bit quantity from host byte order to network byte order.
+#define ntohs   htons
+#define UIP_ACKDATA   1
+#define UIP_NEWDATA   2
+#define UIP_REXMIT   4
+#define UIP_POLL   8
+#define UIP_CLOSE   16
+#define UIP_ABORT   32
+#define UIP_CONNECTED   64
+#define UIP_TIMEDOUT   128
+#define UIP_DATA   1
+#define UIP_TIMER   2
+#define UIP_POLL_REQUEST   3
+#define UIP_UDP_SEND_CONN   4
+#define UIP_UDP_TIMER   5
+#define UIP_CLOSED   0
+#define UIP_SYN_RCVD   1
+#define UIP_SYN_SENT   2
+#define UIP_ESTABLISHED   3
+#define UIP_FIN_WAIT_1   4
+#define UIP_FIN_WAIT_2   5
+#define UIP_CLOSING   6
+#define UIP_TIME_WAIT   7
+#define UIP_LAST_ACK   8
+#define UIP_TS_MASK   15
+#define UIP_STOPPED   16
#define UIP_APPDATA_SIZE
 The buffer size available for user data in the uip_buf buffer.
+#define UIP_PROTO_ICMP   1
+#define UIP_PROTO_TCP   6
+#define UIP_PROTO_UDP   17
+#define UIP_PROTO_ICMP6   58
+#define UIP_IPH_LEN   20
+#define UIP_UDPH_LEN   8
+#define UIP_TCPH_LEN   20
+#define UIP_IPUDPH_LEN   (UIP_UDPH_LEN + UIP_IPH_LEN)
+#define UIP_IPTCPH_LEN   (UIP_TCPH_LEN + UIP_IPH_LEN)
+#define UIP_TCPIP_HLEN   UIP_IPTCPH_LEN

Typedefs

+typedef u16_t uip_ip4addr_t [2]
 Repressentation of an IP address.
+typedef u16_t uip_ip6addr_t [8]
+typedef uip_ip4addr_t uip_ipaddr_t

Functions

void uip_init (void)
 uIP initialization function.
void uip_setipid (u16_t id)
 uIP initialization function.
void uip_listen (u16_t port)
 Start listening to the specified port.
void uip_unlisten (u16_t port)
 Stop listening to the specified port.
uip_connuip_connect (uip_ipaddr_t *ripaddr, u16_t port)
 Connect to a remote host using TCP.
void uip_send (const void *data, int len)
 Send data on the current connection.
uip_udp_connuip_udp_new (uip_ipaddr_t *ripaddr, u16_t rport)
 Set up a new UDP connection.
u16_t htons (u16_t val)
 Convert 16-bit quantity from host byte order to network byte order.
+void uip_process (u8_t flag)
u16_t uip_chksum (u16_t *buf, u16_t len)
 Calculate the Internet checksum over a buffer.
u16_t uip_ipchksum (void)
 Calculate the IP header checksum of the packet header in uip_buf.
u16_t uip_tcpchksum (void)
 Calculate the TCP checksum of the packet in uip_buf and uip_appdata.
u16_t uip_udpchksum (void)
 Calculate the UDP checksum of the packet in uip_buf and uip_appdata.

Variables

u8_t uip_buf [UIP_BUFSIZE+2]
 The uIP packet buffer.
void * uip_appdata
 Pointer to the application data in the packet buffer.
u16_t uip_len
 The length of the packet in the uip_buf buffer.
uip_connuip_conn
 Pointer to the current TCP connection.
+uip_conn uip_conns [UIP_CONNS]
+u8_t uip_acc32 [4]
 4-byte array used for the 32-bit sequence number calculations.
+uip_udp_connuip_udp_conn
 The current UDP connection.
+uip_udp_conn uip_udp_conns [UIP_UDP_CONNS]
uip_stats uip_stat
 The uIP TCP/IP statistics.
+u8_t uip_flags
+uip_ipaddr_t uip_hostaddr
+uip_ipaddr_t uip_netmask
+uip_ipaddr_t uip_draddr
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00137.html b/third_party/uip-1.0/doc/html/a00137.html new file mode 100644 index 0000000..a79d776 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00137.html @@ -0,0 +1,52 @@ + + +uIP 1.0: uip/uip_arch.h File Reference + + + + + + +

uip/uip_arch.h File Reference


Detailed Description

+Declarations of architecture specific functions. +

+

Author:
Adam Dunkels <adam@dunkels.com>
+ +

+Definition in file uip_arch.h. +

+#include "uip.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + +

Functions

void uip_add32 (u8_t *op32, u16_t op16)
 Carry out a 32-bit addition.
u16_t uip_chksum (u16_t *buf, u16_t len)
 Calculate the Internet checksum over a buffer.
u16_t uip_ipchksum (void)
 Calculate the IP header checksum of the packet header in uip_buf.
u16_t uip_tcpchksum (void)
 Calculate the TCP checksum of the packet in uip_buf and uip_appdata.
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00138.html b/third_party/uip-1.0/doc/html/a00138.html new file mode 100644 index 0000000..9de50d1 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00138.html @@ -0,0 +1,70 @@ + + +uIP 1.0: uip/uip_arp.c File Reference + + + + + + +

uip/uip_arp.c File Reference


Detailed Description

+Implementation of the ARP Address Resolution Protocol. +

+

Author:
Adam Dunkels <adam@dunkels.com>
+ +

+Definition in file uip_arp.c. +

+#include "uip_arp.h"
+#include <string.h>
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

+#define ARP_REQUEST   1
+#define ARP_REPLY   2
+#define ARP_HWTYPE_ETH   1
+#define BUF   ((struct arp_hdr *)&uip_buf[0])
+#define IPBUF   ((struct ethip_hdr *)&uip_buf[0])

Functions

+void uip_arp_init (void)
 Initialize the ARP module.
void uip_arp_timer (void)
 Periodic ARP processing function.
void uip_arp_arpin (void)
 ARP processing for incoming ARP packets.
void uip_arp_out (void)
 Prepend Ethernet header to an outbound IP packet and see if we need to send out an ARP request.
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00139.html b/third_party/uip-1.0/doc/html/a00139.html new file mode 100644 index 0000000..7f1603e --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00139.html @@ -0,0 +1,77 @@ + + +uIP 1.0: uip/uip_arp.h File Reference + + + + + + +

uip/uip_arp.h File Reference


Detailed Description

+Macros and definitions for the ARP module. +

+

Author:
Adam Dunkels <adam@dunkels.com>
+ +

+Definition in file uip_arp.h. +

+#include "uip.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Data Structures

struct  uip_eth_hdr
 The Ethernet header. More...

Defines

+#define UIP_ETHTYPE_ARP   0x0806
+#define UIP_ETHTYPE_IP   0x0800
+#define UIP_ETHTYPE_IP6   0x86dd
+#define uip_arp_ipin()
#define uip_setethaddr(eaddr)
 Specifiy the Ethernet MAC address.

Functions

+void uip_arp_init (void)
 Initialize the ARP module.
void uip_arp_arpin (void)
 ARP processing for incoming ARP packets.
void uip_arp_out (void)
 Prepend Ethernet header to an outbound IP packet and see if we need to send out an ARP request.
void uip_arp_timer (void)
 Periodic ARP processing function.

Variables

+uip_eth_addr uip_ethaddr
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00140.html b/third_party/uip-1.0/doc/html/a00140.html new file mode 100644 index 0000000..faf55a8 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00140.html @@ -0,0 +1,143 @@ + + +uIP 1.0: uip/uipopt.h File Reference + + + + + + +

uip/uipopt.h File Reference


Detailed Description

+Configuration options for uIP. +

+

Author:
Adam Dunkels <adam@dunkels.com>
+This file is used for tweaking various configuration options for uIP. You should make a copy of this file into one of your project's directories instead of editing this example "uipopt.h" file that comes with the uIP distribution. +

+Definition in file uipopt.h. +

+#include "uip-conf.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Static configuration options

These configuration options can be used for setting the IP address settings statically, but only if UIP_FIXEDADDR is set to 1. The configuration options for a specific node includes IP address, netmask and default router as well as the Ethernet address. The netmask, default router and Ethernet address are appliciable only if uIP should be run over Ethernet.

+All of these should be changed to suit your project.

#define UIP_FIXEDADDR
 Determines if uIP should use a fixed IP address or not.
#define UIP_PINGADDRCONF
 Ping IP address asignment.
#define UIP_FIXEDETHADDR
 Specifies if the uIP ARP module should be compiled with a fixed Ethernet MAC address or not.

IP configuration options

#define UIP_TTL   64
 The IP TTL (time to live) of IP packets sent by uIP.
#define UIP_REASSEMBLY
 Turn on support for IP packet reassembly.
+#define UIP_REASS_MAXAGE   40
 The maximum time an IP fragment should wait in the reassembly buffer before it is dropped.

UDP configuration options

+#define UIP_UDP
 Toggles wether UDP support should be compiled in or not.
#define UIP_UDP_CHECKSUMS
 Toggles if UDP checksums should be used or not.
+#define UIP_UDP_CONNS
 The maximum amount of concurrent UDP connections.

TCP configuration options

#define UIP_ACTIVE_OPEN
 Determines if support for opening connections from uIP should be compiled in.
#define UIP_CONNS
 The maximum number of simultaneously open TCP connections.
#define UIP_LISTENPORTS
 The maximum number of simultaneously listening TCP ports.
#define UIP_URGDATA
 Determines if support for TCP urgent data notification should be compiled in.
#define UIP_RTO   3
 The initial retransmission timeout counted in timer pulses.
#define UIP_MAXRTX   8
 The maximum number of times a segment should be retransmitted before the connection should be aborted.
#define UIP_MAXSYNRTX   5
 The maximum number of times a SYN segment should be retransmitted before a connection request should be deemed to have been unsuccessful.
#define UIP_TCP_MSS   (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN)
 The TCP maximum segment size.
#define UIP_RECEIVE_WINDOW
 The size of the advertised receiver's window.
#define UIP_TIME_WAIT_TIMEOUT   120
 How long a connection should stay in the TIME_WAIT state.

ARP configuration options

#define UIP_ARPTAB_SIZE
 The size of the ARP table.
#define UIP_ARP_MAXAGE   120
 The maxium age of ARP table entries measured in 10ths of seconds.

General configuration options

#define UIP_BUFSIZE
 The size of the uIP packet buffer.
#define UIP_STATISTICS
 Determines if statistics support should be compiled in.
#define UIP_LOGGING
 Determines if logging of certain events should be compiled in.
#define UIP_BROADCAST
 Broadcast support.
#define UIP_LLH_LEN
 The link level header length.
void uip_log (char *msg)
 Print out a uIP log message.

CPU architecture configuration

The CPU architecture configuration is where the endianess of the CPU on which uIP is to be run is specified. Most CPUs today are little endian, and the most notable exception are the Motorolas which are big endian. The BYTE_ORDER macro should be changed to reflect the CPU architecture on which uIP is to be run.

#define UIP_BYTE_ORDER
 The byte order of the CPU architecture on which uIP is to be run.

Defines

+#define UIP_LITTLE_ENDIAN   3412
+#define UIP_BIG_ENDIAN   1234
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00141.html b/third_party/uip-1.0/doc/html/a00141.html new file mode 100644 index 0000000..313b7f1 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00141.html @@ -0,0 +1,83 @@ + + +uIP 1.0: unix/uip-conf.h File Reference + + + + + + +

unix/uip-conf.h File Reference


Detailed Description

+An example uIP configuration file. +

+

Author:
Adam Dunkels <adam@sics.se>
+ +

+Definition in file uip-conf.h. +

+#include <inttypes.h>
+#include "webserver.h"
+ +

+Go to the source code of this file. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Project-specific configuration options

uIP has a number of configuration options that can be overridden for each project. These are kept in a project-specific uip-conf.h file and all configuration names have the prefix UIP_CONF.

+#define UIP_CONF_MAX_CONNECTIONS
 Maximum number of TCP connections.
+#define UIP_CONF_MAX_LISTENPORTS
 Maximum number of listening TCP ports.
+#define UIP_CONF_BUFFER_SIZE
 uIP buffer size.
+#define UIP_CONF_BYTE_ORDER
 CPU byte order.
+#define UIP_CONF_LOGGING
 Logging on or off.
+#define UIP_CONF_UDP
 UDP support on or off.
+#define UIP_CONF_UDP_CHECKSUMS
 UDP checksums on or off.
+#define UIP_CONF_STATISTICS
 uIP statistics on or off
typedef uint8_t u8_t
 8 bit datatype
typedef uint16_t u16_t
 16 bit datatype
typedef unsigned short uip_stats_t
 Statistics datatype.
+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00142.html b/third_party/uip-1.0/doc/html/a00142.html new file mode 100644 index 0000000..5178da4 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00142.html @@ -0,0 +1,690 @@ + + +uIP 1.0: Protothreads + + + + + +

Protothreads


Detailed Description

+Protothreads are a type of lightweight stackless threads designed for severly memory constrained systems such as deeply embedded systems or sensor network nodes. +

+Protothreads provides linear code execution for event-driven systems implemented in C. Protothreads can be used with or without an RTOS.

+Protothreads are a extremely lightweight, stackless type of threads that provides a blocking context on top of an event-driven system, without the overhead of per-thread stacks. The purpose of protothreads is to implement sequential flow of control without complex state machines or full multi-threading. Protothreads provides conditional blocking inside C functions.

+The advantage of protothreads over a purely event-driven approach is that protothreads provides a sequential code structure that allows for blocking functions. In purely event-driven systems, blocking must be implemented by manually breaking the function into two pieces - one for the piece of code before the blocking call and one for the code after the blocking call. This makes it hard to use control structures such as if() conditionals and while() loops.

+The advantage of protothreads over ordinary threads is that a protothread do not require a separate stack. In memory constrained systems, the overhead of allocating multiple stacks can consume large amounts of the available memory. In contrast, each protothread only requires between two and twelve bytes of state, depending on the architecture.

+

Note:
Because protothreads do not save the stack context across a blocking call, local variables are not preserved when the protothread blocks. This means that local variables should be used with utmost care - if in doubt, do not use local variables inside a protothread!
+Main features:

+

    +
  • No machine specific code - the protothreads library is pure C
+

+

    +
  • Does not use error-prone functions such as longjmp()
+

+

    +
  • Very small RAM overhead - only two bytes per protothread
+

+

    +
  • Can be used with or without an OS
+

+

    +
  • Provides blocking wait without full multi-threading or stack-switching
+

+Examples applications:

+

    +
  • Memory constrained systems
+

+

    +
  • Event-driven protocol stacks
+

+

    +
  • Deeply embedded systems
+

+

    +
  • Sensor network nodes
+

+The protothreads API consists of four basic operations: initialization: PT_INIT(), execution: PT_BEGIN(), conditional blocking: PT_WAIT_UNTIL() and exit: PT_END(). On top of these, two convenience functions are built: reversed condition blocking: PT_WAIT_WHILE() and protothread blocking: PT_WAIT_THREAD().

+

See also:
Protothreads API documentation
+The protothreads library is released under a BSD-style license that allows for both non-commercial and commercial usage. The only requirement is that credit is given.

+Authors

+The protothreads library was written by Adam Dunkels <adam@sics.se> with support from Oliver Schmidt <ol.sc@web.de>.

+Protothreads

+Protothreads are a extremely lightweight, stackless threads that provides a blocking context on top of an event-driven system, without the overhead of per-thread stacks. The purpose of protothreads is to implement sequential flow of control without using complex state machines or full multi-threading. Protothreads provides conditional blocking inside a C function.

+In memory constrained systems, such as deeply embedded systems, traditional multi-threading may have a too large memory overhead. In traditional multi-threading, each thread requires its own stack, that typically is over-provisioned. The stacks may use large parts of the available memory.

+The main advantage of protothreads over ordinary threads is that protothreads are very lightweight: a protothread does not require its own stack. Rather, all protothreads run on the same stack and context switching is done by stack rewinding. This is advantageous in memory constrained systems, where a stack for a thread might use a large part of the available memory. A protothread only requires only two bytes of memory per protothread. Moreover, protothreads are implemented in pure C and do not require any machine-specific assembler code.

+A protothread runs within a single C function and cannot span over other functions. A protothread may call normal C functions, but cannot block inside a called function. Blocking inside nested function calls is instead made by spawning a separate protothread for each potentially blocking function. The advantage of this approach is that blocking is explicit: the programmer knows exactly which functions that block that which functions the never blocks.

+Protothreads are similar to asymmetric co-routines. The main difference is that co-routines uses a separate stack for each co-routine, whereas protothreads are stackless. The most similar mechanism to protothreads are Python generators. These are also stackless constructs, but have a different purpose. Protothreads provides blocking contexts inside a C function, whereas Python generators provide multiple exit points from a generator function.

+Local variables

+
Note:
Because protothreads do not save the stack context across a blocking call, local variables are not preserved when the protothread blocks. This means that local variables should be used with utmost care - if in doubt, do not use local variables inside a protothread!
+

+Scheduling

+A protothread is driven by repeated calls to the function in which the protothread is running. Each time the function is called, the protothread will run until it blocks or exits. Thus the scheduling of protothreads is done by the application that uses protothreads.

+Implementation

+Protothreads are implemented using local continuations. A local continuation represents the current state of execution at a particular place in the program, but does not provide any call history or local variables. A local continuation can be set in a specific function to capture the state of the function. After a local continuation has been set can be resumed in order to restore the state of the function at the point where the local continuation was set.

+Local continuations can be implemented in a variety of ways:

+

    +
  1. by using machine specific assembler code,
  2. by using standard C constructs, or
  3. by using compiler extensions.
+

+The first way works by saving and restoring the processor state, except for stack pointers, and requires between 16 and 32 bytes of memory per protothread. The exact amount of memory required depends on the architecture.

+The standard C implementation requires only two bytes of state per protothread and utilizes the C switch() statement in a non-obvious way that is similar to Duff's device. This implementation does, however, impose a slight restriction to the code that uses protothreads in that the code cannot use switch() statements itself.

+Certain compilers has C extensions that can be used to implement protothreads. GCC supports label pointers that can be used for this purpose. With this implementation, protothreads require 4 bytes of RAM per protothread. +

+ + + + + + + +

+

+ + + + +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Files

file  pt.h
 Protothreads implementation.

Modules

 Local continuations
 Local continuations form the basis for implementing protothreads.

Data Structures

struct  pt

Initialization

#define PT_INIT(pt)
 Initialize a protothread.

Declaration and definition

#define PT_THREAD(name_args)
 Declaration of a protothread.
#define PT_BEGIN(pt)
 Declare the start of a protothread inside the C function implementing the protothread.
#define PT_END(pt)
 Declare the end of a protothread.

Blocked wait

#define PT_WAIT_UNTIL(pt, condition)
 Block and wait until condition is true.
#define PT_WAIT_WHILE(pt, cond)
 Block and wait while condition is true.

Hierarchical protothreads

#define PT_WAIT_THREAD(pt, thread)
 Block and wait until a child protothread completes.
#define PT_SPAWN(pt, child, thread)
 Spawn a child protothread and wait until it exits.

Exiting and restarting

#define PT_RESTART(pt)
 Restart the protothread.
#define PT_EXIT(pt)
 Exit the protothread.

Calling a protothread

#define PT_SCHEDULE(f)
 Schedule a protothread.

Yielding from a protothread

#define PT_YIELD(pt)
 Yield from the current protothread.
#define PT_YIELD_UNTIL(pt, cond)
 Yield from the protothread until a condition occurs.

Defines

+#define PT_WAITING   0
+#define PT_EXITED   1
+#define PT_ENDED   2
+#define PT_YIELDED   3
+


Define Documentation

+

+ + + + +
+ + + + + + + + + +
#define PT_BEGIN pt   ) 
+
+ + + + + +
+   + + +

+Declare the start of a protothread inside the C function implementing the protothread. +

+This macro is used to declare the starting point of a protothread. It should be placed at the start of the function in which the protothread runs. All C statements above the PT_BEGIN() invokation will be executed each time the protothread is scheduled.

+

Parameters:
+ + +
pt A pointer to the protothread control structure.
+
+
Examples:
+dhcpc.c.
+

+Definition at line 115 of file pt.h.

+

+ + + + +
+ + + + + + + + + +
#define PT_END pt   ) 
+
+ + + + + +
+   + + +

+Declare the end of a protothread. +

+This macro is used for declaring that a protothread ends. It must always be used together with a matching PT_BEGIN() macro.

+

Parameters:
+ + +
pt A pointer to the protothread control structure.
+
+
Examples:
+dhcpc.c.
+

+Definition at line 127 of file pt.h.

+

+ + + + +
+ + + + + + + + + +
#define PT_EXIT pt   ) 
+
+ + + + + +
+   + + +

+Exit the protothread. +

+This macro causes the protothread to exit. If the protothread was spawned by another protothread, the parent protothread will become unblocked and can continue to run.

+

Parameters:
+ + +
pt A pointer to the protothread control structure.
+
+ +

+Definition at line 246 of file pt.h.

+

+ + + + +
+ + + + + + + + + +
#define PT_INIT pt   ) 
+
+ + + + + +
+   + + +

+Initialize a protothread. +

+Initializes a protothread. Initialization must be done prior to starting to execute the protothread.

+

Parameters:
+ + +
pt A pointer to the protothread control structure.
+
+
See also:
PT_SPAWN()
+
Examples:
+dhcpc.c.
+

+Definition at line 80 of file pt.h. +

+Referenced by httpd_appcall().

+

+ + + + +
+ + + + + + + + + +
#define PT_RESTART pt   ) 
+
+ + + + + +
+   + + +

+Restart the protothread. +

+This macro will block and cause the running protothread to restart its execution at the place of the PT_BEGIN() call.

+

Parameters:
+ + +
pt A pointer to the protothread control structure.
+
+
Examples:
+dhcpc.c.
+

+Definition at line 229 of file pt.h.

+

+ + + + +
+ + + + + + + + + +
#define PT_SCHEDULE  ) 
+
+ + + + + +
+   + + +

+Schedule a protothread. +

+This function shedules a protothread. The return value of the function is non-zero if the protothread is running or zero if the protothread has exited.

+

Parameters:
+ + +
f The call to the C function implementing the protothread to be scheduled
+
+ +

+Definition at line 271 of file pt.h.

+

+ + + + +
+ + + + + + + + + + + + + + + +
#define PT_SPAWN pt,
child,
thread   ) 
+
+ + + + + +
+   + + +

+Spawn a child protothread and wait until it exits. +

+This macro spawns a child protothread and waits until it exits. The macro can only be used within a protothread.

+

Parameters:
+ + + + +
pt A pointer to the protothread control structure.
child A pointer to the child protothread's control structure.
thread The child protothread with arguments
+
+ +

+Definition at line 206 of file pt.h.

+

+ + + + +
+ + + + + + + + + +
#define PT_THREAD name_args   ) 
+
+ + + + + +
+   + + +

+Declaration of a protothread. +

+This macro is used to declare a protothread. All protothreads must be declared with this macro.

+

Parameters:
+ + +
name_args The name and arguments of the C function implementing the protothread.
+
+
Examples:
+dhcpc.c, and smtp.c.
+

+Definition at line 100 of file pt.h.

+

+ + + + +
+ + + + + + + + + + + + +
#define PT_WAIT_THREAD pt,
thread   ) 
+
+ + + + + +
+   + + +

+Block and wait until a child protothread completes. +

+This macro schedules a child protothread. The current protothread will block until the child protothread completes.

+

Note:
The child protothread must be manually initialized with the PT_INIT() function before this function is used.
+
Parameters:
+ + + +
pt A pointer to the protothread control structure.
thread The child protothread with arguments
+
+
See also:
PT_SPAWN()
+ +

+Definition at line 192 of file pt.h.

+

+ + + + +
+ + + + + + + + + + + + +
#define PT_WAIT_UNTIL pt,
condition   ) 
+
+ + + + + +
+   + + +

+Block and wait until condition is true. +

+This macro blocks the protothread until the specified condition is true.

+

Parameters:
+ + + +
pt A pointer to the protothread control structure.
condition The condition.
+
+
Examples:
+dhcpc.c.
+

+Definition at line 148 of file pt.h.

+

+ + + + +
+ + + + + + + + + + + + +
#define PT_WAIT_WHILE pt,
cond   ) 
+
+ + + + + +
+   + + +

+Block and wait while condition is true. +

+This function blocks and waits while condition is true. See PT_WAIT_UNTIL().

+

Parameters:
+ + + +
pt A pointer to the protothread control structure.
cond The condition.
+
+ +

+Definition at line 167 of file pt.h.

+

+ + + + +
+ + + + + + + + + +
#define PT_YIELD pt   ) 
+
+ + + + + +
+   + + +

+Yield from the current protothread. +

+This function will yield the protothread, thereby allowing other processing to take place in the system.

+

Parameters:
+ + +
pt A pointer to the protothread control structure.
+
+
Examples:
+dhcpc.c.
+

+Definition at line 290 of file pt.h.

+

+ + + + +
+ + + + + + + + + + + + +
#define PT_YIELD_UNTIL pt,
cond   ) 
+
+ + + + + +
+   + + +

+Yield from the protothread until a condition occurs. +

+

Parameters:
+ + + +
pt A pointer to the protothread control structure.
cond The condition.
+
+This function will yield the protothread, until the specified condition evaluates to true. +

+Definition at line 310 of file pt.h.

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00143.html b/third_party/uip-1.0/doc/html/a00143.html new file mode 100644 index 0000000..1744c72 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00143.html @@ -0,0 +1,54 @@ + + +uIP 1.0: Applications + + + + + +

Applications


Detailed Description

+The uIP distribution contains a number of example applications that can be either used directory or studied when learning to develop applications for uIP. +

+ +

+ + + + + + + +

+

+ + + +

+

+ + + +

+

+ + + +

+

+ + + +

+


Modules

 DNS resolver
 The uIP DNS resolver functions are used to lookup a hostname and map it to a numerical IP address.
 SMTP E-mail sender
 The Simple Mail Transfer Protocol (SMTP) as defined by RFC821 is the standard way of sending and transfering e-mail on the Internet.
 Hello, world
 A small example showing how to write applications with protosockets.
 Web client
 This example shows a HTTP client that is able to download web pages and files from web servers.
 Web server
 The uIP web server is a very simplistic implementation of an HTTP server.
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00144.html b/third_party/uip-1.0/doc/html/a00144.html new file mode 100644 index 0000000..126ce15 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00144.html @@ -0,0 +1,328 @@ + + +uIP 1.0: uIP configuration functions + + + + + +

uIP configuration functions
+ +[The uIP TCP/IP stack] +


Detailed Description

+The uIP configuration functions are used for setting run-time parameters in uIP such as IP addresses. +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + +

Defines

#define uip_sethostaddr(addr)
 Set the IP address of this host.
#define uip_gethostaddr(addr)
 Get the IP address of this host.
#define uip_setdraddr(addr)
 Set the default router's IP address.
#define uip_setnetmask(addr)
 Set the netmask.
#define uip_getdraddr(addr)
 Get the default router's IP address.
#define uip_getnetmask(addr)
 Get the netmask.
#define uip_setethaddr(eaddr)
 Specifiy the Ethernet MAC address.
+


Define Documentation

+

+ + + + +
+ + + + + + + + + +
#define uip_getdraddr addr   ) 
+
+ + + + + +
+   + + +

+Get the default router's IP address. +

+

Parameters:
+ + +
addr A pointer to a uip_ipaddr_t variable that will be filled in with the IP address of the default router.
+
+ +

+Definition at line 161 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_gethostaddr addr   ) 
+
+ + + + + +
+   + + +

+Get the IP address of this host. +

+The IP address is represented as a 4-byte array where the first octet of the IP address is put in the first member of the 4-byte array.

+Example:

 uip_ipaddr_t hostaddr;
+
+ uip_gethostaddr(&hostaddr);
+
Parameters:
+ + +
addr A pointer to a uip_ipaddr_t variable that will be filled in with the currently configured IP address.
+
+ +

+Definition at line 126 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_getnetmask addr   ) 
+
+ + + + + +
+   + + +

+Get the netmask. +

+

Parameters:
+ + +
addr A pointer to a uip_ipaddr_t variable that will be filled in with the value of the netmask.
+
+ +

+Definition at line 171 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_setdraddr addr   ) 
+
+ + + + + +
+   + + +

+Set the default router's IP address. +

+

Parameters:
+ + +
addr A pointer to a uip_ipaddr_t variable containing the IP address of the default router.
+
+
See also:
uip_ipaddr()
+ +

+Definition at line 138 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_setethaddr eaddr   ) 
+
+ + + + + +
+   + + +

+Specifiy the Ethernet MAC address. +

+The ARP code needs to know the MAC address of the Ethernet card in order to be able to respond to ARP queries and to generate working Ethernet headers.

+

Note:
This macro only specifies the Ethernet MAC address to the ARP code. It cannot be used to change the MAC address of the Ethernet card.
+
Parameters:
+ + +
eaddr A pointer to a struct uip_eth_addr containing the Ethernet MAC address of the Ethernet card.
+
+ +

+Definition at line 134 of file uip_arp.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_sethostaddr addr   ) 
+
+ + + + + +
+   + + +

+Set the IP address of this host. +

+The IP address is represented as a 4-byte array where the first octet of the IP address is put in the first member of the 4-byte array.

+Example:

 uip_ipaddr_t addr;
+
+ uip_ipaddr(&addr, 192,168,1,2);
+ uip_sethostaddr(&addr);
+
Parameters:
+ + +
addr A pointer to an IP address of type uip_ipaddr_t;
+
+
See also:
uip_ipaddr()
+
Examples:
+dhcpc.c, example-mainloop-with-arp.c, and example-mainloop-without-arp.c.
+

+Definition at line 106 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_setnetmask addr   ) 
+
+ + + + + +
+   + + +

+Set the netmask. +

+

Parameters:
+ + +
addr A pointer to a uip_ipaddr_t variable containing the IP address of the netmask.
+
+
See also:
uip_ipaddr()
+ +

+Definition at line 150 of file uip.h.

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00145.html b/third_party/uip-1.0/doc/html/a00145.html new file mode 100644 index 0000000..b396117 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00145.html @@ -0,0 +1,106 @@ + + +uIP 1.0: uIP initialization functions + + + + + +

uIP initialization functions
+ +[The uIP TCP/IP stack] +


Detailed Description

+The uIP initialization functions are used for booting uIP. +

+ +

+ + + + + + + + + +

Functions

void uip_init (void)
 uIP initialization function.
void uip_setipid (u16_t id)
 uIP initialization function.
+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
void uip_init void   ) 
+
+ + + + + +
+   + + +

+uIP initialization function. +

+This function should be called at boot up to initilize the uIP TCP/IP stack.

Examples:
+example-mainloop-with-arp.c, and example-mainloop-without-arp.c.
+

+Definition at line 379 of file uip.c. +

+References UIP_LISTENPORTS.

+

+ + + + +
+ + + + + + + + + +
void uip_setipid u16_t  id  ) 
+
+ + + + + +
+   + + +

+uIP initialization function. +

+This function may be used at boot time to set the initial ip_id. +

+Definition at line 181 of file uip.c.

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00146.html b/third_party/uip-1.0/doc/html/a00146.html new file mode 100644 index 0000000..d0a0093 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00146.html @@ -0,0 +1,383 @@ + + +uIP 1.0: uIP device driver functions + + + + + +

uIP device driver functions
+ +[The uIP TCP/IP stack] +


Detailed Description

+These functions are used by a network device driver for interacting with uIP. +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

#define uip_input()
 Process an incoming packet.
#define uip_periodic(conn)
 Periodic processing for a connection identified by its number.
+#define uip_conn_active(conn)   (uip_conns[conn].tcpstateflags != UIP_CLOSED)
#define uip_periodic_conn(conn)
 Perform periodic processing for a connection identified by a pointer to its structure.
#define uip_poll_conn(conn)
 Reuqest that a particular connection should be polled.
#define uip_udp_periodic(conn)
 Periodic processing for a UDP connection identified by its number.
#define uip_udp_periodic_conn(conn)
 Periodic processing for a UDP connection identified by a pointer to its structure.

Variables

u8_t uip_buf [UIP_BUFSIZE+2]
 The uIP packet buffer.
+


Define Documentation

+

+ + + + +
+ + + + +  + + + + +
#define uip_input  ) 
+
+ + + + + +
+   + + +

+Process an incoming packet. +

+This function should be called when the device driver has received a packet from the network. The packet from the device driver must be present in the uip_buf buffer, and the length of the packet should be placed in the uip_len variable.

+When the function returns, there may be an outbound packet placed in the uip_buf packet buffer. If so, the uip_len variable is set to the length of the packet. If no packet is to be sent out, the uip_len variable is set to 0.

+The usual way of calling the function is presented by the source code below.

  uip_len = devicedriver_poll();
+  if(uip_len > 0) {
+    uip_input();
+    if(uip_len > 0) {
+      devicedriver_send();
+    }
+  }
+

+

Note:
If you are writing a uIP device driver that needs ARP (Address Resolution Protocol), e.g., when running uIP over Ethernet, you will need to call the uIP ARP code before calling this function:
  #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
+  uip_len = ethernet_devicedrver_poll();
+  if(uip_len > 0) {
+    if(BUF->type == HTONS(UIP_ETHTYPE_IP)) {
+      uip_arp_ipin();
+      uip_input();
+      if(uip_len > 0) {
+        uip_arp_out();
+        ethernet_devicedriver_send();
+      }
+    } else if(BUF->type == HTONS(UIP_ETHTYPE_ARP)) {
+      uip_arp_arpin();
+      if(uip_len > 0) {
+        ethernet_devicedriver_send();
+      }
+    }
+
+
Examples:
+example-mainloop-with-arp.c, and example-mainloop-without-arp.c.
+

+Definition at line 257 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_periodic conn   ) 
+
+ + + + + +
+   + + +

+Periodic processing for a connection identified by its number. +

+This function does the necessary periodic processing (timers, polling) for a uIP TCP conneciton, and should be called when the periodic uIP timer goes off. It should be called for every connection, regardless of whether they are open of closed.

+When the function returns, it may have an outbound packet waiting for service in the uIP packet buffer, and if so the uip_len variable is set to a value larger than zero. The device driver should be called to send out the packet.

+The ususal way of calling the function is through a for() loop like this:

  for(i = 0; i < UIP_CONNS; ++i) {
+    uip_periodic(i);
+    if(uip_len > 0) {
+      devicedriver_send();
+    }
+  }
+

+

Note:
If you are writing a uIP device driver that needs ARP (Address Resolution Protocol), e.g., when running uIP over Ethernet, you will need to call the uip_arp_out() function before calling the device driver:
  for(i = 0; i < UIP_CONNS; ++i) {
+    uip_periodic(i);
+    if(uip_len > 0) {
+      uip_arp_out();
+      ethernet_devicedriver_send();
+    }
+  }
+
+
Parameters:
+ + +
conn The number of the connection which is to be periodically polled.
+
+
Examples:
+example-mainloop-with-arp.c, and example-mainloop-without-arp.c.
+

+Definition at line 301 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_periodic_conn conn   ) 
+
+ + + + + +
+   + + +

+Perform periodic processing for a connection identified by a pointer to its structure. +

+Same as uip_periodic() but takes a pointer to the actual uip_conn struct instead of an integer as its argument. This function can be used to force periodic processing of a specific connection.

+

Parameters:
+ + +
conn A pointer to the uip_conn struct for the connection to be processed.
+
+ +

+Definition at line 323 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_poll_conn conn   ) 
+
+ + + + + +
+   + + +

+Reuqest that a particular connection should be polled. +

+Similar to uip_periodic_conn() but does not perform any timer processing. The application is polled for new data.

+

Parameters:
+ + +
conn A pointer to the uip_conn struct for the connection to be processed.
+
+ +

+Definition at line 337 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_udp_periodic conn   ) 
+
+ + + + + +
+   + + +

+Periodic processing for a UDP connection identified by its number. +

+This function is essentially the same as uip_periodic(), but for UDP connections. It is called in a similar fashion as the uip_periodic() function:

  for(i = 0; i < UIP_UDP_CONNS; i++) {
+    uip_udp_periodic(i);
+    if(uip_len > 0) {
+      devicedriver_send();
+    }
+  }
+

+

Note:
As for the uip_periodic() function, special care has to be taken when using uIP together with ARP and Ethernet:
  for(i = 0; i < UIP_UDP_CONNS; i++) {
+    uip_udp_periodic(i);
+    if(uip_len > 0) {
+      uip_arp_out();
+      ethernet_devicedriver_send();
+    }
+  }
+
+
Parameters:
+ + +
conn The number of the UDP connection to be processed.
+
+
Examples:
+example-mainloop-with-arp.c, and example-mainloop-without-arp.c.
+

+Definition at line 373 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_udp_periodic_conn conn   ) 
+
+ + + + + +
+   + + +

+Periodic processing for a UDP connection identified by a pointer to its structure. +

+Same as uip_udp_periodic() but takes a pointer to the actual uip_conn struct instead of an integer as its argument. This function can be used to force periodic processing of a specific connection.

+

Parameters:
+ + +
conn A pointer to the uip_udp_conn struct for the connection to be processed.
+
+ +

+Definition at line 390 of file uip.h.

+


Variable Documentation

+

+ + + + +
+ + + + +
u8_t uip_buf[UIP_BUFSIZE+2]
+
+ + + + + +
+   + + +

+The uIP packet buffer. +

+The uip_buf array is used to hold incoming and outgoing packets. The device driver should place incoming data into this buffer. When sending data, the device driver should read the link level headers and the TCP/IP headers from this buffer. The size of the link level headers is configured by the UIP_LLH_LEN define.

+

Note:
The application data need not be placed in this buffer, so the device driver must read it from the place pointed to by the uip_appdata pointer as illustrated by the following example:
 void
+ devicedriver_send(void)
+ {
+    hwsend(&uip_buf[0], UIP_LLH_LEN);
+    if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) {
+      hwsend(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN);
+    } else {
+      hwsend(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN);
+      hwsend(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN);
+    }
+ }
+
+ +

+Definition at line 139 of file uip.c. +

+Referenced by uip_process().

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00147.html b/third_party/uip-1.0/doc/html/a00147.html new file mode 100644 index 0000000..d6a6213 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00147.html @@ -0,0 +1,1046 @@ + + +uIP 1.0: uIP application functions + + + + + +

uIP application functions
+ +[The uIP TCP/IP stack] +


Detailed Description

+Functions used by an application running of top of uIP. +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

+#define uip_outstanding(conn)   ((conn)->len)
#define uip_datalen()
 The length of any incoming data that is currently avaliable (if avaliable) in the uip_appdata buffer.
#define uip_urgdatalen()
 The length of any out-of-band data (urgent data) that has arrived on the connection.
#define uip_close()
 Close the current connection.
#define uip_abort()
 Abort the current connection.
#define uip_stop()
 Tell the sending host to stop sending data.
+#define uip_stopped(conn)
 Find out if the current connection has been previously stopped with uip_stop().
#define uip_restart()
 Restart the current connection, if is has previously been stopped with uip_stop().
#define uip_udpconnection()
 Is the current connection a UDP connection?
#define uip_newdata()
 Is new incoming data available?
#define uip_acked()
 Has previously sent data been acknowledged?
#define uip_connected()
 Has the connection just been connected?
#define uip_closed()
 Has the connection been closed by the other end?
#define uip_aborted()
 Has the connection been aborted by the other end?
#define uip_timedout()
 Has the connection timed out?
#define uip_rexmit()
 Do we need to retransmit previously data?
#define uip_poll()
 Is the connection being polled by uIP?
+#define uip_initialmss()
 Get the initial maxium segment size (MSS) of the current connection.
#define uip_mss()
 Get the current maxium segment size that can be sent on the current connection.
#define uip_udp_remove(conn)
 Removed a UDP connection.
#define uip_udp_bind(conn, port)
 Bind a UDP connection to a local port.
#define uip_udp_send(len)
 Send a UDP datagram of length len on the current connection.

Functions

void uip_listen (u16_t port)
 Start listening to the specified port.
void uip_unlisten (u16_t port)
 Stop listening to the specified port.
uip_connuip_connect (uip_ipaddr_t *ripaddr, u16_t port)
 Connect to a remote host using TCP.
void uip_send (const void *data, int len)
 Send data on the current connection.
uip_udp_connuip_udp_new (uip_ipaddr_t *ripaddr, u16_t rport)
 Set up a new UDP connection.
+


Define Documentation

+

+ + + + +
+ + + + +  + + + + +
#define uip_abort  ) 
+
+ + + + + +
+   + + +

+Abort the current connection. +

+This function will abort (reset) the current connection, and is usually used when an error has occured that prevents using the uip_close() function.

Examples:
+webclient.c.
+

+Definition at line 581 of file uip.h. +

+Referenced by httpd_appcall(), and webclient_appcall().

+

+ + + + +
+ + + + +  + + + + +
#define uip_aborted  ) 
+
+ + + + + +
+   + + +

+Has the connection been aborted by the other end? +

+Non-zero if the current connection has been aborted (reset) by the remote host.

Examples:
+smtp.c, telnetd.c, and webclient.c.
+

+Definition at line 680 of file uip.h. +

+Referenced by httpd_appcall(), smtp_appcall(), and webclient_appcall().

+

+ + + + +
+ + + + +  + + + + +
#define uip_acked  ) 
+
+ + + + + +
+   + + +

+Has previously sent data been acknowledged? +

+Will reduce to non-zero if the previously sent data has been acknowledged by the remote host. This means that the application can send new data.

Examples:
+telnetd.c, and webclient.c.
+

+Definition at line 648 of file uip.h. +

+Referenced by webclient_appcall().

+

+ + + + +
+ + + + +  + + + + +
#define uip_close  ) 
+
+ + + + + +
+   + + +

+Close the current connection. +

+This function will close the current connection in a nice way.

Examples:
+telnetd.c.
+

+Definition at line 570 of file uip.h.

+

+ + + + +
+ + + + +  + + + + +
#define uip_closed  ) 
+
+ + + + + +
+   + + +

+Has the connection been closed by the other end? +

+Is non-zero if the connection has been closed by the remote host. The application may then do the necessary clean-ups.

Examples:
+smtp.c, telnetd.c, and webclient.c.
+

+Definition at line 670 of file uip.h. +

+Referenced by httpd_appcall(), smtp_appcall(), and webclient_appcall().

+

+ + + + +
+ + + + +  + + + + +
#define uip_connected  ) 
+
+ + + + + +
+   + + +

+Has the connection just been connected? +

+Reduces to non-zero if the current connection has been connected to a remote host. This will happen both if the connection has been actively opened (with uip_connect()) or passively opened (with uip_listen()).

Examples:
+hello-world.c, telnetd.c, and webclient.c.
+

+Definition at line 660 of file uip.h. +

+Referenced by hello_world_appcall(), httpd_appcall(), and webclient_appcall().

+

+ + + + +
+ + + + +  + + + + +
#define uip_datalen  ) 
+
+ + + + + +
+   + + +

+The length of any incoming data that is currently avaliable (if avaliable) in the uip_appdata buffer. +

+The test function uip_data() must first be used to check if there is any data available at all.

Examples:
+dhcpc.c, telnetd.c, and webclient.c.
+

+Definition at line 550 of file uip.h.

+

+ + + + +
+ + + + +  + + + + +
#define uip_mss  ) 
+
+ + + + + +
+   + + +

+Get the current maxium segment size that can be sent on the current connection. +

+The current maxiumum segment size that can be sent on the connection is computed from the receiver's window and the MSS of the connection (which also is available by calling uip_initialmss()).

Examples:
+telnetd.c, and webclient.c.
+

+Definition at line 737 of file uip.h.

+

+ + + + +
+ + + + +  + + + + +
#define uip_newdata  ) 
+
+ + + + + +
+   + + +

+Is new incoming data available? +

+Will reduce to non-zero if there is new data for the application present at the uip_appdata pointer. The size of the data is avaliable through the uip_len variable.

Examples:
+dhcpc.c, resolv.c, telnetd.c, and webclient.c.
+

+Definition at line 637 of file uip.h. +

+Referenced by psock_newdata(), resolv_appcall(), and webclient_appcall().

+

+ + + + +
+ + + + +  + + + + +
#define uip_poll  ) 
+
+ + + + + +
+   + + +

+Is the connection being polled by uIP? +

+Is non-zero if the reason the application is invoked is that the current connection has been idle for a while and should be polled.

+The polling event can be used for sending data without having to wait for the remote host to send data.

Examples:
+resolv.c, telnetd.c, and webclient.c.
+

+Definition at line 716 of file uip.h. +

+Referenced by httpd_appcall(), resolv_appcall(), and webclient_appcall().

+

+ + + + +
+ + + + +  + + + + +
#define uip_restart  ) 
+
+ + + + + +
+   + + +

+Restart the current connection, if is has previously been stopped with uip_stop(). +

+This function will open the receiver's window again so that we start receiving data for the current connection. +

+Definition at line 610 of file uip.h.

+

+ + + + +
+ + + + +  + + + + +
#define uip_rexmit  ) 
+
+ + + + + +
+   + + +

+Do we need to retransmit previously data? +

+Reduces to non-zero if the previously sent data has been lost in the network, and the application should retransmit it. The application should send the exact same data as it did the last time, using the uip_send() function.

Examples:
+telnetd.c, and webclient.c.
+

+Definition at line 702 of file uip.h. +

+Referenced by webclient_appcall().

+

+ + + + +
+ + + + +  + + + + +
#define uip_stop  ) 
+
+ + + + + +
+   + + +

+Tell the sending host to stop sending data. +

+This function will close our receiver's window so that we stop receiving data for the current connection. +

+Definition at line 591 of file uip.h.

+

+ + + + +
+ + + + +  + + + + +
#define uip_timedout  ) 
+
+ + + + + +
+   + + +

+Has the connection timed out? +

+Non-zero if the current connection has been aborted due to too many retransmissions.

Examples:
+smtp.c, telnetd.c, and webclient.c.
+

+Definition at line 690 of file uip.h. +

+Referenced by httpd_appcall(), smtp_appcall(), and webclient_appcall().

+

+ + + + +
+ + + + + + + + + + + + +
#define uip_udp_bind conn,
port   ) 
+
+ + + + + +
+   + + +

+Bind a UDP connection to a local port. +

+

Parameters:
+ + + +
conn A pointer to the uip_udp_conn structure for the connection.
port The local port number, in network byte order.
+
+
Examples:
+dhcpc.c.
+

+Definition at line 787 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_udp_remove conn   ) 
+
+ + + + + +
+   + + +

+Removed a UDP connection. +

+

Parameters:
+ + +
conn A pointer to the uip_udp_conn structure for the connection.
+
+
Examples:
+resolv.c.
+

+Definition at line 775 of file uip.h. +

+Referenced by resolv_conf().

+

+ + + + +
+ + + + + + + + + +
#define uip_udp_send len   ) 
+
+ + + + + +
+   + + +

+Send a UDP datagram of length len on the current connection. +

+This function can only be called in response to a UDP event (poll or newdata). The data must be present in the uip_buf buffer, at the place pointed to by the uip_appdata pointer.

+

Parameters:
+ + +
len The length of the data in the uip_buf buffer.
+
+
Examples:
+resolv.c.
+

+Definition at line 800 of file uip.h.

+

+ + + + +
+ + + + +  + + + + +
#define uip_udpconnection  ) 
+
+ + + + + +
+   + + +

+Is the current connection a UDP connection? +

+This function checks whether the current connection is a UDP connection. +

+Definition at line 626 of file uip.h.

+

+ + + + +
+ + + + +  + + + + +
#define uip_urgdatalen  ) 
+
+ + + + + +
+   + + +

+The length of any out-of-band data (urgent data) that has arrived on the connection. +

+

Note:
The configuration parameter UIP_URGDATA must be set for this function to be enabled.
+ +

+Definition at line 561 of file uip.h.

+


Function Documentation

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
struct uip_conn* uip_connect uip_ipaddr_t ripaddr,
u16_t  port
+
+ + + + + +
+   + + +

+Connect to a remote host using TCP. +

+This function is used to start a new connection to the specified port on the specied host. It allocates a new connection identifier, sets the connection to the SYN_SENT state and sets the retransmission timer to 0. This will cause a TCP SYN segment to be sent out the next time this connection is periodically processed, which usually is done within 0.5 seconds after the call to uip_connect().

+

Note:
This function is avaliable only if support for active open has been configured by defining UIP_ACTIVE_OPEN to 1 in uipopt.h.

+Since this function requires the port number to be in network byte order, a conversion using HTONS() or htons() is necessary.

+
 uip_ipaddr_t ipaddr;
+
+ uip_ipaddr(&ipaddr, 192,168,1,2);
+ uip_connect(&ipaddr, HTONS(80));
+

+

Parameters:
+ + + +
ripaddr The IP address of the remote hot.
port A 16-bit port number in network byte order.
+
+
Returns:
A pointer to the uIP connection identifier for the new connection, or NULL if no connection could be allocated.
+
Examples:
+smtp.c, and webclient.c.
+

+Definition at line 407 of file uip.c. +

+References htons(), uip_conn::lport, uip_conn::tcpstateflags, UIP_CLOSED, uip_conn, UIP_CONNS, and uip_conns. +

+Referenced by smtp_send(), and webclient_get().

+

+ + + + +
+ + + + + + + + + +
void uip_listen u16_t  port  ) 
+
+ + + + + +
+   + + +

+Start listening to the specified port. +

+

Note:
Since this function expects the port number in network byte order, a conversion using HTONS() or htons() is necessary.
+
 uip_listen(HTONS(80));
+

+

Parameters:
+ + +
port A 16-bit port number in network byte order.
+
+
Examples:
+hello-world.c, and telnetd.c.
+

+Definition at line 529 of file uip.c. +

+References UIP_LISTENPORTS. +

+Referenced by hello_world_init(), and httpd_init().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
void uip_send const void *  data,
int  len
+
+ + + + + +
+   + + +

+Send data on the current connection. +

+This function is used to send out a single segment of TCP data. Only applications that have been invoked by uIP for event processing can send data.

+The amount of data that actually is sent out after a call to this funcion is determined by the maximum amount of data TCP allows. uIP will automatically crop the data so that only the appropriate amount of data is sent. The function uip_mss() can be used to query uIP for the amount of data that actually will be sent.

+

Note:
This function does not guarantee that the sent data will arrive at the destination. If the data is lost in the network, the application will be invoked with the uip_rexmit() event being set. The application will then have to resend the data using this function.
+
Parameters:
+ + + +
data A pointer to the data which is to be sent.
len The maximum amount of data bytes to be sent.
+
+
Examples:
+dhcpc.c, telnetd.c, and webclient.c.
+

+Definition at line 1888 of file uip.c. +

+References uip_sappdata, and uip_slen.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
struct uip_udp_conn* uip_udp_new uip_ipaddr_t ripaddr,
u16_t  rport
+
+ + + + + +
+   + + +

+Set up a new UDP connection. +

+This function sets up a new UDP connection. The function will automatically allocate an unused local port for the new connection. However, another port can be chosen by using the uip_udp_bind() call, after the uip_udp_new() function has been called.

+Example:

 uip_ipaddr_t addr;
+ struct uip_udp_conn *c;
+ 
+ uip_ipaddr(&addr, 192,168,2,1);
+ c = uip_udp_new(&addr, HTONS(12345));
+ if(c != NULL) {
+   uip_udp_bind(c, HTONS(12344));
+ }
+
Parameters:
+ + + +
ripaddr The IP address of the remote host.
rport The remote port number in network byte order.
+
+
Returns:
The uip_udp_conn structure for the new connection or NULL if no connection could be allocated.
+
Examples:
+dhcpc.c, and resolv.c.
+

+Definition at line 473 of file uip.c. +

+References htons(), uip_udp_conn::lport, uip_udp_conn, UIP_UDP_CONNS, and uip_udp_conns. +

+Referenced by resolv_conf().

+

+ + + + +
+ + + + + + + + + +
void uip_unlisten u16_t  port  ) 
+
+ + + + + +
+   + + +

+Stop listening to the specified port. +

+

Note:
Since this function expects the port number in network byte order, a conversion using HTONS() or htons() is necessary.
+

+

Parameters:
+ + +
port A 16-bit port number in network byte order.
+
+ +

+Definition at line 518 of file uip.c. +

+References UIP_LISTENPORTS.

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00148.html b/third_party/uip-1.0/doc/html/a00148.html new file mode 100644 index 0000000..1e26ef7 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00148.html @@ -0,0 +1,634 @@ + + +uIP 1.0: uIP conversion functions + + + + + +

uIP conversion functions
+ +[The uIP TCP/IP stack] +


Detailed Description

+These functions can be used for converting between different data formats used by uIP. +

+ +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Defines

#define uip_ipaddr(addr, addr0, addr1, addr2, addr3)
 Construct an IP address from four bytes.
#define uip_ip6addr(addr, addr0, addr1, addr2, addr3, addr4, addr5, addr6, addr7)
 Construct an IPv6 address from eight 16-bit words.
#define uip_ipaddr_copy(dest, src)
 Copy an IP address to another IP address.
#define uip_ipaddr_cmp(addr1, addr2)
 Compare two IP addresses.
#define uip_ipaddr_maskcmp(addr1, addr2, mask)
 Compare two IP addresses with netmasks.
#define uip_ipaddr_mask(dest, src, mask)
 Mask out the network part of an IP address.
#define uip_ipaddr1(addr)
 Pick the first octet of an IP address.
#define uip_ipaddr2(addr)
 Pick the second octet of an IP address.
#define uip_ipaddr3(addr)
 Pick the third octet of an IP address.
#define uip_ipaddr4(addr)
 Pick the fourth octet of an IP address.
#define HTONS(n)
 Convert 16-bit quantity from host byte order to network byte order.
+#define ntohs   htons

Functions

u16_t htons (u16_t val)
 Convert 16-bit quantity from host byte order to network byte order.
+


Define Documentation

+

+ + + + +
+ + + + + + + + + +
#define HTONS  ) 
+
+ + + + + +
+   + + +

+Convert 16-bit quantity from host byte order to network byte order. +

+This macro is primarily used for converting constants from host byte order to network byte order. For converting variables to network byte order, use the htons() function instead.

Examples:
+dhcpc.c, hello-world.c, resolv.c, smtp.c, and telnetd.c.
+

+Definition at line 1070 of file uip.h. +

+Referenced by hello_world_init(), htons(), httpd_init(), resolv_appcall(), resolv_conf(), smtp_send(), uip_arp_arpin(), and uip_process().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#define uip_ip6addr addr,
addr0,
addr1,
addr2,
addr3,
addr4,
addr5,
addr6,
addr7   ) 
+
+ + + + + +
+   + + +

+Construct an IPv6 address from eight 16-bit words. +

+This function constructs an IPv6 address. +

+Definition at line 852 of file uip.h.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + +
#define uip_ipaddr addr,
addr0,
addr1,
addr2,
addr3   ) 
+
+ + + + + +
+   + + +

+Construct an IP address from four bytes. +

+This function constructs an IP address of the type that uIP handles internally from four bytes. The function is handy for specifying IP addresses to use with e.g. the uip_connect() function.

+Example:

 uip_ipaddr_t ipaddr;
+ struct uip_conn *c;
+ 
+ uip_ipaddr(&ipaddr, 192,168,1,2);
+ c = uip_connect(&ipaddr, HTONS(80));
+

+

Parameters:
+ + + + + + +
addr A pointer to a uip_ipaddr_t variable that will be filled in with the IP address.
addr0 The first octet of the IP address.
addr1 The second octet of the IP address.
addr2 The third octet of the IP address.
addr3 The forth octet of the IP address.
+
+
Examples:
+dhcpc.c, example-mainloop-with-arp.c, and example-mainloop-without-arp.c.
+

+Definition at line 840 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_ipaddr1 addr   ) 
+
+ + + + + +
+   + + +

+Pick the first octet of an IP address. +

+Picks out the first octet of an IP address.

+Example:

 uip_ipaddr_t ipaddr;
+ u8_t octet;
+
+ uip_ipaddr(&ipaddr, 1,2,3,4);
+ octet = uip_ipaddr1(&ipaddr);
+

+In the example above, the variable "octet" will contain the value 1.

Examples:
+dhcpc.c.
+

+Definition at line 995 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_ipaddr2 addr   ) 
+
+ + + + + +
+   + + +

+Pick the second octet of an IP address. +

+Picks out the second octet of an IP address.

+Example:

 uip_ipaddr_t ipaddr;
+ u8_t octet;
+
+ uip_ipaddr(&ipaddr, 1,2,3,4);
+ octet = uip_ipaddr2(&ipaddr);
+

+In the example above, the variable "octet" will contain the value 2.

Examples:
+dhcpc.c.
+

+Definition at line 1015 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_ipaddr3 addr   ) 
+
+ + + + + +
+   + + +

+Pick the third octet of an IP address. +

+Picks out the third octet of an IP address.

+Example:

 uip_ipaddr_t ipaddr;
+ u8_t octet;
+
+ uip_ipaddr(&ipaddr, 1,2,3,4);
+ octet = uip_ipaddr3(&ipaddr);
+

+In the example above, the variable "octet" will contain the value 3.

Examples:
+dhcpc.c.
+

+Definition at line 1035 of file uip.h.

+

+ + + + +
+ + + + + + + + + +
#define uip_ipaddr4 addr   ) 
+
+ + + + + +
+   + + +

+Pick the fourth octet of an IP address. +

+Picks out the fourth octet of an IP address.

+Example:

 uip_ipaddr_t ipaddr;
+ u8_t octet;
+
+ uip_ipaddr(&ipaddr, 1,2,3,4);
+ octet = uip_ipaddr4(&ipaddr);
+

+In the example above, the variable "octet" will contain the value 4.

Examples:
+dhcpc.c.
+

+Definition at line 1055 of file uip.h.

+

+ + + + +
+ + + + + + + + + + + + +
#define uip_ipaddr_cmp addr1,
addr2   ) 
+
+ + + + + +
+   + + +

+Compare two IP addresses. +

+Compares two IP addresses.

+Example:

 uip_ipaddr_t ipaddr1, ipaddr2;
+
+ uip_ipaddr(&ipaddr1, 192,16,1,2);
+ if(uip_ipaddr_cmp(&ipaddr2, &ipaddr1)) {
+    printf("They are the same");
+ }
+

+

Parameters:
+ + + +
addr1 The first IP address.
addr2 The second IP address.
+
+ +

+Definition at line 911 of file uip.h. +

+Referenced by uip_arp_arpin(), uip_arp_out(), and uip_process().

+

+ + + + +
+ + + + + + + + + + + + +
#define uip_ipaddr_copy dest,
src   ) 
+
+ + + + + +
+   + + +

+Copy an IP address to another IP address. +

+Copies an IP address from one place to another.

+Example:

 uip_ipaddr_t ipaddr1, ipaddr2;
+
+ uip_ipaddr(&ipaddr1, 192,16,1,2);
+ uip_ipaddr_copy(&ipaddr2, &ipaddr1);
+

+

Parameters:
+ + + +
dest The destination for the copy.
src The source from where to copy.
+
+
Examples:
+smtp.c.
+

+Definition at line 882 of file uip.h. +

+Referenced by smtp_configure(), uip_arp_out(), and uip_process().

+

+ + + + +
+ + + + + + + + + + + + + + + +
#define uip_ipaddr_mask dest,
src,
mask   ) 
+
+ + + + + +
+   + + +

+Mask out the network part of an IP address. +

+Masks out the network part of an IP address, given the address and the netmask.

+Example:

 uip_ipaddr_t ipaddr1, ipaddr2, netmask;
+
+ uip_ipaddr(&ipaddr1, 192,16,1,2);
+ uip_ipaddr(&netmask, 255,255,255,0);
+ uip_ipaddr_mask(&ipaddr2, &ipaddr1, &netmask);
+

+In the example above, the variable "ipaddr2" will contain the IP address 192.168.1.0.

+

Parameters:
+ + + + +
dest Where the result is to be placed.
src The IP address.
mask The netmask.
+
+ +

+Definition at line 972 of file uip.h.

+

+ + + + +
+ + + + + + + + + + + + + + + +
#define uip_ipaddr_maskcmp addr1,
addr2,
mask   ) 
+
+ + + + + +
+   + + +

+Compare two IP addresses with netmasks. +

+Compares two IP addresses with netmasks. The masks are used to mask out the bits that are to be compared.

+Example:

 uip_ipaddr_t ipaddr1, ipaddr2, mask;
+
+ uip_ipaddr(&mask, 255,255,255,0);
+ uip_ipaddr(&ipaddr1, 192,16,1,2);
+ uip_ipaddr(&ipaddr2, 192,16,1,3);
+ if(uip_ipaddr_maskcmp(&ipaddr1, &ipaddr2, &mask)) {
+    printf("They are the same");
+ }
+

+

Parameters:
+ + + + +
addr1 The first IP address.
addr2 The second IP address.
mask The netmask.
+
+ +

+Definition at line 941 of file uip.h. +

+Referenced by uip_arp_out().

+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
u16_t htons u16_t  val  ) 
+
+ + + + + +
+   + + +

+Convert 16-bit quantity from host byte order to network byte order. +

+This function is primarily used for converting variables from host byte order to network byte order. For converting constants to network byte order, use the HTONS() macro instead.

Examples:
+example-mainloop-with-arp.c, resolv.c, and webclient.c.
+

+Definition at line 1882 of file uip.c. +

+References HTONS. +

+Referenced by uip_chksum(), uip_connect(), uip_ipchksum(), uip_udp_new(), and webclient_get().

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00149.html b/third_party/uip-1.0/doc/html/a00149.html new file mode 100644 index 0000000..4921075 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00149.html @@ -0,0 +1,68 @@ + + +uIP 1.0: Variables used in uIP device drivers + + + + + +

Variables used in uIP device drivers
+ +[The uIP TCP/IP stack] +


Detailed Description

+uIP has a few global variables that are used in device drivers for uIP. +

+ +

+ + + + + + +

Variables

u16_t uip_len
 The length of the packet in the uip_buf buffer.
+


Variable Documentation

+

+ + + + +
+ + + + +
u16_t uip_len
+
+ + + + + +
+   + + +

+The length of the packet in the uip_buf buffer. +

+The global variable uip_len holds the length of the packet in the uip_buf buffer.

+When the network device driver calls the uIP input function, uip_len should be set to the length of the packet in the uip_buf buffer.

+When sending packets, the device driver should use the contents of the uip_len variable to determine the length of the outgoing packet.

Examples:
+example-mainloop-with-arp.c, and example-mainloop-without-arp.c.
+

+Definition at line 155 of file uip.c. +

+Referenced by uip_arp_arpin(), uip_process(), and uip_split_output().

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00150.html b/third_party/uip-1.0/doc/html/a00150.html new file mode 100644 index 0000000..928e13e --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00150.html @@ -0,0 +1,1248 @@ + + +uIP 1.0: The uIP TCP/IP stack + + + + + +

The uIP TCP/IP stack


Detailed Description

+uIP is an implementation of the TCP/IP protocol stack intended for small 8-bit and 16-bit microcontrollers. +

+uIP provides the necessary protocols for Internet communication, with a very small code footprint and RAM requirements - the uIP code size is on the order of a few kilobytes and RAM usage is on the order of a few hundred bytes. +

+ + + + + + + +

+

+ + + +

+

+ + + + +

+

+ + + +

+

+ + + +

+

+ + + +

+

+ + + +

+

+ + + +

+

+ + + +

+

+ + + +

+

+ + + +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Files

file  uip.h
 Header file for the uIP TCP/IP stack.
file  uip.c
 The uIP TCP/IP stack code.

Modules

 uIP configuration functions
 The uIP configuration functions are used for setting run-time parameters in uIP such as IP addresses.
 uIP initialization functions
 The uIP initialization functions are used for booting uIP.
 uIP device driver functions
 These functions are used by a network device driver for interacting with uIP.
 uIP application functions
 Functions used by an application running of top of uIP.
 uIP conversion functions
 These functions can be used for converting between different data formats used by uIP.
 Variables used in uIP device drivers
 uIP has a few global variables that are used in device drivers for uIP.
 uIP Address Resolution Protocol
 The Address Resolution Protocol ARP is used for mapping between IP addresses and link level addresses such as the Ethernet MAC addresses.
 uIP TCP throughput booster hack
 The basic uIP TCP implementation only allows each TCP connection to have a single TCP segment in flight at any given time.
 Architecture specific uIP functions
 The functions in the architecture specific module implement the IP check sum and 32-bit additions.

Data Structures

struct  uip_conn
 Representation of a uIP TCP connection. More...
struct  uip_udp_conn
 Representation of a uIP UDP connection. More...
struct  uip_stats
 The structure holding the TCP/IP statistics that are gathered if UIP_STATISTICS is set to 1. More...
struct  uip_tcpip_hdr
struct  uip_icmpip_hdr
struct  uip_udpip_hdr
struct  uip_eth_addr
 Representation of a 48-bit Ethernet address. More...

Defines

+#define UIP_ACKDATA   1
+#define UIP_NEWDATA   2
+#define UIP_REXMIT   4
+#define UIP_POLL   8
+#define UIP_CLOSE   16
+#define UIP_ABORT   32
+#define UIP_CONNECTED   64
+#define UIP_TIMEDOUT   128
+#define UIP_DATA   1
+#define UIP_TIMER   2
+#define UIP_POLL_REQUEST   3
+#define UIP_UDP_SEND_CONN   4
+#define UIP_UDP_TIMER   5
+#define UIP_CLOSED   0
+#define UIP_SYN_RCVD   1
+#define UIP_SYN_SENT   2
+#define UIP_ESTABLISHED   3
+#define UIP_FIN_WAIT_1   4
+#define UIP_FIN_WAIT_2   5
+#define UIP_CLOSING   6
+#define UIP_TIME_WAIT   7
+#define UIP_LAST_ACK   8
+#define UIP_TS_MASK   15
+#define UIP_STOPPED   16
#define UIP_APPDATA_SIZE
 The buffer size available for user data in the uip_buf buffer.
+#define UIP_PROTO_ICMP   1
+#define UIP_PROTO_TCP   6
+#define UIP_PROTO_UDP   17
+#define UIP_PROTO_ICMP6   58
+#define UIP_IPH_LEN   20
+#define UIP_UDPH_LEN   8
+#define UIP_TCPH_LEN   20
+#define UIP_IPUDPH_LEN   (UIP_UDPH_LEN + UIP_IPH_LEN)
+#define UIP_IPTCPH_LEN   (UIP_TCPH_LEN + UIP_IPH_LEN)
+#define UIP_TCPIP_HLEN   UIP_IPTCPH_LEN
+#define TCP_FIN   0x01
+#define TCP_SYN   0x02
+#define TCP_RST   0x04
+#define TCP_PSH   0x08
+#define TCP_ACK   0x10
+#define TCP_URG   0x20
+#define TCP_CTL   0x3f
+#define TCP_OPT_END   0
+#define TCP_OPT_NOOP   1
+#define TCP_OPT_MSS   2
+#define TCP_OPT_MSS_LEN   4
+#define ICMP_ECHO_REPLY   0
+#define ICMP_ECHO   8
+#define ICMP6_ECHO_REPLY   129
+#define ICMP6_ECHO   128
+#define ICMP6_NEIGHBOR_SOLICITATION   135
+#define ICMP6_NEIGHBOR_ADVERTISEMENT   136
+#define ICMP6_FLAG_S   (1 << 6)
+#define ICMP6_OPTION_SOURCE_LINK_ADDRESS   1
+#define ICMP6_OPTION_TARGET_LINK_ADDRESS   2
+#define BUF   ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
+#define FBUF   ((struct uip_tcpip_hdr *)&uip_reassbuf[0])
+#define ICMPBUF   ((struct uip_icmpip_hdr *)&uip_buf[UIP_LLH_LEN])
+#define UDPBUF   ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN])
+#define UIP_STAT(s)
+#define UIP_LOG(m)

Typedefs

+typedef u16_t uip_ip4addr_t [2]
 Repressentation of an IP address.
+typedef u16_t uip_ip6addr_t [8]
+typedef uip_ip4addr_t uip_ipaddr_t

Functions

+void uip_process (u8_t flag)
u16_t uip_chksum (u16_t *buf, u16_t len)
 Calculate the Internet checksum over a buffer.
u16_t uip_ipchksum (void)
 Calculate the IP header checksum of the packet header in uip_buf.
u16_t uip_tcpchksum (void)
 Calculate the TCP checksum of the packet in uip_buf and uip_appdata.
u16_t uip_udpchksum (void)
 Calculate the UDP checksum of the packet in uip_buf and uip_appdata.
void uip_setipid (u16_t id)
 uIP initialization function.
void uip_add32 (u8_t *op32, u16_t op16)
 Carry out a 32-bit addition.
void uip_init (void)
 uIP initialization function.
uip_connuip_connect (uip_ipaddr_t *ripaddr, u16_t rport)
 Connect to a remote host using TCP.
uip_udp_connuip_udp_new (uip_ipaddr_t *ripaddr, u16_t rport)
 Set up a new UDP connection.
void uip_unlisten (u16_t port)
 Stop listening to the specified port.
void uip_listen (u16_t port)
 Start listening to the specified port.
u16_t htons (u16_t val)
 Convert 16-bit quantity from host byte order to network byte order.
void uip_send (const void *data, int len)
 Send data on the current connection.

Variables

void * uip_appdata
 Pointer to the application data in the packet buffer.
uip_connuip_conn
 Pointer to the current TCP connection.
+uip_conn uip_conns [UIP_CONNS]
+uip_udp_connuip_udp_conn
 The current UDP connection.
+uip_udp_conn uip_udp_conns [UIP_UDP_CONNS]
uip_stats uip_stat
 The uIP TCP/IP statistics.
+u8_t uip_flags
+uip_ipaddr_t uip_hostaddr
+uip_ipaddr_t uip_netmask
+uip_ipaddr_t uip_draddr
+uip_ipaddr_t uip_hostaddr
+uip_ipaddr_t uip_draddr
+uip_ipaddr_t uip_netmask
+uip_eth_addr uip_ethaddr = {{0,0,0,0,0,0}}
u8_t uip_buf [UIP_BUFSIZE+2]
 The uIP packet buffer.
void * uip_appdata
 Pointer to the application data in the packet buffer.
+void * uip_sappdata
u16_t uip_len
 The length of the packet in the uip_buf buffer.
+u16_t uip_slen
+u8_t uip_flags
uip_connuip_conn
 Pointer to the current TCP connection.
+uip_conn uip_conns [UIP_CONNS]
+u16_t uip_listenports [UIP_LISTENPORTS]
+uip_udp_connuip_udp_conn
 The current UDP connection.
+uip_udp_conn uip_udp_conns [UIP_UDP_CONNS]
+u8_t uip_acc32 [4]
 4-byte array used for the 32-bit sequence number calculations.
+


Define Documentation

+

+ + + + +
+ + + + +
#define UIP_APPDATA_SIZE
+
+ + + + + +
+   + + +

+The buffer size available for user data in the uip_buf buffer. +

+This macro holds the available size for user data in the uip_buf buffer. The macro is intended to be used for checking bounds of available user data.

+Example:

 snprintf(uip_appdata, UIP_APPDATA_SIZE, "%u\n", i);
+
+

+Definition at line 1506 of file uip.h.

+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
u16_t htons u16_t  val  ) 
+
+ + + + + +
+   + + +

+Convert 16-bit quantity from host byte order to network byte order. +

+This function is primarily used for converting variables from host byte order to network byte order. For converting constants to network byte order, use the HTONS() macro instead. +

+Definition at line 1882 of file uip.c. +

+References HTONS. +

+Referenced by uip_chksum(), uip_connect(), uip_ipchksum(), uip_udp_new(), and webclient_get().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
void uip_add32 u8_t op32,
u16_t  op16
+
+ + + + + +
+   + + +

+Carry out a 32-bit addition. +

+Because not all architectures for which uIP is intended has native 32-bit arithmetic, uIP uses an external C function for doing the required 32-bit additions in the TCP protocol processing. This function should add the two arguments and place the result in the global variable uip_acc32.

+

Note:
The 32-bit integer pointed to by the op32 parameter and the result in the uip_acc32 variable are in network byte order (big endian).
+
Parameters:
+ + + +
op32 A pointer to a 4-byte array representing a 32-bit integer in network byte order (big endian).
op16 A 16-bit integer in host byte order.
+
+ +

+Definition at line 249 of file uip.c. +

+Referenced by uip_split_output().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
u16_t uip_chksum u16_t buf,
u16_t  len
+
+ + + + + +
+   + + +

+Calculate the Internet checksum over a buffer. +

+The Internet checksum is the one's complement of the one's complement sum of all 16-bit words in the buffer.

+See RFC1071.

+

Parameters:
+ + + +
buf A pointer to the buffer over which the checksum is to be computed.
len The length of the buffer over which the checksum is to be computed.
+
+
Returns:
The Internet checksum of the buffer.
+ +

+Definition at line 311 of file uip.c. +

+References htons().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
struct uip_conn* uip_connect uip_ipaddr_t ripaddr,
u16_t  port
+
+ + + + + +
+   + + +

+Connect to a remote host using TCP. +

+This function is used to start a new connection to the specified port on the specied host. It allocates a new connection identifier, sets the connection to the SYN_SENT state and sets the retransmission timer to 0. This will cause a TCP SYN segment to be sent out the next time this connection is periodically processed, which usually is done within 0.5 seconds after the call to uip_connect().

+

Note:
This function is avaliable only if support for active open has been configured by defining UIP_ACTIVE_OPEN to 1 in uipopt.h.

+Since this function requires the port number to be in network byte order, a conversion using HTONS() or htons() is necessary.

+
 uip_ipaddr_t ipaddr;
+
+ uip_ipaddr(&ipaddr, 192,168,1,2);
+ uip_connect(&ipaddr, HTONS(80));
+

+

Parameters:
+ + + +
ripaddr The IP address of the remote hot.
port A 16-bit port number in network byte order.
+
+
Returns:
A pointer to the uIP connection identifier for the new connection, or NULL if no connection could be allocated.
+ +

+Definition at line 407 of file uip.c. +

+References htons(), uip_conn::lport, uip_conn::tcpstateflags, UIP_CLOSED, uip_conn, uip_conns, and UIP_CONNS. +

+Referenced by smtp_send(), and webclient_get().

+

+ + + + +
+ + + + + + + + + +
void uip_init void   ) 
+
+ + + + + +
+   + + +

+uIP initialization function. +

+This function should be called at boot up to initilize the uIP TCP/IP stack. +

+Definition at line 379 of file uip.c. +

+References UIP_LISTENPORTS.

+

+ + + + +
+ + + + + + + + + +
u16_t uip_ipchksum void   ) 
+
+ + + + + +
+   + + +

+Calculate the IP header checksum of the packet header in uip_buf. +

+The IP header checksum is the Internet checksum of the 20 bytes of the IP header.

+

Returns:
The IP header checksum of the IP header in the uip_buf buffer.
+ +

+Definition at line 318 of file uip.c. +

+References DEBUG_PRINTF, htons(), UIP_IPH_LEN, and UIP_LLH_LEN. +

+Referenced by uip_process(), and uip_split_output().

+

+ + + + +
+ + + + + + + + + +
void uip_listen u16_t  port  ) 
+
+ + + + + +
+   + + +

+Start listening to the specified port. +

+

Note:
Since this function expects the port number in network byte order, a conversion using HTONS() or htons() is necessary.
+
 uip_listen(HTONS(80));
+

+

Parameters:
+ + +
port A 16-bit port number in network byte order.
+
+ +

+Definition at line 529 of file uip.c. +

+References UIP_LISTENPORTS. +

+Referenced by hello_world_init(), and httpd_init().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
void uip_send const void *  data,
int  len
+
+ + + + + +
+   + + +

+Send data on the current connection. +

+This function is used to send out a single segment of TCP data. Only applications that have been invoked by uIP for event processing can send data.

+The amount of data that actually is sent out after a call to this funcion is determined by the maximum amount of data TCP allows. uIP will automatically crop the data so that only the appropriate amount of data is sent. The function uip_mss() can be used to query uIP for the amount of data that actually will be sent.

+

Note:
This function does not guarantee that the sent data will arrive at the destination. If the data is lost in the network, the application will be invoked with the uip_rexmit() event being set. The application will then have to resend the data using this function.
+
Parameters:
+ + + +
data A pointer to the data which is to be sent.
len The maximum amount of data bytes to be sent.
+
+ +

+Definition at line 1888 of file uip.c. +

+References uip_sappdata, and uip_slen.

+

+ + + + +
+ + + + + + + + + +
void uip_setipid u16_t  id  ) 
+
+ + + + + +
+   + + +

+uIP initialization function. +

+This function may be used at boot time to set the initial ip_id. +

+Definition at line 181 of file uip.c.

+

+ + + + +
+ + + + + + + + + +
u16_t uip_tcpchksum void   ) 
+
+ + + + + +
+   + + +

+Calculate the TCP checksum of the packet in uip_buf and uip_appdata. +

+The TCP checksum is the Internet checksum of data contents of the TCP segment, and a pseudo-header as defined in RFC793.

+

Returns:
The TCP checksum of the TCP segment in uip_buf and pointed to by uip_appdata.
+ +

+Definition at line 364 of file uip.c. +

+References UIP_PROTO_TCP. +

+Referenced by uip_split_output().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
struct uip_udp_conn* uip_udp_new uip_ipaddr_t ripaddr,
u16_t  rport
+
+ + + + + +
+   + + +

+Set up a new UDP connection. +

+This function sets up a new UDP connection. The function will automatically allocate an unused local port for the new connection. However, another port can be chosen by using the uip_udp_bind() call, after the uip_udp_new() function has been called.

+Example:

 uip_ipaddr_t addr;
+ struct uip_udp_conn *c;
+ 
+ uip_ipaddr(&addr, 192,168,2,1);
+ c = uip_udp_new(&addr, HTONS(12345));
+ if(c != NULL) {
+   uip_udp_bind(c, HTONS(12344));
+ }
+
Parameters:
+ + + +
ripaddr The IP address of the remote host.
rport The remote port number in network byte order.
+
+
Returns:
The uip_udp_conn structure for the new connection or NULL if no connection could be allocated.
+ +

+Definition at line 473 of file uip.c. +

+References htons(), uip_udp_conn::lport, uip_udp_conn, uip_udp_conns, and UIP_UDP_CONNS. +

+Referenced by resolv_conf().

+

+ + + + +
+ + + + + + + + + +
u16_t uip_udpchksum void   ) 
+
+ + + + + +
+   + + +

+Calculate the UDP checksum of the packet in uip_buf and uip_appdata. +

+The UDP checksum is the Internet checksum of data contents of the UDP segment, and a pseudo-header as defined in RFC768.

+

Returns:
The UDP checksum of the UDP segment in uip_buf and pointed to by uip_appdata.
+ +

+Referenced by uip_process().

+

+ + + + +
+ + + + + + + + + +
void uip_unlisten u16_t  port  ) 
+
+ + + + + +
+   + + +

+Stop listening to the specified port. +

+

Note:
Since this function expects the port number in network byte order, a conversion using HTONS() or htons() is necessary.
+

+

Parameters:
+ + +
port A 16-bit port number in network byte order.
+
+ +

+Definition at line 518 of file uip.c. +

+References UIP_LISTENPORTS.

+


Variable Documentation

+

+ + + + +
+ + + + +
void* uip_appdata
+
+ + + + + +
+   + + +

+Pointer to the application data in the packet buffer. +

+This pointer points to the application data when the application is called. If the application wishes to send data, the application may use this space to write the data into before calling uip_send(). +

+Definition at line 143 of file uip.c. +

+Referenced by uip_process(), and uip_split_output().

+

+ + + + +
+ + + + +
void* uip_appdata
+
+ + + + + +
+   + + +

+Pointer to the application data in the packet buffer. +

+This pointer points to the application data when the application is called. If the application wishes to send data, the application may use this space to write the data into before calling uip_send().

Examples:
+dhcpc.c, resolv.c, telnetd.c, and webclient.c.
+

+Definition at line 143 of file uip.c. +

+Referenced by uip_process(), and uip_split_output().

+

+ + + + +
+ + + + +
u8_t uip_buf[UIP_BUFSIZE+2]
+
+ + + + + +
+   + + +

+The uIP packet buffer. +

+The uip_buf array is used to hold incoming and outgoing packets. The device driver should place incoming data into this buffer. When sending data, the device driver should read the link level headers and the TCP/IP headers from this buffer. The size of the link level headers is configured by the UIP_LLH_LEN define.

+

Note:
The application data need not be placed in this buffer, so the device driver must read it from the place pointed to by the uip_appdata pointer as illustrated by the following example:
 void
+ devicedriver_send(void)
+ {
+    hwsend(&uip_buf[0], UIP_LLH_LEN);
+    if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) {
+      hwsend(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN);
+    } else {
+      hwsend(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN);
+      hwsend(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN);
+    }
+ }
+
+ +

+Definition at line 139 of file uip.c. +

+Referenced by uip_process().

+

+ + + + +
+ + + + +
struct uip_conn* uip_conn
+
+ + + + + +
+   + + +

+Pointer to the current TCP connection. +

+The uip_conn pointer can be used to access the current TCP connection. +

+Definition at line 163 of file uip.c. +

+Referenced by uip_connect().

+

+ + + + +
+ + + + +
struct uip_conn* uip_conn
+
+ + + + + +
+   + + +

+Pointer to the current TCP connection. +

+The uip_conn pointer can be used to access the current TCP connection.

Examples:
+hello-world.c, smtp.c, and webclient.c.
+

+Definition at line 163 of file uip.c. +

+Referenced by uip_connect().

+

+ + + + +
+ + + + +
u16_t uip_len
+
+ + + + + +
+   + + +

+The length of the packet in the uip_buf buffer. +

+The global variable uip_len holds the length of the packet in the uip_buf buffer.

+When the network device driver calls the uIP input function, uip_len should be set to the length of the packet in the uip_buf buffer.

+When sending packets, the device driver should use the contents of the uip_len variable to determine the length of the outgoing packet. +

+Definition at line 155 of file uip.c. +

+Referenced by uip_arp_arpin(), uip_process(), and uip_split_output().

+

+ + + + +
+ + + + +
struct uip_stats uip_stat
+
+ + + + + +
+   + + +

+The uIP TCP/IP statistics. +

+This is the variable in which the uIP TCP/IP statistics are gathered. +

+Referenced by uip_process().

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00151.html b/third_party/uip-1.0/doc/html/a00151.html new file mode 100644 index 0000000..356a06d --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00151.html @@ -0,0 +1,221 @@ + + +uIP 1.0: Architecture specific uIP functions + + + + + +

Architecture specific uIP functions
+ +[The uIP TCP/IP stack] +


Detailed Description

+The functions in the architecture specific module implement the IP check sum and 32-bit additions. +

+The IP checksum calculation is the most computationally expensive operation in the TCP/IP stack and it therefore pays off to implement this in efficient assembler. The purpose of the uip-arch module is to let the checksum functions to be implemented in architecture specific assembler. +

+ + + + + + + +

+

+ + + + + + + + + + + + + + + + +

Files

file  uip_arch.h
 Declarations of architecture specific functions.

Functions

void uip_add32 (u8_t *op32, u16_t op16)
 Carry out a 32-bit addition.
u16_t uip_chksum (u16_t *buf, u16_t len)
 Calculate the Internet checksum over a buffer.
u16_t uip_ipchksum (void)
 Calculate the IP header checksum of the packet header in uip_buf.
u16_t uip_tcpchksum (void)
 Calculate the TCP checksum of the packet in uip_buf and uip_appdata.

Variables

+u8_t uip_acc32 [4]
 4-byte array used for the 32-bit sequence number calculations.
+


Function Documentation

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
void uip_add32 u8_t op32,
u16_t  op16
+
+ + + + + +
+   + + +

+Carry out a 32-bit addition. +

+Because not all architectures for which uIP is intended has native 32-bit arithmetic, uIP uses an external C function for doing the required 32-bit additions in the TCP protocol processing. This function should add the two arguments and place the result in the global variable uip_acc32.

+

Note:
The 32-bit integer pointed to by the op32 parameter and the result in the uip_acc32 variable are in network byte order (big endian).
+
Parameters:
+ + + +
op32 A pointer to a 4-byte array representing a 32-bit integer in network byte order (big endian).
op16 A 16-bit integer in host byte order.
+
+ +

+Definition at line 249 of file uip.c. +

+Referenced by uip_split_output().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
u16_t uip_chksum u16_t buf,
u16_t  len
+
+ + + + + +
+   + + +

+Calculate the Internet checksum over a buffer. +

+The Internet checksum is the one's complement of the one's complement sum of all 16-bit words in the buffer.

+See RFC1071.

+

Note:
This function is not called in the current version of uIP, but future versions might make use of it.
+
Parameters:
+ + + +
buf A pointer to the buffer over which the checksum is to be computed.
len The length of the buffer over which the checksum is to be computed.
+
+
Returns:
The Internet checksum of the buffer.
+
+

+ + + + +
+ + + + + + + + + +
u16_t uip_ipchksum void   ) 
+
+ + + + + +
+   + + +

+Calculate the IP header checksum of the packet header in uip_buf. +

+The IP header checksum is the Internet checksum of the 20 bytes of the IP header.

+

Returns:
The IP header checksum of the IP header in the uip_buf buffer.
+
+

+ + + + +
+ + + + + + + + + +
u16_t uip_tcpchksum void   ) 
+
+ + + + + +
+   + + +

+Calculate the TCP checksum of the packet in uip_buf and uip_appdata. +

+The TCP checksum is the Internet checksum of data contents of the TCP segment, and a pseudo-header as defined in RFC793.

+

Note:
The uip_appdata pointer that points to the packet data may point anywhere in memory, so it is not possible to simply calculate the Internet checksum of the contents of the uip_buf buffer.
+
Returns:
The TCP checksum of the TCP segment in uip_buf and pointed to by uip_appdata.
+
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00152.html b/third_party/uip-1.0/doc/html/a00152.html new file mode 100644 index 0000000..8163a92 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00152.html @@ -0,0 +1,205 @@ + + +uIP 1.0: uIP Address Resolution Protocol + + + + + +

uIP Address Resolution Protocol
+ +[The uIP TCP/IP stack] +


Detailed Description

+The Address Resolution Protocol ARP is used for mapping between IP addresses and link level addresses such as the Ethernet MAC addresses. +

+ARP uses broadcast queries to ask for the link level address of a known IP address and the host which is configured with the IP address for which the query was meant, will respond with its link level address.

+

Note:
This ARP implementation only supports Ethernet.
+ +

+ + + + + + + +

+

+ + + +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Files

file  uip_arp.h
 Macros and definitions for the ARP module.
file  uip_arp.c
 Implementation of the ARP Address Resolution Protocol.

Data Structures

struct  uip_eth_hdr
 The Ethernet header. More...

Defines

+#define UIP_ETHTYPE_ARP   0x0806
+#define UIP_ETHTYPE_IP   0x0800
+#define UIP_ETHTYPE_IP6   0x86dd
+#define uip_arp_ipin()
+#define ARP_REQUEST   1
+#define ARP_REPLY   2
+#define ARP_HWTYPE_ETH   1
+#define BUF   ((struct arp_hdr *)&uip_buf[0])
+#define IPBUF   ((struct ethip_hdr *)&uip_buf[0])

Functions

+void uip_arp_init (void)
 Initialize the ARP module.
void uip_arp_arpin (void)
 ARP processing for incoming ARP packets.
void uip_arp_out (void)
 Prepend Ethernet header to an outbound IP packet and see if we need to send out an ARP request.
void uip_arp_timer (void)
 Periodic ARP processing function.

Variables

+uip_eth_addr uip_ethaddr
+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
void uip_arp_arpin void   ) 
+
+ + + + + +
+   + + +

+ARP processing for incoming ARP packets. +

+This function should be called by the device driver when an ARP packet has been received. The function will act differently depending on the ARP packet type: if it is a reply for a request that we previously sent out, the ARP cache will be filled in with the values from the ARP reply. If the incoming ARP packet is an ARP request for our IP address, an ARP reply packet is created and put into the uip_buf[] buffer.

+When the function returns, the value of the global variable uip_len indicates whether the device driver should send out a packet or not. If uip_len is zero, no packet should be sent. If uip_len is non-zero, it contains the length of the outbound packet that is present in the uip_buf[] buffer.

+This function expects an ARP packet with a prepended Ethernet header in the uip_buf[] buffer, and the length of the packet in the global variable uip_len.

Examples:
+example-mainloop-with-arp.c.
+

+Definition at line 278 of file uip_arp.c. +

+References uip_eth_addr::addr, ARP_REPLY, ARP_REQUEST, BUF, HTONS, uip_ethaddr, UIP_ETHTYPE_ARP, uip_hostaddr, uip_ipaddr_cmp, and uip_len.

+

+ + + + +
+ + + + + + + + + +
void uip_arp_out void   ) 
+
+ + + + + +
+   + + +

+Prepend Ethernet header to an outbound IP packet and see if we need to send out an ARP request. +

+This function should be called before sending out an IP packet. The function checks the destination IP address of the IP packet to see what Ethernet MAC address that should be used as a destination MAC address on the Ethernet.

+If the destination IP address is in the local network (determined by logical ANDing of netmask and our IP address), the function checks the ARP cache to see if an entry for the destination IP address is found. If so, an Ethernet header is prepended and the function returns. If no ARP cache entry is found for the destination IP address, the packet in the uip_buf[] is replaced by an ARP request packet for the IP address. The IP packet is dropped and it is assumed that they higher level protocols (e.g., TCP) eventually will retransmit the dropped packet.

+If the destination IP address is not on the local network, the IP address of the default router is used instead.

+When the function returns, a packet is present in the uip_buf[] buffer, and the length of the packet is in the global variable uip_len.

Examples:
+example-mainloop-with-arp.c.
+

+Definition at line 354 of file uip_arp.c. +

+References uip_eth_addr::addr, IPBUF, UIP_ARPTAB_SIZE, uip_draddr, uip_hostaddr, uip_ipaddr_cmp, uip_ipaddr_copy, and uip_ipaddr_maskcmp.

+

+ + + + +
+ + + + + + + + + +
void uip_arp_timer void   ) 
+
+ + + + + +
+   + + +

+Periodic ARP processing function. +

+This function performs periodic timer processing in the ARP module and should be called at regular intervals. The recommended interval is 10 seconds between the calls.

Examples:
+example-mainloop-with-arp.c.
+

+Definition at line 142 of file uip_arp.c. +

+References UIP_ARP_MAXAGE, and UIP_ARPTAB_SIZE.

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00153.html b/third_party/uip-1.0/doc/html/a00153.html new file mode 100644 index 0000000..089f5ec --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00153.html @@ -0,0 +1,1059 @@ + + +uIP 1.0: Configuration options for uIP + + + + + +

Configuration options for uIP


Detailed Description

+uIP is configured using the per-project configuration file uipopt.h. +

+This file contains all compile-time options for uIP and should be tweaked to match each specific project. The uIP distribution contains a documented example "uipopt.h" that can be copied and modified for each project.

+

Note:
Most of the configuration options in the uipopt.h should not be changed, but rather the per-project uip-conf.h file.
+ +

+ + + + + + + +

+

+ + + +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Files

file  uip-conf.h
 An example uIP configuration file.
file  uipopt.h
 Configuration options for uIP.

Project-specific configuration options

uIP has a number of configuration options that can be overridden for each project. These are kept in a project-specific uip-conf.h file and all configuration names have the prefix UIP_CONF.

+#define UIP_CONF_MAX_CONNECTIONS
 Maximum number of TCP connections.
+#define UIP_CONF_MAX_LISTENPORTS
 Maximum number of listening TCP ports.
+#define UIP_CONF_BUFFER_SIZE
 uIP buffer size.
+#define UIP_CONF_BYTE_ORDER
 CPU byte order.
+#define UIP_CONF_LOGGING
 Logging on or off.
+#define UIP_CONF_UDP
 UDP support on or off.
+#define UIP_CONF_UDP_CHECKSUMS
 UDP checksums on or off.
+#define UIP_CONF_STATISTICS
 uIP statistics on or off
typedef uint8_t u8_t
 8 bit datatype
typedef uint16_t u16_t
 16 bit datatype
typedef unsigned short uip_stats_t
 Statistics datatype.

Static configuration options

These configuration options can be used for setting the IP address settings statically, but only if UIP_FIXEDADDR is set to 1. The configuration options for a specific node includes IP address, netmask and default router as well as the Ethernet address. The netmask, default router and Ethernet address are appliciable only if uIP should be run over Ethernet.

+All of these should be changed to suit your project.

#define UIP_FIXEDADDR
 Determines if uIP should use a fixed IP address or not.
#define UIP_PINGADDRCONF
 Ping IP address asignment.
#define UIP_FIXEDETHADDR
 Specifies if the uIP ARP module should be compiled with a fixed Ethernet MAC address or not.

IP configuration options

#define UIP_TTL   64
 The IP TTL (time to live) of IP packets sent by uIP.
#define UIP_REASSEMBLY
 Turn on support for IP packet reassembly.
+#define UIP_REASS_MAXAGE   40
 The maximum time an IP fragment should wait in the reassembly buffer before it is dropped.

UDP configuration options

+#define UIP_UDP
 Toggles wether UDP support should be compiled in or not.
#define UIP_UDP_CHECKSUMS
 Toggles if UDP checksums should be used or not.
+#define UIP_UDP_CONNS
 The maximum amount of concurrent UDP connections.

TCP configuration options

#define UIP_ACTIVE_OPEN
 Determines if support for opening connections from uIP should be compiled in.
#define UIP_CONNS
 The maximum number of simultaneously open TCP connections.
#define UIP_LISTENPORTS
 The maximum number of simultaneously listening TCP ports.
#define UIP_URGDATA
 Determines if support for TCP urgent data notification should be compiled in.
#define UIP_RTO   3
 The initial retransmission timeout counted in timer pulses.
#define UIP_MAXRTX   8
 The maximum number of times a segment should be retransmitted before the connection should be aborted.
#define UIP_MAXSYNRTX   5
 The maximum number of times a SYN segment should be retransmitted before a connection request should be deemed to have been unsuccessful.
#define UIP_TCP_MSS   (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN)
 The TCP maximum segment size.
#define UIP_RECEIVE_WINDOW
 The size of the advertised receiver's window.
#define UIP_TIME_WAIT_TIMEOUT   120
 How long a connection should stay in the TIME_WAIT state.

ARP configuration options

#define UIP_ARPTAB_SIZE
 The size of the ARP table.
#define UIP_ARP_MAXAGE   120
 The maxium age of ARP table entries measured in 10ths of seconds.

General configuration options

#define UIP_BUFSIZE
 The size of the uIP packet buffer.
#define UIP_STATISTICS
 Determines if statistics support should be compiled in.
#define UIP_LOGGING
 Determines if logging of certain events should be compiled in.
#define UIP_BROADCAST
 Broadcast support.
#define UIP_LLH_LEN
 The link level header length.
void uip_log (char *msg)
 Print out a uIP log message.

CPU architecture configuration

The CPU architecture configuration is where the endianess of the CPU on which uIP is to be run is specified. Most CPUs today are little endian, and the most notable exception are the Motorolas which are big endian. The BYTE_ORDER macro should be changed to reflect the CPU architecture on which uIP is to be run.

#define UIP_BYTE_ORDER
 The byte order of the CPU architecture on which uIP is to be run.

Appication specific configurations

An uIP application is implemented using a single application function that is called by uIP whenever a TCP/IP event occurs. The name of this function must be registered with uIP at compile time using the UIP_APPCALL definition.

+uIP applications can store the application state within the uip_conn structure by specifying the type of the application structure by typedef:ing the type uip_tcp_appstate_t and uip_udp_appstate_t.

+The file containing the definitions must be included in the uipopt.h file.

+The following example illustrates how this can look.

void httpd_appcall(void);
+#define UIP_APPCALL     httpd_appcall
+
+struct httpd_state {
+  u8_t state;
+  u16_t count;
+  char *dataptr;
+  char *script;
+};
+typedef struct httpd_state uip_tcp_appstate_t
+


+#define UIP_APPCALL   smtp_appcall
 The name of the application function that uIP should call in response to TCP/IP events.
typedef smtp_state uip_tcp_appstate_t
 The type of the application state that is to be stored in the uip_conn structure.
typedef int uip_udp_appstate_t
 The type of the application state that is to be stored in the uip_conn structure.

Defines

+#define UIP_LITTLE_ENDIAN   3412
+#define UIP_BIG_ENDIAN   1234
+


Define Documentation

+

+ + + + +
+ + + + +
#define UIP_ACTIVE_OPEN
+
+ + + + + +
+   + + +

+Determines if support for opening connections from uIP should be compiled in. +

+If the applications that are running on top of uIP for this project do not need to open outgoing TCP connections, this configration option can be turned off to reduce the code size of uIP. +

+Definition at line 233 of file uipopt.h.

+

+ + + + +
+ + + + +
#define UIP_ARP_MAXAGE   120
+
+ + + + + +
+   + + +

+The maxium age of ARP table entries measured in 10ths of seconds. +

+An UIP_ARP_MAXAGE of 120 corresponds to 20 minutes (BSD default). +

+Definition at line 358 of file uipopt.h. +

+Referenced by uip_arp_timer().

+

+ + + + +
+ + + + +
#define UIP_ARPTAB_SIZE
+
+ + + + + +
+   + + +

+The size of the ARP table. +

+This option should be set to a larger value if this uIP node will have many connections from the local network. +

+Definition at line 349 of file uipopt.h. +

+Referenced by uip_arp_init(), uip_arp_out(), and uip_arp_timer().

+

+ + + + +
+ + + + +
#define UIP_BROADCAST
+
+ + + + + +
+   + + +

+Broadcast support. +

+This flag configures IP broadcast support. This is useful only together with UDP. +

+Definition at line 423 of file uipopt.h.

+

+ + + + +
+ + + + +
#define UIP_BUFSIZE
+
+ + + + + +
+   + + +

+The size of the uIP packet buffer. +

+The uIP packet buffer should not be smaller than 60 bytes, and does not need to be larger than 1500 bytes. Lower size results in lower TCP throughput, larger size results in higher TCP throughput. +

+Definition at line 379 of file uipopt.h. +

+Referenced by uip_split_output().

+

+ + + + +
+ + + + +
#define UIP_BYTE_ORDER
+
+ + + + + +
+   + + +

+The byte order of the CPU architecture on which uIP is to be run. +

+This option can be either BIG_ENDIAN (Motorola byte order) or LITTLE_ENDIAN (Intel byte order). +

+Definition at line 475 of file uipopt.h.

+

+ + + + +
+ + + + +
#define UIP_CONNS
+
+ + + + + +
+   + + +

+The maximum number of simultaneously open TCP connections. +

+Since the TCP connections are statically allocated, turning this configuration knob down results in less RAM used. Each TCP connection requires approximatly 30 bytes of memory.

Examples:
+example-mainloop-with-arp.c, and example-mainloop-without-arp.c.
+

+Definition at line 245 of file uipopt.h. +

+Referenced by uip_connect().

+

+ + + + +
+ + + + +
#define UIP_FIXEDADDR
+
+ + + + + +
+   + + +

+Determines if uIP should use a fixed IP address or not. +

+If uIP should use a fixed IP address, the settings are set in the uipopt.h file. If not, the macros uip_sethostaddr(), uip_setdraddr() and uip_setnetmask() should be used instead. +

+Definition at line 97 of file uipopt.h.

+

+ + + + +
+ + + + +
#define UIP_FIXEDETHADDR
+
+ + + + + +
+   + + +

+Specifies if the uIP ARP module should be compiled with a fixed Ethernet MAC address or not. +

+If this configuration option is 0, the macro uip_setethaddr() can be used to specify the Ethernet address at run-time. +

+Definition at line 127 of file uipopt.h.

+

+ + + + +
+ + + + +
#define UIP_LISTENPORTS
+
+ + + + + +
+   + + +

+The maximum number of simultaneously listening TCP ports. +

+Each listening TCP port requires 2 bytes of memory. +

+Definition at line 259 of file uipopt.h. +

+Referenced by uip_init(), uip_listen(), and uip_unlisten().

+

+ + + + +
+ + + + +
#define UIP_LLH_LEN
+
+ + + + + +
+   + + +

+The link level header length. +

+This is the offset into the uip_buf where the IP header can be found. For Ethernet, this should be set to 14. For SLIP, this should be set to 0. +

+Definition at line 448 of file uipopt.h. +

+Referenced by uip_ipchksum(), uip_process(), and uip_split_output().

+

+ + + + +
+ + + + +
#define UIP_LOGGING
+
+ + + + + +
+   + + +

+Determines if logging of certain events should be compiled in. +

+This is useful mostly for debugging. The function uip_log() must be implemented to suit the architecture of the project, if logging is turned on. +

+Definition at line 408 of file uipopt.h.

+

+ + + + +
+ + + + +
#define UIP_MAXRTX   8
+
+ + + + + +
+   + + +

+The maximum number of times a segment should be retransmitted before the connection should be aborted. +

+This should not be changed. +

+Definition at line 288 of file uipopt.h. +

+Referenced by uip_process().

+

+ + + + +
+ + + + +
#define UIP_MAXSYNRTX   5
+
+ + + + + +
+   + + +

+The maximum number of times a SYN segment should be retransmitted before a connection request should be deemed to have been unsuccessful. +

+This should not need to be changed. +

+Definition at line 297 of file uipopt.h. +

+Referenced by uip_process().

+

+ + + + +
+ + + + +
#define UIP_PINGADDRCONF
+
+ + + + + +
+   + + +

+Ping IP address asignment. +

+uIP uses a "ping" packets for setting its own IP address if this option is set. If so, uIP will start with an empty IP address and the destination IP address of the first incoming "ping" (ICMP echo) packet will be used for setting the hosts IP address.

+

Note:
This works only if UIP_FIXEDADDR is 0.
+ +

+Definition at line 114 of file uipopt.h.

+

+ + + + +
+ + + + +
#define UIP_REASSEMBLY
+
+ + + + + +
+   + + +

+Turn on support for IP packet reassembly. +

+uIP supports reassembly of fragmented IP packets. This features requires an additonal amount of RAM to hold the reassembly buffer and the reassembly code size is approximately 700 bytes. The reassembly buffer is of the same size as the uip_buf buffer (configured by UIP_BUFSIZE).

+

Note:
IP packet reassembly is not heavily tested.
+ +

+Definition at line 156 of file uipopt.h.

+

+ + + + +
+ + + + +
#define UIP_RECEIVE_WINDOW
+
+ + + + + +
+   + + +

+The size of the advertised receiver's window. +

+Should be set low (i.e., to the size of the uip_buf buffer) is the application is slow to process incoming data, or high (32768 bytes) if the application processes data quickly. +

+Definition at line 317 of file uipopt.h.

+

+ + + + +
+ + + + +
#define UIP_RTO   3
+
+ + + + + +
+   + + +

+The initial retransmission timeout counted in timer pulses. +

+This should not be changed. +

+Definition at line 280 of file uipopt.h. +

+Referenced by uip_process().

+

+ + + + +
+ + + + +
#define UIP_STATISTICS
+
+ + + + + +
+   + + +

+Determines if statistics support should be compiled in. +

+The statistics is useful for debugging and to show the user. +

+Definition at line 393 of file uipopt.h.

+

+ + + + +
+ + + + +
#define UIP_TCP_MSS   (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN)
+
+ + + + + +
+   + + +

+The TCP maximum segment size. +

+This is should not be to set to more than UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN. +

+Definition at line 305 of file uipopt.h.

+

+ + + + +
+ + + + +
#define UIP_TIME_WAIT_TIMEOUT   120
+
+ + + + + +
+   + + +

+How long a connection should stay in the TIME_WAIT state. +

+This configiration option has no real implication, and it should be left untouched. +

+Definition at line 328 of file uipopt.h. +

+Referenced by uip_process().

+

+ + + + +
+ + + + +
#define UIP_TTL   64
+
+ + + + + +
+   + + +

+The IP TTL (time to live) of IP packets sent by uIP. +

+This should normally not be changed. +

+Definition at line 141 of file uipopt.h.

+

+ + + + +
+ + + + +
#define UIP_UDP_CHECKSUMS
+
+ + + + + +
+   + + +

+Toggles if UDP checksums should be used or not. +

+

Note:
Support for UDP checksums is currently not included in uIP, so this option has no function.
+ +

+Definition at line 195 of file uipopt.h.

+

+ + + + +
+ + + + +
#define UIP_URGDATA
+
+ + + + + +
+   + + +

+Determines if support for TCP urgent data notification should be compiled in. +

+Urgent data (out-of-band data) is a rarely used TCP feature that very seldom would be required. +

+Definition at line 273 of file uipopt.h.

+


Typedef Documentation

+

+ + + + +
+ + + + +
typedef uint16_t u16_t
+
+ + + + + +
+   + + +

+16 bit datatype +

+This typedef defines the 16-bit type used throughout uIP.

Examples:
+dhcpc.c, dhcpc.h, resolv.c, resolv.h, smtp.c, smtp.h, telnetd.c, and uip-conf.h.
+

+Definition at line 76 of file uip-conf.h.

+

+ + + + +
+ + + + +
typedef uint8_t u8_t
+
+ + + + + +
+   + + +

+8 bit datatype +

+This typedef defines the 8-bit type used throughout uIP.

Examples:
+dhcpc.c, dhcpc.h, resolv.c, smtp.h, telnetd.c, telnetd.h, and uip-conf.h.
+

+Definition at line 67 of file uip-conf.h.

+

+ + + + +
+ + + + +
typedef unsigned short uip_stats_t
+
+ + + + + +
+   + + +

+Statistics datatype. +

+This typedef defines the dataype used for keeping statistics in uIP. +

+Definition at line 86 of file uip-conf.h.

+

+ + + + +
+ + + + +
typedef uip_tcp_appstate_t
+
+ + + + + +
+   + + +

+The type of the application state that is to be stored in the uip_conn structure. +

+This usually is typedef:ed to a struct holding application state information.

Examples:
+smtp.h, telnetd.h, and webclient.h.
+

+Definition at line 98 of file smtp.h.

+

+ + + + +
+ + + + +
typedef uip_udp_appstate_t
+
+ + + + + +
+   + + +

+The type of the application state that is to be stored in the uip_conn structure. +

+This usually is typedef:ed to a struct holding application state information.

Examples:
+dhcpc.h.
+

+Definition at line 47 of file resolv.h.

+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
void uip_log char *  msg  ) 
+
+ + + + + +
+   + + +

+Print out a uIP log message. +

+This function must be implemented by the module that uses uIP, and is called by uIP whenever a log message is generated.

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00154.html b/third_party/uip-1.0/doc/html/a00154.html new file mode 100644 index 0000000..3f54291 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00154.html @@ -0,0 +1,79 @@ + + +uIP 1.0: uIP TCP throughput booster hack + + + + + +

uIP TCP throughput booster hack
+ +[The uIP TCP/IP stack] +


Detailed Description

+The basic uIP TCP implementation only allows each TCP connection to have a single TCP segment in flight at any given time. +

+Because of the delayed ACK algorithm employed by most TCP receivers, uIP's limit on the amount of in-flight TCP segments seriously reduces the maximum achievable throughput for sending data from uIP.

+The uip-split module is a hack which tries to remedy this situation. By splitting maximum sized outgoing TCP segments into two, the delayed ACK algorithm is not invoked at TCP receivers. This improves the throughput when sending data from uIP by orders of magnitude.

+The uip-split module uses the uip-fw module (uIP IP packet forwarding) for sending packets. Therefore, the uip-fw module must be set up with the appropriate network interfaces for this module to work. +

+ + + + + + + +

+

+ + + +

Files

file  uip-split.h
 Module for splitting outbound TCP segments in two to avoid the delayed ACK throughput degradation.

Functions

void uip_split_output (void)
 Handle outgoing packets.
+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
void uip_split_output void   ) 
+
+ + + + + +
+   + + +

+Handle outgoing packets. +

+This function inspects an outgoing packet in the uip_buf buffer and sends it out using the uip_fw_output() function. If the packet is a full-sized TCP segment it will be split into two segments and transmitted separately. This function should be called instead of the actual device driver output function, or the uip_fw_output() function.

+The headers of the outgoing packet is assumed to be in the uip_buf buffer and the payload is assumed to be wherever uip_appdata points. The length of the outgoing packet is assumed to be in the uip_len variable. +

+Definition at line 49 of file uip-split.c. +

+References BUF, uip_acc32, uip_add32(), uip_appdata, UIP_BUFSIZE, uip_ipchksum(), UIP_IPH_LEN, uip_len, UIP_LLH_LEN, UIP_PROTO_TCP, uip_tcpchksum(), and UIP_TCPIP_HLEN.

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00155.html b/third_party/uip-1.0/doc/html/a00155.html new file mode 100644 index 0000000..cd75873 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00155.html @@ -0,0 +1,82 @@ + + +uIP 1.0: Local continuations + + + + + +

Local continuations
+ +[Protothreads] +


Detailed Description

+Local continuations form the basis for implementing protothreads. +

+A local continuation can be set in a specific function to capture the state of the function. After a local continuation has been set can be resumed in order to restore the state of the function at the point where the local continuation was set. +

+ + + + + + + +

+

+ + + +

+

+ + + +

+

+ + + + + + + + + + + + + + + + + + + + + + + +

Files

file  lc.h
 Local continuations.
file  lc-switch.h
 Implementation of local continuations based on switch() statment.
file  lc-addrlabels.h
 Implementation of local continuations based on the "Labels as values" feature of gcc.

Defines

+#define __LC_SWTICH_H__
+#define LC_INIT(s)   s = 0;
+#define LC_RESUME(s)   switch(s) { case 0:
+#define LC_SET(s)   s = __LINE__; case __LINE__:
+#define LC_END(s)   }
+#define LC_INIT(s)   s = NULL
+#define LC_RESUME(s)
+#define LC_SET(s)   do { ({ __label__ resume; resume: (s) = &&resume; }); }while(0)
+#define LC_END(s)

Typedefs

+typedef unsigned short lc_t
+typedef void * lc_t
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00156.html b/third_party/uip-1.0/doc/html/a00156.html new file mode 100644 index 0000000..2eaafce --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00156.html @@ -0,0 +1,237 @@ + + +uIP 1.0: Timer library + + + + + +

Timer library


Detailed Description

+The timer library provides functions for setting, resetting and restarting timers, and for checking if a timer has expired. +

+An application must "manually" check if its timers have expired; this is not done automatically.

+A timer is declared as a struct timer and all access to the timer is made by a pointer to the declared timer.

+

Note:
The timer library uses the Clock library to measure time. Intervals should be specified in the format used by the clock library.
+ +

+ + + + + + + +

+

+ + + +

+

+ + + + + + + + + + + + + + + + +

Files

file  timer.h
 Timer library header file.
file  timer.c
 Timer library implementation.

Data Structures

struct  timer
 A timer. More...

Functions

void timer_set (struct timer *t, clock_time_t interval)
 Set a timer.
void timer_reset (struct timer *t)
 Reset the timer with the same interval.
void timer_restart (struct timer *t)
 Restart the timer from the current point in time.
int timer_expired (struct timer *t)
 Check if a timer has expired.
+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
int timer_expired struct timer t  ) 
+
+ + + + + +
+   + + +

+Check if a timer has expired. +

+This function tests if a timer has expired and returns true or false depending on its status.

+

Parameters:
+ + +
t A pointer to the timer
+
+
Returns:
Non-zero if the timer has expired, zero otherwise.
+
Examples:
+dhcpc.c, example-mainloop-with-arp.c, and example-mainloop-without-arp.c.
+

+Definition at line 121 of file timer.c. +

+References clock_time(), interval, and start.

+

+ + + + +
+ + + + + + + + + +
void timer_reset struct timer t  ) 
+
+ + + + + +
+   + + +

+Reset the timer with the same interval. +

+This function resets the timer with the same interval that was given to the timer_set() function. The start point of the interval is the exact time that the timer last expired. Therefore, this function will cause the timer to be stable over time, unlike the timer_rester() function.

+

Parameters:
+ + +
t A pointer to the timer.
+
+
See also:
timer_restart()
+
Examples:
+example-mainloop-with-arp.c, and example-mainloop-without-arp.c.
+

+Definition at line 84 of file timer.c. +

+References interval, and start.

+

+ + + + +
+ + + + + + + + + +
void timer_restart struct timer t  ) 
+
+ + + + + +
+   + + +

+Restart the timer from the current point in time. +

+This function restarts a timer with the same interval that was given to the timer_set() function. The timer will start at the current time.

+

Note:
A periodic timer will drift if this function is used to reset it. For preioric timers, use the timer_reset() function instead.
+
Parameters:
+ + +
t A pointer to the timer.
+
+
See also:
timer_reset()
+ +

+Definition at line 104 of file timer.c. +

+References clock_time(), and start.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
void timer_set struct timer t,
clock_time_t  interval
+
+ + + + + +
+   + + +

+Set a timer. +

+This function is used to set a timer for a time sometime in the future. The function timer_expired() will evaluate to true after the timer has expired.

+

Parameters:
+ + + +
t A pointer to the timer
interval The interval before the timer expires.
+
+
Examples:
+dhcpc.c, example-mainloop-with-arp.c, and example-mainloop-without-arp.c.
+

+Definition at line 64 of file timer.c. +

+References clock_time(), interval, and start.

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00157.html b/third_party/uip-1.0/doc/html/a00157.html new file mode 100644 index 0000000..ec1fb7c --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00157.html @@ -0,0 +1,108 @@ + + +uIP 1.0: Clock interface + + + + + +

Clock interface


Detailed Description

+The clock interface is the interface between the timer library and the platform specific clock functionality. +

+The clock interface must be implemented for each platform that uses the timer library.

+The clock interface does only one this: it measures time. The clock interface provides a macro, CLOCK_SECOND, which corresponds to one second of system time.

+

See also:
Timer library
+ +

+ + + + + + + + + + + + + +

Defines

+#define CLOCK_SECOND
 A second, measured in system clock time.

Functions

void clock_init (void)
 Initialize the clock library.
clock_time_t clock_time (void)
 Get the current clock time.
+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
void clock_init void   ) 
+
+ + + + + +
+   + + +

+Initialize the clock library. +

+This function initializes the clock library and should be called from the main() function of the system.

+

+ + + + +
+ + + + + + + + + +
clock_time_t clock_time void   ) 
+
+ + + + + +
+   + + +

+Get the current clock time. +

+This function returns the current system clock time.

+

Returns:
The current clock time, measured in system ticks.
+ +

+Referenced by timer_expired(), timer_restart(), and timer_set().

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00158.html b/third_party/uip-1.0/doc/html/a00158.html new file mode 100644 index 0000000..9b415f2 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00158.html @@ -0,0 +1,693 @@ + + +uIP 1.0: Protosockets library + + + + + +

Protosockets library


Detailed Description

+The protosocket library provides an interface to the uIP stack that is similar to the traditional BSD socket interface. +

+Unlike programs written for the ordinary uIP event-driven interface, programs written with the protosocket library are executed in a sequential fashion and does not have to be implemented as explicit state machines.

+Protosockets only work with TCP connections.

+The protosocket library uses Protothreads protothreads to provide sequential control flow. This makes the protosockets lightweight in terms of memory, but also means that protosockets inherits the functional limitations of protothreads. Each protosocket lives only within a single function. Automatic variables (stack variables) are not retained across a protosocket library function call.

+

Note:
Because the protosocket library uses protothreads, local variables will not always be saved across a call to a protosocket library function. It is therefore advised that local variables are used with extreme care.
+The protosocket library provides functions for sending data without having to deal with retransmissions and acknowledgements, as well as functions for reading data without having to deal with data being split across more than one TCP segment.

+Because each protosocket runs as a protothread, the protosocket has to be started with a call to PSOCK_BEGIN() at the start of the function in which the protosocket is used. Similarly, the protosocket protothread can be terminated by a call to PSOCK_EXIT(). +

+ + + + + + + +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Files

file  psock.h
 Protosocket library header file.

Data Structures

struct  psock_buf
struct  psock
 The representation of a protosocket. More...

Defines

#define PSOCK_INIT(psock, buffer, buffersize)
 Initialize a protosocket.
#define PSOCK_BEGIN(psock)
 Start the protosocket protothread in a function.
#define PSOCK_SEND(psock, data, datalen)
 Send data.
#define PSOCK_SEND_STR(psock, str)
 Send a null-terminated string.
#define PSOCK_GENERATOR_SEND(psock, generator, arg)
 Generate data with a function and send it.
#define PSOCK_CLOSE(psock)
 Close a protosocket.
#define PSOCK_READBUF(psock)
 Read data until the buffer is full.
#define PSOCK_READTO(psock, c)
 Read data up to a specified character.
#define PSOCK_DATALEN(psock)
 The length of the data that was previously read.
#define PSOCK_EXIT(psock)
 Exit the protosocket's protothread.
#define PSOCK_CLOSE_EXIT(psock)
 Close a protosocket and exit the protosocket's protothread.
#define PSOCK_END(psock)
 Declare the end of a protosocket's protothread.
#define PSOCK_NEWDATA(psock)
 Check if new data has arrived on a protosocket.
#define PSOCK_WAIT_UNTIL(psock, condition)
 Wait until a condition is true.
+#define PSOCK_WAIT_THREAD(psock, condition)   PT_WAIT_THREAD(&((psock)->pt), (condition))

Functions

+u16_t psock_datalen (struct psock *psock)
+char psock_newdata (struct psock *s)
+


Define Documentation

+

+ + + + +
+ + + + + + + + + +
#define PSOCK_BEGIN psock   ) 
+
+ + + + + +
+   + + +

+Start the protosocket protothread in a function. +

+This macro starts the protothread associated with the protosocket and must come before other protosocket calls in the function it is used.

+

Parameters:
+ + +
psock (struct psock *) A pointer to the protosocket to be started.
+
+
Examples:
+hello-world.c, and smtp.c.
+

+Definition at line 158 of file psock.h.

+

+ + + + +
+ + + + + + + + + +
#define PSOCK_CLOSE psock   ) 
+
+ + + + + +
+   + + +

+Close a protosocket. +

+This macro closes a protosocket and can only be called from within the protothread in which the protosocket lives.

+

Parameters:
+ + +
psock (struct psock *) A pointer to the protosocket that is to be closed.
+
+
Examples:
+hello-world.c, and smtp.c.
+

+Definition at line 235 of file psock.h.

+

+ + + + +
+ + + + + + + + + +
#define PSOCK_CLOSE_EXIT psock   ) 
+
+ + + + + +
+   + + +

+Close a protosocket and exit the protosocket's protothread. +

+This macro closes a protosocket and exits the protosocket's protothread.

+

Parameters:
+ + +
psock (struct psock *) A pointer to the protosocket.
+
+ +

+Definition at line 308 of file psock.h.

+

+ + + + +
+ + + + + + + + + +
#define PSOCK_DATALEN psock   ) 
+
+ + + + + +
+   + + +

+The length of the data that was previously read. +

+This macro returns the length of the data that was previously read using PSOCK_READTO() or PSOCK_READ().

+

Parameters:
+ + +
psock (struct psock *) A pointer to the protosocket holding the data.
+
+ +

+Definition at line 281 of file psock.h.

+

+ + + + +
+ + + + + + + + + +
#define PSOCK_END psock   ) 
+
+ + + + + +
+   + + +

+Declare the end of a protosocket's protothread. +

+This macro is used for declaring that the protosocket's protothread ends. It must always be used together with a matching PSOCK_BEGIN() macro.

+

Parameters:
+ + +
psock (struct psock *) A pointer to the protosocket.
+
+
Examples:
+hello-world.c, and smtp.c.
+

+Definition at line 325 of file psock.h.

+

+ + + + +
+ + + + + + + + + +
#define PSOCK_EXIT psock   ) 
+
+ + + + + +
+   + + +

+Exit the protosocket's protothread. +

+This macro terminates the protothread of the protosocket and should almost always be used in conjunction with PSOCK_CLOSE().

+

See also:
PSOCK_CLOSE_EXIT()
+
Parameters:
+ + +
psock (struct psock *) A pointer to the protosocket.
+
+
Examples:
+smtp.c.
+

+Definition at line 297 of file psock.h.

+

+ + + + +
+ + + + + + + + + + + + + + + +
#define PSOCK_GENERATOR_SEND psock,
generator,
arg   ) 
+
+ + + + + +
+   + + +

+Generate data with a function and send it. +

+

Parameters:
+ + + + +
psock Pointer to the protosocket.
generator Pointer to the generator function
arg Argument to the generator function
+
+This function generates data and sends it over the protosocket. This can be used to dynamically generate data for a transmission, instead of generating the data in a buffer beforehand. This function reduces the need for buffer memory. The generator function is implemented by the application, and a pointer to the function is given as an argument with the call to PSOCK_GENERATOR_SEND().

+The generator function should place the generated data directly in the uip_appdata buffer, and return the length of the generated data. The generator function is called by the protosocket layer when the data first is sent, and once for every retransmission that is needed. +

+Definition at line 219 of file psock.h.

+

+ + + + +
+ + + + + + + + + + + + + + + +
#define PSOCK_INIT psock,
buffer,
buffersize   ) 
+
+ + + + + +
+   + + +

+Initialize a protosocket. +

+This macro initializes a protosocket and must be called before the protosocket is used. The initialization also specifies the input buffer for the protosocket.

+

Parameters:
+ + + + +
psock (struct psock *) A pointer to the protosocket to be initialized
buffer (char *) A pointer to the input buffer for the protosocket.
buffersize (unsigned int) The size of the input buffer.
+
+
Examples:
+hello-world.c, and smtp.c.
+

+Definition at line 144 of file psock.h. +

+Referenced by hello_world_appcall(), httpd_appcall(), and smtp_send().

+

+ + + + +
+ + + + + + + + + +
#define PSOCK_NEWDATA psock   ) 
+
+ + + + + +
+   + + +

+Check if new data has arrived on a protosocket. +

+This macro is used in conjunction with the PSOCK_WAIT_UNTIL() macro to check if data has arrived on a protosocket.

+

Parameters:
+ + +
psock (struct psock *) A pointer to the protosocket.
+
+ +

+Definition at line 339 of file psock.h.

+

+ + + + +
+ + + + + + + + + +
#define PSOCK_READBUF psock   ) 
+
+ + + + + +
+   + + +

+Read data until the buffer is full. +

+This macro will block waiting for data and read the data into the input buffer specified with the call to PSOCK_INIT(). Data is read until the buffer is full..

+

Parameters:
+ + +
psock (struct psock *) A pointer to the protosocket from which data should be read.
+
+ +

+Definition at line 250 of file psock.h.

+

+ + + + +
+ + + + + + + + + + + + +
#define PSOCK_READTO psock,
 ) 
+
+ + + + + +
+   + + +

+Read data up to a specified character. +

+This macro will block waiting for data and read the data into the input buffer specified with the call to PSOCK_INIT(). Data is only read until the specifieed character appears in the data stream.

+

Parameters:
+ + + +
psock (struct psock *) A pointer to the protosocket from which data should be read.
c (char) The character at which to stop reading.
+
+
Examples:
+hello-world.c, and smtp.c.
+

+Definition at line 268 of file psock.h.

+

+ + + + +
+ + + + + + + + + + + + + + + +
#define PSOCK_SEND psock,
data,
datalen   ) 
+
+ + + + + +
+   + + +

+Send data. +

+This macro sends data over a protosocket. The protosocket protothread blocks until all data has been sent and is known to have been received by the remote end of the TCP connection.

+

Parameters:
+ + + + +
psock (struct psock *) A pointer to the protosocket over which data is to be sent.
data (char *) A pointer to the data that is to be sent.
datalen (unsigned int) The length of the data that is to be sent.
+
+
Examples:
+smtp.c.
+

+Definition at line 178 of file psock.h.

+

+ + + + +
+ + + + + + + + + + + + +
#define PSOCK_SEND_STR psock,
str   ) 
+
+ + + + + +
+   + + +

+Send a null-terminated string. +

+

Parameters:
+ + + +
psock Pointer to the protosocket.
str The string to be sent.
+
+This function sends a null-terminated string over the protosocket.
Examples:
+hello-world.c, and smtp.c.
+

+Definition at line 191 of file psock.h.

+

+ + + + +
+ + + + + + + + + + + + +
#define PSOCK_WAIT_UNTIL psock,
condition   ) 
+
+ + + + + +
+   + + +

+Wait until a condition is true. +

+This macro blocks the protothread until the specified condition is true. The macro PSOCK_NEWDATA() can be used to check if new data arrives when the protosocket is waiting.

+Typically, this macro is used as follows:

+

 PT_THREAD(thread(struct psock *s, struct timer *t))
+ {
+   PSOCK_BEGIN(s);
+
+   PSOCK_WAIT_UNTIL(s, PSOCK_NEWADATA(s) || timer_expired(t));
+   
+   if(PSOCK_NEWDATA(s)) {
+     PSOCK_READTO(s, '\n');
+   } else {
+     handle_timed_out(s);
+   }
+   
+   PSOCK_END(s);
+ }
+

+

Parameters:
+ + + +
psock (struct psock *) A pointer to the protosocket.
condition The condition to wait for.
+
+ +

+Definition at line 372 of file psock.h.

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00159.html b/third_party/uip-1.0/doc/html/a00159.html new file mode 100644 index 0000000..d91b51f --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00159.html @@ -0,0 +1,251 @@ + + +uIP 1.0: Memory block management functions + + + + + +

Memory block management functions


Detailed Description

+The memory block allocation routines provide a simple yet powerful set of functions for managing a set of memory blocks of fixed size. +

+A set of memory blocks is statically declared with the MEMB() macro. Memory blocks are allocated from the declared memory by the memb_alloc() function, and are deallocated with the memb_free() function.

+

Note:
Because of namespace clashes only one MEMB() can be declared per C module, and the name scope of a MEMB() memory block is local to each C module.
+The following example shows how to declare and use a memory block called "cmem" which has 8 chunks of memory with each memory chunk being 20 bytes large. +

+ + + + + + + +

+

+ + + +

+

+ + + + + + + + + + + + + + + + + + + + +

Files

file  memb.c
 Memory block allocation routines.
file  memb.h
 Memory block allocation routines.

Data Structures

struct  memb_blocks

Defines

+#define MEMB_CONCAT2(s1, s2)   s1##s2
+#define MEMB_CONCAT(s1, s2)   MEMB_CONCAT2(s1, s2)
#define MEMB(name, structure, num)
 Declare a memory block.

Functions

void memb_init (struct memb_blocks *m)
 Initialize a memory block that was declared with MEMB().
void * memb_alloc (struct memb_blocks *m)
 Allocate a memory block from a block of memory declared with MEMB().
char memb_free (struct memb_blocks *m, void *ptr)
 Deallocate a memory block from a memory block previously declared with MEMB().
+


Define Documentation

+

+ + + + +
+ + + + + + + + + + + + + + + +
#define MEMB name,
structure,
num   ) 
+
+ + + + + +
+   + + +

+Value:

static char MEMB_CONCAT(name,_memb_count)[num]; \
+        static structure MEMB_CONCAT(name,_memb_mem)[num]; \
+        static struct memb_blocks name = {sizeof(structure), num, \
+                                          MEMB_CONCAT(name,_memb_count), \
+                                          (void *)MEMB_CONCAT(name,_memb_mem)}
+
Declare a memory block. +

+This macro is used to staticall declare a block of memory that can be used by the block allocation functions. The macro statically declares a C array with a size that matches the specified number of blocks and their individual sizes.

+Example:

MEMB(connections, sizeof(struct connection), 16);
+

+

Parameters:
+ + + + +
name The name of the memory block (later used with memb_init(), memb_alloc() and memb_free()).
size The size of each memory chunk, in bytes.
num The total number of memory chunks in the block.
+
+
Examples:
+telnetd.c.
+

+Definition at line 98 of file memb.h.

+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
void * memb_alloc struct memb_blocks m  ) 
+
+ + + + + +
+   + + +

+Allocate a memory block from a block of memory declared with MEMB(). +

+

Parameters:
+ + +
m A memory block previosly declared with MEMB().
+
+
Examples:
+telnetd.c.
+

+Definition at line 59 of file memb.c. +

+References memb_blocks::count, memb_blocks::mem, memb_blocks::num, and memb_blocks::size.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
char memb_free struct memb_blocks m,
void *  ptr
+
+ + + + + +
+   + + +

+Deallocate a memory block from a memory block previously declared with MEMB(). +

+

Parameters:
+ + + +
m m A memory block previosly declared with MEMB().
ptr A pointer to the memory block that is to be deallocated.
+
+
Returns:
The new reference count for the memory block (should be 0 if successfully deallocated) or -1 if the pointer "ptr" did not point to a legal memory block.
+
Examples:
+telnetd.c.
+

+Definition at line 79 of file memb.c. +

+References memb_blocks::count, memb_blocks::mem, and memb_blocks::size.

+

+ + + + +
+ + + + + + + + + +
void memb_init struct memb_blocks m  ) 
+
+ + + + + +
+   + + +

+Initialize a memory block that was declared with MEMB(). +

+

Parameters:
+ + +
m A memory block previosly declared with MEMB().
+
+
Examples:
+telnetd.c.
+

+Definition at line 52 of file memb.c. +

+References memb_blocks::count, memb_blocks::mem, memb_blocks::num, and memb_blocks::size.

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00160.html b/third_party/uip-1.0/doc/html/a00160.html new file mode 100644 index 0000000..1ac8e26 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00160.html @@ -0,0 +1,284 @@ + + +uIP 1.0: DNS resolver + + + + + +

DNS resolver
+ +[Applications] +


Detailed Description

+The uIP DNS resolver functions are used to lookup a hostname and map it to a numerical IP address. +

+It maintains a list of resolved hostnames that can be queried with the resolv_lookup() function. New hostnames can be resolved using the resolv_query() function.

+When a hostname has been resolved (or found to be non-existant), the resolver code calls a callback function called resolv_found() that must be implemented by the module that uses the resolver. +

+ + + + + + + +

+

+ + + +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Files

file  resolv.h
 DNS resolver code header file.
file  resolv.c
 DNS host name to IP address resolver.

Defines

+#define UIP_UDP_APPCALL   resolv_appcall
+#define NULL   (void *)0
+#define MAX_RETRIES   8
+#define RESOLV_ENTRIES   4

Functions

+void resolv_appcall (void)
void resolv_found (char *name, u16_t *ipaddr)
 Callback function which is called when a hostname is found.
void resolv_conf (u16_t *dnsserver)
 Configure which DNS server to use for queries.
u16_tresolv_getserver (void)
 Obtain the currently configured DNS server.
+void resolv_init (void)
 Initalize the resolver.
u16_tresolv_lookup (char *name)
 Look up a hostname in the array of known hostnames.
void resolv_query (char *name)
 Queues a name so that a question for the name will be sent out.
+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
void resolv_conf u16_t dnsserver  ) 
+
+ + + + + +
+   + + +

+Configure which DNS server to use for queries. +

+

Parameters:
+ + +
dnsserver A pointer to a 4-byte representation of the IP address of the DNS server to be configured.
+
+
Examples:
+resolv.c, and resolv.h.
+

+Definition at line 438 of file resolv.c. +

+References HTONS, NULL, uip_udp_new(), and uip_udp_remove.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
void resolv_found char *  name,
u16_t ipaddr
+
+ + + + + +
+   + + +

+Callback function which is called when a hostname is found. +

+This function must be implemented by the module that uses the DNS resolver. It is called when a hostname is found, or when a hostname was not found.

+

Parameters:
+ + + +
name A pointer to the name that was looked up.
ipaddr A pointer to a 4-byte array containing the IP address of the hostname, or NULL if the hostname could not be found.
+
+
Examples:
+resolv.c, and resolv.h.
+

+ + + + +
+ + + + + + + + + +
u16_t * resolv_getserver void   ) 
+
+ + + + + +
+   + + +

+Obtain the currently configured DNS server. +

+

Returns:
A pointer to a 4-byte representation of the IP address of the currently configured DNS server or NULL if no DNS server has been configured.
+
Examples:
+resolv.c, and resolv.h.
+

+Definition at line 422 of file resolv.c. +

+References NULL, and uip_udp_conn::ripaddr.

+

+ + + + +
+ + + + + + + + + +
u16_t * resolv_lookup char *  name  ) 
+
+ + + + + +
+   + + +

+Look up a hostname in the array of known hostnames. +

+

Note:
This function only looks in the internal array of known hostnames, it does not send out a query for the hostname if none was found. The function resolv_query() can be used to send a query for a hostname.
+
Returns:
A pointer to a 4-byte representation of the hostname's IP address, or NULL if the hostname was not found in the array of hostnames.
+
Examples:
+resolv.c, resolv.h, and webclient.c.
+

+Definition at line 396 of file resolv.c. +

+References RESOLV_ENTRIES, and STATE_DONE. +

+Referenced by webclient_appcall(), and webclient_get().

+

+ + + + +
+ + + + + + + + + +
void resolv_query char *  name  ) 
+
+ + + + + +
+   + + +

+Queues a name so that a question for the name will be sent out. +

+

Parameters:
+ + +
name The hostname that is to be queried.
+
+
Examples:
+resolv.c, resolv.h, and webclient.c.
+

+Definition at line 350 of file resolv.c. +

+References RESOLV_ENTRIES, and STATE_UNUSED. +

+Referenced by webclient_appcall().

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00161.html b/third_party/uip-1.0/doc/html/a00161.html new file mode 100644 index 0000000..74d2892 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00161.html @@ -0,0 +1,257 @@ + + +uIP 1.0: SMTP E-mail sender + + + + + +

SMTP E-mail sender
+ +[Applications] +


Detailed Description

+The Simple Mail Transfer Protocol (SMTP) as defined by RFC821 is the standard way of sending and transfering e-mail on the Internet. +

+This simple example implementation is intended as an example of how to implement protocols in uIP, and is able to send out e-mail but has not been extensively tested. +

+ + + + + + + +

+

+ + + +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Files

file  smtp.h
 SMTP header file.
file  smtp.c
 SMTP example implementation.

Data Structures

struct  smtp_state

Defines

+#define SMTP_ERR_OK   0
 Error number that signifies a non-error condition.
+#define SMTP_SEND(to, cc, from, subject, msg)   smtp_send(to, cc, from, subject, msg, strlen(msg))
+#define ISO_nl   0x0a
+#define ISO_cr   0x0d
+#define ISO_period   0x2e
+#define ISO_2   0x32
+#define ISO_3   0x33
+#define ISO_4   0x34
+#define ISO_5   0x35

Functions

void smtp_done (unsigned char error)
 Callback function that is called when an e-mail transmission is done.
+void smtp_init (void)
+void smtp_appcall (void)
void smtp_configure (char *lhostname, void *server)
 Specificy an SMTP server and hostname.
unsigned char smtp_send (char *to, char *cc, char *from, char *subject, char *msg, u16_t msglen)
 Send an e-mail.
+


Function Documentation

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
void smtp_configure char *  lhostname,
void *  server
+
+ + + + + +
+   + + +

+Specificy an SMTP server and hostname. +

+This function is used to configure the SMTP module with an SMTP server and the hostname of the host.

+

Parameters:
+ + + +
lhostname The hostname of the uIP host.
server A pointer to a 4-byte array representing the IP address of the SMTP server to be configured.
+
+ +

+Definition at line 216 of file smtp.c. +

+References uip_ipaddr_copy.

+

+ + + + +
+ + + + + + + + + +
void smtp_done unsigned char  error  ) 
+
+ + + + + +
+   + + +

+Callback function that is called when an e-mail transmission is done. +

+This function must be implemented by the module that uses the SMTP module.

+

Parameters:
+ + +
error The number of the error if an error occured, or SMTP_ERR_OK.
+
+
Examples:
+smtp.c, and smtp.h.
+

+Referenced by smtp_appcall().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
unsigned char smtp_send char *  to,
char *  cc,
char *  from,
char *  subject,
char *  msg,
u16_t  msglen
+
+ + + + + +
+   + + +

+Send an e-mail. +

+

Parameters:
+ + + + + + + +
to The e-mail address of the receiver of the e-mail.
cc The e-mail address of the CC: receivers of the e-mail.
from The e-mail address of the sender of the e-mail.
subject The subject of the e-mail.
msg The actual e-mail message.
msglen The length of the e-mail message.
+
+ +

+Definition at line 233 of file smtp.c. +

+References smtp_state::from, HTONS, smtp_state::msg, smtp_state::msglen, NULL, PSOCK_INIT, smtp_state::subject, smtp_state::to, and uip_connect().

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00162.html b/third_party/uip-1.0/doc/html/a00162.html new file mode 100644 index 0000000..4a07bbf --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00162.html @@ -0,0 +1,56 @@ + + +uIP 1.0: Hello, world + + + + + +

Hello, world
+ +[Applications] +


Detailed Description

+A small example showing how to write applications with protosockets. +

+ +

+ + + + + + + +

+

+ + + +

+

+ + + + + + + + + + +

Files

file  hello-world.h
 Header file for an example of how to write uIP applications with protosockets.
file  hello-world.c
 An example of how to write uIP applications with protosockets.

Data Structures

struct  hello_world_state

Defines

+#define UIP_APPCALL   hello_world_appcall

Functions

+void hello_world_appcall (void)
+void hello_world_init (void)
+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00163.html b/third_party/uip-1.0/doc/html/a00163.html new file mode 100644 index 0000000..f1d5eb1 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00163.html @@ -0,0 +1,533 @@ + + +uIP 1.0: Web client + + + + + +

Web client
+ +[Applications] +


Detailed Description

+This example shows a HTTP client that is able to download web pages and files from web servers. +

+It requires a number of callback functions to be implemented by the module that utilizes the code: webclient_datahandler(), webclient_connected(), webclient_timedout(), webclient_aborted(), webclient_closed(). +

+ + + + + + + +

+

+ + + +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Files

file  webclient.h
 Header file for the HTTP client.
file  webclient.c
 Implementation of the HTTP client.

Data Structures

struct  webclient_state

Defines

+#define WEBCLIENT_CONF_MAX_URLLEN   100
+#define UIP_APPCALL   webclient_appcall
+#define WEBCLIENT_TIMEOUT   100
+#define WEBCLIENT_STATE_STATUSLINE   0
+#define WEBCLIENT_STATE_HEADERS   1
+#define WEBCLIENT_STATE_DATA   2
+#define WEBCLIENT_STATE_CLOSE   3
+#define HTTPFLAG_NONE   0
+#define HTTPFLAG_OK   1
+#define HTTPFLAG_MOVED   2
+#define HTTPFLAG_ERROR   3
+#define ISO_nl   0x0a
+#define ISO_cr   0x0d
+#define ISO_space   0x20

Typedefs

+typedef webclient_state uip_tcp_appstate_t

Functions

void webclient_datahandler (char *data, u16_t len)
 Callback function that is called from the webclient code when HTTP data has been received.
void webclient_connected (void)
 Callback function that is called from the webclient code when the HTTP connection has been connected to the web server.
void webclient_timedout (void)
 Callback function that is called from the webclient code if the HTTP connection to the web server has timed out.
void webclient_aborted (void)
 Callback function that is called from the webclient code if the HTTP connection to the web server has been aborted by the web server.
void webclient_closed (void)
 Callback function that is called from the webclient code when the HTTP connection to the web server has been closed.
+void webclient_init (void)
 Initialize the webclient module.
unsigned char webclient_get (char *host, u16_t port, char *file)
 Open an HTTP connection to a web server and ask for a file using the GET method.
+void webclient_close (void)
 Close the currently open HTTP connection.
+void webclient_appcall (void)
char * webclient_mimetype (void)
 Obtain the MIME type of the current HTTP data stream.
char * webclient_filename (void)
 Obtain the filename of the current HTTP data stream.
char * webclient_hostname (void)
 Obtain the hostname of the current HTTP data stream.
unsigned short webclient_port (void)
 Obtain the port number of the current HTTP data stream.
+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
void webclient_aborted void   ) 
+
+ + + + + +
+   + + +

+Callback function that is called from the webclient code if the HTTP connection to the web server has been aborted by the web server. +

+This function must be implemented by the module that uses the webclient code.

Examples:
+webclient.c, and webclient.h.
+

+Referenced by webclient_appcall().

+

+ + + + +
+ + + + + + + + + +
void webclient_closed void   ) 
+
+ + + + + +
+   + + +

+Callback function that is called from the webclient code when the HTTP connection to the web server has been closed. +

+This function must be implemented by the module that uses the webclient code.

Examples:
+webclient.c, and webclient.h.
+

+Referenced by webclient_appcall().

+

+ + + + +
+ + + + + + + + + +
void webclient_connected void   ) 
+
+ + + + + +
+   + + +

+Callback function that is called from the webclient code when the HTTP connection has been connected to the web server. +

+This function must be implemented by the module that uses the webclient code.

Examples:
+webclient.c, and webclient.h.
+

+Referenced by webclient_appcall().

+

+ + + + +
+ + + + + + + + + + + + + + + + + + +
void webclient_datahandler char *  data,
u16_t  len
+
+ + + + + +
+   + + +

+Callback function that is called from the webclient code when HTTP data has been received. +

+This function must be implemented by the module that uses the webclient code. The function is called from the webclient module when HTTP data has been received. The function is not called when HTTP headers are received, only for the actual data.

+

Note:
This function is called many times, repetedly, when data is being received, and not once when all data has been received.
+
Parameters:
+ + + +
data A pointer to the data that has been received.
len The length of the data that has been received.
+
+
Examples:
+webclient.c, and webclient.h.
+

+Referenced by webclient_appcall().

+

+ + + + +
+ + + + + + + + + +
char * webclient_filename void   ) 
+
+ + + + + +
+   + + +

+Obtain the filename of the current HTTP data stream. +

+The filename of an HTTP request may be changed by the web server, and may therefore not be the same as when the original GET request was made with webclient_get(). This function is used for obtaining the current filename.

+

Returns:
A pointer to the current filename.
+
Examples:
+webclient.c, and webclient.h.
+

+Definition at line 93 of file webclient.c. +

+References webclient_state::file.

+

+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
unsigned char webclient_get char *  host,
u16_t  port,
char *  file
+
+ + + + + +
+   + + +

+Open an HTTP connection to a web server and ask for a file using the GET method. +

+This function opens an HTTP connection to the specified web server and requests the specified file using the GET method. When the HTTP connection has been connected, the webclient_connected() callback function is called and when the HTTP data arrives the webclient_datahandler() callback function is called.

+The callback function webclient_timedout() is called if the web server could not be contacted, and the webclient_aborted() callback function is called if the HTTP connection is aborted by the web server.

+When the HTTP request has been completed and the HTTP connection is closed, the webclient_closed() callback function will be called.

+

Note:
If the function is passed a host name, it must already be in the resolver cache in order for the function to connect to the web server. It is therefore up to the calling module to implement the resolver calls and the signal handler used for reporting a resolv query answer.
+
Parameters:
+ + + + +
host A pointer to a string containing either a host name or a numerical IP address in dotted decimal notation (e.g., 192.168.23.1).
port The port number to which to connect, in host byte order.
file A pointer to the name of the file to get.
+
+
Return values:
+ + + +
0 if the host name could not be found in the cache, or if a TCP connection could not be created.
1 if the connection was initiated.
+
+
Examples:
+webclient.c, and webclient.h.
+

+Definition at line 140 of file webclient.c. +

+References webclient_state::file, webclient_state::host, htons(), NULL, webclient_state::port, resolv_lookup(), and uip_connect(). +

+Referenced by webclient_appcall().

+

+ + + + +
+ + + + + + + + + +
char * webclient_hostname void   ) 
+
+ + + + + +
+   + + +

+Obtain the hostname of the current HTTP data stream. +

+The hostname of the web server of an HTTP request may be changed by the web server, and may therefore not be the same as when the original GET request was made with webclient_get(). This function is used for obtaining the current hostname.

+

Returns:
A pointer to the current hostname.
+
Examples:
+webclient.c, and webclient.h.
+

+Definition at line 99 of file webclient.c. +

+References webclient_state::host.

+

+ + + + +
+ + + + + + + + + +
char * webclient_mimetype void   ) 
+
+ + + + + +
+   + + +

+Obtain the MIME type of the current HTTP data stream. +

+

Returns:
A pointer to a string contaning the MIME type. The string may be empty if no MIME type was reported by the web server.
+
Examples:
+webclient.c, and webclient.h.
+

+Definition at line 87 of file webclient.c. +

+References webclient_state::mimetype.

+

+ + + + +
+ + + + + + + + + +
unsigned short webclient_port void   ) 
+
+ + + + + +
+   + + +

+Obtain the port number of the current HTTP data stream. +

+The port number of an HTTP request may be changed by the web server, and may therefore not be the same as when the original GET request was made with webclient_get(). This function is used for obtaining the current port number.

+

Returns:
The port number of the current HTTP data stream, in host byte order.
+
Examples:
+webclient.c, and webclient.h.
+

+Definition at line 105 of file webclient.c. +

+References webclient_state::port.

+

+ + + + +
+ + + + + + + + + +
void webclient_timedout void   ) 
+
+ + + + + +
+   + + +

+Callback function that is called from the webclient code if the HTTP connection to the web server has timed out. +

+This function must be implemented by the module that uses the webclient code.

Examples:
+webclient.c, and webclient.h.
+

+Referenced by webclient_appcall().

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00164.html b/third_party/uip-1.0/doc/html/a00164.html new file mode 100644 index 0000000..82def65 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00164.html @@ -0,0 +1,172 @@ + + +uIP 1.0: Web server + + + + + +

Web server
+ +[Applications] +


Detailed Description

+The uIP web server is a very simplistic implementation of an HTTP server. +

+It can serve web pages and files from a read-only ROM filesystem, and provides a very small scripting language. +

+ + + + + + + +

+

+ + + +

+

+ + + +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Files

file  httpd-cgi.h
 Web server script interface header file.
file  httpd-cgi.c
 Web server script interface.
file  httpd.c
 Web server.

Data Structures

struct  httpd_cgi_call

Defines

#define HTTPD_CGI_CALL(name, str, function)
 HTTPD CGI function declaration.
+#define STATE_WAITING   0
+#define STATE_OUTPUT   1
+#define ISO_nl   0x0a
+#define ISO_space   0x20
+#define ISO_bang   0x21
+#define ISO_percent   0x25
+#define ISO_period   0x2e
+#define ISO_slash   0x2f
+#define ISO_colon   0x3a

Functions

+httpd_cgifunction httpd_cgi (char *name)
+void httpd_appcall (void)
void httpd_init (void)
 Initialize the web server.
+


Define Documentation

+

+ + + + +
+ + + + + + + + + + + + + + + +
#define HTTPD_CGI_CALL name,
str,
function   ) 
+
+ + + + + +
+   + + +

+HTTPD CGI function declaration. +

+

Parameters:
+ + + + +
name The C variable name of the function
str The string name of the function, used in the script file
function A pointer to the function that implements it
+
+This macro is used for declaring a HTTPD CGI function. This function is then added to the list of HTTPD CGI functions with the httpd_cgi_add() function. +

+Definition at line 77 of file httpd-cgi.h.

+


Function Documentation

+

+ + + + +
+ + + + + + + + + +
void httpd_init void   ) 
+
+ + + + + +
+   + + +

+Initialize the web server. +

+This function initializes the web server and should be called at system boot-up. +

+Definition at line 333 of file httpd.c. +

+References HTONS, and uip_listen().

+


Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00168.html b/third_party/uip-1.0/doc/html/a00168.html new file mode 100644 index 0000000..3468aca --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00168.html @@ -0,0 +1,381 @@ + + +uIP 1.0: apps/dhcpc/dhcpc.c Source File + + + + + + +

apps/dhcpc/dhcpc.c

00001 /*
+00002  * Copyright (c) 2005, Swedish Institute of Computer Science
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * @(#)$Id: dhcpc.c,v 1.2 2006/06/11 21:46:37 adam Exp $
+00032  */
+00033 
+00034 #include <stdio.h>
+00035 #include <string.h>
+00036 
+00037 #include "uip.h"
+00038 #include "dhcpc.h"
+00039 #include "timer.h"
+00040 #include "pt.h"
+00041 
+00042 #define STATE_INITIAL         0
+00043 #define STATE_SENDING         1
+00044 #define STATE_OFFER_RECEIVED  2
+00045 #define STATE_CONFIG_RECEIVED 3
+00046 
+00047 static struct dhcpc_state s;
+00048 
+00049 struct dhcp_msg {
+00050   u8_t op, htype, hlen, hops;
+00051   u8_t xid[4];
+00052   u16_t secs, flags;
+00053   u8_t ciaddr[4];
+00054   u8_t yiaddr[4];
+00055   u8_t siaddr[4];
+00056   u8_t giaddr[4];
+00057   u8_t chaddr[16];
+00058 #ifndef UIP_CONF_DHCP_LIGHT
+00059   u8_t sname[64];
+00060   u8_t file[128];
+00061 #endif
+00062   u8_t options[312];
+00063 };
+00064 
+00065 #define BOOTP_BROADCAST 0x8000
+00066 
+00067 #define DHCP_REQUEST        1
+00068 #define DHCP_REPLY          2
+00069 #define DHCP_HTYPE_ETHERNET 1
+00070 #define DHCP_HLEN_ETHERNET  6
+00071 #define DHCP_MSG_LEN      236
+00072 
+00073 #define DHCPC_SERVER_PORT  67
+00074 #define DHCPC_CLIENT_PORT  68
+00075 
+00076 #define DHCPDISCOVER  1
+00077 #define DHCPOFFER     2
+00078 #define DHCPREQUEST   3
+00079 #define DHCPDECLINE   4
+00080 #define DHCPACK       5
+00081 #define DHCPNAK       6
+00082 #define DHCPRELEASE   7
+00083 
+00084 #define DHCP_OPTION_SUBNET_MASK   1
+00085 #define DHCP_OPTION_ROUTER        3
+00086 #define DHCP_OPTION_DNS_SERVER    6
+00087 #define DHCP_OPTION_REQ_IPADDR   50
+00088 #define DHCP_OPTION_LEASE_TIME   51
+00089 #define DHCP_OPTION_MSG_TYPE     53
+00090 #define DHCP_OPTION_SERVER_ID    54
+00091 #define DHCP_OPTION_REQ_LIST     55
+00092 #define DHCP_OPTION_END         255
+00093 
+00094 static const u8_t xid[4] = {0xad, 0xde, 0x12, 0x23};
+00095 static const u8_t magic_cookie[4] = {99, 130, 83, 99};
+00096 /*---------------------------------------------------------------------------*/
+00097 static u8_t *
+00098 add_msg_type(u8_t *optptr, u8_t type)
+00099 {
+00100   *optptr++ = DHCP_OPTION_MSG_TYPE;
+00101   *optptr++ = 1;
+00102   *optptr++ = type;
+00103   return optptr;
+00104 }
+00105 /*---------------------------------------------------------------------------*/
+00106 static u8_t *
+00107 add_server_id(u8_t *optptr)
+00108 {
+00109   *optptr++ = DHCP_OPTION_SERVER_ID;
+00110   *optptr++ = 4;
+00111   memcpy(optptr, s.serverid, 4);
+00112   return optptr + 4;
+00113 }
+00114 /*---------------------------------------------------------------------------*/
+00115 static u8_t *
+00116 add_req_ipaddr(u8_t *optptr)
+00117 {
+00118   *optptr++ = DHCP_OPTION_REQ_IPADDR;
+00119   *optptr++ = 4;
+00120   memcpy(optptr, s.ipaddr, 4);
+00121   return optptr + 4;
+00122 }
+00123 /*---------------------------------------------------------------------------*/
+00124 static u8_t *
+00125 add_req_options(u8_t *optptr)
+00126 {
+00127   *optptr++ = DHCP_OPTION_REQ_LIST;
+00128   *optptr++ = 3;
+00129   *optptr++ = DHCP_OPTION_SUBNET_MASK;
+00130   *optptr++ = DHCP_OPTION_ROUTER;
+00131   *optptr++ = DHCP_OPTION_DNS_SERVER;
+00132   return optptr;
+00133 }
+00134 /*---------------------------------------------------------------------------*/
+00135 static u8_t *
+00136 add_end(u8_t *optptr)
+00137 {
+00138   *optptr++ = DHCP_OPTION_END;
+00139   return optptr;
+00140 }
+00141 /*---------------------------------------------------------------------------*/
+00142 static void
+00143 create_msg(register struct dhcp_msg *m)
+00144 {
+00145   m->op = DHCP_REQUEST;
+00146   m->htype = DHCP_HTYPE_ETHERNET;
+00147   m->hlen = s.mac_len;
+00148   m->hops = 0;
+00149   memcpy(m->xid, xid, sizeof(m->xid));
+00150   m->secs = 0;
+00151   m->flags = HTONS(BOOTP_BROADCAST); /*  Broadcast bit. */
+00152   /*  uip_ipaddr_copy(m->ciaddr, uip_hostaddr);*/
+00153   memcpy(m->ciaddr, uip_hostaddr, sizeof(m->ciaddr));
+00154   memset(m->yiaddr, 0, sizeof(m->yiaddr));
+00155   memset(m->siaddr, 0, sizeof(m->siaddr));
+00156   memset(m->giaddr, 0, sizeof(m->giaddr));
+00157   memcpy(m->chaddr, s.mac_addr, s.mac_len);
+00158   memset(&m->chaddr[s.mac_len], 0, sizeof(m->chaddr) - s.mac_len);
+00159 #ifndef UIP_CONF_DHCP_LIGHT
+00160   memset(m->sname, 0, sizeof(m->sname));
+00161   memset(m->file, 0, sizeof(m->file));
+00162 #endif
+00163 
+00164   memcpy(m->options, magic_cookie, sizeof(magic_cookie));
+00165 }
+00166 /*---------------------------------------------------------------------------*/
+00167 static void
+00168 send_discover(void)
+00169 {
+00170   u8_t *end;
+00171   struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;
+00172 
+00173   create_msg(m);
+00174 
+00175   end = add_msg_type(&m->options[4], DHCPDISCOVER);
+00176   end = add_req_options(end);
+00177   end = add_end(end);
+00178 
+00179   uip_send(uip_appdata, end - (u8_t *)uip_appdata);
+00180 }
+00181 /*---------------------------------------------------------------------------*/
+00182 static void
+00183 send_request(void)
+00184 {
+00185   u8_t *end;
+00186   struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;
+00187 
+00188   create_msg(m);
+00189   
+00190   end = add_msg_type(&m->options[4], DHCPREQUEST);
+00191   end = add_server_id(end);
+00192   end = add_req_ipaddr(end);
+00193   end = add_end(end);
+00194   
+00195   uip_send(uip_appdata, end - (u8_t *)uip_appdata);
+00196 }
+00197 /*---------------------------------------------------------------------------*/
+00198 static u8_t
+00199 parse_options(u8_t *optptr, int len)
+00200 {
+00201   u8_t *end = optptr + len;
+00202   u8_t type = 0;
+00203 
+00204   while(optptr < end) {
+00205     switch(*optptr) {
+00206     case DHCP_OPTION_SUBNET_MASK:
+00207       memcpy(s.netmask, optptr + 2, 4);
+00208       break;
+00209     case DHCP_OPTION_ROUTER:
+00210       memcpy(s.default_router, optptr + 2, 4);
+00211       break;
+00212     case DHCP_OPTION_DNS_SERVER:
+00213       memcpy(s.dnsaddr, optptr + 2, 4);
+00214       break;
+00215     case DHCP_OPTION_MSG_TYPE:
+00216       type = *(optptr + 2);
+00217       break;
+00218     case DHCP_OPTION_SERVER_ID:
+00219       memcpy(s.serverid, optptr + 2, 4);
+00220       break;
+00221     case DHCP_OPTION_LEASE_TIME:
+00222       memcpy(s.lease_time, optptr + 2, 4);
+00223       break;
+00224     case DHCP_OPTION_END:
+00225       return type;
+00226     }
+00227 
+00228     optptr += optptr[1] + 2;
+00229   }
+00230   return type;
+00231 }
+00232 /*---------------------------------------------------------------------------*/
+00233 static u8_t
+00234 parse_msg(void)
+00235 {
+00236   struct dhcp_msg *m = (struct dhcp_msg *)uip_appdata;
+00237   
+00238   if(m->op == DHCP_REPLY &&
+00239      memcmp(m->xid, xid, sizeof(xid)) == 0 &&
+00240      memcmp(m->chaddr, s.mac_addr, s.mac_len) == 0) {
+00241     memcpy(s.ipaddr, m->yiaddr, 4);
+00242     return parse_options(&m->options[4], uip_datalen());
+00243   }
+00244   return 0;
+00245 }
+00246 /*---------------------------------------------------------------------------*/
+00247 static
+00248 PT_THREAD(handle_dhcp(void))
+00249 {
+00250   PT_BEGIN(&s.pt);
+00251   
+00252   /* try_again:*/
+00253   s.state = STATE_SENDING;
+00254   s.ticks = CLOCK_SECOND;
+00255 
+00256   do {
+00257     send_discover();
+00258     timer_set(&s.timer, s.ticks);
+00259     PT_WAIT_UNTIL(&s.pt, uip_newdata() || timer_expired(&s.timer));
+00260 
+00261     if(uip_newdata() && parse_msg() == DHCPOFFER) {
+00262       s.state = STATE_OFFER_RECEIVED;
+00263       break;
+00264     }
+00265 
+00266     if(s.ticks < CLOCK_SECOND * 60) {
+00267       s.ticks *= 2;
+00268     }
+00269   } while(s.state != STATE_OFFER_RECEIVED);
+00270   
+00271   s.ticks = CLOCK_SECOND;
+00272 
+00273   do {
+00274     send_request();
+00275     timer_set(&s.timer, s.ticks);
+00276     PT_WAIT_UNTIL(&s.pt, uip_newdata() || timer_expired(&s.timer));
+00277 
+00278     if(uip_newdata() && parse_msg() == DHCPACK) {
+00279       s.state = STATE_CONFIG_RECEIVED;
+00280       break;
+00281     }
+00282 
+00283     if(s.ticks <= CLOCK_SECOND * 10) {
+00284       s.ticks += CLOCK_SECOND;
+00285     } else {
+00286       PT_RESTART(&s.pt);
+00287     }
+00288   } while(s.state != STATE_CONFIG_RECEIVED);
+00289   
+00290 #if 0
+00291   printf("Got IP address %d.%d.%d.%d\n",
+00292          uip_ipaddr1(s.ipaddr), uip_ipaddr2(s.ipaddr),
+00293          uip_ipaddr3(s.ipaddr), uip_ipaddr4(s.ipaddr));
+00294   printf("Got netmask %d.%d.%d.%d\n",
+00295          uip_ipaddr1(s.netmask), uip_ipaddr2(s.netmask),
+00296          uip_ipaddr3(s.netmask), uip_ipaddr4(s.netmask));
+00297   printf("Got DNS server %d.%d.%d.%d\n",
+00298          uip_ipaddr1(s.dnsaddr), uip_ipaddr2(s.dnsaddr),
+00299          uip_ipaddr3(s.dnsaddr), uip_ipaddr4(s.dnsaddr));
+00300   printf("Got default router %d.%d.%d.%d\n",
+00301          uip_ipaddr1(s.default_router), uip_ipaddr2(s.default_router),
+00302          uip_ipaddr3(s.default_router), uip_ipaddr4(s.default_router));
+00303   printf("Lease expires in %ld seconds\n",
+00304          ntohs(s.lease_time[0])*65536ul + ntohs(s.lease_time[1]));
+00305 #endif
+00306 
+00307   dhcpc_configured(&s);
+00308   
+00309   /*  timer_stop(&s.timer);*/
+00310 
+00311   /*
+00312    * PT_END restarts the thread so we do this instead. Eventually we
+00313    * should reacquire expired leases here.
+00314    */
+00315   while(1) {
+00316     PT_YIELD(&s.pt);
+00317   }
+00318 
+00319   PT_END(&s.pt);
+00320 }
+00321 /*---------------------------------------------------------------------------*/
+00322 void
+00323 dhcpc_init(const void *mac_addr, int mac_len)
+00324 {
+00325   uip_ipaddr_t addr;
+00326   
+00327   s.mac_addr = mac_addr;
+00328   s.mac_len  = mac_len;
+00329 
+00330   s.state = STATE_INITIAL;
+00331   uip_ipaddr(addr, 255,255,255,255);
+00332   s.conn = uip_udp_new(&addr, HTONS(DHCPC_SERVER_PORT));
+00333   if(s.conn != NULL) {
+00334     uip_udp_bind(s.conn, HTONS(DHCPC_CLIENT_PORT));
+00335   }
+00336   PT_INIT(&s.pt);
+00337 }
+00338 /*---------------------------------------------------------------------------*/
+00339 void
+00340 dhcpc_appcall(void)
+00341 {
+00342   handle_dhcp();
+00343 }
+00344 /*---------------------------------------------------------------------------*/
+00345 void
+00346 dhcpc_request(void)
+00347 {
+00348   u16_t ipaddr[2];
+00349   
+00350   if(s.state == STATE_INITIAL) {
+00351     uip_ipaddr(ipaddr, 0,0,0,0);
+00352     uip_sethostaddr(ipaddr);
+00353     /*    handle_dhcp(PROCESS_EVENT_NONE, NULL);*/
+00354   }
+00355 }
+00356 /*---------------------------------------------------------------------------*/
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00169.html b/third_party/uip-1.0/doc/html/a00169.html new file mode 100644 index 0000000..32e9635 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00169.html @@ -0,0 +1,93 @@ + + +uIP 1.0: apps/dhcpc/dhcpc.h Source File + + + + + + +

apps/dhcpc/dhcpc.h

00001 /*
+00002  * Copyright (c) 2005, Swedish Institute of Computer Science
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * @(#)$Id: dhcpc.h,v 1.3 2006/06/11 21:46:37 adam Exp $
+00032  */
+00033 #ifndef __DHCPC_H__
+00034 #define __DHCPC_H__
+00035 
+00036 #include "timer.h"
+00037 #include "pt.h"
+00038 
+00039 struct dhcpc_state {
+00040   struct pt pt;
+00041   char state;
+00042   struct uip_udp_conn *conn;
+00043   struct timer timer;
+00044   u16_t ticks;
+00045   const void *mac_addr;
+00046   int mac_len;
+00047   
+00048   u8_t serverid[4];
+00049 
+00050   u16_t lease_time[2];
+00051   u16_t ipaddr[2];
+00052   u16_t netmask[2];
+00053   u16_t dnsaddr[2];
+00054   u16_t default_router[2];
+00055 };
+00056 
+00057 void dhcpc_init(const void *mac_addr, int mac_len);
+00058 void dhcpc_request(void);
+00059 
+00060 void dhcpc_appcall(void);
+00061 
+00062 void dhcpc_configured(const struct dhcpc_state *s);
+00063 
+00064 typedef struct dhcpc_state uip_udp_appstate_t;
+00065 #define UIP_UDP_APPCALL dhcpc_appcall
+00066 
+00067 
+00068 #endif /* __DHCPC_H__ */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00170.html b/third_party/uip-1.0/doc/html/a00170.html new file mode 100644 index 0000000..5291e2e --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00170.html @@ -0,0 +1,125 @@ + + +uIP 1.0: apps/hello-world/hello-world.c Source File + + + + + + +

apps/hello-world/hello-world.c

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup helloworld
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \file
+00008  *         An example of how to write uIP applications
+00009  *         with protosockets.
+00010  * \author
+00011  *         Adam Dunkels <adam@sics.se>
+00012  */
+00013 
+00014 /*
+00015  * This is a short example of how to write uIP applications using
+00016  * protosockets.
+00017  */
+00018 
+00019 /*
+00020  * We define the application state (struct hello_world_state) in the
+00021  * hello-world.h file, so we need to include it here. We also include
+00022  * uip.h (since this cannot be included in hello-world.h) and
+00023  * <string.h>, since we use the memcpy() function in the code.
+00024  */
+00025 #include "hello-world.h"
+00026 #include "uip.h"
+00027 #include <string.h>
+00028 
+00029 /*
+00030  * Declaration of the protosocket function that handles the connection
+00031  * (defined at the end of the code).
+00032  */
+00033 static int handle_connection(struct hello_world_state *s);
+00034 /*---------------------------------------------------------------------------*/
+00035 /*
+00036  * The initialization function. We must explicitly call this function
+00037  * from the system initialization code, some time after uip_init() is
+00038  * called.
+00039  */
+00040 void
+00041 hello_world_init(void)
+00042 {
+00043   /* We start to listen for connections on TCP port 1000. */
+00044   uip_listen(HTONS(1000));
+00045 }
+00046 /*---------------------------------------------------------------------------*/
+00047 /*
+00048  * In hello-world.h we have defined the UIP_APPCALL macro to
+00049  * hello_world_appcall so that this funcion is uIP's application
+00050  * function. This function is called whenever an uIP event occurs
+00051  * (e.g. when a new connection is established, new data arrives, sent
+00052  * data is acknowledged, data needs to be retransmitted, etc.).
+00053  */
+00054 void
+00055 hello_world_appcall(void)
+00056 {
+00057   /*
+00058    * The uip_conn structure has a field called "appstate" that holds
+00059    * the application state of the connection. We make a pointer to
+00060    * this to access it easier.
+00061    */
+00062   struct hello_world_state *s = &(uip_conn->appstate);
+00063 
+00064   /*
+00065    * If a new connection was just established, we should initialize
+00066    * the protosocket in our applications' state structure.
+00067    */
+00068   if(uip_connected()) {
+00069     PSOCK_INIT(&s->p, s->inputbuffer, sizeof(s->inputbuffer));
+00070   }
+00071 
+00072   /*
+00073    * Finally, we run the protosocket function that actually handles
+00074    * the communication. We pass it a pointer to the application state
+00075    * of the current connection.
+00076    */
+00077   handle_connection(s);
+00078 }
+00079 /*---------------------------------------------------------------------------*/
+00080 /*
+00081  * This is the protosocket function that handles the communication. A
+00082  * protosocket function must always return an int, but must never
+00083  * explicitly return - all return statements are hidden in the PSOCK
+00084  * macros.
+00085  */
+00086 static int
+00087 handle_connection(struct hello_world_state *s)
+00088 {
+00089   PSOCK_BEGIN(&s->p);
+00090 
+00091   PSOCK_SEND_STR(&s->p, "Hello. What is your name?\n");
+00092   PSOCK_READTO(&s->p, '\n');
+00093   strncpy(s->name, s->inputbuffer, sizeof(s->name));
+00094   PSOCK_SEND_STR(&s->p, "Hello ");
+00095   PSOCK_SEND_STR(&s->p, s->name);
+00096   PSOCK_CLOSE(&s->p);
+00097   
+00098   PSOCK_END(&s->p);
+00099 }
+00100 /*---------------------------------------------------------------------------*/
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00171.html b/third_party/uip-1.0/doc/html/a00171.html new file mode 100644 index 0000000..8de185a --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00171.html @@ -0,0 +1,77 @@ + + +uIP 1.0: apps/hello-world/hello-world.h Source File + + + + + + +

apps/hello-world/hello-world.h

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup apps
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \defgroup helloworld Hello, world
+00008  * @{
+00009  *
+00010  * A small example showing how to write applications with
+00011  * \ref psock "protosockets".
+00012  */
+00013 
+00014 /**
+00015  * \file
+00016  *         Header file for an example of how to write uIP applications
+00017  *         with protosockets.
+00018  * \author
+00019  *         Adam Dunkels <adam@sics.se>
+00020  */
+00021 
+00022 #ifndef __HELLO_WORLD_H__
+00023 #define __HELLO_WORLD_H__
+00024 
+00025 /* Since this file will be included by uip.h, we cannot include uip.h
+00026    here. But we might need to include uipopt.h if we need the u8_t and
+00027    u16_t datatypes. */
+00028 #include "uipopt.h"
+00029 
+00030 #include "psock.h"
+00031 
+00032 /* Next, we define the uip_tcp_appstate_t datatype. This is the state
+00033    of our application, and the memory required for this state is
+00034    allocated together with each TCP connection. One application state
+00035    for each TCP connection. */
+00036 typedef struct hello_world_state {
+00037   struct psock p;
+00038   char inputbuffer[10];
+00039   char name[40];
+00040 } uip_tcp_appstate_t;
+00041 
+00042 /* Finally we define the application function to be called by uIP. */
+00043 void hello_world_appcall(void);
+00044 #ifndef UIP_APPCALL
+00045 #define UIP_APPCALL hello_world_appcall
+00046 #endif /* UIP_APPCALL */
+00047 
+00048 void hello_world_init(void);
+00049 
+00050 #endif /* __HELLO_WORLD_H__ */
+00051 /** @} */
+00052 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00172.html b/third_party/uip-1.0/doc/html/a00172.html new file mode 100644 index 0000000..1871f07 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00172.html @@ -0,0 +1,489 @@ + + +uIP 1.0: apps/resolv/resolv.c Source File + + + + + + +

apps/resolv/resolv.c

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup apps
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \defgroup resolv DNS resolver
+00008  * @{
+00009  *
+00010  * The uIP DNS resolver functions are used to lookup a hostname and
+00011  * map it to a numerical IP address. It maintains a list of resolved
+00012  * hostnames that can be queried with the resolv_lookup()
+00013  * function. New hostnames can be resolved using the resolv_query()
+00014  * function.
+00015  *
+00016  * When a hostname has been resolved (or found to be non-existant),
+00017  * the resolver code calls a callback function called resolv_found()
+00018  * that must be implemented by the module that uses the resolver.
+00019  */
+00020 
+00021 /**
+00022  * \file
+00023  * DNS host name to IP address resolver.
+00024  * \author Adam Dunkels <adam@dunkels.com>
+00025  *
+00026  * This file implements a DNS host name to IP address resolver.
+00027  */
+00028 
+00029 /*
+00030  * Copyright (c) 2002-2003, Adam Dunkels.
+00031  * All rights reserved.
+00032  *
+00033  * Redistribution and use in source and binary forms, with or without
+00034  * modification, are permitted provided that the following conditions
+00035  * are met:
+00036  * 1. Redistributions of source code must retain the above copyright
+00037  *    notice, this list of conditions and the following disclaimer.
+00038  * 2. Redistributions in binary form must reproduce the above copyright
+00039  *    notice, this list of conditions and the following disclaimer in the
+00040  *    documentation and/or other materials provided with the distribution.
+00041  * 3. The name of the author may not be used to endorse or promote
+00042  *    products derived from this software without specific prior
+00043  *    written permission.
+00044  *
+00045  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00046  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00047  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00048  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00049  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00050  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00051  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00052  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00053  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00054  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00055  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00056  *
+00057  * This file is part of the uIP TCP/IP stack.
+00058  *
+00059  * $Id: resolv.c,v 1.5 2006/06/11 21:46:37 adam Exp $
+00060  *
+00061  */
+00062 
+00063 #include "resolv.h"
+00064 #include "uip.h"
+00065 
+00066 #include <string.h>
+00067 
+00068 #ifndef NULL
+00069 #define NULL (void *)0
+00070 #endif /* NULL */
+00071 
+00072 /** \internal The maximum number of retries when asking for a name. */
+00073 #define MAX_RETRIES 8
+00074 
+00075 /** \internal The DNS message header. */
+00076 struct dns_hdr {
+00077   u16_t id;
+00078   u8_t flags1, flags2;
+00079 #define DNS_FLAG1_RESPONSE        0x80
+00080 #define DNS_FLAG1_OPCODE_STATUS   0x10
+00081 #define DNS_FLAG1_OPCODE_INVERSE  0x08
+00082 #define DNS_FLAG1_OPCODE_STANDARD 0x00
+00083 #define DNS_FLAG1_AUTHORATIVE     0x04
+00084 #define DNS_FLAG1_TRUNC           0x02
+00085 #define DNS_FLAG1_RD              0x01
+00086 #define DNS_FLAG2_RA              0x80
+00087 #define DNS_FLAG2_ERR_MASK        0x0f
+00088 #define DNS_FLAG2_ERR_NONE        0x00
+00089 #define DNS_FLAG2_ERR_NAME        0x03
+00090   u16_t numquestions;
+00091   u16_t numanswers;
+00092   u16_t numauthrr;
+00093   u16_t numextrarr;
+00094 };
+00095 
+00096 /** \internal The DNS answer message structure. */
+00097 struct dns_answer {
+00098   /* DNS answer record starts with either a domain name or a pointer
+00099      to a name already present somewhere in the packet. */
+00100   u16_t type;
+00101   u16_t class;
+00102   u16_t ttl[2];
+00103   u16_t len;
+00104   uip_ipaddr_t ipaddr;
+00105 };
+00106 
+00107 struct namemap {
+00108 #define STATE_UNUSED 0
+00109 #define STATE_NEW    1
+00110 #define STATE_ASKING 2
+00111 #define STATE_DONE   3
+00112 #define STATE_ERROR  4
+00113   u8_t state;
+00114   u8_t tmr;
+00115   u8_t retries;
+00116   u8_t seqno;
+00117   u8_t err;
+00118   char name[32];
+00119   uip_ipaddr_t ipaddr;
+00120 };
+00121 
+00122 #ifndef UIP_CONF_RESOLV_ENTRIES
+00123 #define RESOLV_ENTRIES 4
+00124 #else /* UIP_CONF_RESOLV_ENTRIES */
+00125 #define RESOLV_ENTRIES UIP_CONF_RESOLV_ENTRIES
+00126 #endif /* UIP_CONF_RESOLV_ENTRIES */
+00127 
+00128 
+00129 static struct namemap names[RESOLV_ENTRIES];
+00130 
+00131 static u8_t seqno;
+00132 
+00133 static struct uip_udp_conn *resolv_conn = NULL;
+00134 
+00135 
+00136 /*---------------------------------------------------------------------------*/
+00137 /** \internal
+00138  * Walk through a compact encoded DNS name and return the end of it.
+00139  *
+00140  * \return The end of the name.
+00141  */
+00142 /*---------------------------------------------------------------------------*/
+00143 static unsigned char *
+00144 parse_name(unsigned char *query)
+00145 {
+00146   unsigned char n;
+00147 
+00148   do {
+00149     n = *query++;
+00150     
+00151     while(n > 0) {
+00152       /*      printf("%c", *query);*/
+00153       ++query;
+00154       --n;
+00155     };
+00156     /*    printf(".");*/
+00157   } while(*query != 0);
+00158   /*  printf("\n");*/
+00159   return query + 1;
+00160 }
+00161 /*---------------------------------------------------------------------------*/
+00162 /** \internal
+00163  * Runs through the list of names to see if there are any that have
+00164  * not yet been queried and, if so, sends out a query.
+00165  */
+00166 /*---------------------------------------------------------------------------*/
+00167 static void
+00168 check_entries(void)
+00169 {
+00170   register struct dns_hdr *hdr;
+00171   char *query, *nptr, *nameptr;
+00172   static u8_t i;
+00173   static u8_t n;
+00174   register struct namemap *namemapptr;
+00175   
+00176   for(i = 0; i < RESOLV_ENTRIES; ++i) {
+00177     namemapptr = &names[i];
+00178     if(namemapptr->state == STATE_NEW ||
+00179        namemapptr->state == STATE_ASKING) {
+00180       if(namemapptr->state == STATE_ASKING) {
+00181         if(--namemapptr->tmr == 0) {
+00182           if(++namemapptr->retries == MAX_RETRIES) {
+00183             namemapptr->state = STATE_ERROR;
+00184             resolv_found(namemapptr->name, NULL);
+00185             continue;
+00186           }
+00187           namemapptr->tmr = namemapptr->retries;
+00188         } else {
+00189           /*      printf("Timer %d\n", namemapptr->tmr);*/
+00190           /* Its timer has not run out, so we move on to next
+00191              entry. */
+00192           continue;
+00193         }
+00194       } else {
+00195         namemapptr->state = STATE_ASKING;
+00196         namemapptr->tmr = 1;
+00197         namemapptr->retries = 0;
+00198       }
+00199       hdr = (struct dns_hdr *)uip_appdata;
+00200       memset(hdr, 0, sizeof(struct dns_hdr));
+00201       hdr->id = htons(i);
+00202       hdr->flags1 = DNS_FLAG1_RD;
+00203       hdr->numquestions = HTONS(1);
+00204       query = (char *)uip_appdata + 12;
+00205       nameptr = namemapptr->name;
+00206       --nameptr;
+00207       /* Convert hostname into suitable query format. */
+00208       do {
+00209         ++nameptr;
+00210         nptr = query;
+00211         ++query;
+00212         for(n = 0; *nameptr != '.' && *nameptr != 0; ++nameptr) {
+00213           *query = *nameptr;
+00214           ++query;
+00215           ++n;
+00216         }
+00217         *nptr = n;
+00218       } while(*nameptr != 0);
+00219       {
+00220         static unsigned char endquery[] =
+00221           {0,0,1,0,1};
+00222         memcpy(query, endquery, 5);
+00223       }
+00224       uip_udp_send((unsigned char)(query + 5 - (char *)uip_appdata));
+00225       break;
+00226     }
+00227   }
+00228 }
+00229 /*---------------------------------------------------------------------------*/
+00230 /** \internal
+00231  * Called when new UDP data arrives.
+00232  */
+00233 /*---------------------------------------------------------------------------*/
+00234 static void
+00235 newdata(void)
+00236 {
+00237   char *nameptr;
+00238   struct dns_answer *ans;
+00239   struct dns_hdr *hdr;
+00240   static u8_t nquestions, nanswers;
+00241   static u8_t i;
+00242   register struct namemap *namemapptr;
+00243   
+00244   hdr = (struct dns_hdr *)uip_appdata;
+00245   /*  printf("ID %d\n", htons(hdr->id));
+00246       printf("Query %d\n", hdr->flags1 & DNS_FLAG1_RESPONSE);
+00247       printf("Error %d\n", hdr->flags2 & DNS_FLAG2_ERR_MASK);
+00248       printf("Num questions %d, answers %d, authrr %d, extrarr %d\n",
+00249       htons(hdr->numquestions),
+00250       htons(hdr->numanswers),
+00251       htons(hdr->numauthrr),
+00252       htons(hdr->numextrarr));
+00253   */
+00254 
+00255   /* The ID in the DNS header should be our entry into the name
+00256      table. */
+00257   i = htons(hdr->id);
+00258   namemapptr = &names[i];
+00259   if(i < RESOLV_ENTRIES &&
+00260      namemapptr->state == STATE_ASKING) {
+00261 
+00262     /* This entry is now finished. */
+00263     namemapptr->state = STATE_DONE;
+00264     namemapptr->err = hdr->flags2 & DNS_FLAG2_ERR_MASK;
+00265 
+00266     /* Check for error. If so, call callback to inform. */
+00267     if(namemapptr->err != 0) {
+00268       namemapptr->state = STATE_ERROR;
+00269       resolv_found(namemapptr->name, NULL);
+00270       return;
+00271     }
+00272 
+00273     /* We only care about the question(s) and the answers. The authrr
+00274        and the extrarr are simply discarded. */
+00275     nquestions = htons(hdr->numquestions);
+00276     nanswers = htons(hdr->numanswers);
+00277 
+00278     /* Skip the name in the question. XXX: This should really be
+00279        checked agains the name in the question, to be sure that they
+00280        match. */
+00281     nameptr = parse_name((char *)uip_appdata + 12) + 4;
+00282 
+00283     while(nanswers > 0) {
+00284       /* The first byte in the answer resource record determines if it
+00285          is a compressed record or a normal one. */
+00286       if(*nameptr & 0xc0) {
+00287         /* Compressed name. */
+00288         nameptr +=2;
+00289         /*      printf("Compressed anwser\n");*/
+00290       } else {
+00291         /* Not compressed name. */
+00292         nameptr = parse_name((char *)nameptr);
+00293       }
+00294 
+00295       ans = (struct dns_answer *)nameptr;
+00296       /*      printf("Answer: type %x, class %x, ttl %x, length %x\n",
+00297              htons(ans->type), htons(ans->class), (htons(ans->ttl[0])
+00298              << 16) | htons(ans->ttl[1]), htons(ans->len));*/
+00299 
+00300       /* Check for IP address type and Internet class. Others are
+00301          discarded. */
+00302       if(ans->type == HTONS(1) &&
+00303          ans->class == HTONS(1) &&
+00304          ans->len == HTONS(4)) {
+00305         /*      printf("IP address %d.%d.%d.%d\n",
+00306                htons(ans->ipaddr[0]) >> 8,
+00307                htons(ans->ipaddr[0]) & 0xff,
+00308                htons(ans->ipaddr[1]) >> 8,
+00309                htons(ans->ipaddr[1]) & 0xff);*/
+00310         /* XXX: we should really check that this IP address is the one
+00311            we want. */
+00312         namemapptr->ipaddr[0] = ans->ipaddr[0];
+00313         namemapptr->ipaddr[1] = ans->ipaddr[1];
+00314         
+00315         resolv_found(namemapptr->name, namemapptr->ipaddr);
+00316         return;
+00317       } else {
+00318         nameptr = nameptr + 10 + htons(ans->len);
+00319       }
+00320       --nanswers;
+00321     }
+00322   }
+00323 
+00324 }
+00325 /*---------------------------------------------------------------------------*/
+00326 /** \internal
+00327  * The main UDP function.
+00328  */
+00329 /*---------------------------------------------------------------------------*/
+00330 void
+00331 resolv_appcall(void)
+00332 {
+00333   if(uip_udp_conn->rport == HTONS(53)) {
+00334     if(uip_poll()) {
+00335       check_entries();
+00336     }
+00337     if(uip_newdata()) {
+00338       newdata();
+00339     }
+00340   }
+00341 }
+00342 /*---------------------------------------------------------------------------*/
+00343 /**
+00344  * Queues a name so that a question for the name will be sent out.
+00345  *
+00346  * \param name The hostname that is to be queried.
+00347  */
+00348 /*---------------------------------------------------------------------------*/
+00349 void
+00350 resolv_query(char *name)
+00351 {
+00352   static u8_t i;
+00353   static u8_t lseq, lseqi;
+00354   register struct namemap *nameptr;
+00355       
+00356   lseq = lseqi = 0;
+00357   
+00358   for(i = 0; i < RESOLV_ENTRIES; ++i) {
+00359     nameptr = &names[i];
+00360     if(nameptr->state == STATE_UNUSED) {
+00361       break;
+00362     }
+00363     if(seqno - nameptr->seqno > lseq) {
+00364       lseq = seqno - nameptr->seqno;
+00365       lseqi = i;
+00366     }
+00367   }
+00368 
+00369   if(i == RESOLV_ENTRIES) {
+00370     i = lseqi;
+00371     nameptr = &names[i];
+00372   }
+00373 
+00374   /*  printf("Using entry %d\n", i);*/
+00375 
+00376   strcpy(nameptr->name, name);
+00377   nameptr->state = STATE_NEW;
+00378   nameptr->seqno = seqno;
+00379   ++seqno;
+00380 }
+00381 /*---------------------------------------------------------------------------*/
+00382 /**
+00383  * Look up a hostname in the array of known hostnames.
+00384  *
+00385  * \note This function only looks in the internal array of known
+00386  * hostnames, it does not send out a query for the hostname if none
+00387  * was found. The function resolv_query() can be used to send a query
+00388  * for a hostname.
+00389  *
+00390  * \return A pointer to a 4-byte representation of the hostname's IP
+00391  * address, or NULL if the hostname was not found in the array of
+00392  * hostnames.
+00393  */
+00394 /*---------------------------------------------------------------------------*/
+00395 u16_t *
+00396 resolv_lookup(char *name)
+00397 {
+00398   static u8_t i;
+00399   struct namemap *nameptr;
+00400   
+00401   /* Walk through the list to see if the name is in there. If it is
+00402      not, we return NULL. */
+00403   for(i = 0; i < RESOLV_ENTRIES; ++i) {
+00404     nameptr = &names[i];
+00405     if(nameptr->state == STATE_DONE &&
+00406        strcmp(name, nameptr->name) == 0) {
+00407       return nameptr->ipaddr;
+00408     }
+00409   }
+00410   return NULL;
+00411 }
+00412 /*---------------------------------------------------------------------------*/
+00413 /**
+00414  * Obtain the currently configured DNS server.
+00415  *
+00416  * \return A pointer to a 4-byte representation of the IP address of
+00417  * the currently configured DNS server or NULL if no DNS server has
+00418  * been configured.
+00419  */
+00420 /*---------------------------------------------------------------------------*/
+00421 u16_t *
+00422 resolv_getserver(void)
+00423 {
+00424   if(resolv_conn == NULL) {
+00425     return NULL;
+00426   }
+00427   return resolv_conn->ripaddr;
+00428 }
+00429 /*---------------------------------------------------------------------------*/
+00430 /**
+00431  * Configure which DNS server to use for queries.
+00432  *
+00433  * \param dnsserver A pointer to a 4-byte representation of the IP
+00434  * address of the DNS server to be configured.
+00435  */
+00436 /*---------------------------------------------------------------------------*/
+00437 void
+00438 resolv_conf(u16_t *dnsserver)
+00439 {
+00440   if(resolv_conn != NULL) {
+00441     uip_udp_remove(resolv_conn);
+00442   }
+00443   
+00444   resolv_conn = uip_udp_new(dnsserver, HTONS(53));
+00445 }
+00446 /*---------------------------------------------------------------------------*/
+00447 /**
+00448  * Initalize the resolver.
+00449  */
+00450 /*---------------------------------------------------------------------------*/
+00451 void
+00452 resolv_init(void)
+00453 {
+00454   static u8_t i;
+00455   
+00456   for(i = 0; i < RESOLV_ENTRIES; ++i) {
+00457     names[i].state = STATE_DONE;
+00458   }
+00459 
+00460 }
+00461 /*---------------------------------------------------------------------------*/
+00462 
+00463 /** @} */
+00464 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00173.html b/third_party/uip-1.0/doc/html/a00173.html new file mode 100644 index 0000000..dcd2f41 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00173.html @@ -0,0 +1,100 @@ + + +uIP 1.0: apps/resolv/resolv.h Source File + + + + + + +

apps/resolv/resolv.h

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup resolv
+00003  * @{
+00004  */
+00005 /**
+00006  * \file
+00007  * DNS resolver code header file.
+00008  * \author Adam Dunkels <adam@dunkels.com>
+00009  */
+00010 
+00011 /*
+00012  * Copyright (c) 2002-2003, Adam Dunkels.
+00013  * All rights reserved.
+00014  *
+00015  * Redistribution and use in source and binary forms, with or without
+00016  * modification, are permitted provided that the following conditions
+00017  * are met:
+00018  * 1. Redistributions of source code must retain the above copyright
+00019  *    notice, this list of conditions and the following disclaimer.
+00020  * 2. Redistributions in binary form must reproduce the above copyright
+00021  *    notice, this list of conditions and the following disclaimer in the
+00022  *    documentation and/or other materials provided with the distribution.
+00023  * 3. The name of the author may not be used to endorse or promote
+00024  *    products derived from this software without specific prior
+00025  *    written permission.
+00026  *
+00027  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00028  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00029  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00030  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00031  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00032  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00033  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00034  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00035  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00036  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00037  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00038  *
+00039  * This file is part of the uIP TCP/IP stack.
+00040  *
+00041  * $Id: resolv.h,v 1.4 2006/06/11 21:46:37 adam Exp $
+00042  *
+00043  */
+00044 #ifndef __RESOLV_H__
+00045 #define __RESOLV_H__
+00046 
+00047 typedef int uip_udp_appstate_t;
+00048 void resolv_appcall(void);
+00049 #define UIP_UDP_APPCALL resolv_appcall
+00050 
+00051 #include "uipopt.h"
+00052 
+00053 /**
+00054  * Callback function which is called when a hostname is found.
+00055  *
+00056  * This function must be implemented by the module that uses the DNS
+00057  * resolver. It is called when a hostname is found, or when a hostname
+00058  * was not found.
+00059  *
+00060  * \param name A pointer to the name that was looked up.  \param
+00061  * ipaddr A pointer to a 4-byte array containing the IP address of the
+00062  * hostname, or NULL if the hostname could not be found.
+00063  */
+00064 void resolv_found(char *name, u16_t *ipaddr);
+00065 
+00066 /* Functions. */
+00067 void resolv_conf(u16_t *dnsserver);
+00068 u16_t *resolv_getserver(void);
+00069 void resolv_init(void);
+00070 u16_t *resolv_lookup(char *name);
+00071 void resolv_query(char *name);
+00072 
+00073 #endif /* __RESOLV_H__ */
+00074 
+00075 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00174.html b/third_party/uip-1.0/doc/html/a00174.html new file mode 100644 index 0000000..611a5bb --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00174.html @@ -0,0 +1,287 @@ + + +uIP 1.0: apps/smtp/smtp.c Source File + + + + + + +

apps/smtp/smtp.c

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup apps
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \defgroup smtp SMTP E-mail sender
+00008  * @{
+00009  *
+00010  * The Simple Mail Transfer Protocol (SMTP) as defined by RFC821 is
+00011  * the standard way of sending and transfering e-mail on the
+00012  * Internet. This simple example implementation is intended as an
+00013  * example of how to implement protocols in uIP, and is able to send
+00014  * out e-mail but has not been extensively tested.
+00015  */
+00016 
+00017 /**
+00018  * \file
+00019  * SMTP example implementation
+00020  * \author Adam Dunkels <adam@dunkels.com>
+00021  */
+00022 
+00023 /*
+00024  * Copyright (c) 2004, Adam Dunkels.
+00025  * All rights reserved.
+00026  *
+00027  * Redistribution and use in source and binary forms, with or without
+00028  * modification, are permitted provided that the following conditions
+00029  * are met:
+00030  * 1. Redistributions of source code must retain the above copyright
+00031  *    notice, this list of conditions and the following disclaimer.
+00032  * 2. Redistributions in binary form must reproduce the above copyright
+00033  *    notice, this list of conditions and the following disclaimer in the
+00034  *    documentation and/or other materials provided with the distribution.
+00035  * 3. Neither the name of the Institute nor the names of its contributors
+00036  *    may be used to endorse or promote products derived from this software
+00037  *    without specific prior written permission.
+00038  *
+00039  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00040  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00041  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00042  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00043  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00044  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00045  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00046  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00047  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00048  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00049  * SUCH DAMAGE.
+00050  *
+00051  * This file is part of the uIP TCP/IP stack.
+00052  *
+00053  * Author: Adam Dunkels <adam@sics.se>
+00054  *
+00055  * $Id: smtp.c,v 1.4 2006/06/11 21:46:37 adam Exp $
+00056  */
+00057 #include "smtp.h"
+00058 
+00059 #include "smtp-strings.h"
+00060 #include "psock.h"
+00061 #include "uip.h"
+00062 
+00063 #include <string.h>
+00064 
+00065 static struct smtp_state s;
+00066 
+00067 static char *localhostname;
+00068 static uip_ipaddr_t smtpserver;
+00069 
+00070 #define ISO_nl 0x0a
+00071 #define ISO_cr 0x0d
+00072 
+00073 #define ISO_period 0x2e
+00074 
+00075 #define ISO_2  0x32
+00076 #define ISO_3  0x33
+00077 #define ISO_4  0x34
+00078 #define ISO_5  0x35
+00079 
+00080 
+00081 /*---------------------------------------------------------------------------*/
+00082 static
+00083 PT_THREAD(smtp_thread(void))
+00084 {
+00085   PSOCK_BEGIN(&s.psock);
+00086 
+00087   PSOCK_READTO(&s.psock, ISO_nl);
+00088    
+00089   if(strncmp(s.inputbuffer, smtp_220, 3) != 0) {
+00090     PSOCK_CLOSE(&s.psock);
+00091     smtp_done(2);
+00092     PSOCK_EXIT(&s.psock);
+00093   }
+00094   
+00095   PSOCK_SEND_STR(&s.psock, (char *)smtp_helo);
+00096   PSOCK_SEND_STR(&s.psock, localhostname);
+00097   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00098 
+00099   PSOCK_READTO(&s.psock, ISO_nl);
+00100   
+00101   if(s.inputbuffer[0] != ISO_2) {
+00102     PSOCK_CLOSE(&s.psock);
+00103     smtp_done(3);
+00104     PSOCK_EXIT(&s.psock);
+00105   }
+00106 
+00107   PSOCK_SEND_STR(&s.psock, (char *)smtp_mail_from);
+00108   PSOCK_SEND_STR(&s.psock, s.from);
+00109   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00110 
+00111   PSOCK_READTO(&s.psock, ISO_nl);
+00112   
+00113   if(s.inputbuffer[0] != ISO_2) {
+00114     PSOCK_CLOSE(&s.psock);
+00115     smtp_done(4);
+00116     PSOCK_EXIT(&s.psock);
+00117   }
+00118 
+00119   PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to);
+00120   PSOCK_SEND_STR(&s.psock, s.to);
+00121   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00122 
+00123   PSOCK_READTO(&s.psock, ISO_nl);
+00124   
+00125   if(s.inputbuffer[0] != ISO_2) {
+00126     PSOCK_CLOSE(&s.psock);
+00127     smtp_done(5);
+00128     PSOCK_EXIT(&s.psock);
+00129   }
+00130   
+00131   if(s.cc != 0) {
+00132     PSOCK_SEND_STR(&s.psock, (char *)smtp_rcpt_to);
+00133     PSOCK_SEND_STR(&s.psock, s.cc);
+00134     PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00135 
+00136     PSOCK_READTO(&s.psock, ISO_nl);
+00137   
+00138     if(s.inputbuffer[0] != ISO_2) {
+00139       PSOCK_CLOSE(&s.psock);
+00140       smtp_done(6);
+00141       PSOCK_EXIT(&s.psock);
+00142     }
+00143   }
+00144   
+00145   PSOCK_SEND_STR(&s.psock, (char *)smtp_data);
+00146   
+00147   PSOCK_READTO(&s.psock, ISO_nl);
+00148   
+00149   if(s.inputbuffer[0] != ISO_3) {
+00150     PSOCK_CLOSE(&s.psock);
+00151     smtp_done(7);
+00152     PSOCK_EXIT(&s.psock);
+00153   }
+00154 
+00155   PSOCK_SEND_STR(&s.psock, (char *)smtp_to);
+00156   PSOCK_SEND_STR(&s.psock, s.to);
+00157   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00158   
+00159   if(s.cc != 0) {
+00160     PSOCK_SEND_STR(&s.psock, (char *)smtp_cc);
+00161     PSOCK_SEND_STR(&s.psock, s.cc);
+00162     PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00163   }
+00164   
+00165   PSOCK_SEND_STR(&s.psock, (char *)smtp_from);
+00166   PSOCK_SEND_STR(&s.psock, s.from);
+00167   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00168   
+00169   PSOCK_SEND_STR(&s.psock, (char *)smtp_subject);
+00170   PSOCK_SEND_STR(&s.psock, s.subject);
+00171   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnl);
+00172 
+00173   PSOCK_SEND(&s.psock, s.msg, s.msglen);
+00174   
+00175   PSOCK_SEND_STR(&s.psock, (char *)smtp_crnlperiodcrnl);
+00176 
+00177   PSOCK_READTO(&s.psock, ISO_nl);
+00178   if(s.inputbuffer[0] != ISO_2) {
+00179     PSOCK_CLOSE(&s.psock);
+00180     smtp_done(8);
+00181     PSOCK_EXIT(&s.psock);
+00182   }
+00183 
+00184   PSOCK_SEND_STR(&s.psock, (char *)smtp_quit);
+00185   smtp_done(SMTP_ERR_OK);
+00186   PSOCK_END(&s.psock);
+00187 }
+00188 /*---------------------------------------------------------------------------*/
+00189 void
+00190 smtp_appcall(void)
+00191 {
+00192   if(uip_closed()) {
+00193     s.connected = 0;
+00194     return;
+00195   }
+00196   if(uip_aborted() || uip_timedout()) {
+00197     s.connected = 0;
+00198     smtp_done(1);
+00199     return;
+00200   }
+00201   smtp_thread();
+00202 }
+00203 /*---------------------------------------------------------------------------*/
+00204 /**
+00205  * Specificy an SMTP server and hostname.
+00206  *
+00207  * This function is used to configure the SMTP module with an SMTP
+00208  * server and the hostname of the host.
+00209  *
+00210  * \param lhostname The hostname of the uIP host.
+00211  *
+00212  * \param server A pointer to a 4-byte array representing the IP
+00213  * address of the SMTP server to be configured.
+00214  */
+00215 void
+00216 smtp_configure(char *lhostname, void *server)
+00217 {
+00218   localhostname = lhostname;
+00219   uip_ipaddr_copy(smtpserver, server);
+00220 }
+00221 /*---------------------------------------------------------------------------*/
+00222 /**
+00223  * Send an e-mail.
+00224  *
+00225  * \param to The e-mail address of the receiver of the e-mail.
+00226  * \param cc The e-mail address of the CC: receivers of the e-mail.
+00227  * \param from The e-mail address of the sender of the e-mail.
+00228  * \param subject The subject of the e-mail.
+00229  * \param msg The actual e-mail message.
+00230  * \param msglen The length of the e-mail message.
+00231  */
+00232 unsigned char
+00233 smtp_send(char *to, char *cc, char *from,
+00234           char *subject, char *msg, u16_t msglen)
+00235 {
+00236   struct uip_conn *conn;
+00237 
+00238   conn = uip_connect(smtpserver, HTONS(25));
+00239   if(conn == NULL) {
+00240     return 0;
+00241   }
+00242   s.connected = 1;
+00243   s.to = to;
+00244   s.cc = cc;
+00245   s.from = from;
+00246   s.subject = subject;
+00247   s.msg = msg;
+00248   s.msglen = msglen;
+00249 
+00250   PSOCK_INIT(&s.psock, s.inputbuffer, sizeof(s.inputbuffer));
+00251   
+00252   return 1;
+00253 }
+00254 /*---------------------------------------------------------------------------*/
+00255 void
+00256 smtp_init(void)
+00257 {
+00258   s.connected = 0;
+00259 }
+00260 /*---------------------------------------------------------------------------*/
+00261 /** @} */
+00262 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00175.html b/third_party/uip-1.0/doc/html/a00175.html new file mode 100644 index 0000000..9f7ddea --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00175.html @@ -0,0 +1,128 @@ + + +uIP 1.0: apps/smtp/smtp.h Source File + + + + + + +

apps/smtp/smtp.h

Go to the documentation of this file.
00001 
+00002 /**
+00003  * \addtogroup smtp
+00004  * @{
+00005  */
+00006 
+00007 
+00008 /**
+00009  * \file
+00010  * SMTP header file
+00011  * \author Adam Dunkels <adam@dunkels.com>
+00012  */
+00013 
+00014 /*
+00015  * Copyright (c) 2002, Adam Dunkels.
+00016  * All rights reserved.
+00017  *
+00018  * Redistribution and use in source and binary forms, with or without
+00019  * modification, are permitted provided that the following conditions
+00020  * are met:
+00021  * 1. Redistributions of source code must retain the above copyright
+00022  *    notice, this list of conditions and the following disclaimer.
+00023  * 2. Redistributions in binary form must reproduce the above copyright
+00024  *    notice, this list of conditions and the following disclaimer in the
+00025  *    documentation and/or other materials provided with the distribution.
+00026  * 3. The name of the author may not be used to endorse or promote
+00027  *    products derived from this software without specific prior
+00028  *    written permission.
+00029  *
+00030  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00031  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00032  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00033  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00034  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00035  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00036  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00037  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00038  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00039  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00040  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00041  *
+00042  * This file is part of the uIP TCP/IP stack.
+00043  *
+00044  * $Id: smtp.h,v 1.4 2006/06/11 21:46:37 adam Exp $
+00045  *
+00046  */
+00047 #ifndef __SMTP_H__
+00048 #define __SMTP_H__
+00049 
+00050 #include "uipopt.h"
+00051 
+00052 /**
+00053  * Error number that signifies a non-error condition.
+00054  */
+00055 #define SMTP_ERR_OK 0
+00056 
+00057 /**
+00058  * Callback function that is called when an e-mail transmission is
+00059  * done.
+00060  *
+00061  * This function must be implemented by the module that uses the SMTP
+00062  * module.
+00063  *
+00064  * \param error The number of the error if an error occured, or
+00065  * SMTP_ERR_OK.
+00066  */
+00067 void smtp_done(unsigned char error);
+00068 
+00069 void smtp_init(void);
+00070 
+00071 /* Functions. */
+00072 void smtp_configure(char *localhostname, u16_t *smtpserver);
+00073 unsigned char smtp_send(char *to, char *from,
+00074                         char *subject, char *msg,
+00075                         u16_t msglen);
+00076 #define SMTP_SEND(to, cc, from, subject, msg) \
+00077         smtp_send(to, cc, from, subject, msg, strlen(msg))
+00078 
+00079 void smtp_appcall(void);
+00080 
+00081 struct smtp_state {
+00082   u8_t state;
+00083   char *to;
+00084   char *from;
+00085   char *subject;
+00086   char *msg;
+00087   u16_t msglen;
+00088   
+00089   u16_t sentlen, textlen;
+00090   u16_t sendptr;
+00091 
+00092 };
+00093 
+00094 
+00095 #ifndef UIP_APPCALL
+00096 #define UIP_APPCALL     smtp_appcall
+00097 #endif
+00098 typedef struct smtp_state uip_tcp_appstate_t;
+00099 
+00100 
+00101 #endif /* __SMTP_H__ */
+00102 
+00103 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00176.html b/third_party/uip-1.0/doc/html/a00176.html new file mode 100644 index 0000000..2385ff0 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00176.html @@ -0,0 +1,148 @@ + + +uIP 1.0: apps/telnetd/shell.c Source File + + + + + + +

apps/telnetd/shell.c

00001  /*
+00002  * Copyright (c) 2003, Adam Dunkels.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. The name of the author may not be used to endorse or promote
+00014  *    products derived from this software without specific prior
+00015  *    written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00018  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00019  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00021  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00023  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00024  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00025  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00026  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00027  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack.
+00030  *
+00031  * $Id: shell.c,v 1.1 2006/06/07 09:43:54 adam Exp $
+00032  *
+00033  */
+00034 
+00035 #include "shell.h"
+00036 
+00037 #include <string.h>
+00038 
+00039 struct ptentry {
+00040   char *commandstr;
+00041   void (* pfunc)(char *str);
+00042 };
+00043 
+00044 #define SHELL_PROMPT "uIP 1.0> "
+00045 
+00046 /*---------------------------------------------------------------------------*/
+00047 static void
+00048 parse(register char *str, struct ptentry *t)
+00049 {
+00050   struct ptentry *p;
+00051   for(p = t; p->commandstr != NULL; ++p) {
+00052     if(strncmp(p->commandstr, str, strlen(p->commandstr)) == 0) {
+00053       break;
+00054     }
+00055   }
+00056 
+00057   p->pfunc(str);
+00058 }
+00059 /*---------------------------------------------------------------------------*/
+00060 static void
+00061 inttostr(register char *str, unsigned int i)
+00062 {
+00063   str[0] = '0' + i / 100;
+00064   if(str[0] == '0') {
+00065     str[0] = ' ';
+00066   }
+00067   str[1] = '0' + (i / 10) % 10;
+00068   if(str[0] == ' ' && str[1] == '0') {
+00069     str[1] = ' ';
+00070   }
+00071   str[2] = '0' + i % 10;
+00072   str[3] = ' ';
+00073   str[4] = 0;
+00074 }
+00075 /*---------------------------------------------------------------------------*/
+00076 static void
+00077 help(char *str)
+00078 {
+00079   shell_output("Available commands:", "");
+00080   shell_output("stats   - show network statistics", "");
+00081   shell_output("conn    - show TCP connections", "");
+00082   shell_output("help, ? - show help", "");
+00083   shell_output("exit    - exit shell", "");
+00084 }
+00085 /*---------------------------------------------------------------------------*/
+00086 static void
+00087 unknown(char *str)
+00088 {
+00089   if(strlen(str) > 0) {
+00090     shell_output("Unknown command: ", str);
+00091   }
+00092 }
+00093 /*---------------------------------------------------------------------------*/
+00094 static struct ptentry parsetab[] =
+00095   {{"stats", help},
+00096    {"conn", help},
+00097    {"help", help},
+00098    {"exit", shell_quit},
+00099    {"?", help},
+00100 
+00101    /* Default action */
+00102    {NULL, unknown}};
+00103 /*---------------------------------------------------------------------------*/
+00104 void
+00105 shell_init(void)
+00106 {
+00107 }
+00108 /*---------------------------------------------------------------------------*/
+00109 void
+00110 shell_start(void)
+00111 {
+00112   shell_output("uIP command shell", "");
+00113   shell_output("Type '?' and return for help", "");
+00114   shell_prompt(SHELL_PROMPT);
+00115 }
+00116 /*---------------------------------------------------------------------------*/
+00117 void
+00118 shell_input(char *cmd)
+00119 {
+00120   parse(cmd, parsetab);
+00121   shell_prompt(SHELL_PROMPT);
+00122 }
+00123 /*---------------------------------------------------------------------------*/
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00177.html b/third_party/uip-1.0/doc/html/a00177.html new file mode 100644 index 0000000..39296cb --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00177.html @@ -0,0 +1,129 @@ + + +uIP 1.0: apps/telnetd/shell.h Source File + + + + + + +

apps/telnetd/shell.h

Go to the documentation of this file.
00001 /**
+00002  * \file
+00003  * Interface for the Contiki shell.
+00004  * \author Adam Dunkels <adam@dunkels.com>
+00005  *
+00006  * Some of the functions declared in this file must be implemented as
+00007  * a shell back-end in the architecture specific files of a Contiki
+00008  * port.
+00009  */
+00010 
+00011 
+00012 /*
+00013  * Copyright (c) 2003, Adam Dunkels.
+00014  * All rights reserved.
+00015  *
+00016  * Redistribution and use in source and binary forms, with or without
+00017  * modification, are permitted provided that the following conditions
+00018  * are met:
+00019  * 1. Redistributions of source code must retain the above copyright
+00020  *    notice, this list of conditions and the following disclaimer.
+00021  * 2. Redistributions in binary form must reproduce the above copyright
+00022  *    notice, this list of conditions and the following disclaimer in the
+00023  *    documentation and/or other materials provided with the distribution.
+00024  * 3. The name of the author may not be used to endorse or promote
+00025  *    products derived from this software without specific prior
+00026  *    written permission.
+00027  *
+00028  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00029  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00030  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00031  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00032  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00033  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00034  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00035  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00036  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00037  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00038  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00039  *
+00040  * This file is part of the Contiki desktop OS.
+00041  *
+00042  * $Id: shell.h,v 1.1 2006/06/07 09:43:54 adam Exp $
+00043  *
+00044  */
+00045 #ifndef __SHELL_H__
+00046 #define __SHELL_H__
+00047 
+00048 /**
+00049  * Initialize the shell.
+00050  *
+00051  * Called when the shell front-end process starts. This function may
+00052  * be used to start listening for signals.
+00053  */
+00054 void shell_init(void);
+00055 
+00056 /**
+00057  * Start the shell back-end.
+00058  *
+00059  * Called by the front-end when a new shell is started.
+00060  */
+00061 void shell_start(void);
+00062 
+00063 /**
+00064  * Process a shell command.
+00065  *
+00066  * This function will be called by the shell GUI / telnet server whan
+00067  * a command has been entered that should be processed by the shell
+00068  * back-end.
+00069  *
+00070  * \param command The command to be processed.
+00071  */
+00072 void shell_input(char *command);
+00073 
+00074 /**
+00075  * Quit the shell.
+00076  *
+00077  */
+00078 void shell_quit(char *);
+00079 
+00080 
+00081 /**
+00082  * Print a string to the shell window.
+00083  *
+00084  * This function is implemented by the shell GUI / telnet server and
+00085  * can be called by the shell back-end to output a string in the
+00086  * shell window. The string is automatically appended with a linebreak.
+00087  *
+00088  * \param str1 The first half of the string to be output.
+00089  * \param str2 The second half of the string to be output.
+00090  */
+00091 void shell_output(char *str1, char *str2);
+00092 
+00093 /**
+00094  * Print a prompt to the shell window.
+00095  *
+00096  * This function can be used by the shell back-end to print out a
+00097  * prompt to the shell window.
+00098  *
+00099  * \param prompt The prompt to be printed.
+00100  *
+00101  */
+00102 void shell_prompt(char *prompt);
+00103 
+00104 #endif /* __SHELL_H__ */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00178.html b/third_party/uip-1.0/doc/html/a00178.html new file mode 100644 index 0000000..b05a055 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00178.html @@ -0,0 +1,375 @@ + + +uIP 1.0: apps/telnetd/telnetd.c Source File + + + + + + +

apps/telnetd/telnetd.c

00001 /*
+00002  * Copyright (c) 2003, Adam Dunkels.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. The name of the author may not be used to endorse or promote
+00014  *    products derived from this software without specific prior
+00015  *    written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00018  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00019  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00021  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00023  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00024  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00025  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00026  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00027  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * $Id: telnetd.c,v 1.2 2006/06/07 09:43:54 adam Exp $
+00032  *
+00033  */
+00034 
+00035 #include "uip.h"
+00036 #include "telnetd.h"
+00037 #include "memb.h"
+00038 #include "shell.h"
+00039 
+00040 #include <string.h>
+00041 
+00042 #define ISO_nl       0x0a
+00043 #define ISO_cr       0x0d
+00044 
+00045 struct telnetd_line {
+00046   char line[TELNETD_CONF_LINELEN];
+00047 };
+00048 MEMB(linemem, struct telnetd_line, TELNETD_CONF_NUMLINES);
+00049 
+00050 #define STATE_NORMAL 0
+00051 #define STATE_IAC    1
+00052 #define STATE_WILL   2
+00053 #define STATE_WONT   3
+00054 #define STATE_DO     4
+00055 #define STATE_DONT   5
+00056 #define STATE_CLOSE  6
+00057 
+00058 static struct telnetd_state s;
+00059 
+00060 #define TELNET_IAC   255
+00061 #define TELNET_WILL  251
+00062 #define TELNET_WONT  252
+00063 #define TELNET_DO    253
+00064 #define TELNET_DONT  254
+00065 /*---------------------------------------------------------------------------*/
+00066 static char *
+00067 alloc_line(void)
+00068 {
+00069   return memb_alloc(&linemem);
+00070 }
+00071 /*---------------------------------------------------------------------------*/
+00072 static void
+00073 dealloc_line(char *line)
+00074 {
+00075   memb_free(&linemem, line);
+00076 }
+00077 /*---------------------------------------------------------------------------*/
+00078 void
+00079 shell_quit(char *str)
+00080 {
+00081   s.state = STATE_CLOSE;
+00082 }
+00083 /*---------------------------------------------------------------------------*/
+00084 static void
+00085 sendline(char *line)
+00086 {
+00087   static unsigned int i;
+00088   
+00089   for(i = 0; i < TELNETD_CONF_NUMLINES; ++i) {
+00090     if(s.lines[i] == NULL) {
+00091       s.lines[i] = line;
+00092       break;
+00093     }
+00094   }
+00095   if(i == TELNETD_CONF_NUMLINES) {
+00096     dealloc_line(line);
+00097   }
+00098 }
+00099 /*---------------------------------------------------------------------------*/
+00100 void
+00101 shell_prompt(char *str)
+00102 {
+00103   char *line;
+00104   line = alloc_line();
+00105   if(line != NULL) {
+00106     strncpy(line, str, TELNETD_CONF_LINELEN);
+00107     /*    petsciiconv_toascii(line, TELNETD_CONF_LINELEN);*/
+00108     sendline(line);
+00109   }
+00110 }
+00111 /*---------------------------------------------------------------------------*/
+00112 void
+00113 shell_output(char *str1, char *str2)
+00114 {
+00115   static unsigned len;
+00116   char *line;
+00117 
+00118   line = alloc_line();
+00119   if(line != NULL) {
+00120     len = strlen(str1);
+00121     strncpy(line, str1, TELNETD_CONF_LINELEN);
+00122     if(len < TELNETD_CONF_LINELEN) {
+00123       strncpy(line + len, str2, TELNETD_CONF_LINELEN - len);
+00124     }
+00125     len = strlen(line);
+00126     if(len < TELNETD_CONF_LINELEN - 2) {
+00127       line[len] = ISO_cr;
+00128       line[len+1] = ISO_nl;
+00129       line[len+2] = 0;
+00130     }
+00131     /*    petsciiconv_toascii(line, TELNETD_CONF_LINELEN);*/
+00132     sendline(line);
+00133   }
+00134 }
+00135 /*---------------------------------------------------------------------------*/
+00136 void
+00137 telnetd_init(void)
+00138 {
+00139   uip_listen(HTONS(23));
+00140   memb_init(&linemem);
+00141   shell_init();
+00142 }
+00143 /*---------------------------------------------------------------------------*/
+00144 static void
+00145 acked(void)
+00146 {
+00147   static unsigned int i;
+00148   
+00149   while(s.numsent > 0) {
+00150     dealloc_line(s.lines[0]);
+00151     for(i = 1; i < TELNETD_CONF_NUMLINES; ++i) {
+00152       s.lines[i - 1] = s.lines[i];
+00153     }
+00154     s.lines[TELNETD_CONF_NUMLINES - 1] = NULL;
+00155     --s.numsent;
+00156   }
+00157 }
+00158 /*---------------------------------------------------------------------------*/
+00159 static void
+00160 senddata(void)
+00161 {
+00162   static char *bufptr, *lineptr;
+00163   static int buflen, linelen;
+00164   
+00165   bufptr = uip_appdata;
+00166   buflen = 0;
+00167   for(s.numsent = 0; s.numsent < TELNETD_CONF_NUMLINES &&
+00168         s.lines[s.numsent] != NULL ; ++s.numsent) {
+00169     lineptr = s.lines[s.numsent];
+00170     linelen = strlen(lineptr);
+00171     if(linelen > TELNETD_CONF_LINELEN) {
+00172       linelen = TELNETD_CONF_LINELEN;
+00173     }
+00174     if(buflen + linelen < uip_mss()) {
+00175       memcpy(bufptr, lineptr, linelen);
+00176       bufptr += linelen;
+00177       buflen += linelen;
+00178     } else {
+00179       break;
+00180     }
+00181   }
+00182   uip_send(uip_appdata, buflen);
+00183 }
+00184 /*---------------------------------------------------------------------------*/
+00185 static void
+00186 closed(void)
+00187 {
+00188   static unsigned int i;
+00189   
+00190   for(i = 0; i < TELNETD_CONF_NUMLINES; ++i) {
+00191     if(s.lines[i] != NULL) {
+00192       dealloc_line(s.lines[i]);
+00193     }
+00194   }
+00195 }
+00196 /*---------------------------------------------------------------------------*/
+00197 static void
+00198 get_char(u8_t c)
+00199 {
+00200   if(c == ISO_cr) {
+00201     return;
+00202   }
+00203   
+00204   s.buf[(int)s.bufptr] = c;
+00205   if(s.buf[(int)s.bufptr] == ISO_nl ||
+00206      s.bufptr == sizeof(s.buf) - 1) {
+00207     if(s.bufptr > 0) {
+00208       s.buf[(int)s.bufptr] = 0;
+00209       /*      petsciiconv_topetscii(s.buf, TELNETD_CONF_LINELEN);*/
+00210     }
+00211     shell_input(s.buf);
+00212     s.bufptr = 0;
+00213   } else {
+00214     ++s.bufptr;
+00215   }
+00216 }
+00217 /*---------------------------------------------------------------------------*/
+00218 static void
+00219 sendopt(u8_t option, u8_t value)
+00220 {
+00221   char *line;
+00222   line = alloc_line();
+00223   if(line != NULL) {
+00224     line[0] = TELNET_IAC;
+00225     line[1] = option;
+00226     line[2] = value;
+00227     line[3] = 0;
+00228     sendline(line);
+00229   }
+00230 }
+00231 /*---------------------------------------------------------------------------*/
+00232 static void
+00233 newdata(void)
+00234 {
+00235   u16_t len;
+00236   u8_t c;
+00237   char *dataptr;
+00238     
+00239   
+00240   len = uip_datalen();
+00241   dataptr = (char *)uip_appdata;
+00242   
+00243   while(len > 0 && s.bufptr < sizeof(s.buf)) {
+00244     c = *dataptr;
+00245     ++dataptr;
+00246     --len;
+00247     switch(s.state) {
+00248     case STATE_IAC:
+00249       if(c == TELNET_IAC) {
+00250         get_char(c);
+00251         s.state = STATE_NORMAL;
+00252       } else {
+00253         switch(c) {
+00254         case TELNET_WILL:
+00255           s.state = STATE_WILL;
+00256           break;
+00257         case TELNET_WONT:
+00258           s.state = STATE_WONT;
+00259           break;
+00260         case TELNET_DO:
+00261           s.state = STATE_DO;
+00262           break;
+00263         case TELNET_DONT:
+00264           s.state = STATE_DONT;
+00265           break;
+00266         default:
+00267           s.state = STATE_NORMAL;
+00268           break;
+00269         }
+00270       }
+00271       break;
+00272     case STATE_WILL:
+00273       /* Reply with a DONT */
+00274       sendopt(TELNET_DONT, c);
+00275       s.state = STATE_NORMAL;
+00276       break;
+00277       
+00278     case STATE_WONT:
+00279       /* Reply with a DONT */
+00280       sendopt(TELNET_DONT, c);
+00281       s.state = STATE_NORMAL;
+00282       break;
+00283     case STATE_DO:
+00284       /* Reply with a WONT */
+00285       sendopt(TELNET_WONT, c);
+00286       s.state = STATE_NORMAL;
+00287       break;
+00288     case STATE_DONT:
+00289       /* Reply with a WONT */
+00290       sendopt(TELNET_WONT, c);
+00291       s.state = STATE_NORMAL;
+00292       break;
+00293     case STATE_NORMAL:
+00294       if(c == TELNET_IAC) {
+00295         s.state = STATE_IAC;
+00296       } else {
+00297         get_char(c);
+00298       }
+00299       break;
+00300     }
+00301 
+00302     
+00303   }
+00304   
+00305 }
+00306 /*---------------------------------------------------------------------------*/
+00307 void
+00308 telnetd_appcall(void)
+00309 {
+00310   static unsigned int i;
+00311   if(uip_connected()) {
+00312     /*    tcp_markconn(uip_conn, &s);*/
+00313     for(i = 0; i < TELNETD_CONF_NUMLINES; ++i) {
+00314       s.lines[i] = NULL;
+00315     }
+00316     s.bufptr = 0;
+00317     s.state = STATE_NORMAL;
+00318 
+00319     shell_start();
+00320   }
+00321 
+00322   if(s.state == STATE_CLOSE) {
+00323     s.state = STATE_NORMAL;
+00324     uip_close();
+00325     return;
+00326   }
+00327   
+00328   if(uip_closed() ||
+00329      uip_aborted() ||
+00330      uip_timedout()) {
+00331     closed();
+00332   }
+00333   
+00334   if(uip_acked()) {
+00335     acked();
+00336   }
+00337   
+00338   if(uip_newdata()) {
+00339     newdata();
+00340   }
+00341   
+00342   if(uip_rexmit() ||
+00343      uip_newdata() ||
+00344      uip_acked() ||
+00345      uip_connected() ||
+00346      uip_poll()) {
+00347     senddata();
+00348   }
+00349 }
+00350 /*---------------------------------------------------------------------------*/
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00179.html b/third_party/uip-1.0/doc/html/a00179.html new file mode 100644 index 0000000..034d9cc --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00179.html @@ -0,0 +1,88 @@ + + +uIP 1.0: apps/telnetd/telnetd.h Source File + + + + + + +

apps/telnetd/telnetd.h

00001 /*
+00002  * Copyright (c) 2003, Adam Dunkels.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above
+00011  *    copyright notice, this list of conditions and the following
+00012  *    disclaimer in the documentation and/or other materials provided
+00013  *    with the distribution.
+00014  * 3. The name of the author may not be used to endorse or promote
+00015  *    products derived from this software without specific prior
+00016  *    written permission.
+00017  *
+00018  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00019  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00020  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00021  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00022  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00023  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00024  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00025  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00026  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00027  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00028  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00029  *
+00030  * This file is part of the uIP TCP/IP stack
+00031  *
+00032  * $Id: telnetd.h,v 1.2 2006/06/07 09:43:54 adam Exp $
+00033  *
+00034  */
+00035 #ifndef __TELNETD_H__
+00036 #define __TELNETD_H__
+00037 
+00038 #include "uipopt.h"
+00039 
+00040 void telnetd_appcall(void);
+00041 
+00042 #ifndef TELNETD_CONF_LINELEN
+00043 #define TELNETD_CONF_LINELEN 40
+00044 #endif
+00045 #ifndef TELNETD_CONF_NUMLINES
+00046 #define TELNETD_CONF_NUMLINES 16
+00047 #endif
+00048 
+00049 struct telnetd_state {
+00050   char *lines[TELNETD_CONF_NUMLINES];
+00051   char buf[TELNETD_CONF_LINELEN];
+00052   char bufptr;
+00053   u8_t numsent;
+00054   u8_t state;
+00055 };
+00056 
+00057 typedef struct telnetd_state uip_tcp_appstate_t;
+00058 
+00059 #ifndef UIP_APPCALL
+00060 #define UIP_APPCALL     telnetd_appcall
+00061 #endif
+00062 
+00063 #endif /* __TELNETD_H__ */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00180.html b/third_party/uip-1.0/doc/html/a00180.html new file mode 100644 index 0000000..d3a7a74 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00180.html @@ -0,0 +1,464 @@ + + +uIP 1.0: apps/webclient/webclient.c Source File + + + + + + +

apps/webclient/webclient.c

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup apps
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \defgroup webclient Web client
+00008  * @{
+00009  *
+00010  * This example shows a HTTP client that is able to download web pages
+00011  * and files from web servers. It requires a number of callback
+00012  * functions to be implemented by the module that utilizes the code:
+00013  * webclient_datahandler(), webclient_connected(),
+00014  * webclient_timedout(), webclient_aborted(), webclient_closed().
+00015  */
+00016 
+00017 /**
+00018  * \file
+00019  * Implementation of the HTTP client.
+00020  * \author Adam Dunkels <adam@dunkels.com>
+00021  */
+00022 
+00023 /*
+00024  * Copyright (c) 2002, Adam Dunkels.
+00025  * All rights reserved.
+00026  *
+00027  * Redistribution and use in source and binary forms, with or without
+00028  * modification, are permitted provided that the following conditions
+00029  * are met:
+00030  * 1. Redistributions of source code must retain the above copyright
+00031  *    notice, this list of conditions and the following disclaimer.
+00032  * 2. Redistributions in binary form must reproduce the above
+00033  *    copyright notice, this list of conditions and the following
+00034  *    disclaimer in the documentation and/or other materials provided
+00035  *    with the distribution.
+00036  * 3. The name of the author may not be used to endorse or promote
+00037  *    products derived from this software without specific prior
+00038  *    written permission.
+00039  *
+00040  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00041  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00042  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00043  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00044  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00045  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00046  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00047  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00048  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00049  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00050  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00051  *
+00052  * This file is part of the uIP TCP/IP stack.
+00053  *
+00054  * $Id: webclient.c,v 1.2 2006/06/11 21:46:37 adam Exp $
+00055  *
+00056  */
+00057 
+00058 #include "uip.h"
+00059 #include "uiplib.h"
+00060 #include "webclient.h"
+00061 #include "resolv.h"
+00062 
+00063 #include <string.h>
+00064 
+00065 #define WEBCLIENT_TIMEOUT 100
+00066 
+00067 #define WEBCLIENT_STATE_STATUSLINE 0
+00068 #define WEBCLIENT_STATE_HEADERS    1
+00069 #define WEBCLIENT_STATE_DATA       2
+00070 #define WEBCLIENT_STATE_CLOSE      3
+00071 
+00072 #define HTTPFLAG_NONE   0
+00073 #define HTTPFLAG_OK     1
+00074 #define HTTPFLAG_MOVED  2
+00075 #define HTTPFLAG_ERROR  3
+00076 
+00077 
+00078 #define ISO_nl       0x0a
+00079 #define ISO_cr       0x0d
+00080 #define ISO_space    0x20
+00081 
+00082 
+00083 static struct webclient_state s;
+00084 
+00085 /*-----------------------------------------------------------------------------------*/
+00086 char *
+00087 webclient_mimetype(void)
+00088 {
+00089   return s.mimetype;
+00090 }
+00091 /*-----------------------------------------------------------------------------------*/
+00092 char *
+00093 webclient_filename(void)
+00094 {
+00095   return s.file;
+00096 }
+00097 /*-----------------------------------------------------------------------------------*/
+00098 char *
+00099 webclient_hostname(void)
+00100 {
+00101   return s.host;
+00102 }
+00103 /*-----------------------------------------------------------------------------------*/
+00104 unsigned short
+00105 webclient_port(void)
+00106 {
+00107   return s.port;
+00108 }
+00109 /*-----------------------------------------------------------------------------------*/
+00110 void
+00111 webclient_init(void)
+00112 {
+00113 
+00114 }
+00115 /*-----------------------------------------------------------------------------------*/
+00116 static void
+00117 init_connection(void)
+00118 {
+00119   s.state = WEBCLIENT_STATE_STATUSLINE;
+00120 
+00121   s.getrequestleft = sizeof(http_get) - 1 + 1 +
+00122     sizeof(http_10) - 1 +
+00123     sizeof(http_crnl) - 1 +
+00124     sizeof(http_host) - 1 +
+00125     sizeof(http_crnl) - 1 +
+00126     strlen(http_user_agent_fields) +
+00127     strlen(s.file) + strlen(s.host);
+00128   s.getrequestptr = 0;
+00129 
+00130   s.httpheaderlineptr = 0;
+00131 }
+00132 /*-----------------------------------------------------------------------------------*/
+00133 void
+00134 webclient_close(void)
+00135 {
+00136   s.state = WEBCLIENT_STATE_CLOSE;
+00137 }
+00138 /*-----------------------------------------------------------------------------------*/
+00139 unsigned char
+00140 webclient_get(char *host, u16_t port, char *file)
+00141 {
+00142   struct uip_conn *conn;
+00143   uip_ipaddr_t *ipaddr;
+00144   static uip_ipaddr_t addr;
+00145   
+00146   /* First check if the host is an IP address. */
+00147   ipaddr = &addr;
+00148   if(uiplib_ipaddrconv(host, (unsigned char *)addr) == 0) {
+00149     ipaddr = (uip_ipaddr_t *)resolv_lookup(host);
+00150     
+00151     if(ipaddr == NULL) {
+00152       return 0;
+00153     }
+00154   }
+00155   
+00156   conn = uip_connect(ipaddr, htons(port));
+00157   
+00158   if(conn == NULL) {
+00159     return 0;
+00160   }
+00161   
+00162   s.port = port;
+00163   strncpy(s.file, file, sizeof(s.file));
+00164   strncpy(s.host, host, sizeof(s.host));
+00165   
+00166   init_connection();
+00167   return 1;
+00168 }
+00169 /*-----------------------------------------------------------------------------------*/
+00170 static unsigned char *
+00171 copy_string(unsigned char *dest,
+00172             const unsigned char *src, unsigned char len)
+00173 {
+00174   strncpy(dest, src, len);
+00175   return dest + len;
+00176 }
+00177 /*-----------------------------------------------------------------------------------*/
+00178 static void
+00179 senddata(void)
+00180 {
+00181   u16_t len;
+00182   char *getrequest;
+00183   char *cptr;
+00184   
+00185   if(s.getrequestleft > 0) {
+00186     cptr = getrequest = (char *)uip_appdata;
+00187 
+00188     cptr = copy_string(cptr, http_get, sizeof(http_get) - 1);
+00189     cptr = copy_string(cptr, s.file, strlen(s.file));
+00190     *cptr++ = ISO_space;
+00191     cptr = copy_string(cptr, http_10, sizeof(http_10) - 1);
+00192 
+00193     cptr = copy_string(cptr, http_crnl, sizeof(http_crnl) - 1);
+00194     
+00195     cptr = copy_string(cptr, http_host, sizeof(http_host) - 1);
+00196     cptr = copy_string(cptr, s.host, strlen(s.host));
+00197     cptr = copy_string(cptr, http_crnl, sizeof(http_crnl) - 1);
+00198 
+00199     cptr = copy_string(cptr, http_user_agent_fields,
+00200                        strlen(http_user_agent_fields));
+00201     
+00202     len = s.getrequestleft > uip_mss()?
+00203       uip_mss():
+00204       s.getrequestleft;
+00205     uip_send(&(getrequest[s.getrequestptr]), len);
+00206   }
+00207 }
+00208 /*-----------------------------------------------------------------------------------*/
+00209 static void
+00210 acked(void)
+00211 {
+00212   u16_t len;
+00213   
+00214   if(s.getrequestleft > 0) {
+00215     len = s.getrequestleft > uip_mss()?
+00216       uip_mss():
+00217       s.getrequestleft;
+00218     s.getrequestleft -= len;
+00219     s.getrequestptr += len;
+00220   }
+00221 }
+00222 /*-----------------------------------------------------------------------------------*/
+00223 static u16_t
+00224 parse_statusline(u16_t len)
+00225 {
+00226   char *cptr;
+00227   
+00228   while(len > 0 && s.httpheaderlineptr < sizeof(s.httpheaderline)) {
+00229     s.httpheaderline[s.httpheaderlineptr] = *(char *)uip_appdata;
+00230     ++((char *)uip_appdata);
+00231     --len;
+00232     if(s.httpheaderline[s.httpheaderlineptr] == ISO_nl) {
+00233 
+00234       if((strncmp(s.httpheaderline, http_10,
+00235                   sizeof(http_10) - 1) == 0) ||
+00236          (strncmp(s.httpheaderline, http_11,
+00237                   sizeof(http_11) - 1) == 0)) {
+00238         cptr = &(s.httpheaderline[9]);
+00239         s.httpflag = HTTPFLAG_NONE;
+00240         if(strncmp(cptr, http_200, sizeof(http_200) - 1) == 0) {
+00241           /* 200 OK */
+00242           s.httpflag = HTTPFLAG_OK;
+00243         } else if(strncmp(cptr, http_301, sizeof(http_301) - 1) == 0 ||
+00244                   strncmp(cptr, http_302, sizeof(http_302) - 1) == 0) {
+00245           /* 301 Moved permanently or 302 Found. Location: header line
+00246              will contain thw new location. */
+00247           s.httpflag = HTTPFLAG_MOVED;
+00248         } else {
+00249           s.httpheaderline[s.httpheaderlineptr - 1] = 0;
+00250         }
+00251       } else {
+00252         uip_abort();
+00253         webclient_aborted();
+00254         return 0;
+00255       }
+00256       
+00257       /* We're done parsing the status line, so we reset the pointer
+00258          and start parsing the HTTP headers.*/
+00259       s.httpheaderlineptr = 0;
+00260       s.state = WEBCLIENT_STATE_HEADERS;
+00261       break;
+00262     } else {
+00263       ++s.httpheaderlineptr;
+00264     }
+00265   }
+00266   return len;
+00267 }
+00268 /*-----------------------------------------------------------------------------------*/
+00269 static char
+00270 casecmp(char *str1, const char *str2, char len)
+00271 {
+00272   static char c;
+00273   
+00274   while(len > 0) {
+00275     c = *str1;
+00276     /* Force lower-case characters. */
+00277     if(c & 0x40) {
+00278       c |= 0x20;
+00279     }
+00280     if(*str2 != c) {
+00281       return 1;
+00282     }
+00283     ++str1;
+00284     ++str2;
+00285     --len;
+00286   }
+00287   return 0;
+00288 }
+00289 /*-----------------------------------------------------------------------------------*/
+00290 static u16_t
+00291 parse_headers(u16_t len)
+00292 {
+00293   char *cptr;
+00294   static unsigned char i;
+00295   
+00296   while(len > 0 && s.httpheaderlineptr < sizeof(s.httpheaderline)) {
+00297     s.httpheaderline[s.httpheaderlineptr] = *(char *)uip_appdata;
+00298     ++((char *)uip_appdata);
+00299     --len;
+00300     if(s.httpheaderline[s.httpheaderlineptr] == ISO_nl) {
+00301       /* We have an entire HTTP header line in s.httpheaderline, so
+00302          we parse it. */
+00303       if(s.httpheaderline[0] == ISO_cr) {
+00304         /* This was the last header line (i.e., and empty "\r\n"), so
+00305            we are done with the headers and proceed with the actual
+00306            data. */
+00307         s.state = WEBCLIENT_STATE_DATA;
+00308         return len;
+00309       }
+00310 
+00311       s.httpheaderline[s.httpheaderlineptr - 1] = 0;
+00312       /* Check for specific HTTP header fields. */
+00313       if(casecmp(s.httpheaderline, http_content_type,
+00314                      sizeof(http_content_type) - 1) == 0) {
+00315         /* Found Content-type field. */
+00316         cptr = strchr(s.httpheaderline, ';');
+00317         if(cptr != NULL) {
+00318           *cptr = 0;
+00319         }
+00320         strncpy(s.mimetype, s.httpheaderline +
+00321                 sizeof(http_content_type) - 1, sizeof(s.mimetype));
+00322       } else if(casecmp(s.httpheaderline, http_location,
+00323                             sizeof(http_location) - 1) == 0) {
+00324         cptr = s.httpheaderline +
+00325           sizeof(http_location) - 1;
+00326         
+00327         if(strncmp(cptr, http_http, 7) == 0) {
+00328           cptr += 7;
+00329           for(i = 0; i < s.httpheaderlineptr - 7; ++i) {
+00330             if(*cptr == 0 ||
+00331                *cptr == '/' ||
+00332                *cptr == ' ' ||
+00333                *cptr == ':') {
+00334               s.host[i] = 0;
+00335               break;
+00336             }
+00337             s.host[i] = *cptr;
+00338             ++cptr;
+00339           }
+00340         }
+00341         strncpy(s.file, cptr, sizeof(s.file));
+00342         /*      s.file[s.httpheaderlineptr - i] = 0;*/
+00343       }
+00344 
+00345 
+00346       /* We're done parsing, so we reset the pointer and start the
+00347          next line. */
+00348       s.httpheaderlineptr = 0;
+00349     } else {
+00350       ++s.httpheaderlineptr;
+00351     }
+00352   }
+00353   return len;
+00354 }
+00355 /*-----------------------------------------------------------------------------------*/
+00356 static void
+00357 newdata(void)
+00358 {
+00359   u16_t len;
+00360 
+00361   len = uip_datalen();
+00362 
+00363   if(s.state == WEBCLIENT_STATE_STATUSLINE) {
+00364     len = parse_statusline(len);
+00365   }
+00366   
+00367   if(s.state == WEBCLIENT_STATE_HEADERS && len > 0) {
+00368     len = parse_headers(len);
+00369   }
+00370 
+00371   if(len > 0 && s.state == WEBCLIENT_STATE_DATA &&
+00372      s.httpflag != HTTPFLAG_MOVED) {
+00373     webclient_datahandler((char *)uip_appdata, len);
+00374   }
+00375 }
+00376 /*-----------------------------------------------------------------------------------*/
+00377 void
+00378 webclient_appcall(void)
+00379 {
+00380   if(uip_connected()) {
+00381     s.timer = 0;
+00382     s.state = WEBCLIENT_STATE_STATUSLINE;
+00383     senddata();
+00384     webclient_connected();
+00385     return;
+00386   }
+00387 
+00388   if(s.state == WEBCLIENT_STATE_CLOSE) {
+00389     webclient_closed();
+00390     uip_abort();
+00391     return;
+00392   }
+00393 
+00394   if(uip_aborted()) {
+00395     webclient_aborted();
+00396   }
+00397   if(uip_timedout()) {
+00398     webclient_timedout();
+00399   }
+00400 
+00401   
+00402   if(uip_acked()) {
+00403     s.timer = 0;
+00404     acked();
+00405   }
+00406   if(uip_newdata()) {
+00407     s.timer = 0;
+00408     newdata();
+00409   }
+00410   if(uip_rexmit() ||
+00411      uip_newdata() ||
+00412      uip_acked()) {
+00413     senddata();
+00414   } else if(uip_poll()) {
+00415     ++s.timer;
+00416     if(s.timer == WEBCLIENT_TIMEOUT) {
+00417       webclient_timedout();
+00418       uip_abort();
+00419       return;
+00420     }
+00421         /*    senddata();*/
+00422   }
+00423 
+00424   if(uip_closed()) {
+00425     if(s.httpflag != HTTPFLAG_MOVED) {
+00426       /* Send NULL data to signal EOF. */
+00427       webclient_datahandler(NULL, 0);
+00428     } else {
+00429       if(resolv_lookup(s.host) == NULL) {
+00430         resolv_query(s.host);
+00431       }
+00432       webclient_get(s.host, s.port, s.file);
+00433     }
+00434   }
+00435 }
+00436 /*-----------------------------------------------------------------------------------*/
+00437 
+00438 /** @} */
+00439 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00181.html b/third_party/uip-1.0/doc/html/a00181.html new file mode 100644 index 0000000..ecd8163 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00181.html @@ -0,0 +1,253 @@ + + +uIP 1.0: apps/webclient/webclient.h Source File + + + + + + +

apps/webclient/webclient.h

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup webclient
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \file
+00008  * Header file for the HTTP client.
+00009  * \author Adam Dunkels <adam@dunkels.com>
+00010  */
+00011 
+00012 /*
+00013  * Copyright (c) 2002, Adam Dunkels.
+00014  * All rights reserved.
+00015  *
+00016  * Redistribution and use in source and binary forms, with or without
+00017  * modification, are permitted provided that the following conditions
+00018  * are met:
+00019  * 1. Redistributions of source code must retain the above copyright
+00020  *    notice, this list of conditions and the following disclaimer.
+00021  * 2. Redistributions in binary form must reproduce the above
+00022  *    copyright notice, this list of conditions and the following
+00023  *    disclaimer in the documentation and/or other materials provided
+00024  *    with the distribution.
+00025  * 3. The name of the author may not be used to endorse or promote
+00026  *    products derived from this software without specific prior
+00027  *    written permission.
+00028  *
+00029  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00030  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00031  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00032  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00033  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00034  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00035  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00036  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00037  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00038  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00039  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00040  *
+00041  * This file is part of the uIP TCP/IP stack.
+00042  *
+00043  * $Id: webclient.h,v 1.2 2006/06/11 21:46:37 adam Exp $
+00044  *
+00045  */
+00046 #ifndef __WEBCLIENT_H__
+00047 #define __WEBCLIENT_H__
+00048 
+00049 
+00050 #include "webclient-strings.h"
+00051 #include "uipopt.h"
+00052 
+00053 #define WEBCLIENT_CONF_MAX_URLLEN 100
+00054 
+00055 struct webclient_state {
+00056   u8_t timer;
+00057   u8_t state;
+00058   u8_t httpflag;
+00059 
+00060   u16_t port;
+00061   char host[40];
+00062   char file[WEBCLIENT_CONF_MAX_URLLEN];
+00063   u16_t getrequestptr;
+00064   u16_t getrequestleft;
+00065   
+00066   char httpheaderline[200];
+00067   u16_t httpheaderlineptr;
+00068 
+00069   char mimetype[32];
+00070 };
+00071 
+00072 typedef struct webclient_state uip_tcp_appstate_t;
+00073 #define UIP_APPCALL webclient_appcall
+00074 
+00075 /**
+00076  * Callback function that is called from the webclient code when HTTP
+00077  * data has been received.
+00078  *
+00079  * This function must be implemented by the module that uses the
+00080  * webclient code. The function is called from the webclient module
+00081  * when HTTP data has been received. The function is not called when
+00082  * HTTP headers are received, only for the actual data.
+00083  *
+00084  * \note This function is called many times, repetedly, when data is
+00085  * being received, and not once when all data has been received.
+00086  *
+00087  * \param data A pointer to the data that has been received.
+00088  * \param len The length of the data that has been received.
+00089  */
+00090 void webclient_datahandler(char *data, u16_t len);
+00091 
+00092 /**
+00093  * Callback function that is called from the webclient code when the
+00094  * HTTP connection has been connected to the web server.
+00095  *
+00096  * This function must be implemented by the module that uses the
+00097  * webclient code.
+00098  */
+00099 void webclient_connected(void);
+00100 
+00101 /**
+00102  * Callback function that is called from the webclient code if the
+00103  * HTTP connection to the web server has timed out.
+00104  *
+00105  * This function must be implemented by the module that uses the
+00106  * webclient code.
+00107  */
+00108 void webclient_timedout(void);
+00109 
+00110 /**
+00111  * Callback function that is called from the webclient code if the
+00112  * HTTP connection to the web server has been aborted by the web
+00113  * server.
+00114  *
+00115  * This function must be implemented by the module that uses the
+00116  * webclient code.
+00117  */
+00118 void webclient_aborted(void);
+00119 
+00120 /**
+00121  * Callback function that is called from the webclient code when the
+00122  * HTTP connection to the web server has been closed.
+00123  *
+00124  * This function must be implemented by the module that uses the
+00125  * webclient code.
+00126  */
+00127 void webclient_closed(void);
+00128 
+00129 
+00130 
+00131 /**
+00132  * Initialize the webclient module.
+00133  */
+00134 void webclient_init(void);
+00135 
+00136 /**
+00137  * Open an HTTP connection to a web server and ask for a file using
+00138  * the GET method.
+00139  *
+00140  * This function opens an HTTP connection to the specified web server
+00141  * and requests the specified file using the GET method. When the HTTP
+00142  * connection has been connected, the webclient_connected() callback
+00143  * function is called and when the HTTP data arrives the
+00144  * webclient_datahandler() callback function is called.
+00145  *
+00146  * The callback function webclient_timedout() is called if the web
+00147  * server could not be contacted, and the webclient_aborted() callback
+00148  * function is called if the HTTP connection is aborted by the web
+00149  * server.
+00150  *
+00151  * When the HTTP request has been completed and the HTTP connection is
+00152  * closed, the webclient_closed() callback function will be called.
+00153  *
+00154  * \note If the function is passed a host name, it must already be in
+00155  * the resolver cache in order for the function to connect to the web
+00156  * server. It is therefore up to the calling module to implement the
+00157  * resolver calls and the signal handler used for reporting a resolv
+00158  * query answer.
+00159  *
+00160  * \param host A pointer to a string containing either a host name or
+00161  * a numerical IP address in dotted decimal notation (e.g., 192.168.23.1).
+00162  *
+00163  * \param port The port number to which to connect, in host byte order.
+00164  *
+00165  * \param file A pointer to the name of the file to get.
+00166  *
+00167  * \retval 0 if the host name could not be found in the cache, or
+00168  * if a TCP connection could not be created.
+00169  *
+00170  * \retval 1 if the connection was initiated.
+00171  */
+00172 unsigned char webclient_get(char *host, u16_t port, char *file);
+00173 
+00174 /**
+00175  * Close the currently open HTTP connection.
+00176  */
+00177 void webclient_close(void);
+00178 void webclient_appcall(void);
+00179 
+00180 /**
+00181  * Obtain the MIME type of the current HTTP data stream.
+00182  *
+00183  * \return A pointer to a string contaning the MIME type. The string
+00184  * may be empty if no MIME type was reported by the web server.
+00185  */
+00186 char *webclient_mimetype(void);
+00187 
+00188 /**
+00189  * Obtain the filename of the current HTTP data stream.
+00190  *
+00191  * The filename of an HTTP request may be changed by the web server,
+00192  * and may therefore not be the same as when the original GET request
+00193  * was made with webclient_get(). This function is used for obtaining
+00194  * the current filename.
+00195  *
+00196  * \return A pointer to the current filename.
+00197  */
+00198 char *webclient_filename(void);
+00199 
+00200 /**
+00201  * Obtain the hostname of the current HTTP data stream.
+00202  *
+00203  * The hostname of the web server of an HTTP request may be changed
+00204  * by the web server, and may therefore not be the same as when the
+00205  * original GET request was made with webclient_get(). This function
+00206  * is used for obtaining the current hostname.
+00207  *
+00208  * \return A pointer to the current hostname.
+00209  */
+00210 char *webclient_hostname(void);
+00211 
+00212 /**
+00213  * Obtain the port number of the current HTTP data stream.
+00214  *
+00215  * The port number of an HTTP request may be changed by the web
+00216  * server, and may therefore not be the same as when the original GET
+00217  * request was made with webclient_get(). This function is used for
+00218  * obtaining the current port number.
+00219  *
+00220  * \return The port number of the current HTTP data stream, in host byte order.
+00221  */
+00222 unsigned short webclient_port(void);
+00223 
+00224 
+00225 
+00226 #endif /* __WEBCLIENT_H__ */
+00227 
+00228 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00182.html b/third_party/uip-1.0/doc/html/a00182.html new file mode 100644 index 0000000..d4ba218 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00182.html @@ -0,0 +1,228 @@ + + +uIP 1.0: apps/webserver/httpd-cgi.c Source File + + + + + + +

apps/webserver/httpd-cgi.c

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup httpd
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \file
+00008  *         Web server script interface
+00009  * \author
+00010  *         Adam Dunkels <adam@sics.se>
+00011  *
+00012  */
+00013 
+00014 /*
+00015  * Copyright (c) 2001-2006, Adam Dunkels.
+00016  * All rights reserved.
+00017  *
+00018  * Redistribution and use in source and binary forms, with or without
+00019  * modification, are permitted provided that the following conditions
+00020  * are met:
+00021  * 1. Redistributions of source code must retain the above copyright
+00022  *    notice, this list of conditions and the following disclaimer.
+00023  * 2. Redistributions in binary form must reproduce the above copyright
+00024  *    notice, this list of conditions and the following disclaimer in the
+00025  *    documentation and/or other materials provided with the distribution.
+00026  * 3. The name of the author may not be used to endorse or promote
+00027  *    products derived from this software without specific prior
+00028  *    written permission.
+00029  *
+00030  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00031  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00032  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00033  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00034  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00035  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00036  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00037  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00038  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00039  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00040  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00041  *
+00042  * This file is part of the uIP TCP/IP stack.
+00043  *
+00044  * $Id: httpd-cgi.c,v 1.2 2006/06/11 21:46:37 adam Exp $
+00045  *
+00046  */
+00047 
+00048 #include "uip.h"
+00049 #include "psock.h"
+00050 #include "httpd.h"
+00051 #include "httpd-cgi.h"
+00052 #include "httpd-fs.h"
+00053 
+00054 #include <stdio.h>
+00055 #include <string.h>
+00056 
+00057 HTTPD_CGI_CALL(file, "file-stats", file_stats);
+00058 HTTPD_CGI_CALL(tcp, "tcp-connections", tcp_stats);
+00059 HTTPD_CGI_CALL(net, "net-stats", net_stats);
+00060 
+00061 static const struct httpd_cgi_call *calls[] = { &file, &tcp, &net, NULL };
+00062 
+00063 /*---------------------------------------------------------------------------*/
+00064 static
+00065 PT_THREAD(nullfunction(struct httpd_state *s, char *ptr))
+00066 {
+00067   PSOCK_BEGIN(&s->sout);
+00068   PSOCK_END(&s->sout);
+00069 }
+00070 /*---------------------------------------------------------------------------*/
+00071 httpd_cgifunction
+00072 httpd_cgi(char *name)
+00073 {
+00074   const struct httpd_cgi_call **f;
+00075 
+00076   /* Find the matching name in the table, return the function. */
+00077   for(f = calls; *f != NULL; ++f) {
+00078     if(strncmp((*f)->name, name, strlen((*f)->name)) == 0) {
+00079       return (*f)->function;
+00080     }
+00081   }
+00082   return nullfunction;
+00083 }
+00084 /*---------------------------------------------------------------------------*/
+00085 static unsigned short
+00086 generate_file_stats(void *arg)
+00087 {
+00088   char *f = (char *)arg;
+00089   return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE, "%5u", httpd_fs_count(f));
+00090 }
+00091 /*---------------------------------------------------------------------------*/
+00092 static
+00093 PT_THREAD(file_stats(struct httpd_state *s, char *ptr))
+00094 {
+00095   PSOCK_BEGIN(&s->sout);
+00096 
+00097   PSOCK_GENERATOR_SEND(&s->sout, generate_file_stats, strchr(ptr, ' ') + 1);
+00098   
+00099   PSOCK_END(&s->sout);
+00100 }
+00101 /*---------------------------------------------------------------------------*/
+00102 static const char closed[] =   /*  "CLOSED",*/
+00103 {0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0};
+00104 static const char syn_rcvd[] = /*  "SYN-RCVD",*/
+00105 {0x53, 0x59, 0x4e, 0x2d, 0x52, 0x43, 0x56,
+00106  0x44,  0};
+00107 static const char syn_sent[] = /*  "SYN-SENT",*/
+00108 {0x53, 0x59, 0x4e, 0x2d, 0x53, 0x45, 0x4e,
+00109  0x54,  0};
+00110 static const char established[] = /*  "ESTABLISHED",*/
+00111 {0x45, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x49, 0x53, 0x48,
+00112  0x45, 0x44, 0};
+00113 static const char fin_wait_1[] = /*  "FIN-WAIT-1",*/
+00114 {0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,
+00115  0x54, 0x2d, 0x31, 0};
+00116 static const char fin_wait_2[] = /*  "FIN-WAIT-2",*/
+00117 {0x46, 0x49, 0x4e, 0x2d, 0x57, 0x41, 0x49,
+00118  0x54, 0x2d, 0x32, 0};
+00119 static const char closing[] = /*  "CLOSING",*/
+00120 {0x43, 0x4c, 0x4f, 0x53, 0x49,
+00121  0x4e, 0x47, 0};
+00122 static const char time_wait[] = /*  "TIME-WAIT,"*/
+00123 {0x54, 0x49, 0x4d, 0x45, 0x2d, 0x57, 0x41,
+00124  0x49, 0x54, 0};
+00125 static const char last_ack[] = /*  "LAST-ACK"*/
+00126 {0x4c, 0x41, 0x53, 0x54, 0x2d, 0x41, 0x43,
+00127  0x4b, 0};
+00128 
+00129 static const char *states[] = {
+00130   closed,
+00131   syn_rcvd,
+00132   syn_sent,
+00133   established,
+00134   fin_wait_1,
+00135   fin_wait_2,
+00136   closing,
+00137   time_wait,
+00138   last_ack};
+00139   
+00140 
+00141 static unsigned short
+00142 generate_tcp_stats(void *arg)
+00143 {
+00144   struct uip_conn *conn;
+00145   struct httpd_state *s = (struct httpd_state *)arg;
+00146     
+00147   conn = &uip_conns[s->count];
+00148   return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE,
+00149                  "<tr><td>%d</td><td>%u.%u.%u.%u:%u</td><td>%s</td><td>%u</td><td>%u</td><td>%c %c</td></tr>\r\n",
+00150                  htons(conn->lport),
+00151                  htons(conn->ripaddr[0]) >> 8,
+00152                  htons(conn->ripaddr[0]) & 0xff,
+00153                  htons(conn->ripaddr[1]) >> 8,
+00154                  htons(conn->ripaddr[1]) & 0xff,
+00155                  htons(conn->rport),
+00156                  states[conn->tcpstateflags & UIP_TS_MASK],
+00157                  conn->nrtx,
+00158                  conn->timer,
+00159                  (uip_outstanding(conn))? '*':' ',
+00160                  (uip_stopped(conn))? '!':' ');
+00161 }
+00162 /*---------------------------------------------------------------------------*/
+00163 static
+00164 PT_THREAD(tcp_stats(struct httpd_state *s, char *ptr))
+00165 {
+00166   
+00167   PSOCK_BEGIN(&s->sout);
+00168 
+00169   for(s->count = 0; s->count < UIP_CONNS; ++s->count) {
+00170     if((uip_conns[s->count].tcpstateflags & UIP_TS_MASK) != UIP_CLOSED) {
+00171       PSOCK_GENERATOR_SEND(&s->sout, generate_tcp_stats, s);
+00172     }
+00173   }
+00174 
+00175   PSOCK_END(&s->sout);
+00176 }
+00177 /*---------------------------------------------------------------------------*/
+00178 static unsigned short
+00179 generate_net_stats(void *arg)
+00180 {
+00181   struct httpd_state *s = (struct httpd_state *)arg;
+00182   return snprintf((char *)uip_appdata, UIP_APPDATA_SIZE,
+00183                   "%5u\n", ((uip_stats_t *)&uip_stat)[s->count]);
+00184 }
+00185 
+00186 static
+00187 PT_THREAD(net_stats(struct httpd_state *s, char *ptr))
+00188 {
+00189   PSOCK_BEGIN(&s->sout);
+00190 
+00191 #if UIP_STATISTICS
+00192 
+00193   for(s->count = 0; s->count < sizeof(uip_stat) / sizeof(uip_stats_t);
+00194       ++s->count) {
+00195     PSOCK_GENERATOR_SEND(&s->sout, generate_net_stats, s);
+00196   }
+00197   
+00198 #endif /* UIP_STATISTICS */
+00199   
+00200   PSOCK_END(&s->sout);
+00201 }
+00202 /*---------------------------------------------------------------------------*/
+00203 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00183.html b/third_party/uip-1.0/doc/html/a00183.html new file mode 100644 index 0000000..4898da3 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00183.html @@ -0,0 +1,109 @@ + + +uIP 1.0: apps/webserver/httpd-cgi.h Source File + + + + + + +

apps/webserver/httpd-cgi.h

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup httpd
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \file
+00008  *         Web server script interface header file
+00009  * \author
+00010  *         Adam Dunkels <adam@sics.se>
+00011  *
+00012  */
+00013 
+00014 
+00015 
+00016 /*
+00017  * Copyright (c) 2001, Adam Dunkels.
+00018  * All rights reserved.
+00019  *
+00020  * Redistribution and use in source and binary forms, with or without
+00021  * modification, are permitted provided that the following conditions
+00022  * are met:
+00023  * 1. Redistributions of source code must retain the above copyright
+00024  *    notice, this list of conditions and the following disclaimer.
+00025  * 2. Redistributions in binary form must reproduce the above copyright
+00026  *    notice, this list of conditions and the following disclaimer in the
+00027  *    documentation and/or other materials provided with the distribution.
+00028  * 3. The name of the author may not be used to endorse or promote
+00029  *    products derived from this software without specific prior
+00030  *    written permission.
+00031  *
+00032  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00033  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00034  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00035  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00036  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00037  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00038  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00039  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00040  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00041  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00042  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00043  *
+00044  * This file is part of the uIP TCP/IP stack.
+00045  *
+00046  * $Id: httpd-cgi.h,v 1.2 2006/06/11 21:46:38 adam Exp $
+00047  *
+00048  */
+00049 
+00050 #ifndef __HTTPD_CGI_H__
+00051 #define __HTTPD_CGI_H__
+00052 
+00053 #include "psock.h"
+00054 #include "httpd.h"
+00055 
+00056 typedef PT_THREAD((* httpd_cgifunction)(struct httpd_state *, char *));
+00057 
+00058 httpd_cgifunction httpd_cgi(char *name);
+00059 
+00060 struct httpd_cgi_call {
+00061   const char *name;
+00062   const httpd_cgifunction function;
+00063 };
+00064 
+00065 /**
+00066  * \brief      HTTPD CGI function declaration
+00067  * \param name The C variable name of the function
+00068  * \param str  The string name of the function, used in the script file
+00069  * \param function A pointer to the function that implements it
+00070  *
+00071  *             This macro is used for declaring a HTTPD CGI
+00072  *             function. This function is then added to the list of
+00073  *             HTTPD CGI functions with the httpd_cgi_add() function.
+00074  *
+00075  * \hideinitializer
+00076  */
+00077 #define HTTPD_CGI_CALL(name, str, function) \
+00078 static PT_THREAD(function(struct httpd_state *, char *)); \
+00079 static const struct httpd_cgi_call name = {str, function}
+00080 
+00081 void httpd_cgi_init(void);
+00082 #endif /* __HTTPD_CGI_H__ */
+00083 
+00084 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00184.html b/third_party/uip-1.0/doc/html/a00184.html new file mode 100644 index 0000000..cd539a9 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00184.html @@ -0,0 +1,363 @@ + + +uIP 1.0: apps/webserver/httpd.c Source File + + + + + + +

apps/webserver/httpd.c

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup apps
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \defgroup httpd Web server
+00008  * @{
+00009  * The uIP web server is a very simplistic implementation of an HTTP
+00010  * server. It can serve web pages and files from a read-only ROM
+00011  * filesystem, and provides a very small scripting language.
+00012 
+00013  */
+00014 
+00015 /**
+00016  * \file
+00017  *         Web server
+00018  * \author
+00019  *         Adam Dunkels <adam@sics.se>
+00020  */
+00021 
+00022 
+00023 /*
+00024  * Copyright (c) 2004, Adam Dunkels.
+00025  * All rights reserved.
+00026  *
+00027  * Redistribution and use in source and binary forms, with or without
+00028  * modification, are permitted provided that the following conditions
+00029  * are met:
+00030  * 1. Redistributions of source code must retain the above copyright
+00031  *    notice, this list of conditions and the following disclaimer.
+00032  * 2. Redistributions in binary form must reproduce the above copyright
+00033  *    notice, this list of conditions and the following disclaimer in the
+00034  *    documentation and/or other materials provided with the distribution.
+00035  * 3. Neither the name of the Institute nor the names of its contributors
+00036  *    may be used to endorse or promote products derived from this software
+00037  *    without specific prior written permission.
+00038  *
+00039  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00040  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00041  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00042  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00043  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00044  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00045  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00046  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00047  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00048  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00049  * SUCH DAMAGE.
+00050  *
+00051  * This file is part of the uIP TCP/IP stack.
+00052  *
+00053  * Author: Adam Dunkels <adam@sics.se>
+00054  *
+00055  * $Id: httpd.c,v 1.2 2006/06/11 21:46:38 adam Exp $
+00056  */
+00057 
+00058 #include "uip.h"
+00059 #include "httpd.h"
+00060 #include "httpd-fs.h"
+00061 #include "httpd-cgi.h"
+00062 #include "http-strings.h"
+00063 
+00064 #include <string.h>
+00065 
+00066 #define STATE_WAITING 0
+00067 #define STATE_OUTPUT  1
+00068 
+00069 #define ISO_nl      0x0a
+00070 #define ISO_space   0x20
+00071 #define ISO_bang    0x21
+00072 #define ISO_percent 0x25
+00073 #define ISO_period  0x2e
+00074 #define ISO_slash   0x2f
+00075 #define ISO_colon   0x3a
+00076 
+00077 
+00078 /*---------------------------------------------------------------------------*/
+00079 static unsigned short
+00080 generate_part_of_file(void *state)
+00081 {
+00082   struct httpd_state *s = (struct httpd_state *)state;
+00083 
+00084   if(s->file.len > uip_mss()) {
+00085     s->len = uip_mss();
+00086   } else {
+00087     s->len = s->file.len;
+00088   }
+00089   memcpy(uip_appdata, s->file.data, s->len);
+00090   
+00091   return s->len;
+00092 }
+00093 /*---------------------------------------------------------------------------*/
+00094 static
+00095 PT_THREAD(send_file(struct httpd_state *s))
+00096 {
+00097   PSOCK_BEGIN(&s->sout);
+00098   
+00099   do {
+00100     PSOCK_GENERATOR_SEND(&s->sout, generate_part_of_file, s);
+00101     s->file.len -= s->len;
+00102     s->file.data += s->len;
+00103   } while(s->file.len > 0);
+00104       
+00105   PSOCK_END(&s->sout);
+00106 }
+00107 /*---------------------------------------------------------------------------*/
+00108 static
+00109 PT_THREAD(send_part_of_file(struct httpd_state *s))
+00110 {
+00111   PSOCK_BEGIN(&s->sout);
+00112 
+00113   PSOCK_SEND(&s->sout, s->file.data, s->len);
+00114   
+00115   PSOCK_END(&s->sout);
+00116 }
+00117 /*---------------------------------------------------------------------------*/
+00118 static void
+00119 next_scriptstate(struct httpd_state *s)
+00120 {
+00121   char *p;
+00122   p = strchr(s->scriptptr, ISO_nl) + 1;
+00123   s->scriptlen -= (unsigned short)(p - s->scriptptr);
+00124   s->scriptptr = p;
+00125 }
+00126 /*---------------------------------------------------------------------------*/
+00127 static
+00128 PT_THREAD(handle_script(struct httpd_state *s))
+00129 {
+00130   char *ptr;
+00131   
+00132   PT_BEGIN(&s->scriptpt);
+00133 
+00134 
+00135   while(s->file.len > 0) {
+00136 
+00137     /* Check if we should start executing a script. */
+00138     if(*s->file.data == ISO_percent &&
+00139        *(s->file.data + 1) == ISO_bang) {
+00140       s->scriptptr = s->file.data + 3;
+00141       s->scriptlen = s->file.len - 3;
+00142       if(*(s->scriptptr - 1) == ISO_colon) {
+00143         httpd_fs_open(s->scriptptr + 1, &s->file);
+00144         PT_WAIT_THREAD(&s->scriptpt, send_file(s));
+00145       } else {
+00146         PT_WAIT_THREAD(&s->scriptpt,
+00147                        httpd_cgi(s->scriptptr)(s, s->scriptptr));
+00148       }
+00149       next_scriptstate(s);
+00150       
+00151       /* The script is over, so we reset the pointers and continue
+00152          sending the rest of the file. */
+00153       s->file.data = s->scriptptr;
+00154       s->file.len = s->scriptlen;
+00155     } else {
+00156       /* See if we find the start of script marker in the block of HTML
+00157          to be sent. */
+00158 
+00159       if(s->file.len > uip_mss()) {
+00160         s->len = uip_mss();
+00161       } else {
+00162         s->len = s->file.len;
+00163       }
+00164 
+00165       if(*s->file.data == ISO_percent) {
+00166         ptr = strchr(s->file.data + 1, ISO_percent);
+00167       } else {
+00168         ptr = strchr(s->file.data, ISO_percent);
+00169       }
+00170       if(ptr != NULL &&
+00171          ptr != s->file.data) {
+00172         s->len = (int)(ptr - s->file.data);
+00173         if(s->len >= uip_mss()) {
+00174           s->len = uip_mss();
+00175         }
+00176       }
+00177       PT_WAIT_THREAD(&s->scriptpt, send_part_of_file(s));
+00178       s->file.data += s->len;
+00179       s->file.len -= s->len;
+00180       
+00181     }
+00182   }
+00183   
+00184   PT_END(&s->scriptpt);
+00185 }
+00186 /*---------------------------------------------------------------------------*/
+00187 static
+00188 PT_THREAD(send_headers(struct httpd_state *s, const char *statushdr))
+00189 {
+00190   char *ptr;
+00191 
+00192   PSOCK_BEGIN(&s->sout);
+00193 
+00194   PSOCK_SEND_STR(&s->sout, statushdr);
+00195 
+00196   ptr = strrchr(s->filename, ISO_period);
+00197   if(ptr == NULL) {
+00198     PSOCK_SEND_STR(&s->sout, http_content_type_binary);
+00199   } else if(strncmp(http_html, ptr, 5) == 0 ||
+00200             strncmp(http_shtml, ptr, 6) == 0) {
+00201     PSOCK_SEND_STR(&s->sout, http_content_type_html);
+00202   } else if(strncmp(http_css, ptr, 4) == 0) {
+00203     PSOCK_SEND_STR(&s->sout, http_content_type_css);
+00204   } else if(strncmp(http_png, ptr, 4) == 0) {
+00205     PSOCK_SEND_STR(&s->sout, http_content_type_png);
+00206   } else if(strncmp(http_gif, ptr, 4) == 0) {
+00207     PSOCK_SEND_STR(&s->sout, http_content_type_gif);
+00208   } else if(strncmp(http_jpg, ptr, 4) == 0) {
+00209     PSOCK_SEND_STR(&s->sout, http_content_type_jpg);
+00210   } else {
+00211     PSOCK_SEND_STR(&s->sout, http_content_type_plain);
+00212   }
+00213   PSOCK_END(&s->sout);
+00214 }
+00215 /*---------------------------------------------------------------------------*/
+00216 static
+00217 PT_THREAD(handle_output(struct httpd_state *s))
+00218 {
+00219   char *ptr;
+00220   
+00221   PT_BEGIN(&s->outputpt);
+00222  
+00223   if(!httpd_fs_open(s->filename, &s->file)) {
+00224     httpd_fs_open(http_404_html, &s->file);
+00225     strcpy(s->filename, http_404_html);
+00226     PT_WAIT_THREAD(&s->outputpt,
+00227                    send_headers(s,
+00228                    http_header_404));
+00229     PT_WAIT_THREAD(&s->outputpt,
+00230                    send_file(s));
+00231   } else {
+00232     PT_WAIT_THREAD(&s->outputpt,
+00233                    send_headers(s,
+00234                    http_header_200));
+00235     ptr = strchr(s->filename, ISO_period);
+00236     if(ptr != NULL && strncmp(ptr, http_shtml, 6) == 0) {
+00237       PT_INIT(&s->scriptpt);
+00238       PT_WAIT_THREAD(&s->outputpt, handle_script(s));
+00239     } else {
+00240       PT_WAIT_THREAD(&s->outputpt,
+00241                      send_file(s));
+00242     }
+00243   }
+00244   PSOCK_CLOSE(&s->sout);
+00245   PT_END(&s->outputpt);
+00246 }
+00247 /*---------------------------------------------------------------------------*/
+00248 static
+00249 PT_THREAD(handle_input(struct httpd_state *s))
+00250 {
+00251   PSOCK_BEGIN(&s->sin);
+00252 
+00253   PSOCK_READTO(&s->sin, ISO_space);
+00254 
+00255   
+00256   if(strncmp(s->inputbuf, http_get, 4) != 0) {
+00257     PSOCK_CLOSE_EXIT(&s->sin);
+00258   }
+00259   PSOCK_READTO(&s->sin, ISO_space);
+00260 
+00261   if(s->inputbuf[0] != ISO_slash) {
+00262     PSOCK_CLOSE_EXIT(&s->sin);
+00263   }
+00264 
+00265   if(s->inputbuf[1] == ISO_space) {
+00266     strncpy(s->filename, http_index_html, sizeof(s->filename));
+00267   } else {
+00268     s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0;
+00269     strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename));
+00270   }
+00271 
+00272   /*  httpd_log_file(uip_conn->ripaddr, s->filename);*/
+00273   
+00274   s->state = STATE_OUTPUT;
+00275 
+00276   while(1) {
+00277     PSOCK_READTO(&s->sin, ISO_nl);
+00278 
+00279     if(strncmp(s->inputbuf, http_referer, 8) == 0) {
+00280       s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0;
+00281       /*      httpd_log(&s->inputbuf[9]);*/
+00282     }
+00283   }
+00284   
+00285   PSOCK_END(&s->sin);
+00286 }
+00287 /*---------------------------------------------------------------------------*/
+00288 static void
+00289 handle_connection(struct httpd_state *s)
+00290 {
+00291   handle_input(s);
+00292   if(s->state == STATE_OUTPUT) {
+00293     handle_output(s);
+00294   }
+00295 }
+00296 /*---------------------------------------------------------------------------*/
+00297 void
+00298 httpd_appcall(void)
+00299 {
+00300   struct httpd_state *s = (struct httpd_state *)&(uip_conn->appstate);
+00301 
+00302   if(uip_closed() || uip_aborted() || uip_timedout()) {
+00303   } else if(uip_connected()) {
+00304     PSOCK_INIT(&s->sin, s->inputbuf, sizeof(s->inputbuf) - 1);
+00305     PSOCK_INIT(&s->sout, s->inputbuf, sizeof(s->inputbuf) - 1);
+00306     PT_INIT(&s->outputpt);
+00307     s->state = STATE_WAITING;
+00308     /*    timer_set(&s->timer, CLOCK_SECOND * 100);*/
+00309     s->timer = 0;
+00310     handle_connection(s);
+00311   } else if(s != NULL) {
+00312     if(uip_poll()) {
+00313       ++s->timer;
+00314       if(s->timer >= 20) {
+00315         uip_abort();
+00316       }
+00317     } else {
+00318       s->timer = 0;
+00319     }
+00320     handle_connection(s);
+00321   } else {
+00322     uip_abort();
+00323   }
+00324 }
+00325 /*---------------------------------------------------------------------------*/
+00326 /**
+00327  * \brief      Initialize the web server
+00328  *
+00329  *             This function initializes the web server and should be
+00330  *             called at system boot-up.
+00331  */
+00332 void
+00333 httpd_init(void)
+00334 {
+00335   uip_listen(HTONS(80));
+00336 }
+00337 /*---------------------------------------------------------------------------*/
+00338 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00185.html b/third_party/uip-1.0/doc/html/a00185.html new file mode 100644 index 0000000..f041e01 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00185.html @@ -0,0 +1,87 @@ + + +uIP 1.0: apps/webserver/httpd.h Source File + + + + + + +

apps/webserver/httpd.h

00001 /*
+00002  * Copyright (c) 2001-2005, Adam Dunkels.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. The name of the author may not be used to endorse or promote
+00014  *    products derived from this software without specific prior
+00015  *    written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00018  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00019  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00021  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00023  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00024  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00025  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00026  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00027  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack.
+00030  *
+00031  * $Id: httpd.h,v 1.2 2006/06/11 21:46:38 adam Exp $
+00032  *
+00033  */
+00034 
+00035 #ifndef __HTTPD_H__
+00036 #define __HTTPD_H__
+00037 
+00038 #include "psock.h"
+00039 #include "httpd-fs.h"
+00040 
+00041 struct httpd_state {
+00042   unsigned char timer;
+00043   struct psock sin, sout;
+00044   struct pt outputpt, scriptpt;
+00045   char inputbuf[50];
+00046   char filename[20];
+00047   char state;
+00048   struct httpd_fs_file file;
+00049   int len;
+00050   char *scriptptr;
+00051   int scriptlen;
+00052   
+00053   unsigned short count;
+00054 };
+00055 
+00056 void httpd_init(void);
+00057 void httpd_appcall(void);
+00058 
+00059 void httpd_log(char *msg);
+00060 void httpd_log_file(u16_t *requester, char *file);
+00061 
+00062 #endif /* __HTTPD_H__ */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00186.html b/third_party/uip-1.0/doc/html/a00186.html new file mode 100644 index 0000000..7bfb8c7 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00186.html @@ -0,0 +1,129 @@ + + +uIP 1.0: lib/memb.c Source File + + + + + + +

lib/memb.c

Go to the documentation of this file.
00001 /*
+00002  * Copyright (c) 2004, Swedish Institute of Computer Science.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * Author: Adam Dunkels <adam@sics.se>
+00032  *
+00033  * $Id: memb.c,v 1.1 2006/06/12 08:21:43 adam Exp $
+00034  */
+00035 
+00036 /**
+00037  * \addtogroup memb
+00038  * @{
+00039  */
+00040 
+00041  /**
+00042  * \file
+00043  * Memory block allocation routines.
+00044  * \author Adam Dunkels <adam@sics.se>
+00045  */
+00046 #include <string.h>
+00047 
+00048 #include "memb.h"
+00049 
+00050 /*---------------------------------------------------------------------------*/
+00051 void
+00052 memb_init(struct memb_blocks *m)
+00053 {
+00054   memset(m->count, 0, m->num);
+00055   memset(m->mem, 0, m->size * m->num);
+00056 }
+00057 /*---------------------------------------------------------------------------*/
+00058 void *
+00059 memb_alloc(struct memb_blocks *m)
+00060 {
+00061   int i;
+00062 
+00063   for(i = 0; i < m->num; ++i) {
+00064     if(m->count[i] == 0) {
+00065       /* If this block was unused, we increase the reference count to
+00066          indicate that it now is used and return a pointer to the
+00067          memory block. */
+00068       ++(m->count[i]);
+00069       return (void *)((char *)m->mem + (i * m->size));
+00070     }
+00071   }
+00072 
+00073   /* No free block was found, so we return NULL to indicate failure to
+00074      allocate block. */
+00075   return NULL;
+00076 }
+00077 /*---------------------------------------------------------------------------*/
+00078 char
+00079 memb_free(struct memb_blocks *m, void *ptr)
+00080 {
+00081   int i;
+00082   char *ptr2;
+00083 
+00084   /* Walk through the list of blocks and try to find the block to
+00085      which the pointer "ptr" points to. */
+00086   ptr2 = (char *)m->mem;
+00087   for(i = 0; i < m->num; ++i) {
+00088     
+00089     if(ptr2 == (char *)ptr) {
+00090       /* We've found to block to which "ptr" points so we decrease the
+00091          reference count and return the new value of it. */
+00092       if(m->count[i] > 0) {
+00093         /* Make sure that we don't deallocate free memory. */
+00094         --(m->count[i]);
+00095       }
+00096       return m->count[i];
+00097     }
+00098     ptr2 += m->size;
+00099   }
+00100   return -1;
+00101 }
+00102 /*---------------------------------------------------------------------------*/
+00103 
+00104 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00187.html b/third_party/uip-1.0/doc/html/a00187.html new file mode 100644 index 0000000..d1f5865 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00187.html @@ -0,0 +1,167 @@ + + +uIP 1.0: lib/memb.h Source File + + + + + + +

lib/memb.h

Go to the documentation of this file.
00001 /*
+00002  * Copyright (c) 2004, Swedish Institute of Computer Science.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * Author: Adam Dunkels <adam@sics.se>
+00032  *
+00033  * $Id: memb.h,v 1.1 2006/06/12 08:21:43 adam Exp $
+00034  */
+00035 
+00036 /**
+00037  * \defgroup memb Memory block management functions
+00038  *
+00039  * The memory block allocation routines provide a simple yet powerful
+00040  * set of functions for managing a set of memory blocks of fixed
+00041  * size. A set of memory blocks is statically declared with the
+00042  * MEMB() macro. Memory blocks are allocated from the declared
+00043  * memory by the memb_alloc() function, and are deallocated with the
+00044  * memb_free() function.
+00045  *
+00046  * \note Because of namespace clashes only one MEMB() can be
+00047  * declared per C module, and the name scope of a MEMB() memory
+00048  * block is local to each C module.
+00049  *
+00050  * The following example shows how to declare and use a memory block
+00051  * called "cmem" which has 8 chunks of memory with each memory chunk
+00052  * being 20 bytes large.
+00053  *
+00054  * @{
+00055  */
+00056 
+00057 
+00058 /**
+00059  * \file
+00060  *         Memory block allocation routines.
+00061  * \author
+00062  *         Adam Dunkels <adam@sics.se>
+00063  *
+00064  */
+00065 
+00066 #ifndef __MEMB_H__
+00067 #define __MEMB_H__
+00068 
+00069 /*
+00070  * Here we define a C preprocessing macro for concatenating to
+00071  * strings. We need use two macros in order to allow concatenation of
+00072  * two #defined macros.
+00073  */
+00074 #define MEMB_CONCAT2(s1, s2) s1##s2
+00075 #define MEMB_CONCAT(s1, s2) MEMB_CONCAT2(s1, s2)
+00076 
+00077 /**
+00078  * Declare a memory block.
+00079  *
+00080  * This macro is used to staticall declare a block of memory that can
+00081  * be used by the block allocation functions. The macro statically
+00082  * declares a C array with a size that matches the specified number of
+00083  * blocks and their individual sizes.
+00084  *
+00085  * Example:
+00086  \code
+00087 MEMB(connections, sizeof(struct connection), 16);
+00088  \endcode
+00089  *
+00090  * \param name The name of the memory block (later used with
+00091  * memb_init(), memb_alloc() and memb_free()).
+00092  *
+00093  * \param size The size of each memory chunk, in bytes.
+00094  *
+00095  * \param num The total number of memory chunks in the block.
+00096  *
+00097  */
+00098 #define MEMB(name, structure, num) \
+00099         static char MEMB_CONCAT(name,_memb_count)[num]; \
+00100         static structure MEMB_CONCAT(name,_memb_mem)[num]; \
+00101         static struct memb_blocks name = {sizeof(structure), num, \
+00102                                           MEMB_CONCAT(name,_memb_count), \
+00103                                           (void *)MEMB_CONCAT(name,_memb_mem)}
+00104 
+00105 struct memb_blocks {
+00106   unsigned short size;
+00107   unsigned short num;
+00108   char *count;
+00109   void *mem;
+00110 };
+00111 
+00112 /**
+00113  * Initialize a memory block that was declared with MEMB().
+00114  *
+00115  * \param m A memory block previosly declared with MEMB().
+00116  */
+00117 void  memb_init(struct memb_blocks *m);
+00118 
+00119 /**
+00120  * Allocate a memory block from a block of memory declared with MEMB().
+00121  *
+00122  * \param m A memory block previosly declared with MEMB().
+00123  */
+00124 void *memb_alloc(struct memb_blocks *m);
+00125 
+00126 /**
+00127  * Deallocate a memory block from a memory block previously declared
+00128  * with MEMB().
+00129  *
+00130  * \param m m A memory block previosly declared with MEMB().
+00131  *
+00132  * \param ptr A pointer to the memory block that is to be deallocated.
+00133  *
+00134  * \return The new reference count for the memory block (should be 0
+00135  * if successfully deallocated) or -1 if the pointer "ptr" did not
+00136  * point to a legal memory block.
+00137  */
+00138 char  memb_free(struct memb_blocks *m, void *ptr);
+00139 
+00140 /** @} */
+00141 
+00142 #endif /* __MEMB_H__ */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00188.html b/third_party/uip-1.0/doc/html/a00188.html new file mode 100644 index 0000000..5b7d027 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00188.html @@ -0,0 +1,113 @@ + + +uIP 1.0: uip/clock.h Source File + + + + + + +

uip/clock.h

00001 /**
+00002  * \defgroup clock Clock interface
+00003  *
+00004  * The clock interface is the interface between the \ref timer "timer library"
+00005  * and the platform specific clock functionality. The clock
+00006  * interface must be implemented for each platform that uses the \ref
+00007  * timer "timer library".
+00008  *
+00009  * The clock interface does only one this: it measures time. The clock
+00010  * interface provides a macro, CLOCK_SECOND, which corresponds to one
+00011  * second of system time.
+00012  *
+00013  * \sa \ref timer "Timer library"
+00014  *
+00015  * @{
+00016  */
+00017 
+00018 /*
+00019  * Copyright (c) 2004, Swedish Institute of Computer Science.
+00020  * All rights reserved.
+00021  *
+00022  * Redistribution and use in source and binary forms, with or without
+00023  * modification, are permitted provided that the following conditions
+00024  * are met:
+00025  * 1. Redistributions of source code must retain the above copyright
+00026  *    notice, this list of conditions and the following disclaimer.
+00027  * 2. Redistributions in binary form must reproduce the above copyright
+00028  *    notice, this list of conditions and the following disclaimer in the
+00029  *    documentation and/or other materials provided with the distribution.
+00030  * 3. Neither the name of the Institute nor the names of its contributors
+00031  *    may be used to endorse or promote products derived from this software
+00032  *    without specific prior written permission.
+00033  *
+00034  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00035  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00036  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00037  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00038  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00039  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00040  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00041  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00042  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00043  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00044  * SUCH DAMAGE.
+00045  *
+00046  * This file is part of the uIP TCP/IP stack
+00047  *
+00048  * Author: Adam Dunkels <adam@sics.se>
+00049  *
+00050  * $Id: clock.h,v 1.3 2006/06/11 21:46:39 adam Exp $
+00051  */
+00052 #ifndef __CLOCK_H__
+00053 #define __CLOCK_H__
+00054 
+00055 #include "clock-arch.h"
+00056 
+00057 /**
+00058  * Initialize the clock library.
+00059  *
+00060  * This function initializes the clock library and should be called
+00061  * from the main() function of the system.
+00062  *
+00063  */
+00064 void clock_init(void);
+00065 
+00066 /**
+00067  * Get the current clock time.
+00068  *
+00069  * This function returns the current system clock time.
+00070  *
+00071  * \return The current clock time, measured in system ticks.
+00072  */
+00073 clock_time_t clock_time(void);
+00074 
+00075 /**
+00076  * A second, measured in system clock time.
+00077  *
+00078  * \hideinitializer
+00079  */
+00080 #ifdef CLOCK_CONF_SECOND
+00081 #define CLOCK_SECOND CLOCK_CONF_SECOND
+00082 #else
+00083 #define CLOCK_SECOND (clock_time_t)32
+00084 #endif
+00085 
+00086 #endif /* __CLOCK_H__ */
+00087 
+00088 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00189.html b/third_party/uip-1.0/doc/html/a00189.html new file mode 100644 index 0000000..7eb5e3f --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00189.html @@ -0,0 +1,108 @@ + + +uIP 1.0: uip/lc-addrlabels.h Source File + + + + + + +

uip/lc-addrlabels.h

Go to the documentation of this file.
00001 /*
+00002  * Copyright (c) 2004-2005, Swedish Institute of Computer Science.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * Author: Adam Dunkels <adam@sics.se>
+00032  *
+00033  * $Id: lc-addrlabels.h,v 1.3 2006/06/12 08:00:30 adam Exp $
+00034  */
+00035 
+00036 /**
+00037  * \addtogroup lc
+00038  * @{
+00039  */
+00040 
+00041 /**
+00042  * \file
+00043  * Implementation of local continuations based on the "Labels as
+00044  * values" feature of gcc
+00045  * \author
+00046  * Adam Dunkels <adam@sics.se>
+00047  *
+00048  * This implementation of local continuations is based on a special
+00049  * feature of the GCC C compiler called "labels as values". This
+00050  * feature allows assigning pointers with the address of the code
+00051  * corresponding to a particular C label.
+00052  *
+00053  * For more information, see the GCC documentation:
+00054  * http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
+00055  *
+00056  * Thanks to dividuum for finding the nice local scope label
+00057  * implementation.
+00058  */
+00059 
+00060 #ifndef __LC_ADDRLABELS_H__
+00061 #define __LC_ADDRLABELS_H__
+00062 
+00063 /** \hideinitializer */
+00064 typedef void * lc_t;
+00065 
+00066 #define LC_INIT(s) s = NULL
+00067 
+00068 
+00069 #define LC_RESUME(s)                            \
+00070   do {                                          \
+00071     if(s != NULL) {                             \
+00072       goto *s;                                  \
+00073     }                                           \
+00074   } while(0)
+00075 
+00076 #define LC_SET(s)                               \
+00077   do { ({ __label__ resume; resume: (s) = &&resume; }); }while(0)
+00078 
+00079 #define LC_END(s)
+00080 
+00081 #endif /* __LC_ADDRLABELS_H__ */
+00082 
+00083 /**  @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00190.html b/third_party/uip-1.0/doc/html/a00190.html new file mode 100644 index 0000000..81ce234 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00190.html @@ -0,0 +1,101 @@ + + +uIP 1.0: uip/lc-switch.h Source File + + + + + + +

uip/lc-switch.h

Go to the documentation of this file.
00001 /*
+00002  * Copyright (c) 2004-2005, Swedish Institute of Computer Science.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * Author: Adam Dunkels <adam@sics.se>
+00032  *
+00033  * $Id: lc-switch.h,v 1.2 2006/06/12 08:00:30 adam Exp $
+00034  */
+00035 
+00036 /**
+00037  * \addtogroup lc
+00038  * @{
+00039  */
+00040 
+00041 /**
+00042  * \file
+00043  * Implementation of local continuations based on switch() statment
+00044  * \author Adam Dunkels <adam@sics.se>
+00045  *
+00046  * This implementation of local continuations uses the C switch()
+00047  * statement to resume execution of a function somewhere inside the
+00048  * function's body. The implementation is based on the fact that
+00049  * switch() statements are able to jump directly into the bodies of
+00050  * control structures such as if() or while() statmenets.
+00051  *
+00052  * This implementation borrows heavily from Simon Tatham's coroutines
+00053  * implementation in C:
+00054  * http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
+00055  */
+00056 
+00057 #ifndef __LC_SWITCH_H__
+00058 #define __LC_SWTICH_H__
+00059 
+00060 /* WARNING! lc implementation using switch() does not work if an
+00061    LC_SET() is done within another switch() statement! */
+00062 
+00063 /** \hideinitializer */
+00064 typedef unsigned short lc_t;
+00065 
+00066 #define LC_INIT(s) s = 0;
+00067 
+00068 #define LC_RESUME(s) switch(s) { case 0:
+00069 
+00070 #define LC_SET(s) s = __LINE__; case __LINE__:
+00071 
+00072 #define LC_END(s) }
+00073 
+00074 #endif /* __LC_SWITCH_H__ */
+00075 
+00076 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00191.html b/third_party/uip-1.0/doc/html/a00191.html new file mode 100644 index 0000000..06fd8f6 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00191.html @@ -0,0 +1,156 @@ + + +uIP 1.0: uip/lc.h Source File + + + + + + +

uip/lc.h

Go to the documentation of this file.
00001 /*
+00002  * Copyright (c) 2004-2005, Swedish Institute of Computer Science.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * Author: Adam Dunkels <adam@sics.se>
+00032  *
+00033  * $Id: lc.h,v 1.2 2006/06/12 08:00:30 adam Exp $
+00034  */
+00035 
+00036 /**
+00037  * \addtogroup pt
+00038  * @{
+00039  */
+00040 
+00041 /**
+00042  * \defgroup lc Local continuations
+00043  * @{
+00044  *
+00045  * Local continuations form the basis for implementing protothreads. A
+00046  * local continuation can be <i>set</i> in a specific function to
+00047  * capture the state of the function. After a local continuation has
+00048  * been set can be <i>resumed</i> in order to restore the state of the
+00049  * function at the point where the local continuation was set.
+00050  *
+00051  *
+00052  */
+00053 
+00054 /**
+00055  * \file lc.h
+00056  * Local continuations
+00057  * \author
+00058  * Adam Dunkels <adam@sics.se>
+00059  *
+00060  */
+00061 
+00062 #ifdef DOXYGEN
+00063 /**
+00064  * Initialize a local continuation.
+00065  *
+00066  * This operation initializes the local continuation, thereby
+00067  * unsetting any previously set continuation state.
+00068  *
+00069  * \hideinitializer
+00070  */
+00071 #define LC_INIT(lc)
+00072 
+00073 /**
+00074  * Set a local continuation.
+00075  *
+00076  * The set operation saves the state of the function at the point
+00077  * where the operation is executed. As far as the set operation is
+00078  * concerned, the state of the function does <b>not</b> include the
+00079  * call-stack or local (automatic) variables, but only the program
+00080  * counter and such CPU registers that needs to be saved.
+00081  *
+00082  * \hideinitializer
+00083  */
+00084 #define LC_SET(lc)
+00085 
+00086 /**
+00087  * Resume a local continuation.
+00088  *
+00089  * The resume operation resumes a previously set local continuation, thus
+00090  * restoring the state in which the function was when the local
+00091  * continuation was set. If the local continuation has not been
+00092  * previously set, the resume operation does nothing.
+00093  *
+00094  * \hideinitializer
+00095  */
+00096 #define LC_RESUME(lc)
+00097 
+00098 /**
+00099  * Mark the end of local continuation usage.
+00100  *
+00101  * The end operation signifies that local continuations should not be
+00102  * used any more in the function. This operation is not needed for
+00103  * most implementations of local continuation, but is required by a
+00104  * few implementations.
+00105  *
+00106  * \hideinitializer
+00107  */
+00108 #define LC_END(lc)
+00109 
+00110 /**
+00111  * \var typedef lc_t;
+00112  *
+00113  * The local continuation type.
+00114  *
+00115  * \hideinitializer
+00116  */
+00117 #endif /* DOXYGEN */
+00118 
+00119 #ifndef __LC_H__
+00120 #define __LC_H__
+00121 
+00122 #ifdef LC_CONF_INCLUDE
+00123 #include LC_CONF_INCLUDE
+00124 #else
+00125 #include "lc-switch.h"
+00126 #endif /* LC_CONF_INCLUDE */
+00127 
+00128 #endif /* __LC_H__ */
+00129 
+00130 /** @} */
+00131 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00192.html b/third_party/uip-1.0/doc/html/a00192.html new file mode 100644 index 0000000..3e0fb55 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00192.html @@ -0,0 +1,363 @@ + + +uIP 1.0: uip/psock.c Source File + + + + + + +

uip/psock.c

00001 /*
+00002  * Copyright (c) 2004, Swedish Institute of Computer Science.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * Author: Adam Dunkels <adam@sics.se>
+00032  *
+00033  * $Id: psock.c,v 1.2 2006/06/12 08:00:30 adam Exp $
+00034  */
+00035 
+00036 #include <stdio.h>
+00037 #include <string.h>
+00038 
+00039 #include "uipopt.h"
+00040 #include "psock.h"
+00041 #include "uip.h"
+00042 
+00043 #define STATE_NONE 0
+00044 #define STATE_ACKED 1
+00045 #define STATE_READ 2
+00046 #define STATE_BLOCKED_NEWDATA 3
+00047 #define STATE_BLOCKED_CLOSE 4
+00048 #define STATE_BLOCKED_SEND 5
+00049 #define STATE_DATA_SENT 6
+00050 
+00051 /*
+00052  * Return value of the buffering functions that indicates that a
+00053  * buffer was not filled by incoming data.
+00054  *
+00055  */
+00056 #define BUF_NOT_FULL 0
+00057 #define BUF_NOT_FOUND 0
+00058 
+00059 /*
+00060  * Return value of the buffering functions that indicates that a
+00061  * buffer was completely filled by incoming data.
+00062  *
+00063  */
+00064 #define BUF_FULL 1
+00065 
+00066 /*
+00067  * Return value of the buffering functions that indicates that an
+00068  * end-marker byte was found.
+00069  *
+00070  */
+00071 #define BUF_FOUND 2
+00072 
+00073 /*---------------------------------------------------------------------------*/
+00074 static void
+00075 buf_setup(struct psock_buf *buf,
+00076           u8_t *bufptr, u16_t bufsize)
+00077 {
+00078   buf->ptr = bufptr;
+00079   buf->left = bufsize;
+00080 }
+00081 /*---------------------------------------------------------------------------*/
+00082 static u8_t
+00083 buf_bufdata(struct psock_buf *buf, u16_t len,
+00084             u8_t **dataptr, u16_t *datalen)
+00085 {
+00086   if(*datalen < buf->left) {
+00087     memcpy(buf->ptr, *dataptr, *datalen);
+00088     buf->ptr += *datalen;
+00089     buf->left -= *datalen;
+00090     *dataptr += *datalen;
+00091     *datalen = 0;
+00092     return BUF_NOT_FULL;
+00093   } else if(*datalen == buf->left) {
+00094     memcpy(buf->ptr, *dataptr, *datalen);
+00095     buf->ptr += *datalen;
+00096     buf->left = 0;
+00097     *dataptr += *datalen;
+00098     *datalen = 0;
+00099     return BUF_FULL;
+00100   } else {
+00101     memcpy(buf->ptr, *dataptr, buf->left);
+00102     buf->ptr += buf->left;
+00103     *datalen -= buf->left;
+00104     *dataptr += buf->left;
+00105     buf->left = 0;
+00106     return BUF_FULL;
+00107   }
+00108 }
+00109 /*---------------------------------------------------------------------------*/
+00110 static u8_t
+00111 buf_bufto(register struct psock_buf *buf, u8_t endmarker,
+00112           register u8_t **dataptr, register u16_t *datalen)
+00113 {
+00114   u8_t c;
+00115   while(buf->left > 0 && *datalen > 0) {
+00116     c = *buf->ptr = **dataptr;
+00117     ++*dataptr;
+00118     ++buf->ptr;
+00119     --*datalen;
+00120     --buf->left;
+00121     
+00122     if(c == endmarker) {
+00123       return BUF_FOUND;
+00124     }
+00125   }
+00126 
+00127   if(*datalen == 0) {
+00128     return BUF_NOT_FOUND;
+00129   }
+00130 
+00131   while(*datalen > 0) {
+00132     c = **dataptr;
+00133     --*datalen;
+00134     ++*dataptr;
+00135     
+00136     if(c == endmarker) {
+00137       return BUF_FOUND | BUF_FULL;
+00138     }
+00139   }
+00140   
+00141   return BUF_FULL;
+00142 }
+00143 /*---------------------------------------------------------------------------*/
+00144 static char
+00145 send_data(register struct psock *s)
+00146 {
+00147   if(s->state != STATE_DATA_SENT || uip_rexmit()) {
+00148     if(s->sendlen > uip_mss()) {
+00149       uip_send(s->sendptr, uip_mss());
+00150     } else {
+00151       uip_send(s->sendptr, s->sendlen);
+00152     }
+00153     s->state = STATE_DATA_SENT;
+00154     return 1;
+00155   }
+00156   return 0;
+00157 }
+00158 /*---------------------------------------------------------------------------*/
+00159 static char
+00160 data_acked(register struct psock *s)
+00161 {
+00162   if(s->state == STATE_DATA_SENT && uip_acked()) {
+00163     if(s->sendlen > uip_mss()) {
+00164       s->sendlen -= uip_mss();
+00165       s->sendptr += uip_mss();
+00166     } else {
+00167       s->sendptr += s->sendlen;
+00168       s->sendlen = 0;
+00169     }
+00170     s->state = STATE_ACKED;
+00171     return 1;
+00172   }
+00173   return 0;
+00174 }
+00175 /*---------------------------------------------------------------------------*/
+00176 PT_THREAD(psock_send(register struct psock *s, const char *buf,
+00177                      unsigned int len))
+00178 {
+00179   PT_BEGIN(&s->psockpt);
+00180 
+00181   /* If there is no data to send, we exit immediately. */
+00182   if(len == 0) {
+00183     PT_EXIT(&s->psockpt);
+00184   }
+00185 
+00186   /* Save the length of and a pointer to the data that is to be
+00187      sent. */
+00188   s->sendptr = buf;
+00189   s->sendlen = len;
+00190 
+00191   s->state = STATE_NONE;
+00192 
+00193   /* We loop here until all data is sent. The s->sendlen variable is
+00194      updated by the data_sent() function. */
+00195   while(s->sendlen > 0) {
+00196 
+00197     /*
+00198      * The condition for this PT_WAIT_UNTIL is a little tricky: the
+00199      * protothread will wait here until all data has been acknowledged
+00200      * (data_acked() returns true) and until all data has been sent
+00201      * (send_data() returns true). The two functions data_acked() and
+00202      * send_data() must be called in succession to ensure that all
+00203      * data is sent. Therefore the & operator is used instead of the
+00204      * && operator, which would cause only the data_acked() function
+00205      * to be called when it returns false.
+00206      */
+00207     PT_WAIT_UNTIL(&s->psockpt, data_acked(s) & send_data(s));
+00208   }
+00209 
+00210   s->state = STATE_NONE;
+00211   
+00212   PT_END(&s->psockpt);
+00213 }
+00214 /*---------------------------------------------------------------------------*/
+00215 PT_THREAD(psock_generator_send(register struct psock *s,
+00216                                unsigned short (*generate)(void *), void *arg))
+00217 {
+00218   PT_BEGIN(&s->psockpt);
+00219 
+00220   /* Ensure that there is a generator function to call. */
+00221   if(generate == NULL) {
+00222     PT_EXIT(&s->psockpt);
+00223   }
+00224 
+00225   /* Call the generator function to generate the data in the
+00226      uip_appdata buffer. */
+00227   s->sendlen = generate(arg);
+00228   s->sendptr = uip_appdata;
+00229 
+00230   s->state = STATE_NONE;  
+00231   do {
+00232     /* Call the generator function again if we are called to perform a
+00233        retransmission. */
+00234     if(uip_rexmit()) {
+00235       generate(arg);
+00236     }
+00237     /* Wait until all data is sent and acknowledged. */
+00238     PT_WAIT_UNTIL(&s->psockpt, data_acked(s) & send_data(s));
+00239   } while(s->sendlen > 0);
+00240   
+00241   s->state = STATE_NONE;
+00242   
+00243   PT_END(&s->psockpt);
+00244 }
+00245 /*---------------------------------------------------------------------------*/
+00246 u16_t
+00247 psock_datalen(struct psock *psock)
+00248 {
+00249   return psock->bufsize - psock->buf.left;
+00250 }
+00251 /*---------------------------------------------------------------------------*/
+00252 char
+00253 psock_newdata(struct psock *s)
+00254 {
+00255   if(s->readlen > 0) {
+00256     /* There is data in the uip_appdata buffer that has not yet been
+00257        read with the PSOCK_READ functions. */
+00258     return 1;
+00259   } else if(s->state == STATE_READ) {
+00260     /* All data in uip_appdata buffer already consumed. */
+00261     s->state = STATE_BLOCKED_NEWDATA;
+00262     return 0;
+00263   } else if(uip_newdata()) {
+00264     /* There is new data that has not been consumed. */
+00265     return 1;
+00266   } else {
+00267     /* There is no new data. */
+00268     return 0;
+00269   }
+00270 }
+00271 /*---------------------------------------------------------------------------*/
+00272 PT_THREAD(psock_readto(register struct psock *psock, unsigned char c))
+00273 {
+00274   PT_BEGIN(&psock->psockpt);
+00275 
+00276   buf_setup(&psock->buf, psock->bufptr, psock->bufsize);
+00277   
+00278   /* XXX: Should add buf_checkmarker() before do{} loop, if
+00279      incoming data has been handled while waiting for a write. */
+00280 
+00281   do {
+00282     if(psock->readlen == 0) {
+00283       PT_WAIT_UNTIL(&psock->psockpt, psock_newdata(psock));
+00284       psock->state = STATE_READ;
+00285       psock->readptr = (u8_t *)uip_appdata;
+00286       psock->readlen = uip_datalen();
+00287     }
+00288   } while((buf_bufto(&psock->buf, c,
+00289                      &psock->readptr,
+00290                      &psock->readlen) & BUF_FOUND) == 0);
+00291   
+00292   if(psock_datalen(psock) == 0) {
+00293     psock->state = STATE_NONE;
+00294     PT_RESTART(&psock->psockpt);
+00295   }
+00296   PT_END(&psock->psockpt);
+00297 }
+00298 /*---------------------------------------------------------------------------*/
+00299 PT_THREAD(psock_readbuf(register struct psock *psock))
+00300 {
+00301   PT_BEGIN(&psock->psockpt);
+00302 
+00303   buf_setup(&psock->buf, psock->bufptr, psock->bufsize);
+00304   
+00305   /* XXX: Should add buf_checkmarker() before do{} loop, if
+00306      incoming data has been handled while waiting for a write. */
+00307 
+00308   do {
+00309     if(psock->readlen == 0) {
+00310       PT_WAIT_UNTIL(&psock->psockpt, psock_newdata(psock));
+00311       printf("Waited for newdata\n");
+00312       psock->state = STATE_READ;
+00313       psock->readptr = (u8_t *)uip_appdata;
+00314       psock->readlen = uip_datalen();
+00315     }
+00316   } while(buf_bufdata(&psock->buf, psock->bufsize,
+00317                          &psock->readptr,
+00318                          &psock->readlen) != BUF_FULL);
+00319 
+00320   if(psock_datalen(psock) == 0) {
+00321     psock->state = STATE_NONE;
+00322     PT_RESTART(&psock->psockpt);
+00323   }
+00324   PT_END(&psock->psockpt);
+00325 }
+00326 /*---------------------------------------------------------------------------*/
+00327 void
+00328 psock_init(register struct psock *psock, char *buffer, unsigned int buffersize)
+00329 {
+00330   psock->state = STATE_NONE;
+00331   psock->readlen = 0;
+00332   psock->bufptr = buffer;
+00333   psock->bufsize = buffersize;
+00334   buf_setup(&psock->buf, buffer, buffersize);
+00335   PT_INIT(&psock->pt);
+00336   PT_INIT(&psock->psockpt);
+00337 }
+00338 /*---------------------------------------------------------------------------*/
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00193.html b/third_party/uip-1.0/doc/html/a00193.html new file mode 100644 index 0000000..c9b6a9c --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00193.html @@ -0,0 +1,405 @@ + + +uIP 1.0: uip/psock.h Source File + + + + + + +

uip/psock.h

Go to the documentation of this file.
00001 /*
+00002  * Copyright (c) 2004, Swedish Institute of Computer Science.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * Author: Adam Dunkels <adam@sics.se>
+00032  *
+00033  * $Id: psock.h,v 1.3 2006/06/12 08:00:30 adam Exp $
+00034  */
+00035 
+00036 /**
+00037  * \defgroup psock Protosockets library
+00038  * @{
+00039  *
+00040  * The protosocket library provides an interface to the uIP stack that is
+00041  * similar to the traditional BSD socket interface. Unlike programs
+00042  * written for the ordinary uIP event-driven interface, programs
+00043  * written with the protosocket library are executed in a sequential
+00044  * fashion and does not have to be implemented as explicit state
+00045  * machines.
+00046  *
+00047  * Protosockets only work with TCP connections.
+00048  *
+00049  * The protosocket library uses \ref pt protothreads to provide
+00050  * sequential control flow. This makes the protosockets lightweight in
+00051  * terms of memory, but also means that protosockets inherits the
+00052  * functional limitations of protothreads. Each protosocket lives only
+00053  * within a single function. Automatic variables (stack variables) are
+00054  * not retained across a protosocket library function call.
+00055  *
+00056  * \note Because the protosocket library uses protothreads, local
+00057  * variables will not always be saved across a call to a protosocket
+00058  * library function. It is therefore advised that local variables are
+00059  * used with extreme care.
+00060  *
+00061  * The protosocket library provides functions for sending data without
+00062  * having to deal with retransmissions and acknowledgements, as well
+00063  * as functions for reading data without having to deal with data
+00064  * being split across more than one TCP segment.
+00065  *
+00066  * Because each protosocket runs as a protothread, the protosocket has to be
+00067  * started with a call to PSOCK_BEGIN() at the start of the function
+00068  * in which the protosocket is used. Similarly, the protosocket protothread can
+00069  * be terminated by a call to PSOCK_EXIT().
+00070  *
+00071  */
+00072 
+00073 /**
+00074  * \file
+00075  * Protosocket library header file
+00076  * \author
+00077  * Adam Dunkels <adam@sics.se>
+00078  *
+00079  */
+00080 
+00081 #ifndef __PSOCK_H__
+00082 #define __PSOCK_H__
+00083 
+00084 #include "uipopt.h"
+00085 #include "pt.h"
+00086 
+00087  /*
+00088  * The structure that holds the state of a buffer.
+00089  *
+00090  * This structure holds the state of a uIP buffer. The structure has
+00091  * no user-visible elements, but is used through the functions
+00092  * provided by the library.
+00093  *
+00094  */
+00095 struct psock_buf {
+00096   u8_t *ptr;
+00097   unsigned short left;
+00098 };
+00099 
+00100 /**
+00101  * The representation of a protosocket.
+00102  *
+00103  * The protosocket structrure is an opaque structure with no user-visible
+00104  * elements.
+00105  */
+00106 struct psock {
+00107   struct pt pt, psockpt; /* Protothreads - one that's using the psock
+00108                             functions, and one that runs inside the
+00109                             psock functions. */
+00110   const u8_t *sendptr;   /* Pointer to the next data to be sent. */
+00111   u8_t *readptr;         /* Pointer to the next data to be read. */
+00112   
+00113   char *bufptr;          /* Pointer to the buffer used for buffering
+00114                             incoming data. */
+00115   
+00116   u16_t sendlen;         /* The number of bytes left to be sent. */
+00117   u16_t readlen;         /* The number of bytes left to be read. */
+00118 
+00119   struct psock_buf buf;  /* The structure holding the state of the
+00120                             input buffer. */
+00121   unsigned int bufsize;  /* The size of the input buffer. */
+00122   
+00123   unsigned char state;   /* The state of the protosocket. */
+00124 };
+00125 
+00126 void psock_init(struct psock *psock, char *buffer, unsigned int buffersize);
+00127 /**
+00128  * Initialize a protosocket.
+00129  *
+00130  * This macro initializes a protosocket and must be called before the
+00131  * protosocket is used. The initialization also specifies the input buffer
+00132  * for the protosocket.
+00133  *
+00134  * \param psock (struct psock *) A pointer to the protosocket to be
+00135  * initialized
+00136  *
+00137  * \param buffer (char *) A pointer to the input buffer for the
+00138  * protosocket.
+00139  *
+00140  * \param buffersize (unsigned int) The size of the input buffer.
+00141  *
+00142  * \hideinitializer
+00143  */
+00144 #define PSOCK_INIT(psock, buffer, buffersize) \
+00145   psock_init(psock, buffer, buffersize)
+00146 
+00147 /**
+00148  * Start the protosocket protothread in a function.
+00149  *
+00150  * This macro starts the protothread associated with the protosocket and
+00151  * must come before other protosocket calls in the function it is used.
+00152  *
+00153  * \param psock (struct psock *) A pointer to the protosocket to be
+00154  * started.
+00155  *
+00156  * \hideinitializer
+00157  */
+00158 #define PSOCK_BEGIN(psock) PT_BEGIN(&((psock)->pt))
+00159 
+00160 PT_THREAD(psock_send(struct psock *psock, const char *buf, unsigned int len));
+00161 /**
+00162  * Send data.
+00163  *
+00164  * This macro sends data over a protosocket. The protosocket protothread blocks
+00165  * until all data has been sent and is known to have been received by
+00166  * the remote end of the TCP connection.
+00167  *
+00168  * \param psock (struct psock *) A pointer to the protosocket over which
+00169  * data is to be sent.
+00170  *
+00171  * \param data (char *) A pointer to the data that is to be sent.
+00172  *
+00173  * \param datalen (unsigned int) The length of the data that is to be
+00174  * sent.
+00175  *
+00176  * \hideinitializer
+00177  */
+00178 #define PSOCK_SEND(psock, data, datalen)                \
+00179     PT_WAIT_THREAD(&((psock)->pt), psock_send(psock, data, datalen))
+00180 
+00181 /**
+00182  * \brief      Send a null-terminated string.
+00183  * \param psock Pointer to the protosocket.
+00184  * \param str  The string to be sent.
+00185  *
+00186  *             This function sends a null-terminated string over the
+00187  *             protosocket.
+00188  *
+00189  * \hideinitializer
+00190  */
+00191 #define PSOCK_SEND_STR(psock, str)                      \
+00192     PT_WAIT_THREAD(&((psock)->pt), psock_send(psock, str, strlen(str)))
+00193 
+00194 PT_THREAD(psock_generator_send(struct psock *psock,
+00195                                 unsigned short (*f)(void *), void *arg));
+00196 
+00197 /**
+00198  * \brief      Generate data with a function and send it
+00199  * \param psock Pointer to the protosocket.
+00200  * \param generator Pointer to the generator function
+00201  * \param arg   Argument to the generator function
+00202  *
+00203  *             This function generates data and sends it over the
+00204  *             protosocket. This can be used to dynamically generate
+00205  *             data for a transmission, instead of generating the data
+00206  *             in a buffer beforehand. This function reduces the need for
+00207  *             buffer memory. The generator function is implemented by
+00208  *             the application, and a pointer to the function is given
+00209  *             as an argument with the call to PSOCK_GENERATOR_SEND().
+00210  *
+00211  *             The generator function should place the generated data
+00212  *             directly in the uip_appdata buffer, and return the
+00213  *             length of the generated data. The generator function is
+00214  *             called by the protosocket layer when the data first is
+00215  *             sent, and once for every retransmission that is needed.
+00216  *
+00217  * \hideinitializer
+00218  */
+00219 #define PSOCK_GENERATOR_SEND(psock, generator, arg)     \
+00220     PT_WAIT_THREAD(&((psock)->pt),                                      \
+00221                    psock_generator_send(psock, generator, arg))
+00222 
+00223 
+00224 /**
+00225  * Close a protosocket.
+00226  *
+00227  * This macro closes a protosocket and can only be called from within the
+00228  * protothread in which the protosocket lives.
+00229  *
+00230  * \param psock (struct psock *) A pointer to the protosocket that is to
+00231  * be closed.
+00232  *
+00233  * \hideinitializer
+00234  */
+00235 #define PSOCK_CLOSE(psock) uip_close()
+00236 
+00237 PT_THREAD(psock_readbuf(struct psock *psock));
+00238 /**
+00239  * Read data until the buffer is full.
+00240  *
+00241  * This macro will block waiting for data and read the data into the
+00242  * input buffer specified with the call to PSOCK_INIT(). Data is read
+00243  * until the buffer is full..
+00244  *
+00245  * \param psock (struct psock *) A pointer to the protosocket from which
+00246  * data should be read.
+00247  *
+00248  * \hideinitializer
+00249  */
+00250 #define PSOCK_READBUF(psock)                            \
+00251   PT_WAIT_THREAD(&((psock)->pt), psock_readbuf(psock))
+00252 
+00253 PT_THREAD(psock_readto(struct psock *psock, unsigned char c));
+00254 /**
+00255  * Read data up to a specified character.
+00256  *
+00257  * This macro will block waiting for data and read the data into the
+00258  * input buffer specified with the call to PSOCK_INIT(). Data is only
+00259  * read until the specifieed character appears in the data stream.
+00260  *
+00261  * \param psock (struct psock *) A pointer to the protosocket from which
+00262  * data should be read.
+00263  *
+00264  * \param c (char) The character at which to stop reading.
+00265  *
+00266  * \hideinitializer
+00267  */
+00268 #define PSOCK_READTO(psock, c)                          \
+00269   PT_WAIT_THREAD(&((psock)->pt), psock_readto(psock, c))
+00270 
+00271 /**
+00272  * The length of the data that was previously read.
+00273  *
+00274  * This macro returns the length of the data that was previously read
+00275  * using PSOCK_READTO() or PSOCK_READ().
+00276  *
+00277  * \param psock (struct psock *) A pointer to the protosocket holding the data.
+00278  *
+00279  * \hideinitializer
+00280  */
+00281 #define PSOCK_DATALEN(psock) psock_datalen(psock)
+00282 
+00283 u16_t psock_datalen(struct psock *psock);
+00284 
+00285 /**
+00286  * Exit the protosocket's protothread.
+00287  *
+00288  * This macro terminates the protothread of the protosocket and should
+00289  * almost always be used in conjunction with PSOCK_CLOSE().
+00290  *
+00291  * \sa PSOCK_CLOSE_EXIT()
+00292  *
+00293  * \param psock (struct psock *) A pointer to the protosocket.
+00294  *
+00295  * \hideinitializer
+00296  */
+00297 #define PSOCK_EXIT(psock) PT_EXIT(&((psock)->pt))
+00298 
+00299 /**
+00300  * Close a protosocket and exit the protosocket's protothread.
+00301  *
+00302  * This macro closes a protosocket and exits the protosocket's protothread.
+00303  *
+00304  * \param psock (struct psock *) A pointer to the protosocket.
+00305  *
+00306  * \hideinitializer
+00307  */
+00308 #define PSOCK_CLOSE_EXIT(psock)         \
+00309   do {                                          \
+00310     PSOCK_CLOSE(psock);                 \
+00311     PSOCK_EXIT(psock);                  \
+00312   } while(0)
+00313 
+00314 /**
+00315  * Declare the end of a protosocket's protothread.
+00316  *
+00317  * This macro is used for declaring that the protosocket's protothread
+00318  * ends. It must always be used together with a matching PSOCK_BEGIN()
+00319  * macro.
+00320  *
+00321  * \param psock (struct psock *) A pointer to the protosocket.
+00322  *
+00323  * \hideinitializer
+00324  */
+00325 #define PSOCK_END(psock) PT_END(&((psock)->pt))
+00326 
+00327 char psock_newdata(struct psock *s);
+00328 
+00329 /**
+00330  * Check if new data has arrived on a protosocket.
+00331  *
+00332  * This macro is used in conjunction with the PSOCK_WAIT_UNTIL()
+00333  * macro to check if data has arrived on a protosocket.
+00334  *
+00335  * \param psock (struct psock *) A pointer to the protosocket.
+00336  *
+00337  * \hideinitializer
+00338  */
+00339 #define PSOCK_NEWDATA(psock) psock_newdata(psock)
+00340 
+00341 /**
+00342  * Wait until a condition is true.
+00343  *
+00344  * This macro blocks the protothread until the specified condition is
+00345  * true. The macro PSOCK_NEWDATA() can be used to check if new data
+00346  * arrives when the protosocket is waiting.
+00347  *
+00348  * Typically, this macro is used as follows:
+00349  *
+00350  \code
+00351  PT_THREAD(thread(struct psock *s, struct timer *t))
+00352  {
+00353    PSOCK_BEGIN(s);
+00354 
+00355    PSOCK_WAIT_UNTIL(s, PSOCK_NEWADATA(s) || timer_expired(t));
+00356    
+00357    if(PSOCK_NEWDATA(s)) {
+00358      PSOCK_READTO(s, '\n');
+00359    } else {
+00360      handle_timed_out(s);
+00361    }
+00362    
+00363    PSOCK_END(s);
+00364  }
+00365  \endcode
+00366  *
+00367  * \param psock (struct psock *) A pointer to the protosocket.
+00368  * \param condition The condition to wait for.
+00369  *
+00370  * \hideinitializer
+00371  */
+00372 #define PSOCK_WAIT_UNTIL(psock, condition)    \
+00373   PT_WAIT_UNTIL(&((psock)->pt), (condition));
+00374 
+00375 #define PSOCK_WAIT_THREAD(psock, condition)   \
+00376   PT_WAIT_THREAD(&((psock)->pt), (condition))
+00377 
+00378 #endif /* __PSOCK_H__ */
+00379 
+00380 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00194.html b/third_party/uip-1.0/doc/html/a00194.html new file mode 100644 index 0000000..4ab6544 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00194.html @@ -0,0 +1,348 @@ + + +uIP 1.0: uip/pt.h Source File + + + + + + +

uip/pt.h

Go to the documentation of this file.
00001 /*
+00002  * Copyright (c) 2004-2005, Swedish Institute of Computer Science.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * Author: Adam Dunkels <adam@sics.se>
+00032  *
+00033  * $Id: pt.h,v 1.2 2006/06/12 08:00:30 adam Exp $
+00034  */
+00035 
+00036 /**
+00037  * \addtogroup pt
+00038  * @{
+00039  */
+00040 
+00041 /**
+00042  * \file
+00043  * Protothreads implementation.
+00044  * \author
+00045  * Adam Dunkels <adam@sics.se>
+00046  *
+00047  */
+00048 
+00049 #ifndef __PT_H__
+00050 #define __PT_H__
+00051 
+00052 #include "lc.h"
+00053 
+00054 struct pt {
+00055   lc_t lc;
+00056 };
+00057 
+00058 #define PT_WAITING 0
+00059 #define PT_EXITED  1
+00060 #define PT_ENDED   2
+00061 #define PT_YIELDED 3
+00062 
+00063 /**
+00064  * \name Initialization
+00065  * @{
+00066  */
+00067 
+00068 /**
+00069  * Initialize a protothread.
+00070  *
+00071  * Initializes a protothread. Initialization must be done prior to
+00072  * starting to execute the protothread.
+00073  *
+00074  * \param pt A pointer to the protothread control structure.
+00075  *
+00076  * \sa PT_SPAWN()
+00077  *
+00078  * \hideinitializer
+00079  */
+00080 #define PT_INIT(pt)   LC_INIT((pt)->lc)
+00081 
+00082 /** @} */
+00083 
+00084 /**
+00085  * \name Declaration and definition
+00086  * @{
+00087  */
+00088 
+00089 /**
+00090  * Declaration of a protothread.
+00091  *
+00092  * This macro is used to declare a protothread. All protothreads must
+00093  * be declared with this macro.
+00094  *
+00095  * \param name_args The name and arguments of the C function
+00096  * implementing the protothread.
+00097  *
+00098  * \hideinitializer
+00099  */
+00100 #define PT_THREAD(name_args) char name_args
+00101 
+00102 /**
+00103  * Declare the start of a protothread inside the C function
+00104  * implementing the protothread.
+00105  *
+00106  * This macro is used to declare the starting point of a
+00107  * protothread. It should be placed at the start of the function in
+00108  * which the protothread runs. All C statements above the PT_BEGIN()
+00109  * invokation will be executed each time the protothread is scheduled.
+00110  *
+00111  * \param pt A pointer to the protothread control structure.
+00112  *
+00113  * \hideinitializer
+00114  */
+00115 #define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc)
+00116 
+00117 /**
+00118  * Declare the end of a protothread.
+00119  *
+00120  * This macro is used for declaring that a protothread ends. It must
+00121  * always be used together with a matching PT_BEGIN() macro.
+00122  *
+00123  * \param pt A pointer to the protothread control structure.
+00124  *
+00125  * \hideinitializer
+00126  */
+00127 #define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \
+00128                    PT_INIT(pt); return PT_ENDED; }
+00129 
+00130 /** @} */
+00131 
+00132 /**
+00133  * \name Blocked wait
+00134  * @{
+00135  */
+00136 
+00137 /**
+00138  * Block and wait until condition is true.
+00139  *
+00140  * This macro blocks the protothread until the specified condition is
+00141  * true.
+00142  *
+00143  * \param pt A pointer to the protothread control structure.
+00144  * \param condition The condition.
+00145  *
+00146  * \hideinitializer
+00147  */
+00148 #define PT_WAIT_UNTIL(pt, condition)            \
+00149   do {                                          \
+00150     LC_SET((pt)->lc);                           \
+00151     if(!(condition)) {                          \
+00152       return PT_WAITING;                        \
+00153     }                                           \
+00154   } while(0)
+00155 
+00156 /**
+00157  * Block and wait while condition is true.
+00158  *
+00159  * This function blocks and waits while condition is true. See
+00160  * PT_WAIT_UNTIL().
+00161  *
+00162  * \param pt A pointer to the protothread control structure.
+00163  * \param cond The condition.
+00164  *
+00165  * \hideinitializer
+00166  */
+00167 #define PT_WAIT_WHILE(pt, cond)  PT_WAIT_UNTIL((pt), !(cond))
+00168 
+00169 /** @} */
+00170 
+00171 /**
+00172  * \name Hierarchical protothreads
+00173  * @{
+00174  */
+00175 
+00176 /**
+00177  * Block and wait until a child protothread completes.
+00178  *
+00179  * This macro schedules a child protothread. The current protothread
+00180  * will block until the child protothread completes.
+00181  *
+00182  * \note The child protothread must be manually initialized with the
+00183  * PT_INIT() function before this function is used.
+00184  *
+00185  * \param pt A pointer to the protothread control structure.
+00186  * \param thread The child protothread with arguments
+00187  *
+00188  * \sa PT_SPAWN()
+00189  *
+00190  * \hideinitializer
+00191  */
+00192 #define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread))
+00193 
+00194 /**
+00195  * Spawn a child protothread and wait until it exits.
+00196  *
+00197  * This macro spawns a child protothread and waits until it exits. The
+00198  * macro can only be used within a protothread.
+00199  *
+00200  * \param pt A pointer to the protothread control structure.
+00201  * \param child A pointer to the child protothread's control structure.
+00202  * \param thread The child protothread with arguments
+00203  *
+00204  * \hideinitializer
+00205  */
+00206 #define PT_SPAWN(pt, child, thread)             \
+00207   do {                                          \
+00208     PT_INIT((child));                           \
+00209     PT_WAIT_THREAD((pt), (thread));             \
+00210   } while(0)
+00211 
+00212 /** @} */
+00213 
+00214 /**
+00215  * \name Exiting and restarting
+00216  * @{
+00217  */
+00218 
+00219 /**
+00220  * Restart the protothread.
+00221  *
+00222  * This macro will block and cause the running protothread to restart
+00223  * its execution at the place of the PT_BEGIN() call.
+00224  *
+00225  * \param pt A pointer to the protothread control structure.
+00226  *
+00227  * \hideinitializer
+00228  */
+00229 #define PT_RESTART(pt)                          \
+00230   do {                                          \
+00231     PT_INIT(pt);                                \
+00232     return PT_WAITING;                  \
+00233   } while(0)
+00234 
+00235 /**
+00236  * Exit the protothread.
+00237  *
+00238  * This macro causes the protothread to exit. If the protothread was
+00239  * spawned by another protothread, the parent protothread will become
+00240  * unblocked and can continue to run.
+00241  *
+00242  * \param pt A pointer to the protothread control structure.
+00243  *
+00244  * \hideinitializer
+00245  */
+00246 #define PT_EXIT(pt)                             \
+00247   do {                                          \
+00248     PT_INIT(pt);                                \
+00249     return PT_EXITED;                   \
+00250   } while(0)
+00251 
+00252 /** @} */
+00253 
+00254 /**
+00255  * \name Calling a protothread
+00256  * @{
+00257  */
+00258 
+00259 /**
+00260  * Schedule a protothread.
+00261  *
+00262  * This function shedules a protothread. The return value of the
+00263  * function is non-zero if the protothread is running or zero if the
+00264  * protothread has exited.
+00265  *
+00266  * \param f The call to the C function implementing the protothread to
+00267  * be scheduled
+00268  *
+00269  * \hideinitializer
+00270  */
+00271 #define PT_SCHEDULE(f) ((f) == PT_WAITING)
+00272 
+00273 /** @} */
+00274 
+00275 /**
+00276  * \name Yielding from a protothread
+00277  * @{
+00278  */
+00279 
+00280 /**
+00281  * Yield from the current protothread.
+00282  *
+00283  * This function will yield the protothread, thereby allowing other
+00284  * processing to take place in the system.
+00285  *
+00286  * \param pt A pointer to the protothread control structure.
+00287  *
+00288  * \hideinitializer
+00289  */
+00290 #define PT_YIELD(pt)                            \
+00291   do {                                          \
+00292     PT_YIELD_FLAG = 0;                          \
+00293     LC_SET((pt)->lc);                           \
+00294     if(PT_YIELD_FLAG == 0) {                    \
+00295       return PT_YIELDED;                        \
+00296     }                                           \
+00297   } while(0)
+00298 
+00299 /**
+00300  * \brief      Yield from the protothread until a condition occurs.
+00301  * \param pt   A pointer to the protothread control structure.
+00302  * \param cond The condition.
+00303  *
+00304  *             This function will yield the protothread, until the
+00305  *             specified condition evaluates to true.
+00306  *
+00307  *
+00308  * \hideinitializer
+00309  */
+00310 #define PT_YIELD_UNTIL(pt, cond)                \
+00311   do {                                          \
+00312     PT_YIELD_FLAG = 0;                          \
+00313     LC_SET((pt)->lc);                           \
+00314     if((PT_YIELD_FLAG == 0) || !(cond)) {       \
+00315       return PT_YIELDED;                        \
+00316     }                                           \
+00317   } while(0)
+00318 
+00319 /** @} */
+00320 
+00321 #endif /* __PT_H__ */
+00322 
+00323 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00195.html b/third_party/uip-1.0/doc/html/a00195.html new file mode 100644 index 0000000..de584d0 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00195.html @@ -0,0 +1,152 @@ + + +uIP 1.0: uip/timer.c Source File + + + + + + +

uip/timer.c

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup timer
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \file
+00008  * Timer library implementation.
+00009  * \author
+00010  * Adam Dunkels <adam@sics.se>
+00011  */
+00012 
+00013 /*
+00014  * Copyright (c) 2004, Swedish Institute of Computer Science.
+00015  * All rights reserved.
+00016  *
+00017  * Redistribution and use in source and binary forms, with or without
+00018  * modification, are permitted provided that the following conditions
+00019  * are met:
+00020  * 1. Redistributions of source code must retain the above copyright
+00021  *    notice, this list of conditions and the following disclaimer.
+00022  * 2. Redistributions in binary form must reproduce the above copyright
+00023  *    notice, this list of conditions and the following disclaimer in the
+00024  *    documentation and/or other materials provided with the distribution.
+00025  * 3. Neither the name of the Institute nor the names of its contributors
+00026  *    may be used to endorse or promote products derived from this software
+00027  *    without specific prior written permission.
+00028  *
+00029  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00030  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00031  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00032  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00033  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00034  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00035  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00036  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00037  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00038  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00039  * SUCH DAMAGE.
+00040  *
+00041  * This file is part of the uIP TCP/IP stack
+00042  *
+00043  * Author: Adam Dunkels <adam@sics.se>
+00044  *
+00045  * $Id: timer.c,v 1.2 2006/06/12 08:00:30 adam Exp $
+00046  */
+00047 
+00048 #include "clock.h"
+00049 #include "timer.h"
+00050 
+00051 /*---------------------------------------------------------------------------*/
+00052 /**
+00053  * Set a timer.
+00054  *
+00055  * This function is used to set a timer for a time sometime in the
+00056  * future. The function timer_expired() will evaluate to true after
+00057  * the timer has expired.
+00058  *
+00059  * \param t A pointer to the timer
+00060  * \param interval The interval before the timer expires.
+00061  *
+00062  */
+00063 void
+00064 timer_set(struct timer *t, clock_time_t interval)
+00065 {
+00066   t->interval = interval;
+00067   t->start = clock_time();
+00068 }
+00069 /*---------------------------------------------------------------------------*/
+00070 /**
+00071  * Reset the timer with the same interval.
+00072  *
+00073  * This function resets the timer with the same interval that was
+00074  * given to the timer_set() function. The start point of the interval
+00075  * is the exact time that the timer last expired. Therefore, this
+00076  * function will cause the timer to be stable over time, unlike the
+00077  * timer_rester() function.
+00078  *
+00079  * \param t A pointer to the timer.
+00080  *
+00081  * \sa timer_restart()
+00082  */
+00083 void
+00084 timer_reset(struct timer *t)
+00085 {
+00086   t->start += t->interval;
+00087 }
+00088 /*---------------------------------------------------------------------------*/
+00089 /**
+00090  * Restart the timer from the current point in time
+00091  *
+00092  * This function restarts a timer with the same interval that was
+00093  * given to the timer_set() function. The timer will start at the
+00094  * current time.
+00095  *
+00096  * \note A periodic timer will drift if this function is used to reset
+00097  * it. For preioric timers, use the timer_reset() function instead.
+00098  *
+00099  * \param t A pointer to the timer.
+00100  *
+00101  * \sa timer_reset()
+00102  */
+00103 void
+00104 timer_restart(struct timer *t)
+00105 {
+00106   t->start = clock_time();
+00107 }
+00108 /*---------------------------------------------------------------------------*/
+00109 /**
+00110  * Check if a timer has expired.
+00111  *
+00112  * This function tests if a timer has expired and returns true or
+00113  * false depending on its status.
+00114  *
+00115  * \param t A pointer to the timer
+00116  *
+00117  * \return Non-zero if the timer has expired, zero otherwise.
+00118  *
+00119  */
+00120 int
+00121 timer_expired(struct timer *t)
+00122 {
+00123   return (clock_time_t)(clock_time() - t->start) >= (clock_time_t)t->interval;
+00124 }
+00125 /*---------------------------------------------------------------------------*/
+00126 
+00127 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00196.html b/third_party/uip-1.0/doc/html/a00196.html new file mode 100644 index 0000000..83f3824 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00196.html @@ -0,0 +1,111 @@ + + +uIP 1.0: uip/timer.h Source File + + + + + + +

uip/timer.h

Go to the documentation of this file.
00001 /**
+00002  * \defgroup timer Timer library
+00003  *
+00004  * The timer library provides functions for setting, resetting and
+00005  * restarting timers, and for checking if a timer has expired. An
+00006  * application must "manually" check if its timers have expired; this
+00007  * is not done automatically.
+00008  *
+00009  * A timer is declared as a \c struct \c timer and all access to the
+00010  * timer is made by a pointer to the declared timer.
+00011  *
+00012  * \note The timer library uses the \ref clock "Clock library" to
+00013  * measure time. Intervals should be specified in the format used by
+00014  * the clock library.
+00015  *
+00016  * @{
+00017  */
+00018 
+00019 
+00020 /**
+00021  * \file
+00022  * Timer library header file.
+00023  * \author
+00024  * Adam Dunkels <adam@sics.se>
+00025  */
+00026 
+00027 /*
+00028  * Copyright (c) 2004, Swedish Institute of Computer Science.
+00029  * All rights reserved.
+00030  *
+00031  * Redistribution and use in source and binary forms, with or without
+00032  * modification, are permitted provided that the following conditions
+00033  * are met:
+00034  * 1. Redistributions of source code must retain the above copyright
+00035  *    notice, this list of conditions and the following disclaimer.
+00036  * 2. Redistributions in binary form must reproduce the above copyright
+00037  *    notice, this list of conditions and the following disclaimer in the
+00038  *    documentation and/or other materials provided with the distribution.
+00039  * 3. Neither the name of the Institute nor the names of its contributors
+00040  *    may be used to endorse or promote products derived from this software
+00041  *    without specific prior written permission.
+00042  *
+00043  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00044  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00045  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00046  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00047  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00048  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00049  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00050  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00051  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00052  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00053  * SUCH DAMAGE.
+00054  *
+00055  * This file is part of the uIP TCP/IP stack
+00056  *
+00057  * Author: Adam Dunkels <adam@sics.se>
+00058  *
+00059  * $Id: timer.h,v 1.3 2006/06/11 21:46:39 adam Exp $
+00060  */
+00061 #ifndef __TIMER_H__
+00062 #define __TIMER_H__
+00063 
+00064 #include "clock.h"
+00065 
+00066 /**
+00067  * A timer.
+00068  *
+00069  * This structure is used for declaring a timer. The timer must be set
+00070  * with timer_set() before it can be used.
+00071  *
+00072  * \hideinitializer
+00073  */
+00074 struct timer {
+00075   clock_time_t start;
+00076   clock_time_t interval;
+00077 };
+00078 
+00079 void timer_set(struct timer *t, clock_time_t interval);
+00080 void timer_reset(struct timer *t);
+00081 void timer_restart(struct timer *t);
+00082 int timer_expired(struct timer *t);
+00083 
+00084 #endif /* __TIMER_H__ */
+00085 
+00086 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00197.html b/third_party/uip-1.0/doc/html/a00197.html new file mode 100644 index 0000000..9b6016b --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00197.html @@ -0,0 +1,183 @@ + + +uIP 1.0: uip/uip-neighbor.c Source File + + + + + + +

uip/uip-neighbor.c

Go to the documentation of this file.
00001 /*
+00002  * Copyright (c) 2006, Swedish Institute of Computer Science.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * $Id: uip-neighbor.c,v 1.2 2006/06/12 08:00:30 adam Exp $
+00032  */
+00033 
+00034 /**
+00035  * \file
+00036  *         Database of link-local neighbors, used by IPv6 code and
+00037  *         to be used by a future ARP code rewrite.
+00038  * \author
+00039  *         Adam Dunkels <adam@sics.se>
+00040  */
+00041 
+00042 #include "uip-neighbor.h"
+00043 
+00044 #include <string.h>
+00045 
+00046 #define MAX_TIME 128
+00047 
+00048 #ifdef UIP_NEIGHBOR_CONF_ENTRIES
+00049 #define ENTRIES UIP_NEIGHBOR_CONF_ENTRIES
+00050 #else /* UIP_NEIGHBOR_CONF_ENTRIES */
+00051 #define ENTRIES 8
+00052 #endif /* UIP_NEIGHBOR_CONF_ENTRIES */
+00053 
+00054 struct neighbor_entry {
+00055   uip_ipaddr_t ipaddr;
+00056   struct uip_neighbor_addr addr;
+00057   u8_t time;
+00058 };
+00059 static struct neighbor_entry entries[ENTRIES];
+00060 
+00061 /*---------------------------------------------------------------------------*/
+00062 void
+00063 uip_neighbor_init(void)
+00064 {
+00065   int i;
+00066 
+00067   for(i = 0; i < ENTRIES; ++i) {
+00068     entries[i].time = MAX_TIME;
+00069   }
+00070 }
+00071 /*---------------------------------------------------------------------------*/
+00072 void
+00073 uip_neighbor_periodic(void)
+00074 {
+00075   int i;
+00076 
+00077   for(i = 0; i < ENTRIES; ++i) {
+00078     if(entries[i].time < MAX_TIME) {
+00079       entries[i].time++;
+00080     }
+00081   }
+00082 }
+00083 /*---------------------------------------------------------------------------*/
+00084 void
+00085 uip_neighbor_add(uip_ipaddr_t ipaddr, struct uip_neighbor_addr *addr)
+00086 {
+00087   int i, oldest;
+00088   u8_t oldest_time;
+00089 
+00090   printf("Adding neighbor with link address %02x:%02x:%02x:%02x:%02x:%02x\n",
+00091          addr->addr.addr[0], addr->addr.addr[1], addr->addr.addr[2], addr->addr.addr[3],
+00092          addr->addr.addr[4], addr->addr.addr[5]);
+00093   
+00094   /* Find the first unused entry or the oldest used entry. */
+00095   oldest_time = 0;
+00096   oldest = 0;
+00097   for(i = 0; i < ENTRIES; ++i) {
+00098     if(entries[i].time == MAX_TIME) {
+00099       oldest = i;
+00100       break;
+00101     }
+00102     if(uip_ipaddr_cmp(entries[i].ipaddr, addr)) {
+00103       oldest = i;
+00104       break;
+00105     }
+00106     if(entries[i].time > oldest_time) {
+00107       oldest = i;
+00108       oldest_time = entries[i].time;
+00109     }
+00110   }
+00111 
+00112   /* Use the oldest or first free entry (either pointed to by the
+00113      "oldest" variable). */
+00114   entries[oldest].time = 0;
+00115   uip_ipaddr_copy(entries[oldest].ipaddr, ipaddr);
+00116   memcpy(&entries[oldest].addr, addr, sizeof(struct uip_neighbor_addr));
+00117 }
+00118 /*---------------------------------------------------------------------------*/
+00119 static struct neighbor_entry *
+00120 find_entry(uip_ipaddr_t ipaddr)
+00121 {
+00122   int i;
+00123   
+00124   for(i = 0; i < ENTRIES; ++i) {
+00125     if(uip_ipaddr_cmp(entries[i].ipaddr, ipaddr)) {
+00126       return &entries[i];
+00127     }
+00128   }
+00129   return NULL;
+00130 }
+00131 /*---------------------------------------------------------------------------*/
+00132 void
+00133 uip_neighbor_update(uip_ipaddr_t ipaddr)
+00134 {
+00135   struct neighbor_entry *e;
+00136 
+00137   e = find_entry(ipaddr);
+00138   if(e != NULL) {
+00139     e->time = 0;
+00140   }
+00141 }
+00142 /*---------------------------------------------------------------------------*/
+00143 struct uip_neighbor_addr *
+00144 uip_neighbor_lookup(uip_ipaddr_t ipaddr)
+00145 {
+00146   struct neighbor_entry *e;
+00147 
+00148   e = find_entry(ipaddr);
+00149   if(e != NULL) {
+00150     /*    printf("Lookup neighbor with link address %02x:%02x:%02x:%02x:%02x:%02x\n",
+00151            e->addr.addr.addr[0], e->addr.addr.addr[1], e->addr.addr.addr[2], e->addr.addr.addr[3],
+00152            e->addr.addr.addr[4], e->addr.addr.addr[5]);*/
+00153 
+00154     return &e->addr;
+00155   }
+00156   return NULL;
+00157 }
+00158 /*---------------------------------------------------------------------------*/
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00198.html b/third_party/uip-1.0/doc/html/a00198.html new file mode 100644 index 0000000..8332e63 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00198.html @@ -0,0 +1,86 @@ + + +uIP 1.0: uip/uip-neighbor.h Source File + + + + + + +

uip/uip-neighbor.h

Go to the documentation of this file.
00001 /*
+00002  * Copyright (c) 2006, Swedish Institute of Computer Science.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * $Id: uip-neighbor.h,v 1.2 2006/06/12 08:00:30 adam Exp $
+00032  */
+00033 
+00034 /**
+00035  * \file
+00036  *         Header file for database of link-local neighbors, used by
+00037  *         IPv6 code and to be used by future ARP code.
+00038  * \author
+00039  *         Adam Dunkels <adam@sics.se>
+00040  */
+00041 
+00042 #ifndef __UIP_NEIGHBOR_H__
+00043 #define __UIP_NEIGHBOR_H__
+00044 
+00045 #include "uip.h"
+00046 
+00047 struct uip_neighbor_addr {
+00048 #if UIP_NEIGHBOR_CONF_ADDRTYPE
+00049   UIP_NEIGHBOR_CONF_ADDRTYPE addr;
+00050 #else
+00051   struct uip_eth_addr addr;
+00052 #endif
+00053 };
+00054 
+00055 void uip_neighbor_init(void);
+00056 void uip_neighbor_add(uip_ipaddr_t ipaddr, struct uip_neighbor_addr *addr);
+00057 void uip_neighbor_update(uip_ipaddr_t ipaddr);
+00058 struct uip_neighbor_addr *uip_neighbor_lookup(uip_ipaddr_t ipaddr);
+00059 void uip_neighbor_periodic(void);
+00060 
+00061 #endif /* __UIP-NEIGHBOR_H__ */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00199.html b/third_party/uip-1.0/doc/html/a00199.html new file mode 100644 index 0000000..cefa82b --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00199.html @@ -0,0 +1,161 @@ + + +uIP 1.0: uip/uip-split.c Source File + + + + + + +

uip/uip-split.c

00001 /*
+00002  * Copyright (c) 2004, Swedish Institute of Computer Science.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * Author: Adam Dunkels <adam@sics.se>
+00032  *
+00033  * $Id: uip-split.c,v 1.2 2006/06/12 08:00:30 adam Exp $
+00034  */
+00035 
+00036 #include <string.h>
+00037 
+00038 #include "uip-split.h"
+00039 #include "uip.h"
+00040 #include "uip-fw.h"
+00041 #include "uip_arch.h"
+00042 
+00043 
+00044 
+00045 #define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
+00046 
+00047 /*-----------------------------------------------------------------------------*/
+00048 void
+00049 uip_split_output(void)
+00050 {
+00051   u16_t tcplen, len1, len2;
+00052 
+00053   /* We only try to split maximum sized TCP segments. */
+00054   if(BUF->proto == UIP_PROTO_TCP &&
+00055      uip_len == UIP_BUFSIZE - UIP_LLH_LEN) {
+00056 
+00057     tcplen = uip_len - UIP_TCPIP_HLEN;
+00058     /* Split the segment in two. If the original packet length was
+00059        odd, we make the second packet one byte larger. */
+00060     len1 = len2 = tcplen / 2;
+00061     if(len1 + len2 < tcplen) {
+00062       ++len2;
+00063     }
+00064 
+00065     /* Create the first packet. This is done by altering the length
+00066        field of the IP header and updating the checksums. */
+00067     uip_len = len1 + UIP_TCPIP_HLEN;
+00068 #if UIP_CONF_IPV6
+00069     /* For IPv6, the IP length field does not include the IPv6 IP header
+00070        length. */
+00071     BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
+00072     BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff);
+00073 #else /* UIP_CONF_IPV6 */
+00074     BUF->len[0] = uip_len >> 8;
+00075     BUF->len[1] = uip_len & 0xff;
+00076 #endif /* UIP_CONF_IPV6 */
+00077     
+00078     /* Recalculate the TCP checksum. */
+00079     BUF->tcpchksum = 0;
+00080     BUF->tcpchksum = ~(uip_tcpchksum());
+00081 
+00082 #if !UIP_CONF_IPV6
+00083     /* Recalculate the IP checksum. */
+00084     BUF->ipchksum = 0;
+00085     BUF->ipchksum = ~(uip_ipchksum());
+00086 #endif /* UIP_CONF_IPV6 */
+00087     
+00088     /* Transmit the first packet. */
+00089     /*    uip_fw_output();*/
+00090     tcpip_output();
+00091 
+00092     /* Now, create the second packet. To do this, it is not enough to
+00093        just alter the length field, but we must also update the TCP
+00094        sequence number and point the uip_appdata to a new place in
+00095        memory. This place is detemined by the length of the first
+00096        packet (len1). */
+00097     uip_len = len2 + UIP_TCPIP_HLEN;
+00098 #if UIP_CONF_IPV6
+00099     /* For IPv6, the IP length field does not include the IPv6 IP header
+00100        length. */
+00101     BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
+00102     BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff);
+00103 #else /* UIP_CONF_IPV6 */
+00104     BUF->len[0] = uip_len >> 8;
+00105     BUF->len[1] = uip_len & 0xff;
+00106 #endif /* UIP_CONF_IPV6 */
+00107     
+00108     /*    uip_appdata += len1;*/
+00109     memcpy(uip_appdata, (u8_t *)uip_appdata + len1, len2);
+00110 
+00111     uip_add32(BUF->seqno, len1);
+00112     BUF->seqno[0] = uip_acc32[0];
+00113     BUF->seqno[1] = uip_acc32[1];
+00114     BUF->seqno[2] = uip_acc32[2];
+00115     BUF->seqno[3] = uip_acc32[3];
+00116     
+00117     /* Recalculate the TCP checksum. */
+00118     BUF->tcpchksum = 0;
+00119     BUF->tcpchksum = ~(uip_tcpchksum());
+00120 
+00121 #if !UIP_CONF_IPV6
+00122     /* Recalculate the IP checksum. */
+00123     BUF->ipchksum = 0;
+00124     BUF->ipchksum = ~(uip_ipchksum());
+00125 #endif /* UIP_CONF_IPV6 */
+00126 
+00127     /* Transmit the second packet. */
+00128     /*    uip_fw_output();*/
+00129     tcpip_output();
+00130   } else {
+00131     /*    uip_fw_output();*/
+00132     tcpip_output();
+00133   }
+00134      
+00135 }
+00136 /*-----------------------------------------------------------------------------*/
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00200.html b/third_party/uip-1.0/doc/html/a00200.html new file mode 100644 index 0000000..2515484 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00200.html @@ -0,0 +1,121 @@ + + +uIP 1.0: uip/uip-split.h Source File + + + + + + +

uip/uip-split.h

Go to the documentation of this file.
00001 /*
+00002  * Copyright (c) 2004, Swedish Institute of Computer Science.
+00003  * All rights reserved.
+00004  *
+00005  * Redistribution and use in source and binary forms, with or without
+00006  * modification, are permitted provided that the following conditions
+00007  * are met:
+00008  * 1. Redistributions of source code must retain the above copyright
+00009  *    notice, this list of conditions and the following disclaimer.
+00010  * 2. Redistributions in binary form must reproduce the above copyright
+00011  *    notice, this list of conditions and the following disclaimer in the
+00012  *    documentation and/or other materials provided with the distribution.
+00013  * 3. Neither the name of the Institute nor the names of its contributors
+00014  *    may be used to endorse or promote products derived from this software
+00015  *    without specific prior written permission.
+00016  *
+00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00027  * SUCH DAMAGE.
+00028  *
+00029  * This file is part of the uIP TCP/IP stack
+00030  *
+00031  * Author: Adam Dunkels <adam@sics.se>
+00032  *
+00033  * $Id: uip-split.h,v 1.2 2006/06/12 08:00:30 adam Exp $
+00034  */
+00035 /**
+00036  * \addtogroup uip
+00037  * @{
+00038  */
+00039 
+00040 /**
+00041  * \defgroup uipsplit uIP TCP throughput booster hack
+00042  * @{
+00043  *
+00044  * The basic uIP TCP implementation only allows each TCP connection to
+00045  * have a single TCP segment in flight at any given time. Because of
+00046  * the delayed ACK algorithm employed by most TCP receivers, uIP's
+00047  * limit on the amount of in-flight TCP segments seriously reduces the
+00048  * maximum achievable throughput for sending data from uIP.
+00049  *
+00050  * The uip-split module is a hack which tries to remedy this
+00051  * situation. By splitting maximum sized outgoing TCP segments into
+00052  * two, the delayed ACK algorithm is not invoked at TCP
+00053  * receivers. This improves the throughput when sending data from uIP
+00054  * by orders of magnitude.
+00055  *
+00056  * The uip-split module uses the uip-fw module (uIP IP packet
+00057  * forwarding) for sending packets. Therefore, the uip-fw module must
+00058  * be set up with the appropriate network interfaces for this module
+00059  * to work.
+00060  */
+00061 
+00062 
+00063 /**
+00064  * \file
+00065  * Module for splitting outbound TCP segments in two to avoid the
+00066  * delayed ACK throughput degradation.
+00067  * \author
+00068  * Adam Dunkels <adam@sics.se>
+00069  *
+00070  */
+00071 
+00072 #ifndef __UIP_SPLIT_H__
+00073 #define __UIP_SPLIT_H__
+00074 
+00075 /**
+00076  * Handle outgoing packets.
+00077  *
+00078  * This function inspects an outgoing packet in the uip_buf buffer and
+00079  * sends it out using the uip_fw_output() function. If the packet is a
+00080  * full-sized TCP segment it will be split into two segments and
+00081  * transmitted separately. This function should be called instead of
+00082  * the actual device driver output function, or the uip_fw_output()
+00083  * function.
+00084  *
+00085  * The headers of the outgoing packet is assumed to be in the uip_buf
+00086  * buffer and the payload is assumed to be wherever uip_appdata
+00087  * points. The length of the outgoing packet is assumed to be in the
+00088  * uip_len variable.
+00089  *
+00090  */
+00091 void uip_split_output(void);
+00092 
+00093 #endif /* __UIP_SPLIT_H__ */
+00094 
+00095 /** @} */
+00096 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00201.html b/third_party/uip-1.0/doc/html/a00201.html new file mode 100644 index 0000000..010d216 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00201.html @@ -0,0 +1,1922 @@ + + +uIP 1.0: uip/uip.c Source File + + + + + + +

uip/uip.c

Go to the documentation of this file.
00001 #define DEBUG_PRINTF(...) /*printf(__VA_ARGS__)*/
+00002 
+00003 /**
+00004  * \defgroup uip The uIP TCP/IP stack
+00005  * @{
+00006  *
+00007  * uIP is an implementation of the TCP/IP protocol stack intended for
+00008  * small 8-bit and 16-bit microcontrollers.
+00009  *
+00010  * uIP provides the necessary protocols for Internet communication,
+00011  * with a very small code footprint and RAM requirements - the uIP
+00012  * code size is on the order of a few kilobytes and RAM usage is on
+00013  * the order of a few hundred bytes.
+00014  */
+00015 
+00016 /**
+00017  * \file
+00018  * The uIP TCP/IP stack code.
+00019  * \author Adam Dunkels <adam@dunkels.com>
+00020  */
+00021 
+00022 /*
+00023  * Copyright (c) 2001-2003, Adam Dunkels.
+00024  * All rights reserved.
+00025  *
+00026  * Redistribution and use in source and binary forms, with or without
+00027  * modification, are permitted provided that the following conditions
+00028  * are met:
+00029  * 1. Redistributions of source code must retain the above copyright
+00030  *    notice, this list of conditions and the following disclaimer.
+00031  * 2. Redistributions in binary form must reproduce the above copyright
+00032  *    notice, this list of conditions and the following disclaimer in the
+00033  *    documentation and/or other materials provided with the distribution.
+00034  * 3. The name of the author may not be used to endorse or promote
+00035  *    products derived from this software without specific prior
+00036  *    written permission.
+00037  *
+00038  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00039  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00040  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00041  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00042  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00043  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00044  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00045  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00046  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00047  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00048  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00049  *
+00050  * This file is part of the uIP TCP/IP stack.
+00051  *
+00052  * $Id: uip.c,v 1.65 2006/06/11 21:46:39 adam Exp $
+00053  *
+00054  */
+00055 
+00056 /*
+00057  * uIP is a small implementation of the IP, UDP and TCP protocols (as
+00058  * well as some basic ICMP stuff). The implementation couples the IP,
+00059  * UDP, TCP and the application layers very tightly. To keep the size
+00060  * of the compiled code down, this code frequently uses the goto
+00061  * statement. While it would be possible to break the uip_process()
+00062  * function into many smaller functions, this would increase the code
+00063  * size because of the overhead of parameter passing and the fact that
+00064  * the optimier would not be as efficient.
+00065  *
+00066  * The principle is that we have a small buffer, called the uip_buf,
+00067  * in which the device driver puts an incoming packet. The TCP/IP
+00068  * stack parses the headers in the packet, and calls the
+00069  * application. If the remote host has sent data to the application,
+00070  * this data is present in the uip_buf and the application read the
+00071  * data from there. It is up to the application to put this data into
+00072  * a byte stream if needed. The application will not be fed with data
+00073  * that is out of sequence.
+00074  *
+00075  * If the application whishes to send data to the peer, it should put
+00076  * its data into the uip_buf. The uip_appdata pointer points to the
+00077  * first available byte. The TCP/IP stack will calculate the
+00078  * checksums, and fill in the necessary header fields and finally send
+00079  * the packet back to the peer.
+00080 */
+00081 
+00082 #include "uip.h"
+00083 #include "uipopt.h"
+00084 #include "uip_arch.h"
+00085 
+00086 #if UIP_CONF_IPV6
+00087 #include "uip-neighbor.h"
+00088 #endif /* UIP_CONF_IPV6 */
+00089 
+00090 #include <string.h>
+00091 
+00092 /*---------------------------------------------------------------------------*/
+00093 /* Variable definitions. */
+00094 
+00095 
+00096 /* The IP address of this host. If it is defined to be fixed (by
+00097    setting UIP_FIXEDADDR to 1 in uipopt.h), the address is set
+00098    here. Otherwise, the address */
+00099 #if UIP_FIXEDADDR > 0
+00100 const uip_ipaddr_t uip_hostaddr =
+00101   {HTONS((UIP_IPADDR0 << 8) | UIP_IPADDR1),
+00102    HTONS((UIP_IPADDR2 << 8) | UIP_IPADDR3)};
+00103 const uip_ipaddr_t uip_draddr =
+00104   {HTONS((UIP_DRIPADDR0 << 8) | UIP_DRIPADDR1),
+00105    HTONS((UIP_DRIPADDR2 << 8) | UIP_DRIPADDR3)};
+00106 const uip_ipaddr_t uip_netmask =
+00107   {HTONS((UIP_NETMASK0 << 8) | UIP_NETMASK1),
+00108    HTONS((UIP_NETMASK2 << 8) | UIP_NETMASK3)};
+00109 #else
+00110 uip_ipaddr_t uip_hostaddr, uip_draddr, uip_netmask;
+00111 #endif /* UIP_FIXEDADDR */
+00112 
+00113 static const uip_ipaddr_t all_ones_addr =
+00114 #if UIP_CONF_IPV6
+00115   {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff};
+00116 #else /* UIP_CONF_IPV6 */
+00117   {0xffff,0xffff};
+00118 #endif /* UIP_CONF_IPV6 */
+00119 static const uip_ipaddr_t all_zeroes_addr =
+00120 #if UIP_CONF_IPV6
+00121   {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000};
+00122 #else /* UIP_CONF_IPV6 */
+00123   {0x0000,0x0000};
+00124 #endif /* UIP_CONF_IPV6 */
+00125 
+00126 
+00127 #if UIP_FIXEDETHADDR
+00128 const struct uip_eth_addr uip_ethaddr = {{UIP_ETHADDR0,
+00129                                           UIP_ETHADDR1,
+00130                                           UIP_ETHADDR2,
+00131                                           UIP_ETHADDR3,
+00132                                           UIP_ETHADDR4,
+00133                                           UIP_ETHADDR5}};
+00134 #else
+00135 struct uip_eth_addr uip_ethaddr = {{0,0,0,0,0,0}};
+00136 #endif
+00137 
+00138 #ifndef UIP_CONF_EXTERNAL_BUFFER
+00139 u8_t uip_buf[UIP_BUFSIZE + 2];   /* The packet buffer that contains
+00140                                     incoming packets. */
+00141 #endif /* UIP_CONF_EXTERNAL_BUFFER */
+00142 
+00143 void *uip_appdata;               /* The uip_appdata pointer points to
+00144                                     application data. */
+00145 void *uip_sappdata;              /* The uip_appdata pointer points to
+00146                                     the application data which is to
+00147                                     be sent. */
+00148 #if UIP_URGDATA > 0
+00149 void *uip_urgdata;               /* The uip_urgdata pointer points to
+00150                                     urgent data (out-of-band data), if
+00151                                     present. */
+00152 u16_t uip_urglen, uip_surglen;
+00153 #endif /* UIP_URGDATA > 0 */
+00154 
+00155 u16_t uip_len, uip_slen;
+00156                              /* The uip_len is either 8 or 16 bits,
+00157                                 depending on the maximum packet
+00158                                 size. */
+00159 
+00160 u8_t uip_flags;     /* The uip_flags variable is used for
+00161                                 communication between the TCP/IP stack
+00162                                 and the application program. */
+00163 struct uip_conn *uip_conn;   /* uip_conn always points to the current
+00164                                 connection. */
+00165 
+00166 struct uip_conn uip_conns[UIP_CONNS];
+00167                              /* The uip_conns array holds all TCP
+00168                                 connections. */
+00169 u16_t uip_listenports[UIP_LISTENPORTS];
+00170                              /* The uip_listenports list all currently
+00171                                 listning ports. */
+00172 #if UIP_UDP
+00173 struct uip_udp_conn *uip_udp_conn;
+00174 struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS];
+00175 #endif /* UIP_UDP */
+00176 
+00177 static u16_t ipid;           /* Ths ipid variable is an increasing
+00178                                 number that is used for the IP ID
+00179                                 field. */
+00180 
+00181 void uip_setipid(u16_t id) { ipid = id; }
+00182 
+00183 static u8_t iss[4];          /* The iss variable is used for the TCP
+00184                                 initial sequence number. */
+00185 
+00186 #if UIP_ACTIVE_OPEN
+00187 static u16_t lastport;       /* Keeps track of the last port used for
+00188                                 a new connection. */
+00189 #endif /* UIP_ACTIVE_OPEN */
+00190 
+00191 /* Temporary variables. */
+00192 u8_t uip_acc32[4];
+00193 static u8_t c, opt;
+00194 static u16_t tmp16;
+00195 
+00196 /* Structures and definitions. */
+00197 #define TCP_FIN 0x01
+00198 #define TCP_SYN 0x02
+00199 #define TCP_RST 0x04
+00200 #define TCP_PSH 0x08
+00201 #define TCP_ACK 0x10
+00202 #define TCP_URG 0x20
+00203 #define TCP_CTL 0x3f
+00204 
+00205 #define TCP_OPT_END     0   /* End of TCP options list */
+00206 #define TCP_OPT_NOOP    1   /* "No-operation" TCP option */
+00207 #define TCP_OPT_MSS     2   /* Maximum segment size TCP option */
+00208 
+00209 #define TCP_OPT_MSS_LEN 4   /* Length of TCP MSS option. */
+00210 
+00211 #define ICMP_ECHO_REPLY 0
+00212 #define ICMP_ECHO       8
+00213 
+00214 #define ICMP6_ECHO_REPLY             129
+00215 #define ICMP6_ECHO                   128
+00216 #define ICMP6_NEIGHBOR_SOLICITATION  135
+00217 #define ICMP6_NEIGHBOR_ADVERTISEMENT 136
+00218 
+00219 #define ICMP6_FLAG_S (1 << 6)
+00220 
+00221 #define ICMP6_OPTION_SOURCE_LINK_ADDRESS 1
+00222 #define ICMP6_OPTION_TARGET_LINK_ADDRESS 2
+00223 
+00224 
+00225 /* Macros. */
+00226 #define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN])
+00227 #define FBUF ((struct uip_tcpip_hdr *)&uip_reassbuf[0])
+00228 #define ICMPBUF ((struct uip_icmpip_hdr *)&uip_buf[UIP_LLH_LEN])
+00229 #define UDPBUF ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN])
+00230 
+00231 
+00232 #if UIP_STATISTICS == 1
+00233 struct uip_stats uip_stat;
+00234 #define UIP_STAT(s) s
+00235 #else
+00236 #define UIP_STAT(s)
+00237 #endif /* UIP_STATISTICS == 1 */
+00238 
+00239 #if UIP_LOGGING == 1
+00240 #include <stdio.h>
+00241 void uip_log(char *msg);
+00242 #define UIP_LOG(m) uip_log(m)
+00243 #else
+00244 #define UIP_LOG(m)
+00245 #endif /* UIP_LOGGING == 1 */
+00246 
+00247 #if ! UIP_ARCH_ADD32
+00248 void
+00249 uip_add32(u8_t *op32, u16_t op16)
+00250 {
+00251   uip_acc32[3] = op32[3] + (op16 & 0xff);
+00252   uip_acc32[2] = op32[2] + (op16 >> 8);
+00253   uip_acc32[1] = op32[1];
+00254   uip_acc32[0] = op32[0];
+00255   
+00256   if(uip_acc32[2] < (op16 >> 8)) {
+00257     ++uip_acc32[1];
+00258     if(uip_acc32[1] == 0) {
+00259       ++uip_acc32[0];
+00260     }
+00261   }
+00262   
+00263   
+00264   if(uip_acc32[3] < (op16 & 0xff)) {
+00265     ++uip_acc32[2];
+00266     if(uip_acc32[2] == 0) {
+00267       ++uip_acc32[1];
+00268       if(uip_acc32[1] == 0) {
+00269         ++uip_acc32[0];
+00270       }
+00271     }
+00272   }
+00273 }
+00274 
+00275 #endif /* UIP_ARCH_ADD32 */
+00276 
+00277 #if ! UIP_ARCH_CHKSUM
+00278 /*---------------------------------------------------------------------------*/
+00279 static u16_t
+00280 chksum(u16_t sum, const u8_t *data, u16_t len)
+00281 {
+00282   u16_t t;
+00283   const u8_t *dataptr;
+00284   const u8_t *last_byte;
+00285 
+00286   dataptr = data;
+00287   last_byte = data + len - 1;
+00288   
+00289   while(dataptr < last_byte) {  /* At least two more bytes */
+00290     t = (dataptr[0] << 8) + dataptr[1];
+00291     sum += t;
+00292     if(sum < t) {
+00293       sum++;            /* carry */
+00294     }
+00295     dataptr += 2;
+00296   }
+00297   
+00298   if(dataptr == last_byte) {
+00299     t = (dataptr[0] << 8) + 0;
+00300     sum += t;
+00301     if(sum < t) {
+00302       sum++;            /* carry */
+00303     }
+00304   }
+00305 
+00306   /* Return sum in host byte order. */
+00307   return sum;
+00308 }
+00309 /*---------------------------------------------------------------------------*/
+00310 u16_t
+00311 uip_chksum(u16_t *data, u16_t len)
+00312 {
+00313   return htons(chksum(0, (u8_t *)data, len));
+00314 }
+00315 /*---------------------------------------------------------------------------*/
+00316 #ifndef UIP_ARCH_IPCHKSUM
+00317 u16_t
+00318 uip_ipchksum(void)
+00319 {
+00320   u16_t sum;
+00321 
+00322   sum = chksum(0, &uip_buf[UIP_LLH_LEN], UIP_IPH_LEN);
+00323   DEBUG_PRINTF("uip_ipchksum: sum 0x%04x\n", sum);
+00324   return (sum == 0) ? 0xffff : htons(sum);
+00325 }
+00326 #endif
+00327 /*---------------------------------------------------------------------------*/
+00328 static u16_t
+00329 upper_layer_chksum(u8_t proto)
+00330 {
+00331   u16_t upper_layer_len;
+00332   u16_t sum;
+00333   
+00334 #if UIP_CONF_IPV6
+00335   upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]);
+00336 #else /* UIP_CONF_IPV6 */
+00337   upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - UIP_IPH_LEN;
+00338 #endif /* UIP_CONF_IPV6 */
+00339   
+00340   /* First sum pseudoheader. */
+00341   
+00342   /* IP protocol and length fields. This addition cannot carry. */
+00343   sum = upper_layer_len + proto;
+00344   /* Sum IP source and destination addresses. */
+00345   sum = chksum(sum, (u8_t *)&BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t));
+00346 
+00347   /* Sum TCP header and data. */
+00348   sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN],
+00349                upper_layer_len);
+00350     
+00351   return (sum == 0) ? 0xffff : htons(sum);
+00352 }
+00353 /*---------------------------------------------------------------------------*/
+00354 #if UIP_CONF_IPV6
+00355 u16_t
+00356 uip_icmp6chksum(void)
+00357 {
+00358   return upper_layer_chksum(UIP_PROTO_ICMP6);
+00359   
+00360 }
+00361 #endif /* UIP_CONF_IPV6 */
+00362 /*---------------------------------------------------------------------------*/
+00363 u16_t
+00364 uip_tcpchksum(void)
+00365 {
+00366   return upper_layer_chksum(UIP_PROTO_TCP);
+00367 }
+00368 /*---------------------------------------------------------------------------*/
+00369 #if UIP_UDP_CHECKSUMS
+00370 u16_t
+00371 uip_udpchksum(void)
+00372 {
+00373   return upper_layer_chksum(UIP_PROTO_UDP);
+00374 }
+00375 #endif /* UIP_UDP_CHECKSUMS */
+00376 #endif /* UIP_ARCH_CHKSUM */
+00377 /*---------------------------------------------------------------------------*/
+00378 void
+00379 uip_init(void)
+00380 {
+00381   for(c = 0; c < UIP_LISTENPORTS; ++c) {
+00382     uip_listenports[c] = 0;
+00383   }
+00384   for(c = 0; c < UIP_CONNS; ++c) {
+00385     uip_conns[c].tcpstateflags = UIP_CLOSED;
+00386   }
+00387 #if UIP_ACTIVE_OPEN
+00388   lastport = 1024;
+00389 #endif /* UIP_ACTIVE_OPEN */
+00390 
+00391 #if UIP_UDP
+00392   for(c = 0; c < UIP_UDP_CONNS; ++c) {
+00393     uip_udp_conns[c].lport = 0;
+00394   }
+00395 #endif /* UIP_UDP */
+00396   
+00397 
+00398   /* IPv4 initialization. */
+00399 #if UIP_FIXEDADDR == 0
+00400   /*  uip_hostaddr[0] = uip_hostaddr[1] = 0;*/
+00401 #endif /* UIP_FIXEDADDR */
+00402 
+00403 }
+00404 /*---------------------------------------------------------------------------*/
+00405 #if UIP_ACTIVE_OPEN
+00406 struct uip_conn *
+00407 uip_connect(uip_ipaddr_t *ripaddr, u16_t rport)
+00408 {
+00409   register struct uip_conn *conn, *cconn;
+00410   
+00411   /* Find an unused local port. */
+00412  again:
+00413   ++lastport;
+00414 
+00415   if(lastport >= 32000) {
+00416     lastport = 4096;
+00417   }
+00418 
+00419   /* Check if this port is already in use, and if so try to find
+00420      another one. */
+00421   for(c = 0; c < UIP_CONNS; ++c) {
+00422     conn = &uip_conns[c];
+00423     if(conn->tcpstateflags != UIP_CLOSED &&
+00424        conn->lport == htons(lastport)) {
+00425       goto again;
+00426     }
+00427   }
+00428 
+00429   conn = 0;
+00430   for(c = 0; c < UIP_CONNS; ++c) {
+00431     cconn = &uip_conns[c];
+00432     if(cconn->tcpstateflags == UIP_CLOSED) {
+00433       conn = cconn;
+00434       break;
+00435     }
+00436     if(cconn->tcpstateflags == UIP_TIME_WAIT) {
+00437       if(conn == 0 ||
+00438          cconn->timer > conn->timer) {
+00439         conn = cconn;
+00440       }
+00441     }
+00442   }
+00443 
+00444   if(conn == 0) {
+00445     return 0;
+00446   }
+00447   
+00448   conn->tcpstateflags = UIP_SYN_SENT;
+00449 
+00450   conn->snd_nxt[0] = iss[0];
+00451   conn->snd_nxt[1] = iss[1];
+00452   conn->snd_nxt[2] = iss[2];
+00453   conn->snd_nxt[3] = iss[3];
+00454 
+00455   conn->initialmss = conn->mss = UIP_TCP_MSS;
+00456   
+00457   conn->len = 1;   /* TCP length of the SYN is one. */
+00458   conn->nrtx = 0;
+00459   conn->timer = 1; /* Send the SYN next time around. */
+00460   conn->rto = UIP_RTO;
+00461   conn->sa = 0;
+00462   conn->sv = 16;   /* Initial value of the RTT variance. */
+00463   conn->lport = htons(lastport);
+00464   conn->rport = rport;
+00465   uip_ipaddr_copy(&conn->ripaddr, ripaddr);
+00466   
+00467   return conn;
+00468 }
+00469 #endif /* UIP_ACTIVE_OPEN */
+00470 /*---------------------------------------------------------------------------*/
+00471 #if UIP_UDP
+00472 struct uip_udp_conn *
+00473 uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport)
+00474 {
+00475   register struct uip_udp_conn *conn;
+00476   
+00477   /* Find an unused local port. */
+00478  again:
+00479   ++lastport;
+00480 
+00481   if(lastport >= 32000) {
+00482     lastport = 4096;
+00483   }
+00484   
+00485   for(c = 0; c < UIP_UDP_CONNS; ++c) {
+00486     if(uip_udp_conns[c].lport == htons(lastport)) {
+00487       goto again;
+00488     }
+00489   }
+00490 
+00491 
+00492   conn = 0;
+00493   for(c = 0; c < UIP_UDP_CONNS; ++c) {
+00494     if(uip_udp_conns[c].lport == 0) {
+00495       conn = &uip_udp_conns[c];
+00496       break;
+00497     }
+00498   }
+00499 
+00500   if(conn == 0) {
+00501     return 0;
+00502   }
+00503   
+00504   conn->lport = HTONS(lastport);
+00505   conn->rport = rport;
+00506   if(ripaddr == NULL) {
+00507     memset(conn->ripaddr, 0, sizeof(uip_ipaddr_t));
+00508   } else {
+00509     uip_ipaddr_copy(&conn->ripaddr, ripaddr);
+00510   }
+00511   conn->ttl = UIP_TTL;
+00512   
+00513   return conn;
+00514 }
+00515 #endif /* UIP_UDP */
+00516 /*---------------------------------------------------------------------------*/
+00517 void
+00518 uip_unlisten(u16_t port)
+00519 {
+00520   for(c = 0; c < UIP_LISTENPORTS; ++c) {
+00521     if(uip_listenports[c] == port) {
+00522       uip_listenports[c] = 0;
+00523       return;
+00524     }
+00525   }
+00526 }
+00527 /*---------------------------------------------------------------------------*/
+00528 void
+00529 uip_listen(u16_t port)
+00530 {
+00531   for(c = 0; c < UIP_LISTENPORTS; ++c) {
+00532     if(uip_listenports[c] == 0) {
+00533       uip_listenports[c] = port;
+00534       return;
+00535     }
+00536   }
+00537 }
+00538 /*---------------------------------------------------------------------------*/
+00539 /* XXX: IP fragment reassembly: not well-tested. */
+00540 
+00541 #if UIP_REASSEMBLY && !UIP_CONF_IPV6
+00542 #define UIP_REASS_BUFSIZE (UIP_BUFSIZE - UIP_LLH_LEN)
+00543 static u8_t uip_reassbuf[UIP_REASS_BUFSIZE];
+00544 static u8_t uip_reassbitmap[UIP_REASS_BUFSIZE / (8 * 8)];
+00545 static const u8_t bitmap_bits[8] = {0xff, 0x7f, 0x3f, 0x1f,
+00546                                     0x0f, 0x07, 0x03, 0x01};
+00547 static u16_t uip_reasslen;
+00548 static u8_t uip_reassflags;
+00549 #define UIP_REASS_FLAG_LASTFRAG 0x01
+00550 static u8_t uip_reasstmr;
+00551 
+00552 #define IP_MF   0x20
+00553 
+00554 static u8_t
+00555 uip_reass(void)
+00556 {
+00557   u16_t offset, len;
+00558   u16_t i;
+00559 
+00560   /* If ip_reasstmr is zero, no packet is present in the buffer, so we
+00561      write the IP header of the fragment into the reassembly
+00562      buffer. The timer is updated with the maximum age. */
+00563   if(uip_reasstmr == 0) {
+00564     memcpy(uip_reassbuf, &BUF->vhl, UIP_IPH_LEN);
+00565     uip_reasstmr = UIP_REASS_MAXAGE;
+00566     uip_reassflags = 0;
+00567     /* Clear the bitmap. */
+00568     memset(uip_reassbitmap, 0, sizeof(uip_reassbitmap));
+00569   }
+00570 
+00571   /* Check if the incoming fragment matches the one currently present
+00572      in the reasembly buffer. If so, we proceed with copying the
+00573      fragment into the buffer. */
+00574   if(BUF->srcipaddr[0] == FBUF->srcipaddr[0] &&
+00575      BUF->srcipaddr[1] == FBUF->srcipaddr[1] &&
+00576      BUF->destipaddr[0] == FBUF->destipaddr[0] &&
+00577      BUF->destipaddr[1] == FBUF->destipaddr[1] &&
+00578      BUF->ipid[0] == FBUF->ipid[0] &&
+00579      BUF->ipid[1] == FBUF->ipid[1]) {
+00580 
+00581     len = (BUF->len[0] << 8) + BUF->len[1] - (BUF->vhl & 0x0f) * 4;
+00582     offset = (((BUF->ipoffset[0] & 0x3f) << 8) + BUF->ipoffset[1]) * 8;
+00583 
+00584     /* If the offset or the offset + fragment length overflows the
+00585        reassembly buffer, we discard the entire packet. */
+00586     if(offset > UIP_REASS_BUFSIZE ||
+00587        offset + len > UIP_REASS_BUFSIZE) {
+00588       uip_reasstmr = 0;
+00589       goto nullreturn;
+00590     }
+00591 
+00592     /* Copy the fragment into the reassembly buffer, at the right
+00593        offset. */
+00594     memcpy(&uip_reassbuf[UIP_IPH_LEN + offset],
+00595            (char *)BUF + (int)((BUF->vhl & 0x0f) * 4),
+00596            len);
+00597       
+00598     /* Update the bitmap. */
+00599     if(offset / (8 * 8) == (offset + len) / (8 * 8)) {
+00600       /* If the two endpoints are in the same byte, we only update
+00601          that byte. */
+00602              
+00603       uip_reassbitmap[offset / (8 * 8)] |=
+00604              bitmap_bits[(offset / 8 ) & 7] &
+00605              ~bitmap_bits[((offset + len) / 8 ) & 7];
+00606     } else {
+00607       /* If the two endpoints are in different bytes, we update the
+00608          bytes in the endpoints and fill the stuff inbetween with
+00609          0xff. */
+00610       uip_reassbitmap[offset / (8 * 8)] |=
+00611         bitmap_bits[(offset / 8 ) & 7];
+00612       for(i = 1 + offset / (8 * 8); i < (offset + len) / (8 * 8); ++i) {
+00613         uip_reassbitmap[i] = 0xff;
+00614       }
+00615       uip_reassbitmap[(offset + len) / (8 * 8)] |=
+00616         ~bitmap_bits[((offset + len) / 8 ) & 7];
+00617     }
+00618     
+00619     /* If this fragment has the More Fragments flag set to zero, we
+00620        know that this is the last fragment, so we can calculate the
+00621        size of the entire packet. We also set the
+00622        IP_REASS_FLAG_LASTFRAG flag to indicate that we have received
+00623        the final fragment. */
+00624 
+00625     if((BUF->ipoffset[0] & IP_MF) == 0) {
+00626       uip_reassflags |= UIP_REASS_FLAG_LASTFRAG;
+00627       uip_reasslen = offset + len;
+00628     }
+00629     
+00630     /* Finally, we check if we have a full packet in the buffer. We do
+00631        this by checking if we have the last fragment and if all bits
+00632        in the bitmap are set. */
+00633     if(uip_reassflags & UIP_REASS_FLAG_LASTFRAG) {
+00634       /* Check all bytes up to and including all but the last byte in
+00635          the bitmap. */
+00636       for(i = 0; i < uip_reasslen / (8 * 8) - 1; ++i) {
+00637         if(uip_reassbitmap[i] != 0xff) {
+00638           goto nullreturn;
+00639         }
+00640       }
+00641       /* Check the last byte in the bitmap. It should contain just the
+00642          right amount of bits. */
+00643       if(uip_reassbitmap[uip_reasslen / (8 * 8)] !=
+00644          (u8_t)~bitmap_bits[uip_reasslen / 8 & 7]) {
+00645         goto nullreturn;
+00646       }
+00647 
+00648       /* If we have come this far, we have a full packet in the
+00649          buffer, so we allocate a pbuf and copy the packet into it. We
+00650          also reset the timer. */
+00651       uip_reasstmr = 0;
+00652       memcpy(BUF, FBUF, uip_reasslen);
+00653 
+00654       /* Pretend to be a "normal" (i.e., not fragmented) IP packet
+00655          from now on. */
+00656       BUF->ipoffset[0] = BUF->ipoffset[1] = 0;
+00657       BUF->len[0] = uip_reasslen >> 8;
+00658       BUF->len[1] = uip_reasslen & 0xff;
+00659       BUF->ipchksum = 0;
+00660       BUF->ipchksum = ~(uip_ipchksum());
+00661 
+00662       return uip_reasslen;
+00663     }
+00664   }
+00665 
+00666  nullreturn:
+00667   return 0;
+00668 }
+00669 #endif /* UIP_REASSEMBLY */
+00670 /*---------------------------------------------------------------------------*/
+00671 static void
+00672 uip_add_rcv_nxt(u16_t n)
+00673 {
+00674   uip_add32(uip_conn->rcv_nxt, n);
+00675   uip_conn->rcv_nxt[0] = uip_acc32[0];
+00676   uip_conn->rcv_nxt[1] = uip_acc32[1];
+00677   uip_conn->rcv_nxt[2] = uip_acc32[2];
+00678   uip_conn->rcv_nxt[3] = uip_acc32[3];
+00679 }
+00680 /*---------------------------------------------------------------------------*/
+00681 void
+00682 uip_process(u8_t flag)
+00683 {
+00684   register struct uip_conn *uip_connr = uip_conn;
+00685 
+00686 #if UIP_UDP
+00687   if(flag == UIP_UDP_SEND_CONN) {
+00688     goto udp_send;
+00689   }
+00690 #endif /* UIP_UDP */
+00691   
+00692   uip_sappdata = uip_appdata = &uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN];
+00693 
+00694   /* Check if we were invoked because of a poll request for a
+00695      particular connection. */
+00696   if(flag == UIP_POLL_REQUEST) {
+00697     if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED &&
+00698        !uip_outstanding(uip_connr)) {
+00699         uip_flags = UIP_POLL;
+00700         UIP_APPCALL();
+00701         goto appsend;
+00702     }
+00703     goto drop;
+00704     
+00705     /* Check if we were invoked because of the perodic timer fireing. */
+00706   } else if(flag == UIP_TIMER) {
+00707 #if UIP_REASSEMBLY
+00708     if(uip_reasstmr != 0) {
+00709       --uip_reasstmr;
+00710     }
+00711 #endif /* UIP_REASSEMBLY */
+00712     /* Increase the initial sequence number. */
+00713     if(++iss[3] == 0) {
+00714       if(++iss[2] == 0) {
+00715         if(++iss[1] == 0) {
+00716           ++iss[0];
+00717         }
+00718       }
+00719     }
+00720 
+00721     /* Reset the length variables. */
+00722     uip_len = 0;
+00723     uip_slen = 0;
+00724 
+00725     /* Check if the connection is in a state in which we simply wait
+00726        for the connection to time out. If so, we increase the
+00727        connection's timer and remove the connection if it times
+00728        out. */
+00729     if(uip_connr->tcpstateflags == UIP_TIME_WAIT ||
+00730        uip_connr->tcpstateflags == UIP_FIN_WAIT_2) {
+00731       ++(uip_connr->timer);
+00732       if(uip_connr->timer == UIP_TIME_WAIT_TIMEOUT) {
+00733         uip_connr->tcpstateflags = UIP_CLOSED;
+00734       }
+00735     } else if(uip_connr->tcpstateflags != UIP_CLOSED) {
+00736       /* If the connection has outstanding data, we increase the
+00737          connection's timer and see if it has reached the RTO value
+00738          in which case we retransmit. */
+00739       if(uip_outstanding(uip_connr)) {
+00740         if(uip_connr->timer-- == 0) {
+00741           if(uip_connr->nrtx == UIP_MAXRTX ||
+00742              ((uip_connr->tcpstateflags == UIP_SYN_SENT ||
+00743                uip_connr->tcpstateflags == UIP_SYN_RCVD) &&
+00744               uip_connr->nrtx == UIP_MAXSYNRTX)) {
+00745             uip_connr->tcpstateflags = UIP_CLOSED;
+00746 
+00747             /* We call UIP_APPCALL() with uip_flags set to
+00748                UIP_TIMEDOUT to inform the application that the
+00749                connection has timed out. */
+00750             uip_flags = UIP_TIMEDOUT;
+00751             UIP_APPCALL();
+00752 
+00753             /* We also send a reset packet to the remote host. */
+00754             BUF->flags = TCP_RST | TCP_ACK;
+00755             goto tcp_send_nodata;
+00756           }
+00757 
+00758           /* Exponential backoff. */
+00759           uip_connr->timer = UIP_RTO << (uip_connr->nrtx > 4?
+00760                                          4:
+00761                                          uip_connr->nrtx);
+00762           ++(uip_connr->nrtx);
+00763           
+00764           /* Ok, so we need to retransmit. We do this differently
+00765              depending on which state we are in. In ESTABLISHED, we
+00766              call upon the application so that it may prepare the
+00767              data for the retransmit. In SYN_RCVD, we resend the
+00768              SYNACK that we sent earlier and in LAST_ACK we have to
+00769              retransmit our FINACK. */
+00770           UIP_STAT(++uip_stat.tcp.rexmit);
+00771           switch(uip_connr->tcpstateflags & UIP_TS_MASK) {
+00772           case UIP_SYN_RCVD:
+00773             /* In the SYN_RCVD state, we should retransmit our
+00774                SYNACK. */
+00775             goto tcp_send_synack;
+00776             
+00777 #if UIP_ACTIVE_OPEN
+00778           case UIP_SYN_SENT:
+00779             /* In the SYN_SENT state, we retransmit out SYN. */
+00780             BUF->flags = 0;
+00781             goto tcp_send_syn;
+00782 #endif /* UIP_ACTIVE_OPEN */
+00783             
+00784           case UIP_ESTABLISHED:
+00785             /* In the ESTABLISHED state, we call upon the application
+00786                to do the actual retransmit after which we jump into
+00787                the code for sending out the packet (the apprexmit
+00788                label). */
+00789             uip_flags = UIP_REXMIT;
+00790             UIP_APPCALL();
+00791             goto apprexmit;
+00792             
+00793           case UIP_FIN_WAIT_1:
+00794           case UIP_CLOSING:
+00795           case UIP_LAST_ACK:
+00796             /* In all these states we should retransmit a FINACK. */
+00797             goto tcp_send_finack;
+00798             
+00799           }
+00800         }
+00801       } else if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED) {
+00802         /* If there was no need for a retransmission, we poll the
+00803            application for new data. */
+00804         uip_flags = UIP_POLL;
+00805         UIP_APPCALL();
+00806         goto appsend;
+00807       }
+00808     }
+00809     goto drop;
+00810   }
+00811 #if UIP_UDP
+00812   if(flag == UIP_UDP_TIMER) {
+00813     if(uip_udp_conn->lport != 0) {
+00814       uip_conn = NULL;
+00815       uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN];
+00816       uip_len = uip_slen = 0;
+00817       uip_flags = UIP_POLL;
+00818       UIP_UDP_APPCALL();
+00819       goto udp_send;
+00820     } else {
+00821       goto drop;
+00822     }
+00823   }
+00824 #endif
+00825 
+00826   /* This is where the input processing starts. */
+00827   UIP_STAT(++uip_stat.ip.recv);
+00828 
+00829   /* Start of IP input header processing code. */
+00830   
+00831 #if UIP_CONF_IPV6
+00832   /* Check validity of the IP header. */
+00833   if((BUF->vtc & 0xf0) != 0x60)  { /* IP version and header length. */
+00834     UIP_STAT(++uip_stat.ip.drop);
+00835     UIP_STAT(++uip_stat.ip.vhlerr);
+00836     UIP_LOG("ipv6: invalid version.");
+00837     goto drop;
+00838   }
+00839 #else /* UIP_CONF_IPV6 */
+00840   /* Check validity of the IP header. */
+00841   if(BUF->vhl != 0x45)  { /* IP version and header length. */
+00842     UIP_STAT(++uip_stat.ip.drop);
+00843     UIP_STAT(++uip_stat.ip.vhlerr);
+00844     UIP_LOG("ip: invalid version or header length.");
+00845     goto drop;
+00846   }
+00847 #endif /* UIP_CONF_IPV6 */
+00848   
+00849   /* Check the size of the packet. If the size reported to us in
+00850      uip_len is smaller the size reported in the IP header, we assume
+00851      that the packet has been corrupted in transit. If the size of
+00852      uip_len is larger than the size reported in the IP packet header,
+00853      the packet has been padded and we set uip_len to the correct
+00854      value.. */
+00855 
+00856   if((BUF->len[0] << 8) + BUF->len[1] <= uip_len) {
+00857     uip_len = (BUF->len[0] << 8) + BUF->len[1];
+00858 #if UIP_CONF_IPV6
+00859     uip_len += 40; /* The length reported in the IPv6 header is the
+00860                       length of the payload that follows the
+00861                       header. However, uIP uses the uip_len variable
+00862                       for holding the size of the entire packet,
+00863                       including the IP header. For IPv4 this is not a
+00864                       problem as the length field in the IPv4 header
+00865                       contains the length of the entire packet. But
+00866                       for IPv6 we need to add the size of the IPv6
+00867                       header (40 bytes). */
+00868 #endif /* UIP_CONF_IPV6 */
+00869   } else {
+00870     UIP_LOG("ip: packet shorter than reported in IP header.");
+00871     goto drop;
+00872   }
+00873 
+00874 #if !UIP_CONF_IPV6
+00875   /* Check the fragment flag. */
+00876   if((BUF->ipoffset[0] & 0x3f) != 0 ||
+00877      BUF->ipoffset[1] != 0) {
+00878 #if UIP_REASSEMBLY
+00879     uip_len = uip_reass();
+00880     if(uip_len == 0) {
+00881       goto drop;
+00882     }
+00883 #else /* UIP_REASSEMBLY */
+00884     UIP_STAT(++uip_stat.ip.drop);
+00885     UIP_STAT(++uip_stat.ip.fragerr);
+00886     UIP_LOG("ip: fragment dropped.");
+00887     goto drop;
+00888 #endif /* UIP_REASSEMBLY */
+00889   }
+00890 #endif /* UIP_CONF_IPV6 */
+00891 
+00892   if(uip_ipaddr_cmp(uip_hostaddr, all_zeroes_addr)) {
+00893     /* If we are configured to use ping IP address configuration and
+00894        hasn't been assigned an IP address yet, we accept all ICMP
+00895        packets. */
+00896 #if UIP_PINGADDRCONF && !UIP_CONF_IPV6
+00897     if(BUF->proto == UIP_PROTO_ICMP) {
+00898       UIP_LOG("ip: possible ping config packet received.");
+00899       goto icmp_input;
+00900     } else {
+00901       UIP_LOG("ip: packet dropped since no address assigned.");
+00902       goto drop;
+00903     }
+00904 #endif /* UIP_PINGADDRCONF */
+00905 
+00906   } else {
+00907     /* If IP broadcast support is configured, we check for a broadcast
+00908        UDP packet, which may be destined to us. */
+00909 #if UIP_BROADCAST
+00910     DEBUG_PRINTF("UDP IP checksum 0x%04x\n", uip_ipchksum());
+00911     if(BUF->proto == UIP_PROTO_UDP &&
+00912        uip_ipaddr_cmp(BUF->destipaddr, all_ones_addr)
+00913        /*&&
+00914          uip_ipchksum() == 0xffff*/) {
+00915       goto udp_input;
+00916     }
+00917 #endif /* UIP_BROADCAST */
+00918     
+00919     /* Check if the packet is destined for our IP address. */
+00920 #if !UIP_CONF_IPV6
+00921     if(!uip_ipaddr_cmp(BUF->destipaddr, uip_hostaddr)) {
+00922       UIP_STAT(++uip_stat.ip.drop);
+00923       goto drop;
+00924     }
+00925 #else /* UIP_CONF_IPV6 */
+00926     /* For IPv6, packet reception is a little trickier as we need to
+00927        make sure that we listen to certain multicast addresses (all
+00928        hosts multicast address, and the solicited-node multicast
+00929        address) as well. However, we will cheat here and accept all
+00930        multicast packets that are sent to the ff02::/16 addresses. */
+00931     if(!uip_ipaddr_cmp(BUF->destipaddr, uip_hostaddr) &&
+00932        BUF->destipaddr[0] != HTONS(0xff02)) {
+00933       UIP_STAT(++uip_stat.ip.drop);
+00934       goto drop;
+00935     }
+00936 #endif /* UIP_CONF_IPV6 */
+00937   }
+00938 
+00939 #if !UIP_CONF_IPV6
+00940   if(uip_ipchksum() != 0xffff) { /* Compute and check the IP header
+00941                                     checksum. */
+00942     UIP_STAT(++uip_stat.ip.drop);
+00943     UIP_STAT(++uip_stat.ip.chkerr);
+00944     UIP_LOG("ip: bad checksum.");
+00945     goto drop;
+00946   }
+00947 #endif /* UIP_CONF_IPV6 */
+00948 
+00949   if(BUF->proto == UIP_PROTO_TCP) { /* Check for TCP packet. If so,
+00950                                        proceed with TCP input
+00951                                        processing. */
+00952     goto tcp_input;
+00953   }
+00954 
+00955 #if UIP_UDP
+00956   if(BUF->proto == UIP_PROTO_UDP) {
+00957     goto udp_input;
+00958   }
+00959 #endif /* UIP_UDP */
+00960 
+00961 #if !UIP_CONF_IPV6
+00962   /* ICMPv4 processing code follows. */
+00963   if(BUF->proto != UIP_PROTO_ICMP) { /* We only allow ICMP packets from
+00964                                         here. */
+00965     UIP_STAT(++uip_stat.ip.drop);
+00966     UIP_STAT(++uip_stat.ip.protoerr);
+00967     UIP_LOG("ip: neither tcp nor icmp.");
+00968     goto drop;
+00969   }
+00970 
+00971 #if UIP_PINGADDRCONF
+00972  icmp_input:
+00973 #endif /* UIP_PINGADDRCONF */
+00974   UIP_STAT(++uip_stat.icmp.recv);
+00975 
+00976   /* ICMP echo (i.e., ping) processing. This is simple, we only change
+00977      the ICMP type from ECHO to ECHO_REPLY and adjust the ICMP
+00978      checksum before we return the packet. */
+00979   if(ICMPBUF->type != ICMP_ECHO) {
+00980     UIP_STAT(++uip_stat.icmp.drop);
+00981     UIP_STAT(++uip_stat.icmp.typeerr);
+00982     UIP_LOG("icmp: not icmp echo.");
+00983     goto drop;
+00984   }
+00985 
+00986   /* If we are configured to use ping IP address assignment, we use
+00987      the destination IP address of this ping packet and assign it to
+00988      ourself. */
+00989 #if UIP_PINGADDRCONF
+00990   if((uip_hostaddr[0] | uip_hostaddr[1]) == 0) {
+00991     uip_hostaddr[0] = BUF->destipaddr[0];
+00992     uip_hostaddr[1] = BUF->destipaddr[1];
+00993   }
+00994 #endif /* UIP_PINGADDRCONF */
+00995 
+00996   ICMPBUF->type = ICMP_ECHO_REPLY;
+00997 
+00998   if(ICMPBUF->icmpchksum >= HTONS(0xffff - (ICMP_ECHO << 8))) {
+00999     ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8) + 1;
+01000   } else {
+01001     ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8);
+01002   }
+01003 
+01004   /* Swap IP addresses. */
+01005   uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr);
+01006   uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
+01007 
+01008   UIP_STAT(++uip_stat.icmp.sent);
+01009   goto send;
+01010 
+01011   /* End of IPv4 input header processing code. */
+01012 #else /* !UIP_CONF_IPV6 */
+01013 
+01014   /* This is IPv6 ICMPv6 processing code. */
+01015   DEBUG_PRINTF("icmp6_input: length %d\n", uip_len);
+01016 
+01017   if(BUF->proto != UIP_PROTO_ICMP6) { /* We only allow ICMPv6 packets from
+01018                                          here. */
+01019     UIP_STAT(++uip_stat.ip.drop);
+01020     UIP_STAT(++uip_stat.ip.protoerr);
+01021     UIP_LOG("ip: neither tcp nor icmp6.");
+01022     goto drop;
+01023   }
+01024 
+01025   UIP_STAT(++uip_stat.icmp.recv);
+01026 
+01027   /* If we get a neighbor solicitation for our address we should send
+01028      a neighbor advertisement message back. */
+01029   if(ICMPBUF->type == ICMP6_NEIGHBOR_SOLICITATION) {
+01030     if(uip_ipaddr_cmp(ICMPBUF->icmp6data, uip_hostaddr)) {
+01031 
+01032       if(ICMPBUF->options[0] == ICMP6_OPTION_SOURCE_LINK_ADDRESS) {
+01033         /* Save the sender's address in our neighbor list. */
+01034         uip_neighbor_add(ICMPBUF->srcipaddr, &(ICMPBUF->options[2]));
+01035       }
+01036       
+01037       /* We should now send a neighbor advertisement back to where the
+01038          neighbor solicication came from. */
+01039       ICMPBUF->type = ICMP6_NEIGHBOR_ADVERTISEMENT;
+01040       ICMPBUF->flags = ICMP6_FLAG_S; /* Solicited flag. */
+01041       
+01042       ICMPBUF->reserved1 = ICMPBUF->reserved2 = ICMPBUF->reserved3 = 0;
+01043       
+01044       uip_ipaddr_copy(ICMPBUF->destipaddr, ICMPBUF->srcipaddr);
+01045       uip_ipaddr_copy(ICMPBUF->srcipaddr, uip_hostaddr);
+01046       ICMPBUF->options[0] = ICMP6_OPTION_TARGET_LINK_ADDRESS;
+01047       ICMPBUF->options[1] = 1;  /* Options length, 1 = 8 bytes. */
+01048       memcpy(&(ICMPBUF->options[2]), &uip_ethaddr, sizeof(uip_ethaddr));
+01049       ICMPBUF->icmpchksum = 0;
+01050       ICMPBUF->icmpchksum = ~uip_icmp6chksum();
+01051       goto send;
+01052       
+01053     }
+01054     goto drop;
+01055   } else if(ICMPBUF->type == ICMP6_ECHO) {
+01056     /* ICMP echo (i.e., ping) processing. This is simple, we only
+01057        change the ICMP type from ECHO to ECHO_REPLY and update the
+01058        ICMP checksum before we return the packet. */
+01059 
+01060     ICMPBUF->type = ICMP6_ECHO_REPLY;
+01061     
+01062     uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr);
+01063     uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
+01064     ICMPBUF->icmpchksum = 0;
+01065     ICMPBUF->icmpchksum = ~uip_icmp6chksum();
+01066     
+01067     UIP_STAT(++uip_stat.icmp.sent);
+01068     goto send;
+01069   } else {
+01070     DEBUG_PRINTF("Unknown icmp6 message type %d\n", ICMPBUF->type);
+01071     UIP_STAT(++uip_stat.icmp.drop);
+01072     UIP_STAT(++uip_stat.icmp.typeerr);
+01073     UIP_LOG("icmp: unknown ICMP message.");
+01074     goto drop;
+01075   }
+01076 
+01077   /* End of IPv6 ICMP processing. */
+01078   
+01079 #endif /* !UIP_CONF_IPV6 */
+01080 
+01081 #if UIP_UDP
+01082   /* UDP input processing. */
+01083  udp_input:
+01084   /* UDP processing is really just a hack. We don't do anything to the
+01085      UDP/IP headers, but let the UDP application do all the hard
+01086      work. If the application sets uip_slen, it has a packet to
+01087      send. */
+01088 #if UIP_UDP_CHECKSUMS
+01089   uip_len = uip_len - UIP_IPUDPH_LEN;
+01090   uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN];
+01091   if(UDPBUF->udpchksum != 0 && uip_udpchksum() != 0xffff) {
+01092     UIP_STAT(++uip_stat.udp.drop);
+01093     UIP_STAT(++uip_stat.udp.chkerr);
+01094     UIP_LOG("udp: bad checksum.");
+01095     goto drop;
+01096   }
+01097 #else /* UIP_UDP_CHECKSUMS */
+01098   uip_len = uip_len - UIP_IPUDPH_LEN;
+01099 #endif /* UIP_UDP_CHECKSUMS */
+01100 
+01101   /* Demultiplex this UDP packet between the UDP "connections". */
+01102   for(uip_udp_conn = &uip_udp_conns[0];
+01103       uip_udp_conn < &uip_udp_conns[UIP_UDP_CONNS];
+01104       ++uip_udp_conn) {
+01105     /* If the local UDP port is non-zero, the connection is considered
+01106        to be used. If so, the local port number is checked against the
+01107        destination port number in the received packet. If the two port
+01108        numbers match, the remote port number is checked if the
+01109        connection is bound to a remote port. Finally, if the
+01110        connection is bound to a remote IP address, the source IP
+01111        address of the packet is checked. */
+01112     if(uip_udp_conn->lport != 0 &&
+01113        UDPBUF->destport == uip_udp_conn->lport &&
+01114        (uip_udp_conn->rport == 0 ||
+01115         UDPBUF->srcport == uip_udp_conn->rport) &&
+01116        (uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_zeroes_addr) ||
+01117         uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_ones_addr) ||
+01118         uip_ipaddr_cmp(BUF->srcipaddr, uip_udp_conn->ripaddr))) {
+01119       goto udp_found;
+01120     }
+01121   }
+01122   UIP_LOG("udp: no matching connection found");
+01123   goto drop;
+01124   
+01125  udp_found:
+01126   uip_conn = NULL;
+01127   uip_flags = UIP_NEWDATA;
+01128   uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN];
+01129   uip_slen = 0;
+01130   UIP_UDP_APPCALL();
+01131  udp_send:
+01132   if(uip_slen == 0) {
+01133     goto drop;
+01134   }
+01135   uip_len = uip_slen + UIP_IPUDPH_LEN;
+01136 
+01137 #if UIP_CONF_IPV6
+01138   /* For IPv6, the IP length field does not include the IPv6 IP header
+01139      length. */
+01140   BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
+01141   BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff);
+01142 #else /* UIP_CONF_IPV6 */
+01143   BUF->len[0] = (uip_len >> 8);
+01144   BUF->len[1] = (uip_len & 0xff);
+01145 #endif /* UIP_CONF_IPV6 */
+01146 
+01147   BUF->ttl = uip_udp_conn->ttl;
+01148   BUF->proto = UIP_PROTO_UDP;
+01149 
+01150   UDPBUF->udplen = HTONS(uip_slen + UIP_UDPH_LEN);
+01151   UDPBUF->udpchksum = 0;
+01152 
+01153   BUF->srcport  = uip_udp_conn->lport;
+01154   BUF->destport = uip_udp_conn->rport;
+01155 
+01156   uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
+01157   uip_ipaddr_copy(BUF->destipaddr, uip_udp_conn->ripaddr);
+01158    
+01159   uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPTCPH_LEN];
+01160 
+01161 #if UIP_UDP_CHECKSUMS
+01162   /* Calculate UDP checksum. */
+01163   UDPBUF->udpchksum = ~(uip_udpchksum());
+01164   if(UDPBUF->udpchksum == 0) {
+01165     UDPBUF->udpchksum = 0xffff;
+01166   }
+01167 #endif /* UIP_UDP_CHECKSUMS */
+01168   
+01169   goto ip_send_nolen;
+01170 #endif /* UIP_UDP */
+01171   
+01172   /* TCP input processing. */
+01173  tcp_input:
+01174   UIP_STAT(++uip_stat.tcp.recv);
+01175 
+01176   /* Start of TCP input header processing code. */
+01177   
+01178   if(uip_tcpchksum() != 0xffff) {   /* Compute and check the TCP
+01179                                        checksum. */
+01180     UIP_STAT(++uip_stat.tcp.drop);
+01181     UIP_STAT(++uip_stat.tcp.chkerr);
+01182     UIP_LOG("tcp: bad checksum.");
+01183     goto drop;
+01184   }
+01185   
+01186   
+01187   /* Demultiplex this segment. */
+01188   /* First check any active connections. */
+01189   for(uip_connr = &uip_conns[0]; uip_connr <= &uip_conns[UIP_CONNS - 1];
+01190       ++uip_connr) {
+01191     if(uip_connr->tcpstateflags != UIP_CLOSED &&
+01192        BUF->destport == uip_connr->lport &&
+01193        BUF->srcport == uip_connr->rport &&
+01194        uip_ipaddr_cmp(BUF->srcipaddr, uip_connr->ripaddr)) {
+01195       goto found;
+01196     }
+01197   }
+01198 
+01199   /* If we didn't find and active connection that expected the packet,
+01200      either this packet is an old duplicate, or this is a SYN packet
+01201      destined for a connection in LISTEN. If the SYN flag isn't set,
+01202      it is an old packet and we send a RST. */
+01203   if((BUF->flags & TCP_CTL) != TCP_SYN) {
+01204     goto reset;
+01205   }
+01206   
+01207   tmp16 = BUF->destport;
+01208   /* Next, check listening connections. */
+01209   for(c = 0; c < UIP_LISTENPORTS; ++c) {
+01210     if(tmp16 == uip_listenports[c])
+01211       goto found_listen;
+01212   }
+01213   
+01214   /* No matching connection found, so we send a RST packet. */
+01215   UIP_STAT(++uip_stat.tcp.synrst);
+01216  reset:
+01217 
+01218   /* We do not send resets in response to resets. */
+01219   if(BUF->flags & TCP_RST) {
+01220     goto drop;
+01221   }
+01222 
+01223   UIP_STAT(++uip_stat.tcp.rst);
+01224   
+01225   BUF->flags = TCP_RST | TCP_ACK;
+01226   uip_len = UIP_IPTCPH_LEN;
+01227   BUF->tcpoffset = 5 << 4;
+01228 
+01229   /* Flip the seqno and ackno fields in the TCP header. */
+01230   c = BUF->seqno[3];
+01231   BUF->seqno[3] = BUF->ackno[3];
+01232   BUF->ackno[3] = c;
+01233   
+01234   c = BUF->seqno[2];
+01235   BUF->seqno[2] = BUF->ackno[2];
+01236   BUF->ackno[2] = c;
+01237   
+01238   c = BUF->seqno[1];
+01239   BUF->seqno[1] = BUF->ackno[1];
+01240   BUF->ackno[1] = c;
+01241   
+01242   c = BUF->seqno[0];
+01243   BUF->seqno[0] = BUF->ackno[0];
+01244   BUF->ackno[0] = c;
+01245 
+01246   /* We also have to increase the sequence number we are
+01247      acknowledging. If the least significant byte overflowed, we need
+01248      to propagate the carry to the other bytes as well. */
+01249   if(++BUF->ackno[3] == 0) {
+01250     if(++BUF->ackno[2] == 0) {
+01251       if(++BUF->ackno[1] == 0) {
+01252         ++BUF->ackno[0];
+01253       }
+01254     }
+01255   }
+01256  
+01257   /* Swap port numbers. */
+01258   tmp16 = BUF->srcport;
+01259   BUF->srcport = BUF->destport;
+01260   BUF->destport = tmp16;
+01261   
+01262   /* Swap IP addresses. */
+01263   uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr);
+01264   uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
+01265   
+01266   /* And send out the RST packet! */
+01267   goto tcp_send_noconn;
+01268 
+01269   /* This label will be jumped to if we matched the incoming packet
+01270      with a connection in LISTEN. In that case, we should create a new
+01271      connection and send a SYNACK in return. */
+01272  found_listen:
+01273   /* First we check if there are any connections avaliable. Unused
+01274      connections are kept in the same table as used connections, but
+01275      unused ones have the tcpstate set to CLOSED. Also, connections in
+01276      TIME_WAIT are kept track of and we'll use the oldest one if no
+01277      CLOSED connections are found. Thanks to Eddie C. Dost for a very
+01278      nice algorithm for the TIME_WAIT search. */
+01279   uip_connr = 0;
+01280   for(c = 0; c < UIP_CONNS; ++c) {
+01281     if(uip_conns[c].tcpstateflags == UIP_CLOSED) {
+01282       uip_connr = &uip_conns[c];
+01283       break;
+01284     }
+01285     if(uip_conns[c].tcpstateflags == UIP_TIME_WAIT) {
+01286       if(uip_connr == 0 ||
+01287          uip_conns[c].timer > uip_connr->timer) {
+01288         uip_connr = &uip_conns[c];
+01289       }
+01290     }
+01291   }
+01292 
+01293   if(uip_connr == 0) {
+01294     /* All connections are used already, we drop packet and hope that
+01295        the remote end will retransmit the packet at a time when we
+01296        have more spare connections. */
+01297     UIP_STAT(++uip_stat.tcp.syndrop);
+01298     UIP_LOG("tcp: found no unused connections.");
+01299     goto drop;
+01300   }
+01301   uip_conn = uip_connr;
+01302   
+01303   /* Fill in the necessary fields for the new connection. */
+01304   uip_connr->rto = uip_connr->timer = UIP_RTO;
+01305   uip_connr->sa = 0;
+01306   uip_connr->sv = 4;
+01307   uip_connr->nrtx = 0;
+01308   uip_connr->lport = BUF->destport;
+01309   uip_connr->rport = BUF->srcport;
+01310   uip_ipaddr_copy(uip_connr->ripaddr, BUF->srcipaddr);
+01311   uip_connr->tcpstateflags = UIP_SYN_RCVD;
+01312 
+01313   uip_connr->snd_nxt[0] = iss[0];
+01314   uip_connr->snd_nxt[1] = iss[1];
+01315   uip_connr->snd_nxt[2] = iss[2];
+01316   uip_connr->snd_nxt[3] = iss[3];
+01317   uip_connr->len = 1;
+01318 
+01319   /* rcv_nxt should be the seqno from the incoming packet + 1. */
+01320   uip_connr->rcv_nxt[3] = BUF->seqno[3];
+01321   uip_connr->rcv_nxt[2] = BUF->seqno[2];
+01322   uip_connr->rcv_nxt[1] = BUF->seqno[1];
+01323   uip_connr->rcv_nxt[0] = BUF->seqno[0];
+01324   uip_add_rcv_nxt(1);
+01325 
+01326   /* Parse the TCP MSS option, if present. */
+01327   if((BUF->tcpoffset & 0xf0) > 0x50) {
+01328     for(c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2 ;) {
+01329       opt = uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + c];
+01330       if(opt == TCP_OPT_END) {
+01331         /* End of options. */
+01332         break;
+01333       } else if(opt == TCP_OPT_NOOP) {
+01334         ++c;
+01335         /* NOP option. */
+01336       } else if(opt == TCP_OPT_MSS &&
+01337                 uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) {
+01338         /* An MSS option with the right option length. */
+01339         tmp16 = ((u16_t)uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8) |
+01340           (u16_t)uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + 3 + c];
+01341         uip_connr->initialmss = uip_connr->mss =
+01342           tmp16 > UIP_TCP_MSS? UIP_TCP_MSS: tmp16;
+01343         
+01344         /* And we are done processing options. */
+01345         break;
+01346       } else {
+01347         /* All other options have a length field, so that we easily
+01348            can skip past them. */
+01349         if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0) {
+01350           /* If the length field is zero, the options are malformed
+01351              and we don't process them further. */
+01352           break;
+01353         }
+01354         c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c];
+01355       }
+01356     }
+01357   }
+01358   
+01359   /* Our response will be a SYNACK. */
+01360 #if UIP_ACTIVE_OPEN
+01361  tcp_send_synack:
+01362   BUF->flags = TCP_ACK;
+01363   
+01364  tcp_send_syn:
+01365   BUF->flags |= TCP_SYN;
+01366 #else /* UIP_ACTIVE_OPEN */
+01367  tcp_send_synack:
+01368   BUF->flags = TCP_SYN | TCP_ACK;
+01369 #endif /* UIP_ACTIVE_OPEN */
+01370   
+01371   /* We send out the TCP Maximum Segment Size option with our
+01372      SYNACK. */
+01373   BUF->optdata[0] = TCP_OPT_MSS;
+01374   BUF->optdata[1] = TCP_OPT_MSS_LEN;
+01375   BUF->optdata[2] = (UIP_TCP_MSS) / 256;
+01376   BUF->optdata[3] = (UIP_TCP_MSS) & 255;
+01377   uip_len = UIP_IPTCPH_LEN + TCP_OPT_MSS_LEN;
+01378   BUF->tcpoffset = ((UIP_TCPH_LEN + TCP_OPT_MSS_LEN) / 4) << 4;
+01379   goto tcp_send;
+01380 
+01381   /* This label will be jumped to if we found an active connection. */
+01382  found:
+01383   uip_conn = uip_connr;
+01384   uip_flags = 0;
+01385   /* We do a very naive form of TCP reset processing; we just accept
+01386      any RST and kill our connection. We should in fact check if the
+01387      sequence number of this reset is wihtin our advertised window
+01388      before we accept the reset. */
+01389   if(BUF->flags & TCP_RST) {
+01390     uip_connr->tcpstateflags = UIP_CLOSED;
+01391     UIP_LOG("tcp: got reset, aborting connection.");
+01392     uip_flags = UIP_ABORT;
+01393     UIP_APPCALL();
+01394     goto drop;
+01395   }
+01396   /* Calculated the length of the data, if the application has sent
+01397      any data to us. */
+01398   c = (BUF->tcpoffset >> 4) << 2;
+01399   /* uip_len will contain the length of the actual TCP data. This is
+01400      calculated by subtracing the length of the TCP header (in
+01401      c) and the length of the IP header (20 bytes). */
+01402   uip_len = uip_len - c - UIP_IPH_LEN;
+01403 
+01404   /* First, check if the sequence number of the incoming packet is
+01405      what we're expecting next. If not, we send out an ACK with the
+01406      correct numbers in. */
+01407   if(!(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) &&
+01408        ((BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)))) {
+01409     if((uip_len > 0 || ((BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) &&
+01410        (BUF->seqno[0] != uip_connr->rcv_nxt[0] ||
+01411         BUF->seqno[1] != uip_connr->rcv_nxt[1] ||
+01412         BUF->seqno[2] != uip_connr->rcv_nxt[2] ||
+01413         BUF->seqno[3] != uip_connr->rcv_nxt[3])) {
+01414       goto tcp_send_ack;
+01415     }
+01416   }
+01417 
+01418   /* Next, check if the incoming segment acknowledges any outstanding
+01419      data. If so, we update the sequence number, reset the length of
+01420      the outstanding data, calculate RTT estimations, and reset the
+01421      retransmission timer. */
+01422   if((BUF->flags & TCP_ACK) && uip_outstanding(uip_connr)) {
+01423     uip_add32(uip_connr->snd_nxt, uip_connr->len);
+01424 
+01425     if(BUF->ackno[0] == uip_acc32[0] &&
+01426        BUF->ackno[1] == uip_acc32[1] &&
+01427        BUF->ackno[2] == uip_acc32[2] &&
+01428        BUF->ackno[3] == uip_acc32[3]) {
+01429       /* Update sequence number. */
+01430       uip_connr->snd_nxt[0] = uip_acc32[0];
+01431       uip_connr->snd_nxt[1] = uip_acc32[1];
+01432       uip_connr->snd_nxt[2] = uip_acc32[2];
+01433       uip_connr->snd_nxt[3] = uip_acc32[3];
+01434         
+01435 
+01436       /* Do RTT estimation, unless we have done retransmissions. */
+01437       if(uip_connr->nrtx == 0) {
+01438         signed char m;
+01439         m = uip_connr->rto - uip_connr->timer;
+01440         /* This is taken directly from VJs original code in his paper */
+01441         m = m - (uip_connr->sa >> 3);
+01442         uip_connr->sa += m;
+01443         if(m < 0) {
+01444           m = -m;
+01445         }
+01446         m = m - (uip_connr->sv >> 2);
+01447         uip_connr->sv += m;
+01448         uip_connr->rto = (uip_connr->sa >> 3) + uip_connr->sv;
+01449 
+01450       }
+01451       /* Set the acknowledged flag. */
+01452       uip_flags = UIP_ACKDATA;
+01453       /* Reset the retransmission timer. */
+01454       uip_connr->timer = uip_connr->rto;
+01455 
+01456       /* Reset length of outstanding data. */
+01457       uip_connr->len = 0;
+01458     }
+01459     
+01460   }
+01461 
+01462   /* Do different things depending on in what state the connection is. */
+01463   switch(uip_connr->tcpstateflags & UIP_TS_MASK) {
+01464     /* CLOSED and LISTEN are not handled here. CLOSE_WAIT is not
+01465         implemented, since we force the application to close when the
+01466         peer sends a FIN (hence the application goes directly from
+01467         ESTABLISHED to LAST_ACK). */
+01468   case UIP_SYN_RCVD:
+01469     /* In SYN_RCVD we have sent out a SYNACK in response to a SYN, and
+01470        we are waiting for an ACK that acknowledges the data we sent
+01471        out the last time. Therefore, we want to have the UIP_ACKDATA
+01472        flag set. If so, we enter the ESTABLISHED state. */
+01473     if(uip_flags & UIP_ACKDATA) {
+01474       uip_connr->tcpstateflags = UIP_ESTABLISHED;
+01475       uip_flags = UIP_CONNECTED;
+01476       uip_connr->len = 0;
+01477       if(uip_len > 0) {
+01478         uip_flags |= UIP_NEWDATA;
+01479         uip_add_rcv_nxt(uip_len);
+01480       }
+01481       uip_slen = 0;
+01482       UIP_APPCALL();
+01483       goto appsend;
+01484     }
+01485     goto drop;
+01486 #if UIP_ACTIVE_OPEN
+01487   case UIP_SYN_SENT:
+01488     /* In SYN_SENT, we wait for a SYNACK that is sent in response to
+01489        our SYN. The rcv_nxt is set to sequence number in the SYNACK
+01490        plus one, and we send an ACK. We move into the ESTABLISHED
+01491        state. */
+01492     if((uip_flags & UIP_ACKDATA) &&
+01493        (BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)) {
+01494 
+01495       /* Parse the TCP MSS option, if present. */
+01496       if((BUF->tcpoffset & 0xf0) > 0x50) {
+01497         for(c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2 ;) {
+01498           opt = uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + c];
+01499           if(opt == TCP_OPT_END) {
+01500             /* End of options. */
+01501             break;
+01502           } else if(opt == TCP_OPT_NOOP) {
+01503             ++c;
+01504             /* NOP option. */
+01505           } else if(opt == TCP_OPT_MSS &&
+01506                     uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) {
+01507             /* An MSS option with the right option length. */
+01508             tmp16 = (uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8) |
+01509               uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 3 + c];
+01510             uip_connr->initialmss =
+01511               uip_connr->mss = tmp16 > UIP_TCP_MSS? UIP_TCP_MSS: tmp16;
+01512 
+01513             /* And we are done processing options. */
+01514             break;
+01515           } else {
+01516             /* All other options have a length field, so that we easily
+01517                can skip past them. */
+01518             if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0) {
+01519               /* If the length field is zero, the options are malformed
+01520                  and we don't process them further. */
+01521               break;
+01522             }
+01523             c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c];
+01524           }
+01525         }
+01526       }
+01527       uip_connr->tcpstateflags = UIP_ESTABLISHED;
+01528       uip_connr->rcv_nxt[0] = BUF->seqno[0];
+01529       uip_connr->rcv_nxt[1] = BUF->seqno[1];
+01530       uip_connr->rcv_nxt[2] = BUF->seqno[2];
+01531       uip_connr->rcv_nxt[3] = BUF->seqno[3];
+01532       uip_add_rcv_nxt(1);
+01533       uip_flags = UIP_CONNECTED | UIP_NEWDATA;
+01534       uip_connr->len = 0;
+01535       uip_len = 0;
+01536       uip_slen = 0;
+01537       UIP_APPCALL();
+01538       goto appsend;
+01539     }
+01540     /* Inform the application that the connection failed */
+01541     uip_flags = UIP_ABORT;
+01542     UIP_APPCALL();
+01543     /* The connection is closed after we send the RST */
+01544     uip_conn->tcpstateflags = UIP_CLOSED;
+01545     goto reset;
+01546 #endif /* UIP_ACTIVE_OPEN */
+01547     
+01548   case UIP_ESTABLISHED:
+01549     /* In the ESTABLISHED state, we call upon the application to feed
+01550     data into the uip_buf. If the UIP_ACKDATA flag is set, the
+01551     application should put new data into the buffer, otherwise we are
+01552     retransmitting an old segment, and the application should put that
+01553     data into the buffer.
+01554 
+01555     If the incoming packet is a FIN, we should close the connection on
+01556     this side as well, and we send out a FIN and enter the LAST_ACK
+01557     state. We require that there is no outstanding data; otherwise the
+01558     sequence numbers will be screwed up. */
+01559 
+01560     if(BUF->flags & TCP_FIN && !(uip_connr->tcpstateflags & UIP_STOPPED)) {
+01561       if(uip_outstanding(uip_connr)) {
+01562         goto drop;
+01563       }
+01564       uip_add_rcv_nxt(1 + uip_len);
+01565       uip_flags |= UIP_CLOSE;
+01566       if(uip_len > 0) {
+01567         uip_flags |= UIP_NEWDATA;
+01568       }
+01569       UIP_APPCALL();
+01570       uip_connr->len = 1;
+01571       uip_connr->tcpstateflags = UIP_LAST_ACK;
+01572       uip_connr->nrtx = 0;
+01573     tcp_send_finack:
+01574       BUF->flags = TCP_FIN | TCP_ACK;
+01575       goto tcp_send_nodata;
+01576     }
+01577 
+01578     /* Check the URG flag. If this is set, the segment carries urgent
+01579        data that we must pass to the application. */
+01580     if((BUF->flags & TCP_URG) != 0) {
+01581 #if UIP_URGDATA > 0
+01582       uip_urglen = (BUF->urgp[0] << 8) | BUF->urgp[1];
+01583       if(uip_urglen > uip_len) {
+01584         /* There is more urgent data in the next segment to come. */
+01585         uip_urglen = uip_len;
+01586       }
+01587       uip_add_rcv_nxt(uip_urglen);
+01588       uip_len -= uip_urglen;
+01589       uip_urgdata = uip_appdata;
+01590       uip_appdata += uip_urglen;
+01591     } else {
+01592       uip_urglen = 0;
+01593 #else /* UIP_URGDATA > 0 */
+01594       uip_appdata = ((char *)uip_appdata) + ((BUF->urgp[0] << 8) | BUF->urgp[1]);
+01595       uip_len -= (BUF->urgp[0] << 8) | BUF->urgp[1];
+01596 #endif /* UIP_URGDATA > 0 */
+01597     }
+01598 
+01599     /* If uip_len > 0 we have TCP data in the packet, and we flag this
+01600        by setting the UIP_NEWDATA flag and update the sequence number
+01601        we acknowledge. If the application has stopped the dataflow
+01602        using uip_stop(), we must not accept any data packets from the
+01603        remote host. */
+01604     if(uip_len > 0 && !(uip_connr->tcpstateflags & UIP_STOPPED)) {
+01605       uip_flags |= UIP_NEWDATA;
+01606       uip_add_rcv_nxt(uip_len);
+01607     }
+01608 
+01609     /* Check if the available buffer space advertised by the other end
+01610        is smaller than the initial MSS for this connection. If so, we
+01611        set the current MSS to the window size to ensure that the
+01612        application does not send more data than the other end can
+01613        handle.
+01614 
+01615        If the remote host advertises a zero window, we set the MSS to
+01616        the initial MSS so that the application will send an entire MSS
+01617        of data. This data will not be acknowledged by the receiver,
+01618        and the application will retransmit it. This is called the
+01619        "persistent timer" and uses the retransmission mechanim.
+01620     */
+01621     tmp16 = ((u16_t)BUF->wnd[0] << 8) + (u16_t)BUF->wnd[1];
+01622     if(tmp16 > uip_connr->initialmss ||
+01623        tmp16 == 0) {
+01624       tmp16 = uip_connr->initialmss;
+01625     }
+01626     uip_connr->mss = tmp16;
+01627 
+01628     /* If this packet constitutes an ACK for outstanding data (flagged
+01629        by the UIP_ACKDATA flag, we should call the application since it
+01630        might want to send more data. If the incoming packet had data
+01631        from the peer (as flagged by the UIP_NEWDATA flag), the
+01632        application must also be notified.
+01633 
+01634        When the application is called, the global variable uip_len
+01635        contains the length of the incoming data. The application can
+01636        access the incoming data through the global pointer
+01637        uip_appdata, which usually points UIP_IPTCPH_LEN + UIP_LLH_LEN
+01638        bytes into the uip_buf array.
+01639 
+01640        If the application wishes to send any data, this data should be
+01641        put into the uip_appdata and the length of the data should be
+01642        put into uip_len. If the application don't have any data to
+01643        send, uip_len must be set to 0. */
+01644     if(uip_flags & (UIP_NEWDATA | UIP_ACKDATA)) {
+01645       uip_slen = 0;
+01646       UIP_APPCALL();
+01647 
+01648     appsend:
+01649       
+01650       if(uip_flags & UIP_ABORT) {
+01651         uip_slen = 0;
+01652         uip_connr->tcpstateflags = UIP_CLOSED;
+01653         BUF->flags = TCP_RST | TCP_ACK;
+01654         goto tcp_send_nodata;
+01655       }
+01656 
+01657       if(uip_flags & UIP_CLOSE) {
+01658         uip_slen = 0;
+01659         uip_connr->len = 1;
+01660         uip_connr->tcpstateflags = UIP_FIN_WAIT_1;
+01661         uip_connr->nrtx = 0;
+01662         BUF->flags = TCP_FIN | TCP_ACK;
+01663         goto tcp_send_nodata;
+01664       }
+01665 
+01666       /* If uip_slen > 0, the application has data to be sent. */
+01667       if(uip_slen > 0) {
+01668 
+01669         /* If the connection has acknowledged data, the contents of
+01670            the ->len variable should be discarded. */
+01671         if((uip_flags & UIP_ACKDATA) != 0) {
+01672           uip_connr->len = 0;
+01673         }
+01674 
+01675         /* If the ->len variable is non-zero the connection has
+01676            already data in transit and cannot send anymore right
+01677            now. */
+01678         if(uip_connr->len == 0) {
+01679 
+01680           /* The application cannot send more than what is allowed by
+01681              the mss (the minumum of the MSS and the available
+01682              window). */
+01683           if(uip_slen > uip_connr->mss) {
+01684             uip_slen = uip_connr->mss;
+01685           }
+01686 
+01687           /* Remember how much data we send out now so that we know
+01688              when everything has been acknowledged. */
+01689           uip_connr->len = uip_slen;
+01690         } else {
+01691 
+01692           /* If the application already had unacknowledged data, we
+01693              make sure that the application does not send (i.e.,
+01694              retransmit) out more than it previously sent out. */
+01695           uip_slen = uip_connr->len;
+01696         }
+01697       }
+01698       uip_connr->nrtx = 0;
+01699     apprexmit:
+01700       uip_appdata = uip_sappdata;
+01701       
+01702       /* If the application has data to be sent, or if the incoming
+01703          packet had new data in it, we must send out a packet. */
+01704       if(uip_slen > 0 && uip_connr->len > 0) {
+01705         /* Add the length of the IP and TCP headers. */
+01706         uip_len = uip_connr->len + UIP_TCPIP_HLEN;
+01707         /* We always set the ACK flag in response packets. */
+01708         BUF->flags = TCP_ACK | TCP_PSH;
+01709         /* Send the packet. */
+01710         goto tcp_send_noopts;
+01711       }
+01712       /* If there is no data to send, just send out a pure ACK if
+01713          there is newdata. */
+01714       if(uip_flags & UIP_NEWDATA) {
+01715         uip_len = UIP_TCPIP_HLEN;
+01716         BUF->flags = TCP_ACK;
+01717         goto tcp_send_noopts;
+01718       }
+01719     }
+01720     goto drop;
+01721   case UIP_LAST_ACK:
+01722     /* We can close this connection if the peer has acknowledged our
+01723        FIN. This is indicated by the UIP_ACKDATA flag. */
+01724     if(uip_flags & UIP_ACKDATA) {
+01725       uip_connr->tcpstateflags = UIP_CLOSED;
+01726       uip_flags = UIP_CLOSE;
+01727       UIP_APPCALL();
+01728     }
+01729     break;
+01730     
+01731   case UIP_FIN_WAIT_1:
+01732     /* The application has closed the connection, but the remote host
+01733        hasn't closed its end yet. Thus we do nothing but wait for a
+01734        FIN from the other side. */
+01735     if(uip_len > 0) {
+01736       uip_add_rcv_nxt(uip_len);
+01737     }
+01738     if(BUF->flags & TCP_FIN) {
+01739       if(uip_flags & UIP_ACKDATA) {
+01740         uip_connr->tcpstateflags = UIP_TIME_WAIT;
+01741         uip_connr->timer = 0;
+01742         uip_connr->len = 0;
+01743       } else {
+01744         uip_connr->tcpstateflags = UIP_CLOSING;
+01745       }
+01746       uip_add_rcv_nxt(1);
+01747       uip_flags = UIP_CLOSE;
+01748       UIP_APPCALL();
+01749       goto tcp_send_ack;
+01750     } else if(uip_flags & UIP_ACKDATA) {
+01751       uip_connr->tcpstateflags = UIP_FIN_WAIT_2;
+01752       uip_connr->len = 0;
+01753       goto drop;
+01754     }
+01755     if(uip_len > 0) {
+01756       goto tcp_send_ack;
+01757     }
+01758     goto drop;
+01759       
+01760   case UIP_FIN_WAIT_2:
+01761     if(uip_len > 0) {
+01762       uip_add_rcv_nxt(uip_len);
+01763     }
+01764     if(BUF->flags & TCP_FIN) {
+01765       uip_connr->tcpstateflags = UIP_TIME_WAIT;
+01766       uip_connr->timer = 0;
+01767       uip_add_rcv_nxt(1);
+01768       uip_flags = UIP_CLOSE;
+01769       UIP_APPCALL();
+01770       goto tcp_send_ack;
+01771     }
+01772     if(uip_len > 0) {
+01773       goto tcp_send_ack;
+01774     }
+01775     goto drop;
+01776 
+01777   case UIP_TIME_WAIT:
+01778     goto tcp_send_ack;
+01779     
+01780   case UIP_CLOSING:
+01781     if(uip_flags & UIP_ACKDATA) {
+01782       uip_connr->tcpstateflags = UIP_TIME_WAIT;
+01783       uip_connr->timer = 0;
+01784     }
+01785   }
+01786   goto drop;
+01787   
+01788 
+01789   /* We jump here when we are ready to send the packet, and just want
+01790      to set the appropriate TCP sequence numbers in the TCP header. */
+01791  tcp_send_ack:
+01792   BUF->flags = TCP_ACK;
+01793  tcp_send_nodata:
+01794   uip_len = UIP_IPTCPH_LEN;
+01795  tcp_send_noopts:
+01796   BUF->tcpoffset = (UIP_TCPH_LEN / 4) << 4;
+01797  tcp_send:
+01798   /* We're done with the input processing. We are now ready to send a
+01799      reply. Our job is to fill in all the fields of the TCP and IP
+01800      headers before calculating the checksum and finally send the
+01801      packet. */
+01802   BUF->ackno[0] = uip_connr->rcv_nxt[0];
+01803   BUF->ackno[1] = uip_connr->rcv_nxt[1];
+01804   BUF->ackno[2] = uip_connr->rcv_nxt[2];
+01805   BUF->ackno[3] = uip_connr->rcv_nxt[3];
+01806   
+01807   BUF->seqno[0] = uip_connr->snd_nxt[0];
+01808   BUF->seqno[1] = uip_connr->snd_nxt[1];
+01809   BUF->seqno[2] = uip_connr->snd_nxt[2];
+01810   BUF->seqno[3] = uip_connr->snd_nxt[3];
+01811 
+01812   BUF->proto = UIP_PROTO_TCP;
+01813   
+01814   BUF->srcport  = uip_connr->lport;
+01815   BUF->destport = uip_connr->rport;
+01816 
+01817   uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr);
+01818   uip_ipaddr_copy(BUF->destipaddr, uip_connr->ripaddr);
+01819 
+01820   if(uip_connr->tcpstateflags & UIP_STOPPED) {
+01821     /* If the connection has issued uip_stop(), we advertise a zero
+01822        window so that the remote host will stop sending data. */
+01823     BUF->wnd[0] = BUF->wnd[1] = 0;
+01824   } else {
+01825     BUF->wnd[0] = ((UIP_RECEIVE_WINDOW) >> 8);
+01826     BUF->wnd[1] = ((UIP_RECEIVE_WINDOW) & 0xff);
+01827   }
+01828 
+01829  tcp_send_noconn:
+01830   BUF->ttl = UIP_TTL;
+01831 #if UIP_CONF_IPV6
+01832   /* For IPv6, the IP length field does not include the IPv6 IP header
+01833      length. */
+01834   BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8);
+01835   BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff);
+01836 #else /* UIP_CONF_IPV6 */
+01837   BUF->len[0] = (uip_len >> 8);
+01838   BUF->len[1] = (uip_len & 0xff);
+01839 #endif /* UIP_CONF_IPV6 */
+01840 
+01841   BUF->urgp[0] = BUF->urgp[1] = 0;
+01842   
+01843   /* Calculate TCP checksum. */
+01844   BUF->tcpchksum = 0;
+01845   BUF->tcpchksum = ~(uip_tcpchksum());
+01846   
+01847  ip_send_nolen:
+01848 
+01849 #if UIP_CONF_IPV6
+01850   BUF->vtc = 0x60;
+01851   BUF->tcflow = 0x00;
+01852   BUF->flow = 0x00;
+01853 #else /* UIP_CONF_IPV6 */
+01854   BUF->vhl = 0x45;
+01855   BUF->tos = 0;
+01856   BUF->ipoffset[0] = BUF->ipoffset[1] = 0;
+01857   ++ipid;
+01858   BUF->ipid[0] = ipid >> 8;
+01859   BUF->ipid[1] = ipid & 0xff;
+01860   /* Calculate IP checksum. */
+01861   BUF->ipchksum = 0;
+01862   BUF->ipchksum = ~(uip_ipchksum());
+01863   DEBUG_PRINTF("uip ip_send_nolen: chkecum 0x%04x\n", uip_ipchksum());
+01864 #endif /* UIP_CONF_IPV6 */
+01865    
+01866   UIP_STAT(++uip_stat.tcp.sent);
+01867  send:
+01868   DEBUG_PRINTF("Sending packet with length %d (%d)\n", uip_len,
+01869                (BUF->len[0] << 8) | BUF->len[1]);
+01870   
+01871   UIP_STAT(++uip_stat.ip.sent);
+01872   /* Return and let the caller do the actual transmission. */
+01873   uip_flags = 0;
+01874   return;
+01875  drop:
+01876   uip_len = 0;
+01877   uip_flags = 0;
+01878   return;
+01879 }
+01880 /*---------------------------------------------------------------------------*/
+01881 u16_t
+01882 htons(u16_t val)
+01883 {
+01884   return HTONS(val);
+01885 }
+01886 /*---------------------------------------------------------------------------*/
+01887 void
+01888 uip_send(const void *data, int len)
+01889 {
+01890   if(len > 0) {
+01891     uip_slen = len;
+01892     if(data != uip_sappdata) {
+01893       memcpy(uip_sappdata, (data), uip_slen);
+01894     }
+01895   }
+01896 }
+01897 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00202.html b/third_party/uip-1.0/doc/html/a00202.html new file mode 100644 index 0000000..53a41d3 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00202.html @@ -0,0 +1,1626 @@ + + +uIP 1.0: uip/uip.h Source File + + + + + + +

uip/uip.h

Go to the documentation of this file.
00001 
+00002 /**
+00003  * \addtogroup uip
+00004  * @{
+00005  */
+00006 
+00007 /**
+00008  * \file
+00009  * Header file for the uIP TCP/IP stack.
+00010  * \author Adam Dunkels <adam@dunkels.com>
+00011  *
+00012  * The uIP TCP/IP stack header file contains definitions for a number
+00013  * of C macros that are used by uIP programs as well as internal uIP
+00014  * structures, TCP/IP header structures and function declarations.
+00015  *
+00016  */
+00017 
+00018 
+00019 /*
+00020  * Copyright (c) 2001-2003, Adam Dunkels.
+00021  * All rights reserved.
+00022  *
+00023  * Redistribution and use in source and binary forms, with or without
+00024  * modification, are permitted provided that the following conditions
+00025  * are met:
+00026  * 1. Redistributions of source code must retain the above copyright
+00027  *    notice, this list of conditions and the following disclaimer.
+00028  * 2. Redistributions in binary form must reproduce the above copyright
+00029  *    notice, this list of conditions and the following disclaimer in the
+00030  *    documentation and/or other materials provided with the distribution.
+00031  * 3. The name of the author may not be used to endorse or promote
+00032  *    products derived from this software without specific prior
+00033  *    written permission.
+00034  *
+00035  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00036  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00037  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00038  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00039  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00040  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00041  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00042  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00043  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00044  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00045  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00046  *
+00047  * This file is part of the uIP TCP/IP stack.
+00048  *
+00049  * $Id: uip.h,v 1.40 2006/06/08 07:12:07 adam Exp $
+00050  *
+00051  */
+00052 
+00053 #ifndef __UIP_H__
+00054 #define __UIP_H__
+00055 
+00056 #include "uipopt.h"
+00057 
+00058 /**
+00059  * Repressentation of an IP address.
+00060  *
+00061  */
+00062 typedef u16_t uip_ip4addr_t[2];
+00063 typedef u16_t uip_ip6addr_t[8];
+00064 #if UIP_CONF_IPV6
+00065 typedef uip_ip6addr_t uip_ipaddr_t;
+00066 #else /* UIP_CONF_IPV6 */
+00067 typedef uip_ip4addr_t uip_ipaddr_t;
+00068 #endif /* UIP_CONF_IPV6 */
+00069 
+00070 /*---------------------------------------------------------------------------*/
+00071 /* First, the functions that should be called from the
+00072  * system. Initialization, the periodic timer and incoming packets are
+00073  * handled by the following three functions.
+00074  */
+00075 
+00076 /**
+00077  * \defgroup uipconffunc uIP configuration functions
+00078  * @{
+00079  *
+00080  * The uIP configuration functions are used for setting run-time
+00081  * parameters in uIP such as IP addresses.
+00082  */
+00083 
+00084 /**
+00085  * Set the IP address of this host.
+00086  *
+00087  * The IP address is represented as a 4-byte array where the first
+00088  * octet of the IP address is put in the first member of the 4-byte
+00089  * array.
+00090  *
+00091  * Example:
+00092  \code
+00093 
+00094  uip_ipaddr_t addr;
+00095 
+00096  uip_ipaddr(&addr, 192,168,1,2);
+00097  uip_sethostaddr(&addr);
+00098  
+00099  \endcode
+00100  * \param addr A pointer to an IP address of type uip_ipaddr_t;
+00101  *
+00102  * \sa uip_ipaddr()
+00103  *
+00104  * \hideinitializer
+00105  */
+00106 #define uip_sethostaddr(addr) uip_ipaddr_copy(uip_hostaddr, (addr))
+00107 
+00108 /**
+00109  * Get the IP address of this host.
+00110  *
+00111  * The IP address is represented as a 4-byte array where the first
+00112  * octet of the IP address is put in the first member of the 4-byte
+00113  * array.
+00114  *
+00115  * Example:
+00116  \code
+00117  uip_ipaddr_t hostaddr;
+00118 
+00119  uip_gethostaddr(&hostaddr);
+00120  \endcode
+00121  * \param addr A pointer to a uip_ipaddr_t variable that will be
+00122  * filled in with the currently configured IP address.
+00123  *
+00124  * \hideinitializer
+00125  */
+00126 #define uip_gethostaddr(addr) uip_ipaddr_copy((addr), uip_hostaddr)
+00127 
+00128 /**
+00129  * Set the default router's IP address.
+00130  *
+00131  * \param addr A pointer to a uip_ipaddr_t variable containing the IP
+00132  * address of the default router.
+00133  *
+00134  * \sa uip_ipaddr()
+00135  *
+00136  * \hideinitializer
+00137  */
+00138 #define uip_setdraddr(addr) uip_ipaddr_copy(uip_draddr, (addr))
+00139 
+00140 /**
+00141  * Set the netmask.
+00142  *
+00143  * \param addr A pointer to a uip_ipaddr_t variable containing the IP
+00144  * address of the netmask.
+00145  *
+00146  * \sa uip_ipaddr()
+00147  *
+00148  * \hideinitializer
+00149  */
+00150 #define uip_setnetmask(addr) uip_ipaddr_copy(uip_netmask, (addr))
+00151 
+00152 
+00153 /**
+00154  * Get the default router's IP address.
+00155  *
+00156  * \param addr A pointer to a uip_ipaddr_t variable that will be
+00157  * filled in with the IP address of the default router.
+00158  *
+00159  * \hideinitializer
+00160  */
+00161 #define uip_getdraddr(addr) uip_ipaddr_copy((addr), uip_draddr)
+00162 
+00163 /**
+00164  * Get the netmask.
+00165  *
+00166  * \param addr A pointer to a uip_ipaddr_t variable that will be
+00167  * filled in with the value of the netmask.
+00168  *
+00169  * \hideinitializer
+00170  */
+00171 #define uip_getnetmask(addr) uip_ipaddr_copy((addr), uip_netmask)
+00172 
+00173 /** @} */
+00174 
+00175 /**
+00176  * \defgroup uipinit uIP initialization functions
+00177  * @{
+00178  *
+00179  * The uIP initialization functions are used for booting uIP.
+00180  */
+00181 
+00182 /**
+00183  * uIP initialization function.
+00184  *
+00185  * This function should be called at boot up to initilize the uIP
+00186  * TCP/IP stack.
+00187  */
+00188 void uip_init(void);
+00189 
+00190 /**
+00191  * uIP initialization function.
+00192  *
+00193  * This function may be used at boot time to set the initial ip_id.
+00194  */
+00195 void uip_setipid(u16_t id);
+00196 
+00197 /** @} */
+00198 
+00199 /**
+00200  * \defgroup uipdevfunc uIP device driver functions
+00201  * @{
+00202  *
+00203  * These functions are used by a network device driver for interacting
+00204  * with uIP.
+00205  */
+00206 
+00207 /**
+00208  * Process an incoming packet.
+00209  *
+00210  * This function should be called when the device driver has received
+00211  * a packet from the network. The packet from the device driver must
+00212  * be present in the uip_buf buffer, and the length of the packet
+00213  * should be placed in the uip_len variable.
+00214  *
+00215  * When the function returns, there may be an outbound packet placed
+00216  * in the uip_buf packet buffer. If so, the uip_len variable is set to
+00217  * the length of the packet. If no packet is to be sent out, the
+00218  * uip_len variable is set to 0.
+00219  *
+00220  * The usual way of calling the function is presented by the source
+00221  * code below.
+00222  \code
+00223   uip_len = devicedriver_poll();
+00224   if(uip_len > 0) {
+00225     uip_input();
+00226     if(uip_len > 0) {
+00227       devicedriver_send();
+00228     }
+00229   }
+00230  \endcode
+00231  *
+00232  * \note If you are writing a uIP device driver that needs ARP
+00233  * (Address Resolution Protocol), e.g., when running uIP over
+00234  * Ethernet, you will need to call the uIP ARP code before calling
+00235  * this function:
+00236  \code
+00237   #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
+00238   uip_len = ethernet_devicedrver_poll();
+00239   if(uip_len > 0) {
+00240     if(BUF->type == HTONS(UIP_ETHTYPE_IP)) {
+00241       uip_arp_ipin();
+00242       uip_input();
+00243       if(uip_len > 0) {
+00244         uip_arp_out();
+00245         ethernet_devicedriver_send();
+00246       }
+00247     } else if(BUF->type == HTONS(UIP_ETHTYPE_ARP)) {
+00248       uip_arp_arpin();
+00249       if(uip_len > 0) {
+00250         ethernet_devicedriver_send();
+00251       }
+00252     }
+00253  \endcode
+00254  *
+00255  * \hideinitializer
+00256  */
+00257 #define uip_input()        uip_process(UIP_DATA)
+00258 
+00259 /**
+00260  * Periodic processing for a connection identified by its number.
+00261  *
+00262  * This function does the necessary periodic processing (timers,
+00263  * polling) for a uIP TCP conneciton, and should be called when the
+00264  * periodic uIP timer goes off. It should be called for every
+00265  * connection, regardless of whether they are open of closed.
+00266  *
+00267  * When the function returns, it may have an outbound packet waiting
+00268  * for service in the uIP packet buffer, and if so the uip_len
+00269  * variable is set to a value larger than zero. The device driver
+00270  * should be called to send out the packet.
+00271  *
+00272  * The ususal way of calling the function is through a for() loop like
+00273  * this:
+00274  \code
+00275   for(i = 0; i < UIP_CONNS; ++i) {
+00276     uip_periodic(i);
+00277     if(uip_len > 0) {
+00278       devicedriver_send();
+00279     }
+00280   }
+00281  \endcode
+00282  *
+00283  * \note If you are writing a uIP device driver that needs ARP
+00284  * (Address Resolution Protocol), e.g., when running uIP over
+00285  * Ethernet, you will need to call the uip_arp_out() function before
+00286  * calling the device driver:
+00287  \code
+00288   for(i = 0; i < UIP_CONNS; ++i) {
+00289     uip_periodic(i);
+00290     if(uip_len > 0) {
+00291       uip_arp_out();
+00292       ethernet_devicedriver_send();
+00293     }
+00294   }
+00295  \endcode
+00296  *
+00297  * \param conn The number of the connection which is to be periodically polled.
+00298  *
+00299  * \hideinitializer
+00300  */
+00301 #define uip_periodic(conn) do { uip_conn = &uip_conns[conn]; \
+00302                                 uip_process(UIP_TIMER); } while (0)
+00303 
+00304 /**
+00305  *
+00306  *
+00307  */
+00308 #define uip_conn_active(conn) (uip_conns[conn].tcpstateflags != UIP_CLOSED)
+00309 
+00310 /**
+00311  * Perform periodic processing for a connection identified by a pointer
+00312  * to its structure.
+00313  *
+00314  * Same as uip_periodic() but takes a pointer to the actual uip_conn
+00315  * struct instead of an integer as its argument. This function can be
+00316  * used to force periodic processing of a specific connection.
+00317  *
+00318  * \param conn A pointer to the uip_conn struct for the connection to
+00319  * be processed.
+00320  *
+00321  * \hideinitializer
+00322  */
+00323 #define uip_periodic_conn(conn) do { uip_conn = conn; \
+00324                                      uip_process(UIP_TIMER); } while (0)
+00325 
+00326 /**
+00327  * Reuqest that a particular connection should be polled.
+00328  *
+00329  * Similar to uip_periodic_conn() but does not perform any timer
+00330  * processing. The application is polled for new data.
+00331  *
+00332  * \param conn A pointer to the uip_conn struct for the connection to
+00333  * be processed.
+00334  *
+00335  * \hideinitializer
+00336  */
+00337 #define uip_poll_conn(conn) do { uip_conn = conn; \
+00338                                  uip_process(UIP_POLL_REQUEST); } while (0)
+00339 
+00340 
+00341 #if UIP_UDP
+00342 /**
+00343  * Periodic processing for a UDP connection identified by its number.
+00344  *
+00345  * This function is essentially the same as uip_periodic(), but for
+00346  * UDP connections. It is called in a similar fashion as the
+00347  * uip_periodic() function:
+00348  \code
+00349   for(i = 0; i < UIP_UDP_CONNS; i++) {
+00350     uip_udp_periodic(i);
+00351     if(uip_len > 0) {
+00352       devicedriver_send();
+00353     }
+00354   }
+00355  \endcode
+00356  *
+00357  * \note As for the uip_periodic() function, special care has to be
+00358  * taken when using uIP together with ARP and Ethernet:
+00359  \code
+00360   for(i = 0; i < UIP_UDP_CONNS; i++) {
+00361     uip_udp_periodic(i);
+00362     if(uip_len > 0) {
+00363       uip_arp_out();
+00364       ethernet_devicedriver_send();
+00365     }
+00366   }
+00367  \endcode
+00368  *
+00369  * \param conn The number of the UDP connection to be processed.
+00370  *
+00371  * \hideinitializer
+00372  */
+00373 #define uip_udp_periodic(conn) do { uip_udp_conn = &uip_udp_conns[conn]; \
+00374                                 uip_process(UIP_UDP_TIMER); } while (0)
+00375 
+00376 /**
+00377  * Periodic processing for a UDP connection identified by a pointer to
+00378  * its structure.
+00379  *
+00380  * Same as uip_udp_periodic() but takes a pointer to the actual
+00381  * uip_conn struct instead of an integer as its argument. This
+00382  * function can be used to force periodic processing of a specific
+00383  * connection.
+00384  *
+00385  * \param conn A pointer to the uip_udp_conn struct for the connection
+00386  * to be processed.
+00387  *
+00388  * \hideinitializer
+00389  */
+00390 #define uip_udp_periodic_conn(conn) do { uip_udp_conn = conn; \
+00391                                          uip_process(UIP_UDP_TIMER); } while (0)
+00392 
+00393 
+00394 #endif /* UIP_UDP */
+00395 
+00396 /**
+00397  * The uIP packet buffer.
+00398  *
+00399  * The uip_buf array is used to hold incoming and outgoing
+00400  * packets. The device driver should place incoming data into this
+00401  * buffer. When sending data, the device driver should read the link
+00402  * level headers and the TCP/IP headers from this buffer. The size of
+00403  * the link level headers is configured by the UIP_LLH_LEN define.
+00404  *
+00405  * \note The application data need not be placed in this buffer, so
+00406  * the device driver must read it from the place pointed to by the
+00407  * uip_appdata pointer as illustrated by the following example:
+00408  \code
+00409  void
+00410  devicedriver_send(void)
+00411  {
+00412     hwsend(&uip_buf[0], UIP_LLH_LEN);
+00413     if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) {
+00414       hwsend(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN);
+00415     } else {
+00416       hwsend(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN);
+00417       hwsend(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN);
+00418     }
+00419  }
+00420  \endcode
+00421  */
+00422 extern u8_t uip_buf[UIP_BUFSIZE+2];
+00423 
+00424 /** @} */
+00425 
+00426 /*---------------------------------------------------------------------------*/
+00427 /* Functions that are used by the uIP application program. Opening and
+00428  * closing connections, sending and receiving data, etc. is all
+00429  * handled by the functions below.
+00430 */
+00431 /**
+00432  * \defgroup uipappfunc uIP application functions
+00433  * @{
+00434  *
+00435  * Functions used by an application running of top of uIP.
+00436  */
+00437 
+00438 /**
+00439  * Start listening to the specified port.
+00440  *
+00441  * \note Since this function expects the port number in network byte
+00442  * order, a conversion using HTONS() or htons() is necessary.
+00443  *
+00444  \code
+00445  uip_listen(HTONS(80));
+00446  \endcode
+00447  *
+00448  * \param port A 16-bit port number in network byte order.
+00449  */
+00450 void uip_listen(u16_t port);
+00451 
+00452 /**
+00453  * Stop listening to the specified port.
+00454  *
+00455  * \note Since this function expects the port number in network byte
+00456  * order, a conversion using HTONS() or htons() is necessary.
+00457  *
+00458  \code
+00459  uip_unlisten(HTONS(80));
+00460  \endcode
+00461  *
+00462  * \param port A 16-bit port number in network byte order.
+00463  */
+00464 void uip_unlisten(u16_t port);
+00465 
+00466 /**
+00467  * Connect to a remote host using TCP.
+00468  *
+00469  * This function is used to start a new connection to the specified
+00470  * port on the specied host. It allocates a new connection identifier,
+00471  * sets the connection to the SYN_SENT state and sets the
+00472  * retransmission timer to 0. This will cause a TCP SYN segment to be
+00473  * sent out the next time this connection is periodically processed,
+00474  * which usually is done within 0.5 seconds after the call to
+00475  * uip_connect().
+00476  *
+00477  * \note This function is avaliable only if support for active open
+00478  * has been configured by defining UIP_ACTIVE_OPEN to 1 in uipopt.h.
+00479  *
+00480  * \note Since this function requires the port number to be in network
+00481  * byte order, a conversion using HTONS() or htons() is necessary.
+00482  *
+00483  \code
+00484  uip_ipaddr_t ipaddr;
+00485 
+00486  uip_ipaddr(&ipaddr, 192,168,1,2);
+00487  uip_connect(&ipaddr, HTONS(80));
+00488  \endcode
+00489  *
+00490  * \param ripaddr The IP address of the remote hot.
+00491  *
+00492  * \param port A 16-bit port number in network byte order.
+00493  *
+00494  * \return A pointer to the uIP connection identifier for the new connection,
+00495  * or NULL if no connection could be allocated.
+00496  *
+00497  */
+00498 struct uip_conn *uip_connect(uip_ipaddr_t *ripaddr, u16_t port);
+00499 
+00500 
+00501 
+00502 /**
+00503  * \internal
+00504  *
+00505  * Check if a connection has outstanding (i.e., unacknowledged) data.
+00506  *
+00507  * \param conn A pointer to the uip_conn structure for the connection.
+00508  *
+00509  * \hideinitializer
+00510  */
+00511 #define uip_outstanding(conn) ((conn)->len)
+00512 
+00513 /**
+00514  * Send data on the current connection.
+00515  *
+00516  * This function is used to send out a single segment of TCP
+00517  * data. Only applications that have been invoked by uIP for event
+00518  * processing can send data.
+00519  *
+00520  * The amount of data that actually is sent out after a call to this
+00521  * funcion is determined by the maximum amount of data TCP allows. uIP
+00522  * will automatically crop the data so that only the appropriate
+00523  * amount of data is sent. The function uip_mss() can be used to query
+00524  * uIP for the amount of data that actually will be sent.
+00525  *
+00526  * \note This function does not guarantee that the sent data will
+00527  * arrive at the destination. If the data is lost in the network, the
+00528  * application will be invoked with the uip_rexmit() event being
+00529  * set. The application will then have to resend the data using this
+00530  * function.
+00531  *
+00532  * \param data A pointer to the data which is to be sent.
+00533  *
+00534  * \param len The maximum amount of data bytes to be sent.
+00535  *
+00536  * \hideinitializer
+00537  */
+00538 void uip_send(const void *data, int len);
+00539 
+00540 /**
+00541  * The length of any incoming data that is currently avaliable (if avaliable)
+00542  * in the uip_appdata buffer.
+00543  *
+00544  * The test function uip_data() must first be used to check if there
+00545  * is any data available at all.
+00546  *
+00547  * \hideinitializer
+00548  */
+00549 /*void uip_datalen(void);*/
+00550 #define uip_datalen()       uip_len
+00551 
+00552 /**
+00553  * The length of any out-of-band data (urgent data) that has arrived
+00554  * on the connection.
+00555  *
+00556  * \note The configuration parameter UIP_URGDATA must be set for this
+00557  * function to be enabled.
+00558  *
+00559  * \hideinitializer
+00560  */
+00561 #define uip_urgdatalen()    uip_urglen
+00562 
+00563 /**
+00564  * Close the current connection.
+00565  *
+00566  * This function will close the current connection in a nice way.
+00567  *
+00568  * \hideinitializer
+00569  */
+00570 #define uip_close()         (uip_flags = UIP_CLOSE)
+00571 
+00572 /**
+00573  * Abort the current connection.
+00574  *
+00575  * This function will abort (reset) the current connection, and is
+00576  * usually used when an error has occured that prevents using the
+00577  * uip_close() function.
+00578  *
+00579  * \hideinitializer
+00580  */
+00581 #define uip_abort()         (uip_flags = UIP_ABORT)
+00582 
+00583 /**
+00584  * Tell the sending host to stop sending data.
+00585  *
+00586  * This function will close our receiver's window so that we stop
+00587  * receiving data for the current connection.
+00588  *
+00589  * \hideinitializer
+00590  */
+00591 #define uip_stop()          (uip_conn->tcpstateflags |= UIP_STOPPED)
+00592 
+00593 /**
+00594  * Find out if the current connection has been previously stopped with
+00595  * uip_stop().
+00596  *
+00597  * \hideinitializer
+00598  */
+00599 #define uip_stopped(conn)   ((conn)->tcpstateflags & UIP_STOPPED)
+00600 
+00601 /**
+00602  * Restart the current connection, if is has previously been stopped
+00603  * with uip_stop().
+00604  *
+00605  * This function will open the receiver's window again so that we
+00606  * start receiving data for the current connection.
+00607  *
+00608  * \hideinitializer
+00609  */
+00610 #define uip_restart()         do { uip_flags |= UIP_NEWDATA; \
+00611                                    uip_conn->tcpstateflags &= ~UIP_STOPPED; \
+00612                               } while(0)
+00613 
+00614 
+00615 /* uIP tests that can be made to determine in what state the current
+00616    connection is, and what the application function should do. */
+00617 
+00618 /**
+00619  * Is the current connection a UDP connection?
+00620  *
+00621  * This function checks whether the current connection is a UDP connection.
+00622  *
+00623  * \hideinitializer
+00624  *
+00625  */
+00626 #define uip_udpconnection() (uip_conn == NULL)
+00627 
+00628 /**
+00629  * Is new incoming data available?
+00630  *
+00631  * Will reduce to non-zero if there is new data for the application
+00632  * present at the uip_appdata pointer. The size of the data is
+00633  * avaliable through the uip_len variable.
+00634  *
+00635  * \hideinitializer
+00636  */
+00637 #define uip_newdata()   (uip_flags & UIP_NEWDATA)
+00638 
+00639 /**
+00640  * Has previously sent data been acknowledged?
+00641  *
+00642  * Will reduce to non-zero if the previously sent data has been
+00643  * acknowledged by the remote host. This means that the application
+00644  * can send new data.
+00645  *
+00646  * \hideinitializer
+00647  */
+00648 #define uip_acked()   (uip_flags & UIP_ACKDATA)
+00649 
+00650 /**
+00651  * Has the connection just been connected?
+00652  *
+00653  * Reduces to non-zero if the current connection has been connected to
+00654  * a remote host. This will happen both if the connection has been
+00655  * actively opened (with uip_connect()) or passively opened (with
+00656  * uip_listen()).
+00657  *
+00658  * \hideinitializer
+00659  */
+00660 #define uip_connected() (uip_flags & UIP_CONNECTED)
+00661 
+00662 /**
+00663  * Has the connection been closed by the other end?
+00664  *
+00665  * Is non-zero if the connection has been closed by the remote
+00666  * host. The application may then do the necessary clean-ups.
+00667  *
+00668  * \hideinitializer
+00669  */
+00670 #define uip_closed()    (uip_flags & UIP_CLOSE)
+00671 
+00672 /**
+00673  * Has the connection been aborted by the other end?
+00674  *
+00675  * Non-zero if the current connection has been aborted (reset) by the
+00676  * remote host.
+00677  *
+00678  * \hideinitializer
+00679  */
+00680 #define uip_aborted()    (uip_flags & UIP_ABORT)
+00681 
+00682 /**
+00683  * Has the connection timed out?
+00684  *
+00685  * Non-zero if the current connection has been aborted due to too many
+00686  * retransmissions.
+00687  *
+00688  * \hideinitializer
+00689  */
+00690 #define uip_timedout()    (uip_flags & UIP_TIMEDOUT)
+00691 
+00692 /**
+00693  * Do we need to retransmit previously data?
+00694  *
+00695  * Reduces to non-zero if the previously sent data has been lost in
+00696  * the network, and the application should retransmit it. The
+00697  * application should send the exact same data as it did the last
+00698  * time, using the uip_send() function.
+00699  *
+00700  * \hideinitializer
+00701  */
+00702 #define uip_rexmit()     (uip_flags & UIP_REXMIT)
+00703 
+00704 /**
+00705  * Is the connection being polled by uIP?
+00706  *
+00707  * Is non-zero if the reason the application is invoked is that the
+00708  * current connection has been idle for a while and should be
+00709  * polled.
+00710  *
+00711  * The polling event can be used for sending data without having to
+00712  * wait for the remote host to send data.
+00713  *
+00714  * \hideinitializer
+00715  */
+00716 #define uip_poll()       (uip_flags & UIP_POLL)
+00717 
+00718 /**
+00719  * Get the initial maxium segment size (MSS) of the current
+00720  * connection.
+00721  *
+00722  * \hideinitializer
+00723  */
+00724 #define uip_initialmss()             (uip_conn->initialmss)
+00725 
+00726 /**
+00727  * Get the current maxium segment size that can be sent on the current
+00728  * connection.
+00729  *
+00730  * The current maxiumum segment size that can be sent on the
+00731  * connection is computed from the receiver's window and the MSS of
+00732  * the connection (which also is available by calling
+00733  * uip_initialmss()).
+00734  *
+00735  * \hideinitializer
+00736  */
+00737 #define uip_mss()             (uip_conn->mss)
+00738 
+00739 /**
+00740  * Set up a new UDP connection.
+00741  *
+00742  * This function sets up a new UDP connection. The function will
+00743  * automatically allocate an unused local port for the new
+00744  * connection. However, another port can be chosen by using the
+00745  * uip_udp_bind() call, after the uip_udp_new() function has been
+00746  * called.
+00747  *
+00748  * Example:
+00749  \code
+00750  uip_ipaddr_t addr;
+00751  struct uip_udp_conn *c;
+00752  
+00753  uip_ipaddr(&addr, 192,168,2,1);
+00754  c = uip_udp_new(&addr, HTONS(12345));
+00755  if(c != NULL) {
+00756    uip_udp_bind(c, HTONS(12344));
+00757  }
+00758  \endcode
+00759  * \param ripaddr The IP address of the remote host.
+00760  *
+00761  * \param rport The remote port number in network byte order.
+00762  *
+00763  * \return The uip_udp_conn structure for the new connection or NULL
+00764  * if no connection could be allocated.
+00765  */
+00766 struct uip_udp_conn *uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport);
+00767 
+00768 /**
+00769  * Removed a UDP connection.
+00770  *
+00771  * \param conn A pointer to the uip_udp_conn structure for the connection.
+00772  *
+00773  * \hideinitializer
+00774  */
+00775 #define uip_udp_remove(conn) (conn)->lport = 0
+00776 
+00777 /**
+00778  * Bind a UDP connection to a local port.
+00779  *
+00780  * \param conn A pointer to the uip_udp_conn structure for the
+00781  * connection.
+00782  *
+00783  * \param port The local port number, in network byte order.
+00784  *
+00785  * \hideinitializer
+00786  */
+00787 #define uip_udp_bind(conn, port) (conn)->lport = port
+00788 
+00789 /**
+00790  * Send a UDP datagram of length len on the current connection.
+00791  *
+00792  * This function can only be called in response to a UDP event (poll
+00793  * or newdata). The data must be present in the uip_buf buffer, at the
+00794  * place pointed to by the uip_appdata pointer.
+00795  *
+00796  * \param len The length of the data in the uip_buf buffer.
+00797  *
+00798  * \hideinitializer
+00799  */
+00800 #define uip_udp_send(len) uip_send((char *)uip_appdata, len)
+00801 
+00802 /** @} */
+00803 
+00804 /* uIP convenience and converting functions. */
+00805 
+00806 /**
+00807  * \defgroup uipconvfunc uIP conversion functions
+00808  * @{
+00809  *
+00810  * These functions can be used for converting between different data
+00811  * formats used by uIP.
+00812  */
+00813  
+00814 /**
+00815  * Construct an IP address from four bytes.
+00816  *
+00817  * This function constructs an IP address of the type that uIP handles
+00818  * internally from four bytes. The function is handy for specifying IP
+00819  * addresses to use with e.g. the uip_connect() function.
+00820  *
+00821  * Example:
+00822  \code
+00823  uip_ipaddr_t ipaddr;
+00824  struct uip_conn *c;
+00825  
+00826  uip_ipaddr(&ipaddr, 192,168,1,2);
+00827  c = uip_connect(&ipaddr, HTONS(80));
+00828  \endcode
+00829  *
+00830  * \param addr A pointer to a uip_ipaddr_t variable that will be
+00831  * filled in with the IP address.
+00832  *
+00833  * \param addr0 The first octet of the IP address.
+00834  * \param addr1 The second octet of the IP address.
+00835  * \param addr2 The third octet of the IP address.
+00836  * \param addr3 The forth octet of the IP address.
+00837  *
+00838  * \hideinitializer
+00839  */
+00840 #define uip_ipaddr(addr, addr0,addr1,addr2,addr3) do { \
+00841                      ((u16_t *)(addr))[0] = HTONS(((addr0) << 8) | (addr1)); \
+00842                      ((u16_t *)(addr))[1] = HTONS(((addr2) << 8) | (addr3)); \
+00843                   } while(0)
+00844 
+00845 /**
+00846  * Construct an IPv6 address from eight 16-bit words.
+00847  *
+00848  * This function constructs an IPv6 address.
+00849  *
+00850  * \hideinitializer
+00851  */
+00852 #define uip_ip6addr(addr, addr0,addr1,addr2,addr3,addr4,addr5,addr6,addr7) do { \
+00853                      ((u16_t *)(addr))[0] = HTONS((addr0)); \
+00854                      ((u16_t *)(addr))[1] = HTONS((addr1)); \
+00855                      ((u16_t *)(addr))[2] = HTONS((addr2)); \
+00856                      ((u16_t *)(addr))[3] = HTONS((addr3)); \
+00857                      ((u16_t *)(addr))[4] = HTONS((addr4)); \
+00858                      ((u16_t *)(addr))[5] = HTONS((addr5)); \
+00859                      ((u16_t *)(addr))[6] = HTONS((addr6)); \
+00860                      ((u16_t *)(addr))[7] = HTONS((addr7)); \
+00861                   } while(0)
+00862 
+00863 /**
+00864  * Copy an IP address to another IP address.
+00865  *
+00866  * Copies an IP address from one place to another.
+00867  *
+00868  * Example:
+00869  \code
+00870  uip_ipaddr_t ipaddr1, ipaddr2;
+00871 
+00872  uip_ipaddr(&ipaddr1, 192,16,1,2);
+00873  uip_ipaddr_copy(&ipaddr2, &ipaddr1);
+00874  \endcode
+00875  *
+00876  * \param dest The destination for the copy.
+00877  * \param src The source from where to copy.
+00878  *
+00879  * \hideinitializer
+00880  */
+00881 #if !UIP_CONF_IPV6
+00882 #define uip_ipaddr_copy(dest, src) do { \
+00883                      ((u16_t *)dest)[0] = ((u16_t *)src)[0]; \
+00884                      ((u16_t *)dest)[1] = ((u16_t *)src)[1]; \
+00885                   } while(0)
+00886 #else /* !UIP_CONF_IPV6 */
+00887 #define uip_ipaddr_copy(dest, src) memcpy(dest, src, sizeof(uip_ip6addr_t))
+00888 #endif /* !UIP_CONF_IPV6 */
+00889 
+00890 /**
+00891  * Compare two IP addresses
+00892  *
+00893  * Compares two IP addresses.
+00894  *
+00895  * Example:
+00896  \code
+00897  uip_ipaddr_t ipaddr1, ipaddr2;
+00898 
+00899  uip_ipaddr(&ipaddr1, 192,16,1,2);
+00900  if(uip_ipaddr_cmp(&ipaddr2, &ipaddr1)) {
+00901     printf("They are the same");
+00902  }
+00903  \endcode
+00904  *
+00905  * \param addr1 The first IP address.
+00906  * \param addr2 The second IP address.
+00907  *
+00908  * \hideinitializer
+00909  */
+00910 #if !UIP_CONF_IPV6
+00911 #define uip_ipaddr_cmp(addr1, addr2) (((u16_t *)addr1)[0] == ((u16_t *)addr2)[0] && \
+00912                                       ((u16_t *)addr1)[1] == ((u16_t *)addr2)[1])
+00913 #else /* !UIP_CONF_IPV6 */
+00914 #define uip_ipaddr_cmp(addr1, addr2) (memcmp(addr1, addr2, sizeof(uip_ip6addr_t)) == 0)
+00915 #endif /* !UIP_CONF_IPV6 */
+00916 
+00917 /**
+00918  * Compare two IP addresses with netmasks
+00919  *
+00920  * Compares two IP addresses with netmasks. The masks are used to mask
+00921  * out the bits that are to be compared.
+00922  *
+00923  * Example:
+00924  \code
+00925  uip_ipaddr_t ipaddr1, ipaddr2, mask;
+00926 
+00927  uip_ipaddr(&mask, 255,255,255,0);
+00928  uip_ipaddr(&ipaddr1, 192,16,1,2);
+00929  uip_ipaddr(&ipaddr2, 192,16,1,3);
+00930  if(uip_ipaddr_maskcmp(&ipaddr1, &ipaddr2, &mask)) {
+00931     printf("They are the same");
+00932  }
+00933  \endcode
+00934  *
+00935  * \param addr1 The first IP address.
+00936  * \param addr2 The second IP address.
+00937  * \param mask The netmask.
+00938  *
+00939  * \hideinitializer
+00940  */
+00941 #define uip_ipaddr_maskcmp(addr1, addr2, mask) \
+00942                           (((((u16_t *)addr1)[0] & ((u16_t *)mask)[0]) == \
+00943                             (((u16_t *)addr2)[0] & ((u16_t *)mask)[0])) && \
+00944                            ((((u16_t *)addr1)[1] & ((u16_t *)mask)[1]) == \
+00945                             (((u16_t *)addr2)[1] & ((u16_t *)mask)[1])))
+00946 
+00947 
+00948 /**
+00949  * Mask out the network part of an IP address.
+00950  *
+00951  * Masks out the network part of an IP address, given the address and
+00952  * the netmask.
+00953  *
+00954  * Example:
+00955  \code
+00956  uip_ipaddr_t ipaddr1, ipaddr2, netmask;
+00957 
+00958  uip_ipaddr(&ipaddr1, 192,16,1,2);
+00959  uip_ipaddr(&netmask, 255,255,255,0);
+00960  uip_ipaddr_mask(&ipaddr2, &ipaddr1, &netmask);
+00961  \endcode
+00962  *
+00963  * In the example above, the variable "ipaddr2" will contain the IP
+00964  * address 192.168.1.0.
+00965  *
+00966  * \param dest Where the result is to be placed.
+00967  * \param src The IP address.
+00968  * \param mask The netmask.
+00969  *
+00970  * \hideinitializer
+00971  */
+00972 #define uip_ipaddr_mask(dest, src, mask) do { \
+00973                      ((u16_t *)dest)[0] = ((u16_t *)src)[0] & ((u16_t *)mask)[0]; \
+00974                      ((u16_t *)dest)[1] = ((u16_t *)src)[1] & ((u16_t *)mask)[1]; \
+00975                   } while(0)
+00976 
+00977 /**
+00978  * Pick the first octet of an IP address.
+00979  *
+00980  * Picks out the first octet of an IP address.
+00981  *
+00982  * Example:
+00983  \code
+00984  uip_ipaddr_t ipaddr;
+00985  u8_t octet;
+00986 
+00987  uip_ipaddr(&ipaddr, 1,2,3,4);
+00988  octet = uip_ipaddr1(&ipaddr);
+00989  \endcode
+00990  *
+00991  * In the example above, the variable "octet" will contain the value 1.
+00992  *
+00993  * \hideinitializer
+00994  */
+00995 #define uip_ipaddr1(addr) (htons(((u16_t *)(addr))[0]) >> 8)
+00996 
+00997 /**
+00998  * Pick the second octet of an IP address.
+00999  *
+01000  * Picks out the second octet of an IP address.
+01001  *
+01002  * Example:
+01003  \code
+01004  uip_ipaddr_t ipaddr;
+01005  u8_t octet;
+01006 
+01007  uip_ipaddr(&ipaddr, 1,2,3,4);
+01008  octet = uip_ipaddr2(&ipaddr);
+01009  \endcode
+01010  *
+01011  * In the example above, the variable "octet" will contain the value 2.
+01012  *
+01013  * \hideinitializer
+01014  */
+01015 #define uip_ipaddr2(addr) (htons(((u16_t *)(addr))[0]) & 0xff)
+01016 
+01017 /**
+01018  * Pick the third octet of an IP address.
+01019  *
+01020  * Picks out the third octet of an IP address.
+01021  *
+01022  * Example:
+01023  \code
+01024  uip_ipaddr_t ipaddr;
+01025  u8_t octet;
+01026 
+01027  uip_ipaddr(&ipaddr, 1,2,3,4);
+01028  octet = uip_ipaddr3(&ipaddr);
+01029  \endcode
+01030  *
+01031  * In the example above, the variable "octet" will contain the value 3.
+01032  *
+01033  * \hideinitializer
+01034  */
+01035 #define uip_ipaddr3(addr) (htons(((u16_t *)(addr))[1]) >> 8)
+01036 
+01037 /**
+01038  * Pick the fourth octet of an IP address.
+01039  *
+01040  * Picks out the fourth octet of an IP address.
+01041  *
+01042  * Example:
+01043  \code
+01044  uip_ipaddr_t ipaddr;
+01045  u8_t octet;
+01046 
+01047  uip_ipaddr(&ipaddr, 1,2,3,4);
+01048  octet = uip_ipaddr4(&ipaddr);
+01049  \endcode
+01050  *
+01051  * In the example above, the variable "octet" will contain the value 4.
+01052  *
+01053  * \hideinitializer
+01054  */
+01055 #define uip_ipaddr4(addr) (htons(((u16_t *)(addr))[1]) & 0xff)
+01056 
+01057 /**
+01058  * Convert 16-bit quantity from host byte order to network byte order.
+01059  *
+01060  * This macro is primarily used for converting constants from host
+01061  * byte order to network byte order. For converting variables to
+01062  * network byte order, use the htons() function instead.
+01063  *
+01064  * \hideinitializer
+01065  */
+01066 #ifndef HTONS
+01067 #   if UIP_BYTE_ORDER == UIP_BIG_ENDIAN
+01068 #      define HTONS(n) (n)
+01069 #   else /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */
+01070 #      define HTONS(n) (u16_t)((((u16_t) (n)) << 8) | (((u16_t) (n)) >> 8))
+01071 #   endif /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */
+01072 #else
+01073 #error "HTONS already defined!"
+01074 #endif /* HTONS */
+01075 
+01076 /**
+01077  * Convert 16-bit quantity from host byte order to network byte order.
+01078  *
+01079  * This function is primarily used for converting variables from host
+01080  * byte order to network byte order. For converting constants to
+01081  * network byte order, use the HTONS() macro instead.
+01082  */
+01083 #ifndef htons
+01084 u16_t htons(u16_t val);
+01085 #endif /* htons */
+01086 #ifndef ntohs
+01087 #define ntohs htons
+01088 #endif
+01089 
+01090 /** @} */
+01091 
+01092 /**
+01093  * Pointer to the application data in the packet buffer.
+01094  *
+01095  * This pointer points to the application data when the application is
+01096  * called. If the application wishes to send data, the application may
+01097  * use this space to write the data into before calling uip_send().
+01098  */
+01099 extern void *uip_appdata;
+01100 
+01101 #if UIP_URGDATA > 0
+01102 /* u8_t *uip_urgdata:
+01103  *
+01104  * This pointer points to any urgent data that has been received. Only
+01105  * present if compiled with support for urgent data (UIP_URGDATA).
+01106  */
+01107 extern void *uip_urgdata;
+01108 #endif /* UIP_URGDATA > 0 */
+01109 
+01110 
+01111 /**
+01112  * \defgroup uipdrivervars Variables used in uIP device drivers
+01113  * @{
+01114  *
+01115  * uIP has a few global variables that are used in device drivers for
+01116  * uIP.
+01117  */
+01118 
+01119 /**
+01120  * The length of the packet in the uip_buf buffer.
+01121  *
+01122  * The global variable uip_len holds the length of the packet in the
+01123  * uip_buf buffer.
+01124  *
+01125  * When the network device driver calls the uIP input function,
+01126  * uip_len should be set to the length of the packet in the uip_buf
+01127  * buffer.
+01128  *
+01129  * When sending packets, the device driver should use the contents of
+01130  * the uip_len variable to determine the length of the outgoing
+01131  * packet.
+01132  *
+01133  */
+01134 extern u16_t uip_len;
+01135 
+01136 /** @} */
+01137 
+01138 #if UIP_URGDATA > 0
+01139 extern u16_t uip_urglen, uip_surglen;
+01140 #endif /* UIP_URGDATA > 0 */
+01141 
+01142 
+01143 /**
+01144  * Representation of a uIP TCP connection.
+01145  *
+01146  * The uip_conn structure is used for identifying a connection. All
+01147  * but one field in the structure are to be considered read-only by an
+01148  * application. The only exception is the appstate field whos purpose
+01149  * is to let the application store application-specific state (e.g.,
+01150  * file pointers) for the connection. The type of this field is
+01151  * configured in the "uipopt.h" header file.
+01152  */
+01153 struct uip_conn {
+01154   uip_ipaddr_t ripaddr;   /**< The IP address of the remote host. */
+01155   
+01156   u16_t lport;        /**< The local TCP port, in network byte order. */
+01157   u16_t rport;        /**< The local remote TCP port, in network byte
+01158                          order. */
+01159   
+01160   u8_t rcv_nxt[4];    /**< The sequence number that we expect to
+01161                          receive next. */
+01162   u8_t snd_nxt[4];    /**< The sequence number that was last sent by
+01163                          us. */
+01164   u16_t len;          /**< Length of the data that was previously sent. */
+01165   u16_t mss;          /**< Current maximum segment size for the
+01166                          connection. */
+01167   u16_t initialmss;   /**< Initial maximum segment size for the
+01168                          connection. */
+01169   u8_t sa;            /**< Retransmission time-out calculation state
+01170                          variable. */
+01171   u8_t sv;            /**< Retransmission time-out calculation state
+01172                          variable. */
+01173   u8_t rto;           /**< Retransmission time-out. */
+01174   u8_t tcpstateflags; /**< TCP state and flags. */
+01175   u8_t timer;         /**< The retransmission timer. */
+01176   u8_t nrtx;          /**< The number of retransmissions for the last
+01177                          segment sent. */
+01178 
+01179   /** The application state. */
+01180   uip_tcp_appstate_t appstate;
+01181 };
+01182 
+01183 
+01184 /**
+01185  * Pointer to the current TCP connection.
+01186  *
+01187  * The uip_conn pointer can be used to access the current TCP
+01188  * connection.
+01189  */
+01190 extern struct uip_conn *uip_conn;
+01191 /* The array containing all uIP connections. */
+01192 extern struct uip_conn uip_conns[UIP_CONNS];
+01193 /**
+01194  * \addtogroup uiparch
+01195  * @{
+01196  */
+01197 
+01198 /**
+01199  * 4-byte array used for the 32-bit sequence number calculations.
+01200  */
+01201 extern u8_t uip_acc32[4];
+01202 
+01203 /** @} */
+01204 
+01205 
+01206 #if UIP_UDP
+01207 /**
+01208  * Representation of a uIP UDP connection.
+01209  */
+01210 struct uip_udp_conn {
+01211   uip_ipaddr_t ripaddr;   /**< The IP address of the remote peer. */
+01212   u16_t lport;        /**< The local port number in network byte order. */
+01213   u16_t rport;        /**< The remote port number in network byte order. */
+01214   u8_t  ttl;          /**< Default time-to-live. */
+01215 
+01216   /** The application state. */
+01217   uip_udp_appstate_t appstate;
+01218 };
+01219 
+01220 /**
+01221  * The current UDP connection.
+01222  */
+01223 extern struct uip_udp_conn *uip_udp_conn;
+01224 extern struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS];
+01225 #endif /* UIP_UDP */
+01226 
+01227 /**
+01228  * The structure holding the TCP/IP statistics that are gathered if
+01229  * UIP_STATISTICS is set to 1.
+01230  *
+01231  */
+01232 struct uip_stats {
+01233   struct {
+01234     uip_stats_t drop;     /**< Number of dropped packets at the IP
+01235                              layer. */
+01236     uip_stats_t recv;     /**< Number of received packets at the IP
+01237                              layer. */
+01238     uip_stats_t sent;     /**< Number of sent packets at the IP
+01239                              layer. */
+01240     uip_stats_t vhlerr;   /**< Number of packets dropped due to wrong
+01241                              IP version or header length. */
+01242     uip_stats_t hblenerr; /**< Number of packets dropped due to wrong
+01243                              IP length, high byte. */
+01244     uip_stats_t lblenerr; /**< Number of packets dropped due to wrong
+01245                              IP length, low byte. */
+01246     uip_stats_t fragerr;  /**< Number of packets dropped since they
+01247                              were IP fragments. */
+01248     uip_stats_t chkerr;   /**< Number of packets dropped due to IP
+01249                              checksum errors. */
+01250     uip_stats_t protoerr; /**< Number of packets dropped since they
+01251                              were neither ICMP, UDP nor TCP. */
+01252   } ip;                   /**< IP statistics. */
+01253   struct {
+01254     uip_stats_t drop;     /**< Number of dropped ICMP packets. */
+01255     uip_stats_t recv;     /**< Number of received ICMP packets. */
+01256     uip_stats_t sent;     /**< Number of sent ICMP packets. */
+01257     uip_stats_t typeerr;  /**< Number of ICMP packets with a wrong
+01258                              type. */
+01259   } icmp;                 /**< ICMP statistics. */
+01260   struct {
+01261     uip_stats_t drop;     /**< Number of dropped TCP segments. */
+01262     uip_stats_t recv;     /**< Number of recived TCP segments. */
+01263     uip_stats_t sent;     /**< Number of sent TCP segments. */
+01264     uip_stats_t chkerr;   /**< Number of TCP segments with a bad
+01265                              checksum. */
+01266     uip_stats_t ackerr;   /**< Number of TCP segments with a bad ACK
+01267                              number. */
+01268     uip_stats_t rst;      /**< Number of recevied TCP RST (reset) segments. */
+01269     uip_stats_t rexmit;   /**< Number of retransmitted TCP segments. */
+01270     uip_stats_t syndrop;  /**< Number of dropped SYNs due to too few
+01271                              connections was avaliable. */
+01272     uip_stats_t synrst;   /**< Number of SYNs for closed ports,
+01273                              triggering a RST. */
+01274   } tcp;                  /**< TCP statistics. */
+01275 #if UIP_UDP
+01276   struct {
+01277     uip_stats_t drop;     /**< Number of dropped UDP segments. */
+01278     uip_stats_t recv;     /**< Number of recived UDP segments. */
+01279     uip_stats_t sent;     /**< Number of sent UDP segments. */
+01280     uip_stats_t chkerr;   /**< Number of UDP segments with a bad
+01281                              checksum. */
+01282   } udp;                  /**< UDP statistics. */
+01283 #endif /* UIP_UDP */
+01284 };
+01285 
+01286 /**
+01287  * The uIP TCP/IP statistics.
+01288  *
+01289  * This is the variable in which the uIP TCP/IP statistics are gathered.
+01290  */
+01291 extern struct uip_stats uip_stat;
+01292 
+01293 
+01294 /*---------------------------------------------------------------------------*/
+01295 /* All the stuff below this point is internal to uIP and should not be
+01296  * used directly by an application or by a device driver.
+01297  */
+01298 /*---------------------------------------------------------------------------*/
+01299 /* u8_t uip_flags:
+01300  *
+01301  * When the application is called, uip_flags will contain the flags
+01302  * that are defined in this file. Please read below for more
+01303  * infomation.
+01304  */
+01305 extern u8_t uip_flags;
+01306 
+01307 /* The following flags may be set in the global variable uip_flags
+01308    before calling the application callback. The UIP_ACKDATA,
+01309    UIP_NEWDATA, and UIP_CLOSE flags may both be set at the same time,
+01310    whereas the others are mutualy exclusive. Note that these flags
+01311    should *NOT* be accessed directly, but only through the uIP
+01312    functions/macros. */
+01313 
+01314 #define UIP_ACKDATA   1     /* Signifies that the outstanding data was
+01315                                acked and the application should send
+01316                                out new data instead of retransmitting
+01317                                the last data. */
+01318 #define UIP_NEWDATA   2     /* Flags the fact that the peer has sent
+01319                                us new data. */
+01320 #define UIP_REXMIT    4     /* Tells the application to retransmit the
+01321                                data that was last sent. */
+01322 #define UIP_POLL      8     /* Used for polling the application, to
+01323                                check if the application has data that
+01324                                it wants to send. */
+01325 #define UIP_CLOSE     16    /* The remote host has closed the
+01326                                connection, thus the connection has
+01327                                gone away. Or the application signals
+01328                                that it wants to close the
+01329                                connection. */
+01330 #define UIP_ABORT     32    /* The remote host has aborted the
+01331                                connection, thus the connection has
+01332                                gone away. Or the application signals
+01333                                that it wants to abort the
+01334                                connection. */
+01335 #define UIP_CONNECTED 64    /* We have got a connection from a remote
+01336                                host and have set up a new connection
+01337                                for it, or an active connection has
+01338                                been successfully established. */
+01339 
+01340 #define UIP_TIMEDOUT  128   /* The connection has been aborted due to
+01341                                too many retransmissions. */
+01342 
+01343 /* uip_process(flag):
+01344  *
+01345  * The actual uIP function which does all the work.
+01346  */
+01347 void uip_process(u8_t flag);
+01348 
+01349 /* The following flags are passed as an argument to the uip_process()
+01350    function. They are used to distinguish between the two cases where
+01351    uip_process() is called. It can be called either because we have
+01352    incoming data that should be processed, or because the periodic
+01353    timer has fired. These values are never used directly, but only in
+01354    the macrose defined in this file. */
+01355  
+01356 #define UIP_DATA          1     /* Tells uIP that there is incoming
+01357                                    data in the uip_buf buffer. The
+01358                                    length of the data is stored in the
+01359                                    global variable uip_len. */
+01360 #define UIP_TIMER         2     /* Tells uIP that the periodic timer
+01361                                    has fired. */
+01362 #define UIP_POLL_REQUEST  3     /* Tells uIP that a connection should
+01363                                    be polled. */
+01364 #define UIP_UDP_SEND_CONN 4     /* Tells uIP that a UDP datagram
+01365                                    should be constructed in the
+01366                                    uip_buf buffer. */
+01367 #if UIP_UDP
+01368 #define UIP_UDP_TIMER     5
+01369 #endif /* UIP_UDP */
+01370 
+01371 /* The TCP states used in the uip_conn->tcpstateflags. */
+01372 #define UIP_CLOSED      0
+01373 #define UIP_SYN_RCVD    1
+01374 #define UIP_SYN_SENT    2
+01375 #define UIP_ESTABLISHED 3
+01376 #define UIP_FIN_WAIT_1  4
+01377 #define UIP_FIN_WAIT_2  5
+01378 #define UIP_CLOSING     6
+01379 #define UIP_TIME_WAIT   7
+01380 #define UIP_LAST_ACK    8
+01381 #define UIP_TS_MASK     15
+01382   
+01383 #define UIP_STOPPED      16
+01384 
+01385 /* The TCP and IP headers. */
+01386 struct uip_tcpip_hdr {
+01387 #if UIP_CONF_IPV6
+01388   /* IPv6 header. */
+01389   u8_t vtc,
+01390     tcflow;
+01391   u16_t flow;
+01392   u8_t len[2];
+01393   u8_t proto, ttl;
+01394   uip_ip6addr_t srcipaddr, destipaddr;
+01395 #else /* UIP_CONF_IPV6 */
+01396   /* IPv4 header. */
+01397   u8_t vhl,
+01398     tos,
+01399     len[2],
+01400     ipid[2],
+01401     ipoffset[2],
+01402     ttl,
+01403     proto;
+01404   u16_t ipchksum;
+01405   u16_t srcipaddr[2],
+01406     destipaddr[2];
+01407 #endif /* UIP_CONF_IPV6 */
+01408   
+01409   /* TCP header. */
+01410   u16_t srcport,
+01411     destport;
+01412   u8_t seqno[4],
+01413     ackno[4],
+01414     tcpoffset,
+01415     flags,
+01416     wnd[2];
+01417   u16_t tcpchksum;
+01418   u8_t urgp[2];
+01419   u8_t optdata[4];
+01420 };
+01421 
+01422 /* The ICMP and IP headers. */
+01423 struct uip_icmpip_hdr {
+01424 #if UIP_CONF_IPV6
+01425   /* IPv6 header. */
+01426   u8_t vtc,
+01427     tcf;
+01428   u16_t flow;
+01429   u8_t len[2];
+01430   u8_t proto, ttl;
+01431   uip_ip6addr_t srcipaddr, destipaddr;
+01432 #else /* UIP_CONF_IPV6 */
+01433   /* IPv4 header. */
+01434   u8_t vhl,
+01435     tos,
+01436     len[2],
+01437     ipid[2],
+01438     ipoffset[2],
+01439     ttl,
+01440     proto;
+01441   u16_t ipchksum;
+01442   u16_t srcipaddr[2],
+01443     destipaddr[2];
+01444 #endif /* UIP_CONF_IPV6 */
+01445   
+01446   /* ICMP (echo) header. */
+01447   u8_t type, icode;
+01448   u16_t icmpchksum;
+01449 #if !UIP_CONF_IPV6
+01450   u16_t id, seqno;
+01451 #else /* !UIP_CONF_IPV6 */
+01452   u8_t flags, reserved1, reserved2, reserved3;
+01453   u8_t icmp6data[16];
+01454   u8_t options[1];
+01455 #endif /* !UIP_CONF_IPV6 */
+01456 };
+01457 
+01458 
+01459 /* The UDP and IP headers. */
+01460 struct uip_udpip_hdr {
+01461 #if UIP_CONF_IPV6
+01462   /* IPv6 header. */
+01463   u8_t vtc,
+01464     tcf;
+01465   u16_t flow;
+01466   u8_t len[2];
+01467   u8_t proto, ttl;
+01468   uip_ip6addr_t srcipaddr, destipaddr;
+01469 #else /* UIP_CONF_IPV6 */
+01470   /* IP header. */
+01471   u8_t vhl,
+01472     tos,
+01473     len[2],
+01474     ipid[2],
+01475     ipoffset[2],
+01476     ttl,
+01477     proto;
+01478   u16_t ipchksum;
+01479   u16_t srcipaddr[2],
+01480     destipaddr[2];
+01481 #endif /* UIP_CONF_IPV6 */
+01482   
+01483   /* UDP header. */
+01484   u16_t srcport,
+01485     destport;
+01486   u16_t udplen;
+01487   u16_t udpchksum;
+01488 };
+01489 
+01490 
+01491 
+01492 /**
+01493  * The buffer size available for user data in the \ref uip_buf buffer.
+01494  *
+01495  * This macro holds the available size for user data in the \ref
+01496  * uip_buf buffer. The macro is intended to be used for checking
+01497  * bounds of available user data.
+01498  *
+01499  * Example:
+01500  \code
+01501  snprintf(uip_appdata, UIP_APPDATA_SIZE, "%u\n", i);
+01502  \endcode
+01503  *
+01504  * \hideinitializer
+01505  */
+01506 #define UIP_APPDATA_SIZE (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN)
+01507 
+01508 
+01509 #define UIP_PROTO_ICMP  1
+01510 #define UIP_PROTO_TCP   6
+01511 #define UIP_PROTO_UDP   17
+01512 #define UIP_PROTO_ICMP6 58
+01513 
+01514 /* Header sizes. */
+01515 #if UIP_CONF_IPV6
+01516 #define UIP_IPH_LEN    40
+01517 #else /* UIP_CONF_IPV6 */
+01518 #define UIP_IPH_LEN    20    /* Size of IP header */
+01519 #endif /* UIP_CONF_IPV6 */
+01520 #define UIP_UDPH_LEN    8    /* Size of UDP header */
+01521 #define UIP_TCPH_LEN   20    /* Size of TCP header */
+01522 #define UIP_IPUDPH_LEN (UIP_UDPH_LEN + UIP_IPH_LEN)    /* Size of IP +
+01523                                                           UDP
+01524                                                           header */
+01525 #define UIP_IPTCPH_LEN (UIP_TCPH_LEN + UIP_IPH_LEN)    /* Size of IP +
+01526                                                           TCP
+01527                                                           header */
+01528 #define UIP_TCPIP_HLEN UIP_IPTCPH_LEN
+01529 
+01530 
+01531 #if UIP_FIXEDADDR
+01532 extern const uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr;
+01533 #else /* UIP_FIXEDADDR */
+01534 extern uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr;
+01535 #endif /* UIP_FIXEDADDR */
+01536 
+01537 
+01538 
+01539 /**
+01540  * Representation of a 48-bit Ethernet address.
+01541  */
+01542 struct uip_eth_addr {
+01543   u8_t addr[6];
+01544 };
+01545 
+01546 /**
+01547  * Calculate the Internet checksum over a buffer.
+01548  *
+01549  * The Internet checksum is the one's complement of the one's
+01550  * complement sum of all 16-bit words in the buffer.
+01551  *
+01552  * See RFC1071.
+01553  *
+01554  * \param buf A pointer to the buffer over which the checksum is to be
+01555  * computed.
+01556  *
+01557  * \param len The length of the buffer over which the checksum is to
+01558  * be computed.
+01559  *
+01560  * \return The Internet checksum of the buffer.
+01561  */
+01562 u16_t uip_chksum(u16_t *buf, u16_t len);
+01563 
+01564 /**
+01565  * Calculate the IP header checksum of the packet header in uip_buf.
+01566  *
+01567  * The IP header checksum is the Internet checksum of the 20 bytes of
+01568  * the IP header.
+01569  *
+01570  * \return The IP header checksum of the IP header in the uip_buf
+01571  * buffer.
+01572  */
+01573 u16_t uip_ipchksum(void);
+01574 
+01575 /**
+01576  * Calculate the TCP checksum of the packet in uip_buf and uip_appdata.
+01577  *
+01578  * The TCP checksum is the Internet checksum of data contents of the
+01579  * TCP segment, and a pseudo-header as defined in RFC793.
+01580  *
+01581  * \return The TCP checksum of the TCP segment in uip_buf and pointed
+01582  * to by uip_appdata.
+01583  */
+01584 u16_t uip_tcpchksum(void);
+01585 
+01586 /**
+01587  * Calculate the UDP checksum of the packet in uip_buf and uip_appdata.
+01588  *
+01589  * The UDP checksum is the Internet checksum of data contents of the
+01590  * UDP segment, and a pseudo-header as defined in RFC768.
+01591  *
+01592  * \return The UDP checksum of the UDP segment in uip_buf and pointed
+01593  * to by uip_appdata.
+01594  */
+01595 u16_t uip_udpchksum(void);
+01596 
+01597 
+01598 #endif /* __UIP_H__ */
+01599 
+01600 
+01601 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00203.html b/third_party/uip-1.0/doc/html/a00203.html new file mode 100644 index 0000000..5a50644 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00203.html @@ -0,0 +1,163 @@ + + +uIP 1.0: uip/uip_arch.h Source File + + + + + + +

uip/uip_arch.h

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup uip
+00003  * {@
+00004  */
+00005 
+00006 /**
+00007  * \defgroup uiparch Architecture specific uIP functions
+00008  * @{
+00009  *
+00010  * The functions in the architecture specific module implement the IP
+00011  * check sum and 32-bit additions.
+00012  *
+00013  * The IP checksum calculation is the most computationally expensive
+00014  * operation in the TCP/IP stack and it therefore pays off to
+00015  * implement this in efficient assembler. The purpose of the uip-arch
+00016  * module is to let the checksum functions to be implemented in
+00017  * architecture specific assembler.
+00018  *
+00019  */
+00020 
+00021 /**
+00022  * \file
+00023  * Declarations of architecture specific functions.
+00024  * \author Adam Dunkels <adam@dunkels.com>
+00025  */
+00026 
+00027 /*
+00028  * Copyright (c) 2001, Adam Dunkels.
+00029  * All rights reserved.
+00030  *
+00031  * Redistribution and use in source and binary forms, with or without
+00032  * modification, are permitted provided that the following conditions
+00033  * are met:
+00034  * 1. Redistributions of source code must retain the above copyright
+00035  *    notice, this list of conditions and the following disclaimer.
+00036  * 2. Redistributions in binary form must reproduce the above copyright
+00037  *    notice, this list of conditions and the following disclaimer in the
+00038  *    documentation and/or other materials provided with the distribution.
+00039  * 3. The name of the author may not be used to endorse or promote
+00040  *    products derived from this software without specific prior
+00041  *    written permission.
+00042  *
+00043  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00044  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00045  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00046  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00047  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00048  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00049  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00050  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00051  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00052  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00053  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00054  *
+00055  * This file is part of the uIP TCP/IP stack.
+00056  *
+00057  * $Id: uip_arch.h,v 1.2 2006/06/07 09:15:19 adam Exp $
+00058  *
+00059  */
+00060 
+00061 #ifndef __UIP_ARCH_H__
+00062 #define __UIP_ARCH_H__
+00063 
+00064 #include "uip.h"
+00065 
+00066 /**
+00067  * Carry out a 32-bit addition.
+00068  *
+00069  * Because not all architectures for which uIP is intended has native
+00070  * 32-bit arithmetic, uIP uses an external C function for doing the
+00071  * required 32-bit additions in the TCP protocol processing. This
+00072  * function should add the two arguments and place the result in the
+00073  * global variable uip_acc32.
+00074  *
+00075  * \note The 32-bit integer pointed to by the op32 parameter and the
+00076  * result in the uip_acc32 variable are in network byte order (big
+00077  * endian).
+00078  *
+00079  * \param op32 A pointer to a 4-byte array representing a 32-bit
+00080  * integer in network byte order (big endian).
+00081  *
+00082  * \param op16 A 16-bit integer in host byte order.
+00083  */
+00084 void uip_add32(u8_t *op32, u16_t op16);
+00085 
+00086 /**
+00087  * Calculate the Internet checksum over a buffer.
+00088  *
+00089  * The Internet checksum is the one's complement of the one's
+00090  * complement sum of all 16-bit words in the buffer.
+00091  *
+00092  * See RFC1071.
+00093  *
+00094  * \note This function is not called in the current version of uIP,
+00095  * but future versions might make use of it.
+00096  *
+00097  * \param buf A pointer to the buffer over which the checksum is to be
+00098  * computed.
+00099  *
+00100  * \param len The length of the buffer over which the checksum is to
+00101  * be computed.
+00102  *
+00103  * \return The Internet checksum of the buffer.
+00104  */
+00105 u16_t uip_chksum(u16_t *buf, u16_t len);
+00106 
+00107 /**
+00108  * Calculate the IP header checksum of the packet header in uip_buf.
+00109  *
+00110  * The IP header checksum is the Internet checksum of the 20 bytes of
+00111  * the IP header.
+00112  *
+00113  * \return The IP header checksum of the IP header in the uip_buf
+00114  * buffer.
+00115  */
+00116 u16_t uip_ipchksum(void);
+00117 
+00118 /**
+00119  * Calculate the TCP checksum of the packet in uip_buf and uip_appdata.
+00120  *
+00121  * The TCP checksum is the Internet checksum of data contents of the
+00122  * TCP segment, and a pseudo-header as defined in RFC793.
+00123  *
+00124  * \note The uip_appdata pointer that points to the packet data may
+00125  * point anywhere in memory, so it is not possible to simply calculate
+00126  * the Internet checksum of the contents of the uip_buf buffer.
+00127  *
+00128  * \return The TCP checksum of the TCP segment in uip_buf and pointed
+00129  * to by uip_appdata.
+00130  */
+00131 u16_t uip_tcpchksum(void);
+00132 
+00133 u16_t uip_udpchksum(void);
+00134 
+00135 /** @} */
+00136 /** @} */
+00137 
+00138 #endif /* __UIP_ARCH_H__ */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00204.html b/third_party/uip-1.0/doc/html/a00204.html new file mode 100644 index 0000000..3b8a0ae --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00204.html @@ -0,0 +1,448 @@ + + +uIP 1.0: uip/uip_arp.c Source File + + + + + + +

uip/uip_arp.c

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup uip
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \defgroup uiparp uIP Address Resolution Protocol
+00008  * @{
+00009  *
+00010  * The Address Resolution Protocol ARP is used for mapping between IP
+00011  * addresses and link level addresses such as the Ethernet MAC
+00012  * addresses. ARP uses broadcast queries to ask for the link level
+00013  * address of a known IP address and the host which is configured with
+00014  * the IP address for which the query was meant, will respond with its
+00015  * link level address.
+00016  *
+00017  * \note This ARP implementation only supports Ethernet.
+00018  */
+00019  
+00020 /**
+00021  * \file
+00022  * Implementation of the ARP Address Resolution Protocol.
+00023  * \author Adam Dunkels <adam@dunkels.com>
+00024  *
+00025  */
+00026 
+00027 /*
+00028  * Copyright (c) 2001-2003, Adam Dunkels.
+00029  * All rights reserved.
+00030  *
+00031  * Redistribution and use in source and binary forms, with or without
+00032  * modification, are permitted provided that the following conditions
+00033  * are met:
+00034  * 1. Redistributions of source code must retain the above copyright
+00035  *    notice, this list of conditions and the following disclaimer.
+00036  * 2. Redistributions in binary form must reproduce the above copyright
+00037  *    notice, this list of conditions and the following disclaimer in the
+00038  *    documentation and/or other materials provided with the distribution.
+00039  * 3. The name of the author may not be used to endorse or promote
+00040  *    products derived from this software without specific prior
+00041  *    written permission.
+00042  *
+00043  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00044  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00045  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00046  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00047  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00048  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00049  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00050  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00051  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00052  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00053  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00054  *
+00055  * This file is part of the uIP TCP/IP stack.
+00056  *
+00057  * $Id: uip_arp.c,v 1.8 2006/06/02 23:36:21 adam Exp $
+00058  *
+00059  */
+00060 
+00061 
+00062 #include "uip_arp.h"
+00063 
+00064 #include <string.h>
+00065 
+00066 struct arp_hdr {
+00067   struct uip_eth_hdr ethhdr;
+00068   u16_t hwtype;
+00069   u16_t protocol;
+00070   u8_t hwlen;
+00071   u8_t protolen;
+00072   u16_t opcode;
+00073   struct uip_eth_addr shwaddr;
+00074   u16_t sipaddr[2];
+00075   struct uip_eth_addr dhwaddr;
+00076   u16_t dipaddr[2];
+00077 };
+00078 
+00079 struct ethip_hdr {
+00080   struct uip_eth_hdr ethhdr;
+00081   /* IP header. */
+00082   u8_t vhl,
+00083     tos,
+00084     len[2],
+00085     ipid[2],
+00086     ipoffset[2],
+00087     ttl,
+00088     proto;
+00089   u16_t ipchksum;
+00090   u16_t srcipaddr[2],
+00091     destipaddr[2];
+00092 };
+00093 
+00094 #define ARP_REQUEST 1
+00095 #define ARP_REPLY   2
+00096 
+00097 #define ARP_HWTYPE_ETH 1
+00098 
+00099 struct arp_entry {
+00100   u16_t ipaddr[2];
+00101   struct uip_eth_addr ethaddr;
+00102   u8_t time;
+00103 };
+00104 
+00105 static const struct uip_eth_addr broadcast_ethaddr =
+00106   {{0xff,0xff,0xff,0xff,0xff,0xff}};
+00107 static const u16_t broadcast_ipaddr[2] = {0xffff,0xffff};
+00108 
+00109 static struct arp_entry arp_table[UIP_ARPTAB_SIZE];
+00110 static u16_t ipaddr[2];
+00111 static u8_t i, c;
+00112 
+00113 static u8_t arptime;
+00114 static u8_t tmpage;
+00115 
+00116 #define BUF   ((struct arp_hdr *)&uip_buf[0])
+00117 #define IPBUF ((struct ethip_hdr *)&uip_buf[0])
+00118 /*-----------------------------------------------------------------------------------*/
+00119 /**
+00120  * Initialize the ARP module.
+00121  *
+00122  */
+00123 /*-----------------------------------------------------------------------------------*/
+00124 void
+00125 uip_arp_init(void)
+00126 {
+00127   for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
+00128     memset(arp_table[i].ipaddr, 0, 4);
+00129   }
+00130 }
+00131 /*-----------------------------------------------------------------------------------*/
+00132 /**
+00133  * Periodic ARP processing function.
+00134  *
+00135  * This function performs periodic timer processing in the ARP module
+00136  * and should be called at regular intervals. The recommended interval
+00137  * is 10 seconds between the calls.
+00138  *
+00139  */
+00140 /*-----------------------------------------------------------------------------------*/
+00141 void
+00142 uip_arp_timer(void)
+00143 {
+00144   struct arp_entry *tabptr;
+00145   
+00146   ++arptime;
+00147   for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
+00148     tabptr = &arp_table[i];
+00149     if((tabptr->ipaddr[0] | tabptr->ipaddr[1]) != 0 &&
+00150        arptime - tabptr->time >= UIP_ARP_MAXAGE) {
+00151       memset(tabptr->ipaddr, 0, 4);
+00152     }
+00153   }
+00154 
+00155 }
+00156 /*-----------------------------------------------------------------------------------*/
+00157 static void
+00158 uip_arp_update(u16_t *ipaddr, struct uip_eth_addr *ethaddr)
+00159 {
+00160   register struct arp_entry *tabptr;
+00161   /* Walk through the ARP mapping table and try to find an entry to
+00162      update. If none is found, the IP -> MAC address mapping is
+00163      inserted in the ARP table. */
+00164   for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
+00165 
+00166     tabptr = &arp_table[i];
+00167     /* Only check those entries that are actually in use. */
+00168     if(tabptr->ipaddr[0] != 0 &&
+00169        tabptr->ipaddr[1] != 0) {
+00170 
+00171       /* Check if the source IP address of the incoming packet matches
+00172          the IP address in this ARP table entry. */
+00173       if(ipaddr[0] == tabptr->ipaddr[0] &&
+00174          ipaddr[1] == tabptr->ipaddr[1]) {
+00175          
+00176         /* An old entry found, update this and return. */
+00177         memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);
+00178         tabptr->time = arptime;
+00179 
+00180         return;
+00181       }
+00182     }
+00183   }
+00184 
+00185   /* If we get here, no existing ARP table entry was found, so we
+00186      create one. */
+00187 
+00188   /* First, we try to find an unused entry in the ARP table. */
+00189   for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
+00190     tabptr = &arp_table[i];
+00191     if(tabptr->ipaddr[0] == 0 &&
+00192        tabptr->ipaddr[1] == 0) {
+00193       break;
+00194     }
+00195   }
+00196 
+00197   /* If no unused entry is found, we try to find the oldest entry and
+00198      throw it away. */
+00199   if(i == UIP_ARPTAB_SIZE) {
+00200     tmpage = 0;
+00201     c = 0;
+00202     for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
+00203       tabptr = &arp_table[i];
+00204       if(arptime - tabptr->time > tmpage) {
+00205         tmpage = arptime - tabptr->time;
+00206         c = i;
+00207       }
+00208     }
+00209     i = c;
+00210     tabptr = &arp_table[i];
+00211   }
+00212 
+00213   /* Now, i is the ARP table entry which we will fill with the new
+00214      information. */
+00215   memcpy(tabptr->ipaddr, ipaddr, 4);
+00216   memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6);
+00217   tabptr->time = arptime;
+00218 }
+00219 /*-----------------------------------------------------------------------------------*/
+00220 /**
+00221  * ARP processing for incoming IP packets
+00222  *
+00223  * This function should be called by the device driver when an IP
+00224  * packet has been received. The function will check if the address is
+00225  * in the ARP cache, and if so the ARP cache entry will be
+00226  * refreshed. If no ARP cache entry was found, a new one is created.
+00227  *
+00228  * This function expects an IP packet with a prepended Ethernet header
+00229  * in the uip_buf[] buffer, and the length of the packet in the global
+00230  * variable uip_len.
+00231  */
+00232 /*-----------------------------------------------------------------------------------*/
+00233 #if 0
+00234 void
+00235 uip_arp_ipin(void)
+00236 {
+00237   uip_len -= sizeof(struct uip_eth_hdr);
+00238         
+00239   /* Only insert/update an entry if the source IP address of the
+00240      incoming IP packet comes from a host on the local network. */
+00241   if((IPBUF->srcipaddr[0] & uip_netmask[0]) !=
+00242      (uip_hostaddr[0] & uip_netmask[0])) {
+00243     return;
+00244   }
+00245   if((IPBUF->srcipaddr[1] & uip_netmask[1]) !=
+00246      (uip_hostaddr[1] & uip_netmask[1])) {
+00247     return;
+00248   }
+00249   uip_arp_update(IPBUF->srcipaddr, &(IPBUF->ethhdr.src));
+00250   
+00251   return;
+00252 }
+00253 #endif /* 0 */
+00254 /*-----------------------------------------------------------------------------------*/
+00255 /**
+00256  * ARP processing for incoming ARP packets.
+00257  *
+00258  * This function should be called by the device driver when an ARP
+00259  * packet has been received. The function will act differently
+00260  * depending on the ARP packet type: if it is a reply for a request
+00261  * that we previously sent out, the ARP cache will be filled in with
+00262  * the values from the ARP reply. If the incoming ARP packet is an ARP
+00263  * request for our IP address, an ARP reply packet is created and put
+00264  * into the uip_buf[] buffer.
+00265  *
+00266  * When the function returns, the value of the global variable uip_len
+00267  * indicates whether the device driver should send out a packet or
+00268  * not. If uip_len is zero, no packet should be sent. If uip_len is
+00269  * non-zero, it contains the length of the outbound packet that is
+00270  * present in the uip_buf[] buffer.
+00271  *
+00272  * This function expects an ARP packet with a prepended Ethernet
+00273  * header in the uip_buf[] buffer, and the length of the packet in the
+00274  * global variable uip_len.
+00275  */
+00276 /*-----------------------------------------------------------------------------------*/
+00277 void
+00278 uip_arp_arpin(void)
+00279 {
+00280   
+00281   if(uip_len < sizeof(struct arp_hdr)) {
+00282     uip_len = 0;
+00283     return;
+00284   }
+00285   uip_len = 0;
+00286   
+00287   switch(BUF->opcode) {
+00288   case HTONS(ARP_REQUEST):
+00289     /* ARP request. If it asked for our address, we send out a
+00290        reply. */
+00291     if(uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr)) {
+00292       /* First, we register the one who made the request in our ARP
+00293          table, since it is likely that we will do more communication
+00294          with this host in the future. */
+00295       uip_arp_update(BUF->sipaddr, &BUF->shwaddr);
+00296       
+00297       /* The reply opcode is 2. */
+00298       BUF->opcode = HTONS(2);
+00299 
+00300       memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, 6);
+00301       memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);
+00302       memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);
+00303       memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6);
+00304       
+00305       BUF->dipaddr[0] = BUF->sipaddr[0];
+00306       BUF->dipaddr[1] = BUF->sipaddr[1];
+00307       BUF->sipaddr[0] = uip_hostaddr[0];
+00308       BUF->sipaddr[1] = uip_hostaddr[1];
+00309 
+00310       BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP);
+00311       uip_len = sizeof(struct arp_hdr);
+00312     }
+00313     break;
+00314   case HTONS(ARP_REPLY):
+00315     /* ARP reply. We insert or update the ARP table if it was meant
+00316        for us. */
+00317     if(uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr)) {
+00318       uip_arp_update(BUF->sipaddr, &BUF->shwaddr);
+00319     }
+00320     break;
+00321   }
+00322 
+00323   return;
+00324 }
+00325 /*-----------------------------------------------------------------------------------*/
+00326 /**
+00327  * Prepend Ethernet header to an outbound IP packet and see if we need
+00328  * to send out an ARP request.
+00329  *
+00330  * This function should be called before sending out an IP packet. The
+00331  * function checks the destination IP address of the IP packet to see
+00332  * what Ethernet MAC address that should be used as a destination MAC
+00333  * address on the Ethernet.
+00334  *
+00335  * If the destination IP address is in the local network (determined
+00336  * by logical ANDing of netmask and our IP address), the function
+00337  * checks the ARP cache to see if an entry for the destination IP
+00338  * address is found. If so, an Ethernet header is prepended and the
+00339  * function returns. If no ARP cache entry is found for the
+00340  * destination IP address, the packet in the uip_buf[] is replaced by
+00341  * an ARP request packet for the IP address. The IP packet is dropped
+00342  * and it is assumed that they higher level protocols (e.g., TCP)
+00343  * eventually will retransmit the dropped packet.
+00344  *
+00345  * If the destination IP address is not on the local network, the IP
+00346  * address of the default router is used instead.
+00347  *
+00348  * When the function returns, a packet is present in the uip_buf[]
+00349  * buffer, and the length of the packet is in the global variable
+00350  * uip_len.
+00351  */
+00352 /*-----------------------------------------------------------------------------------*/
+00353 void
+00354 uip_arp_out(void)
+00355 {
+00356   struct arp_entry *tabptr;
+00357   
+00358   /* Find the destination IP address in the ARP table and construct
+00359      the Ethernet header. If the destination IP addres isn't on the
+00360      local network, we use the default router's IP address instead.
+00361 
+00362      If not ARP table entry is found, we overwrite the original IP
+00363      packet with an ARP request for the IP address. */
+00364 
+00365   /* First check if destination is a local broadcast. */
+00366   if(uip_ipaddr_cmp(IPBUF->destipaddr, broadcast_ipaddr)) {
+00367     memcpy(IPBUF->ethhdr.dest.addr, broadcast_ethaddr.addr, 6);
+00368   } else {
+00369     /* Check if the destination address is on the local network. */
+00370     if(!uip_ipaddr_maskcmp(IPBUF->destipaddr, uip_hostaddr, uip_netmask)) {
+00371       /* Destination address was not on the local network, so we need to
+00372          use the default router's IP address instead of the destination
+00373          address when determining the MAC address. */
+00374       uip_ipaddr_copy(ipaddr, uip_draddr);
+00375     } else {
+00376       /* Else, we use the destination IP address. */
+00377       uip_ipaddr_copy(ipaddr, IPBUF->destipaddr);
+00378     }
+00379       
+00380     for(i = 0; i < UIP_ARPTAB_SIZE; ++i) {
+00381       tabptr = &arp_table[i];
+00382       if(uip_ipaddr_cmp(ipaddr, tabptr->ipaddr)) {
+00383         break;
+00384       }
+00385     }
+00386 
+00387     if(i == UIP_ARPTAB_SIZE) {
+00388       /* The destination address was not in our ARP table, so we
+00389          overwrite the IP packet with an ARP request. */
+00390 
+00391       memset(BUF->ethhdr.dest.addr, 0xff, 6);
+00392       memset(BUF->dhwaddr.addr, 0x00, 6);
+00393       memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6);
+00394       memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6);
+00395     
+00396       uip_ipaddr_copy(BUF->dipaddr, ipaddr);
+00397       uip_ipaddr_copy(BUF->sipaddr, uip_hostaddr);
+00398       BUF->opcode = HTONS(ARP_REQUEST); /* ARP request. */
+00399       BUF->hwtype = HTONS(ARP_HWTYPE_ETH);
+00400       BUF->protocol = HTONS(UIP_ETHTYPE_IP);
+00401       BUF->hwlen = 6;
+00402       BUF->protolen = 4;
+00403       BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP);
+00404 
+00405       uip_appdata = &uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN];
+00406     
+00407       uip_len = sizeof(struct arp_hdr);
+00408       return;
+00409     }
+00410 
+00411     /* Build an ethernet header. */
+00412     memcpy(IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6);
+00413   }
+00414   memcpy(IPBUF->ethhdr.src.addr, uip_ethaddr.addr, 6);
+00415   
+00416   IPBUF->ethhdr.type = HTONS(UIP_ETHTYPE_IP);
+00417 
+00418   uip_len += sizeof(struct uip_eth_hdr);
+00419 }
+00420 /*-----------------------------------------------------------------------------------*/
+00421 
+00422 /** @} */
+00423 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00205.html b/third_party/uip-1.0/doc/html/a00205.html new file mode 100644 index 0000000..aef434f --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00205.html @@ -0,0 +1,169 @@ + + +uIP 1.0: uip/uip_arp.h Source File + + + + + + +

uip/uip_arp.h

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup uip
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \addtogroup uiparp
+00008  * @{
+00009  */
+00010  
+00011 /**
+00012  * \file
+00013  * Macros and definitions for the ARP module.
+00014  * \author Adam Dunkels <adam@dunkels.com>
+00015  */
+00016   
+00017 
+00018 /*
+00019  * Copyright (c) 2001-2003, Adam Dunkels.
+00020  * All rights reserved.
+00021  *
+00022  * Redistribution and use in source and binary forms, with or without
+00023  * modification, are permitted provided that the following conditions
+00024  * are met:
+00025  * 1. Redistributions of source code must retain the above copyright
+00026  *    notice, this list of conditions and the following disclaimer.
+00027  * 2. Redistributions in binary form must reproduce the above copyright
+00028  *    notice, this list of conditions and the following disclaimer in the
+00029  *    documentation and/or other materials provided with the distribution.
+00030  * 3. The name of the author may not be used to endorse or promote
+00031  *    products derived from this software without specific prior
+00032  *    written permission.
+00033  *
+00034  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00035  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00036  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00037  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00038  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00039  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00040  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00041  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00042  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00043  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00044  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00045  *
+00046  * This file is part of the uIP TCP/IP stack.
+00047  *
+00048  * $Id: uip_arp.h,v 1.5 2006/06/11 21:46:39 adam Exp $
+00049  *
+00050  */
+00051 
+00052 #ifndef __UIP_ARP_H__
+00053 #define __UIP_ARP_H__
+00054 
+00055 #include "uip.h"
+00056 
+00057 
+00058 extern struct uip_eth_addr uip_ethaddr;
+00059 
+00060 /**
+00061  * The Ethernet header.
+00062  */
+00063 struct uip_eth_hdr {
+00064   struct uip_eth_addr dest;
+00065   struct uip_eth_addr src;
+00066   u16_t type;
+00067 };
+00068 
+00069 #define UIP_ETHTYPE_ARP 0x0806
+00070 #define UIP_ETHTYPE_IP  0x0800
+00071 #define UIP_ETHTYPE_IP6 0x86dd
+00072 
+00073 
+00074 /* The uip_arp_init() function must be called before any of the other
+00075    ARP functions. */
+00076 void uip_arp_init(void);
+00077 
+00078 /* The uip_arp_ipin() function should be called whenever an IP packet
+00079    arrives from the Ethernet. This function refreshes the ARP table or
+00080    inserts a new mapping if none exists. The function assumes that an
+00081    IP packet with an Ethernet header is present in the uip_buf buffer
+00082    and that the length of the packet is in the uip_len variable. */
+00083 /*void uip_arp_ipin(void);*/
+00084 #define uip_arp_ipin()
+00085 
+00086 /* The uip_arp_arpin() should be called when an ARP packet is received
+00087    by the Ethernet driver. This function also assumes that the
+00088    Ethernet frame is present in the uip_buf buffer. When the
+00089    uip_arp_arpin() function returns, the contents of the uip_buf
+00090    buffer should be sent out on the Ethernet if the uip_len variable
+00091    is > 0. */
+00092 void uip_arp_arpin(void);
+00093 
+00094 /* The uip_arp_out() function should be called when an IP packet
+00095    should be sent out on the Ethernet. This function creates an
+00096    Ethernet header before the IP header in the uip_buf buffer. The
+00097    Ethernet header will have the correct Ethernet MAC destination
+00098    address filled in if an ARP table entry for the destination IP
+00099    address (or the IP address of the default router) is present. If no
+00100    such table entry is found, the IP packet is overwritten with an ARP
+00101    request and we rely on TCP to retransmit the packet that was
+00102    overwritten. In any case, the uip_len variable holds the length of
+00103    the Ethernet frame that should be transmitted. */
+00104 void uip_arp_out(void);
+00105 
+00106 /* The uip_arp_timer() function should be called every ten seconds. It
+00107    is responsible for flushing old entries in the ARP table. */
+00108 void uip_arp_timer(void);
+00109 
+00110 /** @} */
+00111 
+00112 /**
+00113  * \addtogroup uipconffunc
+00114  * @{
+00115  */
+00116 
+00117 
+00118 /**
+00119  * Specifiy the Ethernet MAC address.
+00120  *
+00121  * The ARP code needs to know the MAC address of the Ethernet card in
+00122  * order to be able to respond to ARP queries and to generate working
+00123  * Ethernet headers.
+00124  *
+00125  * \note This macro only specifies the Ethernet MAC address to the ARP
+00126  * code. It cannot be used to change the MAC address of the Ethernet
+00127  * card.
+00128  *
+00129  * \param eaddr A pointer to a struct uip_eth_addr containing the
+00130  * Ethernet MAC address of the Ethernet card.
+00131  *
+00132  * \hideinitializer
+00133  */
+00134 #define uip_setethaddr(eaddr) do {uip_ethaddr.addr[0] = eaddr.addr[0]; \
+00135                               uip_ethaddr.addr[1] = eaddr.addr[1];\
+00136                               uip_ethaddr.addr[2] = eaddr.addr[2];\
+00137                               uip_ethaddr.addr[3] = eaddr.addr[3];\
+00138                               uip_ethaddr.addr[4] = eaddr.addr[4];\
+00139                               uip_ethaddr.addr[5] = eaddr.addr[5];} while(0)
+00140 
+00141 /** @} */
+00142 /** @} */
+00143 
+00144 #endif /* __UIP_ARP_H__ */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00206.html b/third_party/uip-1.0/doc/html/a00206.html new file mode 100644 index 0000000..346c58a --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00206.html @@ -0,0 +1,564 @@ + + +uIP 1.0: uip/uipopt.h Source File + + + + + + +

uip/uipopt.h

Go to the documentation of this file.
00001 /**
+00002  * \defgroup uipopt Configuration options for uIP
+00003  * @{
+00004  *
+00005  * uIP is configured using the per-project configuration file
+00006  * uipopt.h. This file contains all compile-time options for uIP and
+00007  * should be tweaked to match each specific project. The uIP
+00008  * distribution contains a documented example "uipopt.h" that can be
+00009  * copied and modified for each project.
+00010  *
+00011  * \note Most of the configuration options in the uipopt.h should not
+00012  * be changed, but rather the per-project uip-conf.h file.
+00013  */
+00014 
+00015 /**
+00016  * \file
+00017  * Configuration options for uIP.
+00018  * \author Adam Dunkels <adam@dunkels.com>
+00019  *
+00020  * This file is used for tweaking various configuration options for
+00021  * uIP. You should make a copy of this file into one of your project's
+00022  * directories instead of editing this example "uipopt.h" file that
+00023  * comes with the uIP distribution.
+00024  */
+00025 
+00026 /*
+00027  * Copyright (c) 2001-2003, Adam Dunkels.
+00028  * All rights reserved.
+00029  *
+00030  * Redistribution and use in source and binary forms, with or without
+00031  * modification, are permitted provided that the following conditions
+00032  * are met:
+00033  * 1. Redistributions of source code must retain the above copyright
+00034  *    notice, this list of conditions and the following disclaimer.
+00035  * 2. Redistributions in binary form must reproduce the above copyright
+00036  *    notice, this list of conditions and the following disclaimer in the
+00037  *    documentation and/or other materials provided with the distribution.
+00038  * 3. The name of the author may not be used to endorse or promote
+00039  *    products derived from this software without specific prior
+00040  *    written permission.
+00041  *
+00042  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+00043  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+00044  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00045  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
+00046  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00047  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+00048  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+00049  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+00050  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+00051  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+00052  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+00053  *
+00054  * This file is part of the uIP TCP/IP stack.
+00055  *
+00056  * $Id: uipopt.h,v 1.4 2006/06/12 08:00:31 adam Exp $
+00057  *
+00058  */
+00059 
+00060 #ifndef __UIPOPT_H__
+00061 #define __UIPOPT_H__
+00062 
+00063 #ifndef UIP_LITTLE_ENDIAN
+00064 #define UIP_LITTLE_ENDIAN  3412
+00065 #endif /* UIP_LITTLE_ENDIAN */
+00066 #ifndef UIP_BIG_ENDIAN
+00067 #define UIP_BIG_ENDIAN     1234
+00068 #endif /* UIP_BIG_ENDIAN */
+00069 
+00070 #include "uip-conf.h"
+00071 
+00072 /*------------------------------------------------------------------------------*/
+00073 
+00074 /**
+00075  * \name Static configuration options
+00076  * @{
+00077  *
+00078  * These configuration options can be used for setting the IP address
+00079  * settings statically, but only if UIP_FIXEDADDR is set to 1. The
+00080  * configuration options for a specific node includes IP address,
+00081  * netmask and default router as well as the Ethernet address. The
+00082  * netmask, default router and Ethernet address are appliciable only
+00083  * if uIP should be run over Ethernet.
+00084  *
+00085  * All of these should be changed to suit your project.
+00086 */
+00087 
+00088 /**
+00089  * Determines if uIP should use a fixed IP address or not.
+00090  *
+00091  * If uIP should use a fixed IP address, the settings are set in the
+00092  * uipopt.h file. If not, the macros uip_sethostaddr(),
+00093  * uip_setdraddr() and uip_setnetmask() should be used instead.
+00094  *
+00095  * \hideinitializer
+00096  */
+00097 #define UIP_FIXEDADDR    0
+00098 
+00099 /**
+00100  * Ping IP address asignment.
+00101  *
+00102  * uIP uses a "ping" packets for setting its own IP address if this
+00103  * option is set. If so, uIP will start with an empty IP address and
+00104  * the destination IP address of the first incoming "ping" (ICMP echo)
+00105  * packet will be used for setting the hosts IP address.
+00106  *
+00107  * \note This works only if UIP_FIXEDADDR is 0.
+00108  *
+00109  * \hideinitializer
+00110  */
+00111 #ifdef UIP_CONF_PINGADDRCONF
+00112 #define UIP_PINGADDRCONF UIP_CONF_PINGADDRCONF
+00113 #else /* UIP_CONF_PINGADDRCONF */
+00114 #define UIP_PINGADDRCONF 0
+00115 #endif /* UIP_CONF_PINGADDRCONF */
+00116 
+00117 
+00118 /**
+00119  * Specifies if the uIP ARP module should be compiled with a fixed
+00120  * Ethernet MAC address or not.
+00121  *
+00122  * If this configuration option is 0, the macro uip_setethaddr() can
+00123  * be used to specify the Ethernet address at run-time.
+00124  *
+00125  * \hideinitializer
+00126  */
+00127 #define UIP_FIXEDETHADDR 0
+00128 
+00129 /** @} */
+00130 /*------------------------------------------------------------------------------*/
+00131 /**
+00132  * \name IP configuration options
+00133  * @{
+00134  *
+00135  */
+00136 /**
+00137  * The IP TTL (time to live) of IP packets sent by uIP.
+00138  *
+00139  * This should normally not be changed.
+00140  */
+00141 #define UIP_TTL         64
+00142 
+00143 /**
+00144  * Turn on support for IP packet reassembly.
+00145  *
+00146  * uIP supports reassembly of fragmented IP packets. This features
+00147  * requires an additonal amount of RAM to hold the reassembly buffer
+00148  * and the reassembly code size is approximately 700 bytes.  The
+00149  * reassembly buffer is of the same size as the uip_buf buffer
+00150  * (configured by UIP_BUFSIZE).
+00151  *
+00152  * \note IP packet reassembly is not heavily tested.
+00153  *
+00154  * \hideinitializer
+00155  */
+00156 #define UIP_REASSEMBLY 0
+00157 
+00158 /**
+00159  * The maximum time an IP fragment should wait in the reassembly
+00160  * buffer before it is dropped.
+00161  *
+00162  */
+00163 #define UIP_REASS_MAXAGE 40
+00164 
+00165 /** @} */
+00166 
+00167 /*------------------------------------------------------------------------------*/
+00168 /**
+00169  * \name UDP configuration options
+00170  * @{
+00171  */
+00172 
+00173 /**
+00174  * Toggles wether UDP support should be compiled in or not.
+00175  *
+00176  * \hideinitializer
+00177  */
+00178 #ifdef UIP_CONF_UDP
+00179 #define UIP_UDP UIP_CONF_UDP
+00180 #else /* UIP_CONF_UDP */
+00181 #define UIP_UDP           0
+00182 #endif /* UIP_CONF_UDP */
+00183 
+00184 /**
+00185  * Toggles if UDP checksums should be used or not.
+00186  *
+00187  * \note Support for UDP checksums is currently not included in uIP,
+00188  * so this option has no function.
+00189  *
+00190  * \hideinitializer
+00191  */
+00192 #ifdef UIP_CONF_UDP_CHECKSUMS
+00193 #define UIP_UDP_CHECKSUMS UIP_CONF_UDP_CHECKSUMS
+00194 #else
+00195 #define UIP_UDP_CHECKSUMS 0
+00196 #endif
+00197 
+00198 /**
+00199  * The maximum amount of concurrent UDP connections.
+00200  *
+00201  * \hideinitializer
+00202  */
+00203 #ifdef UIP_CONF_UDP_CONNS
+00204 #define UIP_UDP_CONNS UIP_CONF_UDP_CONNS
+00205 #else /* UIP_CONF_UDP_CONNS */
+00206 #define UIP_UDP_CONNS    10
+00207 #endif /* UIP_CONF_UDP_CONNS */
+00208 
+00209 /**
+00210  * The name of the function that should be called when UDP datagrams arrive.
+00211  *
+00212  * \hideinitializer
+00213  */
+00214 
+00215 
+00216 /** @} */
+00217 /*------------------------------------------------------------------------------*/
+00218 /**
+00219  * \name TCP configuration options
+00220  * @{
+00221  */
+00222 
+00223 /**
+00224  * Determines if support for opening connections from uIP should be
+00225  * compiled in.
+00226  *
+00227  * If the applications that are running on top of uIP for this project
+00228  * do not need to open outgoing TCP connections, this configration
+00229  * option can be turned off to reduce the code size of uIP.
+00230  *
+00231  * \hideinitializer
+00232  */
+00233 #define UIP_ACTIVE_OPEN 1
+00234 
+00235 /**
+00236  * The maximum number of simultaneously open TCP connections.
+00237  *
+00238  * Since the TCP connections are statically allocated, turning this
+00239  * configuration knob down results in less RAM used. Each TCP
+00240  * connection requires approximatly 30 bytes of memory.
+00241  *
+00242  * \hideinitializer
+00243  */
+00244 #ifndef UIP_CONF_MAX_CONNECTIONS
+00245 #define UIP_CONNS       10
+00246 #else /* UIP_CONF_MAX_CONNECTIONS */
+00247 #define UIP_CONNS UIP_CONF_MAX_CONNECTIONS
+00248 #endif /* UIP_CONF_MAX_CONNECTIONS */
+00249 
+00250 
+00251 /**
+00252  * The maximum number of simultaneously listening TCP ports.
+00253  *
+00254  * Each listening TCP port requires 2 bytes of memory.
+00255  *
+00256  * \hideinitializer
+00257  */
+00258 #ifndef UIP_CONF_MAX_LISTENPORTS
+00259 #define UIP_LISTENPORTS 20
+00260 #else /* UIP_CONF_MAX_LISTENPORTS */
+00261 #define UIP_LISTENPORTS UIP_CONF_MAX_LISTENPORTS
+00262 #endif /* UIP_CONF_MAX_LISTENPORTS */
+00263 
+00264 /**
+00265  * Determines if support for TCP urgent data notification should be
+00266  * compiled in.
+00267  *
+00268  * Urgent data (out-of-band data) is a rarely used TCP feature that
+00269  * very seldom would be required.
+00270  *
+00271  * \hideinitializer
+00272  */
+00273 #define UIP_URGDATA      0
+00274 
+00275 /**
+00276  * The initial retransmission timeout counted in timer pulses.
+00277  *
+00278  * This should not be changed.
+00279  */
+00280 #define UIP_RTO         3
+00281 
+00282 /**
+00283  * The maximum number of times a segment should be retransmitted
+00284  * before the connection should be aborted.
+00285  *
+00286  * This should not be changed.
+00287  */
+00288 #define UIP_MAXRTX      8
+00289 
+00290 /**
+00291  * The maximum number of times a SYN segment should be retransmitted
+00292  * before a connection request should be deemed to have been
+00293  * unsuccessful.
+00294  *
+00295  * This should not need to be changed.
+00296  */
+00297 #define UIP_MAXSYNRTX      5
+00298 
+00299 /**
+00300  * The TCP maximum segment size.
+00301  *
+00302  * This is should not be to set to more than
+00303  * UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN.
+00304  */
+00305 #define UIP_TCP_MSS     (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN)
+00306 
+00307 /**
+00308  * The size of the advertised receiver's window.
+00309  *
+00310  * Should be set low (i.e., to the size of the uip_buf buffer) is the
+00311  * application is slow to process incoming data, or high (32768 bytes)
+00312  * if the application processes data quickly.
+00313  *
+00314  * \hideinitializer
+00315  */
+00316 #ifndef UIP_CONF_RECEIVE_WINDOW
+00317 #define UIP_RECEIVE_WINDOW UIP_TCP_MSS
+00318 #else
+00319 #define UIP_RECEIVE_WINDOW UIP_CONF_RECEIVE_WINDOW
+00320 #endif
+00321 
+00322 /**
+00323  * How long a connection should stay in the TIME_WAIT state.
+00324  *
+00325  * This configiration option has no real implication, and it should be
+00326  * left untouched.
+00327  */
+00328 #define UIP_TIME_WAIT_TIMEOUT 120
+00329 
+00330 
+00331 /** @} */
+00332 /*------------------------------------------------------------------------------*/
+00333 /**
+00334  * \name ARP configuration options
+00335  * @{
+00336  */
+00337 
+00338 /**
+00339  * The size of the ARP table.
+00340  *
+00341  * This option should be set to a larger value if this uIP node will
+00342  * have many connections from the local network.
+00343  *
+00344  * \hideinitializer
+00345  */
+00346 #ifdef UIP_CONF_ARPTAB_SIZE
+00347 #define UIP_ARPTAB_SIZE UIP_CONF_ARPTAB_SIZE
+00348 #else
+00349 #define UIP_ARPTAB_SIZE 8
+00350 #endif
+00351 
+00352 /**
+00353  * The maxium age of ARP table entries measured in 10ths of seconds.
+00354  *
+00355  * An UIP_ARP_MAXAGE of 120 corresponds to 20 minutes (BSD
+00356  * default).
+00357  */
+00358 #define UIP_ARP_MAXAGE 120
+00359 
+00360 /** @} */
+00361 
+00362 /*------------------------------------------------------------------------------*/
+00363 
+00364 /**
+00365  * \name General configuration options
+00366  * @{
+00367  */
+00368 
+00369 /**
+00370  * The size of the uIP packet buffer.
+00371  *
+00372  * The uIP packet buffer should not be smaller than 60 bytes, and does
+00373  * not need to be larger than 1500 bytes. Lower size results in lower
+00374  * TCP throughput, larger size results in higher TCP throughput.
+00375  *
+00376  * \hideinitializer
+00377  */
+00378 #ifndef UIP_CONF_BUFFER_SIZE
+00379 #define UIP_BUFSIZE     400
+00380 #else /* UIP_CONF_BUFFER_SIZE */
+00381 #define UIP_BUFSIZE UIP_CONF_BUFFER_SIZE
+00382 #endif /* UIP_CONF_BUFFER_SIZE */
+00383 
+00384 
+00385 /**
+00386  * Determines if statistics support should be compiled in.
+00387  *
+00388  * The statistics is useful for debugging and to show the user.
+00389  *
+00390  * \hideinitializer
+00391  */
+00392 #ifndef UIP_CONF_STATISTICS
+00393 #define UIP_STATISTICS  0
+00394 #else /* UIP_CONF_STATISTICS */
+00395 #define UIP_STATISTICS UIP_CONF_STATISTICS
+00396 #endif /* UIP_CONF_STATISTICS */
+00397 
+00398 /**
+00399  * Determines if logging of certain events should be compiled in.
+00400  *
+00401  * This is useful mostly for debugging. The function uip_log()
+00402  * must be implemented to suit the architecture of the project, if
+00403  * logging is turned on.
+00404  *
+00405  * \hideinitializer
+00406  */
+00407 #ifndef UIP_CONF_LOGGING
+00408 #define UIP_LOGGING     0
+00409 #else /* UIP_CONF_LOGGING */
+00410 #define UIP_LOGGING     UIP_CONF_LOGGING
+00411 #endif /* UIP_CONF_LOGGING */
+00412 
+00413 /**
+00414  * Broadcast support.
+00415  *
+00416  * This flag configures IP broadcast support. This is useful only
+00417  * together with UDP.
+00418  *
+00419  * \hideinitializer
+00420  *
+00421  */
+00422 #ifndef UIP_CONF_BROADCAST
+00423 #define UIP_BROADCAST 0
+00424 #else /* UIP_CONF_BROADCAST */
+00425 #define UIP_BROADCAST UIP_CONF_BROADCAST
+00426 #endif /* UIP_CONF_BROADCAST */
+00427 
+00428 /**
+00429  * Print out a uIP log message.
+00430  *
+00431  * This function must be implemented by the module that uses uIP, and
+00432  * is called by uIP whenever a log message is generated.
+00433  */
+00434 void uip_log(char *msg);
+00435 
+00436 /**
+00437  * The link level header length.
+00438  *
+00439  * This is the offset into the uip_buf where the IP header can be
+00440  * found. For Ethernet, this should be set to 14. For SLIP, this
+00441  * should be set to 0.
+00442  *
+00443  * \hideinitializer
+00444  */
+00445 #ifdef UIP_CONF_LLH_LEN
+00446 #define UIP_LLH_LEN UIP_CONF_LLH_LEN
+00447 #else /* UIP_CONF_LLH_LEN */
+00448 #define UIP_LLH_LEN     14
+00449 #endif /* UIP_CONF_LLH_LEN */
+00450 
+00451 /** @} */
+00452 /*------------------------------------------------------------------------------*/
+00453 /**
+00454  * \name CPU architecture configuration
+00455  * @{
+00456  *
+00457  * The CPU architecture configuration is where the endianess of the
+00458  * CPU on which uIP is to be run is specified. Most CPUs today are
+00459  * little endian, and the most notable exception are the Motorolas
+00460  * which are big endian. The BYTE_ORDER macro should be changed to
+00461  * reflect the CPU architecture on which uIP is to be run.
+00462  */
+00463 
+00464 /**
+00465  * The byte order of the CPU architecture on which uIP is to be run.
+00466  *
+00467  * This option can be either BIG_ENDIAN (Motorola byte order) or
+00468  * LITTLE_ENDIAN (Intel byte order).
+00469  *
+00470  * \hideinitializer
+00471  */
+00472 #ifdef UIP_CONF_BYTE_ORDER
+00473 #define UIP_BYTE_ORDER     UIP_CONF_BYTE_ORDER
+00474 #else /* UIP_CONF_BYTE_ORDER */
+00475 #define UIP_BYTE_ORDER     UIP_LITTLE_ENDIAN
+00476 #endif /* UIP_CONF_BYTE_ORDER */
+00477 
+00478 /** @} */
+00479 /*------------------------------------------------------------------------------*/
+00480 
+00481 /**
+00482  * \name Appication specific configurations
+00483  * @{
+00484  *
+00485  * An uIP application is implemented using a single application
+00486  * function that is called by uIP whenever a TCP/IP event occurs. The
+00487  * name of this function must be registered with uIP at compile time
+00488  * using the UIP_APPCALL definition.
+00489  *
+00490  * uIP applications can store the application state within the
+00491  * uip_conn structure by specifying the type of the application
+00492  * structure by typedef:ing the type uip_tcp_appstate_t and uip_udp_appstate_t.
+00493  *
+00494  * The file containing the definitions must be included in the
+00495  * uipopt.h file.
+00496  *
+00497  * The following example illustrates how this can look.
+00498  \code
+00499 
+00500 void httpd_appcall(void);
+00501 #define UIP_APPCALL     httpd_appcall
+00502 
+00503 struct httpd_state {
+00504   u8_t state;
+00505   u16_t count;
+00506   char *dataptr;
+00507   char *script;
+00508 };
+00509 typedef struct httpd_state uip_tcp_appstate_t
+00510  \endcode
+00511  */
+00512 
+00513 /**
+00514  * \var #define UIP_APPCALL
+00515  *
+00516  * The name of the application function that uIP should call in
+00517  * response to TCP/IP events.
+00518  *
+00519  */
+00520 
+00521 /**
+00522  * \var typedef uip_tcp_appstate_t
+00523  *
+00524  * The type of the application state that is to be stored in the
+00525  * uip_conn structure. This usually is typedef:ed to a struct holding
+00526  * application state information.
+00527  */
+00528 
+00529 /**
+00530  * \var typedef uip_udp_appstate_t
+00531  *
+00532  * The type of the application state that is to be stored in the
+00533  * uip_conn structure. This usually is typedef:ed to a struct holding
+00534  * application state information.
+00535  */
+00536 /** @} */
+00537 /** @} */
+00538 
+00539 #endif /* __UIPOPT_H__ */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/a00207.html b/third_party/uip-1.0/doc/html/a00207.html new file mode 100644 index 0000000..1bf1c51 --- /dev/null +++ b/third_party/uip-1.0/doc/html/a00207.html @@ -0,0 +1,182 @@ + + +uIP 1.0: unix/uip-conf.h Source File + + + + + + +

unix/uip-conf.h

Go to the documentation of this file.
00001 /**
+00002  * \addtogroup uipopt
+00003  * @{
+00004  */
+00005 
+00006 /**
+00007  * \name Project-specific configuration options
+00008  * @{
+00009  *
+00010  * uIP has a number of configuration options that can be overridden
+00011  * for each project. These are kept in a project-specific uip-conf.h
+00012  * file and all configuration names have the prefix UIP_CONF.
+00013  */
+00014 
+00015 /*
+00016  * Copyright (c) 2006, Swedish Institute of Computer Science.
+00017  * All rights reserved.
+00018  *
+00019  * Redistribution and use in source and binary forms, with or without
+00020  * modification, are permitted provided that the following conditions
+00021  * are met:
+00022  * 1. Redistributions of source code must retain the above copyright
+00023  *    notice, this list of conditions and the following disclaimer.
+00024  * 2. Redistributions in binary form must reproduce the above copyright
+00025  *    notice, this list of conditions and the following disclaimer in the
+00026  *    documentation and/or other materials provided with the distribution.
+00027  * 3. Neither the name of the Institute nor the names of its contributors
+00028  *    may be used to endorse or promote products derived from this software
+00029  *    without specific prior written permission.
+00030  *
+00031  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
+00032  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+00033  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+00034  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
+00035  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+00036  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+00037  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+00038  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+00039  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+00040  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+00041  * SUCH DAMAGE.
+00042  *
+00043  * This file is part of the uIP TCP/IP stack
+00044  *
+00045  * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $
+00046  */
+00047 
+00048 /**
+00049  * \file
+00050  *         An example uIP configuration file
+00051  * \author
+00052  *         Adam Dunkels <adam@sics.se>
+00053  */
+00054 
+00055 #ifndef __UIP_CONF_H__
+00056 #define __UIP_CONF_H__
+00057 
+00058 #include <inttypes.h>
+00059 
+00060 /**
+00061  * 8 bit datatype
+00062  *
+00063  * This typedef defines the 8-bit type used throughout uIP.
+00064  *
+00065  * \hideinitializer
+00066  */
+00067 typedef uint8_t u8_t;
+00068 
+00069 /**
+00070  * 16 bit datatype
+00071  *
+00072  * This typedef defines the 16-bit type used throughout uIP.
+00073  *
+00074  * \hideinitializer
+00075  */
+00076 typedef uint16_t u16_t;
+00077 
+00078 /**
+00079  * Statistics datatype
+00080  *
+00081  * This typedef defines the dataype used for keeping statistics in
+00082  * uIP.
+00083  *
+00084  * \hideinitializer
+00085  */
+00086 typedef unsigned short uip_stats_t;
+00087 
+00088 /**
+00089  * Maximum number of TCP connections.
+00090  *
+00091  * \hideinitializer
+00092  */
+00093 #define UIP_CONF_MAX_CONNECTIONS 40
+00094 
+00095 /**
+00096  * Maximum number of listening TCP ports.
+00097  *
+00098  * \hideinitializer
+00099  */
+00100 #define UIP_CONF_MAX_LISTENPORTS 40
+00101 
+00102 /**
+00103  * uIP buffer size.
+00104  *
+00105  * \hideinitializer
+00106  */
+00107 #define UIP_CONF_BUFFER_SIZE     420
+00108 
+00109 /**
+00110  * CPU byte order.
+00111  *
+00112  * \hideinitializer
+00113  */
+00114 #define UIP_CONF_BYTE_ORDER      LITTLE_ENDIAN
+00115 
+00116 /**
+00117  * Logging on or off
+00118  *
+00119  * \hideinitializer
+00120  */
+00121 #define UIP_CONF_LOGGING         1
+00122 
+00123 /**
+00124  * UDP support on or off
+00125  *
+00126  * \hideinitializer
+00127  */
+00128 #define UIP_CONF_UDP             0
+00129 
+00130 /**
+00131  * UDP checksums on or off
+00132  *
+00133  * \hideinitializer
+00134  */
+00135 #define UIP_CONF_UDP_CHECKSUMS   1
+00136 
+00137 /**
+00138  * uIP statistics on or off
+00139  *
+00140  * \hideinitializer
+00141  */
+00142 #define UIP_CONF_STATISTICS      1
+00143 
+00144 /* Here we include the header file for the application(s) we use in
+00145    our project. */
+00146 /*#include "smtp.h"*/
+00147 /*#include "hello-world.h"*/
+00148 /*#include "telnetd.h"*/
+00149 #include "webserver.h"
+00150 /*#include "dhcpc.h"*/
+00151 /*#include "resolv.h"*/
+00152 /*#include "webclient.h"*/
+00153 
+00154 #endif /* __UIP_CONF_H__ */
+00155 
+00156 /** @} */
+00157 /** @} */
+

Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/annotated.html b/third_party/uip-1.0/doc/html/annotated.html new file mode 100644 index 0000000..0753c5b --- /dev/null +++ b/third_party/uip-1.0/doc/html/annotated.html @@ -0,0 +1,50 @@ + + +uIP 1.0: Data Structures + + + + + + +

uIP 1.0 Data Structures

Here are the data structures with brief descriptions: + + + + + + + + + + + + + + + + + + + + + +
dhcpc_state
hello_world_state
httpd_cgi_call
httpd_state
memb_blocks
psockThe representation of a protosocket
psock_buf
pt
smtp_state
telnetd_state
timerA timer
uip_connRepresentation of a uIP TCP connection
uip_eth_addrRepresentation of a 48-bit Ethernet address
uip_eth_hdrThe Ethernet header
uip_icmpip_hdr
uip_neighbor_addr
uip_statsThe structure holding the TCP/IP statistics that are gathered if UIP_STATISTICS is set to 1
uip_tcpip_hdr
uip_udp_connRepresentation of a uIP UDP connection
uip_udpip_hdr
webclient_state
+
Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/classes.html b/third_party/uip-1.0/doc/html/classes.html new file mode 100644 index 0000000..5ada66e --- /dev/null +++ b/third_party/uip-1.0/doc/html/classes.html @@ -0,0 +1,38 @@ + + +uIP 1.0: Alphabetical List + + + + + + +

uIP 1.0 Data Structure Index

D | H | M | P | S | T | U | W

+ +
  D  
+
  M  
+
  S  
+
uip_conn   uip_tcpip_hdr   
dhcpc_state   memb_blocks   smtp_state   uip_eth_addr   uip_udp_conn   
  H  
+
  P  
+
  T  
+
uip_eth_hdr   uip_udpip_hdr   
hello_world_state   psock   telnetd_state   uip_icmpip_hdr   
  W  
+
httpd_cgi_call   psock_buf   timer   uip_neighbor_addr   webclient_state   
httpd_state   pt   
  U  
+
uip_stats   

D | H | M | P | S | T | U | W

+


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/doxygen.css b/third_party/uip-1.0/doc/html/doxygen.css new file mode 100644 index 0000000..17790f3 --- /dev/null +++ b/third_party/uip-1.0/doc/html/doxygen.css @@ -0,0 +1,310 @@ +BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { + font-family: Geneva, Arial, Helvetica, sans-serif; +} +BODY,TD { + font-size: 90%; +} +H1 { + text-align: center; + font-size: 160%; +} +H2 { + font-size: 120%; +} +H3 { + font-size: 100%; +} +CAPTION { font-weight: bold } +DIV.qindex { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.nav { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.navtab { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +TD.navtab { + font-size: 70%; +} +A.qindex { + text-decoration: none; + font-weight: bold; + color: #1A419D; +} +A.qindex:visited { + text-decoration: none; + font-weight: bold; + color: #1A419D +} +A.qindex:hover { + text-decoration: none; + background-color: #ddddff; +} +A.qindexHL { + text-decoration: none; + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + border: 1px double #9295C2; +} +A.qindexHL:hover { + text-decoration: none; + background-color: #6666cc; + color: #ffffff; +} +A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff } +A.el { text-decoration: none; font-weight: bold } +A.elRef { font-weight: bold } +A.code:link { text-decoration: none; font-weight: normal; color: #0000FF} +A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF} +A.codeRef:link { font-weight: normal; color: #0000FF} +A.codeRef:visited { font-weight: normal; color: #0000FF} +A:hover { text-decoration: none; background-color: #f2f2ff } +DL.el { margin-left: -1cm } +.fragment { + font-family: Fixed, monospace; + font-size: 95%; +} +PRE.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + margin-top: 4px; + margin-bottom: 4px; + margin-left: 2px; + margin-right: 8px; + padding-left: 6px; + padding-right: 6px; + padding-top: 4px; + padding-bottom: 4px; +} +DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px } +TD.md { background-color: #F4F4FB; font-weight: bold; } +TD.mdPrefix { + background-color: #F4F4FB; + color: #606060; + font-size: 80%; +} +TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; } +TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; } +DIV.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} +DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% } +BODY { + background: white; + color: black; + margin-right: 20px; + margin-left: 20px; +} +TD.indexkey { + background-color: #e8eef2; + font-weight: bold; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TD.indexvalue { + background-color: #e8eef2; + font-style: italic; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TR.memlist { + background-color: #f0f0f0; +} +P.formulaDsp { text-align: center; } +IMG.formulaDsp { } +IMG.formulaInl { vertical-align: middle; } +SPAN.keyword { color: #008000 } +SPAN.keywordtype { color: #604020 } +SPAN.keywordflow { color: #e08000 } +SPAN.comment { color: #800000 } +SPAN.preprocessor { color: #806020 } +SPAN.stringliteral { color: #002080 } +SPAN.charliteral { color: #008080 } +.mdTable { + border: 1px solid #868686; + background-color: #F4F4FB; +} +.mdRow { + padding: 8px 10px; +} +.mdescLeft { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.mdescRight { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.memItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplParams { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + color: #606060; + background-color: #FAFAFA; + font-size: 80%; +} +.search { color: #003399; + font-weight: bold; +} +FORM.search { + margin-bottom: 0px; + margin-top: 0px; +} +INPUT.search { font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +TD.tiny { font-size: 75%; +} +a { + color: #1A41A8; +} +a:visited { + color: #2A3798; +} +.dirtab { padding: 4px; + border-collapse: collapse; + border: 1px solid #84b0c7; +} +TH.dirtab { background: #e8eef2; + font-weight: bold; +} +HR { height: 1px; + border: none; + border-top: 1px solid black; +} + diff --git a/third_party/uip-1.0/doc/html/doxygen.png b/third_party/uip-1.0/doc/html/doxygen.png new file mode 100644 index 0000000..f0a274b Binary files /dev/null and b/third_party/uip-1.0/doc/html/doxygen.png differ diff --git a/third_party/uip-1.0/doc/html/examples.html b/third_party/uip-1.0/doc/html/examples.html new file mode 100644 index 0000000..0eedf17 --- /dev/null +++ b/third_party/uip-1.0/doc/html/examples.html @@ -0,0 +1,38 @@ + + +uIP 1.0: Examples + + + + + +

uIP 1.0 Examples

Here is a list of all examples: +
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/files.html b/third_party/uip-1.0/doc/html/files.html new file mode 100644 index 0000000..e7023f8 --- /dev/null +++ b/third_party/uip-1.0/doc/html/files.html @@ -0,0 +1,67 @@ + + +uIP 1.0: File Index + + + + + + +

uIP 1.0 File List

Here is a list of all documented files with brief descriptions: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
apps/dhcpc/dhcpc.c [code]
apps/dhcpc/dhcpc.h [code]
apps/hello-world/hello-world.c [code]An example of how to write uIP applications with protosockets
apps/hello-world/hello-world.h [code]Header file for an example of how to write uIP applications with protosockets
apps/resolv/resolv.c [code]DNS host name to IP address resolver
apps/resolv/resolv.h [code]DNS resolver code header file
apps/smtp/smtp.c [code]SMTP example implementation
apps/smtp/smtp.h [code]SMTP header file
apps/telnetd/shell.c [code]
apps/telnetd/shell.h [code]Interface for the Contiki shell
apps/telnetd/telnetd.c [code]
apps/telnetd/telnetd.h [code]
apps/webclient/webclient.c [code]Implementation of the HTTP client
apps/webclient/webclient.h [code]Header file for the HTTP client
apps/webserver/httpd-cgi.c [code]Web server script interface
apps/webserver/httpd-cgi.h [code]Web server script interface header file
apps/webserver/httpd.c [code]Web server
apps/webserver/httpd.h [code]
lib/memb.c [code]Memory block allocation routines
lib/memb.h [code]Memory block allocation routines
uip/clock.h [code]
uip/lc-addrlabels.h [code]Implementation of local continuations based on the "Labels as values" feature of gcc
uip/lc-switch.h [code]Implementation of local continuations based on switch() statment
uip/lc.h [code]Local continuations
uip/psock.c [code]
uip/psock.h [code]Protosocket library header file
uip/pt.h [code]Protothreads implementation
uip/timer.c [code]Timer library implementation
uip/timer.h [code]Timer library header file
uip/uip-neighbor.c [code]Database of link-local neighbors, used by IPv6 code and to be used by a future ARP code rewrite
uip/uip-neighbor.h [code]Header file for database of link-local neighbors, used by IPv6 code and to be used by future ARP code
uip/uip-split.c [code]
uip/uip-split.h [code]Module for splitting outbound TCP segments in two to avoid the delayed ACK throughput degradation
uip/uip.c [code]The uIP TCP/IP stack code
uip/uip.h [code]Header file for the uIP TCP/IP stack
uip/uip_arch.h [code]Declarations of architecture specific functions
uip/uip_arp.c [code]Implementation of the ARP Address Resolution Protocol
uip/uip_arp.h [code]Macros and definitions for the ARP module
uip/uipopt.h [code]Configuration options for uIP
unix/uip-conf.h [code]An example uIP configuration file
+
Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/ftv2blank.png b/third_party/uip-1.0/doc/html/ftv2blank.png new file mode 100644 index 0000000..493c3c0 Binary files /dev/null and b/third_party/uip-1.0/doc/html/ftv2blank.png differ diff --git a/third_party/uip-1.0/doc/html/ftv2doc.png b/third_party/uip-1.0/doc/html/ftv2doc.png new file mode 100644 index 0000000..f72999f Binary files /dev/null and b/third_party/uip-1.0/doc/html/ftv2doc.png differ diff --git a/third_party/uip-1.0/doc/html/ftv2folderclosed.png b/third_party/uip-1.0/doc/html/ftv2folderclosed.png new file mode 100644 index 0000000..d6d0634 Binary files /dev/null and b/third_party/uip-1.0/doc/html/ftv2folderclosed.png differ diff --git a/third_party/uip-1.0/doc/html/ftv2folderopen.png b/third_party/uip-1.0/doc/html/ftv2folderopen.png new file mode 100644 index 0000000..bbe2c91 Binary files /dev/null and b/third_party/uip-1.0/doc/html/ftv2folderopen.png differ diff --git a/third_party/uip-1.0/doc/html/ftv2lastnode.png b/third_party/uip-1.0/doc/html/ftv2lastnode.png new file mode 100644 index 0000000..e7b9ba9 Binary files /dev/null and b/third_party/uip-1.0/doc/html/ftv2lastnode.png differ diff --git a/third_party/uip-1.0/doc/html/ftv2link.png b/third_party/uip-1.0/doc/html/ftv2link.png new file mode 100644 index 0000000..14f3fed Binary files /dev/null and b/third_party/uip-1.0/doc/html/ftv2link.png differ diff --git a/third_party/uip-1.0/doc/html/ftv2mlastnode.png b/third_party/uip-1.0/doc/html/ftv2mlastnode.png new file mode 100644 index 0000000..09ceb6a Binary files /dev/null and b/third_party/uip-1.0/doc/html/ftv2mlastnode.png differ diff --git a/third_party/uip-1.0/doc/html/ftv2mnode.png b/third_party/uip-1.0/doc/html/ftv2mnode.png new file mode 100644 index 0000000..3254c05 Binary files /dev/null and b/third_party/uip-1.0/doc/html/ftv2mnode.png differ diff --git a/third_party/uip-1.0/doc/html/ftv2node.png b/third_party/uip-1.0/doc/html/ftv2node.png new file mode 100644 index 0000000..c9f06a5 Binary files /dev/null and b/third_party/uip-1.0/doc/html/ftv2node.png differ diff --git a/third_party/uip-1.0/doc/html/ftv2plastnode.png b/third_party/uip-1.0/doc/html/ftv2plastnode.png new file mode 100644 index 0000000..0b07e00 Binary files /dev/null and b/third_party/uip-1.0/doc/html/ftv2plastnode.png differ diff --git a/third_party/uip-1.0/doc/html/ftv2pnode.png b/third_party/uip-1.0/doc/html/ftv2pnode.png new file mode 100644 index 0000000..2001b79 Binary files /dev/null and b/third_party/uip-1.0/doc/html/ftv2pnode.png differ diff --git a/third_party/uip-1.0/doc/html/ftv2vertline.png b/third_party/uip-1.0/doc/html/ftv2vertline.png new file mode 100644 index 0000000..b330f3a Binary files /dev/null and b/third_party/uip-1.0/doc/html/ftv2vertline.png differ diff --git a/third_party/uip-1.0/doc/html/functions.html b/third_party/uip-1.0/doc/html/functions.html new file mode 100644 index 0000000..ba50548 --- /dev/null +++ b/third_party/uip-1.0/doc/html/functions.html @@ -0,0 +1,217 @@ + + +uIP 1.0: Data Fields + + + + + + +
+ +
+
+ +
+ +

+Here is a list of all documented struct and union fields with links to the struct/union documentation for each field: +

+

- a -

+

- b -

+

- c -

+

- d -

+

- f -

+

- g -

+

- h -

+

- i -

+

- l -

+

- m -

+

- n -

+

- o -

+

- p -

+

- r -

+

- s -

+

- t -

+

- u -

+

- v -

+

- w -

+
Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/functions_vars.html b/third_party/uip-1.0/doc/html/functions_vars.html new file mode 100644 index 0000000..979215f --- /dev/null +++ b/third_party/uip-1.0/doc/html/functions_vars.html @@ -0,0 +1,217 @@ + + +uIP 1.0: Data Fields - Variables + + + + + + +
+ +
+
+ +
+ +

+  +

+

- a -

+

- b -

+

- c -

+

- d -

+

- f -

+

- g -

+

- h -

+

- i -

+

- l -

+

- m -

+

- n -

+

- o -

+

- p -

+

- r -

+

- s -

+

- t -

+

- u -

+

- v -

+

- w -

+
Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals.html b/third_party/uip-1.0/doc/html/globals.html new file mode 100644 index 0000000..d397465 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals.html @@ -0,0 +1,62 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- _ -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x61.html b/third_party/uip-1.0/doc/html/globals_0x61.html new file mode 100644 index 0000000..a17d6ed --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x61.html @@ -0,0 +1,64 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- a -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x62.html b/third_party/uip-1.0/doc/html/globals_0x62.html new file mode 100644 index 0000000..19cadd6 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x62.html @@ -0,0 +1,62 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- b -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x64.html b/third_party/uip-1.0/doc/html/globals_0x64.html new file mode 100644 index 0000000..748e08e --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x64.html @@ -0,0 +1,73 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- d -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x65.html b/third_party/uip-1.0/doc/html/globals_0x65.html new file mode 100644 index 0000000..4fbc9b7 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x65.html @@ -0,0 +1,62 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- e -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x66.html b/third_party/uip-1.0/doc/html/globals_0x66.html new file mode 100644 index 0000000..68e8d6c --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x66.html @@ -0,0 +1,62 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- f -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x68.html b/third_party/uip-1.0/doc/html/globals_0x68.html new file mode 100644 index 0000000..b72fb76 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x68.html @@ -0,0 +1,73 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- h -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x69.html b/third_party/uip-1.0/doc/html/globals_0x69.html new file mode 100644 index 0000000..e48d02a --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x69.html @@ -0,0 +1,84 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- i -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x6c.html b/third_party/uip-1.0/doc/html/globals_0x6c.html new file mode 100644 index 0000000..ef2c180 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x6c.html @@ -0,0 +1,66 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- l -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x6d.html b/third_party/uip-1.0/doc/html/globals_0x6d.html new file mode 100644 index 0000000..58da80d --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x6d.html @@ -0,0 +1,69 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- m -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x6e.html b/third_party/uip-1.0/doc/html/globals_0x6e.html new file mode 100644 index 0000000..01e8719 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x6e.html @@ -0,0 +1,63 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- n -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x70.html b/third_party/uip-1.0/doc/html/globals_0x70.html new file mode 100644 index 0000000..d7f12da --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x70.html @@ -0,0 +1,95 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- p -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x72.html b/third_party/uip-1.0/doc/html/globals_0x72.html new file mode 100644 index 0000000..d7789f4 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x72.html @@ -0,0 +1,69 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- r -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x73.html b/third_party/uip-1.0/doc/html/globals_0x73.html new file mode 100644 index 0000000..7823451 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x73.html @@ -0,0 +1,81 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- s -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x74.html b/third_party/uip-1.0/doc/html/globals_0x74.html new file mode 100644 index 0000000..be8583a --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x74.html @@ -0,0 +1,76 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- t -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x75.html b/third_party/uip-1.0/doc/html/globals_0x75.html new file mode 100644 index 0000000..bc731b9 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x75.html @@ -0,0 +1,237 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- u -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_0x77.html b/third_party/uip-1.0/doc/html/globals_0x77.html new file mode 100644 index 0000000..2b9a7fe --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_0x77.html @@ -0,0 +1,80 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation: +

+

- w -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs.html b/third_party/uip-1.0/doc/html/globals_defs.html new file mode 100644 index 0000000..46da3d3 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs.html @@ -0,0 +1,62 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- _ -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x61.html b/third_party/uip-1.0/doc/html/globals_defs_0x61.html new file mode 100644 index 0000000..456b236 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x61.html @@ -0,0 +1,64 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- a -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x62.html b/third_party/uip-1.0/doc/html/globals_defs_0x62.html new file mode 100644 index 0000000..d311097 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x62.html @@ -0,0 +1,62 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- b -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x64.html b/third_party/uip-1.0/doc/html/globals_defs_0x64.html new file mode 100644 index 0000000..bc83549 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x64.html @@ -0,0 +1,73 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- d -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x65.html b/third_party/uip-1.0/doc/html/globals_defs_0x65.html new file mode 100644 index 0000000..e2ef3c9 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x65.html @@ -0,0 +1,62 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- e -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x66.html b/third_party/uip-1.0/doc/html/globals_defs_0x66.html new file mode 100644 index 0000000..92a60e6 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x66.html @@ -0,0 +1,62 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- f -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x68.html b/third_party/uip-1.0/doc/html/globals_defs_0x68.html new file mode 100644 index 0000000..ff1a426 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x68.html @@ -0,0 +1,67 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- h -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x69.html b/third_party/uip-1.0/doc/html/globals_defs_0x69.html new file mode 100644 index 0000000..955f91b --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x69.html @@ -0,0 +1,84 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- i -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x6c.html b/third_party/uip-1.0/doc/html/globals_defs_0x6c.html new file mode 100644 index 0000000..d970ddb --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x6c.html @@ -0,0 +1,65 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- l -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x6d.html b/third_party/uip-1.0/doc/html/globals_defs_0x6d.html new file mode 100644 index 0000000..3e8c8d9 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x6d.html @@ -0,0 +1,66 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- m -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x6e.html b/third_party/uip-1.0/doc/html/globals_defs_0x6e.html new file mode 100644 index 0000000..51e3707 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x6e.html @@ -0,0 +1,63 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- n -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x70.html b/third_party/uip-1.0/doc/html/globals_defs_0x70.html new file mode 100644 index 0000000..d470b29 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x70.html @@ -0,0 +1,93 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- p -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x72.html b/third_party/uip-1.0/doc/html/globals_defs_0x72.html new file mode 100644 index 0000000..0d224b7 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x72.html @@ -0,0 +1,62 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- r -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x73.html b/third_party/uip-1.0/doc/html/globals_defs_0x73.html new file mode 100644 index 0000000..9a4c61f --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x73.html @@ -0,0 +1,70 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- s -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x74.html b/third_party/uip-1.0/doc/html/globals_defs_0x74.html new file mode 100644 index 0000000..360896d --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x74.html @@ -0,0 +1,72 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- t -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x75.html b/third_party/uip-1.0/doc/html/globals_defs_0x75.html new file mode 100644 index 0000000..322b62a --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x75.html @@ -0,0 +1,188 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- u -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_defs_0x77.html b/third_party/uip-1.0/doc/html/globals_defs_0x77.html new file mode 100644 index 0000000..821a8ab --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_defs_0x77.html @@ -0,0 +1,67 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- w -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_func.html b/third_party/uip-1.0/doc/html/globals_func.html new file mode 100644 index 0000000..49e7f12 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_func.html @@ -0,0 +1,136 @@ + + +uIP 1.0: Data Fields + + + + + + + +
+ +
+ +

+  +

+

- h -

+

- m -

+

- p -

+

- r -

+

- s -

+

- t -

+

- u -

+

- w -

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_type.html b/third_party/uip-1.0/doc/html/globals_type.html new file mode 100644 index 0000000..d5650f5 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_type.html @@ -0,0 +1,47 @@ + + +uIP 1.0: Data Fields + + + + + + + +  +

+

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/globals_vars.html b/third_party/uip-1.0/doc/html/globals_vars.html new file mode 100644 index 0000000..17aaa98 --- /dev/null +++ b/third_party/uip-1.0/doc/html/globals_vars.html @@ -0,0 +1,55 @@ + + +uIP 1.0: Data Fields + + + + + + + +  +

+

+
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/hierarchy.html b/third_party/uip-1.0/doc/html/hierarchy.html new file mode 100644 index 0000000..e6abde8 --- /dev/null +++ b/third_party/uip-1.0/doc/html/hierarchy.html @@ -0,0 +1,50 @@ + + +uIP 1.0: Hierarchical Index + + + + + + +

uIP 1.0 Class Hierarchy

This inheritance list is sorted roughly, but not completely, alphabetically: +
Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/index.hhc b/third_party/uip-1.0/doc/html/index.hhc new file mode 100644 index 0000000..b254803 --- /dev/null +++ b/third_party/uip-1.0/doc/html/index.hhc @@ -0,0 +1,192 @@ + + + + + +
    +
  • +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
  • +
      +
    • +
        +
      • +
          +
        +
      +
    • +
        +
      • +
          +
        +
      • +
          +
        +
      • +
          +
        +
      • +
          +
        +
      • +
          +
        +
      +
    • +
        +
      • +
          +
        +
      • +
          +
        +
      • +
          +
        +
      • +
          +
        +
      • +
          +
        +
      • +
          +
        +
      • +
          +
        +
      • +
          +
        +
      • +
          +
        +
      +
    • +
        +
      +
    • +
        +
      +
    • +
        +
      +
    • +
        +
      +
    • +
        +
      +
    +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
diff --git a/third_party/uip-1.0/doc/html/index.hhk b/third_party/uip-1.0/doc/html/index.hhk new file mode 100644 index 0000000..7e49662 --- /dev/null +++ b/third_party/uip-1.0/doc/html/index.hhk @@ -0,0 +1,450 @@ + + + + + +
    +
  • +
      +
    • +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    • +
    +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    • +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    +
  • +
      +
    • +
    • +
    +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
  • +
      +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    • +
    +
  • +
      +
    • +
    • +
    +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
  • +
diff --git a/third_party/uip-1.0/doc/html/index.hhp b/third_party/uip-1.0/doc/html/index.hhp new file mode 100644 index 0000000..b196db1 --- /dev/null +++ b/third_party/uip-1.0/doc/html/index.hhp @@ -0,0 +1,197 @@ +[OPTIONS] +Compatibility=1.1 +Full-text search=Yes +Contents file=index.hhc +Default Window=main +Default topic=main.html +Index file=index.hhk +Language=0x409 English (United States) +Binary TOC=YES +Create CHI file=YES +Title=uIP 1.0 + +[WINDOWS] +main="uIP 1.0","index.hhc","index.hhk","main.html","main.html",,,,,0x23520,,0x387e,,,,,,,,0 + +[FILES] +main.html +files.html +a00048.html +a00049.html +a00042.html +a00043.html +a00036.html +a00037.html +a00046.html +a00047.html +a00038.html +a00039.html +a00044.html +a00045.html +a00051.html +a00050.html +a00040.html +a00041.html +a00168.html +a00169.html +a00170.html +a00171.html +a00172.html +a00173.html +a00174.html +a00175.html +a00176.html +a00177.html +a00178.html +a00179.html +a00180.html +a00181.html +a00182.html +a00183.html +a00184.html +a00185.html +a00186.html +a00187.html +a00188.html +a00189.html +a00190.html +a00191.html +a00192.html +a00193.html +a00194.html +a00195.html +a00196.html +a00197.html +a00198.html +a00199.html +a00200.html +a00201.html +a00202.html +a00203.html +a00204.html +a00205.html +a00206.html +a00207.html +a00100.html +a00101.html +a00102.html +a00103.html +a00104.html +a00105.html +a00107.html +a00110.html +a00111.html +a00112.html +a00113.html +a00114.html +a00120.html +a00121.html +a00123.html +a00124.html +a00125.html +a00127.html +a00128.html +a00129.html +a00130.html +a00131.html +a00132.html +a00134.html +a00135.html +a00136.html +a00137.html +a00138.html +a00139.html +a00140.html +a00141.html +annotated.html +classes.html +hierarchy.html +functions.html +functions_vars.html +a00077.html +a00078.html +a00079.html +a00080.html +a00081.html +a00082.html +a00083.html +a00084.html +a00085.html +a00086.html +a00087.html +a00088.html +a00089.html +a00090.html +a00091.html +a00092.html +a00093.html +a00094.html +a00095.html +a00096.html +a00097.html +a00142.html +a00143.html +a00144.html +a00145.html +a00146.html +a00147.html +a00148.html +a00149.html +a00150.html +a00151.html +a00152.html +a00153.html +a00154.html +a00155.html +a00156.html +a00157.html +a00158.html +a00159.html +a00160.html +a00161.html +a00162.html +a00163.html +a00164.html +modules.html +examples.html +globals.html +globals_0x61.html +globals_0x62.html +globals_0x64.html +globals_0x65.html +globals_0x66.html +globals_0x68.html +globals_0x69.html +globals_0x6c.html +globals_0x6d.html +globals_0x6e.html +globals_0x70.html +globals_0x72.html +globals_0x73.html +globals_0x74.html +globals_0x75.html +globals_0x77.html +globals_func.html +globals_vars.html +globals_type.html +globals_defs.html +globals_defs_0x61.html +globals_defs_0x62.html +globals_defs_0x64.html +globals_defs_0x65.html +globals_defs_0x66.html +globals_defs_0x68.html +globals_defs_0x69.html +globals_defs_0x6c.html +globals_defs_0x6d.html +globals_defs_0x6e.html +globals_defs_0x70.html +globals_defs_0x72.html +globals_defs_0x73.html +globals_defs_0x74.html +globals_defs_0x75.html +globals_defs_0x77.html +tabs.css +tab_b.gif +tab_l.gif +tab_r.gif diff --git a/third_party/uip-1.0/doc/html/index.html b/third_party/uip-1.0/doc/html/index.html new file mode 100644 index 0000000..4ac2a69 --- /dev/null +++ b/third_party/uip-1.0/doc/html/index.html @@ -0,0 +1,8 @@ + + +uIP 1.0 + + + + + diff --git a/third_party/uip-1.0/doc/html/main.html b/third_party/uip-1.0/doc/html/main.html new file mode 100644 index 0000000..8fcb26b --- /dev/null +++ b/third_party/uip-1.0/doc/html/main.html @@ -0,0 +1,421 @@ + + +uIP 1.0: The uIP TCP/IP stack + + + + + +

The uIP TCP/IP stack

+

+

Author:
Adam Dunkels, http://www.sics.se/~adam/
+The uIP TCP/IP stack is intended to make it possible to communicate using the TCP/IP protocol suite even on small 8-bit micro-controllers. Despite being small and simple, uIP do not require their peers to have complex, full-size stacks, but can communicate with peers running a similarly light-weight stack. The code size is on the order of a few kilobytes and RAM usage can be configured to be as low as a few hundred bytes.

+uIP can be found at the uIP web page: http://www.sics.se/~adam/uip/

+

See also:
Application programs

+Compile-time configuration options

+Run-time configuration functions

+Initialization functions

+Device driver interface and variables used by device drivers

+uIP functions called from application programs (see below) and the protosockets API and their underlying protothreads

+

+Introduction

+With the success of the Internet, the TCP/IP protocol suite has become a global standard for communication. TCP/IP is the underlying protocol used for web page transfers, e-mail transmissions, file transfers, and peer-to-peer networking over the Internet. For embedded systems, being able to run native TCP/IP makes it possible to connect the system directly to an intranet or even the global Internet. Embedded devices with full TCP/IP support will be first-class network citizens, thus being able to fully communicate with other hosts in the network.

+Traditional TCP/IP implementations have required far too much resources both in terms of code size and memory usage to be useful in small 8 or 16-bit systems. Code size of a few hundred kilobytes and RAM requirements of several hundreds of kilobytes have made it impossible to fit the full TCP/IP stack into systems with a few tens of kilobytes of RAM and room for less than 100 kilobytes of code.

+The uIP implementation is designed to have only the absolute minimal set of features needed for a full TCP/IP stack. It can only handle a single network interface and contains the IP, ICMP, UDP and TCP protocols. uIP is written in the C programming language.

+Many other TCP/IP implementations for small systems assume that the embedded device always will communicate with a full-scale TCP/IP implementation running on a workstation-class machine. Under this assumption, it is possible to remove certain TCP/IP mechanisms that are very rarely used in such situations. Many of those mechanisms are essential, however, if the embedded device is to communicate with another equally limited device, e.g., when running distributed peer-to-peer services and protocols. uIP is designed to be RFC compliant in order to let the embedded devices to act as first-class network citizens. The uIP TCP/IP implementation that is not tailored for any specific application.

+TCP/IP Communication

+The full TCP/IP suite consists of numerous protocols, ranging from low level protocols such as ARP which translates IP addresses to MAC addresses, to application level protocols such as SMTP that is used to transfer e-mail. The uIP is mostly concerned with the TCP and IP protocols and upper layer protocols will be referred to as "the application". Lower layer protocols are often implemented in hardware or firmware and will be referred to as "the network device" that are controlled by the network device driver.

+TCP provides a reliable byte stream to the upper layer protocols. It breaks the byte stream into appropriately sized segments and each segment is sent in its own IP packet. The IP packets are sent out on the network by the network device driver. If the destination is not on the physically connected network, the IP packet is forwarded onto another network by a router that is situated between the two networks. If the maximum packet size of the other network is smaller than the size of the IP packet, the packet is fragmented into smaller packets by the router. If possible, the size of the TCP segments are chosen so that fragmentation is minimized. The final recipient of the packet will have to reassemble any fragmented IP packets before they can be passed to higher layers.

+The formal requirements for the protocols in the TCP/IP stack is specified in a number of RFC documents published by the Internet Engineering Task Force, IETF. Each of the protocols in the stack is defined in one more RFC documents and RFC1122 collects all requirements and updates the previous RFCs.

+The RFC1122 requirements can be divided into two categories; those that deal with the host to host communication and those that deal with communication between the application and the networking stack. An example of the first kind is "A TCP MUST be able to receive a TCP option in any segment" and an example of the second kind is "There MUST be a mechanism for reporting soft TCP error conditions to the application." A TCP/IP implementation that violates requirements of the first kind may not be able to communicate with other TCP/IP implementations and may even lead to network failures. Violation of the second kind of requirements will only affect the communication within the system and will not affect host-to-host communication.

+In uIP, all RFC requirements that affect host-to-host communication are implemented. However, in order to reduce code size, we have removed certain mechanisms in the interface between the application and the stack, such as the soft error reporting mechanism and dynamically configurable type-of-service bits for TCP connections. Since there are only very few applications that make use of those features they can be removed without loss of generality.

+Main Control Loop

+The uIP stack can be run either as a task in a multitasking system, or as the main program in a singletasking system. In both cases, the main control loop does two things repeatedly:

+

    +
  • Check if a packet has arrived from the network.
  • Check if a periodic timeout has occurred.
+

+If a packet has arrived, the input handler function, uip_input(), should be invoked by the main control loop. The input handler function will never block, but will return at once. When it returns, the stack or the application for which the incoming packet was intended may have produced one or more reply packets which should be sent out. If so, the network device driver should be called to send out these packets.

+Periodic timeouts are used to drive TCP mechanisms that depend on timers, such as delayed acknowledgments, retransmissions and round-trip time estimations. When the main control loop infers that the periodic timer should fire, it should invoke the timer handler function uip_periodic(). Because the TCP/IP stack may perform retransmissions when dealing with a timer event, the network device driver should called to send out the packets that may have been produced.

+Architecture Specific Functions

+uIP requires a few functions to be implemented specifically for the architecture on which uIP is intended to run. These functions should be hand-tuned for the particular architecture, but generic C implementations are given as part of the uIP distribution.

+Checksum Calculation

+The TCP and IP protocols implement a checksum that covers the data and header portions of the TCP and IP packets. Since the calculation of this checksum is made over all bytes in every packet being sent and received it is important that the function that calculates the checksum is efficient. Most often, this means that the checksum calculation must be fine-tuned for the particular architecture on which the uIP stack runs.

+While uIP includes a generic checksum function, it also leaves it open for an architecture specific implementation of the two functions uip_ipchksum() and uip_tcpchksum(). The checksum calculations in those functions can be written in highly optimized assembler rather than generic C code.

+32-bit Arithmetic

+The TCP protocol uses 32-bit sequence numbers, and a TCP implementation will have to do a number of 32-bit additions as part of the normal protocol processing. Since 32-bit arithmetic is not natively available on many of the platforms for which uIP is intended, uIP leaves the 32-bit additions to be implemented by the architecture specific module and does not make use of any 32-bit arithmetic in the main code base.

+While uIP implements a generic 32-bit addition, there is support for having an architecture specific implementation of the uip_add32() function.

+Memory Management

+In the architectures for which uIP is intended, RAM is the most scarce resource. With only a few kilobytes of RAM available for the TCP/IP stack to use, mechanisms used in traditional TCP/IP cannot be directly applied.

+The uIP stack does not use explicit dynamic memory allocation. Instead, it uses a single global buffer for holding packets and has a fixed table for holding connection state. The global packet buffer is large enough to contain one packet of maximum size. When a packet arrives from the network, the device driver places it in the global buffer and calls the TCP/IP stack. If the packet contains data, the TCP/IP stack will notify the corresponding application. Because the data in the buffer will be overwritten by the next incoming packet, the application will either have to act immediately on the data or copy the data into a secondary buffer for later processing. The packet buffer will not be overwritten by new packets before the application has processed the data. Packets that arrive when the application is processing the data must be queued, either by the network device or by the device driver. Most single-chip Ethernet controllers have on-chip buffers that are large enough to contain at least 4 maximum sized Ethernet frames. Devices that are handled by the processor, such as RS-232 ports, can copy incoming bytes to a separate buffer during application processing. If the buffers are full, the incoming packet is dropped. This will cause performance degradation, but only when multiple connections are running in parallel. This is because uIP advertises a very small receiver window, which means that only a single TCP segment will be in the network per connection.

+In uIP, the same global packet buffer that is used for incoming packets is also used for the TCP/IP headers of outgoing data. If the application sends dynamic data, it may use the parts of the global packet buffer that are not used for headers as a temporary storage buffer. To send the data, the application passes a pointer to the data as well as the length of the data to the stack. The TCP/IP headers are written into the global buffer and once the headers have been produced, the device driver sends the headers and the application data out on the network. The data is not queued for retransmissions. Instead, the application will have to reproduce the data if a retransmission is necessary.

+The total amount of memory usage for uIP depends heavily on the applications of the particular device in which the implementations are to be run. The memory configuration determines both the amount of traffic the system should be able to handle and the maximum amount of simultaneous connections. A device that will be sending large e-mails while at the same time running a web server with highly dynamic web pages and multiple simultaneous clients, will require more RAM than a simple Telnet server. It is possible to run the uIP implementation with as little as 200 bytes of RAM, but such a configuration will provide extremely low throughput and will only allow a small number of simultaneous connections.

+Application Program Interface (API)

+The Application Program Interface (API) defines the way the application program interacts with the TCP/IP stack. The most commonly used API for TCP/IP is the BSD socket API which is used in most Unix systems and has heavily influenced the Microsoft Windows WinSock API. Because the socket API uses stop-and-wait semantics, it requires support from an underlying multitasking operating system. Since the overhead of task management, context switching and allocation of stack space for the tasks might be too high in the intended uIP target architectures, the BSD socket interface is not suitable for our purposes.

+uIP provides two APIs to programmers: protosockets, a BSD socket-like API without the overhead of full multi-threading, and a "raw" event-based API that is nore low-level than protosockets but uses less memory.

+

See also:
Protosockets library

+Protothreads

+

+The uIP raw API

+The "raw" uIP API uses an event driven interface where the application is invoked in response to certain events. An application running on top of uIP is implemented as a C function that is called by uIP in response to certain events. uIP calls the application when data is received, when data has been successfully delivered to the other end of the connection, when a new connection has been set up, or when data has to be retransmitted. The application is also periodically polled for new data. The application program provides only one callback function; it is up to the application to deal with mapping different network services to different ports and connections. Because the application is able to act on incoming data and connection requests as soon as the TCP/IP stack receives the packet, low response times can be achieved even in low-end systems.

+uIP is different from other TCP/IP stacks in that it requires help from the application when doing retransmissions. Other TCP/IP stacks buffer the transmitted data in memory until the data is known to be successfully delivered to the remote end of the connection. If the data needs to be retransmitted, the stack takes care of the retransmission without notifying the application. With this approach, the data has to be buffered in memory while waiting for an acknowledgment even if the application might be able to quickly regenerate the data if a retransmission has to be made.

+In order to reduce memory usage, uIP utilizes the fact that the application may be able to regenerate sent data and lets the application take part in retransmissions. uIP does not keep track of packet contents after they have been sent by the device driver, and uIP requires that the application takes an active part in performing the retransmission. When uIP decides that a segment should be retransmitted, it calls the application with a flag set indicating that a retransmission is required. The application checks the retransmission flag and produces the same data that was previously sent. From the application's standpoint, performing a retransmission is not different from how the data originally was sent. Therefore the application can be written in such a way that the same code is used both for sending data and retransmitting data. Also, it is important to note that even though the actual retransmission operation is carried out by the application, it is the responsibility of the stack to know when the retransmission should be made. Thus the complexity of the application does not necessarily increase because it takes an active part in doing retransmissions.

+Application Events

+The application must be implemented as a C function, UIP_APPCALL(), that uIP calls whenever an event occurs. Each event has a corresponding test function that is used to distinguish between different events. The functions are implemented as C macros that will evaluate to either zero or non-zero. Note that certain events can happen in conjunction with each other (i.e., new data can arrive at the same time as data is acknowledged).

+The Connection Pointer

+When the application is called by uIP, the global variable uip_conn is set to point to the uip_conn structure for the connection that currently is handled, and is called the "current connection". The fields in the uip_conn structure for the current connection can be used, e.g., to distinguish between different services, or to check to which IP address the connection is connected. One typical use would be to inspect the uip_conn->lport (the local TCP port number) to decide which service the connection should provide. For instance, an application might decide to act as an HTTP server if the value of uip_conn->lport is equal to 80 and act as a TELNET server if the value is 23.

+Receiving Data

+If the uIP test function uip_newdata() is non-zero, the remote host of the connection has sent new data. The uip_appdata pointer point to the actual data. The size of the data is obtained through the uIP function uip_datalen(). The data is not buffered by uIP, but will be overwritten after the application function returns, and the application will therefor have to either act directly on the incoming data, or by itself copy the incoming data into a buffer for later processing.

+Sending Data

+When sending data, uIP adjusts the length of the data sent by the application according to the available buffer space and the current TCP window advertised by the receiver. The amount of buffer space is dictated by the memory configuration. It is therefore possible that all data sent from the application does not arrive at the receiver, and the application may use the uip_mss() function to see how much data that actually will be sent by the stack.

+The application sends data by using the uIP function uip_send(). The uip_send() function takes two arguments; a pointer to the data to be sent and the length of the data. If the application needs RAM space for producing the actual data that should be sent, the packet buffer (pointed to by the uip_appdata pointer) can be used for this purpose.

+The application can send only one chunk of data at a time on a connection and it is not possible to call uip_send() more than once per application invocation; only the data from the last call will be sent.

+Retransmitting Data

+Retransmissions are driven by the periodic TCP timer. Every time the periodic timer is invoked, the retransmission timer for each connection is decremented. If the timer reaches zero, a retransmission should be made. As uIP does not keep track of packet contents after they have been sent by the device driver, uIP requires that the application takes an active part in performing the retransmission. When uIP decides that a segment should be retransmitted, the application function is called with the uip_rexmit() flag set, indicating that a retransmission is required.

+The application must check the uip_rexmit() flag and produce the same data that was previously sent. From the application's standpoint, performing a retransmission is not different from how the data originally was sent. Therefor, the application can be written in such a way that the same code is used both for sending data and retransmitting data. Also, it is important to note that even though the actual retransmission operation is carried out by the application, it is the responsibility of the stack to know when the retransmission should be made. Thus the complexity of the application does not necessarily increase because it takes an active part in doing retransmissions.

+Closing Connections

+The application closes the current connection by calling the uip_close() during an application call. This will cause the connection to be cleanly closed. In order to indicate a fatal error, the application might want to abort the connection and does so by calling the uip_abort() function.

+If the connection has been closed by the remote end, the test function uip_closed() is true. The application may then do any necessary cleanups.

+Reporting Errors

+There are two fatal errors that can happen to a connection, either that the connection was aborted by the remote host, or that the connection retransmitted the last data too many times and has been aborted. uIP reports this by calling the application function. The application can use the two test functions uip_aborted() and uip_timedout() to test for those error conditions.

+Polling

+When a connection is idle, uIP polls the application every time the periodic timer fires. The application uses the test function uip_poll() to check if it is being polled by uIP.

+The polling event has two purposes. The first is to let the application periodically know that a connection is idle, which allows the application to close connections that have been idle for too long. The other purpose is to let the application send new data that has been produced. The application can only send data when invoked by uIP, and therefore the poll event is the only way to send data on an otherwise idle connection.

+Listening Ports

+uIP maintains a list of listening TCP ports. A new port is opened for listening with the uip_listen() function. When a connection request arrives on a listening port, uIP creates a new connection and calls the application function. The test function uip_connected() is true if the application was invoked because a new connection was created.

+The application can check the lport field in the uip_conn structure to check to which port the new connection was connected.

+Opening Connections

+New connections can be opened from within uIP by the function uip_connect(). This function allocates a new connection and sets a flag in the connection state which will open a TCP connection to the specified IP address and port the next time the connection is polled by uIP. The uip_connect() function returns a pointer to the uip_conn structure for the new connection. If there are no free connection slots, the function returns NULL.

+The function uip_ipaddr() may be used to pack an IP address into the two element 16-bit array used by uIP to represent IP addresses.

+Two examples of usage are shown below. The first example shows how to open a connection to TCP port 8080 of the remote end of the current connection. If there are not enough TCP connection slots to allow a new connection to be opened, the uip_connect() function returns NULL and the current connection is aborted by uip_abort().

+

void connect_example1_app(void) {
+   if(uip_connect(uip_conn->ripaddr, HTONS(8080)) == NULL) {
+      uip_abort();
+   }
+}   
+

+The second example shows how to open a new connection to a specific IP address. No error checks are made in this example.

+

void connect_example2(void) {
+   u16_t ipaddr[2];
+
+   uip_ipaddr(ipaddr, 192,168,0,1);
+   uip_connect(ipaddr, HTONS(8080));
+}
+

+Examples

+This section presents a number of very simple uIP applications. The uIP code distribution contains several more complex applications.

+A Very Simple Application

+This first example shows a very simple application. The application listens for incoming connections on port 1234. When a connection has been established, the application replies to all data sent to it by saying "ok"

+The implementation of this application is shown below. The application is initialized with the function called example1_init() and the uIP callback function is called example1_app(). For this application, the configuration variable UIP_APPCALL should be defined to be example1_app().

+

void example1_init(void) {
+   uip_listen(HTONS(1234));
+}
+
+void example1_app(void) {
+   if(uip_newdata() || uip_rexmit()) {
+      uip_send("ok\n", 3);
+   }
+}
+

+The initialization function calls the uIP function uip_listen() to register a listening port. The actual application function example1_app() uses the test functions uip_newdata() and uip_rexmit() to determine why it was called. If the application was called because the remote end has sent it data, it responds with an "ok". If the application function was called because data was lost in the network and has to be retransmitted, it also sends an "ok". Note that this example actually shows a complete uIP application. It is not required for an application to deal with all types of events such as uip_connected() or uip_timedout().

+A More Advanced Application

+This second example is slightly more advanced than the previous one, and shows how the application state field in the uip_conn structure is used.

+This application is similar to the first application in that it listens to a port for incoming connections and responds to data sent to it with a single "ok". The big difference is that this application prints out a welcoming "Welcome!" message when the connection has been established.

+This seemingly small change of operation makes a big difference in how the application is implemented. The reason for the increase in complexity is that if data should be lost in the network, the application must know what data to retransmit. If the "Welcome!" message was lost, the application must retransmit the welcome and if one of the "ok" messages is lost, the application must send a new "ok".

+The application knows that as long as the "Welcome!" message has not been acknowledged by the remote host, it might have been dropped in the network. But once the remote host has sent an acknowledgment back, the application can be sure that the welcome has been received and knows that any lost data must be an "ok" message. Thus the application can be in either of two states: either in the WELCOME-SENT state where the "Welcome!" has been sent but not acknowledged, or in the WELCOME-ACKED state where the "Welcome!" has been acknowledged.

+When a remote host connects to the application, the application sends the "Welcome!" message and sets it's state to WELCOME-SENT. When the welcome message is acknowledged, the application moves to the WELCOME-ACKED state. If the application receives any new data from the remote host, it responds by sending an "ok" back.

+If the application is requested to retransmit the last message, it looks at in which state the application is. If the application is in the WELCOME-SENT state, it sends a "Welcome!" message since it knows that the previous welcome message hasn't been acknowledged. If the application is in the WELCOME-ACKED state, it knows that the last message was an "ok" message and sends such a message.

+The implementation of this application is seen below. This configuration settings for the application is follows after its implementation.

+

struct example2_state {
+   enum {WELCOME_SENT, WELCOME_ACKED} state;
+};
+
+void example2_init(void) {
+   uip_listen(HTONS(2345));
+}
+
+void example2_app(void) {
+   struct example2_state *s;
+
+   s = (struct example2_state *)uip_conn->appstate;
+   
+   if(uip_connected()) {
+      s->state = WELCOME_SENT;
+      uip_send("Welcome!\n", 9);
+      return;
+   } 
+
+   if(uip_acked() && s->state == WELCOME_SENT) {
+      s->state = WELCOME_ACKED;
+   }
+
+   if(uip_newdata()) {
+      uip_send("ok\n", 3);
+   }
+
+   if(uip_rexmit()) {
+      switch(s->state) {
+      case WELCOME_SENT:
+         uip_send("Welcome!\n", 9);
+         break;
+      case WELCOME_ACKED:
+         uip_send("ok\n", 3);
+         break;
+      }
+   }
+}
+

+The configuration for the application:

+

#define UIP_APPCALL       example2_app
+#define UIP_APPSTATE_SIZE sizeof(struct example2_state)
+

+Differentiating Between Applications

+If the system should run multiple applications, one technique to differentiate between them is to use the TCP port number of either the remote end or the local end of the connection. The example below shows how the two examples above can be combined into one application.

+

void example3_init(void) {
+   example1_init();
+   example2_init();   
+}
+
+void example3_app(void) {
+   switch(uip_conn->lport) {
+   case HTONS(1234):
+      example1_app();
+      break;
+   case HTONS(2345):
+      example2_app();
+      break;
+   }
+}
+

+Utilizing TCP Flow Control

+This example shows a simple application that connects to a host, sends an HTTP request for a file and downloads it to a slow device such a disk drive. This shows how to use the flow control functions of uIP.

+

void example4_init(void) {
+   u16_t ipaddr[2];
+   uip_ipaddr(ipaddr, 192,168,0,1);
+   uip_connect(ipaddr, HTONS(80));
+}
+
+void example4_app(void) {
+   if(uip_connected() || uip_rexmit()) {
+      uip_send("GET /file HTTP/1.0\r\nServer:192.186.0.1\r\n\r\n",
+               48);
+      return;
+   }
+
+   if(uip_newdata()) {
+      device_enqueue(uip_appdata, uip_datalen());
+      if(device_queue_full()) {
+         uip_stop();
+      }
+   }
+
+   if(uip_poll() && uip_stopped()) {
+      if(!device_queue_full()) {
+         uip_restart();
+      }
+   }
+}
+

+When the connection has been established, an HTTP request is sent to the server. Since this is the only data that is sent, the application knows that if it needs to retransmit any data, it is that request that should be retransmitted. It is therefore possible to combine these two events as is done in the example.

+When the application receives new data from the remote host, it sends this data to the device by using the function device_enqueue(). It is important to note that this example assumes that this function copies the data into its own buffers. The data in the uip_appdata buffer will be overwritten by the next incoming packet.

+If the device's queue is full, the application stops the data from the remote host by calling the uIP function uip_stop(). The application can then be sure that it will not receive any new data until uip_restart() is called. The application polling event is used to check if the device's queue is no longer full and if so, the data flow is restarted with uip_restart().

+A Simple Web Server

+This example shows a very simple file server application that listens to two ports and uses the port number to determine which file to send. If the files are properly formatted, this simple application can be used as a web server with static pages. The implementation follows.

+

struct example5_state {
+   char *dataptr;
+   unsigned int dataleft;
+};
+
+void example5_init(void) {
+   uip_listen(HTONS(80));
+   uip_listen(HTONS(81));
+}
+
+void example5_app(void) {
+   struct example5_state *s;
+   s = (struct example5_state)uip_conn->appstate;
+   
+   if(uip_connected()) {
+      switch(uip_conn->lport) {
+      case HTONS(80):
+         s->dataptr = data_port_80;
+         s->dataleft = datalen_port_80;
+         break;
+      case HTONS(81):
+         s->dataptr = data_port_81;
+         s->dataleft = datalen_port_81;
+         break;
+      }
+      uip_send(s->dataptr, s->dataleft);
+      return;      
+   }
+
+   if(uip_acked()) {
+      if(s->dataleft < uip_mss()) {
+         uip_close();
+         return;
+      }
+      s->dataptr += uip_conn->len;
+      s->dataleft -= uip_conn->len;
+      uip_send(s->dataptr, s->dataleft);      
+   }
+}
+

+The application state consists of a pointer to the data that should be sent and the size of the data that is left to send. When a remote host connects to the application, the local port number is used to determine which file to send. The first chunk of data is sent using uip_send(). uIP makes sure that no more than MSS bytes of data is actually sent, even though s->dataleft may be larger than the MSS.

+The application is driven by incoming acknowledgments. When data has been acknowledged, new data can be sent. If there is no more data to send, the connection is closed using uip_close().

+Structured Application Program Design

+When writing larger programs using uIP it is useful to be able to utilize the uIP API in a structured way. The following example provides a structured design that has showed itself to be useful for writing larger protocol implementations than the previous examples showed here. The program is divided into an uIP event handler function that calls seven application handler functions that process new data, act on acknowledged data, send new data, deal with connection establishment or closure events and handle errors. The functions are called newdata(), acked(), senddata(), connected(), closed(), aborted(), and timedout(), and needs to be written specifically for the protocol that is being implemented.

+The uIP event handler function is shown below.

+

void example6_app(void) {
+  if(uip_aborted()) {
+    aborted();
+  }
+  if(uip_timedout()) {
+    timedout();
+  }
+  if(uip_closed()) {
+    closed();
+  }
+  if(uip_connected()) {
+    connected();
+  }
+  if(uip_acked()) {
+    acked();
+  }
+  if(uip_newdata()) {
+    newdata();
+  }
+  if(uip_rexmit() ||
+     uip_newdata() ||
+     uip_acked() ||
+     uip_connected() ||
+     uip_poll()) {
+    senddata();
+  }
+}
+

+The function starts with dealing with any error conditions that might have happened by checking if uip_aborted() or uip_timedout() are true. If so, the appropriate error function is called. Also, if the connection has been closed, the closed() function is called to the it deal with the event.

+Next, the function checks if the connection has just been established by checking if uip_connected() is true. The connected() function is called and is supposed to do whatever needs to be done when the connection is established, such as intializing the application state for the connection. Since it may be the case that data should be sent out, the senddata() function is called to deal with the outgoing data.

+The following very simple application serves as an example of how the application handler functions might look. This application simply waits for any data to arrive on the connection, and responds to the data by sending out the message "Hello world!". To illustrate how to develop an application state machine, this message is sent in two parts, first the "Hello" part and then the "world!" part.

+

#define STATE_WAITING 0
+#define STATE_HELLO   1
+#define STATE_WORLD   2
+
+struct example6_state {
+  u8_t state;
+  char *textptr;
+  int  textlen;
+};
+
+static void aborted(void) {}
+static void timedout(void) {}
+static void closed(void) {}
+
+static void connected(void) {
+  struct example6_state *s = (struct example6_state *)uip_conn->appstate;
+
+  s->state   = STATE_WAITING;
+  s->textlen = 0;
+}
+
+static void newdata(void) {
+  struct example6_state *s = (struct example6_state *)uip_conn->appstate;
+
+  if(s->state == STATE_WAITING) {
+    s->state   = STATE_HELLO;
+    s->textptr = "Hello ";
+    s->textlen = 6;
+  }
+}
+
+static void acked(void) {
+  struct example6_state *s = (struct example6_state *)uip_conn->appstate;
+  
+  s->textlen -= uip_conn->len;
+  s->textptr += uip_conn->len;
+  if(s->textlen == 0) {
+    switch(s->state) {
+    case STATE_HELLO:
+      s->state   = STATE_WORLD;
+      s->textptr = "world!\n";
+      s->textlen = 7;
+      break;
+    case STATE_WORLD:
+      uip_close();
+      break;
+    }
+  }
+}
+
+static void senddata(void) {
+  struct example6_state *s = (struct example6_state *)uip_conn->appstate;
+
+  if(s->textlen > 0) {
+    uip_send(s->textptr, s->textlen);
+  }
+}
+

+The application state consists of a "state" variable, a "textptr" pointer to a text message and the "textlen" length of the text message. The "state" variable can be either "STATE_WAITING", meaning that the application is waiting for data to arrive from the network, "STATE_HELLO", in which the application is sending the "Hello" part of the message, or "STATE_WORLD", in which the application is sending the "world!" message.

+The application does not handle errors or connection closing events, and therefore the aborted(), timedout() and closed() functions are implemented as empty functions.

+The connected() function will be called when a connection has been established, and in this case sets the "state" variable to be "STATE_WAITING" and the "textlen" variable to be zero, indicating that there is no message to be sent out.

+When new data arrives from the network, the newdata() function will be called by the event handler function. The newdata() function will check if the connection is in the "STATE_WAITING" state, and if so switches to the "STATE_HELLO" state and registers a 6 byte long "Hello " message with the connection. This message will later be sent out by the senddata() function.

+The acked() function is called whenever data that previously was sent has been acknowleged by the receiving host. This acked() function first reduces the amount of data that is left to send, by subtracting the length of the previously sent data (obtained from "uip_conn->len") from the "textlen" variable, and also adjusts the "textptr" pointer accordingly. It then checks if the "textlen" variable now is zero, which indicates that all data now has been successfully received, and if so changes application state. If the application was in the "STATE_HELLO" state, it switches state to "STATE_WORLD" and sets up a 7 byte "world!\n" message to be sent. If the application was in the "STATE_WORLD" state, it closes the connection.

+Finally, the senddata() function takes care of actually sending the data that is to be sent. It is called by the event handler function when new data has been received, when data has been acknowledged, when a new connection has been established, when the connection is polled because of inactivity, or when a retransmission should be made. The purpose of the senddata() function is to optionally format the data that is to be sent, and to call the uip_send() function to actually send out the data. In this particular example, the function simply calls uip_send() with the appropriate arguments if data is to be sent, after checking if data should be sent out or not as indicated by the "textlen" variable.

+It is important to note that the senddata() function never should affect the application state; this should only be done in the acked() and newdata() functions.

+Protocol Implementations

+The protocols in the TCP/IP protocol suite are designed in a layered fashion where each protocol performs a specific function and the interactions between the protocol layers are strictly defined. While the layered approach is a good way to design protocols, it is not always the best way to implement them. In uIP, the protocol implementations are tightly coupled in order to save code space.

+This section gives detailed information on the specific protocol implementations in uIP.

+IP --- Internet Protocol

+When incoming packets are processed by uIP, the IP layer is the first protocol that examines the packet. The IP layer does a few simple checks such as if the destination IP address of the incoming packet matches any of the local IP address and verifies the IP header checksum. Since there are no IP options that are strictly required and because they are very uncommon, any IP options in received packets are dropped.

+IP Fragment Reassembly

+IP fragment reassembly is implemented using a separate buffer that holds the packet to be reassembled. An incoming fragment is copied into the right place in the buffer and a bit map is used to keep track of which fragments have been received. Because the first byte of an IP fragment is aligned on an 8-byte boundary, the bit map requires a small amount of memory. When all fragments have been reassembled, the resulting IP packet is passed to the transport layer. If all fragments have not been received within a specified time frame, the packet is dropped.

+The current implementation only has a single buffer for holding packets to be reassembled, and therefore does not support simultaneous reassembly of more than one packet. Since fragmented packets are uncommon, this ought to be a reasonable decision. Extending the implementation to support multiple buffers would be straightforward, however.

+Broadcasts and Multicasts

+IP has the ability to broadcast and multicast packets on the local network. Such packets are addressed to special broadcast and multicast addresses. Broadcast is used heavily in many UDP based protocols such as the Microsoft Windows file-sharing SMB protocol. Multicast is primarily used in protocols used for multimedia distribution such as RTP. TCP is a point-to-point protocol and does not use broadcast or multicast packets. uIP current supports broadcast packets as well as sending multicast packets. Joining multicast groups (IGMP) and receiving non-local multicast packets is not currently supported.

+ICMP --- Internet Control Message Protocol

+The ICMP protocol is used for reporting soft error conditions and for querying host parameters. Its main use is, however, the echo mechanism which is used by the "ping" program.

+The ICMP implementation in uIP is very simple as itis restricted to only implement ICMP echo messages. Replies to echo messages are constructed by simply swapping the source and destination IP addresses of incoming echo requests and rewriting the ICMP header with the Echo-Reply message type. The ICMP checksum is adjusted using standard techniques (see RFC1624).

+Since only the ICMP echo message is implemented, there is no support for Path MTU discovery or ICMP redirect messages. Neither of these is strictly required for interoperability; they are performance enhancement mechanisms.

+TCP --- Transmission Control Protocol

+The TCP implementation in uIP is driven by incoming packets and timer events. Incoming packets are parsed by TCP and if the packet contains data that is to be delivered to the application, the application is invoked by the means of the application function call. If the incoming packet acknowledges previously sent data, the connection state is updated and the application is informed, allowing it to send out new data.

+Listening Connections

+TCP allows a connection to listen for incoming connection requests. In uIP, a listening connection is identified by the 16-bit port number and incoming connection requests are checked against the list of listening connections. This list of listening connections is dynamic and can be altered by the applications in the system.

+Sliding Window

+Most TCP implementations use a sliding window mechanism for sending data. Multiple data segments are sent in succession without waiting for an acknowledgment for each segment.

+The sliding window algorithm uses a lot of 32-bit operations and because 32-bit arithmetic is fairly expensive on most 8-bit CPUs, uIP does not implement it. Also, uIP does not buffer sent packets and a sliding window implementation that does not buffer sent packets will have to be supported by a complex application layer. Instead, uIP allows only a single TCP segment per connection to be unacknowledged at any given time.

+It is important to note that even though most TCP implementations use the sliding window algorithm, it is not required by the TCP specifications. Removing the sliding window mechanism does not affect interoperability in any way.

+Round-Trip Time Estimation

+TCP continuously estimates the current Round-Trip Time (RTT) of every active connection in order to find a suitable value for the retransmission time-out.

+The RTT estimation in uIP is implemented using TCP's periodic timer. Each time the periodic timer fires, it increments a counter for each connection that has unacknowledged data in the network. When an acknowledgment is received, the current value of the counter is used as a sample of the RTT. The sample is used together with Van Jacobson's standard TCP RTT estimation function to calculate an estimate of the RTT. Karn's algorithm is used to ensure that retransmissions do not skew the estimates.

+Retransmissions

+Retransmissions are driven by the periodic TCP timer. Every time the periodic timer is invoked, the retransmission timer for each connection is decremented. If the timer reaches zero, a retransmission should be made.

+As uIP does not keep track of packet contents after they have been sent by the device driver, uIP requires that the application takes an active part in performing the retransmission. When uIP decides that a segment should be retransmitted, it calls the application with a flag set indicating that a retransmission is required. The application checks the retransmission flag and produces the same data that was previously sent. From the application's standpoint, performing a retransmission is not different from how the data originally was sent. Therefore the application can be written in such a way that the same code is used both for sending data and retransmitting data. Also, it is important to note that even though the actual retransmission operation is carried out by the application, it is the responsibility of the stack to know when the retransmission should be made. Thus the complexity of the application does not necessarily increase because it takes an active part in doing retransmissions.

+Flow Control

+The purpose of TCP's flow control mechanisms is to allow communication between hosts with wildly varying memory dimensions. In each TCP segment, the sender of the segment indicates its available buffer space. A TCP sender must not send more data than the buffer space indicated by the receiver.

+In uIP, the application cannot send more data than the receiving host can buffer. And application cannot send more data than the amount of bytes it is allowed to send by the receiving host. If the remote host cannot accept any data at all, the stack initiates the zero window probing mechanism.

+Congestion Control

+The congestion control mechanisms limit the number of simultaneous TCP segments in the network. The algorithms used for congestion control are designed to be simple to implement and require only a few lines of code.

+Since uIP only handles one in-flight TCP segment per connection, the amount of simultaneous segments cannot be further limited, thus the congestion control mechanisms are not needed.

+Urgent Data

+TCP's urgent data mechanism provides an application-to-application notification mechanism, which can be used by an application to mark parts of the data stream as being more urgent than the normal stream. It is up to the receiving application to interpret the meaning of the urgent data.

+In many TCP implementations, including the BSD implementation, the urgent data feature increases the complexity of the implementation because it requires an asynchronous notification mechanism in an otherwise synchronous API. As uIP already use an asynchronous event based API, the implementation of the urgent data feature does not lead to increased complexity.

+Performance

+In TCP/IP implementations for high-end systems, processing time is dominated by the checksum calculation loop, the operation of copying packet data and context switching. Operating systems for high-end systems often have multiple protection domains for protecting kernel data from user processes and user processes from each other. Because the TCP/IP stack is run in the kernel, data has to be copied between the kernel space and the address space of the user processes and a context switch has to be performed once the data has been copied. Performance can be enhanced by combining the copy operation with the checksum calculation. Because high-end systems usually have numerous active connections, packet demultiplexing is also an expensive operation.

+A small embedded device does not have the necessary processing power to have multiple protection domains and the power to run a multitasking operating system. Therefore there is no need to copy data between the TCP/IP stack and the application program. With an event based API there is no context switch between the TCP/IP stack and the applications.

+In such limited systems, the TCP/IP processing overhead is dominated by the copying of packet data from the network device to host memory, and checksum calculation. Apart from the checksum calculation and copying, the TCP processing done for an incoming packet involves only updating a few counters and flags before handing the data over to the application. Thus an estimate of the CPU overhead of our TCP/IP implementations can be obtained by calculating the amount of CPU cycles needed for the checksum calculation and copying of a maximum sized packet.

+The Impact of Delayed Acknowledgments

+Most TCP receivers implement the delayed acknowledgment algorithm for reducing the number of pure acknowledgment packets sent. A TCP receiver using this algorithm will only send acknowledgments for every other received segment. If no segment is received within a specific time-frame, an acknowledgment is sent. The time-frame can be as high as 500 ms but typically is 200 ms.

+A TCP sender such as uIP that only handles a single outstanding TCP segment will interact poorly with the delayed acknowledgment algorithm. Because the receiver only receives a single segment at a time, it will wait as much as 500 ms before an acknowledgment is sent. This means that the maximum possible throughput is severely limited by the 500 ms idle time.

+Thus the maximum throughput equation when sending data from uIP will be $p = s / (t + t_d)$ where $s$ is the segment size and $t_d$ is the delayed acknowledgment timeout, which typically is between 200 and 500 ms. With a segment size of 1000 bytes, a round-trip time of 40 ms and a delayed acknowledgment timeout of 200 ms, the maximum throughput will be 4166 bytes per second. With the delayed acknowledgment algorithm disabled at the receiver, the maximum throughput would be 25000 bytes per second.

+It should be noted, however, that since small systems running uIP are not very likely to have large amounts of data to send, the delayed acknowledgmen t throughput degradation of uIP need not be very severe. Small amounts of data sent by such a system will not span more than a single TCP segment, and would therefore not be affected by the throughput degradation anyway.

+The maximum throughput when uIP acts as a receiver is not affected by the delayed acknowledgment throughput degradation.


Generated on Mon Jun 12 10:23:01 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/modules.html b/third_party/uip-1.0/doc/html/modules.html new file mode 100644 index 0000000..419784a --- /dev/null +++ b/third_party/uip-1.0/doc/html/modules.html @@ -0,0 +1,51 @@ + + +uIP 1.0: Module Index + + + + + +

uIP 1.0 Modules

Here is a list of all modules: +
Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by  + +doxygen 1.4.6
+ + diff --git a/third_party/uip-1.0/doc/html/tab_b.gif b/third_party/uip-1.0/doc/html/tab_b.gif new file mode 100644 index 0000000..0d62348 Binary files /dev/null and b/third_party/uip-1.0/doc/html/tab_b.gif differ diff --git a/third_party/uip-1.0/doc/html/tab_l.gif b/third_party/uip-1.0/doc/html/tab_l.gif new file mode 100644 index 0000000..9b1e633 Binary files /dev/null and b/third_party/uip-1.0/doc/html/tab_l.gif differ diff --git a/third_party/uip-1.0/doc/html/tab_r.gif b/third_party/uip-1.0/doc/html/tab_r.gif new file mode 100644 index 0000000..ce9dd9f Binary files /dev/null and b/third_party/uip-1.0/doc/html/tab_r.gif differ diff --git a/third_party/uip-1.0/doc/html/tabs.css b/third_party/uip-1.0/doc/html/tabs.css new file mode 100644 index 0000000..8442b9b --- /dev/null +++ b/third_party/uip-1.0/doc/html/tabs.css @@ -0,0 +1,102 @@ +/* tabs styles, based on http://www.alistapart.com/articles/slidingdoors */ + +DIV.tabs +{ + float : left; + width : 100%; + background : url("tab_b.gif") repeat-x bottom; + margin-bottom : 4px; +} + +DIV.tabs UL +{ + margin : 0px; + padding-left : 10px; + list-style : none; +} + +DIV.tabs LI, DIV.tabs FORM +{ + display : inline; + margin : 0px; + padding : 0px; +} + +DIV.tabs FORM +{ + float : right; +} + +DIV.tabs A +{ + float : left; + background : url("tab_r.gif") no-repeat right top; + border-bottom : 1px solid #84B0C7; + font-size : x-small; + font-weight : bold; + text-decoration : none; +} + +DIV.tabs A:hover +{ + background-position: 100% -150px; +} + +DIV.tabs A:link, DIV.tabs A:visited, +DIV.tabs A:active, DIV.tabs A:hover +{ + color: #1A419D; +} + +DIV.tabs SPAN +{ + float : left; + display : block; + background : url("tab_l.gif") no-repeat left top; + padding : 5px 9px; + white-space : nowrap; +} + +DIV.tabs INPUT +{ + float : right; + display : inline; + font-size : 1em; +} + +DIV.tabs TD +{ + font-size : x-small; + font-weight : bold; + text-decoration : none; +} + + + +/* Commented Backslash Hack hides rule from IE5-Mac \*/ +DIV.tabs SPAN {float : none;} +/* End IE5-Mac hack */ + +DIV.tabs A:hover SPAN +{ + background-position: 0% -150px; +} + +DIV.tabs LI#current A +{ + background-position: 100% -150px; + border-width : 0px; +} + +DIV.tabs LI#current SPAN +{ + background-position: 0% -150px; + padding-bottom : 6px; +} + +DIV.nav +{ + background : none; + border : none; + border-bottom : 1px solid #84B0C7; +} diff --git a/third_party/uip-1.0/doc/html/tree.html b/third_party/uip-1.0/doc/html/tree.html new file mode 100644 index 0000000..cab947c --- /dev/null +++ b/third_party/uip-1.0/doc/html/tree.html @@ -0,0 +1,223 @@ + + + + + + + TreeView + + + + + +
+

uIP 1.0

+
+

o*The uIP TCP/IP stack

+

o+File List

+ +

o+Data Structures

+ +

o+Class Hierarchy

+ +

o*Data Fields

+

o+Modules

+ +

o+Examples

+ +

\*Globals

+
+
+ + diff --git a/third_party/uip-1.0/doc/mobisys2003.pdf b/third_party/uip-1.0/doc/mobisys2003.pdf new file mode 100644 index 0000000..f5e7425 Binary files /dev/null and b/third_party/uip-1.0/doc/mobisys2003.pdf differ diff --git a/third_party/uip-1.0/doc/pt-doc.txt b/third_party/uip-1.0/doc/pt-doc.txt new file mode 100644 index 0000000..5dbceef --- /dev/null +++ b/third_party/uip-1.0/doc/pt-doc.txt @@ -0,0 +1,173 @@ +/** +\defgroup pt Protothreads + +Protothreads are a type of lightweight stackless threads designed for +severly memory constrained systems such as deeply embedded systems or +sensor network nodes. Protothreads provides linear code execution for +event-driven systems implemented in C. Protothreads can be used with +or without an RTOS. + +Protothreads are a extremely lightweight, stackless type of threads +that provides a blocking context on top of an event-driven system, +without the overhead of per-thread stacks. The purpose of protothreads +is to implement sequential flow of control without complex state +machines or full multi-threading. Protothreads provides conditional +blocking inside C functions. + +The advantage of protothreads over a purely event-driven approach is +that protothreads provides a sequential code structure that allows for +blocking functions. In purely event-driven systems, blocking must be +implemented by manually breaking the function into two pieces - one +for the piece of code before the blocking call and one for the code +after the blocking call. This makes it hard to use control structures +such as if() conditionals and while() loops. + +The advantage of protothreads over ordinary threads is that a +protothread do not require a separate stack. In memory constrained +systems, the overhead of allocating multiple stacks can consume large +amounts of the available memory. In contrast, each protothread only +requires between two and twelve bytes of state, depending on the +architecture. + +\note Because protothreads do not save the stack context across a +blocking call, local variables are not preserved when the +protothread blocks. This means that local variables should be used +with utmost care - if in doubt, do not use local variables inside a +protothread! + + +Main features: + + - No machine specific code - the protothreads library is pure C + + - Does not use error-prone functions such as longjmp() + + - Very small RAM overhead - only two bytes per protothread + + - Can be used with or without an OS + + - Provides blocking wait without full multi-threading or + stack-switching + +Examples applications: + + - Memory constrained systems + + - Event-driven protocol stacks + + - Deeply embedded systems + + - Sensor network nodes + +The protothreads API consists of four basic operations: +initialization: PT_INIT(), execution: PT_BEGIN(), conditional +blocking: PT_WAIT_UNTIL() and exit: PT_END(). On top of these, two +convenience functions are built: reversed condition blocking: +PT_WAIT_WHILE() and protothread blocking: PT_WAIT_THREAD(). + +\sa \ref pt "Protothreads API documentation" + +The protothreads library is released under a BSD-style license that +allows for both non-commercial and commercial usage. The only +requirement is that credit is given. + +\section authors Authors + +The protothreads library was written by Adam Dunkels +with support from Oliver Schmidt . + +\section pt-desc Protothreads + +Protothreads are a extremely lightweight, stackless threads that +provides a blocking context on top of an event-driven system, without +the overhead of per-thread stacks. The purpose of protothreads is to +implement sequential flow of control without using complex state +machines or full multi-threading. Protothreads provides conditional +blocking inside a C function. + +In memory constrained systems, such as deeply embedded systems, +traditional multi-threading may have a too large memory overhead. In +traditional multi-threading, each thread requires its own stack, that +typically is over-provisioned. The stacks may use large parts of the +available memory. + +The main advantage of protothreads over ordinary threads is that +protothreads are very lightweight: a protothread does not require its +own stack. Rather, all protothreads run on the same stack and context +switching is done by stack rewinding. This is advantageous in memory +constrained systems, where a stack for a thread might use a large part +of the available memory. A protothread only requires only two bytes of +memory per protothread. Moreover, protothreads are implemented in pure +C and do not require any machine-specific assembler code. + +A protothread runs within a single C function and cannot span over +other functions. A protothread may call normal C functions, but cannot +block inside a called function. Blocking inside nested function calls +is instead made by spawning a separate protothread for each +potentially blocking function. The advantage of this approach is that +blocking is explicit: the programmer knows exactly which functions +that block that which functions the never blocks. + +Protothreads are similar to asymmetric co-routines. The main +difference is that co-routines uses a separate stack for each +co-routine, whereas protothreads are stackless. The most similar +mechanism to protothreads are Python generators. These are also +stackless constructs, but have a different purpose. Protothreads +provides blocking contexts inside a C function, whereas Python +generators provide multiple exit points from a generator function. + +\section pt-autovars Local variables + +\note +Because protothreads do not save the stack context across a blocking +call, local variables are not preserved when the protothread +blocks. This means that local variables should be used with utmost +care - if in doubt, do not use local variables inside a protothread! + +\section pt-scheduling Scheduling + +A protothread is driven by repeated calls to the function in which the +protothread is running. Each time the function is called, the +protothread will run until it blocks or exits. Thus the scheduling of +protothreads is done by the application that uses protothreads. + +\section pt-impl Implementation + +Protothreads are implemented using \ref lc "local continuations". A +local continuation represents the current state of execution at a +particular place in the program, but does not provide any call history +or local variables. A local continuation can be set in a specific +function to capture the state of the function. After a local +continuation has been set can be resumed in order to restore the state +of the function at the point where the local continuation was set. + + +Local continuations can be implemented in a variety of ways: + + -# by using machine specific assembler code, + -# by using standard C constructs, or + -# by using compiler extensions. + +The first way works by saving and restoring the processor state, +except for stack pointers, and requires between 16 and 32 bytes of +memory per protothread. The exact amount of memory required depends on +the architecture. + +The standard C implementation requires only two bytes of state per +protothread and utilizes the C switch() statement in a non-obvious way +that is similar to Duff's device. This implementation does, however, +impose a slight restriction to the code that uses protothreads in that +the code cannot use switch() statements itself. + +Certain compilers has C extensions that can be used to implement +protothreads. GCC supports label pointers that can be used for this +purpose. With this implementation, protothreads require 4 bytes of RAM +per protothread. + +@{ + + +*/ + +/** @} */ + diff --git a/third_party/uip-1.0/doc/sicslogo.pdf b/third_party/uip-1.0/doc/sicslogo.pdf new file mode 100644 index 0000000..239a1bf Binary files /dev/null and b/third_party/uip-1.0/doc/sicslogo.pdf differ diff --git a/third_party/uip-1.0/doc/uip-code-style.c b/third_party/uip-1.0/doc/uip-code-style.c new file mode 100644 index 0000000..f4b8f87 --- /dev/null +++ b/third_party/uip-1.0/doc/uip-code-style.c @@ -0,0 +1,118 @@ +/* This is the official code style of uIP. */ + +/** + * \defgroup codestyle Coding style + * + * This is how a Doxygen module is documented - start with a \defgroup + * Doxygen keyword at the beginning of the file to define a module, + * and use the \addtogroup Doxygen keyword in all other files that + * belong to the same module. Typically, the \defgroup is placed in + * the .h file and \addtogroup in the .c file. + * + * @{ + */ + +/** + * \file + * A brief description of what this file is. + * \author + * Adam Dunkels + * + * Every file that is part of a documented module has to have + * a \file block, else it will not show up in the Doxygen + * "Modules" * section. + */ + +/* Single line comments look like this. */ + +/* + * Multi-line comments look like this. Comments should prefferably be + * full sentences, filled to look like real paragraphs. + */ + +#include "uip.h" + +/* + * Make sure that non-global variables are all maked with the static + * keyword. This keeps the size of the symbol table down. + */ +static int flag; + +/* + * All variables and functions that are visible outside of the file + * should have the module name prepended to them. This makes it easy + * to know where to look for function and variable definitions. + * + * Put dividers (a single-line comment consisting only of dashes) + * between functions. + */ +/*---------------------------------------------------------------------------*/ +/** + * \brief Use Doxygen documentation for functions. + * \param c Briefly describe all parameters. + * \return Briefly describe the return value. + * \retval 0 Functions that return a few specified values + * \retval 1 can use the \retval keyword instead of \return. + * + * Put a longer description of what the function does + * after the preamble of Doxygen keywords. + * + * This template should always be used to document + * functions. The text following the introduction is used + * as the function's documentation. + * + * Function prototypes have the return type on one line, + * the name and arguments on one line (with no space + * between the name and the first parenthesis), followed + * by a single curly bracket on its own line. + */ +void +code_style_example_function(void) +{ + /* + * Local variables should always be declared at the start of the + * function. + */ + int i; /* Use short variable names for loop + counters. */ + + /* + * There should be no space between keywords and the first + * parenthesis. There should be spaces around binary operators, no + * spaces between a unary operator and its operand. + * + * Curly brackets following for(), if(), do, and case() statements + * should follow the statement on the same line. + */ + for(i = 0; i < 10; ++i) { + /* + * Always use full blocks (curly brackets) after if(), for(), and + * while() statements, even though the statement is a single line + * of code. This makes the code easier to read and modifications + * are less error prone. + */ + if(i == c) { + return c; /* No parentesis around return values. */ + } else { /* The else keyword is placed inbetween + curly brackers, always on its own line. */ + c++; + } + } +} +/*---------------------------------------------------------------------------*/ +/* + * Static (non-global) functions do not need Doxygen comments. The + * name should not be prepended with the module name - doing so would + * create confusion. + */ +static void +an_example_function(void) +{ + +} +/*---------------------------------------------------------------------------*/ + +/* The following stuff ends the \defgroup block at the beginning of + the file: */ + +/** @} */ diff --git a/third_party/uip-1.0/doc/uip-code-style.txt b/third_party/uip-1.0/doc/uip-code-style.txt new file mode 100644 index 0000000..3cf54eb --- /dev/null +++ b/third_party/uip-1.0/doc/uip-code-style.txt @@ -0,0 +1,3 @@ +/** + \example uip-code-style.c + */ diff --git a/third_party/uip-1.0/doc/uip-doc.txt b/third_party/uip-1.0/doc/uip-doc.txt new file mode 100644 index 0000000..7afe009 --- /dev/null +++ b/third_party/uip-1.0/doc/uip-doc.txt @@ -0,0 +1,1180 @@ + + +/** +\mainpage The uIP TCP/IP stack +\author Adam Dunkels, http://www.sics.se/~adam/ + +The uIP TCP/IP stack is intended to make it possible to communicate +using the TCP/IP protocol suite even on small 8-bit +micro-controllers. Despite being small and simple, uIP do not require +their peers to have complex, full-size stacks, but can communicate +with peers running a similarly light-weight stack. The code size is on +the order of a few kilobytes and RAM usage can be configured to be as +low as a few hundred bytes. + +uIP can be found at the uIP web page: http://www.sics.se/~adam/uip/ + +\sa \ref apps "Application programs" +\sa \ref uipopt "Compile-time configuration options" +\sa \ref uipconffunc "Run-time configuration functions" +\sa \ref uipinit "Initialization functions" +\sa \ref uipdevfunc "Device driver interface" and + \ref uipdrivervars "variables used by device drivers" +\sa \ref uipappfunc "uIP functions called from application programs" +(see below) and the \ref psock "protosockets API" and their underlying +\ref pt "protothreads" + +\section uIPIntroduction Introduction + +With the success of the Internet, the TCP/IP protocol suite has become +a global standard for communication. TCP/IP is the underlying protocol +used for web page transfers, e-mail transmissions, file transfers, and +peer-to-peer networking over the Internet. For embedded systems, being +able to run native TCP/IP makes it possible to connect the system +directly to an intranet or even the global Internet. Embedded devices +with full TCP/IP support will be first-class network citizens, thus +being able to fully communicate with other hosts in the network. + +Traditional TCP/IP implementations have required far too much +resources both in terms of code size and memory usage to be useful in +small 8 or 16-bit systems. Code size of a few hundred kilobytes and +RAM requirements of several hundreds of kilobytes have made it +impossible to fit the full TCP/IP stack into systems with a few tens +of kilobytes of RAM and room for less than 100 kilobytes of +code. + +The uIP implementation is designed to have only the absolute minimal +set of features needed for a full TCP/IP stack. It can only handle a +single network interface and contains the IP, ICMP, UDP and TCP +protocols. uIP is written in the C programming language. + +Many other TCP/IP implementations for small systems assume that the +embedded device always will communicate with a full-scale TCP/IP +implementation running on a workstation-class machine. Under this +assumption, it is possible to remove certain TCP/IP mechanisms that +are very rarely used in such situations. Many of those mechanisms are +essential, however, if the embedded device is to communicate with +another equally limited device, e.g., when running distributed +peer-to-peer services and protocols. uIP is designed to be RFC +compliant in order to let the embedded devices to act as first-class +network citizens. The uIP TCP/IP implementation that is not tailored +for any specific application. + + +\section tcpip TCP/IP Communication + +The full TCP/IP suite consists of numerous protocols, ranging from low +level protocols such as ARP which translates IP addresses to MAC +addresses, to application level protocols such as SMTP that is used to +transfer e-mail. The uIP is mostly concerned with the TCP and IP +protocols and upper layer protocols will be referred to as "the +application". Lower layer protocols are often implemented in hardware +or firmware and will be referred to as "the network device" that are +controlled by the network device driver. + +TCP provides a reliable byte stream to the upper layer protocols. It +breaks the byte stream into appropriately sized segments and each +segment is sent in its own IP packet. The IP packets are sent out on +the network by the network device driver. If the destination is not on +the physically connected network, the IP packet is forwarded onto +another network by a router that is situated between the two +networks. If the maximum packet size of the other network is smaller +than the size of the IP packet, the packet is fragmented into smaller +packets by the router. If possible, the size of the TCP segments are +chosen so that fragmentation is minimized. The final recipient of the +packet will have to reassemble any fragmented IP packets before they +can be passed to higher layers. + +The formal requirements for the protocols in the TCP/IP stack is +specified in a number of RFC documents published by the Internet +Engineering Task Force, IETF. Each of the protocols in the stack is +defined in one more RFC documents and RFC1122 collects +all requirements and updates the previous RFCs. + +The RFC1122 requirements can be divided into two categories; those +that deal with the host to host communication and those that deal with +communication between the application and the networking stack. An +example of the first kind is "A TCP MUST be able to receive a TCP +option in any segment" and an example of the second kind is "There +MUST be a mechanism for reporting soft TCP error conditions to the +application." A TCP/IP implementation that violates requirements of +the first kind may not be able to communicate with other TCP/IP +implementations and may even lead to network failures. Violation of +the second kind of requirements will only affect the communication +within the system and will not affect host-to-host communication. + +In uIP, all RFC requirements that affect host-to-host communication +are implemented. However, in order to reduce code size, we have +removed certain mechanisms in the interface between the application +and the stack, such as the soft error reporting mechanism and +dynamically configurable type-of-service bits for TCP +connections. Since there are only very few applications that make use +of those features they can be removed without loss of generality. + +\section mainloop Main Control Loop + +The uIP stack can be run either as a task in a multitasking system, or +as the main program in a singletasking system. In both cases, the main +control loop does two things repeatedly: + + - Check if a packet has arrived from the network. + - Check if a periodic timeout has occurred. + +If a packet has arrived, the input handler function, uip_input(), +should be invoked by the main control loop. The input handler function +will never block, but will return at once. When it returns, the stack +or the application for which the incoming packet was intended may have +produced one or more reply packets which should be sent out. If so, +the network device driver should be called to send out these packets. + +Periodic timeouts are used to drive TCP mechanisms that depend on +timers, such as delayed acknowledgments, retransmissions and +round-trip time estimations. When the main control loop infers that +the periodic timer should fire, it should invoke the timer handler +function uip_periodic(). Because the TCP/IP stack may perform +retransmissions when dealing with a timer event, the network device +driver should called to send out the packets that may have been produced. + +\section arch Architecture Specific Functions + +uIP requires a few functions to be implemented specifically for the +architecture on which uIP is intended to run. These functions should +be hand-tuned for the particular architecture, but generic C +implementations are given as part of the uIP distribution. + +\subsection checksums Checksum Calculation + +The TCP and IP protocols implement a checksum that covers the data and +header portions of the TCP and IP packets. Since the calculation of +this checksum is made over all bytes in every packet being sent and +received it is important that the function that calculates the +checksum is efficient. Most often, this means that the checksum +calculation must be fine-tuned for the particular architecture on +which the uIP stack runs. + +While uIP includes a generic checksum function, it also leaves it open +for an architecture specific implementation of the two functions +uip_ipchksum() and uip_tcpchksum(). The checksum calculations in those +functions can be written in highly optimized assembler rather than +generic C code. + +\subsection longarith 32-bit Arithmetic + +The TCP protocol uses 32-bit sequence numbers, and a TCP +implementation will have to do a number of 32-bit additions as part of +the normal protocol processing. Since 32-bit arithmetic is not +natively available on many of the platforms for which uIP is intended, +uIP leaves the 32-bit additions to be implemented by the architecture +specific module and does not make use of any 32-bit arithmetic in the +main code base. + +While uIP implements a generic 32-bit addition, there is support for +having an architecture specific implementation of the uip_add32() +function. + + +\section memory Memory Management + +In the architectures for which uIP is intended, RAM is the most +scarce resource. With only a few kilobytes of RAM available for the +TCP/IP stack to use, mechanisms used in traditional TCP/IP cannot be +directly applied. + + +The uIP stack does not use explicit dynamic memory +allocation. Instead, it uses a single global buffer for holding +packets and has a fixed table for holding connection state. The global +packet buffer is large enough to contain one packet of maximum +size. When a packet arrives from the network, the device driver places +it in the global buffer and calls the TCP/IP stack. If the packet +contains data, the TCP/IP stack will notify the corresponding +application. Because the data in the buffer will be overwritten by the +next incoming packet, the application will either have to act +immediately on the data or copy the data into a secondary buffer for +later processing. The packet buffer will not be overwritten by new +packets before the application has processed the data. Packets that +arrive when the application is processing the data must be queued, +either by the network device or by the device driver. Most single-chip +Ethernet controllers have on-chip buffers that are large enough to +contain at least 4 maximum sized Ethernet frames. Devices that are +handled by the processor, such as RS-232 ports, can copy incoming +bytes to a separate buffer during application processing. If the +buffers are full, the incoming packet is dropped. This will cause +performance degradation, but only when multiple connections are +running in parallel. This is because uIP advertises a very small +receiver window, which means that only a single TCP segment will be in +the network per connection. + +In uIP, the same global packet buffer that is used for incoming +packets is also used for the TCP/IP headers of outgoing data. If the +application sends dynamic data, it may use the parts of the global +packet buffer that are not used for headers as a temporary storage +buffer. To send the data, the application passes a pointer to the data +as well as the length of the data to the stack. The TCP/IP headers are +written into the global buffer and once the headers have been +produced, the device driver sends the headers and the application data +out on the network. The data is not queued for +retransmissions. Instead, the application will have to reproduce the +data if a retransmission is necessary. + +The total amount of memory usage for uIP depends heavily on the +applications of the particular device in which the implementations are +to be run. The memory configuration determines both the amount of +traffic the system should be able to handle and the maximum amount of +simultaneous connections. A device that will be sending large e-mails +while at the same time running a web server with highly dynamic web +pages and multiple simultaneous clients, will require more RAM than a +simple Telnet server. It is possible to run the uIP implementation +with as little as 200 bytes of RAM, but such a configuration will +provide extremely low throughput and will only allow a small number of +simultaneous connections. + +\section api Application Program Interface (API) + + +The Application Program Interface (API) defines the way the +application program interacts with the TCP/IP stack. The most commonly +used API for TCP/IP is the BSD socket API which is used in most Unix +systems and has heavily influenced the Microsoft Windows WinSock +API. Because the socket API uses stop-and-wait semantics, it requires +support from an underlying multitasking operating system. Since the +overhead of task management, context switching and allocation of stack +space for the tasks might be too high in the intended uIP target +architectures, the BSD socket interface is not suitable for our +purposes. + +uIP provides two APIs to programmers: protosockets, a BSD socket-like +API without the overhead of full multi-threading, and a "raw" +event-based API that is nore low-level than protosockets but uses less +memory. + +\sa \ref psock +\sa \ref pt + + +\subsection rawapi The uIP raw API + +The "raw" uIP API uses an event driven interface where the application is +invoked in response to certain events. An application running on top +of uIP is implemented as a C function that is called by uIP in +response to certain events. uIP calls the application when data is +received, when data has been successfully delivered to the other end +of the connection, when a new connection has been set up, or when data +has to be retransmitted. The application is also periodically polled +for new data. The application program provides only one callback +function; it is up to the application to deal with mapping different +network services to different ports and connections. Because the +application is able to act on incoming data and connection requests as +soon as the TCP/IP stack receives the packet, low response times can +be achieved even in low-end systems. + +uIP is different from other TCP/IP stacks in that it requires help +from the application when doing retransmissions. Other TCP/IP stacks +buffer the transmitted data in memory until the data is known to be +successfully delivered to the remote end of the connection. If the +data needs to be retransmitted, the stack takes care of the +retransmission without notifying the application. With this approach, +the data has to be buffered in memory while waiting for an +acknowledgment even if the application might be able to quickly +regenerate the data if a retransmission has to be made. + +In order to reduce memory usage, uIP utilizes the fact that the +application may be able to regenerate sent data and lets the +application take part in retransmissions. uIP does not keep track of +packet contents after they have been sent by the device driver, and +uIP requires that the application takes an active part in performing +the retransmission. When uIP decides that a segment should be +retransmitted, it calls the application with a flag set indicating +that a retransmission is required. The application checks the +retransmission flag and produces the same data that was previously +sent. From the application's standpoint, performing a retransmission +is not different from how the data originally was sent. Therefore the +application can be written in such a way that the same code is used +both for sending data and retransmitting data. Also, it is important +to note that even though the actual retransmission operation is +carried out by the application, it is the responsibility of the stack +to know when the retransmission should be made. Thus the complexity of +the application does not necessarily increase because it takes an +active part in doing retransmissions. + +\subsubsection appevents Application Events + +The application must be implemented as a C function, UIP_APPCALL(), +that uIP calls whenever an event occurs. Each event has a corresponding +test function that is used to distinguish between different +events. The functions are implemented as C macros that will evaluate +to either zero or non-zero. Note that certain events can happen in +conjunction with each other (i.e., new data can arrive at the same +time as data is acknowledged). + +\subsubsection connstate The Connection Pointer + +When the application is called by uIP, the global variable uip_conn is +set to point to the uip_conn structure for the connection that +currently is handled, and is called the "current connection". The +fields in the uip_conn structure for the current connection can be +used, e.g., to distinguish between different services, or to check to +which IP address the connection is connected. One typical use would be +to inspect the uip_conn->lport (the local TCP port number) to decide +which service the connection should provide. For instance, an +application might decide to act as an HTTP server if the value of +uip_conn->lport is equal to 80 and act as a TELNET server if the value +is 23. + +\subsubsection recvdata Receiving Data + +If the uIP test function uip_newdata() is non-zero, the remote host of +the connection has sent new data. The uip_appdata pointer point to the +actual data. The size of the data is obtained through the uIP function +uip_datalen(). The data is not buffered by uIP, but will be +overwritten after the application function returns, and the +application will therefor have to either act directly on the incoming +data, or by itself copy the incoming data into a buffer for later +processing. + +\subsubsection senddata Sending Data + +When sending data, uIP adjusts the length of the data sent by the +application according to the available buffer space and the current +TCP window advertised by the receiver. The amount of buffer space is +dictated by the memory configuration. It is therefore possible that +all data sent from the application does not arrive at the receiver, +and the application may use the uip_mss() function to see how much +data that actually will be sent by the stack. + +The application sends data by using the uIP function uip_send(). The +uip_send() function takes two arguments; a pointer to the data to be +sent and the length of the data. If the application needs RAM space +for producing the actual data that should be sent, the packet buffer +(pointed to by the uip_appdata pointer) can be used for this purpose. + +The application can send only one chunk of data at a time on a +connection and it is not possible to call uip_send() more than once +per application invocation; only the data from the last call will be +sent. + +\subsubsection rexmitdata Retransmitting Data + +Retransmissions are driven by the periodic TCP timer. Every time the +periodic timer is invoked, the retransmission timer for each +connection is decremented. If the timer reaches zero, a retransmission +should be made. As uIP does not keep track of packet contents after they have +been sent by the device driver, uIP requires that the +application takes an active part in performing the +retransmission. When uIP decides that a segment should be +retransmitted, the application function is called with the +uip_rexmit() flag set, indicating that a retransmission is +required. + +The application must check the uip_rexmit() flag and produce the same +data that was previously sent. From the application's standpoint, +performing a retransmission is not different from how the data +originally was sent. Therefor, the application can be written in such +a way that the same code is used both for sending data and +retransmitting data. Also, it is important to note that even though +the actual retransmission operation is carried out by the application, +it is the responsibility of the stack to know when the retransmission +should be made. Thus the complexity of the application does not +necessarily increase because it takes an active part in doing +retransmissions. + +\subsubsection closing Closing Connections + +The application closes the current connection by calling the +uip_close() during an application call. This will cause the connection +to be cleanly closed. In order to indicate a fatal error, the +application might want to abort the connection and does so by calling +the uip_abort() function. + +If the connection has been closed by the remote end, the test function +uip_closed() is true. The application may then do any necessary +cleanups. + +\subsubsection errors Reporting Errors + +There are two fatal errors that can happen to a connection, either +that the connection was aborted by the remote host, or that the +connection retransmitted the last data too many times and has been +aborted. uIP reports this by calling the application function. The +application can use the two test functions uip_aborted() and +uip_timedout() to test for those error conditions. + +\subsubsection polling Polling + +When a connection is idle, uIP polls the application every time the +periodic timer fires. The application uses the test function +uip_poll() to check if it is being polled by uIP. + +The polling event has two purposes. The first is to let the +application periodically know that a connection is idle, which allows +the application to close connections that have been idle for too +long. The other purpose is to let the application send new data that +has been produced. The application can only send data when invoked by +uIP, and therefore the poll event is the only way to send data on an +otherwise idle connection. + +\subsubsection listen Listening Ports + +uIP maintains a list of listening TCP ports. A new port is opened for +listening with the uip_listen() function. When a connection request +arrives on a listening port, uIP creates a new connection and calls +the application function. The test function uip_connected() is true if +the application was invoked because a new connection was created. + +The application can check the lport field in the uip_conn structure to +check to which port the new connection was connected. + +\subsubsection connect Opening Connections + +New connections can be opened from within +uIP by the function uip_connect(). This function +allocates a new connection and sets a flag in the connection state +which will open a TCP connection to the specified IP address and port +the next time the connection is polled by uIP. The uip_connect() +function returns +a pointer to the uip_conn structure for the new +connection. If there are no free connection slots, the function +returns NULL. + +The function uip_ipaddr() may be used to pack an IP address into the +two element 16-bit array used by uIP to represent IP addresses. + +Two examples of usage are shown below. The first example shows how to +open a connection to TCP port 8080 of the remote end of the current +connection. If there are not enough TCP connection slots to allow a +new connection to be opened, the uip_connect() function returns NULL +and the current connection is aborted by uip_abort(). + +\code +void connect_example1_app(void) { + if(uip_connect(uip_conn->ripaddr, HTONS(8080)) == NULL) { + uip_abort(); + } +} +\endcode + +The second example shows how to open a new connection to a specific IP +address. No error checks are made in this example. + +\code +void connect_example2(void) { + u16_t ipaddr[2]; + + uip_ipaddr(ipaddr, 192,168,0,1); + uip_connect(ipaddr, HTONS(8080)); +} +\endcode + +\section examples Examples + +This section presents a number of very simple uIP applications. The +uIP code distribution contains several more complex applications. + +\subsection example1 A Very Simple Application + +This first example shows a very simple application. The application +listens for incoming connections on port 1234. When a connection has +been established, the application replies to all data sent to it by +saying "ok" + +The implementation of this application is shown below. The application +is initialized with the function called example1_init() and the uIP +callback function is called example1_app(). For this application, the +configuration variable UIP_APPCALL should be defined to be +example1_app(). + +\code +void example1_init(void) { + uip_listen(HTONS(1234)); +} + +void example1_app(void) { + if(uip_newdata() || uip_rexmit()) { + uip_send("ok\n", 3); + } +} +\endcode + +The initialization function calls the uIP function uip_listen() to +register a listening port. The actual application function +example1_app() uses the test functions uip_newdata() and uip_rexmit() +to determine why it was called. If the application was called because +the remote end has sent it data, it responds with an "ok". If the +application function was called because data was lost in the network +and has to be retransmitted, it also sends an "ok". Note that this +example actually shows a complete uIP application. It is not required +for an application to deal with all types of events such as +uip_connected() or uip_timedout(). + +\subsection example2 A More Advanced Application + +This second example is slightly more advanced than the previous one, +and shows how the application state field in the uip_conn structure is +used. + +This application is similar to the first application in that it +listens to a port for incoming connections and responds to data sent +to it with a single "ok". The big difference is that this application +prints out a welcoming "Welcome!" message when the connection has been +established. + +This seemingly small change of operation makes a big difference in how +the application is implemented. The reason for the increase in +complexity is that if data should be lost in the network, the +application must know what data to retransmit. If the "Welcome!" +message was lost, the application must retransmit the welcome and if +one of the "ok" messages is lost, the application must send a new +"ok". + +The application knows that as long as the "Welcome!" message has not +been acknowledged by the remote host, it might have been dropped in +the network. But once the remote host has sent an acknowledgment +back, the application can be sure that the welcome has been received +and knows that any lost data must be an "ok" message. Thus the +application can be in either of two states: either in the WELCOME-SENT +state where the "Welcome!" has been sent but not acknowledged, or in +the WELCOME-ACKED state where the "Welcome!" has been acknowledged. + +When a remote host connects to the application, the application sends +the "Welcome!" message and sets it's state to WELCOME-SENT. When the +welcome message is acknowledged, the application moves to the +WELCOME-ACKED state. If the application receives any new data from the +remote host, it responds by sending an "ok" back. + +If the application is requested to retransmit the last message, it +looks at in which state the application is. If the application is in +the WELCOME-SENT state, it sends a "Welcome!" message since it +knows that the previous welcome message hasn't been acknowledged. If +the application is in the WELCOME-ACKED state, it knows that the last +message was an "ok" message and sends such a message. + +The implementation of this application is seen below. This +configuration settings for the application is follows after its +implementation. + +\code +struct example2_state { + enum {WELCOME_SENT, WELCOME_ACKED} state; +}; + +void example2_init(void) { + uip_listen(HTONS(2345)); +} + +void example2_app(void) { + struct example2_state *s; + + s = (struct example2_state *)uip_conn->appstate; + + if(uip_connected()) { + s->state = WELCOME_SENT; + uip_send("Welcome!\n", 9); + return; + } + + if(uip_acked() && s->state == WELCOME_SENT) { + s->state = WELCOME_ACKED; + } + + if(uip_newdata()) { + uip_send("ok\n", 3); + } + + if(uip_rexmit()) { + switch(s->state) { + case WELCOME_SENT: + uip_send("Welcome!\n", 9); + break; + case WELCOME_ACKED: + uip_send("ok\n", 3); + break; + } + } +} +\endcode + +The configuration for the application: + +\code +#define UIP_APPCALL example2_app +#define UIP_APPSTATE_SIZE sizeof(struct example2_state) +\endcode + +\subsection example3 Differentiating Between Applications + +If the system should run multiple applications, one technique to +differentiate between them is to use the TCP port number of either the +remote end or the local end of the connection. The example below shows +how the two examples above can be combined into one application. + +\code +void example3_init(void) { + example1_init(); + example2_init(); +} + +void example3_app(void) { + switch(uip_conn->lport) { + case HTONS(1234): + example1_app(); + break; + case HTONS(2345): + example2_app(); + break; + } +} +\endcode + +\subsection example4 Utilizing TCP Flow Control + +This example shows a simple application that connects to a host, sends +an HTTP request for a file and downloads it to a slow device such a +disk drive. This shows how to use the flow control functions of uIP. + +\code +void example4_init(void) { + u16_t ipaddr[2]; + uip_ipaddr(ipaddr, 192,168,0,1); + uip_connect(ipaddr, HTONS(80)); +} + +void example4_app(void) { + if(uip_connected() || uip_rexmit()) { + uip_send("GET /file HTTP/1.0\r\nServer:192.186.0.1\r\n\r\n", + 48); + return; + } + + if(uip_newdata()) { + device_enqueue(uip_appdata, uip_datalen()); + if(device_queue_full()) { + uip_stop(); + } + } + + if(uip_poll() && uip_stopped()) { + if(!device_queue_full()) { + uip_restart(); + } + } +} +\endcode + +When the connection has been established, an HTTP request is sent to +the server. Since this is the only data that is sent, the application +knows that if it needs to retransmit any data, it is that request that +should be retransmitted. It is therefore possible to combine these two +events as is done in the example. + +When the application receives new data from the remote host, it sends +this data to the device by using the function device_enqueue(). It is +important to note that this example assumes that this function copies +the data into its own buffers. The data in the uip_appdata buffer will +be overwritten by the next incoming packet. + +If the device's queue is full, the application stops the data from the +remote host by calling the uIP function uip_stop(). The application +can then be sure that it will not receive any new data until +uip_restart() is called. The application polling event is used to +check if the device's queue is no longer full and if so, the data flow +is restarted with uip_restart(). + +\subsection example5 A Simple Web Server + +This example shows a very simple file server application that listens +to two ports and uses the port number to determine which file to +send. If the files are properly formatted, this simple application can +be used as a web server with static pages. The implementation follows. + +\code +struct example5_state { + char *dataptr; + unsigned int dataleft; +}; + +void example5_init(void) { + uip_listen(HTONS(80)); + uip_listen(HTONS(81)); +} + +void example5_app(void) { + struct example5_state *s; + s = (struct example5_state)uip_conn->appstate; + + if(uip_connected()) { + switch(uip_conn->lport) { + case HTONS(80): + s->dataptr = data_port_80; + s->dataleft = datalen_port_80; + break; + case HTONS(81): + s->dataptr = data_port_81; + s->dataleft = datalen_port_81; + break; + } + uip_send(s->dataptr, s->dataleft); + return; + } + + if(uip_acked()) { + if(s->dataleft < uip_mss()) { + uip_close(); + return; + } + s->dataptr += uip_conn->len; + s->dataleft -= uip_conn->len; + uip_send(s->dataptr, s->dataleft); + } +} +\endcode + +The application state consists of a pointer to the data that should be +sent and the size of the data that is left to send. When a remote host +connects to the application, the local port number is used to +determine which file to send. The first chunk of data is sent using +uip_send(). uIP makes sure that no more than MSS bytes of data is +actually sent, even though s->dataleft may be larger than the MSS. + +The application is driven by incoming acknowledgments. When data has +been acknowledged, new data can be sent. If there is no more data to +send, the connection is closed using uip_close(). + +\subsection example6 Structured Application Program Design + +When writing larger programs using uIP it is useful to be able to +utilize the uIP API in a structured way. The following example +provides a structured design that has showed itself to be useful for +writing larger protocol implementations than the previous examples +showed here. The program is divided into an uIP event handler function +that calls seven application handler functions that process new data, +act on acknowledged data, send new data, deal with connection +establishment or closure events and handle errors. The functions are +called newdata(), acked(), senddata(), connected(), closed(), +aborted(), and timedout(), and needs to be written specifically for +the protocol that is being implemented. + +The uIP event handler function is shown below. + +\code +void example6_app(void) { + if(uip_aborted()) { + aborted(); + } + if(uip_timedout()) { + timedout(); + } + if(uip_closed()) { + closed(); + } + if(uip_connected()) { + connected(); + } + if(uip_acked()) { + acked(); + } + if(uip_newdata()) { + newdata(); + } + if(uip_rexmit() || + uip_newdata() || + uip_acked() || + uip_connected() || + uip_poll()) { + senddata(); + } +} +\endcode + +The function starts with dealing with any error conditions that might +have happened by checking if uip_aborted() or uip_timedout() are +true. If so, the appropriate error function is called. Also, if the +connection has been closed, the closed() function is called to the it +deal with the event. + +Next, the function checks if the connection has just been established +by checking if uip_connected() is true. The connected() function is +called and is supposed to do whatever needs to be done when the +connection is established, such as intializing the application state +for the connection. Since it may be the case that data should be sent +out, the senddata() function is called to deal with the outgoing data. + +The following very simple application serves as an example of how the +application handler functions might look. This application simply +waits for any data to arrive on the connection, and responds to the +data by sending out the message "Hello world!". To illustrate how to +develop an application state machine, this message is sent in two +parts, first the "Hello" part and then the "world!" part. + +\code +#define STATE_WAITING 0 +#define STATE_HELLO 1 +#define STATE_WORLD 2 + +struct example6_state { + u8_t state; + char *textptr; + int textlen; +}; + +static void aborted(void) {} +static void timedout(void) {} +static void closed(void) {} + +static void connected(void) { + struct example6_state *s = (struct example6_state *)uip_conn->appstate; + + s->state = STATE_WAITING; + s->textlen = 0; +} + +static void newdata(void) { + struct example6_state *s = (struct example6_state *)uip_conn->appstate; + + if(s->state == STATE_WAITING) { + s->state = STATE_HELLO; + s->textptr = "Hello "; + s->textlen = 6; + } +} + +static void acked(void) { + struct example6_state *s = (struct example6_state *)uip_conn->appstate; + + s->textlen -= uip_conn->len; + s->textptr += uip_conn->len; + if(s->textlen == 0) { + switch(s->state) { + case STATE_HELLO: + s->state = STATE_WORLD; + s->textptr = "world!\n"; + s->textlen = 7; + break; + case STATE_WORLD: + uip_close(); + break; + } + } +} + +static void senddata(void) { + struct example6_state *s = (struct example6_state *)uip_conn->appstate; + + if(s->textlen > 0) { + uip_send(s->textptr, s->textlen); + } +} +\endcode + +The application state consists of a "state" variable, a "textptr" +pointer to a text message and the "textlen" length of the text +message. The "state" variable can be either "STATE_WAITING", meaning +that the application is waiting for data to arrive from the network, +"STATE_HELLO", in which the application is sending the "Hello" part of +the message, or "STATE_WORLD", in which the application is sending the +"world!" message. + +The application does not handle errors or connection closing events, +and therefore the aborted(), timedout() and closed() functions are +implemented as empty functions. + +The connected() function will be called when a connection has been +established, and in this case sets the "state" variable to be +"STATE_WAITING" and the "textlen" variable to be zero, indicating that +there is no message to be sent out. + +When new data arrives from the network, the newdata() function will be +called by the event handler function. The newdata() function will +check if the connection is in the "STATE_WAITING" state, and if so +switches to the "STATE_HELLO" state and registers a 6 byte long "Hello +" message with the connection. This message will later be sent out by +the senddata() function. + +The acked() function is called whenever data that previously was sent +has been acknowleged by the receiving host. This acked() function +first reduces the amount of data that is left to send, by subtracting +the length of the previously sent data (obtained from "uip_conn->len") +from the "textlen" variable, and also adjusts the "textptr" pointer +accordingly. It then checks if the "textlen" variable now is zero, +which indicates that all data now has been successfully received, and +if so changes application state. If the application was in the +"STATE_HELLO" state, it switches state to "STATE_WORLD" and sets up a +7 byte "world!\n" message to be sent. If the application was in the +"STATE_WORLD" state, it closes the connection. + +Finally, the senddata() function takes care of actually sending the +data that is to be sent. It is called by the event handler function +when new data has been received, when data has been acknowledged, when +a new connection has been established, when the connection is polled +because of inactivity, or when a retransmission should be made. The +purpose of the senddata() function is to optionally format the data +that is to be sent, and to call the uip_send() function to actually +send out the data. In this particular example, the function simply +calls uip_send() with the appropriate arguments if data is to be sent, +after checking if data should be sent out or not as indicated by the +"textlen" variable. + +It is important to note that the senddata() function never should +affect the application state; this should only be done in the acked() +and newdata() functions. + +\section protoimpl Protocol Implementations + +The protocols in the TCP/IP protocol suite are designed in a layered +fashion where each protocol performs a specific function and the +interactions between the protocol layers are strictly defined. While +the layered approach is a good way to design protocols, it is not +always the best way to implement them. In uIP, the protocol +implementations are tightly coupled in order to save code space. + +This section gives detailed information on the specific protocol +implementations in uIP. + +\subsection ip IP --- Internet Protocol + +When incoming packets are processed by uIP, the IP layer is the first +protocol that examines the packet. The IP layer does a few simple +checks such as if the destination IP address of the incoming packet +matches any of the local IP address and verifies the IP header +checksum. Since there are no IP options that are strictly required and +because they are very uncommon, any IP options in received packets are +dropped. + +\subsubsection ipreass IP Fragment Reassembly + +IP fragment reassembly is implemented using a separate buffer that +holds the packet to be reassembled. An incoming fragment is copied +into the right place in the buffer and a bit map is used to keep track +of which fragments have been received. Because the first byte of an IP +fragment is aligned on an 8-byte boundary, the bit map requires a +small amount of memory. When all fragments have been reassembled, the +resulting IP packet is passed to the transport layer. If all fragments +have not been received within a specified time frame, the packet is +dropped. + +The current implementation only has a single buffer for holding +packets to be reassembled, and therefore does not support simultaneous +reassembly of more than one packet. Since fragmented packets are +uncommon, this ought to be a reasonable decision. Extending the +implementation to support multiple buffers would be straightforward, +however. + +\subsubsection ipbroadcast Broadcasts and Multicasts + +IP has the ability to broadcast and multicast packets on the local +network. Such packets are addressed to special broadcast and multicast +addresses. Broadcast is used heavily in many UDP based protocols such +as the Microsoft Windows file-sharing SMB protocol. Multicast is +primarily used in protocols used for multimedia distribution such as +RTP. TCP is a point-to-point protocol and does not use broadcast or +multicast packets. uIP current supports broadcast packets as well as +sending multicast packets. Joining multicast groups (IGMP) and +receiving non-local multicast packets is not currently supported. + +\subsection icmp ICMP --- Internet Control Message Protocol + +The ICMP protocol is used for reporting soft error conditions and for +querying host parameters. Its main use is, however, the echo mechanism +which is used by the "ping" program. + +The ICMP implementation in uIP is very simple as itis restricted to +only implement ICMP echo messages. Replies to echo messages are +constructed by simply swapping the source and destination IP addresses +of incoming echo requests and rewriting the ICMP header with the +Echo-Reply message type. The ICMP checksum is adjusted using standard +techniques (see RFC1624). + +Since only the ICMP echo message is implemented, there is no support +for Path MTU discovery or ICMP redirect messages. Neither of these is +strictly required for interoperability; they are performance +enhancement mechanisms. + +\subsection tcp TCP --- Transmission Control Protocol + +The TCP implementation in uIP is driven by incoming packets and timer +events. Incoming packets are parsed by TCP and if the packet contains +data that is to be delivered to the application, the application is +invoked by the means of the application function call. If the incoming +packet acknowledges previously sent data, the connection state is +updated and the application is informed, allowing it to send out new +data. + +\subsubsection listeb Listening Connections + +TCP allows a connection to listen for incoming connection requests. In +uIP, a listening connection is identified by the 16-bit port number +and incoming connection requests are checked against the list of +listening connections. This list of listening connections is dynamic +and can be altered by the applications in the system. + +\subsubsection slidingwindow Sliding Window + +Most TCP implementations use a sliding window mechanism for sending +data. Multiple data segments are sent in succession without waiting +for an acknowledgment for each segment. + +The sliding window algorithm uses a lot of 32-bit operations and +because 32-bit arithmetic is fairly expensive on most 8-bit CPUs, uIP +does not implement it. Also, uIP does not buffer sent packets and a +sliding window implementation that does not buffer sent packets will have +to be supported by a complex application layer. Instead, uIP allows +only a single TCP segment per connection to be unacknowledged at any +given time. + +It is important to note that even though most TCP implementations use +the sliding window algorithm, it is not required by the TCP +specifications. Removing the sliding window mechanism does not affect +interoperability in any way. + +\subsubsection rttest Round-Trip Time Estimation + +TCP continuously estimates the current Round-Trip Time (RTT) of every +active connection in order to find a suitable value for the +retransmission time-out. + +The RTT estimation in uIP is implemented using TCP's periodic +timer. Each time the periodic timer fires, it increments a counter for +each connection that has unacknowledged data in the network. When an +acknowledgment is received, the current value of the counter is used +as a sample of the RTT. The sample is used together with Van +Jacobson's standard TCP RTT estimation function to calculate an +estimate of the RTT. Karn's algorithm is used to ensure that +retransmissions do not skew the estimates. + +\subsubsection rexmit Retransmissions + +Retransmissions are driven by the periodic TCP timer. Every time the +periodic timer is invoked, the retransmission timer for each +connection is decremented. If the timer reaches zero, a retransmission +should be made. + +As uIP does not keep track of packet contents after they have +been sent by the device driver, uIP requires that the +application takes an active part in performing the +retransmission. When uIP decides that a segment should be +retransmitted, it calls the application with a flag set indicating +that a retransmission is required. The application checks the +retransmission flag and produces the same data that was previously +sent. From the application's standpoint, performing a retransmission +is not different from how the data originally was sent. Therefore the +application can be written in such a way that the same code is used +both for sending data and retransmitting data. Also, it is important +to note that even though the actual retransmission operation is +carried out by the application, it is the responsibility of the stack +to know when the retransmission should be made. Thus the complexity of +the application does not necessarily increase because it takes an +active part in doing retransmissions. + +\subsubsection flowcontrol Flow Control + +The purpose of TCP's flow control mechanisms is to allow communication +between hosts with wildly varying memory dimensions. In each TCP +segment, the sender of the segment indicates its available buffer +space. A TCP sender must not send more data than the buffer space +indicated by the receiver. + +In uIP, the application cannot send more data than the receiving host +can buffer. And application cannot send more data than the amount of +bytes it is allowed to send by the receiving host. If the remote host +cannot accept any data at all, the stack initiates the zero window +probing mechanism. + +\subsubsection congestioncontrol Congestion Control + +The congestion control mechanisms limit the number of simultaneous TCP +segments in the network. The algorithms used for congestion control +are designed to be simple to implement and require only a few lines of +code. + +Since uIP only handles one in-flight TCP segment per connection, +the amount of simultaneous segments cannot be further limited, thus +the congestion control mechanisms are not needed. + +\subsubsection urgdata Urgent Data + +TCP's urgent data mechanism provides an application-to-application +notification mechanism, which can be used by an application to mark +parts of the data stream as being more urgent than the normal +stream. It is up to the receiving application to interpret the meaning +of the urgent data. + +In many TCP implementations, including the BSD implementation, the +urgent data feature increases the complexity of the implementation +because it requires an asynchronous notification mechanism in an +otherwise synchronous API. As uIP already use an asynchronous event +based API, the implementation of the urgent data feature does not lead +to increased complexity. + +\section performance Performance + +In TCP/IP implementations for high-end systems, processing time is +dominated by the checksum calculation loop, the operation of copying +packet data and context switching. Operating systems for high-end +systems often have multiple protection domains for protecting kernel +data from user processes and user processes from each other. Because +the TCP/IP stack is run in the kernel, data has to be copied between +the kernel space and the address space of the user processes and a +context switch has to be performed once the data has been +copied. Performance can be enhanced by combining the copy operation +with the checksum calculation. Because high-end systems usually have +numerous active connections, packet demultiplexing is also an +expensive operation. + +A small embedded device does not have the necessary processing power +to have multiple protection domains and the power to run a +multitasking operating system. Therefore there is no need to copy +data between the TCP/IP stack and the application program. With an +event based API there is no context switch between the TCP/IP stack +and the applications. + +In such limited systems, the TCP/IP processing overhead is dominated +by the copying of packet data from the network device to host memory, +and checksum calculation. Apart from the checksum calculation and +copying, the TCP processing done for an incoming packet involves only +updating a few counters and flags before handing the data over to the +application. Thus an estimate of the CPU overhead of our TCP/IP +implementations can be obtained by calculating the amount of CPU +cycles needed for the checksum calculation and copying of a maximum +sized packet. + +\subsection delack The Impact of Delayed Acknowledgments + +Most TCP receivers implement the delayed acknowledgment algorithm for +reducing the number of pure acknowledgment packets sent. A TCP +receiver using this algorithm will only send acknowledgments for every +other received segment. If no segment is received within a specific +time-frame, an acknowledgment is sent. The time-frame can be as high +as 500 ms but typically is 200 ms. + +A TCP sender such as uIP that only handles a single outstanding TCP +segment will interact poorly with the delayed acknowledgment +algorithm. Because the receiver only receives a single segment at a +time, it will wait as much as 500 ms before an acknowledgment is +sent. This means that the maximum possible throughput is severely +limited by the 500 ms idle time. + +Thus the maximum throughput equation when sending data from uIP will +be $p = s / (t + t_d)$ where $s$ is the segment size and $t_d$ is the +delayed acknowledgment timeout, which typically is between 200 and +500 ms. With a segment size of 1000 bytes, a round-trip time of 40 ms +and a delayed acknowledgment timeout of 200 ms, the maximum +throughput will be 4166 bytes per second. With the delayed acknowledgment +algorithm disabled at the receiver, the maximum throughput would be +25000 bytes per second. + +It should be noted, however, that since small systems running uIP are +not very likely to have large amounts of data to send, the delayed +acknowledgmen t throughput degradation of uIP need not be very +severe. Small amounts of data sent by such a system will not span more +than a single TCP segment, and would therefore not be affected by the +throughput degradation anyway. + +The maximum throughput when uIP acts as a receiver is not affected by +the delayed acknowledgment throughput degradation. + + + +*/ + + +/** @} */ + diff --git a/third_party/uip-1.0/doc/uip-refman.pdf b/third_party/uip-1.0/doc/uip-refman.pdf new file mode 100644 index 0000000..8dc8005 --- /dev/null +++ b/third_party/uip-1.0/doc/uip-refman.pdf @@ -0,0 +1,39280 @@ +%PDF-1.4 +5 0 obj +<< /S /GoTo /D (chapter.1) >> +endobj +8 0 obj +(The uIP TCP/IP stack ) +endobj +9 0 obj +<< /S /GoTo /D (section.1.1) >> +endobj +12 0 obj +(Introduction) +endobj +13 0 obj +<< /S /GoTo /D (section.1.2) >> +endobj +16 0 obj +(TCP/IP Communication) +endobj +17 0 obj +<< /S /GoTo /D (section.1.3) >> +endobj +20 0 obj +(Main Control Loop) +endobj +21 0 obj +<< /S /GoTo /D (section.1.4) >> +endobj +24 0 obj +(Architecture Specific Functions) +endobj +25 0 obj +<< /S /GoTo /D (section.1.5) >> +endobj +28 0 obj +(Memory Management) +endobj +29 0 obj +<< /S /GoTo /D (section.1.6) >> +endobj +32 0 obj +(Application Program Interface \(API\)) +endobj +33 0 obj +<< /S /GoTo /D (section.1.7) >> +endobj +36 0 obj +(Examples) +endobj +37 0 obj +<< /S /GoTo /D (section.1.8) >> +endobj +40 0 obj +(Protocol Implementations) +endobj +41 0 obj +<< /S /GoTo /D (section.1.9) >> +endobj +44 0 obj +(Performance) +endobj +45 0 obj +<< /S /GoTo /D (chapter.2) >> +endobj +48 0 obj +(uIP 1.0 Module Index) +endobj +49 0 obj +<< /S /GoTo /D (section.2.1) >> +endobj +52 0 obj +(uIP 1.0 Modules) +endobj +53 0 obj +<< /S /GoTo /D (chapter.3) >> +endobj +56 0 obj +(uIP 1.0 Hierarchical Index) +endobj +57 0 obj +<< /S /GoTo /D (section.3.1) >> +endobj +60 0 obj +(uIP 1.0 Class Hierarchy) +endobj +61 0 obj +<< /S /GoTo /D (chapter.4) >> +endobj +64 0 obj +(uIP 1.0 Data Structure Index) +endobj +65 0 obj +<< /S /GoTo /D (section.4.1) >> +endobj +68 0 obj +(uIP 1.0 Data Structures) +endobj +69 0 obj +<< /S /GoTo /D (chapter.5) >> +endobj +72 0 obj +(uIP 1.0 File Index) +endobj +73 0 obj +<< /S /GoTo /D (section.5.1) >> +endobj +76 0 obj +(uIP 1.0 File List) +endobj +77 0 obj +<< /S /GoTo /D (chapter.6) >> +endobj +80 0 obj +(uIP 1.0 Module Documentation) +endobj +81 0 obj +<< /S /GoTo /D (section.6.1) >> +endobj +84 0 obj +(Protothreads) +endobj +85 0 obj +<< /S /GoTo /D (section.6.2) >> +endobj +88 0 obj +(Applications) +endobj +89 0 obj +<< /S /GoTo /D (section.6.3) >> +endobj +92 0 obj +(uIP configuration functions) +endobj +93 0 obj +<< /S /GoTo /D (section.6.4) >> +endobj +96 0 obj +(uIP initialization functions) +endobj +97 0 obj +<< /S /GoTo /D (section.6.5) >> +endobj +100 0 obj +(uIP device driver functions) +endobj +101 0 obj +<< /S /GoTo /D (section.6.6) >> +endobj +104 0 obj +(uIP application functions) +endobj +105 0 obj +<< /S /GoTo /D (section.6.7) >> +endobj +108 0 obj +(uIP conversion functions) +endobj +109 0 obj +<< /S /GoTo /D (section.6.8) >> +endobj +112 0 obj +(Variables used in uIP device drivers) +endobj +113 0 obj +<< /S /GoTo /D (section.6.9) >> +endobj +116 0 obj +(The uIP TCP/IP stack) +endobj +117 0 obj +<< /S /GoTo /D (section.6.10) >> +endobj +120 0 obj +(Architecture specific uIP functions) +endobj +121 0 obj +<< /S /GoTo /D (section.6.11) >> +endobj +124 0 obj +(uIP Address Resolution Protocol) +endobj +125 0 obj +<< /S /GoTo /D (section.6.12) >> +endobj +128 0 obj +(Configuration options for uIP) +endobj +129 0 obj +<< /S /GoTo /D (section.6.13) >> +endobj +132 0 obj +(uIP TCP throughput booster hack) +endobj +133 0 obj +<< /S /GoTo /D (section.6.14) >> +endobj +136 0 obj +(Local continuations) +endobj +137 0 obj +<< /S /GoTo /D (section.6.15) >> +endobj +140 0 obj +(Timer library) +endobj +141 0 obj +<< /S /GoTo /D (section.6.16) >> +endobj +144 0 obj +(Clock interface) +endobj +145 0 obj +<< /S /GoTo /D (section.6.17) >> +endobj +148 0 obj +(Protosockets library) +endobj +149 0 obj +<< /S /GoTo /D (section.6.18) >> +endobj +152 0 obj +(Memory block management functions) +endobj +153 0 obj +<< /S /GoTo /D (section.6.19) >> +endobj +156 0 obj +(DNS resolver) +endobj +157 0 obj +<< /S /GoTo /D (section.6.20) >> +endobj +160 0 obj +(SMTP E-mail sender) +endobj +161 0 obj +<< /S /GoTo /D (section.6.21) >> +endobj +164 0 obj +(Telnet server) +endobj +165 0 obj +<< /S /GoTo /D (section.6.22) >> +endobj +168 0 obj +(Hello, world) +endobj +169 0 obj +<< /S /GoTo /D (section.6.23) >> +endobj +172 0 obj +(Web client) +endobj +173 0 obj +<< /S /GoTo /D (section.6.24) >> +endobj +176 0 obj +(Web server) +endobj +177 0 obj +<< /S /GoTo /D (chapter.7) >> +endobj +180 0 obj +(uIP 1.0 Data Structure Documentation) +endobj +181 0 obj +<< /S /GoTo /D (section.7.1) >> +endobj +184 0 obj +(dhcpc\137state Struct Reference) +endobj +185 0 obj +<< /S /GoTo /D (section.7.2) >> +endobj +188 0 obj +(hello\137world\137state Struct Reference) +endobj +189 0 obj +<< /S /GoTo /D (section.7.3) >> +endobj +192 0 obj +(httpd\137cgi\137call Struct Reference) +endobj +193 0 obj +<< /S /GoTo /D (section.7.4) >> +endobj +196 0 obj +(httpd\137state Struct Reference) +endobj +197 0 obj +<< /S /GoTo /D (section.7.5) >> +endobj +200 0 obj +(memb\137blocks Struct Reference) +endobj +201 0 obj +<< /S /GoTo /D (section.7.6) >> +endobj +204 0 obj +(psock Struct Reference) +endobj +205 0 obj +<< /S /GoTo /D (section.7.7) >> +endobj +208 0 obj +(psock\137buf Struct Reference) +endobj +209 0 obj +<< /S /GoTo /D (section.7.8) >> +endobj +212 0 obj +(pt Struct Reference) +endobj +213 0 obj +<< /S /GoTo /D (section.7.9) >> +endobj +216 0 obj +(smtp\137state Struct Reference) +endobj +217 0 obj +<< /S /GoTo /D (section.7.10) >> +endobj +220 0 obj +(telnetd\137state Struct Reference) +endobj +221 0 obj +<< /S /GoTo /D (section.7.11) >> +endobj +224 0 obj +(timer Struct Reference) +endobj +225 0 obj +<< /S /GoTo /D (section.7.12) >> +endobj +228 0 obj +(uip\137conn Struct Reference) +endobj +229 0 obj +<< /S /GoTo /D (section.7.13) >> +endobj +232 0 obj +(uip\137eth\137addr Struct Reference) +endobj +233 0 obj +<< /S /GoTo /D (section.7.14) >> +endobj +236 0 obj +(uip\137eth\137hdr Struct Reference) +endobj +237 0 obj +<< /S /GoTo /D (section.7.15) >> +endobj +240 0 obj +(uip\137icmpip\137hdr Struct Reference) +endobj +241 0 obj +<< /S /GoTo /D (section.7.16) >> +endobj +244 0 obj +(uip\137neighbor\137addr Struct Reference) +endobj +245 0 obj +<< /S /GoTo /D (section.7.17) >> +endobj +248 0 obj +(uip\137stats Struct Reference) +endobj +249 0 obj +<< /S /GoTo /D (section.7.18) >> +endobj +252 0 obj +(uip\137tcpip\137hdr Struct Reference) +endobj +253 0 obj +<< /S /GoTo /D (section.7.19) >> +endobj +256 0 obj +(uip\137udp\137conn Struct Reference) +endobj +257 0 obj +<< /S /GoTo /D (section.7.20) >> +endobj +260 0 obj +(uip\137udpip\137hdr Struct Reference) +endobj +261 0 obj +<< /S /GoTo /D (section.7.21) >> +endobj +264 0 obj +(webclient\137state Struct Reference) +endobj +265 0 obj +<< /S /GoTo /D (chapter.8) >> +endobj +268 0 obj +(uIP 1.0 File Documentation) +endobj +269 0 obj +<< /S /GoTo /D (section.8.1) >> +endobj +272 0 obj +(apps/hello-world/hello-world.c File Reference) +endobj +273 0 obj +<< /S /GoTo /D (section.8.2) >> +endobj +276 0 obj +(apps/hello-world/hello-world.h File Reference) +endobj +277 0 obj +<< /S /GoTo /D (section.8.3) >> +endobj +280 0 obj +(apps/resolv/resolv.c File Reference) +endobj +281 0 obj +<< /S /GoTo /D (section.8.4) >> +endobj +284 0 obj +(apps/resolv/resolv.h File Reference) +endobj +285 0 obj +<< /S /GoTo /D (section.8.5) >> +endobj +288 0 obj +(apps/smtp/smtp.c File Reference) +endobj +289 0 obj +<< /S /GoTo /D (section.8.6) >> +endobj +292 0 obj +(apps/smtp/smtp.h File Reference) +endobj +293 0 obj +<< /S /GoTo /D (section.8.7) >> +endobj +296 0 obj +(apps/telnetd/shell.c File Reference) +endobj +297 0 obj +<< /S /GoTo /D (section.8.8) >> +endobj +300 0 obj +(apps/telnetd/shell.h File Reference) +endobj +301 0 obj +<< /S /GoTo /D (section.8.9) >> +endobj +304 0 obj +(apps/telnetd/telnetd.c File Reference) +endobj +305 0 obj +<< /S /GoTo /D (section.8.10) >> +endobj +308 0 obj +(apps/telnetd/telnetd.h File Reference) +endobj +309 0 obj +<< /S /GoTo /D (section.8.11) >> +endobj +312 0 obj +(apps/webclient/webclient.c File Reference) +endobj +313 0 obj +<< /S /GoTo /D (section.8.12) >> +endobj +316 0 obj +(apps/webclient/webclient.h File Reference) +endobj +317 0 obj +<< /S /GoTo /D (section.8.13) >> +endobj +320 0 obj +(apps/webserver/httpd-cgi.c File Reference) +endobj +321 0 obj +<< /S /GoTo /D (section.8.14) >> +endobj +324 0 obj +(apps/webserver/httpd-cgi.h File Reference) +endobj +325 0 obj +<< /S /GoTo /D (section.8.15) >> +endobj +328 0 obj +(apps/webserver/httpd.c File Reference) +endobj +329 0 obj +<< /S /GoTo /D (section.8.16) >> +endobj +332 0 obj +(lib/memb.c File Reference) +endobj +333 0 obj +<< /S /GoTo /D (section.8.17) >> +endobj +336 0 obj +(lib/memb.h File Reference) +endobj +337 0 obj +<< /S /GoTo /D (section.8.18) >> +endobj +340 0 obj +(uip/lc-addrlabels.h File Reference) +endobj +341 0 obj +<< /S /GoTo /D (section.8.19) >> +endobj +344 0 obj +(uip/lc-switch.h File Reference) +endobj +345 0 obj +<< /S /GoTo /D (section.8.20) >> +endobj +348 0 obj +(uip/lc.h File Reference) +endobj +349 0 obj +<< /S /GoTo /D (section.8.21) >> +endobj +352 0 obj +(uip/psock.h File Reference) +endobj +353 0 obj +<< /S /GoTo /D (section.8.22) >> +endobj +356 0 obj +(uip/pt.h File Reference) +endobj +357 0 obj +<< /S /GoTo /D (section.8.23) >> +endobj +360 0 obj +(uip/timer.c File Reference) +endobj +361 0 obj +<< /S /GoTo /D (section.8.24) >> +endobj +364 0 obj +(uip/timer.h File Reference) +endobj +365 0 obj +<< /S /GoTo /D (section.8.25) >> +endobj +368 0 obj +(uip/uip-neighbor.c File Reference) +endobj +369 0 obj +<< /S /GoTo /D (section.8.26) >> +endobj +372 0 obj +(uip/uip-neighbor.h File Reference) +endobj +373 0 obj +<< /S /GoTo /D (section.8.27) >> +endobj +376 0 obj +(uip/uip-split.h File Reference) +endobj +377 0 obj +<< /S /GoTo /D (section.8.28) >> +endobj +380 0 obj +(uip/uip.c File Reference) +endobj +381 0 obj +<< /S /GoTo /D (section.8.29) >> +endobj +384 0 obj +(uip/uip.h File Reference) +endobj +385 0 obj +<< /S /GoTo /D (section.8.30) >> +endobj +388 0 obj +(uip/uip\137arch.h File Reference) +endobj +389 0 obj +<< /S /GoTo /D (section.8.31) >> +endobj +392 0 obj +(uip/uip\137arp.c File Reference) +endobj +393 0 obj +<< /S /GoTo /D (section.8.32) >> +endobj +396 0 obj +(uip/uip\137arp.h File Reference) +endobj +397 0 obj +<< /S /GoTo /D (section.8.33) >> +endobj +400 0 obj +(uip/uipopt.h File Reference) +endobj +401 0 obj +<< /S /GoTo /D (section.8.34) >> +endobj +404 0 obj +(unix/uip-conf.h File Reference) +endobj +405 0 obj +<< /S /GoTo /D (chapter.9) >> +endobj +408 0 obj +(uIP 1.0 Example Documentation) +endobj +409 0 obj +<< /S /GoTo /D (section.9.1) >> +endobj +412 0 obj +(dhcpc.c) +endobj +413 0 obj +<< /S /GoTo /D (section.9.2) >> +endobj +416 0 obj +(dhcpc.h) +endobj +417 0 obj +<< /S /GoTo /D (section.9.3) >> +endobj +420 0 obj +(example-mainloop-with-arp.c) +endobj +421 0 obj +<< /S /GoTo /D (section.9.4) >> +endobj +424 0 obj +(example-mainloop-without-arp.c) +endobj +425 0 obj +<< /S /GoTo /D (section.9.5) >> +endobj +428 0 obj +(hello-world.c) +endobj +429 0 obj +<< /S /GoTo /D (section.9.6) >> +endobj +432 0 obj +(hello-world.h) +endobj +433 0 obj +<< /S /GoTo /D (section.9.7) >> +endobj +436 0 obj +(resolv.c) +endobj +437 0 obj +<< /S /GoTo /D (section.9.8) >> +endobj +440 0 obj +(resolv.h) +endobj +441 0 obj +<< /S /GoTo /D (section.9.9) >> +endobj +444 0 obj +(smtp.c) +endobj +445 0 obj +<< /S /GoTo /D (section.9.10) >> +endobj +448 0 obj +(smtp.h) +endobj +449 0 obj +<< /S /GoTo /D (section.9.11) >> +endobj +452 0 obj +(telnetd.c) +endobj +453 0 obj +<< /S /GoTo /D (section.9.12) >> +endobj +456 0 obj +(telnetd.h) +endobj +457 0 obj +<< /S /GoTo /D (section.9.13) >> +endobj +460 0 obj +(uip-code-style.c) +endobj +461 0 obj +<< /S /GoTo /D (section.9.14) >> +endobj +464 0 obj +(uip-conf.h) +endobj +465 0 obj +<< /S /GoTo /D (section.9.15) >> +endobj +468 0 obj +(webclient.c) +endobj +469 0 obj +<< /S /GoTo /D (section.9.16) >> +endobj +472 0 obj +(webclient.h) +endobj +473 0 obj +<< /S /GoTo /D [474 0 R /Fit ] >> +endobj +477 0 obj << +/Length 382 +/Filter /FlateDecode +>> +stream +xÚRMOÜ@ ½çWø¸{ˆ×ö|ß @«Eª%7ÔCšÌ–$[ÈFýû|°D”JÕÆc¿÷Æó< ”C pÆaPÚBÕd?SúKÆsY‹Jû…\y…¼…\H!‹×KØ_p–€XCnŒFOVø§"Û|NWˆFçC±V©ìÅÁ WÔ÷«â!®s1´ê·7SpÕüˆuëéT\Ül^+wDzz\/®Giv(lô m ¤†5¡"¶ÿf¤)øwñ%¶Õ øZ¶}ùô¦«1y&ƒ®³hI9ȃÅ´…¯ûv& +‘hÙUqòCØ¢¶dA±ÇÀf0ž!5HâGÌ"LµçsNl¶ Ãå!»ÍàöÍå“l¾Ð}5yѱJâ<ÚdùØòy]6SË—}û¸fZŧn~°]ÒsÚÛaªŒÁ˜iDebŸuûªÃ.~ä~îûwþßýŽõ¾{˜®Ý¶Ýqì³q‡Ý´_š_)ù2·ÚCyçèð‘Y»ÿûÇwõ¬Ùendstream +endobj +474 0 obj << +/Type /Page +/Contents 477 0 R +/Resources 476 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 486 0 R +>> endobj +475 0 obj << +/Type /XObject +/Subtype /Form +/FormType 1 +/PTEX.FileName (../sicslogo.pdf) +/PTEX.PageNumber 1 +/PTEX.InfoDict 487 0 R +/Matrix [1.00000000 0.00000000 0.00000000 1.00000000 0.00000000 0.00000000] +/BBox [0.00000000 0.00000000 242.00000000 58.00000000] +/Resources << +/ProcSet [ /PDF ] +/ExtGState << +/R4 488 0 R +>>>> +/Length 489 0 R +/Filter /FlateDecode +>> +stream +xœ}ZYŽ3Í|×)t‚šÜ—cØWhØÿ Ð߃=÷L²ÔRÃè‡VäÊäžÌú×3]ù™øwþýyüëñ?oÏ¿þÿ‘Ÿÿ÷HÖûü÷?ÿ|¤kôýüë‘KNW혔FmsŒg.i<ûךýŒå¸¾ö•dz®|åúüƒ†V¯Yž-õ+•gîy\}=[nWéÏÜ0|üzä6òÕçÝÙ½av¹jXW½– ? e^ÃGªÇvT°TÏl8³„ôra ¢£\«:äÂ\±Þý)qÇœ7¹ëØ×@o]WÑÒ§¡äyÍùüÆ|ì:p^¬Û6 /dKž` ÏA¾U‡˜ßVô÷R¯4cö%)}ðh×Þ¤¦’Œ‚=f Xg¿æ!N ­n²¤a“úlÑ8'oqm‹žÞÞ Ÿg›àfJ¸€Û7 ¶†#ío(A%‰ô4¯^ž‹%Œ% S”’0¦’}›²†’lðƒlÎUJ²)Ucþ$÷¼Òvˆm'ŽVFôOò[în<4Xv>Tž† +bø3—¸Çvn–^!†ï6®9îþÕ)úÑ@©JÊ"µ17ÔYä&cŠm·Û¼ + j¸¹Ýâÿ±Ýjù +œ'Ô¸ö¥óòwÙP@ F¨`“§¦´ÎìÃ’h ¨Ìk¬»ŸìZ¤äZOg~Á¿bø! +±”>¯Ún+.%çkm·â +Ä"³Ò’1|·ÛŠK.›ªý˜- +vV fÅ¥Lp~¸; ;ö3äÚLád© %˄ܒKÚã + §µ¥bfÈ%Õ ž„f\d9·"5V™™‚¢~Û0&9ãî„þ•zO5è6Ølç«.·a‡aÃÞpl¸¤ Š‘Ú‘K˜0¤ƒwïåaVذ‰¶ß6ì /6œ ÌLW_&£ÄzþŽ}ƒðÌù cÈfAjÙÞ%«ê‡[¥ãv¸Á°)´†ZÖÕÈQMî›|ùi°'pÓûWí÷ô€÷òÞp¶×ìy÷ƒø/aç¯Ô¸d˜Êk8&ÇN0êÛF¢+ÿllÇVž[l"p{<ÇÞ/èë1våi¼w-.Ñ {°ÀNšÇÜMnÒNaJ çËŠ‰Úa–Ê‘ hdK™1‘$´åˆ$ ·D/,˜ö\©_Ú$û\Ô1 =»¬•ààlæ Š˜ÎÝ0u/žÁ‚+êãÀIk!W Š À1ä#çŽ\æ×j .7fôÃv'ãXSaÁ¥‘ñ’åAFü®÷f8cí" ÊdíRžæ÷0ŒE‰€qšîøû1aË…3äÇ€Ià~éïØ†‘6 +:÷”ê€6½6ôA 4 „—ÙÜ"úqÖú‚âê÷øULY¢®Œ$Ýã_¤C.óÍP[h(‰hCAþ õÃÙ¡Ž +xo¸ÊqÝãßqÖbÐï€+nZ aê„…˜´Oíd”¾cRšu–ÍÈ~eÃI¦~eÃ1®À©%YÙÿ9‚Cm4¥À‰‘oC’ÊK1 ‹2`g*×ÙPÇyÙœÔüeÃó ‘Sdc‚¤™ï)ÿ'{XH ý™chëfæbÄ~rݹ~ÅÆ§áûqŠ»&Od3K϶²yºœ Sá߀Šäe.'è‘F¾]"lcý±b¾œ\@÷rÑ`n.'È + ÷ñs£ lž¤U…8sf¢…Á}h©\&úyëw˜LÇßEƒ;<4t&èÇãa¹BOdn Î}†ÏÃî˼°õ‚kTBy½@îö¢Áü^NÉÖ2ÇÐ=_4×–Esy7l]¨0áüDK®w?o_Ëýà’ëv ·Ì¥ì[‹‘œM¼+S4Àâu×Iл<>qLH£3•þl Âî×) Mä˦ 1Å ÿh¸­ ÕJnVêœÙ#¨ÅŒ SºgŽß!¹éS°HCò‰E+8¦tßqôßñ<)¥$9oܳ¶£~ŒFoù úÚ 94“7l"auŒdÖ4$þŽTt]¾`,L¿Ñ×£Ãstv楕rY’™Ç¸åýìH.™·Ábz:Œ<–€Ib@[Ò“»ãNwÔ\ï퉩åý!dñ|›86£0¤T˜X&µ“©lE¤¯ oȽ„¹Ðu¸)ï"»Bwú`öʲÃÑ!ãã®\ 5s D·=MÄìB.]øÓÝí2ÚŽ^üC*U±–qñ!7–D~H“òˆC¤h,Þ!ÿ</VÛñw`׈‘%ÍìãûÖÍú»‚ù~ïØÇƒ"ªÒÞÿjCi¸ný‡ì‰{k+÷2ŽÌ™n?ps+&}`'Ó÷{Ç7Ù«HWj-'µ;RYدåDª +¦øRJ6Vt"ùk¦â°Gˆ?S ùÁ$Déo=åÃU¦ú‚™'bµ)Cƒ1±r2y¯ô÷¢÷3£w<™rtÑäöìè )_VAÂ0F‚Nµ[Ö²Eu•^\nhÇj\ 2à>[ :¶ÆöPe–äàüÄÆañ|ËŽB ÖÔõ+¤âØ¥¾èSË'Žñ¼ã}@—¹ïöŽoØ]— gÃ8ÆË‚Ž› +>ÀMÞö VÆõ{ðÌÕ®L=iÞ±Ÿe ß°Sï´¾ãû4H :︵)@ý¹èi˜ÙŠ8C!™Ê-*¥JòÀÞ?TzˆÙÚê~Šª4{˜–õ{uƒJ©lwï?´êïé_Ìw“Jûa—iýP:eZì6Úm¢ f1G?Ìjj2K Ý'1L/ûÔÌîÙÎ1nï­y0kp²Ô×ó'Ñ_ž=åË ×ðú¢dÑÀËŽg)œñŽ™Èõ×  ÔK§x%›¿4¸mÆ¢ $˪>öË’Ä Ç†P“§¨pá|ã™,†%²ù ‹[Ûa§U?KWN|KœC±PÞ;qVcùJš3àµÊt„;:uë…Çš¬î Ò?à¡9J =¡èĈë1^åèætÓw ÃR¦Až‹iÑPÄëo=_I± ¬˜‘³Þ@øê¹!L®úîätVò9U°4 +èëq ½ñrK®ÒTKsd‰…DÌÊWÍMÏÚË#WŒÖàO/¸ÂO[¦mÓ¡2ë­âŸAŠqœÔ ÛΕJÇLËx.F(“|ÑÜç –Mtñ^>Èò’­’ÅAÐÌbeÃEŸRpf!ÃT³`nÆ ©!–7^öІ}*90.}¦‹ÕÓò +Àðg.‘všIýq.]ï„»›¦÷óŠˆkOhº{—É}iáÈž°¿ŽÁ4¨üœö­¹­uç…ˆ¯RBÁÅd2añ™¨Oß%‰Ê„t7G<_¿¿áìdŸ-«¸(O9ø;0̨YÕAW²öËøw̬à.Z¼C‘§úM—¼ã¥—ßo#õ –>måD',0˜g+#ëiâbÞ]_pô—ßñRI›ã“†ã•Õ>¬ºqôïß±¯Ïx8¤Úa'Š»ÍmzT®áÖWÝLôÇX+í'ïgpkqäÖâØ¬S‡>ó1ƒÐÒmÞö¢åœN?\¿•3‹¿KŠÇd›Áð*JÍh°˜¿ÏÅûRÛ·Ùèáì¶*$EÊÓŽÝtɳœÌO‘úqTvR|lGo€³E/˜s>‚jœJö÷Û|¢á¶xó)ësó@\ë¼ †}Dƒ„"4¿âùhp“ˆ) Ç*Tj©ÐŒí¿a·‹ ú£!ŒåoøûëŒÎendstream +endobj +487 0 obj +<< +/Producer (GNU Ghostscript 7.07) +/Creator (GNU Ghostscript 707 \(epswrite\)) +/CreationDate (2005/02/23 12:39:03) +>> +endobj +488 0 obj +<< +/Type /ExtGState +/Name /R4 +/TR /Identity +/OPM 1 +/SM 0.02 +>> +endobj +489 0 obj +3714 +endobj +478 0 obj << +/D [474 0 R /XYZ 90 757.9346 null] +>> endobj +479 0 obj << +/D [474 0 R /XYZ 90 739.9346 null] +>> endobj +476 0 obj << +/Font << /F23 482 0 R /F26 485 0 R >> +/XObject << /Im1 475 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +492 0 obj << +/Length 59 +/Filter /FlateDecode +>> +stream +xÚ3T0BCKsSs=Kc3…ä\.…t °;—!TÚÄÈHc‘ÐÉèšY˜é™[˜¥È ^endstream +endobj +491 0 obj << +/Type /Page +/Contents 492 0 R +/Resources 490 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 486 0 R +>> endobj +493 0 obj << +/D [491 0 R /XYZ 90 757.9346 null] +>> endobj +490 0 obj << +/ProcSet [ /PDF ] +>> endobj +496 0 obj << +/Length 1823 +/Filter /FlateDecode +>> +stream +xÚí[MsÛ6½ûWð(„àûã˜:IëN2ãi}kzàÈŠ­©%yh©“ô× +$À…ÌÞjNŠ­çÝçÅ{à. “Û¤0¸PB!ø,Ö»+\<Øoÿ|EÚ·9eö5ñÆJV¬ÂýéîêÝ'j +ʑҊwß\pÉ9’˜ÈâîþÅõaÜì/Ë?ï~½úx׳8¡$b\˜&—ûfõоû[Õ"W!Ô'5ÈH*ÛœÀå$ËÁ/î7Ëxqº¹mþsw}ûÎÿÿåX®ÿÒ¢˜ ¢Ceˆ ¬&Z é ’Ì‘á¼B#!T® ¾ +ñMr$¢Ö¹Q]ûëßìÕáþ´>nûˆRˆû«ô ªÐ¡rD4ED„Ñ´\ »FóËØË`MÎZ‚Ö¤CeÖ$Ž–T¦s<˜»8B:1Ø-@_¬\Ž‘’&§\j”K[å†&¾>ìv§ýv]¦dLí¾ÄWE˜.6³GeXQ*‘ÑV³6ûÚ„ +h,tÍUš&µ 囪MJí:“œ6=ªÑ&kµù¥Üî½2ÝûÔ|ñùpxŽ5Â>¤)„‰GM‹Êð¢„"Ì1ë›7RH¬Pݱ‚u£‹Ê7U¬VİœX=ª+oÅú¾Z?n›õñTµÒïÏ›õö+ÆtÝ|ýé´¯„¨}£‚#ÌX:)^Êð¤B"Û?Š>Ñ·(I¨š$ÁjÆÑ\5YR’P¾‰’äZ!ŽEF’ª‘¤ðûçfw¨~4âûRîˇÍÎN‘úˆDRqR„¹bõyT†% BiŸÓ¼g¦ +ü,P¸àq´Q‚ù¦ +T$InlêP@¥ß3ŸŸŸ|»Y«ô¶:‹¹µüâ…–&/¸4q4·4*)^(ßTñ2ÛßñܨԡñêV¼vã<Ö~BºqBvÏú2Ýo2‚°2²SÆ{¥Ge˜QæF~ûTéQ{óÊd¶YW .q‡Ê”8ŽV¯~z_…N•¦mþ¨È Fª‘¦ñÒ´ñCµ+÷ö!j¤„TE˜ q4Ú¢r<üÑhȼoNR.‡×¤CeÖ$ŽV‹C&• %t)+ª]ÿJ/¸ã`¶ÕÕ¶ß½ãèÍ CsÇÑ]mد›÷§§ïGï7ß# …˜–¢3Æö¨ ±Îè=zÄŒ]r0…–X]jä?näUצ»ä«NÜ1†Œ1b@/ªI‹Ê±²µÃÆ6í=Z³u/~«p~Á«GK+ÓLøZ#s;. +!ÆÜd;öŽù—í¦*«%Ñ‹õ£9ŸKS¢µ#à9tú@¤E­Bdé(½·d”!-•¼ØÒ°´GÕU,}ýT¾¼„%[?.ÅâG|D­yñntÔ¢2,ýmPåì⾋¡B. GK‹±v1”ð•.¦F .)uqhÎ Æ\ü¡<–íáú±:¹³vçhèùLIatRHµEe˜võëñ¥lÌÌT)wjÊ/5sˆ7s‡ª‹˜9.Wü°¦ÛQV‹ר@-*CÑ;¹GqvrÏÉ`¡ÏN† GK+Ñ9LøZ'sƒ¨4tÜÉàøˆQ'ÚÂmµÆH¹ 5Ì·•¡u.VHŽŠQÛ2‚¸&ôbÛxÀ¶UW°í¹6Ÿ·/Ǹ»¦Èîmë¥r-’5eÃi}Ø»ÏS=œªà3ßF?VÅ$ÒZÓ"HxÚ´ ˜ åªtá,F °¡ÂF±jI¦7M ÛTQ2·¬™qÛƒQò¡(·ûíq[>mÿ¹L“v^§º'$Ù``vgEôÞü¥T×óXØ(V}Ê‚“вMU$±‹Ï2§¹Ô(R y¿YR±ø{ë?5u_mëo,‰Xlª¬Bb†é"`’h ‚ùž5žwM °Á® 6ŠUk4yŒ e›¨Qãþþ*3µ˜F¡r¨ÐrøÁ¿q9Úa3û{œ“&Ook ȬûœJ@mî*›­(îyׄŠ;ŒTë1ÙX©šÃ ;aÌ/úcÊ_ßkÿendstream +endobj +495 0 obj << +/Type /Page +/Contents 496 0 R +/Resources 494 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 486 0 R +/Annots [ 501 0 R 502 0 R 503 0 R 504 0 R 505 0 R 506 0 R 507 0 R 508 0 R 509 0 R 510 0 R 511 0 R 512 0 R 513 0 R 514 0 R 515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R 524 0 R 525 0 R ] +>> endobj +501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 575.2302 202.806 584.2064] +/Subtype /Link +/A << /S /GoTo /D (chapter.1) >> +>> endobj +502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 557.4621 178.1091 566.3087] +/Subtype /Link +/A << /S /GoTo /D (section.1.1) >> +>> endobj +503 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 539.6741 225.451 548.5207] +/Subtype /Link +/A << /S /GoTo /D (section.1.2) >> +>> endobj +504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 519.8288 206.3431 530.7327] +/Subtype /Link +/A << /S /GoTo /D (section.1.3) >> +>> endobj +505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 502.0408 255.0296 512.9447] +/Subtype /Link +/A << /S /GoTo /D (section.1.4) >> +>> endobj +506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 484.2528 217.6704 495.1567] +/Subtype /Link +/A << /S /GoTo /D (section.1.5) >> +>> endobj +507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 466.4648 275.6622 477.3687] +/Subtype /Link +/A << /S /GoTo /D (section.1.6) >> +>> endobj +508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 448.6768 168.1465 459.5807] +/Subtype /Link +/A << /S /GoTo /D (section.1.7) >> +>> endobj +509 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 430.8888 232.0759 441.7927] +/Subtype /Link +/A << /S /GoTo /D (section.1.8) >> +>> endobj +510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 415.0385 179.7529 424.0048] +/Subtype /Link +/A << /S /GoTo /D (section.1.9) >> +>> endobj +511 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 386.733 198.3827 395.7092] +/Subtype /Link +/A << /S /GoTo /D (chapter.2) >> +>> endobj +512 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 368.8453 194.9958 377.8116] +/Subtype /Link +/A << /S /GoTo /D (section.2.1) >> +>> endobj +513 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 340.5398 219.2242 349.516] +/Subtype /Link +/A << /S /GoTo /D (chapter.3) >> +>> endobj +514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 320.7145 223.9867 331.6184] +/Subtype /Link +/A << /S /GoTo /D (section.3.1) >> +>> endobj +515 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 294.3466 229.456 303.3229] +/Subtype /Link +/A << /S /GoTo /D (chapter.4) >> +>> endobj +516 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 276.5786 221.8247 285.4252] +/Subtype /Link +/A << /S /GoTo /D (section.4.1) >> +>> endobj +517 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 248.1535 181.7751 257.1297] +/Subtype /Link +/A << /S /GoTo /D (chapter.5) >> +>> endobj +518 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 230.3854 193.6207 239.2321] +/Subtype /Link +/A << /S /GoTo /D (section.5.1) >> +>> endobj +519 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 201.9603 239.3289 210.9365] +/Subtype /Link +/A << /S /GoTo /D (chapter.6) >> +>> endobj +520 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 184.1922 179.2149 193.0389] +/Subtype /Link +/A << /S /GoTo /D (section.6.1) >> +>> endobj +521 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 164.347 179.7727 175.2509] +/Subtype /Link +/A << /S /GoTo /D (section.6.2) >> +>> endobj +522 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 146.559 237.8845 157.4629] +/Subtype /Link +/A << /S /GoTo /D (section.6.3) >> +>> endobj +523 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 130.8282 235.1242 139.6749] +/Subtype /Link +/A << /S /GoTo /D (section.6.4) >> +>> endobj +524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 113.0402 236.3901 121.8869] +/Subtype /Link +/A << /S /GoTo /D (section.6.5) >> +>> endobj +525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 93.195 229.0275 104.0989] +/Subtype /Link +/A << /S /GoTo /D (section.6.6) >> +>> endobj +500 0 obj << +/D [495 0 R /XYZ 90 604.4538 null] +>> endobj +494 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +528 0 obj << +/Length 2844 +/Filter /FlateDecode +>> +stream +xÚíœKsÛÈÇïú8ŠUáì¼{ÛØÎ&®ØqÖªä°ÙRQ$$±B‘ + }˜Á` ÷ˆØ›ÉÒA¤øWw£ñCÏM +ÛR\)¡a\V˧+\=Ø?ÿxEüÇsûù<üùæê»¿PSd$•ÕÍ}gA$(¡ÕÍêçëõzöËÍûŠIˆ‘ÖJûÇ7ÿøxóîãÍçö£«w7Á¾w/˜$­õÿ]ýü ®V6Œ÷W1£Eõ›}ƒ­%C«§+NYÿfsõùêŸÁŽû û‡ÜQp¬²šSåâîDíGû¯ù)’Ì‘áÜ9µÇ©èpà,:ð^Õ‹Úã”HÍì¿ |}üÛ§ÙœÚËÝvÆñõ¯3"®ëýamßv¿?n—}wx™J%2Tè*òžQÁ1RÆÂŒ‚D³¹Àø|~½È¯À a¦˜ß ‚ó›Øjó+Dâ’ÀÞŸD!eÌ«ñ$ëÆÓ‹žÚãù¯!äz±_/î6õÁy<Ô+÷jí ¯ê׿®—µ¿_wðP'+Œ¨°qD¦÷"ø8¨2ˆjEFò-ƒÉÁ¬œµÄVwúILÀÛLýj2¥áÈz'0šAåØ4žÍ›Çú~7o>}׿>4‹åàˆ°‡‹Y;N‰ëU…ø(1HJÇž[Ù|«`ÂXá„§Ö:"hWÐáÄB*•DB‰®½ÊáJ°Íò‡ýòqÝÔËæ¸÷Üžëåú?Óå Ž¿>æK‰¸’²Š#IùíU…€©"HAÇŸŽPþ"Áü¥ÖÚü)žÅr8¹| +”’…‰gPy‰ã1ÐöÃjµ¯~pÿ©>ì6Ç&L??íwÍn¹Û$$¶F…XÆ1¤$öªB¨TÚ‹•36Žõœ&™`‡Y&œÆÔZ¤Ì 9œ $ÇvòZšjzU’: ßì¶m1|8î»gW]]Üí‡JùH.Ú¢7ÏòèEóX•Á‘»H4réù®€ÀœFp‚IM­upš,œÃÉpRf'°ºg¯òp²ÕÒÎ1Ý‹æq¿;><>÷þn·;4µô17ù”ÄÆËM’¼½ª¯/™/>«)%”Æh Ó˜ZkÓ¨óTB'S‰…§^ ²Wy*¹£òï»åböšõö¸ÈϱDŠ’ÈN½^UŠÚ• æí**Žê¼×=¥ + +å=ª `ÞSkmÞ Î² +9œ¸üZ!¡qÕ ò¨ +‡êÍŒ‰ëõS_ 7ë»ýbÿåeèDÛÂud%P•BÒIÊõ8¦ ¨§Ò žŒ^ød¤Ö:z³{M Ã©•VHƒ”]ïðíU_é'§›Ñý®§æïg_/–u +°FÚèÈN`¯*eÂÆ®äGQ]X}õ< Ã> ©µŽÜì:t8™\AÑTÈuª@®räv+øCK¯%¶n`ý¥ØFFí +)ËO¼jË€‰Â(´ °°PÞ#`Á¼§Ö:`³÷›@‡“eÍJÀö*¬vÀ~¨Ÿv–L·¨ÊîÓb»x¨ŸêmSÚ$Uö”ÒTq™ÛJ^U–j;)ÚŒ£ý¶èãÆf0a½¨¯ÄV›.‚³{ô°¿©ì‰˜æªÀžSöŒcïíÇÏŽ®}»êï[¦c7ûcÛ%8#úÚw +¾Ý-íΗkŒIú + âX˜*%ÓWàU…ˆû<ŽÂ&4Òú«’i‚#äµWz¬ÿúµT]Òñ-¿«Çåóòö`óPǹê[×îë}½MïÉPÎí!aó"Ö¤7È« +!†æ QŒg{í‚9 ×.œÒÄÖW˜k¯]ØßÄá‡I†£…FÊ rPRåc»¸ k€Óñ”1ÜE‘¹~½ªlhêE{$BéH³—Ør$f'B°¿iKRf'WÂ-€Ø«ˆ¬±ižW·Ë‡õír±ÙœB °¥²Èp¾™×« +QR!‘VDŒÃ<ÃÊ%sàÌebËñ˜Ý‘†ýM­Œvª¤/4M•’€<}¸ÆHµÍà±ïÌpíU…‡á:Žñ|‡k(§”`J[Êl›9ìo*”ØÃD¡-¨”ÂCùT?ÝÝv÷•'•HŠ QªŠ}gJ¤WBJdãÒ%s ÌebËѨ²4‚þ¦ ÙÔP;!•ƒÊÁ(=ŒÏ‡Ðßð: )FTbYÅ^3ßúöªBpÝ·Ã5'ãè.{1¢`¢¢pž[Ñì ;ØßÄ‚I·SUUh} *Ǩн½›Q|}¼?…UfW,”ê*öž²Ú« +ARN¡J£<{:¡Ôt‚™Ml9:³_€ýM, v0L—àìUÎþÏÍ)DZ[JjUÅ.3Ý^Uˆ,t7ŽB»ìó´Bih³žØêheÙ}^ØßÔZj –b¦ÐÛT×þ™‡§æùô3H¶ó±ëL!õªB„aA4 +ñ|™„r:0 ¦4±å˜Ì~µö7±‚Úùžá¸„d¯ò{ê¾m¬ézq¦,ÓbJ“*öžY¦{U!Ȱ"Ey†8BÉps™Ør8f[paSK$fˆpRhc *Ï£ïk†/‰½ŽCbƒäZV±×L+£W‚–Dqt—a|Ä(”èQ0ω-Çhö–ìo"£D Ä8-4•gÔ7×Ï·ËÝv{Ò Î6vV;Î â^Uˆ/¬†Fž;˜`j˜pf[Ìì Øß´±œH…g%.{•ç’ \ÖÍãíbµ:©„Ú)¡082›ʽªcÊGAž!P2Á\&¶Ù­vØßÔ2iOºâ¼ÐšTG>ÆññD²ÇRÅ®³OriE…ÃbgáùH(¥’`J[Éì~;ìobdvèã¢Dd¯òDŠÈõòéÙþ:J‰‘l7…b÷™& ¯*DÞ2 +óœ@„²8€&1±å@ÌîªÃþ¦ÖFÂm©+¬rz‘çPnëõÃãÝnòh­(Òí}þÈæë­^Gžš‡ùm“$mÊÙKK»ìv9èl"uFÚÒ¡ ý“NÔC§èÚ]ž“î{3Š8,æ-^3DÀ’%ŠíÜ,@R‹PN_ØéHäÙ­pÈS×ð,Åù®`ëH!ÿГ׻^imÿ…Ä­N¦’ȨvZ{_1jÿ‘KZ)Ò^3n×êÇz[ïMÿÀéþ©€úïÛfÿ£Ó®Î»ßø{ʾ§¾±Ú–ôO hŸE?BpÜ}÷¥o¶þýËC½Í?Ù…eéÿYpùÁendstream +endobj +527 0 obj << +/Type /Page +/Contents 528 0 R +/Resources 526 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 486 0 R +/Annots [ 529 0 R 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R 555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R ] +>> endobj +529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 728.8762 227.9221 737.7228] +/Subtype /Link +/A << /S /GoTo /D (section.6.7) >> +>> endobj +530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 711.0772 271.2488 719.9239] +/Subtype /Link +/A << /S /GoTo /D (section.6.8) >> +>> endobj +531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 693.1587 216.0265 702.1249] +/Subtype /Link +/A << /S /GoTo /D (section.6.9) >> +>> endobj +532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 673.422 267.4728 684.326] +/Subtype /Link +/A << /S /GoTo /D (section.6.10) >> +>> endobj +533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 657.6804 259.752 666.527] +/Subtype /Link +/A << /S /GoTo /D (section.6.11) >> +>> endobj +534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 637.8241 246.4723 648.7281] +/Subtype /Link +/A << /S /GoTo /D (section.6.12) >> +>> endobj +535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 620.0252 262.7911 630.9292] +/Subtype /Link +/A << /S /GoTo /D (section.6.13) >> +>> endobj +536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 604.164 207.7177 613.1302] +/Subtype /Link +/A << /S /GoTo /D (section.6.14) >> +>> endobj +537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 584.4273 181.9047 595.3313] +/Subtype /Link +/A << /S /GoTo /D (section.6.15) >> +>> endobj +538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 568.5661 189.8946 577.5323] +/Subtype /Link +/A << /S /GoTo /D (section.6.16) >> +>> endobj +539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 548.8294 208.7238 559.7334] +/Subtype /Link +/A << /S /GoTo /D (section.6.17) >> +>> endobj +540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 531.0305 280.7632 541.9344] +/Subtype /Link +/A << /S /GoTo /D (section.6.18) >> +>> endobj +541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 515.1692 183.21 524.1355] +/Subtype /Link +/A << /S /GoTo /D (section.6.19) >> +>> endobj +542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 497.4899 212.9779 506.3366] +/Subtype /Link +/A << /S /GoTo /D (section.6.20) >> +>> endobj +543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 479.691 180.2909 488.5376] +/Subtype /Link +/A << /S /GoTo /D (section.6.21) >> +>> endobj +544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 460.552 179.1154 470.7387] +/Subtype /Link +/A << /S /GoTo /D (section.6.22) >> +>> endobj +545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 444.0931 171.4939 452.9397] +/Subtype /Link +/A << /S /GoTo /D (section.6.23) >> +>> endobj +546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 426.2941 173.5465 435.1408] +/Subtype /Link +/A << /S /GoTo /D (section.6.24) >> +>> endobj +547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 397.8143 270.4022 406.7905] +/Subtype /Link +/A << /S /GoTo /D (chapter.7) >> +>> endobj +548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 377.978 245.0472 388.882] +/Subtype /Link +/A << /S /GoTo /D (section.7.1) >> +>> endobj +549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 361.1553 269.3059 371.083] +/Subtype /Link +/A << /S /GoTo /D (section.7.2) >> +>> endobj +550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 342.3801 255.0196 353.2841] +/Subtype /Link +/A << /S /GoTo /D (section.7.3) >> +>> endobj +551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 324.5812 241.7395 335.4851] +/Subtype /Link +/A << /S /GoTo /D (section.7.4) >> +>> endobj +552 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 307.7585 253.914 317.6862] +/Subtype /Link +/A << /S /GoTo /D (section.7.5) >> +>> endobj +553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 288.9833 221.2568 299.8872] +/Subtype /Link +/A << /S /GoTo /D (section.7.6) >> +>> endobj +554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 271.1844 239.3191 282.0883] +/Subtype /Link +/A << /S /GoTo /D (section.7.7) >> +>> endobj +555 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 253.3854 205.765 264.2894] +/Subtype /Link +/A << /S /GoTo /D (section.7.8) >> +>> endobj +556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 235.5865 240.6335 246.4904] +/Subtype /Link +/A << /S /GoTo /D (section.7.9) >> +>> endobj +557 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 218.7638 248.3744 228.6915] +/Subtype /Link +/A << /S /GoTo /D (section.7.10) >> +>> endobj +558 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 202.0459 219.0448 210.8925] +/Subtype /Link +/A << /S /GoTo /D (section.7.11) >> +>> endobj +559 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 182.1897 235.0949 193.0936] +/Subtype /Link +/A << /S /GoTo /D (section.7.12) >> +>> endobj +560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 164.3907 250.5866 175.2947] +/Subtype /Link +/A << /S /GoTo /D (section.7.13) >> +>> endobj +561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 146.5918 246.1633 157.4957] +/Subtype /Link +/A << /S /GoTo /D (section.7.14) >> +>> endobj +562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 128.7928 261.6649 139.6968] +/Subtype /Link +/A << /S /GoTo /D (section.7.15) >> +>> endobj +563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 110.9939 273.8294 121.8978] +/Subtype /Link +/A << /S /GoTo /D (section.7.16) >> +>> endobj +564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 93.195 233.4407 104.0989] +/Subtype /Link +/A << /S /GoTo /D (section.7.17) >> +>> endobj +526 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +567 0 obj << +/Length 2549 +/Filter /FlateDecode +>> +stream +xÚíœ]s㶆ïý+xi_Æ÷G.Ó&™îLÓ6ë»LfÇ–¸+MeË•älóï  +ðÉ^ÅÜÙÙµl½{Ϋ×¢HlÿÆàF … ã²Y?^áæ‹ýñOWÄ?½²Ï¯RÁ÷wW·?RÓd$•ÍÝ羂$HPB›»Í¯×ùÇÏw?ü|÷ñæ·» 'IC„-Ö=·Ûíº_ýp:x‚IÒÕÿÏÕ¯¿áfc|¸Âˆ-š¯öŒˆ1´y¼â” ßì¯>^ý+ÔqOôÿ¡ô:8Ö Ù¬¨rÎ{Q÷Ôñ‹×ü’È æÈpn_;µ¯TÑøÒYòÒÕ ê^¢BD߬„À×/»çOçõ³ýw»9Þ¬¨ýÑÇóñe}vi?·ÇöiÝ^&BE†(Ý$½³×D°C*$ÒÊæŸZDÖÆïòËE”ܸß:”ä ƒ¼¬ÔåH8½l(ƒ› …”1o¦PD«PèEžB)|Ù<Zžž&AȦÌ4Ië„^Œ&!d„ +ò²’ƒ!„š Ôo¦PŽ˜âÆ0¨‡8œ1 +$µ’MÚ½@¢WULRiŸåŒ].B0Å@!bVËqÈKÂýæ†RI$”¨q8¨<‡Äqøµ}XïwíÓùÓé|n'‘¨‘1\4iÿ‰^U±éI¼ð¹$¡#‰`ˆY-G¢(’ö³eWT#.ªv+bÉ5"DÐWWÄAвëA‚m/û§CŒ ìü¸Û{ÿzX¿ƒ$·ÏŽÌÿ‰@(”x‚™dµ^¡©?Á~s×$ö—'ˆâÜ•ÃNÁm; 7%»ã41UÄ­WU¼GÜRóbÜ P"n`&Y-‡›.âö›·òv5£ˆ®ÐTŽ6–ÒvlO‡ýïþË׆3*⚪&µ‘σªâ–*‚t7Œì.aåÆH„ÓËj9M‰D¸ßÌOØåŒ!FTPTE£¸€¢uͱjR½ªâ6¢˜Ú]ŠP|E0½¬V¢ EÁ~3Ea¡¸Fâ r$Š”ÄÓãù¹ÿgÊ`hϳˆV¢IÛÏÆzUÅe8Ù\ÐÙ˜b 1«å@,îOÁý掉œ F‰¬8¨‰²Lâv‰Š‹¤ðk$öªŠË°C5²¹$¡#‰`ˆY-Gbq‡ +î7—DÊ v“èT‰*%ñÜîŸÚóæöÔLZ$ +Äf±xyföªU*ƒfæÔê"0„â‹‚éeµ†²ˆ!Øo.†X EY ÃAå0Ô¯c¸„¡¡š5©…"†½ªâ4b˜Z]†P|C0½¬–ð¸I÷›‰!×Êþš¹†1 *‡¡)aè¿NCRÚ¤&rUÅ+UQ­ÈØì»&Ì-Ç–Õr÷mà~óNQ¸Âvµ)j*¿)íß¹,8a$TÙ•iR½ªâ5˜š}ßB¹EÁزZÀâv Üoî(¨]eJS!pPyIB`xã2>š2 {â‰iR#9…ƒªâ—a‚¶G†ß pPD80¡¬VœÄEàÀ~scÜ®'k#^/R7Zám¨gT÷fªŽ-ʼyÕ*•A¼¥†ß oPD‘70¡¬–ã­xÜo.oDÚ…cm|ó"ãvj¿ßqÝo·çóófµþ²›8Äc‰•â׋`øÄñ»á È'âÅsYÉÁVÜ^›ÍdÙöÆþŠ`Ø‚ÊÓÆß@Ûvmª`S3EÜzUÅsàmdú½FˆƒÊj9抗úÀýæB0Mì€EjÌ *Ïœ€™›2ºil a¤Iä¼ ªŠ_ª;.í72ü>ÏÀÀ"}`^Y-G_q'î7wÈ“ 1F+D*Ÿtøíw·íãà Ǔ®7` q†u“6Ï‘T”{^¯ôØä;¾ ümpBÑF8Ád³ZÎâþÜoæÐȶh…ÍAåÙT6·“Ø4Zë&m^d³WU@‘ö-@êU{ÞÑÈÞ7FGŒB9GFÁ˜³ZŽÑâžÜoîHJ¸]½VNx‘¿± !úéþ8ñ J‰„°ëå¤uar÷"Ø`œÛ‡Ë4òåyY©§Ñ”çu¨ÙL´ X]¹ÖÒ‰É%‹“æuNP8Ô,“è5«(@LÜ-–C Í€!æEaqÚ†:õ·öˆb\|‹Û†D +ùÝ}º¿+ îîoÆF÷ݳs§ê–Åî6Ù¤;PÜfÖOíS{¼?·GæÁß›÷ïÃÝeÂ/þ›îs9ýWüeßQó@û‚¤{ôù†Šëƒ¿«j~—Á‡?†{ þ÷/íSùv±ÎZ’ÏÿSq˜endstream +endobj +566 0 obj << +/Type /Page +/Contents 567 0 R +/Resources 565 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 486 0 R +/Annots [ 569 0 R 570 0 R 571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R 577 0 R 578 0 R 579 0 R 580 0 R 581 0 R 582 0 R 583 0 R 584 0 R 585 0 R 586 0 R 587 0 R 588 0 R 589 0 R 590 0 R 591 0 R 592 0 R 593 0 R 594 0 R 595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R 604 0 R ] +>> endobj +569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 726.8189 253.9141 737.7228] +/Subtype /Link +/A << /S /GoTo /D (section.7.18) >> +>> endobj +570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 709.0199 255.0202 719.9239] +/Subtype /Link +/A << /S /GoTo /D (section.7.19) >> +>> endobj +571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 691.221 256.6839 702.1249] +/Subtype /Link +/A << /S /GoTo /D (section.7.20) >> +>> endobj +572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 674.3983 259.9907 684.326] +/Subtype /Link +/A << /S /GoTo /D (section.7.21) >> +>> endobj +573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 646.9995 222.7212 655.9757] +/Subtype /Link +/A << /S /GoTo /D (chapter.8) >> +>> endobj +574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 627.1632 313.2008 638.0671] +/Subtype /Link +/A << /S /GoTo /D (section.8.1) >> +>> endobj +575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 609.3643 313.7588 620.2682] +/Subtype /Link +/A << /S /GoTo /D (section.8.2) >> +>> endobj +576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 591.5653 268.479 602.4693] +/Subtype /Link +/A << /S /GoTo /D (section.8.3) >> +>> endobj +577 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 573.7664 269.0369 584.6703] +/Subtype /Link +/A << /S /GoTo /D (section.8.4) >> +>> endobj +578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 555.9674 259.1837 566.8714] +/Subtype /Link +/A << /S /GoTo /D (section.8.5) >> +>> endobj +579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 538.1685 259.7417 549.0724] +/Subtype /Link +/A << /S /GoTo /D (section.8.6) >> +>> endobj +580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 520.3696 266.3666 531.2735] +/Subtype /Link +/A << /S /GoTo /D (section.8.7) >> +>> endobj +581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 502.5706 266.9246 513.4746] +/Subtype /Link +/A << /S /GoTo /D (section.8.8) >> +>> endobj +582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 484.7717 274.6654 495.6756] +/Subtype /Link +/A << /S /GoTo /D (section.8.9) >> +>> endobj +583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 466.9727 275.2234 477.8767] +/Subtype /Link +/A << /S /GoTo /D (section.8.10) >> +>> endobj +584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 449.1738 297.8981 460.0777] +/Subtype /Link +/A << /S /GoTo /D (section.8.11) >> +>> endobj +585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 431.3749 298.4561 442.2788] +/Subtype /Link +/A << /S /GoTo /D (section.8.12) >> +>> endobj +586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 413.5759 297.1911 424.4798] +/Subtype /Link +/A << /S /GoTo /D (section.8.13) >> +>> endobj +587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 395.777 297.7491 406.6809] +/Subtype /Link +/A << /S /GoTo /D (section.8.14) >> +>> endobj +588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 377.978 281.6994 388.882] +/Subtype /Link +/A << /S /GoTo /D (section.8.15) >> +>> endobj +589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 362.2364 234.4271 371.083] +/Subtype /Link +/A << /S /GoTo /D (section.8.16) >> +>> endobj +590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 344.4374 234.985 353.2841] +/Subtype /Link +/A << /S /GoTo /D (section.8.17) >> +>> endobj +591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 324.5812 264.1452 335.4851] +/Subtype /Link +/A << /S /GoTo /D (section.8.18) >> +>> endobj +592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 306.7823 249.2113 317.6862] +/Subtype /Link +/A << /S /GoTo /D (section.8.19) >> +>> endobj +593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 288.9833 219.8818 299.8872] +/Subtype /Link +/A << /S /GoTo /D (section.8.20) >> +>> endobj +594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 271.1844 235.9316 282.0883] +/Subtype /Link +/A << /S /GoTo /D (section.8.21) >> +>> endobj +595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 253.3854 220.4398 264.2894] +/Subtype /Link +/A << /S /GoTo /D (section.8.22) >> +>> endobj +596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 235.5865 232.6138 246.4904] +/Subtype /Link +/A << /S /GoTo /D (section.8.23) >> +>> endobj +597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 217.7875 233.1718 228.6915] +/Subtype /Link +/A << /S /GoTo /D (section.8.24) >> +>> endobj +598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 199.9886 263.0497 210.8925] +/Subtype /Link +/A << /S /GoTo /D (section.8.25) >> +>> endobj +599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 182.1897 263.6077 193.0936] +/Subtype /Link +/A << /S /GoTo /D (section.8.26) >> +>> endobj +600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 164.3907 245.9038 175.2947] +/Subtype /Link +/A << /S /GoTo /D (section.8.27) >> +>> endobj +601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 146.5918 224.8631 157.4957] +/Subtype /Link +/A << /S /GoTo /D (section.8.28) >> +>> endobj +602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 128.7928 225.4211 139.6968] +/Subtype /Link +/A << /S /GoTo /D (section.8.29) >> +>> endobj +603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 110.9939 247.5479 121.8978] +/Subtype /Link +/A << /S /GoTo /D (section.8.30) >> +>> endobj +604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 93.195 242.5666 104.0989] +/Subtype /Link +/A << /S /GoTo /D (section.8.31) >> +>> endobj +568 0 obj << +/D [566 0 R /XYZ 90 757.9346 null] +>> endobj +565 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +607 0 obj << +/Length 1649 +/Filter /FlateDecode +>> +stream +xÚí›]oÛ6†ïý+x_˜ã7Å^nk‹X·µ¾+Š!u”Ú€c{®Ó´ÿ~¤HI”I&šwÓA`;~uÎ+žGüŠˆý¡È¤¥Æ† …w‚>Û?¿žÐðõÌ~?‹?Ï'?½blSh~ÛDPKFšß|¸ZM)¹ú:ý8ƒ¸ª05ÊFr_üòÇÛùË·ó÷î«ÉËy—#X\Q—áŸÉ‡ÝX+o&sSIô`?É0t7Œ·Ö“÷“¿º8þ‹æ€Ü™Ra"š1í½7"÷Õþsм‹ä”l„°gÏì¹jÖŸ(¡–í©[6‰å¹äY.Á|#ÁTF`Íx¡—ìTLÀܬ¾92g‹íæö)lJ‚³—Xœ=…³UL2©p¥©º|~<‚Ùñ·eËó¨r<ÂùlX7`ËJPt¥l?Ä;9QéΙZ~mKÜÿö§bâß¼üv}·kñûu»¸¿«7‡ëÃj»IÇjŽ9(Μ«½¨à¯k´Ø$5ú8gw5Ù±]RZ=úôÀ5Úªš&ÂÔ5’m…›åb·À‹Ä‹¬°TL™9j€NUò`Ïœ;±˜x6Äÿ{YCê/k°>I¬„6—5˜o8ÌðG#Ì)®*- ·*0 ¼L¶”3¢Q<ƒpP•ç†óXJ¬/<ÓíT`68íŒÃBhƒâð„ƒªä¢ƒ8¶qAó,Cê!ë“Äj æÙMmp¾±s{5…;À*@Üïj›-¶7õìËáûºÎtƆÚõ¨Ö(Î’²ÜªJfŒÆÄ(5ts!ôѼBEèykÄò¼æg `¾±¼2·Í¸4û ¢@«ˆimv¹%}®Á¤â EÑ3]n*f“234rs$´PIzjÁŠ$±<·&Ë-˜odoË+i»OÅap;UWƒ›v¸¶“$v.ƒâpƒªä£w`äç8pÁ’tàÂIb5àŠl‡ çs[£8åØ˜üÖ‚pþ‘Çèÿ^j60WöÊûƒ6ÚÍÉo·£‚5ɦö5lò]oêýõ¡¾ñ›•·ÿú{ûæÛ£s>¸…_óJ^0þ‚…ÝÎŒåßÝN™¼Úîý‡t[ô§ïíŽèoß?×›ü?xkQ+ý 6û® +endstream +endobj +606 0 obj << +/Type /Page +/Contents 607 0 R +/Resources 605 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 486 0 R +/Annots [ 609 0 R 610 0 R 611 0 R 612 0 R 613 0 R 614 0 R 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R 620 0 R 621 0 R 622 0 R 623 0 R 624 0 R 625 0 R 626 0 R 627 0 R 628 0 R ] +>> endobj +609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 726.8189 243.1246 737.7228] +/Subtype /Link +/A << /S /GoTo /D (section.8.32) >> +>> endobj +610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 709.1945 238.1532 720.0984] +/Subtype /Link +/A << /S /GoTo /D (section.8.33) >> +>> endobj +611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 691.5701 251.4234 702.4741] +/Subtype /Link +/A << /S /GoTo /D (section.8.34) >> +>> endobj +612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 664.1176 244.3102 674.9967] +/Subtype /Link +/A << /S /GoTo /D (chapter.9) >> +>> endobj +613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 646.3587 159.559 657.2627] +/Subtype /Link +/A << /S /GoTo /D (section.9.1) >> +>> endobj +614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 628.7344 160.117 639.6383] +/Subtype /Link +/A << /S /GoTo /D (section.9.2) >> +>> endobj +615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 611.11 247.3986 622.0139] +/Subtype /Link +/A << /S /GoTo /D (section.9.3) >> +>> endobj +616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 593.4856 260.1307 604.3896] +/Subtype /Link +/A << /S /GoTo /D (section.9.4) >> +>> endobj +617 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 577.799 182.1539 586.7652] +/Subtype /Link +/A << /S /GoTo /D (section.9.5) >> +>> endobj +618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 560.1746 182.7119 569.1408] +/Subtype /Link +/A << /S /GoTo /D (section.9.6) >> +>> endobj +619 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 542.5502 159.4692 551.5165] +/Subtype /Link +/A << /S /GoTo /D (section.9.7) >> +>> endobj +620 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 524.9258 160.0272 533.8921] +/Subtype /Link +/A << /S /GoTo /D (section.9.8) >> +>> endobj +621 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 505.3638 155.1453 516.2677] +/Subtype /Link +/A << /S /GoTo /D (section.9.9) >> +>> endobj +622 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 487.7394 155.7033 498.6434] +/Subtype /Link +/A << /S /GoTo /D (section.9.10) >> +>> endobj +623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 472.0527 162.8862 481.019] +/Subtype /Link +/A << /S /GoTo /D (section.9.11) >> +>> endobj +624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 454.4284 163.4442 463.3946] +/Subtype /Link +/A << /S /GoTo /D (section.9.12) >> +>> endobj +625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 434.8663 192.7639 445.7703] +/Subtype /Link +/A << /S /GoTo /D (section.9.13) >> +>> endobj +626 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 417.242 170.0795 428.1459] +/Subtype /Link +/A << /S /GoTo /D (section.9.14) >> +>> endobj +627 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 401.5553 174.5026 410.5215] +/Subtype /Link +/A << /S /GoTo /D (section.9.15) >> +>> endobj +628 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.9477 383.9309 175.0605 392.8971] +/Subtype /Link +/A << /S /GoTo /D (section.9.16) >> +>> endobj +608 0 obj << +/D [606 0 R /XYZ 90 757.9346 null] +>> endobj +605 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +631 0 obj << +/Length 2360 +/Filter /FlateDecode +>> +stream +xÚµ]Û¸ñ=¿Â6iù%‰º·4¹+Ò†ݢMd‰¶…Õ‡+J·Ýüú›áP²li×A€"@L ‡óÍáÌ,ß0øÇ7)Û$Q¦RÅ›¼~Ç6Gÿõ÷ÛJHø]Ù".7Áüè_ß=ü&Ò`a‹hóx@â±JÃHËÍcñïíÇSvîM· DĶ|÷ŸÇ¿Ñ&:áx€Ý(TZ(wàñdyøü…¿<ŒkÛgùRy÷ëã$—ŽBÆu²‰„Uœ¤«²HÁk”? ÓXÄ(NCÆ$ÐR,DC Hv(Nj»_nYs&ÂD +þ6ï k…¹œ1ç, .£ 5ǾÈjÒþÓÐ<í8ۚʾ_H’ˆ0–it# m?mÆÕßgR'V¤ŠçR-(£T§¾?ÿòððüüÚ2·¡5ä]®æg¹ £D!O<ôIæc`δVàÂÉ@݇[í¤¡Ž˜|ÛÎÖ;CŒªT‡ZéyÌIécNŠKÌbÎKK ²éMS˜‚ }KÐ:#ïxœžvÏ­µå¾òPÂÛ¼­ë¡)ó¬YÛ²9zœߎÍ9wmßæmEìPŽgÍNDÛ?v<Úš-‡wŠó0"áôk›ØnOUpZòt«ƒ= +ˆÐºÌ»6ÈÛ¦ïÚª2 wpÓÓí'cÏŽ"íÏQñ™adžnÕÎxŽÀ5yNCS µ¥˜á´“„±P”y§7€üü=´j„ˬ§ß~ñr<›=-Πê"w ƒ¼£¤ “ênÆœNó#ËŒ¹¤üɘzž1‡ò¼ÈšŠ§¡©¾Ñð6kJjÎq•B¢õÛï§Le˜Äqüöû©X&éNÀ²íëoèœò¢( S vòu Bº£ßúzõÒútEÌÕ—vBs/íù\a*([mq]VÛ…È)˜ +¡7EtòXˆK°ÿ°ìš£GÔ=ÙG4WhA2,+ôeí}¹Ä3Ú3® +ÁVñXn欗uŒ¡fB_ÒðkC$F@ÿŽF#jôuhîisš|](ß"¥6s¾Ku$¨#Yô˜q~O ÕùÜ”}™Uå÷‘ŸCy"˜H6sN R¨Quú3¦¢0Uѽ2tBCù?Q•QæÞ!EW^Ê_àc]Ô°Êr³¦“f,Ý̹/2bÝR0Д߉ÏÜm(p ×P‹¶¯Zi¿'À‚. +ðÚ$ëÊ *>ëŸ#küKµñ¦{Ó”‹`@,åoÛMÈ$”Iò3Á Cš²ä^0šž=ÌJÏ">¡œ‚ºÐi‹[][4»Ê«°õZ^i2!Ó ³UUG¬`޶â!%•2u-ú71ë$do|Pî…m¼üXOÜz"Ñ`dÉoä{ÕÈþI—tQRWïÛ6§®¢·$Ö‡/Ÿ"—&bâm³MXw„QоÇú¶¥E=ä'ZuƶCGƒÃû¶÷N~fsD¤gà8·YQÍÛ‚1Å4Š’­Ý¥=‰›ž•%B¯fE¾ö&"ÔYáWnh8SZ@¸ b€ãõè=ÈM¬æï€¦{k?VuÄ8¾’¼Yý0‡ÂÈ—\ó4ÙÜ4ÏY:º€ÍÁnþ娌ó£®mëq¨äû˜ŠžWwqÆÉ¼áoÆx¼¹R³é²T~.…‹ë;„Ó”æ} +{[7vS~ªØ­KÎ]²þ-AP¶·m5ôþ«.›²v~‡‹‰Ö;ÐïÁdýÐ9K|´L1²tFpäü7zo%ò.¾äÓŒ3†´ô¹' aá%…ز €Ž:ž„„H ~“GpÝN:Í1# ƒùÊÆØÇß‚D®à{ÿõñ÷«ï~ú⹎Z¬EÞXrà•vÃÒq¤XŽÑØ•}ošW²ìÇ«ñQMO5ÆUÖÈ?ámŠ’ƒJQ%?ö¹?.+Ûæendstream +endobj +630 0 obj << +/Type /Page +/Contents 631 0 R +/Resources 629 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 648 0 R +/Annots [ 633 0 R 637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 642 0 R 643 0 R 644 0 R 645 0 R 646 0 R ] +>> endobj +633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [171.6432 525.9374 324.8465 548.2835] +/Subtype/Link/A<> +>> endobj +637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [243.7125 430.2503 420.8261 441.1542] +/Subtype/Link/A<> +>> endobj +638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 390.6135 195.8719 413.5822] +/Subtype /Link +/A << /S /GoTo /D (a00143) >> +>> endobj +639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 378.6583 251.5126 389.5623] +/Subtype /Link +/A << /S /GoTo /D (a00153) >> +>> endobj +640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 366.7032 241.5402 377.6071] +/Subtype /Link +/A << /S /GoTo /D (a00144) >> +>> endobj +641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 356.8053 199.199 365.6519] +/Subtype /Link +/A << /S /GoTo /D (a00145) >> +>> endobj +642 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 342.7928 199.7971 353.6968] +/Subtype /Link +/A << /S /GoTo /D (a00146) >> +>> endobj +643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.1719 342.7928 346.0872 353.6968] +/Subtype /Link +/A << /S /GoTo /D (a00149) >> +>> endobj +644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 330.8377 297.0202 341.7416] +/Subtype /Link +/A << /S /GoTo /D (a00147) >> +>> endobj +645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.3768 330.8377 448.1464 341.7416] +/Subtype /Link +/A << /S /GoTo /D (a00158) >> +>> endobj +646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.6908 318.8825 181.4861 329.7864] +/Subtype /Link +/A << /S /GoTo /D (a00142) >> +>> endobj +6 0 obj << +/D [630 0 R /XYZ 90 739.9346 null] +>> endobj +632 0 obj << +/D [630 0 R /XYZ 90 553.9527 null] +>> endobj +647 0 obj << +/D [630 0 R /XYZ 90 307.8837 null] +>> endobj +10 0 obj << +/D [630 0 R /XYZ 90 301.139 null] +>> endobj +629 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F26 485 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +660 0 obj << +/Length 3153 +/Filter /FlateDecode +>> +stream +xÚ¥ZYÛF~Ÿ_1ð“D +o‘Ù'¯×Î:ˆo<Ù—$Õ5ÌC&©8³¿~¿:š—éñ‹†Íªêêêêêº(ÿÞߟy÷‡ø°ÏÂ(¹/ª;ïþàï|Eï€ßM þþp÷ý› »ÏöY$÷gæøû8ðƒû‡Óo›`» ƒ L6³Ý±·¹½}/ƒ‡Wï¿wã®Ï‹Û?~º{ý0,§ÒÄaâÓbŸî~ûû?AªŸî¼}˜¥ñýg¼x{?Ë‚ûê. +B÷RÞ}¸û×ÀGïmSwBpn”²«ò²ÔáS×›ª“Yy×Ý*#ˆþ’÷n¤ SÍédNB|2Û Þüi ÅæåÖ÷6Ÿé_þ¤+~¶n¢©v¤bìzçûû,Že7Õ­¶EÞƒGe ï/2Êåq¾•å®+òR Üil·þf¶M··º¶õ£¼8 ²céšöc'vE‰- ªÊ‹‹­Í~»K¼Ãæ×úDj%D±Ýšä¬¬+±ùŽ¡óžÌ Oâˆ-_›®³G–о‘gkª†ÎïOúg„²0mŸÛZ†-Q™â’×`ˆ*W9"Ì[.¬Ú']ðòI0·ŽN‹…RîÝ­¸®³ý-_œ‰Ï;c“""?šZ[oš3=#ÑtF@ND¶! X*B˜®ÃÁؼ„z‚,Ü\²—Ïb5"ñ6ò6Œø0Ï2Qì8ŒöÆ3{ÖvJÞ6!ؘÖ®v—&ƒMºá.Ðö²lSÚÊö¼0ãzt¾°³ÜóÐß|¾˜Z¨kã)¶ë[{Üp4Ê'Û\ Öd×7;3igZbÝÉ[^;â¶é›¢)Yýq¬þ +ë6x2}¬ùŒ½@L Ï#Ù…n~yóJP͵´yÝË+ÛžM+FR7µ4JÇ@ƒñˆÎ)§ÅÂOçæ…ÎÍ;yþîyAÛõÃ-mmzwU4ÛÛÿ2·C|ÞmÛÅå'˜z-ÂvòÄa+*·eÓò©àM|!£}S$¸šÂ’Ø…"¯Ð[ÁüY@Ž7~´‡¯È5CÞˆäÍB–×ß#âøž7—óÕ`˜$¦p™úw0 Ò}”¤ÙdÓAÀ¾OF£g÷qm¯®),®“7¾›xÖpámsë„|0¨ïÄ·yý(ö +ä¹m*™TÊåÔ—ÉU 6ò*^„Xä +yùË{|¾ØbõÚõXº+q;Éþ†}Ü:>Zò +fkøÝKò¯8Ð`Ô+Dþô|dÖBt¢™ˆN¯êia…|x÷ ¢¨oŒ}8 ê@E®¯mêÌ—:‚3ÙU9]r/CŽ¡Aì7JÅ*¨š®g¯Qh¬øJb !z7ç/ñ¿Ãì\F<¼^Peþ$Ã/¨9:¯\;òÁ¶b°3¹1xc?{8ȉãý…ˆ‡Ñä^ÐÎáÎVgßÊ'ˆ§2ÐÜV™4çž}*†ÃÅ–¥%xâ’·'I0†YÊ•]M5àV½¾Þ|ÍI0:ªw™ì3Û⻯D÷I®dê¼0†ˆK÷#b€ÓíÛ¦,ûã“#ý6W}oí4f"*ŒÎò°O‚(¿AFâC÷Ð0'öDwŠ ¹<Øœ?‹!HoŽ eòJÆ´{~^©–DC=Ešv n¥x¶’­ÝZ°Ÿ¶¹¶¾wbÅ ;„6…q“ööHÖÑ D“³Sš Àv!gRÀ86b° +åë…ç• + +ý=Ùušê^¥pâ´f¹VsS1eß;.Ó³_±Y¶•Ôѧ‡…­3OŠ’U[ÙEÈ>Þžg¬hf×ÛÚ…Îô ùT¢3Ui¦\/[DÊW]2&€`ݵ)ä¢Îåã¼.'³Â@2*lmÇ,DÂ¥Š^fÉÿh‘í…c—,U,+¨PØ íPÓ$ê‡å$Xħ©àeØ %nÛ4KøËËd9²ý0 EµÓ Uþ—­nÕš%Ov¿ Ã[¶Œ(|ÓS/Èi8ÏšB-1h:rŽ +»«<–ì“Åá7œžå¶q6R,eu‹žÛüÑyg†×ë±qŽòûù=a§ OÑy'9(5Ù(½ÒT­£H>/'ÈæhÔœ¼$`ÍÜ]d®>Á  ¦V²Æ1`ÁÈmrHÚV-ö\ÙUü_´@=D*!©ÎK¡j‘W^­x„ô uT:^ì©®é]ƒTJ1ŠW-ò}lO¤ÕHÏK]pR©Í‰Þåú¥Ó… ìhpÝÌj%x1“ì¸Èëy༒‹°y±r71æ€Ñ­G+ !ÝôеØÑ§›m;-ÁÊ@Ãå<œýøˆ'™w ¡Sú!ùƒA.dÏG_3êXë(œšâ&­Äõv,mw‘öˆÚwàà-Y^/à×”†£Ô\&»M)çø(è7¤ö¦åÚ3²ÍÛ×oˆ`/į%ÔP²~gúÌ2õH¶7Ãé$PTY³­ŠäªR€›zÕ&ªÆ¥6ªo¢-©NïK„à ŠÆ%aË3ŸL¿]OR.Ìò¥k«1OjYæ9#;ÄAÑrE@İAwTú“DQ+Áçà’BÑ€'öâ`šÖšîo.^Jsä0øâhØÈÓüþà<@˜ d}³„|£q&•¢k-L†Þ Á´žIB]žÐÚb¬˜Õ¥Œ ÌV6ó* dºÖ„d¡¤÷–¨¥­Öõ/‰z‰t÷WNé¾8Jùêi -ykZ××PÈ‹—òdOƒw¿~xÑQ9HÂËLy›I–¤dÂx`Ô\u»[}–^&‘å…CŸº•[lÖ×ͺV A:u Û«–¢x¾€5sÇX·M_·ˆüþØ“WvŸ„n͵i{9Z Õ– tÃ>²ÅVˆ}JêNVûÆ,àzéËbÇѬIBª€£|)òÅ[­ôñºlØ„ñ`¢ÀâB»îàóKJxVW¹uÉmªú¸ÊŸĉ,AŽNP2…µ(×H®:ï f±»ª”a¸Ža<Œ¿l³¨Í¼X$¡Ù“¦D-¨ÒäJäŸç±œ9ÿµå­5Ü Œ¢Í¿·‰·a5IÖžqGökg¤Á`R4ÑHÒR2NçÓ U÷_GŸœË@@]K¶#;ÓFΦèå}XfáJDº³õ‚N¾6(3‘fº’–³…VvGΑº©ê$9¶LÖ_„iͽ­¥)L6þ¼JJce,¢÷£Ù‰õlÿñR4þRÉØŸ´5¸¹oþù|K\E–6íÚ)“C‹È¡n…‘Es2¥ô˜RæC@+0hžKÊÔé׈“ò>GD鬿Oïw5׈± +ÃÈ”pF´[õUã S ¤ èD;Ž¡öŸB—;S‘ÃÎŒ@êÃh8qxD3ñ‹„ÛüôTçÕPІ܌#¿òxk%pðJOW³kÎ;íÙËÌ£tBù¬¶Ö¼~õÞ¹®‘ÝG•(Ù|°5³É¸kÕÛän ØñË{ãš´@M´Ù¹R[Šr<’ã å­3ƒ¯PBIP€;›¼'3ëšî“Üœè¸ÚPûÂt¤¹æ7½•eÓi†&™´·y4µióÒöOÛDÛXßl©‡ÚR—ÛÚ5Ôë¾ÝRÖò禹þ¯u?Ón,.ÆP6‹§€>Ø€±êû1fÛóùs"=zÉ×1²õ QÝÊÞV –"ÏGŸñ8¡O¤q9ptÖLSsÇ ™ücKݲ•:0.[a­øfO«}è·®nk8žq)'ÍôYf] Ö¦¥;FhWóü!²`f!:—Î_ 5TʧV¾¨û~ºO¢0üê÷ý)Á—_Â}/ÙGa|h«¿A¼\Ë÷0 %Ûó+TßZö™yI2_÷ÕÅÚ²µjß¹«‹'Õ<ÕÄ®—œ·Óþœû%_a¾ÒÞ¯¨1Kp]Ò¯*qD?£B%ú¦ŸYkTß³+:åMV|Fu(‰›“Õïo½­ÌàN-6Eq£~ýšjþÞ«? Þö~'ÿ×Ï9XÁ)¦øa0ýJ²ÏaJû L$gæD¡ ÿÈŽ¯wGî>W¾sƒŸÈ núâkÅì{?á'oç%j0dBîûåðiÔß{ó/ ÿhþz‚Ã]*‰~q²¢¥ÿè„‹endstream +endobj +659 0 obj << +/Type /Page +/Contents 660 0 R +/Resources 658 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 648 0 R +>> endobj +661 0 obj << +/D [659 0 R /XYZ 406.9776 658.2409 null] +>> endobj +14 0 obj << +/D [659 0 R /XYZ 90 637.7268 null] +>> endobj +662 0 obj << +/D [659 0 R /XYZ 230.4521 230.3912 null] +>> endobj +18 0 obj << +/D [659 0 R /XYZ 90 209.8771 null] +>> endobj +658 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +665 0 obj << +/Length 3063 +/Filter /FlateDecode +>> +stream +xÚ¥]¤6ò}~E?2Ò4á³¼%{—h#­”KFÊCpO£܇áfç~ýÕ—ÁÐÌNt§Õªír¹\U.×øŠà¥™_ÄÉéPuwÁáÀ?Þ…²|„õ£‹ðýãÝ7?DÅ¡ð‹St:<ž‰Â)ôÓ(Œõï^è'÷Ç( ¼ï†û0÷ªK3ªjœh¢xå׫ªš?‚ ªxþÃÔWc£{Ó,H#/¾ÿóñ§»¿?Î|›i| +‘‹Ýýþgp¨ÝŸî?.òôð“À‹":twIÛI{÷ëÝ?f:¼@ö¤MÃxOÜx#nÓŒ¥ýx¾?Ƨ“Wòϵ¬>߇§FœgÞ¥4²> Í}”zÿ¾SOÕ-Ro¼(^núë4òðRöu«žœE3[…ÄAä‡9Èg™!qpex”_Áfô£ƒ+Ü Uqj®ÿ$þþÒþ‡7¼$™DA¶æe£Úé¶´Ñ–¹è©­Y1OŠÜô÷IZO³æ-Â+ÿÎ*îJÀ¥Q¥ûqÐ-Šqû³|…¡_¤)ŸØj}õïÁ"ï‘€ñ6÷¡j¸?†^U˜9W{UŒüÒ´-Ã{µÜ» >µºúŒBÅ©÷„¬OBpÙ5(x2B«”UÝWJ˜úí¢d±Ý †¨&"5€ÍˆI˜z ‰ƒµ¤„%©W^¯mS•,ΰ/—¦ºðP°Ñ`+Ý5ý3ƒ]³§8AÓÇIÓª¯ñ^pÖ•¯<¸”(9ëE¨ ºž*‹¨{3pzÈ ®íëöd³–.$é,ëàd¬õàøI‘QýÈ#=>ª) Mkú,3 z5’`zøÌ€š¯¶©¡vßøðö±UÙ¶J`£žY©gVæƒìpÄôg93ÿ% Éù³]7èOáQŒ`©M§€a@IšƒÁdè\|š!+žyéñÃϼ֩ +L¼1‘=4EÚ¥®Ì/@É^ðT8r@ôŽgËæZµå+ŸÀês¯ñÜPÄóqÏ0;¸¢ÆÆ=”½éc$L…WAî zêëã84W^@Fx¤ ŒÉ¤AmǨ8ÉÃ!,ºVØÎŽAÖ1Ð]šþ ‚1²¨`Ù_xW«ûû#  ábpûEÂô‚··nqøP,„g/„g/´õÑàN£S”Niä§Y˜½0,þÑݰã¯oèÚaÕòfÔÈO~”æÉ†£mذXïñqC ù KϼïUUNf­ÂÍü›?‹îÙMâG†ÂíÞ(ˆޱC+O¬]ÂssLà/le0ªUÙ²›Ìbpïã…Á%ì-ĉýHÈš,®=l\y†‰V„7§Ç…Ÿ¤a¾¤aüoù#Ów ÈGÏ2v”ÝxNCýkjex†÷Þ™Ôú°³“•”Ô¿äÄ·é®­B'Ez…3sÊ~¼p7éOf‰„ùOX±± +†3—‘ÖʬìÜÛ0õ`ïIL) Y{®„(SH4*ØÇ©'긅x.ìýäZcSMm9ðÜ•Ž \ÒÜø¬zxü#àŸY]å|S[8JÁ}>;Æ,&TkŠƒØç•²Ò0 7‚p‡9fgOc³C#L kv~(†÷ᢪÏfê˜Ú‡²EÑ­SÝ1/ “Læ‘™±1¥`ðQðF]é–J½:ÿT sÜE¸F¥È37vUά˱\ +I–*kÎDà`=XK€«ÏÙ½âx'”!ÿq­S‘c’Ãs„dPñ"çÁ ά5ZÁómG‹Œ¸ÁB;`Xv8¢2¤¤ì8Àä~T‚ß}7Ë~Ýr*»yb\âÄhî;ÁAUÊ-Ø@59'Ûôkä·C¥–tyyfï)·Ï=Ϫ€ÁÁêG™Íçæ¢=H‘r. °ŽŠï“6BNŸÁ?–h¹çxu}¸ÜMFv<Éd¦W³ã­ã€¥9KY9XØ8?À°ô­ósYšn¢s„Nn›Ç$Òo—¦%wË>€]¶SM*†YÉ?ìœ dW.è·Y×–æÜ.¸VÔé[¹_”å~˜åñŠ—Mæ7ã|ƒ<ð3tâò¤W`*E‘üEá-ö×ÞдÂÕ;ÒǧÔ;&ýŒóU¶”$çãØF¢•CIs÷a6£FÌj¼hH8óÍìᮺ©±ýºª}šq´ñº‘ßKó|i%EÔWÈw›ÿØÊ·4FuO­-”‡ z˜óKÙ¿¤Šåd]«¿Ó#‰éqt|jFÛ˜„<¼S#—l% C.Îá6~ó Ê +Êùóå€H.U_ÉÖ~Ꞥ2Îmlp¹!¼ÎÆ !$¿É¯±:Ðü[ë=>Çà*vüÉ¢ ম'+(%+±iÖNžÐCõS¶ë\fžU +Ê ì“=£Bª*¹.¯Ž]®€³ c‰ BJXÂ/[fG¤€—M[‚íì%*ZJ¯l6¿rÕCrd‰­©bï +¯+9)ÙØcc‘&‘`HFìᯤát•Á²~܃ÃHVêvJ±'A]׸ðúvÏŸÐ:ª`iSuPyµÛv˜j­ä‹¾±Ž›Û ˜JÛ¾“M²U¦ë·´¾ÈåÝÏ,JwEž­xŒÒ¨Ý6– â© âi´èÄðBÉ?ŽcˆŽâYÅ:è·bKÓÆ(PR½ƒ“ŸQ¸ædž-Ò׈‚Ü/ò(_q`#Én?´'[6}T\ù'ÕéALñSÙ—Ï\>½[úÄ+ˆmW%^—â†×Øâ¥[" È~`ÍõIèýòݧõºPÀ㣤F¦‚ÃäX8LOµò±*ù ;}Üб@¾.fwØKK`Ÿ›Vsí³×·9sõÍüäÅŽ·¤õm}ïtÂ`“͵ iMä (Ö á¼°íäBÞ=îJ~~"6´!e`‡3w°X‡Rklwý}’¶Ñ6ßçÏ2©T q:W c‡@:ÐŒbˆBOö¿u4²T¿öe‡®—;±.\€zSó¸«S˜€ ™*jÔF–yÍBZN+`À‰´rÜ3ÜêáÜ’ Rî¬v¿ÆÐÝÄx#ÝÖ\­B·ê¿á*yrB£ï‹5qŽ.é‹­X>ò½ãÚ>íJ÷½²®`´8ÒW¦8pbÅ ¯m„"X#\aáæà«÷dU½žžÉì365øÅ< 0}þ¯ yœ“¥ÇØ+øÒt”Ù¶Ì’žTj›ü1÷õv¬¿ÆžÝ 7ÖC8}ׇóXu`ãlÛ݉pTl(©˜NÊÝ‹Ô~†Áb.é­fÆ7l2šÍfûÖpL¯ÍvÓGjqu‡HŒÕ.ô°„&ž‡_!½w£öó%åqÍù•Çò-›Wø¾«îÅúä|tD› Š¥W¿ÚÊ­-‘ÆÜ¥-laäI°ÜfÒ\¨Ð·Ø-—=;ˆqOÀå«gGŽø}3 XY}KãÐ2Kªá2Çëœ!ø¿¬F4]§êž$†0Åù¬Ðª—„l¥¯ÈÖ뛈À´0ºg¨F=Ô%ÇØâFÁ“¬©ð°…%CNÿ!QB÷GUhf«Ðbýß *ÅŒ$--¤¶Ì÷¯„É~“«ÃŒ%sæÇi±—yáßt„~˜d»µx)ExJOÿמÐÒä°%Œ#÷ïhN~‘ŹýÃa/áGÌoËÑË6üd?¡2&™„‘üßFñ·QÀ³(N<"=ëaÓ'}A|’lêoúË+äÕ[õà_Åìèç¿=î|!endstream +endobj +664 0 obj << +/Type /Page +/Contents 665 0 R +/Resources 663 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 648 0 R +/Annots [ 666 0 R 667 0 R 671 0 R 672 0 R 675 0 R ] +>> endobj +666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.193 726.8189 348.017 737.7228] +/Subtype /Link +/A << /S /GoTo /D (a00146_ga4360412ee9350fba725f98a137169fe) >> +>> endobj +667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [328.2665 649.4187 387.2547 660.3226] +/Subtype /Link +/A << /S /GoTo /D (a00146_g1024f8a5fa65e82bf848b2e6590d9628) >> +>> endobj +671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.0892 410.0069 279.1746 420.9108] +/Subtype /Link +/A << /S /GoTo /D (a00150_g2addf34c7d457c1a7899a7e2171ef1e9) >> +>> endobj +672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [296.7031 410.0069 366.2118 420.9108] +/Subtype /Link +/A << /S /GoTo /D (a00150_g85b65e38aa74eba18979156f97a94a87) >> +>> endobj +675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [156.7987 273.8799 207.4884 284.7838] +/Subtype /Link +/A << /S /GoTo /D (a00150_g6832e4d2d046536b6472f7ac92340f68) >> +>> endobj +668 0 obj << +/D [664 0 R /XYZ 271.0497 628.6614 null] +>> endobj +22 0 obj << +/D [664 0 R /XYZ 90 610.6547 null] +>> endobj +669 0 obj << +/D [664 0 R /XYZ 247.6771 537.3319 null] +>> endobj +670 0 obj << +/D [664 0 R /XYZ 90 520.446 null] +>> endobj +673 0 obj << +/D [664 0 R /XYZ 418.9827 401.2048 null] +>> endobj +674 0 obj << +/D [664 0 R /XYZ 90 384.319 null] +>> endobj +676 0 obj << +/D [664 0 R /XYZ 244.6786 277.033 null] +>> endobj +26 0 obj << +/D [664 0 R /XYZ 90 259.0263 null] +>> endobj +663 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +684 0 obj << +/Length 3355 +/Filter /FlateDecode +>> +stream +xÚ¥Û®Û6òý|…Ñ'ˆUQweŸ’¦[¤@€lÎYìCÛY¢m!’èèғӯ߹Q[IXøAäp8œΤÕ΃ŸÚeÞ.‰7 ÂxW4Þî à_” `ü°Dxûôðã?ýl—¹YìÇ»§Qˆ•ùÊß=•¿9áþø~;O½?ø‘çŒï?rãé§?Úv?äÅçýO¿>üü4-'ÜDA¬p±/¿ýáíJàê×Ï ²4Ú=CÇsU–ù»æ!ôÛ©þ5Ñáš°%T¤‚-©‚©|è&,T~½ÖU‘•i‘ý̹ä=7®)tß뺱ç ,tæ”ù» Š q>îUèäÅ^9Ÿ÷ÊsôÐ[Ü|`ä¼ëª½9îUäç‹–µ˜&L¸ã¢Z3Qµçå á‚ç6c/‹5ª4qPÊÍ¢ˆ%ü2êQ—¯€c•9º +´½Ø9¾ð—h^ä´zxF9L÷™GJM¼W… ˜oÍ\#ÂÄ¥ÔÝ>ŠÐX˜$΃Ì┩ևâR]yÎÏȰÀÃ…i‡ÎÔµîz¾ä{ß³zÜÓ´­Ð9"îxBNB!”] ¼vE3¨Î»½J³tukÆóE° ã"#yÕ2 À<÷Ò ­É¿VÍØ0¬¯þB³ÁæRªÐ9uy£{Ò…rÞMJ[2¸M±2»è -k2È,“M°†™M¶›zí·ïôcqa´¼çï§Çƒø2ÃtC/˜EÞ2Ba®h/ŒRµ…iÈüpìø2 ³8Àúºüéõ5ïòAXYëŸ1ʱC:[·¶~?^X=:šç;ïO8ˆ¬€q·Á$=!Úi¬kËÔ¥ÊåG¡ÍÚÀÉt®Í1¯º2¹(¼óı‰#”kpÈÉÒÂ’<“•<”W÷æ›4„×p‘¹#ç¢óicû 9`ê˜q8ñ¢tJ…ÿn<4½uê6¬-{™÷ÒæMUÌDÈY}§Ôä/ÜWKg²`àƒP±p3YA3ö ÛdñðmÀ tcÈÛ¡;öìëÐdM!Œ ¥¾Ê®C6›¯j™J<₼òj¿ûõ¢ƒebUŒXÉÊ + ˃>$Á ÝIöÃÉa¡Dh êÀ|:­f6Z'¦C}¡ü°Ëh¬Bª[~÷<ÿŠ ¦ãÍ"Ú< ñKm ¼ˆÇz™BTÝ·-+òxhTVŽÅ`Ñ&JRÎÔÜj9ÀX˜ïyR¾ÈÁkQö È\{NåÔ:|è#Úü¹wFXÃiRLb¨…?«R˜§ÒúëÐÓ°Ï6ZKQO†=\:<6_iùټɒ=)éi°^Í•@- ŠËcsd“ó¾éeÞÚË€AººR¡„±·<Àoè»i˜q(Wn¼?(N¡opñõm‹ç|$—2pT“ØñK¦S^HøÝ‹¼7ßÃGÉbË%XËOÝ8Œ³9m¨,qÞ,—QY +ËÈ8ÊK`&¦ep|¹ á”·Â%v‡‹ RÇyÍ×ë%¸¯v½Ô¡*0/¡Åö·š/؆UÛzÍÏB‰öxãAW9>“á8ÒÈ\jeh,ŒÀy S@ò/ÏF(h¼}{~ÇíÞ,Ê÷%)›¸ÆüÅ‚xà[³öï¶ú*)5ôß®{÷—d·™Ï×°Á¨¡T\IÀ™ó¡*:Ó›ÓÀÝÿì©8•co¿>¢Ty\n½µòÑ•üŒÏ‘ë{DÌõ¬6ó;Y§ŒsMÞB•@᥸S"¯x!ÄC§Î4 ¦x +±…Ê´~á|‘Hòþ³@ÇÀqÌÏ"°Æ1ª¦Êy¬¸ÊNì†GÀXønÖ¯ Ž„…°•@Nn!»`8¥s7E·A"ãö`ÜÅE[bãQL±gvûd¢Í7Öê¯âô±=+Ûã–ðÐ `ªî-‚1 À É ª‰l˜z%èµ¼¹Ol’·!µyx#ìÖ+v%:½}|'ari4‘Ç.?‡˜Uõk§a¶™!òŽÒ¸Ž$@Ýo^„0¿| ²D.®åÁÃ`½l¦ š8ë¼–›«Î f–€¤Œ}N™È/e<Ô·ƒ=$ö(²™q¸¹a¿³5& €Q¼0ܲ>²ñ$8˜ö„<){.ó˜9O9?t9~þ»z>éµÃá˜KxòmSöšg +‚ +öƒ*hIz<Ô 25#KmH·Êâñ¹ HÎ9Œ º=ð,hÒÈõTšìü8v“0 6ŸW,Òa‰uÿp”f.K •¤nâ©òQÛ*»îÍëÛå•ç»Ià«ï®ºYªBhÒBº³ }Zp©¼ÄM,»Áæ2oOxòùñ^µÀt]é>ç–í4q£„ÿ®Ú’ÌMã,š=ÿâ?Üá›dÿwü[´‰¶ØþŽÝ(u½$Ü-éÞqk‘6V‡Ë:=¤ù ¼0Klå*©²î_»\*>t‚í +Œ+öGo|4X¸V€FMÖS¡›9=D´Œ³r?yzXÞ¾È3ÇMpÄ™Ïm_ZËÀª¨¢y=#C`ñÒ\ΰ­”–0!R_¡<Úö¹¤Ð='m›ãxxŒ¡({ƒÔÒ[>’lqý׆„’@'°ÂRa;Yò‰ÝTÞ…` çîOÜ;m!k¥ö=“¦ v¯ B¢VkmŠ7ëƒÞe ­>¨s§¼YfBTX³_¾ê·b²«Ð²÷Šƒ,|oÞ(èŠ*7§p%LW}ЂSÞaªØ<•º^Þñ‘v‚€7>ªF^`¡I·¼Ãí +üi>ßà£Id™Ä¡œ?­–cÔûÄ>6˜}lõô kŒW!i„‹™4Ëo loQ)xð;]° =šÅ 'ö]¬»V&ñ# Ð˶ `¬LYáξĈaEr׎YVèÈ£Ã÷—²GŸ ÖµJM¯pPJšV39:RUˆ`ë ÿØBPùŒàJæWþ²väA7l¥‚ax¡ˆ>‡!¬lvh—•½ºæ ãËÇ« óû yJ†‰´|oéàá×Ð Jà‡\È l}iÑ|,!ji¬ò#yVŒäb iÚ•á¨É u~IFÆØÔ±-¿ÿ‡çNEgÝS>†^.ßÞØq ‘çp5Ÿ5M*üì.ÜΚß^qàž¯+hòÃpRÕØùôzŽ£ŒåP°/ÂYùwßVìRnH¨íUŠœ^Ý­ÿÕ(W…ÉæŸ|<Ȱ*Žâÿë/7ôO¡¦¨u)»Y¤˜¼&âÅ‹e…ûE·x´G{ÕòÁ6~E¹Gé(_¾Þk?xí{Üó=/–s ªÃžM¦šB¹‚x”Ë¥wæëËY··JÂmhé¿Ô¦ë2endstream +endobj +683 0 obj << +/Type /Page +/Contents 684 0 R +/Resources 682 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 648 0 R +/Annots [ 686 0 R 687 0 R ] +>> endobj +686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 263.5952 188.5792 286.564] +/Subtype /Link +/A << /S /GoTo /D (a00158) >> +>> endobj +687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 253.6974 159.0703 262.544] +/Subtype /Link +/A << /S /GoTo /D (a00142) >> +>> endobj +685 0 obj << +/D [683 0 R /XYZ 412.7165 467.575 null] +>> endobj +30 0 obj << +/D [683 0 R /XYZ 90 446.1709 null] +>> endobj +688 0 obj << +/D [683 0 R /XYZ 90 242.3602 null] +>> endobj +689 0 obj << +/D [683 0 R /XYZ 90 236.5671 null] +>> endobj +682 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +692 0 obj << +/Length 3453 +/Filter /FlateDecode +>> +stream +xÚ¥kã¶ñûþ +£_*±"‘zæCëå’n¦ÛÄE>¤A K\[9YrôÈfóë;/Ê’¬½] 8à̇3ä¼)ãÁ?“z›8ŒÝTÑ&?ßy›#€¿¾óezó»)Âß÷wŸ¥ÒMꦑŠ6ûG¢ùn¨|µÙ?9¾mw*ôœw[:—KUæY_65Ú­Ÿ8ͱÍÎ ¸¯{Ó>f¹á?ÿë…Þ»‡{øñDAà„ÛŸ÷ßÜ}ØL Ï¡Ž|dé·»Ÿ~ö6ðþÍçê4 7Oð‡çúiª6ç»@iûGu÷ÃÝ¿G:â!<šÖÔ=‚Rç±mÎ<Ùô'Óòpÿþás»¶ë³ü£¬/k^ÔŸ²^ òۚ߆²5‚w2ÕeI¨ó ›ÞžNFèMY-Áž3ˆ¾ó}7 C©o³º;—]«;w» •vþ%Œ+ÿÊ8ŒGÆa|Ø*Ϭðó„!˜š}o +YŸñˆ†ß³97í3‡º/+YiILVÈŽëw{}#Œ˜5©º!ÏM×=U›¨(r +S•¸þ÷­:p]ƒ‘ ýâÆ8h±^Ʀ¬æq•7umrÇêŽÖò>±wUlõ +S%OgGw¨*ŠN¥ £­eB$°«®Ìm1tŠ»0ŠXry…Ë>yO<.ï ùÉP´WVkxõÌ­Hd™ÆÓgÕñ Ilô/ƒYO`ÐegÃbº4Iê#öí¥ úÚ †tZ—„Ñ)ÖÎWœ]‰‡Sþº CG6‡¨ZH‹zŠXÉT¡VÔ-cbKŒ0JL¼HÌ…X$ƒ’l °N„<2iåÁ)—DzÎ*.šK?Já…µ6 Js›y&|®‡Û§µï:N9ÊÆ ¦M'†d `.ž&ª[— ¾AåMax’4 CGA ‡¦²žcòLë0ÌKÜÃmkY211Aã”Õ6œwU× á%!ÊЭ‰Yž/M WN±HKXQxgF §ô2#H0h†ãÉâÉpZCV1ÂM\†ùæ‚¡jü“NP!KkK:ÄdÏóÝÉR¿^#…]å[ÑK"ØŒ4À(Õ] :•ˆÍý3ORÚؤ4°)%ÃÙìˆÿâÊa¶æFF˜b ¹lKÚÕÎièTòæ|©È·þ!ìQ4\ s6Ê–¥%GZ‘ÉÑÀ`šŸµ%¥ù˜8Õyk²ÎØ”(ÏûG)k¦ésèI¢xŒÆÁˆéZ$ÕônófQ:ƒh:‚Ê4Žlåìú.Ô½¾ç½P>øxÃ\€Éé99º~ÆDnoï~~R¤pC×ó”½£©  drCÿ¼gèãPç¬{‹’\{±›øaº b"V1WÔ8ÕçûIm=âï¦ n ì[º(Ùî~y÷ððþÝ·ßb¿€šK†âÔ£0Z0´(ñG¬×ظ¡†l|Ƈ".N‰“å]%Ð\o›iöÄ'+Æ2õ+lË`é–­©æ7y>´˜_Aà|Èȧáb=8÷‡•XXWËö/>fzÓ ²½S³0°¨â§q®áߢìÐëewbÔƒéŸ(©äÙY˜»a±s×+kìùA:Þ +|®¡8ÓñÄ{þóœåm# FOeUñ¼ðÿeÕ µ•¸9œ-¹§°?M+ÐF uSïŠþ ·ï8:„Ñd£Ü@)WSž¹ôØ%ú†xU— ¥ãaÀN6õ¯ã¥ €S?ºvÙî ÑJ׸˜±$¾ÃºöÄ4%ƒ˜n‰‘f–V#¬ç_Î0âÜ (ôåÙ" óWšëAu^S›íóÍîO‰ûÛ[?ÿ~ì¥HëLÐ@üW} $ø ¡¿ô†Jb%§æìþ^øE‹ö}ŸMÝV?VÍ¢<Y©Ú’ªÓ¥ò7 ½d£#å†^ðª_´ø»é‚‡tC—úåål=Ýp†n +µæ‚‹¥3´X¯í&®ÖI<ß›OQI%ø’A(‡’é9qÁb 7 +µ~ëAø¯0{K÷SÄ¡ëÀÿôAX¯í' ‰¾šïÝõí9bËi7ö^ifBœG6•ŽâIKÑNëDtµÜÉŒù"|‚d¹’¶¡’Ì9’ôéYm¿n’8ZË-ÿ‚ž/Òb”€eœ2U![a¬¾’Zj +‚E)èç†A½v³‚¾›â¯î’ª½W.¤w'dfõôÊû^êê( U Ó X½ók7E»eË÷•ë…\©Íïœiy»ã®_5ynC²Ü«q. ¥xåóðLËlxŽnž$Ô™=™k$‰æ'‰å?:ä@bhˆ}WÊIDyüfE‰GÇó’¹sù0Š€úŽLqÿŸjYÓ?_ÀiWŒ%9»ô¤ÖiqJ¢Bµ»ê8†Ý>ÇáÃ÷çácš•üm%ÂÄn€óó¡ÂòK3~¹’:Íwª†™øþýî¨õp>˜VÞ¸ñ‹çÞÃìi&ž½Áå-¼ù)&“NÌ] ƒñ±B5Wà)ç+ü›n6ÁjÛ¹ùŒ/X$šÇpê‹-Ú¡JÇc‡[GWvµ$RˆŸË$¥g: ýc¿`Š3&Â0CÍlmkU@°Yša8•©þÔ½ißóôR¹–7ßn/Œšß¸n×ò ÄYÈyŠtìµ!þ‚KXdè¶å.mùý‡o¿û°çñLèI,g§Bã¼RúÍ™“–Ìé{(zK4ŒßÇZôKÌØ^M–è‘JÙT _ÞÈŽÂÕ€ÆjaéEÏ…º(Ø(•ºŠ‚W¼üˆ¿›.Xñ§7t­Ÿ—4“Ñ—Š@>Ø®L-\ûˆõ ++*ð\Àˆæ¬pãT5:Q_Ïp|0œSÃǨX§íƒ&fÖ \Â)%=zy=‚m³K2eRJ?gJ‰gV,M4­9!cã ÆìLKüж•¥'­,\÷ $ €ù®üSFl¢Áuéu76¯ÀiXpõ…Åm¥}6ÝSúðÁ‹Šfã¾òcªqõÖlbŠÿr61b½%›@!+S¿¤}>ØVàEñFy¡úëßWŒH» ÖŠ,iáþt6)Óãû JåÐm# +¯§š_}pvZå ˜e¥TÐ*•ç ˆ·ZØ™]ÛÄ€=ŠZ/é2~xÓvƒ¢è¡­;y$A?ËîÕÊì]ÛÆ‡›‡W=úF¨Îðùó×4R%?R´Q«([°BJ¥ÜÔ‹ÈTÖycß–ø Ÿ8O»(•¾3•Ä­¼¹ 7~~‰Ö‹O•ÜX´ï·X~Y0yÕöœ*ë- Rì}Âo Ææû›C×ÙÄìbüCNH‡Jžñµ«øuè¨bŸçpvt¤&Œét:) ¦Þóˆ^,§HóOûyÓ^y¡/Bf X30ì–•-Þ?ýÙÁ݈Ó]øs%?‘ÌÀ¾#äšÉ”s?€>•u16Òñ ·êKn¯éΔTK|Ò7„äÕåo$Øæ‘йx·„½0ÀnyN®~¸4 Œò)Äø¬£ŒtcÈ€‘„<ñûØŒ‘EÛ_mmÛþzÙáZù|ÌÕW=²Jîcïõÿù²Œ>›ƒÌEûZM¿š‹Ü4Ö‰ýrL˜ÀóþZ¾`(Øèl¯ëŸvð J2Ⱦ’_ï ¥¿PždŠž'ÞÑÍ[—À±]A<È[È—ÍÏGs`ñ³·•óù©{òendstream +endobj +691 0 obj << +/Type /Page +/Contents 692 0 R +/Resources 690 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 648 0 R +/Annots [ 696 0 R 699 0 R 700 0 R 701 0 R 702 0 R 708 0 R 709 0 R 710 0 R ] +>> endobj +696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [306.8197 468.5196 380.7619 479.4236] +/Subtype /Link +/A << /S /GoTo /D (a00153_g41aa744caa46913b3b3aedb2a4e78546) >> +>> endobj +699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [317.8545 359.3516 356.9278 370.2556] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [437.6571 359.3516 476.7304 370.2556] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +701 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.9727 347.3965 513.9963 358.3004] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +702 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 335.4413 110.3636 346.3452] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.7312 226.2733 239.0183 237.1772] +/Subtype /Link +/A << /S /GoTo /D (a00147_g26a14b8dae3f861830af9e7cf1e03725) >> +>> endobj +709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.9727 214.3181 513.9963 225.2221] +/Subtype /Link +/A << /S /GoTo /D (a00147_g1a1bc437c09ddef238abab41d77c3177) >> +>> endobj +710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 202.3629 126.403 213.2669] +/Subtype /Link +/A << /S /GoTo /D (a00147_g1a1bc437c09ddef238abab41d77c3177) >> +>> endobj +693 0 obj << +/D [691 0 R /XYZ 90 757.9346 null] +>> endobj +694 0 obj << +/D [691 0 R /XYZ 489.8655 533.0201 null] +>> endobj +695 0 obj << +/D [691 0 R /XYZ 90 512.29 null] +>> endobj +697 0 obj << +/D [691 0 R /XYZ 153.1029 423.8521 null] +>> endobj +698 0 obj << +/D [691 0 R /XYZ 90 403.122 null] +>> endobj +706 0 obj << +/D [691 0 R /XYZ 243.1544 290.7737 null] +>> endobj +707 0 obj << +/D [691 0 R /XYZ 90 272.1009 null] +>> endobj +711 0 obj << +/D [691 0 R /XYZ 239.7767 181.6057 null] +>> endobj +712 0 obj << +/D [691 0 R /XYZ 90 160.8756 null] +>> endobj +690 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +719 0 obj << +/Length 3312 +/Filter /FlateDecode +>> +stream +xÚ¥ZÝoã6Ï_á·S€µÊ‰’Ú§^»-¶@½^€{h‹ƒb)±°¶äJrÓô¯¿ù¢¾,Ç‹…)r8‡3¿FoüÓ›Lm’8 3¹Íîx§6ÏÐýã–á-Œo§ÿ|¸ûê“m²0sÆmžˆƒÓal´Ù<¿î~k±.xØ—÷[«àüé37¾ûü•ow}¾ûrÿûÃOw†åDšØ:‹ýq÷ëïjS€T?Ý©Ðfi¼yê,3›ã]d¬ÿ8Üýûî_  k›Šµ]Û•]ìÊÀg›Ê{”Ú=ïÉm¹+«{Þë8(ÛûHx(¯‹± òÓéPíò¾jj&9æ¯S&},ËšÇ<`t}X@ K2¨j'»™Yؘ'¤´§-´å窥]ÚÔ‡%j•ܘ_b™°”\º!ÎMVæ¾SÞ +»J¨À$Á:Ž|§¦ËÌÏÏC¹à?ûRæñ‰Àr`0Uq)n¾f¤é÷ùÈÚÓÉkuÂǯݸpß“õã±^Ä(œ5ÁFš£þ¢¢pS^*B!л’dÙ4 ÓLe›Ø¤aƒÿ½&=ýv:aL^ðõ¡¢%üÛ» +)m +ÞÐè…LKHé©nHE*4N§sI~SÊæÏr%acÁ( +R.ãÇXæÎ,Ôg[*xpqÍ1²t~ŒÌ¹x#…Z;Öã™â‰FxQÒ…Ön5IÀla¿Q–†iªn&ÉB¾Ò¯$ÉK®ï?<ãâ0¶‘YH´8¼ê– ´•fsAƳœ„ +c´[ŽŠ¢F—¥%Ñ›nA.ª¥Ì!ïøãÔŠãjÎÅ~í$^oM–?`Ì'£Ð Ë4?ìþØ;a"̇ù @&]„jÉfs׃SÙ^ZS*Ö”x§ŸEå¶xâd@%é´^Œ’yüе­ž«Ú— ÒA+ÞX4`€±¶%FRqáÆ‡D½ôÉ:cèŒG¡xiÑŸIg%¿×2 • IòÊ}þ |•'Èy¦Ä +écŸ—ù×lØã¥øq"TV4|‚›–›ec2éÔó$“úŒÍ*|{è(Ð[CðGIü=žšZº)Ý_87”Ö Ö}å x5Dƒç½o—ÜÒ5³b0Þ€yų +g—·mEêILМ{np=F{d3+Ôáþ’„÷# ÌH +úp²z¬U/|pL‰¸ÈÉ} ÿ~©ã„/O猗˜ÉÜÀLVÙàwŽaSäR0ÕsÇý˜í…f×Ov`$2%elHÇD‹Z%Ž0âÂ!N½æã»²ëò¶:—ªИw²Îc¹ËÏð«dΤÐ2Â}RVv(…“NDš!˜+«[Ë-”$6›dN²ŠïM70ûn€ÄÝͬ‚“f¼¸3}áÅ–´Ko±±;·ì¨ècšë Ê7Èg$ŒŸºÄ*Ö…*i¬ƒHž‚t7°Š§ßN'¬`• ¾>ÜÑ^®–S¦Î¥Y–…è–iª(Kæ"çvÐ 9JH£ëë`fFýa*¦ñíAüÄ.á<3*IM©ªÂ5ø±³È¦E?~(sÎétD¹’JƒO5w6máK@~²`+a!Ež'ò÷=—£"ÈÚ1¾Œµ¦x_ ãX=ï¥îÄ1Œk-+l¨=6þ )ûl—HSþ~•Þºf^,Ô3Z‚Ÿ4 “$ÛØ( +ãÛ/B½¯@ Oo›´¥«¶i£ÐaAa&ÉÒ6=ÑÛX›„*Óf&O;B±²Hhfð–2ç(»¢rØøŠ²!³TbNÒ;+Á@dæH¡ ýÃb¸/}æê#\/ã"ЦqX=r·\ˆ§ßN'¬èè‚ïÌ…¼Q=OCå€|.ÏEõ\¨nH 7s)*Ñqßž©¬ Õø4¹xºá¤Ç +—yÑ<cˆCþâ U5ÄFcÐUœOïLÉPïB 5\¶-Uö›ö]¡‰ª[®s™K%ã#öNœ~’Ó鄎ÐöríWaät¢Ê ‡\hsþÀe¬Rm*i)7a%ØbQäU“üƒxâ}FËÇ +‰jÈØ/k$|Iì› +«Ñër—_ÚŒ°f¾´´\ËÄ–Ô±q°i¸qN›º«ãˆh„Ï>—¾Ô4Æ{#t–\~´l +OœÀ¼õ¥{h‘€ßÑ÷jë»L<ìÄ1AèK}†½B(Š•7è)ÓñI ?Ø©LXw·8NÁEÛtAéø–ãè·Ó +÷ù‚ïÌù_w+øÀ?—eí/Þ^€Ò€íá(æ\ׂÎI­Á /ÜÀ&çŽ5ñ•Ò‰\¬›½ì+þÛàp`Þòãë Ø^¼2Ê>ðáå Îbºv'4RT¾|w‰'ï.( ÷‰Š92ãØ¡©ŸC~|ˆ€ñ½±æ×nZ%„áMÂúž —åÓ¸^ĸ.EÇØíÃÜ€œ/Ö H2ñ—Ë$# +“w÷ÙÊãbTFZÛØåsâºÉX¤€½Ô:Ë…B£o¿°øÉ5¨ÇGä±®‰ãÍð\,Ÿ–ÇdT¾Q’—ÊÇþÓT*\û+B f=›PàQ´‹Ýÿõ†ôg)LÑÖLÿ,ÒÄ+ôwn01rfÏãDzÆb¥?¿ÙŸ}ã'ÔçY>´‘_õµ±_Å_F)'!OÀGÜáo,u¨æGü}ó×ësY¯A¤-ýª'endstream +endobj +718 0 obj << +/Type /Page +/Contents 719 0 R +/Resources 717 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 648 0 R +/Annots [ 721 0 R 722 0 R 723 0 R 724 0 R 727 0 R 728 0 R 731 0 R 732 0 R 733 0 R 736 0 R 737 0 R 740 0 R ] +>> endobj +721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [278.2206 726.8189 320.0632 737.7228] +/Subtype /Link +/A << /S /GoTo /D (a00147_gb5fecbc62edd128012cea0f47b57ab9f) >> +>> endobj +722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [302.4389 697.2393 347.0412 708.1433] +/Subtype /Link +/A << /S /GoTo /D (a00147_g04b053a623aac7cd4195157d470661b3) >> +>> endobj +723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.3885 697.2393 413.9909 708.1433] +/Subtype /Link +/A << /S /GoTo /D (a00147_g04b053a623aac7cd4195157d470661b3) >> +>> endobj +724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 631.7943 133.6061 642.6982] +/Subtype /Link +/A << /S /GoTo /D (a00147_g04b053a623aac7cd4195157d470661b3) >> +>> endobj +727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.8947 525.3067 439.0984 536.2106] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga8933ad15a2e2947dae4a5cff50e6007) >> +>> endobj +728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.3267 495.7271 266.5304 506.6311] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga8933ad15a2e2947dae4a5cff50e6007) >> +>> endobj +731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [335.0564 365.3292 381.8703 376.2332] +/Subtype /Link +/A << /S /GoTo /D (a00147_g61db1dcb7c760e4dd5d60bf4e5576dca) >> +>> endobj +732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [288.7827 341.4189 335.5968 352.3228] +/Subtype /Link +/A << /S /GoTo /D (a00147_g88d2ccf7cd821f89d9a8df7e3948b56c) >> +>> endobj +733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [367.2687 323.7945 419.0639 334.6984] +/Subtype /Link +/A << /S /GoTo /D (a00147_gef6c4140c632b6a406779342cf3b6eb6) >> +>> endobj +736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [457.7775 229.2621 513.9963 240.166] +/Subtype /Link +/A << /S /GoTo /D (a00147_gfbd5fc486dfdf6bf6fc9db52b1f418c4) >> +>> endobj +737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [105.8804 217.3069 167.6481 228.2108] +/Subtype /Link +/A << /S /GoTo /D (a00147_g7b2ac4b18bd2ac3912fe67b3b17158c3) >> +>> endobj +740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.3388 146.6848 217.1815 157.5888] +/Subtype /Link +/A << /S /GoTo /D (a00147_g58bb90796c1cdad3aac2ecf44d87b20e) >> +>> endobj +720 0 obj << +/D [718 0 R /XYZ 90 757.9346 null] +>> endobj +725 0 obj << +/D [718 0 R /XYZ 479.8239 634.9474 null] +>> endobj +726 0 obj << +/D [718 0 R /XYZ 90 616.451 null] +>> endobj +729 0 obj << +/D [718 0 R /XYZ 207.8864 427.1492 null] +>> endobj +730 0 obj << +/D [718 0 R /XYZ 90 408.6528 null] +>> endobj +734 0 obj << +/D [718 0 R /XYZ 237.0374 314.9924 null] +>> endobj +735 0 obj << +/D [718 0 R /XYZ 90 296.496 null] +>> endobj +738 0 obj << +/D [718 0 R /XYZ 299.1932 220.46 null] +>> endobj +739 0 obj << +/D [718 0 R /XYZ 90 201.9636 null] +>> endobj +741 0 obj << +/D [718 0 R /XYZ 507.9991 96.348 null] +>> endobj +717 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +753 0 obj << +/Length 2416 +/Filter /FlateDecode +>> +stream +xÚ¥Ymã¶þ¾¿ÂÈ'X«|ÕK)¦išÃå’öÜöÃåpÐÚÚµp¶åHröEÿ{g8C‰’µë-ŠÅBäp8Î<œÒr!àO.r±HmçÚ$‹ÍáF,€üÃäጯB†?­oþð•/ò8OT²Xß; ‰Œ­’j±Þ¾dœ.WÊŠèûÏÅá´/Ûå‡õë…‘Y,d–‚TdJ‘xóýº_ˆõ°:‘¸Ìo7ï?ˆÅôy}#bgvñËÌôLÏk¡ël¢EÕ²iš3©ºgŠ·Zhlg¼Ç¥àC:ªÐ¯ŽK# \>á˜;·0ó®ÜçÖ‹¡Ïpò¡8ÝV¦¬"»S:i½–bi÷~OãD‚ÿšð!Ç*#aSøÆ®Ü|¢&£ID{ +@HûUUî·Ô©ŽãÔ/©Šm +±2±26Ƈï'Òó¯Â 3>ºBeª…yœX£'ZLàÑs]Y[ƒÍ­…„6Z»dlºsÖíêK;2éq‡á{³£Þ`ÓÎ{%8ïòÂõJñ꣓aŠQÊPŠÁ¶ìZ&€.ˆä4òÓŒ˜¶]hŽâ©Õ~ODÄÄH:F3’ð$KèS¹©\LbM<3ù®Øn›²u[Èý®r_ViáååhÈâŸ;êuÕéÄ ÅD£œÒƒ“µß—,×¾ˆd)%z §®/£¤¶p’¤± k±HÇ_C.ó¯Â sÈÊ})r%Û&™*4…®çº¢†‘*N´Ðc5¬‚‘šbçÑ»†,uª¡¤.†­b!£”ç`gS”°˜2 kTýPö_)Q˜}òÏ”(S©Ïå ‘C“Nt˜˜±çº¶4XÏb•:Z;È;hº°E\c8Ú6Ä-ƨI~¼ïÙ½ˆÂ7ŽlÜû¦dŠŸùË9Hí¾îÚÛÉšo¡ç}ëü˜ð&Fóí?Þ¼yºRQ:yº5®…r7@ø¦É5/3û*äŸ1õTª÷ruÂòÔ±‘¹†Ë«Î&ÚLýí¹®)‘ÛØBÜkq(¾E\*Õ6‚ÂqKw€r*°ä@ŠK»Ú…Cê÷:p¸xBç­Ü¹:‚©å¾<”ÇŽFd²º«:€«ŽWbXÜE;T‡C/¬þÌ€‰hBâ¡ë„/+X¶óhXf"êULUDašß#Åݱá{n‹‡’š„gh´»Ú…#uïÊ=õ—‰u©4Mo0ˆÉ¤q· ñ2cI¼(÷¨Ó±nœÎRªèS5Î#¥9h¸D4“¶2‘ ¼¡ñ |ÉaÐhÊCÝq»t mŽksn25vÂ`,‡boxBáǺóÂëóÃŽÚ¤ðHõ],`a5KÚ{#6F`Ãh­‡¥µÉÄA„_„;ŽSåG[3{ãÐÜ!!š GI¤×®¦=ÿ*œ0sã¸ûÂ\ªà¸gI2Uhz7õ\×Ô€+²ÌÒ‰C¼ESõ¹í…¡•È®àq&ݱ-{\ ujøŠ¶¼â¸”º°º³§Îþ4jgJ& cR˜¤®ÆeÏ¿ +'ÌÄÄ ¹Þ N¡'s +W;£ÕDi`ö\×”¸FÅødÑÌÒÓ¨Qîªã‡Ø‹µ=ó*䦥“¬’ +ɯ˜=.ú{]Ñgö%Å)ùîöhäp&q\ÿv>…ê6Øg›ÄÐýµºGî ž}wõdž2ß-‰ùëúç·ïCJVøæú"î^²î…ï^qú˜áýÏ•¡™+j§*K†ZBK¼ÆÀž¶Ô…v-“0´ãxÚ±ãb‘ô7ä.ˆ0D09¾­ ³zÞþ®²¡>¦>ürꃠlE½å¥Ê¦ÁŠç»§V ôL¦8Û’Ž¤»Y¼ÒTü*ìôI¨BE[iò—A5äž…jÏð,TÕÿÓ³L>vÄDˆ|¯>¼êM‘AmžÏk#ðÊ\ÝÊ$»·rÀ›¸ep ®cÿÕudæý~šPħÒÚáÇ÷þº2ç Š!!Îγ&GWV<ŠÕ‡L~>Ü• ‘\4z«n¾°˜Š ã__pöðBˆÐÔ"çÉäž ë€-“¶ÜGª;|â­È‹¾lsß?ן¿<”WküQuÆ>ÿƒk~vendstream +endobj +752 0 obj << +/Type /Page +/Contents 753 0 R +/Resources 751 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 770 0 R +/Annots [ 756 0 R 757 0 R 758 0 R 761 0 R 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R ] +>> endobj +756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [428.3065 701.7853 476.2361 712.6892] +/Subtype /Link +/A << /S /GoTo /D (a00147_gdd1ab3704ecd4900eec61a6897d32dc8) >> +>> endobj +757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.5367 677.8749 263.2659 688.7789] +/Subtype /Link +/A << /S /GoTo /D (a00147_gdb971fb1525d0c5002f52125b05f3218) >> +>> endobj +758 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [271.5773 648.2954 310.6506 659.1993] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.7077 575.6896 409.0322 586.5935] +/Subtype /Link +/A << /S /GoTo /D (a00147_g8096b0c4b543dc408f4dd031ddae7240) >> +>> endobj +762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.0182 551.7792 411.3428 562.6832] +/Subtype /Link +/A << /S /GoTo /D (a00147_g8096b0c4b543dc408f4dd031ddae7240) >> +>> endobj +763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9277 539.8241 153.001 550.728] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.3947 510.2445 194.1901 521.1485] +/Subtype /Link +/A << /S /GoTo /D (a00148_g87f0b54ade0d159fba495089128a4932) >> +>> endobj +765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [237.5384 456.7547 294.863 467.6586] +/Subtype /Link +/A << /S /GoTo /D (a00147_g8096b0c4b543dc408f4dd031ddae7240) >> +>> endobj +766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.8254 444.7995 180.6394 455.7034] +/Subtype /Link +/A << /S /GoTo /D (a00147_g88d2ccf7cd821f89d9a8df7e3948b56c) >> +>> endobj +754 0 obj << +/D [752 0 R /XYZ 90 757.9346 null] +>> endobj +755 0 obj << +/D [752 0 R /XYZ 90 739.9346 null] +>> endobj +759 0 obj << +/D [752 0 R /XYZ 150.7616 639.4933 null] +>> endobj +760 0 obj << +/D [752 0 R /XYZ 90 621.4011 null] +>> endobj +767 0 obj << +/D [752 0 R /XYZ 90 253.0714 null] +>> endobj +34 0 obj << +/D [752 0 R /XYZ 90 246.2021 null] +>> endobj +768 0 obj << +/D [752 0 R /XYZ 200.2554 182.9016 null] +>> endobj +769 0 obj << +/D [752 0 R /XYZ 90 162.752 null] +>> endobj +751 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +777 0 obj << +/Length 2990 +/Filter /FlateDecode +>> +stream +xÚ¥]sÛ6òÝ¿B——J3K$H¦Onšö’KÒÜÅ7yh:Z‚,N$Ò%©8¾kÿûíb$R±gn<‹ÝÅb¿°$!ü‰E.Ò$ r«Åæx.nüË…àá5Œ¯]„¯.¾ÿ9Êy«H-®v†ƒA‰hqµým™­Ö2ФZ^íõj%áòôò5®ž¿ûÞ¶Û®Ø|^ý~õêâÅU?K“H%p²?.~û=\lAªWa ó,YÜA' DžG‹ãEIÛ9\¼¿øgχ ÁÜ¢!çV%½UEÐMiQf-2–Ëòx{ÐG]uEWÖÁê}»}ÙR«¸½=”Å´ûz%Ë;_ëõW*Y«u’åÃTg™”UÙ•Å¡üÞà®ìöV&Þª¡ â×By’Ðb6Åá`Haf½Éòk«ŸñÇ0 á_ÐpQ11††1&6Ë5ÚÐôúùLÏH)ÀY‰¥L'ƒåÙ¹på2YþŒÃuc'$&‰«‡§¸¸Ø3·®ºú†ÑÍ©a¥¡Ÿ}AýMY\ØÿýòݧËwïž_¾~Í®¸¯O‡-µ¯i«‘U¥ÜÕãáó+ñ<:K‚PdéBe"Y»þ8ñK‹¼v±É7Õ¼5 ûf€ëþR— ¦ +A,ß’8DÖÄáÿ­‰8· ¶ƒXʼnaq*o?ʶÓRýýê×·ï±!"#9þÿ`ˆ×sÔõÖÈ‚’áXO•©Ü!6JVé»mуk"áŸÒýõ8¸îcÜê + ŸÔŸ? +WOž•|ÔrÏy©ô)èåÙJ" ÆÖ[GaqˆµÔì,%SÕó¸(‹0›X$id¹â¼ŽCÍ ãüËqºíL3â”ïÔqŒæ=yd”"¾<žë÷XH!eÄ$… OÐIcâòåiRЇD,«êÞÖMIG†b0G±éNÅÛ”rÖdè(æ9Gن͔e®Ñ w.5àh¾<µº%<²(6tÛµ†2P±\$ +)ñ&µèkF—>WkÐJ›Mis¾D*„Ý3UžH¾U-ÖC’(d!lã#Qpóñ§…¼*•>Zÿ!&|­.È¥ÜôâËKDiš[=Ö’Ä2Dœ'cIŒƒƒ‡l5xö±¬Øuîö«dyOžUvä­°Aƒ‘·Þ­D¸,Ðõ”ä Η/w$T^Ý©xŽ–Ú×zS€C{ô>Ö·uŨ{KI·£VÉ_t³§ØL{P£ÛÛºÚ2 •7F´Š¾±Ÿs%€YŒ\ãÅxÁš:Kƒ¡~iЖ†Z Yá.þ¡¶[2»~ÚJwµn>³3Þ[jkÒk&it×U Ž5S§·¨’<³fí×)(4-’Çõiô‡¤‘v ¤Ë·d vû¢³­’ œTEC”÷Ìš‹Õ–‰hS#¾eKÛŽŠæ¹_ò|v¶ªf@£ÿ8•Ñ4ôvPñÍX²àúml@§Ûj“­¡ÅþÈu÷·&ÏB«s*Ù`-_pÅà<Öž6–r&çÆAÇÖ"D¦&]Æ_»sY×çkS Ô¯•Þ€éÏ'Ý,H3¡<‘&I—±$ÅŒ ‘ dqÎ 7ŠìÑŠ°øÍ?ákÑ•G½­Oç3n,‚LªüÛzè±cÊ å¸’Ë½Wî`m‰å i:„s¯ÁAD«µ¡x¼$zzX ˜Þåö‹IÕÆ(.Ñמ/±ÂÌ—G˜AÁQLðD~Ëet(oöE²\ëFA±¥KbŽŒ”7l¤Û†‚¥¬OÌ®®4æ#8{Q"s޲ŒÁ=bÀœü½©àà<{xÃã–¶§°ÒÆ:ô\Û ™B„ÌnCãÛÞØã¯]‚©Lùºa9‘"‘ áIáy`õÐÜiÀ‰.ÏÝvÍ òqÃ>Tr΂]iK{ß:c2˜(P`ÇQdè¥NÐ$öòXІ€˜OÍלð¡–hpg›á!Œi½`”’¿Tc·.W³i` njíjž·¬`'19âqî3Å/MLÅŸ¿ñ •ÌiÅ/mÐØ¢òBæy?fă/_’@Ë¢Âä6Øæ-3M¾ØuyÃÜËúöN7†¹Z H ¦eac(·Mi¶„´f¥˜‰‚;}°ZA[?ù°Ê`çB˜þÛ‚uÛ7ìw{턊i š¤>æîÂ⣸sí­'…s.å¨S£4&ä½GÚaadiÃH‘ÓÂê[Ý_½@÷X|Ƭg6bÀ*jÔŠý^­+, Œf\2õPr›š:N((™{1ç®Éq:çA½Û袵º1ΈÀ^{à•ˆÀ¸FøRÍcrmÙÝ;ñhHMa…A¸\„Öäf `\5Ú,çNU#èÂŽO]ÃÚ¤:žÚnΉ>WVuRBõN*%3±ß¡æÄ+8(¬±~6&€Æ÷@ì=а·1vpmxG—(Ë!ö¢ÉO- 䔼ý¬gƒ‚uDûÕ6Öw•z½:1¨G1ÓŽ3)K;¢™W2‹ÚN]XsYåɼ`’Žã)៫ÂÞN-³#){Ö  IHÛÒHg™M2ÀŽI69@oùPå­ú€ 7vv8òÜÐN,¯ï½iø,7c”=›:ŠxÈ–G,9¨¹/VQÈÕ6Ahj<À\ÀD­o±u‹Ro ‰6—ÌîE£sxhœÉå'ž¢¦\ìbÛ“§‘ ¦-,%5 ˆ÷†03‡ ói³ÇÜRñ–Ûø‰ÍC‰_Ø$éÀ"ùŠR'ïܲ϶.‚†ãÒöl P›¡ñ¼Ñåp`ÙÒ8û¾yŽaK˜² ÛL#mF˜ug#çÜÁ™™ÛØ1‡:|Ô1%¡´Gléç%™±*`ĨBòñú¶`s10­2õMØ>ÃÙb‡€sñ0o¶üðâõó_ß¼X¿ñöÊ¡Í ÀÅ\ó){‘šN#É0È–ßW@ë]úÔ…@ý@BG‘ÂOü7æ7áÊ80½ #zc˜ÐÆ7„9½†ƒIþ€¡áXp4Úð–‹»å +˜ä(2ùøA +é„•ˆœ°f¬¾Ãë’Ž¹V€‘i +[ÇyJeª°IFøo傎8Pr¿ÇœÆÕŒ-¬{OHÆÕZ:eï”ìK“3Zg<ëô#ܾºµF_RŽ(ÎÝp°ÑO~¨0óCS/õ$^MjÈZú¶dS”Œ£ „²w Xö¸oîXÓU–¾ë Ò‹ý¶ÂÆÜÄ3^´«‡‘Ú‹=íÃØz~´Ô³OðB$ø#÷ïbÏ>Á÷Ã]Íè½;úÄYáÛѺ:‡]ó†3?E[Ð%zê_3l¿õ<ýÃÜÏjD âtöí5\äP‰ú¿~qc~(”‰‘û;!*“™¹î€eµ¢ ¬¿è +¯ ì­¨=t½±W¸S¸#"þ†Ï"ù, +©…¡âÓ<:JÝx?:#ÚMè§úëýž\éá‚f´ô?Ì´“+endstream +endobj +776 0 obj << +/Type /Page +/Contents 777 0 R +/Resources 775 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 770 0 R +/Annots [ 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 786 0 R ] +>> endobj +779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.2378 575.7435 329.1674 586.6474] +/Subtype /Link +/A << /S /GoTo /D (a00147_gdd1ab3704ecd4900eec61a6897d32dc8) >> +>> endobj +780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [302.6467 563.7883 361.9339 574.6922] +/Subtype /Link +/A << /S /GoTo /D (a00147_g26a14b8dae3f861830af9e7cf1e03725) >> +>> endobj +781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [380.0705 563.7883 432.2742 574.6922] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga8933ad15a2e2947dae4a5cff50e6007) >> +>> endobj +782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [303.0487 515.9676 369.7779 526.8716] +/Subtype /Link +/A << /S /GoTo /D (a00147_gdb971fb1525d0c5002f52125b05f3218) >> +>> endobj +783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.0655 515.9676 442.8332 526.8716] +/Subtype /Link +/A << /S /GoTo /D (a00147_g7b2ac4b18bd2ac3912fe67b3b17158c3) >> +>> endobj +786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1141 445.5872 173.1874 456.4911] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +778 0 obj << +/D [776 0 R /XYZ 90 757.9346 null] +>> endobj +784 0 obj << +/D [776 0 R /XYZ 444.3276 519.1207 null] +>> endobj +785 0 obj << +/D [776 0 R /XYZ 90 502.5047 null] +>> endobj +775 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +789 0 obj << +/Length 1132 +/Filter /FlateDecode +>> +stream +xÚ­W{oÛ6ÿߟBë€B.fŽQ+à&^—,m=ÄC5E Ët,DW:YÑï¾£HÙ²­Äv2Žø¸;ÞýîEÃ1]F£“ÁÅE·gÑ­Ђr÷åx0†ð:ûg¨KAø¯Hg—æ*x´žAò8§[fCÂXNÝýëB'§ál&².qM‘!˜Ü(Dߊb)„|Ð¥Ü\Cœ?à? *¹­jÎÙ¬ÛcÄV’ƒüzk¬Ç󴌦jœ•‰ÄeT„`‹š5šC2FÍ4Ñ{…æIøµ¬§©úNÙTÌQ¦èíImˆVGëæ›Üe.Ö×U¦†PFäɰð,s‘f…q3)ã‰ÈÔj:Sk"~½¦¢™ˆÓBh‚dª96©¸¥©5Mĵ؆(ݱeY:S$O—pS…ƒZ˜ˆ(•€,•(½šå›Ö‘ʺùв™UŲK°™ªIC~®“n’ʵoò_®¾Ž˜É*ã „öTͤÐÒ*gne.z(s)T‡:îa™Û¤nÍÜAë-}uÔŒdÅøP5ݹœþ·Jvô­rÕôÖ—²HFõ¡½ou9&p;–LýýÐhŸßívnæ{§Ï=|_'Û~#D,§õ©†¡`›ÛÏz>Uï=X£ÍçTx‡¹õóH+!•|'í³Nº‹¾¯ç2K=!TqŸ²>ÅjMÌÖ½WŠºÿ–g#M4áä^}OÓ»û¨º[ðÈ·] >ÿ™?Çüendstream +endobj +788 0 obj << +/Type /Page +/Contents 789 0 R +/Resources 787 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 770 0 R +>> endobj +790 0 obj << +/D [788 0 R /XYZ 90 757.9346 null] +>> endobj +791 0 obj << +/D [788 0 R /XYZ 90 329.3658 null] +>> endobj +792 0 obj << +/D [788 0 R /XYZ 90 323.8457 null] +>> endobj +793 0 obj << +/D [788 0 R /XYZ 90 84.5604 null] +>> endobj +787 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +796 0 obj << +/Length 2120 +/Filter /FlateDecode +>> +stream +xÚ­Ù’·ñ_ÁøÁ&SäÀÜòSìØ²T•DÉÒåIµ5$Á%JC =‡¨MœO7˜‹³Ú];µU;@£Ñè» Ÿ3øãó”Íã0öR?ˆæ»ÓŒÍïüjÆíòÖ×}„ï6³?Štžzi$¢ùæ`(DÜ óÍþÝ‚³åÚç±-6G¹\‹-š×oi°ùþí 7®êl÷qùaóföæ=ϲúÇÓ~½ûÀæ{`ëÍŒy~š„ó L˜ÇÓTÌO³@øn’ÏnfÿléЂÙ0%UÈýi±8÷Ò0N.bÆV,/ö‚åš3Æ?×*WÿVú®•Š?æÅ’³Å…fߺ.—‘’¿*vaÀឯ^ý°!ü…qD:ؼ}Á=öžûA‰ÿô,?Éò%èÖãIäAÞëÖºÑW+sfà{ÌO¢Á™AÒÓäB)ë¦ÔÏTu§(-/û¬Îž£†½Äо•²K#!0Zu +Æi.uŸô”S/–¨!y{hòüÙ†©‹³Ûó¨6~‡¢ÎEÇñóõ׬xú¹ó¶/3õHÿé ^BŠÏÊúÿ!ûÃK…0ñDÀcƒòËQbñ6 ãÀ •6˜³Š[ép‘ïm®ª£Üc5ó*a‚¹£®„ÁDYƒb +cÿØ +âÍÔ’r†Í×Ðâ,n”ÞI‡èˆ¸o»µÐùý° +RvF7†"‘0[žqd +TBœ¬pÛò0,ìmUGÀGÝU±!•ƒýâÜ.*'„F Ýœ¶$ÿUŸTØZ&kYžÚÎôrTæ™ +VZA\‹ÕÚ7×FEŒð]×ZZè¹,βÌmùƒ.ù”a+½r›ÛW.²vÖ¼ªÃTBF™k&å¬ÙîÌ)9/Î%¶pèÞskµ³Í{v'«ö Î5 È× 2“ãÇH’Ûç¾êÁç2 /LÓèiÏe}ìÉç²åªê²ÙÕƒ—¢ð%‘]—wÇŒÿ5REîzðeŽ=il?üsñäÏ rÂèý&`šº¶p_ôßü#ð?A;° +p¬ ,¯¤–eÖVç¹sƒ7pa¿ì¥ð_ +F3Ýú;úzQŽ~ážEtýí_‹Ï÷wòªÅŸ-&´ô?¹¶‘£endstream +endobj +795 0 obj << +/Type /Page +/Contents 796 0 R +/Resources 794 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 770 0 R +/Annots [ 799 0 R 800 0 R 801 0 R ] +>> endobj +799 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 292.733 131.9523 303.6369] +/Subtype /Link +/A << /S /GoTo /D (a00147_g0a8bb9d6d0f1f56852ccfccbbad6c5d8) >> +>> endobj +800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [425.6978 292.733 476.9349 303.6369] +/Subtype /Link +/A << /S /GoTo /D (a00147_g81ac47cee1c18f6aa479044069db7ca3) >> +>> endobj +801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.1347 268.8226 206.3718 279.7266] +/Subtype /Link +/A << /S /GoTo /D (a00147_g81ac47cee1c18f6aa479044069db7ca3) >> +>> endobj +797 0 obj << +/D [795 0 R /XYZ 90 757.9346 null] +>> endobj +798 0 obj << +/D [795 0 R /XYZ 90 739.9346 null] +>> endobj +802 0 obj << +/D [795 0 R /XYZ 207.8662 271.9757 null] +>> endobj +803 0 obj << +/D [795 0 R /XYZ 90 254.2666 null] +>> endobj +794 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +808 0 obj << +/Length 1875 +/Filter /FlateDecode +>> +stream +xÚ¥ÙŽÛ6ðÝ_¡G¹]©$e]I³@Фi¤M» ô! ²DÛÂÊ’«#›m‘ï ‡”%Y{$Dçæ\&·ü¸3+ôC7öV•îÌÚøÕ‚ëcÎ!Â/—‹Ÿ~±»q ër£8ÜõÖeöÞæn¸t„Ïì—Ÿ“ý¡ÍòãåkÅ=—yá +¸*$ŽÐÅËË^’VÄ÷ŽrþY¼ÿȬ z³`®G¾uæò8Ö~±žÙ‹‹ÅŸ=:PsöøÜ›3(°2n `_Hö|QúƒxäÆ`9Â>Uy¶tÆlIFúWÉáðù OàËéô?EËW.àLw€Täдu—¶M›´’H˜ï +æû lY…Šæò¤F‚[xóT8œÖQhA>’ŒgôAïŠwùá*­ÊÒ9‹ôéŒò r2¸2m%ZÍÁýÖk¥nò6Ý Y8çÅ¡ªÛ)1‘¥I#éô·Ë?~¿@úHÉ|r·$çÒu-“ks#3ÍÁ¿×þíFðo1âË ^e#KGÏHæ@´uNf-Û®.#t6“ôúë‚HOœô3}å¾i¾†¡Šå¢j¤!ú>+ï €Ÿ•ÔÙ#ËG…€óXʯ¿Í{¬¹ûj¯7h& ƒÜгB¹ÜIì%܆ZTäiÒæUI*•j f4yÓ6´«6Ô}Úª¼leM›¶Ò_Ã0 ¤ÕœwUWd´^kMÊlÄ|‘ÿ+‡¢`Ÿk=Õ•˜xænìûÔnŒŽè{wéx\Ø虜Zs«å¾2Ö益%Et%nî°u೉ E•&…ñW­-»ýÚ8Ž”†¨id6fŸIðî>/µ›]žîæÌúÀ˜(R¤iÃÞDoe.:Tx5YÙé®+¯iI¾ {—FZ§¨¿›´ËËít®4L:»CKõ l¨±ê­Æùk0 ôøÎ€¦„a¤žòf*m<º^0Ñe2¢hœäO9¡tåLÏî^¿#×ì“ë%‡&o<ÕÕÚË&#»¬4j58+ ööâ‚ëÛVqŽðH9º[®Äš”3wÃúxIÒ¶KŠâVg +ÜÔ-åRøö§%÷m +mb«n»Óˆ•Îs_¸žCMç3Õ#tÃUj„cÝC–ûD+±61ŸÔKÙ[ +q֛͎iö»º|Ìe‘Ã*t±T'Oãê„´¿Y EØú¿¡—iµÇ€%é5\àÞ2ÛîÁS ܦïE:û7å_\í-`-é0œ08Ú[ùv©<}3`0“œ©1Ý8oJf¿Þô^©åøv)vX;Ãh«žSv6ñ«.Tº–ù©Þ™™J3“Ë^ÌàF[žï¹A‰r¹Çw†3¹tÂw¶OÕYy¾ëáб:“tî±P┥4…ylõ¶±ðf Ï•Ëà£ÿy¹Áþ@‡¾PC~§bÜøô9†Â¸‘2ûB©¶u²'À ÙäÛòŽÞŒm<¦¬×])ì›:oU ãf”W°?ÔŠwC;ºVXúºJ,oõ·Ç‘›® µ +£8 À„o².äø¤kó‚:0—ÐõºçÿüÝk-@ë›Ð§Ñ.RîA3°VB™|òú4K¨Gű½©Š‚RMC=ƒ §ÿR³ô)ÏTõ¦.ŽN#©14PånµÖeV*ÁqÓˆ’dÐó¶‘ÅF£Wô]k™Æq(fSÕ\N<¼œAç¶J+äàAÏGc°©`iHU’VXü<TTÌóªÓHghÈÐ +Üc-ÁòæëÎ0(Z¸&̨~‚5%LsÉ5Šà=Œ¡ðvtªðÀ©eV¨¸„ͦ+M Âxà0  -›I—Ðx½‹g3e +¶¥²Ñlû’Œ¬˜XE„Í’`†÷ ¤;s÷¥êßne9uN}3þùè&òendstream +endobj +807 0 obj << +/Type /Page +/Contents 808 0 R +/Resources 806 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 770 0 R +/Annots [ 810 0 R 811 0 R ] +>> endobj +810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [283.7538 392.0799 328.3562 402.9838] +/Subtype /Link +/A << /S /GoTo /D (a00147_g04b053a623aac7cd4195157d470661b3) >> +>> endobj +811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.5337 350.5452 436.3476 361.4491] +/Subtype /Link +/A << /S /GoTo /D (a00147_g61db1dcb7c760e4dd5d60bf4e5576dca) >> +>> endobj +809 0 obj << +/D [807 0 R /XYZ 90 757.9346 null] +>> endobj +812 0 obj << +/D [807 0 R /XYZ 437.842 353.6982 null] +>> endobj +813 0 obj << +/D [807 0 R /XYZ 90 337.096 null] +>> endobj +806 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F23 482 0 R /F11 705 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +816 0 obj << +/Length 1829 +/Filter /FlateDecode +>> +stream +xÚÅ]sÔ6ðý~…K_|lôaùƒ ÌЖB +n†`ç¬Ä.Ž}µ}$iéïJ+ßÉ>_. Ì¥ÕîjµßR¨Cà: q"ù Bgy>#΀ŸÍ¨Yö`ݳ~^ÌüÆ'ñ“…ÎâTs©/eÎ"ûàR6÷8xè.r9÷˜ îúø ¿¼yÐÛ.]~™Z¼˜=]lö3âRµÛ_³Ÿˆ“X/fÄçI,œ ˜Ÿ& sÎgãý¤œ½›ý±áƒ š`êT‚ò©c…@"Bõ±_„u"GðhÅéG"ȺX}^ÖU%—Ì~Týæ^Hˆû:“£©èÏÂ@hêš#éM þ«WȶÝôv«øwÝ´’YÚ¥·ØvDq×yy^t=ÜóÛ7MBì7d6!뀆ì`ÔswdžðWuYîS™øQ<¾•UvyÆIwVÀ™¹£  +…j Ì8tO×Õ²+êJÍ„ŠÈ¦kqå¢èr„f2-‹êlÝ´šSá^!ŽlšºA8h(+Ï—º<ípå¼8ËÍ0O猸_‰hyºZÉJf¸~re˜årùÅl.À'Æé"H(œ1q„à>‰DŒÁ®Vš3ƒòÖ +ûݳñ1ômmípí­é»ÆÂWÌ éIÝØ~1’”²Ð”EލO™Î¶,ÏFÛ•BR¢H¶AS"€ Æ»NwÝ«  þ¡ýwøö*êŠs™Õën¯ ¯Æ +Èõzè±ÈÁóƒ8Š‘6ʧÂÀíšµô¡ îŸ"¨­ï«A n©‘„ ~×Ô«¦H;CÕû2 ­ð€YÑ"Å2-K™ÆOJÃ2Rî©× ë OøŠöJQÚßäi‹õðDÊ +G˲nev']_DºÍ; +f ³ÂpB y=bStøUa#Ó6’œ3a³êü>·ÑÈYÀµØ¯¤Z½ì””,0”4²%‚™ŽßÇZ=4Þ¢ZêÑsÔ þ\·ŽŒN€JBr:)‹6×SKWÖ˜"p“qŠ ‰ÏIZ?¡‡rDïÙIb‡ïþ1)|@ã1i¬C‚Ä¡ÏH )Œ.1´ûñÄ üÏÔáN”6ÖSwS% +“Ø7^ã´Òƒ`³Ø®W+宦Ô¦”˜ïE®¢…ÊÅTÀ!m%eÖ NdOXIDºÈeÕ–¡à}˜‘áù´D\ؤ|–G ã2ǵÔàUW@±ûÝ êàz®EY,Sã¯\—ËάêŒÁû8à¶P*Qá¾+ª¥YÓ!ÈçéNÌ‚¡†Ì‘¶.Ÿ0R}Áð€hé6¯×eÖçÓ[CØâRñ8‘Œ›ŒÛ¦’k3ìwV£þ*l3Jåu4Í•e­²Í…‰áÄäæ +¿-ÎW¥Aš­l»5ý·Ï:I¥[õ)~sÜ'&#Å»üspìRû§ÕhÈìí̄ǕuýŒˆŽ©™D#Ö‰9׎/攸i¡{/˜¢7Á`ÛcÁDÛ_óÒ†PËMSl5Âzöx&lñ¾º—«À¦‘í +š5³iÏtCØï«T;åwàFÚfò?˜] 8’+ȹlÛôL"ôÞs©Ì¬ôaë¦Ì~¸Zœº‹y \-ʲ£#KQn ¥»™UŸÊz…‹ÊæúkkZa›8ÕB¥Ë¼¨¤ÒDÀ@V°Î„7¢Û‘° ©ÂÄH‡'ÁÉJµÎ&Ò>š¶EêàÞGhD¬Æ$–®¶tþ¸žÄÂ'ò:‡® náÜ.';e¥Gölì‰ë/Ù²S:ù1“§…JÂêþònñdñôóû'Ç‹ãWÏD&.@4ÏŸ¾|ùzîÑ ôf$ï_¿}ù«!asÅ~í¡öC(qP¡4…ÄX?›î§Ã‹Ò:þlÈ4öÑ„8Ë<Õ=µÃ¸ŸPÀÆ>O¼ü¤Wô%úÚ-¼“—ݪkÌÝÅ~˜01¼Ü*W‚~•hÜRVGûosG“G÷^¢ì_ë"ÑuQ@ëº9uÁžæa·ïwf²íT÷±8x–A32â²kÏð#èÇ" ý¡±a´Ç†o‘Í#ü(!qW72*’}Ümæê,}£è=†|eùŸ ¶ÇZLKIÞcãÑ: M„á”û™q°ÁqÈÑõ7²õÆrÐ>âö¹>ƾ×>ñ´}â;Ú_«¶VÒ²MYéÏf×ÙZ§Ïk, ig ˜¾îêñ-<$<ä!×>ãÎTý‹Û^ÏawˆlñÿD6½ahŸ¹©Oƒhòùƒ€h(Âïz×/÷1PÎì‡ûJ> endobj +818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.9727 549.9227 513.9963 560.8266] +/Subtype /Link +/A << /S /GoTo /D (a00147_gfbd5fc486dfdf6bf6fc9db52b1f418c4) >> +>> endobj +819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 537.9675 127.509 548.8715] +/Subtype /Link +/A << /S /GoTo /D (a00147_gfbd5fc486dfdf6bf6fc9db52b1f418c4) >> +>> endobj +820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0815 537.9675 200.8491 548.8715] +/Subtype /Link +/A << /S /GoTo /D (a00147_g7b2ac4b18bd2ac3912fe67b3b17158c3) >> +>> endobj +821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [418.3117 508.388 485.0409 519.2919] +/Subtype /Link +/A << /S /GoTo /D (a00147_gdb971fb1525d0c5002f52125b05f3218) >> +>> endobj +817 0 obj << +/D [815 0 R /XYZ 90 757.9346 null] +>> endobj +814 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +824 0 obj << +/Length 2698 +/Filter /FlateDecode +>> +stream +xÚ¥k“Û¶ñûý +EŸ¨Öb €Owâwâ8çq›6ÖL>ÄÂXS¤JP>_3ùïÝÅ.øïìIG,ö…ž‰U?±Ê‚U%~¦ÂxU¯‚Õ€__ ^ÞÂúvŒð·ÝÕ_¾—Ù*ó³Xƫݭå ?’B®vû_<á'›­ŒïÕçüxª´Ùüº{³ +…ò•„ÀÕ")„^½Úõ’X‘HÅåüçê—_ƒÕzsø*K£Õ=L_d™\¯B©Ü¤ºzwõ¯ž-X‚¥ýDB-m(^$ „ÝPæGq(V‰ ü(•Qa³}ÑéÏ]¥ëÍ6oû-}ÏåéCÑÔõö,ýÕn,–ùaFcÂS×ÁŸ¿–°¼}DÁ\î·LÀ¢ áo–Ø*-§¢ïË®80ÓåžM%¹Ñ´ún÷r÷êï޾ýñùÀ]Ì7fyn¶"EÅÆ”?ÿøÓÛï¾ÆLµ¾oÚjÿÍ{¡ÂzýÝ`ú$K¸7­Î?ÒÂvAïù.­®îÒSÕ4µùøûhE>º²DbDêgoÖ`î² Ý?5åžFF×û}Þå¨ Bcvt]{.:BÒ¥ñ:L¤AäË ŠA8R˜Zš?QûI*Åj7“±Îöî2󅈲Ǹ™ã^†@ÉO'ˆ--Cå§©Us°ÑrÔ¼øú AqhÒðÖglëžïà +àÄ!á¨Q…SV`qQÝÀ?HƒýVegÞÔàxÃ!XÄ”¦34knñ+¼œ¦k‹¸¦É§Œ¼¼-ó›JÃ6”P=0‘g7Èȧ¦¬;ÝÒ¤kXž26ÍŽÚ˜üN³ÜzÏ8N÷ž7ØjÝû²ð³ˆw ð»îÈ™$õáKÔ8DÁŒEù›m¢"6€‡]Âd¼K‚yMƒèø·Lûn·É”÷r#„ð0 l„ ¼—×»ë¼^ƒ•B™€Ø¼.ë;§ZÞ JNö#ì~&‡%³Ø+ ~ï~#À„egYáÂmÓÒ£–pÐÒÉÛ¶Ä|ÂíkFo›#¬y½ÖåÚ´ñDƒôb?6u¯y±dîeq˜±êÕÞ”Þ ý¡a`I”;k¬ÐUÕ¬irÊÛŽFöTÇx|ލU„Ê3õåQæä5#¢úˆÈêOXNChuü^hº°›5*ÏšZ–ÞÓvâÇf†°”"4ö64ª›ŽˆˆŠñuÛ6-#Ø£‡/&4]8‰‡%† ¨;VèÛb¸ŠN¬Á‡t?eµn°¼ðôÞ•*¦ìÊ£Þ7çΗLAÜÁ¶Öõv{®­ª†¦¹ƒ©ý:j&ÎCOÝÃŒvfÓpdÓ,pö˜HÎjšÝ—UE£G–W•Ž«Íxù„gO~°êYj‡©!…ÜT¥9èý3Îu5³+¥;”Æ 3,ÖèθÕÅdЧ&³Ô$£ŒÂ=æmÄÁÓÙˆPø€2>ïxža¿RÒuÛ [Ä6¸·^l½.8ñˆ–ñíÞá[7K^Ó×\`Ò`|[Xˆ •H?T©äø¨"(ô³T¸Кwç +Šuw•$~(.Ü}¡±ÂSmì)Œ+Êô°Fõ§À7© ú“fŠ‚ÁöHÜnfÆh©€Ž:½ïË:¯(í¥.r7¸p¡"tÔú`¥È)Çšö‚#ºb†èÝÙ +èYòÝ/Q©¾Â)®‚/*¢§â€&Ž E]ÏP])Å1äøg&‰a:ïÔw‰8mftÁQß ã„Õ††ÑF<‚(âq´ß*Q#VŽ:uÔɈz\¡÷wSê¥<¹Q¯Ž“I»qVÂKÑ쎕J§^Ä õŸ’Ùœ¶¶eYägÃö䱯ÚJűë rœ}^ˆâ‘°|é°Z Õ¹6ÇÒîš„g͹ÚÓØ|ùÞ¦¾ t-˜ðNçöԞؚ ßέ.4w÷g‚û3A!®¤×œp ð7ý#5d#Þ®[äËKM“á‡~Yºá×$ôl{ÕMÜUwÀAמ‡fÿÏÈ ô®D˜ù©J2úwWÚ;Fùiô?‹Cߎñé¿–qN¼à:‚uUÂÄW¡ÊfºÌþéé±¾¤Bø2ÉT‡ñËÃ`¡!ϰ-­#nñ‡w5ºÄ‚¿„f׎ÉÁ +¾‘•ŹÊ["§þ”?£J bVê2³ÈtâE03øƒ:¥Òž¡™LdÀ$‰ÕJ¨ÄOS™~áðzüí˜àÒt—|¿êøTèGi,gÚÌÏa}A «*MåT¾ã¥b°”ƶ9AÓFšÏv#RïîŒ/X†pl?”öñ•r„¦Üá§œRáâHB+”ßRà PÛHR§4À3d—ú:¬².ß<}}lø†IŒÑ¸¬SG¹äšyÑ‹O_Š+öõä®â[_Óv¹»Ñ…G¡.š†ë_pÔR”ãÒnÌ®¢€Ð›–ó[\¾ÕÅ”w8ktPý3ds&GB{^Ð,ÔÕÃR]s&ß7µ~¤OZºdFÁðjºüÊtñü9ÿ¿[øà‹ÿ»àá"Žâÿë¯pûç} +$BÉñ÷1­JÝ÷¬Zâµ®u;8’ë!ÿîoð˜Î<’¿Ás©žË€f2bÞ:šÄùìùúŸŒíS/ý®ùüpG ÇØ<ø?ý‚}þjendstream +endobj +823 0 obj << +/Type /Page +/Contents 824 0 R +/Resources 822 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 829 0 R +/Annots [ 826 0 R 827 0 R ] +>> endobj +826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.7378 146.6848 248.3401 157.5888] +/Subtype /Link +/A << /S /GoTo /D (a00147_g04b053a623aac7cd4195157d470661b3) >> +>> endobj +827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.9801 134.7297 235.5824 145.6336] +/Subtype /Link +/A << /S /GoTo /D (a00147_g04b053a623aac7cd4195157d470661b3) >> +>> endobj +825 0 obj << +/D [823 0 R /XYZ 90 757.9346 null] +>> endobj +828 0 obj << +/D [823 0 R /XYZ 279.4381 96.348 null] +>> endobj +822 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +832 0 obj << +/Length 2726 +/Filter /FlateDecode +>> +stream +xڥ˒Ü6î>_Ñ•“ºÊÝÑû‘œÖŽíWÍÖ¬=)âØgšë–(‹RÆó÷  ^#;®MõA‚ˆÙÁ·_°+ü]–dÇ"ŠÓ]Y_ù»@¿½ +xúó‡9ÁË»«Ÿß„Å®8i˜îîî-‡48&aîîª?¼ Þ¢ ‹Rïî,÷‡0ñ½áú–w¯nvcÓ‹òóþÏ»wW¯ïÆýXœ$JÜíËÕú» +Äzwå£"OvøÇ (Â]}‡‘.W®þ3ò¡ »`K«$ˆ¶Õ +â#`B§Wjf¬Ö1ßß÷½Ûnäžîu©/¤ÊuÝ^d-›^ôJ7•nÑÌH`Å0?y[fd™8ôÚŽøO5„îi>˜ 6£%È ªg"Ñ1·JõÐÈŠ µ<æ'èsO²£éÀ»ß¾'Ì$¦ÙdztŒ¤(ÏDµÜ´•ݽîj«!êÇ"I«î‘Åžie©>ù~X|?4eO{$šŠ¤! TÓËN”d8‹9ÉþQÊfE7 « Ó“ú¸uß©²¿<TI”¬qÌCïãY]䊩3ÈB:oÑÂŽd†¤Ä½ŠÈ* àƒÖ!­ŸÝkúÒ9ÁxÂ/@ ?ñTOxâ{f„¸ +æÇ“$h61ý77fÎÇe5hÃù]³‚Ax/&ÆJÏŒ n­Vnm‘dmôêáLÆ ÔÐV¼®¡¯î*Ù1±æ ûÐ÷þÚ‰'ÝÊŠG¦¥<ŽbeÇ4Œ#Å»éœ €µfÆó•ì…š ‚Þ*¦îÛŸÇ=gÞ +ðÀiç,zäp‡äá,iã=JŽq%.yN.ÿ} +ÌӆjÑÈž0‹³MâcRð©}®ôݸÌb0ÚHm€}TýY1… µc4Š«jù —­å‹UµÐ?áXYeÊ©£‹gåü¨ºŽ=/Yõ[ì³Íl0:Û:SújÌg*ë¨ô~Dˆ¹‹rK¯2{ÎY+ç¬Ô+w(¸°ZR¬†Àv³°q’¸–fhùˆP5ø’h¤˜n‘ºáЭ¾ÖTllþmh¤FÍû¤C†®ZãœsªbÉºŠ¹« l¹ä:ÿ’ZwQ•Œ̓ëknP šø¡r%¹=Èj0'uQýc5}OïÉ4¶LB²Ü„_Þ Jì î®Í„!ÜGÈŽÝg<È ð>ئy“õ‡8 ¦tûZmÅÍà  ²aÖ±[<?-XüÌ_ˆxæmP€_.—Y‡…UT¦m®Í” +ƒ §0õáD=5Û€ýý·[BŸ-ÍüÙÛÌF˜ðí¡Hèöß4¢ìžx7ªì´Ñ÷=÷1n\‘‹1=æÛ‹<˜³è(9ÁµüÃÍKšt{Û[|<ù Í*ã¨T «mþ›|®h–lÌŒ`ãPl¦Œ c³Ö®e¥0¬ÃÈ«¶ën¡Ø7’`#iˆîýŠå»Û©»W·4PL#l5ôn‡^ì€qÓu1t® hʨ8²çl«ƒ˜¹¿ +lè5w¸ Í\o:IN“85–¡(Š\æ145ß)Zû=Ì[ÀÄ£ÄZ=Ç ià¿ç˜äY³¬U±OZÎ.ŸüÄ¿~{s ß`•o¦€\ Pnâaâ¯ù>»÷¸bÎ5Íw–r8¶ÕüBôýg—'¯_ÝüÀCÈ+Ýô”PYÞˆ~ñ ÿŸgî9R·u>§@<5¾©‹#˜ç"C¢–ÜDd‡6LÈ®s4¥†³v7L â¶!u\2ïË÷Uf’BÅ1̯aµÝíê ïºgµP›÷¥ñr¬Ìwêdu³&Ë3?ÅÕ025tMYœ9ÛËçÓŠÍO-¨ñÓøföòãåξ(gÎæqú¼É‹3~÷Îø‚˜³K>@ãSP¦‹ó +ƒ}[ î”;Às‰´³gÒxô˜`«À¨&ÿ2›Pïe{QÒå{~ìåµ€qk¹.tüv ~‚ ,Ìœ8_[uø%×P;Ò¶\ wU2=t%ó"Ÿäòi +t‰§ +Ihè)¿{ÝÆëiE™½IC™-çDlÑÖ·:Õk¨]€©Æ¥ˆ.„ _Ã.´àÁµ‹dKõÔJL‚YD.3rÞH…îµj鬢úï`zç°î±ƒþgÂÛ)Oô l£PË)yÉ^ýþÍ«\éæ­ÅµÚ©ïœjþ²ÀAf¯ª.]Íð™éuÆÞ9#÷Ò6Ñùö¡ ¿Ó5ßF4?ZÜbh43ò¼¹ûÐP²KS³ÐAy»™ÑAчjÑ“0SØîûßR¡x4G·p+°MB)ÿ—ßÙÛ@³·=€XnþÃG·²ã6öWDóW¾Ô]T`ÿã$ØðÔ3Ûw—ñ]mLnÈ뿃cg›xúP?‚4IÿÑ¿ö_Ó–Q8ÿw1=Y”ciŠBXˆ4:QPü·²‘øW-ÿ¬¸qƒwh  ä¯ÿKýú…¾ŸÒÈÞŽt·ú68úËŒþ›þúô ›µ‘ðÒ +ýf1endstream +endobj +831 0 obj << +/Type /Page +/Contents 832 0 R +/Resources 830 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 829 0 R +>> endobj +833 0 obj << +/D [831 0 R /XYZ 90 757.9346 null] +>> endobj +38 0 obj << +/D [831 0 R /XYZ 90 739.9346 null] +>> endobj +834 0 obj << +/D [831 0 R /XYZ 437.7219 648.3003 null] +>> endobj +835 0 obj << +/D [831 0 R /XYZ 90 630.343 null] +>> endobj +836 0 obj << +/D [831 0 R /XYZ 498.8037 552.4222 null] +>> endobj +837 0 obj << +/D [831 0 R /XYZ 90 534.4648 null] +>> endobj +838 0 obj << +/D [831 0 R /XYZ 231.09 381.1364 null] +>> endobj +839 0 obj << +/D [831 0 R /XYZ 90 363.179 null] +>> endobj +840 0 obj << +/D [831 0 R /XYZ 464.8599 263.3404 null] +>> endobj +841 0 obj << +/D [831 0 R /XYZ 90 245.383 null] +>> endobj +842 0 obj << +/D [831 0 R /XYZ 164.1609 96.348 null] +>> endobj +830 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +845 0 obj << +/Length 2718 +/Filter /FlateDecode +>> +stream +xÚ¥YK“㶾ϯ˜[¨ª‘B‚oßœÍÚ5›lÕf­Ä¯ I¬¥H™+¿>ý jèõV¥¦jtF£ûë<úð<æþc§»<Œ’Çâòà?ž€üãC ì-ð·î€¿íþúƒÊó]ž¨äq$ I°‹U ÷å/^°Ë6[ûÞ‡nd^;´E[3åùr­ÍÅ4ƒª¶é˜eyìñæ×ý»‡·ûiYÑ*“ýíá—_ýÇ´{÷àïÂ<‹_ ãï‚ìªûú¶¶­|¶ådö'ön¶ Ðà`#úa¿|Ç+L$»ÃD>r N–ÖuæUͱí.¦”%aã¬>íˆ^t–¸¶±ÂÛqàI íîeÖ'±˜/c1T»8Êœøß‚ÿ¬úÁ4¼&ǹì·ÿZTgÕÌY4ëŽVÏbOóÇ5à ½¦5™6`¢sº+S;óÛhz +Ö4ˆ X™ŒH÷´X·ž÷„ƒ–²â?rï¡úäûŠü@ü¾ì€ˆòÉö€‡‚íkÛI«/Bh3Úä‘»›ün7з»‘IÈ/Φ˜# 9§ ü\î4Ár le3ŽTš:ë£CĨ3¹!ðX¶0V™² ¼?šÏ;¹¼5úRÜaßÇáºárêA  ‰7þr„ wŽ~ c«Æ Jhô7ÐîòÍ®®ÄÕª«rrôŸ1}UMÙ¢½_þ<ƒ½oÉL Þ +«Wµæ®ÞpCó ~Zh/´ D,ô/¦8ë¦ê/<–bééÓ$k€ìÔ{?ÖC‹Î ;Ñÿ„ºô,êUºZ€ìßµ‹Â8‰þ¥Î¼¼ qt5LVc çä»@ÝË$~htq–•f%w“né.QQ8×*Š“Aga²¡æÔv ã…»`î^ü©[Bͽ¡â Åv{5ÝtX8‡R˜)4ŸÜÝ Mk™|ú•Ì<²eºúÆ}ÚÛïWÓlWÍî¤h,Á*½ »P2Yˆo>ü»Ç¬g\ +!»l W›^ÓÊŒÉÿ˜^Y·‘J¼ïë¾]NϦ鹞yÌäã5;"~!³Ÿ¤- + d±­€£e¨œÒÊvÝ3 1Ìîk½ —ʹ¬¶H5dÞ«†LV ¹NæœbÚKU×<î¬q²µ5-Õ2ç`DÒxEô& ¤ h_øÜÆÃãd>ÁÓv ˜¦¬ž…^­o i{x~ +0JSrÏ}{á"Sb¿mȃ2Åf ÁUš8´i€ç„s®|`á²>‘T+úcsW•¢‡‚8É«…ÑiYsC }»}Æ£I9<Â4Ä ëFÈtð…6Bá㇡fYÙ¯Ogns|`‹‹ –½„]äRðòdÃÃ&AêÂ#SEžV.s¥†_öKh`Þ®(‘a'‘¼„VýÕTJHVŸHÂÔûh.-nô ëçóÔYÛx™&°ï¤ \OÆULK¬Ãzåé—°ïPÕÕp[fëâß6 :ò7æW{™üØŽM¹åûcuµ·IŠIÜo{ð šo+.UèÓݨjF.à‰bX !Zhë9v‡HLÚ„±h¢6Ðcm ÷Éý0è~Í€‰”6p çR%Ëjˆ³޳rsü…bTX½íJ +QT¯µËù +0tå|´MÅÕ µØê .¥ëÑÜ%Ô© +êÌðꚎº…ô½¤| ‡âO6e)µiÀ—p ó%\nžôµqÇÕ)Œè¥À¥+ï_üd(¸ZÕ–˜3qß¼S¸“½¥’ÀrxÆ`u[›º¢hÌÎP–¤Ô‡_´~Ñ[ec*ÒˆÀ46d6U&ÙÝ!fÓ­8g-’ÖqÔ·5X&'ŸÙw†w³¢©í>SN¼ŸÏFéfÕÖŠ)q*:àÛ™Â8HÉ%³WMàÏþ× K~)g°k»ÂȘŽz'-AÒ®;'QÁ,ÊúþŽ){Ë’yk DÑ›Ù%‡öd@fÇt,D™þºâQÅ ôwºh}ÛXÃp+oJÝ•AcÍ×ü0Öµ ÃT†‰Œl°âžwÈü‡îf•éº?×±ÆBkÄX@7ýØûzX ~™\Ê.ñQ¸N²å³‹†~æCæ# ówKÿ)’ßOÙ\z•zý¶4ʬʢTPòÀ†dYbÈ2¶eK‹-àešO B9 ­¼r=ñ à¤LgV‹ü;4Nc+›Œ:ÐÔI—Øç;uâ•F@Ì”;~°x>Š<¾1/w(2!tþ iþiŽ[b¿V«‡úª.×Üö ÎqÑåz÷½…C®gýé^Ø{…ï±ÕÌU@¢ÃjšŒþòñ3ãÇO‹ÙÇ •p¿Rš»…=òÆâ©½·øüºàÂp)€…LZø[‡‡-IDöØ*oõ•H"0´@ +åäþAóözá7ò}U>(|>q¶pÅgA¹ý;Ë,O’"›QBI×(ܧ*íÚ³ºš?îMbÅÄ5ÈMæÎ…†ARNÀ }î3ýs.í‘ÆÉÁµÅ)!y‡ú$ÎhDÔ¼4«9YyZ8_q媷<.ÌwkgÆÉ(Nî4‹S~pë™9ØQ¯ëªdÖ8¶Ï\@¼vm9f9?Å”'’¤8 &w"vÏCï^§i@Oï#4¹÷C×^ÖÈhC˜ÂxOszÉ8#^[¨üéy9_úUÌ·xÐàõf3ÉE©M#pC¯ìU\ÞwRó<½ÎÄ鬙Ý:dÊ®:U øÉ9ÖkÞÇ[Wy‚gÖPÅùV®ŸÞ¡ŸÈ[£/oð}éÐQ…XÉ· uQ€Œ’{ŽH§ÓqבCôñí³”Ù¾’£qÍv±Œï8qzºƒYa­Ð#R™[ºæÉ¯ÜøÓãÙ¤ÈÊOžÁ.ˆÒÕßa}(‚$Nþ¯_CéÇÜ ¦¡ríLvyföÇNQ-ý£iPk[TÙ{Ò{Ûx‡f¥(ùúß©ð;åsOù~"w04¤½‡1àâè <Èúïíï·“iî̓?Õ®ØçùVüendstream +endobj +844 0 obj << +/Type /Page +/Contents 845 0 R +/Resources 843 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 829 0 R +>> endobj +846 0 obj << +/D [844 0 R /XYZ 90 757.9346 null] +>> endobj +847 0 obj << +/D [844 0 R /XYZ 90 739.9346 null] +>> endobj +848 0 obj << +/D [844 0 R /XYZ 513 669.6866 null] +>> endobj +849 0 obj << +/D [844 0 R /XYZ 90 652.6059 null] +>> endobj +850 0 obj << +/D [844 0 R /XYZ 145.0727 576.8531 null] +>> endobj +851 0 obj << +/D [844 0 R /XYZ 90 559.7724 null] +>> endobj +852 0 obj << +/D [844 0 R /XYZ 199.2294 400.9501 null] +>> endobj +853 0 obj << +/D [844 0 R /XYZ 90 383.8694 null] +>> endobj +854 0 obj << +/D [844 0 R /XYZ 437.8115 266.5818 null] +>> endobj +855 0 obj << +/D [844 0 R /XYZ 90 249.5011 null] +>> endobj +843 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +858 0 obj << +/Length 2680 +/Filter /FlateDecode +>> +stream +xÚ¥YK“㶾ϯÐ-TÕH&>Dßf½±k¶*•Mí¤rp| Ḧ5$!ó±cù×§_àk¸±+)4  Ñýu7ì|ø»Ôß%QrLuïòúÎß½ù§»@†0~˜3|xºûîG•îÒc«x÷ôLâà©@힊Ÿ½ ÞtèØ{º˜ýAE¾7<~æÆÓŸ¿sí®Ïò×ý/OŸîþú4®'Û‰tàj¿Þýü‹¿+`[Ÿîü£NOÑî :þ1HSµ«ïB¥]§ºûr÷QЄ­SEÞ:–^KA7áSåYÛ–¦€­'ʳCÏó ¿×ÓI]¯U™g}i›{¤$^)¬eÇß‘µ5ÝÕ6]y.«²9öyÅÄJbšåïkc÷*òÞxÆÛÅ4ï÷mÖtuÙu° ‘s±CU ¶A‡ 8¦QÄ;Ã,ík¯Þ^V˜ãþÆ'¸º¡czô‹ðä¶¾VfDÞo´eí+Ú2ñ1ÓB¾â¶ÌÖ ¯Y۳ɕ  [6/Ü\*«;¢€•ƒ8•:ÅlßÇÓQ£ý!ð}ßû±²¸«7–öƒmúvœ<[‰ ½¤ÂcE) "÷ÐÉÉ»íÕÒqÁ^HŸ@WùË>м޻ÿö}íîû9®«ÐœÚä—¬)»Z˜Kù¢ÉàxVU˹u=4Óélú7cf¿Ø® oeq­ª€ÛZè7 s|EÑY{cjÛ©m{ãvQÖ¦ÕÂ}…ÞcÃ&Ë/Ü‚“r£#Óz =:ŽÄ¦i¨)LËmr­æƒã<&”M§CS¡n/l¯|ÙnYeçJ柑<<#ýÙ0¡îšåè®úa„2Á1·5h×C'¦F¦î†e悇EÖgÜê/YãZ2¸Ú Áõ óÙD(!Ð|z ®5sˆmè8ž)9Æ* éLä@ sÞ=vOΓµ'8ðIN…T>¶øT,#“9£´i[d&È…f6JæÆêì´õCxRÞ/w’]!V¹ÜÆ6LS¶‰6ÉÛÔÚm“ ˆÖÕ¼ÐBj; !‘<ÍãF–„$Â"Í`ŽýѱŒ,CÓÂxA‹%Öš€1Ô4Šïñù{m{3ñm™§»¼ÿ,ÏÍÕµ´ÛÚè27\U÷+ëqñ† ­ìKq¢9Ë例Üz[cô¯­=À:bÒŸ†ÔX @ôÅt|½ÿ¨b`ÌçR Ž€‰ƒsÀÄÁª¬9NÏBy3Ôgò¿1.^WÖCÕg±ƒÌdÀ¡ „dˆ¢Í$1€¨×¿a°°í+bIÑn7î3«^l ÈKÛÓ±°`¨z¶-“ÇÓóãÁ`F@ÂtåKã&SÔ³ÃÍ’Â9ÑÜ‘&$ͼ€Þš_‡²•‰¶©n²ž3ÊlÀh6¼‘´š[Ì36 é ¤õ)e¤ü¢q9ÜXQ¹ðo—4ŒåË¥gÝ6a W¼Nl€² ‘$MÑ,yqþ?f6jué+ÉÝùãYÜæyhaÁs²7SŒÞ7¬,_ùÀt½s×’Y™‹+ã¢1…)þ´ç%âyÿlÑ<_øöAÌG„Œ?v¹Y¦¢NÞ@¾ÊB°/x«Òiß<pjüZF¦«Ó<ôz{XF"ç,áÒÕD;MÂñJCÈW.%&8„áeÃùf"ç]Q,Á4ò8&Çˈä%ð­³ö•Y0¹ì˜Èæ»KŒFÄÕôÝÖ"TØÏF°23ƒh¡|ù¸5ížMhd[˜k0¦0òl²~ ¬…HÒñX¿n6©u¤RN#ðËêHÃÕ~xp¬x°C¡¾‚¹OË éi¤ÙÝšüÒچð®=i3w#©n² ÛþrØ2Ó¾•´“ÒÅ:Qê=|~<òÐCÇ_©íSZ  â&T'Í7]oFÌ”¤’a霉+ÒB÷Ld½ACôÆj¨0u§Åê„}ãT[6(Àì®™+C—ïŒXZÁ©Ö^À¶P8l^\z,ù6ou+AÍ08‚£¦‚¼© îgLzMKY/ú6ÆÀmЬU4¹ŠÒ㋊VjíÌ@Ž^ D8-rwëzS“…B1äìDÀÛCÕÆ|”饰uÙpÙdÊj•ó6Ï/&톚ÉyVåæuUcÞz•µW +ÀcÕ +€ =cáޝšnR<„€»9?ôÜwÅGÄ) ’0fòµô<Ò½•`3}~)XW$¡÷w^ÎI­p‡5óFÍmUã »í©††æEjMz” +&%å[*[Ð80g!Lge#¢xqh #rq­z|ê¶1÷]9SZ[s ¼¯—Á‹5"•uã8¶ÞJ&~·Ê"ܨ”ë@³”Æpi¦ýÀû0B—³ä_úÐÖ¤¨Pò +¤vh„ÐÈDyfÂötD„€1…@öK&Èp–9` ü¦‰>a¦¬LĤÛmÕú“iÐé]Îî +Û¿¹Æ'¼úA:’¯ÿ½Òß+Ÿ{Ê÷c)8U_ý¹ýå›üGûÛ *޵’ðÏÇ -ý¸¯ äendstream +endobj +857 0 obj << +/Type /Page +/Contents 858 0 R +/Resources 856 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 829 0 R +>> endobj +859 0 obj << +/D [857 0 R /XYZ 90 757.9346 null] +>> endobj +860 0 obj << +/D [857 0 R /XYZ 207.8864 706.0616 null] +>> endobj +861 0 obj << +/D [857 0 R /XYZ 90 687.3006 null] +>> endobj +862 0 obj << +/D [857 0 R /XYZ 429.0947 581.6321 null] +>> endobj +863 0 obj << +/D [857 0 R /XYZ 90 562.871 null] +>> endobj +864 0 obj << +/D [857 0 R /XYZ 416.2232 469.1577 null] +>> endobj +865 0 obj << +/D [857 0 R /XYZ 90 450.3967 null] +>> endobj +866 0 obj << +/D [857 0 R /XYZ 318.9393 332.7731 null] +>> endobj +42 0 obj << +/D [857 0 R /XYZ 90 312.8912 null] +>> endobj +856 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +869 0 obj << +/Length 1859 +/Filter /FlateDecode +>> +stream +xÚ¥XYÛ6~÷¯ðCd4«ˆ:Wú£ 6@€Ù¢IPÐm ÑáèÈÆýõ‹:¼ + X,8ç g>ެ¶ü©mêm“(qÓ Œ·Yµñ¶G`¿Ù(Y¾õ›¹ÀËûͳßýt›ºiìÇÛûiˆ•ùÊßÞç妻?òœ÷;ßsL{Øù‘Ó´•®3³û|ÿvªÀõ‚$$Ÿ wóÛýhT|Š‚X¡É¯›Ÿ½m¾½ÝxnÞFÛ˜x®JS[mB?°“róaóǨ‡hÃZh‘ +Öb ®bóašphºÎw7Aê9YsÞ)Ϲõñéî&ôc§?^ºõž‰sÛd¦ë@çÊÉ›ZDMË„®y©¨³¦Aب³/¨Ýô—E^6µ»ƒÃ¿uîOƒ˜¢ƒ€Ñt}Qé^v4‡+¯ÞÿùØÜÉèœý²òÍЮE 7óì.G¥‘STçÒT¦îÉŸŽ™ºÄÞðØì{]Ô&îÅŠí”SfC)'ŽÇÓ’yžT¢0öˆìƒÔM9H–tI0µ>øÓ&wô5qc? É×èŸo«Ã§ËåÔ œnÈNÌÕÃÝ{^êOºg–<%@!ÔB¡€ub¥É¡ïúñ9˜ŒËÄN;¤ +|{PðÜ4­5‡÷¸–dTe~êO•‹“õ2ògù®¬ž v^šL(µ­Õ?V…º^ïD=öˆ^¤+Êô YÌH»ÀƒàWÓKǃêDÐEÏ3º$+¾¶‡2'ðRÊdŒ/4 +Õ2®að Ùcñå6„l¶ÌÊèºcÝ’žÅN\µONÎ ô4ûÒ¬ßYÛ ÇÓÙ&óTA³76·Ë¢*zû,ì…ÙÛ +{T&E^Ίoµ +¸¡ðU"j€˜ž;âÎüƒ¹ù:Ø'f'#Vƒ*L¸ÉAêÐ6¤(æ¢= ¬@íÅà“3¿Š*žñðÉ‹<±ý‹¸ôwLõdt¡µz:áÝZöH—p›Ø6à›ÎKÔ ñ¬þé~”ƒ¾R#ªy¬8z›íšqmÊxµ’²ŸW—ØŠ[©\[«ÄºgñSѳø ” õægAÞÍŸߨÄù@ǽ–¢rP‘±”÷äaLo óèÙA=¶È±"t}L ȇ‰8‰Ëgjø€UÑ Œ<Ȉz©Ã¶ @s&s{*Ò 3ñ"ÓCzÃZ~àWî‘=™7œô;ËÁd?~R¯+ëñч$}¤rOrÙAýƒ§$ gˆ“b%‘<©¸Â-'ÐvBÙ‘‡Çj(Dˆâ%éEœÈÁ8Ù¸á=¦‘½ŸÁ´ÿ8wí'*åª0YýÕ̃/YGñÿúõŠ~z»…-*ð翼Ånš·ö×)qcxcjè±Çë·úÎo1¤A&Ê—Ñ{îÏ}oü̈™’_íxÂåŠÒ®·Ì­×Í÷Ëîøêx𧵕óùÝlÞendstream +endobj +868 0 obj << +/Type /Page +/Contents 869 0 R +/Resources 867 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 829 0 R +>> endobj +870 0 obj << +/D [868 0 R /XYZ 90 757.9346 null] +>> endobj +871 0 obj << +/D [868 0 R /XYZ 299.5322 694.1065 null] +>> endobj +872 0 obj << +/D [868 0 R /XYZ 90 677.3793 null] +>> endobj +867 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +875 0 obj << +/Length 280 +/Filter /FlateDecode +>> +stream +xÚ¥Q=oÂ0Ýý+<&CŒïŸmÆ~¡FªDUoˆ’@¥–D¥ –_'N"„؇{çwŸï€Ëð€;É6©œøzÇ$߆ΟÜy6yBÇp„Äý¦«@ 4r_.°i¦À(JüG•f¨er|žGàïç“ÿVëÏté öèÇ~ý8Z´Ý¾Ùb)yÆ*˜ÊY̓#8‡|ÇrTƒóÅÞØëX']µ­Z:#KÂXs-@†ý€´¹i†N;R@©séH8£l+˜rÁêô›Uuµ_ª2ÊÔÔѾ  HA'ÇÞì­œ¢š¢ŒJImRÔI³¿8ˆ>ðýíCówÚVõå54¨q´3•þ}¸xjendstream +endobj +874 0 obj << +/Type /Page +/Contents 875 0 R +/Resources 873 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 829 0 R +>> endobj +876 0 obj << +/D [874 0 R /XYZ 90 757.9346 null] +>> endobj +873 0 obj << +/Font << /F29 499 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +879 0 obj << +/Length 1608 +/Filter /FlateDecode +>> +stream +xÚí›MÛ6†ïû+|´šá§Hö–¦i›¢)‰ÑÚ´²v-T¶’6ýõ%õµ´9’¬F§ZÈÁ‚=Oæ}v†ÑdÍ?²Ðx!…Dšñ`íïðâɼýý©?æ”™Wàƒµ l±voýfs÷ê;ª£  b±y´Î®‘Pl±Ùþ¶|³ Ÿq¾ZS—tõÇæÇêޤ’ÄÞ€_¸¢¼¼áôî¾2&Wï³í)«ëw‡müwë…pd¡µ—€!.hPz¡ˆ¬ÖcÜ鯨½°…F:°·•N¨ýωÊÉq^mRT¯aõ’&űºÊëÒ´ºØWο¶ÞïÞnÚÜ"¡&k\ „•róëå¹5^;ÖU®Ýp æˆHF[Ÿ6èû<;fÇ]‡[4çb‰Vka1¿ø/\ë®Ï.ô˜!Ì$ƒõ³ùSmúÁý‹inëWÒó^2,½ »Š&’„™o% i.e?mŒ#ªib”ŽYnDÙ?7¾hÍl”?eQX³e‡cr8…Ç$;ö„â3ff0QN:G!Ňäòý[¹4¡C¸¤J ¤¤¸–ªª†YªLà šCE¬1³a¾~~N“¨!‰)=“4ms4WÆzÅôý[1Y2†0U%ã QÎõP%kÌl˜ßþü±ªcy\dé§K»p‘z.cƒÔ]è˵Bج¢\®À¬¹m@>Ï»U`RFÐMAZz-eŒ˜+-‡(kÌlœßoêéÛõ>LêÖYÄfak`S8˜¹Ò=@9T¯Rž÷ +(F0¹(¢;Û[Á@5f6ÎÍJâeœâcƒRÞÖ.Æä\­¾8G’QÄõJéy/‰#ðâ Œ`ª†%b¦Å טUûâ4;ªhûkEÌ.8O·&bÞk~i¿tÔ[¯Šž÷ +6ÂF0lvÁ)§°µf6Î_WÊ”·‡z‡™&ñÁÔ9.gª¦!Εd qýRzÞ+â8DÁD •)†x Éq™GœÛMi0ï&¢Î‘eu½rzÞKê(ØTá&šx°@#A ˜x´få2nWÏšÛõæÍý«æº8†ÑŸ3^ÃŽ®)‡«Ã¨)G¿€¾+`@AÎÀ&šr0!lhÿÙš=_‰²ÃïÓ§S^ŽÙª7O‡¨ߊ`ÑÖ#T7Ñ£F´ý +ùþËq8÷‡C˜jaÆ +ˆC 5fg %‡ä˜„iòÌ‘bìæªT'GNžÇqÔ+ïß +ÄáÆ†0GŒ  `CZ³3޶ñŠŠå§$ªá6OÊ7Úå×9WòGe\9yÇU¯`¾ÿ’+r†0Õ2žh$±Ü86fg\…/Ï’<ˆ-æy×KN®Ç±Ô+’ï¿d |4‡0UÂÙ5ýJµÕå’iÅqS‘ +°ÛÝ⨗„ã©O(Ï»J€€ÀïŸ&jvˆRK5@Skf£üeEY†y>ØcHÕ¦¯ˆ·ÍjêbØßÍýZÈÛèrn²G‘Ô¯’ï¿ÜÎ]a¢.GCŠÓ¡í\kvV›^o·y\Ô8}°O°O/¯<e©ix½\ ¹©‡N¯&¾«‰›ÂTuH¤”ÚÀµfgèlÞÔÇ]žžvϧúQâC–íáÍ]9bÿïþÖÉ“ßqüô +ãû·Â( ò†0?ÂÅèЪ¨5+ÏhåÑ.9ÆÑñÔ“-žã(±C¥è¢‡¹c%Ü9NfÇ‘Ó+‰ï¿¬<à8„‰fÝ” ¤:Ýך•‡Â¡Ñcö\R“åBœóy´}>ÚvÓ>j´Ý¯—ï¿Ä +.H`ÝX]S^°2¥ S=ô¥5«NÂ0±LöMÃJ“‡<Ì?›2&LtnÔ•ev½zúþ˳Êð a;r-v”",9®1+«YšÙ•Qµy3Ë¥G{$&´Û5%ٌڗ:G‘qÄõJéû/‰ƒû'ÂT…Ž`DHç …–¸Æ¬ýOa©3¤ÅÇâ¢Þq5c÷@s„Z¯‚¾ÿ4pR‡0hD+D¦@«Ìªü>Þg¨r/øRåöá!|Š÷åI¬Ë‡2‚ÞÒ9–&Y#±8·uŸbq… <\~ýöלkB%–?÷ü"”r(endstream +endobj +878 0 obj << +/Type /Page +/Contents 879 0 R +/Resources 877 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 905 0 R +/Annots [ 881 0 R 882 0 R 883 0 R 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R 904 0 R ] +>> endobj +881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 483.9922 513.9963 492.8388] +/Subtype /Link +/A << /S /GoTo /D (section.6.1) >> +>> endobj +882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 469.9249 513.9963 478.8911] +/Subtype /Link +/A << /S /GoTo /D (section.6.14) >> +>> endobj +883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 456.0968 513.9963 464.9434] +/Subtype /Link +/A << /S /GoTo /D (section.6.2) >> +>> endobj +884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 442.1491 513.9963 450.9957] +/Subtype /Link +/A << /S /GoTo /D (section.6.19) >> +>> endobj +885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 430.1939 513.9963 439.0406] +/Subtype /Link +/A << /S /GoTo /D (section.6.20) >> +>> endobj +886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 418.2388 513.9963 427.0854] +/Subtype /Link +/A << /S /GoTo /D (section.6.21) >> +>> endobj +887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 406.2836 513.9963 415.1302] +/Subtype /Link +/A << /S /GoTo /D (section.6.22) >> +>> endobj +888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 394.428 513.9963 403.1751] +/Subtype /Link +/A << /S /GoTo /D (section.6.23) >> +>> endobj +889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 382.3733 513.9963 391.2199] +/Subtype /Link +/A << /S /GoTo /D (section.6.24) >> +>> endobj +890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 368.4256 513.9963 377.2722] +/Subtype /Link +/A << /S /GoTo /D (section.6.9) >> +>> endobj +891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 354.4779 513.9963 363.3245] +/Subtype /Link +/A << /S /GoTo /D (section.6.3) >> +>> endobj +892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 342.5227 513.9963 351.3693] +/Subtype /Link +/A << /S /GoTo /D (section.6.4) >> +>> endobj +893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 330.6671 513.9963 339.4142] +/Subtype /Link +/A << /S /GoTo /D (section.6.5) >> +>> endobj +894 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 318.6124 513.9963 327.459] +/Subtype /Link +/A << /S /GoTo /D (section.6.6) >> +>> endobj +895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 306.6572 513.9963 315.5038] +/Subtype /Link +/A << /S /GoTo /D (section.6.7) >> +>> endobj +896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 294.702 513.9963 303.5487] +/Subtype /Link +/A << /S /GoTo /D (section.6.8) >> +>> endobj +897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 282.7469 513.9963 291.5935] +/Subtype /Link +/A << /S /GoTo /D (section.6.11) >> +>> endobj +898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 270.6721 513.9963 279.6383] +/Subtype /Link +/A << /S /GoTo /D (section.6.13) >> +>> endobj +899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 258.8365 513.9963 267.6832] +/Subtype /Link +/A << /S /GoTo /D (section.6.10) >> +>> endobj +900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 244.7692 513.9963 253.7355] +/Subtype /Link +/A << /S /GoTo /D (section.6.12) >> +>> endobj +901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 232.8141 513.9963 241.7803] +/Subtype /Link +/A << /S /GoTo /D (section.6.15) >> +>> endobj +902 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 220.8589 513.9963 229.8251] +/Subtype /Link +/A << /S /GoTo /D (section.6.16) >> +>> endobj +903 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [502.0411 208.9037 513.9963 217.87] +/Subtype /Link +/A << /S /GoTo /D (section.6.17) >> +>> endobj +904 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 197.0682 513.9963 205.9148] +/Subtype /Link +/A << /S /GoTo /D (section.6.18) >> +>> endobj +880 0 obj << +/D [878 0 R /XYZ 90 757.9346 null] +>> endobj +46 0 obj << +/D [878 0 R /XYZ 90 739.9346 null] +>> endobj +50 0 obj << +/D [878 0 R /XYZ 90 553.9527 null] +>> endobj +877 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +908 0 obj << +/Length 276 +/Filter /FlateDecode +>> +stream +xÚ¥Q=OÃ0Ýý+<&CÌÝ9þꈀª‘@d«:âviQÑþ{œØ"è†<Ü;¿û|‡ÂCî€e„“¥æG|¾— ]¾˜Ü×ìî‰wÂiÒ¼Þ4 +EH¼nÖA^HB Y¿zÉ R¡€ž»¦?øˆWmãÏù¦®Øc=õKã(©qèöÉÖàM«b ¤³Š:GüÈJ’WçÀÞØëT'c­­ºÐV cÍ­û¡Væ_3ŒÚÙ‚RÎ¥ÓÂié$…ÄR7¬Ñ£~KßúÓöË7Q¦®½J—@•£Êúä % ’ J2€Žh—“ʺStþÞãýíCw¾ì}ûû +å4ÚL¥kÆxdendstream +endobj +907 0 obj << +/Type /Page +/Contents 908 0 R +/Resources 906 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 905 0 R +>> endobj +909 0 obj << +/D [907 0 R /XYZ 90 757.9346 null] +>> endobj +906 0 obj << +/Font << /F29 499 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +912 0 obj << +/Length 1260 +/Filter /FlateDecode +>> +stream +xÚí›M«6†÷ó+² RãúÛ¸Ë^õãvUUÙUU”î€J>”0º_;â=V=weF rürà}°9Ъ?´p!˜’P¾¨Opñ¬6ÿò„†Ÿ)&jéøaÅY¬ì¦?®Ÿ¾ÿˆ€sÌë/ZœS XIëýŸËOÍöÜ×—b…\’â¯õo¦¢H7€J—ZbzkðòùwŒ4+¿¶õe{)P¹¬š¶Úvfëçã¾þgÒC¨”ð Ç   ó›¨X!¡CùS·½^ç;)[¾Òd!äZ릌õ±3£¼nÚ¡q{lêKÛoUm6tíµ~B®§K_ïÍúåôòÜt¯gËïÌ–]U~C“ãiX©N‡sW÷õB·Ý¹Ùîê^Ÿ‰îõæÓOëÉ#„@X¹CK`YÚ>Îüœ‚WV´ñÔ>n)@‚àISý¾©ÎÕæÚo{uÌBÈ%(VL弘/¨|óô<ØGe {Ã=py"ÿ°|[ùm|ÔÖ."LSÐù{à!’R0¢1’1üÔ„ÊQ¨K’à kc˜N³©»î´ùZ ¸<]ºýˆ“4í-Â,¢óÚ7S7Q'dÎ RQÆ‘âHðe&LÊúþ¼ßTÏíF÷­êüá2s•¦;Os,lV;l¶‰3'lÎ RÁ¦nx0V÷?ØÆ°;lCGF8Êl}w–1QÜy ©;g©¸#`.Hˆ»1Lçy¨»Í®;U«;SNò}["Ò,+¢HóZ8S7¤ 'iÎ R‘† £i& ßò<_dÅJ"‘©J^€¿ñÌÇògµóðgûŠpéäÏ™A*þ„‰~CÔD߯Ö_TOs©ð!Ü݉ÂÎç磶N:¡sí>sõ,Tǰu½êðÎT}k -¯¢8ôzâì•sÛ‡(̼þÍÔ fη€Ý<€£¿Z!AAIÄ»¾úe_°endstream +endobj +911 0 obj << +/Type /Page +/Contents 912 0 R +/Resources 910 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 905 0 R +/Annots [ 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R 919 0 R 920 0 R 921 0 R 922 0 R 923 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 933 0 R 934 0 R ] +>> endobj +914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 483.9922 513.9963 492.8388] +/Subtype /Link +/A << /S /GoTo /D (section.7.1) >> +>> endobj +915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 472.1366 513.9963 480.8837] +/Subtype /Link +/A << /S /GoTo /D (section.7.2) >> +>> endobj +916 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 460.0819 513.9963 468.9285] +/Subtype /Link +/A << /S /GoTo /D (section.7.3) >> +>> endobj +917 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 448.1267 513.9963 456.9733] +/Subtype /Link +/A << /S /GoTo /D (section.7.4) >> +>> endobj +918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 436.1715 513.9963 445.0182] +/Subtype /Link +/A << /S /GoTo /D (section.7.5) >> +>> endobj +919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 424.2163 513.9963 433.063] +/Subtype /Link +/A << /S /GoTo /D (section.7.6) >> +>> endobj +920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 412.1416 513.9963 421.1078] +/Subtype /Link +/A << /S /GoTo /D (section.7.7) >> +>> endobj +921 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 400.306 513.9963 409.1527] +/Subtype /Link +/A << /S /GoTo /D (section.7.8) >> +>> endobj +922 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 388.3508 513.9963 397.1975] +/Subtype /Link +/A << /S /GoTo /D (section.7.9) >> +>> endobj +923 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 376.3957 513.9963 385.2423] +/Subtype /Link +/A << /S /GoTo /D (section.7.10) >> +>> endobj +924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 364.4405 513.9963 373.2872] +/Subtype /Link +/A << /S /GoTo /D (section.7.11) >> +>> endobj +925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 352.4853 513.9963 361.332] +/Subtype /Link +/A << /S /GoTo /D (section.7.12) >> +>> endobj +926 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 340.5302 513.9963 349.3768] +/Subtype /Link +/A << /S /GoTo /D (section.7.13) >> +>> endobj +927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 328.575 513.9963 337.4217] +/Subtype /Link +/A << /S /GoTo /D (section.7.14) >> +>> endobj +928 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 316.6198 513.9963 325.4665] +/Subtype /Link +/A << /S /GoTo /D (section.7.15) >> +>> endobj +929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 304.5451 513.9963 313.5113] +/Subtype /Link +/A << /S /GoTo /D (section.7.16) >> +>> endobj +930 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 292.7095 513.9963 301.5561] +/Subtype /Link +/A << /S /GoTo /D (section.7.17) >> +>> endobj +931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 280.8539 513.9963 289.601] +/Subtype /Link +/A << /S /GoTo /D (section.7.18) >> +>> endobj +932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 268.7992 513.9963 277.6458] +/Subtype /Link +/A << /S /GoTo /D (section.7.19) >> +>> endobj +933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 256.9435 513.9963 265.6906] +/Subtype /Link +/A << /S /GoTo /D (section.7.20) >> +>> endobj +934 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 244.8888 513.9963 253.7355] +/Subtype /Link +/A << /S /GoTo /D (section.7.21) >> +>> endobj +913 0 obj << +/D [911 0 R /XYZ 90 757.9346 null] +>> endobj +54 0 obj << +/D [911 0 R /XYZ 90 739.9346 null] +>> endobj +58 0 obj << +/D [911 0 R /XYZ 90 553.9527 null] +>> endobj +910 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +937 0 obj << +/Length 287 +/Filter /FlateDecode +>> +stream +xÚ¥QMOÃ0 ½çWäØl§ùÚc•@ô6í0ÚnLÚZQ1±ý{Ò¦«*¶Êáù#¶ŸŸ‘ƒÈp£Œp2Õ¼80à[ž3Ò‰Ï'Ó÷9»{"Çpš4Ï7}BÏËeD'ÀÚè¸xR¡€`<ïªvÝÆh£âsW¬÷!º¨Ëê¯òŒ=æã䘒»¹_l¹^z‚!UüÇ; Ð9â–’¼8{öÎÞÆ>!ÑÜÚ¯K'Úja¬¹õü¦¨•ù‡^EëKPÊ©ˆZ8#m'¢$_˜jâ=Ý+9¯j/×wU™š:àËÅÈbTÑqp„É ‚€Ö&&5mp®/óqøÐœÎÛªþ{ …r¤6Qéìº{~endstream +endobj +936 0 obj << +/Type /Page +/Contents 937 0 R +/Resources 935 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 905 0 R +>> endobj +938 0 obj << +/D [936 0 R /XYZ 90 757.9346 null] +>> endobj +935 0 obj << +/Font << /F29 499 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +941 0 obj << +/Length 1873 +/Filter /FlateDecode +>> +stream +xÚí\MsÛ6½ûWð(„àû£·4I[÷”‰•SÛÑÈmq*K‰žôç$H +4V¨œ¦åä Z||»ä¾ *$ÁöI N”PÈ0.“ÕÓ Ní×?ßê4§Ì~'f‚°dæ_úãüæÍOÔ$#)©Hæ¹ä Í’ùú·É»Íò§ÇéŒ +<áÓ?濺 8RZ‘âlyâšòò‚çÛLvï—ùÒÝåÇçUþ|œ=IÝW·»uúWCK8²žÑŠV2Ä•%-Gd:#ãþN-K 2²à)Yiqû±þ’+?–õA¾©Ö ë©bµŒåß_²|ãŽîYúPÁÓÓê˜òl¿;ýPX¾ù0ožŽû|_:k+iî¾´$ÄjÃèÿª°çßKØ ذ5(lЃ¡…MbBÅt]¡Y/î§OžÂêÆ®U•>_7(b]Äh‡ê ÂPõJ„®Ø½ävi`À4€ÌØJ “hƒ§†•y‡=Xë\Ñ€ñØBç*PÌ&%Hb%Ú6G_áƒÓ;5€HöÊÎØìev0 fèÁÀéÁ´AœËX¨÷szÊ—VÀ)c¯õiI¢BŬ×+à–õQéWœ  8õÉ‚îÀì. ”°‘, ×Îe‹rCb VÜOžnwi~©$8Œ‰Äg6Â*TÌzÜr`ÔõU2P¯ èŒXÀî2€‚z0ô< …•¢Œõ€X™ÙSz WÁQÌLâ3V¨˜a»Z–†Ë¶ábü¶Úq/}ð–µ’zï[(]J r½R¢3”»K pgö`è” Mb¡V¾À’«ýnFQÁŸ¨‹(f™3¤x‘¾å"'>ÅBÍ 0ówÕAánº:_àÒÈ(ñ]ŽæÀóí%ÝÎ'°;é‚{»°C×3VI…ïåV¨Z¸i¾Y,×ëpH¶^çvïѵLŠÑ"³}ã=µËõì>«z˜òMzÜÕÍÂëôtjµ7±ø·k5|š½¤Úõx_r;¡‚[O ù¡‡XjT8Öœi`¾R7P)bÔrø¼€R+T̼­Î5amë­|[„›t¹n×"̰ÿqÄ —¾;ƒ°;…ƒÛK°CKœ(¤ìà“x «%ž­žöR¹T¨xÌgöW(f_1dmûcüm;˜^Êï UÀî”î?Á ]„`”ÄѦJ «•¿K³ÇÍýþ×"ÊRh-Ÿx¯²BÅœÐiÁYÛ‰QÛ¯<‹^‚ï NÀîî4Á <ÔSÃÆ"ÖCi`µà‹bø 3H£Ÿ5t²FÅŒsj…ÎLÛxSÌ0ªÎ?T(þ”“Í~»Îvî\¾©¾µ«Æ7Å +Ò]`KõSž­N5h™;ÔòXq>NÅdYIéÚÉ܉Ϸwó©­ÞN !“ùíÝüöÝ;™•#™a;ƒ»u´Ê½‡ºÚÊ÷Õ9ü‚‹+=vvÌ×%1ÕÄJ¿zéì_w9‰T™Ä܃=xÖ¢Ò mb“VªS8_],ÖÊ÷ÜÎWt¼ µ^oøÖÇyé3^Úï +×Kn§|p 4?ôìUþ´ÏÄÖâ ¬–þóúB˳|ÃÛ°Ä'¾ðk‹ŠÙ— IiLÛþk›žŸßw6=6ßÇÚz¤½ôÚùŒv§X°C{0´d¹°e>­­˜'ÙK£µ-“xùÕ33 Ù +s ^\·‡áo©Èô’~g¨v'}°Ã{0t™Â8Â4^§Ô°â~¾¤÷«mfGÊ ï,Øò‚ðbÅáqâ¯P1ñû.ŒÊþ6ñ‘é%þÎPìNüàï¶`^h¤øOÜ(©‰éõ¿ ü IÔÄendstream +endobj +940 0 obj << +/Type /Page +/Contents 941 0 R +/Resources 939 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 905 0 R +/Annots [ 943 0 R 944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R 950 0 R 951 0 R 952 0 R 953 0 R 954 0 R 955 0 R 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R 961 0 R 962 0 R 963 0 R 964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 978 0 R 979 0 R 980 0 R 981 0 R 982 0 R 983 0 R 984 0 R ] +>> endobj +943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 481.9349 152.2025 492.8388] +/Subtype /Link +/A << /S /GoTo /D (a00077) >> +>> endobj +944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 483.9922 513.9963 492.8388] +/Subtype /Link +/A << /S /GoTo /D (section.7.1) >> +>> endobj +945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 470.956 176.4612 480.8837] +/Subtype /Link +/A << /S /GoTo /D (a00078) >> +>> endobj +946 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 472.1366 513.9963 480.8837] +/Subtype /Link +/A << /S /GoTo /D (section.7.2) >> +>> endobj +947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 458.0246 162.175 468.9285] +/Subtype /Link +/A << /S /GoTo /D (a00079) >> +>> endobj +948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 460.0819 513.9963 468.9285] +/Subtype /Link +/A << /S /GoTo /D (section.7.3) >> +>> endobj +949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 446.0694 148.8948 456.9733] +/Subtype /Link +/A << /S /GoTo /D (a00080) >> +>> endobj +950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 448.1267 513.9963 456.9733] +/Subtype /Link +/A << /S /GoTo /D (section.7.4) >> +>> endobj +951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 435.0905 161.0693 445.0182] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 436.1715 513.9963 445.0182] +/Subtype /Link +/A << /S /GoTo /D (section.7.5) >> +>> endobj +953 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 422.1591 128.4121 433.063] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 424.2163 513.9963 433.063] +/Subtype /Link +/A << /S /GoTo /D (section.7.6) >> +>> endobj +955 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 410.2039 146.4744 421.1078] +/Subtype /Link +/A << /S /GoTo /D (a00083) >> +>> endobj +956 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 412.1416 513.9963 421.1078] +/Subtype /Link +/A << /S /GoTo /D (section.7.7) >> +>> endobj +957 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 398.2487 112.9203 409.1527] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +958 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 400.306 513.9963 409.1527] +/Subtype /Link +/A << /S /GoTo /D (section.7.8) >> +>> endobj +959 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 386.2936 147.7889 397.1975] +/Subtype /Link +/A << /S /GoTo /D (a00085) >> +>> endobj +960 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 388.3508 513.9963 397.1975] +/Subtype /Link +/A << /S /GoTo /D (section.7.9) >> +>> endobj +961 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 375.3146 155.5297 385.2423] +/Subtype /Link +/A << /S /GoTo /D (a00086) >> +>> endobj +962 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 376.3957 513.9963 385.2423] +/Subtype /Link +/A << /S /GoTo /D (section.7.10) >> +>> endobj +963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 362.7568 126.2002 373.2872] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 364.4405 513.9963 373.2872] +/Subtype /Link +/A << /S /GoTo /D (section.7.11) >> +>> endobj +965 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 350.4281 142.2503 361.332] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +966 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 352.4853 513.9963 361.332] +/Subtype /Link +/A << /S /GoTo /D (section.7.12) >> +>> endobj +967 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 338.4729 157.7419 349.3768] +/Subtype /Link +/A << /S /GoTo /D (a00089) >> +>> endobj +968 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 340.5302 513.9963 349.3768] +/Subtype /Link +/A << /S /GoTo /D (section.7.13) >> +>> endobj +969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 326.5177 153.3186 337.4217] +/Subtype /Link +/A << /S /GoTo /D (a00090) >> +>> endobj +970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 328.575 513.9963 337.4217] +/Subtype /Link +/A << /S /GoTo /D (section.7.14) >> +>> endobj +971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 314.5625 168.8202 325.4665] +/Subtype /Link +/A << /S /GoTo /D (a00091) >> +>> endobj +972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 316.6198 513.9963 325.4665] +/Subtype /Link +/A << /S /GoTo /D (section.7.15) >> +>> endobj +973 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 302.6074 180.9847 313.5113] +/Subtype /Link +/A << /S /GoTo /D (a00092) >> +>> endobj +974 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 304.5451 513.9963 313.5113] +/Subtype /Link +/A << /S /GoTo /D (section.7.16) >> +>> endobj +975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 290.6522 140.596 301.5561] +/Subtype /Link +/A << /S /GoTo /D (a00093) >> +>> endobj +976 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 280.7543 513.9963 289.601] +/Subtype /Link +/A << /S /GoTo /D (section.7.17) >> +>> endobj +977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 266.7419 161.0694 277.6458] +/Subtype /Link +/A << /S /GoTo /D (a00094) >> +>> endobj +978 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 268.8987 513.9963 277.6458] +/Subtype /Link +/A << /S /GoTo /D (section.7.18) >> +>> endobj +979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 254.7867 162.1755 265.6906] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 256.844 513.9963 265.6906] +/Subtype /Link +/A << /S /GoTo /D (section.7.19) >> +>> endobj +981 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 242.8315 163.8392 253.7355] +/Subtype /Link +/A << /S /GoTo /D (a00096) >> +>> endobj +982 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 244.9884 513.9963 253.7355] +/Subtype /Link +/A << /S /GoTo /D (section.7.20) >> +>> endobj +983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [103.1769 231.8526 167.1461 241.7803] +/Subtype /Link +/A << /S /GoTo /D (a00097) >> +>> endobj +984 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 232.9337 513.9963 241.7803] +/Subtype /Link +/A << /S /GoTo /D (section.7.21) >> +>> endobj +942 0 obj << +/D [940 0 R /XYZ 90 757.9346 null] +>> endobj +62 0 obj << +/D [940 0 R /XYZ 90 739.9346 null] +>> endobj +66 0 obj << +/D [940 0 R /XYZ 90 553.9527 null] +>> endobj +939 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1007 0 obj << +/Length 287 +/Filter /FlateDecode +>> +stream +xÚ¥Q=oÂ0Ýý+<&CÜ»s|¶«¶¤J­È†( ,%Q£D…_‡µl•‡{÷éwïPBx(=Hk¬ò:g¹; +‡ž ÓYÈg·…xx!/½òL,‹ý0QB’E¹N(O3òÀ˜ô‹· $¨ ‚§m·hÕµý®ëÛ]RÅТ.«Sº)–⹘ŒüŒf¼|ÿ%Öe๠´wF~zOò(rÒWçS¬Äû4'&††{k^Ò;VÖÙ{F6ö_1]hA­oµdå­v-5…ÆœIZ Öò 輪«vÛUe”©©£}½‚eŠ&éGi´0#=£Qwàˆö)™¤i£ó÷@çñPÍé|¨êß×0¨'j7*ý”â} endstream +endobj +1006 0 obj << +/Type /Page +/Contents 1007 0 R +/Resources 1005 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 905 0 R +>> endobj +1008 0 obj << +/D [1006 0 R /XYZ 90 757.9346 null] +>> endobj +1005 0 obj << +/Font << /F29 499 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1011 0 obj << +/Length 3129 +/Filter /FlateDecode +>> +stream +xÚí\K7¾ûW9ÍÍ÷c/Aö‘µÎÂHØÃf©m ÑHIc'ÿ~É&»Å&kÈžI¶g ¦Ý*V}]¬¯H›MfØþ#3ƒgJ(d—³åÍ <{ooÿó ?sÊì_à‡¹ l6›þõêÅ˨™QŒ¤¤bvõÎ)—Ü ¡Ùìjõß‹¿­·§æp9§_ˆËÿ]ýË7àHiE\lõ +Ä5åmƒ»×o½0AØ_ü°Ù6þêõnÕüÖë Y4è qAe«C r9'㢶7›ã)(c3ƒŒt­[]T#ÅI«êUs⛣ÿ»ð¶®u{µ~ØnýÅj¿¼»iv§fåÿÿ ÆtÛ„æ7§µ¿º>lšÐtÕ—‡Ííi³ßÿâ0½øÇUïvB"Ô:œkŽfƒNËú¨—žÇâ¾£âÇ$Øþª=ku»¸½=¾\­—·Ë—½ŸÏm¸BÂ8KN´•BKÀƒœ#!‰ rèr.lO|ýsþ“t°À a¦ØÁgòuR@ÇÆ”ks½ðÝw™UR1ÈŒ@Z kPD˜%Ĉ¸Sž"Œµ¸ëÄwë¯q7aÜE=VŠ»¬cḋ;öž¸+|tÜ ƒ4¼wXwëf»ÝÏ?^›ËÛÕË,+;Ò¸Œ-øŸïƒÌO1¤N¾)Óë %h|†áPªZ%p¿ôR”aD¸áC¿`¿ßùÁ©¹$ââ·ÅÍm7pvÞzIÅÅGÿŸÓ>Œo‡Í)Èõƒ¯õòv³\´Ã[: +Þö§ýq¿üÕ=ps:vC¦ éss£|ìBotÍ*~È´;7®ÀðTÂ˜Ž c›í&´ÆØ#Â8²0.ŒË2½P¯ó0Öˆ©8Y© +Æ\„ ãWÍbÕN@)31w-.ÞíÃÍÅÎÿƹ½Ñƹ•<ǹ½ÙƹýÛŹ½ôqnE’8wR.ÎíƒÏæZ#NŒv=Œ_!øçBÑg4@qc6xõ|eÂNÖ僓Á¹Y!!Ÿ +4˜ + óS h”!I섦’ :±>šã~û!O‚"F£þñŽT«ƒá\Jq‘_DS»€”&Á‘º¡“ª™×vñH•ÚwÄÿû¿îÆ©n©¶[Ü4Ã᪢V+‹90 ·é [¹zJ*Ê>·9\ª€/Gñ èÜL»g‚™"˜Š +6kr¥t +Øh*DzGQ¡Œ#ÕšPaS!;÷Ò ŽŒ +AªfÞRÁh!†öTÈ#{¹_J¬»²/Yıoç;_ÒÚ¦\À±£xQôt¦½åE>emy"˜h²ÈŒAŒWk<½XÏ‹ãÍé6g…;1å,V[¢E'_Ñéu8`tP6p’bH=ÐIÕ,+iÝio ,;JüüãÕÛ{Ö7wé +xíL.&ãú \çwÑ +yt Ê.δ{.0ˆ 0‚‰Æ¦¢¸ZwêÅÆr!R;Ž e™Þž khÅFŒI1d\R5Ë– ÒàÄC.”Ç%žE]¬hÀë£øRì†L»ç ù"˜Š/J ¬ªõ²^¬çË©ÙîšP`VÒ>‹5gUA¾%ÓÛRÆU ÕFšr‘€È¦TAªfÚN½˜Ö M·œÙœŒJL)Õó+'÷ 8~mŠ=‘i÷´‘ m@SM¹¤]˜òj}®{m"ÍãhS†’é=ÓX‰Ä4 ˆŒ6AªfÚÒF+F†¦AÚ|;fàáD?9–~Å’¢ã3íž%`F0Õà"l‚ÅŠÔXÒ‰=€%‘æq,)CÉô:(4¼û„Œ%02ž©šqCLm·49(Çæ”¢ôgPŠú¤œ>Š4Å^È´{Ò€õ^ÁTC ÓH*Z+øöb M¤yiÊP2½1iÖi¤vÞÀHÓJÕŒëTEÌÐø(Ö¨§=/»5€×G±¦Ø ™vϰ6 #˜j¨¡ ¦kµá^¬gÍÇæz¹Ý4»SÎ)‘ÂJÏbÝ%Þtò50™^¦Çìõ[W0çäŽt4UŒS‘æR ;Þ¼ +^Ý&ÿifb¯®º";¨‹Iñ…;à«Qá^ô^¦½ w‰ÁpLî¶9¶W•pïÄî‘îqá^“é†û +÷vXàÂÝQEã”ÿëÀøà€d­áßó†¶ pß(ši÷   @SM“0ETáj¡·‹pž,ÐHIÌf±þ" ‚| P¦·}?ætº]Í—ï7PÒ·«n ¼PŸKú„54îXðŸK/škxºä_GÛ!»SsxçÞPY,‡[‚âK™ŽŇ¢k3ížp!D0¨ÁV\² +‚0ú†cù7(ðaèÌpT X%8€QÁ UŒ;>H£äÐøåCeë\OýÛÆDÙ‘™výŠ~ÁTѯ,LkõØ^ìÁÑéýe@™Þ>új“‘ˆ•‚H}ÑIÕLÛ.“\-WCÿSÎð?õÀ¹}uŠýi÷Ô·2`-%¨´í¤®i{±u’Ã’#áÎwá(ºÁ# ·¿ùõÈFõFÜY…CyŸ‚‡4} +Ò(|t¶ )Æj%Î^ÌÁÛn®_B‡â¸òÄúJÙ9ˆ×ì§Zù›ææú’cèMV®‘Ö"‘>{ª™1å²BlÛeç››ýá÷pfpë^ïŽî—QÁæ°¿;mvÍðrŸN.œ<*Ýži÷¹Ü0ƒL•‹9A˜Z³«#Ò7Šeû©Ö1ò‚?7ˆóöœoŒ"cFª·Ô0ŒÉ¡õ?H .ôÓ¡àåQÔ(º=Óî©n‹Á¦¢µq"E­âÙ‹µÇÈ7·Ð¼„;ß *Ì7–.dÀy 3ˆš¯GIÿœ‰LÔ¥‰LÖëðD&îõ{&2%ƒžÈØ+ÆH­Ù‹ÅA9Ì×IÅÍ,VXLØA¾† ÓÛŽ˹;é²]\7Û#ô©]!bF0Ù §AªAÛ¤ ´B7œŒñNF_¸Ô½õ·–ûÍÛwý:{ëzql?«`»†¾Zo/¾yÓ>–ÿu|pg÷Û»æø¿ñ®YÌý‘hhŠÚ†¦NÊMàÞ3Œ`¢¡‰†(¯Ÿz±jˆŽÊ™ÞŽ7§åÈ’!) K€¤è¤j楫L™Ä|m˹Ëíé¤apó¼\ƒÐÐ?ŒSë)ÚÞ³šo’-;©&™nA®Óe_eÚÛ˜Và3Œ`ª˜¶i›àjU¨«Çt¤p\L—dz}LÁ̸wŒJ¤OÞIÕì2‰4Ã|h×EÝ›bÀ†Móìg€}„½1Š?ÅîÉ´{þ€gò`Í ]…ߨj‰«½\¹u_ +¿¸ôu¹òç-Wâî,,Wò^—+ƒ^‡—+EƒNêÂ%¯jy©«'õHḤ^Fé=G|ž×FL‘€H¾“ª™i“‡wyýíðó݇߮‹®èTÞøeŠ?Õ8~T +/öD¦Ý§pð #ÁT)œs¤’ +[:±:["…ãØRFémÙr‚§@Ú(• ¦@­TÍ.³ y­ÙÐnO•Óú`ùp¬¢6D=yàòQ$)öA¦Ý“|íF0ÕÂ(ªZëÅê$‰Ž#IA¦·­ïlnlÂà‡i¸BXÙéÖH¶k¤jæÝWP%åCóŽ+W—L\´0ò¥À*ž*OwâIÑÿ™vÏð- ÁT<¡q;¨ñ¤«ó$R8Ž'e™Þ!OÖO$uËê€'­Tͼ¦Y 64_ãIåC˜?«5УTì˜L»'¸5#˜j6†5b˜U‹¬X@‘Âq*#Èôó]³y¿¾Þß7Þ(e—÷J&x²Ý– UCájFê!ŠöëO‹ÓÂUMÝ‚ÄWY™"–N»_ç¡ÔêîwXß^ιûtv[fu¿\ÿî[¼~ûAú;þ£Qîj±[ùÝÕZáðCל„æîÃÙÝ® ‘B w]ÞÝ÷]¾ÿémúi*û“ûãùÓ¢a}ÅÌ3Ø`¹‡ôF"Ƽ;·ºŸðAÆÓÜî‡l'aë¾"o» +QŒù¨¯ÌÿÝýw}endstream +endobj +1010 0 obj << +/Type /Page +/Contents 1011 0 R +/Resources 1009 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1063 0 R +/Annots [ 1013 0 R 1014 0 R 1015 0 R 1016 0 R 1017 0 R 1018 0 R 1019 0 R 1020 0 R 1021 0 R 1022 0 R 1023 0 R 1024 0 R 1025 0 R 1026 0 R 1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R 1041 0 R 1042 0 R 1043 0 R 1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1061 0 R 1062 0 R ] +>> endobj +1013 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.3629 456.6823 228.655 467.5862] +/Subtype /Link +/A << /S /GoTo /D (a00100) >> +>> endobj +1014 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 458.7396 513.9963 467.5862] +/Subtype /Link +/A << /S /GoTo /D (section.8.1) >> +>> endobj +1015 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.3629 444.5481 229.2129 455.4521] +/Subtype /Link +/A << /S /GoTo /D (a00101) >> +>> endobj +1016 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 434.6502 513.9963 443.4969] +/Subtype /Link +/A << /S /GoTo /D (section.8.2) >> +>> endobj +1017 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.3257 420.4588 183.9331 431.3628] +/Subtype /Link +/A << /S /GoTo /D (a00102) >> +>> endobj +1018 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 422.3965 513.9963 431.3628] +/Subtype /Link +/A << /S /GoTo /D (section.8.3) >> +>> endobj +1019 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.3257 408.3247 184.4911 419.2286] +/Subtype /Link +/A << /S /GoTo /D (a00103) >> +>> endobj +1020 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 410.382 513.9963 419.2286] +/Subtype /Link +/A << /S /GoTo /D (section.8.4) >> +>> endobj +1021 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.3543 396.1905 174.6379 407.0945] +/Subtype /Link +/A << /S /GoTo /D (a00104) >> +>> endobj +1022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 398.2478 513.9963 407.0945] +/Subtype /Link +/A << /S /GoTo /D (section.8.5) >> +>> endobj +1023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.3543 384.0564 175.1958 394.9603] +/Subtype /Link +/A << /S /GoTo /D (a00105) >> +>> endobj +1024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 386.1137 513.9963 394.9603] +/Subtype /Link +/A << /S /GoTo /D (section.8.6) >> +>> endobj +1025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.0952 371.9223 181.8208 382.8262] +/Subtype /Link +/A << /S /GoTo /D (a00106) >> +>> endobj +1026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 373.9795 513.9963 382.8262] +/Subtype /Link +/A << /S /GoTo /D (section.8.7) >> +>> endobj +1027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.0952 359.7881 182.3787 370.692] +/Subtype /Link +/A << /S /GoTo /D (a00107) >> +>> endobj +1028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 361.8454 513.9963 370.692] +/Subtype /Link +/A << /S /GoTo /D (section.8.8) >> +>> endobj +1029 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.0952 347.654 190.1196 358.5579] +/Subtype /Link +/A << /S /GoTo /D (a00108) >> +>> endobj +1030 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 349.7113 513.9963 358.5579] +/Subtype /Link +/A << /S /GoTo /D (section.8.9) >> +>> endobj +1031 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.0952 335.5198 190.6776 346.4238] +/Subtype /Link +/A << /S /GoTo /D (a00109) >> +>> endobj +1032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 337.4575 513.9963 346.4238] +/Subtype /Link +/A << /S /GoTo /D (section.8.10) >> +>> endobj +1033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.7115 323.3857 213.3523 334.2896] +/Subtype /Link +/A << /S /GoTo /D (a00110) >> +>> endobj +1034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 325.443 513.9963 334.2896] +/Subtype /Link +/A << /S /GoTo /D (section.8.11) >> +>> endobj +1035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.7115 311.2516 213.9103 322.1555] +/Subtype /Link +/A << /S /GoTo /D (a00111) >> +>> endobj +1036 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 313.3088 513.9963 322.1555] +/Subtype /Link +/A << /S /GoTo /D (section.8.12) >> +>> endobj +1037 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.7641 299.1174 212.6453 310.0213] +/Subtype /Link +/A << /S /GoTo /D (a00112) >> +>> endobj +1038 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 301.1747 513.9963 310.0213] +/Subtype /Link +/A << /S /GoTo /D (section.8.13) >> +>> endobj +1039 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.7641 286.9833 213.2032 297.8872] +/Subtype /Link +/A << /S /GoTo /D (a00113) >> +>> endobj +1040 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 289.0405 513.9963 297.8872] +/Subtype /Link +/A << /S /GoTo /D (section.8.14) >> +>> endobj +1041 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.7641 274.8491 197.1536 285.7531] +/Subtype /Link +/A << /S /GoTo /D (a00114) >> +>> endobj +1042 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 276.9064 513.9963 285.7531] +/Subtype /Link +/A << /S /GoTo /D (section.8.15) >> +>> endobj +1043 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [116.4668 250.5808 149.8812 261.4848] +/Subtype /Link +/A << /S /GoTo /D (a00120) >> +>> endobj +1044 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 252.6381 513.9963 261.4848] +/Subtype /Link +/A << /S /GoTo /D (section.8.16) >> +>> endobj +1045 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [116.4668 238.4467 150.4392 249.3506] +/Subtype /Link +/A << /S /GoTo /D (a00121) >> +>> endobj +1046 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 240.504 513.9963 249.3506] +/Subtype /Link +/A << /S /GoTo /D (section.8.17) >> +>> endobj +1047 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 214.1784 179.5994 225.0823] +/Subtype /Link +/A << /S /GoTo /D (a00123) >> +>> endobj +1048 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 204.1609 513.9963 213.1272] +/Subtype /Link +/A << /S /GoTo /D (section.8.18) >> +>> endobj +1049 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 190.0891 164.6655 200.993] +/Subtype /Link +/A << /S /GoTo /D (a00124) >> +>> endobj +1050 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 192.1464 513.9963 200.993] +/Subtype /Link +/A << /S /GoTo /D (section.8.19) >> +>> endobj +1051 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 177.955 135.336 188.8589] +/Subtype /Link +/A << /S /GoTo /D (a00125) >> +>> endobj +1052 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 180.0123 513.9963 188.8589] +/Subtype /Link +/A << /S /GoTo /D (section.8.20) >> +>> endobj +1053 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 153.6867 151.3858 164.5906] +/Subtype /Link +/A << /S /GoTo /D (a00127) >> +>> endobj +1054 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 155.744 513.9963 164.5906] +/Subtype /Link +/A << /S /GoTo /D (section.8.21) >> +>> endobj +1055 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 141.5526 135.8939 152.4565] +/Subtype /Link +/A << /S /GoTo /D (a00128) >> +>> endobj +1056 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 143.6098 513.9963 152.4565] +/Subtype /Link +/A << /S /GoTo /D (section.8.22) >> +>> endobj +1057 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 129.4184 148.068 140.3223] +/Subtype /Link +/A << /S /GoTo /D (a00129) >> +>> endobj +1058 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 131.4757 513.9963 140.3223] +/Subtype /Link +/A << /S /GoTo /D (section.8.23) >> +>> endobj +1059 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 117.2843 148.6259 128.1882] +/Subtype /Link +/A << /S /GoTo /D (a00130) >> +>> endobj +1060 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 119.3415 513.9963 128.1882] +/Subtype /Link +/A << /S /GoTo /D (section.8.24) >> +>> endobj +1061 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 105.1501 178.5039 116.0541] +/Subtype /Link +/A << /S /GoTo /D (a00131) >> +>> endobj +1062 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 95.2522 513.9963 104.0989] +/Subtype /Link +/A << /S /GoTo /D (section.8.25) >> +>> endobj +1012 0 obj << +/D [1010 0 R /XYZ 90 757.9346 null] +>> endobj +70 0 obj << +/D [1010 0 R /XYZ 90 739.9346 null] +>> endobj +74 0 obj << +/D [1010 0 R /XYZ 90 553.9527 null] +>> endobj +1009 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1091 0 obj << +/Length 1559 +/Filter /FlateDecode +>> +stream +xÚåZ]oÛ6}÷¯Ð£ Ì,¿%õ¥ÈÒµK‡Yç·®Y±…:’gËmòïGФB‰Œ¨®A×fÉô彇—çè’”QÅŠRÅ,)¡<Êof0Úˆæ×3¤¿^Šï—¶ÁϫٳW8RrÌ£Õuë#À0ÂÑjý~ŽùâÃêMDh gÒ‘l=]\.–˜Á9Pݼ*w…º»¨ÖÅ­ì4ûeÕEÖÀáHÆý{öþŒÖà›$MXôY|€¥)Žnfóa7ûcö{çG}Ñvð¤ $1#ÑÇjH–•c¦±È ˆñ}Jˆ•)@1Á‘±j3PîŸ ‰P +xLÓÈr§¾9l´É»^xm?ôªÃ/«¢Ül¯ê±9Ø:`â@ÎxÌ0Æ(!€؇ð'dð×"[1ï$Ÿ!n9@’ùu­×Y“]eGÝ\_«Ö]Y}\îê<Û©Ïf$ÇŸÄg +ç§c±V=®î”ÅÅå'®Zòz]¨¶¬Z«›¦ÖÆEËÕ%ICR.3 RÆtÆ”OAÐÖ§¸^ŸšÓA“öì&´v/îÄøÐb™ 2‹%ƒðǽÐ4}è»ih*ø 9ƒÄñ¤/Ÿ™lº-í~.ïr^PœQ0D@ð ÜÍLO”;ä‚öˆ‡ônÌlÁž—ˆQlž‹B–Çý®l@®mmÇŒLÄø•íΪou’IL"{¹î¬/œ×ª±Ñ×láü“üW—ÚU³-T‡u±Ëî +Ýz¶åëü7U‡0"Ö¯CÍöPŸ6Ûý©Qef­2Q*˺²kOã§"å//A<ÁIÙ}a ²û=\‚:«¶%Чw?‚ÇÒ},×·j5<¦{cÖ½åpšîÇ8~5UÙzH +FÑk£PXŠ@‚äÓÃ+õ¾ÚêuY·÷b~fîM–ô¯à(Jþu±c¶g&éft^ïJ7È«/‚ÇÒ K€Ø"¤!ݳ°n,‡Ót3ŽÀñkt³õé&‰‡<º‘F¡°‹z*ö<½°½-Z+½E“»ŸZ76S…¥äÄ ~:Zñd~’VFçÂñ®´B½Zñ"hMÕ +å', iŘ…µb9œ¦•qŽ_à¯ìo}KK dCÎÒR[…¢s +h*V”½èR2/‹|—ÚåØQQ¿=¸W‰«lŠüþàà¸/òRê*7‡ +UnuTšøýqß“ÃIÜMªã½å~ê__yGMõwűÞî»]ê¦Îë-„”òoEoOž&Ñ{4qŽwEoÿ2È‹à±èE½YðØÀ˜…ém9œFïqŽ_›Þ[½Y‚Ù†‡Þ­U(8‡:Ão ²üPk¾ªããv.ŸßUi=¶ÝÅQÇù}î`‘:¦ßíÇ“ÎI*ͯã]©{UàEðX Å„T`ÌÂ*°NSÁ8ǯFPï}'g Ž pD ­B±¢¤[Šà¼®$á7§ƒýßûèßm ÌVš?Õ]³'å“„2:Žw%âŠÁ#• &€PÎB§MYKÓª¼u•‚)àŒ[¦¥ûǯ9fÎëêÚ·‰HDÚú8œ­€¶ +Eç‰xH ‚K©œiu´g´·™\ „‘ûÄdﳕrð¹øjuø’> endobj +1093 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 726.8189 179.0619 737.7228] +/Subtype /Link +/A << /S /GoTo /D (a00132) >> +>> endobj +1094 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 716.8014 513.9963 725.7676] +/Subtype /Link +/A << /S /GoTo /D (section.8.26) >> +>> endobj +1095 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 690.9534 161.358 701.8573] +/Subtype /Link +/A << /S /GoTo /D (a00134) >> +>> endobj +1096 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 681.0555 513.9963 689.9021] +/Subtype /Link +/A << /S /GoTo /D (section.8.27) >> +>> endobj +1097 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 667.043 140.3173 677.947] +/Subtype /Link +/A << /S /GoTo /D (a00135) >> +>> endobj +1098 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 669.1003 513.9963 677.947] +/Subtype /Link +/A << /S /GoTo /D (section.8.28) >> +>> endobj +1099 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 655.0879 140.8753 665.9918] +/Subtype /Link +/A << /S /GoTo /D (a00136) >> +>> endobj +1100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 657.1451 513.9963 665.9918] +/Subtype /Link +/A << /S /GoTo /D (section.8.29) >> +>> endobj +1101 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 643.1327 163.0021 654.0366] +/Subtype /Link +/A << /S /GoTo /D (a00137) >> +>> endobj +1102 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 645.0704 513.9963 654.0366] +/Subtype /Link +/A << /S /GoTo /D (section.8.30) >> +>> endobj +1103 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 631.1775 158.0208 642.0815] +/Subtype /Link +/A << /S /GoTo /D (a00138) >> +>> endobj +1104 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 633.1152 513.9963 642.0815] +/Subtype /Link +/A << /S /GoTo /D (section.8.31) >> +>> endobj +1105 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 619.2223 158.5788 630.1263] +/Subtype /Link +/A << /S /GoTo /D (a00139) >> +>> endobj +1106 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 621.16 513.9963 630.1263] +/Subtype /Link +/A << /S /GoTo /D (section.8.32) >> +>> endobj +1107 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [118.6786 607.2672 153.6074 618.1711] +/Subtype /Link +/A << /S /GoTo /D (a00140) >> +>> endobj +1108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 609.2049 513.9963 618.1711] +/Subtype /Link +/A << /S /GoTo /D (section.8.33) >> +>> endobj +1109 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.6599 595.312 166.8776 606.2159] +/Subtype /Link +/A << /S /GoTo /D (a00141) >> +>> endobj +1110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [497.0598 597.2497 513.9963 606.2159] +/Subtype /Link +/A << /S /GoTo /D (section.8.34) >> +>> endobj +1092 0 obj << +/D [1090 0 R /XYZ 90 757.9346 null] +>> endobj +1089 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1122 0 obj << +/Length 1862 +/Filter /FlateDecode +>> +stream +xÚXK“Û6¾ûWhoT•Åà{o‰le«œ¸v§r‰s€HhĘ"¸$èÉüût£$%Ñò–ËC ÑèFè$vü»2Úåi–q’íªË›h÷ ä½¼œÈ¾ ‡TÄ»ÃzëOo¾ûI–;…Y&ÓÝÓ …gI¦E¼{ªÞUoõ°?È4 +²ýOÿ¦ I˜¹À ÈMä‰Û0ýü‘˜EÑàƒ©§VÓø½©¦‹î¬²éfi" á@’¥eq˜¤2sÒ²Pì"Š¢àã°E`¬±g7Òª",ÓÔ eXÊBz³ˆ÷Úª¦Õ5EÕÐô«ƒÄ;ؘ¡fƒ§*…óq ÍNëAæQ 4)+EsûÚk™-´ÍóÙ¾hüK £UÕçV,a̵›çÎ –Nfà-z/ÓàË^¤ÚW"^ö"Ð3ð´2ÝhÕÌ»Ç×Ñê‹Cí˜Á;Æ©:“ùj¤o­uïÃX_Žº®=@^Œ›vQw£wÚ¾ì®}f‚3ÂYof2‰7ñK‚~0hÕ—¶ %¼:­Z­@4rýå¨&wYŽÌÅÁ + Îê¡Y͉u±&Í¥o5z „Žä¼ i~ÒJu[PÙ¥§ÑöÒØó5ZH1“eÄ;úþgŸEÁúð¯ÿ½+Ù+-ØÙp@Å` Ý]±ö¶·èR×î–æÞAÕ9(|¯Tس²4º¹™Eë±5Õç¦{¦¸ås°ØŽ%™þ/ +!ÔËÂÁ€ßLJtq`Mœä ”¸bÏštR +3ƒÔ|VÕCâ’Qp CY(¢NzH“$x"9yÐOCoF/Ôo¿º¤4üµfË#fßâBåLÕâ\Ÿ¢(6hä ­»k:9˜–ˆ‹ÇÀ¤2(‘À±Âá­¦µ‹ªÎ0#-8‡êijYÐejmÖÃÁqtãÝ&ÜÞ½Ë.uƒqçÌÂÚ "Ÿ±©9ÞÑç4unØÎr™Š@Õ_ Åà™cŠà‘²¾gŽ&f=§¯Ç©uö ZQ +î6qŸwý-Å÷€°bºÝÈtå±»@Ä&v77L•M ¤TÛ’SŒ´â.,8;ò*”Û"ø¹#.o?ò|#¢ð” +1¤ÒäJƒ‡-ÉÌöÈ»1ÝÅ™ލ6ƒª›ÀŠW¦x,Ö(PìÏO³¦ƒ"ª Dî]!̸p ’鼇ËZ¤ã&š‹X 1Þx ô²c#!­9t¦\ä$PлšHN7R¨Ø$œwÂõ HêDíyõ*Q"/HváW‚ó;ŸâE}FÃSÁŽÆù¬VŽáwg•>M$ÅâN,ÎÕõKóU¾9}ŠÒþ‹»¨önÝù*v†éš»5¦7KEs n = tâF>¦KºYÞ…®\Ç4ð˜R•r}M)Wå©äXuD«@QDXÉ%zmh¡3Ì8@¤6Ã|NGu¯Ê¥¥¤šnù†™ÌÒàâû­,¹é·`q‰*™yò}mÂÝÔ¦.î+hƒ—Ýåë¾å½T¥XŸâC bèžiÒ*×;˜I]ÌÔÙ‘5Ÿ6ÓÝ"E‘’oÓªcËd¶öƒ·&qBÆ—‚(º“V®äÝS ’2”ˆÛ +£ÓÅŠa+€@c\$‹Tý Âé>pñ×…4~¬qæú–^‘„e”e×zaè¹Çç—w¯«Þ²ò%¼žïù:ÛÝv±pcÍq ºŠÄÄ~æÆ}P ©'‡€ú* +†G€z¶oúHã +ÐÇzg@×zßï÷Þ¬‡ÁÐ3pó`Ïí6c÷³Ikºç?/ýÜ'ÝXfaœ_…oY~3}ººàjô°­4þ¶ª½w›ñB2þ‚ñý.´÷-ÎâÜ  gÎß\ØÑýcnÝHÜ#™‹P$ùÿ÷[çßü?‘endstream +endobj +1121 0 obj << +/Type /Page +/Contents 1122 0 R +/Resources 1120 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1063 0 R +>> endobj +1123 0 obj << +/D [1121 0 R /XYZ 90 757.9346 null] +>> endobj +78 0 obj << +/D [1121 0 R /XYZ 90 739.9346 null] +>> endobj +657 0 obj << +/D [1121 0 R /XYZ 90 553.9527 null] +>> endobj +82 0 obj << +/D [1121 0 R /XYZ 90 553.9527 null] +>> endobj +1124 0 obj << +/D [1121 0 R /XYZ 90 520.1647 null] +>> endobj +1120 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1127 0 obj << +/Length 2807 +/Filter /FlateDecode +>> +stream +xÚ¥ÙŽÛFò}¾B äöÉÃX,âc6o|¬­Eâ àPœÂ©TƳ_¿U]ÝTód`aŒÙì®®ª®»‹â+ÿø*e«XÇa*U´ÊwWlõÓ?]q»Àzà¼Ú\ýíŸ"]¥a‰hµ¹7"jÁÅj³ým-’ë@$,fëÃíGj¶æ!£Á»f{¨ +¿iòî¨û¬/›úú÷ÍÛ«›Í@ײ¥eÄ‘êŸW¿ýÎV[`ïí ešèÕ¼°§©Xí®”î¥ºú|õï-˜ K§Ãå@Ät–“ÇpØXO/½Ós…J&jå P_„ÐÓqëBË•‡nFnº@”«0eQ4"ú:«I°wVÀ‡®ØÒè©ìiÔ´Ç™æÐÓ‹Ûøáó’˜y¢õiñxçäãÀ. èEOBçé"òé~l›k®×•Û¢³ÂªšükY?X±\sGÙ/éþPU4Úª¾ úǶȶÃN'Ø®Ïò¯A[óG\„C‚…Y^ÐÔâ$"^n¾e»}åøÈöûªÌ/t/Ô©(Œ¸8­àŒ°‹j8Kñ¨† tFtß»¦}¦ƒçpà¾ÍÊÚk÷ÜõÅ®[’OÂ䌣zëç$`¡. à 9ïüg‰Ç÷ˆÞü…6‘/ضåµs¤w:þ¾mú&o*Ïœ–d¡Sª2=m>Ài `Åq–âQè:Œè¾)Š}eí¡ØÝÛíecБ ‘àÉó×ÏßB]>ýrÞáÏÎîý\Ô‹uћԴ_íDƒqêtÙð7Ì5Çkb÷æÛ÷·›/L3øãSfKB!ÓxÂÌ4á;¨ ,̱! ?€XX².Ð_¿§Í‹’Q: +É¿W0üSS¬V,¯n~º}J.š³P³Tž—Ëu…96’‹±Q%ÎÃTkªKÀ·%J)Ø–SîLjð7,Ôï̼ýùö—›“ÊÔ2LX’NøšjÓA]àFBR©ˆÇÜyƒt¼Lee|J\ +³d}·¸ø ÎñÎÄeíDÆ£o(›Ÿ?ݼ<é\ÆP×H¹RiFŒ/ (ð âÖyÆ„bá„'1œ âOÌ’EŠ(ð¡æwù$ “€+V!ë©-Qì…2«ºf´á~KÁÏÒ‡â%á +†:ƒâ†K½Äæ¸|³p˜½ÜyE2lŠ lÏõ„LB)€ÀY PxƒÚSIBq)5šé¤FÙª¼k3¼I‘¬K;ÙU‘™Ø‚o‡z[´4ÌîÕç7A×?W…ÑCi_úǬ·ÀUÕ`¬zêh×}c±Ü5Ø +ÀQÝÔAÞìvE›—˜šÍ6pS4}6MáG0ê,d„h qלÏÜ€kW·ş‡²-Pà4QZ}æÖ×Ûr²úà_†Œ™ë¹G¶@´*‰”a+ +y( te^^#_p_o;»ÓW +3´b©§%¦*™£J·Ý»òÔ–}—4|¹{¦çËm¶#Ø7‡ú+‚•¥Ï¹¢%ŠÑ¿ÏB0TõIaI IP‚¤å¯+7ú—ŽÝŽÀßBæùáx†Ù„càûG¨û»LgÊ‹ 6ñ”—i:pPsú£“ϱ!ý,èô̵L¬ˆ¨e…2îû}Óöôrß6Và*Ï\Z°¡#ÐòÈz?ç»rÛ/¨jؘéè”V¸”¡ÒJd +¸u]Ôʰ#ð·Ìµ2ÇŒ 4UØå?>wáv¦Á4¶±¦¼Lƒ”ƒšÓÛã Û)­@ U7Ø1÷L2àB`{˜;çÔƒsJëœÛkž¬É×pdüí´—&éB<—Ìff@ª•{ 5{pª*û§ÿÇòPHj¡TEgqŒÚ€ÉLtö:ƒcƒß Öë-UšÀªÏ` +ÕLÜÛíõR$õ +È¥þ\©ãaJÛÄë@ÂJo"m­‰S2üG*¤ìÕŸp‰Ç²5Š,DjÚHXTk±ÏþÐî›®˜lgQ3ñé7ô,±m,ÎF|:¤x¡Œ!Äú ””hÝPƒ'ʳ5Í.x9žv:ê­ ¤H—n‰¼ á.Ã>«é¢Â&ÓIYÛ¬Åõq³“ãcÓ„Ьý¬O<¾ÅÎÇeݬ-“èñÚõë÷…8Œ„¢ v‹J—g¢RM¢°èz`Üôd1¤%LN¸gëh0ç5Ð`Ån¶;¯w +Xž÷²‘›Ì²ò˜¡%‘¥Y‚Kjï´ Ù33îýPÐëp*Om6$[2€å1c¸wÌòÏÁá3srÜà¬ƶÞèè­ì;GíÍ@ñ¡ "1T"ˆèy_æP.=/Ù+M|îs ÒÏÅvZ Ù¶-}.Èž‡ï14ðÅ„߬í{W( ¶dÉÊ*»sßάd#½^4+*p’h—Ÿؾ%,P?ØE©`iR%ãC0M Z ÂÖ=`M…«™4±t!îd@jñxÁnØ:áËö5º3JB9o‚´Æ"iêÄÙÍÀÁ`øb”šŠd´þ”ˆ[ìü`9Ä€Pæa¦=X}í Ñ.Ûnš«.ü\±`[ÇoDõ8™<·`O4Â"S(æpã5 žÊzˆe1(ÛmuÏ‘®›ƒ[­é9x%ŒÇ±F1?\(È #ËLFâeAGtÁàÚ¤MxôàoNcðºCÓиÁ©|oÀYôûDTFܹà ·ç f +î„id6ˆÐÜPptŒˆ÷8?´’ðåî¹/º¥³Æ·ðÛ¸2ªxñ*Äà^Á#ý_¿1ØÂ¥ðfQ˜ÆpS5×kب"1°‚"þ©¨ñCšû†ÙÔîÇ/vð%|°/\Ø'{!ä a(#‹lýˆ’p_翨¹{v¿¦ùöüPÔó¯?rIJÿ¢Ô§endstream +endobj +1126 0 obj << +/Type /Page +/Contents 1127 0 R +/Resources 1125 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1063 0 R +/Annots [ 1129 0 R 1130 0 R 1131 0 R 1132 0 R 1133 0 R 1134 0 R 1135 0 R 1136 0 R 1139 0 R 1140 0 R ] +>> endobj +1129 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.0856 532.3134 409.2359 543.2173] +/Subtype /Link +/A << /S /GoTo /D (a00142_ge6bae7dc0225468c8a5ac269df549892) >> +>> endobj +1130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [455.8347 532.3134 511.5056 543.2173] +/Subtype /Link +/A << /S /GoTo /D (a00142_g2ffbb9e554e08a343ae2f9de4bedfdfc) >> +>> endobj +1131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.2535 520.3582 263.1547 531.2622] +/Subtype /Link +/A << /S /GoTo /D (a00142_g99e43010ec61327164466aa2d902de45) >> +>> endobj +1132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [302.7829 520.3582 348.4913 531.2622] +/Subtype /Link +/A << /S /GoTo /D (a00142_g7b04a0035bef29d905496c23bae066d2) >> +>> endobj +1133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.6923 508.4031 354.8052 519.307] +/Subtype /Link +/A << /S /GoTo /D (a00142_gad14bbbf092b90aa0a5a4f9169504a8d) >> +>> endobj +1134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [462.2904 508.4031 513.9963 519.307] +/Subtype /Link +/A << /S /GoTo /D (a00142_g2f8f70c30b9ee08a103fbd69a4365c4c) >> +>> endobj +1135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 496.8215 138.0296 507.3518] +/Subtype /Link +/A << /S /GoTo /D (a00142_g2f8f70c30b9ee08a103fbd69a4365c4c) >> +>> endobj +1136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 461.075 239.3186 481.9864] +/Subtype /Link +/A << /S /GoTo /D (a00142) >> +>> endobj +1139 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [326.8799 360.3806 400.6034 371.2846] +/Subtype/Link/A<> +>> endobj +1140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [132.4581 350.1928 206.1817 359.3294] +/Subtype/Link/A<> +>> endobj +1128 0 obj << +/D [1126 0 R /XYZ 90 757.9346 null] +>> endobj +1137 0 obj << +/D [1126 0 R /XYZ 341.7132 422.4291 null] +>> endobj +1138 0 obj << +/D [1126 0 R /XYZ 90 405.4028 null] +>> endobj +1141 0 obj << +/D [1126 0 R /XYZ 215.4248 351.5786 null] +>> endobj +1142 0 obj << +/D [1126 0 R /XYZ 90 336.3195 null] +>> endobj +1125 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1151 0 obj << +/Length 2493 +/Filter /FlateDecode +>> +stream +xڥ˒Ü6î>_Ñ{Zu•[+’zÎÍ™$®¸’-o2U{ˆsÐHìi•ÕRG¢<™|ý¨WkÚ‡-×X$ ˆÙbÀ?±Ë‚]%~¦ÂxWœï‚Ý3€?Ü F˜|÷x÷¯e¶Ëü,–ñîñh9Ĥ»Çòw/öÅþ £ÀûÔíE굦5';ÒyÙïÿxü¸ …ò•„ È ¡w?<ŽRY©HÅeþy÷ûÁ®å>Þ¾ÊÒh÷“ÀY&wç»P*7©ï~»ûÏȇvÁÖÞ"¡¶6§V›“0MhoæTõûƒ +R/¿\º6/N4sPsÊ žê¶øR5Ï8ËF¼Þ‹ÈûëRWEeî÷‡PưDø=wùù¬;šiÚ½Œ¼—ÅÒ¼0õ+^N•šÂTmÓ“´•3ÕÐúp BøYÑ–˜ ØŒ N­f8h4*ò@åd÷þÈ0ñc†–á§ŽŽÜ÷A†‰—wš}u®ê¼£‰iۿ¦MW4/ÚCצj4ð·ûy<ñús^54*«#êtÔn +ÆVVœ;„+ ½嬑¾ä]nôÒ2Ân¤79OªØ;¶¨´‚ýÛ#GÐÄûð<@™¼'ìeiXIF”e[ëžvñîqn{C´“¬‹SÞTý™pÖlk çjå©DxŸ^Í©mp,½gÝhØnÛ¡ð8 Qx¯ 7.Èë¾%©ºhK¼ÃtCazØuHïi/o0´ò”㌅™b~\L{ºKÛk«G´tšÝÀn‘ëתÄTá"À`zŠÃøªé˜Æ¨E˜y4snþŽTÏ q£±`<‹–Ït ‚óP›êRóŒÄW†f—¶jL¿åVÇ®=Såôå,£Ð—͵£!ŽÈK)?V2t¹Ö÷÷s[ä5±€î]•?Ÿ­“kùH“]”Æ>ü…›©ÑæT×¹?Íü2ù.ÊR? +El•úwkôýZª¤Ÿ()n‹©6äÎÓ²?*š¸¡àït‘Ö³h)[ú6-žQzýÒ]EÉû8œ¹ò¢k{æ™§™3⊼®1<”ðj:„~Å…VwzRiÓë!:;R°Ja³ º§HXW‘ÎwJ—œ±ÀA„Ûâ Î:·BŒu +FNAÀ¯lj‡ÚqÕDvºTæD£ÁØäµáíå=pÊ} з¡oÙOæsÁÁÂ=MÔsç^¨I¼(ÖgA53Ê?¶ K–õ «xŠ8ž~+NºjÔTÅ@m€/un[@ÙHÏçò‰»*¼ã&ßµ`H[¶Ö/ˆ’h/û+±Áù+M0„‰ +4! ¦ŒGCe«úào%û÷ØûŒkp¸4®…ä<°õ¾½64¨,"¡n à]TŸƒ@4Ÿ2Î09»‹:fE%1ŒùlìOa›ú«C”eÞû£±7.Àäsõ72ÅÊS€ôdûý’¹Ö ²ÛAݨäâ|j8Ûè 9{£z]iïT!ç{¢ƒsÐ <ñjÞ’ä--p³ä `ºýÄÚö¢„³Íî„ÞØä¬Ò®ö ÛXr⃮.€”à~ÞæÀ«È,˜m9É.׬3È—õ^NÏíq®Ìk¿ñ| „~¤Ä›os‚­þRúa¤ÔÄ7&üë®ÖÈHÝ–7R}Kªý,ˆã¥TW•(ŸÛáêvåªÖåܰÐ-y3 Ý–:Zh.uÃB-M™wìQ£7N—WëI݆adùaœ†ofNpÃ0#ª¨Þ6ÌMy“a¾!Õf!uÃ0E{¾T£sð½FCÿ ¶ñ¹š1+DAH—ºG—>ÑÓºÞ¦ìÈ… aì¤í¾ôœß_‰†oY|U‡,Û”„ <7ÂÇ õªÐ}ßv¼Ÿ½«;} }aùǶ¾½¯¹l§;È,©–N‡…/ ×ç 8¸iMH0˱± ß_ßÿB8ŒäíwÚ)õ}ûýòÇjãjlÃ7}³Oè­úû¡‚ÈD(泔ћõ÷†¬©úÞ”èjï\"TÉZ_ÉT/ “/d¾y÷©oK_ñ´§`üÓ•ì0òU$Å­ýFLÄ—A°Ù’Àá@çÅÿ×söSX"”œ¿,Ç~–¨Ôýð&|&Ô~| 7rwEp÷‘_Üà#ÆúÀ!ùÜKu/šÁ†b~aÇ ëžÛ‡Ÿ>1µ,Ÿ¾oÿz}ÖÍÚø«¡SmfŸÿQJêendstream +endobj +1150 0 obj << +/Type /Page +/Contents 1151 0 R +/Resources 1149 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1063 0 R +/Annots [ 1159 0 R 1164 0 R ] +>> endobj +1159 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.6531 419.6496 314.5786 430.5536] +/Subtype /Link +/A << /S /GoTo /D (a00155) >> +>> endobj +1164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 93.195 146.3484 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00128) >> +>> endobj +1152 0 obj << +/D [1150 0 R /XYZ 90 757.9346 null] +>> endobj +1153 0 obj << +/D [1150 0 R /XYZ 194.5769 652.5717 null] +>> endobj +1154 0 obj << +/D [1150 0 R /XYZ 90 636.3994 null] +>> endobj +1155 0 obj << +/D [1150 0 R /XYZ 90 553.639 null] +>> endobj +1156 0 obj << +/D [1150 0 R /XYZ 90 546.5037 null] +>> endobj +1157 0 obj << +/D [1150 0 R /XYZ 275.1139 480.7842 null] +>> endobj +1158 0 obj << +/D [1150 0 R /XYZ 90 464.6119 null] +>> endobj +1160 0 obj << +/D [1150 0 R /XYZ 90 346.02 null] +>> endobj +1161 0 obj << +/D [1150 0 R /XYZ 90 327.3277 null] +>> endobj +1162 0 obj << +/D [1150 0 R /XYZ 90 308.6354 null] +>> endobj +1163 0 obj << +/D [1150 0 R /XYZ 90 111.5284 null] +>> endobj +1149 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1168 0 obj << +/Length 1828 +/Filter /FlateDecode +>> +stream +xÚ­ZMo7½ëWèE–ßËÍ-©ÝÄAb¤±Š’ P$Å*K®¼‚“þúÎ~â.Eã>x¥}š7Î<¹ËÆþظ¤ãB¤R·#:¾†¯_ŒXwû ÜâžÏF¿ýÁËqIJÍõxöµ± Qœññlùa"èô 7´ “ÃÅ[¸TtÂm/Þ얇ͪ½>Û-·«m5¯Ö»íôÓìÕè|æx;·”Ьfýgôá/Á½W#JDiÔø>PÂÊ’oG’ ûa3ºýéì´7šœ¤ŠaÆOxÑŽÇ`F Â4‡xp}Á]8ø¹–u8ܤEiÆUÇäí~*ÕdWíª›ýT“Õ|yßFa}{·Y¹0a,gÁÀ*,ÓAm'Œ1R*Å»ÓFÂGªïÚY¹?1Zs"¹dÑÔð-“ðRƒQM¤0òh§¦ûȹ +Ç ¿âJ$ÁeÃ`>Û{õ7ûëîÖ;? €TkÔ;‹ëy÷z·˜oÚ¹Yì¶Õz{hf&ˆ+)Št„Œ&šBv‘¡JåMž–ÑÌh$½,étóÕ×Ýþ¶½ªnºâû2¿_ïRq½½n¿¹;‘¶ÑÕF«Ê"s”:’¢”´³r6¯æ­OWÕþ°¨û)3““9« …Ñ"š³> ‘³†æl’Ñ¡0^›=Þûf´³(AA·úÌñаẋÀníÃ]ȹÇ,‘[Ô Öád+© ¥¦ì‹íºZÏ7ëcKƒâ‚HÃSìRSlaø§½)Nóº)öyY®>RÊ·«0Êš + OŸe‹ÇÜì6KÔìóÅåÅ,pÂÂeY"°(Œ:°ÖDž*òj¢t¡²oñ¨C»‘/%à.2n‹ÂXkݸYLM5Dšç©©N¬Ö«²nI˜G5?*ù²,HÁ +‘ç¤>­R X¤i%µØÌ÷­´n—íEW0ëˆ:HÉãFDÕÁ$ÔÁÁPuH2ÕáµêÐãÅÕ¡Ož¡ˆÝNf/ß?;ºÁ)´AB°t  +!­Y}ØÎoWŸçͪ}Ÿ*É5œ›ÌœôЉÂq°cbN™šxɹûúø*bŠ-Ê´ÇÃŒnÅs»îšÖ[žÙGs©ÄN’º¼öH3ÒÚgÎÉê¤C«]N??qqyº³§2=x Bˆ‡¶¢ëˆ#5E™;n ÇèVO/vœÊzl’#v 4e` [é„eAæîŽ|t¢`Ì+غ Û ûj¾¯r ¸Û%mï×ˡ߻­Ôa»8JB¸Ÿrø‘Q@î­Š<€Î²Xcì`¨@ø +ðZ‰èñâÑ'Ï ÄÀn'ç—g§úb©†À¢0æÀZ¼/†™æJfÝâQ†vã}±)46ñ…±ÖPµ%ü7™-§N©……¥ÕbeÐÿ±ØÃîšpZÊLÿ=ôé–Y€ÜBÞ¶ÉóÍnñ÷”§£óuu¢Cæ† ½VT&|@B& •‰$ãQ&^+=^\&úä2¸Øídâý”q:yv1ûü×åìâu°ÊÂÞRjÒÁp(Ä‹ÐZL2xݼ֛ÏÌ88<êÁÐn¤»’P]2dÜ…±ÖjÖ_Ýáç²Ù¦$„k ‹¤,óJÐG'$ÄÁlN!þl\›rl®Ðl>w]Cw,[í«zU®1êç´\B2Im ¯wÏ`ªÞÓ¼®Þ}ÞŒzï‘çÔ{ÚÀnPïï_^¼>ëNkj:…xZ‹×»!Á$ª½A£ì}›±Jׄ›Z“’#¶(Œ3°6¨ôd‘ƒÃZçÌ"÷Щ"·°¼"¸YÛ‡.r¨`^˜Ì‡*>út»ÐÀ²îðåzµoT7k÷é®ù¦ëfê‡,õ³Ê°‡`šmÊø¼HhŠƒ¡š’dªÜÓÚa¿ZÕjóm]ÅE¡Îi²$¡nU)=9;t\µ´Û–G¿ÕÕ芟0Áý^G×gH¦¢à´>©_œ‚ÿ]Çöbµ…†§²‡#¶{c/^Õ=tïþÓ§\<åÝ l0,ÝõN9„»{u&|ÓíËwû–Û·ï׫à1¥‚5׺æEé?¡)pendstream +endobj +1167 0 obj << +/Type /Page +/Contents 1168 0 R +/Resources 1166 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1063 0 R +/Annots [ 1174 0 R 1176 0 R 1178 0 R 1179 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R ] +>> endobj +1174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 661.3282 194.7663 670.1749] +/Subtype /Link +/A << /S /GoTo /D (a00155) >> +>> endobj +1176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 576.9176 148.2809 586.6957] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 520.3286 184.2462 531.2325] +/Subtype /Link +/A << /S /GoTo /D (a00142_ge6bae7dc0225468c8a5ac269df549892) >> +>> endobj +1179 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.5712 520.3286 195.3146 531.2325] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1181 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 437.9752 204.7293 448.8791] +/Subtype /Link +/A << /S /GoTo /D (a00142_g3d4c8bd4aada659eb34f5d2ffd3e7901) >> +>> endobj +1182 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 399.3979 194.7667 410.3018] +/Subtype /Link +/A << /S /GoTo /D (a00142_g2ffbb9e554e08a343ae2f9de4bedfdfc) >> +>> endobj +1183 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.0917 399.3979 205.835 410.3018] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1184 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 360.8206 184.8042 371.7245] +/Subtype /Link +/A << /S /GoTo /D (a00142_g7b04a0035bef29d905496c23bae066d2) >> +>> endobj +1185 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [186.1292 360.8206 195.8725 371.7245] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 278.4673 223.997 289.3712] +/Subtype /Link +/A << /S /GoTo /D (a00142_g99e43010ec61327164466aa2d902de45) >> +>> endobj +1188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.322 278.4673 235.0654 289.3712] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 239.89 226.2087 250.7939] +/Subtype /Link +/A << /S /GoTo /D (a00142_gad14bbbf092b90aa0a5a4f9169504a8d) >> +>> endobj +1190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.5337 239.89 237.2771 250.7939] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1192 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 157.5366 234.5175 168.4405] +/Subtype /Link +/A << /S /GoTo /D (a00142_g2f8f70c30b9ee08a103fbd69a4365c4c) >> +>> endobj +1193 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.8425 157.5366 245.5859 168.4405] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 118.9593 197.387 129.8632] +/Subtype /Link +/A << /S /GoTo /D (a00142_g9e97a0b4d5cc7764d8e19758f5da53ae) >> +>> endobj +1195 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.712 118.9593 208.4553 129.8632] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1169 0 obj << +/D [1167 0 R /XYZ 90 757.9346 null] +>> endobj +1173 0 obj << +/D [1167 0 R /XYZ 90 678.0824 null] +>> endobj +1175 0 obj << +/D [1167 0 R /XYZ 90 595.729 null] +>> endobj +1177 0 obj << +/D [1167 0 R /XYZ 90 539.14 null] +>> endobj +1180 0 obj << +/D [1167 0 R /XYZ 90 456.7866 null] +>> endobj +1186 0 obj << +/D [1167 0 R /XYZ 90 297.2787 null] +>> endobj +1191 0 obj << +/D [1167 0 R /XYZ 90 174.0645 null] +>> endobj +1166 0 obj << +/Font << /F29 499 0 R /F50 1172 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1200 0 obj << +/Length 2058 +/Filter /FlateDecode +>> +stream +xÚ­Zk¯Û6ýî_a`¿ØÀšË·È|Ks½Ù¤A6qÑm(¶ëÇ]?šôßw(‘4%J¤ú@€\Ù:š3Ãá)“)†dªñ´ÒŒËéú0ÁÓÏðõË ±·p¾YMþõoª§iIåtõ©¶ ”ÐéjóÓL"2_PgoÏs¢f§ë麭¯ªrs™ÿ²z5å„!Ì + æFÌ·“åʳZ§“ÄpþòÓ/xºç^M0bZ‰éø€ÑšNN™û°Ÿ¼Ÿü×ÛinÔôÅ&뎤… .: +ÁMp˯»ëîø¹ °¶æÊç”V„SªÆMÅЊ‡Þ¯çDÌ¶Õæ¶¯º“r´b„àƒFº û#ˆB\B×n<üѰïªýÆËæS£—ß×)ÍÙ ˆB@BD–Q’ñ.¢ ¯Q‹7/¢6ùe܈ìZýø¸|ý/4 ÁNMf†À¡rÜ‘µÁVKØÏáñÑ;|Öƒ®Ýžê=UX§ãö¨ kl-·Àrè7åãÄ€%á=¼Ö££©‡Î‚»¾›²q¼þñzÂ¥BL +ò·tÌÊM¡Š¬¢,¯èÀ`JÑi^¯èw„¢[äcv#²*úÃwoV¯£ùMÌ +Ø&£2ÄÖ÷ºŒ ¦4;Ÿó ²; kèôÇ$·CeY»Ö ë?­zNÇMRâð0l–GJüNIÜ¢ÆK¼GÑÍÛñºÛ·gÏîº;›§5”‡9Á³Ëp €iA…"#C Ðý-ÓIiã{°*»ôtL€¨cÕ)Æ Õi^ŸêwDª[äcRv#²¶,{ºA¨/Z™1p¨ 9ÅwƾïtŸq¨l¸áî§RlQù 'è‚'I}~Òé ™Çd7éCתË훇¾Ôš3 EÒÁ;P†&€€å°ELûò +%Ÿ™ú>˜ØÊ¬ƒåS›b r›æõÉ yGd·E>&½i7"»aߧؼ‘àšéA𨠻)ÑZ±Îà3CÚ]º„X,T$´äîÍ*æ0êûÕ¼é-NëÛveÝn8‹wn˜”#iO`j;æ-bm鞆æ­âêÃ7Ë—oz›QØvp&Ù”Â^…Ð"ûâÅááñ+ÎØî@3J)Jx´Í5á•c¬…›ÌNö`Çå­š‘„½iÓT­÷å¹ê4‰Á˓ӧÎMÓ:ú¶qw¼ì6Ýç_Øôv\ßûÇÝái_™$û#¡ )õVëÞÒävŠ’òf⬶» Êõùd.ÉÌ}u»T›æêzjþn|PkHà[ÿúµþôtÚÕ›\¸¬Cdiï„Î,æ³G ¼lO·½åúhÍ?í˵ã/-®MÙà’àžœ…Öi‚µ#¦!Âú/ž}ÙîÖÛæ«æqÝMÜ9ߎИþΞï÷ èEs ܸÖ#i¾.?žÌùá¯æ¿ên·3Y¨À\׳[“ìÎÍãáq‰íÚ*æeÛ·‰b°Ä0ÅhÇ›Žt<*ãÇ †B±¶0Þð@Ï{ú_yÏ×Ðv¸*3t_ëñ[ß®U}h ìÄZµùlªUUÖÉ3ó}w¨†g¾UÉÅJpÝïÆç-J L`­%ŠQ¼w h¢â¢ ÙÆ l±‚ÙÆßlòÊsy¨®Õùò,^Z)*%½ô,±{ó=\Ú TðÀÃ^„¸ä,¾GõÄßZQ)Fœ Ùf}nscJDu¶;å2Ûåëù´wô|[_oçj8}P†U1ð«š{úT"}L"Eua_¤•¦Ò¦— †FGóË›LËâÒÕã!ëM«ƒ7ÛõÓ­#™2IH;¸ð¨udÍP7ëË‚;ÐË*Exœy”vÜï\{3«½0šGÜ[˜§+Ú¢¾Ÿ÷Dxщò/ýŽ©n<‹|8S$ÒSîgJÖ éËêXËke§® ÷[wñÊ”¶›ý@¨ý‹ŸQöŒâæÅXÚe~NÅìdur{|kÑÈ?þæz¼¯¿}®ŽÝá1?²êŸßÏNOendstream +endobj +1199 0 obj << +/Type /Page +/Contents 1200 0 R +/Resources 1198 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1231 0 R +/Annots [ 1203 0 R 1204 0 R 1205 0 R 1206 0 R 1208 0 R 1210 0 R 1211 0 R 1212 0 R 1213 0 R 1216 0 R 1218 0 R 1220 0 R 1222 0 R 1225 0 R 1226 0 R 1230 0 R ] +>> endobj +1203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 703.2457 207.0905 714.1497] +/Subtype /Link +/A << /S /GoTo /D (a00142_gcd3ac045f0a4ae63412e3b3d8780e8ab) >> +>> endobj +1204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.4154 703.2457 218.1588 714.1497] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 663.1387 187.0159 674.0427] +/Subtype /Link +/A << /S /GoTo /D (a00142_g905451249dca72ce0385bf2a9ff178ee) >> +>> endobj +1206 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.3408 663.1387 198.0842 674.0427] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1208 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 577.8136 216.3557 588.3439] +/Subtype /Link +/A << /S /GoTo /D (a00142_gfa82b860a64b67d25ab3abc21811896f) >> +>> endobj +1210 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 491.7412 194.2089 502.6451] +/Subtype /Link +/A << /S /GoTo /D (a00142_g155cba6121323726d02c00284428fed6) >> +>> endobj +1211 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.5338 491.7412 205.2772 502.6451] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1212 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 451.6342 229.068 462.5382] +/Subtype /Link +/A << /S /GoTo /D (a00142_ge3c821e3a388615528efda9d23c7d115) >> +>> endobj +1213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.393 451.6342 240.1363 462.5382] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 366.9117 206.8414 376.8394] +/Subtype /Link +/A << /S /GoTo /D (a00142_g7b5319b5b65761a845fcd1500fde4cdc) >> +>> endobj +1218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 353.3339 200.296 363.2616] +/Subtype /Link +/A << /S /GoTo /D (a00142_gcfae9053e5c107a1aed6b228c917d2ea) >> +>> endobj +1220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 339.7562 198.0843 349.6838] +/Subtype /Link +/A << /S /GoTo /D (a00142_g9ff1e8936a8a26bff54c05f8a989b93b) >> +>> endobj +1222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 326.1784 207.489 336.1061] +/Subtype /Link +/A << /S /GoTo /D (a00142_ge469332907e0617d72d5e2dd4297119d) >> +>> endobj +1225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.44 265.1092 223.2892 275.9883] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.7086 210.7642 400.3795 221.6682] +/Subtype /Link +/A << /S /GoTo /D (a00142_g2ffbb9e554e08a343ae2f9de4bedfdfc) >> +>> endobj +1230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 121.7215 139.4144 144.6902] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1201 0 obj << +/D [1199 0 R /XYZ 90 757.9346 null] +>> endobj +1202 0 obj << +/D [1199 0 R /XYZ 90 720.5385 null] +>> endobj +1207 0 obj << +/D [1199 0 R /XYZ 90 594.7328 null] +>> endobj +1209 0 obj << +/D [1199 0 R /XYZ 90 509.034 null] +>> endobj +1214 0 obj << +/D [1199 0 R /XYZ 90 385.5117 null] +>> endobj +1215 0 obj << +/D [1199 0 R /XYZ 90 385.5117 null] +>> endobj +1217 0 obj << +/D [1199 0 R /XYZ 90 370.8968 null] +>> endobj +1219 0 obj << +/D [1199 0 R /XYZ 90 357.319 null] +>> endobj +1221 0 obj << +/D [1199 0 R /XYZ 90 343.7412 null] +>> endobj +1223 0 obj << +/D [1199 0 R /XYZ 90 311.1951 null] +>> endobj +1144 0 obj << +/D [1199 0 R /XYZ 90 285.6088 null] +>> endobj +1224 0 obj << +/D [1199 0 R /XYZ 90 285.6088 null] +>> endobj +1146 0 obj << +/D [1199 0 R /XYZ 221.1768 96.348 null] +>> endobj +1198 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1240 0 obj << +/Length 1617 +/Filter /FlateDecode +>> +stream +xÚ½YmoÛ6þî_!`_l`âøª—~k‘¬pYb`Ú¢Pd&6&KžL#MýŽ"¥PïîZ "Š<ÞÉãóÜÉÄÃðG¼{¡QÌxेö¡ûí‚ØaÆ}WàÍfñÛï4öb4ð6•†€ A õ6ÛKFW>pˆ—çõ 4^„Mã}±=gÒ´¯Šô|¹JÔ¾ÈWŸ7ïכƮuK°€h«ÿ,>~ÆÞÜ{·ÀˆÅ‘ðžà#ÇÔ;,8eõK¶¸[üÑè1Õ„¡Õ Â.Y…×Ь.@…–H0ÆË_¶òÆ4·KºÙ|¹þpõ Ü]Å1‘FWå)­È­ãW#î;ò}ßzZµ‡GÕ3N¢„Gmã­h„fLvui“°b¢‚,sd}Bk”#AhTI_É4KJ»ejg2ßšFñ`ž‰yËBjWÊd‹´ ðÖ'! +(g•¶ÍnÉ€/IZº)–u×ù$·¦õP”fh[Yßç¦_íeZ‰wì™~pì„V>l¹¶¢‡óIé$[¼|Òÿ’gkô^¶‹¥*%,´4ýO{µk™<$*Ýiú— ŠÂ8œ‰}K]Qsn¬Æ€Þ6Õ7×o×t°ÖÇçÚ&œ¡ ŒXǃNÐ4R3Ö ‡{ÄmªóB]Ñ@˜D¡°̆Q©ò]©~°F1˜.‘ ¿›ê°Êä •,O¯z ‡;2Jèo@-Ý÷DPwpˆBÂÄ‹Öá«Jˆ@<€Ðž\~#5°þÖ¶SŒ8AÛêk{±Š}®ª˜Ô×°è\Çö5€Ž´ÈUYdæå¤ÊsªÎ¥=>ƒ‚OŸž#4qx€81Ž Ò\MÇLNÛ„aŽâˆphN_¦æ¬úþ±¡#­¥´Û]zLQÚóöŸ“hÒ;¿š±ÛÕ¥íhôy­Ây3Ê,ÞVµ¯xÖ@«2Ïl_3¡a}õ”š© +íÅw÷„tƒ£¤¡ClœÿZo†¹Q  ‚…XY„ãYn´â¾#?Ä­cÜÌÄuܸÆ{Üh…fLvuMsc­Ópchã{¯Æob‡¹C€Lˆšu3M€}lw¥‰ Þ¾ÓÕˆ•–+"–`h. b¹~˜›hÏê?=ÿ)—vôþÙ<“¼0¬§_¿BOD*õõzàŠ aóÈ r5‚BOûÌBнL‹ƒÝ¢s~ŸéßÚ)i“:H“üÀöùY¶¯<ç£ƵD’is¥ÆQŒ‹Rd{#/¥ !&(¨çÉ05b34¹ü +ꯂZV:Y;ß }”? úø(ô­?ŒAE1‘Ç œ8¥ä‚º ’÷Ý Ã…A[ïxe†Tt씕Ԝ՞¶¹âÀhup­+Éößä…UïL;Ïó\»F2y +›ÏW¨bžÛ"o¢p_t"ô¤’R™ +Âé5 ªÿÉô¬ä Šá Ê‚ :“4¹RãxÃ`wpŒÅwáÍxÓódo±¼™\þ Þô×?ˆ7-«ÿKÊKƒLNŸ+5~|4ŒPÌm +q'ëËŠñÓ›²ÿÝ©oßÍÁÜ·³5åÝÍ*¦°Ý1^þ9^[\Cç´Ç¾Þ˜AšÇÀV8SR#Šã¹]åÊP]XJ¸J|C{oh-vI51å SN̘îi/(øÅ¬á Hµû-çV>HHþÒ:‰Ó‰¤~î”:n¿$ÇcšdYUÓ²¥åÛë»Õ×·+Ž—Ã MG#Á<"4°`6Çе¼ïNàÊžÞ†f€€vÌw Ú +ÍÙìꚤgnuºì|++îûo +!M…B¨Íäu§ÉÝ«Î*k×}UýbúL}ªçëêÞvI£Êê-kuç^Lo›œ«¸Õã‰êØ8fIjíêÈ­›2Å=C…€#Gˆa6÷9·‘÷Ý ý«Ø×kaÕ··7zœ‚iú;žŽ³‡^ 3‘¢–ñ_„†˜5†0Ï +iÓú>¢¡o÷€³|³1¨$~è³~õÁ3‚)„µ¾S„,ÒÞ2ÈhãŠv÷­Ìe™¨^jôz_7Þé9çõ'ûį({E-žQŒm¹ð°‚R¹N û?uÔØuU|}~”½8ô/»ô/^Þ×vendstream +endobj +1239 0 obj << +/Type /Page +/Contents 1240 0 R +/Resources 1238 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1231 0 R +/Annots [ 1243 0 R 1244 0 R 1245 0 R 1247 0 R 1249 0 R 1250 0 R 1251 0 R 1253 0 R 1254 0 R 1255 0 R ] +>> endobj +1243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.3618 726.9533 212.211 737.8324] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 673.1002 144.6746 683.6305] +/Subtype /Link +/A << /S /GoTo /D (a00142_g2ffbb9e554e08a343ae2f9de4bedfdfc) >> +>> endobj +1245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 596.8009 139.4144 619.7697] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.6892 535.7904 215.5384 546.6695] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.9195 382.4035 212.7687 393.2826] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1250 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 264.2062 165.0084 286.8014] +/Subtype /Link +/A << /S /GoTo /D (a00142_g9e97a0b4d5cc7764d8e19758f5da53ae) >> +>> endobj +1251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 226.0566 139.4144 249.0253] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.089 147.4217 236.9382 158.3008] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [492.0786 105.1501 513.9963 116.0541] +/Subtype /Link +/A << /S /GoTo /D (a00142_g2ffbb9e554e08a343ae2f9de4bedfdfc) >> +>> endobj +1255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 93.5686 128.067 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00142_g2ffbb9e554e08a343ae2f9de4bedfdfc) >> +>> endobj +1241 0 obj << +/D [1239 0 R /XYZ 90 757.9346 null] +>> endobj +1242 0 obj << +/D [1239 0 R /XYZ 90 739.9346 null] +>> endobj +1233 0 obj << +/D [1239 0 R /XYZ 221.1768 571.8217 null] +>> endobj +1246 0 obj << +/D [1239 0 R /XYZ 90 554.2766 null] +>> endobj +1143 0 obj << +/D [1239 0 R /XYZ 221.1768 418.4348 null] +>> endobj +1248 0 obj << +/D [1239 0 R /XYZ 90 400.8896 null] +>> endobj +1232 0 obj << +/D [1239 0 R /XYZ 213.6651 183.453 null] +>> endobj +1252 0 obj << +/D [1239 0 R /XYZ 90 165.9078 null] +>> endobj +1238 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1258 0 obj << +/Length 1484 +/Filter /FlateDecode +>> +stream +xÚµXYÛ6~÷¯ЇÊ@Ìò¹oÛì6iÐÛÄE’ PdùlykÉ9úë;IY·ÖmŠV49šùæà7I€á‘ˆf\Éa†ƒ L¿˜·¼€õE]àÇå쇟¨4Ò’Ê`¹.5H‚%4X®Þ†‘ù‚ +>œæD…ÇâXlËQ¯òùûå«€†0‹8X0/0ffg÷Ëʪ%˜$Ææ_³·ïq°p¯f1­Dð~`D´¦ÁaÆ)ó?ö³7³ß+=v¡|¡Ï7NÁ/EX°`)¢y¯”A(A„Ú¥§‚ˆsæ¥ks‚ÃøÒ"=å7m? ¦(b”uÕ@H%ÝEà ‚#&.Z ”Ç¢cÄ%g½Ö/V½Tÿ¬n•bĹM«·¶» "`G÷ܦnõd‹ +ÄN$Ǭ8÷öG^œÎIq>¥¨í€ÏŒT`Z01ž¾ºÔpú¤¦ˆc7èï¿Ä‡Ç}:˜82jš›â2E^®™™ÓÆ-½n¤Õ¥«!ëKk%f ®¶Éc‚’@¦'j࢒š2ÝÑfL—ù€]äu0Œ$‡B1kwé;Œi¶+vÇ̦1.ìs¿Ë\Ú)Õvp\Û§yeïk¢@ÛÒ@+O¸Ü¬‘‘'!9‡(b~·²fއå‡7Ï_ÞßýñËý;,ðþ§’5UR¨”ú›d›®ÎGÜ)Që6¼DÀ0åv£/·»|¾Ž ×ç,±^3…¹ÕåÖb;ÙP¶ZÃë©]:¥P陕þ4§"Œ÷g·d¢d¦ /[·$Ck? +³c¶ø;=ÝìÚκ—ds¯™•]^ùC‚”þœÎY¶Ë6.?nãZµf´[OmámœÛA:'"ü²+ÒÕàþIhãÛ·&4¼{ÕˆC7º‚|IŸù!î%]ýÔë¥ Žu—x ô?2ê·—éúÝØ˜DBx`ªnoé“’Äûýå>·K •Y5dwH³¢Êüp~½ÆN w»feI:\ŽøÓI!"߈¢aRx˜GZa8üó7C í QbAGa-ô‡Wò‹ú Ý:íêíoÍ”rD¨ä-û­©¤¦¬v´«Ï\‘lwûÕ3ŸnP JèÞdƒ2c³Ë?g Î,5”Oœ¹Áçr“î\œ¡ö\Éú)ÏùïF:<ÄIIz0Ì=·dhWUxÌL“Hæ{Õ2CÈîd‚#¡ÔÄѵ.5ÌžLJ$8“W±g€úì éçÏJlâè:êþåèÚõ¿÷èÚ°ú¿]/áâ’-à´Jh,dVÈ@OLîÊjo›¥ +@F£f½LÛlëHh>sTÝê“ÖO +ßÏ…óA¢dDLŰ&6E/fx WÕ¤cì²Ý¸)KÏõÒ]•æF> Á8¼õG­Ú’·r΋æaɩ줱h"$}"ÁÁ'NÌu©aÒ'‘Fkvé÷Ù{$ý{¯3P\alòÁ¨VãQ¨¤zÂÐØ~ØNqÒ4^m?ƒ¢ubiîµF~‹ãõpÒáL­5èôu©‘¤Ã½†¥'ÞrŒ™¾ú–£‹°÷–£{Ê-Çhl.·¦;ÚjÇd“þ¶u‰5›MëÃ!ðòS8:z ŽüP<öD@Á‘MFSðRS–;Új÷<Ú븶¡@xBCißÿDLö¸ƒ1‘Bþ§«áòb[Á+„5.tÁïˆ)¯í@O_¤Y +MÇ“¶w÷W?xe> Îî¡ÞõÊn(öÕ·Öµ¹Úñ×*矜4r‚¿ÚçÝñË×MšµÃ#ë‹Ï?ú„íendstream +endobj +1257 0 obj << +/Type /Page +/Contents 1258 0 R +/Resources 1256 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1231 0 R +/Annots [ 1260 0 R 1263 0 R 1265 0 R 1266 0 R ] +>> endobj +1260 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 677.3005 139.4144 700.2692] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.2734 447.0773 225.1226 457.9564] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 123.8393 139.4144 146.8081] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1266 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.2799 123.8393 187.5634 146.8081] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +1259 0 obj << +/D [1257 0 R /XYZ 90 757.9346 null] +>> endobj +1234 0 obj << +/D [1257 0 R /XYZ 221.1768 649.8092 null] +>> endobj +1261 0 obj << +/D [1257 0 R /XYZ 90 628.496 null] +>> endobj +1197 0 obj << +/D [1257 0 R /XYZ 221.1768 486.8766 null] +>> endobj +1262 0 obj << +/D [1257 0 R /XYZ 90 465.5635 null] +>> endobj +1196 0 obj << +/D [1257 0 R /XYZ 221.1768 287.9871 null] +>> endobj +1264 0 obj << +/D [1257 0 R /XYZ 90 266.674 null] +>> endobj +1148 0 obj << +/D [1257 0 R /XYZ 221.1768 96.348 null] +>> endobj +1256 0 obj << +/Font << /F29 499 0 R /F52 1229 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1270 0 obj << +/Length 1720 +/Filter /FlateDecode +>> +stream +xÚ½Y[oÛ6~÷¯0°˜8^%ªo-’µ)º k=E[Ž­ÄBe+“d¤Ù¯ß¡x±.”£E‘‡ÐÒÇóž)2ÇðGæ1žG"B1ãá|³Ÿáù<~9#æuïƒ&àÅjöÇŸ4žÇ(i8_ÝÖB‚%t¾Ú~Z0¾ ¨Ä^¯ÞÂPàAXþÊ·Ç,Ñã‹|sÜ'‡j]¥ùaùeõzv¹r¼F-ÁB¢Xÿ}ú‚ç[Pïõ #K1€‘8¦óýŒSfd³÷³¿ý¢žà[ ì)Ë£ð3Ò« A_c¼øm›|ƘÌ’Þ®¾~XŠϯV_W¯Þ]>¿øŒî.Ž +8–‘\«¦Þwò®¡¤ƒ |_ÑžT¥î}Õ#9¢¡àmòŽ]h‚²+KQþ®mQíŠ%‘‹d½¥Lfɉ, åˆñXO‘å›oZÄú°Õƒ‡%_i¥Uš„þ·Ù¥™Þy•7ðšwùþ>Kª¤DJXð¢rV³­vi¹ ¡‹ýzSäzXnv‰òÓú Q$ê©!Qà Z< '1¨cQ€S÷púÁCšezt£—©ä›õ¨§•ã%s+ (BÛ«½¾æNK0YŒ0±w§-(h¢ú;-á%f K@,cBjêë¼JžuY ¦(b”ŒÓ:”‡·é$G("Lœ¤é]SÇÀLK²ØA,.RÔ.À:V§Œ,öDzүnód}8®³ìQ?Mi•®³ô¿ÄLxH«~¥6¤³@Æ!Η†¯ÃO,µ/W-RÊÕõÕJ¥G-e¤D"¢›ìPS*ÄÉ(&mn‡M£kÛÜ$·y‘Xë¨èQO›0hY{*”†H(Bë±ÚmŽe²tVSDŽÆµ‰qVÌÁÖu)Ö{ˆ•¢v[Ÿ#îÛÓÂÒã¾æOÊ„ÀÞ‡“F—ïPžõ·‚†bÄ9˜½ÅúÜ$È<=€L’Îm²NÓç¡*r“n˪8nªc‘ aóE!₱‰¨oÂÆÌfaj§ØbfPEdëe¶¨>sÛtàøPÕd›yeÍ3VhLÒPU©®|wuwS::0q1••›¨aG‡È‚Ôa²òûÄ(»ÎÊ|ÄÏGø9Š%á0Ïln›Õ8Z|МàiãzrZG!‰$ëðw{G‹šbíIktv¶õž 6¡eÑÍ#9¿ytúg]ÊT.,ŽI§Wä^QAL¯¨†uWNeÑ«•÷É&UNlŸ¦/‹p¬"?dzH5œE8aˆE\žU.} +Œäýž&þ¼ï`årtù§rÙ_¿·\¶XM¹d°G¥d¢\6a#fs0}0°îÔ%çPÚÂ(œ ·¨>yÛzªöp·ÉOÓj1èÂL`ñƒ¨sá&jØ…YÃTWíËïku4qÞ1ê³k`_Co t0¥âv·¹ß M¿§‘àˆr\ÁÀ¡¦¨{ÒµNq£ ‚1yzQäògEò„¢øáÕÕ›Kÿe +E¡Êÿ4&(”$š¼M1ø 9ÁWžºr‡îSº‰6ïBÅ ¦X{Ò:Eqø2ÅœU £M~´6N’Øc-Ï£ LSm÷Ü î*8ô ªw‰°œºCsø 9ÁsîÉ5­ª§=ó5«CóY{MK¯Ž78Ô„6}i.r}™”BÇ’óñLÚD gRJÏL-|j3àS`¤ªõ4ñW5›hF—júë÷6-Ö_Ó 8BLF½@5b4‹²@”B$3Ž“ZP´S` U’8n‘tàü|~Å £ŸUqè`ÅùxuùÆi©OŠXÖå6BLÕ‹š<¿'w Î€¹"8åvø»uÆ¢¦X{Òë`qaVj³¸|\ +±H{!r[äûND¸ËðNxœUNô¹=žÈ|Aç><$Eróhï@²|I9ÜçQïÝÜMR–î•‹èõ7•ð,C¶Þ˜azèžáË*Ù#ß×+‚¼ ¦­oEäÃVýaNœ!øš[ 11©KLä!uª(#¿LI±®ì‘ÓÚø/;x½$N«&à̵ÁÏ({FÍ7<ŠqhöIY67Æìì³{p‘¼KzÇõíÍc¥ÿ‚„vendstream +endobj +1269 0 obj << +/Type /Page +/Contents 1270 0 R +/Resources 1268 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1231 0 R +/Annots [ 1273 0 R 1274 0 R 1275 0 R 1277 0 R 1278 0 R 1280 0 R 1281 0 R 1283 0 R ] +>> endobj +1273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.4125 726.9533 265.2617 737.8324] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [344.4185 635.8929 389.5689 658.8616] +/Subtype /Link +/A << /S /GoTo /D (a00142_ge6bae7dc0225468c8a5ac269df549892) >> +>> endobj +1275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 536.6764 165.0084 559.2716] +/Subtype /Link +/A << /S /GoTo /D (a00142_g9e97a0b4d5cc7764d8e19758f5da53ae) >> +>> endobj +1277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.3253 477.3718 259.1745 488.2509] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 347.5941 139.4144 370.5628] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.6528 288.663 262.502 299.5422] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [325.5441 246.9287 410.4453 257.459] +/Subtype /Link +/A << /S /GoTo /D (a00142_g99e43010ec61327164466aa2d902de45) >> +>> endobj +1283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.8635 135.3029 227.7127 146.182] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1271 0 obj << +/D [1269 0 R /XYZ 90 757.9346 null] +>> endobj +1272 0 obj << +/D [1269 0 R /XYZ 90 739.9346 null] +>> endobj +1145 0 obj << +/D [1269 0 R /XYZ 221.1768 512.4758 null] +>> endobj +1276 0 obj << +/D [1269 0 R /XYZ 90 495.858 null] +>> endobj +1147 0 obj << +/D [1269 0 R /XYZ 221.1768 323.7671 null] +>> endobj +1279 0 obj << +/D [1269 0 R /XYZ 90 307.1492 null] +>> endobj +1235 0 obj << +/D [1269 0 R /XYZ 221.1768 170.4069 null] +>> endobj +1282 0 obj << +/D [1269 0 R /XYZ 90 153.7891 null] +>> endobj +1268 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1286 0 obj << +/Length 879 +/Filter /FlateDecode +>> +stream +xÚµVßOÛ0~Ï_i/­D=Ÿ&¼m‚!›º-{@€P—©Mº4ðßïÜ8iš¸-›4!a;>û»û¾»«Á§ø~H}-5 ¹P~¼ð¨ÿ„Ÿ/<°Û#ܵ >FÞûO,ôC*¦üèqsƒ"0?šÞáˆI:Cy™—³Í,™LWÃûèÊÀ åZ ‚9À¥ùêG ªuJró—w{Oý):wåQÂÃ@úϸ Âù O0^/æÞwïksOµ±9àŠM0Œ+î¸"„ÂiHB!ÐH ™›† $ƒò5Çà4›ÐÆC ƒI1Y$eR¬N»qeDsÆüöÕµ=Gë¾'8ÝzT \no5®,Ë:H"”àNô-jm刟·Q%BHµ‹ú¡J…ežfÈ@µ(s;λ[TI‚ R}ˆó¬,òyµX•Å:.×EBºÔʨ€ 4<,_Ûj¿|*4ábÞïÏ_&‹å<Ù+„&¹L’oöÌ—âÉn}Û‘ÕÊåð»dmÌŒ‹ÓY¼ŒIÜsD@pØÁQcu ºw›ÞèUTßÕ$‘h³u–ÜQʲ´Ló¬RqRVã<ͬê,¤Õ$¬Fsd^§DIf›û;2a7â K]èº×M€‘EJ瑩½d=Ü\ž_Ÿ=üø]^ßQI»41)°=0á+Ɖf!;¢Uc?jègSÿ^w 2Å !tð;25VÇP{·Ô“¦¦¦HXRÛòŽ@× ý6sðf(å Mæ¶(‹|q¬p×Y™Ú²la[iÇñºXí­d‰?$ZËàp%·­öW²Ä 4‡¿èÃàÄßׇÁሻ7fGúðÁè·}¸¾³ï þ×>¼¥OHpé~I´hk™¢­63˜<êábÇQn§É1¢ð±‹Õä4‰\·=kÝn{Ñ,]ÙbYgñ6ëŸÓ¹%ñu[O.ÚOzeÔX­–Iœšî–L•• ™ü6ÿ&óõ¤LV‘‹u%œi¡€Œ0!Þܪ9¼¥Uw_pø Ú© EÚAUBüóãnó4 ð +×šõËÔ:a"½H²¤@f,u¸ŸëÉÕ$R_-€Ù‘ž2~ÊlüŒRe6Lç¶’Ö—ckM¬áÏ×j<Ë_^Ÿ’¬KÄG§ƒŸ?qŒšjendstream +endobj +1285 0 obj << +/Type /Page +/Contents 1286 0 R +/Resources 1284 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1231 0 R +/Annots [ 1288 0 R 1290 0 R ] +>> endobj +1288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 680.3578 139.4144 703.3265] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1290 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.3962 620.7106 264.2454 631.5897] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +1287 0 obj << +/D [1285 0 R /XYZ 90 757.9346 null] +>> endobj +1236 0 obj << +/D [1285 0 R /XYZ 221.1768 655.9239 null] +>> endobj +1289 0 obj << +/D [1285 0 R /XYZ 90 639.1968 null] +>> endobj +1284 0 obj << +/Font << /F29 499 0 R /F52 1229 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1293 0 obj << +/Length 1738 +/Filter /FlateDecode +>> +stream +xÚ­YKsÛ6¾ëWè(ÍT(ú–ÆÎk75í!Éxh‘²9¡H—¤ªøßwAôâ‘G’àbñíî·‹…HÆ~dœàqÌc”°HŒ«ßÃðÛ1¯gð~æ +ü1ýþ†&ã%‚Šñ|ÙkqJèxž}01Q‰cù™®K£8uíêGº‡´3ZS£þÎçE÷`5®ÛÞ"X'+š|ÑÕÍ“YÊ´Ý:+@ŒTfi_‘Þ¬ÍC^io”yÚTEu¯ŸºZ_³\yü?…5/ëG=¸‡F–ýR\ó2A'"Ã"D¤ «ff{„‡ $eÌN¦‡+ ùㆎÀÛˆÉh«G-÷R¾¿ÁŠ)œyWŒP"´X¿S#ͽyõÅÁE€À "ˆÎÊí »¼¾Ñlò¶.µÃ›¸"ATP?Ü™Âc Y¦Š"Wæ@–àHºO NÛbæx,³ˆzÌQ8NäxÛæwªÎÖŠ)б·$7ÌX®«…ØTK˜ù­ÍIË»²®¬-Ýôå¡n»*]™)ief¬R#Vt»*Ì4Ƚ¼¶–úÑ"M³Ì`lÑ!+´S¸Äú ž“è$e¹³c­T°Žº³ùê‡fÅ\h7ŸæÆW³”T}ßæUv„´ p‡aêƒ<ZI!é39ËÂ2 QÖH Œe2žÜºðªûO½ên>å¨ ¹—VíR1W~n¦ŸÔ]½¨Ü7̱r\‰I[}ÍòoÓJÑY=Þ=éë—7¯%5¢…í4 åyJŸuJdzp“š©j¿PWåܾ<÷ËUÛj导ÎÁ>”ò܉PmŠ}g3÷}ÕåM•w§s€Dbè3^$ˆD”@LI`ÅÂYà(¶L +M\¨UÄŽwûœØ%¤¾Àø“R-vÑvÅÂ*Úoÿ}ÒýèÒ2rŸý¿Ò°˜£˜ÿª ¶ÂÃ?NÛ¿&€x,"³B·GO +gÔB¥Ù±(4q &ÉI»bA{W¤BëZ~xHÉÈ"¨¡Tî­{:C¬|ÁÞþàÒ÷žÙm äÈ/.ôŸjË}LXNñûb + ¡LX¼‹äëüêãõÕüòöõŸ×on?¾¿¾úxuýý0öàÓuÌð1ÀŠ…à[Ña€Ýîº~ì¬û+ ð#8Ð{šÝ, +ð„DwP#Ün(c’$”§V*$GÝÙ{šs¡­åía7Ä(4ØS‡¡18®,CЬ˜ m/ÀÕzÕiÝ(Ä-Ž™lÏ´^(\‰ŽbŠ® ‡×Qx~|ý膻èüö {~ˆý膻èö‚Ü_«x‚hLühÁKF +ê9”çc2àÀZœõµª§ aàD·7(‰™ìo&ªÓDLàj }›WyÆe»ÿ«}²7T‹·6„š+¾ ì‚šsca:oõÅý‚²ûïîÉ~½ûùtŸ|·SÔ,4ÇKÿ…êAšendstream +endobj +1292 0 obj << +/Type /Page +/Contents 1293 0 R +/Resources 1291 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1231 0 R +/Annots [ 1297 0 R 1298 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R 1306 0 R 1308 0 R 1310 0 R 1311 0 R 1313 0 R 1314 0 R ] +>> endobj +1297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 605.7915 170.2586 614.6381] +/Subtype /Link +/A << /S /GoTo /D (a00160) >> +>> endobj +1298 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 566.9372 200.0265 575.7838] +/Subtype /Link +/A << /S /GoTo /D (a00161) >> +>> endobj +1299 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 517.124 167.3395 525.9706] +/Subtype /Link +/A << /S /GoTo /D (a00162) >> +>> endobj +1300 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 476.9297 166.1639 487.1163] +/Subtype /Link +/A << /S /GoTo /D (a00163) >> +>> endobj +1301 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.9003 461.5917 379.5448 471.4969] +/Subtype /Link +/A << /S /GoTo /D (a00158) >> +>> endobj +1302 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 439.4154 158.5425 448.262] +/Subtype /Link +/A << /S /GoTo /D (a00164) >> +>> endobj +1303 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 400.5611 160.595 409.4077] +/Subtype /Link +/A << /S /GoTo /D (a00165) >> +>> endobj +1306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 316.3067 204.5193 326.6527] +/Subtype /Link +/A << /S /GoTo /D (a00143_g54a466311575a727830a92a6c3621cb2) >> +>> endobj +1308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 302.7973 215.5877 313.7013] +/Subtype /Link +/A << /S /GoTo /D (a00143_g5eced097547fd3fac4ba2a255493d921) >> +>> endobj +1310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 290.8222 133.6164 300.7498] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +1311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 290.8222 225.7693 300.7498] +/Subtype /Link +/A << /S /GoTo /D (a00143_gd85fc90c30d1fc37c63c4844be5fe09d) >> +>> endobj +1313 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 277.8707 133.6164 287.7984] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +1314 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 277.8707 210.2674 287.7984] +/Subtype /Link +/A << /S /GoTo /D (a00143_g41bf109b6a45328d5744c0a76563fb6c) >> +>> endobj +1294 0 obj << +/D [1292 0 R /XYZ 90 757.9346 null] +>> endobj +649 0 obj << +/D [1292 0 R /XYZ 90 739.9346 null] +>> endobj +86 0 obj << +/D [1292 0 R /XYZ 90 739.9346 null] +>> endobj +1295 0 obj << +/D [1292 0 R /XYZ 90 716.7484 null] +>> endobj +1296 0 obj << +/D [1292 0 R /XYZ 90 622.6841 null] +>> endobj +1304 0 obj << +/D [1292 0 R /XYZ 90 334.6987 null] +>> endobj +1305 0 obj << +/D [1292 0 R /XYZ 90 334.6987 null] +>> endobj +1307 0 obj << +/D [1292 0 R /XYZ 90 320.2917 null] +>> endobj +1309 0 obj << +/D [1292 0 R /XYZ 90 306.7824 null] +>> endobj +1312 0 obj << +/D [1292 0 R /XYZ 90 294.8072 null] +>> endobj +1291 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1324 0 obj << +/Length 1594 +/Filter /FlateDecode +>> +stream +xÚµ™MÛ6†ïþz¨}0Ë‘"÷–v·AH›½%A µ¹»BýUYn²ÿ¾C‘”)K&Õb ,R¯f†Ã‡I‘ Ãd +g/b¹ÈVÛΞ ú팸ÛK¸¿ ?ßÏ~ú•ªL!%¨Èî[ ‚ N Íîןæ±Å’rÎ~ïìØícMä„·‘äj¨o$…6A ÆÓ M³6 Rœ·6!³ âàÞÙDÄY½ÕMYmôÚZ¹ÕÇU]Z³Ö òfhޏ¤6´ûgýoÓŲöO½×Ç}m/ŽºiªÝ“-ԧݲ©¶N}(ër«];3ÕîÂ÷ñ´zvœÄß)×ëZúˆ®å†#Æ)ou«M vú8‚ˆ å“«ø†Ûµaú†»Læg;ÆágJù¥/‚á)ÊYÜc§Jùº¢ï÷‡µkéÀy.PA ráÜܪŸœæ0 ¯O…1°kÂ8U‡¯ÐíÏûccúé2 +m”DÉx&:U"„¡µ¶0ÇÆ7ü“aO0nh&0FJIºé+^†ê6 +Ž3 Qˆ¼M o\˜(¼ÌDñQ7ׯ«ß+æÀ°­Ø?zeåjLúеعÂ3ÅⱻРƒÄôµ=Äy!/€;Qï³±ÜQíÀcìÐí¬£\ØôH?E&Ø´LÆZßi¢Î/-M…™ÃK”`I¦Áª#0w2ÅÛÿf/²\Ñ×™ $ +¥R8{YèÀ` é¸ßêÐï¬{Χ€c`7˜¯×õøl «3BH<*ÀÐÚdÀ)A”ȉ|ŸÅ1¼j|ª^ëÇò´qµõ"çóý Ö*?.rX˜\×!‡M¹"¯y® ¥’ È;YòÐ`ò„_yÏoò¾ó 'ÂØ ßéf[ÿR.QA˜Œ'¢S%"Z›Jy. b´PÓ0ÕÎ;Ù8è.%WÉÍ Øþõ:àr¤R©ÅF'KƒŒ÷ÛúnÏùpãa ìKk³3E‚ BpëT‰†Ö&s›è¹bâôªcÜzÙøòã•'è¶Ó9 Ö×á„+‘âÜËÒœcœÇývœ‡~'pÞs>…óx»çW'h·Í‹&â¼iŒG0´6t³€É‹b"è:º—ƒžš l¹”òUÈe‰â r;Y’ÜÐ`„Ü„_OnÏošÜ¾ó ä&ÂØ –°=Ÿ¢9bRðx":U"‚¡5O®N¡Ë`7'`[9 ÝPA·“µk‹ƒ^U¦G^.¾ƒ«zçÁ~ÿfÁðü—éS3ƒ ¢Prâ  ÕÝaìùp g„»³YwrJ»“SÇ“=9ݯN[½kÊàìT]?;m u‡°g6í™fø¿œh®É’ëo¾Ôß~îÍÇù|ü tZÉ&# +)ùør×k–hx‚/ÌÀ¼­%a6æm|þx÷fر Ú7â~¤cxth85fÑÍ;›&ޱI¨@œQm{'6¾7!0³ŸÍIÏéH=-æ‡}µƒÖ›‚˜7{[YÚ?ƒCu0Ñ}mlÍß Ê!cUù°Ñî‘çÒÝûVm6öêÁÝ3hmì?Ô¶ç­®y¶W¶¿–[hÏgZÚVô‚ + ”á©%ǼOm;—TÂf€©ð`½:(›ÊƒOé +µ¡ŸGzFãC‹1ĸ; °C‹F‡–?››:¸è„S­)'ZÆ"¼\Íóó'«QcÈüw†L¡rÿµ>@%L.¦[•»QÚ¿|ùðÒ8Ce]—/öòÌ£®¶ñ~L.êcc ûU£ýåã…0Ðáä30Ú÷mõS)´u«·º¾L‘K¤o‚ýBdš > endobj +1328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 613.307 210.8161 624.211] +/Subtype /Link +/A << /S /GoTo /D (a00144_g12b467f314489259dd718228d0827a51) >> +>> endobj +1329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 573.4169 211.922 584.3208] +/Subtype /Link +/A << /S /GoTo /D (a00144_g20bc87e5c063c3f4b01547be6e5a0148) >> +>> endobj +1330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 533.5268 202.5074 544.4307] +/Subtype /Link +/A << /S /GoTo /D (a00144_g41d37ea1e3bd24f7b51e9409aceaaa80) >> +>> endobj +1331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 493.6367 209.7101 504.5406] +/Subtype /Link +/A << /S /GoTo /D (a00144_geb79c914cf137e6d27fd7583e5a66679) >> +>> endobj +1332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 453.7466 203.6134 464.6505] +/Subtype /Link +/A << /S /GoTo /D (a00144_gd8e8bc9bc0e2ea4a24a8a024fd3a7f7c) >> +>> endobj +1333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 413.8565 210.8161 424.7604] +/Subtype /Link +/A << /S /GoTo /D (a00144_g5323320b7316647042016f17c4e881be) >> +>> endobj +1334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 373.9664 206.3828 384.8703] +/Subtype /Link +/A << /S /GoTo /D (a00144_g30e827f33eacff55ecb4d8fb5a11d5d1) >> +>> endobj +1325 0 obj << +/D [1323 0 R /XYZ 90 757.9346 null] +>> endobj +651 0 obj << +/D [1323 0 R /XYZ 90 739.9346 null] +>> endobj +90 0 obj << +/D [1323 0 R /XYZ 90 739.9346 null] +>> endobj +1326 0 obj << +/D [1323 0 R /XYZ 90 716.5154 null] +>> endobj +1327 0 obj << +/D [1323 0 R /XYZ 90 632.7749 null] +>> endobj +1335 0 obj << +/D [1323 0 R /XYZ 90 334.9631 null] +>> endobj +1336 0 obj << +/D [1323 0 R /XYZ 90 308.245 null] +>> endobj +1337 0 obj << +/D [1323 0 R /XYZ 90 308.245 null] +>> endobj +1338 0 obj << +/D [1323 0 R /XYZ 226.1581 201.4941 null] +>> endobj +1339 0 obj << +/D [1323 0 R /XYZ 90 183.6017 null] +>> endobj +1322 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1348 0 obj << +/Length 1499 +/Filter /FlateDecode +>> +stream +xÚ­X[oÛ6~÷¯0`“Ìñ.©}ÊÖ®h]›·¶d‹q„Ú’+KKóïwx“eÝœ,Eˆ”Ï9üø}<4I€á "¡„qlö láõ›qŸWð}Õ5øãzñû_4 ”H*ƒë[ãA$(¡Áuö9dñrEcá°yûš‡aÛx_fÍNÙö«rÓìUQ§u^˯×ﯯ۸.-Á$ÑQ¿/>ÅAé½[`Ä’X÷ÐÁˆ$ ö N™ïìŸÿ´~ì3`lvœÂÌb‚•nè u¬Ö±@˜ÄBaú=á!abðà(Š) ¼‘ƤÉ7ù!Ͳê¦^®$Æá]y¬uÿ¥ž9¸_‘%€«·ÞªÚ›|ÁÿÚé—}´|b2ŠŽI2:×6û®Õp9ãaÌÀ—n°ˆ˜Œ>, Ó*Ý«ZUÇýøS1JG$ÒZ3´“ ÁŠ'¯:  >•@ÏÐZ Àºq°™pr÷ +X‹“ðPæ`@¤.íËÔ>ÎWYü»¤pËÓ% ×Ë wÐPnð]ZÛq÷ùng[k÷í Æt·S™}›Þ®¾óc•}µiª +4´{pݲÐC·MeÆ‚¥‘ N²RÇ#2t[q7Ãå(†µ03|¥ôØ"7z45 Âs—N´€¡m”·öi2uaþèÎDèq +è ˜FX2H"†(b€%ü’Ù¸''šü…ª÷éñ›æ¾§½sÌÎà O,Mß(—°ÅÎ šRŒ 1:¯—“Í´ZD$}’Z†Ág´ÒËb\)Îè¢Nf¦}RIÞ£éD¼²Ÿ"œB4“N‹ÛQˆè(díYät-§ h­U‡mVÐË ogtÑ]wëvרs¶Žòâ9rˆÈsä@;ràÓr8ª:«|%xŒ¬ßO5dêÖP³Ù¹/UÙÀRý¶"<Ú7¾dw÷‹1ápž !â ÒéZM‹‡ëãaüIâK`F>ƒLÆÔš]”Ð,' •ÑYÜŸ$$(ušy±íÑ ·Æ™ ‹æÊ4+GRFò+:V3¬ % -—]VéîXÎb&>·'=l¿é7ÕÖ}úxFG…‘4Ù(e¼ÙùAOkÕëô,W}¬%P g±j­.dçd€E çß´Ì ý§lZbvÓ‚#¬GB=¾ˆ:¨M®½=ôùZUá7µ÷WKŽÃ?‡»•9LG@ɵõñƒFÖ–•þ“V`ߊR+é¾|,Ü„pºy’p“V½rUVY_Õ¾¾uª`i‡CœCYdçæz&~¦%Â;¾7ªÊ•K+íÚªBUiíüßkm—Õ·vw8G÷ ¶ßI¡S™ øŸ×yÇhZæ4&ˆRn×þï²VÓêž zÚéQGUë­,Cr KÂ}º©JÛ, s¨fqxô„TÎÊ®44:˜AïD–t(ê²7ÐR‘%†Šh¹bX†o›MZ¥k^€ƒæhÎ<Ú…sµ¹K‹­:¹¡Ãÿ¤,6”^yÐ*±¸°ô«™µgq&¢'þ±æèÐÏd¼ð·f:5Zùl%™G µà¼ò ”°¨ø•ÿXWͦî'GIŒ‰Y/¹É*×Ú_Hsè×W9ØÜoÆ`¢F2Áñ> endobj +1352 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 411.5145 158.5126 434.4833] +/Subtype /Link +/A << /S /GoTo /D (a00148_g87f0b54ade0d159fba495089128a4932) >> +>> endobj +1354 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.1221 221.3274 271.6871 244.2962] +/Subtype /Link +/A << /S /GoTo /D (a00089) >> +>> endobj +1349 0 obj << +/D [1347 0 R /XYZ 90 757.9346 null] +>> endobj +1344 0 obj << +/D [1347 0 R /XYZ 226.1581 652.2086 null] +>> endobj +1350 0 obj << +/D [1347 0 R /XYZ 90 635.97 null] +>> endobj +1342 0 obj << +/D [1347 0 R /XYZ 226.1581 538.4468 null] +>> endobj +1351 0 obj << +/D [1347 0 R /XYZ 90 522.2081 null] +>> endobj +1345 0 obj << +/D [1347 0 R /XYZ 226.1581 389.7944 null] +>> endobj +1353 0 obj << +/D [1347 0 R /XYZ 90 373.5557 null] +>> endobj +1341 0 obj << +/D [1347 0 R /XYZ 243.8616 199.6073 null] +>> endobj +1355 0 obj << +/D [1347 0 R /XYZ 90 183.3686 null] +>> endobj +1346 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F52 1229 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1358 0 obj << +/Length 998 +/Filter /FlateDecode +>> +stream +xÚ¥W[¯Ú8~çWDZiñz|‹}úԪݪGZ©»å­­ªr *$,„¶çßwŒæU<`Çã™o>Ïņˆâ"C£D&Äp¡¢ånB£5~~;¿ãzÜxµ˜üõ73‘!F1-ÎÉ€E‹ÕÇ©"|3I§§wïÝ`YŸ(eëÓ!­ò²pNÅÒÎŽ8ÕŒË)7³Ï‹ûÉ›EcÜc“\5ýÿäãg­ãý„n´Œ~à„0†E»‰`¼žl'&ÿ6zÜÂyØ‹‚¡{xÛõª%5Ö’PÐ ²Âƒ„]HQnO(œI$Ñ ¢ZÈsÊ÷_ò}ºZ¾T³XQ:µãÖkTƒ&‰íJ~¢’þis· ›ƒÒs˜3\‚f³!B Ùl>fÕ¦xáÇ}æSªB×ÏØÃoœeK*p–Ü&}d}È<Œt{,G°/\¦Q·f¿Ö~é¿ÎAûÉGº¦ûV[V@ñ0W #Â$*ŠyB7•È™2òŸˆ’Ô„7?ÓÝ~›²¢¥ó·™à%²–²øV›å~I–t\:ˆ.n„nØíë²vç‹‚cù6²kñºÏµø Û}­Öv69uçïҼؖå>þ‘W›8=ì‡\0ì|FàÁ†¸h„Âxº¾N¬¦5'šBòDRñ úZƒ¤”§jœ˜‰† /PÒ@—…DÎ/æ¬V‰,1 íÚëÌ^7ŠürÙH+÷¿Í _€ªn‘µ[¶—2K6g ½4¦Ö"^1DR_ufê ³ {ó+g·U«±YµKßl%ª»°WÌ»Š™ \ð•Ö®6^›WC®}‘P¸ëÈõÕ–º^¤„{iáÏjàc |€d¼7b7x€K20ÚÀ;vƒ |ؘݗï3&‘·<ýZG^ƒ+Lž¼X÷Î6ÜüŸ™ÐÇp´¤ 0•~N×™v¯¢mVØ3»~ªFê +|*ˆfR?½êHú”ªÓ‘Œ^M)%Õo½Î<[€w*ƒÂ*ÀuýÆó ¬«o³"÷\¶òÎxÿ©÷¶_œüX]qï¿cžFëü`¥<ôÞŒ@¼à×G÷ÿºüù¸ÎŠ>=ãj„Ÿ_×cNéendstream +endobj +1357 0 obj << +/Type /Page +/Contents 1358 0 R +/Resources 1356 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1340 0 R +/Annots [ 1360 0 R 1361 0 R 1362 0 R 1363 0 R 1365 0 R ] +>> endobj +1360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 624.1462 158.5126 647.1149] +/Subtype /Link +/A << /S /GoTo /D (a00148_g87f0b54ade0d159fba495089128a4932) >> +>> endobj +1361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 586.5419 139.4144 609.5106] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4032 586.5419 262.94 609.5106] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +1363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.8054 586.5419 416.0743 609.5106] +/Subtype /Link +/A << /S /GoTo /D (a00043) >> +>> endobj +1365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 429.2598 158.5126 452.2285] +/Subtype /Link +/A << /S /GoTo /D (a00148_g87f0b54ade0d159fba495089128a4932) >> +>> endobj +1359 0 obj << +/D [1357 0 R /XYZ 90 757.9346 null] +>> endobj +1343 0 obj << +/D [1357 0 R /XYZ 226.1581 562.108 null] +>> endobj +1364 0 obj << +/D [1357 0 R /XYZ 90 545.3808 null] +>> endobj +1356 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F52 1229 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1370 0 obj << +/Length 1193 +/Filter /FlateDecode +>> +stream +xÚµXßsÛ6 ~÷_¡Gûnb þ™Ç.i/¹uËï©éå[It³-Ï–Ûfý@‰”eQ¶ÜÛvyiAÀø"Š%2!† Í–#½àÏGàÇø´ï«M´`òh¶µêãhû £ÅµØë±“][@mˆ%?m±‘²‹a¨R‡v¿Nù<°Ñ0²cÛ>Ú¼8™»6 +/?„"ÐkQìòõ£=ê…’(-Ì@¼Ôm¥‰ ²cûJꣀkO!!€…¤('ºS†=‡Q Çmé +‰¤‘F$JTH°xhbô^i…s²žÃ' C0ê4>PV‚8šÂ2Á°i¬îÓ)܈ ¦p[ተëSøÀî` +Ú>#…Pz} +o³2_÷A90˜Ÿ§ƒà¥†Ìk JËŽy›Å]- ¥Î€—DÐÕ[ÔcPÀ “S™DŸv½‘0Ì[¤Ö×O—­Dr B°óʶ-}¢l±ÿ l¥ Tc¯%Ýtú}ÃÒ•`,£@Ó—™ë˾¥™]:3QÓ™[ŠšÿuuÅÕ}Õ“wµ«éèôXׇŒŸ}L1!ܼoÅêÝöµØ-º'7ÌÒE3”¤å~

¬ëÿeÑ‚‚HÜËe0˜L¾}ç×Û2ý°-œ'"ˆâIoæ{¡¸-N¨ÚØ‚C]vèm*ﯾ§Ëõ"Û^„©ÅHœ4¦±Ð!NÀÌK€Ë>„‡-ÁÉ5bb69®aÆË4_-ŠbËË×8ݬÉ,` ¦“É@Ì©H¡6 é'—«€¦™Ði½kýhhù!Þ“¡)vet8’7Ç7R¨BmU]føõã•0I¤õ|r™=PÊleøBó…´ÈW®@Pm½(ž=Pæ?˜)Ȭ·’ï²çl“­f™«ç?®o¹¾Ÿ^ýzûÛÝDa½Ý“~–âÌvMÕb)v”¥|nˆ*lWÉ“³ˆ F¤¤C³‘Û/„õê=Þ1‘•áº!¨'ÆNЮlÏïÀp=¢t0býJªQ½'ú˜;¼Áí¤öÿ2ø2};¤ïýÇ]HÞe¾ÌéºCÜ™Û`Ú÷â9'Åq;'Å»—@@$½W#Œß0ê_ÝTc»ÆW€$¡Âï~Ì[ñ _´WŠuøc¶Ê6iéƒë½þä7–¦vnÌý§Œ_0w%‚É­ÜN˜ûoïðîäéÍÏßß^²àÆÄ^eôDéendstream +endobj +1369 0 obj << +/Type /Page +/Contents 1370 0 R +/Resources 1368 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1340 0 R +/Annots [ 1374 0 R 1375 0 R 1376 0 R 1380 0 R 1381 0 R 1384 0 R ] +>> endobj +1374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 615.6894 166.9111 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00145_gc48ed5f0d27721ef62a3ed02a5ad8d2e) >> +>> endobj +1375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 576.8351 180.1912 587.739] +/Subtype /Link +/A << /S /GoTo /D (a00145_g22f140b02c354dfebcc7ad481c3bcd68) >> +>> endobj +1376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.0068 576.8351 208.6941 587.739] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 414.8106 227.254 437.7793] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +1381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.1194 414.8106 380.3883 437.7793] +/Subtype /Link +/A << /S /GoTo /D (a00043) >> +>> endobj +1384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.8969 339.5315 225.6901 350.4107] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1371 0 obj << +/D [1369 0 R /XYZ 90 757.9346 null] +>> endobj +652 0 obj << +/D [1369 0 R /XYZ 90 739.9346 null] +>> endobj +94 0 obj << +/D [1369 0 R /XYZ 90 739.9346 null] +>> endobj +1372 0 obj << +/D [1369 0 R /XYZ 90 719.4886 null] +>> endobj +1373 0 obj << +/D [1369 0 R /XYZ 90 634.6393 null] +>> endobj +1377 0 obj << +/D [1369 0 R /XYZ 90 539.515 null] +>> endobj +1378 0 obj << +/D [1369 0 R /XYZ 90 513.03 null] +>> endobj +1379 0 obj << +/D [1369 0 R /XYZ 90 513.03 null] +>> endobj +1382 0 obj << +/D [1369 0 R /XYZ 224.9827 374.7449 null] +>> endobj +1383 0 obj << +/D [1369 0 R /XYZ 90 358.994 null] +>> endobj +1368 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1388 0 obj << +/Length 1934 +/Filter /FlateDecode +>> +stream +xÚ½Z[oÛ6~÷¯ð°k8^D‰*°—.m‘bò6Ý€¥A ÈJ"Ô–RYjÖ¿CñbêbQëÒ¡HmIÏùxx>^L–þ‘eŒ—PÌ‚p™îxy·_/ˆ~|ÏO\À‹‹Å¯h¼ŒQÒpyqÛZ â”ÐåÅær"¾>¡¯š³sõe“­ _}ÎÓL_WùšàÕgù_V©{·M‘ÖyYìáR„¬²¾ºx³xya¹hªœ…D2ù´¸¼ÂË P~³ÀˆÅ‚/á#Çt¹[”™‹íâÝâwkG=hŒõ˜6Þe ¸CMŸ)„ rºL0þê>CO• ‚bÎ[w,9µ.ÑNN³:É·ÙFY9Íöi•?HCÚsFÌÐEk­\Ügûlp¸L*}¿ÙÃ7_ô#õQdõ£d_Vmi¿‹ò†ì¸íb©¿äEU x,îÔǼ¾?ä GÇÂ"†Ã¸íÀiöcZdû‘äa€8âh»5¨n¤QÀDp°#~ ”÷} ­(gÓ-ÊçžÆ8 »~¿ßèžœ!ŠhDzÎå£êNcÞº4 ÞGc`WÒhò‡ë¼xhê ¬) =10(Ÿóµ6ö˜cø#ÃøGˆ€y,PHiäº>qÑ-Ž—„AË䌣XŒJçÕ:à«2ÍöF&…Iç´ÜÙ\~HÒ5Å«­¸kt”¯ˆP21ÍWÓ% ‰˜ñ£ÉÌ#²ÆÌ“ÌæMf×àD2{üšdîøõ's×ùŒdöÐØ5ÉüUy¹ÉÓ“8BXDƒòùX3ùœ–E1™ÓPx„èÌœvÐS9m`mN¯…,A* +*}YnSÚ¾¸õÛ_òÎÚ‚¡°ÉŠ:—£Ú/y­µR4»¨öÕ>Ú]¨6¯žDŒ!̈ïýna~I8§$1í×JÂõ;Cçs$1Mc`×HBíµ,͇êÝ's;DLð&#bQ*Cku´ $ï ˜ Å1‰æ†Çâ}œvÝð ¦T¬ Š=1(Ÿó5éüRz¾Buú°¯“Z¦ Kî´¶¾ûI}¾?;¿þù—ßÞ½<{©€(8‰a‚˜ùE3åÑÍ´_+×ï ÑtœÏÍ4Ý~iÓc”@ÔÂ`:å!1´6»˜`†¨\AÌ+&zª˜˜SL Zìt-ù†•E7x(ÛÅ„º¨Ë^ÕÙ×U“ÖMµfѪ]ƒ­=ALÙÓÔž °¤Œ}µÇ¼2r NÈÈã×Ȩã×/£®ó2òÐص2*·Ûq áÇÓq°(¡µ¹‚?â„Í\c¸è Y˜dñ6k>eûZ§ó}Rw“=©ê4ŒÎÈ{ƒôä½›Ê{×ï8Ÿ“÷Ó4vMÞ7›ãK +±Ç„‘éPX”‡ÃÐÚìÔ‡ºE|fõpÑS©o`_¿yzþM×$ÁHðiê‹å‡úꂆE~}Xä´>\Ø„>:~ýúè:Ÿ¡Ý1}Œ×‡€ Â|}2å!2´6W$L˜±‡3냋ž‰…ý¯"yâé‹0ô&3#ã í†ûa¤ÄX»•¢öÿXÇt•Tyr³Ý f „ˆÅÇ÷‚]À”. Ì¯Ë 6%ûdcTécgÕë²kÄõp—–QRL&ÙQÄ8ò³c‚…—ÁuÙ¨oä&is; rèŒóä Y”Ï}(gx¼çþR.”_ÈýÙ÷¯Þýõòzu,oaI€g3óÖEO(ÚÂô)L»¬e©£EÄêÖW²¨ P†‚x&g=®5 +/f.¢Ø=Q{ô¤+„:z*Óf¯“Ä9|Š>µvì!֡بP˜ƒwÓÿØYÑ›ós6æÝMyi +wHƒ@DÞ6ö4L]&Õ±žT‹Ušlõ‘›X=ÞgYßëÇÝðxä0L¬îí­ÊÒÌy¬­&êãÀYYº­Ê]Ï™s‡Ö'Œq“RÖ¦ÃíȪ[ÜØâ=âÁq¾Ú5j}Âu48” l¯šäEϦ+vÕL_€a™Ë^=“B¶²aÛn³âN B‰»íîÆ&pÊ¡¶MRi§÷jº™f‘å$Ý6Ów?Kvº¤ŒfËŸzÔ‰1@:iC`X¡0ûgTiØ.ù¢¾Üè‰nQ6õMÙ¨^ïˆéIû=ï»îÅxغs.Kõ #ÁêL7Ø—¦cÉrˆND;ÑQwZéÀç¾u5W€Š"|±C ßÛ¡tºÒ„êÏ-xP”}@ןr£cÙú/4¢){E/ÿ¢# cf?øÈÛÙ7ÉVŸjKƉžP©ôÅí«Ã¾’lò¹¹ƒ“vn× +«?7³­öeS™÷´Üdfå¿-eç×áÈŒLþZ D£?ñÀð†…âþ§ßT´s*M`Æá–˜MG²êݺ$dð^gEV%¶Ÿ& ¿š/oäû§Ñ„êOüœ²ç«+Šq¨C)ûn&À¶¨ÂºÄÓòï/wÙ`)!ð1Ÿ˜x÷Nendstream +endobj +1387 0 obj << +/Type /Page +/Contents 1388 0 R +/Resources 1386 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1340 0 R +/Annots [ 1392 0 R 1393 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R 1402 0 R 1403 0 R ] +>> endobj +1392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 611.3557 185.9198 622.2597] +/Subtype /Link +/A << /S /GoTo /D (a00146_ga4360412ee9350fba725f98a137169fe) >> +>> endobj +1393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 570.6172 198.084 581.5212] +/Subtype /Link +/A << /S /GoTo /D (a00146_g1024f8a5fa65e82bf848b2e6590d9628) >> +>> endobj +1395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 529.8787 213.1775 540.7826] +/Subtype /Link +/A << /S /GoTo /D (a00146_gfd5ebb56a1bd1da9878aa886a2075e80) >> +>> endobj +1396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [242.9955 529.8787 285.9441 540.7826] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf703683056d2bfa5c81fa157dcb20fe2) >> +>> endobj +1397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 515.9852 222.4327 526.8891] +/Subtype /Link +/A << /S /GoTo /D (a00146_gbaf0bb2b6a4424b4eb69e45e457c2583) >> +>> endobj +1398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 475.2467 205.2871 486.1506] +/Subtype /Link +/A << /S /GoTo /D (a00146_gf20aaf4292cb0d2a1b10bc0a568b51fa) >> +>> endobj +1399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 434.5082 218.0093 445.4121] +/Subtype /Link +/A << /S /GoTo /D (a00146_g2c64c8c36bc84f9336f6a2184ea51883) >> +>> endobj +1400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 393.7697 242.358 404.6736] +/Subtype /Link +/A << /S /GoTo /D (a00146_gf5c2ad5acf3cc23b8262e9ba6a15136b) >> +>> endobj +1402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 306.5867 133.6164 317.4907] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +1403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 306.5867 166.9014 317.4907] +/Subtype /Link +/A << /S /GoTo /D (a00146_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +1389 0 obj << +/D [1387 0 R /XYZ 90 757.9346 null] +>> endobj +653 0 obj << +/D [1387 0 R /XYZ 90 739.9346 null] +>> endobj +98 0 obj << +/D [1387 0 R /XYZ 90 739.9346 null] +>> endobj +1390 0 obj << +/D [1387 0 R /XYZ 90 719.0647 null] +>> endobj +1391 0 obj << +/D [1387 0 R /XYZ 90 631.2478 null] +>> endobj +1394 0 obj << +/D [1387 0 R /XYZ 90 549.9141 null] +>> endobj +1401 0 obj << +/D [1387 0 R /XYZ 90 326.4788 null] +>> endobj +1404 0 obj << +/D [1387 0 R /XYZ 90 266.2048 null] +>> endobj +677 0 obj << +/D [1387 0 R /XYZ 90 239.2959 null] +>> endobj +1405 0 obj << +/D [1387 0 R /XYZ 90 239.2959 null] +>> endobj +1386 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1414 0 obj << +/Length 1818 +/Filter /FlateDecode +>> +stream +xÚåX{5ÿ?Ÿ"J(1~ìóJ+=èUâ8ÚTµÕi“u’{»a=ÄwgÆãÝì&›\K)B§œg=ã™ñx<þÙbÌáOŒC>ö]Ÿ…ÊñÆË›¯¡û»‘°ìðg]¯ç£/¾•á8d¡'½ñ|e4x‚¹RÈñ<~5qät&îóI}q¤Ë'‚q"¾Ïã:ÕD?É—õΪ¨Jòlúfþlt>oíZ·\å ´úëèÕ>ŽÁ½g#ÎT¸ã[øàL„¡ߌ©štôbôc«‡fÀÐì 3 „ÏÀ u¤¤—qø Ó÷å.Þ†û\˜x„Ìõ1n„0&u²½Nu6yœOQë·ÉRÇEòV×Ûó…rwÚÐðÅ +6ƒNîòšˆ¨Àíá“Û"©’lm{©¡ D¬§Ò`ÄIân:¦Âè‚dªMT•i—D~õÜjÀåù*Ž ]–¤â¹.ó´6{Ñ\y•/sÌJñ9îho¢ÙšYòv£­\Qg³&›„`¡ëRÊgä¼Û)9º·ózΫ.2]}NŸ n“4% +}'ªÊ©]F ïY é¡P[ÞB¯òBnU›¤$jUgKœø‰ ‚»÷”‡N&tÄ „>“¾ïí´b¼>‰õ*É4m³¯_~K„ÝE¼¬ŠzYQnQ]m®7qa/ P<€"& Ò9¾Q÷™a9Ì$Ìc×Ëù)jXÔ«WüÙÙf +O27äÎAáØ¯[Ú®Ùu³å?Fý£!(³ÇÕÝÖÆè‘õçéü‡ËÈyqu}>:ÿùêüúâ +Õ¾ciŒ +(Û$;5¡„6®ä§Äÿo–\¹Ç¡ÅMKÞ÷9l¾÷ :üNGýÃú±"uäpr$lgÇON]©ã‡“£$„±xþ[t³Muy¼>2íÂáÄÞbmYÏ{ÕËžOžc­˜ 5Vursv%YšçÛÙmRmf°Æl¹ï¸”“®OÌZ©{\:Ô†.Ù3%ÊâëNÀTÍ=ëGCÓÊßçÇÞ“¡}>å‡P°¥8V꯵¡WŒò[@«2 ‰ùD¿æ\f‰EÅŠÚÔQHAÀí©¾¢‡4Øv,Û{ù Û2Û÷cÇc.“ î ‚Ã>†ИÝé¸Þê"Éãd‰ûu™gYs\íM‘ã±À#0we‘šm‘/ä´Ç> ;¥)d™^îfšÄp'IБx,î,§²x!«o€`\×F‘Ï<éЬæ,øXÐWœkÛOÀ…#ºAߢâŽ>·;Ïùžç TÉ.JLm¹3T =37Nsã .bþ%h¶I•gVnÃ)!Ó¸ä¨ü,ÀYåJƒž0&HþCÊÌE¹ +ŸŠ‰õ;Œu#‚N¹61@ +ÒëŠA Þ䢢^ë…?d×Ì ÝÁ»wV®]I˜›H[˜­·žº€ªãÔ ]ky¯ÂŒð¸Ø!Kj>jðc¾ÕY?é—i^êx0 ~¢I»ÜJ„|ÀîBWu‘áb*åCv‘ÌMtGìM4…ÿ4Eê‰2±Èk\8ìÝFË_¦q}ßâGd/ƪ‰pJ]Е{“žsÒ& rö.К– äp(­iB™ä;phc«&eNß”íÐÑžãØûõEE-RË6»8¥®¨£² +"ú¤i­©7 ߂ɚî; +ï;VõïºÈ!¯T‰¿±Òý“¸19mò!aÇ5É×õÄP +Áºì]Lv¡þHÒa4¬Iï¶ÁZ8JÍ—Ô ìüæ‡ËË–ûàAòް³{¢$ÿå§!9€žÀ96»RÇѦPp +#¦»ÿ-ä¤ÙÝ øÐî †lÅþo! +d©ÈÑ ÁžÎ[ˆ#í[ˆ +|û‚ô‚V"lé-Äô@M؇‘Ђ"Á¦¸’÷ÀÜV~Ö0(ô¹½âZθÏÝ=‡p­•ºÏ _±PøNßÎ QišXµë@§ì!@ìÁ]‚«°¿€ýœ:z­ø¨7ø†ÎÁiá¹Þ=d›‡ø†ˆn<±%U&°—„ãÉÖtü;é"ª(Ûß7Ä3œQm?„´-?“êLÚ7{‡ž=D0 |>|Üopò“ü·»µ>xÒwá:¥¿º endstream +endobj +1413 0 obj << +/Type /Page +/Contents 1414 0 R +/Resources 1412 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1340 0 R +/Annots [ 1416 0 R 1417 0 R 1419 0 R ] +>> endobj +1416 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 418.8948 227.254 441.8636] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +1417 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.1194 418.8948 380.3883 441.8636] +/Subtype /Link +/A << /S /GoTo /D (a00043) >> +>> endobj +1419 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [314.29 105.1501 371.0667 116.0541] +/Subtype /Link +/A << /S /GoTo /D (a00152_g54b27e45df15e10a0eb1a3e3a91417d2) >> +>> endobj +1415 0 obj << +/D [1413 0 R /XYZ 90 757.9346 null] +>> endobj +678 0 obj << +/D [1413 0 R /XYZ 226.1581 392.748 null] +>> endobj +1418 0 obj << +/D [1413 0 R /XYZ 90 373.4515 null] +>> endobj +1412 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1423 0 obj << +/Length 1804 +/Filter /FlateDecode +>> +stream +xÚÍYmoÛ6þî_!`_ldâø*Jé6`[»¢ÖeMú©-Õba¶äJrÓ`ØßQ$e½YrÚ~D/<Þ=>Þ=w‰‡áxö¤(b<ðÖÛönáõó±Ã>Œûm_¯?üN#/BQ@ïê¦Ö$(¡ÞUòv ±ò©ÀËý‹ s“¨ËOéZÙç"]¼ü¤ÿ©Â¼»Ùgë*ͳCNÈ’³Õû«—‹gW  U°€h$oßc/È/±(Þ=<`D¢ˆzÛ§Ì=l—‹¿=f ž0ö‹9Áˆ2ô|*ÍlI ¤ ¦H2JÁK|"éÁIó%&ÚI„HD¥„WVJ{ê&/ÞaÓ•`¼üÉ\ðsµo4—7/.®ûóÕ«K;zv–ÂTbþÑž‚×+†xÀEm`Ÿî®wªHó$]×–ôœ'µ4î¦7zX‹oTf”þlጚ¡3q±»Î÷•Vs̈ªîT‘©ê:Q: +>©âºTYÒå˜ø·5B†#í0 Â$”^À’$£‹ì„ü¶Ô0¶ÃaÌ@—($¬-^踋x«*U”ç}û6"È(€cñCFÚBB°„Q&Z5”užeû4„¨Ä´©°¶]Æ‘ »Ww6•³ýöƒKáüÆ\+7¨Ñ©:«Íóý]º¾3·iiessý`§¸h7›û&ßlT‚Ž­²ˆÀ²éUnKM¬2QD™‰«gŸãín£&ÖwÊ4GQH8ÜÖcúMqk‡^wVß®êB6¶úXPšV L§Ù&Ïwþ}ZÝùhÝNi€¨3>k¤f µiHß›E‹³d`CÀÑ·~Ô5üŽÞI×G{‡ÉjÂ̲úÔ ª¡6 +£¡SI(!õàSõcš¥‡|‰+sݤ™M†I7×ô”Fwµ‰^| CG‡®@#ŠØ +¢Xý»ÄØ=(iJƵN`ÍÍöJ¬nÖÕM9 + m 7ªªÚ¶›Ìö©Èת,ÓìÖVüÜòF<Îi¢²*ÕØTbIâ¡3a—§YåÈÇIZYf)«b¿®ö…B®A (ç5ÎK`oÃd—Cåˆ3z<¢@ ‘œKb'ï·'Œ$ñ@ïXv~î + â4=D}JwRs8BraLJ…Õ¯ŒSªøïº9Ӿįáðöàp-’›1ÃöÚ‘àíx3H+èè §:³‘ŸùC½Î™c5‘q†$´^Ól¤æls¡åz¶MÀ_¤YY©81ªsU;(sƒUMO·Æ•X‡ ¨ìM\¬H¸¼Ýo!gkÓ'EB[‡]!uý³Í¥8ëÖÕ}é’È% +¤ßZ’§ŽjlÖ•;µ®³rÝOÛ£5šs‚`½ètnK¯Ñ\0èÎ T'6`¢ ïıÙNlÒ‡NlèÑN¬c÷— .Ô©Ù‡…ˆ‡ · é8·9ù9p½Sé=4òlÚ/NhÆ2e!‚ɮå&Û…æhc:èBM +ض¼À­Çlʾ¦`ËVÁæzäGk“>¯Õþ£*+ç‡Þ•׸¨Òõ~ãN+¡—Ú$=ÇšõCÅ5ÁeºMk]Œpíð~`Âfd àFÎ]'ï·'ŒgMWo¿è6Ž«¼”€¿Â0èÁꇪ“šCÁ!¡îU;`šÊ«=“äºèê»,·¯v®§b„é"¥ãÁº1Ý*ëÑk£•/05[4=ïvØP™…Ó/ÒÒ¨2‹eÞé1¡N-D[gL:A°Q±¼·Ÿoâ*>Êõ4vÄÀÏ“\ß–:Îõ4ŠP ‚àQ\?`‚ëHƹ¾›åúI¸~èQ®ïØýR®ïB:ëgÀ ôžÂõ“~i¸~ÚrÃõËÿ®gò[q½8Îõû¤»_8î/µ{óôâ±û²fïe¿ + ±-¶k¢V×ʰý(oõr€ ó ˆ5{ )Ͷ î†Û6*`û#…ý $7l„æ>08y¿=a$èzOݶ1 ‰Âƒ¨‡¨¿ëpR38†ÚìFhk÷¦½ª—Rûͬ!¼9¬a å‹pù¢êú\q«×îS»±uº­ÜfB´­úpS“sywÈŽò8-q ÜÆáwHŒd8_é¼ßž0BK½§®Åfâ ‡¨ÏQNjÕ;Ó€°.éçÇ +'á .ÙdÝj +h[zxÚÙïäÔœ6@ìtNÒ³³ú õÍNºþO:E GOèô)‚>l"bjôX  ­ÉWCÕgk!L!¬³é `YèŽÖ, ò¹ÊTWŽv]®ýán^êÖpoµW|NÙ9Åæ‰bX¾×ãü樎 Üåô§ùç‡[5¨êâ{Ä?ÿ+ "endstream +endobj +1422 0 obj << +/Type /Page +/Contents 1423 0 R +/Resources 1421 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1437 0 R +/Annots [ 1425 0 R 1426 0 R 1428 0 R 1429 0 R 1430 0 R 1432 0 R 1433 0 R 1435 0 R 1436 0 R ] +>> endobj +1425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 593.8152 227.254 616.7839] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +1426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.1194 593.8152 380.3883 616.7839] +/Subtype /Link +/A << /S /GoTo /D (a00043) >> +>> endobj +1428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.4376 488.8567 182.4258 499.7606] +/Subtype /Link +/A << /S /GoTo /D (a00146_g1024f8a5fa65e82bf848b2e6590d9628) >> +>> endobj +1429 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.6958 488.8567 344.7692 499.7606] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +1430 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.486 438.1531 236.5593 461.1218] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +1432 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [132.348 333.1946 215.6849 344.0985] +/Subtype /Link +/A << /S /GoTo /D (a00146_gbaf0bb2b6a4424b4eb69e45e457c2583) >> +>> endobj +1433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.486 284.5483 236.5593 307.517] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +1435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.4549 179.5898 309.4431 190.4937] +/Subtype /Link +/A << /S /GoTo /D (a00146_g1024f8a5fa65e82bf848b2e6590d9628) >> +>> endobj +1436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.1787 167.6346 205.1669 178.5385] +/Subtype /Link +/A << /S /GoTo /D (a00146_g1024f8a5fa65e82bf848b2e6590d9628) >> +>> endobj +1424 0 obj << +/D [1422 0 R /XYZ 90 757.9346 null] +>> endobj +1407 0 obj << +/D [1422 0 R /XYZ 226.1581 568.2372 null] +>> endobj +1427 0 obj << +/D [1422 0 R /XYZ 90 549.794 null] +>> endobj +1408 0 obj << +/D [1422 0 R /XYZ 226.1581 412.5751 null] +>> endobj +1431 0 obj << +/D [1422 0 R /XYZ 90 394.1319 null] +>> endobj +1409 0 obj << +/D [1422 0 R /XYZ 226.1581 258.9703 null] +>> endobj +1434 0 obj << +/D [1422 0 R /XYZ 90 240.5271 null] +>> endobj +1421 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F52 1229 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1440 0 obj << +/Length 2117 +/Filter /FlateDecode +>> +stream +xÚ­Y{Û6ÿߟÂÀ‰Y>DJLÛÒfÛ&Hs{Íæ¸40´–¼jK®$'íúÝoø’õ ¥Mq6âc8óãp^¤ÉÃ?²”xñIŠåö¸ÀËþ~Aìôæ×]‚oî_|GåR")¨XÞí4A§„.ïÒ÷A®Ö4ÆÎ/o¡Éq@6Ëô|ÈLûE¹=³¢Iš¼,Vî^-nîZ¹g‚(©¿.ÞÀËà½Z`ÄdÌ—Ÿ ƒ‘’.‹2×9,Þ.þÑò1zow!…Å„-×L ˜ÈÐKs„I"(A„pêWD,Æ,ZFŒ!Ø~¨µñ¦l²gÃÝLQÄ(]vŽÄ¶T¹¬#—àE„ñ 7%øy jf2Ø••jÄA³ÏF8B‰¨àPSÕƒ¥ù©‹ÈÑÏ!ñUˆÎùisʪ¼LóíϘcø#CD X‰Ù´fZªÑDQÔDZ;[esOA/! êS¶Í“ƒQÒ6©2£·}bØ”fêÞN4É/+‚ƒ¬0ÝO{ÓŠƒsfÐX¾Rzùâ+K›7{Ózþ“%HŠTé@6AL„°'BäëZ\dÍ5"K!Á¾9î)êš)A«Kn§„d„‰>8!EâÂU+¬¬Ôy嫵À8øÚ|ð—ækG¿2Ÿw/o7ï^Ün¾ýû›7oÅ“'ú¨uç¿z·qªè‚BòÖ:ÎißBrµîK½÷ˆóšVKJûŠñß,,¯(:•T§Mynœú„dV÷›4û˜o³´Ê?fզΊ´¿jíñGg†Œgº'é¢ —й`Ó!¨Ku= 0ü ^K¼UæšTÉ1k²ª¾nI>–4B&ë J-™‚²-‹Q¨'4†È-ø´Z*z¡‚/‰¢¸/÷no“Nq>Þko„v¹3߯M‚ᚆ‚™éa)Jó½·„§ªÜfu¥èêa +Œb1—OºTדGÅÔšÏÍoÉñtȦŽqBt¨²]Í™8ïσЛyZ2í7+Âs}LòâP–§µ +}kp:´…|*åÑŒÎZªHcn +ÒSsn6Øö¤‡±Ê CéWUÓÒÏáñT „"¿vX$¡|™9ÖuK5ƒjÌM¡B&XÑØ1J!#=ù"ûcZäoHó=ä…õ±¾K©%®Îƒh‹öZÄÀ¾!Ú2ŠpÌ„$G‰X¦Fî…I/;l”‹ª0l¿Äòg}þ4D,”Ä„A»´çÂ&cCß”Ijw3± O¡fͶ,µQá÷ÞÊS™‹1.räMmuS·Í¹ÊË8r ÍI¼… ½Z3F¨>Fq2B˜B<9÷Š9'vôëîø^KÇþ‚!†CT£‚ÍRÍ`¡P *ŠûXîW, 1ŠqåW­ºZéj´Uº&)ÍœìZ™ q¨ð†®ÅTzVhK?³‰1_§P_úc‘@"Œø´[ª9Ùàà2$ÙÆèŒ.ò¢n²$5RþªT¸ÉF‡¨£J¬ÌÐL4õ%Hh¶L5¾•T+ú>‡`ÐÝ>·&ïêmëOIÑO¦çÚ9’sðÅ­Ë´“NëÂõ<]É+ÏÜ]÷jž Fc>§»T×ótH!Os}VÑå0Qtø‹®–l¶èšTÀ¥èkÀ[tõä>Ÿˆ‡¾Ë¨ŒQß>¤ëñÍÑÏñíÆ7Ÿr(ç°"fÓÊi©fäSõzɾx瑽ÔÓ¢ŸW‚*„ñù‰[âG'îöZj2w7kAÚÌÍlÞþçJR°û<¹¿úÎ3.ºiZ3CÄ—ý—rÉ(GóÇd?M¿î.;¶ŽxÓŒK¹¤}« (”8š/°¡:âè]خɉ»Ș !!M\·TsâGÜ”ø÷ê’ÿŠoï¾{ûòß7OèOõµ–NF÷tÛ‹Xû6xJ¶&¡[ãt£<ØAÔà<ðVJ†e=e褪U‘Qè ¤hLŠ–ö$øî˃É‹my4V¨‚†‚ü¡´Ã¬²Vé “‹ü4SPÕáV¹PiTG= ©¡¾wòN‡d› D»ýu~Ò¤QY Ç*'—¦Õ˜” +-Ÿ’ÖTòà_æ5 +HÔ;…ÁÅM݈°AFu«þ¸bâ€C»ÒUƒÁa—@ ùEµ¢à]ÖÌäè!õ™ŽÑkwíÝ··_€ ô¶nlä²PǪ<ºèè + +ïîMÍa­«Îÿ“]¹ä[̪5À C=ÑNDc hTü——ðˆ×¯ؼ¾ycÜíåjᦂ ãé£Ku½ð Œ¹œ}n&ÓB/EÆXª÷Òß’u[ÉétÈ·‰Ë:ÒY2´ŠÌ(Zec÷v•ö +;™Û…îÀåðÀC¬/ô‚uéH-ŸžQ«þШaìx®­tkÒJ¦qæÖaiÖ㢦°Ô®#ÓЧ“Ó Jœ­€ªJš«&¶+‡RíåS[þv^®Ÿ98 7ýø‘f—Ü÷>¬ç®JË<õ¼ŸzŸM­»GèÍ{-QÙBô_S÷ŸÜò¿êp޽Ǟ^^œ­ë}ÆkñW_V›'—qˆPðÿ–ñÌ›²b‡·ÛðžØ€ÿMYÓg‡:û¿€ïѧ¼ ¯Ž%ÏlçÂõÏîÔ”µSøÃ÷K!A$Œ¼¥õaê›?ý#¢þ4†%„õ~úƒb;b±¾vSX¨ :( +ê÷Y‘u<ÚUá?ºÆ+å¾gÛ!Ô~ñ3ÊžQ[–SŒ…uåúî¢0þaÕ…‹åo¿?d£ '̧¥ÿä +endstream +endobj +1439 0 obj << +/Type /Page +/Contents 1440 0 R +/Resources 1438 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1437 0 R +/Annots [ 1442 0 R 1443 0 R 1444 0 R 1446 0 R 1447 0 R 1448 0 R 1451 0 R 1452 0 R ] +>> endobj +1442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.7083 717.9621 207.6966 740.9309] +/Subtype /Link +/A << /S /GoTo /D (a00146_g1024f8a5fa65e82bf848b2e6590d9628) >> +>> endobj +1443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 557.7163 227.254 580.685] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +1444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.1194 557.7163 380.3883 580.685] +/Subtype /Link +/A << /S /GoTo /D (a00043) >> +>> endobj +1446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.0274 456.6895 204.9409 467.5935] +/Subtype /Link +/A << /S /GoTo /D (a00146_g2c64c8c36bc84f9336f6a2184ea51883) >> +>> endobj +1447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.5705 456.6895 377.6438 467.5935] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +1448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.486 407.7474 256.4846 430.7161] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +1451 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.3636 322.487 147.1755 333.3661] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +1452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.6736 322.487 182.6919 333.3661] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +1441 0 obj << +/D [1439 0 R /XYZ 90 757.9346 null] +>> endobj +1410 0 obj << +/D [1439 0 R /XYZ 226.1581 533.8997 null] +>> endobj +1445 0 obj << +/D [1439 0 R /XYZ 90 517.2837 null] +>> endobj +1449 0 obj << +/D [1439 0 R /XYZ 90 367.3148 null] +>> endobj +1411 0 obj << +/D [1439 0 R /XYZ 90 342.9866 null] +>> endobj +1450 0 obj << +/D [1439 0 R /XYZ 90 342.9866 null] +>> endobj +1438 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F26 485 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1456 0 obj << +/Length 362 +/Filter /FlateDecode +>> +stream +xÚ¥RËnÂ0¼û+|L¸»vì`Ž-*R¥>rTÑÄA‘ ¡áÑò÷µ±ƒ(Ê­Šœõx½«™ñ"û!Õ@S™2-Eó º²Ç‚!=°ùÁõ…ûŒÜ=rM5ÓŠ+š•ç +™äÈiVÌ"Åd<à¢ÃÓ‹ß&F«ÜÜV1Btt?Óú³òPçûª©wÄ(‘ñ"›’‡ìÂ%P•B¡còEf  …¥<%À„Júm0ÔšÓ I¸èÀš¼“×KŸ8ô)–(ú$‹ÉÜÂÔ+›9¯+Çß«Yî}\WuÐŒBûMSúèJÖ!y¨¶,gN¯¥0À”)ž$çÖo¦4­©sSø›Ÿ§KÅǶmr³ÛÍA‚]ÈúüB†IÚû²`õ ’ê_VžÇchKPðëéPÖ1ì¬ +$œž‰©M»Üwr:¿ž»ÍÔMÊ!ä!ˆ‹8€ +3s5íÍ´!ƒ¿^›ŸÓÊÔ·ö¸wîñç«C°âendstream +endobj +1455 0 obj << +/Type /Page +/Contents 1456 0 R +/Resources 1454 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1437 0 R +>> endobj +1457 0 obj << +/D [1455 0 R /XYZ 90 757.9346 null] +>> endobj +1454 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1460 0 obj << +/Length 2132 +/Filter /FlateDecode +>> +stream +xÚ­Z]oÛ6}÷¯ð°X8~‹ì˰-k·º.{j‹A±•Ô«#eþhÖ?RiJ´xÙÕÈC,ùøœË«s¯(RdŽÍ™k>n7«n퉻c½²G{;¬Ž -DËgjé4᎑žñº:”›mµîTíW»Í£KáaAÚ- Gœ˜“–æ¹—l{Ü;–ÛÏ}õD°»c]oêûî ¹ëþšÇá ;XBÈM ‰q$0#m,×Õ;Œi]íÏ\UI”¹NRLš-tW#5Áq¦ø‰Ç +¾£TŒµ6¿¢‚¥= +Ò5†ÐXÊ¡î·ë~¤‘8—¨ ‰Û¯v÷=æM†ÃCaD¼6Œãæñ¯æxØÊzm¯ä(J°ñ·(Ò™ð( „˜­½XàUS׿?é cÏ Î¶¾1¦?QIS™˜I£o)¾9crBŒõˆm噯®ÂÌ‹iW€”« vUJ1pUZ×»*ÔÍpÕ@<ÇUé0"^çªuy(MÖ£@4CÔvžt +’Øœ£Î]m‚ DLg#L1 ¥Ï\ˆ|¢Ûž+äÍ4Â…V'RÁ͇þNe2pø0ì‡eÝ÷ÕM½j|ÿ´ ë;è‡òÐ#úž¼:îvKV,Ì=oëšò§r»)oÝ-ÑŽys7úêTR›ÚQ÷x{‰L??‰Þ.©9{·$jqWíN ûl 3hi +2™À>„!¬‰š¬/!…ɦ–@}yX_!a¢¾]W_]¸¾†âõ„ñºú:î쥺Ÿ(3jÒÆ£édxEÌ–Uf#¥Ìm>¯ÌtªÌ,¿ÌÌýíª¹»º5·¸q¥Ù!Ûʺ_lËë„8Ï©?”}A–»Ýæ“›'5ãâ²7®ªSM—³>”ì JHO—•H1Ρr0¸„ÂT ¥u} …º%4Ï)¡t¯+¡Õ¶ÙÇa(5aÈCAâ[Vå˜ r!0ɬœª³üÜ}äÚÓM&߯£BzsU ©5lìa C„]gã.lã¡x†0"^gãò¶Ù&l,8$±åؘ™Y‚γqˆNØØÃl?¶CÿzsIò"óÎ’SÈÅ»8 L¹8­ë]êf¸x žãât¯sñÞ®D&&sE€8¤±e™˜1Ä­ñòL S&v°v³ÔtQm·#ï«î‘¼›x4{çó¦ÿÚ¯³ €væ2msJ‘ X_ÆçÆyœjùÜÁ`Ÿ„)Ÿ§u½ÏCÝ ŸÄs|ž#â }þhfŽÑs±0ùâÈ‚CAò[´Ò2a¦íòåð±|Úî!:awk——\˜çѵŸœ÷O¨wù}|4¿­ªþÔc÷‹%‹O›æ¸wË.éíÁÓÆ<*Œ†Ïì]E35ÿ¤<HAÌú`ª÷Ø«&?5| ijÙ&›S 1%ÔE¦t¬Àˆj¦&áa`“ MÐuMb  7‰¡xF“ˆx9vÕþPž›ÔiĘ,€,8$±åÜ™ÈÜBdfƒЩá`6‚7ýà³ÛÁwÃâÍ|˜ê +§¾‘ÑRöq}8üDèñ@bÞ¬þ@’Ê^¹3ãÔ +ˆ!fK÷ΑISq™þÀ"B)¨?8ÜÂTHëúþêfô‡xNH‡ñúÅ¿õcp7¯ýQ†ˆ 4 ‚ˆÙ²º‘¦²9Ïì:Õ%ÌFðÛþKç ýšßŸ×¯Çßÿ09 »­@„¸È„™jŠ0eÐF’‡^ ^t׺°×‡â^ˆx×M T,žÚEÛhÒ\˜©Šé\éL8BÄ–ãtZHdî™›I!:át ^·w°§ôÞQù©ÜlíÞϤ§©]ÃW˜_¤SA‘R +Úrïa›7 x:€¥<êfxz žãét¯_²[}l÷âÇ@U Që¥óàPP[–£YŒ?2÷mBtÊÑf#øš™í;1ãÙZ¹²{•ëæi[­»›õ´ÝíÂ;—Ùh¡Pm´xl÷€0e÷´®·{¨›a÷xŽÝÓaD¼~£¥»ÓÆv§˜›é¯™S$óàQ@1[ŽÝ‰VHJ¹Ù¢v÷°ÝÏlvÇÝòÞÉå>i“Ö¶å]h›(svB +Ž$QÐæ‹‡Ö Ötµº°µ‡âÖˆx{ˆësêJs$Á¡ õˆ-Ë×B#ÁXæîKˆNùÚÁò|¸¹ËÓà½Bÿ³Æ|Úu«:áw»n_\f2N˜@\1h—ÆÃ`»„)»§u½ÝCÝ »Äsìž#âì5ž[½æˆYc¦³àP|Ä–åwÚ¾­›¹Q¢S~w°/õ»KÔ×Þ®Þ3­/2wÑ1-´ô Ðí'²„דŠÎé"ìóP6ÃåÉFœÎá‡ÍCµ¶»‘ÅM–MÝaÒÊ#¦”¹íä^œ}À†•ôûÖÿû=÷Ö +w/xï±›'Ђ©v‘Ò±¯´»PlÄ/ªºÚ•‡ñ;P¯Ü‡—vRìíÿãg”=£ý+ýcÙ¿õnñ›Ýé}ñá»ÿ®~®›?ßÇ/»ÙWñÏdé?G†¯endstream +endobj +1459 0 obj << +/Type /Page +/Contents 1460 0 R +/Resources 1458 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1437 0 R +/Annots [ 1465 0 R 1466 0 R 1467 0 R 1468 0 R 1469 0 R 1470 0 R 1472 0 R 1473 0 R 1474 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R 1480 0 R 1481 0 R 1482 0 R ] +>> endobj +1465 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 615.0435 211.932 625.9474] +/Subtype /Link +/A << /S /GoTo /D (a00147_gef14e83c046e19ab9fe9d1bbcca276c2) >> +>> endobj +1466 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 601.9516 194.2086 612.8555] +/Subtype /Link +/A << /S /GoTo /D (a00147_g1a1bc437c09ddef238abab41d77c3177) >> +>> endobj +1467 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 562.8165 207.3095 573.7204] +/Subtype /Link +/A << /S /GoTo /D (a00147_g8411c95a4d89367ad2d9d6bde1a3d537) >> +>> endobj +1468 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 523.6814 185.9097 534.5853] +/Subtype /Link +/A << /S /GoTo /D (a00147_g61db1dcb7c760e4dd5d60bf4e5576dca) >> +>> endobj +1469 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 484.5462 185.9099 495.4502] +/Subtype /Link +/A << /S /GoTo /D (a00147_g88d2ccf7cd821f89d9a8df7e3948b56c) >> +>> endobj +1470 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 445.4111 182.0444 456.315] +/Subtype /Link +/A << /S /GoTo /D (a00147_g0a8bb9d6d0f1f56852ccfccbbad6c5d8) >> +>> endobj +1472 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 406.276 196.4303 417.1799] +/Subtype /Link +/A << /S /GoTo /D (a00147_g64a238a5c02640a7a4aef004163aeb47) >> +>> endobj +1473 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.6975 391.5148 410.5505 401.4201] +/Subtype /Link +/A << /S /GoTo /D (a00147_g0a8bb9d6d0f1f56852ccfccbbad6c5d8) >> +>> endobj +1474 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 367.1408 190.333 378.0448] +/Subtype /Link +/A << /S /GoTo /D (a00147_g81ac47cee1c18f6aa479044069db7ca3) >> +>> endobj +1475 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.83 352.3797 416.683 362.2849] +/Subtype /Link +/A << /S /GoTo /D (a00147_g0a8bb9d6d0f1f56852ccfccbbad6c5d8) >> +>> endobj +1476 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 328.0057 224.0965 338.9096] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga9de254b8aa308eb4aab17efdde622d2) >> +>> endobj +1477 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 288.8706 198.383 299.7745] +/Subtype /Link +/A << /S /GoTo /D (a00147_g26a14b8dae3f861830af9e7cf1e03725) >> +>> endobj +1478 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 249.7355 188.5699 260.6394] +/Subtype /Link +/A << /S /GoTo /D (a00147_gde6634974418e3240c212b9b16864368) >> +>> endobj +1479 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 210.6003 205.825 221.5043] +/Subtype /Link +/A << /S /GoTo /D (a00147_gdb971fb1525d0c5002f52125b05f3218) >> +>> endobj +1480 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 171.4652 190.8911 182.3691] +/Subtype /Link +/A << /S /GoTo /D (a00147_gef6c4140c632b6a406779342cf3b6eb6) >> +>> endobj +1481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 132.3301 195.3145 143.234] +/Subtype /Link +/A << /S /GoTo /D (a00147_gfbd5fc486dfdf6bf6fc9db52b1f418c4) >> +>> endobj +1482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 93.195 200.8635 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00147_g7b2ac4b18bd2ac3912fe67b3b17158c3) >> +>> endobj +1461 0 obj << +/D [1459 0 R /XYZ 90 757.9346 null] +>> endobj +655 0 obj << +/D [1459 0 R /XYZ 90 739.9346 null] +>> endobj +102 0 obj << +/D [1459 0 R /XYZ 90 739.9346 null] +>> endobj +1462 0 obj << +/D [1459 0 R /XYZ 90 716.6852 null] +>> endobj +1463 0 obj << +/D [1459 0 R /XYZ 90 634.1338 null] +>> endobj +1464 0 obj << +/D [1459 0 R /XYZ 90 634.1338 null] +>> endobj +1471 0 obj << +/D [1459 0 R /XYZ 90 425.5097 null] +>> endobj +1458 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1488 0 obj << +/Length 2344 +/Filter /FlateDecode +>> +stream +xÚµ[ÛnãF}÷WØ ÷öý’—Å&Þd3@€ÙŒ÷) ŽÍ±è╨ñL¾~«Iv«É¦º8-“âaUuñœêb«Íþ±…£ £ qBêÅÃö†.žàãnXù®ß¦€oïoþú=w Gœæzqÿ±µ QœñÅýã/KMôê–+º<ýø®;¨^^6뇪YïwÝO»v„SÇŒ[J³úíþíÍ?î£ã>.%4ónÿsóËotññ½½¡D8«¯pB sŽ/¶7’‹p²¹yó¯h§»ÐÞ05€Óúå÷C½bjùy»n²(p‹Šòà¦ì{d©M7U~Ø%.hÇ$MÍ#mŠ.°6Â|wûŽ‘¯=iwuàhÓ_9¬„YÖÍÁg¨Ú}ŽÚÏ_º þãOëýé¸ùÒ}þX5ÕErk VJ_…ÜZÂ)W½# %xj°@qÄo ùÀ/Nó¡óDGÂÈ첿ì7›, +wJΑæ;³6‹ìŠ®ÌL®ŸÁ%ª÷(ïþG¬>¨×»§žÛ¢ ƒ_âdw™Ö’îìuj¶æ–‰²ºGá¤>›+qºè4R:q:ƒÑ©ç9„.Æ0¶è¼Þ­›uµÙã@8Ð0Èr +"¨ì>³5‹ÑL@câæ–ï]ât€ù~¨›«ûtt'Ûêóú´íŽõJÒåÓ¶Þõ·×ô÷øqüôþ};”®?ù8ÖÊéЕûpóY<äâè)'RÒ¯©õ5¡¬#Ò¬“‰0T©Á‚,¿A¿¸0†Îg( #³´1!о63$…¹Î¬ÍÑ…2’(ÉçÉ"TPÓ¢Èè;SÍsø^ÅY"Ü౿ÿ3bQZe¿ªë¿,E‰”ab 0\,‰Á’XÊ~£XR¿3Ä2p>G,å02»A,§Gÿ"°Ý·­ÿ/‹‰CéuRºrB" +‰$·´ãùRÔPDÛ¹¯)º¤ óQüÜæ.?….¨ê~ýûîÝ|Js ™VשÿŒc8Zÿ §tb°Dé²ßHéÔï JœÏ¡t9ŒÌnJéëÝcÞqÿБ4Dâ?·–ùMh©M‰ÓÒibùÌî?P>šo}&ß{{Üfÿº)?„‹l—V«íU +¸4p)¬€GÊöÔ`íˆßÀö_œíCç3ØŽ„‘ÙMÙÓò$Û57¼œ†ˆBüçÖÛ7u±jK¿Èªç¾ ¤èÇÌñ¾¾Dr¿(ãëùS·Œ³¶ùøSó¯ØÖHietæªkŠËÐPRœR¼_‡– Ë`Ü~¸ßÇEæ|iY8¿ÐtaÃk,4a¨ÆŠÏCü ü~ZqxëŒØLš15ò}YbE‘Ù Û¬ ${§ºä  0ïN¡—æ–ùµ”PÎÌìñ<Af·?Ó¿7SµÅ0­ÊC(Ä1§ŠpjFCǦNaü]ÚÍYŠ.–k KSzÑw ˆ+ea¶ŒUâøR?¬ýŒ:Çâ¬)4pBÚkLšBù58TÏ= +—óÙ\IÍE§Q̉S\Ë©ã9R.†0¶çÊÝ)[I@€¼<þBœ[M´ + ’>©c¸ÉJ9wì޹Y½,b –6®<è*{åL]½€¯¨‚…&BÎm RtIÁÖ)xÿò0WŠ•ºŠ‚ẄºƒI8Àp 'ÇA– 8D¸4ŒEµžFç•æ»¤,Bà†³F#¼¨Ü7“©o%‰4ðê1Ì ¥"ó«}7EÙÈïåÑ<6úÌn:zèsÅQ¢¥aåDâÞ¯¤0aÌ8y¥á HäÛÉ™ ˆx4‚±ÝøõÄKõøx˜¨9Úa„C2P¸vðö)Õ4FÁ¶Ô—àÀc]€~ ôÍ8FA-ôTÏÍVÄ#ÙÊí^,ÍBPbB”Q˜c!ˆ°#¿XqæÎéØÌö*EŠs„ù¾ëE2µþнrm÷M_žŸ÷Çx:Æ"~ÿÝ»jy±Ls˜Š•רÒÜø•j¤F÷ ´BŸš¬¢ÇPwh‹•zÑaýlÙO­C0,•G0e¯pÍ×»4ÍÝr[ GšƒQ­šø®ˆ¢%Bô¿xð&|»ØÄe‚¢f”%Z€—yšIÐ%ÍØp­£]Û¸Þ’—út&n’=Îh¯›Úÿîá3Û¥YÍß”æýTyÿ¼ö{ß ‹Û²ý]¾®7›îóª÷‡>¬C}¬›~7 NáÚÙ©?‰N}o`ô²j'dÀo§ã©Ú´ÛBÛ“º¿üúÜ~ÅàÝö¿ëÃaè.>WýÍûðÖݺ}adá úÖýÐáîÛú]sÌczö,}áÑ ç—GÐ.0 oÏð©÷ß¡Íøö»ÙëK»a8Lê´Æ‘­w¢sî3âÅŸ8šLíºg„Éé}?Ì2Ý}eÿ?oÈo; ·0ÁSéi⌰á +ú ºý:»úP5qs|ßÅýÞúÇ{êOïÓo¸ø†ÓîÌ¿Möyà Ѳ)ýFèp7çÝþó—§|ùSÁì1‘ŸÿU6§!endstream +endobj +1487 0 obj << +/Type /Page +/Contents 1488 0 R +/Resources 1486 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1437 0 R +/Annots [ 1490 0 R 1491 0 R 1493 0 R 1494 0 R 1495 0 R 1496 0 R 1497 0 R 1499 0 R 1500 0 R 1501 0 R 1502 0 R 1503 0 R 1504 0 R 1505 0 R 1506 0 R 1507 0 R 1508 0 R 1509 0 R 1510 0 R 1511 0 R 1514 0 R ] +>> endobj +1490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 702.9069 191.2995 713.8109] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga8933ad15a2e2947dae4a5cff50e6007) >> +>> endobj +1491 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 664.0494 180.9385 674.9534] +/Subtype /Link +/A << /S /GoTo /D (a00147_g58bb90796c1cdad3aac2ecf44d87b20e) >> +>> endobj +1493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 625.1919 204.1906 636.0959] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga87feebc7cffd4d8300e776cf64e4fec) >> +>> endobj +1494 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 586.3344 180.9384 597.2384] +/Subtype /Link +/A << /S /GoTo /D (a00147_gb5fecbc62edd128012cea0f47b57ab9f) >> +>> endobj +1495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 547.4769 214.9411 558.3809] +/Subtype /Link +/A << /S /GoTo /D (a00147_gf2dbaceb10c67783a115075b5b6d66df) >> +>> endobj +1496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 508.6195 203.0756 519.5234] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga20812098a4663c8a9fc4ce8e95391b6) >> +>> endobj +1497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 469.762 203.6235 480.6659] +/Subtype /Link +/A << /S /GoTo /D (a00147_ge5ab69d40013e6cf86ef1763c95d920e) >> +>> endobj +1499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 386.9994 175.2098 397.9033] +/Subtype /Link +/A << /S /GoTo /D (a00147_gdd1ab3704ecd4900eec61a6897d32dc8) >> +>> endobj +1500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.0255 386.9994 203.7128 397.9033] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 348.1419 185.1725 359.0459] +/Subtype /Link +/A << /S /GoTo /D (a00147_gaa585784b0914cac1d37f07f85457008) >> +>> endobj +1502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.9881 348.1419 213.6754 359.0459] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1503 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 309.2844 152.9837 320.1883] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +1504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.9538 309.2844 211.6433 320.1883] +/Subtype /Link +/A << /S /GoTo /D (a00147_g8096b0c4b543dc408f4dd031ddae7240) >> +>> endobj +1505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.459 309.2844 268.3701 320.1883] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +1506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.2043 309.2844 331.8917 320.1883] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 270.4269 171.8826 281.3309] +/Subtype /Link +/A << /S /GoTo /D (a00147_g04b053a623aac7cd4195157d470661b3) >> +>> endobj +1508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 231.5694 172.9089 242.4734] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +1509 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.8791 231.5694 236.859 242.4734] +/Subtype /Link +/A << /S /GoTo /D (a00147_g79c4110211247df3fb30b8cf1c4c02af) >> +>> endobj +1510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.6746 231.5694 293.5858 242.4734] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +1511 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.42 231.5694 357.1073 242.4734] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.5934 93.195 210.4073 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00147_g61db1dcb7c760e4dd5d60bf4e5576dca) >> +>> endobj +1489 0 obj << +/D [1487 0 R /XYZ 90 757.9346 null] +>> endobj +1492 0 obj << +/D [1487 0 R /XYZ 90 644.2869 null] +>> endobj +1498 0 obj << +/D [1487 0 R /XYZ 90 405.9509 null] +>> endobj +1512 0 obj << +/D [1487 0 R /XYZ 90 194.2442 null] +>> endobj +746 0 obj << +/D [1487 0 R /XYZ 90 167.7584 null] +>> endobj +1513 0 obj << +/D [1487 0 R /XYZ 90 167.7584 null] +>> endobj +1486 0 obj << +/Font << /F29 499 0 R /F50 1172 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1523 0 obj << +/Length 1357 +/Filter /FlateDecode +>> +stream +xÚ½YßoÛ6~÷_!`/6Psü)Ry°¥ëZ ÅÖØC[ŠÄÄFeɳä¹Þ_¿“HѲ$KrÒA Š<Þwwä}äÉÄÃðG¼{RH0î{Ñf†½Gè~5#vx ã˦ÀÏw³¥ À§¾w÷Pið ”Pï.þ0çj±¤ +K<ß¿þšÏ ¦ñ6‹÷‰6íÛ,ÚotZ„Å:KŸîÞÌ^Þ9\k–`>)Qÿž}ø„½Ì{3ÈJxxÁˆõ63NYý’Ìþœýáô˜jBŸwœ‚gŠ0oÉ|¤HÀ{¥”@˜(  "h T€0fÒ“Œ!pŸWÑxù5Ülß´=$˜"É(õšJÛÐÜX‡ÍXÙ³{´Cï,‘$LôYÈ:9'VšxÐ÷Q²†•@QÇHÁ,4r餯à;ÚJxT‚zK¿ÖcJqRÝêÓt]m‘jׄ…y&ëÔî#¡ˆidæYN©7Ù~½E+ƒ™HäSnæ½~Ð;F:6’÷Gó\Å6þn·Q˜$±ÀðO^XðÔ +»µ+¨Ö¾`Fª€}ä#ŠèV ãù±qñdïçð>Û:®UZì\#åˆñÀDé·07³‹•Ueiª£SÔîµ®ãg”ŸûìæeÐÚ™¦NãŸúâö.K—ÿê]f¤Ömäý¢Zô›±ª ½`OéòN纨üî7q§7YaÛ«,/P{ÏÖÙ*¤˜¤ÃݺœÐB)Ĩ¤zøê|îØ×›ÎµTi_¾)¶=‰Ì8øÂÅ`TœÐl[W û¢‹¨ÀY¡Î/»\‹a·´–Ø…NR]Ä=^K`b"‡÷‚Anë2^;^hC)8¦º_‹ÑÖ:Âß”c8˜Y0'4ŒÝÑÕ o"jײ·¯ðuìÍžÌÞef|bÄΈ=ú² À¬O¡öíN/¨˜ÿ³ÎöybÍÑÆav˜5ú’fåœC¢ãGÝÏæ-8x’À΀[ã}¤M»ÈÌ3=ñ=¼U|_Ž®¬XÇ.è³vAËÚ-CýаB«m ?¶á—Z*Â_2¬æw«µÕ¸Ñaš;ç +„0Á+Võ~s§¬j²ŽÂÓŽŒÂÔÓî´òèpŠìÅ#†“ùNˆÁ3¦)uùá°•|ªÔ¤C† BW§ ¿â”éZØ{Ì8±aÒåI.ØptœÔxGÛïÂ=ÒǬ~9µü˜½cÔ‹DÃapR#ð]mMö%µ’«Ù·*Ö¾ÙÝùù×b~™=£$Ëõtæü¥Ÿv9íõÑò >ìÓÆö`زT0Á^–ëu°<³Žì¬Cy,„Ç…/湆JHk†Å0×4¥.s UPí*!'rÍôÕ\Óµ°—kœØ4®ŒÎ‰kFÀ;ÚI&œŽkëS9é†3ån!F²ã;ÕŒF÷ÓKÆ×%&Í«¦æ*½FtœæÊ kI)R[RöMŸONè´0HdÛw~öÄMxRa»â¬eX¤ó<Üû.QWå~›_ÌZØÊH $k›R—³–p‰!S³vúê¬íZØ›µNlB%:šS):‚ÜÑ6\ŒžƒN¨FÇàÛz§Õ£Ã¾»‚t¼£mbI:5®&±££wjU:†SY: ßÕöm +S‰ÿ¯ÏŠÏ/LÛŸÎ ²èý !rÄþ³¾ªW¿ +(˜BØÙ§3’©rQ…‰Ü§Î”26¯tªw¡ûÚWÇþmÝx³ b¾·/„Ú'¾¡ì†ÚÅ ûöVVi™=yº¿4Ôq¿Í¾uç÷AX_”þ5'Ùoendstream +endobj +1522 0 obj << +/Type /Page +/Contents 1523 0 R +/Resources 1521 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1437 0 R +/Annots [ 1525 0 R 1527 0 R 1528 0 R 1529 0 R 1531 0 R 1532 0 R 1534 0 R 1536 0 R 1537 0 R 1538 0 R ] +>> endobj +1525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 720.0194 154.358 740.9309] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 573.2189 135.0008 596.1877] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +1528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.9895 573.2189 174.014 596.1877] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.8794 573.2189 241.5202 596.1877] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 417.2379 142.7416 439.4893] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.6071 417.2379 210.2478 439.4893] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 273.8347 142.7416 294.7461] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 132.7034 135.0008 155.6721] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +1537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.9895 132.7034 174.014 155.6721] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.8794 132.7034 241.5202 155.6721] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1524 0 obj << +/D [1522 0 R /XYZ 90 757.9346 null] +>> endobj +748 0 obj << +/D [1522 0 R /XYZ 314.6454 681.6068 null] +>> endobj +1526 0 obj << +/D [1522 0 R /XYZ 90 665.7144 null] +>> endobj +1485 0 obj << +/D [1522 0 R /XYZ 379.3917 536.8636 null] +>> endobj +1530 0 obj << +/D [1522 0 R /XYZ 90 520.9713 null] +>> endobj +745 0 obj << +/D [1522 0 R /XYZ 231.9163 380.1652 null] +>> endobj +1533 0 obj << +/D [1522 0 R /XYZ 90 364.2729 null] +>> endobj +747 0 obj << +/D [1522 0 R /XYZ 226.1581 253.0464 null] +>> endobj +1535 0 obj << +/D [1522 0 R /XYZ 90 237.1541 null] +>> endobj +772 0 obj << +/D [1522 0 R /XYZ 379.3917 96.348 null] +>> endobj +1521 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1543 0 obj << +/Length 1882 +/Filter /FlateDecode +>> +stream +xÚµYÛŽÛ6}÷WèCm fy—”—EÒ4¤É}H‚@+Ók5²äZrœäë;IYwz{ÁbaŠ<œ©93Ybø#Ë/ ˆq¹L ¼|€î b‡70¾i~¹[üü+–Š$•Ë»]-A$(¡Ë»íû•Dr½¡¯Î/ߘF|2mk«_…ž5½³ì@²´ µR㜓qÝ1.Ëè;Î%b!¥·:¯Á{,ÊuîËÒ²Rù”÷à5CŒDtÞ} ÊgÅ@šs ê+Â$ –’cb9‚hÓF ÃP!ŒÈA¼•µÖç_ãÃ1S哾f‚Å(™UÍQÍùí!8@ab̶c\Ó&îU–›Ëš`8ZÙ%S<0„áY'9Ï„¾,mÁOCEç=•Ópx¯ö¾\­¾RY®ª‘…SŒ¦’ί¼Ay”¥™µηí” 0äôV'4xŸ¹ÚŽ‹ºO²¸eÄ RÇ#Ê=np(Ÿú4­¾~35?:!T J"3øÌPxzeÛØrm–:b—›F±3¿zJve}´G]æ–„w +51 ÜöÍüÖ/Å§æ¥øô—ÄYæ˜Ýµ}U§Æì©šÕû]7¿÷Èf%Q7+a‚Y+Ó ¦3m\ÅY7ìNå9¤–xçÒ˜õ¼Ññhœk¢±Jó¤8¤ùƒyÒŠ\‚äö&µ)“ÍY2;1^S ”¼gi|ï¶HÛ˜î& –üjµ½ïôlØÚµ«ÑoVZ)—¸¹¤·ë¿Æyuï¡Ió´¯OלÏN*ÝA2 ¬~¯’ÏÖö]cûIu}Ôqíu--G¤ÙÕWÎÃpZ&‡!’ð’ÏZ 4Ígâ–ˆr#ŸÍ(~4 ìe3‡Òöm÷É1¡0"NÂYë6 È£·/kœÂ8ƒ¢&]Ókvpî¾ÔYþÒÑ”3`ÛÙU;Gs_ÖSGZ¼ÏŽ\a .Aļ”GýPZ›‹ˆb¸HÞÌE þ+.Ц¹(W—NZí壗6TkPœ*?ñìéuü±æ ¢¾ÛäB³¾ˆÕmfÒvèkÝÃÂS¹ëQ›¹ë®Ò«`ÜÚÝ»ú–ÎL1=Ý;vè8ž”eB€Õ» ¼[×âX¤yå +š á-a[“Z‡IŒçôpõÓHüoWcÕþTœö#µVæ.·Í¤S=i2&B*„¤€ð3Û¨é˜H!òHw_à‰sª‡ŽÆÄvK)2ë›k-âQ=6_t•ÞPŽxÔäjõp°‹ìËZÂI©I8ì:¼‡óËw(Ÿþ´ñå!+ƒ›—ïð^õ}¹ó÷‰„!L9¿öåQ>”æ¹Od…¡·:¡ÁûìÈõ‘aˆ‘`,ô¸Á¡|êÒÚd9!%Cy?êß'Ë"ùüÉ’E›ÿì~™Wæÿ¿,$xš™ÅUàí´> endobj +1546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.2077 672.8902 338.5322 683.7941] +/Subtype /Link +/A << /S /GoTo /D (a00147_g8096b0c4b543dc408f4dd031ddae7240) >> +>> endobj +1547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [445.3859 672.8902 493.3155 683.7941] +/Subtype /Link +/A << /S /GoTo /D (a00147_gdd1ab3704ecd4900eec61a6897d32dc8) >> +>> endobj +1548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 638.3707 162.0093 660.6221] +/Subtype /Link +/A << /S /GoTo /D (a00036) >> +>> endobj +1549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.9981 638.3707 201.0225 660.6221] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.8879 638.3707 268.5287 660.6221] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1552 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 485.4889 139.4144 508.4576] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4032 485.4889 178.4276 508.4576] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.2931 485.4889 245.9338 508.4576] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.8738 374.2304 451.9686 385.1343] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga87feebc7cffd4d8300e776cf64e4fec) >> +>> endobj +1557 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 339.7109 142.7416 361.9623] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1558 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.6071 339.7109 210.2478 361.9623] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 192.4983 139.4144 215.467] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4032 192.4983 175.0106 215.467] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +1562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.9994 192.4983 214.0238 215.467] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.8893 192.4983 281.53 215.467] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1544 0 obj << +/D [1542 0 R /XYZ 90 757.9346 null] +>> endobj +1545 0 obj << +/D [1542 0 R /XYZ 90 739.9346 null] +>> endobj +716 0 obj << +/D [1542 0 R /XYZ 480.5514 597.9626 null] +>> endobj +1551 0 obj << +/D [1542 0 R /XYZ 90 581.3198 null] +>> endobj +742 0 obj << +/D [1542 0 R /XYZ 226.1581 463.4224 null] +>> endobj +1555 0 obj << +/D [1542 0 R /XYZ 90 446.7797 null] +>> endobj +715 0 obj << +/D [1542 0 R /XYZ 226.1581 316.9271 null] +>> endobj +1559 0 obj << +/D [1542 0 R /XYZ 90 300.2844 null] +>> endobj +750 0 obj << +/D [1542 0 R /XYZ 391.2972 152.8075 null] +>> endobj +1564 0 obj << +/D [1542 0 R /XYZ 90 136.1647 null] +>> endobj +1541 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1570 0 obj << +/Length 1722 +/Filter /FlateDecode +>> +stream +xÚ­YÛŽÛ6}÷WèCe fyE)/Фi¤hS¿%A •èµYruÉîöë;/–%Yò6Áb!Jž93‡4Ycø#ë¯(b~°NŽ+¼¾‡Ï¯WÄto¡Ûøu·úù7­#4XïöB@§„®wéãÍ–†X`¯}ó'49öºñ®LÛ\êöË2i²hâ&+‹Í§ÝÛÕ«ÓkÌâ, Jë?«Ÿð:óÞ®0bQÈ×ð‚‰"º>®|ÊìK¾ú{õ—ÃÑÝ€©Ùq¦¦ÇÓ£ð*ôìÞÔ`}zEYlÿ•U©ß²½~6©•Œk˜ÕåÇøtʳDÏW3`Y±ñ±÷uC±W~ÙìÉôR 9ÄÍXä%mUÉ ñŠx¦3)‹B&güClÆßIiU¦¹±f_VÆ,ýx8dÐë®Ù‚"Îõ”ã"Õ+VÊ67í;³Š§2ÏeŠÜ8êûݸ]gª/:™¬¸W/'7”ÃT ÷`íuºïÎ hëÎðE ŸjY¤#›X~È0ÊàbåÁ¯N¬)riœ5HíJøRÉcÙÕ‡²n.G+ͺ¥Ô¢áN 9Â$ë ðQ (™ÜgVhÛ—‡R!Œ`‰Ü(XçÆWññ”ËúÅP3Á Xsª}…ćf×§¾T÷¦ë}Ï@‚„ñ) ûÑà䜘2±’u™ÝÜCÉÈJ"FCÞANjIÿMéÿi¤Ôgˆáh¸*×§oå—Ôp•úFæ…lÒ‰¹ ˜O‚…¹[©%å#4=÷.UµG‘J‰ÁÍN°òKvŒp•ò.É3ˆé± ! ÐἜԂú1šR¯3Жp B9XGÐKùcZd&1*o5ú iÉä1AÝ(÷ú©†ØRÕf'tä8 ý^îe%‹DÚ´ø¤Ÿ‡¦9¥Ÿ!á'qžÄÃ?1K¥£åJ§K¶ÎŸCÁÎŽAâ«E> ÃÎ*Ȉ"B 4`Œ½Rí€ól>Wz²n⪱¸–]ÂR_UO3×N^ƒèä ®æë¹™édÆ›]!S~‰MãTéB•m?Ùš"ÍúÔMy:YŸª?ÜR,rÀp؇ [Û‰o{òã­5BUÓVîRöôýÔ7ÅÇ!â„Lln'4oÀ«·µ±—EV»6òömaK?‡jžå¹þ^ž´W#»fŠ$2;×áêÇ çžyÈŠ´T}Z6¾ßp(ž¢.-”!P$MÝQ^—b2[™Ù•ß¾5½™´½ä!&ÍÂä&‰Æ-ñ|K|ßWt)®Ù-a%"m~i#^? iw~SÚŒÑTqQ³æzð(ÿ2å÷2m « T¡CTÏ3}eTGi׫–D5† +Ô·º[#ÕÒ‹©Z]8+ºêSÞ(ÕÊŠ*ÉŽŠ•ÕHŒ…:Û]È\päN­&¼ôÂ+"ð²Á04ÄSˆáÇ`U[ó:hé(7…pxŒXÇGÓa¶/´ºüÕ)Ó*Òl’ǵßdG©ò`È€ÑêP0‚Ã"ÔCƒa†b)9ùmÀD:Ẅ“¿–ÐÔ¡èÒ©SÓ¼f85ù¯"FE§Ó&§«ô™AŽ5bž>÷¥®Ógˆ,D©ÞHŸçT?›>-œ¤ÏNlž?ú Ÿ³yï8©%å#´þ0`6Ô~Ý V~ÉŽîÄ¢œðy78©õc´>$ä¹üÓçñG–?~öÇ®W©!™¯O»ÀžÔt¢GüÎ'rÅëô±¹W³”Ž Aw†ßXŽØ'2Ø —PZŒî²­le¼Ædð€É`Ã]°ã.çŠ{¶uD]°£.ØR—eòû¿Y +Èwc)þõõW…)-Ûgp”ß-o?O½פ:¦]f’‰üq¾3ë –œ988œ ñ]Y5VgÚÊËý×”¦qŒ µ7žTª®»¾Z‹àpÉýùzÔ—º^„mÀppc=šSýìz4¶p²91eb}lNS9>LÇçó®qRKšGhÓ9 HDÈÃÒë·ò‹ê‡¸ 9 V\,l 'µ¤|„¶t‘ã£Ppq³¬ü’#ÜÅ‹Œ8eѼœÔ‚ú1ÚÅEŽyf!"ü= ñÜEŽŠ“o»ÆþäA m‹Éb08Ž<ø¦_Cº_sBBí§¬E‚…Ý …~@)Ê7¯e!«Ø¥Zëûw¶ñVå×Ö¼Ã~AÙ jƒblî×öªºÚB:þ…Èúýeùøt/‹©³É„—þÿºdœendstream +endobj +1569 0 obj << +/Type /Page +/Contents 1570 0 R +/Resources 1568 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1565 0 R +/Annots [ 1572 0 R 1573 0 R 1574 0 R 1576 0 R 1578 0 R 1579 0 R 1580 0 R 1583 0 R 1584 0 R 1585 0 R ] +>> endobj +1572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 662.2363 139.3246 684.4878] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +1573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.3134 662.2363 178.3378 684.4878] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.2033 662.2363 245.844 684.4878] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1576 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.5599 561.3549 409.5084 572.2589] +/Subtype /Link +/A << /S /GoTo /D (a00147_g0a8bb9d6d0f1f56852ccfccbbad6c5d8) >> +>> endobj +1578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [469.3939 427.7347 513.9963 438.6387] +/Subtype /Link +/A << /S /GoTo /D (a00147_g04b053a623aac7cd4195157d470661b3) >> +>> endobj +1579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 382.8338 142.7416 405.0853] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.6071 382.8338 210.2478 405.0853] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 136.5223 135.0008 159.4911] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +1584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.9895 136.5223 174.014 159.4911] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.8794 136.5223 241.5202 159.4911] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1571 0 obj << +/D [1569 0 R /XYZ 90 757.9346 null] +>> endobj +805 0 obj << +/D [1569 0 R /XYZ 384.3631 621.3448 null] +>> endobj +1575 0 obj << +/D [1569 0 R /XYZ 90 604.3735 null] +>> endobj +744 0 obj << +/D [1569 0 R /XYZ 226.1581 517.3041 null] +>> endobj +1577 0 obj << +/D [1569 0 R /XYZ 90 500.3329 null] +>> endobj +804 0 obj << +/D [1569 0 R /XYZ 231.9163 341.9423 null] +>> endobj +1581 0 obj << +/D [1569 0 R /XYZ 90 324.971 null] +>> endobj +749 0 obj << +/D [1569 0 R /XYZ 226.1581 249.8568 null] +>> endobj +1582 0 obj << +/D [1569 0 R /XYZ 90 232.8855 null] +>> endobj +1516 0 obj << +/D [1569 0 R /XYZ 379.3917 96.348 null] +>> endobj +1568 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1588 0 obj << +/Length 1348 +/Filter /FlateDecode +>> +stream +xÚ­XÛŽÛ6}÷Wè‹ Ô,/¢DîKÑ`Ó  +¤‰û”W¦×FdÉ•ålöï3I],™’»Åk‘ÎÎíP"†?HÄY—û<3Ûs–èÑ †’ÄrÎÉâËêÝìõª6lqqmößÙ§/8ؾw3Œ˜Îþ®õ˜…jÃÐñ8aSÎGa×ÇC¾XŒñü—úŒ1Í”=óþøõ¼9~}Øg›Ï˜ã$ϲ_ÍÒ1/J˜ªN +&XËø˜r„–•‰W°ÙzÎüüso=©Õ©¤qd™wäÒ;£t¤ö[RžÚ'E"6µÿúÇúpL•¯ê=¦C$ áq$ý]ä²Á;1 q³KŽ JzÔ +~€ËZjÌtO›6]Å#X†N¤ƒà’Wk÷†BöM__ÛH÷ŽXbÛoͯޒ6¬ƒvÈ‹ì ãn,lsWäç®bAÄ\rbßõ?å˜l}}¨ör½—ÏÕ(“]ÍÔ0–ÚYŸ©m©ë™J‚X|I Ù÷tœá–S‹’”÷ü Iõ0HR»ÿ•¤º&Ô¸žÞÉ$åuNCR~ûޤ:æ_BRuê2‰x8Òc[BžÄå…îî9Þb=†oî°=|ƒ ÖIi|…:åé÷Eô3Ød¡×7µÐˆñK]Ýk4ÜÜac>¥ÃênG€ÂiÚn·U…Ê×èžÍ¯ñ…Nâ­nŸºuNïб¿CŸ”y»HÕÄ–üQ]{£Ø¬Ëõ#ôÂîÑAñc¹«ŸíbvYçN^VÅ¥›V»½~Ûc¢~ùÓ#9OÖ™™Î³ôÙL=(3W¢´ò*Ìí­xõïÊÌV- f×fhcµ Ž~*x0¥ÝuÌÓÔHV5 ³Y%ù¤`´d8¶×2XÖóæép>•]tG€bµWðÜ™ ’œ“ê̵£tܬ݌o;W<—–õÖcºNT»[oºÝÚ¥[Ǽp[è­&ï»Rx—ð£·aµ¥®w,3$©ž»k‡x¸¶‡d˜kk1 Eçqj1 +CÎý篥нâëÐHtÍ6wüVM¹:«£Ö„kŸ Ô—<Þ¸RаÄÑH\[Rž¸²ዉLä3}3õrQ-6™Œ¼jØhÄ~OÛÿÁGã—Üøy›O„—OšÖí˜ÊÇ(&Þž¦‘ÁØíÿwY´¾Úm;•|³+O;¶‹[P8¥#ï"—h¦ œ4%X—_8 "a<˜|\O"½èãgõõVÀÂ:×Ìn½L¸›„>ê•©b]“Œ;ï_îáæÔ³jñewÔf+ÅØº¢êPîö\ &w™ë>ÿñüØïÍúËì€~¶ù:Óendstream +endobj +1587 0 obj << +/Type /Page +/Contents 1588 0 R +/Resources 1586 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1565 0 R +/Annots [ 1591 0 R 1592 0 R 1594 0 R 1595 0 R 1597 0 R ] +>> endobj +1591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.486 661.9112 256.4846 684.8799] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +1592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 604.5791 139.4144 627.5478] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.486 476.2657 256.4846 499.2345] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +1595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 438.4462 139.3246 459.3576] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +1597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 220.9948 139.3246 241.9063] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +1589 0 obj << +/D [1587 0 R /XYZ 90 757.9346 null] +>> endobj +1590 0 obj << +/D [1587 0 R /XYZ 90 739.9346 null] +>> endobj +1515 0 obj << +/D [1587 0 R /XYZ 226.1581 577.8727 null] +>> endobj +1593 0 obj << +/D [1587 0 R /XYZ 90 557.7368 null] +>> endobj +1517 0 obj << +/D [1587 0 R /XYZ 206.4623 392.0581 null] +>> endobj +1596 0 obj << +/D [1587 0 R /XYZ 90 371.9222 null] +>> endobj +1484 0 obj << +/D [1587 0 R /XYZ 226.1581 192.2311 null] +>> endobj +1598 0 obj << +/D [1587 0 R /XYZ 90 172.0952 null] +>> endobj +1483 0 obj << +/D [1587 0 R /XYZ 226.1581 96.348 null] +>> endobj +1586 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1601 0 obj << +/Length 2329 +/Filter /FlateDecode +>> +stream +xÚ¥koã6ò{~… +ˆy|KÌ}êí¦Û]l³¹·À¡-ÅRlálÉ•äfóïoø´^¶A`ŠÎ g†ó"™aø#3…g‘ˆb\ÎÖû+<ÛÀô‡+â–—°¾lü{uõÏŸ¨š)¤$•³Õ³Á ”ÐÙ*ým.èbIcáùñã= ž„íà—2=î2;~_®û¬h’&/‹Å«OW·«@×±%˜$šêŸW¿ýg)°÷é +#¦b1{ŒˆRt¶¿â”ùÝÕÃÕ»`6ŒNö–ãQøŒìé$’ˆ¥Å’`ŒçÿH³ß1¦…;Ó1?<«ÁóMš4É.+~ÇÃ?Ñ̬…$K9’”ÄójëÀ®M³µãòÙþ&Å‚ˆù«›<6Ëòyù”©Ð´ìH“Ó Äó ˆö´jX0_Í6qóÛ¤vÈ«*_P1ÿKÓÈNЉƒwl­Ë¢ÈÖZY¨¯­X Lâh&¥D1IÉÚ-ÛPCyÇ +aÌW£HQndsW6ÙMŸ*ÁEŒ’ËdÔݶ6ŽPD˜8aë(N¯½9VÖ^Íä!©’}Öd•ýüöñþñÛ×ïÏ\Bæ«…b04«ûcíÿäpÖ™›x.+/ìÜéäùX¬O„š²»3+’§]–EÀçpíW"2œ¿·†™Ÿx½ïro®B’®™é-»“-£-rv«f„ %u†Ë³p%˜»?uØ\ñž®Ã ˆNˆq¨ê¦:®›ÒG—ñL€}©Ü½ÖKÕÆÁ|m«ßÃ/Û†f7Ä«9Ò÷YÛý€ ŪÇDßòÐ2ámÊ}\š0(‚,B wxƒ;yºû}F©ˆQL„x«¸ü„¸†x=Kù!IÓêq 8F@À è¢ÌÔ„ÐØ<¥ç¥ºR#ʉ­² Ž—aĹîzp †òè­¢ ð¢â5¢$rD†1CŠ +6!C5$Ü ‹%âDvéʪ‘ »‰#áds& öÂÔx¢V`{×6RïÉ\¼ª²=¸vJï u^lìpõîÞxRëê°qv’rî¼³q—’·Ý¥s?{¬M4ƒ‘! +u“TJìøB}/vùãºÛl„‰ú­sí%=b#/öt`-œ0‡C ð›lþÑ3°Û•ë¤Éê?"ðãkÜ.1ÇmsÇ ÇÈSð­–›JÇœk˜¦R‡•ÚVô ¿SŸ‹TÀÃïnïVö ¤Ô¸“chЬUÖTIQïóº>aÎ÷:ä¥Â¨{ÚÖ ó—|·³£u³ÃÄþhõÀjí @–²Ù»ô†8‹".6j¿y’ÙºµÂlþî§W`™¡] €Ïä!«ò2Í× ´W7S•ë¬ »;ÞË6_o½5ý.<÷ñ=-}~ɺ ˜ Ÿ#©ÏÏžCŠqÊÆ+4£Ë«‘˜ÏÆZ¢xÊSyøe{Ã0EâíÅ¡v²Ûa(b(—Ôc¨ï·<Ôlš³I)×Å çñ头 u>)å@Z¼!#½H󔑉Žf¤ìto8dø'Ÿ§¿ül² 2yð!É.×Y¢. mðÙþÖǃu^—Î@Ív@yªÜÞC战’—ÍOcíêôÌ“#äJ#ãÊõ·N—cwåGí¼Þ­>þzûøåþö®(\†šr0Š¢QÂæ +‰XÉ©ÔÆÃ/Û†bâuV^´pÁbD ã=.z*PS´Ø‚iƒÈt‚¢”ê +ï!/ÖÚ'ðP=0Õ‡\ûé?yeâ ÷..txqÜ?Ãܹ+5¸¼…Éš]Ø–ÕÿÀkã@Ê* ˆrj|7ìËГ֒ª:°c£{OŽúf1«gàŸÊ®ü²½a(Ñ!^-´ŸWºDþr÷pÎcéÆ@—“±ÎÁeÒ§ûK’‘²ÕRY ¼†v«PK°‰ŠÆ/Ûð#ÔûX5ñmSõ¹3.QD¡ê2Ò÷^jŠ>X0v½ÓûðÑbgR½. å9뺙R°•w +ûó.¼ mù‘ú«ÓÇÂ"§ ËRBÕi¿þÜT ©´êÁjþ`‡×vQôšÈøš\S-Ù°]!.¹ “Ýý?¯œ-ÆF3ǨPCRM5YÚPçãØ.’‚ZÝÜëëí;õùà6ÆÀ… 7à¤S„„KÀzEZ‡pо‹"ð@#"èÚ'C„ÃéýߺÔl€¥vÛ$! ë–/ :/3([ˆ d"!hƒ]’•kWlºPM“u@Cª]AQ…Tu]ª®©Eäò)wU›‹'úvûx"\ü07¾?DˆÂÇqÁP(Q%‹Ée›oC·yª ËVÌÚü׬ÑíR(».üEê'å ÉFƒĨ@tyár|å2å­Lù>ºê•§¾\¹«ͤk&¶öŸJÜ­%™{ð»oŸ?Û‘Î5¦¢!k¾»Ô!KIè|e›žW(ä2”N9±6Ô…rŠHìœØí÷dØe—´y4G*&†!‡Žë€Ãq{0Íb½oh=ômŽÃÅeѨ)Êl¶§åÒa[U XÒ>õ mU?Åǯ)޳§õ.ÛŠb¨u@n—Å &ȱµói˜¾yüæ¾9ÇÑå¾ùº×®òÎæ9«2H×M–Ž»Ù˜Ö !M¸¹Ùijfyk¶YLwF·:“MíÖuiõîó—‡Û÷f‚„ íõ/wwnÙY@ÿÞú]õh·-°Ÿzîz`ÏuV¤í£83³¯îÇMzhü=‚±Qû=€º÷€¿LôÈÓÓKÛ.¯›¬8ßü&J &8D0 $ÔTă/Ûð#/}¬gÛµ”(˜\öèÛ²‡ÒíDJ ‚d’u ÿ­~-áPn +wŸa\Ô˜¼–phÆúš<ä?Ýv¨ËÐØc.d+-Ž1pD¤ë×¼Sǰ…°N´ÿ³Øt@jP»ÐÀŠ>ꇬÈ*¨ºož¿øÁ'Ý¡îßPvCÝ“6ÅXº';eýKÞðíÛ_—÷å÷×MVŒUœ#Rú?‰«cŒendstream +endobj +1600 0 obj << +/Type /Page +/Contents 1601 0 R +/Resources 1599 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1565 0 R +/Annots [ 1606 0 R 1607 0 R 1608 0 R 1609 0 R 1610 0 R 1611 0 R 1612 0 R 1613 0 R 1614 0 R 1616 0 R ] +>> endobj +1606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.7506 575.1408 195.0552 586.0299] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +1607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.8193 575.1408 315.7315 586.0299] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +1608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [359.1284 575.1408 384.9216 586.0299] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [317.5642 496.9047 374.8887 507.8087] +/Subtype /Link +/A << /S /GoTo /D (a00147_g8096b0c4b543dc408f4dd031ddae7240) >> +>> endobj +1610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.2809 446.4365 239.2097 457.3405] +/Subtype /Link +/A << /S /GoTo /D (a00140) >> +>> endobj +1611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [472.3426 434.4814 513.9963 445.3853] +/Subtype /Link +/A << /S /GoTo /D (a00148_g69a7a4951ff21b302267532c21ee78fc) >> +>> endobj +1612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [117.5067 422.5262 147.7231 433.4301] +/Subtype /Link +/A << /S /GoTo /D (a00148_ga22b04cac8cf283ca12f028578bebc06) >> +>> endobj +1613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 227.0741 135.0008 250.0428] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +1614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.8662 227.0741 202.507 250.0428] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.3577 117.9412 220.1509 128.8303] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1602 0 obj << +/D [1600 0 R /XYZ 90 757.9346 null] +>> endobj +1603 0 obj << +/D [1600 0 R /XYZ 90 739.9346 null] +>> endobj +1604 0 obj << +/D [1600 0 R /XYZ 90 620.2512 null] +>> endobj +773 0 obj << +/D [1600 0 R /XYZ 90 595.6504 null] +>> endobj +1605 0 obj << +/D [1600 0 R /XYZ 90 595.6504 null] +>> endobj +771 0 obj << +/D [1600 0 R /XYZ 286.4315 154.5275 null] +>> endobj +1615 0 obj << +/D [1600 0 R /XYZ 90 136.4373 null] +>> endobj +1599 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R /F52 1229 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1621 0 obj << +/Length 2589 +/Filter /FlateDecode +>> +stream +xÚ­ZY“Û¸~Ÿ_¡G©ÊBp’„󴉵]‰=ñ(O»[S”ıX+‘ZŠÜñüûtã/‘ãJÊ5&6º›_h4Åþ±…¦‹XÅD -v§;ºøÓ?ß1÷x Ï×m‚¿mîþò®šèˆG‹Í“á1¢8ã‹Íþ—eD¢Õš+ºl>ÞÛAz>ó]Zçea'žšb‡w¸Õ,ÖK%V¿m>ݽßÁN/%"†bÿ¸ûå7ºØƒ~Ÿî(:Q‹g¸¡„iͧ;É…¿9Þ=Üý;ð±Ì‚±×“^-ab±I˜–£T‰"”%1 ÁaLñq$M(ñ"‚ИJÇç²ÎÞöߎQNbÁù¢Íp 6PÈ-¹ŒÆ$fB]¹¡à‡¼Øe«µtYr€Zp·óÙŠ©å÷s¶«ÝãúàVœËª¶£¢9m³Ê>Îݺ"«ŸWŒ.Ëêwû`ûR»…eµjI—oà^êej§w &ÿDYu 4—¼øÖGG‚;Å*’=tðQõÍÑ|mÑÓÏà4ä‹8}جX²üòùáWª(ü±¾:Š2"Y¬¦¨f”PT’˜2ÞU¢¬†.âJ5aÑ z}%ŸrK„’5Äá­WZˆüXt”è{©§™-"yÒ–Œ>‰Ù ÈvÙå’V/«H-I_{Q" ã²Æ·µMm•‰é¼IY`‚„³+OT§ÉÏÇüRg¢ñaã<"1Ààß_oª&!Q1ª¦sG›êv&2R±Qéƒ,­ÒSVCÐÜÊ"lT[Ù„hN8â$ U1 ¡/ŸKrKüU¬#yÿŽpM…©ŽÔŸ¬‡°h½Ík;¶™ÉøËL8Î ïK­Ì„63áÈf&5åbõ‰ÙŒ[Tv„èÖœÛè~ÿ==Ù”'DKÜ¡$ _›†Ž&@fÒ@v<–k‡ÝqOvU!yRØ('AòDs*ôy¡o\±Pì¢N’¸Òm ùœ}®¨DÁ…F^Ÿ³ˆh +¦ž|ÿ@5#{È …ÇĈñL 8Q<²>ô.û•R^ä×**uqpÌ çâŠkçëOöŠKŽî!ä7²³" ¦c1‰¸´%Ê×ì)«2¨\BþÏÇûÇ~|ؼÿ|ÿåë*¢ËÍÃôº½5{5¾ô|é1­ýã¬|¨ëóè4¿8KthŒ½€',±¯>‰ bá@M½:äû€Àã%ó)”%‡b 5" ÞZž)IðCE¨ÂRuòfLdÌÉ>­Ó]™‰<ÏçO]õ7yD'žß1+ÆØ™ä´²ÛwÏÓÖê !¡†Ä<,µõ´‡€‚ÑÔúŒs+Sâ`×T`] û4:ߨ+lL…ÉcÞª0ñÎÏ6ã$0ªK{u†€QÙÔvº'P§PaÅøídõ@â'{ÝüýÞð“q´üR_§ë‰Ã)PRÇ᮸¯DíÌ6˼º®J‚òwtˆlÞò¹R>ïèá„óTº}([qåx{äÎU‰õ Ö¹ÉÔ}éá¬XVÞ•žÊâ!J:ÓáŒ}9C·«›ôˆ0à©úò’…µ'|ªMUC{ÙÁ:KŽ&²l-eŒjkö×=V%'H>{;¿}ñ˜ҧô{~jN]m6 ïØ}æ]gŒqq +T*Ñç ˜XjnÇ'ϹшӦ.O`ê{ox¸«Ê³}hué0¿”vƆ +~¡#gè@À£ÊÓÚ­ï)<â.’j>1®Ñ5µ¶†Ä¹ý=N+QH "_I5»Éyúu{ÁÈ.7àëkÝÓåfÙÏ¡¤—j L³óT3*p(ýÁ¡£® +6 ‘­CƧmSÌüÑdÕ‹{h"-ñ‘»£*ÎxËàØd‡$d5C–ºg×ÐÀ;ë?N¾Ýv¥S³ã¨Ö†7 +FÃ΃ÕÞdÁئº]0 +8‹P•èÙ¦›{-ó‡rGËÀ@ÖÊ㜶ó8ÜíKS0½,ÊÚN}kàdRÔYfoÐÜo 0¸¬˜Kƒ<˜„è9mªüš0Ý\må.ûìRçEj·žµ€]ýãSOã «¼öÇòâäæÅ•x$µ رàÑ5etÚVÝœ³u$cû…!xÎëÃ5¥ô Ó„'1Ø<¢ÜNÍÄz _· M:äëc½²žÓµ”èK¤÷ëêÔs®@5§I$ˆÒpÎïhÒÛmföE“—³Ú$yæv=›…G,`¢•+Õ{ºÖ°ÝæÚÛå±®)íµÊ®o¨u®ePsÝ©íþ×nXÞÎ}$µžÉ-ª‰LÀ9¤l—&_ÛS`*7ô5o²vQÛmÀÀ#= @ A Û$÷¢PõväþäþP)ûó¾7戟ùîàJëK—z›…Êk˜Ô8ÛCBÎd×Õ€žªUÄwზJMËôD™½Š9éÈÜx||-fY~Ël¯bËäG€óîÍUL˜žkƒµ©nÇ8 ä ×›oŸL‰þáöÉPÃÑ}3™Ø8ì둦 v=Y2­à:P͉p³ÇȾP `­UOèí7÷ôsâ|';&,†±`bæÝ=՜𷙞‘Ö°jñj<ýœ¾¨Çs¶Ýs ŽaãHJl«iÕŒø!·vãH&?Ø8bI’ü?:G¦Ã»6&“~CÇ<ƒøê&ŽtMœK]5»aó^6–îX¬I¢¢¹D~Ý^0Ì@C¾¾ˆjöçGlƒ [ƒpÄRq_“AkÐQ åwšMCnÝžSGÙvÏÉ«XdÏ××@×$Â/µòµ¨úÔ†|½Jù9Ýï«Çý„ä°«16Z šAM˜¸`7Q»Ù©«¬~#Ø +·ëÒñ,+’˜$‚F¯E2ÐÏ 9äkdÑBÀ…D‚ñiÕPpÉðcÓ]Á•ÿðÓ78 “ÀÌtóÍQ™ô».5g—#üÇÓëqMèw÷?Òy¢}bØ_¬Ý¼‘×Ô^®R€ÊJÙ¶8dJW9õØ +x…¥½¾“‘p<–;Ó22wN“¦p­ ˜ÃçG;ôÀöûH¶Ã¡ÝA”kÕÒf;ŠJ/?ØYëp¾¿Ó”(Oe¹ogÈÅ(ƒ­“±;”—ÌϽØ9rºôËÌý +OÍã¹OÔ~Ý^0rvðmg·m^ìoa¥Š ukÞÓ¨žjF©4‰´]=ÐÚZÛB½†ÿ˜ :ærmàJ:T¥Í«›êéo~½WpŠâ°¦«H¿óT3J0%Pt5i‡9t_üyÁŸÃ¯lï +”Èrèį+îߎýˆÁ`ÜŠt?#PÑÿôÛ ƒ|K˜è$ãÞO$þ·MN Ôõç¬È*ˆï}÷‹É¿üà†_ãnwWú–‹·œÚ;N©ûyÔÚÎ7_¡ÝiïÊï/߆'G8Žàó_ðØÂrendstream +endobj +1620 0 obj << +/Type /Page +/Contents 1621 0 R +/Resources 1619 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1565 0 R +/Annots [ 1623 0 R 1624 0 R 1625 0 R 1626 0 R 1628 0 R 1629 0 R 1630 0 R 1631 0 R 1632 0 R 1634 0 R 1635 0 R 1636 0 R 1637 0 R 1638 0 R ] +>> endobj +1623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [460.7601 717.9621 502.4137 740.9309] +/Subtype /Link +/A << /S /GoTo /D (a00148_g69a7a4951ff21b302267532c21ee78fc) >> +>> endobj +1624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 706.007 136.9336 716.9109] +/Subtype /Link +/A << /S /GoTo /D (a00148_ga22b04cac8cf283ca12f028578bebc06) >> +>> endobj +1625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 607.5313 162.0093 629.7827] +/Subtype /Link +/A << /S /GoTo /D (a00036) >> +>> endobj +1626 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.8747 607.5313 217.8992 629.7827] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1628 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.6109 416.392 236.4535 427.2959] +/Subtype /Link +/A << /S /GoTo /D (a00147_gb5fecbc62edd128012cea0f47b57ab9f) >> +>> endobj +1629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [309.2914 356.9954 361.4951 367.8994] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga8933ad15a2e2947dae4a5cff50e6007) >> +>> endobj +1630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 254.0374 139.4144 277.0061] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4032 254.0374 178.4276 277.0061] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.2931 254.0374 245.9338 277.0061] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.7506 176.8276 216.6541 187.7167] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +1635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.5252 176.8276 343.4374 187.7167] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +1636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.8343 176.8276 412.6275 187.7167] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.7656 122.7745 457.7454 133.6784] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga20812098a4663c8a9fc4ce8e95391b6) >> +>> endobj +1638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 110.8193 151.6186 121.7233] +/Subtype /Link +/A << /S /GoTo /D (a00147_g79c4110211247df3fb30b8cf1c4c02af) >> +>> endobj +1622 0 obj << +/D [1620 0 R /XYZ 90 757.9346 null] +>> endobj +743 0 obj << +/D [1620 0 R /XYZ 350.0021 547.1921 null] +>> endobj +1627 0 obj << +/D [1620 0 R /XYZ 90 530.476 null] +>> endobj +1520 0 obj << +/D [1620 0 R /XYZ 247.4281 212.04 null] +>> endobj +1633 0 obj << +/D [1620 0 R /XYZ 90 195.3238 null] +>> endobj +1619 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F26 485 0 R /F52 1229 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1641 0 obj << +/Length 1580 +/Filter /FlateDecode +>> +stream +xÚ­XmoÛ6þî_¡}ì!âø.)Ã>lK×tiÖ¸ŸÚ"pd9fKž,7 †ý÷݉¤¢w·C ¦È‡wLJÇã™GáyõHHíÅ»õî ûùŒÙaÆý&à×åìÇßyäE$Ò\{ËM%A3¢8ãÞrý~®äÂç! èüøò +šŠÎ¡¦ñG¾>nÓ¾Èãã.ÉÊU™æÙâãòÕìÙ²ÖkÍRB3Ôú÷ìýGê­Á¼W3JD*ï>(aQĽÝLrá>¶³ëÙŸµ3PMZä°² ÏÇ.¨ê¡CE(  „Ãòþćö`z@YŇ$AÈ™ç@ÈÉ1ÝߤûÕz]Ü” _S:ÇöO¸jíGDj©*ä¡,ޱÅà¬ãzçYE)¢%“žÏ`I2¬&üPXþØH÷¥XPÐ +I;×¶çUô{lœ,âgL‡gð†Ø‰±AþÜ62Kº²^,ß\^c'ãB*7&2Ý Ì +þÎJ¾|÷ú5N0_ÿˆZs·i¶®¤ i—míþ€œ»>è¶[ƒopŽAª}¢‰ê’0"” +%""l!j¼Z0p„bµKʤ8œwõ3ÊI 84 gHî[¢xÃF0ð‡†¦Æz&ˆ0MSà@ˆ¦b)“T´/ïm8p±ÍHó‘oÌoéPE²ËKÛ¾Ï%'1"ÕpPkpõ„š¢Ê¢*¦öyQö´r  ÒbZ«õ´¶yÀSè–Öå•%U+;în“´ÓÌö%å:X^üe:nÝļXZ©9óy*Lû|5îó +ð!Õ&ò¼MÊc±`jž:<›Ö^£Ô‹¡Ý«aŽÈÞæAXtG+Žwò¶µ~J}Wj3V¹ˆÞ2#„uQ~bñtJ9P‘Nß²£'· +¯É!ß~ZhˆM}"JÂè tJ{W*'O)S%.*š³s‘| ”gé“w¯lìݦ™unˆöµ…S\º GŸÄÄå>, šKiCâ&)’,Nì¥w_æÙÌWÎêÙuà8?ßbä±]ï^^ݼ»¸ºùíÍååucc{øÃ´=îì>º«·'nœuÕüÎái‚Cô‘ææÒDAÔY¥óOÕ”6mɶé¡L2ǘ¢ÝmçT)`÷¤d„ŸŒÏ5Üoàû1¢'µŠÏLßô.w.ÀQEG}Ç릧³•Pp &àB·tº|¢câh @<‚ª<Ø€š^ìCÞE„`h$BF&©º.ó½sNä6Íîl¤Ï;ÿ°OâÝÔm6Z3›E®…šŽÍMÔxlR`O×%ä4ãqyRíS:Ð×;qkXÅT +~¾ð…@NR8€‚GóÍ1³·ö'˜­|žJ;\‘‡#&ÿ–˿p8µóZù˜ü ‡Lþ%)F]Ø´ùÊtÃÉÂÎO¨ +‚Ú‚ã7°ÃŽ„š;€"¦ÃÎ豨ñ'xêËEž^,,œÛ‚Ê9cÓ(³àV äôfÕ¨F( +-nm#ò~}Roª†š‚†ò‹¯çæ„)gq0Ôß +ÌýKZ‘H¢cJï’¶¨Sà%ÍöþôàÒ4¸+«â±º&G«äßd¾èE£Ñp :“µ¡)©«í¶JíA˨"J' +ê&j"ŒÀÍaïk +j6hÀT`éZ2\%Ö°fTo£GÔ7Ê X»¼€ÀO¡«¥õûÞ¦ýÛ´ü¦E"Øc~mV¤Xø-²"Lj^¿¼^>»¼zóv¡é|yM†^ a2,À)ÐÇ´)»ÿ÷ƒbõ Â&Zž©á´ˆwFp˜(5¯MÁÕ> endobj +1643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [124.6997 570.6986 183.6983 593.6673] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +1644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 533.0943 139.4144 556.063] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.2799 533.0943 191.8873 556.063] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +1647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [205.4361 438.1884 231.2292 449.0774] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [460.7601 376.1104 502.4137 399.0792] +/Subtype /Link +/A << /S /GoTo /D (a00148_g69a7a4951ff21b302267532c21ee78fc) >> +>> endobj +1649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 364.1553 136.9336 375.0592] +/Subtype /Link +/A << /S /GoTo /D (a00148_ga22b04cac8cf283ca12f028578bebc06) >> +>> endobj +1642 0 obj << +/D [1640 0 R /XYZ 90 757.9346 null] +>> endobj +1518 0 obj << +/D [1640 0 R /XYZ 206.4623 473.4116 null] +>> endobj +1646 0 obj << +/D [1640 0 R /XYZ 90 456.6845 null] +>> endobj +1639 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F52 1229 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1652 0 obj << +/Length 1881 +/Filter /FlateDecode +>> +stream +xÚÕZËrÛ6Ýë+4ÓW«6ÊMuXî7.â^°a(· Ef¾®UÚÊ.É…Ïꣿ<†ÛÝ~Xa+Ro¶wá‘ú±ªüó«Íí³Ûj_mkÿÓ¢^t¡îõaÈðñé$ BÈ µˆ@XqÞTå¦z‡1ÝV‡3ÚD!Lõ¸tc@Û§q£,gšŸâ8Âw”&:$Ø>Eƒ;TŽ×ÊÊ`)û¼?¬|MrnUA»[û;ù;N#àsi$q]ÇÍÇÍÃbµÚ'yhƒ´á&Ó•cO¢5n¸­þ~lÅâ.qT&Q™FefŸ%iÇY?YKL4˜Å)Ÿé¿|£›Ìžj›¹äMævÀÊèSP—ù/Öbõþ¸ô^6 ƒCS)¦fÕÁ»âÖÖQÌv÷Á0Ç}ðH]ÐX=„ÁH1ÂázøjfG/;°Œ¹C(…˜n€;:XÖq@ÀÞàŽoÞ}òwdÒHâžÜ!ÏÚÃp¤•ë#°*GŸDû¯öˆÊ<*‹¨,£²‚ì$$E˜+^f§ Ø©ƒvú*‹ UmîÖþY"¯?n|ùq×<´&º¿Pø~‡1…§:ç°Ë;, +9 æíó8¬G^â08$nþù°Ü=¸µÔÓ0!jó'œ¸5:T&4ZpÚª:ÔÞ‡ýô¥ˆc. +ý¡!?X뇇§Â™¥Þà®^WûQô¸ìjŒs!¿ÁzÔÜh„ÉY ƒe-,á èñæ-Ð'/°@&$îÐ÷©úí0Ɉ‚¢Ce2H£ÅóLo2 À5EvXh€  ƒµ¸X´Òõ2ÜJXAqEÆT^d|·ÂGÖ(&'îË‹; +‰æíÄóˆ»G^"n8$î@Ü÷‹Ã§sg alŒ•É"6*p_viZç ¢e¡Ö#4¤õû­û¥Í¦^·¥mU»:`aÔex¢‘&,ëÆ ,àœP"ÒýÇÌ%òsF=#þth6ïa&ÉÈîA0ëüª¦Tó˜!®„*Ô|„†4`.µW®=š\vG¿X·«—NÐváîo[gøû»ÛìŠhÔÌP$ˆÔ±SE2¨¬¢p€`Òà€˜4ï€sà†Qû £h°þÝþæÆŠ}HèL2¤-zŒ„ÞÁ\¯7Ë+ŠgŸw=³wÛCP÷²®.!tAmK0}‘õc ª³J°¼Ô£€ÖaÞNì1oÚ{ä%r‡ÓHâöOǶÂIñ0}­XóÔхšÐæ Ðü¡Zî¶«ËÊÝJ˜2l."wj ÒZÐŒÜ;XVîq@@îÞ ÷o^î}ò¹gÒHâöåÎFå·B'÷ }­TîTs$¸4erÑ€Ü; ÷z½iß>^TñT1$ôe2TbD9Í +>Àò‚B‚‡y;ÁǼ‚ï‘—N#‰Û<<Ø +'ÁÃôI´bÁs×~…/ë#0$wÔî>i…饤n÷ò†_æÕ<¥ cXNê–—z’:ÌÛI=æ-z¼DêpI\—Æoó+¢gþñ&IÃ.²•`4Ó•#O¢¡oA•c¨$…*?!•{”ÿ ÕЍög>+}9.¶õ¦~:÷%j½ +z÷i×› ÂËùðÆ¾·Ï=‡îMœk7@0LÉEf¢12BæìÑÁ²öˆöÈð{ôxóöè“Ø#“F×¥±­wëä” +‘1"L¦þ•#Vé¤þëzäpѵöðÞ‰šçñy¤Á‰B)’|diÖè"@º°¼.FÛÙš0[Ìt[PE.»N=qvG"?ÔIzL!‰ Ó£ˆ¬òéqŒ°¡$›^ÀõÒë:·¯*‚¤¶»°¿:TŽXr÷ŽdÐ.nÀMyâÚïxÕ>›Á0îxÏl÷•,Wõ€Ê{WÙ%Eø«;Ù¶ø Í6î?Ã¥›ˆ Ì7ìÿ1áiç²µ)Æg_hcÛD¶_›¿û€g36ÙÑÎnÿi|€S"ãÞ}ùó›®ÚO,/ªmµ_Ôádb8«ù*^ºÃGA¨ÿŸQöŒâöÊVÈŸEiNB†Ó“ÝyP‚pÿØãÍ»j;lNwú4¤µÏ¿èKm.endstream +endobj +1651 0 obj << +/Type /Page +/Contents 1652 0 R +/Resources 1650 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1674 0 R +/Annots [ 1657 0 R 1658 0 R 1659 0 R 1660 0 R 1661 0 R 1662 0 R 1663 0 R 1664 0 R 1665 0 R 1666 0 R 1667 0 R 1669 0 R 1671 0 R 1672 0 R 1673 0 R ] +>> endobj +1657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 613.8755 190.8912 624.7795] +/Subtype /Link +/A << /S /GoTo /D (a00148_g87f0b54ade0d159fba495089128a4932) >> +>> endobj +1658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 574.2326 195.8725 585.1365] +/Subtype /Link +/A << /S /GoTo /D (a00148_g53fbda0e8c31d4882294c8dc3cb5f487) >> +>> endobj +1659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 534.5897 215.1402 545.4936] +/Subtype /Link +/A << /S /GoTo /D (a00148_g769512993b7b27271909d6daa4748b60) >> +>> endobj +1660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 494.9467 213.028 505.8507] +/Subtype /Link +/A << /S /GoTo /D (a00148_g210e629f7252e4bc8458cbdf260b3318) >> +>> endobj +1661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 455.3038 234.0589 466.2077] +/Subtype /Link +/A << /S /GoTo /D (a00148_g6b16e0bac41821c1fbe0c267071642f0) >> +>> endobj +1662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 415.6609 216.9034 426.5648] +/Subtype /Link +/A << /S /GoTo /D (a00148_g969d7fff37a979737da045e0d538a9bd) >> +>> endobj +1663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 376.0179 195.8725 386.9219] +/Subtype /Link +/A << /S /GoTo /D (a00148_g22fa0681cd463191d7a01fe85d86996f) >> +>> endobj +1664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 336.375 195.8725 347.2789] +/Subtype /Link +/A << /S /GoTo /D (a00148_gffcd2fbe181e2aaefbf970551c302af5) >> +>> endobj +1665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 296.7321 195.8725 307.636] +/Subtype /Link +/A << /S /GoTo /D (a00148_ge23534479ead15af8ff08ace26a47fb5) >> +>> endobj +1666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 257.0891 195.8725 267.9931] +/Subtype /Link +/A << /S /GoTo /D (a00148_g165b603ec150e26efec7be199c9c2901) >> +>> endobj +1667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 217.8198 180.7494 228.3501] +/Subtype /Link +/A << /S /GoTo /D (a00148_g69a7a4951ff21b302267532c21ee78fc) >> +>> endobj +1669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 179.8606 169.3122 188.7072] +/Subtype /Link +/A << /S /GoTo /D (a00148_g118e9d76568ab81ad97f138d4ea1ddd2) >> +>> endobj +1671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 119.8657 138.5977 130.3961] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 119.8657 162.6772 130.3961] +/Subtype /Link +/A << /S /GoTo /D (a00148_ga22b04cac8cf283ca12f028578bebc06) >> +>> endobj +1673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.4928 119.8657 191.1801 130.3961] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1653 0 obj << +/D [1651 0 R /XYZ 90 757.9346 null] +>> endobj +1654 0 obj << +/D [1651 0 R /XYZ 90 739.9346 null] +>> endobj +106 0 obj << +/D [1651 0 R /XYZ 90 739.9346 null] +>> endobj +1655 0 obj << +/D [1651 0 R /XYZ 90 719.3112 null] +>> endobj +1656 0 obj << +/D [1651 0 R /XYZ 90 633.2198 null] +>> endobj +1668 0 obj << +/D [1651 0 R /XYZ 90 197.2909 null] +>> endobj +1670 0 obj << +/D [1651 0 R /XYZ 90 138.8364 null] +>> endobj +1650 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1686 0 obj << +/Length 1900 +/Filter /FlateDecode +>> +stream +xÚ­Y[¯ã4~ﯨ„„Ztb|w¼ˆî°°ìö ÐQ6MO#Ú¤¤é.çß3Ží47é²hu¶v<™Ë7ãñŒC–þ‘¥ÆK%ÒŒËez\àå<þaAÜrëQ—àëÍâóï©^j¤%•ËÍ®á ”ÐåfûûJÈuDc¬ðêòÓ+ +¼"ÛÁÏåörÈìøÛ2½³¢Nê¼,Ön^.¾Û´rZ‚Ib¤þ½øýO¼Ü‚z/1‹å{˜`D´¦Ëã‚Sæ'‡Å›Åo-»Ð¼²N6¤… Þ> +æ*kžD +ÑuD0²?0¦Å-ƒ@’T€.Œ]!âX}²íñúq³&ñê×_Þü.à?â²C«Ù7 •ãÕ»5«¬ªô2z›»ñß—¤¨óúÙÎvUy´£}yvoŸk§@Ym³ÊëÒþYý~MÌÒ_aj!VȨi# +IÊy£ØfŸŸ×ruLÒª4C±òNU~Lªüðl_ÎÙÖ.ìÊÊÒ¾]yñdIáù¹‹#kY°ö˜gVC3rö˜åº´zö˜…!ucO$©Z}odƒ>Þ¸&:Hc\H;É»5+0,y{ÈÎ$ð{°s€Ã½»Ï†{„j†”ÁXr$vû׬TOŽäu'Ö[ò¨Coã½T#®ÆÈ} X›Pô‘ØÕƒQ€ƒÇ´¯Ç`§µDÓÒ刳X÷¤ï.EÚ쩉¼ž%[4T#“X-%xG*¦ƒjx¢¨K5Îi±F3àE„±¶žþîŸäxg¾J&˜"NŠæHÇ„ÃpÚK+¤! »@µt-™Qq»OO)JG +²qO+µTs¢G܌臑PÎ 7i1zÛrO?'~Ä·‰Ðìp(#·­ÛZ"©õ ŽhN…!¯ ÃjŒù½´ô3ÒÇ|ø*;—‡wk 9kd;eQ-Ø´ñ-Õœü·°ù Î7%åÝæ{úYñC¾FüùXŸ†K†„TrÆpO5'yÄÍÞ¤¥¤ØŽ¤C¶áTÜ€§ŸÓcÄ×èQg8X‘ψF\(1 BK5#|ÌÍ·ç~D©gB¡¦"P»(Ùž'ª×†Q¯I½ç-‚\ïÙ± ÷l‰{¼Ì¦¼ü±NþH§MºlW^ªk‘<é!Æ»‚YÏC0OÜóF¤™·"aÒ` ¿¦Ð¶ƒç“íß0æ:Zx´‡½gëz˜äEU¤…g§…ÕÞŒ¬ö0rÚG Ð7¨È >èŒ$ß±•Šó)KóÝsÛk 0ömñ>¯÷n' '£ 6Œ@Ρófpà)ÆÙ̹ÕÒGÝBGǯ1ÔÄ xªÈÒúf‡!5R**4<Á<Õœ +²ž„& §†÷…?ÉbGÔ‹4×¼¸Õ{0bî,éêw»éR[5åŽM…IsïÀ‘Š)¹òô`Ù û!)aGÛÙ>„àü•\Ø’Èí6CåAnÈ”D‚0SîÂîäª!þ¬Yq";ÏSË9Љ©ù }#1ÒT”1ŽûÔ¬@¢é‘ñy Æ£!ýRKùe_C}n?nÜUHÜÄGË1äÊ4˜§gú¿.ÕíþÂAÊ•U÷•9%’*9f°Û'šÀüq£á©ÇŠÈ6¯%3ª4‰z(Ÿ‚W§ío©ô{<«œôå~e“Ç©l2^?É$Ãå±_„ø» ֽϗݳÎwȶ¾×&.›žÇ9Ýö…К‡ñ¸ú¡C6åOæý€ÇͶ‡nR°§ 8B"®ï Þì;pUþö®Lë¬îW ÿ.hë9¸:dSpy2¹ פà+\CÁ7àê +ná:gb¶ÿ#Z$†”Éâ¹àê’M Õ’y´èM´¦·h‡Ñê nѪ÷yõ¿‚%AœÐs`uȦÀòd,v¬IÁW°†‚o€Õ܂řÏQ–? mjx1}Šu©nŸbr8SXÝy‹9%úƒo1Ço1[²{n1'±¹ÞbΈq›¾Åì ½ãsFüˆ¯Ÿ™¯ÖAÑ1É‹CYž"søEÐÿ‡®·Ì¥:›‰––jF¥1·¹ë-†bLԽдôszŒøNBS^ê0:ð*Âj.^Zª­ÆÜ:÷^Œz&L°TÐãó»®½†ßF "\¿´`ЙH!?ê³ióÙ7†W4ïÜ"¡;a±ýP/rI[UŒÁ?dEV%µ¯Þ¼Õ?ûÁKãË›êoþ^Pö‚:(ÆîödgêFßñŽ?%¿}ö_]ÿy~ÊFÍ—ÝJÿÄ1,éendstream +endobj +1685 0 obj << +/Type /Page +/Contents 1686 0 R +/Resources 1684 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1674 0 R +/Annots [ 1690 0 R 1691 0 R 1692 0 R 1693 0 R 1694 0 R 1695 0 R 1698 0 R 1699 0 R 1700 0 R 1701 0 R ] +>> endobj +1690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [292.7281 646.4529 322.9445 657.3568] +/Subtype /Link +/A << /S /GoTo /D (a00148_ga22b04cac8cf283ca12f028578bebc06) >> +>> endobj +1691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 608.5208 139.4144 631.4895] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4032 608.5208 197.6953 631.4895] +/Subtype /Link +/A << /S /GoTo /D (a00036) >> +>> endobj +1693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.6841 608.5208 233.2915 631.4895] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +1694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.2803 608.5208 264.5639 631.4895] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +1695 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [284.4293 608.5208 320.4537 631.4895] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +1698 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [313.4498 360.5812 370.7743 371.4851] +/Subtype /Link +/A << /S /GoTo /D (a00147_g8096b0c4b543dc408f4dd031ddae7240) >> +>> endobj +1699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 124.2624 139.4144 147.2311] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4032 124.2624 262.94 147.2311] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +1701 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.8054 124.2624 416.0743 147.2311] +/Subtype /Link +/A << /S /GoTo /D (a00043) >> +>> endobj +1687 0 obj << +/D [1685 0 R /XYZ 90 757.9346 null] +>> endobj +1688 0 obj << +/D [1685 0 R /XYZ 90 739.9346 null] +>> endobj +1617 0 obj << +/D [1685 0 R /XYZ 90 722.0597 null] +>> endobj +1689 0 obj << +/D [1685 0 R /XYZ 90 722.0597 null] +>> endobj +1675 0 obj << +/D [1685 0 R /XYZ 288.1051 554.1796 null] +>> endobj +1696 0 obj << +/D [1685 0 R /XYZ 90 532.2319 null] +>> endobj +774 0 obj << +/D [1685 0 R /XYZ 226.1581 456.1224 null] +>> endobj +1697 0 obj << +/D [1685 0 R /XYZ 90 434.1746 null] +>> endobj +1680 0 obj << +/D [1685 0 R /XYZ 226.1581 96.348 null] +>> endobj +1684 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F26 485 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1704 0 obj << +/Length 866 +/Filter /FlateDecode +>> +stream +xÚÝW[OÛ0~ϯˆ˜„R©ñ||™ö2ÁH“ØÖ7@(¤F+-kRÿ~vì¤!M/lÝĦJOüùÜÏ|¬à+ìK.‘¢LøÉ‡ý[ýúØ·êý° ø0ðÞ~$ÊWH "üÁM©Aâˆ?žÉ^H8æ'gv‘L'=†ƒ‡à å™Ë÷7óIRh)×¢¢J\ö.§ÞÑ ¶ïÜãT€±þÝ;¿ÄþP»yêaDUÄýZÀ”"þÇ­„±÷Õû\ë±å®(9ÐmÂ$Z”u”ˆ Ö c¼¦“Iê"Ïûx8œÁæØ,ôLpZ+mhÕÙ% Q¦¬Ö³,ùfU#§Ëèå…¦I‘VËûŒ]2«dciž#c̨‰a´VŸ»ãóâb¥¡£Çøî~œ´Ëq„!’¾` NU³KE©Àam #|]*‰¡, C2"°ÐiXTàJ‡!t‰¬ô®òV!¦XlTaʨkDH‘¶:SÏ}»ìÛCÐ'}Úg¦À]Ú]& ò½}´ºc¿VlÏ·:$tá…D7`ëÏɤU¼´<°IwÕ¹žšWæ/í·Ð=ƒx–Å×|¯tsÏ +?²ñ¸žÜ"Î&ÇÇs'ZUf®KB$ƒÎ™«ËÛD-Ï]¤ÆTëÒÓIˆ›×_ùRƒ&HR®u¦R0½,÷̛٭ÛúÒp°D(ïò°Y¡WÃŒ‹ÃQrŸ dÉA!ÑzõÉô’6cÚŽdÈ*Dï)*ʽCKTYQ³pìæ|œUô¥>úæÈxÁmh„\£ªçTF "üÈ7ñ#Ù–a?æ©nÒáNXk-=îÄÝŠ¦ú‹ÇÙvìØD¯fÇõï°#ù/Ø‘¬dGªKœ‹õìØD­fG +àhKv\gúÅì¸ìa';Ö°mØqmnì¸Áô’¶]°#`Ø=ŠMôH›‹Q6û ì¸ 3Û‘#軹76À«©±½f™‘¾œ£×ÇŒuÝö“sut ì°ÿòE°¼ÐFúPÒ¤T¡Û‚FÕEÏ9aRvœNÒY\¤Uw» >U‹S“©¹€Tq@èÁp7^“é¬u?ä€×Oöy8}|ºM'íô˜[jG~~A§Äendstream +endobj +1703 0 obj << +/Type /Page +/Contents 1704 0 R +/Resources 1702 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1674 0 R +/Annots [ 1707 0 R 1709 0 R ] +>> endobj +1707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 542.121 139.4144 565.0897] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 300.0025 139.4144 322.9712] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1705 0 obj << +/D [1703 0 R /XYZ 90 757.9346 null] +>> endobj +1706 0 obj << +/D [1703 0 R /XYZ 90 739.9346 null] +>> endobj +1681 0 obj << +/D [1703 0 R /XYZ 226.1581 519.9805 null] +>> endobj +1708 0 obj << +/D [1703 0 R /XYZ 90 503.321 null] +>> endobj +1682 0 obj << +/D [1703 0 R /XYZ 231.1394 277.862 null] +>> endobj +1710 0 obj << +/D [1703 0 R /XYZ 90 261.2026 null] +>> endobj +1702 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1713 0 obj << +/Length 1160 +/Filter /FlateDecode +>> +stream +xÚµXÛŽÛ6}÷W °›å]Ô}i7 ²@€4õ[,´2½j[ª,gcý÷ER–­‹4E°)žÎ )“Ã?D8Eˆ"ÆelF8x‚ׯGÄ Ï`|Öü:ýô;‚E’Ê`¾¬$A‚ÌÆBMfTá÷oÞASà1AØ6Þf‹ýZÛö]–ì7z[Æešm'Ÿæ÷£WóÚ®sK0IŒÕ¿G>á`îÝ0b‘Á3t0"QDƒÍˆSæ;ëÑŸ£?j;PMèZ§°2EX0c)ñN”B (A„Ú!ŒY„Œ!X>¯¢ñêK¼É×zw{¾B‚) +¥A“ôÜ4·Þa;fÞOnè}ÃA‚C&ºÎjãeMlçŸÕÇÌ-o¢ +W{o¶g¹Ó"Æ6è.;™yõÙü§§gèÏ*Æq‘Æ~S¹yc;Ïézm[IJ›n;§¯÷®ËQ_šy›„FlX›¨~}äJ!©\P/ëãéoÖǶ‡úXîÑÇÁØõñ‚éÛÑGñÃôQ]ÒLJd“{‰$Ó£´Ðëôò·l“Ç…c-Ÿ'œîÔ)Ý­Tnþî» .Iƒs]†\]'uMt¿ÔÕ¨!©#Óf^-k~‰è”È)È[Ÿ´¥K3­JGD‘ç54UR«·_+B©ä’žÐæEº-+ê›ùJ,¼Ê±iT*d»x£oŽ®Íº¨þéË +åR’]P¦&ª_™(Ücñç·) ¸ßJ] èS—mðè¶'pêP f\©‚ÞÖ¸tN†#P£:Bpª?ñHðSÃsP˜_ìÊþ{CGhÀ3¨nÐçÏ> endobj +1715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 717.9621 139.4144 740.9309] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 473.5762 139.4144 496.5449] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +1714 0 obj << +/D [1712 0 R /XYZ 90 757.9346 null] +>> endobj +1683 0 obj << +/D [1712 0 R /XYZ 231.1394 695.4109 null] +>> endobj +1716 0 obj << +/D [1712 0 R /XYZ 90 678.4366 null] +>> endobj +1677 0 obj << +/D [1712 0 R /XYZ 231.1394 451.025 null] +>> endobj +1718 0 obj << +/D [1712 0 R /XYZ 90 434.0507 null] +>> endobj +1676 0 obj << +/D [1712 0 R /XYZ 351.1686 188.4371 null] +>> endobj +1719 0 obj << +/D [1712 0 R /XYZ 90 171.4629 null] +>> endobj +1711 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F26 485 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1722 0 obj << +/Length 1393 +/Filter /FlateDecode +>> +stream +xÚµXÛŽÛ6}÷W[ °›å]Ôö­M$@€45Ї$Xhmy-Ô–\IÎfôß;¼ÉºYö¦)‚`y9œ3‡Ç"†$ˆpŠEŒË`µŸàà†_Mˆ›^Àü¢ øe9ùé7Š$•Árc,H‚%4X®?L% +g *ðôøúm¬òlÆñôóŒàiR”)tÍøæ˜­*è•ÐXNE4û´|3y¹¬ù{‚I¢Ùÿž|ø„ƒ5¸ùf‚‹”¡ƒ‰"ì'œ2ßÙMþ˜ü^Û±fÁÐ.9…*‚…nè5P=´B`(„!¤§¸È–‡˜˜¸p*JÒ±9¦‡»ô¯×Å]5[HŒ§¶GæÍýY‡¸D¡‚Ý^ú üc{‰èœÈ9™S˜$õòqÉE—y•ž6¨³áMÖšçà·,%Gœñp0Šu\š¨~¨aÌÀV(S‘ÝÞ;qï“ +Rä¶ËO0E!£tО#5ºï‰  OQH˜8YÕ®¬“²êñS†BÉÆ÷ïAûgMVªPÈ9k³.·‰½š>ÍâêtMòÂ6*ÔázšI1EgBEÉ"ŠDþzÔ¢  ‘‡igËbÕ£%R*h=ªOÛ‰GJª¨M[ǨÌÅʵ7E¾·­ÇmR¸Á*¿"RuR¨X]Jêj$©)EX2ëïË/ñþ°KΦ3¥æº$qhš9=R<¸©÷­“t'4à!#;|בÔ;©¼pñj•‹×ÝÃOtJØSt pŸë!›*óú³Î¢¸Hã{¿q>Þ¸‡%Ýíj)[Åi—®“¶áEDÂë…ðÙ—‡qŠ(‹äøËÓDy˜à |š¸NN‘AF´BÏ“a­PÃ.É©Ñý×rª¿ÿA9Õbý³¡ü1ÁÙw®À¤e[(Ü;ÌaÃÓp^T1*àY–áQÕ„ÊÃ.‰ªqÚZTõh‡EU‹vy&‹Gb€#h°K² ‹‡igôÕï'K„†ŒózTŸ·'F¨b²Í»|´81Øg‹øÁw8¹F«¤ÁjÐÅÕ—RŽôÙâà×|ϰ¿:ö}̤ôűڶb7¬œ]XD"u2 ¿Õa=Ø0¬‡Ó™jÛºs²­¿ØóÒköV`˜åEb±ÇR‹;CãLZ™£BÌÔÖ¡ïÓÊ;µ+;æLyÊ”=±²»X“n ’!®+ÚUº¡‰>¯jÔóuÕ¢áÛŸüï¡9Ú.×ËÙ¹åéF/¾]©Ñ"þŽ˜{b†¾Âã’¶hEšU†êRñÉÂMÖè†É-Ý(á¾9¹º2õÏÐ7/‚œêP¡Ãpu‰ò?}3Ÿõ,!Œ6U…„übÊÕsNh'_%YRÄ•ÿÑä ß[ßx£…ÕÑuˆ«}ßRvK±íQŒ¥ûÅ®õ–ÿ¨Q%ÔþEö"ÿòôº¾AØP|þŠ‘ð×endstream +endobj +1721 0 obj << +/Type /Page +/Contents 1722 0 R +/Resources 1720 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1674 0 R +/Annots [ 1724 0 R ] +>> endobj +1724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 606.9556 135.0008 629.9244] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +1723 0 obj << +/D [1721 0 R /XYZ 90 757.9346 null] +>> endobj +1679 0 obj << +/D [1721 0 R /XYZ 357.2656 564.4285 null] +>> endobj +1725 0 obj << +/D [1721 0 R /XYZ 90 546.998 null] +>> endobj +1678 0 obj << +/D [1721 0 R /XYZ 226.1581 281.678 null] +>> endobj +1726 0 obj << +/D [1721 0 R /XYZ 90 264.2476 null] +>> endobj +1720 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F52 1229 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1729 0 obj << +/Length 1266 +/Filter /FlateDecode +>> +stream +xÚ¥XÛnÛ8}÷WèQ".ï󸛦»ºÛmýÖ"˱[ruIš¿ß¡DÊ–([ AJΜ9sáÈÄÃðG<…½P„H1.½d¿ÀÞ#¼þ¸ f;€ýàTà÷Õâ·[ª<…”¤Ò[mZ ’ A õVëo¾ÄË€F8Ä~ó×gX +섻ŧbÝìÒn}S$Í>Íë¸ÎŠ|ùcu·ø°êíX‚I¢­þ\|û½5À»[`ÄT$¼xÀˆ(E½ý‚Sfv‹¯‹{=ÝF{`Ê;NÁ³ˆ0/`EDñI©H L¢ˆ "è4‘B³Ð Cà>oÙø¼$ØËxŸÖiY]ý$˜¢Qꪶ ½´‹–G$‡($Lµj(ñz]ƒÐN& [© +Ø©a ‘+Á‡†W[òïÓ²ª»›VZUè 5€ DÂéöBÁ‰Ô%BŒ”僞çã’Õ##«gØ8±Ú“Q¥I‘¯ßÉ…„$£ŒG3dœŠ]`£ÓÀöqõ䨥 +1 N]¶k¥\»#>8¢“C»=!yZk ­óPšF6€P|Zô&Õ”gmÇè3É´Ër£EqÒ-ŠÍ1élÏi²Úv ¯‘IÊ»:ý’nÒ2Í“ÔDäáµ?q—‡û¢©¿c៴çÛÚ')¡“|£ÕwÐ%LD!bKˆÆþm“'GÄNÛuPD9b\‘£"ä–-°Â„Rž€æÄ£tÑ[壑ù2‘‘N¸=ÌÕ«A4DÞ×`‚H,Fƹa¥æ †¤€+d`x[yeÃ(°!‚„'äí,Xù90ŽÞ³,P,¡Ðz)×ð 2)nï Ïñn"Q…žÂ)Ð2:1Ðiɵ­Š„!fÕzûÏK"ü´45Ddð™õÏ&Îë¬6E°)‹}·Ú¶}?¼Ö¦¨Šr–ݲ.úR~Ñ_Q>MK áO–áj›A¼ ýM_5úɾ=”Ù>.³Ý«~”~SézmÅ‹²[$Cײü±{ÿ¼¤.â,~Ø¥ÖDë–^unéUT¯Œ[ÚŒvK¿¸5%ݺBü[m0Ym§§jfà}UíÕ;¹]W¦YUf£†ž:NTSL¤˜'ôå%">S+½|pzÀmê®^í㟫%‰üþþj›æƒn +<†3ª›^jc!¢p0ìã¤4fÀl¯{ÕNvpK#Å¥¼<þJÿÜ® +´>üŠ÷H¸ë³7ú%Ó\§–3mÍÞçÙԽߋiˆ©ÎÃf°³|W‡à%«·Ü{(qòˆJDE8ÃY/5ÉÕ¦!]9F!®”©‘Íó¹kÄ猵jÛ0»ç¥„Jv}‡ïœH88ƾ[©9ó޶Î÷n°Ñpl=bÝ­ôV¬üG¯Æñ’>$» —¦ç=‰/çnÐK͘wµióf +„ð%T ¡¸xóH¢ˆ^“Ñ Ä†ƒ iÃ}'{÷ؘlŸªfoàÕÉF‘çiROìd‡³‡šõá|ƒKìe´Û¯ˆ>d÷épZZÃLÀÃɰaˆ ‘Bþ¯¯îöWƒŽ6øV–H…,ꂹ¤=MæÇ4O˸¶\ÚØ~²‹;Ý©ó@Lt ¾¦ìšš(ÆÒÌ,šªÂÌ%î/6P7ů×ÇÔùýA6ÅÒ^oçVendstream +endobj +1728 0 obj << +/Type /Page +/Contents 1729 0 R +/Resources 1727 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1674 0 R +/Annots [ 1733 0 R 1734 0 R 1735 0 R 1736 0 R 1737 0 R 1738 0 R ] +>> endobj +1733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.3636 582.7574 152.1568 593.3475] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.7156 582.7574 207.5088 593.3475] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.093 528.4053 335.7466 539.3093] +/Subtype /Link +/A << /S /GoTo /D (a00148_g69a7a4951ff21b302267532c21ee78fc) >> +>> endobj +1736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 492.7935 227.254 515.7623] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +1737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.2428 492.7935 262.8502 515.7623] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +1738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.7156 492.7935 330.3564 515.7623] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +1730 0 obj << +/D [1728 0 R /XYZ 90 757.9346 null] +>> endobj +1731 0 obj << +/D [1728 0 R /XYZ 90 627.2963 null] +>> endobj +1618 0 obj << +/D [1728 0 R /XYZ 90 602.9681 null] +>> endobj +1732 0 obj << +/D [1728 0 R /XYZ 90 602.9681 null] +>> endobj +1727 0 obj << +/Font << /F29 499 0 R /F52 1229 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1741 0 obj << +/Length 1212 +/Filter /FlateDecode +>> +stream +xÚÅWÛŽÛ6}÷WèÑV,‡7‰ûXltmj´Ù`!ËZ[ˆ,¹’¼›ü}‡"u³d»M[†m^†3‡‡3Ã!x?àiê2 š åŇõv8ü~nÚÇy(ðýzñÝL{šhÅ”·~i4( ’óÖÛKE•Ï$]þ¶Òl•i´É’ʪdk[iîF~üÙ6¶É +äò5×/ÓÐå«ùIJ³^(¥— +VŸÖ‹wë¢Ûä + À??Qo‹;y\PÂu(½7ìPZ3ï°Œ·lñëâ—NhÌ!Ï3‚àk©`ÈL0`(ý·©@¬e ZÊÆ2ž’1ÌÂÎ2gû!©£4k=$U\¦Ç:-r§‡ÎÒ¨1ÛÑVM‡h9Ô‘ý{IVL.ßlg—›(³íW3>Þh½j·¸L.í}Û(oÙ "ìé«EÙ3Kr +.„îÆÔO}GAHBÁäEï +Ø32TÁCÑë1FŸ“ç¶€š’üªEAtˆŽFíœ)wnêàÓiªÔMt­ÜÝ Ôs=Ç¢(ˆ«ðš·á J¨fp^+7†—Ÿ³$ŸT&²tpýÄ#!Á@´C™‰,ЀF®¯('¡ ü¥¤^ˆ(•hPbdÑ@‡^'fP®÷ÎUê®ÞÛvñÒú¼›Ð>"ΆÖUŸ,Nõ®°{yè$×c\S,h<®‘:êÙèo…ü¡Ô4ï„x™QxËžï»/ÑáˆõÑýô–a$àxC_3Ý-âvfÄK(.çŽK*'׉ˆMMlaú‡(ͳ¢8úoi½÷£òHâsàŒ)Âdpƒ³Nꤩ6éΕµùvb]`ý òÜúEj:ù[8&z¯Rƒ6Ï4¾tn«ßIÝ@5ÕfPÙx÷YØ*a’H-lõôK)ö +ý`ÂIò¸}bl¾ö) +É0ß4¢’âîú¹cYÄIU͘ÃíDªc–ÖÏÈ*fãVŽÌ½G±œÁ샚"o ¤úGOÕæ]âàlå + d¶/QÂpò>É“2ª[JZÎjƃN®ÌýÓ{Æïµ=F©rÏ0“‡O1+Mè˜ï‡âË×Ý´”1ïè~þ•àÞ¦endstream +endobj +1740 0 obj << +/Type /Page +/Contents 1741 0 R +/Resources 1739 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1754 0 R +/Annots [ 1745 0 R 1746 0 R 1750 0 R 1751 0 R 1752 0 R 1753 0 R ] +>> endobj +1745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 615.6894 138.5977 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 615.6894 170.976 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00149_g12a33f0c09711167bdf3dd7d7cf8c5a1) >> +>> endobj +1750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.3636 531.3846 152.1568 542.2638] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.6549 531.3846 186.2086 542.2638] +/Subtype /Link +/A << /S /GoTo /D (a00150_g12a33f0c09711167bdf3dd7d7cf8c5a1) >> +>> endobj +1752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 394.5058 227.254 417.4746] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +1753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.1194 394.5058 380.3883 417.4746] +/Subtype /Link +/A << /S /GoTo /D (a00043) >> +>> endobj +1742 0 obj << +/D [1740 0 R /XYZ 90 757.9346 null] +>> endobj +654 0 obj << +/D [1740 0 R /XYZ 90 739.9346 null] +>> endobj +110 0 obj << +/D [1740 0 R /XYZ 90 739.9346 null] +>> endobj +1743 0 obj << +/D [1740 0 R /XYZ 90 719.4886 null] +>> endobj +1744 0 obj << +/D [1740 0 R /XYZ 90 634.6393 null] +>> endobj +1747 0 obj << +/D [1740 0 R /XYZ 90 578.3693 null] +>> endobj +1748 0 obj << +/D [1740 0 R /XYZ 90 551.8843 null] +>> endobj +1749 0 obj << +/D [1740 0 R /XYZ 90 551.8843 null] +>> endobj +1739 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1758 0 obj << +/Length 2127 +/Filter /FlateDecode +>> +stream +xÚ­ZKã6¾ûWø(1ç¹u2Iv 3ÛØK’ƒ,³m¡eÉ‘äîíùõ)>-¿Dnø Š*«Š_«H“)†™fxšˆeŒÇÓb3ÁÓtÿ>!öó¾Ï‡??M~üfÓ e1§OÏšCL „NŸ–F1ÍiŠí>?BSàˆ l_›å®’¦ý©)vY÷y_6õìï§/“_Ÿü¼V,Áb¢fýgòçßxºñ¾L0bY*¦oð‚É2:ÝL8eüwò‡çc>èç´„Wp=ÔéGAÝ·²Ùœ`Œ£§µÕÄëùôËã®Ýõyñ¢Ô2üÊ„ÐüÀ Š˘㇈åøIöyYÉ¥5슶Ü:ó60»bBÆØˆed "*;óÌkõŒ£r³­äÞÎú[ólž½Ö^phoÛ¦oЦ2û‰´&†YÝËz©Êç¦5n“W•i¦óEÙ; –f‰÷›²h{Ý·MUɶCJ5¥ IPL9ß+K¯d™½–KÙ™-2hÕ²]—·ïžRKmÉ´hªñ$nkÙ›AE³Ùìê²Ð¶øúÒ,z+ûµ¡ÍÍãUM) cìtSŠf)û¦ß¶` ;4ujè…&Zo_AiN£Vþ³+[½ +é™›‡Yh˜åƒ†™Cµºò»m•v^¾á¨¦]ÊÖ6ŸÍ37g9c¿©½”°ˆU³xïegzÌÒq×å«Û¦;PØ€07ÀÝO/ë]½l¤µè‚W0Ž€µÐœ~7èΑ$àæ<¹«†Æ™‡NCpŒ8Kùžšì/æñ\Ã(*ØøŒž*4/Ä“ ÇñѼSˆ†Ç33ˆd4;žY}jW–æÛPG’ᄯvµr‹Ö'"ˆ™Œñqå9C$!$åâÃ{ÆRÀ ê\ÄAP ^H§)Œ¹B#N²têÉ”ÿ‘¹A@ÈÍ­±}0Ï(Ž^Ðé*©Àc6®‚Õ€PØ .ï–‚¥ˆf„…èÈÂ0Càø¼óx0ó5—ᄯC`q"ÏP’1®<§(&LÜŠ@Ê£4 !Б)!Ÿ®˜yÕ1öËp±˜eWÊ; öùÉ>ræx’‚a‰Ù¦À\™#%ôÖ¨GSŽR–ŠÄ<ÙxÔ+º—·U§¾l÷lqPJ;vY>ÏH=KBÕa˜îÎûܳÚäýE„!J†Ò$‹?¢1†¥fq£Ž, ÒÃûQ:.‡éPºÿÍ!°•ù¢’'F>ÉÑÇ7ôS,‹1LȨžsuPÛ;¹Ì\@y%HÌŽìÀ-×®¾ØŸ6Ú¸ªšE^™öë¡múuÞîùÎdö÷}ýã]$Œ`Æ*é‡ ’* _ÁŽ,ŒàÃû<.GðP:¿¤P!Buh^¾É®©vûýîÑÝG#ÐÙ#ÕcN`·ùíᘑ$„PG¶/n²L«c ÞÙœá#•€à±q¹kEñðíÑ|*í Kè1WеTÀDbèõ‘X}ùlTÚ¶Kô+šª¬_LWeð-íÔ‡ƒÜ©>8=TIZ¯óÕ½?rýZæ†Eßð=ÌŽ~¹¥ò'©@„°©ÈHB! %¡ŠÌ“dÈðn' Hçè¤8:Ë·ÍnµÞîz_ÿv½+@ÖöÖñÐSR”rÆG•ÿPÇþñO”ýDí_]@­Ø.®Ê³‡)ãáb\9ô©ùÿûJžüFýEʼn6°Ò¿]Á4endstream +endobj +1757 0 obj << +/Type /Page +/Contents 1758 0 R +/Resources 1756 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1754 0 R +/Annots [ 1763 0 R 1764 0 R 1766 0 R 1767 0 R 1768 0 R 1769 0 R 1770 0 R 1771 0 R 1772 0 R 1773 0 R 1774 0 R ] +>> endobj +1763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 574.0416 151.3297 584.9456] +/Subtype /Link +/A << /S /GoTo /D (a00136) >> +>> endobj +1764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 535.1382 150.7717 546.0421] +/Subtype /Link +/A << /S /GoTo /D (a00135) >> +>> endobj +1766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 452.2677 224.9331 463.1716] +/Subtype /Link +/A << /S /GoTo /D (a00144) >> +>> endobj +1767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 415.4215 222.1728 424.2682] +/Subtype /Link +/A << /S /GoTo /D (a00145) >> +>> endobj +1768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 376.5181 223.4387 385.3647] +/Subtype /Link +/A << /S /GoTo /D (a00146) >> +>> endobj +1769 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 335.5574 216.0761 346.4613] +/Subtype /Link +/A << /S /GoTo /D (a00147) >> +>> endobj +1770 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 298.7112 214.9707 307.5579] +/Subtype /Link +/A << /S /GoTo /D (a00148) >> +>> endobj +1771 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 259.8078 258.2974 268.6544] +/Subtype /Link +/A << /S /GoTo /D (a00149) >> +>> endobj +1772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 220.9044 246.8006 229.751] +/Subtype /Link +/A << /S /GoTo /D (a00152) >> +>> endobj +1773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 168.9847 249.8397 179.8887] +/Subtype /Link +/A << /S /GoTo /D (a00154) >> +>> endobj +1774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 119.1224 254.5214 130.0263] +/Subtype /Link +/A << /S /GoTo /D (a00151) >> +>> endobj +1759 0 obj << +/D [1757 0 R /XYZ 90 757.9346 null] +>> endobj +1760 0 obj << +/D [1757 0 R /XYZ 90 739.9346 null] +>> endobj +114 0 obj << +/D [1757 0 R /XYZ 90 739.9346 null] +>> endobj +1761 0 obj << +/D [1757 0 R /XYZ 90 719.4775 null] +>> endobj +1762 0 obj << +/D [1757 0 R /XYZ 90 593.0161 null] +>> endobj +1765 0 obj << +/D [1757 0 R /XYZ 90 471.2422 null] +>> endobj +1756 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1780 0 obj << +/Length 2922 +/Filter /FlateDecode +>> +stream +xÚ­œoSÉÆßó)T•7èsófïΑÏɹ$wW” ²Mň$—OŸ´3ôhF݃+å*#У~zû×»;-íJLxø'&Ÿ8ãØ ´\ý¾Ç'ŸÂŸ_ï‰ñéƒðü¼Zì}÷ƒ&¬´“ÅǧV0#…œ,®Ù·l˜HÃ÷ŸW›³óñ/GçߥÇëåÕ?¦Ško÷­šþ¶x³w²ÈÆc^FYmÿ¹÷Ëo|rò{³Ç™¼™ü;ü™9ù}OK•~ù²7ßû)ÇÙ<ñô‚Öæ¡ÚÛ'Œ‘ieØ^·Ù¾ãåz¹Ù„ùúþñjýx?~õÐÚî˜r©,lœ¨¬à–iåõsœèÿ«”fÛKðð*iî˜U”¯ÐlàÖ–¾O[[9«!@R~Ë9>uÿiÔ\À’žÊ¡Šsx¼ùzyuw{[eá,³B[|ûíÀ´ áÂöyg45Šå˜°2¾J2ùÌy>ñ!O«Ÿò ÁÝà'Yó¼X}½Ÿ*ºbu»^®oîn7s÷qósYï›qãVWñ¬f¼IÈú°³éзhöcòB2ïC;ïj@k=³Æk¢³Œl@i@Â75`áK4`éÜÑ€DUÜÔ€×;šp°áÀ×À¡AÝðÒ&4Š9¯¨UßÒ‚ï_Ђ:´•Ôâ-èw·`<¶ŽýŒµ`’Ñ-b-ˆû愾T Î=-ˆçPÅM-Nžë‡ú R¶\ã°Ž…VÑ/í?a·f 0Éb¢ùüÿΓ±7ú|÷åúæöÓæ—un­Ö7뛫‡$Z®ÇÎ…>-ë7¸Þüåflð÷³óËùbƧ³ùbv45cЇÕs}·ù)v÷<×,<þ¿uÍ ˜÷¤å³ŒlyiyÂ7µ|áK´|éÜÑòDUÜÔò뫯áÿÏ×÷õaׄrU©TEUäñÈ8Ï}<Ê2ˆÁÁ}3èKÁ)œ{àà9Tqœ›«ßwБ\1áµ%ª F½ëØÀ‘^°dMÄèྙô¥èÎ=tðª¸`Á²k×ñ,²TF½ë˜°¦Ç™,£á€€Ü7þœÂ¹žC7ÁY­?_.¯[ld8ßX¢>lšÖê…gs£Â"€i²ìëIí>ÜŒ'Õ“xj¾M§Ø§| +ð°ó$¦3æÈÙ&oP·çvŠÖ$~3¸¯~ sۜԵ㌋Aïlm(@Z;ËÈÖFŸ[›ðM­]øþézÜÒÊ\‡‚I'¶ÌwwwÒSiTqcqv8Õ|ÿèÇãøãp*„Ø_LnŸ& xY²ŠÈG +Ë„°¾ÌG´¸›ÐKÊî~‡ +0îIFsÇwÜ7s‡¾Ü óîxUÜÄýôäçæ†Y‹×f>ªˆ\¤ðá¨0”©Èr­Y(±Û0äIF#ÇrÜ7#‡¾È óäxUÜ„üâä¯ïf‹zýgâÊâEÈ*Â]†¥ˆV°¤Ñ]·(+Á”ã»×*P€QN2š2æ(ã¾™2ôí \˜÷PÆÓ¨â&Êçgoß¶–*aí`‰$åæ9a`A£·o1»¼öâçç1£ŠŒØ¾¨iÆ L;èBç¸hÛQÚ£·gó“šíÀ,¾õI„;K.˜ç\ζȆãåFìF Û$£ábŽ€.î›ñBß¾…y`<*n^޽:»˜Z¾ß8Ló°…ÊàuÈ*"8ôk¡e™€jU8*8)ÕNÒP€Î2’4êøLšðM¤ _štiÞAšH£Š›wæ³ÓÓ“£ÅÉqEZzƽ°x²ŠH@*†S)Ël댬ÜÀ¼BF,(ÀH'Ms¤qßLúv.Ì{HãiTqéÅìÝÉñÙûz—sNz¼ YEøK)™´j«üB¶ÎËaõ†pd¨‚Œt’Ѥ1G@÷ͤ¡o鼇4žF7‘&'ª¸Ä†p|Æë‘TT"ñuŽâE"­)Z͸CF*(À€' sÀqß úv/Ì{€ãiTqá®}ÑzÓÖa‰$a×d2^$S˜7ÏÔZ01ðÝoÍC9ÉhȘ#€ŒûfÈзraÞO£Š 'ª0<ÿ4|ÿýɼ>Žk¹¹b-GVyÈ08{ë·ÊѺüJ…%€BhðÓ&|í—¦]šwÐ&Ò¨â&Úoç‹tµ`½g{&7x)²ŠÈ!®À¶rh}Ž%|˜ÑdÒ‚Œu’Ѭ1GÀ÷ͬ¡o뼇5žF7ïÙóËw‡ó[×€ +í,^…¬"쟮T^•ö¢u¢N1'I +0ÎIFsÆgÜ7s†¾œ óÎxUÜž¾œÏþ~RÏ×.¦$ê¢8ÂÈÞØ ´‰—ÿâÆ†,+nSü0 KDZg?®îÇoþ;>»ü×òæËò×ñ×w£âñ!i¯óÜÜ>ߨ¸½ù+ %&0U„LÖÛVÇM7˜¤ÍÚJD Ç,×~+‘­Êfa¯ÄÀ¼ û­ŠÆÎØyë‡P¡Ã·úß|O±2´¢Æç,£wbÛ‰qß¼Cߎ¸0ïÙ‰ñ4ª¸ù£è‹¸ ŸÅÿ6‡îËÙÑ»óÖdñ“f´&IDä"•`Ү̥õ¶w,²DÜ@€1O2š9æ˜ã¾™9ôí`^˜÷0ÇÓ¨âîf¿Œ¢B.™$^’$"R‰µðr«"­sõ`™Ò»wòç§Ü£ˆ„x=£FhàHc†¶Ñ¶bî¿ê¡`mÂ$b–¯W·«ûå:}@ºÁñ]zðf*Ìþãø‹ãOþ½TßK¾ùMrnÇõÁTšý¼FH_j Ø(üðÇæçñÝþø´ª¾J$~-Q£>ÿÚUßendstream +endobj +1779 0 obj << +/Type /Page +/Contents 1780 0 R +/Resources 1778 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1754 0 R +/Annots [ 1783 0 R 1784 0 R 1785 0 R 1786 0 R 1787 0 R 1788 0 R 1789 0 R 1792 0 R 1794 0 R 1796 0 R 1798 0 R 1800 0 R 1802 0 R 1804 0 R 1806 0 R 1808 0 R 1810 0 R 1812 0 R 1814 0 R 1816 0 R 1818 0 R 1820 0 R 1822 0 R 1824 0 R 1826 0 R 1828 0 R 1830 0 R 1832 0 R 1834 0 R 1836 0 R 1838 0 R 1839 0 R 1840 0 R 1842 0 R 1844 0 R 1846 0 R ] +>> endobj +1783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 704.2225 177.6109 715.1264] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +1784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 665.5053 197.5362 676.4093] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +1785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 626.7882 175.9567 637.6921] +/Subtype /Link +/A << /S /GoTo /D (a00093) >> +>> endobj +1786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 588.071 196.4301 598.975] +/Subtype /Link +/A << /S /GoTo /D (a00094) >> +>> endobj +1787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 575.1882 204.1809 586.0921] +/Subtype /Link +/A << /S /GoTo /D (a00091) >> +>> endobj +1788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 562.3053 199.1998 573.2093] +/Subtype /Link +/A << /S /GoTo /D (a00096) >> +>> endobj +1789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 549.4225 193.1026 560.3264] +/Subtype /Link +/A << /S /GoTo /D (a00089) >> +>> endobj +1792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 467.8426 214.6224 477.7703] +/Subtype /Link +/A << /S /GoTo /D (a00150_g6bfa488f87f68a6f7f4a3efb9e45eaf8) >> +>> endobj +1794 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 454.9597 216.6746 464.8874] +/Subtype /Link +/A << /S /GoTo /D (a00150_g39ce739bd352d7e348e37395ce903e43) >> +>> endobj +1796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 442.0769 206.9409 452.0045] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf848ce44c810492e7a35c2d23a429f45) >> +>> endobj +1798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 429.194 193.6609 439.1217] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf0ed78fd2be24d849cdd5af75e3b2674) >> +>> endobj +1800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 416.3111 200.3059 426.2388] +/Subtype /Link +/A << /S /GoTo /D (a00150_g57e6dc1d58a36d0ed53a3dd29ccc5798) >> +>> endobj +1802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 403.4283 201.9198 413.356] +/Subtype /Link +/A << /S /GoTo /D (a00150_ga4c4310e54f18541b09e1e251fe7b22d) >> +>> endobj +1804 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 390.5454 229.0778 400.4731] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf84316f469ce0726985c0702db49a989) >> +>> endobj +1806 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 377.6626 220.769 387.5903] +/Subtype /Link +/A << /S /GoTo /D (a00150_g2d3ba4b14d6d2f6576f9b547800b7945) >> +>> endobj +1808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 364.7797 193.9898 374.7074] +/Subtype /Link +/A << /S /GoTo /D (a00150_gabc40c09f49d15acb1b1a7f02bb3a807) >> +>> endobj +1810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 351.8969 199.7479 361.8246] +/Subtype /Link +/A << /S /GoTo /D (a00150_g041aea91aa6ef84dcc6cac3c51db9b2f) >> +>> endobj +1812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 338.4114 243.3742 348.9417] +/Subtype /Link +/A << /S /GoTo /D (a00150_gd605357e29affb0d3104294c90f09905) >> +>> endobj +1814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 326.1312 252.8785 336.0588] +/Subtype /Link +/A << /S /GoTo /D (a00150_g5c97ae587595b5444be80f5ecc1d3382) >> +>> endobj +1816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 313.2483 224.6544 323.176] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf0ccbc3bb2a3ba1ebc255c7b3fcedd24) >> +>> endobj +1818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 300.3655 207.4989 310.2931] +/Subtype /Link +/A << /S /GoTo /D (a00150_g28eda870cff3d8e3cf2949e6f57a502b) >> +>> endobj +1820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 287.4826 221.3369 297.4103] +/Subtype /Link +/A << /S /GoTo /D (a00150_ga5e3c856b86725125d19fccc34cd9eb5) >> +>> endobj +1822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 274.5998 218.5673 284.5274] +/Subtype /Link +/A << /S /GoTo /D (a00150_g8af482dec973db57d8b3bd3f69461488) >> +>> endobj +1824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 261.7169 234.7964 271.6446] +/Subtype /Link +/A << /S /GoTo /D (a00150_gae59b70658f28ee6e998eaaab05e423f) >> +>> endobj +1826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 248.834 224.5549 258.7617] +/Subtype /Link +/A << /S /GoTo /D (a00150_ga533c394b1fa0030205534befa31c525) >> +>> endobj +1828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 235.9512 224.5549 245.8789] +/Subtype /Link +/A << /S /GoTo /D (a00150_g160128ab5d2ea3cc497b91ee4eb4ef99) >> +>> endobj +1830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 223.0683 211.9222 232.996] +/Subtype /Link +/A << /S /GoTo /D (a00150_g64d9affc680a445d708234e70450477b) >> +>> endobj +1832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 210.1855 222.8911 220.1132] +/Subtype /Link +/A << /S /GoTo /D (a00150_gfff0ed43201bf1e2020de1a0d6cac070) >> +>> endobj +1834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 197.3026 219.2748 207.2303] +/Subtype /Link +/A << /S /GoTo /D (a00150_gd135fb0cfdfb2c212f0f51865a3640e4) >> +>> endobj +1836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 184.4198 214.1439 194.3474] +/Subtype /Link +/A << /S /GoTo /D (a00150_g13dfcb4a5f920e108253ade527a66cc2) >> +>> endobj +1838 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 171.5369 211.7529 181.4646] +/Subtype /Link +/A << /S /GoTo /D (a00150_gde29ec025e6754afd8cc24c954a8dec8) >> +>> endobj +1839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 158.6541 238.2734 168.5817] +/Subtype /Link +/A << /S /GoTo /D (a00150_ge0825474feee11b4e038bfe71757875f) >> +>> endobj +1840 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [289.3868 143.1256 318.6011 153.0309] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +1842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 119.9369 229.7753 129.8646] +/Subtype /Link +/A << /S /GoTo /D (a00150_g359951eecd80541c2101f628a9da9146) >> +>> endobj +1844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 107.0541 223.6882 116.9817] +/Subtype /Link +/A << /S /GoTo /D (a00150_g517c770991459cc62dc009c0d3875c6a) >> +>> endobj +1846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 94.1712 225.3421 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf72d7b9a737707dcfb2c41fec2b6792e) >> +>> endobj +1781 0 obj << +/D [1779 0 R /XYZ 90 757.9346 null] +>> endobj +1782 0 obj << +/D [1779 0 R /XYZ 90 723.1038 null] +>> endobj +1790 0 obj << +/D [1779 0 R /XYZ 90 485.7477 null] +>> endobj +1791 0 obj << +/D [1779 0 R /XYZ 90 485.7477 null] +>> endobj +1793 0 obj << +/D [1779 0 R /XYZ 90 471.8276 null] +>> endobj +1795 0 obj << +/D [1779 0 R /XYZ 90 458.9448 null] +>> endobj +1797 0 obj << +/D [1779 0 R /XYZ 90 446.0619 null] +>> endobj +1799 0 obj << +/D [1779 0 R /XYZ 90 433.1791 null] +>> endobj +1801 0 obj << +/D [1779 0 R /XYZ 90 420.2962 null] +>> endobj +1803 0 obj << +/D [1779 0 R /XYZ 90 407.4134 null] +>> endobj +1805 0 obj << +/D [1779 0 R /XYZ 90 394.5305 null] +>> endobj +1807 0 obj << +/D [1779 0 R /XYZ 90 381.6476 null] +>> endobj +1809 0 obj << +/D [1779 0 R /XYZ 90 368.7648 null] +>> endobj +1811 0 obj << +/D [1779 0 R /XYZ 90 355.8819 null] +>> endobj +1813 0 obj << +/D [1779 0 R /XYZ 90 342.3964 null] +>> endobj +1815 0 obj << +/D [1779 0 R /XYZ 90 330.1162 null] +>> endobj +1817 0 obj << +/D [1779 0 R /XYZ 90 317.2334 null] +>> endobj +1819 0 obj << +/D [1779 0 R /XYZ 90 304.3505 null] +>> endobj +1821 0 obj << +/D [1779 0 R /XYZ 90 291.4677 null] +>> endobj +1823 0 obj << +/D [1779 0 R /XYZ 90 278.5848 null] +>> endobj +1825 0 obj << +/D [1779 0 R /XYZ 90 265.702 null] +>> endobj +1827 0 obj << +/D [1779 0 R /XYZ 90 252.8191 null] +>> endobj +1829 0 obj << +/D [1779 0 R /XYZ 90 239.9362 null] +>> endobj +1831 0 obj << +/D [1779 0 R /XYZ 90 227.0534 null] +>> endobj +1833 0 obj << +/D [1779 0 R /XYZ 90 214.1705 null] +>> endobj +1835 0 obj << +/D [1779 0 R /XYZ 90 201.2877 null] +>> endobj +1837 0 obj << +/D [1779 0 R /XYZ 90 188.4048 null] +>> endobj +1841 0 obj << +/D [1779 0 R /XYZ 90 137.9854 null] +>> endobj +1843 0 obj << +/D [1779 0 R /XYZ 90 123.922 null] +>> endobj +1845 0 obj << +/D [1779 0 R /XYZ 90 111.0391 null] +>> endobj +1778 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1850 0 obj << +/Length 3655 +/Filter /FlateDecode +>> +stream +xÚ­\ko\·ý®_±@b…Ö ß _Y¶•È–*ÉÇ\ieµeWÔù÷%w—Üáåå E,©{vιs†sI.÷Šÿ‹ÀÎ8”¶‹«O{|ñ>þßÏ÷Äöå'ñõ'ðÃÅÞ7ÏdX¬´‹‹›u+˜‘B..®ß,­Þ"=w|ùxt5|)ßüòòóõãÇÕæ÷§Ÿ¯?­nÞ=üúùvÿíÅ{‡…w+Ë(+ëöÞ¼å‹ë(ïÇ=ÎTðfñßøg"¹ø´§¥Ê|Ü;ßûG‰³yaý†¹«K/?‘ns-ÝË—ñbÜ]½W/¸eZy½È¨”‚_¤4Ó+<¾.Z€p ]¤B³À­­Hÿr½ú…sy»j˜µeN:Q3§WîÞo!gPC†¦Q“†×G§—§gûš/OÒ?ûÂ/O.^žÚ©*©s–ãù( \‹T–ISK1~®¦„€`ú^fv†ÑncŒÀnœ·ø y ¯ÈGÇe4q³çG§/._5sÏ„±ÏBAôRpfõ”^ò9Ÿ¹bÁ»¾Í»×1—·(Úd„xŒ’‹é€ÃyÄ`TÃ4j¶÷õÓŽ¿"0)u@P@8¹”‚¹Xùܶ³Û îi/ʸó—àÍW¼´Ã5ù€Å„Œ&n6ùâ gr¼;!ð4Á/%gÜ +WóÏbë<‹¹‘}£3:Ãh£1F`4Î[Œ†¼FWä#Fã2š¸»fÝÏ2B½°x" +ŠP %_­ à†W=e=üÛæ¸—Dœ˜+ +kb¬Ðoí€E†ÑE1‚¢ÀyKQ@Þ¢¨ÈGŠ—ÑÄÝEwü˘2é<žˆ‚"¤â ¢1`[EÃ, +#é€E†ÑE1‚¢ÀyKQ@Þ¢¨ÈGŠ—ÑÄ·„øï ´(°D€¢@ìŠbª _–Év—Ú÷mÌö £mÇí8o±òØ^‘ØŽËhâ&1Ý—ÏŽšl o#&h"EQ{ÏŒäjþ•ÏîXD\Å÷w]Ìå £]ÆË8oqò¸\‘¸ŒËhâf—Ïžq9¾‘Ç©:žŒ¢¨ƒd*˜I¢ËrÎe¡"&„¾Ë€¹œa´Ë#pç-.CÞ—+ò—qMÜìòÙùEë²O»%‚È@FQÔqïtšÐCê貞s™ÇÙ¿vºï2`.gí2Æ\Æy‹ËwÀåŠ|Äe\F7»|zþ¢ï2šË8uqRG—çVèÆ;ÆM“ ¼ŽxœQ¤ÅÝÎaœ4 Ii+æ{q Ó¨ÙÜïÓVêÁOŠh‰’¸þ "¸ƒb‚«Ššs«rãt\ÀKÄ]ÀìÍ0Ú_ŒŒó‡!ï€ÅùˆÇ¸Œ&nvùõÙóÖagÃÜÈ(Š:zl¸˜džÝ{16u\ô]Ìå £]ÆË8oqò¸\‘¸ŒËhâf—.Žçµ AÈ(Š:VƒôqY]Qó¯êfÎeí#Æõ·R!s9Ãh—1Fà2Î[\†¼.Wä#.ã2š¸Ùå“Ó‹ËÃWOÛTo¶ÊâY((‚^ŠH¯µ¬ég³2Œ{ÓßÌæ £mÆÍ8o±òØ\‘ØŒËhâB›_œœ¶›#œùà-ž†‚"ø¥TLù kþ¹•²‘’ñ û{£€ùœa´Ï#ðç->CÞŸ+òŸqM\èóËóóv8«ô‰•ƳPP}Î’Û ýÜRÙļ +Îû"€Ùœa´Í#°ç-6CÞ›+ò›qM܉ͳ{à*¶X«ñDd!@jΌѮ0·ZÖÁF€ëïoBbt‘F£Œ;£ ÞltÅK]“MÈhâ&é,ÊåáÁ‹“˳ÃÓãý˜ÿåÏsn;) žŽ‚"tHgdBNtÌݧµ«°Ô*º~æw†Ñ~cŒÀoœ·ø yü®ÈGüÆe4q+¿Û³)å ž‚ "¨%7Ì:3ÉÀÜÖˆvœ )ûÛœ€Yœa´Å#°ç-CÞ‹+ò‹qMÜl±%Ç´Ž·a.=ž‚"„È($®§M-DÈ0g¹qL(Þß0Ìò £-Çå8o±òX^‘XŽËhâÖ–Ï9³–HBAìë#gƆš]ÈÙ¡­u„ 7ëÝë˜Ë[m2B:8ºØjùý¾byqtÒLÑ×Ì*æ%cpIŠG¯ã¯$ eæUfžž‚"t©¸3ƺZ—Pv®D:¼ªú¥€U@†Ñ€1‚ +ÀyK@Þ +¨ÈG*—ÑÄÝUÀ³ãõÏ/ÏçN$ +/ žŠ‚"4¤ó©Ö)9±€›Íi„ož QÆœ&R$Ôwßm õE9¼[ˆíœYÒqÎ(,ïoÖ@V8FÆ +ç-…y +§")\FwW8qïñ®ñúìàðòøèÕO±‰<=;lwp”NgPÆSSP„&'ÚûZÒœõ*ÈðýýX@¬/0Òz”qg=Á›­¯xiëkòë MÜÆúÍTáìùái?·Bàé)(B—Òé®!\­knO¹À„3ý©"`þgí?ÆüÇy‹ÿwÀÿŠ|Ä\F7Éø!.û–¯Ÿ5"¬eœkGd £(jë™0ŸùV‘þ»¸{¼zh?Ä Ìg‡Óñ”–&nÒòøë—ˇ«/ñß×wÍ}Ó˜¸šqOFAµ„†÷Mo—:–ù$\ÍÜcåx¡¶·ÄtGük#ÎÅÉvpa4OOä©›óô¯}É—7s ‰$1h +Š o£%ú7élëññú`ëÛÎAÅ¢^õ·ù!ëFw Œt œ·t È;Ð%*ò‘.Ëhâ&Ïzm fb¶ˆdÅX(m&©GÛDÚB”!®9óPð„–6.Ý&l\õ´R¦m"£Zu›°ŠYï¦u8Ú&’Ò»Õ»ûûíh}ûãŨ(ˆ÷·V!/FŒŒœ·ŒÈ;0^*ò‘ñ‚ËhâæYUoÈΔ¥’°QäqÆär“ÜãFê´ÕFQð„–6n0¿^}êÖáÉ(¨VA=bbÒ¤qÓJü³7V [ññŠ)x"Qm\êÆªâ‚œ ƒg© (ú&ÚðU§GøþÇl€5Š £ÆÎ[ähùH£Àe4q×ßÕyÚíÞÄË žHBFQì>ÎÀã=m’|¼S¤ /Ýh& +žÐÒÆÍàñº×(œgÊHƒ'£ Zu£ðœy­Ä4ýF¡Ñx°Ìé‡ó”ñTžš¸T£.M$ž¥‚"èÛhÃ"¾Sòþæ>xk[Ý%:Ð$PÒÒ#é@‹€Ì#Õ0š¿Ëw?Á™=Íž¾#„f!ƒÓX¹GÜ÷ŒNG.…êD ˜ÕF{1³qÞâ6ä°»"ñ—ÑÄÍŽŸ<ŸýZŠT2Š¢n¢e«?e«×O+‚“NNÞD?Kèø–ü‘‹}§—¿Y]¯nîg +$NÇb!…~+€¤@ +Œ,”qW o.Š÷asmyDŒ3f¤:6pJÂ4êº÷ {Ùn”Ùô®8À.]2/(þJˆsh¹&Õe\-/Mö¿èw××w—sÏHPÕ[zÏHPÒ3¼5ÿù¶­‹8Ûµr!µLS©HgÊc~ÑknÃ>r[½¾xw)á–ÈÏV_îö•[®îïËùÖ_Ãÿ|³ùùnûw~¸WJÓö ¬+[ &­q¸ì­j!ÓŽY¿KGpúÀŽkF5k8ok—kóÀXÃ%L£Œ5äÒÿøXÃÕ•±VÉ[5K5Ì!0ÖPe¬Aþ7þí\¿O»fž÷?¡¬3Œ®AŒÔ Î[jòR5X1Ô .a•n¨éŒ¥ÓMÁºY‹ëƒ˜ÖXJeÁÍÈì¨4–¯%nTAÍðW³XCi7™s±Ý˜~¼½J­vnò!tªWÛ/F@бÀÈbDwÅHðæb¬xKK¾Ï¿^7Üq6„0î~9f<¥¢‰›þr÷ù*Þ³Ú ªd†KK$!£(zŸ>þQj’ü8A›«ô5ÎÑd<©`w?7ÓÓ;bñ¢W^Po:biDÖ“+çêÝûÎ2,Îßã˜Ñý9À +=ÃèBGËÎ*áC.sJ]PÝüÝY9fÓ7u1yƒQ¤Ó A +R^ÆÕòâ8¹úðïûÇOo­âžeÅ¿³Z77H‚Ž™qrB‹|˜¾Å“ +¦q»æ¤ceŠKüÂ3¨¥­7ðDˆù‘Í…Ó;ýÛ³¿·ÇÜ%óé—Á<‘ 6n?AÖ0£„ 2”Q±õ±ÝˆIŠ>®nçzH^nÉ™ A­’ Y%XpðîãÕãÇwÛg?|Øþrtû°º»]=lþºÚfùau•ÌZ¢ÍB*m”ÿ¶ºÛ.Ÿ6?òV¨ðË›øRÚ#뮦RûRº>ÚN¬¦ú=5ØËSÇS7(º¡nqÿvº …4S  o¥}a¸‘¢Â2 + +[O+;m4⌎-²¯ïIÁàÌ!Öi* +hUl¡yÂÕ¹çºtÂyþ›è¾EÀeYX¤'ø¦£õ7ë³ÛBÇRÍR’òç«ÛÕ]^×Û!s›Ÿ¾ýåÇ4²·¹ýÉ¿•ê[¹}Ö¸äÜn~»Ù—fùy;ÞÚ‡’ÿë÷ü@ò¯¿¿_5"7BÍeé¶~gŠendstream +endobj +1849 0 obj << +/Type /Page +/Contents 1850 0 R +/Resources 1848 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1754 0 R +/Annots [ 1853 0 R 1855 0 R 1857 0 R 1859 0 R 1861 0 R 1863 0 R 1865 0 R 1867 0 R 1869 0 R 1871 0 R 1873 0 R 1875 0 R 1877 0 R 1879 0 R 1881 0 R 1883 0 R 1885 0 R 1887 0 R 1889 0 R 1891 0 R 1893 0 R 1895 0 R 1897 0 R 1899 0 R 1901 0 R 1903 0 R 1905 0 R 1907 0 R 1908 0 R 1909 0 R 1911 0 R 1912 0 R 1914 0 R 1915 0 R 1916 0 R 1918 0 R 1919 0 R 1920 0 R 1922 0 R 1924 0 R 1927 0 R 1928 0 R 1930 0 R 1931 0 R 1932 0 R 1933 0 R 1936 0 R 1937 0 R 1938 0 R 1939 0 R 1940 0 R 1941 0 R 1942 0 R 1943 0 R ] +>> endobj +1853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 727.7951 234.7566 737.7228] +/Subtype /Link +/A << /S /GoTo /D (a00150_gad0321f4c570f9983c6de81ece3ddc20) >> +>> endobj +1855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 714.8027 209.1527 724.7304] +/Subtype /Link +/A << /S /GoTo /D (a00150_g6bc12c6c7b56f73ce5d57abfdcdc6eb5) >> +>> endobj +1857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 701.8102 220.2212 711.7379] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb948296aea6b6b3aa1f156799c4d479c) >> +>> endobj +1859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 688.8178 218.5673 698.7454] +/Subtype /Link +/A << /S /GoTo /D (a00150_g17d111686f98e4c09db73a770ac3f1a4) >> +>> endobj +1861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 675.2227 229.0778 685.753] +/Subtype /Link +/A << /S /GoTo /D (a00150_g6f2b90c597ec23f39ec716ccec11233c) >> +>> endobj +1863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 662.2302 227.424 672.7605] +/Subtype /Link +/A << /S /GoTo /D (a00150_g15f2617f7dc1713f9d10282125c6027b) >> +>> endobj +1865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 649.8404 227.424 659.7681] +/Subtype /Link +/A << /S /GoTo /D (a00150_gee37386b2ab828787c05227eb109def7) >> +>> endobj +1867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 636.848 187.0257 646.7756] +/Subtype /Link +/A << /S /GoTo /D (a00150_g88e60aa2cf23e1c65d630701db08c743) >> +>> endobj +1869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 623.8555 190.9012 633.7832] +/Subtype /Link +/A << /S /GoTo /D (a00150_g6020613f5062417d9811cfa837215c83) >> +>> endobj +1871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 610.8631 189.2474 620.7907] +/Subtype /Link +/A << /S /GoTo /D (a00150_g5ca559def464ef20d8b1f7d32f2f160d) >> +>> endobj +1873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 597.8706 189.2474 607.7983] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1320fd0006a2f70138bc2d0018dda829) >> +>> endobj +1875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 584.8781 191.6086 594.8058] +/Subtype /Link +/A << /S /GoTo /D (a00150_g44b3b1ab31a403ba28ec135adfcbefef) >> +>> endobj +1877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 571.8857 192.007 581.8134] +/Subtype /Link +/A << /S /GoTo /D (a00150_gc84f499cba8a02fc0e306c10b2acabf0) >> +>> endobj +1879 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 558.8933 189.7953 568.8209] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1425d4a0c2760adb653a04c0fb137a8d) >> +>> endobj +1881 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 545.9008 215.2498 555.8285] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1215163245304bad20d6c5608ad75ab7) >> +>> endobj +1883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 532.9083 221.8948 542.836] +/Subtype /Link +/A << /S /GoTo /D (a00150_g9f1822e1d231235edacad691f3cb7bbb) >> +>> endobj +1885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 519.9159 214.7117 529.8436] +/Subtype /Link +/A << /S /GoTo /D (a00150_g691688604655ea8943d15f14c60027d8) >> +>> endobj +1887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 506.9234 239.0603 516.8511] +/Subtype /Link +/A << /S /GoTo /D (a00150_g12f3bf821224b8e7b48a57ed3cea15cf) >> +>> endobj +1889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 493.931 239.7177 503.8587] +/Subtype /Link +/A << /S /GoTo /D (a00150_g5c5b1834e497f53ad0ef947bbe9777fa) >> +>> endobj +1891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 480.9385 204.1812 490.8662] +/Subtype /Link +/A << /S /GoTo /D (a00150_gd58231410d58e34b455328b888a9e73c) >> +>> endobj +1893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 467.9461 244.6991 477.8738] +/Subtype /Link +/A << /S /GoTo /D (a00150_g207d17b633cd095120a74bc1f2257b17) >> +>> endobj +1895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 454.9536 209.1625 464.8813] +/Subtype /Link +/A << /S /GoTo /D (a00150_g4cc3e223b63f27b546d62e9a258dba5a) >> +>> endobj +1897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 441.9612 305.6302 451.8889] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1cea57e3ea526f210b1068e6dcf7b4f4) >> +>> endobj +1899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 428.9687 321.0623 438.8964] +/Subtype /Link +/A << /S /GoTo /D (a00150_g62c03e0a308cc23929a80fe8d8f9dc1e) >> +>> endobj +1901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 415.3736 218.1788 425.904] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1d3211dbbdfb22d6a47b60dddcf945e8) >> +>> endobj +1903 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 402.9838 341.9936 412.9115] +/Subtype /Link +/A << /S /GoTo /D (a00150_g42288d5c3cf4b10becefec657f441e54) >> +>> endobj +1905 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 389.9914 341.0573 399.9191] +/Subtype /Link +/A << /S /GoTo /D (a00150_g8387881de3a8bfd3c0d57b9d04ac9b7e) >> +>> endobj +1907 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 376.0227 167.0009 386.9266] +/Subtype /Link +/A << /S /GoTo /D (a00150_g24f52ac52d6e714cb04a5aa01be3bdd0) >> +>> endobj +1908 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.7613 376.0227 256.6538 386.9266] +/Subtype /Link +/A << /S /GoTo /D (a00094) >> +>> endobj +1909 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.2016 376.0227 305.9885 386.9266] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +1911 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 363.0302 172.5401 373.9342] +/Subtype /Link +/A << /S /GoTo /D (a00150_g96544dedc1cdc71ad2ad54bf1d5e5433) >> +>> endobj +1912 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.3005 363.0302 262.193 373.9342] +/Subtype /Link +/A << /S /GoTo /D (a00094) >> +>> endobj +1914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 350.0378 191.3593 360.9417] +/Subtype /Link +/A << /S /GoTo /D (a00150_g4309376690872fa4beb4f025f5cc199b) >> +>> endobj +1915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [223.1197 350.0378 288.763 360.9417] +/Subtype /Link +/A << /S /GoTo /D (a00091) >> +>> endobj +1916 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.3108 350.0378 338.0977 360.9417] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +1918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 337.0453 186.9261 347.9492] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb9435261753469accec0c9bf8a5a2686) >> +>> endobj +1919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.6865 337.0453 279.3487 347.9492] +/Subtype /Link +/A << /S /GoTo /D (a00096) >> +>> endobj +1920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.8965 337.0453 328.6835 347.9492] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +1922 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 324.4265 191.6285 334.9568] +/Subtype /Link +/A << /S /GoTo /D (a00150_g9c0814ed491fa452ec97910c0728d410) >> +>> endobj +1924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 311.434 189.2275 321.9643] +/Subtype /Link +/A << /S /GoTo /D (a00150_g013c3a06a8b58589a77f4a3442f89c2a) >> +>> endobj +1927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.2787 254.0565 170.966 264.9604] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1928 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.4642 254.0565 229.3566 264.9604] +/Subtype /Link +/A << /S /GoTo /D (a00150_g20ceef9d0868d391c2f33041b02cb1f1) >> +>> endobj +1930 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.2787 215.1201 170.966 226.0241] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.4642 215.1201 229.3566 226.0241] +/Subtype /Link +/A << /S /GoTo /D (a00150_g9ebb4dac683163840eab9c6c41ad61f7) >> +>> endobj +1932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.2787 202.1277 204.1712 213.0316] +/Subtype /Link +/A << /S /GoTo /D (a00150_g20ceef9d0868d391c2f33041b02cb1f1) >> +>> endobj +1933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.6693 202.1277 257.5805 213.0316] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +1936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 145.1237 183.4989 156.0277] +/Subtype /Link +/A << /S /GoTo /D (a00150_g266263ac78a1361a2b1d15741d3b0675) >> +>> endobj +1937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.3145 145.1237 207.0205 156.0277] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +1938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 132.1313 138.5977 143.0352] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 132.1313 189.7953 143.0352] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb6683dd83fe1c8de9a24086d4b69e907) >> +>> endobj +1940 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.6109 132.1313 218.2983 143.0352] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.84 132.1313 266.5273 143.0352] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1942 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 93.195 138.5977 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 93.195 197.5461 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00150_g2addf34c7d457c1a7899a7e2171ef1e9) >> +>> endobj +1851 0 obj << +/D [1849 0 R /XYZ 90 757.9346 null] +>> endobj +1852 0 obj << +/D [1849 0 R /XYZ 90 739.9346 null] +>> endobj +1854 0 obj << +/D [1849 0 R /XYZ 90 731.7802 null] +>> endobj +1856 0 obj << +/D [1849 0 R /XYZ 90 718.7877 null] +>> endobj +1858 0 obj << +/D [1849 0 R /XYZ 90 705.7953 null] +>> endobj +1860 0 obj << +/D [1849 0 R /XYZ 90 692.8028 null] +>> endobj +1862 0 obj << +/D [1849 0 R /XYZ 90 679.2077 null] +>> endobj +1864 0 obj << +/D [1849 0 R /XYZ 90 666.2153 null] +>> endobj +1866 0 obj << +/D [1849 0 R /XYZ 90 653.8255 null] +>> endobj +1868 0 obj << +/D [1849 0 R /XYZ 90 640.833 null] +>> endobj +1870 0 obj << +/D [1849 0 R /XYZ 90 627.8406 null] +>> endobj +1872 0 obj << +/D [1849 0 R /XYZ 90 614.8481 null] +>> endobj +1874 0 obj << +/D [1849 0 R /XYZ 90 601.8557 null] +>> endobj +1876 0 obj << +/D [1849 0 R /XYZ 90 588.8632 null] +>> endobj +1878 0 obj << +/D [1849 0 R /XYZ 90 575.8708 null] +>> endobj +1880 0 obj << +/D [1849 0 R /XYZ 90 562.8783 null] +>> endobj +1882 0 obj << +/D [1849 0 R /XYZ 90 549.8858 null] +>> endobj +1884 0 obj << +/D [1849 0 R /XYZ 90 536.8934 null] +>> endobj +1886 0 obj << +/D [1849 0 R /XYZ 90 523.901 null] +>> endobj +1888 0 obj << +/D [1849 0 R /XYZ 90 510.9085 null] +>> endobj +1890 0 obj << +/D [1849 0 R /XYZ 90 497.916 null] +>> endobj +1892 0 obj << +/D [1849 0 R /XYZ 90 484.9236 null] +>> endobj +1894 0 obj << +/D [1849 0 R /XYZ 90 471.9311 null] +>> endobj +1896 0 obj << +/D [1849 0 R /XYZ 90 458.9387 null] +>> endobj +1898 0 obj << +/D [1849 0 R /XYZ 90 445.9462 null] +>> endobj +1900 0 obj << +/D [1849 0 R /XYZ 90 432.9538 null] +>> endobj +1902 0 obj << +/D [1849 0 R /XYZ 90 419.3587 null] +>> endobj +1904 0 obj << +/D [1849 0 R /XYZ 90 406.9689 null] +>> endobj +1906 0 obj << +/D [1849 0 R /XYZ 90 393.9764 null] +>> endobj +1910 0 obj << +/D [1849 0 R /XYZ 90 380.0077 null] +>> endobj +1913 0 obj << +/D [1849 0 R /XYZ 90 367.0153 null] +>> endobj +1917 0 obj << +/D [1849 0 R /XYZ 90 354.0228 null] +>> endobj +1921 0 obj << +/D [1849 0 R /XYZ 90 341.0304 null] +>> endobj +1923 0 obj << +/D [1849 0 R /XYZ 90 328.4115 null] +>> endobj +1925 0 obj << +/D [1849 0 R /XYZ 90 270.7639 null] +>> endobj +1926 0 obj << +/D [1849 0 R /XYZ 90 270.7639 null] +>> endobj +1929 0 obj << +/D [1849 0 R /XYZ 90 234.2545 null] +>> endobj +1519 0 obj << +/D [1849 0 R /XYZ 90 219.1052 null] +>> endobj +1934 0 obj << +/D [1849 0 R /XYZ 90 164.1147 null] +>> endobj +1935 0 obj << +/D [1849 0 R /XYZ 90 164.1147 null] +>> endobj +1848 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F14 636 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +1947 0 obj << +/Length 2723 +/Filter /FlateDecode +>> +stream +xÚÍ[Û’·}߯à#Ye¸_ü9qYUq”híY¥¢H®ÄÒŠ¤¹CÉÊ×§Á€˜Á ›ÝT¥ô %yØ}ÐӧѸÍ(üc3GgFâ„Ô³õç:ûoÿtú—ðù2üåöæû¿q7sÄi®g·w šÅŸÝnÞÌ5q‹%Wt~ûqÛþqþùU÷΋W߇¿šÕúÓb)¨´z®ÕâííË›¿ÞFÇ/%4ónÿ¸yó–Î6Àïå %ÂY5û +/(aÎñÙçÉExqóúæŸÑNûÁå cÓT+ìlÉM; ”5„iá0|Ãc<Yøº–> >¤ÆÙY@ù ¼XݯÏ÷«¦‹HB¢ñq»ÚlOíßëSðÆzÁéüÓÃùsûîánðÕãªE,o›ÜÌnßEw|÷Þ#ÏwÞ0F:ŒÊ0àÍ+‡ ‹ãÄr©¦S†j¬MRF$)ÃàS)¬œE˜Ñœ|‹+1K =Jâ,ƒÇÜ~æß9}è>úWÊj² ¸»3Óž0DS&‹ô8‘Žœž¤„:ÎPz×§O¹Y×/3 É)…L¼HsQN‘Z¸ÁÓ£Š~ñivØmào6•fÚ1" «TZŠ.H-ÂJZƒêód‰êòÆj¿¹~²:7«f5)5m)‘Œ›g‘šÖP&­åˆÔ" •ZjðÉRCØ\]Yj%z–B/àúôà Ÿ7“RÄÈr—„¸çðì¸fðìj…¦81†ñJ¡%è’Ь$´_ü¿šdÄ2ê³C@¬±˜ÐZ˜«Z@ŽyŒ¨e ++I(õ$W SßÓJ xŒEf7(åaÛìŽ#DŒƒvM:$…¹·Œh«î½R2¿VJ¡Ë© @À£ †v'+‡äÔò¨8ôˆBsFý$<:R g˜¡®²4$èRi°ËÀCc»ÛïšÝê~÷ïU³;tš¾;ï×þÕ´l¡>r¬rUªV9hÿ­Qˆj# Umj° ZÄoPmÏ/ªÚ¾ï +Õ",2»Aµ«ÍFð\³Ú7ˆ A@aÎAÛRK1ý¨faÒ±ÌV?à1™ÝËðí˜d¡asØÃ¨Ü/ô-é¼ÎA©Ê GN…÷; yé¸$8ð˜ÃQðï2r$`„« OÄ#áÉíN—4¥ˆÒÖ ñ (̱²„*7ȌÑéRQS¬ªêŠZŠ.µkûÓé[×Ü»>eÕþ'øòý.¼µÙìŠåMiI4Ö@µõM1Hbðú`x}K –ê[Ùo¬o©_¼¾õ|×Ô·2‹Ìn¨o~ZÊXhhh6Ê(Ì·¶DR5ð]Û¼+á‹(e•Éœ KÉ`OŸ¡ׄ²ç𢙀F,…[˜­Há€|Žlj¬”è);ŸbëÃ~Ÿ1„\€M.#*÷Ý›G˜’DÂ6ˆL7ôS,*Ê~§GðØè3»éè·ë|¢€nUKÃʈ(Ä=÷Ÿ +c†È[Î ‰”ⵈx”ÁÐn¬0G˜N#S%¬åÅeV-F  àÚ«A[£)Pj%N-Á…¤ó¬£Ôhftm´"‰Vnw²£‚뢔ˆÂ ÄÀïéx85¥",%B;[W„St¡GØ¥£èTÒî‡z-Åi!Ì|ûù¶W>:àùa·ÿpÝÓd¢°«/­!’aK½ÊB-$ +Ò )Ô†êÔà“ 5Â.àz캽¼ñbm ¸ù]ÚËeDåþûÅ>•TˆAtÆŠµeÐwgÑ),w:<ÌnývÁÕük¾¸PP`° DB H~%†)2V°%#Úï&T!â1™]´`;@§’Ü)B-åãi0V°EMÁ†ú&/r¯‹VÄ#ÑÊíNl¥ c¬¥ÂÜÂPSfúnñz­1ÚÉÊz Kõ:À<…×a{ú|ìÕjóâl·Õ½ÔGKi‰eØ¢µ¶<ƒ +zæPxq¾š+¬ËNcÑMœ¢«ÀžãŠE`™ÂÐj,zûûÝC³Í˾õû˜þÙ”Æ@ˆs«‰ÖÚõƒ>ºÅ_²RÖŽ=À1÷«Ó8[Ú¸ò #¨ì•3ù꥓xEµË™ÿR¥t¯à’r;ÔE¸Í¡SlûÐcš®xõpÜ®wPù¶;gò̧õ +X­<Ï¥ á é· +p3¸‚#²,áVÐpÏ/*â¾ï +#,2»AÇ*†™–‡‰A@aÞ&†J>ˆý¨)¡¦®Úñ<Æ ³[8_âÄ0­ÊC(Ä1§ +Ölf0tLÎÂòv«·JÏ)º èk½:5ÿ I hè5ÅV}µ’†NÆX%0I.éÄà“WL»(ü”]ùrF‰Þ£/g ô®GïcsØ?Œmi M‰Þ2¢0ÇÚÏýl—Ñb añmø-l»ux”ÁÐîô“qþxX`C(̱óä{Ïñ¿r\Ýë`ÄŠÊz Kõ Àº­¿4ú² Uéë‘ÌçÕ¾Ù5ÝáÍ,¢Ôüðy¸¯òþ[Øk9\6_âUÊPQöÛæëáôi k›é­¿˜¢[žÔtXa 0¼°$K½BÙo,©_¼Wèù®éÊ,2»×Ë(û‘›(”X¿Æ,G  0ßF¿#Ý<ÔX †> endobj +1949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 703.0355 138.5977 713.9394] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 703.0355 201.9695 713.9394] +/Subtype /Link +/A << /S /GoTo /D (a00150_g85b65e38aa74eba18979156f97a94a87) >> +>> endobj +1951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 664.4351 138.5977 675.3391] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 664.4351 204.7393 675.3391] +/Subtype /Link +/A << /S /GoTo /D (a00150_g7023a34ba9e9d03b5fbedbcb32924453) >> +>> endobj +1953 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 625.8348 180.1912 636.7387] +/Subtype /Link +/A << /S /GoTo /D (a00150_g22f140b02c354dfebcc7ad481c3bcd68) >> +>> endobj +1954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.0068 625.8348 208.6941 636.7387] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1955 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 587.2344 177.9699 598.1383] +/Subtype /Link +/A << /S /GoTo /D (a00150_g6832e4d2d046536b6472f7ac92340f68) >> +>> endobj +1956 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.7856 587.2344 201.4916 598.1383] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +1957 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.8776 587.2344 256.5649 598.1383] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1958 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 548.634 166.9111 559.538] +/Subtype /Link +/A << /S /GoTo /D (a00150_gc48ed5f0d27721ef62a3ed02a5ad8d2e) >> +>> endobj +1959 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 510.0337 152.9837 520.9376] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +1960 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.9538 510.0337 211.6433 520.9376] +/Subtype /Link +/A << /S /GoTo /D (a00150_g9c24fba2cd8f7f62accb0a0d5bbe4dad) >> +>> endobj +1961 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.459 510.0337 268.3701 520.9376] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +1962 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.2043 510.0337 331.8917 520.9376] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 471.4333 172.9089 482.3372] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +1964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.8791 471.4333 236.859 482.3372] +/Subtype /Link +/A << /S /GoTo /D (a00150_g79c4110211247df3fb30b8cf1c4c02af) >> +>> endobj +1965 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.6746 471.4333 293.5858 482.3372] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +1966 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.42 471.4333 357.1073 482.3372] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1967 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 432.8329 185.1725 443.7369] +/Subtype /Link +/A << /S /GoTo /D (a00150_gaa585784b0914cac1d37f07f85457008) >> +>> endobj +1968 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.9881 432.8329 213.6754 443.7369] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 394.2326 175.2098 405.1365] +/Subtype /Link +/A << /S /GoTo /D (a00150_gdd1ab3704ecd4900eec61a6897d32dc8) >> +>> endobj +1970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.0255 394.2326 203.7128 405.1365] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 356.0058 138.5977 366.5361] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 356.0058 162.6772 366.5361] +/Subtype /Link +/A << /S /GoTo /D (a00150_ga22b04cac8cf283ca12f028578bebc06) >> +>> endobj +1973 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.4928 356.0058 191.1801 366.5361] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +1974 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 317.0318 171.8826 327.9358] +/Subtype /Link +/A << /S /GoTo /D (a00150_g04b053a623aac7cd4195157d470661b3) >> +>> endobj +1976 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.3873 234.645 192.0768 245.5489] +/Subtype /Link +/A << /S /GoTo /D (a00150_g561b8eda32e059d4e7397f776268cc63) >> +>> endobj +1977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 196.0446 152.9837 206.9486] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +1978 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.9538 196.0446 200.0271 206.9486] +/Subtype /Link +/A << /S /GoTo /D (a00150_g788ffac72342f6172343d7f8099cbe1a) >> +>> endobj +1979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 157.4443 152.9837 168.3482] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +1980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.4818 157.4443 196.4305 168.3482] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf703683056d2bfa5c81fa157dcb20fe2) >> +>> endobj +1982 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 144.6198 172.9089 155.5237] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +1983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.8791 144.6198 239.8777 155.5237] +/Subtype /Link +/A << /S /GoTo /D (a00150_g210f227119fc972e6222c9cb452e15a9) >> +>> endobj +1985 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 106.0194 172.9089 116.9234] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +1986 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.4071 106.0194 236.281 116.9234] +/Subtype /Link +/A << /S /GoTo /D (a00150_geb533744817cf6695d75293369c2248b) >> +>> endobj +1987 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 93.195 151.3294 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00093) >> +>> endobj +1988 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.8276 93.195 185.3713 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00150_g9ee50a40597e67fce96541ab56c3b712) >> +>> endobj +1948 0 obj << +/D [1946 0 R /XYZ 90 757.9346 null] +>> endobj +1975 0 obj << +/D [1946 0 R /XYZ 90 253.468 null] +>> endobj +1406 0 obj << +/D [1946 0 R /XYZ 90 176.4106 null] +>> endobj +1981 0 obj << +/D [1946 0 R /XYZ 90 161.4293 null] +>> endobj +1984 0 obj << +/D [1946 0 R /XYZ 90 124.9858 null] +>> endobj +1945 0 obj << +/Font << /F29 499 0 R /F50 1172 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2003 0 obj << +/Length 2504 +/Filter /FlateDecode +>> +stream +xÚ­[ÙŽ7}ï¯ a"šûâÁ<8±ؘ8¸ý2¶a¨%u·`µÔÑ’Ääß粊d³]JÝ.U"ï¹ ‰ (ü±££ qBêÁôþ‚náö,<ÃóqøþêâÉKîŽ8Íõàê¦jA3¢8ルÙû¡Ö£1·ÔÐáþÕ%\*:d„Ö?­gûå¼¾~¾žîïç«Ýd·X¯F¯^_¼¸JýZJhæ{ýíâýG:˜½×”gÕàø@ sŽî/$ñÃòâíÅ/©úAõBßè$UÄ +;sS'uÀŒÂ4{p½áÉŠ,¼®¥7ƒ‡Ô8;ˆ(o“«»0èd’«.ŸÄë­·Áv·˜nIÛ±OàU&N0ðc‚)Ë ƒæ†²G9E&'£šHaå Áü>p®ºÜà-®Ä o°Ý£$Î2Р~æïlnã_sê €Të"»ˆk°ÛÛO»;Á‰æÀØq"5evBƨ-²‹¸&»Å甊Éí¶CÒ0¢¥(ɱ  ZX¾CÊjçã0óÌ~e¬¨lÞàÙÊØE\ƒ·Ýâa2›mzÖ¼%–•ºÌR["˜rE–×ay·†0žm–œCþ‘T¢,AÙ€*kl 1¶oLã+kœ5x¾Æ8»¤qÎî8–§kŒ³L·Y®æ»ûÉösGbHÎ\H‰’ûÂP¡ÊkI¨d²$q„•%Î<_bœ]’8gwœÄËÓ%ÆY&‰Û,g›Þ fœPÁ ʨ²ÂŠ&%˜ÂVV8kð|…qvIáœÝq +#,OWg™n³,'j„e;Qžei¡‰‚%‰#¬,qÖàùãì’Ä9»ã$FXž.1Î2IÜfY +b„ã)A H˸.)ae…³ÏWg—ÎÙ§0Âòt…q–Iá6Ëb%FHžR‰Aª)Iae‰³Ï—g—$ÎÙyãÍwwŸú„iC¤q eyì’I{&° .±Œ¸>–ýQlˆ0JrœP…î}Ò§ŠµŒôïz]þ×_ô»ô÷÷ß={Ê)"¸6( ”`EÂz<Ù +ì"®Á]kcìN^kØE\“8ÎõˆÓáþ¦/9ª8.ZB•º÷©É©V÷ïß½ºüôýˆÑá»—o_ý÷Å?ùÇC;:Ê8¢Çm9åhdÏ)Áú7&So›Ïžà|Wß‹Öbvx3ߌcûP +­—_cJ)I¬u¥EN‚•##k°ÇUê7ù|ÞïïÞFëÅÌ÷ýä%Ìþ³ùƒJ½T)‚’a…j<_¢Úi7Àäáa6ÙM:D#ÔR…[Ê +âL~ÇL#”<Ò?…#LÉ’{”'z9²Þ¦«8]刻uø?º- c¹˜ÖÛÃÕjPÕÕbÕžíÙÜæÔ û«È¬AIÅKÛp Vví¬A̵ñ~“kçý~%×n<Ƶqªv£koú6 NÁL±`ª€*KH)1Ô•vÙ¬,aÖàùug—„ÎÙí™î+܆hÊ$JïØÂ-Á_gEzפâ.ç«nÑö‡(0-ÃÂ*&ûÆÄœ¥ŽËYÒ‚Œ°…¤•`š +\owwõõúæˆlÔIYùTåä|%$ ›û*ùJjJʧUtõ¬¹³=§a95ÜÏn'»9Î-ÂÜ|ëór#ˆUŠaô|a®0e9¥&Š»Òù^‚•Í<_Qœ]’4g‡®90v'¯9 +ì"®Éîˆó=Œäñç{Æl¬.*aee³ÏWg—”ÍÙyÛM׫nD(݉2'T·ïÆLæœDËZ–é›ÑhhQQÖêÙæøÒè;í¢£wP{„÷3lô0·ÚÚS«Tª¨.U½;n®>Ýo6#a†óÕ.}¿!<ñͧ~¸˜ãRÇÌW)fÂÁÜQZ[ˆ‘+ÆHÞàÙ1R`q vÅÁ›c„”F\/Ãnþs +Ì-9JqœP¥ÎI`ÒÓè¼Úsùáç7oÞ~ìÙ¡ÆBåWˆ¿dÌ_"¬ì/H§û Î.ùKΟaôNžèE\“žŸé/¶»ùêa½ÙmûrŸ`ŽáÊ%TLˆ¥Ï*—ùÏ«·W/Þ\þüëHCºêw-!ÅÞÃÊžc®PeÏ9ÜÝ鎃RK~“QóºìgR ÌcãµHu:ocXºH*DÓ.}µæEÖ´írxì^{»ÕÒØ¹°ÄZ&ñ± F sòÄb,¤#`1U(Æ ÖX‚vjî»çÇ×\£bÚê¯Ss9HÊUé”#ÁÊ‘5x~(àìR,äìŽ „屩´YdqYn»~«·Ò¢4Ç U À¡~£ZªD +n‡Ô_F‰¶Üö €ùN„•}éñtßÁÙ%ßÉÙ¡«UŒÝɫջˆk²óÓ©à]·†Y¸Ò—,¡JC½UÒ´Ló^<ã~Wš#ÏÃr4’8Ìw.Ç×_vñlR'SÃÉ—°·Ïê«›õ¦µ´||½v;ÿm?_MÓÕþþ:®ˆ¦“åt¿¬+‹›ûÃk‡‚ÊW‡¾ißú?D!µ¡J<6DXhêÛY£-ðÏ./Ÿ„>95¼9:|öÉŸv†¦Åá¦SíŠ{\U{µqÿ‹êø§¿û‡“Årr1´¹6Ø‘P;j¾È%Ì-ý$ÐÙB€%ü8¡''vÚ-AsÀ ¡m‹H;%GT¡{A)±Ü´ºoYV©zÙ%"À}Y×\Ê Èb †szx?™nü²4½[/gánpѧ Ü¢ÁKµ:p+¨WA¸ªÔP:’¨‚@…™W¥óÑ„ç/ô˜§ÓnA!ýI¾°-"-uªÔ=Ä&7´Õ}Ÿ:c)MˆŒ\0Ú6K³*Cy†§×ódîYPX….Ç)M@—)j¦wóéçÅê6Dàz¿ªDÎ0Ä]3Üjw¢ÑêÀ~ñçäþa9Ú¶©U„2k #C-âÏî<Îѵeõ–þÕ* ñAB±°ªL(O`»zØ€n>PE³3ðïFcM³Ö³«:S…Ûßücÿ ¹ú&|^ÀÛì_=ilº„œ ³ 0ædÔ“P&–‹˜.™¢ºicÿÎòñˆÜ‘¾ß>1Â|ñìq@ +´˜Vú¬ŸEU3/ðKó’¼¼èpÒîËáEYýò¨¦âGüã|5ßLv±VÆaÿ/^ûšºÿÓ§\<åá`œFƒTA2zç§b×_bñúóËm÷ÈDÁ4®ÇJÿ +b©Íendstream +endobj +2002 0 obj << +/Type /Page +/Contents 2003 0 R +/Resources 2001 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 1754 0 R +/Annots [ 2006 0 R 2007 0 R 2009 0 R 2010 0 R 2012 0 R 2013 0 R 2015 0 R 2016 0 R 2017 0 R 2018 0 R 2019 0 R 2020 0 R 2021 0 R 2022 0 R 2024 0 R 2025 0 R 2026 0 R 2027 0 R 2028 0 R 2030 0 R 2031 0 R 2032 0 R 2034 0 R 2035 0 R 2036 0 R 2037 0 R 2038 0 R 2039 0 R 2040 0 R 2041 0 R 2043 0 R 2044 0 R 2045 0 R 2046 0 R 2047 0 R 2048 0 R 2050 0 R 2051 0 R 2054 0 R 2055 0 R ] +>> endobj +2006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 702.117 133.6164 713.021] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +2007 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 702.117 172.6397 713.021] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb4ef6b00924990e7a293f66715b6d1d1) >> +>> endobj +2009 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 688.3741 166.8215 699.278] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +2010 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 688.3741 221.3367 699.278] +/Subtype /Link +/A << /S /GoTo /D (a00150_g7d3673f52f5846b6961d23b150decd54) >> +>> endobj +2012 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 674.6312 166.8215 685.5351] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +2013 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 674.6312 220.2307 685.5351] +/Subtype /Link +/A << /S /GoTo /D (a00150_g3237be0d9ec457de0177689ee23c0d5c) >> +>> endobj +2015 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 660.8883 166.8215 671.7922] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +2016 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 660.8883 213.028 671.7922] +/Subtype /Link +/A << /S /GoTo /D (a00150_g20df5c82f2a15a508c19e505b5d9de2b) >> +>> endobj +2017 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 647.1453 166.8215 658.0493] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +2018 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 647.1453 221.3367 658.0493] +/Subtype /Link +/A << /S /GoTo /D (a00150_g7d3673f52f5846b6961d23b150decd54) >> +>> endobj +2019 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 633.4024 166.8215 644.3063] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +2020 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 633.4024 213.028 644.3063] +/Subtype /Link +/A << /S /GoTo /D (a00150_g20df5c82f2a15a508c19e505b5d9de2b) >> +>> endobj +2021 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 619.6595 166.8215 630.5634] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +2022 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 619.6595 220.2307 630.5634] +/Subtype /Link +/A << /S /GoTo /D (a00150_g3237be0d9ec457de0177689ee23c0d5c) >> +>> endobj +2024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 605.9166 168.4754 616.8205] +/Subtype /Link +/A << /S /GoTo /D (a00089) >> +>> endobj +2025 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.9735 605.9166 218.5572 616.8205] +/Subtype /Link +/A << /S /GoTo /D (a00150_g499bb98a0b4ae9a98553ede81317606d) >> +>> endobj +2026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 592.1736 133.6164 603.0776] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +2027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 592.1736 166.9014 603.0776] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +2028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.3873 551.7363 192.0768 562.6403] +/Subtype /Link +/A << /S /GoTo /D (a00150_g561b8eda32e059d4e7397f776268cc63) >> +>> endobj +2030 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.3873 511.2991 195.9522 522.203] +/Subtype /Link +/A << /S /GoTo /D (a00150_ga05a3dde2048480fa3ab2a5961898d18) >> +>> endobj +2031 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 497.5561 138.5977 508.4601] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 497.5561 170.976 508.4601] +/Subtype /Link +/A << /S /GoTo /D (a00150_g12a33f0c09711167bdf3dd7d7cf8c5a1) >> +>> endobj +2034 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 457.1189 138.5977 468.0228] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 457.1189 174.8513 468.0228] +/Subtype /Link +/A << /S /GoTo /D (a00150_g5b5615dc240daed20949c0fded2b4679) >> +>> endobj +2036 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 443.3759 133.6164 454.2799] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +2037 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 443.3759 172.6397 454.2799] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb4ef6b00924990e7a293f66715b6d1d1) >> +>> endobj +2038 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 429.633 152.9837 440.537] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2039 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.9538 429.633 200.0271 440.537] +/Subtype /Link +/A << /S /GoTo /D (a00150_g788ffac72342f6172343d7f8099cbe1a) >> +>> endobj +2040 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 389.1957 152.9837 400.0997] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2041 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.4818 389.1957 196.4305 400.0997] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf703683056d2bfa5c81fa157dcb20fe2) >> +>> endobj +2043 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 375.4528 138.5977 386.3567] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2044 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 375.4528 200.3154 386.3567] +/Subtype /Link +/A << /S /GoTo /D (a00150_g236d5c7872f59c8fe7b701c7252b976e) >> +>> endobj +2045 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 361.7099 172.9089 372.6138] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +2046 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.8791 361.7099 239.8777 372.6138] +/Subtype /Link +/A << /S /GoTo /D (a00150_g210f227119fc972e6222c9cb452e15a9) >> +>> endobj +2047 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 321.2726 172.9089 332.1765] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +2048 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.4071 321.2726 236.281 332.1765] +/Subtype /Link +/A << /S /GoTo /D (a00150_geb533744817cf6695d75293369c2248b) >> +>> endobj +2050 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 307.5297 133.6164 318.4336] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +2051 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 307.5297 177.0532 318.4336] +/Subtype /Link +/A << /S /GoTo /D (a00150_g2a0cf5d86c58fab216414ce59bf1fea1) >> +>> endobj +2054 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.5461 195.4567 299.333 206.3606] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +2055 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [313.5331 177.8323 346.3201 188.7363] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +2004 0 obj << +/D [2002 0 R /XYZ 90 757.9346 null] +>> endobj +2005 0 obj << +/D [2002 0 R /XYZ 90 722.0018 null] +>> endobj +2008 0 obj << +/D [2002 0 R /XYZ 90 706.1021 null] +>> endobj +2011 0 obj << +/D [2002 0 R /XYZ 90 692.3592 null] +>> endobj +2014 0 obj << +/D [2002 0 R /XYZ 90 678.6162 null] +>> endobj +2023 0 obj << +/D [2002 0 R /XYZ 90 623.6445 null] +>> endobj +2029 0 obj << +/D [2002 0 R /XYZ 90 531.1839 null] +>> endobj +2033 0 obj << +/D [2002 0 R /XYZ 90 477.0037 null] +>> endobj +2042 0 obj << +/D [2002 0 R /XYZ 90 393.1808 null] +>> endobj +2049 0 obj << +/D [2002 0 R /XYZ 90 325.2577 null] +>> endobj +2052 0 obj << +/D [2002 0 R /XYZ 90 267.6373 null] +>> endobj +1847 0 obj << +/D [2002 0 R /XYZ 90 240.7961 null] +>> endobj +2053 0 obj << +/D [2002 0 R /XYZ 90 240.7961 null] +>> endobj +2001 0 obj << +/Font << /F29 499 0 R /F50 1172 0 R /F23 482 0 R /F14 636 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2058 0 obj << +/Length 2056 +/Filter /FlateDecode +>> +stream +xÚÅY[Û¶~÷¯ð[m f9¤$Jyk7MÛíÉIö­-ZYk ‘%G–²Ýß¡x±¨«=ÀÁ>,E~ä ç>4¬)þÁ:¢ká q/X'§]púçèå®ïº€ïWß¿gÑ:"QÀ‚õýS{BÄgÀÖ÷û?6‰¶;æÓÍý1Uƒæ×zæîã÷f|©ãäËvÇ©›@lÿºÿ°úéÞÖ|ù<Iöëê¿èzü}XQ£Ð_?ã%El}ZyŒ›|õyõ_{ŽZh7Œ]Ï>~?ù>3dx_aïGøv”ÒÍû¦Hê¬,Ô•Þ•IsJ‹:n§ðB=I¡(™GBázþÍ Âý(Z êðy¤—KÕAc>u®`ñ»î†¡ž†çJ&ê >¨ßc¡';‹Z"ìsøhác]%·?©O,„Œ€Û¥`ðKÌ Î”£A¶¤`QCÂh>WÂŒF„Rޓ·81`„ǀĠx@ƒx´ŽòÂ3VÕ‚ïÐò<ºù¶“Vµ0»ÇL¿6qQgõ‹úzªÊ“Ë‹F<¾ÔÚqËjŸVjX—ê‘ÖÏ[K_ÆÑ¾¿!’[ií HÀ<¯eìþ˜¡º9ˆÍ“uùefÏUvŠ«,‘ŸÁ¦¹¤{ /+5HÜ«eÅAÍÛ2ƒ[ãÇ<5$ÚkÉ‘º–)FåH_K’‘×’SεÆÐíµ0\À潤<™;š@wãPJç1Üõ啲ijÞèzÑ 5Õ¾F>¡aÄ×O‰ð¾à*¿ënP®Ò5°á¹òŽ¿Üo!Üüç÷ÏÒkivÙáÜC4í³Ós‹Z`‚sA˜.§8©´ 3”lï•É¡#(´cyïÒ?)eEv Ô±¶ô<+´X! ™–ü“ J”å&eg’ô¬Zqò)}J«´HR­Z+Q°è½Ñ·=ÿ!9~¹4'#Ô7…²(Ò¤YÉΓ›šýùñÜ[ Mü9}Lò ÓÕÃ!µ§“ñ´…ʈåuÒÓð[kÀÙþJ:Þï9› ìQH‚0*“p‡KÝàwÝ #}pnØÃ‘¸Ž*ñ)æ#—ƒ~\7¨!]ðº^8Ž0ú:tÑz¸¥“ñ„ ëåÅ4ûqÈ|®AoÌûŒpA½[Ågñ âž;E€y`A~5$ìæEz @¸„Ë3‹Â™JŒŒ†Ä…[mÝÅU¥Ý­l´ÿÇêg×ôˆÖÛŠQÿý1Mb‰aS”µÄy. sPrÌjôÕ¦RñTò’ƒçc–ÕP—ÃЦ>¹/+ê´Ø« ›c¬÷XGJVéDÍ]Y™òêã)­³ä:ÇŒ<ê3âB-¥òŒ¿ë´*â\­Ü¹ L éšš™ šy›}©R™Pù§Té×&«Z¦E‡/qáE}f…‚ØØ¨Á¹*ë2)sµŽ_F/H -Ç U1´Œ8l]Že“kºHk,צõÐ Vë¶’ÁùÐÖè—^4<çqÒI±íµØäµÉ3½ÅC^>*YR§éÂ$áŒô½'Ĥ +hœ6!ããm‰íº¨¡Ó†mI‰gñòî¿—uúvu)–½œÁ’sîÆ…ÿ­¡XÙsT³€pÉ]»° YX7ÅŽjhž®ÕЀº? {ÒI©N7¥¶ÍÜyšö5ØWS¸¹æg^ôº’¹ˆ¿œó¬~Àúâܼ¾¤æ“/A šº^‚ºf^‚,lù%Èeaò%h°y r Ûîgºk`”±[ n…Å/p4áÔcó¢°¨!a·mÀ¾VD^O7´ [†¶ö4Vsé•ádç€õu(]ûF jø’û§NË/D' +E° ?ƒÒuÛ†ˆb{r—pžãÏi&—šDE $Ü®!Oš<®û¥á¯2»`Ì×ï;Ç4¹Úo)C™~r‰QÖ O³/eíËSÔ!±n½‘kêÙ,Ò•.—Eú¤-¿4‘‘îâÆûNµ?½¿ÃÔ5]FA&˜7_FuQÓe”  {ÖWÕQc Ìdé'ãYÚÂzîî¦ÀŽ<+‹‚“¨Y@8Ç(èž+¥¬#ôt:á¶ûíìt&ë½>ÚeƒýÂt‰$_ô1ÀB‰Ô…Í ßÀ:áÄ<%žçû d jH¶'xŸx,]²ö‡3¤¨n‘òÿ—¼u?`,Xp¿jÚýÀG<¶°ºÂª›J^¢˜ó½9êµÈ6²æÈ6Ê/èãZ ‚¦¡ TvsÊþUªÛþÒæT£ýZ±zóĨ$) + d{ùo~ƒmDq 6]3À²WÈ÷¾§.ò?§EZŵ©°„~3ƒÒ8ýú±è[Æß2ª‹{Jý—ÔHYõ~ŠBÝòý]ù÷Ëaèïòâùü–K$endstream +endobj +2057 0 obj << +/Type /Page +/Contents 2058 0 R +/Resources 2056 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2072 0 R +/Annots [ 2062 0 R 2063 0 R 2064 0 R 2066 0 R 2067 0 R 2069 0 R 2070 0 R 2071 0 R ] +>> endobj +2062 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.3636 702.4242 152.1568 713.0144] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2063 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.7156 702.4242 207.5088 713.0144] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2064 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [294.093 647.6032 335.7466 658.5071] +/Subtype /Link +/A << /S /GoTo /D (a00148_g69a7a4951ff21b302267532c21ee78fc) >> +>> endobj +2066 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.6856 560.3152 218.4975 571.2043] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +2067 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [251.3742 560.3152 277.1673 571.2043] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.3636 305.376 152.1568 316.2651] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2070 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.5073 305.376 236.3005 316.2651] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2071 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [262.8907 305.376 288.6839 316.2651] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2059 0 obj << +/D [2057 0 R /XYZ 90 757.9346 null] +>> endobj +2060 0 obj << +/D [2057 0 R /XYZ 90 739.9346 null] +>> endobj +1996 0 obj << +/D [2057 0 R /XYZ 90 722.6349 null] +>> endobj +2061 0 obj << +/D [2057 0 R /XYZ 90 722.6349 null] +>> endobj +681 0 obj << +/D [2057 0 R /XYZ 486.51 597.8832 null] +>> endobj +2065 0 obj << +/D [2057 0 R /XYZ 90 578.8113 null] +>> endobj +1944 0 obj << +/D [2057 0 R /XYZ 224.7534 342.944 null] +>> endobj +2068 0 obj << +/D [2057 0 R /XYZ 90 323.8721 null] +>> endobj +1992 0 obj << +/D [2057 0 R /XYZ 167.4587 96.348 null] +>> endobj +2056 0 obj << +/Font << /F29 499 0 R /F52 1229 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2075 0 obj << +/Length 2271 +/Filter /FlateDecode +>> +stream +xÚ­YYoãF~÷¯ÐÓB¬Nß$½O‰Ç™ñÀ‘½¶fE4I[ÄH¤ÂcœÙ_¿ÕÅK”³»ÐûøºªºººŽ™aø‘Y€gžðPÀ¸œEû <{…áÄN/a~Ùü´¾øágÌH*gëMA$(¡³uüë\ú‹%õ±‡çõí4ž„Mã—<®w‰iÈ£zŸdUX¥y¶ø}ýùâfÝðµb &‰âúÇů¿ãY â}¾Àˆ¾˜½A#t¶¿à”¹Îîâéâ 3¡ŒíNöžíQèzvw(@ ñÅ’`ŒçeUÔQÕžŽ<.ýf¡f­fŠW yl ÑÀ—-üPU%N6Qž ôGްºô6ï0¶„·Ùö()®¿aÌÇž„âÀÁP>îß°À})©ð‘O„x§¢ø´¢T<é!Œãb38/F@³LÐIm5 iu1â!JOê ÖwõE«°ÂH7¢V†çBZÜå@z –O¹÷N%6ði%¨j%9¢=Ÿ¡€ +6­=píh„ùq";LyQh…H$±'¬VÀºˆ±N!L˜ åˆñÀ¼nf•›oh>E²Ï+뢶yiAu™f¯¦¹¾~XBæHñöK8qI9Ó”×Û´˜äó—:‹´gƒž˜»ÑºLbÓÒla¦¬Â¢2C¡ùdÉ‚Šù›™¶wÈ:.«¶‰(I”‚QGXëKcš5¬Á ½9´X2Áæ·N€Ý.Â*)[òˆF·]‚!Œ"ÛÒ1‚çi ÝHS,8c]2*çeR• EQþJµ/ZmOÿZmžnVkÓ-Uv"Ìb¡Z$Ufå>-Ë#åtÂâ¹Âhl3ö왿¥»iE!œ˜i†æ£ŽT hF@ÄüUÅ23`,ŠÌŸp3yí [;—éźaÕŒ0´k0ã„<$EšÇi‡öÝŽy””`a—Ýí½½·mm5×n¶ôð<Î3köo)pÏL#ae‚ľTJ§úúlí*%Hs£ÖGBb>“‚"ÂØ9åàËÞø(Öñµ=ª½À£BŽs i<†|ðF]iúËÎÈЧ¥d@}޾@˜øÞL‚ÄÒcÞ(GZ¶QCÏì Ђ¸ ©ïkŽ+ðYWƒ$SY”L³mP#|Û;%ØCWÚÀŽ—†¿åðTφ Šçß” wiø¬’?5œgÊü4ðÅ|Ëú`<—¦•v9T‹¿©[âÖËdj.Ü47G¯ÜÏk](?§Fž-£8Q™öãªÿåöa³ó?*Ïu½¾ýçÍæþáfÕÄ^šAÆE±@Ôó@ÙX‚ž\Ây:™qøe{ÁPíCºÖÊóC…¶)˜(a¼'EïÈÔ9ÞjuƒÊT^AWyOi)‡À±sa,hÇB®œôuZè Ãÿ€†[Ïêý³v/Üê¾Ï¥ý’Â$ÕÛ\y^|µ€ï•…äEÜDÊ©vܰ,C K*ÊFÚ{zäp­󃙀ôדg=Vƒ_¶ 5:¤«”öi½ƒ¼_=òXªNéJ2VÈL³nî¯ð)ò±oÎ+/^CyUÌŽ°3Õ‹…/Ûøî}ªŠù¶Ê³òÔž ›£Pïté{/‡:ÇŸ`Ê^o÷.öA´€ÀßïœôÞÊ\_¯– §½xmä¼²ZLtY GåƒÓmPƒ"î&˜»îý½qS>dÑA«ø7Ó¼4«H@/‰ô/É%Ušm–ˆK.ÆÂdwý§µµE_ŸLCcT)CõÌÄtHk£N‡4Aàl|ßD–u½Ã"Ü'k”§ƒÛ˜An I§9^ëÕfÀ=(õ&Uà@#*èÚ'C„« Òf¼vÉ•{IQb€¥šNþÒKÁºµK…NêŒC%•ϘNÚ° ]5°v¹Ö᫊¯³l-hȵ«(( ”t]®?Úè,—Ï©-Ùl;bkÁ}uØ@U·¶¢õ–Yà[òíR0‰ÍkÒ”ahä«bN¦–æuUØ×Õoú‚¦q£åMš¥­çD7âñw}š×hE$…jäßáñÄ]†:õ¨Ó‚Y5lùÙüÔVÁN]ÎŒžóÜ=#ºÕ„$Iz޼‘u}ýðƒkƒD_GÏé=̼à¯Y0X°B*ƒ¹»}Z߬îp5×O“ç*[ç*‡qÁCL@ AU-á‘s5Sƒ_¶Œ<•èž|½$`—DbÑ¡ïXêcp¨“h±NÕ¢íײ޿Ûz—Ò’²Flq®Ã]Tïªo0ÎF¶I»Pm“èÈr,Àš”I5\ꢤ’üYUðõ˨u¬ßÏß]¡£È*ÎdŽûa)>FéSÙOO†©N4˜ïOGð6êt'¬;`ÁûCø$÷c ² â ì/È9ýu á虎aOÄv ®¿´´þ߇ZFüÿ‡£úpó“²î/7·«õÏ ß<¨ ö¢°ók·Ÿ6w7«~0Ó.ïNOMù^”Tª²O²§â¤‚”‡]Zmòº:ÔÝPÙÿ?”¨Lqô_Z vA¤ÿÓ_¥ú¯^–ÖIZÁº=æë·N + ¹¤(j÷“,)T†e-sÿôÚÆgujÛ!Ô~ñeWîRSŒ¥¯ÊŒò¢›¿f?ä~M²±W’-ýÓÛ[ˆendstream +endobj +2074 0 obj << +/Type /Page +/Contents 2075 0 R +/Resources 2073 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2072 0 R +/Annots [ 2078 0 R 2079 0 R 2080 0 R 2081 0 R 2082 0 R 2083 0 R 2084 0 R 2087 0 R ] +>> endobj +2078 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.7506 726.9434 195.0552 737.8324] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2079 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.8193 726.9434 315.7315 737.8324] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +2080 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [359.1284 726.9434 384.9216 737.8324] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2081 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [317.5642 648.9799 374.8887 659.8838] +/Subtype /Link +/A << /S /GoTo /D (a00147_g8096b0c4b543dc408f4dd031ddae7240) >> +>> endobj +2082 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.2809 603.5654 239.2097 614.4693] +/Subtype /Link +/A << /S /GoTo /D (a00140) >> +>> endobj +2083 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [472.3426 591.6102 513.9963 602.5142] +/Subtype /Link +/A << /S /GoTo /D (a00148_g69a7a4951ff21b302267532c21ee78fc) >> +>> endobj +2084 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [117.5067 579.6551 147.7231 590.559] +/Subtype /Link +/A << /S /GoTo /D (a00148_ga22b04cac8cf283ca12f028578bebc06) >> +>> endobj +2087 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.3636 227.4529 152.1568 238.332] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2076 0 obj << +/D [2074 0 R /XYZ 90 757.9346 null] +>> endobj +2077 0 obj << +/D [2074 0 R /XYZ 90 739.9346 null] +>> endobj +1991 0 obj << +/D [2074 0 R /XYZ 286.4315 370.591 null] +>> endobj +2085 0 obj << +/D [2074 0 R /XYZ 90 354.6099 null] +>> endobj +679 0 obj << +/D [2074 0 R /XYZ 224.9827 261.9201 null] +>> endobj +2086 0 obj << +/D [2074 0 R /XYZ 90 246.9153 null] +>> endobj +1995 0 obj << +/D [2074 0 R /XYZ 300.8374 96.348 null] +>> endobj +2073 0 obj << +/Font << /F29 499 0 R /F14 636 0 R /F52 1229 0 R /F23 482 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2090 0 obj << +/Length 2121 +/Filter /FlateDecode +>> +stream +xÚ­Y[ã¶~ϯÈclT],[ÚóÔ{wÑîÎÙÉyj‹“(3Æ&vêKg§¿þP×X¶“LÑb0ˆ,Q$ERI›Ì1ü‘¹ÄóŒgH²$o3<„égÄ-¯`}Õ'øf=ûê*çÉ”¦óõÞpH â”Ðùz÷ë"Er¹¢/ÖOʺwwnæÛ»¯ü¸ióíçåŠáD¤‹T._¿Ÿ}¿‚^œ¥D‹ýcöëïx¾ýÞÏ0bRðù3<`D¤¤óã,¡Ì?f÷³ÿ>vÁl˜:'ì5ç£ð˜…ã!†²åŠ`Œ. ^TÅδ8=ЦU¥}þ s<<‘1žžF+½P?:ŠO=ý<õªG>VqÈSëÙ‘ô¡ +§D"ÂᤑôMÑH(§=¡””&œEROUm„LQŠ3ü5˜…8"Ö#Z‘D Ê©8Ä“4Ä÷m,9­i‹òÑ>¶•ûõq֜Զø cªœ?´6hhÁ&"›§)Es9iO´êS /$˜¯,A"%Ähü¡jÕÛ‘Û1E£äºØ@5!·o*‚3”ÆÏÜŒ©Šr ¦`LÛ¤h`Dåbߕ۶¨J;¯–„/¾€Z·lŒ§WŒç̨ìŽUÛåÂí+UûlB½þl6/­ÛXÕ; Nðâ <'r‘Ûé-ˆLÌá U7Aƒ®ÑX'Éxš ¬sñZúvóÕvúi½$bññý¾Ÿ>ûêpLPB²äº³Õ %8NP†#%ªz"Þ©#Éqv <ýª¿áZ°x2-ÿ©­Êæ’€1cU†Ñê©n)ÀJàZGòu|ê;Zª­jš¼~Y¦|qù²ØHJ¢uåÒö¨­:€x€Q˜@w}=•ËÝÚ&?­]tcýÿŸKªqA#ìŽô©.ã— ÑTZ¹Ó.¯ó£já]F”)® ËH“ÕC°²>¬Gòi‚.‰?‹uDç"RÃ0IýÚFIW›¢=#º‹‡Rz\”>–z(¥',Jé‘E)îBl¾bNàŠAéB¤0¿S:{”…ÅK½-©§tŒ /9Ž{Ÿä1=¨P ­•uÉPJ“İþ¤öªV€Ï.ìÿ÷îîáçw÷ëï?Ü}ü´L¡6ºìcñ¾?‘ý}R‡CõàN{Ø= µ¿ÍoIÛž&òÒ1kÕLÓ ‰ô :ÁÆÒùÅ–@âb Ô(/@3…DÐ8+R#‚$ýH2@j_"`f©¢èÌP…†%Ùåm>Uj˜øõ|Þøi'¸Aƒ¥ðüPµM°3׿FáBáYB]Ý"\6V0šÚ˜)%˶«Á»Î<`)@C|“!´69f´—Óõ“Ÿí$02•ü:GÀ¨êZ;ÈÝ +$a´*£VM¼·¿P®Û>‚ô¥‹åáÅq:Å6×z8Ú§ÜqxÊ—Ôç~;³QÊ«ëê ¨>ë€P»pZdÎm%é=4ûÊÝvµ¤Üñö–;Õ•Î"¡4ÜæÎÐMä„ÉfÚÈ«N3Ôcm¨¨ëôŒ=œ¡Û¶]~ÐfÐO¦ÎÊF…½'Ü·¦ŽÒCû³…}–\»È²µ ¸qª­’z\wû>;;¿yñÛœÒÇüKqìŽS ç!Äž‡øPÔ3ƹz +Tª´EŸpq"©µ¸^y.Œ¶@œwmuWoݹaq[W'»hu‰˜7•qFÓ +”~£#':€€G]ä­Û?PxâHî& lƒ^·:4¥tý&Ì…ë1ÑzABç,“H`Á^Ñ|úUÃDöñõű¹XbQ(ž>RfØ‹yª*PÀgÀ‰4VÁ^°ÈÆYÆC„´3tª~q‹æ¦ Ó2×èï=6è ª²Ü­¯†~²ñã䛬k:<­¦óª-t¬/”WŒ +5&»^^õ©.—W,ÁdE›vU치ˬ¼YÇ)îã8<í*S¹(«ÖN=vPÿ•­RöÑšúƒfI ÒàLOuYgÀts­•¸ìTÓenSÏŠAV·r¼a—×þP5NnQž‰£[kýÛ+ËtHÓ3dô’Ès6Žd*_‚ç¢}:CÊÀ‘0¨ÈÀç$….MÜzÑèWý c—Žùú»^ÛÞúx.¥F:¥%ʃX§Apª[š¤ q íK¤É 9jël”É‹—Uk@ž¸¬gQxÂæ¶RΑȉ1Œí’ë Ë÷^ÉÔêœxC­s.ƒºs¦¶ùÏäww."Õí3½õ¦Ou ¨~a#þ^Ÿ5%ÿ +4Œ™î³Y¿¦û,HÐ^? š0@Ü‹Cta–Hî×¾»‚BÙ7U£×kgÿ=?Û'WY71õF…ÂkŒégS&P0§LÜ@×>Ù5z²^[Μp~C¬§‹ôªÆÒ"^vû‚ÌvZ>oöúųuwzË|€NÜßîT‰âßhUMK0¡vf Lþê®Q^éÛâTì.¿9§#!¡#> endobj +2093 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.3577 726.9434 220.1509 737.8324] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2094 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [460.7601 659.7528 502.4137 682.7215] +/Subtype /Link +/A << /S /GoTo /D (a00148_g69a7a4951ff21b302267532c21ee78fc) >> +>> endobj +2095 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 647.7976 136.9336 658.7016] +/Subtype /Link +/A << /S /GoTo /D (a00148_ga22b04cac8cf283ca12f028578bebc06) >> +>> endobj +2097 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.6109 376.6552 236.4535 387.5592] +/Subtype /Link +/A << /S /GoTo /D (a00147_gb5fecbc62edd128012cea0f47b57ab9f) >> +>> endobj +2098 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [309.2914 313.2651 361.4951 324.169] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga8933ad15a2e2947dae4a5cff50e6007) >> +>> endobj +2100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.8969 154.1071 225.6901 164.9862] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2091 0 obj << +/D [2089 0 R /XYZ 90 757.9346 null] +>> endobj +2092 0 obj << +/D [2089 0 R /XYZ 90 739.9346 null] +>> endobj +1997 0 obj << +/D [2089 0 R /XYZ 350.0021 514.5454 null] +>> endobj +2096 0 obj << +/D [2089 0 R /XYZ 90 491.9191 null] +>> endobj +1990 0 obj << +/D [2089 0 R /XYZ 247.4281 195.2196 null] +>> endobj +2099 0 obj << +/D [2089 0 R /XYZ 90 172.5933 null] +>> endobj +680 0 obj << +/D [2089 0 R /XYZ 225.6001 96.348 null] +>> endobj +2088 0 obj << +/Font << /F29 499 0 R /F52 1229 0 R /F23 482 0 R /F26 485 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2103 0 obj << +/Length 1978 +/Filter /FlateDecode +>> +stream +xÚ½YYoÜÈ~Ÿ_1y F¦Ó'ÉÖ"/±÷°±k{íñÓîB HJ˜CNxØkùï[}qØ<¥$X›Í¯«ª««ë²ÅðG¶oC"Éx°MN¼}€éï7Ä~ÞÃ÷}ðÏÃæïßQ¹•H4Øî5…€ A ÝÒ_v!¾ÚÓ‡x×¾zCwa3ø©LÛ<3ã—eÒž²¢‰›cY\ývx½ùöÐñµb Åõ_›_~ÃÛÄ{½ÁˆÉHl¿À FDJº=m8eî%ß|ØüÜÑ1ô‚©Ý ž²= +¯¡Ù]€$bˆà¡À„QÄ8¨À5;õ¥z°÷=Æ|ßÙ¨*ZÜ6#þ"@„éól·­p +>×ãù¶IÎÉ㧺=™ü üùŠà]yLaL”L@ŠõHíKjO9ìDZ/â‘@˜Dá6à >i>´ï£ÆæI„1ZB Ã@‹ó>kÚJm®¨oF¶‹) +%ËÜ;Ôû¾É¢0q¡v9àgØX‡ëÉS­í\á¼íKSšçÝ×ST†¨Vw„ëF_šó;jïhÈ[þù±°2²€ûÒ«%ο” ŒÛ³¸Ïª¬H²Ú ?¾zwûîýÇ»·êßáŠD»··J„Ý2‰t¼¹úœ›Û²mÎm£\„r Èú†¾IF€$ë;VrAëMÕ&^N¢Fd çŠh ùš›uø}Á”ÇÒu.¯MÏ·p{GŠR ŽM%Øl‡ó'¼ÇLMñ‡Ódz ŸŒ=‹ìËÅ'd•ž1žªµ¿¢µ1]'Òñ§i5ŽRŒƒð®ä¢Ö:ÔŠÖ ž IجÖÀNk­2òMè–aĹw=’_R OÔd‡_Ñä˜îl ç$@e‹*ìPcÆžV €d†QŸqu.«fB;`¥<‚l=òÕ±ˆ( .æþà‚u{¶îÌ<À—Q±³Öûñ¥sÎpå²Dù¾I÷sxÔ™±Ý}[$ÖE2 +¾º±óš ŸŽöÑf ¸{b¢õ–AÚØ¡FAj@¡Æß¸«)¸ÐH›ˆhÌ0!ØJ1iO Æä¡^ð7ýÅ2íÍ'ߨlƒ¥*Ý#’àM}yÔ¹þU ® O"é5 ¢kø¯Ž{JÄÄ ÿá )ÁÖ‡·o>¨IBŠÜÉ㽂Y±”ß|üñGmrúíßFH€¼µÃ[›Lqç>÷ýÿÌY‡Î8—‹”>j¾Hapá™æž¿SEe\ŧ .ùB2%ÀB½2’Ä Á]½ÒÁ)Šßfˆ$«Ë*p  xwê#Â1ów…’kÞ(1²ºž)“ªìTº:¢Iƒæ•Æ`Îøçž²z°%e9˜—¯xŒ)hAl…±CûÊb ¬ŠYñaJ 6àªÜ¦=ÝéhÑ«‹¬ù¢{&Õ'W:¹…e¥jz!v³å9ÕQ‰ÒeËï£,Ÿ`DeÈŸ^ž/r¿œà˜ýdyÞÁœ"GçÎU®ó¥ž…¯±R]+ôHûÂteó´ÆŽüyès7¦­¬˜T°Ǽù’ +:£1O圭¥Ù;Z”Ó+’²Í]Ùn9¸ÖÅliå|vG‚‡ìÿÑ‘xlÊ¢vÎõ¥µàéæ&W·lâËÄT}=hϨ~Ô·/Þ¾yóáYí p„eþYQ½vgƒÎ¶Œ)\ ,äÓ{Æý Mã¶Þ5öE˜m¯0v}cŸ±9Šÿ±qLÇ—ºñÏk÷ûŠP7tQÕ‰oºN…gW×õǪ$óÀZ^xÚÆ±"vi÷¾7#¦~ãØÔ€©ùd)ùã‰Ô¥ñ c8“¹ÈD(F¡l92õQó‘IpHø3"Ó"÷Kd³ŸŒLÌ ñOµ±÷§7ŽÙjkö\•àckÏw v#p×Ãɪƒ²H`JÅÿú9]ùF°N¹oà%Cé^¨Ÿð€v¢¨]}ŸYwºqè'7x­tÝÚðµæ‰o(»¡öÇGŠq`C¬Š§.pŽ¥t{Yþþõ!eêGà -ýÍWìaendstream +endobj +2102 0 obj << +/Type /Page +/Contents 2103 0 R +/Resources 2101 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2072 0 R +/Annots [ 2106 0 R 2108 0 R 2109 0 R 2110 0 R 2111 0 R 2112 0 R 2113 0 R 2115 0 R ] +>> endobj +2106 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [131.345 726.9533 157.1381 737.8324] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2108 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.7319 549.2408 221.6354 560.1299] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +2109 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [290.5065 549.2408 348.4187 560.1299] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +2110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.8156 549.2408 417.6088 560.1299] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.7656 495.1877 457.7454 506.0916] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga20812098a4663c8a9fc4ce8e95391b6) >> +>> endobj +2112 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 483.2325 151.6186 494.1364] +/Subtype /Link +/A << /S /GoTo /D (a00147_g79c4110211247df3fb30b8cf1c4c02af) >> +>> endobj +2113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [124.6997 295.1891 183.6983 318.1579] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +2115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [131.345 204.0406 157.1381 214.9197] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2104 0 obj << +/D [2102 0 R /XYZ 90 757.9346 null] +>> endobj +2105 0 obj << +/D [2102 0 R /XYZ 90 739.9346 null] +>> endobj +1993 0 obj << +/D [2102 0 R /XYZ 224.7534 583.8924 null] +>> endobj +2107 0 obj << +/D [2102 0 R /XYZ 90 567.737 null] +>> endobj +1989 0 obj << +/D [2102 0 R /XYZ 206.4623 238.6822 null] +>> endobj +2114 0 obj << +/D [2102 0 R /XYZ 90 222.5267 null] +>> endobj +1994 0 obj << +/D [2102 0 R /XYZ 207.0201 96.348 null] +>> endobj +2101 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R /F52 1229 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2118 0 obj << +/Length 2118 +/Filter /FlateDecode +>> +stream +xÚÝZmÛ6þ¾¿Âm4fù¦¦Ÿ®—m³A.ÝfÝ; i°ÐÚô®P[r%9›Ü¯ïP|1%Ê’ïz@qE°0Eg‡Ï ¥†d&ð,‰$gëýž=B÷÷WÄ /a|é |»ºúú;*f‰˜Æ³Õ¶ÕQBg«Í‡yŒÄbI#<_=IÝ8ÞÜšž¿ß~mÛu“­],æiÈuþ ÆTšMQhPßi„0I“Y „A}`…–¾Tèù1])A˜Ëàwe#_ö­LQÂ(7ë¤ìú®"|OXtÒÖz*/Öà +Æ”OòZTÌ·ÇbÝäe¡ûå‚DóÏà§Æ ·ÎS#íε­â¸•ÎͼB6Ïm¼W¿ê‡/™XVæxþž¹˜gº{ &y{J¢¹¬j‡àX« ìy‡$QÌ{Þ9{0œü„ŸB½ÊO¯W ’Îxw§Ž¨ FN„ÕJøøf9© æpP€#; Ê* »©ÀJêŒûÀ‰/=ù±P1RÊøSSõ¹Õƒ0bº8ú‘j…&¬³qšvŒ«ÈT§³kY×YõeGóóÇ”1„Ó”ù(FŽ«'­Ñ+;aÒ:lDªÎ •j‰Òcnå’×+iëõ÷Í9p‘HOø‡øR#‚¸ÊÞ­:lY•íe‡ç<› a•I‡Ñ]¨81ŸÒ;öAŸ12k„Öß H CWÇêßtŒxù7'67‘cJµóÂF“ÇPªC3”ji†ŠLÍ–Ì\ÒŠ—XGå+©2G‘k®TӲƦÂ(ŠHj4nmŽÇt']€ÖÚTN$A1åZõ{¹••n6ÿÓÍíýÛ›»Õõ»ÛÞ/b¨ŽîKšËEÛž5¨åênŠ.…øÈ³kþU¹>îeÑdíÂŒ»YµU†H¿–içî³W¥‰]êÆ,†ˆ©ŽgΗH1E\V~éOF¨××ìpØdMT78†ø%IH¿¼±RæY·úã †]LS}$˼hlÔµ@Úåëì=-ÀN„:ÙƒªÁáÒØÃ‚Bøl4šoý@í…ѪÍé4V'ÁAúÁ hX&««Ž,aaÁÐó“,¦¤­Áu¶ÛÉ R<ßl1½Ñ›¦Tçõ“v¡!A_-‹[Uãú +@/¦œ¹Ï¾˜CVK+kÓH î”Ý]y®òFötúûaå䶬̸Zâ@eÂV†ÀàJ<.ØDp;ù¥?!Œ®P¯ nå¨s©™CÖÅŠS»hzî¤&0„ÚK’Ü*ñcð–„«ÃbÉåïÓÍêP•ªV°n1ñ’Þ嫆iîËcs86V ó £:ãžxþOyÊ"”ˆ8½˜ý #<èÄ.åÁ.³<šïñ d ÄyÿÙ<Èþ’ðûTîLO^¬Ë½þ´3tC7Äíciº™²V5 &'û© ~ÊÛ 4lª¼íЯ¿µLýT­½ÃNWk¾é3·c©­Ö eJ>h 9iIE4ÿ—®iADUQ?<Ø“ĦT}>põÜ®”XàЮd¶±8Ì õÎ 'ó<ÍÝéÁ'—•¬ýêÏ5 +âÓD‡mUîûïàêñ>?Öù¿e—ò\l0«V3tuL[së²P„ùx¬úLè”¶/öÞ¾¾{ýÎÛš–åÙZ’à1¨=ÇkI_ê|-I(F4Jù¡FÍž^‡vkD'æmqöÊ­BjB«ltãÁÌjÏ…Ìݽ,7—¨Þ–ëN4&óºsáSÆü°VÏý°†¾ý±6ÖMP+›¦Çœ§RÙHÕ×ÐM÷î‡a7ï³½‹tf£m·TUÖœ ²m¹Û•j-ÏîK¨þª×^^}N'ˆ¨ÛûÀfcØOGñúÒÞþW¨Yé†(äðD¥ó­B9ì{YHo‰¶dù‡m¼Që9šBÍ/~IÙKŠõÅ86þP¾(«^>!wý÷ªüüåQÁ§>†üó;‰'¼Cendstream +endobj +2117 0 obj << +/Type /Page +/Contents 2118 0 R +/Resources 2116 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2072 0 R +/Annots [ 2121 0 R 2122 0 R 2123 0 R 2126 0 R 2127 0 R 2129 0 R 2130 0 R 2131 0 R 2132 0 R 2133 0 R 2134 0 R 2136 0 R 2137 0 R ] +>> endobj +2121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.4174 726.9434 236.2105 737.8324] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [460.7601 665.9261 502.4137 688.8948] +/Subtype /Link +/A << /S /GoTo /D (a00148_g69a7a4951ff21b302267532c21ee78fc) >> +>> endobj +2123 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 653.9709 136.9336 664.8748] +/Subtype /Link +/A << /S /GoTo /D (a00148_ga22b04cac8cf283ca12f028578bebc06) >> +>> endobj +2126 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.0073 491.9593 207.708 502.8384] +/Subtype /Link +/A << /S /GoTo /D (a00150_g561b8eda32e059d4e7397f776268cc63) >> +>> endobj +2127 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.426 437.8962 436.0284 448.8001] +/Subtype /Link +/A << /S /GoTo /D (a00147_g04b053a623aac7cd4195157d470661b3) >> +>> endobj +2129 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.0073 370.7781 207.708 381.6572] +/Subtype /Link +/A << /S /GoTo /D (a00150_g561b8eda32e059d4e7397f776268cc63) >> +>> endobj +2130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.426 316.715 436.0284 327.6189] +/Subtype /Link +/A << /S /GoTo /D (a00147_g04b053a623aac7cd4195157d470661b3) >> +>> endobj +2131 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 281.9517 139.4144 304.9205] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +2132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4032 281.9517 175.0106 304.9205] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +2133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.9994 281.9517 214.0238 304.9205] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +2134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.8893 281.9517 281.53 304.9205] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +2136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.3636 207.7121 147.1755 218.5912] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +2137 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.6736 207.7121 182.6919 218.5912] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +2119 0 obj << +/D [2117 0 R /XYZ 90 757.9346 null] +>> endobj +2120 0 obj << +/D [2117 0 R /XYZ 90 739.9346 null] +>> endobj +2124 0 obj << +/D [2117 0 R /XYZ 90 537.7634 null] +>> endobj +1998 0 obj << +/D [2117 0 R /XYZ 90 512.4589 null] +>> endobj +2125 0 obj << +/D [2117 0 R /XYZ 90 512.4589 null] +>> endobj +2128 0 obj << +/D [2117 0 R /XYZ 90 389.2643 null] +>> endobj +1453 0 obj << +/D [2117 0 R /XYZ 300.8374 242.7345 null] +>> endobj +2135 0 obj << +/D [2117 0 R /XYZ 90 226.1983 null] +>> endobj +2116 0 obj << +/Font << /F29 499 0 R /F52 1229 0 R /F23 482 0 R /F26 485 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2140 0 obj << +/Length 1602 +/Filter /FlateDecode +>> +stream +xÚÕY[oÛ6~÷¯ÐÓ`cË»Än{ÙÚµ Ú!ë<ì¡-EV¡ŠäYrÒbØß¡HʺEr»lÃP¤¦Èsç9ß!%âaøG<…½@H1.½øf½-L?_»ìúß&ø~½xü#UžBJRé­¯j ’ A õÖ›·Ë€®|â//Ïa(ð’ l¯‹Í!KÌøin’¼Šª´ÈWï×g‹gëF¯5K0I´Ößoßcoæ-0b*Þ<`D”¢ÞÍ‚Sæ²Å/‹Ÿ9f¡f󎌨 Bϧq¨E5 &˜¢€Q +¡à@‘ð˜è€BWBxŽJGå¶H7ÚIä+Ä%õô&¹Mãd³Oo“ýE™ä›wX`M ¿d„þzŽpÛA;+×wŽý«Cº»¸<\½Åï­|‰ñò×—ç¯^½¸xõì'-÷›Áé•fÕœY’®o¿p›‰¯óëÎáÿV°™76*$$Ÿ5±%ÛÛ±ÁŸpÀQñ§¡O²2yc†>Žï(K‹Šv»MTE3î¥~©§õÊX*ÔK”¬U¥>µI µ‰(ÇAMù4y‡1ÍÓº몌*󛥹­S”WæW³¸"ïPŒ\HH€$å¼ý&¹JöIÉm(/?5»}'e©¦DÖÞ6ª€4Æ „)‰À?ÄWPƒ¤²ÚâªDppzBHDCi‹Y/í·–æM»œ½ßfÜP®¶Hûù¹ˆâ Õ3¢$–h¨™ð¶æ¾,­ÂÏúJ)fäTÏùŒã©S~CN¡lè9ÞP¨fݦš!ì„ÕZÏ‹4¯’½I¡ª°¿×6 ãÃRÍf.–+“X§v/AÈ5p÷÷ЇTxÊŠ`.¹ß¢ú2:™>\ ,ëšÐOG4£˜CLuïÚ‘Œ#[ö—®žKW¯.ÈQ¬Kõ‹î «¿ 'aŽd9Ö¸ÏÆqæpØ©ØÉÓ¢Ÿ@Gu +àt,¸oújG᦭u +mNó¹›I—û2O‚š)—H3ÐÛN ‚R hø,ÐpÌàäÌøÉHÓf˜€š†ì$¬éZq/ØÌèvhÓÑýïÁMÛ³L&aà1 ˆpÔ1Gä·©†™*5²€È'íÕ³ÑÍ.KÊ'í¯dR3‡=‚ÂÃ'lz@˜3°¿é5]CVŸI“,+ü»ÝgL…K†ö:#G4gB_–¶àÑP£@JAUtUÞG?«½/W«/oªÝˆ×ŠÂ±Cð·Õœæ4ã¸Iå|3@.݈9;9 ýŒC¹ÚŽ»ä2ÎR(œa¨P(PDN‡¡¡šS?¦ÕÛC‘N•3Ìþ§9È# &”ò¨Â.^j.—½ßfiý¹5‚y1rö€¾%±è™ÐÝC}ëƒËÞ,Ö†¤ tÖµšuCRî²´ºG!?»U§] …û‰b§ßÛ WƆÌsYE5#Ç {ÔµâËZ‡p.†òœ…ŽnÔÂÁ…©Ap9i¡ßPèîõ%@Eº›p§xìÆÚš´¬Ò¸Dc_%ê»âèË-ÐýXÈ¿õÁ¢þà a´GÈ­€…ÚžýÊ×™¢]zžäÉ>ª\-¸b{íghöPû‹ŸPö„Úo3ciF5þû^Œš8®Ðž?m‡]_À=`$J!%2endstream +endobj +2139 0 obj << +/Type /Page +/Contents 2140 0 R +/Resources 2138 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2072 0 R +/Annots [ 2143 0 R 2144 0 R 2145 0 R 2147 0 R 2148 0 R 2149 0 R 2150 0 R 2151 0 R 2152 0 R 2154 0 R 2155 0 R 2157 0 R 2158 0 R ] +>> endobj +2143 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.7506 553.2679 195.0552 564.147] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2144 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.5347 553.2679 241.8394 564.147] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2145 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.9862 510.9639 146.0595 521.8678] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.7506 442.6743 195.0552 453.5535] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.5347 442.6743 241.8394 453.5535] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.9862 400.3703 146.0595 411.2742] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 364.3227 162.0093 387.2914] +/Subtype /Link +/A << /S /GoTo /D (a00036) >> +>> endobj +2151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.9981 364.3227 193.2816 387.2914] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +2152 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.1471 364.3227 260.7879 387.2914] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +2154 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.3636 287.6273 152.1568 298.5064] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2155 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.6549 287.6273 186.2086 298.5064] +/Subtype /Link +/A << /S /GoTo /D (a00150_g12a33f0c09711167bdf3dd7d7cf8c5a1) >> +>> endobj +2157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.7506 117.8746 193.9393 128.7537] +/Subtype /Link +/A << /S /GoTo /D (a00093) >> +>> endobj +2158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.4374 117.8746 230.7508 128.7537] +/Subtype /Link +/A << /S /GoTo /D (a00150_g9ee50a40597e67fce96541ab56c3b712) >> +>> endobj +2141 0 obj << +/D [2139 0 R /XYZ 90 757.9346 null] +>> endobj +1999 0 obj << +/D [2139 0 R /XYZ 207.0201 589.4618 null] +>> endobj +2142 0 obj << +/D [2139 0 R /XYZ 90 571.7541 null] +>> endobj +2146 0 obj << +/D [2139 0 R /XYZ 90 461.1605 null] +>> endobj +1755 0 obj << +/D [2139 0 R /XYZ 208.1261 323.8211 null] +>> endobj +2153 0 obj << +/D [2139 0 R /XYZ 90 306.1135 null] +>> endobj +2000 0 obj << +/D [2139 0 R /XYZ 368.3438 154.0685 null] +>> endobj +2156 0 obj << +/D [2139 0 R /XYZ 90 136.3608 null] +>> endobj +2138 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2161 0 obj << +/Length 368 +/Filter /FlateDecode +>> +stream +xÚ¥R[o‚0~ï¯è#†ð1mz¼ ͪA/ëç—Í„–Y¸ÞO–wò”fQ:Èþ‹•:«ê,2½ÃÒdomÝZ×–IL®ôúxD2×m×zI6:–GIÜå¯ÏfJvx?”E”TÕTÿ@Ƹ®7zTsRÈ=C{G¾.ήÏH‹Çýžf³Dƒg–äIÖ=œÂùÔ+s„u40#é”ñ)£Å(•¶i¦(¼¡¿¹º+¾ÏÛ$ÒÓÜÈ??°}¼~endstream +endobj +2160 0 obj << +/Type /Page +/Contents 2161 0 R +/Resources 2159 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2163 0 R +>> endobj +2162 0 obj << +/D [2160 0 R /XYZ 90 757.9346 null] +>> endobj +2159 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2166 0 obj << +/Length 2324 +/Filter /FlateDecode +>> +stream +xÚ­ZY¯Û6~¿¿Â6P³\%2oÓdRL€23ó’…,Ë×ÂÈ–+ËIï¿ïá&ÑÚèL +?XËáÙÏGRd…áGV +¯R‘"Åx²ÊOOxõ~"îõÞoC‚ŸžŸ~|OÕJ!•Ðdõ|0‚%tõ¼ÿ´NùfK%Nñúöp)ðš l/~©÷·ª°×ïêüv*ÎmÖ–õyóùùÃÓߟ;¹N-Á¢¥þþôé3^íA½O1%Åê+Ü`D”¢«Ó§ÌßTOÿyúWÇǾ0¦¬„M›G8‚'ÔÛGÁÜÔš— ÆŒñúo͆Èu~,Û"ooæÆÙv½yù+Æ4·÷'·s®í½jƒ­$‚”F¸Z ¢²—„ˆ“õ®h³²*öÎwÅ5oÊ‹÷0bAD4­¿²|žÅP¸¹-Ïö¿õﳦ³eÆŽS¿òt© +Àoj~,òÿ96·““pv0ºÝ•nd¶ß—F-¤mÑÚ“%”³^{†‰á«ÿ _ÃÑÜeU~«l™åUÿS«~pª¯­£­O—›Í·¬ª^íÃbCÄúKq¾–*Ö_ô­Y_Š&äìþ;ÎÏo?þhµ¢ëk›ikõcc¤Ðvù ƒA0¼)µq1SëKöªãÁñº>höq[Û‡ÚËÐÒ9škGk5 <)Ì@¦Ò’ÁËìz-N»ªh6B¬‘V(q™#.·æR_õÁ3vnåe«sÁÞu1×Ú\íà¿*Ú~ì„­}¬&òÏ0ÿÝ0¡|–ûçåÀØéÚba®¸Qì=ÔÒutD + 3‡ C aåœ Î$ïùha¿R*†²Ö•.زĎ*&ðJá$ÈUÅH2T¡j(Y¿j^Í¿C<}L‡_­äÒo:~è8Ò#¥ˆ'8âD ª$ S…UH4á®@í­H(‚)¨‡tW4M¸ÑP§J®:2­é»"¯²F—$©)“ƒ–®sýºÃ{x0“]¦£qÜ­ŠB$¹L´' î¦¨>¹uâf¦Ê!þûp–d8WàQ™²Ù  2¼#‹fø¢Ä>Ã#r}†ßÉý²¡¢r?Îq &D d/丣i1âÛåø~Ïè8ÅX7°$âOž*(ήÇäJŠRIäÃæ{ú˜#¾Æ|ù[;Ô€bŒ€(üŽj,—ð@.Å@¨¡å˜M¬~ BFcCS_ýa¤ƒ²O™zÔ=}Ä=c¾Æ=$™ðH$PÐËþñT1ÁB",Ô 3ê I ;Èq©½ø…Ô Ú‘i ÞfMóêpôæW{ó ÀY°ä‰‚V Ëš:E 䨒|ßD‚ H$†ož,ŽoáD“ŒÐ‚Ä +У[L»Cí&3Œ0XDcÂÕƒXá4®Ç+J¢êyº{õó£YŽpJêIkQÅ­'ŠÉVR_¥ƒÀM¡£âàhçîÅÎ[ïé£ ùΗ?$+t ˆ{¢±Ø{p$ +üCG†Ïƒ#sà¸Ó³çí0ÆG8Æö¨ƒ:úˆƒÆ|çë>Á‰xÈSÅ'€àÎ{ÁUq^„G ,.ɃðP/Á£'³ðh{×bØAC Ôœ ‡ŽvÍYä:X}/Uo^†'UP½q€W„õ<¦Âr]IX0þ%˜J$" +˦z²8¦ ¿S—µë05Ô.‚© ê};¦.«×aêz€©åeUU‚×°º å¶£ŠÉWº‹AðWýâ{±ˆ0CL©Û¶z©ˆ<Ùb¹m¨c‘í}™Ì”Òa0ô’Y +]b¾ +C6~_B¡+91_jLANpò—Tƒ& á4‰TZG­´áwWZD;Ow§Ýr¥-©÷Í•QÏÓÝ«Anó™RÓ ´ntQÍmGQ€B^óú‡ûè=Xj,áH +òàŽBH½PjÙR©=¿ýøÝõ5US÷[Ʀ˾\öY›ÍWš`æ4ù êé]k+É™í§þ»Qt5e¶›Þ;¤ +ÖkŒÌ×nH°P»Y´v—$~síF´ótwÚMµþºà„b²¨Ý£¥Ë"朘vžî^;1y>½/ƒE¢–CÖQÅ„§fÒtàšOüó\–RIaeiH½P©™η»×¶;Õ±›š®¿]ýöú¡n…6å×â÷[qÎÝ›óí´ëfÑþÈe~“¦ I’m ¨§+‘2}HI2FÝɘßìœ9UœVvgc!§î”틆$½ŸØ#ŽÙ×3·S½¤†ì$h§„!"£;Iž|ÐTG\g·Ù(’¤â^üpúñD#¡÷}$øÅÌR¡Ð¾„Hô´)âÐçö[lŽ&£<ѸÇP+‚ÈGçÉ#Žro0%ADP¾ì9O4’zç *!\œ‘;©z÷-ê?Ÿň‰>ö“õÿÙNëS-,ýTäÙÍœü ²>×­½ÈªJ_л£¶«}ç`‚¬¿Ks&—î<Ûž¶êq%´¬ç½E²>fnìÊ0J‚ö,q+"íe¿*½´{õkŒ?^_ŠÑ7Kúc¢ /ý õ6oendstream +endobj +2165 0 obj << +/Type /Page +/Contents 2166 0 R +/Resources 2164 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2163 0 R +/Annots [ 2170 0 R 2172 0 R 2173 0 R 2174 0 R 2175 0 R 2176 0 R 2177 0 R 2178 0 R 2179 0 R 2180 0 R 2181 0 R 2182 0 R 2185 0 R 2186 0 R 2190 0 R 2191 0 R ] +>> endobj +2170 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 574.4454 173.4566 585.3494] +/Subtype /Link +/A << /S /GoTo /D (a00137) >> +>> endobj +2172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 492.1342 177.9699 503.0381] +/Subtype /Link +/A << /S /GoTo /D (a00151_g6832e4d2d046536b6472f7ac92340f68) >> +>> endobj +2173 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.7856 492.1342 201.4916 503.0381] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +2174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.8776 492.1342 256.5649 503.0381] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 453.586 138.5977 464.4899] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 453.586 189.7953 464.4899] +/Subtype /Link +/A << /S /GoTo /D (a00151_gb6683dd83fe1c8de9a24086d4b69e907) >> +>> endobj +2177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.6109 453.586 218.2983 464.4899] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.84 453.586 266.5273 464.4899] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2179 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 415.0378 138.5977 425.9417] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2180 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 415.0378 197.5461 425.9417] +/Subtype /Link +/A << /S /GoTo /D (a00151_g2addf34c7d457c1a7899a7e2171ef1e9) >> +>> endobj +2181 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 376.4895 138.5977 387.3935] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2182 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 376.4895 201.9695 387.3935] +/Subtype /Link +/A << /S /GoTo /D (a00151_g85b65e38aa74eba18979156f97a94a87) >> +>> endobj +2185 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 294.1783 133.6164 305.0822] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +2186 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 294.1783 177.0532 305.0822] +/Subtype /Link +/A << /S /GoTo /D (a00151_g2a0cf5d86c58fab216414ce59bf1fea1) >> +>> endobj +2190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.6669 210.1544 223.4788 221.0435] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +2191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.3555 210.1544 282.1487 221.0435] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2167 0 obj << +/D [2165 0 R /XYZ 90 757.9346 null] +>> endobj +1777 0 obj << +/D [2165 0 R /XYZ 90 739.9346 null] +>> endobj +118 0 obj << +/D [2165 0 R /XYZ 90 739.9346 null] +>> endobj +2168 0 obj << +/D [2165 0 R /XYZ 90 716.7484 null] +>> endobj +2169 0 obj << +/D [2165 0 R /XYZ 90 593.2423 null] +>> endobj +2171 0 obj << +/D [2165 0 R /XYZ 90 510.9311 null] +>> endobj +2183 0 obj << +/D [2165 0 R /XYZ 90 312.9752 null] +>> endobj +2184 0 obj << +/D [2165 0 R /XYZ 90 312.9752 null] +>> endobj +2187 0 obj << +/D [2165 0 R /XYZ 90 257.149 null] +>> endobj +2188 0 obj << +/D [2165 0 R /XYZ 90 230.664 null] +>> endobj +2189 0 obj << +/D [2165 0 R /XYZ 90 230.664 null] +>> endobj +2164 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2197 0 obj << +/Length 1763 +/Filter /FlateDecode +>> +stream +xÚÅY[ÓF~ϯÈ[³™ÎÝ6o +©]òyÙEb§¶Ýß3žKÆ×di«j¥õí›óŸû8d‰á,¼ŒD„Æå2;,ðòn¿Yûx Ï×!à—Íâç×4Y&(‘T.7÷­I „.7Û+‰¾YSW/ª¯²]Þ¨¬9µÊ<©*Ë?aL3s}zûÞœÜŸŠ¬ÉË¢†K.²ŠÄÍçͻů¯’ÕX0I´B.>~ÆË-hþnKb±ü‘$¡ËÂSæ.ö‹‹?¼ó ]0öâœÂKÇ„-×L¢˜$| „I(A„:n£8A³h1†p„yk¨÷7¯Ò*=¨FUõóþ{LQÄ(]†¢E€d&^:É!Q¯!w7‚í~$ª39ipÏúËÅ2fW›Ðá/™p wÚ„ äªF̛С†Ä«ÐŠŠHd—x¯Š1Û´EÒšF§¥Å„Õ +‚&BqB¤ö"$HBZôËtŸö©+?ÍΞ¼Õ­ +¾¹Êv*;‡p©«Ù7ýÏU4ÛEœ÷¨X݇U¬Wd6š„‘$ aíÈãHô³¼6ÇÆ€ãUY¨Ÿ´H{?+ǽ:@/3׺Î=o‰b¿0Ýï͉«Ýú¡íw[+DWnGâ^Œ DÒ‰Þ ïÿAY#ß¾~ kØÝ|$(6±2;D…¨é!J´ÝŠE/55:‘yZáec-ÙÃŒëµ_ÙնD{·(]Ä;\rýÒgvªªÖ‘úÂbíe¹Ž§ÇcBÔŠ 8Ç£µ°Zò‡Ò¯:\ã¬U—#o&Çc˜ZåÄÁ;/DM;'ŸDO˜€É¨3îh2>ayX¯\w§,‚˜€p˜µG¡IT"ƘìRÏ Á>Pz 9Q½¾ïòl×±NÅsáéî +ŠÊ©Q[4í!¢>—BØœñ,è]ÃcĹhjHÛ3¼@`—vãLüÍ®›ÿ¿å}úÑMì¾ÎÉç13©Ç Ì'vçu«Ú¹Xsy7Í8¼G=Z:-¨cõÙÆ|Á ®!õ^U7§–Oï6ˆˆX8·³É¹Åb0\=·‡ fæv»<·wU˜œÛ/»¹½K s{~ìOîßÚy ßN YÒŠºnƲŸov*õ»ç =¦™éGÍp©k“Zsëøéñë:~Ÿ}?}Ÿw·õ¦§ƒ‹Ð±Œf:-ônf6§CÔtVÇ"ŽÉõY=Ë~Îë!ýhf{ØrÉ~ãóRÿZ]à“uJÁÉ«ëB¸`¦.xØåºÐUa².\ vu¡K ¶l²ÿ¶0l^¾ÿ¡j0Rìþ¬ØžŸ¤Çã6mÒ™ÚÀ«œ*p³+ÓÇÆá‚‚Àã¸ÕŽšÍ ++^4u÷y3 ­Í3½[{fî˜7Ð'æp¬Õi[®}Øë'uwOfçÖ|,ëï%`ë%l²ÖH"ÌÀ…³µ&DM×€¢$¶ßçw^³´ç"3ä-2vÞts†€¹áGhÆ9øBKô·ks®§¯öè„„‘§—¥ô·f¿Þœ¦…vçã÷ªìúv# ëêPV7Rè]“rU[¦Ü +έzc8âÝcY×ùû®é†Ä:‡½þ£ßH>ýG?Ñ‚¸{|m}4ØÝðˆÆ"-@ÍD‹a`¯oj³äA¼ ØÇãÍÁ:MíÚbæqAò_[ÖLo{[…Çñš×ÿYŒ@7oÞ’H!ÿÑ/fí1,FºO¢$b±û-Ð*¡-÷FªJýë¸Ï¿¹“wÚ<'{A¨=âç”=wÅXÚ:˪÷ƒ!A¸k£Wå_Ãý¤ lÌ>\Œ¿Jendstream +endobj +2196 0 obj << +/Type /Page +/Contents 2197 0 R +/Resources 2195 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2163 0 R +/Annots [ 2200 0 R 2201 0 R 2202 0 R 2204 0 R 2206 0 R ] +>> endobj +2200 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [131.345 624.7403 157.1381 635.6294] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2201 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.4886 624.7403 241.2818 635.6294] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2202 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [267.872 624.7403 293.6652 635.6294] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [131.345 384.3441 157.1381 395.2232] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2206 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [131.345 262.609 157.1381 273.4881] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2198 0 obj << +/D [2196 0 R /XYZ 90 757.9346 null] +>> endobj +2192 0 obj << +/D [2196 0 R /XYZ 224.7534 659.9636 null] +>> endobj +2199 0 obj << +/D [2196 0 R /XYZ 90 643.2365 null] +>> endobj +2193 0 obj << +/D [2196 0 R /XYZ 90 419.4579 null] +>> endobj +2203 0 obj << +/D [2196 0 R /XYZ 90 404.8876 null] +>> endobj +2194 0 obj << +/D [2196 0 R /XYZ 90 295.6655 null] +>> endobj +2205 0 obj << +/D [2196 0 R /XYZ 90 281.0952 null] +>> endobj +2195 0 obj << +/Font << /F29 499 0 R /F52 1229 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2209 0 obj << +/Length 2273 +/Filter /FlateDecode +>> +stream +xÚ­ZkÛ6ý>¿ÂÀ Øaù~ä[»™´ šÅ4™bQ¤Á@±5c!˵åN²¿~/%Q¢D™T‘"D²Žî¹¼çð!JdáY¼PB!ø\¬Ÿ®ðâ~þñŠ´—¯áúµøáîê»WÔ, 2’ÊÅÝCA$(¡‹»Í‡¥’«kª±ÂËóë[8xInÞ–›ó.oŽ_–ëóS¾¯²ª(÷«wo®nî:Þ6-Á$±¬\}øˆHïÍFÌh±x†Œˆ1tñtÅ)s'»«÷W¿tqš õ S­„M7p¿P×> +ÍUMó$"duM0öÚ÷ýfs\½ÌO§æ‡wù©Üë†Õç·õå²*×åÎ6µá ÈQs@‘-3¬ã@Žåe^eÅ.ß´UËOëcqp5ƒ@ÌÓÂÆÌ%nr½ÛÚZKU'Ø$'ƒäàüöØ&Ö@ßÝ6E ?Ÿjn)—å±ùé);Šýcsò)¯žó¼õº½9kó6F¶ß4»bÿ¹=ÊWT,ÿ\±Ìwã› e¶-]… -§ózÛ” k‹\m['ÝÀÑqŸW­Ç¾_q¼üw‹u!QS!I9¯c6m5ضÑ5dùéXf›uvªš œócá®U+²,›Ãìô¹45±ëlà—¶‰öhÔD{_'\/Ú›ÓÏûÒâŸ÷Íi]Êñ-M!}ºmér}Þu‰àj1*!©›».÷¿cLÏGç¦ç¢ÚŽŠé<ÝÓ +×JÑsøwØ}m/¯H¯ÏSží«9¢Ý®9‚ ‡rðU{W[>–¯O +‡ -&Z-„‘ˆÉ';»]û¨p<ÓaÌÔBb¸ ².ÝÊ*1f%˜"Å(‰Óv¨ ^¿ï¬"LôÑš.\´…iÌjKõtØåýÈYÿVîw­§óáP]5]×@S£Ží 5ã5ãˆrªjÆW0Øœ&ÆcÁ ‚]œ%¼ëSƒ61Í»(–éwJEXS¸‰ Fפ0Š,åz8kLË`ú fDk¯[È;?O$0Žj8‡ûìx@Û ©fÒD›.1ÒŠHÚ&õ`Òž¨“Bf±k³‚мwžÀ ÷[“Aš0÷`eô¢ƒÙ<ßfë㊋eÙZ)sv“Ûî ë¾ñøÐ +[Ÿš):1 +µnÒƒYÆd!âmi›B(LÅͪ`Ú†#É OùÐÁÒFôÆœçí¬8àMxqÀ<ÇŒñ‚¸¾סâÊÄÛvdDýE7r‰¥Æ:áÆfÓ|=5è=\2]½ c*º ³Ö®×=}ÉGŠ3³Uº[Föƒ-x“sl+Ú¬g^fUÖäò¾:ž×Õ¹]ANŒ¼ÜŽÓJó‹ž÷Ïw°¤ç£Œ½ç¼ÎóÞSÝÚÐó0ä1¦GÌÏ·øTA\çù¼ÚÞoÁ%ãD4¬u¢ÛÇ¿êzXhl’®w°~,q·y¶ÉÁ/„\T™!H <Ó¼>zÚ¼ ž’`IÔš·™&Ýʘ•]‰‹nõ·v°¤[£Œ½[¼Î­Þ´“]8Hs ½]‘ùeÃ:|* ®Mã××·÷7w?Ýýv{so¹Q2”IxÆÅ<^‰•H2´&£ð¬±œÒ›‚O¹<:ù€˜Þ–Ö;Æèéçíôöygè= Ÿ£w< îXïסÜT -‰¢C%2 TÛƒQ!j¹ñ”ÜðXdbÏ> &·ƒ¥åŽ1zrÇy;¹}ÞrÈçÈO#ˆÊ-Ãî ‹~Ah¼*‘e 1ë”A +ø‹–›Í„ÞÔXpâå’Þ> ¢wKêeìõNð:½¼i½‡ä3ôN¤ÄõÖÜ÷Å¡v>‰y– •(ƒC¥øƒhÍs‡ÀðG¦äÖÌn\~¾ò1¹,-wŒÑ“;ÎÛÉíóÎ{@>GîxAÜv›ñþÝÍ/voì×›÷wA÷&0P%ã•èP‰(ák6LaRj…¦ê²Òýõ˜Ð-*­s„Γ9JÚ©ì‘ÎÙgž£q4‡qÔ^áÛŸAb¼ü-è„ð +AŠÓSÌaD è锺°^Ç£õÿP^Ó×ÁÒÇ=…ã¼Ä>ï äsDާÄu2ÿôßzš†ézjn%»´ +¯Q‰ (<¹rx +$0Ù9‡'G®/ íbB;XZè£'tœ·Úç!ô€|ŽÐñ4‚¸6ê±úU¸%&aHå*Q‡JQK¸ñëéÍ͸Ý'i¶^a­ÐîU|÷ +è} É‘bPDìöÙÄ[A(´&¬ÃòÏÀºÜ ª‰œ[ÝŸhb×->­(^ž‚D4ŒjJÆ ì@)òq,Ëý¼´òaa£#ó¡ˆõ#K÷££×â¼]?òygô£ùœ~O#ˆ[ïÚÞ^êIŠÃÃ)IÕÀ¡RäJ!&è¨ô)¯¶Å¥®¤ìÓ¯áßÜ•¤°W³ Üám 㦺’‘°R"^â•¢¢zSðr‘byðvñ¼_7/ŽÂhå&±­é,Ù£Œ}Lðº8àýÓªR›p§ÐpCîÈNw‹OeÄXÄåQFçq1épŸu†¿£ü£˜¾·Ëóä8%Vц;LœX $ì7~©ž¶Ÿ?D¸šü>Ct"…ü¦4k‹hû%£þ HxPVLÛĸŸØï1]*6óó}~Ì*÷-›{µÿÖ¼±cù¹=!´ý¿ ìm¿G¥Ë¶ÛØoÍ\× ?\ýôÕ}´úåëc >¶¦Uú?ü^aHendstream +endobj +2208 0 obj << +/Type /Page +/Contents 2209 0 R +/Resources 2207 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2163 0 R +/Annots [ 2213 0 R 2214 0 R 2216 0 R 2219 0 R 2221 0 R 2223 0 R 2225 0 R 2227 0 R 2229 0 R 2231 0 R 2233 0 R 2234 0 R 2236 0 R 2237 0 R 2240 0 R 2241 0 R 2242 0 R ] +>> endobj +2213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 536.3999 169.0332 547.3038] +/Subtype /Link +/A << /S /GoTo /D (a00139) >> +>> endobj +2214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 497.4963 168.4752 508.4002] +/Subtype /Link +/A << /S /GoTo /D (a00138) >> +>> endobj +2216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 414.6253 188.6792 425.5293] +/Subtype /Link +/A << /S /GoTo /D (a00090) >> +>> endobj +2219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 332.7306 237.3867 342.6583] +/Subtype /Link +/A << /S /GoTo /D (a00152_g3e1562e8a6de32268e5df92a52152f91) >> +>> endobj +2221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 319.7545 226.8662 329.6822] +/Subtype /Link +/A << /S /GoTo /D (a00152_g03d140db75de3d3cdfbbab1c4fed8d8d) >> +>> endobj +2223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 306.7784 231.8475 316.7061] +/Subtype /Link +/A << /S /GoTo /D (a00152_gbb558f3a9b1ec015e83c314aba694e35) >> +>> endobj +2225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 292.8261 198.642 303.73] +/Subtype /Link +/A << /S /GoTo /D (a00152_g737337d6a51e31b236c8233d024138a8) >> +>> endobj +2227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 280.2236 216.8139 290.7539] +/Subtype /Link +/A << /S /GoTo /D (a00152_g7a7c46ffaba30477b8c9e3e61bd2e106) >> +>> endobj +2229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 267.8502 202.6371 277.7778] +/Subtype /Link +/A << /S /GoTo /D (a00152_g06ba7b414e718081998f2814090debf1) >> +>> endobj +2231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 254.8741 237.9346 264.8017] +/Subtype /Link +/A << /S /GoTo /D (a00152_gbb56b549f7ab4d86e1cc39b8afc70d1e) >> +>> endobj +2233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 240.9217 167.0009 251.8256] +/Subtype /Link +/A << /S /GoTo /D (a00152_g24f52ac52d6e714cb04a5aa01be3bdd0) >> +>> endobj +2234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.2853 240.9217 281.0723 251.8256] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +2236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 227.9456 175.8576 238.8496] +/Subtype /Link +/A << /S /GoTo /D (a00152_g9f2196e2705036869611962425e404bf) >> +>> endobj +2237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.3448 227.9456 297.1318 238.8496] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +2240 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 171.0022 184.6146 181.9061] +/Subtype /Link +/A << /S /GoTo /D (a00152_g2d9d28afa353f662b9bb5234fc419f72) >> +>> endobj +2241 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 132.0986 191.7978 143.0025] +/Subtype /Link +/A << /S /GoTo /D (a00152_g902c4a360134096224bc2655f623aa5f) >> +>> endobj +2242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 93.195 184.0569 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00152_g54b27e45df15e10a0eb1a3e3a91417d2) >> +>> endobj +2210 0 obj << +/D [2208 0 R /XYZ 90 757.9346 null] +>> endobj +1775 0 obj << +/D [2208 0 R /XYZ 90 739.9346 null] +>> endobj +122 0 obj << +/D [2208 0 R /XYZ 90 739.9346 null] +>> endobj +2211 0 obj << +/D [2208 0 R /XYZ 90 719.4775 null] +>> endobj +2212 0 obj << +/D [2208 0 R /XYZ 90 555.3745 null] +>> endobj +2215 0 obj << +/D [2208 0 R /XYZ 90 433.5999 null] +>> endobj +2217 0 obj << +/D [2208 0 R /XYZ 90 350.729 null] +>> endobj +2218 0 obj << +/D [2208 0 R /XYZ 90 350.729 null] +>> endobj +2220 0 obj << +/D [2208 0 R /XYZ 90 336.7157 null] +>> endobj +2222 0 obj << +/D [2208 0 R /XYZ 90 323.7396 null] +>> endobj +2224 0 obj << +/D [2208 0 R /XYZ 90 310.7635 null] +>> endobj +2226 0 obj << +/D [2208 0 R /XYZ 90 296.8112 null] +>> endobj +2228 0 obj << +/D [2208 0 R /XYZ 90 284.2087 null] +>> endobj +2230 0 obj << +/D [2208 0 R /XYZ 90 271.8352 null] +>> endobj +2232 0 obj << +/D [2208 0 R /XYZ 90 258.8591 null] +>> endobj +2235 0 obj << +/D [2208 0 R /XYZ 90 244.9068 null] +>> endobj +2238 0 obj << +/D [2208 0 R /XYZ 90 189.9768 null] +>> endobj +2239 0 obj << +/D [2208 0 R /XYZ 90 189.9768 null] +>> endobj +2207 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2246 0 obj << +/Length 2421 +/Filter /FlateDecode +>> +stream +xÚ½YÝ“Û6ß¿ÂòL¬)Qû–6›6™k»Ý¸wÓI3;Z™^kbK®,g³÷×@€%kíÜ]çÆ"AA|ü(‹Y?1Ë‚Y¢? £xV쮂Ù#¸¼¼€õ…ËðÝòêooe6Ëü,–ñl¹6bá+)äl¹úèžó…Tw|wKƒ×«U3©§"ÜéC½=¶e]ÑüÖ,×m]Ô[¤(zI2ÿ´|u³ìŒa[U 4åÏ«Ÿ‚Ù +l~øa–ªÙL_d™œí®"ÚÉöêÃÕ¯Z0/Lm9 +”Ÿ†él!Ú¤ÃtÂ,‚ı'IpI";©`–Âëq„>°$Y:³\è(Øt˜xz¯«yá¦Ýè¦Ò-Í6:_醯mMÏœýUÛ‡úhß³nÞçÅ\Þç¹<+%·L­iP®éùÄóJëÕPË¡³ô ¿¾c]dûŸG}hýñ9YŸ$v-BqÞì?‰DáËA§‹4íƒ0t‚P±…i4ëØÐÃH©Nƒ·¤ +g®À‰ce®KzEägAõ~Ác¨ËՉP#ݸÔ<2Ïk…å¿dʼn\´âXîïófß–;ˆ£±)™ðC©qÞ –ë’Yè§Q–ܨÀºÆâ¥8‰³À—¡ü¶Ç.2¶2Nü(ÉÄY+¥eArÙÊ-à¹d¥å›²rÊH 5NÅAvþð:® õãQ©òUÆi† ×—s¹ ðÞrôR,¿©‹ãNWmnH`Ö¨wC¼ÈÈWQ9’|Á²¾`#Á2FÝÜ”$uÏ’ÕP¢‹A¢œ6Òädà(ûjnyeUÔ»ŽÜóç÷·ƒIP Ž‹eD‚—›1F’RÏ…GÎÂaS·+?`óK¯È·[miÏDƒ.L„•žKå}) f^5¥!Ì…òLgž§®h5g5d*zSia“háAkæmt¡™+¾!ÿ—Ö[‹ºÚ(€>•[ÄJ1”‹5ÄÂ[AoakÝÀ™oŸiueyxŒ7€L»Ù ”½°Ð>ïõ5F„€T¶Äj| óœ¦Þ“6Áç‡FÙ%ƒXâ&gO¬|ß°ëãÁ ð£nX˜ y…A²í*¶aÃ9–Æ~ÑSþÉÇ 3 +Zäk74êÄ}A[ò-LóuSïF,FÚs¬<<3™zï ¬JzN7€÷^F6Ö•Or·:?ºIR›!Äòéôê%ÔÆ5H$Î7†æE£óÖ"Â=î-,+‹y£T°Í×?‰§Œs…^šHÖšä MdhtofnM…Û Ó¬gêΉ¦õz$äq[?ä[——*QÐÞ-)†H†Ô(`ÃZƒtF>’ç3‚‰Xµµ& Ãi8†1&ÎÝ30ë =«@õBű‰*¤ô6à +ŸÿÒM®¨«êi‰®˜lÏ7‰¯êjá¨(Û©-jè.euÅ{¤ô +Ìñ ‡·—q r‘pBŠ„© €YøQ¯Àóp¢¯5x®_÷ºhy9ç“GHºÙÖdÉ™¡1UW¯hÚßìÇÞìp¥dÑk@mI£íDgŽ$¥ô´oODáÙS8)cÇÚ,Âñ0‹¬ÛAþ Jdˆ4™… Ü¢£!ªï°ŽeZ¸\§ŸR@óA²ÒÄTO§vó5ßí_Ÿ"Vé'¡gUÄ]Ƃߪ) ‡xšù:64‘Ș¹ØAvlëz¿ÀYÀ}Ì/Nð¡Œ}h|Öq]0éTšD 7J+¸Àµ¡Y|£±EVem +nËŠÏàÈ0LWÕ.6„­MæÙ6ˆ¤À"«²d误 b¦˜ŽÓÈä˜ðîïnnÿÑx¿ÏáR‡‹ø&,Âʯ¶¿Ý|XΓȮ|ghoñªÇ”—øMé—Ÿ?¼h©ûíÝíýbª°Ý,\þ~{soìÂ{ÕïtSZGŒ%—{$Þ»ý«Q÷ts凡÷l€Ë‹¼û0óŸCïÛæ¯ýäôÿùÜä|júÖ2Þ÷¾˜{_Üá}\Ѐ£˜~°'ܦ®û±Ùí°ì›þ™PGNW3hÙèâ3ÛÔZ–Â7€ÐUÞ›‚'BAÕxn,æÅ1žƒ„ 5=çqðd)Žœö³Ÿ^cà~Ï-ÄÕÕvot¾StWÂçñ ™’3NÜY¿-GÃDKêô™ó·kèä9ÂV–[õzÁ­°yáq§ru)ŠÛ\ÔKÙÖu9@<º}2¹Ô|&f×J·º OaÑ5Ѽ÷Xvo¾þù C}Å2Bi»üÀ’81”…ìêüÙc*c íeðXc8³1†ãŽ…òWù>„‹5=)#߭陳$€VÍ3«0 Wâàl‘ðŽ5ôÎeÈHïC…À Q è¸P/È©@@yPW +³®ÁØÂÅR8%O +†ç8p#º;X!¡ê+€ŠY +É‚õ ­k.uÂÞh]}®O&ŽÐ$¨”Î],Œ8Æ‘<È[) JÙ3Œ ¤û6>ñþ–& a†‘h±‚§Ò¹tŸê i?…#ƒ±¶É˜k-OìrPùSëð\5õ~oÎ*µí ÉèÃÕÇåbÄŸ’“:=ÓlS>nè;KP¶¿qmiyßÐF,sUû>¦MšxËïoM?4kÎËU{„Àø[AŠ ¦mòê°+'?=tªßÝ ù½\¯úNǹ”r.¥n.¥œK)^i`¹;9¶b!S_±pß‘è¹&…×§6­ñýü¸em t?ãtǪü†RZHÑ3·y©ì·%8™©ÜÛ¼T¡ù@Ä!‚àOKðt.}’‹v'Xœ^úäô- ¸ô:fõ÷"ÉÕÚý’A® !òßÝ–ð/Má‹(™ü÷5'bÿOÿvšRxE ¯Y±Ÿ%ajÿÁe#p'?èJ7ý7 Û¤²ƒ÷˜GGžÉÏàZ†×2àËBÄü© +]a?Wu Ÿží‡ê¯Ïº»G‰pÊ?ÿ.´³ýendstream +endobj +2245 0 obj << +/Type /Page +/Contents 2246 0 R +/Resources 2244 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2163 0 R +/Annots [ 2248 0 R 2251 0 R 2252 0 R 2255 0 R ] +>> endobj +2248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 702.4657 192.3555 713.3696] +/Subtype /Link +/A << /S /GoTo /D (a00152_g058a8e6025f67b021862281f1911fcef) >> +>> endobj +2251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 617.6293 168.4754 628.5332] +/Subtype /Link +/A << /S /GoTo /D (a00089) >> +>> endobj +2252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.9735 617.6293 218.5572 628.5332] +/Subtype /Link +/A << /S /GoTo /D (a00152_g499bb98a0b4ae9a98553ede81317606d) >> +>> endobj +2255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 372.6901 227.254 395.6588] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +2247 0 obj << +/D [2245 0 R /XYZ 90 757.9346 null] +>> endobj +2249 0 obj << +/D [2245 0 R /XYZ 90 637.022 null] +>> endobj +2250 0 obj << +/D [2245 0 R /XYZ 90 637.022 null] +>> endobj +2253 0 obj << +/D [2245 0 R /XYZ 90 603.0588 null] +>> endobj +2243 0 obj << +/D [2245 0 R /XYZ 90 578.5313 null] +>> endobj +2254 0 obj << +/D [2245 0 R /XYZ 90 578.5313 null] +>> endobj +1420 0 obj << +/D [2245 0 R /XYZ 338.656 320.2263 null] +>> endobj +2256 0 obj << +/D [2245 0 R /XYZ 90 302.5028 null] +>> endobj +2244 0 obj << +/Font << /F29 499 0 R /F50 1172 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2260 0 obj << +/Length 858 +/Filter /FlateDecode +>> +stream +xÚ­Vmo›0þίà#HÃó»!ßZ­«Z©RÖfÒ´E œ·Y×?ÛFë6mŠ”œ}ç»çÎwOŒ\¨>È +˜¡ÜM +º{µ}í «”>˜\nœ—¯qäF ☻›ñÀ`aw“~ðDè8„zÇ›µô€½pW¥Ç\öò«*9²ìâ.«JÿÓæÖ¹ÚŒq-,F8ÒQ¿:>A7UðnH2÷Q- @Q„Ý¡˜ ‹ÜypÞŒ~z…9°”Å*³7 „(¢‹V!…B#€ÃË…#!® ¨ô©©ÆÕ÷¸¨sÙ®æ"ˆ »S§óдG{ÞiöVu?ˆ ¶„LŽv£™†(}ļfPÄY™WU> endobj +2262 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 717.9621 227.254 740.9309] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +2264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 543.1103 227.254 566.079] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +2261 0 obj << +/D [2259 0 R /XYZ 90 757.9346 null] +>> endobj +2257 0 obj << +/D [2259 0 R /XYZ 267.4535 665.9412 null] +>> endobj +2263 0 obj << +/D [2259 0 R /XYZ 90 649.2141 null] +>> endobj +2258 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2267 0 obj << +/Length 2057 +/Filter /FlateDecode +>> +stream +xÚ­šYs¹€ßù+X›²*Dp~óꊼ¶¤HTU’Ý-Õ˜‰ÌŠGÈaÖ›_ŸÆÎAT¬r•ˆ™één4>t7h’>†¤op_ … ã²?Yôpÿn_õˆ<‚磺ÀãÞ_.©éd$•ýñs©A$(¡ýñôçD„GTàÁÙjù Æôe·ÉŠùjén®Öv¼uÏC*«»Ø]ßÁ@*­Ê ê]Œ+G¼Ÿ‚IbÝøwïç_q +þ~êaÄŒýßá#b í/zœ²pñÚ{èý­Òã”/š® ìð| Gp‡† S˜¿ªÏ—`üM¦éôd„(õCÄ­zª÷úñÎó"›¿æS§à<ßN6óR¿WÄj cõX¯Óã oͽ/“ÊÛ o·/_ܰ˜ån°Î7CŠ£õfõ¯|R´_­MÔÞyÍÛ ÇL€Ó—J iföÑæÅËÜ×V ’Õ_pËPŸ]Wo9Éùâf/¸AX;M/Z«_I¥lw´YÛÈ…˜‹ „($)çåÃñ¬ »!LåâëYÂaä {} ·kXåQ1_xÁ=Dpñ\/¸%…;ÙrêÛÙj÷êÇ_s'Uüžg¿ äþA±rŸ‹¬˜ÌÜ0ÏÜH¶ë|2·>NÜ¿înr€”•øIYš{G´LçÛb3ÿj‰Ùy2àqmš “¹›ÓÕd·È—EéÜ·D ¾e‹õ«WúCXÌœ@1Ë +¯/óŠË)j°õÜéá>ps±š– \Ø´Ÿlc:n‡Ô§Z‡G „‰V}a$Ò˜ªƒì¡Q]ª›-5À™êK¬ä]¾Yù‡¶U‚)RŒ’¸ÙJê€Ý:²+¤{mÖð—ÕBʬžÝg¹ïí ³ÅK©€¡½˜/÷¯´|§°/” ²åûÑM_É'fÑÕÝôc©•‰G°’JØf†)á-ÛaÃÙ@,W>˜_C gÙò%Ÿþ®4ø]áATgY›1oçZ—O0GÒdæ<‚%zF³zòE‡ê‰ÍCåÒC~ƒ”é¿„³=PeÕ¾ fëê‡8“ˆ3Í÷z¬±_(]¾m‘,n±’JÙ…m°”-»KaÐPÓ¶|”ÎJ>åCGok¥Ú~(‚`ÙE< "np¤[•ë@¸"ЦØF^«0û<•¼ô ¬ŒîWbÖÓ¾çÂ*WY£îÛdÝ­ýpu×Ù¹$ SQ&TÜï>ì5ƒ3È!2ÆT‚ÁJ,É`]a„Á„ÝÀ`ÓnœÁ¦åLøÐÑËD2„¥ñù ÓbòrÅa IèÅÜ^9;ÆW³‰®7ÐØŽ3Ça~\cv¢Ç5éªïßçQS&%JgïÀI=(3õ¨Ñ5kÃ$"­:ٷꌳÁ,ÛºAf? Âì_˪·ÊŠ ŸÝBmV…šsß8•²™^V(+gãüû'ßlæÓi¾t¯”!¶®1´£ª;‚:‰më·õ:²¸&s]8óepýx«Õ‰Ûá²æÆ®±³ƒ²O>åe¶È=(³Ìf27½ö±f“ÛW¿¹«Çë»§³Û›Ë!”it (2 ­<r%¤º@$!UbÉ„µ¸OH »!!5ìþiZN}ÙÍI\"Ei?ž“‚|ÊŽ^ëFˆùÓ—·ƒ›‹³ñõíÍC§—4 +ibd"$#)Ô[“Ð>s¢Iª+›æìÛ|±[xÚüŽ,÷÷³ûŸíËå(·;ñhŠbœ ¥!Ó¼CYdÐGhMŠÂ –¦°¦0FaÜnEaÝî 6ŒŸBaÜŽÞ…Ÿ¯Æ7w·÷C «x€Dè`‰°Ø“ ÖUÃ&N$:1£k[è‰Aì$_á8ž/«/u*0׫MACWG­7 IŽ2ImHD*3VbI&ë +#L&ì&vÓL6ŸÀdÂŽÞ“?Ú‚úxyyqÿôpýÏ‹’"­°N„Ú7Òoäѵ)«m¦Ã> endobj +2270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [315.1536 672.5415 350.0824 683.4455] +/Subtype /Link +/A << /S /GoTo /D (a00140) >> +>> endobj +2271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.7554 593.6496 309.6842 616.6183] +/Subtype /Link +/A << /S /GoTo /D (a00140) >> +>> endobj +2273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 524.9361 172.3507 535.84] +/Subtype /Link +/A << /S /GoTo /D (a00141) >> +>> endobj +2274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 486.1806 164.0618 497.0846] +/Subtype /Link +/A << /S /GoTo /D (a00140) >> +>> endobj +2277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 365.4596 298.8158 375.3872] +/Subtype /Link +/A << /S /GoTo /D (a00153_g3f6f1f6f98431f2d33ed30a30d2ccc35) >> +>> endobj +2279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 326.7041 293.2467 336.6318] +/Subtype /Link +/A << /S /GoTo /D (a00153_g974c9b4bbe6b07cc1d64ac4fad278030) >> +>> endobj +2281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 287.9486 263.8671 297.8763] +/Subtype /Link +/A << /S /GoTo /D (a00153_gcacc406c3bf7d0e00412e4c946252739) >> +>> endobj +2283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 249.1931 265.0627 259.1208] +/Subtype /Link +/A << /S /GoTo /D (a00153_gca1240bba5dd57f8c7c27123c84a1f6d) >> +>> endobj +2285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 210.4377 245.6755 220.3653] +/Subtype /Link +/A << /S /GoTo /D (a00153_g3001114ddadc1f2ada5cc9a780e866fc) >> +>> endobj +2287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 171.6822 220.231 181.6098] +/Subtype /Link +/A << /S /GoTo /D (a00153_g763f12007aad8cc0e483bf50f8a8d9b4) >> +>> endobj +2289 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 132.9267 286.1035 142.8544] +/Subtype /Link +/A << /S /GoTo /D (a00153_g9dd44616d41cef74d3beb51d8be5ecec) >> +>> endobj +2291 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 94.1712 253.6255 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00153_g529648ad3b0b327a43689b0f1779ff55) >> +>> endobj +2268 0 obj << +/D [2266 0 R /XYZ 90 757.9346 null] +>> endobj +650 0 obj << +/D [2266 0 R /XYZ 90 739.9346 null] +>> endobj +126 0 obj << +/D [2266 0 R /XYZ 90 739.9346 null] +>> endobj +2269 0 obj << +/D [2266 0 R /XYZ 90 716.7484 null] +>> endobj +2272 0 obj << +/D [2266 0 R /XYZ 90 543.8366 null] +>> endobj +2275 0 obj << +/D [2266 0 R /XYZ 90 420.1859 null] +>> endobj +2276 0 obj << +/D [2266 0 R /XYZ 90 381.3704 null] +>> endobj +2278 0 obj << +/D [2266 0 R /XYZ 90 344.7717 null] +>> endobj +2280 0 obj << +/D [2266 0 R /XYZ 90 306.0163 null] +>> endobj +2282 0 obj << +/D [2266 0 R /XYZ 90 267.2608 null] +>> endobj +2284 0 obj << +/D [2266 0 R /XYZ 90 228.5053 null] +>> endobj +2286 0 obj << +/D [2266 0 R /XYZ 90 189.7498 null] +>> endobj +2288 0 obj << +/D [2266 0 R /XYZ 90 150.9943 null] +>> endobj +2290 0 obj << +/D [2266 0 R /XYZ 90 112.2389 null] +>> endobj +2265 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2295 0 obj << +/Length 2082 +/Filter /FlateDecode +>> +stream +xÚ­Zmsã4þž_‘¾$3TèÝ2ßʵwÜAḆ`:nâ´†Ä ±C¯ÿž]Krì8±\èt¦–Ç»«Õ³Ú]%lLác:ŽTDb!õx¾Ññ<~7bîã øü¢ øf6úê-Ç1‰5×ãÙ²’ QœññlñÛÄÐé74¢“ýû0Ttµƒ›Íb¿Jíøj3߯ӼLÊl“Oÿ˜}]Ïj½Î,%4C­~ûƒŽ`Þ‡%"6jü7”°8æãõHráoV£ÛÑOµûAõ©ÙIªˆf|Á#;Ÿ¨f4"Lsð‡ÙG¼v‡¢c¯k‰î`ð!b3ö(ôI퉧[”Ù¼°÷0s{ݹërÊÌdyì¯:b œ Öo§3“ "åùe…ÉGšG‡eeeT)Œ×0œÈ®qðWbÜxÂ{ÒË$‰©Öm½åó6]¤Kë¤}–—æ®ìØÁ"Ʊ<²?Ú=8̧–Ÿ>dQGnµ¤§,ˆè÷„1D)ƒŠp èA¤Ó1%НúYç`ÖFcýuŸ•v°H€~àÉsôÒQL”¦æU襵&‚Y@½jX^M=ô +èõôjéíЋé«k8‰ x§mÈy~y|ȤŽÜŠ_§LàÀ+)Õï‹Æ„z)ÁlÓ (7öÊÈ +,†®°ˆ®#LÓÆÏ‰½Ûtžá;s+!ß,R§5Ÿ¯ö‹Ô½W¹ÁÔn€IJPœ§å:)þjÏÆI’£™ž`$3:Iö«Ò>ØmöeŠV0WØgOéjeGþ‰]\Ãh—§îe§&e›8€u3:r[ÛåõìÛ“»%ÒІ‡\!"hñ€’/cаÉ:¹ªaUqë‹©ãí²*fZûæå'7X7ŽùNæòÍz›­ü.ú”•ç÷ØCES ^N¼ùÛ®PÐÆp!z¬>Ý ·ZØõžuGu ‡ŽÝhŸ ´& 'ÐjX0Ðz5- ×ZKo8ÐÚÊZÀŒŽ\h³Ù÷ÝCM(‹uÀRgyŒò¶j-Ï‘CPk·q¯î Vríc;A \H)Zfë´]>¯²`­kâþåm2Ç~ï/l;ÒÒ…XÉÅóó!ü¡¼;ß{óˆ­_éК«˜H<´®aáHhì‹„~½u$4õˆ„–ò!‘ÐoFG®„O×—··×7ß|‹I'¿v²Ž€%2ä ® â/Í:˜Ò˜ž\×°ŠÉS¥&û]Þþ–¤Øo·xVVÝ,ýnš¯®;­òCRéúÚZÕGSÔƒš2\j$kX˜¦ }4í×[Ó´©wM[ʇдߌŽÜMïn.¹ÄnòÝu·:ŠÕ4àŽ°ƒË˜àUË IÏ„J±H d}ÝÇzkíßëäs¶Þ¯Ýn]ïÛIÞfür‡Ç- þa]oÌÍŠë)ñ$Y~T¶…†ÝÓ«>û¤?ŹO1Òëyþüu7• +Š›mº8[,Ðݛ߯6ѧ‹.¦ ÝÆÆíoWÿ­ê‚¤E ¥âl7=A\ÂAÜ«ñĽ>ˆ[zÃAÜV> ˆftäú ÆõèT]ÑF<`(þŠà¥é…qxME¡VÚÁ„K/1ÇKˆ›êßÊ77O)¶v\óª•vÂýL–ïFpÑUlä«$hí…4¶:P«a=LíÕèyÚÐfiSíŽöp$³ÁÏ»7ß^¿ùîöç›Ûî×]h¢LïüµÃÀòNO¯K˜Vúý|¥ZV Áođ08I´†‰âOCàÙÎwižÂè é·Â?ø€ißÛ3î®ôk.¾æî—:0-÷ÝîrÊUÍåîOz|pµùüüv~È£ ž½i /ý ŒUéendstream +endobj +2294 0 obj << +/Type /Page +/Contents 2295 0 R +/Resources 2293 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2292 0 R +/Annots [ 2297 0 R 2298 0 R 2299 0 R 2301 0 R 2302 0 R 2303 0 R 2305 0 R 2306 0 R 2308 0 R 2311 0 R 2312 0 R ] +>> endobj +2297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.0032 702.6096 196.7092 713.5135] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +2298 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.9845 663.1573 206.6718 674.0613] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2299 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.1599 623.7051 252.3298 634.609] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +2301 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 459.7527 225.9098 469.6804] +/Subtype /Link +/A << /S /GoTo /D (a00153_g51195ea7cd5aa387a87f9d3b23905b62) >> +>> endobj +2302 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 420.3005 246.7912 430.2281] +/Subtype /Link +/A << /S /GoTo /D (a00153_g9069474ea570fd78c481aa164317dbaf) >> +>> endobj +2303 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 380.8482 245.6755 390.7759] +/Subtype /Link +/A << /S /GoTo /D (a00153_ge0f8cbeca9731af2171ffd37e79de893) >> +>> endobj +2305 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 296.6881 187.0159 306.6157] +/Subtype /Link +/A << /S /GoTo /D (a00153_gb61381673de27f31848c5396bf0b338e) >> +>> endobj +2306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 257.2358 233.6306 267.1635] +/Subtype /Link +/A << /S /GoTo /D (a00153_gf963fdea2b75d27ef31e92d1d01359ee) >> +>> endobj +2308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 217.7836 248.0566 227.7113] +/Subtype /Link +/A << /S /GoTo /D (a00153_gc3882366feda1cb759ccbfe98327a7db) >> +>> endobj +2311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 133.6234 188.6795 143.5511] +/Subtype /Link +/A << /S /GoTo /D (a00153_gdcf372ff9748996f7c05e9822a615384) >> +>> endobj +2312 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 94.1712 254.552 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00153_g92f3344ec8ca46893163399c89fafed5) >> +>> endobj +2296 0 obj << +/D [2294 0 R /XYZ 90 757.9346 null] +>> endobj +2300 0 obj << +/D [2294 0 R /XYZ 90 556.5104 null] +>> endobj +2304 0 obj << +/D [2294 0 R /XYZ 90 312.6772 null] +>> endobj +2307 0 obj << +/D [2294 0 R /XYZ 90 236.1996 null] +>> endobj +2309 0 obj << +/D [2294 0 R /XYZ 90 149.6126 null] +>> endobj +2310 0 obj << +/D [2294 0 R /XYZ 90 149.6126 null] +>> endobj +2293 0 obj << +/Font << /F29 499 0 R /F50 1172 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2322 0 obj << +/Length 2189 +/Filter /FlateDecode +>> +stream +xÚ­Z]sÛ¶}ׯÐL®ô`\|è›»‰3‰íÚÊmo?Æ#K´Í©D¹"Õ4÷×ßI@ (tãñŒEŠG»Ëå9‹@2ÆðGÆ‘ ͸/Ö#<~„¯ßHsù®Ÿø€7³Ñ¿ z¬‘–TŽg•I „ŽgË_':=¡OÞnòß0¦»í¼Ì6yýåæÙõÉÔŠÉf[Ÿì.®á@&JM™þ>û0:Ÿ¹@š8“Ä„ñçè×ßñx ñ~aÄ´ã/p‚ÑšŽ×#N™=YnG?:;õ…êÇn—cSãšÔ7è:`‚D$…QHGB]~+ø¹ä&?.âD«±E™$ͦšN6S‚'Õ¿UÚd${¨??Ÿ]׋)“§t1¥xòG±[7¸âi³[-ëãû´I`‘6ߨ”æ›fÒFˆ‹0¾Åæ CB`ÚOÈ—À GæQ„`‰8S|ì`&¿Q*ºÁÁ¯¨`cßà‘Ä7¨˜_‘ÆR¶ý~·L -ó´ãœK”Є87—¶ æÆÃâcatìš0>_\ßÁS¾{{uyy{ +¥1š¨HàR)€®D Á‡ÒU*“>Ì"|u°Š°O ÉÖó¿³õn]ŸÌ×›]^6œk˜»Øä‹Ýv;eÉ$µ×ölÞäyº¨*@/1¡@0„¼m‹!H A›ê$93¹$õ}¼ÝGÒ_œºÅGBª•æ¤W>  ‹* èq¯€ˆ_«€–߸ÚÎ( FÇ®UÀé”Ã@1»øÏùÝÕõùeGŒ#•R³Õ:!œZ$©ƒ9b£N,ÌÄ|––évå‡õºØ=?o¶ ÝlýÝ<§y–?v¸ßÀ¶SÃßÚþzJûb³~ÎV¶¼gy¯x„f0ºQñ‚ªÞÏi‘@Ò9åN;X”Ó¾Á§#~-§[~ãœn;ÀéH»–ÓÇ+:®z¤H´¡šf/$²Q­“‘˜ +ô|·¾O·í‚^ÀåU9ÏÓÍ®X}Ý»>ò j´´ ìäX¿JÏ!˜F‰ÆIŒg§g0Äΰ_ÇNßïv¶œag8ŒŽ]Ëη³óËë«›©„§×å)£ˆ'"’ *#ì…}‡ À?®HŒ¦öí4]eEéU`ÇUSª,æQ¥é«ÔP®!LÇú‹²Ô7`iįeiËoœ¥mçX £c×uÆ7ïÎLkp:%„˜éƒÃCªÂM`ÊE,%) #âËj*Wæ2Ö8ØË›ÇÆ]Õ,WA×1/çåÜÍá2óT^ŸúM-O€Þ,y ¤Jb-‚ƒÅéí Ñ;ì×ÑÛ÷;€Þ-çCè£c×Ò».¾S¢&W`”4±Ç2aQ±`Ç´ÔíX/78Йs5P#:¤ kô,ÏÊl¾ªOêéb¹5‹ó¼XgEáÈ^fk¨é¥e9L8÷$ß#Q=ïVEÚ_Ú9cˆ(ñ: ‡9‰d"Ö€8XœûžÁ÷Ã~÷}¿¸ßr>„ûá0:v-÷?þ\ÓÿçnALjQEÉp¨H”P¤€ÿíT/5`š‡ul=ÌQßC‡¨oa{êóÄëe¸Ü÷2p¡êeàÓº¨ç5ªHÍhø¸®øÞ p|ߨ=PÑ”LÖYY«¥B™¡Ç '6œ}çÞø:bz~Xºìƒy'aüuz&S$¡¢k)–o0 ¬ˆ_+¬–߸°ÚÎ+FÇ®'¬Ûÿ^öi‹a7Éùp¨Hf–ðƒG zÉȮ®èù耴l/­„yÒ‚'­„×҂הּàp^@ÎꃶÆà7•@EËúô¾ñѬÁ¥–Æö.Z +K5äÏ]Z”ëZr?H¤i¡êebÛÞ-ÓtmǽrS>ÍÿJmhç㻼Ø-iQ<ìVýjåÊä먕*$&bjµ°¸Z=ƒ!µ†ý:µú~¨µå|ˆZÃatìZµBû÷éööب¹Pá,8TÄ=…‡ÇA)ÙǛޘ)Ççn/~9¯ÉsÒ,×›e‚ïï>ž_v¾‡°áÿ{¸VH/ÁÀ/fx`é£CŠ·°Vé¦Q­‚¶–«åÿ¥F°ýšÀÜý*š J™Õ>Ñ„ƒE5á h"â×j¢å7®‰¶óšˆ„ѱë¦EçoÏÍVÀO—gWS&&?uä!"BÉHBÈøóÂ9?M(Ò‰Ž5u Œ¶yX¬µ"UÚKóå_é¶ÌÜöl]þi_ÿËð´Y/ø’åËÍ—) ½,¥XJñëôY”+Äë³,ÎRÏ`ˆ¥a¿Ž¥¾ß,m9ÂÒp»®r_|ŠN œӋYuzõyÖajBÔ‰ +'Å¡"Ñ@×W%ÚÑ@½DMÓØ*c¾‡1ßÂŒó÷@Õz•ucXç‡[Ý媢œ=˜½»J^çUViuè2\¶)%§¸í£ï›…Îx½ë}zóÏv‹ÁP˜°^åù€€ò,ª¼ Ç½ò"~­òZ~ãÊk; ¼H»n·øæº^ +~sW5-Gö.àDZlP¸KÅ_ºÉFx‚˜ð¨s\"6tpp+ç÷«0× “ˆ5û|ß\ü ¥Hq-c´°8=ƒ! +†ý: +ú~P°å|Ãatìz4íê½…wG(Lõç‚"1P–@ÊxÒŽ!PòÍ'ÃR䳇ñÙÂ:»qî% ÷ÛŘ]B?¾ÍìþÈ:õæÇáŠ.ÁåSq°¿—B^ö/íjÐFláÚŽQŒ.¬cxD +ùM/VúRØl‘R¤‘Ð62e_š$P«’ú¡¾KóF÷ú^“…Oöàƒ) ;›jsô=eߪ3¸!ÙûR¥A£xß ¿g›¿¿>¦ùa:TMš—Ÿÿ`,åendstream +endobj +2321 0 obj << +/Type /Page +/Contents 2322 0 R +/Resources 2320 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2292 0 R +/Annots [ 2325 0 R 2327 0 R 2328 0 R 2329 0 R 2330 0 R 2331 0 R 2332 0 R 2333 0 R 2334 0 R 2335 0 R 2336 0 R 2338 0 R 2339 0 R ] +>> endobj +2325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 703.2861 227.424 713.2138] +/Subtype /Link +/A << /S /GoTo /D (a00153_g196379ceb1219a99f4495e41ccc9bbfb) >> +>> endobj +2327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 617.7172 235.8724 627.6449] +/Subtype /Link +/A << /S /GoTo /D (a00153_gac0de06236b02659460445de30776e00) >> +>> endobj +2328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 577.6656 202.5175 587.5932] +/Subtype /Link +/A << /S /GoTo /D (a00153_gf5fe83be78b78b9e7d9e7f1e34ab1cc5) >> +>> endobj +2329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 537.6139 233.4713 547.5416] +/Subtype /Link +/A << /S /GoTo /D (a00153_g8f4ebd8ef6c0ea665ed351d87fec09fd) >> +>> endobj +2330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 497.5622 215.0208 507.4899] +/Subtype /Link +/A << /S /GoTo /D (a00153_g51c1cd531ff0afb81620151f2248cd21) >> +>> endobj +2331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 457.5105 187.9025 467.4382] +/Subtype /Link +/A << /S /GoTo /D (a00153_g15de27b044603284f68db05a378235a7) >> +>> endobj +2332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 417.4589 211.3245 427.3866] +/Subtype /Link +/A << /S /GoTo /D (a00153_g67cf1e0d2324c93f332c1f020c0fe8b3) >> +>> endobj +2333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 377.4072 231.2496 387.3349] +/Subtype /Link +/A << /S /GoTo /D (a00153_g24aa5bc36939cc9a0833e1df01478a7e) >> +>> endobj +2334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 325.794 211.942 336.3243] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4910467b83a639f06739c82cd362037e) >> +>> endobj +2335 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 286.345 259.1549 296.2726] +/Subtype /Link +/A << /S /GoTo /D (a00153_g5b9dba2123705bce1ce95c3deca0bdad) >> +>> endobj +2336 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 246.2933 272.6941 256.221] +/Subtype /Link +/A << /S /GoTo /D (a00153_g2bc3b489923793759526a3181eb667fa) >> +>> endobj +2338 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 160.7244 233.1426 170.6521] +/Subtype /Link +/A << /S /GoTo /D (a00153_gb1455b27c06532a399cf06d2c1d6d08d) >> +>> endobj +2339 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 120.6728 236.4303 130.6004] +/Subtype /Link +/A << /S /GoTo /D (a00153_g3090117ef3ff5775b77cb1960e442d07) >> +>> endobj +2323 0 obj << +/D [2321 0 R /XYZ 90 757.9346 null] +>> endobj +2324 0 obj << +/D [2321 0 R /XYZ 90 722.0018 null] +>> endobj +2326 0 obj << +/D [2321 0 R /XYZ 90 634.0061 null] +>> endobj +2337 0 obj << +/D [2321 0 R /XYZ 90 177.0133 null] +>> endobj +2320 0 obj << +/Font << /F29 499 0 R /F50 1172 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2354 0 obj << +/Length 2254 +/Filter /FlateDecode +>> +stream +xÚ­Z[sÛ6~÷¯ÐL_¤ÁdúäØŽ×§ñÆÊÃnÛñÐ-qB‘*/IÝÎþ÷= +iRÞz2àÁ¹áù€&3 ÿÈ,À3Ox(`\Î¢í ž­aúꄘקðþÔ%x·L0~Ôc ¡È÷žE¦”>’7LK5‰K‡Ý,Ç…ZTºB§AÙ‘|&Çu8äjy·\l~ÖìÎòúny}~×C&…°èyþ¸/CþK)òSÀ´dJí‹¸Š‹m’Å¥ÆYbPYª]VIdæËz·Ë Ær“×éÊ3¶Aq»KÒØÌ&Ùóèä +rB¾<F 9…OMv @-åB²1ˆºrÀhGø1 W£Ç×ÂôæÓÕÕõÏW=hêUÐ÷‚/Ç&ˆpF§°iÉÆ°™æ*2®›ÿ’lÝ §Q\Tab’r¼ bþ Êò5€‹9">g¯\Ĉf5Ü–l¸.ÃàNȵÀíÈnWøÀP£Ç·ÍøŸÏ?-˜˜Ÿ]œŸA¸íEWH÷œOùƒBÕèƒÌ—AXx°-‚ønÉ”ÖïŠó<\EaYu"é³0R Ðà5`&(’”S0³dÓ0sŽÁl\n 3Wî0ë?fãjôø¶ññæŸ÷7—?÷ã#AÜãdÊ GÉKÁÅ<äA„™—%ë•i’}5#ñL§²‰ÃT‹æU¶®6ÏÃŽJäc"^vª|aDLÁÎ’MÃÎa8»q¹-ì\¹ßT]'«žlÔˆº²ŸG¥ŸÒ¢ÇWiQ'»û4_÷”€PÀ´ ã°TS¢¥‡|ù½ëx,p´ %ûÍ{”B;Ì<¢ 1ÓD®`Ž«4Ͷ\?òÆx0–Áq'Â!9–JI¿-’ÌÙ¼6ƒð ·²µCó°Ë2lk‰æè<{>¸ï#B09Ry‡zøvC€ÍÏo¿u ÕáE›¤Š£ªnâáK‡þNÀÉ£{x@öÑ@?Ò0'æ-cóªw“¡È’R¿ü¾‰5Õ=ªš‹³UBAfHTÑÕyßÊÒÌ“$Úè©fÔœ«rýü`õå.Ž¥`¼jöE™ØzLü˜7I•yJn©GU¾ +ŸÔÐ{c=—&U•š±¶àGx€R"ÌVfÕÆ¼Þ¶,³¼ +ÚU +DñÎ\ø¸ÜÛµó*/ò44šÓÕÐÐúó‡díª1hUÖßý{yyÿéóÅåg×0*ò‘Bvfk[ÇV†°PY•Áž\68ˆsAÑœS<[ýÝã“”]öV6l¸úb>F\úäÙTáŒ¤Š–l2UŒJܧР¹6UtäNW(]áGT(jôø¶…ð‡E +£HL8‚ª”1éeE +ƒL#Ý~{8&·d4?×ðR„Y¸5#…'õ[m´b´£8™oë²Ò£‡X¿/šð¾NÊ +2ÞJ¿ûžT=2&@þ4ËÌ‘’X¹­7u>ˆìêèžÝÞžŸÝÜèÝ6%QÊísÝ×%¾³îf”z& +3=(!ëÄz¨”ݽÓDaeˆ”eI¶_pp…Ö6£ ºý©~«¥?uô£YŸ¯­|ó½OALøˆùÐFuµ88‰-Õ”lI¦Lte—UQÛ¼¾Pm\¥Žä㓾YÚ;O;ãÞ&díÝâ=# äî.4·ª{‰MH4 +¯âÇ·íeV +HÖÀQU´»žÍ^ÞÛ7[í ê•K0ˆ¨6+ä¥ûâR]šõå»5áT7 &Y”Ö«ý ÚžGZq!|è,„ªÚù$´ ý©»`Z‡| ´ò]…6}hAò ´:Zô e¨¦d èª|z [;pHC2¼y +] UÓú_—›¡Š×Æ©i +n‡œ`ïB7z…uµÍu:(4}Nþµ—å|Ð@ãN|ŠäÕÂjêeW® xjâ¯fA€„ä¤#´öïÍš†zH¯šHKåuV ÑØöŠ/èí1Í:\'ý4o8òT˜ræWaîªâ'õ1ʰ¿Í¶ŒŠdg´„òQe¬Ëõ¿C˜d}1âË04ðÅ› ½Á?-À°Dêòÿþ¾ß´Pß2â|P$H@%óuD€…j4«Êþ#~e• Êíàƒ:uµy Ôüâ·”½¥æO(ÆÒœZuþòâ ælÿæÁ†ö‹ü§uÜKoêO¼ô?«(Àlendstream +endobj +2353 0 obj << +/Type /Page +/Contents 2354 0 R +/Resources 2352 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2292 0 R +/Annots [ 2357 0 R 2358 0 R 2359 0 R 2360 0 R 2361 0 R 2362 0 R 2364 0 R 2366 0 R 2367 0 R ] +>> endobj +2357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 705.2116 209.0629 715.1393] +/Subtype /Link +/A << /S /GoTo /D (a00153_g3589822ecb9d9c4145209756396b8a6b) >> +>> endobj +2358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 666.5202 222.0741 676.4479] +/Subtype /Link +/A << /S /GoTo /D (a00153_g5726142fec34f35fb9ea19e5a45975c6) >> +>> endobj +2359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 627.8288 214.124 637.7565] +/Subtype /Link +/A << /S /GoTo /D (a00153_g21664b7441cfa37d280228d23316d609) >> +>> endobj +2360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 589.1374 228.3406 599.0651] +/Subtype /Link +/A << /S /GoTo /D (a00153_g156dd2891a57035e4afdc4c2bc0b0ebf) >> +>> endobj +2361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 550.446 212.4703 560.3737] +/Subtype /Link +/A << /S /GoTo /D (a00153_ge6f4a2453dbd8bc60e6a82774552366a) >> +>> endobj +2362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 510.7784 166.3534 521.6823] +/Subtype /Link +/A << /S /GoTo /D (a00153_gb58e1ceb7cb73ca2bcd73146b6c1b4e7) >> +>> endobj +2364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 378.2912 233.5112 388.2189] +/Subtype /Link +/A << /S /GoTo /D (a00153_g285a80366aed9428f64282b8d13c918b) >> +>> endobj +2366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.3051 251.4958 359.3784 262.3998] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.4596 221.9163 356.3884 232.8202] +/Subtype /Link +/A << /S /GoTo /D (a00140) >> +>> endobj +2355 0 obj << +/D [2353 0 R /XYZ 90 757.9346 null] +>> endobj +2356 0 obj << +/D [2353 0 R /XYZ 90 720.8203 null] +>> endobj +2363 0 obj << +/D [2353 0 R /XYZ 90 444.8446 null] +>> endobj +2365 0 obj << +/D [2353 0 R /XYZ 90 311.3811 null] +>> endobj +2352 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2377 0 obj << +/Length 1774 +/Filter /FlateDecode +>> +stream +xÚÍYKÛ6¾ûWèÅb†‘’rÛ]oÒd»ëE“ÀÐʲ­Ö–\=²ÙþúERÖÖœ´‡ÂQâhÞßÌP&†±NRuSÌïa!×»lòyñvt»¨Ñzr&ˆTã¯ÑÇÏØZ¾oG1ÏåÖ3Ü`Deà@O¸ÕçD'à}Œ«ê Šõ, Š=œwT0,ò±ÌKÄ ©1BD³:Æ£äUl'œoó_o—îoßkŽì,ÇY˜‡é>’ÅJ5Ý£²âpHRÝÖæsHrã(Þè3Tù0¨9I“}Ï™Ðô­ ٢ݱk•EZªCTZ»Ôk.õð\Ý+aQë•™Ù*;¤çýT¥E¬õƒ›²©Jºä hžJ;X(»€A¾4ÓCšüF©›U¢®q¢Äa©vÉTó(I‘o’J8jÕ¼4­ 4™×½2MÛ´ù@¡ê~ 2Gë¸éOhx±ñfR~½Z7†4\AØš=‚deæˆèïÖ€"D·"ÃêÝ-:jd•]d2‘2Öä(_ÙéM˜À´E§Óΰ–¥óöäûÃýò§«ßÊ´¿»UÏ Åƒy_g{ÿkTè´õ7-Gwí6ÿɨ`M#—}ègEÚžÀηY“SB\WÙÉ\¿ŠOØcãÊÃCÚ¥c—¦å§”Uk44è"7:~Â_?ÎÔè XZìrxNNêsI„w/Œp;Âu˜†q`œöôR½´ôS8¼Gû0•:Wú]”#¬7G¢y½|œÿ~{ynt‘QÁ§™'ݸ(!ÍľŒ{UE”Ï%‚å5 sµ)ã(øê²óÓ qÇ›0UÛ_$¸ý]¡_“µZ^Uíee“âÝrõÉ/qrsëO(0ë½=”¸{Qwz._Põ\IÐoì’Àß5ËÑå,–‰•¤~NÙÞ7ç”}QNE ؤԫæ”íÖŽ¯¾7#i=#íóyý0axüA‚üjvsõ¸ÌÉë4ñWŸåöÜ“wÚÌß4Û +T+½kzôÓÖSñ<23×" ×…þ¸›Ä»S6!d‰žž£|«­l%—'…M/m%í¿fà¨o;'ÿ1Áàf"¸øWÿÚ”Ó» ¯FëC<‡¹æ_(­„´ö.ŒChêU«Ö&ÿdo% ÓB¨i%o({cê:ÅXœý—JR#ÜÀ,ùú² ;‡qNØ)ÿüøÞd+endstream +endobj +2376 0 obj << +/Type /Page +/Contents 2377 0 R +/Resources 2375 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2292 0 R +/Annots [ 2379 0 R 2380 0 R 2381 0 R 2382 0 R 2383 0 R 2384 0 R 2387 0 R 2389 0 R ] +>> endobj +2379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 726.8189 213.038 737.7228] +/Subtype /Link +/A << /S /GoTo /D (a00153_g41aa744caa46913b3b3aedb2a4e78546) >> +>> endobj +2380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.2787 687.2449 190.8907 698.1489] +/Subtype /Link +/A << /S /GoTo /D (a00085) >> +>> endobj +2381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.3888 687.2449 268.6482 698.1489] +/Subtype /Link +/A << /S /GoTo /D (a00153_g69646a81a922033c5281445a71f8ffed) >> +>> endobj +2382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.7197 672.2644 372.0849 682.1696] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2383 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.2897 647.671 239.3189 658.575] +/Subtype /Link +/A << /S /GoTo /D (a00153_ga92afb113e122f860392bfbd385f842e) >> +>> endobj +2384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.7197 632.6905 372.0849 642.5957] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 564.2011 245.6657 574.1288] +/Subtype /Link +/A << /S /GoTo /D (a00153_gb6e04358481bd2057524fb874cfa472b) >> +>> endobj +2389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 550.8899 229.0679 560.8176] +/Subtype /Link +/A << /S /GoTo /D (a00153_g6836f92f3692f3a4429eb599db40cbae) >> +>> endobj +2378 0 obj << +/D [2376 0 R /XYZ 90 757.9346 null] +>> endobj +713 0 obj << +/D [2376 0 R /XYZ 90 739.9346 null] +>> endobj +2385 0 obj << +/D [2376 0 R /XYZ 90 582.5346 null] +>> endobj +2386 0 obj << +/D [2376 0 R /XYZ 90 582.5346 null] +>> endobj +2388 0 obj << +/D [2376 0 R /XYZ 90 568.1862 null] +>> endobj +2390 0 obj << +/D [2376 0 R /XYZ 90 536.5063 null] +>> endobj +2340 0 obj << +/D [2376 0 R /XYZ 90 511.0399 null] +>> endobj +2391 0 obj << +/D [2376 0 R /XYZ 90 511.0399 null] +>> endobj +2351 0 obj << +/D [2376 0 R /XYZ 238.8902 421.844 null] +>> endobj +2392 0 obj << +/D [2376 0 R /XYZ 90 404.3073 null] +>> endobj +2350 0 obj << +/D [2376 0 R /XYZ 215.8768 311.4556 null] +>> endobj +2393 0 obj << +/D [2376 0 R /XYZ 90 293.9189 null] +>> endobj +2371 0 obj << +/D [2376 0 R /XYZ 352.8421 189.1121 null] +>> endobj +2394 0 obj << +/D [2376 0 R /XYZ 90 171.5754 null] +>> endobj +2368 0 obj << +/D [2376 0 R /XYZ 238.8902 96.348 null] +>> endobj +2375 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2399 0 obj << +/Length 1725 +/Filter /FlateDecode +>> +stream +xÚ­X[oÛ6~÷¯0°¨9’%±oiív.’4s\`[[ŠÍÄBuquA’ýúФ¢›-'+‚ÀynüÎ$cø#cŽÇ.s·lg¼‰Fx|ÓGD/Ï`}V'x·ýþò1GÜ¡Îx}WJpb”ÐñzûuâÙÓõ°‹'Åò +† OÂjp‘l‹P¨ñ<Ù‘ˆs?’xú}ýi´XWzµYÌrˆÔúsôõ;oÁ¼O#Œ,î±ñ|`D8§ãhdSË|„£ëÑŸ•µP2ôíŽë”íQøtÕîD(¢ˆMgc<ùm+¾aLc½§/Ë«›wSƒ×ËrW Ϊ‰8©á¬·ÞiÎ,øW’;õ››¥ +ƽ¿ù!…‹\}ßN)¬ÞM)›Ü‰tÊØIRq‘Cm«®ƒA´%ˆ¶•sÙ.)­lj!,%‘Iùah(󫑃5ÙS.²7rlMüx«x¶‰ÈZâb!´†<©+ “ÐO§Ä›Üwu†ëZžwLgL9é<‘[yPÌulS‘až© V¿a“zýþÊ8 MŠûݾÈßh†QƒrwÁýîˆÐ–¯ìÒò¹ +§ Ì‰’Á×Îd–Ë›‘"YLVÁ>Ùçh× +îñF¡ôT1Ýdû0Èo’"Ó¾a†áŸ À¼À–…°í4òÁ9’¯7ŸWóÅêé }«7™n ˆÌxõEƒ”nvA.6y‘6 ßÃ.ØìZyhG© Ã:èÀ‹E| @[9fãÇMvä•¿ß-?Þ,.ç˳Kã"†/’>–åGô £ô·Ùœaò·ÛTÖ²F„Ób/BKPiyZ%¸¯RYNJ•r૵†J9_2y•JH›˜Â/e‰<‡ªi¢TKËä‰Y®—¥×SG‘v\2yئc 3äy.È›Š~Vgè‰ÐŽ\‰‚ ¢Ž ³–íì0TCº¹¼àYVS· +fh,ç•;À] 0=ÙÁ7i’µ-´A&wø©0òK;R5H73•Ê6ÖbT£TëàÖ]bÁ$U§‰ØZ)·à¶H{ᬈf5ªžæÐ–¥ +qG£ƒ8gNSãáÎdȇt·¤|ƒmz Š=dûQ*¢ãVP‚Ǭ‰@_¢Ÿ=C= »%³@,òÈÏ~D€;Ȗ玣¢+¸‡<¥¬nF½hš[…<»™{e– kzÖ^|Ôçî¯<éóž²XÿqZK¹Þ‹M E´{J÷!äl¥Qí=©¼MíƒÐ(ÇÑBÞàbó¾rq6µá’ùÊÞD]¦—7GwOùr¹ºNºúR +sXžÈ\GïÚÕÕ³ŠE6Äd%Ó”ë ¥†¡ŸÕz²#·–P%K&…Õ´©Ýr Õ€%–…¡’pÞ´D]º¦[ŽN‰u¢f2GwOÆš®æY˜~v¦üÈuFÙZcã•ñ,"Ñû2pJºúKóàà w¾¼^/.¯>¯dÜ®¯_ðÞòªKv@AR—ÛÆ…rŸ¤yÖ‹×óíóoß5”¾æÎ)ßn!xìþPÄ€ q˜ó¿˜ËrXH½Òó±#ï ^È¥)ˆ"©|%h¾V]˜Á'Y•ŠØDþÅo©õ–êë7ÅØQ£òáÖ”¤î£»¹:̓ǧ{Ñyj—oà=(ýçžÛendstream +endobj +2398 0 obj << +/Type /Page +/Contents 2399 0 R +/Resources 2397 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2292 0 R +/Annots [ 2404 0 R 2405 0 R 2407 0 R 2408 0 R 2409 0 R 2410 0 R 2411 0 R 2413 0 R ] +>> endobj +2404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 421.5214 227.254 444.4901] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +2405 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.1194 421.5214 380.3883 444.4901] +/Subtype /Link +/A << /S /GoTo /D (a00043) >> +>> endobj +2407 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.808 302.734 388.7368 313.638] +/Subtype /Link +/A << /S /GoTo /D (a00140) >> +>> endobj +2408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [490.9727 302.734 513.9963 313.638] +/Subtype /Link +/A << /S /GoTo /D (a00144_g12b467f314489259dd718228d0827a51) >> +>> endobj +2409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 290.7789 143.0105 301.6828] +/Subtype /Link +/A << /S /GoTo /D (a00144_g12b467f314489259dd718228d0827a51) >> +>> endobj +2410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.9993 290.7789 209.4109 301.6828] +/Subtype /Link +/A << /S /GoTo /D (a00144_g41d37ea1e3bd24f7b51e9409aceaaa80) >> +>> endobj +2411 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.7857 290.7789 297.4 301.6828] +/Subtype /Link +/A << /S /GoTo /D (a00144_geb79c914cf137e6d27fd7583e5a66679) >> +>> endobj +2413 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [261.4335 197.9645 328.7205 208.8684] +/Subtype /Link +/A << /S /GoTo /D (a00144_g30e827f33eacff55ecb4d8fb5a11d5d1) >> +>> endobj +2400 0 obj << +/D [2398 0 R /XYZ 90 757.9346 null] +>> endobj +2401 0 obj << +/D [2398 0 R /XYZ 90 739.9346 null] +>> endobj +2374 0 obj << +/D [2398 0 R /XYZ 224.7534 640.6243 null] +>> endobj +2402 0 obj << +/D [2398 0 R /XYZ 90 623.0456 null] +>> endobj +2341 0 obj << +/D [2398 0 R /XYZ 238.8902 547.8099 null] +>> endobj +2403 0 obj << +/D [2398 0 R /XYZ 90 530.2312 null] +>> endobj +2314 0 obj << +/D [2398 0 R /XYZ 208.1261 381.0771 null] +>> endobj +2406 0 obj << +/D [2398 0 R /XYZ 90 363.4985 null] +>> endobj +2316 0 obj << +/D [2398 0 R /XYZ 233.9089 276.3076 null] +>> endobj +2412 0 obj << +/D [2398 0 R /XYZ 90 258.7289 null] +>> endobj +2342 0 obj << +/D [2398 0 R /XYZ 238.8902 171.5381 null] +>> endobj +2414 0 obj << +/D [2398 0 R /XYZ 90 153.9594 null] +>> endobj +2397 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2417 0 obj << +/Length 1471 +/Filter /FlateDecode +>> +stream +xÚÅXëoÛ6ÿî¿Bè¾È@­‘Ô;ߺ¼–"M³Ô:´E K´¥E¢\‰jšÿ~Ç—e)Šëa(† y<Ýï~÷°°…à[1²B?tb× ¬´š!käËÖÇ 8_ì3ü¶œýzAb+vâ€Ör-%Øñ &Ö2ûd&óñ‘}Z³Ï‘M×$¼¨™"Ö[±nÕf='¾]7jÓ]ÝÂ"£ÈŽüù—åÛÙùrgˆ¶Ów,Ìø:ûôYØûv†7Ž|ë6ÈÁqL¬jæ×lÊÙ‡Ù;9ê@¾0u]»S÷uG÷%° ÕuϨ¸#+ú&\=Ë‚Qµ"~¬/¿VOñJ©»b >qrG\¬XàÐ ˆçIéwtMÊRš)æÕÓî¥û”~F>‚üº'—EË)$,ë9:6䑚GQ;\ìÄqèí‚êãù#„ì_2um}‡?¯nﯯ¿¿>¿Ñ²Ü¡,â9®c)k™ÓƒôŠ + |›cߦ¥"å4ÉhcŽÙ†O;h™KØ6O®Äcálºn©ŽGÁx=bÞXÍ ¸e­9¸{Ä$a9°ÛiÂÔb¥™ÖuÇ2gNsí qZsžó9¶sp›MaÑ0ÊeHÈ/t´yÝ•ÙPž¶ÌÐ6c¯¿?Æ÷•3÷t!ûÃ5ØŠ1¶uÔ§T ­Ù;Ç(ÈF“>àžý €oÓü¡íª o›:¥m{åí¶,ø}ÝñmÇBº;@:9€ô÷——W7—?Fúå´©ÀK: +…öNYo6Û ]–Ò†'…vñ^>0~ †i]m‹Ò8¯`‡r$Ò9»kéº+­ª[^>©õZ" 2ªÒBÚ °ö§óVpu,•hÕh{ö"ÏòA;ADUXqÒl4ËÝ^­Ý±/öøŸ×ÛgRÅ•d¡«7&®cK\ˆ(( •zÃsX»ëzr h¯º–+WÈ8€¿Šj[Ò +b%Cé´…gÛ\±p㾤Ió‚Ó”wPjD¸3Z‰Nm¥Åƒ›z  ÿ^{}L&ßA63¨¨Ç¨pÏktl^×>Ü—“êÝ›wsÙËŠÛHPdWÉ÷¢ê*µa]µ’eÖÒlxò¢’9ËD=Z*’k#B&aŸ]p¸ÒrÊ›„µUÁU\åäˆ>æFZ3FSíH!|BV²ªr°‰ sœÕ|”ìyÂ6ÏDMýŒ*=*Åÿ ÞA4|øëfÿX@@î½p o4 %ŠêÔ~ˆ 8ÙÅe(€6F†<ÒÈèepä†~íh;;èé*ñM¼3 +%%öè<uYuƒª#Þ±¶KE, ¶O‚ä8ct¬í0òŽŸHþÏÈ6wÿeäÝBgsvvwúþæâLj»ÝU^3%&YÖ€QzÓ&4y7ùƒÇ(@;nÅÊÀ„W[ûJ‘¶Iú0Ç0ðVÊ&-N`€ãR¿ \‹¨ÅèðÈUið{«$ëZÕx((êG™¢H‡ÆïCã¿ZkJ ­ÚfoøcQ–Úž4Üy®µ²)xÓjËEãP9 ž½Óâ@Oq@Uõ$MÁÌÈ—Þ“ØÚM„¶‘雂Á¬¤¢;ã`Åæ£«Ów·J +MóZŽò¬w¾Ú« ‹ÕŠNãI ÔµÊwQôò¦®v9Îx˜‰|á(´0!NäFÑä4c˜û\ϬG±ƒ ²`¬ cÛšÓ“±RŒˆŠ‘ä ÖׄÚý¬Á(tBìú½´a9z>®›‡ÖL,åÓpÈ™yqõñüLt‘žÃqGÿrÙ%Õ,Hàx1ŠŽ.PX4££ +Ôø£†>N~;AàøÁú^!?ÀDð +vÉ~HjZd¾Gh#Äm/)£MÂûáO=ß™Å[Ñ::½1_j0:!î AºZ#¼ø}Fp;hXŒÏêïOúì÷€ø˜2áŸU%©Áendstream +endobj +2416 0 obj << +/Type /Page +/Contents 2417 0 R +/Resources 2415 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2425 0 R +/Annots [ 2421 0 R ] +>> endobj +2421 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [293.1521 514.0489 332.2253 524.9528] +/Subtype /Link +/A << /S /GoTo /D (a00153_gb58e1ceb7cb73ca2bcd73146b6c1b4e7) >> +>> endobj +2418 0 obj << +/D [2416 0 R /XYZ 90 757.9346 null] +>> endobj +2372 0 obj << +/D [2416 0 R /XYZ 319.1084 712.3476 null] +>> endobj +2419 0 obj << +/D [2416 0 R /XYZ 90 695.8178 null] +>> endobj +2370 0 obj << +/D [2416 0 R /XYZ 368.9116 591.1728 null] +>> endobj +2420 0 obj << +/D [2416 0 R /XYZ 90 574.643 null] +>> endobj +2345 0 obj << +/D [2416 0 R /XYZ 238.8902 487.6225 null] +>> endobj +2422 0 obj << +/D [2416 0 R /XYZ 90 471.0926 null] +>> endobj +2346 0 obj << +/D [2416 0 R /XYZ 207.0201 378.4029 null] +>> endobj +2423 0 obj << +/D [2416 0 R /XYZ 90 361.8731 null] +>> endobj +2315 0 obj << +/D [2416 0 R /XYZ 207.0201 257.2281 null] +>> endobj +2424 0 obj << +/D [2416 0 R /XYZ 90 240.6983 null] +>> endobj +2318 0 obj << +/D [2416 0 R /XYZ 238.8902 96.348 null] +>> endobj +2415 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2428 0 obj << +/Length 1383 +/Filter /FlateDecode +>> +stream +xÚ½XYoÓX~ϯˆ4cKÄs—رy+4@P 1ƒfU®}_á%x:¿~ÎÝÇ1iDѨRï~Öï,1ž"øÃÓMî èÜ›ÆùM·°ý|‚õñ Îgý OÂÉÏH0 œÀ#Þ4ÜH +v\‚É4L>X¾gψÈjWo`ê" ;HM®Ë¤Í˜š_–q›³¢‰^ö§ðådv|µX.õ°àúeòáš& ÞË rhà»Óo°@2Í'sBÍ"›¬'vtÔ|0¦‹é9êX.”vžƒ‰C Jb„õ[Â>"D +­Ô»Õ››·Ë‹õzyýäʈõ·Ð HÒI0)™;t(’¡=w­¶*…Ru»Û•U£›²RcÑ]¶1²˜¾P±¨®Y~›ÝÙžk9‚©`ƒŽGæT²‘Þ „ʵZõ^Êu¹#±6U´îa‰Ú7¯÷œkÇž¹$°Â”kZ5mÅjE¡b_Z®WÔŠ +=& oÊ"Êô2/ۢ鳦ÖÛ‹ëN쮫ìÔ”pŒ+-³DÍšÌN1:TnmðÛØÄ™*µ÷½ŠË„©YÍÿÕ3©šx½ÛUåwžG “×áù!Íí®aÂsßcè‡=â#º >¬$6j”rJ(D¹™I¹Ä,ª—Z¾»1T寋ÈEqYÄnÁQ‰¾y·ïáÛwÏÖ«–p;ÃÀô]a1õÈÂYPŸ±°2—fý[Ç¡åBhÑÀñ|Ï•–yU6ìñ+Fè|šmwk„o?þ0‚SLÝ=5ÁøŒÐ:pSQê )‹„©¿rsÐa£‚P„ ä5#žCi ”¼TIƒËÔ§ü©‰eܤìz‡xO²½·Ë]㤎N/Áaz¡µÂkq*c=]®þZÞ¼_½º|mÃæûSYK‘ Ó#L7J¾ÚصXÕðÚ€­b1ã”úèwÛu-mÒo¼HJqöm$‹Í%ÛuZ¶"ü ñ¬[¦ÆZº +&™~,ëÜaÎ#XR$³‡ØV‰WJn˜I¹ûG‡±$8Ä’ µ/±°éŠ4‘ñ8Ò~íݨd3Â@N‰Y­¯ð".s^lÕ*‰šèÑXê0¥ åÛtÕ”,<ß„3PË(ðzä•â•L{ApV3Èßñç%åS¼_cÿŒí9‚jŠ}ëµæ}Fñ5VáB Q•H›**êœ×u§ZÃsV¶Z¿XT-iÞ»¡³k³ZÔ„£©r)#Ç`¹ŸMnµ‚ÿ/àHf¯óK> endobj +2429 0 obj << +/D [2427 0 R /XYZ 90 757.9346 null] +>> endobj +2430 0 obj << +/D [2427 0 R /XYZ 90 739.9346 null] +>> endobj +2348 0 obj << +/D [2427 0 R /XYZ 238.8902 601.3918 null] +>> endobj +2431 0 obj << +/D [2427 0 R /XYZ 90 584.8893 null] +>> endobj +2344 0 obj << +/D [2427 0 R /XYZ 238.8902 497.8687 null] +>> endobj +2432 0 obj << +/D [2427 0 R /XYZ 90 481.3661 null] +>> endobj +2369 0 obj << +/D [2427 0 R /XYZ 207.0201 388.6763 null] +>> endobj +2433 0 obj << +/D [2427 0 R /XYZ 90 372.1738 null] +>> endobj +2347 0 obj << +/D [2427 0 R /XYZ 238.8902 297.1084 null] +>> endobj +2434 0 obj << +/D [2427 0 R /XYZ 90 280.6058 null] +>> endobj +2349 0 obj << +/D [2427 0 R /XYZ 238.8902 205.5404 null] +>> endobj +2435 0 obj << +/D [2427 0 R /XYZ 90 189.0378 null] +>> endobj +2317 0 obj << +/D [2427 0 R /XYZ 207.0201 96.348 null] +>> endobj +2426 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2438 0 obj << +/Length 1725 +/Filter /FlateDecode +>> +stream +xÚµY]“Ú6}çW0Ó˜ ª>,YÊ[»›¦I›NšeŸ’Ìž€Mdÿ}¯°dŒ%,§ÙÎ>¬¯Ï¹_º: 2ÆðGÆ +c#Å"1^îGx¼_Žˆy<ƒç³¶Á¯óÑÏ¿Q5VH *Æóõ AÄ)¡ãùêýD B§3Êñä&Ï>`L7U±(Ó<«?ÌúúX߬§”Oò¢¾©^½… K9‘ñôãüõèżqÄøÉ™ ÚFï?âñ +ü}=ˆ)ÉÇ_á#¢ïGeöf7ºýÝàÔN/øÂå„ ‰—Âm|ÁÄL0Æ“ŸV‰:Kê î_½}˜Ïÿ¬oD¤Ã<ÖƒÓ±HÕxó­yó” øß¼ýs\¦{ó¸Ìëÿ»TçðË”ð sb²¼¾9,–Ÿ§O’Òdþ˜de}õéñœ~BÈiµW$F‚FÌx•Ú·yµ[Õ×Y^ì»Ý£½³ˆÆÅåv‘m’U0:ÞÖYJϱ(m@6w$êD£_Ù™‡Uz€VB[dRª.SÊb<&%b×Ktûöáæ÷7ÜÝ¿¹ë+R8ŸJðj³Ù%&+©ñplìÉòó±Ú{²fÓSó‰]AÔm|É&2sIPL„ô¶­5šµ­ÜÖ• +aÌK1$Lÿþ•—Éó.)ÁÅŒ’~ÖÆÊCÛNÁ1> endobj +2445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.2945 407.1106 229.0877 417.9898] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 333.1135 139.4144 356.0822] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +2447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4032 333.1135 175.6584 356.0822] +/Subtype /Link +/A << /S /GoTo /D (a00049) >> +>> endobj +2448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.6472 333.1135 211.2546 356.0822] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +2449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.2434 333.1135 247.4088 356.0822] +/Subtype /Link +/A << /S /GoTo /D (a00047) >> +>> endobj +2450 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [250.3976 333.1135 278.6812 356.0822] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +2451 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [281.6699 333.1135 310.5115 356.0822] +/Subtype /Link +/A << /S /GoTo /D (a00039) >> +>> endobj +2452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [313.5003 333.1135 349.5247 356.0822] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +2453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.3901 333.1135 412.6078 356.0822] +/Subtype /Link +/A << /S /GoTo /D (a00050) >> +>> endobj +2455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.3132 280.0189 219.125 290.8981] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +2456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 206.0218 139.4144 228.9905] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +2457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4032 206.0218 175.6584 228.9905] +/Subtype /Link +/A << /S /GoTo /D (a00049) >> +>> endobj +2458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.6472 206.0218 211.2546 228.9905] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +2459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [214.2434 206.0218 243.0849 228.9905] +/Subtype /Link +/A << /S /GoTo /D (a00039) >> +>> endobj +2460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [246.0737 206.0218 282.0981 228.9905] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +2461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.0869 206.0218 321.6693 228.9905] +/Subtype /Link +/A << /S /GoTo /D (a00045) >> +>> endobj +2462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.5347 206.0218 384.7524 228.9905] +/Subtype /Link +/A << /S /GoTo /D (a00050) >> +>> endobj +2464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.7012 152.9273 279.1888 163.8064] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +2439 0 obj << +/D [2437 0 R /XYZ 90 757.9346 null] +>> endobj +2440 0 obj << +/D [2437 0 R /XYZ 90 739.9346 null] +>> endobj +2319 0 obj << +/D [2437 0 R /XYZ 238.8902 670.3741 null] +>> endobj +2441 0 obj << +/D [2437 0 R /XYZ 90 654.4845 null] +>> endobj +2343 0 obj << +/D [2437 0 R /XYZ 238.8902 558.783 null] +>> endobj +2442 0 obj << +/D [2437 0 R /XYZ 90 542.8934 null] +>> endobj +2443 0 obj << +/D [2437 0 R /XYZ 90 451.9385 null] +>> endobj +1385 0 obj << +/D [2437 0 R /XYZ 90 425.3268 null] +>> endobj +2444 0 obj << +/D [2437 0 R /XYZ 90 425.3268 null] +>> endobj +1321 0 obj << +/D [2437 0 R /XYZ 242.1978 314.3947 null] +>> endobj +2454 0 obj << +/D [2437 0 R /XYZ 90 298.5051 null] +>> endobj +2313 0 obj << +/D [2437 0 R /XYZ 242.1978 187.303 null] +>> endobj +2463 0 obj << +/D [2437 0 R /XYZ 90 171.4134 null] +>> endobj +2395 0 obj << +/D [2437 0 R /XYZ 242.1978 96.348 null] +>> endobj +2436 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2472 0 obj << +/Length 1155 +/Filter /FlateDecode +>> +stream +xÚÍXKÛ6¾ûWèh1Ë7©=y  H[ßÒ`á•d[€,9zd³ÿ¾C‘”õZËA/¦È3ß|$gD‘Ã!”P(d\Ñy…ƒ#tZ7¼…ñmðûnõÛG! +%•ÁîÐZ Jh°‹¿¬µÞl©Æ +¯›?>CSà5AØ6þ,â&Klû}5ç$¯÷uZ䛯»ÇÕ‡]ç×ÑLãõÛêËWÄ@ïq… µ^à#†48¯8eþ![ý³ú«³cÚ sÑ Âî £²ÑID(bˆo¶c¼®_/IœÆô‰”ˆ)ƺ©­s3Räï¾íá§T&V ¡&½<ÕÑåi¹T eòTÉP®‚yC2#%:Д©’”êÖûîäVÓa[ÅÁõø!`–¥‘]æ¶£åéAûÚ¶ÒÊõöÿ9ñà¢Lb‡É¯¦GA2 +›L`}¥w[ò¿íO˜<µëEŠ|²m™Ðˆ0"G,FZw¨%ß›Q:ô]ÕeÕM™ ãVN9Ô–(hpæÆ ÚTÍ>Ë^G*Û}ûà•õªï½èƇmŸŠ,NóãòZ¦ù¡(Ïí £ÂD«@ +8=ZªY]ãõñ¨£* eS®ù/ZB;z÷–Ðþ„%töb ²x³„.øö%tà{©„ò_¹„ +àˆ Dy³„öQo—PA5ô)~g ½åú§Kè”ál í`†b|Š.Ñ\ …0àr[›µäzb­—@¹·ñ³ù“«·óg™TEö}#źŸE A¡Ô§Q(nº ñWM]OnUÓ„LÍkSHz–q¶¾o0LÝŽ6G4+Žž¯ÀÑi_Z›°Ò=Á(E”ጛ³( E)ľ…œ«ã 7"‘Ä6½A¨¿:[Â!‹̇|.ÓÜi^4õà$v×Ð.–sRUû£;ýxîÔ3¥×‡NXótnªÚ´Â6­šžÔœ£µÉ¦ãùÕþ·i»ã®»f–MÓ¦·©çÁ0#„˜wóhÞQZ¬gAÖo£1—S{‹ +³hb”vêÞšP}p~ÝmàÃDv;%¤ ÍÝ "\Í~À°*D +ù¿.èí SÜz%3xlËLä’vTL Ÿ> endobj +2475 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.377 726.9533 248.7336 737.8324] +/Subtype /Link +/A << /S /GoTo /D (a00085) >> +>> endobj +2476 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.0545 702.4697 359.1278 713.3737] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2477 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 649.2336 135.5587 672.2023] +/Subtype /Link +/A << /S /GoTo /D (a00039) >> +>> endobj +2478 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5475 649.2336 175.1299 672.2023] +/Subtype /Link +/A << /S /GoTo /D (a00045) >> +>> endobj +2479 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.9953 649.2336 243.1941 672.2023] +/Subtype /Link +/A << /S /GoTo /D (a00041) >> +>> endobj +2481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.377 591.5789 252.071 602.458] +/Subtype /Link +/A << /S /GoTo /D (a00153_ga92afb113e122f860392bfbd385f842e) >> +>> endobj +2482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.0545 567.0953 359.1278 577.9993] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +2483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 513.8592 139.9724 536.8279] +/Subtype /Link +/A << /S /GoTo /D (a00049) >> +>> endobj +2473 0 obj << +/D [2471 0 R /XYZ 90 757.9346 null] +>> endobj +2474 0 obj << +/D [2471 0 R /XYZ 90 739.9346 null] +>> endobj +2396 0 obj << +/D [2471 0 R /XYZ 227.8216 626.7922 null] +>> endobj +2480 0 obj << +/D [2471 0 R /XYZ 90 610.0651 null] +>> endobj +2484 0 obj << +/D [2471 0 R /XYZ 90 476.7479 null] +>> endobj +2373 0 obj << +/D [2471 0 R /XYZ 90 450.3624 null] +>> endobj +2485 0 obj << +/D [2471 0 R /XYZ 90 450.3624 null] +>> endobj +2470 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2489 0 obj << +/Length 2005 +/Filter /FlateDecode +>> +stream +xÚÛ’Û¶îÝ_á·Ê3k’ºXê[Ó$ͦi›“º/§íìÈmk"K>ºÄÝ~}ÔÅÖîf:ž±H@\€r)à'—±Xn‚{~¸LO ±<ø‡…äå5¬¯Ç¯¶‹ÿ¼Uñ2vãP…ËíÞP¥(©–Ûìw't¥·Z«@8ÝýGl¿çA{¬W2rªîp³žq±÷ŽQÿ ©‰¾sFOC¶4ï7ÖKj<l‘„OQÃÁ'»¢}e®5 ë»y}rÐõ2¢¬Œ8´U4º3Ûå*Γ3Øô\çIË€R³ÖŸ Ωë½9XMôΑs%Љ1äÇ„Ü'² ç»2âTû²^3SòcìO–1cÊèã)aÕ÷" cÒŠRÁ5/)0'Þó{¬—øBQ‹0¼â+„*ô gÊ_sÆ¥úÀ8ŸÆ2Xü—d¸¡‹2ôáoÙ7’P =«‚ÐsÃÀW ëgF] ÂM"]åǃ¤XF ièI¡›8Zöh(éO#—RËè&Æë kw³Û¬×Þ8ëå¶6¸TS'M¾Tyvý}‹“ïVÝ·¶èóƒiÑ—³oÅ$ãôqã]¤(]Žñ•Za÷ÕêBàþ¾–•7o»ÒfsqÅ1ÂÓq4Fx&Žz´ãèYŽC½À×ÆÑ„/å30ÛM$¶”Áïg"‰ñ_’â†.GÒƒqÇðBô†+i”ëyAô¼&z¬dPB¹^É€™Éj䜧üND®ûÁWúÝû¹hµh(É»¤Ìl´öu™AªC ‡t÷„Œ^ŒM`ð•±1Æž (à ;Šü¡ËRÜeÙ@á.«J»¡#²©j¦Ï’#J}ÇöÅ$9{…Üø„’•äÄJO5sòemN4yÝãl9%‡Î~tJl°š3ômf-ÀÊ@Ç´ÃiIcöЗ/FSN=ìИݞVìêÆ=õ½Ð÷Ñuš‚‡e1X€'“îšž+S õý…5‡:³ºº.†ìÉ rÚÀ¥{\äs½MK3œ› +¾ }ö]Q¬¹lÇ9ÕÀ@`Ú•âFþ^ò¢ ÑŽYpQ‰»¸| —NŒ1­ó‘}É Û:)è÷ZÍu½>'5TdТ…ƒ­HY»nâ±]#HuǪ+2Z1•ÀRè㻓ÑLßê„qLÙd€$…ž§ qFm^ž2¡¬·LÀ:öH”;Dß8£íˆÂa=kÁ3Sšï ;ëÙHÕóœ#†OÑyH<0¸4€'. óœ·%MAŸñÞŠ€;f`üæ­å8õ{Üø=’,³+QÎÉcQ%Ù˜³7欘³‡œgá‚-ÁÔ|Ç@Ý>´Ng8®i#LCg‹˜B—[ïÛ®©¯pžºS¸Xâ¢iuT0Ùö¢¯¨FÉCa»> endobj +2493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 503.0404 171.8124 513.9444] +/Subtype /Link +/A << /S /GoTo /D (a00134) >> +>> endobj +2495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 420.2854 201.2321 431.1893] +/Subtype /Link +/A << /S /GoTo /D (a00154_gb4b17aaf20d630f30919b19937b966a3) >> +>> endobj +2490 0 obj << +/D [2488 0 R /XYZ 90 757.9346 null] +>> endobj +1776 0 obj << +/D [2488 0 R /XYZ 90 739.9346 null] +>> endobj +130 0 obj << +/D [2488 0 R /XYZ 90 739.9346 null] +>> endobj +2491 0 obj << +/D [2488 0 R /XYZ 90 716.7484 null] +>> endobj +2492 0 obj << +/D [2488 0 R /XYZ 90 521.9904 null] +>> endobj +2494 0 obj << +/D [2488 0 R /XYZ 90 439.2353 null] +>> endobj +2496 0 obj << +/D [2488 0 R /XYZ 90 382.9653 null] +>> endobj +2497 0 obj << +/D [2488 0 R /XYZ 90 356.4803 null] +>> endobj +2498 0 obj << +/D [2488 0 R /XYZ 90 356.4803 null] +>> endobj +2487 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2501 0 obj << +/Length 1890 +/Filter /FlateDecode +>> +stream +xÚ­Z[oÛ6~÷¯06 °ÌñN1ź&mS¤ÁÖ¸ØC[Ž­Ä;³äfEÑÿ¾C‰”)K"U¬SäÑùÎå;$E‰ 1ü‘¡ÆC%ÒŒËáâa€‡÷Ðýz@ìðÆ'¾ÀÓÁo¯¨j¤%•Ãé]¡A$(¡ÃéòãHãñ„&XáÑáòOh +<"—w»åa“–íóÝâðnóy¾ÞmÇŸ§oÓ +ך%˜$õŸÁÇÏx¸óÞ0b:Ã'¸ÀˆhM‡N™»Ø nUzÊâ†6ïaí‡:ÿ(¸«J÷$"|Íò Jѹ² ÊU”ÚØ1¸æjžŸ ?îÖ[Û÷´J}Íe˜¤B˜ekaÚ´s·ìy<š[¦B¬PGQ1(£Ä–æ+(¢¬e&J!†UÒ9Áùå P#!–ˆ³„õ°O”ŠS,‚M‰ F¬¤b¸À~¥<ÁÆoÒ2ЄP}Šl†ö÷Væ½oƒ“ÙÐÐ[dnV 8GJsöÁ¨1|ãÜ—i‰“Bæà‰1ÉŽ&B…$`¢ä…‰0¯b¥“a%šQ3g%ŠPʘë°IÖ"Bƒ„wŠ%ˆ &b„rbqBy +C„ +ãV„ªáFUCîC¨° ½%¡&ÙÓ:_¬Zx¥ Â)SáH Dý ¯(Ckã•3–^ºµÒ›«ŠÙ~7ÁÅV^·Ä» ŸÇDŒVŸ°ÀðOl?h7Ýd +åO!+× ³u +“µ‹’ÕW kבµŽ&k¹Y#64ôZ²Î—Ëýf~›n²Â&À¡d8 A‰òÇËØ™µ/LØJì§¶ÚFþrUx_^¸eúË|sH³_ìî2ÃÆ«Ø¯ÔAï‹N^sÅÔ’õ ‡']mÜ»à6gÚ”.)"qžöl[·ÜìF9'ÝEâ „ŠÄ‰Å‹$„èI·*÷×¥õ´¹FK¤¨"'àÝuâäcf4ô3f³«—³›¿§—/ßÌÞÌf§ÆPغ)*U$ÜJŧ1Ì ¤¨ŠeȉÅ3ä) e(Œ[eÈÇí‘¡xŸ …Íhè-6I/g—×—Óæ O˜B$‘8©tC[9‘ œy+^ùó{ùƒŸ·”(Óð$Ä ë$€/ @%%@ñH€®#@ 7N€:xDÌhèµxqóáÝE£81‡šL’p *©xS[Š àIç7»:ÁRd©qÖF xäЉî~ÀóBÔpbqj„=j„q+jø¸=¨QïC° ½–7-SEDp €“Š!7´E§XT.¯/f³ç§Äp­üa“àN~x!~8±8?Bˆ?¸?|Üü¨÷áGØŒ†^Ë‹ëó¶¥CxÀIÅÚZøñ½-á‚"œ¨î|ÇCé¶Rñlà¼dA«\{ =Rí#÷ÉtІS­}öAß«-B÷TWt¸þpuÕ–vØîÐÔwO ”x'Ï|ÑK}·Ê½Û#ù5ð>Ù›ÑÐÛs‹Š·E‚7µÕIÐ’l*0§û‘Í%ۉœBô’Æ­’íãöHv ¼O²Ãf4ôöYôƒ8.úa䆶–r_îjû?3úÍ­óÅÁ "€ã>"ŒÜÐÖ˜\N&ºRí½ašŽ}}L—é]Û)±w¯?¾@€•X”AÄ#?"¸Ž5ܼô³¬Ã6[ßoÝq`¶Úíóæz@]KrbS'm*ùˆuM½å!ì¬iekxŠG…Y©è‰å qªc H%Ï–§0”­0n•-·–­/cŠG»µ}G ï†S̽u‡ €µ½pQ‚èk»ËßÉÇìnèíÊ£9A—æp</m…ÀŠhBZ³m^¥)Ôÿúˆ¤ C·uü³f‰´2¯ï`)ƒÍ÷"ŠÀ¯’…k¯ÓmºŸç§gèï\ã­yós°„Ú_|FÙµßËPŒ¥=NS1rl4?¬¹ýê>ªù÷ë}ÚøœÆ|çâLó¢ôàÏÔ®endstream +endobj +2500 0 obj << +/Type /Page +/Contents 2501 0 R +/Resources 2499 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2425 0 R +/Annots [ 2505 0 R 2506 0 R 2507 0 R 2510 0 R 2512 0 R 2514 0 R 2516 0 R 2518 0 R 2519 0 R 2520 0 R 2521 0 R 2522 0 R 2525 0 R 2527 0 R ] +>> endobj +2505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 576.2119 145.7904 585.0586] +/Subtype /Link +/A << /S /GoTo /D (a00125) >> +>> endobj +2506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 537.3577 175.12 546.2043] +/Subtype /Link +/A << /S /GoTo /D (a00124) >> +>> endobj +2507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 498.5034 190.0538 507.35] +/Subtype /Link +/A << /S /GoTo /D (a00123) >> +>> endobj +2510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 414.6673 235.723 424.595] +/Subtype /Link +/A << /S /GoTo /D (a00155_g44311ecc30759ca38b4069182247bdae) >> +>> endobj +2512 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 401.1132 185.352 411.6435] +/Subtype /Link +/A << /S /GoTo /D (a00155_g2c1bb4fa6d7a6ff951a41c73fc721109) >> +>> endobj +2514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 388.1618 205.845 398.6921] +/Subtype /Link +/A << /S /GoTo /D (a00155_g1ec8b8f4710dce1fa7fb87d3a31541ae) >> +>> endobj +2516 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 375.2103 183.1503 385.7407] +/Subtype /Link +/A << /S /GoTo /D (a00155_gd8eec328a4868d767f0c00c8d1c6cfc1) >> +>> endobj +2518 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 362.2589 185.91 372.7892] +/Subtype /Link +/A << /S /GoTo /D (a00155_gca51ceb2f5d855dfde55bcedf8d3b92d) >> +>> endobj +2519 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 349.3075 185.352 359.8378] +/Subtype /Link +/A << /S /GoTo /D (a00155_g2c1bb4fa6d7a6ff951a41c73fc721109) >> +>> endobj +2520 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 336.356 205.845 346.8864] +/Subtype /Link +/A << /S /GoTo /D (a00155_g1ec8b8f4710dce1fa7fb87d3a31541ae) >> +>> endobj +2521 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 323.4046 183.1503 333.9349] +/Subtype /Link +/A << /S /GoTo /D (a00155_gd8eec328a4868d767f0c00c8d1c6cfc1) >> +>> endobj +2522 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 310.4532 185.91 320.9835] +/Subtype /Link +/A << /S /GoTo /D (a00155_gca51ceb2f5d855dfde55bcedf8d3b92d) >> +>> endobj +2525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.1599 253.2274 224.0961 264.1313] +/Subtype /Link +/A << /S /GoTo /D (a00155_g3983e0c026396d5c4506779d770007ba) >> +>> endobj +2527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.7556 240.276 190.6918 251.1799] +/Subtype /Link +/A << /S /GoTo /D (a00155_g2bdc4b7b4038454a79f1b2a94a6d2a98) >> +>> endobj +2502 0 obj << +/D [2500 0 R /XYZ 90 757.9346 null] +>> endobj +1165 0 obj << +/D [2500 0 R /XYZ 90 739.9346 null] +>> endobj +134 0 obj << +/D [2500 0 R /XYZ 90 739.9346 null] +>> endobj +2503 0 obj << +/D [2500 0 R /XYZ 90 719.4886 null] +>> endobj +2504 0 obj << +/D [2500 0 R /XYZ 90 593.1046 null] +>> endobj +2508 0 obj << +/D [2500 0 R /XYZ 90 432.641 null] +>> endobj +2509 0 obj << +/D [2500 0 R /XYZ 90 432.641 null] +>> endobj +2511 0 obj << +/D [2500 0 R /XYZ 90 418.6523 null] +>> endobj +2513 0 obj << +/D [2500 0 R /XYZ 90 405.0983 null] +>> endobj +2515 0 obj << +/D [2500 0 R /XYZ 90 392.1468 null] +>> endobj +2517 0 obj << +/D [2500 0 R /XYZ 90 379.1954 null] +>> endobj +2523 0 obj << +/D [2500 0 R /XYZ 90 269.8939 null] +>> endobj +2524 0 obj << +/D [2500 0 R /XYZ 90 269.8939 null] +>> endobj +2526 0 obj << +/D [2500 0 R /XYZ 90 257.2125 null] +>> endobj +2499 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2530 0 obj << +/Length 1914 +/Filter /FlateDecode +>> +stream +xÚ­YÛŽÛ6}÷Wy²,Ëû%}j»M-Údß’ PlíZ¨/[YÞ&ß!EÑ”d“ +øÁºÍ Gg‡"™cø‘¹Ás%2ŒËùj7Ãó¸üjFüí¸~½›ýô’š¹AFR9¿»w$A‚:¿[¿_HDÄò† +¼¸[½¨veÝžn«ÏuQ]~¼{3ç„!Ì'öCìÕÙïwÁ±K0I¬Ûgï?âùâ{3È-æÿÁ FÄ:ßÍ8eÝÉvönöw°ÓÞp\ž ìòøGp…v¤0^`œ`kƒ #„³Ydâ2Ø@Ä[¹-›¢Ú–ëÖÈmy\ÕÕcSöÞ‹’ v¨@’HáìÜmJû”\4]"Dá®?Ö‡%‹§j]ÛÛ÷§ýÊ?¶€ûƒìX6MµxnÏÔ¢.ýy‹*öë×›¢>ßp~þ!ŠŒ®6å꟮îÛ«E³eŒ*ä +Fµ)Žm.Jû—Ǫ.×(’”3üeßâŠÇÇmµ*\ÎÜ…Ý騴GÏvÅþTl·_Ÿµç.¢ö° þï®L{¼)–/žlå(˜Ÿ=~Syt÷¿?x·ëÃÞ?VœšÃB[Ù –R,#áíHlpxÆ›„ÿu¹Úµcœþjá¹!ãBÔHJ¡|I›ú´jb³c6)([†¢}}ÖøvëV«òè=6ÿï(w9Ö]±ö7?[þiã^5œ>ª}Ó¡G–Âmb -¶¥ìs¢õ&|úb¥Ða¢Õ\(Ž(5äbw ›5Ö2mYš ª=Ëþ<4å‹¡W‚)RŒ’´Û€ºà7~+¤gkçê6êœjU7œœŽ®ª- ƒ)H˜¡˜"´·êyÅð™XÇvm¬¿m®®¢‡ñH(3&±€ÊE¡¬œjÓ¢¥–ZìÊâxª£ì¡å dñÚ²ðiIAƒ¶>sÇÍá´]·ÇŸýÇÇrU}À˜–þFµ?§Ù€ÂAQ{ÂJ†¸¼OXx7^Ñ]-ˆŽïVƒ|®¢)£Ó…á¼aEÂã†c˜bykû%LÇ 3&7@s }m&—X(gšŸíXg(cöÃST°´Ç€ÊùµŒÂPñ}¿ÿíˆÕ„:P3ô|•ÕŸ‹ad·¯:›Q B#¬9I§@`È€­û%Mº/…ô7\)D9!TçB•Ü… +ÍVFÏ̉… ³ß‹Ø Ëw0¡• Îþ¦O-¹ ¦] \JD5‘é€}¼ÐÌ(©´ƒ4@§¥r´ë`yÚES´Kû ´ëùÍЮçy +íÒ1Œìöi·Óšbj_P*pIN¿•v f+ÁXŽvl +íªÝã¶Ü•ûÆug×éF R†O 4B‡†ý,š@9¦ ¢ +·ry[4EÍ;×jÛ·_TP&¸]Éð«TŽ *X–ÊIg*güvTîùõ-àˆÊº>¦žTöø\ #»g*CÀ]Éezð¦ULå7’˜1 h’áp‡êzï®û_B®‹"ƒµ—Æ”LŒ$B_f)…¶”*¥ÛI=,ÌÆ´¤0Ùz]`£û Rv¨,'SîΔL;í;}²kªCµSÀ„ˆ¾ã#=<ÂÐjàã'XÜŽb€†Ò¢Óƒï@ÏГrMûž?`/W$…U§ŠN~€§ƒY½ZŽ”B¥ ˜¿SC ‘W(ßÈ+Þp-CÇìÂò^&̯>›çQsüÉÆùɯ¥«¨i‡$’kÕ ­Ô´–Óª3F'„"ÀlŒïJR1Y2`i"`Ôé£ìÒ s _¦Î;X¾Ð#ƒ©JOû ¥ûÍ×zÏ÷”bOG1²{.w÷5k\ðÆ®ÍU& *ç^SX†26Hþõš'ÐøIM¦¦!à3qŒí^/{÷ERëtjì¸_øŒ!©Í}‰Êï>þ6©¢&Æ­C&Nþ1:QÔfÝ¿uäè¯Ð›sGû_ÕlwÅ®Œ¥©Ø^-3<ƒ +ü!åO$tX"þN}±ü,[þ±ÁDùgüvåßó›-ÿ¾ï 埉bd·Wþö£õ(x7š€4§ÓСrhÁlþ„… Sð™8Æv   „N'  ÆŽJ©¤&`ÂÔŸáÖzt¢Dè”t0/ŽW%à¾^r±8솟ñNu½dj‹Ûö‚ûÊÝ ÃÙJò; þB3Á~Œ@@ó…¥Ê-N,/‘Á”@¤ýˆýÚT ÝR5¬äÀíumèð¹FvÏÚíêŒõf4[É$xP.»¡Àµä>¡0‰Ƨ¦"à3qŒí&ÔA B9I? ÆŽê „ ð½êÿ «‰âp§´Á£Ü®Æ¦\Ù‰l°cXŒ$"Ú²¸å“S†õÕº‡„qM&•=dŒb|qCÖˆÝôûž=r§!Ñ·?XºIdÓÝ8´\µ¢þªÜ—uÑtÝ®ëÝÁ'B¨ÿÇ/({Aq{’^]íÊîàóxzý—G#Üß=¹=|ùúPî‡ù´ø]hQ~þH9¼endstream +endobj +2529 0 obj << +/Type /Page +/Contents 2530 0 R +/Resources 2528 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2549 0 R +/Annots [ 2534 0 R 2536 0 R 2537 0 R 2539 0 R 2541 0 R 2542 0 R 2543 0 R 2544 0 R 2545 0 R 2546 0 R 2547 0 R 2548 0 R ] +>> endobj +2534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.9242 571.076 269.2362 594.0447] +/Subtype /Link +/A << /S /GoTo /D (a00157) >> +>> endobj +2536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 493.9051 159.0804 502.7518] +/Subtype /Link +/A << /S /GoTo /D (a00130) >> +>> endobj +2537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 449.4179 158.5224 458.2645] +/Subtype /Link +/A << /S /GoTo /D (a00129) >> +>> endobj +2539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 353.4255 161.5608 362.2722] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +2541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 255.7495 172.9881 266.2798] +/Subtype /Link +/A << /S /GoTo /D (a00156_g6614d96fdfcd95c95ec6e6f63071ff51) >> +>> endobj +2542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.4309 255.7495 224.4542 266.2798] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +2543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 211.2623 180.7289 221.7926] +/Subtype /Link +/A << /S /GoTo /D (a00156_gedaf3e48c2b04229b85455fb948468d6) >> +>> endobj +2544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.1718 211.2623 232.195 221.7926] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +2545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 166.7751 186.816 177.3054] +/Subtype /Link +/A << /S /GoTo /D (a00156_gcb807bd57e5489b386b876af5c1f163a) >> +>> endobj +2546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.2588 166.7751 238.2821 177.3054] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +2547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.9214 121.9143 184.6543 132.8182] +/Subtype /Link +/A << /S /GoTo /D (a00156_g6d71dececfce707c668e6257aad5906e) >> +>> endobj +2548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.0971 121.9143 236.1204 132.8182] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +2531 0 obj << +/D [2529 0 R /XYZ 90 757.9346 null] +>> endobj +2532 0 obj << +/D [2529 0 R /XYZ 90 739.9346 null] +>> endobj +138 0 obj << +/D [2529 0 R /XYZ 90 739.9346 null] +>> endobj +2533 0 obj << +/D [2529 0 R /XYZ 90 715.481 null] +>> endobj +2535 0 obj << +/D [2529 0 R /XYZ 90 513.6142 null] +>> endobj +2538 0 obj << +/D [2529 0 R /XYZ 90 373.1347 null] +>> endobj +2540 0 obj << +/D [2529 0 R /XYZ 90 277.1423 null] +>> endobj +2528 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F26 485 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2557 0 obj << +/Length 2012 +/Filter /FlateDecode +>> +stream +xÚµZK“Û6 ¾ûWøhÏD,Ÿ"™[_É43餛½¥ŒcÓ»šx%W–³I}A‘Ô‹zd“69˜6? ‚¤%k ÿÉZãµiÆÓõþa…×wðóËñÓ Ì']ÀO·«^P½ÖH§4]ßk )A‚º¾=¼ÛhºM¨Âo®¿½¡À‚°¼.דqã_ŠýõÁäծʊ|û×í«Õ¯·^o–`)±Zÿ^½û ¯`Þ«FL+±~„/­éúaÅ) _N«·«?9n¢^0¶;AØøöAZöGa»Òm/ED Ø"Áo^\ó}mþøŽžWRŽ×]IˆxYY^91Uö`Ê÷æó9+·DmÌÁýü'øR•×}5teI%× ”RªÜVíLyç!7MxÒÅÇq¤Z›kÛ"ý)C˜èt`ÀÀ× *ÖKxWo* ˜öÿ‰1s.…¨´`‰8Ä;ÛF\N‘Lµðð ñÖÁ$D $‘!<¤Fÿ|oöë³£ûÜuä†÷»‹˜-2s@V‡ 6‘`?çµ´ÛûÌ#½œ©Ì¥º|‹Íý 4ÕµÌ= ²Ä²ÂK8n €OÿóÁœM~Èò;òÆdÁ” äðõ‚†?a)‘R8š?çJº¨8½”FRi1dµ—ÞÔf–»S™òò|¨²IFɨ‘! :¶¤—CK$ ­Ô&›zÊ F\±ùÍÐÈæ»)Gàäó”³¾ÊóÏ”‚úªðŸ÷¦›š 6Q뚸t@3aÁ ŽvGáÆ&—M½|&&sºÛPDÊÙX$Ê*ÿ½È“LYôÉÀ“Çä™û¥PÀÊò1»˜Éìʲ˜¨b­;¨i7ŠT"Š¥®wòëçÝÃùdæ|8£š#­ Pâ…êÞøpÄÂq_˜5ñp¿?ïÑ>2)ĉš70iPKª#iVõ³H)‡ÔZ ”Nï<à—ÔGr­z—3u€’‡]–ŸŠâœ„z†R‚ÙB‚xÒÅÇE ’Ú¤×{pA8tQ!‚¬dº¼¾1ÃBP 6ØYHKÚ7"DmÎ%„*8Úžn_¤¸_˜¸ÆÒeLMô¶PÁT]‚•.Jö‡~lì”M;ã!2”å½a}»j Χ„ýí´»ø½ž%œYÛKs,J• +l†õN«ì¤]ù˜¼UûÝõbZÃBê†ö¹)=2ûÁ4õïC(¸…5Æ¥XÙ_1¯ù)ûh3ÒŒ°÷p +À[MôÚ¬IšÇ$Ô¥d–æuQÓ4Á@é4}R3fÀ sŽ,obØl3»ù¦‰‰7?ÚÄôT>¡‰±·ëdt8&¢ZÌ.j&:‚AU÷•ô­ñ6@7\ÌgFÿ“™xlæ(o`mi³™ Udª¼‘Ô"È»ywaDô ³Ï9TºàSœ"P—.ø”(õ•MWè÷»3²pÜö-ôÈ$l9kxÒ LŠ¥-Ð{®€ÊŠ¡öiŽðKvDr¿ÞC2AµÖ¤A-XKëÐ{ª‚§Ò{Å¿…ݳQvÿ’x¶LâkÞ°Dã9EÐÃZ>Sв-¥ˆÇ'Ý#4>’;óØ²šÊt`BÔ{T¬x@ã[¸uzŠÿßǾ +XŠVoý?Fäeñ0˜Ý_KÈ–ªsó…´iWÏÑzÅ»´¾ù²ïçvî#ØCOëíµ 0ð´FZ_ƒêãa6´¾ i½E­Øá¡W1 ¾³~ãXÑ%^ðIwÁÈñä~%³'paÁ­Ö7'böµ`g ).Y߈.³'Ô3û&žÙû…=ÎëøqSú%j“À+Æ+šm«f¶Ü4UÃ-¶TeßÙPÙ××.GIåÐD¤ßõ’½þ#h2a½N,EZÚÇqPã),ä)mL±{irSîªð*3¤Õë0xeç5ký'~NÙsêÿž€bœ†œT4o;ã?<øð%¼¢ÿüåÎäcGfÄKÿÅ)›*endstream +endobj +2556 0 obj << +/Type /Page +/Contents 2557 0 R +/Resources 2555 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2549 0 R +/Annots [ 2561 0 R 2562 0 R 2563 0 R 2564 0 R 2566 0 R 2567 0 R 2568 0 R 2569 0 R 2570 0 R 2572 0 R 2573 0 R 2574 0 R ] +>> endobj +2561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [238.7907 702.6042 264.0158 713.4833] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +2562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 552.0997 139.4144 575.0684] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +2563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4032 552.0997 262.94 575.0684] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +2564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.8054 552.0997 416.0743 575.0684] +/Subtype /Link +/A << /S /GoTo /D (a00043) >> +>> endobj +2566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [233.7 476.8541 258.9251 487.4443] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +2567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.5998 434.4572 435.3076 445.3612] +/Subtype /Link +/A << /S /GoTo /D (a00156_g6614d96fdfcd95c95ec6e6f63071ff51) >> +>> endobj +2568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 339.0297 166.2529 361.6249] +/Subtype /Link +/A << /S /GoTo /D (a00156_gcb807bd57e5489b386b876af5c1f163a) >> +>> endobj +2569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 302.8975 227.254 325.8663] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +2570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [247.1194 302.8975 380.3883 325.8663] +/Subtype /Link +/A << /S /GoTo /D (a00043) >> +>> endobj +2572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.9988 227.652 267.2239 238.2422] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +2573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.3063 185.2551 432.0141 196.159] +/Subtype /Link +/A << /S /GoTo /D (a00156_g6614d96fdfcd95c95ec6e6f63071ff51) >> +>> endobj +2574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [460.5476 139.225 513.9963 162.1938] +/Subtype /Link +/A << /S /GoTo /D (a00156_gedaf3e48c2b04229b85455fb948468d6) >> +>> endobj +2558 0 obj << +/D [2556 0 R /XYZ 90 757.9346 null] +>> endobj +2559 0 obj << +/D [2556 0 R /XYZ 90 739.9346 null] +>> endobj +2554 0 obj << +/D [2556 0 R /XYZ 90 723.1038 null] +>> endobj +2560 0 obj << +/D [2556 0 R /XYZ 90 723.1038 null] +>> endobj +2552 0 obj << +/D [2556 0 R /XYZ 264.324 511.5135 null] +>> endobj +2565 0 obj << +/D [2556 0 R /XYZ 90 495.425 null] +>> endobj +2553 0 obj << +/D [2556 0 R /XYZ 208.4343 262.3114 null] +>> endobj +2571 0 obj << +/D [2556 0 R /XYZ 90 246.5665 null] +>> endobj +2555 0 obj << +/Font << /F29 499 0 R /F14 636 0 R /F52 1229 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2577 0 obj << +/Length 1169 +/Filter /FlateDecode +>> +stream +xÚ½WÛŽÛ6}÷WèÑ"†Ã«¸o-’] @šõ[,´6½j[®,gwÿ¾C‘’u³œ¢@l,Ї3gfކ$DÿAdh¤¥&† ­ö3=ãëO3Ó1ÎÇmÀ¯ËÙûߘ‰ 1Š©h¹©,( ’‹–ë¯sE@.b&é|¹€džímᇻì©H‹·Å÷å}$€ʵ@'náîíìã²qxI®À¹ý{öõ;ÖÈï~F 7‰Œ^p@ âýL0^v³‡ÙŸ?Q- O0 -Å\‘ŒE%’PH4f‚l<‰!ƒŠ4Çà4UhÖúðÓÝ)¿ë‡ ”͋ږûþ…§Hýœ{S<‡©/-–@5ÑÀåMÞ¢Ùà˜ãYºB=ödËoTRüƒYi(£&ÉÆ ê ¬°2u“xì7JÙ!+³ü2VÖÂ9„þ!ßø_·d&«RÎÉŠT"Cé‚&Š _‰/vc {Xٓǯvùê¯G·ªø]ð{Xû‡S™ee«Wi´ÌÊ ¿‰Zò„ä”Òù ÃlÝ¢õˆi­Kz*‹óªì§—1E(K’H N45ìF½|Ü^0”åÐnSïaS zznPCÇø²åXÑXþŽ_¬÷Å™ V¡YèåHÆñ3QFÀ»~˓ؔ”IÂ’ìPÚâGº1ͱyI€¬…ßSkÌ–XàÃ'\„h겦} vÈ+ôr›¡ö8À|s>¬¼ÐÝÈ¿eóóÉ®ý›2÷¿•lÜCÞûvêÀ›¼L…EùÞ^FYpRnmXx.Ï…%‹XŽ”lQO…NQB‘¢XM.õ U6ø¸½`øùí^º]€œ¿³Â®¯õ"a„ëê=Výî@·¨TŸÛ!:T^²]¥4CÃ| @Œ Ó.˜ÄOÿKwç´¬›P~‹sÝ÷7e½V%¸È¤zܦ¡µ‚&ýhë }ЊMïRmÔõ]J*A€ƒïŸ]ËJ‹…c‹Óµm +F w€=dÒù@›¨5_Ç9P">|  ¾³÷a£غ.ñ8æU—è²[³«‰Áóããg¨V>.¨©tT¿ous׃…œv\ƒŽ»I[›4ÇË:nÏÀëÜ¿y²Ø{ìuI_”|ºªdüžˆâ §•ÜFM(k/•T¼?¾¦ûãÎNhxÊuuÔÿâ¨5d8zÔj`Žâz»:®ÈjXÒ„H¦ Æ ê–ë5¿söâÞÌ‘=§×#¯ñ·Üìúžé”Q(Þ§Ùa—çÇø%+·qZ‡ÁC1‚ßPKƒºAih­u–pg¾¾÷„“„‚þÙÔ4ø[<v'S“ŸËñììeTßÒKƒºÁjhͱòÇ<ìÖFð¾$ýÓvõœ×Ûêú¾»Ä»‰Ð£}“Fî#ÕºxV7ç—ïlÄŠÍ“úâH¸p?Ùƒ-ðˆ×9ý£~¸w9‡°úBtÇø£~Ä(Uþi㲑‡~|þýs@“|zó¿ò×·g;8óI¼mŽäçno¦endstream +endobj +2576 0 obj << +/Type /Page +/Contents 2577 0 R +/Resources 2575 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2549 0 R +/Annots [ 2579 0 R 2581 0 R 2582 0 R 2583 0 R 2584 0 R 2585 0 R ] +>> endobj +2579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 718.3357 160.1659 740.9309] +/Subtype /Link +/A << /S /GoTo /D (a00156_gedaf3e48c2b04229b85455fb948468d6) >> +>> endobj +2581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.0325 640.9795 250.2576 651.5696] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +2582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [431.0264 598.5826 495.3943 609.4865] +/Subtype /Link +/A << /S /GoTo /D (a00156_g6d71dececfce707c668e6257aad5906e) >> +>> endobj +2583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 495.4786 139.4144 518.4473] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +2584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.4032 495.4786 262.94 518.4473] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +2585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.8054 495.4786 416.0743 518.4473] +/Subtype /Link +/A << /S /GoTo /D (a00043) >> +>> endobj +2578 0 obj << +/D [2576 0 R /XYZ 90 757.9346 null] +>> endobj +2551 0 obj << +/D [2576 0 R /XYZ 229.1564 675.9038 null] +>> endobj +2580 0 obj << +/D [2576 0 R /XYZ 90 659.5503 null] +>> endobj +2575 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2588 0 obj << +/Length 1530 +/Filter /FlateDecode +>> +stream +xÚ¥XKsÛ6¾ëWp¦i&Bñá[k'™¤MÓÆ¾%MA1Ç©’T÷×wA_"Õtt÷ùí `ø‘@ã@ …4ã2ˆ÷ |ǯ¤~½†÷ë6à×»Åϯ¨4Ò’Êàn[I Jhp·ù¸Ô|µ¦!Vxy|ó'\ +¼$»‹wÙæ¸3îú&‹{“–Q™déêóÝÛÅË»Fom–`’X­/>~ÆÁÌ{»ÀˆéPßà#¢5 ö N™¿Ù-n5rÜ‹êƒ1ïaãîŽà õþQpW9÷$"rµ&ãåõ.‹Ÿœ3IZš|ÅÆ:â$¤…¨$@­ž$ R˸1e”ìÌ¦Ž‰)â<9øˆ€ ÖŠ´•cíÒNÎÝcɸoNJॵÅ=*Üéá#˜S~3&={é€|"RH%Ôž+öUþ¥Æ|hŵÁ¯Û¸à¶=ÊµŽ•ÉÞäΖ]òGùs߯0R’“ž=½ì6¨+cˆ +v­ˆÒM/p‡]Tn³|ï‰“OÓx…í1m£]R>¯¤X"ë€Í^­hM’”óÿ’Çý±(}¶jÐþ°3¶„<}À8wa¢øqÌæò1ªe SœM7ƒ´h)D Eˆ ’ÙLºüºýÁH r/K7gÐA¸Ô={zénP3V ¥Y+ê1î…L¦ˆë±m²*¨ð2KwÏîY–çdE–ÅÕjÍà›¤ÎÃÞDÅ1÷ŸÙP ¸På!ÏVD,¿&ŸÏÈa÷Qœg/Ü£ëßß_ÿv¿®<„&Ò´&ðìöåõû?njÜ·ÇÄó&Îr°ê¥O“¬çOaâÌ—H¶­Ÿ=¥ñ\«|ée2“PBc†’&ÒƒÖmÔpá 5˜AïÀ…œ¸ª½5µyѮȮúê @£dR?G:$.§IO°BŠ01ff›n ®UŒZ1±œ%>‘¶ƒ±p:^ j4`­…–2!$´¸z¹1¶¥Àœáò+G˜qzvWÐŒy-g!?ɱ +?Q*†9±k£`ÓÔœ^X¹5–²«÷§Míé@9—HQEzÊÏ'ÝãçÌȵf¸:t%7Xb©@ÀL=""´mOà'gº š‚½µû¨Ýjˆ!kÉÆÂî+ ,ó0kì/í2ÑîV+¦–~ÉIÒaåÛŽµ¢xùtj¶G¡aæyƒSŒð }i¡Ç9΃ØÔ1U¯Åcç‚ ªôyŽ·o`³ŸÔxâøŒ^ÏñŽÞ¯6äY²è>iBDO÷yŠ{üœ¹ÖŠjµºORXßúv(]ŠÈ™xÔœv¥`+Ei/öX`¸&çÇ™DŒ zãÚè‰êi`Ö’7öÿ˜Þ&²W¶ñÛâ°Í_LÔ·íšü´ÅµÁ„B9~žÖà°I˜£µ‡ÍÓº%pŠÖÓzZ·õ:BÙr?¤”Ô´ìè?OmŸ³d ·kÉ wfç†p: jF;µãa(zÚ/¥6Ó +ñ_¸0´ÑÔn`֒צìsú˜»E!-l`¡D¶˜/³ùïÿPƒPˆèfÚ¦õ´íƒ3'½ f3o“–¤frÿj÷á¶ßžvé®ïU÷.]¤“®sã<™ïOÝmb3Râþœâ§ýmÇÓ¤‘]Ì wÛg¿µ/³ãnÓ<ãh×Ylólß“¹’Ôú_ù=bŸšÜæ§€AÈ5WíøtvzC+ ß~0 ãìî0û©7à\š…Ü”Ç<-¦Ä÷·QOÌRvɤ ªtr–j£ÎÏRj ¢í +ýƒµ×ÖmZœŸ¤&µ7¨õ£3RëNÝèìL§v¥e?õ”OüèF¡ª½ÝÐ{Ï'%ù}Õ¿¾Pá©ý¢ý†å2ÊËÞ»ÓR*L@c'ž®Fϲ0‹H!ÿ×ahµö‡ð aî)‘V0=Ú +ÚsOoŠ«ˆÔäQsÈäÙüÎ_¼µ¡9Ö7„ÖÿøŠ²+ZŸûRŒe]+*–þ˜jx@ìƒ~“}þbÇÂö¼v$JÿhäC4endstream +endobj +2587 0 obj << +/Type /Page +/Contents 2588 0 R +/Resources 2586 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2549 0 R +/Annots [ 2591 0 R 2592 0 R 2593 0 R 2596 0 R 2598 0 R 2599 0 R ] +>> endobj +2591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.6865 672.5415 331.7604 683.4455] +/Subtype /Link +/A << /S /GoTo /D (a00156) >> +>> endobj +2592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.9692 654.9172 432.0432 665.8211] +/Subtype /Link +/A << /S /GoTo /D (a00156) >> +>> endobj +2593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 587.7333 161.7601 610.7021] +/Subtype /Link +/A << /S /GoTo /D (a00156) >> +>> endobj +2596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 531.8574 226.3182 541.7851] +/Subtype /Link +/A << /S /GoTo /D (a00157_ge3ced0551b26c9b99cb45a86f34d100a) >> +>> endobj +2598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 448.4997 175.7578 459.03] +/Subtype /Link +/A << /S /GoTo /D (a00157_g78ab77b57cf2e00089f0a3a22508524c) >> +>> endobj +2599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.4252 409.6454 214.6911 420.1757] +/Subtype /Link +/A << /S /GoTo /D (a00157_ge5b7160f2e653725ba5e2024c3cb7bff) >> +>> endobj +2589 0 obj << +/D [2587 0 R /XYZ 90 757.9346 null] +>> endobj +2550 0 obj << +/D [2587 0 R /XYZ 90 739.9346 null] +>> endobj +142 0 obj << +/D [2587 0 R /XYZ 90 739.9346 null] +>> endobj +2590 0 obj << +/D [2587 0 R /XYZ 90 719.4886 null] +>> endobj +2594 0 obj << +/D [2587 0 R /XYZ 90 549.8311 null] +>> endobj +2595 0 obj << +/D [2587 0 R /XYZ 90 549.8311 null] +>> endobj +2597 0 obj << +/D [2587 0 R /XYZ 90 467.076 null] +>> endobj +2600 0 obj << +/D [2587 0 R /XYZ 90 371.9517 null] +>> endobj +2601 0 obj << +/D [2587 0 R /XYZ 90 345.4667 null] +>> endobj +2602 0 obj << +/D [2587 0 R /XYZ 90 345.4667 null] +>> endobj +2603 0 obj << +/D [2587 0 R /XYZ 499.0115 286.0122 null] +>> endobj +2604 0 obj << +/D [2587 0 R /XYZ 90 269.2851 null] +>> endobj +2586 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2607 0 obj << +/Length 2480 +/Filter /FlateDecode +>> +stream +xÚ­ZYoã8~ϯ0°/60æòuôÛö¤§‘^loï$,03(¶ -KIîLö×o‹”hI–¼hñøX«ŠEÆbÅáŸX%|éˆ%*W»ã _=ÃðÇa§·0¿õïnþüƒLV KB®ž …P0-…\=ì^‡LD›­Ô|ý¥Þˆx]µUSí¾n_gmC3EþX§õÛf«x”ëDo~}øtóá¡ãkÅÒ*Èõ÷›Ÿå«=ˆ÷é†3•Äzõ +ÎD’ÈÕñ&ÊuŠ›û›tthÂ,˜ÒN 5­žŒH§Ÿu#_=Áù5úVDN°DkCì‰ÔdÜ“c¼ÍÚ4/²=¹Íš]¿´yUZBÊ3;ÒA!¢ópÈ`U¯_ê3p0éím¡×ßò}ÖÐHZÒ7/Û¬~Â…é.£•mES­£ºûB3M›;™¶–‚¥ØäǼHë 4Ú:Ýç¨WZâýý­]× *£’d:a”<“uˆˆ…2 ⧲ȉÐSu}®ÓcC½×:oÛ¬¤ÎSUSƒÄ‚FUïó’Ì=RT!) ÖB“ee»Ý×¹×'Ä™\ßáX0Çù5oÖÃ];Sžv¸ßC¬Ó:£F†rüa„ÙZã:0š—FŸ&ûý²çÆÜÐ'Q›záJ³P­÷•ñ *«–‡t#¹Õ—FÌ~Â÷ÑöóãK‘cŸ6¾p/E¾Ë-1pšÖ®:¦»C^fÍ`•QöK=VUY¼QëÇ«ú«í‘A¡õðýj쪲Ìvècͤ£˜xQQ4ŽìótN ØdŸ¤à,I°ÒI̩ϤœªŸ-æG/Ñtø­¿€²Õcº5ÚC¥û±$!gIãÓ̯°ã$·aŸ†H¬q´ÒR³P)5#´õQãj'N82ÐRPÄPV úŸ«6{7ä*¸–bžm‡šàë§à‹„Ò=5dü>Û¥ž`—dH‡±wÀ`ŸÒ cR´¢37ƒHP^ÕÎD0àÎ7Þ ½æ…4»ˆ @ ›’Ó7 {̈~ã{ ·ÛlÚSÞ„›ˆÛ)é¤ÑмANyƒô½Aú~¬D´¾³S–0QÁÁŸÑpºÿ–7ä}Ò…7R$à‚Ì"·úd—ªîü‘öÄkk8§¢}‹™Ëp´ŸPö@}jçéTRS.½*Î"¼*Gœî ¡M}ƒãMVB]óL}Ú¦4BW˜ðpØòÌäx„gä +‰ÕÇ hkHŠÇ¼i ·‰¤z"ƽþZRÖ‡²öÙ I¸! L_3³Ûq?BŠlÄ£Z¬š¥z è«FPÄ’>8ÜéƒÃ¾>8i áF’xÌ:º T-“e˜Ÿ¤Ž•Ëhà<¥«Q²A)Ò§xFÝ'k.ˆeAbr<¶& +y½®Oæ4‚V꾚âí Wm_ tpë©8×TÌÁÒxM…t¬‘z664iÝ á‘d:ñ*PÓµTuø­¿`œúÆtMMtÿ÷ïÿúÛ–‚IÅŽ”¿Uï?|¼ûŒG“9‚†éâŽG<‚+"g±Š§³³m=ÔDr†Ð"éhGAKóÄîOȲÔ4UH?û§ çöûzÈ7øTÆ»‰ úbJb^÷t+ºÒá<Ï…¬U­Vƒälýѹ>WpmjÝ)þøvv‚»dÎ'<¸Â†Bµð˜Å±Œ—ªh‡ßú &*ÙÝÞc>üóîá’OÈ(d°6È3¬¦jIŠ5”‚M= +lEìhªŒŽûC^Œ¯ _)-™àêò‹˜ª%B¨8èé˜NJ=®að©B«yŽj‰¯X¡¨?ç˹,²gÅ„ÕóE×èðK2ŒèšKÆ;Œ„€{SóÚkÅÂX‚¨œ>ÃLX*b"°‚òQ$½ãh¾‚;W.ðfŠî€¨Í(lñlUÄxÈtUñ‚8«©m ,ôš÷—äRŒI•ˆ+…÷Ð݃YïÌà€2‘ŒÇ!UÇ·t¾‚$÷m}Úµ'ól6éØ2LX ! .9¶˜qì¶èس{Ç^àëûŒoc´;v´‚3âœóŒc[ü’ #ºcÿFwÛ§‘(±9­â%³C–%.ï™Âxiolyo<‚s{3Ï·ÛŸïÒÞœq¾foæeÑíöfœr Æ‰ rf•×pþ“Ž  ïùg:ët°þ]¯ê­³úÀ•‚-lÍû4¸´O¦ª‹ÙGBN†ª®ÔÂCOg‘€édQöÉ0ÿ•“éFD +Ì7ãÒ>`Æ¥;Ø¢KÏrì]z¯sé3¾Ú[MG̃E2æ—½Úá—ÄÑí«¬»ÏwãjOáSG2o„µÀ}LÍ=DùB¯¹¾Vÿ¿(ÁîŨFŸ…¢C,¨îPKŒGÔñw¶ü¶¹îÜOP|z¢Éÿ•M^‹l˜ ™!‰ôu1é£g2KCyïÊŸŠAŽÿ)yˆ f\Å )ÐÉiްËá®4‡z©lî`Ëáîœ ÷y¾]¸û|¯÷3æ×„û¼#º}¸››öøo$õ‚y+t¨öcjãv[G<¹Ö~Q‚!ÝËñ@Ñ$T¸ ºC-1Q³ª_Ž^ B^»v.r „|ïí3†v¾¼´ƒÉö@ÕCj_ +òò,òû·ÛKZAÀÈPˆÿG¨C‰ ‚xé`'Ôrœ[Ü|”÷ ™÷8.G¸ÏöŠøž`@³íûŸo§nbÅÅœâf–ïÒå VLQxÎzž÷€æÌñ 8hgÕu˜y–JÞÁÏÐ^³ÈÊ©Ç_£’zB +¬DHyä¿þÍŒ‰¸*á¿È&«%¾m>ùB ³2«û@w+ø›k|·‡“íi¿üTï$§žä<´Y ”Ê>]Ðo0ÍøùëâmõÇÛsV̓?è™°Ï¿]„¦Qendstream +endobj +2606 0 obj << +/Type /Page +/Contents 2607 0 R +/Resources 2605 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2549 0 R +/Annots [ 2610 0 R 2611 0 R 2612 0 R 2613 0 R 2615 0 R 2617 0 R 2618 0 R 2620 0 R 2621 0 R 2622 0 R 2623 0 R 2624 0 R 2625 0 R ] +>> endobj +2610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.6232 595.7581 261.9762 606.662] +/Subtype /Link +/A << /S /GoTo /D (a00142) >> +>> endobj +2611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [471.5956 429.6401 513.9963 440.544] +/Subtype /Link +/A << /S /GoTo /D (a00158_g84901a5aa60040e96d272a69977edd22) >> +>> endobj +2612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 417.6849 128.067 428.5888] +/Subtype /Link +/A << /S /GoTo /D (a00158_g84901a5aa60040e96d272a69977edd22) >> +>> endobj +2613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.8032 405.7297 277.2062 416.6337] +/Subtype /Link +/A << /S /GoTo /D (a00158_gfa11b2a1faf395ae2a6626e01c482d5d) >> +>> endobj +2615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 348.9505 161.8402 359.8544] +/Subtype /Link +/A << /S /GoTo /D (a00127) >> +>> endobj +2617 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 266.3068 181.8351 277.2107] +/Subtype /Link +/A << /S /GoTo /D (a00083) >> +>> endobj +2618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 253.3937 163.7728 264.2977] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2620 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 170.75 204.7292 181.6539] +/Subtype /Link +/A << /S /GoTo /D (a00158_g26ae707402e494f3895a9f012a93ea29) >> +>> endobj +2621 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.0542 170.75 231.2894 181.6539] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2622 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 131.9725 215.2497 142.8764] +/Subtype /Link +/A << /S /GoTo /D (a00158_g84901a5aa60040e96d272a69977edd22) >> +>> endobj +2623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.5747 131.9725 241.8099 142.8764] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 93.195 210.8263 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00158_g70d236d1cf34b4e21836edda60247b70) >> +>> endobj +2625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.1513 93.195 237.3865 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2608 0 obj << +/D [2606 0 R /XYZ 90 757.9346 null] +>> endobj +656 0 obj << +/D [2606 0 R /XYZ 90 739.9346 null] +>> endobj +146 0 obj << +/D [2606 0 R /XYZ 90 739.9346 null] +>> endobj +2609 0 obj << +/D [2606 0 R /XYZ 90 716.7484 null] +>> endobj +2614 0 obj << +/D [2606 0 R /XYZ 90 367.862 null] +>> endobj +2616 0 obj << +/D [2606 0 R /XYZ 90 285.2183 null] +>> endobj +2619 0 obj << +/D [2606 0 R /XYZ 90 189.6616 null] +>> endobj +2605 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2632 0 obj << +/Length 2761 +/Filter /FlateDecode +>> +stream +xÚµ[ïÛ6ý¾…îl Ëò7©~K²›\ré&·ë"´Eàxµ»F½vjËMóßßPiJ´8êݯüüÞp¤7R›PøM +:1ÊBH=Y>žÑÉ=~uÆÚ¯Ïáûóð|~öÝK^L +Rh®'ó»šA3¢8ã“ùíOÓBÏ饆N¯ßÃGE§ŒÐæÃÛÛúl>_l—‡ÇrS-ªÕv3ûeþæìrtÛ°”ÐÌ©þvöÓ/tr á½9£DVM¾À”°¢à“Ç3É…ÿc}vsöïÀÓ|QÿàÔè$UÄ +;9ç¦OJÀŒÂ4‡|p½á!ŠN,ü\K—_RS؉G¹œÜ”›ÛfÔ·‹jAú£õ̆Áo™`ù0Ú('Š6Qœ>kT@dz&¢³Æà[)¬œ˜‹ógÎUüŠ+1‰ O$§EaºL’‚jÝÕýæ¶ü™R¾)q©‰á†õÄÝW»ûs‡áñX ¯ ãýÍ»ÿúxsyuññf~Ý… A¨å&Ÿˆ€B"HÙê@MuáTAvÆæ àÑú¼.‚Ïûíò×$U-Áöù¡{&œ°9áoƒì«$ YDœPªÅ8§ÆèŒU¬ëÕEóÏæ°^ŸWåîqµYTåmsµ¹Ÿ15t³¶P÷¤‘ÂÍlÐÍZ[¢$ˆ› usL˜q3¢ëÝÜÑÅÝÜáf$Œ„÷èæW—W—×ÏfŒ±é|ÆìôÝumðä +7‚Xé®…\^ + (e4·q€cSðh}ÞAs J¡E~è…§l‘¹ïËM¹[TÛÝLRl±s§å>kz%ÁItäô£s¦÷0ß+˜s38ü8Q7Ÿ¾¬ª‡NA¸;l–uÓÒôåb +Ǫ. +Ò•}fž¦(J”‰³ÓEÁÃð¢æŠB^7…XwDQèˆ) +ù0ÞcQxñöÝÍebE¦ˆ€© Ÿ…€BäS¶ÁÀ,ÑVÛ± x4‚>ïðü.œÚB"C÷(L8ak‡>lp¦Á”²ið3¸‡9õëí¾ì¸ø3!5ÝV[HÈŒÓé¯3F§eƹ°V`L?‰q4šZ¬70Ô¸1aƸˆ®7nG7nW|„q‘0Þ£q¯/Ÿ]WÔ™/³—”0)Föß1:gq´øçÖßÛμ½ÿ\.WîªõKñ¥ëÛMû¾¬\‹½a³CÌJó$›l +z mŒÂÌîa¸Ù#œÙóºÁì±î³wÄǘ=FÂ{4û…[úey!¦ÏÞ^^¥ö³DrªòI ($š”mxFgÄ;6Žé÷Y3ž‡Óg©AÆíQ˜n†Îè”fÌÈn?–‚êaQµ‹ñÅ>´ïÂLKgúßWÛÃ~ýµ9Þ^Üú_ :»âIæz mŠa ëã µL˜±?¢ëíßÑÅíßa$Œ„÷hÿËÿ¼ž'—}½Ìu> …¨§lƒv‡´ZNG?àÑú¼ÃŽw74·ÈÐ= +NØ0ÇK-Á|d£3Ž0§~ùǪêÙ{`þ73ì{ê÷µÌñ4M¼„æÄH5ñ†;"Ì;¯ŒëŽ0vG|Œ±óa$¼½µÓöv;ŸÐõæSPH )Û ½!ZMߨ,<AŸwØÞº€Æ[idè… 'l¨½¹&®iï³·‡ý©íµÞžyé¾úëKS„[ó4{wc)Öò^"Â\iÈë†ÒëŽ( ñ1¥!FÂÍù'îºQ˜" +ZäsPˆxÊ6<å·¹%Ç?àÑú¼™)Ÿ«C†îQ˜p†Õa-x‚Úq5!FgjB€9õ‹r¹^´]z×ÞáF™où‰í…1D&ÌØÑõ¶ïèâ¶ïа=FÂ{´ýÕå‡d±?´âÎæ$¬³ó±$\ÃË|E¨Rjl2  Ï›Yéƒ_ +Ë‘{&œ°¡E@Q"˜b#‹@„Ϋƒ‡²µr³ß~S/Ü¿ô×ù~u¿ØíV¿û ¾p§ý»q'DšæOS ë±²`Xð0¼ D„¹2× e ÖQ:âcÊ@>Œ„÷X>Ìœ«g¯ç¼š¿~{ju Ý£˜Ù|HÊ–[XÊÄØT<AŸw¸J¨”ÈÈ[&Û犷ø·›Û•{n%[ÀB#— +1:W<ÌEóaVðé·üÑ}¼E/Ìî ¼jw(³Û ʈ(¨~’}}ŒµB"60Ôæ1aÆæˆ®·yG7ks nìjg]îàX}ÖSŸÿÓÝÍ;µ± ÓËg# @R¶A“+C`¥jÆf"àÑú¼Ã&·°V§¹ +NؼϵíùÉéûyrn\žþîþw*aRR(£Æ&,à‘¸SÞÁ„IÈ-wO'gP˜p·Fß½d2+ˆ‘; ‡ù[˜Qĸb667…˜ðÖ¹©}+ vQäJ +(L5aó‰i¯&wyÀuîÂp ¨%ªp‘0Yj›¼ãåvÌ(/& „;˜7›ÊuW€±¦‘yÙ>H¹?ñúçjâÀèu‰Ž¹íax‰Î(º[h0™S¬„úE +yÝéÉéfÂm)0™ YPƒ‡'¡;(8CÃó¸NxµM?ºf}]&/ì°ÂjÍŸ·€Â( +¢LröàRÜC°¬N=¨¡¸à=õìƒ5‰#åÍ>¨a´*ò ¨T¸S‚x}3C«~¨8¹„Iâ3s[‹Ç†žðfæ6Ý6UÈÐ= +N؆V±®JPK$™F.䪄‡áU"§5ryÝàÿXwébIì/‰’Üöt‡-îñX ïÑâÐIrXœ×ËòÄæ0I1, - ¡€+ŒŠ^r&׮ߓcSðH)oæ9éÖ,?|Je{g0á2Ó~cñþ4íç‡ÙβLCo®Ew–…ÑAó3ƒ‹“Òé…_+œ~³÷n'­'ná’ a-×qáQ“5k€ç—¯^_^iS÷’•œ0¨Ühƒ®´[üyüƒôýÓ”7s£¥í…܇kQ˜pÂÖí);'Vžž5ÎèMµØ¥7¿š½­Î³ú`õ° ÏÉ­6'ßI©—Çî¼Á™Ò\Êöq›z­Ùôq±Üm›{'Ýn´áCW,öɪ}ïM‡—a’ßtâu¿Û´‡}{h¹}lñ©¼ÛîÚÏ V?«{‚ÈÄ_à®D.Öë}7!oÝ×rüƒß?8ìËôN{͘ùÍÉ(œ?¦•þ¿Þ@®g!ëvDãúSL4)Ü.µ{cŠ»!ë×›P IÇ× ý¨~ðÞ¸½Cûãí¿ô{.¾çíËÖ°ÞÑmf\=ß¶OD§oeúê«Á_ïÓÖNAá9‘¥ÿsÉ6Fendstream +endobj +2631 0 obj << +/Type /Page +/Contents 2632 0 R +/Resources 2630 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2549 0 R +/Annots [ 2634 0 R 2635 0 R 2636 0 R 2637 0 R 2638 0 R 2639 0 R 2640 0 R 2641 0 R 2642 0 R 2643 0 R 2644 0 R 2645 0 R 2646 0 R 2647 0 R 2648 0 R 2649 0 R 2650 0 R 2651 0 R 2652 0 R 2653 0 R 2654 0 R 2655 0 R 2657 0 R 2658 0 R 2659 0 R 2660 0 R 2663 0 R 2664 0 R 2665 0 R 2666 0 R 2668 0 R 2669 0 R 2672 0 R ] +>> endobj +2634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 703.3528 234.079 714.2568] +/Subtype /Link +/A << /S /GoTo /D (a00158_gb0ad55aa96dd1d200cd0fc5a99f6a4f7) >> +>> endobj +2635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.404 703.3528 260.6392 714.2568] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 665.3872 274.846 676.2911] +/Subtype /Link +/A << /S /GoTo /D (a00158_g10d9a9201cba1a6db623284c475c6cea) >> +>> endobj +2637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.171 665.3872 301.4062 676.2911] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 627.4215 216.3655 638.3254] +/Subtype /Link +/A << /S /GoTo /D (a00158_g5d56800f82bfc7bbf53bb4a659589812) >> +>> endobj +2639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.6905 627.4215 242.9257 638.3254] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 589.4558 231.2097 600.3597] +/Subtype /Link +/A << /S /GoTo /D (a00158_gd895ab98c54d9966ff554aa873151751) >> +>> endobj +2641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.5347 589.4558 257.7699 600.3597] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2642 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 551.4901 225.0331 562.394] +/Subtype /Link +/A << /S /GoTo /D (a00158_gb5d9c0becf7cb32d0aaef466839dd92e) >> +>> endobj +2643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.3581 551.4901 251.5933 562.394] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 513.5244 229.4168 524.4284] +/Subtype /Link +/A << /S /GoTo /D (a00158_g4ab2de595d36e9e55dd61f6ecd139162) >> +>> endobj +2645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.7417 513.5244 255.9769 524.4284] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 475.5588 207.4989 486.4627] +/Subtype /Link +/A << /S /GoTo /D (a00158_gfa11b2a1faf395ae2a6626e01c482d5d) >> +>> endobj +2647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.8238 475.5588 234.059 486.4627] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 437.5931 244.0317 448.497] +/Subtype /Link +/A << /S /GoTo /D (a00158_gc7cc1dba1819f7fcdaa9ff9eed5a08f4) >> +>> endobj +2649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.3566 437.5931 270.5918 448.497] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2650 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 399.6274 205.2872 410.5313] +/Subtype /Link +/A << /S /GoTo /D (a00158_g4a264bb64ae706d53f572b1d9e4037a2) >> +>> endobj +2651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.6122 399.6274 231.8474 410.5313] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2652 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 361.6617 232.7343 372.5656] +/Subtype /Link +/A << /S /GoTo /D (a00158_g55ce98ea4d6f22e9d5068b904d4d2447) >> +>> endobj +2653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.0593 361.6617 259.2945 372.5656] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 323.696 244.4801 334.6] +/Subtype /Link +/A << /S /GoTo /D (a00158_g2ebfe5c8a7f3173714efdf2df74fc392) >> +>> endobj +2655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.805 323.696 271.0402 334.6] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.8747 285.7303 255.1444 296.6343] +/Subtype /Link +/A << /S /GoTo /D (a00158_ga87ff36af81990e6ffe20d76d5e4606f) >> +>> endobj +2658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.4694 285.7303 281.7046 296.6343] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [432.9613 285.7303 458.1965 296.6343] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.7532 285.7303 484.4966 296.6343] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +2663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 217.7672 138.5977 228.6711] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2664 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 217.7672 198.084 228.6711] +/Subtype /Link +/A << /S /GoTo /D (a00158_g3178402dd725776415bf9745e7bf92ba) >> +>> endobj +2665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.5269 217.7672 251.7621 228.6711] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.2416 217.7672 282.4768 228.6711] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 205.2601 196.7092 216.164] +/Subtype /Link +/A << /S /GoTo /D (a00158_g3b19f65e48079d8105be2a99b5b4b2ae) >> +>> endobj +2669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.1521 205.2601 250.3873 216.164] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [239.0101 147.2581 265.361 158.1372] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2633 0 obj << +/D [2631 0 R /XYZ 90 757.9346 null] +>> endobj +2656 0 obj << +/D [2631 0 R /XYZ 90 304.3794 null] +>> endobj +2661 0 obj << +/D [2631 0 R /XYZ 90 236.2728 null] +>> endobj +2662 0 obj << +/D [2631 0 R /XYZ 90 236.2728 null] +>> endobj +2667 0 obj << +/D [2631 0 R /XYZ 90 221.7522 null] +>> endobj +2670 0 obj << +/D [2631 0 R /XYZ 90 192.0859 null] +>> endobj +2626 0 obj << +/D [2631 0 R /XYZ 90 167.7577 null] +>> endobj +2671 0 obj << +/D [2631 0 R /XYZ 90 167.7577 null] +>> endobj +2630 0 obj << +/Font << /F29 499 0 R /F50 1172 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2685 0 obj << +/Length 1701 +/Filter /FlateDecode +>> +stream +xÚÍYMÛ6½ûWè¡6P1ü¿rK²n°išl +¤A µµk#²•Jr7ûïKФ,‹”´›äø`šÎ<‡ï‘2Š ú HˆS$IX´ÞÏ`t«º_Î}«çq×àùjöäw,# $Ã,ZÝ4#­6æ ¾ˆ1…ó«rªX^ 8ÏêÊ<Éw×eZÞ/b¹Læ’/>®^Í–«6®…E C:꿳a´Qð^Í RÐèNý€I‰£ý,ÁÄýÈgïgµ~̃f@hv V3ˆD1a@ ™­ ®@ˆâp"„qBä0i²q¥ç–é>«³²zÚŸ'‚p‚qÔuíx@Zk‰jž ÈG„ž¼j(_Ô2h4Ÿ=A ‚8wV4npB \œÿRXÕåq]› +øÒÔ„òäw”tFS:¨‰1: ‘˜Es6ŸÏ¬ëbwPÉ6?êÂ~o3û´<+Ès«kkTÕiYgÐÏ”«&³ñréZ — “*_ çÍd–_Óý—<,4ºÉK¢šÍ3ÝSÞÚGïÎÊÈ–G! •Qk¦!n³wň;¯Êš$5Ö/ò¢²éKƒDeêñ@Å1+¾Ú"‰çût]¦¹Ö®lwj¾<Òkž©ýc¤Ó(ù½ii"4ò<³f7e±7­»]½ÝÙ1 ±¶1êm™¥ÖÞYÜmwëmȸÈÍ I©ÉH¾[`:ÿoè<«™˜*µIÇãLܵfbšp`üáFACÂHÂÂÝš=L¸G³pn? Aá> þ“ ÷ÖQÜ® +Ky³†•<‘¨ÝDÇë§k5R?¨9ƒ>TÉÇB?ZÉ}„A%oÍ¥ä£Ij•|Bß×Ôü<ô´’O€è{Vòѹ·J>Öó5¬ääÁJŽ ýqJN&•üÓòïËUPιZX(e”$"“rîìãªz~‡å\¡ ¸¡¿XÎj*°çmLÎÕšY¯’óSá7LËÜ×]=Îy¿.(WGFnGŽÚÒ Z2¬¾WõíÀB¬K¨T|ÄÑ8ëv­†Y—p}ìÃøQª0¢Ú’°j·fSíÑ,œTÛOCPµÏ‚ÿ¬ªíH& ‘üî/~ßý…Ê.í%c´w± TMRÒùj!Õt_/ßùª¹h:%"(Ÿâ?gwhÈó;Ì\ΡìAè󟳚 +ìy½ÎçµË+·þyv¸­·çKÖÇ&­Óþ9®9ޤ-—dÍ%`W+}5Ñ}SŒG’–ñÔú•Y},¶ßV½-*ÕÙ R}öaâP5] *ÕwB¥º=TÊÀ\{tëXí·ý"œªÆµªB¯*™(’Ö>îðw¿ï·aÁ¦~ß-Ÿ]¬ôØ·ºlÝúuQ%Š2˜~o{Žªÿ’ÔYM`I˜¾½qtŽ¥(MZ ¦ØìÍÙ©½ñòÖ€ÔAéÐg)ŸrtŒ†…c¤nëäqÂ?¢}aÙpVS±œDÃË@P3º‘î‹Þ¶È7z_ù2 )8H ôãÒtLQ–o.‚ +‚Õ9«#$¢`Î&ÄÙÇÝ"÷ü+ˆZU,ëAè+ˆ³š +ìyUæ¼vä"[çi™õ> endobj +2687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 680.7395 162.0093 703.7082] +/Subtype /Link +/A << /S /GoTo /D (a00036) >> +>> endobj +2688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.8747 680.7395 210.1583 703.7082] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +2690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.6739 621.5426 267.0248 632.4217] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 495.0915 162.0093 518.0602] +/Subtype /Link +/A << /S /GoTo /D (a00036) >> +>> endobj +2692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.8747 495.0915 210.1583 518.0602] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +2694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [270.0136 435.8946 296.3645 446.7737] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2696 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [253.4163 297.3671 279.7672 308.2462] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2697 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.6802 255.2592 460.6174 266.1631] +/Subtype /Link +/A << /S /GoTo /D (a00158_gb5d9c0becf7cb32d0aaef466839dd92e) >> +>> endobj +2699 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.9319 147.2581 254.2828 158.1372] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.6929 93.195 231.8468 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00158_g84901a5aa60040e96d272a69977edd22) >> +>> endobj +2686 0 obj << +/D [2684 0 R /XYZ 90 757.9346 null] +>> endobj +2675 0 obj << +/D [2684 0 R /XYZ 236.6686 656.6872 null] +>> endobj +2689 0 obj << +/D [2684 0 R /XYZ 90 640.0288 null] +>> endobj +2679 0 obj << +/D [2684 0 R /XYZ 236.6686 471.0392 null] +>> endobj +2693 0 obj << +/D [2684 0 R /XYZ 90 454.3808 null] +>> endobj +2678 0 obj << +/D [2684 0 R /XYZ 236.6686 332.5117 null] +>> endobj +2695 0 obj << +/D [2684 0 R /XYZ 90 315.8533 null] +>> endobj +2680 0 obj << +/D [2684 0 R /XYZ 236.6686 182.4027 null] +>> endobj +2698 0 obj << +/D [2684 0 R /XYZ 90 165.7442 null] +>> endobj +2683 0 obj << +/Font << /F29 499 0 R /F52 1229 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2704 0 obj << +/Length 2110 +/Filter /FlateDecode +>> +stream +xÚÕYÝÛ6÷_a •šå·¨¼åšm´—ä²ûP WZ[këΖ|’ÜÔ÷×ßðK–DIÞEûrX`I“Ùápæ7CŠ,1ü‘e‚—±ˆQ¸\nŽ ¼ÜÁðÛqÓk˜_w þö°øþGš,”H*—O†ƒ$HPB—Û_£D­ÖTáGçwŸ +pD¶¿—Ûó!³ý7åæ|ÌŠ&mò²Xýöð~q÷ÐÊuj &‰–úŸÅ¯¿áåÔ{¿Àˆ%J,¿ÂŒH’ÐåqÁ)ó?‹ûÅ?Z>vÂ,Û§°3EØrÍ$R$á£TJ LT † "è¸!T‚0fñ2f Áö¹±Æ§ÁQZ¥Ç¬ÉªúÕpŸS3J—]Ö^@‘–:ÔºWMŽQL˜¸rÕªœêr£µùw ÃH )F•¸ +÷T#f`]áL ÅbÕþO,pÝTçMcO_+cùþGÂ;«C2VZ¨]…™%ê‰àöÐ< –çkÇºÌ 0¶ýÑ”®Ý;·;UeSá`ЬACcøÃ–Š!Îd<ï]ªi‰$Êè{÷Gz<²I_ ³¢ÍÖ9tÍœ©vnêsÏSœŒhÈÆ<¥%Ó*î³Ã¡\Õ*«ÃmU!à1œÀ¬‘<Ñ-†¼´ßÙÃJ‹m ZQ¤â¡‘¦ áÈo)1䪕¨Í)Ü;Å "’ÎïÝÝðÒbK‚æÄ±Œ’Òë› B‚¹ÁLk"P‡¼pΨ°òɶz‰G]wh\Tu½žQİ4’$"1¢H®À—0޾ÙZɎͧû?üôåî—w:°*„\J +û’V'©¥_w„ñòõ¸`IÂ’ +ÃcòT·ÜZä Ñ ßs¥±˜p÷y3Eß®„ˆêÎT³¯²tkýNDRÎ ·‡}®)9Žé¦*mPï˜i“¹)+:nvÀ¸F@qUÅêð3z_ž¦/¢ôp,kOpÐä(Ò‹úè8žëÌ­Î ÛnÊâ_çbãó½ÙA‰p)âkÞìƒh'QH¥B&HŸÅ§£Ý‘¯»ô#Ñ>äj2µqé~þx§}Ún{âŠ:CÜóT·´¸µÑ?–„v~Âä|BêRM'$Á9`‹²xsŸ9wLu9•æä¿8+…jŽf¥–lp@-òŒ…Ó•Bªy‹*dPi¬Y  'æÍÊØ"V·ÌСЦ/¨üÀvÖ·*?2¢Éxå×’=¯òSb¤ò Í0Zùõ„ÿßU~.”arÃ#:TÓ¹Ad³gV~s¢_c¡†£1Ö’M—<„qØó¦i©nI¸uªîy¼´ê¡Iü×U=ñ\ÕóöîÃÝç׫DD+¢¢Ÿ¿Üß}x3V18WÁH¼d p•TÝ8»–~Ý]zWÈw²b )(088GsKè€S§LßeEV¥MY­Ú–ÝTD™•Ù­ÞZ6ÎØÛ´ImÏ–©mž|Ñ^L§Î|/ŸŽnpOcL磻K5ÝŒ'ˆRÁ_„÷c +Ìà} É8Þ·dÏÃûY+\ñ>4Ã(Þ÷„úS |5%ˆª‰¼Ü1O‡lÎ<žLkxuסp#!»ä£Â=U(¼oQÊ¹ê Ÿ7ÏUµ¾£OZ D!ÕÞ²R‡lÎJžL+šV»@,lD"nˆõT¡Ø¾}P DS}±¯+ ª;ó4ør#™‡<ô—@ÜmI%]èPÊsÊܤƒèYLŽÆ”Ú›ë •+"¢ßõ?sŒ0b5’À»õ c+]E›´°+Ì% ZwI‚)³K­Ã¥Hù&=.vÀë8ve² +ÃGOÚŒˆÔ¿›*-êc^×+Áv”Kà&V7æ¨)u¢Ô¤N@^ìì¸Ùžðܱ¹Áé÷óqÿÎO+*¢§¬²S¨íÁp°kv×F·Öæzq•mÏ›ÌMiY#û*2mŽ`÷@&Œ³cY]VRDZ&a 3³31\®À/£—nu5¦ýÌ {¼ØÖZ€ÄQz:à,oAaCÓ¤¶iKN³®¼®ïíÊ–8ý´•»›þ.×{²þä3Zí3Û5—öcâšÛ¨Ð.ÓÌðJ¤tq åÅ’“[2ž~Ý]0ò~ð½^Ô\™D ꤱ[‡Â‹Ó„T>Ø{ªŠ…Ü:5&£ž‰}Qá#ô¡ã¾ïàžïà¤} Ñ3§CºqkšÁbãQØ Êʆþ‘WÙ¦Ñq­)MLu—žóÓp8u@?pyŽumÅ(uNUÖœ«Ÿ‘P:dÅÎøŠ"¶4VÄãîj«ÇµhY˜Zkè±.Ø*ÒÃOb}Zí{– 6AÔBFž–`ð^,z‚/ï³b°Ä11U|U7cáä ºùnP +–ÅÆ…Å“OÙ5̪‹óy˜lòÙû»…ç¯Á(¾Âñç_LHò×]LÔÜÅä݇‰çXš ®D †D›Ü +~O¾îм‰¹Î¼Å2¤8g}ùÁS¬#º!uÈ«s qñ¢cåz¹Öù³é'[/½{!y§O6=ÀºÞõc¬†z†Ë~˜ø÷YÝÍ[~n.µM!fÎ9ŽçÚ =f¶õáfÇtÞµ}% ½BºæÐQ.¹Ç¼Žfiø:k£M?ºx;e›\{_VRP^œÎMÏìmºî…â³oú30APp>Lá¥þB"äŸúBl¾p+XBXï¶'Që—<}ñ……\ÒV•î]µÅÿÛuÞk 9»„º¿¢ìuÃ)ÆÒF›É'üjþxñ_Ìÿ¸…Ϙ•þ?hrrendstream +endobj +2703 0 obj << +/Type /Page +/Contents 2704 0 R +/Resources 2702 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2701 0 R +/Annots [ 2706 0 R 2707 0 R 2709 0 R 2710 0 R 2711 0 R 2712 0 R 2714 0 R 2715 0 R 2717 0 R ] +>> endobj +2706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 680.2836 162.0093 703.2523] +/Subtype /Link +/A << /S /GoTo /D (a00036) >> +>> endobj +2707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.8747 680.2836 210.1583 703.2523] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +2709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.2593 620.4508 257.6102 631.3299] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [109.2077 566.739 186.4774 577.2694] +/Subtype /Link +/A << /S /GoTo /D (a00158_g5d56800f82bfc7bbf53bb4a659589812) >> +>> endobj +2711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 529.4341 211.653 552.0292] +/Subtype /Link +/A << /S /GoTo /D (a00158_gc7cc1dba1819f7fcdaa9ff9eed5a08f4) >> +>> endobj +2712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 454.077 135.0008 477.0457] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +2714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [301.5354 394.2442 327.8863 405.1233] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [282.6755 238.611 418.4257 249.5149] +/Subtype /Link +/A << /S /GoTo /D (a00158_g10d9a9201cba1a6db623284c475c6cea) >> +>> endobj +2717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [228.4897 147.2803 254.8406 158.1595] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2705 0 obj << +/D [2703 0 R /XYZ 90 757.9346 null] +>> endobj +2627 0 obj << +/D [2703 0 R /XYZ 236.6686 655.7754 null] +>> endobj +2708 0 obj << +/D [2703 0 R /XYZ 90 638.937 null] +>> endobj +2674 0 obj << +/D [2703 0 R /XYZ 236.6686 429.5689 null] +>> endobj +2713 0 obj << +/D [2703 0 R /XYZ 90 412.7304 null] +>> endobj +2628 0 obj << +/D [2703 0 R /XYZ 236.6686 182.605 null] +>> endobj +2716 0 obj << +/D [2703 0 R /XYZ 90 165.7665 null] +>> endobj +2702 0 obj << +/Font << /F29 499 0 R /F52 1229 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2720 0 obj << +/Length 1889 +/Filter /FlateDecode +>> +stream +xÚåZÝoÛ6÷_!`/60³üžµMZ¤ÛÚ,uч®[޽)’'ËK³¿~G‰”%QNÖ‡bCQˆ–Nw?ÞïwC< ÿˆ§°'…DŠqß[ÞM°w ·ßLˆy<‡çóºÀËÅäÙkª<…”O}o±.4ø J¨·X}žúˆÈÙœ +<½Ìf$˜¦yºO—ÌžFù¾|oo²0{˜Í–ŠO•š}Y¼œ/*»–`>ÑVÿœ|þ‚½À{;Áˆ©@x÷ð#¢õî&œ2û#ž|˜üZé)/tÍŽS˜Y@˜7g> +ˆâR@˜A "DÐnG +a̤'CXb^xãRÏ;Ì»(²ýóö< ¦H2J½ºj ÀRI»H`xDB°D’0qÔª¡ì ͆Q |Ñ âhÜJu¸Õ3&ƒ¦ñß°Àû<;,ó2vENg¯ ¯½-òe –oaV +5Lð2hVFRç £:Ý&àìòGžšë&2O³FB6¥nŒÐ6ÙæÛ0Þþ­z"F<‰!-ºe¥æu±¡HY1=¥›ÅÓÃZ¯žu3sCF‘(…•rQ´B&ÁëX5Qè-7aÖ%J‘êãQâO‹Ò6ÙLl¬3¨˜®­ü:͆ÊzÃæRŠó‘°ÕÅÂV‰u‡mä áàlÆè+å"i†N@ˆ o!Ñ¡;$ûím lšC°°^+ð£t}r„˜:îµ%ÒQ¬Ôp­Kõ×Qßgˆ@½Ñ:ÿÞí⨷€’AËU&ÏôìÖ<ºjDßDµ 댾Ó7Q§ó{ø4‹Whé@–ÄP¶}d…Æ ´ui?–á +·h²í¤~Gñ1m­Äþ.ß¹s‡ÇK:¨Ã„¤iÔžuœ´dî8ÒÆ`Ÿ§»£ó b÷/G %ed9Ö¤–#óõAì©'C¦}‚à"ì> endobj +2722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 648.0568 162.0093 671.0255] +/Subtype /Link +/A << /S /GoTo /D (a00036) >> +>> endobj +2723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.8747 648.0568 210.1583 671.0255] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +2725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.7339 570.3345 283.0848 581.2137] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [260.0953 528.1725 365.4795 539.0765] +/Subtype /Link +/A << /S /GoTo /D (a00158_g2ebfe5c8a7f3173714efdf2df74fc392) >> +>> endobj +2728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [259.9318 418.3349 286.2827 429.2141] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 364.5914 154.6371 375.1217] +/Subtype /Link +/A << /S /GoTo /D (a00158_g26ae707402e494f3895a9f012a93ea29) >> +>> endobj +2731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [254.3228 266.7089 280.6737 277.588] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 212.5917 154.6371 223.4957] +/Subtype /Link +/A << /S /GoTo /D (a00158_g26ae707402e494f3895a9f012a93ea29) >> +>> endobj +2733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 120.9622 162.0093 143.9309] +/Subtype /Link +/A << /S /GoTo /D (a00036) >> +>> endobj +2734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.8747 120.9622 210.1583 143.9309] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +2721 0 obj << +/D [2719 0 R /XYZ 90 757.9346 null] +>> endobj +2681 0 obj << +/D [2719 0 R /XYZ 378.1965 605.8182 null] +>> endobj +2724 0 obj << +/D [2719 0 R /XYZ 90 588.8207 null] +>> endobj +2676 0 obj << +/D [2719 0 R /XYZ 236.6686 453.8186 null] +>> endobj +2727 0 obj << +/D [2719 0 R /XYZ 90 436.8211 null] +>> endobj +2677 0 obj << +/D [2719 0 R /XYZ 236.6686 302.1926 null] +>> endobj +2730 0 obj << +/D [2719 0 R /XYZ 90 285.1951 null] +>> endobj +2629 0 obj << +/D [2719 0 R /XYZ 236.6686 96.348 null] +>> endobj +2718 0 obj << +/Font << /F29 499 0 R /F52 1229 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2737 0 obj << +/Length 1898 +/Filter /FlateDecode +>> +stream +xÚµYÛnÛ6¾÷SØEí¡fy)©»J›´K·¦Yã!m(² •¥L–—ëÞ}?ER¢ŽN YüøŸO¤ˆƒáqìxÜCs…mgع…×ogD//a}i^­f/ÞÐÀ P ¨pV7A§„:«õ§9Áx±¤°Ï÷§çðÈñœ ¬Þçë}«çã<Úo㬠Ë$Ï_Vïf'«š±–‹3A$Û¿fŸ¾`g ò½›aÄŸ;÷ð#ÔÙÎ\ÊÌtv1û£¦£ª Cêq£…ŸžRO â!Š],AS<ÿiƘfZ©ó‹¯»º89;þŒ9îjEY€\×÷jŠ•Lr¥¸Õ–t5|iáûö¨J9ïvyôµÇ_0äãûŽI æÏ%Éò¹2Á:,Cë130‘¢ fÑXO³¢.bn ¨\ÄÙºÙä> °HP—UÕ&ÙÉ#óm¹|ÄóìÓoåFõ”/Ÿÿ-ÿ‹ õ&Tè»"/óÊDÏã-–Ì£@8V¨Î²õ²Üq¸V/®S@ìÁ}V&©f‘¦m9ð|jÑ®ã8SO oY+GPÀ¹Ò?4êW:Â߯Y¾ |~Ÿ©Ÿe®þnÂÅZ7õFÓ†§"ŽâDnRËšàõƒ¦°‰ l›—ú¹¶z~ÓA­^ë,Žò,‹#™­¨X>G˜@ +E"H0Y´´QýÐò„1Zœ Bm…5`;;€/ò™ç·™Ëª²+‹}T*ŸÔiþâ q­Ýœ!áù’©Ú…Ù@º(ð¡ $iEóH“Γ¬¬ÒÆŠº:*ú"c§nðæ~“D›&Û‘mˆ^kš2%иk)Cœ`تK-Ø”K Lê^‰ÖåK9r©ð5¨>ߎ71r±OÛ|¥7£MX 8R( Ìÿÿظ£Ü„å“6õypÐ1lÊ1f ¤Ÿi>"<8ÀYƒúŒÛžq".fmÆÒ3ûl—Üf¦z‚- ¯ŒA¸Ûr3R9ŸlbS1a˜‚.ë»ÓeÕF—UîCd10´Tóä[¸½K㉂:ź +?§Ç˜Úµ²¡¨aRÄݶ¼CQ?\PÇåÓ¦©Q‡8÷¨IÎjöXº†È®êÒÇjêKªÙµr qpš˜Yx~;0ä3ýV…mÎjÛS00аpykâd‡&Ϋ‹ÕÇÁ©SÍjÔáȺwhì4ø¥½at´èŽž>ä¢à¼#Bwô4¨CŒ{Ô¬ñºãè¼újà$S'k¶OÓ%Îm’…¥I ›d·£êrèê$ Ój£Æ3Ô{žžu;ø 0QŒ{’ ãö¸ÁgÒ +ÍàÓ7ÃààÓb~þ#ÓÈx¯r8>9ЫlØ”y ¬*TeÑcK|D™té$[ƒê³mFJ:\ëN¤ô@sÊ¢hèbFìóoöYÔ”4s¤zTjŒM€ö‘ɧB83ñéT²Qã©ÄO)÷Ùì¦Xÿp³ëK8Øìj˜q§i¾¼—Ê‹t=Ð÷°i#Ð!º´¬**O¡]Ö08ø^×Hã†ÐðCBt©Ž÷|ŠåAˆNën@ØöhY ŸM‚Ê`äñ ? Okø¢ÕðÝ©†¹ pü?:]]ýy¶:ý}°ï{PHY@€¤oÆäñ¾oðK{Ã@ûíÑíû c2“ŽŸÕ¨ŒûÔ¬ˆòl]yg¬ûSb¸ØÝÿráƒ+íKs‹ÓT¼šlg|/öqçnÊ»›²/Šˆ®‡C×IÖR ÚÝÅQ"½k-ü4Ì”<2è›K,%@Ç#.%ˆqWF‡ @°AQã—ö†~BõéV]»ŠÕ³“Ëã…+Ï¥„ùj°ù‘ Xã)[>y#ÛmèÊvZ–ÃlJDù8 +³v?ÜïLï22ÚĽÊÅ:y!ßäµ[÷(…uµ¶3׿êmú‚Ä„OUá!êÌHÙ»á”Qùp—Daš>,7A^ÖÚD—E´Ñ*4í<‡vRiÑoz¦“R +i!›ë¶k£•á…ãÁ‘ ÒJÞEž}´FU1°ºZýúñ䨺Wñnßb lÝbU§q˜eÿ@,pUãþ¹ZÒ´­÷»çj»MªL¶q5‡9ž@+£TíM8J-ÄaÑY >‡ýS­Á‚›ìä¯NÞžžUŠI:¿Ô^õQ@ wÙªÙF…:QŽŽVG5µøý»¥ÛUüí.)âʆµØCì’ i2ЦÛж´¢ZI¿­>Ø’>û §åìYÃu9°ù_…Ó]|€Í&4¾’ª­¯ò}Ù±à0ñ1ÛêÏ.½ýÆ_¢ÙßýØD ßzƒßÀ°#Ç.žôªúæÃÂZ§?¹Ãüª¹AÎýZ)êÛ8‹‹fÒ6]è½yx'‹Ð^ÿߤª¿ø%e/©þäF1ºÈJë±¼ÿmÎ|8ο=ÜöïÜdݰÒåendstream +endobj +2736 0 obj << +/Type /Page +/Contents 2737 0 R +/Resources 2735 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2701 0 R +/Annots [ 2740 0 R 2741 0 R 2743 0 R 2744 0 R 2745 0 R 2747 0 R 2748 0 R ] +>> endobj +2740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [238.4524 726.9533 264.8033 737.8324] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 567.8253 135.0008 590.794] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +2743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [262.8109 509.031 289.1618 519.9102] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 370.1174 162.0093 393.0862] +/Subtype /Link +/A << /S /GoTo /D (a00036) >> +>> endobj +2745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.8747 370.1174 210.1583 393.0862] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +2747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [274.8955 313.1712 301.2464 324.0503] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +2748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [420.3578 271.0632 513.9963 281.9672] +/Subtype /Link +/A << /S /GoTo /D (a00158_g55ce98ea4d6f22e9d5068b904d4d2447) >> +>> endobj +2738 0 obj << +/D [2736 0 R /XYZ 90 757.9346 null] +>> endobj +2739 0 obj << +/D [2736 0 R /XYZ 90 739.9346 null] +>> endobj +2673 0 obj << +/D [2736 0 R /XYZ 236.6686 544.1142 null] +>> endobj +2742 0 obj << +/D [2736 0 R /XYZ 90 527.5172 null] +>> endobj +2682 0 obj << +/D [2736 0 R /XYZ 236.6686 348.2544 null] +>> endobj +2746 0 obj << +/D [2736 0 R /XYZ 90 331.6573 null] +>> endobj +2735 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F52 1229 0 R /F14 636 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2751 0 obj << +/Length 564 +/Filter /FlateDecode +>> +stream +xÚ¥TMs›0½ó+t„Ê®¾å[;i2õLgÜ)·4bãÄRŒ'õ¿¯@†Bsép„žö½Ý}p DKM-Ьg÷û>°ºýtøœE7wÌK­bŠdÛ.‚B*2’mbEQ')“¯êM\5Õ±Z¿&qÑýÎ~÷Tçõ9I90+bL³eô%»]’+liE@6Nß2Ê­‘äÝ-€¢µŒ"Áx¿ØG?¢ï—8~£;0—ž`.5ƒœ¤\QƒVÌ¢Œ¤€F»J0¤ˆ’ÍWÂX +À5ÑœSÐ ºr¬ÚÄó:?MQç‰À¨æŒ‘aè^ÀDÈ=Uâ¦W%šjäòµ•òæúЪyˆà@TrVÄ•¼GÍ”ɹ¤†k3&ÿ ŽM}Z7Þo)œ›;ƒÓ’S¥MKêO÷ …ðMë1}ÌO!tµ+]±ý¢©ÂøR„ÝzäHúŽ Ñ •ç}s¥ÔG}¨Vïº*7»fW•f¡¨PZ}Ì܃&Ìã&H¤B;bÎú\%ŒjôÞyu:´­êDʸ+IUˆ—º#Ý]hãÝ®?¬DÊ›þ‚—Škæ'ÕÖí‘}10}¡s·ßyGèÙG \ž¨¤ú¯‡¡{ÙŒ;‚|tµš›þa "Úd¨ó¦Ø„tBÆßúÉ2AŸÂCÒ Æ üЍPۄɸ +=}]4 À§³o«ßççbbé¼?SŸ?*æI+endstream +endobj +2750 0 obj << +/Type /Page +/Contents 2751 0 R +/Resources 2749 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2701 0 R +>> endobj +2752 0 obj << +/D [2750 0 R /XYZ 90 757.9346 null] +>> endobj +2749 0 obj << +/Font << /F29 499 0 R /F52 1229 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2755 0 obj << +/Length 2441 +/Filter /FlateDecode +>> +stream +xÚµZ[Û6~÷¯0šXsy¿ä­É4E¤»ÛÎ[SŠG36êˬew’þú=I™eR-² tû|¾ÃLJ¢ÈÙ\vµ;¿;®/ûúp®ÎÛãaùëýûÙw÷±÷K0I,íg¿üŠçàßûFÌh1 Œˆ1t¾ŸqÊÂÅnöóì?÷ ýÁXóaãí#ÁH¡½ÊµO"¢—+‚1´¦ÞO_\k>íŽëßÝé¾:TOµmš»~¼Ö¶m¤³N¢µñµÆ¹`uD¼ý»ú\mwõƒWݬOÛç-0Ä¢n°vÀg)—÷efûà#œá´ÚÁ¹‹<\ëÅéx9ouãž>ŸŽK"l¼•Êšíþyço}©Ï|\R±x©O—‡…GÇGgýööãñ䳑Úžú$ѯ¡¶e]¼ eûaÐwÞrÁñ#Æô³õ>Ä­ÙþY£Î’B’rëos‰·IÈwëÝo¬d×Á/îþC½ÞU§–ž¾lÏwÿ }05Ã)Íù\r‰°ÆÆ©Ò>:=yÌO‘>;ü*þiÜû©]ÛÀß}xó ÿ$ñ„S¤¥82TbçQŽUŸ}_­OG´„6ÈëH„ÂæOœCOÇ}ÛeЃ޶imŸ7>‰D±·#/Ö†?ŽôÅ )B¡ñŒ#8êB/tøUüƒ4©]/ØO¿µí»ÕT$1˜êû3èŒUòBR„ d™žaþÃE¥:ø¹h#÷ÜðB!‡)˜QSCØá Χv»>žêúV¹”HpNòìP%'¤A˜q5A4$×a¢Õ\‰¸äã3M­bT:›j`Æ ˜±Fœ@,óÇsýzÈ +ó,RŒ’W¾ZL³qˆÆ]ú+v.° wá4[¸ñ°Ê]_›Æ®M£ [Ôþ'߬ô;Ùl]ÃèbSyvíëÍåð{3Vc Åa¼N×PÅÏ[k>âµ^Pfãs‚_–D/ž\lGêaHºTÙÞOÞAýÛŒ,¸†š(usÑÆÒŒT¦ùÕŽ%ûH©HÓ,ü +¢•gìP%^˜Þ –rÀ %ë.I—„ÁІš!óíñð%»aŠ]r¼@ët¼ÂêNÀê.‹ ˯•m¡&½zr$\ +ÁO…¥W4 <×à©ä.µÀl¨Œž{˜ót¸êZR¼ðÂë­jàú´äbáW6(íYç‡ö%uÞcï0G4Äî¦ì8¸¯•(É.Àʲ‹ æd—çíd×ã-ȮǀR”}š¸tWÛa|ï[(–$Ó¹ ×»VîÞcÔ¿yÞ®ƒcÞW¾¥ 9—HAÕ< ¿ÝË_r#±*ÛßÞþëÇ·ß. !‹{š¬r¨„L$d>ªàDjÍenâ—ò m«lwN^½jèˆ(,M°¢ä¦b@F +¬(…,ãU +Þ …oY +}ò R(¸‘Ø“Bª +Ó/„¢C|H­e•èt 9¢ 󌦷ëêÓI€•u’cŒt’çítóNÐI|ŠNòn$vƒNLìv‘“o~@•xkAö½Aès_ +„ëÃe?º<÷%•ê/¬§Õ'1:SQu07uÙõî’©EÞX¤oqC¥u³Ž¢Ž|jå£ÇgW;δ4n‹à]¼u3* +ZžY Ä€ÜP °òPÉ1FC%ÏÛ •˜÷äãö!­ M ÖèsgJ(/y‘ØíЍía›rJƒ®M!T¢Ö eÔ ð6=Ž‘k$(çSCÐá ~¤v u$•q»y•B‡Jé¡zˆßšBe‡aÀldw±]\q h]Ì¥ ¢›6ct&mt0Kÿèc[í¶NÈaÿ¢ò[±/Uïµ¹'ÞîÙ®Ó°¾´*»]×â KíßX3…”$£á½Ò{P‰}hË’ß̯DqRå_åõˆ}—D‰)U™¬˜cƒ™”Xà )±Ç§ÄáØÁ¶3~<„1Ó¯0(bš‰ƒ™ +ÃãK®&vû[ŒéÚ“ É4-* JìÆî‡AŠíwÐíÔikVÅäÔ(tø‚©ÝRê„ɨ¤;†©3 Rú~÷à Â%'Ã0ÜNlRê„ê‘2E&¦ÎKÖ~ñàwx§&ÎG÷&kßÃ0c{³«ÐH³a»o'W/´<±ZL­#i4ÿ•= Jô‰µ|veQ#ï«dWTkSÊ®Vή‘Á\vÍóvÙ5æ]o@ #ŦàTx³Åf‹/yØí}T›ðS€šP%rMÇv™Ñ ûíœI0b\É©Aèð?R»ÅrÌχ¡C¥ôƒrS#Å4†aBÎôëÕÌ|ÌìGŠ æãœÑçó)›ŠáȰœ¸¨ŒÑ¹T`nñ[}dœÁ?û¥uû!ßñÒìþZr6Ê>+Û^(ngç€/D#µ[ÊÏœAµ%Íx§\¿í ¨j-›Ÿ„A3mkB&‡ªpÌ; 2$Òí7ýíOYÛ•#ŒÆ¯/¤­Y´v%¾(Gåö­¾¯õéúUWØ£úNÞ[\ü¡þˆ_Sö:lÞC³¤× ýl¡ýzSŒ}Þ¾¹»;~þòT'õÚ¯mƒkQ”þ÷µÈ7endstream +endobj +2754 0 obj << +/Type /Page +/Contents 2755 0 R +/Resources 2753 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2701 0 R +/Annots [ 2759 0 R 2760 0 R 2761 0 R 2762 0 R 2763 0 R 2765 0 R 2766 0 R 2768 0 R 2771 0 R 2773 0 R 2774 0 R 2776 0 R 2777 0 R 2778 0 R 2779 0 R 2780 0 R 2781 0 R 2782 0 R 2783 0 R 2784 0 R ] +>> endobj +2759 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.7882 642.9278 343.8612 653.8318] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +2760 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.7163 630.9727 260.5985 641.8766] +/Subtype /Link +/A << /S /GoTo /D (a00159_gfe5e93119035e14cc485760a176249ba) >> +>> endobj +2761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.5434 630.9727 467.5403 641.8766] +/Subtype /Link +/A << /S /GoTo /D (a00159_gceb952d27de8125d5146ac0bee325b8f) >> +>> endobj +2762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [268.7434 593.3114 307.8165 616.2802] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +2763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [124.4207 581.3563 163.4938 592.2602] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +2765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 486.8218 162.5475 495.6685] +/Subtype /Link +/A << /S /GoTo /D (a00120) >> +>> endobj +2766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 447.8916 163.1055 456.7383] +/Subtype /Link +/A << /S /GoTo /D (a00121) >> +>> endobj +2768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 363.8772 196.4299 373.8049] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +2771 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 306.282 227.9818 316.8123] +/Subtype /Link +/A << /S /GoTo /D (a00159_ga680bc3f3a1a8a6aec20fe729d138cb8) >> +>> endobj +2773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 293.2926 223.0005 303.8229] +/Subtype /Link +/A << /S /GoTo /D (a00159_g720ac440c7b24bdd07c53ba146e36fb2) >> +>> endobj +2774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 280.3032 178.1689 290.8335] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +2776 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 197.3698 179.0853 207.9001] +/Subtype /Link +/A << /S /GoTo /D (a00159_gd58a6c7e62ae59bf7a016ded12ca2910) >> +>> endobj +2777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.5282 197.3698 265.4205 207.9001] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +2778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.8984 182.3375 338.7573 192.2427] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +2779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.3873 158.4396 192.6345 168.9699] +/Subtype /Link +/A << /S /GoTo /D (a00159_gfe5e93119035e14cc485760a176249ba) >> +>> endobj +2780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.0774 158.4396 278.9697 168.9699] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +2781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.8358 143.4073 391.6946 153.3125] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +2782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 119.1358 180.9085 130.0397] +/Subtype /Link +/A << /S /GoTo /D (a00159_gceb952d27de8125d5146ac0bee325b8f) >> +>> endobj +2783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.3513 119.1358 267.2437 130.0397] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +2784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [397.2067 104.4771 431.0655 114.3823] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +2756 0 obj << +/D [2754 0 R /XYZ 90 757.9346 null] +>> endobj +2757 0 obj << +/D [2754 0 R /XYZ 90 739.9346 null] +>> endobj +150 0 obj << +/D [2754 0 R /XYZ 90 739.9346 null] +>> endobj +2758 0 obj << +/D [2754 0 R /XYZ 90 716.7313 null] +>> endobj +2764 0 obj << +/D [2754 0 R /XYZ 90 503.7525 null] +>> endobj +2767 0 obj << +/D [2754 0 R /XYZ 90 381.8888 null] +>> endobj +2769 0 obj << +/D [2754 0 R /XYZ 90 324.8962 null] +>> endobj +2770 0 obj << +/D [2754 0 R /XYZ 90 324.8962 null] +>> endobj +2772 0 obj << +/D [2754 0 R /XYZ 90 310.267 null] +>> endobj +2775 0 obj << +/D [2754 0 R /XYZ 90 215.9841 null] +>> endobj +2753 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2791 0 obj << +/Length 2035 +/Filter /FlateDecode +>> +stream +xÚµZYÛ6~÷¯0лX3¼%nч4GÑé‘.ú’VÖÆFm9•å¤Û¢ÿ½Cñ°$Ò⦠+d)ñÓ\Î|¤Kæþ#s…ç™Èb\ÎËý ÏßÃëogÄN¯`~Õ|s3{ôœª¹BJR9¿¹ë$H‚%t~³~½ˆäËxñ²Úš{3¾ÝÊ_Íp_ÔÅûj_Õ­y¾;Õe»=ÔGx¤™” ‚Ùòí͋ٳo‡5S0I´¿Í^¿Åó5˜ûb†S¹˜‚ŒˆRt¾ŸqÊÜÃnöóì'/ÇLtļ„ÅÝ%)!¨ó—‚ûÙÙ]D—+‚1^<­Þ`LëÊ8öôPž´›…öN{4Š„–rĸêKBÄÊúb=öòÙËoÞ`ëb_]™WǶ9•í©Y’|áÞÕ§= ˆÖv–O:ù¿,]»Su=Žn.&y6—"G˜qÒM#^õÑ&Nr‘Ë0±aò­ý¨ÃP.W\+7EcFÚ«wO~øþÉãïÜ»}µ¿}WNu«]y .½ýÊÀ߯;×DJH ù‰¸„¥kp¡©RjàŸ‹J°/.ˆ7ãNL—ÞGóBK7£¯ÍŸ?Û?ªÃÖìíÒJ¯,þ´¿i&’"¡0ð€X]Mz ¿úxØ®»)š#©(h °xÞ¾ìf8ÊrJæ½÷Zt2„Ù g½ _Q H‰€‘@ì“÷´*wEc»°Ua\,ó€dHRλ/o6[]&ƒ*R63t¯NÇjmF­1kVìvú‘/Ö^/Ìæ+L0<ÜYÑÎ-iS´fTµý¢«»½7òÛMå‡ÒT€îÙW»³]m!Ö?-AïlYïĽ™²^Íla^>±OMSXاm»1£ÂÊ,4/¬Sðn_´åƈ"Ö|üP•[]|:aRô¶j̸‹€\Êwêµy "¶ÍÐ1Sܶõz»¤bñq»>;[¿À ct™Ÿý^ì?ì.*A(Â<{Xê£eÊÍ»=¦Ó»<ÔueÖÉî©ñ¶•ÌãzÛHýðÕ%ãy,Sñä­î£Â¦›+„1Y0Ìÿã’Àvj`g¶Us ‚G0…-;;f@`ˆG‡–À’ž-!8Caâ,U›ÒÕÀ±~†Ç9™€GE"Ð/- ±\ñ¡^³hn‹0¥Êä+¼iÝ”ßÞ0é6*¼ÖK»+Ú.ÍáÑînuiä ÓåŒ9òEO5ï-æUÏ+OxÊÕ^uev[ouÇ®½ÌÉ‚'BëQ)#iÚˆ«@iLJòÐ8|J} ×Ç +¦—‚À™R¢&ƒàQ +8P Ae>´Bº±Z!€¸eü¡aðø”\†»¦ª.EAÀ~$ŠäÓQ𨄡4ÇÐåòä…åDÅ·÷¹¬ô`SeÅÁ:¦[ØX/¥HŠ,¡Ö‚B­Ã¢B¡ ±œµš¢b–uEþVE¹ ùK¹9Õ¿ZB¾­-§¹om³‹C sh‰ õ`SAs°®ŸöaÌ$\o±Iµª•b}ücj¨ÖG­=´®ã{Ñ a¸ã0p­“sf…Ñ® +lövžèª=ÔDW¥ ȯ]}ËE¦úé„jŽTN8 §‹‚_¹ˆ…,ºÂ¦Ml«]]µkT&ríD°éèxTJy M+7X–•1$úÝvké¯fûöпۺƒ­Ê‡ù ¿ØU>7n—/Ðùósï(¬‘1” v>?3{z~niö??‰3ÿ¨y•=7=z«yþP21˜ºhn.FÒ3Ä3j!ç6æ¼õ„r´v”Cýgð!ƒ¢$0g‰òøUÿƒ0ÉC¹Þ.KéÇ}CŒ1¶‡†ŒÉ…C…êcú¯«?GnPБ‹F68÷Ñ7Ý0<ƒêò4¼ ylNe‰#¨½Ÿjû®7+bö|¶6OQöÈÄŠÑ.´D's‚99üªÿA„9rûgš(qÌ%Ês–,¯­C¥ôÒ|ˆ•l*a}q&§Kvu¹dÓLiÒøy¡˜Í7°$Þ|=Ìgí@9úF†M{ïQ÷‡„NK\È¡ÒÇ“ùü¡©ÌIüpÜ=8e),-%”̾\>á@(7™²Ðœ©JÄÏÚYÓù +…D +¥ùÚCMä+gH{듦Sª?›b„F)†‡=ŒbLFçL1ÊiÿÅê£ÝDñ¯ª»ª©ê²:žá¶O^_w÷®W‘ xˆ½67½õ:2¯Ï(NO ¹Ä¢OOÜæ6Ý »3¿TI~¡/P€«!¡„ð<µ¡-|ÕÇGØÅXj‚\PÅaß°±£ôñ¨Pû€\P%5§jÿ/¸…]¶ &9 õ: ˜àEÚ&¢Ø-ŒhŠÒHðOvÕ¦GjžVÅ¿¡5ÉvqúŒ~ÁED™0аYŠâ8üªÿA¤brSý‚S…(×)9°d|-äP ý¡´É–ùÈxâLzÆ\nÃŽ×ÌîsèM¨|‚ÜŒ¬ˆS š&6>ŸiÍØé(©¨ëRíÿ`6 ºŠØ}¹ :ô¤c™INÇX¡ËæDì> endobj +2795 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [324.7453 474.4264 376.5504 497.3951] +/Subtype /Link +/A << /S /GoTo /D (a00159_gd58a6c7e62ae59bf7a016ded12ca2910) >> +>> endobj +2796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.3663 474.4264 437.2485 497.3951] +/Subtype /Link +/A << /S /GoTo /D (a00159_gfe5e93119035e14cc485760a176249ba) >> +>> endobj +2797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [454.1911 474.4264 508.1881 497.3951] +/Subtype /Link +/A << /S /GoTo /D (a00159_gceb952d27de8125d5146ac0bee325b8f) >> +>> endobj +2798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 410.341 142.7416 431.2524] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +2801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [244.1409 324.7746 304.8028 335.3648] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +2802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [348.807 300.0021 387.8801 310.906] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +2803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.2161 264.2545 324.2892 287.2232] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +2804 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 230.5641 142.7416 251.4756] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +2806 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.3477 153.4162 295.0096 164.3053] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +2807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.1676 128.9426 430.2407 139.8465] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +2808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.4576 93.195 334.5307 116.1637] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +2792 0 obj << +/D [2790 0 R /XYZ 90 757.9346 null] +>> endobj +2793 0 obj << +/D [2790 0 R /XYZ 90 739.9346 null] +>> endobj +2785 0 obj << +/D [2790 0 R /XYZ 90 723.1038 null] +>> endobj +2794 0 obj << +/D [2790 0 R /XYZ 90 723.1038 null] +>> endobj +2799 0 obj << +/D [2790 0 R /XYZ 90 371.2512 null] +>> endobj +2786 0 obj << +/D [2790 0 R /XYZ 90 344.9853 null] +>> endobj +2800 0 obj << +/D [2790 0 R /XYZ 90 344.9853 null] +>> endobj +2787 0 obj << +/D [2790 0 R /XYZ 492.0776 188.3053 null] +>> endobj +2805 0 obj << +/D [2790 0 R /XYZ 90 172.6296 null] +>> endobj +2789 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F23 482 0 R /F52 1229 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2812 0 obj << +/Length 1157 +/Filter /FlateDecode +>> +stream +xÚÅW[oÛ6~÷¯úd3Ç»D¿µHV4@€®ó[[ ŠL'Âd)Ó¥iöë{(RŠdÊRŠ ô Jüx®ß!I€á!ÂA(B¤—ArZáà~¿_7½…ùíðn¿úõ7ª…”¤2Ø[ ’ A ö‡Ïk‚ùfKa ^7>ÂPà5AØn‹C“i;¾*’æ¤ó:®Ó"ß|Ý߬®÷½bg—`’µ¯>ÅÁì»YaÄT$‚'øÀˆ(EƒÓŠSÖ}d«?V¿÷rìD»`Ê=N0¢2Œ°Øz4…"˜¢Q +¡ àxHûH:ˆÁ! + A‡2áx¬ËsßQˆ1%ƒ4_gòt‚G”#FÉHå[ßÇ"Ík]Úºpïý“>å³ßeEòW7×v”Vã•wnáAÇàãZйg‘@˜Da EL†á¤gh;Dù¼Š˜…Aˆ‡4j]û¤ë¦Ü±Î«V›%2¯½GM¨gSÉìaFÿÞ„¼Îõ†Šõ“ý(õQ—:OÜ\R4ym‡Ç¢4bãnþtq7cw3ü‚®Š&;¸)Çö•í»j’DWÕ±É2'cAìÏNë–Œ—+ j àRB8Ž™òûÆ¥:=ØA^ÔNyÛT5¤å~#Öqva—éÂ)ŠpDè2@]¦‹…’±Ö±ëïñé1Ós\™QÍ‘Š‡a;gþ”÷nêÓˆQŽ)N3ªƒkåº> Ä3‘rÁæ£Ó£–”{ÒŒò6#ÁVt2`‘eú•þ‚1ÍÓvs¶‰v‰ÏÒÜm¡²ïâhßfEö²¿Üm8^£õ” ‘¤œ»Bv%S½ÀÿlYRívmý21îwœ&æ«ôݪ;#(gŽn}“ˆDˆ!¶Üa¼þ¶1%“¦àxçf]6I}ž jD2¡!☒žôøípÏd_®±yà§gˆÂR¨å±!gLéQ¾z ù@½bˆªsõZf;:òBÄáÐÁÖ‰À㎠ݟ,fHÍ-…lˆ¶ÄÍaÆ•ÕøÁp/Î ££}fñÜz2ÙŒ«î°J²¸Ô.µOiýà/’(2}ƒ€ +ÁP IìàÛÞ/7Oªñèöúö¡S‡¡Œ28¿U46ã,…=h^¹'«/õ©ÍW`†8Îê!êòæ+ˆ¡ ³gõÇ6e|Òp¶ÌlÁSÌÛž%Ó=Xë©9nÁÀPÉÙ¼÷=jÂýq†aVȱҷ³„},Ûâ[ZTÙóÏúl~fö,[[ü‚¾Ü×ðvŠùøu 힬Y¾rØ–"ÇÈ,_‡¨Ë|å!°E)ñÊfaNõO7 ¾…“ÍB{]³0—faA¹'í?hýßš…Ñï¼yeqÑ +·êΕ­KJÛ3t傦î³NÞ01ŸH!ÿÕU·½«G°„°Q,á00[²)4XÈ%íM1n½×¹.ÍõÁ¥'ïnênpcúúÆ}—D‚w”í¨»ÕSŒ¥ÍžV¸›„ýïBvU|¾×Þ¥_6¥É.Í?endstream +endobj +2811 0 obj << +/Type /Page +/Contents 2812 0 R +/Resources 2810 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2809 0 R +/Annots [ 2814 0 R 2816 0 R 2817 0 R 2818 0 R 2819 0 R ] +>> endobj +2814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 641.7124 142.7416 662.6238] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +2816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.1396 562.6724 291.8015 573.2626] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +2817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.903 537.8999 324.976 548.8038] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +2818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [285.2161 500.2956 324.2892 523.2643] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +2819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 464.7486 142.7416 485.66] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +2813 0 obj << +/D [2811 0 R /XYZ 90 757.9346 null] +>> endobj +2788 0 obj << +/D [2811 0 R /XYZ 407.944 597.5968 null] +>> endobj +2815 0 obj << +/D [2811 0 R /XYZ 90 581.5869 null] +>> endobj +2810 0 obj << +/Font << /F29 499 0 R /F52 1229 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2822 0 obj << +/Length 2497 +/Filter /FlateDecode +>> +stream +xÚ½ZmÛ6þ¾¿ÂÀ}±šÇwIý–k¶E‚4Ý&›»Úb¡µ•µ¯¼µìns¿þ†IóE&uèâ^Ëg†3Ï ‡É Ã?2«ð¬ª—³Õãž=À㮈þy ¿/]À?n¯þþ=­fª$•³ÛϽI „În׿Ì%"ÕbIž¿~ÿqøã° å¼éö»?Ï›Ãâ·Û·3ŽK„…5jÁB=½º¾µºµi‚I¢4ÿ~õËox¶ß^aĪRÌžá u=^qÊÌ—ÝÕÇ«Ÿ­œá‡~ÀØ aãS$ÁjæHaÊ…;E‚qfŽƒ‚*!z1àK&R"­DŒ æXowÍZ»®éV‡íÓq»oµ æ¸äPާƒœÛM3Œ:½¹ =¯-Ê¢þÉçS»Rb»ák}0c;£û¸>wûý—Ó“† ›}wlëG=¤nõˆÇZöG_„Öž›ÃvUÆÊz½û:ÔÓæD +$)gýœÞ€$V½m 2‡nxR»m×Cð|ÿyxâÌu=übÌÕ#›ZYÕíðè¾ü~‡adþ¼=n†ÇGðlÀJV2TQVÌ$PF–L“JýtxИ½,~é8æÆ4–«Ü0ÌénůX`øOB“8‡,‘\&<·¨Œ!\Ä…`¾!†6h±,¿oTÌŸûÈ-!A‡KËuá8_»w¹ú㾉¨¹6ܶš@±ãÁ7HÂìg0TÐ’eoñKw@<ßX®ãxÅ‹¯—üN+‰¨€¢á[øÝ¢rvT%*¸ò»kÇÙォ)Ö ,¼ýkÓ(çÊ>9¨ôònênx|ß\à|øMMr~ý¼?µúqŸÉrHõ½Ý·ËFûò¯nÊ/ߨŸx³½Ú¯õoPvg«zr_¯¾hÕ0ߥ-úR¨™´Su2aÑ‚ñ™$PWyYdèañKw@–X®CÞQ—èA*†x‰«À¢€•³£°þáÛ1”´¾Ÿº£Ÿ`Ûǧ]óØ´G“_÷_ÏÉ5ŒÙ¯O»Æ<4’`%è Q!æhluƒuL›¸dXžz¿‡U­YÛ”—Kv±íp#þÀqVò³¥ìWJ£>‚`E!g’-*§Ú‚ +KèŘ“jµ¯BÍ Nj|ΆH áÙD–@‰f˜Ò´fa +†Ä +ævÄa"ÐÁ(Š£çÞIàY ¶JÞÛ +}.ªrfaÊV§mbÅÐ6™E× +Õm4õÚ<Õ&š{~|C#¬ÖF†X ëEòZI‘#ŸåÉçL‘/­×’ÏÓ›!Ÿ§y +ùÒ6Drò­bòaX´ $} %µä+'’S$‰S4/ÏÀ<ò©eRw¨¶©5­«Û¤íFK¹LH^$E5q&.ÚnAÎÕHÉ…DBm™úI4*ìíhiåŒ!J +~‘Ý. Án ˲;©ñÌîŒ^ÃnOïßÖz¦‘r.¡O*H ü2Á >gF$W™ñéÍÍݧ×7w¯nn¾{õî]ÜJTñ’¦=aQ(«T*ßÝtÔOOª‹;ì'K&/W5Š»åãžÒèÄ=­×ÆÝÕ;!îžò)qO›ÉUf¼ÿ›•²à™éTNoý~QzUWùÇ‚Âöv»º-Â=† F)×§'à(6rNn-É##Šº—9sþ=EÊ3&¡Î!LR©å‹£t]\ÍSØ’´!”ªløñÕ¿ï>\ß~xsý1ªjUUzþ”Ö •¼ª<ÝåHhì-pÐy±u‰àZX6ºIçðfôšøzzóö•OˆpÆŒH®2ãÃõÇŸÞ-ÆóÞ]¿5tHœÐ2í ‹Ê˜Ao0á›ÁÇw`\cý˜=ò¡lo%#—wa. EËS$¥Ñ¡HZ¯¥ˆ«×­—áÙ@E`cêëNž ôøœ‘Üü2­öû˜äÜ A9ý•€†^pWޱs uJô²ärÔ@*ê–zJ£õ´^uWo>êžî)QO[É O„"KÊq×]£NРœöR½‡àEà{ˆùjSÆ:( ªÆôNAm†¾‰ŠçˆKXt&zÓâ3ó‰å*NDÞ#¤Ú*¹S­«+öý"+Øo‰Ä ÿ0íŸí“ÚŽùéÍÕ…äÓv~.:±‡µ0eÃwé©¢þÿÅÎðíy³]©Ó’> ì¼³S iÚÄÛ3¤gôÅ=.­T2â8t¹¼ÖÐ’¨×}¹í‰…e«Ž+0Qu2zMÕñôf«Ž¯{BÕÉXÉuªÎjß~Ž‹4œ—'TN} iÊDè|(;cÅ®ИLu€Ág-å^.Z+^é©[T¬Ø/*hÌ» …bÝv]sÐçæ©zA¥TŸbZ½pщzaa}½Ø·ª{~8 ÇW£Ež‹)£ÍÁ«9;u©ú—áiw¹4¨êN^â<–r‚Jµá͔˗G`¨Ñ1Ã\SrÖÙâZ7Ê\Ò¿Œ$7õH®Sµšã9=âf°*iGPÆ +µ¯.úzàû!Ý'[S /åÄätЩä40eÉO÷ÇzÛïÜV§Ã«íq÷Õ¼ñ’x=ž¶É3iå +^V/ó’„bŠ.sgC–OJG`j½Nëµéæêͯמî)ëuÚŠH®Ãüm»S¿PwÉ8Á rêKH}JŠÀù)OJ‰ +Æ'¾tÑ Ê[X¿êô;/fY%ãÓVRª6ux´Çàx"…üK·µûD…æ…FÝ«À"u)D_Æ&*ÔPlhÚæPÛKnÆM?š?ÞªtÒ_ÕŸø[ʾ¥xø’Ú¹êZ«q°½NMöoнÞÿùõ¡iCwª«äÆ4Ç?ÿYÚOaendstream +endobj +2821 0 obj << +/Type /Page +/Contents 2822 0 R +/Resources 2820 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2809 0 R +/Annots [ 2825 0 R 2826 0 R 2827 0 R 2829 0 R 2830 0 R 2833 0 R 2835 0 R 2837 0 R 2839 0 R 2842 0 R 2843 0 R 2844 0 R 2845 0 R 2846 0 R 2847 0 R 2848 0 R 2850 0 R 2851 0 R 2852 0 R 2853 0 R ] +>> endobj +2825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.9274 654.5304 448.5608 665.4343] +/Subtype /Link +/A << /S /GoTo /D (a00160_g66d19181ad5fe8b8f7c84d1f1d46a2ec) >> +>> endobj +2826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.6088 642.5752 297.2509 653.4791] +/Subtype /Link +/A << /S /GoTo /D (a00160_ge4dcbbe6c641d2e3b8537b479df5fc99) >> +>> endobj +2827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.2771 612.9957 194.4771 623.8996] +/Subtype /Link +/A << /S /GoTo /D (a00160_g6d9751d534453425c7a5a215d1d4414c) >> +>> endobj +2829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 556.6105 162.2985 565.4572] +/Subtype /Link +/A << /S /GoTo /D (a00103) >> +>> endobj +2830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 516.8967 161.7405 525.7433] +/Subtype /Link +/A << /S /GoTo /D (a00102) >> +>> endobj +2833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 430.0643 237.9445 440.9683] +/Subtype /Link +/A << /S /GoTo /D (a00160_g3d768e989e308144190ae1a5ddfa9726) >> +>> endobj +2835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 417.0567 174.2837 427.587] +/Subtype /Link +/A << /S /GoTo /D (a00160_g070d2ce7b6bb7e5c05602aa8c308d0c4) >> +>> endobj +2837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 404.2781 216.3555 414.2058] +/Subtype /Link +/A << /S /GoTo /D (a00160_gecf13b8dc783db2202ca5c34fe117fc3) >> +>> endobj +2839 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 390.8969 231.4091 400.8246] +/Subtype /Link +/A << /S /GoTo /D (a00160_g221d37ccde7e3fd0dd2c2eb0a6b15493) >> +>> endobj +2842 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 331.4782 194.0092 342.3822] +/Subtype /Link +/A << /S /GoTo /D (a00160_g7c5359305008e9183b18d6ab75f568bf) >> +>> endobj +2843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 318.097 188.4803 329.001] +/Subtype /Link +/A << /S /GoTo /D (a00160_g6d9751d534453425c7a5a215d1d4414c) >> +>> endobj +2844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.4737 318.097 268.161 329.001] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2845 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 278.7567 182.941 289.2871] +/Subtype /Link +/A << /S /GoTo /D (a00160_gdf916e0c752f5cda70d0bddb2be422ba) >> +>> endobj +2846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [186.7567 278.7567 211.444 289.2871] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 238.6693 138.5977 249.5732] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.5678 238.6693 214.2533 249.5732] +/Subtype /Link +/A << /S /GoTo /D (a00160_g3191066cf8f76bd00b6843b77c37068f) >> +>> endobj +2850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 199.329 178.5273 209.8593] +/Subtype /Link +/A << /S /GoTo /D (a00160_gb50f78bbf36d912d69f6c1685d0b40e3) >> +>> endobj +2851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 159.2415 138.5977 170.1454] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.5678 159.2415 205.5661 170.1454] +/Subtype /Link +/A << /S /GoTo /D (a00160_g66d19181ad5fe8b8f7c84d1f1d46a2ec) >> +>> endobj +2853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 119.5276 187.9223 130.4316] +/Subtype /Link +/A << /S /GoTo /D (a00160_ge4dcbbe6c641d2e3b8537b479df5fc99) >> +>> endobj +2823 0 obj << +/D [2821 0 R /XYZ 90 757.9346 null] +>> endobj +1315 0 obj << +/D [2821 0 R /XYZ 90 739.9346 null] +>> endobj +154 0 obj << +/D [2821 0 R /XYZ 90 739.9346 null] +>> endobj +2824 0 obj << +/D [2821 0 R /XYZ 90 719.2952 null] +>> endobj +2828 0 obj << +/D [2821 0 R /XYZ 90 573.933 null] +>> endobj +2831 0 obj << +/D [2821 0 R /XYZ 90 449.444 null] +>> endobj +2832 0 obj << +/D [2821 0 R /XYZ 90 449.444 null] +>> endobj +2834 0 obj << +/D [2821 0 R /XYZ 90 434.0494 null] +>> endobj +2836 0 obj << +/D [2821 0 R /XYZ 90 421.0417 null] +>> endobj +2838 0 obj << +/D [2821 0 R /XYZ 90 408.2632 null] +>> endobj +2840 0 obj << +/D [2821 0 R /XYZ 90 350.858 null] +>> endobj +2841 0 obj << +/D [2821 0 R /XYZ 90 350.858 null] +>> endobj +2849 0 obj << +/D [2821 0 R /XYZ 90 218.4785 null] +>> endobj +2820 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2861 0 obj << +/Length 1851 +/Filter /FlateDecode +>> +stream +xÚ­YKsÛ6¾ëWè(ÍD(Þ$}k›G“I“4qOIÆCI´¥‰L*Çÿ¾  ‚yšÑ µÀ.öï@æ~džày$"”0.ç›ûžßÁçW3bþ^Áÿ+WàëÙo/i2OP"©œ_ß6#H‚%t~½ý¼ X.WúàEýú4^„uãïb[2Ý~^lêû,¯Òj_ä˯×of/®[ÅÆ.Á$Qj¿Ï>Åó-Ø÷f†Kb1€ŒH’ÐùýŒSf_³O³ÚqôM‡¾é ÂúçGJ„ v‚æéùIPƒèrE0Æ‹—u¾iÌïŸQÇUàKÊQSˆëÇ’àE±ßê±Ê%‰Ù©8ü¸Ùù­þø ÜõÅb4áó DâÄÄQýUޙΔ[ù•Û!Œk8®²¹&ò¦ +L`#}:ž62¡RÂ]¥Œ! š}¥_0fÚ‘³p„8Ä7"ÛütÊJp¡XdeëY‚‡&6 +b„˜#´" F” æÇéÏ" è]]šÌ}Øí7;òwŸtÃÑÞ¼W…~Ö'Óé¶0ÿ|¯³rŸP׋±@˜ÄÑ\r‚˜HX+´r¥ÂàÅ ŸÁX‚!F ¡æñA%XZ¦÷Y••§«®~‚)Š%½†´Ò¡%^¤QD˜8Ú.Ï.Q,$÷D+Õã +7¨D³ˆûü®cq,öyÕ Yª|µ~¬LðÊìXf§¶´›o…)Êjg„ìj—n· |šÌ˜µÜœÓn;œ,†“d"Y©‘d!Q)Hã ?Óûã!K“Õ%16žX‹Úäè±õ&‘S&–Íò¸”b6•,†Õ+æãj¥¦ô£)ýÏL¸óm ]Å’u´ûÁÊOÙŒÛñÃ.°$QI°8î+5¥?Méo’SÓh‰aÕiþ|ž©$Î÷çºI+ý<ìs“éœÅ~±¨.‡¶ôÎQÖšFI0Áõòü1»ÍÊ,ßd¦âþºVÐùþÝ'Ÿwÿ¾}kšõþxSo7 ˜ŠÅƒ‚SN =±2»/T…ê2EýˆÎ8’B\D§Sˆ~«ÔµÕ§ìØìRƒ[ .Hik sXß{,¥É„GFèYáF‡iCT)œ`V~åvèaÁ¸Ã,"áHpwLèò+*ö™DA‚{Š/ðßþ¨Öï>J¤–LP +(ƒ#.:"=Öéæ›¡ktØÄÞ¤ðij­ý;Ë=\Ú§ª ²×åV¥So}\ïJ\½ðv_ŸT%Rª¾ìÕŠ¯l£>¬õSƒ—êcù;ôªvM%ÃWà8§Ž F9h˜òÕ8' ˆ—+†ÉâµéjMkg m3cP‘êíŒíì,9Wárço +Ù2­ ×=4|ÈôÏ‹ªëÈ>¼å4†zLâq¼u¥†ñ–sŒ„Oâf}úG¸Y`H?7kÅÜćSŒ8ŽÉøü[©øp*‹akáé£d-{:GϤ_7އ¢ø¦ÞmùÔG4ìLH$™È¨2g':bcN´bþ*â»VÌä„f+jî¸ÀFòÄ׬܈…ãFxiÜÏT?Zf«>•eú¨›@8«tŸïó;Ó«q:æšØ*Ù–ØÂKƒÕg)Ñ—*BÂuÂg¿ºµê¡ùC‚$S“v«{SÔ‡m§@×Ù%…Ê$„O`:^¨®Ôp¡ÂîÁ†”]HŒÇT?™‡öãVìbb<ê 31žÐŒv!1öµ_@Œ'ìƽ˜û¡%ÆúƒÑZbÜÉ)‡&µ‹dì1G† >r ©C§xY+¿r;„©Ž;Èˈã8I:&t=e¥BÅ>¡1Ô9¾â3/ó¬ty™CŸï² +6Ïj•o¶ E£-å¢gX‰»ììýZ­{¤ÙÔ%ì*ªÃc¸ÞÈ7g`E¢‚!"_‘\©á ¶é0IͨªKe@>²(j?c]¨¾w¹iÅ,âÐØAiÄ©~´ˆíà,Ä0ÿ Œ5ä¨þ-äÀ‹–ŠÎRnŒÔ«#øbhh䶨¡Ì³A§>ZykQgâÔfg‰Ç:³dó¢ƒ +.'MèF»Ÿ|íàÓ„Á¸ãÓ¸Z|šÐŒökn(ý…7ÎAMp5•_]•†VÛeö¢Ó>ˆ©„ª; Ì/ÆT·Ã¦¶bÓ˜ê›0ˆ©â~Lõ? SÕ¾©>NžGÅ¢Xôk£†ïcœ®ßª-žÙÜŒtÝnuœ|ýë»: ÌýÂËu HTåôÞna0šH!ÿ×Ues×cu_ãíG€&E,n.±(tä€úÖåWYž•ieY‰-Ö¿mãB«Ú¼S¯_QvEÍ­,ÅÍ­ÚS5“ÚÂëÛõ£½èüùx——¶ê6µÇKÿÉësendstream +endobj +2860 0 obj << +/Type /Page +/Contents 2861 0 R +/Resources 2859 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2809 0 R +/Annots [ 2865 0 R 2866 0 R 2867 0 R 2869 0 R 2870 0 R 2871 0 R 2873 0 R 2874 0 R 2875 0 R 2877 0 R ] +>> endobj +2865 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.3331 702.4599 232.1263 713.05] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 599.8741 139.3246 622.1255] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +2867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.1901 599.8741 192.3555 622.1255] +/Subtype /Link +/A << /S /GoTo /D (a00047) >> +>> endobj +2869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [269.7449 518.2645 295.538 529.1536] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 360.3144 139.3246 382.5658] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +2871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.1901 360.3144 192.3555 382.5658] +/Subtype /Link +/A << /S /GoTo /D (a00047) >> +>> endobj +2873 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [131.345 313.9634 157.1381 324.8426] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 199.7115 139.3246 221.9629] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +2875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.1901 199.7115 192.3555 221.9629] +/Subtype /Link +/A << /S /GoTo /D (a00047) >> +>> endobj +2877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [131.345 118.1118 157.1381 128.9909] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2862 0 obj << +/D [2860 0 R /XYZ 90 757.9346 null] +>> endobj +2863 0 obj << +/D [2860 0 R /XYZ 90 739.9346 null] +>> endobj +2857 0 obj << +/D [2860 0 R /XYZ 90 722.6705 null] +>> endobj +2864 0 obj << +/D [2860 0 R /XYZ 90 722.6705 null] +>> endobj +2856 0 obj << +/D [2860 0 R /XYZ 358.4819 555.6542 null] +>> endobj +2868 0 obj << +/D [2860 0 R /XYZ 90 536.7606 null] +>> endobj +2858 0 obj << +/D [2860 0 R /XYZ 90 349.9037 null] +>> endobj +2872 0 obj << +/D [2860 0 R /XYZ 90 333.1669 null] +>> endobj +2854 0 obj << +/D [2860 0 R /XYZ 278.4221 155.4916 null] +>> endobj +2876 0 obj << +/D [2860 0 R /XYZ 90 136.598 null] +>> endobj +2859 0 obj << +/Font << /F29 499 0 R /F14 636 0 R /F52 1229 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2880 0 obj << +/Length 1378 +/Filter /FlateDecode +>> +stream +xÚ­XÝs›8÷_ÁÛÁL­Ó' ¼õ&¾N3=·{i;bË S)ÆMóßß +Iƾ»ŒÇH«ýÞý-Ãx{‘ˆd<ôVìÝÃò» ±ÛSØŸ¶ þXN~ÿ“JO"ÒÐ[nj!A‚ê-×_üL©Àþå|anʀľÚÙÏ€`_•Á·å•ÇqŒ°AŒ>Ep¤W'³e#Ûª&XH´ä“/ß°·¯&1 ï0ˆ“Ô{œpÊÜC6YL>7|ÌF}`ÈBNÁº˜0oÊBÉ©b0‰#p%ˆA‡K„1‹¼ˆ1„#ÌkÛæE¥.ºÖLQÄ(õÚ {bª¹¬%܇"ÂÄž›¼|H·ÎüÍ._Ui‘ë'îyöbÖ³¢ø¾5‹in–ªå*UæIf–“²L^ìñYúžþ³=øPl«XpÞü-Âßšµ÷Ÿ Q²^]f ¿ìÎo>|0ûu)HÞcß.ìKtU”©­ª+Æôïº5ÀÕ0„× à¶Ö®Mõ?´& ž<ÿÕHü¡¿JALýJŸ25üÑ\w·ãeÞ„~@ÃáqdûbBá£UOK#F¡9Œ:¨¡:%¿ÇMËÓÊbXv£rÜ|GJ|oÇü‡ž&G<†Óãæ;ªSò{ÜŒù&m!¡»ÒeˆÇáÙ~pô§ôèñÕz<«»U–Bé÷³€r ‹ãxÜ Õ ñ}nZ|]š`ƒpL`ô±ib—ê+Æ4OmOÒÞªÌ5Ks[öL†‡E¯dv³â¨i( +l›Þ¨Rå«z€׳ÅÇЈ°ÿ÷íl¾¼~?[´âTß,–ô³·!Ä_În/?ÎgÖüµ=wg›SãïÛäéi•d™Ú® =ὪQ-ªÓ€@0£0eò¨vE"€þ†Ôóm‘®»cï­ÃÍÚg¯’Ò0‡ÎÓ.b=í™™¼Ë L<{*€ûÈ‘ÔóO_KJQ¨Ut|ÌdÑÉð €Üˆ¥N+HViúþçÚ¹%æb§,¸Û \vX0p»O3´cÏâ9Í2%ÇünójW…êzbˆrj¢*C§ó:UëãAƒS«5´ÕHÐ`„eügbþ˜èù} 1¿!;óG´Çüò{ÜÆ1ÿPè˜B|ïÙ˜?n~ƒù'ä÷¸‰ùçú¡Áüzôøž‹ù£nØcþ¸ø>·WÁ|ÿæóWÂü›ùÍbvù:¨†>1D†<=ý®,Âÿõõ©þ‚ÃÂÞi€"»hV mÕ;•«2©œQ.2¹›+ý¦»³„Ú+¾ ì‚ÚPQŒí ¶ÑhïêHMð¡Ç.‹_/÷ª÷D6䟃͙žendstream +endobj +2879 0 obj << +/Type /Page +/Contents 2880 0 R +/Resources 2878 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2809 0 R +/Annots [ 2882 0 R 2883 0 R 2884 0 R 2885 0 R 2887 0 R 2888 0 R 2889 0 R ] +>> endobj +2882 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [277.7877 706.007 338.4298 716.9109] +/Subtype /Link +/A << /S /GoTo /D (a00160_ge4dcbbe6c641d2e3b8537b479df5fc99) >> +>> endobj +2883 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 619.5604 139.3246 641.8119] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +2884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.3134 619.5604 175.4788 641.8119] +/Subtype /Link +/A << /S /GoTo /D (a00047) >> +>> endobj +2885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.3443 619.5604 242.985 641.8119] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +2887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 424.9723 139.3246 447.2237] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +2888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.3134 424.9723 175.4788 447.2237] +/Subtype /Link +/A << /S /GoTo /D (a00047) >> +>> endobj +2889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.3443 424.9723 242.985 447.2237] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +2881 0 obj << +/D [2879 0 R /XYZ 90 757.9346 null] +>> endobj +2855 0 obj << +/D [2879 0 R /XYZ 316.2991 559.1605 null] +>> endobj +2886 0 obj << +/D [2879 0 R /XYZ 90 542.4334 null] +>> endobj +2878 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2892 0 obj << +/Length 2408 +/Filter /FlateDecode +>> +stream +xÚ­ZMsã6½ûW¨j/rUŒÅ' ä¸Ojfk6Ù±o™”‹–hK»å%©ŒýïÓ $H€®Mù`Š|ì×è×h€È +ÃY)¼ÊEŽãÙjs¼Â«g¸ýó1oàùøÇýÕß?RµRHe4[Ý?u2‚%tu¿ýmM°¼¾¡ð^Ÿ?ý +—¯ ÂýÅ—Óö|(ûë§ÍùXVmÑîOÕõï÷Ÿ¯nï±ñK°ŒhÚÿ]ýö;^mÁ¿ÏW1%Åê;üÀˆ(EWÇ+N™ýq¸º»ú·³Ó?è^˜jž lº}„#¸Cm)´7ïÛ—! +!ãõÝ—{ÓÀÛ›c±?ô×MYmËZ7¨·D¢³±Ô†¨¼XBÄØúP¶`¡ÜšØ”ͦ޿ØÈ€!æ…\ÛÑþ©ÞÎý"Ê„Xßí/‡îš¯¿tþè»÷×L¬ë¢jžÀ«îÙ¯õ©=mNæù7,°n ü'ý¢éqÛòÆ´ÒNéÛoýí¯’Ô@÷Mÿ¿ÝÞ¦-ªmQ›W¾_¼.Þú§'í«gÃUmu u›úH‘®M­q¸Ã鈔^„!(ÝÿŽT_|ªÚ²®Ê9S9Ê(ç&<ÚI*غ1ñ¡‚®Ëk"Ö¯…½ÁÖݳK>ö÷Ì‹{°¢nûW s·0¨À”n¨îN×TÇ »ÙžF<ýÏ£EÓ¿²76u×!„¬°T£(õÊ÷þA„m§êYú$4Á:·a¯)tOó`W3ÕÉÜy,Kâ¾mÐúf¯Ûò‡þYÞ YÙ´åͤ:cˆQ¥:G?Bj7}\ä +’Ï×Ð÷M¿#œ!Î$¿ØÑdß(c.‚uÇ,ÎèP)^( +gÙˆ: è0ffÐÉ©3ëGõ³Á|õ}°ø”]íCsl_Ð.ðAdP¿d¢õ\!I2¦]@Jîƒ&B•#òFdü€+ë¥À+ ^f¼ó +Ε\9˜öòR8we¡‹ewmâ†Bùz6!8üÏYÜ5ã™NG%Õ|nq +@ÉS¹eaéÜò Ær+ÎërkÀ›È­ó’ÜŠûØu¹µ™Ê-Nq¢õ[TÈw畈äy*µ j˜Y¥.q—ªŒG~>Å }(‘d¡‡ÚÍ.eÒŒK†¤”ý°ö¡h‹Þ›»¶>oÚs}Mäz²4ÂìZ%òÙôõ‘ôu°dúF/é›àµé;àmºÖ†é«`†Çäˆ9’¾Ÿò!°kÓ÷¦'mØ$Àà…D,j‚=RRr!{ÑÍ4jReHŒñy•=@Le K«côTŽó:•}Þ¿Ù c@Î3”ÓœŒÈç…¶ø”][n¿~}øåŸcG(xå‚Ä£àP zèøp y0 Çs•…)†§Ë +‹Ž”>‹Ò¼·u}Ía–mFÓê||´#k»+ÌÌ®Ù?W{-Ri§ŽvêWÝ”C›LÓ£¥’é!ùKFc–Ø#½O'ºƒ%Ý7Iô¯Môo4ÑáM>"&z‡O¹Øu‰~wû¯Ašc†2Ni<• ­õ3Û“þ>át½Ù˜‹§út4—Íùñ?å¦5¿ŽÍsÿI™2¥>QÞoÄÞoëCYé×áÎxX_á#Q†é|Úy€XÚYX:íbŒ^ÚÅy]Úù¼éú:$_P_nvµŸî~y¨¹@CÀ¢RÌyåB€_q1%2ã€!l^dÙÂÒ"Ç=‘ã¼NdŸwÈò%"ÇÝìZ‘7õ”Ⱦéãí7 ¯–XªQóAâí”Ä”†ÎÏ“|@Lb KKcô$Žó:‰}ÞÈ—Hw#°k%~)ëý)8i%”'‚`Q)v%PŽÙˆ¿ÒrJh‚ÃļÐ &´…¥…Ž1zBÇyÐ>ï¡äK„Ž»صBÓ°+S”3Åí·¨1ôy(Ó#büÊè„ÆTIÀDv|@DcKje¼hœàµxÓÉhœp#°k5f³ÇÛï4N[Ä 1›ÒXêq;²|áb[XZ㣧qœ×iìó.Ðx@¾Dã¸]«1Ÿ×8Úþ‹Æqb§±O ó)s=pgóßt> ¦±…¥5Ž1zÇyÆ>ïäK4Ž»ص‹y£í¿h'vûÄ ±˜Úɹ‘Ýmèô“´çj£W¦V´(Qˆ(>?€û€XRXX:)bŒ^RÄy]Rø¼èEäÓ>œ Á”U"FÜ‘•KƒOyØu+—ÛÓDjæe,§‰XTŠ\Dh®F¡‡oìs¥×ìæôfW˜%¢²®OõÔ—·]!¢’³…‹é>:²èå`Ú½ŸŠÃá±ØhþÛ;õd’s¼ôe7K7ð†mÊ÷Ýè,ªp—´­õfTQ5Ç}Ó8‹ÖN'Hl³ +Bˆ(O-ø-\Ó«Ï”‹Ô'¬ƒ%{o0Òk¼¶× x“½fȽ ×$¼ìº^³¯öíT5Bå‰XTŠª)t‘qèá– ÃÌÒÉa¦Ì³ùOZ“ÜÂÒ’Ç=Éã¼NrŸ7-ù€{‰äq/»NòâåEwñp“G"ÌI–ˆ‚E¥øF‚Q6ŠþÕÌy>?<ú€˜ê–V=Æè©çuªû¼iÕÜKT{ØuªoN•ž¾=Ÿëp”T’úX<•òA)Ĥ¢#@ùn\ìfP„ûËçæR,³‘Ï&ŽtA»$¼Õc»SÓVűü¡iü0Œg)NÉãÌ`š²îOñDnÂaìÙÂÛGGnë6/^ÊM·µyŽÀ—-|íªÝÂ*ìy&›øÐ sUªOìý%C/%`L&‡^ K÷HÏ`¬GÆy]ôy½™åk›‘ãÑK:rb¾kxÊ›±ÕËŽ{YmÃmX&y<•ঠ$£jDï‘™Ââ=²ß£¢j=c‘¨<{‡Å~³+bªÆ2mǶ»fó69C‚w8éí¾Í[±,O4»m¼QJpž#œé"½,/>‘¡Ý®›ì!˜òL¡> endobj +2896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 575.9645 157.9746 586.8684] +/Subtype /Link +/A << /S /GoTo /D (a00105) >> +>> endobj +2897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 539.0153 157.4166 549.9192] +/Subtype /Link +/A << /S /GoTo /D (a00104) >> +>> endobj +2899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 459.0226 183.1495 468.8008] +/Subtype /Link +/A << /S /GoTo /D (a00085) >> +>> endobj +2902 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 404.9565 217.4713 414.8842] +/Subtype /Link +/A << /S /GoTo /D (a00161_g029256bc17a12e1e86781887e11c0c7d) >> +>> endobj +2904 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.6302 367.0311 204.6385 377.935] +/Subtype /Link +/A << /S /GoTo /D (a00161_gcff75c8c930abd6ff168e85373a4eb92) >> +>> endobj +2906 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 344.0533 176.5052 353.981] +/Subtype /Link +/A << /S /GoTo /D (a00161_g3212e70c55244608ac16316888c354f0) >> +>> endobj +2908 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 332.0544 176.4952 341.9821] +/Subtype /Link +/A << /S /GoTo /D (a00161_g6cda47c85ce1b58b501b44ac9cccc50e) >> +>> endobj +2910 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 319.0793 194.2087 329.9832] +/Subtype /Link +/A << /S /GoTo /D (a00161_gf7dd2757d1e766f65b01ba7c91c660a0) >> +>> endobj +2912 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 308.0567 173.7357 317.9843] +/Subtype /Link +/A << /S /GoTo /D (a00161_g34b924954ba5707d536df28d71a80d39) >> +>> endobj +2914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 296.0578 173.7357 305.9855] +/Subtype /Link +/A << /S /GoTo /D (a00161_g9e97c58fe35f750ad192774be9408ac8) >> +>> endobj +2916 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 284.0589 173.7357 293.9866] +/Subtype /Link +/A << /S /GoTo /D (a00161_g28cf9765e4b57451af559ab988ad7160) >> +>> endobj +2918 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 272.06 173.7357 281.9877] +/Subtype /Link +/A << /S /GoTo /D (a00161_g17ccd786400fd08b941e11046df1668f) >> +>> endobj +2920 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 216.0414 179.6335 226.9453] +/Subtype /Link +/A << /S /GoTo /D (a00161_gb1fc692a2700b7a51517724364683f67) >> +>> endobj +2922 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 179.0922 173.556 189.9961] +/Subtype /Link +/A << /S /GoTo /D (a00161_g64807ba7c221ddf735572d05021539f2) >> +>> endobj +2924 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 167.0933 189.0379 177.9973] +/Subtype /Link +/A << /S /GoTo /D (a00161_gbc331f73107958428bf1c392ba19b6f4) >> +>> endobj +2925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 155.0945 197.8948 165.9984] +/Subtype /Link +/A << /S /GoTo /D (a00161_g37e3103b9591790d484a450525739661) >> +>> endobj +2926 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.4857 118.1453 216.0979 129.0492] +/Subtype /Link +/A << /S /GoTo /D (a00161_gf0349a8481565e80f55a751e2b408d6d) >> +>> endobj +2927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [446.0722 118.1453 470.7595 129.0492] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2893 0 obj << +/D [2891 0 R /XYZ 90 757.9346 null] +>> endobj +1316 0 obj << +/D [2891 0 R /XYZ 90 739.9346 null] +>> endobj +158 0 obj << +/D [2891 0 R /XYZ 90 739.9346 null] +>> endobj +2894 0 obj << +/D [2891 0 R /XYZ 90 719.4886 null] +>> endobj +2895 0 obj << +/D [2891 0 R /XYZ 90 593.9619 null] +>> endobj +2898 0 obj << +/D [2891 0 R /XYZ 90 477.02 null] +>> endobj +2900 0 obj << +/D [2891 0 R /XYZ 90 421.9777 null] +>> endobj +2901 0 obj << +/D [2891 0 R /XYZ 90 421.9777 null] +>> endobj +2903 0 obj << +/D [2891 0 R /XYZ 90 385.1719 null] +>> endobj +2905 0 obj << +/D [2891 0 R /XYZ 90 361.2178 null] +>> endobj +2907 0 obj << +/D [2891 0 R /XYZ 90 348.0384 null] +>> endobj +2909 0 obj << +/D [2891 0 R /XYZ 90 336.0395 null] +>> endobj +2911 0 obj << +/D [2891 0 R /XYZ 90 323.0643 null] +>> endobj +2913 0 obj << +/D [2891 0 R /XYZ 90 312.0417 null] +>> endobj +2915 0 obj << +/D [2891 0 R /XYZ 90 300.0428 null] +>> endobj +2917 0 obj << +/D [2891 0 R /XYZ 90 288.044 null] +>> endobj +2919 0 obj << +/D [2891 0 R /XYZ 90 234.0388 null] +>> endobj +2921 0 obj << +/D [2891 0 R /XYZ 90 197.233 null] +>> endobj +2923 0 obj << +/D [2891 0 R /XYZ 90 183.0773 null] +>> endobj +2890 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2933 0 obj << +/Length 1783 +/Filter /FlateDecode +>> +stream +xÚµYMsÛ6½ëWè(ÍD(¾IøÖ:Nš¤I\[=%MÑ[‰TIª‰ÿ}"@EÆÎd|0E>âí¾v ™bø#S…§b\NãÝO×pûõ„˜Ç x¾h~[N~yEÕT!%©œ.Ž#H‚%tº\}šIDñ|AžÝ¾_^×WW‹]”nëë2ÉVI×J 5#XÍ¿,ßN®– §1I0I4ã¿“O_ðt¦½`ÄT(¦_áFD):ÝM8eöÇvr;ù³§~p|¡Ï3AX¿k„ %µ¾Qp58¹†è|A0ƳW‡,®Ò<«½z™Ç‡]’UÑñxÔQ d¤1®Ú#!bÆúoNð,OWF¡]µ¿‹óì3Æt}(æ$œ%õ“ÏXàx5á-"$b‚À¤ à]V£À“*@|©!ÛM^VY´KzÌåIª„A¾¨Ù+}v*äì äeRÀpb–=ì TÀeØŒ&ˆ±hA%Jd`•%Gôí>‰S­\¬‡¬-²îŒlñ„ߊ‚4¥ @ +΃/7iYÜèÛ»‡21ÃTyýÿFÂj“tmÙå«ÃÖÜýšV›'ÛÜŒÙDôø+èyŒºË-“0˜‚¬óþµb1‹ÈÏ¡Bx‰…pë™~­'MT€QUR”]v‚) +%}ôž سÙg( L4cz³Ý±@@’àlЋñýgΈÑÖPõ”ù¾ØÞ\é$\‡yØoæIŸlH ó—¤ÃÎ(â³v‹òÙ]™$N¤Ëþkíý>O³ÊNp»ˆ¢ú_Ü?VF®¨("³¸‹d_$PUª4[wDµšF«@Ê3ÒŸ_aÖ€ûÄ[Í«:A,¸qfA¡dÁѾ¼L4*KO "ªêÿÛ43CQ"]sô+6 è +€âÞt“<$E’ʼnM9éþ.Ýk¡dìõb{œK1Cý5BD”»V ¢çkÐ*ÏZ…ç•é:³ îT†Ü©(”ÄV‚¤(òÞ Of8ÉðD…(T”»µó2Únï£øŸ¾D\m¬Ò6%Ç€¶6Ý$™›\“VcRQVîÒ²ôÒºÖ¡ 6Xv‡²rgNºÛoÝ X[î;³°]Nn@E)G +ÇÙŒÎC„’áŒÞÏè\º¼'eôúŒÕµ£?aY”3·vBïÀé ó È÷ÞMT T¸¬M>Ï»{›'¼”RÛVGþ¡3åNò8֙ĴWö®ŽïÝÕÍÍÝÇwçCK`õ2¦FbÛB Ô ¡iŸ®¾Ez¦…u€š#B_ˆëgúN±6nœ¨›pöXÈzÃnaÇ:uLŽ~âàÃÒ4¨1fo´V¬û.¯‰öh—ý¼?f‡7n£ÀƳ!„2¦€E1{£ifSô”£UôšÂÔIpÇJí÷:ë2¢“ý`u +ÚÕ‰™êÔ*>’×Åçxu]o)ëŸC¤ D‚5¶G‘„ƒòïÛ SRà°µ3’áì %¨Û²ð;í¶(Ž{¡rü$Ƈ"ßõp¸¤â'q–‡û¿“¸êë 1‡ägñîÊuŸ«Iœ8{š_Æ 2ÎW[Ú¿h¿à§_\M ò®ò³‹D„Õ1ÁÛ¤”OìS"É ¸1h³MúN.¨B°úÅH«¦‚ã)‰»OìÕm·ÎV5r©jmÔùªF•DB<±eé3` gñ,éoZØ)§8ìDÀ¾ :ÊA÷TÿNÞ†´É¹.kÓµ´Þá]Q‘ÄI:§bæìˆüN§?¤'I%Ì6X_#Ö6lHJ ;%KWJºÄt„Õ¢|ÖŽ” N:¬Ïòòò¢_Óò¹¢ +¸ XŒ‰Ú‚ ‰jaízà6ÕFY(Fx-ÊçíôV’² +]ÞgÈÚœ$?KB&¡Ô`6&a 6$¡…uÊ›[H$¤[1Âl@>±«!'ˆ’¹Ä†Ö‚gJ)$äcÂ4 !YjP«öºÓ +ŠÅŸté:ëJ†[-ºFŠ(®ÑÖŸZ;˜WÑ:Ps*5vÒÖ† )aan­uçG€°`#ÄäóvæEXŸX:¼(À¾¶çÌg¦‡¯Òt!Ì O>ëbì‡Ïº$f¦Ù¯¢*¹¸Ðy +úC©èì÷¥þDòñíþ¹© ÊÜ“™}*˜gþúãóòõíÇËwwo>¼YÎ^wƒG³Ž…H³ý²ã›•ö¢µ×1OªüEç˜^ÕÅy–ÞÙu?~hã‚ÞÏqBL¤?ô]ìøM/„WtcÜê¡$tp,´Ÿ½ŒÚß×I–QsreãüÞ^¼ÕÅì`~jþã Ê.ì§@б9î|ÐåÏu4‡Þaw×ø2ÿö¸ö׈þh×£Ïÿ•‰«”endstream +endobj +2932 0 obj << +/Type /Page +/Contents 2933 0 R +/Resources 2931 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2942 0 R +/Annots [ 2938 0 R 2939 0 R 2941 0 R ] +>> endobj +2938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 413.0808 135.0008 436.0496] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +2939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.8662 413.0808 183.7077 436.0496] +/Subtype /Link +/A << /S /GoTo /D (a00039) >> +>> endobj +2941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [131.345 341.4685 157.1381 352.3576] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +2934 0 obj << +/D [2932 0 R /XYZ 90 757.9346 null] +>> endobj +2935 0 obj << +/D [2932 0 R /XYZ 90 739.9346 null] +>> endobj +2929 0 obj << +/D [2932 0 R /XYZ 90 723.1038 null] +>> endobj +2936 0 obj << +/D [2932 0 R /XYZ 90 723.1038 null] +>> endobj +2928 0 obj << +/D [2932 0 R /XYZ 206.0041 564.8934 null] +>> endobj +2937 0 obj << +/D [2932 0 R /XYZ 90 548.1663 null] +>> endobj +2930 0 obj << +/D [2932 0 R /XYZ 212.5591 388.6469 null] +>> endobj +2940 0 obj << +/D [2932 0 R /XYZ 90 371.9198 null] +>> endobj +2931 0 obj << +/Font << /F29 499 0 R /F14 636 0 R /F52 1229 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2945 0 obj << +/Length 2274 +/Filter /FlateDecode +>> +stream +xÚ­›]O$7†ïù­ä¦‘Çß¹X‰˜,#ÈÐQ.²b¡g‰šÝÌ¿ÏqUÙm—ÝÇN6i¦ÞöûÖyŽÝT±…?láèÂ(Cœzqóe.>Áÿ°Ç¦oÀ÷RÁ?V{ß½ånáˆÓ\/V‡4#Š3¾XÝþ²dŒîpx]¾ž\ÀKE—ŒÐñÅûÇÛ×ûõøúèñæõËúas½¹{|Øÿuõnïx§\Jhæmÿ³÷˯tq ùÞíQ"œU‹ÿÁ”0çøâËžä"|q¿w¹÷cgüÆð†Úå)&ê×Ç$ÿáá9\¯¯OÎö¥t¹Úw|¹¾XoÆ+zY?ï3ºü¯ÿ ^Â%c1â”Æ‚jú¡¸ÝŽEÂhGëÍõÝýúvªÎúåæùî)ÔIÑý8>¡ÇY}žj+¾ÉcA$å#)µ$;r A,§nï-äx© ÑÌÍÔîVIc)ÓÔŒj"…•Ûq¼Ù¿8Ws/F}•”À£ªå 4ÕzæK)‡^œ; è#îæÎþ[ÏŸ&͇4Cз2ãú #¦[ò¹ˆ¡%1 ð¢ð3DA_À*aRM¥X†0èèM¡Æns*º°SË!'ô'5Î.¢Ìç¼ü¼¾¿ßv“ïsÆÆVʱÊI˜kšò0N””jgO) «‹>Å{*Êš=•ˆôTÃ7ôTî‹÷TîÜÑS ŸiOÝÔzŠiX¦Ñ(Mœ_GÿPO)m–7z*ÊþLOA0Dü5=%\œ´­ž +²vO%b=…ûÆžÊ|=•9÷ôž¡×gxñ¬*«0‘œ6._:•¡£XgKqh gL«¥‚lh©»/Oa{1DþÛøúóúúúkx=•“)¤Õ˜õmjÿšVƒuT:)Z­díVKÄZ ÷­–ù6Z-sîi5=>›'â–3ß%h9¢ª‘ƒN`¹SyIkÀaiäN¹ÝÀ<ÈÚÀ1Ç8î§¾À3óàxŒbÜøÙOï=óË’8¬ 2­\ø¤já–îÃå9˜®—œÅž0àAÖŽ9&Àqß<õíž™÷Çcãú?\\^\¼9<=-0ÃJfñ*DUÞ[>«~øarýôts Ç¢ +tØ-qª‘Yž0èAÖ†Ž9&Ðqß=õ퀞™÷@Çcãú'—çWE±™QDQ몖³1þ@=+ý^× Ã©Bû]îNȉƒdmȘc÷SßÈ™ydøíØùû‹6ç„iañRDU#ç’h%Užá›ìa€átÆ’w N¬Ô¬¼úï•{ÞáÇ4Ѩø¦vûÿMŒ‘TO·³³±Í÷\~}Zß®?Öî—q°¤rwÃ%ßGú-¨ší†Ùm» 7 Í–šnÆ+,;ÍnTn‹ôÙ¨nøÏÆlß å Ñ!Ïa… ž?žSÓ ?ñ££,Íøz÷tµ¹yò¿db^mÊ;:Ž[œ’DÎÓƒsôÌeþ¯§W†þ³ð&Dzg˜&ÎÀD¦ ¼Ñ?¨bükÆ»õX?¬Ÿáú¦GIÂÃ7Ó‹wþî××é Æ§é÷\|ϧu ~z|õqŸ«åãóìù’øDÏ¿¿†§y~ûúi]<Çã° Ñ’*ý¥Øìòendstream +endobj +2944 0 obj << +/Type /Page +/Contents 2945 0 R +/Resources 2943 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2942 0 R +/Annots [ 2949 0 R 2950 0 R 2951 0 R 2952 0 R 2954 0 R 2957 0 R 2959 0 R 2961 0 R 2963 0 R 2965 0 R 2967 0 R 2969 0 R 2971 0 R 2973 0 R 2975 0 R 2977 0 R 2979 0 R 2981 0 R 2983 0 R 2985 0 R 2987 0 R 2989 0 R 2991 0 R 2994 0 R 2995 0 R ] +>> endobj +2949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 618.5198 165.7154 627.3665] +/Subtype /Link +/A << /S /GoTo /D (a00109) >> +>> endobj +2950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 580.4794 165.1575 589.326] +/Subtype /Link +/A << /S /GoTo /D (a00108) >> +>> endobj +2951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 542.439 157.4166 551.2856] +/Subtype /Link +/A << /S /GoTo /D (a00107) >> +>> endobj +2952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 504.3985 156.8586 513.2452] +/Subtype /Link +/A << /S /GoTo /D (a00106) >> +>> endobj +2954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 421.7425 190.8904 431.6702] +/Subtype /Link +/A << /S /GoTo /D (a00086) >> +>> endobj +2957 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 365.6635 271.1301 375.5912] +/Subtype /Link +/A << /S /GoTo /D (a00162_g26440a35353cb457747a4cea372c62e9) >> +>> endobj +2959 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 353.119 280.5446 363.0467] +/Subtype /Link +/A << /S /GoTo /D (a00162_g30fe27cba3c14ae7f9a7f118144af43a) >> +>> endobj +2961 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 339.5983 213.038 350.5022] +/Subtype /Link +/A << /S /GoTo /D (a00162_ge28f6cb60e86088d8886d0f804b4f37c) >> +>> endobj +2963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 328.03 176.5052 337.9577] +/Subtype /Link +/A << /S /GoTo /D (a00162_g3212e70c55244608ac16316888c354f0) >> +>> endobj +2965 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 315.4855 176.4952 325.4132] +/Subtype /Link +/A << /S /GoTo /D (a00162_g6cda47c85ce1b58b501b44ac9cccc50e) >> +>> endobj +2967 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 302.941 224.8339 312.8687] +/Subtype /Link +/A << /S /GoTo /D (a00162_ge429c985be88ed048f382511c9ff00de) >> +>> endobj +2969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 290.3965 198.4231 300.3242] +/Subtype /Link +/A << /S /GoTo /D (a00162_g19709735f29dafeabb91e0882231f9f1) >> +>> endobj +2971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 277.8521 206.5625 287.7797] +/Subtype /Link +/A << /S /GoTo /D (a00162_g7e904ab59f7ee134cf3218a8219e7e29) >> +>> endobj +2973 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 265.3075 211.4442 275.2352] +/Subtype /Link +/A << /S /GoTo /D (a00162_g5025948dd998f65a13a375a37aa5edf5) >> +>> endobj +2975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 252.763 196.052 262.6907] +/Subtype /Link +/A << /S /GoTo /D (a00162_gbfc1d8d15852318927cda30e1bc0470a) >> +>> endobj +2977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 240.2185 209.3322 250.1462] +/Subtype /Link +/A << /S /GoTo /D (a00162_gaaaaf66ea67900c36d01136d5bad1168) >> +>> endobj +2979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 227.6741 213.2175 237.6017] +/Subtype /Link +/A << /S /GoTo /D (a00162_g57aca709a33690cd4fb73fe199fa1bdd) >> +>> endobj +2981 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 215.1295 207.0906 225.0572] +/Subtype /Link +/A << /S /GoTo /D (a00162_g8b600918f84783490fd791ce773175ab) >> +>> endobj +2983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 202.585 215.23 212.5127] +/Subtype /Link +/A << /S /GoTo /D (a00162_g6b2d00412304e2d95e7b853cce5858b0) >> +>> endobj +2985 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 190.0406 220.1117 199.9682] +/Subtype /Link +/A << /S /GoTo /D (a00162_g3318dec654781e9d6d8ec873636660c6) >> +>> endobj +2987 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 177.496 204.7195 187.4237] +/Subtype /Link +/A << /S /GoTo /D (a00162_gf784a76fe619452eddf87e6376a4bf9d) >> +>> endobj +2989 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 164.9515 217.9996 174.8792] +/Subtype /Link +/A << /S /GoTo /D (a00162_g3a4852e2372e34e1c0142d1147fbe027) >> +>> endobj +2991 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 152.4071 223.1601 162.3347] +/Subtype /Link +/A << /S /GoTo /D (a00162_gaa60ca995565b799bb958c806e933665) >> +>> endobj +2994 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.2787 95.3518 198.6315 106.2557] +/Subtype /Link +/A << /S /GoTo /D (a00086) >> +>> endobj +2995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.1296 95.3518 276.389 106.2557] +/Subtype /Link +/A << /S /GoTo /D (a00162_g4647b76d0ef50a5305505041f5775a37) >> +>> endobj +2946 0 obj << +/D [2944 0 R /XYZ 90 757.9346 null] +>> endobj +1317 0 obj << +/D [2944 0 R /XYZ 90 739.9346 null] +>> endobj +162 0 obj << +/D [2944 0 R /XYZ 90 739.9346 null] +>> endobj +2947 0 obj << +/D [2944 0 R /XYZ 90 719.4886 null] +>> endobj +2948 0 obj << +/D [2944 0 R /XYZ 90 635.0055 null] +>> endobj +2953 0 obj << +/D [2944 0 R /XYZ 90 439.3093 null] +>> endobj +2955 0 obj << +/D [2944 0 R /XYZ 90 383.2303 null] +>> endobj +2956 0 obj << +/D [2944 0 R /XYZ 90 383.2303 null] +>> endobj +2958 0 obj << +/D [2944 0 R /XYZ 90 369.6486 null] +>> endobj +2960 0 obj << +/D [2944 0 R /XYZ 90 357.1041 null] +>> endobj +2962 0 obj << +/D [2944 0 R /XYZ 90 343.5833 null] +>> endobj +2964 0 obj << +/D [2944 0 R /XYZ 90 332.0151 null] +>> endobj +2966 0 obj << +/D [2944 0 R /XYZ 90 319.4706 null] +>> endobj +2968 0 obj << +/D [2944 0 R /XYZ 90 306.9261 null] +>> endobj +2970 0 obj << +/D [2944 0 R /XYZ 90 294.3816 null] +>> endobj +2972 0 obj << +/D [2944 0 R /XYZ 90 281.8371 null] +>> endobj +2974 0 obj << +/D [2944 0 R /XYZ 90 269.2926 null] +>> endobj +2976 0 obj << +/D [2944 0 R /XYZ 90 256.7481 null] +>> endobj +2978 0 obj << +/D [2944 0 R /XYZ 90 244.2036 null] +>> endobj +2980 0 obj << +/D [2944 0 R /XYZ 90 231.6591 null] +>> endobj +2982 0 obj << +/D [2944 0 R /XYZ 90 219.1146 null] +>> endobj +2984 0 obj << +/D [2944 0 R /XYZ 90 206.5701 null] +>> endobj +2986 0 obj << +/D [2944 0 R /XYZ 90 194.0256 null] +>> endobj +2988 0 obj << +/D [2944 0 R /XYZ 90 181.4811 null] +>> endobj +2990 0 obj << +/D [2944 0 R /XYZ 90 168.9366 null] +>> endobj +2992 0 obj << +/D [2944 0 R /XYZ 90 111.6113 null] +>> endobj +2993 0 obj << +/D [2944 0 R /XYZ 90 111.6113 null] +>> endobj +2943 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F11 705 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +2998 0 obj << +/Length 1852 +/Filter /FlateDecode +>> +stream +xÚ­ZÛŽÛ6}÷WøÑº ‡wå±Í¥ Rt“¸OI(^íÚ¨-o|é&ýú%R¦.&µè"@Ö–Žf†3g/2L)þƒiF§Zj’q¡¦Ëí„Nïðòë ¸ÛWxÿ*üº˜<{ŲiF2ÅÔtq[YP@$6]Ü|š)Â`~Å$-æ››²8ÖßÅ~töý?~Y¼ +j• +}ÙGÀ^¼\4¸ø$W`ÝŸ|úB§7çÛ %<3rú€_(,cÓíD0î¿l&'ï;õê¡aJàÃã ™”Ì”á¸u=ÎW§ry\ïÊÃPÈT# ¿œÒP»âAJ*"¸g;ÖágÆd×P|ŠI÷Ø R~AŒ*ÕöûÏœÑÙn}ÓóÍ ;¾í­ýÃ|£ðøT=»6ŠcE¤›¯ùýý2ßlzÁd’hÃD"• +!3„iPI}2ðóW:ÀÊÁŇ€HáX²ðQçÂ'üú·ü& ßö=¢ð‰(zvm‡U±Ù|ý~Z{qhZÃU"•ò®ÑT°Nî±æËU^©Õ³W ‚CiàÚi×gJy jYÅ|Êcú¤d(ôj€P.[ò4PÏ|¢«¡H:5èT‰j((STgælÔzoSX ñqU8E¶¹%CÒÍ(ÉEŒ ì2ñQ\•/A|K?0#~ÜoCüÐošø-ßcˆ¢g÷Lüûýn{ß§¾ÑDdH¾x<*åßàg#ºÙ +ês‡©‡mÁ Sht\èXx˜áz¿.]äõŸûý\ÈY•àº1vC R|X—7»‡¹³Ë ÃáT˜G4Ld¦€Œ˜LèTÃxXºaƒ±†‰ûm&ô›n˜–ï1 ¢g÷Ü0»Óñþ4Ð0‚ Â³D<*åß(Û'Y'ûOÙ0‡ã~©™wÁ&ψT ~¤MmAŠ3_ÆFvàk@‡î? h]Þ=IïÉLà.Óôž4ŒK­Î=*Ùy¹HãÅú¾ &Û®åxD×ÅCèZ —åër`}fpÇE©ŠßƒÎñ¦Îp‹ÙJzzA.UF40s¹Ô VkK;æ1¨vÜoSîÐoºÞ-ßc +¢g÷,³ƒ׌P +&‘JyÇ…;JG7÷‰š7z %áée1 Ñ5k`6’7˜u¾Yÿ[V)¸8å~Ë—6Ì¿¯Šòæ2—‘`RgO³C8ƒƒÊR;Ä–ärh0Âå„_Ïå–ß$—Û¾Gp9EÏn¨ÄCë]ÈD–H‚G¥Ü ÊÈŽûäzׂҠ˜¨Ùô[¾Ù.€‡UQ^–¦Ûý®q‘ÌD]7'’ eBŠjàr(¶.;\ ¶dÙ QÑe7š•rÞ³f×ôÂIÑÙ`œL^uïEbÄ,;=ò¦Ì¥c€®?ìn=ÿ)Û´¼ìP¸6þ¡¸-öE¹ôdúæhn’l/Ù"Ã=ŠkMµ +{”E{ÔjÓ¤Ô¸¶¼è ÊœQš\Õ´Ôx FA‰ :'Úºà®NöEK¨ +×ûÑÒÚU‡áV†ÙúY°õ•e #u`@E`öú¯7õµgÓ~S‰Ù–ö-eíe•—AÔ`CìJQõ}•|…‹ µÉàeeUÓ 0‚ÝisÓ ±Òú:;^ŒœžõH4¼H^ yy͉–ÔÄ5(D]Ö [SMkj^[.æû|[à #B4ä`6tè~ -‚6RÓÀ:Tm !À@ÅSРrÐÉq¶“sèzáKâchM!½z^®ÇU€ä‰"A‘IŠë ÷î*=OD?zšèÅ78KxÔ¸I"–˜ó÷ܵ58CbŒ£ö¨‚ÓÇ΢=C8¹øøûËwï¾^˜ :ûóë…=ât§¾ ŸÂ÷@­Ù£û£ ôàÏ8(&”Tÿë'Õ&ÍžÖg! É4.õÝ/$\v°¯‹²ØçG/d>øo­ÄžÜ`î/}ÎøsæòË(UNöç WænéuzsíЄ¶UòÅîÇÏ»¢ì¦Çž· äç?⡽Eendstream +endobj +2997 0 obj << +/Type /Page +/Contents 2998 0 R +/Resources 2996 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2942 0 R +/Annots [ 3002 0 R 3004 0 R 3005 0 R 3006 0 R 3008 0 R 3009 0 R 3010 0 R 3011 0 R 3015 0 R 3018 0 R ] +>> endobj +3002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 704.6952 196.7787 715.5991] +/Subtype /Link +/A << /S /GoTo /D (a00162_g52c3c5ab1b1aa0659b5e465f7fbcc409) >> +>> endobj +3004 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 692.285 175.2098 703.189] +/Subtype /Link +/A << /S /GoTo /D (a00162_g984c4a8b65a3cb35460b073a40568c25) >> +>> endobj +3005 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 654.5133 188.49 665.4173] +/Subtype /Link +/A << /S /GoTo /D (a00162_g123c95a7bb55143cabba92446ce8f513) >> +>> endobj +3006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 616.7416 185.1725 627.6455] +/Subtype /Link +/A << /S /GoTo /D (a00162_gf11c966b0e4f4ecaa73deb14bfb6830f) >> +>> endobj +3008 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 579.3435 181.2968 589.8738] +/Subtype /Link +/A << /S /GoTo /D (a00162_g82ff99d50221f7c17df57dc6092ffc97) >> +>> endobj +3009 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 566.9333 172.998 577.4637] +/Subtype /Link +/A << /S /GoTo /D (a00162_g69b075ef7e4d7bcf5a903d3d75baac02) >> +>> endobj +3010 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 529.1616 176.8634 539.692] +/Subtype /Link +/A << /S /GoTo /D (a00162_gd1f18f739da7703628c3663209463a0d) >> +>> endobj +3011 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 491.0163 180.1912 501.9203] +/Subtype /Link +/A << /S /GoTo /D (a00162_g86beee1f69d05b16022dfb430470e9ce) >> +>> endobj +3015 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 334.2427 142.7416 355.1542] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +3018 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 137.7572 142.7416 158.6686] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +2999 0 obj << +/D [2997 0 R /XYZ 90 757.9346 null] +>> endobj +3000 0 obj << +/D [2997 0 R /XYZ 90 723.1038 null] +>> endobj +3001 0 obj << +/D [2997 0 R /XYZ 90 723.1038 null] +>> endobj +3003 0 obj << +/D [2997 0 R /XYZ 90 708.6802 null] +>> endobj +3007 0 obj << +/D [2997 0 R /XYZ 90 597.5219 null] +>> endobj +3012 0 obj << +/D [2997 0 R /XYZ 90 454.7247 null] +>> endobj +3013 0 obj << +/D [2997 0 R /XYZ 90 428.2397 null] +>> endobj +3014 0 obj << +/D [2997 0 R /XYZ 90 428.2397 null] +>> endobj +3016 0 obj << +/D [2997 0 R /XYZ 204.8181 294.2849 null] +>> endobj +3017 0 obj << +/D [2997 0 R /XYZ 90 278.0449 null] +>> endobj +3019 0 obj << +/D [2997 0 R /XYZ 295.0094 96.348 null] +>> endobj +2996 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R /F50 1172 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3024 0 obj << +/Length 1356 +/Filter /FlateDecode +>> +stream +xÚµXKsâ8¾ó+|4U‹¢ÖÃwB²I‘Ç&Ìif*e@jÀfÙLþýH–ll,RÉTÈr»¿îV݃å8!v|î£2Ï™®{Øy‘ÛW=0¯òý *ð÷¸wvIB'D¡GÍ[±b€ <Ò]¬ªRíÅŠÉ‚K°wuj›§a‰½ã”bõ$«Y@}„9…î”R–Ô+A˜Ê©!—]ÇvjQ9l1k="êäpd–ªJµ•õÒ£>œØOº ßÝOšZûI)vZ?éŒÎ¾ŸohûŒ~ô³úÉìËXÎ2EÇ8ÄøPSáM%W¹ï'…HKÇõúþ´ÿ¸«¤Z#ûÅü“f­Ëó4‰³}5~]ˆ¸V{åÉæõ±è¹WL&#ì+¶U©v&‡˜b{œÉ]ÐïfrÓB+“K±Ó˜Ü=“€7´Y™ÌÇhHÚ©œ'BƒÈÔJäêåÑéžþŽFÏjj¼¿}÷}æÚù¨›I­ä0Õõ)<ËÿïÕû5‡Ws€€ùÖC,÷>tk—_;ò µT—#¤Ou–”È™<ÂÂåÙ•ˆEe…cř݋uY³‹‹s3¿øœÐsb.(ejx†ðŠÏIj¶ÆMfµ‹ä×Û‹hÜ_ª‹EK”~/² ]endstream +endobj +3023 0 obj << +/Type /Page +/Contents 3024 0 R +/Resources 3022 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2942 0 R +/Annots [ 3027 0 R 3029 0 R 3031 0 R ] +>> endobj +3027 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 583.7986 142.7416 604.7101] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +3029 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 371.5861 142.7416 392.4976] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +3031 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 198.9704 142.7416 219.8819] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +3025 0 obj << +/D [3023 0 R /XYZ 90 757.9346 null] +>> endobj +3026 0 obj << +/D [3023 0 R /XYZ 90 739.9346 null] +>> endobj +3020 0 obj << +/D [3023 0 R /XYZ 200.3847 522.0587 null] +>> endobj +3028 0 obj << +/D [3023 0 R /XYZ 90 505.3316 null] +>> endobj +3021 0 obj << +/D [3023 0 R /XYZ 273.161 309.8462 null] +>> endobj +3030 0 obj << +/D [3023 0 R /XYZ 90 293.119 null] +>> endobj +3022 0 obj << +/Font << /F29 499 0 R /F14 636 0 R /F52 1229 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3034 0 obj << +/Length 1133 +/Filter /FlateDecode +>> +stream +xÚÍXKÛ6¾ûWèÅj†3|ˆÌmÛm‹Ø6Î) ®­Ý5êµ\[î&ÿ¾C‰¢õ2µE/…/zŒæûfæ›!MH8ý ±N~ ~ªåCÑ)ÃádôëøÂM›áç‘ø*À¬R¥ Ê¡ó€æì‚wrËÍ6[Wn®³ãê°Ù›|ç‰FªGÌV~®ªoŽOËí¶ºÌf ¦ß–Oûmæß=æ3TÓçÍî¡zàï«›"÷ä›Â°Üï·›ÕÒ8ú—›â±[– žêD§Ši[kǽ:FÞêãü¾nßË­{zíáòj˜I5­úÉÔ=ÅúªUi:ZÏŠO +­yQàŠúŃq³Q7F>‚[ ¼xùáÐó;$ðÕÀ%O µþ—WZ1.%Ž<˜•+ÒÿP¿J2nH/ ºaöçOV´DQCCïõ²XV¼>‡Óª8f`¦ƒÃ_Ú”¡p±7š‘Þf£½E<÷ÆnÝ-Ücm¿7h5Ât#½áíÇ8ôü†Þ¸ ½qw,–E¯]8Ív¥ãÉVDºõ—ZÞ•­êŸ¹)±.¸¤§‰Ôûü>Vno5^í\£ØQÐPëèkcYj–b +mäËÅ®ÍG8t½:ŸÞßÞ]ÝÞþ|õáC¿ÀHå?ű‘âWÛIïÊŒ†ÓÊí·‡¶ƒ€ÞA{;xÚ­ªYÖ‰ ù­Ð˜‹*iDdÌFuE< e·VJ ÷o7óͺ?È@u°#sÁÛ±èù)X[8$4š,ñ„«*H«rÙIÈ®xº†!¤œ©4—Ð0ˆ  6@ ±!€8n@w\-ì— ΢çwH›Ý¦·T!šóñl«H›ü1íTa¼ú)0éàÿUNþA+ýŸŽ?Jú6—4ÍlJë©?Ýð$ç·Ù.;Ð:ê#r¿Ÿûµ¾¸q 'þœøk¯‘WwȹökÜQCý×&ìî€yÃ?¾û3üÛ÷‡l×M;›ÈÏ?º:€endstream +endobj +3033 0 obj << +/Type /Page +/Contents 3034 0 R +/Resources 3032 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 2942 0 R +/Annots [ 3037 0 R 3039 0 R 3040 0 R 3042 0 R 3045 0 R 3048 0 R 3050 0 R ] +>> endobj +3037 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [318.3113 672.5415 370.5648 683.4455] +/Subtype /Link +/A << /S /GoTo /D (a00158) >> +>> endobj +3039 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 617.7467 184.9831 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00101) >> +>> endobj +3040 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 578.8924 184.4252 587.739] +/Subtype /Link +/A << /S /GoTo /D (a00100) >> +>> endobj +3042 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 495.0563 211.8219 504.984] +/Subtype /Link +/A << /S /GoTo /D (a00078) >> +>> endobj +3045 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 437.2279 213.038 448.1318] +/Subtype /Link +/A << /S /GoTo /D (a00163_ge28f6cb60e86088d8886d0f804b4f37c) >> +>> endobj +3048 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 380.3757 217.7102 391.2796] +/Subtype /Link +/A << /S /GoTo /D (a00163_g03070adbf8faab0f34f87c1270964306) >> +>> endobj +3050 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 367.7979 202.2283 378.3282] +/Subtype /Link +/A << /S /GoTo /D (a00163_gb97849f0d3ea858eee790b69591e6427) >> +>> endobj +3035 0 obj << +/D [3033 0 R /XYZ 90 757.9346 null] +>> endobj +1318 0 obj << +/D [3033 0 R /XYZ 90 739.9346 null] +>> endobj +166 0 obj << +/D [3033 0 R /XYZ 90 739.9346 null] +>> endobj +3036 0 obj << +/D [3033 0 R /XYZ 90 717.1645 null] +>> endobj +3038 0 obj << +/D [3033 0 R /XYZ 90 634.6393 null] +>> endobj +3041 0 obj << +/D [3033 0 R /XYZ 90 513.03 null] +>> endobj +3043 0 obj << +/D [3033 0 R /XYZ 90 456.1778 null] +>> endobj +3044 0 obj << +/D [3033 0 R /XYZ 90 456.1778 null] +>> endobj +3046 0 obj << +/D [3033 0 R /XYZ 90 399.3256 null] +>> endobj +3047 0 obj << +/D [3033 0 R /XYZ 90 399.3256 null] +>> endobj +3049 0 obj << +/D [3033 0 R /XYZ 90 384.3607 null] +>> endobj +3032 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3053 0 obj << +/Length 2297 +/Filter /FlateDecode +>> +stream +xÚ¥Z]sÛº}÷¯ÐL_¤™Å7ˆ¼ùÆJâÔŽ][éíÌÍ,1±¦²ä+KMÒ_ßIÀ @.Øv2Qæážƒ=K`)‚(üc#KGFb…Ô£ÅÓ }ƒ?¿?aÍéS8~™üå·#K¬æz4ûZEÐŒ(Îøh¶üm̘œœr¸†Ž7p¨è˜Z\m—‡uYŸo‡§r³ŸïWÛÍä÷ÙÇ“é,7º”ÐÌÑþqòÛït´}O(¶P£ïð…f-=H.ü—õÉÝÉßBœúDuA×ðÝãc’À_¸ ‡ñšz|šp19e”Òñ¯­ÆåC=œÅzƒqã¨0b•ª@ +%Öƒ@Xâ¼ÜÏWërÙ¤¤|YìVÏ>!HD™†8\É”ªâÌW/õeå„©ñùÓ³OíËãvÂÕø{s~^|˜ÍnZZ«ãýã¼9òáæ>Î~[.ëp›õvÞ(ýî‡ý<ÿVúë6ÍÉ/”òµÿë×Ýöéèš—r÷/'¹Ü½7N72fˆæRV#»ARéñ®üã°Ú¹@îÛ¼þØžÊ]}¼ýê>Íx1_¯æ‹ÖýzØ,\ +›ëÜ ÜçCY®\ž\ṬW'~6ÀÇñÔT© ½Ÿ°q•!÷å°_­Wÿö‚~±]–o:*XKAlÁe]zî»oÍÙÛ£{,†Ö5(Ú÷X¸A&k ï—óýü¿.w_¨¢ðŸ a…&WÅ‘œ£;! 2RÒhNПRˉäjh +<GŸÄm'cþ°Ý!U!5¬Ú<•“FëÌ…Ô +.Ñvh.>K·‹ÓjÂg}¸°Pl±Þ¾ôç‰qNhK¬pÀa=ìœH<ê4†uÜËI4§€t- §Â‡–(fY}·rkL:ë*­‰¤¦·‰Îw¨¢pR2DqL_8WI2(\Ä•@é(C +݆¥Z·I«E4¡…N‚q{DÛ?¯zxFÀqÔVÍÇD…ÑDèC°ÁkK˜ªZÚ-PG¦ ̥ఒ–P+Dªè¨p¥*뢳Æ£sJ?”ó¥k ^{¦õØî|Sv·@$µµÖ¡DSŠ”¸èF3SD¸ö··â Ô &x®ä<,_sQ@¬èpÞPu-ÞLÙµ˜‡Ô®!‰Û®¼EZyŠcž]íÚäÿ²ô(t×Öª\éyXÕªúf²~Š©JËu¥ÿ[ÕI[­£z˜Þž[^gM¨<©L­¬–z­b­ân¿;,ö‡Ý„ãÎ)Tr7§²·¢cRÑ–­h”ñµ¢3¼¾¢[¼/ÕhÓŠ†¥D@óÖfF*ºÁç4$qÛëï TJr{q +ÐŒ*< Õ!áØyQX˜˜Y=?ž—î®ÞtZ-´ ‚RÑku @¬°¬Õ(ã«Õ^ou‹÷OËf¤ ¹ÔÄpÃŽÈûÝöøœŒ$®“ñëô—·—ÓO³û·×ŸÞÝ_ýãþóíååôSÒÓÖQè›ÑœTFŒ`ͨm‹a”vÙ. ±Æ²~Û#f»‡åmÇ#ÛqÞ`{Ì;ÀöùÛqI\'ãóÅÍýÙÍÍÛ³ËËägÐÁJVàY¨ =‡,(Á²=ïAÝS½6m}u@a2aªÿgý€Õ‡åëcŒêç uó¨ƒù:Àe$qÑ:ø0=;ŸÞÞ¥?ýÁ3°äOM@e4qˈ¢-‰uXÏ M´•ýí{ @¬°¬õ(ã«õ^o}‹7o}›|€õI\Ôúó‰¤þ[}â¸àiTJšIR@eÔqC‰GâxWF„ý} ÀŠÀÃòE€1FE€ó†"ˆyA‹|Hà2’¸h¼½¼¾Kf~n$1JK<1•QÄ!\+]ÎC³@ïïíc漇åÇ#çqÞà|Ì;ÀùùçqIÜê'ÆÙìæÝå™»×ßߺN—yÎ-)¬ÂSáA š—Ëòk×{6[ÀL"ûõè> endobj +3056 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 641.2029 187.822 651.7332] +/Subtype /Link +/A << /S /GoTo /D (a00164_gc4b119801e50cc1824498a1cdf9adc37) >> +>> endobj +3057 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.4287 641.2029 284.16 651.7332] +/Subtype /Link +/A << /S /GoTo /D (a00164_g6b942c1ef22f8cd1a726ef3364c9fbea) >> +>> endobj +3058 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [287.7667 641.2029 375.5365 651.7332] +/Subtype /Link +/A << /S /GoTo /D (a00164_g23705efb9077187881f094fc9be13bde) >> +>> endobj +3059 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.1432 641.2029 461.364 651.7332] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf11d9915ec12a8cdd9fdcbb5e8fcd5c7) >> +>> endobj +3060 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [464.9707 641.2029 513.9963 651.7332] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf8f12c820cc08da32aa62898bfc02db3) >> +>> endobj +3061 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 629.2477 123.0855 639.778] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf8f12c820cc08da32aa62898bfc02db3) >> +>> endobj +3063 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 565.3112 177.3318 574.1579] +/Subtype /Link +/A << /S /GoTo /D (a00111) >> +>> endobj +3064 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 521.7174 176.7738 530.5641] +/Subtype /Link +/A << /S /GoTo /D (a00110) >> +>> endobj +3066 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 426.7436 202.5067 436.6713] +/Subtype /Link +/A << /S /GoTo /D (a00097) >> +>> endobj +3069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 361.1235 309.3265 371.0511] +/Subtype /Link +/A << /S /GoTo /D (a00164_g5a5bfd7e9060903893481db90645187b) >> +>> endobj +3071 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 344.826 213.038 355.73] +/Subtype /Link +/A << /S /GoTo /D (a00164_ge28f6cb60e86088d8886d0f804b4f37c) >> +>> endobj +3073 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 330.4811 255.0802 340.4088] +/Subtype /Link +/A << /S /GoTo /D (a00164_g31be289fd8ec3fe09b0088165d13976d) >> +>> endobj +3075 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 315.1599 302.4923 325.0876] +/Subtype /Link +/A << /S /GoTo /D (a00164_g8714af98a550f10dc814db92b08d1b0d) >> +>> endobj +3077 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 299.8388 290.1386 309.7664] +/Subtype /Link +/A << /S /GoTo /D (a00164_gc4357cec23abca29d2bb885803625a6a) >> +>> endobj +3079 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 284.5176 269.4366 294.4453] +/Subtype /Link +/A << /S /GoTo /D (a00164_g4d457c50e6f2cef57167c3804ce8bf7c) >> +>> endobj +3081 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 269.1964 275.7527 279.1241] +/Subtype /Link +/A << /S /GoTo /D (a00164_g863c94b0ed4a76997e53a3ccd5d0b6c3) >> +>> endobj +3083 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 253.8753 230.8912 263.8029] +/Subtype /Link +/A << /S /GoTo /D (a00164_g40fb1fb2d990ce04ae9bbee275627c03) >> +>> endobj +3085 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 238.5541 217.6111 248.4818] +/Subtype /Link +/A << /S /GoTo /D (a00164_gda99954e0f6905091885934e86c278cc) >> +>> endobj +3087 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 223.2329 239.2498 233.1606] +/Subtype /Link +/A << /S /GoTo /D (a00164_gd895686859ae7d178d31be04eb0a1a97) >> +>> endobj +3089 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 207.9117 236.0418 217.8394] +/Subtype /Link +/A << /S /GoTo /D (a00164_g38af81a4c9884ce89803fc3e52383112) >> +>> endobj +3091 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 192.5906 176.5052 202.5182] +/Subtype /Link +/A << /S /GoTo /D (a00164_g3212e70c55244608ac16316888c354f0) >> +>> endobj +3093 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 177.2694 176.4952 187.1971] +/Subtype /Link +/A << /S /GoTo /D (a00164_g6cda47c85ce1b58b501b44ac9cccc50e) >> +>> endobj +3095 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 160.9719 190.8811 171.8759] +/Subtype /Link +/A << /S /GoTo /D (a00164_g71e1b022f7b7fa3a154f19372b239935) >> +>> endobj +3098 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.2787 95.3518 210.2479 106.2557] +/Subtype /Link +/A << /S /GoTo /D (a00097) >> +>> endobj +3099 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.746 95.3518 288.0054 106.2557] +/Subtype /Link +/A << /S /GoTo /D (a00164_gdc5aec3587b2c55b714a6c2f37b56cba) >> +>> endobj +3054 0 obj << +/D [3052 0 R /XYZ 90 757.9346 null] +>> endobj +1319 0 obj << +/D [3052 0 R /XYZ 90 739.9346 null] +>> endobj +170 0 obj << +/D [3052 0 R /XYZ 90 739.9346 null] +>> endobj +3055 0 obj << +/D [3052 0 R /XYZ 90 718.4222 null] +>> endobj +3062 0 obj << +/D [3052 0 R /XYZ 90 584.5736 null] +>> endobj +3065 0 obj << +/D [3052 0 R /XYZ 90 447.0871 null] +>> endobj +3067 0 obj << +/D [3052 0 R /XYZ 90 381.4669 null] +>> endobj +3068 0 obj << +/D [3052 0 R /XYZ 90 381.4669 null] +>> endobj +3070 0 obj << +/D [3052 0 R /XYZ 90 365.1085 null] +>> endobj +3072 0 obj << +/D [3052 0 R /XYZ 90 348.8111 null] +>> endobj +3074 0 obj << +/D [3052 0 R /XYZ 90 334.4662 null] +>> endobj +3076 0 obj << +/D [3052 0 R /XYZ 90 319.145 null] +>> endobj +3078 0 obj << +/D [3052 0 R /XYZ 90 303.8238 null] +>> endobj +3080 0 obj << +/D [3052 0 R /XYZ 90 288.5027 null] +>> endobj +3082 0 obj << +/D [3052 0 R /XYZ 90 273.1815 null] +>> endobj +3084 0 obj << +/D [3052 0 R /XYZ 90 257.8603 null] +>> endobj +3086 0 obj << +/D [3052 0 R /XYZ 90 242.5391 null] +>> endobj +3088 0 obj << +/D [3052 0 R /XYZ 90 227.218 null] +>> endobj +3090 0 obj << +/D [3052 0 R /XYZ 90 211.8968 null] +>> endobj +3092 0 obj << +/D [3052 0 R /XYZ 90 196.5756 null] +>> endobj +3094 0 obj << +/D [3052 0 R /XYZ 90 181.2544 null] +>> endobj +3096 0 obj << +/D [3052 0 R /XYZ 90 114.388 null] +>> endobj +3097 0 obj << +/D [3052 0 R /XYZ 90 114.388 null] +>> endobj +3051 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3107 0 obj << +/Length 2315 +/Filter /FlateDecode +>> +stream +xÚµ›Y¹ÇßçSèq¬¹¼ÉÞÇdmÇŒ\ò°»04RÏHˆŽ‰oœOŸbóÙÉ…eøa¤Ö¿«ª‹õãÙ&3 ÿȬÁ3%j—³ÕþÏ^àòûâ~~¿¿‰Z<üøŽ6³5’ÊÙâ¹³ ”ÐÙbýË£D”ÍßPÿ5—â±}²_V»m{¸Ì[|œq¬=!Â\}x»^]P‚Ib|þçá—ßðl Á}|Àˆ5ZÌ~‡/‘¦¡³ý§ÌÙ=üóáïÁŽý¡»aìÙaãGj„ þé(<¬²÷îzX]¶ÇÃy,d¬¹¼¨àV°4Òª× ÷ØÙåN³9ž/Ã] ½.¡²6A_zžÝÉ]†’Xñ|ƒªà˜A=ã¸QŒßW˜ÿýÖT/p0Ô×o”ƒ†îÚl—C‰¡¸râ«s]Ž—™þúê‡Éå¡j.m”™™ôòàÈ[žýBàxJn³Om?_ÏÛÃK¯¯{ÿváz¹ö²9fÆmí¾Ó.1k4¢¸¸KdÅ.6˜éá +~}—ø-ŽÛ©ïŠq»ÅÀîÈAU‚BÊ´nzA”jš–q…§Ó'ó± ×ô^VnúœÇ¨éó~CÓÇ~'†Wód&ûÃk§®{ÁM׆חÂØMkc¿…‘êëk;vn/4æùdU! +3 ÄŠôÚ¨¶dÌTåÒ%VçúA/ëæO—åöÐë?}øôÖ]2ù±=áóto9}”|¾XÍr?ÝWÂ|–juŸƒVšñ²20‘Á0y¿˜Øï€I‚«&æÀn +Œ–ûd°Ù&£ùtU! +!izÍTÉ m„©§Ê¹C¬Î0d“ÌDÉù¾¼PÍ£ú>s ªÒ”—æAVä%6˜á¥à×ó’øýv^Òà*x)„9°›òb–Ýã´0³í¥òÉ +ªB”J³9Öo¤ZZ„2ÕD*i‰Ô9Z¼l’–šïÌ +—ˆÉÒ:¢–7µ¼ÄŠ—•Y‰ æXÉû ¬Ä~ÓÝ´óæxnÑ*«Ò½02ÛiN_ +h`7¥âu$jÎÖJñ¢‚Ê`ÂÅY/!Õ<@wSËC¤Îñàe“®û'¿)óý¸Àq‚kÇÈH=þ*2QI*txÑÑ9Üqx1Ù†öóquÝCðËî’Ýf‹ßÙ6”ÁèÆ]ª¬%Dœ­/sb—éÞúçä×64IºW!=/î0Íl{Ñä +FÝAÒà×çSw‚FýQMOÐ@áNÐÌýωRø¦£½ó3êÎÏb©Ý±£öüÌtBýkd Hο}Óü±óogW¸Ã‰Î’‚Vå ÅÆ¿¾!°¿ž/þ Þ½ ºݵ¦•'ýºsÞ‹­×s{.¿I€ÆÞp'ˆðñ—¦0´;‘B~Óûú]÷¯áÂ$j îu|„IÖûöО–!>WŸü‡&ÙW÷…P÷ÿDÙOÛocéò=‡ö›±×Žw‚pšÝŸÿýúb« NùÏ#ùù?ªvÿyendstream +endobj +3106 0 obj << +/Type /Page +/Contents 3107 0 R +/Resources 3105 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3130 0 R +/Annots [ 3110 0 R 3111 0 R 3112 0 R 3113 0 R 3114 0 R 3115 0 R 3117 0 R 3118 0 R 3119 0 R 3121 0 R 3123 0 R 3124 0 R 3125 0 R 3126 0 R 3127 0 R ] +>> endobj +3110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 704.9751 226.0986 715.5054] +/Subtype /Link +/A << /S /GoTo /D (a00164_gc4b119801e50cc1824498a1cdf9adc37) >> +>> endobj +3111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.1106 704.9751 300.7979 715.5054] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3112 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 667.016 220.0116 677.5464] +/Subtype /Link +/A << /S /GoTo /D (a00164_g6b942c1ef22f8cd1a726ef3364c9fbea) >> +>> endobj +3113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 618.0981 215.05 628.6284] +/Subtype /Link +/A << /S /GoTo /D (a00164_g23705efb9077187881f094fc9be13bde) >> +>> endobj +3114 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 569.1801 209.501 579.7104] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf11d9915ec12a8cdd9fdcbb5e8fcd5c7) >> +>> endobj +3115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 520.2621 205.0776 530.7925] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf8f12c820cc08da32aa62898bfc02db3) >> +>> endobj +3117 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 471.3442 192.9132 481.8745] +/Subtype /Link +/A << /S /GoTo /D (a00164_g3caacabb2fe1c71921e1a471719ccbd2) >> +>> endobj +3118 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.012 433.0115 229.8943 443.9154] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf9385ef9ecc74c7d53ff2f15e62bfde3) >> +>> endobj +3119 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.9163 433.0115 304.6036 443.9154] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3121 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 395.426 200.0962 405.9563] +/Subtype /Link +/A << /S /GoTo /D (a00164_g1d34be506a61db90dd7829117efdf8cf) >> +>> endobj +3123 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 357.0933 208.3951 367.9973] +/Subtype /Link +/A << /S /GoTo /D (a00164_g9e6d2864f390a4ba1ac60dc65e2b9815) >> +>> endobj +3124 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 344.5895 226.5766 355.4935] +/Subtype /Link +/A << /S /GoTo /D (a00164_g4433d3af16ea083a81576d0f18ba57c9) >> +>> endobj +3125 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 307.0041 221.0375 317.5344] +/Subtype /Link +/A << /S /GoTo /D (a00164_g41e616d3fcc17e0aabfe8ab45ef0d30f) >> +>> endobj +3126 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 269.045 224.913 279.5753] +/Subtype /Link +/A << /S /GoTo /D (a00164_g0e0ea5f24b77f124ba33bcbc7ede5bfb) >> +>> endobj +3127 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.7915 230.7123 236.5493 241.6163] +/Subtype /Link +/A << /S /GoTo /D (a00164_g2a939aa4fcffabbce1dc1f784a7e0ad3) >> +>> endobj +3108 0 obj << +/D [3106 0 R /XYZ 90 757.9346 null] +>> endobj +3109 0 obj << +/D [3106 0 R /XYZ 90 723.1038 null] +>> endobj +3116 0 obj << +/D [3106 0 R /XYZ 90 489.6163 null] +>> endobj +3120 0 obj << +/D [3106 0 R /XYZ 90 413.6981 null] +>> endobj +3122 0 obj << +/D [3106 0 R /XYZ 90 375.739 null] +>> endobj +3128 0 obj << +/D [3106 0 R /XYZ 90 194.2427 null] +>> endobj +3103 0 obj << +/D [3106 0 R /XYZ 90 167.7577 null] +>> endobj +3129 0 obj << +/D [3106 0 R /XYZ 90 167.7577 null] +>> endobj +3105 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3138 0 obj << +/Length 1587 +/Filter /FlateDecode +>> +stream +xÚÕYÛŽÛ6}÷WèÑ Ä,ï’ö­mÒ´R¤©ß’ ÐÚܵQ[ÚÊv“ü}‡7‰eI› Š 0EÍÎgÈI0ü#IŽ“T¤(g\&›ã'ÐýrAÜð +ÆW!à§õâ‡_hžä(—T&ë{cA$(¡ÉzûnIˆ¼YQx//¿½¦ÀK‚°m¼®¶—ƒ²íçÕærTå¹8ï«òæÃúÕâź!v~ &‰¦ý{ñîN¶àß«F,ÏDò 0"yN“ã‚Sæ‹?4vì€yahzœÂÔ2Â’“(#9Dea’¥ J!‚G"ËÆ,MRÆN17áxñ¹8>Ôé¶?C‚)J¥Ih´OÍ­wØŽéžúÁ ½ $8E)abÈCxØà˜vñ“ºÛö ´‰œ A +ÒQ'W jŠ>²¦éŸÙåP”Ûˆ=ˆ’¼Ï~= ?åGd·†]ß +8NE>†5A[ÓôH“˜7KS䜙Á·ê^ժܨ­ ÖÝûÛøü±x|܇Ã{,0ü'ÆZo}b³ÊeÎíÊ”ˆ2D½åƒñòŸ‚—Õ~Û7¼9T'O«­{œfq$¬KB!º<7?ƒKwÅæ/ýzº¼¿”³ÙÍÓyWœmk²¿z– +°uuÔ­ pÊv5>9tµõ;ÕØt]¿®×o<¬,UH[u ™6k{Nª†É‰¥ªíó®8™œÀ”A¹p‰ºS– /mhPJ‘¤.aëîL/—ÓÙ¥ÐÉà^˃ÖÁ~nƒðN š>h ®'uê;Â&@¨¿”½– ÉË$¼u]ðD*ãD̼1ê' ^ìá à5°¹‚7ŸVð&è#k3¯Ë>Cð&üˆìμÑ0´‚7N[û…‚ǦÏ +Æ×hé‹ãáþ‡'·¡eô~ÑÓX+z§l#ÜÓmEOXÑk±Â‹ž¢ÏZÊLÉW ñÔ ‹­³S ¥Å6‘bÙÓ>þÿÐ>ª E*Ƶ/D]×>Nr$‰î›¥}cÔOÖ¾ØÃAík`sµo4>­öMÐGÖfj_—}†öMøÙ«}£ahµoœ>¶6¢}ü{kŸÐ¾mq.vœƒ=YõÛìŠÚ26ËÎ*Íð¶ƒEÁ9©E¥ˆ§¢­¸JÜ:Ån…ôòÁp†¨H×ë)Ë&–…C¯Bx¼{û65ñ…È爜Q!=úÞbhP1m'Œq$8ìññA•CQ1ŠÑw°ðèc*¢pß¼zèîkp«¡^£ÛC7nÝãºêvþìÏÚØ&Ø´lÁ1RïaµÚ¨ý K[?¶#µƒ1øÍ ´ÙÚ¡ûuíпڡ!z›èãºnøÚ¡í¼u¯­P„sÔý¶vÀ™&wÔ7ÞG»K‚$£Ì±PÚaþÆ;hÛXj¥î³±Ô-K=hc©»âX®Íœ»0¸ ïw¡·¬Î¶Ãç<äf–{à°SÅVÕ.ŸE­†Ó锽*N®î«º·–ŠÍùRÚ¥rµ@ÃaF×Âñú€®—gÊõß®¤ÈïÕY]+Íd”´Ŭƒ%×£‚ãÏ­Èó¥ïm6 ô‹RGó‹9ïêôÌŽÔêQÁR‡àJ±t}n Òm¼ÀêÚ—þÕ8S€Ð5ØŒ›e¡{*¨9}ËàœíòâÝ_éswúPž 4xšç9]Ï3xÄ·.½ÑÕ­¨‹#D¬>]ÏøýHæû~t”½É¼G…õ®CBÍ©ÌGçÞ€âÉw–ÈãŒvH´9x¬ö ~V½Ø +u[¾&‘m(¥þcm–Oìž6D Êc7ˆ0q.Ä­GÅ´Ý0Úhg]Úµð?œwNÝî¿S ›A¥þ[{6±%ÔÈž`r“™º˜Qbs1áO¸˜Äþ ªd›{1N{1™ ¬Í¼˜tÙg\L&üˆìν˜Œ†¡½˜ŒÓÇÖ/& 1"“Ù7\LúŸu"<üÚ„Á="…ü¦/>æ“U¯ÖùN“LYfNá  „KÚ¸¢çöR•ª.š?Døóòkßx¥7îÅ=ê~ñ-e·Ô}Ü¢KwôÑ[Ýâ¯`>nÏ«Ï_bupAˆÒ¿ì†z“endstream +endobj +3137 0 obj << +/Type /Page +/Contents 3138 0 R +/Resources 3136 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3130 0 R +/Annots [ 3140 0 R 3141 0 R 3143 0 R 3144 0 R 3146 0 R 3147 0 R 3149 0 R 3150 0 R 3151 0 R ] +>> endobj +3140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 718.6794 154.358 740.9309] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +3141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.2234 718.6794 222.4221 740.9309] +/Subtype /Link +/A << /S /GoTo /D (a00041) >> +>> endobj +3143 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 561.9505 154.358 584.202] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +3144 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.2234 561.9505 222.4221 584.202] +/Subtype /Link +/A << /S /GoTo /D (a00041) >> +>> endobj +3146 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 405.2217 154.358 427.4731] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +3147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.2234 405.2217 222.4221 427.4731] +/Subtype /Link +/A << /S /GoTo /D (a00041) >> +>> endobj +3149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.2537 340.6391 333.0469 351.2293] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3150 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 124.499 154.358 146.7505] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +3151 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.2234 124.499 222.4221 146.7505] +/Subtype /Link +/A << /S /GoTo /D (a00041) >> +>> endobj +3139 0 obj << +/D [3137 0 R /XYZ 90 757.9346 null] +>> endobj +3104 0 obj << +/D [3137 0 R /XYZ 231.9163 693.5209 null] +>> endobj +3142 0 obj << +/D [3137 0 R /XYZ 90 672.2941 null] +>> endobj +3101 0 obj << +/D [3137 0 R /XYZ 231.9163 536.792 null] +>> endobj +3145 0 obj << +/D [3137 0 R /XYZ 90 515.5652 null] +>> endobj +3100 0 obj << +/D [3137 0 R /XYZ 231.9163 380.0631 null] +>> endobj +3148 0 obj << +/D [3137 0 R /XYZ 90 358.8364 null] +>> endobj +3133 0 obj << +/D [3137 0 R /XYZ 231.9163 96.348 null] +>> endobj +3136 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3154 0 obj << +/Length 2597 +/Filter /FlateDecode +>> +stream +xÚ­Ù’ã¶ñ}¾BšªŒà¾%ñz³[޽q”òƒíÚâHœk%rLRïß§q‘/MŽš‡ÀFw£ïD6þÈ&Ã%Ê—›Ãåož`ùýñŸwð}üy÷Íw4Ûd(“Tnöƒ$HPB7ûã/[‰(»ßQ·?ßK±-Üäp.‹ª»ÿmÿqñFXH `à Qfõîݾ§ê™LCó÷»_~Û#0÷ñ#–i±y F$ËèærÇ) “óÝ?îþÞãq솹³ Â^s8 +S5œ Q$îwc8Ó)o ïß|Gx´Irà ñçûcæ€Ì +q@ê@^Š'žÏLÏE•_ +'µ_±Àÿº'x[—GˆEˆvŠ ©œ‡rÄxæ8ýñ¡ËËÊ!éN=¶{ý88\›ÆhÉNþºßr£cÞånÔvM‘_U#XQHRÎ,ŽE¢³” +Ì-­·yåæ/Œšâ÷kÑvnrÉ¿ºÁCáàAºÕSqô‹þc¨¼XÂA[4 !0´æžãíXÌ ­ã+llŠÇºñÈ«º‹©Eˆ[Ãx8A™N¢y ߕؾœ +sÅýXª›ò©¬ò³[~ÿnï–‡ã™mF‹®Ž~ëKÙÆæO3Œx&%•D˜3æ¬×|jž<ÌO‘÷ð»xƒ3æØR¦xSã{*:coÁÎb–˜`pÇ”¥‘CõP7™b3Œ ûÓì¨ôRz¼V‡®¬+'©ÒËÿÚZ›0ßëÆËß{Y= z1 +ÜQø‰™ù`¬h|f-`³V @k=Ð.†šÆ!€‹¤9Ó–‘ŸŠîÚÓ­Ú·câS¤%ëÔ{¨ò±À VH&l†þŸœžë²êŠÆ‡‚z-$¼BZ"cH2’­K+†Z‘HhE,·ïþÈ/ÏçbETk¤9Ê4X>¾áJ½ f8œh–¸:L˜“‡tvC>=Ô-òl†ü§$ûÆÔ•@”dcêËbð·ø˜àMÅ0 m” NE¶.†êù)6G¬óP“¶3a?~[®JWŒ¸¼mŸËÊ›|ÆÒôè¬Þ#² ÷>ýy¦:íþsÛå]ñö­C†f*ÀÄL˜¢$®5¤¯5®U[>U6ô _yŒ@øІ…Ò„@ +’ñIm±q¾69Õm7Ã,œ™HÁ<ЛI¾ QM7à4·ì-€ïbøi\˜`5´¯D~î&ôGXS5b`œ¯Ô”n"Æ$ +ÒTBø¹nf%#‘ÄJô’ô5UX¦f}½6¼)ÎPµ1°‡š¯­ü(•¢³³Ÿ‹à Õ¸ð;ÔUU_ Ù!ïmÏ—…C Ö‡ 7h¿¸ËÕÃÖØ§®­KÝqÚqE .Ewª³¾æ+­âJf5œÈÈýR¨9Uz$˜Û#iê?µmŸ‹CiØs¥§ +•¦JOi‘{_èyšË˜úCÃØ:©3>ìvƉì„fÛŸmùi–= õ‡3KñáÌüd +N3x(Â.RÁ2™ì‹¥Äy MK©² ‡úIku«þìáwñ†™²o‚7­?{Ö–ªPå"ÇRyuuƒ® Â|ÄÎ!?Ÿò×D˜ö0I™Ï\aʵÝi5 kÎ4`à»øìÌ‚÷ý,ù¾ÊÀ7MyOÅÖÙWëçTƒ%t«1¸~LÑsC5~o˜QÍoªÃ)´cÇsÑ,*3¤¤q6ÖºÁ¨QNGìôª±Ò‰• ½2¯_0âь†ñI#|fÖã×NB+`t-VêVíàwñ†™Úi‚7yW^Šc}]lɨԈkH)_ãR*@Ýà†* +©ÒV‘j”1m3.Íÿ~`ÁÆG3ˆã£ÝU_Ï~“m·Í®‡ ûºêò†2Ÿ1̇£Ï𔈘 ò†ìÍmU :=gŒ+•wþù|9öer§f#VÆ|€ºÁq+¢³”™ÈÀMÊ f¥/(û(cÖÆ÷7Ë™;l÷§t{©ïŸKèB„ŠZ{žoòù{, “`©¿1—ŒpŸŒÌZmZ:Ë™:#˜G•¤6ìd çºuVDØœñp•*ÕS8R¦z\7¡~o˜ Q¼£dfùZ²&sõ˜24w7¹Î˜2Dl¤Æ‰kÆx^ÊóÙ«¼ˆÍh±‹gB›ŠW¬wñ1ÔrÏÀ'”<–Ëjh‚;øU²ÃeÇ”îloރ¬¯„:±„¤÷¹}Î[w¿ãÜý³™‹[Ыmé—.×ð1?7E~üê&žHY¨6E[Ÿ£ZY‚&§tÝÃW_7Ïñ=W;ÖÞ)œ³¸IXìÊl<õrS0m?ømÁÁ¢‹S3½>/`5eëxƒùR¯ç"…,¯_ì]R²1I@ÕÎÞÁ†¾¢X¦)νmû%4!Êõ­GS˜–­ï5ò°jÉÛ1D«ækhaÚ—(úÍ9 Í´)4ùº“ÄP+N­äG—>ٻ⬭+š• ¯9VÜfÂIÒfönÓƒÅíBÚG­´^@5#Ä]Í•¤Ä$¥kî&3ÝMÂĶj™óK˜¶]ãt c[N„+`˜¥1ÛÜ»1ŒüÓDf.îêz)šò`í ¦>¹ÿùñFÒº‰õQØr¬;—Gaí}ÞvÙ,i ú%”?ùMR(Ðòw‚822DL®@ËúVÁ^r#<Æ`kz`ñeÆXÏ·Éz )Õ‰–†¥„ê>¸±%oG ƒ‡ñeôË©<œÒ%á¼ÃKWÕ¦´éÂ#— ¦s~<ÈU@cÊuvK®Øš\Xza“J#Î…¸A9@M)d+‡B?¥üªÛý•·Àø†&ì{*ºåhH@ÃÙBß7DÃj9RFã¾°žIö=4?_מæ˜YÓ옫Í0Þ'ÉŒëuIôP3¢H”jŠl%IJtRñ?¨Ò÷]v±îҺﱾ†:y¶•È›à5i‹á“åþ/ ýÅÍFÝL±9h 3”eø¦ÿE`kZ +`ö×ËZZ%:hiLtAK1щ–ÆÒƒ­Ê®œPð"3¤ÌÃíªkÅPË®E4AŠKùÊ7µ5Òÿñ›Ú”ÃÙº½{í›Úª|†7µä'Ø^ù¦–RÅ›Ú >&x_û¦¶*†áMmüÛÿåMpüß<ª±É£WÙÒ£èJ09ýjb¤ý¦¶§®®ÚД{øþùý÷o›ºÄou}ÂçÝ\_r®ë/×çoòr-ŸÃÝvY;]ÏDwTÏϦ7J°Œ8Eájöv +ƒš‰òúM•½cÓ°…0G‰2e~×ð3aNõ¾¨Š&ï‰ü- >šÔ~õBýü–²·ÔÛ ÅXúôe.ÉCnº~ðÉ*ÊTbßÖ|}*ª¹[—ùüòÐ9lendstream +endobj +3153 0 obj << +/Type /Page +/Contents 3154 0 R +/Resources 3152 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3130 0 R +/Annots [ 3157 0 R 3158 0 R 3159 0 R 3161 0 R 3162 0 R 3163 0 R 3164 0 R 3165 0 R 3166 0 R 3167 0 R 3168 0 R ] +>> endobj +3157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [289.4951 672.8902 354.0124 683.7941] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf9385ef9ecc74c7d53ff2f15e62bfde3) >> +>> endobj +3158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 591.1961 154.358 613.4475] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +3159 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.2234 591.1961 222.4221 613.4475] +/Subtype /Link +/A << /S /GoTo /D (a00041) >> +>> endobj +3161 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [309.2858 514.7873 335.0789 525.6764] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3162 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.6716 461.1078 477.4029 471.6381] +/Subtype /Link +/A << /S /GoTo /D (a00164_g6b942c1ef22f8cd1a726ef3364c9fbea) >> +>> endobj +3163 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.943 449.1526 404.7613 459.6829] +/Subtype /Link +/A << /S /GoTo /D (a00164_gc4b119801e50cc1824498a1cdf9adc37) >> +>> endobj +3164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.7094 431.5282 269.4792 442.0586] +/Subtype /Link +/A << /S /GoTo /D (a00164_g23705efb9077187881f094fc9be13bde) >> +>> endobj +3165 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [89.0037 419.1995 171.2245 430.1034] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf11d9915ec12a8cdd9fdcbb5e8fcd5c7) >> +>> endobj +3166 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [436.1989 401.5751 513.9963 412.479] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf8f12c820cc08da32aa62898bfc02db3) >> +>> endobj +3167 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 167.3556 154.358 189.6071] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +3168 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.2234 167.3556 222.4221 189.6071] +/Subtype /Link +/A << /S /GoTo /D (a00041) >> +>> endobj +3155 0 obj << +/D [3153 0 R /XYZ 90 757.9346 null] +>> endobj +3156 0 obj << +/D [3153 0 R /XYZ 90 739.9346 null] +>> endobj +3131 0 obj << +/D [3153 0 R /XYZ 219.4825 549.7681 null] +>> endobj +3160 0 obj << +/D [3153 0 R /XYZ 90 534.2597 null] +>> endobj +3134 0 obj << +/D [3153 0 R /XYZ 231.9163 96.348 null] +>> endobj +3152 0 obj << +/Font << /F29 499 0 R /F14 636 0 R /F23 482 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3171 0 obj << +/Length 1552 +/Filter /FlateDecode +>> +stream +xÚµYKoÛ8¾ûWèè5Ë·¤Üv‘4ÛÁîv}k‹B±iG@,¥²¼iþýER¢–ÔM‚ÌÇp¾áÌp 0ü‘ ÆA(B3.ƒÍaƒ=,ß,ˆÝ^ÁþÊ'ø}½xÿÆAŒbIe°ÞU$A‚¬·_–„D+ +gðòôñ/ +¼$›Ám¾==(3¾Ê7§ƒÊʤLóìâÛúÓâz][¹“DÃþX|ù†ƒ-È÷i‹#<Á#Ç48,8enò°øgñwÍÇlT†®'›s? +ÓÐ\O"ÊEáÅŠ`Œ—›û¤Ð²¿ÿ@¸wHr-Œ†Ñg¾bÌ Q‹sˆ805$Oênó‚6¾ßçÇ2KVI_±Àÿ^¼ÌÓ-Œ‰eÃ<6« ¸ ˆ†!©þyW&if˜”÷–[›w¾ëloNE"˜ÉëµµÞ6)3:–…JH r¯Hˆ$å¼Â[WL÷1˜0°j0`.jVŽª€‹‰¥*Ú”IfæV +õ㤎¥Y>$ÏfõÎⲽښݻçp/ßé۶f×rú`¡vy¡ê; atšåZˆXìXZX8š Ã(9šß§{•uˆò"ݧYò`f7×k3h®ÄOÚÖŽÇ!ÙÚ£Oiyß}"LD(Š™d(!‚×[ÅÞÒ|ö|½¦_ùŒÃûþÔçÛvн*µW:oôEâ” N"Ú©óèjª AúÜ´ èbŹK­–v§lS…jfVåòtŸÐ6\1æàŒ-Í;ÛWP=”4Û=çÔ¨{ãH L¢0”"®åº°#ZùTýHÅðb£JÎϪ<Úq³ãeœ`DŒ’qôšjÞW7Á! +‰¶»#Óø¿<æiV*«²2‘®DDP(וOu^W"f(¤˜U²^ÿLjDQcÐÅq<ñŒj5 H8¨Îš¬õŒÐ¦'¤`ÒÝ„~jª)ø7 ÿΘHǽ.:¼1Jâ.úy58ú)9z|Ûjè…5ª_=ñ¸jª ø>7CªÈ@˜cÂ0’‘õ¢+ùšf©)Z]Ö³ÒÌ:|·S¨>áêÏÄLÉì‹ÞAŽÉ6êØ¡ÿ~„ZH]^ê„êàÃ$Š~%½Y%rHª|~|“Jäöãíµ]ª^T ®Í*4>Õù@Ã9EK1?(¢7A¹?Ej2”Yäe‘*(ëÅÄü€jªœ¦·69TÙ™Zýê1BuŒ‰5ÄÄrmØÔGšðÎnªÃcùl†éÎley›«3­ÞseM«¨2‰¸PyQVX´*à|0œ¶uSÀ ±ša<[m[Jm[J¹kK©°Êƒ%¯-¥®-¥~× «M[J¹kKé™¶GšÀ… Á†0 +6Ñ–:ú•` -íñÝ–2¨K(‹iG¤Î«¯©¦éq³m)ÃÔµ¥ %¯-¥¶-…Õª-­VLªõ_7 UÜ ‘÷䰫÷žÇXf$0`âÐhfô©ÎgFˆ¹ˆaÁçWC£èM5Ô‡L{5Yó¯§W6¹˜¤«rW£”®b-¶SJçÊ6N(Ý£QºP‚†sË‘1è_.GúÛÅ‘Í-GFõÓ”#ð=n3Ë‘6úŒrdBŽß¹åȨšrd¾ÏíUz]‚ÅÖ#úÍ¢¡ÿþDx8XŸa¸3‘B¾èÃ@õe#‚#„µbDq¨+~ˆórIkQô}nT¦Š¤nWœÖnÝà“Žƒ';!Ôið’²Kj¿PŒ¥í.¨þ¯°™ô?–¸^è*ÿù¼W½O$úÛÅ€–þ&/Âendstream +endobj +3170 0 obj << +/Type /Page +/Contents 3171 0 R +/Resources 3169 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3130 0 R +/Annots [ 3174 0 R 3175 0 R 3176 0 R 3178 0 R 3179 0 R 3181 0 R 3182 0 R 3183 0 R ] +>> endobj +3174 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.8972 671.9623 422.4145 682.8662] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf9385ef9ecc74c7d53ff2f15e62bfde3) >> +>> endobj +3175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 579.3293 154.358 601.5807] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +3176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.2234 579.3293 222.4221 601.5807] +/Subtype /Link +/A << /S /GoTo /D (a00041) >> +>> endobj +3178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 375.5628 154.358 397.8143] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +3179 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.2234 375.5628 222.4221 397.8143] +/Subtype /Link +/A << /S /GoTo /D (a00041) >> +>> endobj +3181 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.7182 234.8498 372.2355 245.7538] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf9385ef9ecc74c7d53ff2f15e62bfde3) >> +>> endobj +3182 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 142.2168 154.358 164.4683] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +3183 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.2234 142.2168 222.4221 164.4683] +/Subtype /Link +/A << /S /GoTo /D (a00041) >> +>> endobj +3172 0 obj << +/D [3170 0 R /XYZ 90 757.9346 null] +>> endobj +3173 0 obj << +/D [3170 0 R /XYZ 90 739.9346 null] +>> endobj +3132 0 obj << +/D [3170 0 R /XYZ 223.3579 533.4605 null] +>> endobj +3177 0 obj << +/D [3170 0 R /XYZ 90 513.0698 null] +>> endobj +3135 0 obj << +/D [3170 0 R /XYZ 246.6004 329.694 null] +>> endobj +3180 0 obj << +/D [3170 0 R /XYZ 90 308.3271 null] +>> endobj +3102 0 obj << +/D [3170 0 R /XYZ 222.8001 96.348 null] +>> endobj +3169 0 obj << +/Font << /F29 499 0 R /F14 636 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3186 0 obj << +/Length 675 +/Filter /FlateDecode +>> +stream +xÚ¥UMoœ0½ó+8‚T¦sl›¦T)M‘zH£Šouv›ôßׯ@»ÍVª8ÀÌ<Ï›7Øcô‰yÐWÄE Šqéç•Gü;ã¾ðpG&ÍoRïõ{ª|JRé§ë>ƒD©Ÿ7ʈ +| ¥ôÊù¶Ôõ.¼M/}N B‹GTÖë§ëP”`-çOïæ–ø…)îÒ#ÀT"üc@¥¨_yœ²ÑØz_¼ÏSèÓ&ý‹8jÌøIP@FH ~…H‚¦,œÄ½r*¿ïÊJÍ~çü߈ #Ò|£•kxØŒÇt™r`\9ž·Ùv»Êòad\Áz_绲©­•»M¶sþ²sžÜ u1`Û¦qÚ¹¦²œ™7…vˆrí<2 >¤éÕªk='mžAû¤.ÒéÖh3ÿ¹uMÖõ?Ù(B%öŠúޏv˜¾À‰ARÎ{Hº±‚,âI°µª}74r¥Ý»¬î·º2ŠÆ”«ßîݗׯiŠýVÎlX¿ït·ÎšÓïRÓXnÇDÁ$ö%'ÀßL#(š£7T¢€fr +,‘q¯üü1³Šº³%3 +1£ø"5• 7Ÿ}ÌzÚ»!t=+I 12q¬ÂùVœpÌ–8õ òƒ"sROôgB¢?Èfé_¹ß“ÕÅ{,€¢Z²ÿ½ #þTyŸ·a³,„RN…z¹ êýa6KïÎM„lLBÅ]ðZ¯u«ë|y(žÆRvog…GvÁ±¹‹€<>zSJ!ÿk$÷Jb– £ó"ÍŒeÉ8r‡"¬ª ]ë6›Nú8>—vøìéð&g”Qâ,JˆKHEдÃ4øx5 <ïØ»æñ÷®—í±÷Å‘þü%®endstream +endobj +3185 0 obj << +/Type /Page +/Contents 3186 0 R +/Resources 3184 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3130 0 R +/Annots [ 3189 0 R 3190 0 R ] +>> endobj +3189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 637.9957 154.358 660.2472] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +3190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.2234 637.9957 222.4221 660.2472] +/Subtype /Link +/A << /S /GoTo /D (a00041) >> +>> endobj +3187 0 obj << +/D [3185 0 R /XYZ 90 757.9346 null] +>> endobj +3188 0 obj << +/D [3185 0 R /XYZ 90 739.9346 null] +>> endobj +3184 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3193 0 obj << +/Length 2082 +/Filter /FlateDecode +>> +stream +xÚ­Z]Û¶}÷¯0Ðèòò[bßÒ¦M7hšÜÆEÚb¡ØÚ]^{k{“l}‡IS¢4Tï-XKöÑœáœ#ŠÉæþØÜÐy¡ +b„ÔóõÃŒÎïàëW3æ~¾‚߯bÀ·«Ù~àfnˆÑ\ÏW·M͈âŒÏW›ßŒÓå‡kèâéú*º`„¶o›§]Ý¿<¬Ÿêý¹:oûå«×³ïWØå¥„f–öÏÙoÐùò{=£D˜RÍ?à %Ì>˜I.üÉnö~öß§ý¡¹`¨yЉáö1IàîÈ¡½EÛ>M¸\^1JéâÃR«Eý±mΩ>.]|²ÿàÚÓbÄ(Õ‚R +J¸R,"Ì…zYŸ«í®Þ¸ÒÔ§õqûè DTqˆWêB™&ÎêÞ4”ûs”ä£l>ÍùöÔ~Ví‡ûíÙ·»íé¼];0œÖšï·.€;ÿqµz—P)µ 6m›(+ˆæR6‰^Ÿ—WBÒÅÚ^mÂ5íi“¶=x¬îêS{Xí¡$B˜Åï”òÿööxxp¿·ǺÚ\ö»çöô—%ü{û¦=qW>ŸÎõÃ×ð•æ.ªe:lŸ¶›@Ø~\JÓ$úPívî°fZØÜJº«öwO<“_‘’ƒå,ö‡­mNj{U*b8g£·c h훃QM¤(å%Ž%ûsÕçb®âJàŒ•ã…;ÆP­{¼Míf¸ 7}fûÓñÎa~‰sðø\I\›Ãýùü¸¹ZßmÉ}’H!ˆ*4^ e²PpÏQcªUÝÆtp§3Ut^B¢Z6‰BB SÎÌ&úaixÜ|ò·më9wWîÏõñ¶Z»{þŒïa®ØÌÝ~]­Û¼”2ÄmƒkÐÞ¢÷¡„‚0%r>ô°¼£€˜qÞàÃoƇæ)>ÄsHâv}¸ò!e%^ ‡ÒÞ‡b¢í“Kªœ êp!ê6\¥fÿŽÝ¨"‚‚¡2vó°¼Ý¢€˜ÝpÞ`·oÆnæ)vÃsHâ» XÍŽª¸Î4_Á˜IKñ;=Y¢EÉ3n °1»1ÆÆM%‹R2ý£ÃØîòLcIÉá¾*Ú.øeuvc£÷çãÓúüÉ”‹Áç´d†0ąacbØËe¼6Ãë Ûá=5­M k`.Ê3bX‡ÏåÄ †½þñfmG[ý\Œ†kŒÌTÁ£2è /JA+u+|mïÙý ÒššR5ªt @”°¬Ò(ãEé ¯WºÃûÕÆµ4!—š¼`=òq±=>—Fצa'/o¾{u}óÝ‹Ÿ~êçÂ…U*É¥Wˆ€ÊdFkûhE÷ÕCýµëzÎG;ipg·OûµõˆuDB +˜6Níc4Ò7X(R›Tª›Y{¶©×»êhÂÍ$m´Ó‚Öý;?ÁšA¤ÎÙÝÃòvbvÇyƒÝcÞ vïO±;žFצñ~µ4bñ¢y²­¾¿ù°dœ.^\¯®~•xŸ ÂJÊðªT&(»}€—ÝtèP/G›±çøó,`²{X^vŒ1’ç ²Ç¼dïO‘O#‰; ûÛ_Wï~]%‚³& ÇëP™D8çDÂx¾›œèÝhmPð€`YÁQÆ‹à^/x‡7/x—|‚à™4’¸Í+®÷ooö騥PDÑÒd +àQ9æ¢ Æ˜^èZ ‰ ã_®‘±K ÀDö°¼Èc$2ÎDŽy'ˆÜ!Ÿ"2žF׋|z´“ß~0±)Ki25ð¨¹áDJuÉé>Ô{s-‰*y9®sÀtö°¼Îc¤3ÎtŽy'èÜ!Ÿ¢3žF×ëü±jßôve†W2SÊqÛÙ0Ó=ny°Ï†‰¹1é¸Ì“ÙÃò2cŒ‘Ì8o9æ s‡|ŠÌxI\/óc}\×ûtl +–e¦ +•£70íÕ¥êÒƒÒjHiQÎ 9®tÀ”ö°¼Òc¤4ΔŽy'(Ý!Ÿ¢4žF7Rz{ؤB —™"xTŽÝ(RPÑc¡ë!¡a$¯¤ŸnÅLhË 1FBã¼Aè˜w‚Ðò)Bãi$qÃzWn]æJà@9jC +DÑ¥•o‡T†²–2Ö¾üŽiìPy‰ºHa”4‘NÐ7fž"/šC?ªw}Ø¥{š•±Ã/¬õ”a¶ƒ/»Ü3Ó/¢ZÙ…’:tw…×½ªz§ÈìvÁÇ7]ÄÄ–µÊxñD†×›¢ÃÞ܆—S‰20‚•Ôô’·‡ÇçÒIâvÒI_­€:…‘x-*CÎy ãsÊzPE×÷•ÛÂdçp ôÔ¯‰ÍPßüÓbìûÉ¡WÖ@B ½Î¸"f ËcŒ „óżŸ–œ.Ûô±,͘êq# ŸË"‰{ñMõø8¸þý“…ΔÁ£r ÀÔ½Yë–¼ãK1&»5Q> endobj +3197 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 582.769 174.5722 593.6729] +/Subtype /Link +/A << /S /GoTo /D (a00113) >> +>> endobj +3198 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 542.4621 174.0143 553.3661] +/Subtype /Link +/A << /S /GoTo /D (a00112) >> +>> endobj +3199 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.133 502.1553 158.5226 513.0592] +/Subtype /Link +/A << /S /GoTo /D (a00114) >> +>> endobj +3201 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 415.9868 197.5356 426.8907] +/Subtype /Link +/A << /S /GoTo /D (a00079) >> +>> endobj +3203 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 356.821 232.9533 367.3513] +/Subtype /Link +/A << /S /GoTo /D (a00165_g1dbc635a2924806f42d7e3273a6a69b5) >> +>> endobj +3205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 317.1168 224.1764 327.0445] +/Subtype /Link +/A << /S /GoTo /D (a00165_g7d7920c1e51cc4eef80206ebd6fee3f4) >> +>> endobj +3207 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 303.4391 220.9585 313.3668] +/Subtype /Link +/A << /S /GoTo /D (a00165_g8a645f8831837320c4e0c704e871abcf) >> +>> endobj +3209 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 289.7614 176.5052 299.6891] +/Subtype /Link +/A << /S /GoTo /D (a00165_g3212e70c55244608ac16316888c354f0) >> +>> endobj +3211 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 275.1074 190.8811 286.0114] +/Subtype /Link +/A << /S /GoTo /D (a00165_g71e1b022f7b7fa3a154f19372b239935) >> +>> endobj +3213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 261.4297 188.1217 272.3337] +/Subtype /Link +/A << /S /GoTo /D (a00165_ge3f8f7deae69854853b0c8ebb82c380d) >> +>> endobj +3215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 247.752 198.0741 258.6559] +/Subtype /Link +/A << /S /GoTo /D (a00165_g79f9a50c2cccb967d38a2eeb45d2fd75) >> +>> endobj +3217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 234.0743 194.2087 244.9782] +/Subtype /Link +/A << /S /GoTo /D (a00165_gf7dd2757d1e766f65b01ba7c91c660a0) >> +>> endobj +3219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 221.3729 188.6793 231.3005] +/Subtype /Link +/A << /S /GoTo /D (a00165_g820fb27c50e7bb4ac6d9eae1b06630a5) >> +>> endobj +3221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 207.6951 190.8912 217.6228] +/Subtype /Link +/A << /S /GoTo /D (a00165_g14e276fa8e765f774f4162619f1c8fc1) >> +>> endobj +3224 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.2447 147.1795 226.8757 158.0834] +/Subtype /Link +/A << /S /GoTo /D (a00165_ge6f849e94cf6e214be8ffa9a548ecfcd) >> +>> endobj +3226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 133.5018 190.1438 144.4057] +/Subtype /Link +/A << /S /GoTo /D (a00165_g648ddfb2dde2cc55034e4e0ea41cb6d1) >> +>> endobj +3227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 119.8241 174.6619 130.728] +/Subtype /Link +/A << /S /GoTo /D (a00165_gc364305cee969a0be43c071722b136e6) >> +>> endobj +3194 0 obj << +/D [3192 0 R /XYZ 90 757.9346 null] +>> endobj +1320 0 obj << +/D [3192 0 R /XYZ 90 739.9346 null] +>> endobj +174 0 obj << +/D [3192 0 R /XYZ 90 739.9346 null] +>> endobj +3195 0 obj << +/D [3192 0 R /XYZ 90 719.1618 null] +>> endobj +3196 0 obj << +/D [3192 0 R /XYZ 90 602.4452 null] +>> endobj +3200 0 obj << +/D [3192 0 R /XYZ 90 435.663 null] +>> endobj +3202 0 obj << +/D [3192 0 R /XYZ 90 376.1236 null] +>> endobj +3204 0 obj << +/D [3192 0 R /XYZ 90 335.9601 null] +>> endobj +3206 0 obj << +/D [3192 0 R /XYZ 90 321.1019 null] +>> endobj +3208 0 obj << +/D [3192 0 R /XYZ 90 307.4242 null] +>> endobj +3210 0 obj << +/D [3192 0 R /XYZ 90 293.7464 null] +>> endobj +3212 0 obj << +/D [3192 0 R /XYZ 90 279.0925 null] +>> endobj +3214 0 obj << +/D [3192 0 R /XYZ 90 265.4148 null] +>> endobj +3216 0 obj << +/D [3192 0 R /XYZ 90 251.7371 null] +>> endobj +3218 0 obj << +/D [3192 0 R /XYZ 90 238.0594 null] +>> endobj +3220 0 obj << +/D [3192 0 R /XYZ 90 225.3579 null] +>> endobj +3222 0 obj << +/D [3192 0 R /XYZ 90 166.8557 null] +>> endobj +3223 0 obj << +/D [3192 0 R /XYZ 90 166.8557 null] +>> endobj +3225 0 obj << +/D [3192 0 R /XYZ 90 151.1646 null] +>> endobj +3191 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3232 0 obj << +/Length 986 +/Filter /FlateDecode +>> +stream +xÚ¥VÛnÛ8}×WØ ¨¸¼ˆºä­MÚ4AÛÍnìC[ŠDÇdÉkÉM³_¿C‘”eII , X¼ çÌœ‡¸~ÄM±ó¥,ŒÜbë`÷–¯b¶ØÆï2ç÷4uS”F4r³u¯!"ˆSBݬüæEˆ†~@9öþö#î‰{=iÅÞ'Øû©þ`ø#»uCœ Ì#Rç%jÕyŸ èÆ8Î"¢°ÿq¾ýÀn FÞ:±4áî#L0"iJÝ­Rf'•óÕùsУ7úK>r–$¥œSë%§ã£“ˆúÁ{Wâ;Æ´ÚÑ«¦8lEÝåljåÑ„/ β0kBÄèú­}Ç×ùV¼1”v{?¥ž™­u¡ AˆX¶KzØ^±>ÚO5èY)Š*ß÷^ i`Ž0Ib7 +9Ši/Òj…‚±Ô<’aÌ@ JHÚ›w§Òз¢ûöbŠO0E1£dÑ€™!ƒôÜîÑ‚cÆZ•)Šð>ò—¼LÀ µÀÀ84‰X’†§¸ÙÆäÀ¥þüô)Jd~_™Þ²~Ô¬õ·³g†P>K$sœDËbDØHì%¬˜2\¥å–$ˆ2äa­Ôö”/Ê%Ô.€—õÃÙ ™ÛshE©G²žH¶Å^î:=Vw³ϳJJˆ¾ÆêHì%V­˜òïÙˆ†ñ”ÒW°­Ôû”ÚÊm<Å~«ß5²†ëhèižK9³œÊävW U[3ïúâpƒP$6祒 +©·Í‹½B‰g—Lˆ`´nözK×(nXÏõÇÖ6êÚ’Ö:ä ' +È'žQ<²f«õÙ¼,-rïµÞÔ{•l;½ÔgØ€®\Ä*¥Í ÎÍê¬!äQv› —›®Û•«âA®[Uý¾¨ŸF”M²¼Dò…JÚ'%ŽOo„Ié#n¸hƒ†§kô + õÑÛÅÌËõá$þg¿‚d¤ixû.¡‘å˜ nY‹9¶ç½v7Š’¼’ÿŠ Ñ£öTrÕšpîMÈ ÇÉ9Ku9(oÏЮ£R×ÚMs¨ÌøÞœ*òª²ÅȆ¯}j;±5rMӇݢç$cì• @Åbvý%Öb/êÂúù1óIâýñå뛉W¹[©‹!j›»h©µ#ÊÍbÛ‰!”$âÑÿêúúÞ5#„ÑqëAÇÛÔ#”×¢ÐðXî-ƒŸíàV…ð`&„š/¾ ì‚b=£G&GÔsݘxnîŒ42‚÷Oöžüzz³ª®ZÒ~þµ»Ëendstream +endobj +3231 0 obj << +/Type /Page +/Contents 3232 0 R +/Resources 3230 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3238 0 R +>> endobj +3233 0 obj << +/D [3231 0 R /XYZ 90 757.9346 null] +>> endobj +3234 0 obj << +/D [3231 0 R /XYZ 90 739.9346 null] +>> endobj +3228 0 obj << +/D [3231 0 R /XYZ 90 723.1038 null] +>> endobj +3235 0 obj << +/D [3231 0 R /XYZ 90 723.1038 null] +>> endobj +3236 0 obj << +/D [3231 0 R /XYZ 90 539.9526 null] +>> endobj +3229 0 obj << +/D [3231 0 R /XYZ 90 515.6244 null] +>> endobj +3237 0 obj << +/D [3231 0 R /XYZ 90 515.6244 null] +>> endobj +3230 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F52 1229 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3241 0 obj << +/Length 284 +/Filter /FlateDecode +>> +stream +xÚ¥‘MkÃ0 †ïþ>&‡x’Ûqc[Y`°±ÜJmã–A“°’°õßωÝhoý²¬?Bþ ·À2ÂÊ\ó]Àüõ’a g>žÍ®uB`J¸÷½1œéB S˜{Àµ2ÿša‚Xø”rÎP kd12”äsMÜ ·FO —®u§Mïê€Ë3Š£(STɤhaArA7è ö)©¤;çv/Ûóe'¿çƒ»Ù†BymFé«F|endstream +endobj +3240 0 obj << +/Type /Page +/Contents 3241 0 R +/Resources 3239 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3238 0 R +>> endobj +3242 0 obj << +/D [3240 0 R /XYZ 90 757.9346 null] +>> endobj +3239 0 obj << +/Font << /F29 499 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3245 0 obj << +/Length 1390 +/Filter /FlateDecode +>> +stream +xÚ¥YMo"G½ûWp4Rèô÷Gމw£äm|ó®ÐÆëÑF0¬òóSÍL·f¦ÊÈòļ©÷¦Þë?1 |æŒcAi;[mïøì;|üçè/k©àuäÂÂ5[”·þþx÷ëgf’3k¥™=>ÇâVf¼š=®Ÿîÿx©öm}˜/¤á÷nþíñïîÍœw"ÞÀ¡®aÚK}¾áô×?X0Þ½y¨Úª{÷o{8­ÚÓa.ü}Ý_|]¶õ®­Úæu—Ë Í@¡ìË[Å´‘ö\Þ11_Îùýúeµ_-pg]VïÞ©ŸëŽf·ªßÊ +ŒIee`Az™ÊæÂu[5›zÝ ¬«C³Oòî>=æ~zøðn¦`. +ëy-JTê;(°ñÁžg>0ÎÔòŠ9îÜYÕ§ÿªí~S»f\2§¤@©5 ^è…øÉá{éK!PpÇœPfL¡*f\†E‰gØj Py¦…Ç.2Š¢T‹Ô¿tU»õ€Ýr&½fŸnAÂS:ußZð23Ê{¢ EQªEjI£…©ˆt°r»ð<Ô_9—»æœÜ®SýâØ4»~ɨн¾>w¯ñŽM­,6±z”fënõ¼­ðÏM½Y¯[{ŠòŽ)¡ôhB¬WÆÂg™V^¿Õ‰¼_¥4Ã¥—µQ(ãyi(ziÀ>¸µ¤º„»P·oÚ¤dÖ8ƒj“LC-Z›4Lè¸vm GiS’ùàî”îA@aˆ¶pØÁ 7{mæ[¹áJ ‚4›T®^ªÃ°š-ý%é´ NÐ_WôÝéuÍo É\ô¡mé0ÓFX{'7” F[QüøºÂÕeËJu§f¿<­÷ËÕënp$ ؃U¹È¨!?Dºà4Wêª;pPx½`Þ º3Ý„§:0¨{NíÈ“K8¤&Ÿ\ô(zk8sMTnŒÎMQðã¹ÁÕåÜ”êÚf[,vÓ°Ãå·dGË‹cÊy#ÀÕõ°wˆ3pžcâ¶і³š8[–&miQðã–âê²¥¥º“°Ë‘“Ì1Ë…Få½×RÍRòîB^Û¬~‡¦zØ|„@å-l¢M…™Â«(SŒ6µ(ˆµ8o¶«ä…}ëØÏ ?çÆÎfÝM—»®V æ[„“»­…E˸ҊÌ÷=žR=¨l«Õ²Z¯Ã×ÄX=Š>©¡·–kO9™`´“EAÌIœ7;Yò6»‘áÖAd½¢EØO ÔM¦lêáù‡Ÿ…ïÏø³»D.., ìä—’ #-) ~xÇ$Ô%Ü…º“_ŽŽþæTÝ»Ï@ˆ»àžT—pêŽõáç\˜ûúÐŒ|©wŒÃ~‰ª\dŧ¦ÑB]ò?éo#ß]åù7¦cR°˜$„ñö˜àêrLJuøÁŠÉ»ù`%ä%Ü…¼M]ëeœ™†ƒ¸Œ0ƒ›–Q»‡”)/ÙŸähJgÎðéý½`)I0:%ãí)ÁÕ唔ꈔ ònO ./§¤”×ìÇŽíxÈmq}‹Œ¢˜aPãÊ]1O$Ä8æÂÄNHÀ’`tBÆÛ‚«Ë )Õ AäÝž\^NH)oW·Ûêøcø+‚b28;–Qµ3ñŸ%þ’z""Z3¯ŽHÀ"’`tDÆÛ#‚«Ë)ÕAäÝ\^ŽH)o½;Žî"q†TÊâŽeEí4RËKꉈ(Á|˜øYð‘€E$Áèˆ Œ·GW—#Rª#"‚È»="¸¼‘RÞº~ž ~_6íòðzjG~È ±é\âæe¥"x0&ÎÎ¥Šñ´@ÅÔê¾þ?ñÿªNƒendstream +endobj +3244 0 obj << +/Type /Page +/Contents 3245 0 R +/Resources 3243 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3238 0 R +/Annots [ 3248 0 R 3249 0 R 3252 0 R 3253 0 R 3255 0 R 3257 0 R 3258 0 R 3260 0 R 3261 0 R 3263 0 R 3264 0 R 3266 0 R 3268 0 R 3270 0 R 3271 0 R 3273 0 R 3274 0 R 3276 0 R 3277 0 R 3279 0 R 3280 0 R 3282 0 R 3283 0 R 3285 0 R 3286 0 R ] +>> endobj +3248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 468.5995 139.4144 491.5682] +/Subtype /Link +/A << /S /GoTo /D (a00048) >> +>> endobj +3249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.2799 468.5995 192.535 491.5682] +/Subtype /Link +/A << /S /GoTo /D (a00049) >> +>> endobj +3252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 384.1603 123.6537 393.9384] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +3253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [124.1518 384.1603 133.8952 393.9384] +/Subtype /Link +/A << /S /GoTo /D (a00077_31471b5e27bda51832d0fa49bd6d9b54) >> +>> endobj +3255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 373.2662 153.8002 382.1128] +/Subtype /Link +/A << /S /GoTo /D (a00077_e0b137a3875ad12a99e5e3e0e177fd12) >> +>> endobj +3257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 358.2574 172.9089 369.1614] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +3258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.8791 358.2574 202.2389 369.1614] +/Subtype /Link +/A << /S /GoTo /D (a00077_cfd36e02c7498d766ff802575e981612) >> +>> endobj +3260 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 347.3633 136.9336 356.2099] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +3261 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.4317 347.3633 160.455 356.2099] +/Subtype /Link +/A << /S /GoTo /D (a00077_e80af46ceef63eab3c786525370ae720) >> +>> endobj +3263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 333.3308 138.5977 343.2585] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 333.3308 159.9074 343.2585] +/Subtype /Link +/A << /S /GoTo /D (a00077_e707c39412e09d3a47f0b3c5dad33725) >> +>> endobj +3266 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.9088 320.3794 206.1837 330.3071] +/Subtype /Link +/A << /S /GoTo /D (a00077_2391bb18db5f620e0e9fb848ae5ba5e9) >> +>> endobj +3268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.9214 307.428 162.6669 317.3556] +/Subtype /Link +/A << /S /GoTo /D (a00077_5361ef75bfbdb469b5cc31f0060a2670) >> +>> endobj +3270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 294.0582 133.6164 304.4042] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 294.0582 168.0469 304.4042] +/Subtype /Link +/A << /S /GoTo /D (a00077_564bab93ef6a268a5de2fab885c1d32a) >> +>> endobj +3273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 281.1068 138.5977 291.4528] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 281.1068 183.6978 291.4528] +/Subtype /Link +/A << /S /GoTo /D (a00077_7a520a57d7d0541524f34a7685635597) >> +>> endobj +3276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 267.5974 138.5977 278.5014] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 267.5974 166.5427 278.5014] +/Subtype /Link +/A << /S /GoTo /D (a00077_1d2f2751b0865045486c9aa59d0d0971) >> +>> endobj +3279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 255.2039 138.5977 265.5499] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 255.2039 174.2934 265.5499] +/Subtype /Link +/A << /S /GoTo /D (a00077_20541305548441e5dcb2e1e7e6f300eb) >> +>> endobj +3282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 242.2525 138.5977 252.5985] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 242.2525 172.6298 252.5985] +/Subtype /Link +/A << /S /GoTo /D (a00077_27df2817055bc099821d96eb60a40b34) >> +>> endobj +3285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 229.301 138.5977 239.6471] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 229.301 197.4264 239.6471] +/Subtype /Link +/A << /S /GoTo /D (a00077_5e16ca335dfd7394527f602da879fca2) >> +>> endobj +3246 0 obj << +/D [3244 0 R /XYZ 90 757.9346 null] +>> endobj +178 0 obj << +/D [3244 0 R /XYZ 90 739.9346 null] +>> endobj +985 0 obj << +/D [3244 0 R /XYZ 90 553.9527 null] +>> endobj +182 0 obj << +/D [3244 0 R /XYZ 90 553.9527 null] +>> endobj +3247 0 obj << +/D [3244 0 R /XYZ 90 517.4245 null] +>> endobj +3250 0 obj << +/D [3244 0 R /XYZ 90 403.1102 null] +>> endobj +3251 0 obj << +/D [3244 0 R /XYZ 90 403.1102 null] +>> endobj +3254 0 obj << +/D [3244 0 R /XYZ 90 388.1454 null] +>> endobj +3256 0 obj << +/D [3244 0 R /XYZ 90 377.2512 null] +>> endobj +3259 0 obj << +/D [3244 0 R /XYZ 90 362.2425 null] +>> endobj +3262 0 obj << +/D [3244 0 R /XYZ 90 351.3484 null] +>> endobj +3265 0 obj << +/D [3244 0 R /XYZ 90 337.3159 null] +>> endobj +3267 0 obj << +/D [3244 0 R /XYZ 90 324.3645 null] +>> endobj +3269 0 obj << +/D [3244 0 R /XYZ 90 311.413 null] +>> endobj +3272 0 obj << +/D [3244 0 R /XYZ 90 298.0432 null] +>> endobj +3275 0 obj << +/D [3244 0 R /XYZ 90 285.0918 null] +>> endobj +3278 0 obj << +/D [3244 0 R /XYZ 90 271.5825 null] +>> endobj +3281 0 obj << +/D [3244 0 R /XYZ 90 259.1889 null] +>> endobj +3284 0 obj << +/D [3244 0 R /XYZ 90 246.2375 null] +>> endobj +3243 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3289 0 obj << +/Length 833 +/Filter /FlateDecode +>> +stream +xÚ¥VÉnÛ0½ë+t”zʮʱȂ(Ð&¾9A ØtbT–]/Hò÷%µE¶d©@¡ƒ(q8ïÍ<92÷`³PK 1*œ­¾¸ß7–Óc7?n|›_¯)cˆ©p²È=(IHád>ÄhLBHŒßº¡d+—É>)F÷ûía¶?lGh"[N®g‡•ÍöÉ~¹ÎF“ÛàjR3)‰J®ÐóøLY8w„o<62|s 0Ž)\‚xõ‘÷Á¯ÚO1‘/èŠW"ï¸?TEL.ºXÆÈ‹^mš®ŸÞFÈ¢õ6?í\(¶n1¾³ [Äͬ³@ˆ¥Ì\ν25` qi÷É2µó2cv7Û.7]ù2*í’¯Uw´•ѸiÕ–ØÄÀw¾ ÆQ笮ޓÕ&µ»‹SddšöB ˆ +7ÌçüŸíK9u× ˆLƒF.»òÃÚ®6ós=Ƶ0kQu—9Å{“T Q8õå|)tJ²y Ú}š¤ó‰(͇HœzíJÃë)â +4ÕŸ‡Új€CÛ›'ÔÅ!*'äŠÙ[éÒ>0FÙ2ßÇEÂÊRI—YY@\ïõ¢xûi9× +ÎTà¶{QUŸGÑõÒ¦ó]Ç#Å5?{26 º6¥Áøôãqˆd»d|¹KÞ‹˜— .wRÅL©Av•Ý»Ín=ûÝ¢Ç  ˆû鈘éaz‚ƒä +«cj-ZB‚"ì§5–¥ÑÉmwæœSsPFÆCbVfÃb6¶O•Êj·–©‰;{M¶m•HAæ÷¼•ýƒ–_Ï`™mûç±è°‘Œü•vJHˆÝ±8ˆÊjˆ†ALécSd]•«˜»ƒDØ ƒ>±+³a±ûb÷ãÖb7qûÅ>Âý±û´üzY²²-R’kú#¯¬†p¥…Äq§¢S]w¯ Ð +s>QIõ_=b¾CŒ[‚œš‘r=7ž.'·Ð·ƒÏöÆfvë:¾²9«î²Õàv„2:”Hå›]¿ ²?&ÆÊ{./ªõ¶øh7ÒÏUÏüþñb[ÝŸoc;²ô²ŠÙendstream +endobj +3288 0 obj << +/Type /Page +/Contents 3289 0 R +/Resources 3287 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3238 0 R +/Annots [ 3292 0 R 3293 0 R 3296 0 R 3297 0 R 3299 0 R 3301 0 R ] +>> endobj +3292 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 668.6407 162.0093 690.8921] +/Subtype /Link +/A << /S /GoTo /D (a00036) >> +>> endobj +3293 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.8747 668.6407 237.7248 690.8921] +/Subtype /Link +/A << /S /GoTo /D (a00037) >> +>> endobj +3296 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 583.4842 139.1456 594.3882] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +3297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.6437 583.4842 146.6175 594.3882] +/Subtype /Link +/A << /S /GoTo /D (a00078_a9825b5977b2d4dec66e6bd09e6ae6ea) >> +>> endobj +3299 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 570.5328 179.9123 581.4367] +/Subtype /Link +/A << /S /GoTo /D (a00078_4b1b1436b50ed7638aece35f41421196) >> +>> endobj +3301 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 558.1393 157.1179 568.4853] +/Subtype /Link +/A << /S /GoTo /D (a00078_4da86e9feb5e5835eb15163c2cb61116) >> +>> endobj +3290 0 obj << +/D [3288 0 R /XYZ 90 757.9346 null] +>> endobj +986 0 obj << +/D [3288 0 R /XYZ 90 739.9346 null] +>> endobj +186 0 obj << +/D [3288 0 R /XYZ 90 739.9346 null] +>> endobj +3291 0 obj << +/D [3288 0 R /XYZ 90 717.8172 null] +>> endobj +3294 0 obj << +/D [3288 0 R /XYZ 90 602.4342 null] +>> endobj +3295 0 obj << +/D [3288 0 R /XYZ 90 602.4342 null] +>> endobj +3298 0 obj << +/D [3288 0 R /XYZ 90 587.4693 null] +>> endobj +3300 0 obj << +/D [3288 0 R /XYZ 90 574.5178 null] +>> endobj +3287 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3305 0 obj << +/Length 594 +/Filter /FlateDecode +>> +stream +xÚ¥TËnÛ0¼ë+t”b¹|‰Ì1pÔ@6ñ- U¦m²œÊ2Úü}I‘R˜È–Q:ˆáìì¹cóA¬pœñ )ÊD\ì"oÌòm~;5ûi¸^F_nˆŠR‚ˆx¹î N€ÄËÕC’!:K Çɶm_VÏŦ|.òªrk÷ms,Z7¾ÓkÝÌ@&º.´]R'@øìi¹ˆ¾. ^"§¬‚ßÑÃŽWFê"ˆ*Éã?f‚(Eâ]Äí'UtýxÜFwàT¦èéT!³Bú\‰I= RŒÿ7W“ c¤8ï˜M™-1‘3Ï=×m^Vzå˜æúP4åK[îkÏC3,•«Í\?bLê²CwÇs/¨*kíF»ÿ~íþöD¥ S“Ú¢3ª)C }=æy›»ƒ7¥®V‡N +H2ÂÏ^¶àó,£’½ñظd|kÛrr:q@]Šk.ÂB¼[ì냯g±ÍW!`Á9fläYf‚u:1¦#‚Û«ýQ§Ýj6s*îñ—x­‚:ßé‘™!cè´7”1öĘ#©à’uÙ¾7º)÷&ƒæAï†Ç»>ÖEÿ°B1Ä\ùLö^ÌY‹ø´¬«•uV39ˆLL׃{PÊͳÌe§`Øh0·C|ª™vVKs( ›¥0͑ʾWfäØÄnu­›¼íÛXß¾÷ƒÅ xrô þ¯½"¾CŒ…­g„'ûÆMŽß~x4òÀ_¯¾Wîÿ¾nô¨–¶Ó÷Ò‚úüQàendstream +endobj +3304 0 obj << +/Type /Page +/Contents 3305 0 R +/Resources 3303 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3238 0 R +/Annots [ 3310 0 R 3312 0 R ] +>> endobj +3310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.5401 617.7467 188.1115 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00079_9a84c69ec5a4705ccb1ca99fcd120add) >> +>> endobj +3312 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.7662 602.7379 245.9639 613.6419] +/Subtype /Link +/A << /S /GoTo /D (a00079_1513a9e88921750d2a611b518f6fc207) >> +>> endobj +3306 0 obj << +/D [3304 0 R /XYZ 90 757.9346 null] +>> endobj +987 0 obj << +/D [3304 0 R /XYZ 90 739.9346 null] +>> endobj +190 0 obj << +/D [3304 0 R /XYZ 90 739.9346 null] +>> endobj +3307 0 obj << +/D [3304 0 R /XYZ 90 716.7484 null] +>> endobj +3308 0 obj << +/D [3304 0 R /XYZ 90 634.6393 null] +>> endobj +3309 0 obj << +/D [3304 0 R /XYZ 90 634.6393 null] +>> endobj +3311 0 obj << +/D [3304 0 R /XYZ 90 621.7317 null] +>> endobj +3303 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3315 0 obj << +/Length 1204 +/Filter /FlateDecode +>> +stream +xÚ¥XÛnÛF}×WðQzÐfï—<®ƒ(Ð&zsŒ@‘(›¨M©…6ß!¹K-µÔŽÀD‰‡sÎÌ™½pYAáŽFâ„ÔÅæmF‹gøùóŒùÛK¸¿ŒŸV³÷ÜŽ8Íu±Úu4#Š3^¬¶sÆõbÉ¥Tl~þýO¸TtÎí/îÖͺ¿úÚÏ›æ|\0;/ýÍýæüVÖͺ©öõâiõ0ûm5(ñB•ЬÕñÏìñ‰[ü0£D8«Šá %Ì9^¼Í$áËëìëì¯!N£{`*_ÅÄtÂLø…‡Œ9Àô "KF)¿4Íaûý ”q’ýõ—rWöÙÖ›²Í®ˈSª •n£r;„%̾+›uõZn}ÊÓæXB• ŽˆühôZ]æ®üF)¯«Ý=¾ö‚^«ÚË”¬ÿÜïúÏö‰W¯Ë‰¼Šˆ´¾sï«òu{š°P3K¬äêf¯Å€¾ôqnŒj"…•—8-ï7ÎÕ5£m)•È3(ŒÜwTë1ï¹>UÏupeó²>&*Œ ”Úkí­ã³Ç|‰õ<¦'‰Ûêiª·2•à$¡ÂauèAKÆÁ\–±‡*bÃÜñ(ÜœK¸k:(¸…±H±Šgiƒ‘´Ãi¿ù;Ñ&,aÒeµ-Â*)ÑãrœªdfcJ£´3ÞÎ8Àîë¨ûþܤ=ʈÐ2Ÿ°õß òfƒ(á4Ò! m‘8à/÷¢.àFêiÅ8'Z•Õ¶P+WÐK–YÁ¨ü§Üš«`¨Ž¹oçð˜Š$n×/Ý:3¡ÂQb$H¨Gá]c@‰……éšÃ»& +˜™õÞ¡bÞÉy–A%¹½â½íJÀc +’¸­‚ª†Öø±àt~Þ¥ý3Õ©@@aü†åÌUå}šXÛ•6°ˆhsÛås9Àp—sŒ‘ËyÞÁå˜7ïòˆ÷=.ç$q»Ì»MX½~+§<†±jü +coç)¯êþȧ=†U…BÔÛG€œÇ†{œcŒ<ÎóǼyG¼ïñ8¯ ‰ÛͯݫB²àĶ»±lêÚƒð¹U2 G w$ +˜s$Ï;8óö/P»Ówÿ’4¾!F{%!³øy<&&‰{€‰K‰tÎæËà<ÝP+3±ås'Àpw¢€9wò¼ƒ;1oUOl…àM™}E{Û‘€Ç$q[0&`‹M³ù¼•Ⴥ)Âö~P¸—p9/²¤ƒi˜¹>ÜC.Ö-4‡ø¾EZ.N(ì6ÇÊnÛàˆÆë¨ñÞqâ¥@Ì™lu¬ÇàŽQN¸Á_8 ÷, +˜3-Ï;¸ófЈö=(/ ‰{ñdjÁrÂy\§©ì¡³š´Žn±q4ÀPSâ€SÞ`ʈw|ŠszÙ›©Ž5Ö‡±ŒÌ1ŽÇc‚’¸ÝàÞŸ'úÄŸ\j¬µ”¬é¤E$0­ô/£v>ÃZ(˜àñ9©&ÎÛf'8<ؙ“IÓwàç².°éñåg’„‹‡S`‰?6æþ“~äâ#÷gÈœRÝ_í\Í÷ÇþKzØüãg8WþïçsÚóíQoUéTÝ·endstream +endobj +3314 0 obj << +/Type /Page +/Contents 3315 0 R +/Resources 3313 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3238 0 R +/Annots [ 3320 0 R 3322 0 R 3323 0 R 3325 0 R 3326 0 R 3328 0 R 3330 0 R 3332 0 R 3334 0 R 3336 0 R 3338 0 R 3340 0 R 3342 0 R ] +>> endobj +3320 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.012 615.6894 195.0353 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00080_c39694ece9526b84012f90f2bb00af9f) >> +>> endobj +3322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 602.7379 139.1456 613.6419] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +3323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.7605 602.7379 172.3606 613.6419] +/Subtype /Link +/A << /S /GoTo /D (a00080_9dd8edeece221c853a4c4516bf1b01c2) >> +>> endobj +3325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 589.7865 123.6537 600.6904] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +3326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.8576 589.7865 191.7375 600.6904] +/Subtype /Link +/A << /S /GoTo /D (a00080_e261f08e1556287d241764fb2e99fc26) >> +>> endobj +3328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 576.8351 169.103 587.739] +/Subtype /Link +/A << /S /GoTo /D (a00080_4c6f843219271d25766ee5969e435d1a) >> +>> endobj +3330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 564.4415 169.85 574.7876] +/Subtype /Link +/A << /S /GoTo /D (a00080_447eb700ea7a185e0f155934995d49e5) >> +>> endobj +3332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 552.9895 153.8002 561.8361] +/Subtype /Link +/A << /S /GoTo /D (a00080_94fcc9f5c47f419040d849ce58beae35) >> +>> endobj +3334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.7715 537.9808 181.4961 548.8847] +/Subtype /Link +/A << /S /GoTo /D (a00080_5e274a8f8b5fb2b3999c54fe27c76e46) >> +>> endobj +3336 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.9214 527.0866 141.0881 535.9333] +/Subtype /Link +/A << /S /GoTo /D (a00080_468c04fff28e784f93ebc3f0849211dd) >> +>> endobj +3338 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 512.0779 176.216 522.9818] +/Subtype /Link +/A << /S /GoTo /D (a00080_78f82878f3fd0e7401c7d7d3b3fefbef) >> +>> endobj +3340 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.9214 499.1265 163.2246 510.0304] +/Subtype /Link +/A << /S /GoTo /D (a00080_16a3a3056f44b7245ce085b937a269dd) >> +>> endobj +3342 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.7915 486.175 198.9209 497.079] +/Subtype /Link +/A << /S /GoTo /D (a00080_6df929b448ea98bc44d41f5e96237bda) >> +>> endobj +3316 0 obj << +/D [3314 0 R /XYZ 90 757.9346 null] +>> endobj +988 0 obj << +/D [3314 0 R /XYZ 90 739.9346 null] +>> endobj +194 0 obj << +/D [3314 0 R /XYZ 90 739.9346 null] +>> endobj +3317 0 obj << +/D [3314 0 R /XYZ 90 716.7484 null] +>> endobj +3318 0 obj << +/D [3314 0 R /XYZ 90 634.6393 null] +>> endobj +3319 0 obj << +/D [3314 0 R /XYZ 90 634.6393 null] +>> endobj +3321 0 obj << +/D [3314 0 R /XYZ 90 619.6744 null] +>> endobj +3324 0 obj << +/D [3314 0 R /XYZ 90 606.723 null] +>> endobj +3327 0 obj << +/D [3314 0 R /XYZ 90 593.7716 null] +>> endobj +3329 0 obj << +/D [3314 0 R /XYZ 90 580.8201 null] +>> endobj +3331 0 obj << +/D [3314 0 R /XYZ 90 568.4266 null] +>> endobj +3333 0 obj << +/D [3314 0 R /XYZ 90 556.9745 null] +>> endobj +3335 0 obj << +/D [3314 0 R /XYZ 90 541.9658 null] +>> endobj +3337 0 obj << +/D [3314 0 R /XYZ 90 531.0717 null] +>> endobj +3339 0 obj << +/D [3314 0 R /XYZ 90 516.063 null] +>> endobj +3341 0 obj << +/D [3314 0 R /XYZ 90 503.1115 null] +>> endobj +3313 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3345 0 obj << +/Length 714 +/Filter /FlateDecode +>> +stream +xÚ¥VÁrÛ ½ë+t´¦» äØq“if:Ó&¾%™ŽccGS[je¹múõE)IJE3,àñöí>c0?ŒÄψb©ˆ—»♾ŠÐ-OÍúÔ¼ŸGï.©ŠQ‚Šx¾nN‘ÆóÕÝ$#<™R“Þ=~}Ü–Ëo{;q[W‡em¿oôZW ʉ.–ÚL L³ Ò,y˜_Gæ½§3MøÑÝÄ+£ó:”äñ/3‚JÑx¥”uƒmt}éyìB»áTšÙé<1%f†v‰R“wæå‰oJÔdgi‘(Î[ZSà†•Êž– #žéz‘oõÊ2Íô~Yåßë¼,ólhh­ÊÒÌô=-òÝn_8AÛ¼Ðö Á9U®í³e«_ÜKR˜'rF5K JWŒÙ¢^Ø}—¹Þ®ö'l(‰L)?{Ì|€-¿Ÿ‚ )“é O÷žR~ ¡)'gã{T(®9 +„x÷PìóMÑ9³*«z #ã$“™<’Ñ,U‡¹ñuø o#hŸÿÑ + ÍT*„CM‘{qÄ àD* ùãPa{^èÆÜ Ú›ã}“7¾†±fTÍ1k£¦8솾0ÂCp gKzÖ® €)ð¥‡ñ Gœ Äí¬ywù´¨ìubòÀŠfnY°âØ@\J `*Ä·¬Ã‡dx[™å¡a.<Žb¼>™…mËŒ +iný€m,l›G8fÛxÜÞ6?îÏ„šW"_°ŽHUÀ:&?8j]‹Ið6 +Ì»54ÎAòñ +e4åÐÜ–pÒ^0ñQðì¿z‘Ö~i¶ c~¯!LoÁd×j 1-‘=ŽWºÐբîEÿÔ}\'È͵ç^uÚ½î”]P°# + ì×:¡|RVvpøøÙ¡‰>>»n£üý¼ÑÅq-›F©“æÕç/ø8endstream +endobj +3344 0 obj << +/Type /Page +/Contents 3345 0 R +/Resources 3343 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3357 0 R +/Annots [ 3350 0 R 3352 0 R 3354 0 R 3356 0 R ] +>> endobj +3350 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.7915 615.6894 192.2756 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00081_b42c7af6114fde5d21206a2e18a7d3ee) >> +>> endobj +3352 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.7915 602.7379 194.4975 613.6419] +/Subtype /Link +/A << /S /GoTo /D (a00081_164124d48fe85bc98d9a300382a5245d) >> +>> endobj +3354 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 591.8438 165.1479 600.6904] +/Subtype /Link +/A << /S /GoTo /D (a00081_5595902fd42d874e35a70206fad8f6d0) >> +>> endobj +3356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.3873 578.8924 163.3048 587.739] +/Subtype /Link +/A << /S /GoTo /D (a00081_b5801722740492e69bcc73687476009f) >> +>> endobj +3346 0 obj << +/D [3344 0 R /XYZ 90 757.9346 null] +>> endobj +989 0 obj << +/D [3344 0 R /XYZ 90 739.9346 null] +>> endobj +198 0 obj << +/D [3344 0 R /XYZ 90 739.9346 null] +>> endobj +3347 0 obj << +/D [3344 0 R /XYZ 90 717.8172 null] +>> endobj +3348 0 obj << +/D [3344 0 R /XYZ 90 634.6393 null] +>> endobj +3349 0 obj << +/D [3344 0 R /XYZ 90 634.6393 null] +>> endobj +3351 0 obj << +/D [3344 0 R /XYZ 90 619.6744 null] +>> endobj +3353 0 obj << +/D [3344 0 R /XYZ 90 606.723 null] +>> endobj +3355 0 obj << +/D [3344 0 R /XYZ 90 595.8288 null] +>> endobj +3343 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3360 0 obj << +/Length 1383 +/Filter /FlateDecode +>> +stream +xÚ¥XMÛ6½ûWèÅ{Ëá—È è¡Ø$èÚdoI8¶vW¨Wv$¹Iúë3”H-eÉdÚÅV¶žgÞÌ{Q„Œâd†f…,ˆáBeÛÇÍîñë×+p·s¼Ÿ‡€ßnW?¿b&3Ä(¦²Û»>‚"°ìv÷n L_åL ëÓï⥤k t¸¸Þt›áêmל¶Ý©¹½.ÝÍÃöôXÖݦ«õÕ‡Û›ÕËÛ‘‰#*¹ËãóêÝšíðÍŠn´Ì¾àJÀ–=®ãþÃ~õvõ×g¸Ñÿ`©^ |¹`¿a¾b† (†‚ ¢®r ”®íaûwXÞpý¦¼+‡:ëmië€*è ¶˜Ù„²èãýTÕÛýiçRrRôÀ_b¤ºp€žyX$€hÁÁá~u°J FʾJ,‰cŸ(6… ú©Z®Þë²ÛTûrçä+ÛmS½xŸi[h sûàDoÊcS¶£êýw‡»á¿³Ê±9t‡¾µ@×eGlt mï <|Ùöj4§ÆªÖ%ð ›Ï§2ÄŽÐ/U÷0\Õ‡áÿ©E5]çÿTmõiïpå¾´Þmɹqµ$»—IC S\/Ú΃ò5_kÚJy‘)ÊÓWþòëæñ¸/Ûç‰AgÍ,ˆÑ ð²¿g¿iîÝ­7? h,àr‰`¨òˆa–âC¹ßò/V‘C³ß ŽœPµ¤ˆ3Í=(Eá<–e0x&/\&‰4Bö·®Ë÷”²ºz²ßƹf_ÕN\ jêLû¯¼[ediÑéây¯ªr¿k†œÄj@ü¥i–PDp-žâؼï“s{௘äÑŒ½=xÚ8 U*ÉÎã&ìŽÝŒcDÉBF¹1"0VšŠ BC’›Ç¥¸qF´Ñ&Í­Hsã’pmÒ}ó¸)7k¼‚J!˜CÜJ…aЭ /úMA4Š‘ðÛKú- 8_ä•Êë4É»=Ôí‚`š†ÂNGDqø…Y\Ká¤?ÎH|f +P‰Ò=jž'tWj¢8ãg-ÇÃ’€ +þÕ{|ªòY\Ëâ»c×ÌH‰)Ùs£¸ìFÃ0u–vcðÙÓ/ÁnôlÈnÑ08cíWŒ]>¢æy§†Áé@õYW– #‘šgy/Wîñ©Êgq-ƒ¦Ü,¦ ¸Ë Û´¸cr ´c”¶> endobj +3363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 589.168 162.5673 610.0795] +/Subtype /Link +/A << /S /GoTo /D (a00037) >> +>> endobj +3366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 504.6641 123.6537 515.568] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +3367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [124.1518 504.6641 133.8952 515.568] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +3368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.3933 504.6641 167.3794 515.568] +/Subtype /Link +/A << /S /GoTo /D (a00082_17aacf7c5e2046c1f3ab50faa1b2f7eb) >> +>> endobj +3370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.4319 491.7126 157.1379 502.6166] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.108 491.7126 196.4302 502.6166] +/Subtype /Link +/A << /S /GoTo /D (a00082_31f25efccba9fd043047133d0d0ba5ab) >> +>> endobj +3373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 478.7612 133.6164 489.6651] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.5865 478.7612 171.7929 489.6651] +/Subtype /Link +/A << /S /GoTo /D (a00082_b973f2e16c2883a8a0164d716cce5a31) >> +>> endobj +3376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 465.8098 167.1604 476.7137] +/Subtype /Link +/A << /S /GoTo /D (a00082_c3d1bfbb1abde31973c015de97ce2f84) >> +>> endobj +3378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 453.8346 138.5977 463.7623] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 453.8346 171.5239 463.7623] +/Subtype /Link +/A << /S /GoTo /D (a00082_19b82696bd84a803250cbf9812f2f125) >> +>> endobj +3381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 440.8832 138.5977 450.8108] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 440.8832 170.4081 450.8108] +/Subtype /Link +/A << /S /GoTo /D (a00082_a408ca8630154ebd039f37a828399f7b) >> +>> endobj +3384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 426.9555 157.2078 437.8594] +/Subtype /Link +/A << /S /GoTo /D (a00083) >> +>> endobj +3385 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.706 426.9555 172.7794 437.8594] +/Subtype /Link +/A << /S /GoTo /D (a00082_d6bd03239291629676e4c0286ebb650f) >> +>> endobj +3387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.3868 414.004 195.9519 424.908] +/Subtype /Link +/A << /S /GoTo /D (a00082_a6bfaf327ce839ba70accd71014398d0) >> +>> endobj +3389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.012 401.0526 192.2657 411.9565] +/Subtype /Link +/A << /S /GoTo /D (a00082_fda184638130452f3570966acc5b97f9) >> +>> endobj +3361 0 obj << +/D [3359 0 R /XYZ 90 757.9346 null] +>> endobj +990 0 obj << +/D [3359 0 R /XYZ 90 739.9346 null] +>> endobj +202 0 obj << +/D [3359 0 R /XYZ 90 739.9346 null] +>> endobj +3362 0 obj << +/D [3359 0 R /XYZ 90 685.9318 null] +>> endobj +3364 0 obj << +/D [3359 0 R /XYZ 90 523.614 null] +>> endobj +3365 0 obj << +/D [3359 0 R /XYZ 90 523.614 null] +>> endobj +3369 0 obj << +/D [3359 0 R /XYZ 90 508.6491 null] +>> endobj +3372 0 obj << +/D [3359 0 R /XYZ 90 495.6977 null] +>> endobj +3375 0 obj << +/D [3359 0 R /XYZ 90 482.7463 null] +>> endobj +3377 0 obj << +/D [3359 0 R /XYZ 90 469.7948 null] +>> endobj +3380 0 obj << +/D [3359 0 R /XYZ 90 457.8196 null] +>> endobj +3383 0 obj << +/D [3359 0 R /XYZ 90 444.8682 null] +>> endobj +3386 0 obj << +/D [3359 0 R /XYZ 90 430.9405 null] +>> endobj +3388 0 obj << +/D [3359 0 R /XYZ 90 417.9891 null] +>> endobj +3358 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F11 705 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3392 0 obj << +/Length 609 +/Filter /FlateDecode +>> +stream +xÚ¥UMoÚ@½ûWø¶3³ß9V4Q‘*µ ·$Š,Ä*1Ôµù÷]{×ÄÁ€UU¼oß¼73»` +þ‡©…TKÍ,*¿&®üòM‚q{ä÷GmÀçiòéšlj™U¤Òé²fPÈ$!¥ÓÅý@3=‘„Áv·™ÿ|z ö˰tWûyÆ·néŠ!šËçÎ/i¥Ôɧ“äËô !*”\a%àWrÿéÂ+$À¸52ýí'ÀÐZJ_A¼™¬“»äÇ'lÔN•ÈO;EÁü +5VÉ;×-§ðV½¿@ŒÌJYû$W¼dÄ #õØ•³líiìvó"Û–Ù&<¼UŠŠ¦RkÍØ=PžÕèúø, +Zg¹ #+ÃweW'Ö®U@öÂÎ(æ‚¡‰©ÏÊY8t¹õbw¢ˆ + 3‚äÙ6kBòÛÞ܈wž*î‘<Ž…P¥Rò‹³ÆWÂ^µR¬âÖmKúê[PªW]ƒû nožÊŽ:NLàå|Pݸ(Úq¹dˆ`޲À;q1iHÅ=ï¼Á÷9ïðV +¶eÑ 9S{Œ«!ù^à Ý’‹}ÍQý½òN×-Fê zèVÐ}¾ËVys}w/›¢ÛZ2m´ù¨á|axšcÖJÍÚ-»áe ´¾˜1#éo½\œBJªÿz¦ëâÄ_ö3¬ü³ËMó +#C¡UíéÆå®˜•MŠ›§î[3˜ Qú2„ RüÂñ+‚0#FË!ÉÁ¦“ý×ïÍ"ðù->Û?o+—§²úi¤µò󸢛 endstream +endobj +3391 0 obj << +/Type /Page +/Contents 3392 0 R +/Resources 3390 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3357 0 R +/Annots [ 3397 0 R 3398 0 R 3400 0 R ] +>> endobj +3397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 615.6894 133.6164 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.5865 615.6894 154.6474 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00083_5e8637b1514d03eb3eb12dc9a502e27e) >> +>> endobj +3400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.7915 602.7379 190.0639 613.6419] +/Subtype /Link +/A << /S /GoTo /D (a00083_20fae11b540a561c622a0d74cb4b9f97) >> +>> endobj +3393 0 obj << +/D [3391 0 R /XYZ 90 757.9346 null] +>> endobj +991 0 obj << +/D [3391 0 R /XYZ 90 739.9346 null] +>> endobj +206 0 obj << +/D [3391 0 R /XYZ 90 739.9346 null] +>> endobj +3394 0 obj << +/D [3391 0 R /XYZ 90 716.7484 null] +>> endobj +3395 0 obj << +/D [3391 0 R /XYZ 90 634.6393 null] +>> endobj +3396 0 obj << +/D [3391 0 R /XYZ 90 634.6393 null] +>> endobj +3399 0 obj << +/D [3391 0 R /XYZ 90 619.6744 null] +>> endobj +3390 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3403 0 obj << +/Length 619 +/Filter /FlateDecode +>> +stream +xÚ¥UKoÛ0 ¾ûWøè¬‘z«Ç¡¬À€­Í­-ÏQ€óXê`í¿mÉ©[»ÉaðÁ”H‘©¦@¦R£ sBê´\'.hû&Á¨ÎIŸ÷ ¾N“/×Ü¥Ž9Íu:·42Å‘§ÓÙC†&9—RavøöƒD2ÂeQAº¯÷‡²>ì'h3•Ûò°ö›º¨WÛÍäiz›\MH"P%468þ$OÎðmL8«Ò¿´†ÎñtH.ºE•Ü'?~‚¢=0–¯B1ž0JF;¼Ë˜SLHØ0;ɲ]ÝÏ-Èw~îC’›Ò7IoÈœR­7*pãŒÛ£7†Ñߥ¯‹Uåg±<þ¹Ü¯vcűŠZ“jC•6z<µÎ(ï[ ïÓ: È— šÕÕK±ÞUþùâcdÎŒàx2´d΢$±Õ5;ûETÝõ"fP¨1„¢‡ðhw4k Ζå®dË@aé¦ôi€ùÑê\è·&4k‚¦¹ì|pâ© …»ô|³jo­½Æ"£Zm"ï• ÿí<ü›UÔíj¶dŸÐFHF÷hóÖX×+_ÍžGÚGYÍ´0âÓ>ïŒU]3)¬|óÓÄ}ä\ 9ÑðY‰“[Nˆóœ ¾s õYtÝ;tUù« £n³ +N£ãL:0çÑ NSÏ‚‹f° ©êh¾ {ú¦d4¢Q¥˜´ÎŒYEG­ôÊ––Žþþ¬ÐDs@‰ N›©HÝ€Òè6±¿ñû¢îÆVÇûïp;A•âyüÃ<>@i>á*ÛîÃbøžü~힎—×…ÌÅfšwÐzUúŠh¡endstream +endobj +3402 0 obj << +/Type /Page +/Contents 3403 0 R +/Resources 3401 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3357 0 R +/Annots [ 3406 0 R 3409 0 R 3410 0 R ] +>> endobj +3406 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 667.9234 139.9724 690.8921] +/Subtype /Link +/A << /S /GoTo /D (a00049) >> +>> endobj +3409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 584.4605 130.8466 594.3882] +/Subtype /Link +/A << /S /GoTo /D (a00155_g3983e0c026396d5c4506779d770007ba) >> +>> endobj +3410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [131.3447 584.4605 140.5301 594.3882] +/Subtype /Link +/A << /S /GoTo /D (a00084_c3fa0fa86689e3e7c039a16c16861dbe) >> +>> endobj +3404 0 obj << +/D [3402 0 R /XYZ 90 757.9346 null] +>> endobj +992 0 obj << +/D [3402 0 R /XYZ 90 739.9346 null] +>> endobj +210 0 obj << +/D [3402 0 R /XYZ 90 739.9346 null] +>> endobj +3405 0 obj << +/D [3402 0 R /XYZ 90 716.7484 null] +>> endobj +3407 0 obj << +/D [3402 0 R /XYZ 90 602.4342 null] +>> endobj +3408 0 obj << +/D [3402 0 R /XYZ 90 602.4342 null] +>> endobj +3401 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3413 0 obj << +/Length 1159 +/Filter /FlateDecode +>> +stream +xÚ­˜MoÛ8†ïþ::@Ååð[9.Ò`ÝÖ·¶(\[I\ø#kËhúïw(’ +mÚ¤ƒ>X²^Ï<äK)BEñUC+-5i¸PÕl5¢Õ=þüqþqÏëXðçdôÇÖT iSÕä® €H¬šÌ¿ŒQ{U3IÇ»U÷ø}×M»ÖÝî¶ûYç®?µwíö +̸]Ïìc-˜‡«o“ÛÑûÉßãI®Àfÿoôå­æˆy;¢„7FV¿ð†hV­F‚ñp³}ý;Äqú?œj¥~º™ þÂB;6[GÍJ_ÒNlœ‹ +¤‘²ŠÝkƒ23D%àãÞ´Ýt±lç.ÒM»›mÝb³>î$# £+¥P­N71ˆêX•ºiB)ÇX†ÊA÷T«Çe»»>Î ”ÍdS ÒxÙ?³¿lïý£O PM4pyŠG„ƒnYćv¹ÜÔ¿®€Ž7Ûåœ<$¨vŒê]Ì ®µ¬Ð;ʋʦ1 ÆPV2-ÈʦE_¿AÉÓ ÖÆt{P§v(š(ìß,Þ¥;A mñ‚î-]¶ë´pb47Y¾Z{‘wUžw•û¬K®YÙÕ(àë]ÍÓ ®ÆtW3x/w57¸ãíÚuwÆVŽ36 hmíEÅÉ*I]|›dE[〯¶µ@tty[sx/¶µ€txø.rütÚZM¨¢* Yk/*[kχXñ¥b•­¾ÞÚ<Ý`mLW°6ƒ÷rkóxƒµ1ÎØùc·Mmmˆ`ø˜¬µÕ°\ŸÙ9Qd%õ«ZûÁ[0œÇ'Œ +Ç®þí¶ Ûu»Å—`ÌIþ·vDïý 0ÿM¯¿fÔÝ1J•»º»br¼Ùº›ý_ÿx5ñ¿ýYêæé÷}:Eì)p@‹úçõÖendstream +endobj +3412 0 obj << +/Type /Page +/Contents 3413 0 R +/Resources 3411 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3357 0 R +/Annots [ 3416 0 R 3417 0 R 3418 0 R 3421 0 R 3422 0 R 3424 0 R 3426 0 R 3428 0 R 3430 0 R 3432 0 R 3433 0 R 3435 0 R 3436 0 R 3438 0 R 3439 0 R 3441 0 R 3442 0 R ] +>> endobj +3416 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 667.9234 162.5673 690.8921] +/Subtype /Link +/A << /S /GoTo /D (a00037) >> +>> endobj +3417 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.5561 667.9234 193.8396 690.8921] +/Subtype /Link +/A << /S /GoTo /D (a00038) >> +>> endobj +3418 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.7051 667.9234 242.5466 690.8921] +/Subtype /Link +/A << /S /GoTo /D (a00039) >> +>> endobj +3421 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 584.4605 133.6164 594.3882] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3422 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 584.4605 154.3681 594.3882] +/Subtype /Link +/A << /S /GoTo /D (a00085_0bb4f34164e7207c2db26b77f23ccfff) >> +>> endobj +3424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 572.5901 150.7619 581.4367] +/Subtype /Link +/A << /S /GoTo /D (a00085_3592a1f5ae100db2ed9c0810b41c7bc7) >> +>> endobj +3426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 559.6386 162.3783 568.4853] +/Subtype /Link +/A << /S /GoTo /D (a00085_668cab7d54ff0a2fc2a2179ca06b0798) >> +>> endobj +3428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 544.6299 171.2348 555.5339] +/Subtype /Link +/A << /S /GoTo /D (a00085_503c2994a4e52300516e2b820f0fc65b) >> +>> endobj +3430 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 531.6785 159.6186 542.5824] +/Subtype /Link +/A << /S /GoTo /D (a00085_04833004cec509a41c502429df308e35) >> +>> endobj +3432 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 518.7271 138.5977 529.631] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 518.7271 169.87 529.631] +/Subtype /Link +/A << /S /GoTo /D (a00085_a312da7b5f6441140721ec7e55f345a8) >> +>> endobj +3435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 506.7519 138.5977 516.6796] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 506.7519 169.3121 516.6796] +/Subtype /Link +/A << /S /GoTo /D (a00085_68204df6bde3e3c27271ebde10579a57) >> +>> endobj +3438 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 493.8005 138.5977 503.7281] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3439 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 493.8005 168.0569 503.7281] +/Subtype /Link +/A << /S /GoTo /D (a00085_0560495c60c68d62617ff1f3d0c424a4) >> +>> endobj +3441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 479.8728 138.5977 490.7767] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 479.8728 170.418 490.7767] +/Subtype /Link +/A << /S /GoTo /D (a00085_5ed2615cec9e633d90ac5968771976eb) >> +>> endobj +3414 0 obj << +/D [3412 0 R /XYZ 90 757.9346 null] +>> endobj +993 0 obj << +/D [3412 0 R /XYZ 90 739.9346 null] +>> endobj +214 0 obj << +/D [3412 0 R /XYZ 90 739.9346 null] +>> endobj +3415 0 obj << +/D [3412 0 R /XYZ 90 716.7484 null] +>> endobj +3419 0 obj << +/D [3412 0 R /XYZ 90 602.4342 null] +>> endobj +3420 0 obj << +/D [3412 0 R /XYZ 90 602.4342 null] +>> endobj +3423 0 obj << +/D [3412 0 R /XYZ 90 588.4455 null] +>> endobj +3425 0 obj << +/D [3412 0 R /XYZ 90 576.5751 null] +>> endobj +3427 0 obj << +/D [3412 0 R /XYZ 90 563.6237 null] +>> endobj +3429 0 obj << +/D [3412 0 R /XYZ 90 548.615 null] +>> endobj +3431 0 obj << +/D [3412 0 R /XYZ 90 535.6635 null] +>> endobj +3434 0 obj << +/D [3412 0 R /XYZ 90 522.7121 null] +>> endobj +3437 0 obj << +/D [3412 0 R /XYZ 90 510.7369 null] +>> endobj +3440 0 obj << +/D [3412 0 R /XYZ 90 497.7855 null] +>> endobj +3411 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3445 0 obj << +/Length 978 +/Filter /FlateDecode +>> +stream +xÚ¥WMs9½ó+æU‹Vß>î§ârØÝ˜=9.Á¡ +Æ^j“Ÿ’Æ RR)hFOݯûuk$Raø‘ÊàJ … ã²Zl¸z†×ïÄOa~þ˜ ~¿¡¦2ÈH*«ÙêhA$(¡Õlù0$ŒŽÆ”sA†‡÷ÃPà!AØ ®çíÜîÛÝaÑv#¢‡µŸ|Y¶uÓÎÛõK3zœÝ&³Ž‰'*˜$–ǃ‡G\-ðí#f´¨þ‡Œˆ1´Ú8eáa3¸üÓÙqÇ}ñ +Âú&Á"¦åVˆ@tcWõ~±[¿öeJ „‰V•Tv%ûã  qŒJÅÕaÌÀ–f3¢Ž´&_çÛ×M½¿:÷L0EŠQ’u͑фÃð8gßìžýÔLj Á +)ÂDC1ìpÌRôB EB‘¤¸`ùìt¨’óÄšuþ›“hÞ,ï’!‰Ù¹÷ËIøÄnœ„/ £¡5-$! JÎkÖ9²N­ŒÁ…æÕ®€®ëOÓf}¬^—+ß!›uãûF÷ÿ²rÿvÅÆÏu¡ MÄ8‚âvMô¶åܬëÍrß³±-‘dŠ]Üc@_ JÄ™æov¬ßO”Š´AlwC½d=v¨’_Ø“ –òÔïâË|çÒ]«Ø¿°#]¶…=ë3r—‹3àK4»–UzŸöFš1SÈO@•CW0ÊÅ©ã‡Ùän:™]?ýù×ôæiú÷ÓÉýc_Y(è*-Ì岈¹²°rYäó{Yñ€/1HìZŸG«´ì’”éBðUr-à‹IøYÒO5·‚ßM¦½’Ci)Ë/Jr’XYòœÇHò¼ßNòØo^ò¿?"yžAb7’üµMy¤£B6~éAcBa{'Y <”.îÏUåÍ\ïñ…•/A‘µN¸ˆÚA?µ©nê“5ЏÁªL h¬KÔ,¦Ö¶{8¡§û¶FZ1c7VSjI3"KjXYÎÈà¯ë™g× ³Ë+ša÷ó’æÙušÆìÜm%iPøx*¢³ôÆÒƒÆÜž@u¯¦)Ô/]ÛŽ…¡a a,¾ªH¸†AMAlŒÂB{CƒS(|-\hïê¦ÞAtþÖŽ›ÂàvDÄðàõÿøŠ²+꯬céF«×{Hï¶Ÿ¿…kì×oÏur-³7Ë@-ÊÒwÒÁL—endstream +endobj +3444 0 obj << +/Type /Page +/Contents 3445 0 R +/Resources 3443 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3357 0 R +/Annots [ 3448 0 R 3449 0 R 3452 0 R 3453 0 R 3454 0 R 3455 0 R 3456 0 R 3457 0 R 3458 0 R ] +>> endobj +3448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 668.6407 142.7416 690.8921] +/Subtype /Link +/A << /S /GoTo /D (a00044) >> +>> endobj +3449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.6071 668.6407 199.1894 690.8921] +/Subtype /Link +/A << /S /GoTo /D (a00045) >> +>> endobj +3452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 584.0421 161.8301 594.3882] +/Subtype /Link +/A << /S /GoTo /D (a00086_cca775e46d4405b7775b328f7694f7e7) >> +>> endobj +3453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 571.0907 148.62 581.4367] +/Subtype /Link +/A << /S /GoTo /D (a00143_g54a466311575a727830a92a6c3621cb2) >> +>> endobj +3454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 557.5814 159.6884 568.4853] +/Subtype /Link +/A << /S /GoTo /D (a00143_g5eced097547fd3fac4ba2a255493d921) >> +>> endobj +3455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 545.6062 133.6164 555.5339] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 545.6062 169.87 555.5339] +/Subtype /Link +/A << /S /GoTo /D (a00143_gd85fc90c30d1fc37c63c4844be5fe09d) >> +>> endobj +3457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 532.6548 133.6164 542.5824] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 532.6548 154.3681 542.5824] +/Subtype /Link +/A << /S /GoTo /D (a00143_g41bf109b6a45328d5744c0a76563fb6c) >> +>> endobj +3446 0 obj << +/D [3444 0 R /XYZ 90 757.9346 null] +>> endobj +994 0 obj << +/D [3444 0 R /XYZ 90 739.9346 null] +>> endobj +218 0 obj << +/D [3444 0 R /XYZ 90 739.9346 null] +>> endobj +3447 0 obj << +/D [3444 0 R /XYZ 90 717.8172 null] +>> endobj +3450 0 obj << +/D [3444 0 R /XYZ 90 602.4342 null] +>> endobj +3451 0 obj << +/D [3444 0 R /XYZ 90 602.4342 null] +>> endobj +3443 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3461 0 obj << +/Length 1040 +/Filter /FlateDecode +>> +stream +xÚWmoÛ6þî_!`_`âx|g0 ضX€[ëoM(2 “åL–—öß÷(Rš")V0)òáÝsÏŽ$ÿ ±4ÑRË…JòÊ&8ýaq9Åõtøm³úé=³‰%V1•lv­D2`Éfûy­ ÀUÊ$]7ÅÁÕaø©©ÏyÆÝ§Á¬]•;œ²ŒŠ5p~ões»z·é}Gj’+ðžÿY}þB“-R¼]Q­‘É3>Pֲ䰌wåêÓê¯ÞNXh7ÌE(χ‚à ëbd²†”¾1F -ªh¨*ó¥n þPTyyÞF$À)9ÑÖ`-ðç[šhat´|È~Æb‡ˆû%Â0X)Û01$ŽBQT… f.é¾qMV”nâ¼q§¼.žšâXEƒ|¥ÑBkç×aYH¹&~‹&Š Ñ‚6ûâ„8PëS«ç¹ö5zÝMŸO­sœÙë0µuy™ÕEõ³°<ðƒEfѲ ë]Îpx8Ÿš€~ˆ‹'ׄÁsÑìÇ%É•!J2™(&‰Ñ2¾3~©~Œ˜ƒÚêñépC(°¡PS»}.ï‘ЕÿaLG#\i3¢3*ðµ@B`ÁKÆõKeŽÚQ«<«ÂÄCÌÏ ³3’P¬¡DZJ˜âf–\J‡¨i“1–Pê©QFؖٻ¯Ùá©t§ë±c@æ .zÄ8¼œA øz—s‡âõ¸æ)n÷ùSN&eÜ`/Q— ¦=jÉõÄšwýãÄ©àø¢k1rúzä~ÉýÄ®wï®@®C‚ÒCVTåñø”úW*Íê'’É1ň¤°P,=jÒÔÚ¬"Li"°µ¾Q¾è|dõ¢Çs3¯žWDK+.+Ò£HM­EÚ†œUÛIga”(x{±ôøS»žÇ³{ÈËÂUÍôUJøº,CZr?±æÝ‡s(åº3‚ýµ’í⻣”UE{Ĺâ_• #-Âïq~ýŽÒO»=™;sé˳ö&k²°ñ}áÊíiæR$±Õ@ük÷µ!`®S)"¸ÿÙñ~ï“Ó>Š»˜ä—=ö¨%¿x¼XªÔK¿yyÌÿ¾÷"Ý7ÿÊÁ@Žü¿Þ±:ü“‰]ÏäÔdõ”‚QDj¥D OZ+A¾ša1 +/}—3ÓÃ334x!3 ~»Ì¼ðû¦Ì¼ôÿ†Ì,0™ØõLŠªqõ¿WL®³rÂÄZ¢(^n•hQبð> æ`™€ +×£ÿýµÑæÙààlx—QxFû~>&ð>-t¸`}p•«³¦»Qw]ænpëŽs|é5ã׌†'F© +£Wé?HοÿÑ$¾Åkûñë·GWÅôŸBµ>ß±œ ¨endstream +endobj +3460 0 obj << +/Type /Page +/Contents 3461 0 R +/Resources 3459 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3474 0 R +/Annots [ 3464 0 R 3465 0 R 3466 0 R 3467 0 R 3468 0 R 3471 0 R 3473 0 R ] +>> endobj +3464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [367.6562 622.7225 413.364 633.6264] +/Subtype /Link +/A << /S /GoTo /D (a00156_g6614d96fdfcd95c95ec6e6f63071ff51) >> +>> endobj +3465 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 587.1107 139.9724 610.0795] +/Subtype /Link +/A << /S /GoTo /D (a00049) >> +>> endobj +3466 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.9612 587.1107 263.4979 610.0795] +/Subtype /Link +/A << /S /GoTo /D (a00042) >> +>> endobj +3467 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [266.4867 587.1107 399.7556 610.0795] +/Subtype /Link +/A << /S /GoTo /D (a00043) >> +>> endobj +3468 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [419.6211 587.1107 467.8198 610.0795] +/Subtype /Link +/A << /S /GoTo /D (a00041) >> +>> endobj +3471 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.4252 505.6403 187.573 515.568] +/Subtype /Link +/A << /S /GoTo /D (a00087_e8eb428c05bc1dee022246a3063d277c) >> +>> endobj +3473 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.4252 492.6889 200.6041 502.6166] +/Subtype /Link +/A << /S /GoTo /D (a00087_fe557d333c06cf65f52023f45f5b0a3a) >> +>> endobj +3462 0 obj << +/D [3460 0 R /XYZ 90 757.9346 null] +>> endobj +995 0 obj << +/D [3460 0 R /XYZ 90 739.9346 null] +>> endobj +222 0 obj << +/D [3460 0 R /XYZ 90 739.9346 null] +>> endobj +3463 0 obj << +/D [3460 0 R /XYZ 90 687.0765 null] +>> endobj +3469 0 obj << +/D [3460 0 R /XYZ 90 523.614 null] +>> endobj +3470 0 obj << +/D [3460 0 R /XYZ 90 523.614 null] +>> endobj +3472 0 obj << +/D [3460 0 R /XYZ 90 509.6254 null] +>> endobj +3459 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F11 705 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3477 0 obj << +/Length 2106 +/Filter /FlateDecode +>> +stream +xÚ½Z]oã6}÷¯0º/PqùM±( +´mÑAØæmf0Pl%V–\IÎ$ûë÷RüˆÛd g‹<„®Î¥Î%h‘%†?²Ôx©„Bšq¹\oxy§]×A6üt½øû/T/5Ò’ÊåõíA$(¡ËëÍÇaü*£œ ²Úÿö/h +¼"ÛÆ»b(lë¡Û¯‡}wEòUé:Ûõ~[6C1Tmsõùúýâ׉#*˜$†ÇŸ‹Ÿñr„ß/0b:˯p€Ñš.· N™?¨,þâØŽñ‚cù +ÂŽ'L8‚3ÔgLa”MX!B¯2‚1^í«Ý—uÛ4ÓmûCy[Ú\›uirƒ r2Š0Ì4G˜;óoU³®÷‡$d‚ )C#ðû#±RUÍ=QXètt3¡òÕum7W" ö mÜ->aLËzc/®{r¸w½S>Ð_xbCëbŽÏ +JÎ%“éA2@¥šÝ(-ÉV]Yl²¶©ŸÌ!_Ý<ÙÓEãþïvuµ.uf$ch˜®ç‹Ê+"VërçfÌÿÁ¢¹ Ôƒ"ݵ!Asðõ¾í-h·ïvm_¾ÑÚÎn³l{°ze:&gKhÂpšÀPµftLsÒ—õ»r]k³Ì ù \¢;ô-d‹éH´v]»¶j†²ëBì™ñÁ›†MSÓù“挹á2§kÅØá~Lq¼©8€“³ÔÂs3¨»}ç'…ÊÕ¶½74¾"iwºÿÆßã-;Û¶y­íw¥élªçÙ¢psk]5.4!‚Íg’00Û©›éð|Š{^¥~© ßþÈZ$Ìz U~rÑœŽÍ¦Öœ?Ç1÷ýD©8œ¿à**XôŽ霘%!1·A¥L²ó¸;3·U»b³é¾ ,¥@yŠ%E¢¦YÊ1"t’¥ÇÍXv–âA­Î}pù8Ö9pNA‡³5†¥AƵFû³]x™MÉGš°ÒbX±—æWªQa~‰I3µ*û~®àP7¶{ÛÊÅ’âyލæ*žK€0XÓÉiÈ ‡b$¡åKjyðb-'Øy܌ݞÈ#"f0Ý`£ôF«4=ŽÖ”$éyÜŒ^½k»CzDEÀeÇèAÍ€ûÓô\ K !r’°‡Í$\·ë¢~aÔLß΀¦¾¶ÝìÁÍ“—q;êÚ¬„ÕiAƒç!o£f.K^jö°´š'/Wsœ]Pó”]BÍzç«9N/¨yJ¯;®f¸¡Æèe‚Â,¦‚šÉ+ÕL1Ê%g)5{Ø)5¿œqÿê6Z‚¿‰À™–Hå,e=,)ðiÀ‹ž`çq3vûü˜¾)˜Cpl1v¯Õ73òÂy’ÇÍØuë‡/ÍãQO$¸äQ‚Y@¥n n3Eæ·þÈ?Ÿ’Ë ’RËוÌ)™›•L_þ¹÷5l%ì·7ÞÏ÷Þ¤u½¥y“|„w~|m +µ¶.«Æ"O[¦0Rpð65cö–r²8–®™IÀËk&Î.ÔÌ”]¼f"ìί™8»P3Sv}³9^3ôEi”`P©[Kð f?evëXÍpH^‰W–Ì38V1u~ÁîE .úÁ_Ö ~q¯´ýéò` "ÏñLêtyx×Ò<å™,]“€——Gœ]()»¸gŠÑ;Û3%èyÜŒ^]î!3$e|ì2Õ†9;Ó11ÌÍqÊ1˜¡ø{ÙÜ ÷'^V7a 刢wv²7ÛqU»ïë§g}ŸÔ3Õ1JÞÆ"Q¥Í)‹`I=O^¬ç;›±‹ë9Fïl='èy܌޶ïõ ÎG3%—ñ<ÉóÞg©äç"egÌPüyßY]úIv[> endobj +3480 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [107.8759 622.1864 146.9492 633.0904] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +3483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 511.2147 166.8215 522.1186] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +3484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 511.2147 198.084 522.1186] +/Subtype /Link +/A << /S /GoTo /D (a00088_79510aa86d3fa0a0fc6cfc49b1da7279) >> +>> endobj +3486 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 472.02 138.5977 482.924] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3487 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 472.02 159.9075 482.924] +/Subtype /Link +/A << /S /GoTo /D (a00088_0cd09beee671e7e9efb0b4aced10249e) >> +>> endobj +3489 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 432.8253 138.5977 443.7293] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 432.8253 160.4555 443.7293] +/Subtype /Link +/A << /S /GoTo /D (a00088_1df6aa054ef2fa634ac4c6f418228285) >> +>> endobj +3492 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 394.1886 133.6164 404.5346] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 394.1886 166.5427 404.5346] +/Subtype /Link +/A << /S /GoTo /D (a00088_70297b3e6d4eaae7bd828cb50bd1efe3) >> +>> endobj +3495 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 354.9939 133.6164 365.34] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 354.9939 167.6585 365.34] +/Subtype /Link +/A << /S /GoTo /D (a00088_8f6b08a5ba2a8d75ca7279e2056aa8c6) >> +>> endobj +3498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 316.2176 138.5977 326.1453] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 316.2176 153.2625 326.1453] +/Subtype /Link +/A << /S /GoTo /D (a00088_0ef3ae2764714bf90620075c374c262e) >> +>> endobj +3501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 277.0229 138.5977 286.9506] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 277.0229 156.5899 286.9506] +/Subtype /Link +/A << /S /GoTo /D (a00088_3347ef1b6e8581402445d1a0280c7a14) >> +>> endobj +3504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 237.8283 138.5977 247.7559] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 237.8283 179.8421 247.7559] +/Subtype /Link +/A << /S /GoTo /D (a00088_db7a3fadb68df5fdd37e8b91a2c751ea) >> +>> endobj +3507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 198.6336 133.6164 208.5613] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 198.6336 144.4057 208.5613] +/Subtype /Link +/A << /S /GoTo /D (a00088_ef661afb3aa82f0437d2ed8d3c20be76) >> +>> endobj +3510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 159.4389 133.6164 169.3666] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3511 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 159.4389 144.9637 169.3666] +/Subtype /Link +/A << /S /GoTo /D (a00088_eb9fcbd3c9b0a795dcd63f33c323d65c) >> +>> endobj +3513 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 120.2443 133.6164 130.1719] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 120.2443 147.1754 130.1719] +/Subtype /Link +/A << /S /GoTo /D (a00088_e3aa9cc25e45b663e6aabc54c013019e) >> +>> endobj +3478 0 obj << +/D [3476 0 R /XYZ 90 757.9346 null] +>> endobj +714 0 obj << +/D [3476 0 R /XYZ 90 739.9346 null] +>> endobj +226 0 obj << +/D [3476 0 R /XYZ 90 739.9346 null] +>> endobj +3479 0 obj << +/D [3476 0 R /XYZ 90 685.4723 null] +>> endobj +3481 0 obj << +/D [3476 0 R /XYZ 90 530.3348 null] +>> endobj +3482 0 obj << +/D [3476 0 R /XYZ 90 530.3348 null] +>> endobj +3485 0 obj << +/D [3476 0 R /XYZ 90 491.2835 null] +>> endobj +3488 0 obj << +/D [3476 0 R /XYZ 90 452.0888 null] +>> endobj +3491 0 obj << +/D [3476 0 R /XYZ 90 412.8942 null] +>> endobj +3494 0 obj << +/D [3476 0 R /XYZ 90 373.6995 null] +>> endobj +3497 0 obj << +/D [3476 0 R /XYZ 90 334.5049 null] +>> endobj +3500 0 obj << +/D [3476 0 R /XYZ 90 295.3102 null] +>> endobj +3503 0 obj << +/D [3476 0 R /XYZ 90 256.1155 null] +>> endobj +3506 0 obj << +/D [3476 0 R /XYZ 90 216.9208 null] +>> endobj +3509 0 obj << +/D [3476 0 R /XYZ 90 177.7262 null] +>> endobj +3512 0 obj << +/D [3476 0 R /XYZ 90 138.5315 null] +>> endobj +3475 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F11 705 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3517 0 obj << +/Length 824 +/Filter /FlateDecode +>> +stream +xÚ­—KoÚ@€ïþ>šÛ™}oŽ}ET©M¸%QDˆ¡HÁ¤Ø¨É¿ïàõºæµ¥âÀ®wX3ú¯1ú`ê 5Ê0'¤N'‹Ò]¾L°YÒú°ðq”|øÊ]ê˜Ó\§£i½ƒF¦8òtôt›†|0ä +²õüåa², +?»©VëIåÇ×ù4_ Ðfy1Éé’Q2jp?ºJ¾ŒÚÛ7tJhÜÜüwr{éQ^%À„³*ýC`èO‰ä"Lž“›äg»_¨p(ÉÍ2Aø”ŽVSΆÿ+‚èA3)¬LCÔ¦wœïe„@ë\‰´³Ýîí$s دm®¬fÍÒu +‘Aë>´ÖE[Û‡jMp¦9` 3éÀô£ ÅÁö¡…°.Z5y)«q•߈ñ¬Ü£´’ ­xŒrh ã 8PîRvcöbÈXM±n[T©%T-kTºG¨MÔuôé‡÷¹öÃqñä5ÿ!›•lßO’vlø3§P”ö¡jÓchÖ«hwÃw;ÚCâ¶è¢–ÆèÎÖ´‡.ÄmÑUó5±]<¥JTQ¼¡$±Œ“çøI#mho#LÔP—¶aµ¢¿/Wa²¼¢®«ÈÑr1/Ëù²iÍ>DÌŽ™JåÖŠq”öUñWg\ Ùçjëwµ³áAWå©®š^ºÖÕ.]ÜÕÝù®ÆéZW»tŪzÝW• Õ £tC)˜sVž×Jµ0L “=½´ Û2µX/IÇz¼œÆì-ýâtÙDWa‹çqÙœ4Ê| ©/ò¢½PTGû1Õ. þO?FÁ$øæs<„õ;ÞÙðýý8N×:Þ¥Ûèèñü0~ñèÆ;Øôe=ÕxGÿ-y/kˆÛb Œ»„T`ry”êd©»3OÊY&µÂíÛ°-í øy>WmWöø$üQ]•¥³1h~’® +ÉmepʉZéw²ké-ý„Ú^÷UAÓ³NØðª@=G]§~™ùŠrlL!ïïapµI~ÝLÂKÂüŒè¦ ¸ÊB#XkfÈšÀÇ7ÿýyùú6ˋ݊*úï´N}þÕ7Ä!endstream +endobj +3516 0 obj << +/Type /Page +/Contents 3517 0 R +/Resources 3515 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3474 0 R +/Annots [ 3520 0 R 3521 0 R 3523 0 R 3524 0 R 3526 0 R 3527 0 R 3529 0 R 3530 0 R ] +>> endobj +3520 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 726.8189 133.6164 737.7228] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3521 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 726.8189 185.3615 737.7228] +/Subtype /Link +/A << /S /GoTo /D (a00088_a5f58074435cdc180f17de69651beebd) >> +>> endobj +3523 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 688.9408 133.6164 698.8685] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 688.9408 157.1377 698.8685] +/Subtype /Link +/A << /S /GoTo /D (a00088_2d9732cf5752d30bd11cb25dc7d0c8d3) >> +>> endobj +3526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 650.0865 133.6164 660.0142] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 650.0865 152.1567 660.0142] +/Subtype /Link +/A << /S /GoTo /D (a00088_4289c59840b128f2f6526e9da2711d47) >> +>> endobj +3529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 610.256 191.1698 621.1599] +/Subtype /Link +/A << /S /GoTo /D (a00085) >> +>> endobj +3530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.6679 610.256 226.3075 621.1599] +/Subtype /Link +/A << /S /GoTo /D (a00088_97f9e1fda815bfb8b1f4577c355ade20) >> +>> endobj +3518 0 obj << +/D [3516 0 R /XYZ 90 757.9346 null] +>> endobj +3519 0 obj << +/D [3516 0 R /XYZ 90 739.9346 null] +>> endobj +3522 0 obj << +/D [3516 0 R /XYZ 90 707.0579 null] +>> endobj +3525 0 obj << +/D [3516 0 R /XYZ 90 668.2036 null] +>> endobj +3528 0 obj << +/D [3516 0 R /XYZ 90 629.3493 null] +>> endobj +3515 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3533 0 obj << +/Length 646 +/Filter /FlateDecode +>> +stream +xÚ¥UMoÛ0 ½ûWØÅ9X%õe©vú°µ¹µAáÆJk u:ÇÆÖ?Ê–S'õšÃC$‘||¢hŒ~[ˆ3•1+¤Ž—ÏÄt|a0§dOÇ_çÑÉ·±eVsÏW‚F¦8òx^Ü&(ô,åR*LÚo?h© Aýâ,oò~uÓÔí²iëšÄãfÙ>»ªÉ›rSÍó«è|¾cˆ*¡ÑóøÝ. .ˆðULX£âß´†Öòø9’\ ›utýÜáô†.`J¯B1-%£>(æT€¬œ1³ iË—{×<ÝçEQeöëk·r½Þjé¼>Ö£JR©¹O¬²÷SY-×m<GžJ°ÌÒ9~žÀÊX&Mˆ{š€!Æd6x} 0¤™UªÓšZdRH§B24#É ƒè3×äåÚáÝvY—/Þ8è i±Ã¹v/µÛجúÿÐ'Ò¤e(àyóäêÊ…/²Ûn™Oã1cšú®>sw¼*ß`óµ.«Ðn¨$ßOécÖÁÚÕŒM•ökñÖÒ¥[Û‰ÆUÚ2àBþó…ú† AÓù†ãóÞq®s!PWâÃŒ’Yƒ¾w:›?©ƒézÄ ©ã-h}”Ýà·Ç®5÷Í;v‚Ó ~ÈŽ3i!;ÎN(†æ(»Áo]÷>Ù)Î Êk—åUŠ  w³—÷V/¦æ2”Ùäü‚D­ô¼®Å …ÐŒGš¦&Œg+8úé6Pñd/]åê¼ö𾋫ª¤  O ᔋSÆ=Ðýj5ã*Ù„¡øþ»ðð:|þ¼>ºwÃßOå‰*ýZendstream +endobj +3532 0 obj << +/Type /Page +/Contents 3533 0 R +/Resources 3531 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3474 0 R +/Annots [ 3538 0 R 3539 0 R ] +>> endobj +3538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 566.4282 133.6164 576.7743] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 566.4282 153.8105 576.7743] +/Subtype /Link +/A << /S /GoTo /D (a00089_aacd5fa1806e0f0dd0bc96dd36507ad8) >> +>> endobj +3534 0 obj << +/D [3532 0 R /XYZ 90 757.9346 null] +>> endobj +996 0 obj << +/D [3532 0 R /XYZ 90 739.9346 null] +>> endobj +230 0 obj << +/D [3532 0 R /XYZ 90 739.9346 null] +>> endobj +3535 0 obj << +/D [3532 0 R /XYZ 90 685.9318 null] +>> endobj +3536 0 obj << +/D [3532 0 R /XYZ 90 584.8203 null] +>> endobj +3537 0 obj << +/D [3532 0 R /XYZ 90 584.8203 null] +>> endobj +3531 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F11 705 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3542 0 obj << +/Length 729 +/Filter /FlateDecode +>> +stream +xÚ¥VËnÛ0¼ë+ô"Ärùƒ¢‡ÂIÐÚÄ·$T‹¶8²+Ëhó÷]I”C?"%0|HÎîÎìP&!¤øƒÐÐPKM *œ>4œãôun9ÆõØ|›Ÿ¯˜ 1Š©p2k2( ’ 'Ù}¤ ˆQÌ$¶ùúÉV‹§EV¶wU¹Víû­ÙrId‹©Å)ŤހëÑãä&¸œì8‚’+¨ëÿ îi˜!Ñ›€nþÅ%` ŸÁx7XwÁ¯]žv¡ 8¥S?-ÁÖ)e(\ûBÒ)Ey˜Wy ijº®ÔMÚOy1]n3‡ð’mÔÑ¿œÈ¥‰‰v€šUZ®Éb0ÕW— +å1R6rc‰Ú%6† ‰'›€>¶Uš/mÖ*ÛÍ´Ì×U¾*\B~ ³n¦&ÏdaÛ¨Ëja˺n-lša»¤ŒH£ŽM¢‰ÛJY‘75š€Ô.óÂ%T¼}®fí³ŽXÚ×=Ùô„œ’L÷¥ŽÓ*mîr»Ì6'ö¦T†PÆÅ›h÷”ß Šžˆ×> endobj +3547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 565.8703 168.4754 576.7743] +/Subtype /Link +/A << /S /GoTo /D (a00089) >> +>> endobj +3548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.9735 565.8703 187.0156 576.7743] +/Subtype /Link +/A << /S /GoTo /D (a00090_b684c17bf48c8e3b3fcf97b06b4c6ee1) >> +>> endobj +3550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 552.9189 168.4754 563.8228] +/Subtype /Link +/A << /S /GoTo /D (a00089) >> +>> endobj +3551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.9735 552.9189 182.5823 563.8228] +/Subtype /Link +/A << /S /GoTo /D (a00090_1abbbe7bc5d7d033c727691528b85b8d) >> +>> endobj +3553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 539.9675 138.5977 550.8714] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 539.9675 158.2438 550.8714] +/Subtype /Link +/A << /S /GoTo /D (a00090_c9273cc1fcdaeeddc523ca9f34977e06) >> +>> endobj +3543 0 obj << +/D [3541 0 R /XYZ 90 757.9346 null] +>> endobj +997 0 obj << +/D [3541 0 R /XYZ 90 739.9346 null] +>> endobj +234 0 obj << +/D [3541 0 R /XYZ 90 739.9346 null] +>> endobj +3544 0 obj << +/D [3541 0 R /XYZ 90 685.9318 null] +>> endobj +3545 0 obj << +/D [3541 0 R /XYZ 90 584.8203 null] +>> endobj +3546 0 obj << +/D [3541 0 R /XYZ 90 584.8203 null] +>> endobj +3549 0 obj << +/D [3541 0 R /XYZ 90 569.8554 null] +>> endobj +3552 0 obj << +/D [3541 0 R /XYZ 90 556.904 null] +>> endobj +3540 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F11 705 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3557 0 obj << +/Length 1344 +/Filter /FlateDecode +>> +stream +xÚ­™_sâ6Åßù~$Vuõ_ûØIw§™éL»›·lf‡‚“xJ€Ó6ß¾2–„ˆí«õÐჯ~Ò9X2‚‚º–Zjb¹PÅòuF‹g÷õ§øÓ¥;_¦‚Ÿïg?}d¶°Ä*¦Šû§SD2`ÅýêaÜÜ”L ó㯿»CIç@hwp»hÝÑ—f\6Çý ˜yåOn—Ç×jÓ,šz»¹y¼¿›ýrI<¨ä +ZŽï³‡GZ¬ðÝŒn,þq(kYñ:Œ‡ëٗٱNwâtÁP%ðრîzÌÜè®Ãš€¼)R:?Ö»oõòuçÞ^Vû´£Ýñçê©êz¼YVm»Ò@¬”§Òn´ÛÊÌœKðÅo«fQ¯«•¬ê°Ü×»0T®OLië´À¶«s[}¥”mê“útù­ë}p#ÓmŸº÷öšµ?ëzF^È2Œ³Ãëj½: ø¨À#˜ \*èÆ?íPE7â\§m÷+cò}[@Û±”mQkœé´;×~³ö§>'\à`©RYº » ;šoMŽ3¢”Ža©ÎÓq— &Ktt¿¬{pB·ç-n–ô¢˜Ë ŽRIŒ…œ¡^•÷ó\îz;Q´èf‚†›9Ž6ÝK-Z™ 5ÛCßIE4×X);‰·QŒÚ(­p«2>FYÖÈ´àÕNfè‚î‚õ£›lf†.è.èÖÕfè‡ÉŒ°(\U¹f…%ZËwƒòÀnÛR»ëŒ›™FÓ‘°tY>H‹ÓÓÓÅt¤tx:ºééÀéb:RºzW¯zt’LànEU®]É P—íŽÄCiB¹ÒãñHX<‚,¤ÅéñÀébCttÍÛ®êOõÎG¥ð±+•e§¡á:ûÜeyK“‚×[ŠÓEKS:ÜR„nº¥8]´4¥«—ÛU5´|SÆ*¯]¾DyO•[¼³ìCV”å=M +^ï)N=Méð›9†7ùfžÁ º ¼vWhdgP7â(c Ô«òÖJJ„Î>my™ùkƒò±6)†Y›Òe¬Eð¦[‹ãEkS¼?áÂæ Æö~óqÔuU²ì³V”åM +^ï(NMé2Ž"xÓÅñ¢£)Þ¡ú¾é?@»Ÿ'çB£x¥ö¢’«ö>-­§Ž”TWmdŸ¢aÜ%næJ7ª±§d>œ¹ Û=kížøÝ¼qêÛ§jSíMØFûÁ¿…ƒ»ó£ÿ̿ӌ`~ŸQªº£Óÿ‹[¿ÑÝßíÿó-lìÿûöÜßÊh÷ÚZ2Jÿ¸™·(endstream +endobj +3556 0 obj << +/Type /Page +/Contents 3557 0 R +/Resources 3555 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3474 0 R +/Annots [ 3562 0 R 3563 0 R 3565 0 R 3566 0 R 3568 0 R 3569 0 R 3571 0 R 3572 0 R 3574 0 R 3575 0 R 3577 0 R 3578 0 R 3580 0 R 3581 0 R 3583 0 R 3584 0 R 3586 0 R 3587 0 R 3589 0 R 3590 0 R 3592 0 R 3593 0 R 3595 0 R 3596 0 R 3598 0 R 3599 0 R 3601 0 R 3602 0 R 3604 0 R 3605 0 R ] +>> endobj +3562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 616.6656 133.6164 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 616.6656 148.8392 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00091_7d472d8b3c41618d39c93c4ca92fb3f4) >> +>> endobj +3565 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 603.7142 133.6164 613.6419] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 603.7142 147.7332 613.6419] +/Subtype /Link +/A << /S /GoTo /D (a00091_a3f2d9cb20290019b2743e8df31a2f8b) >> +>> endobj +3568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 590.3444 133.6164 600.6904] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 590.3444 148.2812 600.6904] +/Subtype /Link +/A << /S /GoTo /D (a00091_b15853725b233d526b291db0347d4ecd) >> +>> endobj +3571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 576.8351 133.6164 587.739] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 576.8351 151.6087 587.739] +/Subtype /Link +/A << /S /GoTo /D (a00091_308463cc7b3d45d2dbcdcedd4cde9bb9) >> +>> endobj +3574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 563.8836 133.6164 574.7876] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3575 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 563.8836 166.2933 574.7876] +/Subtype /Link +/A << /S /GoTo /D (a00091_4619e69ec86a47f6abe945b39ec7f63a) >> +>> endobj +3577 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 551.9085 133.6164 561.8361] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 551.9085 144.4155 561.8361] +/Subtype /Link +/A << /S /GoTo /D (a00091_55be3d5413ce49c5c4f5576def12d7ec) >> +>> endobj +3580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 537.9808 133.6164 548.8847] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 537.9808 157.138 548.8847] +/Subtype /Link +/A << /S /GoTo /D (a00091_55e7764a9f6ed05aaa98076b9f6770a5) >> +>> endobj +3583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 525.0293 138.5977 535.9333] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 525.0293 179.8327 535.9333] +/Subtype /Link +/A << /S /GoTo /D (a00091_babb9c2be394477af97f79507bcb4c86) >> +>> endobj +3586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 512.0779 138.5977 522.9818] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 512.0779 178.1589 522.9818] +/Subtype /Link +/A << /S /GoTo /D (a00091_0ec6a6cbcbfd191d393738c16d54e5e1) >> +>> endobj +3589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 499.1265 138.5977 510.0304] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 499.1265 182.5922 510.0304] +/Subtype /Link +/A << /S /GoTo /D (a00091_e27f4949613fe3c1de5a839af01d99dd) >> +>> endobj +3592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 486.175 133.6164 497.079] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 486.175 153.2625 497.079] +/Subtype /Link +/A << /S /GoTo /D (a00091_fa0fe6ca88f692d22af70ff007411252) >> +>> endobj +3595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 474.1999 133.6164 484.1275] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 474.1999 157.6859 484.1275] +/Subtype /Link +/A << /S /GoTo /D (a00091_266ea23d75c83f15b915ce54100e51c5) >> +>> endobj +3598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 460.2722 138.5977 471.1761] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 460.2722 192.0068 471.1761] +/Subtype /Link +/A << /S /GoTo /D (a00091_805f8fd5533a6d4b6793e0645005da4c) >> +>> endobj +3601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 448.297 138.5977 458.2247] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 448.297 148.8392 458.2247] +/Subtype /Link +/A << /S /GoTo /D (a00091_a6d51f3fa5da9b7f9cd37ae69600c04a) >> +>> endobj +3604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 434.3693 138.5977 445.2732] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 434.3693 164.331 445.2732] +/Subtype /Link +/A << /S /GoTo /D (a00091_967def494c68cfc8a08d5a6c4dbbc25d) >> +>> endobj +3558 0 obj << +/D [3556 0 R /XYZ 90 757.9346 null] +>> endobj +998 0 obj << +/D [3556 0 R /XYZ 90 739.9346 null] +>> endobj +238 0 obj << +/D [3556 0 R /XYZ 90 739.9346 null] +>> endobj +3559 0 obj << +/D [3556 0 R /XYZ 90 716.7484 null] +>> endobj +3560 0 obj << +/D [3556 0 R /XYZ 90 634.6393 null] +>> endobj +3561 0 obj << +/D [3556 0 R /XYZ 90 634.6393 null] +>> endobj +3564 0 obj << +/D [3556 0 R /XYZ 90 620.6507 null] +>> endobj +3567 0 obj << +/D [3556 0 R /XYZ 90 607.6992 null] +>> endobj +3570 0 obj << +/D [3556 0 R /XYZ 90 594.3295 null] +>> endobj +3573 0 obj << +/D [3556 0 R /XYZ 90 580.8201 null] +>> endobj +3576 0 obj << +/D [3556 0 R /XYZ 90 567.8687 null] +>> endobj +3579 0 obj << +/D [3556 0 R /XYZ 90 555.8935 null] +>> endobj +3582 0 obj << +/D [3556 0 R /XYZ 90 541.9658 null] +>> endobj +3585 0 obj << +/D [3556 0 R /XYZ 90 529.0144 null] +>> endobj +3588 0 obj << +/D [3556 0 R /XYZ 90 516.063 null] +>> endobj +3591 0 obj << +/D [3556 0 R /XYZ 90 503.1115 null] +>> endobj +3594 0 obj << +/D [3556 0 R /XYZ 90 490.1601 null] +>> endobj +3597 0 obj << +/D [3556 0 R /XYZ 90 478.1849 null] +>> endobj +3600 0 obj << +/D [3556 0 R /XYZ 90 464.2572 null] +>> endobj +3603 0 obj << +/D [3556 0 R /XYZ 90 452.2821 null] +>> endobj +3555 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3608 0 obj << +/Length 526 +/Filter /FlateDecode +>> +stream +xÚ¥TMOã0½çWø˜êñ·9® +ˆJ+íBo€PhÜ6RIÙj—¿vì”P*±ÊÁö|<¿7ž ð DKM-Š,ž2 +o¾Ì0¹'Þ?|Ÿgß.˜%–ZÅ™/{…T2dd^Ýæš¢*&LB¾«ŸW¯ÖÛö¡¬ª6šoºv·èâþÚ-][ É]³pÞÄ™T9r[ÜÏgÙù|Ï#Ñ”\a`ñ;»½Ryº³ (·F’?þ­eä)Œ‡Mv“ýÚãDGŸpL­D~\. +ê-lÐ˼|=–‹_ÐëEFt¤VÊÝ—;€3ó†N1áO]WÖWE¨©{Y´õsWo›ÄG¯pgq¦î€5uݧ—‰Ñ¦n\Ü ×í2®!cãöO9¤RætM?`ÏE“j3-»2æ_ÔnS½yU…†Áä‡Í7ˆ¯1–‰ ¨àF¼á„{w!„²Jþé‚Zã[¢/XÚUr]x¡o Jd7ĽcÚÄuëØ!‡,•¦B[ü”%£Â‚>ÍR&Öœd9Ľcy”ÑTiÎO¼Z +šHáwVØcQà  ’ú¿¦¹oãSÐ_7šVå§“›aX‘¢Ðªué×–Ý0BÃ,ü6³e¾Kdi…3ÆÏÄH¿·eÁd¾MC¾»ú™¢i +||MsºýûºrÍa-ïf 6ªÏ?f¾? endstream +endobj +3607 0 obj << +/Type /Page +/Contents 3608 0 R +/Resources 3606 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3615 0 R +/Annots [ 3613 0 R 3614 0 R ] +>> endobj +3613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 615.6894 168.4754 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00089) >> +>> endobj +3614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.9735 615.6894 188.6695 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00092_4dc3294d67d705f7248ef57e4259424f) >> +>> endobj +3609 0 obj << +/D [3607 0 R /XYZ 90 757.9346 null] +>> endobj +999 0 obj << +/D [3607 0 R /XYZ 90 739.9346 null] +>> endobj +242 0 obj << +/D [3607 0 R /XYZ 90 739.9346 null] +>> endobj +3610 0 obj << +/D [3607 0 R /XYZ 90 716.7484 null] +>> endobj +3611 0 obj << +/D [3607 0 R /XYZ 90 634.6393 null] +>> endobj +3612 0 obj << +/D [3607 0 R /XYZ 90 634.6393 null] +>> endobj +3606 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3618 0 obj << +/Length 1936 +/Filter /FlateDecode +>> +stream +xÚ½Z]oÛ6}÷¯0°˜X~Šd1 Ø’µHYã>µEáØŠ-̱3¤ †ý÷]Z$CEÅÔk‘‡Èñ½¼‡<‡——7"C ?d¨ñP +‰4ãùpv;ÀÃüùõ€Ø¯3ø> ~ ^¼¢z¨‘Îi>œÜGÈ ”ÐádþaD8g”sAF‡‹KxxD®ΧûiõtµßfûÃvLÔ¨°_nf‡Ûb½ŸîËÍzüiòfðÛÄ#±@ˉÁñ×àÃ'<œà7Œ˜Vbø>`D´¦ÃÛ§Ì}X ®øqª/Žmó„µO˜p¡nÆ@V–ˆÈqF0Æ£Cy÷yøwá«çwÅMQMv=+Ìä`Ôf0÷œrvœÁyñcº.ó­â[¿U¹¶@e´zÚXÆge¿=’ƒÚÖ»EWU(¿q^•Åj¾kÙ"WÀ;‘û84¨d²Cpd+þ8މû‘Rñ4ÁàEkøô·Gà½úpÀNÓ8Ïë8vÁVú§d¥r €DޤÊíÖ6_mÖæ]ÅÙg¡C ”ƸvCU›üó¾ cn°×€ÔW‚"®±Ù= %†l'ûA:»Èùvs×@§”É*Š.óV͸‡qAžŠ=üøÀq?Ü^Cž« ~¾s1ÚÜݹ½x7)ý9&xT¸dé¶Žßñn·¯¦&sÂ^EÝÄ3Š”„ôœL|à#Þ™%_r*ñqžø䶘Ý7‰‡¤¥¨Š¢Ë¼U3nñÃŽ&¼oÇLŽŠYQÞCâ±`B§8ĈwfÉÄ×€œJ|¤'>¹ƒÊ©I|Ž„ÊU]æ­šqÛ‰çZ"L°ìdþˆå1Ε@Xˆô:D÷f©Œ×œÈxHgWy¿\ÛmŸ†‹JÅ—y«fäÎ%CPñugùV¦©~(ê•Õ—ÊÂÕ{N ÷F $_Yml¸e1»Ð«b½Ø/#R{ á"ýTbRqfÉR©9U*q^*!Èå5¬U‹X(†Ë£"Š0óVÍØbáî^ßI*• +~´ò(Ëêéúa_Œ‰ˆe&5×›dy1y8³dyÔ€œ*8H/äªSæbác3oÕŒÝ!*¯“ßY «Í—d}9’?㤠búpfÉú¨9Uq^!È›ítÑzÔ@ÅÈ̼U3t‡<@OÌ,ÔiòØ•¦Óâ †GV&EU™ÖUr³5j˜š1¦ µëSqÂÓÏ•Ð!" o–*Œ:…ÑÒÙÕ@Ζ mÚH)¸Ä0fÞª½]LJÄÅÿ~´8ÌŒ–E5Æîp[ýÕLÏ P•$]ä ÌTº.‡˜.œY².j@NÕE¤×Eòn»ÙoZŠÀQFfÞª»C‚!aZžß%c¬‹Òt­rÎÞ^Ž #{¾¼?·RZ»ŠurV ––(lÛó­?˜Á¿M…QD¤Q‡£V³þ#ÉÚg¡C›ÂžŽk—ÍΑiw3LžÄJE2Wæ!GšcÖÖ Ú‘œBÂQ.Xmã›[hÎ+„aÓõfa³ÜÜ”v|µk®y‹…P¤ŽÎ*ÕILTOÕ›õvPßÑAíÁá:¨5iT¸"iRHj + ")Ì›¥¦°:SXHgWí ÆÐÔFÜöôEóžÓA=f¶ÌÖ}8Qa¢å,ÙÀ!Ƭ3Kf¶äTfã =³!Èh‹4†.h‘6âv0Ë)Ô7ä9=Ò¯¡–™Fì3š ¡CŒZg–Lm È©ÔÆAzjCÑ&h ]ÐmÄí –À)%±Jh‚~ ¥Ø´XÅ3òpà£Ô™%SZr*¥qžÒäþá®h½_@j„FfÞªºUs!Áy¤ÍÙÉ¥­¡4´MîÖž„™ï:ôƒ¤§$Ê´dK.C‡H1èÍŽÅàì¶y BV#˜?EðdíaIµyÛâyå P¢§tVÇbÐ3’P.ÅÕ;$‰å`÷‹1„QDIgqíÊAoÖ[†>£ìÁáÊÁŽ´rPŒ¨€9¤¦¡Ð!’†¼Yjª91 õ€tv5Ñr0†.(q;rV®-4½4WL{æŒyÿJçˆñô.Å£y„Qk”ÊgáD6£ðœU/ZþuãÊôcí)·’mø„¼”ŸôŠÚ1·(p!Á­˜ê!¤Qiú+7CB"æm4iþ#«ƒòµiáO÷NîgoÝÃsîÖîµ$û¿¤ì%µ¯çÁ´rÛ SáÿçÖ|ïúÁ½²÷÷âh¼¬gÞ¢sЂUúÚšã^endstream +endobj +3617 0 obj << +/Type /Page +/Contents 3618 0 R +/Resources 3616 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3615 0 R +/Annots [ 3623 0 R 3624 0 R 3625 0 R 3626 0 R 3627 0 R 3628 0 R 3629 0 R 3630 0 R 3631 0 R 3632 0 R 3633 0 R 3634 0 R 3635 0 R 3636 0 R 3637 0 R 3638 0 R 3639 0 R 3640 0 R 3641 0 R 3643 0 R 3644 0 R 3645 0 R 3646 0 R 3647 0 R 3648 0 R 3649 0 R 3650 0 R 3651 0 R 3653 0 R 3654 0 R 3655 0 R 3656 0 R ] +>> endobj +3623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 552.2037 169.0429 566.1514] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 552.2037 189.795 566.1514] +/Subtype /Link +/A << /S /GoTo /D (a00093_5d8996950cdf3d8130cc3ad340eb9dff) >> +>> endobj +3625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 528.2933 169.0429 542.241] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3626 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 528.2933 188.6791 542.241] +/Subtype /Link +/A << /S /GoTo /D (a00093_7f7bb2145afba5df00c6e10ddefa8ae1) >> +>> endobj +3627 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 504.383 169.0429 518.3307] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3628 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 504.383 187.5831 518.3307] +/Subtype /Link +/A << /S /GoTo /D (a00093_dc69abadd5aa07c7d74f9292db2cd93c) >> +>> endobj +3629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 480.4727 169.0429 494.4204] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 480.4727 195.3241 494.4204] +/Subtype /Link +/A << /S /GoTo /D (a00093_b93e351c3abba0c700b26b7b07e9527d) >> +>> endobj +3631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 456.5623 169.0429 470.51] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 456.5623 204.7288 470.51] +/Subtype /Link +/A << /S /GoTo /D (a00093_0c816f34c0187f2154c91a18d3ad87c8) >> +>> endobj +3633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 432.652 169.0429 446.5997] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 432.652 202.517 446.5997] +/Subtype /Link +/A << /S /GoTo /D (a00093_6157452bdc9921f44b2e22e4b5969258) >> +>> endobj +3635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 408.7417 169.0429 422.6894] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 408.7417 198.6317 422.6894] +/Subtype /Link +/A << /S /GoTo /D (a00093_8082509468b2ac80ed7746aa1a5bc4f7) >> +>> endobj +3637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 384.8313 169.0429 398.779] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 384.8313 196.8783 398.779] +/Subtype /Link +/A << /S /GoTo /D (a00093_7675e6b9adbddbd545d3aac8ca092fbb) >> +>> endobj +3639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 360.921 169.0429 374.8687] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 360.921 203.6229 374.8687] +/Subtype /Link +/A << /S /GoTo /D (a00093_b4622e2599ff3a592db09219b2641682) >> +>> endobj +3641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.183 337.0107 130.9264 350.9584] +/Subtype /Link +/A << /S /GoTo /D (a00093_1deb2899508216804823498a69378118) >> +>> endobj +3643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 274.1638 169.0429 288.1115] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 274.1638 189.795 288.1115] +/Subtype /Link +/A << /S /GoTo /D (a00093_5d8996950cdf3d8130cc3ad340eb9dff) >> +>> endobj +3645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 250.2534 169.0429 264.2011] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 250.2534 188.6791 264.2011] +/Subtype /Link +/A << /S /GoTo /D (a00093_7f7bb2145afba5df00c6e10ddefa8ae1) >> +>> endobj +3647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 226.3431 169.0429 240.2908] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 226.3431 187.5831 240.2908] +/Subtype /Link +/A << /S /GoTo /D (a00093_dc69abadd5aa07c7d74f9292db2cd93c) >> +>> endobj +3649 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 202.4328 169.0429 216.3805] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3650 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 202.4328 199.7475 216.3805] +/Subtype /Link +/A << /S /GoTo /D (a00093_8da121d6e50992ec55778f9b2141552d) >> +>> endobj +3651 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.183 178.5224 143.1005 192.4701] +/Subtype /Link +/A << /S /GoTo /D (a00093_3983b45977630418d3038231aa8b68ed) >> +>> endobj +3653 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 115.6755 169.0429 129.6232] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 115.6755 189.795 129.6232] +/Subtype /Link +/A << /S /GoTo /D (a00093_5d8996950cdf3d8130cc3ad340eb9dff) >> +>> endobj +3655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 91.7652 169.0429 105.7129] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3656 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 91.7652 188.6791 105.7129] +/Subtype /Link +/A << /S /GoTo /D (a00093_7f7bb2145afba5df00c6e10ddefa8ae1) >> +>> endobj +3619 0 obj << +/D [3617 0 R /XYZ 90 757.9346 null] +>> endobj +1000 0 obj << +/D [3617 0 R /XYZ 90 739.9346 null] +>> endobj +246 0 obj << +/D [3617 0 R /XYZ 90 739.9346 null] +>> endobj +3620 0 obj << +/D [3617 0 R /XYZ 90 685.8208 null] +>> endobj +3621 0 obj << +/D [3617 0 R /XYZ 90 584.5797 null] +>> endobj +3622 0 obj << +/D [3617 0 R /XYZ 90 584.5797 null] +>> endobj +3642 0 obj << +/D [3617 0 R /XYZ 90 306.6831 null] +>> endobj +3652 0 obj << +/D [3617 0 R /XYZ 90 148.1949 null] +>> endobj +3616 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F11 705 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3669 0 obj << +/Length 1396 +/Filter /FlateDecode +>> +stream +xÚ­™]oÛ6†ïý+tiÇïÞmíV,Ê-ñ.†¶(YqŒÆv&ÉIƒaÿ}G¦ÄP–D3ñà QÒKñߣ£#š$~$18QB!øL²Í'+8ü~BšÓ)œO}ÁóÉ÷?S“d$•ÉüæpI „&óåÇ©BDÍR*ðt¿¾ÿRV‹ª´»WU±Ï*Û¾ÌoòbFô4ßf9R +Ó)ádöy~1ùiîÆoð“¤ýïÉÇÏ8YæÅ#f´Ha#b M6NY»s7¹šüá®cO: Ý¥ là6ön“0Ž4#&Q*{¯ö›k¸Ã-ín춘15ͳõC¾´æo·2Ÿq<]mòmU¢ã;%®/ KÑ©-h}ªX5šKÙéS¿ƒµ‡ùܽëÖàΚ/UD‚ŽKyÒ1ЏÁ +š' ïÔiÈV×,a¢ztZ"¡A¢Kª?X",‰uõÀò;¥áˆ`)¢íô;ìt²X;» gÚy²Õu ³Û¯3‚§yQô@ZSdLª?ú°©RSDêG{ÌÔA+í‘Çuuk[ »¹^4s6#bz›g3Ч_Ëý&`½ªs‘Í\qÖ{BÖ·²hë; çZ†tÖû‹,d=£œS§ê>b½Ðˆrlþ_ë˜1<}û«ÝÙÚ«B¦àQ-⓹ß!­,:: ç†@Ò…€Y”¹ÃÈFáR§ê;â=4ÃòÔ:¯ä‡uï5}y5·OX`«-ó +vÈ‹ò>¥ˆ)Áã÷:„œoeÑÎw@Îu> éœ÷!‹ÃDÛ¬ûŒF"L­¤?îˆõb…bvÂúª¨‰Û˜ªW–iÂhÄ¥ˆOî~‡€¿NëoäLO@¶ºdù´]»ûc@Š)’ *¯`êTý¡‡-ui‡Íxf_3.¦»ûûÖØ«¿>4™}¹Ïm£ÚµÛ¦qsˆÑÇæ ¿Ûnó¬Zï¶íaÑ4‹»õâúî ĆâHŸõý¡ØheѱÑ976Â.6|Hˆ¡Äoê ­T/uªþÈ#¡!)ÆŒ'þçH¸Ù5§²»]ÙÊý®¨ÊïšÈ(Ö«ºdYÙºe½]uJ‚ú¡¸ £‰nd¨€ #!ì—â¿ý`âTÕ¦ +Œ$ç§_>õ; Ëñuë᫬÷|ÖÓÆGÇÏ'|Î" !‘6¦ó÷à–)CŠÃx†i@”Ü"„•ÌÐÊjÄçü A½.«u6}›¡HiÉÃ4 h |tyŠ ˆŸ±Oø0äLó¤UÕ¨Ÿ(}´ÆvïrÇhÖÆJ‚pd0<Ï>Dé-§ü3šŠ¸VH×s›ŠüTäd±©¨ rf*:Ùê:Cï(¢5‚ó:H—:UÜáDÄ•[¹ŒGýùîEÅ— F5ñ‹ +~‡«­,ÚÕȹ®†!«>d‘g}W‚o¤Kª?‚"L8‹_ù{©«#,L|Iéw¹ÚÊ¢]퀜ëjÒ¹êCWþBtÞÊ_oÜW©Fóˆ…¿—ºI$"\¿ ózBn¶²h7; 纆tnú !Foá¯7úˆ§˜CÕÂÆóï •¯Zø;³øc†"Ê´ˆ.þüâÏÉA²(þ 8¢Œõ• m‹?Wü1) n7§Š?'«Ÿ 9]ü1…«ÆqÅÕ îV;D +yÖ?K‡RC¨ÿ™DF1ÝþAF l•Ç÷ù6/nÙa·µÛßÚÆEfûf‡Ðf‹ßPö†b»G1–ÍwÌŒBÑD÷þ—f j„×Ovûn÷íi•og´^oѼùù“Àzendstream +endobj +3668 0 obj << +/Type /Page +/Contents 3669 0 R +/Resources 3667 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3615 0 R +/Annots [ 3671 0 R 3672 0 R 3673 0 R 3674 0 R 3675 0 R 3676 0 R 3677 0 R 3678 0 R 3679 0 R 3680 0 R 3681 0 R 3682 0 R 3683 0 R 3684 0 R 3685 0 R 3687 0 R 3688 0 R 3689 0 R 3690 0 R 3691 0 R 3692 0 R 3693 0 R 3694 0 R 3695 0 R ] +>> endobj +3671 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 713.4339 169.0429 727.3816] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3672 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 713.4339 187.5831 727.3816] +/Subtype /Link +/A << /S /GoTo /D (a00093_dc69abadd5aa07c7d74f9292db2cd93c) >> +>> endobj +3673 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 689.5236 169.0429 703.4713] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3674 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 689.5236 196.8783 703.4713] +/Subtype /Link +/A << /S /GoTo /D (a00093_7675e6b9adbddbd545d3aac8ca092fbb) >> +>> endobj +3675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 665.6133 169.0429 679.561] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 665.6133 196.3204 679.561] +/Subtype /Link +/A << /S /GoTo /D (a00093_7a58d95f7f7827789ff52500e3d16c34) >> +>> endobj +3677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 641.7029 169.0429 655.6506] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 641.7029 181.4959 655.6506] +/Subtype /Link +/A << /S /GoTo /D (a00093_b6e9a75167bdddd561373bc5b6ef501c) >> +>> endobj +3679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 617.7926 169.0429 631.7403] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 617.7926 197.3963 631.7403] +/Subtype /Link +/A << /S /GoTo /D (a00093_3ad48284f7a91f78bb24096aad89056e) >> +>> endobj +3681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 593.8823 169.0429 607.83] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 593.8823 203.633 607.83] +/Subtype /Link +/A << /S /GoTo /D (a00093_494ea6767a8a8fab7abe96b799d6c3b3) >> +>> endobj +3683 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 569.9719 169.0429 583.9196] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 569.9719 195.3339 583.9196] +/Subtype /Link +/A << /S /GoTo /D (a00093_e9205a565ea3c911a785fc4e87c91a58) >> +>> endobj +3685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.183 546.0616 135.3497 560.0093] +/Subtype /Link +/A << /S /GoTo /D (a00093_e292b8977f6b81265bf14e1676face3e) >> +>> endobj +3687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 483.297 169.0429 497.2446] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 483.297 189.795 497.2446] +/Subtype /Link +/A << /S /GoTo /D (a00093_5d8996950cdf3d8130cc3ad340eb9dff) >> +>> endobj +3689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 459.3866 169.0429 473.3343] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 459.3866 188.6791 473.3343] +/Subtype /Link +/A << /S /GoTo /D (a00093_7f7bb2145afba5df00c6e10ddefa8ae1) >> +>> endobj +3691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 435.4763 169.0429 449.424] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 435.4763 187.5831 449.424] +/Subtype /Link +/A << /S /GoTo /D (a00093_dc69abadd5aa07c7d74f9292db2cd93c) >> +>> endobj +3693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [123.873 411.5659 169.0429 425.5136] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +3694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.541 411.5659 196.8783 425.5136] +/Subtype /Link +/A << /S /GoTo /D (a00093_7675e6b9adbddbd545d3aac8ca092fbb) >> +>> endobj +3695 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.183 387.6556 138.1195 401.6033] +/Subtype /Link +/A << /S /GoTo /D (a00093_4f39f0fe6a820d260fe6cddf9ccaa832) >> +>> endobj +3670 0 obj << +/D [3668 0 R /XYZ 90 757.9346 null] +>> endobj +3686 0 obj << +/D [3668 0 R /XYZ 90 515.7752 null] +>> endobj +3667 0 obj << +/Font << /F29 499 0 R /F50 1172 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3703 0 obj << +/Length 1646 +/Filter /FlateDecode +>> +stream +xÚ­š_oÛ6Åßý)üè<ˆãåöqèZ¬À€­Í[ž­$FÛµåuýö£l‘¡béÞ +4²uÄûÏ‘DZ„)ÿ`êùÔj˼TfºxžðécøúýºÝUØ_å‚_o'¿¼~ê™7ÂLoN-`Z€˜Þ.ïf ÄM%”Ò0;þþgØÔ|ŒŸ7ÞΛùyëS³?.šãþܬîvnÇçzÓÌ›ÕvssûaòÛm"é@µ4Ðr|›ÜÝóé2˜p&½ÓÓïágམ>O”ñÃzòiòWjç¼ãtÀÐùjÃ' Š…oDœÿ¶Ç¬»½áÄØA–*pvñbð»U½^l4ᤜz4o¹àÜýù¹7LI§^Úië~B¿®¼íK-ÑŠŠy<çç}í7ûÇn×ÇŒ ‚ÿžCÒE]îè¾4tR0#8 t‚)Ï-M'5àŽ¤‹ºÝ?Oë 8eÛý7Kw¢ +DÈ ŽrÍœÊÐNEûùÒÜõv¢hÉÍ 7s­ÜK-Y™¡5ÛÃ¥“†Yi1°JŸ%jÔFíƒ@zCø˜d¤‘yƒW;IÐE]õ£+6“ ‹ºÝºÞ ]˜Â)ÂUIE•UžY«_uʸ¸mkŽsáÉ4šŽL€¥#Êèt ËÓÓ¥tätx:ºòtàt)9Ýj·Z^ÐiÎ …»•TT]-p ýº#ñ0–qiìx<2(£ãT,N—â‘Óáñ@èÊãÓ¥xät«]È ={8Ô—”F3á-NY%U?ìµÎ¾ª?­wÁ½Ñ˜d,&QFÇ©Xœ.Å$§Ãc‚ЕǧK1Ééšf`ð'™w]¥;=jPÀ@JO9e´£Yƒ×;ŠÓ%Gs:ÜQ„®ÜQœ.9šÓíöÛf{ù`0 X¯2ˆÐk&¦N(ÊÓ(£=ͼÞSœ.yšÓÁ ™j™á P¼Ÿ5Uqƽ/êzx«Ýâéëáø|AhÃüLœ°rˆ¾V!Üò%5Q‹*ÚÕ—æ®7EKžfh„¥ãl厢lÉÐŒí°_¬vóåri¨eЉðUIDTÃ6£¥ìUy.sÁ„õã?æ,QFg©Xœ.¥#§#âà•çÇKÉñ–õ¡‰ˆ¦½ö¸iIEUwíCþuç §D9Ϥp0š’\€¤$ÉÈ”`‹SBÐE]O †Wœ/êzxá>²ÛîøaH®n˜=kȇ‚²†IKÎÜ’Œ65kðzSqºdjNG˜Šà•›Šã%Ss¼öÒtÕ +ð¬\'¢}5a/È©V’Ѿf ^ï+N—|ÍéÐ9FW<0'袮Gw¨¿mæŽI-ŠW%UØp攂~á;5x3ל)+Ýx>2–(£óT,ÏN—ò‘Óáù@èÊóÓ¥|ätóÅ×á|øÓ] ³+©¨Â˜<ÝoòÂ#ù÷C-rÿÈX>¢ŒÎR±<8]ÊGN‡ç¡+ÏN—ò‘Ó5 ô'=Ϭà·Ív"úÙ Ó–Çu*ÚÙ—æ®7EK¾fh¸­ãh客hÉÔ¼×8—óÇË·vZ2v[eN +ÚHf€œ·u²Ÿx™ž”ÿ‹—Yc˜™9î&BWn'N—üÌé¾o^Ê„‰•1 +…«’Š*«U¶Û~ÕáéšôŽƒL×rŽ$#ÃU,Au=:|dáì ¼¨ëá…[øÈïxN2¡½#<ëDäU/fÈ)[’ÑÆf ^o,N—ŒÍéЫ£+¾ê º¨ëÓ–u=î†îãíK °Š"ª²ÖÌ8ùª_F®ü0S´F¿¬ÏX@¢ŒR±< 8] +HN‡¡+N—’ÓmwͲ]w1jSL)®pÃ’Š*mLôKî-0Pvð§Cš£ÍUë,O)sáàA¾Ž2ž¦S)Âí’ʈÒ¾¯7õ~ÞÄeŽq½âqãà èÙ±û¢ûËßùFtkLçÝJÆÓ`yÛ-ļ\Œú÷¸îôß—KmÚ¥ ½ô•“âÊendstream +endobj +3702 0 obj << +/Type /Page +/Contents 3703 0 R +/Resources 3701 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3615 0 R +/Annots [ 3708 0 R 3709 0 R 3711 0 R 3712 0 R 3714 0 R 3715 0 R 3717 0 R 3718 0 R 3720 0 R 3721 0 R 3723 0 R 3724 0 R 3726 0 R 3727 0 R 3729 0 R 3730 0 R 3732 0 R 3733 0 R 3735 0 R 3736 0 R 3738 0 R 3739 0 R 3741 0 R 3742 0 R 3744 0 R 3745 0 R 3747 0 R 3748 0 R 3750 0 R 3751 0 R 3753 0 R 3754 0 R 3756 0 R 3757 0 R 3759 0 R 3760 0 R 3762 0 R 3763 0 R 3765 0 R 3766 0 R ] +>> endobj +3708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 616.6656 133.6164 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 616.6656 148.8392 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00094_e1e60d56ea87dfa09230e25ca5ecf2fc) >> +>> endobj +3711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 603.7142 133.6164 613.6419] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 603.7142 147.7332 613.6419] +/Subtype /Link +/A << /S /GoTo /D (a00094_8cf0ca17b115ff2e3071b3fabcc43b53) >> +>> endobj +3714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 590.3444 133.6164 600.6904] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 590.3444 148.2812 600.6904] +/Subtype /Link +/A << /S /GoTo /D (a00094_e57281f5bef284bc9545834ef8ed4a96) >> +>> endobj +3717 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 576.8351 133.6164 587.739] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3718 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 576.8351 151.6087 587.739] +/Subtype /Link +/A << /S /GoTo /D (a00094_7a59f0dad059786238d8ab604630e7f3) >> +>> endobj +3720 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 563.8836 133.6164 574.7876] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 563.8836 166.2933 574.7876] +/Subtype /Link +/A << /S /GoTo /D (a00094_85d7f35662f7be20cd84e789a290dd4b) >> +>> endobj +3723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 551.9085 133.6164 561.8361] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 551.9085 144.4155 561.8361] +/Subtype /Link +/A << /S /GoTo /D (a00094_0f27e16ddcf7199d514968204966f559) >> +>> endobj +3726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 537.9808 133.6164 548.8847] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 537.9808 157.138 548.8847] +/Subtype /Link +/A << /S /GoTo /D (a00094_e45b31a0a277dd5325ad2a332358b21b) >> +>> endobj +3729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 525.0293 138.5977 535.9333] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 525.0293 179.8327 535.9333] +/Subtype /Link +/A << /S /GoTo /D (a00094_af7a8a5310ad945de38f5b3ac755ae7d) >> +>> endobj +3732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 512.0779 138.5977 522.9818] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 512.0779 178.1589 522.9818] +/Subtype /Link +/A << /S /GoTo /D (a00094_c8f124419a231f38bb6cdf5041757a27) >> +>> endobj +3735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 499.1265 138.5977 510.0304] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 499.1265 182.5922 510.0304] +/Subtype /Link +/A << /S /GoTo /D (a00094_8d4e08d051b35b1c710c3be5b8bbfa05) >> +>> endobj +3738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 486.175 138.5977 497.079] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 486.175 168.7542 497.079] +/Subtype /Link +/A << /S /GoTo /D (a00094_a81fff4836049cb3c018304d77337554) >> +>> endobj +3741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 473.2236 138.5977 484.1275] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 473.2236 173.1875 484.1275] +/Subtype /Link +/A << /S /GoTo /D (a00094_025ffa46b799fa6952719c499a3ae17c) >> +>> endobj +3744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 460.2722 133.6164 471.1761] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 460.2722 159.3497 471.1761] +/Subtype /Link +/A << /S /GoTo /D (a00094_2541fae506eb111ff1be2372e0919839) >> +>> endobj +3747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 447.8787 133.6164 458.2247] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 447.8787 159.8977 458.2247] +/Subtype /Link +/A << /S /GoTo /D (a00094_71721395f1c7c42b8bcc111b339bea7c) >> +>> endobj +3750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 434.3693 133.6164 445.2732] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 434.3693 170.7167 445.2732] +/Subtype /Link +/A << /S /GoTo /D (a00094_6af8a59d0ab8967aacea749d6e59ac90) >> +>> endobj +3753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 421.4179 133.6164 432.3218] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 421.4179 154.9262 432.3218] +/Subtype /Link +/A << /S /GoTo /D (a00094_619d9755a5d4aaabdb2e5e6ea4c1e0bf) >> +>> endobj +3756 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 409.0244 133.6164 419.3704] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3757 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 409.0244 153.2627 419.3704] +/Subtype /Link +/A << /S /GoTo /D (a00094_7f0ab3fe3bcf1e3ed9f5950cb4474ec1) >> +>> endobj +3759 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 395.515 138.5977 406.419] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3760 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 395.515 184.256 406.419] +/Subtype /Link +/A << /S /GoTo /D (a00094_f4a1d8cfbe270393a2de02b0c743e474) >> +>> endobj +3762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 382.5636 133.6164 393.4675] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 382.5636 154.1892 393.4675] +/Subtype /Link +/A << /S /GoTo /D (a00094_dc7001682017599549f57771f4cd1b9a) >> +>> endobj +3765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 369.6122 133.6164 380.5161] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 369.6122 165.4367 380.5161] +/Subtype /Link +/A << /S /GoTo /D (a00094_dde3cf9a57445814d01b3c67da08afdb) >> +>> endobj +3704 0 obj << +/D [3702 0 R /XYZ 90 757.9346 null] +>> endobj +1001 0 obj << +/D [3702 0 R /XYZ 90 739.9346 null] +>> endobj +250 0 obj << +/D [3702 0 R /XYZ 90 739.9346 null] +>> endobj +3705 0 obj << +/D [3702 0 R /XYZ 90 716.7484 null] +>> endobj +3706 0 obj << +/D [3702 0 R /XYZ 90 634.6393 null] +>> endobj +3707 0 obj << +/D [3702 0 R /XYZ 90 634.6393 null] +>> endobj +3710 0 obj << +/D [3702 0 R /XYZ 90 620.6507 null] +>> endobj +3713 0 obj << +/D [3702 0 R /XYZ 90 607.6992 null] +>> endobj +3716 0 obj << +/D [3702 0 R /XYZ 90 594.3295 null] +>> endobj +3719 0 obj << +/D [3702 0 R /XYZ 90 580.8201 null] +>> endobj +3722 0 obj << +/D [3702 0 R /XYZ 90 567.8687 null] +>> endobj +3725 0 obj << +/D [3702 0 R /XYZ 90 555.8935 null] +>> endobj +3728 0 obj << +/D [3702 0 R /XYZ 90 541.9658 null] +>> endobj +3731 0 obj << +/D [3702 0 R /XYZ 90 529.0144 null] +>> endobj +3734 0 obj << +/D [3702 0 R /XYZ 90 516.063 null] +>> endobj +3737 0 obj << +/D [3702 0 R /XYZ 90 503.1115 null] +>> endobj +3740 0 obj << +/D [3702 0 R /XYZ 90 490.1601 null] +>> endobj +3743 0 obj << +/D [3702 0 R /XYZ 90 477.2087 null] +>> endobj +3746 0 obj << +/D [3702 0 R /XYZ 90 464.2572 null] +>> endobj +3749 0 obj << +/D [3702 0 R /XYZ 90 451.8637 null] +>> endobj +3752 0 obj << +/D [3702 0 R /XYZ 90 438.3544 null] +>> endobj +3755 0 obj << +/D [3702 0 R /XYZ 90 425.4029 null] +>> endobj +3758 0 obj << +/D [3702 0 R /XYZ 90 413.0094 null] +>> endobj +3761 0 obj << +/D [3702 0 R /XYZ 90 399.5001 null] +>> endobj +3764 0 obj << +/D [3702 0 R /XYZ 90 386.5486 null] +>> endobj +3701 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3769 0 obj << +/Length 1274 +/Filter /FlateDecode +>> +stream +xÚµ˜]oÛ6†ïý+ìÆfŽ‡ß †] i‹°¥ÞU[®Ì$ÂdÙ³å~üûJ”"YŠX/|aJzuøêá'$Xšh©‰åB%évF“¼ýfáñŸ/»‚_W³Ÿ^3›XbSÉ꾊 €H,YmÞÍ5»X2Iç§lwÚìïÒ]QÔwÞ–‡SZÖå[wï 0sW¤ÎߌÍAðŇÕÍìÕªµJ®ÀøgöîM6èôfF ·F&Ÿñ‚b­–%Û™`¼¹Ègog¶qêÕ c‰Jà㙂 x‡5©2Ì\w3J/KóÃÀªÓ„ØÆÌW,u÷‡¬HóÓ&(:Jɉ¶©„?ÄÒD £ƒm‘Ç‘0˜„1ÚÕ/! æ +ÄJY庴@6YrAÀtR&’¾vå:ËݦNòÚÓC¶/³]âñ³}CZ¨âܺýÁ]Q®+}`w_ÿ¯=¿ýQþº߸.õ/sHŒ$M&ŠjḬ̀ÑO܈–]Õhc ¥caªFp^~õe½Ýçîxu^3PF4g0Yµ Ö€ÀbõÌß9<„G·ƒ€!4p9æ°Û˜­®•y‹›ÇtŸÖŸ»g$VM\¶ªXÕƒh¾ê×+6ƒÚ%†‹óÚŸo‚Fó1ˆë} S»üÓBÉ9IN<ÐÈót3Q¬öóX¾ò +JÿC&‰´BVÏ®Ý{JY‘=ѾcCž®.Úï þܵƒ)y$c=•ö»èõº =èuæòÍqd<•hMÏŽø]Á~ +‡#žâøzß3&‡ßb’OÖXuï8[ªTÔ]£ë¹ót¶_o6‡»rȨ$&æ’Qã.•!¤ºlt=—‡Úâ]M¨ÑfúÙª­ zÀÜvECБ\ÀY ç=Š™é§)OÒ»¸R¢²‰3Å'ieÞæê1@Ù Ñ•i®çîxì\6ÊúñvW†ë½ó3"Àœ ™© kqÒÇáz20ì@ £ˆô=dèVºðÅ@GÜ5ºž»¨’¹&Š‚˜´W‘¬ãö%Ôâij×èzöòýî0´'‘,Àuâ”=$—0–]ȱÐ@”Ÿ­§9ne=Žó]ºÎ˜ÞwU*NÛiUΨ]¸òóîðw}ññkCó®Â{E'-e„ø>H í6†t#‹#Ý ør¤§ÝµHwÝEž°w9ÒÓöZ¤»öãH["$Ò:eçÂü®áB¤9.-T= ÃíÿI5\ŠQø>TSCp¦S1ªYœêNÀ—S=í®¥ºëîdÆ fD1l²)wß +5—€š¨»F×sW–ùÀœàD€nº%W„É ‘ö¯YîwØzj›´²zñ|¿>åß2Ûºe¹[æÙ'·ù,–pƒ¬i\Ź„8˜\ã˜À€ÙÊ¢`vþ×ýb œŽºkÀì¹kÎ,Öûý÷ánSËü·öú­˜ZéÏ¢Vƒ¬ç´qxî1ƒëb˜´‡–â¢ÈKI•ƒS#µ‘õÆ_tœgiçp£ö?Í«À]ë#ø<¯L{ºùè|C±AqS£_t^VQoðè,ªp~S¾ZÓ‡vo\á˜e8j2ÿ½)ÜøôOE³Ù ÿôŠñ+6¾ŒRU—îLú ¨„6“T8tÚ}ùúàŠó6õ‡yµNûü ‹Šøendstream +endobj +3768 0 obj << +/Type /Page +/Contents 3769 0 R +/Resources 3767 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3615 0 R +/Annots [ 3772 0 R 3773 0 R 3776 0 R 3777 0 R 3779 0 R 3780 0 R 3782 0 R 3783 0 R 3785 0 R 3786 0 R 3788 0 R 3789 0 R ] +>> endobj +3772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 604.7351 139.9724 627.7038] +/Subtype /Link +/A << /S /GoTo /D (a00049) >> +>> endobj +3773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.8378 604.7351 192.4453 627.7038] +/Subtype /Link +/A << /S /GoTo /D (a00046) >> +>> endobj +3776 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 522.2884 166.8215 533.1924] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +3777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 522.2884 198.084 533.1924] +/Subtype /Link +/A << /S /GoTo /D (a00095_8a661a2d544100b82d0d14a1985083d5) >> +>> endobj +3779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 483.4341 138.5977 494.3381] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 483.4341 159.9075 494.3381] +/Subtype /Link +/A << /S /GoTo /D (a00095_981392e295db4d024eea95805c51c371) >> +>> endobj +3782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 444.5798 138.5977 455.4838] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 444.5798 160.4555 455.4838] +/Subtype /Link +/A << /S /GoTo /D (a00095_280a0c2a93544e597f92bbacf36ee1dc) >> +>> endobj +3785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 406.7018 133.6164 416.6295] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 406.7018 144.4155 416.6295] +/Subtype /Link +/A << /S /GoTo /D (a00095_4da1d7815516cd2b5bda3a66fdf05198) >> +>> endobj +3788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 366.8712 193.9395 377.7752] +/Subtype /Link +/A << /S /GoTo /D (a00153_ga92afb113e122f860392bfbd385f842e) >> +>> endobj +3789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.4377 366.8712 229.0773 377.7752] +/Subtype /Link +/A << /S /GoTo /D (a00095_c8afa29e0aa5e789d6929b366d98ba56) >> +>> endobj +3770 0 obj << +/D [3768 0 R /XYZ 90 757.9346 null] +>> endobj +1002 0 obj << +/D [3768 0 R /XYZ 90 739.9346 null] +>> endobj +254 0 obj << +/D [3768 0 R /XYZ 90 739.9346 null] +>> endobj +3771 0 obj << +/D [3768 0 R /XYZ 90 685.9318 null] +>> endobj +3774 0 obj << +/D [3768 0 R /XYZ 90 541.2384 null] +>> endobj +3775 0 obj << +/D [3768 0 R /XYZ 90 541.2384 null] +>> endobj +3778 0 obj << +/D [3768 0 R /XYZ 90 502.5274 null] +>> endobj +3781 0 obj << +/D [3768 0 R /XYZ 90 463.6732 null] +>> endobj +3784 0 obj << +/D [3768 0 R /XYZ 90 424.8189 null] +>> endobj +3787 0 obj << +/D [3768 0 R /XYZ 90 385.9646 null] +>> endobj +3767 0 obj << +/Font << /F29 499 0 R /F26 485 0 R /F11 705 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3792 0 obj << +/Length 1294 +/Filter /FlateDecode +>> +stream +xÚ­™_oÛ6Åßý)ôè<ˆãåöqÈZ¬À€­Í[®¥$ÂÛ³åmýö£,’¡b鲂‡l]þÈs$Q&ÔýƒÂÒBKM,ªX¿,hñä¾þ°ß\ºö2ü|·øé=³…%V1UÜ=ž+( ’+îªû%qS2!$,O¿þî%]¡ýÁíª]õGŸÛÃiÝž7`–µoÜ­O/õ¶]µÍn{óp÷qñË]$ñ ’+è8þZÜ?ТrÀ”pkdñû@ XËŠ—…`<|Ø,>/þˆuú†ó cã•ÀÇ ‚¸oX1s ûkÂÜè€Rº<5û¯§jïþ®é8ûãOõcÝx»®»ö•X)Ï•Ýdw…™y­LÀ×¾­ÛU³©+?Wõq}höa¦\!žxÒÕéxm_ç¶þB)Û6gõùô•'Ú4[?ù ”÷h÷ØÿíÎÙøV70òL&¹ `üd¼ü¾©7ÕqÄF†ÁädÞRA?ý騀*"¸¯uº~¿0&ßö´›KÉѱÆyNû¶î›Ã“oú”póßR¥²tA7 ;™¯ígD1 +(#ÂR§ã’P“¥ ºÝßÏ› 8¡»v‹›%½¨æòˆ£Tc!g¨Wåý|-w½(Zt3AÃÍœF›ï%Š­LÐÚÝñÒIE4×X){‰·QLÚ(­p«2>FYÖÈ´àÕNfè‚n@‡z‰ÑÍ63CtºM½»0™…+£*×­°DkùfRîÙÃÈm[jwžqO¦Ét$,A–OÒãütàt1)ž„n~:pº˜Ž”®Ù7Õ¤D¸[Q•ëWr”ð߉x(M(Wz:‰‹Gåãô8?8]ŒGJ‡Ç¡›œ.Æ#¥kön!ÇäòñX_R*I˜Õ8eU¹þ]«6úMÿ1‘‚PãÜ›ŒI"Àbdù˜ =Î Nc’Òá1AèæÇ§‹1IéÚvdñlj‹O])½(¿j@€s›s4ÈòŽ&¯w§‹Ž¦t¸£Ý|GqºèhJ·?ìÚÝåƒA Q¼RyQvA/™qï|Lä< ²¼§IÁë=Å颧)Ý Ô˜©š( +ÅûQS%Ô2ÈâݯٯŸÿ<ž^.µ{?ã +',å¯Up·|ž{Q ª¼«¯å®7E‹ž&hK§Ùæ;вEC¶ãaÝìWUu¸4TèÎDøÊ(Êôì–mJr>èyâ¹LaÚNÿ˜ +°hY>HóÃÓÅt¤t™x xóóãÅ€¤xU}l'"b€H+-nZTåz7ÝCþí䌧DK830™’T€¤$ʲ)Ázœ’ ]Ð èð”`x³S’Á ºž»ìw‡‘¾[’Kƒ¦{Mö¡ ´"\gßÜ¢,ojRðzSqºhjJ—1Á›o*ŽMMñºKÔUÍXÀ'°4^”÷U¹%<˾jEYÞפàõ¾âtÑ×”.ã+‚7ßW/ú:À«öc?é¹k•e(_w±žEyW%%Bg_·¼Ìü€«Aù¿¸šÃ\Mé2®"xó]Åñ¢«¼jjmn¡ÌJ±´^TrÝÝ«ÕèOvÔQ€’ꪭÏs<Œ;Ž«¦[›ŠØóX Þí7v»œÚ½$º›Ìy|êm}Xµaç1l!þ>Þ€\žü`þ/}Çø;æ·¥ª?:ÿ$µó{£—ûÃß¾‡­à¿?]^*Ýîl@Kfé?w4[áendstream +endobj +3791 0 obj << +/Type /Page +/Contents 3792 0 R +/Resources 3790 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3615 0 R +/Annots [ 3797 0 R 3798 0 R 3800 0 R 3801 0 R 3803 0 R 3804 0 R 3806 0 R 3807 0 R 3809 0 R 3810 0 R 3812 0 R 3813 0 R 3815 0 R 3816 0 R 3818 0 R 3819 0 R 3821 0 R 3822 0 R 3824 0 R 3825 0 R 3827 0 R 3828 0 R 3830 0 R 3831 0 R 3833 0 R 3834 0 R 3836 0 R 3837 0 R ] +>> endobj +3797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 616.6656 133.6164 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 616.6656 148.8392 626.5933] +/Subtype /Link +/A << /S /GoTo /D (a00096_f1684ad96b8acf54154688df3883b801) >> +>> endobj +3800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 603.7142 133.6164 613.6419] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 603.7142 147.7332 613.6419] +/Subtype /Link +/A << /S /GoTo /D (a00096_ed119a030ebd3bf7c30a12071c27d441) >> +>> endobj +3803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 590.3444 133.6164 600.6904] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3804 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 590.3444 148.2812 600.6904] +/Subtype /Link +/A << /S /GoTo /D (a00096_47140aa52cb9e6a2de38fdfc5da08df1) >> +>> endobj +3806 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 576.8351 133.6164 587.739] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3807 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 576.8351 151.6087 587.739] +/Subtype /Link +/A << /S /GoTo /D (a00096_569382bc53aa64c227e57efe88fe13ac) >> +>> endobj +3809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 563.8836 133.6164 574.7876] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 563.8836 166.2933 574.7876] +/Subtype /Link +/A << /S /GoTo /D (a00096_8587178a29882482be20c2822b402b96) >> +>> endobj +3812 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 551.9085 133.6164 561.8361] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 551.9085 144.4155 561.8361] +/Subtype /Link +/A << /S /GoTo /D (a00096_6f8c65cfc8242197bcc3cb5b4735b16f) >> +>> endobj +3815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 537.9808 133.6164 548.8847] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 537.9808 157.138 548.8847] +/Subtype /Link +/A << /S /GoTo /D (a00096_51bbbe3099c10ef26119ddc2aa51e35e) >> +>> endobj +3818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 525.0293 138.5977 535.9333] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 525.0293 179.8327 535.9333] +/Subtype /Link +/A << /S /GoTo /D (a00096_f20186ef441ef5b600e8544a0f2d8d81) >> +>> endobj +3821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 512.0779 138.5977 522.9818] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 512.0779 178.1589 522.9818] +/Subtype /Link +/A << /S /GoTo /D (a00096_a80e8d0fc768525fa3bfb3d4e4cf260d) >> +>> endobj +3824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 499.1265 138.5977 510.0304] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 499.1265 182.5922 510.0304] +/Subtype /Link +/A << /S /GoTo /D (a00096_be2c98748e180c1747823cd2fb8ecf0e) >> +>> endobj +3827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 486.175 138.5977 497.079] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 486.175 168.7542 497.079] +/Subtype /Link +/A << /S /GoTo /D (a00096_b20096ae4953caaa42f6bb2373c4494c) >> +>> endobj +3830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 473.2236 138.5977 484.1275] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 473.2236 173.1875 484.1275] +/Subtype /Link +/A << /S /GoTo /D (a00096_e82f68cb91d8688a619d55d2a8572979) >> +>> endobj +3833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 460.2722 138.5977 471.1761] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 460.2722 168.2065 471.1761] +/Subtype /Link +/A << /S /GoTo /D (a00096_c92d2f194f096e84791f95d7e8f0ba92) >> +>> endobj +3836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 447.3207 138.5977 458.2247] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 447.3207 187.0258 458.2247] +/Subtype /Link +/A << /S /GoTo /D (a00096_858f970feb7462871c814953697a8ad7) >> +>> endobj +3793 0 obj << +/D [3791 0 R /XYZ 90 757.9346 null] +>> endobj +1003 0 obj << +/D [3791 0 R /XYZ 90 739.9346 null] +>> endobj +258 0 obj << +/D [3791 0 R /XYZ 90 739.9346 null] +>> endobj +3794 0 obj << +/D [3791 0 R /XYZ 90 716.7484 null] +>> endobj +3795 0 obj << +/D [3791 0 R /XYZ 90 634.6393 null] +>> endobj +3796 0 obj << +/D [3791 0 R /XYZ 90 634.6393 null] +>> endobj +3799 0 obj << +/D [3791 0 R /XYZ 90 620.6507 null] +>> endobj +3802 0 obj << +/D [3791 0 R /XYZ 90 607.6992 null] +>> endobj +3805 0 obj << +/D [3791 0 R /XYZ 90 594.3295 null] +>> endobj +3808 0 obj << +/D [3791 0 R /XYZ 90 580.8201 null] +>> endobj +3811 0 obj << +/D [3791 0 R /XYZ 90 567.8687 null] +>> endobj +3814 0 obj << +/D [3791 0 R /XYZ 90 555.8935 null] +>> endobj +3817 0 obj << +/D [3791 0 R /XYZ 90 541.9658 null] +>> endobj +3820 0 obj << +/D [3791 0 R /XYZ 90 529.0144 null] +>> endobj +3823 0 obj << +/D [3791 0 R /XYZ 90 516.063 null] +>> endobj +3826 0 obj << +/D [3791 0 R /XYZ 90 503.1115 null] +>> endobj +3829 0 obj << +/D [3791 0 R /XYZ 90 490.1601 null] +>> endobj +3832 0 obj << +/D [3791 0 R /XYZ 90 477.2087 null] +>> endobj +3835 0 obj << +/D [3791 0 R /XYZ 90 464.2572 null] +>> endobj +3790 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3840 0 obj << +/Length 1300 +/Filter /FlateDecode +>> +stream +xÚ­YÉnÛH½ë+x”QOï‹o“Øb8ÎŒ£ (†¡H´-@[$ +‰ÿ~ŠKÓM‘ª–àâòXïu¿ªb“d …KMŒ2Ä ©“É¢G“'8ü¡ÇªÓ8??¯¸KqšëdøXDÐŒ(Îx2œŽú†pv6àŠö¥?&óYºÌ¶Ù8K˃_²Ín’•Ûwécº9c¶Ÿ.'ùié,ï3©Îî‡×½Ëa­¢©„f¹†Ÿ½Ñ=M¦ öºG‰pV%¿`‡æO=É…ß™÷¾ôþ©ã”'Š ºÆª˜è,“Žp?Zƒ7á`¥'†XÆfÄ)UĆ©ÎCsû›øèi6žÍÓiê"ÝN6³u6[-÷çÊ*B™5‰6ŒP£»GêAƒÕ¶Ö:B©€XV*˜)d]þ/Öót{¾ÏÌ('Fp†RKâ,“°YœËlžªSw@F 1L¨.…"PXãjX.±¶‚LZ"• F‘ù©Q1úV´œþÒ¤ñrÚb7 +Luû쇧Áãc:Zq›Óð¼/„CjI®> 5*Bߎ–Ó“œÆ |%lË$ºH¿SÊ—³"ƒËÙªªd>[Vµ£Tù¿z,ÿó+æé^k!Ïä@) I ÅËRºgãò«Y:Ÿn;Œ²šhaÄÁ.ºQ)¬|“ó~ç\µË$¯q%PÆ¢LD¼L 39ªuTÇ5ÔíìCÖR'8Ñœ2T'ÒQW'aŒÚ¨:k¨Ëf h—­òÕ„I¦p»t0íæ §Fm!7#žzXÜÓ àÛ=ÅÕÕž†êpOu§{Š««= Õ•wÆ®–l˜Eå tŠ{ª)܆¤ŠyZÂäžzäÿâi ó4T‡{Ѝ;ÝS\]íi¨î9ËÖÐšÅø©¥Q+¢”Æg\%(n¬„{½öß +·õ5ÜÛ]E¥Õ¦ÒvLw™jˆ¦LbÚŽõTRBg1mj[¯6ÙÆk0iUß5GX 7g+˜Žyéaq3ƒ€íÕœGÅxk£BÞÉó¸}€’Üîñ"Vác +Zq‹ +[m;ü€gEc#÷¨/´`-Y“v$é}×B {ÖR~ØÜ€™ëaqs1ÆÀ\œ·67äÅÍmðc.® ·y¹ªÝ×UÆt‘±{TŒY:«rÕd}»|÷þæãåíðáýçÛ«‡Oýûðõîææò¶ÓvjóGSsØö€ÙîaqÛÆÓ;4®®NŽP]¤G#òNoÒ¸¼ºK‡òžÒl“þÜ¥Ûlµ“ØqsŽÏâ d/PÑŽ-"ÎDŸ~jXÔÝ0à›Ý¨ó¸†:Ü]LÞÉîFäy\CÞ«»óô±­ÓI"˜q¨N°·BÅíÍßððèƒP ‹ÛDzv„·6.äE{v“÷ˆžQЊ뗼ÏéxšnŠ·-oQÙ꜊)§)wM#N;ïÍÒ@*‰ø0Ÿ=,î3ÂxzãêêlÕEÊ‘wzãòê2å5S¥£Qsèϰ¸Æ­c¬ÅëXÂx´KW¨¸»¯á°"FIk×R¼„CÒc*¥ßšÓ/f‹4{Y·+×@¿tûöÇíAb£a©%Tƒx$xWÙX¥KÓ¹„§ž£õ›¾{©aá&xø¦_íCXÿY£‘ëü.ÓÍ8óŸü;ÚO~ãúŒ©þ®Úa¼ú§ç\œsZîA‡ÒåÖãWýÕ¦ÜÙ}ü»B“ +øã¥ú¦±úýò”¶¾gäe:æç?ìê›Ãendstream +endobj +3839 0 obj << +/Type /Page +/Contents 3840 0 R +/Resources 3838 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3875 0 R +/Annots [ 3843 0 R 3844 0 R 3847 0 R 3848 0 R 3850 0 R 3851 0 R 3853 0 R 3854 0 R 3856 0 R 3857 0 R 3859 0 R 3861 0 R 3863 0 R 3864 0 R 3866 0 R 3867 0 R 3869 0 R 3871 0 R 3872 0 R 3874 0 R ] +>> endobj +3843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [106.7172 668.6407 154.358 690.8921] +/Subtype /Link +/A << /S /GoTo /D (a00040) >> +>> endobj +3844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.2234 668.6407 222.4221 690.8921] +/Subtype /Link +/A << /S /GoTo /D (a00041) >> +>> endobj +3847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 584.4605 133.6164 594.3882] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 584.4605 157.1377 594.3882] +/Subtype /Link +/A << /S /GoTo /D (a00097_5960d82e7aca2986b8509a0d87d6cbc8) >> +>> endobj +3850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 571.509 133.6164 581.4367] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 571.509 154.3681 581.4367] +/Subtype /Link +/A << /S /GoTo /D (a00097_8ae6395641b7752dce47881e20cee970) >> +>> endobj +3853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 557.5814 133.6164 568.4853] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +3854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 557.5814 166.5525 568.4853] +/Subtype /Link +/A << /S /GoTo /D (a00097_6925d46b2819adb474a5f0036f02dd7d) >> +>> endobj +3856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 544.6299 138.5977 555.5339] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3857 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 544.6299 157.138 555.5339] +/Subtype /Link +/A << /S /GoTo /D (a00097_7092781c50dcad50f473888585c85b83) >> +>> endobj +3859 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 532.2364 152.1466 542.5824] +/Subtype /Link +/A << /S /GoTo /D (a00097_a6487b9c1c773b32656065d0e19bf142) >> +>> endobj +3861 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 519.285 148.2711 529.631] +/Subtype /Link +/A << /S /GoTo /D (a00097_e87913860c6b05c6e6b060639b950098) >> +>> endobj +3863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 505.7756 138.5977 516.6796] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 505.7756 193.1026 516.6796] +/Subtype /Link +/A << /S /GoTo /D (a00097_134ec55c3d5abaebfed4ff8edfedf1ea) >> +>> endobj +3866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 492.8242 138.5977 503.7281] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 492.8242 195.3141 503.7281] +/Subtype /Link +/A << /S /GoTo /D (a00097_5a3116623c6a7da7c82db6c301ae0da3) >> +>> endobj +3869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 479.8728 192.5346 490.7767] +/Subtype /Link +/A << /S /GoTo /D (a00097_606d2729bf411ade69044828403a72af) >> +>> endobj +3871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 466.9213 138.5977 477.8253] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 466.9213 209.1522 477.8253] +/Subtype /Link +/A << /S /GoTo /D (a00097_2fca02673894f222b01ad2d3a4d7dd79) >> +>> endobj +3874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 453.9699 175.3891 464.8738] +/Subtype /Link +/A << /S /GoTo /D (a00097_fb60f42593d305ea36d9b4303722696e) >> +>> endobj +3841 0 obj << +/D [3839 0 R /XYZ 90 757.9346 null] +>> endobj +1004 0 obj << +/D [3839 0 R /XYZ 90 739.9346 null] +>> endobj +262 0 obj << +/D [3839 0 R /XYZ 90 739.9346 null] +>> endobj +3842 0 obj << +/D [3839 0 R /XYZ 90 717.8172 null] +>> endobj +3845 0 obj << +/D [3839 0 R /XYZ 90 602.4342 null] +>> endobj +3846 0 obj << +/D [3839 0 R /XYZ 90 602.4342 null] +>> endobj +3849 0 obj << +/D [3839 0 R /XYZ 90 588.4455 null] +>> endobj +3852 0 obj << +/D [3839 0 R /XYZ 90 575.4941 null] +>> endobj +3855 0 obj << +/D [3839 0 R /XYZ 90 561.5664 null] +>> endobj +3858 0 obj << +/D [3839 0 R /XYZ 90 548.615 null] +>> endobj +3860 0 obj << +/D [3839 0 R /XYZ 90 536.2215 null] +>> endobj +3862 0 obj << +/D [3839 0 R /XYZ 90 523.27 null] +>> endobj +3865 0 obj << +/D [3839 0 R /XYZ 90 509.7607 null] +>> endobj +3868 0 obj << +/D [3839 0 R /XYZ 90 496.8093 null] +>> endobj +3870 0 obj << +/D [3839 0 R /XYZ 90 483.8578 null] +>> endobj +3873 0 obj << +/D [3839 0 R /XYZ 90 470.9064 null] +>> endobj +3838 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3878 0 obj << +/Length 293 +/Filter /FlateDecode +>> +stream +xÚ¥QMkÃ0 ½ûWø˜âYr,Û=ŽmeÁFs+=¤IZKÂBÂÖ?ç«ÚÛðAO~’xz.ýî$7Ú§bâyÅ$?ûï-ƒ™Ž<­ Söð‚Ž;ቧ§qÐÈÓb@La„q¬!è_ß=Ô2!'ð”uÙ„v]Ûç]߆`ƒr&›¼¯ÊºËºÏ¦ižӫ’Y¨VƒŽo¶?H^xÁ “B9«ùO¤çW,Fµ$_lÇ>®s&bl¸·ï@GdIkîH¿96ÿÒ0ºj} (µ6•„3ʦ*ô1!7࣡ÑÙmY—mÖ•Åd—÷hŒo HBÐA?'€s”TœýG)iB§uдSr{¨ãe¹Éïå\Þ\CƒºJ[¹ôðm€µendstream +endobj +3877 0 obj << +/Type /Page +/Contents 3878 0 R +/Resources 3876 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3875 0 R +>> endobj +3879 0 obj << +/D [3877 0 R /XYZ 90 757.9346 null] +>> endobj +3876 0 obj << +/Font << /F29 499 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3882 0 obj << +/Length 836 +/Filter /FlateDecode +>> +stream +xÚVMo›@½çW ôblöû£ª¢¦MSµ½T‘oM!Lb à¦?¿³,`ÌRùÀÚûæ½·3;ƒI€áCƒ%2ŒË Ù]àà~þzAºmNu¢Wi‘¤G=‚Œ½5ÈPM{½Añ6mb ÚtÎÓ:©²ýÈ7 PZ£ŽÆ–æ¦pAiHÄêo¼Û÷~Ê'÷Ü–!«W÷¥)ÝóµÊš7äŽgI›®ºCeÍÖ­öUÙ”u™¼Øó§M¬±‹/ë¡ÜZ L´ +8ÓHIÉg¯DŠÆ¨þZO¨ ˜—ÀHQâÊsZ¯Í¶¬ÞOµ ¦H1J΋¨õq~ VH&Žl­ü&ÞuÕ9. yíªCÈ(ZRÄ™°=a£>xV•BÚ(9±ê¶_‚~õcd»˜±-Ƕ=fk Ûë,©QN½Pè> endobj +3885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 437.3806 250.6249 458.582] +/Subtype/Link/A<> +>> endobj +3886 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 410.0836 212.6587 418.9302] +/Subtype /Link +/A << /S /GoTo /D (a00171) >> +>> endobj +3888 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 298.6746 202.2283 309.205] +/Subtype /Link +/A << /S /GoTo /D (a00163_gb97849f0d3ea858eee790b69591e6427) >> +>> endobj +3889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 285.3496 217.7102 296.2535] +/Subtype /Link +/A << /S /GoTo /D (a00163_g03070adbf8faab0f34f87c1270964306) >> +>> endobj +3883 0 obj << +/D [3881 0 R /XYZ 90 757.9346 null] +>> endobj +266 0 obj << +/D [3881 0 R /XYZ 90 739.9346 null] +>> endobj +1064 0 obj << +/D [3881 0 R /XYZ 90 553.9527 null] +>> endobj +270 0 obj << +/D [3881 0 R /XYZ 90 553.9527 null] +>> endobj +3884 0 obj << +/D [3881 0 R /XYZ 90 517.4245 null] +>> endobj +3887 0 obj << +/D [3881 0 R /XYZ 90 317.251 null] +>> endobj +3880 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3893 0 obj << +/Length 1119 +/Filter /FlateDecode +>> +stream +xÚ¥WßoÛ6~÷_!´/öƒYÞñ‡Ä`–-K׬²Ö{jŠ@“•X¨cy–Ü´ÿýŽ©È’, ü Êúxßǻ㑧†¡ +™RÉÓŒô÷Û¸ÏKú¾l~^ÍÞ\£ 3u°z¨,h` +ƒÕúÓd´X¢AÎïni¨ø¯×Ù6­GWyr|Jwe\fùnñyu3ûuÕÐ:UJh°¤ÿÌ>}æÁšÔÝÌ8&RÁ3½pÆ`ð4“(üËvöqögc§þPMZœ1¼:ŒþA¿<¤Õ†õê"†‹%pÎçñ~_¼Ù¤Ûm¾|^Ÿç‡íºûÎ6ÝeHÒâyºKR»ìš˜Qªâ#[:Œ>Žñ*-c2´vL‹äí½ûÈŽhEÅš±‹0µ™ßÒxM¼ÕÄ;ÎÑËyÈÝŸñ®~¦ PóoñÓÞ#ò‡ú¹É¨æÏõK™×ÏçCV:\kòË6Kª°••ÎûC^æEž|±JË‚u)Æ! +-"Æ ƒaó eÕOÌÈ0ÎÙRœq©TåˆË…ÕZnòÃE—8²P Œ“7¨öv€‡,¡^¬UôëøÉ…︫½°-êð´fkdR(JÞjÖ=©aÈ"êŽÔúó—À~oÉö3dë¶ìže+ &Ù?YR°"íjAi˜ÆH»­AõùOÞ·fùÈð%(o©TP>XäUjÓ{—UÛ¢rt¶;Iû®'UÄY 4p¦¸pêí§Ã£Ã|h‡ßã—í áïÙµêúå¡ëL@†ÈeGN×™5!¢oÍŠ`ΙúÄ™èMBH^•²‚¾ÎvÉö¸¦-®©þ¼:fû|_²Í+kÁ–˜+†°{»Ít Æ Éh ×Åé*.ã:FËÃ1)u,N“åÙ³ª Ú”šöU$_ìXþ;DÕ/¶ÓelPS¼t ®õ)oQ­¶Ç, |"ê0ŸÏHŸÒгÛdä}“‘÷Èý-Né¡ÒãÎhPBNÂOq’‘d +Û{v0àÒ^-dzoFÞÀ&>Êøð ^ðÞ×k·Ò¹Ô,Ä:äçcîñS2zv­Œ¿ÞÝÞ_ÞÞþrùþýPýá¢q/4¨ z$/(ïwSŽ. I¼Ý +*KÎÂIÁ¸>î’ú~10\2m"8Ÿ0-ÀXÂxØtÂŒ1¶fœ·I˜6ï×’“²u¿F@u¸Gj„ÃO©èÙØiîh{ã1ãiPR £ó¨ã;®¸w +a „J}¾iF M&À(ãKLðú8áL€Sîÿ*zv‡ £ûU/úÚ{ñ¨7Ô„ä‚ +†(LG?2$çd´Òÿ«£¬2(¢) °}¼iêél%éi¢m½«ümºKt²ºÞÍßMÿðƒÛvÝ  {ò èZgä\»¦Ívb¾që÷Ø÷ö·ïi¯·¶MþÉs‡ðendstream +endobj +3892 0 obj << +/Type /Page +/Contents 3893 0 R +/Resources 3891 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3875 0 R +/Annots [ 3896 0 R 3897 0 R 3899 0 R 3901 0 R 3903 0 R 3904 0 R ] +>> endobj +3896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +3897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 609.4075 213.2166 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00172) >> +>> endobj +3899 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 516.2256 211.8219 526.1532] +/Subtype /Link +/A << /S /GoTo /D (a00078) >> +>> endobj +3901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 458.3971 213.038 469.3011] +/Subtype /Link +/A << /S /GoTo /D (a00163_ge28f6cb60e86088d8886d0f804b4f37c) >> +>> endobj +3903 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 401.545 217.7102 412.4489] +/Subtype /Link +/A << /S /GoTo /D (a00163_g03070adbf8faab0f34f87c1270964306) >> +>> endobj +3904 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 388.9671 202.2283 399.4975] +/Subtype /Link +/A << /S /GoTo /D (a00163_gb97849f0d3ea858eee790b69591e6427) >> +>> endobj +3894 0 obj << +/D [3892 0 R /XYZ 90 757.9346 null] +>> endobj +1065 0 obj << +/D [3892 0 R /XYZ 90 739.9346 null] +>> endobj +274 0 obj << +/D [3892 0 R /XYZ 90 739.9346 null] +>> endobj +3895 0 obj << +/D [3892 0 R /XYZ 90 716.7484 null] +>> endobj +3898 0 obj << +/D [3892 0 R /XYZ 90 534.1992 null] +>> endobj +3900 0 obj << +/D [3892 0 R /XYZ 90 477.3471 null] +>> endobj +3902 0 obj << +/D [3892 0 R /XYZ 90 420.4949 null] +>> endobj +3891 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3908 0 obj << +/Length 2681 +/Filter /FlateDecode +>> +stream +xÚ½[]o7}÷¯ÚéÁ,?‡d°(Ö[+Y§‰œÊvv¦0T[ŽØ’«&ù÷½”†#rȹœ"‹E"Ygî9¼ç^’3¢Ø€Â?6°t •&VÈjpótDáϯŽXýñ1|~þuyôÃKn–ØŠWƒË»]„ŠÅ\Þþ:4DŒŽ¹¢ÃÙóóú‡Õˆ™á|½|ü3x9ÒtHnö¨—óý«éün¾Ç,nÜŸ¤ÕI;úíòõÑø²ÑTKV¢bNÑG¿þF· ýõ%Â5ø o(aÖòÁÓ‘ä¿y<º8ú¥‰³ÿ`wAn䊉üЙ$ðîÇÎ!::£ô[ÇÞ31b•Ú1 ‚êÆ\3VsÎ73t»t:_߬ž7ËEGfA.‰Tzætr±¿ê~¹Þì_-fOµ¦ÍrÿÿÙ»ÚÏÛÛÕ|½Þ¿YíÃÔt+5$m—Œ"”=¨„%Js–ͱ‡¨´ÄŒ%” +ˆ¥\i±Ó~2ÛÍýrõ¢ÍÍ('Z@4”¼AeØÃœ1ª‰fB¢íèogOuÆ·‹O#F‡óÇõ>ãŒWWœH¡ ÒvWý#‘ª51VW-©û? ü«ŸÙþŠŒì*”Dvf ûŸ· Ô’›åS[d:ËXæ4ü˜)Ìcf|H-'+½ƒ^Þ?Ô÷Rî»åáéùqþ4_lêÏfµÿÛjvÍÂ4©¸”ûf™; ‹‡]kíu,"mmktiÅÍ@Y õ[gÒ}²úXC¦a9zøq€ÏTc;ª“V믔›ZÚ2Œ JëXF»<¨@ÞŽåÈImgX|ÇÖÇ 3øýÃâæq{ ŽT0o}·WMî¿‹³-rØíÃslM{O ¢­‰z¯¥:[Âü³¬7«‡ÅGrŸ‰$¡—8õÀs34Ì'œqc’h^Wp]5óufƒŽÓ±þ¸•7ä&¦ +æ#qáÎU:!ÂUf!”±A•xa´´ªbÞïoë‘&䲂tÀŠ“w7‚Ç—d$qŒÉÕ›7é$+7Z†ïQ%^­ˆÖ¦Åû*úçˆÓáòá¶. ΄å\Ö‰™IÒjØ£Ív»X;‹&`Eãaå¢Áƒ¢Áy›¢ y{MDÞ§hpI\'ãíɯ§ãËéÙø"Y™"BÙBTžÃÌe¤µ1½ÉÙ ;OJ+ÖmsÀlö°²Íc`3ÎÛØòö°9"ïc3.#‰[ow¯_¾9I:|ÅÀð‹wç“‹q⸻DÀäŽ&¤A”p;.Z ¡_L¶·¥ 0˜nÓfº‡•MÇÓqÞÆô·‡éyÓqIÜÔôów?ŸŽ¯/.GVÀ-clxy•6½ †4 OOƒ*èâzŠXý’ŸÞá6¯rõÒY++—Æ”ÎÛ”@ÈÛ£"ò>%€ËHâv–ÀÙäýxšé~ØÙ2* ž–UÐÃmE`¯Ü²ƒ~¡Ù))`“Ði}À¬÷°²õc`=ÎÛXòö°>"ïc=.#‰[êþÉ©ûóÉô´-QP‘ÏOƒ*>•ÂÆÂ ²íA¹d¼»VV®Œ1¨œ·©·G Dä}j—‘ÄMkàÄÝà_]þû|ZOÿgïÓI@WÄFiÌ?©QU\["Ý~"þËŒÿÂ2BݱËÿ€øßÀŠþ£Œÿ ¼Þÿˆ·ìLÞÃÿ‚Œ$nêÿåÔ½¸šü”˜.)QZZ<# ª …ÃZO+¥b)à:ϹîžÕ)£»]˜ëVvc \Çy×CÞ®Gä}\Çe$q3›ýd’çÜùbžŠUÐÀùîñ¥‰5€Ý,gw%IUéîç>!³ÛÃÊvcŒÝ8ocwÈÛÃݸŒ$nÛn~ s{§ÝX*»Q »C wuB1"uÕýÄ&`v{XÙnŒ1°çmìy{Ø‘÷±—‘ÄMíO§×oO.~NL¯(Š*jxòvœëp%­Á“Ò  +jx›6ئÇjÀx‘3Þ}ùCy÷“š€ïaeã1ÆÀxœ·1>äía|DÞÇx\F×ɈžË¯¯&Wãüέ2 ÏGƒ*Ù-ånà Éu:·†hH_§á!1¼ G†x½áoÙ𘼇áIÜŒá“ñ·©€ÕYVx2TA§ +Öð0µNEn“Ó>Qœv0·=¬ì6Ƹó6n‡¼=ÜŽÈû¸ËHâf܆ÛÙäUú¬¹6Ì\þ·UÂ9%ÚØ–ÜM8לnº½„Ìp+Ž1†ã¼á!oÃ#ò>†ã2’¸ÃOsû6jˆÊâÙhPœQbx;¹åÛmÜ­wÛ0»=¬l7ÆØó6v‡¼=ìŽÈûØËHâf솛ÛÂOÓDšJá)iP-îËw«5µäž®r©ÜÙ2d˜çVöc <ÇyÏCÞžGä}<Çe$qŒéøâü͈Q:|=žäÏPJ$ãÏFƒ*Èà‚C6„ŠeÈü™,Yc£3Y/·‹wŠ/w&Ëqs'½º*$ø)*ÖFw(œÔWGHEŠˆ!–1w—†‡$´£%^ÏžŸof‰ ·Z¬€S ·°°S?<ŽåNRåœÖîô±ê¾q˜×V6c ÜÆy»CÞ²ßwÃqIÜÀò?¶óÕ×ôjã«X! Uâ7& èç8ûàúÍýl•;€ÇÝ—µúoÀsg‡s¥ã΃³Š¬6FÄ'¤3®îÁÇ!z7EˆÝôÃá–PmÍ!¨SðËv¾Çgœš×õæÍýlA ûëÃå»åÊãæíŸ /w¯~÷Aç‹:Ør»!#—†-8>r?pA˜eÝ¿™PnÓK»êVî² `›qg°;\èßc%uM/†ê¶¬ºÞ¤¨IE™Då7¨”8ªf&)¡–³VZhú ŠIMT%Y‹Ù ÔøÒГ¸Áð¸\~Ú>§;} —X‹§ AÀLOhEU;ÿÏî-¥5¼ç  ±ÀÜ‚7È}?B:Ã&w?q84²ÿ!BÓã³ÕÊýšaöµnæ»ýÿŸËÏ‹8Àº»Ë¡¡”°âoty÷±[á¾WÛܣŠ=„ûæÇ¥yX( opD[ÐßmÖ|{G Áº;"íÑÜø ÛQƒÖþ8߬ç+ÿ[™Ì}WMÇàÜ=–Z·2PÜÔiF@}ö‰0…ð¬Rú›~4¸+f—0!«Á®E»¯ îBNó«ùb¾šmüÏóü²üÖ¿xí2¹­ß0^ÿO_pñ‚Óý;NiU/æ#®†~AßúŸ21R¯ÛýtùåëÇù¢÷‹ÆL~þ™`B&endstream +endobj +3907 0 obj << +/Type /Page +/Contents 3908 0 R +/Resources 3906 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3875 0 R +/Annots [ 3911 0 R 3912 0 R 3914 0 R 3915 0 R 3917 0 R 3919 0 R 3921 0 R 3923 0 R 3925 0 R 3927 0 R 3929 0 R 3931 0 R 3933 0 R 3935 0 R 3937 0 R 3939 0 R 3941 0 R 3943 0 R 3945 0 R 3947 0 R 3948 0 R 3950 0 R 3951 0 R 3952 0 R 3953 0 R 3954 0 R 3955 0 R ] +>> endobj +3911 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 638.1863 274.5352 659.3878] +/Subtype/Link/A<> +>> endobj +3912 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 592.9052 189.974 601.7519] +/Subtype /Link +/A << /S /GoTo /D (a00173) >> +>> endobj +3914 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 480.609 174.2837 491.1394] +/Subtype /Link +/A << /S /GoTo /D (a00160_g070d2ce7b6bb7e5c05602aa8c308d0c4) >> +>> endobj +3915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 468.0205 216.3555 477.9481] +/Subtype /Link +/A << /S /GoTo /D (a00160_gecf13b8dc783db2202ca5c34fe117fc3) >> +>> endobj +3917 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 454.8292 258.0292 464.7569] +/Subtype /Link +/A << /S /GoTo /D (a00102_96eb4534b574ece96ed36806039f73d3) >> +>> endobj +3919 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 441.638 288.6444 451.5657] +/Subtype /Link +/A << /S /GoTo /D (a00102_4350350ce0d4595876743d4c0a720bcc) >> +>> endobj +3921 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 428.4468 295.1 438.3745] +/Subtype /Link +/A << /S /GoTo /D (a00102_e7250008b68d1909d54040515eef8ebb) >> +>> endobj +3923 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 415.2556 305.9495 425.1832] +/Subtype /Link +/A << /S /GoTo /D (a00102_6a327c0ffd40f69fbcd5f01f12e5745c) >> +>> endobj +3925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 402.0643 277.9346 411.992] +/Subtype /Link +/A << /S /GoTo /D (a00102_dd685a0f8b5e76a2687cc0f306813bfb) >> +>> endobj +3927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 388.8731 241.5711 398.8008] +/Subtype /Link +/A << /S /GoTo /D (a00102_2e52037249bb98d7bbecf42e275beb07) >> +>> endobj +3929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 375.6819 222.0444 385.6096] +/Subtype /Link +/A << /S /GoTo /D (a00102_72d99b1623afa14bd58c667b748c2ddc) >> +>> endobj +3931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 362.4907 222.0444 372.4183] +/Subtype /Link +/A << /S /GoTo /D (a00102_c72f8777ccc45ae274449ea7a9f3de04) >> +>> endobj +3933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 349.2994 261.3467 359.2271] +/Subtype /Link +/A << /S /GoTo /D (a00102_9f6c329c04baba17fe0f5b2a6597d713) >> +>> endobj +3935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 336.1082 260.231 346.0359] +/Subtype /Link +/A << /S /GoTo /D (a00102_6aaa9da3d0f8d4c0799516d46d939942) >> +>> endobj +3937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 322.917 261.546 332.8447] +/Subtype /Link +/A << /S /GoTo /D (a00102_8ee5e2c8e517d6e4f2198057f81e93c6) >> +>> endobj +3939 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 309.7258 222.0643 319.6534] +/Subtype /Link +/A << /S /GoTo /D (a00102_ee60b8757bacab269b0ccd7c240bf01d) >> +>> endobj +3941 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 296.5345 204.3509 306.4622] +/Subtype /Link +/A << /S /GoTo /D (a00102_bf4401501f1389872141a78b63f325a3) >> +>> endobj +3943 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 283.3433 219.2947 293.271] +/Subtype /Link +/A << /S /GoTo /D (a00102_55735650f879293d9b7b5fda6753d147) >> +>> endobj +3945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 270.1521 209.3322 280.0797] +/Subtype /Link +/A << /S /GoTo /D (a00102_876c82c946543cd70c141e41417138e0) >> +>> endobj +3947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 256.9608 214.4828 266.8885] +/Subtype /Link +/A << /S /GoTo /D (a00102_7bf0c086c7c41c12cc63324327932d91) >> +>> endobj +3948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 243.7696 231.4091 253.6973] +/Subtype /Link +/A << /S /GoTo /D (a00160_g221d37ccde7e3fd0dd2c2eb0a6b15493) >> +>> endobj +3950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 185.0539 194.0092 195.9579] +/Subtype /Link +/A << /S /GoTo /D (a00160_g7c5359305008e9183b18d6ab75f568bf) >> +>> endobj +3951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 171.8627 187.9223 182.7667] +/Subtype /Link +/A << /S /GoTo /D (a00160_ge4dcbbe6c641d2e3b8537b479df5fc99) >> +>> endobj +3952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 132.5288 138.5977 143.4328] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3953 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.5678 132.5288 205.5661 143.4328] +/Subtype /Link +/A << /S /GoTo /D (a00160_g66d19181ad5fe8b8f7c84d1f1d46a2ec) >> +>> endobj +3954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 93.195 138.5977 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3955 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.5678 93.195 214.2533 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00160_g3191066cf8f76bd00b6843b77c37068f) >> +>> endobj +3909 0 obj << +/D [3907 0 R /XYZ 90 757.9346 null] +>> endobj +1066 0 obj << +/D [3907 0 R /XYZ 90 739.9346 null] +>> endobj +278 0 obj << +/D [3907 0 R /XYZ 90 739.9346 null] +>> endobj +3910 0 obj << +/D [3907 0 R /XYZ 90 716.6405 null] +>> endobj +3913 0 obj << +/D [3907 0 R /XYZ 90 499.4252 null] +>> endobj +3916 0 obj << +/D [3907 0 R /XYZ 90 472.0055 null] +>> endobj +3918 0 obj << +/D [3907 0 R /XYZ 90 458.8143 null] +>> endobj +3920 0 obj << +/D [3907 0 R /XYZ 90 445.6231 null] +>> endobj +3922 0 obj << +/D [3907 0 R /XYZ 90 432.4318 null] +>> endobj +3924 0 obj << +/D [3907 0 R /XYZ 90 419.2406 null] +>> endobj +3926 0 obj << +/D [3907 0 R /XYZ 90 406.0494 null] +>> endobj +3928 0 obj << +/D [3907 0 R /XYZ 90 392.8582 null] +>> endobj +3930 0 obj << +/D [3907 0 R /XYZ 90 379.6669 null] +>> endobj +3932 0 obj << +/D [3907 0 R /XYZ 90 366.4757 null] +>> endobj +3934 0 obj << +/D [3907 0 R /XYZ 90 353.2845 null] +>> endobj +3936 0 obj << +/D [3907 0 R /XYZ 90 340.0933 null] +>> endobj +3938 0 obj << +/D [3907 0 R /XYZ 90 326.902 null] +>> endobj +3940 0 obj << +/D [3907 0 R /XYZ 90 313.7108 null] +>> endobj +3942 0 obj << +/D [3907 0 R /XYZ 90 300.5196 null] +>> endobj +3944 0 obj << +/D [3907 0 R /XYZ 90 287.3283 null] +>> endobj +3946 0 obj << +/D [3907 0 R /XYZ 90 274.1371 null] +>> endobj +3949 0 obj << +/D [3907 0 R /XYZ 90 204.2437 null] +>> endobj +3906 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3959 0 obj << +/Length 737 +/Filter /FlateDecode +>> +stream +xÚ­VMOã0½çWøØðÎŒ¿Žûi?é *m(‘J#Ò–ýõ;nì*mJSiW9ĉŸ=ož=ÏFü È@8ãd¦´“§ÄŒŸ'ºO¸ÿ¤ ø8J>œQ&2™Y²bô°žÁ¢4„$FÓëžPFÊ ê‹Ü40@ M㬘çMës9©ŸòÅj¼*ÊÅðvt™|mÂVFYôAŸ“ë[Sfw™€TYjÄ+€Ä,#ñ”hRñcž\%?7ó4ëû’Ó`dªRqB®I§ê€œDK,qòŽ6j)·Ú«Ü .KEDyI¾ß¯ÆÅ¢É{õ˜ÔU5d‘Xƒù[øU.nhV7Ó Ô·«¦±Ì«—¼"â@î*Ù9äø¨ðp*!$™4ï/Oîqá7þQ6ïz=”¡ç¹Î«"_¾k 6e4iú_¬ÁZ' œê±† ¬×Ú°†ž¸Ñ¶âöZÃvì#¬¡‡EgÞ–5‹¢S¼)ø¬Cì!¢úÂó:¡ÛŸ­! +qpë’d•>rë·Ð‡¶~„y&¬Àx^üÉwĦ¼H}‡œÕ(hsÔN6Îo{›íÓX6´ÆýÓ%c]¬¹B¥ÚW$Ëç?_.XE> endobj +3961 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 703.2821 182.941 713.8125] +/Subtype /Link +/A << /S /GoTo /D (a00160_gdf916e0c752f5cda70d0bddb2be422ba) >> +>> endobj +3962 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [186.7567 703.2821 211.444 713.8125] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 664.4278 178.5273 674.9582] +/Subtype /Link +/A << /S /GoTo /D (a00160_gb50f78bbf36d912d69f6c1685d0b40e3) >> +>> endobj +3960 0 obj << +/D [3958 0 R /XYZ 90 757.9346 null] +>> endobj +3957 0 obj << +/Font << /F29 499 0 R /F50 1172 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3966 0 obj << +/Length 2209 +/Filter /FlateDecode +>> +stream +xÚ¥Y[¯ÛÆ~ׯ⩨Ö{'éE]Ÿ:ˆ›§ÉÉSÐuDX‡RDÒ'FÑÿÞ™½PË‹H†ÄË·3³³³ßÌ,Ù’Â-ºŒTD!õ2{^Ðå<þnÁÜë ¼ß„€¿?,^¿çÉ2!‰æzù°34#Š3¾|Øþ²Š‰\o¸¢«ôtª^Ÿ×,^åÕñð9¸\GtEöõ¾8äöêÇ|—[L™á#q¹bŠ­{ø°øÇCk“3Y ÍТß¿üF—[0ý‘Äjù7”°$áËç…äÂß?-þÓʱ/Ì€±™+&ƧÎ$'Üσ+¢`êŒÒ¯;LØjb$QÊh‚e@E/st@K„V-ÌgÔz fôðîþµÆVÁÒ¨ã«c–5犬7*–«‡}neú쮎;û_ï­a¼c8[=7Um¯>æöý9GOEUçg;¶z)ê½½rSà«Ô ƒÍ~*N[]x½­79¨Î»³Kõó÷÷oïïß½ýá»ÚÛ`S’v„‰6—F7‡m,FeŸdii/ªúxÎí%ê… Ý]; Jk™åe@o»A!?ËDK>³ñ[ü&0ÜxC¹f‚Åéb¾X4CJéZÑÛô-jN7ÔP”Câéè®ês“Õw†¬qnÉݳ˜SáâËɹC,pÒ¸SÐ äî*àn4­Ñÿ(x›ïÞX•ø`Ÿ_ÞØ+tT±øÁµ|¬]!Xn/€fzeùëÁ‹v´ïYÊœr¨? ÐÊ>²ÛǘŸûDbqÛM+£¡)\©x)µ&•Ñlh9ü&0Z}¹.´ 5CKAaСձbZ5§ŠØ8æ=ÝA)‡iØA:[»]ˆÝñp8"ͽ´þ7|ôGŠ|íœz8€Û!'änöv„wuá[R€‹Ãñøéj%)!hH áįW”!ÚGP¸›¬fªô€Óú|,¶67îëú´Åpļð+U_Á?ûÖÇeB¤–¶’yñ_”.«vxRо¬6¬c¨Ù“`+‡zááƒÿš̵d¥MüèÆô˜] Ó“›²ÃdûôlsAF%X¡#cóòOæ$ÒTð|›Öé©>ëB$&:áêëÅÚþÄI1áJëŽÔÿÍÀ÷Å„/GhhØA +Ɖb1¿Úô†€±6AC¥Ë‹³¥8WÃöÛ6è &5¶¨9½Ð|&üÕÑÛúÆ’Û`¾LSH)ºgÂõ:ÙÁçléKõɲKñƒ¦–ØPÏ8D0 +À˜qÌD:Y×`¡­vmè'šS ]¡Ttuû*Ãx3 a$‚Ìyãúèö¼æÒíÀÆæŠ)vœy5Â\PÂ$®2D˜`ˆ6Ë“/ 1£×3DGï+W% {h ƒÒ°§ü:7xüœ¹¾»øùî’9Ô  d >í‰5c ®@Ò5Á¶ñažî ÌÑ ´­±öÞõgc‘ÂÌÁ‡J®FJ˜ˆ”6)“/‘2£×GJGïç5þƒ©¯|‘0¦zº¯ŠÇÏY1;¾J[A°M›vƒÍéOQTô¼`jAç ¬ÇVÒ_Ääu~S«îaó«>¥1Xõi½íª‡zçW½£û–UŸ¶b 7XõT±CKâˆÈÐ]ã'l4§=Æ3{xÛõ=¬¹/h_¿g2¤ì "w® L*F½`F1Œ²<ëùó€ß¤„‚6Inõf‹Ÿ™ÏPî¥/è› 1S†S¥X*îúE'D+Õâ ÿø³ñâ”n·ç±­ås9“ +•&·%þ=Qøµ0´áPËÇ4ÃÐÿäúÜöï^öE†µÉ¾[Ýù3D É8õMoUÛs¾pˆ‰è«%ŽÙ Ýã£áDý<9vJ\'UÆg‹’6O:À)Ò™ÖÛ’N¨wžt:ºo!i+rÒJx7ä¨ +$´­ÓNð¨9õ±Ä¯C}çëŒq]¤°*¹Ñ?kA_îuž`”HEÓSoQCÅ]ž€°M†qwOl˪ÊÏî@~’.à_P}+]è)ºð0CíwÛµŒqDûAöM};ØTíqš{ó{“Ÿ‹¼ºÊ ‰&BÆ7W„S:Ú«Qp.ÓJÕ×rÃ.1 a‚‡ÝÔâtçîc84í2ÒÆ]ßåeާŽ)=©þË_|@·5î†q÷Oßpñ†S{ÒÎcx”è½f¿8 šÐî)õÝñ/Où £ÅOùÞ´À?ÿ 8Yendstream +endobj +3965 0 obj << +/Type /Page +/Contents 3966 0 R +/Resources 3964 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3984 0 R +/Annots [ 3969 0 R 3970 0 R 3972 0 R 3973 0 R 3974 0 R 3975 0 R 3977 0 R 3979 0 R 3980 0 R 3981 0 R 3982 0 R 3983 0 R ] +>> endobj +3969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 639.4127 274.5352 660.6142] +/Subtype/Link/A<> +>> endobj +3970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 612.7666 190.532 621.6133] +/Subtype /Link +/A << /S /GoTo /D (a00174) >> +>> endobj +3972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.3051 493.1311 359.3784 504.0351] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +3973 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.4596 463.5516 356.3884 474.4555] +/Subtype /Link +/A << /S /GoTo /D (a00140) >> +>> endobj +3974 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [159.2897 309.3651 239.3189 320.2691] +/Subtype /Link +/A << /S /GoTo /D (a00153_ga92afb113e122f860392bfbd385f842e) >> +>> endobj +3975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.7197 294.8746 372.0849 304.7798] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +3977 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 226.9876 237.9445 237.8916] +/Subtype /Link +/A << /S /GoTo /D (a00160_g3d768e989e308144190ae1a5ddfa9726) >> +>> endobj +3979 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 170.3828 194.0092 181.2867] +/Subtype /Link +/A << /S /GoTo /D (a00160_g7c5359305008e9183b18d6ab75f568bf) >> +>> endobj +3980 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 157.5616 188.4803 168.4655] +/Subtype /Link +/A << /S /GoTo /D (a00160_g6d9751d534453425c7a5a215d1d4414c) >> +>> endobj +3981 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [243.4737 157.5616 268.161 168.4655] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3982 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 119.3412 182.941 129.8716] +/Subtype /Link +/A << /S /GoTo /D (a00160_gdf916e0c752f5cda70d0bddb2be422ba) >> +>> endobj +3983 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [186.7567 119.3412 211.444 129.8716] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3967 0 obj << +/D [3965 0 R /XYZ 90 757.9346 null] +>> endobj +1067 0 obj << +/D [3965 0 R /XYZ 90 739.9346 null] +>> endobj +282 0 obj << +/D [3965 0 R /XYZ 90 739.9346 null] +>> endobj +3968 0 obj << +/D [3965 0 R /XYZ 90 716.7484 null] +>> endobj +3971 0 obj << +/D [3965 0 R /XYZ 90 553.0164 null] +>> endobj +3976 0 obj << +/D [3965 0 R /XYZ 90 245.8074 null] +>> endobj +3978 0 obj << +/D [3965 0 R /XYZ 90 189.2026 null] +>> endobj +3964 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3988 0 obj << +/Length 969 +/Filter /FlateDecode +>> +stream +xÚ½WMoÛF½óWð(´Ý™ýâæX¤ b´I“è–mÓ²™l(Ò®ûë3üXzIZK ø±O3oçq¸súAlyl”aVH_ÝE<ÞÑí×ôËZßø€ß·Ño¯ÐÆ–Y:ÞÞ´40…€ñöúÓ +®7hQ˜Uýæo:U|Œw'¯ö‡¬;{Y\ÕwY^¥Õ¾Èן·ÑÛ!mÏJ MÒoѧÏ<¾&vgÂ&*~  ÎÀZŒï"‰Â]¢Ñû!N·Ðþá¹âšå š®”“Õ#Õjð©xá\3);T£À?ˆjZpZG%b/Ü4d6"Ü­5wÊ]¿ôÁ#@@®õ5ó©Õ ¿T3nÂ0ÍA†¸mÐ,+Ýó²JθE ¹˜%•ô|µ„qÒÓE;øBÑÓ¨Mú2;‡û/»¬:fåýÔ*+§tCe‚8L˜‚bF3Q@ñû5òU±¿¦s˜·‡a 16ôgމŸ~þ$zìÆ·4¢¡e«eçÆ&CȆƻË*Ýç«ÛÞ‰WuY®É­dÆÃc«Èé™á®î®{˾ýØ42’„°b'+á’qm!\J_ ³Šúè”) MÃ&`‹.ô>#pZÊë6ÊëóÜe„P“ܧ;Þá—XÌâz=¿Ï÷s»›æÍ +° ‚C-¥OÈðf"þ™ý®f`„9¯á}t ãXÃä )öÿg“®ï:»i©“µV A&?§“2ÔB.u²ƒ-w²ð‡Ê»¡ß}vá‘¢çÍ”Yâç‡ÊX–ÐTç=c¬,”>‹ë™ìP_ëg…^€J[–`@-@jF®¹šJ øÕmÚN³‰fØ4"y€´šDmDö˜<½Ë‚^¥§%ÀÊ3½ê¡C^u°†ÁŸ$dçN’³=¦Ýá¶8V ½îj6ÁR`4ÕÓ~z7Ýñk^<äãÇÓ.GÍD#ðOq9})HÞ ¿ËlÙå^Àм +çüëç]žW£ÜçÌ«0‹Y\ÏJßê¬|œ1I4ÕG[° +µ”?±L‚6õ¥“”M˜Ô +Îs’8i€5 Þ×YGzòϱpþI«„Ô?¶Û±öê¦('>{ +ñ°?º³K”>{ûÕÕI—©„Þ£\ãY.S@–Tɳ[3NÚƒVú‡¶‡­WéûE€@sKdDÒ¨+þ(Ûs:ÝŠû:˳2­Üg±Óë/wrѼŒêþ°?ò(^`¿FÎu¯òÕÊ)=ß0_>ºíò»l¶QV4Þ5O¥ï{ðg>endstream +endobj +3987 0 obj << +/Type /Page +/Contents 3988 0 R +/Resources 3986 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3984 0 R +/Annots [ 3990 0 R 3991 0 R 3992 0 R 3993 0 R 3994 0 R 3995 0 R ] +>> endobj +3990 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 726.8189 138.5977 737.7228] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3991 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.5678 726.8189 214.2533 737.7228] +/Subtype /Link +/A << /S /GoTo /D (a00160_g3191066cf8f76bd00b6843b77c37068f) >> +>> endobj +3992 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 688.3382 178.5273 698.8685] +/Subtype /Link +/A << /S /GoTo /D (a00160_gb50f78bbf36d912d69f6c1685d0b40e3) >> +>> endobj +3993 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 649.1103 138.5977 660.0142] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +3994 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.5678 649.1103 205.5661 660.0142] +/Subtype /Link +/A << /S /GoTo /D (a00160_g66d19181ad5fe8b8f7c84d1f1d46a2ec) >> +>> endobj +3995 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 610.256 187.9223 621.1599] +/Subtype /Link +/A << /S /GoTo /D (a00160_ge4dcbbe6c641d2e3b8537b479df5fc99) >> +>> endobj +3989 0 obj << +/D [3987 0 R /XYZ 90 757.9346 null] +>> endobj +3986 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F14 636 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +3998 0 obj << +/Length 1782 +/Filter /FlateDecode +>> +stream +xÚ­ZkÓFýž_aÁ—Dj†y?P…Új ‚ +µ…ýÇ›uIœ4ºüûÞ±=Îø5ãU+$Ö±ï9sÏëñ$$Áð$'J(d—Iº›ád§_ÍH}y ×—>à—ÛÙ³—Ô$Ier{WF Jhr»þ0×H,–Tàùêp8=;í·ò?”Vg_æÛ¬:z—ÝeÇÑó¬HËSމ`‹O·of¿Þ6j‰‚Ibü=ûð 'kúf†3Z$ÿÀŒˆ14ÙÍ8eîÃvö~ög§ºPÞ04RAØðP Gp†º±Rºò†J0~ìXa€Ud‚ŒedH³ Lu‘:öMv^A ué&;¥ÇüpÎ÷E‡yfØ0V®©Â¼{ûGu[¶ bþ°Úœ¢Üî²â¼²¡P7éZ L´J$ÓÌSæ@KÕ¯mÆ b Œ0¢”öóD\Î÷ûãó.7Á)FI˜¼A °û)!X!E˜¸F+é׫]ÐKñuA CÛS•PB¼»%Eœ (œò®{R•BÚ(Ù‘Z]þš¸£ß<ÙîŽÙÒ—Ý‹l¬@öOkP jQºßuõPÅ`¢hN]ƒêkh ¾Íjx1PwK¢]H +SjÂ"o²Ó"/‹µªºú¯=¿ÍzÙ1Iu" F³Z½½tÜÔ˜w~ 8üÒ¿a zq­ºz¦v5hŽ$Œ¤£¡[|cîE³Ì¨Î ï÷Ò¸ˆD!I9/‘Oó"Ý^Ö0g%t‚'¥äû'öv;Õ+$C.Oçc^lN½;cNûôë4è%ªèÏ$Á2º5“:)€yÊ¡r*@¥ÝDâ03(vÀCíºƒËô&Æô(êdvxÆp)à!fØècÐ µ BókKø‘RÑoo¶ÑCO 26¨/<ž –²Íût]´GÎ%RT‘ùøsø˜Œ^\+ãõûß?Û~Ó†^N€CŘ¡Qc: Àx5d² H(eÆMö!“,nrˆÑ39ÌÛ˜ìóN0¹E>Åä°Œ^\grz2™ ŠñZ‹µé ,^YÌ ô#ÉÇ-ö!‹,nqˆÑ³8ÌÛXìóN°¸E>Åâ°Œ^\gñ!;æû^‰aVþ<’‡Š±fvü@³!£©DR‰qŸ¯×C6ר¸Ë:Ïä iã±G:ÁbŸyŠÃA ݨÎ_ÚŸÁvmxxäa…‰Nn³âF‡|%°R lü}Ô„œu°¸µ!FÏÛ0oc®Ï;ÁÝù{Ã2zqÁlÜààø¯‡‰‹}bðxè…žcŒ”¢dÜcòØÁâ‡=üÇ>ï[äS<ËèÅuóqƒã¿z&n<ö‰Ác>à1Óõ:}Ìcð¸E=2^=Žð:[¼qÛä<ŽÈèÅu‹QÃão<Ž;[Äà±|ÑÒ5ºõžõòR¤ö¥è=‹1 \zü¹íBeá`ñ²1zeæmÊÂçý¶ x¾ÏûË"Ȇ!Dt¸Ç«Âác*zqÝNÆçÕá®¶ý—-­æDF²àP1~ƒ‘`”u²v™€c2ä:¢Æ¾¹î`q×CŒžëaÞÆuŸ7îz‹{Šëa½¸ëé¾°}is9ö;“‘HÛÝîp&*¦ÁÄ´¡Àùô~u¬wi¸¿yH¡I0·K"ÙÀ¾!ŒKÃ]f{¿?‹Õ.û¡Ú$ôÓÜ ¯ú†S2!¸Ûp:eÇov<;U¨Ý$&‡еR5P<xé£ËŒ œh ·ï-1jàªÑ× å–ü!KskYú½þš¤Þ½îÕ[©ÙÑ]­÷ý]nìИ|j(‚’¥aùµzb "ãïÉT Ô‘ÙÀ¢3Ò˜‘^7#[¼—â”oŠò;Êç®"»I®iGÄøÔ¬á15ݨÍÄRý¸å4!òó¹'A¤$‹ÌÏ#VÄ:¨ÛÄ0ômV„:/•QX†Lë¼>:ÐyXÙy3×K]ËÍ–»U¾廬!*Œùº)Ljá誶Ż©0ÔMüM7õy£ë›6÷„õMDE/nÓFó"?µr!ŒŠ¤À¡bäð¾=³›úø’ +p5¸i‚[ûBþ§ß+”e£á¨ÿźDF1í~ŽP‹°š_eEv\Ý/Üw®oÝÁ»v¸Ô­ÿâç”=§¸úD1–ÕÑÝ‚Šù¾^…\^×K‚jà—zõr³ø¾ÉŠnzì)òó/$ÎfÑendstream +endobj +3997 0 obj << +/Type /Page +/Contents 3998 0 R +/Resources 3996 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3984 0 R +/Annots [ 4001 0 R 4002 0 R 4004 0 R 4005 0 R 4006 0 R 4007 0 R 4008 0 R 4009 0 R 4010 0 R 4012 0 R 4013 0 R 4014 0 R 4015 0 R 4016 0 R ] +>> endobj +4001 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 274.5352 657.906] +/Subtype/Link/A<> +>> endobj +4002 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 607.3502 185.6501 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00175) >> +>> endobj +4004 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 463.3525 176.5052 473.2801] +/Subtype /Link +/A << /S /GoTo /D (a00161_g3212e70c55244608ac16316888c354f0) >> +>> endobj +4005 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 450.401 176.4952 460.3287] +/Subtype /Link +/A << /S /GoTo /D (a00161_g6cda47c85ce1b58b501b44ac9cccc50e) >> +>> endobj +4006 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 436.4733 194.2087 447.3773] +/Subtype /Link +/A << /S /GoTo /D (a00161_gf7dd2757d1e766f65b01ba7c91c660a0) >> +>> endobj +4007 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 424.4982 173.7357 434.4258] +/Subtype /Link +/A << /S /GoTo /D (a00161_g34b924954ba5707d536df28d71a80d39) >> +>> endobj +4008 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 411.5467 173.7357 421.4744] +/Subtype /Link +/A << /S /GoTo /D (a00161_g9e97c58fe35f750ad192774be9408ac8) >> +>> endobj +4009 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 398.5953 173.7357 408.523] +/Subtype /Link +/A << /S /GoTo /D (a00161_g28cf9765e4b57451af559ab988ad7160) >> +>> endobj +4010 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 385.6439 173.7357 395.5715] +/Subtype /Link +/A << /S /GoTo /D (a00161_g17ccd786400fd08b941e11046df1668f) >> +>> endobj +4012 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 327.8154 189.0379 338.7194] +/Subtype /Link +/A << /S /GoTo /D (a00161_gbc331f73107958428bf1c392ba19b6f4) >> +>> endobj +4013 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 314.864 197.8948 325.7679] +/Subtype /Link +/A << /S /GoTo /D (a00161_g37e3103b9591790d484a450525739661) >> +>> endobj +4014 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.4857 276.0097 216.0979 286.9136] +/Subtype /Link +/A << /S /GoTo /D (a00161_gf0349a8481565e80f55a751e2b408d6d) >> +>> endobj +4015 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [446.0722 276.0097 470.7595 286.9136] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4016 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 237.1554 173.556 248.0593] +/Subtype /Link +/A << /S /GoTo /D (a00161_g64807ba7c221ddf735572d05021539f2) >> +>> endobj +3999 0 obj << +/D [3997 0 R /XYZ 90 757.9346 null] +>> endobj +1068 0 obj << +/D [3997 0 R /XYZ 90 739.9346 null] +>> endobj +286 0 obj << +/D [3997 0 R /XYZ 90 739.9346 null] +>> endobj +4000 0 obj << +/D [3997 0 R /XYZ 90 716.7484 null] +>> endobj +4003 0 obj << +/D [3997 0 R /XYZ 90 481.3261 null] +>> endobj +4011 0 obj << +/D [3997 0 R /XYZ 90 346.7654 null] +>> endobj +3996 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4020 0 obj << +/Length 2158 +/Filter /FlateDecode +>> +stream +xÚ­YëÛÆÿ®¿‚H¾HEµÞwI:EQ7çq’öj«Ÿâà@S¼k‰TDÒŽQäÏÌ>¨åC¤‹œ–ËÙùÍÌÎk—, ðÇ‚„‘ŒH"Bd§ ž`úÛ³¯·ð~ëü}·zö O‚„$Š«`÷¨9(F$g<ØíZ3n¶<á"Z·ßÝÃPÒ5#Ô ¾)޹ÝUY{ÊË&mŠªÜü¼{µz¹ë`­TR(† ¿¬~ú™{îÕŠ‘Ä2ø”°$áÁirᎫ7«u|Ì ½`J9ÉÄ´v,$0Ãz´Œv1Q›-£”®Óó¹~VŸš³þGC_çùeÃâu^f9*h83’H©9ƒe‘1;΄YÞwy“£½5U^g—âì |„gdƒâ&†Í›wÖè‡<݃zü–R~ÌÉÐα$”ÅQ BNb8e%G´õ©Æ~'„R¼dH"¥B-Í‹ €·Í¡º<b3ÊI$8›ï¨&Ð}+0‘ˆ yå¦á÷éÉÚ°-ßo]çÇÚØ1oµâ$|E¯úËHÔ("q©¨æõûÀ¾÷Äv+&ÄV¾Ø#Î(@ +bÿmƒ´$«NCyx$ 6âdÞtÕX†žòcn(Ã_'\mËbÇ\BÜlò]ŽîUÚAµµ‹Òw»‘9eL„âq hG±_]ž,ÍkßýÖ_0á#¾(Ρ àÕœ±¡ CïsTKÈ#nˆL¬ ý ß&Ž#P* ~Y”Ù±ÝCæPý_´Å¹:7äðÅ´!‰¨¹K›ÔûMsi³¦59§žH©2 Iˆ›v+ÑûS!¦ JâðÊñßr.Ç¡y âi±£ZÂ…lœP¥ú¸µÖv„,pPo»–£_’aÄ×¹ÖC %lìâ1' ,XÀQM ÷ö7QHpRÙ´Êåú|.²ôsõ9Ï + ¸Ì?ê%V…:ˆ¾ƒP쨖°¡Õ¥úŒvmS¯µ º¬6†äã'½™žQaðélÍ‹.晫¶èíw0Ú=DxÔˆð‹Œ÷ùãs‰‡üúÆŒÐPMv~À÷ò¡1ói¹¿´{Ÿ`àQ&ûík[å]ÖÖµãûZ›)>ZüÜõ º îû]ĤkAÇ&e„ ê©ä|ѵ,ýÖ_0åZC¾Öµt=»–„úVOŠ‘kYª%l‰½`{;8‡²$½Ðî6â±:+Ls;ûë|ôkŠùÚõx³CMÈí.Ì +gêÂN›¤ƒcU½¿yp‘„s—d¾â·>µë…áðQf‹\G€j}¨Š½iˆMsÞ£;b]xK%ÅWð˾r~™P…ÒôRàÿEi[©^žtÈ«së:‘Äï+<\›ðpâ¿z´*d=Ð6~°k4õ”\-SŽ&«Ú²™¢ÉéEOsAFC \'4IæOú ®0Myó{èÏÍå+ë"pŽ„®ê³5gNËUÄà‘Ђù\›ÒÀ& g‹[N¤¡qË +©‘Є±›-«O0Ó²vd‹-ë,âµe]Àu-k÷K›ÇÝb¨H‰~»kuôKbŒø{‡áÁ’qBC(j³Vè¨à9XA +>°¾nš½øëïBD˜â䢢$™M+ŽxëSk)$  õ'„FI|eÚË™¦ÛÑ.Å~ÉÝk÷gèR[¾º{®úPµÇ½K  _¯Ž]6"‚“Ù + +Ê•ùu}j—±?@Z“›æÓHÄç“.³Æ½ +1ùÞ A3û¶@†ŒF9Ê…òÈæÈÇuÉe>á‘ ÏD!_aÈuéÄ—8 ÃYýa/ÁpA„C3*Ù¢ˆŽ®'ãrbÅ6BI–,ì•¢$Œ!^ÀbàCý[¦™h‹¶Œ–ª‹×u9Ý1¤ˆ®yqqåúJ<ØèàûŒÎRàE¢ +<5æúJK=¯õçìqûÿ¶'À°¥tD ¸‘ BPÑv'mÌ5·Ó …ˆXÊ3ݾ{ÔÓWLAášV{i8yQ…u‹&üvÕ÷ f’VG¶˜´f¯Ik×%­îrÕïƒFÕ_cÄ×}xxùúõÃ?¿W}°W$Ù¼:ªxŽÍ´’QžÞr2&Q1?ÏÉ|ê™ìÒ‘!ôËËeÊue?…”íéû,rÍuñTêÛ3w,²—ªeUnó>ˆÚýõžeR'N±>'ÿ—Íh 9Zð%_wd˾î1œóõyÜÎ×}ÜY_‡•á|Ö×5ý’#¾¯¿yù»‘§SATõnÖÕø˜›9°KÚT_ ù:ËìàñRì°nßý'ÏûtªŸð$ "±íE^îÿw&n¾¹ó—[ÆšùÄçUF Á™üæKAE¦¤úC_^µëư„‰Þ÷BÇ}›«XˆY(h¼oó2Ç» [§]±ÿÑ ^aÁjíãö—>çâ9·Ÿ˜9¥Ê¶ëx±á¢vü-ÚÝ™ÝU¿~zÊG…?OXéwl¸/Xendstream +endobj +4019 0 obj << +/Type /Page +/Contents 4020 0 R +/Resources 4018 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3984 0 R +/Annots [ 4023 0 R 4024 0 R 4026 0 R 4028 0 R 4029 0 R 4030 0 R 4031 0 R 4032 0 R 4033 0 R 4035 0 R 4036 0 R ] +>> endobj +4023 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 641.4254 274.5352 662.6268] +/Subtype/Link/A<> +>> endobj +4024 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 614.7347 186.2081 625.6386] +/Subtype /Link +/A << /S /GoTo /D (a00176) >> +>> endobj +4026 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 541.2703 183.1495 551.0484] +/Subtype /Link +/A << /S /GoTo /D (a00085) >> +>> endobj +4028 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.3051 441.6787 359.3784 452.5826] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +4029 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [321.4596 412.0991 356.3884 423.0031] +/Subtype /Link +/A << /S /GoTo /D (a00140) >> +>> endobj +4030 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 261.938 213.038 272.842] +/Subtype /Link +/A << /S /GoTo /D (a00153_g41aa744caa46913b3b3aedb2a4e78546) >> +>> endobj +4031 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.2787 224.1492 190.8907 235.0531] +/Subtype /Link +/A << /S /GoTo /D (a00085) >> +>> endobj +4032 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.3888 224.1492 268.6482 235.0531] +/Subtype /Link +/A << /S /GoTo /D (a00153_g69646a81a922033c5281445a71f8ffed) >> +>> endobj +4033 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [336.7197 210.0611 372.0849 219.9664] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +4035 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 143.9152 217.4713 153.8429] +/Subtype /Link +/A << /S /GoTo /D (a00161_g029256bc17a12e1e86781887e11c0c7d) >> +>> endobj +4036 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.6302 105.1501 204.6385 116.0541] +/Subtype /Link +/A << /S /GoTo /D (a00161_gcff75c8c930abd6ff168e85373a4eb92) >> +>> endobj +4021 0 obj << +/D [4019 0 R /XYZ 90 757.9346 null] +>> endobj +1069 0 obj << +/D [4019 0 R /XYZ 90 739.9346 null] +>> endobj +290 0 obj << +/D [4019 0 R /XYZ 90 739.9346 null] +>> endobj +4022 0 obj << +/D [4019 0 R /XYZ 90 716.7484 null] +>> endobj +4025 0 obj << +/D [4019 0 R /XYZ 90 559.6875 null] +>> endobj +4027 0 obj << +/D [4019 0 R /XYZ 90 501.564 null] +>> endobj +4034 0 obj << +/D [4019 0 R /XYZ 90 161.3562 null] +>> endobj +4018 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4040 0 obj << +/Length 690 +/Filter /FlateDecode +>> +stream +xÚ¥VËnÛ0¼ë+x´f¸¤HŠ9ö‘  +´©oiP(¶l µåT²›æï»IU¶d1@aÀâc¸3»Ë% „áˆaDKMˆYì"FÖ8|›žáü¬ x7®n¸!†Å™¯ +¨äÀÉ|ù0I¨šÎ¸d“ôù¹ºªv‡çænìèM¾Ílë>[eå’IV,š!ÉÔ¤œ>Îï¢óVƒ“(…‚ZÁ¯èá‘‘%J½‹&‘ä;Œ‚1œì¢˜ ßÙFߢ¯­;Ñ,òT‚v€)¹÷•£ëÚºzs,‡|_TC’™¦‚éËAý7o‰D'¦ÀE·Vj¶ïœ÷b q)FéZP€bj˜R'¤¿§œMöù²G, O‰ë™rí ÷] pnµ–PïžË}‘õ4hÜks1꼘 Àµ98“ìXTùºÈ–vÏ.6ii[YYîK@?%š‚âDN…]Q™±ØYÜh“Œ$¨MÅ6ÜrL›¤5Yk{Ÿn·Oé¢NÏO«håv£í6éÁ¶òÊiÇÞ—Mæp©ûf³]šoÝZ,K‰3Õ.¯ªÖ¢·Ó¤çéEÏ1–1‹aÜuç9p¬.ˆ/Ö‰R %J VJ×àH©x}­œð‹å”û ÕPѳÛÖK^ä‡~½p*¥ÑxTˆ\KŠõqzòaªL©’’JârÊ;€±”{X8åcŒ”ó¶)ïò†S~Âý–”«èÙmSŽ÷m]â=%IB±U +â7 ob.΢κÆó5Öƒ †öAIõ_·{³s\‚woo…·µHüåíDÔšo³"+Óƒ?ý)÷Ù7îê3îè:ÀÝ—]sqÍ™íqÆÜ[g5år²wWÃñÓ‡¦øôj¿ö^×xòž…§~z Äç/m¬‘endstream +endobj +4039 0 obj << +/Type /Page +/Contents 4040 0 R +/Resources 4038 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3984 0 R +/Annots [ 4043 0 R 4044 0 R 4045 0 R ] +>> endobj +4043 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 704.1539 179.6335 715.0578] +/Subtype /Link +/A << /S /GoTo /D (a00161_gb1fc692a2700b7a51517724364683f67) >> +>> endobj +4044 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 665.2996 173.556 676.2035] +/Subtype /Link +/A << /S /GoTo /D (a00161_g64807ba7c221ddf735572d05021539f2) >> +>> endobj +4045 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 652.3482 189.0379 663.2521] +/Subtype /Link +/A << /S /GoTo /D (a00161_gbc331f73107958428bf1c392ba19b6f4) >> +>> endobj +4041 0 obj << +/D [4039 0 R /XYZ 90 757.9346 null] +>> endobj +4042 0 obj << +/D [4039 0 R /XYZ 90 723.1038 null] +>> endobj +4038 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4048 0 obj << +/Length 1254 +/Filter /FlateDecode +>> +stream +xÚ­X]oÛ6}÷¯ÒûÁ /¿ Å6¤éšµX–ú­- +UVb!¶ìYö¶î×ïRe}Y2°Á¦­Ã{/Ï%)B@ñ¥–šX.Tm&4xÆ¿ßN |<Ççó:àçÅäúŽÙÀ«˜ +OyD2`Ábùi +RÍæÌ2®§ÇwØ”t +„»d­ÛmtÜÄé!<$Ûtöeq?y³¨hKU’+p¤L>}¡ÁÕÝO(áÖÈà/üA XË‚ÍD0î¬''¿WqŠy‡¾ÁIàý£Aðæ‡Çp´º!z6Jé4Üí²ëC¼NãÃò:[Åë5‰Úƒ|ŒŸâý Ì4N£Ø ²ˆÄJ™GÇìºàÌTÑ ”ñoãCˆ–eºâ,Ú';Ÿ,ŒÃksàÂ8ɶó1Ù켄BY;ÁF +FŠB-å½éñ yÕ5€±„Rޱ$%TH™Køi†ÜÇÃj»¿iseDsÃ䪇½>t šhàò-§_†›2qÇôet¯³"qµÞŠÁ%š$ïõCGªÖÄX­ZR‹Ç/oýZ“í{ôÈVuÙÈN@ˆ²Ì’(#YÜÖ„%Š5œ¶ +Õåo ¼Íñ¿îñÖ¤ɰ$Ñy¦”¥InÈ<ÑIùíþ_wÔƒ4„c”@%’òR½{´.1õé÷øy½CÏôwâ:u¾Û"ŒÀ±JÛÑvžGQw¢9jR¦°>Ùsë#‚ÆT +‘#_%i´>.±N–ûU¡yuåú»‚. ¼ í:Xr¢­i8¸ÅŽõ!pÖ +@vØ'é3YõDèHF=ðußr…Ui1Ý×.® ¬n†8ëYÇ%"(gw—: ¯¼V¨§8Žð3c²»¬¸…ky±Bñâ`©RMÞWËr¤r¡ˆfZäçííñc2:qóõý—7ïß}xœ :ýíÃâ³T0F {8jDíEI!›®›{×Mœ#TÛMÍ©%Œ[Q"®úý¦{©júíî˜Fnáéó›pgIÙY¿Õ~«`£~d<ùm„×û­ÁûçŒÑé6Yv¸1@¶¸ÏÛÍãÇTtâV«é×ûîþÈpï3’cׂà¦{*©Ï¶¡;xf³šÀRQT5Öôžé(Àó::W"i`P‰¹<”Q\VOA’wn» ×É?åÑê°<ø«ÿB÷Á7îg §Çò°ò›Þ0~ÃÊ{F©*ZO3†9Ý?º@ß¾û럿¿?Ç‹w#ã¥Õ²ô/…9 8endstream +endobj +4047 0 obj << +/Type /Page +/Contents 4048 0 R +/Resources 4046 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 3984 0 R +/Annots [ 4051 0 R 4052 0 R 4054 0 R 4056 0 R 4057 0 R 4058 0 R ] +>> endobj +4051 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +4052 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 609.4075 185.0921 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00177) >> +>> endobj +4054 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 516.2256 223.1601 526.1532] +/Subtype /Link +/A << /S /GoTo /D (a00162_gaa60ca995565b799bb958c806e933665) >> +>> endobj +4056 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 458.7707 172.998 469.3011] +/Subtype /Link +/A << /S /GoTo /D (a00162_g69b075ef7e4d7bcf5a903d3d75baac02) >> +>> endobj +4057 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 419.9164 176.8634 430.4468] +/Subtype /Link +/A << /S /GoTo /D (a00162_gd1f18f739da7703628c3663209463a0d) >> +>> endobj +4058 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 380.6885 180.1912 391.5925] +/Subtype /Link +/A << /S /GoTo /D (a00162_g86beee1f69d05b16022dfb430470e9ce) >> +>> endobj +4049 0 obj << +/D [4047 0 R /XYZ 90 757.9346 null] +>> endobj +1070 0 obj << +/D [4047 0 R /XYZ 90 739.9346 null] +>> endobj +294 0 obj << +/D [4047 0 R /XYZ 90 739.9346 null] +>> endobj +4050 0 obj << +/D [4047 0 R /XYZ 90 716.7484 null] +>> endobj +4053 0 obj << +/D [4047 0 R /XYZ 90 534.1992 null] +>> endobj +4055 0 obj << +/D [4047 0 R /XYZ 90 477.3471 null] +>> endobj +4046 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4062 0 obj << +/Length 1385 +/Filter /FlateDecode +>> +stream +xÚ­Y[oÛ6~÷¯Ð£ Ì ï—`¶!KÑ zÉ[[ ®­ÄBlÙµåeݯߡ$ÊÔŤ}(e}:çãÑ÷‘G I0ü#‰Á‰ +Æe²ÜNpò?¿™úöîÏ}Àï÷“«[jƒŒ¤2¹(#H‚%4¹_}šj¤gs*ðt±ß¯Št“§Åêê¸N7´®îÜf›´}HÒÃŒèiš/íO\33%B;ÜßMþ¸oxÔ4“IJø6ùô'+ {7Áˆ-’g¸ÀˆC“í„Sæ.6““÷MœêFùÀÐlaÃÓ%Á/ÔÍ—Âô•7]‚ñKæ “¬¢d„(£C¹mpª›èˆÔñoÒbVU¤›ô¸åø3Æt“¢nåµ@˜h•H¦6˜ ÖÍæ>ª/mÆ b Œ0¢äöÛ ’ŸŠõîpÝÍM0EŠQNÞ ²û5!X!E˜8G+Ó¯Ûº¢§üiFð4Ý«Šâ=-)âL€zʧ~îQU +i£d‡juû)q£?=Úî‰ÚÒ§Ý‹l ,€ö¯ÇlyDÇ´Ë…rƒ$Õ2\¶ÕÏßšx?šÍÿË€èæD¸¼ +z°È›Ô*+ÏJ¥–…Îr_q½J +DI$ÁH`V³··5æƒÿú~î?0ðú{q-;çÓ. Í‘¬K¢«<‡Š¥îE³©ÑÿçÆ…d¥*ÿÞžò¥­ßq`]‚Á„\\¾}À+$[ós›ð3¥¢ïF»0‚T,/,©KÙÎûÏŒâé.[õrC5 !¢“û²(>Æ¢·Åßh¶os +KÑ‘8T,»â–èní±À®0&ý÷ ½T‚…x^Gžûè’‰À‰&’—L`ÓÁÊèsPËä­uíb“ýWoÅÚßCÐEbà~;y˜XÍ‹PÐ>—Õ :QFê˜z,®^/`H½á¼zý¼qõ¶rQo˜E/îY½Çbq¯@ZÂÛ Á¡b鬨BéNñGÊ—ƒ´€Õo”|}t@¾ ¬ìzÊ (·~],-ͧyš¯.j™khÁ ÿ)ó‹RæPWéŒH¹†‰¸”dXÊ>, åVÞ¨”Û¹GH9¢×_ˆ÷§)hð¹‰Á¡bé5AR‹Nz+ååzq¨ÛAîwEö]Ã6k f LI×2.wÛí"[BbdŒ–#-á¡C–p0KâÝaÆÅt·LÇú#­g‹šçeGØæõ:–` +a­YÌŒŽ°„CF,áÁB–ðóÆ-ÑÊ=Æa½¸gK|; õ&QÂd¤Ë®$4œvjs„áÞ`V€p„s6Ò +:d³ÙßÛþH[áM'Z¼Î^ÀŒF”ñˆî+3qÝ7Ȱî}X@÷­¼QÝ·sÐ}„E/îY÷»S1´À÷è•FªàP±üZ")¥éTÿ5”ïö‚cq õÌ…˜Ì !üȘ4ä(¦Ûm±7Õ j[Éò¢½¡ðÓcí¯Ýå&ì9ËW»ç™âÓ‹¾cð5ÅXûSëå¾1Uí^!ã9XÜx^ÀñÂyãùyãÆkåc¼0‹^ܳñö‡Ýv?`<° ýp*–_ÃXónõ_ÓxÕ4‚6áÜô©‘FñÐ!«8ذYöUWf ü*†a qÕþ¸»h*Á]Ô 6 ÊHd5»¹—¶Óða­ca‰Œ‚º>Q‡­(—õy“æéaQ¸ƒnwjø—Ü͈˜žê Bëÿñ5e×WWcYf*[qŸÞ¾«Ñ¨~ý^Ÿýîþýþ˜æÝŠÚ¿8j^}þá}sÄendstream +endobj +4061 0 obj << +/Type /Page +/Contents 4062 0 R +/Resources 4060 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4074 0 R +/Annots [ 4065 0 R 4066 0 R 4068 0 R 4069 0 R 4070 0 R 4071 0 R 4072 0 R 4073 0 R ] +>> endobj +4065 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +4066 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 609.4075 185.6501 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00178) >> +>> endobj +4068 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 550.8716 172.998 561.402] +/Subtype /Link +/A << /S /GoTo /D (a00162_g69b075ef7e4d7bcf5a903d3d75baac02) >> +>> endobj +4069 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 512.0173 176.8634 522.5477] +/Subtype /Link +/A << /S /GoTo /D (a00162_gd1f18f739da7703628c3663209463a0d) >> +>> endobj +4070 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 472.7894 180.1912 483.6934] +/Subtype /Link +/A << /S /GoTo /D (a00162_g86beee1f69d05b16022dfb430470e9ce) >> +>> endobj +4071 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 433.9352 175.2098 444.8391] +/Subtype /Link +/A << /S /GoTo /D (a00162_g984c4a8b65a3cb35460b073a40568c25) >> +>> endobj +4072 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 395.0809 185.1725 405.9848] +/Subtype /Link +/A << /S /GoTo /D (a00162_gf11c966b0e4f4ecaa73deb14bfb6830f) >> +>> endobj +4073 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 356.2266 188.49 367.1305] +/Subtype /Link +/A << /S /GoTo /D (a00162_g123c95a7bb55143cabba92446ce8f513) >> +>> endobj +4063 0 obj << +/D [4061 0 R /XYZ 90 757.9346 null] +>> endobj +1071 0 obj << +/D [4061 0 R /XYZ 90 739.9346 null] +>> endobj +298 0 obj << +/D [4061 0 R /XYZ 90 739.9346 null] +>> endobj +4064 0 obj << +/D [4061 0 R /XYZ 90 716.7484 null] +>> endobj +4067 0 obj << +/D [4061 0 R /XYZ 90 569.448 null] +>> endobj +4060 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4078 0 obj << +/Length 2227 +/Filter /FlateDecode +>> +stream +xÚ­[]oÛÆ}ׯÚ ¨·ûý\7mœ"i·‰€ûÐ*3±PYVõÑ´ÿ¾³$—^r—³®áQæáœ³sf–K/Íæ~ØÜѹQ†8!õ|s?£óOðëïg¬=}ç¯bÀ·«Ù×/¹›;â4×óÕÇ:‚fDqÆç«Û_LÙåw\˜ÅåÕOp¨è‚Ú¼ÜîªæèÅÃær_íÏëóöa¿ümõzv½êh[UJhæIÿœýòß‚º×3J„³jþ¾Pœãóû™ä"|ÙÍÞÏ~îâ4'ê rƒSLäGÇ$ßð0<£5Íè,qË+F)]¬‡Ó×çj·¯Î·á“l†Ã|W}¬ŽKfÕ~Sùa6ñqJÕñ!¿><·]|ÂZ†Õy nÛ„U§Íq{é‚8"rÁ‡ñ¢]æý]µÛ5תã_K¦ C©¦Ú*B™5s-!ƒÒä« €®bTZ +ÖJÄRœ0Êm-åùD\ÎwÇgCnÀ#8ÃÉ;T†=N£†&Ôc´šþv}ß&ð²ÿcÉè¢Úš2]­9‘BA¹ÔWý'‘j ±bö¥6§ÿ˜‡£"ÙኌlËN"{kýßÓvs"§j¨…KG4·O[‡Jù{O£yþo25vÅTÉ¡9¡<òEõ+¥|¿­ ³Nô¶ýô¿ß%êa~ ¢Ì5ãDiÚª÷§ŽŸZÌ»Øþ€¿Š/ÈØŸÄõês(Ãq˜¤ÈÖ^@•È“hžœ´IÔ½$Ò’Ȧ”5ôËí~³»Ü¬¡¡ó¿¸läî ¹ïì(rÀ0¾!8õ¾ºÿ}òäç’‚´‰” ÆÙ^ †-*¡pÀé|Üî?‘»L$ MÁi~“›9!“7I! LO<®Çꔹ©HíëVßêb@n†Ñ0IXùÇþʹJg6?§Ãt‚2v¨/Ü…³=Þ/oÛ‘&äRà wXÀ—d$q½ŒWïo>ìwé|©ˆ¢ÖP%f˜#sƒпé:g²’D ÅÆMŽ˜ÉV6cŒLÆy;“cÞ &÷ȧ˜ŒËHâ“7ÇœÉÒ¹Âø[P‰×[lÝ`ø`ñmÎbɈ¶°Òµ8`XÙbŒ1²çí,Žy'XÜ#Ÿb1.#‰[/WK'`µÆ[¬®?¼½y÷ãó7ÉÒƒ h<ª „sM·¢/„æ çÖ¯Ÿá3<ÀʆcŒ‘á8ogxÌ;ÁðùÃqI܌ᯞ/%]|—®“ ‘\»BBª¤ÄÁ1Ì}%,ç8SÄXjǘãVvcŒÇy;ÇcÞ Ž÷ȧ8ŽËHâfÿß«7iƒS¸#k]ÈF‡*ÈàÔª|ñÄ2xÎnX[îä¸Ý³;ÀÊvcŒ‘Ý8ogwÌ;Áîù»qIÜœÝþá÷æí*±œQ"¥Å@!œ°ƒ|ˆŒáÂ:bÍx{G绪è6F÷h6N¼ŽIËV÷˜'8kFÍøüâ&ô¡²x¨ fz%u?õ2g°ÑUäY+`XÙcŒ12çí\Žy'ØÜ#Ÿâ3.#‰›u:ÓÍ0å +¡žUáÛÞòa6TÎn-ˆ3ÈSW Àì°²Ýcd7ÎÛÙóN°»G>Ån\F7c÷wonÞ_§³7'ÜÿíMG‡*èàØëëÐ9¿#”#`1ó;ÀÊ~cŒ‘ß8oçwÌ;Áïù¿qI\/cuýæíõjl%Î!eÔÉB":TAŸ”U}\e[[À*Î _1³:ÀÊVcŒ‘Õ8oguÌ;Áêù«qIÜÈêìtsŽ YèPzÎ<½dŸ«Ü3—àŠ0Ž9$/c3w°ã-GL¨¢ÇÝ£Å8ip8&-Ücžà/®aµçn®ßú–èø;Îí›]º~ι’ù-0Þ`{;`//ûßÍí€qɉР+©‡€D€•+cŒJçíj"æýkÉéâa›ì0ȆƒùrÀ=^_R‘Ä­w1ý^é‡?/Ûsº?"}ŸêBªÄ`†J>È=Uts·>¶{¨²w7€BaÚGd6õaD® +˜t]à_«`X¹ÿo¿´3~6à«]EѹR-ë¡@ÙRãìcPÏþ³OaýæÀù®}}¦Ù‡•k©¡%PI­"ÿ—)ÅÆow~òUÞÜBáX¹ð£€Xáã¼]áǼåÂïqO)|\E÷±ðLJûCZúŒuP|xªÄoáØÊaöŸ¢ôÃË +Í0°`ž˜´QÓ F# ÐÁ¼†ŸŽÛ}Ûëæãp\Jµ¨Ü4ÆC®AšÃÏÛýíÃ祑‹Ñ†ñ›¬šZý$ ô$ZÁ=o˜Vl˜8 Ò0ÞÐ0=ÞbÃô¹'4LAE÷±a.çÃ%Ó0p7Þ#4 Uâ·šh­Ý ûOÙ0§ó‘}ÕTÞHLá ´;üĘmAéü+~|b Fh¬,ß‚ÍKJOÓ~ðn”OÓ~ðˆgisóÃÚ/ÀÊíÄÚçíÚ/æ-·_{Jûá*’¸Ñ»€¶ûÌRÍR"(Õ…,T‰ßrbãƒìCû…Läª\eàºU#wËÚõ€¹`e×1ÆÈuœ·s=æ-»Þãžâ:®"‰»¾>6ëÝ.·7f,—…DTI‚³„Á”7lôM^ +ñ™Vúÿz¾._½ñ|u©‰3ÂÖ³5÷¯ÿÂ̤xåßWûê¸>‡wÐþ?†ƒ×þÍòKû…ñö“>ãâo_ùçÐ/ÍÑÇ%‡µÌ±ù’þoÀïÿ„ÿ øûŸOUò?þeýL–þÙ-Jõendstream +endobj +4077 0 obj << +/Type /Page +/Contents 4078 0 R +/Resources 4076 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4074 0 R +/Annots [ 4081 0 R 4082 0 R 4084 0 R 4085 0 R 4086 0 R 4087 0 R 4088 0 R 4089 0 R 4090 0 R 4091 0 R 4092 0 R 4093 0 R 4094 0 R 4095 0 R 4096 0 R 4097 0 R 4099 0 R 4100 0 R 4101 0 R 4102 0 R 4103 0 R ] +>> endobj +4081 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 638.7618 250.6249 659.9632] +/Subtype/Link/A<> +>> endobj +4082 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 611.4648 193.391 620.3114] +/Subtype /Link +/A << /S /GoTo /D (a00179) >> +>> endobj +4084 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 465.4097 176.5052 475.3374] +/Subtype /Link +/A << /S /GoTo /D (a00162_g3212e70c55244608ac16316888c354f0) >> +>> endobj +4085 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 452.4583 176.4952 462.386] +/Subtype /Link +/A << /S /GoTo /D (a00162_g6cda47c85ce1b58b501b44ac9cccc50e) >> +>> endobj +4086 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 439.5069 224.8339 449.4346] +/Subtype /Link +/A << /S /GoTo /D (a00162_ge429c985be88ed048f382511c9ff00de) >> +>> endobj +4087 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 426.5554 198.4231 436.4831] +/Subtype /Link +/A << /S /GoTo /D (a00162_g19709735f29dafeabb91e0882231f9f1) >> +>> endobj +4088 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 413.604 206.5625 423.5317] +/Subtype /Link +/A << /S /GoTo /D (a00162_g7e904ab59f7ee134cf3218a8219e7e29) >> +>> endobj +4089 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 400.6526 211.4442 410.5803] +/Subtype /Link +/A << /S /GoTo /D (a00162_g5025948dd998f65a13a375a37aa5edf5) >> +>> endobj +4090 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 387.7011 196.052 397.6288] +/Subtype /Link +/A << /S /GoTo /D (a00162_gbfc1d8d15852318927cda30e1bc0470a) >> +>> endobj +4091 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 374.7497 209.3322 384.6774] +/Subtype /Link +/A << /S /GoTo /D (a00162_gaaaaf66ea67900c36d01136d5bad1168) >> +>> endobj +4092 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 361.7983 213.2175 371.726] +/Subtype /Link +/A << /S /GoTo /D (a00162_g57aca709a33690cd4fb73fe199fa1bdd) >> +>> endobj +4093 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 348.8469 207.0906 358.7745] +/Subtype /Link +/A << /S /GoTo /D (a00162_g8b600918f84783490fd791ce773175ab) >> +>> endobj +4094 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 335.8954 215.23 345.8231] +/Subtype /Link +/A << /S /GoTo /D (a00162_g6b2d00412304e2d95e7b853cce5858b0) >> +>> endobj +4095 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 322.944 220.1117 332.8717] +/Subtype /Link +/A << /S /GoTo /D (a00162_g3318dec654781e9d6d8ec873636660c6) >> +>> endobj +4096 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 309.9926 204.7195 319.9202] +/Subtype /Link +/A << /S /GoTo /D (a00162_gf784a76fe619452eddf87e6376a4bf9d) >> +>> endobj +4097 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 297.0411 217.9996 306.9688] +/Subtype /Link +/A << /S /GoTo /D (a00162_g3a4852e2372e34e1c0142d1147fbe027) >> +>> endobj +4099 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 239.2127 175.2098 250.1166] +/Subtype /Link +/A << /S /GoTo /D (a00162_g984c4a8b65a3cb35460b073a40568c25) >> +>> endobj +4100 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 200.3584 188.49 211.2623] +/Subtype /Link +/A << /S /GoTo /D (a00162_g123c95a7bb55143cabba92446ce8f513) >> +>> endobj +4101 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 161.5041 185.1725 172.408] +/Subtype /Link +/A << /S /GoTo /D (a00162_gf11c966b0e4f4ecaa73deb14bfb6830f) >> +>> endobj +4102 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 123.0234 181.2968 133.5537] +/Subtype /Link +/A << /S /GoTo /D (a00162_g82ff99d50221f7c17df57dc6092ffc97) >> +>> endobj +4103 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 109.6984 196.7787 120.6023] +/Subtype /Link +/A << /S /GoTo /D (a00162_g52c3c5ab1b1aa0659b5e465f7fbcc409) >> +>> endobj +4079 0 obj << +/D [4077 0 R /XYZ 90 757.9346 null] +>> endobj +1072 0 obj << +/D [4077 0 R /XYZ 90 739.9346 null] +>> endobj +302 0 obj << +/D [4077 0 R /XYZ 90 739.9346 null] +>> endobj +4080 0 obj << +/D [4077 0 R /XYZ 90 716.7484 null] +>> endobj +4083 0 obj << +/D [4077 0 R /XYZ 90 483.3834 null] +>> endobj +4098 0 obj << +/D [4077 0 R /XYZ 90 258.1626 null] +>> endobj +4076 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4107 0 obj << +/Length 1235 +/Filter /FlateDecode +>> +stream +xÚ¥X[sÚF}çWh’x`³÷‹§Ó©ìŒ]Bݘ<%†‚l3Á@A¤õ¿ï·ÒJ¬´båi‡t9û³ßùö&’`ø‘ÄàD … ã2Y<÷pò?ôˆ{=„÷Cðë´÷îššÄ #©L¦yI „&Óå—¾F†Tàþ|·;¼ËÒõ&Í–å?z*Þ]¯Öiqõ)}H÷¢ûéfa1ÆqŸ3ø6½í]M+)N©`’X!õ¾|ÃÉßö0bF‹äo¸ÁˆC“秬¼Y÷î{TqŠyƒ¶ ÂÚ{L8‚'´ì2… (¿ÇãÿÖeègA@"'€¤ÛøTŸq£4›C¤ej”ûÕ.[m7.ó¼±q¬lSĹJ×ë¢Ý!ÝÿÑBôQ3ÙZ L´J$b®Úk£ }TX Ú ŒÄúAu.år"ŽÙÓvÑä RŒ’8y…ja÷S@°BŠ0qŠ–Ó/çÏ.ÇÍ÷Áýt}(Hˆ×ZRÄ™€‚É[ýHU +i1ëR‹×ß“òê7OvÙ¢E¶ôe‘­€9Èþå°ZÐ!mj¡Ü IµŒ§­B…üµŽ‡Ñ,ÿÏ-56„±êBRžP9J¿bL7«¼0óD¯Ü¿}¾Ô¡ƒ(‰$ ‰zûjÿè0Ÿ|ûKüÐoÐbת;̦ CaRÕѬ½ÕED³äÈ%QÖ’ˆËDA69Ï¡oW›Åú¸„iCÂÈs\í¶» =½93g0Ž`<c}4ÏæEÂï³ýq‘‹ çÐ2­ +¦Öœœ]|@Û“0H4?űü_)áȶ“ §(c…êâ…Ù`)뼇¼·33°r0Ý`>_^%¾KC×+¯Ù!›ga¥Ã|¨ ãI(Q-j¶[ÿ0¬4þÀk5šk‚(#æ¬Ñ> btë4:Êx2ºƒ·4ºÆûvézs‰U¤A~Þëß%#ˆkeL¯Æ“«éhöþ÷Éõl|3¹_M‚©YÁj«$šŽ +Õ¡ƒ*jgQ×Áq›áR#ª1?o¸ˆ^º 1z†Çy+Ã}ÞW^#áqAÜÀðÉçÖóûÐq˜¸Ÿ¹vǪCìf¦®ƒÈ6Ã…@ŒFøé}Ìn‡êv;Bç™%­¼öH_aµÏü§£šQ­†Ï7w³Ë»»÷—ãqà.,ç˜íŠsSè¿`´žôrãÄb[ö–å~H¨kX[ö§Åû/»t™>´­pìA°™Óg ÄD*¤‚u–H”ñT#¼e‘Ôx³¢Ÿa(D•h0Gj¤€wIhFí^è ìä¸Kœ/ VpI1¬ T˜.•®&ö³l±³å”+eá|Åç͸]ªEEsSÂ$‡¹Ê[ÞëãfaO­%ɉ]ÎÔù’ô±’,aÝ%côJ2Î[•¤Ïûc@q»Z†ûO@"Ü‘ý§Ãw©âž™>ê…)Ò”w$¢DuI€R Š‘†Xà2pMÚ¾æ³ÇT ñ‰ò}èÉ‹GC¨_§»,÷‡œN·ÒMº‡áá>­”×åÅ­ý`rt7„º|AÙuŸ¼`üÉâêa@E»/nŽ7wðÏ÷ùaûÏËcºi¦Ç~…jÉÏ¿¿ Auendstream +endobj +4106 0 obj << +/Type /Page +/Contents 4107 0 R +/Resources 4105 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4074 0 R +/Annots [ 4110 0 R 4111 0 R 4113 0 R 4115 0 R 4116 0 R 4117 0 R 4119 0 R 4120 0 R 4122 0 R ] +>> endobj +4110 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 638.7618 250.6249 659.9632] +/Subtype/Link/A<> +>> endobj +4111 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 611.4648 193.9489 620.3114] +/Subtype /Link +/A << /S /GoTo /D (a00180) >> +>> endobj +4113 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 535.9072 190.8904 545.8349] +/Subtype /Link +/A << /S /GoTo /D (a00086) >> +>> endobj +4115 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 479.055 271.1301 488.9827] +/Subtype /Link +/A << /S /GoTo /D (a00162_g26440a35353cb457747a4cea372c62e9) >> +>> endobj +4116 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 466.1036 280.5446 476.0313] +/Subtype /Link +/A << /S /GoTo /D (a00162_g30fe27cba3c14ae7f9a7f118144af43a) >> +>> endobj +4117 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 452.1759 213.038 463.0799] +/Subtype /Link +/A << /S /GoTo /D (a00162_ge28f6cb60e86088d8886d0f804b4f37c) >> +>> endobj +4119 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.2787 395.3237 198.6315 406.2277] +/Subtype /Link +/A << /S /GoTo /D (a00086) >> +>> endobj +4120 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.1296 395.3237 276.389 406.2277] +/Subtype /Link +/A << /S /GoTo /D (a00162_g4647b76d0ef50a5305505041f5775a37) >> +>> endobj +4122 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 338.4716 196.7787 349.3755] +/Subtype /Link +/A << /S /GoTo /D (a00162_g52c3c5ab1b1aa0659b5e465f7fbcc409) >> +>> endobj +4108 0 obj << +/D [4106 0 R /XYZ 90 757.9346 null] +>> endobj +1073 0 obj << +/D [4106 0 R /XYZ 90 739.9346 null] +>> endobj +306 0 obj << +/D [4106 0 R /XYZ 90 739.9346 null] +>> endobj +4109 0 obj << +/D [4106 0 R /XYZ 90 716.7484 null] +>> endobj +4112 0 obj << +/D [4106 0 R /XYZ 90 553.8809 null] +>> endobj +4114 0 obj << +/D [4106 0 R /XYZ 90 497.0287 null] +>> endobj +4118 0 obj << +/D [4106 0 R /XYZ 90 411.9902 null] +>> endobj +4121 0 obj << +/D [4106 0 R /XYZ 90 357.4215 null] +>> endobj +4105 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4126 0 obj << +/Length 2234 +/Filter /FlateDecode +>> +stream +xÚµZÛ’Û6}Ÿ¯P%/Òà ¸_\[©u2r2ŽíÙQv’”K–h*ºLtIìýúmˆdƒU±k†’ûôéAlDáeˆR›+:ú_ÿpŪŸ¯á÷ëðÝìê›ÜqšëÑìý9‚fDqÆG³å/c¦éäš;.Ìøtû/8TtÌ-^¬ÖEyt³[œ6Åö8?®vÛÉo³—WÓYM[©RB3OúÇÕ/¿ÑÑÔ½¼¢D8«FÁJ˜s|´¹’\„뫇«×qÊÎ't N1Ñ=:& |ÃÃð8ŒÖ”£³„±É5£”ŽçOO‡oþ*Þ-Ö+Çåˆ,Úc½/Þû ³ãb»(üXKFœRgH²çàöBBÍMqœC¤e•¶â°Ø¯žBÒ ˆ¼ðq¼tWƹÝ<­‹K’ÏvïËÿÇÇJܳYåR%¿m†U„2kFZ€.-;30×(-ë¥")p‹9vù|Ô§ããnÿ¬ÍÌ('Fp†R× ”;N £†&Të̽œoª¼ž¶¿OëC™WÆ¢“5'R(¨¥óYÿHtC¬3º©³üõ÷Q8ú)ÒNH5ëXs;®gŸƒæ.A.H%‹Ý¦-†cš´”hŒ;‰å|ÛQx×̆€ú–‰zSüJ)ß®.å·ªþûï×E’He‰ÐÜŽ4£ª¤š“üOûæ>ö>à¯ã:ÌOâzuqǶ“H%4ä¢)¤Å€ÊЧÑ<=©ò¨yd!$3DsYæñëÕv±>-¡c5Ì_VOäñ+ºïø(z€ëÕ»Ûô’Að}qØ­ÿÌÉH[I bœm´R+Ч¦’p8îWÛä±#’„æà4¿íšWarp`¼‰IHÂL£*‹CÇeGjE E.†1 k–Ñ0SXy‰ã å\¥s›ŸðaNAkTŽÊÆQ­›¼_/«‘&äRà k‘÷÷YÀçd$q½ŒÿN¿ûþÕíôÍìíìöõôîçYÒm +ŠÞ +‡ç¢FeDp¥‰2²• ¸–vÙ­àâ¡í·;`vXÞnŒ1²ç­íŽyØÝ b7.#‰Û´ûa6q.ð0ŸgÓæÇŸ^ݾ™¶• +ʈtšáiªQ}‚ +â¬6M}u ±‚±þ:ˆXX¾0ƨpÞºbÞuÐ R¸Œ$.Z?NŸßLï’Y–‡Lr‰§¦Fe4qLj¢)‰uYÏ5,²¤ì·>`ÖXÞzŒ1²ç­­yXß b=.#‰‹Z3‘4|*h¶DJšIRʨã†Â½]Kï*3…‚uBoD¬,_cT8o]1ï€"h)\F-‚ï_Ý=LÓÛIŒÒOLÊ(âpçÄe[‘èr®%”#ÿåwÌ÷ +•·¡‹\GIkÓ#ÒžÇÌC,G5´£z ~'áÅ«ç¾Åxûæ.½ºss±Shçç‚aU3]va-,ᶤÏ߀\ò£Œ‹3¼ÁãoÞä&ù—32’¸‰Ïw?%.3M4“ÏDÊHà ®÷T©¦„® ¹0 +V¦ÿÖ-`VXÞjŒ1²ç­­ŽyXÝ b5.#‰›XýúÎoÕýgz“8.,‘*Äq\F7q|zïîîSÇ¡RiÉÞÎ7-CaùË8ž®•ÑÁ9‡E2s-›†ö Ôˆå\ì™õL€õöL”œ/Ü/”«…ù,ýÂ, –çöz*Û-Q8¤YpÒÐ+1éßo•†²‚klGmöÉãîpìîA7°4Õ \Ô",ILË›-‹¸G1fX‹Äh¤EjXo‹Ôyù² ´ TXûyÄ¿À•߯aù‰b=‚óÖM󞶇Շmxîð¸Û»nƒŒ5¶%£¿!>'(‰Ûl‰§-~ÏDå2@~¿ãF¥h%dp? 3Ü ì‡õC€õöÃ9)ç£íió®Øé¾à’p&?O[À7&÷,¡†åÛ" +ˆµÎ[·EÌ* á†Û4ǘjq÷÷BÀçT$q›½°Ú®Ò¾tÌÏú.“‡€Ê)pÒ_ZyÚ N!í°^¸`‘N¨@ç;wÿ†ä|½ú_Ñ*ò:=åÇÍnyZ¦Æ¤ëiÖ»÷N! L+ý·^¦>—¸…S˜àñû½š8#ìù}XÊ2ÿÞtâ÷C±-öóc˜€Ã‹ ¯ÃÁK?žSõñê?}ÆÅ3^½5Î)ÕåÑû Wã]5'¤¯—¿û^.ÿøéC‘¼Vîß÷îÈÒÿD0 çendstream +endobj +4125 0 obj << +/Type /Page +/Contents 4126 0 R +/Resources 4124 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4074 0 R +/Annots [ 4129 0 R 4130 0 R 4132 0 R 4133 0 R 4134 0 R 4135 0 R 4136 0 R 4137 0 R 4138 0 R 4139 0 R 4140 0 R 4141 0 R 4142 0 R 4143 0 R 4145 0 R 4146 0 R 4147 0 R 4148 0 R 4149 0 R ] +>> endobj +4129 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7782 274.5352 657.9796] +/Subtype/Link/A<> +>> endobj +4130 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 609.5548 205.0073 618.4014] +/Subtype /Link +/A << /S /GoTo /D (a00181) >> +>> endobj +4132 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 463.5277 255.0802 473.4554] +/Subtype /Link +/A << /S /GoTo /D (a00164_g31be289fd8ec3fe09b0088165d13976d) >> +>> endobj +4133 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 450.591 302.4923 460.5187] +/Subtype /Link +/A << /S /GoTo /D (a00164_g8714af98a550f10dc814db92b08d1b0d) >> +>> endobj +4134 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 437.6543 290.1386 447.582] +/Subtype /Link +/A << /S /GoTo /D (a00164_gc4357cec23abca29d2bb885803625a6a) >> +>> endobj +4135 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 424.7176 269.4366 434.6453] +/Subtype /Link +/A << /S /GoTo /D (a00164_g4d457c50e6f2cef57167c3804ce8bf7c) >> +>> endobj +4136 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 411.7809 275.7527 421.7086] +/Subtype /Link +/A << /S /GoTo /D (a00164_g863c94b0ed4a76997e53a3ccd5d0b6c3) >> +>> endobj +4137 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 398.8442 230.8912 408.7719] +/Subtype /Link +/A << /S /GoTo /D (a00164_g40fb1fb2d990ce04ae9bbee275627c03) >> +>> endobj +4138 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 385.9075 217.6111 395.8352] +/Subtype /Link +/A << /S /GoTo /D (a00164_gda99954e0f6905091885934e86c278cc) >> +>> endobj +4139 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 372.9708 239.2498 382.8985] +/Subtype /Link +/A << /S /GoTo /D (a00164_gd895686859ae7d178d31be04eb0a1a97) >> +>> endobj +4140 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 360.0341 236.0418 369.9618] +/Subtype /Link +/A << /S /GoTo /D (a00164_g38af81a4c9884ce89803fc3e52383112) >> +>> endobj +4141 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 347.0974 176.5052 357.0251] +/Subtype /Link +/A << /S /GoTo /D (a00164_g3212e70c55244608ac16316888c354f0) >> +>> endobj +4142 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 334.1607 176.4952 344.0884] +/Subtype /Link +/A << /S /GoTo /D (a00164_g6cda47c85ce1b58b501b44ac9cccc50e) >> +>> endobj +4143 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 320.2477 190.8811 331.1517] +/Subtype /Link +/A << /S /GoTo /D (a00164_g71e1b022f7b7fa3a154f19372b239935) >> +>> endobj +4145 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 263.4235 226.5766 274.3275] +/Subtype /Link +/A << /S /GoTo /D (a00164_g4433d3af16ea083a81576d0f18ba57c9) >> +>> endobj +4146 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 224.9723 221.0375 235.5026] +/Subtype /Link +/A << /S /GoTo /D (a00164_g41e616d3fcc17e0aabfe8ab45ef0d30f) >> +>> endobj +4147 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 186.1475 224.913 196.6778] +/Subtype /Link +/A << /S /GoTo /D (a00164_g0e0ea5f24b77f124ba33bcbc7ede5bfb) >> +>> endobj +4148 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.7915 146.949 236.5493 157.853] +/Subtype /Link +/A << /S /GoTo /D (a00164_g2a939aa4fcffabbce1dc1f784a7e0ad3) >> +>> endobj +4149 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 108.4978 192.9132 119.0281] +/Subtype /Link +/A << /S /GoTo /D (a00164_g3caacabb2fe1c71921e1a471719ccbd2) >> +>> endobj +4127 0 obj << +/D [4125 0 R /XYZ 90 757.9346 null] +>> endobj +1074 0 obj << +/D [4125 0 R /XYZ 90 739.9346 null] +>> endobj +310 0 obj << +/D [4125 0 R /XYZ 90 739.9346 null] +>> endobj +4128 0 obj << +/D [4125 0 R /XYZ 90 716.7484 null] +>> endobj +4131 0 obj << +/D [4125 0 R /XYZ 90 481.4867 null] +>> endobj +4144 0 obj << +/D [4125 0 R /XYZ 90 282.3587 null] +>> endobj +4124 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4153 0 obj << +/Length 834 +/Filter /FlateDecode +>> +stream +xÚ­VMOÛ@½ûWø˜HÍ2;ëýâØh‘ª¶Ô7ŠPHLˆlêhÿ}ÇÞµãb#å±÷yæíÛ™Ùá!ЇB-5³"Ráâ>€pE¯Ïî—g´>kÞÇÁÑ)ÚÐ2«P…ñméAq&‘c//'†q>¡„Éüáa{ôœÜ,6ë$Ýí-¶pë§ëM⬋ä6ɧÜL’tQ¼â(`Ÿ^ÅçÁI\Óñl¥P¼ ó;¸¼‚pI¬Ï`Â>Ó0n-†÷A„¢zØ?‚ïµ·P~ðÒ¦#ÌÎP»m6@=0׌+¤dVòè°Š„†Š¢¡"Å"a¢°†ZþD”] 8ÐW(EØtØgU¡ÆâòˆYPª÷iŠ0ÉÖË^lAhÎe'v±”¯<æ¢É¢Â±èù-XÔ s½ØdÛ¤GÆZÆGT(!#Á({IƒŽô ¡’lÞ?wîV#9âÁ³&ºd"!4ÄDE¥ hiÕš½Ó‚ɇróeìî¼±xÌó©ÐT/»Í_÷*{HRg}Šão–¥i²Ø­³”â¯,§‚ÕúMr\iª~¥ÄHŽ×°Ño:Èñ‘¸UŽ·â>¦Ûõ*M–^©»yÞc¡0]‡³½Âñéùmgû*Ùu© f(1õ¨@#áQp&ŒÑc |¯D8:¥3n|PœºÐÄA8PË+Ilè+‡¹Ë¶»w½= "GõZ9küØ~z~Ëãåêº'£ÁèhXÇ5XP>CóPЏYN[oåTGΘR_!§Øcp“ u!ŠÎQ¼® 5Ñ]¨†¾Öíe>Ðf|›Ê<ÒýQf;c›äOtÏ{/¾òæÛ_θÍòÖgn×Î~Ü®ÓU§žÄθOvwÙòp‡“ÈP‰èm:œ°LФ3Òà> endobj +4155 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 714.241 200.0962 724.7714] +/Subtype /Link +/A << /S /GoTo /D (a00164_g1d34be506a61db90dd7829117efdf8cf) >> +>> endobj +4156 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.012 675.0131 229.8943 685.9171] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf9385ef9ecc74c7d53ff2f15e62bfde3) >> +>> endobj +4157 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.9163 675.0131 304.6036 685.9171] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4158 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 636.1588 208.3951 647.0628] +/Subtype /Link +/A << /S /GoTo /D (a00164_g9e6d2864f390a4ba1ac60dc65e2b9815) >> +>> endobj +4154 0 obj << +/D [4152 0 R /XYZ 90 757.9346 null] +>> endobj +4151 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4161 0 obj << +/Length 2081 +/Filter /FlateDecode +>> +stream +xÚ­Z[5~ϯÁK"×÷K…¥hYJiƒ@´J3³Ý¨ÙdÉ¥ÐÏñŒíx.±¨öa'3ŸÏw|ÎùìãIHáJ(d—Åên‚‹wpûÛ qçð|¾YL<£¦0ÈH*‹ÅMmA$(¡Å¢ümJ$Í©¡LMOÏ_Á¥ÀS‚psñl½©š«'»Õé®Ú—Çõn;ûcñbòthW‚IbIÿœüö.JðîÅ#f´(þ‚chq7á”ù›É›ÉOÁNó 049AØðìGp‡úéQ˜­jf§éŒñtyxðWõvµYÃ<ÎWè¶;××ÕMµŸ=­¶«Êε!!ÈQ“@-‡„ézDÍ“ê¸K¥ [uXí×÷>h`ˆE¹°vÀu-Mmç»jYq=ðwŒ©÷çfçnoÝï —*7‡nF´@˜hUHl\˜ÁxzÐôv¹²ÕýÞ½´p’öo.–Gw„<¸0¿%¹Ùϸ˜îî:o9B™º»Ò?¸­¶Ý!e8öÜ.ÅÛÊÃö3¦¦ÕªZ¨Jt1J lèÁt:J.H„!Ì„¸¸(Q#aC`,³(XvQŠ &¥ ¯_”Z¼ÙE©Í=bQÊxѳÛ^”V»í¶Z«²ß^Aí‘\0*ã4TH`a:I€5É$¥)ª ¢\°qšŠÑ MØ€¦$5%™×ܯ5ÿƒ¦,ö¬©[5·cMÙ¦ìƒFS1Ö‰«†ÕqÔÜI °Nbgˆ§?îÂk +¹ïÉ"i7‡jÿÁ¾l%dzQ˜T€0mwõI„ ==, 9]:T^–gs)U&Iƒ(#Ò¼&câ1’LºÐµÚäq}W•»SkϱݥSQ ´ ”H$8ï„~¬è´4N‹gpJŠ5 DFb%2ê•÷k%Âÿ D‹=+±ÆVÍíX‰vD£Dk㦃t:¬A‘á3¨¬g´¹pºªŸ6jµp›Ç!]Bn/«Ïn‹öÛ•O¡>K-ËùXV±Á„3¼^-Þ¬ÛÜ#4˜ñ¢g·sÜ»ÛmŠXÃ6Æu:•q‚Ú²0¢›‚‘:$vÿÒtd££J °ÑhróÿMkãæòo±-d× ¹¸Å ô¦JôIn@ûŽŽß6‰Ý6%7ŸF¸°*3jxN¸–nd0%Ü4onÌ›n‹{ŒpÓ^ôìvúÙÍî0¤[Øíñ5‰€Êø@!BÑNÆÊö:†ÉÈý3F§dëa²Õ­^>9Ùj×ËꨗÕbz3#Ó³ráF#ÝnguhguhgkÓî–Ӯš7Ú=C…ÓÜ ÚÕMÓ; Øó)³Éóe=ÚT3ùIôhWg®s¯í=*«ÆÈ\BŒiR¯Å˜4+Åñ%¦]èZmëp½]÷¿4†H“Ž€eè G«vr´?X!ˆðá/…0˜'²yôŸVSŒ†!$> +›B"£˜®ß*Qh{<ïŠõüÛj[í—a3òÝþâÅŒˆéÉ}°?³©ÿ㇔=¤î÷CcévÞùº]°ÿC#¿Ó=Ùýýñ]Õû‘ýåÏ@”þ É9¿endstream +endobj +4160 0 obj << +/Type /Page +/Contents 4161 0 R +/Resources 4159 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4074 0 R +/Annots [ 4164 0 R 4165 0 R 4167 0 R 4169 0 R 4170 0 R 4172 0 R 4173 0 R 4175 0 R 4176 0 R 4177 0 R 4178 0 R 4179 0 R 4180 0 R 4181 0 R ] +>> endobj +4164 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 638.5601 274.5352 659.7615] +/Subtype/Link/A<> +>> endobj +4165 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 611.1369 205.5653 619.9836] +/Subtype /Link +/A << /S /GoTo /D (a00182) >> +>> endobj +4167 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 517.644 202.5067 527.5717] +/Subtype /Link +/A << /S /GoTo /D (a00097) >> +>> endobj +4169 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 460.4808 309.3265 470.4085] +/Subtype /Link +/A << /S /GoTo /D (a00164_g5a5bfd7e9060903893481db90645187b) >> +>> endobj +4170 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 446.4691 213.038 457.373] +/Subtype /Link +/A << /S /GoTo /D (a00164_ge28f6cb60e86088d8886d0f804b4f37c) >> +>> endobj +4172 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.2787 389.3059 210.2479 400.2098] +/Subtype /Link +/A << /S /GoTo /D (a00097) >> +>> endobj +4173 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [210.746 389.3059 288.0054 400.2098] +/Subtype /Link +/A << /S /GoTo /D (a00164_gdc5aec3587b2c55b714a6c2f37b56cba) >> +>> endobj +4175 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 332.5162 226.0986 343.0466] +/Subtype /Link +/A << /S /GoTo /D (a00164_gc4b119801e50cc1824498a1cdf9adc37) >> +>> endobj +4176 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.1106 332.5162 300.7979 343.0466] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4177 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 293.4938 220.0116 304.0242] +/Subtype /Link +/A << /S /GoTo /D (a00164_g6b942c1ef22f8cd1a726ef3364c9fbea) >> +>> endobj +4178 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 243.5125 215.05 254.0429] +/Subtype /Link +/A << /S /GoTo /D (a00164_g23705efb9077187881f094fc9be13bde) >> +>> endobj +4179 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 193.5312 209.501 204.0615] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf11d9915ec12a8cdd9fdcbb5e8fcd5c7) >> +>> endobj +4180 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 143.5499 205.0776 154.0802] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf8f12c820cc08da32aa62898bfc02db3) >> +>> endobj +4181 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 93.5686 192.9132 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00164_g3caacabb2fe1c71921e1a471719ccbd2) >> +>> endobj +4162 0 obj << +/D [4160 0 R /XYZ 90 757.9346 null] +>> endobj +1075 0 obj << +/D [4160 0 R /XYZ 90 739.9346 null] +>> endobj +314 0 obj << +/D [4160 0 R /XYZ 90 739.9346 null] +>> endobj +4163 0 obj << +/D [4160 0 R /XYZ 90 716.7106 null] +>> endobj +4166 0 obj << +/D [4160 0 R /XYZ 90 535.7017 null] +>> endobj +4168 0 obj << +/D [4160 0 R /XYZ 90 478.5385 null] +>> endobj +4171 0 obj << +/D [4160 0 R /XYZ 90 406.0564 null] +>> endobj +4174 0 obj << +/D [4160 0 R /XYZ 90 351.1766 null] +>> endobj +4159 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4185 0 obj << +/Length 1318 +/Filter /FlateDecode +>> +stream +xÚµYMoã6½ûWè Ãá·öØ6I h»õm»X8¶bµ¥Ô–w›þúŽ,Š¡$‹T± r%>Í ßðF4$ÿ Ii¢¥&)*Yì&4YáíÛ ØéKœ¿ô?Î&W7,MR’*¦’ÙÓÉ‚"°d¶üta°é%“ôbþü|¸ú–=.¶›,/_Gd]Ïßl¶Y=ú˜=eû)˜‹,_T·p ŠO?Ïî'×3ŽVrU0O>}¦É£¾ŸPÂS#“oxA ¤)KvÁxs±ü1ùÝÙ©'Nœ[´ ’n’K¦ëez ¨& ÒÄÍK’&W¢b p’êÔ$ ª¢ê.ß”›ùv󯥡\Û£ª¾ÜË#Rò‚ti¼k@ûÀ!ªI%Èá„SE¨/áÜK8à¬àF$V­åOÆd?8|ŠIžøÏhQ1¿ HJ•jû=æ‡Í*Ï–5S‹õ|ß‹BsB©éFQMíWó±Å’ÅÇâéÙ­âq©û²ÊÊn(ŒbªMâ£EÜ3„£;i ’6$\Ý€ð¨²Î5:©”× –U¤ØàS5f]Êzk0”¤ÀÔX:>¶žžÝSzA}éÑÈ)'ŠjæÑ¡"Žy5ë'¥òû\ìqé­=Õ¡SP¢ +9N'Űm†‚!«€Öã +ŽT«bøõ9Ëmu¶ÿ™Í~³ -ò<[”›ÂΔ…Eº¢TÙþ+–kkÅ*o~ø«<ûÖcõªëññ°ÉWZw{=³U.+×År°Â)Ü y“ +‡™#Œj©p­p¾Á@…‹øm*\Ëï×)£ÅfÙóÍ ¸È¶ïáºÖàcQôì¶ëÚb[²^0iJ  qÎ(¶ÈA‡z¬j AýHF˜âb¤~H"( ·é> ”ðÏxÈ£—ò°_—sßïÀ;›XÅU÷Ú +N0ìs…é7¼-|,ÌžÝöÆØmðõôòœõ;:I¤¡"L–CE¢¨Z?ª¡“£±ÅR"¤ùµâ£Cůš‡Çr¾É;ÕïáîáÚÞªø©ËßÓp‰ì–Å弴¡¬1óÝ`”&%"5úH1(\‘"Ú8XT0¾Á€`"~Á´ü~¿`ÚÁL$̞ݶ`ê¶/ŸïÎH†*€…ér¨H ?k$‡´“¦‘š‘ +ðóqšñÑÍ8Ø f> endobj +4187 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.012 702.9085 229.8943 713.8125] +/Subtype /Link +/A << /S /GoTo /D (a00164_gf9385ef9ecc74c7d53ff2f15e62bfde3) >> +>> endobj +4188 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [279.9163 702.9085 304.6036 713.8125] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4189 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 664.4278 200.0962 674.9582] +/Subtype /Link +/A << /S /GoTo /D (a00164_g1d34be506a61db90dd7829117efdf8cf) >> +>> endobj +4190 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 625.1999 208.3951 636.1039] +/Subtype /Link +/A << /S /GoTo /D (a00164_g9e6d2864f390a4ba1ac60dc65e2b9815) >> +>> endobj +4191 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 612.2485 226.5766 623.1524] +/Subtype /Link +/A << /S /GoTo /D (a00164_g4433d3af16ea083a81576d0f18ba57c9) >> +>> endobj +4192 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 573.7678 221.0375 584.2981] +/Subtype /Link +/A << /S /GoTo /D (a00164_g41e616d3fcc17e0aabfe8ab45ef0d30f) >> +>> endobj +4193 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0186 534.9135 224.913 545.4438] +/Subtype /Link +/A << /S /GoTo /D (a00164_g0e0ea5f24b77f124ba33bcbc7ede5bfb) >> +>> endobj +4194 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.7915 495.6856 236.5493 506.5895] +/Subtype /Link +/A << /S /GoTo /D (a00164_g2a939aa4fcffabbce1dc1f784a7e0ad3) >> +>> endobj +4186 0 obj << +/D [4184 0 R /XYZ 90 757.9346 null] +>> endobj +4183 0 obj << +/Font << /F29 499 0 R /F50 1172 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4198 0 obj << +/Length 923 +/Filter /FlateDecode +>> +stream +xÚµVßoÛ6~×_!t/öƒ™;þ Å6d)–aÀÚØC[ Š,ÛBlÙ“äuýïw”DG–ØxÃ0ˆ)é»ï¾;‡1ÐÆâD%Ì +©ãlA¼¡×o"ì?/èûbøaÝÜs5×ñrÝ2hdŠ#—«3Ôr¾à–‹dvúéWZ*˜!ƒnq_ìònuwÈNû¼lÒ¦8”óOˇèÇåÙm¯J ÎéчO¯HÝCLX£âÏô ­åñ>’\ø‡]ô>z{æé>´¡àŠpt(½á>»§ò©ÝÎ]Ýeq`­9“BQeµVßN¤& 36Ñ#©Ýç§Ø¯~ÈöÙz({Âì¤$û»ºÈjVçc-\Z¦¹Ñ/§íŒšú¿|Êæü¿à•§ätŽ©ò.ÿÀË¢­Ú¾àº_÷~7QÊ0A,±F` +D¯Þ}ª6=æÝpû=~14lÿ„שÜqW¨FBÆiô¨+î§lÎ=ëÓ¨/Òˆžʧ”-ô›¢Ìv§uMáÕ©8²í+gî~!à±>dOh³MÆ¿€¶yûG":øº¾F>=wJ°Äš‹s7ÊjIµÖêfUØ6@$‘)°Ç½&Ý€ÿŸ¸ª(7autÈ9$#u÷ɳTÁ µY!µÛ®ÏߟÊÌ­:pŸJŒøú-?„:¦¦¦gä3sø‘s5íÔî£öø¢Ç3êš_ºŠ-h}é·­¡ß©äÖ}ÄÆ0.ÁŽD|½sxü59Þ 9“¾Á3‰•/ç⌺âœsj[ Õä倂l›V}%É ªá+‰z¬´jʯA_·eº§­04!C™#¢C­ôšÕÚ"4d‚‚gM³—0N©àdèÆ2/Å)~“—y•6~.òË/~ñàfSÿ€¼ÿ…[.ny?”rÝ­Ös®f‡~0šN¯_üìú×—M>):7N²ô7<‰”!endstream +endobj +4197 0 obj << +/Type /Page +/Contents 4198 0 R +/Resources 4196 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4195 0 R +/Annots [ 4201 0 R 4202 0 R 4204 0 R ] +>> endobj +4201 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +4202 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 607.3502 202.2478 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00183) >> +>> endobj +4204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.2447 427.1275 226.8757 438.0314] +/Subtype /Link +/A << /S /GoTo /D (a00165_ge6f849e94cf6e214be8ffa9a548ecfcd) >> +>> endobj +4199 0 obj << +/D [4197 0 R /XYZ 90 757.9346 null] +>> endobj +1076 0 obj << +/D [4197 0 R /XYZ 90 739.9346 null] +>> endobj +318 0 obj << +/D [4197 0 R /XYZ 90 739.9346 null] +>> endobj +4200 0 obj << +/D [4197 0 R /XYZ 90 716.7484 null] +>> endobj +4203 0 obj << +/D [4197 0 R /XYZ 90 446.0774 null] +>> endobj +4196 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4208 0 obj << +/Length 1107 +/Filter /FlateDecode +>> +stream +xÚ¥W]oÛ6}÷¯Ú˜™Ëo2†uõ’5k®5°‡¶Y‰8vfÉëúï{)‘²,ÊÖ€¢@*J‡÷œûi’&€ÿhb!ÑRË…J²§$øúzDýç)~Ÿ¶¿ÍGWÌ&–XÅT2¿¯,(J$£,™/> ¡b2eÆéósqñ5¿+òÝ„Âø_÷'ß],Ëòy1ÍVdYã®Vë¼~úß;¬ç›Ì½«Ù˜*9ù2¿ý>odyÕ’+êDý3úô’ª¿áÖÈä+.€PkYò4Œ‡ÅzôqôWc§þPmès^RÞï=ß°à>Ãhè¶÷àÇÝGŸk2J¬”&Ãq1s #ÔÓÍò2EK‹ÚÔ,/²Ýê¹\m7ÞoåÌÙq.ØÚÎ߃Òîê(¥J”êוúyµ)óݽs$ͼæež.ô3[礛-# P£Å  ¼7Ö4m£âj3–p´%€²Òÿj‚äûr¹Ý]v¹)0¢9£çÉT{;n4є˃µŠ~‘>ù¨ï7Uš×EuJ[»#‚K¬¸j×Ï‘T­‰±Zu¤ÖŸ“ðôgKvØÑ#[µeG–€eÿZ¬²‚yW –(fÔù°5¨˜ÿÈñØšãÿ¥§0§T“ ûëÁ!g¹«¬Íªªf_ˆíŠ‹") áh%QˆîÕ»O»ùÐNÀOÛzÒÙuêÚ Ý #PbÀÊŽnj€>¶æè‰£: +# &©Æx +QA_®6Ùz¿ÀÎU80^<Ûì‘,_8n$ÔPÞ­|ôО¡Äq ?gi™ÖÉùXîöY¹¯'ZÑ3Ã%5D'yÚ€¾nTØPFì8þÏŒÉx +¸©‰­w–±A ñâÔµ Ô1oQy1s‹?SÜt˜O—bÀiˆì6¥x‹¥x›¥ëu¤Å*ÜcÅ@ªGÁQÞ1A¨dí.íÍ´p' ìd¦Û€3™n`ƒ™>ËxÈôoÈôïË…÷4"Šh¦i‡üt²~HFd×Éøc>?»}}ýæöõ«·o£ÑÃ]¦"-ÝÑP +bkU@Â&}Êò'…r70ö«ûý&sA4Î’&ÏOS ŽÆbO²jð´®$JH JT¢ +žŒ@[s0Ú©„‘:VV¯y¶NwîÄ“º—ä¤V.‰ZüO­-ô‰ÞÁi.”ä•—Ô×;\¢­<Ý;mÀ™Þi`ƒ½s–ñÐ;¼¡wŽx› Õ$¡+ÂÂØŽˆÓ=ðCr"»Gr¢öa’mÅùX4¨rÆðà vr€í“-±ö꣢8Ú€¥‚Ç\ð@à=‡%Œ¯¡á8éú°¯ÕÜý„â=A÷ÞïÍáýJýÐ-ª*Bƒ[(gízWx+Â_(Iò"œÖë|“ïÒ2ÜUB'¾ 7®÷~A™ÿ.¿dP¯€òÝ> endobj +4211 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +4212 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 607.3502 202.8057 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00184) >> +>> endobj +4214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 515.2493 197.5356 526.1532] +/Subtype /Link +/A << /S /GoTo /D (a00079) >> +>> endobj +4216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 458.7707 232.9533 469.3011] +/Subtype /Link +/A << /S /GoTo /D (a00165_g1dbc635a2924806f42d7e3273a6a69b5) >> +>> endobj +4218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.2447 375.6421 226.8757 386.546] +/Subtype /Link +/A << /S /GoTo /D (a00165_ge6f849e94cf6e214be8ffa9a548ecfcd) >> +>> endobj +4209 0 obj << +/D [4207 0 R /XYZ 90 757.9346 null] +>> endobj +1077 0 obj << +/D [4207 0 R /XYZ 90 739.9346 null] +>> endobj +322 0 obj << +/D [4207 0 R /XYZ 90 739.9346 null] +>> endobj +4210 0 obj << +/D [4207 0 R /XYZ 90 716.7484 null] +>> endobj +4213 0 obj << +/D [4207 0 R /XYZ 90 534.1992 null] +>> endobj +4215 0 obj << +/D [4207 0 R /XYZ 90 477.3471 null] +>> endobj +4217 0 obj << +/D [4207 0 R /XYZ 90 394.592 null] +>> endobj +4206 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4222 0 obj << +/Length 1627 +/Filter /FlateDecode +>> +stream +xÚ¥™YÛ6…ßý+„äÅ~0ÃEÜ‚"hŠ,˜mÒÄA’ ÐØš!ë%3é¯ï¥$Ê”H“*ŠÙ>ºçè~µdþ‘LãLr‰4ËE¶¼àì¾~=!íÏsø}î +~[Lž¼¢:ÓH *²ÅU]AÄ)¡ÙbõyJ„˜Í©¦LNï`“ã)A¸ÙxU­ËfëÅÝòx[nÅ¡ºÛ̾.ÞL^.:Û6g‚Ó¿'Ÿ¿âléÞL0bZñì>`D´¦Ùí$§Ì~XO>Lþêê4?Ô;„Ž>:’#ø†Úãp´²9:…ŸÍ ÆxZl·û'÷åå¾ÜÍžþ0ÿ•»'7‡Ãv…–Ãã}_^š–›eiŽ·1"Hs^A£U'#DZ«å¡€J«¶uå~¹«¶¶qPˆ9Íĺlö„¨“CÌçS4l»â%3‘C7sV4wUþ°PaÌ §ˆ`ªê0Ïgâx¸¹Û=zƒIFIܼSÜÝ&,‘$ŒŸªÕö«â¶máq󽿵Þ7-$ÄÙ[P”3C§Þë/ª”Hi¨ÙÚüü=³[¿;±íØÂíU6 +ˆýë¾ZîѾf¡¹F‚*o[§òý{îW3þÏ£lN¸-IáD…ñ`”/Ê/ÓMUͺÑUû×|¿öÒ®ƒ*™ qÛôæ§Ýu«yïâ·ú¹»C¿Wפ³gæ0ŒhÉõ0ÄpäYUÊÚ«f¬QÛBö\ÛŠDB+ó¼V>®6Ëõq³†€ÿѱڢ›Gfosb7B67”æg¥ó«ýQ/¯«ñ9æûîÚ\' ü33$µêyƒ®ÁyÃhkº TÊáL¢Ø +Ÿ…f\˜M4  sËÌiÔÄå>pUÊóÚž½Vº‚д$`fQù©Ž1üB)÷§Cs-€9(êØ©R¾pAÓXˆ¾ïãU{¤žy.¤’ ÌÏŸ–VŸŠáÕ51>,fšÁ¥2]¼üöiF(ž>¿X\üùÚ›í(N˜Ä»Ò©q íHH¬úqp;“pÑåYìŽ †ÝÊÒØcŽö¸o‡Ýõ½g>{<†W7€ýíÇÅ» 8iÉDûÑ©A(… ;‡I „„€Ã-æšîbÀ­, <æèûvÀ]ßÀ{æc€ÇcxuMŒ‹o¿mÖþÍG+h€U¥œáJk=h~ÀE2\ àFQŸ‡ìb­, 9æè@Žûv]ß{æc Çcxu-äý¶Xú1à@©\'z`U)sM“œ÷Íñ ÍÞðüS‚Ÿåì +"œ;Y’sÔñÄ9ák9÷|Óœûæ#8'bxu-çËbsíc–ˆPž'Z`U)o‚ˆ7`ÍÙ î¼)ŽP>ýƒÜªÒŒ#vâ¨iGØ1ØuÃ7šaXÕÒÝ–»e¹9x)4\:¥Tñã·¢„·Öðˆ¤xÏèò]Itôü[*WãkeiÀ1G‡pÜ·CìúŽ`Ü39ëë`®îV>e†(¡y¢ V•r7Oº˜ ÜtÍá¡ G±\A ´•¥AÇÐqß´ë;tÏ| èx ¯nwU^û›Ðt-Tª­(e­1"’ɾ5P¾ +Q†œŒGž¨\AŒ²•¥)ÇÊqߎ²ë;‚rÏ| åx ¯®¥¼¼[û¯Óë»* wUñXUÊÜÜ{)>è~`Å™—,­¼÷’åÕq³4o C/Y(ɵ:?Õ»‚ÈØèdɱu<„¯=ß3Чw•?ÃB74!|à}~hX}*…W·{õù­Øn—ÅzõËÞx¬*@$˜¢ƒöcŽm+`;tÿF¥@<—äü¼.½Ë’Y~µÑœ.ý LR…4endstream +endobj +4221 0 obj << +/Type /Page +/Contents 4222 0 R +/Resources 4220 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4195 0 R +/Annots [ 4225 0 R 4226 0 R 4228 0 R 4229 0 R 4230 0 R 4231 0 R 4232 0 R 4233 0 R 4234 0 R 4235 0 R 4236 0 R 4238 0 R 4239 0 R ] +>> endobj +4225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 638.7618 250.6249 659.9632] +/Subtype/Link/A<> +>> endobj +4226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 609.4075 186.7561 620.3114] +/Subtype /Link +/A << /S /GoTo /D (a00185) >> +>> endobj +4228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 447.7854 224.1764 457.713] +/Subtype /Link +/A << /S /GoTo /D (a00165_g7d7920c1e51cc4eef80206ebd6fee3f4) >> +>> endobj +4229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 434.8339 220.9585 444.7616] +/Subtype /Link +/A << /S /GoTo /D (a00165_g8a645f8831837320c4e0c704e871abcf) >> +>> endobj +4230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 421.8825 176.5052 431.8102] +/Subtype /Link +/A << /S /GoTo /D (a00165_g3212e70c55244608ac16316888c354f0) >> +>> endobj +4231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 407.9548 190.8811 418.8588] +/Subtype /Link +/A << /S /GoTo /D (a00165_g71e1b022f7b7fa3a154f19372b239935) >> +>> endobj +4232 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 395.0034 188.1217 405.9073] +/Subtype /Link +/A << /S /GoTo /D (a00165_ge3f8f7deae69854853b0c8ebb82c380d) >> +>> endobj +4233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 382.052 198.0741 392.9559] +/Subtype /Link +/A << /S /GoTo /D (a00165_g79f9a50c2cccb967d38a2eeb45d2fd75) >> +>> endobj +4234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 369.1005 194.2087 380.0045] +/Subtype /Link +/A << /S /GoTo /D (a00165_gf7dd2757d1e766f65b01ba7c91c660a0) >> +>> endobj +4235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 357.1253 188.6793 367.053] +/Subtype /Link +/A << /S /GoTo /D (a00165_g820fb27c50e7bb4ac6d9eae1b06630a5) >> +>> endobj +4236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 344.1739 190.8912 354.1016] +/Subtype /Link +/A << /S /GoTo /D (a00165_g14e276fa8e765f774f4162619f1c8fc1) >> +>> endobj +4238 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 286.3455 190.1438 297.2494] +/Subtype /Link +/A << /S /GoTo /D (a00165_g648ddfb2dde2cc55034e4e0ea41cb6d1) >> +>> endobj +4239 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 273.3941 174.6619 284.298] +/Subtype /Link +/A << /S /GoTo /D (a00165_gc364305cee969a0be43c071722b136e6) >> +>> endobj +4223 0 obj << +/D [4221 0 R /XYZ 90 757.9346 null] +>> endobj +1078 0 obj << +/D [4221 0 R /XYZ 90 739.9346 null] +>> endobj +326 0 obj << +/D [4221 0 R /XYZ 90 739.9346 null] +>> endobj +4224 0 obj << +/D [4221 0 R /XYZ 90 716.7484 null] +>> endobj +4227 0 obj << +/D [4221 0 R /XYZ 90 465.759 null] +>> endobj +4237 0 obj << +/D [4221 0 R /XYZ 90 305.2954 null] +>> endobj +4220 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4243 0 obj << +/Length 1440 +/Filter /FlateDecode +>> +stream +xÚ­XÛŽÛ6}÷Wé‹ Ô ‡w.Š  6 ²ÅmºoIPxmy-¬/[ÙÎ&ýú%Q–DYtÐÀÖåèœápx4"$Xšh©‰åB%ó͈&xùݪÛS¼?m^ß^¾e6±Ä*¦’»eÁ €H,¹[|j2e’Ž×ÙýËMº¹Ÿ:&óòÚÛl–GÒešOÀŒÓíÜ]ÒÆÀ”ž|¾»½¹«C¨"”\ àŸÑÇÏ4Y`¤7#J¸52yÆJÀZ–lF‚q²ý5ú³æ)oô Tï)‚W˜*ÑëæHÒï*ޝ$b¥,ˆ1ÉŽ—™1Šú:=ÌiQR]§ûyž=²Ý¶"â¹p<.\[òܦ›]þ­|ð~½›?–‡³5Ï +Šâ<ßÙ6Ý“nê$ŒN7„ZÊ{çAÓ&*,c ¥¹$%THYøÛå‡Õ.¿êjeDsÃâ5ªG½™ šhàòÄVÈ/f›*­Çíãè8]ïË´4žVŒ.±|Ч~ BÕš«U'Ôòöcâ~o„íŸè [5Ø]3 û×}6ß“}Ú… K3j8m5*Ôo GȳNlR­¦£kÊ·§ß B è¦á¼uòK¬)‰¢.³Î&zÀ:kXñ1Q~U]lœË|"äx·iá;˜Ý2¤¹Ð]±ã5¼;îóæZÁ##X£Öj)Q®AíËÿIÝ£bòÛ°»bw¬öž?Ä]…Óæ&æ®w×á»ëÖîÚÔ¯°@zšM)ð¨­;ØløXomË< ¿ðpU[`,2|ЉæÚ+ÛIûyÏÄ0.´º4 5>GÈm7aB‹á4Ô¨P¾Ón¢9Ze' xæÏ¥… ¼¹ÛaÑÐy‘>òA+f¿I­¹ÐŠè!+ö°rÛaö#ÌxÿTðäøK¶;î×ßgÎÖV”m+çÝÙã#Ùycþ,8v[ÊöOJ­_£"ú!Û°?£yiKíEþÌ…3óþŠ•Jªÿµ?\¸<68kna*×¶¿ý Ü:wãz—nÓk¬šh¿Ãuën\u«`Õ?½büŠÑòŒQZí•/' ë//OŽïÿ¨Ð¤ÞWõu½ûúí!Ýv3ê6¯}hüüAµ0^endstream +endobj +4242 0 obj << +/Type /Page +/Contents 4243 0 R +/Resources 4241 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4195 0 R +/Annots [ 4246 0 R 4247 0 R 4249 0 R 4250 0 R 4251 0 R 4252 0 R 4253 0 R 4254 0 R 4255 0 R 4256 0 R 4257 0 R ] +>> endobj +4246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +4247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 609.4075 190.781 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00187) >> +>> endobj +4249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 515.6229 179.0853 526.1532] +/Subtype /Link +/A << /S /GoTo /D (a00159_gd58a6c7e62ae59bf7a016ded12ca2910) >> +>> endobj +4250 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.5282 515.6229 265.4205 526.1532] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +4251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.8984 500.6286 338.7573 510.5338] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +4252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.3873 476.7686 192.6345 487.2989] +/Subtype /Link +/A << /S /GoTo /D (a00159_gfe5e93119035e14cc485760a176249ba) >> +>> endobj +4253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.0774 476.7686 278.9697 487.2989] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +4254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.8358 461.7743 391.6946 471.6795] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +4255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 437.5407 180.9085 448.4446] +/Subtype /Link +/A << /S /GoTo /D (a00159_gceb952d27de8125d5146ac0bee325b8f) >> +>> endobj +4256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.3513 437.5407 267.2437 448.4446] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +4257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [397.2067 422.92 431.0655 432.8252] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +4244 0 obj << +/D [4242 0 R /XYZ 90 757.9346 null] +>> endobj +1079 0 obj << +/D [4242 0 R /XYZ 90 739.9346 null] +>> endobj +330 0 obj << +/D [4242 0 R /XYZ 90 739.9346 null] +>> endobj +4245 0 obj << +/D [4242 0 R /XYZ 90 719.4886 null] +>> endobj +4248 0 obj << +/D [4242 0 R /XYZ 90 534.1992 null] +>> endobj +4241 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4261 0 obj << +/Length 1733 +/Filter /FlateDecode +>> +stream +xÚ­YÛŽÔ8}﯈ÄK·´m|¿ Õjˆ½À¼B=ݦ5}aûË~ý–“8íÄŽÕ¢y˜¤sR§\U>.ǤÀðG +ƒ %2ŒËb¹àâ3üübBšÇsx>÷O®'ŸSSd$•ÅõmeA$(¡Åõêý”H=›SC™šž_þ—O ÂõÅóõ¦¬¯®öËó¶Ü§õ~7ûxýjò캥m¼LKú×äýG\¬À»WŒ˜Ñ¢ø7ch±pÊÜÍfònògk§~P½œ ,>:ÂüBÝð(ŒVÕ£Óˆ¨Ùœ`Œ§›õÍÃm¹½™qžB¦×4ÐT*´ 2…”ö °U… |$?Õ3üHá–4×äÁƒ#¥_3¤¹Ãù÷©p°|¤½Hó¶5àóŽ(‚ù˜*H»ØÕAXZž E‹ÊøZKVBP¤1d¤N†B¯> U'–¯“£W'iÞ¶N|ÞuÒ!S'i7»®Nb- QTf†ïP9ÞÀš«Ýb[ºœ7€»ß·±"°/í ´Ü°ÐÐŽc‘üÔ๮ü¸ÐàŸä•°YÁÊè‹Ñz¹Zn‡ìõšmOÓ²l{»ÅÓ{4è'‡ÔFGúé¡ã+*‡žKcYyøü¼[ÚV4¶ 2 ».žè›|@b¦´°ìLI2^fJ†×Í”ïWãýzvN€&Dô¸SƒÏyØm;§5tÿálÝ„6™4 µ†žZÕ ¼UÇhóH±F‚r>6->ãGh7Ó›£®Ð¹rFs[ø–WWÏ`J]Ó¼­ºú¼Ë;(H³)lȺ¼Éf³Âç<ì¶rq{(ÃÍ¡‚W ¥™á;TŽ\SÄ1ì2ºaÖLb¿ç*96->ãGh7ÛnJD¹âé0´¨¾×nj¤˜&ý0ŒÐÌf»šX™=ÓQ¤·§Œ~9RRLíXÝ=ø–bâVï}?BŒø/ÍΚˆé×õþ|Üü7q6Q[¶ÝP «³Ãg¢ÚÍé3gÐmIOJËߢ2ü¡µ¤>S ÒA¥Ï”X1§1ÿ0"‘Bþ¯éJä¡÷`¤ûýBÚ®E×^´gÏŠÀUÄxQîÊZ“mw°öÆ]¼²%rnnmþãG”=¢ÍÉ;ÅX6U8£P„‡ú&<¢¿ùîèÿþþ¹ Žæí™¹s͋ҿÌ3î»endstream +endobj +4260 0 obj << +/Type /Page +/Contents 4261 0 R +/Resources 4259 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4195 0 R +/Annots [ 4264 0 R 4265 0 R 4267 0 R 4269 0 R 4270 0 R 4271 0 R 4273 0 R 4274 0 R 4275 0 R 4276 0 R 4277 0 R 4278 0 R 4279 0 R 4280 0 R 4281 0 R ] +>> endobj +4264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +4265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 609.4075 191.339 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00188) >> +>> endobj +4267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 551.4743 196.4299 561.402] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +4269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 494.0195 227.9818 504.5498] +/Subtype /Link +/A << /S /GoTo /D (a00159_ga680bc3f3a1a8a6aec20fe729d138cb8) >> +>> endobj +4270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 481.068 223.0005 491.5984] +/Subtype /Link +/A << /S /GoTo /D (a00159_g720ac440c7b24bdd07c53ba146e36fb2) >> +>> endobj +4271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 468.1166 178.1689 478.6469] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +4273 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 385.3616 179.0853 395.8919] +/Subtype /Link +/A << /S /GoTo /D (a00159_gd58a6c7e62ae59bf7a016ded12ca2910) >> +>> endobj +4274 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.5282 385.3616 265.4205 395.8919] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +4275 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [304.8984 370.3672 338.7573 380.2725] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +4276 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.3873 346.5073 192.6345 357.0376] +/Subtype /Link +/A << /S /GoTo /D (a00159_gfe5e93119035e14cc485760a176249ba) >> +>> endobj +4277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [221.0774 346.5073 278.9697 357.0376] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +4278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.8358 331.5129 391.6946 341.4182] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +4279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 307.2794 180.9085 318.1833] +/Subtype /Link +/A << /S /GoTo /D (a00159_gceb952d27de8125d5146ac0bee325b8f) >> +>> endobj +4280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.3513 307.2794 267.2437 318.1833] +/Subtype /Link +/A << /S /GoTo /D (a00081) >> +>> endobj +4281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [397.2067 292.6586 431.0655 302.5639] +/Subtype /Link +/A << /S /GoTo /D (a00159_gf31774d02a69fd3f1c2b282454438cba) >> +>> endobj +4262 0 obj << +/D [4260 0 R /XYZ 90 757.9346 null] +>> endobj +1080 0 obj << +/D [4260 0 R /XYZ 90 739.9346 null] +>> endobj +334 0 obj << +/D [4260 0 R /XYZ 90 739.9346 null] +>> endobj +4263 0 obj << +/D [4260 0 R /XYZ 90 719.4886 null] +>> endobj +4266 0 obj << +/D [4260 0 R /XYZ 90 569.448 null] +>> endobj +4268 0 obj << +/D [4260 0 R /XYZ 90 512.5958 null] +>> endobj +4272 0 obj << +/D [4260 0 R /XYZ 90 403.9379 null] +>> endobj +4259 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4285 0 obj << +/Length 1524 +/Filter /FlateDecode +>> +stream +xÚ¥XmoÛ6þî_!t@a3Ñ¢²lËK‘.-¶ÖÝ—¶TI¶…Ê’'ÉÍŠaÿ}¤HÊ´(KÁ†EŸ»ã=w<yPü!/„^@Ÿyñn½˜~1Czy)Ö—¶À/«ÙÅ-½„ 3oµn#ì­’÷s_,1…óC¶¿Èãe”$U}JólÕÂm–§jô&]§ÕñyZÄrʧ Í W/g7«Îm&% I+þœ½ÿ½D˜ûr 9õÅ ( ±·›ù˜˜—|övö{‡£Ú CÞRD†ÝE>3Øø‹…ûí.‚ð?ø+œTè„”¶èâ¸%8æGt€4þuÚD)QP×iWÙ¾ÉÊB+*GÚ*œ»Ý>OwiÑD­| P®Õ3/ã(Wø,š¬8´BµšúÕF£ÙØlµ7Ïî[7ÕK¤Ÿ_˜Î£üÖÏÔÄ:šC•ž*ÝÄ1è™S‰v:v‡âóÁ¹<¼6vY»>¡‚¨í®ïSƒð0`=SÕògÏŒ~µÌ6;Ìf¶Ù²4 fÿTgq ê´o öCÀ0gãÇÖI¹úOwѤþè½DÔ@bQ¤äj› ŸÏ³ßE"´Ô“kšïrªÇ÷vg­–4ïå”àóH­Ôû4Î?’ÛÖÐ&ˆœxqu¥fô#.w{‘Á•Öå2›…w2]»" y–›Äâ¾J,ñ´ ,–>ÂÚ_¹vÌ1¹!ÏK)ûØÔ٦ȊzÝ—YѤ•^|Ìš­©´–ò¢€¥µ^oÖ^ˤUBn_I‡Ý”âÔ+Ôzµª&‹yT©,¸ÒõGú +º ˆ«ï·nˆÎK!B8ß•Ò?9ÊŠuYíÚ }+ ž×©^j­”ƒöäå )ãCG'íqHÁõ(ã‚\œMæR·cioqsÉE–m›fyq!«ß¦8€²Ú\”Ež©0³–Óª¤.£zùGk°mvyßlqB"?Äujv/í:©SÉé .B$. ë4ŠŠÏºš·Ï$“Œú’%‡ƒ®aëR‡ñ„ØPÀ¾Š,N¦ŽË}jÅ] OÓµÇU®ÓVOv¼¿²â¨?w*¢Q!qFjJµƒÖž<¤°ÿÎ?õøA=^¿»¿¢# DŒœ§€%0F#6M1Æõv°õ>'ÊŸBq3\M77oß½ºqjô÷9?ƒNjB¹‹vJ‚`‹9d>?lK`,ØFl:Øc­`ëí‚më}B°O”?%Øãf8¸:ØooÒD}4qFjJ³ƒ6¾ÿ6W%…zøðÐ^VêU4r¢MúÎ~¹]*‚}D]9ž??Ùñ0ãÇ­èqå6xŽr²½GÄ?O9K`ŒrFlšrc-Êëí(gë}åN”?…rãf8¸šr7¯¯‡n˜>qFjJ³ƒæ§ ´Ý¬?ÿºO“t=Ô‚ŽbŸå‡-0ÂNl’£ü˜Ðkøq¢·Q~v?ŽÀy™%ú«ß·vS H@ÌW¿ q?ü}Pö¬=O(#?e·ƒ«Zڇƥ“øê)›ˆ’åCÒdðë +£ìýœ×’‹-ˆ`ûw Â@pNÿZ'L-QëÔ‹´H«¨éÿ¢õÊ ^Ê/΃~AX?á%&—ª7 !Ó_@ò“È|î~ÓÒ@ ~úªì)ÿúºI‹þYÊßiÖùü R,߈endstream +endobj +4284 0 obj << +/Type /Page +/Contents 4285 0 R +/Resources 4283 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4298 0 R +/Annots [ 4288 0 R 4289 0 R 4290 0 R 4292 0 R 4293 0 R 4294 0 R 4295 0 R 4297 0 R ] +>> endobj +4288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +4289 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [294.3312 566.4382 625.0908 576.7194] +/Subtype/Link/A<> +>> endobj +4290 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 532.6241 218.2873 541.4707] +/Subtype /Link +/A << /S /GoTo /D (a00190) >> +>> endobj +4292 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 474.0882 185.352 484.6185] +/Subtype /Link +/A << /S /GoTo /D (a00155_g2c1bb4fa6d7a6ff951a41c73fc721109) >> +>> endobj +4293 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 461.1368 205.845 471.6671] +/Subtype /Link +/A << /S /GoTo /D (a00155_g1ec8b8f4710dce1fa7fb87d3a31541ae) >> +>> endobj +4294 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 448.1853 183.1503 458.7157] +/Subtype /Link +/A << /S /GoTo /D (a00155_gd8eec328a4868d767f0c00c8d1c6cfc1) >> +>> endobj +4295 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 435.2339 185.91 445.7642] +/Subtype /Link +/A << /S /GoTo /D (a00155_gca51ceb2f5d855dfde55bcedf8d3b92d) >> +>> endobj +4297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.7556 378.0081 190.6918 388.9121] +/Subtype /Link +/A << /S /GoTo /D (a00155_g2bdc4b7b4038454a79f1b2a94a6d2a98) >> +>> endobj +4286 0 obj << +/D [4284 0 R /XYZ 90 757.9346 null] +>> endobj +1081 0 obj << +/D [4284 0 R /XYZ 90 739.9346 null] +>> endobj +338 0 obj << +/D [4284 0 R /XYZ 90 739.9346 null] +>> endobj +4287 0 obj << +/D [4284 0 R /XYZ 90 716.7484 null] +>> endobj +4291 0 obj << +/D [4284 0 R /XYZ 90 492.6645 null] +>> endobj +4296 0 obj << +/D [4284 0 R /XYZ 90 394.6746 null] +>> endobj +4283 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4302 0 obj << +/Length 1578 +/Filter /FlateDecode +>> +stream +xÚ¥X[oÛ6~÷¯0°‡ÙfxÕ%݆mIÖ¦[‹­ñ°‡¶0Y¶µØV¦ËÜ`Øß¡HÊ´(K†"•D~ßá9i’1†dâ±/|2îãÝ×ÐüzDt÷ úg¶ÁóÑÕO4‡(ô¨7ž¯j A Ï—'ÄÇÓ )ó'Õý¯ð*ð„ ¬^~J·‰z»Íâj—ì˨L³ýôóüíènÞÐj¯óˆ$ýkôñ3/Á»·#ŒXˆñ>0"aHÇ»§Ì|lG£ßÕQèšœ ¬{v„#h¡fzfë«Ù@3Œñ¤JŸ¯¶ñ¬8¤e¼A›ö?$«$Ÿ’`’ìãDNP! +Q#Cd%0 ŽÈˆhìÛ¤Œi©c•qž>›H³ q¤¿¡Â¹ß=o“cdk€l¥žÛ,޶ê5Îöeº¯j£B5=F…a4Õä>aáè6@–ø¨µ@ Lì±á³Î˜£™måª*Æ °F˜ QOí‡)ÐWå&˯ÛÜSä3JúÉ«v;¤ûÈ'LÑjúe´Ó ©öOS‚'ɶP !ÄíQÄ™åÕ£¾q\õ}„¾×rUu?ÍÛÏ–ÛfD‡Ûží¶ƒ,ˆÀíï‹4.P‘´}¡ËL™æIÅIµ%S"&_äI\¹ÞDêsUíc³>åŠlÖ9L«È L›$¯AÙ$ÝéR¿k?yƒñõT€gªó1[¾L=1AÓÃ"dœA›£×1@š®ÒŒ[IÙFqiš#ý懃£q£<9Qúz4%¯<ÿ¬vÏêm™æI\n_ÔWº7ÊYs²eš§UJf5϶¦ÚäU\V¹1*ªX—ÚH·¤«Óú”åêyØ@í,]IY f&>èsK~à9á•mYžguk#²I¢)Å“¿S9?i±Ê³z{HwfØ|€¯éÉ«l³<5퓳„>„KõÝ\wì¶-L,r·Ý²a£É0lÊòùúêêp8 x“FùZç Dm¿DY¾FÕÓ•.zÜ^û˜!ØóC]õ>a†õº·© ¬rXìʦX—u\®ŽÁ@›r·mÏ–sŽ8‡Zq:çV‘j¬:fËZ³e!bA¨ä{ ÁtŸwËT?eûÖ)™DˆAé:¢ÔÞÈ®|­m>Ø{ޱŸÙ:öWzg0Úµ63&à\rêH»v«zMÒ£®ƒ ¬~ƒÉ8‚ÍœÚLеò€ÊÓ\xöŒitíÇl©?âÔƒúëžä‘ +6ß^ÆÆjˆ‚!ö¼SÞ¯–z¦9÷O}Ò"?/ c?䆃+ÝX,~¹Y<ü1¿¿y³x³X8ò€ÜøÔó"ÁµÕ r +ÂÏgÈ a£b(CÆl8C`_†úy› Ù¼dè„ü’ õ»áàJ7 ?÷ïïçŽ×…"`¬†¨4U.¬O=¾Uüªk‰ +y¬'ÿÇþ¾ôk«áì÷ÐYÉï%mro‘^z›ù’Ì÷úÐFÕyÿp÷ðû»;·dsð è}cÔÏì`u¥½9ÕYÿèSœµºÎœ3äôü­€mÐ'c6¬ˆ>FKý¼&lÞ DqB~‰*úÝppµ.î:ÊEDp2c5Äì  –ØHîßß-¯ÚÂ0ú`~Jz^–AŸ>ŒÙ°>ú-}ôó6ú°y/ÐÇ ù%úèwÃÁÕú¸{Ûµ]„„0VCÌZ‡>þí<ö…†Á>õͧ>Ÿ¼<'ËdÕuðc>CþÜgõ÷ˆÄX j¤î(‘~R£›´T3TÑ©àÇûzo®ÊŠM–—n¡`zäÔ¡³²iÌû]sPÕ/„…KOÂaôǃi£«¯ÅºÏ~ø‰'üÿu[§:€!Àiß÷y(ôAP05Fa ¼rõ <}Uµ^ÃÎ<*Û—’ïÌË[y+SéBõ_SvMõ…3ÅØSo+ùÓÝÜ ¸7Ó/æ^úËË:qn¤åU±qÍŠÒt>endstream +endobj +4301 0 obj << +/Type /Page +/Contents 4302 0 R +/Resources 4300 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4298 0 R +/Annots [ 4305 0 R 4306 0 R 4307 0 R 4309 0 R 4310 0 R 4311 0 R 4312 0 R 4313 0 R 4315 0 R ] +>> endobj +4305 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +4306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [89.0037 554.483 445.4449 564.3808] +/Subtype/Link/A<> +>> endobj +4307 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 538.2933 203.3535 547.1399] +/Subtype /Link +/A << /S /GoTo /D (a00191) >> +>> endobj +4309 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 480.3601 235.723 490.2877] +/Subtype /Link +/A << /S /GoTo /D (a00155_g44311ecc30759ca38b4069182247bdae) >> +>> endobj +4310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 466.806 185.352 477.3363] +/Subtype /Link +/A << /S /GoTo /D (a00155_g2c1bb4fa6d7a6ff951a41c73fc721109) >> +>> endobj +4311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 453.8545 205.845 464.3849] +/Subtype /Link +/A << /S /GoTo /D (a00155_g1ec8b8f4710dce1fa7fb87d3a31541ae) >> +>> endobj +4312 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 440.9031 183.1503 451.4334] +/Subtype /Link +/A << /S /GoTo /D (a00155_gd8eec328a4868d767f0c00c8d1c6cfc1) >> +>> endobj +4313 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 427.9517 185.91 438.482] +/Subtype /Link +/A << /S /GoTo /D (a00155_gca51ceb2f5d855dfde55bcedf8d3b92d) >> +>> endobj +4315 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.1599 370.7259 224.0961 381.6298] +/Subtype /Link +/A << /S /GoTo /D (a00155_g3983e0c026396d5c4506779d770007ba) >> +>> endobj +4303 0 obj << +/D [4301 0 R /XYZ 90 757.9346 null] +>> endobj +1082 0 obj << +/D [4301 0 R /XYZ 90 739.9346 null] +>> endobj +342 0 obj << +/D [4301 0 R /XYZ 90 739.9346 null] +>> endobj +4304 0 obj << +/D [4301 0 R /XYZ 90 716.7484 null] +>> endobj +4308 0 obj << +/D [4301 0 R /XYZ 90 498.3337 null] +>> endobj +4314 0 obj << +/D [4301 0 R /XYZ 90 387.3924 null] +>> endobj +4300 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4319 0 obj << +/Length 637 +/Filter /FlateDecode +>> +stream +xÚ¥UKoÓ@¾ûW¬ÊÅ>x»3ë}E*­( AÉ­ô§±ê8%NÔöß³kï&nl +Ê!ûøæ›o;ÂìˆaD E Ï$ÉW#·öø"Úû´x?NÏÑCDI¦‹–AH¦óëXSdIЂŻòþ´Êé²Û—UÑ­®ŠE±I@ÇE»#ÈAAr3½Œ>L÷ν6Á%8׿¢ëFæVãeÄ(7Z»aŒA²Š2äaSEߣo{žî¢5 Q2jO0‰6fÕû× md%P#DKiëQ()xÒ³b;³LóŽê¬hòMy¿-×µ'â½ü;'Ôt<Ÿ×ù¬êìòu½-ëÝÌ6ô8»ZPZ™Y¿™/¥}Ô°´¡ŒqË%CÝ*y—¸Ø.כɱo‹¡Š#¼ì|ñÞÏ0Epq`kÝÏg+Ÿ¿]}—‹‹ªéòг–H3.l‡´V¯R•¢ÚXÎçR»ë;VŸz²ƒÅˆlÙ—=`vfVöÛ¦ÌÚÇZ03T¢–/§múøÍù3Òb)ˆ@‰ö=Ú~pȳâcX—m_¶‰.ý¿;¯êAhÊ- ‘€THæÕ»«Í­Ç\õËðiß`¤ü^§®}“ƒZrÊP©#ÇmPó;`s~©Ï_¿Ò©Œ l³¬E¾*ë¼ÚÍí¼öÉŸTyÚ<”Û|I—'c“þXqf]ò¿†d;éµ5ŽýG.íÐã:Ì@84ÊEQ›Ù6 ©Ð_Ââ2ïüÐÿ³ òIø@ c²[-ñzã¿¿z4õÀŸOþ%¯Ÿn‹ú8=n‚äç7ño‚¢endstream +endobj +4318 0 obj << +/Type /Page +/Contents 4319 0 R +/Resources 4317 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4298 0 R +/Annots [ 4322 0 R 4323 0 R ] +>> endobj +4322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 638.7618 250.6249 659.9632] +/Subtype/Link/A<> +>> endobj +4323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 611.4648 174.0239 620.3114] +/Subtype /Link +/A << /S /GoTo /D (a00192) >> +>> endobj +4320 0 obj << +/D [4318 0 R /XYZ 90 757.9346 null] +>> endobj +1083 0 obj << +/D [4318 0 R /XYZ 90 739.9346 null] +>> endobj +346 0 obj << +/D [4318 0 R /XYZ 90 739.9346 null] +>> endobj +4321 0 obj << +/D [4318 0 R /XYZ 90 716.7484 null] +>> endobj +4317 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4327 0 obj << +/Length 2258 +/Filter /FlateDecode +>> +stream +xÚ­Z]sÛ¸}ׯÐì¾H3ß™N§IìdœÝ&[[}ÚÝÉ(mkV–\‰jšþú^$Àv=~0%žsqsñ!’)†?25xª„B†q9]?Mðô¾~?!ÍíÜ_„€7ËÉ神d$•Óå}Å ”ÐéróËŒ(:_PC™šo~†KgáúâÝvWÔWW‡õù©Ø—«r{ØÏ[~˜\/½l•`’XÑN~ù O7݇ FÌh1ý +0"ÆÐéÓ„Sæ>ì&w“¿{žúFõ@_ãaý­#Á7Ô5BkUÝ:(™/ÆxvÞ>ÿð|:¬GÝÆÝ÷ÅqNô¬Ø¯ Û¸š• #DÅ +Yµ¤L*ÏŠïUQ®€iÓä©8­Ûg—% bAò-Ä*”¬x~>ʃ iNð¬(k†ÝöËquüVx,V­ºþcº+P7ùZ L´šJ¦æo_êh¢âÁ¡ ˜—Àpyåë9ˆŸËÇÃñUW›`Š£$-îQ=êavVH&.l•üfõÔäö¼¯3µ;Õ¹%$xZRÄ™€T=õç(T¥6øv¨õíß§îêÇ l÷DOØ2 ;b¶¬ 쿞¶ë:ÝX(7HR-Óió¨X¿Õð˜Íêÿ¥gø-ˆp”T!IèUa‡Ö~[ Ú*ÓÛ}8ä¢T +ÐL%Áó:x{ãøÐ nÃÞwèÅÞÓ÷N—skWÞŽR¥DK¾;ä&-Úa²¢¨É[ØÃ ãØ¤òÚßo÷ëÝy5DBøêËá¹DßYëôËú°×ShG”Q÷̪\Õ=qWÏëò\W©SOª’0bpZ}Þ“Í/F£b†–ñdû=(­q ºúX(lF6ÝÃsòÖa‹sX'&Óv Œj—«iô [™ÔHÂÆ¹5D'ÜêaVý®\›½}é–VíÜ,ë5ÃjÓÞ–5~¿?ï×v%1lp[Fùÿ`ðá5*ãIIiÎá–·x@˜òxZ×›<Ôáò–ø›§Ãˆx/F¿»þxO¬¶˜¤“àQõ˜mØê ®äØö{|.‚ˆ71¡KÄ Îô¿Gå„#¶`BßÀö9¸Üûd%÷JcøÈJ S•ÀÁªJPì7—p†m {JűxÛÂfH5wʶ–·m@˜²mZ×Û6ÔaÛ–øۦÈxÛ¶ý|·¼Ç/CXÃÆ1™ÊD³ ZF:‡ìŒÍÇg#èò[×rØ8¤›îP9áˆ-°î©<¦¼JíÑ +VbœWCt«Ööj3Ûîϻݢ,ŽOÛýªtÇýævÿ0'b6èf +›n͵|7S)‘V:·Ìö°¬›C„›3ºÎÍ-ݼ›Ûâ#Üœ #⽸ùýõÇëÛ×sBÈliÏP?ÝöÏËŠAgٱʋGeŠÙÍ­ìPllJ<>A—wÐÜ c¨Ƥ›îQá˜-0÷C±/Ž«òî±WÕÑöCÒô‚ C„iú2½ƒÙøÞÛÀ¬›Áá—‰º¾úº-{—ßÍ—®\œ|áØo½í6Å©^¦(P…Œ–¹“}Ë…€0UÒº¾(„º#ŠBK|LQH‡ñ^ŠÂÛŸ>Ý]ÇKd˜44ÊÈÇlÃKs¤–zl<>A—7±/PÃ3Mw¨œpÄ–Û‹Û]¦läivˆNÜÁ¬úÛÝáôÇÍ(¦K®_ĹÕ&|™¡×¹–unH˜pnF×9·¥›wn[|„s3aD¼çÞ^¿¾zc{êïzŒí[É\xT&ˆ˜mx}Î`£³ààYýkbqéR0ÎÓív¨œnÄ–3/QغŽ3oˆN˜×ìú­?»ÌÊç}¹Ýu×Üq=¬'îÝË3Û“›´w»AoÉQÔ¼Œ·ŒLUÎÛ–÷v@˜òvZ×{;Ôáí–øo§ÃˆxÛÞ®×èѧaSY2•‰!f´6L`Lp66 Ÿ Ë›p7F¨LËPN¶Ë,Í×I‹3(3f¤ÅtÊâ6hñçÆß‡ÖÄ}z.Ö[;jÝ^|mî«zý¾.íBv{Ãf‡î§š¼Œ× AŒ`óºƒå½¦¼žÖõ^uGx½%>Æëé0"ދׯìÐmË ›½þé:þMŒjÄ)é¤xT&š˜mxB'H1=6žÓï²&,ݧ±Ê´Û¡rº[nB71>r:¿`No@­wcvÅþÁí«Ý»0~"¿Ô€òqÕü8öuuò wûÛ˜uû¿¶‡ói÷-|ÛfµA}o)“úWŠžDbÈ‘õqÁÿýsU 4> endobj +4330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.6594 250.6249 657.8608] +/Subtype/Link/A<> +>> endobj +4331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 607.2769 190.0737 618.1808] +/Subtype /Link +/A << /S /GoTo /D (a00194) >> +>> endobj +4333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 515.1065 181.8351 526.0104] +/Subtype /Link +/A << /S /GoTo /D (a00083) >> +>> endobj +4334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 502.1362 163.7728 513.0401] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4336 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 419.2928 204.7292 430.1968] +/Subtype /Link +/A << /S /GoTo /D (a00158_g26ae707402e494f3895a9f012a93ea29) >> +>> endobj +4337 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.0542 419.2928 231.2894 430.1968] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4338 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 380.401 215.2497 391.3049] +/Subtype /Link +/A << /S /GoTo /D (a00158_g84901a5aa60040e96d272a69977edd22) >> +>> endobj +4339 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [216.5747 380.401 241.8099 391.3049] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4340 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 341.5091 210.8263 352.413] +/Subtype /Link +/A << /S /GoTo /D (a00158_g70d236d1cf34b4e21836edda60247b70) >> +>> endobj +4341 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.1513 341.5091 237.3865 352.413] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4342 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 302.6172 234.079 313.5211] +/Subtype /Link +/A << /S /GoTo /D (a00158_gb0ad55aa96dd1d200cd0fc5a99f6a4f7) >> +>> endobj +4343 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.404 302.6172 260.6392 313.5211] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4344 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 263.7253 274.846 274.6292] +/Subtype /Link +/A << /S /GoTo /D (a00158_g10d9a9201cba1a6db623284c475c6cea) >> +>> endobj +4345 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [276.171 263.7253 301.4062 274.6292] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4346 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 224.8334 216.3655 235.7373] +/Subtype /Link +/A << /S /GoTo /D (a00158_g5d56800f82bfc7bbf53bb4a659589812) >> +>> endobj +4347 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.6905 224.8334 242.9257 235.7373] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4348 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 185.9415 231.2097 196.8454] +/Subtype /Link +/A << /S /GoTo /D (a00158_gd895ab98c54d9966ff554aa873151751) >> +>> endobj +4349 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.5347 185.9415 257.7699 196.8454] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4350 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 147.0496 225.0331 157.9535] +/Subtype /Link +/A << /S /GoTo /D (a00158_gb5d9c0becf7cb32d0aaef466839dd92e) >> +>> endobj +4351 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.3581 147.0496 251.5933 157.9535] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4352 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 108.1577 229.4168 119.0617] +/Subtype /Link +/A << /S /GoTo /D (a00158_g4ab2de595d36e9e55dd61f6ecd139162) >> +>> endobj +4353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.7417 108.1577 255.9769 119.0617] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4328 0 obj << +/D [4326 0 R /XYZ 90 757.9346 null] +>> endobj +1084 0 obj << +/D [4326 0 R /XYZ 90 739.9346 null] +>> endobj +350 0 obj << +/D [4326 0 R /XYZ 90 739.9346 null] +>> endobj +4329 0 obj << +/D [4326 0 R /XYZ 90 716.74 null] +>> endobj +4332 0 obj << +/D [4326 0 R /XYZ 90 534.0752 null] +>> endobj +4335 0 obj << +/D [4326 0 R /XYZ 90 438.2616 null] +>> endobj +4325 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4357 0 obj << +/Length 1660 +/Filter /FlateDecode +>> +stream +xÚµZk7ýž_1U¥6‘ã÷ƒo”Ý¥K)PHE¥‚Viv–XšÍø÷½ÎØÎdœñµ[!‘ÇœÜs|ÇçØÎ†Uþ±ÊÑÊ(CœºZ|Ñê=¼ýdÄÂå)\Ÿ¶?ÎFθ«qšëjvµ« QœñjvùÇØÎ&S®èønùéÁ§Ûõâ¹nÞ8[ÞÔͳWõU½™0;®W ÿ–ц™“w³§£ÓYâò”Ð̳ÿ5úã­.AæÓ%ÂYU}†”0çxõq$¹ˆ/nF¯G¿¦:Í…ÝŽRRE¬°iÆÕe`fÓ9qŠÉþ¶rÚj›hµQM¤°²J0ß¼·œ«n…Oq%ªvÁ\UDa¼LGµ>äýö²~K)_Õ¹ÔÄpÃ:äþÒæ}À¼jˈxLFV×ËxùúÅãŸ/N?Ÿuu‚(Êu¹ …°çÕvÍ§Šæ¼ŽXN?áQݺ^ÁÎ-™!ÕÜ"C(Œ8«†Îòy×LtC9¡F#¦ài½cW´²À®åî¶sWÝõì§_–Û&¶×! >m&R×Û5tdÂéøÃ„Ñq½ý~"éø¶Ù^o&ÂŒëù%éƒvŒ0f̽[ @-c'jìvÁ‚±Þhì^ÜØ‡äŒÈÈêîýøÙ‹×§Çí-aV +%Ë­H(DC^­×Þ V(XÏv!áQݺýöÖŽ(§42ôˆÂˆ³j˜½C8çb˜½Û肽̳?¾Yß[Ï‹î˜Õeó¤ö—þÿhPœp-äýDƒpDÀFI†€Âƒa_®” EÒ -Ò©Ðf +E ݪ­µþùI¾äJÂuÅÑ'P™9«Õ¿Î¢iëÞ`Ë|€côª…Ež«+:‚Ön-4¸$BÛ °—  <õI½¸™7>ìX¹ŽV__ ɇmq&ˆ¤ŽÝÅ)%R5[‰’ÇØ€m}B".oÁJ6oóðùù£—edu÷V~úæÄßÀGÆØx6qžf6`ÄÀA¬Ø“B´dµz½/¡J©¡ÍHxT@·n¿ý›åÈÀ# +#Ϊa  ¬"Š 3,ÚèB$Ønp]+ïì» †‡©ÉÔøsóâr¾ p=6Ÿo6˿똫!)ÑÊH¢”´÷J3ˆöfÛPˆCc ]°oŒ^<ÉÄ"#«»7÷êÑùìâ·ç³ógÇNÒSìGB!Bòj¥“€¥L mE£ +ºuûCÀPB¥DF@m·–gý¡ñÍb½º\n—ëU1@·VNL„º”æÕ¼™8>žÇíýÝj»¼9°w’#$Âvs·ËŒ~›CìJÕýØœsbd³u(Ù<Âp›· +–l^æM6oómn½¸‹.·;“—Et«óøì§W§ò-¾’„IËÊÝH(DH^­×äÊ©•Ú‰„Gtëö›ÜR˜™ …gբϵíøÞ’ã—³ìÞø>}çÿ;Ö0)øÃ¨¡ KxDw^··a°!¦u¹a …gÕÚ[£g{°ÜSxÌ7™0£|…ὉxLbVw×›mÆoQ”"3)¡0Ö¬ZlL˜M~zÀŒšzÕÎvD9ØÛMƒ.©æ¹ŸnûŽrW%È•_7›äš +0­5ÍçÎîV ÿÉÛ#ÿ‘ +¦Šd¦7¢Û€BD'Ñ%FPoa1§X„Æ€ÆÔEܺ;¦/²Û iXÉ™,ÊãD:jpyvŽ3T^ÄÈÛÙôÂoÖoêU&ÓB­±åû–P˜çˆ2Ù݃©x û€EÖ$Î Q\ð{ÀG<¢#¯[8ÊA$Ã&§Ü€„ʉ"æ#áJ«n¨8z„Yã k[ÀcCÏêÖ6»mª¡GFœUë;Åú”€™êý)Ñ”R"Âð”(1î7roò›wq=ßäö‡Ã«ä¶ÃÛoñˆÇdu÷‡$‡ÃùîXžÙ)†u!€0 f&”L®ý~OmEÂ#:òºý3]:"`,?‚rڎű¦wgøÅ»Ët\<æ¶Ç †Á8އD¡ÓJÿ§_Sì ;OÁoÿ(Dç¿p ? + "¼Ð'õªÞÌ·Ýïq~‰OžúÝ]xÁxx¤¹xÈió +6mºyvå'åzŽç/šàŸ_›Ç“õ—¯ïóõI1q¬?ÿ*òa!endstream +endobj +4356 0 obj << +/Type /Page +/Contents 4357 0 R +/Resources 4355 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4298 0 R +/Annots [ 4359 0 R 4360 0 R 4361 0 R 4362 0 R 4363 0 R 4364 0 R 4365 0 R 4366 0 R 4367 0 R 4368 0 R 4369 0 R 4370 0 R 4371 0 R 4372 0 R 4374 0 R 4375 0 R 4376 0 R 4377 0 R 4378 0 R 4379 0 R ] +>> endobj +4359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 713.8674 207.4989 724.7714] +/Subtype /Link +/A << /S /GoTo /D (a00158_gfa11b2a1faf395ae2a6626e01c482d5d) >> +>> endobj +4360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.8238 713.8674 234.059 724.7714] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 675.0131 244.0317 685.9171] +/Subtype /Link +/A << /S /GoTo /D (a00158_gc7cc1dba1819f7fcdaa9ff9eed5a08f4) >> +>> endobj +4362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.3566 675.0131 270.5918 685.9171] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 636.1588 205.2872 647.0628] +/Subtype /Link +/A << /S /GoTo /D (a00158_g4a264bb64ae706d53f572b1d9e4037a2) >> +>> endobj +4364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [206.6122 636.1588 231.8474 647.0628] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 597.3045 232.7343 608.2085] +/Subtype /Link +/A << /S /GoTo /D (a00158_g55ce98ea4d6f22e9d5068b904d4d2447) >> +>> endobj +4366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [234.0593 597.3045 259.2945 608.2085] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 558.4502 244.4801 569.3542] +/Subtype /Link +/A << /S /GoTo /D (a00158_g2ebfe5c8a7f3173714efdf2df74fc392) >> +>> endobj +4368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [245.805 558.4502 271.0402 569.3542] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.8747 519.5959 255.1444 530.4999] +/Subtype /Link +/A << /S /GoTo /D (a00158_ga87ff36af81990e6ffe20d76d5e4606f) >> +>> endobj +4370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [256.4694 519.5959 281.7046 530.4999] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [432.9613 519.5959 458.1965 530.4999] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [474.7532 519.5959 484.4966 530.4999] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +4374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 450.7886 138.5977 461.6925] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 450.7886 198.084 461.6925] +/Subtype /Link +/A << /S /GoTo /D (a00158_g3178402dd725776415bf9745e7bf92ba) >> +>> endobj +4376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [226.5269 450.7886 251.7621 461.6925] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4377 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [257.2416 450.7886 282.4768 461.6925] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.5466 437.8372 196.7092 448.7411] +/Subtype /Link +/A << /S /GoTo /D (a00158_g3b19f65e48079d8105be2a99b5b4b2ae) >> +>> endobj +4379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.1521 437.8372 250.3873 448.7411] +/Subtype /Link +/A << /S /GoTo /D (a00082) >> +>> endobj +4358 0 obj << +/D [4356 0 R /XYZ 90 757.9346 null] +>> endobj +4373 0 obj << +/D [4356 0 R /XYZ 90 469.7385 null] +>> endobj +4355 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4382 0 obj << +/Length 1695 +/Filter /FlateDecode +>> +stream +xÚ­Y]ÓF}ϯ°à%‘ša¾?PUº „Ò…T<BnâÝÈ&ÛÄ¥¿¾×ãŒ=öŒKÑ>$ÙŸsçνg®c’`ø#‰Á‰ +Æe²º›àäþý|Bê¯çðýÜ<]N=£&1ÈH*“åuÉ ”Ðd¹~?%ŠÏæÔP¦¦§Åkx+ð” \½y¶ÙfÕ»‹ýêt—íò4ßìw³Ë—“Ëe#[G%˜$…è_“÷q²†è^N0bF‹ä |ÀˆC“» §Ì~ØNÞN~oxª/Ê ú'ë_áþCíò(¬VU«ÓˆÒÙœ`Œ§§Íý£ûÝvWö&»Î3¢§Ùn•+«( 2B””RFáüL‰HMz‘å)0­ë$eÇÕasoSDÌÉ<ðP„¤äy}Øçûüö¥ëcuùæî~›5IFÝ,k0Ñ*‘Ä‚ôæÈ‚æ.ʯmÆ ¸8ƒˆ0+#z2ƒ Nùíþð¸«M0EŠQoP=ên&VH&Îl¥ü:½«óxÚ}ž<ͶÇ*„8WKŠ8P)åU?z¡*…´Q²jõõçľûÕ Û^ѶtÃö˜‹RûçãfuDǬ åIªe8m Ê×o-Üg+ôê)µ9–²€òzƒ/²Óݦ,Ъäê×âÿ[/|"4b@“Sps]…_|u¸©1oÜý·ø¹{AÏþ{¼Etesz› õ©…ìDЭ;‹Šézl….ªènõ\[F¢ ‘œ—ȇ›Ýj{ZƒqHèýÛº}0à#*UµCižVi~›N«üTÙͱÇFˆLÍÝô5–„ÞÐüÌSè Tø WQ袠bƒŠé‚,e[÷X®ÖSfN +¦;ÊÃEeñ±<Þª¨<}®Õ\EVnQ=ª­½†MáJÀ™PµØ¢è®t»ùgè ä\#ÉŒÜaØáÝá ây‡#ºv‡[ºו£øÎÁ%Rê¿->¼É Ãã-Òå§ÅÕbéM ži"°¨˜´ÇVf ìëJ8T•½x‹FÐå¨pó„Y·EÅT=¶zÝį8…Œaœad LŽlOáU๋.ÕN4¨K^ªÃ0‡•ÑgÒV—Õ3\m¯÷‡Ój¬šÁ@ £ ’b„Yû@ é ûM€)ƒ”Tª>hWÛôžÏÙtWˆk÷öÝæD4ƒîàîÐÀ¢îT<»CD׺CK7îmñî Ãã­ÝaùâÍå“ o:à ÆUFÂ9hPqŸÍúÃ.½Ë>¥å¡s 5cpPlߨštÑÆi`çœ1uŠsýÍ]Ä(GBޏR ÷ˆÃµuQm±“¯ÅkÛ! ÕvX·©mWwDm·ÄÇÔv8 ·®í§—ÏWþŨ0¤À¢bÚÛàÑgÂZ™Ñ«·øh]Þþ£bŽ4Ó:¼îQõÙbG5QeF}.:ÐÁ Ìéà¢/«vÍoë7Ç<=äc;ÚÞþ7ë.Ï/ÕËõi·rnío›ÝMÿ_ü‚jŒÅú»ø•I©hÄ/XÔ/\€_Dt­_´tã~Ñá‘0<ÞÚ/.¯.úe ¥I€EÅ”=¶áAvš +>zí Ë;<(k%coQ1U-êp“‰)igpÈ+jTØ*2;Žþ£Ÿ2‰°½ƒî ‰¨˜$ŠÈŸn÷«êÀ:Î/é&ï—‰4ˆ¢-Â,¢E-"¨x¶ˆˆ®µˆ–nÜ"Úâ#,"†Ç[[Ä»¡xúd±üôÇÕrñÊ;d)Cƒ‰“Ñ "QølCvA©¬îDGæ¡ÁG#èò ŒC Y·EÅT=¶Bõ‡ªÞWûݺ¼G Ù¤xœ Çu ‹H³}8ƒRøÜ¹‹-Û±|w‚‰`Û‰¹žê§ùá”7ƒFB8FKõ]f7$F°Øï£ ,Þða¨áúMûº#¾%>¦áÃax¼^ÿ{±xué7ž€ +¥"œŒ‰Âgnx¼-´{‰Žª·9‡Z]"˜UudÅÓôØ:­ìrxe`#»ÜA‡ºÜÂÆuù—Ûæqé·v¹åãæþ¢>0æ})ÇUR›Ø7?f.¢¸!ŒºóˆDF1]ä nQ)ž(«âÁ¯ªÌðy¶ËinG›ßì›—ÅúOõBëWü˜²Ç´~žË’õÝՌ u¨MÔ{ðþçWûØýï¯7™÷Kañ$܆ædé_º¶Þnendstream +endobj +4381 0 obj << +/Type /Page +/Contents 4382 0 R +/Resources 4380 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4298 0 R +/Annots [ 4385 0 R 4386 0 R 4388 0 R 4390 0 R 4391 0 R 4393 0 R 4394 0 R 4395 0 R 4396 0 R 4397 0 R 4399 0 R 4400 0 R 4401 0 R 4402 0 R ] +>> endobj +4385 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 630.2193 250.6249 651.4207] +/Subtype/Link/A<> +>> endobj +4386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 596.8117 174.5819 607.7156] +/Subtype /Link +/A << /S /GoTo /D (a00195) >> +>> endobj +4388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 512.3371 148.2809 522.1152] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +4390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 445.4868 184.2462 456.3907] +/Subtype /Link +/A << /S /GoTo /D (a00142_ge6bae7dc0225468c8a5ac269df549892) >> +>> endobj +4391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.5712 445.4868 195.3146 456.3907] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +4393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 350.0315 204.7293 360.9354] +/Subtype /Link +/A << /S /GoTo /D (a00142_g3d4c8bd4aada659eb34f5d2ffd3e7901) >> +>> endobj +4394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 305.7728 194.7667 316.6767] +/Subtype /Link +/A << /S /GoTo /D (a00142_g2ffbb9e554e08a343ae2f9de4bedfdfc) >> +>> endobj +4395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [196.0917 305.7728 205.835 316.6767] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +4396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 261.5141 184.8042 272.418] +/Subtype /Link +/A << /S /GoTo /D (a00142_g7b04a0035bef29d905496c23bae066d2) >> +>> endobj +4397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [186.1292 261.5141 195.8725 272.418] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +4399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 166.0587 223.997 176.9627] +/Subtype /Link +/A << /S /GoTo /D (a00142_g99e43010ec61327164466aa2d902de45) >> +>> endobj +4400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.322 166.0587 235.0654 176.9627] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +4401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 121.8 226.2087 132.704] +/Subtype /Link +/A << /S /GoTo /D (a00142_gad14bbbf092b90aa0a5a4f9169504a8d) >> +>> endobj +4402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.5337 121.8 237.2771 132.704] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +4383 0 obj << +/D [4381 0 R /XYZ 90 757.9346 null] +>> endobj +1085 0 obj << +/D [4381 0 R /XYZ 90 739.9346 null] +>> endobj +354 0 obj << +/D [4381 0 R /XYZ 90 739.9346 null] +>> endobj +4384 0 obj << +/D [4381 0 R /XYZ 90 715.5325 null] +>> endobj +4387 0 obj << +/D [4381 0 R /XYZ 90 533.9892 null] +>> endobj +4389 0 obj << +/D [4381 0 R /XYZ 90 467.1389 null] +>> endobj +4392 0 obj << +/D [4381 0 R /XYZ 90 371.6836 null] +>> endobj +4398 0 obj << +/D [4381 0 R /XYZ 90 187.7108 null] +>> endobj +4380 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4406 0 obj << +/Length 1720 +/Filter /FlateDecode +>> +stream +xÚ­Z[o9}çW í H×÷±û–š¦j£nBÕ­Ú*ba’ %¥DmÿýÚÌØxÆ3þÜ‹ò'ßù.>Ǟț2ÔxXˆiÆåpq?ÀÃ[óöÙ€ÔŸ˜ÏOBÀ³ÙàÉ ª‡iIåpvsˆ ”Ðálùq¤¥ã*ðèqõðäaîªW/Vë²úë²¼)wc¢FåfaßÒ”ª)ÄøóìÕ`:óäun‚Ib©ÿ|üŒ‡K“ã«FL+1üj^`D´¦Ãû§Ì½X®ù8Õ‡è*QÖ]#!H A]‘ÔÔ\T5¾\•»ù¡„ÅÝj1_Wu=ÞÙî·û»ª¼ùòKWM¸@ ýí>~^e‚n,gŠû(6O”FÍ#Øü,IçA)áHc)¤,ËOÓM1s‰ +Z&³ýdw[C.ÃÈ¡Õæðvvý~L(žÏ®g//§§“v6”1»6Ó}ð tQ¬Có±À1©DŠ)•Ù‡è[Q-ýÃ>"ç ¥eºb(Û±,åŸÕr7«Ü¬pS>‰×^ˆ¤C©)b’… t,Á +{€y¤ÍãÙz»›áÿ[å3ß,«?¾ÎWûÚ6ûU-Îyõk1&bt·Z/½d¹p’e…•lÛÞ?¬Ë}ùõ§☓tuuq„+!¼WóR*Ä…Dïa êÀ Ù¼N÷ ^XøMò åiDqkí_½k::k$K”™Ùè8DEë=1(ûâÌ ·[²DÈl¡¨Û¡ Ö((YFÒšgJ6@§$ë`nçü½RŒ4Ç"3Áݽ«s³4ŒTy>_¯»zKn:­X¯5„€„5xh IÆ£5¼Î¼°54É3¬H#Šë®*ž¿œNÞ½žÆ;›@Lhžî‚Gôq4g7)­p®áXöU¹^zÙÜTz¹ÿ 1sÏëQHˆÈÃ@%"xˆ¼°ˆšä"ÒˆâÖ"úp>}=‰7†(¡hCAÜQ´þKr‰ÃùÕ;<˜A;nß%9GTa®Û£Ö8´Á2)S:óF\ˆN˜†‡U’,øA’^Ö*î[{îâqW9Çfÿã–„0JÃü·š™¹òææŒhºFÁ’>†K):Iêfè9dΑs2‡vÔPÌ×ï.f篣¥M•Yæ²0ÕJÓG±úo¯»ôhfõз£öˆ™ÙÍ“tÅQ¶b…7×¶›äí4Fí£±Ì3iNIºFå+º÷†ZÇwSÏj¿ÚÖ7è¶ ãc‚Gý7Ó1öZH’Yb€î>DPEÍ€UÕåI­¬®'tÔ^Ÿ›ÙôÚGHø‡‡’d<:Àë,¤Á {H“<ÃD€4¢¸íGuçgñ)ÌÅ¢ éNxµ·M™PÍpרm²ý£©Q;<êc0ê4¯uÈ›1êyΨÓiDqƒÛ+ÓI×£ªuôÀ¡rŠ *4nõžt ™1¤(!ýC©!;<äc0ä4¯rÈ›1äyÎÓiDqÝ/&]3¶·ZàP·Y ¢PE“›v͘b¤¤îÊR3v0xÆ)Æ`Æi^?ã7cÆ òœ§Óˆâ†G¿xÊöy×´H7Á£vk׿â¾Õ|ÖõÝbÎKÝϰ H¤¿ôU¡ÃJQæ_£áAB"]0å¾ T'a“<+7ån¾/ëc;ݼq¼²7Së¤þbÁO){JqõŠb,ëCÖ˜šÃÔ®>A¿­Ñ¨þó½ú=Ù~û~[nÚí±ßcêèÏÿ÷1ý¾endstream +endobj +4405 0 obj << +/Type /Page +/Contents 4406 0 R +/Resources 4404 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4430 0 R +/Annots [ 4409 0 R 4410 0 R 4411 0 R 4412 0 R 4414 0 R 4415 0 R 4416 0 R 4417 0 R 4419 0 R 4421 0 R 4422 0 R 4423 0 R 4424 0 R 4426 0 R 4427 0 R 4428 0 R 4429 0 R ] +>> endobj +4409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 704.1539 234.5175 715.0578] +/Subtype /Link +/A << /S /GoTo /D (a00142_g2f8f70c30b9ee08a103fbd69a4365c4c) >> +>> endobj +4410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [235.8425 704.1539 245.5859 715.0578] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +4411 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 665.2996 197.387 676.2035] +/Subtype /Link +/A << /S /GoTo /D (a00142_g9e97a0b4d5cc7764d8e19758f5da53ae) >> +>> endobj +4412 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.712 665.2996 208.4553 676.2035] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +4414 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 582.5446 207.0905 593.4485] +/Subtype /Link +/A << /S /GoTo /D (a00142_gcd3ac045f0a4ae63412e3b3d8780e8ab) >> +>> endobj +4415 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.4154 582.5446 218.1588 593.4485] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +4416 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 543.6903 187.0159 554.5942] +/Subtype /Link +/A << /S /GoTo /D (a00142_g905451249dca72ce0385bf2a9ff178ee) >> +>> endobj +4417 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.3408 543.6903 198.0842 554.5942] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +4419 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 461.3088 216.3557 471.8392] +/Subtype /Link +/A << /S /GoTo /D (a00142_gfa82b860a64b67d25ab3abc21811896f) >> +>> endobj +4421 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 378.1802 194.2089 389.0841] +/Subtype /Link +/A << /S /GoTo /D (a00142_g155cba6121323726d02c00284428fed6) >> +>> endobj +4422 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.5338 378.1802 205.2772 389.0841] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +4423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 339.3259 229.068 350.2298] +/Subtype /Link +/A << /S /GoTo /D (a00142_ge3c821e3a388615528efda9d23c7d115) >> +>> endobj +4424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [230.393 339.3259 240.1363 350.2298] +/Subtype /Link +/A << /S /GoTo /D (a00084) >> +>> endobj +4426 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 257.5471 206.8414 267.4748] +/Subtype /Link +/A << /S /GoTo /D (a00142_g7b5319b5b65761a845fcd1500fde4cdc) >> +>> endobj +4427 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 244.5957 200.296 254.5234] +/Subtype /Link +/A << /S /GoTo /D (a00142_gcfae9053e5c107a1aed6b228c917d2ea) >> +>> endobj +4428 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 231.6442 198.0843 241.5719] +/Subtype /Link +/A << /S /GoTo /D (a00142_g9ff1e8936a8a26bff54c05f8a989b93b) >> +>> endobj +4429 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 218.6928 207.489 228.6205] +/Subtype /Link +/A << /S /GoTo /D (a00142_ge469332907e0617d72d5e2dd4297119d) >> +>> endobj +4407 0 obj << +/D [4405 0 R /XYZ 90 757.9346 null] +>> endobj +4408 0 obj << +/D [4405 0 R /XYZ 90 720.8203 null] +>> endobj +4413 0 obj << +/D [4405 0 R /XYZ 90 599.211 null] +>> endobj +4418 0 obj << +/D [4405 0 R /XYZ 90 477.6017 null] +>> endobj +4420 0 obj << +/D [4405 0 R /XYZ 90 394.8466 null] +>> endobj +4425 0 obj << +/D [4405 0 R /XYZ 90 275.5208 null] +>> endobj +4404 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4433 0 obj << +/Length 1429 +/Filter /FlateDecode +>> +stream +xÚ­X[oÛ6}÷¯º˜Y~¼3†]²Ë0`kóÖ…++‰_2Yîåßï£$ʲ(SZä!’uô}‡‡à·»ÙËfK¬b*¹»¯+( ’KîVoSÐj¾`–qþü%MÐæà¦XçÍÑõ.;lòmµ¬ŠÝvþþîvöÇ]×¶e%¹×ô¿ÙÛ÷4Y!»Û%Ü™|ÆJÀZ–lf‚q²ž½™ýÛÕi.Ô7Œ N‚¿0?<†£ÕÍè a|¾Jiz(ž_VÅ&/çxš’l8Â×ù½»fÒ|›ån„Mi Vʺ4Jë*3s,M -~WK¬´jÅÊ÷YY<{©°ïÍ€«ãÛ¦Îݜ˴æUß».>–ËòksRlž×y';ên$¡`t¢¸!ÔR>ªš-ú¨p]K(åXKRB…”5·_çHâP=îÊ«ao ŒhÎ Þ¼CtïkT \«ÕíWËM«èaû„ó–æë}£(@ïnňà×N}×OU­‰±Z ¨6—ŸôW¶¿c„¶êÓ*;K¤ý˾ÈödŸ¹0a‰bFÅeëPaÿ“‡Õ\ÿŸGݤ/ÉЩ¸ò:G)ÛõJmV\ûßý¾؃4„c•D%’ò–½»T>´˜×ýé÷øEÿ†‘éê:v[¥tfÁU­¥Õ"ÃÕçQSíƒj®=ieìOøÂúŠ QN!jäÅ6[V$ +³àE¶ÞeOäñ…»ß¹½ò1h=Ä:’7\´n“7‡mææi?’¾ ”‰³Ï„>`Ì} + dıŽkøŽ1ºÞ% Z-Ú±CMõÅà¶T©Ó¾ŸæŒ¦»bôF5,€ô>¿ø<~ŠEP·[|öy¦ N‘3!GM5ׂÃÍßQI÷UyÈ‚î U0\ŠÐá'x„uRÀçžÚÆèPacýÆL+Œ +@ùHŠáDð9_ýØDUm·Žê‡Ê‡X•—¸Œdº\£”®bM÷ huähN0²˜ð¢®Ç!ibšõDâÞ€jkŽEÇ7yKiÙük7 )9G +÷DX+ã¤ZNÀ0.à¼ï…¶D +¾ï`“¾ïŒø~¢¯÷ýIßIߟö¾À÷,‚ºGß—ù¨ó­ÛÌè >›@!ìB:ü°îyçsÀm»1q:TØøÔùœeìpõEœ/¼óc¦JE\fê>:bêæÚ¿®GãçǼoìúðsQ=®î—›¼MËõyûKTEàà»Ø_P¢,7Sö÷°iû÷ +ÆìïÛÙ¿ßwÚþ'½/±œEP÷ÄþÕ²¬Ævp÷—Á£¦Üôåù# “.¢ÃOðëF@f¤‰ Ð¡ÂÆƒÀ¤ÔJ¸àÑ ÜQhaÍ…ÐCÇÀÃÚ¨—ÇÙ¸/çB¦»Í‘ÊrÎuŠ/ôÍÏ»b[¾x¹*s‘ýºG[j¿O@P †7›X@xØt@ô +Æ"Þ· ˆ~_'Õ°-¾ËZÐjÐö|6xü î1êÙùò\”yU³Û¹#*B š¢`ïé§ÚGÒAj¹¸TŠ?Á#¬II€áC2:þ6¤¾6£C¾18êjðû²tè£#éÐÁ\ûßóÌ=ËžZcß¼Ô‡Ë}s;¸[Ru8¬ÎZŸk|WâJ]d}N1'Œ›ŠÊ’ê›>ÖÖùaðà¬ÿIQ«]”ß'œáî»,¾ ƒ@79u^åÛ¼\VþS©ÿîô·?¸uö:´'ÀÚÿôŠñ+Ö~•f”ª6gÝ;Þ®•3ü|ýñ«ÿxýåëC|¶vß“=µžJÿmÛ$endstream +endobj +4432 0 obj << +/Type /Page +/Contents 4433 0 R +/Resources 4431 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4430 0 R +/Annots [ 4436 0 R 4437 0 R 4439 0 R 4440 0 R 4441 0 R 4442 0 R 4443 0 R 4444 0 R 4445 0 R 4446 0 R ] +>> endobj +4436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +4437 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 609.4075 186.7559 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00196) >> +>> endobj +4439 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 515.6229 172.9881 526.1532] +/Subtype /Link +/A << /S /GoTo /D (a00156_g6614d96fdfcd95c95ec6e6f63071ff51) >> +>> endobj +4440 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.4309 515.6229 224.4542 526.1532] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +4441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 476.7686 180.7289 487.2989] +/Subtype /Link +/A << /S /GoTo /D (a00156_gedaf3e48c2b04229b85455fb948468d6) >> +>> endobj +4442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.1718 476.7686 232.195 487.2989] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +4443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 437.9143 186.816 448.4446] +/Subtype /Link +/A << /S /GoTo /D (a00156_gcb807bd57e5489b386b876af5c1f163a) >> +>> endobj +4444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.2588 437.9143 238.2821 448.4446] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +4445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.9214 398.6864 184.6543 409.5903] +/Subtype /Link +/A << /S /GoTo /D (a00156_g6d71dececfce707c668e6257aad5906e) >> +>> endobj +4446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.0971 398.6864 236.1204 409.5903] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +4434 0 obj << +/D [4432 0 R /XYZ 90 757.9346 null] +>> endobj +1086 0 obj << +/D [4432 0 R /XYZ 90 739.9346 null] +>> endobj +358 0 obj << +/D [4432 0 R /XYZ 90 739.9346 null] +>> endobj +4435 0 obj << +/D [4432 0 R /XYZ 90 716.7484 null] +>> endobj +4438 0 obj << +/D [4432 0 R /XYZ 90 534.1992 null] +>> endobj +4431 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4450 0 obj << +/Length 1521 +/Filter /FlateDecode +>> +stream +xÚ¥YÙŽÛ6}÷Wé‹ Ô ÷%(Š.ÓMQ Mæ- ÅÖÄÆxì©,gùû^J¢L‰©6˜‡Ñrtïáå=‡¢L2 $38SB!øÌ6 œ}„Ë/¤½½†ûkðËíâésj2ƒŒ¤2»½«#H‚%4»Ý¾YjDùjM^^öO«ýCQ®ÆK´k®>ߊæèUqgïéeqÜØKJk±$J­Þݾ\üvÛ‘h9 +&‰¥ðÏâÍ;œmëËFÌh‘}†Œˆ14{XpÊÜÉañzñw§¹Q?06TAØøX Gp…ºÁR»òÇ +£û¯ƒ…6¡ 2BÔ¡¡Ð62Õ×Ј´ÁoŠ*‡HÛ&ÔMqÞ”ûÇj:¶˜76Ž%lš8·+&–5¯úÙÃþC™—_›“]‘oÝ·ÓC†µ×a¢U&™FØ`6Z9Zû¨°S´A3ˆ%0Â\ˆšßÏ+Û)ÕîT>æ&˜"Å(‰'ïP#Ùýº¬"L\£Õé·ùC[ÕËñænYÎMU ñž–q& ê§~¨*…´Qr@µ¹}Ÿ¹£?<Úî‰ÚÒ§D¶r ýÓy¿9£s1äB¹A’j/[‡ +ó÷F³ùi¼5.$µB?XäMa;븯»µ.ôþèw\PI¡ƒ(™$ ÌZööVù±Å¼ò§ßá×þ#ÓĵìÅ +a;$¢%bľGdØ}•JD³éQ[FÂׯE$ +ÊÉyünÜ.[0 ~ðds8mîÑîÉ„‘0°ÝzÔM^åMÁ_WåeS]:¸,8,ÂTêÉ•ÀŒ)L‚H4¿Æ±ùßR*Be[§9E3v¨T^0hƒ¥ìç=×£ 23 ÓƒÌÓíåð)AÜk{ )HèÉe|ð‚!7 šÀÃŒJ! Ôa„5½r8ÓÀQòš#¬/Xàè`×ÍÑ®]„,Q8[Mx­K(33¹xèn%½v)´WÖZÙøÄóËqc=b¬/9ƒ*¢&ûÒDú²ƒ%û2šñÚ—‰¼®/{y?­(^žöÛ°3MˆäŽtf‹O±âvùþ\„Q0G†èD *•\qÄ5$‹—'…ÅœSp®™Eèð aÜIyR +ÊÊÄ Ð¡ÂÄ„û‰)ô8×rXÌFVP˜(MÜ;Fõ}#ÌÚêß[ªï+·€VE m$–ùJI¦ô +=¼UÏÓ«ŽxG³_-¥|¶‰À,À:¬&Òr"ü‚ˆi݃Â8ôXJ÷–Ö½0¦ûxÞN÷~Þ´î{¹çè>Î"ˆ{Õ}YŒ*ߨi•(‚C¥ÒkŠ@$lPüiåÛåBj2· >Á#Œ;­|F`Û¨u¼*LÜW>cú|Ø}ås§ü˜¨™1ˆ+&æ‰ÚGGDÝÁlúWus4zÞ¾°ëÃÏûj7¸{Î +ßšòäü™ÖHþdžÿ-/B2’KÊß‘"¯“/oRþýÜ3äŸ`ÄíÉ¿ÊËÐ`¯‰Q‰28TŠÌ4#˜ Ê1‰¨dn!:|‚G7b +Q-t¼*L<0pJ%Ű3–þ¨ÀöACg€‡Ž€ƒµP·Ç¤Ü•+.–§‡bs)ËSËâØ>ûxÚ«þ¦ßFY1ý~Àì÷Ùÿh‘0>m°ÃRX›”A8XÚ ¼€1ƒˆçí ÂÏkK5L ïJÆ~ +è§ö‡Oâ^½¡ž/û²­JÊfÕ-B JQЮՠöwàÆç–¢Ã'x„q#î `CËI|ü*L> endobj +4453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +4454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 609.4075 187.3139 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00197) >> +>> endobj +4456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 534.931 161.5608 543.7776] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +4458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 450.4922 172.9881 461.0226] +/Subtype /Link +/A << /S /GoTo /D (a00156_g6614d96fdfcd95c95ec6e6f63071ff51) >> +>> endobj +4459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.4309 450.4922 224.4542 461.0226] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +4460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 411.6379 180.7289 422.1683] +/Subtype /Link +/A << /S /GoTo /D (a00156_gedaf3e48c2b04229b85455fb948468d6) >> +>> endobj +4461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [209.1718 411.6379 232.195 422.1683] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +4462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 372.7836 186.816 383.314] +/Subtype /Link +/A << /S /GoTo /D (a00156_gcb807bd57e5489b386b876af5c1f163a) >> +>> endobj +4463 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.2588 372.7836 238.2821 383.314] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +4464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.9214 333.5557 184.6543 344.4597] +/Subtype /Link +/A << /S /GoTo /D (a00156_g6d71dececfce707c668e6257aad5906e) >> +>> endobj +4465 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [213.0971 333.5557 236.1204 344.4597] +/Subtype /Link +/A << /S /GoTo /D (a00087) >> +>> endobj +4451 0 obj << +/D [4449 0 R /XYZ 90 757.9346 null] +>> endobj +1087 0 obj << +/D [4449 0 R /XYZ 90 739.9346 null] +>> endobj +362 0 obj << +/D [4449 0 R /XYZ 90 739.9346 null] +>> endobj +4452 0 obj << +/D [4449 0 R /XYZ 90 716.7484 null] +>> endobj +4455 0 obj << +/D [4449 0 R /XYZ 90 551.8236 null] +>> endobj +4457 0 obj << +/D [4449 0 R /XYZ 90 469.0686 null] +>> endobj +4448 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4469 0 obj << +/Length 1547 +/Filter /FlateDecode +>> +stream +xÚ¥Y[oÛ6}÷¯Ú˜YÞ/ÁP¬CÒ":t©´EàØJ"ı2Ûj׿–¨P¢D‚À²uôÃïFR$†?’œ)¡a\f«§ ÎîáçÒÜžÃý¹ø}1yóžšÌ #©ÌwG ’ A Íë/S¢ôlN ejZ]~‚K§áúâ}±Éë«órU=åÛÃòP”ÛÙ·ÅÕäbÑÒ6ª“Ä’þ3ùò gkPw5Áˆ-²ð#b Íž&œ2÷e3ù<ù«µSß8>048AØðèGð uã0ZUN#*fs‚1žVÅóøŸoóâþá¶ÜÍà×)ZõzßåpOOóí*·­2BÀÖ€êDŽóü°KëÆgù~µ+žÇÀóaíXݦ¶s¾<,o—ûFEyWnŠíã|S®–›ú»¿ÿ¥þ^íÙíÏúóòÓwY_­Êucm¹m@‡²çc/ë»êPíлëO}ƒp‹Šé]qÈQ?´@˜h•I¦6˜ †Òæ>*LVmÆ l Œ0âè©w3«üðPîÎúÜS¤%qò5ÀîGˆ`…aâÅÚ‘~½|jâ[m!‹¦ùf_Ç—ïiIgúøÔ¯T¥6Jö¤Ö·3wõ‡'Û=1 [ú²ËVÀdÿ¶/V{´ÏûZ(7HR-ãnkQ!gà¡5Ëÿv æD8“Úäñò¯Ómq¬›££‹æÓþ¾ Ô¡+™$ ÌõöÖî¾Á\ûáwø¹ÿÀ@ø»V]§…a;Hß›DBs²§§ïM‡J¨­Y¨ñ¦ìx“:“D[9?B_ÛÕ¦²•+¡C½òõ£‡WÖŽmEõ¬ûD˜Ô‚!et'©{* d8²ì»b{,qHRŠðíP§…B5m‚qí‚úù‘ï¦!A4â˜òÑÉÑ U¼„¢ÕüÅŽ%üJa : ¼£Œ-*Å 3˜ÁRvy_¯›‘ä\"Eé‘g¼Ã§dv­Œïþ¾Y\~¼Tƒ¨12á‡JpSL µ0ërª‡¢Œ₌ùå~,Æ *âá(i`ô„øú̧„7ª¡oÕj¸øsq}yñ9P ¡h–»%x ,ö3^=Rð ´Sðï«íÊNCϹFÂh=š > ’ -,™ QÆ—tHðº|èð~ŸQXú뀼a=îñ„pø”ŠÀn3Ãݸ⦀y8˜àÀiŒ0wE‹Jˆ X#™î… ìÜ×d(ôL ÉÕx¯÷±Ð;X:ô1F/ôqÞ6ô>o:ôîSBWØ BÿœïŠr]„ëØðH…EÜ-*!„Rˆ„Íh7 '„ŸR$0ãá÷±ð;X:ü1F/üqÞ6ü>o:üîSÂWØ Â¿\¯ÃÂW05›„'ZTBµë¹Â.§¢D삟¢ì:Ï0öÝMØ÷$LJöG|ø•â—–ÜRwùkîÇÓf‡KèjHÝ+¬ªl՜攟ÚÊ‹] Ç(%âžiQ¡Â}°dö N/70ØCBkâ6$VÛX»€lSœ‹ñvábíÂÁÒí"Æèµ‹8oÛ.|Þt»èpŸÒ.â*»AZTÏëå!|³@ ”š‰¸3ZTB…|ÀŠ“^†šÌ>Ìuª#Z|RAßn²i(» ‰thQ)~eKØtùkî‘Äg–ý†ï–|@$ñ[X2ñcŒm¹&Ó¥}JÃuÔ%û•Ý’(Ⱥ¸sZT(¢Ó¯ˆ±3 í‰pýª;bØ1qÙãOK‡O¸!´¸aS–Õs HCtåqG´¨” ­áš‘¾#êÓPD5>ÝŸRØMÕ'ã¬>Šˆz E%ø‡E¬6¦Ë­OEájð8ƒe"…ü_‡*ÇרîŨÿ–]"£`×uœôáA{~â¤XÍòm¾ƒŽÞœ¸W±ÝÅÕŒˆiÕ|!´ùÄg”Ñæô²²9Џ³Çå®9tŽ™ÜáÃyùïÏû<8^²ç>^ú‡Þendstream +endobj +4468 0 obj << +/Type /Page +/Contents 4469 0 R +/Resources 4467 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4430 0 R +/Annots [ 4472 0 R 4473 0 R 4476 0 R 4478 0 R 4481 0 R 4483 0 R 4485 0 R 4486 0 R 4487 0 R 4489 0 R 4490 0 R 4492 0 R 4493 0 R 4494 0 R ] +>> endobj +4472 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +4473 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 607.3502 217.1919 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00198) >> +>> endobj +4476 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 516.2256 200.2959 526.1532] +/Subtype /Link +/A << /S /GoTo /D (a00131_5320d4457a472d8888ec1905bc0e0a1c) >> +>> endobj +4478 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 504.3552 188.6795 513.2018] +/Subtype /Link +/A << /S /GoTo /D (a00131_5f2e1fcf0055d20ce17664b1027bb9eb) >> +>> endobj +4481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 445.4457 207.3094 456.3496] +/Subtype /Link +/A << /S /GoTo /D (a00131_1273664aba3e6a2a46e87dcb1a5f19ad) >> +>> endobj +4483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 432.4943 226.6668 443.3982] +/Subtype /Link +/A << /S /GoTo /D (a00131_890e822616a6839dfbf51dcb591b8e99) >> +>> endobj +4485 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 419.5428 208.4056 430.4468] +/Subtype /Link +/A << /S /GoTo /D (a00131_88460bea09a462d0e22511cb567eee14) >> +>> endobj +4486 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.2212 419.5428 265.1324 430.4468] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4487 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.295 419.5428 398.1028 430.4468] +/Subtype /Link +/A << /S /GoTo /D (a00092) >> +>> endobj +4489 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 406.5914 220.5797 417.4953] +/Subtype /Link +/A << /S /GoTo /D (a00131_1d5ce7047650f3ecee0814dbc8714099) >> +>> endobj +4490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.3954 406.5914 277.3066 417.4953] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4492 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 393.64 191.7182 404.5439] +/Subtype /Link +/A << /S /GoTo /D (a00092) >> +>> endobj +4493 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.6883 393.64 287.4687 404.5439] +/Subtype /Link +/A << /S /GoTo /D (a00131_692d80636342d564422ccd9296ad568d) >> +>> endobj +4494 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.2843 393.64 344.1955 404.5439] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4470 0 obj << +/D [4468 0 R /XYZ 90 757.9346 null] +>> endobj +1088 0 obj << +/D [4468 0 R /XYZ 90 739.9346 null] +>> endobj +366 0 obj << +/D [4468 0 R /XYZ 90 739.9346 null] +>> endobj +4471 0 obj << +/D [4468 0 R /XYZ 90 716.7484 null] +>> endobj +4474 0 obj << +/D [4468 0 R /XYZ 90 534.1992 null] +>> endobj +4475 0 obj << +/D [4468 0 R /XYZ 90 534.1992 null] +>> endobj +4477 0 obj << +/D [4468 0 R /XYZ 90 520.2106 null] +>> endobj +4479 0 obj << +/D [4468 0 R /XYZ 90 464.3956 null] +>> endobj +4480 0 obj << +/D [4468 0 R /XYZ 90 464.3956 null] +>> endobj +4482 0 obj << +/D [4468 0 R /XYZ 90 449.4308 null] +>> endobj +4484 0 obj << +/D [4468 0 R /XYZ 90 436.4793 null] +>> endobj +4488 0 obj << +/D [4468 0 R /XYZ 90 423.5279 null] +>> endobj +4491 0 obj << +/D [4468 0 R /XYZ 90 410.5765 null] +>> endobj +4467 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4498 0 obj << +/Length 1405 +/Filter /FlateDecode +>> +stream +xÚ¥X[oÛ6}÷¯º˜Y^Ä[0 ëµk†]š·¶[N„8ræK»þû}”H†eÒØÖåè;‡ßR`ø#…Æ…äiVŠbù4ÁÅ=<~7!öõÞÏCÀ¯7“×o©.4Ò‚ŠâfÝZqJhq³ú4UˆŠÙœr<=ÖϯáÞTõýÃÝv7#OÑC÷òm½©º«ëj]Á;5­š¥yT +§DêÙ—›«Éo7^‹•Ê™ FÉß“O_p±ÉWŒ˜V¼ø7­iñ4))s7›ÉÇÉ_ÞN÷¢ý`lÄœ°ñ!“ÁêÆLÁ22Œî?ŽÚ1¤9oÀ톀ªD,ÇeuX€¥Ugê²Ú/wõó¡Þ6Ö ¢cìݺ³ó{µXqûágŒ©Ó³ÞÚ‡«Åaq·ØÛÇÛu÷»©›Çùf»\lº{7ºý6Ò{§æî{÷ûþÃW›ËíÊZ[4tØZpuêóõñpÜÙ·o®?¼XBìPa¢d!˜BXc6Sš‡¨8••F3°Å1Â%ç­ËÞÌŒÂÃÃvw1ä&˜"É(I“{Ô{*‚%’„ñk-ýjñd}l!¦ÕfßšàkAQÉ8dvûÕO‘T)‘ÒR ¤v¯ wõG Û}1"[„²#ËFÀdÿ²¯—{´¯†Zh©‘ J¤ÝæQ1oà±5ÃÿóH-Ì w&)ôȃ¼¬L!4u[@­£ë¦W COr…X)ÁˆcfÕ›W»{‹¹Ãïðóðƒ‘ðGvº^/áÜ´’¡7‰@šâ@ÏЛ•Q[3*õ¦èy“:“D‚[˲…þP7ËÍÑ”¼€Võ +ô£‡W':+Te×™.¡ñtnÿxØ—Pþm{ÜÌÀ‰0ê䄯êL@©¨òÅŽáÿL)ëÛ´`(ª$£GåxaÑXˆ>ï¾mÄÌ4LtL ˜O'™Ãç4Dvm’ݺ$»]¬V»8Ǹ™CHÚ5"¢zCLbZ´üoÍÒ”ßX°K©‘‰ÕIHÛòÁN2¾;Ãë‚Ýãý:£0©Ö«8Ü€&„¸á¶øœŠÈnî:_np#Œ¤]áQ+¤0ä\?˜cç¸&c¡QÊèéЀTè,úcú4¯}È›}ûœÐ§UDvÇ*=޼D%ÖOxTF5¸Âw†(‘g»Àãsô‘]ç‚úÙt¹Û8ñÌHf‘¾Cåøá­0]°ÇßqÏJ<µ‹çñŒˆjØSéψŠíž50-O{Æ£b¤ Eh˜†Ìîi˜,Û q [£íT»ànIäévRíÂÁòí"Å´‹4¯o!o¾]ô¸Ïii‘Ý(-ŽÏ°9ŒóB©O;ã22(¥Ë’ ‚0Ö4(,64Ît„Çg íf›†4ó ΤƒGåø¥™-±îówܧ¿ÄˆÑÛ¨6ñ@*ñ,Ÿø F_®™ÄtiŸSçË#T—íWDc$!ëÒÎñ¨XD¯_mf:áúUÅH¨R xO§¥ÃgÜÛܰÙnÏ‘ Ñ•´L;£r2”‚k³2ì;b¤>5ETáóáð9‘Ý\}²’uÇ€IxT†Ÿ•¡uŸ?]ŸTÂÎ^éÓõRõé`ùúL1Sš×W^È›Ÿ˜zÜçLLi‘Ý(ñŸ«]½]Õ˱)BHÌÓîð¨ŒJ"Â,œzaÈoc$A¤”£{( ö‰àâg·)¤°Ù‹ÑpÃ-–°ë²ÇÕV„Ñü®jªLåöÌÕ{ýé.®f„Oö†Pû‹/(» ¸»ƒvdw×3ʧîôøøÞÕ„ûº—Û¾ßWÍÐ=æ°}Ä?ÿF$YÍendstream +endobj +4497 0 obj << +/Type /Page +/Contents 4498 0 R +/Resources 4496 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4430 0 R +/Annots [ 4501 0 R 4502 0 R 4504 0 R 4507 0 R 4509 0 R 4510 0 R 4511 0 R 4513 0 R 4514 0 R 4516 0 R 4517 0 R 4518 0 R 4520 0 R ] +>> endobj +4501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +4502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 607.3502 217.7498 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00199) >> +>> endobj +4504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 532.8737 216.3454 543.7776] +/Subtype /Link +/A << /S /GoTo /D (a00092) >> +>> endobj +4507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 476.0215 207.3094 486.9254] +/Subtype /Link +/A << /S /GoTo /D (a00132_1273664aba3e6a2a46e87dcb1a5f19ad) >> +>> endobj +4509 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 463.0701 208.4056 473.974] +/Subtype /Link +/A << /S /GoTo /D (a00132_88460bea09a462d0e22511cb567eee14) >> +>> endobj +4510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.2212 463.0701 265.1324 473.974] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4511 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [320.295 463.0701 398.1028 473.974] +/Subtype /Link +/A << /S /GoTo /D (a00092) >> +>> endobj +4513 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 450.1186 220.5797 461.0226] +/Subtype /Link +/A << /S /GoTo /D (a00132_1d5ce7047650f3ecee0814dbc8714099) >> +>> endobj +4514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.3954 450.1186 277.3066 461.0226] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4516 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 437.1672 191.7182 448.0711] +/Subtype /Link +/A << /S /GoTo /D (a00092) >> +>> endobj +4517 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.6883 437.1672 287.4687 448.0711] +/Subtype /Link +/A << /S /GoTo /D (a00132_692d80636342d564422ccd9296ad568d) >> +>> endobj +4518 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [291.2843 437.1672 344.1955 448.0711] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4520 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 424.2158 226.6668 435.1197] +/Subtype /Link +/A << /S /GoTo /D (a00132_890e822616a6839dfbf51dcb591b8e99) >> +>> endobj +4499 0 obj << +/D [4497 0 R /XYZ 90 757.9346 null] +>> endobj +1111 0 obj << +/D [4497 0 R /XYZ 90 739.9346 null] +>> endobj +370 0 obj << +/D [4497 0 R /XYZ 90 739.9346 null] +>> endobj +4500 0 obj << +/D [4497 0 R /XYZ 90 716.7484 null] +>> endobj +4503 0 obj << +/D [4497 0 R /XYZ 90 551.8236 null] +>> endobj +4505 0 obj << +/D [4497 0 R /XYZ 90 494.9714 null] +>> endobj +4506 0 obj << +/D [4497 0 R /XYZ 90 494.9714 null] +>> endobj +4508 0 obj << +/D [4497 0 R /XYZ 90 480.0066 null] +>> endobj +4512 0 obj << +/D [4497 0 R /XYZ 90 467.0551 null] +>> endobj +4515 0 obj << +/D [4497 0 R /XYZ 90 454.1037 null] +>> endobj +4519 0 obj << +/D [4497 0 R /XYZ 90 441.1523 null] +>> endobj +4496 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4524 0 obj << +/Length 902 +/Filter /FlateDecode +>> +stream +xÚ¥VKoÛ8¾ëWè(ÄÎ"E‹Å¶MÓÝúð­) +ÕV¡¶äµ¤móï;”HG‘ç°’âð›óâ`ô‡¡0“3"Uáz@¸¥ÏotÛ í'cW«àÅ7¡aFq®n{…Lräájó%B q YÔýó¦"d0L®Ê]1Ì.ëu·/ª6oËºŠ¿®®ƒ7«“ZÇJ +…Vé¿Á—¯nˆÝuL-ß´†Æðp¤\øÅ.ø|<á ý¥ËI˷ÔÑî¯Çé¶Ùp;Íx'QW^Ð/i»²ewÓ ~*n‹cŒ:*ªua/8 #3RöÈdY Ìõ2C‡}Y´9!mœ­Šf},ÞR$F°8–¯pÞ×›Îs¸­Ã¤çØ–ÕvXÖ]û½î*¿zíÜÔ1ÊhkÝÒ _ÊjÛŸ1Ò1·pcsˆþ³ÿêÒAµwNó¦Øå÷žÿË8…èõ;/r¬»íÝ¡k½d¯ô˜oúP`ÓXÐ’ê,TB30 =é…’±Ô õê7ùÞ¹¹«~X3»fp3âè´â,’â¹?õÇŒj–1m25¡:lÿýì݈¶?±@[iÏ-r×þ¯¦\7¬)¦\xj˜âZ7ÛIj®ÿÑÅçhVÿŸ ™ ô”K’âÁJ^7¼*ûôyÕöûnÆ¥f‚PB…À$ÇÞn·NæÓØý^>Xpÿ ײW)CáššlBd}^ê9õ34«ž-U&Šh)RFy5T–«®Z[#6 åZJÁ”D|ò ,¥†¢èÖéŽUxùœ§¤­™”g5ž¤žÓK•Þ€RõžjÚT7Yà ʉî§#ÃË?Çb†ë"ã[ߨ\Ûr9Í2Æ…Ôç-q’z†·EŒ« ‡à­Asœ{ƒÞ,z(%¥f'# + N„“±tÏDB¨‰‰J{kЫ™Ñ –ÉßyµñÏÙc[Ÿ³C¾¶ ‡ÒÙ6ìIŽT²T‹óÅT*¦²%›™ •Tÿ«5é“BÓ|üX)j5„¶vœÚ.$C©þZ3¼-ªâ˜·þeõí½Ÿ\ÛÇ´s än„ ..¸ëÁ("”kb.#ß"Ì›µï÷¾Uûu¿-fMšíž<µ‘•~`¾Jendstream +endobj +4523 0 obj << +/Type /Page +/Contents 4524 0 R +/Resources 4522 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4430 0 R +/Annots [ 4527 0 R 4528 0 R 4530 0 R ] +>> endobj +4527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 250.6249 657.906] +/Subtype/Link/A<> +>> endobj +4528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 607.3502 200.0459 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00201) >> +>> endobj +4530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 550.498 201.2321 561.402] +/Subtype /Link +/A << /S /GoTo /D (a00154_gb4b17aaf20d630f30919b19937b966a3) >> +>> endobj +4525 0 obj << +/D [4523 0 R /XYZ 90 757.9346 null] +>> endobj +1112 0 obj << +/D [4523 0 R /XYZ 90 739.9346 null] +>> endobj +374 0 obj << +/D [4523 0 R /XYZ 90 739.9346 null] +>> endobj +4526 0 obj << +/D [4523 0 R /XYZ 90 716.7484 null] +>> endobj +4529 0 obj << +/D [4523 0 R /XYZ 90 569.448 null] +>> endobj +4522 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4534 0 obj << +/Length 2879 +/Filter /FlateDecode +>> +stream +xÚ¥œmo7ÇßûS-p^˜áÃò)(ŠKlÙqâØ>[9 HÁ••Øhb§~À¥ßþf¥%=\î‰;idï_óŸ9K®6ÿ‰‰ç«-óª1“Õ·>ù¿>ÜÝá]8¾‹¯;/¤Ÿxæ4“ÅçM#˜–BNW§ŽI7Û•šOŸn¾¿€?lµýñàæëzûê|ýy}?nº¾]µ¿rNù©pböiñvg¾ˆî]rZÑzÿµóñŸ\A’ow8SÞéÉà΄÷ròm§‘*üðuçbç_1ÎöÀæ C稅>IÑ0ø g)á¤->IÁyõY©mc +æµÞÄ„Ò*Î —MŒÉDuýx ‘®¶¡ö׫û›ï7w·] …@©—jgqÝ%ðtt¶}±Ø;{^?<^®þܾ\Ý]­Y¿æ" g'F¦µ°ƒ ¢]¬Ê‡†óŒs±Ç47~“Þ«Y›ÚãõÝý˾·à’Y%mUî¸,‚[f…ÒÏÑ6öW—ߺ¢>Ýþ9|ºþú°-ªèÝF²Fi7›wý’¥j-sÞš^ªÛÃN«w(íðŽ´ N;‹Ü&p iÿó +2†lÙêî[?iÌçéÒEUžCròy´6‡_ÆÞ®p!$L§šíÜ_ÿι¼½ÙŒØMµoº¿Ûß]gåÔŽ)#ÝÄpЬڦߺÿÒiÎñú]ü†1Åm³ÛN׌¨ƒÑê{ôÇ^'*Ùöcµ®¬+†½ëºxÂ2#»âý|s»úút³Ø@'ø©Íöú§öÍíLß +Õˆðîûc¦ º¼¼_]—ÔùÄЊYï’‰Ñ;)˜v 4‡­àáñþæö »ˆÔÀ@—<j‘0Ù=´Ðj\´Sxx­® Œ]-uìj†Žõ ÓÞ51Jëö»”:oUð& ý²‹¢‚)\g<7&1ýùª;Ç̹1%­HÇgJrèGÝ”yþºm—gçG'‹ƒ¬éHÎd#È mß´);×þ ­ + £Â6j2P”ƒ¬Œ™rDœißûVNÌkPÓidq7ˆ½³åÁÑI–„3°´ðM¡AU²†~§%ïYó|rå’Ä (ÊAV¦L9"Ê´o¤Œ}+('æ5”é4²¸òÅo”á¼ñ… +UÉÚKXmë^€²¢ kà.㔑€¢deÊ”#¢LûFÊØ·‚rb^C™N#‹(Ÿ_,rʰÇÐB*T%kÏáBkÃÄ(7C”EÛ ´§Œå +S¦eÚ7Rƾ”óÊtYÜ@ùìâÍ8e²Ï”iëH[e7D™ ¦­&_H@Q²2eÊQ¦}#eì[A91¯¡L§‘Å ”_Í>Ý{—%lŒ¥*UÉÞ+&¸JÝùÁ@+g™ÚŽ‚Æt”A“ŽÏ  ¾tâ[šW€.¤‘Å  ?œæã‚»B‚ªd 5½Êór²•ÌØñõ:N1îTeÄ„"LšFÀÈ´‚/v®ÁKæÐàî-އzµõ^ÐçD_Òy›øòêóY Ý_9Ž (¶AV†K9"º´oÄ‹}+ø&æ5€é4²¸ñéÙb9?ÙÏ6Ê7œž¡«U{ WbÛ42µœÀbÖ=Ž (ÌAVÆL9"Ì´oÄŒ}+0'æ5˜é4²¸óÉééÙÐ ç¡ËU)SÎËÔh§¬$즥ßCaÅ9ÈÊœ)GÄ™öœ±oçļ†3Fs~q‘Ogà!tCW!ª +öít–Üôì‡¶Ê +êå¬ßDa…9Èʘ)G„™ö˜±oæÄ¼3F·‡yy<ÏnŒHå7 ]ˆ *$ δnlšÀÐnYqØQK;¾Â +t•ASŽ4íAcß +Љy h:,n›ÆÑÞû³å|ïÍéò|~v<œO¢m¥Ðt9¢ª‡l`A&d/¡ë´tšyK¬´±€àeEÞ¤ã3ï‚oàø–y§æ¼ idqÞdû\§éQÁZr KmÝ«ÀЭÈiiý8b$ Y1åˆÓ¾1ö­@œ˜× ¦ÓÈâĦ8§ÛÅ—Ž®GT‘ì¡ušˆ~¹¶Œ[7¾É +y•‘SŽ9í‘cß +ä‰y r:,nŠ<ŸÖŽ c +Eˆª‚»œm|ê.äàÔn`¿-Ýø. (ÎAVæL9"δoäŒ}+8'æ5œé4²¸ÏœOæG‡o^Ÿž//NöŽ3¯¦¯fBˆéâè4[«)Þ0£º:ATÈJñööXÓ+ŽPzˆûÜ–uã»/, øY™?åˆøÓ¾‘?ö­àŸ˜×ð§ÓÈâðµßÞÿ÷ü|f8°¿˜¿ŸŸdo)ØWÃùºØÇÃe.Î÷æË㣓wÐ8öÏçù[qïmC—&ª +9µ÷çhIJƒèlü¥ßça…>ÈÊè)G„žöè±oúļ=F7C¿]!œÎEüÜA—'ª +y©Fn’Mòº',gÊúñ Püƒ¬ÌŸrDüißÈûVðOÌkøÓidqÛ4¶(fÏ&Â"ŸqÞØB‚ªdmk<®'zB‘?<Þ?­ón=³Úšê2})—,n÷Lóòqõþ}uŸ]4µ†ÝŒÕt1¢*O@4ø²©aAÔÀ–¨W ®®‰0rœO ·WÄä®7°¥†te¢¾P§‹V}a•Ú3j ¨FdåFA9¢FAûÆF}+Eb^Ó(è4²¸möGûDû‘˜ô®P„ *¹;XÃ5­W|ºS´÷wœ´µ•ˆúB.yÜ0ž®Æ…uLi©ébDUž@Ú(g®Q¢_ŒñFÑ+po˜óÒU×)èKuÊâ–è`É é*EUÁ>VÝ(ìèÝøs6è8Õ&:U¹Kv¨I¦±G ÓŠk:™C?ê¦?@µ/ð7ƒ±+Y¨B2èÇ +=âa´‡¬ã·bÑqtPASvÏ iÓ›–A'ΠéúQèãÓÃÁÒjÈs¢‚o?VÀûm/lÛD3ü„°gÂhó}±ÄfŒ@/†\$þ +ü…Ýb÷½]m²‡ëÛõýåcø^‡ðã߇ogBOŸº„ìþæ/¥z)ùö'ɹپú<“zzwßû²Á:áwßsp÷ãï/ëÛ~yÚo½¨Ïé@endstream +endobj +4533 0 obj << +/Type /Page +/Contents 4534 0 R +/Resources 4532 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4575 0 R +/Annots [ 4537 0 R 4538 0 R 4541 0 R 4542 0 R 4543 0 R 4544 0 R 4545 0 R 4546 0 R 4547 0 R 4548 0 R 4549 0 R 4550 0 R 4551 0 R 4552 0 R 4553 0 R 4554 0 R 4555 0 R 4556 0 R 4557 0 R 4558 0 R 4559 0 R 4560 0 R 4561 0 R 4562 0 R 4563 0 R 4564 0 R 4565 0 R 4566 0 R 4567 0 R 4568 0 R 4569 0 R 4570 0 R 4571 0 R 4572 0 R 4573 0 R 4574 0 R ] +>> endobj +4537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 635.166 274.5352 656.3674] +/Subtype/Link/A<> +>> endobj +4538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 603.5642 179.0052 614.4681] +/Subtype /Link +/A << /S /GoTo /D (a00202) >> +>> endobj +4541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 471.0445 221.2372 481.5748] +/Subtype /Link +/A << /S /GoTo /D (a00135_534d9e416324fb8ecca6b9cb4b1f6a6a) >> +>> endobj +4542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 457.1975 187.0257 467.1251] +/Subtype /Link +/A << /S /GoTo /D (a00150_g88e60aa2cf23e1c65d630701db08c743) >> +>> endobj +4543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 442.7477 190.9012 452.6754] +/Subtype /Link +/A << /S /GoTo /D (a00150_g6020613f5062417d9811cfa837215c83) >> +>> endobj +4544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 428.298 189.2474 438.2257] +/Subtype /Link +/A << /S /GoTo /D (a00150_g5ca559def464ef20d8b1f7d32f2f160d) >> +>> endobj +4545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 413.8483 189.2474 423.776] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1320fd0006a2f70138bc2d0018dda829) >> +>> endobj +4546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 399.3986 191.6086 409.3262] +/Subtype /Link +/A << /S /GoTo /D (a00150_g44b3b1ab31a403ba28ec135adfcbefef) >> +>> endobj +4547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 384.9489 192.007 394.8765] +/Subtype /Link +/A << /S /GoTo /D (a00150_gc84f499cba8a02fc0e306c10b2acabf0) >> +>> endobj +4548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 370.4991 189.7953 380.4268] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1425d4a0c2760adb653a04c0fb137a8d) >> +>> endobj +4549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 356.0494 215.2498 365.9771] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1215163245304bad20d6c5608ad75ab7) >> +>> endobj +4550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 341.5997 221.8948 351.5274] +/Subtype /Link +/A << /S /GoTo /D (a00150_g9f1822e1d231235edacad691f3cb7bbb) >> +>> endobj +4551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 327.15 214.7117 337.0776] +/Subtype /Link +/A << /S /GoTo /D (a00150_g691688604655ea8943d15f14c60027d8) >> +>> endobj +4552 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 312.7003 239.0603 322.6279] +/Subtype /Link +/A << /S /GoTo /D (a00150_g12f3bf821224b8e7b48a57ed3cea15cf) >> +>> endobj +4553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 298.2505 239.7177 308.1782] +/Subtype /Link +/A << /S /GoTo /D (a00150_g5c5b1834e497f53ad0ef947bbe9777fa) >> +>> endobj +4554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 283.8008 204.1812 293.7285] +/Subtype /Link +/A << /S /GoTo /D (a00150_gd58231410d58e34b455328b888a9e73c) >> +>> endobj +4555 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 269.3511 244.6991 279.2788] +/Subtype /Link +/A << /S /GoTo /D (a00150_g207d17b633cd095120a74bc1f2257b17) >> +>> endobj +4556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 254.9014 209.1625 264.829] +/Subtype /Link +/A << /S /GoTo /D (a00150_g4cc3e223b63f27b546d62e9a258dba5a) >> +>> endobj +4557 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 240.4517 305.6302 250.3793] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1cea57e3ea526f210b1068e6dcf7b4f4) >> +>> endobj +4558 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 226.0019 321.0623 235.9296] +/Subtype /Link +/A << /S /GoTo /D (a00150_g62c03e0a308cc23929a80fe8d8f9dc1e) >> +>> endobj +4559 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 210.9495 218.1788 221.4799] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1d3211dbbdfb22d6a47b60dddcf945e8) >> +>> endobj +4560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 197.1025 341.9936 207.0302] +/Subtype /Link +/A << /S /GoTo /D (a00150_g42288d5c3cf4b10becefec657f441e54) >> +>> endobj +4561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 182.6528 341.0573 192.5804] +/Subtype /Link +/A << /S /GoTo /D (a00150_g8387881de3a8bfd3c0d57b9d04ac9b7e) >> +>> endobj +4562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 167.2268 167.0009 178.1307] +/Subtype /Link +/A << /S /GoTo /D (a00150_g24f52ac52d6e714cb04a5aa01be3bdd0) >> +>> endobj +4563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [198.7613 167.2268 256.6538 178.1307] +/Subtype /Link +/A << /S /GoTo /D (a00094) >> +>> endobj +4564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [273.2016 167.2268 305.9885 178.1307] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +4565 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 152.7771 172.5401 163.681] +/Subtype /Link +/A << /S /GoTo /D (a00150_g96544dedc1cdc71ad2ad54bf1d5e5433) >> +>> endobj +4566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.3005 152.7771 262.193 163.681] +/Subtype /Link +/A << /S /GoTo /D (a00094) >> +>> endobj +4567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 138.3273 191.3593 149.2313] +/Subtype /Link +/A << /S /GoTo /D (a00150_g4309376690872fa4beb4f025f5cc199b) >> +>> endobj +4568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [223.1197 138.3273 288.763 149.2313] +/Subtype /Link +/A << /S /GoTo /D (a00091) >> +>> endobj +4569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [305.3108 138.3273 338.0977 149.2313] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +4570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 123.8776 186.9261 134.7816] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb9435261753469accec0c9bf8a5a2686) >> +>> endobj +4571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.6865 123.8776 279.3487 134.7816] +/Subtype /Link +/A << /S /GoTo /D (a00096) >> +>> endobj +4572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [295.8965 123.8776 328.6835 134.7816] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +4573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 109.8015 191.6285 120.3318] +/Subtype /Link +/A << /S /GoTo /D (a00150_g9c0814ed491fa452ec97910c0728d410) >> +>> endobj +4574 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 95.3518 189.2275 105.8821] +/Subtype /Link +/A << /S /GoTo /D (a00150_g013c3a06a8b58589a77f4a3442f89c2a) >> +>> endobj +4535 0 obj << +/D [4533 0 R /XYZ 90 757.9346 null] +>> endobj +1113 0 obj << +/D [4533 0 R /XYZ 90 739.9346 null] +>> endobj +378 0 obj << +/D [4533 0 R /XYZ 90 739.9346 null] +>> endobj +4536 0 obj << +/D [4533 0 R /XYZ 90 716.0742 null] +>> endobj +4539 0 obj << +/D [4533 0 R /XYZ 90 491.1191 null] +>> endobj +4540 0 obj << +/D [4533 0 R /XYZ 90 491.1191 null] +>> endobj +4532 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4579 0 obj << +/Length 2957 +/Filter /FlateDecode +>> +stream +xÚµ\[o[¹~÷¯Ð£ŒF,ï—ú²—, @Ú8}h6IŽ…Ø’V–’¦‹ýïžsHóÜfŽay°}šù8ä7äÌ¡,fþ‰Yà3g JÛÙêî‚Ï>Ãÿz!š·ðþ¢üxuñ×—2Ì VÚÙÕueÁ +f¤³«õû¹ðòr!ƒTn~~õ^>Œ×/^no7õ«Ÿ÷«óÝfwZž¶ûÝ凫׿\e· +£¬ˆN¿xÿÏÖÀîõg*x3û¿p&B³» -UúåöâíÅ?²úêCƒ3B NŒ‘ixFëêѽ<ïV‘ñýeîÀ—”ã,µ+URpË´òúÁNtø›”¦ëKpø”4 +÷˜Q”_¡YàÖ¶ý~½”|¾ß®{¾ …0ßñ­ãçóÏ’EÂS,zv#‹óöðñ~sÚˆ¸S®„„¢Ü{Á¬7÷¿qÃ{~½aœ+19 O2èÚ­ ìÇS—‚„ ÎãCÏ(± ï;Cß®að¢¿òVÎl NÕ’ÕÀ¬Á‹]ù7|æÁ¿ÕÕÀA^Üÿ`´xÊÛÝö´]Þnÿ[gŠêÿ®²Q~0ƵsÚÀÚ¨é ɼµã²µÖ3ÇA˜¸l3Œ”mi‘-á7ɶ嗔mÛ÷Ù,zv“l—ëµ’}ÑZH¥Ê!H(Ê9ˆ[[­:¡­dÎ ?yø O1èÙ­†ï‡4Ë™ÔägT߯Хf¹d°«…îȹŠ~;$a†<|šW˜ýAÉ=r +$àT˜žŒ'ÂÓ·;žÓŒaÆzGÄ'¡(ÇÆ3nBgeì¢YÍ(æup³ZƲZ‚E?-ÇïuÛŸOõ‹eýCÉŧmú¯õz‹ç7 Ü?O~SœqYž€†ó[‚Ñù­0ØõX-F8•QLÙb—³`Énp… û!¥'A~ÜÑô4˜Rô®MÒãêæËýù®Ÿ§`¹†€R\$å;&=,¼öÄ eÇ !2pÂm»}“ ºvÇå‹Uq‰<únÛÉQˆì |<9ª&9~Š»çùºŸ£Ü”US”ñD€úvÇd!ó)!ˆ%åÒ"‡p¶ßnvhz~Ú‰ÙñŒ%ÇUçÆÛÕùvyj +ÄÓMóâÕî´9î6Mj\] +3¿Ù¬âLU +ª“é¥àó¯›c+£6³y)üüÞBÌÇ*× Ìȧb4ŸžÒ<ù4ÃÈ|Z|r>%Ø%\‹žO1zΧ½„kÓƒ|º=ŒdÔ`™Ñ-1–‹Œ¢üX¸š›ÎäANMoL@εڷ˵q•hDB†j¨)¦n6ËuRɈ’®;=,kDTXaifÛÔdq²â̸ÒLLQR©g9º#™5NPRK0Zj…Á§K g—¥V²#¤†Ð{¼ÔpzYj-z0˧ՈÖbõu›Di.2Š ¹‚êЇöìMÕ„ ä¡'j­@cZK0LkW?½y²À†DUom»õÃ;ËÃa½<-Ç¥&-/‚y© §MQRK0Zj…A¤ BøÍ"*ý’]¶ï ]‚EÏnÞ–vÛ¾š!¡„¢|ÃQv¤Žï©2=A 'êJ4"“ {z#OC­#Œqϲ„µ3±"2ÄÎ0r —Ÿ¼[ì®Å®ª$÷»Þa¸we¸È¨¾ïVA%ŒfÚyщLSPµ—v|rÂEÇïøèž}Ïn9úÍj žäÌj'ðdá^‚´`vÝôKi)`ÅGGñ$ƒ®Ý‡ƒïr½>ŒP,ÇÞ„"–€´´¥ÍðÀŽÇšà¥æó^]­¸‡ª‹Û©ÑÊx"Z}»£G+0¥dåX)¦|Çïñ°?žÐ$l9dª›—“pÆ’p‚Ug•F%õÉcß*“—ÊÍ7wût¹Ùß7Àóýv÷ùáP#r¬×:@Žáyµ²pÞ5ŽJÔ F'êÂàÓ5Î.'ê’]Têy=’¬$7!Êr‘Q}ÿídí Ys¥:ÑJÖ^0ïzÑAŠ4x*=»ev›Kiæßú ¬ *EPÊ3eTw‰ %l-˜uPÈO BÆS zvɄƜG ¡ˆe ƒaÜs9¼ °&(š°!¿éJîÓ¢•ñD´úvǶ±p¸x”ˆrk|¬«]Û-¯¥`NO|LT€±lÝ ¢ÿ·© +<Z‰”#¢rª_ÞýœªÌ:µ£‡h8æ8ïųäfäTAu73ŒÌÍ¥A¤$ü¦¬ÛòKÖmßê@‚EÏnÎ|»ÛíýiÓÏý^3á ÜxŠòïa[:Ñ| ŸòZOŽ@“ ºv‘G>2d †žQ„cY=I%µSJV^1nÕÄŽl‰F´œa•˜OûFÅõÈ'ªt +Ë} ûÃfµ…-7M‹'’Õ´r’ ®Ÿ§ªL`°eRmÔ £5]Ä4ûÍš.ýÒšnùž¢iœEÏnÒôˆ¢áüõ¢%bP”wg™ãZvb?¨h^?Ò›:þ„§ôì"÷Ò$sÂ|èE8–ÜÄGr¡“ŠÖ +Ú0±ï[¢1E'X­èåñô‘t<Á¨ŸGÒ’3c4Õ®Í0ZÒ…ALÒ¸ß,éÒ/-é–ï)’ÆYôì&IŽûÕæþ~èú˜áÒAH(Ê=ìæ!(Õ þ ¦¡ŒPÃO @“ ºvǯ­Ùx?@â#Ï(¯䞙ØÓ«åç!QÃBVñ«÷ãOÛK¶ÐŒ^èˆÇG÷ +vY%;ü FïÑ z ×¢ws¸þ´ÖC¹‹ÎWFQŽm<ïŠN\bÓ>ˆŽ_¤áÜàI]»ã3âýiE =¡(Ç!žwµi;þ{&Ë[lã‹/§n|%Ùø2¬i"ƦÀ×MÚþ„}¸²øûy¹;mOÍåÆëã¥6óý]·£øé{ê2î«¶c¾E¶ÎÝæômü2ŽFoñȪóôL;hlysNî  lµïŒÄwІ¤Œ–_rmûž°ƒ,zv¾­±øªgÞ[MD ¡(ßN±ø,¦xÈ +ÈKÍ:+ãÑiŒiËb}Ê'÷Ãâ#öéf:øá7å¤ü¥Íħª%Ób‚Õ=¢t ÒkD²ë?WçcÝÜO´'ôФV§ìÄæV‰þò”䑾­wú]9_·ËO·›¡oPÅþ…ÖŒj² šÌ0R“˜ÇGoö»„k±Ã:Âñ +€§XV{¾¥YÚxä3d™p=–1‹WáîÎrJsÏžP м>õm§¾n“aôŸ>Ç8»<Ç%»isŒ°|üã,ówY®ƒ3 SÆ•p(G˜×Eî¬Âr欦¾™aô Ÿ>Ã8»<Ã%»i3Œ°|ü ã,ó wYÂënyÿ¥?űǢ5Jr÷¢ +EO±vÌOÍpƒ¢'øÁÜÓ祖§· ã¶9Ý|ÒFU(8(ŠSË2y€ ‚b‚ PV¯cÆBÑ…0\dî;æz8÷´Ãó·úpñÇüEþ÷çŸCÛ»21CøñUS°e“`ôºA<>~áàìòÊ)Ù õT„‚Or²›ºfÀ„¨:>»„k³+®—]RäpŒC'-£(÷1ÓqÿþÝ«7Œ÷^ß½|ûêß¿üE~;– +Xx°ûˆiÇÒœ¨3,’¹J§æ|aqèbîc¾SW¡Z>K5,Ÿ(a4 RÆ:õ˜{᩹bÖà:tŠ®5-™òÊ´¨! ¬“ìØÌßL®¯M÷û8"Þ˜0xt ,†xÃlð$ÄÃ>éOWT“îá#¢xÞÕUõÍh_]^ˆ«WÃ’q~ºº.üu³Û—§ô¼!•„O/^Ç+çæ!›Ÿü©~Íßèˆçš.Nì:íYä?æñé{úSÿùþ¹ÿ ,þuD­ˆÒÿ‡w‡endstream +endobj +4578 0 obj << +/Type /Page +/Contents 4579 0 R +/Resources 4577 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4575 0 R +/Annots [ 4582 0 R 4583 0 R 4584 0 R 4585 0 R 4586 0 R 4587 0 R 4588 0 R 4589 0 R 4590 0 R 4591 0 R 4592 0 R 4593 0 R 4594 0 R 4595 0 R 4596 0 R 4597 0 R 4598 0 R 4599 0 R 4600 0 R 4601 0 R 4602 0 R 4603 0 R 4604 0 R 4605 0 R 4606 0 R 4607 0 R 4608 0 R 4609 0 R 4610 0 R 4611 0 R 4612 0 R 4613 0 R 4615 0 R 4616 0 R 4617 0 R 4618 0 R 4619 0 R 4620 0 R 4621 0 R 4622 0 R 4623 0 R 4624 0 R 4625 0 R ] +>> endobj +4582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 704.2391 180.1912 715.1431] +/Subtype /Link +/A << /S /GoTo /D (a00150_g22f140b02c354dfebcc7ad481c3bcd68) >> +>> endobj +4583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.0068 704.2391 208.6941 715.1431] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 665.5553 177.9699 676.4593] +/Subtype /Link +/A << /S /GoTo /D (a00150_g6832e4d2d046536b6472f7ac92340f68) >> +>> endobj +4585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.7856 665.5553 201.4916 676.4593] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +4586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.8776 665.5553 256.5649 676.4593] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 626.8716 138.5977 637.7755] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 626.8716 189.7953 637.7755] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb6683dd83fe1c8de9a24086d4b69e907) >> +>> endobj +4589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.6109 626.8716 218.2983 637.7755] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.84 626.8716 266.5273 637.7755] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 588.1878 138.5977 599.0917] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 588.1878 197.5461 599.0917] +/Subtype /Link +/A << /S /GoTo /D (a00150_g2addf34c7d457c1a7899a7e2171ef1e9) >> +>> endobj +4593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 549.504 138.5977 560.4079] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 549.504 201.9695 560.4079] +/Subtype /Link +/A << /S /GoTo /D (a00150_g85b65e38aa74eba18979156f97a94a87) >> +>> endobj +4595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 510.8202 166.9111 521.7241] +/Subtype /Link +/A << /S /GoTo /D (a00150_gc48ed5f0d27721ef62a3ed02a5ad8d2e) >> +>> endobj +4596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 472.1364 152.9837 483.0403] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +4597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.9538 472.1364 211.6433 483.0403] +/Subtype /Link +/A << /S /GoTo /D (a00150_g9c24fba2cd8f7f62accb0a0d5bbe4dad) >> +>> endobj +4598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.459 472.1364 268.3701 483.0403] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.2043 472.1364 331.8917 483.0403] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 433.4526 172.9089 444.3565] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +4601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.8791 433.4526 236.859 444.3565] +/Subtype /Link +/A << /S /GoTo /D (a00150_g79c4110211247df3fb30b8cf1c4c02af) >> +>> endobj +4602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.6746 433.4526 293.5858 444.3565] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.42 433.4526 357.1073 444.3565] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 394.7688 185.1725 405.6728] +/Subtype /Link +/A << /S /GoTo /D (a00150_gaa585784b0914cac1d37f07f85457008) >> +>> endobj +4605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.9881 394.7688 213.6754 405.6728] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 356.085 175.2098 366.989] +/Subtype /Link +/A << /S /GoTo /D (a00150_gdd1ab3704ecd4900eec61a6897d32dc8) >> +>> endobj +4607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.0255 356.085 203.7128 366.989] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 317.4012 183.4989 328.3052] +/Subtype /Link +/A << /S /GoTo /D (a00150_g266263ac78a1361a2b1d15741d3b0675) >> +>> endobj +4609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.3145 317.4012 207.0205 328.3052] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +4610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 304.9087 138.5977 315.439] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 304.9087 162.6772 315.439] +/Subtype /Link +/A << /S /GoTo /D (a00150_ga22b04cac8cf283ca12f028578bebc06) >> +>> endobj +4612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.4928 304.9087 191.1801 315.439] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 265.8513 171.8826 276.7552] +/Subtype /Link +/A << /S /GoTo /D (a00150_g04b053a623aac7cd4195157d470661b3) >> +>> endobj +4615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 183.3435 166.8215 194.2474] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 183.3435 221.3367 194.2474] +/Subtype /Link +/A << /S /GoTo /D (a00150_g7d3673f52f5846b6961d23b150decd54) >> +>> endobj +4617 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 170.4773 166.8215 181.3812] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 170.4773 213.028 181.3812] +/Subtype /Link +/A << /S /GoTo /D (a00150_g20df5c82f2a15a508c19e505b5d9de2b) >> +>> endobj +4619 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 157.6111 166.8215 168.515] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4620 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 157.6111 220.2307 168.515] +/Subtype /Link +/A << /S /GoTo /D (a00150_g3237be0d9ec457de0177689ee23c0d5c) >> +>> endobj +4621 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 144.7449 168.4754 155.6489] +/Subtype /Link +/A << /S /GoTo /D (a00089) >> +>> endobj +4622 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.9735 144.7449 218.5572 155.6489] +/Subtype /Link +/A << /S /GoTo /D (a00150_g499bb98a0b4ae9a98553ede81317606d) >> +>> endobj +4623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 131.8787 133.6164 142.7827] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +4624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 131.8787 166.9014 142.7827] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +4625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.3873 93.195 192.0768 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00150_g561b8eda32e059d4e7397f776268cc63) >> +>> endobj +4580 0 obj << +/D [4578 0 R /XYZ 90 757.9346 null] +>> endobj +4581 0 obj << +/D [4578 0 R /XYZ 90 723.1038 null] +>> endobj +4614 0 obj << +/D [4578 0 R /XYZ 90 202.2081 null] +>> endobj +4577 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4628 0 obj << +/Length 1404 +/Filter /FlateDecode +>> +stream +xÚ­YÛrÛ6}×WðQz ŒÅylgìi×Vž\G–hGS[rtië¿ÏBXP©êx<âå{°{v ¡ ø…¥…–šX.T1~íÑâ/é¿]âý2ü2ì3[XbSÅði3‚"°b8¹ëÂÌ d’ö×Ó·3ü'ãíéùô¥ÚÝTOÕb¦_ÍÆî’1ÜöÁðÁýð²÷yX[÷ä$WàlÿèÝÝÓb‚$/{”pkdñ7žPÖ²âµ''/½ÛÞïõ8Û›öÍQPI 7EÉôvV¨ª (†^aèÍj§HZ|\ çÀ›T[S”óÌõÀÐþ|:[áä7~XÍýïwï˜ÑÛÛËt±kNŒ”dXÊÇUáTÈ\\,×hÀÓãšfWÇ5f·6ûÂʈb’ì +—®È˜,»€k²Ã°º.9z^¶# D .’$KãAÙ†b†pÉsõ¨|\ÿîô°&©ÕQ¨9·ç³v6H@ãZ¤è•5¨e¸±”L(¡ 4}²oEƒ‹w+)4vÏ;À3óÞ59o‹‡;q%æmeŒïxÜØò€A-äZ^€¶N¯‹׸ñ½nøñÚßÁéUc·€ïîdsS6ûú^xKc1ÑÎ$F ËfF<àÉ©‘ap vÙäH1<´ê…äÈ1 ¸½ Û5ÏJt·`IŠeÊ·¸e¸i¿ûvqýðñëÕÕíýží²ÔŠH¡y·^"@J/–×KÂâñzI³«õ³K¯|RôŽ^ùdè\“ž[åO—«jö6_¬–ûJ éÈÕ¨ \C±ž5(l$óëÅíðóÕõ×›Ârµ_<Ši;Ö`ñD€”x,/ž„ÅãÅ“fW‹'f碳žt\ÁX`:í—Õ¶ßìÇK å|Ç;û2.ŠŒny§ÛŸó@kÜœ7Äp ¬8n/*…!J‚Í4æÖØ‹¶úï·O‡÷_éjƒý6’’ ¢Eö½W ËgD4àé‘fWgDÌî°ŒH°<´ªnóAdY\'Ëe[¶’0#L’fY£2ÊEk¹C`SSQu‰V ˜–B·v"@J;–×NÂâñÚI³«µ³KnVSìŽÞ¬fØ\“jf4sÖ–µ"T*›YÊׯµÞ×܉û®z$¬"F(vX݌щºYÜqQ>¾¯Â'¬œ û£wÿNnYM¶GOóÅÎ.‡³òqê ì²ú±ö_kðl¶~} ›£ñèe¼~Ù|³XvÖ\a$v’ßÞ —ævïꙢ§AI}Ò÷ Mú|8?j)b57á£patüRͪÅh\¾Îü.K×þ˜ÿ¥ÿÀèöŒQª¼£Löƒ³×¾qñÀG™OóÞŸÛoÌ$fq ùç'„ëÝÀendstream +endobj +4627 0 obj << +/Type /Page +/Contents 4628 0 R +/Resources 4626 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4575 0 R +/Annots [ 4630 0 R 4631 0 R 4632 0 R 4633 0 R 4634 0 R 4635 0 R 4636 0 R 4637 0 R 4638 0 R 4639 0 R 4640 0 R 4641 0 R 4642 0 R 4643 0 R 4644 0 R 4645 0 R 4646 0 R 4647 0 R 4648 0 R ] +>> endobj +4630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.3873 702.9085 195.9522 713.8125] +/Subtype /Link +/A << /S /GoTo /D (a00150_ga05a3dde2048480fa3ab2a5961898d18) >> +>> endobj +4631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 689.9571 138.5977 700.861] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 689.9571 170.976 700.861] +/Subtype /Link +/A << /S /GoTo /D (a00150_g12a33f0c09711167bdf3dd7d7cf8c5a1) >> +>> endobj +4633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 651.1028 138.5977 662.0067] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 651.1028 174.8513 662.0067] +/Subtype /Link +/A << /S /GoTo /D (a00150_g5b5615dc240daed20949c0fded2b4679) >> +>> endobj +4635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 638.1514 133.6164 649.0553] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +4636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 638.1514 172.6397 649.0553] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb4ef6b00924990e7a293f66715b6d1d1) >> +>> endobj +4637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 625.1999 152.9837 636.1039] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +4638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.9538 625.1999 200.0271 636.1039] +/Subtype /Link +/A << /S /GoTo /D (a00150_g788ffac72342f6172343d7f8099cbe1a) >> +>> endobj +4639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 586.3456 152.9837 597.2496] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +4640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.4818 586.3456 196.4305 597.2496] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf703683056d2bfa5c81fa157dcb20fe2) >> +>> endobj +4641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 573.3942 138.5977 584.2981] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4642 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 573.3942 200.3154 584.2981] +/Subtype /Link +/A << /S /GoTo /D (a00150_g236d5c7872f59c8fe7b701c7252b976e) >> +>> endobj +4643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 560.4428 172.9089 571.3467] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +4644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.8791 560.4428 239.8777 571.3467] +/Subtype /Link +/A << /S /GoTo /D (a00150_g210f227119fc972e6222c9cb452e15a9) >> +>> endobj +4645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 521.5885 172.9089 532.4924] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +4646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.4071 521.5885 236.281 532.4924] +/Subtype /Link +/A << /S /GoTo /D (a00150_geb533744817cf6695d75293369c2248b) >> +>> endobj +4647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 508.637 133.6164 519.541] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +4648 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 508.637 177.0532 519.541] +/Subtype /Link +/A << /S /GoTo /D (a00150_g2a0cf5d86c58fab216414ce59bf1fea1) >> +>> endobj +4629 0 obj << +/D [4627 0 R /XYZ 90 757.9346 null] +>> endobj +4626 0 obj << +/Font << /F29 499 0 R /F50 1172 0 R /F23 482 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4651 0 obj << +/Length 1995 +/Filter /FlateDecode +>> +stream +xÚµšmÛ6€¿ûWí‡ÚÀ™á»È (Ú˶½äp@.ë~j‹@±µk#~Ù“dôúïo(‘\Ê”IånÁƲ4šÎ<e‘9†d®ñ¼ÒŒËùæ8ÃóG8ýóŒØË+¸¾ +þºž½ú‰ê¹FZR9_?t$A‚:_o]Å—+ª)+—·ïáPàA¸?øi¨ú£»óær¬NmÙîϧåïëw³×Þ¬õJ0IŒÑÍ~ýÏ·àÝ»FL+1ÿ¾`D´¦óãŒSæ¾f÷³z=ý…Á ÂÆGG8‚3Ô Âh‹~t +Q½\Œñâ²zhw=´ÕCU/‰ZT§Me†Öë$H Ñ鄘•êY%"Vé]Õ– hkƒT5›zÿäBzXy£†#ŽY§æoU¹³Ý}¿aL7g{²ÝÙ3>-ë7ï_¹ã¦-7ŸÑu"”@˜¨b.™FJâqFœÐ*”ŠAQaÌ@— H¡:¯X‡Úݹ~}m›`Š +FIÚ¸—±‹à„‰gmùmy´¡¾œ>/ ^T‡¦5!ÁÝ’"ÎÀÔÝõmäjQ ¥ yåjùóÜý=pÛÝ1â¶ ÝŽ4Jpûû-x Þ¢Íùxí-L¥Ó¡óR±ƒÁÇڌ߹"Ê©¤n)y'º6ä1e ‚9pä1%{òúÓ;˰9v ›ãÍ +ÅþÔôß¶•¹vÚ›iaOu›ƒ²ÿ8]ŽŸœ¢óCÿù¦7w,7õÙÞÖîÊÖÞW;3ùÌѧ?Ÿ†¡šéÖÏaÒ ê©>?Öå±éñ)íçÕá0<³?µU}*Ws¯ië˦½ÔUó—x2ü,hõžlqx¸œ6]eè¾m«Í¡¬»jÚ ïo$å}9ÏÕâši¡“TÍ…¢H^ô ™Kõ£•ùND'¿ +o™ˆ‘^ã]_H£i¥R_¹p]œTÎp¤ÍFãpÒ­”Óðëýis¸l …ú+ðøüÔ¢ÝW7*<ƒÒ,d_âïʶìc}o³Ù-ÍȺ' N ÕñÖj +Œ•9 •Jñg=Æþo”Џ¼Â]jZÒ¢—ÊÙ…%Sc)‡v{v#ËPFcêÊòm²œ|·H¯%ë#ÔS —D’p™¿ÔEPx#,Ù Ž«@R¾âc”z?ž+ðÓÔCðÖ{\h5÷bÆÏÕS½„¦©j|WÔcÊW7ïãÅ»?0ƒ«ºJ€â÷q ZÁXÚ{ë9ÂTrÒv}rB»¹ä ,OINÚ‡HoЯܚ8 +A~d.V*›AÁ4›'–ÏM 0•›´]Ÿ›Ðn.7ËSr“ö!ÒërSµ»åv,5e& +†Æ9ûÂ^’1‰0 zŽñ¥Ü‹}A/ÉÕêÓÞ®¨?šuùäÖ×n‚ææ +Ë( CM„—õyŸ7ì@#…µ@RV„OKF·èÔôCêÆ¢a°X{±,ÖI‹ÏXgì:¬v¿¶OÓâç?\¢‚Âä¿M¶“Ϲéõ* }†n;¶&h¤ ø¤#á¥2.ÄÚº `mø$·x£‚‚ód"q¡tbÚx1ãŽo/]‡ëºÛ`> gR»s½© ß͹B9A…¤/²£T!©InæÅò„ +S„§ízÂC»ŸBxÚH¯#ü1A8ÁfŒ* /•q!Ö6™pȼ¤ŠO$\k è†öôX6Ÿc¼•ùyY%Cà…Òæ#]“ÙfqN&6õ¡tŠm'6ζÇmXÍ+ +о ­Ð°sBdW'–ç5P˜6m×Ú€ìÀøfÓnDzƒ®ãVM†õ’D®DÔZ©Œ±¶©Üj‰Wd¶p‚Z'5Þp¼PA6ïÁ^›£Ã"Eñ?½ÁÔq¯ÌCJÆÂ­«Dº€ +Cfn4/+9Wú!ŸªºlÝóm·÷þ‡;x·$bq±_µŸø5e¯©}U‹b,í‹K +ª¯~ûñït™÷$ú7ºþýçcýÆe^²‰Òsµc'endstream +endobj +4650 0 obj << +/Type /Page +/Contents 4651 0 R +/Resources 4649 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4575 0 R +/Annots [ 4654 0 R 4655 0 R 4657 0 R 4658 0 R 4659 0 R 4660 0 R 4661 0 R 4662 0 R 4663 0 R 4665 0 R 4666 0 R 4667 0 R 4668 0 R 4669 0 R ] +>> endobj +4654 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 638.4748 274.5352 659.6763] +/Subtype/Link/A<> +>> endobj +4655 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 579.3616 179.5632 590.2656] +/Subtype /Link +/A << /S /GoTo /D (a00203) >> +>> endobj +4657 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 504.4427 177.6109 515.3466] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +4658 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 465.3492 197.5362 476.2531] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +4659 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 426.2558 175.9567 437.1597] +/Subtype /Link +/A << /S /GoTo /D (a00093) >> +>> endobj +4660 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 387.1623 196.4301 398.0663] +/Subtype /Link +/A << /S /GoTo /D (a00094) >> +>> endobj +4661 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 374.0913 204.1809 384.9952] +/Subtype /Link +/A << /S /GoTo /D (a00091) >> +>> endobj +4662 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 361.0203 199.1998 371.9242] +/Subtype /Link +/A << /S /GoTo /D (a00096) >> +>> endobj +4663 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 347.9493 193.1026 358.8532] +/Subtype /Link +/A << /S /GoTo /D (a00089) >> +>> endobj +4665 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 264.6323 210.8161 275.5362] +/Subtype /Link +/A << /S /GoTo /D (a00144_g12b467f314489259dd718228d0827a51) >> +>> endobj +4666 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 225.5388 211.922 236.4428] +/Subtype /Link +/A << /S /GoTo /D (a00144_g20bc87e5c063c3f4b01547be6e5a0148) >> +>> endobj +4667 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 186.4454 202.5074 197.3493] +/Subtype /Link +/A << /S /GoTo /D (a00144_g41d37ea1e3bd24f7b51e9409aceaaa80) >> +>> endobj +4668 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 147.3519 209.7101 158.2559] +/Subtype /Link +/A << /S /GoTo /D (a00144_geb79c914cf137e6d27fd7583e5a66679) >> +>> endobj +4669 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 108.2585 203.6134 119.1624] +/Subtype /Link +/A << /S /GoTo /D (a00144_gd8e8bc9bc0e2ea4a24a8a024fd3a7f7c) >> +>> endobj +4652 0 obj << +/D [4650 0 R /XYZ 90 757.9346 null] +>> endobj +1114 0 obj << +/D [4650 0 R /XYZ 90 739.9346 null] +>> endobj +382 0 obj << +/D [4650 0 R /XYZ 90 739.9346 null] +>> endobj +4653 0 obj << +/D [4650 0 R /XYZ 90 716.6946 null] +>> endobj +4656 0 obj << +/D [4650 0 R /XYZ 90 523.5122 null] +>> endobj +4664 0 obj << +/D [4650 0 R /XYZ 90 283.7018 null] +>> endobj +4649 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4673 0 obj << +/Length 2412 +/Filter /FlateDecode +>> +stream +xÚ½[]Û6}Ÿ_áb_l`‡á7©‹b·iŠ»Øl:}Jƒ@ck&B=’k˓Ϳ_ÒiJ´.™Ö]Çöñ=—Wç\’¢MØü#‹/”P¨`\.ÖO7xñh^þñ† oßš÷oCÀ?în^¼¢Å¢@…¤rq÷pŠ ”ÐÅÝæýR#Z¬n©ÀËc½{aþ£OýÓWõ¶êÿzW=TûÑ˪YÛ—´¢jI´X}¸{sóÃg’LËýÛÍûx±1I¾¹ÁˆZ,>›'‘¢ ‹§N™{²½ùéæ?>NÿÆé—ÆÈ±@šéÅ-Uý¨P& +IÍ#EZ21_4 Ä=c_4`‰8Ó|áa¶t¿PÕ€`ó)*Ø" gåP)^ÂQ¥óþeSý‚1mªˆœKd® ™Û·öæ]˜†Ã§ÒˆâÚ4ŒV>>V]SuOåá×i.Ô Q“BÃ…ð¨Dq´ÓÀ—›ÍÞ<’øBôW^aЍ Vɾ ѧ,^h“…ä§:Ðae³p0›ÅU×û¤û4f( šËIĸn¬Æß­\©´ÑfB·(©Ús0@³ £SlÀ˜ÖkH›¡V0IL§ÔºÙ»(m²¥L‚ãv˜vÉÉ’¦” ÅŠîûþÙt[×{ŸËm]Þ»ƒ`;æúaòÖÙFu39³×§ÜíΤ÷ö˜áø`Ï’R‹³ÙEÚL}×hÔLT–jÔ–tU°U‚×ùjÄ›6Ö˜<ÃY‰4¢¸~­s:õœ±5ecÄØ,†G%²ˆ£å¸ŒI³w(Tæ D.ó°|—™)í¶}¸½7³ÚÔhvýÂäñt¾ÖtgÄÙ;g;~*ÝYÝ~_?»ÕP;õÖy5ï !aú:ÛÆMTI ¨´Îá ÿ€¤Þ>i†{Bæó€9L£ú›ðÛöP]$i¦rÏ`H¸ê´TYtYm·éª~«Ý¯.Z¿u·NL¥b ]žÌ+›cD0#WYYPªe…LIÛÁÒÚBâ†y½ºCÞ yÈsô §Å ¾3ËÃhã+L½8ITÁ¡RôQ´Ü;öûL³Ü6 !µ;˜Í╽ÝX»·Y»Ð‡üÖ=YqßWUãïeº;‰Ïu{<¸ ±+úéÉçÚì&ÃgŠ"Y0=ÿ¬<>Q‚8n¨ƒ¹ÆÃØ…à—¯Fð…ê•È!Žfs˜o˜ NùuNñˆÖHH’:²ö°d“M"ÁëšÄˆ7Ý$ÆäM"‘F׉c_ºòÒ:®@ÌlsUp¨}-g2$Š!•»Œ À@{p¨þ̺yv/øë¸}¸»b¾9̵„sÓÈhi*Ùxì@oàðð£¨Y$µ½fñe87‚ˆbmÁü7KmyµáÒš¦Ö–n A@¨-À¼¾-„¼maDžÓà4¢¸Á!f0 Fßcfq‡)\ J$GËjL LenwÐP{p0›ÁëÃ×.æ0¿›åfu®®4‚(æÉ)ÐÁÒZBZ‡y½ÖCÞ ­Ès´§ÅuZ79P±ü|º!{á[óìÔ¸ÀJ8T*…(ZŽÒ ‰×y:?c• PãÍiÖú •Ïe½µ:ß]ú]A„«‹›)äúÉßIà÷'Áï%*”Yô¿[’ètÕTû²›Þÿ—ûãñqxBèðˆ¿¥ì[Šûgc9|KÁ*Ä}Sáøzð·ÙX¿‰ð²ýï—ÇøDv©>ÿK¦~cendstream +endobj +4672 0 obj << +/Type /Page +/Contents 4673 0 R +/Resources 4671 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4575 0 R +/Annots [ 4675 0 R 4676 0 R 4677 0 R 4678 0 R 4679 0 R 4680 0 R 4681 0 R 4682 0 R 4683 0 R 4684 0 R 4685 0 R 4686 0 R 4687 0 R 4688 0 R 4689 0 R 4690 0 R 4691 0 R 4692 0 R 4693 0 R 4694 0 R 4695 0 R ] +>> endobj +4675 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 713.9553 210.8161 724.8593] +/Subtype /Link +/A << /S /GoTo /D (a00144_g5323320b7316647042016f17c4e881be) >> +>> endobj +4676 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 675.2769 185.9198 686.1808] +/Subtype /Link +/A << /S /GoTo /D (a00146_ga4360412ee9350fba725f98a137169fe) >> +>> endobj +4677 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 636.5984 198.084 647.5023] +/Subtype /Link +/A << /S /GoTo /D (a00146_g1024f8a5fa65e82bf848b2e6590d9628) >> +>> endobj +4678 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 597.9199 213.1775 608.8238] +/Subtype /Link +/A << /S /GoTo /D (a00146_gfd5ebb56a1bd1da9878aa886a2075e80) >> +>> endobj +4679 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [242.9955 597.9199 285.9441 608.8238] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf703683056d2bfa5c81fa157dcb20fe2) >> +>> endobj +4680 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 585.0564 222.4327 595.9603] +/Subtype /Link +/A << /S /GoTo /D (a00146_gbaf0bb2b6a4424b4eb69e45e457c2583) >> +>> endobj +4681 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 546.3779 205.2871 557.2818] +/Subtype /Link +/A << /S /GoTo /D (a00146_gf20aaf4292cb0d2a1b10bc0a568b51fa) >> +>> endobj +4682 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 507.6994 218.0093 518.6033] +/Subtype /Link +/A << /S /GoTo /D (a00146_g2c64c8c36bc84f9336f6a2184ea51883) >> +>> endobj +4683 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 469.0209 242.358 479.9248] +/Subtype /Link +/A << /S /GoTo /D (a00146_gf5c2ad5acf3cc23b8262e9ba6a15136b) >> +>> endobj +4684 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 430.3424 211.932 441.2463] +/Subtype /Link +/A << /S /GoTo /D (a00147_gef14e83c046e19ab9fe9d1bbcca276c2) >> +>> endobj +4685 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 417.4789 194.2086 428.3828] +/Subtype /Link +/A << /S /GoTo /D (a00147_g1a1bc437c09ddef238abab41d77c3177) >> +>> endobj +4686 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 378.8004 207.3095 389.7043] +/Subtype /Link +/A << /S /GoTo /D (a00147_g8411c95a4d89367ad2d9d6bde1a3d537) >> +>> endobj +4687 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 340.1219 185.9097 351.0258] +/Subtype /Link +/A << /S /GoTo /D (a00147_g61db1dcb7c760e4dd5d60bf4e5576dca) >> +>> endobj +4688 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 301.4434 185.9099 312.3474] +/Subtype /Link +/A << /S /GoTo /D (a00147_g88d2ccf7cd821f89d9a8df7e3948b56c) >> +>> endobj +4689 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 262.765 182.0444 273.6689] +/Subtype /Link +/A << /S /GoTo /D (a00147_g0a8bb9d6d0f1f56852ccfccbbad6c5d8) >> +>> endobj +4690 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 224.0865 196.4303 234.9904] +/Subtype /Link +/A << /S /GoTo /D (a00147_g64a238a5c02640a7a4aef004163aeb47) >> +>> endobj +4691 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.6975 209.5536 410.5505 219.4589] +/Subtype /Link +/A << /S /GoTo /D (a00147_g0a8bb9d6d0f1f56852ccfccbbad6c5d8) >> +>> endobj +4692 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 185.408 190.333 196.3119] +/Subtype /Link +/A << /S /GoTo /D (a00147_g81ac47cee1c18f6aa479044069db7ca3) >> +>> endobj +4693 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.83 170.8751 416.683 180.7804] +/Subtype /Link +/A << /S /GoTo /D (a00147_g0a8bb9d6d0f1f56852ccfccbbad6c5d8) >> +>> endobj +4694 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 146.7295 224.0965 157.6334] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga9de254b8aa308eb4aab17efdde622d2) >> +>> endobj +4695 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 108.051 198.383 118.9549] +/Subtype /Link +/A << /S /GoTo /D (a00147_g26a14b8dae3f861830af9e7cf1e03725) >> +>> endobj +4674 0 obj << +/D [4672 0 R /XYZ 90 757.9346 null] +>> endobj +4671 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4698 0 obj << +/Length 2146 +/Filter /FlateDecode +>> +stream +xÚ­›]oÛÆ†ïý+ôFê=ûýÑ›mN{ @NãsÕ…"ÑŠIt%*ŽûëÏ®È]/µÒ̶Ç+ëåÌpô¼ä.I± õÿØÄщQ†8!õd¾¹¡“¥ÿó7lxûο— ¾»¿ù×ÜMqšëÉýÃ1‚fDqÆ'÷‹_¦ÌêÛ;î¸0ÓÃë·~¨è”Ú~X­›~ôª6Ͷ›u«v{ûÛý››ß§´CUJh’þyóËot²ðÕ½¹¡D8«&Oþ%Ì9>ÙÜH.â‹õÍ»›ÿ¦8ýÇ Î휤ŠXa'wÜô»“‰ +13„iîsâ8—»å…TQóÒ-‘u‹QM¤°r’d¡g¿r®N{À¨ßŠ+1É–UE–—Iâ¨Öã¼_-š_)åÛ¦H.51ܰ“äá­ÝrÐüœ—õXEÜPÆaõøûlþñ–Ñi³(J±# Ò‡¨Â +(¢ûïGþ‡•ŸAÿ¡Ê ÚÁ€ â»\}¬@щõhy¬€;B³/ACÿ™í{_<în½sš[¦¦ŸVía¿~îÿ¾÷^éG‹Y7ëGï›fÛfó[N§·íÓºY,ûF~{io´c„û7hçiׯ®´EhO2”ö< @;’7Ò>Ê‹Ó>N^A;RF7Ò>o·ÛfÞ•´s*‰åÖÂ}H*¤€2Z íZ "¤¨ƒ=¬GÕõîÃp.ºNÇ×öÝ)á©c—±VœxÖØu¸ŽHÍÆu”á\g!®á¼‰ëAYm—Þ¾K§”Ãë·—ÉV–H&ÕUæÜR*"ÙQ†“„Ȇó&²ó¼d’× —QÄd¯¶«n5[oöûò≠~ÚŒ4"© +ÊhU| J”qª’ïL ñe¡‚›îð¡#ý‹Íìóê°‰ o%.7éÚá~õ×°MØŸÞ½;îJ?‡y8µÍa×üãÆ/>"÷ž9¢9Õ×ñ‡w€vNbþˆ2ÜY@ÈpÞäÌ"ó³tÒ8½ŸÖ_ba)±\›«FhãÑTØò6ÉPÃäà y£aFyqÃŒ“W)£ˆ sX„¦=NrÃEM~~ꉗnHR!•”Ñ¢0 ‡”'À1Sé¡L y(ÊB?û@§Ÿâ¬h¸Õô¿Woë™–œPÁ¯sƒIø2cc:Êp¦³€ÓpÞÄtž·‚éQò¦á2Џ9ÓïWÛ3÷—xøÔ‘6$’¿Œ–“üuœcï:jßKæ°û‘ êL Ae¡ ïB#šÇËáA·nçqZöâ2ñ~ªÈ…uW!ž‡‹Ì`$J| ɉåʼn'¯ )£ˆ›ïOÎg‰×ܯNÁ6$’¿Œ‰_7à¡›¿ˆ ¢ò‚\ Pžd¡ˆwÍ%ÊO øƒú²¿¼³Oø}áËîC_qrõ$R^ç2Wá#º"ÊpWd!WÀy“+ò¼®%¯q\F7-–g‹Åî Y‡4!ª°ìE´è‰cn?ÉÎá%ÍÆ,ól,@# ¿è ®ÖH™2R”…Ê¿o·ûnw˜ Ç@|˜í¸SÁ ûáBÓƒßG5m[=´‡]¼ Ô5ûËæàŠhu§ü{þówØS8I†›# ™Λ̑ç­0Ç(y9à2Џ/æÐgÝá$±&|D`¢ +K_DûRwdc™U6ÖÙØ@nòs$bYå¢<^Š*ÐJŸt•™šÕòð-Ówïã]‰§ö¸Ñâ²»˜ÕÄ*s{1ãlBaOG$j¯< `/$o´×(/n¯qò +{!eqÇçžßçíc˜|<—‹j?E—~òv#©2ÊhÑf‹fß vØïæ ”G˜óÊg„r5d‡(ëýðø\yVIK‘mö Äõe HK¨×y>ˆ åÛ‹Ý„‹*Ü/á þÁ¤ ÿ,iýyæøÁN£ž¢¿y,©G˜[Dpú"V~f>@ê9%œÛÊg†r5D}”õÔogÃäží§ö"ÏÀ”)ÁµW!Úi"¤Åž¤ˆ*”è,@4œ4'ʼne® ®á4ê Ñ›Ùþã9ª…ðÇ®Á6$\Bë"Õ_Ç‹úûçß"aÞæìE.êS2­Ì}ÁäH’ Wò»ˆn¢‰3†½Þ¾©<•Òß©Ø6»Yz4..¶Šƒ7a~^0>ü¦ßpñ ¾IÃ)¦P·ÜO˜véæõÉWnâmíWíççeS|ÕF1q®Kÿ`¶0ðendstream +endobj +4697 0 obj << +/Type /Page +/Contents 4698 0 R +/Resources 4696 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4575 0 R +/Annots [ 4700 0 R 4701 0 R 4702 0 R 4703 0 R 4704 0 R 4705 0 R 4706 0 R 4707 0 R 4708 0 R 4709 0 R 4710 0 R 4711 0 R 4712 0 R 4713 0 R 4714 0 R 4715 0 R 4716 0 R ] +>> endobj +4700 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 713.8976 188.5699 724.8016] +/Subtype /Link +/A << /S /GoTo /D (a00147_gde6634974418e3240c212b9b16864368) >> +>> endobj +4701 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 675.1037 205.825 686.0076] +/Subtype /Link +/A << /S /GoTo /D (a00147_gdb971fb1525d0c5002f52125b05f3218) >> +>> endobj +4702 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 636.3098 190.8911 647.2137] +/Subtype /Link +/A << /S /GoTo /D (a00147_gef6c4140c632b6a406779342cf3b6eb6) >> +>> endobj +4703 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 597.5159 195.3145 608.4198] +/Subtype /Link +/A << /S /GoTo /D (a00147_gfbd5fc486dfdf6bf6fc9db52b1f418c4) >> +>> endobj +4704 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 558.7219 200.8635 569.6259] +/Subtype /Link +/A << /S /GoTo /D (a00147_g7b2ac4b18bd2ac3912fe67b3b17158c3) >> +>> endobj +4705 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 519.928 191.2995 530.832] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga8933ad15a2e2947dae4a5cff50e6007) >> +>> endobj +4706 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 481.1341 180.9385 492.0381] +/Subtype /Link +/A << /S /GoTo /D (a00147_g58bb90796c1cdad3aac2ecf44d87b20e) >> +>> endobj +4707 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 442.3402 204.1906 453.2441] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga87feebc7cffd4d8300e776cf64e4fec) >> +>> endobj +4708 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 403.5463 180.9384 414.4502] +/Subtype /Link +/A << /S /GoTo /D (a00147_gb5fecbc62edd128012cea0f47b57ab9f) >> +>> endobj +4709 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 364.7524 214.9411 375.6563] +/Subtype /Link +/A << /S /GoTo /D (a00147_gf2dbaceb10c67783a115075b5b6d66df) >> +>> endobj +4710 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 325.9585 203.0756 336.8624] +/Subtype /Link +/A << /S /GoTo /D (a00147_ga20812098a4663c8a9fc4ce8e95391b6) >> +>> endobj +4711 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 287.1645 203.6235 298.0685] +/Subtype /Link +/A << /S /GoTo /D (a00147_ge5ab69d40013e6cf86ef1763c95d920e) >> +>> endobj +4712 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 248.3706 190.8912 259.2745] +/Subtype /Link +/A << /S /GoTo /D (a00148_g87f0b54ade0d159fba495089128a4932) >> +>> endobj +4713 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 209.5767 195.8725 220.4806] +/Subtype /Link +/A << /S /GoTo /D (a00148_g53fbda0e8c31d4882294c8dc3cb5f487) >> +>> endobj +4714 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 170.7828 215.1402 181.6867] +/Subtype /Link +/A << /S /GoTo /D (a00148_g769512993b7b27271909d6daa4748b60) >> +>> endobj +4715 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 131.9889 213.028 142.8928] +/Subtype /Link +/A << /S /GoTo /D (a00148_g210e629f7252e4bc8458cbdf260b3318) >> +>> endobj +4716 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 93.195 234.0589 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00148_g6b16e0bac41821c1fbe0c267071642f0) >> +>> endobj +4699 0 obj << +/D [4697 0 R /XYZ 90 757.9346 null] +>> endobj +4696 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4719 0 obj << +/Length 3007 +/Filter /FlateDecode +>> +stream +xÚ­œÛr7†ïõ¬Ú²jà|È-ÉŽë‘Þìn’RÉe©b“ŽHÅñ>ýäl3 ”K•ŠEi~õßì¯1€3b#êÿc#GGFâ„Ô£›OtôÁÿøÍë¿ðÇ_@Á«ÙÁw¯¹9â4×£ÙÝ&‚fDqÆG³Û_Ç–p7yÁ?=|þÎÿOî·ß¾~ø8ß¾ºœßÍ'ÌŽç‹›ð#k¸3k&¿Ï~<8ž%÷.9%4 Þüú;Ýú$< D8«F_ü7”0çøèÓä"~óñ`zðsг=°ù…¾÷(©"VØÑ n¶ï +ˆ +1£†0Í}U¸¯á©(ŠŽ¬ÿu-CQ˜?H³£¨ +•9\~ú|ý8fÜÕaýe¹}qr±ýz}{»=¾ZÍWÛ}yXwõ[Ìן®W¬È~™bJ†yS&ž—>ã>/e‡¡SM¨0b]èÌ•ÂÊQ’…7øçªLÎÿWböTµSÕ|™$Žjûþãvþ¥|1/Ì¥&¾·Øžy8ôø¡Ó\Â4¢¾–F7¤á{ýêás`x@í'Ùò¹ÉìU"©*)”Ñ6¨¢·óÕúŸÛ–Y=Þt¯BBþ êí¡þŸ¶Þ‡j¤ù“,¤vJ²Éeù´îúÿ~žZûËò±;ìÇHw|y× ‹Åà0 ÚúS£üYƒÖ^(¤¬ †$« ß82ßú`ÈÍC%"n>Êžs’X¡Uˆªš}-„`Žö¼âþ«æ=ÔXÏGYÈââáfÂéø½v|üõÏÏØè7ëùsô¼d„ÓüÄòí=Ïý•\0Uëù(«÷<ˆõ<î›zú6ô|fÞÒóxEܼçùpÏ£UØõoÇ+-ˆ¤ùÉãÛ;^Q"¹2µŽ²zǃ€XÇ㾩ã¡oCÇgæ-§QÄÍ;^wœiÂ|“äù°>î>s­¶²7Üãeuî˜#àŽû&îз{fÞÂO£ˆ¹ŸÿÒÀ\m`ñ†¶p7ªJ.œYbvy*¼¹ðMäøðÜ +0äQVGŽ9ä¸oB}gæ-Èñ4Џùåñ¿OOfdªˆóLð"$UÅSë‹KÜeeN‰aÈåywcÜ©êˆ;@5M€i_èÜ‚Ía?j„{qþöm¹Hó—U-5þ棨bìa +róágW?W3’‰a°@€‘²:Z̰Å}\èÛ@73oÁ‹§QĀߞOKÂŽêt¥QU1ç”ùù¹9Ó=”…_±­†?E‡„r’U)£Ž;ÊßH9ó­SÎÍ(WÒ(â¦éØ«óˉ¦ãžÓ4õïP(¼IUI€SA$óÓ®,Ñw5–cÝðÕ +0ÒQV'9Ò¸o" }Hgæ-¤ñ4Џi<ŸŸÎŽ +ÒÜj™ÆëT•¸ DÎótßYøE›e’ “Œt”ÕIcŽ€4î›HCßÒ™y i<"n$=;9=>:Wiæˆ1~Š„–!©*þœóð©Ô^ùï»F µ¹H“Œt”ÕIcŽ€4î›HCßÒ™y i<"n$]]Q…É–sá,ŽÖ#ªj‰ø9™´á,é[E ɉݻ×+ð(«ÇpÜ7‡¾ À3óàxE\8´/KÈ–Åt¥QU1“2néËÌ{¯ÔÜký +{2`£¬sqßú6@ÎÌ[ ãiqáÒÊ/ž·°¼;ž–çqFãðr$U%.¥Çl÷Ê!úx3McÃ[¢P€ñ޲:oÌðÆ}oèÛÀ;3oá§Qļß]\MÏŽ6S´¶òk$æSX-’ª’WÒ7wy½“3?c÷—„á}P(À`GY6æ`ã¾ 6ôm€™·ÀÆÓ(âBؽgqÎÑÊ2¼IUI€sM˜´6O@õ€æÎ/á”Þƒt’UA£Ž;Ðß:ó­ƒÎÍ@WÒ(âfû'åbË—KQ®ñ"$UÅ=ì~ú‰›ÈÝiecˆC&àà8ƸSÕ#v€0jšÓ¾Ð¹/šÃ~ÔwúŸ³«ËÃõ¬¥)’j´I„›‡–Ldæ}“m®¡Ô_—¡£eu¼˜#à‹û&ÀзpfÞ‚O£ˆ !ûërÏ:ÚeÃËTÿÐ T3“û÷Í·¹â„ +>|I†Œs”Õ9cŽ€3î›8CßΙy g<"n䦨añüêíÉô‡žS¶a—šáÕHªJ\hâÏÖ6O£oºÍ…#TéáP(ÀpGY7æpã¾ 7ômÀ™·àÆÓ(âFܯOή~™0NÇ/OfW¬o¦”Õx5’ª’F˜‡QéDžFß„{£´lx7 +0ÜQVÇ9ܸo }pgæ-¸ñ4Џý¸ù0n¬7šÆ7L£wÚÍaT l î(«ãÆnÜ7ᆾ ¸3óÜxE\8í>9{S^³ÃUÊáUHªŠ}8*Ù~ú>· 1î†7B¡Ãeu̘#ÀŒû&ÌзsfÞ‚O£ˆ 7BwúÔŒX'-^Œ¤ªdÁ¹$Âú%t–EßãÔ̔ޅ„v’Ui£Ž;ÚßH;ó­ÓÎÍhWÒ(âFÚo_NgñÎÁrd[ÂUx)’ª’C˜›ðLm–CßgZÌHÂŒ¾^CÆ:Êê¬1GÀ÷M¬¡oë̼…5žF7ìéÕéËéO}÷ƒ2i4^…¤ªØoî!Väö¬ïBÍtxê“o@Æ9Êêœ1GÀ÷Mœ¡oç̼…3žF7­®·O?\\ô¬¸üeØ(mðJ$U%…Ð\‘§Ð{—“þ,Áõð^(`¬£¬Îs¬qßÄú6°ÎÌ[XãiqÓ]FÅGÕWÓ“ÿ—kmãOÓ†Wê"ÂPá™ ÿƵm|Ü–ù%:W¶öüa’…ìgñù«÷ᡬ§»Ð³wñ!“ÕÃÿº£×]?|¼~ÿ1=¬Õ)žVQ{{½¾Þ¾zXìíÚûŽú™†`#˜*B&é+ï­Œ·‹ok/Á ÑTÚ½Dö*›T{Á±Ò¿Îì÷*Š>ˆÃÂÍ&Ωgy' +ÁEmß$ÉêƒÄ1î›1ômÄ™yË ÆÓ(⦥/Ã>ÿlOÝW'‡§}w“…OÑšDQ%.ü [;“çÒ·î4rx§lwá݉ª´¯kÔ1’ŽuÎж2šÀ^Ìa³ÃÀ<Üh•!JÐ$|‰ ³<«Bß5ٰ팮ÇÈs÷#~{Ïé7ÿõªMƒXÿ+Lpø'¸´?‰„Ž»ƒI„$ßÌóÇëõ<>{ÞÎOã‹'LŸºoï¾Òï¹øžÓíw~!©»+Å„«qºZħw¡ñ‰Åí×£åß_?ÌûåQLôÕçÿ Oìendstream +endobj +4718 0 obj << +/Type /Page +/Contents 4719 0 R +/Resources 4717 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4756 0 R +/Annots [ 4721 0 R 4722 0 R 4723 0 R 4724 0 R 4725 0 R 4726 0 R 4727 0 R 4728 0 R 4729 0 R 4730 0 R 4731 0 R 4732 0 R 4733 0 R 4734 0 R 4735 0 R 4736 0 R 4737 0 R 4738 0 R 4739 0 R 4740 0 R 4741 0 R 4742 0 R 4743 0 R 4744 0 R 4745 0 R 4746 0 R 4747 0 R 4748 0 R 4749 0 R 4750 0 R 4751 0 R 4752 0 R 4753 0 R 4754 0 R 4755 0 R ] +>> endobj +4721 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 702.8842 216.9034 713.7882] +/Subtype /Link +/A << /S /GoTo /D (a00148_g969d7fff37a979737da045e0d538a9bd) >> +>> endobj +4722 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 663.9813 195.8725 674.8853] +/Subtype /Link +/A << /S /GoTo /D (a00148_g22fa0681cd463191d7a01fe85d86996f) >> +>> endobj +4723 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 625.0784 195.8725 635.9824] +/Subtype /Link +/A << /S /GoTo /D (a00148_gffcd2fbe181e2aaefbf970551c302af5) >> +>> endobj +4724 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 586.1755 195.8725 597.0795] +/Subtype /Link +/A << /S /GoTo /D (a00148_ge23534479ead15af8ff08ace26a47fb5) >> +>> endobj +4725 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 547.2726 195.8725 558.1766] +/Subtype /Link +/A << /S /GoTo /D (a00148_g165b603ec150e26efec7be199c9c2901) >> +>> endobj +4726 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 508.7434 180.7494 519.2737] +/Subtype /Link +/A << /S /GoTo /D (a00148_g69a7a4951ff21b302267532c21ee78fc) >> +>> endobj +4727 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 471.5241 169.3122 480.3708] +/Subtype /Link +/A << /S /GoTo /D (a00148_g118e9d76568ab81ad97f138d4ea1ddd2) >> +>> endobj +4728 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 457.4674 214.6224 467.3951] +/Subtype /Link +/A << /S /GoTo /D (a00150_g6bfa488f87f68a6f7f4a3efb9e45eaf8) >> +>> endobj +4729 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 444.4916 216.6746 454.4193] +/Subtype /Link +/A << /S /GoTo /D (a00150_g39ce739bd352d7e348e37395ce903e43) >> +>> endobj +4730 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 431.5159 206.9409 441.4436] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf848ce44c810492e7a35c2d23a429f45) >> +>> endobj +4731 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 418.5402 193.6609 428.4679] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf0ed78fd2be24d849cdd5af75e3b2674) >> +>> endobj +4732 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 405.5645 200.3059 415.4921] +/Subtype /Link +/A << /S /GoTo /D (a00150_g57e6dc1d58a36d0ed53a3dd29ccc5798) >> +>> endobj +4733 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 392.5887 201.9198 402.5164] +/Subtype /Link +/A << /S /GoTo /D (a00150_ga4c4310e54f18541b09e1e251fe7b22d) >> +>> endobj +4734 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 379.613 229.0778 389.5407] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf84316f469ce0726985c0702db49a989) >> +>> endobj +4735 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 366.6373 220.769 376.5649] +/Subtype /Link +/A << /S /GoTo /D (a00150_g2d3ba4b14d6d2f6576f9b547800b7945) >> +>> endobj +4736 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 353.6615 193.9898 363.5892] +/Subtype /Link +/A << /S /GoTo /D (a00150_gabc40c09f49d15acb1b1a7f02bb3a807) >> +>> endobj +4737 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 340.6858 199.7479 350.6135] +/Subtype /Link +/A << /S /GoTo /D (a00150_g041aea91aa6ef84dcc6cac3c51db9b2f) >> +>> endobj +4738 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 327.1074 243.3742 337.6377] +/Subtype /Link +/A << /S /GoTo /D (a00150_gd605357e29affb0d3104294c90f09905) >> +>> endobj +4739 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 314.7343 252.8785 324.662] +/Subtype /Link +/A << /S /GoTo /D (a00150_g5c97ae587595b5444be80f5ecc1d3382) >> +>> endobj +4740 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 301.7586 224.6544 311.6863] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf0ccbc3bb2a3ba1ebc255c7b3fcedd24) >> +>> endobj +4741 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 288.7829 207.4989 298.7106] +/Subtype /Link +/A << /S /GoTo /D (a00150_g28eda870cff3d8e3cf2949e6f57a502b) >> +>> endobj +4742 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 275.8072 221.3369 285.7348] +/Subtype /Link +/A << /S /GoTo /D (a00150_ga5e3c856b86725125d19fccc34cd9eb5) >> +>> endobj +4743 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 262.8314 218.5673 272.7591] +/Subtype /Link +/A << /S /GoTo /D (a00150_g8af482dec973db57d8b3bd3f69461488) >> +>> endobj +4744 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 249.8557 234.7964 259.7834] +/Subtype /Link +/A << /S /GoTo /D (a00150_gae59b70658f28ee6e998eaaab05e423f) >> +>> endobj +4745 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 236.8799 224.5549 246.8076] +/Subtype /Link +/A << /S /GoTo /D (a00150_ga533c394b1fa0030205534befa31c525) >> +>> endobj +4746 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 223.9042 224.5549 233.8319] +/Subtype /Link +/A << /S /GoTo /D (a00150_g160128ab5d2ea3cc497b91ee4eb4ef99) >> +>> endobj +4747 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 210.9285 211.9222 220.8562] +/Subtype /Link +/A << /S /GoTo /D (a00150_g64d9affc680a445d708234e70450477b) >> +>> endobj +4748 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 197.9528 222.8911 207.8804] +/Subtype /Link +/A << /S /GoTo /D (a00150_gfff0ed43201bf1e2020de1a0d6cac070) >> +>> endobj +4749 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 184.977 219.2748 194.9047] +/Subtype /Link +/A << /S /GoTo /D (a00150_gd135fb0cfdfb2c212f0f51865a3640e4) >> +>> endobj +4750 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 172.0013 214.1439 181.929] +/Subtype /Link +/A << /S /GoTo /D (a00150_g13dfcb4a5f920e108253ade527a66cc2) >> +>> endobj +4751 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 159.0256 211.7529 168.9532] +/Subtype /Link +/A << /S /GoTo /D (a00150_gde29ec025e6754afd8cc24c954a8dec8) >> +>> endobj +4752 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 146.0498 238.2734 155.9775] +/Subtype /Link +/A << /S /GoTo /D (a00150_ge0825474feee11b4e038bfe71757875f) >> +>> endobj +4753 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [289.3868 130.4285 318.6011 140.3338] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +4754 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 107.1469 229.7753 117.0746] +/Subtype /Link +/A << /S /GoTo /D (a00150_g359951eecd80541c2101f628a9da9146) >> +>> endobj +4755 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 94.1712 223.6882 104.0989] +/Subtype /Link +/A << /S /GoTo /D (a00150_g517c770991459cc62dc009c0d3875c6a) >> +>> endobj +4720 0 obj << +/D [4718 0 R /XYZ 90 757.9346 null] +>> endobj +4717 0 obj << +/Font << /F29 499 0 R /F50 1172 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4759 0 obj << +/Length 3015 +/Filter /FlateDecode +>> +stream +xÚµ\Ûr7}×W°j_¤Z‹û%klj]›ÖQž—‹)‹‰T(ÊŽ÷ë·13€€¹tcm¹J$Í3}}C7f$±àðO,_8ãXPÚ..oOøâ#ü÷'¢ûz ß/KÀ?/NþñR†E`ÁJ»¸¸j$XÁŒrq±~{*¼?[Ê •;}xuo ?Œ·o^no6í»ûˇÛÍî¸:n÷»³w¯O¾¿È´VFYIÿ8yûŽ/Ö ÝëÎTðfñ>p&B‹Û-UúpsòËɲœö‹æ‚±Åů—ÒµK™\½„µ:ù¸xU,^pË´òz‘PÑ¿Iiú+¾—F- +qº "H…f[[‘þm½ùs¹Û ˜µeN:Q3Ço;È›R‡'tèK:üúêüýù›3ÍOŽ?.΄?ýùý¯/Îû:I©™ÒÆ£ÖÈ \)-óÊšJáÆBJ8Æ¥ÖÓ®.˜¯Œv6ÆXxçÍî.ygø»"Ÿãp\Üi—¿zþÓ¹8])æ,'¬’Q„:RY&MOãÇÜÎ5ãÎúi·Ìí F»c,ÜŽóf·—¼3Ü^‘Ïq;®Æ@nrû«óßÿëûÜÌ=ÆjÜ +EÐKÁ™Õ}zÉGülƒ`6žI?—ÄÏFúe|ô3Á›ü\ñÒ~®Égø™Pc 7ùê÷¸£E`P£n†Œ"ø¥ÌADÔücùl„ŽÓ;v Àüœ`´Ÿ1ÆÂÏ8oösÉ;ÃÏù?ãj ä&?_<Ÿò3tbNÜ EðKÉ·ÂÕüã m “J‹iGÌÑ F;c,ófG—¼3]‘Ïq4®Æ@îcážLié>A ‘Q„Rq ){à†We¥þÞ¾û +àÄXPɤ·f:( + FÆXΛƒ¢äùœ ÀÕÈ} ŠÉü‡[KçqCd¡A ž è‚"ëð•A¡Sʇé (XP$c8oŠ’wFPTäs‚Wc ·ØàçhP`†(‚Õà1(úÔaÙ=Á‚12^·ª»p©4ì&Ê5^œ9}úån³Þ\ÝD‹ñ’é€ì+%‰– #£e|Œ‚7EKÅ{l×9ŒǤ3=f$TZ8¥B_jÔàAØ÷Ç¿W.=~Ã-¼%”s´\“Ú%\­ÞöîýöN¯ÖëÃPÍxªºdjÃS3ˆž‡™´â+ß ãÂ1aåÂXè™L5DG‹]à†Ùðľ…*.]˜Ž¢¹;Td~³¹;œ)wº¹¿ÏmMAÝ_µ¯«îs:¦‹6ê.`“:ËL0WºÓYH´›îÔVqº£öê £­ˆ%Λ­ä¥­bž‘h¸ +}©3 Yú×'®]N´J½&Ñ,•h˜‡ŠDCȉVò¿õïÆŠ=@mÓ­A Àb0ÁèÄ‹Äys –¼T VÌ3bW¡/•®¦\1á`ÖÇLÐÄ¢#cQrÃ`n°”–7¢æ„–±‚y-qGeÔÕƒ@ éØXð"õˇÝe,µc‡v +âvzv)¾GB1¡ÈHÄè'MqX’~:“°‰l×bh‚¦&žŽÃ'TèKÍÞmGÊ¡0„ ºö"ˆ­gš›š8N*iýcÓHÚ'µñ-ǬͽD#»{†5&HÛv´Ãvu³ýo±Å_uQ8¹kÈî`ì“lãZƹ§î›d¸…@,rqÞº%/»÷œàŵÈMá{¿9nïFq‰#5BBQô^0c·6>ñ€×G€³ ð¤}¹“½Œ„Ø´ÆEtéEÇ[ÂûÞÒ‰¬mN'½š™µËÚ{‚¬…؇ø×O’¶ +¶-auß+ÃÈ´-"iK𦴭xÉ´­¹g¤-¡Å@nJÛ›íýq³f­fR(KØ ¡(vg™ãÐ|Ô¶ÍZˆ-)Üìõ'<¥Á@.’µ’9ØRñ¥gAû9ÈðÞÒïö‡#–· +ÊœŒêÎÊÛäm†E ~9®Ç6KÛØî>¶ûîõº{´åþns¹Gx›uûQûÉ”VŽ3i¥š”6Ž)a¨[œF§t!Kiœ7§tÉK§tÅ='¥q-rSJ?ì&’Úk˜g¢P+$Åï-L*6ô¬?šÔp•×z¶žÔ /w:©!Ò¬ ÄÒ3Š –Â@üÆ”*‰É¤Ö’)G5å¤nÑ’Jêk“z÷Éi%˜V=MN C¬wTN'Ó…À>#¤ˆŠ>)JMi—3¿Ô.æÜå~7Ì7cµwÕp™QCn¡Kn£™v^ô,½èphŒã<=ÞéÕ'<µúÜrõ›Ë‘¬ëžvA Q=tL(çú) ˆâyÆLd<©A_.y8c¡@8 $Òæ­6ã!ÐS¶ } shŒÏ´=ë머‡…Û¹ÖÊxÂZC¹“åYÅÐ`ˆLÉ(ŠX)¦|—¬Î\1#½Y 4V,jð¼K’ª"¯Ú—ö>ÅíþØÕçëý}|¸ÏUüâùù™Pæt²NË ™YòIê´„‘ÜB¿HÔé #ët)é½ÞT+^²÷ª¹gô^„¹§ »‘#ˆ[È[ Eq;ˆn¨‚µá¡ +BNASÚ£WC´e±eâdéPf½:®ž¥? ›–KÒjf½œ—Jɤ„jÚœhãF¨[wp×ëp.mR%»= +;Ž€øcNª§¹(5gΑ§ßFçO!ð›ûB»œe¥vÍl±žèuôB:TËeF ùë^ÇA¯Ã•êYg¬×¡Ö»uÙ¢ÃSÈ--°ÛœIsúyøH¸ý™2BF*Hå™2ª"cýŽ0·ð0×Oi0Kö;q‚=š°@Ba ƒaÜs9XÑBûht“îó¬•ñ„µ†r§ûc™·RQ´Æ3Ë…«iT¿•†y5÷iUékËtjaîª^’GÄäi†{q>¿Ä2úpõl8—Éø»Üj®2ž0ÐPî´¬aF AX(¡(bëÛÛè1q$`Þ—Îõù—ÿ¨J“w.J–ÏDÃã”oNX$\¨Á²I•h´6»Íl¶®ÏŸJo^Çõ> endobj +4761 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 727.7951 225.3421 737.7228] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf72d7b9a737707dcfb2c41fec2b6792e) >> +>> endobj +4762 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 714.8475 234.7566 724.7752] +/Subtype /Link +/A << /S /GoTo /D (a00150_gad0321f4c570f9983c6de81ece3ddc20) >> +>> endobj +4763 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 701.9 209.1527 711.8276] +/Subtype /Link +/A << /S /GoTo /D (a00150_g6bc12c6c7b56f73ce5d57abfdcdc6eb5) >> +>> endobj +4764 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 688.9524 220.2212 698.8801] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb948296aea6b6b3aa1f156799c4d479c) >> +>> endobj +4765 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 676.0048 218.5673 685.9325] +/Subtype /Link +/A << /S /GoTo /D (a00150_g17d111686f98e4c09db73a770ac3f1a4) >> +>> endobj +4766 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 662.4546 229.0778 672.9849] +/Subtype /Link +/A << /S /GoTo /D (a00150_g6f2b90c597ec23f39ec716ccec11233c) >> +>> endobj +4767 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 649.507 227.424 660.0373] +/Subtype /Link +/A << /S /GoTo /D (a00150_g15f2617f7dc1713f9d10282125c6027b) >> +>> endobj +4768 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 637.1621 227.424 647.0897] +/Subtype /Link +/A << /S /GoTo /D (a00150_gee37386b2ab828787c05227eb109def7) >> +>> endobj +4770 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.2787 579.341 170.966 590.2449] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4771 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.4642 579.341 229.3566 590.2449] +/Subtype /Link +/A << /S /GoTo /D (a00150_g20ceef9d0868d391c2f33041b02cb1f1) >> +>> endobj +4772 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.2787 540.4944 170.966 551.3983] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4773 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.4642 540.4944 229.3566 551.3983] +/Subtype /Link +/A << /S /GoTo /D (a00150_g9ebb4dac683163840eab9c6c41ad61f7) >> +>> endobj +4774 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.2787 527.5468 204.1712 538.4507] +/Subtype /Link +/A << /S /GoTo /D (a00150_g20ceef9d0868d391c2f33041b02cb1f1) >> +>> endobj +4775 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.6693 527.5468 257.5805 538.4507] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4777 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 470.7019 166.9111 481.6059] +/Subtype /Link +/A << /S /GoTo /D (a00145_gc48ed5f0d27721ef62a3ed02a5ad8d2e) >> +>> endobj +4778 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 431.8554 180.1912 442.7593] +/Subtype /Link +/A << /S /GoTo /D (a00145_g22f140b02c354dfebcc7ad481c3bcd68) >> +>> endobj +4779 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.0068 431.8554 208.6941 442.7593] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4780 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 393.0088 175.2098 403.9127] +/Subtype /Link +/A << /S /GoTo /D (a00147_gdd1ab3704ecd4900eec61a6897d32dc8) >> +>> endobj +4781 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.0255 393.0088 203.7128 403.9127] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4782 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 354.1622 185.1725 365.0661] +/Subtype /Link +/A << /S /GoTo /D (a00147_gaa585784b0914cac1d37f07f85457008) >> +>> endobj +4783 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.9881 354.1622 213.6754 365.0661] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4784 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 315.3156 152.9837 326.2195] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +4785 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.9538 315.3156 211.6433 326.2195] +/Subtype /Link +/A << /S /GoTo /D (a00147_g8096b0c4b543dc408f4dd031ddae7240) >> +>> endobj +4786 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [215.459 315.3156 268.3701 326.2195] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4787 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [307.2043 315.3156 331.8917 326.2195] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4788 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 276.469 171.8826 287.3729] +/Subtype /Link +/A << /S /GoTo /D (a00147_g04b053a623aac7cd4195157d470661b3) >> +>> endobj +4789 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 237.6224 172.9089 248.5263] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +4790 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.8791 237.6224 236.859 248.5263] +/Subtype /Link +/A << /S /GoTo /D (a00147_g79c4110211247df3fb30b8cf1c4c02af) >> +>> endobj +4791 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [240.6746 237.6224 293.5858 248.5263] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4792 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [332.42 237.6224 357.1073 248.5263] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4793 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 199.1494 138.5977 209.6798] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4794 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 199.1494 162.6772 209.6798] +/Subtype /Link +/A << /S /GoTo /D (a00148_ga22b04cac8cf283ca12f028578bebc06) >> +>> endobj +4795 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.4928 199.1494 191.1801 209.6798] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4796 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 159.9292 183.4989 170.8332] +/Subtype /Link +/A << /S /GoTo /D (a00150_g266263ac78a1361a2b1d15741d3b0675) >> +>> endobj +4797 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [187.3145 159.9292 207.0205 170.8332] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +4798 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 146.9817 138.5977 157.8856] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4799 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 146.9817 189.7953 157.8856] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb6683dd83fe1c8de9a24086d4b69e907) >> +>> endobj +4800 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.6109 146.9817 218.2983 157.8856] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4801 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.84 146.9817 266.5273 157.8856] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4802 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 108.1351 138.5977 119.039] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4803 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 108.1351 197.5461 119.039] +/Subtype /Link +/A << /S /GoTo /D (a00150_g2addf34c7d457c1a7899a7e2171ef1e9) >> +>> endobj +4760 0 obj << +/D [4758 0 R /XYZ 90 757.9346 null] +>> endobj +4769 0 obj << +/D [4758 0 R /XYZ 90 596.0036 null] +>> endobj +4776 0 obj << +/D [4758 0 R /XYZ 90 489.648 null] +>> endobj +4757 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4806 0 obj << +/Length 1902 +/Filter /FlateDecode +>> +stream +xÚÍZÛrÛ6}×WèQša`qÏc.Î$3mÓÄéC]‡–d[[vti›¿ïB"`ªÒCÇ£1)»{vØâZ:ÔRË…Ntx‡o¿°êqÏ‹ðúbpvvh‰U †·Û# /¦—#CÀŽ t´™?Ÿá‹ÜïnÏç³ÝÕçÙíl9ff4[LÜ[Fƒ1cÇWï.Âì9Éss\^ÑáI~P­‘ÿñ†f- ¸¿y|üÆÙ=Ø~`ß•Äp3,@ïVZ`¦ S€ÿXÉD·ÑHFFã‘ÑUDp#†æL÷'€lÚ€QüH>ŒlÎ(ˆ5 ׸{æÞYÞU>ÇÜ©RYvWc·aêzÝ¢Ç5Q”‰$= ÂR§'(¡X–žÇÕéÍŸ¯×“çÉý·Õæ±I(%VsHÒ,*C('BqÛð•ô¯1ÐÑÓ|Š×¬íÉ]èh +„j• ³ +\Äè-I‡™(±5X|jÍË ŽÉ›òa²y(וÜÖ÷ÕÅÅ›O»‹É˜ÉÑýlâØn͵}÷é¶.wˆ1££Ùz÷Þ|Ä}}ãžnªO•‹éË“òùyZ®KÒeeaLë“HMiƒ@Å3R °¬Ôâ–Z†ÇÕØ¥¥–¢w°Ô2ô<®N=¼™vJ-ÒF,<(3=J‹çºá»žBC<ÞOh1:!´K íëÛÿÐ$P\ô´A„ö•ž1TŸ„ªÔ+f\žÙ•úßÇFår^Þ<ÌV{Š·´’†}A—rc@B¹–Unjƃ•›açq5v³O¸@P–d×W¸\bâ¤&ËÎãêì¢Xj’T—ƒ~N:- rÓ+ƒý–lLùõçë×.È¿žùðÇ»Ÿàª+n¥¡Xb5ô‹ÛÐn€92^|›ŸºUè­…Íê¶gelÔ©5©,‘Ôð“5)Á—ÍIÃÃòÒˆÜcÉ +•›7}<¯OÆnî³s\TœÁ ¥Ââ,»ÌMy‹ Â — ‚‰ÒUásT[ãzT9³E{j¨L[Êpbn$ +g Ñ3¯JÁˆÂ0Ìŧ‡9¦ŸÆÆu±Æ°ÛU‹§FÕÀu<Ì'åzþT•ŠíªjÅ#YaŠmN‰’â4¡@ìWs[£Ë‡v4àñY?Í. f—î×Rôî×2ô<®Nƒþa¶h§|ü ¶:I°P@ŒëÔ xÜŽhir»–«%d¤z·¾ÿ­Rµz¦CB]`ÐÖžfo"°q5Âäö&–õxÀ£c=ÃÎãjìœm'O‹v4IlI†E@µç®Õ &AkXf_ýP®A¥¬1o÷ê=>·úÖ¸ÉÕ[ iŽýVrõYFs˜–î8,¹I€õ+“Ír9æz4[¬›‡¸¼ÙÄU•n‰à>ÁŠ•ÁÑèVäR¡òyîx}$©yDÔòêè¦×·xidèí¡·jÇ/öé\@Š_@™™­FW`ÓϼíýßüúË/_®öìhBtŸAÇ€T”xX>L3'iv!PbvÉbŠÝÁ;Å ;«³s}òd¡EQ+B]sœtY@å&Çl)…n˜æRtî fjMÏÃÓJæ&ÅÍ SbŽdrTþ¨ÚŠÕ¬:z¹}Z6ò)‡âf^¥ÒÕìû¦újï›ÇŸ†'Õ&×Uwv¥Œ0~¢„C˜É6 –N<àÑÂɰó¸»êôqšÕ˜fè$Ë" Úó×›)”rްξ&Ä`e×-ët[Àãsh›³pì?  pìq¦æƒ:®9‘íD¬ÖÕ·Ž—CÒ|ÃÁqæD –pžk8<*/ˆ—áŽ×C’ZCD­Ÿº)ö­&;)ˆE뢸jÇ«DÏ +“âXPzvÀ·Ö²>û¶ñÀXën>8W„ÝRãaùIÌxx̤م ‰Ù9—¬ÖåºÝJŠ–ã¤¸Õ£QbÀ}±ž¡èq{)¶S­ \Ë´×´&€FÜe7n{¦7`Α¹n!ÀöŸ"ã>êÌ_;þóÕz>é.öœQlÓOTì;o Ùb`Ù@<:P3ì<®Æ.Ù%§ØÜ%gØy\ƨkʻվܫp³”$Y˜ +Ty¶;aö#R+“ó¬‡å= x¼gÓì‚gcvÎvóçr:]îñ°’˜2,ûf!÷U“6ËÒãZ,ïŸPÇȳUºs¥ "É#¬BåÕëBd®1 °¼£÷qš]ðqÌ®Ÿ,÷qšeðq“åb¶~,WßZ.f–"I²p¥a‹Ê»X¢tÖÃ*ïà—áŽ÷o’ZpoD­Ÿw»)îÜ$ÅàÛÅér¯xÝžŸ3"ˆî¬@¸asY\í…QdëÕGýFq?Â8~¡Ü/ÒŒÿ¡%#Ì–¸¥½Ÿ-fËríO$üw€?û‹îäbSÝ0¨þÓWÀ_ÝÝ¥ª:σù3ÐÊ0Roª·Oÿü¸k‘$Ô"ûü „¦õÓendstream +endobj +4805 0 obj << +/Type /Page +/Contents 4806 0 R +/Resources 4804 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4756 0 R +/Annots [ 4808 0 R 4809 0 R 4810 0 R 4811 0 R 4813 0 R 4814 0 R 4815 0 R 4816 0 R 4817 0 R 4818 0 R 4819 0 R 4820 0 R 4821 0 R 4822 0 R 4823 0 R 4824 0 R 4825 0 R 4826 0 R 4827 0 R 4828 0 R 4829 0 R 4830 0 R 4831 0 R 4832 0 R 4833 0 R 4834 0 R 4835 0 R 4836 0 R 4837 0 R ] +>> endobj +4808 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 713.8674 138.5977 724.7714] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4809 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 713.8674 201.9695 724.7714] +/Subtype /Link +/A << /S /GoTo /D (a00150_g85b65e38aa74eba18979156f97a94a87) >> +>> endobj +4810 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 675.0131 138.5977 685.9171] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4811 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 675.0131 204.7393 685.9171] +/Subtype /Link +/A << /S /GoTo /D (a00150_g7023a34ba9e9d03b5fbedbcb32924453) >> +>> endobj +4813 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 592.2581 133.6164 603.162] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +4814 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 592.2581 166.9014 603.162] +/Subtype /Link +/A << /S /GoTo /D (a00146_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +4815 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.3873 553.4038 192.0768 564.3077] +/Subtype /Link +/A << /S /GoTo /D (a00150_g561b8eda32e059d4e7397f776268cc63) >> +>> endobj +4816 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 514.5495 138.5977 525.4534] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4817 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 514.5495 170.976 525.4534] +/Subtype /Link +/A << /S /GoTo /D (a00149_g12a33f0c09711167bdf3dd7d7cf8c5a1) >> +>> endobj +4818 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 475.6952 152.9837 486.5991] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +4819 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.9538 475.6952 200.0271 486.5991] +/Subtype /Link +/A << /S /GoTo /D (a00150_g788ffac72342f6172343d7f8099cbe1a) >> +>> endobj +4820 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 436.8409 152.9837 447.7448] +/Subtype /Link +/A << /S /GoTo /D (a00088) >> +>> endobj +4821 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.4818 436.8409 196.4305 447.7448] +/Subtype /Link +/A << /S /GoTo /D (a00150_gf703683056d2bfa5c81fa157dcb20fe2) >> +>> endobj +4822 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 423.8895 133.6164 434.7934] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +4823 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 423.8895 177.0532 434.7934] +/Subtype /Link +/A << /S /GoTo /D (a00151_g2a0cf5d86c58fab216414ce59bf1fea1) >> +>> endobj +4824 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 385.0352 172.9089 395.9391] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +4825 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.8791 385.0352 239.8777 395.9391] +/Subtype /Link +/A << /S /GoTo /D (a00150_g210f227119fc972e6222c9cb452e15a9) >> +>> endobj +4826 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 346.1809 172.9089 357.0848] +/Subtype /Link +/A << /S /GoTo /D (a00095) >> +>> endobj +4827 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.4071 346.1809 236.281 357.0848] +/Subtype /Link +/A << /S /GoTo /D (a00150_geb533744817cf6695d75293369c2248b) >> +>> endobj +4828 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 333.2295 151.3294 344.1334] +/Subtype /Link +/A << /S /GoTo /D (a00093) >> +>> endobj +4829 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [151.8276 333.2295 185.3713 344.1334] +/Subtype /Link +/A << /S /GoTo /D (a00150_g9ee50a40597e67fce96541ab56c3b712) >> +>> endobj +4830 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 294.3752 133.6164 305.2791] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +4831 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.1145 294.3752 172.6397 305.2791] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb4ef6b00924990e7a293f66715b6d1d1) >> +>> endobj +4832 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 281.4237 166.8215 292.3277] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4833 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 281.4237 221.3367 292.3277] +/Subtype /Link +/A << /S /GoTo /D (a00150_g7d3673f52f5846b6961d23b150decd54) >> +>> endobj +4834 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 268.4723 166.8215 279.3762] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4835 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 268.4723 220.2307 279.3762] +/Subtype /Link +/A << /S /GoTo /D (a00150_g3237be0d9ec457de0177689ee23c0d5c) >> +>> endobj +4836 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 255.5209 166.8215 266.4248] +/Subtype /Link +/A << /S /GoTo /D (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) >> +>> endobj +4837 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.3196 255.5209 213.028 266.4248] +/Subtype /Link +/A << /S /GoTo /D (a00150_g20df5c82f2a15a508c19e505b5d9de2b) >> +>> endobj +4807 0 obj << +/D [4805 0 R /XYZ 90 757.9346 null] +>> endobj +4812 0 obj << +/D [4805 0 R /XYZ 90 611.208 null] +>> endobj +4804 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4840 0 obj << +/Length 1472 +/Filter /FlateDecode +>> +stream +xÚ­X]oÛ6}÷¯º˜Y^~‰ †a[»Í0 ëòÖ…")±QÇö©[þý.%Q‘DIt‘",[‡÷^ò~@Dñ"C£XÆÄp¡¢ô~A£;üùÍš×k|¿î~»^¼¼d&2Ä(¦¢ëÛ*‚"°è:û°CWkf—åÛwø(é­.·»¼~z}HËû|_$Åö°_}º¾Zü~ݦmXI®À&ýgñá2dwµ „-£ñ %` ‹î‚q÷e·ø{ñW§~Q5ëœ>Þ;a®{ {×½Ó„cW€Rº,·Ç—øÿ99­@/Ó Ù ûø>¿Í«—ù>Ímëà@Œ”Up,®ÍôSpMø×y‘`¤¬)Wþž¶GW, Ä;c`ãXʦŽó:OwÉ©ªìCÝüp[&§t³-ò´(O LJcžn?RÊÒúûm¹O«†d8(Z +:ŽׄÊGKê@ë.ÊŸ4ÚJ9Æ’”P!eEû׿/‹Íát1Ì ”‘˜3˜OÞ¢F²wË4&1pù­JŸ%÷M±Ëý—Ðe¾{¨‹ Ði­\âĪZýäQc¢M¬Të×_"÷ôG‡¶k1B[ui{‘-iÿ’!cdKÒÃý‹9 +I›ùÒµ(ŸC¯ó~4Ëáç‘9¹íB2”2ΉzjÚ¹¶ßV¹*ö¶ù´¿ïr¯šE¡˜ŽP")oØÛW§»ó¾;~Ým02¼¸–]-çJÊÃ*RJ”áCÃ*:T »Íf'MU¯ŠàBBL¢‚þ°Ý§»2C +´ŠÈ›l^L8 Y;Ã¥S÷ˆã¢ÛÊ”ž\º€1Q)Ô…OqlÂŒI_ÌÖóPA³[T(/šµ¡Jõó~]1t½mæåÆj9È==Ÿ>Ä‹ÛΧ,ãÌ7 …K +W8T(ylˆP‚JO%õòjtH úìî;|ˆ·ê¾þ\Œ I˜Ðà·(?/ˆžÁÕÝ {Nùˆ#áil]ûöáÈÙ9ÎˆŽ¹9·<->P?nUP#õ‘’H…n9_‡ +%F›£Ò fÆá +gøÂŒ à¶÷r„jÖK=¢Ï¼î¢+’F(QÍ ÜàÐØè§ –Á«ätzl¶&eÑìMêÎÖ7[÷S–U+™dŠî ;Ë´! +8W$N€)1“kaAëf¬&£ÝDèÜ-ÄÎázìFgp\H(ˆYz¸Ç14Ó¸3vÇ çp}zhéæËCyïû”&±1³×Êm€0Ü7 nÌÀÊàRÙO;Ý{‡2Æ–?NVNÙ|ÇÈOÛ7G0Xæu|ÚݦöÆ®žå­ï}Œ+~nZ| @~Üé)t>¨C…+ôG,g?ñ.ßÏÙ£ÀÅŽ±þ™rÚ»è{laµ=îÒr—Í­Ø4o÷E~Úç;¦+ËMžÚÁªDTû©=¹|Åsg×T›µgÑêH +°œôT£^”QßÇSí>w!Ou°°§v>ßSçÙµžÚeðÔzßî©óôZOíÑCOÝ'\Õ("…µÕ–ëÊopê +*ƒ‡¾ê6ß³"œðX°3EÔAωÈÁfEÔ\Jmò$s2™Òí é1©Õå@á‡qgY;­ääŒÔp_(@òï#5°§€z/4'5 K­ðùR›g×J­Ë. µzß.µyz­Ôzôp”‹tBköƒg76KsÝ¢åõÛþè«5*ˆD¹ž©µzNk6§µëWïž-°1QÕkÛ>{z“YR$“Rã†ã‰ ÎRgV–|TjG”TϺ—®ôª± pÖ½ ­ŽûÚ–™3lh¯ q1«ªÊoò}~Â"7Ýv7hº‡+[ä²ù¬ù¤Œ_°æ'œj.zWL.qù7õ7îžþ¿Ç»Ü»¡·WçŽZ§Jÿ 6> endobj +4843 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 274.5352 657.906] +/Subtype/Link/A<> +>> endobj +4844 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 607.3502 201.6901 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00204) >> +>> endobj +4846 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 532.8737 177.9699 543.7776] +/Subtype /Link +/A << /S /GoTo /D (a00151_g6832e4d2d046536b6472f7ac92340f68) >> +>> endobj +4847 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.7856 532.8737 201.4916 543.7776] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +4848 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [231.8776 532.8737 256.5649 543.7776] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4849 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 494.0194 138.5977 504.9233] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4850 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 494.0194 189.7953 504.9233] +/Subtype /Link +/A << /S /GoTo /D (a00151_gb6683dd83fe1c8de9a24086d4b69e907) >> +>> endobj +4851 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.6109 494.0194 218.2983 504.9233] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4852 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [241.84 494.0194 266.5273 504.9233] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4853 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 455.1651 138.5977 466.069] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4854 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 455.1651 197.5461 466.069] +/Subtype /Link +/A << /S /GoTo /D (a00151_g2addf34c7d457c1a7899a7e2171ef1e9) >> +>> endobj +4855 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 416.3108 138.5977 427.2147] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4856 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.0958 416.3108 201.9695 427.2147] +/Subtype /Link +/A << /S /GoTo /D (a00151_g85b65e38aa74eba18979156f97a94a87) >> +>> endobj +4841 0 obj << +/D [4839 0 R /XYZ 90 757.9346 null] +>> endobj +1115 0 obj << +/D [4839 0 R /XYZ 90 739.9346 null] +>> endobj +386 0 obj << +/D [4839 0 R /XYZ 90 739.9346 null] +>> endobj +4842 0 obj << +/D [4839 0 R /XYZ 90 716.7484 null] +>> endobj +4845 0 obj << +/D [4839 0 R /XYZ 90 551.8236 null] +>> endobj +4838 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4860 0 obj << +/Length 1799 +/Filter /FlateDecode +>> +stream +xÚ­YkoÛ6ýî_a´À`Ë÷£еhÚµÛ€4Í0m¸¶’µ­ÔuݯߥDÊ”)“ZFléèžÃ{Ï¥H‰Œ1ü‘±Ác%2ŒËñ|5Âã[8ürDÜé38ž]½ fl‘Tޝnê’ A _-ÞO4bdzFžìËûGð¹žm¦OîѼ9ü¢\Í·Ë⦀szR¬çöÔÜLˆ!ÓW¯GçW­ +'R0I¬†/£÷ñxb_0bF‹ñWø1†ŽW#N™ÿ±½½iã4'ê úÆ*ë,áŽP?Z +ƒWá` Æÿ{´0Ä&6AFˆ:6¤Ú†¦úùèÏ‹Ý "-šPÏ‹í|SÞïÊjí± "6ŽUlš8¯V÷ËbU¬w³_¨nšÿ»;'îéå…û²XlŠíÖKÞVËý᲋Mµ«æÕWH „‰VcÉ4³ÞüzÐYˆŠ ¥ ˜A,æBÔƒx:µ†ÚÝU›ÇÇÜS¤%iòÕÃ&`…aâ­¦_ÌV.õûõg[àb¹mROHpµ¤ˆ3.«¯ú9’ªÒFÉ#©ÍéÏcÿí·@¶¿¢G¶ eG‘­€ÈþeŠA-šW«c=T1è*mÒ©kQ±†ÎàãhVÓ‡žíCRèkð„E>/>`L×åÁo¥ûo/‹(›ZDR=–#™SoOmnæ2´€ÇŸ…ôX ŠkÕ5½mûúX†à*ŽdûÏ£räQ4KŽ\e'‰Ø‡$ +IÊy }X®çËýúZ¼ñÀ˾{`Cع¡³.8¶²`Hݱò‘h¥kÛݦ\ߢ»žH¬I±>é›ú`,r®`r`Á$ACGÛž;‚ qLùÉÛVèës ­ªù!Ž%ü@©ˆç;)CS'[TŽn&KÙå}¸p#ȹDŠ*rD~Ú㟓ŭ§¹Ë‹ëËó7v~ûóüíU4]4Q2‰•‘@á,Úu%ôÝü rºÒ‡ó©B;T¾Î º ÌIÒ¶Êé€"‡ÌCjœÔpõPá‹ß¡Äxò.*0&Hr¬“)hAizŠ¡‘zÚS]X§ nŒ8YÞ¨o Ë8Éx¨p†×—¸Ã›¯q—|@‘32¢¸¾Ì¿þuõîâüúüêרÌLÂ7LYo=*£€2ƒ8Lç}mÌ•A‚ëÓ}R…ö°|¡SŒA¡Ó¼m¡CÞ…î)tZF×ÊxVÏÕ/"RÂ"š«L<*G-a‚6a>ëÌcíîüûù®Y¨ÁJãún±q‹®Œ9,¿!‰Ø]‹YϺ­ k1‚üY—D5‘C³Ûâ3CŒãú5ß§)…ÇM$DÃîDÉt‚=(G~Ër¿ÇmúúÊ&ŒT§û(¤úÈÃò}”b ú(ÍÛöQÈ; :äCú(-#Š[o’/Nu’âHK’ËGåÈa›Æ`ÉÛM}O#»»òT+)X73ÿ»•¤@Œ“Á nñ™1Æqs­d$¬`£ŸLq‹ÊÑGÑŽº)Ú{Pì#‡{ûõÜîDûö,¯8O,Y@ª=,ß)Æ Ó¼m†¼ÛªTå"â†l ¸.÷éôøœŠ(n°½¾.aÿ)Ñ Iæ«7 •ã×PnlŽ’ýçÑ7íÚÇBDÒ1ôÒwôÔ£Ÿ…èZˆÀc B$¯…PӾч õLd€Ì–å¿Å©Gt«j±_S"&è¤LÈ…æD¦e:•„B/Ói¦0ÒÓŒ™[XÖÌaÀ„™3¼ÞÌÞ¬™»ÜÌœQŠͼ+WÅ&~^Dà`h& •`l¥9JÿP; Œ}´=ÌÎ:eg³J.¦îf›²Z”ó#ßo¦\Lªy±Ý–ëÛæØ›uO;›Û;›b?ÆÙŒ" YÎ9ÛÃòΦœæmòæÝáâì´Š(nèlø”ëØÙ`AI‰œíP9àlj(=JÿPgƒ°!f ³tÊÙæöØ Wÿ{^­ÚÇkfs;ˆæUÂn{ÚîõÚäǸBB‰&2ãö–u{0áö ¯w{‡7ëö.÷·gTDqC·WûÞ5 –Xe’àQ9z-°ï»Éèuª4¢LÉa^Ñ ¯·°zßL™š÷ÅÚ½<‡eÉf]¸ÝÊ]1[Îð»Ê= +ð¯÷»OÕÞ_÷ª×ÿþ +ÚnÉSº×”_Ýïuá߀z–m«ÈÖ¨CÜöZ£ý˾ØîNö• +ÁˆÕ°F«·¤wÏ¡ªD +ù]/ªëvÕp a4|I*‘QLû÷Ðîêó²X›ÙÎgÇ¿?ûÃymW‹{÷ƒP÷?¦ì1ÅÍ/бts×”ÂtæÊ¹÷#È?}soB«¾ÝÑMÀºØK òómñûžendstream +endobj +4859 0 obj << +/Type /Page +/Contents 4860 0 R +/Resources 4858 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4756 0 R +/Annots [ 4863 0 R 4864 0 R 4866 0 R 4867 0 R 4868 0 R 4869 0 R 4870 0 R 4871 0 R 4872 0 R 4874 0 R 4875 0 R 4876 0 R 4877 0 R ] +>> endobj +4863 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 636.7045 274.5352 657.906] +/Subtype/Link/A<> +>> endobj +4864 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 607.3502 196.7088 618.2541] +/Subtype /Link +/A << /S /GoTo /D (a00205) >> +>> endobj +4866 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 515.6229 216.8139 526.1532] +/Subtype /Link +/A << /S /GoTo /D (a00152_g7a7c46ffaba30477b8c9e3e61bd2e106) >> +>> endobj +4867 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 503.2741 202.6371 513.2018] +/Subtype /Link +/A << /S /GoTo /D (a00152_g06ba7b414e718081998f2814090debf1) >> +>> endobj +4868 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 490.3227 237.9346 500.2504] +/Subtype /Link +/A << /S /GoTo /D (a00152_gbb56b549f7ab4d86e1cc39b8afc70d1e) >> +>> endobj +4869 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 476.395 167.0009 487.2989] +/Subtype /Link +/A << /S /GoTo /D (a00152_g24f52ac52d6e714cb04a5aa01be3bdd0) >> +>> endobj +4870 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [248.2853 476.395 281.0723 487.2989] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +4871 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 463.4436 175.8576 474.3475] +/Subtype /Link +/A << /S /GoTo /D (a00152_g9f2196e2705036869611962425e404bf) >> +>> endobj +4872 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [264.3448 463.4436 297.1318 474.3475] +/Subtype /Link +/A << /S /GoTo /D (a00150_gb81e78f890dbbee50c533a9734b74fd9) >> +>> endobj +4874 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 406.5914 184.6146 417.4953] +/Subtype /Link +/A << /S /GoTo /D (a00152_g2d9d28afa353f662b9bb5234fc419f72) >> +>> endobj +4875 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 367.7371 192.3555 378.641] +/Subtype /Link +/A << /S /GoTo /D (a00152_g058a8e6025f67b021862281f1911fcef) >> +>> endobj +4876 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 328.8828 191.7978 339.7867] +/Subtype /Link +/A << /S /GoTo /D (a00152_g902c4a360134096224bc2655f623aa5f) >> +>> endobj +4877 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 290.0285 184.0569 300.9324] +/Subtype /Link +/A << /S /GoTo /D (a00152_g54b27e45df15e10a0eb1a3e3a91417d2) >> +>> endobj +4861 0 obj << +/D [4859 0 R /XYZ 90 757.9346 null] +>> endobj +1116 0 obj << +/D [4859 0 R /XYZ 90 739.9346 null] +>> endobj +390 0 obj << +/D [4859 0 R /XYZ 90 739.9346 null] +>> endobj +4862 0 obj << +/D [4859 0 R /XYZ 90 716.7484 null] +>> endobj +4865 0 obj << +/D [4859 0 R /XYZ 90 534.1992 null] +>> endobj +4873 0 obj << +/D [4859 0 R /XYZ 90 425.5413 null] +>> endobj +4858 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F14 636 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4881 0 obj << +/Length 1913 +/Filter /FlateDecode +>> +stream +xÚ­ZÙnÛF}×WÍ‹ô ÉìKPMk'uŠn¢(’À`$Ú"¢ÅÑÒ$ýúÞ9ÔCÎh`ZxxÏá½çÎBŠŒ1ü‘±Ác%2ŒËñb3ÂãøúåˆT‡gp|æ~™ž¾ fl‘TŽç÷ç’ A Ï—ï&ÄÐéŒÊÔäts ož„Ë7/Šu^¾»Ú-N›|{ÌŽÅn;ý05ºž×´•*Á$±¤ŸGï>àñÔ½aÄŒã/ð#b oFœ2÷a=z;ú£ŽS8ŸÐuq‚°î«#Á7Ô]…«UåÕiÄàòÆxr*ŸÂÿ]¶Ÿï€z7ȇÔ;.#ˆë­fïŠÇb.haÉÁ…J¤Á¡RüA´sú±ÀðOºÊaoé/·ˆ•ÛÁÒåŽ1zåŽóÖåöy”»A>¤ÜqA\WîC~„5f¶ טÃ$«¥ˆ'¢F%„Ñ\ÁsKÞUu·îcZ#¡ ¶HôÑ‘l ³2Þ>æ‹ÂVä[ëGsEûúù”áɯխ›2¦`/tè]Þ¬[0j&¨Íaƒ Ú‡ÝCǬî`VÉm¹ByÌÝcÎ;tå(¾sO€ÊWÈÝÇÝÉwÓÙ­gF‡¼šŠûòõKõy›»SŽåP+²5j×ÍVjÿ|ÊÇþF³M$¤þ>†9‚ejrq°t£ycç­ÍçM7Zƒ{H£ÅUqýF;›<¼GmbÂÐD*%&Íi¥`«m•dàBÜGGZ­†[mª¡%öÅnY,Ú³F×LS-Þ{M”F S1P±‡îÞ:Îí¸P.áþš:ÉöEöqÝy{œP‚¸Àý›mi•–l•#8Oûô4ae×()u×Pç¶t턉Tˆ+C¢*)âfŒ¤Ji•€{R*®Keçv†9!aÛ-¡j&°uLçü‡A‘Bþ¯Sœ}¢áÂlìJŒi{‰vCìï&¹<~™oó}vt†{æûÚ½ye·§ê¡Õ+~FÙ3Zýj„b,«.›Rh¼j† ^òñ›ûqÉ×oy°¶»“æeé?L›‚]endstream +endobj +4880 0 obj << +/Type /Page +/Contents 4881 0 R +/Resources 4879 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4756 0 R +/Annots [ 4884 0 R 4885 0 R 4887 0 R 4889 0 R 4890 0 R 4891 0 R 4892 0 R 4893 0 R 4895 0 R 4896 0 R 4897 0 R 4898 0 R 4900 0 R 4901 0 R ] +>> endobj +4884 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 638.7618 274.5352 659.9632] +/Subtype/Link/A<> +>> endobj +4885 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 609.4075 197.2667 620.3114] +/Subtype /Link +/A << /S /GoTo /D (a00206) >> +>> endobj +4887 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [138.5376 534.931 188.6792 545.8349] +/Subtype /Link +/A << /S /GoTo /D (a00090) >> +>> endobj +4889 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 453.1522 237.3867 463.0799] +/Subtype /Link +/A << /S /GoTo /D (a00152_g3e1562e8a6de32268e5df92a52152f91) >> +>> endobj +4890 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 440.2007 226.8662 450.1284] +/Subtype /Link +/A << /S /GoTo /D (a00152_g03d140db75de3d3cdfbbab1c4fed8d8d) >> +>> endobj +4891 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 427.2493 231.8475 437.177] +/Subtype /Link +/A << /S /GoTo /D (a00152_gbb558f3a9b1ec015e83c314aba694e35) >> +>> endobj +4892 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 413.3216 198.642 424.2256] +/Subtype /Link +/A << /S /GoTo /D (a00152_g737337d6a51e31b236c8233d024138a8) >> +>> endobj +4893 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 400.3702 206.3828 411.2741] +/Subtype /Link +/A << /S /GoTo /D (a00144_g30e827f33eacff55ecb4d8fb5a11d5d1) >> +>> endobj +4895 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 317.6152 184.6146 328.5191] +/Subtype /Link +/A << /S /GoTo /D (a00152_g2d9d28afa353f662b9bb5234fc419f72) >> +>> endobj +4896 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 278.7609 191.7978 289.6648] +/Subtype /Link +/A << /S /GoTo /D (a00152_g902c4a360134096224bc2655f623aa5f) >> +>> endobj +4897 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 239.9066 184.0569 250.8105] +/Subtype /Link +/A << /S /GoTo /D (a00152_g54b27e45df15e10a0eb1a3e3a91417d2) >> +>> endobj +4898 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 201.0523 192.3555 211.9562] +/Subtype /Link +/A << /S /GoTo /D (a00152_g058a8e6025f67b021862281f1911fcef) >> +>> endobj +4900 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [113.9104 118.2972 168.4754 129.2012] +/Subtype /Link +/A << /S /GoTo /D (a00089) >> +>> endobj +4901 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.9735 118.2972 218.5572 129.2012] +/Subtype /Link +/A << /S /GoTo /D (a00152_g499bb98a0b4ae9a98553ede81317606d) >> +>> endobj +4882 0 obj << +/D [4880 0 R /XYZ 90 757.9346 null] +>> endobj +1117 0 obj << +/D [4880 0 R /XYZ 90 739.9346 null] +>> endobj +394 0 obj << +/D [4880 0 R /XYZ 90 739.9346 null] +>> endobj +4883 0 obj << +/D [4880 0 R /XYZ 90 716.7484 null] +>> endobj +4886 0 obj << +/D [4880 0 R /XYZ 90 553.8809 null] +>> endobj +4888 0 obj << +/D [4880 0 R /XYZ 90 471.1259 null] +>> endobj +4894 0 obj << +/D [4880 0 R /XYZ 90 336.5651 null] +>> endobj +4899 0 obj << +/D [4880 0 R /XYZ 90 137.2472 null] +>> endobj +4879 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4905 0 obj << +/Length 2075 +/Filter /FlateDecode +>> +stream +xÚ­YmÛ6þî_a´*5ËwJAqè6»I“kz¹ ´h‹BkÓ»jlÉ•älößßP$e½YrzA°1E g†Ãç)2ÇðÌ#ükKz•€hƱ¬DW ŽQ@^˜¶í£Á±0ð6=M£|Ôñû$½·OTqždG§eÝE¶é¬‘mtÖšNÈ®… ÁÑ>Ùqçlïc»üv|ì L瓳°uÞu§0ä«) SNÒ2`1d©ÉLVÃMÇSvÌmÏ!ÏþÒëò«…Aa_n’z²<Ñ…•IÒ¢ÔñÆér*ô&)«ð ëNÕ½ "øï;gò Ÿ“¾°>ü¦].Hð—ö0¤’Ǥ|ðŠ¨ bkŽ6Ál’¢Ì“»5 †Ø£ZH!I9¯„®µ1š&§”¸ßSðZTÿ$ çBDˆâˆ[èšWù½“¹mòßË/›øßÓk¼«sv׋ˆ E¤ãE7÷x©)Û=mÆ6r’-a¯²Ä/“t½;n`9$ì fU—À­Y×3ûI„B¢D5ø] ,YÛ˜¯Çö„Éeõ  C¡(' +Š0XÇ®÷Î q<‡–e'4 +]Z›ÜL/ ­ú7›\EKÔ?UsŠw»§…Á×ÐòÀ!Ñù’Þdk{~~õöÏåW_¼úåæzÁqpu}}kT)››Bi¬ÚÃfóK ‘(JL(¬D?a3¡Ÿ-4bûSô:1cÖVCšm´³jWÙ«ÂÖa€Ir0œêrï‡æ§&¾D½5i+>îJÛ‘gÇR/¨+lߣÞílË÷Ø€Æ ´òT»ÁÎ>L\àÈMº#&öŒ™”'ÇšŠ›ëkdr=”câÃa—¬“øÎWSv]«<²=/UçsÓ¾sâùуÜ䯿?íŠïÌ`Úº2Á©Æ9+¥Åþ9;ë‡8½÷eZ•úà1)mËå|h¹œÊ\q¤°8_†7†* EJÈOzÌD~§Tô++E¡œµXKMÙ… +9ÂR¶í~¹±‰¿Ÿà¹DŠ*Ò1~>Á{ù)7zz†ôm~wK% +Þ›ºp<€ È‚¢ ç’5¥"§#Ã’AõFEÄjž‡à±ä•Çp–À + +áZÌn˜À›}’êâ˜=&ãÓžúÑÃÐ0<[˜ò p*}ÙŸf}zß™”ˆaÌÇ'êæI`“€²ï1[Ò0B‚“)ÔÕbUqë‹©nº´‡—fÞ¼ºu}¶9îÆöòl8ݹ¸óЙ{ªhÌÓ›«ÃÁóÿ#íR"ÒK#Ö®ï«N … $·—->S§€N]B R~–hM¢Õb“Dµx"Ú„]O´–Ýi¢µ_@´ 7zz=ÑV«{N„aɉx©)Ó!Àƒ@~n™–üøH$¦â2ì5„GÈê¥Üñ±½A˜8J \&{Ý.ŸwÉX+AÚ…¸|ˆ×æ¼gomJG±6Gæ§ÆÕ&ÁYÆ‘#@ ù,[‘°ß’&!™P‹M2¡©p„ v=Zv§™Ð6~&ÜèéõL¸½¹z÷îæÍ÷?Âbâà×Þ®Ã(T1|*ÕUýÔ]‡ 9…c'UáØÜ×sŸ7SØ;²¼ìܬ£ÕM«Ý!. +½¿ƒC­)Ljbõ™@ +G%Ø$H½Ø4H +Ç@:n·iÓî m¿¤ãnôô¶@ú盫_®ÌYòåM¿6RHðD8j© ?(‡*GtÜàø,@àj²èBÌ7¤Ç@ïÅZÙ{LöG÷Ùä”µã´ømn.[bøû}–›õÖcì¯Gü•p]´u¨a3zu½·5_Ò¶þçN¦UWßV‘Wèö¨À¸€Òæ 7g¹ÁA—‡1 2 휉½ †µ#Ò^üão”=CBmÖtPk+ ´û ™ˆ+›Š^êTCç«QŸ‹ÞøÆk³þ +ŒP÷‹ŸQöŒbû’nÅÌw–æ'A+p{G½Î>>Ýë´NóÕ»ÖˆÏÿø@èëendstream +endobj +4904 0 obj << +/Type /Page +/Contents 4905 0 R +/Resources 4903 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4918 0 R +/Annots [ 4908 0 R 4909 0 R 4911 0 R 4912 0 R 4913 0 R 4915 0 R 4916 0 R 4917 0 R ] +>> endobj +4908 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 630.6989 274.5352 651.9003] +/Subtype/Link/A<> +>> endobj +4909 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 556.0563 192.2954 566.9602] +/Subtype /Link +/A << /S /GoTo /D (a00207) >> +>> endobj +4911 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 392.5288 225.9098 402.4565] +/Subtype /Link +/A << /S /GoTo /D (a00153_g51195ea7cd5aa387a87f9d3b23905b62) >> +>> endobj +4912 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 348.6697 246.7912 358.5974] +/Subtype /Link +/A << /S /GoTo /D (a00153_g9069474ea570fd78c481aa164317dbaf) >> +>> endobj +4913 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 304.8107 245.6755 314.7384] +/Subtype /Link +/A << /S /GoTo /D (a00153_ge0f8cbeca9731af2171ffd37e79de893) >> +>> endobj +4915 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 210.2945 187.0159 220.2222] +/Subtype /Link +/A << /S /GoTo /D (a00153_gb61381673de27f31848c5396bf0b338e) >> +>> endobj +4916 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 166.4355 233.6306 176.3632] +/Subtype /Link +/A << /S /GoTo /D (a00153_gf963fdea2b75d27ef31e92d1d01359ee) >> +>> endobj +4917 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 122.5765 248.0566 132.5041] +/Subtype /Link +/A << /S /GoTo /D (a00153_gc3882366feda1cb759ccbfe98327a7db) >> +>> endobj +4906 0 obj << +/D [4904 0 R /XYZ 90 757.9346 null] +>> endobj +1118 0 obj << +/D [4904 0 R /XYZ 90 739.9346 null] +>> endobj +398 0 obj << +/D [4904 0 R /XYZ 90 739.9346 null] +>> endobj +4907 0 obj << +/D [4904 0 R /XYZ 90 715.6224 null] +>> endobj +4910 0 obj << +/D [4904 0 R /XYZ 90 491.4899 null] +>> endobj +4914 0 obj << +/D [4904 0 R /XYZ 90 228.4871 null] +>> endobj +4903 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4922 0 obj << +/Length 2097 +/Filter /FlateDecode +>> +stream +xÚ­šÝsÛ¸ÀßýWh¦•Œâ›À½ål%qÛi¬ô®½»ñÈmsªŸH^.ýë» E€j<ž±@r¹»XþX€$# d¤ñ( ÒŒËÑb}†GOpúÝi.ŸÃõs_àÇÙÙßÞR=ÒHK*G³ÇJƒ$HPBG³å/c¢ùäœjÊ’qyõ š Âuãm¶JëÖåvQ®ÓM1/²ífòÛìÃÙtæÌ6^ &‰1úûÙ/¿áѼûp†ÓJŒ¾ÂFDk:ZŸqÊìÁêìîìNO}¡ºáXçaÇ{GÒBPÛ= +½MêÞ}¹lº´Øn~Ř>•»ºÕÉí‹içǺƒ9"TÒþ {µÌ 2Áq¦ø^qæWJÅ¡-‚á.*XØ¢“ŠÙ%i,eÛî_–©éû&íç%4!ÆÍ¥ÝS#óÙwÃÊÇÜèè­žÅÕ§{ó<P ’ŠE" °A@DXÒ¢ÿH¸@K%‘Vj‹À#nJ^¹  àD«‘3nÎ&šŽ·‚ÇOÕ¿Uš×´|M‹çtW·Wyùò²ÝÍÁó¶\-ëöCjÁ[¿@5g3K^£g³-P‰Ú{™H„©NÂ]mzJ"\^^¥ÄH)?mŽòêÄ¢¼ú +¼FìZ^[vã¼¶à5âFG¯ÇëýÅûéÅßï¾\ߺDB‰(gš©SÑå %<‰‘ÛHÁÍ ]Lˆ?§‹ Åãÿäå:ïÇ·Ì-ºƒe%J‘×A¡1b©8°{u!^ƒF®žÑ´ú–‡ÀôáPk ÕÛ››.¦BEŽÑˆJq2¥Æe,x S+Vqúܰµžÿ™­Ëu}0_oËM3Žnݤ½(w» Ô&©½æÏè›tQMà½< +¥‘àR ëŒ/}¼´C(Y3Q\üµ… ‰žGø¾@€|'E?hqÏ~Ä®…¿e7NÛøü#ntôÚx3áx|1»úçôþöÓô¦“Œ#•(‚Ñ  J§'æ€ç˜FòÀ‰Ÿ/Ó"Ý­³Íá0Ý*)í°»}I7Ùæ©Ã~#¶›p1Þ6¹ä +ù!Ioòp  )ÂNÌ{‘=ˆ1ÌXi_aéˆ]‹tËné¶ñHGÜèèµHÏ1©ká` 4GLèS f.¡×*Vv8±þñ|S®lµlÇó.¯Šù&Ý–ùêÛžëºå§Ñ‘CíEa¥ø*•°‡°öŠ­:­XœNOaˆÎ°]G§ow-ãCè »ÑÑkéüxu7›Þ|ºý<‘ðôºœB1È ˆ¼®ãôœ¦Vìû1]eyá ÀŽU3R(5Z+ú*”2Hi%‰PêÄ¢”ú +”FìZJ[vã”¶ 4âFG¯«‹?¿»4•Á› !Ä,’4Q…N` +óW$$)Iʼn°²Ä”ÑÙ‰^8˪V®–®`^΋¹[¹eæ©,¼2õ»*&!è"V^Å[$¦ÞV,Ž·§0„wØ®ÃÛ·;ï–ñ!x‡Ýèèµx׃ñmwgMßc‘°R1`uÄ´ÔmX/Pnó„©9âI‡rÄŠµôl“Ù|UÔ«Åbg¶8æ›|幃½ÈÖ0¦–rXoîˉ&©^ÊUžöíŒ2$ׯÃ>VˆI[ñ9±8ûžÂûa»Ž}ßîö[Ƈ°v££×²ýæçÿŸ»:FŒÂÄ „“Šx@ E +øo{ úРš@mJé0ô}éúNl>O¼Z†Ë}-ªZ~ ÐyÝœ×Ryjfçu=AÀy7@û¡Ñ{E2^gE-•”™zŒDcĺ³¯ÜTÏ`K—½‰EF4aìU‹J *öšÆ‰EËWH¬ˆ]›X-»ñÄjX7:z½Äºû×M_n1x@‚ñp,œTÄ ³JHøÁ#½pð +j<°òò¥C©eÅö©•0/µàÀ¥VÂëÔ‚s6µ 9¯ fu£cpO•EËúð¡±Ñ™¬šƒK­Û›hehªE~/Ó¼hL×)ñƒ`@(`—é™-ï–iº¶ó^±­Ÿç¤¶´ëñr“—‹Ešçåª?[©„ Ò×Y‡›ñXÓ$¶wbñlõ†²5l×e«ow@¶¶ŒÉÖ°½6[¡ü¿¿¾»;6j.T8 +N*bžÑ—‡ÑÇ~4KŽ/oï®þ=­á9ovëÍ6ÁÇ÷÷§7óà6ü—@ éŒh†ɰŒ÷¥ïÄZu¤[FµvÚ¹\mü75 Û›DA¹ÀÈë¬ú‰4¯ÇelÕïÄ¢9á+ äDĮ͉–ÝxN´ȉˆ½nY4½˜š7?]Ý\ÞN˜ÿÔ}{«JF"€vàçÄ5¿¹Mp%bZ±‡`­©Â^š/ÿHwEæ^ÊÖÃÿ"Íàô_ §ö[…l³Ü~ÀÑO)Ó¦ù:”RX˜q.b”Z±8¥žÂ¥a»ŽRßîJ[ƇPv££×ÜW×€è„P<~s5«o¿Ì:¤&°àÖ‰ +ÅIE¼ª̵¼zA_†¥H¾'"ߊãïÕz—uk7X燯ºÛUy1ÿv°zw#yWY…ÕIáa[KÄø°B† +D1>ºŸ‚!ÔD +ù]ÂU9ë FóßFK¤«ÝÇ£p#_à©ÞÌÆïÒMº›»M ´kÛø`ú_6„6¿øÊ~ ÍÐ-Ùì.N¨p}t? |øf? üóÛSÚù$Ð|«g]ó¢ô?ÅÞ'endstream +endobj +4921 0 obj << +/Type /Page +/Contents 4922 0 R +/Resources 4920 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4918 0 R +/Annots [ 4925 0 R 4926 0 R 4927 0 R 4929 0 R 4930 0 R 4931 0 R 4932 0 R 4933 0 R 4934 0 R 4935 0 R 4936 0 R 4937 0 R 4938 0 R ] +>> endobj +4925 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 701.9494 188.6795 711.877] +/Subtype /Link +/A << /S /GoTo /D (a00153_gdcf372ff9748996f7c05e9822a615384) >> +>> endobj +4926 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 658.7078 254.552 668.6355] +/Subtype /Link +/A << /S /GoTo /D (a00153_g92f3344ec8ca46893163399c89fafed5) >> +>> endobj +4927 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 615.4662 227.424 625.3938] +/Subtype /Link +/A << /S /GoTo /D (a00153_g196379ceb1219a99f4495e41ccc9bbfb) >> +>> endobj +4929 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 522.401 235.8724 532.3287] +/Subtype /Link +/A << /S /GoTo /D (a00153_gac0de06236b02659460445de30776e00) >> +>> endobj +4930 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 479.1594 202.5175 489.0871] +/Subtype /Link +/A << /S /GoTo /D (a00153_gf5fe83be78b78b9e7d9e7f1e34ab1cc5) >> +>> endobj +4931 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 435.9178 233.4713 445.8455] +/Subtype /Link +/A << /S /GoTo /D (a00153_g8f4ebd8ef6c0ea665ed351d87fec09fd) >> +>> endobj +4932 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 392.6762 215.0208 402.6039] +/Subtype /Link +/A << /S /GoTo /D (a00153_g51c1cd531ff0afb81620151f2248cd21) >> +>> endobj +4933 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 349.4346 187.9025 359.3623] +/Subtype /Link +/A << /S /GoTo /D (a00153_g15de27b044603284f68db05a378235a7) >> +>> endobj +4934 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 306.193 211.3245 316.1207] +/Subtype /Link +/A << /S /GoTo /D (a00153_g67cf1e0d2324c93f332c1f020c0fe8b3) >> +>> endobj +4935 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 262.9514 231.2496 272.8791] +/Subtype /Link +/A << /S /GoTo /D (a00153_g24aa5bc36939cc9a0833e1df01478a7e) >> +>> endobj +4936 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 208.1483 211.942 218.6786] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4910467b83a639f06739c82cd362037e) >> +>> endobj +4937 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 165.5093 259.1549 175.437] +/Subtype /Link +/A << /S /GoTo /D (a00153_g5b9dba2123705bce1ce95c3deca0bdad) >> +>> endobj +4938 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 122.2677 272.6941 132.1954] +/Subtype /Link +/A << /S /GoTo /D (a00153_g2bc3b489923793759526a3181eb667fa) >> +>> endobj +4923 0 obj << +/D [4921 0 R /XYZ 90 757.9346 null] +>> endobj +4924 0 obj << +/D [4921 0 R /XYZ 90 719.8332 null] +>> endobj +4928 0 obj << +/D [4921 0 R /XYZ 90 540.2849 null] +>> endobj +4920 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4941 0 obj << +/Length 1952 +/Filter /FlateDecode +>> +stream +xÚ­Zkoã6ýî_a _l ÃáSû-™dR浉ØÝ¶[±…:–kÉíÌþú½-™Ô´A„¦Žî=$Ͻ¼¢LÆ~ÈXâq*R$OÆË§¯¡ûfDÌåWpýUp9½~KåX"™Ðd<l,$ Jèx¾úe’!Ʀ¯¨À“c± ¿å¾FÝó¶Øæºu›?æ‡)É&ùn©ºRƲ ‘búÛüÝèzî~‚%D¹ÿcôËox¼žïF1™‰ñ_ð#"%?8eöÃvt7ú—³£/47ô SÖ?NB‚ÚRwªÇyqûYeYî~Ř®‡E]”;Ý ƒ†vÕ7œ"†Óó³ý|]“`­É&8AœeÜYQL~¥´3oÃMT° ;Š8%Iœ$žÓV¹õ.ïxæ JiJ|ÏêÊam ·mápjUqø2û|Ë0ŸJ6¹¸¼¿›ý÷ú” eÁ½‘y 0ÀŒ3ÅIÎÛ žIKIèøU")b`Ùòxœß„7|A)8•ÙØ¢ßùƨ¿*þgZå£þ_ÛKNVõâ‚…ˆ ê®­fdqÌI˜®aK(™ð³²K’ qAcºs°¨ðÚÊ‹øµÒóüƵç; ¾ŽÝ–üî?\üûbÊñä¦G}¦‡ç‚"(ƒìDyês Ÿ•‡`Hà,¨æ:$g óôü´øZŸt{1%x²VN$~¢ì¦™ïêC‘WÆJ¾¨Ž‡)K'ùJ÷&›\o*ßZ•CÞ]U烃S$806úº?õ'6¶f)`à7ù.?,¶+ÿ‹L D¦ç·Û6 ‰Ä ÇçHŒøµ‘èùG¢ï|@$FhtìÚH¼T’ûò¶w€µêil&0ŒLïL“ŽH1J‹Žƒ ÝŽ3.ûÅrJñä÷&¤jÝ÷ zŽª€jê(BÎoBH”Jž½È6!`þ3•­"âÔ06@œg gÛïqz·ˆ3L£c׊óN×(ÍBÍgwóÙ›»ŽH)¥¤YdFC’ˆì{EÊʤä1‘Z˜â}•×ùá©ØÙô\ØÌ[Cž«êbiú«ã~_Œ0«MyÜšìýÛù´‡ÂßåôóJ¥‹—Q*•™$1¥ZX\©-ƒ!¥†ý:¥¶ýPªç|ˆRÃ4:v­Rߺ¹™}¼é¨tG¨Rgx¸pêXHsÉæ‚DÄé`!qnKW~¬‹ÝÚÏ­ËüP/lMÑÔÖBR½€ryFΠñÊå‰D„ñ,¢\‹*·m0 Üˆ_«\Ïo\¹¾óÊÐèØuÀ­*Â?M™˜\\½¹€”ÛɰðÈyl> ‘Œ~çà ‰³˜†-L‘¾ J‰ÐèØuÕð³2z^‰Àö,#AÕ®9é» +ªÎQYËÉæ‰ùá[mõÕœ»â¤s6ÖN†\ªÐs ±‰ÅŽLÈ?ª"TßH¤r`’o£û“<‘ðP"©}ªÕòé;7&)×K}.PÚ€@ 8X4P‚Ÿ%â׊ç7(¾ó¡Ñ±ëÊùÙ|þþúþúãÕì¢[ÔsŽ’Dòð\8T„åJø„ã„ö­wBPšŠó/ŠÛ€Ðz[X|½C[ëöëÖ»íwÀz{·¬w˜FÇ®KŒ³›s‹M3HO$ O„CEPx  e>BïûRA„÷¿—À`Jøä}ý¡L·FÛ¹(A2e™ývƒ!ñü†«¶µ‚ͤlãʧGûzŽÚ×t?QöÅúÅ8Ñ­Ç)*§ûÙ— ló¾þU~ý¶Îw§Ó£¾›Ñ3?ÿ}¥Ž¹endstream +endobj +4940 0 obj << +/Type /Page +/Contents 4941 0 R +/Resources 4939 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4918 0 R +/Annots [ 4944 0 R 4945 0 R 4947 0 R 4948 0 R 4949 0 R 4950 0 R 4951 0 R 4952 0 R 4954 0 R 4956 0 R 4957 0 R ] +>> endobj +4944 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 705.1301 233.1426 715.0578] +/Subtype /Link +/A << /S /GoTo /D (a00153_gb1455b27c06532a399cf06d2c1d6d08d) >> +>> endobj +4945 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 666.2758 236.4303 676.2035] +/Subtype /Link +/A << /S /GoTo /D (a00153_g3090117ef3ff5775b77cb1960e442d07) >> +>> endobj +4947 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 583.5208 209.0629 593.4485] +/Subtype /Link +/A << /S /GoTo /D (a00153_g3589822ecb9d9c4145209756396b8a6b) >> +>> endobj +4948 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 544.6665 222.0741 554.5942] +/Subtype /Link +/A << /S /GoTo /D (a00153_g5726142fec34f35fb9ea19e5a45975c6) >> +>> endobj +4949 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 505.8122 214.124 515.7399] +/Subtype /Link +/A << /S /GoTo /D (a00153_g21664b7441cfa37d280228d23316d609) >> +>> endobj +4950 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 466.9579 228.3406 476.8856] +/Subtype /Link +/A << /S /GoTo /D (a00153_g156dd2891a57035e4afdc4c2bc0b0ebf) >> +>> endobj +4951 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 428.1036 212.4703 438.0313] +/Subtype /Link +/A << /S /GoTo /D (a00153_ge6f4a2453dbd8bc60e6a82774552366a) >> +>> endobj +4952 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [133.9153 388.2731 166.3534 399.177] +/Subtype /Link +/A << /S /GoTo /D (a00153_gb58e1ceb7cb73ca2bcd73146b6c1b4e7) >> +>> endobj +4954 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 255.3053 233.5112 265.233] +/Subtype /Link +/A << /S /GoTo /D (a00153_g285a80366aed9428f64282b8d13c918b) >> +>> endobj +4956 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 172.5503 245.6657 182.478] +/Subtype /Link +/A << /S /GoTo /D (a00153_gb6e04358481bd2057524fb874cfa472b) >> +>> endobj +4957 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 159.5989 229.0679 169.5265] +/Subtype /Link +/A << /S /GoTo /D (a00153_g6836f92f3692f3a4429eb599db40cbae) >> +>> endobj +4942 0 obj << +/D [4940 0 R /XYZ 90 757.9346 null] +>> endobj +4943 0 obj << +/D [4940 0 R /XYZ 90 720.8203 null] +>> endobj +4946 0 obj << +/D [4940 0 R /XYZ 90 599.211 null] +>> endobj +4953 0 obj << +/D [4940 0 R /XYZ 90 322.1845 null] +>> endobj +4955 0 obj << +/D [4940 0 R /XYZ 90 190.524 null] +>> endobj +4939 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F50 1172 0 R /F14 636 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4960 0 obj << +/Length 2082 +/Filter /FlateDecode +>> +stream +xÚ­š[oã¶Çßý)ŒöÅ~0Ë‹x[E·¹lw“œÄzN[Š-Ç:Ë®%·Ù~ú3”DE7“ö6ËÖhæÏáRbø#C‡’K¤Y †³ÕŸàç‹)OOàü¤nðÓtðÝ9ÕC´ b8]äAœ:œÎ-ƪ)“£Ýå r<"çñsT®g»U”da¯“ñïÓƒ³i¶TÅ™ &èƒ_ÇÃ9¨û0ÀˆiŇÁŒˆÖt¸”Ù/σ»Á¿+?ʼnü‚¾ÆqÂú[G¿PÛ< +­•EëœOÆx´Kâ—ïvñf2['‹1á#´l7ò6ZDÛ1Q£(™E¦‘…w‚4ç¹wÈ®qNÕ«wDJÿ§Q‚§y™¯(mãÍ8bµN0~Œf]øyŸEFÖK¸ÚXAU€æß0¦O»mÑùæ—çµ{Cq„‰’C0„¡Ÿ{si&u«.-J#Œøâ`%+䎴l¹Þ¾kÇ&˜"ÉÀ›3xeÕ½ž&‚%’„ñWoyøy¸*“¼K> äí9-’LHíjAQÀ8•_õ}Gª”Hi)ZR‹ÓŸ‡öèçšl{ElQ—Ýñl„ ûÇ4ž¥(ÚZh ‘ J¸ÓVYuã7ÞõfâÿÐÃá„pë’R8à…éidÐJâWÔârTr àRŽQ@e¡ÞœÙ>•&·õî·æ“š}Oï·½ivÃàm‹ÐqÕÒЯ´ñny2qQ™=ÑÈ.Ý É ‚ÜòÛ8™=ïæQ‘œ!©UƒÈ–Kà=€QYÄI–}ÙDiÑÖ¶/¤äª4ý¡W%ˆQºOßDÀ¬õÍ_ÑcmÿŒ¶hùÍž)1DuP q“ÏëÿE³l’n¢Ylˆ˜9&©u>¦®I°ðœÏu,`£e˜¡ùFÉnõÓrþÓzQ|vBå'ËPùUÙ2ÌJÛ°<ÿ•vfšýÓü‹¶Ûx>’â’źŒ…³eq´ÙæMEã ×x4]Fié#Ü–Å´É +qb¥C{M «LB Kg¼Õ˜®²ü8LÊ‚>?;²œ„«(-—á˜â²yÅ/Ù²<ØlóýR|»¿¼y8¹¾:+¾Åçôäu©’åf$¢nO1‚€¹õ–ró!¤÷S B¬8óQhÍüÖº(tÇ­(¬Ç=€ÂFðC(tËèøíPøñònzvus};Ћ=$RÝÊ=i1ëIëö#I„ +aLúH´f‘ø§Y”ÄÉS ÌÍz›9dÙh$É~&aå@ —>&­™ŸÉšC“õ¸0Ù~“n¿ &2õþüüìöáîò¿gaY¯$Vž”À~ŒÔ±­YÀ™¡kÍÌrîsº[¥ÿŶñTè·¨·”q¤ :øH´f~k]$ºãV$Öã@b#ø!$ºetü6H¼›Ž5½ÏGSØï^žty俏ö¥%à(G×^ +PÁ|P%1÷Ü]™P +qŽõ‘ØåweWv•YþL³ÜZÄež‡€dr^DÂîHÉ·¹oFˆPå[ÜUf~¼j]x¹ãVxÕãvð"¢§wEZaÕ²Ÿ/kï“Ôñ›óÕ'bXeIÎݹø¸yÒz$`B€ºï~Ie–¿p Ž% ö;üE”PŽ(×Ô˜5óVsèÌ·¬· X’ÆO‰}» ]šr§£!ËvYMM{Y«ì=êº~˱¦2¥=Äq‚˜ÜÉÍ.‘ähä ‡–‡œ53ZïZ´"εv##4‡Ë^ì ,ŤwbÃJ"Š{._ýfL¯‚KHí±  ´dÊ´œQ¸Ð¼# |– ¿ˆ’hf»rød>˜ ìÊ/„–Ÿøeïhù +Ÿ°‹1åÕ¢£û®Ðãû¦ÐË—§¨óŽyyÇJ«eéÿ5/óSendstream +endobj +4959 0 obj << +/Type /Page +/Contents 4960 0 R +/Resources 4958 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4918 0 R +/Annots [ 4963 0 R 4964 0 R 4966 0 R 4967 0 R 4968 0 R 4969 0 R 4970 0 R 4971 0 R 4972 0 R 4973 0 R 4974 0 R 4975 0 R 4976 0 R ] +>> endobj +4963 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[0 1 1] +/Rect [176.9013 641.6664 250.6249 662.8678] +/Subtype/Link/A<> +>> endobj +4964 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.3666 617.2739 200.5842 628.1778] +/Subtype /Link +/A << /S /GoTo /D (a00208) >> +>> endobj +4966 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 491.778 298.8158 501.7057] +/Subtype /Link +/A << /S /GoTo /D (a00153_g3f6f1f6f98431f2d33ed30a30d2ccc35) >> +>> endobj +4967 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 454.9084 293.2467 464.8361] +/Subtype /Link +/A << /S /GoTo /D (a00153_g974c9b4bbe6b07cc1d64ac4fad278030) >> +>> endobj +4968 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 418.0389 263.8671 427.9666] +/Subtype /Link +/A << /S /GoTo /D (a00153_gcacc406c3bf7d0e00412e4c946252739) >> +>> endobj +4969 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 381.1693 265.0627 391.097] +/Subtype /Link +/A << /S /GoTo /D (a00153_gca1240bba5dd57f8c7c27123c84a1f6d) >> +>> endobj +4970 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 344.2997 245.6755 354.2274] +/Subtype /Link +/A << /S /GoTo /D (a00153_g3001114ddadc1f2ada5cc9a780e866fc) >> +>> endobj +4971 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 307.4302 220.231 317.3579] +/Subtype /Link +/A << /S /GoTo /D (a00153_g763f12007aad8cc0e483bf50f8a8d9b4) >> +>> endobj +4972 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 270.5606 286.1035 280.4883] +/Subtype /Link +/A << /S /GoTo /D (a00153_g9dd44616d41cef74d3beb51d8be5ecec) >> +>> endobj +4973 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.7309 233.6911 253.6255 243.6187] +/Subtype /Link +/A << /S /GoTo /D (a00153_g529648ad3b0b327a43689b0f1779ff55) >> +>> endobj +4974 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.0032 195.8452 196.7092 206.7492] +/Subtype /Link +/A << /S /GoTo /D (a00153_g4caecabca98b43919dd11be1c0d4cd8e) >> +>> endobj +4975 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.9845 158.9757 206.6718 169.8796] +/Subtype /Link +/A << /S /GoTo /D (a00153_g77570ac4fcab86864fa1916e55676da2) >> +>> endobj +4976 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [207.1599 122.1061 252.3298 133.01] +/Subtype /Link +/A << /S /GoTo /D (a00153_g727459e5c4f777543c81ffffa3df3f0c) >> +>> endobj +4961 0 obj << +/D [4959 0 R /XYZ 90 757.9346 null] +>> endobj +1119 0 obj << +/D [4959 0 R /XYZ 90 739.9346 null] +>> endobj +402 0 obj << +/D [4959 0 R /XYZ 90 739.9346 null] +>> endobj +4962 0 obj << +/D [4959 0 R /XYZ 90 716.7484 null] +>> endobj +4965 0 obj << +/D [4959 0 R /XYZ 90 542.7325 null] +>> endobj +4958 0 obj << +/Font << /F29 499 0 R /F23 482 0 R /F11 705 0 R /F26 485 0 R /F50 1172 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4980 0 obj << +/Length 1572 +/Filter /FlateDecode +>> +stream +xÚ½X}o›8ÿ¿Ÿ"Ú&m;%”÷@ït:BœÆ§r@ÚUw§Y¬ˆ€´Û·?ƒm’PHGÿ8­ZüöØ¿ßój# xüOèü`¬Œ9]’ÕA_ðƒ¯xøúB Ó²(áß–‰‘"HƒÑ±èÄ»¸œ‰ú@ä9U•·.7WeS4ià…07þ®ˆ²#Qá?èÿõþ$27ÖÆB)Àã}NÖD¹ØÃ%Y,p¢õŠ_°VÄÀo·éJ¾’n&!*÷Í»{®ÑÅQqÕ½±Ö{c#ûžZ4?u÷ciÈ ìó‚9fá3c×zñÒÇZ†Å^'rýäDF>†ž¤ +¢!;QÐ[Ä`1øG&9õÁ.bU[ÅQFCMÒ8QQÕÄO ã\*â´þ3ÊÏ)›)°Ï•]2Ü3{üŒ¾5NÕq!9A/¼€žéVø©.ÊõYâxIk@ìO!<)” Ü%K5)>6cçwäoó¶4pHR5£c‹rg@K½½F¢^cEè¯>7ñãFqª§Å+IÛd¡ŽX±Á6$|Ò,?ãFrÄ>õ.Ì?Rò%!>6:­ØqÊÈ``ClªG¶É¯kúhž®‹§2‰vFéÏ„U&rÄ. +Ê¢Âð¡º~ee9IŽªKž¿à$ê XFõÔQƽ]Ë›C—Þaì™wg8€z]:ö-œ‚)éMîɯ7gË,׃ÞÊ£]â MÛò8Yy¶C7úòÅpÙÖïß–w;–Ö›ŒaQ|àÓÒ.=Ïvè¹7ËdL0Sǰ<Ü!cb.VSh]Ó>ÆNƒÎ¦¼“÷ìáAÝôÞ:PR*3ò{sŽ'Œ \@ᄀüô¬šýŒÑ7¨A ǃæjaÐáåÊYÚîbÿ*W{ѺæÂ€7`Š3˜ VjfZ¥–ºÕ¯;7‹óþŸ« IWàÄú;“z‰ÿöÝI¸’Õ+iLŸ"¡Oo®àûŽ4Þ!øR5(¿&Š'P/àÝH^æOe‚â-J‚íž=üË‹¥Üæ÷6 ¥C"ýµmpܶϛ=Úq›7mëµÖõÄíz«DQ=û[%d¾UbWt,Ú©#¼ £5J"–ž |†¬ÊÿH‘ñß&,u +»À"i¶n=Yî¶g3à|Æ×oËtUÝÕÄæ7áò¹À òøç¾ÿÓš­endstream +endobj +4979 0 obj << +/Type /Page +/Contents 4980 0 R +/Resources 4978 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4918 0 R +>> endobj +4981 0 obj << +/D [4979 0 R /XYZ 90 757.9346 null] +>> endobj +406 0 obj << +/D [4979 0 R /XYZ 90 739.9346 null] +>> endobj +1237 0 obj << +/D [4979 0 R /XYZ 90 549.2183 null] +>> endobj +410 0 obj << +/D [4979 0 R /XYZ 90 549.2183 null] +>> endobj +4978 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4984 0 obj << +/Length 1278 +/Filter /FlateDecode +>> +stream +xÚ½X[o*7~çW¬Ôè {|YßNÔ›„6G:¢ÑŠÂBPÃ¥\ÚDÕùïµ×^ +a5jòÀØžùæâ{ÖØCú{ +y‚ _Ñ€{ƒiyc=}UÀn¹¬×Ë» Qáó%Qžò'Ü‹F)Ç>#˜xѰWÄJ–ÊD Š›z[“ ±,>÷§‹§ÄjóÁfšÌÖýõd>+=D7…0Újv†1ʱÑûG¡÷€¼¡6ð¦€|ª$óþÒäc¥ˆ7-„fƒ§B·p·Å± ©äÃr{zF œ9H´¿Âú°R™#Tüi˜Œ&³ÄºQ% +ãj«yY¿Š;a5¬ kv‰Ï´²²ò0‹Á¡IaV& ƒŒ^nkK‹AlVÒÕ9„"¡IÃÅÓÕØŽþ¤˜Þ4,õâFÆNh¾8³Äãúe‘dôS2ËÈù´Šá¨çɰ<€Ì$cÆ<ã^%ƒ•Ó1zêa%ô@É`Ò—yz‚þ—£üì€u”Ÿðò‹CûS~ÌaéRq2šél´ƒûz;Mĸv]mÇúÕu‰ªC_fýiÒã°mü0F“§¤‡‰„ù±3-™ '#ˆÉe‚UbcRË÷\  I¨V/Z­¨_tZ•ZµÒì$zÖ¶ *U.Ü4Þðî>4 ñ C²2_¶ÝøžŽQ‘@’*Oò:úÞã0º;ÍÐyé(¡6w0Ñ çç!Üv¯b R*S3E(( ¹%hd5î†oa'n·:[›„ä"Tõ°í!@¤`Ð$Ï­Õ»Õ–6Ì!‚‘ÎËÖ奤y›,òÒc›YiÕ@·ŠÈËZ¨ÃÐ (T(2/1*Õ¯:——P„d^64+™”’äúØ+ÝÌPh«%ä¸ÌÛÿ¸ÕŽê­fܽ¿ÐißVº_6´g’€é´î#³yAÞH~¡Ö캤Ö-PqÊŽð.®·+µZÇyà“KÊ0i¬ã¨~›œQQ'`Lá›óÇ%5ƒ£Ð©²•^¯¹¸0(K~C`uS$Ö(g96µÌA`ÐÁà°yèËÌ]m¯ÛKÿâz/ôÜže÷Ð0Ù’˜lIBÁ[O±7ªöÇ“A<˜ÏŸ$ú•rz0EŽ’ÔJÁŠ]¦N×°òu# ;i¬;í@¦?§+/$ÁÞÎ|ùãþR ”IŸ3Fޤܚ[¦Rø4bß% ÿNhDöÅPRÞ.Iq%,–«=ݽ™;6Ýò¯ˆ¡-FÈן&ìMVëÆh±^ž½ÞSj‹¶Œó b|ß'•ßÞc×ï?E‚wXòéÓ^þ@‡Á¹ 4õ¡õíëÅ£UB>F‰ òQ=ÙGÇ2Yo–³m'«‘ÎÁ »ƒâ¸Èv«ŠP_iþ<Ûÿ‡¢¢ï**Eô) ä+—ø±ªâ¾þ‡«*[Ú©*ŒÄ¿eµJ–&Ëx2|UWúK] +þŽ ß)!¬yŒ²}ä±R_CÛ»ðXÞá*Þ਒ì³}šL‹é½³håÛ]˜d×W`‚y½å`|cBž¾=8ãÿé™'}¨’ZS²ûNÅ}%¨4Ï8”hÁ€“­)ÆÃ«d–,ûëdh_¤æ3û{›7%ÌŠ7ÀÄý¢/„~!îIK7¹ÜR£aÅùÒß¾~{Éž½ž_ÆÉÁƒ—y‰¢ô™H°§endstream +endobj +4983 0 obj << +/Type /Page +/Contents 4984 0 R +/Resources 4982 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4918 0 R +>> endobj +4985 0 obj << +/D [4983 0 R /XYZ 90 757.9346 null] +>> endobj +4982 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4988 0 obj << +/Length 1353 +/Filter /FlateDecode +>> +stream +xÚÝÛnÛ6ôÝ_! À¬3Ë;ÅÄnâ®ÝX0d…àʲ#,¶\Kéš û÷‘"eË2­¸«û’äA¼œ;Ï4ò úGž„ž`HB¹ÍZЛªåó²Ûmµß®œ­¯±ô$s/˜8 #ìã›# Ðq3x4¾ˆŽ?o< +}W45’R¯¶ºÁŠ‘•ƒŽ4›O­›Ð+yÞ´ ÒgÞ_jBÅÞ¬E1)'w­aëýŠŽÙ(\ê0D\úpO­ˆJ}°ROuÂÇmäCx´Œóûåü¸ÍÕ8]ä‹|iÆÏ͇¾*4Uö’€rÊ,61»ÿ:7©Ù|Qlb$‚Ôk#%?õ õ€ð±WYnî¯`@˜8cdoTen¤m‰ÂÒ¯©ÄŒJY>ʓȌïý0/pêƒK{µ¥ü„Ka‰qC`4‡ËøS˜,ÔhùdpERÙ°äæÔ>2L’€1TWA®ÿ8Ì7g¥ì%1ý +®Ï­›ül>‹³AؽþexÕ}ö'ÎÕ+kZ¨P79ËÃp¦ML0´Î>‹gÑâA›ÚùÉ+0g`§TÛÒé÷}KÔ`Ü5˜<¹¨Áô€QƒÙfÔ(«'é<«…Méù›m+j0„º +¼!j°ø>Qó¶7 Ýù@ÑJ™ÈÃ+7¼>½ìồá¯M¬ üví_ÝÆLDÐá¹v.‡á°{õÛ#œw×bg!MÕ—<½êKY}I¥úÆóñFþðÀ’áÿUu} ¤&ySÑ%ß¡èv/;ž&¿ÎÓ(lð4Šžœ§Q¼íiŸÓdìTßFa´ŒGyβ©ö¥euÝÔ-A]ø6bët™ŽÆÑ(³N÷1ÉI“g–Ü!X¹¨€¼–ÑXY« Ô*Ëì#Û}²°—0JW'%•Ö[ƒÜ¦*üÌÈÅÚë¿B|ª’¢&>q9ÇN\Žb€›}…®¹dqnª\ ‹ô䙋tö(élÒÜEzú(é餅Óì·Uy`kA%†ÝTý-X‘½YáhÞ ¶ØlïÍ\ÈgÉd>Ž'frÝ„gýË×a‘ßöÎ/.‡ÎCœfqãj€F;sä"S S2qBç*u»½¹YIf£i©|þ™ÄÛÂU6›%d +çO®QábÿF…ûV^8N²(ýÏMaÕZÔ‘dCK!Jÿ]uÎ ÷lg”¶Ge¿Þ̈҇w7O¬ß]÷jž6Š®V».“ýZqm8]*F‹Åx”¬F1€¤.´*a§ËZ´ÙAÎv:¹ ÎÕ²"(»nèªo8Šf¨û¶27ÚØ»¡eRÔ‰ªÓžõÕu7cÞÀ¢öcîT;èˆ:ö2Öˆï»ØP¦óz¨ÔÀ¿éí½ø±ÀW(êž^ý­€)ˆ_¾­[!´˜çñ<^ª› Ò¹ù¾+oŽ;º·ý_|áKL^ê‡J=S-7£É1fGéÒLî{ ,àÇóí¤_¦ª³®™Gÿ0à°Ï„×cendstream +endobj +4987 0 obj << +/Type /Page +/Contents 4988 0 R +/Resources 4986 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4990 0 R +>> endobj +4989 0 obj << +/D [4987 0 R /XYZ 90 757.9346 null] +>> endobj +4986 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4993 0 obj << +/Length 1285 +/Filter /FlateDecode +>> +stream +xÚÝX[oÛ6~÷¯ÐS`o•Ê»ÄtÐ.n–¬¹4vY ¨6“µlU’›dCÿûH‘²e™–½yÀÙâõœïð~<$t€üC‡ǧ¾Ç1aÎ(éç^6w éve¿[ðvØyùq‡{œ!æ ïJ zAä Ç7]@ÏE>ðAw~r)‹t¡t¡ÿ%éDèÊÑl4OÄ´ˆŠx6íÝO;ýáB³F1ƒJï—ÎÍ-pÆàix˜Ôy”àAΑ“tÂUeÒt>,äèŽr‚Í> +±Í@æÈÀÊ@$íõµ}Ðç=@š§a.¦ãߪ¥é8*¢=—É^Ù¡ ®þ”£‚°P†:C(p\(±‘ ”ü]ÙEck4+™añœ +%ø qœ¥ŠwòrkvìÑÏ?]^õ?\÷Ãz9lÑ‹ì«ÈÂ2’€&† RP‹•aœÊR¶U ncˆ©u>±¶ÒŸßö¡7ÎZèûÞàÉo›éÍo˜¬ÓÛb¡›æsÝŸFY.B᫞ò( üÝC +H‹Ì8<ž¢˜ˆé‚*]å4ÖÀ\æ›(¸'e®ÄºÆ¨Ëß/¶°*¨®¿œ¡xaE*xeEŽ­­ÄÈ{|ˆ'%½Ô1ý°Ø.墵,‹Üw(G?ÆÅèAÉ)‡ùÐó1„»Ä‘ÖÛÔãúÌ“yl¨cFÝ(ÊŒËËáÉÅy8¸~{Þ†go¿ZÑÊF¤Ÿ»‰HFésy˜xSQ$QþùÅFÏ ÓE6q‘ûIžŸíCx+ò«‹ëaÿÊ + 豸‹æ“"ÌfóBdû`‡p+vˆZ±ÂAÿê×Mø± ÿ4W‡Å^ÀÉvà´øÙà8~¼ìÛa3#¾¾ÍÔ¸@žœ¢]“ `3®v^ò¸ð}ÜPîo·-hß +¥C“#»qÜâ Äã}œ‚ÀVà¶ß3è‡Ã“3»[² Ÿ)*,âDì…oÇNZ±÷Ïí˨‘œ‰bžM—ômWR‘Ü7k¯om­¢aÅò•ÓæÞ®.ˆ]yuQ´*ÇU®º“!nNzFÿ·;Âxç¤GÞRêI¹:´\è¦-Ç0Þûεߕ‹îåB ‹¬aŽ«+W|W^µÔ…È€}]ÛŽWýË÷uýàÀ*GÆÌ°H’YO î[–òøw1+•=iß,•J%hÓD€MÓè¡vúå^µ†*c]Õµ%#¹ÖéQ_ÌŒp©ý9®Õ7ó!©Žýúf_KÒ­·Råeåbm¨ÖÍ®·1!Ʊ'º„Öè¦ù,=H|ës!p¸e{½Ø•oŽœe מ™Ç}¨9ŒäDÂЊÂ|,¦"‹ +1Ö‹³©þžU…Ӥݹ©¨4¬ü‚C„‘y”Ç +Ó¥»¢ÝY¦+ëϘŸž«̧ç{±öv©-«ô'¾ *Óendstream +endobj +4992 0 obj << +/Type /Page +/Contents 4993 0 R +/Resources 4991 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4990 0 R +>> endobj +4994 0 obj << +/D [4992 0 R /XYZ 90 757.9346 null] +>> endobj +4991 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4997 0 obj << +/Length 1339 +/Filter /FlateDecode +>> +stream +xÚÅXmSÛFþî_¡¦SÚørï/¤| `ˆ“”PpÛ„Ñ(èÀŒìHr“ä¿÷¤;¹~9ÉxÂLó2òÝí=»ûìÞju(€æ/ + @ʃ«» nÌôq¹å®YïÎ ¼t^a( 8æÁàºBà0Œp0ˆ/¶@;]Ìàv<¼š\«ËÁ›€B ã³Á•³Þ`¦ÈÙÁG¥šO‹KÄÆž7ˆ’,¸7R8¸ëPLêÁ¨sÞùs†cª >w">x`fDµ?ظ'¬;˜ò.‡pûEå&@!Hƒ.2J¨¬D~µ.!q07Ý}º?•Â$àŒ‘&Ýh^¹µ¶K+i (§Ì¹$¬Ky‰ \’Vât^Ÿõö?@‡QtXƵ~'±y¢ò¿CYŒ¯¾EwºHZ ¯zÇý“q+“¢„{éÝâÕ°²¨0k«)À8]à¨ÈÂè&JÒ]K¢C± ½ŠƒI—,"΢”kËž}œö½ð¼wrØ?9ö»IgÛMpnó…íïÞ¼5ÛÞŸúw3ï,w˜ñ¸-&&-,5ë4ã$¿ÖY˜æ˜H·¥Hîtæºpq¬ÆÏ]šYGšA”1¹ðÏ~þu2è¿›%„C™&“0Õ÷qTDµIváÛ7û´&è/“$Óñ¼u’z•sèEΤäºDjÔ½µeŸ“(Ëux—ß,.ï¹°¾>8}tÔ;ûoÉn’™âÖÔ©`³ÞA¯ÿwÏŸœ8”™Žný"Ôù÷Ý»êM"Î8YHÏßWÓ³‚@¦¼õrõ£8ÎtîHÿ%õ¿ˆÐôÙs/.®¤í!N&%²îÚAéÌÜ1·“xUÂMV ÉZhº,ÑȦ¢-Œ¤º¸‹òÛ˜`ML8°6*D|༉‹6pº"Ò̆haãðäÜÕ{™fr#Vd+qš¯K¸jb¥ œ®ˆ4±bŽy +±¾Ž¦#7ÈÆÓb#fDÌXàÐb¶ä‘ô©Â<­WE›$›Y#«¬½ÓQ]Ší{ÜU™$uœâ:Å®Æiœ·G7i1æÖºQ –=Á¼œ}˶¼£VÚÉò£œOGî…㪀Wº\ôÞßßÈ\]6—)Í>G¸w¶>‰ÕÕKhظNn¦³Æ§™uéUü²FÊ(q_1ž,÷\Ö! ˜°M>¶#š›E+‘ïEz¤íÝÙ’+á¶ã/L`>ê݉6r”.O‹¡®˜Þ«ÎU×rß»µº/†É,½óˆ;ê}Öi1F£‡Ù>Ï ˆ +ïE4&#Îø]®U·ÒlAÏ_švLY_ž9#JRŽuª3ÓºÄöFpœÚçõ7;ˆmOÝÀnŸp“] íÈôXÜþºÞÁl{œÙÁ´l<*ià?>ØçáøËÃN—é)oþ<üü â¸=Áendstream +endobj +4996 0 obj << +/Type /Page +/Contents 4997 0 R +/Resources 4995 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4990 0 R +>> endobj +4998 0 obj << +/D [4996 0 R /XYZ 90 757.9346 null] +>> endobj +4995 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5001 0 obj << +/Length 970 +/Filter /FlateDecode +>> +stream +xÚÝW]oÛ6}ׯÐ^{ˆX~Kê°‡.ÑZžãÅZ! Õbj²¬XV“bØ)JެÐr‚ {hŒÄ$o¼—¼È†òƒlÚ.sO(·—k ÚŸåò{ 5fGÚî?üZo~Á¾íŸcn‡w5G€a„í0¹aˆÇv¡ GÕd.‡ Ž€z<Æë"zr±YVk‘ïâ]ºÉǷ᥄ûÈ 1F8Rqï­›[h'’à¥ñ=f?È È÷±½¶(&í$³Öo{m¨Lûcˆ˜6Èm¹âBÔnËýºzÅÕ&P—2ÛAzµí‡ÚâÆ)²;ëåjSeÉØá޶"^ÞWéVè©x,丱e".E©Ç+± Æs(x\fP.Cjô +\Ðx£áˆ0ã}86v'ã>¬ÒLü DòÒ\þªaσ¥uFL‚é…rú¾ÅN9þhtq› ­žqÕo|d˜`ö‚ jÒÆ¸Ù‘> +L€ =vxݳsþ»7æÎyUâ| ö½Þ–°ÞÒ—Mš·L´=Y-‹e”æ©::¸Üäå®çˆ0„ïEœÖñ2Š“d{¦AÒ¼ASë™Èëâ©YKÆ!æ÷XÑÒÂm1Vi¥… +5ðjlN;7®¶W‚–°Æùé‰íqHïÀYîJÎñ¡³\4ûú¦U÷ˆ¥Ô=qÀe¾ ƒh2›„“wS#(AÏÎE岓ÌØYç÷è%!xODVB~ÀCWIå⡾møáÕl¡/>œÏÏ£Epý1¸ŽæWסŠt<i¢¥wʹó»&èì÷éô„àÚNKðSš'OxfŠçÓI0 _@‘ IáO"¤tZ…ˆ; BÄûæTˆøÃ*DaW…â¢XÆY¦ŽQ9ìÅ¢ï4T´-áUœ'™ˆ²<šJRBé7—ÊN¤„wS²÷•(w'Sâ¥¤Ì +ñV°µLÝà[sNŒ2É`O/ºbiRËÊ¡Œ{åxÒM=jtžÕŸ£ÕÃp£»ÕF’::îJW®ýsîY‚Û²ëzÅ=¿¾:‹(ø¨Tmv5 ÎõS@.òÜ×fò)IûEÄè.26p¥Å•BÿÃÂ/?Ž~+‚¢®±E‚ò½8ãÿªK©û,Oº ‚»m—m‡|É.D>k%Ž÷TÕ÷"[y3ÝPÉ.ªþþµ\ŽUÍáæ¾Åä-n:2ùœázt7Æl´ÙêÉóÖíÓ×¶k{üúY<ë×T#e8¥¯Xöendstream +endobj +5000 0 obj << +/Type /Page +/Contents 5001 0 R +/Resources 4999 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4990 0 R +>> endobj +5002 0 obj << +/D [5000 0 R /XYZ 90 757.9346 null] +>> endobj +4999 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5005 0 obj << +/Length 2011 +/Filter /FlateDecode +>> +stream +xÚ½Yms£¶þî_ái;Ó͘ ñžýR‚IÌŽc»€7Ílw\r¬ .ङ;ýï aÀ ۙÎfÖz9GzžsŽt$†<þ†?T$…ÓQúÛ?|ÄÍ7@ºG¸T¸r×Pjœ&Cy讋dÀIÀ¡|ù qðl%þCðäï|îéì«ûi(ò*ÇK23¼·L·šˆàäÓü9øò•ϧÏ š* _p…瀦Ááv BV6gðk5NÙQ(°èH@`ó"‡[ %1?¥Æð|ƒPº*q ã¨DçEAYاÄZ!éIã}⣖ÔCyÉkY^ÇÉ6%æ 3bû89´Äû¬›´Üÿ6Âuè{9z2¯—„;”lÃ,Cç.‰ŸÃ€Ö²'/£%DÁo6ñK=–U?Ž‚07í¬ô\¡Û¢ì²{`µ÷À€+Çmz4m†{Ý~P(û4£™yÔÙ•]¼‡ø¹Ò¡k¯¹öòRG¬Câ,ôÑ96$ 7!…Eá×\ÒŒÁ.bSø/Ü¢„,5Aå „·­:bÀ—5@Ux—±á)cS¶Ʊ±qH{ê÷Ø[åd ŠMôà ôÔIÿ±Á›¶Èå +¢Àñ‚ÚrìO!ˆýýE™×Ø·.èVã Iqëáý=ô6)k8lR£ºG¹ …ÞQ#¨™¡ð¯š7ò¶­äTuµ’W³t[K=¤Éû°ä'é‰0ûû`ë‘è~@U ñ—¿( +𴨙° ¶1%S® +6À®z¦ƒ¬±\;FÓx½ä›h·c¤þLhf*§Ø!?O*_Xå¯$O'Q-»¤éA"¿eTuÕÒ8Pz‡–;±r†™_»wºm’È!­ {þÙ›ã²vu_þº*6s\Ë]º¤ªÏˆ 1Ÿ¹¶uµtç6è?t‡ýóÏñîÀR{“ÑgŸùÛÂ62ßÜ&óÞ.¦e‚™Úú̵Lçœ21¦Ë±5»!uŒ,º9)L­[Ë¥úîüü`ŠnZo( •ëò÷Ö´ îЯ¬©åÞ·Œm¹³Šý5¥¯‡ê¶kË©NšK{1wNp€ý³\EcË1¦ºukŽñ`afjUâ©ÏæŒØ×™èÓééø¢\ŽÃëʤNÒ¯¦§Ø€Þl¤á5¶lÓp«ÀiU ¼^°k¦ô6±0 «ª™¿™ØÁº}~ÄÈ1]bE,{>ì ¬ßê74€òKÏ÷F:Þ +Œ¥mÞV£Ñè,¯^º™ÏÇÎ ý µ’cÚŸ-Ãt>œs§µ0–ŽIÐŽuWoÙÀKƒ*ÓÖ«¥c–‹5sMÛ^.\k>+.‡Ý4ÄÞ4&ó;ïÔã:;n-Ýù¬jx%Ìíû&É<Æ‹uOøÝML,Fw¹Ym‰èUX:x½î 6Ro6mÔ xQºŒh#1fÞL­sf´VôþlU^>o¼ŽUß±D7§þÉÝYºòM€;1ºú=Ø?¿¹Õ‰lnè3=b{IÖq’Ý[ bçˆ +ó«"O@–äõ¥¯ø4©b•|+¬}É“9MTú€È©Ý %^ñ±"ÿ<™¿iæ¿·´ðé Hö¤ÈGLÀ_Báßì‹Z~$)Kë3(¯my¥8rÒ|x-Çñ_¯(j›'ÿ ɰÏ?,¯?€endstream +endobj +5004 0 obj << +/Type /Page +/Contents 5005 0 R +/Resources 5003 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4990 0 R +>> endobj +5006 0 obj << +/D [5004 0 R /XYZ 90 757.9346 null] +>> endobj +2465 0 obj << +/D [5004 0 R /XYZ 90 739.9346 null] +>> endobj +414 0 obj << +/D [5004 0 R /XYZ 90 739.9346 null] +>> endobj +5003 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5009 0 obj << +/Length 369 +/Filter /FlateDecode +>> +stream +xÚ¥RKk1¾çWzÙ-lœ™$“Ǫ}…–îMd±ºŠà£-JÛßìfÁ½•2¯/óÍäC á ô uÊkÃr¾ W!ü °Mg!Ÿ]Ü¢wO^zå™XËæFe I‹IB`ÒŒ8HŽO/Á´ ‚hŒ~fÛMá~~ÜV»Ãì°ÞïÒi1£âܹ%f5cÝ÷SL¦ àX€Ò>·ò;8 Ð{’[aHŸœx¯çwb¢tÍgQw È2Dài@ +óº8sM5 3¯ ƒ®+˜§$7Õn±^F»×ÔYR ”Ë 3“7Õ·MÆ+ËåE¼,‡ƒ—AùX–ë”ÎïÀårº„öº–Š +ëülÝ‘-ÿkßbòAM—‚á°@×ûÔ€†éL¥¦úPíª¯Ù¡ZDi=4÷óɧh“cë µ7ôI÷©Õp´–)Ùdÿk¾ÿžô÷󻪮”WK¢cKó±nendstream +endobj +5008 0 obj << +/Type /Page +/Contents 5009 0 R +/Resources 5007 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 4990 0 R +>> endobj +5010 0 obj << +/D [5008 0 R /XYZ 90 757.9346 null] +>> endobj +5007 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5013 0 obj << +/Length 1250 +/Filter /FlateDecode +>> +stream +xÚÕX[oÛ6~÷¯: °×ˆå]R»X“´K¶µÙâ< Y`È •%M–rÁÐÿ>R¤É¥ì&Ð6A‘<—ïç;¢ˆ(ÿ‘@ÇcåÎl9€Î¥~7@fÚ•ón[àÍxðü-œsg<¯-pFØGçÑ‹Š›p™'Â]†qšdYî^Çå ‹‚Ã̤÷ bÈFããÁáxíÕ€b„#åóŸÁùt" îx |æ\Ë(°³PLšN28ü±¶£'j[l {pˆ9‚›è° Ök‡ ÜÝFH>ùžãA  Ç;‹ý°FØmKkpÜ‘p=ˆl€‡F.—È~ˆÓYREB÷žTqOiÜ å”Õâ¸O|=*Ī’Šò:+>º‘¸Šg®I­š‹²Ì#»³*”ñRvnóŒ‘HÌãÔØxsöV?ü T¿UYT³R©èE¹˜,¢¢6‡¸ˆ‡™ã"™GÔ¯­þXOQàùØi K[è©20­æçðBukAy &!µ¡ù¸ñ\»6IØãµ]»ÿß_í0pÆÈ—„­ÑºÄÇ€qÆ;!¨#ŠÓÒ.2 «(¤6â*‹£õªmˆšdý×6§(é/ÚÝK›5bj‹â<Œ¢bÒÈ×=«3Jí$©“P?梈³(žMê±==(é£ûV‹¶ËeC?™%AÞCÜ߃{½‹‹Ûi%—v‘­Ê®­^MfäÆ\]wGæÙ›ý¾^ĉPꨦU/ƒ°,<š‘jÉWºÙؘB„Ñ6D[ñ\‰u,¾Ö ÜŽ†È9Š×d½v_—·¹)߯ ¬E™¥+5vt29ÿ2þëäprt¢Lï0/K £&XÅ8×å§7"ÒRˆÓ¼Úº#„i]å邸´—BJz47õeab §Ù•yœW鬌³´©§WÙ,¼ëbU%¥ˆšYÝFa6C]€]ÎA@»¼$²Æyj½W‹¬JŒ©ñ»MQͪæ!Ý€i2docø2ɦa¢Ÿ¯Â"§‰°-7î;©¯ÿMÑÍÌš4“Jt³ +ÔÆ1bò(Hð=^]©Ã]XžÙLJ籤!ç­DËvdN`ä7'·`+ã(4H?Ù&2}Ò@E²2ËvvýüçЋnÒKþ¶ó‹’ï1”~UÆPöM2†òÇ2†zd€¿Áš–¯ hDæÖÃ}Œ7y\ˆÈrPÛM† &mJ&£õÄ×/#F}žésFç… _°ºùI7ŠÈòd÷þ´™}ölFÚ"rƒ«öÖ ‹}oDfü«™yß$‘™ÿX"³à~¯>F|޶Ÿã-ÄçÄ6¸¾¥˜ß‘æìàÄ&ÊFAim 7/Â@Ô³^ÎAI$¤>¹sGVßðùRÉÄiÝI²xÄo®™ ù;‘Š"¬§nù%Tû{óp> endobj +5014 0 obj << +/D [5012 0 R /XYZ 90 757.9346 null] +>> endobj +1366 0 obj << +/D [5012 0 R /XYZ 90 739.9346 null] +>> endobj +418 0 obj << +/D [5012 0 R /XYZ 90 739.9346 null] +>> endobj +5011 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5018 0 obj << +/Length 790 +/Filter /FlateDecode +>> +stream +xÚ­VmkÛ0þî_aŒd̪t¶^ÜÁ`[»Ò ÛÒO] N¬´fŽ9vÚ2ößw²ä.I.°Åtº÷G:1ŸâÇü˜ú’K‡‘ðg ú7¸|æ1Çlnx?öŽ>BìÇ$ üñ¼Õ áÀÀ§W b€¤’šó’œ¡–8½OË\ÛÉI9kº¨“:+‹áõøÂ;?ZvŽñP0c÷‡wuMý¼ð( cÅý;œPÂâü…AØMrï«÷ùQe´}ñqö(|\‘”uÆ+m|ÃãÅè²å¤I—“¥®²2Ífß(§þ±7&TÄ$·RÒIµL4ªHùC×p4[^µœ˜p¿±~>%ë[m‰dZ®9oŠY›½v–ër–ü™WzÕäµN;®Ó¤N:IÝ „ qo{¬†ܵº-›Üé˜:»+,›¥Ê¦#Š7 ]ß•Õ÷×;Ë7y9MrK¯“*K¦ˆ‡ž„ÅμIs®»W}gµ.]N:…yãì¼µ%­r`ÑBOÆ#"ÕVÂm‰`¦è¶Ü’ÔÕ1››zo9×Y4°äÏžÀ¤á XR-'˜A£jr$¸ý.Ÿ“T¯³™ž` ÒgåBçé¯>f4 "ØÇäÖûh!sàs°"(ì…-ÛÌâåùhry2j¹¡"À…Ø—|Ö“}F9ÊŶg¢Ï]éb±’‘$ +¨<èh}Hò|žï¾ŒÜJ¶ÐUß)Ók]=X’Ñ޳²HWÔ:Ü-( ,‚¬)˜ÅZëÐDß/³J·•iÐÓ® üu±CƒÕ‚7ƒ®ŸêèÑ¢÷Ýæî½ÈSìp)„sH÷1³LícFŽY麩\1h¯À½ZÄ& ±T TxP©‚ÿ÷³‡‚+"8¾’vÛ#CÈÈÞ¶MëLpñO³íý +E^›­[… •éŒ! `$àÑãê™.t•´]Ç4ysjÌø©#.†Œ7aàFz á1¸WbGXj>>(+;yúœ˜>t/‰û‡ýä aš{O–~éü@endstream +endobj +5017 0 obj << +/Type /Page +/Contents 5018 0 R +/Resources 5016 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5015 0 R +>> endobj +5019 0 obj << +/D [5017 0 R /XYZ 90 757.9346 null] +>> endobj +5016 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5022 0 obj << +/Length 1194 +/Filter /FlateDecode +>> +stream +xÚÕX[oÛ6~÷¯:`°×ˆ%)’ÛmKº"Y×fHúÔ†bѱ0Ere)I1ô¿—]É¡K‹uµx;WžóR$ÖHĵµOÚâgž#0ö‘I(´q?äå¬h3eGÚ|‰Œ=Zx¨}Œwätù4­·°D^–R5WUýO˜©Ë|¦üœÌ˹hšeægà^†&¿PµŸAxæbËö¤[r ‰Î +–t?u+ Å %Ao>üz¿NCÄ$8¶)ïë¶Ö†QB\ J¬CyÙx¼•vÑ$åߘãË*ÏtK<”[Ò}k:HJ¬¶g>2 +d&aòešeõÔÑw#/SL«¦ng@ÞÅÔv—ªÎ«,ŸM»9¯æ›ä ¶c›®Tcüÿq(mϪØùzÿéÉóýׯ\vt 5{åUéË,ƒJHþ©Mþi^æò­Â’þ¶ÝF,}°Å76ÞȰ=p’HºGD²‡÷¶zEIOŒÞ±Eµj†²¶rRߤ‹lé[=£¾0RÆ«E^(ÃNºüÝšªTLƒ…*-å/¶ÙL­Òl§E1ÈÊç†l ñWÛà[¬Ñ¡etÚe»{$P[¸³%ú0ôÔ©«§Ã9ge1=«.¡;oËY“W¥«—Õ,ý<®Õª-•¹UÛfi“:‰©-,¡>£DëT[54zõYW€3P¼R®\ès:冒½éó¢:K Û¿Lë<=+”ïð! ~›|åô»rRÁ¦8E«†aDpŠ9ú¼¿Ëq%™Œ!dh…@>8q"În¦¬ÞÒ)1ÐüÑ·È!Ÿ?ZŪXÁ6X;m©T×˼V™§\¥·˜-@½¥sË[w·Zû¼²Eg€^ü ŒµÍ϶ysx<Õ…ûÕ‰[}üøØZgW§m«Y8lÌ×8ðã’þ׸I&‡W+ ˘~3X2ê¿, ×·ùˆÞã¦D‰¹£s:4‹B Kfn»âþ°d 4û`ÉøÌ2ßMƒÅî&<ÿ ‚7Ç>ÒäaÒÒî+&{°j³;B‹ãï Zœ|Shqú¿„¾Zœ= Zœï€; ÅŠ´$HCЦÉn^}èE ¢\ˆû܈¾rèkÇð“Ž'ëƒÚc¶„+±oQ¸/Z5m]®Qî¡„Xx¥ÐÁG²D„&Ñ÷ñ‘¼ùlDa±÷5 ë`ó1ý%/JÝ“X¢YˆÆPïÅH×8JÜ‹ aŒ|¡JU§]ñ1Ïb¦:˜öO×9š>na`>¨»?¥ÑSó•gF:Ÿ…íÍ'”«ÚÚÃc F@xöÁ¶Õõ‡sÆí1Ï]žýù<³æuendstream +endobj +5021 0 obj << +/Type /Page +/Contents 5022 0 R +/Resources 5020 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5015 0 R +>> endobj +5023 0 obj << +/D [5021 0 R /XYZ 90 757.9346 null] +>> endobj +1367 0 obj << +/D [5021 0 R /XYZ 90 739.9346 null] +>> endobj +422 0 obj << +/D [5021 0 R /XYZ 90 739.9346 null] +>> endobj +5020 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5026 0 obj << +/Length 1686 +/Filter /FlateDecode +>> +stream +xÚÝY[oÛ6~÷¯02`KŠš%)’’º®h×t]ŠnËP{h‹@•èX‹,yºÄÍŠý÷‘")™²dGIž–<ˆ2/ç;Ï"šBñ¦>œºÔ¾CØ4\MàôRüüf‚t÷Lô϶ü8Ÿ<ù ûSø ³é|Q¯À áé<úpŒ¡w2Ã.táquv.š#Uãõ—`µN¸z9ÍÂjÅÓ2(ã,=ù4;y=o$k`ÔaHÊý{òáœFàÛ ŽïÑéF¼@€|OW‚ó’LÞO~oÖQõ„>ý(rúDˆ_°Ñ …]¥ èÉ A—Xœò0 ò­x`y³][´o{Ëe`ÜLXd‹ÝNSšã@ÿ–;ã…´8à´·`žFI”ÖºÇMéŽÓÆÚ84naÑvÑòt0 ׂ°‹u½[A+¤¶ßk|® ‘ ð–åÅîÒ³‡û«%8T쥃Â{w<¡q][#z?bw(˜š—qÄÿlù”ñ˜NZUESJɬ—ÉIIÒMÛ ­;ö"ÏVï(nŠ’¯†•‘ÞÓäã•ɱi‹’ç:[Äë ¹‚âbÞh $U<ÚçÊþCº2J‹ë,ŽzÂ7A»>k(Sjz¦a5ík_ŸÈkL¹Q±ŸÜW ЍaŠvS(%±ØecžYÞÕÚæÌžÏ_éÊ}ÝTÿòk‰bS"\g µ>Äó:Ü­©4Pòöóü·_߈) l£Y‡)íóÿöõ±ÿ[„#î="ïhg}å¨].ƒkëìuBËgç/ÏÏ_½|÷NGÀ ̳Æ0]˜øw;Hhgž6 šº¿­[ìÛÖ­Esjý®Ø=< ‚¥ã‹°N~˜ïÆ| ‘ +yšú%Oùµ‰¸AÚ9i‹.SgdaXå{b/½[ÆÁ%h¡Xß +R¾Ù©-E¸LŸ…£/yô¸3% +J½Jçñ5/LÊ‘ú ë0þ¬Ö +j¾t„Wi¶ _6°ÚAòÈYءԜÞr^æAZ¬â²l&ò2JMê> endobj +5027 0 obj << +/D [5025 0 R /XYZ 90 757.9346 null] +>> endobj +1566 0 obj << +/D [5025 0 R /XYZ 90 739.9346 null] +>> endobj +426 0 obj << +/D [5025 0 R /XYZ 90 739.9346 null] +>> endobj +5024 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5030 0 obj << +/Length 1036 +/Filter /FlateDecode +>> +stream +xÚ½WmoÛ6þî_!ôCcÑ; CÛ¸YÒ-ikûІ"˵0YrõR×ößÇ7)’*ÅvW,!éŽ|î9òîxDÿÈâÐr© 8q˜lFÐú$Ä—#dÔ¶ÐÛÍ/æ£óW˜[p†™5_)†Å[óåû1tbc +Çë0ŽS{7Apœfñ“ókË€” t9C.¥£é¼6iQÂ4øyôþ#´–‚ÙõÂ=jíĈslmF&ÕG<šÞÖ8Z¡&ô9FéóŒYBâBTy†…£®vŒ1åöãØ±l$ÀO©~Rá9s°Õëpb3ÇÛ,-Ò< þ -ˆýLËL¿øÛm~¥I~¦Eyáaõš•AQf!P–lâLûæPÍÏ=ÀÏ®‡Q“ß¹A#ÀqJ Í›ØÈ“LW …e´]i’„A.¥@üüi~+ ØFà›@¡|3»}ùzqus5—çö³íã–ý,J¶eqW®VaV £¿ÂTm«+‹?÷Ør¡aûOŸõ ±™q~`ÕìZ%—qWÏ&'Ç«(ñãxoœÜ™ÍJá²*“@†E5Î7r_„DÔ_k?YÆa>®óýᤛM™˜ðZöGÅ×ÏsÓ1£H£¤MxiÇÍF¼7£}˜>=™~ºêØ Ê, “¢òIE³rhØ*û‘9åº&æôf-î)¨h nO3îm®uÚ*âaÅÓþqÊ¡b‘(Å'-’çâ¸nË%ç’]«‰é¡³T˜´¸Ì×QÀù÷æb•}xëI›ç¢ÒtŸÌýÁM™W9ïü½á—…â$1#ü¤: +S™îÊ¢;9 ¿ˆ<æMNæ~•ÙUõjR²+Æñ·:U$6"‡+~f–z-—aÒ>[ë}PÐü“ùoü Ksð&=9!MN`8‚4vï~Ô;ÖS<·Ý +£º3@vg‹ìÌ÷¥#Ùï™Äª`ÒX¨©KÚ\¼áæÀã¦êæàÅôòê¦î† +!‡}BÔBšMo.³ù»n«ñèWépuvÕ‰[¥ü¾nÄþò'y4È·L¾›>¿˜ßv ž)Œ³A b0Ħ$ÁvoúiýèæH~¨+âÎ KcÞ±èQX V½(¬…òò·ÛÙôð¶»}B¯…$èÆáÃç(‚­S§NÂþ4øÎÑjF÷ö„rÜÞë¥ 1ÊþÓÅJÝ =1ܼ2Q9ˆW]œ Iò2LÂLT˜¥¾ÊÃI>¯^®'ˆŽKó°y§˜<ÅPa™~[M0÷IýQ^½1£x·×Ï‹ôëþ“8:Ë#o}=ëó/ ñ¦Áendstream +endobj +5029 0 obj << +/Type /Page +/Contents 5030 0 R +/Resources 5028 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5015 0 R +>> endobj +5031 0 obj << +/D [5029 0 R /XYZ 90 757.9346 null] +>> endobj +5028 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5034 0 obj << +/Length 1357 +/Filter /FlateDecode +>> +stream +xÚ½X[oÛ6~÷¯Ò»¨ÞEuÃÐôšÙš­ö†"ѱP[ReiiPô¿IG’©8N‹ÁæíœóÃôá¸z{®š Ž€ºñêk¸ÎWRw^fQµ–i–I–N>ÍÞ^Ͷ– 0F8ªí~]|‚^¬¾A@Á¼kÕöÖ#Љí¬FFnõè‰FÀåCÄí ¢@`ë!VûÚÁðÉAÇK¹ZeÓë ‚ã¬XÅ`ÙwB0‘ð=R ´!ì@±‹§íÕ÷@"‹Æ.¨á É”+,ǵí-ê)R.S¿Yðøq35ÝÎ y ôf K53`œ"¯5þÆq™]Y•kÛažo´ L@€  +i(§¬‘ bÀ†ömXÝ£_àŽ¶cã~]e¬™‚1>OqGw #¨¤’T H]ƒlïعIëå2Ùôù}Ø;ðÒŒ¨õ«*–&\Þ'9XÚ¤`VFašfeGªµx˜(X¥Bëê9#JÙúï·çó“óó'gg.æÈÓm‘!,.]†ëdÛ<¤]fpˆÅ½ö±—ù€ˆºòqØu±úP"DtÁù.Ä⮨'iRî ¹+1ø3á®–„â›ï“¾˜ºçg‹ýêlÅ~è«ÀÖÿ6üÿ#é?}!€¨ï|’ƒjggü‡^Åšw=¡DÁíW/UÓûЧ³…G°¬]°Pj¨od* 7ë¼ú‚ªÿ·wÄÆ•é¨O]ýŸbò›@ !׭ųqëÎîSa}³éW¯7Wrç}°~¸sDé?TÌ¢endstream +endobj +5033 0 obj << +/Type /Page +/Contents 5034 0 R +/Resources 5032 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5015 0 R +>> endobj +5035 0 obj << +/D [5033 0 R /XYZ 90 757.9346 null] +>> endobj +3302 0 obj << +/D [5033 0 R /XYZ 90 739.9346 null] +>> endobj +430 0 obj << +/D [5033 0 R /XYZ 90 739.9346 null] +>> endobj +5032 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5038 0 obj << +/Length 1998 +/Filter /FlateDecode +>> +stream +xÚÍZko£Fþî_aµ•šT1a†›I_U%6›°rŒ xÓU[µpŒÖ€Ëe³Qÿ|˜ƒ²x·Ò«½ÀÜÏyæ9—ƒÆ,ùƒÆ2;–‰‘9^;Áˆ?’ꛢÍÒ>©w¸¶F—o°<–YÄâØÚ3ˆˆ0ÂcËýíLf¤ó سøMϼ$Ú}<—Ø3Æ9ÿÃz;æÙ)à +"™<ï‹ÊkGªU­H8åëý=úívìÁÞŽX†“§Âø‰XÉ2#sPØÌÑ/կئ&í›&ûßÂ.}UòO‘_~•üÝÐrÃs«Y´ŽýÇmzðÔNᾊ"fYVcÀ¾ºEÍ«ÀÙ«ÖF©ïx°.¸Ç—G€Ú®4yص ggûAåyŽa¹©Øyx +ƒûÐÛÆñmÂJ7s¼/\þÿ¼‰EÞ¿sxv¸ +nädyÀ´¾ëÜMDŒá|™’“› 9AÓ9ÈÕw´‡5üðˆÀQÖTW‡`€HPËnûέtùå]€ºQ ¾& :QÚ“òxø”ä…À挫#Ò†¬×&WmÒ§ÊÿA8(›öž“;rÖâܹá¢>Åy(k‘!I^Ù]þ” ÌÖ­Fs7›(™ªñN›©æTNÝlqmªTÚ¹b)-Œ‰„ý0¸bÎÚÔ–½nE~•¡--Õ0Ö+KÓ—‡cÜ­~O( ;®aç-ëÔ—-ŸGÈ®ï›Jæ/L»çbN~¨º¿UÉjà—/-C©ØmZ†6³^ˆÑÔÒ ëÛzd~~Zª7 íF]ÎÔæÚz®Á½fªÐC3óåjUøÞ+îºÅêÊÍmj·h}lI!~^Ü—®¨ÌßiY^H\´©ÕýÁ0g·` ¹è9º â)Yƒ };$Hpí8íH*«Ÿœ¬ÙêÞ“Ôv>ô)5=I©áá;ͽªß^1ÎýQ1Bu…#^’¿®tÐ/^‘3'½ƒ õýê»n½Dö½Dô5oÍD|ì÷X®”ý[?tvœÒ¿¡ l¿96„?:$ó÷ý…c ñÒÑ!X²]HÄ/ú.¡ø¢bJ† ׿;Yâ¦ðK?¢ˆ]^èÅvq‡“U‘Ÿóòç¼¼=GÂYF Ó'{…¹+Ì–¥œ0åÛæ Å(/†PôfhÇüw†ü9>=?’£B žü£‰#øü ½ˆJendstream +endobj +5037 0 obj << +/Type /Page +/Contents 5038 0 R +/Resources 5036 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5040 0 R +>> endobj +5039 0 obj << +/D [5037 0 R /XYZ 90 757.9346 null] +>> endobj +1567 0 obj << +/D [5037 0 R /XYZ 90 739.9346 null] +>> endobj +434 0 obj << +/D [5037 0 R /XYZ 90 739.9346 null] +>> endobj +5036 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5043 0 obj << +/Length 1362 +/Filter /FlateDecode +>> +stream +xÚµXëoÛ6ÿî¿BÀ¾ÄÃÌò!Rd7 ð7K—ș݀´0T‹Ž…Z²#Ék‚aÿû(‘J¬úì&Ý +0÷;Þï%›ñö Å|áÍÓönÌòY‡¸ížÙïíü2é¼xM•§Tx“EÍAÄ)¡Þ$¾>1ÿÝ p€O¶çWfÈñ AØwQºYi;9]Ï·©ÎʨLÖY÷ýäMg0y8Ù Æ™ Õ¹·ë÷Ø‹€o:1%¹÷ÉL0"JQ/íø”5“UgÜùýݨ~œ0HAᙕ“FAjô ¬~Bt{ã“ï’l¾ÚÆÚÎ~*Ê<ÉnÐòçJû§/|n!´(>‹,Ö ; §­r´†0Éôm=z‡9þkÄ5’`Ž(æÜ룶/kß×[> +$%ÞκA\ïõ6:Ê@´°;Xgqâd|QÓsЦ8E!.üÖ)ZQ†Áþ!Ñv1öãHrÅÚBÀDÝ•Ž(D¨díƒìIÄGæª[g½#ÌO²RçY´²\&Kgä4ºKÒmj'Ù6ý s;^;käÚ\¼.ìäÓRgv;Øñbí0‘c¥Õ²0,æôiwå,Â|£V¤­=ä²ÿçl4˜ŒÎc» !»ùÐ"ÿ&Æ< ©.ŠèÆ­.uëÜ„Џ:ì!A(6>âm\š¨ÜÎK;޳b¶ŒÝUü it{DšÍ-3Jâ!JÙPʆp±Šn +òÃ΄‚H(’]f¯/úgÄ\×øjŽÝž_±ÇwL$>Êdxõjx:˜'ýÉtìÅwäDžÂé<|;UBZ³Â#IúD¡ÂÓþèÔnV Tì(«þtòëpÔŸœ¿5"1lù@n,ý£|&£iøÊ,:I(Ä¿.£‡ô-JJRÓÙ¨ÿ‡ï98 +ŒF³Ëþø·gÁ ˆ‰ü"“p>z|#êËLú—;LÀDáýø2)õv«‹ª( xQÄDYñIç0‚ˆm¹ÌsÀ@€¾+óèÂùÕ?à&‡Å·M¨Ö@rµ p›»‚C F>!äYùÕ—Hˆ `U'Ø]A «šÌi™SÃZQÿPѲ¨l®çë¥Ï蚨Ș•¶ä%ˆ¿ò~£!/&¼ù** +˜º²\]Ó÷09r+Á´~C›lfÉ&Šãü¡8×3Å„(Á\|ººÌ4Úvh‚¡üZÕÞÁlNǃ¦ÔXuþ0_IUq€ + !ø ÒT„óðÌ®PKbOëJP››PzjjÀpäZIJ½¦ÉDl »ñ÷ˆË¾jÂ÷H]S“‹}1ôm¶†‰ƒ=b£Élóe”?:Ï5;D}_S|̯)è+”_šÓó«Ù«aøºj9‡ogƒÐ~(@x¨û V¯×N›&L¯ +ýµ_Ǥ5¾‚¡‚çÔ4" +ˆ >•?QÑçOü‚“¾|Ríûÿõˆc,?“55àªz ádþ…ÄYMŠë¶ìpT00O2²ØS—QèY‰˜r€Ï]ؘž.þÓ‹Sýf& Ä¿ûdfJrÀdõ¢Ä¨V]^#J%ì™ÎtnÒalÇÖ™ý¿loº„Ÿlݤ~c«þñKÊ^R÷ºfR¯°£E—òº¡©&ûÏp»û½÷öV=ŠVúÂbéôendstream +endobj +5042 0 obj << +/Type /Page +/Contents 5043 0 R +/Resources 5041 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5040 0 R +>> endobj +5044 0 obj << +/D [5042 0 R /XYZ 90 757.9346 null] +>> endobj +5041 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5047 0 obj << +/Length 1592 +/Filter /FlateDecode +>> +stream +xÚÝY[oÛ6~÷¯Ð +t°ëX%)^›u@‡zEº6ÝoІk+‰ÐXJe9m°ö¿eI¡oX÷Rû’Ïýð𣄤ÿ8P(L„*¢<˜-:(¸ÐŸu0š>¨OøeÜyø+Q +'<Ÿ—8Á$ÏßtU(zÂP7ïaÙ—ÙÕMO n8ë½?(’!b\ 7s ŽÌÓÎp\iƒXıÑ÷±óæ +æÚ°çFJ²à“¾A!VŠ‹%‘»¹êœuþ¨äXBÉàó‹áÈçô°sŒh?…õ GQoÀê.‹i‘ÌÜu¾šöz•\OVóëÉ,KÓÒWLeH(%ÁkC¨,Å<°a…$8¨=ÏËHYæRÜc;œþùâÅqÉ3À, +áÚpRN˜EK*j=eÞ§Ü +}XI*Œè&óêÖ ¾Ý¯T1rÆ¢½Bc­DŠ„˜(ÙrIìtéd#Ô©nxõV/I‹8O§W CgŒqÞR!w„K…ŒÓ†É¯§W¬]Åež­..íÍÔ³lq=ue§³lÏíÍÓÓ3{‘N1ð¤@Ëãb•§Nj츚Û1)Bp% +©Ð.4]Q;\T$½N¹–¢ƒ#`b[·x¼ÑâÊãó6ã)>´l¡rˆ.6EhKùîÖõt¨UºL.RW_³ËinWÖ)cXúJ`MkÔµ"®§ù2ž˜\½E m¯—ºîÏ«8¿Õ²0h§:÷œà–kÌjøÇ×Ö¨nkXúµ•uìeÞ§„ͳm*Uo!#Úuk3Iï'‘¤r¯L–n÷ûÐÛ¹Î'窩„!Ÿj(«úÓerU&løÙ¨ŒåfÓ™.|JªÊg$äˆølv‹°F¸Îu¿<7:ïÝŸÝ;*§U¦ï봱︡á€ÊÇ +‡D’Vå³|ê÷KÞ|3 +“A0‘ýê's [St¢Hrñ®™øÞ[à‚qИcÖ.UûÕf¾ª ›"*z@†¬Œ× + +êTàPD¸µ8™[2wdÕ³×c¶Œ´œC +ËGk¦e5íS`_}Cª9Ú·öf#Kýê%âïnáäT<:NŒtk÷ª +;\%Ë¢ +ÌåX “/c˜¬¡Gî`Vu‘Þ:âD^Noâ-¸„ÓƒÝI3}ÃÅû8®fâö0þŽš6/³#çM:³UјemoƒRœ}K(Å¿¿cw¡ÔM–̽M@:¼Ï>Lâ´Ðé[šŽf*`ÓfR[¶hª†u¡ ;Îïž6çérr9´UA¦=ÜÖLî͍Ö}ŽF¯FÞ|K +bàå×y¶Jç혚ë£õ»°5­© /Ú÷CvM¢aµßE*´§wÑIáÀÚÚË)<«àR¾J+Äã`€»OÜEvWYÚ„iü¹°Ök‡‰b­æ©tÅKZ¾¡*zZŸ'9ƒ¸×' én9n-OU5㣺ì~¥Ûg•Úå7Š{ä´W…Q*áam6Ÿjò±ËÊaUÕà º0³6b¥ê%únxj–ˆy«¯ížO‹é±ï[1Þo'HW¹Úü?}Æ(?ÀHÍ‚#Rÿþ¢ô"’î3al~§q®S<·aÌ0ãKwñ¼‡Yw7˜Àˆ‘èAöN‡”Û«óaÝ,·7«“ßavßßÚñiöùö"NÛá1ßX<ñù`ÎGEendstream +endobj +5046 0 obj << +/Type /Page +/Contents 5047 0 R +/Resources 5045 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5040 0 R +>> endobj +5048 0 obj << +/D [5046 0 R /XYZ 90 757.9346 null] +>> endobj +5045 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5051 0 obj << +/Length 1707 +/Filter /FlateDecode +>> +stream +xÚÝmsÓ6ø{~EÆ¥µÐ‹%ÛlìŽÑЕA6Û—Ò˹‰ÛøHœ`;-Çß#ë±k;r›–}\j[Òóþ*‰õ)ügý€ö=é‘@¸ª?ž÷hÿ†÷{ §˜wê ~öž½æA? âª?¹©}ÍÞ¡T‚ YÆu[}´+¬Œ¹È˜V|{ÔiH~ð V²‰PùíÒåJdÆDa•¤ÖÈXrí2…L[lzì–OtNí¶ö¯¸¹mUS×#>ìZ•[®ú7Õ¾M¡½ëÝZÛõŽ?ÀÎuÐÙŸ¸Þ:ÁAš.Ò;r+A>Þ½<þ³› ¿Nðp5¯6EõÍ÷ã ÒÅøh®òi𶣝y¦kìÛ8){Ϧ¡êgZ ++¬¤]°Èj7$ë„,Äéä]€(ò­'-ÒDcU9ïQšl¥[ºV"›ÆÓzƒ1œâþ¾ ¦{Œ¼œC'ŒÂI•Ц‹Õ û’3\¸XU;‚¼ œ›Ó„ +_qÔ`"Q*üV—ºg-ôÙƒicÚóál¥FYÖר~àUKvc–åó&7méñì$>µC—µ0.¢yøÕ< a¼û÷hp8<:7öþ-4Š¢‚êgIºF¡~_ 3Ç×ÃÁRÂÁá~{³ßFimUÇ݃Qie-»Wñ¦WÅÙº/àP²Àîõ€0Áë׊žðõ)»à¨û‰’Íê~”D)xÇÄ\,ó|W¾¼Ùar{…úø¯xÒç\<çxãÕA™·ó.·µêõÇúÕÄÙuy+ñõú"Z»Ð-ý @Àendstream +endobj +5050 0 obj << +/Type /Page +/Contents 5051 0 R +/Resources 5049 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5040 0 R +>> endobj +5052 0 obj << +/D [5050 0 R /XYZ 90 757.9346 null] +>> endobj +5049 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5055 0 obj << +/Length 1755 +/Filter /FlateDecode +>> +stream +xÚÝY[sÓ8~ϯÈ2ÓB-t±d‰…ΰÀ²0,ìÒ0Ë 0c;‡Ä¶CÛÙå¿ï‘%;±+‡¤Û§íelërt.ß¹H"c ¿d¬ð8àRÌãh1Âã3h~>"¶Ûƒ~osÀ/“Ñý_©+¤ãÉ´¦ â”Ðñ$þp PpèQŽŠC"’2Ÿ; ðŠ?M^Ž},æˆë±”pÝ:z6iW´ q&ˆ^ïëèÃ'<ޱ—#Œ˜’||¥èx1ò)k>棓џ-ÓQOpÉÅ s &ÆÐ`ÒFAÎÀÈEÈÅ0Æéô#æ8 É"\.«Â;NŠâÐÐõÓ#óÄ0‚˜×¿k¹A +ùÂç––<ô| +½›TÊ*¬3É’9™<ž<;}ööí›·?;É(K¦¨õ|:ÍWYÜgN¿z¯ß½z¥9s pK¬Z™{ ±:øîì¥ÎVfçÜ7`3)Æëø²s·îQˆ ŸŽ7Úÿ²êȳù¥y‹Â¶…ŸóUe^«™mûºJÊ*Í3­‚rm‚0‹{ìèH:I&U68h¹,ÓŲá=NK`?NbT¯@™%¾C> +$%›š0ºó(Sˆ`Æ{\q«á¬Q@ÙѬ‚­“Y¬ñ°Z´Ã†Á ’VUÛ ÚAÃäg«¼62N¾¤Ëž4ÎÍ[š àÂÚûýû÷˧V²r–¯æÖ¦EΣ}N¶ÁAY8D³$ú’ØéáY˜6؇;ë¤UÞ®l8[5`ªfáñ—.JlZ„U438“á `C0s La$¹b=Ò¤EÄ"ÀÒÄ2,ÊäT÷hTèÿhG""@, |—õ5~Véò"WV¡¡}Ï<];´mò Ö<PD¸ßó +éŒF²‰Fç³tž˜X¹‰ðãݸôm°4*kÑá†nÇ•Ûh3M‹ÒÚóóe5„Ã]Ì2_QÒ|Eya1'UR,Ò,±b¤Sû¬ŒŠhHÕ‚׃`”e5å‹%,U&ñÕ…ò¢34Ë‹E8o¢tb#gÈ÷U°WdãQFz&…U³É¹õÐV”ˆw°zÇšö"ºb]O¤ü¾z ás¿µñðºWmü¤§A͇õF‚¨âtÕ(S$–}”–»ŽŒ÷Qg–jGY˜.€YË"ͪZÿ·úr…Ùy™ ó³[ëàO ’ûdÙÇþ0GJ¨ ;l«¦&ùn“ì¼L¶x¥"×¶Øë¼rƒm:‚1‚²’ïe»€ÅD_,ê²Ý±b9Çx7ÇÒö°ôצñˆÊ~"S¬Õ³K­¾³•Û9a¯Ü¨«¯ªXEV£qVžÚ(v„`eØë•Ø1o‡÷ãšK[T—K‹µÛ65Gó°,{mU5ïµÌ“쬚5Æ9Ž ÷m.î0qFú›ehË;Öëkùz5WÝYs²Ñ[cÝéÕüþT:—ñ¤]óáC›^Å:&þãZQÓ#Ÿ¡ußi мWyË0è‡Ó¾q•CÈá×ÎÀOtµfsp“Ï^üa#ZkïïC ­÷_dh³¤Ú„­*ß@Ênª]ÿæ]Ќͻ½! ±_Þ$äã½¼É0íäÍOÖO­£þ6yóúD÷“µíïÜq*›YŽ×à»6)“Àf€ßÀi8Þ3Ìo$«9m;FÍ_Ç…G'¿ÇÄuÕ)Ò¥&Ù¸¡©/m)œ»Òi‹™éÔMIn£DvçHíJgƒ£u¸±M.#øÚ¹}½ß;O¶ïö¢udØÜl5õ±(i«u°$ (`¤'h+ ¬œ‡YuÓîO6ë‹æ¨Q'YwñåªaÃÔÈ052@Íw¶6ž¼ãIÖUV†Î-é¡s-F‚}êLئl©ßºõ¸Í®¸óéLnÆÔ–ÂŒÑ&z^³‹uR¡ÛŽí´9ØËœ­&ŠL1ûJ‹QÊ"ÃuÀ&¨½›û1a6•‚s¶W ¢ ²@}ÔIüP¤»vïƒì}:E,¤´.`§lÖ€½.ïm + ~ ®-G ‹°97x÷ÔÆ¨é*‹Ì™—YÒfÀî’r_ 5!ôªh/ Rõ¿3;³~û-OcÒYÌ@Ô‚€A2Ñž­g ߌÑ-±…1ë¦tÓÇa«xyåYæ˼¨ +&ÎSÿj… âΫ ø"‚‹ÿtëRßI˜Bݼ.‚MpÀds«b™Ðâ>O²¤+½ÙÖwFyfž¿7// ?XÙÖê'~@ÙüôÄ?aÞ¦‡”×Túc¥“u=ÙŸ/Íói~qyugO=úJÈ¡Ÿ“p™²endstream +endobj +5054 0 obj << +/Type /Page +/Contents 5055 0 R +/Resources 5053 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5040 0 R +>> endobj +5056 0 obj << +/D [5054 0 R /XYZ 90 757.9346 null] +>> endobj +5053 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5059 0 obj << +/Length 1399 +/Filter /FlateDecode +>> +stream +xÚÝX[oÛ6~÷¯ +l‹—J%)^Ûµ@‡zE‚,kg{hƒ@±åDˆ-9º4 †ý÷Q"%™2-ÇnŸ’À ÅËáùÎç:@þCG‡æ Sg²çZ¿@=íÊywuÁïãÁ‹?p„'(¢ÎxVQ Ð#"g<ý|€ ºˆŠ£²KÀô€êŒ¾‹å_g*<Ïœ8÷òxPä,ùõÇ|p6øØÐQÕ>}@êÈ` I¼Láó}ð?ë,[c'ï§A<–#®9êl³ó"úxÁRÍoœÕ\Ø'‘š|QM"ß`Ç…Ru˜WK~­f°Ç8rV†Ý÷WàîQBüMgÃÕ÷®/‘àHþVHŠ®ÛÌqPÁôv¼EÂ#ì|,Â"ÌÔ©jâ`ª^–¨6¿ rcÉÜS¹`õ5KÒz]Ø%qÍçªwU•¬zI‘{Z¾‡™‚) ²Í!Ð…ðúx¤Á¢Ëý¸t“dy;ÜÊ#ҢˤtÒi/<¶«ÝjÓAÒÚÂjüé9ƒP¾&ÑÔæÿ¨ù4Ì’ù×ËRäe$šÜiµâ!@ècÄP*·ŠzCÈèÍíØ Ò,+o§‰ZYðËÚP¬±‘ø½›æYx÷¼ín 54¼Ž²<Ô¾˜åi1É[ƒ^K%,‘J5Îþ:ùûrt:þt4:ÓK£-·©/.-㤟ËÁìstaåã†ÕÜ7¥šu„x­ ߎG—ç§çg£w[¢P_»WiÜÚF}—-õ ¶¤"b·ÜÖP£íÔ›VmÛøÃš¿5o;ÉŽ…¬3õl÷Ú›õPÖ—iPnzXdªÎ´«-ÂaI¬{ƒ ƒ{›C}P™o­ÃˆŠÉÍ•µ% öäkÏeÅy%¡gçY_+ËDõAuš–WlüL³¨Mw +Gúº€‚Êû‹kb´‰°édù`xcÙyÞšãÆ –Õ–cõãU7>ýc§À×(´±ê#öݵn^ÄAOªÌá“Ë8ú®T™û;g‰'Ir«o襑 ›Éaw’á MíÉLµ·qr››³¾\‘ã½RaNöJ…ã$oòß:Áñ¤Íø“x®Í¥P² ÀePÓ8˜oCìÝSùFœu¨Ñ)Ð4©«‰®)D¦M!Ò-oêȵ^Ût´=«©Æa¶3’û }RIJ’0 Sݸ½‹&AlV&ENÍš¥•ƒ¿ ßL#ÆŽËô½ØËèØËèÓ0/R-«·ªY&•›ÒÒ°{õP{I.¥šg)ÃÄ×Ìæ­Õ£=ÐÜC0J&j³¯Å}z~rbê;n¬­qÊìÒzp ý¸Ï4„ÿ#kgŸÜí(ˆövHe1Y`G€Ùܨ™2܈¡¥ŒóŲS^×Eò#+É•úZ&‘¬<ÊdšõäÏ‚ïQ_ Ñföj#ŸìS 7¯ +'blÏÒЃ˜YŸËtH ý®ëêÍË-ÐG«OîÔÌçå‹´äÆ2k¯Y)™}Æa*Ù©z\/CWÙþYwއú"Ý‚—ȉôë¼,Ϩê͆ˆTa§üXÆ¿z¨_ð¿=\‡ko÷壺EJÿùÚË{endstream +endobj +5058 0 obj << +/Type /Page +/Contents 5059 0 R +/Resources 5057 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5040 0 R +>> endobj +5060 0 obj << +/D [5058 0 R /XYZ 90 757.9346 null] +>> endobj +5057 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5063 0 obj << +/Length 1263 +/Filter /FlateDecode +>> +stream +xÚÝXKsÛ6¾ëW°—ŒÔ„Þ$“&Ó´VS{\¹Ôöàx4´ÙœH¤Â‡]·“ÿ^€iŠ…)ËvstÀ{±°û-¸Èòœ:ó@@(wf«t.d÷û2îw›~˜ô^þ„'ÇÜ™,J †v&óÓ~¼‹ì§ä÷E–,¯ìƒÙàlräPèȸ®æbä©ÞÞpRïhb„#µßçÞétæR±£$ð™s-  ÀΪG1©ËÞ¸÷[-G” l¸"6`Ü‘=D0,qz…hà"ÂþË !€z”9.’»P¿œóm9Æ)rý†ËO—˵ùeš—UCèÊ2ÊrÓ•è2f(Z´æÆáªÊL×SRtýÐ,‹òz®RÍ¥@âsy±€r©½F†.)e'ù =ÿÚ쑊¼HüÑïÇÇ ƒ¤Ê1²€§Àóñx}\.¢>À”âÖÖÄê"I?B#½Õ]À×F{]|§‹ÃñÉñÓáhòáp86Sž?äz¤ÿ”[ÂÖVT¢„æ×yº±Ó3Õ™Fg¯­K™Y-”’F€û6ËÃÜÔ#hÿuÍÈhendstream +endobj +5062 0 obj << +/Type /Page +/Contents 5063 0 R +/Resources 5061 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5065 0 R +>> endobj +5064 0 obj << +/D [5062 0 R /XYZ 90 757.9346 null] +>> endobj +5061 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5068 0 obj << +/Length 2089 +/Filter /FlateDecode +>> +stream +xÚÍZmo£Fþî_aõ*5©bÂòfH«ªÄæbNŽq'=µ•K ŽÑÙàò’\Ô?ß…ÝÁ|øîCu§x_ØÝgfžÙ@]ÿC]…íöÅ>£ð‚Ô]l:l÷7ßuíîáþÞþ·vçú=§tF‘8©k/ó$Ĉ⺶ûLJäË×gûìEªOqQd/Ã’‚öÙÙlש ÃEºñ‚ÄIü0¸üËþÐÑìbe +Lä%”­ûOç¿Ø®‹~è° ¯Èb÷WX) +×ÝtŽ‡Êºcu~+æ!ù€cò‰ˆ?. Ü„¸OT, bYö"ºDò…‡ë—K,-³ªÊ ‹ ‹ä~·Ïr Û—J>@÷öŸ&h¤.Æ×g€24è²'a(×ÙÚè rþÀ?æ]½¢OfXIé[ÕÊ{F”ÔÝkÿñ‚ãºIø…é–¬ä«p<£ ëTaIó1|ëU~ý·~6áÄlÓ—¹Òl×T +ƒ8¹<™ø5Ú“ÎÒÞÒÇü¯•®ßzÎáÄÚ7ƒ‘Ú"t=RZyŽ ­ÙâLýêòy|H“UHP]gCJÃ4øä­cRùÙÁí¿º¤‰Y„›_êA(ßÒÀˆÍûØrcyÓÀ°ƒ•v3îYq'F*inß"ÿy•eÿdEvÿPËr=ü‡¿ªQ!Lf$…Ê’ð­Á¨ë5åK†(.¸ãE/žÛ´”p–¶ÄÖMÏõã$òŸÒ<.äøœÀ%…4¦¬öiO¦Ñ«<õäNôF)F›˜ªöÕOV¤|ÍZÂ4i[j-À&tý¥¿ÈÃ]؉(Ä­mü$ñ(Ðm¾ø.Ô’•“@Éôëuøêϰ«×Ïæ÷[#.àm¼ä¦af¹ṏ!—JY.m¸ó[›4N€‰ö.4ã<…/ÅØ_õЕÐÁíuaâ/¼+X×§¨×>àü{V)ó°ÎŒX‹µão¼ˆn8gX^–J9¶µ¶¹&mƒ«›ãPÛ˜•n +9Sáú*¼¬‹ìùzpíEpKgZw î&Ä ÒâÆI¼Èw B–=ÁÎQí[´‰5í#OYcÃR³ñÊ +ß‘`/ÖoÊ"l7J-¯ðÒ`üzFà»a,ó&L¼ í-@È Ÿ|ü³ÄëUɇËäµðH×Ö[dŽÀúw½ÞÅöP_£,{‘!ŽOXW:'sí#‚=Òé±Ò2ÞÛª©‘´NMãAjCR»ýH4¢©3{d˜¤ü÷ߪƒøöO†P Cµß§¦fY \h|~?ë€Ëbª[×,êhôÉ`<ê“;Z¿Ù¤01ha¬ßë6Œ·«Š°0}=t¥5ôJ²†ñžüÞkæ`„;Ô[}¬Û+Ú|¯Û“L‰¤â«ÔdªiëƒÙX¥ÍÓ™95,­6ß><êÖ`¬ê÷Ú;Äåj­Rƒ?hª_k¤ŽÇ ºÕÀêíX«J‡T/j-ÂP7µ]p£R`Òcíiƒ5ÕzQÓ~×0Tó#­Ä1±´ßfx ~¶lû›ÅP½Wï€#Ù½â\2ãý<˜™Ú}a œ5»µlÝžÙMDisî ch•µdiæƒ>ЬŸ(NêpfiíPµÕŠŽ±˜ý0¸`ÎÌÒ'n…Zc×'¶f𳩭“Ý5nd°`”j¦}„m XÛߟ&ÚÝX¿Ó&­¼¶‘Ið¨[ÚN骩[Ùò%± +ý>ª ÜY…Õ…›ÁfªöèMliI!~^íÜ…KWT‡zA–€ØE[ú¾³ßmÌÁvCæ®î¼|ΩoµìâX•g¹ÈQ¸N”Ô*óáIwy,vÝו¿X•7}¦“âN»‚«ŽCÓaœì®š…çÓ ))ŠçìQúgVs—)뮟½ÓÊný êÓ[ÅÃmðtíU³|øšW̲ùõ¢·>ðR€^ñõäÛØçª’E­Z/KûëÜ«Wò '¹¢œÃ©ý½'{ ‚øùÖèÝkb™ȉ$‡ù–7 +a×aø L”ná6µ[°Vx©}¨ó·ŽëF§‘S+ ½§·CQé EdùÚ"ùVÈ ¡=[Ä‹ãÃÓ@½,í¯F@Á +U'3ðÜ~õRæû"L×nM~ëï¤o%¡&˜å0ò·I+‡¤¦'0<ÏË_´äžvR$ÍI2Wì3¼,|Ù„.»Šwb8™“ËðÅcïöƒ„þÑoXlL$‰ÒW½öÏ?\ñÄsû¯õ%FécõØË.ÏáÙF€’_K½À‹œÜg_(d.?û½‡Â‡K$^¤´‚8úËÞpü G?qÈ΂¤´¼äÄœwYåð[ˆ,HÏ >¿={@d_&ÑÒ'­)'endstream +endobj +5067 0 obj << +/Type /Page +/Contents 5068 0 R +/Resources 5066 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5065 0 R +>> endobj +5069 0 obj << +/D [5067 0 R /XYZ 90 757.9346 null] +>> endobj +2466 0 obj << +/D [5067 0 R /XYZ 90 739.9346 null] +>> endobj +438 0 obj << +/D [5067 0 R /XYZ 90 739.9346 null] +>> endobj +5066 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5072 0 obj << +/Length 572 +/Filter /FlateDecode +>> +stream +xÚ­TKoÓ@¾ûW¬ÄÅFÊvfß[.Ñ"F\Je…ØI#›:qJüwÖ^'Ø©#R|ØÇ÷ͬ÷CîCbh©©åB‘É22sÇW6îóÚ¯FÁÙ%³ÄR«˜"£i]A!• %7¡¥&0 a¡ ÓU¾ØDBzÝŽ†D€¡ •+^Å2´Õip1Ú#6„$WXáÝ7·@GlåÖHòà  h-#Ë@0¾3Áuði_Ç;ꄾ¾$ò¾Æq'p×s}jß—RÑ@„guh)2ãj Ã¦Žx^{,•J i_–Ùd=ϳ­$£ +˜éITÖIõ`£(híÐ,JHÏG{>›|žø]Q;žäÙô+H(QÅkO– Ê9? 2ÉV«´Ø¤…«/<>º9 JÛ%`<ìÁ)p£N‚iÈÎÒõ ªVZ¨BSÃ@wAí‘®çÙ|ý¸t’5üÆ‹<ÿ^þ¨ &wãÂ_9P#-?©J6^¦íÉ:B1ìòÄ#MÞ—i±í@?éj±ûnU³¾ÁqOãYš%óiûÿ™¿ƒ8þ|qýáÝ—øM×!ŠQTÊ>å%ôs}œå_ß«ÇB7Awm°—¿:ž“ù +RºWXÁÍ•Tÿ¤qµ:—‚œµÅY9Ñr¿D£a ‰ŠäUš¥Åx&^¡ó̯ïw›a„2,Y³Â9ãç ¼Å”ßM#&üðFùöcM›Ào[¿¾Îngiv8žJ€{æóÛ¡‡šendstream +endobj +5071 0 obj << +/Type /Page +/Contents 5072 0 R +/Resources 5070 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5065 0 R +>> endobj +5073 0 obj << +/D [5071 0 R /XYZ 90 757.9346 null] +>> endobj +5070 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5076 0 obj << +/Length 2024 +/Filter /FlateDecode +>> +stream +xÚÍZ[o›H}÷¯°v+mRÅ„n&­ª%6I¨ãNµÕ.qŒjÀ 8iµ~˜C€·«DbîsÎweƒ!‹ÿÀPf‡’ 12Ç‹CǰÃÜ|9¤{„ûGûέÁ锇2#‹PZ«l0ph¹ŸŽ dGPb%öh§-pQ`Ãæõ›ío7(¯LCgç£ ±/ Ž¿XïªUìL€ œÒ}ÿ|úÂ] ðý€e8y, Ÿp…e€,á?à!G+›9øP¬“wdšø €k&x·@ÊbÂRN—ŽG€eÙ£ØO¶ŒSG>Œ¥¡ÄB†•ÄŠ\ŸíOöGçÄ!F%±€B R àx$b§éÞÔÀ<ùq6àõë¬kTôV”¥\Cí³²™D ÷Ú?Ž·]7 ¢p·Í÷¶·Û8ßrŒ X,G™áE^Èfp½÷øóßöÕøVãi +«ú2ฺ˜u±•6ñgä)$O­ö¤™šR^2¯­E^RG¾ímH? +\µKhüKå-¿°Z£›Ï¢"ÿ ÖÒ^ÒòuAÚŠì ^aÚYm…I脤ï3+°©¨ð“8ƒçO,X/@n^¹ÿž?‹ ¶¼ìQ»3¢ ù +sz“H(‰8±׎ÈÎO6Ù:\•*ô‚6 ñèA{ZÇa1„·h‡ {CÖ‚EJ"çµGdïéÑXÉ,-–ÁšÊ1âÕ°uºU5ØAd®7ä +*ÒuøDÖ`æÕ-1™hþÄy餦Êž§{Ð%Sµu0á{3 wÉsMßÓÆ5•_’–{„ª,èØ{DbZ Šä2ð„àµFÎ<,ÔVB'*±³i§×µ`¼4ƽå—Ï•·éò¹÷¢eÔí2ûÖ!{ {—¬CÞ×öóÒt|EÔfßÚ¸ýO7obœÐ×üJmCØ mȽ¨íveÃþÎ2 ·ß#ïa”Qß)C>dYþ¤E|^…Þ8” qÔ ÑM„b=v: ”Ô \/N"’"@Ñm£jŒÃ]ä Ú¨{/°#YVaäÇD´O^²&q7*[Ò0ÖN»¿[û¡ë­<'s4#q‹"ßKšbpXôŠ„“¬í¤L“ýf>)Õ qæM×íHü°Ì(àù(9k_™ëIÌU¥Æµ÷‰=:¡K±ìâ„Zgb{AM2ö}øXÌ¡®Õý¥€B_÷:pÞòtB÷¥‰uãQ\ÿžVj¯D-jIJp6¶ç£ˆ8Ï1,7«û¿ Á.iS Öã¹´±Uº;ªCÎý?^•Eñ:Ú¨¾?·r@ÁÒpâ IÑ·ñ›«gÓìXe *ík´ËjúgŽXÍy%¼bßÀökïªE—ĉ—ì:2lš[óu¦¬ÃœOu3N쯟žWîQ‘4Üê«0~ÆÛ¢j.À*ðCJ&÷¤8‰Eøe•,²Âãê6‡«ä) £íŠ‘ú3¡Ù)ßb‹œ4¯P|^‘â4£{ &Ž_0’ñ!¹œëŸX¬+Í$çbýºU •Xi]ú6U§yíüŽœâ®è°¹iiÖÒ"UeNNô¹ehçKK7ÈBÿ­˜té?þ(‡·ß?—)s‚Oý¸0T“ì§dßëÅL£L0SC™[šjžP&“ÙrªÍ/Ic'N§“ÂL»Ö,:ßÒOJQ´sèÄoAI¨\{ Õ˜\áå\›iÖ]Møš5/Ø_Pú +Q¨bXÚd9SHóbi,t³‹Cÿ,WXÑT3'3E»V§8‚˜‰™J•hêFùšWÊlÖm_”Ësó:W©’”óY›þ×¥©yM5CX…áÔªì/X53Ò`.Ô‰VÔÔ*V°bÜfÅ3Ìgƒ­M¿O³Ét‘ÕËñu´˜Õmú‰Æ˜ôØ%ÅÖ.Åì&ä=`ˬ˜æée˜m€ E  U`uDöØñÇìT]°³CýÔ=vbg'0;l)5Å„Í:=©ÆÀ`š÷U&´KsxºO5šH!ØA“×î¹V„JuCb. 17åô*ŒÂ_ÞŒ~:Ku܈ʻ"‹S×ý˜OÝ܃jˆ¿±1·8Úá¯_ü=]\¾tVd¹Ê“?$Æ?m$ZuÀœ·áuíq›’½Ðšz:©P‹d¾¬šdºX®ËwëÉ$+ïöŽˆ1Úty•˜ªùÝ w",-Æî$œn#yñÛõxtHZ 4v•i¾ÈœëUgiF\†Í›düƒ bÜ4Ýe^žGãð ²6N´ÝüA1ÂbRæÎÛ*ì»l–ï\‚= —²ë<ԡΩқõ€ñ%E»x{âÊؘSð(E¥ÐeH›7ô¶[þÕñq?€²ã8”c$àýúÁQ,*î¡P‰J-”ÍM¡Ìãé,šù¼]-Úþ¡­öÜÒ‡ºµ"]ÀýøÌÆ·O44@«à$T†Jù‰©Á‘TQ!è×—ÇQÔ}TJ²TŠdYFeþŸÕÂèáDhÃíÅÆàÿF†V*ã'¡ P©81 ˜<’La4ýúú80s 8ºñýs3I¾ê¯"ðî9yp­iûjL©ú6íß:@¡wÔ·ïKRÈoº¨.P´5±Q·ïO,m×› ‡Æ çøE¶ÈЏÌÒú%_ÔÏß7«ˆ³uÓ±»yý¤Oê¶׳¯Ž²nMLœåEÝY_¾j´I£øîsý<Ï?}~Ÿ-öÓãnKüü PŸqçendstream +endobj +5079 0 obj << +/Type /Page +/Contents 5080 0 R +/Resources 5078 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5065 0 R +>> endobj +5081 0 obj << +/D [5079 0 R /XYZ 90 757.9346 null] +>> endobj +5078 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5084 0 obj << +/Length 982 +/Filter /FlateDecode +>> +stream +xÚÍX[s›F~çWЗŒÔ)›½°·dòÐÆjÆNS9™q<Œ«V…KšLÓÿž]@6 E`Ç£±ý{;çû–ïìdCõl mN9Äev°± }£ºßX¨vÔ¸SŸð›g=ÿK[É0³½ea!@1¶·¸aŒÇæÃQ~z®^)!˗ɳ]‡eã$òMe~¶Š£ñ•wfM¼[Ï0JÒ~?Y—WÐ^(€gD +jÿ« )±½±\Lvµ5³ÞßÚ)Š&~Af«ÑŽ V|yÉ2v„pt>›¾~;ŸMþ<™Ï¼‹Âg)ئqðÏ/c‡© )Õ^jrÊŸ#Ë\Z™q‡šÑ]Á_~RXA‚ +!·¤X¹¢0ös1ä.0²kýÚyºÉ¶ó ‰ÖwH$À‹"jÄÉ8/&¿žxSÊÓÙt^wÒ6ý¢2¾Zj“)XEÛ<»Î—Ë0¹„W¥åŸ^ÝyÀÚAÙüÏhPŽߢ}ýÇt6©ƒíÄçÂja±_‹8 +õ2Ö=5M>œzÃüàŠñÿÆQ¥-$:G]c/­ÖÜSHœ)Ñ3v?!-ü̯ I À‘à-D̈“7p>TH®0öÊÊøP!‘!QØýp!i«Å†x÷|Üp4XHô T¨Q*ô˜RÉâ^¡P6O +êæÚ´øiµR31£Hi[¤AÐ&ì%ƒÇ¼3‚Þƒ¡G¹ +~jW!;\Ì\ì˜ÁµLâM¯ +Ù=«i°MíÉ3“GÄ™æ×‡AÖ •Ãá_aÏf‹ GOíCplÄIöpùnÒ›úû:Œº©ƒŽÓ#oÈ6LVñbØÖÓ þ8i÷Lxú2g.˜ðhJxD÷|ô°„GàCg² Æ^÷ˆòø”¯úO±lc·fï¼óùäâb>}ÛÍ¿yš·Bª{/ šwM”ƒÏ‹AL€DÐíb]'í<Þ_á€P¥dÐŽ—h"1@X¶®n!KJŸãÕÂDYÂêÀÑûïo·¿ÖQõü"DLkŽÄHÌWê XÇi¨­ ]OàÉ]=AåHq©ã?\”ÓwY¡ñ»Ê]ý ³<‰Ìsè¡‘l¸'ÙòÒÿ·oåSOÈV›pçÙPnüaÜ„éHA—r/ÚÅ$Ô/Pc‘ Ú¨ìýP©¨” µ\/”©ƒ„¡ëH«….÷P4ô7a&~±+º$GåóÝîålŒè(¯WOø“¸ª©aYù¶c:Š“²±_|»þº«»}ùzîUÜt)̰KßÞðOendstream +endobj +5083 0 obj << +/Type /Page +/Contents 5084 0 R +/Resources 5082 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5065 0 R +>> endobj +5085 0 obj << +/D [5083 0 R /XYZ 90 757.9346 null] +>> endobj +5082 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5088 0 obj << +/Length 1329 +/Filter /FlateDecode +>> +stream +xÚÝYmoÛ6þî_¡OC<Ä,ß%¦0°-ÛºdmšÁÞ§¶Yv´Ù’+Kí²¡ÿ}¤HÊ’J+~)ú¡1I¤Ž÷<ÇãÝ‘B”?ä èùÌ‚PîE«ô²ùÅ™î‘ì5_øi:xö+ž‚cîMçÕ†ö¦³7g²g8 žmVÅDÃwÓkÂ@Æåê Œ‰jü2­õŒp¤´¼¼y½™„s=€€ˆ€yåHì­û°LÔãèŽJÀņ!â¢Ã=ÙâCdé`ÉÁ×l0„à + <ûT1‘æ€rÊL/2½Šì]ñÇáì-dPþ£çN<ñ£Ýù¬êÄ©7B’ ªW¾×æ~€½FóèËýU + gŒìÒšÊ5Ú ,‚%ú$%=î¨î“®Â…oÄÙ¦€qÚ‚3YÇQ2O¢G­8Lõuòjz«ï6qþ!ÎmïLßëÞƒ4?}þòò¢Mcs<ÿTó<[ÍD&Ù)³œœ@Ëû¿â¨èhµƒKœŠkµYt0…QQ†ËÏ ¼’Ö ½%0_Î2N;ˆdËÂV¤;Œ´?Dô%³51³L7É"µUw‰;©ƒFîVÙJÛBæL&öÛTÙyG%’€ï%E§H«ux®m‚8ÀlBÔ¦®5ü!ÔÌ’è"ä*öAú‘.¿+šŽµ-Q÷ñq×;XOB¸ÝÍyi­*7d–êÊ 2 7¥l¿YRÏ (€|ÞÑç;QØJ©ÒÚ,,i=gÕóÛôõÍDõ`¦ì°³ü!¶”J敃nõE7¾|YYr·­¨,¡¬2GQæF:ÕQÔw„B±5:0Üì*3`Ü(©ÅlöÛdî [=QK ŠÜ¬Øf¦ñ6U¹…j­Ð?n¥·¨_‹Ö1{\û¶[$hŠÔquÜ\nAájeö¬ëvòúò÷»«›«©òï6`½É¢¿mm ’t]÷å|¾­·“ã¬r¦Vo¯š…ÚmµîÐô«ž*žÑoî,=±sdÍc’&UP/×A±+зacÁëҽؙ虿¹IáhϕܳÊ[¬~øÔê9 “¹-PÙ²}(ÝC|õŸ ¬ gü¤óýê{D EÁÍϲvðI`Ïï òEœÆyX¹®ú&¡RÕõ•½¹"&‹;ý€°¹Â L.Ô!zÂr}7bv–åú¡:Ò«ÞæÅûG}ý9ûçq§]ó¨ûüeÜ  endstream +endobj +5087 0 obj << +/Type /Page +/Contents 5088 0 R +/Resources 5086 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5090 0 R +>> endobj +5089 0 obj << +/D [5087 0 R /XYZ 90 757.9346 null] +>> endobj +5086 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5093 0 obj << +/Length 1936 +/Filter /FlateDecode +>> +stream +xÚÍYms›Fþ®_¡I;S»caŽWáv:űHe¡Š›i;.d1 "°“éŸïÁÝ"¥:ñDwÜË>»û°Ëí¡!‹ÿ¡¡ÂeQf^†n8`‡øñÍÑáO¸¶—o9e¨0ŠÄIC{]ì !Fä7´½ßÎ8N8q2+³g™¾ÄM‘=C KÚ''Üm}Ò™ÆnúQê¤Aÿa¿hv)™y årÿüö;ô0Àw–ᕱ8|Æ–AŠÂ ÃÀñÐÙ¬Áûr2P,hÒOD|³‚H`ð4ä°Â2QPaÖ±,{¶Ó³©C‹ ‹ÆòPf9†•¥Ša_€É£ãÙ„4İd˜ƒ@¹P¼ÃHaI‰åÏGuY þÂÊ ãbÂ÷ßC£rl̰’"c|ûªbDaDI@ãç¿#^pitdg‰ë×f=‘“|¦l“pOMû¤ÒªæOâ,íP[é­@{Á:p‹dG; …¸ó“0HSŸÝ%ñSàA/Ý8)´|@¿ÝÆÏAôHºnyA¾ï¾1×?N”ðB?½êعh@ Ù¸êTʺxýÒ‡nì–lŸ;Sü]ZÆyˆŸÊ5ðjµC-ž@Ü8ˆâ4pý PÔÛpþ#¯TyØæFl w롟ÐNà–KUÈ|oks]Ö Ö_Ž—ÖÆ¬ô2pÈ©þŸ¯Ú"Ÿß +^åKÀ]B¸‰±@Ú ÔO’c5U©Ñ±G»XÓ?#ð”56ˆŠœÐ¯ü@‚£4:”EØo”Z~¥Á!1ùõ#/N vÃXç0N;¾E8¹¿y!±ážà À¬±¼:¹öñ:}.ã¤2´óÝ<Øãn·û¸?Ôç$OÑQfØï_ñ®rJæûg{¦[—e¼µïTS#=xº4úT›’ÞõGÊ ¦®ì™a’öŸª,þî;:¾˜Bƒ.Õ~]ššeµsïŸ|~»œë€ëbª [×,hôÅd¾šê‹Ú¿^Ù¤±0hc®ßê6¬·‹š²°};t®7ôJ"ÃxK~o5s2Ãêµ>×í5k¾ÕíEnDÒõUê2Õ´õÉj®ÒÇË•¹4,­vÿTòdª[“¹ªßjS\W˜¬JþA[PûZ3u>ï`е~P¯çZ];Ì v„Þ*LuS›Ø%7jÝ &=¶þœ>°–ÚD/{Ú¯¦‚j~¤}€81–ö~…â¹`û*¦ê­zɧ’¿Ï“•©Ý–>ÂY«kËÖí•ÝE”þ9çÆ0¦VÕJ–f~Ð'šõÅiX5î¯,¢ª¶Z³1V³—ÌYYú¢;¬È½±ë [3ÍÕÒÖÅá73î0¥Áã*;­½Æ¢ó0Ù ócUÉœãÅ«}ѹÿ¡ên¦ai%/mS-ÙmÙ¦>±_À¨Ô6L»mXûŸŸÚÍ\¿Ñ­*ÛÈ5¸Ó-í`tÕÔ­\|E­Ò¾w*wUcuf°›ê#z[„j04^Â…K%ªÓzI–qˆ¶ôã`x1'3xò ÐqtÐ)_ Bÿ¬e—ŸUE‰|j-•Eõ¸Ðz²¼„ö>uÜ¿º”âORªBøV÷®5OfsñDzˆÊÚt‰ÿÔrЕ ]áÀB¾˜ËrŽö‰ÖN¿íÐJ|®EñŸ»·~ÝøÙH_N,n%ÚuçN)¸bÉ]ö<)WHÂI7!8ÑAÄ?z¹Å•£ñ"-Ö5~†b×Íß»(«)튋'ÝÑןiºªE äÆ+dï†$Qúª[ÜâzŒ— ž;¾¥•EæÇù)Ïá…ùµ@)Î~ä'NAÎüÂ9çqþ{ wçH<Ëhqô—½âø+ŽÞXçiœ´ÖçœX©òÎË«íœùäVûÓçGÿÅ}v~ÑÜ`¥xÓÎendstream +endobj +5092 0 obj << +/Type /Page +/Contents 5093 0 R +/Resources 5091 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5090 0 R +>> endobj +5094 0 obj << +/D [5092 0 R /XYZ 90 757.9346 null] +>> endobj +2467 0 obj << +/D [5092 0 R /XYZ 90 739.9346 null] +>> endobj +446 0 obj << +/D [5092 0 R /XYZ 90 739.9346 null] +>> endobj +5091 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5097 0 obj << +/Length 919 +/Filter /FlateDecode +>> +stream +xÚ¥WKoÓ@¾ûWXâÒ f»oïÂ…7´Ôp‚ÊJ'5Jìàl€ +õ¿3ÞݤvØ´®ªìùæ=žÃÄljHf\ÆÙ2ÂñÈï#⯇p?l3¼G'﨎5Ò’Êx<³’ A ÇÓoG<RÖK³BWƒ‹ñY̱BXHÀlX( 5z;Þ)òv&I£ægôíÇS°ç,ˆi%âßpÀˆhMãeÄ)ÛÑyôe‡ã.¬@ÈAXÈ%Ádë÷玔ÖnQÂÀ¹²WOk(Q”Ä-ú‰¥)Cš`1D\ráÐ’ÁPb|ô«*¦î­ R:­Êü;xS®‹y™û«ìjR»·¼®«Ès »˜*DÔAEEY˜FQC>„—à‘8”“{¢¡‘¼w›23EU®‘eILÕC©$ÂIºöРYUΊù¦¶Ñ´ñ³æ2†”î§sQe“ÅUµ6åd™;è ‘©qH#(1Þ ª±h׿òVꆔƒ- +Z¡ã óŠäßú¶ÎËi×-Á¦²_Qšê¸…jy@š)ÙKzVWËcïHÂèØÏC"pÝGûEjsù#Ï̾…R"Íu/„åz¾µšW½k Øèriõ€Ì"/¶t\O¦ù¬(sw8ÿ4¥ço?¿iqÒÌ¿¸0¹”u\UwøN)„Ù ø~¶¦dK7µó {ÅVy@eht$áÑ1Y­ 3÷MšŠììÚd¦]Ófb|hÿ†ä Ë‰j²¦¶I³AÅÌóÞx‚ÅIÏöðý¹›Omhþè&_w‹Ç€û +¸ _>êç.ìd›Ÿý® +f(TmJÿµoóÉÿ˜ˆ…§+SÙC= ý—ä&(ÁBÄP÷jáÇE1+ab¸Ã×ÓQúr4zýòãÇHh´E† ïu_ůOÀïbbP>Ž×«|gÙ]¸)V©É¬NKMM04:@„ïcJ:6¶6 XŘâêÐ&AÛµ˜¦vü~HÓ>›D`‘ ”#ƘÚ3ŽMfm3w»\[—SF“ËŽº7›Þ«ÎþBLáIp/Ç"…|Ô®l—{"„Ñön_Ý‚äwaoDcäû¼Ìk(ˆ©Ûï«Ò=?m_ÎDÀã„ú'~FÙ3êÿPŒ¥{› ¨8ªjwØœŽ<7òŒ—×îù¦ús=ÏËýð4‹| >ÿ¶ÁÙendstream +endobj +5096 0 obj << +/Type /Page +/Contents 5097 0 R +/Resources 5095 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5090 0 R +>> endobj +5098 0 obj << +/D [5096 0 R /XYZ 90 757.9346 null] +>> endobj +5095 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5101 0 obj << +/Length 1899 +/Filter /FlateDecode +>> +stream +xÚÍYmoÛ6þî_a¬– ±BRïÙ0L±™D…-¹’ܬèŠL±äD˜-e²œ´(ößG‰¤lÙ’2yû04¨ùvÇçî)öùû:諲*袤ôç«è?æëdÝÒ?ØpéõίÞ×]AJß[(È¢¾|:AH9 ¨àdcNIQ'P´€¿ø«§eH+£d¾Y…qægQŸ~öÞõ°WÎ̀ɢóyÿì}ú úø®Q×äþ ©ê:ê¯zyeÙs{ïK=´£¨³O†b½PH â"b°J ÔOp’…Ë8Ìa¾^“5µ¯$U©øö<ØMq(}‚LÃàr„B0œçs—pØ*iÅ€~(ºeŸ&EWi”š¥Š] öwÚƒ¢äA–<¤Éæ‰ÎÍì§Ó QÐ! îÔI‘äBHì<Í/ßšµI¯h“UCmçÌ$fH«*“‹.PiSþKÕ£\ºˆÈrh´X{ÍbUÐPw•ºárIíX‡és˜Rí + ¢èíúq$ØdIÚŒª–ûüŸ€6E16ñárM+?ù¤ý—u4_ ëðgfˆ"èRÕ²_™±‰¿TÕ†j˜Å +5gÚRm‡PzEêÐÑÃäék=¨”oÍüÔ[x»î‚Z‘›%íü˜VHŠuÏlP€’ZûüH†ƒŠ¬ü«¸â Q#"PD»/lŠ «¢–¿l‰ˆæOJqæ ã0õ‹»Ïü±0¿É'¼ðîÊ'Vˆý‚ $^ öÚ˜'ZZZœ"¹¸HÈ+‡Ï’÷_ù‹ä—¯áÁ[dþHX㥿Çñendstream +endobj +5100 0 obj << +/Type /Page +/Contents 5101 0 R +/Resources 5099 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5090 0 R +>> endobj +5102 0 obj << +/D [5100 0 R /XYZ 90 757.9346 null] +>> endobj +1540 0 obj << +/D [5100 0 R /XYZ 90 739.9346 null] +>> endobj +450 0 obj << +/D [5100 0 R /XYZ 90 739.9346 null] +>> endobj +5099 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5105 0 obj << +/Length 1195 +/Filter /FlateDecode +>> +stream +xÚÝX[oÛ6~÷¯Ð0`ˆÛˆå!Å[»>t‰[$p q±‡,0[N…9²kËÝ‚¡ÿ}G"åH +­h˺Ú/çú E(þ!04PBÃ#Lo{4¸Áéw=pË!®‡Õ ?{/Þ2b$“Áx^p@Œg†ôC&èA/Ò8›‘iÿr|DT*$²Íw1¦òÙÞ`¼“åT\B.éSïâ’3Té´G 7Zà€0†·½ˆñr°è÷~Ùñ± Ï"Üg’ pFQ(Mbh¡²IÙ%¥ßÏây’Ævp>~3LŽÏú!§8Œ +ÑY†D2–NµÐÆý4N¥ÞKy4<; )Ãé#5žIE-‹Mv•%Óò}½föÝ!5É×´Í+ðM2²ãÁp4ONÞ93™ðªø~Ú_O†Cg(^ÁQ ±u°%f>b±Ÿ8G•E)÷‘Ê6ÒŠ\_P(/Š5Àla0`#]ìxfÓ…(Í ¨Ì‡ÿݯÀ…&RÖI¸U7äZ)U7I?Œ®éÇ«uA¢€(àî–°0H£,/c鯋åt²@÷þFý¼Lføôv¡ý—o \ð­ãl»NíÆÛøözR°Ï9ÿ‹À©œ»/âµ î/¾5þÍA©£‡PæÎ÷Yïh×±Ú!”¬Å¢“RŽÚ"„åÍ¢&P¶ ­ÒºóuWÁ=´„¥ /κgó•á¼WxW˜ m…Ö€‹‚ñb1ù´M²°†-LÔE l2÷¨AdQ]ÛªáÔ ©4¦×º¡OíÇÓˆoOÙ9më?›8=HY „™Že¤ž±Zª¯‹Ò-ØšÛŠÊÛt“ܤñÌŽ’ÔNÀX]¼³eÉŸ/óÈ£I-hè+ÇÑ>~¬¶îãÉÑÙèídôáýðd48w;Ÿ?O +#÷”¹#`2ÏnHî˜ÍEré$;Ñ£Ãácœ0Þ#VÄ{ƒÇ}ýò»"r„×ëøêwÿá´üâ]•ÎkþÕ²¸Z “ºa^ï=f©vÚ4›G[‰jÚ´º?ã šòŒƒNûÿ´jðFݰ‰µ&:¯VñÕzy»Ê ºì²T©Ur„‚­dC`Ô9ÞN¼`DR¦:!~¹q5}Qðbw í;Hî-¨Çø=›ïºç/”Q¾J§«»’ÑáîƒëГ2y¾ £ýšÇÕCÄ åÚ‡YÕ•…Uœm¦I2]¦Ÿ'Ùò*o(Õ® +ï`Á ÿGÁJ±‰(ZoóøATú¦ÒwZ³A[¶³–s90þ0Û¿Îß=ÛYÔžíLT³}¹ÍV[o¶‹®Ù‡/9›¯º+=«” ‰9«˜hhÜrž¦=,âÔ8Ú_iô¿«4¦ÁÝw¿œ>±þpxzýáåI=SÓÑÀ©ât‚¸îth^¾Hy¯i€‡d)ä“î劻D$¨hõ*Q£¸.ïÝœ¹Aïâ4^ã¹f¯—©}¾/_Nû 0&ì ï†Å“¾düe^nòФ}›÷™8X®í`{ò³ÛMÜÆë;û<^þywƒîk¸'¿4ôøçoQ÷ð9endstream +endobj +5104 0 obj << +/Type /Page +/Contents 5105 0 R +/Resources 5103 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5090 0 R +>> endobj +5106 0 obj << +/D [5104 0 R /XYZ 90 757.9346 null] +>> endobj +5103 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5109 0 obj << +/Length 1205 +/Filter /FlateDecode +>> +stream +xÚÝÉrÛ6ô®¯`/«2i,Ä–69´QR{¹+'×£¡)Úæ„¢‘Jâéôß  EÊ ¤4bàá­|ô€ü‡ž#,8¤^¼ïA¿@ö%Üo_øe68ƒ„'Aõf÷ +‚ òf‹›S„øÐG 0pº½ø]. 8…Ћñ—h¹Î½y½Š·Ë$/£2]åÃÛÙå`öù1ͪŒPùv)S„!öÊdÍÉžÖùs‘DY¶Šçu‚)µ*nÀm¯Ñ:»Þ¯6 +%íäk‰£µê¯NÓ÷ïTÚ¼67G£ô´a]Ïti§²íU›æÒ­]|â*´®á5«ä.öÓ÷“‰qÝø~óÑì¹+Sá`¾»fðøfÈÜ•%s•Ñ¡fØáu,´ÄpümªËœ€±ãô»ÛÞ¯ËÍ™6 ¡ä(<åQ;‰/ûï€?³±Ù¤Éx׿*jrgu9F­§Ì× +tÜ\¹h½VV¶Sä;ÜýŽ×ÞÓ±:gš¼²—Ùv¸&Ê;PWžÑ “S.†„­xo蚨þ¡ÖzÕ¤­æêôÅaÝùëïiÍV;¾VãpÔ¢á~AH½¹›ãî#¢MìÕ¿~oñ°ÕÄï g£g—Í™˜9íHÞöªQÇ¿;þ ¼tYuGtHfô —y6Ö¡Ûpèî\ÏAÎ µvôŒ^F.vˆ;%@ ±`u7ÉŠÄ¡®¨ß^w›$ú`§è|g ì*T"lõÃ*#+{¶ÒÆY;GõZQG¹ô+Êüêúöz'ØñõN˜4ÎVÅáŽUˆ–3ìœ` ÖQðD »&úMÓ¨jžÆ% +Ĩ=N£`˜«iF1¤¨EÉü6É“MTªžY ÎV¹þ}W/.‡È¾Ú Ûù/~ÌäM:8Õ«û!"§«Þ<ÑÝ=ÕÓ¹/Oɳ¹œ˜Y¬ôÀ Ùsendstream +endobj +5108 0 obj << +/Type /Page +/Contents 5109 0 R +/Resources 5107 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5090 0 R +>> endobj +5110 0 obj << +/D [5108 0 R /XYZ 90 757.9346 null] +>> endobj +5107 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5113 0 obj << +/Length 1224 +/Filter /FlateDecode +>> +stream +xÚÍX[oÛ6}÷¯Ð^ +{™XÞ%¦í€¬u ޳-.ö†++‰Ur-9Y×ö¿I[ôhÙÁlöÅËwåùŽ(¢Ê? + "A(’=ÜÉáw=d¦C9¶ü4í=‹E €à˜ÓÛFG€a„ƒéâº/Bƒ3دӼHëH7Óó€Â@Æ¥Zµ +c¡F{Ã鯖q…Ž”¥O½ë,¤Kç=ˆˆYð(; !pð±G1±¼wÕûe£GO4¾ˆ"¾x G"ˆlHXFéˆ0„ƒÅö«z^gÉ äòy]TÙ]‘.t/+jóð¢‰V¦MÊ)3w½·åêwÈ`¦U¼Ò |a4êæ¥n¦Ãñd8}3{}9y;›¼¿&Ã+³òä$“jî|ñZ$ƒ@¥ôV¬@žiuÝh™ïŒéÉûñø&:©ÌL‘Îó¼LfJ“«Siðgƒ/¾yg¹ÉŠ6ÒNù'c=ù¼™Äi"‰7K¾×XQŒƒÖpøïý„Å€3FöÙFmãÚÛ ñNHB‡Ô†ÞC™-|á#¨çïÒz–ÜÏL­ã™AfÒì¨O¬kŸ‘ŨFŒñà•Êèêr–¬@YЭÒz½*¼@´kÓóŽZ TàÃúöº© ¢VÎ4ËzuãTâ·9ÔÕŠ¼Èõóׯ^ÅŒ„[÷¤WA•ý™–[“Û†ºA‡²*vJ¹mäGC!t`hŠøÈ Bo12Z4âØ}B¤Tkb™ÖU’eIY<ÌêÒô6ñüàáëöMùÇç;YÏ;éQW9žüü)En¡endstream +endobj +5112 0 obj << +/Type /Page +/Contents 5113 0 R +/Resources 5111 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5115 0 R +>> endobj +5114 0 obj << +/D [5112 0 R /XYZ 90 757.9346 null] +>> endobj +5111 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5118 0 obj << +/Length 1020 +/Filter /FlateDecode +>> +stream +xÚÕXKsÓH¾ëWè´e/«ašW€C †J*±w‰¨²)•"²llHmñßiFŽŒ¬€ÙöAóêîiùPÿ‘/¡Ï)’„ÌO§ôoôð;Ùé@Ï› ^GÞó·XúH†™Mj Šö£ñeØ0‡öVÇë&…= i ¾&Óy®Lçh–®¦ª(“2›ý«èÄDkË% Uv?y—WÐk€'D +êє؟z!&M'÷νÖzÌD-àò"ârùz„CÔ8ˆµ¿ÜúÇx?` ÂÞ,5víLÕyeçÑa4ˆ/ŽOO_Ti#! ©•Vöz¡’î%²ÐP/I“¥Õ N‡ƒ(¾ £—‡Ýˆ´¬ÓGˆ8nCt4rã!xŽFnSa7ÚŽ¦ö× j•>¯g) báHWc(ê5Ö3P"cü½šçwÆÈ—¬¼5­Ä<ªHÕb‚È9q( xK¡ JÄŒ<Ê,Ð¥*Ƴyù/¤p#¥þ2vS=ŒÜÔðFþ§B+º¹—®Q Û"ÒVý&‘x¿ˆH²ODdØI[¸oÙ%û_˜¿øõÌóVæ/žÄ¼Ø‹yÙż&½•ywÖˆ~î Ä{qOà>YO`ØÍ}[Öµnö›ÌÏ&•?©õjëÍ}|ø¦òÊŒýçTÃíÛ­Ý7­ÄZ¬_}õj•7àÝ–šï¯UÆém²¨a·’ŽàŽ+A¨“T„-©nÄ9:GuxhÕÄœ£ÜPáfÒd-&@">)σ_÷«-*£ÿH‘‰ÒÒŸ¤ñéó,»|ÆÐÌ—*/T9Ž“ù¦½ÙÂt_q\ß5·_ïnÔ£{êÂÁÁÒwÖ 3endstream +endobj +5117 0 obj << +/Type /Page +/Contents 5118 0 R +/Resources 5116 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5115 0 R +>> endobj +5119 0 obj << +/D [5117 0 R /XYZ 90 757.9346 null] +>> endobj +5116 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5122 0 obj << +/Length 633 +/Filter /FlateDecode +>> +stream +xÚ­UßoÚ0~Ï_áG2)®Ï¿wª´ncÕP»n#o]UQb*4H:j«¶ÿûœØa x€´Áƒã»ûî¾ûìäó¤ŠEŒãçAwÆ|€sGƵާÁÑ'ªÂJR‰ÒIA(J³«žÂaDé•z–ë2Ããð: NL„4i«(Ê ²ýt]ËQLBUéWpuMPf( ‚™Jz0‚A)Šæ§¬ÙÌ‚aðmÇ:j€¯#Ì×’DÆhZ¢¦ÃØvÄ#HéM'?ˆ K¼,G¥#iL''v¦§iÿæÃùå°obÀŸë΄ +sÉ…Ë&ˆãíæi§ùrùýâôü­-z5½¿ÏŠ¥®(U%ýá± _èrµÈý1‰kïÕëU>+'IÖd²†mçåÅ 6^&]£ÛbQˆ£-\9ë¬X• pêœ9!º4½‚p¾K.¼V¹%ÈhüóO¡}ôšsê€üìv÷—Ø>®\?d£rt ¿ÊYóÛ€y +º‹¡`^+ßb¸ÐóiyÈÅ¢u16îÄÉöEl+¿·Pã"ÏõøÀ ,’ò¾˜ÍU_5Ÿ g{å—d—üÒò;©uÕNʰÂQæsÊ“:äý˜ã8¡¨eŽþ߯.`¤ÂRö·ÚÐ.nÙFLQ T%-±½-Ù¼À±y‹;]½{íxæ²9Ö½–˜I +RÈšxõ”N miiFKš‰æHT$Ït®fôdvP¹]/š‡A¢·r n%Ç”Sbw”iŸ&!½ba7«Ï_]4v·OvýX<>Ýé|Sžj{ôù ¡ Œendstream +endobj +5121 0 obj << +/Type /Page +/Contents 5122 0 R +/Resources 5120 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5115 0 R +>> endobj +5123 0 obj << +/D [5121 0 R /XYZ 90 757.9346 null] +>> endobj +5120 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5126 0 obj << +/Length 1857 +/Filter /FlateDecode +>> +stream +xÚµYmo›:ýž_m“ÖN-Åæ½»ºMhÔB¤]µM ¤AK H»êþùk°MBdd»ZµøÝç9Ïñccƒ.‹þ®Âv%AbŽ»“E‡í>¢â« Õ§¨þt³Á…Ó9»„JWaŠ]gš F€vïËäàñ)”X‰=Zé#”Ø#À°8¡ýt˹3ýh²Zøaê¦As>v4§˜™8dóþÓùòízàÇËpŠ,tŸQ†e€¢Àî¢ÃCŽfæ»ó©WäªìWm àT©…,a ˲G©?ýÔcfÛèea,u%2¬$–¸ÝÁ@Ÿn¶Æ8Ä.B&±€Â  2àøTDβ¹ ¸§ÙÊËyƒwïòªÓ¢NfXQ‘°—ê{å5 +#ˆ<èn”ïz^=ÆÑj‰çv—ËÏ9F,âRax‘ò\ë9>ü[?¿g4ž‘dX팘Ÿ9L.&äUl©Lü>¥ƒøôüé›DM8ãäœNüøÉë©‘ÿ(ÑÊžÑ*í,îE¹þ ÎÌÇæåabM@…Í2#*/¡`Ï„k¿o„{zÕª3µ…«àK:ªš©  ÐšÇLHÓÕz®Ä}VKŒ YisT{æÏç»®EFá•òèÒAÝU:‹š,·­zîcî¯Âþ<Á™¿\Tþ! & “ø×¢üIq@¶BìG½6 lMt/Z¾ÄÁãŒ,ª¯¬ÀNÐdYî'w˜cê=¹Ö8Tª¥ qKìçÊòš¦â"ªý"²|/HÒ8xX凼»…$¯©R“D«xâoµzB7~Áéi/BísÎp +ɽ(‰ViƒÙbk‘LƒI~–"»1¸ôãE¦>ºŒ£§À£¹tæ¦4åSôóyô„8;‰B/ÈÆM·¼…Ÿž7Œ,·0xà²S‰ê¢é®'‘G±¬’”ª3u©¿ f܇è©èC—V=ô}…n¿a”ÿ„ÎÔó€â¢ø7¼RÖa“¹,ü˜,8žcXNËg¶öû8lb›2¸½8vÙFªôVÔ![„×2Ìö OÊ1ñ!¼ž_ØðÚqeN‹y½Ò‡wFÃM„’äÂMý8péÆXD‚z¼\{¼ë€·F¸¡Œ&õñ­ÕÇõ§ÉÐ]øeÇ­Å„„‰—ÂÿD¢~í©c#üë‡^Ó=€€¸[Di“6…öÔáE@7Hùꉂ™¢ù¶EšDÓô¹ˆ£t[ÁUK’ml@ÏZ•¼‹x9ζ”pc‡I’=Þ•Ù̹öñßè6Æe›—έji8GKG–y£÷µ>Î]Ü H3uì L §¿WmÚùí[Roôi‚tÕ>,Ͷ´ ´6‚"ЯGCbE¶XªáèšM–nô†ã¾n\‘üÅØÁ Ã$‰¡~­;´¿cžlK‡¯…ηßÖ(ñæ%þ½Ö¬ÞU¨úPwî¶Ø¼Ô##g¨ù*q™j9zoQGÔ¶lû‚¾z­^QdŸ&‡Š­çÞØÒ® ŸPÁÙã ÛѱÓ$”ö{Εiöí2K¶fÝè=Í~Opšö–öǶFÐöUGÝâ€ÔO;ÊÛºÑVøö:ºáh–59ºi¬¿æ-’4õ¸ŠÀö·V§ilÅ<$vÓº+™i<_Ú' ˜ÛÛÜ44‡F¡KÇR uÛŽ¥÷œ%BÓr*ÔÖ€µýW¡] õ+Íèiå¹ÍÌ‚[ÝÖÖ¤«–ngÓ—Ì*ø½U)¹ã-Ua¹i»FoRKû”îŸ'ë°Gà’Õþ^ˆe +Ѷ¾ì× ³7 «!  W¼rÈ©A8ä>’«òÛ4|Ô¦e7Nk•Åí¥ÓÑt’º“õ6 ]^ +í÷ƒ7ºw^º\ff'O¸0°¸ϲ? çYåœçÎréCÚOrOý¦Á0î Ãø?yñ&æë`z>q×ý½£ Íéßîï+.ærûÿõBÿ;IU…2>œÌWô^áÕ*XFË”™½ªê¢T=G°¸çSx%Þ»ËåÄϳ–Ufå}Õ ªVC­D!õò~ˆöœ!Zæ}¹ +Ž*ûæ5|Õ¨Hdõ}SÓªÂ>€Æø:›Ç®z1 à¥Ê—L­ +âo=&æÏ¡2ê8¸ùX(2ŠÄÉÙ#QÇìq„BÉÏ ~èÇn~ÿ–½{fßèÙï5M|<ÂÑŠd²ÇÅü—=‡Ü9$§Ù"Å©é1òÐ,³ûÂúðBW¾<ú;ϪÙ{gKÿoÍ,ýendstream +endobj +5125 0 obj << +/Type /Page +/Contents 5126 0 R +/Resources 5124 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5115 0 R +>> endobj +5127 0 obj << +/D [5125 0 R /XYZ 90 757.9346 null] +>> endobj +2469 0 obj << +/D [5125 0 R /XYZ 90 739.9346 null] +>> endobj +454 0 obj << +/D [5125 0 R /XYZ 90 739.9346 null] +>> endobj +5124 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5130 0 obj << +/Length 616 +/Filter /FlateDecode +>> +stream +xÚ¥TßoÚ0~Ï_a©/dR\Ÿÿê^Öµ´+¢Œ©éB…Ð"A`hCSÿ÷9±A µ4¤)ñÝ}÷ù»óéóÒI.±f±@ÓU@Ыqßà‘‰GMÀ×$¸¼£i¬(™× 0§@Q2u4F”“N‘-ó¬˜á·pœôPL&\Ú +E«¼A79Þå¤p& ºég043’zÁL+Ž~ƒ`К¢USv0–ÁSðãÈcu‚¯"ÌW’@Æ# J¢¦Bi+"Œ!‹Y6_ä™5’nÐMnӛtðüØtŸlD]°éœÆ±ˆ¹%‘Ž$Ëg‹¹ |Nm³vŶœöìÚšîŠIáÄüñ¤JF Lpú6ÙÚXQ"Q¦;±ªQŸlKE5üKSènä-rü¹Î‰8Å‚PÕ¾š—ÖÚ^Êy›§"éwŽæD4õåoŠ­Ì¸T©ëM^®vY^xÑñtÝA/–[À»7è{^éž·Øo23&g½Z¹Ø¤Åt“N6›Ú›úuûæBº¹¸XÌóãuÏÃôz8¼¹î÷=)Šx¦¸™1ÒÐiDM'Ë¥þ1ÉŠúœ¬•UŸ/kÜqŽ>Œ¥Æ\Ä­±LÓÃ(}KÓ#Ö±>k¦íu0†•nÏ­Š›Š ÚaеI-+ÄØ¬ Ú¤ýòÞŠœ­ät÷†Xz·01ÁÅ­Åz•+“Œ67¹éŸdê°öœˆJä}–g[3–3»Í×¹ý?½x§tÆaç¹¢ìŠkQB„=ÍCÊ;ë­5ʇ¡Cc|ÙÛÿíú÷þ5ËOÛSílOþ`f™úendstream +endobj +5129 0 obj << +/Type /Page +/Contents 5130 0 R +/Resources 5128 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5115 0 R +>> endobj +5131 0 obj << +/D [5129 0 R /XYZ 90 757.9346 null] +>> endobj +5128 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5134 0 obj << +/Length 1803 +/Filter /FlateDecode +>> +stream +xÚ­Y[sœ6~ß_±ã>Ôî¢ ×´ÓIÒ8™fÆ3éÄ}Jò ±Ë˜…-o¶ýó #`°YÛ~X.ú¾s޾s$á%’ÿx飥k»¦O-glh¹–?.°zmÈ÷F·Á»»Å«Ä_ú¦ïgyÕ_p°iL–wá×KB­+ƒ¸ÈE—域å¥.±‰š‹›l»Kxsó> Ê-O VÄYzõýîÓâæN¬€ÙÔÁÕ¸ÿ,¾~GËPü´@&õ={¹—7ÈľO–Û…E(Ü$‹/‹¿ôwšu‡!~6¦Ã±eÊ'IØmú&¦WFHŒwF…ÜÅ!áfpL³M„=wé"b"×陸 +46º­8ÎRt4Р‚ƒ¯ GByU­QXR¶¼ºÁ/õß´ /;Ïï6±húÂo±áÍEEq³¤¹«6W5MhÒüJ›ÍÐ>6‰G¼±-ÓõHoì­ApeV[âõM˱ì&€êw¨÷Œ>J²ÉÐï<9¾[¿³f›æ¦VÈ£už•»Öödaœ®»FiøPÓLjö ÛŒ>Ùyon²}sÁšŸ÷ÙÚ§ÍÍ6 K B5yØÜÀåEs¹‹Mï›=CšÀͦ‡õžöY®@±â(VW|§©öÄ¥~ÅÀ³ÈOÅ)ïñhÌq=NÁ›M¥ +q)ø¤Êj, ‹¬`ãŒcõ%j>fòCyKNO^išQüþlü+žd`T°œf Ø–w-g67w‡]Hœ‡ëÆý A·KXÀ[¦£0R*cbâÑ'1У››ãPÐÎr¼í´ýMÑ3ŸX}ˆøˆ†~Õ™ê˜Ì&öæ¿ ô‘Ï‹qmõ£¯YbŒíž4ÅיͷrRí»qÖîc¬]Ó#Èí~õ­Ò<æƒòxW—#=1ÙoZÙÀmƒ)*(Çô-¿Ì;‹-+‹M–OðõÏಭҚ2½ç‰âñ“Ï߈8¦à¿!èœà&x>ΛžN´[{@ ‡ÎJà%6œÆº©nÃD_Ñ6ìs&óÑwc‹~•dÁ½ÒDixˆUAÙÓL=:yŠ$ŒQðt>ø‹ÛÚVâ¢×à)A+xPM50‘‰†R¯ÈzIe"ö€2çQeÁÿEà­DWA¶­"IÅL’e÷Ðâž·z ê_Wú€Ê¢|Vý‹L cÜ'á1óžÆlxú³íq[&ElÌ·„ªŽ»e,—‰š‹»œGÏÙ*9@õ6.rt~ÊJ˜J¢R€4àâZKIŠ“ˆFÎaÙ#†­s¶Ûˆ‰œOñK5\û¨ÅÏOq$%,Å.äÚÓÜ\ µÊÙÔ~FüÐù)û–AE™Ÿhxš¥Æ:ÉV`ê–Ç2& ”eÐC—¼[ù¹ðx ÒV£ÕB0á$w6~UC]«³þ=ç»ãÕ²ˆÿå#‹qØ®2Å¡¨BŠÚ§SAå½hPù=+©l¢<%lýë@¼Xhè!~FYóëÜ·ÉH|@õ•ivÄq€ézˆE¬Íž•…ˆC>µPõ‰EgÃï +_]gôÇëÖ%©^OI…Üñ4<–*Ùk{ŒÕ¬ýZ‚3q˜ aÍ_D)÷)T${¹úäcBeyß5GOvVâqíÁ‰é`ÙgÅÛ|Ñú\*+†ñƒŒ“\Ùö²ƒ©^• §ynR‹¢Ý‹H!ÍA°…Ll¸Ätç«ÕŠ{›zRL™ôEÆòŸ¦ §5^î¯Ú’¬m>@ˆz®I-×íoÚ¡ç,qm|Ö¢O­Di5ðß‚ì …½óá 7åv›œ¬ª„ÔÒQæbÉßwVˆîfݼ:NÚu7^Èy4‰ž)çE™KP4 F«-thD()§6rlë\LPÑÈøÁžüý0–¡ºx”¸D\)¬Øñ ŽbvàŠ ¸ö³áb7`éÔ¦e·ËÑ¥(8 ûb×úiÊÖÎ9ân?¦‘jA<$î rVº†mÔ'müð¡ÄfàÏ1‘ëíý{³a²¨TzHY°íêøäehÇfÚ ÿK;h6…¶@)øv—°‚Ÿ.Y²g¡×€sGUèÝ8)φ×JUOA¨óPgI’íu׎es.«¶Žÿi}%™b$î~¹`Âí=ËíÖlÄzc—gEVvP À] ¬ZBÑ¿í˜ë ~öl¤A[vë•åë²³y1ˆ¦- ÛÅhšv³€fc[îà!;’ÛyÖ9w}RïÉ.˜’î9¶$ïR¯:8¦Dv¬NJeŠ<å9«÷J«#ùŠnõ{ Ÿ®°}YªLÔ/zMèk¢Îô BNs]û²ªGª›ÓÃÿÕÎýõÎe×HÕQü€•þ¸²endstream +endobj +5133 0 obj << +/Type /Page +/Contents 5134 0 R +/Resources 5132 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5115 0 R +>> endobj +5135 0 obj << +/D [5133 0 R /XYZ 90 757.9346 null] +>> endobj +5136 0 obj << +/D [5133 0 R /XYZ 90 739.9346 null] +>> endobj +458 0 obj << +/D [5133 0 R /XYZ 90 739.9346 null] +>> endobj +5132 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5139 0 obj << +/Length 1533 +/Filter /FlateDecode +>> +stream +xÚÍXKÛ6¾ûWè¸ÎF _¢È¤ú´E‹¸§$d™ö ++K®qAþ{)‘Ô[öªÉ¡»É‘üf83ßpÕ?rt|Ï‚Pæ„Çtjøå +±«än÷ƒ6«g¿`á fÎf_¯Àð0ÂÎf÷æFDÖ.öàMÜ0ÝI7/b µK0Áèoýnójõó¦ÙÇÀðCÕ.ÿ¬Þ¼ƒÎNÁyµ‚€î9gõ$vŽ+Љý¯^¯þjÖÑ‚z”6"Sê0GøYu°ÒÎ×Ú0VAuÒ +s5©Å)¯EOj c@PátÆ·²8K™¬]áMq'õKÍ[ì²}”å…~=™L” ò·ÐCOÍi§g¹«wt9Ð÷(£žÆé/Çù`ðèG%‡Ø +Ë,6Òm„÷Ò KVQ‘›³‰£D‚ ðøxø£.¼gz5L€@öWzÓi¤M{b-”ッ}ï½üOê¹/“°ˆÒDÙV³+O­€ô +Ÿ¦dxí"®„ æ€ L'Tr _Ï&Wf à1Š»†ø- ƒØ(dQ°¥±~~—–±q¦ >f|kŽq'ÃXù“ý¢¸]^™=Ø}+«±°ÇX_sº»µ7¸°ªweÕY× P_­Ò[™Ó‰£ZôB Ú¢ +U0gð÷vú;—©­­ì!´qÛ(ÍL0¤éICD*×pÈûÁàûFí¡eRÈ,׿ÁÐLåÖ%Ñ  ¡þú|ÊmÅ—¸-‡‹~s'39öSë›Ijd§ ”VÔIœ÷òáœf»ürΜõ*Žî¤^ ÷¸¢B ÝÌÔQZy”™IŸéIfA‘fùÓFíyÌx1æ.„žùLR/ÇHmSy%Ov"•“ÿä:˳Æ#úÉ»<¨ˆª ¸*‘wˆ2ÚvéÓÂaKûQ“ yTgŸ_ÐÝ[~6—ÑÀÇùWïÛ'×VÞ” vǾf +å¾ÉƼ‘Æð­~ÀÆÒúñ~ ;|{µ†¢OÎU›<Ô¨3v¦FÔu&qeÖ8…ß!ÆÒ¦ó}JÝÆixoÄ•¶ãÒ'o +ö*[ÏxÚØ+—«5¡Š0ô{vp±&ç»(žu]³§üÐVžiy¸»ìrQ>[V.w=ZŒÞ–UUÖäW àÜÛ4Ö`­>4Jydí^ÞÈd°Dö1ÝEû( ª‚#¿€/ÆXP¥—)³ÌæÒS–6á9¹!¹²ažÑI €„÷c]P?Úmpšè /ŸðÖ.ŵõŠ23ŽV¡Ë:õ‘Ê Le‹Çæ´{m©¨sL‡Ý½>q)M¹ƒ| G—„àúÞÉûJ1c‘ÏædbåŸÖ.§ÿM±õÂv5S‘ô#ç+¶c‰¥`Sû©ãà ÷Ášä:qÇjj„n)ÿ˜¡¸¨n$T(u£àÆ;ÂÛÛSÞ#C…BCÓRã•ÓB¬…¦4­o|»$º_ïO›ÒSêy‹n¨D(?Æ‚t"c¦k&+êМú}eÚØc_«Ô…-‘%iââtÄmN°×±ÜG¶(5|HëË?¥–JÂôXsL[ÏWz‹¡·½‘nÍÔ ²õö)“'™ì,ÄsT éM1@.®Õ¶)s£ø¹Þí‚.l±.¡"¦¢a°d_æëïäþ•=æ’aSîõVã-Ñ[o˜i“ (,.í çIF]G'Gñ… €-#[ü¢“ŠzSô# .AyQîMi¥‚cXD½E„îäþ øøÔ)xg:B[yˆ’¤YZ•ló~‹íbÚ¿’Çòy=ƒ#€…‡—qªkˆ?iC~Õ†O 㢿»ÛwŸ{’G6«@ÔŸl™Cuvˆyì‹úØuß«)ˆànÛánûÔDò¥Lªë}•«Ö{U6TÏßíË«5ònJó£ +Åú ŸcòCýK1?Óoû5önªê¶îâÿú§ù˜«Æqõ´10OÕdŸ°Ï¿AãÕendstream +endobj +5138 0 obj << +/Type /Page +/Contents 5139 0 R +/Resources 5137 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5141 0 R +>> endobj +5140 0 obj << +/D [5138 0 R /XYZ 90 757.9346 null] +>> endobj +5137 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5144 0 obj << +/Length 2011 +/Filter /FlateDecode +>> +stream +xÚÍZío›Fþî¿ÂÒ*µ©bÂñN6M#6I¨ãnµSFàßjƒÇKÒlÿü¸Ã†N?L«æ{¿çù½ÞCÿ†*;”E™QyAz›;¼ÇÍ@ºG¸´?àÌœœsêPeT‰“†Î2_AŒÈnèø_Þq¼t4âdVfߥÆEö`Ø¢ w7Û5,*“ÐK70HÜ…ÁÑï·î”;`"/lß¿_~g‡>øaÀ2¼ªˆÃG\a ªÜp38žVÖ{ð±\§èÈ'4ñßL ná(C– ‚*„£`YLmG^,€øŽYÕ)("ÃEÊ,ǰ²Tð3 tðhtFbx2 (: ŽFr’í]bLXPòïßç]£²OaXI• UµÏÊ{TF”0Ükÿ +xÁõý$¼Ât[ì…n“bŽgTÀb‘ªŒ b>‡ï½Ëoÿ´¯&¼°šÀÈ +WYí„ëSª‹‰y[i“^#Qù ‰î»Î£ðOè%£x =´D^Ñš™ºO£ÂQò&,q\ŽÛå¤üP©«/¬Ö( À³¨àÿ†À(B¾ÂYa$•*œè ˆÐõVEi[h”)jÎ +Æ‚‘Â7¸%0QPá¼m4sŠxÓë­)°À'…õºUÐ™ÉÆTU +Räp‰¾å…1¿›³s¦.ÿÜV§.lµ¶šÐàÕ@¬¸uëN»0±oÈRoqŽÃíS„îWD³_Y‘õðÿH¸æXV:.Šö#ôQLŒÅâ%i«†>7[ÜHlËö <Ø%O¹7^ê:M4ac ßµ•r@ÕÞ­LLI„îÒ––šR§¢‡iäÕíùnôT”±§nb¢‚G”ùS÷ÍZÂ4i§Íõm›ÐÏœ8÷¡ãZØÂhƒ’ú¥ã? ŸÖva¬ô¯e¸^‡(¸/ýÓGûù  qÿhVÂÛÀä´cåþÁpXUj\µú}z¡O±¤qB­3q©¾KɸwáC9‡º`;ô—Í…{A˜ Ó}A½F×^z¢Z©Úa›±,¼µ‹60"'ð Ë+R²Ð[Ú\—´©ëÎñ\ÚØ*ýÔƒ¯¸øÿxUÙøvHý)ø•›wBÃMˆ7$Å‹ãVÕ]d‰ÇÕm4—ÉcFÛ£ögB³S±Eåp¸P™Ã¢,£{ &Ž»„gÉå|ÿÄâ\69˘çεféÄrHëÜ2?}RÔÎnÈÙù’›ÙŽá,RÕfd >e:–q¶pL‹,ôÇšM—~ûv7¼Õ°øþ¹L›|úç¹¥Ûd?Ó"û^ͧe‚™ZÚÌ1tû˜2OcvAê;q:“¦Æ•áÐùŽy¼E;¾7‡”„Êyñ{¥[ãKÜ¡Sù© ÿÜpf%ûsJ_# +Õ,Ç/¦iž/¬¹iwqèŸåJ+šöxªWúG0Àåb¦R%šú¤Ïˆ|íKm:í¶/Êå¹yéTIÚÙ´‹Ø›ÍN‚Ô¼&†¥ÒpjÕ1ö¬š)½UÌõ±QÖôÏ:V°fÝ?cdëx"Û¿ÿõg¢]iÔ€²ËÏ¡–ŽCÁxaéW¥Â¨5Ú‹³Š–.Lsbwp蟩”lÝúdŒuûg‚Ó´kޱ°u‚v¢9ZMƘv :™¶ž-lcç.ÆÌÑ-k1w s–_Ûi(½i\š×ØÞ©Æ5 vRs]sV35ì ¦uS%™Ùxî÷„ßõ¥Ž‡Ñ(7Ûs­4KûËØé`ÓÿX‡AŠÒi°6bcúÅÔ¸ÐgãšG›ƒkÃÖw7sÍ2ìržQ̵vÓÎFè'45«.cVS½§ž3wÁŒÀ%CµÉ'£Ôò³•qàµýŽG´sêŸÜíÅø’zC:î‡Ð?¿9å‰l÷ÌE[¶n”´œdË×Hg‰rã§z/ +$QzÕ×òü{¿‚§žÛÿŽYæ•ì4Ïá‰Ù—> +%ˆãY&âìÃ~Ö²ß+Zø} OI%ËEù/{Êñ§ùË€,S¥å'æ¯/YåùŸÜ=Ñ¿øþtŸýÝ@öA¿AJÿ&¡ôXendstream +endobj +5143 0 obj << +/Type /Page +/Contents 5144 0 R +/Resources 5142 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5141 0 R +>> endobj +5145 0 obj << +/D [5143 0 R /XYZ 90 757.9346 null] +>> endobj +2468 0 obj << +/D [5143 0 R /XYZ 90 739.9346 null] +>> endobj +462 0 obj << +/D [5143 0 R /XYZ 90 739.9346 null] +>> endobj +5142 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5148 0 obj << +/Length 1024 +/Filter /FlateDecode +>> +stream +xÚµX[oâ8~çWDÚ—2RR;ñeæi¦¥ˆŠ[Riw.BDS–ÍtýÚqÑÊ„Mñûøv¾ó}Ç$,$` d19‚¸Ôš­[ÈZJs·ù°-Çíý _üÖõ–pÅÔòÙ¶üù·+á€Û¶±‡®ÒpcÏâhÑïÊYµø÷–‹¸ƒ<*÷VS1aÊÚêøå¹?¡ Žû§õí²æÒ¯ûrˆàžõKvB`kÝr1):/­qëÏr=-0Áò€˜pQKZ‚–0™†Ei$<Ìåb›»<ú ¡9Œc°öì×™ÝÆÄ€\KÇ¥®§wcm›"tµ{Ýó`¡;iíød—wdëS¶z»’›ŒB/º>ì£vÒ.Ç$T°lŒ¡#ЄãQ÷ 4 úÀç0ww>ÝM˜2w¨Ào!38rŠÙ7\Û7&†èÊFÅÈ*Ð  v‰!ó_? æÅÄmœ.WqZÐÒ9I#ŒnmŒß¸«p„Q¸ §/á¿Á¶Â+ïœÒeô€t–ÚUM“x3ùIⵃ7–R “]8Kþ¯v9jÂ+‡ËjWùmì"ÞêÆÏ Ø„ÑRw’w Ã¨ný¤«Î Þ(/ø…ó‚Ÿ5/¸1/¢$\F3É*Þ)n&Š’Äœ(Ü”(ü¤Dáõåaú;\§k}j”®Ÿƒ\YqÏ¿é†ü›‚Ù.Œ£¤B¢Q ¸¬ >§ ÑùCç¬î<õF“›áànòðù/ÕtnüÞp0Ö£.2-\“Ñ;E‚ž_/òN ¢ò–)±‘J¯”k$~a)ˆsJ:¦…~oìw£á£_¥@`´â}5”ÔPŽíÅ9¼îð-Ÿ¿÷¥‹E!…DÆ4gšÇeÒ½·nºGÎ9àžWÛ½ƒ\›ý¢GÈÈ6qmP VÅõ—§»»ÎãdÜûÚiÛ)¢±™in´Š“˜T;”7£§œé×]&Þ΃mш|a¢œ“hõu[Aôß~g2|¼í+Mœbl´’“˜Æní >Ýæ·x’n6åi=ʱ׈rL/M9;+弊ò,ŽŒK“ñ*ÇÂd%è$º 4§{¶ +f?“t4!œ¹¥ßñÀ—kŠHúÔ£'Õ÷²Â$—K¤cûuIêFxQ¿ËPNvƒ(ØNwêSLÕ&xõ|(÷ªJ™æù—¤Ÿè#&å5’õ0’¯ YkÑÆ^·¬Ì©^вÙN>ñùU?oãß¯Ë zU|4Äç?³Xendstream +endobj +5147 0 obj << +/Type /Page +/Contents 5148 0 R +/Resources 5146 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5141 0 R +>> endobj +5149 0 obj << +/D [5147 0 R /XYZ 90 757.9346 null] +>> endobj +5146 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5152 0 obj << +/Length 839 +/Filter /FlateDecode +>> +stream +xÚ½VYoÓ@~÷¯°èK‚”íÎ^öòô -Š’>•*JíMcä8$þ;c{m×ik(Rö˜Ý™oŽàRü«©ëIh.”LêÞáö¬¸‡òÞæ×çð”iW­˜rã\ƒ"0w^w÷»=æQvVç—8•´„““o£é"6Åâx¬¦f–ŽÒh>ëÞ .œ“AeÙ“\Af÷‹s}CÝ^8”píKw J@kæNÁx¹ˆ¾ó±ÒSò MþIàM*w< +¥ƒ ýõ +ÿ€ó «Ë8Ñ@…ÛÔ.ü\ö<—h"•wcÿp1‰BÍ¢4ÅÑ“ä'{œá ‰q&BáXÄóÙ¦þÃBó‰ÒLÔ´ÉnOQÚ9Í8š™bqu~9<úðþtxuŒ“³“£·ý«wýn|B®ÖÔ¨Æ]¯Ðw¸ñs‹­”ù„*íÙë~ëPæ5•™\fu³L£`Y¬±„Š1±ãxüPŒõ#–› ús/`Ÿ¹ì¡Ü÷¯çýÁù&ž«]‰¼qW<šøñ83‰²¶c4 âUhéÄN&f›ËqÛÝq™ÞêÜh±ˆ£ ï!Ÿ¨¤Küƒmý«eeè¡Èã;a"+œ•5±HæŸM’ÂIБ†”¥ÛOÝŽzZäî%ú`+NÏ–ÓtA&Ïò³>¦%kP”Õõ68o?à&&Žç½õ<‰Ããoƒ-@ +Ÿ0!X ¤¿©‰g&­þI†ñ» u Ÿ¶¯nÛÜÚÜ.MòÕ$¥ÁÚ“’t?n…“`T•¡õ<Þ®2ðÑJðkè`?賜Ç_«˜SâKݦÏ„s^GÇöƒsÄr’ªj©$ŒJÕ!ÇV\ÇרD¥m¢fFãMpÕîh¨[f‡Ãª£Ÿ ‡ù!ˆÇ¡ÝKÞ¨ÔÊFØê‰}|ñȪ¶À¾ü¹%i°Ií©IïÿC©³T Ø6Ù3Ål’ê¯lNÁ}¼œm2p…ŒŸTÎðbæB %ƒúÆÌL2JMXpíŒeã»rrÑÙYÙ0;ÒŒ¿`–¬3JU1w™Ì‰U¶¸Ïêo¿—„þÛ÷;sÊg»!J¿Qˆãâendstream +endobj +5151 0 obj << +/Type /Page +/Contents 5152 0 R +/Resources 5150 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5141 0 R +>> endobj +5153 0 obj << +/D [5151 0 R /XYZ 90 757.9346 null] +>> endobj +5150 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5156 0 obj << +/Length 1973 +/Filter /FlateDecode +>> +stream +xÚµY}s“Hþ?Ÿ"ã9£uZÊò–Ðsœ£ 6ë¤!±:ê(Ò0ˆ¼´z÷åoÝ%P GôÆ:Ù÷}~ÏïmwCýC™ŽÄ#ó‚4´wvx‹š¯wŸ¡þ³Ã—æàü5'eF–8ihnò$Àˆà†¦óñ¹ÌñäŒÙç÷îÚö=7Hûä³ùf(°c†%´p6Žãå¬u št7 Fä%íõ}ðñ3;t¨7–áå±8¼G–²Ì wãIŃ·t¢#ŸÐ$“øf¡€À ŽHÅ!!G‡B–} Õ!þ±È°`<ŽXŽaGR…Ñ(Èà³ÃÑiˆ°X@€pr&!ç9£ð@Ò +ã|À‹y×íC¤Kò¨à¼}VÞ#3¢$€áAû'À –ã$ám¦ûbok¿‹=8ž‘‹Ø”AÄ|ß{¿þi_Mxd5¹ÊjçX|¤2n\]LÌ»ØJ›ô+|ŽŽâÓq7lR{*ª7îº(àÆVfÆ¿•gù‘ÕÅl1‹Pý0˜[/.äsX»½ï•xÞãv«ø™™æ²BD^N¶.‘e¬5Y# ‹_'¼üÐr(½EaoݺÄlÇŒ$sB…zËbxç»Î& +wµc7ºs£˜)jãÜ啕U¡ƒt·v£¢n°ø–ï¯-û[t®7ôM؉q•º5¦ÒË4³C¬»XÂõOÂ?± ”O•’&žïýM„¢ƒíÐq/:ðó½ñS§ùâX‰µEšðÝè+²è?8­9Ö; ×F”#ÚÁ¿&ñv®¦I+kFu¤~—ÝLLñ˜­±ðþÚjRCd£JhlÚéE-ÖƆqo³Ø˜¹R‡ÔrïE!1e+³÷ªkQ­›â9ö(¹¬4نسÇÂ1bšß\»ËK µÿåMŒî^u ¿Sý× ~ŽTýíÚçú{Ñ$ÜÿŒ¼Û-%™Ø™UŽe¹Óúº´%öÆ¡ø>ŽÐ˜˜Dë<Š;][IG5ê Pw/N"o–MSQ“Ž{â0l·6jíV„Cú&Œv1 D^²Å.•-( uˆÝßÏQîð6ž;$ÞØŠ0Ľí¼„æ}Þy©•‰†zî&ôýðÞ nI¦ ¯Hlíˆû +oç&‰Œï>T•WãÔ¡³\б¤1=K$Ñ7e¥š;:‡¸V;ôÇ +94taâÙî)Ù—œÈ|à¢G˜R+U;lS#âÂö-”L#ìpϰüXªBîìáºØ& Öã!ÛÈ*Ôv og˜ïϰ]‰ÿ áíü +ý—Š«rJ÷uB;­ec› ÄÅ•¸‘g‘ìH#A;^±?Þ2à•,£Ëú¤ÞÖÇcë3ÉVµs[N$‡ç…õ“ê¿zNGÑÞ©žàÝÀ #’Ȉ»]˜tÙæ¨?u…é ]Ý0å%¨4Ò8Ü$÷4Ž’´Rtí];K¬‡p·ó>>BËQ–R‚ƒ ÇhW>&™ G܇gÐ(pÚkóFÑU|MÄ­K]{§ê´¨]~À4ÃÔ•9Óô¢üõ«bÉÏžáþÅ”ðTõýRW £Ý„þa‚^/ç`E²èÊ„ª\Læ«)\\áúåÊ, + æðšd¾©Ö„%Ë·CïŸJ”ÅÚëâ÷ZÕ'3Ô¡\Â94?ÔØ| ÍEFbQ!â+XeŠnÂÉj®àæåJ_j†Ú»ÿý—ÚÉ“¹¯Õ) +.€Ëi&¬b…¿S˜_c¦Ìçt©=(—sµ.² vúŸ÷§PW'&µZu‚Œ±?Ç ÆR@ZSß«Èý®ˆma¨oWh"Û¶ÿ¥`ª\+WÄF²«É±ÆŒüy²ÒÕkªbpÆêÒ0¡¹2» ¥ιҴ©QeÉPõwp¢bœšQ³ý•¡b´SÅTj#õ“ÉÔrV\t‡•þ¸0U]_-M¨-Ê›àL»A&M4® °Óšwj‹ZÌCÆ®éªBf6ž»vÇ[Ðÿns3SÑn$.¨]šºB­Û0u81À¨jjºÙ`mXûßjêÕ^©‹‰ZÝ[Ë$¸†Z’®èÐȶ¯ˆEù½Q¹«šUÓ0ƒÔTïÖ"öϤ$ž–aÃÅ;*ÓwË€(Dð0Ø—Ž9™oÈ‚@Ç€Ž95ˆÜ/¼¢çïe•ñ½%-‡ÊâW.s²<'å8±ìo]BñG Õ?!<…ÎEí=”±OïŠ&Àpô!H:G€< Aºàñ[¥E߆ÔøûÊÓÑÄ£D“~çÛ›8jx{Çö?¼ÀöSrá’z{fû¤i¼Ü6Þ÷ÖÍS$¶qJI}ó,Ð8+rãпk™Òô¸(ñMë¼Ìn^Á-³}Õ4Ehjñ:Ž»ñ¼Ìz9AÅ…ùÅD#“Ë6}p F¿Yd¤@¥_úA£)€ç¿5KŒ<âÇä /‘gl7p#+Ë>¢g·äì÷šÞœñyŠ+€Ã¿ìÇ_plQË|¤(mN81¿f•ÜýóÑ ˜}ÖÉ~§áŸ·è‚T£'ûPÞÀÏ¿_Êendstream +endobj +5155 0 obj << +/Type /Page +/Contents 5156 0 R +/Resources 5154 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5141 0 R +>> endobj +5157 0 obj << +/D [5155 0 R /XYZ 90 757.9346 null] +>> endobj +1539 0 obj << +/D [5155 0 R /XYZ 90 739.9346 null] +>> endobj +466 0 obj << +/D [5155 0 R /XYZ 90 739.9346 null] +>> endobj +5154 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5160 0 obj << +/Length 1022 +/Filter /FlateDecode +>> +stream +xÚÝXKoÛ8¾ûW؋݅T>$>ZìÁmÔ4iwcíî¡- W¦c¶ìJr›t±ÿ})‘re$»H/MD$‡óqf>’vþÅŽD¸'©ÏœxÕCε>ía+vµÜÝŸð"ê=}E¤#=És¢y…À°Lœhö¾O|4p Gõ·gït3@}ì!Óo¦«ÍR™ÎÉ:Þ®TZL‹d>Fç½0Ú­l (Ã废{ï?"g¦ <ï!J8_uyXJâ¬z>¡ugÙ÷þÜáA¥ù` +9È=®$Ú_nüc¬4Uk»Òó™˜A>pBýßfjž¤Êtþ _¼¼8 /£É8Faõ÷¯ñÅÙehäG½‡'áÕXGÑ×R ÁÈ#`N†ÑpàúD‹€ÁÑ//Fcí-e¬ã@~Eï^] O'—£2@X´DˆÓ.åÑm j‰ +÷»TߎþOô­ñº´Ã««Ñ•ÕmΡAh œG“tiÙB7h +)ÊÅ8û®8jQÌ7ÓXÙm†nD‡€- ø K\^ø¸ngÛ¸0í¯êS¼Lô}0)gX+òç’ ZzžV2,=L„>ÛXŸ}_T3žTßã‚`goÜýù?ÕJT2Ob,Ž2˜­i +<†|z×5f\‹ÓÌ ŒÀîN$<Ä$7ú¼áU²RÅíF}@ú²Nfú òh·â¿LÚCš©b›¥–.¯F†x“vŸýÉð£¥O’‡Ñ'i“¾y²Tétuˆ>é·Ó'¾¤ŽuPÇ/uâÔÉ&u‹u^AF¨;Œ0H^‰ýœOÚÙÈîÓG¨Žò=ú¨Îò£ ßì Ø¦yrª™Ôb`(‚&]=ó U¬‹*RUâÂT‰.ªä}ªè#¡ +Û _Fòã&7Išä“n0Gýpðˆ`÷´V6ì_r0‰×iªâòwÑEGQäÞ^øÇ¡ÇxŒÀ\¼[áZ™ú¼Uy±TóâÎRyòM­ç¥+‹¢ØLôÌÊJæšíýÞèAKû i bÔ +ÁP&ÎÒåù0Pù¿ãÇ€‚Ÿe«ŠL§5; m®²ÉôÚä;j9Ë¿£Â8üŽÉgöõêWÇnBí7¼‹°_6Evg» XUB£íKj:SÙR¿¹Ž¥¸ãj¢ä׿šš ìaŸƒ•)äè<“ìAÅ¡ª¼%´ŠÞ~uK›Í©(‹?”hEŸ‘)¥©§*U™¾ f¦ŽµNÍ÷mÝ8à@§¶öEì=#ô±…0ýg¦5 ¿ÎLç~ÅìÓm],»¹Õg¡¤²~DéõÝžoendstream +endobj +5159 0 obj << +/Type /Page +/Contents 5160 0 R +/Resources 5158 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5141 0 R +>> endobj +5161 0 obj << +/D [5159 0 R /XYZ 90 757.9346 null] +>> endobj +5158 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5164 0 obj << +/Length 1373 +/Filter /FlateDecode +>> +stream +xÚÝXmoÛ6þî_¡OC²Æ,_Ä·°vi‘ k7ÄÃ>t…áÈr"Ô•\IN—ûï;Ф$+´c§†-ù ™GÞ=Ïñîx"‰0ü“HãHr‰4‹E”|áè†_ˆA>îOx1=}Eu¤‘TD“E£AÄ)¡ÑdþîH#ÂÇ”ã£ÏéU²ÌÒ¼FÉñûÉyc…0 ØÌ£11££ÓIkÍáLcëÓèÝ{ÍÔù#¦>ÃŒˆÖ4ú8Š)ó?–£ËÑ/­+h„8qÂB¤D#OŠGi9ÆŽÇã£Û"›7\À-Å"æN[yKyš,‹*ýsl–À“—q»ìKP(ŽÇD´BU=«S;õ;ûøíôÅË‹³Ó7“éåä‡ÉéôåÅÛËÓçA5Ò®ø+(TVø´R†4Áq4&à¼X5S¾µ[‡¤¢QoxüÏÿ5†˜€¨mH„E=Žl¶l@M[jë¼Ê®ótn%7³2äˆ7ð:­Íöµ †xPRì…즨êgŸˆim_WEéG§v‘-Ó6–Æ"”ƒlÀ„숩˜ú˜ªËuâ`­³Õ4)òÜáሚ,Ý#Ì"sãŽÆ†9æÌÙj6Ÿ—à ³@c¤¸f{±¶ !Í‘ˆÉsÜÒšÕYÒÑjm6#š¡[xpÔ' 3ÆP,Av2l`êC~••Uíw:M>Ø×laŸõKf&NT9ˆ¹}žýÜAN« +ÙüÄàµX’4VH)̤cfý³QY¾Ùî%åW-Lf€—Ù•s1„­ì~3'œ|]äîÁļ1ѾEê ânè‹£ËbÄ(áàP +ÓuL6£¨"Çto|°GÅòvº,Šë•÷ƒøôà a:,Q‡Ül(Y´›70;Ðo~½¸rjL!`ŽÊ´^—.ªpp_9sƒG÷¹–3‡ûÌiÊJßݾ֤IÝ‘ssSyeFM4ô:õËàèf|ölà6*»Mà]ŽÁ_´õ’®1aC¬+Úy²º3ä*dÎç¸Þk•ý™‹nÆN7Š8¤¸—½׾bÜÛ£Bø¨Èò¬öQ¹Qº]•/Uý Ù2Uíèt„> Ó!ÿ­VGºæeãô W^B òr:CÆ út¡¥SîÒ%)VwS”,¿ÞQÙáÈ`€}RóÔ„—µÝVÜ b.ÒÕRn3,)|xçû†«29Ùª­y[¦y×h ;ÅÄ ¹‘lG‘Ô²tíNµœ¡`@Kˆ}£Å¾=i5„W‹é åÿ¶ñ—ê~6lûn“®*Ti>ŸÏêÙCl +ïØsE|·ÛµüÛ6Gùƒ  `N‘Àt?þðmR¦ŸÖ ®¿€Y¦b=°Á¾ÆF²ªËÚã /¾qW¨ƒºLÎ)ßoi߆º„;‹ ”£²Sz¯—ë +‚ ˆk¼iZ“ÙjeÂÀwmˆK:è&U°ùPjØAá4ò¶á©Wæ;óÞëƒÆîàÛZ+”>ÜþF3l-Ú§sжseP´¹{ÇÓ“'ÈÎ.ßN«Õ,IŸû|Fòy`Š<Ò±‡ýJðnÕ48ʉ))óe•‘‚+˜}š?W°Ñk%‡à þù^>Øgjù¯ïƒ +ŽêGâZWi9]›û§E–.çÕI莔 ø‚Þ×âH#è¾ÅW]Ÿ6—¾ +–Fûw¾p@K¦üõ¨aø¾Nó´œÕ¦‹2÷¾EnŸ?ù—óc¡Ӳ?uOüŒ²gÛ_ð¥*ìÛâ˜ò£¢´?Öæ¤™ÜÄ«;ûü±øãü4t¹Û øçoÔe›˜endstream +endobj +5163 0 obj << +/Type /Page +/Contents 5164 0 R +/Resources 5162 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5166 0 R +>> endobj +5165 0 obj << +/D [5163 0 R /XYZ 90 757.9346 null] +>> endobj +5162 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5169 0 obj << +/Length 1411 +/Filter /FlateDecode +>> +stream +xÚÝXÝWÛ6Ï_á'– lôm›­Û¡#P(ÝÈY'Ç$Jð©c§¶Ó”®ýß'Y²ÅI:ö28`Ù÷ëw¯îÕ•- ~¡åË¥®ãc¬Á¤¬±ø|Ö‚šl º½Ìðº×:CÌê + :Adõ†wmDPÇF.pA{vþN )hC¨A÷s0™F\½œ$ƒÙ„Çy‡Iܹï]´º½Ê²F1ƒÒîÇÖÝ=°†àE 8Ø÷¨5/À¾¬I‹ \¾D­ÛÖï•E(LþQˆM2K|q,DÂ_Wû„/ÚYžF<þ Pð˜çÓþ,ãi? ú£GÃLP üûI:'ìÙ¾C¡Z 4~ÁÃ@èŠ;6ƒWê‘9cž§üãŒgyÄG¹úú‹zÌÂi’I{@ÚûÕ¨wl‚ž3™‰f^5kv…jÐRuÆã¡Ô½'ÿ-„ï–5Móô^Ú>PðUׄ‰‰h{‚雑ê* f¢§ˆ‡aLJ€X6Ù@¼‚åÇ‚B×CÖÒgûå +CØgôÖa€Ë j›`‘½Ã+®ù:+dñ ÔøSMa€@уÁ^ÌŒd”ñ62CÅü·‘ˆô\Ì ëçÕÜç bãW¢5„#‰¤1©‹ìlBCÿ«Rl‡Rî.¥= Ú Ò~µ!ª¾A\T“’Úß @S-!ØPKýok á絤Ü¢¦Ašñ¾™eQs™"õªXWaˆ6ä4*W»Ác 9  í܈LPo‹Ž†=â¯hw6=msþF…#UA••¨{{e}Év÷ȃ!O¥ïUþý¬éážèú®s– ±)‹ ¯ËÞÌÞ—u_$¥hÒTÄb«PItUŒ‘ç0m-å²L§Ã t¸s×guW0ЮìïëdaÒƒò)ú“‹Vi{Ì®»’Ïj³¶½n!Àå.#4NSS¨õs~{Ó£ s‰=—{ e¼§ñ`25aÑ[„bƒÁQ¡¨(I-ó4ÿ ­KéWº²Äôõ«Q?+¨ ½ Th†ê®ƒ +·†º)袜©´0¨êRKïçÚ¿_»÷¾V¥„FQ0®)|Óë½;½<>ë_ß\wÐt¢-‚'Ñ-L$ÄÁêòQvœEcXˆ$.:˜ Ch¨?±ˆ0R«¿bÇ/EoÞªÖƒâ +½;t…Z*»U Ò˜6Å÷æ­9ºXG÷›âçQÆÕhc¸1€æp ÂVán*Bª,oB€Ö!@/2áô»'\Ä@)¾J>ñ¡nø<±8ÛEOêC¢‹ ½5:MfñÐQãËdPœj´ÃE¹é­(:½z—= [,6ž Ý<Œ"%1HÄ9Ô-9œ«AÌõ Ò¶œÝ» ÎN±$;Xì§W¸[fçÕÍŸÝs‚zëÔ> endobj +5170 0 obj << +/D [5168 0 R /XYZ 90 757.9346 null] +>> endobj +5167 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5173 0 obj << +/Length 1556 +/Filter /FlateDecode +>> +stream +xÚÍYÛrÛ6}×W°y¨íÚ„q#H$ugrqÒdÒ4¨“‡Ä£a(:âT–Šªã6ý÷.ˆ¥DB°.®jψ$n»{v÷`A²€Â? 4 â(&ZHdW=|†æ=†Ý!ô‡íOú½Óç\šhÅUп¬WPŒDœñ ?üp¨ ‹ŽBÑÃëüS6.òIE²£‹þ«@Ò„ÐHÁÂf—´öÎûKi¨L$3²¾ô>\Ð`J½êQ"t×ð@ ÓšW=ÉEó0î½ëý¶\ÇvÔ|6ELøŒR´Ä”5Fq°1¶6q…ŠÒÃjCM¤’v&¶ó´îä‚hFe2Ð@&õ¬ý$NxÐjïÿ¯$´Xr›¬­„Õ:”K”pLÓÖ´y•VEfï³QZú`ˆ)ö§ó<»š}¤]Má:â;)4¯Jv‚KM'óÊ‘ºçRü¤5¿¾çÐY³YÌ!^! º¦0;ôo¯ü(d‰{÷È;Ix[%.u=*ƹA ”³Ëüd/´Vuƒ2k‚±vÐY=b[$Rï ·U9T€…RÚ‘ P‚ )…8ñ,­I¤dgéçÓ2Ëôéu^†&4Vx¥Y•—sROf"!*äÛ!m0bD9UÒU7Fu‹Ë:­¸ïͯr+ Ì’¯ývÖLåÔïY½ÜÐŽ:Ö;œ(Ê“#Ø*ð*’¹„ÖÛ‰#˜¡e^-J *æµ á-Ø{|¼ +wŒláþ1M¤†!¹ˆÂtð+coÛ"¿O’d]'z®ÅNÎøÿóµ¦ë|½`jPù€ÐF³´œçƒQž!M”ÚkdéNçÒH tÖ’··D}ÛÄlV•6Ķ–^LæÅçI>tù¸ðFˆŽ¼­j+#Ÿ ¡Ìɨªfºq1ÉAqÛñ#öåÓ:óÝ‘Õ-T¤*sç~ðˆ½hó?‡Ú%8w +¨ÎF͆5ßy"[³A:› Ó*EA­Dbíl¨:Y„wçÚÀiQl›A»é ·qôvz¨‘_¾ûu0oö¥  ŸnI†õ]ô=n™£ôO¼K1&¡´.Jlû¹ß‹ãj]1}AcLƒ‰?b±<šOo/µ™n*úcàºnà\!Ä^Æ L‹\i¡ºÅ#ÔƒVnÃ(#’Kü—fî€TÌíÊ×)ÞT£¦¬I›úÔº1  99i‡ô”_ͪ{ûà#²4?“ÆÇ!1#±`Ž1°•Ƽ崉‚á´‘|]T#GYdxG•Y9Íò†6=³ J[¤c/¦ +Õ0©ˆQ@)ÓW´OG#Âi9kÇè¯91$Ÿ7ìV_ÞŸ?yúúåù›þà]ÿqÿ|ðìqÿ±?¹\¥]2ÜÊãÎW5F½­MZïÂV|ˆ¥ØEÇ$o#¿3k<åÙvíË)ŠžÏò¬¸l6L?c\ùxØå@ª¥ñ>9Í#A¤Ô±cH7§[GÄ[øÈ4àøWÇ ª›´ûð1…€àvmæŠèW- ‡l9óJãŽôñ|ºhRí©Õ*4ZµÐî¨Þ#uÀp’H—­™B]³eÌ5Ua™Ê ¨<:Xm©.MF¢ —‹7“7¿¿~½ ÆÄÂå®Ô»V‚¾<ñÒ"Ó¨¡79m¥*'ÙìÆÂpU\å6¼¼»£m=ö®†2ºw쬆MIè…Ÿó%;Ùd¼Ü÷I©ñ4ƒ’y:ñ¦7E{,×MjfÝG*qykxî>ä£Rû(êUy[»‘^Ç ¾Ï•Ûhš|Žï€D‚F¬8Æ©±_]€ÑëÊÂM ÝÈ–}(ÆYÇÇÅu$Pœt_eh  Hïvznùû¬s˜úöÍæ´Žp§t¤²{tpz°‹(~¢:—ÍòÄ}È{xàøÍ}£Î“±÷í>…튩Hý§—íõ'‚¦ÀFÜþBÃq_¦£Ɔù$/¡¤Ú¯Ó‰½þÒܼ:bœæíƒ©€ê+}ÈÅCÃáæ xPÙ»Ë#šúÆ<,^¾ÅÑ~º±×gÓ¯7Ÿá(ïÀc¾xðùûRendstream +endobj +5172 0 obj << +/Type /Page +/Contents 5173 0 R +/Resources 5171 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5166 0 R +>> endobj +5174 0 obj << +/D [5172 0 R /XYZ 90 757.9346 null] +>> endobj +5171 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5177 0 obj << +/Length 1192 +/Filter /FlateDecode +>> +stream +xÚÍX[Sã6~ϯp_¶IY{u¿lg;Ã.Y†½´¤ÝÊ0&ài°SÛ)ÐNÿ{,9„Dq´…K:·ï\td G~q¤Q$¹L4e"ßöPt ˇ=ìÉ1Ðãe†·£Þ«÷DG:Ñ‚ˆhtÕh8á“h49ëÆ1‘H¢þüè 9êã¹Áð>½M›ãù­Éë´ÎŠ|p>:î G ˧[»¿÷ÎÎQ4€Ç=”P­xt”`­ItÛc„¶“iï´÷ãB#4!ÿ8¦!E+áÖAþJç¥àŸFõ«ä¦¨ê³ì| ˜¾qô½u´Ç:a‚q/ĽÐeiÒßÂ,bK,©ÒS׬ZfLi¢´Šb ®2Õˆ|×PX"‰––dzºtöcLU"ÔŠåíìí=r®bÑ`[lBÊ ×œm¤bO­ê2Ï~EUÉU65/CÖªVÙŸ¦¸z䀶APŒxůª B"¡b¤–Ný„¶®g7&˜ršå8 ±{„3%˜â pCðñ²%öI¸\ =£ƒ˜‘cÁU\^“3ÇI" U‡N¸`O~5ß–Æù7)r?š¥e•å×mZ +÷¼óÔÒT¦vÃú¦•(²¼6>|i>ñ’uZ.q6¡X$ꉲáBýÜÜ{›ÄC\…–Ï 8Æà*Ç«W>N3ß¹©ìŠš„5\fZy÷ÿ +±sä­ííì-p¼°¢BÉãƒSO-M=/sE“‡ 1GkâŽèbIh¢1b»ôšø¿ÿq[X À€õ.|0 +§€tÅ3±(Ì:»ñE6 FÁÕ$”äÝ$­SÛ–,«mHAvÕU +ÚçfŽÅEÝ‚«Øk±'¥:Ïf¬[ˆû¥ ÁÕ¶h2ßwmd|Q¿ñ¾ß¾;9~]œŽöGÃæÿϧ'GŸ†M,6{-˜¯æU̶¿˜ kj^Ùí`M;ü°ó®Â"¸*ŸïÙ‡áþÁð§SG|ñb‘'7øÁ÷†m^«N¯]¨¶º¬»\–Á‘ø‰ËkÀŸúµSDöGû ±IhIT,:êÕ4½vìßx…F£/ïOö/>~þex°%t’úÐÝ™Ëñ4ƒwŦ´oà@™šÒ—7ߤåóObkÚî•t6³:_.’û˜‚Kè3PO+¨Xg*xG'•âÿÙIÕsÎÒp+•²»}JÕ¾5´©„ÈÓét[#•º£BzRâ6¡ã"Ï͸6“¶ým)2Õž±URg·f—ƒ_‘…ÈòžÙÖúÚ¯L>i–m@±µ±æoX{A÷6æ]…­dpU=¿­¾;ù|ºí¬PzÝÑiQmñR#/ÕììË¢¬»Ùñö èΗ,Mƒ«l­*0;פækÞ¯(cíL –k¨lÁOŠy½+,µkUCW×áßl¡œ`&ƒ—>[°àâ_Ý 47 +D0%ËÐ%Uö»Ÿd‚, X°‡&7%øÄ]a¹{~lÇÌûs?ÁÄ?ÑkB__®„÷‹ÒMÖ/K.Ú{’û‡k³vCb¯.Qú…¾Fpendstream +endobj +5176 0 obj << +/Type /Page +/Contents 5177 0 R +/Resources 5175 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5166 0 R +>> endobj +5178 0 obj << +/D [5176 0 R /XYZ 90 757.9346 null] +>> endobj +5175 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5181 0 obj << +/Length 866 +/Filter /FlateDecode +>> +stream +xÚ½V[OA~ß_±}ísß›&­­Æ[ãÚ>XC$®»¸,USýïÙ–0m +!s9·ï܆ƒ|¨¾ÈÐY¡ÜïÜzÐï«ë=Yr èÁ,Ãvì5v±ðs?î•8 #ìÇÝ‹šˆÕÌ`í^^u’L Щ_Æ>…€Œ+ÅšS¦o½f<µfÁ0‘¶uç]\B¿«@x1ÿ^ @B`ÿÖ£˜L‰wæ}›ê1„RÀåCÄå÷ÕMÑÄ)¬| O¢Ò (§ÌÞâz€"kƒÞOÈàx0lµ;7²«ê‡ô¯pÅðÛ)NêŠ:ÅàVæ†õ£Yà§µ"svܬ̂{vRùôTÞwÛE{]ðáÛÁGV¤bÉÍ,–ÁGp~.nÅD§ÁñôäVT¢É¯—Êá¹·$M-ÓîJÏz^ª”ÉHšÝ‹³Ã,IÖ5άñÍM›*·UnÙŒ‘ù¬Ú´þhn9ÜoÇ­xÿ¨yr¯2­j„b8ó´´Ön6.–G ²re ¯²|»°ì¹,ÆyêäÁкç,'¬¼`TQ%•c€8~€Ô#B£’g£¤`‚ÔŸ!¸sÊ0à‡„F³ŒÑQ¢ aT†—õ&Î[ºÐ$­]¯˜Ujáº(†½¤Ý72ïl9|ãÓÝÃÏ{­£“ïÍU:¹MRc&>‘#>0Nçâs¦"l4ŸšŽ¸Ù™YGƒ~ÚN̾y² Je/1]?A ÞˆjkYc¸n§ÝDæ:LÜ{ûþ½Z«8šÖa¥¹ÝQ›”¶ÉD.GYò«•dÙÍxhS“Š—ÐO:UcY‘mÍ[¥wc™?Îëtz@…ä,H‚ÂÔ—Å‹Z ª®žzƒD¾n,k]B—õaÆ„›È ±1×Ú¯TÊl¡ÿþS"‚+ (zKµª<qRq-t:­txö P£ÑœÏŸžç(o@¨-QQ"þ?”ꨉ¢¡sì…êBœñ¿šBËÙ9R"ˆàÙÑYå8$ÑdÊ´ 4È=™Ê¼]È®Ÿ³Ô¬G“ÍA±ÚØô0R®p “-ý÷¦Oªó¸Ùõê˜Õ²ÜÆû§–XÆ«G³îd}™VãGdG|þãÝÚendstream +endobj +5180 0 obj << +/Type /Page +/Contents 5181 0 R +/Resources 5179 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5166 0 R +>> endobj +5182 0 obj << +/D [5180 0 R /XYZ 90 757.9346 null] +>> endobj +5179 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5185 0 obj << +/Length 1880 +/Filter /FlateDecode +>> +stream +xÚµYmo›:þž_m“ÖN-µÍ{wu5šÐ†) vÕ6e4- !íªýùk°M:2]­ZüzÎsÎy|llØøl« -‹2§ò‚Ôž,Z ý€›¯ZvŸâþÓÝNëì©m•S%$µi*A‚œˆ j;Þ—#$HǧH28ÚC\Áä)è¿ÜÅjî“J7œlþ2vã \s>¶t'ÓL‰¼½?[_¾¶‡~lŽW±ý„+€ƒªŠÚ‹–€xV™·ìÖ§LéH'”Ù'B¾Ü@(p¸1 6X&ªÄBÀÑ“?™ØnVįˆ€ŠÜ–â€,å¼»‡‚ >ÝMHmŒMa$ðøTÂ(ÎÝàSˆ­”tÀ»wi×iÖ§p@Re§êYiʉ’Û;í_!/¸ž‡Q¸YÝ™ˆ"Äs*Ø¥*'H‚˜Nã+úð»Zšð‚4“”“vF}€ã†”¼01í¹6éoœ*äÔi€—D¥ÅJc™=ßõüˆØ‘Ê&¥6Å3ÚÒsœ!)QWƒPcË&ž1­šç.H©»YþðçkRùÇÅí<ÒÄMÂÅ¿Õ (X$˃_ûRa°$øå¢_©h˦àCþ…YûNê„«ç(x˜ÅDíW ‚ þ.l:©ð‹•ÂI*òFqhó9‘ž‚¡¡‰üµ=ú^*ñ GIZ¾¬ã(¸ß¤›EŠÏ]z¤°YSB´gn¢‰_u,Ýè9[ ‹5uíSÏH‰Q5i 7qÙrc¡LƒIº×QÅnD!®ühıO®¢ð1ðX-ž¹qaÝNÃù<| +–tñ†K/Hä®k+gð~|^#Ym,rDp>¨”uát?†“ÐcX6똱3vY¼3ϸ÷ác6‡-­Jèè¥|ÂòÆNÇ2Œƒ‰Âôõ<`¸þ¨äyXFì‹ÉÜ ~DœÀs€W¤gñ§õ³lÏ’_é…Û˜ì»E×qSjî:²Ø‰YÁ#3ÅúŠ$]‡Óø)Ë£l[!]+’l l€qWû]> ÊQ²¥,wv˜õú…è*‡læ¨yþwz†MpÙæ¥s«Y:©±Ö¡eÞ]½Kjw”A=:L9=Ó"åïß5›M~û–öº¬@§êŸ‡–nÛÕ\àAc#ãzØ7Vl‹¥ C·iÂ2þ¨k ®hýbäÂÀ¤…¾qm8l¾cžŒeâ«¡7ß¶(‰ó’ü^ëV§‡;´ £o8wo^Î q"©0ó52ÍrŒÎ¨¯ÑæáÈš¶^5?¤2žt »Ó׌k½‹“ D©›™WiÀoôõ¯ÝÓúý]è,ÚE_/Z‡TmBóó~×°ôŽ“q£Pí`Òcï÷iƒ=Ô;FVÓ?ë˜ +šuGë bÇØú§žˆÇÖ€mþQÐÕ®µ+Æ‘äÓäP2ãõÜYúuF8{ta;†3rêˆÒ|Ϲ2Í®÷’­[7FG·ßSœ¦]àþÈÖ)Ú®æhc0ûÙäŒ9#ÛÔ§•æ:ÆÀÑ-k4t s°ýì™·˜Ò,âÛ-¬NsPÈy˜ì¦u—72áxº´Oj07ÿ¶¹íéXˇƒŒ—Ž¥eì¶Ëè8{0ruLË)a[ Öæ_5ýªo\郎ž×m&ܶ¾uºfv¢>gVæß[9wT`u–fp˜Š=F[šï¤lÿ<Ù¦= +—jÔº7FF–=€8EÛÆn²ß.ÌN­†$ Ô\àSƒÐ|×r²cÕöN‹µ¬Ü(®8T¦—ЩÕá+¯cwò£Î(tQÍ7„7†w^¸Iåf'¤ r(»’ÎðdCð\ÎñJ%ÇæìnHÿE¯eßÔ˜&dšø'Wo°òî­€^²¾¦Kϧoõ‹>ì œqo<.¹¨Á¯ñœ`éÿñ4¥¬Q-iõœÌ7ìÎáUšÓä+iù°æf¯ÊfÃÒÙ›`®âŠ)¨¬‘/1sk$N¬—ãkíóxdõûl½CÊ$ e"[þ”)oŒWFLUþ.›œ<}(ɲRÆìZ*ùò}_6VÞ›J/«ìÅñj:wJ‡—EOL”˜UÅe$HÇNf.ý`œ…ëø‹¾•G{Ó$ô¥2*åRø}€~ù?7þ:^Å¥^”„ºIsZnŸXö 9(È¥} > endobj +5186 0 obj << +/D [5184 0 R /XYZ 90 757.9346 null] +>> endobj +2486 0 obj << +/D [5184 0 R /XYZ 90 739.9346 null] +>> endobj +470 0 obj << +/D [5184 0 R /XYZ 90 739.9346 null] +>> endobj +5183 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5189 0 obj << +/Length 1221 +/Filter /FlateDecode +>> +stream +xÚÕYKoã6¾ûWèÅYÄ "%îžÒm»M°\Ô=eC–èX¨^•¥lS ÿ½¤DÙ–BÙ‘ røš™of¾ÑÄD”ÈâÐr¨8±™åÇ#hÝÉé/#¤—'r}²»áÇÙèâÌ-8ÃÌš-+ жfÁ͘ÄÎ&˜Âñw±ð£P$XÝή-ºR&«}ØvÔìèçÙF›6††”®¿G7·Ð +¤Q×#w©õ] @œc+Ù˜4ƒhôÇè÷œz¡:`ÂD1b–œq j@a‰Ñ©11‰¹Žý•—ŸM˜|[E¶^ ò(LÄ †ðöS…R:Œ›Ù´>éè“%bóÂt4+rãA×4ÉÙ‡±(2qC°ÑÖûþ3."Ó$®O(©XÖƒu‘—¾¶×ùºð +QO–a6/ülîeY5;/Œ +I½û)Xb¯^Mç—Óéç˯_» +¤4ß‹"“$Û4IkÕ’©ˆ]k$sÁv«>TK“ÍšLIÆú4ë?V­p@™¬ùÏÒ¸…çÿU«]–‰_„i¢ý·ò´ÃÂuýTPD ÷æiÜìØzw4 +¡eþ:›MkØŒc» ß ð +Og¥§­\ˆF[.|Þ‹ìQéPiö4lèlÕx±íå¸\ÝÚÛq‰Xº±qõâ¡ãè8 ÊHt£T®Åz»±± Ûn,¨_gImPÇ%Œ†Õo9ny;óª·'¦ÌSð%iñh¥³ bkz]uµr/m›ÏëašD:a–iÞñ¸ç¥mý°‡.9†®=Þ7DléHÑxÜÌSJÅ^ÒPC~EÖç;2!¹=œw«Ï6òRZ?p:ÂB„É1^tR%MüGeQ}"†äf¿í쨠9G-ór/îÚ}Y?²4”¬I¿´“†ÛíÛòu$`÷TÓ£FÛ†ëræ®Xéh-_ÎôC8.n™~¡¥ÀlKãºOºOàۅ(›W2#‘ƒVÍW¥š9€8˜>I·¢“z§”¾’"Ñ'\ˆÊ¦´e™©Iãø”N‡“7ßéìýsû„€Ÿ&‰Ø±Þ}zKƒàÿ¤ýº-ù½È÷$)§ÇÎÞoÄçéú¸ÏÊ{ÞÏûM(Ö« [ª¶Ùˆ 4΢]’n´HºYÛIqÿ¹Wei¸ìä!Àv$ê6z2Øü~’¢`‡ÊªŸÑÀÒ²û¬´XÙ:Ü«0ÔŒ™ 6¾Ÿ¢f Î GM5A·Ÿ£U¤eŒS”›f<‰¢½kŠ"üzÝ~m½Eš÷§º’²Áð"Óúf›…WÐ{® èÅkzÖš€öÔPK2–|ZIÀoµ$zkcœð›( +~”®7ÿþ™í$G±Û˜¾4K1{N–bgOw]Eø I±kœ5R—ÛprZN†óá* ‹Ð‹ÂÅS~±¦{0íïä ¥®Ø(;銬ºØså o÷^î·¹ÓF(H_D"r¯Êku·§( ž¿5/×gˆŽK=}Eý„1ù¨ +ªaõÍàò Ó±úqU Ê«©Þ ôFEõü)ýçá®þ1x×=êþÎàŸÿ>¸*endstream +endobj +5188 0 obj << +/Type /Page +/Contents 5189 0 R +/Resources 5187 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5191 0 R +>> endobj +5190 0 obj << +/D [5188 0 R /XYZ 90 757.9346 null] +>> endobj +5187 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5194 0 obj << +/Length 1641 +/Filter /FlateDecode +>> +stream +xÚµZ[›8~ϯàq¦šPÛ€ÁݧÝîlw*Uíj#õ¡­*'x«\²@&Í¿_lœ@Rå!ÆÆö¹~>ç`hñƒ–ïù6q\l­â°Ö¢ûÝ ªá¹Ÿ¿ðÇböú/D,bŒ°µx.WÀÐöDÖ"ür‡Üà~Ž|àƒ»ÝÓ'ÑôÀ´AÕxüIãm·?ÓÕ.fIA ž&÷ßïg‹zgE˜ç`(÷ýoöå°BAàû°xÖ^<‚¬xæ"G?D³gÿÔëTå„>þ<èô1ˆ-Ñã¨D‚_¿â:ޤÕBŽM p­9«»A9öªqm?@ÖQ÷ë²{Ž$fÛÅ®§Vsï瀻—”‡UkÏ–«ˆ ¹|ç /¾È1ñ+×¼Þ^\-öz˜ÖWŠ*=Ø_M÷ÏðHl»ð˜É[–T{Rõÿ÷bñ©j­Ò$a«RÍås‘ª7kŽ«Fβ–éU”äè9_'4Ò@Qžð:Ü«C@­ªŒmÜÖœÑc­›XôÊšä|s§EÿLòÞ-ÍhÜuÂß•£¦<)´;¹V^dµäÊ#Z$™ú™qiZ×îcž +¨ v1ËøJ[Á“~†Bµyۃô¨OP$ +±ž%@6Þ+ášÙk[$Ȇ8°qP¢¸I›MÓ¦s­6¥mW­:Hlº„Œ–]Åî7|µéE«‡¶Ð].;‚B£Üirð®•C“ñ™¬º#ó<9ÍxøÖ¬0òŒ§ñìOâ9cÅ‹6_0‚ö¹¡)ø~Nwbyrr,ˆñáW˜špåÒ‹·Ñ›1q±Ba”ð4¨õÁÕ +‚ +ê2¸§5bñ‚ŸãLJ·,)úH‰ai'{dñ¶8´Á8I‡ÕXãq•<k5G5o£½[ºg€; é:6p‚Ë0³ñØÇLr}êˆs×·üζ~¯?×ù#¹?Ê£À×ÝÀÉ´:Ó+¾ýL~­iÕÎNÌ_˜I²¾ÔŠL@Ó?ÝÔTu*'!]“æ×ŒkìùÂf|Íëj@ýmG ÄÀËx€¬q!¦¡žÈ‚¥*iTh×ÿN÷öÔ-ҥζ ,¸Óë^-Ðff´þiß;þ¥çÐüø·DdÜ‘5á—"2!}W!  ]¿÷Šâé6¾ê–DyÏ#S ƒŽ¯yˆtÀwy ÂAb¢‹QMŠ$öKXFËÓT^è> ÿ?èÆû{è‰4D]Aê¼AΤn„ pÕz¾GžLHˇӫ#äª[#?kvr_D^äè‘Òÿí¨‰endstream +endobj +5193 0 obj << +/Type /Page +/Contents 5194 0 R +/Resources 5192 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5191 0 R +>> endobj +5195 0 obj << +/D [5193 0 R /XYZ 90 757.9346 null] +>> endobj +5192 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5198 0 obj << +/Length 885 +/Filter /FlateDecode +>> +stream +xÚ½W[OÛ0~ϯˆ´—­Æ·8 {ÙØ:Ú…i‘ö¨J·‰DHSûï³c'4! ½À„ïÇßw|ΗdCù‡lÚ®ãŸPfOæ´grúÄBfy ׫Žëð3ömø 3;˜FØ¢‹žë°{÷|<¹N¸ÈAÜ¿ +Îl +=& «}˜újÖÕmŒCRwÝZWÐŽ$¨3 â{Ž}/ ßÇöÜ¢˜”ƒkë—õ³²£ŠmœDÚH1[蕤°äèjNÂþ€AØ;,ˆ`|©=@òê[Š¥Aµ&¹2ß5ÇÑúsÅŠF‘½2ÿcœ‡‰Ð·æ1×8]ä"œ›Q:m,O–Y&Ý­_‚à\÷¢0uo‘g<œ”@]êÈ7”ÉV#ÅÏ ]ClM0Ø”Œ"žgw<«ï +E“lÆo—|a|0tg\z(ÅŒG] [3?tC~[b¨äŒOÓÌi^G[\Tî 折¯Ggk:i–Ì^kó'àű÷%Žy•¤“<®èë¼Íx~ (ÿÐkAœ˜“Ó¥˜äI*ºÀ³­Á—Ö— n¼-ýkb¦È¨D̺²¦ ÆÎqwËok6—ˆÐŒçË̼õÝܤ‰ÈËTÈÓ½ùøÏ£Àõð*®CCÓÌÇ´n Á*Õ2}šH<¶Înðcè”ÀUüÜ¥I¤bè¾–ºÀ“иVK,lÌâ½t‘—Ñí›43ï!–óqSÄ^R¿Ý)6‘³»~w“ÛU¡õd›²vß^/þ—BkŸrdìéúÚ-<ÂäHfq1’Å›)H§}ìôÔÏA5Xžž›ÝÀlT_Õ~Jÿ≮hºG•-þù6¶´rendstream +endobj +5197 0 obj << +/Type /Page +/Contents 5198 0 R +/Resources 5196 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5191 0 R +>> endobj +5199 0 obj << +/D [5197 0 R /XYZ 90 757.9346 null] +>> endobj +5196 0 obj << +/Font << /F29 499 0 R /F26 485 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5202 0 obj << +/Length 3602 +/Filter /FlateDecode +>> +stream +xÚ\Ûn7}÷WèQLš÷Ë£/ZG»ŽbØ +²ÀîBGcKXÝ0'›¿ßb“Íf“Õ͉ N¢SuXgŠE§~Äà/~äÙ‘Õ–z©ÌÑæþ;úÿùý ž~¬„„?‘ðÂú3pJ¬ôÙ뛋¯þ&ü‘PÔ:Ë.¾^c%eJŠ£‹ëŸ=\oÿwòŸ‹¿¿8½ÈŽH 곋<% òÈ#`6ÂŒ4BÀB„h^?=ÝÝn®ö·Ï/k:®4uÞÛÉd ?Ú}K˜O}ƓҠ]Dë7,Eš†_΀霿 +:£:¬!tΨg:ò]===¿ºÙÞÝ=’?N8;~ÜÝ]×ÿN7(‚;ªŒq“³uQ2ž”íòZ¿a‘\ÙfRRÅY½€J•ŒêЂ*Ú;ê¬û ªÜ ªxÊ„r“³ž* OJL•ÚoTÅaªxãlµD•Õ¡ ª8Cæ…*»íóãÝï飑ìà°‡­Ò“ugÇ$8)ñȆ©½F|Ãî5ÎùоÞ0#ªÃD° +ЉZáAQÉ ¾eóž + OJL†Ú歞 +eê4:$T‡6è`µÞúI‡çûýÓð7, Œ¢JA}ËføG<) ø¿1~Ù~žJ/ëÔñ¨mˆ_3j-CãG>£)cÖNf½øž”Xüµß¿Ââ÷š›jHüªCâ—6 ,âßoï¶ûëWÏ¡6¢…€S#ÁA6íí„'¥¶j¿Qƒöð„½­­©Ðì„êÐ „¡–›E °: (÷ÌL¦= ž”˜µß¨m5°”ËP8g h4H¨mЀ+(Ñ ý‰fB¸øq5÷THxR`*Ô~£ +ÍÑÈ=T7«ëÔ*Œ¨mP jŒ\IǨr^eÛŽ#œxD‚ÚkT =½¦JÊŠ½ Ö9!~åìA3ÅÿÇöËæîvû°Ÿþ »92I¡„ólß¹"pRà‘RíuÐÀ0ìÞ +÷Áн¾ uΠ…KDy `Ü X!x¶ïk0ÀIÇ5˜yLcLÅŽh0€Ö9ƒЧ3 ž·»ßO¸>Þî^Ýì÷O×dóíÍA•†ÖoôÑÓ!ÁIÇt¨¼FT«ƒ¥ŠñнÑ!Ö9ƒZQ­u_<Üà²~> pRàñ|˜y:hL¯ýœ‘!`Öƒ +JP-`ï¬É€p{…7;èÕÆ„'¥Vk¿QÓ~D_/ ÖaDuhƒ’Q2gxaØmnn÷ÛÍþûn{B„fÇÏOÛÍí¿›øïßÏ>Æøúýaƒ¿D„¾M{ï&×<ñ¤4@¥ñ–lÛ £g„®øk‰FT‡5HÄ,…³;VëÍÝãæ¿*ê…IÚ^;ýôòöávߦ¤¤Õp{“pv g{GJÆ“ÒIÆoXˆWX£c¹}°Ž¨+KÑK'©0¬çr{¿EÂ÷š× ï? I ÇBŸû\ +P +,æÜMà Õá„|p­‡dŒŸøÛ!†-qû°ß‡—« &€4&›÷$HxR`"Ô~—dÐÔ;%+þF†„ê°@}ÁLøë{£•E¸Bå“ +nöÐØödñ¤4@diü.È¢§ @ÎùkYFT‡5È"5åzV†øaY\…þ ²k²Œ°ž,3þeYVYƒ,œSæ]Ú4áLùö}7¼fÇíóø4œ'éxyÜåyÀá$“ÓÞf“Ò{À¬ý'LÓ¢8Ã}Å_Ÿ0#ªÃ +â@¥ž‹Ø]ßlž6—Ïû«=RDà8g\©É¢÷ÊŸð¤4À^ùk¿ÃýCH¬Šyídµ€æ™?¡:´!t«©s:¾;ÿ?õôd9\Æ< …)›ö4ˆpRâ1 *¯ƒLcçh¸PÍÙ‘c4€:œ!~ ý«Ooå?…·û—Q‚ü‚~Õ#”P“mÿ«žOJü«ž¹ßAÞ&apîBÓ=_@£ABuhƒ +X›Þʇ/0.søK;úa%Ÿl{ï– OJìݲöwB[!œÜVüÍsUuHƒúW•žÉº8áîøØ K§Æ÷Û§ NÅŽ7qôYÊN¨•†~гö€'¥þ¬=÷Vƒ¼hZdtóª›PÖ ƒŽÎ§ç‚›}8(V´iõ– %î¶P•ûO¼#ž”ˆß°Ó¾nJÀA…­øk=FTu¼}‡G5-Ó£êÁ9‘­͉Ò`%'f«i_µò§=ç_̉uVÈ ntn~Ì hÙsâ§‹‹ï.ß¾?»|ûúÃäij•4z8ß”“ݧ'{Ú¨¼ÆRÂÛûŒ¦Ì±Š½yÛH uÎ)5”¢J›I›¥¶TRc˜Íø^W’à¤ÀcMIåu!òð ¦*öæ I uÎRP%<ò‰/&Æ rýÖT:o`3ª˜èÞ¾œxìò]y]RE3¸ŠH=goîX ´ÎTaŽJ«‹LØ|»½Ü\ÝÝ!ÙÀ¡ý3.Ûô²!ÁIDz¡òãÖØ™î%«Ø›lH uNˆÛ*Ó:m€šS2Nõ-øÞ$²å”6&3f>+ƒg˜M\øóÀyŒïLδ~’L‚ŽŽC(«;Õ£e¡&q9Ÿˆ‰²ã8©¡OvæŒðΈLã5FßÜO¤ ¥Y¬Ï匠细fÇrëüÝí—W÷Ûû/á~E7ïþÌRÆ“ÒY_ãwQØ`ÖÖ hdI¨íxl*hzä8*d¹„;Ê#R;¡10á­>tâñ¤4@Òø]Šßkª©PÇ?¢z´9~à—Pºsø_w[äà ²j+3¼ü'YDíu1tN-ã{yu8sàp×|*x«"¡3Ôפ Þ <ÁIǯ¼ÆÀU›t>4›{øêpŽ…@ …¨Ê÷¬‘ +š#aäÁ%²À¯TÈÕ+3öÅú¸Î™U6N¤é˜A–/á;äÄ4–ÊøMo4è•Á'«‚•×x…l/P653jÎÞ$Du8sèÐË æù¼ühF@ƒÄà‡§Da°–#¬›³,gÅ:í¨„Þ‹kÍçeⵑNQÞà˜´) V´É°¥22F=_À¢6Ú¬M³g"~ÞÞ?îþŒwÎ/Ó÷Ó÷WWß¶÷Û‡}o„CÁí– '·ë*e<) Úå¶~£JÍðW˜æ’ðYW ¨¯£#ªC;©¤õã$ÇÇÝãþñ9¨ÃÙñvŸ¾x„–ewµûó%vîI)øä£w=OxR`÷óÚïpA×í‡ssAO¨kVDBï¬Ùßì¶W×Ïø¥S@7œM¸t<) .3¿a)íW­ƒ|ÎlœÕcÍE]x© ¬OÏØwñp#†ÛŒ.°ÈG<) 54~ãIÓ¶©ÊýÔ× ¨CQ=ÚñÖ%¡Xºq`äãç_ÞþãòÍéû³s$÷‡\“E/÷ž”Xî×~‡Ü7mî‡ßÿ1¾âor?¡z¬9~èfÝ8Àãûá—ϧ/±æ˜É ß)†MJ8R ++ŸCä¶e Úœ»‰<¡:œ9rèá¡3óMä—§ÿ<»hÃßqɬ#Àˆ'¥"AãwA„ð­˜v®â¯EQÖI„¡ãI¤Q„wá¡êõ çüøâÄËã×NÛÝ ¸¤,”Žì #Lj'¥"GãwA1üꩯøÛ_q¨ë$G˜üº”ãôüÒ{»ð‹8vÂ÷zï„'¥Ö{×~ñèSÍÓ€&T5G_Ž<¤è±½ŽknäÁ³ß‚hýá;ìÀ…YŸ¼A=Î|9êƒz~úiÜ aáÓåg,”vTsfÃÈøÎDDëwAh³•…ÛÃêFFuX'EÊiŒ¨ÈÙ9–µÃ¯åeƒþnˆ¿ÆWà»aî?ä9´ªâGvÃ€ê±æðËáŽþùéoMuDJ£e;wèÔIÆwæ?Z¿ƒ¾-€3\­OdT‡u’£œ=‰r|:}ýîMh~ý¢Bøí¬P¢F»ž + OJL…Úï’ +€ ssþF…„ê°ff.“ +±<¼ÄîlÆ[sèÀMÆwF_Z¿ " ¿ÄÄúÀMFuX'Ê—(Z¥WTMœµÉøÎÔKëw!|&%ÂÁÚ¬MFõXsøåÄÍþåç‹OÈ6°á—TõdÔÛ OJlÔ~ã#Bû–„ÓÏÙzͽ1¡:´“Å0O”à·. 2ž]\þz~qö¹@;Ê•2Neøú¤OãuIî•n}º(ƒÖ9sÛ\Îõ­ãâcÜBg­5à3îôãœxì-®òŠw•Ò„²—‚y3ÿ@ʬK1Ù3Ä|ùårãûW$vA­±‡Žeøú¸Oã5>)xìéÜr¾>b”AÎ|1ÞSt•?šåPÎ9±:™Sù\è-Æ»šÆðì˜BSÁ˜:èÿ<ôd]Çendstream +endobj +5201 0 obj << +/Type /Page +/Contents 5202 0 R +/Resources 5200 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5191 0 R +/Annots [ 5204 0 R 5205 0 R 5206 0 R 5207 0 R 5208 0 R 5209 0 R 5210 0 R 5211 0 R 5212 0 R 5213 0 R 5214 0 R 5215 0 R 5216 0 R 5217 0 R 5218 0 R 5219 0 R 5220 0 R 5221 0 R 5222 0 R 5223 0 R 5224 0 R 5225 0 R 5226 0 R 5227 0 R 5228 0 R 5229 0 R 5230 0 R 5231 0 R 5232 0 R 5233 0 R 5234 0 R 5235 0 R 5236 0 R 5237 0 R 5238 0 R 5239 0 R 5240 0 R 5241 0 R 5242 0 R 5243 0 R 5244 0 R 5245 0 R 5246 0 R 5247 0 R 5248 0 R 5249 0 R 5250 0 R 5251 0 R 5252 0 R 5253 0 R 5254 0 R 5255 0 R 5256 0 R 5257 0 R 5258 0 R 5259 0 R 5260 0 R 5261 0 R 5262 0 R 5263 0 R 5264 0 R 5265 0 R 5266 0 R 5267 0 R 5268 0 R 5269 0 R 5270 0 R 5271 0 R 5272 0 R ] +>> endobj +5204 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.9034 619.7797 156.8586 630.6836] +/Subtype /Link +/A << /S /GoTo /D (page.36) >> +>> endobj +5205 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [217.4706 607.7527 234.407 618.6566] +/Subtype /Link +/A << /S /GoTo /D (page.147) >> +>> endobj +5206 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [218.0285 595.7257 234.965 606.6296] +/Subtype /Link +/A << /S /GoTo /D (page.148) >> +>> endobj +5207 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [172.7487 583.6987 189.6852 594.6027] +/Subtype /Link +/A << /S /GoTo /D (page.149) >> +>> endobj +5208 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.3067 571.6718 190.2432 582.5757] +/Subtype /Link +/A << /S /GoTo /D (page.151) >> +>> endobj +5209 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.4535 559.6448 180.3899 570.5487] +/Subtype /Link +/A << /S /GoTo /D (page.153) >> +>> endobj +5210 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.0114 547.6178 180.9479 558.5217] +/Subtype /Link +/A << /S /GoTo /D (page.154) >> +>> endobj +5211 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.6363 535.5908 187.5728 546.4947] +/Subtype /Link +/A << /S /GoTo /D (page.156) >> +>> endobj +5212 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.1943 523.5638 188.1308 534.4678] +/Subtype /Link +/A << /S /GoTo /D (page.157) >> +>> endobj +5213 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.9352 511.5368 195.8717 522.4408] +/Subtype /Link +/A << /S /GoTo /D (page.158) >> +>> endobj +5214 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.4931 499.5099 196.4296 510.4138] +/Subtype /Link +/A << /S /GoTo /D (page.159) >> +>> endobj +5215 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.1679 487.4829 219.1044 498.3868] +/Subtype /Link +/A << /S /GoTo /D (page.160) >> +>> endobj +5216 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.7258 475.4559 219.6623 486.3598] +/Subtype /Link +/A << /S /GoTo /D (page.162) >> +>> endobj +5217 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.4608 463.4289 218.3973 474.3329] +/Subtype /Link +/A << /S /GoTo /D (page.164) >> +>> endobj +5218 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.0188 451.402 218.9553 462.3059] +/Subtype /Link +/A << /S /GoTo /D (page.165) >> +>> endobj +5219 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [185.9692 439.375 202.9056 450.2789] +/Subtype /Link +/A << /S /GoTo /D (page.166) >> +>> endobj +5220 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [232.6036 427.348 244.5587 438.2519] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +5221 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.7603 392.8518 165.7155 403.0385] +/Subtype /Link +/A << /S /GoTo /D (page.94) >> +>> endobj +5222 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.1837 380.8248 170.1389 391.0115] +/Subtype /Link +/A << /S /GoTo /D (page.94) >> +>> endobj +5223 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.0254 368.7978 166.9805 378.9845] +/Subtype /Link +/A << /S /GoTo /D (page.94) >> +>> endobj +5224 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.4892 344.7439 147.4444 354.9305] +/Subtype /Link +/A << /S /GoTo /D (page.94) >> +>> endobj +5225 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.4892 320.6899 147.4444 330.8766] +/Subtype /Link +/A << /S /GoTo /D (page.94) >> +>> endobj +5226 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [211.603 307.9457 223.5582 318.8496] +/Subtype /Link +/A << /S /GoTo /D (page.79) >> +>> endobj +5227 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [141.0181 284.7592 157.9546 295.6631] +/Subtype /Link +/A << /S /GoTo /D (page.123) >> +>> endobj +5228 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [148.3408 273.4495 165.2773 283.6361] +/Subtype /Link +/A << /S /GoTo /D (page.105) >> +>> endobj +5229 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.2461 250.263 161.1826 260.4496] +/Subtype /Link +/A << /S /GoTo /D (page.113) >> +>> endobj +5230 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [165.2768 238.236 182.2133 248.4227] +/Subtype /Link +/A << /S /GoTo /D (page.124) >> +>> endobj +5231 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.3149 213.4648 175.27 224.3687] +/Subtype /Link +/A << /S /GoTo /D (page.56) >> +>> endobj +5232 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.6425 189.4108 138.5976 200.3147] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +5233 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.3149 177.3838 175.27 188.2878] +/Subtype /Link +/A << /S /GoTo /D (page.60) >> +>> endobj +5234 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.1403 154.0471 216.0768 164.2338] +/Subtype /Link +/A << /S /GoTo /D (page.121) >> +>> endobj +5235 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.6645 141.3029 169.601 152.2068] +/Subtype /Link +/A << /S /GoTo /D (page.121) >> +>> endobj +5236 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.3933 117.2489 151.3298 128.1528] +/Subtype /Link +/A << /S /GoTo /D (page.121) >> +>> endobj +5237 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.9906 105.2219 167.9271 116.1259] +/Subtype /Link +/A << /S /GoTo /D (page.125) >> +>> endobj +5238 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [350.8746 619.7797 367.8111 630.6836] +/Subtype /Link +/A << /S /GoTo /D (page.121) >> +>> endobj +5239 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.1917 607.7527 371.1282 618.6566] +/Subtype /Link +/A << /S /GoTo /D (page.126) >> +>> endobj +5240 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.1781 585.2835 372.1146 595.4701] +/Subtype /Link +/A << /S /GoTo /D (page.167) >> +>> endobj +5241 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.7361 573.2565 372.6726 583.4432] +/Subtype /Link +/A << /S /GoTo /D (page.168) >> +>> endobj +5242 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.3297 561.2295 401.2849 571.4162] +/Subtype /Link +/A << /S /GoTo /D (page.90) >> +>> endobj +5243 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.298 526.0161 372.2345 536.2027] +/Subtype /Link +/A << /S /GoTo /D (page.103) >> +>> endobj +5244 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [360.8372 501.9621 377.7737 512.1488] +/Subtype /Link +/A << /S /GoTo /D (page.103) >> +>> endobj +5245 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.6463 489.9351 396.5828 500.1218] +/Subtype /Link +/A << /S /GoTo /D (page.103) >> +>> endobj +5246 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.761 477.9081 392.6975 488.0948] +/Subtype /Link +/A << /S /GoTo /D (page.103) >> +>> endobj +5247 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.5691 465.8812 390.5056 476.0678] +/Subtype /Link +/A << /S /GoTo /D (page.104) >> +>> endobj +5248 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.298 441.8272 372.2345 452.0139] +/Subtype /Link +/A << /S /GoTo /D (page.103) >> +>> endobj +5249 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.3662 429.8002 383.3027 439.9869] +/Subtype /Link +/A << /S /GoTo /D (page.127) >> +>> endobj +5250 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.298 405.7463 372.2345 415.9329] +/Subtype /Link +/A << /S /GoTo /D (page.103) >> +>> endobj +5251 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.298 381.6923 372.2345 391.8789] +/Subtype /Link +/A << /S /GoTo /D (page.104) >> +>> endobj +5252 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [462.3752 368.948 479.3117 379.852] +/Subtype /Link +/A << /S /GoTo /D (page.102) >> +>> endobj +5253 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.3358 345.7615 402.291 356.6655] +/Subtype /Link +/A << /S /GoTo /D (page.95) >> +>> endobj +5254 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [360.8269 334.4518 372.7821 344.6385] +/Subtype /Link +/A << /S /GoTo /D (page.27) >> +>> endobj +5255 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [333.709 321.7076 350.6455 332.6115] +/Subtype /Link +/A << /S /GoTo /D (page.128) >> +>> endobj +5256 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [397.918 310.3979 409.8731 320.5845] +/Subtype /Link +/A << /S /GoTo /D (page.96) >> +>> endobj +5257 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.0338 298.3709 410.9889 308.5576] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +5258 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [426.6999 286.3439 438.6551 296.5306] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +5259 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.085 274.3169 424.0402 284.5036] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +5260 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [387.9554 262.29 399.9106 272.4766] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +5261 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.1671 250.263 402.1223 260.4496] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +5262 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [457.5143 238.236 469.4695 248.4227] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +5263 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [387.3975 226.209 399.3526 236.3957] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +5264 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [415.4025 214.182 427.3577 224.3687] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +5265 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.878 202.1551 425.8332 212.3417] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +5266 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [407.7013 190.1281 419.6565 200.3147] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +5267 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.4946 178.1011 405.4498 188.2878] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +5268 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [416.7473 166.0741 433.6837 176.2608] +/Subtype /Link +/A << /S /GoTo /D (page.100) >> +>> endobj +5269 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [427.1483 154.0471 444.0848 164.2338] +/Subtype /Link +/A << /S /GoTo /D (page.100) >> +>> endobj +5270 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.6343 129.2759 365.5895 140.1798] +/Subtype /Link +/A << /S /GoTo /D (page.96) >> +>> endobj +5271 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.7713 117.2489 368.7078 128.1528] +/Subtype /Link +/A << /S /GoTo /D (page.129) >> +>> endobj +5272 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.6343 93.195 365.5895 104.0989] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +5203 0 obj << +/D [5201 0 R /XYZ 90 757.9346 null] +>> endobj +5200 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5275 0 obj << +/Length 3125 +/Filter /FlateDecode +>> +stream +xÚ¥œÙr9†ïýuiGíKß®3´aì"艞C´±Ý^z†·Ÿ£Ì”J»’rpaìú~¯´UÚd…áY¼RB!ø\}üv€W_àÇ/Èüò¯¡àÙæào?S³2ÈH*W›Ïc ’ A ]m>ývxrz¼þõè÷Í«Ça!¡!ûs*ˆýéÁzã[ŸÍ“ĶýçÁo¿ãÕ'èÄ«Œ˜Ñbõ_ø#b ]};à”¹o.ÎþáÛ™^J9ÂJI°$ +ߪ)‡·çožÿýâùë7çë‹õ¯'›1¯SM‚Œ“òæîúãOÒÄÓˆpÃVŠ"õÔ/ûÒí—YsôÐë‡0 ïfÞ®íƒQ™?!&ñO¸xUÇÕÂÁaId@çøˆãçGÐÀáæÈ°Ã§¯×§{s’†#‚¥XÌ) hpò²§Ø¿Ê©í +œ¤¦ˆØñ¶ã´>=Þ‹²ã}š˰-,NÖÃù×±4]-¡娄X*ÓŠ,âÂ%¢Z,ŸVa@‹‹“\tKä_çÒtµ\GŒápZ½XŸ®ÏÜ´"úðÍÙÅù£†¥ˆ)Á—£ +Z¨œ¬‡*ò¯£jºZT#Nq8³NN±2 £—bùÔ +\¼¬Ã%ö¯ri»¡%Ø„Sëtý>[œ÷žjBq$_>Õ€''9™:§È¿Î©éj9IŠ„1áT;[?=~vDðở÷F#Éùòé´ð8YOä_ÇÓtµxÀXjÃ<Ó´?*‘bü&YТãd=:‘NÓÕÒ!)¥ÃIö¨EY`Š4e?0©‚€'ëq‰üë\š®À…Œ´Ô2árq¾9Û› W–Ϩ0 ÁÆËlÆYCØ0št …ãT[ GJHZ‡Sêý¡°.Ÿl.ÞnN^ïÏH„1[>¯Â€#'ë2Š:PgÔ´µŒ8H¹š&ÖÍ}ž1Œ@Å(Ù ;;ý2ÎÚ3fyÆD! õmÒ4c§êÚÎo6gÑi¢¾Ý\<[¿89ͳ‡ºÚpØÛ½¼“½Óa@¡Y»¶,«Ï‰¡"ñO“wªž«O†ŸÎägG0ÀQ–*¦v N?„…eíV0hÐ1ÉÿƒSõ\=X&‘Æa8þr}üîõ:ÏÚƒã¨ÙEtòwú! (ô$kwÌŸeþt˜ˆÄ?Íß©z®>a³sÆåÿöÈP(Ì >|_Zú¡žQ˜îÂzKÿ¬€ÒÒŸ¶[`ë)KyìŸ-ý³ªçê!p…8–~éß¼´UÆ“êÆãõ½)à¶ 0 4Òv+Ùk‚´‚³XìŸMYÕsõÙ38Ô.ûÝq°Âb‚ÆjÙæàõC÷(o·Ì™TJ8ãÆþ ¯ê¸î8P†8ü4ç0‹óá`l28ì §€B‡²vG ¼ô6ØAÿƒSõ\=à&8!9†÷/OJ #,9Ì@aæ{fý”0¤íÖ0€Np™øgfUÏÕa Æ ¡…ßþy²~}ü¤º9{yÿ,i€/ë‰ý«DÚ®@öp„§• +kO8R#¬Ìò ´à8YNä_‡Ótµp„D¦YZwíI…ÛÊ_/ŸDa@‹Š“UäžJä_§ÒtµT@ +»”(Vcû­¸pxƒmTÿÀl +Zhœ¬‡&ò¯£iºZ4X#†k´ý† œ,Xÿ³COd'oð˜E¡sÌÂέŒo‚W3b Žó¢Ý%G® ‹ŸÊ뺄EöÞ ‚Ž1{™#WŒ{͡@_èiÚj™ã ÃP¿Eæ)'êXz8XÀ~EI¥ÚÛ Ž„’ÅPEÓ x¼¬\øÔcÿ* Ž«#$õx-A+…à~„$¬L÷5 ´9YPä_'Ôvõ„œ5eQ™TàÂM ‡ó•Tl9˜  ÆÉz`"ÿ:˜¶«Ãw*õã~Ƥ™Ëé-:NV.-wt"ÿ:¶«£cŸžÑ’MGåÛíÝõå_õA3½~ññúêsÎGiK·Ñ¼{þñú! (ô4kwúäUf°w4ö9 ¸) §êÙR9ÝWÚÇf4c*ðùúáêSN@ÃR&¡rõ!N?„…®díV hd0O;˜U=[O@R(@µ |ÙÞßmoÿ:"âp{›“0 +aÍ.´CÂé‡0 Ð¥¬Ý + nG-…CIÜ„„Wõl= ‘Æ,"qy}ýÇÃMa0ÀÑ[Ó ³~Jƒ!m·†À^22•v EàT=[€i¤´ŽÖƒ?¶·ß‹ÓÞ]H:Œú! (O‡¸Ý‰€*MÆeÚÂtU=[¿bÚG¡ËVÄÞ²™)ûùàøìT÷ºÖˇ@_ègÚjm±PIiìžÂq¢Ž§gcáóSgábYÝi{lìóSP;Åp€/ëá‰;PåÓ±u€ì#QŠÌ÷0¥µtPR"iñc1¨  Êɺ ¢ÔAµm=(Á!€³|©ÝŸ‡Âêå„‚€!'ëŠ:P'Ô¶õ„ˆùù×p%Þ!âD#ÉŒXN(hr²ÚJí E¨jÛ:Böé)çOîþ³½¼¼øzõõ¾Îç~{yµ½/œì„F =î=Rt?Vòú! (JÛ’‚=•t 4«z¶"Àq¾ëp€nEH{»¤— +Z„œ¬K(ê@PÛÖâ +I<ÿºËDèúáþ‘ˆ˜@Â`³QÐBäd]DQêˆÚ¶eH¸ƒÆ„èæöúÛÍ£ÙÏÅ%YNh§ošUZçº×ñ4=ñCn>›Ntîî?ÜÞWw±.û™±`d9œ0 AÇËzxâTùtl= £ŒÌ–Ü}»¯ïïöE{ÒþÆôËÃíöIñ@Á³Ÿ! Lºg!§€RÙ™¶;íc&¯¹ – :í@Vsͪž­«¹ì'Þ\K¶£ðéúª>$„úÞ Ì¬Â€Ò LÚn%}g` KAÒ¬àšU=[Ÿ>3ˆ+¤·-]¿(Ž0V¾—þ¬€Rúi»µô¡470”“¤é;UÏÖOªr:çÿ²y{àðázøöáëåôË£x SKÃÔòMôæÃ¬€Ò|HÛˆèüÀÓd×0³ªgë‰kÌüH^º*Ôw«,,«P·I;·1,\TöϾ³~JËjÚnmÔH8$cv 5NÕ³uŒìœÌ¿Žî׌æÚZgC”AÌtŸ1ݱ l¼¬Ç&î@•MÇÖ³‘ +1=?Øë”}Ù@‘äTËÙ-6NÖeu Î¦mëÙpûl"Ñ›û÷…Íês¬éNßK’¡¾”}Òêô;GùQV„!$vÏrŸD=OŸ:ŰÍÏ¿è´9Røp<й%¶~Ûm/í†o ÃÂé‡0 Ð±¬Ýéd†óO!ÍYÚìd6«z¶ž‡=§Ì»ý|*m,®¾¼.ðѰÏi²ìQ¯n?W´Y+yì]1¥­gjf ¼Ïˆâòм‰½JxÌaÿTŒ†Âhø—b$2Ê^äOGÄ>"=ÿÒÕ‹íÕöfß§i ^_M_qÿyeGäÃü œØ§¯ø'Ê~¢xú’Óÿ>Qqx};}óp2#š…ÿþ>}=¾þß÷/Û«”¤ý‹®kŸÿ‚øLendstream +endobj +5274 0 obj << +/Type /Page +/Contents 5275 0 R +/Resources 5273 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5191 0 R +/Annots [ 5277 0 R 5278 0 R 5279 0 R 5280 0 R 5281 0 R 5282 0 R 5283 0 R 5284 0 R 5285 0 R 5286 0 R 5287 0 R 5288 0 R 5289 0 R 5290 0 R 5291 0 R 5292 0 R 5293 0 R 5294 0 R 5295 0 R 5296 0 R 5297 0 R 5298 0 R 5299 0 R 5300 0 R 5301 0 R 5302 0 R 5303 0 R 5304 0 R 5305 0 R 5306 0 R 5307 0 R 5308 0 R 5309 0 R 5310 0 R 5311 0 R 5312 0 R 5313 0 R 5314 0 R 5315 0 R 5316 0 R 5317 0 R 5318 0 R 5319 0 R 5320 0 R 5321 0 R 5322 0 R 5323 0 R 5324 0 R 5325 0 R 5326 0 R 5327 0 R 5328 0 R 5329 0 R 5330 0 R 5331 0 R 5332 0 R 5333 0 R 5334 0 R 5335 0 R 5336 0 R 5337 0 R 5338 0 R 5339 0 R 5340 0 R ] +>> endobj +5277 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.153 714.8637 149.1082 725.7676] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +5278 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.153 690.9534 149.1082 701.8573] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +5279 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.153 667.043 149.1082 677.947] +/Subtype /Link +/A << /S /GoTo /D (page.97) >> +>> endobj +5280 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.153 643.1327 149.1082 654.0366] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +5281 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.153 619.2223 149.1082 630.1263] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +5282 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.153 595.312 149.1082 606.2159] +/Subtype /Link +/A << /S /GoTo /D (page.98) >> +>> endobj +5283 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.153 571.4017 149.1082 582.3056] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +5284 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.153 547.4913 149.1082 558.3953] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +5285 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.153 523.581 149.1082 534.4849] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +5286 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.153 499.6707 149.1082 510.5746] +/Subtype /Link +/A << /S /GoTo /D (page.99) >> +>> endobj +5287 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.153 475.7603 154.0895 486.6643] +/Subtype /Link +/A << /S /GoTo /D (page.100) >> +>> endobj +5288 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [137.153 451.85 154.0895 462.7539] +/Subtype /Link +/A << /S /GoTo /D (page.100) >> +>> endobj +5289 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [101.7359 439.8948 118.6724 450.7988] +/Subtype /Link +/A << /S /GoTo /D (page.130) >> +>> endobj +5290 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.9536 428.6569 172.9088 438.8436] +/Subtype /Link +/A << /S /GoTo /D (page.31) >> +>> endobj +5291 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.9911 416.7018 162.9463 426.8884] +/Subtype /Link +/A << /S /GoTo /D (page.31) >> +>> endobj +5292 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.2028 404.7466 165.158 414.9333] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +5293 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.4332 392.7914 162.3883 402.9781] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +5294 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [173.2774 380.8363 185.2326 391.0229] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +5295 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [182.5426 368.8811 194.4978 379.0678] +/Subtype /Link +/A << /S /GoTo /D (page.33) >> +>> endobj +5296 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.5739 356.9259 175.5291 367.1126] +/Subtype /Link +/A << /S /GoTo /D (page.33) >> +>> endobj +5297 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.9163 344.9708 182.8715 355.1574] +/Subtype /Link +/A << /S /GoTo /D (page.33) >> +>> endobj +5298 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.7045 333.0156 212.6596 343.2022] +/Subtype /Link +/A << /S /GoTo /D (page.33) >> +>> endobj +5299 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [190.184 321.0604 202.1392 331.2471] +/Subtype /Link +/A << /S /GoTo /D (page.34) >> +>> endobj +5300 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.3957 309.1053 204.3508 319.2919] +/Subtype /Link +/A << /S /GoTo /D (page.34) >> +>> endobj +5301 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [160.3958 297.1501 172.351 307.3367] +/Subtype /Link +/A << /S /GoTo /D (page.34) >> +>> endobj +5302 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [195.2549 285.1949 207.2101 295.3816] +/Subtype /Link +/A << /S /GoTo /D (page.35) >> +>> endobj +5303 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.6612 260.5673 133.6163 271.4712] +/Subtype /Link +/A << /S /GoTo /D (page.31) >> +>> endobj +5304 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.6612 236.657 133.6163 247.5609] +/Subtype /Link +/A << /S /GoTo /D (page.31) >> +>> endobj +5305 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.6612 212.7466 133.6163 223.6506] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +5306 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.6612 188.8363 133.6163 199.7402] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +5307 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.6612 164.926 133.6163 175.8299] +/Subtype /Link +/A << /S /GoTo /D (page.32) >> +>> endobj +5308 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.6612 141.0156 133.6163 151.9196] +/Subtype /Link +/A << /S /GoTo /D (page.33) >> +>> endobj +5309 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.6612 117.1053 133.6163 128.0092] +/Subtype /Link +/A << /S /GoTo /D (page.33) >> +>> endobj +5310 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [121.6612 93.195 133.6163 104.0989] +/Subtype /Link +/A << /S /GoTo /D (page.33) >> +>> endobj +5311 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.1425 714.8039 350.0976 725.7079] +/Subtype /Link +/A << /S /GoTo /D (page.33) >> +>> endobj +5312 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.1425 690.774 350.0976 701.678] +/Subtype /Link +/A << /S /GoTo /D (page.34) >> +>> endobj +5313 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.1425 666.7441 350.0976 677.6481] +/Subtype /Link +/A << /S /GoTo /D (page.34) >> +>> endobj +5314 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.1425 642.7143 350.0976 653.6182] +/Subtype /Link +/A << /S /GoTo /D (page.34) >> +>> endobj +5315 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.1425 618.6844 350.0976 629.5883] +/Subtype /Link +/A << /S /GoTo /D (page.35) >> +>> endobj +5316 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.4249 584.4129 394.3613 594.5995] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +5317 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.9641 572.3979 399.9006 582.5846] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +5318 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [396.0846 559.6657 413.0211 570.5696] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +5319 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [387.3974 547.6507 404.3339 558.5547] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +5320 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.4062 535.6358 399.3427 546.5397] +/Subtype /Link +/A << /S /GoTo /D (page.107) >> +>> endobj +5321 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.74 512.3232 371.6765 522.5098] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +5322 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.74 488.2933 371.6765 498.48] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +5323 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.74 464.2634 371.6765 474.4501] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +5324 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.74 440.2335 371.6765 450.4202] +/Subtype /Link +/A << /S /GoTo /D (page.106) >> +>> endobj +5325 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [354.74 416.2036 371.6765 426.3903] +/Subtype /Link +/A << /S /GoTo /D (page.107) >> +>> endobj +5326 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.5095 381.2149 374.446 391.4015] +/Subtype /Link +/A << /S /GoTo /D (page.111) >> +>> endobj +5327 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.5095 357.185 374.446 367.3716] +/Subtype /Link +/A << /S /GoTo /D (page.111) >> +>> endobj +5328 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.5095 333.1551 374.446 343.3417] +/Subtype /Link +/A << /S /GoTo /D (page.111) >> +>> endobj +5329 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.5095 309.1252 374.446 319.3118] +/Subtype /Link +/A << /S /GoTo /D (page.112) >> +>> endobj +5330 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [357.5095 285.0953 374.446 295.2819] +/Subtype /Link +/A << /S /GoTo /D (page.112) >> +>> endobj +5331 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.3786 260.3481 409.3151 271.2521] +/Subtype /Link +/A << /S /GoTo /D (page.109) >> +>> endobj +5332 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.1173 248.3332 391.0538 259.2371] +/Subtype /Link +/A << /S /GoTo /D (page.109) >> +>> endobj +5333 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.0113 236.3182 389.9478 247.2222] +/Subtype /Link +/A << /S /GoTo /D (page.109) >> +>> endobj +5334 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.5899 225.0206 411.5264 235.2072] +/Subtype /Link +/A << /S /GoTo /D (page.108) >> +>> endobj +5335 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.7687 200.2734 366.7051 211.1773] +/Subtype /Link +/A << /S /GoTo /D (page.109) >> +>> endobj +5336 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.7687 176.2435 366.7051 187.1475] +/Subtype /Link +/A << /S /GoTo /D (page.109) >> +>> endobj +5337 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [349.7687 152.2136 366.7051 163.1176] +/Subtype /Link +/A << /S /GoTo /D (page.109) >> +>> endobj +5338 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.0858 140.1987 370.0223 151.1026] +/Subtype /Link +/A << /S /GoTo /D (page.131) >> +>> endobj +5339 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [361.903 117.9421 378.8395 128.1288] +/Subtype /Link +/A << /S /GoTo /D (page.110) >> +>> endobj +5340 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [367.4819 93.9122 384.4183 104.0989] +/Subtype /Link +/A << /S /GoTo /D (page.111) >> +>> endobj +5276 0 obj << +/D [5274 0 R /XYZ 90 757.9346 null] +>> endobj +5273 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5343 0 obj << +/Length 4208 +/Filter /FlateDecode +>> +stream +xÚ¥\mo·þ®_¡à¥ùþÒoNìÐÖuÔ"mZ²t±‘uêé®iúë;Ü%¹|Û«ŒÀˆÎzfγäp†Ç5;§ð;wôÜ(CœúüöË=ÿ ýÝ ¿à÷Cøæêìõï¹;wÄi®Ï¯~=hFgüüêî§ ®øå?¯¾?ŽG©?þ¯ßÿñí»ý/ÎÞ]%÷] ͼóýôOz~£øþŒá¬:ÿ>Pœãç_Î$ñÃÃÙgN~¦_Œ½ ½(D£ð3WâÜpøÁL¡<ßo®·OÇëzèL9¬sÉ`$ö¿ÙÙ|ÈðaÔ^ý0c »‘„ Q±Wa'™Bg 56‹}wâ‡Ü 3”Æïbü S¼@#@@a´Iª ¥Bg +<íw_žz +"­µ³ ¦@À¹AOÚï¤o`9‘‚›jµ…ÑF´“„2'3ž7ûÞüWÄjÎg lüôV@íwIC‰¥º@3 +¡…L¤A+*Դ曇ÇÍáÎØ´ÁKE„dz¶A‚ø!7èßøƒmðšn•ªPQ­t¢Š|W÷›Ë+zq|ÿaúáêÛ¯ãÏ Èí/¯zÓ‘)¡’#D2|GÚ«žnÕpc~*ääµ´NéµP–P­§äsØ~ÙìÛp¬&Øð 7À‡ß ·ö:=}Ѱ ØZ•®ØëxãL+_¹…T‘¢¾Þ\2uñŸ§í~s÷ª·ü´4³¢@€9¾3šÚ«Œë$?€Q§+ö&ùFš$"|1K°ß~靿gm48a5°q5d «¡ð» ü<7~5ü½Õ`ÆÕ°ÎšÂ÷­Ss.¼Ý=>.t«Ð'ø)ݪïšsƒ¥n5÷;>{ÞíVUÅÞëUʘ‡=zD[¾¹=¬¤ÁhqrÌ ÖÒ`>’…?¦Á‚9 ®³¦ø¹$Tâß>nÝï(”¤ Ž/ù?äý5_úƒ·Ýï tF%gÑ(Œ5Ï8¡:4¢cðOK˲ˆÐRÎ&Ø)eÀ¹Aö» €ìi%}sL90Î>…Ü`\ª ¯65/%1êÄÆ}À¹AïÑ×~Ö¼œ‚r¦äo}@a¬1vn!=85‡¾}>ô¢¿œZðX ð!Ã÷ò]åuá¡Ç/1 ò&ßÅoD×)SàFÆèœðž7Cyè.¬er†cüô"¯ýŽ¡»Þ×RVJVñw¾–Qk +ދŵ΂?lŸ¶wË_Ê'‹S¿•Ï V¾–/FÒ‹p +lJþιüˆÂXSüŠ&ù<íý·’¯úýôØ Ž-ù€rƒÞ’¯ý.-yÀq*+þfÉÆš‚‡þ›);×·‡Ûåtµ¨5f¶ÁÒ}À¹A/Ý×~¿œò +üM¾(Œ5)À-ä +9¹Ç»§ëÇÍ%W¿v +K¬n¶Â +ž€rƒ^ÁSûgmŸà|7Tò7O@a¬I¦§˜i°8 ,QʨÙ›?ä½YPû]Pºâ”WüÍ,(Œ5)@ýî£æÎÿø¸´û¥ (šœz;'7X¹S ¥7½£’ñvÒ:«£ã÷ûã)ôxáÍÝÝ~óü<}ø¸yÞ=ÛÝãôùÃ~wØÝîÚSî«M7ûD|Èñ3€Úë¨L{ &™©Øë#€ˆBH½2–î° enžž¶·7³?oý§Î!¡S‚¤š=!s%â‡Ü 3W¿~„R÷e3¼â¯‰(„Õ+y +– /öð”òÏÇýIªøIèž¼aGE?ä½£¢Ú¯¥0íQ‘ Î'Å’¿9* +(„Õ«».g¦™(þäìßþ;ÎÍþù¤Ùâ4Ç’?l²øá{s¥òêG©ÔÂC1%y3ShÒK ·Ò–šÜÛê¿··á +ÔÝ~;þŤ>o8Q"gçØ¼ ø!7èÍ›Ú︚X;o8‘Æ™Š¿™7…°z‘'Â_â-Dò‡ Û›‡íO\L &'ã³3L”€rƒž(µßQÚŠ8MÉ߈P«…S"`3,E¹ú6üp¸ß‡éó§Ý¶é0wî{—ç| ä˜e³glS +ø!7èíJµßñ«+×nKPYj*þf[ +(„Õ+D-‚§#Š×·Ã l×7Ÿ6ÏäþU¯q’Ì?Ëh‰•,?ä½’¥ö;^©ë•î’¥ê4E[@!´ ÓDH› ðüëöp{ß ^IXFFü°bD3¼V‘ûÃî”j^˜öu´_ºøý¶‘FÀjTëcZ?ËÊ;ö“8U„dDsØN»`Ÿàë—ݯ“0M&°{(#ØêûB8SÜÌnëyV<=ïnéÅ® ÑÆºÙ >â‡Ü 3’Æï~ÓË ÃA&^ Ž?¢0Ú$€¿„®™ž8tŸ<‡†v»Ç}À¹AïÙ×~§èeO~&jþæáO Œ4ÆîïŸ3ªÓ!Îëñ²Ë¥Rä¶3 ÑhÆf+lüô&@íw’ ©Ë$á/I—¨5ˆ(Œ6‰0^èf¢#Â}WÇ`­&+\„?ä}J¿“¦'‚Õ¢@G„…Ñ&Œ‰I§óœ×ðgxÜl?ßÚ-NëÏÝaî&cD‹ˆrƒÎ ¿“Í©¶pŽø^£ä¯¥ Œ4)¡¬¿@æ–•èÌ +«ü<ÛbBLð!Ç÷t¨¼N24u‚¤Ð:W±W2DÆ™dÚ¿§a ž¡‡ïfG 9\ù%­"~È :£iüŽXÚ>hFœªPO…ˆÂh“R“ :¡·À›fáêûˆÇ6‡€rƒÞæPûÂo+ÿ²£’õš¤Pm +ŸC×a”,Âïí°ëh+g<~À¹A/üÚï~»7ú[ÀŒ×hÂ(Œ6…ϨÿZ@äá_ßì»õ²O¸Ü©Ì[?ä½Pû5p´—Œ¹p¼@³ +£ø êR+ViÐ]&“³ ¦Àr|O€Êë» ¥Œ«è›ê0 0Ö¿…rš:×Äß*97ÛàŒø!7è+Pú$à= ¬¿§R #ÁˆÂh“Fú´Qì»~‘¬Üôzu2ÁŠ£€rƒ^qTû­Ò‹«ª4 +F›Ð~ßpów½7P +tn«ùbìÍÓ“?}j%2Ú_Ü×ãE-%š+#~È :cmüŽOmùèß'1œWüMš(Œ5)$,ÑÖ‰R¡Þ *ÿ—F\#Я 32ƒ5"lÔÈ.kTð/k´Îš4bPÖúF7itûË%£_­åÄraOW)3XS)Â0• +þe•ÖY£JÒQè\¬ž/Óúï¾½zÿ×w×úðî«Zõîàû«`Òø“Gô¾U¹A/)Õ~ǃÌ6'iíß´SœÆštò·´ó+ã•óUu:…›¿êAÙø¦¥]h?ä½Â­öÛ¿ˆè›ÞñØ’¿9Ô(Œ–¡¤Z/;PiÒBó%Û«^É̵ÊÐØnðCnÐÛ­k¿ã×®mÍjÇ-¯ø›­* 0Ö4-#Ôq[ßÅéÄ&Œ>}bdk#Âú7³ç‰Qð/OŒuÖ$…†Â†wªV/ê¿P.ÿÂç'œ G¹rƒ¹¬‹? Qò/Ê…°F¹üe@Íw| îõ¶ëÖþ©Ÿ„%$K?¡C¿¥Mø!7XHÂ…ßqB™n¦ÒUü½$ìQkR +SßÎ'ÔÇ×xóã¸g}×E줽ʷ¾c.;u¯Ê VöªCöª’q¯BX“L¿Âd1‘vÇÃWL#.ˆžÓ§Qf°6" ›Fÿò4ZgMú@èJ²r¡M§Ð/Vˆ;G”U§/´Ü`E¡²‹ +•ü‹ +!¬Q!n Ñ‚ mJ×ß,æëÓV7Šh£N_i¹ÁÊJK0d¥•ü‹+ aM:iAŒ¿Éuúæ£OEòÿz›·ß¾ùáêåõ3WŒ­øéJekJE¦TÁ¿¬Ô:kRJøcì-­ðŠÚ w~ØN!éNÞùsƒ•?ÁB©ä_ÜùÖXAûþ¬sé^g¸´Ð‡*p@Õl„õ¡?ä½>´ö;ö¡²÷Ý‹ã‚UüMPkšT'å܇~ã{õ¿ü­W×sþõ4wz𬬡CÖPÉ¿¸†Ö¨‘¿øHExá{ÔèoWÐ¥|ûîãWH¤­ë†.Qf°&Q„Ée‰ +þe‰ÖY“D@Ï ×T/ƒ¾0Ëø»qÌ¿è}j–É V²L‚!}zÉ¿˜eÖ˜eü-΄:­OOèSûôÜ`¥O/FaÔbŸ^ò/öékšœ®ì\ß>ìž7_w8Þÿ¢èÅàù 07X9L0ä °ä_<DX£BåeµIŸ»Þ?ÖÊ[x“‚_¦§¢éÅÿŽëøÏÍZ¹0²;×Ä8ê'4JÍÓPü˜¿Û> endobj +5345 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.1937 726.8189 175.1302 737.7228] +/Subtype /Link +/A << /S /GoTo /D (page.111) >> +>> endobj +5346 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 714.8347 180.1115 725.7386] +/Subtype /Link +/A << /S /GoTo /D (page.111) >> +>> endobj +5347 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [166.4925 702.8505 183.429 713.7544] +/Subtype /Link +/A << /S /GoTo /D (page.112) >> +>> endobj +5348 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.8659 691.5836 171.8024 701.7702] +/Subtype /Link +/A << /S /GoTo /D (page.112) >> +>> endobj +5349 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.3453 679.5994 161.2818 689.7861] +/Subtype /Link +/A << /S /GoTo /D (page.132) >> +>> endobj +5350 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.1573 667.6152 193.1124 677.8019] +/Subtype /Link +/A << /S /GoTo /D (page.62) >> +>> endobj +5351 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [115.0158 655.631 131.9522 665.8177] +/Subtype /Link +/A << /S /GoTo /D (page.133) >> +>> endobj +5352 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [169.6507 642.9296 181.6059 653.8335] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +5353 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.7314 631.6627 170.6866 641.8493] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +5354 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.8185 619.6785 176.7736 629.8651] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +5355 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.9906 607.6943 162.9457 617.8809] +/Subtype /Link +/A << /S /GoTo /D (page.93) >> +>> endobj +5356 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [147.0354 594.9928 158.9906 605.8968] +/Subtype /Link +/A << /S /GoTo /D (page.91) >> +>> endobj +5357 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.941 571.7417 146.8962 581.9284] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +5358 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.941 547.7734 146.8962 557.96] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +5359 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.941 523.805 146.8962 533.9916] +/Subtype /Link +/A << /S /GoTo /D (page.92) >> +>> endobj +5360 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [134.941 499.8366 146.8962 510.0233] +/Subtype /Link +/A << /S /GoTo /D (page.93) >> +>> endobj +5361 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3746 464.7047 151.3298 475.6086] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +5362 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3746 440.7363 151.3298 451.6403] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +5363 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [135.4992 417.4852 147.4543 427.6719] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +5364 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.9724 404.7838 167.9276 415.6877] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +5365 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.6073 392.7996 174.5625 403.7035] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +5366 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [204.4604 381.5327 216.4156 391.7193] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +5367 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.7047 368.8312 156.6599 379.7352] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +5368 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.6173 356.847 174.5725 367.751] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +5369 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.9911 344.8628 162.9463 355.7668] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +5370 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [162.6073 332.8787 174.5625 343.7826] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +5371 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.9136 320.8945 156.8688 331.7984] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +5372 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [170.3681 308.9103 182.3233 319.8142] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +5373 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.798 296.9261 155.7531 307.83] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +5374 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.2123 284.9419 165.1675 295.8459] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +5375 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.8852 272.9577 161.8403 283.8617] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +5376 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.1937 260.9735 170.1488 271.8775] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +5377 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [145.4615 248.9894 157.4167 259.8933] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +5378 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [174.7915 237.0052 186.7466 247.9091] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +5379 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [167.8977 225.021 179.8528 235.9249] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +5380 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.5613 213.0368 189.5164 223.9407] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +5381 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.175 201.0526 175.1302 211.9566] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +5382 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [224.8828 189.7857 236.8379 199.9724] +/Subtype /Link +/A << /S /GoTo /D (page.76) >> +>> endobj +5383 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.1583 177.0843 206.1134 187.9882] +/Subtype /Link +/A << /S /GoTo /D (page.46) >> +>> endobj +5384 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [203.0152 165.1001 214.9704 176.004] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +5385 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [193.0528 153.8332 205.008 164.0198] +/Subtype /Link +/A << /S /GoTo /D (page.55) >> +>> endobj +5386 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [201.5208 141.849 213.476 152.0356] +/Subtype /Link +/A << /S /GoTo /D (page.41) >> +>> endobj +5387 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.255 129.8648 212.2101 140.0514] +/Subtype /Link +/A << /S /GoTo /D (page.40) >> +>> endobj +5388 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [227.9218 117.1633 239.877 128.0673] +/Subtype /Link +/A << /S /GoTo /D (page.89) >> +>> endobj +5389 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.415 105.1791 185.3515 116.0831] +/Subtype /Link +/A << /S /GoTo /D (page.169) >> +>> endobj +5390 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.4811 93.195 170.4176 104.0989] +/Subtype /Link +/A << /S /GoTo /D (page.170) >> +>> endobj +5391 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [340.6329 726.8189 357.5693 737.7228] +/Subtype /Link +/A << /S /GoTo /D (page.171) >> +>> endobj +5392 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [356.6827 714.8637 373.6192 725.7676] +/Subtype /Link +/A << /S /GoTo /D (page.172) >> +>> endobj +5393 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [341.1908 702.9085 358.1273 713.8125] +/Subtype /Link +/A << /S /GoTo /D (page.174) >> +>> endobj +5394 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.3649 690.9534 370.3014 701.8573] +/Subtype /Link +/A << /S /GoTo /D (page.176) >> +>> endobj +5395 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.9228 678.9982 370.8593 689.9021] +/Subtype /Link +/A << /S /GoTo /D (page.177) >> +>> endobj +5396 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.8008 667.043 400.7373 677.947] +/Subtype /Link +/A << /S /GoTo /D (page.178) >> +>> endobj +5397 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.3588 655.0879 401.2953 665.9918] +/Subtype /Link +/A << /S /GoTo /D (page.179) >> +>> endobj +5398 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.6549 643.1327 383.5913 654.0366] +/Subtype /Link +/A << /S /GoTo /D (page.180) >> +>> endobj +5399 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [345.6142 631.1775 362.5507 642.0815] +/Subtype /Link +/A << /S /GoTo /D (page.181) >> +>> endobj +5400 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [346.1721 619.2223 363.1086 630.1263] +/Subtype /Link +/A << /S /GoTo /D (page.184) >> +>> endobj +5401 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.299 607.2672 385.2355 618.1711] +/Subtype /Link +/A << /S /GoTo /D (page.190) >> +>> endobj +5402 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.3177 595.312 380.2542 606.2159] +/Subtype /Link +/A << /S /GoTo /D (page.191) >> +>> endobj +5403 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.8757 583.3568 380.8121 594.2608] +/Subtype /Link +/A << /S /GoTo /D (page.192) >> +>> endobj +5404 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [358.9043 571.4017 375.8408 582.3056] +/Subtype /Link +/A << /S /GoTo /D (page.193) >> +>> endobj +5405 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.2133 547.4913 387.1685 558.3953] +/Subtype /Link +/A << /S /GoTo /D (page.47) >> +>> endobj +5406 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.2133 523.581 387.1685 534.4849] +/Subtype /Link +/A << /S /GoTo /D (page.48) >> +>> endobj +5407 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.2133 499.6707 387.1685 510.5746] +/Subtype /Link +/A << /S /GoTo /D (page.48) >> +>> endobj +5408 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 475.7603 367.8111 486.6643] +/Subtype /Link +/A << /S /GoTo /D (page.83) >> +>> endobj +5409 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.1238 451.85 355.079 462.7539] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +5410 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [360.2693 439.8948 372.2245 450.7988] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +5411 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.1238 415.9845 355.079 426.8884] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +5412 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.1238 392.0742 355.079 402.9781] +/Subtype /Link +/A << /S /GoTo /D (page.66) >> +>> endobj +5413 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.846 368.1638 367.8012 379.0678] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +5414 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 344.2535 367.8111 355.1574] +/Subtype /Link +/A << /S /GoTo /D (page.83) >> +>> endobj +5415 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.846 320.3431 367.8012 331.2471] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +5416 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.846 296.4328 367.8012 307.3367] +/Subtype /Link +/A << /S /GoTo /D (page.78) >> +>> endobj +5417 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 272.5225 367.8111 283.4264] +/Subtype /Link +/A << /S /GoTo /D (page.83) >> +>> endobj +5418 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 248.6121 367.8111 259.5161] +/Subtype /Link +/A << /S /GoTo /D (page.83) >> +>> endobj +5419 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.1238 224.7018 355.079 235.6057] +/Subtype /Link +/A << /S /GoTo /D (page.71) >> +>> endobj +5420 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.9642 212.7466 386.9194 223.6506] +/Subtype /Link +/A << /S /GoTo /D (page.44) >> +>> endobj +5421 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 188.8363 367.8111 199.7402] +/Subtype /Link +/A << /S /GoTo /D (page.83) >> +>> endobj +5422 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 164.926 367.8111 175.8299] +/Subtype /Link +/A << /S /GoTo /D (page.84) >> +>> endobj +5423 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.1238 141.0156 355.079 151.9196] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +5424 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [360.2693 129.0605 372.2245 139.9644] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +5425 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.2133 105.1501 387.1685 116.0541] +/Subtype /Link +/A << /S /GoTo /D (page.48) >> +>> endobj +5344 0 obj << +/D [5342 0 R /XYZ 90 757.9346 null] +>> endobj +5341 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5428 0 obj << +/Length 2842 +/Filter /FlateDecode +>> +stream +xÚ­œ]S9†ïù¾„ª±Vß-Í]& ©²ÝÉÔÔÅ`\l¯13“¿R»¥–Z­#ŸrÁçè•tôÑ~ ™`óL4ž4¢Ašq9¹{<“{óã·G¤{{jÞŸ†?]ýë Õ´¤rrý¥mA$(¡“ëÙoÇç§gŸO~¿~7áX!,¤iÈþœ +fztví[ïÄ“Ķý¿£ß~Ç“™éÄ»#Œ˜Vbò·ù#¢5<qÊÜ7_®ŽþíÛÙ½Ñ&ŒA66 ‚`óÚôpÒPó¢Ùäy±¾]¯¿ âGz1lÕö‚«D\j$5Ö±ø`Ð>–´¿b~MD*7æ›»Õr™Ž˜Q„%%}xaÈ.~&ŒŒ9i×vƒ0žt€7c9ìÀpØ.ª$ëáX}"ÝèÓÓI¦š>²0p? Fz´k{Ðм‰Ã„ô‡ãvQUóû–š#‚¥ˆ~ßó»m[³¤Ã2%i!h‹T[bµX‹³=MK¬ŸÅRPuÓA6v…1ó§vð µ+@˜,QGÍ®±~v€Uí¬ +QnB³b>›ßÁ‡KD•Põ|‚ˆ +¬‘±~ž¨jù0Žû*ýÏùÇ›×—W`ͬÖÛ” 7UcûE©y!x‰‹‹Ÿ† #\’vm'TºŠ +ǘ蹸¨‚ªåB0â3?of·ÛÛ¯ó%H¦8k„VˆKQ_Ua0k|X;ktvÖÄúÙY«:BI$°î«j¾}¸¹Í6?ŒmoB0Õ§”&F? Æ&ưÝÝþ*Ó±SÄu3ì@2ö.ª kÇÞp£ÌU4ö‡Ñ¡3Dæ}Fiè]ü4Lú°ÝÝÐӽĬ}¸áÃ$EÑEdíÐ %¡u¿X¼9ÿ|vzÂññ«ÓÓOû/ÂÔ¥ä¼~Ñ€EÇX?»hÀª–SH*Íb>g×?¿•¨aœÔã  <.¬„'ÒÏãU-ÂQÓ¨~Õ¸Ÿog»l€lÌŽý儊ãñ¥ÕLÉFËf"0Eвb‘¹øi˜0)i×öf¤Æ'̯<ÖBrQU‰kŒ”T2„ô°zÚoÒæR)L0ù°¦X?‹ Vµ˜¤4£W,Ä´œooŸþ<%!Ìu‹‘zJADÉ…µ”TžR¤Ÿ§ªZJf«À¼é+nq÷¸6_F·+³Hfn¬>©tHéâ§aÂØ!eØîn»=C¢‘ýdð» ‚¨;#kÚïÓ‹åbßË 7)fƒ­¿#‡ ÀeЇµ—A•½ ÆúÙË`AÕ]9nQ”»q[0£»¡'ûèòîÓÆOÄñÝ'n·=³â±ÝGiBú#»OUP5ói(ퟙù°~Þ‚·ÀÙÜ.eÏôfúÑ S ™fkÎômü4L?ÓÇí¶|ÈØ™žs¢ú#gú6ª jù41ßóYËšMÇÿ2ˆ¤¹[B&ÌŒ‰IÒ—Ó.~&Œ-§ÃvÛ‡ éÑßœgicöÚX?YQº¨‚ªEd.K :!&7ç£zBADÈ…•EúyB ª%D™¹GI: DÀ2«Dd²'¤Q!ra%D‘~¨jQ­‘PBÑÌ"ªì¾‚ëë,Lù°Q“EëgÁªQ#lÄ°ÎØ!I†Šë -L€¹°¢H?TµˆAÃBã(4Ê4R×Z˜!ra-"•Gé窑9e)Á‡…vcŽÀ‡˜HD˜“‡þŽZ  J.¬D)ÒÏSU-%Ìæ\&”Vë‚¿Ñ&Kéúš T>¬€*ÖÏ¢‚U *¢0ÂŒkî¦æÒYƒIÚqº¾î“ k1é<¦H? Tµ˜„DÄTç¦ÃÔá™nÔ×^˜‘ra%R‘~ž¨jI1Š(a" u÷ðçÓó#¸Šç¯©„bD…âÕ×Ô0¸¦ú°Â55ÖÏ^S ªîšJ°B ³þÓ•ÍÝÃÈ5•£Fñ ºtMíâ§aÂØ5uØnû1¶H¯&Ž›[S¬Ÿ\S»¨‚ª™Z"|¸Ð}äJ2lN˜..PKTwÓ>2dTîn4ƒH™ٹLÍn[ç ñá°M#iuÜ+À >¬h:C|PAÒxà™mímÿ„ˆãùæ/ûúvó”‚0÷h%ÍáµÒ0âã δݶؒ{?ÓÌ>@f°_ÄG•T±¡¡Hê¹ùºxÚ>îÌOïŨ%a0M"Gºù)ëg'JAÕ͔Ȳ|Ìˉ(Ö²Ö;âã .Ž´ÝqóSfãm(…½#>ª¤ê¦FdÙ°Ÿj½?¿º>»øxùéDâãëï7 0s@PÂöÓ™3 +œ\ü4LéqÒîø[Lš8b–ÄXÈÉE•T=§ÐºÑrzÿóÍû³‹ðqæŒj>AÄ'4}(‘çéçùÀªžOháh—˜Õ=xÐÙ8ƒF5› b?”ʳ‰ôól`UÇ&2p´sçòíÛó‹·ûÏJ¿EÏ6>¤íæh·èùT=ŸÐê`ù|xõy·ü|~"gg¨F$@ˆB›„(ÒÏ#‚U=¢ÐìÐ!ºúõ TWhÞÔPM)H€(…f ˆR¤Ÿ§«zJ¡çÁ.BOO{yºü¦ì] µ›}˜lö‘["õtùm<ÖÏnöUÏ'´;X>ËùâþáÕfÜÞen‡æ²ÛèZû…/!Òvw'¸yŸR¢aÿ…*É: ‰ cÙ~ø·u¾lºT0úé[!Òv Ó4`ôÓ¥ ê9 mëùf±š-î@HÐçªæ„`d°¨õ`øø‚"m·5rˆ6qÔ¼ z0|TIÕƒ:1¨Ö|ZÎíPM+H€h…. +Îò´"ý<-XÕÓ +}v/ûhÎBÖD÷úòâÍþ~¥•¡ßÊ`SAÚna+­ ýVVPuCÃzõõë^®v¿ˆTzúÅ v¤í'ÐËÐ/NUhèh°€To•–†¾Þ`sAÚn¡Þ@KC_oUO*46ØzûtöêêêìÃOïOÆÇ¿î_r•Ɔ¾ä`‹AÚn¡ä@cC_rUÏ)´7ì8½>;ÿïÙÍ/ç§—'Lÿ²ÿA»Òà ­i»-*™GT°ªC•Ø6ó§íífû²ÓS¥Ã¡_ `¯AÚnûd g(ÐáÐ/PUÏhèsØÌíÓç/ÅTçr0~ƒ´Ý&Èå`‚U=¦ÐëÐV]{§=!êørÿr«´9ôåÒv åÚúr+¨zFC³ÃÓ|9Ûóé}¥µ¡z› ÒvÛ§÷:ûô´6ôOï ªîéýÐàP.—P] ãÇ@ Z7É3¥íÓx9PO8uQ%QÏ)tItœæÛ‡r–ˆZPA<*4Z@ "õ<(XÔƒ +M¨—ÿŠ“³DÔ’ +âR¡Ñ"©çIÁ¢žTh›èH-Ö‹}—åJ‡C¿,Ã^ƒ´Ý² :úe¹ ê–åØç0ú'LØ[‰Ö‘×ب»hØð0hsü˜lkè˜ËÂëѦ‹™RsÇã‡l¤‰òEÿHû¿•˜UŒ‘ªžH¤­ÏÈýwˆðî‰ÉÛùr¾¹µãnú†WËÝ×îÅ;{Ê|î¾!´ûФìGŠwß™ÉÝ«¶fW›Ý7Ïç»hÔþñm÷õtõÏ·ûÔ¬b?^v] øü™ºô±endstream +endobj +5427 0 obj << +/Type /Page +/Contents 5428 0 R +/Resources 5426 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5491 0 R +/Annots [ 5430 0 R 5431 0 R 5432 0 R 5433 0 R 5434 0 R 5435 0 R 5436 0 R 5437 0 R 5438 0 R 5439 0 R 5440 0 R 5441 0 R 5442 0 R 5443 0 R 5444 0 R 5445 0 R 5446 0 R 5447 0 R 5448 0 R 5449 0 R 5450 0 R 5451 0 R 5452 0 R 5453 0 R 5454 0 R 5455 0 R 5456 0 R 5457 0 R 5458 0 R 5459 0 R 5460 0 R 5461 0 R 5462 0 R 5463 0 R 5464 0 R 5465 0 R 5466 0 R 5467 0 R 5468 0 R 5469 0 R 5470 0 R 5471 0 R 5472 0 R 5473 0 R 5474 0 R 5475 0 R 5476 0 R 5477 0 R 5478 0 R 5479 0 R 5480 0 R 5481 0 R 5482 0 R 5483 0 R 5484 0 R 5485 0 R 5486 0 R 5487 0 R 5488 0 R 5489 0 R 5490 0 R ] +>> endobj +5430 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.732 726.8189 170.6871 737.7228] +/Subtype /Link +/A << /S /GoTo /D (page.48) >> +>> endobj +5431 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [131.0658 714.8637 148.0023 725.7676] +/Subtype /Link +/A << /S /GoTo /D (page.134) >> +>> endobj +5432 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.6425 702.9085 138.5976 713.8125] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +5433 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.6425 678.9982 138.5976 689.9021] +/Subtype /Link +/A << /S /GoTo /D (page.67) >> +>> endobj +5434 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.732 667.043 170.6871 677.947] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +5435 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.732 643.1327 170.6871 654.0366] +/Subtype /Link +/A << /S /GoTo /D (page.48) >> +>> endobj +5436 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3746 619.2223 151.3298 630.1263] +/Subtype /Link +/A << /S /GoTo /D (page.84) >> +>> endobj +5437 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.732 595.312 170.6871 606.2159] +/Subtype /Link +/A << /S /GoTo /D (page.49) >> +>> endobj +5438 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [146.5575 583.3568 163.494 594.2608] +/Subtype /Link +/A << /S /GoTo /D (page.136) >> +>> endobj +5439 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [142.1342 571.4017 159.0707 582.3056] +/Subtype /Link +/A << /S /GoTo /D (page.137) >> +>> endobj +5440 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3746 547.4913 151.3298 558.3953] +/Subtype /Link +/A << /S /GoTo /D (page.84) >> +>> endobj +5441 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3746 523.581 151.3298 534.4849] +/Subtype /Link +/A << /S /GoTo /D (page.84) >> +>> endobj +5442 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.8004 499.6707 173.7556 510.5746] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +5443 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.8004 475.7603 173.7556 486.6643] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +5444 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.8004 451.85 173.7556 462.7539] +/Subtype /Link +/A << /S /GoTo /D (page.38) >> +>> endobj +5445 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.6358 439.8948 174.5723 450.7988] +/Subtype /Link +/A << /S /GoTo /D (page.138) >> +>> endobj +5446 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.6425 415.9845 138.5976 426.8884] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +5447 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.9323 404.0293 151.8875 414.9333] +/Subtype /Link +/A << /S /GoTo /D (page.40) >> +>> endobj +5448 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.4829 380.119 170.4381 391.0229] +/Subtype /Link +/A << /S /GoTo /D (page.41) >> +>> endobj +5449 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.3149 356.2087 175.27 367.1126] +/Subtype /Link +/A << /S /GoTo /D (page.56) >> +>> endobj +5450 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.3149 332.2983 175.27 343.2022] +/Subtype /Link +/A << /S /GoTo /D (page.56) >> +>> endobj +5451 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.3149 308.388 175.27 319.2919] +/Subtype /Link +/A << /S /GoTo /D (page.56) >> +>> endobj +5452 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.3149 284.4776 175.27 295.3816] +/Subtype /Link +/A << /S /GoTo /D (page.57) >> +>> endobj +5453 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.3149 260.5673 175.27 271.4712] +/Subtype /Link +/A << /S /GoTo /D (page.57) >> +>> endobj +5454 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.3149 236.657 175.27 247.5609] +/Subtype /Link +/A << /S /GoTo /D (page.58) >> +>> endobj +5455 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.3149 212.7466 175.27 223.6506] +/Subtype /Link +/A << /S /GoTo /D (page.58) >> +>> endobj +5456 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.3149 188.8363 175.27 199.7402] +/Subtype /Link +/A << /S /GoTo /D (page.58) >> +>> endobj +5457 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.3149 164.926 175.27 175.8299] +/Subtype /Link +/A << /S /GoTo /D (page.59) >> +>> endobj +5458 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [163.3149 141.0156 175.27 151.9196] +/Subtype /Link +/A << /S /GoTo /D (page.59) >> +>> endobj +5459 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.6425 117.1053 138.5976 128.0092] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +5460 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.788 105.1501 155.7432 116.0541] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +5461 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.1238 726.8189 355.079 737.7228] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +5462 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [382.8644 714.8637 394.8196 725.7676] +/Subtype /Link +/A << /S /GoTo /D (page.61) >> +>> endobj +5463 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.1238 690.9534 355.079 701.8573] +/Subtype /Link +/A << /S /GoTo /D (page.68) >> +>> endobj +5464 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.2133 678.9982 387.1685 689.9021] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +5465 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 655.0879 367.8111 665.9918] +/Subtype /Link +/A << /S /GoTo /D (page.84) >> +>> endobj +5466 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 631.1775 367.8111 642.0815] +/Subtype /Link +/A << /S /GoTo /D (page.85) >> +>> endobj +5467 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 607.2672 367.8111 618.1711] +/Subtype /Link +/A << /S /GoTo /D (page.88) >> +>> endobj +5468 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 583.3568 367.8111 594.2608] +/Subtype /Link +/A << /S /GoTo /D (page.85) >> +>> endobj +5469 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 559.4465 367.8111 570.3504] +/Subtype /Link +/A << /S /GoTo /D (page.85) >> +>> endobj +5470 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 535.5362 367.8111 546.4401] +/Subtype /Link +/A << /S /GoTo /D (page.85) >> +>> endobj +5471 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.2133 511.6258 387.1685 522.5298] +/Subtype /Link +/A << /S /GoTo /D (page.49) >> +>> endobj +5472 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.2816 499.6707 403.2181 510.5746] +/Subtype /Link +/A << /S /GoTo /D (page.139) >> +>> endobj +5473 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.2133 475.7603 387.1685 486.6643] +/Subtype /Link +/A << /S /GoTo /D (page.49) >> +>> endobj +5474 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.9642 451.85 386.9194 462.7539] +/Subtype /Link +/A << /S /GoTo /D (page.42) >> +>> endobj +5475 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.9642 427.9397 386.9194 438.8436] +/Subtype /Link +/A << /S /GoTo /D (page.43) >> +>> endobj +5476 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 404.0293 367.8111 414.9333] +/Subtype /Link +/A << /S /GoTo /D (page.85) >> +>> endobj +5477 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.2133 380.119 387.1685 391.0229] +/Subtype /Link +/A << /S /GoTo /D (page.49) >> +>> endobj +5478 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [374.9642 356.2087 386.9194 367.1126] +/Subtype /Link +/A << /S /GoTo /D (page.43) >> +>> endobj +5479 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 332.2983 367.8111 343.2022] +/Subtype /Link +/A << /S /GoTo /D (page.85) >> +>> endobj +5480 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 308.388 367.8111 319.2919] +/Subtype /Link +/A << /S /GoTo /D (page.86) >> +>> endobj +5481 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.2133 284.4776 387.1685 295.3816] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +5482 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.2133 260.5673 387.1685 271.4712] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +5483 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 236.657 367.8111 247.5609] +/Subtype /Link +/A << /S /GoTo /D (page.86) >> +>> endobj +5484 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.1238 212.7466 355.079 223.6506] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +5485 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.2133 200.7915 387.1685 211.6954] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +5486 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.2817 176.8811 390.2369 187.7851] +/Subtype /Link +/A << /S /GoTo /D (page.38) >> +>> endobj +5487 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.2817 152.9708 390.2369 163.8747] +/Subtype /Link +/A << /S /GoTo /D (page.38) >> +>> endobj +5488 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.2817 129.0605 390.2369 139.9644] +/Subtype /Link +/A << /S /GoTo /D (page.38) >> +>> endobj +5489 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [343.1238 105.1501 355.079 116.0541] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +5490 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [356.4136 93.195 368.3688 104.0989] +/Subtype /Link +/A << /S /GoTo /D (page.40) >> +>> endobj +5429 0 obj << +/D [5427 0 R /XYZ 90 757.9346 null] +>> endobj +5426 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5494 0 obj << +/Length 3664 +/Filter /FlateDecode +>> +stream +xÚ­\ÙnÜF}×Wô£ˆ5µ/yËØžÄ™qâ‰eÌA (RÇb©5­V–¿Ï-6Y¬ý2Ö ˆe¹Ï­S÷ðÖF6ÛPømÝeˆRo®ïNèæüóW'lúx€Ï‡ð÷‹“¿ýƒ»#Ns½¹øylA3¢8㛋›N¹’g?^|³ŽG©†vü?¿þöå«ÿúN^]„æ'v%4óÿïä‡éæzñÍ %ÂYµù ~¡„9Ç7w'’‹ù—O'ïNþÚ9~0Ô’PLÔ²Y~5Ç$žn.·‡ûíáîêñ—1Ÿr 1FœRw½»ÿùŒ«ÓŸŸî¯Ïó™æÄ8m6†YB™¶Çþùö&Ì÷QO~ˆÊî–íúÞWðÀ)'2þLŸ€BX½HTª™^Tzøt{¸Ü=ž]F`)”ÄRá6ÚI¨V˜@3~ˆ*íúnØR %‰ÑZgü¹@3 +a´å„ù‚ ®ú”špC´°f£¯öãØèi2ã‡8 ¢IÑ®ïá¿e2ãÏ5™Q«×DYÂ%u#ßû×o/ß]œ9qúåcìôâõ»‹×/ÞÕ$b³D»‡ZåÀˆ7Ш–šp«Ð¡5ã‡8 V9y»cåè²r'„Êø‹Ê™P«WIH€RTÎc™· DRã<’÷Œâ€JÞE»¾ F)¼"B1›u O|F!´>qÎAq%ÓÄ/Ï( ¹p*Ö—DÐ+‰6–„i—DÂß.‰.+(£œ%R/Iƒ2»‡îdrõðP_ˆ”#†[¾QVEä™ñCP‘¦h×wD•E£Ñ$LùsifÂê¥1’(%mæpýp ÙûÚÙ^ögÜní(XZ•szuíÄÚ 0¤vRþfíôY½@ÕRÊ0é^¼x{ùæÝ3&Z%,ÑÖ­Uq@O™†L´)[™.«W†kb„dqé\üåñéî3×iÅ`{`¬[½NÇu:À|´k®Ó)sFXé”·¢œX.ÂȺÚ_¬îÛŒ•ß·ø!¨ïÛÒvÇ=ŠªîÛ¤vmßæQ+…„ãŠÕVÇE~¼ÙŸ× +ÒZØâ…l.ðCP›Kóv+p¹AÓ +’ÊL;PL¦ +¡õÉKÑ\ñúÍ«Ëÿœ1NO¿|}1þúÝû‹ÏŸT¥Ö¶ë§Ž8 3u2u¤üÍ©£Ïê…RŠP*¢©ãön{³CŽ>è¢,¥ Tšõ‹rÐY” Y”Sþæ¢ÜgõòF¨ãv©£‹=£h +f¯õ+qÐ+š†MÂß.š.«W…Â,_ö·O7ÿŸ­ŠpŠpnøj‎@6 +d›¥üMú¬ °‚Àç,è§Ûû›ç*aP½«GUÐU†Œª”¿9ªú¬^ š™0ªÞ¿|{ùâëW/þùîý›gìç„4pâÓëÇWÐ+Ÿ†ìtSþvùtY½>B ››¤|®w÷÷•Òy¬‘KV~ˆj¥‘·{\¹EY°ÀXâÓµ1¡ZŸ;DÂïIî÷[Cò·ne´w³J²õwâ€În6ÀÆmîfSþænaw³Ü9¢¬r«g°vÖˆ:³FÒ%š³FÊßœ5ú¬PÜzÝ©I*ãa»¿ÝÝÜ^wKãf,Ÿ_›2ÁÒ1Šh£ô +™FüÔeJÛõ‘U™¤d6ã¯È4¢V/“p}¨¬Ê4Î"ÝEhV0=­øz­¢€žV3lÔJ¶µJøÛZuY½VÂËhºNï·w»3ø?¶Ï[±a—@¬’aìE½±7ÃÆ±ÇÚc/áo½.«ŠÁÑ˹tì=nŸ»¡áT'¥^/OГg†aò$ümyº¬ s~¹tɘ{Ö f)¡BòÕKVÐY² Y²Rþæ’ÕgõÂhK¨qÉóSÐöúp»»^ñ0¥ ƒ¼ºxâ€NñR<)³xú¬^#) 蔌­æAüÝó‚¥~„1¾–yÖêq¯W™~-QNeìEâGÂéóœp&Ô’÷ý§ÛÇÃöþ3·yŒS••ëÇLÐ33 3 {ÌôYçm£–*þÂp˜V‡( 7âŽ(Ù {8tY¡,œ&B.7\ÞÿÕË3Içg«ÇǬY…óÑÝ8‡Yö@p}<œeî‰ÚÁSÀжŠó€íKàC„¯ô oµ~êp¦² ÒHÈó„gBI!i£6q_ŒcrÆì釛«ÃÕ§íçMØÂh©ӋÕ‘iÆq@¥ÓE»õ [X˜€×3áÏ•šQë,UâÃXÒïJtyõÓn_©#ÊH¹x-…füTúZ´;î«ËR2€&£Ïš@ç<~OFÈ}{S© • {„•î€G|e»cö¶¬ÀIfúî€ÂXCþ±GdÌÿú—3FO« +ÀJ(¤Zb0&üÔÈÛm)WÔ–ñ +L(Œ5(ûM¼ןvÛVõ‹µ¾—€G(e»ìÇÂÖ®ï{ (Œ5dŸ»_Æìkß?÷Wz­ý%àJÙnëâŽÁBßu¿ÆÒÏ=0Ó¶¿Ìߟ!,œ=C’ÿŒâ€JOŠvÇå¡xöèmT•ñçùÏ(Œ5ä;k¢ük`,)N¯uù<â·)ÛmT€œßpt]>…±Î +^ŸiQ†X#Ø€ ?ĵ·;æïJý'”Éø‹0¡0Öl òùO7•ô©·w¸µN¦€G4¯¾ÉØëWß ¤!óØþå3ßoWµ}¿Ä9£Öѱ„•íÖìúÇÔNSÖ7¢ÆòÏíhû­¿•þûÝí¡ºûq°!ßýŒø!¨ï~Òv[Žk“ñWv?# +c ÄF·ã»÷•…_"4_í· xÄùV¶[DçHÁâ· (Œ5$ŸùíF“o%yE µn­á.àë[ÙnãÊÒ˜êî +c“/mw“¡ê¼ºñæv­én†#æ·¢ÕFöN€˜¾ã. 0Ò}컋/çµ»2F¬B°ô'üÔòÏÛm 8ê…Jø &ƈý{™}¡¢òG ±ÖMðˆ¯¯l·1þàà`ÛwÆ4È=…åSÕR +ØSk +‹lF¤˜ñCPéTÑný&¡¤yH-åϤ(Œ5Hûãç¦çµC·v­sr†#Æ¢ÕÆ-R0ågƒžo2 0Ò}ìž,žþ—×À£ÙÖ—`†1¾ìMÑj£À¸0{^3 +!]$ˆ­™ñC®óæ1l¥Kt9õýše»õ9þ‡fÞƒÝs‰Æ(¼¢É…óZ7œ‘K6áCŒ¯MY«­Y`"îu}˜Péü¨ ±ŸN/ tr^^ÝÜ^=/Hµ¸KñÓ‚¿GÃëg…¸Íñ!§¬$ƒeÊ]9)Œ(Œs.ŽÄx:Þ$Mõ{„NºµØ€G¼¨e»õ—3Æ» +T]l@a¬!ýØëÓ¿}h +`ˆ•°Œ…|yñCP_Òv[ŽÂ—òWˆ…±bcmòâÒyí.׎­5ùîu `O¢l…ͧ~ˆjóiÞn]H €÷ü&üÅ|:¡0Ö Aì ž4˜¾ôä¼zÄR½ÖÎðˆ±¸lw”À–N +Þ·3Æ$ÈMÍàM/Ì-1øM˜?Äõ›0i»uüíæ¿Â&å¯Ü„QkP vGO +ÀPhŒƒñÁ®XkÕxÄ4]¶Û*Àù§i]«v@a¬A‚ܰýØ æ‚£V„( 7âÞ4‚ÈøëA ¬AƒØž~REA„‘z­%=àsxÙný{$|,„/—ž%= 0ÖyõÌé°zz3å¯}§Ú×þˆþÝ·ïªëdáï>®“¸Q¼hu<ëÚ³"aàÂvÝé…‘Îe’xÔ?v÷•ÇÔŠg´Y°˜ÓsÂq@Íê™·;~1By³ZFSÆ_˜='Æ2îÇó§®OÓ&x¥å>l­ûÞ÷¢ÕÆeŸ7Í]Ãý²µFHCò¹í_õÜG•YkºxÄ_¶ÛJt^ɾí> 0Ö~î¾?¦ÏÚ×~X{í#|çÚÇÝè]û„½}íû¤!ùØÒ¿$ÏÛɯ{·`I¾kò/Z“oŸ)»oDÉ÷ICòÙ›Sò¢üº7 –ä»ÿ¢U,ùÞ{Qò}Ò9ùèí‚%uÙL=~§O¼û^AÚ☴m&]¾ËØü¹ù˜2W„ÓúÁ‰3ÓÇãg åø]™°† +Ëê6Ö,ÿXÝË +Róaðsz´ðÕö~»¿:loΠ‡ôvãÏ7ó_¾ñOŸ¦_Ÿ~Ò/¸ø‚Óão–>þm<ëïöÇ_ž^¿ÐdþôÇñçËÝï|8¾Ÿë©ÆWŽ]‹TúR«ô]endstream +endobj +5493 0 obj << +/Type /Page +/Contents 5494 0 R +/Resources 5492 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5491 0 R +/Annots [ 5496 0 R 5497 0 R 5498 0 R 5499 0 R 5500 0 R 5501 0 R 5502 0 R 5503 0 R 5504 0 R 5505 0 R 5506 0 R 5507 0 R 5508 0 R 5509 0 R 5510 0 R 5511 0 R 5512 0 R 5513 0 R 5514 0 R 5515 0 R 5516 0 R 5517 0 R 5518 0 R 5519 0 R 5520 0 R 5521 0 R 5522 0 R 5523 0 R 5524 0 R 5525 0 R 5526 0 R 5527 0 R 5528 0 R 5529 0 R 5530 0 R 5531 0 R 5532 0 R 5533 0 R 5534 0 R 5535 0 R 5536 0 R 5537 0 R 5538 0 R 5539 0 R 5540 0 R 5541 0 R 5542 0 R 5543 0 R 5544 0 R 5545 0 R 5546 0 R 5547 0 R 5548 0 R 5549 0 R 5550 0 R 5551 0 R 5552 0 R 5553 0 R 5554 0 R 5555 0 R 5556 0 R 5557 0 R 5558 0 R 5559 0 R 5560 0 R 5561 0 R 5562 0 R 5563 0 R 5564 0 R 5565 0 R 5566 0 R 5567 0 R 5568 0 R 5569 0 R 5570 0 R 5571 0 R 5572 0 R 5573 0 R ] +>> endobj +5496 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [161.8004 714.8637 173.7556 725.7676] +/Subtype /Link +/A << /S /GoTo /D (page.39) >> +>> endobj +5497 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.8077 690.9534 155.7628 701.8573] +/Subtype /Link +/A << /S /GoTo /D (page.89) >> +>> endobj +5498 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.6425 667.043 138.5976 677.947] +/Subtype /Link +/A << /S /GoTo /D (page.72) >> +>> endobj +5499 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3746 643.1327 151.3298 654.0366] +/Subtype /Link +/A << /S /GoTo /D (page.86) >> +>> endobj +5500 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [129.4116 631.1775 146.3481 642.0815] +/Subtype /Link +/A << /S /GoTo /D (page.140) >> +>> endobj +5501 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3746 607.2672 151.3298 618.1711] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +5502 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.732 583.3568 170.6871 594.2608] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +5503 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3746 559.4465 151.3298 570.3504] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +5504 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3746 535.5362 151.3298 546.4401] +/Subtype /Link +/A << /S /GoTo /D (page.86) >> +>> endobj +5505 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.6425 511.6258 138.5976 522.5298] +/Subtype /Link +/A << /S /GoTo /D (page.69) >> +>> endobj +5506 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.788 499.6707 155.7432 510.5746] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +5507 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [149.885 487.7155 166.8215 498.6194] +/Subtype /Link +/A << /S /GoTo /D (page.142) >> +>> endobj +5508 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3746 463.8052 151.3298 474.7091] +/Subtype /Link +/A << /S /GoTo /D (page.86) >> +>> endobj +5509 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.732 439.8948 170.6871 450.7988] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +5510 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3746 415.9845 151.3298 426.8884] +/Subtype /Link +/A << /S /GoTo /D (page.86) >> +>> endobj +5511 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3746 392.0742 151.3298 402.9781] +/Subtype /Link +/A << /S /GoTo /D (page.88) >> +>> endobj +5512 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.732 368.1638 170.6871 379.0678] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +5513 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [139.3746 344.2535 151.3298 355.1574] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +5514 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [150.9911 332.2983 167.9276 343.2022] +/Subtype /Link +/A << /S /GoTo /D (page.143) >> +>> endobj +5515 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.6425 308.388 138.5976 319.2919] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +5516 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.732 296.4328 170.6871 307.3367] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +5517 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.4829 272.5225 170.4381 283.4264] +/Subtype /Link +/A << /S /GoTo /D (page.43) >> +>> endobj +5518 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.4829 248.6121 170.4381 259.5161] +/Subtype /Link +/A << /S /GoTo /D (page.44) >> +>> endobj +5519 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.732 224.7018 170.6871 235.6057] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +5520 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.732 200.7915 170.6871 211.6954] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +5521 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.6425 176.8811 138.5976 187.7851] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +5522 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.732 152.9708 170.6871 163.8747] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +5523 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.6548 141.0156 169.5913 151.9196] +/Subtype /Link +/A << /S /GoTo /D (page.144) >> +>> endobj +5524 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [126.6425 117.1053 138.5976 128.0092] +/Subtype /Link +/A << /S /GoTo /D (page.70) >> +>> endobj +5525 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.732 105.1501 170.6871 116.0541] +/Subtype /Link +/A << /S /GoTo /D (page.54) >> +>> endobj +5526 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.8559 726.8189 367.8111 737.7228] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +5527 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [375.2133 702.9085 387.1685 713.8125] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +5528 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.5781 678.9982 380.5333 689.9021] +/Subtype /Link +/A << /S /GoTo /D (page.47) >> +>> endobj +5529 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [377.9828 667.043 389.938 677.947] +/Subtype /Link +/A << /S /GoTo /D (page.48) >> +>> endobj +5530 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [371.2382 655.0879 383.1934 665.9918] +/Subtype /Link +/A << /S /GoTo /D (page.48) >> +>> endobj +5531 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [368.578 643.1327 380.5332 654.0366] +/Subtype /Link +/A << /S /GoTo /D (page.48) >> +>> endobj +5532 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.5593 631.1775 385.5145 642.0815] +/Subtype /Link +/A << /S /GoTo /D (page.48) >> +>> endobj +5533 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.0886 619.2223 391.0438 630.1263] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +5534 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [388.4933 607.2672 400.4485 618.1711] +/Subtype /Link +/A << /S /GoTo /D (page.48) >> +>> endobj +5535 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [376.8768 595.312 388.832 606.2159] +/Subtype /Link +/A << /S /GoTo /D (page.49) >> +>> endobj +5536 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.6937 583.3568 381.6488 594.2608] +/Subtype /Link +/A << /S /GoTo /D (page.52) >> +>> endobj +5537 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.6067 571.4017 375.5618 582.3056] +/Subtype /Link +/A << /S /GoTo /D (page.49) >> +>> endobj +5538 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [381.0513 559.4465 393.0064 570.3504] +/Subtype /Link +/A << /S /GoTo /D (page.49) >> +>> endobj +5539 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.6068 547.4913 375.5619 558.3953] +/Subtype /Link +/A << /S /GoTo /D (page.49) >> +>> endobj +5540 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.0012 535.5362 384.9564 546.4401] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +5541 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.9678 523.581 385.923 534.4849] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +5542 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [366.3665 511.6258 378.3216 522.5298] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +5543 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [364.7126 499.6707 376.6678 510.5746] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +5544 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [383.5318 487.7155 395.4869 498.6194] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +5545 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [385.7439 475.7603 397.699 486.6643] +/Subtype /Link +/A << /S /GoTo /D (page.50) >> +>> endobj +5546 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [384.379 463.8052 396.3342 474.7091] +/Subtype /Link +/A << /S /GoTo /D (page.53) >> +>> endobj +5547 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [397.6094 451.85 409.5646 462.7539] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +5548 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.2917 439.8948 398.2469 450.7988] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +5549 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [406.7647 427.9397 418.7199 438.8436] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +5550 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.6563 415.9845 391.6115 426.8884] +/Subtype /Link +/A << /S /GoTo /D (page.54) >> +>> endobj +5551 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.9777 404.0293 401.9329 414.9333] +/Subtype /Link +/A << /S /GoTo /D (page.51) >> +>> endobj +5552 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.4537 380.119 384.4089 391.0229] +/Subtype /Link +/A << /S /GoTo /D (page.74) >> +>> endobj +5553 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [379.0986 368.1638 391.0538 379.0678] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +5554 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.8494 356.2087 398.8046 367.1126] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +5555 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [391.2728 344.2535 403.228 355.1574] +/Subtype /Link +/A << /S /GoTo /D (page.75) >> +>> endobj +5556 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.2816 320.3431 398.2368 331.2471] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +5557 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.5408 308.388 390.4959 319.2919] +/Subtype /Link +/A << /S /GoTo /D (page.77) >> +>> endobj +5558 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.8393 296.4328 398.7945 307.3367] +/Subtype /Link +/A << /S /GoTo /D (page.78) >> +>> endobj +5559 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.2816 272.5225 398.2368 283.4264] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +5560 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [394.5903 260.5673 406.5455 271.4712] +/Subtype /Link +/A << /S /GoTo /D (page.37) >> +>> endobj +5561 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.4843 248.6121 405.4395 259.5161] +/Subtype /Link +/A << /S /GoTo /D (page.38) >> +>> endobj +5562 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [385.1757 236.657 397.1308 247.5609] +/Subtype /Link +/A << /S /GoTo /D (page.38) >> +>> endobj +5563 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [389.051 224.7018 401.0062 235.6057] +/Subtype /Link +/A << /S /GoTo /D (page.38) >> +>> endobj +5564 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [393.4843 212.7466 405.4395 223.6506] +/Subtype /Link +/A << /S /GoTo /D (page.38) >> +>> endobj +5565 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [392.3784 200.7915 404.3335 211.6954] +/Subtype /Link +/A << /S /GoTo /D (page.39) >> +>> endobj +5566 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [363.4177 177.5984 375.3729 187.7851] +/Subtype /Link +/A << /S /GoTo /D (page.56) >> +>> endobj +5567 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [351.9805 165.6432 363.9356 175.8299] +/Subtype /Link +/A << /S /GoTo /D (page.60) >> +>> endobj +5568 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.5408 152.9708 390.4959 163.8747] +/Subtype /Link +/A << /S /GoTo /D (page.56) >> +>> endobj +5569 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [373.5594 141.0156 385.5146 151.9196] +/Subtype /Link +/A << /S /GoTo /D (page.56) >> +>> endobj +5570 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.5408 129.0605 390.4959 139.9644] +/Subtype /Link +/A << /S /GoTo /D (page.56) >> +>> endobj +5571 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.5408 117.1053 390.4959 128.0092] +/Subtype /Link +/A << /S /GoTo /D (page.57) >> +>> endobj +5572 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.5408 105.1501 390.4959 116.0541] +/Subtype /Link +/A << /S /GoTo /D (page.57) >> +>> endobj +5573 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [378.5408 93.195 390.4959 104.0989] +/Subtype /Link +/A << /S /GoTo /D (page.58) >> +>> endobj +5495 0 obj << +/D [5493 0 R /XYZ 90 757.9346 null] +>> endobj +5492 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +5576 0 obj << +/Length 3800 +/Filter /FlateDecode +>> +stream +xÚ¥\kS7ýί¸¡ÊRô~äìµ±®cg³) +õC-–GÿûmÍÕH©çŠ-*UñN÷‘δº[Ò_0ø/<[Xm©—Ê,οm±ÅWøöë-Là礼\nýðJø…§Þ³X~<Nµàb±¼ømûðhÿàÓÎïËŸŠ9Ê´GáûBëðÝ­ƒeòɵ4<øþïÖo¿³Å âç-F¥wzñ|Á(÷^,¾m)!Ç/®¶N¶þ™ü¬0`sÐ\b“Å$8ƒÏBË…ðÁ®gòxy{zy{vqqwzþíöE=zîf=Ú Üá'w_#ä¸E‚“Œ¤öF¢]CîA +ý”¼šxu(Óä¹¥Ž3ÛÌþæv‡³íJ!U¶ìiñ¤4ÀD¨ýΩ ¨p=SþF†ˆê±&˜¦FyUëðíìþ?ˆŠ2gL¶êiñ¤4À4¨ýøVÀ)XSþFƒˆê±Ž/©rŽc`«A0N…<n–!áIiШõ‹Ëk† +¦lÅ_ÉPVÈLÆqˆAãF.V;Boÿùåñú|Èn< +E¸ Ü@Š…ú¼#Øöã—6P”¦–ÁDŒ­{qá¤Ä#¬ö†¡TC®á©i+ö:JFT4E dUÆT‘/¯oÚ©kI9+à©G8)ñÈ(j¯ÃÔyCn$e€©Øë©¨išºRÔ)(…ãÔoWw—7—çíì¦ÂØÂ¤3ýOJd(ßAÑð[À ï+þZ€ÕcMHAa‘˜F¨××HžôÔpí³]/OF<) °DT5ÍžqÈÉ6×ÈW‡ŸöC>ØÝß?FÔ_˜õòÀNJ<–*¯3?•Ñ {“RQÞL:J §Jk7•à`ùª€€.Òihº’Yg ŒxR k ñ;#‚œ€VrÊ_‹0¢:¬Yk©ð*Ç7‡'˃£÷ïŽw Û^žà¹@ƒA²|B.xRÌä‚‰ß ¹ <Ü)?– ªÃšu0šr)sq|óæ§Ó7H¯8¬4Ø‘d‹^9ˆxR`å ö;Ì_ãÇ€FTüM9ˆ¨kš¿Ô[žÏ¡®n¾¢gŠŒîoœ<) ðóÔï0w‡mœ%‡†oÊlœT5Í]±p«eò³÷úõáÑkäøSɬȽó·ˆ'¥vWûyöžC{ì)sQ=Ö4á–Ló‡=ÂzùBÂßQͬÍF½ðxR`á_û ·>«ò7áQ=Ö$7á6«Tàä×£Y`ªÀs2ëUÃ'«†•W\ÎU½ÖSò¦FP‡2ÍŸ©pY—»Á÷ÿ¡BSôê¶Qóú¶dÖ«…OJ¬Ö~g$€“¡Lø›ZQÖ$‚ðá HçŽðø`÷ääàíË7°=`Û¿¢µÐqØÆ$Ë~-ð¤4ÀkáÔïŒP嬅ϔ©…ªÃšup,\àñB‡½ƒpxòñðhØ.~l¥†Jéx6îH1âIi€HÑø¤0 ¿\h§§üµ#ªÃš¥06\ååİN ;Üm¿{•'æ` ’¬zçªOJì\µö‹kî3™‚ÖÊßœ«FT5i.µÇ{Á ÁÉúôd‡s¾½„vñpï½­ÚÖýÛÊOJü¶rêwF 8ø_ÅÜV¨kÒBÉémåýÃÙÃ=v´ª<3• z¡°†“EBåuæ\ÕLS±7Q=Ò4yÉ'W•ç·§g··A‚&Áúí)ìzU2ÂIǪdå— ¤PÞ‹›7U2‚:”IîóÅ`X Ë=hNNÐMZd‹þ&aÀ“Òß$LýÎD?¬欯ø‘M€걦ù3.*s\¾…ª°ÃÛÞ=\_¾ûÐ# +驳¶pÐ)#ž”HqhüÎ8’Á„¿Ž†ÕaMr„wœչN.—o^`— axF÷2AÄ“ÒKµß¹¢ Âí—­ø›\Q=Ö4w'ÂU¬›ÜÛoL°ƒî6ö²AÄ“ÒKµ_|ë(à¬ð)“"ªÇšd°,\Íæã“ûïO÷~:ØûÇɇ·Èá‰àr—Èv½.)âIi€uIµß™¬iÎxXñSþ¦KЍkVA‡Ýχ'Ž_¯Ï×=ÂÐ. /¿ +¦²uÿÝ×'%õuâu¦D­0¿);òæë€êz@+³~ý+.ˆûÛ«ÞË äôæñ}å/¼Ç,<*©Âm¯yÊëÑOJƒ™÷£'~¡él#&kÈO mÕÞw³èˆ'¥2äÆïL³ û7èŸM=€º-Q=Ú¤”fÔ(¥ÐfŠ?Y(éž^>]¨Â`“P#l¦âf¡&˜j3m +Ö˜•j¶}^PAî´Öù§kUlÒj„uµš `^«Í´I+^w“n¾e}–ZÊ3êúGoY­Ò`ƒZ ÖSk:€Yµ:´£ZÊ:ê¹T³]íóÄ2ðîé˰4Ø$ÖëŠ5À¼X›i“XáÒIÞ6¾ÏSIIÊ”}ú, 6©4Âfz¬Òdó*m¦M*Ép:#ÜLoü<©Â¥¤´ÿÇê+ 6I5ºRM0/ÕfÚ$³”;¡fÚçgI%}øÝóþYf’ª4Ø U‚ÍtUI„éf¥êÐŽRI;+°ûy2YN%7O_|¥Á&™FXW¦ÉæeÚL›dÒžÊpi;•i¸‚EDTI/²UO„ˆ'¥&BíwA!}¥£ð`ë4"DT6‰ ìzK‚ïDž/¶Њ<=^ +ƒMñ2ºñ2@}MëÇxFQÉð;m¶þ‰yÖˆþŒ•^¾HîPImè¾ÖÅ +¶¤*¦Õ׫ëÕÝÙÃx§uï´ÞŽ~—ñ .â¿ìG!lý•`̬?} ×]7wÕµžõ‡Ïß×ÿîßüýýëêºS$ë¡úüH7endstream +endobj +5575 0 obj << +/Type /Page +/Contents 5576 0 R +/Resources 5574 0 R +/MediaBox [0 0 595.2756 841.8898] +/Parent 5491 0 R +/Annots [ 5578 0 R 5579 0 R 5580 0 R 5581 0 R 5582 0 R 5583 0 R 5584 0 R 5585 0 R 5586 0 R 5587 0 R 5588 0 R 5589 0 R 5590 0 R 5591 0 R 5592 0 R 5593 0 R 5594 0 R 5595 0 R 5596 0 R 5597 0 R 5598 0 R 5599 0 R 5600 0 R 5601 0 R 5602 0 R 5603 0 R 5604 0 R 5605 0 R 5606 0 R 5607 0 R 5608 0 R 5609 0 R 5610 0 R 5611 0 R 5612 0 R 5613 0 R 5614 0 R 5615 0 R 5616 0 R 5617 0 R 5618 0 R 5619 0 R 5620 0 R 5621 0 R 5622 0 R 5623 0 R 5624 0 R 5625 0 R 5626 0 R 5627 0 R 5628 0 R 5629 0 R 5630 0 R 5631 0 R 5632 0 R 5633 0 R 5634 0 R 5635 0 R 5636 0 R 5637 0 R 5638 0 R 5639 0 R 5640 0 R 5641 0 R 5642 0 R 5643 0 R 5644 0 R 5645 0 R 5646 0 R 5647 0 R ] +>> endobj +5578 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.215 726.8189 191.1701 737.7228] +/Subtype /Link +/A << /S /GoTo /D (page.58) >> +>> endobj +5579 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.3271 714.6576 193.2823 725.5615] +/Subtype /Link +/A << /S /GoTo /D (page.58) >> +>> endobj +5580 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [183.0903 702.4963 195.0455 713.4002] +/Subtype /Link +/A << /S /GoTo /D (page.59) >> +>> endobj +5581 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [200.2458 690.335 212.201 701.2389] +/Subtype /Link +/A << /S /GoTo /D (page.59) >> +>> endobj +5582 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.7047 666.0124 156.6599 676.9163] +/Subtype /Link +/A << /S /GoTo /D (page.44) >> +>> endobj +5583 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [152.1068 653.8511 164.0619 664.755] +/Subtype /Link +/A << /S /GoTo /D (page.41) >> +>> endobj +5584 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [164.271 641.6898 176.2262 652.5938] +/Subtype /Link +/A << /S /GoTo /D (page.42) >> +>> endobj +5585 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.6196 629.5285 200.5748 640.4325] +/Subtype /Link +/A << /S /GoTo /D (page.43) >> +>> endobj +5586 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [171.4741 617.3672 183.4293 628.2712] +/Subtype /Link +/A << /S /GoTo /D (page.43) >> +>> endobj +5587 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [184.1963 605.2059 196.1514 616.1099] +/Subtype /Link +/A << /S /GoTo /D (page.43) >> +>> endobj +5588 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [208.5449 593.0447 220.5001 603.9486] +/Subtype /Link +/A << /S /GoTo /D (page.44) >> +>> endobj +5589 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [143.798 568.7221 155.7531 579.626] +/Subtype /Link +/A << /S /GoTo /D (page.61) >> +>> endobj +5590 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.9136 544.3995 156.8688 555.3034] +/Subtype /Link +/A << /S /GoTo /D (page.40) >> +>> endobj +5591 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [158.1937 532.2382 170.1488 543.1421] +/Subtype /Link +/A << /S /GoTo /D (page.40) >> +>> endobj +5592 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [136.6051 508.6329 148.5603 518.8195] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +5593 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [131.6238 496.4716 143.579 506.6582] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +5594 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.0594 484.3103 214.0145 494.497] +/Subtype /Link +/A << /S /GoTo /D (page.83) >> +>> endobj +5595 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [202.6172 472.149 214.5724 482.3357] +/Subtype /Link +/A << /S /GoTo /D (page.83) >> +>> endobj +5596 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.3295 459.9877 211.2847 470.1744] +/Subtype /Link +/A << /S /GoTo /D (page.83) >> +>> endobj +5597 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [194.5275 447.8264 206.4827 458.0131] +/Subtype /Link +/A << /S /GoTo /D (page.83) >> +>> endobj +5598 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [175.2499 435.6651 187.205 445.8518] +/Subtype /Link +/A << /S /GoTo /D (page.83) >> +>> endobj +5599 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.6981 423.5038 211.6533 433.6905] +/Subtype /Link +/A << /S /GoTo /D (page.84) >> +>> endobj +5600 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [168.7045 411.3426 180.6597 421.5292] +/Subtype /Link +/A << /S /GoTo /D (page.84) >> +>> endobj +5601 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [192.0967 399.1812 204.0519 409.3679] +/Subtype /Link +/A << /S /GoTo /D (page.84) >> +>> endobj +5602 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [211.8625 387.02 223.8176 397.2066] +/Subtype /Link +/A << /S /GoTo /D (page.84) >> +>> endobj +5603 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.6582 374.8587 211.6134 385.0453] +/Subtype /Link +/A << /S /GoTo /D (page.84) >> +>> endobj +5604 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.6573 362.6974 190.6124 372.884] +/Subtype /Link +/A << /S /GoTo /D (page.85) >> +>> endobj +5605 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [144.3559 349.8188 156.3111 360.7227] +/Subtype /Link +/A << /S /GoTo /D (page.88) >> +>> endobj +5606 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [180.311 338.3748 192.2662 348.5614] +/Subtype /Link +/A << /S /GoTo /D (page.85) >> +>> endobj +5607 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [177.5114 326.2135 189.4666 336.4002] +/Subtype /Link +/A << /S /GoTo /D (page.85) >> +>> endobj +5608 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [197.4366 314.0522 209.3917 324.2389] +/Subtype /Link +/A << /S /GoTo /D (page.85) >> +>> endobj +5609 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [212.9782 301.8909 224.9333 312.0776] +/Subtype /Link +/A << /S /GoTo /D (page.85) >> +>> endobj +5610 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [199.8175 289.7296 211.7727 299.9163] +/Subtype /Link +/A << /S /GoTo /D (page.85) >> +>> endobj +5611 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [225.3418 277.5683 237.297 287.755] +/Subtype /Link +/A << /S /GoTo /D (page.86) >> +>> endobj +5612 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [154.0895 265.407 166.0446 275.5937] +/Subtype /Link +/A << /S /GoTo /D (page.86) >> +>> endobj +5613 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [188.261 253.2457 200.2162 263.4324] +/Subtype /Link +/A << /S /GoTo /D (page.86) >> +>> endobj +5614 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [157.0877 240.3672 169.0429 251.2711] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +5615 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [189.1772 228.2059 201.1324 239.1098] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +5616 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [178.129 216.7619 190.0842 226.9485] +/Subtype /Link +/A << /S /GoTo /D (page.86) >> +>> endobj +5617 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [238.881 204.6006 250.8362 214.7872] +/Subtype /Link +/A << /S /GoTo /D (page.86) >> +>> endobj +5618 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [153.2028 192.4393 165.158 202.6259] +/Subtype /Link +/A << /S /GoTo /D (page.86) >> +>> endobj +5619 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [191.947 179.5607 203.9021 190.4647] +/Subtype /Link +/A << /S /GoTo /D (page.88) >> +>> endobj +5620 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [220.739 168.1167 232.6941 178.3034] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +5621 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [181.2077 155.9554 193.1629 166.1421] +/Subtype /Link +/A << /S /GoTo /D (page.87) >> +>> endobj +5622 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [179.2346 130.9155 191.1898 141.8195] +/Subtype /Link +/A << /S /GoTo /D (page.89) >> +>> endobj +5623 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [155.6932 118.7543 172.6297 129.6582] +/Subtype /Link +/A << /S /GoTo /D (page.196) >> +>> endobj +5624 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [236.3796 93.9122 248.3347 104.0989] +/Subtype /Link +/A << /S /GoTo /D (page.61) >> +>> endobj +5625 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [353.106 727.5361 370.0425 737.7228] +/Subtype /Link +/A << /S /GoTo /D (page.114) >> +>> endobj +5626 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [355.1585 715.581 372.095 725.7676] +/Subtype /Link +/A << /S /GoTo /D (page.120) >> +>> endobj +5627 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [403.9849 691.6706 420.9214 701.8573] +/Subtype /Link +/A << /S /GoTo /D (page.115) >> +>> endobj +5628 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [399.5614 679.7155 416.4979 689.9021] +/Subtype /Link +/A << /S /GoTo /D (page.116) >> +>> endobj +5629 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [414.4954 667.7603 431.4319 677.947] +/Subtype /Link +/A << /S /GoTo /D (page.116) >> +>> endobj +5630 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [420.5824 655.8051 437.5189 665.9918] +/Subtype /Link +/A << /S /GoTo /D (page.116) >> +>> endobj +5631 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [408.4181 643.85 425.3546 654.0366] +/Subtype /Link +/A << /S /GoTo /D (page.116) >> +>> endobj +5632 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [386.2814 631.1775 403.2179 642.0815] +/Subtype /Link +/A << /S /GoTo /D (page.117) >> +>> endobj +5633 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [412.2935 619.9396 429.23 630.1263] +/Subtype /Link +/A << /S /GoTo /D (page.117) >> +>> endobj +5634 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [413.9572 607.2672 430.8937 618.1711] +/Subtype /Link +/A << /S /GoTo /D (page.118) >> +>> endobj +5635 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [390.1568 595.312 407.0933 606.2159] +/Subtype /Link +/A << /S /GoTo /D (page.118) >> +>> endobj +5636 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [409.5338 584.0741 426.4703 594.2608] +/Subtype /Link +/A << /S /GoTo /D (page.118) >> +>> endobj +5637 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.1259 560.1638 386.0624 570.3504] +/Subtype /Link +/A << /S /GoTo /D (page.115) >> +>> endobj +5638 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.1259 536.2535 386.0624 546.4401] +/Subtype /Link +/A << /S /GoTo /D (page.116) >> +>> endobj +5639 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.1259 512.3431 386.0624 522.5298] +/Subtype /Link +/A << /S /GoTo /D (page.116) >> +>> endobj +5640 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.1259 488.4328 386.0624 498.6194] +/Subtype /Link +/A << /S /GoTo /D (page.116) >> +>> endobj +5641 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.1259 464.5224 386.0624 474.7091] +/Subtype /Link +/A << /S /GoTo /D (page.116) >> +>> endobj +5642 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.1259 440.6121 386.0624 450.7988] +/Subtype /Link +/A << /S /GoTo /D (page.117) >> +>> endobj +5643 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.1259 416.7018 386.0624 426.8884] +/Subtype /Link +/A << /S /GoTo /D (page.117) >> +>> endobj +5644 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.1259 392.7914 386.0624 402.9781] +/Subtype /Link +/A << /S /GoTo /D (page.118) >> +>> endobj +5645 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.1259 368.8811 386.0624 379.0678] +/Subtype /Link +/A << /S /GoTo /D (page.118) >> +>> endobj +5646 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [372.443 356.9259 389.3795 367.1126] +/Subtype /Link +/A << /S /GoTo /D (page.145) >> +>> endobj +5647 0 obj << +/Type /Annot +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [369.1259 333.0156 386.0624 343.2022] +/Subtype /Link +/A << /S /GoTo /D (page.118) >> +>> endobj +5577 0 obj << +/D [5575 0 R /XYZ 90 757.9346 null] +>> endobj +5574 0 obj << +/Font << /F29 499 0 R /F23 482 0 R >> +/ProcSet [ /PDF /Text ] +>> endobj +4977 0 obj +[474 0 R /Fit] +endobj +4919 0 obj +[474 0 R /Fit] +endobj +4902 0 obj +[474 0 R /Fit] +endobj +4878 0 obj +[474 0 R /Fit] +endobj +4857 0 obj +[474 0 R /Fit] +endobj +4670 0 obj +[474 0 R /Fit] +endobj +4576 0 obj +[474 0 R /Fit] +endobj +4531 0 obj +[474 0 R /Fit] +endobj +4521 0 obj +[474 0 R /Fit] +endobj +4495 0 obj +[474 0 R /Fit] +endobj +4466 0 obj +[474 0 R /Fit] +endobj +4447 0 obj +[474 0 R /Fit] +endobj +4403 0 obj +[474 0 R /Fit] +endobj +4354 0 obj +[474 0 R /Fit] +endobj +4324 0 obj +[474 0 R /Fit] +endobj +4316 0 obj +[474 0 R /Fit] +endobj +4299 0 obj +[474 0 R /Fit] +endobj +4282 0 obj +[474 0 R /Fit] +endobj +4258 0 obj +[474 0 R /Fit] +endobj +4240 0 obj +[474 0 R /Fit] +endobj +4219 0 obj +[474 0 R /Fit] +endobj +4205 0 obj +[474 0 R /Fit] +endobj +4182 0 obj +[474 0 R /Fit] +endobj +4150 0 obj +[474 0 R /Fit] +endobj +4123 0 obj +[474 0 R /Fit] +endobj +4104 0 obj +[474 0 R /Fit] +endobj +4075 0 obj +[474 0 R /Fit] +endobj +4059 0 obj +[474 0 R /Fit] +endobj +4037 0 obj +[474 0 R /Fit] +endobj +4017 0 obj +[474 0 R /Fit] +endobj +3985 0 obj +[474 0 R /Fit] +endobj +3956 0 obj +[474 0 R /Fit] +endobj +3905 0 obj +[474 0 R /Fit] +endobj +3890 0 obj +[474 0 R /Fit] +endobj +3700 0 obj +[474 0 R /Fit] +endobj +3699 0 obj +[474 0 R /Fit] +endobj +3698 0 obj +[474 0 R /Fit] +endobj +3697 0 obj +[474 0 R /Fit] +endobj +3696 0 obj +[474 0 R /Fit] +endobj +3666 0 obj +[474 0 R /Fit] +endobj +3665 0 obj +[474 0 R /Fit] +endobj +3664 0 obj +[474 0 R /Fit] +endobj +3663 0 obj +[474 0 R /Fit] +endobj +3662 0 obj +[474 0 R /Fit] +endobj +3661 0 obj +[474 0 R /Fit] +endobj +3660 0 obj +[474 0 R /Fit] +endobj +3659 0 obj +[474 0 R /Fit] +endobj +3658 0 obj +[474 0 R /Fit] +endobj +3657 0 obj +[474 0 R /Fit] +endobj +5648 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 1/dotaccent/fi/fl/fraction/hungarumlaut/Lslash/lslash/ogonek/ring 10/.notdef 11/breve/minus 13/.notdef 14/Zcaron/zcaron/caron/dotlessi/dotlessj/ff/ffi/ffl/notequal/infinity/lessequal/greaterequal/partialdiff/summation/product/pi/grave/quotesingle/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde 127/.notdef 128/Euro/integral/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/Omega/radical/approxequal 144/.notdef 147/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/Delta/lozenge/Ydieresis 160/.notdef 161/exclamdown/cent/sterling/currency/yen/brokenbar/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis] +>> endobj +1228 0 obj << +/Length1 1642 +/Length2 9543 +/Length3 532 +/Length 10417 +/Filter /FlateDecode +>> +stream +xÚíteTœí²%Ü»»»KÐ঻ÒÐÝ4¸{‚»‡@pw ‚»OpK0äûæÜs×™¹î=¿fM¯õözŸÚU»ªž]o±0èò(€a¶U˜ ’G€—_  u¶uGÀœuaÚ<:0T t<`"¸,,Jp …¹(‘I€  P†€‚‚ \€ÌÕ µw@Ø L8¸¸¸ÿiùã°õúò‰€Ú»X^< N0Wgˆ òâ¿h€Ô Pz¦g¦¡«`WÓ5¨A\ ð‡&ôÜm  €6qA@8v08ÀéïsCÿ´†à}àR@€„+}ƒx‚ ® n€+î E ÞPÀtA>Ü€º€œÜÁ +x°ÛÁþ*È{ðp~ÀÈô`$‡º"Yõ”Uÿ®éDþÉ€>À˜Ýƒ'rÿÓÒ_ØÍŠB]$Äù'—-†"\€^¹È\áпÊpG@]ìÿY7±ÂÁNâæûÏíü³OÀêèêêäõW4ì/¯ÿ¨ŠD@œìxqr‚¹í¡.¸|æEÃÅàÿÛvwýæÿuAìf†ã¡ æâäCìpùtaȇ”öÿžÊ¼ÿ>‘ÿ ÿ[þ·Èû?÷_5úOñÿô{þWjUw''] óÃü½g‹èxØ5mÀŸeãî ø³o  ÿ#è uòú¯bÿÕÛòwÑŠ0'ð¿bó+¸Ø?¨Ã# Â+ô·ŠP…zBÀzP$È`tz¸¸¿ìÆ.`Ü êyø¯»}âçÿÌÈ +rtù£„ÈßÄü¯ ±ò\îñ>Çô~¹ú½¥qú»V?Htøº‚ÃW“&<À@àu<$-p2‘Ñ›9,œ ×!ñ^T×}žE-ÅIëµÓºü´Ÿ¹ÀÄÏÜŸ´’˜ìZß>?—mÙL™ay3NQï•ÙŒU†È1}—&Ʀ—9Þ:è nÞ«ÿPGÑXKb—fÄê~M½í{K$øÉ: ›Œ0Â!øjìÛ£*”2â,Á6^ qLû¼ÔBž¥cÉõ>Þ©;7!u‰ûâh­zèo»SÏõœ7ML˜OëŸhÐÈNAQ"©wõû®})ÆÌÌ×1°Ù ÃááÌŽ”¹å1W èOç›Ã„ßèA)µhA{‹àöY+(R” GB9sRÄÆ'ýÔ&»‹Œ¥U7H?^O°27ù6ÓòÂ%*Gü©­¬øÐ³¹Ÿ²¿JˆÚ&JD Ú›EõaºêÇ¥Sß +Sú™ë§)[£*³Ö(AB¾i½Ä‰½'ü#ÇrRmB[À“ó@6ϱ®O¼þ÷Cg—ò0²Ö°Ü„pWbÑH×G?NÊ _¡±C@qRÒ_P몵o5M¥$`CžhrAñŸÊ¼6 “ïÂËï”|Jã<Üû[¯8J Ø”{…NÑ'2éqGÎt¼i‚?^oã½­4v4^¬Nu5Óm蛼ãZ¹Aøc‘Ös¾›6Ý!À"Bäí,r0A¼–Œg_@Œ?˜<Ù}2ÐÈßTm“»”lÔä„ϰØz&iî›ð¤†2ŸE‹Ü­¤>ÝzC°)º ÞEô±éÉQ׎®VQ+¶‘L˜ÿ±®)Üƶ-ë"[|B°G™&~©v„f_çù}ÆmVõE¬‡ˆk—F‹Ì¤f?®®"ëÕáôÒ7ÔQV ÂGÑ8=V?B&,'¸{ÚÒt¦‘#©˜{*øei£†Æa+= ¶²ì"»P>ÓEèäbŒP2¤ +ÐÕæQÄ1j…[b’ùN미ÆbódäNì”êÅ϶lÐk3¡-Ù ØPÞIšD l])H‘Üf`é„éÀ]Ÿ4V{ÅJÏŒ%59°¹¬ñ“u^°½ü©é A»žæ1wóúÌ’ö´æ¬\ìà5 SÃ÷ÀW‡:.+CÆÄ ÜzŽ‚@®¯£VI¾‘*(Õm(ÏÛý¢¬ICÌÌ â¢&-ÃŽÚœ±Ô†œtÚÁÇ·|´sÊÞcùzŸ-XZ³²WøÌ|cµðÓbM+?©-QMãYë1/Ö(ì‚sòÚ£Ô>HiN:WöaÆîƒx÷ò +ªÞŒïqv†.=«ÆW—ûMJ~™xaÈ:Ü·0æ ®éΖ.ùerH5Ô»‚yåLl´ [–rxzO.³:ׂ¿ÊŠœEl²XiˆÏb¡’ü×O>8¾eaùš™ðÌφíNý„oÎÍn2ñ>R;Ê*±´­bõŠ 8àÿfj÷G,öã¶–T̳ÇvørÎô ;Ahò;¯'Sª‘²2äAÁ"TOü ³/î¨ʼn(»,Õ>Q­æ;’6d+ +J UŸÇt:–I#ØÆù…-ÐÕ„ðÌÎÁ¾|;");üâ!×^Žx‹Þ Zø +: +v +zÖ'®uDÞ]Á1Ø +­q'lw¥Nß]Ðùh4T)&Žoе9/ÌåÒÉ=µRT½é{ׇ]óK¶äg1:‰¾u17´‡ç t§²nѯî!4ðé&vÑõ-Ù×3†P¢j éO{åËp¨ÏX6©ÝŒŽ•×çÝ…‚€É„ËÃÔX;¨›GåÂx­šw“E`èð4ÍWL¶ø¬ œÑÃÌÖ $¾ÖŠï6ë%S¶ŠþmF ·õ‡ Ú„òÜzR0Þ÷# ]o&…¡yKUübÚ“ +[¦®dã…ç ®ú˜× êLßÀàʰå¾W²Mï³äã²v#ù_[i5 >ëé¿4 ÉÆ\“ý*NÛW™=á·°eþf¥â(ÕäÕÆlè ž~¸w¨%åÇŸŒ›vœ±YëO|¶ö‚M—û$´Lce÷<ÞÞÇÚ1D:<{y öûl)&DÙAÀ¬0µ@.lFΧßûÙ;šö­áXî%ì‡!³0â·>{§“ô?oehqcöÔhBÅá—“Ã÷öMKy…ëkg¥¡¦Úõ5 šk© Fùã{òÄ‚) Òg³eí¿'Y<¸{y$Ä‹8;WûŽ&·f¹¯ wLù|ÃDì¢ÔŸùzCdãÔ8lç;+è°JoI/¤°.kÐö±ìM¼4Iß;ª–eȨÂçqÈ©å`Õ¦M/¥Ÿ/ÒØç/«X'Õ-ÝŒ™&󎯲Âpö­µ&ö•¨ ¹$Gæ¸f( +·Rmë· úô4WެØy +óÕ]~Ö;¿ª¥/ö(32uô Ñq¿o}ïBă_#«QŸ5lîáýÙ¾öUFµÂKQš¥ÙÓ†ÆSe~ÝnÚÇëxaJé/ÈSØÀxš­ªe¨*N3¶,®xßQx±_ðç}Ôys=téþ”l’>À‡Ý¦g#ze©’ÿF°µñŽõEª5úQUöëq¬Žr&g­Æ±/i=ª3h²¶zÈ7¸4ÏÝw˜xì” X±ÅÎàî°GUÜ“¿¢É”¨U™¬Ÿ  óSµUè'âw­ÚTž¥¸»‰ºP>ûKNI÷ó¯hC%> hC±‡5£n {6xŽ K+µ[¤2É^•×´Í—Òú“(Ç6|>¶®»ña\cÑMñ<¢L¹ç‡âyx=í&S9•>ŽÍž³±øjTœûŒ_XqÃÌÀÏÙBÏUúâ ëaÚÛ×øØK$òvÕwXn"Ô¹+ ãÀŸåE*Ƴƒ„ã÷ó‡´Žøt\Ù\ò¨¥…ì³á!eÜZŸÜ‹÷® CܨUc’XÇ~9mZ + 2Á£}ŠK¢8z’ kšl¤„²73_¦lY9ùŠO[=ö9Œ×->?%ÈÈ¿ã>ª®&[îj÷×ó.#5“<–‡·gteùÚº‘øë¿\eU‰Ljšì/¿ªžT(zV¬Iû/3Ï^$|Ÿ~º8§Ó&\oâeFïÄÀsœ8;q¸‚¦ä¢‹ÑPÈS ýX¶ËMúéi¹ׄíeSßÀŠpalÚšcBÉ{Ô,se艨Ÿžo±•…æZØzÆ8<Ã0ï\xg° +(ÌŽê˜iÀö˜æ$ŒÌÆ™ê63àìñ!Cʹ‡uæH9ËpTÏvÓ ¿* :Å$/“6RÖq µRZ3ƒÈ¶Ç­â ôyÁ¼aÉ"/µN’¼,í.ô*/¤Žñ"ÿW4šo2ª²ñ¥õÖe -¿'™0ó‡¡Q{ª¤®ÏÇÎóVæÑÍ•n/ì^£›lW^™›Ë–†(¶ÂÏ­ž ¸^ó4;ó‡Ï²(ØÕ­èo¬:œÞù2•òåw±|¡Hq]x%`ßÁâÝ/{5²ý%¸ª_"qÉuÓ§nÌH:û£n€&f!cèµMìïS]Ì!æeK‹ß6 ¾1—“…yËdi#¢Oº†ÒšìÝ¢pË5פì tráMs°¯§)ß”ãŽûì <ýC0ŒE¶5_Žr”ÚRŒŒÊWQóÏP(5¯¼\L°ÜåuEU3þ^S“÷NU£ÐY,µQÐZU|Ý,=ñ³_?6ÛÁÇz‹ WFXR®­àøJ[þM^{êúµ~|zÏ»_¿®½­·s–2Œ†eÍå0_gÒˆnÏ™ƺ`jÝèBq>Œ` 7ÙíâÜÅ'8KGÑñLxÂeÌô[Hÿå9º ²6¹¯›à$L8/Q&׳rѪøb$sãJÕu/½AÕ:`P&bTíƒÄkÁÍ9i‘K¼±³Ü~C¾úVwÛ¡ îäÜûæ•ôœÍÊ=”Ý"c{.)­Ú2¥‘GˆS=wÉ$ž½WÙ¶#fèÕOOfZ^Š(¡rGÝkò¥qd$ÂiÁúYÎTµïÝ„h&YÊ!‚†@•OhC‘}×Fßætz^O ák|ìé·Ñv!wÞ¥}ˆg•O¸—ùuTi¦ã[ô˜¯k&&æl'@à­s8‹Ã›‰t+˜îN¾’ó$ÿ¹×3 7ï¢ÐæÓå/?a—¦ Z³½™ȯý˜}DUoþ·ŒPr«ô铯‘}?¡¥rêÉÒÒ¨l ½ ËÍ)$²AE°mØc¼ O£È²MÁ2l 6)믞Œ”±¬"úG,Ï^°oÄ4°{Ó"Cõ`ŒG²•ý°[Ÿ ¹øÚ¬-¥v +m‹Ïz`åþcæF¾›W?Øæt8Fd³°Q»º¼@¡#ôEruÈ he_HÙÕý£³†¥(aa¨ s G‚_=am#;ì¡½ß¥êø´´Ãþ’${<\( `ÎÏÝ¿€™Ó•ç~ˆ|OÐWÉ>u<§â ‡~™–`izå‚xLÆç¦nØÏT¯BßÅG¢¼4ßÀdiÌš@µ‰ž¿:ì×z_{«"tŠe}]Ò“ïVÂÎ-Æ ©È äáíõ¢·É zÉ28pÔµìFü*ãðÍΣEþGÏ/SÄÙÊ£ú¼*Ñ‚pñ¹ýŸ%.Ÿô‘²c- ^ÚsI=£]ÎUº=IÔañ3àºÍ ›©}Ž,®âuH._›Ÿá˜Ôq­þ_CrrÿÜ×´¿Ê&àÓa™Í™föÕ¾ŸXÌ¡Áž{•”Tjè>t%Hw†b +@ç­L&¾úŽ 1b”ŠJgK.£”œÔK­pÆU¨jRHM–œžTönúŽÏJÚó“+}¡KM2˜Y€Ð¨DŽ­Èò-õýòkŽ_¸à°"“.S… Ô>ÙzŠò®TRñ·ÕSÙÊ.ØöDí&ÒGOgB ŒG–™Ã9`­›ˆÑ㛫Ǧ'[|$”d@ðnyê‚(ÑγÔÂÇøWž¼m½;nõê%Ê~LKM_nÉ_¤ pîïq"¬»bíÿ~ãg2PÁPwƒéà'Ò‚é^9VzMÎr. w´\3Ħ¢ÿÜ…—|JÞ¹ò‰¬¦8)lca™mcÕ1ÑdÕ{“âØù ŸxmîKI6WbíËJ±bÜ Ù~´ãpºã¨-žÌ+Í;mÑ +iKšo¬ŸJb½1|ùÁÉè@°}vP‡–¿žë¸Ý,÷}üó3É<) Ÿ<Å+pÞ0Y„óbB@——(pH種èîjk· øõTÎ,bÒ#¡@L]QÈS.3oïÒMâÂå5ëÞ+z±FÌ™}ùI¥v«`øM˜7Éó`†7öß¾W” +Û²A5Z>:Áo¡àE±Í­/o}½ëFLOºî&~™œzïšó9)‡‚´©60†ò¸›®ƒH$œ#æH†¥I3(‡gOPŸÊ(Äå¸5C¾.Ë–éødøO}Ÿîx^ÿNEòûÄ +W¯¨“šõ±¥rÞ¼å^_þDo°Öž}— ,q8$<®´Šjf•‹Xm`ð‡®±êÝgr‰ŸÄ ];á?.öÔZ¡ðwl'–o£iqMůƒ<ÔQ…ߺݿ'YEIÜv­#’4«×| Õ¼]°'ò^S™ú­•0b;;ßqp¦P3ؘᖠó/Ó®å&† Ô=¯{å툜4ñð7°!\H^.³âÉ»^ûN¨Åþ#ÞÞ˜„²¾°BF3õ•-‰ØÌ9úg©kº.± ð´>ì^Jí=å˜ZÁ;¢¹¨–!Û,N–\H-¬ ³±Ž$¨©_ÃiÉVÆÔæÍóÔÓ¡•ÕO`Oíì&Aõ“ý³~ºýSôñß!ߥRª‡PkŽƒ``ì¦)<ïKÖƒz\³S>ɨYÖÑ»ÇàÅ©Q?uýÀ!c”Ü”>p8‘ñZ{ó ‹/Ú›á|ÜÄœ}ÅAËÃÕÆþ§tâ÷ŠËÛkI;¼a¯~.v1ßgnÚhE`züvzÕ»<Ïž»ŠX`!üà¼Êî¦lxöAƒRlØÝh¬÷šF~ëî&ºÅ¾Ç6 +ÿÎúëB·‘0šìÏå»gñüˆ;þëÏbrâè™ ä•­?ùzè&\j¥º±®XIb4ˆ³{…õÑ\E×~î{¢cV~«(Y[3­/¢%C{\á"~B @”¶Âß)ªY∰˜p,TëY°þÌ©„—ÂûvDq>huïÚ‚ïè\ÞS˜…ìH›M‡ÓyQÝoÛ¾ÙÎ/ÜPÑ(Àïþæj[ÇØìsyä'Áo@í³yò4]nì’ö¨°²”(†] FuÒ<„¹¢вc‰^"j\ R–XÇ"7Æ$½0ʰÑî‹,ÝT‘ ÓdÚu2*_"Íž_K-–ÙêT®¯ ó`µyäžj`Œ[n~£X襾z~XK`8p`Ý©ÆUÔÏ`'«ÂÊ,á+2¸~y5ÜÔ«…ÖÉ-ŽŠù¢ðF¾NtM5ÞdòñâŒÄŒqÐSl³K¥léõåcVnƒ «…öÚUò^.#¼©­ucrœÂú4 änºÜ<…N¡¼<5ºÄË*ÅVƒ”BâóíÙ¡wì îØ>1j$µ±@eÕñM–IŠ„§¨¯qe™Š8ûév#(µ~Û)tOë üð?KV景£•ò{œÏ cL¾t vœ-øæ†D›î–xµ.d±¼äÙwlë74H]Ü‚OmÅ™‡ö +á Û—•¿ÍXKµ è·uvü»”d›Ëåx +ÿˆgëŒkù¡™ES÷*‚4+dððüu©³ây»†ÕúÛã·;ef]‘ª>WhYšñ3pyšûƒáM¿ÓˆgÞßœe[Xž½ +¬Fô#Íd[Bì… /mñÇè0ñô[ôÂM/xº‘óéW$¶)Íž~±þl`Tse&½—œ9´÷gCܾ¼>”ƒ¦ µM0¹YÆ×¸“‚²™·Ã;N8èMIJså( (tfL†EhK ­íDÕÝLÏ©ºèê©S OƒG%ÃD: ÈN§Óöoµ•ÁS*COý^ôâ,¼™pVŒä/Uל¬Ë¨ß®îÕ¬Q¸ܬïsÄøÜ‹ ¼Õ¸3Šs6´I¿jwÌEåÑvíªË#ìYú±á9¹”Ô´ð˜°<¬»\1§]§„¥²”¹#}sHP=p©ÓÎÏV÷Ñ'ÀGÉ hZ!ûŠÐWk eý¦$à½@ŽgpŽ4IžÕYìZï·WÔâAë;½›b8LbÞüW„›‹Ãýô†1Uñ'´×ËæÙ/j™GšÃ¹w,x%784/TÖ>@šSš–@nÆsª§([üÓ}Xnnɮխ ìŒng™ËE>¿Ñ #¢*’Mœl×F(¾4·mÒåNG€]ÁR¯v¦U&'HË lœQ…г¦¢ÝI=žämÝ[«ætßœˆ¶LÏ=ìÞ[ þZtP!éÁ#gýIšÄà)ËÖ9Â#7¥#°ºÇ&_ð¶ÀLC¯‹ãÒ2¡OIÚ´ÖÌ#>ÇTî™®9õùò,åO_³ö´Å 9‹CÙ_Y-š]÷üHä5f'ϲÎ^iá›Å,ž?@ͼÖjéc­Q¥ݥقÓÎ’–yÜ"‹šÞð0>™-âø:OYÒ®F$Hã ­\A‘{¤ôãéÚó/ÈVJg\¶–(âK¹äƒ…jG÷™´÷«I„|'ó‚/S>_Ï»›™\ÉjC†ÎáÈlø¬ÔÉS6 ,óÞ¦g”¸R²é#£m2ü<-NWŒoMr^åuº½ŒêmïPIæÉUŒQ"~G»ò}˜‘÷e‘qƒ’qä÷Ûí`SÐ×ÖYYE“íUóx…yŸ GáY¦ø—¼\k¿†È‰ã®øÞ¬o×EinYÙ,©Ÿ!ñyóeXÑ×r/koM0GaتIEƒ2X»”¿ +AMî,p}jo- +?JÕ5¸N—gÑéiÞ­c%ÈzcA=¡=rO»+n‡Ú‹«m÷©ÔÈkŒlX•ßešº’ F=Áù`¯–¦¹E}Ž™{Ò[Þ“¬©×<¿—ã‰;$ãO´ê®E±]GMkþ¦]Ý~…‰ý1P¹u¿îN§u)±¥Ú­}ˆòui³Ýº˜[ቶû¡æ°Ö+ًƯ(Æo›î³×EÍ^³ +>-$0âU(§É¨.ÅKÑQŸôaÔ¬_G†Hù³¨%˜0JÔ¸jËÍ+âEµ…›‹*IÆð|4îË¢^X2J¶tc÷ÕÉÅ8Ã_­‡‡ò¬ï3‰9sü?\{<)ædú|cLѵ$©²$’´ñHÚˆ¿M…M £“˜m¡ %ïÝ =osè»þ¤¼g/âbüé¨n~RM³š3Ø—¸úñtƒ¢ëX,K’YÎ6œÓu×é—‹÷•çÅõ¼HSÆbVꑤòBŒ!µ6ræÇdùöå¦ÜX–64cå Õe ó'iüýôd-†ó× éþj…̬Øé¶-žuï§Öüœ2™ûÞ“€›­ñ3®Ó°MÛ4Çß³+XiI6´Â:ÒC ¬’Ïïàž9­Âc/`@L­†ÉJý¸ØLï#66›¾ÙÁßtg@vœõ|C·gßWkžGò~.=jèá ªÇ5/À¸5#´4a#b‡Ž¹u¾3Ã9†™„àcá‚{Jn-v,~Y’y^/^[…atðCŸùÓcŸ;fD¼{Úd(ùšmöÀ±{Ù¼ó€›ãÖ”zb¬“1õŽ˜3‚¾SAöÖé£ç2>ŽVÁg«3ê‘(¥ ꥼþ‰à ³â÷xñ,º“eô®¾¶kߘj÷`Æf¤Q>Pa7œ×ÑÿæÜâ5á³Sü¶e™Ãl)6âöÒڌȦwòb\¼‰h¥ÃNÇi‘  ØÊWËv²«êÁΈFÔJˆÑH†Õ²Ñ O»Âq¡¦óÀJž5¦šl.4® nOLÕ!×äÔ'½XŒqlã?Lj‘/Abטf"I©B²§¬¾[.ŠO}hšQ':·,ŒeÅæ¢qÛÜ¥ˆ¦}~3dÔ Æ³9î÷–» "{,ìiør•þvõÒ¡ƒB0=nèÜ%Î*&•y¡ ¨Xv´Â6¼˜9|q…’’ô4D¥ÇE„÷8¡Äïp¨ÕƪD¹§¶xJ(8p0úì=»½üøVú ì'Öævoöž« éÖk8c\9¥©.Ì ëµüºí£s³âéy†«ˆw}€ÓR¶ŠqY2¹úM¦dm8·Iä›2‰uæèÀìVË Ò)!Á~T΀í+ïJHìIlÎÉF¾ià>~[ðÙW澩«ÙD‘Thɶû¦z¯‹/bC¦#ð|Ôæ—ê6¥¦Å—O+»³¹~º*ãêh:AŽÜöƒ©,¿~|~}ÅÎ;+Ãøu.pÿd‰"²`‡IßVòm{6媂zî¥ÒÁN,Ê÷à ®á#‚{7¡šåñWt5‰¯Ä;Þ܉lö2ËnmxÂ!òÖMF¦NŸÂÏ£å³EÈ… Í$ná9…fŠàyca#1Ç›‰uî› úVt]¦ +”ÕólÜó‚©ýÂ9Ù¬+fÉÐu#úQc†¤O•Ó·vdÌvÁÉ.’ÔÛ< CK‹R3ðã•ÓÑ ¥Ö;wÐ"ÆËÞÏVV|™ Î#[¹?÷û‚×ðö|Ö«¬,d:ÁyÏRÄ‹–² šqÅJîÎÜÆöÅ]oÅ–êÈ®¼¹PëÞ)=yáWÝÚ'_Ûl·EaÓdžر©Jø¥ŽŸœ'VÝÒI‹Æíx+Èa{ç)ܲ°ãt—7±~<À•I6½˜_˜s½ïMöØiè]» :2 ÂL*ƒQ8L;ÝÈõEKÃïÆ/q´ ž©l³¾w@¦H" ,çxÝéoÅ\;_Ù(ìñ@:Ú ·©žÇ0ݵlÍßúÞïäÇOÞC}C¤–…Á›ììÉ¡û.•VU¿ÎùÄhöÓu[ïÐÐ&ɾ +Ÿ”¼ðkFx®’‡2¾&?ë6}™ë¶ÜWöC‹Yl.ÞÞ×íNUÍây‰ûe³‘€ì}:ÃY`5üÙ;-ýgWc ƒ/µ.Ñ[ÚOxÕ÷·Àø‰ß}£1ú6«íeyUGŽ]س©L¯±êßãôk]wkP^‰(ز•Pùr8.xôü³¿húg‰¯£Â 8ÀÊ4˜S~ +ù¡(4üê  R…1E©At;|ÝSò;…Lðy±[²þ¢íµ•û´¢0ÍÆ¥ûz?6ÞÿU‘,¶Ç–·ÌÍ,^ê7¼ž2R8?5«Wìˆìm¼°Ð(½Fú†Qе4Ô»Jsæ1 3júÓù”àSZÚLú²©½ùäûdJ]<”øU­7¢›f\ÏûÈ¡Bt÷ùÉ!G6Ý~Lýì#¡Ù5F%Aýºrâ+ÂÖKšCÊ©;ø™$~¢°ª¬V;ÙFÙ|¾4RÖ„mˆöFŒž®Žµ:ûˆا–v:dä@t÷ﯪ7¬ŽÕ˜ &zðÀ˜ì{øj>¦ï`²P^«Ù²¢ÜŒ¥¾éþÇC½LÙ˜Ýð•C;bêÇUjï-â<€{Yº¶¹óï$µ,>ôyÃׄIYêÇtÖ=„ÒTBž¿-Ue ª”Êmy¢â4 hùìD1¼e-}üã³~ÜÊð¨¦ÁêìG-zÒš «6ìÔáÜ,Ì^`²½âò5ƒÖ·—qAï;ŽÍÔ›ZÐi玡KÕ…»äº&j΀Íàj÷Á m®ß”¢8W¯™TD{ÅŒS“–µEBæU¨˜ w¯«tÖ­ µ¾ 47Å‘MÃw ëèæcES›+Ôñ ‹*µ4„´˜¸dÐU'Î?•âç à8–] Ð-ŒAš¥nÙùF‡xú ,¿ª[®Gíì¥O)£ßUqéáZ/p«™'˜‹°VC~ÌÅçºgË5š»Šäóÿ¸ÿŸàÿ GœpGÜÿ{ñ«endstream +endobj +1229 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 5648 0 R +/FirstChar 2 +/LastChar 122 +/Widths 5649 0 R +/BaseFont /NUDUEK+NimbusRomNo9L-MediItal +/FontDescriptor 1227 0 R +>> endobj +1227 0 obj << +/Ascent 688 +/CapHeight 688 +/Descent -209 +/FontName /NUDUEK+NimbusRomNo9L-MediItal +/ItalicAngle -15.3 +/StemV 120 +/XHeight 462 +/FontBBox [-200 -324 996 964] +/Flags 4 +/CharSet (/fi/zero/one/two/three/six/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/z) +/FontFile 1228 0 R +>> endobj +5649 0 obj +[556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 500 500 500 0 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 500 500 444 500 444 333 500 556 278 278 500 278 778 556 500 500 0 389 389 278 556 444 0 0 0 389 ] +endobj +1171 0 obj << +/Length1 1647 +/Length2 16082 +/Length3 532 +/Length 16971 +/Filter /FlateDecode +>> +stream +xÚ¬¶cx%\³-ÛvVlÛÛ¶mÛvǶm§c³cÛN:öí÷ûÎÞû<ûÞóçÜýc­gÍU£ªæ¨YÏ"#RP¦4±72³·s¡c¢gäÈYÚ¹:+ÙÛÊÙsÉÐ)™š»JºÚþbl0ddÂN¦†.–öv"†.¦ÜuS€ˆ©1€™ÀÄÅÅC¶wðt²4·pPª*©SÑÐÐþ—們ç #-Ííä¸™ÚØ;ØšÚ¹ü¥ø¿T65¸X˜Ì,mLÂò +š’râJq9U€¸©©Óß&\l,2–ƦvΦT3{'€Í¿c{;ËZs¦ÿË%è 08;˜[þ 3õ06uø¢8˜:ÙZ:;ÿý °t˜;Ú¹ü½{€¥±«É?üµ›Ùÿ« 'û¿¶±¿d +öÎ.ÎÆN–.€¿YDÄþ]§‹…¡Ë?¹-ÿÂ{³¿ž&öÆ®ÿ´ô/ì/Í_ÔÅÐÒÎàbêáòO.#S€‰¥³ƒ¡çßÜÉœ,ÿU†«³¥ùU@ p257t2±1uvþKó—ûŸÛù¯>ÿ[÷†6žÿжÿ—×Ö`éâljcFÃÄü7§±ËßÜæ–v0 ÿÌ‹¤™=€‰ñßvW‡ÿÀÜLþuA”ÿÌ Õß" Mìíl<&¦f0 rö.S(ÿïT¦ÿŸù@âÿÿGäýÿ'î×è{Äÿßó§sµ±‘3´ý;ÿÞ3€¿‹ÆÐðw×dÿ,C'À? ÇÒøÿjhkiãù +þïÞê¦ÿ®úqþwøß)íÌÿ*DÇÄFÏöo³¥³˜¥‡©‰‚¥‹±ÀÌÐæïåýË®jgbêdcigúWäÝïß FÆÿ†©XX[Ûý£Û¿!S;“ÿÞÃ_ÝþÕƒ¸Œ¤ ¢8ÍÿaÛþËYáïT¸¨x:˜þW&uY{“ÿ<üC%$dïð¦cbçÐ1s0þ}ŒŸ#3«ïÿGÚ1ý×YÖÐÅÉÒ ÍHÏÈÈøûýŸÿ:éþ7Q;c{“æHÙÅÐÎäïèý§áØØÕÉé¯âÿÚ;ÿó¿©©‡©1ÌÚ²½1OˆUzV†K=fÞÈ”ˆö@èH¨CY“Jqa@­}¯zÄ.W•ÁG](}ó ÷W‡çÒ¹Ãç¡õÑX† Eoªéuž/ U!òyÍQƒ^|Æ…zŒ÷̘͢;£ÚÑÞ”¢’^éþL‹ÔÍ3U‰[aé“‚ŸqZcA(Îû +†vì+Ê40?!,«§y¸E­Œ äMÔÜC‚¨Œ—TN®Åû2Ó¿ÇEZcþ£sÍÚJ_o²œ)•³ìKÙŠ„v‡Î B.s¤°3ï/6š~mˆ1íw©Ô ¡„Qj„Úw`D\Òß(úíý¶jø/]^e[_)’ump‘BBhyÛ‚™h”‰ˆ ®òó¬3MÙÔ`}ÖU^‡ñÛÃàší¬n!\x®Ðát*JC>°úÄtgù×uר+©ßZ·µW¸C¡µ{Q—º89XŽ[Åú7µAÑLXéÞ²¹¬:£‚yÇzÊÍà«Äòw»¿(±ç ž ÓQ4Oó~®@­ˆqjT*ºfå«\cBñ.Ïœ ¾Çõ:0LJö¾y$·‰ÿ¤´&Ìã?1rÍßífšÚ8•»•LüìMÑcK>/2u´†e£7 MþUâ…vóÚAd(‘ãÓ8ð“A¢æ;!ÊR:–FóZÀg믬Nõµ‡ ä¯y8A,ÉîÈ1¡ÑJ=ùl¡‹H?Ù«X?T£Ýçd2MzzÑö~ ÖSñ\ ÷\-Ò® zÒ}½ü‰â2èâ¬å\?sö‚_NáTÚBRæ|õ½ÓßX$÷刄~ñ>eˆdR7]ù÷"+ç=ŽXÏ8£Bê?$7Ë´°ùF +S½G÷ò÷™ó¿Õ›Wpݘ›¨“Ì —/®ÈÆ÷={C-’КC¢¸‘ÍÚ9¶ +²‘ôhÂ<†áN,³ú,Ë{⃜(nš<-Øì“"Œœ£[ªÖëÔ‰÷if9i^GÍ#e@p%M›È({™¡×áŸQoÄß{dyŠ*Vq¸ËI¥(h1&n¬M¦GaC{+÷z†.¿šbTT²|ió”º9˜œËé‹åJ<ÖP†BZ}¡ì¡ù „ê$ôÑ4fŸRDô9\<îG“¹\틇”›~{ QÒËî˜/¡5It*âÇÏ[*…]´›ÔWqÚ( s¥œ9-œuM8! kœì%¥aÜ*Žß¦@¯p}ë»ÿ ˜‡ ¬2÷£ÅTØ¥›‚~YGx½Áœ—»^ÝÏø®Jh$ø±è§M=¶…À›8³Ë@¸Xé@1¤DÏV·]OhÅM#i‰+üN(™p ÐôrȼœÉXqFúh¸=YY®³ŠãHç—ÐÞö!”‘L®bC&OÕo€×}h¨*þÒ竬MTõn÷ :·Î¬»Ÿ½—;¤Å*TA Ec) +ªƒmù|hŒsÃŽMýH÷Éß°F’+P#;=E@%óôëÙ«š‘;©ý)h:§ñÝÅJÎH{¸P7a|zBÛ³˜å™Œd{Ú)gíh‰±q£ôëK…³‚^á \éZ îZâÃ-¦V(¦h´¯­ß¤ºYËeµlaŽo€ùÛÛþ³ ßÚiÔÓ¼üÍÅRÏ¥øB+†8Ã!·N¦¶mL;c%Ö9çáh¦³m„øÕ¥h+ f›©fÁa‰Sšu9fPª”T±ìJÚV»h“ºL0zh»—Ä5„ÐÓ*úæ|öÄñ¾ˆÁÅÉ'›Z·Ó{‘¡hôc\,Ø5«ýOâZ:¼•—¿BF@Á¬Çንâ}5逛¥Âÿ]랈´*7ö†w@ͺ˜3‚E‘Wm憇ÎdKžÚuíZ¬ãÃ2—TWÕKØ7Ñ ;ÎãÔµ´Ûf$?¼ð;n3ŒzAÚ‚@ž+¤Q×»¤ÃÉ6)ÝU³p”“$Ò”µÆ{‚„;|“U^iû\Í/òàJ#ÙKXv-uŒ“¥`¨4Ôoê(Ý£ÀÞ®iEÅý+–¾¼“@´ܯ8«›z°Bòþ¤0fåL8…—¨õyV +m•Hô×;VÓ—9‡Ð·)/³|fÖhÑ€Ûw,NÝc,ÒãÙvðga!Â3b@6²3Yé=%ðH–½£Q¶ÆÕ2)çÌ07,]Qçšî3¯¤&L_Z ‰ÐÑ,ÁÜŽã?)¢RмÇ~˜Äí’ÍX-{©¥##Uî6¾ {]K^È·•iųk ;CŒçz×hm\Oð¢s 6kôx%Àqš=b~,ܧ'bÓߪïrHb£îõO‚Áä¤o,Èrˆä¼ a&$»æ3´‘2ºoþúv5;%×ÚðF#xÛÁÛ$…¸<Ìö bƒVHL~Ï ³áÒîÑûgÕÁ Ùá\o4I)óm)Ï<[x{×0ºÅߤ\×tžÀ!B'{ݘ£ ™%ñÎÂs7&ŠqÇ`co•b+`fŽG;Yf2ïFøXAö—âQ±?¶gn!ýŒZi€æÆPj$éÎ8ÿøa©fi‰µ® Ôc¾oƒ'Z@{’VInâ!ïGŒÒ‰îû¹Þ8îöÛvM\NsМÜP/ôžßÉ/÷P¹õœKa;*F”óY­)€{Ç–Ð^lÐt}¶Î}µòO“™.yn÷9~¦/ˆDw&ÒLñ{¿UæÚe æå6´^†[Eç*zdâï_îYBW™?×kö·3/)íwqðD_‹m}^Z Ÿ’‹†é€ª- ¨«PÜ‘<£lüѰ%G­Âqq«.ôžÀ™"¾F†çkì ?tÙbýsÏÀè"> † ¸\r»Ì]ËŦ–±-´XQ»É?˜ôIO†,¸{…þ³¿HIçyã[ x¨?pÞrn7l{cÙ»§j6K!'Àw˜Íшà¼>¼£Hx±“aðwÂZ‡.Áúm"¾ß5t´‡»Ë¢Jº.þÕ^›Þ´¿Ê½}SïS¿­Yt¾+Ýç„ tjDùÈ×)YÃÆ ?ÃÈœ ÒSvA;0¸ÿá¡ñÚ½™U‚Ü¥3NÌå(×pe N{IªY-¡ÁA%RšE¶¬ˆãÑš·Ûµ/9¹ú8~±rZ}Úú—J¶w­‹®ªÖu¢¶óJŠÿAM¥À*ïÝn* +ˆõãÔ=ò0Š0Õ=F>(Ô}ž6Ü]Ò!´b‚× Dou,¢aÅ¡¤$¦^WV&3ÑJ;×F öüOº’„g¡à„ÖÅ_k³æ®%~”À5ø%j+Ö'¸3«Ý÷'¾¾Çѧyr8º¸ œ)ޛܡ\0£<‰T0o“ru +N£)¡}Ày¤¯´.õÓT@ÖïGë½I#¸h•ña×Mõù˜ ߪìŠì% H lþ¤?£À¬¿Ïðw[Uöø ë—V^5Ê ¨•f`ÀvŒv È‰Éñ+4Dó­hò±»Ô¶~Ù;þ‘pŒ(ë|«qË8rÞ·–œŸ¯QIÂÄ+*Îæ SîÓ ;+œa7(Óòƒ¼Eùh + xwþE›áƵÊFŒ&^,Ù²šƒxhbÆý\ «Nù³3Ú1@*–¬%@àá5†ýĦ‚“ÆÂ.¥ébJêvŠZcÅÝNƒ‹ßOÞÍf5Œ¼6cþþ9©@Ú»äPª× 1&•`çüB·±ñUxé…$’/Ьpwû¸ëâJ;ñÖŠˆõiz1njô>´¨hF›lEKˆUa®góú…¼FØ2\a7b#ÛD cÕ8QUGolß FU‰ Ò2…b0_ǪN5vH=òÖPóCé_w{äG‚¸×F!3úk²êUþò¥©…ŠI:!êFU@ù>õçP“ZÞcã{ÀdÏ[^0[ÅRÚò{{ËZcˆÀÍ&FßõÀózÆ’ÕíÆÍ‘vJ‡Í‚;ƨ×e%0«TÛLßm`¸7“ûÕõà¯éL¼´5ÄøöÔ%t ¹Âþ§4ÇæC_ÈópõA&«‡9ˆ…ƧŒM‘ŒvóÆäÌ7êZÆÅãÊF—zó—ÆK™×„a+pžòÏ’­´ ú8ü=l’W¦GLi£_Xtáº*{†…ýø§†ÞNsSovŸ$Q,J“ µó™ÂÂWQn¢@-FÆÿÑb÷ô›µE)ÍTŸ.m=ײ ö~'°ùª/þ¶ª¡ùËŽÄéÄÕXæ­ç °•í "°ÛÂŒ† +„BJ–òóa2{eÂô7¯dRÆ|µ6Žû-HÛ-ÌÃ<ÕbŠp—¡{Û6ï¼ÐR3”YÃ÷©’^?¦3Ï/ ZA’ó†|¼õP¶€ã»V¾ÂÜÖÅ”XÁ½òãü^üvõ;Û]³VÓ+EH²œ¨¼§N¶YüãØ• Á¨á_Å • ~e÷1Z¨™5…ÌǤÉIoXr¼– Ñ—ô:„4GÔ2°¨ô\t©;ëj3™ Ua–¥ D 6,ÓÉ9#‡#H^þ‘e›òû,øâÍÛáGa½”éÓ™ {*”a>ÅS|1Ióâ2ªÊ>n©ÒÓeÃWxJ›òiÑ'ê'O×ònýL¦dsη^;û•÷ÔÕ`ë*ÈFæÔF†Þ:¾–+<|H¾ryÚ—dûÓU~ü4ó9vb “‹y2E©^‰ÇÔ§”o[î½—›jtuj–®ùš~—FÕÆRœàº‘¸â«ÀÀË`ºÜìþ„ÀBð6Úç5ZÒž.7ºÁÞWî/´|69ìð¾‰Åu³y±[se[*zw¬RýšKDš}†¼4¡ð;ïŒfXÝꉢ£%QEô¤w-f*!]È›¶7ÎÛQJ6ae9,«—ElA;ògÌRR·Ê&|wPݰ?-vþqžšZCLMÂ?‚•QCŒD}w³ 1"ý v ÕNR²ntM; ]X¤¯¬s>ÔÚ©T6½b›x¸Ÿ?S„´f¶° §J?JÑäêº{ú§Q¬g£[ŸÏpY]eaÂnO†©Ýëu@aR;E[*ÿàÈcgt eϨÇ™gkNMØPT±Yß¿ w8,T%d½Ã’CÆœ¾ÃWª ŸïŽGIBÒå<‘ÊrM+¨ö(‘2ù ŒjŽ´Uüù ¸Ý hð%Ê4@®‹xÒ3퇀…­‘_w Û# .?¯„–~Ä&êì,N¢(­ÿ¼c‡ìPÉ>W–ªÚçðµr<™Á¨9èZJ–õùÏG!ëçKÍ…*MÜè f QêCB¯PëT:Öœ¬Äah™ g¯­ÉÙ€f%Fnbòyqª;Ì@Éö¶™(éÌÔ8Ó@Û?AÚozöâ½Þ ½çafM„Dˆ2IJ¯$ÖïLæpÄ!¡?ັWv‚ ³~iŸ$›v‡Y$—_ý‘ƒ+öȾ¢Ÿ¾ +ôý¿†ˆ}Š4gr4eŒÕŽ¿sËDQ]ø”VÉv +Ó&E°IîDlij©„ÛVUåü\â*³‰r–ú¼o€¼ÏœªK•‹mÝÖÄãÝ' NiÒ‹…}}ŠheRcuü煞\Ð ( P†’³Vû ¢zßÍqZKÆÀÅ“šÅÉ¥ äM?%-–§ñk£¥¹[ îçLJI»‘ƒn{`éðɺ~‹3ƒî¨-öwqÔ-ð8;ÔÕkÌQ'N#Û6l!ó!¥`c¯%ÿ1Gö²§bæÎ&˜užO #3¯ßa Ó,oËï2Þ)kÁ™ Ôo¸Ä O©ï©¥Åôß»Zšd…ò¸mbT­•X¡ë¯; ò +_ØÚÀ‹¹sèª3«’B$x`Ú÷î˜óûª+_ß‹b^…ßuÎâªG/ºDJZ«é¥ÐT¤›H vt|hi§¸Àr›äV¤ë]‹Žzk­ÃÆÀþ/Îç~0܈æOqùEÅ‹ëmkÉ…YO–Í2@Ba¼ª¥*ŒÇ^·.鉔¨rnC^Ú²†rþ^;Æ÷*†Lk#cÜ¡ÁÜÇ8=?OHÌÓsEÚn¥È­’–ãZ¦¢ÐJÞäs¸ƒ¡‚íkdŒ)Iº­¿OfV›@¼ÊTÀHlŽD²DkÍçç/†}ÇÝ;•Z£ ‹¢šíW0"[Š´¥Tø6O16cVºGÛãÙÛ5~?Ké">rãb/PX®·UàˆÕhn¨gè?S«(‹*‡yu^ ïUH ›šmIˆŽ —J =^<Î9ááð#B1y>¸\Qj;³sÿ£ïºÎß·6’uM$¿7e†M©0GYƒo>¾§˜ š÷ÀN@f>&Àbp´{çæÔØSFëŠ$Þ2Õä¬í§×PwYHAYC¨w–Åñ~gÍûü *‹VŒw„²bóA+^6B%Ý.µGØœðq™{Ä&Mçe‹N?+{+Ç#rßHÇýš67M¯ÄS †ÄŸ‘—'ÚÕZ)Î)‡þ}ÏT9(ev#`zÐsP=‹ÉZ(j}'¿HiZ/Ï~ò7ëp½»s¸]Ä¡æ>îT4Î0SQÏãÓ! 6±ÎÁFéPÄ8,ë˜'¨Šdƒ&~':ÖïëæíC¢míFïxí ž!ômäÑ…øñsßgKh¼úxþFt40#õwô +áÑ&Â~ ¶…ÆB>D„#³±'V•y•Îk ,¨º*¡ì›ïÈŽ(¾×%A„×m7ŒâAuÌiXœâI.âzL5‰fáUUã³€z·¿ Ðñ„Ïó¹·W´Ê®5°‰Ñà¬Þlj•‘móãÞM¶E¨Ýš÷½ƒ\0˜Û‰ÈK\½ò>§cµ‰©ëù¡5• ¶¬‰TQLo“uc5ÏÓ…õuü¡ì-¹|–}­;v€-ÓÀ6?1ôæþHÍ qêu¼ËO†ÆŒ3˜füjºš»Œ«~prSðÝMôH0;~’Ú)×¢èaªØ¦›!Ì>©H±>H…E¬}.ü¸ª| ûÝg ®”& zúKCÍ4Oì[´o(³¢úÕË#€Œ–WB¿gÒk-(ü¬ Ïô”9·»Iä¼x$·2Ó¤–¸ÿç*xâÄJsáÿ®ˆ¢¥¾[¯?báÚU(“ñЩܼGI8³ñð{EŒVÅœ^k±f¡É³oPe™P®€M3ì +¦,,ƒêæËÝ Tí˜Ê<þ;‰£Ìþ]FJå$Nfx}·“½[m~õxåâ®–%oÌìH^¹î“›â÷Úð&ÁŒqÜ}ûîKå&H íèø•x—7£fK½{Úqóc/O%äa|8v!F,é"'øt¼–2˜¢µAAïùÈ<&NÃôÆ&{;v!×™'@7 +ú.iÙvèÞ{±üX[»o˜sŒTÊ¡w9ή*«-ãÝžõ˜ l‡+ªÓ]†öâ·Ãzön™pŽÒ/›7¢Êæ|Æ ¤á˜8¶ à7˜µu›ºaãæ_ b@hvŠ/¬ŸœÃVÙdGÏ+]ÓÍÑZÈ0¹¯îk'½J¿¥År+Õ†È\/‡xx1³6]µ€o~ä +UyOjæë‰HeÕŒwsÓÖç¬iýb-Å eÊþzq_Ž–¡Y•úÛ C+f]9)ß¶âVŒabqtfEgéÌ|@Âg–”>-î(RòÂýZ°×e{ È=qÛ qÑbZ®B៪,m±îXX,Ntå÷$“/«á‚Ï 6iìE1§%óÂÌs‘ü¯0ã®s‡LØw&9ÜiLÍVCNÍzx¾^óØ´< Ï$¶’$dáԞ–ÅËæ‹ZE "zôUé +Fù¶Æ_Ü• ÷£½WE{º%íkζ*´EÓIùqă§ä;ŒÞso»  ÛJB(8Þ +&©Cqˆ”K%RŒ«;ÒÅ«Lª({‰ ?•Á}¥îÖœ}<¼Öu-:‘ÇvºA[ö9§ÌEw‘M(ù~HXÍ)IÒ&Û 3"ÉüÐð–½C¨ï[×'xÀ ôؼÜç¼³M"@rñ z–í_ÝêÊ?Ád·Ý¿2êx e +;¶„9}óU‘F‡Ë)ŠYu"ý¦t#ƒA¼áoMaá{v`Z®ŸÚŒbîþêÝÀX¹7ÜDö?ËoP*¹ßtg‰_âW¾Ÿ©ËEݬ› DûúyHXWôЏ%½7…·í¨Áí&é‰tvqé_9©>õÆ 1 .¬¨ @ȳªè¶–š”a?ayF>€v–_yRÜÌËÏM#¿vs¹ëÆCI/$@¯†õžŒ*Îxû}ã‹`X†•]d}ÉBzž~ž)Ç'ƒlýG¸›¤FjгTQõØ0 øÔS4J'b=P<@Za:Å÷h 63£Ùóö“õKbÿÛÑ|ì’PÇëu|÷ÅÚ”‘Z«8š8æ)n”Ûâ"9“CW¾ḵçFXî,|{ëÖI¦s°/äžcþVøC5ø}û›•Òø¡ÙºÓó +Ú…wž6¥øèÙ˜BŒ2•uï„âë²L:f‹¯[ˆH—w¸ïI,i»ÑÙŽCw~ÅÙÎe +µ…¸ãKE¶XÊhÀwg鬯ޒOpê$ÒJ'xïΙöO²«ð=½K5¼Ó|ßS4T8«9|¾°‚%XŽÕ÷1"«]ßÜxÒJ™¹÷Î>+İîÂ[œõjN[†² ðó)jÒ:š†ðô›Ë°kg!ÆÌÁðÕçD[Cæ`œ„óS¶~ê|>϶hlé%ŠºØò3[V—Š¥‰Æ!ÐE’¦T.=[숡‡Pÿ†öÛDƒ£9íSßÜBOapßΠ½YÆh0ŸEngψÚQÌ«›±^qæV§2½gùr¨q*YÕ@Ãmû|{°ë…¸4}òÁú&¾Z7®ÖÆQ }SP ØÍW@Eï~zÉydjn篶Ší,Vg‡=kÔ6Í)£;Ä«]µ™}Óà°Ô—Jå'nF½£­dT-ÔbY± ¬˜“ ‰|A½ìµ± ²ãäˆn(/„îTuhgbȃèb`r2?ðFxIù †F¼<´|ê´¸…46˜Eo[g8qÉ›9eNå ¢^ÙÚ±'Õ¬ Ð´‚÷IB1W|€·q,λçmé3©&…¼I•žRÍ÷Ó;Û$±™Ÿ‹ý„¦ða¯¾ú+vkU=uz^ñÌ\°ÃÏ$…+¬C=ÛT?Ü­5|¿Êê‹JSs|Æi¿¼m¡}¬êßóîcúØB“M—ºñL[DžŽ¢#1É&¦Èð.@¶¯DK.äïí¶{ñ6ÍÞûxA#oJ‡ŸéU+êjÆ`Aj悘k%œ}ƒ*3}¸áãÅ!ë«`"øÎ&Òn°×íϰN`¥ËÌõa§P%m·²ç0 ³L§¨—üHÚz–¹$•A,DC±YqB±­òî Ø3~ìÈÎ/Õ†©¢}›º¸bФRá&³8ÔøÀ{ßâ®´Î/;>J±³1¼©+‡Ãî(<LbGÞü>üêf¼—ME!7¦À”óY,[¾}¡ê8Ò𥕨Œ„ ö…½Íõ¶àF² Ì Wž©2"¹·u À ~ÄŠƒ®Økï#yÞ K_MóDyŸ¯–™MuƒàèEB×Þƒ;BZ¤ˆ>GžúÅ‚üT1h8­ˆÕ²ÕtÝ;kóI¢ÊJŸÒè7Q[0€!Â9|I»UTm‡²,Òñžžê‚ŒcÀ´hHêz£$ŠLp†[Û³…þnš¢Ÿp ¹j=ÕÜ „©´ëɧoºº$ŸFÌ£­LóúŠç×ãt^XqÎ,J… [˜¸:þŸ¥pVs’ßó¶šžýÔ‡Ö'_gnÝ\$¥á $¢˜µYtz§×Áí´Xn»Ü]‚׬œ°˜˜¸w‚ƒ@#2,s@N|‚E'OTè¯îc%MMý3Žw8 …í|á„ +ÒòS- µÀJ +ÕªÂ*­ï¤“*—#ÒÅÝið×^Jø³'&ŸÛ}Gåž¹¦R±ñ3¡÷›„–‚-8™@}†áN!ÈÌ0.â"©¾bï…by¿BŒhñ9y¾ª‘À±; fÅ&0=•½)>!Õž›yûõW,!VsýFbá} pK>ãÙ&‘{;^2k­ï^ÇHe÷$¸î·Q %‘ iµCø{÷ÙÁ˜°ÍéKœñ… ?òk©<þÈ îŸö>”^Ð2ëÔ-4ïó­7Èd[Ÿ•‰äI¢mi¥cóÄH´ˆ‚ õD~Ý/OÔµ¬—Ø Ñ²¾ã +}Lkèr<òbd”à½QE[3¿Ö¿Õ`øXY>ä¶+W™OQ3n»ê«3—½aÄpX„ÃLÎ^ž§– 7½º91c +>ùl–ß(ïwôë4!ñ„zQÂg¡êØÍMòç®ðòMLJg µÒJVâ}bD"óT¼mJ½…æQ_%ܘ—„Ê=5ó”,¢»ù<4ej²ÒCåC'üm-2z÷$ˆ`Þ  ñ\FB;6=èkÛýJè=®¸®©œò"±n>É©·¦jW\Þ¢îú•]¡J@ç/àdˆn%pH^1 pHûÞÊ€ï‚s^ÚÃí%h;œ§ýAß%˜ÿG8 ÜWÀ’ù”ÛÇó­“ï¶¼¥°¾ÉÅ>;ž´”r¯¾³ +Ç”d—W,g,t¸©¿´Š޲앵46ì²d&¥`Â`fVB¼°©¨)wIð3™ò­4;ÒÊ>¬h E^uvxYsh“2 }­®ÿG2Y‘íT‡š½¨ô¯äú×’j~’KÇhšnÙÒ“onh+nѯÝ|Ù½¤ä,¥µddܪ®«vaòÀ^aç­+ËöÔ|¸áÕ’ægXIŠ–EÔB¤€Úè1©½„Áتò¼Si{ö&AE„*%mýöSäY!œ““™ C·…?`õÞȘÞ®G3]o‹~ïã$;¿è5õ¶!9#¬'³Æ;!Ëurk›2kˈ®:hæ7 ¦ðtE® 0§¥ÿôÆÐôÙÝÞx‡¾:ú "áŸJ’#”+]ˆ6[)‚&´w:…ŠºÔ׺0ã´)CŽÈÛ‰ºßÄKN[ú£ç€ÇaëMÛ²Ÿ?ÓÁ_ŒCö©Xä‘x^\Å¥•ŠÜ>ˆæãÑœ¾=ÞÛ[T†O;Ãö½O˜ùÕ¿ñý¬ìíÐçë²Òˆ|J‹Ô `ç¶`öC’Ä"Ù#6/8vK=Æ(,òåìïÆžFòL“WxIA(“ní—€ fÏÌŒJy·3N'xuDÃw½Åo©7«,eßç+ƒˆ¿¤¯9Ùœ—ò_DǬ‘Ne‰êj0ÎR†:”g2„i/¹Ã&ökDÕ^KòL e¶ùÈK’<SšŸüm’Ü»@cà€–“‡é ¨ÆaÀ›¡èúm3­‘1·ºqýá\o²¾ó/'>·F1ÊŸ5¯ï)@kç·Ž¸ü9w2?Ø.~{¼o›LÊ앎+sìíåØÃá$쀔ë.ÇŸ)”ïâ®!\¼ ß[Ñð~ —Юn<ûõÒ¯ý$A£†2Ž“=±¢ óOY¡Ž"brÿþ=•X¯FÿÉý+}6“÷ÞZÊiÐXÔÝÒ}OÐy|æz…¤ƒ/±ú$'‘\yñM¤gÖ7mÜdØâŸÞç‰GQ¼Un財KÄ›Y†^÷C!Þ¹«ý¼¨ÿãÎ1mC2€{¨ð*…G¢7´ƒÆÂØñƒ™šÜ¼j .Ã?bz/{°T™‘o½\II|0¡¯²á‰¶âØTlW­Ám9Í%æ Pw-¥7~Œ©N.›×l%~§EØÍéFóðý0Z鳟öò€©²º¨ùÓW®NÊHÚ”|ÏÁ1Oüs_i‚¦{»ê¢‰ü`4¤¦LM—3+Ö1^ù"ÀCuXR¤Š÷Ž`“ýzïYU±Òy‹¼U2߀NÁp$ú©•4zây…ØÝ­—dĬ‰£\g«‡¤y_µ¶3M>9™?5÷*Ÿ{°¿|Õ„È,X÷(‡Ñ¢û3þ@•Hlá¤,vÔôKz« +óÄ÷A"¼­pƱ¥&œ-ÈéµQÔ¸{ž‚§{ë\àÊ&8YêÍ‚MÄt©+×GÌ Ò£XäÁ^(vÝÚïÇx2!“¥¦¹Wzò+vúð"Dñ”nü_䕲p÷8†o‘ÎíÒ°Çkz¦º‚Úž³?ÍîÔþt]Ù;y¹\ŒD£§Xî¤\•® ÝÖÅppçZdCti×»‰¸«à€a4ŒÐ(¸$•H-œþŒ³œ{E´ÁÏN¶1ad/½$1}‰xôÿÒ Ú¼õì¨L OBd`ñ]L5[ÄId‘m…a§tnÄt#à‘QíÇZŠÃKfÕVÏ)=naƒT÷_ gÑ!¬ÓpÇPr¶#²'¿ÈŠ\·æ“dx5î/BÅäw4¿½gÇàÎ#IûJ6'Š“=ÍOÓ‚¸Ð¿ =c{Ž õ0a°p£9z¹à}´SÈ6<˜ Hé²0ñdX†_¹eã9Ñ@Ëï:'ßò‘x27µN¦Ý¢OÞñçP_ú–<6%EXIi£ËªÍ›P¡|)Ux,M¤?¦˜<3éPq‚jdç ÎOйÐÇu‘Çi ™ USõίUV¼p±«”Kà):¨Þr}):QW ¶Týr¡¬ƒÌ«R&³)0$óLó™Öô½Êãì!0—Õ¦^âym v—è Á˜q¸Ä]øšxi2äJ°Y°è|0MÈmD3J¤p<Æ£YIÇpÉÞþZ b'T}1œw²©)/áIÁãMó Ž—\è;ôŸŸ(-˜.!×Z +.zo•µ”ÐÒfŠˆÒ­a Ûï³°ÌóRížzK“ ™‹a'! v‰ ä@Q²VŒœewŒ‚Öñ" ×¿&ë莂uœ"ÿȪ6ܦ_D¡$8„ØÀ#O©ÝÄew^%PÿO`QI6¾ócfS î…Š‚š¿–ççç­ö×ö©ó~v˜×õשL¥NÊ®@M=£šA4š¶ñ·2¶ÀNF!-œ¢j«»y$<Çî…t››²M-à4¹ÂÓ­®fíy?±{ñ©”§|]¨²tÝ åtm + sBW„ÁܘEÌ$(mâ€ÌšM‚m©ÿd/ωlöü†û[Ú>žJÑ—é¹»Ûö\ ¯2mƒž‘ +`{r슟ÍyÙ{yù„Qä7’NïÎé_ú&IÍúªWuÕ£©ï&£—-N×7ڸŠ気w8KCg Ás膮ðf‹U„qw"Yø™ºBÔj <¿íä-×/D2J?s#$Åá°xîÁ7R˜ÛÀba§ùÊxä' ±„õ3TŇÁdz¿>tüXÀôalY(™<¡tì,ÛüÒÐñ)|Œ¢€Ä‹šçgÎD +{ƒ.½c¬H÷½Àü “šâî·ç>jÝ\b´­$Q²W Iò ôlWàÛJÐÉÒíaûPß ¿C¨¨[úŠ¢†áfk샿«?õõeµì%;òúHÐÓVèã›kt¸"4!å™sÖÉß/—·ÔÞj/sCR«­'2¥°èþ ôDÃvQdÅsêÝJêNxÍ6¸†?âM_¤ hžŒ88I湯a’ÚÉVOlsªP¹‘¶¾Û…Ü ¢Þš$‚fIÒr\©5ËžFP†6ž˜qRÓ sáùImÊGÇ×)|4µ>1Ñï +É­?’pp¼¹s=˜ÝÙ÷‹hò™à·Üã‡{(œkÆÂ.Öƒ£`dÕÇóíÊÚSØÅýV&0ç‹U›Q)½¼n—ëžÍ÷…("õœ4öËzSlþñ‰ÈÞÔÈZزÀoôêAOô©¤ÌÄg{y¦ñ®ÜÏo %¦Ò®«ÆaG™D2ï”ð1d2´øâBFz(üPã ô›œÄ '>ÝD¾>ØóûöÛj>ty˜LÖ¬¨ýá#ù ª˚¯¬}¨ÌtHÂNIç“vQ›ÚªwnóŒg4D“펣tB„È ;îÄ¢´áÀõ‚ [û“é÷9‚o¯…ÇYþR¥¤Ã©Ã~Âà«_Ú°SdYO +k);dç¾_„A[},/$3'E+‚ºÓºbÈtÇA32ÍIbº‹ú)¨@6¢Üé Û«{Ùk?PUNâësÏA¼2Ìp™’ 0rŸb²ü¼K;Õìë¯Í%·¼SÉUOÒâ~-lNÆðÝ”¢¸Y…Œ"’m¦] ë‚ÇŸvÖ"]ê4UÓ¤cn0x†Ú»µµ¦3u¸ËßNµ-“’­¢*ûyžΩšC£C\‹»Zéi+‹Èް-núø½Æª»ysÈÐû¹oXøôêŠ}iŤ )§‰üêDªSu’¤Ob •…JNBÚˆýL[Ø™xA³_¶åG›‘„b ë) :8¨sH>‡V˜'4I™>.ó}UáQ„BC–¢®;¹ösqpùSÕ#aÔb;GB ™Áý:mH]}ô7Ý—cÉ#5­x=TÈvÌ.Ë“·ÄC…K^b°£Lzǧ:u x¸ÝßW‚EïÒCÏ” Ç÷í(uäÕ¤tææc耄Ü,–|\²74ù=w"”Z¼v¢ÙÚ"¤åã>jy n}/%oøFŽ;”Õ¨Hf~1 -!ÛU3ù®L냾X–ƒßÆÔÜÔ`ö{!t([›æ‹ü`CÑn‹®é(yFÍ<¹;ØWé¢:V/ú0RÌ“.½sô»›%"=ÝÚ - ?pʼnê➇Þóuö‰m’G~7ûcƒS¡0©Np_”µ¢ƒ,M˜­Që3&Õ‰¹†DCéË$švÒó> êQ'¦XÔ\èß©K­t^«^”T®h¿©Î„\óZöU£z,¨;ß+)L=çàðCóÅÿëªÛÅÆnqÓè™XjøZþwèVäƒñˆ¢hd(_£u%L<Å%¹OƒÕMZŠhf¸¢Ä4X¾>~ì1’}x®ÌK{ íCÝFX‚Ë9ȹò×¥DMaÜM”¤Th¨ïÿ^‚‘C»Î4{Zÿo-„PÇÙÚ··Nî‘Óý*½r´»|(ìoýür´cêÓ•h m:Ê + ŽªÞ– >¢QU«PjPÇd¹Ô3•*ç?sXkÒÈÔçZE3³ä˜Ø!t–å߀œSXõÕÇcŠ”ŽŸêˆfP2Ái•q³)á÷ùxùpƒ–p_GçÊÂzÙ—#\)ñÖY;Þ¬æråØF»Ï]¿¤jãkÉp~·ÏãûÑm+æŸý2ö¶LÑH'BÙ„”XQs„¶ »æÞÙ÷ö™º¹/³áCš |V*lágڌӼ¥ã¦VŸ’¥kw¹2 ŠGü:ýS9þº†Ã_M…Þ°WßJËQÖòéD]ÜRÛ¼–ÃÉ/~þN ­ÆÂy‡/—ªZÔ¹ØfžLó{~žÔKæ)DÆh8#Å5ä‚0‡j^*#ÂoJuЂâˆn¬Ÿ"";ݺÔá"V ¬/t"$ÐV=š´ÏCü| ŸÕöJNGþ½P@FÖÚ_¡§X#ˆýY”çÑ[°é÷Çäщ_<§ì«% >1QÔ¤¢©²×•Q~KöŒõŠóô­-©¨®— £-¹Gý`ׯàè°ËhâëKÛµ\p·ˆša4LO6ź–TåÊŸ뀭 6ŽØf´“«sµYÏßx%N;ÈGø¹Ó)¥Ýÿ¦ù¬¯ÑmK×â2¼¨{^Ýu}Ť{e +X_–ž•`è‰?¸Ë¼'¼äÈÍ¡i Rï¤_’ñ3êstŒg« +|*ÄOœ\ö*NÍ/ecôS±p\Q0?‘™iB˜çb&É’‰mâ>x÷ÉcÏ.ž÷30¸RfùNÔY‰¼%8‚X÷^ VÒ/3pÒßhžÚ®·ÿŸÉì ý{3#â)«å ÛsBû_º›í{$òþN{ñ2ŸTvɧ֊:6Âæ‰;}Ò½“ã(§éþ7øû„’Ì7^>›æõ:÷àçÒ’K~B¥úm¶ß¾Ù|ùcþã5‹ÅO­Üû#õ©ÁíäI,tù*ZïHê¼tØ8/È´–ÿÄʦMKž¬“œû$ÍÍäÒG®–Κîl<î˜r]”oîSG¯ƒ“þ4~zÛ§%6áfœË"¶×Ç> endobj +1170 0 obj << +/Ascent 668 +/CapHeight 668 +/Descent -193 +/FontName /GLIAQG+NimbusRomNo9L-ReguItal +/ItalicAngle -15.5 +/StemV 78 +/XHeight 441 +/FontBBox [-169 -270 1010 924] +/Flags 4 +/CharSet (/fi/fl/quotedbl/quoteright/parenleft/parenright/comma/hyphen/period/slash/zero/one/two/three/four/six/eight/question/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/W/Y/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z) +/FontFile 1171 0 R +>> endobj +5650 0 obj +[500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 420 0 0 0 0 333 333 333 0 0 250 333 250 278 500 500 500 500 500 0 500 0 500 0 0 0 0 0 0 500 0 611 611 667 722 611 611 722 722 333 0 667 556 833 667 722 611 722 611 500 556 722 0 833 0 556 0 0 0 0 0 500 0 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 ] +endobj +704 0 obj << +/Length1 771 +/Length2 1151 +/Length3 532 +/Length 1712 +/Filter /FlateDecode +>> +stream +xÚíRkTSW‘ª¡¬òRIÕzX%2yj   b,Þ/‰¹7ä–ä^z¹¤D|PIU–EltÉST” +«Š@} Ô«0|‘V†°©Z_sÁººJÎüš5çü9ûÛßÙû;ßÙ4HCaáP %&G‚¥R ‡ È3›M¡Ñ‚qXN "'`!à>`µV ¸+›/ä­òøÆ2ô8’¦"€W0}’Ä" Œ# +9 +¤rBkÈ +¹È0z&©Õ`ýäL°΄ñ,bR8! +l„Ó”šÔ$A•à¿…!mÆ»TŒg’¢€×”L: EBªÖVRXk1²LjùoÈš^?—ëxÓOQðG¿9osþ9îT:ñ Ròú©§E9fƒŒµ­×ÙìèF¯Ü/›õP1œ”2ãry{Ûšƒ;îY[3š¼þìùìnÖyûú5÷9ü*êHÑÌÚ[7_=ÉKßÔÙoqøò*¥$—ŸY³ŽùçÝâ«°jÌRsy~Òþg®¯-Ô¶;=é·Mc¹Ôî†Éÿå6]§è¤p¤/¶Ä• VË„³ú\©0›ý=Lq-ÍÒ_gvÓƒ¦÷{$¹¥á±’èÑÇ*]µ Ôþa5T[¸¡-¡U€^,´6¬+pIoèâú—p2šöÒÖ§Ž¿¢ý¶dç̧É/^ô=c¤¶>T{^ú ýTmn9â³(Ï~hË‚ô]ÌQË ¾¿Ú¨KÕwùÖ4ÿ8oÙ>(*‡±n_úñÚˆÚíýcÁœ½Ç 8v9瞊šP–ãÅ Þ+bÓ³åôvÚ†+u §âÈU©L<>ðlkŠ£Öã†,îÙO6ðü’Ò^÷Y¨Æ°{ÓÃÇ·V.Ú±"tèP3ÄŸ—æ½Ù:Ú¦up7w$ZÐ{ÇLw~ìGƒ[ÎrÖzúÇ}³4 •Zác«Ö1¸ÎÊ([ï]d;0AƒZª4un4ÈÍz9Hžæeq7K]¿—Äš±*!*[*9­^n3ãÎ̱'¥îÖgøæƒ×Âù» ÀÛ•‘ £•þw»'´ù®WFŠ:9³Bª”¾I”íM¯ÌÖëºæe7w—-pªÐ3¼¶žùÄð%÷«ÓƦÍ6óðµ’Hè;[UÇöë®WÃc5œ-±÷ùѸλ÷s‹VS©Ÿ¡Æ¥õcºýõáeÖþ£;/eGXh¾ëã^&.}mS?Ôa[žt˜+tiR45÷\¬*qü8FŒ—E(Úo§lY=,­o<±Ûaç*§¤{naˬ…;7ÿìöxY–¬òë„€óü‚¬˜s¡¼þÀ9ß{..VPJîÉ¡bqÍÁ´{âÞðœç?|½g2ºäIìYSQá «ªïŒoE‰døJ—èVÛZ]·º¹¦¬ptn­Ë†÷œw\^sòßÝQÒÁû¬}œºŒxù:ñÔr·oõ©Åœ㣰Ö5Ùz¤ q\Û×äÒÈÌÏ•uߨ5¢Jiì¼^žÿ -k¤N´WïŸÃ‰Îg´Ï ìfÝÿèjüçߥÖðÇ.ˆ[“¯õ~9ºn'ÿ¥%™EO.fȉU=¼y–O³#TSëØÿá¢ü¿ÀÿD…–㦑ã锼«Œ›endstream +endobj +705 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 5651 0 R +/FirstChar 60 +/LastChar 62 +/Widths 5652 0 R +/BaseFont /PAZEBY+CMMI10 +/FontDescriptor 703 0 R +>> endobj +703 0 obj << +/Ascent 694 +/CapHeight 683 +/Descent -194 +/FontName /PAZEBY+CMMI10 +/ItalicAngle -14.04 +/StemV 72 +/XHeight 431 +/FontBBox [-32 -250 1048 750] +/Flags 4 +/CharSet (/less/greater) +/FontFile 704 0 R +>> endobj +5652 0 obj +[778 0 778 ] +endobj +5651 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 60/less 61/.notdef 62/greater 63/.notdef] +>> endobj +635 0 obj << +/Length1 821 +/Length2 1061 +/Length3 532 +/Length 1656 +/Filter /FlateDecode +>> +stream +xÚíRkXTÕÖ<ÀqV˜ŒP# pò‚sÙÀ81&6 ¢ˆ ·ëÆ-ÏK­Më-½iêYO;|˜uÉ Âü[gž¿Ñµ«^#8~À _~p«,¤`䄎#>ã"Lm)È3\v8öÜÒ›³Šêw»Û»Ï¿5…u* Ò}¿¾øÃ@`KAåü;vüE¹½óŒæ VR;GÓCrkmÿƒšÛ×»w¯0„BR6³ƒwä æknÔö„/ojTÞ-`+ƒ4YC[¿muÉ¥¯ýîa›Síúû_©Èc[3-åéþï²sŠ¢¯»®ó£Sg=l6Žw7¢gbç/ú,ϸ9,Çr`¶> Ð¡ïïÎožæ{¿ùñ„2Ã;|¤ú‹îå:›¾ljh}­þÜaÜøîÓŸJ#"ºÎŒ¨¸¾#ËZhHnv#†sÛFÞ}ïÁý‚£BŸµãZD&vôàþŽñÊ–êº5ÞíG"l‡Ùbä_ÐkN­G+ýusÕñ–âÔKpÃEb§=²ð’äxùZïMÍ~ÛöÛ|'Ñã¹ Ûsu¢‚`ÎË9UÙ{wF·]²æ"¡°%b°ºàð@¶çþ Kò†í˪ªbeŸ›Úy»‘¸‹Ž}>µæ–™m2~üæÊh!ßw¤¡kÉߺÓê¯L®W}•ÞòÔ~Å©ÂW¶Û°“ô¤•cÖ1OÛ ·z+ÀUY[ÒI-Ë1°"úÎgJè6…C‹ùÙºÀë5»ò•Ã=÷Òi¿Ã%÷KƹF:üÑnNîåmÏ\ù¯µ&kË™ïÛÕsOì/r^{ÒûDý’anjèÍŠ¥{ì$¡qŸ|ä+éÜû]tDOÈ$ªÌê]ö­¯^ͯ—8¢-G“ ëß(]mõòèù¨(Ù¬ŒÇ¹3§­Íîý1Þê´‰9ù.6¥"P¬ïÓ_¯ó4‡® ]\ïPíÜú͘ùvZžÅi´´÷Ê=Ö‘ÉG#LÈ ÇÆTï!'[¢hqÌsöIkKãþ”ô±ÆE±ú:o³­2‡¬Öïy$­H2ÂC?Ž þÏ…ü%ð§« FѤ£â‘ŸÇÏ‚&endstream +endobj +636 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 5653 0 R +/FirstChar 3 +/LastChar 110 +/Widths 5654 0 R +/BaseFont /DKDCMS+CMSY10 +/FontDescriptor 634 0 R +>> endobj +634 0 obj << +/Ascent 750 +/CapHeight 683 +/Descent -194 +/FontName /DKDCMS+CMSY10 +/ItalicAngle -14.035 +/StemV 85 +/XHeight 431 +/FontBBox [-29 -960 1116 775] +/Flags 4 +/CharSet (/asteriskmath/similar/arrowright/backslash) +/FontFile 635 0 R +>> endobj +5654 0 obj +[500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 778 0 0 0 0 0 0 0 0 1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 ] +endobj +5653 0 obj << +/Type /Encoding +/Differences [ 0 /.notdef 3/asteriskmath 4/.notdef 24/similar 25/.notdef 33/arrowright 34/.notdef 110/backslash 111/.notdef] +>> endobj +498 0 obj << +/Length1 1626 +/Length2 16798 +/Length3 532 +/Length 17712 +/Filter /FlateDecode +>> +stream +xÚ¬¶ctå}³&Ûvvl;Û¶mÛ¶m›Û¶m³ÃŽÑÉôýÿŒˆ}®jƒÏºPúæYî¯Ï•K‡?ÇRÔ'ãý6}i¦7…x¾$TEÈ;ä]4'A zåð™¿Ôc¼o—eöÀ´ØÕN¦•ôÊ>!ðg»Xœ n_¨HÜŠÐHŸüŒÓãÑ»‘šPê‹/‘'Ÿ¿šC7]‘Gm¢è†¤ƒ¼w¿pÆwß~SÜ]‹_.<г+*  ø¢/>Õz~‘4¼„áº6 0$á¾ãžê’ç’WÉÂ9yÄ¿ ø›ˆÐ7Éj+Ú±ð¡ª÷õWc”ÆMnKÂvH» Õ)Ê››À¹S&ÏóšÕÜ©Ñ) +`=üí4¹ûGŒóìÄܦ͔|¶ãE¨À¡3ÕýÊ#äɳü +ªþJ²>“ÙûÚß©éµO ÃÌýp°ðqƒ“!ìÚÒ‡HÚ‘ï6cámn¤áiƒœNM}ãÀÈšƒô[Ž’µ‘Ìì0E$ÓÆÑ×d~` ̵å +÷Nž/,È‘CÄSz­v +T¢½ W cÝý$Ä·«–ƒT1óSý@úoæó%œ|TÊQï¨Ëø²Îy¾’¾—ëφ!^ºAk¾‰DYsfvjJIœâ”'q8 *1|¬Í¨e¥ +ÙDqþs–2½µÀ†Ø³¡Šúz›G3? +(„Ï +#¢î¦ì;©Ç³ƒ}_ísŽsŠÓ–ÀìöA‰Wã‹"@¾­`Q.ên—y½Ÿˆ±{”–{°ëhÑFQ˜@i¹Ö ÒÎQLbȈ={¯ÐsFc¢0 Ÿìqa¸L·N\A®åqY¤#îWr¨†ŠœOjö6\¦¦Çî†OxE%? R#)sG@AR­_^hmqË"NrxTJv êúß9IX†AFTýÚF÷›ÄÃÄ8™™,›)š#|™3ŸÉ­íÛ~ãtÖñÅ¢ +/Ç ]¡AÂâçc÷‡Qbé&M\ÎpélKl5ðºe䟪€¢¤"PrwâÅA÷1Œoì÷ƒþᆫZtæU2]Tm Ó‰Ó!Z˜ç®Ò‹f!oÙ0±ÌDϺzã}?®A¤Êí¾íUë7îkÓFׯ\Ê_ŒÍvЧ5+[ßÅ<ÿ˜~Ó»—’’ +º2Mÿ<Š«¢bŸêÜ‹<¬A©6Æ3˜3GlREP ®ë½ +éHZÖ"èeMIž€¤l Š­kËøñÀ¥ð n³½ü x›ÆR4h«Ÿhî€Èç·“KtÇŒovPYýï ‡àƒÞQÔî)7n²\\|c«v"w±h)ËCK By0¿¦ÀF §ÆA„õÔC©ë°ø¬®³âmÛ¬'¿¢àè®UÂá:!ƒ;àSÎ=T±®ó8†ìãžMzaâ~¥Pd§²¹Ö`8.9#!nxâ‚ß²S’køì”ôÂöËv7ÚˆzV‰™D»Ô§U¡‰Ïx¾{…€k]ŒÜÀŠ˜ü8[r¢â+ÏÞà)ŽbË;¸€ëÔǶ’Ï92~ O®%†÷ñÔúÅü$Èny¢@>¯Z!¯$ÑqûdDz £Y8§R™6áKÖUê &’U~¬ÂÌ]9 +‹Üå{ýõ‘œ?©máa`†³ÏíPŠÙ ß³æÂn.×ß2GÐÇYÓàHûq«ê@Æä“{VÅÔ =s„\¬ûa­Otq=žAxªèeuc¦#fudâDЬf²Œæ"ŒõEØE¸¯7?C¿‘šÏ$.¢¿¢éíg ÖH—‡HóAxÀÓšEó‰0¥‰ˆì{ìšÜÍ]ÈœÑ$óðJþ“R+õbçÓÙyQV*ˆeTç‚nÐ,¥Ýÿj…šç·ªÍ,>?%Ù3çcó +%. ûÂu/›^ñ‡JÜK§'™IÚSby[ÉY¦;ó'cD×ÿ¤–ÐT«>;>7±:VÔ¬ÌgrV¡µZŽW “:Þ4dOIe(N‡[rh^7šÁr‰ UcK¯&Ž”°ߟ)Ñî®béwHó³™RÑ–Q‰Bê±eÁÒÒÖû¥nˆx'ô· :f¡r׸DìÞ%6 +¸¾øyüÜ»é(o‘)x%ôײÇIŠ=¸™É×™mƵŒ …›G*Iní„YP²Ëñ¤ê´£ÝÕðFšþZn°Ä,a´1§ø®xœ‰‚¾(¨T¹›{w²*“2C¥ €RÍÀލ1äè|–^AZ.1dÏvUóÜPÊ[¶4irïσhn–3È_ù5Bª &7ßKâ\^0É fŸÒ´ã²a‰$0/CRù0­iŸMéñøá›¸¡¸?Ë6voj+¨}ÐFd|@»b¨¤--û7X Âø Âáày 'ÕŠ¨“n)¾˜C¹O#‡NôÚÀŽrDo½:ã„VÅà9Ñ–#ó  ÎþÁÈ! ]àÒ¬*®<ÄØy0¹O–·\3…БŒ^lš–z™»QÔôTÔßÎv#r$zûñ<ÞIwŒ™‹­ ÞH¢ôÕwŸ"WðE‡@¿wÔ;Ͻn2L™·ú¯;vs\ò~õÕŠÛ)ÔF)€*èmþ¬0n‚<&rû]ò^øÿ›!h—B>´½†UÉ¿ó R.-â%D/DäÍzÍJ(üóu]¶Z}É<¾Üq¨bÚ]à× +Cjoú§Åû{¿ÓQ°cñ¢Gp©˜a›m÷u¤Ïч…%u8åùz°‡Å fâ_%)iÍ+Iø{¬Š[Xïè _B{غsɱ€ˆéo›e%ýÍH÷¼ãæµ–£çù {Mr‚§ËL$Ôål ê\­ÌbK ¼·<<{–õÄlQKËÕø-ë뜳u›¾A€è³”Øoúñ¸o¨È2©!x¢ÃU“Ñÿ~„“>ÇŒF?ôÎU»Vˆ\Ü{–1ºfÀfõß«Ëeaœ´ÔÐÁǶªp¢Ä׋9AfŸ»LùÎý9;ˆîõ¿k& î”k/‘Öî¾#ó[Úí×y„³í¨u‘œ'_ÛÇ֤ݬÑ?œ&9¿ò¡A®gõP´/F2ê8ÐOò*To~ÔTÀdé•#hÏ™×®`âÍè4NÛGcù阔ôæYp~íÙ*òè z³ô‚ˆO›ý¹æ¹.%oY…¦ˆ·BˆJi!]$Ý:ß4»Ï…0J~rÑø+1%]Qå×RÀÇ7Š™Ø +s†`î„°R­}ð﹂1³­G}"-æä¼\7(–ö®ù[¢ôï@•?‰’YÜŒO£ Í}Ò)±úbúßVøQºnîùŠD¤O¢!ò .°Ó m` Årôâ;¢Ã:›3ž5x.±f 4frÕ:cü›è¸°³ºÛ¬ZB{È´ö±µcÒÄž,<Ù¸—Ÿ™û´º$%Ÿ¥Óž1ØRôh$Y÷ÊØigÕ)ÕS²7TêÄýf97“7ÑŠ1û=ÚaùØ×Ôú=Í…cÛhÑ}Ù¼ësoÔ=DûÐ(Úg°©‹ýMÎ[o8:§£¢å]â€à@?B=B>ÁiÛü£Îôí‡(££w¸4¥dÀÝq >²dná+f“`ñG]fÌiðði—]ÞYï«ÃóYñ}TÛù*ž)þs\Ò%T¥ íìS,y-Ìl9ÀÀ ¤‹¸µ‰NYv.dJ +9îëVËœ¡)Æ(÷ÌÈÇ+‚ÕêHfÌczˆ …KJ“-j1­jœÌuG"Åïj É”¸6pœ2óÌhi^yDû¨•@Ä]ÙbräÐÌx5Z—Ý §˜ÝÞÑ+³œ>©èçel[´†“ó,™gžNfç'¼Ãª°’ª&*0_d•˜;ºé•Ìxù±Ëߢ7t² _ïë8]E9TþGôÜ>Cÿ§;Ž”¥Ï› ¹ëÒt)N‰ðtæOÞç¶ Z»'޲ßjcþۢʆükЧÿ$b®ÎD˜ÁDÍ`Íœ';Wö¢ºyêFâ¬^ÕXYS‡¯ßC‡Û +ã¬êûí! “®2¸–¥cöL€"³Õȱ\ÔugÌJ PðÙ’PŸWœ.ûsêÝ£V÷t„Sߊ­ž’¤x‰µ ¸ÁI¼ÿÊõpUo郜9¿µµ@ùQÍ .7”Z3{ ÊÝZk„]Ž[‘Øáòå]mQN%¶Zñõzܶ¼ÊL|`¿¡MÖ¬»Ž½Fº å9ôYÔU¦D +[)•›ý…ÊþZëôEš¦¹}Š}3 ™¿s¬ß ëä'¯¶8^­XäpYß-äê±?¦þ­†“ÌÅÖ@ïfc9¹‹hÂÔò'¦öaØýaðt¢@'ÛwC ìÆmÙs#PÂñ*%œR°«\Ë"uŒ¹#»Ì(˜ˆ•{ºVYPá‘O¸«œ`pSªõÖ.à(êDVmžôcéúb€<¨/Á¼ñÛÿ0V¹[«<¾¬mAue¸ +áMÖb÷æSo-º_Š©ÁYƱlj_ÇæÏ±d“Šèíq~h­&}è;‘û-;u•M…U óÑÆè9Ì)üˆvÎë/·ä|Ø’×нüøx«R‹ï?öôØçFB3=¤è³²„>@w0©€Ed÷‰Ì§ãuŒ×±Ùþšh§MŽ/‚ÇRs8Ea¿¤ÝæÞ\' £Þaâ Ìa…Ë ã+XTÐ×-‡ŠÌtåti/ÜkÂÇ,–d¬i¡räÊš£ƒY|š0N8ƒW*k·¯Š|=4>²Ý©ñn Ǧi¾__…N$¯Œ‰»÷ÓšÆn†òÄŽ€okeû,ÒÜ«BŸq-%%6]uƒe +‡·л„>FUy®ª¥áÖÅïBs¼N´Nj¬ÃZ†ÚHÍž¼|Œ-€«÷XòßWZî±Ûòa/æAdýÇ_;â^¯%ƽýñ„æ¨`"èl­MŽQè +¦ÁIßµæLNFëñæí6$£+ß«^(R'?OC5®sŽ6Fø~QùQ†ôõŽù ìNKçAOæ¾wS°x[¤<[ŽøÉåáhùTI¹m18Ù³ÁbôR1ø†¼ÖóÚXÁçv‹’dôƒF|æáô­™ÂdÛ…&D õ›‹Ra^Úiܱ#=@¤Êœ™WgW¼{OõíÓ}¼9u¿x¹Š;þÜ¢o¢ƒÏ,¹«zÚ¬|ÍɱÕO3…ÐEšÖbìʶÏ+¸Z +¹ƒ}Ùr—ÑÊk!—; ¶þlØ×C•iÁט‹²Ó– +Òþ yé¸ïAu¥}N²ËE•¸uf6¼¨1í¥´äƒ׿¶±áO(5€Ž`ô¢¯éÿŠÂ·‘–þšÐN\u^ Ò^L­…ô™€?ÿcµjÏÓß`ô9à0§Ãy^y}©,4©Ôª_å¢Jjšj£§]‚ùÍZ­Ÿ‹=„¡¸Ê®¤Ê|ÃAÉŽwAd ¹ +ìâòH¼FÅÂoùIÆÁZüó4pÔ›’ú™V®°ÜŽV! OæíÕKÒ²“áGøH»O<)„ö*–¹´–ðC’ØK÷w¾c/RðDã¿®àÞê˜6'8Ó TÀäÖ¿ž"OªrFöáÞžQŸ¢Ù>§¥^biaßéîögŸN79Õ;üÜk5„O'à¾Xo„Ü÷ª×9ß~‹¸c\jè«ð†¤o.ɇ'”‚néù½>Ñ4ú’ o B³Tà ì²g É“*? à·"<ÑÏÀ}Û!úh!×úŽƒõÛq–5¸v8ªR %äfÏENë>`=°‘\$juë è‹ +%·QÐmˆ‹Ï%Q•]b~Í•eÞWdA³ +Óéžq’9G@ÜLú¹©KqXw:½ÞÈIð>ŠÌ×00<â²Ϫåt£láâBa™ ¾$xNÅJà%t²Þ!^ã3íäé œ Ó _¾,nV=p(¦ÁãÑ%ÐTõFª»XäÇYO,”̸F‰Ý}LE|¯ÞÜOzïë„ôñÕþYÖS!P7J"–…”ÌýýÈç«t,t ÌOA½¦B `™+c%¢¯¥¯ÐØ{ã]¶íóéÖtYDF +šÉþ¬BÅ9üfîlSxÚiDJ-Š=84 Ÿš¯íŠC²"&Zß4+ó:§P7µÃ#ÛÞ™$ χf‘”L^þ8jÿÎk¡K^Í`…‚x6ð£¤PæÈ +Ôq÷¬©ä—À<¥:Rݸð–5LŸØ ‹¯ [n³w}#/8^®ë í%ȨØÚÓ—ìQÑÏ·½½r©Âq§®ÝSÅ([HŸ ÒZ§ÙeÛ#Éï|çU §ìs»ˆ ^™bˆ§¢¾ CbÔ½>ô]¨&18J«5"û‡n -Äcwš` ËŰcLOcâïn¥<¯Û ÊÙªÂñnÖÌKØü-Ò¡Kléª åDVa8§g€I‘y*»;5!Ë;ÄjÙ™k_G9F;æCò‡@n· ™ë‚–¨ÿèÖ¤\„¡S(Ôç5l¬U,9žGmÖY~¨Cçëïÿ$;ã4ûDÔú´šþ,Ã<©uÿÁöe•§æ×‘Žî•úâ ÆÊ=u]ÃþüCû<د–±µV9³šÌÌìQÂŒô ¯Ëuäò#Í|Ó—A$ïòb +èÆ64v½b±Cþrä4¡oð³¬.‰pÍ©Qôa5Ú%Bÿ8Éܱ«|9‚¾ž¯&~ ÿ]n‚O‰W§Íc²ŒCíc9ÓánzÅ„q#jÂ@ðnøZÂr‡fL¤’‡?ä'¹záìœÄ‘Q*€„XÈåwÍרHös÷ÄŒG••ý‚Îí(<ÎâºÌIÐ5+dºçï•M™«Œ€c ¾ãu´æýì£Ò廸MTóuPX6ɶÆ$¤A™åÀÛäÙo®Œ¡€ôú$/ç§0‰åc¥LÐþèíìÓù*ê_Lû´æ¡sj:“ËìFõ¨ÚaòÊꢥŠRIY’ØLýçT@µ +Þ†];¡Ñ{¤Ç-&ðÑ åꛫ*?ïF§€'GyÚB¹€ÅÓ%û³Ö´(V–VJ› +˜+|/›¤”ÚÒ-Ø CPI”Fæ_iË&T8ž®×©ú4¨0'e þ–}!À=¦Ë†6÷[p™r‡Nwt‹ÔOÃŒ‘g ÃÃÇîë¾îs '$dÝ„7#>4È D¤${´jG«U£z”PÈ 4¯ü´ÿa[6Ó7/„×¶í ŠÑ•lQì/ªF®‘E >^…ßht.ƒS<’žyöc©Éf)Êkóåúª®^Zû„™Ï”ÞŸ®3ÀЛ; ŒÝ€šÕÃ|ÛH%±„:úiƒG2à2Å@ï™’™¸äKôÙÔËMÕ$>:ºd§ðOëu}ÿç’m1#Ö ‰û*¼|ð+#j-˜æsÜ »14›Õܤ£i#|*|«™é/¡ø‘ àP¦]~ÁPfD½÷MD¢Ê +¯H\ìÚ½‘KU¥¯=¸XpÎéÇ¡«·&xE[ Ë›‡DpžÇ¾ Ìc‰Mƒ mïë1U§son“Rƒþ&Wxþü¸©”Ï×Ö^Õ ?7ýŽíe{Ⱥ7YlW‚ÀÊl± !Öh¸iÈáß'^ÞM¡ñTÜÃÓÛæÇ ?â•g•¡½mãŽz핳]}P7ÉÁ1{Éuíøl¯2¤AÇŸ½ãɃe&+¸´ˆ·¯,y„… ‰ÿbLë“¡YÚŽ +wM/C×®·ÔiW_[ˆóˆ¥{seO| â²€6ktáÚm:ë–YäЂާUu«ØÅ Ù_‰ÆÒRÿ™®ï +L̃T7ÔÔ)*ŒCÜpAÕç\–å¼N¯‘ » Tºö·æ6,Œ.8·r—›46'F#˜ä5]7vûâ¢zÇþúšçpƒÇ%o{møéK(¿ÖÏÜ?mÒ¶Œå ”Zåžë‘ôŽäZS=¦b3;ï(þ¨ù;sÛ£–&Èn)a—B’ mÂɃ±|‚%‘3É)*;Y¬qI ÁñÄÍÐb[Ø[)Ímçˆ$òÁoî;üqNL9ÛA»ßP·WªC÷áO9ÉáˆäG6„á¾…¿'QV©o®Ê^|WµCßÃó[?N‰+é——å§×$d %»Ö ÷lÛ¦wö̆ñY‚رr²+¾NÜ@0C9Ë¥u¿v5˜kŒß…óÔ Áð˜43æ;±Yãmuh ¶+šä2ý¯†©œ×E1Gqš3*,™>#‚èñÛO« ð:ušô=?•`OE"\²Y¡Ÿ¥ï­–R&,²I=~Ißwm÷†T¨ía±éƒ²'£J²é’pÅEf%Фº'ŸÉôid œÏ°§'൥Ñi“ÏUÚu/øÖöÐe»íO ßn\„Ô$€Ùr>.=ý?,¬f"NõÞè»~tV•'q»C¤N'”à|ý‚i{Y2áš­…ðÝÏù}ÄèÃOµ‚wÛå·âöí·øÏÇúûÐ, ñ¸hüÄwñWHJtJÚoÔNÀH»0äÚ†ý6ÁSÔOÞôg}’Òweˆ™ÚÃÙÄõü9r-¹ÕÒ„6š¶±ÁÞÁ;dô’~‹%Å-MùbÒ +p¶4ïz6p•¡æê•œëIƒ= ÞP¹ç¡²”¾á‘‡I·Í8YÇ„@ƒ†“xR«Šƒ±ƒÓVj äÌSmü8}MTÛøëìÛÈ¡4n, ú(MD%}HsMDÏ»ua?°‚öm޳±þIÙ–¡LþóáJP +È >Þâ*Ú—€Í­Å¯Ï&hëC*~´Bs`D¨;,§YÞ?n Ÿ->ú™ØwV?ånYÙ„«Rª©~g¥ÂÜQšÆ™ÃÈ<ÓŠªË©Ø “í7@ Àü(]]ëÄM¿Ô,6±úÝΖÐx_ÃÍ—+¦Ø ºZ`· ¶I­®W¢‡±IO¸…eüó;£½è?+÷Gä¿Û³Ë‰çzóõÑ„N—bq¡Å‡K;§Ï§Áï¯EaïJ8õ“ãQ1;‡wúÝKÈu þ5«Åš×áý6›Ÿ÷6ÊܧC•©bZšçïv^ɆÙ%ºŸ^FÝ-&ÒèÕ¥æ<Œ-wê–0)Í-ÎS7½×Çå¾Ý†7%Í ‹‹¼™ïG 6÷T¥p4-!GŠå1þêEõІybÞq£jð½P)a{„ª´u„ÜNʘ¾‘HÈØD’_ÝÜ@ù þ=æ[?+0ÂÁ˜ƒ¶¨BÑŠr&µþ  ¯‹«Â÷ßÙ.¼ò—"s7jQÛíãjÁØSÕš•yJ¬þFa´Â<ŠŠ.P“pDMx§ô˜˜á Í:`$”î1ú•uÎÐBà]§G߉Há­„3b½ ‹VïGçpRZ.$öcì…Rþû«C¹Ì,1…°)/ƒªâCÓÝS§ »X~ÿ|€×6%V'q}©e‹#îÌýÓÏ)­ºÜIrU®‘7&?  Xò8„Ò XŸŠhí@E˹[õtí&=QmPÇcŒY¡"¸ð\XOóÔŽú$+£*¾äŠC ¯a—hgVÉå¯y?³Ÿ5<Ó¡[Ë›1 Å9Ú®]ÌͦÄ*Ì“q€FYCõsêHeÇv4ü¼‘æ½Ú§Üõ 4Ië‹Åº ƒåè«Ã®þ£ªµ?UMÑÙ*‚û°ö±Ý(’ΗrKBÛô7ŒÑo:as¾¿¡@n“­Æ¨µMtH¡>ö^oT/lOQ÷Áî +B†mSp|U˜ Ô–ìÄû1ò<h*sŽþT\âÇi ¹Ìôúó-ÖªKñ‘ÐÛ!t/îȨƊŽðX8ÎÎönPwðÞ!tÔA Ð!6{"ýÔ…[o´·f{˜jª è÷°d9´ðuü¹C>ÝŠÏÚz3í¾ðàx%4E3›~ÜæóøÃw€ˆL­,b5£Ù¾ìJj>á(v<5½œÀmeJ!¥ß¿ô´ npÜ‚;5$›,ÊôhFìµ-·%Eš¢ý3‡°·Xlr„å 'Ÿbâ~46•å ï›_ÀÒ)v™†Ì7öôº42ó.Øøç+äÏ™Ä÷ÍL×aêl)M ÀܳSÈ< +’Æ>OÊ8R#êi‚ÉbcÝÂJ]–¹Åïiòñ9×üZÊ"ñÎ Ya‰Ëª†¯kHۜ՘‰Mý|?"®5{ë˜jÒœ4ƒiaoùü¨êÊ,ÕçЫcÄ¿GÙ)÷h8)e qE0*ø=ˆÂ‘(|ºÿs‹{º*<ôzc`ó2Æ(9,ã-ro Åét%ý1¿|Q…&À\€i¾¡S+w9óÀÿŒc"àw@¬žSQxÚÐÞï¸Rˆ83N~‰WÆ—ÒÏäG&bsñZ¡rÃ8â$g•Ô§C“ÙúÉ!›Óx¼mKP¬’sv_¯5á.…âV±¿âóOŒkøF"¼¡!*g¨ ¢g,ùû”ϹôËÖW-¤ÌáÂõOÈ£í§6!.Ô=0Ö Í\ðñ›="8­ž~ñ׆¯q…Ý}†l¬7OéCs/ßߘe ݪQMÌ“?záW cÃ!íÈ„ë'Lcžu`fÝæ¾ +†¡V¤ @ìbJXˆÎ-M_ qô#õS§~!"É2ϦÔ:kcX½Z2—¹.«nÝâÉèW¢•Ô¸©£,;fØÇg#iŠP²w’?q¶ê7=uFC±Ì +p°Rµ«r·/6¹_Ô¢ù’J]ŸR¢m¥HKÔg ƒ;R©†Ì•t4.dêÁi£qžV‹â±ëlyþ°ÀÊM‰úW3½Ýå–˜Ùr‘yK +ã„pÉ€Ù]~ek錶Ó¬|5ƒMÚþ$ûÔ ŠGzÃFQ€ÅgšK˩ī, (@¾›[:Žvˆ5™x‰0ïóMÈóŸÞEûÅß ûwvqåXˆ…«yFäyþ0ã†Àž·jð¯xlzÊc=T)Ü-^{òØ+3\wLŸRŸú“Ü–ížâÖFú >£(0³sp”zŒèZªŽË'2l@W¡c[Q…=o¢nÀ•¯{p‰ 9ƒ)iê)úŽWD6=ŒæèZ&Æé2EÒBvG»%ìRÎgµÊ³àÉÅ0œ$ål—ŧIƒ•ü˜ÇŸ!*XM¾ F£^ MÈ›`™ÚrTõn©ü­÷]_(oÉ…«v}¦µÊ«pB¥+*¤“pKàñÙeÁ(6Wb¨x2!Q7%ðŽIÍû›2êg™AóRõµóSw¦‰ê—«>°H)DªÂf *S䘽FþÉZRµWÚkìíYàòE>XÛCSUh]A\l%ô†½HÓ~ù†¬%×ÍLÞŸÌ!««<ãäÅ;ìÀ¿Ôz÷ :Ä»ôq^Õ¡oEÏ?i¬`ÓKÔß)?µšçæ°˜UeMÈœ¤‰U_ÀpÍÇjjíÞ74¡.h6ÆÃ\T²5÷›Œ+¦è†iò„ñÓÃÑ&wœ¢a?ÒUIªVòÝñip‹“&ñZð)£tÓ[(”x ­Ä—ƒ/üqû2€_©JM|U›‰¬æèƒ×H¡“£8ÎxÝDC=ß“üô:ªAê¦}_IÀ"Z£ŠKµ@ä]ß®* ;ÙZ Vu b½%켇!SaºµP—=gIIë.›GÚ0FŸìÃéîyò>¯M.´¼ö&yrìu儯^âpÊê4Ë(ÓÞ×âȈݹ ^Aº±×=]p#R\?3Ÿ„³1½*Õ3'p§½ä#ÂöUŠ(Ä ù íïý~ †ïzç½ØäâÒóçœöœÎç{{á”3«u›ŒæW—ø¾FÆÖ#5½™SBå’ù¤ «’¤)Õ˜üñɧי„Å‘BÉþ[Ýgt„Îu´Ô­£i"ÁκNÏeó›ð³´‰Ê¡_×| 97ÈÐwü¾1n2M΂³¡ $n3È@"Ãë‘S†õîÎãݤÂ77Óðh¯h6k±ª…"~‘;7ĺóÀΞÿÈ4ÊÕ®·Sˆv†¿|Ó¨ÕÄ»º4¼.V‰ ×ˆRžªXôØRZÜ®VA(­5§â–;=&ˆ£'’wj[†n†¢>Bû“ž h48"‘nÒ¢¼ŸSšÇ– SåRâ^ç´iÿ•>-ÕXZNŸGÅ=ëþðCãˆ!Câ­„î±áZ££€šÐÚÆÁ} ñ]2ÔóŽß+û ËÕâ¢Pâ!Ã¥pÓýTj™‡×Æ“Vsʾ5¦âì5¯@7„׉¨ùS°$oôö£ý€7ÑGƒÐÝmnűw”‡’”’b^‰Ò™ZæÎ£ß}ßVÚ‰P—mãíäSNú¥çM¾˜T=¿¯)ß;ℱÿžëçñ¤¤Å@”ŸQì ê}{BxÇÑÆÏ0í‘ ¯lR’¬fœ±‹N”BH(û ; µ’¸õq¯pS#‡ûo»ªF_èâ‡O¼¨;<Þãë®´÷Ù¹Ã'Š&ëdˆ`C¦)ŽhCTDyQÔ\jËmêFQûøh È2¡*H³i‰©C‹}óe›J}OT±‰»‹a@]ª€8 ŒOBh%“®]ÞRL4 µ." ^èßkuŸg-q“,IC©¾I»®Þ—¢ïL§”Äë×Oü´ fðA}F?”×Q°!cÀ`_¾Hx¦p0¦2Þ®!Gbª†&½Ãü*Ct½MHÎàf]y+‰ rÿí„ñåGf=¡ˆÕMĤªÀb6ŵ=ÕXÿ´Áˆ²­^h0óÑ09cËN`Z B£€÷õMwÁ^@Ä0•NŒP7_»ìá¼F˺öMgkd0s•+›*md±äxk•Ïý«;Ù-€‡yMN57Ÿýد†”yˆö*Ìd†ƒH÷Ûtúh÷—}f"´ì³|PJ±S¼#G[â;«>ÿZ“‰4]ï3A|…*KBz#˜ Uõvi4:8i,pLI¬Yu-9uPÔ>K\2MÒߪì/¡.3—,\»™‹‘ÿ ]Ûߤ´šÂÓ ”‹Ö(*Fd8N†tÎPê36äó‹F”õl`Å$ýbd¶k‡ÓÜ„¿aèN_ÓÑx ¬xo8ˆ‘ø3éÛ´Î=ûôÉò@Gýj«9žkÞæÃ^s>áÕX8'‚Ì/½PÒ2X^$0¡ˆ7Vÿ!øšFÊ<è{9ÌÍÔu‚:CíÅŸIÚâ*AˆáÊîþÍŠanÎFZÀܺEâmÊ‘•Ò°'ý¸¾Šê-zߥ“ö•bæN¶Ö]bD¸û]ƵÊ¿ïþª´Ô5¾@=ê ˯©W}aá)V%+ݦkð5ÁKS²«,êÔYó ü€ðD¨§‘ãÞŸq-´b&©¥‡pUf~¾*ê Ë®p À®‘6ï§u²¨:¼I¨Ù°»)¸e(+2t?¯«±C +»Š *«÷ÌlFHÿ)Ý@~˜ZɈZŸ°áæ$°~Ä™&g7S&äP³M–el“ÛðëTô¦B‹YF«,c¡èë­.*iyÍ¡ K{Ú@¡*yJ? ¶\5Þ@¢`<î3µ0ӤΠ­á5•Ì´¢´íf[Á°bí©8$šœm&û×(ÐcûqT²ŠÄoµ”a£¯|·ýYæeŸ :¾QÉÝÛÑ4ˆ‹K䵚³Í¯*b›aµ¶½’ÛÝ&©º>÷A•ηtÝÐRLnŒ\0¼tT´Æj½›?P•¹!4²ê ¼l¦ÔÚˆx5å›· vŸÜ£CD¨ݵgOt>Eú¯„£å¤ÔøAá…¡-€*Ý5¼r%" +2“"b'úm0%î;f©Eþ³¸ƒj'dª,É‹g! oßrÐøØ˜ºi n²1»+~‹ #¥æ¬‡# BÜŽ'ºâýa‘é“MÎòTçé‰Ìñ䇀äeöé‹ eé;t|öÁ+÷Þ Iõõ^J×k}ïo¤Ñ¬xÞ‚‡ÖžÔ(þ󢨦žÅ–Ø3R3©ßõžùâçϪE‡ª¹–ÎÎÉ,å¥î¿@×?Uä™ç@ÇÅqÞÛSñ°t²‰Ös÷ÊýùH0½6$ Y§E! c5. oMÖ3"³ä7%07Öþ€ûŠ9ÔB‰C©k¢WÜa{‹ÆŸR·(Ôgþt*³=?w +¦|&ó Tò7‚M%[ܧø‡p‹­Ûk{Îåͧ~¿•Õ4µÀL”ñKSSç9iر/Y‹[¸T_È œÝ•&³vzò`»l žã3ê®9&FGŽZ†[h’–Jð+Ô%áa'ˆsö n!¾)kžõ~Ä4®jòÔÑRœ>¶‡ä)¨‚IêaGUõƒéÓwŽk_ài– ñz¯á*”¾ +P€´@'±B1@0LQÌÍ-?n°ÐÕšåeÒÓ:xXŽüØ@¦ñ¦åÀõÅßXä¯fJàïë’ö¬µ‹aþŽìR5ñìk_’¨ï® ã© êrd[½÷É_î9•x%ì xAr|C (Dº°gÙi±5Âã¢CñyØÑÝu°# ä™uÿ° +ÒÕ LpÕt783ɉZföEžqé._r%X_VK^úiû¦B«™’¼ÍAV1ÉNY:pYf.Š‹¾ßºy-ñPîZ–SùtÏ ‹4û‰Q¼è±'ot£C"¥Õµ¢ÝÈlݲ¸Š5þë© 9vVä”R9fñ®4Lù"¯ß¶>‹»šÃÊÿcÕŸdpÖoÈ8É£Ô_Âyk‚'ƒœ€¶¡ý¦ ¶Ÿvîç¼½=⨧ÿ݇yÿD5ÿ +­Ú>—?($Þëñ•}BûÎEÞ°^ºÚ|ÆÄêŸþúÒi÷´‡ñ¢›LL›g¹ìަ¹û"ƒ;ÚÚ‚–Øw®]ÙéÌgÇæí)Õü!ÝÒ ˜M:ìé–ä”y¬}Üžs§Ï8vÝ â¢èÒ—γ·Üœ9×ãPÊò€²×ZÿêW5¿™½jËj•ºùׄޗMú[ óõ«ãî™ûÖÉÚï3©.dbqã•ΔãøÁ×¶÷ÝÁþšøÞP˧3yº-7„$ ùågkÄ™¸Å=Q²Ö/ºÛóÆ}cïÆe'Âäz.5LßöqÁ–åYLÿtëSÿ̪2¹çR¤uþõ‘¨ôov}‰_[% >ï|»xÃõÓ™UKv¤Çp%^L—Î|;]Gû±î/­ä½ýlÕe +Îe[×Ê48úß8òßúîF+ac–'Ñ'#çJv›*V®_ ’~vI©³Êé[{sÃ]òêX_=›ðˤú‘œñ„-|iÛ7m\â¢pX1µ$!øž¨sÛ‡üɪÍocŽ%_~?§§JwÓ·LƒÎ©rnŽW›ñ¨H¯í~’-ÑÊ_˜/þ:…_æøu»¥Å‹Ïl(¿|gÎÅ‹¾ß™–ëÝý~ášUµíÉ,s®¹»gß®fÞ»¹7M¾ê¡gìqéG«ø-S³Ðï'ßlÝÄaËw€?#t}áñð«÷ +Ÿd´é[,û±žJ±÷ž=Zg;¼fçÏUìö`áu8ý󤥯ÎxΠlO/i­N¢gË‚þoÿôñ]Ï–‘ ú&ëï®M?¡×³9i=‹ªÎ¡~5þ¸_w×s¯Ë¬nædh¯û¾øÚ®w> 6½n=o•}êâÓ[?¤nÙû^×Éòý­^/%ýÇçËVU0E¼^h%œ/Ä Ö ðu‰qâéGbíÓ9ÜlïrÌ_°·87nnGùêÇV÷t½s/]49_Ëk_¼SÁ· k‹¹ª™7=4íº¤×Ë-ú²ƒÓѾGa©·Ë‰s Þû&Íõ¤Å`káÅ{ò[nÊ_º¤ò¸àÕ¥{öÔÕܹj#›a~iÍç}^·¥ GŸ¨w}¥b_dz~ûrá­JÌm>-~XécÿæûîENòä6È7Ùe/<÷âADVàj9Ù2¦øüE_ý ]æ·žzÅwí¹µ73Ï…;[¶9¬<ù©òé±õ}Kf/hÚvñ;¯™w¶t[…Ù’¨§Ú–ͼ(#¼cK‡|vT¤ÿéǯ~”ûýÁöTZ3~¾Hø-™ðjÃ;³/E†ñ mõ™*Sëäà>}ËÑŸ|Ç“"_ô¾†'mºä²Ók£öb“³ïK_÷5uøc@!à5`Xœ“šXT’Ÿ›X”ÍÛ•Šendstream +endobj +499 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 5648 0 R +/FirstChar 2 +/LastChar 151 +/Widths 5655 0 R +/BaseFont /SPHROT+NimbusRomNo9L-Medi +/FontDescriptor 497 0 R +>> endobj +497 0 obj << +/Ascent 690 +/CapHeight 690 +/Descent -209 +/FontName /SPHROT+NimbusRomNo9L-Medi +/ItalicAngle 0 +/StemV 140 +/XHeight 461 +/FontBBox [-168 -341 1000 960] +/Flags 4 +/CharSet (/fi/exclam/numbersign/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/question/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/emdash) +/FontFile 498 0 R +>> endobj +5655 0 obj +[556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 500 0 0 0 0 333 333 0 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 0 0 0 0 500 0 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 0 722 556 667 722 722 1000 722 722 667 333 0 333 0 500 0 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ] +endobj +484 0 obj << +/Length1 1612 +/Length2 19242 +/Length3 532 +/Length 20154 +/Filter /FlateDecode +>> +stream +xÚ¬·cxeíÖ&WX©ØÉŠmÛ¶mkŶ]a%۪ضmÛ¶O½{w÷××>}þôù~ÌëšÏÀ=pg¬5I ”iMìŒLÅì€Î´Œt \9K[#'Y;  ­’©¹ ௖”TØÑÔÐÙÒ(bèlÊP75ˆ˜˜˜Œœœœ°¤a;{GKs g…ª’:%55ÍIþ1yüOÍ_O'Ks €ìï‹«©½­)Ðù/Äÿµ£²©)ÀÙÂ`fic +–WД”PˆË©ÄM¦Ž†6#Kc€Œ¥±)ÐÉ”`fç°ù÷`l4±ü§4'º¿X‚NC€“½©±å_7SwcSûT4{SG[K'§¿ïK'€¹£!Ðùoœí–@c“ø+7³ûWBöŽv-lÿêþ‚)Ø99;;ZÚ;þFUûwžÎ†ÎÿÄv²ü«Ø™ýµ4±3vù§¤éþÂüÕ:ZΦîÎÿÄ22˜X:ÙÛzüýÌÞÑò_i¸8YÍÿ+€£©¹¡£‰©“Ó_˜¿Øÿtç¿êüoÕÚÛÛxüËÛî_Vÿ+Kg'S3:XF¦¿1ÿÆ6·ÂÒÿ3(’@3;#ÿå&.öÿSçjêø¯Qü33”“04±ÚxLLÍ`éåìœÿ†Püß±L÷ßGòÅÿ-ÿ·ÐûÿÜÿäè»ÄÿïóB‹¹ØØÈÚþ€/Àß cü³cl ÿ_憶–6ÿ‡ÿ4T7ýw’ÿ8’Ά›!4ÿKÿ…–Nb–î¦& +–ÎÆ3C›¿ú—\hbêhc 4ýË迚  ed`øŠ…¥±5ðŸÖ³þ[e +4ùÏäÿ’ô¯ÔéU$DD…©ÿs§þËJá/÷Î*öû¥ÈÚ™ü¯Ã?BBvî/Ú¿7–‰™Àö7 #£Ïÿ!Ú¿`ÿë,kèìhéÐþ[2ã¿ +ÿÏtÿFhlgòϬ(;MþŽ×ÿü£6vqtüËê¿nüß‚ÿçù_ƒnjênj »²hgÌlõ;=ÕùFöจvo7#ø`ˆ}qJAž•]—ßïðmÎrƒ÷êºúI®Ï…Sû})ªƒántò®dÓË\\bÊž<¤ ²6vêƒ@z½b„Ô3õh¯«y™--6µƒqE%½¢w(¼É6fGè«'Jb×<T’Gûï¾Æ)µ±hí?êAÿ䟞‘%?=’÷ tÝ@öìãPgÅÂr»B Eù;dáðk©–{EPB¥6ÀãÜ´^}¨wzéå’`“DÚʼ*˜ç®[eÞ“ S[ùye%š÷+4Яg'£x'9g²¿Ö\HE0xp'‚zo§­I‚¦Ò¿Õâ>€]Sô:…{ý±­¢zíùž=74¥Ø^\ëÖµOÊ@;áRñ]¸ÙÞ‰ÔSgIHÚÂô½$3û«ÿq^݈·­{ƺúLÆ$[×ñO:¦ÝicØ ÚI[¾aýHß„Ì`Põ–ܘqᙢG›ïe”k/I|©;ô#c”†6\åï{úúbÕö&™9•§¤áÎÂÄ œ…àLQ_ÎDøp’8âïèFs£aÚ_§}Giî›@äßå'ž'¡.ýèD°Ósù¦þ—ôTe¹$6‚¶ômdewOÌÕ?¹J“ cª Þ†FW¾Of„óðÆ¢Gë…¶½"ÂêÔYi÷Gsžçˆü ­ß´G­_¿ƒ{~1‡áiOúó©ƒs PŒŒv±$Ä‚»œ­6Ê÷#Žšî@^g:t< +®;Ë¿=ÂOMlñäxVHôý‹»ü4û!¡bȪÖüã•à©Åä4.„ +íÓçuÈæ Öztð¸º/!J&ªcd>9ñÎŒ>Õó5 ÑTõò©LÂj×öwÃíùÙªíPÀg‰}ö¨ðÕ[[ì _gÝ­ŒïsÖû*ªU/dÑwÔÕ$˜Û„˜šü*Ÿ˜êþ^¯p‰ ãËx›DE—tLB4ø1%¡@%cȬQdº±¯uPTƒx>Ч‡·‘¥—ÇDiÞŸïØñcȱÖíz zz^N&^_öfÔÕm¨:¯¦[¼Ííün5QCòÍE8¯Í R—u¶??‘_íô.¿WA3`ø ‰’"ö=2¾s„Šj®•Ò®ÒŸ%“QR²°vIE¼ | ÙÓÜ‘þÆÍωbòóÝSO*="Û&QMWñ\5lÊoaõs2o-Êór{úÞÝݬiBªï$¶}16·às11Ç®f˜ö6–‰‘_~Z4¨„ik¡Êùã—³5K5Ú#Cü@–öËQ:šÍR®ÐÚÉ€}ºƒRñ׶󻔨[Íè0jX,<†Ÿ*õzzão–L§ªv¹8KJ.(!Tl‘ÁÏŸ<<`¦:êé·8Ê3ì©6ä¢ßB†häÎÄ_õœ²`6¨›µd&a )ðU#4;£ÚA;³cèpÖÃøó–¶fèéë&‘eÇ¥’Úß(‘Æd°¸m‚8ìpÎugðàÎ B:ÃFpJø’µ%0ÏO\¤wÖ´ ¨Ã*Ö¾Ø2Ð=ÇóX7©'´€¦Å;Ý@ÑðÕ—²cQòEm“53OØgxCöä‘ÂW’†ŽÚ¿ù$ø²åíÝɹÈÄ,Ÿ’:LBŠƒÌ…NÜ !²·7Ã¥%ìÛœ]¢<šàš· ¤d§‡n+¡‹!Ï­uš¿:ÔOîI¤YÝÆ¤¦x+Ánt)C7K"µ°T›¢á6'yTG‚Š74˜æ³Ž1HrÓÚ|rܲ±‹Š}t…¥`¸}É‘y+ è5ÖÉMy“À5Ú@êÑ[U»PŽªÙFQ€Á°%¿gžQ‘¬¤÷ûk3Ôwåß`,PX{Åñ¹!_é Éxøöjhã#;b¶nÂzvh:Ï~_¦ä }`Ò‰=½Éeµò”\g9ߨ.:µ(d=ß…)¥¼ÎqB¤´zµ¸3fnuxª<\¶QÐ’Iò ~ii¿&íÿJ,uP°§q؈éêsHÚJ„@ýŒî–"…À­kT/”IòG¥% =Ó]9ï9Ó+J]Xé­p®ÒÛ+q>1÷¯2cw7ÍL á!YÅÜÐɑȿºUþÓmóhµ6}ü~Ë·áÒ7·)ãž¡5 µÿ¼×Óá–tØH¿Bêè¢Aj+—z(†¹£*yå»°#~“ÕãÅP¬è¼œqPŒÌB Ï Â)T‹®|bxY³«ûɧve…"! ÜÃÅ~•öç@‘õÂÖ ª¿‘åñ‚…³·ô*ÃætTªot‚Ú×5BcV¶þ•º—õC»A„ Ì¡W{`!y•JÈÚÕ°YéE‘ŒÚ¡2Ÿ5aRŸ4Ý`RÊ52vÏñªÕù„K¿ ®Îž’öã3jA +’¤òÞîSurx±­š@}Æ0DS'0÷Jho·]µKAÕA@·e›I*ßTP[·ê§í ~¥O\ ºo‚Ô€DHž$jë _©–ô –Âk+©8~WÜÙý“r¸)fýhéΠ&Ôè}f¯ú"BÓ;ÕËðk‹†üts§PÖ:à|Ø©t#9÷üHÝ´Ù}†N¶t'̪_ö•vè@@ÁT¬lè»W`•_iÔ©äý‚Àׇryµï +„L¡µ\œH^-Ÿ·=]òý¡¼5f’yÄü¸¹>ïâñAÉuåÂÓ¾PŸÎPàm-ˆKò9¶ëì,MáD¿´Ò€Dò‚µ8p¶4ÈÍäæþÓsR™VDÎ+›È®ï}ô¸0ÄæW+ON -ZJÜÝœÔph•öOcBs¦a¨2U$âåeÒ²‰nÅÇVýÌ;=2|ÆQ áRb=Wy5Äé8‹ï_FîBè½EK᱈ßußS’i%Mâ°ÅÇ阄w6N&ý„µ|Þ°XÒ0&Eš}[Ï1Y¥Bþ‹={¹…ãæYLîÙ.îˆÁÐ4ƒÊ9?fd[ƒWAã °fà‘, üTqˆÅ ázër±©±CkÛytnatM}ϱF ¡`<ƒ@Ë£Ïô*à {'«ê…/+éæÇ„3”Ñ\êõ(c_@÷[' +¦gkÓʵš· +/†`ÏËJ 7yØŒä8ZŽas¤± +¿ÄJûÕ+öó5üF3Z!^ Nà½th ªŸ4²DOc}= ~< ,Ç’q/lñŸ&¬;óH +¶Mæv?¢fŒº¡ôл1€5§ŒŒO÷vدí˼Ì:~q\²Œ c¼J:,úÄåÝÍÔ4K\¿] +²à*94´ˆ¶ÀÄ2üúmÕ´F÷ u<‡À:È]53ôúÏŠígRÅÏ[ðÑèk¹¤9óæëcÁè]g˜îÒë?ŒäÑV±Ã߯ª;§w†Ø`ŒÄý¡Ö4‡¢6&H_j´Â%/±Ê@^ùò{G€`¥rãÂE°}áûY J +öþº70“hPÝýˆZŸ,>J_Ƶ6Þ˜Z–?1EÊ~ü2‚HJÊT2rÅÐòE˜#ñn/ØÛR6Á³å¤j7Ö"Ú¶YθóúÚŠô`õ]Ì2wv£·LOx*Æ”ùXº³kΉž8h­sB1ëkp„å»=ëcFŠŠ†étn½Š¹i“Â'ŽÆVt?×85"°‹4ž~¿CYóx©0ÍÇnÚÿö»€9Ëʽ•|"˼o~ ËFŒz:DµsÏû!Â1Hm*€_U£Bâ°ÂÄŠÕ‡´™Á%Ö¡ã‡0›öª.^êpæôó›åþw»ú+1‹<ŠÄ`¶ @æª&©¦ƒâ³1SJ(y*58Fá‹:½w 4Y™_ ÚÃ’ÿ)ùMó(\þ†-ß×T%ÐjÙ5³±g‹¨âXÌ9`ùø`À4K +2iVÝ"ËÁ ð—8‡QðÛGÈ?I }áÜÖMaÿSƒãóºï$i i}°í‡;«¢r_7.¼Â& +Ïk®sù°ªÌ[«×í¹1t̪Ù£»a8‚—·vÚ­.—52‡~²>’²TP:T”ŸkzŽ»‡~ ØaŠG¡:A7X˜ +Eq#;¶ÿUO. +æ£\s0V‚ÑÙàÖ±Þ¢vœ–7SN‚•v¼m› k[žØñtù“þ“T‡¨äϱÂ4uñU+ÊYeÆv%"úÅt¥d{ µÐo¤åQ­ÝtåDüÚúyIïJáÓYÌóAç{Báv %í%¶&ŸÞ¨wßNfgqñ—«fRnc‚ +&P[³)2Z˜«áõNUy7o°(‘™ôM¿´ù7ò¸i:}É{Ö¥N,kŽv,F Ñ›Gòó}€vk$ܽ Œ¿_š+Têî n+j¼ÿþ|¡˜E¢€ÒXGÊ +ZÇã¨ñ‘u‡plslü|!aÍQa‰ÜP ÛhÉ\ ¿Ùwû6!½ïçP¿8Ξ>œâ$!ðÜ^6ˆ…kû'"‰?õRÐù൮õ®D(‹œG[Q`ûè0~ƒ-ËC ˜¦ÜÂ’ªýYí“[Èü÷ûN}R>ÁwÉ­ˆ[ÍÖßxd€tå³:aXK³ˆ_ÉHn5š‰¬ nXФµÖ +!ÝÒLz~m¢—Ü#Hru~X‰®¬KØŽœ9àqல?Ƹ5qî‘Êbu¼¦nùë8V5fxJ*êm©µÍõBKuÞ”Só°o%rIt.Ù-¢®¥ŠaÜ‚è)¹§fI‡ã•›w ¨S›ö™‡Ž3k¿Vˆ·Ý¤'½‡\!_Z•ÈÞ<((kšOs• ¿ÜoârÔø±+D”.q(ù,UÐÍt—Cgþ~y6¢l¤7§Þv¸ÜÞ0&^KLpËQU NýuV›oÇÉÇÎ)“5.5°B‰èº9 éÚîþ!œû<ŸÈ¢äÒ {º»ÄA óÞM¬»U·¬b ’s¸°Œ/¤ÂÁÒªÉåÃõBwE7eôï†miD:\“Ž6GápýIèÏ¸Ò +·YìDï+ªZÜ‚Ã$8$Ÿµ=’5TùXâe öíóáUDd‡|“ÏÍ›¸d…ã%,ófµÍs‘ÄSC>>JK>> í.Å*VÚ) IšFrÑkrSÉÂæàÞeÒUÒÊ- Ðõf@ãYDÆQ¶‚Kz–:p6ª ♘îaöîKG:H²t¦s,Z³ôÞ•ŸÔ¬¸¥¨‡@eæ£'Ô³Iðnp·^ªTÅcÿ$€YAœ{(Â+k áš ÅÒ#Ù‡EJz¤ÐÈÝŽâÙ—s:>^2ɇèjžàî±¹HÉ–*eüÝ¿(#E¾v¼Îv± Âëùg»y×ržž¥À‰DâÎÄyjôûm“§Ó¾;_}I•Z3ß’Š[i±N\ƒÇ®U>ÿœWÀÓ"Â!%ccg&:›§~9êlÀÜñtæéƒäxä–˜ª?u™ÂÛЭPrå«2¢¨ ñ½£h8¢Y-FtȘ2_ A‘§ÈXÇíõæq“ÊõÚë-þh•qˆ°NåçÏù;6æVðê\÷W#Ëâ³ï8é›ß‹eG~ý.2Kî²UpXMÕbhF•š8E²yqT-͘”ëÆΩSí'fÕ‡‘.âo׊n?³¶ÙíXüÀxJºˆ‘‘ñÛñš±cñ£`Œ­ÞVWg Ü«ô79϶ҸEƒ¥¥d· ÈÓÔ~íÍᔉl ?Ø^dÇ­/À¨’µÉÎÖ{CßËbV¯5[’z0†#™Ÿ` ì{¶e}Æí—f@€ôÀÛ~«‘ÎãQëm÷]sp¡c Z½Ø³]p|ŤÃÜDTba#€³eðOhq=Gª3G8,µ7ܽ=;i-‹þ"YáJ8íéíÒÿÄ}t¹±u¬Ó9½“­ÀˆÄ[&…¸$È{Do Ž,Ã>ƒôh _Ë—Ž$ÀãÈ‚¦é;>ÃöÕO$ ”!TÿÂ4ìcÈŽÇ+±Êô±ƒ98Ðð'œâÀ dðÖ³‰YøáÛý# Ú^¥+ù ‘+ !¬MÌþ’ÞS! w?RÃ9†ÒTvaͯì)ÏYóÍçþu*·î×Þ‰³RGõ Tu†Ò@\˜ÄÍϰ.ºöpbÏY1…h”}ldVD\Ñ­FGÎï´JÍ#&[<ëñxùr´¢SžÎ$GùÞX Ùþ®{ìµ–ù×ndYf4<(^Ù°´þ­s]Üî¦Òcç¸\àŸ@*//¡Å»½ˆlãH¶|ëvœ»À=°” Q‹A7\…_t|õ0 AKZy+?`6ÅV9Í“Ö(~RÑÆÏÝÒ1냹Üñ¥Ý¢Él´¤£fØzVúm®C^§6Âé ùFŽüâbu¯å1 ÎM¾Sfη+§Éýµ—òÈÌrr,‹Ñ¶Žáñùˆ·&¦HKó°ˆ%XåM€³cûxØ9Ÿkª·^m òfzþ‡ëW1¬¯­ª¨Ÿ(v€ÛöÉÈ]ÕðŒs0Wê…ehhVò˜XPÉ>Ñ}„šZÅ ï„9–qùÕç;I‘hËO]2J¿ZáU¶§^ÎB€«"ÕoÂb޽ðE´/yYÐ%ÁgÂ0aÿ ˆð¯—wŽHRžhódž½~é²o +æ{æ fÈ©HgÖ—B7Ôç©þ~8ì(PþNS,}ö‹—Éz +˜ê™gw jÑ {Òí–äBŽË&1«‘Aò)Ù‚WR)Å#¡øy?\»@Fšïdþž æe§§ÊâÊàí,•ù·Ð¡’x¢QM&ó&4b2iCy5’›&e ÍkVZÄTð­dî·XÕ`!=ªåŠÀÊÞß¡¾¹ç6 ë{Yú=⿲òT”»®’{)Ídˆ(¬ÜÉϺІÞ×Õ×â¥ÿˆÁá5F¢È$IWRm³ßì-û+ ú4Èk>nE&з®Þ/L ¯û* ë§ÌÞ­ub«#ÐÛ +çðáxxí3Ý—*˜ìâf÷«eð–wíRÌׄ½”Š5‰}•úóŠÑIfkž2;ƒ›‚2Ϲï¤ãë¶ÚÛþ4E6xhJõ-8;|“w?H3YÒ–ÎM1?ž )’À6óã¼`I 0ÅŽ÷Tž1UV·?W¯"”ºubuDãÍÁrnå}.‹w²ÈC¹È»á¡âêyŸ9µòý¢­I¡NíGÃçkmyÝIæÕ“m÷»:,{›*zM_Âiy´þª»_œJB—tdM`9YÆ)©:59¾¹NIrKC6ƒë­I¶rÏλóq!\S¶É·ö‰3þ]R€Ì0Qê[Xô !<œvyó¨ÚøÐJ£¥¤k8§eÁç-!65˜Žqñä­qšc Q.Ͷâ9 3Õ€Zàx:ÿ¡Ç}-ÍÇÑ¡»w¹#ûvÈŠÓvjÊaq‚2MÔ=ú©ÉÜ,+¦øŽ#±1€Œ JeC°Õ½+”£ ª•V«lÛº…ø7§z1Áè<µ‘“"GÅ<öFÅ«ê;ûx<Æ“ +ÏàÐt5è^8ë‚yŽ…·8ÿ9´Øe0Ø¢‡Ð%4BE:æYÌ\pɳ.…oþî@" žu%Û®Ñ6cÅ\j^Kq ô¢>*}-Œ 0ÛªóŒ#‹öLØVøɰ %p&˜<¼;ËŽóBí¸Ë8• 8®f¹ìâá¦S}¯ ošñÓWܦBŸe*²½ƒô޲ê‚K©kçÜl«?W¹f<³Ø&Ðqi2¤7ÁÃ+PÊ|SuAtŒM`Êã¼Q<ïƒ6)õ²´u‘‘ëyM+/Ó –„s^ÝÀ âaS7Z' ©"“¡E4sZï2Oà:店*ZQ:Å õ°]Á˜÷û”› !쥷Kak¯œQcÀþ´@%Î|‡ÜPKz${ùbÒ˜¹/®îBŸÊ©@aú4zgìUù×!ÝO!®!ë·<-ŽqimAŒñ÷ †¼¯‚àj¡x‹šótsrÕ“ˆºÄ°÷•šåçVF.—h –ñöXRµJŒ>~üb«!½ÃÆ€ªšoȹr^?K +;ˆP颔‹ž±# "yûèûEÕ×O¤îæBÙëëèytHô[4†¹eé(28BGušANSìèKuUAt=z úÃ'óX~Q  +ußq²üÐȵ¥=M·‘Rº^Ð ïœ +6§€i“8jJô³I}YÞbNT-êO[HUÿjiŸ¶ôê$7Q¹ËÈv/æËBtœJÈîÓÑÐU¢ÚÝïÚ9…nï’°ZF<ã¹,4XsEX‚z“Ûè¡„ÔjWÜœ"ÝkiW>|‰\à‚Á‰Òrü»x²d¤‡brÙ/ã¤G‰g^a s¯ß¾ÒO¶f1Ðüšƒ.H‹ßk¼2äXï´ +/ØóÀýÐê— +õoÓÌoB¯átvLÌ}k’ñ/÷´µÜãç)-ÍK§“Û]ÿL;ž¶6ºÄ”dwôj®¼Bäƒ%å·Yú.®ûõÌ¿Âk•éÞxgú¤O&)SO»÷ûÇ.íN4F6sÐú?Ÿ&D¾—¾à~K6ö÷Ûö#¿2,ܼ*p÷vg?€ÍÝ€­›þa9î%.X÷èBà£S=X—̓g92+,C.fÝDƒÏc®*ÆŸµ!ܶ*Ø*m…X¦ˆ1n÷JšÆ_ÇáUˆˆQ4øM—¤eêµ°]ûhæxô‚ñ:y¬ºj €Ô¢ì"„·"` Ëw´ænƒ¾³ÖS£ð9¢ð‘ Õ 5Ú–·$ýÄ€³"‰Ø!¬Á7*ÂÁÛhu›@±Ã-ˆºqíÉ€ 1KP×,H5ÈéZœdM` ¼;´“:9@0XƒÉ|1è§#BõVó#gš{u@äqc)4˜qî?ºÌžD<Ø9¯rAX®„Ÿ‚÷™#ˆF.SOyNKߦƒ,,_¢ò](´°Û¾H¹c1²î“)ŒöL 2Ï+eK™«A#À7õ¤ÚßÝÁÑ}Õâ ÍY‹ûñ=Øî;s%8½¦j¢WßÀ1é–Ê2·‡áHÆ”õÁ/ÑÛÆeMGÓz¯ÐzÊ0I]²ûÏ«‡ºWPÒù—ñšªd!î¥Ì5Á%v ð±û5NÌîŒè?>!Né¡Ê•ìÍÝâèø:ÎÖ¯þd¢â?åöšè¡k—¸I”ÓÙ÷¿^gxô ê†Ì tü;Ä3ñI¶Ì¾‹ óH ÛŸ£´ŒË•• x I„<óºŠ7CKv{]¨Ñ£°L”~c|γ„¯»1Â6]’]oA Um.½Ò¢¬tR¨uIü— #”}~` +¢ÛºÌ/ﳎrÐFÓVðåçË'®oE»^!s"èª/Çrw#ˆ)òƒkôsõ£¬µZó¡Ä³8·p?0¢XémÅ'$kþÞ6FïÖŸ[<ŽÝÎèþÉä;MÞŒ_#f¼÷¯pf!Ý5C_IhnŒ”‡­Df˜}Éš:ߢêzùå^@Ö¸Ÿž×XwK¯0°!bL[¥´:퀟oD3¡;»°ë|LŠê s‚Íø‚ß`SS¨*ÓÃSZ~Ž™Ïd;¼v·ñ“{î-Ì:–ù€Ý:…§êuç´LOx=3a»-›&ÿáfäÈS¼ðÌmì‡õÕ¤ˆ·Kœ“gÈ$qQn÷0†¢v¼`^}d—<æøì¾—•ZmU)™6Éy«ØÍHG@ <ªóÁˆš?tQ ·r&¬@ý äš£®AFfézá%JÙ`ÚÚðõ*Å…yÊü,5½tNºÛXñqx\8<6L×ÐBÀD&$î:¡†Ä½5êÛµµßÈ~ÚÁ)>Ûw0äSQ( ¯xy²'æ©9¸¹`—©½¥žXGÉmúá Ô®/Ds`A|L`Ô(çêÜì:Oz’Q¤é4–A4PˆÏÓô¥R«ëô–ÞEDi&Ó^•µ ³ìÙ4Æý¯ö"û}|yµ~ÌÇZU¹ôF,v_tdZ> D%òåí ²åâOÌCP’,oÊpƒ¦Ë)Iò|Ë[3f·ÞèýØmSÜa`h§D”˜¯zŸ ¨JΣ&Í,àÝ`Í:Q×O;hã%¨ØãTbD±ô&„ µ<;\/Å6â}"æ/»#9*Ú4YV˜£Sêš| =¼&ûá·,åi +^ËÜ€íÔÂq-‚qu2W‹bp+µ‘^NÈ«ºØ¨dWÏÝ¡÷ âŸÒDþ· HãîÅRÝý1už¨ÑóŸi?oà©‚÷Z‹‰øyL6¤Ìðï@¥}T«¥( Éy½ V]ÚÃôµón¤e[ŠžyNSÊø%éñ$âK fpòcs°¬—¦1?< éûrÃ8†©¯GŠòÈù!eÔ™{Á"r°äa xÌ/.§?HÂòe]º8L‘‹zâõåR!êZ¼›š.Ú l|FV¸€¯ÍµM¥Dð1á?×j›¯XTui7^е8R4›¿ÐÏÉÀÌY‰ÜŠ.9Êž3²”;á£õµÈ¸ê|ƒ©+`<«îEV{›ø*r‹Ø óT}æ²Åº¼5$YtÆ2^et,®=ìë}fMüj©?¥¥^(Ð2ë=OcJÈ¥V©ÜfäŽ1LÞX¶óg +öñ"¥ß@»j=1O–Æ+Éçèª{¬þCÑÆ“º‰Â·žm߇íªÐi]Òäá°æ}»‰b´ +×n!ø­¤Éàë>Šç$)Ðyñ›œÜöé­»-´pìè䳞ønXÌbÔšUcÁ[9K5ïO3S-ÆaÅSÛçå~ñ ¤{ýÎîÐ95qÈ£I?ÓR@­.KƒÒGгŒë¾›Ò†’òú†Ç2Õ&¸|q$šöe31Ÿ£Tó룄.ZôoÇê¦/bBñ¨¶ÖÃ&J©È]€¼‰LcÛ²%½†È«0³/"%­Û`½¿¼ñw½pM-:ò/„æê}~árŒ=_÷¢“ÜÔæNþL~“ÔwÎmqþ !HëAßð§]22éØK–?ñÏ\«_Ô|b|óúÉó©§Cb~ÒDiÆ=·(ëŠõ;'ß 9‡µ}ÆßJ1_í¨½Y\¥,ÿA¡1~;å­]ÉkcBÑJt$®ÈÝ$­«êpU@ž5£UØïõ÷æã—Æ`ÃZÕLû# V åý;§Îd[ý0ÒÆ²6÷Þ$ØCZ_Ÿ¸ Ûô«j]k˜¹ÿÌNñ ¶þô@pi,z[Ð"-v[|"FÐìô듺‰Àå™”‚X<8#ÊÐ^Íû+&"·Øûp +œïX4:T_HÑN®çg?=,erO•xJf»é®ñ§`anÌ¡Ëô8‘ŸYw£E•‚˜m®@¢lBB±£Sgö«ÚLÎÝ2 Ž¿IÍ÷ÀÌG +A©R‚pñã!Xkc“jÅøêN]ÞxqˆðÉL*߈ˆ^¾cz¡‰dxågmMíѧâ׺nVX&î$Û¶w™þ”‘ 8b®Õ½Lûäì‹^韮¿ÛËNŒ¶jG¼¬¨GJ¡~fý¹"ÝäþÓgfàÝ(´XƒÿX’Ò”Ûñ¬]nDYÄÎJ{6gÙì˜ i|ºƒÚ~ÒnÂZš`êÂÜéÎôºÅÙI:süöc7¨ #C]* Ö~ç…%çÃP,…Ƥ£ÅýTLV£i2\b™{8½ªÞñHNLjÉ5+¤Eo{ðÈú RóQ°/O«FeµÛL~ÄV:~"¶Q¤$˶#œtR͈—¬Ëä#²ø$iXøþYïWádCÙ˜å? iFŒø Š3O +j®2pŸ”%Ð5§A”hðÚt)—|,ÿËÁËìox¡vc×]ÒïÀ—Â)»<»óY‰­¯ÆbÍÂ!f1¤Bˆ)L‡æ:qÕï[RKubù\ÉÕ*ËÔÁæJÐP?·Í˜J6ïWÖZ„ñ¼[ᵎu™±ÁÀ­}‹”ªþWm‚dÌÂ;ºÀ{­#ëåsLÁfIU‡‡ú5*Þææ]Gñ 6œgd[¯$"*ˆ“É7iÔ 92wÕ‘|5*…[¨þ)Í×k¶bŒœC6ºèò˜Ô§cˆ³’ÎÕF{ú*´©:|:påVqr°‡"3Ð/;]3äg¥"}]Ÿ^Á¸ðUB« äCÛßX2zò£%ï+ç('SÀfÙã®q]‹`DŒ´ù=r{.ŽpË%*™ ° Gé›éóÈÐZ|‹k¿[©'èJ ß-tÙ%%»T6×Ä?[Ý{e¥ð,3`Àˆ ®bÛãÜ?¢+œÚWÂH%8 løžmpµûÈÊ`ÄÉYÄF™ÓŠä¦z¾'ÊŸDMª¬é~z—h—xBóña=÷ˆí¬—Ã,žþ‘0Ñ9‡§pŸ-Œ¿Áö;R“&cþ”ƶ,PÙ£N¥¼÷'Àû“pŽLÅÔgi´œúÛ¤˜ÆGJ}ý.)¯Ýâ|!ß+ׄ„žãÌž÷çÅ‚l¬=àòठ·Û….Õ§þ-–¨x‘N·ßŒ›#‚]ÇüÌ%儤ü([‡Ìðé¢ä3ûRyY+,èÓÁ½Ú w¦ãBž4–¶‚ˆ„‡Z÷(÷†sÈ{‰Ä¼©¶EŒÀ°œv5^’ñ äf‹Iª7CešÑz·ñFkò° ¥w›'_~Ùdîα®qÁÊ‹dwF20È—¥¯)št+ž††é·ª9 c'’¤Û dù³ácz¥Ñ¾Jì±Ñš² õå¢]™³RF<ŸR™‚ŽJÀ¯Làòêò´–a¸q±]+ƒ¾èºÏCÝÓ`íѺLàò „p®U*ÞÎàž'Ìü­­9P¥mûïUÚÍpõ,Š4ª‰›ú¡¹µ ,ï +r?´$0ò}ðR±bò²ozíC©Å„S¿¾«|zÄË­€m~.a  ¯b0Íz¾æ·x³ùGŒ"ÖxzïúÊšËe…À©#:¬¡>­ p1è8f'QZñ¢ÖÄ.ØK+d螉8‹]®ìë~ ¼¡;>ÿf퉥3«t2%=àW±‰» +‰zÏ&06l2£40aê}Ü€ó@ƒ¡@ ’ƒîÂv‡šÔ20úŒšámÒÑ·“/.‰«6%«Ö¨7!.}܆l÷pu °æ!ý¦·;¹gè4‰¾Už–P™¦z UîÏ«úl×¥Nçâ¶‚Àë$üÕ{ðïÚÔõyö@=Üa +›¿l ¢gQƒvƒ£*\fñz”+F`˜ÚWÁð»yŒŸí@ŽéÀC-æc =Ø]ç°Ø{dÙªTã!üÑêY™¨,Æ”6DºL|œ¢Òͺ‹´B÷@m‚k°yi.¤×CÕaA…p˜•ÝÄò§E' +ëðÕmò±ê ’¸– ìêõ µ5œB#fðºSßÊnÓäxÞn¥(˜ ’ÈKë/T]vÜêK7”LäÔ+ dDw4’çFsÛu’G Ï0'r"8·bßW·½•ÉÁºMÔÍîi2­‰kiÃc¨qè˜Õ`._î§àRG¶GÍ9hNµÁ¾¼?ëBò’°ÖNµ $8M9bMJŽ—½ùawÙ!÷ÑAû¨k Ì:øMÔÅ 5×o¢ZjþPà5&…¡ÅõÔRdíÄhÁ×fÊÍ º5w€Ëyé° Ü¡•èÔi’‰S8x-ƒk~d@ØCPÇ’ˆ•¸‹O¹ºp”óHÅf§zš0n\AUðÃ6Ðæ—ëU&”ƒ%¶¾÷¸nm=ϲ¸(ï ˆ[fs£0<æ2,æw¢§çÃíNÁX:ÁÄœ¦á' )§½ݱ„)–fýtæiPšè U2Žöá‹pv¢»eô–ߥí¥lü¶$ÑMAÊÞÎ\¬þ0…Hzª=¢KïþêjîÜ©ý%1”yÐVl¬…ÍN[I[ö¶rŸ±}ç§weÞ`ô`}ß!£ ÖàÃ:Ö'߉œcµ}¿áMèY“Œ¼ëïŸr8ÄÉcññ TfžÐÀ°+`ÇÔs:²fƒì ‡Ò=e-a~¡¾©/‹‡ŸLÿ;/þ’ù¦Ë×>Šçæ½\b¦ ‹IãDϦ{™þØ’£è2ζÃÊÓ‹&›^("þ²î&py§%'}ΈÉÅxž‹â»íšÓ„&vÈsë!±iþ•/c·)õ“‹©ÿÈ£‹ÿ ‚Jvu‰/G"Ž +™tÿ>=ô¤¥!aÎÜB+Âml±•òfUM?(Óv™þ5=F%"Ⱦ%±‚àȳþúP!ݹ ~ ¶ NqzÌ'KJ îKaå.ÎkOµ–]#°‹µ ÉNÞw³³D»®H(ãM7%®xa#VCŒ¼¢¦¢î°eglS·’Ja–xÆU<Ò¹²¨æí€ÝƒÚ˜d:ÿn_˜ $s/`©Ó^Kµßgù@Þ\šSY$ÞoÇ +lîšKï—ôŒ­8¼€õ·Ÿ)ÞÎ2D½ÃàÔ1õžuêýÆTÍ>ׯŠqùrÚª8qû=ýY¨5îqx o’-Cƒ™^…Ú ¤6=('œ£‚‰ +"†Tƒ!8Ä—Py2 84`nñØö[n¬’RfÙO·E+7 MrÉšGƒ˜ݪEõÝV’OCF€/®“rñVyŠ AEhÞKóI¸÷/…åMè<'l\žšzŸ¯ngÈ"誤&Ÿ¶oá25)5“ð6—¹¸çä ¯PµÙUŒÜ¸;Ú¶v¤AZŒ}°^–óæ.UhéDg0áäêÔe§2þOú†Å–7°Qµ‘õ‹+§Ââr®q=Ût< ìßYZI!r#ñÅŽ*yT„uU]ì=™û,žo³&¦L£ê»ŸþßLa{º<Â)ø<{`6zÞwóá’Z_HKèÇü§“x~À'öbÞ›M Æ N3fÕ[Ʋml¹o&ÂW%Œ² NcäªâhVÚ/ Ìõ總ƒ–ëí·F¿š—™¹…KhŃåQè@› ƒƒ‚.çSXЮrÛÝò Þß o΃"–•Sùa‚ܽU”+kõÆî¯ó2 ßô=Î>6ßdóŽìÂP뉻™{ÊœJKX…),?mÄâAò:Q#zâûRÄ@TJq ³t&s¶o(ºãôØÃ‚ÿД3Èy¬XV C_›¨Ntùg|";jæ:n~Á I^°íC^2(Ê·œRpXÄ?ÙÇK†FЖ lmògaã?‚@'U¸'M­Cí Í´ÓUŽáId‹ÚUånXï :`¤K¦gçRm‹ôÇɰkUPÜæ)¶.*kxDyZCúd‘rLdŽÆa@`3Â6ü­©púŠVƒ—<\ÜCùÙV‹JA mSýŽxzñ­©A‘Éÿ´™¸Ô¨†lõr©YϼäW½U®·Ï.9A›Ó°¥úš.t¨nf̪ªO‘ЭÅÖŒêfY<*IæcìÆˆŠ`;åÕË„pÖÿ3³›:1êhî§„" R‘íµ¦|g<0:A%à±ÝÓ¶O+7)È$´¬(½$-Mœ±R9[Bhï£?-Þ®èjuäÌȧYQ¸AFØ}É¡mr9pr‹7ÖŽ…ÕF,<ýå+Q‚y¢€Îà­ÖUy%ûk&Z·þ-*†8öV-%¶xËOïÅyx‡¡N¯ƒdˆU# dé5[pûWîv‰‹Ìy€˜Ç|³‘ņ4p;éîg$(ÁÚd¢èÊô”KGüÞ¬±/óÇkBãGáÒ«€ó‹¼´YºuH—Hþg4{GŸ[Ð× ÷ò¬þ P~SxõLͳÓTª8‹ …Óý.|å} ï9q¸h`wã÷-oìÃì~¨%‡\þÿi×>ûÙ`ŒÛ{ÜAíT¨±Å,jUK*±ªVc¥Dmµ·JmMŨ½ÅM©Ø[Ûˆ½W‰½ê¼z>ÁóîüÎõþŸàÂɤ9câOËOÞ«™¬3º8g +üUüs +·ûK{Û0G’Û^Ï{¢`y.õ3²MOÙ³wêJû4WtÊÙmC%%ÝOõ˜¸¦ÇF¹HF,ðïœÅ$2oMð†ÿÝÖðaõ UËø°âÓésÉõøYCqßasZ§CQ%XQvë ò%þ‘òUo´ذ²ôñ¨?Õ+Þ³®ddªÉ9¸$Îjœˆ¡Î>†Ü¬4xqƒ¥+‡å)&Ï¡ÓBªõÅÄP þš®ËŸ•oêˆZ¸9Z_¶HÎQÆ:ñv‡íôÎm"*O¼m¬EBüá—zDÇv€-›ßHS”ß¾%Ol9ß8²î]a€áÞ–é)zë¸3ÙdyÁ¹–é–Oß!* röqæ`›®˜Õ‡El •£çU¢Æ–v¡›œ§#ÞxïŠ3óÀJN¨\¼_]¸T']Y©OÃä…¿] (J÷÷¶þÈÚ²þ€³¹â4Ð|ýn¢«øfÚ,”˜)w†£î½Ú§“:EÈSšÙøË“ݶi{=zó¢?/õ +P›ÖûƒÐõ{ÌAîŒ~n@åìÀNºƒÒ ^äI¯Ó“*› +KFp¨‘í(œ£ž¯éÿkú)žx¶3æ ×8¦ˆ íOã4VÙ¦Êg©–|á¶w„ÚSê#«<šßiF¤Fk-\)'×PHߊÅ\OÂg+J´ ˜¶ßâtâ‰j1Iß„`¢n¨ûþLäï…ˆîÞrQ)ö^æ”^—ê´ï!†&ïüjOÉyÍže˜Æ-§!Zâ/¿x¹µ‡ÊY!Çeçsl’{³u¦ÙãÌ+µ__†[R}AÌ e0­.&¤I¢‘æŸ'³ù:8gXgóÍœ;Ü+Aü{³*fÌ"òpb3))·Ì I\Ñô2S`.tÐO«§<ˆf@7'„†‹ø‰Ão ×瞈¦ç£¿ÐÇ‹­W‰¢â`¾Ãí{ ß»S%Š&'Ëv4Ñüχ°7ÚŽ'A޾œLVõøÀ1د¿*£ÉXt2zõï#´Û]9òí©õYÛe±cÕôkŽ¡Ñãxä–æ“ö\õ€JlçÏ£Œž¾pƒ(’º1U´žæ‚õ®‘JJÝY¶Ö=«¼Q·±RÞL’¸³ÝÇ(–ê!RÝÒôú˜ƒÈ7›˜ –l.nÛϨ'ð( +âBÙp$³˜BÆBr£JÌ”ËR²qdpKMSàë@#˦ڢ6)¸C˜ÔbBÎÏÙ ¨ÞØFv‘@‹®-‚ÄÍ#`ü ÙTºªö¶Dµ&?ðæcn~–pNüEèÇ=é•r~ÒŸ¹ì;o£àÀóÂraªŒ¯Ó¼jÉ{‹Z³è?†K鮉”"u_ÚlÔFEü&„çi\?Ã>ý¾ïœeè·Š[§ ¢;VQL² «v'µ®èÔŠéw0[ŒÕu±{?Ý^)^Î9&@çå]Ó›¯ÂS>ì'¢\K¤ò²{¥Xz5ëË’äé"1oS!i;’ Û×M–xWtÏ‹­Þ, rcÆ’ijHcÇôBKˆœDԊ鳉a"Ciä‚¡àÛQÎljQ@?¿)ãI‘Œù“ÕnâåKNÈmÿ­ì2mÔ8>x¡u³‡5Ë}f’buyÏ™"=¬„$[Nz…‰ÏVW\O#eP!P®Òc¤~HCtæ c7¯5ÒýŸyD`€’%¨UK…´Ü¿—cj|âŽyÑŠµî IC÷q-ö‰5zhvz´ª­ëÒ?*|‡ùSEv¹Ïðëo!'…Eæûð”÷ç®ç®¾!/œ¹ƒy8FL~‘‡V¼‡º$9lˆ°Ío–,ÁPL:£ž^ücøü屎O=ßcÔ=†‡Ó]â„oûÔÁwQx +î+KÁ¢æÔÍÃñˆ‹ÄIÞjé“n]Óa d f`åÌhhñÍ*õó¬Ô|pÿkÊv±’ѹ¢-¡š[µÇq,Þ7`À¶?ÉRí +“9œúÙœù½5>º—D ]în5w#÷ €'?†§°DÔ¥rž2UÛû4­Ù0øúŸ¼‡^4¥di«Ü«RI9­âë¬ ‰¡{þê’+¨d§Ü­âýÕ¤ŽŒ›a£Ox Ó°œ¼éߣÛl[£[éù‰ä ŦL/°Ü ôÙ›Ä*¥OqåÔY©»|¤DgLÿA-Æj•sRF‚ëP¤I™‹t0<®`_‹%«Èõ…w'Ȱ¾ä Çu2_–ªÔ>nÏ¡Óë’õö¶iš«”W8mh³Æ=˜œ +VxÙ3_w4?î<&ãl‚í+teÈ vrü>ì¤v[e?‘DÚÿ•j]<ÝÝ¡ÿ޳Ð6“áè ) ‹Ä¥ƒE‚ÎD`­G‘¹*2ÏûDŒÉuª!‘ŠbðfO žÇmß@I¶A2ÑgãÈÁ˜É¥_€g›ôpÎik„•P‡-ÍYÌС~ösJåpÈ;%…ïý•)e2 w_”Ò¾— +%©ÖŒ‚³6W‚ÂÚÉ•gç Q'Úaƒ[W>Bc5 À‡ÓëEFà" òc [.6{ç¢ý¶·¿æÔKdÁœmßl’cßsÈõŠBûb³9(˜ÒƒöÍI·£‘ç^@C„€AS²^¦eBààÆ@q:ØÊïŒ)š?į@¬"íù¨&5’±UH·M j´ŸÖZ5)¥ád8VÈã}ÌHëݪ`àÆêdÞ•’C¸/†/Ãwîs~ûïÍÞ/Ž˜ãVf[HT‚ í‘ӿřº„=×;š¼Ž|ÁØš+þEÝĘü“)o*,¯î|ðG“"︥ÓJ»‘yjßšÝ^ÄÈ¿rú Ñîõv@£ØÏN2C²ñ£·»ŒûHG T‰‡Úí=½%Ô˜RG4¶œp¨}OÚDzX«‘IÀ¸iGqI·K6Î0:ÄäÑû¡dm¿4ýó DËfaé®·³nŽ=^ŸyãòH3D¤àUd”¶àZ™4ÄëYÓ§§«xË0:Oa}ÖXé¨Þ§}…CQÂý*ÿª²µWa©_®Mõ0;¸¤({nŽ"X|`KÇœxÛ_ͯ‚®O4TK±)×vÔ\k"VwCI.}»Vž¯ç)¦…LT¿Xg¨-,¹¯3DŸ÷&q”~ƒ½ÛQ™Ð·RJˆŸâ[ù%]Ú¢ðׯåù÷~ÄÖCW¡¨¬³ŒÌ_lwò"„»­ÜÈ÷"õìáPVÁS;‰­é·Åÿ<¿cæÚê”o®/' +"¦~ëqp~€R)…k&˜hFG#ñ_r¶Œåì!ø3ï˜`p}á;ÎÛÐd¾Vj½ Ë©©3gþ7Ÿ¶™ š+Z³äÇʼVùíS¼—&s¬"=4Ñ“ÊOhœüßÏ?šŒ¿³8kCþC9àºõ²öJ®+h×;Ï]É-œô¯»²¸)~±‹‹¶æ>…›QTä))Ä&QV…ü3QOå`Ê­ËGašá2/Ç‹‰ •î$„?ŒÒ\\ (ÃÊOe5Œ¢•ylÖuÞØjÍtô;è×t¶ŒÞ6ÂQ½¢ûÝBõ¾ï›c1Q„h퉄¹aµÔ!p9µß8•eãþqÛÝ—a ýÔø¤k᜻ÓÒŒ"R;Ý eâ¿l“G\f¼Ñ\w_Ô‰F;(ݶø°¸0µÓI:ðЊTÜ€èÚ!Rÿ hþ”/_\Ðñ(ÄùRX páÿ@¥ä +|«ö•>i§2$”`Læ=ð9í٢ΆqÓwªÆ ˜Ã§ŠË)<]úêfj qÐ\EëÚˆŒï«Tcã¹¢NVŽ)ƒr+õ®Hq–®­ìÕMpö÷?=ÝÇÉG«ë ¡S‚æü•rlWªÄ÷™QþºGŸ;º¿Œ*¼—æ=öw›~hdP«¥ ‹Óø—¿Wc{ÔìWóô’ k½=2D³v%¸Îô𖍥E^Cb:;s:ßrO™êj®ê{µ÷îÑ-þ'õðYÉ!ï`+¯p§Èë÷TÖ,Ì'ØÞ¶ˆâ„¿úï +n¾!f\¬ï¦X°’dþ¡—éÜî +" £ÇO§óÚõñ®¨/ÐQh³l ×™ªÞ°ÓÇÓçíŠI +&|<û•œ¥N ­Q.¾SÚ¬ƒ'~Üá.N]b›oȪ$g,x¾ÈO?}¢¬³Æœ>{}¬(ÛßÝœ(\ýy w²Îôè’Sû¿ «ÿ`(ëXfS¥$¨Af…IñˆÖ@k•ÛÌG[¼FQ$Toà ¥ßv¼éåžW(}P¨i ¿ö‹×tGÁ +›{<\)… ó¬S' |³k¢uªˆ4“ü?{¯›æuÆí_¦¸Þf¯IÚ÷zOæù•ìù$PÚAIýÌ4…Þ4ú(Z!%ð°-Ã6h­#ç’.ÂÞV]`®m†` Gm.1qDŽ4Ò½;Ãs¤Ã ç5~‹æ™ýjîm«GAó.š”]pm4NaâM‡“ç¿«ºÈ(èFƒÿŸÑüø¯Üí}ü<Ýí}à4ÿ>[ Ìendstream +endobj +485 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 5648 0 R +/FirstChar 33 +/LastChar 125 +/Widths 5656 0 R +/BaseFont /THDDQC+NimbusMonL-Regu +/FontDescriptor 483 0 R +>> endobj +483 0 obj << +/Ascent 625 +/CapHeight 557 +/Descent -147 +/FontName /THDDQC+NimbusMonL-Regu +/ItalicAngle 0 +/StemV 41 +/XHeight 426 +/FontBBox [-12 -237 650 811] +/Flags 4 +/CharSet (/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright) +/FontFile 484 0 R +>> endobj +5656 0 obj +[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ] +endobj +481 0 obj << +/Length1 1630 +/Length2 19123 +/Length3 532 +/Length 20039 +/Filter /FlateDecode +>> +stream +xÚ¬´UT]í¶%ŠîÁY¸»{pww]¸³pwww‡àÁÝÝ!‚»»sóï]§Nµs«^ªÎÃlmëCúø9±¢ +½©½1PÜÞDÏÌÀÄ·´5vqV¶·•·ç–¥Wš»þêÙáÈÉEœ€F K{;Q# 4ˆM,,fnnn8r€ˆ½ƒ‡“¥¹@¥¦¬AMKK÷Ÿš\Æÿaùélin øûã +´±w°ÚþBü_ª`fiˆ((jIÉK¨$äÕ@; “‘ @ÑÅØÆÒ ki´sRÌì6ÿ&öv¦–ÿ´æÌðKÈ`pvšXþ º›þ1Ñ€N¶–ÎÎÿ–Îs'#;Ð߀ì–v&6.¦ÿðWofÿ¯‚œìÿzØþµýS´w9›8Y:€³*ŠŠÿ»N…èŸÜΖÍ{³¿ž¦ö&.ÿ´ô/Û_˜¿V‘¥3tý“Ë0µtv°1òø›û/˜ƒ“å¿Êpq¶´3ÿÏ +èN@s#'S ³ó_˜¿ØÿLç?ûü/Ý98Øxü+Úþ_^ÿ³K3ÐÆŒŽ™åoNÐßÜæ–vpŒÿ슔™=€™éßzS‡ÿ°¹þ5 ªv†úoF¦öv6S £¼=èoJÕÿË ÿ}$ÿ7PüßBð ½ÿoäþWŽþ—Güÿúžÿ+´¸‹¼‘íßø÷ü=2Fv€¿w øçÐØ9ýÿbŒl-m<þOQÿÕ[øïrÿ`R £¿c²3ÿK Ó¿•–Îâ–î@SEK‰ÀÌÈæïÌþ¥W³3:ÙXÚÿrû¯±è™™˜þ‹MÕÂÒÄÚîØÿmÚ™þ×þÒõ¯úåä”d%Äiÿ7ö_ŽŠ¤êáð·¶ÿÑœ½éÿþ¶wxÑ3spèY¸˜ÿ¾¿¿q³°ùüoRþ ˆù?e9#“¥;@çoßLÌÿêþ|ÿ)éý1;{ÓVGddgúwÛþ§â³‰‹“Ó_’ÿuþvýò¿ötšÀ­-Û›ð[¥ge€ê¾å OŠêô÷2C‡8”5ªúר÷ø¥‡oqW¾Õ†04Mó|´y,8¼ïIÓìöbÙPö¤/ +ð}H©û +Q7(:8i÷õË3N5¢½.eÿ@is0©ïoO*)ë—¾ALw°:Á^>Rû“ºúc=8 ùš¤5Äav¢4¡ÕœR$=>PŽ õ\éÛãÍûJÎë +…Hå'¨­Vé‹Ió}?^(QêfoÀHëi_F…Ìb×X*îŽ[×úPt¤ôŽ2^œù§o_œqþÌHqÝG™Iñ#H²Ä¨:†’øò©Äa‚U¤“hžÕ›¦Ò¿W7ž²n»ÿsˆÌ….ÈÐ7Ïù4èJ{•˶¼;â†ñ¤K†˜ŠlßÜÉ’‹ÆÔ¶¿œ}ÏŠZà‰ +òÜ1A±ÄZ=6 oБ®­ãõ¨lÓû¥%Tœ¬‰J@ƒÁÚ+bìû,ŽÈ¢ðA’d `û#**¡&¥Qö{$ÛYl• °¥F@€œ,Ô÷x>Þâ‰PÄéNþ¢i¹ûBîY½{¡Õ/8Õ‹¤áÕeŒëNÞÉÕP•ýz½ÄÜrÇË!I8W¸Äì5*Ø»½ø|¶ÕÁ÷’Ø7¹ì9…þœrõ¨îëã¥m^ÂaÔËa—E,Jãzæˆ÷æ‘D…Üè™;¡?Å™§¡¥‘Ra +ù +Çq.x×Ħ¥F^âʼnŒ¹ÆÅºi™ªZ‡™Þ ’ìa[Öíá²}Ü[4úóJÁ§gŽÁc•·¹Ç5~X4k!¿d ^x3T½°ÁWsµìb&:0Â#DZçìÞwÒ¢ç^­ɲ~CÔŸ[-óÙýy#”‰ï%‡K«±Ïq9í©©*²ÜÙª¡ú•¡È…[Ë#ƒ2jU˜ %}œDâçëúÁ«°«“ØÁûkmëôªð[H{-0í¾&hmEÄLãPŽâˆ[cD,"H„RÛÜŸ[â!Þaߊ绬ñ’Wp•¿l7²f°ˆ6ÚúX»t‡3ík ©ø½ÆfɱS;,WÑÈØ©K…ôÄüê®ÏžxÔCu…9Oˆ¾pÃZëÐËÅ>r ›L}Tù”¢ÑL½ã¡ˆžý*(ÿ™G,6e༈þ¯ï7IpÞXOÉå ªß [âÙ8+Ì×DÊXìɤåÚ+ãYÑZ¦Ú1Á¯øß<Ïó¾ÈYL$lÎ*“ý.Ë ^×è?ý+L“¢X¸M×;o˾s……\¼åE^˜ôr7y/O²S/´$ä7¸oÍ §ø3n’" «ÙW1H‰è]sj¶d6…¥ýf½¯ª5›Ä n(Érü.Á8`Ï53»ksÌL§g”à÷k{–êKÉøe*ï«ÃdÉ9r½ÂǨYA ;Þ]Ää-§»8<þ§x¼%ýïƒÈÄñ—2‹ì©‹9øCë!µafôêj®GÏɃâÄ…¡)^ý/è%ßgG4ôÔÁ €Íò=p<’wˆôA‰dm$Ïòë›j˜£ƒêÌ=Ù£?“…Z@gÐiŒoG‘ÛúŒáBIÛKïý‘‘~ö¥g`îXڸߑžZíÓvk༿]ÃBN…ŒJ›±µ°ò¤V&f¥²=S0áƒ1G¢¹ž*7T yi¶‘Lq¿®kÿ|7ì‰G¾÷²‘P£ý•iãÂ0ø9ÔÒ8+RÏ”—‹rêŠÄT…Ç&IJ+8;ôšnÚ#½Í‘"ñи¾ÈYCV–ûî–÷RÞ—J¾cé™&…AelétºhÙIS£Š,~Ù&UÚeíªE\Nï[hR\5mi”T$`r¤é»h:âšù²ZE~HúÌ—R>vCjJæþ--jí C% Ø«$¶FcŸ3Ûç…á$Ë÷Èþ3º"ªŽÛ{÷qfn§h ’¶^q^ç×wÃRòº¨LL5“.ƧHb¯KD +%Ÿ0M­ ïY;qÍ€Cd¿Ï€JDF‰êÝÞ¸Ó;\~˜É2FæW„cœ hHqÍ­-Œk<&î•JzÖÈ<à¢\S×o Ñ<´gåÎbãÀ…íè`]jÃx棄.Ê~§™_ý¾1))ÓHþ8Û?'Š/õN)õvt~¢©ÿ¾í½â Õšbïí¡áÊä8°&›–`çMm¦i£ÛV\qÀZ^qd'ÛN[¹êvÄ/³VŠ‚tùB¹)bN1fm”l^~M…ðCúÇLJauŠç‹ŒŸ‡ìMeÆ#J^:$Eµ]bjÑŸ-ð_Ù#Làq¯Í&)[*w¡û§d7÷4­êTN[¼r8퀖¶›B‘^ãøØ«¦£ÈÈ·Tî™™÷] q®6à©8}?Ás0ª¥kðØ;2Sy[%(JW³}T¶‡`Ø(ŽÔŸ'Š+š5ƒMRb\³û„ãÎÖUÙk›0t¿ÈÂ?È£%®YÄâ¿»ÑV¢X×ÒA|?Ž–µ3,ûÄP‚£5¸‘=!oÁóÐ*nЇë +n®2/Îèq©Ž¡[íØƒ ²×K$hÆ>`_ÝÈc¦ “æ f}½ªpÜà- ዯ¶™Óœ}³÷åÂFk@â벡>¹öç¶‘ Uè€6× áœRxaÃô)Ò¬;-¦_u%ŲaõTŒÐ"ØàUuZ»ÂS™ÆÒˆƒ5‰‚Õ}œñgQAV Êüš×høÏ¡‰o¸!__—e¢%5\nøÙ…ŽÝñü +0æÛ„wãñMáÝ 8%Êñ<˵|žúúcÕ•|ôß_¢û T;6§V‰}‹Àó\&Rp¬­n¶pD*£fYZe±, xè÷Nõ¢œæýÞ¿xÜ$‡.>P|·N=2ÿ²{G.ƒýÈw¦ãîãÛCe¥±fó“O˜÷È+™ÆU¯ÒjºùuÚÓä%pÜn­){„üÂ~—´"ÞÈÿ¶‡À(ºØùT)[/nä’m®Iö,;§4…Cµì´Â³žÊHl•¶Ý!N”æ/P ПMä…F*½(áÔË]ë=ضûsæMš‰è½9—ywg<Ï595ZÒ4ñ.)Ùø@‹”—׸¾Z€„ ¶42Ü$B=wV—ÆzŸÛAoÈ?V)¸­;¥ +å*¨zwÄäE[®m[ޤ5º÷¢0ìA$ [^9'oYÇ4š•Á4&cN®ÙIå’<ñàj2ðäîl”££œÑî%Aw ú-Jѹ•ªazY5r…ô”ÝrdŒéÒ+EòJgÚ—ªîÛ™u„3˜›0ºïótW¹9 x¼mm–c?ååd{áà +<‰Ù`FèÊíå­óܵ•ËVgkã˜ØK-oàìZ﵌ØT¤™u8©".»É¹éœ4ݰPߘã†Á1ÏÊ´=Z–Ñfˆ^ò!jИ; Þ}LÈöêM9Ï–}ò8ÛSäø©:‡ÝÅïµ±xêulSÕªi„žS ‚)å(CP¥_É>­ZŸìz7¼gÎkéÎÓŸÌÐ&•ÚHÄåõe;wÔÒŽÊ7¥Šmñ y)aPøŒ6âBï‡áºuøß%'æU¿p +iý1gƒ&øUn™D±ë‚=ÔR·€[ÓËáb%m›u‹åÎYäsÓay³ÀtƒÇsy§wQm’óºÍh§Hb½ÁGEYWªmH…oKº„zÓwYº×Â+PSÅ©Ž¨çŸø5ðl«@@êýHšðŠO·j€ Ú€y°p -*3Szœ¬@|íyœö«£¾ò£ûq¼õùqÛßX<¯‰¸쎛f:ņ‘Žkû¬9âË3ß'o%’å$”ÉTBi°„)SÙø‹ Ó^¿L?Í.·I&)„Ä_(ÂEÀU4#(¸b<‘7(\×âMÁ`®tðFh1ÀX;Fò4‡Ý&„CnêKw¾™¸CbùR]+'v©Í…A¸I[Çé±`}‰—Ä|H ÷;Í9”eÑè +VD†â‘:‡W,À½¥C ²ìˆ|J(û-oÝB¨®å´pm»2Î#¡P„­w°¦$B=`aC‹ÌÙ:þ‡*ÿz);¹"Ú>•ê;Ðv`IÖÊÍ¡·Ý+lm‘‚·ˆ >Îݺž³öíöF,™ÚFÞ +£W3†ÑÛò«¨%‰†œ^lu¼5ÛËSê‚ùÆgAÔJQý´Ð7ÐÂdM,7slm®Ÿç“0;º†ËŽ´ÖL\ø¦~`s·|OZÈ÷kv„ãe‘. +¢‹x+DA =šö éØ*a/Í~¯»ç耤o9Í>ð–Ãi¦.SÏ6ëÃ@ŽŠaS⫯|†ñS0¹/h݃ÑÚ‹(|™Ÿ65qŽŸS‘­á–¨»vh©Ä]¬1 “;Hêû <šSØÊ|-Ìö‚ßuýYÞ¶šZYî)V(¦›>@yï'Jž1¬žcÝÌš’Hâ]ÏÄ\?iJ¨Ðo¶àš8ƒ¹ALêæÓžBt&»2úKÝï Êà ðgÍ•éƒB•êOÙ16D:§y/çÑ@ã¨*œÝm½óÅdV–ç°¾ýpE`iÓðTsÐMöO:Æ`Í@âðXÌNRR ÷¬ÑzòGÑøÈ_\ÆT^¸69¢¦‹Œ³ÌÃ"™Á+Ϩá§jÜcàuüE¹ûœÒ+|úQÅØ¨†ñVqR Úˆþ„•<ªmß/ÐÒI üîWäL¦£Þ|QœÍNãQÑCÓUGñJ÷)édYÎq§³™~uñ)JçPÂ4Ê£o]NsÈÍB³\eޏQcpKª}ª oÏ–¦x“ˆ'^8æ¤û&‡8–f;`˜s0¦%3#l;̪½oÖËÈ÷ê»ý‰Ê‹ ÕÔõ0ìÿ”öî)ÊÍ$»ßx5m[be‰=A|Œk.ïfš¯¦JX샄»N2¡½ZSX?o+ÚM¬…å§æ{¦‚ðïøë$?/ ¨Ê…Ù2Bi9×%wU؃³Î£òs’ôãT¸çj}Oé$,EÂ"¶JfæF½¶­s8šaÀnË:œ½Dlc0äMïÌEc * F“ýË!‹hŒ'Úgmæõ±5—8ë E™]úá=¾VP¡ñ¸R¼b%EÔ–ŒeAÐÊÛb€*°#Ò+výðPƒo辶®ØB4mº4Š¥VÚ©Ú¢ 6µæ†¢ %§Ÿó©­_ãçðªQ\×\?|óqž˜ÍÂfä€Ü«ºD§èÆâÒwŒÊÔZÁßçøxf˜† ’ËUV–¾¿\ ÍD$slrðpÕRíELJdÏïtlâY ±¿ÝMm05ò åri'è>œÍAÿ˜£(Ef +{Y€L[•Sò͘§òîЪ$pŽÎ¨€­ŒJHƒ¿P³KšüH¬,̲'ê+ÃЋ„ö©L²ÙÅ}ÖYŸY˜)¤ \ÛèÀéu–«Û9Ô;o7íá.’·X£¨¿É}û.«çįo‹H%²(Ͳån¤s"aN!áïEfT©îæÓì2‹û¡‡Æâ¶ÇppÖA²óVÒ£%¨!؇Ê{lCÈÕjBwM[¼hoƒ;¡Tû8Žž?9¼†„^ëùÇÔ®|ž:ë“v£tyƒK»¡g/åGY#œŽ;ÂÝæÙ/|¶Äkrp­2¡Ð*®ÁXá=Î:rê£Pú‰°÷GøÓ%N}º‰p—=•_}’oQ +zQ¥‹Ú_–Hd~Ó“›"âC7-XpT‰îÕ&€l§·6‡Nrá ãY¾4z¢~w¯…?é÷—g°’¾£Ü‹Ò@²©ØªxT¨h¨àÐzƈLAú¦…“ObìœÖÏ8³Š†•kNÝA!_Øß1qÞfMÚn,‹(É7‹Ý)»w= Û™¹>&XѨ4ÓvæÙWÓVç²á:ãH?EN‹5š}©êäm« 42i¯€Tèóú²€¹‚2‚ø£¸æ\¦`OIS|r¯uʽ^’ïJwÁbf{À;ææ¾È—ù0/]Sp¤¬è,éë•”ø‰ ºâæóB£P[Œ[&—…÷Xn¼Åùæ@/yý þƒP…Ž•r?ö¯}S jaBºÜM[ñI–ÍtËâ?J‡ËÞè<áB~ºh¢º}îë3¡>|ájn®eå3.ˆ)jÀþŽÔÕŽ .+:ÌÛcÆÔh®É)q¾Psüf¯¯|ü”,ΰ(æÊÔu—˜ñk‚‚Þ“Äý‹ W/ HùGþ}16H=êÛÂ6Ç0ëqxú”UˆæÏÁ‰àgËm³ƒ¾—V—Iª¶ fͳâÄb™½Š:í»1ÇM@SE_I¿ù_ø7Ú¾6;çãuîD¦Ì,õÏW.³ÿòûøÖåp?ˆìífQêJ`Ðî‡Å^1CÎEtžR,p56ø¥ NY+™Ï«ø{M½»@ŠTËabýk Ïçeò;í$´áÓ/‰™´ÅŽ|hgî0Ÿã¦…sýU䣲–QÄß…ù,h-á^µÞ%¶¨- -SßôªN÷áx¡P1„î°Ýz PMåüxrÞçÈç˜Ûxa<¶f$þEMJÑ>ËîŽCèæ×sN7À£FS (Ü¥ÓÛ!йs8d‡àìb3USK.O@ ÈÄ’t¦\ç«’€à1ç_¥Ôx§òêâëÂŽãBRaÆ»h(U([ÁÛ÷¨ Ò!÷ܺ¿ #­kwQa$¿šŸ±{ò·ƒ´Màwü#Ž!rö™͘Áà{Ê<öpÌÚ[Ýi¸ö½ÚáΈbfm«ªÈX¶}2®rveñÒ¶Q ŽÙ“?F—-¾Ý»ªVcWÁØóû" Íx3¼£ÙÆÖçîžO%ÂOvÜ ¶ÎÎFG„•âžÂ‰û™¤m' å +¡’Œì£Ié2o 8^Uâ`½íŠLæù»ú<͹yô‰YTÙ(©0¥ÔþO¼»ErR÷Sϧéž­×_àX&rOnLá´j h$åôjU ©þ»u…R×~îrºÐܶpˆˆ>u ï;UÊð’ZÄëLjÕz0ߊôä¼7VšìÞØt,4¢‚œnÀ{ëm?éÞâiZ»[D¯”‰÷3›Tz¼MÝÆ¦N’JtCüÞE¡Bº¢#X…†3$꽊ö†,ØÄÞӻƭš×·ð¤euÙîÒ\%¼ûB8ª&ç/L6»{ yMpW Êt¥*¤†$~–Ì(¯µ½cÇ?^nj=/7F9y<Ï¥Àk¤ˆÐ¿+žE ùUp2wýÂc*YµŒûcZë!ûâN|sC6M„ËÝ,Ÿ¤`5ŽN ­¾ùK:”7SÝUgD2SR]¾‚ØŸÃ+Ç$ˆÝŒp ³: l´kr±Îô§Q™è«š:b5›ä]ÇÛ²ÖÁ›ÛLiùä¤u;A—^Ð…Õ-ÞeóУÀÍBŸ[޳  +уÑè¢ñý“ö3ãzr iAi/ ‘\.%a‰öÑ +¨q›Ð®Cÿ{ÿ´âëâQ&øãà'…`•‹˜q̧è2÷ˆ¥bËÌ"—C|jùÎ{¬]ˆZƒ•ùˆX"§‘‹Fùˆ$ÌWóqÖg;vuµÉdøÓð‡.¼LY9b¶É‹ÓTçy¹ßĪ$nÃW˜$åç#¯ãÈÞæ…ý\z{ªî/OçN0æY‰f¿‹ÇX¾!Q½þôæ=ÊXŸsIǹ‘°ð ŒŠº'?ý‰brcìR_yDød®ÓÈš KƒÄºî‰Q*ô•B%źN¸ÂI„Ró1X«¾¹ºÁ‹®á@°…ù.š ïKž'Î6òÇ&ÂxÆ+‹Ù>!râ ¯é^(; +JÚãúW8T~a¬-æö7ÉN±Ø š(ì%i›U®}B®C=;žžo¦Ç“Vb[?¨táÝÚ$õçm$ùãñ‡Þ‚" +âçŽTÒ»%è{j±E‘3‡ŸÆ'Jò“)&›¥À¶<7.Š)Q’^ßé«Zí×´‹Rô–Y˜šúiòE=Gs½¥»~„×4ÆBPÎàn›9kNÓ&‰BáéþáŸp©٢ȫ`÷=JØ#‚ß|¤îžÃ/~0ü”e}ÁO*ƒh7Áxd_¦µð3D÷Ïyh‹yË¡G(…¸Ù¢rUoÃpVʈ`À‘ê.>IUù›ò8± +æç&:éò0̘ …_”§j¦±á¤ $ì¡OÌù×ê=VÁ¯ÄÈqò4wÕ8GýªìAâk Ü[&ü55@D{¶J^³-i&î+z–:N^+U>×=­U~ç*HnVV‚^ÚG¤ìŒ`ÕF‘KôÎoÊBJ Ñè”ç—£‡¡ðÊRŽ{Ë@ŸÆÎù­æa>óÊüÔK+Ìi›§ëÄØêwýÍÕW,ÂyrSt+¨TÑ,ñ) âç ˆ›¨–ÜIª}p¯»ùÉCKòKÚR-´L’êÚ–#ÿ÷@ ö›*ÝÛ¡]¹ä1!ez9_wŒÅøØžÂq»Ä{õ˜ìB=¿%ª~)Jí<êjlÇùîL=í§`qòýë˾”~›À(xY&dÃÌcÑ ¹Ý&®aaï)³ix¤cƒ‘§ÞV‡ŒV¿¶€uëλfq\z$Xåe4+ÏõÕ1£÷ED[˦3VËHô,–Qóaÿ=xÛ·ô㈀4 +\ç…YÖ¤‰:8 Þy+ {ÍáŒ>®÷çi=·i•üë®Z?wJ©œ@ŽÙWO)w:Ê8QýÔ”kø}Ÿ½’ñv£¢zbà ±ÌÕñmÇÊ€é7Ôãïša"Ç<Ë#Ó8‰_ôpÑM6YwHÉËšV4_Ç Á¢“wßÝ ,™Hn!M Ä0B2TøgÙúÐoÃfa§:¬J¹Q/ו.˜2X¿`2ü±Ä,Û®ç3æÕSuµM#Ë65hqÞ§¶þóe>qýd‚d¿Ó"Ïs¹e_óúxh]6=¼ $4,ÃB :ãƒÀó´ºD¥2Z¨ ú@ã·ÿø’H _ßJ3úÄcYR0AAõ4Ê™A̲mõTk QßÌ-T=s—ßÓ›fXíeT½´‹Úk; pb|a[B?ØþIñ‚W ì +™ùuÚpª]ÜÄ%âé(¾ögzÌ7j[Eb ‡’•ÍxÆû\ÞÐ/r÷ïO\êúp±/ŽR-÷i>dŽÍiã ¤ò€+` ;(CžÝò\™ñî$K9›3œ'Ck‡Óï¬u>’]ð2 iÂûÛ»µ!ÎÒ¡§F{v†±d§ãO¹SÛ2¦Ä›”åf¦Ï?á‘q~‘9":_²`âåi]9t”ËlZs‰ÚxpÍ‹ hËÚ=¢_J(½vËqÏÆK« %|u Ë&£Õ8ŠMá‘]zU!Ÿãä"Éb©ÒIæÑuöN•˜ìSBäÖÚrjÓ¥=»©pÈɵü­ ‰Üÿ$:ÓY¢2Lx˜b}îtÙ¦]†õõé‘Ò†zõ+ hÆ]ÃL–&+šÙŒpgÏ }FÜ·¢æ¦Ïÿ,êò5 °ò@LÛ³s8¬Y]zhttÏQ[†‹ë.í„F?‘òƒ©<Á«šuÔ“³îW÷ AuR&~ä ®ÿñãɺhjžk hmÏcÖyNXM• TkºKïˆ^î:µÅ«Ñ#"å?Y /\sÿànê$µL×ø$©Û4çš_&ckù }–ÒGVHßàakUëöxÄ&²j`U„~MîBŽEÒ¼qdN‡ñ9EŠt2ezI…(ƒà>ÁY!ÙÁ£^ÙÎwÎ5à®ÍØ:l9)ã'–ÇõöׄȺ®ñø(\¤CªcX VÒ¹£sÂ%˜ÿô½êÙhü‡ï–ÝÈt¤K¡åyÂqÇ—Òß·ßîCrâ3#Nð…ãm1wŸx#Ž&œðFeq³)©CFQÂwžÂk¤}*$GP¿:jCäS CŠ·@È)3„èäd°™Øîµ0šSsåw¿\9­æíòZûƒ´ä°\•~üÁ€Ûö966)ý>Ž%lFÚx„µ©7êEÐ,¢ãûË$ ^‡wWÇi#M†¶Ú>îjÁøÌ׿¨ÃŸ‰Œ–ÍÂ" žWϼ,þèÇwy1–DˆþüOLƒ‰¼¦÷ÏQ W•q•PK•ìßz×ÁA.ÐÓE®A}Úˆ||¿?¯Jwù+ÜC!ú×TG‰Jº÷¶abÌÙ-9͘ÜzFD°Ÿ® ti:Zßq¹f|B‡7É]1u½C# íD0õ›°ã¡âO“lµ]Ê«¨eÂv´‹IPø¯‡Ò¸1sk­íûŒ>„ϹýXÀ`s&޲Szbè~´>œŒòOömïÑ7h‚ `*¨ÿòS:iëÈX6 ̪Êeã3åÞôÔ³luRô…¹Ë£e„ÉE¾i‚ª3\+Þœ¼3í60GÒì¬u…øEÔ\Šó\·„Z¯~DøpCQê ´¬–ÇÕP$£¹Ã羚áÎìú—d…üôC|CmKâyé Æ©ë0¬u\m²Íž³ØºÔ]}Æo«vÓø b2t¯Ä„ƒpÒEýw;²G2÷ý`D£Èc¸uí‰RÇ??¿VËòßÓz͈/@Lø„©‡G™»¢H ëîø5†µ0˜{¶É“Ü:Í“Âßµ›R=6ƒùÓÚÒF:êóO³BWOu( …ÕKn‰!º¹!j·>˜±(òg¿ïŒï»ä¯í72ü®Â—sCøH(xZ1ìcywƒPð„“nÂL5—±Þ¦U/?¸0èaðÏð¡~½lASåô×óªòÿ3p=ªÏª÷V9Yˆn5>¤¢QÎA¬A +áÂC¾˜ûLŸ&zQïZ$hÉC þÐFŠH-ÎN’Z¢Ï|óˆÌÀK7ú85á'\)ù°ì¢¬qÅÿ:½›´Ï¦Ÿd*‘³‹Lì›$Ë1üؘ +]Æ‘–š­83 GÜÈ ‰IOòô¼¿Ù^}¶‘Ï»\ºŽFïöœŒ5x¢ZqoÁ¯J:(„M?Õ·FÝ%eñ±¢î +n$[}+Y{"ù4TëAœño£ý#îÒþ‡•P½€YRy¶§% ɦ‡! f"/ýДû`èÎé§Öõš²Eð—“¢8~Ù§Ò(dþϼð+Æ–8ÿ½Kyìß#·X1³z±m¬Qá†0Ù½šhÝ¥Ô>§`¥OÓí9YÞüªhêûž ¯mrµ w¬žpL Ï®@’tƒš•–‚Élu³=ð×~YÕòBB1áÈ´¶‰Ñ‚“-‡Œz“0q‰±`°Æ¼¶YxwÿÃ_õ&Ù……¶Úª5>^?b4wΠ’Ôe¸î‹ô—[¥'ŸÈ?lÆU·Îyž§gš&l4IÊÁêà½g_&Ú*îp[)8»†Q­ ¸[1áuÁ2m/û—/Uj$«}-usÓ¸¥6xŸ¯ŒzçGPYhâÂz¸ŸíI«Ô°vb;@·½å8ÁDsoˆ>öή­Ãé’½dɱj<´ÓŽ“'mMÈ0®COþZ°MýÙF’”‚…MWÖU´cž?6! ’ñª¹[)ã´jh]Ÿ™˜ §<ƒú憦ÑÌG¤Mª>!ÖøôÀ½KIºö;-3,fw?ŽL±Ÿ“µ8DK(a•$-Kó&%µ¿Už‡˜…áÙvƒÉ&íÏà°RÓ=ù”ø{$â'1_p‹˜òyXçÇô&Ÿ{»Ž+…%Fî2Òx'›Ëç^,¥0¶ŠÓü¦Ë|.ÅO«Ï•äî@9BÒB1ì^?A10|E-ÅåþÀ¿Gñ œ©Ì‘v·ÕnÁŒbLÀ)ü¦xŒïI8Prƒ Ÿ—¾iÓ |¿u}º–ÂwËÖo`àŠ„»‚"#õìy¯f€=¢@ж»¶Ö²U¥±üû·j‰߀ŸŽ—·Aëšoø¹P|ÒùÒ¹AË…‹H(iy+Æ9Åó¯7Hb§%«Íã.Þ0š>wêVbBMÍh‚¯°U3Òè²emJ„]è%K˜ÞsWïÅ fÌ­üŸ¢KPòåÐ}„ÆÈL‡Uæ£{Ó* í–ÍG†Ârí7„³ù=áõi‘ø7þZøä1¹TÊ—7¦œO¼âg—žëó‹ßO¹çT@Á Ï|½ +þ4.l¹MW†!jÈÆ^Û"²É›¨C—: Ÿ«‚ï`ƒÑü»³ô–ü¶;ÔùSXq}^DÌKt¸÷Â,[ãú‚PÝ Ca ï´E;õu}§ó# u²¾@Žþ)œÅ‚c)¶Zz,ãgC8ò‹6®i6Q¨ÍNgÅ«ý哽IîóÚì’FíO¯x#.Ñ÷_Ó°(¬ý¦q®ýjzæL"¾àÖ%åÁªÀ´3à—ÌiH=³ÌùwÚpHßÄÞ»‘Šû›…a&læ<}Ñ¿å†ÂúU›PÓŠ€{”œ=ašøOû%©  SêóÒi5&H5Jê$9!ø®Ë rû˜‡*­gÊ4±öCŒ#>ÆøUê .>ƒÙŠ¿ô’#T“Gß.dõÝÿ:¶Ãõ̾÷^kkô–mFoÏ’†Icû¤jùýu-?/ù†·Â?ŽäY3ôçµØ$¿ô÷‡'ÇÓCÅ8F$¿ä)}‚kœ¼A"ÔŽú>påÆh •°ïP1<]¦à¿Î™2Ü£¡ü¸d8À,O3¸H‚QÍ‹eÙÜ¿ƒ*&Ñ\Gõ°‹ ’÷›”Uæ£íaô¡„øÍN ¥€Br›’Ð{Åêø`#<ŸÏÇA'E9°FCK‘1ÐÆ•÷ó⺔5d‘ûèó¸PQ¹Iz ÃdÄI—q1írÈŒhìÚÊq(çQI¿:r`6®*\JãÞàvï[Ľ{÷é Â=žˆÅ‹Å£ójCÞ!:9j–Œ”k¸‘jì€þÚ¹«*äÚ³8ÃÆ` q/qÅKáOÍšüêuÒ²Çj;=„ñjÎxïFä­¤'’QC™EK£”D6ºî¯ÔNv½]¾ó¢hÃÞ3áø˜r¢±9Í» +Á, mm o_Ä¥&ö¡ƒŠóñŲ£j ´ÄµV¸â´øeŸä×ý²VÇ©Zµ€‘·ƒ“Ž}q„U_ús#ë¦g›Ð«‡f a“î,®ÚÓ±¯Ñ +ó´j8Hf )»»¶Šº‚aÿ<Èü7¿…שÀ%›+ÜɘÜZ?,Ÿêë!û|opÒLhó¡Ú¨!9â9¿ÞXYödz/5 ›·ÒK|ÔëUá3bÙ²<ö¯Ö(åŠïó ž[&œ¨YtbÖøþÎY•Ä @]óÜ¥ÍtÓ-0 ¸‰ûN;v?1`e©©ôÔžNVð=Sv¡m¹Ù‘ò¼%Æè5g)Wú¼<(A­~ã÷¼ê’ÝÈ¥Ãéb[îöaÑü±Õ¥xòÕ§ ØÀ÷,*.}GšgÚ.´GùÇÞ"¯?÷LÁš#w Ó¤f®QºëÊ ÙHþ“ü7§­ÇX2Áì:@ß˸µâf7ÊDýLDÎUxÂvö L6ó²îºßC—*£š„¤0X¹úçÑÈ=…›Xã‡bºUªÖË”wK&ŸØãPyá#Zª›|ï¥cœÌhK´Wsÿ\[4û„ª<¿ ³t¬ ÅéÇUé(ªÓ9«×®(ô§ôìð*¾Ø³aÞÊê¤Êô€7Éd‰Û›×*—M§ +ð.ÛAݯ5µÇ 6Òc±¹P»8 ®JXKŽDƒmÊ0õ‘˜a¦]Æ{ü*ñ&&ㄜÁ¨!ˆÊ‡%:s=êXú\¨®+å•V1›\þ•»mwœ˜<ÎÑ£®ì½É=†åróé…žiÈ[U¬ÑxAïš[ºkëØ‰º¡ã¶gžOƒ…úäN»3\•QZ÷Nï¢"‚¯ìÏìuþ•,ÅS¦e¬ÎyÝè­­S'…`*ð÷ɕ͊®¹éÁï>ˆ]|'Í؈vr­($Œ]ë`4ª®öæ•Ù“HVUHTRÓ2GMj¢ú:çŽ$°‚¬“ä~i.3 ë⤭_¢ËŠUø»Xü¾Øí¼Òƨ~ê/ia¸Ž¤ŠáaöWÿŸ§Ò$”°,VâžTn2Ÿ-¡6õ_6ƒ¡èúüÌr.”¸„aئgáP7[c/îÛqCN&[õ‹XäÞs ?©ßg­)÷éègÊÔÍM¢-ôµ%Óë#öÌ.­ÞÓ¼ãT ‡|_„NµØ8‡cku¨gÂU2Èü} aKÛ`'L–ï&ä$±Š©.åýyNŠÜ—³‘w_J‡einµ–y¹µo©ºµgºt£kžpGníg!¤i´‡0†'BAº†¿CóPU¤z?¡œø‚{ós63J‹d^]7-N +†^Ø_'®£'t§×®Ç->ü„o0Â]Gv&«ÖH,æ\|i±×çýúL݇ßpÊ›·|bãhá’¨=C0;…'…B@¿ùÐh'Ò|¿ƒêscµ—ÕêD„’ɨWÅK)”‡bs…y†ôÊg±ßDå# ƒay9ÍE«Œ ÃíýºAkO[Ý" (<À—ìªk~ÀGó§ÁËöñŽªØá„éMßúÉk6Á‚Ѷ´Qn¸€µ¼)ÁU(hó}+CÊ{%¡ +gÜÞö‚J^úyò¬ÿKØ“zvÎãßÉ2R¥’ጛµ)¼ôÿ¯gâNUJè$YÇÚnõ†ÉQ'Ú[wZc∌(\@®Õ´s¤Fòão0¼v–Á@Žœôò‡VzNý»%.*ÌÜ7¦X–†xFÖB§g‡F·°¡÷j2@­Crõ2¨+²Eör£vLjTh±òcÞî} ºš{[`:9ªm¬‡Þx{$²Ô‡A¾ !´ᢾ• ²±X§ìÉ·ö-ÿ¤j˜åá0çòoþ?¸±jèਠd“í Ö¹eta2°-i2Z’7R°Uc*¦Cªè\Çí=DoOÖ>…À <ÜX‡“ï×[gŽc{ZÔmfÞò¿wás²Òe™UÃ,m¬z¡v‘ñf¨– §SÞé X½wˆ.7æTž^B.UqÀ·¦M«¾¯F/Õ˜ßP•XÜ鼿ÛãIÎ |Ø$ÊOÈÙ¡)>7 º89Å:A9I3‹ KÙz‡ ò)SIûB°^øõçÇñðÔ÷o÷^çþ.ˆÝ¿$?‹ä±–;Ö´ÁXPŽèpxÊÇ7‹•j¤fÃù½²·ÛIÇ虲´'ä¼K"ó€.ù½ÉŸQâßĶ0A.?§ìlÓÿÏR®Š ÐÅ%N«ºûô3˜Ë§·Fò9ÞbË©¤²‘<Àc¥¾ä€Ã±æ”òšßVyžþpéØ"MØ+¥ƒN ˆoÇ–_ÂÕ¡”<ØÅx ÿsù¦v7ѽ{ây…ȼkOQùÇ!U/³WSÁio(Oï«WœHšJ†g'x-çË·Ð4²ÓÏ0…¼g³Å+m‘‘o¡c³_œÛ—1ýMt è§©yxq¤S³g`(ãÄZ‹G”0°1¡pÞݧ"¨ 7Çiém´Ós¾<£ýDá+1rlfI¯(•‡¿yU>„É7ZÑ£°P­ÅÕ_.—¥ª“¬^ŒÂË‚– ¸JÜè>]Úw9S0E›inhN÷ ¯k0~xp„&^Àg]°zxÐRh-_ø†½Y÷tN£íYU[ºÎàc¹'#´¶ï¸ œä;*Â(2uÛxZ€ËFnX’¦(îÇÞŽ½Ò0Ôòf'éØT÷ØÃiã² "o¼•l1j”ÅQXÆÛ©?ãjY{ã•JH÷ 9Îroø‘z‚ê…/~÷¼:ÈhGW†EI=¸¢.ƒ0[¬GQ•SÇUÿ°ŒU0Kë§Ã÷ýµÀ…ØÕ±šýÚ“£~k/,ÄI„A¨~Ñ?,4@*`7ðí ºù®3€d5»Xˆ3ÁõC WÒÎóñ| gŠ`ìz÷óš¡fÊc+TتV¹;ùU[ÿwpýþˆ8Iîp¬üý³Y(WÊൃ 2jn¶é±aí‹‹’‡ÕŽÃ&¥ÒB(réö›7DkóbÙg7¡1ý"øžýìÑ•Fgmý2ÚS`^Ý ÀœŸ`î3²vÒÍ(ÕUuãQzįkëÿ‹xÛ¯²uqáFn5šª¸–Iù ó˜'ªî8â2J'>5hš†f½óõ.û×=CD¿ù…|DLÉVˆVËì¸YˆÏ7uî\j¸¬nFŠB­ŸQ^‚5bIØÝb–¼ç|ek3²Šá­çPYM +9Þ‰W‰ßƒÈóO{6D¥¸ ¯×ù0Ï‘øƒºHÞuâ´´Ÿa,kZdÑ0¸”h,ïÎX^p`¾ÿÚÈÞ(mBç|>³Öp)„ÎÂkõ2™B ˆ/ ’‚Úe©…>QX‡LBæh +óø³WE÷bÊbøµËkhcž¯™ˆS4>zŠOÎu[yåk88ɺtå\Èlçè 5¿n¿œ%ä *†WøJô5œêÏ…94=È»Á_V÷ŠËl»júQ¸kžÌi¹Ž§D{µldüO<!‹ÄotôÔÇþßÍ\:hY(Â!Þˆþ.ë¬]ÂÎhÀWƦ>÷9ûHV}9‘ècVú=šò&·˜Õv`ÞNÄ“E½Ë€€)ÉDQ\ëZÔ‰85 +ØÁØþ ÊÅz8öÁ|ñ1•eªúíLÒÊÛ‹w˜±S¹# L?9!Ò–Ž›õ-¡oá~OZç £ 0Ž&ýE· ,\˜…ß%DrEÝà¸Þ”QÛ„` mø¤T«v‘m§ô.cF›oÝ‚z?žÖÐ*tèƒÖ‚ !¢çy­ ÛkÈüÊ‚~º=Ü<ñ+dÚ}©ãtV´Å"ŸÝóz¸:¯,—éâ-ç+O® .@î´”ÚV/Ñåõ¤pã‹å °ÒLH‰ŸD—&ZܤÊ÷eý’Še‰!£3šô +„*éQÁã~²ÿ¤X hé¿öì¼HÍÆ `‚qQ#±®(¾…­µz’VÒÚ!‡Ã +«h…Šm +¶ÊÀÎÒ|gRºéÖÉŒq à DR#ò “õœ<Ñ„|?¦ï‹¡©,9г©hXDœ‘M +*ûþ|çÿ>`\„ +¶“›S‹"»íÈÚ¤Eª®üS’O`6MªV,Õ‰µ— Ó¯ÀÆïí¥3tð-R¡à~~)MñÏWr-%ì²8Æå0\Dem?‘„à ÌPÊÞ±4mïç9hîî@´[€i22ásǸABóÑñ_tx\hÀ»Uà ›Mþn-ë²d¸ù~ P\]ElS #éMÄÞ6Ç +›+OýÚw­£Ŭõ%@<¹‡Uf †ü;fó„Ñ·]VO ­¤.™wè@ \°ôlÔ¯ÙÄb;¯ŸúSUªßOX¼Ã¼¼öHÎjo@?X÷A{'ljÊZÙµO ©qûw?-u­Nó™q×·¦ÂÀž•¼õÉÇžFLöå;b»âô)ý{P­¹ó.„‡D«©de:µ·øAš6ÊyÞµßHÍÎ)‘6Kœ~lÉa —´¥s‰Ý0|ôþR˜AÇu`Y©u‚ì70¼sk»IUqbµa~ü®<«¶`PÇU²X,:³Ë °‘àá¼.²†3=)g7äÕ.Ô™éµö œÐwl'øóõiÙ6íV÷—2¢½cófvè•5A$î׫Ëj“ÄGȸŠçoën³fJ Ì_A+¾‰ Ÿ÷ˆÅœX…pëãaS jM$íä|p_wȉïlÛ]8 eÑ¡ KF…º7œyx  +ö¸µGö ¹»vëdi°YSTE÷V xd– ¸àÒÉ¡–<…ùõVêÓ9Ç'¿@\lêß±t">¡‹Y42O2OT$‰ØáWÐl/˨¯Âw³¸Ì’“  &¾›¶é%z6w²ÓBÞpæ£{U8·¸œ `²1ÚzkÒBѾO°xê-Jc`øEqqÙ%iŸÆ=|cpaÖ±9Ë83ŒçÔ¢ªJÆIgûùýE— Ì¥áYÊ­RšØ8Ÿˆá~Úœ #%¶ò b‘ g19æÕ1 ›šÏ÷;3"å)Ã7Òð¤DÊ>öí8 øŽÏ7 bŽjPK@æ—h@áVBá52—Ü<ß6òGh‘DÅEÂj®®xz•âï~DË¿Á êoɱ”cè’ìì)í4!%¼HeÖñ.b;m£åý4Ê“çî*…AAœgÍוúÞhß|(ÉÓÉœ-»Û/ñ#sÎôJx[ùŶõÉ;øêzé#Ýò{i±Ýž~Ûâg÷Ƙ×ï6Ç7k¤×Ü‘˜II4°t /à3À%B6_è.\íüÁoWE’ýñÊGÿ–yˆ6 +º··#­Å”Œ7m*Ýn…ê¤@¼êç×›ýåùÓ<ñÍò¡Ž[¤ ™'«ü×,:ü[é8äiøÊÿ×Î\¶5Á +Eê•îî”F*Â` t§Ò©tKHé£'1º&ÝÒ£Q¤Qrtv”Àý÷Û}îùÇ‘§‹6ÊG,H +JõSkphƒ„›•®”‹îÒÄüì™l~]@ wML-r Å%aNq3ñ¤>.ÎÂ[Ca’ª¨8<Ã8Ýî3˜\\;Ô—3Zéï1xûz~v>ÍN(è“—"Ys\ÛŒïa¾o+Œ.Œgâ›xÔ¤äšð&ÿ¡÷óÙÆa¯Ê^ì‡SúYæà]M¡9¼›¢œzoZm¦(M&]¼"=ï¤0‘§dŠùü«µ€ÅÃ%üÕ<­ÃHÈ)ÒBϾoþ¹W‰;By¾_à ëpTÀÖ)ÓÝdտśÞ=a¡vk6 S+Ùç,¨…±•ZG&“5O…+0e¬‡q „[Gr÷ÎU(4nÿ¹½}娧±JWä![^&B VO#ÐÓ»ôo[ÞïÀIÿ’9z'óÅ]¡ SS`ØÝo÷Ö}ÔÝáAVi%sÙó!BåfR‰°öê¬Í+£:¯Q .ý×ñõòè1ø@$Ì¡Ñ?K™7J!¤Á*źôGlAøç³>K'õ ŸvRã FÌmo`Ø}Š…™zÖåÙ ª^êUÑHáufþÙ îgØlÙW¥!YyLj“« ó笿XEÚ„óínÒbêÀ +ur–ëð¾¨Ê!niˆS(Œwlx¨¯q8—:ù¬¾Bô +³ëÀu2K¯ÚAÜ¢VíªšåEg¹kŒP:1 Ò ¸glZ:]ê‘’ô%tx‰,\‰_¶ƒÙ«Š[þáÉΦÓÓ ^xœw&Ù¾nÀo½ËÎî…Ôù° Œ/ùùΆꞌñ¦G¼zʼnHPë@¥þö'—“6¾«:‹\î¤U¦€Õ¢¸8}¦hd(!ê›Ía†Uê¡I£Œ¢-õÙ$ÞíU;æRÕ—NN?îÚ2ñQ@e°Á¸ÝyA)BJ5|¿ýßí5€õtØ•qÑ3pŽVÇ¿U[ÂöGLRû¨C£ CòHר~íâ¶ah5=8iÿüüÁuD—Ô® +¤íxÚþë½ÂkY•…äkÈT`ªµ–ȨPúô1£/Èõ*¯"åHñaõ˜Q÷úÖLÅ:'&ž´‡nOîˆ"? ì­ÌE©$C…cª§rõÈ|Cñ²ñ3û¡lðˆÈhÅÛƒB£å¥æ€†Ç;Še•„.r=n&žã’Õ¾kdYåãâãaJó)!ÒPÑlS‡_À‚gp~ù&õòŽÏÏñIÜøß½7ß´´@a¬àz6îÄûÓÊ­;Ý»sw8KBúâRUßñµ¨¾«Äú6†ð¯÷ÛÔ¡«jG ìH?1¡îÉ®§Ù^ÞébS€˜1x$³Yù˸³©??ëˆcF…hk£ã~«•R‹p¶z‹î¸_L÷Y×õLɦ³<­—¥-'"!xbdßïñ›’ÝpKýÏZµó1’­®"ʺU§Š¶†6-çȉøy :±7å\l@w¸¼Œ¾¨& yëM9æàÁKÿê²0n¿À7ŽP$çE >n¾PŽöqÕÝüƒqatLÅUi'F7ÏjQHÂ:~¸‡k$ˆ¿E`÷^„xlÔv{·uÐây z½bÈijY0XoëRý`+䪬]‚ÎóVï˜~C„ǘ¸½–@¨ lcoŸx<™yy 8‚ÆÂ‰å‘mKxVš€ë´~E;±œF›½tžO„ØFËáºú9‡+ÞÈ@wÖ¥cŽÏHW”‹õŸC‹¹[Ù.é ¢'Ö_°:íÞü¨iÿh-$Íî§yâ/¼o WëA¢F¿½'ô‰½†â?[µU]qK*e®ˆ±5ØÎ·ùyEáúŠ"öW(É54uY#ydªÄŒ¥ˆ¤ÛvàV]*zÖ,ו“u;F=ð»_ •äv@Yߥ8'¦5û¦&8⃲­/Î<>!ãÙÏSlÅä]Ù`Ý,\5È›ØúZÂ=öZ{³|±©{êkû]mŸaçmìZKÈú=V§kp)¶Î.Y¯*ñ;áì"~OÈ}cÄ>•Ì'jý|Mç÷ï¿sÁ7]Œ#j@^f9&‹ÙF_ÓS«F“ö\¾.óOò­‹Oß?—ž‘qº͙۶3ž”ÅξҞu.-0:ߌÞj³c œäÉzmÜ„šHJ|ŒØp|ØäÄÍT-:ˆ¤]ìŠ×kÍÄõ¸Ô7×'¤Ñä«8ÕfèéÆñÓ»ù?dþï1ážÞ¿ ¾—Jh&;LfϽ— 쬿!%>P¢\ø:Ó&šâÓ;[‡§K8缆·¤ÅõÔ&ü‘íuõ1êr_(ýFSh¸ÒsµaåLÁŸ µ¨©íÒÒç°¿­Oôø¡šÜYAÌÒö¦Ìr¶qñd/¿1þÎ@ÖÙªŸþƒ©ÆHs‘˜´} ËM ¾íúv!r꜄§ñ$¸hBøƒ_]ª#êXzĵJˆììÑ‹Ùy 6WJà ÐúÿÞ©G€Š5'®øJ5^Ð5[ +|>]%¹Û_–Š«rp˜vÕêQ&  [ðh©?èP()¡½æðJýq¤’Ž«}ÅyR´TF/ep ñÃ+žOG +#ÁQHV:j böyiè‡E\’ä4aßèŒÙ¦ƒ&¶Ü Ô-âÄJ\xN¥º¯zzïH””k³{“` ]²lÜE»sýR:º6¶Ñ˜Ô¹ˆ%d¹K*uT…Zñ1l+’(oÂ1vPØŽé~+ÞÒ9÷`5/³­z—kƒ¶-a±ã\½}8­©òÄuÃ` ú:i5€n €ÑÑÓHo4g:§\ˆÙHv·Ñ.°dx,ò$<Ÿ*Zئ<¤†“$ç»åb|-÷c®ÞÙ‚_;yäE‚˜ï`u{Ø3O«Ê9ÀÝT+ +b¹pû¨þ¾y 7úviCÞõ›æÅPX—Mež]¸É\Nÿ5f“¹_MÊÈÔеé¤|ŒÏçÂHÑ|¹ŸÂêíUí[cÿm‰¸> AK6ÙU¦8ß6W[‰/Š–²‡ï°™ªCŠÍ#ù@7‡p_û9%öÿ޽99ås)©jéMµYo™Ûßµ´üZäèlãúD24Xìó\]Ã2¬‡½ +çÏ””Î6,#TJßoþqL'?ÄvCßç ÏÙz9ÿÄÏy.I¤Zuìé‡(qüä¢6'ÖwU‹£ þnîWb$cT莓Ô6XEйß0|Á§a ‰wÙËöMHvw¦½µnÅâRÎÐ >¨ˆ„¯÷ñ¦v,§¼WÀÕ˜L³²ØQ—æ¶MUq_¯>é…,ÝT2ØRö>«Aª]’£Iaizp¡3{:r3ƒŒÆ;›H‰g }F:3ø*Ö§UºÂ‰ÍºžÉ¥''éþNfÿ‰`LÑzO†r¦"l{s‹í(ª)ˆcó˜¼Õ7`‡IHÄìP†P@%Üj @ Ø»µŒrb>Ú€¦9Ñ3{²aÇ&µ‘þzr¸Ìþ âßÉvµÊ‘N/È<êdYúÐ.z?GòBá5o¢ûýS«Üð¤Â¤‰I÷ê€I¿ Ñ­Á +ñ~íŽVå5`O¾ÖŒ·ÚRð'LoS¥‚† Ίǫ¹ŸÐìc{ð—Æ”¬Säg´/d£Ôë2Ý4}‚¨µ£#Š=?md!ê¯$@…´ü̬¦7ëöqßbGܬ§9­sÖ…—géf.iÆ%nÀªž ó4ªÅ»0€YIhþÎwBaW£&¤þÊÙqÜÜ,Ö¬Ô ¥œ¨Ö¬®:KEöQ1”aY® y•¸Õðì×›W+QbÆeR!>Ñ:X ¼\u5QZ;Çߪõ£›ºÏÀ.•3ëz2¤`ý¤¯e`ÄÅþÆ3ÀÔMUÙî¬n‘¸Ñ˱5ö³,Ñy/Yc >"¸WC?‚&™Ç]Ÿûêfùã­S¼\1à×ÉÈ–IÅTÅõ3Ë©3ÐçÑ÷‡/GnÍGø¦ûXtl7)qð7~ÓÚ`#ÙøÝŽ`èOu¦,Šìn£ùƒBüdZáN±]S-ù½—•·v”ÝŠf/2Z¼ñÄÞoåÐÈÒŒ)B2)Ë_k>‹Fê +’‹'2̈ËqŽ=â]6d•i¹è·þj1¥Uz¤Ò&ò8¦VJúÄ>:Bò+¯»ã1Jöt­í«]÷ +¾tŽß+T¥…z²Å»…{â8>´Q¾p €si—\ýMÉ‚·O#Xìúnß28àqV4Út¨Ä"PÌ"N„HÌCª â”Ò µÙzB=*=6Ÿ›àtt)ˆÉ,Ð>vÒN_àÿt©kA«»‰Oû»†¼º#Óæ6–=ð½äãï†ÕBÈ^S-àÀ›ôQÞçÿrK’Èq%^ ð*ÒlÇ‚‚k×’%Jò'Zë±èóêO‰ÿ%ÒÿþOöŽo|üÞy¾ñq'ý-ùâÇendstream +endobj +482 0 obj << +/Type /Font +/Subtype /Type1 +/Encoding 5648 0 R +/FirstChar 2 +/LastChar 149 +/Widths 5657 0 R +/BaseFont /MMQLGF+NimbusRomNo9L-Regu +/FontDescriptor 480 0 R +>> endobj +480 0 obj << +/Ascent 678 +/CapHeight 651 +/Descent -216 +/FontName /MMQLGF+NimbusRomNo9L-Regu +/ItalicAngle 0 +/StemV 85 +/XHeight 450 +/FontBBox [-168 -281 1000 924] +/Flags 4 +/CharSet (/fi/fl/exclam/quotedbl/numbersign/dollar/ampersand/quoteright/parenleft/parenright/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/equal/question/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/bracketright/underscore/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/braceright/bullet) +/FontFile 481 0 R +>> endobj +5657 0 obj +[556 556 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 408 500 500 0 778 333 333 333 0 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 0 564 0 444 0 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 0 333 0 500 0 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 0 480 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 350 ] +endobj +486 0 obj << +/Type /Pages +/Count 6 +/Parent 5658 0 R +/Kids [474 0 R 491 0 R 495 0 R 527 0 R 566 0 R 606 0 R] +>> endobj +648 0 obj << +/Type /Pages +/Count 6 +/Parent 5658 0 R +/Kids [630 0 R 659 0 R 664 0 R 683 0 R 691 0 R 718 0 R] +>> endobj +770 0 obj << +/Type /Pages +/Count 6 +/Parent 5658 0 R +/Kids [752 0 R 776 0 R 788 0 R 795 0 R 807 0 R 815 0 R] +>> endobj +829 0 obj << +/Type /Pages +/Count 6 +/Parent 5658 0 R +/Kids [823 0 R 831 0 R 844 0 R 857 0 R 868 0 R 874 0 R] +>> endobj +905 0 obj << +/Type /Pages +/Count 6 +/Parent 5658 0 R +/Kids [878 0 R 907 0 R 911 0 R 936 0 R 940 0 R 1006 0 R] +>> endobj +1063 0 obj << +/Type /Pages +/Count 6 +/Parent 5658 0 R +/Kids [1010 0 R 1090 0 R 1121 0 R 1126 0 R 1150 0 R 1167 0 R] +>> endobj +1231 0 obj << +/Type /Pages +/Count 6 +/Parent 5659 0 R +/Kids [1199 0 R 1239 0 R 1257 0 R 1269 0 R 1285 0 R 1292 0 R] +>> endobj +1340 0 obj << +/Type /Pages +/Count 6 +/Parent 5659 0 R +/Kids [1323 0 R 1347 0 R 1357 0 R 1369 0 R 1387 0 R 1413 0 R] +>> endobj +1437 0 obj << +/Type /Pages +/Count 6 +/Parent 5659 0 R +/Kids [1422 0 R 1439 0 R 1455 0 R 1459 0 R 1487 0 R 1522 0 R] +>> endobj +1565 0 obj << +/Type /Pages +/Count 6 +/Parent 5659 0 R +/Kids [1542 0 R 1569 0 R 1587 0 R 1600 0 R 1620 0 R 1640 0 R] +>> endobj +1674 0 obj << +/Type /Pages +/Count 6 +/Parent 5659 0 R +/Kids [1651 0 R 1685 0 R 1703 0 R 1712 0 R 1721 0 R 1728 0 R] +>> endobj +1754 0 obj << +/Type /Pages +/Count 6 +/Parent 5659 0 R +/Kids [1740 0 R 1757 0 R 1779 0 R 1849 0 R 1946 0 R 2002 0 R] +>> endobj +2072 0 obj << +/Type /Pages +/Count 6 +/Parent 5660 0 R +/Kids [2057 0 R 2074 0 R 2089 0 R 2102 0 R 2117 0 R 2139 0 R] +>> endobj +2163 0 obj << +/Type /Pages +/Count 6 +/Parent 5660 0 R +/Kids [2160 0 R 2165 0 R 2196 0 R 2208 0 R 2245 0 R 2259 0 R] +>> endobj +2292 0 obj << +/Type /Pages +/Count 6 +/Parent 5660 0 R +/Kids [2266 0 R 2294 0 R 2321 0 R 2353 0 R 2376 0 R 2398 0 R] +>> endobj +2425 0 obj << +/Type /Pages +/Count 6 +/Parent 5660 0 R +/Kids [2416 0 R 2427 0 R 2437 0 R 2471 0 R 2488 0 R 2500 0 R] +>> endobj +2549 0 obj << +/Type /Pages +/Count 6 +/Parent 5660 0 R +/Kids [2529 0 R 2556 0 R 2576 0 R 2587 0 R 2606 0 R 2631 0 R] +>> endobj +2701 0 obj << +/Type /Pages +/Count 6 +/Parent 5660 0 R +/Kids [2684 0 R 2703 0 R 2719 0 R 2736 0 R 2750 0 R 2754 0 R] +>> endobj +2809 0 obj << +/Type /Pages +/Count 6 +/Parent 5661 0 R +/Kids [2790 0 R 2811 0 R 2821 0 R 2860 0 R 2879 0 R 2891 0 R] +>> endobj +2942 0 obj << +/Type /Pages +/Count 6 +/Parent 5661 0 R +/Kids [2932 0 R 2944 0 R 2997 0 R 3023 0 R 3033 0 R 3052 0 R] +>> endobj +3130 0 obj << +/Type /Pages +/Count 6 +/Parent 5661 0 R +/Kids [3106 0 R 3137 0 R 3153 0 R 3170 0 R 3185 0 R 3192 0 R] +>> endobj +3238 0 obj << +/Type /Pages +/Count 6 +/Parent 5661 0 R +/Kids [3231 0 R 3240 0 R 3244 0 R 3288 0 R 3304 0 R 3314 0 R] +>> endobj +3357 0 obj << +/Type /Pages +/Count 6 +/Parent 5661 0 R +/Kids [3344 0 R 3359 0 R 3391 0 R 3402 0 R 3412 0 R 3444 0 R] +>> endobj +3474 0 obj << +/Type /Pages +/Count 6 +/Parent 5661 0 R +/Kids [3460 0 R 3476 0 R 3516 0 R 3532 0 R 3541 0 R 3556 0 R] +>> endobj +3615 0 obj << +/Type /Pages +/Count 6 +/Parent 5662 0 R +/Kids [3607 0 R 3617 0 R 3668 0 R 3702 0 R 3768 0 R 3791 0 R] +>> endobj +3875 0 obj << +/Type /Pages +/Count 6 +/Parent 5662 0 R +/Kids [3839 0 R 3877 0 R 3881 0 R 3892 0 R 3907 0 R 3958 0 R] +>> endobj +3984 0 obj << +/Type /Pages +/Count 6 +/Parent 5662 0 R +/Kids [3965 0 R 3987 0 R 3997 0 R 4019 0 R 4039 0 R 4047 0 R] +>> endobj +4074 0 obj << +/Type /Pages +/Count 6 +/Parent 5662 0 R +/Kids [4061 0 R 4077 0 R 4106 0 R 4125 0 R 4152 0 R 4160 0 R] +>> endobj +4195 0 obj << +/Type /Pages +/Count 6 +/Parent 5662 0 R +/Kids [4184 0 R 4197 0 R 4207 0 R 4221 0 R 4242 0 R 4260 0 R] +>> endobj +4298 0 obj << +/Type /Pages +/Count 6 +/Parent 5662 0 R +/Kids [4284 0 R 4301 0 R 4318 0 R 4326 0 R 4356 0 R 4381 0 R] +>> endobj +4430 0 obj << +/Type /Pages +/Count 6 +/Parent 5663 0 R +/Kids [4405 0 R 4432 0 R 4449 0 R 4468 0 R 4497 0 R 4523 0 R] +>> endobj +4575 0 obj << +/Type /Pages +/Count 6 +/Parent 5663 0 R +/Kids [4533 0 R 4578 0 R 4627 0 R 4650 0 R 4672 0 R 4697 0 R] +>> endobj +4756 0 obj << +/Type /Pages +/Count 6 +/Parent 5663 0 R +/Kids [4718 0 R 4758 0 R 4805 0 R 4839 0 R 4859 0 R 4880 0 R] +>> endobj +4918 0 obj << +/Type /Pages +/Count 6 +/Parent 5663 0 R +/Kids [4904 0 R 4921 0 R 4940 0 R 4959 0 R 4979 0 R 4983 0 R] +>> endobj +4990 0 obj << +/Type /Pages +/Count 6 +/Parent 5663 0 R +/Kids [4987 0 R 4992 0 R 4996 0 R 5000 0 R 5004 0 R 5008 0 R] +>> endobj +5015 0 obj << +/Type /Pages +/Count 6 +/Parent 5663 0 R +/Kids [5012 0 R 5017 0 R 5021 0 R 5025 0 R 5029 0 R 5033 0 R] +>> endobj +5040 0 obj << +/Type /Pages +/Count 6 +/Parent 5664 0 R +/Kids [5037 0 R 5042 0 R 5046 0 R 5050 0 R 5054 0 R 5058 0 R] +>> endobj +5065 0 obj << +/Type /Pages +/Count 6 +/Parent 5664 0 R +/Kids [5062 0 R 5067 0 R 5071 0 R 5075 0 R 5079 0 R 5083 0 R] +>> endobj +5090 0 obj << +/Type /Pages +/Count 6 +/Parent 5664 0 R +/Kids [5087 0 R 5092 0 R 5096 0 R 5100 0 R 5104 0 R 5108 0 R] +>> endobj +5115 0 obj << +/Type /Pages +/Count 6 +/Parent 5664 0 R +/Kids [5112 0 R 5117 0 R 5121 0 R 5125 0 R 5129 0 R 5133 0 R] +>> endobj +5141 0 obj << +/Type /Pages +/Count 6 +/Parent 5664 0 R +/Kids [5138 0 R 5143 0 R 5147 0 R 5151 0 R 5155 0 R 5159 0 R] +>> endobj +5166 0 obj << +/Type /Pages +/Count 6 +/Parent 5664 0 R +/Kids [5163 0 R 5168 0 R 5172 0 R 5176 0 R 5180 0 R 5184 0 R] +>> endobj +5191 0 obj << +/Type /Pages +/Count 6 +/Parent 5665 0 R +/Kids [5188 0 R 5193 0 R 5197 0 R 5201 0 R 5274 0 R 5342 0 R] +>> endobj +5491 0 obj << +/Type /Pages +/Count 3 +/Parent 5665 0 R +/Kids [5427 0 R 5493 0 R 5575 0 R] +>> endobj +5658 0 obj << +/Type /Pages +/Count 36 +/Parent 5666 0 R +/Kids [486 0 R 648 0 R 770 0 R 829 0 R 905 0 R 1063 0 R] +>> endobj +5659 0 obj << +/Type /Pages +/Count 36 +/Parent 5666 0 R +/Kids [1231 0 R 1340 0 R 1437 0 R 1565 0 R 1674 0 R 1754 0 R] +>> endobj +5660 0 obj << +/Type /Pages +/Count 36 +/Parent 5666 0 R +/Kids [2072 0 R 2163 0 R 2292 0 R 2425 0 R 2549 0 R 2701 0 R] +>> endobj +5661 0 obj << +/Type /Pages +/Count 36 +/Parent 5666 0 R +/Kids [2809 0 R 2942 0 R 3130 0 R 3238 0 R 3357 0 R 3474 0 R] +>> endobj +5662 0 obj << +/Type /Pages +/Count 36 +/Parent 5666 0 R +/Kids [3615 0 R 3875 0 R 3984 0 R 4074 0 R 4195 0 R 4298 0 R] +>> endobj +5663 0 obj << +/Type /Pages +/Count 36 +/Parent 5666 0 R +/Kids [4430 0 R 4575 0 R 4756 0 R 4918 0 R 4990 0 R 5015 0 R] +>> endobj +5664 0 obj << +/Type /Pages +/Count 36 +/Parent 5667 0 R +/Kids [5040 0 R 5065 0 R 5090 0 R 5115 0 R 5141 0 R 5166 0 R] +>> endobj +5665 0 obj << +/Type /Pages +/Count 9 +/Parent 5667 0 R +/Kids [5191 0 R 5491 0 R] +>> endobj +5666 0 obj << +/Type /Pages +/Count 216 +/Parent 5668 0 R +/Kids [5658 0 R 5659 0 R 5660 0 R 5661 0 R 5662 0 R 5663 0 R] +>> endobj +5667 0 obj << +/Type /Pages +/Count 45 +/Parent 5668 0 R +/Kids [5664 0 R 5665 0 R] +>> endobj +5668 0 obj << +/Type /Pages +/Count 261 +/Kids [5666 0 R 5667 0 R] +>> endobj +5669 0 obj << +/Type /Outlines +/First 7 0 R +/Last 407 0 R +/Count 9 +>> endobj +471 0 obj << +/Title 472 0 R +/A 469 0 R +/Parent 407 0 R +/Prev 467 0 R +>> endobj +467 0 obj << +/Title 468 0 R +/A 465 0 R +/Parent 407 0 R +/Prev 463 0 R +/Next 471 0 R +>> endobj +463 0 obj << +/Title 464 0 R +/A 461 0 R +/Parent 407 0 R +/Prev 459 0 R +/Next 467 0 R +>> endobj +459 0 obj << +/Title 460 0 R +/A 457 0 R +/Parent 407 0 R +/Prev 455 0 R +/Next 463 0 R +>> endobj +455 0 obj << +/Title 456 0 R +/A 453 0 R +/Parent 407 0 R +/Prev 451 0 R +/Next 459 0 R +>> endobj +451 0 obj << +/Title 452 0 R +/A 449 0 R +/Parent 407 0 R +/Prev 447 0 R +/Next 455 0 R +>> endobj +447 0 obj << +/Title 448 0 R +/A 445 0 R +/Parent 407 0 R +/Prev 443 0 R +/Next 451 0 R +>> endobj +443 0 obj << +/Title 444 0 R +/A 441 0 R +/Parent 407 0 R +/Prev 439 0 R +/Next 447 0 R +>> endobj +439 0 obj << +/Title 440 0 R +/A 437 0 R +/Parent 407 0 R +/Prev 435 0 R +/Next 443 0 R +>> endobj +435 0 obj << +/Title 436 0 R +/A 433 0 R +/Parent 407 0 R +/Prev 431 0 R +/Next 439 0 R +>> endobj +431 0 obj << +/Title 432 0 R +/A 429 0 R +/Parent 407 0 R +/Prev 427 0 R +/Next 435 0 R +>> endobj +427 0 obj << +/Title 428 0 R +/A 425 0 R +/Parent 407 0 R +/Prev 423 0 R +/Next 431 0 R +>> endobj +423 0 obj << +/Title 424 0 R +/A 421 0 R +/Parent 407 0 R +/Prev 419 0 R +/Next 427 0 R +>> endobj +419 0 obj << +/Title 420 0 R +/A 417 0 R +/Parent 407 0 R +/Prev 415 0 R +/Next 423 0 R +>> endobj +415 0 obj << +/Title 416 0 R +/A 413 0 R +/Parent 407 0 R +/Prev 411 0 R +/Next 419 0 R +>> endobj +411 0 obj << +/Title 412 0 R +/A 409 0 R +/Parent 407 0 R +/Next 415 0 R +>> endobj +407 0 obj << +/Title 408 0 R +/A 405 0 R +/Parent 5669 0 R +/Prev 267 0 R +/First 411 0 R +/Last 471 0 R +/Count -16 +>> endobj +403 0 obj << +/Title 404 0 R +/A 401 0 R +/Parent 267 0 R +/Prev 399 0 R +>> endobj +399 0 obj << +/Title 400 0 R +/A 397 0 R +/Parent 267 0 R +/Prev 395 0 R +/Next 403 0 R +>> endobj +395 0 obj << +/Title 396 0 R +/A 393 0 R +/Parent 267 0 R +/Prev 391 0 R +/Next 399 0 R +>> endobj +391 0 obj << +/Title 392 0 R +/A 389 0 R +/Parent 267 0 R +/Prev 387 0 R +/Next 395 0 R +>> endobj +387 0 obj << +/Title 388 0 R +/A 385 0 R +/Parent 267 0 R +/Prev 383 0 R +/Next 391 0 R +>> endobj +383 0 obj << +/Title 384 0 R +/A 381 0 R +/Parent 267 0 R +/Prev 379 0 R +/Next 387 0 R +>> endobj +379 0 obj << +/Title 380 0 R +/A 377 0 R +/Parent 267 0 R +/Prev 375 0 R +/Next 383 0 R +>> endobj +375 0 obj << +/Title 376 0 R +/A 373 0 R +/Parent 267 0 R +/Prev 371 0 R +/Next 379 0 R +>> endobj +371 0 obj << +/Title 372 0 R +/A 369 0 R +/Parent 267 0 R +/Prev 367 0 R +/Next 375 0 R +>> endobj +367 0 obj << +/Title 368 0 R +/A 365 0 R +/Parent 267 0 R +/Prev 363 0 R +/Next 371 0 R +>> endobj +363 0 obj << +/Title 364 0 R +/A 361 0 R +/Parent 267 0 R +/Prev 359 0 R +/Next 367 0 R +>> endobj +359 0 obj << +/Title 360 0 R +/A 357 0 R +/Parent 267 0 R +/Prev 355 0 R +/Next 363 0 R +>> endobj +355 0 obj << +/Title 356 0 R +/A 353 0 R +/Parent 267 0 R +/Prev 351 0 R +/Next 359 0 R +>> endobj +351 0 obj << +/Title 352 0 R +/A 349 0 R +/Parent 267 0 R +/Prev 347 0 R +/Next 355 0 R +>> endobj +347 0 obj << +/Title 348 0 R +/A 345 0 R +/Parent 267 0 R +/Prev 343 0 R +/Next 351 0 R +>> endobj +343 0 obj << +/Title 344 0 R +/A 341 0 R +/Parent 267 0 R +/Prev 339 0 R +/Next 347 0 R +>> endobj +339 0 obj << +/Title 340 0 R +/A 337 0 R +/Parent 267 0 R +/Prev 335 0 R +/Next 343 0 R +>> endobj +335 0 obj << +/Title 336 0 R +/A 333 0 R +/Parent 267 0 R +/Prev 331 0 R +/Next 339 0 R +>> endobj +331 0 obj << +/Title 332 0 R +/A 329 0 R +/Parent 267 0 R +/Prev 327 0 R +/Next 335 0 R +>> endobj +327 0 obj << +/Title 328 0 R +/A 325 0 R +/Parent 267 0 R +/Prev 323 0 R +/Next 331 0 R +>> endobj +323 0 obj << +/Title 324 0 R +/A 321 0 R +/Parent 267 0 R +/Prev 319 0 R +/Next 327 0 R +>> endobj +319 0 obj << +/Title 320 0 R +/A 317 0 R +/Parent 267 0 R +/Prev 315 0 R +/Next 323 0 R +>> endobj +315 0 obj << +/Title 316 0 R +/A 313 0 R +/Parent 267 0 R +/Prev 311 0 R +/Next 319 0 R +>> endobj +311 0 obj << +/Title 312 0 R +/A 309 0 R +/Parent 267 0 R +/Prev 307 0 R +/Next 315 0 R +>> endobj +307 0 obj << +/Title 308 0 R +/A 305 0 R +/Parent 267 0 R +/Prev 303 0 R +/Next 311 0 R +>> endobj +303 0 obj << +/Title 304 0 R +/A 301 0 R +/Parent 267 0 R +/Prev 299 0 R +/Next 307 0 R +>> endobj +299 0 obj << +/Title 300 0 R +/A 297 0 R +/Parent 267 0 R +/Prev 295 0 R +/Next 303 0 R +>> endobj +295 0 obj << +/Title 296 0 R +/A 293 0 R +/Parent 267 0 R +/Prev 291 0 R +/Next 299 0 R +>> endobj +291 0 obj << +/Title 292 0 R +/A 289 0 R +/Parent 267 0 R +/Prev 287 0 R +/Next 295 0 R +>> endobj +287 0 obj << +/Title 288 0 R +/A 285 0 R +/Parent 267 0 R +/Prev 283 0 R +/Next 291 0 R +>> endobj +283 0 obj << +/Title 284 0 R +/A 281 0 R +/Parent 267 0 R +/Prev 279 0 R +/Next 287 0 R +>> endobj +279 0 obj << +/Title 280 0 R +/A 277 0 R +/Parent 267 0 R +/Prev 275 0 R +/Next 283 0 R +>> endobj +275 0 obj << +/Title 276 0 R +/A 273 0 R +/Parent 267 0 R +/Prev 271 0 R +/Next 279 0 R +>> endobj +271 0 obj << +/Title 272 0 R +/A 269 0 R +/Parent 267 0 R +/Next 275 0 R +>> endobj +267 0 obj << +/Title 268 0 R +/A 265 0 R +/Parent 5669 0 R +/Prev 179 0 R +/Next 407 0 R +/First 271 0 R +/Last 403 0 R +/Count -34 +>> endobj +263 0 obj << +/Title 264 0 R +/A 261 0 R +/Parent 179 0 R +/Prev 259 0 R +>> endobj +259 0 obj << +/Title 260 0 R +/A 257 0 R +/Parent 179 0 R +/Prev 255 0 R +/Next 263 0 R +>> endobj +255 0 obj << +/Title 256 0 R +/A 253 0 R +/Parent 179 0 R +/Prev 251 0 R +/Next 259 0 R +>> endobj +251 0 obj << +/Title 252 0 R +/A 249 0 R +/Parent 179 0 R +/Prev 247 0 R +/Next 255 0 R +>> endobj +247 0 obj << +/Title 248 0 R +/A 245 0 R +/Parent 179 0 R +/Prev 243 0 R +/Next 251 0 R +>> endobj +243 0 obj << +/Title 244 0 R +/A 241 0 R +/Parent 179 0 R +/Prev 239 0 R +/Next 247 0 R +>> endobj +239 0 obj << +/Title 240 0 R +/A 237 0 R +/Parent 179 0 R +/Prev 235 0 R +/Next 243 0 R +>> endobj +235 0 obj << +/Title 236 0 R +/A 233 0 R +/Parent 179 0 R +/Prev 231 0 R +/Next 239 0 R +>> endobj +231 0 obj << +/Title 232 0 R +/A 229 0 R +/Parent 179 0 R +/Prev 227 0 R +/Next 235 0 R +>> endobj +227 0 obj << +/Title 228 0 R +/A 225 0 R +/Parent 179 0 R +/Prev 223 0 R +/Next 231 0 R +>> endobj +223 0 obj << +/Title 224 0 R +/A 221 0 R +/Parent 179 0 R +/Prev 219 0 R +/Next 227 0 R +>> endobj +219 0 obj << +/Title 220 0 R +/A 217 0 R +/Parent 179 0 R +/Prev 215 0 R +/Next 223 0 R +>> endobj +215 0 obj << +/Title 216 0 R +/A 213 0 R +/Parent 179 0 R +/Prev 211 0 R +/Next 219 0 R +>> endobj +211 0 obj << +/Title 212 0 R +/A 209 0 R +/Parent 179 0 R +/Prev 207 0 R +/Next 215 0 R +>> endobj +207 0 obj << +/Title 208 0 R +/A 205 0 R +/Parent 179 0 R +/Prev 203 0 R +/Next 211 0 R +>> endobj +203 0 obj << +/Title 204 0 R +/A 201 0 R +/Parent 179 0 R +/Prev 199 0 R +/Next 207 0 R +>> endobj +199 0 obj << +/Title 200 0 R +/A 197 0 R +/Parent 179 0 R +/Prev 195 0 R +/Next 203 0 R +>> endobj +195 0 obj << +/Title 196 0 R +/A 193 0 R +/Parent 179 0 R +/Prev 191 0 R +/Next 199 0 R +>> endobj +191 0 obj << +/Title 192 0 R +/A 189 0 R +/Parent 179 0 R +/Prev 187 0 R +/Next 195 0 R +>> endobj +187 0 obj << +/Title 188 0 R +/A 185 0 R +/Parent 179 0 R +/Prev 183 0 R +/Next 191 0 R +>> endobj +183 0 obj << +/Title 184 0 R +/A 181 0 R +/Parent 179 0 R +/Next 187 0 R +>> endobj +179 0 obj << +/Title 180 0 R +/A 177 0 R +/Parent 5669 0 R +/Prev 79 0 R +/Next 267 0 R +/First 183 0 R +/Last 263 0 R +/Count -21 +>> endobj +175 0 obj << +/Title 176 0 R +/A 173 0 R +/Parent 79 0 R +/Prev 171 0 R +>> endobj +171 0 obj << +/Title 172 0 R +/A 169 0 R +/Parent 79 0 R +/Prev 167 0 R +/Next 175 0 R +>> endobj +167 0 obj << +/Title 168 0 R +/A 165 0 R +/Parent 79 0 R +/Prev 163 0 R +/Next 171 0 R +>> endobj +163 0 obj << +/Title 164 0 R +/A 161 0 R +/Parent 79 0 R +/Prev 159 0 R +/Next 167 0 R +>> endobj +159 0 obj << +/Title 160 0 R +/A 157 0 R +/Parent 79 0 R +/Prev 155 0 R +/Next 163 0 R +>> endobj +155 0 obj << +/Title 156 0 R +/A 153 0 R +/Parent 79 0 R +/Prev 151 0 R +/Next 159 0 R +>> endobj +151 0 obj << +/Title 152 0 R +/A 149 0 R +/Parent 79 0 R +/Prev 147 0 R +/Next 155 0 R +>> endobj +147 0 obj << +/Title 148 0 R +/A 145 0 R +/Parent 79 0 R +/Prev 143 0 R +/Next 151 0 R +>> endobj +143 0 obj << +/Title 144 0 R +/A 141 0 R +/Parent 79 0 R +/Prev 139 0 R +/Next 147 0 R +>> endobj +139 0 obj << +/Title 140 0 R +/A 137 0 R +/Parent 79 0 R +/Prev 135 0 R +/Next 143 0 R +>> endobj +135 0 obj << +/Title 136 0 R +/A 133 0 R +/Parent 79 0 R +/Prev 131 0 R +/Next 139 0 R +>> endobj +131 0 obj << +/Title 132 0 R +/A 129 0 R +/Parent 79 0 R +/Prev 127 0 R +/Next 135 0 R +>> endobj +127 0 obj << +/Title 128 0 R +/A 125 0 R +/Parent 79 0 R +/Prev 123 0 R +/Next 131 0 R +>> endobj +123 0 obj << +/Title 124 0 R +/A 121 0 R +/Parent 79 0 R +/Prev 119 0 R +/Next 127 0 R +>> endobj +119 0 obj << +/Title 120 0 R +/A 117 0 R +/Parent 79 0 R +/Prev 115 0 R +/Next 123 0 R +>> endobj +115 0 obj << +/Title 116 0 R +/A 113 0 R +/Parent 79 0 R +/Prev 111 0 R +/Next 119 0 R +>> endobj +111 0 obj << +/Title 112 0 R +/A 109 0 R +/Parent 79 0 R +/Prev 107 0 R +/Next 115 0 R +>> endobj +107 0 obj << +/Title 108 0 R +/A 105 0 R +/Parent 79 0 R +/Prev 103 0 R +/Next 111 0 R +>> endobj +103 0 obj << +/Title 104 0 R +/A 101 0 R +/Parent 79 0 R +/Prev 99 0 R +/Next 107 0 R +>> endobj +99 0 obj << +/Title 100 0 R +/A 97 0 R +/Parent 79 0 R +/Prev 95 0 R +/Next 103 0 R +>> endobj +95 0 obj << +/Title 96 0 R +/A 93 0 R +/Parent 79 0 R +/Prev 91 0 R +/Next 99 0 R +>> endobj +91 0 obj << +/Title 92 0 R +/A 89 0 R +/Parent 79 0 R +/Prev 87 0 R +/Next 95 0 R +>> endobj +87 0 obj << +/Title 88 0 R +/A 85 0 R +/Parent 79 0 R +/Prev 83 0 R +/Next 91 0 R +>> endobj +83 0 obj << +/Title 84 0 R +/A 81 0 R +/Parent 79 0 R +/Next 87 0 R +>> endobj +79 0 obj << +/Title 80 0 R +/A 77 0 R +/Parent 5669 0 R +/Prev 71 0 R +/Next 179 0 R +/First 83 0 R +/Last 175 0 R +/Count -24 +>> endobj +75 0 obj << +/Title 76 0 R +/A 73 0 R +/Parent 71 0 R +>> endobj +71 0 obj << +/Title 72 0 R +/A 69 0 R +/Parent 5669 0 R +/Prev 63 0 R +/Next 79 0 R +/First 75 0 R +/Last 75 0 R +/Count -1 +>> endobj +67 0 obj << +/Title 68 0 R +/A 65 0 R +/Parent 63 0 R +>> endobj +63 0 obj << +/Title 64 0 R +/A 61 0 R +/Parent 5669 0 R +/Prev 55 0 R +/Next 71 0 R +/First 67 0 R +/Last 67 0 R +/Count -1 +>> endobj +59 0 obj << +/Title 60 0 R +/A 57 0 R +/Parent 55 0 R +>> endobj +55 0 obj << +/Title 56 0 R +/A 53 0 R +/Parent 5669 0 R +/Prev 47 0 R +/Next 63 0 R +/First 59 0 R +/Last 59 0 R +/Count -1 +>> endobj +51 0 obj << +/Title 52 0 R +/A 49 0 R +/Parent 47 0 R +>> endobj +47 0 obj << +/Title 48 0 R +/A 45 0 R +/Parent 5669 0 R +/Prev 7 0 R +/Next 55 0 R +/First 51 0 R +/Last 51 0 R +/Count -1 +>> endobj +43 0 obj << +/Title 44 0 R +/A 41 0 R +/Parent 7 0 R +/Prev 39 0 R +>> endobj +39 0 obj << +/Title 40 0 R +/A 37 0 R +/Parent 7 0 R +/Prev 35 0 R +/Next 43 0 R +>> endobj +35 0 obj << +/Title 36 0 R +/A 33 0 R +/Parent 7 0 R +/Prev 31 0 R +/Next 39 0 R +>> endobj +31 0 obj << +/Title 32 0 R +/A 29 0 R +/Parent 7 0 R +/Prev 27 0 R +/Next 35 0 R +>> endobj +27 0 obj << +/Title 28 0 R +/A 25 0 R +/Parent 7 0 R +/Prev 23 0 R +/Next 31 0 R +>> endobj +23 0 obj << +/Title 24 0 R +/A 21 0 R +/Parent 7 0 R +/Prev 19 0 R +/Next 27 0 R +>> endobj +19 0 obj << +/Title 20 0 R +/A 17 0 R +/Parent 7 0 R +/Prev 15 0 R +/Next 23 0 R +>> endobj +15 0 obj << +/Title 16 0 R +/A 13 0 R +/Parent 7 0 R +/Prev 11 0 R +/Next 19 0 R +>> endobj +11 0 obj << +/Title 12 0 R +/A 9 0 R +/Parent 7 0 R +/Next 15 0 R +>> endobj +7 0 obj << +/Title 8 0 R +/A 5 0 R +/Parent 5669 0 R +/Next 47 0 R +/First 11 0 R +/Last 43 0 R +/Count -9 +>> endobj +5670 0 obj << +/Names [(Doc-Start) 479 0 R (Item.1) 1160 0 R (Item.2) 1161 0 R (Item.3) 1162 0 R (a00036) 1566 0 R (a00037) 3302 0 R (a00038) 1267 0 R (a00039) 2467 0 R (a00040) 1539 0 R (a00041) 2486 0 R (a00042) 1366 0 R (a00043) 1367 0 R (a00044) 1540 0 R (a00045) 2469 0 R (a00046) 1567 0 R (a00047) 2466 0 R (a00048) 1237 0 R (a00049) 2465 0 R (a00050) 2468 0 R (a00051) 5136 0 R (a00077) 985 0 R (a00077_1d2f2751b0865045486c9aa59d0d0971) 3275 0 R (a00077_20541305548441e5dcb2e1e7e6f300eb) 3278 0 R (a00077_2391bb18db5f620e0e9fb848ae5ba5e9) 3265 0 R (a00077_27df2817055bc099821d96eb60a40b34) 3281 0 R (a00077_31471b5e27bda51832d0fa49bd6d9b54) 3251 0 R (a00077_5361ef75bfbdb469b5cc31f0060a2670) 3267 0 R (a00077_564bab93ef6a268a5de2fab885c1d32a) 3269 0 R (a00077_5e16ca335dfd7394527f602da879fca2) 3284 0 R (a00077_7a520a57d7d0541524f34a7685635597) 3272 0 R (a00077_cfd36e02c7498d766ff802575e981612) 3256 0 R (a00077_e0b137a3875ad12a99e5e3e0e177fd12) 3254 0 R (a00077_e707c39412e09d3a47f0b3c5dad33725) 3262 0 R (a00077_e80af46ceef63eab3c786525370ae720) 3259 0 R (a00078) 986 0 R (a00078_4b1b1436b50ed7638aece35f41421196) 3298 0 R (a00078_4da86e9feb5e5835eb15163c2cb61116) 3300 0 R (a00078_a9825b5977b2d4dec66e6bd09e6ae6ea) 3295 0 R (a00079) 987 0 R (a00079_1513a9e88921750d2a611b518f6fc207) 3311 0 R (a00079_9a84c69ec5a4705ccb1ca99fcd120add) 3309 0 R (a00080) 988 0 R (a00080_16a3a3056f44b7245ce085b937a269dd) 3339 0 R (a00080_447eb700ea7a185e0f155934995d49e5) 3329 0 R (a00080_468c04fff28e784f93ebc3f0849211dd) 3335 0 R (a00080_4c6f843219271d25766ee5969e435d1a) 3327 0 R (a00080_5e274a8f8b5fb2b3999c54fe27c76e46) 3333 0 R (a00080_6df929b448ea98bc44d41f5e96237bda) 3341 0 R (a00080_78f82878f3fd0e7401c7d7d3b3fefbef) 3337 0 R (a00080_94fcc9f5c47f419040d849ce58beae35) 3331 0 R (a00080_9dd8edeece221c853a4c4516bf1b01c2) 3321 0 R (a00080_c39694ece9526b84012f90f2bb00af9f) 3319 0 R (a00080_e261f08e1556287d241764fb2e99fc26) 3324 0 R (a00081) 989 0 R (a00081_164124d48fe85bc98d9a300382a5245d) 3351 0 R (a00081_5595902fd42d874e35a70206fad8f6d0) 3353 0 R (a00081_b42c7af6114fde5d21206a2e18a7d3ee) 3349 0 R (a00081_b5801722740492e69bcc73687476009f) 3355 0 R (a00082) 990 0 R (a00082_17aacf7c5e2046c1f3ab50faa1b2f7eb) 3365 0 R (a00082_19b82696bd84a803250cbf9812f2f125) 3377 0 R (a00082_31f25efccba9fd043047133d0d0ba5ab) 3369 0 R (a00082_a408ca8630154ebd039f37a828399f7b) 3380 0 R (a00082_a6bfaf327ce839ba70accd71014398d0) 3386 0 R (a00082_b973f2e16c2883a8a0164d716cce5a31) 3372 0 R (a00082_c3d1bfbb1abde31973c015de97ce2f84) 3375 0 R (a00082_d6bd03239291629676e4c0286ebb650f) 3383 0 R (a00082_fda184638130452f3570966acc5b97f9) 3388 0 R (a00083) 991 0 R (a00083_20fae11b540a561c622a0d74cb4b9f97) 3399 0 R (a00083_5e8637b1514d03eb3eb12dc9a502e27e) 3396 0 R (a00084) 992 0 R (a00084_c3fa0fa86689e3e7c039a16c16861dbe) 3408 0 R (a00085) 993 0 R (a00085_04833004cec509a41c502429df308e35) 3429 0 R (a00085_0560495c60c68d62617ff1f3d0c424a4) 3437 0 R (a00085_0bb4f34164e7207c2db26b77f23ccfff) 3420 0 R (a00085_3592a1f5ae100db2ed9c0810b41c7bc7) 3423 0 R (a00085_503c2994a4e52300516e2b820f0fc65b) 3427 0 R (a00085_5ed2615cec9e633d90ac5968771976eb) 3440 0 R (a00085_668cab7d54ff0a2fc2a2179ca06b0798) 3425 0 R (a00085_68204df6bde3e3c27271ebde10579a57) 3434 0 R (a00085_a312da7b5f6441140721ec7e55f345a8) 3431 0 R (a00086) 994 0 R (a00086_cca775e46d4405b7775b328f7694f7e7) 3451 0 R (a00087) 995 0 R (a00087_e8eb428c05bc1dee022246a3063d277c) 3470 0 R (a00087_fe557d333c06cf65f52023f45f5b0a3a) 3472 0 R (a00088) 714 0 R (a00088_0cd09beee671e7e9efb0b4aced10249e) 3485 0 R (a00088_0ef3ae2764714bf90620075c374c262e) 3497 0 R (a00088_1df6aa054ef2fa634ac4c6f418228285) 3488 0 R (a00088_2d9732cf5752d30bd11cb25dc7d0c8d3) 3522 0 R (a00088_3347ef1b6e8581402445d1a0280c7a14) 3500 0 R (a00088_4289c59840b128f2f6526e9da2711d47) 3525 0 R (a00088_70297b3e6d4eaae7bd828cb50bd1efe3) 3491 0 R (a00088_79510aa86d3fa0a0fc6cfc49b1da7279) 3482 0 R (a00088_8f6b08a5ba2a8d75ca7279e2056aa8c6) 3494 0 R (a00088_97f9e1fda815bfb8b1f4577c355ade20) 3528 0 R (a00088_a5f58074435cdc180f17de69651beebd) 3519 0 R (a00088_db7a3fadb68df5fdd37e8b91a2c751ea) 3503 0 R (a00088_e3aa9cc25e45b663e6aabc54c013019e) 3512 0 R (a00088_eb9fcbd3c9b0a795dcd63f33c323d65c) 3509 0 R (a00088_ef661afb3aa82f0437d2ed8d3c20be76) 3506 0 R (a00089) 996 0 R (a00089_aacd5fa1806e0f0dd0bc96dd36507ad8) 3537 0 R (a00090) 997 0 R (a00090_1abbbe7bc5d7d033c727691528b85b8d) 3549 0 R (a00090_b684c17bf48c8e3b3fcf97b06b4c6ee1) 3546 0 R (a00090_c9273cc1fcdaeeddc523ca9f34977e06) 3552 0 R (a00091) 998 0 R (a00091_0ec6a6cbcbfd191d393738c16d54e5e1) 3585 0 R (a00091_266ea23d75c83f15b915ce54100e51c5) 3594 0 R (a00091_308463cc7b3d45d2dbcdcedd4cde9bb9) 3570 0 R (a00091_4619e69ec86a47f6abe945b39ec7f63a) 3573 0 R (a00091_55be3d5413ce49c5c4f5576def12d7ec) 3576 0 R (a00091_55e7764a9f6ed05aaa98076b9f6770a5) 3579 0 R (a00091_7d472d8b3c41618d39c93c4ca92fb3f4) 3561 0 R (a00091_805f8fd5533a6d4b6793e0645005da4c) 3597 0 R (a00091_967def494c68cfc8a08d5a6c4dbbc25d) 3603 0 R (a00091_a3f2d9cb20290019b2743e8df31a2f8b) 3564 0 R (a00091_a6d51f3fa5da9b7f9cd37ae69600c04a) 3600 0 R (a00091_b15853725b233d526b291db0347d4ecd) 3567 0 R (a00091_babb9c2be394477af97f79507bcb4c86) 3582 0 R (a00091_e27f4949613fe3c1de5a839af01d99dd) 3588 0 R (a00091_fa0fe6ca88f692d22af70ff007411252) 3591 0 R (a00092) 999 0 R (a00092_4dc3294d67d705f7248ef57e4259424f) 3612 0 R (a00093) 1000 0 R (a00093_0c816f34c0187f2154c91a18d3ad87c8) 3661 0 R (a00093_1deb2899508216804823498a69378118) 3622 0 R (a00093_3983b45977630418d3038231aa8b68ed) 3642 0 R (a00093_3ad48284f7a91f78bb24096aad89056e) 3698 0 R (a00093_494ea6767a8a8fab7abe96b799d6c3b3) 3699 0 R (a00093_4f39f0fe6a820d260fe6cddf9ccaa832) 3686 0 R (a00093_5d8996950cdf3d8130cc3ad340eb9dff) 3657 0 R (a00093_6157452bdc9921f44b2e22e4b5969258) 3662 0 R (a00093_7675e6b9adbddbd545d3aac8ca092fbb) 3664 0 R (a00093_7a58d95f7f7827789ff52500e3d16c34) 3696 0 R (a00093_7f7bb2145afba5df00c6e10ddefa8ae1) 3658 0 R (a00093_8082509468b2ac80ed7746aa1a5bc4f7) 3663 0 R (a00093_8da121d6e50992ec55778f9b2141552d) 3666 0 R (a00093_b4622e2599ff3a592db09219b2641682) 3665 0 R (a00093_b6e9a75167bdddd561373bc5b6ef501c) 3697 0 R (a00093_b93e351c3abba0c700b26b7b07e9527d) 3660 0 R (a00093_dc69abadd5aa07c7d74f9292db2cd93c) 3659 0 R (a00093_e292b8977f6b81265bf14e1676face3e) 3652 0 R (a00093_e9205a565ea3c911a785fc4e87c91a58) 3700 0 R (a00094) 1001 0 R (a00094_025ffa46b799fa6952719c499a3ae17c) 3740 0 R (a00094_0f27e16ddcf7199d514968204966f559) 3722 0 R (a00094_2541fae506eb111ff1be2372e0919839) 3743 0 R (a00094_619d9755a5d4aaabdb2e5e6ea4c1e0bf) 3752 0 R (a00094_6af8a59d0ab8967aacea749d6e59ac90) 3749 0 R (a00094_71721395f1c7c42b8bcc111b339bea7c) 3746 0 R (a00094_7a59f0dad059786238d8ab604630e7f3) 3716 0 R (a00094_7f0ab3fe3bcf1e3ed9f5950cb4474ec1) 3755 0 R (a00094_85d7f35662f7be20cd84e789a290dd4b) 3719 0 R (a00094_8cf0ca17b115ff2e3071b3fabcc43b53) 3710 0 R (a00094_8d4e08d051b35b1c710c3be5b8bbfa05) 3734 0 R (a00094_a81fff4836049cb3c018304d77337554) 3737 0 R (a00094_af7a8a5310ad945de38f5b3ac755ae7d) 3728 0 R (a00094_c8f124419a231f38bb6cdf5041757a27) 3731 0 R (a00094_dc7001682017599549f57771f4cd1b9a) 3761 0 R (a00094_dde3cf9a57445814d01b3c67da08afdb) 3764 0 R (a00094_e1e60d56ea87dfa09230e25ca5ecf2fc) 3707 0 R (a00094_e45b31a0a277dd5325ad2a332358b21b) 3725 0 R (a00094_e57281f5bef284bc9545834ef8ed4a96) 3713 0 R (a00094_f4a1d8cfbe270393a2de02b0c743e474) 3758 0 R (a00095) 1002 0 R (a00095_280a0c2a93544e597f92bbacf36ee1dc) 3781 0 R (a00095_4da1d7815516cd2b5bda3a66fdf05198) 3784 0 R (a00095_8a661a2d544100b82d0d14a1985083d5) 3775 0 R (a00095_981392e295db4d024eea95805c51c371) 3778 0 R (a00095_c8afa29e0aa5e789d6929b366d98ba56) 3787 0 R (a00096) 1003 0 R (a00096_47140aa52cb9e6a2de38fdfc5da08df1) 3802 0 R (a00096_51bbbe3099c10ef26119ddc2aa51e35e) 3814 0 R (a00096_569382bc53aa64c227e57efe88fe13ac) 3805 0 R (a00096_6f8c65cfc8242197bcc3cb5b4735b16f) 3811 0 R (a00096_8587178a29882482be20c2822b402b96) 3808 0 R (a00096_858f970feb7462871c814953697a8ad7) 3835 0 R (a00096_a80e8d0fc768525fa3bfb3d4e4cf260d) 3820 0 R (a00096_b20096ae4953caaa42f6bb2373c4494c) 3826 0 R (a00096_be2c98748e180c1747823cd2fb8ecf0e) 3823 0 R (a00096_c92d2f194f096e84791f95d7e8f0ba92) 3832 0 R (a00096_e82f68cb91d8688a619d55d2a8572979) 3829 0 R (a00096_ed119a030ebd3bf7c30a12071c27d441) 3799 0 R (a00096_f1684ad96b8acf54154688df3883b801) 3796 0 R (a00096_f20186ef441ef5b600e8544a0f2d8d81) 3817 0 R (a00097) 1004 0 R (a00097_134ec55c3d5abaebfed4ff8edfedf1ea) 3862 0 R (a00097_2fca02673894f222b01ad2d3a4d7dd79) 3870 0 R (a00097_5960d82e7aca2986b8509a0d87d6cbc8) 3846 0 R (a00097_5a3116623c6a7da7c82db6c301ae0da3) 3865 0 R (a00097_606d2729bf411ade69044828403a72af) 3868 0 R (a00097_6925d46b2819adb474a5f0036f02dd7d) 3852 0 R (a00097_7092781c50dcad50f473888585c85b83) 3855 0 R (a00097_8ae6395641b7752dce47881e20cee970) 3849 0 R (a00097_a6487b9c1c773b32656065d0e19bf142) 3858 0 R (a00097_e87913860c6b05c6e6b060639b950098) 3860 0 R (a00097_fb60f42593d305ea36d9b4303722696e) 3873 0 R (a00100) 1064 0 R (a00101) 1065 0 R (a00102) 1066 0 R (a00102_2e52037249bb98d7bbecf42e275beb07) 3926 0 R (a00102_4350350ce0d4595876743d4c0a720bcc) 3918 0 R (a00102_55735650f879293d9b7b5fda6753d147) 3942 0 R (a00102_6a327c0ffd40f69fbcd5f01f12e5745c) 3922 0 R (a00102_6aaa9da3d0f8d4c0799516d46d939942) 3934 0 R (a00102_72d99b1623afa14bd58c667b748c2ddc) 3928 0 R (a00102_7bf0c086c7c41c12cc63324327932d91) 3946 0 R (a00102_876c82c946543cd70c141e41417138e0) 3944 0 R (a00102_8ee5e2c8e517d6e4f2198057f81e93c6) 3936 0 R (a00102_96eb4534b574ece96ed36806039f73d3) 3916 0 R (a00102_9f6c329c04baba17fe0f5b2a6597d713) 3932 0 R (a00102_bf4401501f1389872141a78b63f325a3) 3940 0 R (a00102_c72f8777ccc45ae274449ea7a9f3de04) 3930 0 R (a00102_dd685a0f8b5e76a2687cc0f306813bfb) 3924 0 R (a00102_e7250008b68d1909d54040515eef8ebb) 3920 0 R (a00102_ee60b8757bacab269b0ccd7c240bf01d) 3938 0 R (a00103) 1067 0 R (a00104) 1068 0 R (a00105) 1069 0 R (a00106) 1070 0 R (a00107) 1071 0 R (a00108) 1072 0 R (a00109) 1073 0 R (a00110) 1074 0 R (a00111) 1075 0 R (a00112) 1076 0 R (a00113) 1077 0 R (a00114) 1078 0 R (a00120) 1079 0 R (a00121) 1080 0 R (a00123) 1081 0 R (a00124) 1082 0 R (a00125) 1083 0 R (a00127) 1084 0 R (a00128) 1085 0 R (a00129) 1086 0 R (a00130) 1087 0 R (a00131) 1088 0 R (a00131_1273664aba3e6a2a46e87dcb1a5f19ad) 4480 0 R (a00131_1d5ce7047650f3ecee0814dbc8714099) 4488 0 R (a00131_5320d4457a472d8888ec1905bc0e0a1c) 4475 0 R (a00131_5f2e1fcf0055d20ce17664b1027bb9eb) 4477 0 R (a00131_692d80636342d564422ccd9296ad568d) 4491 0 R (a00131_88460bea09a462d0e22511cb567eee14) 4484 0 R (a00131_890e822616a6839dfbf51dcb591b8e99) 4482 0 R (a00132) 1111 0 R (a00132_1273664aba3e6a2a46e87dcb1a5f19ad) 4506 0 R (a00132_1d5ce7047650f3ecee0814dbc8714099) 4512 0 R (a00132_692d80636342d564422ccd9296ad568d) 4515 0 R (a00132_88460bea09a462d0e22511cb567eee14) 4508 0 R (a00132_890e822616a6839dfbf51dcb591b8e99) 4519 0 R (a00134) 1112 0 R (a00135) 1113 0 R (a00135_534d9e416324fb8ecca6b9cb4b1f6a6a) 4540 0 R (a00136) 1114 0 R (a00137) 1115 0 R (a00138) 1116 0 R (a00139) 1117 0 R (a00140) 1118 0 R (a00141) 1119 0 R (a00142) 657 0 R (a00142_authors) 1137 0 R (a00142_g155cba6121323726d02c00284428fed6) 1235 0 R (a00142_g2f8f70c30b9ee08a103fbd69a4365c4c) 1148 0 R (a00142_g2ffbb9e554e08a343ae2f9de4bedfdfc) 1144 0 R (a00142_g3d4c8bd4aada659eb34f5d2ffd3e7901) 1196 0 R (a00142_g7b04a0035bef29d905496c23bae066d2) 1146 0 R (a00142_g7b5319b5b65761a845fcd1500fde4cdc) 1215 0 R (a00142_g905451249dca72ce0385bf2a9ff178ee) 1233 0 R (a00142_g99e43010ec61327164466aa2d902de45) 1145 0 R (a00142_g9e97a0b4d5cc7764d8e19758f5da53ae) 1197 0 R (a00142_g9ff1e8936a8a26bff54c05f8a989b93b) 1219 0 R (a00142_gad14bbbf092b90aa0a5a4f9169504a8d) 1147 0 R (a00142_gcd3ac045f0a4ae63412e3b3d8780e8ab) 1232 0 R (a00142_gcfae9053e5c107a1aed6b228c917d2ea) 1217 0 R (a00142_ge3c821e3a388615528efda9d23c7d115) 1236 0 R (a00142_ge469332907e0617d72d5e2dd4297119d) 1221 0 R (a00142_ge6bae7dc0225468c8a5ac269df549892) 1143 0 R (a00142_gfa82b860a64b67d25ab3abc21811896f) 1234 0 R (a00142_pt-autovars) 1153 0 R (a00142_pt-desc) 1141 0 R (a00142_pt-impl) 1157 0 R (a00142_pt-scheduling) 1155 0 R (a00143) 649 0 R (a00143_g41bf109b6a45328d5744c0a76563fb6c) 1312 0 R (a00143_g54a466311575a727830a92a6c3621cb2) 1305 0 R (a00143_g5eced097547fd3fac4ba2a255493d921) 1307 0 R (a00143_gd85fc90c30d1fc37c63c4844be5fe09d) 1309 0 R (a00144) 651 0 R (a00144_g12b467f314489259dd718228d0827a51) 1341 0 R (a00144_g20bc87e5c063c3f4b01547be6e5a0148) 1338 0 R (a00144_g30e827f33eacff55ecb4d8fb5a11d5d1) 1345 0 R (a00144_g41d37ea1e3bd24f7b51e9409aceaaa80) 1342 0 R (a00144_g5323320b7316647042016f17c4e881be) 1344 0 R (a00144_gd8e8bc9bc0e2ea4a24a8a024fd3a7f7c) 1336 0 R (a00144_geb79c914cf137e6d27fd7583e5a66679) 1343 0 R (a00145) 652 0 R (a00145_g22f140b02c354dfebcc7ad481c3bcd68) 1382 0 R (a00145_gc48ed5f0d27721ef62a3ed02a5ad8d2e) 1378 0 R (a00146) 653 0 R (a00146_g1024f8a5fa65e82bf848b2e6590d9628) 678 0 R (a00146_g2c64c8c36bc84f9336f6a2184ea51883) 1409 0 R (a00146_ga4360412ee9350fba725f98a137169fe) 677 0 R (a00146_gb81e78f890dbbee50c533a9734b74fd9) 1411 0 R (a00146_gbaf0bb2b6a4424b4eb69e45e457c2583) 1407 0 R (a00146_gf20aaf4292cb0d2a1b10bc0a568b51fa) 1408 0 R (a00146_gf5c2ad5acf3cc23b8262e9ba6a15136b) 1410 0 R (a00146_gfd5ebb56a1bd1da9878aa886a2075e80) 1394 0 R (a00147) 655 0 R (a00147_g04b053a623aac7cd4195157d470661b3) 743 0 R (a00147_g0a8bb9d6d0f1f56852ccfccbbad6c5d8) 804 0 R (a00147_g1a1bc437c09ddef238abab41d77c3177) 716 0 R (a00147_g26a14b8dae3f861830af9e7cf1e03725) 715 0 R (a00147_g58bb90796c1cdad3aac2ecf44d87b20e) 750 0 R (a00147_g61db1dcb7c760e4dd5d60bf4e5576dca) 745 0 R (a00147_g64a238a5c02640a7a4aef004163aeb47) 1471 0 R (a00147_g79c4110211247df3fb30b8cf1c4c02af) 1520 0 R (a00147_g7b2ac4b18bd2ac3912fe67b3b17158c3) 749 0 R (a00147_g8096b0c4b543dc408f4dd031ddae7240) 773 0 R (a00147_g81ac47cee1c18f6aa479044069db7ca3) 805 0 R (a00147_g8411c95a4d89367ad2d9d6bde1a3d537) 1483 0 R (a00147_g88d2ccf7cd821f89d9a8df7e3948b56c) 746 0 R (a00147_ga20812098a4663c8a9fc4ce8e95391b6) 1516 0 R (a00147_ga87feebc7cffd4d8300e776cf64e4fec) 1492 0 R (a00147_ga8933ad15a2e2947dae4a5cff50e6007) 744 0 R (a00147_ga9de254b8aa308eb4aab17efdde622d2) 1484 0 R (a00147_gaa585784b0914cac1d37f07f85457008) 1518 0 R (a00147_gb5fecbc62edd128012cea0f47b57ab9f) 742 0 R (a00147_gdb971fb1525d0c5002f52125b05f3218) 772 0 R (a00147_gdd1ab3704ecd4900eec61a6897d32dc8) 771 0 R (a00147_gde6634974418e3240c212b9b16864368) 1485 0 R (a00147_ge5ab69d40013e6cf86ef1763c95d920e) 1517 0 R (a00147_gef14e83c046e19ab9fe9d1bbcca276c2) 1464 0 R (a00147_gef6c4140c632b6a406779342cf3b6eb6) 747 0 R (a00147_gf2dbaceb10c67783a115075b5b6d66df) 1515 0 R (a00147_gfbd5fc486dfdf6bf6fc9db52b1f418c4) 748 0 R (a00148) 1654 0 R (a00148_g118e9d76568ab81ad97f138d4ea1ddd2) 1668 0 R (a00148_g165b603ec150e26efec7be199c9c2901) 1683 0 R (a00148_g210e629f7252e4bc8458cbdf260b3318) 1677 0 R (a00148_g22fa0681cd463191d7a01fe85d86996f) 1680 0 R (a00148_g53fbda0e8c31d4882294c8dc3cb5f487) 1675 0 R (a00148_g69a7a4951ff21b302267532c21ee78fc) 1617 0 R (a00148_g6b16e0bac41821c1fbe0c267071642f0) 1678 0 R (a00148_g769512993b7b27271909d6daa4748b60) 1676 0 R (a00148_g87f0b54ade0d159fba495089128a4932) 774 0 R (a00148_g969d7fff37a979737da045e0d538a9bd) 1679 0 R (a00148_ga22b04cac8cf283ca12f028578bebc06) 1618 0 R (a00148_ge23534479ead15af8ff08ace26a47fb5) 1682 0 R (a00148_gffcd2fbe181e2aaefbf970551c302af5) 1681 0 R (a00149) 654 0 R (a00149_g12a33f0c09711167bdf3dd7d7cf8c5a1) 1748 0 R (a00150) 1760 0 R (a00150_g013c3a06a8b58589a77f4a3442f89c2a) 1923 0 R (a00150_g041aea91aa6ef84dcc6cac3c51db9b2f) 1809 0 R (a00150_g04b053a623aac7cd4195157d470661b3) 1997 0 R (a00150_g1215163245304bad20d6c5608ad75ab7) 1880 0 R (a00150_g12a33f0c09711167bdf3dd7d7cf8c5a1) 1755 0 R (a00150_g12f3bf821224b8e7b48a57ed3cea15cf) 1886 0 R (a00150_g1320fd0006a2f70138bc2d0018dda829) 1872 0 R (a00150_g13dfcb4a5f920e108253ade527a66cc2) 1835 0 R (a00150_g1425d4a0c2760adb653a04c0fb137a8d) 1878 0 R (a00150_g15f2617f7dc1713f9d10282125c6027b) 1862 0 R (a00150_g160128ab5d2ea3cc497b91ee4eb4ef99) 1827 0 R (a00150_g17d111686f98e4c09db73a770ac3f1a4) 1858 0 R (a00150_g1cea57e3ea526f210b1068e6dcf7b4f4) 1896 0 R (a00150_g1d3211dbbdfb22d6a47b60dddcf945e8) 1900 0 R (a00150_g1ef35301f43a5bbb9f89f07b5a36b9a0) 1519 0 R (a00150_g207d17b633cd095120a74bc1f2257b17) 1892 0 R (a00150_g20ceef9d0868d391c2f33041b02cb1f1) 1926 0 R (a00150_g20df5c82f2a15a508c19e505b5d9de2b) 2014 0 R (a00150_g210f227119fc972e6222c9cb452e15a9) 1981 0 R (a00150_g22f140b02c354dfebcc7ad481c3bcd68) 1990 0 R (a00150_g236d5c7872f59c8fe7b701c7252b976e) 2042 0 R (a00150_g24f52ac52d6e714cb04a5aa01be3bdd0) 1906 0 R (a00150_g266263ac78a1361a2b1d15741d3b0675) 1935 0 R (a00150_g28eda870cff3d8e3cf2949e6f57a502b) 1817 0 R (a00150_g2a0cf5d86c58fab216414ce59bf1fea1) 2049 0 R (a00150_g2addf34c7d457c1a7899a7e2171ef1e9) 679 0 R (a00150_g2d3ba4b14d6d2f6576f9b547800b7945) 1805 0 R (a00150_g3237be0d9ec457de0177689ee23c0d5c) 2011 0 R (a00150_g359951eecd80541c2101f628a9da9146) 1841 0 R (a00150_g39ce739bd352d7e348e37395ce903e43) 1793 0 R (a00150_g42288d5c3cf4b10becefec657f441e54) 1902 0 R (a00150_g4309376690872fa4beb4f025f5cc199b) 1913 0 R (a00150_g44b3b1ab31a403ba28ec135adfcbefef) 1874 0 R (a00150_g499bb98a0b4ae9a98553ede81317606d) 2023 0 R (a00150_g4cc3e223b63f27b546d62e9a258dba5a) 1894 0 R (a00150_g517c770991459cc62dc009c0d3875c6a) 1843 0 R (a00150_g561b8eda32e059d4e7397f776268cc63) 1998 0 R (a00150_g57e6dc1d58a36d0ed53a3dd29ccc5798) 1799 0 R (a00150_g5b5615dc240daed20949c0fded2b4679) 2033 0 R (a00150_g5c5b1834e497f53ad0ef947bbe9777fa) 1888 0 R (a00150_g5c97ae587595b5444be80f5ecc1d3382) 1813 0 R (a00150_g5ca559def464ef20d8b1f7d32f2f160d) 1870 0 R (a00150_g6020613f5062417d9811cfa837215c83) 1868 0 R (a00150_g62c03e0a308cc23929a80fe8d8f9dc1e) 1898 0 R (a00150_g64d9affc680a445d708234e70450477b) 1829 0 R (a00150_g6832e4d2d046536b6472f7ac92340f68) 681 0 R (a00150_g691688604655ea8943d15f14c60027d8) 1884 0 R (a00150_g6bc12c6c7b56f73ce5d57abfdcdc6eb5) 1854 0 R (a00150_g6bfa488f87f68a6f7f4a3efb9e45eaf8) 1791 0 R (a00150_g6f2b90c597ec23f39ec716ccec11233c) 1860 0 R (a00150_g7023a34ba9e9d03b5fbedbcb32924453) 1989 0 R (a00150_g788ffac72342f6172343d7f8099cbe1a) 1999 0 R (a00150_g79c4110211247df3fb30b8cf1c4c02af) 1993 0 R (a00150_g7d3673f52f5846b6961d23b150decd54) 2008 0 R (a00150_g8387881de3a8bfd3c0d57b9d04ac9b7e) 1904 0 R (a00150_g85b65e38aa74eba18979156f97a94a87) 680 0 R (a00150_g88e60aa2cf23e1c65d630701db08c743) 1866 0 R (a00150_g8af482dec973db57d8b3bd3f69461488) 1821 0 R (a00150_g96544dedc1cdc71ad2ad54bf1d5e5433) 1910 0 R (a00150_g9c0814ed491fa452ec97910c0728d410) 1921 0 R (a00150_g9c24fba2cd8f7f62accb0a0d5bbe4dad) 1992 0 R (a00150_g9ebb4dac683163840eab9c6c41ad61f7) 1929 0 R (a00150_g9ee50a40597e67fce96541ab56c3b712) 2000 0 R (a00150_g9f1822e1d231235edacad691f3cb7bbb) 1882 0 R (a00150_ga05a3dde2048480fa3ab2a5961898d18) 2029 0 R (a00150_ga22b04cac8cf283ca12f028578bebc06) 1996 0 R (a00150_ga4c4310e54f18541b09e1e251fe7b22d) 1801 0 R (a00150_ga533c394b1fa0030205534befa31c525) 1825 0 R (a00150_ga5e3c856b86725125d19fccc34cd9eb5) 1819 0 R (a00150_gaa585784b0914cac1d37f07f85457008) 1994 0 R (a00150_gabc40c09f49d15acb1b1a7f02bb3a807) 1807 0 R (a00150_gad0321f4c570f9983c6de81ece3ddc20) 1852 0 R (a00150_gae59b70658f28ee6e998eaaab05e423f) 1823 0 R (a00150_gb4ef6b00924990e7a293f66715b6d1d1) 2005 0 R (a00150_gb6683dd83fe1c8de9a24086d4b69e907) 1944 0 R (a00150_gb81e78f890dbbee50c533a9734b74fd9) 1453 0 R (a00150_gb9435261753469accec0c9bf8a5a2686) 1917 0 R (a00150_gb948296aea6b6b3aa1f156799c4d479c) 1856 0 R (a00150_gc48ed5f0d27721ef62a3ed02a5ad8d2e) 1991 0 R (a00150_gc84f499cba8a02fc0e306c10b2acabf0) 1876 0 R (a00150_gd135fb0cfdfb2c212f0f51865a3640e4) 1833 0 R (a00150_gd58231410d58e34b455328b888a9e73c) 1890 0 R (a00150_gd605357e29affb0d3104294c90f09905) 1811 0 R (a00150_gdd1ab3704ecd4900eec61a6897d32dc8) 1995 0 R (a00150_gde29ec025e6754afd8cc24c954a8dec8) 1837 0 R (a00150_ge0825474feee11b4e038bfe71757875f) 1847 0 R (a00150_geb533744817cf6695d75293369c2248b) 1984 0 R (a00150_gee37386b2ab828787c05227eb109def7) 1864 0 R (a00150_gf0ccbc3bb2a3ba1ebc255c7b3fcedd24) 1815 0 R (a00150_gf0ed78fd2be24d849cdd5af75e3b2674) 1797 0 R (a00150_gf703683056d2bfa5c81fa157dcb20fe2) 1406 0 R (a00150_gf72d7b9a737707dcfb2c41fec2b6792e) 1845 0 R (a00150_gf84316f469ce0726985c0702db49a989) 1803 0 R (a00150_gf848ce44c810492e7a35c2d23a429f45) 1795 0 R (a00150_gfff0ed43201bf1e2020de1a0d6cac070) 1831 0 R (a00151) 1777 0 R (a00151_g2a0cf5d86c58fab216414ce59bf1fea1) 2184 0 R (a00151_g2addf34c7d457c1a7899a7e2171ef1e9) 2193 0 R (a00151_g6832e4d2d046536b6472f7ac92340f68) 2188 0 R (a00151_g85b65e38aa74eba18979156f97a94a87) 2194 0 R (a00151_gb6683dd83fe1c8de9a24086d4b69e907) 2192 0 R (a00152) 1775 0 R (a00152_g03d140db75de3d3cdfbbab1c4fed8d8d) 2220 0 R (a00152_g058a8e6025f67b021862281f1911fcef) 2257 0 R (a00152_g06ba7b414e718081998f2814090debf1) 2228 0 R (a00152_g24f52ac52d6e714cb04a5aa01be3bdd0) 2232 0 R (a00152_g2d9d28afa353f662b9bb5234fc419f72) 2239 0 R (a00152_g3e1562e8a6de32268e5df92a52152f91) 2218 0 R (a00152_g499bb98a0b4ae9a98553ede81317606d) 2250 0 R (a00152_g54b27e45df15e10a0eb1a3e3a91417d2) 1420 0 R (a00152_g737337d6a51e31b236c8233d024138a8) 2224 0 R (a00152_g7a7c46ffaba30477b8c9e3e61bd2e106) 2226 0 R (a00152_g902c4a360134096224bc2655f623aa5f) 2243 0 R (a00152_g9f2196e2705036869611962425e404bf) 2235 0 R (a00152_gbb558f3a9b1ec015e83c314aba694e35) 2222 0 R (a00152_gbb56b549f7ab4d86e1cc39b8afc70d1e) 2230 0 R (a00153) 650 0 R (a00153_g156dd2891a57035e4afdc4c2bc0b0ebf) 2371 0 R (a00153_g15de27b044603284f68db05a378235a7) 2344 0 R (a00153_g196379ceb1219a99f4495e41ccc9bbfb) 2324 0 R (a00153_g21664b7441cfa37d280228d23316d609) 2370 0 R (a00153_g24aa5bc36939cc9a0833e1df01478a7e) 2346 0 R (a00153_g285a80366aed9428f64282b8d13c918b) 2374 0 R (a00153_g2bc3b489923793759526a3181eb667fa) 2349 0 R (a00153_g3001114ddadc1f2ada5cc9a780e866fc) 2284 0 R (a00153_g3090117ef3ff5775b77cb1960e442d07) 2351 0 R (a00153_g3589822ecb9d9c4145209756396b8a6b) 2368 0 R (a00153_g3f6f1f6f98431f2d33ed30a30d2ccc35) 2276 0 R (a00153_g41aa744caa46913b3b3aedb2a4e78546) 713 0 R (a00153_g4910467b83a639f06739c82cd362037e) 2347 0 R (a00153_g4caecabca98b43919dd11be1c0d4cd8e) 1321 0 R (a00153_g51195ea7cd5aa387a87f9d3b23905b62) 2314 0 R (a00153_g51c1cd531ff0afb81620151f2248cd21) 2343 0 R (a00153_g529648ad3b0b327a43689b0f1779ff55) 2290 0 R (a00153_g5726142fec34f35fb9ea19e5a45975c6) 2369 0 R (a00153_g5b9dba2123705bce1ce95c3deca0bdad) 2348 0 R (a00153_g67cf1e0d2324c93f332c1f020c0fe8b3) 2345 0 R (a00153_g6836f92f3692f3a4429eb599db40cbae) 2388 0 R (a00153_g69646a81a922033c5281445a71f8ffed) 2395 0 R (a00153_g727459e5c4f777543c81ffffa3df3f0c) 2313 0 R (a00153_g763f12007aad8cc0e483bf50f8a8d9b4) 2286 0 R (a00153_g77570ac4fcab86864fa1916e55676da2) 1385 0 R (a00153_g8f4ebd8ef6c0ea665ed351d87fec09fd) 2342 0 R (a00153_g9069474ea570fd78c481aa164317dbaf) 2315 0 R (a00153_g92f3344ec8ca46893163399c89fafed5) 2319 0 R (a00153_g974c9b4bbe6b07cc1d64ac4fad278030) 2278 0 R (a00153_g9dd44616d41cef74d3beb51d8be5ecec) 2288 0 R (a00153_ga92afb113e122f860392bfbd385f842e) 2396 0 R (a00153_gac0de06236b02659460445de30776e00) 2340 0 R (a00153_gb1455b27c06532a399cf06d2c1d6d08d) 2350 0 R (a00153_gb58e1ceb7cb73ca2bcd73146b6c1b4e7) 2373 0 R (a00153_gb61381673de27f31848c5396bf0b338e) 2317 0 R (a00153_gb6e04358481bd2057524fb874cfa472b) 2386 0 R (a00153_gc3882366feda1cb759ccbfe98327a7db) 2307 0 R (a00153_gca1240bba5dd57f8c7c27123c84a1f6d) 2282 0 R (a00153_gcacc406c3bf7d0e00412e4c946252739) 2280 0 R (a00153_gdcf372ff9748996f7c05e9822a615384) 2310 0 R (a00153_ge0f8cbeca9731af2171ffd37e79de893) 2316 0 R (a00153_ge6f4a2453dbd8bc60e6a82774552366a) 2372 0 R (a00153_gf5fe83be78b78b9e7d9e7f1e34ab1cc5) 2341 0 R (a00153_gf963fdea2b75d27ef31e92d1d01359ee) 2318 0 R (a00154) 1776 0 R (a00154_gb4b17aaf20d630f30919b19937b966a3) 2497 0 R (a00155) 1165 0 R (a00155_g1ec8b8f4710dce1fa7fb87d3a31541ae) 2513 0 R (a00155_g2bdc4b7b4038454a79f1b2a94a6d2a98) 2526 0 R (a00155_g2c1bb4fa6d7a6ff951a41c73fc721109) 2511 0 R (a00155_g3983e0c026396d5c4506779d770007ba) 2524 0 R (a00155_g44311ecc30759ca38b4069182247bdae) 2509 0 R (a00155_gca51ceb2f5d855dfde55bcedf8d3b92d) 2517 0 R (a00155_gd8eec328a4868d767f0c00c8d1c6cfc1) 2515 0 R (a00156) 2532 0 R (a00156_g6614d96fdfcd95c95ec6e6f63071ff51) 2551 0 R (a00156_g6d71dececfce707c668e6257aad5906e) 2554 0 R (a00156_gcb807bd57e5489b386b876af5c1f163a) 2553 0 R (a00156_gedaf3e48c2b04229b85455fb948468d6) 2552 0 R (a00157) 2550 0 R (a00157_g78ab77b57cf2e00089f0a3a22508524c) 2601 0 R (a00157_ge3ced0551b26c9b99cb45a86f34d100a) 2595 0 R (a00157_ge5b7160f2e653725ba5e2024c3cb7bff) 2603 0 R (a00158) 656 0 R (a00158_g10d9a9201cba1a6db623284c475c6cea) 2674 0 R (a00158_g26ae707402e494f3895a9f012a93ea29) 2628 0 R (a00158_g2ebfe5c8a7f3173714efdf2df74fc392) 2682 0 R (a00158_g3178402dd725776415bf9745e7bf92ba) 2662 0 R (a00158_g3b19f65e48079d8105be2a99b5b4b2ae) 2667 0 R (a00158_g4a264bb64ae706d53f572b1d9e4037a2) 2680 0 R (a00158_g4ab2de595d36e9e55dd61f6ecd139162) 2678 0 R (a00158_g55ce98ea4d6f22e9d5068b904d4d2447) 2681 0 R (a00158_g5d56800f82bfc7bbf53bb4a659589812) 2675 0 R (a00158_g70d236d1cf34b4e21836edda60247b70) 2629 0 R (a00158_g84901a5aa60040e96d272a69977edd22) 2626 0 R (a00158_ga87ff36af81990e6ffe20d76d5e4606f) 2656 0 R (a00158_gb0ad55aa96dd1d200cd0fc5a99f6a4f7) 2673 0 R (a00158_gb5d9c0becf7cb32d0aaef466839dd92e) 2677 0 R (a00158_gc7cc1dba1819f7fcdaa9ff9eed5a08f4) 2679 0 R (a00158_gd895ab98c54d9966ff554aa873151751) 2676 0 R (a00158_gfa11b2a1faf395ae2a6626e01c482d5d) 2627 0 R (a00159) 2757 0 R (a00159_g720ac440c7b24bdd07c53ba146e36fb2) 2772 0 R (a00159_ga680bc3f3a1a8a6aec20fe729d138cb8) 2770 0 R (a00159_gceb952d27de8125d5146ac0bee325b8f) 2787 0 R (a00159_gd58a6c7e62ae59bf7a016ded12ca2910) 2788 0 R (a00159_gf31774d02a69fd3f1c2b282454438cba) 2785 0 R (a00159_gfe5e93119035e14cc485760a176249ba) 2786 0 R (a00160) 1315 0 R (a00160_g070d2ce7b6bb7e5c05602aa8c308d0c4) 2834 0 R (a00160_g221d37ccde7e3fd0dd2c2eb0a6b15493) 2838 0 R (a00160_g3191066cf8f76bd00b6843b77c37068f) 2858 0 R (a00160_g3d768e989e308144190ae1a5ddfa9726) 2832 0 R (a00160_g66d19181ad5fe8b8f7c84d1f1d46a2ec) 2854 0 R (a00160_g6d9751d534453425c7a5a215d1d4414c) 2856 0 R (a00160_g7c5359305008e9183b18d6ab75f568bf) 2841 0 R (a00160_gb50f78bbf36d912d69f6c1685d0b40e3) 2849 0 R (a00160_gdf916e0c752f5cda70d0bddb2be422ba) 2857 0 R (a00160_ge4dcbbe6c641d2e3b8537b479df5fc99) 2855 0 R (a00160_gecf13b8dc783db2202ca5c34fe117fc3) 2836 0 R (a00161) 1316 0 R (a00161_g029256bc17a12e1e86781887e11c0c7d) 2901 0 R (a00161_g17ccd786400fd08b941e11046df1668f) 2917 0 R (a00161_g28cf9765e4b57451af559ab988ad7160) 2915 0 R (a00161_g3212e70c55244608ac16316888c354f0) 2905 0 R (a00161_g34b924954ba5707d536df28d71a80d39) 2911 0 R (a00161_g37e3103b9591790d484a450525739661) 2929 0 R (a00161_g64807ba7c221ddf735572d05021539f2) 2921 0 R (a00161_g6cda47c85ce1b58b501b44ac9cccc50e) 2907 0 R (a00161_g9e97c58fe35f750ad192774be9408ac8) 2913 0 R (a00161_gb1fc692a2700b7a51517724364683f67) 2928 0 R (a00161_gbc331f73107958428bf1c392ba19b6f4) 2923 0 R (a00161_gcff75c8c930abd6ff168e85373a4eb92) 2903 0 R (a00161_gf0349a8481565e80f55a751e2b408d6d) 2930 0 R (a00161_gf7dd2757d1e766f65b01ba7c91c660a0) 2909 0 R (a00162) 1317 0 R (a00162_g123c95a7bb55143cabba92446ce8f513) 3020 0 R (a00162_g19709735f29dafeabb91e0882231f9f1) 2968 0 R (a00162_g26440a35353cb457747a4cea372c62e9) 2956 0 R (a00162_g30fe27cba3c14ae7f9a7f118144af43a) 2958 0 R (a00162_g3212e70c55244608ac16316888c354f0) 2962 0 R (a00162_g3318dec654781e9d6d8ec873636660c6) 2984 0 R (a00162_g3a4852e2372e34e1c0142d1147fbe027) 2988 0 R (a00162_g4647b76d0ef50a5305505041f5775a37) 2993 0 R (a00162_g5025948dd998f65a13a375a37aa5edf5) 2972 0 R (a00162_g52c3c5ab1b1aa0659b5e465f7fbcc409) 3001 0 R (a00162_g57aca709a33690cd4fb73fe199fa1bdd) 2978 0 R (a00162_g69b075ef7e4d7bcf5a903d3d75baac02) 3013 0 R (a00162_g6b2d00412304e2d95e7b853cce5858b0) 2982 0 R (a00162_g6cda47c85ce1b58b501b44ac9cccc50e) 2964 0 R (a00162_g7e904ab59f7ee134cf3218a8219e7e29) 2970 0 R (a00162_g82ff99d50221f7c17df57dc6092ffc97) 3007 0 R (a00162_g86beee1f69d05b16022dfb430470e9ce) 3016 0 R (a00162_g8b600918f84783490fd791ce773175ab) 2980 0 R (a00162_g984c4a8b65a3cb35460b073a40568c25) 3003 0 R (a00162_gaa60ca995565b799bb958c806e933665) 2990 0 R (a00162_gaaaaf66ea67900c36d01136d5bad1168) 2976 0 R (a00162_gbfc1d8d15852318927cda30e1bc0470a) 2974 0 R (a00162_gd1f18f739da7703628c3663209463a0d) 3021 0 R (a00162_ge28f6cb60e86088d8886d0f804b4f37c) 2960 0 R (a00162_ge429c985be88ed048f382511c9ff00de) 2966 0 R (a00162_gf11c966b0e4f4ecaa73deb14bfb6830f) 3019 0 R (a00162_gf784a76fe619452eddf87e6376a4bf9d) 2986 0 R (a00163) 1318 0 R (a00163_g03070adbf8faab0f34f87c1270964306) 3047 0 R (a00163_gb97849f0d3ea858eee790b69591e6427) 3049 0 R (a00163_ge28f6cb60e86088d8886d0f804b4f37c) 3044 0 R (a00164) 1319 0 R (a00164_g0e0ea5f24b77f124ba33bcbc7ede5bfb) 3134 0 R (a00164_g1d34be506a61db90dd7829117efdf8cf) 3120 0 R (a00164_g23705efb9077187881f094fc9be13bde) 3102 0 R (a00164_g2a939aa4fcffabbce1dc1f784a7e0ad3) 3135 0 R (a00164_g31be289fd8ec3fe09b0088165d13976d) 3072 0 R (a00164_g3212e70c55244608ac16316888c354f0) 3090 0 R (a00164_g38af81a4c9884ce89803fc3e52383112) 3088 0 R (a00164_g3caacabb2fe1c71921e1a471719ccbd2) 3116 0 R (a00164_g40fb1fb2d990ce04ae9bbee275627c03) 3082 0 R (a00164_g41e616d3fcc17e0aabfe8ab45ef0d30f) 3133 0 R (a00164_g4433d3af16ea083a81576d0f18ba57c9) 3132 0 R (a00164_g4d457c50e6f2cef57167c3804ce8bf7c) 3078 0 R (a00164_g5a5bfd7e9060903893481db90645187b) 3068 0 R (a00164_g6b942c1ef22f8cd1a726ef3364c9fbea) 3101 0 R (a00164_g6cda47c85ce1b58b501b44ac9cccc50e) 3092 0 R (a00164_g71e1b022f7b7fa3a154f19372b239935) 3094 0 R (a00164_g863c94b0ed4a76997e53a3ccd5d0b6c3) 3080 0 R (a00164_g8714af98a550f10dc814db92b08d1b0d) 3074 0 R (a00164_g9e6d2864f390a4ba1ac60dc65e2b9815) 3122 0 R (a00164_gc4357cec23abca29d2bb885803625a6a) 3076 0 R (a00164_gc4b119801e50cc1824498a1cdf9adc37) 3100 0 R (a00164_gd895686859ae7d178d31be04eb0a1a97) 3086 0 R (a00164_gda99954e0f6905091885934e86c278cc) 3084 0 R (a00164_gdc5aec3587b2c55b714a6c2f37b56cba) 3097 0 R (a00164_ge28f6cb60e86088d8886d0f804b4f37c) 3070 0 R (a00164_gf11d9915ec12a8cdd9fdcbb5e8fcd5c7) 3103 0 R (a00164_gf8f12c820cc08da32aa62898bfc02db3) 3104 0 R (a00164_gf9385ef9ecc74c7d53ff2f15e62bfde3) 3131 0 R (a00165) 1320 0 R (a00165_g14e276fa8e765f774f4162619f1c8fc1) 3220 0 R (a00165_g1dbc635a2924806f42d7e3273a6a69b5) 3228 0 R (a00165_g3212e70c55244608ac16316888c354f0) 3208 0 R (a00165_g648ddfb2dde2cc55034e4e0ea41cb6d1) 3225 0 R (a00165_g71e1b022f7b7fa3a154f19372b239935) 3210 0 R (a00165_g79f9a50c2cccb967d38a2eeb45d2fd75) 3214 0 R (a00165_g7d7920c1e51cc4eef80206ebd6fee3f4) 3204 0 R (a00165_g820fb27c50e7bb4ac6d9eae1b06630a5) 3218 0 R (a00165_g8a645f8831837320c4e0c704e871abcf) 3206 0 R (a00165_gc364305cee969a0be43c071722b136e6) 3229 0 R (a00165_ge3f8f7deae69854853b0c8ebb82c380d) 3212 0 R (a00165_ge6f849e94cf6e214be8ffa9a548ecfcd) 3223 0 R (a00165_gf7dd2757d1e766f65b01ba7c91c660a0) 3216 0 R (a00171) 3890 0 R (a00172) 3905 0 R (a00173) 3956 0 R (a00174) 3985 0 R (a00175) 4017 0 R (a00176) 4037 0 R (a00177) 4059 0 R (a00178) 4075 0 R (a00179) 4104 0 R (a00180) 4123 0 R (a00181) 4150 0 R (a00182) 4182 0 R (a00183) 4205 0 R (a00184) 4219 0 R (a00185) 4240 0 R (a00187) 4258 0 R (a00188) 4282 0 R (a00190) 4299 0 R (a00191) 4316 0 R (a00192) 4324 0 R (a00194) 4354 0 R (a00195) 4403 0 R (a00196) 4447 0 R (a00197) 4466 0 R (a00198) 4495 0 R (a00199) 4521 0 R (a00201) 4531 0 R (a00202) 4576 0 R (a00203) 4670 0 R (a00204) 4857 0 R (a00205) 4878 0 R (a00206) 4902 0 R (a00207) 4919 0 R (a00208) 4977 0 R (chapter*.1) 500 0 R (chapter.1) 6 0 R (chapter.2) 46 0 R (chapter.3) 54 0 R (chapter.4) 62 0 R (chapter.5) 70 0 R (chapter.6) 78 0 R (chapter.7) 178 0 R (chapter.8) 266 0 R (chapter.9) 406 0 R (index) 632 0 R (main_api) 685 0 R (main_appevents) 694 0 R (main_arch) 668 0 R (main_checksums) 669 0 R (main_closing) 729 0 R (main_congestioncontrol) 862 0 R (main_connect) 759 0 R (main_connstate) 697 0 R (main_delack) 871 0 R (main_errors) 734 0 R (main_example1) 768 0 R (main_example2) 784 0 R (main_example3) 791 0 R (main_example4) 793 0 R (main_example5) 802 0 R (main_example6) 812 0 R (main_examples) 767 0 R (main_flowcontrol) 860 0 R (main_icmp) 840 0 R (main_ip) 834 0 R (main_ipbroadcast) 838 0 R (main_ipreass) 836 0 R (main_listeb) 848 0 R (main_listen) 741 0 R (main_longarith) 673 0 R (main_mainloop) 662 0 R (main_memory) 676 0 R (main_performance) 866 0 R (main_polling) 738 0 R (main_protoimpl) 828 0 R (main_rawapi) 688 0 R (main_recvdata) 706 0 R (main_rexmit) 854 0 R (main_rexmitdata) 725 0 R (main_rttest) 852 0 R (main_senddata) 711 0 R (main_slidingwindow) 850 0 R (main_tcp) 842 0 R (main_tcpip) 661 0 R (main_uIPIntroduction) 647 0 R (main_urgdata) 864 0 R (page.1) 478 0 R (page.10) 797 0 R (page.100) 2738 0 R (page.101) 2752 0 R (page.102) 2756 0 R (page.103) 2792 0 R (page.104) 2813 0 R (page.105) 2823 0 R (page.106) 2862 0 R (page.107) 2881 0 R (page.108) 2893 0 R (page.109) 2934 0 R (page.11) 809 0 R (page.110) 2946 0 R (page.111) 2999 0 R (page.112) 3025 0 R (page.113) 3035 0 R (page.114) 3054 0 R (page.115) 3108 0 R (page.116) 3139 0 R (page.117) 3155 0 R (page.118) 3172 0 R (page.119) 3187 0 R (page.12) 817 0 R (page.120) 3194 0 R (page.121) 3233 0 R (page.122) 3242 0 R (page.123) 3246 0 R (page.124) 3290 0 R (page.125) 3306 0 R (page.126) 3316 0 R (page.127) 3346 0 R (page.128) 3361 0 R (page.129) 3393 0 R (page.13) 825 0 R (page.130) 3404 0 R (page.131) 3414 0 R (page.132) 3446 0 R (page.133) 3462 0 R (page.134) 3478 0 R (page.135) 3518 0 R (page.136) 3534 0 R (page.137) 3543 0 R (page.138) 3558 0 R (page.139) 3609 0 R (page.14) 833 0 R (page.140) 3619 0 R (page.141) 3670 0 R (page.142) 3704 0 R (page.143) 3770 0 R (page.144) 3793 0 R (page.145) 3841 0 R (page.146) 3879 0 R (page.147) 3883 0 R (page.148) 3894 0 R (page.149) 3909 0 R (page.15) 846 0 R (page.150) 3960 0 R (page.151) 3967 0 R (page.152) 3989 0 R (page.153) 3999 0 R (page.154) 4021 0 R (page.155) 4041 0 R (page.156) 4049 0 R (page.157) 4063 0 R (page.158) 4079 0 R (page.159) 4108 0 R (page.16) 859 0 R (page.160) 4127 0 R (page.161) 4154 0 R (page.162) 4162 0 R (page.163) 4186 0 R (page.164) 4199 0 R (page.165) 4209 0 R (page.166) 4223 0 R (page.167) 4244 0 R (page.168) 4262 0 R (page.169) 4286 0 R (page.17) 870 0 R (page.170) 4303 0 R (page.171) 4320 0 R (page.172) 4328 0 R (page.173) 4358 0 R (page.174) 4383 0 R (page.175) 4407 0 R (page.176) 4434 0 R (page.177) 4451 0 R (page.178) 4470 0 R (page.179) 4499 0 R (page.18) 876 0 R (page.180) 4525 0 R (page.181) 4535 0 R (page.182) 4580 0 R (page.183) 4629 0 R (page.184) 4652 0 R (page.185) 4674 0 R (page.186) 4699 0 R (page.187) 4720 0 R (page.188) 4760 0 R (page.189) 4807 0 R (page.19) 880 0 R (page.190) 4841 0 R (page.191) 4861 0 R (page.192) 4882 0 R (page.193) 4906 0 R (page.194) 4923 0 R (page.195) 4942 0 R (page.196) 4961 0 R (page.197) 4981 0 R (page.198) 4985 0 R (page.199) 4989 0 R (page.2) 493 0 R (page.20) 909 0 R (page.200) 4994 0 R (page.201) 4998 0 R (page.202) 5002 0 R (page.203) 5006 0 R (page.204) 5010 0 R (page.205) 5014 0 R (page.206) 5019 0 R (page.207) 5023 0 R (page.208) 5027 0 R (page.209) 5031 0 R (page.21) 913 0 R (page.210) 5035 0 R (page.211) 5039 0 R (page.212) 5044 0 R (page.213) 5048 0 R (page.214) 5052 0 R (page.215) 5056 0 R (page.216) 5060 0 R (page.217) 5064 0 R (page.218) 5069 0 R (page.219) 5073 0 R (page.22) 938 0 R (page.220) 5077 0 R (page.221) 5081 0 R (page.222) 5085 0 R (page.223) 5089 0 R (page.224) 5094 0 R (page.225) 5098 0 R (page.226) 5102 0 R (page.227) 5106 0 R (page.228) 5110 0 R (page.229) 5114 0 R (page.23) 942 0 R (page.230) 5119 0 R (page.231) 5123 0 R (page.232) 5127 0 R (page.233) 5131 0 R (page.234) 5135 0 R (page.235) 5140 0 R (page.236) 5145 0 R (page.237) 5149 0 R (page.238) 5153 0 R (page.239) 5157 0 R (page.24) 1008 0 R (page.240) 5161 0 R (page.241) 5165 0 R (page.242) 5170 0 R (page.243) 5174 0 R (page.244) 5178 0 R (page.245) 5182 0 R (page.246) 5186 0 R (page.247) 5190 0 R (page.248) 5195 0 R (page.249) 5199 0 R (page.25) 1012 0 R (page.250) 5203 0 R (page.251) 5276 0 R (page.252) 5344 0 R (page.253) 5429 0 R (page.254) 5495 0 R (page.255) 5577 0 R (page.26) 1092 0 R (page.27) 1123 0 R (page.28) 1128 0 R (page.29) 1152 0 R (page.3) 568 0 R (page.30) 1169 0 R (page.31) 1201 0 R (page.32) 1241 0 R (page.33) 1259 0 R (page.34) 1271 0 R (page.35) 1287 0 R (page.36) 1294 0 R (page.37) 1325 0 R (page.38) 1349 0 R (page.39) 1359 0 R (page.4) 608 0 R (page.40) 1371 0 R (page.41) 1389 0 R (page.42) 1415 0 R (page.43) 1424 0 R (page.44) 1441 0 R (page.45) 1457 0 R (page.46) 1461 0 R (page.47) 1489 0 R (page.48) 1524 0 R (page.49) 1544 0 R (page.5) 693 0 R (page.50) 1571 0 R (page.51) 1589 0 R (page.52) 1602 0 R (page.53) 1622 0 R (page.54) 1642 0 R (page.55) 1653 0 R (page.56) 1687 0 R (page.57) 1705 0 R (page.58) 1714 0 R (page.59) 1723 0 R (page.6) 720 0 R (page.60) 1730 0 R (page.61) 1742 0 R (page.62) 1759 0 R (page.63) 1781 0 R (page.64) 1851 0 R (page.65) 1948 0 R (page.66) 2004 0 R (page.67) 2059 0 R (page.68) 2076 0 R (page.69) 2091 0 R (page.7) 754 0 R (page.70) 2104 0 R (page.71) 2119 0 R (page.72) 2141 0 R (page.73) 2162 0 R (page.74) 2167 0 R (page.75) 2198 0 R (page.76) 2210 0 R (page.77) 2247 0 R (page.78) 2261 0 R (page.79) 2268 0 R (page.8) 778 0 R (page.80) 2296 0 R (page.81) 2323 0 R (page.82) 2355 0 R (page.83) 2378 0 R (page.84) 2400 0 R (page.85) 2418 0 R (page.86) 2429 0 R (page.87) 2439 0 R (page.88) 2473 0 R (page.89) 2490 0 R (page.9) 790 0 R (page.90) 2502 0 R (page.91) 2531 0 R (page.92) 2558 0 R (page.93) 2578 0 R (page.94) 2589 0 R (page.95) 2608 0 R (page.96) 2633 0 R (page.97) 2686 0 R (page.98) 2705 0 R (page.99) 2721 0 R (section*.10) 1207 0 R (section*.100) 3407 0 R (section*.101) 3419 0 R (section*.102) 3450 0 R (section*.103) 3469 0 R (section*.104) 3481 0 R (section*.105) 3536 0 R (section*.106) 3545 0 R (section*.107) 3560 0 R (section*.108) 3611 0 R (section*.109) 3621 0 R (section*.11) 1209 0 R (section*.110) 3706 0 R (section*.111) 3774 0 R (section*.112) 3795 0 R (section*.113) 3845 0 R (section*.114) 3887 0 R (section*.115) 3898 0 R (section*.116) 3900 0 R (section*.117) 3902 0 R (section*.118) 3913 0 R (section*.119) 3949 0 R (section*.12) 1214 0 R (section*.120) 3971 0 R (section*.121) 3976 0 R (section*.122) 3978 0 R (section*.123) 4003 0 R (section*.124) 4011 0 R (section*.125) 4025 0 R (section*.126) 4027 0 R (section*.127) 4034 0 R (section*.128) 4042 0 R (section*.129) 4053 0 R (section*.13) 1296 0 R (section*.130) 4055 0 R (section*.131) 4067 0 R (section*.132) 4083 0 R (section*.133) 4098 0 R (section*.134) 4112 0 R (section*.135) 4114 0 R (section*.136) 4118 0 R (section*.137) 4121 0 R (section*.138) 4131 0 R (section*.139) 4144 0 R (section*.14) 1304 0 R (section*.140) 4166 0 R (section*.141) 4168 0 R (section*.142) 4171 0 R (section*.143) 4174 0 R (section*.144) 4203 0 R (section*.145) 4213 0 R (section*.146) 4215 0 R (section*.147) 4217 0 R (section*.148) 4227 0 R (section*.149) 4237 0 R (section*.15) 1327 0 R (section*.150) 4248 0 R (section*.151) 4266 0 R (section*.152) 4268 0 R (section*.153) 4272 0 R (section*.154) 4291 0 R (section*.155) 4296 0 R (section*.156) 4308 0 R (section*.157) 4314 0 R (section*.158) 4332 0 R (section*.159) 4335 0 R (section*.16) 1373 0 R (section*.160) 4373 0 R (section*.161) 4387 0 R (section*.162) 4389 0 R (section*.163) 4392 0 R (section*.164) 4398 0 R (section*.165) 4408 0 R (section*.166) 4413 0 R (section*.167) 4418 0 R (section*.168) 4420 0 R (section*.169) 4425 0 R (section*.17) 1391 0 R (section*.170) 4438 0 R (section*.171) 4455 0 R (section*.172) 4457 0 R (section*.173) 4474 0 R (section*.174) 4479 0 R (section*.175) 4503 0 R (section*.176) 4505 0 R (section*.177) 4529 0 R (section*.178) 4539 0 R (section*.179) 4581 0 R (section*.18) 1401 0 R (section*.180) 4614 0 R (section*.181) 4656 0 R (section*.182) 4664 0 R (section*.183) 4769 0 R (section*.184) 4776 0 R (section*.185) 4812 0 R (section*.186) 4845 0 R (section*.187) 4865 0 R (section*.188) 4873 0 R (section*.189) 4886 0 R (section*.19) 1463 0 R (section*.190) 4888 0 R (section*.191) 4894 0 R (section*.192) 4899 0 R (section*.193) 4910 0 R (section*.194) 4914 0 R (section*.195) 4924 0 R (section*.196) 4928 0 R (section*.197) 4943 0 R (section*.198) 4946 0 R (section*.199) 4953 0 R (section*.2) 1163 0 R (section*.20) 1498 0 R (section*.200) 4955 0 R (section*.201) 4965 0 R (section*.21) 1656 0 R (section*.22) 1670 0 R (section*.23) 1744 0 R (section*.24) 1762 0 R (section*.25) 1765 0 R (section*.26) 1782 0 R (section*.27) 1790 0 R (section*.28) 1925 0 R (section*.29) 1934 0 R (section*.3) 1173 0 R (section*.30) 1975 0 R (section*.31) 2169 0 R (section*.32) 2171 0 R (section*.33) 2183 0 R (section*.34) 2212 0 R (section*.35) 2215 0 R (section*.36) 2217 0 R (section*.37) 2238 0 R (section*.38) 2249 0 R (section*.39) 2272 0 R (section*.4) 1175 0 R (section*.40) 2275 0 R (section*.41) 2300 0 R (section*.42) 2304 0 R (section*.43) 2309 0 R (section*.44) 2326 0 R (section*.45) 2337 0 R (section*.46) 2356 0 R (section*.47) 2363 0 R (section*.48) 2365 0 R (section*.49) 2385 0 R (section*.5) 1177 0 R (section*.50) 2492 0 R (section*.51) 2494 0 R (section*.52) 2504 0 R (section*.53) 2508 0 R (section*.54) 2523 0 R (section*.55) 2535 0 R (section*.56) 2538 0 R (section*.57) 2540 0 R (section*.58) 2594 0 R (section*.59) 2597 0 R (section*.6) 1180 0 R (section*.60) 2614 0 R (section*.61) 2616 0 R (section*.62) 2619 0 R (section*.63) 2661 0 R (section*.64) 2764 0 R (section*.65) 2767 0 R (section*.66) 2769 0 R (section*.67) 2775 0 R (section*.68) 2828 0 R (section*.69) 2831 0 R (section*.7) 1186 0 R (section*.70) 2840 0 R (section*.71) 2895 0 R (section*.72) 2898 0 R (section*.73) 2900 0 R (section*.74) 2919 0 R (section*.75) 2948 0 R (section*.76) 2953 0 R (section*.77) 2955 0 R (section*.78) 2992 0 R (section*.79) 3000 0 R (section*.8) 1191 0 R (section*.80) 3038 0 R (section*.81) 3041 0 R (section*.82) 3043 0 R (section*.83) 3046 0 R (section*.84) 3062 0 R (section*.85) 3065 0 R (section*.86) 3067 0 R (section*.87) 3096 0 R (section*.88) 3109 0 R (section*.89) 3196 0 R (section*.9) 1202 0 R (section*.90) 3200 0 R (section*.91) 3202 0 R (section*.92) 3222 0 R (section*.93) 3250 0 R (section*.94) 3294 0 R (section*.95) 3308 0 R (section*.96) 3318 0 R (section*.97) 3348 0 R (section*.98) 3364 0 R (section*.99) 3395 0 R (section.1.1) 10 0 R (section.1.2) 14 0 R (section.1.3) 18 0 R (section.1.4) 22 0 R (section.1.5) 26 0 R (section.1.6) 30 0 R (section.1.7) 34 0 R (section.1.8) 38 0 R (section.1.9) 42 0 R (section.2.1) 50 0 R (section.3.1) 58 0 R (section.4.1) 66 0 R (section.5.1) 74 0 R (section.6.1) 82 0 R (section.6.10) 118 0 R (section.6.11) 122 0 R (section.6.12) 126 0 R (section.6.13) 130 0 R (section.6.14) 134 0 R (section.6.15) 138 0 R (section.6.16) 142 0 R (section.6.17) 146 0 R (section.6.18) 150 0 R (section.6.19) 154 0 R (section.6.2) 86 0 R (section.6.20) 158 0 R (section.6.21) 162 0 R (section.6.22) 166 0 R (section.6.23) 170 0 R (section.6.24) 174 0 R (section.6.3) 90 0 R (section.6.4) 94 0 R (section.6.5) 98 0 R (section.6.6) 102 0 R (section.6.7) 106 0 R (section.6.8) 110 0 R (section.6.9) 114 0 R (section.7.1) 182 0 R (section.7.10) 218 0 R (section.7.11) 222 0 R (section.7.12) 226 0 R (section.7.13) 230 0 R (section.7.14) 234 0 R (section.7.15) 238 0 R (section.7.16) 242 0 R (section.7.17) 246 0 R (section.7.18) 250 0 R (section.7.19) 254 0 R (section.7.2) 186 0 R (section.7.20) 258 0 R (section.7.21) 262 0 R (section.7.3) 190 0 R (section.7.4) 194 0 R (section.7.5) 198 0 R (section.7.6) 202 0 R (section.7.7) 206 0 R (section.7.8) 210 0 R (section.7.9) 214 0 R (section.8.1) 270 0 R (section.8.10) 306 0 R (section.8.11) 310 0 R (section.8.12) 314 0 R (section.8.13) 318 0 R (section.8.14) 322 0 R (section.8.15) 326 0 R (section.8.16) 330 0 R (section.8.17) 334 0 R (section.8.18) 338 0 R (section.8.19) 342 0 R (section.8.2) 274 0 R (section.8.20) 346 0 R (section.8.21) 350 0 R (section.8.22) 354 0 R (section.8.23) 358 0 R (section.8.24) 362 0 R (section.8.25) 366 0 R (section.8.26) 370 0 R (section.8.27) 374 0 R (section.8.28) 378 0 R (section.8.29) 382 0 R (section.8.3) 278 0 R (section.8.30) 386 0 R (section.8.31) 390 0 R (section.8.32) 394 0 R (section.8.33) 398 0 R (section.8.34) 402 0 R (section.8.4) 282 0 R (section.8.5) 286 0 R (section.8.6) 290 0 R (section.8.7) 294 0 R (section.8.8) 298 0 R (section.8.9) 302 0 R (section.9.1) 410 0 R (section.9.10) 446 0 R (section.9.11) 450 0 R (section.9.12) 454 0 R (section.9.13) 458 0 R (section.9.14) 462 0 R (section.9.15) 466 0 R (section.9.16) 470 0 R (section.9.2) 414 0 R (section.9.3) 418 0 R (section.9.4) 422 0 R (section.9.5) 426 0 R (section.9.6) 430 0 R (section.9.7) 434 0 R (section.9.8) 438 0 R (section.9.9) 442 0 R (subsection.1.4.1) 670 0 R (subsection.1.4.2) 674 0 R (subsection.1.6.1) 689 0 R (subsection.1.7.1) 769 0 R (subsection.1.7.2) 785 0 R (subsection.1.7.3) 792 0 R (subsection.1.7.4) 798 0 R (subsection.1.7.5) 803 0 R (subsection.1.7.6) 813 0 R (subsection.1.8.1) 835 0 R (subsection.1.8.2) 841 0 R (subsection.1.8.3) 847 0 R (subsection.1.9.1) 872 0 R (subsection.6.1.1) 1124 0 R (subsection.6.1.2) 1138 0 R (subsection.6.1.3) 1142 0 R (subsection.6.1.4) 1154 0 R (subsection.6.1.5) 1156 0 R (subsection.6.1.6) 1158 0 R (subsection.6.1.7) 1223 0 R (subsection.6.10.1) 2168 0 R (subsection.6.10.2) 2187 0 R (subsection.6.11.1) 2211 0 R (subsection.6.11.2) 2253 0 R (subsection.6.12.1) 2269 0 R (subsection.6.12.2) 2390 0 R (subsection.6.12.3) 2443 0 R (subsection.6.12.4) 2484 0 R (subsection.6.13.1) 2491 0 R (subsection.6.13.2) 2496 0 R (subsection.6.14.1) 2503 0 R (subsection.6.15.1) 2533 0 R (subsection.6.15.2) 2559 0 R (subsection.6.16.1) 2590 0 R (subsection.6.16.2) 2600 0 R (subsection.6.17.1) 2609 0 R (subsection.6.17.2) 2670 0 R (subsection.6.18.1) 2758 0 R (subsection.6.18.2) 2793 0 R (subsection.6.18.3) 2799 0 R (subsection.6.19.1) 2824 0 R (subsection.6.19.2) 2863 0 R (subsection.6.2.1) 1295 0 R (subsection.6.20.1) 2894 0 R (subsection.6.20.2) 2935 0 R (subsection.6.21.1) 2947 0 R (subsection.6.21.2) 3012 0 R (subsection.6.22.1) 3036 0 R (subsection.6.23.1) 3055 0 R (subsection.6.23.2) 3128 0 R (subsection.6.24.1) 3195 0 R (subsection.6.24.2) 3234 0 R (subsection.6.24.3) 3236 0 R (subsection.6.3.1) 1326 0 R (subsection.6.3.2) 1335 0 R (subsection.6.4.1) 1372 0 R (subsection.6.4.2) 1377 0 R (subsection.6.5.1) 1390 0 R (subsection.6.5.2) 1404 0 R (subsection.6.5.3) 1449 0 R (subsection.6.6.1) 1462 0 R (subsection.6.6.2) 1512 0 R (subsection.6.6.3) 1604 0 R (subsection.6.7.1) 1655 0 R (subsection.6.7.2) 1688 0 R (subsection.6.7.3) 1731 0 R (subsection.6.8.1) 1743 0 R (subsection.6.8.2) 1747 0 R (subsection.6.9.1) 1761 0 R (subsection.6.9.2) 2052 0 R (subsection.6.9.3) 2060 0 R (subsection.6.9.4) 2124 0 R (subsection.7.1.1) 3247 0 R (subsection.7.10.1) 3447 0 R (subsection.7.11.1) 3463 0 R (subsection.7.12.1) 3479 0 R (subsection.7.13.1) 3535 0 R (subsection.7.14.1) 3544 0 R (subsection.7.15.1) 3559 0 R (subsection.7.16.1) 3610 0 R (subsection.7.17.1) 3620 0 R (subsection.7.18.1) 3705 0 R (subsection.7.19.1) 3771 0 R (subsection.7.2.1) 3291 0 R (subsection.7.20.1) 3794 0 R (subsection.7.21.1) 3842 0 R (subsection.7.3.1) 3307 0 R (subsection.7.4.1) 3317 0 R (subsection.7.5.1) 3347 0 R (subsection.7.6.1) 3362 0 R (subsection.7.7.1) 3394 0 R (subsection.7.8.1) 3405 0 R (subsection.7.9.1) 3415 0 R (subsection.8.1.1) 3884 0 R (subsection.8.10.1) 4109 0 R (subsection.8.11.1) 4128 0 R (subsection.8.12.1) 4163 0 R (subsection.8.13.1) 4200 0 R (subsection.8.14.1) 4210 0 R (subsection.8.15.1) 4224 0 R (subsection.8.16.1) 4245 0 R (subsection.8.17.1) 4263 0 R (subsection.8.18.1) 4287 0 R (subsection.8.19.1) 4304 0 R (subsection.8.2.1) 3895 0 R (subsection.8.20.1) 4321 0 R (subsection.8.21.1) 4329 0 R (subsection.8.22.1) 4384 0 R (subsection.8.23.1) 4435 0 R (subsection.8.24.1) 4452 0 R (subsection.8.25.1) 4471 0 R (subsection.8.26.1) 4500 0 R (subsection.8.27.1) 4526 0 R (subsection.8.28.1) 4536 0 R (subsection.8.29.1) 4653 0 R (subsection.8.3.1) 3910 0 R (subsection.8.30.1) 4842 0 R (subsection.8.31.1) 4862 0 R (subsection.8.32.1) 4883 0 R (subsection.8.33.1) 4907 0 R (subsection.8.34.1) 4962 0 R (subsection.8.4.1) 3968 0 R (subsection.8.5.1) 4000 0 R (subsection.8.6.1) 4022 0 R (subsection.8.7.1) 4050 0 R (subsection.8.8.1) 4064 0 R (subsection.8.9.1) 4080 0 R (subsubsection.1.6.1.1) 695 0 R (subsubsection.1.6.1.10) 760 0 R (subsubsection.1.6.1.2) 698 0 R (subsubsection.1.6.1.3) 707 0 R (subsubsection.1.6.1.4) 712 0 R (subsubsection.1.6.1.5) 726 0 R (subsubsection.1.6.1.6) 730 0 R (subsubsection.1.6.1.7) 735 0 R (subsubsection.1.6.1.8) 739 0 R (subsubsection.1.6.1.9) 755 0 R (subsubsection.1.8.1.1) 837 0 R (subsubsection.1.8.1.2) 839 0 R (subsubsection.1.8.3.1) 849 0 R (subsubsection.1.8.3.2) 851 0 R (subsubsection.1.8.3.3) 853 0 R (subsubsection.1.8.3.4) 855 0 R (subsubsection.1.8.3.5) 861 0 R (subsubsection.1.8.3.6) 863 0 R (subsubsection.1.8.3.7) 865 0 R (subsubsection.6.1.7.1) 1224 0 R (subsubsection.6.1.7.10) 1276 0 R (subsubsection.6.1.7.11) 1279 0 R (subsubsection.6.1.7.12) 1282 0 R (subsubsection.6.1.7.13) 1289 0 R (subsubsection.6.1.7.2) 1242 0 R (subsubsection.6.1.7.3) 1246 0 R (subsubsection.6.1.7.4) 1248 0 R (subsubsection.6.1.7.5) 1252 0 R (subsubsection.6.1.7.6) 1261 0 R (subsubsection.6.1.7.7) 1262 0 R (subsubsection.6.1.7.8) 1264 0 R (subsubsection.6.1.7.9) 1272 0 R (subsubsection.6.10.2.1) 2189 0 R (subsubsection.6.10.2.2) 2199 0 R (subsubsection.6.10.2.3) 2203 0 R (subsubsection.6.10.2.4) 2205 0 R (subsubsection.6.11.2.1) 2254 0 R (subsubsection.6.11.2.2) 2256 0 R (subsubsection.6.11.2.3) 2263 0 R (subsubsection.6.12.2.1) 2391 0 R (subsubsection.6.12.2.10) 2414 0 R (subsubsection.6.12.2.11) 2419 0 R (subsubsection.6.12.2.12) 2420 0 R (subsubsection.6.12.2.13) 2422 0 R (subsubsection.6.12.2.14) 2423 0 R (subsubsection.6.12.2.15) 2424 0 R (subsubsection.6.12.2.16) 2430 0 R (subsubsection.6.12.2.17) 2431 0 R (subsubsection.6.12.2.18) 2432 0 R (subsubsection.6.12.2.19) 2433 0 R (subsubsection.6.12.2.2) 2392 0 R (subsubsection.6.12.2.20) 2434 0 R (subsubsection.6.12.2.21) 2435 0 R (subsubsection.6.12.2.22) 2440 0 R (subsubsection.6.12.2.23) 2441 0 R (subsubsection.6.12.2.24) 2442 0 R (subsubsection.6.12.2.3) 2393 0 R (subsubsection.6.12.2.4) 2394 0 R (subsubsection.6.12.2.5) 2401 0 R (subsubsection.6.12.2.6) 2402 0 R (subsubsection.6.12.2.7) 2403 0 R (subsubsection.6.12.2.8) 2406 0 R (subsubsection.6.12.2.9) 2412 0 R (subsubsection.6.12.3.1) 2444 0 R (subsubsection.6.12.3.2) 2454 0 R (subsubsection.6.12.3.3) 2463 0 R (subsubsection.6.12.3.4) 2474 0 R (subsubsection.6.12.3.5) 2480 0 R (subsubsection.6.12.4.1) 2485 0 R (subsubsection.6.13.2.1) 2498 0 R (subsubsection.6.15.2.1) 2560 0 R (subsubsection.6.15.2.2) 2565 0 R (subsubsection.6.15.2.3) 2571 0 R (subsubsection.6.15.2.4) 2580 0 R (subsubsection.6.16.2.1) 2602 0 R (subsubsection.6.16.2.2) 2604 0 R (subsubsection.6.17.2.1) 2671 0 R (subsubsection.6.17.2.10) 2727 0 R (subsubsection.6.17.2.11) 2730 0 R (subsubsection.6.17.2.12) 2739 0 R (subsubsection.6.17.2.13) 2742 0 R (subsubsection.6.17.2.14) 2746 0 R (subsubsection.6.17.2.2) 2689 0 R (subsubsection.6.17.2.3) 2693 0 R (subsubsection.6.17.2.4) 2695 0 R (subsubsection.6.17.2.5) 2698 0 R (subsubsection.6.17.2.6) 2708 0 R (subsubsection.6.17.2.7) 2713 0 R (subsubsection.6.17.2.8) 2716 0 R (subsubsection.6.17.2.9) 2724 0 R (subsubsection.6.18.2.1) 2794 0 R (subsubsection.6.18.3.1) 2800 0 R (subsubsection.6.18.3.2) 2805 0 R (subsubsection.6.18.3.3) 2815 0 R (subsubsection.6.19.2.1) 2864 0 R (subsubsection.6.19.2.2) 2868 0 R (subsubsection.6.19.2.3) 2872 0 R (subsubsection.6.19.2.4) 2876 0 R (subsubsection.6.19.2.5) 2886 0 R (subsubsection.6.20.2.1) 2936 0 R (subsubsection.6.20.2.2) 2937 0 R (subsubsection.6.20.2.3) 2940 0 R (subsubsection.6.21.2.1) 3014 0 R (subsubsection.6.21.2.2) 3017 0 R (subsubsection.6.21.2.3) 3026 0 R (subsubsection.6.21.2.4) 3028 0 R (subsubsection.6.21.2.5) 3030 0 R (subsubsection.6.23.2.1) 3129 0 R (subsubsection.6.23.2.10) 3188 0 R (subsubsection.6.23.2.2) 3142 0 R (subsubsection.6.23.2.3) 3145 0 R (subsubsection.6.23.2.4) 3148 0 R (subsubsection.6.23.2.5) 3156 0 R (subsubsection.6.23.2.6) 3160 0 R (subsubsection.6.23.2.7) 3173 0 R (subsubsection.6.23.2.8) 3177 0 R (subsubsection.6.23.2.9) 3180 0 R (subsubsection.6.24.2.1) 3235 0 R (subsubsection.6.24.3.1) 3237 0 R (subsubsection.6.3.2.1) 1337 0 R (subsubsection.6.3.2.2) 1339 0 R (subsubsection.6.3.2.3) 1350 0 R (subsubsection.6.3.2.4) 1351 0 R (subsubsection.6.3.2.5) 1353 0 R (subsubsection.6.3.2.6) 1355 0 R (subsubsection.6.3.2.7) 1364 0 R (subsubsection.6.4.2.1) 1379 0 R (subsubsection.6.4.2.2) 1383 0 R (subsubsection.6.5.2.1) 1405 0 R (subsubsection.6.5.2.2) 1418 0 R (subsubsection.6.5.2.3) 1427 0 R (subsubsection.6.5.2.4) 1431 0 R (subsubsection.6.5.2.5) 1434 0 R (subsubsection.6.5.2.6) 1445 0 R (subsubsection.6.5.3.1) 1450 0 R (subsubsection.6.6.2.1) 1513 0 R (subsubsection.6.6.2.10) 1564 0 R (subsubsection.6.6.2.11) 1575 0 R (subsubsection.6.6.2.12) 1577 0 R (subsubsection.6.6.2.13) 1581 0 R (subsubsection.6.6.2.14) 1582 0 R (subsubsection.6.6.2.15) 1590 0 R (subsubsection.6.6.2.16) 1593 0 R (subsubsection.6.6.2.17) 1596 0 R (subsubsection.6.6.2.18) 1598 0 R (subsubsection.6.6.2.19) 1603 0 R (subsubsection.6.6.2.2) 1526 0 R (subsubsection.6.6.2.3) 1530 0 R (subsubsection.6.6.2.4) 1533 0 R (subsubsection.6.6.2.5) 1535 0 R (subsubsection.6.6.2.6) 1545 0 R (subsubsection.6.6.2.7) 1551 0 R (subsubsection.6.6.2.8) 1555 0 R (subsubsection.6.6.2.9) 1559 0 R (subsubsection.6.6.3.1) 1605 0 R (subsubsection.6.6.3.2) 1615 0 R (subsubsection.6.6.3.3) 1627 0 R (subsubsection.6.6.3.4) 1633 0 R (subsubsection.6.6.3.5) 1646 0 R (subsubsection.6.7.2.1) 1689 0 R (subsubsection.6.7.2.10) 1725 0 R (subsubsection.6.7.2.11) 1726 0 R (subsubsection.6.7.2.2) 1696 0 R (subsubsection.6.7.2.3) 1697 0 R (subsubsection.6.7.2.4) 1706 0 R (subsubsection.6.7.2.5) 1708 0 R (subsubsection.6.7.2.6) 1710 0 R (subsubsection.6.7.2.7) 1716 0 R (subsubsection.6.7.2.8) 1718 0 R (subsubsection.6.7.2.9) 1719 0 R (subsubsection.6.7.3.1) 1732 0 R (subsubsection.6.8.2.1) 1749 0 R (subsubsection.6.9.2.1) 2053 0 R (subsubsection.6.9.3.1) 2061 0 R (subsubsection.6.9.3.10) 2105 0 R (subsubsection.6.9.3.11) 2107 0 R (subsubsection.6.9.3.12) 2114 0 R (subsubsection.6.9.3.13) 2120 0 R (subsubsection.6.9.3.2) 2065 0 R (subsubsection.6.9.3.3) 2068 0 R (subsubsection.6.9.3.4) 2077 0 R (subsubsection.6.9.3.5) 2085 0 R (subsubsection.6.9.3.6) 2086 0 R (subsubsection.6.9.3.7) 2092 0 R (subsubsection.6.9.3.8) 2096 0 R (subsubsection.6.9.3.9) 2099 0 R (subsubsection.6.9.4.1) 2125 0 R (subsubsection.6.9.4.2) 2128 0 R (subsubsection.6.9.4.3) 2135 0 R (subsubsection.6.9.4.4) 2142 0 R (subsubsection.6.9.4.5) 2146 0 R (subsubsection.6.9.4.6) 2153 0 R (subsubsection.6.9.4.7) 2156 0 R] +/Limits [(Doc-Start) (subsubsection.6.9.4.7)] +>> endobj +5671 0 obj << +/Kids [5670 0 R] +>> endobj +5672 0 obj << +/Dests 5671 0 R +>> endobj +5673 0 obj << +/Type /Catalog +/Pages 5668 0 R +/Outlines 5669 0 R +/Names 5672 0 R +/PageMode /UseOutlines +/OpenAction 473 0 R +>> endobj +5674 0 obj << +/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfeTeX-1.21a)/Keywords() +/CreationDate (D:20060612102335+02'00') +/PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) +>> endobj +xref +0 5675 +0000000001 65535 f +0000000002 00000 f +0000000003 00000 f +0000000004 00000 f +0000000000 00000 f +0000000009 00000 n +0000050642 00000 n +0001261026 00000 n +0000000054 00000 n +0000000093 00000 n +0000050814 00000 n +0001260954 00000 n +0000000140 00000 n +0000000171 00000 n +0000054400 00000 n +0001260868 00000 n +0000000219 00000 n +0000000258 00000 n +0000054521 00000 n +0001260782 00000 n +0000000306 00000 n +0000000342 00000 n +0000058977 00000 n +0001260696 00000 n +0000000390 00000 n +0000000440 00000 n +0000059339 00000 n +0001260610 00000 n +0000000488 00000 n +0000000524 00000 n +0000063433 00000 n +0001260524 00000 n +0000000572 00000 n +0000000628 00000 n +0000080583 00000 n +0001260438 00000 n +0000000676 00000 n +0000000703 00000 n +0000102655 00000 n +0001260352 00000 n +0000000751 00000 n +0000000794 00000 n +0000110315 00000 n +0001260279 00000 n +0000000842 00000 n +0000000872 00000 n +0000119269 00000 n +0001260154 00000 n +0000000918 00000 n +0000000957 00000 n +0000119326 00000 n +0001260093 00000 n +0000001005 00000 n +0000001039 00000 n +0000125101 00000 n +0001259967 00000 n +0000001085 00000 n +0000001130 00000 n +0000125158 00000 n +0001259906 00000 n +0000001178 00000 n +0000001220 00000 n +0000134932 00000 n +0001259780 00000 n +0000001266 00000 n +0000001313 00000 n +0000134989 00000 n +0001259719 00000 n +0000001361 00000 n +0000001403 00000 n +0000147442 00000 n +0001259593 00000 n +0000001449 00000 n +0000001486 00000 n +0000147500 00000 n +0001259532 00000 n +0000001534 00000 n +0000001570 00000 n +0000154678 00000 n +0001259403 00000 n +0000001616 00000 n +0000001663 00000 n +0000154795 00000 n +0001259329 00000 n +0000001711 00000 n +0000001742 00000 n +0000193044 00000 n +0001259242 00000 n +0000001790 00000 n +0000001821 00000 n +0000196930 00000 n +0001259155 00000 n +0000001869 00000 n +0000001915 00000 n +0000205317 00000 n +0001259068 00000 n +0000001963 00000 n +0000002010 00000 n +0000210149 00000 n +0001258979 00000 n +0000002058 00000 n +0000002105 00000 n +0000228508 00000 n +0001258888 00000 n +0000002154 00000 n +0000002199 00000 n +0000271738 00000 n +0001258796 00000 n +0000002248 00000 n +0000002292 00000 n +0000288517 00000 n +0001258704 00000 n +0000002341 00000 n +0000002397 00000 n +0000293232 00000 n +0001258612 00000 n +0000002446 00000 n +0000002486 00000 n +0000377976 00000 n +0001258520 00000 n +0000002536 00000 n +0000002591 00000 n +0000387992 00000 n +0001258428 00000 n +0000002641 00000 n +0000002692 00000 n +0000399293 00000 n +0001258336 00000 n +0000002742 00000 n +0000002791 00000 n +0000440708 00000 n +0001258244 00000 n +0000002841 00000 n +0000002892 00000 n +0000446093 00000 n +0001258152 00000 n +0000002942 00000 n +0000002981 00000 n +0000451263 00000 n +0001258060 00000 n +0000003031 00000 n +0000003064 00000 n +0000462282 00000 n +0001257968 00000 n +0000003114 00000 n +0000003149 00000 n +0000468114 00000 n +0001257876 00000 n +0000003199 00000 n +0000003239 00000 n +0000502385 00000 n +0001257784 00000 n +0000003289 00000 n +0000003342 00000 n +0000517178 00000 n +0001257692 00000 n +0000003392 00000 n +0000003424 00000 n +0000531752 00000 n +0001257600 00000 n +0000003474 00000 n +0000003512 00000 n +0000543323 00000 n +0001257508 00000 n +0000003562 00000 n +0000003595 00000 n +0000554956 00000 n +0001257416 00000 n +0000003645 00000 n +0000003677 00000 n +0000563002 00000 n +0001257324 00000 n +0000003727 00000 n +0000003757 00000 n +0000590334 00000 n +0001257246 00000 n +0000003807 00000 n +0000003837 00000 n +0000600208 00000 n +0001257113 00000 n +0000003884 00000 n +0000003940 00000 n +0000600326 00000 n +0001257034 00000 n +0000003989 00000 n +0000004040 00000 n +0000603631 00000 n +0001256941 00000 n +0000004089 00000 n +0000004149 00000 n +0000605400 00000 n +0001256848 00000 n +0000004198 00000 n +0000004255 00000 n +0000609814 00000 n +0001256755 00000 n +0000004304 00000 n +0000004355 00000 n +0000612585 00000 n +0001256662 00000 n +0000004404 00000 n +0000004455 00000 n +0000618018 00000 n +0001256569 00000 n +0000004504 00000 n +0000004546 00000 n +0000620396 00000 n +0001256476 00000 n +0000004595 00000 n +0000004644 00000 n +0000622307 00000 n +0001256383 00000 n +0000004693 00000 n +0000004732 00000 n +0000627362 00000 n +0001256290 00000 n +0000004781 00000 n +0000004831 00000 n +0000631195 00000 n +0001256197 00000 n +0000004881 00000 n +0000004934 00000 n +0000634149 00000 n +0001256104 00000 n +0000004984 00000 n +0000005026 00000 n +0000641477 00000 n +0001256011 00000 n +0000005076 00000 n +0000005124 00000 n +0000646798 00000 n +0001255918 00000 n +0000005174 00000 n +0000005229 00000 n +0000649327 00000 n +0001255825 00000 n +0000005279 00000 n +0000005333 00000 n +0000657364 00000 n +0001255732 00000 n +0000005383 00000 n +0000005440 00000 n +0000659751 00000 n +0001255639 00000 n +0000005490 00000 n +0000005550 00000 n +0000668586 00000 n +0001255546 00000 n +0000005600 00000 n +0000005649 00000 n +0000685418 00000 n +0001255453 00000 n +0000005699 00000 n +0000005755 00000 n +0000690785 00000 n +0001255360 00000 n +0000005805 00000 n +0000005860 00000 n +0000698518 00000 n +0001255267 00000 n +0000005910 00000 n +0000005966 00000 n +0000705116 00000 n +0001255188 00000 n +0000006016 00000 n +0000006071 00000 n +0000708522 00000 n +0001255054 00000 n +0000006118 00000 n +0000006164 00000 n +0000708641 00000 n +0001254975 00000 n +0000006213 00000 n +0000006278 00000 n +0000711484 00000 n +0001254882 00000 n +0000006327 00000 n +0000006392 00000 n +0000720157 00000 n +0001254789 00000 n +0000006441 00000 n +0000006496 00000 n +0000727972 00000 n +0001254696 00000 n +0000006545 00000 n +0000006600 00000 n +0000735780 00000 n +0001254603 00000 n +0000006649 00000 n +0000006700 00000 n +0000740603 00000 n +0001254510 00000 n +0000006749 00000 n +0000006800 00000 n +0000745469 00000 n +0001254417 00000 n +0000006849 00000 n +0000006904 00000 n +0000749092 00000 n +0001254324 00000 n +0000006953 00000 n +0000007008 00000 n +0000756051 00000 n +0001254231 00000 n +0000007057 00000 n +0000007114 00000 n +0000759655 00000 n +0001254138 00000 n +0000007164 00000 n +0000007221 00000 n +0000766391 00000 n +0001254045 00000 n +0000007271 00000 n +0000007332 00000 n +0000773837 00000 n +0001253952 00000 n +0000007382 00000 n +0000007443 00000 n +0000779421 00000 n +0001253859 00000 n +0000007493 00000 n +0000007554 00000 n +0000782070 00000 n +0001253766 00000 n +0000007604 00000 n +0000007665 00000 n +0000786980 00000 n +0001253673 00000 n +0000007715 00000 n +0000007772 00000 n +0000791134 00000 n +0001253580 00000 n +0000007822 00000 n +0000007867 00000 n +0000796289 00000 n +0001253487 00000 n +0000007917 00000 n +0000007962 00000 n +0000800130 00000 n +0001253394 00000 n +0000008012 00000 n +0000008066 00000 n +0000804148 00000 n +0001253301 00000 n +0000008116 00000 n +0000008166 00000 n +0000805832 00000 n +0001253208 00000 n +0000008216 00000 n +0000008259 00000 n +0000812562 00000 n +0001253115 00000 n +0000008309 00000 n +0000008355 00000 n +0000823125 00000 n +0001253022 00000 n +0000008405 00000 n +0000008448 00000 n +0000832696 00000 n +0001252929 00000 n +0000008498 00000 n +0000008544 00000 n +0000836815 00000 n +0001252836 00000 n +0000008594 00000 n +0000008640 00000 n +0000841704 00000 n +0001252743 00000 n +0000008690 00000 n +0000008743 00000 n +0000846631 00000 n +0001252650 00000 n +0000008793 00000 n +0000008846 00000 n +0000849074 00000 n +0001252557 00000 n +0000008896 00000 n +0000008946 00000 n +0000859493 00000 n +0001252464 00000 n +0000008996 00000 n +0000009040 00000 n +0000881877 00000 n +0001252371 00000 n +0000009090 00000 n +0000009134 00000 n +0000929043 00000 n +0001252278 00000 n +0000009184 00000 n +0000009236 00000 n +0000934010 00000 n +0001252185 00000 n +0000009286 00000 n +0000009337 00000 n +0000939281 00000 n +0001252092 00000 n +0000009387 00000 n +0000009438 00000 n +0000943710 00000 n +0001251999 00000 n +0000009488 00000 n +0000009535 00000 n +0000958897 00000 n +0001251920 00000 n +0000009585 00000 n +0000009635 00000 n +0000961041 00000 n +0001251800 00000 n +0000009682 00000 n +0000009731 00000 n +0000961160 00000 n +0001251721 00000 n +0000009780 00000 n +0000009807 00000 n +0000971633 00000 n +0001251628 00000 n +0000009856 00000 n +0000009883 00000 n +0000974077 00000 n +0001251535 00000 n +0000009932 00000 n +0000009979 00000 n +0000976886 00000 n +0001251442 00000 n +0000010028 00000 n +0000010078 00000 n +0000979044 00000 n +0001251349 00000 n +0000010127 00000 n +0000010160 00000 n +0000982262 00000 n +0001251256 00000 n +0000010209 00000 n +0000010242 00000 n +0000984732 00000 n +0001251163 00000 n +0000010291 00000 n +0000010319 00000 n +0000998489 00000 n +0001251070 00000 n +0000010368 00000 n +0000010396 00000 n +0001001910 00000 n +0001250977 00000 n +0000010445 00000 n +0000010471 00000 n +0001008669 00000 n +0001250884 00000 n +0000010521 00000 n +0000010547 00000 n +0001012312 00000 n +0001250791 00000 n +0000010597 00000 n +0000010626 00000 n +0001021683 00000 n +0001250698 00000 n +0000010676 00000 n +0000010705 00000 n +0001024927 00000 n +0001250605 00000 n +0000010755 00000 n +0000010791 00000 n +0001029296 00000 n +0001250512 00000 n +0000010841 00000 n +0000010871 00000 n +0001034310 00000 n +0001250419 00000 n +0000010921 00000 n +0000010952 00000 n +0001046200 00000 n +0001250340 00000 n +0000011002 00000 n +0000011033 00000 n +0000011547 00000 n +0000011669 00000 n +0000016126 00000 n +0000011085 00000 n +0000016010 00000 n +0000016068 00000 n +0001242506 00000 n +0001222170 00000 n +0001242331 00000 n +0001221173 00000 n +0001200724 00000 n +0001221000 00000 n +0001243568 00000 n +0000015772 00000 n +0000015908 00000 n +0000015988 00000 n +0000016558 00000 n +0000016378 00000 n +0000016239 00000 n +0000016500 00000 n +0000022817 00000 n +0000018502 00000 n +0000016599 00000 n +0001199754 00000 n +0001181745 00000 n +0001199579 00000 n +0000022759 00000 n +0000018836 00000 n +0000018990 00000 n +0000019148 00000 n +0000019305 00000 n +0000019463 00000 n +0000019621 00000 n +0000019779 00000 n +0000019937 00000 n +0000020095 00000 n +0000020253 00000 n +0000020411 00000 n +0000020565 00000 n +0000020723 00000 n +0000020877 00000 n +0000021035 00000 n +0000021189 00000 n +0000021347 00000 n +0000021502 00000 n +0000021660 00000 n +0000021815 00000 n +0000021973 00000 n +0000022130 00000 n +0000022287 00000 n +0000022445 00000 n +0000022603 00000 n +0000031940 00000 n +0000025826 00000 n +0000022902 00000 n +0000026248 00000 n +0000026406 00000 n +0000026564 00000 n +0000026722 00000 n +0000026879 00000 n +0000027036 00000 n +0000027195 00000 n +0000027354 00000 n +0000027512 00000 n +0000027671 00000 n +0000027830 00000 n +0000027989 00000 n +0000028148 00000 n +0000028305 00000 n +0000028464 00000 n +0000028622 00000 n +0000028780 00000 n +0000028939 00000 n +0000029098 00000 n +0000029253 00000 n +0000029409 00000 n +0000029566 00000 n +0000029724 00000 n +0000029882 00000 n +0000030039 00000 n +0000030197 00000 n +0000030355 00000 n +0000030512 00000 n +0000030670 00000 n +0000030829 00000 n +0000030988 00000 n +0000031147 00000 n +0000031306 00000 n +0000031465 00000 n +0000031624 00000 n +0000031783 00000 n +0000040835 00000 n +0000034654 00000 n +0000032025 00000 n +0000040777 00000 n +0000035076 00000 n +0000035235 00000 n +0000035394 00000 n +0000035552 00000 n +0000035710 00000 n +0000035865 00000 n +0000036023 00000 n +0000036181 00000 n +0000036338 00000 n +0000036496 00000 n +0000036654 00000 n +0000036812 00000 n +0000036970 00000 n +0000037128 00000 n +0000037286 00000 n +0000037445 00000 n +0000037604 00000 n +0000037763 00000 n +0000037922 00000 n +0000038080 00000 n +0000038237 00000 n +0000038395 00000 n +0000038553 00000 n +0000038712 00000 n +0000038871 00000 n +0000039030 00000 n +0000039189 00000 n +0000039348 00000 n +0000039507 00000 n +0000039666 00000 n +0000039825 00000 n +0000039984 00000 n +0000040143 00000 n +0000040302 00000 n +0000040461 00000 n +0000040620 00000 n +0000046161 00000 n +0000042649 00000 n +0000040920 00000 n +0000046103 00000 n +0000042943 00000 n +0000043102 00000 n +0000043261 00000 n +0000043420 00000 n +0000043575 00000 n +0000043732 00000 n +0000043889 00000 n +0000044045 00000 n +0000044203 00000 n +0000044360 00000 n +0000044518 00000 n +0000044676 00000 n +0000044834 00000 n +0000044992 00000 n +0000045151 00000 n +0000045309 00000 n +0000045468 00000 n +0000045627 00000 n +0000045785 00000 n +0000045944 00000 n +0000050870 00000 n +0000048686 00000 n +0000046246 00000 n +0000050698 00000 n +0000048908 00000 n +0001181090 00000 n +0001179151 00000 n +0001180927 00000 n +0000049085 00000 n +0000049266 00000 n +0000049419 00000 n +0000049572 00000 n +0000049725 00000 n +0000049877 00000 n +0000050030 00000 n +0000050183 00000 n +0000050336 00000 n +0000050489 00000 n +0000050756 00000 n +0001243686 00000 n +0000192985 00000 n +0000399234 00000 n +0000196871 00000 n +0000205258 00000 n +0000210090 00000 n +0000288458 00000 n +0000228449 00000 n +0000468055 00000 n +0000154736 00000 n +0000054578 00000 n +0000054214 00000 n +0000050981 00000 n +0000054336 00000 n +0000054457 00000 n +0000059396 00000 n +0000057806 00000 n +0000054663 00000 n +0000057980 00000 n +0000058165 00000 n +0000058913 00000 n +0000059034 00000 n +0000059098 00000 n +0000058352 00000 n +0000058539 00000 n +0000059155 00000 n +0000059219 00000 n +0000058726 00000 n +0000059276 00000 n +0000210507 00000 n +0000213343 00000 n +0000352804 00000 n +0000357012 00000 n +0000348138 00000 n +0000063606 00000 n +0000062916 00000 n +0000059481 00000 n +0000063370 00000 n +0000063066 00000 n +0000063218 00000 n +0000063490 00000 n +0000063548 00000 n +0000069322 00000 n +0000067224 00000 n +0000063691 00000 n +0000068779 00000 n +0000068837 00000 n +0000068901 00000 n +0000067422 00000 n +0000068957 00000 n +0000069021 00000 n +0000067609 00000 n +0000067762 00000 n +0000067915 00000 n +0000068068 00000 n +0001178798 00000 n +0001176803 00000 n +0001178635 00000 n +0000069078 00000 n +0000069142 00000 n +0000068220 00000 n +0000068407 00000 n +0000068594 00000 n +0000069200 00000 n +0000069264 00000 n +0000418407 00000 n +0000641418 00000 n +0000244942 00000 n +0000244692 00000 n +0000075888 00000 n +0000072812 00000 n +0000069420 00000 n +0000075284 00000 n +0000073042 00000 n +0000073229 00000 n +0000073416 00000 n +0000073603 00000 n +0000075342 00000 n +0000075406 00000 n +0000073789 00000 n +0000073976 00000 n +0000075463 00000 n +0000075527 00000 n +0000074163 00000 n +0000074350 00000 n +0000074537 00000 n +0000075585 00000 n +0000075649 00000 n +0000074724 00000 n +0000074910 00000 n +0000075706 00000 n +0000075768 00000 n +0000075097 00000 n +0000075826 00000 n +0000244817 00000 n +0000263016 00000 n +0000249100 00000 n +0000239531 00000 n +0000235785 00000 n +0000239656 00000 n +0000239280 00000 n +0000249349 00000 n +0000245067 00000 n +0000080761 00000 n +0000078469 00000 n +0000075973 00000 n +0000080287 00000 n +0000080345 00000 n +0000078675 00000 n +0000078862 00000 n +0000079049 00000 n +0000080403 00000 n +0000080467 00000 n +0000079202 00000 n +0000079389 00000 n +0000079576 00000 n +0000079727 00000 n +0000079914 00000 n +0000080100 00000 n +0000080525 00000 n +0000080640 00000 n +0000080704 00000 n +0001243804 00000 n +0000257346 00000 n +0000239781 00000 n +0000257227 00000 n +0000276318 00000 n +0000085379 00000 n +0000083929 00000 n +0000080859 00000 n +0000085199 00000 n +0000084111 00000 n +0000084298 00000 n +0000084485 00000 n +0000084672 00000 n +0000084859 00000 n +0000085257 00000 n +0000085321 00000 n +0000085046 00000 n +0000087042 00000 n +0000086689 00000 n +0000085477 00000 n +0000086811 00000 n +0000086869 00000 n +0000086927 00000 n +0000086985 00000 n +0000090294 00000 n +0000089340 00000 n +0000087140 00000 n +0000090056 00000 n +0000090114 00000 n +0000089498 00000 n +0000089683 00000 n +0000089869 00000 n +0000090172 00000 n +0000090236 00000 n +0000249225 00000 n +0000248975 00000 n +0000093049 00000 n +0000092347 00000 n +0000090392 00000 n +0000092871 00000 n +0000092497 00000 n +0000092684 00000 n +0000092929 00000 n +0000092992 00000 n +0000096038 00000 n +0000095069 00000 n +0000093160 00000 n +0000095980 00000 n +0000095235 00000 n +0000095422 00000 n +0000095607 00000 n +0000095794 00000 n +0000099558 00000 n +0000098914 00000 n +0000096136 00000 n +0000099438 00000 n +0000099064 00000 n +0000099251 00000 n +0000099496 00000 n +0001243922 00000 n +0000103257 00000 n +0000102475 00000 n +0000099669 00000 n +0000102597 00000 n +0000102712 00000 n +0000102776 00000 n +0000102833 00000 n +0000102897 00000 n +0000102955 00000 n +0000103017 00000 n +0000103074 00000 n +0000103138 00000 n +0000103195 00000 n +0000106861 00000 n +0000106140 00000 n +0000103342 00000 n +0000106262 00000 n +0000106320 00000 n +0000106378 00000 n +0000106437 00000 n +0000106495 00000 n +0000106559 00000 n +0000106617 00000 n +0000106681 00000 n +0000106739 00000 n +0000106803 00000 n +0000110372 00000 n +0000109706 00000 n +0000106946 00000 n +0000109828 00000 n +0000109886 00000 n +0000109950 00000 n +0000110008 00000 n +0000110072 00000 n +0000110129 00000 n +0000110193 00000 n +0000110251 00000 n +0000112698 00000 n +0000112396 00000 n +0000110457 00000 n +0000112518 00000 n +0000112576 00000 n +0000112640 00000 n +0000113323 00000 n +0000113143 00000 n +0000112783 00000 n +0000113265 00000 n +0000119383 00000 n +0000115083 00000 n +0000113395 00000 n +0000119211 00000 n +0000115409 00000 n +0000115567 00000 n +0000115726 00000 n +0000115884 00000 n +0000116043 00000 n +0000116202 00000 n +0000116361 00000 n +0000116520 00000 n +0000116678 00000 n +0000116837 00000 n +0000116995 00000 n +0000117153 00000 n +0000117311 00000 n +0000117469 00000 n +0000117626 00000 n +0000117784 00000 n +0000117941 00000 n +0000118100 00000 n +0000118259 00000 n +0000118418 00000 n +0000118577 00000 n +0000118736 00000 n +0000118895 00000 n +0000119052 00000 n +0001244040 00000 n +0000120004 00000 n +0000119824 00000 n +0000119468 00000 n +0000119946 00000 n +0000125215 00000 n +0000121416 00000 n +0000120076 00000 n +0000125043 00000 n +0000121718 00000 n +0000121876 00000 n +0000122034 00000 n +0000122192 00000 n +0000122350 00000 n +0000122508 00000 n +0000122665 00000 n +0000122823 00000 n +0000122980 00000 n +0000123138 00000 n +0000123297 00000 n +0000123456 00000 n +0000123614 00000 n +0000123773 00000 n +0000123931 00000 n +0000124090 00000 n +0000124249 00000 n +0000124408 00000 n +0000124566 00000 n +0000124725 00000 n +0000124884 00000 n +0000125847 00000 n +0000125667 00000 n +0000125300 00000 n +0000125789 00000 n +0000135046 00000 n +0000127872 00000 n +0000125919 00000 n +0000134874 00000 n +0000128342 00000 n +0000128495 00000 n +0000128653 00000 n +0000128805 00000 n +0000128963 00000 n +0000129115 00000 n +0000129273 00000 n +0000129426 00000 n +0000129584 00000 n +0000129737 00000 n +0000129895 00000 n +0000130047 00000 n +0000130204 00000 n +0000130357 00000 n +0000130515 00000 n +0000130668 00000 n +0000130825 00000 n +0000130978 00000 n +0000131136 00000 n +0000131289 00000 n +0000131448 00000 n +0000131601 00000 n +0000131760 00000 n +0000131912 00000 n +0000132070 00000 n +0000132223 00000 n +0000132382 00000 n +0000132535 00000 n +0000132693 00000 n +0000132846 00000 n +0000133005 00000 n +0000133158 00000 n +0000133317 00000 n +0000133469 00000 n +0000133627 00000 n +0000133780 00000 n +0000133939 00000 n +0000134092 00000 n +0000134250 00000 n +0000134403 00000 n +0000134562 00000 n +0000134715 00000 n +0000600267 00000 n +0000603572 00000 n +0000605341 00000 n +0000609755 00000 n +0000612526 00000 n +0000617959 00000 n +0000620337 00000 n +0000622248 00000 n +0000627303 00000 n +0000631136 00000 n +0000634090 00000 n +0000646739 00000 n +0000649268 00000 n +0000657305 00000 n +0000659692 00000 n +0000668526 00000 n +0000685358 00000 n +0000690725 00000 n +0000698458 00000 n +0000705056 00000 n +0000135684 00000 n +0000135499 00000 n +0000135131 00000 n +0000135624 00000 n +0000147558 00000 n +0000138967 00000 n +0000135757 00000 n +0000147382 00000 n +0000139555 00000 n +0000139708 00000 n +0000139867 00000 n +0000140021 00000 n +0000140180 00000 n +0000140334 00000 n +0000140493 00000 n +0000140647 00000 n +0000140805 00000 n +0000140959 00000 n +0000141118 00000 n +0000141272 00000 n +0000141431 00000 n +0000141585 00000 n +0000141744 00000 n +0000141897 00000 n +0000142055 00000 n +0000142208 00000 n +0000142367 00000 n +0000142521 00000 n +0000142681 00000 n +0000142835 00000 n +0000142994 00000 n +0000143148 00000 n +0000143308 00000 n +0000143462 00000 n +0000143622 00000 n +0000143776 00000 n +0000143936 00000 n +0000144090 00000 n +0000144250 00000 n +0000144404 00000 n +0000144564 00000 n +0000144718 00000 n +0000144877 00000 n +0000145031 00000 n +0000145191 00000 n +0000145344 00000 n +0000145503 00000 n +0000145655 00000 n +0000145815 00000 n +0000145969 00000 n +0000146128 00000 n +0000146282 00000 n +0000146442 00000 n +0000146595 00000 n +0000146755 00000 n +0000146909 00000 n +0000147069 00000 n +0000147223 00000 n +0001244159 00000 n +0000708581 00000 n +0000711424 00000 n +0000720097 00000 n +0000727912 00000 n +0000735720 00000 n +0000740543 00000 n +0000745409 00000 n +0000749032 00000 n +0000755991 00000 n +0000759595 00000 n +0000766331 00000 n +0000773777 00000 n +0000779361 00000 n +0000782010 00000 n +0000786920 00000 n +0000791074 00000 n +0000796229 00000 n +0000800070 00000 n +0000804088 00000 n +0000805772 00000 n +0000812502 00000 n +0000823065 00000 n +0000832636 00000 n +0000836755 00000 n +0000841644 00000 n +0000152463 00000 n +0000149284 00000 n +0000147644 00000 n +0000152403 00000 n +0000149584 00000 n +0000149738 00000 n +0000149898 00000 n +0000150051 00000 n +0000150211 00000 n +0000150363 00000 n +0000150522 00000 n +0000150676 00000 n +0000150836 00000 n +0000150990 00000 n +0000151150 00000 n +0000151304 00000 n +0000151464 00000 n +0000151618 00000 n +0000151776 00000 n +0000151930 00000 n +0000152090 00000 n +0000152243 00000 n +0000846571 00000 n +0000849014 00000 n +0000859433 00000 n +0000881817 00000 n +0000928983 00000 n +0000933950 00000 n +0000939221 00000 n +0000943650 00000 n +0000958837 00000 n +0000154913 00000 n +0000154492 00000 n +0000152549 00000 n +0000154618 00000 n +0000154853 00000 n +0000160237 00000 n +0000157887 00000 n +0000154999 00000 n +0000159925 00000 n +0000158115 00000 n +0000158303 00000 n +0000158491 00000 n +0000158679 00000 n +0000158867 00000 n +0000159054 00000 n +0000159241 00000 n +0000159428 00000 n +0000159985 00000 n +0000160051 00000 n +0000159581 00000 n +0000159753 00000 n +0000160111 00000 n +0000160177 00000 n +0000179694 00000 n +0000175554 00000 n +0000186461 00000 n +0000175674 00000 n +0000186586 00000 n +0000182836 00000 n +0000164053 00000 n +0000162923 00000 n +0000160349 00000 n +0000163384 00000 n +0000163444 00000 n +0000163510 00000 n +0000163570 00000 n +0000163629 00000 n +0000163689 00000 n +0000163755 00000 n +0000163079 00000 n +0000163815 00000 n +0000163873 00000 n +0000163933 00000 n +0000163993 00000 n +0000163233 00000 n +0000446033 00000 n +0000169637 00000 n +0000166048 00000 n +0000164139 00000 n +0000169220 00000 n +0001175964 00000 n +0001158689 00000 n +0001175783 00000 n +0000169280 00000 n +0000166339 00000 n +0000169340 00000 n +0000166493 00000 n +0000169399 00000 n +0000166647 00000 n +0000166835 00000 n +0000169457 00000 n +0000166989 00000 n +0000167177 00000 n +0000167365 00000 n +0000167518 00000 n +0000167706 00000 n +0000169517 00000 n +0000167860 00000 n +0000168047 00000 n +0000168200 00000 n +0000168386 00000 n +0000169577 00000 n +0000168538 00000 n +0000168726 00000 n +0000168880 00000 n +0000169067 00000 n +0000182711 00000 n +0000182585 00000 n +0000175738 00000 n +0000171876 00000 n +0000169737 00000 n +0000174956 00000 n +0000175016 00000 n +0000172158 00000 n +0000172346 00000 n +0000172500 00000 n +0000172688 00000 n +0000175076 00000 n +0000172842 00000 n +0000175136 00000 n +0000173030 00000 n +0000173218 00000 n +0000173372 00000 n +0000173559 00000 n +0000175195 00000 n +0000175255 00000 n +0000173712 00000 n +0000175315 00000 n +0000173900 00000 n +0000175375 00000 n +0000174087 00000 n +0000175434 00000 n +0000174275 00000 n +0000175494 00000 n +0000175614 00000 n +0000174462 00000 n +0000174614 00000 n +0001158068 00000 n +0001147348 00000 n +0001157887 00000 n +0000174802 00000 n +0001244284 00000 n +0000179820 00000 n +0000179568 00000 n +0000182460 00000 n +0000186712 00000 n +0000188422 00000 n +0000961100 00000 n +0000179945 00000 n +0000177550 00000 n +0000175852 00000 n +0000179448 00000 n +0000179508 00000 n +0000177778 00000 n +0000177931 00000 n +0000178118 00000 n +0000179634 00000 n +0000178272 00000 n +0000179760 00000 n +0000178426 00000 n +0000178580 00000 n +0000178768 00000 n +0000179885 00000 n +0000178922 00000 n +0000179075 00000 n +0000179263 00000 n +0000182900 00000 n +0000181610 00000 n +0000180045 00000 n +0000182400 00000 n +0000181784 00000 n +0000182526 00000 n +0000182651 00000 n +0000181938 00000 n +0000182777 00000 n +0000182092 00000 n +0000182246 00000 n +0001001850 00000 n +0000186838 00000 n +0000184801 00000 n +0000183000 00000 n +0000186341 00000 n +0000186401 00000 n +0000185011 00000 n +0000185165 00000 n +0000185353 00000 n +0000186527 00000 n +0000185541 00000 n +0000185695 00000 n +0000186652 00000 n +0000185849 00000 n +0000186001 00000 n +0000186778 00000 n +0000186188 00000 n +0000188548 00000 n +0000187898 00000 n +0000186938 00000 n +0000188362 00000 n +0000188054 00000 n +0000188488 00000 n +0000188208 00000 n +0000193522 00000 n +0000190467 00000 n +0000188648 00000 n +0000192925 00000 n +0000193102 00000 n +0000193162 00000 n +0000190722 00000 n +0000190876 00000 n +0000191030 00000 n +0000191183 00000 n +0000191337 00000 n +0000191491 00000 n +0000191644 00000 n +0000193222 00000 n +0000193282 00000 n +0000191797 00000 n +0000193342 00000 n +0000191985 00000 n +0000193402 00000 n +0000192173 00000 n +0000192361 00000 n +0000193462 00000 n +0000192549 00000 n +0000192737 00000 n +0000517118 00000 n +0000531692 00000 n +0000543263 00000 n +0000554896 00000 n +0000562942 00000 n +0000590274 00000 n +0000434357 00000 n +0000197412 00000 n +0000195297 00000 n +0000193622 00000 n +0000196811 00000 n +0000196988 00000 n +0000197048 00000 n +0000195498 00000 n +0000195684 00000 n +0000195871 00000 n +0000196059 00000 n +0000196247 00000 n +0000196435 00000 n +0000196623 00000 n +0000197108 00000 n +0000197168 00000 n +0000197227 00000 n +0000197286 00000 n +0000197352 00000 n +0001244409 00000 n +0000200040 00000 n +0000199788 00000 n +0000202437 00000 n +0000199664 00000 n +0000199914 00000 n +0000200166 00000 n +0000199106 00000 n +0000197526 00000 n +0000199604 00000 n +0000199730 00000 n +0000199854 00000 n +0000199262 00000 n +0000199980 00000 n +0000199450 00000 n +0000200106 00000 n +0000202562 00000 n +0000201358 00000 n +0000200279 00000 n +0000202377 00000 n +0000201541 00000 n +0000201729 00000 n +0000201883 00000 n +0000202035 00000 n +0000202502 00000 n +0000202189 00000 n +0000974017 00000 n +0000976826 00000 n +0000205795 00000 n +0000203949 00000 n +0000202675 00000 n +0000205198 00000 n +0000205375 00000 n +0000205435 00000 n +0000204141 00000 n +0000204329 00000 n +0000204516 00000 n +0000205495 00000 n +0000205554 00000 n +0000205612 00000 n +0000204703 00000 n +0000204856 00000 n +0000205670 00000 n +0000205736 00000 n +0000205010 00000 n +0000434237 00000 n +0000210626 00000 n +0000207924 00000 n +0000205909 00000 n +0000210030 00000 n +0000210207 00000 n +0000210267 00000 n +0000208152 00000 n +0000208340 00000 n +0000210327 00000 n +0000208527 00000 n +0000208715 00000 n +0000208903 00000 n +0000209091 00000 n +0000209279 00000 n +0000209467 00000 n +0000210387 00000 n +0000209654 00000 n +0000209842 00000 n +0000210447 00000 n +0000210566 00000 n +0000332435 00000 n +0000217247 00000 n +0000217372 00000 n +0000217498 00000 n +0000221567 00000 n +0000221753 00000 n +0000213467 00000 n +0000212625 00000 n +0000210726 00000 n +0000213283 00000 n +0000212790 00000 n +0000212943 00000 n +0000213407 00000 n +0000213097 00000 n +0000392779 00000 n +0000217624 00000 n +0000215451 00000 n +0000213566 00000 n +0000217187 00000 n +0000215670 00000 n +0000215823 00000 n +0000217313 00000 n +0000215977 00000 n +0000216165 00000 n +0000216319 00000 n +0000217438 00000 n +0000216472 00000 n +0000216659 00000 n +0000217564 00000 n +0000216811 00000 n +0000216999 00000 n +0001244534 00000 n +0000221873 00000 n +0000219935 00000 n +0000217737 00000 n +0000221507 00000 n +0000220145 00000 n +0000220333 00000 n +0000220485 00000 n +0000221633 00000 n +0000220638 00000 n +0000220826 00000 n +0000220980 00000 n +0000221693 00000 n +0000221813 00000 n +0000221133 00000 n +0000221320 00000 n +0000366579 00000 n +0000222615 00000 n +0000222429 00000 n +0000221986 00000 n +0000222555 00000 n +0000228807 00000 n +0000224914 00000 n +0000222701 00000 n +0000228389 00000 n +0000228567 00000 n +0000228627 00000 n +0000228687 00000 n +0000225205 00000 n +0000225392 00000 n +0000225580 00000 n +0000225768 00000 n +0000225956 00000 n +0000226144 00000 n +0000228747 00000 n +0000226331 00000 n +0000226518 00000 n +0000226706 00000 n +0000226893 00000 n +0000227078 00000 n +0000227266 00000 n +0000227453 00000 n +0000227641 00000 n +0000227828 00000 n +0000228016 00000 n +0000228203 00000 n +0000252502 00000 n +0000252376 00000 n +0000239405 00000 n +0000235904 00000 n +0000231345 00000 n +0000228920 00000 n +0000235545 00000 n +0000231672 00000 n +0000231860 00000 n +0000235605 00000 n +0000232048 00000 n +0000232236 00000 n +0000232424 00000 n +0000232612 00000 n +0000232800 00000 n +0000235665 00000 n +0000232987 00000 n +0000233175 00000 n +0000233363 00000 n +0000233551 00000 n +0000233739 00000 n +0000233893 00000 n +0000234081 00000 n +0000234268 00000 n +0000234456 00000 n +0000234644 00000 n +0000234798 00000 n +0000234985 00000 n +0000235173 00000 n +0000235725 00000 n +0000235844 00000 n +0000235359 00000 n +0000252124 00000 n +0000249474 00000 n +0000252250 00000 n +0000266327 00000 n +0000322029 00000 n +0000263140 00000 n +0000239844 00000 n +0000237455 00000 n +0000236017 00000 n +0000239220 00000 n +0000237683 00000 n +0000239345 00000 n +0000237836 00000 n +0000237990 00000 n +0000238143 00000 n +0000239471 00000 n +0000238297 00000 n +0000238451 00000 n +0000239596 00000 n +0000238605 00000 n +0000239721 00000 n +0000238759 00000 n +0000238913 00000 n +0000239066 00000 n +0001034250 00000 n +0001012252 00000 n +0000245192 00000 n +0000241893 00000 n +0000239930 00000 n +0000244572 00000 n +0000244632 00000 n +0000242166 00000 n +0000242354 00000 n +0000242542 00000 n +0000242696 00000 n +0000242850 00000 n +0000244757 00000 n +0000243004 00000 n +0000243158 00000 n +0000243312 00000 n +0000244882 00000 n +0000243466 00000 n +0000243654 00000 n +0000243808 00000 n +0000245007 00000 n +0000243962 00000 n +0000244115 00000 n +0000244268 00000 n +0000244421 00000 n +0000245132 00000 n +0001244659 00000 n +0000978984 00000 n +0000984672 00000 n +0000249538 00000 n +0000247081 00000 n +0000245278 00000 n +0000248915 00000 n +0000247309 00000 n +0000247463 00000 n +0000247617 00000 n +0000249040 00000 n +0000247770 00000 n +0000249165 00000 n +0000247958 00000 n +0000248146 00000 n +0000248300 00000 n +0000249290 00000 n +0000249414 00000 n +0000248454 00000 n +0000248608 00000 n +0000248761 00000 n +0000252566 00000 n +0000251053 00000 n +0000249624 00000 n +0000252004 00000 n +0000252064 00000 n +0000251236 00000 n +0000251389 00000 n +0000252190 00000 n +0000251543 00000 n +0000251696 00000 n +0000252316 00000 n +0000251850 00000 n +0000252442 00000 n +0000257471 00000 n +0000255076 00000 n +0000252666 00000 n +0000257047 00000 n +0000257107 00000 n +0000257167 00000 n +0000257286 00000 n +0000255304 00000 n +0000255458 00000 n +0000255646 00000 n +0000255834 00000 n +0000256022 00000 n +0000256176 00000 n +0000256364 00000 n +0000256552 00000 n +0000256706 00000 n +0000257411 00000 n +0000256859 00000 n +0000276072 00000 n +0000285635 00000 n +0000263264 00000 n +0000260267 00000 n +0000257597 00000 n +0000262956 00000 n +0000260531 00000 n +0000260719 00000 n +0000260906 00000 n +0000261060 00000 n +0000263081 00000 n +0000261214 00000 n +0000261401 00000 n +0000261589 00000 n +0000261743 00000 n +0000261897 00000 n +0000263204 00000 n +0000262051 00000 n +0000262205 00000 n +0000262393 00000 n +0000262581 00000 n +0000262769 00000 n +0000266453 00000 n +0000265051 00000 n +0000263390 00000 n +0000266267 00000 n +0000265243 00000 n +0000265397 00000 n +0000265550 00000 n +0000266393 00000 n +0000265703 00000 n +0000265891 00000 n +0000266079 00000 n +0000272037 00000 n +0000268528 00000 n +0000266566 00000 n +0000271618 00000 n +0000271678 00000 n +0000271797 00000 n +0000271857 00000 n +0000268801 00000 n +0000268989 00000 n +0000269177 00000 n +0000269365 00000 n +0000269552 00000 n +0000269740 00000 n +0000269928 00000 n +0000270116 00000 n +0000270303 00000 n +0000270490 00000 n +0000270678 00000 n +0000271917 00000 n +0000270866 00000 n +0000271977 00000 n +0000271054 00000 n +0000271242 00000 n +0000271430 00000 n +0001244784 00000 n +0000276192 00000 n +0000280515 00000 n +0000280390 00000 n +0000282714 00000 n +0000282589 00000 n +0000276443 00000 n +0000278150 00000 n +0000278275 00000 n +0000280264 00000 n +0000276507 00000 n +0000274118 00000 n +0000272137 00000 n +0000275952 00000 n +0000276012 00000 n +0000276132 00000 n +0000274346 00000 n +0000274534 00000 n +0000274688 00000 n +0000274842 00000 n +0000274996 00000 n +0000275150 00000 n +0000276258 00000 n +0000276383 00000 n +0000275304 00000 n +0000275492 00000 n +0000275646 00000 n +0000275798 00000 n +0000278400 00000 n +0000277567 00000 n +0000276620 00000 n +0000278030 00000 n +0000278090 00000 n +0000277723 00000 n +0000278216 00000 n +0000277876 00000 n +0000278340 00000 n +0000280641 00000 n +0000279740 00000 n +0000278499 00000 n +0000280204 00000 n +0000279896 00000 n +0000280330 00000 n +0000280050 00000 n +0000280455 00000 n +0000280581 00000 n +0000282839 00000 n +0000282228 00000 n +0000280754 00000 n +0000282529 00000 n +0000282375 00000 n +0000282655 00000 n +0000282779 00000 n +0000285755 00000 n +0000284299 00000 n +0000282952 00000 n +0000285515 00000 n +0000285575 00000 n +0000285695 00000 n +0000284491 00000 n +0000284679 00000 n +0000284867 00000 n +0000285054 00000 n +0000285207 00000 n +0000285361 00000 n +0000288876 00000 n +0000287148 00000 n +0000285855 00000 n +0000288398 00000 n +0000288576 00000 n +0000288636 00000 n +0000287340 00000 n +0000287528 00000 n +0000288696 00000 n +0000288756 00000 n +0000288816 00000 n +0000287715 00000 n +0000287903 00000 n +0000288091 00000 n +0000288244 00000 n +0001244909 00000 n +0000371117 00000 n +0000293471 00000 n +0000291184 00000 n +0000288976 00000 n +0000293112 00000 n +0000293172 00000 n +0000293291 00000 n +0000293351 00000 n +0000291421 00000 n +0000291574 00000 n +0000293411 00000 n +0000291727 00000 n +0000291881 00000 n +0000292035 00000 n +0000292189 00000 n +0000292343 00000 n +0000292497 00000 n +0000292651 00000 n +0000292804 00000 n +0000292958 00000 n +0000387932 00000 n +0000440648 00000 n +0000377916 00000 n +0000305355 00000 n +0000296574 00000 n +0000293571 00000 n +0000303557 00000 n +0000303617 00000 n +0000297036 00000 n +0000297190 00000 n +0000297344 00000 n +0000297498 00000 n +0000297650 00000 n +0000297804 00000 n +0000297958 00000 n +0000303677 00000 n +0000303737 00000 n +0000298112 00000 n +0000303797 00000 n +0000298300 00000 n +0000303857 00000 n +0000298488 00000 n +0000303917 00000 n +0000298676 00000 n +0000303977 00000 n +0000298863 00000 n +0000304037 00000 n +0000299051 00000 n +0000304097 00000 n +0000299238 00000 n +0000304157 00000 n +0000299426 00000 n +0000304217 00000 n +0000299613 00000 n +0000304277 00000 n +0000299801 00000 n +0000304337 00000 n +0000299989 00000 n +0000304397 00000 n +0000300177 00000 n +0000304457 00000 n +0000300365 00000 n +0000304517 00000 n +0000300552 00000 n +0000304577 00000 n +0000300740 00000 n +0000304637 00000 n +0000300928 00000 n +0000304697 00000 n +0000301116 00000 n +0000304757 00000 n +0000301304 00000 n +0000304816 00000 n +0000301491 00000 n +0000304876 00000 n +0000301679 00000 n +0000304936 00000 n +0000301866 00000 n +0000304996 00000 n +0000302054 00000 n +0000305056 00000 n +0000302242 00000 n +0000305116 00000 n +0000302430 00000 n +0000302618 00000 n +0000302806 00000 n +0000305176 00000 n +0000302994 00000 n +0000305236 00000 n +0000303182 00000 n +0000305295 00000 n +0000303370 00000 n +0000343805 00000 n +0000322209 00000 n +0000309191 00000 n +0000305455 00000 n +0000319812 00000 n +0000319872 00000 n +0000309815 00000 n +0000319932 00000 n +0000310003 00000 n +0000319992 00000 n +0000310191 00000 n +0000320052 00000 n +0000310379 00000 n +0000320112 00000 n +0000310567 00000 n +0000320172 00000 n +0000310754 00000 n +0000320232 00000 n +0000310941 00000 n +0000320292 00000 n +0000311128 00000 n +0000320352 00000 n +0000311315 00000 n +0000320411 00000 n +0000311503 00000 n +0000320471 00000 n +0000311691 00000 n +0000320531 00000 n +0000311879 00000 n +0000320591 00000 n +0000312067 00000 n +0000320651 00000 n +0000312254 00000 n +0000320711 00000 n +0000312442 00000 n +0000320771 00000 n +0000312630 00000 n +0000320831 00000 n +0000312817 00000 n +0000320891 00000 n +0000313005 00000 n +0000320950 00000 n +0000313193 00000 n +0000321010 00000 n +0000313380 00000 n +0000321069 00000 n +0000313568 00000 n +0000321129 00000 n +0000313756 00000 n +0000321189 00000 n +0000313944 00000 n +0000321249 00000 n +0000314132 00000 n +0000321309 00000 n +0000314320 00000 n +0000321369 00000 n +0000314507 00000 n +0000321429 00000 n +0000314695 00000 n +0000321489 00000 n +0000314883 00000 n +0000315071 00000 n +0000315225 00000 n +0000321549 00000 n +0000315413 00000 n +0000315601 00000 n +0000321609 00000 n +0000315754 00000 n +0000315942 00000 n +0000316095 00000 n +0000321669 00000 n +0000316283 00000 n +0000316471 00000 n +0000316625 00000 n +0000321729 00000 n +0000316813 00000 n +0000321789 00000 n +0000317001 00000 n +0000321849 00000 n +0000321909 00000 n +0000317188 00000 n +0000317375 00000 n +0000321969 00000 n +0000317563 00000 n +0000317750 00000 n +0000317938 00000 n +0000318126 00000 n +0000322089 00000 n +0000322149 00000 n +0000318314 00000 n +0000318502 00000 n +0000318690 00000 n +0000318878 00000 n +0000319066 00000 n +0000319254 00000 n +0000319440 00000 n +0000319626 00000 n +0000348261 00000 n +0000332615 00000 n +0000325139 00000 n +0000322335 00000 n +0000332316 00000 n +0000325610 00000 n +0000325798 00000 n +0000325986 00000 n +0000326174 00000 n +0000326362 00000 n +0000326550 00000 n +0000326738 00000 n +0000326926 00000 n +0000327114 00000 n +0000327302 00000 n +0000327488 00000 n +0000327642 00000 n +0000327830 00000 n +0000328017 00000 n +0000328205 00000 n +0000328359 00000 n +0000328546 00000 n +0000328734 00000 n +0000328920 00000 n +0000329108 00000 n +0000329296 00000 n +0000329484 00000 n +0000329672 00000 n +0000329860 00000 n +0000330048 00000 n +0000330236 00000 n +0000332376 00000 n +0000330424 00000 n +0000330611 00000 n +0000330765 00000 n +0000330953 00000 n +0000331107 00000 n +0000332495 00000 n +0000331295 00000 n +0000331449 00000 n +0000332555 00000 n +0000331637 00000 n +0000331791 00000 n +0000331978 00000 n +0000332130 00000 n +0000361148 00000 n +0000356886 00000 n +0000352679 00000 n +0000348386 00000 n +0000361023 00000 n +0000361274 00000 n +0000352929 00000 n +0000348018 00000 n +0000356760 00000 n +0000366399 00000 n +0000370931 00000 n +0000371243 00000 n +0000343925 00000 n +0000335313 00000 n +0000332728 00000 n +0000343145 00000 n +0000343205 00000 n +0000335811 00000 n +0000335997 00000 n +0000343265 00000 n +0000336183 00000 n +0000336370 00000 n +0000343325 00000 n +0000336557 00000 n +0000336745 00000 n +0000343385 00000 n +0000336933 00000 n +0000337121 00000 n +0000337308 00000 n +0000337496 00000 n +0000337684 00000 n +0000337872 00000 n +0000338059 00000 n +0000338247 00000 n +0000343445 00000 n +0000338435 00000 n +0000338589 00000 n +0000338777 00000 n +0000338965 00000 n +0000339153 00000 n +0000343505 00000 n +0000339341 00000 n +0000339528 00000 n +0000339716 00000 n +0000343565 00000 n +0000339903 00000 n +0000340091 00000 n +0000340279 00000 n +0000340467 00000 n +0000340655 00000 n +0000340807 00000 n +0000340993 00000 n +0000341147 00000 n +0000343625 00000 n +0000341335 00000 n +0000341523 00000 n +0000341711 00000 n +0000341865 00000 n +0000342053 00000 n +0000342207 00000 n +0000343685 00000 n +0000342394 00000 n +0000342582 00000 n +0000343745 00000 n +0000343865 00000 n +0000342770 00000 n +0000342957 00000 n +0000348450 00000 n +0000346188 00000 n +0000344051 00000 n +0000347898 00000 n +0000347958 00000 n +0000348078 00000 n +0000346398 00000 n +0000346586 00000 n +0000346774 00000 n +0000348201 00000 n +0000346961 00000 n +0000347149 00000 n +0000348326 00000 n +0000347337 00000 n +0000347524 00000 n +0000347711 00000 n +0001245034 00000 n +0000352993 00000 n +0000350915 00000 n +0000348563 00000 n +0000352559 00000 n +0000352619 00000 n +0000351125 00000 n +0000351279 00000 n +0000351467 00000 n +0000351655 00000 n +0000351843 00000 n +0000351997 00000 n +0000352185 00000 n +0000352744 00000 n +0000352869 00000 n +0000352372 00000 n +0000357075 00000 n +0000355321 00000 n +0000353119 00000 n +0000356640 00000 n +0000356700 00000 n +0000355513 00000 n +0000355701 00000 n +0000355889 00000 n +0000356826 00000 n +0000356077 00000 n +0000356265 00000 n +0000356952 00000 n +0000356452 00000 n +0000361338 00000 n +0000359260 00000 n +0000357201 00000 n +0000360903 00000 n +0000360963 00000 n +0000359470 00000 n +0000361089 00000 n +0000359657 00000 n +0000359811 00000 n +0000359999 00000 n +0000360187 00000 n +0000360375 00000 n +0000360562 00000 n +0000361214 00000 n +0000360716 00000 n +0000366705 00000 n +0000363663 00000 n +0000361464 00000 n +0000366219 00000 n +0000366279 00000 n +0000363918 00000 n +0000364106 00000 n +0000364294 00000 n +0000366339 00000 n +0000366459 00000 n +0000364482 00000 n +0000364669 00000 n +0000366519 00000 n +0000364856 00000 n +0000365043 00000 n +0000365229 00000 n +0000365383 00000 n +0000365537 00000 n +0000365691 00000 n +0000366645 00000 n +0000365843 00000 n +0000366031 00000 n +0000371369 00000 n +0000368514 00000 n +0000366831 00000 n +0000370871 00000 n +0000370997 00000 n +0000368769 00000 n +0000368922 00000 n +0000369075 00000 n +0000371057 00000 n +0000369229 00000 n +0000369383 00000 n +0000369537 00000 n +0000369691 00000 n +0000369845 00000 n +0000369999 00000 n +0000371183 00000 n +0000370153 00000 n +0000370341 00000 n +0000371309 00000 n +0000370529 00000 n +0000370683 00000 n +0000372116 00000 n +0000371930 00000 n +0000371481 00000 n +0000372056 00000 n +0001245159 00000 n +0000378512 00000 n +0000374607 00000 n +0000372202 00000 n +0000377856 00000 n +0000378035 00000 n +0000378095 00000 n +0000374889 00000 n +0000378155 00000 n +0000375042 00000 n +0000375230 00000 n +0000375418 00000 n +0000375606 00000 n +0000375793 00000 n +0000375980 00000 n +0000376167 00000 n +0000376352 00000 n +0000376540 00000 n +0000376728 00000 n +0000376916 00000 n +0000378215 00000 n +0000378275 00000 n +0000377104 00000 n +0000377292 00000 n +0000378335 00000 n +0000378394 00000 n +0000378453 00000 n +0000377480 00000 n +0000377668 00000 n +0000381661 00000 n +0000381787 00000 n +0000381907 00000 n +0000382027 00000 n +0000380483 00000 n +0000378639 00000 n +0000381601 00000 n +0000381727 00000 n +0000380666 00000 n +0000380853 00000 n +0000381041 00000 n +0000381847 00000 n +0000381228 00000 n +0000381967 00000 n +0000381415 00000 n +0000388949 00000 n +0000384494 00000 n +0000382140 00000 n +0000387872 00000 n +0000388051 00000 n +0000388111 00000 n +0000384785 00000 n +0000384938 00000 n +0000388171 00000 n +0000385091 00000 n +0000388231 00000 n +0000388290 00000 n +0000385245 00000 n +0000388349 00000 n +0000385433 00000 n +0000388409 00000 n +0000385621 00000 n +0000388469 00000 n +0000385809 00000 n +0000388529 00000 n +0000385994 00000 n +0000388589 00000 n +0000386182 00000 n +0000388649 00000 n +0000386370 00000 n +0000388709 00000 n +0000386558 00000 n +0000386746 00000 n +0000388769 00000 n +0000386934 00000 n +0000387122 00000 n +0000388829 00000 n +0000388889 00000 n +0000387310 00000 n +0000387498 00000 n +0000387686 00000 n +0000392659 00000 n +0000392904 00000 n +0000391564 00000 n +0000389062 00000 n +0000392421 00000 n +0000391738 00000 n +0000392481 00000 n +0000392540 00000 n +0000391926 00000 n +0000392080 00000 n +0000392599 00000 n +0000392719 00000 n +0000392268 00000 n +0000392844 00000 n +0000394464 00000 n +0000394590 00000 n +0000393943 00000 n +0000393004 00000 n +0000394404 00000 n +0000394099 00000 n +0000394530 00000 n +0000394252 00000 n +0000400012 00000 n +0000396814 00000 n +0000394676 00000 n +0000399174 00000 n +0000399352 00000 n +0000397060 00000 n +0000397214 00000 n +0000399412 00000 n +0000397368 00000 n +0000397519 00000 n +0000399472 00000 n +0000399532 00000 n +0000397672 00000 n +0000399592 00000 n +0000397860 00000 n +0000399652 00000 n +0000398048 00000 n +0000399712 00000 n +0000398236 00000 n +0000399772 00000 n +0000398424 00000 n +0000399832 00000 n +0000398612 00000 n +0000399892 00000 n +0000398799 00000 n +0000399952 00000 n +0000398987 00000 n +0001245284 00000 n +0000404937 00000 n +0000402275 00000 n +0000400112 00000 n +0000404577 00000 n +0000402512 00000 n +0000402700 00000 n +0000402888 00000 n +0000404637 00000 n +0000403075 00000 n +0000403263 00000 n +0000403451 00000 n +0000404697 00000 n +0000403639 00000 n +0000403827 00000 n +0000404757 00000 n +0000404015 00000 n +0000404817 00000 n +0000404877 00000 n +0000404203 00000 n +0000404391 00000 n +0000434483 00000 n +0000423147 00000 n +0000426061 00000 n +0000423273 00000 n +0000428677 00000 n +0000426187 00000 n +0000433926 00000 n +0000410241 00000 n +0000407307 00000 n +0000405037 00000 n +0000410001 00000 n +0000410061 00000 n +0000407562 00000 n +0000410121 00000 n +0000407749 00000 n +0000407937 00000 n +0000408125 00000 n +0000408313 00000 n +0000408501 00000 n +0000408689 00000 n +0000408877 00000 n +0000409065 00000 n +0000409251 00000 n +0000409438 00000 n +0000410181 00000 n +0000409625 00000 n +0000409813 00000 n +0000418706 00000 n +0000423021 00000 n +0000423399 00000 n +0000434052 00000 n +0000428173 00000 n +0000425809 00000 n +0000425935 00000 n +0000428425 00000 n +0000428047 00000 n +0000428551 00000 n +0000418951 00000 n +0000418826 00000 n +0000414757 00000 n +0000412676 00000 n +0000410341 00000 n +0000414517 00000 n +0000414577 00000 n +0000412895 00000 n +0000413083 00000 n +0000413271 00000 n +0000413458 00000 n +0000413646 00000 n +0000413833 00000 n +0000414637 00000 n +0000414021 00000 n +0000414697 00000 n +0000414209 00000 n +0000414363 00000 n +0000419203 00000 n +0000428299 00000 n +0000425684 00000 n +0000419077 00000 n +0000425558 00000 n +0000437772 00000 n +0000422895 00000 n +0000419267 00000 n +0000416738 00000 n +0000414883 00000 n +0000418347 00000 n +0000416948 00000 n +0000417135 00000 n +0000417289 00000 n +0000417477 00000 n +0000417631 00000 n +0000417817 00000 n +0000418466 00000 n +0000418526 00000 n +0000417971 00000 n +0000418586 00000 n +0000418159 00000 n +0000418646 00000 n +0000418766 00000 n +0000418891 00000 n +0000419017 00000 n +0000419143 00000 n +0000434608 00000 n +0000437586 00000 n +0000423525 00000 n +0000421173 00000 n +0000419367 00000 n +0000422775 00000 n +0000422835 00000 n +0000422961 00000 n +0000423087 00000 n +0000421383 00000 n +0000421536 00000 n +0000423213 00000 n +0000421690 00000 n +0000421841 00000 n +0000422027 00000 n +0000422214 00000 n +0000422402 00000 n +0000423339 00000 n +0000422587 00000 n +0000423465 00000 n +0000426251 00000 n +0000425163 00000 n +0000423611 00000 n +0000425498 00000 n +0000425624 00000 n +0000425750 00000 n +0000425310 00000 n +0000425875 00000 n +0000426001 00000 n +0000426127 00000 n +0001245409 00000 n +0000428741 00000 n +0000427801 00000 n +0000426337 00000 n +0000427927 00000 n +0000427987 00000 n +0000428113 00000 n +0000428239 00000 n +0000428365 00000 n +0000428491 00000 n +0000428617 00000 n +0000434672 00000 n +0000430633 00000 n +0000428827 00000 n +0000433806 00000 n +0000433866 00000 n +0000433992 00000 n +0000434117 00000 n +0000434177 00000 n +0000434297 00000 n +0000430933 00000 n +0000431121 00000 n +0000431275 00000 n +0000431429 00000 n +0000431583 00000 n +0000431737 00000 n +0000431891 00000 n +0000432045 00000 n +0000432199 00000 n +0000434423 00000 n +0000432353 00000 n +0000432540 00000 n +0000432694 00000 n +0000432848 00000 n +0000433002 00000 n +0000433156 00000 n +0000433310 00000 n +0000433464 00000 n +0000434548 00000 n +0000433618 00000 n +0000971573 00000 n +0000998429 00000 n +0001008609 00000 n +0001029236 00000 n +0001021623 00000 n +0000437892 00000 n +0000435994 00000 n +0000434758 00000 n +0000437466 00000 n +0000437526 00000 n +0000436204 00000 n +0000436357 00000 n +0000436511 00000 n +0000436665 00000 n +0000436819 00000 n +0000437652 00000 n +0000436973 00000 n +0000437158 00000 n +0000437312 00000 n +0000437712 00000 n +0000437832 00000 n +0001046140 00000 n +0000441127 00000 n +0000440091 00000 n +0000438005 00000 n +0000440588 00000 n +0000440767 00000 n +0000440827 00000 n +0000440247 00000 n +0000440887 00000 n +0000440400 00000 n +0000440947 00000 n +0000441007 00000 n +0000441067 00000 n +0000446810 00000 n +0000443198 00000 n +0000441227 00000 n +0000445973 00000 n +0000446152 00000 n +0000446212 00000 n +0000443462 00000 n +0000443615 00000 n +0000443766 00000 n +0000446272 00000 n +0000446331 00000 n +0000443917 00000 n +0000446390 00000 n +0000444103 00000 n +0000446450 00000 n +0000444290 00000 n +0000446510 00000 n +0000444477 00000 n +0000446570 00000 n +0000444665 00000 n +0000444851 00000 n +0000445038 00000 n +0000445224 00000 n +0000445412 00000 n +0000446630 00000 n +0000446690 00000 n +0000445598 00000 n +0000446750 00000 n +0000445786 00000 n +0000451561 00000 n +0000448918 00000 n +0000446923 00000 n +0000451143 00000 n +0000451203 00000 n +0000451322 00000 n +0000449164 00000 n +0000451381 00000 n +0000449317 00000 n +0000449470 00000 n +0000451441 00000 n +0000449623 00000 n +0000451501 00000 n +0000449777 00000 n +0000449965 00000 n +0000450119 00000 n +0000450307 00000 n +0000450460 00000 n +0000450647 00000 n +0000450801 00000 n +0000450989 00000 n +0001245534 00000 n +0000462222 00000 n +0000459096 00000 n +0000456241 00000 n +0000456365 00000 n +0000456121 00000 n +0000456491 00000 n +0000453780 00000 n +0000451687 00000 n +0000456001 00000 n +0000456061 00000 n +0000456181 00000 n +0000454026 00000 n +0000454180 00000 n +0000454334 00000 n +0000454486 00000 n +0000456306 00000 n +0000454640 00000 n +0000454791 00000 n +0000454979 00000 n +0000455167 00000 n +0000455320 00000 n +0000456431 00000 n +0000455474 00000 n +0000455627 00000 n +0000455814 00000 n +0000459222 00000 n +0000457854 00000 n +0000456604 00000 n +0000459036 00000 n +0000458046 00000 n +0000459162 00000 n +0000458234 00000 n +0000458388 00000 n +0000458576 00000 n +0000458730 00000 n +0000458882 00000 n +0000462886 00000 n +0000460946 00000 n +0000459335 00000 n +0000462162 00000 n +0000462341 00000 n +0000461138 00000 n +0000461292 00000 n +0000461446 00000 n +0000462401 00000 n +0000462461 00000 n +0000461600 00000 n +0000462521 00000 n +0000461788 00000 n +0000461974 00000 n +0000462580 00000 n +0000462640 00000 n +0000462700 00000 n +0000462760 00000 n +0000462826 00000 n +0000468412 00000 n +0000465547 00000 n +0000462986 00000 n +0000467995 00000 n +0000468173 00000 n +0000465802 00000 n +0000465955 00000 n +0000466142 00000 n +0000466328 00000 n +0000468233 00000 n +0000466516 00000 n +0000468292 00000 n +0000466669 00000 n +0000466823 00000 n +0000468352 00000 n +0000466977 00000 n +0000467163 00000 n +0000467315 00000 n +0000467503 00000 n +0000467657 00000 n +0000467843 00000 n +0000477719 00000 n +0000486199 00000 n +0000486450 00000 n +0000490963 00000 n +0000477839 00000 n +0000471354 00000 n +0000468512 00000 n +0000477359 00000 n +0000471789 00000 n +0000471976 00000 n +0000472129 00000 n +0000472316 00000 n +0000472469 00000 n +0000472657 00000 n +0000472811 00000 n +0000472999 00000 n +0000473153 00000 n +0000473340 00000 n +0000473493 00000 n +0000473681 00000 n +0000473835 00000 n +0000474023 00000 n +0000474176 00000 n +0000474363 00000 n +0000474516 00000 n +0000474704 00000 n +0000474858 00000 n +0000475046 00000 n +0000475200 00000 n +0000475384 00000 n +0000477419 00000 n +0000475533 00000 n +0000475721 00000 n +0000475875 00000 n +0000476029 00000 n +0000477479 00000 n +0000477539 00000 n +0000476183 00000 n +0000476371 00000 n +0000476558 00000 n +0000476712 00000 n +0000477599 00000 n +0000476866 00000 n +0000477053 00000 n +0000477659 00000 n +0000477779 00000 n +0000477206 00000 n +0000494550 00000 n +0000486324 00000 n +0000481628 00000 n +0000490711 00000 n +0000490837 00000 n +0000481880 00000 n +0000481754 00000 n +0000482006 00000 n +0000490585 00000 n +0000494676 00000 n +0000482132 00000 n +0000479734 00000 n +0000477952 00000 n +0000481568 00000 n +0000479962 00000 n +0000480116 00000 n +0000481694 00000 n +0000480270 00000 n +0000480424 00000 n +0000480578 00000 n +0000481820 00000 n +0000480732 00000 n +0000481946 00000 n +0000480886 00000 n +0000481040 00000 n +0000482072 00000 n +0000481228 00000 n +0000481382 00000 n +0001245659 00000 n +0000486575 00000 n +0000484436 00000 n +0000482245 00000 n +0000486139 00000 n +0000484655 00000 n +0000484809 00000 n +0000486265 00000 n +0000484963 00000 n +0000485117 00000 n +0000485304 00000 n +0000485491 00000 n +0000486390 00000 n +0000485644 00000 n +0000485798 00000 n +0000486515 00000 n +0000485985 00000 n +0000491027 00000 n +0000488658 00000 n +0000486688 00000 n +0000490525 00000 n +0000488886 00000 n +0000489040 00000 n +0000490651 00000 n +0000489194 00000 n +0000489348 00000 n +0000490777 00000 n +0000489536 00000 n +0000489690 00000 n +0000490903 00000 n +0000489877 00000 n +0000490030 00000 n +0000490217 00000 n +0000490371 00000 n +0000494802 00000 n +0000493119 00000 n +0000491140 00000 n +0000494430 00000 n +0000494490 00000 n +0000493320 00000 n +0000493474 00000 n +0000494616 00000 n +0000493627 00000 n +0000493780 00000 n +0000493934 00000 n +0000494742 00000 n +0000494088 00000 n +0000494242 00000 n +0000495759 00000 n +0000495573 00000 n +0000494928 00000 n +0000495699 00000 n +0000502863 00000 n +0000498394 00000 n +0000495872 00000 n +0000502265 00000 n +0000502325 00000 n +0000502444 00000 n +0000498712 00000 n +0000498900 00000 n +0000499088 00000 n +0000499276 00000 n +0000499464 00000 n +0000502504 00000 n +0000499652 00000 n +0000499805 00000 n +0000502564 00000 n +0000499958 00000 n +0000502624 00000 n +0000502684 00000 n +0000500112 00000 n +0000502744 00000 n +0000500299 00000 n +0000500487 00000 n +0000502803 00000 n +0000500675 00000 n +0000500863 00000 n +0000501017 00000 n +0000501205 00000 n +0000501393 00000 n +0000501547 00000 n +0000501735 00000 n +0000501923 00000 n +0000502077 00000 n +0000507376 00000 n +0000507556 00000 n +0000507676 00000 n +0000510243 00000 n +0000507802 00000 n +0000505092 00000 n +0000502976 00000 n +0000507256 00000 n +0000507316 00000 n +0000507436 00000 n +0000505329 00000 n +0000505517 00000 n +0000505705 00000 n +0000505893 00000 n +0000507496 00000 n +0000507616 00000 n +0000506046 00000 n +0000506200 00000 n +0000506386 00000 n +0000506574 00000 n +0000507742 00000 n +0000506728 00000 n +0000506882 00000 n +0000507070 00000 n +0001245784 00000 n +0000510368 00000 n +0000509166 00000 n +0000507928 00000 n +0000510183 00000 n +0000509349 00000 n +0000510308 00000 n +0000509503 00000 n +0000509657 00000 n +0000509843 00000 n +0000510031 00000 n +0000517832 00000 n +0000513059 00000 n +0000510481 00000 n +0000517058 00000 n +0000517237 00000 n +0000513377 00000 n +0000513565 00000 n +0000513753 00000 n +0000517297 00000 n +0000513941 00000 n +0000514094 00000 n +0000517356 00000 n +0000517415 00000 n +0000514247 00000 n +0000517474 00000 n +0000514435 00000 n +0000517534 00000 n +0000514622 00000 n +0000517594 00000 n +0000514810 00000 n +0000517654 00000 n +0000517713 00000 n +0000514998 00000 n +0000515186 00000 n +0000515372 00000 n +0000515557 00000 n +0000515744 00000 n +0000515931 00000 n +0000516119 00000 n +0000517772 00000 n +0000516307 00000 n +0000516494 00000 n +0000516682 00000 n +0000516870 00000 n +0000522262 00000 n +0000525329 00000 n +0000522016 00000 n +0000521896 00000 n +0000522142 00000 n +0000522387 00000 n +0000519877 00000 n +0000517945 00000 n +0000521776 00000 n +0000521836 00000 n +0000521956 00000 n +0000520105 00000 n +0000520291 00000 n +0000520445 00000 n +0000522082 00000 n +0000520599 00000 n +0000520786 00000 n +0000520940 00000 n +0000522202 00000 n +0000521094 00000 n +0000521281 00000 n +0000521435 00000 n +0000522328 00000 n +0000521589 00000 n +0000525455 00000 n +0000523959 00000 n +0000522500 00000 n +0000525269 00000 n +0000524160 00000 n +0000524347 00000 n +0000524501 00000 n +0000524655 00000 n +0000525395 00000 n +0000524808 00000 n +0000524962 00000 n +0000525116 00000 n +0000532767 00000 n +0000528057 00000 n +0000525568 00000 n +0000531632 00000 n +0000531811 00000 n +0000531871 00000 n +0000528357 00000 n +0000528510 00000 n +0000531931 00000 n +0000528663 00000 n +0000531989 00000 n +0000532049 00000 n +0000528817 00000 n +0000532109 00000 n +0000529005 00000 n +0000532169 00000 n +0000529192 00000 n +0000532229 00000 n +0000529379 00000 n +0000532289 00000 n +0000529567 00000 n +0000532349 00000 n +0000529755 00000 n +0000532409 00000 n +0000529943 00000 n +0000532469 00000 n +0000530131 00000 n +0000532529 00000 n +0000530319 00000 n +0000532588 00000 n +0000530505 00000 n +0000532648 00000 n +0000530693 00000 n +0000532707 00000 n +0000530880 00000 n +0000531068 00000 n +0000531256 00000 n +0000531444 00000 n +0000535644 00000 n +0000535524 00000 n +0000535770 00000 n +0000535896 00000 n +0000534744 00000 n +0000532880 00000 n +0000535404 00000 n +0000535464 00000 n +0000535584 00000 n +0000535710 00000 n +0000534909 00000 n +0000535063 00000 n +0000535836 00000 n +0000535217 00000 n +0001245909 00000 n +0000544822 00000 n +0000538364 00000 n +0000536009 00000 n +0000543203 00000 n +0000543382 00000 n +0000543442 00000 n +0000538727 00000 n +0000538880 00000 n +0000539032 00000 n +0000539184 00000 n +0000543502 00000 n +0000539337 00000 n +0000543562 00000 n +0000543622 00000 n +0000539491 00000 n +0000543682 00000 n +0000539679 00000 n +0000543742 00000 n +0000539866 00000 n +0000543802 00000 n +0000540053 00000 n +0000543862 00000 n +0000540239 00000 n +0000543922 00000 n +0000540427 00000 n +0000543982 00000 n +0000540614 00000 n +0000544042 00000 n +0000540802 00000 n +0000544102 00000 n +0000540990 00000 n +0000544162 00000 n +0000541178 00000 n +0000544222 00000 n +0000541364 00000 n +0000544282 00000 n +0000541552 00000 n +0000544342 00000 n +0000541740 00000 n +0000544402 00000 n +0000541928 00000 n +0000544462 00000 n +0000542113 00000 n +0000544522 00000 n +0000542301 00000 n +0000544582 00000 n +0000542488 00000 n +0000544642 00000 n +0000542676 00000 n +0000544702 00000 n +0000544762 00000 n +0000542864 00000 n +0000543017 00000 n +0000549572 00000 n +0000546868 00000 n +0000544935 00000 n +0000548902 00000 n +0000548962 00000 n +0000549022 00000 n +0000547096 00000 n +0000549082 00000 n +0000547284 00000 n +0000547470 00000 n +0000547656 00000 n +0000549142 00000 n +0000547844 00000 n +0000548032 00000 n +0000548219 00000 n +0000548406 00000 n +0000549202 00000 n +0000549262 00000 n +0000549322 00000 n +0000548594 00000 n +0000549382 00000 n +0000549448 00000 n +0000548748 00000 n +0000549508 00000 n +0000551883 00000 n +0000552009 00000 n +0000552133 00000 n +0000551136 00000 n +0000549699 00000 n +0000551763 00000 n +0000551823 00000 n +0000551301 00000 n +0000551949 00000 n +0000551455 00000 n +0000552074 00000 n +0000551609 00000 n +0000555493 00000 n +0000553460 00000 n +0000552246 00000 n +0000554836 00000 n +0000555015 00000 n +0000553661 00000 n +0000555075 00000 n +0000553815 00000 n +0000553968 00000 n +0000555135 00000 n +0000554120 00000 n +0000555193 00000 n +0000555253 00000 n +0000554273 00000 n +0000555313 00000 n +0000555373 00000 n +0000554460 00000 n +0000555433 00000 n +0000554648 00000 n +0000564257 00000 n +0000557971 00000 n +0000555593 00000 n +0000562882 00000 n +0000563061 00000 n +0000558334 00000 n +0000558520 00000 n +0000558706 00000 n +0000558894 00000 n +0000559081 00000 n +0000559269 00000 n +0000563121 00000 n +0000559455 00000 n +0000559608 00000 n +0000563181 00000 n +0000559761 00000 n +0000563241 00000 n +0000563301 00000 n +0000559915 00000 n +0000563361 00000 n +0000560103 00000 n +0000563421 00000 n +0000560287 00000 n +0000563481 00000 n +0000560475 00000 n +0000563541 00000 n +0000560663 00000 n +0000563600 00000 n +0000560851 00000 n +0000563660 00000 n +0000561039 00000 n +0000563720 00000 n +0000561227 00000 n +0000563780 00000 n +0000561415 00000 n +0000563840 00000 n +0000561603 00000 n +0000563900 00000 n +0000561791 00000 n +0000563959 00000 n +0000561979 00000 n +0000564019 00000 n +0000562167 00000 n +0000564079 00000 n +0000562355 00000 n +0000564139 00000 n +0000564198 00000 n +0000562543 00000 n +0000562696 00000 n +0000574040 00000 n +0000573915 00000 n +0000583119 00000 n +0000570197 00000 n +0000573789 00000 n +0000570317 00000 n +0000566753 00000 n +0000564357 00000 n +0000569838 00000 n +0000569898 00000 n +0000567026 00000 n +0000567214 00000 n +0000567402 00000 n +0000567589 00000 n +0000567775 00000 n +0000567962 00000 n +0000569958 00000 n +0000568150 00000 n +0000568338 00000 n +0000568525 00000 n +0000570018 00000 n +0000568713 00000 n +0000570078 00000 n +0000568900 00000 n +0000569088 00000 n +0000569276 00000 n +0000569464 00000 n +0000569650 00000 n +0000570137 00000 n +0000570257 00000 n +0001246034 00000 n +0000579305 00000 n +0000582868 00000 n +0000574166 00000 n +0000579431 00000 n +0000582994 00000 n +0000574230 00000 n +0000572098 00000 n +0000570430 00000 n +0000573729 00000 n +0000572317 00000 n +0000572470 00000 n +0000573855 00000 n +0000572624 00000 n +0000572776 00000 n +0000573980 00000 n +0000572929 00000 n +0000573082 00000 n +0000574106 00000 n +0000573236 00000 n +0000573424 00000 n +0000573576 00000 n +0000579495 00000 n +0000577021 00000 n +0000574343 00000 n +0000579185 00000 n +0000579245 00000 n +0000577258 00000 n +0000577446 00000 n +0000577599 00000 n +0000579371 00000 n +0000577753 00000 n +0000577941 00000 n +0000578129 00000 n +0000578316 00000 n +0000578504 00000 n +0000578691 00000 n +0000578878 00000 n +0000579031 00000 n +0000583183 00000 n +0000581241 00000 n +0000579608 00000 n +0000582748 00000 n +0000582808 00000 n +0000581451 00000 n +0000581639 00000 n +0000581792 00000 n +0000582934 00000 n +0000581946 00000 n +0000582099 00000 n +0000583059 00000 n +0000582253 00000 n +0000582441 00000 n +0000582594 00000 n +0000584621 00000 n +0000584038 00000 n +0000583282 00000 n +0000584501 00000 n +0000584561 00000 n +0000584194 00000 n +0000584347 00000 n +0000591352 00000 n +0000586870 00000 n +0000584707 00000 n +0000590214 00000 n +0000590393 00000 n +0000590453 00000 n +0000587161 00000 n +0000587313 00000 n +0000587466 00000 n +0000590513 00000 n +0000587619 00000 n +0000590572 00000 n +0000587773 00000 n +0000590632 00000 n +0000587960 00000 n +0000590692 00000 n +0000588148 00000 n +0000590752 00000 n +0000588336 00000 n +0000590812 00000 n +0000588524 00000 n +0000590872 00000 n +0000588712 00000 n +0000590932 00000 n +0000588900 00000 n +0000590992 00000 n +0000589087 00000 n +0000591052 00000 n +0000589275 00000 n +0000591112 00000 n +0000589463 00000 n +0000591172 00000 n +0000591232 00000 n +0000589651 00000 n +0000591292 00000 n +0000589839 00000 n +0000590027 00000 n +0000592778 00000 n +0000592958 00000 n +0000593078 00000 n +0000592532 00000 n +0000591465 00000 n +0000592658 00000 n +0000592718 00000 n +0000592838 00000 n +0000592898 00000 n +0000593018 00000 n +0001246159 00000 n +0000593729 00000 n +0000593543 00000 n +0000593178 00000 n +0000593669 00000 n +0000601284 00000 n +0000595273 00000 n +0000593802 00000 n +0000600148 00000 n +0000600385 00000 n +0000595636 00000 n +0000595790 00000 n +0000600445 00000 n +0000600505 00000 n +0000595943 00000 n +0000596097 00000 n +0000600565 00000 n +0000596284 00000 n +0000600625 00000 n +0000596471 00000 n +0000596625 00000 n +0000600685 00000 n +0000596812 00000 n +0000596966 00000 n +0000600745 00000 n +0000597152 00000 n +0000597340 00000 n +0000600805 00000 n +0000597527 00000 n +0000600865 00000 n +0000597714 00000 n +0000600925 00000 n +0000597900 00000 n +0000598088 00000 n +0000600984 00000 n +0000598275 00000 n +0000598463 00000 n +0000601044 00000 n +0000598650 00000 n +0000598838 00000 n +0000601104 00000 n +0000599025 00000 n +0000599213 00000 n +0000601164 00000 n +0000599400 00000 n +0000599588 00000 n +0000601224 00000 n +0000599775 00000 n +0000599962 00000 n +0000603990 00000 n +0000602297 00000 n +0000601383 00000 n +0000603512 00000 n +0000603690 00000 n +0000602489 00000 n +0000602643 00000 n +0000603750 00000 n +0000603810 00000 n +0000602797 00000 n +0000602951 00000 n +0000603870 00000 n +0000603138 00000 n +0000603930 00000 n +0000603325 00000 n +0000982202 00000 n +0000605699 00000 n +0000604751 00000 n +0000604076 00000 n +0000605281 00000 n +0000605459 00000 n +0000605519 00000 n +0000605579 00000 n +0000604907 00000 n +0000605639 00000 n +0000605094 00000 n +0000610651 00000 n +0000607083 00000 n +0000605798 00000 n +0000609695 00000 n +0000609873 00000 n +0000609933 00000 n +0000609993 00000 n +0000607338 00000 n +0000610053 00000 n +0000607524 00000 n +0000607678 00000 n +0000610113 00000 n +0000607865 00000 n +0000608019 00000 n +0000610172 00000 n +0000608206 00000 n +0000610232 00000 n +0000608391 00000 n +0000610292 00000 n +0000608576 00000 n +0000610352 00000 n +0000608763 00000 n +0000610412 00000 n +0000608950 00000 n +0000610472 00000 n +0000609137 00000 n +0000610532 00000 n +0000609323 00000 n +0000610591 00000 n +0000609510 00000 n +0000613003 00000 n +0000611545 00000 n +0000610750 00000 n +0000612466 00000 n +0000612644 00000 n +0000612704 00000 n +0000612764 00000 n +0000611719 00000 n +0000612824 00000 n +0000611906 00000 n +0000612884 00000 n +0000612093 00000 n +0000612943 00000 n +0000612280 00000 n +0001246284 00000 n +0000618735 00000 n +0000614566 00000 n +0000613102 00000 n +0000617899 00000 n +0000618077 00000 n +0000614857 00000 n +0000618137 00000 n +0000618196 00000 n +0000615010 00000 n +0000615163 00000 n +0000615316 00000 n +0000618255 00000 n +0000615502 00000 n +0000615690 00000 n +0000618315 00000 n +0000615876 00000 n +0000616064 00000 n +0000618375 00000 n +0000616251 00000 n +0000618435 00000 n +0000616438 00000 n +0000616626 00000 n +0000618495 00000 n +0000616813 00000 n +0000617001 00000 n +0000618555 00000 n +0000617188 00000 n +0000617342 00000 n +0000618615 00000 n +0000617528 00000 n +0000618675 00000 n +0000617713 00000 n +0000620695 00000 n +0000619550 00000 n +0000618860 00000 n +0000620277 00000 n +0000620455 00000 n +0000620515 00000 n +0000620575 00000 n +0000619715 00000 n +0000619903 00000 n +0000620635 00000 n +0000620090 00000 n +0000622546 00000 n +0000621494 00000 n +0000620794 00000 n +0000622188 00000 n +0000622366 00000 n +0000621659 00000 n +0000622426 00000 n +0000622486 00000 n +0000621813 00000 n +0000622001 00000 n +0000628080 00000 n +0000623872 00000 n +0000622632 00000 n +0000627243 00000 n +0000627421 00000 n +0000624163 00000 n +0000624317 00000 n +0000624471 00000 n +0000627481 00000 n +0000627541 00000 n +0000624625 00000 n +0000624813 00000 n +0000627601 00000 n +0000625000 00000 n +0000627661 00000 n +0000625187 00000 n +0000627721 00000 n +0000625374 00000 n +0000627781 00000 n +0000625561 00000 n +0000627840 00000 n +0000625748 00000 n +0000625935 00000 n +0000627900 00000 n +0000626119 00000 n +0000626307 00000 n +0000627960 00000 n +0000626494 00000 n +0000626682 00000 n +0000628020 00000 n +0000626869 00000 n +0000627057 00000 n +0000631434 00000 n +0000629238 00000 n +0000628179 00000 n +0000631076 00000 n +0000631254 00000 n +0000629457 00000 n +0000629611 00000 n +0000631314 00000 n +0000631374 00000 n +0000629765 00000 n +0000629952 00000 n +0000630138 00000 n +0000630326 00000 n +0000630514 00000 n +0000630700 00000 n +0000630888 00000 n +0000634446 00000 n +0000632654 00000 n +0000631533 00000 n +0000634030 00000 n +0000634208 00000 n +0000632855 00000 n +0000633042 00000 n +0000633196 00000 n +0000633350 00000 n +0000633504 00000 n +0000634268 00000 n +0000634327 00000 n +0000633658 00000 n +0000634386 00000 n +0000633843 00000 n +0001246409 00000 n +0000642316 00000 n +0000636745 00000 n +0000634558 00000 n +0000641358 00000 n +0000641536 00000 n +0000637090 00000 n +0000641596 00000 n +0000641656 00000 n +0000637244 00000 n +0000637432 00000 n +0000641716 00000 n +0000637618 00000 n +0000637803 00000 n +0000641776 00000 n +0000637987 00000 n +0000638175 00000 n +0000641836 00000 n +0000638362 00000 n +0000638550 00000 n +0000641896 00000 n +0000638737 00000 n +0000638923 00000 n +0000641956 00000 n +0000639108 00000 n +0000639296 00000 n +0000642016 00000 n +0000639483 00000 n +0000639671 00000 n +0000642076 00000 n +0000639858 00000 n +0000640046 00000 n +0000642136 00000 n +0000640233 00000 n +0000640421 00000 n +0000642196 00000 n +0000640608 00000 n +0000640796 00000 n +0000642256 00000 n +0000640983 00000 n +0000641171 00000 n +0000645321 00000 n +0000643347 00000 n +0000642442 00000 n +0000645021 00000 n +0000645081 00000 n +0000643557 00000 n +0000643745 00000 n +0000645141 00000 n +0000643932 00000 n +0000644120 00000 n +0000645201 00000 n +0000644307 00000 n +0000644495 00000 n +0000645261 00000 n +0000644682 00000 n +0000644835 00000 n +0000647037 00000 n +0000646148 00000 n +0000645421 00000 n +0000646679 00000 n +0000646857 00000 n +0000646917 00000 n +0000646977 00000 n +0000646304 00000 n +0000646492 00000 n +0000649685 00000 n +0000647959 00000 n +0000647149 00000 n +0000649208 00000 n +0000649386 00000 n +0000649446 00000 n +0000649506 00000 n +0000648151 00000 n +0000648305 00000 n +0000649566 00000 n +0000648492 00000 n +0000648646 00000 n +0000649626 00000 n +0000648833 00000 n +0000649021 00000 n +0000658442 00000 n +0000651222 00000 n +0000649797 00000 n +0000657245 00000 n +0000657423 00000 n +0000657483 00000 n +0000657543 00000 n +0000651630 00000 n +0000651818 00000 n +0000657603 00000 n +0000652005 00000 n +0000652193 00000 n +0000657663 00000 n +0000652380 00000 n +0000652568 00000 n +0000657723 00000 n +0000652755 00000 n +0000652942 00000 n +0000657783 00000 n +0000653128 00000 n +0000653316 00000 n +0000657843 00000 n +0000653503 00000 n +0000653691 00000 n +0000657903 00000 n +0000653878 00000 n +0000654066 00000 n +0000657963 00000 n +0000654252 00000 n +0000654440 00000 n +0000658023 00000 n +0000654627 00000 n +0000654815 00000 n +0000658083 00000 n +0000655002 00000 n +0000655190 00000 n +0000658142 00000 n +0000655377 00000 n +0000655563 00000 n +0000658202 00000 n +0000655748 00000 n +0000655936 00000 n +0000658262 00000 n +0000656123 00000 n +0000656311 00000 n +0000658322 00000 n +0000656498 00000 n +0000656685 00000 n +0000658382 00000 n +0000656871 00000 n +0000657059 00000 n +0000659990 00000 n +0000659135 00000 n +0000658528 00000 n +0000659632 00000 n +0000659810 00000 n +0000659870 00000 n +0000659930 00000 n +0000659291 00000 n +0000659445 00000 n +0001246534 00000 n +0000668945 00000 n +0000662093 00000 n +0000660076 00000 n +0000668466 00000 n +0000668645 00000 n +0000668705 00000 n +0000668765 00000 n +0000662519 00000 n +0000662706 00000 n +0000662891 00000 n +0000663077 00000 n +0000663262 00000 n +0000663448 00000 n +0000663633 00000 n +0000663820 00000 n +0000664006 00000 n +0000664191 00000 n +0000664375 00000 n +0000664561 00000 n +0000664745 00000 n +0000664932 00000 n +0000665118 00000 n +0000665304 00000 n +0000665489 00000 n +0000665675 00000 n +0000665860 00000 n +0000668825 00000 n +0000666046 00000 n +0000666233 00000 n +0000666418 00000 n +0000666605 00000 n +0000666791 00000 n +0000666978 00000 n +0000667164 00000 n +0000667351 00000 n +0000667537 00000 n +0000668885 00000 n +0000667723 00000 n +0000667910 00000 n +0000668095 00000 n +0000668281 00000 n +0001145426 00000 n +0001145393 00000 n +0001145360 00000 n +0001145327 00000 n +0001145294 00000 n +0001145261 00000 n +0001145228 00000 n +0001145195 00000 n +0001145162 00000 n +0001145129 00000 n +0000675485 00000 n +0000670548 00000 n +0000669071 00000 n +0000675365 00000 n +0000670902 00000 n +0000671089 00000 n +0000671275 00000 n +0000671462 00000 n +0000671648 00000 n +0000671834 00000 n +0000672019 00000 n +0000672206 00000 n +0000672392 00000 n +0000672579 00000 n +0000672765 00000 n +0000672950 00000 n +0000673133 00000 n +0000673320 00000 n +0000673506 00000 n +0000675425 00000 n +0000673692 00000 n +0000673878 00000 n +0000674062 00000 n +0000674249 00000 n +0000674435 00000 n +0000674621 00000 n +0000674806 00000 n +0000674993 00000 n +0000675179 00000 n +0001145096 00000 n +0001145063 00000 n +0001145030 00000 n +0001144997 00000 n +0001144964 00000 n +0000686796 00000 n +0000677312 00000 n +0000675585 00000 n +0000685298 00000 n +0000685477 00000 n +0000685537 00000 n +0000685597 00000 n +0000677810 00000 n +0000677998 00000 n +0000685657 00000 n +0000678185 00000 n +0000678373 00000 n +0000685717 00000 n +0000678560 00000 n +0000678748 00000 n +0000685777 00000 n +0000678935 00000 n +0000679122 00000 n +0000685837 00000 n +0000679308 00000 n +0000679496 00000 n +0000685897 00000 n +0000679683 00000 n +0000679871 00000 n +0000685957 00000 n +0000680058 00000 n +0000680246 00000 n +0000686017 00000 n +0000680432 00000 n +0000680620 00000 n +0000686077 00000 n +0000680807 00000 n +0000680995 00000 n +0000686137 00000 n +0000681182 00000 n +0000681370 00000 n +0000686196 00000 n +0000681557 00000 n +0000681743 00000 n +0000686256 00000 n +0000681928 00000 n +0000682116 00000 n +0000686316 00000 n +0000682303 00000 n +0000682491 00000 n +0000686376 00000 n +0000682678 00000 n +0000682866 00000 n +0000686436 00000 n +0000683053 00000 n +0000683241 00000 n +0000686496 00000 n +0000683428 00000 n +0000683616 00000 n +0000686556 00000 n +0000683803 00000 n +0000683991 00000 n +0000686616 00000 n +0000684178 00000 n +0000684364 00000 n +0000686676 00000 n +0000684548 00000 n +0000684736 00000 n +0000686736 00000 n +0000684923 00000 n +0000685111 00000 n +0000691264 00000 n +0000688237 00000 n +0000686882 00000 n +0000690665 00000 n +0000690844 00000 n +0000688483 00000 n +0000688637 00000 n +0000690904 00000 n +0000690964 00000 n +0000688791 00000 n +0000688979 00000 n +0000691024 00000 n +0000689165 00000 n +0000689353 00000 n +0000691084 00000 n +0000689540 00000 n +0000689728 00000 n +0000691144 00000 n +0000689915 00000 n +0000690103 00000 n +0000691204 00000 n +0000690290 00000 n +0000690478 00000 n +0000699536 00000 n +0000692765 00000 n +0000691390 00000 n +0000698398 00000 n +0000698577 00000 n +0000698637 00000 n +0000698697 00000 n +0000693155 00000 n +0000693343 00000 n +0000698757 00000 n +0000693530 00000 n +0000693718 00000 n +0000698817 00000 n +0000693905 00000 n +0000694093 00000 n +0000698877 00000 n +0000694280 00000 n +0000694467 00000 n +0000698937 00000 n +0000694653 00000 n +0000694841 00000 n +0000698997 00000 n +0000695028 00000 n +0000695216 00000 n +0000699057 00000 n +0000695403 00000 n +0000695591 00000 n +0000699117 00000 n +0000695777 00000 n +0000695965 00000 n +0000699177 00000 n +0000696152 00000 n +0000696340 00000 n +0000699237 00000 n +0000696527 00000 n +0000696715 00000 n +0000699296 00000 n +0000696902 00000 n +0000697088 00000 n +0000699356 00000 n +0000697273 00000 n +0000697461 00000 n +0000699416 00000 n +0000697648 00000 n +0000697836 00000 n +0000699476 00000 n +0000698023 00000 n +0000698211 00000 n +0000705952 00000 n +0000701003 00000 n +0000699622 00000 n +0000704996 00000 n +0000705175 00000 n +0000701321 00000 n +0000701474 00000 n +0000705235 00000 n +0000705295 00000 n +0000701628 00000 n +0000701816 00000 n +0000705355 00000 n +0000702003 00000 n +0000702190 00000 n +0000705415 00000 n +0000702376 00000 n +0000702564 00000 n +0000705475 00000 n +0000702751 00000 n +0000702939 00000 n +0000705535 00000 n +0000703125 00000 n +0000705594 00000 n +0000703312 00000 n +0000705654 00000 n +0000703497 00000 n +0000703685 00000 n +0000705712 00000 n +0000703872 00000 n +0000704060 00000 n +0000705772 00000 n +0000704247 00000 n +0000705832 00000 n +0000704434 00000 n +0000704622 00000 n +0000705892 00000 n +0000704809 00000 n +0001246659 00000 n +0000706598 00000 n +0000706412 00000 n +0000706038 00000 n +0000706538 00000 n +0000708819 00000 n +0000707588 00000 n +0000706671 00000 n +0000708462 00000 n +0000708700 00000 n +0000707762 00000 n +0000707933 00000 n +0000708760 00000 n +0000708087 00000 n +0000708274 00000 n +0001144931 00000 n +0000711783 00000 n +0000710131 00000 n +0000708931 00000 n +0000711364 00000 n +0000711543 00000 n +0000710323 00000 n +0000710494 00000 n +0000711603 00000 n +0000710648 00000 n +0000711663 00000 n +0000710802 00000 n +0000711723 00000 n +0000710989 00000 n +0000711176 00000 n +0001144898 00000 n +0000721355 00000 n +0000714657 00000 n +0000711895 00000 n +0000720037 00000 n +0000720216 00000 n +0000715038 00000 n +0000715214 00000 n +0000720276 00000 n +0000715367 00000 n +0000715554 00000 n +0000720336 00000 n +0000715742 00000 n +0000720396 00000 n +0000715929 00000 n +0000720456 00000 n +0000716115 00000 n +0000720516 00000 n +0000716299 00000 n +0000720576 00000 n +0000716486 00000 n +0000720636 00000 n +0000716672 00000 n +0000720696 00000 n +0000716859 00000 n +0000720756 00000 n +0000717046 00000 n +0000720816 00000 n +0000717233 00000 n +0000720876 00000 n +0000717420 00000 n +0000720936 00000 n +0000717606 00000 n +0000720996 00000 n +0000717791 00000 n +0000721055 00000 n +0000717978 00000 n +0000721115 00000 n +0000718165 00000 n +0000721175 00000 n +0000718351 00000 n +0000721235 00000 n +0000718538 00000 n +0000718725 00000 n +0000721295 00000 n +0000718913 00000 n +0000719101 00000 n +0000719289 00000 n +0000719477 00000 n +0000719665 00000 n +0000719851 00000 n +0001144865 00000 n +0000723099 00000 n +0000722312 00000 n +0000721494 00000 n +0000723039 00000 n +0000722477 00000 n +0000722664 00000 n +0000722851 00000 n +0000728271 00000 n +0000725502 00000 n +0000723212 00000 n +0000727852 00000 n +0000728031 00000 n +0000725748 00000 n +0000725924 00000 n +0000728091 00000 n +0000726077 00000 n +0000726231 00000 n +0000726385 00000 n +0000726573 00000 n +0000728151 00000 n +0000726727 00000 n +0000728211 00000 n +0000726915 00000 n +0000727103 00000 n +0000727291 00000 n +0000727478 00000 n +0000727665 00000 n +0001246784 00000 n +0001144832 00000 n +0000730839 00000 n +0000729460 00000 n +0000728410 00000 n +0000730779 00000 n +0000729652 00000 n +0000729840 00000 n +0000730028 00000 n +0000730216 00000 n +0000730404 00000 n +0000730592 00000 n +0000736019 00000 n +0000732815 00000 n +0000730952 00000 n +0000735660 00000 n +0000735839 00000 n +0000733079 00000 n +0000733254 00000 n +0000735899 00000 n +0000733408 00000 n +0000733596 00000 n +0000733783 00000 n +0000733971 00000 n +0000734159 00000 n +0000734347 00000 n +0000734534 00000 n +0000735959 00000 n +0000734722 00000 n +0000734910 00000 n +0000735097 00000 n +0000735285 00000 n +0000735473 00000 n +0001144799 00000 n +0000740901 00000 n +0000738397 00000 n +0000736158 00000 n +0000740483 00000 n +0000740662 00000 n +0000738634 00000 n +0000738810 00000 n +0000740722 00000 n +0000738964 00000 n +0000740782 00000 n +0000739118 00000 n +0000739272 00000 n +0000739426 00000 n +0000739611 00000 n +0000739765 00000 n +0000739953 00000 n +0000740841 00000 n +0000740107 00000 n +0000740295 00000 n +0001144766 00000 n +0000742646 00000 n +0000741798 00000 n +0000741027 00000 n +0000742526 00000 n +0000742586 00000 n +0000741963 00000 n +0000742151 00000 n +0000742338 00000 n +0000745708 00000 n +0000744081 00000 n +0000742746 00000 n +0000745349 00000 n +0000745528 00000 n +0000744273 00000 n +0000744444 00000 n +0000745588 00000 n +0000744598 00000 n +0000745648 00000 n +0000744786 00000 n +0000744973 00000 n +0000745161 00000 n +0001144733 00000 n +0000749270 00000 n +0000747313 00000 n +0000745847 00000 n +0000748972 00000 n +0000749151 00000 n +0000747523 00000 n +0000747694 00000 n +0000749211 00000 n +0000747848 00000 n +0000748034 00000 n +0000748222 00000 n +0000748410 00000 n +0000748598 00000 n +0000748786 00000 n +0001246909 00000 n +0001144700 00000 n +0000756290 00000 n +0000751717 00000 n +0000749409 00000 n +0000755931 00000 n +0000756110 00000 n +0000752044 00000 n +0000752216 00000 n +0000756170 00000 n +0000752369 00000 n +0000752557 00000 n +0000752744 00000 n +0000752932 00000 n +0000753120 00000 n +0000753307 00000 n +0000753495 00000 n +0000753682 00000 n +0000753870 00000 n +0000754057 00000 n +0000754245 00000 n +0000754431 00000 n +0000754618 00000 n +0000754806 00000 n +0000756230 00000 n +0000754994 00000 n +0000755182 00000 n +0000755368 00000 n +0000755555 00000 n +0000755743 00000 n +0001144667 00000 n +0000760014 00000 n +0000757745 00000 n +0000756429 00000 n +0000759535 00000 n +0000759714 00000 n +0000757964 00000 n +0000758136 00000 n +0000759774 00000 n +0000758290 00000 n +0000759834 00000 n +0000758444 00000 n +0000758631 00000 n +0000758819 00000 n +0000759894 00000 n +0000759006 00000 n +0000759160 00000 n +0000759954 00000 n +0000759347 00000 n +0001144634 00000 n +0000766630 00000 n +0000762441 00000 n +0000760126 00000 n +0000766271 00000 n +0000766450 00000 n +0000762750 00000 n +0000762926 00000 n +0000766510 00000 n +0000763080 00000 n +0000763268 00000 n +0000763455 00000 n +0000763642 00000 n +0000763830 00000 n +0000764018 00000 n +0000764206 00000 n +0000764394 00000 n +0000764582 00000 n +0000764770 00000 n +0000764958 00000 n +0000765146 00000 n +0000766570 00000 n +0000765334 00000 n +0000765522 00000 n +0000765710 00000 n +0000765897 00000 n +0000766083 00000 n +0001144601 00000 n +0000768668 00000 n +0000767684 00000 n +0000766769 00000 n +0000768608 00000 n +0000767858 00000 n +0000768045 00000 n +0000768232 00000 n +0000768420 00000 n +0000774196 00000 n +0000770943 00000 n +0000768781 00000 n +0000773717 00000 n +0000773896 00000 n +0000771207 00000 n +0000771383 00000 n +0000773956 00000 n +0000771537 00000 n +0000774016 00000 n +0000771690 00000 n +0000771878 00000 n +0000774076 00000 n +0000772064 00000 n +0000772218 00000 n +0000774136 00000 n +0000772405 00000 n +0000772593 00000 n +0000772781 00000 n +0000772969 00000 n +0000773155 00000 n +0000773342 00000 n +0000773530 00000 n +0001144568 00000 n +0000777506 00000 n +0000775734 00000 n +0000774335 00000 n +0000777446 00000 n +0000775944 00000 n +0000776131 00000 n +0000776319 00000 n +0000776507 00000 n +0000776695 00000 n +0000776883 00000 n +0000777071 00000 n +0000777258 00000 n +0001247034 00000 n +0000779600 00000 n +0000778623 00000 n +0000777619 00000 n +0000779301 00000 n +0000779480 00000 n +0000778788 00000 n +0000778959 00000 n +0000779540 00000 n +0000779113 00000 n +0001144535 00000 n +0000782368 00000 n +0000780913 00000 n +0000779725 00000 n +0000781950 00000 n +0000782129 00000 n +0000781096 00000 n +0000781267 00000 n +0000782189 00000 n +0000781421 00000 n +0000782249 00000 n +0000781575 00000 n +0000782309 00000 n +0000781763 00000 n +0001144502 00000 n +0000787218 00000 n +0000784215 00000 n +0000782507 00000 n +0000786860 00000 n +0000787039 00000 n +0000784470 00000 n +0000784642 00000 n +0000787099 00000 n +0000784796 00000 n +0000784983 00000 n +0000785171 00000 n +0000785359 00000 n +0000785547 00000 n +0000785735 00000 n +0000785922 00000 n +0000786110 00000 n +0000786297 00000 n +0000787158 00000 n +0000786485 00000 n +0000786673 00000 n +0001144469 00000 n +0000791313 00000 n +0000788865 00000 n +0000787344 00000 n +0000791014 00000 n +0000791193 00000 n +0000789102 00000 n +0000789273 00000 n +0000791253 00000 n +0000789426 00000 n +0000789614 00000 n +0000789768 00000 n +0000789956 00000 n +0000790144 00000 n +0000790298 00000 n +0000790486 00000 n +0000790674 00000 n +0000790828 00000 n +0001144436 00000 n +0000796587 00000 n +0000793266 00000 n +0000791452 00000 n +0000796169 00000 n +0000796348 00000 n +0000793539 00000 n +0000793710 00000 n +0000796408 00000 n +0000793863 00000 n +0000796467 00000 n +0000794016 00000 n +0000794204 00000 n +0000794391 00000 n +0000796527 00000 n +0000794579 00000 n +0000794767 00000 n +0000794921 00000 n +0000795109 00000 n +0000795297 00000 n +0000795451 00000 n +0000795639 00000 n +0000795827 00000 n +0000795981 00000 n +0001144403 00000 n +0000800369 00000 n +0000798331 00000 n +0000796726 00000 n +0000800010 00000 n +0000800189 00000 n +0000798541 00000 n +0000798712 00000 n +0000798920 00000 n +0000800249 00000 n +0000799074 00000 n +0000799261 00000 n +0000799448 00000 n +0000799636 00000 n +0000800309 00000 n +0000799822 00000 n +0001247159 00000 n +0001144370 00000 n +0000804387 00000 n +0000802153 00000 n +0000800494 00000 n +0000804028 00000 n +0000804207 00000 n +0000802372 00000 n +0000802543 00000 n +0000802753 00000 n +0000804267 00000 n +0000802907 00000 n +0000803094 00000 n +0000803280 00000 n +0000803467 00000 n +0000803655 00000 n +0000804327 00000 n +0000803840 00000 n +0001144337 00000 n +0000805951 00000 n +0000805230 00000 n +0000804512 00000 n +0000805712 00000 n +0000805891 00000 n +0000805386 00000 n +0000805558 00000 n +0001144304 00000 n +0000812799 00000 n +0000808402 00000 n +0000806063 00000 n +0000812442 00000 n +0000812621 00000 n +0000808738 00000 n +0000808910 00000 n +0000812679 00000 n +0000809064 00000 n +0000809218 00000 n +0000812739 00000 n +0000809372 00000 n +0000809560 00000 n +0000809714 00000 n +0000809901 00000 n +0000810054 00000 n +0000810241 00000 n +0000810394 00000 n +0000810581 00000 n +0000810734 00000 n +0000810921 00000 n +0000811074 00000 n +0000811262 00000 n +0000811416 00000 n +0000811604 00000 n +0000811758 00000 n +0000811946 00000 n +0000812100 00000 n +0000812288 00000 n +0001144271 00000 n +0000818487 00000 n +0000814666 00000 n +0000812925 00000 n +0000818367 00000 n +0000814984 00000 n +0000815172 00000 n +0000815325 00000 n +0000815513 00000 n +0000815667 00000 n +0000815855 00000 n +0000816009 00000 n +0000816197 00000 n +0000816351 00000 n +0000816539 00000 n +0000816692 00000 n +0000816880 00000 n +0000817034 00000 n +0000817188 00000 n +0000818427 00000 n +0000817342 00000 n +0000817530 00000 n +0000817717 00000 n +0000817871 00000 n +0000818025 00000 n +0000818213 00000 n +0000823484 00000 n +0000820376 00000 n +0000818600 00000 n +0000823005 00000 n +0000823184 00000 n +0000820640 00000 n +0000820812 00000 n +0000823244 00000 n +0000820966 00000 n +0000823304 00000 n +0000821120 00000 n +0000821308 00000 n +0000823364 00000 n +0000821462 00000 n +0000821650 00000 n +0000821838 00000 n +0000821991 00000 n +0000822178 00000 n +0000823424 00000 n +0000822331 00000 n +0000822518 00000 n +0000822671 00000 n +0000822855 00000 n +0001144238 00000 n +0000829047 00000 n +0000825411 00000 n +0000823610 00000 n +0000828688 00000 n +0000828748 00000 n +0000825702 00000 n +0000825890 00000 n +0000826044 00000 n +0000826231 00000 n +0000828808 00000 n +0000826384 00000 n +0000826572 00000 n +0000826726 00000 n +0000826914 00000 n +0000828867 00000 n +0000827068 00000 n +0000828927 00000 n +0000827256 00000 n +0000827444 00000 n +0000827598 00000 n +0000827785 00000 n +0000828987 00000 n +0000827938 00000 n +0000828126 00000 n +0000828313 00000 n +0000828501 00000 n +0001247284 00000 n +0000832875 00000 n +0000830657 00000 n +0000829147 00000 n +0000832576 00000 n +0000832755 00000 n +0000830885 00000 n +0000831056 00000 n +0000832815 00000 n +0000831210 00000 n +0000831398 00000 n +0000831552 00000 n +0000831740 00000 n +0000831893 00000 n +0000832080 00000 n +0000832234 00000 n +0000832422 00000 n +0001144205 00000 n +0000837054 00000 n +0000834616 00000 n +0000833014 00000 n +0000836695 00000 n +0000836874 00000 n +0000834853 00000 n +0000835024 00000 n +0000836934 00000 n +0000835178 00000 n +0000836994 00000 n +0000835331 00000 n +0000835519 00000 n +0000835673 00000 n +0000835861 00000 n +0000836014 00000 n +0000836200 00000 n +0000836353 00000 n +0000836541 00000 n +0001144172 00000 n +0000842363 00000 n +0000838821 00000 n +0000837193 00000 n +0000841584 00000 n +0000841763 00000 n +0000839085 00000 n +0000839256 00000 n +0000841823 00000 n +0000841883 00000 n +0000839410 00000 n +0000841943 00000 n +0000839597 00000 n +0000842003 00000 n +0000842063 00000 n +0000839784 00000 n +0000842123 00000 n +0000839971 00000 n +0000842183 00000 n +0000840158 00000 n +0000840345 00000 n +0000840533 00000 n +0000842243 00000 n +0000840686 00000 n +0000840873 00000 n +0000842303 00000 n +0000841061 00000 n +0000841213 00000 n +0000841398 00000 n +0001144139 00000 n +0000847170 00000 n +0000843974 00000 n +0000842488 00000 n +0000846511 00000 n +0000846690 00000 n +0000844229 00000 n +0000844400 00000 n +0000846750 00000 n +0000844554 00000 n +0000846810 00000 n +0000846870 00000 n +0000844708 00000 n +0000846930 00000 n +0000844895 00000 n +0000845081 00000 n +0000845268 00000 n +0000846990 00000 n +0000845420 00000 n +0000845607 00000 n +0000847050 00000 n +0000845795 00000 n +0000845949 00000 n +0000846136 00000 n +0000847110 00000 n +0000846324 00000 n +0001144106 00000 n +0000849252 00000 n +0000848278 00000 n +0000847295 00000 n +0000848954 00000 n +0000849133 00000 n +0000848443 00000 n +0000848614 00000 n +0000849193 00000 n +0000848768 00000 n +0001144073 00000 n +0000859732 00000 n +0000852338 00000 n +0000849378 00000 n +0000859373 00000 n +0000859552 00000 n +0000852800 00000 n +0000852975 00000 n +0000859612 00000 n +0000859672 00000 n +0000853129 00000 n +0000853316 00000 n +0000853504 00000 n +0000853692 00000 n +0000853879 00000 n +0000854066 00000 n +0000854254 00000 n +0000854441 00000 n +0000854629 00000 n +0000854817 00000 n +0000855005 00000 n +0000855191 00000 n +0000855379 00000 n +0000855567 00000 n +0000855755 00000 n +0000855943 00000 n +0000856130 00000 n +0000856318 00000 n +0000856506 00000 n +0000856694 00000 n +0000856882 00000 n +0000857070 00000 n +0000857258 00000 n +0000857412 00000 n +0000857600 00000 n +0000857787 00000 n +0000857939 00000 n +0000858127 00000 n +0000858280 00000 n +0000858468 00000 n +0000858656 00000 n +0000858810 00000 n +0000858998 00000 n +0000859186 00000 n +0001247409 00000 n +0001144040 00000 n +0000871562 00000 n +0000862895 00000 n +0000859857 00000 n +0000871382 00000 n +0000871442 00000 n +0000863420 00000 n +0000863608 00000 n +0000863796 00000 n +0000863984 00000 n +0000864172 00000 n +0000864360 00000 n +0000864548 00000 n +0000864736 00000 n +0000864924 00000 n +0000865110 00000 n +0000865298 00000 n +0000865486 00000 n +0000865673 00000 n +0000865860 00000 n +0000866048 00000 n +0000866202 00000 n +0000866390 00000 n +0000866577 00000 n +0000866765 00000 n +0000866919 00000 n +0000867106 00000 n +0000867294 00000 n +0000867480 00000 n +0000867668 00000 n +0000867856 00000 n +0000868042 00000 n +0000868228 00000 n +0000868416 00000 n +0000868604 00000 n +0000868791 00000 n +0000868978 00000 n +0000869165 00000 n +0000871502 00000 n +0000869353 00000 n +0000869541 00000 n +0000869729 00000 n +0000869917 00000 n +0000870104 00000 n +0000870291 00000 n +0000870478 00000 n +0000870632 00000 n +0000870820 00000 n +0000871008 00000 n +0000871196 00000 n +0000876957 00000 n +0000873160 00000 n +0000871675 00000 n +0000876897 00000 n +0000873469 00000 n +0000873657 00000 n +0000873844 00000 n +0000874030 00000 n +0000874218 00000 n +0000874406 00000 n +0000874594 00000 n +0000874782 00000 n +0000874936 00000 n +0000875124 00000 n +0000875278 00000 n +0000875466 00000 n +0000875654 00000 n +0000875842 00000 n +0000875996 00000 n +0000876184 00000 n +0000876338 00000 n +0000876525 00000 n +0000876711 00000 n +0000882116 00000 n +0000879146 00000 n +0000877070 00000 n +0000881757 00000 n +0000881936 00000 n +0000879410 00000 n +0000879586 00000 n +0000881996 00000 n +0000879740 00000 n +0000879894 00000 n +0000880048 00000 n +0000880202 00000 n +0000880356 00000 n +0000880510 00000 n +0000880664 00000 n +0000882056 00000 n +0000880818 00000 n +0000881006 00000 n +0000881193 00000 n +0000881381 00000 n +0000881569 00000 n +0001144007 00000 n +0000889059 00000 n +0000884735 00000 n +0000882242 00000 n +0000888999 00000 n +0000885062 00000 n +0000885250 00000 n +0000885438 00000 n +0000885625 00000 n +0000885813 00000 n +0000886001 00000 n +0000886189 00000 n +0000886377 00000 n +0000886565 00000 n +0000886752 00000 n +0000886939 00000 n +0000887127 00000 n +0000887315 00000 n +0000887503 00000 n +0000887691 00000 n +0000887878 00000 n +0000888066 00000 n +0000888254 00000 n +0000888440 00000 n +0000888625 00000 n +0000888813 00000 n +0000894940 00000 n +0000891399 00000 n +0000889172 00000 n +0000894880 00000 n +0000891690 00000 n +0000891878 00000 n +0000892065 00000 n +0000892253 00000 n +0000892441 00000 n +0000892629 00000 n +0000892815 00000 n +0000893003 00000 n +0000893191 00000 n +0000893379 00000 n +0000893567 00000 n +0000893755 00000 n +0000893943 00000 n +0000894131 00000 n +0000894319 00000 n +0000894507 00000 n +0000894694 00000 n +0000905215 00000 n +0000898128 00000 n +0000895040 00000 n +0000905155 00000 n +0000898581 00000 n +0000898769 00000 n +0000898957 00000 n +0000899145 00000 n +0000899333 00000 n +0000899521 00000 n +0000899709 00000 n +0000899897 00000 n +0000900085 00000 n +0000900273 00000 n +0000900461 00000 n +0000900649 00000 n +0000900837 00000 n +0000901025 00000 n +0000901212 00000 n +0000901399 00000 n +0000901587 00000 n +0000901775 00000 n +0000901963 00000 n +0000902150 00000 n +0000902338 00000 n +0000902526 00000 n +0000902714 00000 n +0000902902 00000 n +0000903090 00000 n +0000903278 00000 n +0000903466 00000 n +0000903654 00000 n +0000903842 00000 n +0000904029 00000 n +0000904216 00000 n +0000904404 00000 n +0000904592 00000 n +0000904780 00000 n +0000904968 00000 n +0001247534 00000 n +0000916718 00000 n +0000908411 00000 n +0000905315 00000 n +0000916539 00000 n +0000908918 00000 n +0000909106 00000 n +0000909294 00000 n +0000909479 00000 n +0000909667 00000 n +0000909855 00000 n +0000910043 00000 n +0000910229 00000 n +0000916599 00000 n +0000910416 00000 n +0000910602 00000 n +0000910789 00000 n +0000910976 00000 n +0000911164 00000 n +0000911352 00000 n +0000916659 00000 n +0000911540 00000 n +0000911728 00000 n +0000911916 00000 n +0000912104 00000 n +0000912292 00000 n +0000912480 00000 n +0000912668 00000 n +0000912856 00000 n +0000913010 00000 n +0000913198 00000 n +0000913385 00000 n +0000913573 00000 n +0000913760 00000 n +0000913914 00000 n +0000914101 00000 n +0000914289 00000 n +0000914475 00000 n +0000914663 00000 n +0000914851 00000 n +0000915039 00000 n +0000915227 00000 n +0000915415 00000 n +0000915603 00000 n +0000915791 00000 n +0000915979 00000 n +0000916165 00000 n +0000916352 00000 n +0000924609 00000 n +0000918814 00000 n +0000916831 00000 n +0000924490 00000 n +0000919213 00000 n +0000919401 00000 n +0000919589 00000 n +0000919777 00000 n +0000924550 00000 n +0000919965 00000 n +0000920152 00000 n +0000920339 00000 n +0000920527 00000 n +0000920715 00000 n +0000920902 00000 n +0000921056 00000 n +0000921244 00000 n +0000921398 00000 n +0000921586 00000 n +0000921774 00000 n +0000921962 00000 n +0000922116 00000 n +0000922304 00000 n +0000922458 00000 n +0000922645 00000 n +0000922799 00000 n +0000922987 00000 n +0000923175 00000 n +0000923363 00000 n +0000923551 00000 n +0000923739 00000 n +0000923927 00000 n +0000924115 00000 n +0000924303 00000 n +0000929222 00000 n +0000926275 00000 n +0000924722 00000 n +0000928923 00000 n +0000929102 00000 n +0000926530 00000 n +0000926705 00000 n +0000929162 00000 n +0000926859 00000 n +0000927047 00000 n +0000927235 00000 n +0000927423 00000 n +0000927611 00000 n +0000927799 00000 n +0000927987 00000 n +0000928173 00000 n +0000928360 00000 n +0000928547 00000 n +0000928735 00000 n +0001143974 00000 n +0000934249 00000 n +0000931241 00000 n +0000929361 00000 n +0000933890 00000 n +0000934069 00000 n +0000931496 00000 n +0000931671 00000 n +0000934129 00000 n +0000931825 00000 n +0000932013 00000 n +0000932201 00000 n +0000932389 00000 n +0000932576 00000 n +0000932763 00000 n +0000932951 00000 n +0000934189 00000 n +0000933139 00000 n +0000933327 00000 n +0000933514 00000 n +0000933702 00000 n +0001143941 00000 n +0000939640 00000 n +0000936382 00000 n +0000934388 00000 n +0000939161 00000 n +0000939340 00000 n +0000936646 00000 n +0000936822 00000 n +0000939400 00000 n +0000936976 00000 n +0000939460 00000 n +0000937129 00000 n +0000937317 00000 n +0000937505 00000 n +0000937692 00000 n +0000937879 00000 n +0000939520 00000 n +0000938067 00000 n +0000938255 00000 n +0000938443 00000 n +0000938631 00000 n +0000939580 00000 n +0000938819 00000 n +0000938973 00000 n +0001143908 00000 n +0000943949 00000 n +0000941922 00000 n +0000939766 00000 n +0000943590 00000 n +0000943769 00000 n +0000942132 00000 n +0000942308 00000 n +0000943829 00000 n +0000942462 00000 n +0000942650 00000 n +0000942838 00000 n +0000943889 00000 n +0000943026 00000 n +0000943214 00000 n +0000943402 00000 n +0001247659 00000 n +0001143875 00000 n +0000949125 00000 n +0000946253 00000 n +0000944075 00000 n +0000948945 00000 n +0000949005 00000 n +0000946508 00000 n +0000946695 00000 n +0000946882 00000 n +0000949065 00000 n +0000947069 00000 n +0000947256 00000 n +0000947444 00000 n +0000947632 00000 n +0000947820 00000 n +0000948008 00000 n +0000948195 00000 n +0000948383 00000 n +0000948570 00000 n +0000948757 00000 n +0000953857 00000 n +0000951258 00000 n +0000949225 00000 n +0000953559 00000 n +0000953619 00000 n +0000951495 00000 n +0000951683 00000 n +0000953679 00000 n +0000951871 00000 n +0000952059 00000 n +0000952247 00000 n +0000952434 00000 n +0000952622 00000 n +0000952810 00000 n +0000953738 00000 n +0000952997 00000 n +0000953798 00000 n +0000953184 00000 n +0000953371 00000 n +0000959076 00000 n +0000956133 00000 n +0000953970 00000 n +0000958777 00000 n +0000958956 00000 n +0000956388 00000 n +0000956560 00000 n +0000959016 00000 n +0000956714 00000 n +0000956901 00000 n +0000957089 00000 n +0000957277 00000 n +0000957464 00000 n +0000957652 00000 n +0000957839 00000 n +0000958027 00000 n +0000958215 00000 n +0000958403 00000 n +0000958591 00000 n +0001143842 00000 n +0000961219 00000 n +0000960855 00000 n +0000959202 00000 n +0000960981 00000 n +0000962850 00000 n +0000962664 00000 n +0000961305 00000 n +0000962790 00000 n +0000964556 00000 n +0000964370 00000 n +0000962936 00000 n +0000964496 00000 n +0001247784 00000 n +0000966194 00000 n +0000966008 00000 n +0000964642 00000 n +0000966134 00000 n +0000967886 00000 n +0000967700 00000 n +0000966280 00000 n +0000967826 00000 n +0000969209 00000 n +0000969023 00000 n +0000967972 00000 n +0000969149 00000 n +0000971692 00000 n +0000971387 00000 n +0000969295 00000 n +0000971513 00000 n +0000972414 00000 n +0000972228 00000 n +0000971778 00000 n +0000972354 00000 n +0000974136 00000 n +0000973831 00000 n +0000972500 00000 n +0000973957 00000 n +0001247909 00000 n +0000975279 00000 n +0000975093 00000 n +0000974222 00000 n +0000975219 00000 n +0000976945 00000 n +0000976640 00000 n +0000975365 00000 n +0000976766 00000 n +0000979103 00000 n +0000978798 00000 n +0000977031 00000 n +0000978924 00000 n +0000980492 00000 n +0000980306 00000 n +0000979189 00000 n +0000980432 00000 n +0000982321 00000 n +0000982016 00000 n +0000980578 00000 n +0000982142 00000 n +0000984791 00000 n +0000984486 00000 n +0000982407 00000 n +0000984612 00000 n +0001248034 00000 n +0000986506 00000 n +0000986320 00000 n +0000984877 00000 n +0000986446 00000 n +0000988451 00000 n +0000988265 00000 n +0000986592 00000 n +0000988391 00000 n +0000990511 00000 n +0000990325 00000 n +0000988537 00000 n +0000990451 00000 n +0000992619 00000 n +0000992433 00000 n +0000990597 00000 n +0000992559 00000 n +0000994371 00000 n +0000994185 00000 n +0000992705 00000 n +0000994311 00000 n +0000995987 00000 n +0000995801 00000 n +0000994457 00000 n +0000995927 00000 n +0001248159 00000 n +0000998548 00000 n +0000998243 00000 n +0000996073 00000 n +0000998369 00000 n +0000999473 00000 n +0000999287 00000 n +0000998634 00000 n +0000999413 00000 n +0001001969 00000 n +0001001664 00000 n +0000999559 00000 n +0001001790 00000 n +0001003303 00000 n +0001003117 00000 n +0001002055 00000 n +0001003243 00000 n +0001004638 00000 n +0001004452 00000 n +0001003389 00000 n +0001004578 00000 n +0001006320 00000 n +0001006134 00000 n +0001004724 00000 n +0001006260 00000 n +0001248284 00000 n +0001008728 00000 n +0001008423 00000 n +0001006406 00000 n +0001008549 00000 n +0001010000 00000 n +0001009814 00000 n +0001008814 00000 n +0001009940 00000 n +0001012371 00000 n +0001012066 00000 n +0001010086 00000 n +0001012192 00000 n +0001013919 00000 n +0001013733 00000 n +0001012457 00000 n +0001013859 00000 n +0001015477 00000 n +0001015291 00000 n +0001014005 00000 n +0001015417 00000 n +0001017054 00000 n +0001016868 00000 n +0001015563 00000 n +0001016994 00000 n +0001248409 00000 n +0001018427 00000 n +0001018241 00000 n +0001017140 00000 n +0001018367 00000 n +0001019413 00000 n +0001019227 00000 n +0001018513 00000 n +0001019353 00000 n +0001021742 00000 n +0001021437 00000 n +0001019499 00000 n +0001021563 00000 n +0001022711 00000 n +0001022525 00000 n +0001021828 00000 n +0001022651 00000 n +0001024986 00000 n +0001024681 00000 n +0001022797 00000 n +0001024807 00000 n +0001024867 00000 n +0001026872 00000 n +0001026686 00000 n +0001025072 00000 n +0001026812 00000 n +0001248534 00000 n +0001029355 00000 n +0001029050 00000 n +0001026958 00000 n +0001029176 00000 n +0001030732 00000 n +0001030546 00000 n +0001029441 00000 n +0001030672 00000 n +0001031924 00000 n +0001031738 00000 n +0001030818 00000 n +0001031864 00000 n +0001034369 00000 n +0001034064 00000 n +0001032010 00000 n +0001034190 00000 n +0001035744 00000 n +0001035558 00000 n +0001034455 00000 n +0001035684 00000 n +0001037470 00000 n +0001037284 00000 n +0001035830 00000 n +0001037410 00000 n +0001248659 00000 n +0001039234 00000 n +0001039048 00000 n +0001037556 00000 n +0001039174 00000 n +0001041143 00000 n +0001040957 00000 n +0001039320 00000 n +0001041083 00000 n +0001042688 00000 n +0001042502 00000 n +0001041229 00000 n +0001042628 00000 n +0001043907 00000 n +0001043721 00000 n +0001042774 00000 n +0001043847 00000 n +0001046259 00000 n +0001045954 00000 n +0001043993 00000 n +0001046080 00000 n +0001047833 00000 n +0001047647 00000 n +0001046345 00000 n +0001047773 00000 n +0001248784 00000 n +0001049827 00000 n +0001049641 00000 n +0001047919 00000 n +0001049767 00000 n +0001051065 00000 n +0001050879 00000 n +0001049913 00000 n +0001051005 00000 n +0001066356 00000 n +0001054834 00000 n +0001051151 00000 n +0001066296 00000 n +0001055593 00000 n +0001055748 00000 n +0001055903 00000 n +0001056058 00000 n +0001056214 00000 n +0001056370 00000 n +0001056526 00000 n +0001056682 00000 n +0001056838 00000 n +0001056994 00000 n +0001057150 00000 n +0001057306 00000 n +0001057462 00000 n +0001057618 00000 n +0001057774 00000 n +0001057929 00000 n +0001058084 00000 n +0001058238 00000 n +0001058393 00000 n +0001058548 00000 n +0001058703 00000 n +0001058858 00000 n +0001059013 00000 n +0001059167 00000 n +0001059323 00000 n +0001059479 00000 n +0001059634 00000 n +0001059789 00000 n +0001059942 00000 n +0001060097 00000 n +0001060250 00000 n +0001060406 00000 n +0001060561 00000 n +0001060717 00000 n +0001060873 00000 n +0001061029 00000 n +0001061185 00000 n +0001061341 00000 n +0001061497 00000 n +0001061652 00000 n +0001061807 00000 n +0001061963 00000 n +0001062119 00000 n +0001062274 00000 n +0001062430 00000 n +0001062585 00000 n +0001062741 00000 n +0001062896 00000 n +0001063051 00000 n +0001063205 00000 n +0001063359 00000 n +0001063514 00000 n +0001063669 00000 n +0001063823 00000 n +0001063978 00000 n +0001064133 00000 n +0001064287 00000 n +0001064440 00000 n +0001064594 00000 n +0001064748 00000 n +0001064902 00000 n +0001065056 00000 n +0001065210 00000 n +0001065365 00000 n +0001065520 00000 n +0001065676 00000 n +0001065832 00000 n +0001065987 00000 n +0001066143 00000 n +0001080323 00000 n +0001069648 00000 n +0001066442 00000 n +0001080263 00000 n +0001070362 00000 n +0001070516 00000 n +0001070670 00000 n +0001070822 00000 n +0001070976 00000 n +0001071130 00000 n +0001071283 00000 n +0001071437 00000 n +0001071591 00000 n +0001071744 00000 n +0001071898 00000 n +0001072053 00000 n +0001072206 00000 n +0001072362 00000 n +0001072517 00000 n +0001072672 00000 n +0001072826 00000 n +0001072981 00000 n +0001073136 00000 n +0001073291 00000 n +0001073446 00000 n +0001073601 00000 n +0001073756 00000 n +0001073910 00000 n +0001074065 00000 n +0001074219 00000 n +0001074374 00000 n +0001074529 00000 n +0001074683 00000 n +0001074838 00000 n +0001074993 00000 n +0001075147 00000 n +0001075302 00000 n +0001075457 00000 n +0001075610 00000 n +0001075765 00000 n +0001075918 00000 n +0001076073 00000 n +0001076228 00000 n +0001076383 00000 n +0001076539 00000 n +0001076695 00000 n +0001076851 00000 n +0001077007 00000 n +0001077163 00000 n +0001077317 00000 n +0001077469 00000 n +0001077623 00000 n +0001077777 00000 n +0001077931 00000 n +0001078086 00000 n +0001078240 00000 n +0001078395 00000 n +0001078550 00000 n +0001078705 00000 n +0001078861 00000 n +0001079017 00000 n +0001079173 00000 n +0001079329 00000 n +0001079485 00000 n +0001079641 00000 n +0001079797 00000 n +0001079953 00000 n +0001080108 00000 n +0001098160 00000 n +0001084698 00000 n +0001080409 00000 n +0001098100 00000 n +0001085565 00000 n +0001085721 00000 n +0001085876 00000 n +0001086031 00000 n +0001086187 00000 n +0001086343 00000 n +0001086498 00000 n +0001086653 00000 n +0001086808 00000 n +0001086963 00000 n +0001087118 00000 n +0001087273 00000 n +0001087428 00000 n +0001087582 00000 n +0001087734 00000 n +0001087887 00000 n +0001088041 00000 n +0001088196 00000 n +0001088351 00000 n +0001088506 00000 n +0001088661 00000 n +0001088816 00000 n +0001088971 00000 n +0001089126 00000 n +0001089279 00000 n +0001089434 00000 n +0001089589 00000 n +0001089744 00000 n +0001089899 00000 n +0001090051 00000 n +0001090206 00000 n +0001090361 00000 n +0001090516 00000 n +0001090671 00000 n +0001090826 00000 n +0001090980 00000 n +0001091135 00000 n +0001091289 00000 n +0001091444 00000 n +0001091599 00000 n +0001091753 00000 n +0001091907 00000 n +0001092060 00000 n +0001092214 00000 n +0001092368 00000 n +0001092523 00000 n +0001092677 00000 n +0001092833 00000 n +0001092989 00000 n +0001093145 00000 n +0001093301 00000 n +0001093457 00000 n +0001093611 00000 n +0001093767 00000 n +0001093923 00000 n +0001094079 00000 n +0001094235 00000 n +0001094390 00000 n +0001094545 00000 n +0001094701 00000 n +0001094857 00000 n +0001095012 00000 n +0001095166 00000 n +0001095321 00000 n +0001095476 00000 n +0001095628 00000 n +0001095783 00000 n +0001095937 00000 n +0001096091 00000 n +0001096245 00000 n +0001096400 00000 n +0001096554 00000 n +0001096708 00000 n +0001096863 00000 n +0001097018 00000 n +0001097172 00000 n +0001097327 00000 n +0001097482 00000 n +0001097636 00000 n +0001097790 00000 n +0001097945 00000 n +0001111329 00000 n +0001101169 00000 n +0001098246 00000 n +0001111269 00000 n +0001101856 00000 n +0001102010 00000 n +0001102166 00000 n +0001102321 00000 n +0001102476 00000 n +0001102628 00000 n +0001102782 00000 n +0001102937 00000 n +0001103090 00000 n +0001103245 00000 n +0001103401 00000 n +0001103556 00000 n +0001103710 00000 n +0001103865 00000 n +0001104020 00000 n +0001104173 00000 n +0001104329 00000 n +0001104484 00000 n +0001104639 00000 n +0001104793 00000 n +0001104946 00000 n +0001105099 00000 n +0001105251 00000 n +0001105404 00000 n +0001105557 00000 n +0001105709 00000 n +0001105862 00000 n +0001106015 00000 n +0001106167 00000 n +0001106320 00000 n +0001106475 00000 n +0001106629 00000 n +0001106783 00000 n +0001106938 00000 n +0001107092 00000 n +0001107247 00000 n +0001107402 00000 n +0001107557 00000 n +0001107712 00000 n +0001107867 00000 n +0001108022 00000 n +0001108177 00000 n +0001108332 00000 n +0001108488 00000 n +0001108643 00000 n +0001108796 00000 n +0001108951 00000 n +0001109106 00000 n +0001109260 00000 n +0001109415 00000 n +0001109570 00000 n +0001109724 00000 n +0001109879 00000 n +0001110034 00000 n +0001110188 00000 n +0001110342 00000 n +0001110497 00000 n +0001110652 00000 n +0001110807 00000 n +0001110962 00000 n +0001111116 00000 n +0001248909 00000 n +0001128122 00000 n +0001115160 00000 n +0001111415 00000 n +0001128062 00000 n +0001116000 00000 n +0001116155 00000 n +0001116310 00000 n +0001116463 00000 n +0001116618 00000 n +0001116774 00000 n +0001116929 00000 n +0001117083 00000 n +0001117238 00000 n +0001117393 00000 n +0001117548 00000 n +0001117702 00000 n +0001117857 00000 n +0001118012 00000 n +0001118166 00000 n +0001118321 00000 n +0001118476 00000 n +0001118630 00000 n +0001118785 00000 n +0001118941 00000 n +0001119095 00000 n +0001119249 00000 n +0001119404 00000 n +0001119559 00000 n +0001119713 00000 n +0001119867 00000 n +0001120022 00000 n +0001120176 00000 n +0001120332 00000 n +0001120487 00000 n +0001120641 00000 n +0001120796 00000 n +0001120951 00000 n +0001121106 00000 n +0001121258 00000 n +0001121413 00000 n +0001121567 00000 n +0001121722 00000 n +0001121877 00000 n +0001122032 00000 n +0001122185 00000 n +0001122340 00000 n +0001122495 00000 n +0001122650 00000 n +0001122805 00000 n +0001122960 00000 n +0001123113 00000 n +0001123268 00000 n +0001123423 00000 n +0001123578 00000 n +0001123732 00000 n +0001123886 00000 n +0001124039 00000 n +0001124194 00000 n +0001124349 00000 n +0001124504 00000 n +0001124659 00000 n +0001124813 00000 n +0001124968 00000 n +0001125123 00000 n +0001125277 00000 n +0001125432 00000 n +0001125586 00000 n +0001125741 00000 n +0001125896 00000 n +0001126051 00000 n +0001126206 00000 n +0001126360 00000 n +0001126514 00000 n +0001126669 00000 n +0001126824 00000 n +0001126979 00000 n +0001127134 00000 n +0001127289 00000 n +0001127444 00000 n +0001127599 00000 n +0001127754 00000 n +0001127909 00000 n +0001143756 00000 n +0001132089 00000 n +0001128208 00000 n +0001143696 00000 n +0001132857 00000 n +0001133011 00000 n +0001133166 00000 n +0001133321 00000 n +0001133474 00000 n +0001133629 00000 n +0001133783 00000 n +0001133937 00000 n +0001134092 00000 n +0001134247 00000 n +0001134402 00000 n +0001134557 00000 n +0001134710 00000 n +0001134865 00000 n +0001135020 00000 n +0001135175 00000 n +0001135329 00000 n +0001135483 00000 n +0001135637 00000 n +0001135792 00000 n +0001135947 00000 n +0001136101 00000 n +0001136256 00000 n +0001136411 00000 n +0001136566 00000 n +0001136719 00000 n +0001136874 00000 n +0001137028 00000 n +0001137183 00000 n +0001137337 00000 n +0001137492 00000 n +0001137647 00000 n +0001137802 00000 n +0001137957 00000 n +0001138110 00000 n +0001138264 00000 n +0001138418 00000 n +0001138573 00000 n +0001138728 00000 n +0001138882 00000 n +0001139036 00000 n +0001139190 00000 n +0001139344 00000 n +0001139498 00000 n +0001139653 00000 n +0001139808 00000 n +0001139964 00000 n +0001140118 00000 n +0001140273 00000 n +0001140427 00000 n +0001140583 00000 n +0001140739 00000 n +0001140894 00000 n +0001141050 00000 n +0001141204 00000 n +0001141360 00000 n +0001141514 00000 n +0001141670 00000 n +0001141825 00000 n +0001141981 00000 n +0001142137 00000 n +0001142293 00000 n +0001142449 00000 n +0001142605 00000 n +0001142761 00000 n +0001142917 00000 n +0001143073 00000 n +0001143229 00000 n +0001143385 00000 n +0001143540 00000 n +0001145459 00000 n +0001158368 00000 n +0001176406 00000 n +0001179043 00000 n +0001179012 00000 n +0001181580 00000 n +0001181334 00000 n +0001200247 00000 n +0001221781 00000 n +0001243077 00000 n +0001249007 00000 n +0001249128 00000 n +0001249254 00000 n +0001249380 00000 n +0001249506 00000 n +0001249632 00000 n +0001249758 00000 n +0001249884 00000 n +0001249973 00000 n +0001250100 00000 n +0001250190 00000 n +0001250264 00000 n +0001261136 00000 n +0001316039 00000 n +0001316080 00000 n +0001316120 00000 n +0001316254 00000 n +trailer +<< +/Size 5675 +/Root 5673 0 R +/Info 5674 0 R +/ID [ ] +>> +startxref +1316518 +%%EOF diff --git a/third_party/uip-1.0/lib/memb.c b/third_party/uip-1.0/lib/memb.c new file mode 100644 index 0000000..91df04b --- /dev/null +++ b/third_party/uip-1.0/lib/memb.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: memb.c,v 1.1 2006/06/12 08:21:43 adam Exp $ + */ + +/** + * \addtogroup memb + * @{ + */ + + /** + * \file + * Memory block allocation routines. + * \author Adam Dunkels + */ +#include + +#include "memb.h" + +/*---------------------------------------------------------------------------*/ +void +memb_init(struct memb_blocks *m) +{ + memset(m->count, 0, m->num); + memset(m->mem, 0, m->size * m->num); +} +/*---------------------------------------------------------------------------*/ +void * +memb_alloc(struct memb_blocks *m) +{ + int i; + + for(i = 0; i < m->num; ++i) { + if(m->count[i] == 0) { + /* If this block was unused, we increase the reference count to + indicate that it now is used and return a pointer to the + memory block. */ + ++(m->count[i]); + return (void *)((char *)m->mem + (i * m->size)); + } + } + + /* No free block was found, so we return NULL to indicate failure to + allocate block. */ + return NULL; +} +/*---------------------------------------------------------------------------*/ +char +memb_free(struct memb_blocks *m, void *ptr) +{ + int i; + char *ptr2; + + /* Walk through the list of blocks and try to find the block to + which the pointer "ptr" points to. */ + ptr2 = (char *)m->mem; + for(i = 0; i < m->num; ++i) { + + if(ptr2 == (char *)ptr) { + /* We've found to block to which "ptr" points so we decrease the + reference count and return the new value of it. */ + if(m->count[i] > 0) { + /* Make sure that we don't deallocate free memory. */ + --(m->count[i]); + } + return m->count[i]; + } + ptr2 += m->size; + } + return -1; +} +/*---------------------------------------------------------------------------*/ + +/** @} */ diff --git a/third_party/uip-1.0/lib/memb.h b/third_party/uip-1.0/lib/memb.h new file mode 100644 index 0000000..676392c --- /dev/null +++ b/third_party/uip-1.0/lib/memb.h @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: memb.h,v 1.1 2006/06/12 08:21:43 adam Exp $ + */ + +/** + * \defgroup memb Memory block management functions + * + * The memory block allocation routines provide a simple yet powerful + * set of functions for managing a set of memory blocks of fixed + * size. A set of memory blocks is statically declared with the + * MEMB() macro. Memory blocks are allocated from the declared + * memory by the memb_alloc() function, and are deallocated with the + * memb_free() function. + * + * \note Because of namespace clashes only one MEMB() can be + * declared per C module, and the name scope of a MEMB() memory + * block is local to each C module. + * + * The following example shows how to declare and use a memory block + * called "cmem" which has 8 chunks of memory with each memory chunk + * being 20 bytes large. + * + * @{ + */ + + +/** + * \file + * Memory block allocation routines. + * \author + * Adam Dunkels + * + */ + +#ifndef __MEMB_H__ +#define __MEMB_H__ + +/* + * Here we define a C preprocessing macro for concatenating to + * strings. We need use two macros in order to allow concatenation of + * two #defined macros. + */ +#define MEMB_CONCAT2(s1, s2) s1##s2 +#define MEMB_CONCAT(s1, s2) MEMB_CONCAT2(s1, s2) + +/** + * Declare a memory block. + * + * This macro is used to staticall declare a block of memory that can + * be used by the block allocation functions. The macro statically + * declares a C array with a size that matches the specified number of + * blocks and their individual sizes. + * + * Example: + \code +MEMB(connections, sizeof(struct connection), 16); + \endcode + * + * \param name The name of the memory block (later used with + * memb_init(), memb_alloc() and memb_free()). + * + * \param size The size of each memory chunk, in bytes. + * + * \param num The total number of memory chunks in the block. + * + */ +#define MEMB(name, structure, num) \ + static char MEMB_CONCAT(name,_memb_count)[num]; \ + static structure MEMB_CONCAT(name,_memb_mem)[num]; \ + static struct memb_blocks name = {sizeof(structure), num, \ + MEMB_CONCAT(name,_memb_count), \ + (void *)MEMB_CONCAT(name,_memb_mem)} + +struct memb_blocks { + unsigned short size; + unsigned short num; + char *count; + void *mem; +}; + +/** + * Initialize a memory block that was declared with MEMB(). + * + * \param m A memory block previosly declared with MEMB(). + */ +void memb_init(struct memb_blocks *m); + +/** + * Allocate a memory block from a block of memory declared with MEMB(). + * + * \param m A memory block previosly declared with MEMB(). + */ +void *memb_alloc(struct memb_blocks *m); + +/** + * Deallocate a memory block from a memory block previously declared + * with MEMB(). + * + * \param m m A memory block previosly declared with MEMB(). + * + * \param ptr A pointer to the memory block that is to be deallocated. + * + * \return The new reference count for the memory block (should be 0 + * if successfully deallocated) or -1 if the pointer "ptr" did not + * point to a legal memory block. + */ +char memb_free(struct memb_blocks *m, void *ptr); + +/** @} */ + +#endif /* __MEMB_H__ */ diff --git a/third_party/uip-1.0/uip-1.0-changelog.txt b/third_party/uip-1.0/uip-1.0-changelog.txt new file mode 100644 index 0000000..7a97704 --- /dev/null +++ b/third_party/uip-1.0/uip-1.0-changelog.txt @@ -0,0 +1,98 @@ +* A new API: protosockets that are similar to BSD sockets but does not + require any underlying multithreading system. + +* Very rudimentary IPv6 support + +* New application: DHCP client. Web server rewritten with protosockets. + +* Removed uIP zero-copy functionality in order to simplify uIP device + driver coding: outbound packets are now *always* stored in full in + the uip_buf buffer. + +* Checksum computation is now part of uip.c, but it still is possible + to implement them in assembly code by specifying a configuration + option. Checksum code now runs on architectures with 2-byte alignment. + +* Added TCP persistent timer. + +* Made all IP address representations use the new uip_ipaddr_ip + datatype for clarity. + +* Updated window behavior so that sending to a host with a small open + window works better now. + +* UDP API change: uip_udp_new() now takes port numbers in network byte + order like TCP functions. + +* Allow reception of packets when no IP address is configured to make + DHCP work. + +* Moved Ethernet address into main uIP module from ARP module. + +* Made constants explicit #defines and moved them out of the code + (header sizes, TCP options, TCP header length field). + +* If uip_len is less than that reported by the IP header, the packet + is discarded. If uip_len is greater than the length reported by the + IP header, uip_len is adjusted. + +* Moved header size definitions into header file. + +* Added uIP call for polling an application without triggering any + timer events. Removed redundant assignments of uip_len and uip_slen. + +* Removed compiler warning about icmp_input label being defined when + UIP_PINGADDRCONF was not used. + +* Added UIP_APPDATA_SIZE macro that holds the available buffer size + for user data. + +* Added uip_udp_bind() call. + +* Moved checksum code into main uIP module. + +* Switched the TCP, UDP and IP header structures to be structs rather + than typedefs. + +* Prefixed TCP state names with UIP_ to avoid name space + contamination. + +* Changed declarations of uip_appdatap and friends to void * to avoid + explicit typecasts. + +* Bugfixes + + o TCP: Fixed bug with high byte of peer window size. + + o TCP: Fixed bug that in some cases prevented concurrent reception and + transmission of TCP data. + + o TCP: uip_connect() didn't correctly calculate age of TIME_WAIT + connections. + + o TCP: Array index for uip_conns[] array was out of bounds in + comparison. Comparison changed to make index within bounds. + + o TCP: if the remote host crashes and tries to reestablish an old + connection, uIP should respond with an ACK with the correct + sequence and acknowledgment numbers, to which the remote host + should respond with an ACK. uIP did not respond with the correct + ACK. + + o TCP: Fixed check for SYNACK segment: now checks only relevant TCP + control flags and discards flags reserved for future expansion. + + o TCP: Fixed bug where uIP did not inform application that a connection + had been aborted during an active open. + + o TCP: FIN segment was accepted even though application had stopped + incoming data with uip_stop(). + + o TCP: A FINACK segment would not always correctly acknowledge data. + + o UDP: checksums are now calculated after all fields have been + filled in. + + o UDP: network byte order on lastport in uip_udp_new(). + + o IP: memset() bugs in IP fragment reassembly code fixed. diff --git a/third_party/uip-1.0/uip/Makefile.include b/third_party/uip-1.0/uip/Makefile.include new file mode 100644 index 0000000..43ba247 --- /dev/null +++ b/third_party/uip-1.0/uip/Makefile.include @@ -0,0 +1,47 @@ + + +ifdef APPS + APPDIRS = $(foreach APP, $(APPS), ../apps/$(APP)) + -include $(foreach APP, $(APPS), ../apps/$(APP)/Makefile.$(APP)) + CFLAGS += $(addprefix -I../apps/,$(APPS)) +endif + +ifndef CCDEP + CCDEP = $(CC) +endif +ifndef CCDEPCFLAGS + CCDEPCFLAGS = $(CFLAGS) +endif +ifndef OBJECTDIR + OBJECTDIR = obj +endif + +ifeq (${wildcard $(OBJECTDIR)},) + DUMMY := ${shell mkdir $(OBJECTDIR)} +endif + + +vpath %.c . ../uip ../lib $(APPDIRS) + +$(OBJECTDIR)/%.o: %.c + $(CC) $(CFLAGS) -c $< -o $@ + +$(OBJECTDIR)/%.d: %.c + @set -e; rm -f $@; \ + $(CCDEP) -MM $(CCDEPCFLAGS) $< > $@.$$$$; \ + sed 's,\($*\)\.o[ :]*,$(OBJECTDIR)/\1.o $@ : ,g' < $@.$$$$ > $@; \ + rm -f $@.$$$$ + +UIP_SOURCES=uip.c uip_arp.c uiplib.c psock.c timer.c uip-neighbor.c + + +ifneq ($(MAKECMDGOALS),clean) +-include $(addprefix $(OBJECTDIR)/,$(UIP_SOURCES:.c=.d) \ + $(APP_SOURCES:.c=.d)) +endif + +uip.a: ${addprefix $(OBJECTDIR)/, $(UIP_SOURCES:.c=.o)} + $(AR) rcf $@ $^ + +apps.a: ${addprefix $(OBJECTDIR)/, $(APP_SOURCES:.c=.o)} + $(AR) rcf $@ $^ diff --git a/third_party/uip-1.0/uip/clock.h b/third_party/uip-1.0/uip/clock.h new file mode 100644 index 0000000..dae6874 --- /dev/null +++ b/third_party/uip-1.0/uip/clock.h @@ -0,0 +1,88 @@ +/** + * \defgroup clock Clock interface + * + * The clock interface is the interface between the \ref timer "timer library" + * and the platform specific clock functionality. The clock + * interface must be implemented for each platform that uses the \ref + * timer "timer library". + * + * The clock interface does only one this: it measures time. The clock + * interface provides a macro, CLOCK_SECOND, which corresponds to one + * second of system time. + * + * \sa \ref timer "Timer library" + * + * @{ + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: clock.h,v 1.3 2006/06/11 21:46:39 adam Exp $ + */ +#ifndef __CLOCK_H__ +#define __CLOCK_H__ + +#include "clock-arch.h" + +/** + * Initialize the clock library. + * + * This function initializes the clock library and should be called + * from the main() function of the system. + * + */ +void clock_init(void); + +/** + * Get the current clock time. + * + * This function returns the current system clock time. + * + * \return The current clock time, measured in system ticks. + */ +clock_time_t clock_time(void); + +/** + * A second, measured in system clock time. + * + * \hideinitializer + */ +#ifdef CLOCK_CONF_SECOND +#define CLOCK_SECOND CLOCK_CONF_SECOND +#else +#define CLOCK_SECOND (clock_time_t)32 +#endif + +#endif /* __CLOCK_H__ */ + +/** @} */ diff --git a/third_party/uip-1.0/uip/lc-addrlabels.h b/third_party/uip-1.0/uip/lc-addrlabels.h new file mode 100644 index 0000000..9dff03d --- /dev/null +++ b/third_party/uip-1.0/uip/lc-addrlabels.h @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2004-2005, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: lc-addrlabels.h,v 1.3 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \addtogroup lc + * @{ + */ + +/** + * \file + * Implementation of local continuations based on the "Labels as + * values" feature of gcc + * \author + * Adam Dunkels + * + * This implementation of local continuations is based on a special + * feature of the GCC C compiler called "labels as values". This + * feature allows assigning pointers with the address of the code + * corresponding to a particular C label. + * + * For more information, see the GCC documentation: + * http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html + * + * Thanks to dividuum for finding the nice local scope label + * implementation. + */ + +#ifndef __LC_ADDRLABELS_H__ +#define __LC_ADDRLABELS_H__ + +/** \hideinitializer */ +typedef void * lc_t; + +#define LC_INIT(s) s = NULL + + +#define LC_RESUME(s) \ + do { \ + if(s != NULL) { \ + goto *s; \ + } \ + } while(0) + +#define LC_SET(s) \ + do { ({ __label__ resume; resume: (s) = &&resume; }); }while(0) + +#define LC_END(s) + +#endif /* __LC_ADDRLABELS_H__ */ + +/** @} */ diff --git a/third_party/uip-1.0/uip/lc-switch.h b/third_party/uip-1.0/uip/lc-switch.h new file mode 100644 index 0000000..17c8811 --- /dev/null +++ b/third_party/uip-1.0/uip/lc-switch.h @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2004-2005, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: lc-switch.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \addtogroup lc + * @{ + */ + +/** + * \file + * Implementation of local continuations based on switch() statment + * \author Adam Dunkels + * + * This implementation of local continuations uses the C switch() + * statement to resume execution of a function somewhere inside the + * function's body. The implementation is based on the fact that + * switch() statements are able to jump directly into the bodies of + * control structures such as if() or while() statmenets. + * + * This implementation borrows heavily from Simon Tatham's coroutines + * implementation in C: + * http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html + */ + +#ifndef __LC_SWITCH_H__ +#define __LC_SWTICH_H__ + +/* WARNING! lc implementation using switch() does not work if an + LC_SET() is done within another switch() statement! */ + +/** \hideinitializer */ +typedef unsigned short lc_t; + +#define LC_INIT(s) s = 0; + +#define LC_RESUME(s) switch(s) { case 0: + +#define LC_SET(s) s = __LINE__; case __LINE__: + +#define LC_END(s) } + +#endif /* __LC_SWITCH_H__ */ + +/** @} */ diff --git a/third_party/uip-1.0/uip/lc.h b/third_party/uip-1.0/uip/lc.h new file mode 100644 index 0000000..3ad83cd --- /dev/null +++ b/third_party/uip-1.0/uip/lc.h @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2004-2005, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: lc.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \addtogroup pt + * @{ + */ + +/** + * \defgroup lc Local continuations + * @{ + * + * Local continuations form the basis for implementing protothreads. A + * local continuation can be set in a specific function to + * capture the state of the function. After a local continuation has + * been set can be resumed in order to restore the state of the + * function at the point where the local continuation was set. + * + * + */ + +/** + * \file lc.h + * Local continuations + * \author + * Adam Dunkels + * + */ + +#ifdef DOXYGEN +/** + * Initialize a local continuation. + * + * This operation initializes the local continuation, thereby + * unsetting any previously set continuation state. + * + * \hideinitializer + */ +#define LC_INIT(lc) + +/** + * Set a local continuation. + * + * The set operation saves the state of the function at the point + * where the operation is executed. As far as the set operation is + * concerned, the state of the function does not include the + * call-stack or local (automatic) variables, but only the program + * counter and such CPU registers that needs to be saved. + * + * \hideinitializer + */ +#define LC_SET(lc) + +/** + * Resume a local continuation. + * + * The resume operation resumes a previously set local continuation, thus + * restoring the state in which the function was when the local + * continuation was set. If the local continuation has not been + * previously set, the resume operation does nothing. + * + * \hideinitializer + */ +#define LC_RESUME(lc) + +/** + * Mark the end of local continuation usage. + * + * The end operation signifies that local continuations should not be + * used any more in the function. This operation is not needed for + * most implementations of local continuation, but is required by a + * few implementations. + * + * \hideinitializer + */ +#define LC_END(lc) + +/** + * \var typedef lc_t; + * + * The local continuation type. + * + * \hideinitializer + */ +#endif /* DOXYGEN */ + +#ifndef __LC_H__ +#define __LC_H__ + +#ifdef LC_CONF_INCLUDE +#include LC_CONF_INCLUDE +#else +#include "lc-switch.h" +#endif /* LC_CONF_INCLUDE */ + +#endif /* __LC_H__ */ + +/** @} */ +/** @} */ diff --git a/third_party/uip-1.0/uip/psock.c b/third_party/uip-1.0/uip/psock.c new file mode 100644 index 0000000..6b5920f --- /dev/null +++ b/third_party/uip-1.0/uip/psock.c @@ -0,0 +1,338 @@ +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: psock.c,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +#include +#include + +#include "uipopt.h" +#include "psock.h" +#include "uip.h" + +#define STATE_NONE 0 +#define STATE_ACKED 1 +#define STATE_READ 2 +#define STATE_BLOCKED_NEWDATA 3 +#define STATE_BLOCKED_CLOSE 4 +#define STATE_BLOCKED_SEND 5 +#define STATE_DATA_SENT 6 + +/* + * Return value of the buffering functions that indicates that a + * buffer was not filled by incoming data. + * + */ +#define BUF_NOT_FULL 0 +#define BUF_NOT_FOUND 0 + +/* + * Return value of the buffering functions that indicates that a + * buffer was completely filled by incoming data. + * + */ +#define BUF_FULL 1 + +/* + * Return value of the buffering functions that indicates that an + * end-marker byte was found. + * + */ +#define BUF_FOUND 2 + +/*---------------------------------------------------------------------------*/ +static void +buf_setup(struct psock_buf *buf, + u8_t *bufptr, u16_t bufsize) +{ + buf->ptr = bufptr; + buf->left = bufsize; +} +/*---------------------------------------------------------------------------*/ +static u8_t +buf_bufdata(struct psock_buf *buf, u16_t len, + u8_t **dataptr, u16_t *datalen) +{ + if(*datalen < buf->left) { + memcpy(buf->ptr, *dataptr, *datalen); + buf->ptr += *datalen; + buf->left -= *datalen; + *dataptr += *datalen; + *datalen = 0; + return BUF_NOT_FULL; + } else if(*datalen == buf->left) { + memcpy(buf->ptr, *dataptr, *datalen); + buf->ptr += *datalen; + buf->left = 0; + *dataptr += *datalen; + *datalen = 0; + return BUF_FULL; + } else { + memcpy(buf->ptr, *dataptr, buf->left); + buf->ptr += buf->left; + *datalen -= buf->left; + *dataptr += buf->left; + buf->left = 0; + return BUF_FULL; + } +} +/*---------------------------------------------------------------------------*/ +static u8_t +buf_bufto(register struct psock_buf *buf, u8_t endmarker, + register u8_t **dataptr, register u16_t *datalen) +{ + u8_t c; + while(buf->left > 0 && *datalen > 0) { + c = *buf->ptr = **dataptr; + ++*dataptr; + ++buf->ptr; + --*datalen; + --buf->left; + + if(c == endmarker) { + return BUF_FOUND; + } + } + + if(*datalen == 0) { + return BUF_NOT_FOUND; + } + + while(*datalen > 0) { + c = **dataptr; + --*datalen; + ++*dataptr; + + if(c == endmarker) { + return BUF_FOUND | BUF_FULL; + } + } + + return BUF_FULL; +} +/*---------------------------------------------------------------------------*/ +static char +send_data(register struct psock *s) +{ + if(s->state != STATE_DATA_SENT || uip_rexmit()) { + if(s->sendlen > uip_mss()) { + uip_send(s->sendptr, uip_mss()); + } else { + uip_send(s->sendptr, s->sendlen); + } + s->state = STATE_DATA_SENT; + return 1; + } + return 0; +} +/*---------------------------------------------------------------------------*/ +static char +data_acked(register struct psock *s) +{ + if(s->state == STATE_DATA_SENT && uip_acked()) { + if(s->sendlen > uip_mss()) { + s->sendlen -= uip_mss(); + s->sendptr += uip_mss(); + } else { + s->sendptr += s->sendlen; + s->sendlen = 0; + } + s->state = STATE_ACKED; + return 1; + } + return 0; +} +/*---------------------------------------------------------------------------*/ +PT_THREAD(psock_send(register struct psock *s, const char *buf, + unsigned int len)) +{ + PT_BEGIN(&s->psockpt); + + /* If there is no data to send, we exit immediately. */ + if(len == 0) { + PT_EXIT(&s->psockpt); + } + + /* Save the length of and a pointer to the data that is to be + sent. */ + s->sendptr = buf; + s->sendlen = len; + + s->state = STATE_NONE; + + /* We loop here until all data is sent. The s->sendlen variable is + updated by the data_sent() function. */ + while(s->sendlen > 0) { + + /* + * The condition for this PT_WAIT_UNTIL is a little tricky: the + * protothread will wait here until all data has been acknowledged + * (data_acked() returns true) and until all data has been sent + * (send_data() returns true). The two functions data_acked() and + * send_data() must be called in succession to ensure that all + * data is sent. Therefore the & operator is used instead of the + * && operator, which would cause only the data_acked() function + * to be called when it returns false. + */ + PT_WAIT_UNTIL(&s->psockpt, data_acked(s) & send_data(s)); + } + + s->state = STATE_NONE; + + PT_END(&s->psockpt); +} +/*---------------------------------------------------------------------------*/ +PT_THREAD(psock_generator_send(register struct psock *s, + unsigned short (*generate)(void *), void *arg)) +{ + PT_BEGIN(&s->psockpt); + + /* Ensure that there is a generator function to call. */ + if(generate == NULL) { + PT_EXIT(&s->psockpt); + } + + /* Call the generator function to generate the data in the + uip_appdata buffer. */ + s->sendlen = generate(arg); + s->sendptr = uip_appdata; + + s->state = STATE_NONE; + do { + /* Call the generator function again if we are called to perform a + retransmission. */ + if(uip_rexmit()) { + generate(arg); + } + /* Wait until all data is sent and acknowledged. */ + PT_WAIT_UNTIL(&s->psockpt, data_acked(s) & send_data(s)); + } while(s->sendlen > 0); + + s->state = STATE_NONE; + + PT_END(&s->psockpt); +} +/*---------------------------------------------------------------------------*/ +u16_t +psock_datalen(struct psock *psock) +{ + return psock->bufsize - psock->buf.left; +} +/*---------------------------------------------------------------------------*/ +char +psock_newdata(struct psock *s) +{ + if(s->readlen > 0) { + /* There is data in the uip_appdata buffer that has not yet been + read with the PSOCK_READ functions. */ + return 1; + } else if(s->state == STATE_READ) { + /* All data in uip_appdata buffer already consumed. */ + s->state = STATE_BLOCKED_NEWDATA; + return 0; + } else if(uip_newdata()) { + /* There is new data that has not been consumed. */ + return 1; + } else { + /* There is no new data. */ + return 0; + } +} +/*---------------------------------------------------------------------------*/ +PT_THREAD(psock_readto(register struct psock *psock, unsigned char c)) +{ + PT_BEGIN(&psock->psockpt); + + buf_setup(&psock->buf, psock->bufptr, psock->bufsize); + + /* XXX: Should add buf_checkmarker() before do{} loop, if + incoming data has been handled while waiting for a write. */ + + do { + if(psock->readlen == 0) { + PT_WAIT_UNTIL(&psock->psockpt, psock_newdata(psock)); + psock->state = STATE_READ; + psock->readptr = (u8_t *)uip_appdata; + psock->readlen = uip_datalen(); + } + } while((buf_bufto(&psock->buf, c, + &psock->readptr, + &psock->readlen) & BUF_FOUND) == 0); + + if(psock_datalen(psock) == 0) { + psock->state = STATE_NONE; + PT_RESTART(&psock->psockpt); + } + PT_END(&psock->psockpt); +} +/*---------------------------------------------------------------------------*/ +PT_THREAD(psock_readbuf(register struct psock *psock)) +{ + PT_BEGIN(&psock->psockpt); + + buf_setup(&psock->buf, psock->bufptr, psock->bufsize); + + /* XXX: Should add buf_checkmarker() before do{} loop, if + incoming data has been handled while waiting for a write. */ + + do { + if(psock->readlen == 0) { + PT_WAIT_UNTIL(&psock->psockpt, psock_newdata(psock)); + printf("Waited for newdata\n"); + psock->state = STATE_READ; + psock->readptr = (u8_t *)uip_appdata; + psock->readlen = uip_datalen(); + } + } while(buf_bufdata(&psock->buf, psock->bufsize, + &psock->readptr, + &psock->readlen) != BUF_FULL); + + if(psock_datalen(psock) == 0) { + psock->state = STATE_NONE; + PT_RESTART(&psock->psockpt); + } + PT_END(&psock->psockpt); +} +/*---------------------------------------------------------------------------*/ +void +psock_init(register struct psock *psock, char *buffer, unsigned int buffersize) +{ + psock->state = STATE_NONE; + psock->readlen = 0; + psock->bufptr = buffer; + psock->bufsize = buffersize; + buf_setup(&psock->buf, buffer, buffersize); + PT_INIT(&psock->pt); + PT_INIT(&psock->psockpt); +} +/*---------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/uip/psock.h b/third_party/uip-1.0/uip/psock.h new file mode 100644 index 0000000..8d41258 --- /dev/null +++ b/third_party/uip-1.0/uip/psock.h @@ -0,0 +1,380 @@ +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: psock.h,v 1.3 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \defgroup psock Protosockets library + * @{ + * + * The protosocket library provides an interface to the uIP stack that is + * similar to the traditional BSD socket interface. Unlike programs + * written for the ordinary uIP event-driven interface, programs + * written with the protosocket library are executed in a sequential + * fashion and does not have to be implemented as explicit state + * machines. + * + * Protosockets only work with TCP connections. + * + * The protosocket library uses \ref pt protothreads to provide + * sequential control flow. This makes the protosockets lightweight in + * terms of memory, but also means that protosockets inherits the + * functional limitations of protothreads. Each protosocket lives only + * within a single function. Automatic variables (stack variables) are + * not retained across a protosocket library function call. + * + * \note Because the protosocket library uses protothreads, local + * variables will not always be saved across a call to a protosocket + * library function. It is therefore advised that local variables are + * used with extreme care. + * + * The protosocket library provides functions for sending data without + * having to deal with retransmissions and acknowledgements, as well + * as functions for reading data without having to deal with data + * being split across more than one TCP segment. + * + * Because each protosocket runs as a protothread, the protosocket has to be + * started with a call to PSOCK_BEGIN() at the start of the function + * in which the protosocket is used. Similarly, the protosocket protothread can + * be terminated by a call to PSOCK_EXIT(). + * + */ + +/** + * \file + * Protosocket library header file + * \author + * Adam Dunkels + * + */ + +#ifndef __PSOCK_H__ +#define __PSOCK_H__ + +#include "uipopt.h" +#include "pt.h" + + /* + * The structure that holds the state of a buffer. + * + * This structure holds the state of a uIP buffer. The structure has + * no user-visible elements, but is used through the functions + * provided by the library. + * + */ +struct psock_buf { + u8_t *ptr; + unsigned short left; +}; + +/** + * The representation of a protosocket. + * + * The protosocket structrure is an opaque structure with no user-visible + * elements. + */ +struct psock { + struct pt pt, psockpt; /* Protothreads - one that's using the psock + functions, and one that runs inside the + psock functions. */ + const u8_t *sendptr; /* Pointer to the next data to be sent. */ + u8_t *readptr; /* Pointer to the next data to be read. */ + + char *bufptr; /* Pointer to the buffer used for buffering + incoming data. */ + + u16_t sendlen; /* The number of bytes left to be sent. */ + u16_t readlen; /* The number of bytes left to be read. */ + + struct psock_buf buf; /* The structure holding the state of the + input buffer. */ + unsigned int bufsize; /* The size of the input buffer. */ + + unsigned char state; /* The state of the protosocket. */ +}; + +void psock_init(struct psock *psock, char *buffer, unsigned int buffersize); +/** + * Initialize a protosocket. + * + * This macro initializes a protosocket and must be called before the + * protosocket is used. The initialization also specifies the input buffer + * for the protosocket. + * + * \param psock (struct psock *) A pointer to the protosocket to be + * initialized + * + * \param buffer (char *) A pointer to the input buffer for the + * protosocket. + * + * \param buffersize (unsigned int) The size of the input buffer. + * + * \hideinitializer + */ +#define PSOCK_INIT(psock, buffer, buffersize) \ + psock_init(psock, buffer, buffersize) + +/** + * Start the protosocket protothread in a function. + * + * This macro starts the protothread associated with the protosocket and + * must come before other protosocket calls in the function it is used. + * + * \param psock (struct psock *) A pointer to the protosocket to be + * started. + * + * \hideinitializer + */ +#define PSOCK_BEGIN(psock) PT_BEGIN(&((psock)->pt)) + +PT_THREAD(psock_send(struct psock *psock, const char *buf, unsigned int len)); +/** + * Send data. + * + * This macro sends data over a protosocket. The protosocket protothread blocks + * until all data has been sent and is known to have been received by + * the remote end of the TCP connection. + * + * \param psock (struct psock *) A pointer to the protosocket over which + * data is to be sent. + * + * \param data (char *) A pointer to the data that is to be sent. + * + * \param datalen (unsigned int) The length of the data that is to be + * sent. + * + * \hideinitializer + */ +#define PSOCK_SEND(psock, data, datalen) \ + PT_WAIT_THREAD(&((psock)->pt), psock_send(psock, data, datalen)) + +/** + * \brief Send a null-terminated string. + * \param psock Pointer to the protosocket. + * \param str The string to be sent. + * + * This function sends a null-terminated string over the + * protosocket. + * + * \hideinitializer + */ +#define PSOCK_SEND_STR(psock, str) \ + PT_WAIT_THREAD(&((psock)->pt), psock_send(psock, str, strlen(str))) + +PT_THREAD(psock_generator_send(struct psock *psock, + unsigned short (*f)(void *), void *arg)); + +/** + * \brief Generate data with a function and send it + * \param psock Pointer to the protosocket. + * \param generator Pointer to the generator function + * \param arg Argument to the generator function + * + * This function generates data and sends it over the + * protosocket. This can be used to dynamically generate + * data for a transmission, instead of generating the data + * in a buffer beforehand. This function reduces the need for + * buffer memory. The generator function is implemented by + * the application, and a pointer to the function is given + * as an argument with the call to PSOCK_GENERATOR_SEND(). + * + * The generator function should place the generated data + * directly in the uip_appdata buffer, and return the + * length of the generated data. The generator function is + * called by the protosocket layer when the data first is + * sent, and once for every retransmission that is needed. + * + * \hideinitializer + */ +#define PSOCK_GENERATOR_SEND(psock, generator, arg) \ + PT_WAIT_THREAD(&((psock)->pt), \ + psock_generator_send(psock, generator, arg)) + + +/** + * Close a protosocket. + * + * This macro closes a protosocket and can only be called from within the + * protothread in which the protosocket lives. + * + * \param psock (struct psock *) A pointer to the protosocket that is to + * be closed. + * + * \hideinitializer + */ +#define PSOCK_CLOSE(psock) uip_close() + +PT_THREAD(psock_readbuf(struct psock *psock)); +/** + * Read data until the buffer is full. + * + * This macro will block waiting for data and read the data into the + * input buffer specified with the call to PSOCK_INIT(). Data is read + * until the buffer is full.. + * + * \param psock (struct psock *) A pointer to the protosocket from which + * data should be read. + * + * \hideinitializer + */ +#define PSOCK_READBUF(psock) \ + PT_WAIT_THREAD(&((psock)->pt), psock_readbuf(psock)) + +PT_THREAD(psock_readto(struct psock *psock, unsigned char c)); +/** + * Read data up to a specified character. + * + * This macro will block waiting for data and read the data into the + * input buffer specified with the call to PSOCK_INIT(). Data is only + * read until the specifieed character appears in the data stream. + * + * \param psock (struct psock *) A pointer to the protosocket from which + * data should be read. + * + * \param c (char) The character at which to stop reading. + * + * \hideinitializer + */ +#define PSOCK_READTO(psock, c) \ + PT_WAIT_THREAD(&((psock)->pt), psock_readto(psock, c)) + +/** + * The length of the data that was previously read. + * + * This macro returns the length of the data that was previously read + * using PSOCK_READTO() or PSOCK_READ(). + * + * \param psock (struct psock *) A pointer to the protosocket holding the data. + * + * \hideinitializer + */ +#define PSOCK_DATALEN(psock) psock_datalen(psock) + +u16_t psock_datalen(struct psock *psock); + +/** + * Exit the protosocket's protothread. + * + * This macro terminates the protothread of the protosocket and should + * almost always be used in conjunction with PSOCK_CLOSE(). + * + * \sa PSOCK_CLOSE_EXIT() + * + * \param psock (struct psock *) A pointer to the protosocket. + * + * \hideinitializer + */ +#define PSOCK_EXIT(psock) PT_EXIT(&((psock)->pt)) + +/** + * Close a protosocket and exit the protosocket's protothread. + * + * This macro closes a protosocket and exits the protosocket's protothread. + * + * \param psock (struct psock *) A pointer to the protosocket. + * + * \hideinitializer + */ +#define PSOCK_CLOSE_EXIT(psock) \ + do { \ + PSOCK_CLOSE(psock); \ + PSOCK_EXIT(psock); \ + } while(0) + +/** + * Declare the end of a protosocket's protothread. + * + * This macro is used for declaring that the protosocket's protothread + * ends. It must always be used together with a matching PSOCK_BEGIN() + * macro. + * + * \param psock (struct psock *) A pointer to the protosocket. + * + * \hideinitializer + */ +#define PSOCK_END(psock) PT_END(&((psock)->pt)) + +char psock_newdata(struct psock *s); + +/** + * Check if new data has arrived on a protosocket. + * + * This macro is used in conjunction with the PSOCK_WAIT_UNTIL() + * macro to check if data has arrived on a protosocket. + * + * \param psock (struct psock *) A pointer to the protosocket. + * + * \hideinitializer + */ +#define PSOCK_NEWDATA(psock) psock_newdata(psock) + +/** + * Wait until a condition is true. + * + * This macro blocks the protothread until the specified condition is + * true. The macro PSOCK_NEWDATA() can be used to check if new data + * arrives when the protosocket is waiting. + * + * Typically, this macro is used as follows: + * + \code + PT_THREAD(thread(struct psock *s, struct timer *t)) + { + PSOCK_BEGIN(s); + + PSOCK_WAIT_UNTIL(s, PSOCK_NEWADATA(s) || timer_expired(t)); + + if(PSOCK_NEWDATA(s)) { + PSOCK_READTO(s, '\n'); + } else { + handle_timed_out(s); + } + + PSOCK_END(s); + } + \endcode + * + * \param psock (struct psock *) A pointer to the protosocket. + * \param condition The condition to wait for. + * + * \hideinitializer + */ +#define PSOCK_WAIT_UNTIL(psock, condition) \ + PT_WAIT_UNTIL(&((psock)->pt), (condition)); + +#define PSOCK_WAIT_THREAD(psock, condition) \ + PT_WAIT_THREAD(&((psock)->pt), (condition)) + +#endif /* __PSOCK_H__ */ + +/** @} */ diff --git a/third_party/uip-1.0/uip/pt.h b/third_party/uip-1.0/uip/pt.h new file mode 100644 index 0000000..00ddd44 --- /dev/null +++ b/third_party/uip-1.0/uip/pt.h @@ -0,0 +1,323 @@ +/* + * Copyright (c) 2004-2005, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: pt.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \addtogroup pt + * @{ + */ + +/** + * \file + * Protothreads implementation. + * \author + * Adam Dunkels + * + */ + +#ifndef __PT_H__ +#define __PT_H__ + +#include "lc.h" + +struct pt { + lc_t lc; +}; + +#define PT_WAITING 0 +#define PT_EXITED 1 +#define PT_ENDED 2 +#define PT_YIELDED 3 + +/** + * \name Initialization + * @{ + */ + +/** + * Initialize a protothread. + * + * Initializes a protothread. Initialization must be done prior to + * starting to execute the protothread. + * + * \param pt A pointer to the protothread control structure. + * + * \sa PT_SPAWN() + * + * \hideinitializer + */ +#define PT_INIT(pt) LC_INIT((pt)->lc) + +/** @} */ + +/** + * \name Declaration and definition + * @{ + */ + +/** + * Declaration of a protothread. + * + * This macro is used to declare a protothread. All protothreads must + * be declared with this macro. + * + * \param name_args The name and arguments of the C function + * implementing the protothread. + * + * \hideinitializer + */ +#define PT_THREAD(name_args) char name_args + +/** + * Declare the start of a protothread inside the C function + * implementing the protothread. + * + * This macro is used to declare the starting point of a + * protothread. It should be placed at the start of the function in + * which the protothread runs. All C statements above the PT_BEGIN() + * invokation will be executed each time the protothread is scheduled. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_BEGIN(pt) { char PT_YIELD_FLAG = 1; LC_RESUME((pt)->lc) + +/** + * Declare the end of a protothread. + * + * This macro is used for declaring that a protothread ends. It must + * always be used together with a matching PT_BEGIN() macro. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_END(pt) LC_END((pt)->lc); PT_YIELD_FLAG = 0; \ + PT_INIT(pt); return PT_ENDED; } + +/** @} */ + +/** + * \name Blocked wait + * @{ + */ + +/** + * Block and wait until condition is true. + * + * This macro blocks the protothread until the specified condition is + * true. + * + * \param pt A pointer to the protothread control structure. + * \param condition The condition. + * + * \hideinitializer + */ +#define PT_WAIT_UNTIL(pt, condition) \ + do { \ + LC_SET((pt)->lc); \ + if(!(condition)) { \ + return PT_WAITING; \ + } \ + } while(0) + +/** + * Block and wait while condition is true. + * + * This function blocks and waits while condition is true. See + * PT_WAIT_UNTIL(). + * + * \param pt A pointer to the protothread control structure. + * \param cond The condition. + * + * \hideinitializer + */ +#define PT_WAIT_WHILE(pt, cond) PT_WAIT_UNTIL((pt), !(cond)) + +/** @} */ + +/** + * \name Hierarchical protothreads + * @{ + */ + +/** + * Block and wait until a child protothread completes. + * + * This macro schedules a child protothread. The current protothread + * will block until the child protothread completes. + * + * \note The child protothread must be manually initialized with the + * PT_INIT() function before this function is used. + * + * \param pt A pointer to the protothread control structure. + * \param thread The child protothread with arguments + * + * \sa PT_SPAWN() + * + * \hideinitializer + */ +#define PT_WAIT_THREAD(pt, thread) PT_WAIT_WHILE((pt), PT_SCHEDULE(thread)) + +/** + * Spawn a child protothread and wait until it exits. + * + * This macro spawns a child protothread and waits until it exits. The + * macro can only be used within a protothread. + * + * \param pt A pointer to the protothread control structure. + * \param child A pointer to the child protothread's control structure. + * \param thread The child protothread with arguments + * + * \hideinitializer + */ +#define PT_SPAWN(pt, child, thread) \ + do { \ + PT_INIT((child)); \ + PT_WAIT_THREAD((pt), (thread)); \ + } while(0) + +/** @} */ + +/** + * \name Exiting and restarting + * @{ + */ + +/** + * Restart the protothread. + * + * This macro will block and cause the running protothread to restart + * its execution at the place of the PT_BEGIN() call. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_RESTART(pt) \ + do { \ + PT_INIT(pt); \ + return PT_WAITING; \ + } while(0) + +/** + * Exit the protothread. + * + * This macro causes the protothread to exit. If the protothread was + * spawned by another protothread, the parent protothread will become + * unblocked and can continue to run. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_EXIT(pt) \ + do { \ + PT_INIT(pt); \ + return PT_EXITED; \ + } while(0) + +/** @} */ + +/** + * \name Calling a protothread + * @{ + */ + +/** + * Schedule a protothread. + * + * This function shedules a protothread. The return value of the + * function is non-zero if the protothread is running or zero if the + * protothread has exited. + * + * \param f The call to the C function implementing the protothread to + * be scheduled + * + * \hideinitializer + */ +#define PT_SCHEDULE(f) ((f) == PT_WAITING) + +/** @} */ + +/** + * \name Yielding from a protothread + * @{ + */ + +/** + * Yield from the current protothread. + * + * This function will yield the protothread, thereby allowing other + * processing to take place in the system. + * + * \param pt A pointer to the protothread control structure. + * + * \hideinitializer + */ +#define PT_YIELD(pt) \ + do { \ + PT_YIELD_FLAG = 0; \ + LC_SET((pt)->lc); \ + if(PT_YIELD_FLAG == 0) { \ + return PT_YIELDED; \ + } \ + } while(0) + +/** + * \brief Yield from the protothread until a condition occurs. + * \param pt A pointer to the protothread control structure. + * \param cond The condition. + * + * This function will yield the protothread, until the + * specified condition evaluates to true. + * + * + * \hideinitializer + */ +#define PT_YIELD_UNTIL(pt, cond) \ + do { \ + PT_YIELD_FLAG = 0; \ + LC_SET((pt)->lc); \ + if((PT_YIELD_FLAG == 0) || !(cond)) { \ + return PT_YIELDED; \ + } \ + } while(0) + +/** @} */ + +#endif /* __PT_H__ */ + +/** @} */ diff --git a/third_party/uip-1.0/uip/uip-fw.c b/third_party/uip-1.0/uip/uip-fw.c new file mode 100644 index 0000000..dbb83c8 --- /dev/null +++ b/third_party/uip-1.0/uip/uip-fw.c @@ -0,0 +1,534 @@ +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: uip-fw.c,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ +/** + * \addtogroup uip + * @{ + */ + +/** + * \defgroup uipfw uIP packet forwarding + * @{ + * + */ + +/** + * \file + * uIP packet forwarding. + * \author Adam Dunkels + * + * This file implements a number of simple functions which do packet + * forwarding over multiple network interfaces with uIP. + * + */ + +#include "uip.h" +#include "uip_arch.h" +#include "uip-fw.h" + +#include /* for memcpy() */ + +/* + * The list of registered network interfaces. + */ +static struct uip_fw_netif *netifs = NULL; + +/* + * A pointer to the default network interface. + */ +static struct uip_fw_netif *defaultnetif = NULL; + +struct tcpip_hdr { + /* IP header. */ + u8_t vhl, + tos; + u16_t len, + ipid, + ipoffset; + u8_t ttl, + proto; + u16_t ipchksum; + u16_t srcipaddr[2], + destipaddr[2]; + + /* TCP header. */ + u16_t srcport, + destport; + u8_t seqno[4], + ackno[4], + tcpoffset, + flags, + wnd[2]; + u16_t tcpchksum; + u8_t urgp[2]; + u8_t optdata[4]; +}; + +struct icmpip_hdr { + /* IP header. */ + u8_t vhl, + tos, + len[2], + ipid[2], + ipoffset[2], + ttl, + proto; + u16_t ipchksum; + u16_t srcipaddr[2], + destipaddr[2]; + /* ICMP (echo) header. */ + u8_t type, icode; + u16_t icmpchksum; + u16_t id, seqno; + u8_t payload[1]; +}; + +/* ICMP ECHO. */ +#define ICMP_ECHO 8 + +/* ICMP TIME-EXCEEDED. */ +#define ICMP_TE 11 + +/* + * Pointer to the TCP/IP headers of the packet in the uip_buf buffer. + */ +#define BUF ((struct tcpip_hdr *)&uip_buf[UIP_LLH_LEN]) + +/* + * Pointer to the ICMP/IP headers of the packet in the uip_buf buffer. + */ +#define ICMPBUF ((struct icmpip_hdr *)&uip_buf[UIP_LLH_LEN]) + +/* + * Certain fields of an IP packet that are used for identifying + * duplicate packets. + */ +struct fwcache_entry { + u16_t timer; + + u16_t srcipaddr[2]; + u16_t destipaddr[2]; + u16_t ipid; + u8_t proto; + u8_t unused; + +#if notdef + u16_t payload[2]; +#endif + +#if UIP_REASSEMBLY > 0 + u16_t len, offset; +#endif +}; + +/* + * The number of packets to remember when looking for duplicates. + */ +#ifdef UIP_CONF_FWCACHE_SIZE +#define FWCACHE_SIZE UIP_CONF_FWCACHE_SIZE +#else +#define FWCACHE_SIZE 2 +#endif + + +/* + * A cache of packet header fields which are used for + * identifying duplicate packets. + */ +static struct fwcache_entry fwcache[FWCACHE_SIZE]; + +/** + * \internal + * The time that a packet cache is active. + */ +#define FW_TIME 20 + +/*------------------------------------------------------------------------------*/ +/** + * Initialize the uIP packet forwarding module. + */ +/*------------------------------------------------------------------------------*/ +void +uip_fw_init(void) +{ + struct uip_fw_netif *t; + defaultnetif = NULL; + while(netifs != NULL) { + t = netifs; + netifs = netifs->next; + t->next = NULL; + } +} +/*------------------------------------------------------------------------------*/ +/** + * \internal + * Check if an IP address is within the network defined by an IP + * address and a netmask. + * + * \param ipaddr The IP address to be checked. + * \param netipaddr The IP address of the network. + * \param netmask The netmask of the network. + * + * \return Non-zero if IP address is in network, zero otherwise. + */ +/*------------------------------------------------------------------------------*/ +static unsigned char +ipaddr_maskcmp(u16_t *ipaddr, u16_t *netipaddr, u16_t *netmask) +{ + return (ipaddr[0] & netmask [0]) == (netipaddr[0] & netmask[0]) && + (ipaddr[1] & netmask[1]) == (netipaddr[1] & netmask[1]); +} +/*------------------------------------------------------------------------------*/ +/** + * \internal + * Send out an ICMP TIME-EXCEEDED message. + * + * This function replaces the packet in the uip_buf buffer with the + * ICMP packet. + */ +/*------------------------------------------------------------------------------*/ +static void +time_exceeded(void) +{ + u16_t tmp16; + + /* We don't send out ICMP errors for ICMP messages. */ + if(ICMPBUF->proto == UIP_PROTO_ICMP) { + uip_len = 0; + return; + } + /* Copy fields from packet header into payload of this ICMP packet. */ + memcpy(&(ICMPBUF->payload[0]), ICMPBUF, 28); + + /* Set the ICMP type and code. */ + ICMPBUF->type = ICMP_TE; + ICMPBUF->icode = 0; + + /* Calculate the ICMP checksum. */ + ICMPBUF->icmpchksum = 0; +#ifndef UIP_OFFLOAD_ICMP_CHKSUM + ICMPBUF->icmpchksum = ~uip_chksum((u16_t *)&(ICMPBUF->type), 36); +#endif + + /* Set the IP destination address to be the source address of the + original packet. */ + tmp16= BUF->destipaddr[0]; + BUF->destipaddr[0] = BUF->srcipaddr[0]; + BUF->srcipaddr[0] = tmp16; + tmp16 = BUF->destipaddr[1]; + BUF->destipaddr[1] = BUF->srcipaddr[1]; + BUF->srcipaddr[1] = tmp16; + + /* Set our IP address as the source address. */ + BUF->srcipaddr[0] = uip_hostaddr[0]; + BUF->srcipaddr[1] = uip_hostaddr[1]; + + /* The size of the ICMP time exceeded packet is 36 + the size of the + IP header (20) = 56. */ + uip_len = 56; + ICMPBUF->len[0] = 0; + ICMPBUF->len[1] = uip_len; + + /* Fill in the other fields in the IP header. */ + ICMPBUF->vhl = 0x45; + ICMPBUF->tos = 0; + ICMPBUF->ipoffset[0] = ICMPBUF->ipoffset[1] = 0; + ICMPBUF->ttl = UIP_TTL; + ICMPBUF->proto = UIP_PROTO_ICMP; + + /* Calculate IP checksum. */ + ICMPBUF->ipchksum = 0; + ICMPBUF->ipchksum = ~(uip_ipchksum()); + + +} +/*------------------------------------------------------------------------------*/ +/** + * \internal + * Register a packet in the forwarding cache so that it won't be + * forwarded again. + */ +/*------------------------------------------------------------------------------*/ +static void +fwcache_register(void) +{ + struct fwcache_entry *fw; + int i, oldest; + + oldest = FW_TIME; + fw = NULL; + + /* Find the oldest entry in the cache. */ + for(i = 0; i < FWCACHE_SIZE; ++i) { + if(fwcache[i].timer == 0) { + fw = &fwcache[i]; + break; + } else if(fwcache[i].timer <= oldest) { + fw = &fwcache[i]; + oldest = fwcache[i].timer; + } + } + + fw->timer = FW_TIME; + fw->ipid = BUF->ipid; + fw->srcipaddr[0] = BUF->srcipaddr[0]; + fw->srcipaddr[1] = BUF->srcipaddr[1]; + fw->destipaddr[0] = BUF->destipaddr[0]; + fw->destipaddr[1] = BUF->destipaddr[1]; + fw->proto = BUF->proto; +#if notdef + fw->payload[0] = BUF->srcport; + fw->payload[1] = BUF->destport; +#endif +#if UIP_REASSEMBLY > 0 + fw->len = BUF->len; + fw->offset = BUF->ipoffset; +#endif +} +/*------------------------------------------------------------------------------*/ +/** + * \internal + * Find a network interface for the IP packet in uip_buf. + */ +/*------------------------------------------------------------------------------*/ +static struct uip_fw_netif * +find_netif(void) +{ + struct uip_fw_netif *netif; + + /* Walk through every network interface to check for a match. */ + for(netif = netifs; netif != NULL; netif = netif->next) { + if(ipaddr_maskcmp(BUF->destipaddr, netif->ipaddr, + netif->netmask)) { + /* If there was a match, we break the loop. */ + return netif; + } + } + + /* If no matching netif was found, we use default netif. */ + return defaultnetif; +} +/*------------------------------------------------------------------------------*/ +/** + * Output an IP packet on the correct network interface. + * + * The IP packet should be present in the uip_buf buffer and its + * length in the global uip_len variable. + * + * \retval UIP_FW_ZEROLEN Indicates that a zero-length packet + * transmission was attempted and that no packet was sent. + * + * \retval UIP_FW_NOROUTE No suitable network interface could be found + * for the outbound packet, and the packet was not sent. + * + * \return The return value from the actual network interface output + * function is passed unmodified as a return value. + */ +/*------------------------------------------------------------------------------*/ +u8_t +uip_fw_output(void) +{ + struct uip_fw_netif *netif; + + if(uip_len == 0) { + return UIP_FW_ZEROLEN; + } + + fwcache_register(); + +#if UIP_BROADCAST + /* Link local broadcasts go out on all interfaces. */ + if(/*BUF->proto == UIP_PROTO_UDP &&*/ + BUF->destipaddr[0] == 0xffff && + BUF->destipaddr[1] == 0xffff) { + if(defaultnetif != NULL) { + defaultnetif->output(); + } + for(netif = netifs; netif != NULL; netif = netif->next) { + netif->output(); + } + return UIP_FW_OK; + } +#endif /* UIP_BROADCAST */ + + netif = find_netif(); + /* printf("uip_fw_output: netif %p ->output %p len %d\n", netif, + netif->output, + uip_len);*/ + + if(netif == NULL) { + return UIP_FW_NOROUTE; + } + /* If we now have found a suitable network interface, we call its + output function to send out the packet. */ + return netif->output(); +} +/*------------------------------------------------------------------------------*/ +/** + * Forward an IP packet in the uip_buf buffer. + * + * + * + * \return UIP_FW_FORWARDED if the packet was forwarded, UIP_FW_LOCAL if + * the packet should be processed locally. + */ +/*------------------------------------------------------------------------------*/ +u8_t +uip_fw_forward(void) +{ + struct fwcache_entry *fw; + + /* First check if the packet is destined for ourselves and return 0 + to indicate that the packet should be processed locally. */ + if(BUF->destipaddr[0] == uip_hostaddr[0] && + BUF->destipaddr[1] == uip_hostaddr[1]) { + return UIP_FW_LOCAL; + } + + /* If we use ping IP address configuration, and our IP address is + not yet configured, we should intercept all ICMP echo packets. */ +#if UIP_PINGADDRCONF + if((uip_hostaddr[0] | uip_hostaddr[1]) == 0 && + BUF->proto == UIP_PROTO_ICMP && + ICMPBUF->type == ICMP_ECHO) { + return UIP_FW_LOCAL; + } +#endif /* UIP_PINGADDRCONF */ + + /* Check if the packet is in the forwarding cache already, and if so + we drop it. */ + + for(fw = fwcache; fw < &fwcache[FWCACHE_SIZE]; ++fw) { + if(fw->timer != 0 && +#if UIP_REASSEMBLY > 0 + fw->len == BUF->len && + fw->offset == BUF->ipoffset && +#endif + fw->ipid == BUF->ipid && + fw->srcipaddr[0] == BUF->srcipaddr[0] && + fw->srcipaddr[1] == BUF->srcipaddr[1] && + fw->destipaddr[0] == BUF->destipaddr[0] && + fw->destipaddr[1] == BUF->destipaddr[1] && +#if notdef + fw->payload[0] == BUF->srcport && + fw->payload[1] == BUF->destport && +#endif + fw->proto == BUF->proto) { + /* Drop packet. */ + return UIP_FW_FORWARDED; + } + } + + /* If the TTL reaches zero we produce an ICMP time exceeded message + in the uip_buf buffer and forward that packet back to the sender + of the packet. */ + if(BUF->ttl <= 1) { + /* No time exceeded for broadcasts and multicasts! */ + if(BUF->destipaddr[0] == 0xffff && BUF->destipaddr[1] == 0xffff) { + return UIP_FW_LOCAL; + } + time_exceeded(); + } + + /* Decrement the TTL (time-to-live) value in the IP header */ + BUF->ttl = BUF->ttl - 1; + + /* Update the IP checksum. */ + if(BUF->ipchksum >= HTONS(0xffff - 0x0100)) { + BUF->ipchksum = BUF->ipchksum + HTONS(0x0100) + 1; + } else { + BUF->ipchksum = BUF->ipchksum + HTONS(0x0100); + } + + if(uip_len > 0) { + uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_TCPIP_HLEN]; + uip_fw_output(); + } + +#if UIP_BROADCAST + if(BUF->destipaddr[0] == 0xffff && BUF->destipaddr[1] == 0xffff) { + return UIP_FW_LOCAL; + } +#endif /* UIP_BROADCAST */ + + /* Return non-zero to indicate that the packet was forwarded and that no + other processing should be made. */ + return UIP_FW_FORWARDED; +} +/*------------------------------------------------------------------------------*/ +/** + * Register a network interface with the forwarding module. + * + * \param netif A pointer to the network interface that is to be + * registered. + */ +/*------------------------------------------------------------------------------*/ +void +uip_fw_register(struct uip_fw_netif *netif) +{ + netif->next = netifs; + netifs = netif; +} +/*------------------------------------------------------------------------------*/ +/** + * Register a default network interface. + * + * All packets that don't go out on any of the other interfaces will + * be routed to the default interface. + * + * \param netif A pointer to the network interface that is to be + * registered. + */ +/*------------------------------------------------------------------------------*/ +void +uip_fw_default(struct uip_fw_netif *netif) +{ + defaultnetif = netif; +} +/*------------------------------------------------------------------------------*/ +/** + * Perform periodic processing. + */ +/*------------------------------------------------------------------------------*/ +void +uip_fw_periodic(void) +{ + struct fwcache_entry *fw; + for(fw = fwcache; fw < &fwcache[FWCACHE_SIZE]; ++fw) { + if(fw->timer > 0) { + --fw->timer; + } + } +} +/*------------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/uip/uip-fw.h b/third_party/uip-1.0/uip/uip-fw.h new file mode 100644 index 0000000..e854ece --- /dev/null +++ b/third_party/uip-1.0/uip/uip-fw.h @@ -0,0 +1,176 @@ +/** + * \addtogroup uipfw + * @{ + */ + +/** + * \file + * uIP packet forwarding header file. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: uip-fw.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ +#ifndef __UIP_FW_H__ +#define __UIP_FW_H__ + +#include "uip.h" + +/** + * Representation of a uIP network interface. + */ +struct uip_fw_netif { + struct uip_fw_netif *next; /**< Pointer to the next interface when + linked in a list. */ + u16_t ipaddr[2]; /**< The IP address of this interface. */ + u16_t netmask[2]; /**< The netmask of the interface. */ + u8_t (* output)(void); + /**< A pointer to the function that + sends a packet. */ +}; + +/** + * Intantiating macro for a uIP network interface. + * + * Example: + \code + struct uip_fw_netif slipnetif = + {UIP_FW_NETIF(192,168,76,1, 255,255,255,0, slip_output)}; + \endcode + * \param ip1,ip2,ip3,ip4 The IP address of the network interface. + * + * \param nm1,nm2,nm3,nm4 The netmask of the network interface. + * + * \param outputfunc A pointer to the output function of the network interface. + * + * \hideinitializer + */ +#define UIP_FW_NETIF(ip1,ip2,ip3,ip4, nm1,nm2,nm3,nm4, outputfunc) \ + NULL, \ + {HTONS((ip1 << 8) | ip2), HTONS((ip3 << 8) | ip4)}, \ + {HTONS((nm1 << 8) | nm2), HTONS((nm3 << 8) | nm4)}, \ + outputfunc + +/** + * Set the IP address of a network interface. + * + * \param netif A pointer to the uip_fw_netif structure for the network interface. + * + * \param addr A pointer to an IP address. + * + * \hideinitializer + */ +#define uip_fw_setipaddr(netif, addr) \ + do { (netif)->ipaddr[0] = ((u16_t *)(addr))[0]; \ + (netif)->ipaddr[1] = ((u16_t *)(addr))[1]; } while(0) +/** + * Set the netmask of a network interface. + * + * \param netif A pointer to the uip_fw_netif structure for the network interface. + * + * \param addr A pointer to an IP address representing the netmask. + * + * \hideinitializer + */ +#define uip_fw_setnetmask(netif, addr) \ + do { (netif)->netmask[0] = ((u16_t *)(addr))[0]; \ + (netif)->netmask[1] = ((u16_t *)(addr))[1]; } while(0) + +void uip_fw_init(void); +u8_t uip_fw_forward(void); +u8_t uip_fw_output(void); +void uip_fw_register(struct uip_fw_netif *netif); +void uip_fw_default(struct uip_fw_netif *netif); +void uip_fw_periodic(void); + + +/** + * A non-error message that indicates that a packet should be + * processed locally. + * + * \hideinitializer + */ +#define UIP_FW_LOCAL 0 + +/** + * A non-error message that indicates that something went OK. + * + * \hideinitializer + */ +#define UIP_FW_OK 0 + +/** + * A non-error message that indicates that a packet was forwarded. + * + * \hideinitializer + */ +#define UIP_FW_FORWARDED 1 + +/** + * A non-error message that indicates that a zero-length packet + * transmission was attempted, and that no packet was sent. + * + * \hideinitializer + */ +#define UIP_FW_ZEROLEN 2 + +/** + * An error message that indicates that a packet that was too large + * for the outbound network interface was detected. + * + * \hideinitializer + */ +#define UIP_FW_TOOLARGE 3 + +/** + * An error message that indicates that no suitable interface could be + * found for an outbound packet. + * + * \hideinitializer + */ +#define UIP_FW_NOROUTE 4 + +/** + * An error message that indicates that a packet that should be + * forwarded or output was dropped. + * + * \hideinitializer + */ +#define UIP_FW_DROPPED 5 + + +#endif /* __UIP_FW_H__ */ + +/** @} */ diff --git a/third_party/uip-1.0/uip/uip-neighbor.c b/third_party/uip-1.0/uip/uip-neighbor.c new file mode 100644 index 0000000..9715c8e --- /dev/null +++ b/third_party/uip-1.0/uip/uip-neighbor.c @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-neighbor.c,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \file + * Database of link-local neighbors, used by IPv6 code and + * to be used by a future ARP code rewrite. + * \author + * Adam Dunkels + */ + +#include "uip-neighbor.h" + +#include + +#define MAX_TIME 128 + +#ifdef UIP_NEIGHBOR_CONF_ENTRIES +#define ENTRIES UIP_NEIGHBOR_CONF_ENTRIES +#else /* UIP_NEIGHBOR_CONF_ENTRIES */ +#define ENTRIES 8 +#endif /* UIP_NEIGHBOR_CONF_ENTRIES */ + +struct neighbor_entry { + uip_ipaddr_t ipaddr; + struct uip_neighbor_addr addr; + u8_t time; +}; +static struct neighbor_entry entries[ENTRIES]; + +/*---------------------------------------------------------------------------*/ +void +uip_neighbor_init(void) +{ + int i; + + for(i = 0; i < ENTRIES; ++i) { + entries[i].time = MAX_TIME; + } +} +/*---------------------------------------------------------------------------*/ +void +uip_neighbor_periodic(void) +{ + int i; + + for(i = 0; i < ENTRIES; ++i) { + if(entries[i].time < MAX_TIME) { + entries[i].time++; + } + } +} +/*---------------------------------------------------------------------------*/ +void +uip_neighbor_add(uip_ipaddr_t ipaddr, struct uip_neighbor_addr *addr) +{ + int i, oldest; + u8_t oldest_time; + + printf("Adding neighbor with link address %02x:%02x:%02x:%02x:%02x:%02x\n", + addr->addr.addr[0], addr->addr.addr[1], addr->addr.addr[2], addr->addr.addr[3], + addr->addr.addr[4], addr->addr.addr[5]); + + /* Find the first unused entry or the oldest used entry. */ + oldest_time = 0; + oldest = 0; + for(i = 0; i < ENTRIES; ++i) { + if(entries[i].time == MAX_TIME) { + oldest = i; + break; + } + if(uip_ipaddr_cmp(entries[i].ipaddr, addr)) { + oldest = i; + break; + } + if(entries[i].time > oldest_time) { + oldest = i; + oldest_time = entries[i].time; + } + } + + /* Use the oldest or first free entry (either pointed to by the + "oldest" variable). */ + entries[oldest].time = 0; + uip_ipaddr_copy(entries[oldest].ipaddr, ipaddr); + memcpy(&entries[oldest].addr, addr, sizeof(struct uip_neighbor_addr)); +} +/*---------------------------------------------------------------------------*/ +static struct neighbor_entry * +find_entry(uip_ipaddr_t ipaddr) +{ + int i; + + for(i = 0; i < ENTRIES; ++i) { + if(uip_ipaddr_cmp(entries[i].ipaddr, ipaddr)) { + return &entries[i]; + } + } + return NULL; +} +/*---------------------------------------------------------------------------*/ +void +uip_neighbor_update(uip_ipaddr_t ipaddr) +{ + struct neighbor_entry *e; + + e = find_entry(ipaddr); + if(e != NULL) { + e->time = 0; + } +} +/*---------------------------------------------------------------------------*/ +struct uip_neighbor_addr * +uip_neighbor_lookup(uip_ipaddr_t ipaddr) +{ + struct neighbor_entry *e; + + e = find_entry(ipaddr); + if(e != NULL) { + /* printf("Lookup neighbor with link address %02x:%02x:%02x:%02x:%02x:%02x\n", + e->addr.addr.addr[0], e->addr.addr.addr[1], e->addr.addr.addr[2], e->addr.addr.addr[3], + e->addr.addr.addr[4], e->addr.addr.addr[5]);*/ + + return &e->addr; + } + return NULL; +} +/*---------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/uip/uip-neighbor.h b/third_party/uip-1.0/uip/uip-neighbor.h new file mode 100644 index 0000000..aca096f --- /dev/null +++ b/third_party/uip-1.0/uip/uip-neighbor.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-neighbor.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +/** + * \file + * Header file for database of link-local neighbors, used by + * IPv6 code and to be used by future ARP code. + * \author + * Adam Dunkels + */ + +#ifndef __UIP_NEIGHBOR_H__ +#define __UIP_NEIGHBOR_H__ + +#include "uip.h" + +struct uip_neighbor_addr { +#if UIP_NEIGHBOR_CONF_ADDRTYPE + UIP_NEIGHBOR_CONF_ADDRTYPE addr; +#else + struct uip_eth_addr addr; +#endif +}; + +void uip_neighbor_init(void); +void uip_neighbor_add(uip_ipaddr_t ipaddr, struct uip_neighbor_addr *addr); +void uip_neighbor_update(uip_ipaddr_t ipaddr); +struct uip_neighbor_addr *uip_neighbor_lookup(uip_ipaddr_t ipaddr); +void uip_neighbor_periodic(void); + +#endif /* __UIP-NEIGHBOR_H__ */ diff --git a/third_party/uip-1.0/uip/uip-split.c b/third_party/uip-1.0/uip/uip-split.c new file mode 100644 index 0000000..639b9fc --- /dev/null +++ b/third_party/uip-1.0/uip/uip-split.c @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: uip-split.c,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +#include + +#include "uip-split.h" +#include "uip.h" +#include "uip-fw.h" +#include "uip_arch.h" + + + +#define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN]) + +/*-----------------------------------------------------------------------------*/ +void +uip_split_output(void) +{ + u16_t tcplen, len1, len2; + + /* We only try to split maximum sized TCP segments. */ + if(BUF->proto == UIP_PROTO_TCP && + uip_len == UIP_BUFSIZE - UIP_LLH_LEN) { + + tcplen = uip_len - UIP_TCPIP_HLEN; + /* Split the segment in two. If the original packet length was + odd, we make the second packet one byte larger. */ + len1 = len2 = tcplen / 2; + if(len1 + len2 < tcplen) { + ++len2; + } + + /* Create the first packet. This is done by altering the length + field of the IP header and updating the checksums. */ + uip_len = len1 + UIP_TCPIP_HLEN; +#if UIP_CONF_IPV6 + /* For IPv6, the IP length field does not include the IPv6 IP header + length. */ + BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8); + BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff); +#else /* UIP_CONF_IPV6 */ + BUF->len[0] = uip_len >> 8; + BUF->len[1] = uip_len & 0xff; +#endif /* UIP_CONF_IPV6 */ + + /* Recalculate the TCP checksum. */ + BUF->tcpchksum = 0; + BUF->tcpchksum = ~(uip_tcpchksum()); + +#if !UIP_CONF_IPV6 + /* Recalculate the IP checksum. */ + BUF->ipchksum = 0; + BUF->ipchksum = ~(uip_ipchksum()); +#endif /* UIP_CONF_IPV6 */ + + /* Transmit the first packet. */ + /* uip_fw_output();*/ + tcpip_output(); + + /* Now, create the second packet. To do this, it is not enough to + just alter the length field, but we must also update the TCP + sequence number and point the uip_appdata to a new place in + memory. This place is detemined by the length of the first + packet (len1). */ + uip_len = len2 + UIP_TCPIP_HLEN; +#if UIP_CONF_IPV6 + /* For IPv6, the IP length field does not include the IPv6 IP header + length. */ + BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8); + BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff); +#else /* UIP_CONF_IPV6 */ + BUF->len[0] = uip_len >> 8; + BUF->len[1] = uip_len & 0xff; +#endif /* UIP_CONF_IPV6 */ + + /* uip_appdata += len1;*/ + memcpy(uip_appdata, (u8_t *)uip_appdata + len1, len2); + + uip_add32(BUF->seqno, len1); + BUF->seqno[0] = uip_acc32[0]; + BUF->seqno[1] = uip_acc32[1]; + BUF->seqno[2] = uip_acc32[2]; + BUF->seqno[3] = uip_acc32[3]; + + /* Recalculate the TCP checksum. */ + BUF->tcpchksum = 0; + BUF->tcpchksum = ~(uip_tcpchksum()); + +#if !UIP_CONF_IPV6 + /* Recalculate the IP checksum. */ + BUF->ipchksum = 0; + BUF->ipchksum = ~(uip_ipchksum()); +#endif /* UIP_CONF_IPV6 */ + + /* Transmit the second packet. */ + /* uip_fw_output();*/ + tcpip_output(); + } else { + /* uip_fw_output();*/ + tcpip_output(); + } + +} +/*-----------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/uip/uip-split.h b/third_party/uip-1.0/uip/uip-split.h new file mode 100644 index 0000000..446e192 --- /dev/null +++ b/third_party/uip-1.0/uip/uip-split.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: uip-split.h,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ +/** + * \addtogroup uip + * @{ + */ + +/** + * \defgroup uipsplit uIP TCP throughput booster hack + * @{ + * + * The basic uIP TCP implementation only allows each TCP connection to + * have a single TCP segment in flight at any given time. Because of + * the delayed ACK algorithm employed by most TCP receivers, uIP's + * limit on the amount of in-flight TCP segments seriously reduces the + * maximum achievable throughput for sending data from uIP. + * + * The uip-split module is a hack which tries to remedy this + * situation. By splitting maximum sized outgoing TCP segments into + * two, the delayed ACK algorithm is not invoked at TCP + * receivers. This improves the throughput when sending data from uIP + * by orders of magnitude. + * + * The uip-split module uses the uip-fw module (uIP IP packet + * forwarding) for sending packets. Therefore, the uip-fw module must + * be set up with the appropriate network interfaces for this module + * to work. + */ + + +/** + * \file + * Module for splitting outbound TCP segments in two to avoid the + * delayed ACK throughput degradation. + * \author + * Adam Dunkels + * + */ + +#ifndef __UIP_SPLIT_H__ +#define __UIP_SPLIT_H__ + +/** + * Handle outgoing packets. + * + * This function inspects an outgoing packet in the uip_buf buffer and + * sends it out using the uip_fw_output() function. If the packet is a + * full-sized TCP segment it will be split into two segments and + * transmitted separately. This function should be called instead of + * the actual device driver output function, or the uip_fw_output() + * function. + * + * The headers of the outgoing packet is assumed to be in the uip_buf + * buffer and the payload is assumed to be wherever uip_appdata + * points. The length of the outgoing packet is assumed to be in the + * uip_len variable. + * + */ +void uip_split_output(void); + +#endif /* __UIP_SPLIT_H__ */ + +/** @} */ +/** @} */ diff --git a/third_party/uip-1.0/uip/uip.c b/third_party/uip-1.0/uip/uip.c new file mode 100644 index 0000000..e545b19 --- /dev/null +++ b/third_party/uip-1.0/uip/uip.c @@ -0,0 +1,1942 @@ +#ifdef DEBUG_OUTPUT +#include +#include "uartstdio.h" +#define DEBUG_PRINTF UARTprintf +#else +#define DEBUG_PRINTF(...) /* UARTprintf(__VA_ARGS__) */ +#endif + +/** + * \defgroup uip The uIP TCP/IP stack + * @{ + * + * uIP is an implementation of the TCP/IP protocol stack intended for + * small 8-bit and 16-bit microcontrollers. + * + * uIP provides the necessary protocols for Internet communication, + * with a very small code footprint and RAM requirements - the uIP + * code size is on the order of a few kilobytes and RAM usage is on + * the order of a few hundred bytes. + */ + +/** + * \file + * The uIP TCP/IP stack code. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip.c,v 1.65 2006/06/11 21:46:39 adam Exp $ + * + */ + +/* + * uIP is a small implementation of the IP, UDP and TCP protocols (as + * well as some basic ICMP stuff). The implementation couples the IP, + * UDP, TCP and the application layers very tightly. To keep the size + * of the compiled code down, this code frequently uses the goto + * statement. While it would be possible to break the uip_process() + * function into many smaller functions, this would increase the code + * size because of the overhead of parameter passing and the fact that + * the optimizer would not be as efficient. + * + * The principle is that we have a small buffer, called the uip_buf, + * in which the device driver puts an incoming packet. The TCP/IP + * stack parses the headers in the packet, and calls the + * application. If the remote host has sent data to the application, + * this data is present in the uip_buf and the application read the + * data from there. It is up to the application to put this data into + * a byte stream if needed. The application will not be fed with data + * that is out of sequence. + * + * If the application wishes to send data to the peer, it should put + * its data into the uip_buf. The uip_appdata pointer points to the + * first available byte. The TCP/IP stack will calculate the + * checksums, and fill in the necessary header fields and finally send + * the packet back to the peer. +*/ + +#include "uip.h" +#include "uipopt.h" +#include "uip_arch.h" + +#if UIP_CONF_IPV6 +#include "uip-neighbor.h" +#endif /* UIP_CONF_IPV6 */ + +#include + +/*---------------------------------------------------------------------------*/ +/* Variable definitions. */ + + +/* The IP address of this host. If it is defined to be fixed (by + setting UIP_FIXEDADDR to 1 in uipopt.h), the address is set + here. Otherwise, the address */ +#if UIP_FIXEDADDR > 0 +const uip_ipaddr_t uip_hostaddr = + {HTONS((UIP_IPADDR0 << 8) | UIP_IPADDR1), + HTONS((UIP_IPADDR2 << 8) | UIP_IPADDR3)}; +const uip_ipaddr_t uip_draddr = + {HTONS((UIP_DRIPADDR0 << 8) | UIP_DRIPADDR1), + HTONS((UIP_DRIPADDR2 << 8) | UIP_DRIPADDR3)}; +const uip_ipaddr_t uip_netmask = + {HTONS((UIP_NETMASK0 << 8) | UIP_NETMASK1), + HTONS((UIP_NETMASK2 << 8) | UIP_NETMASK3)}; +#else +uip_ipaddr_t uip_hostaddr, uip_draddr, uip_netmask; +#endif /* UIP_FIXEDADDR */ + +static const uip_ipaddr_t all_ones_addr = +#if UIP_CONF_IPV6 + {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff}; +#else /* UIP_CONF_IPV6 */ + {0xffff,0xffff}; +#endif /* UIP_CONF_IPV6 */ +static const uip_ipaddr_t all_zeroes_addr = +#if UIP_CONF_IPV6 + {0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000}; +#else /* UIP_CONF_IPV6 */ + {0x0000,0x0000}; +#endif /* UIP_CONF_IPV6 */ + + +#if UIP_FIXEDETHADDR +const struct uip_eth_addr uip_ethaddr = {{UIP_ETHADDR0, + UIP_ETHADDR1, + UIP_ETHADDR2, + UIP_ETHADDR3, + UIP_ETHADDR4, + UIP_ETHADDR5}}; +#else +struct uip_eth_addr uip_ethaddr = {{0,0,0,0,0,0}}; +#endif + +#ifndef UIP_CONF_EXTERNAL_BUFFER +u8_t uip_buf[UIP_BUFSIZE + 2]; /* The packet buffer that contains + incoming packets. */ +#endif /* UIP_CONF_EXTERNAL_BUFFER */ + +void *uip_appdata; /* The uip_appdata pointer points to + application data. */ +void *uip_sappdata; /* The uip_appdata pointer points to + the application data which is to + be sent. */ +#if UIP_URGDATA > 0 +void *uip_urgdata; /* The uip_urgdata pointer points to + urgent data (out-of-band data), if + present. */ +u16_t uip_urglen, uip_surglen; +#endif /* UIP_URGDATA > 0 */ + +u16_t uip_len, uip_slen; + /* The uip_len is either 8 or 16 bits, + depending on the maximum packet + size. */ + +u8_t uip_flags; /* The uip_flags variable is used for + communication between the TCP/IP stack + and the application program. */ + +#if UIP_TCP +struct uip_conn *uip_conn; /* uip_conn always points to the current + connection. */ + +struct uip_conn uip_conns[UIP_CONNS]; + /* The uip_conns array holds all TCP + connections. */ +u16_t uip_listenports[UIP_LISTENPORTS]; + /* The uip_listenports list all currently + listning ports. */ +#endif /* UIP_TCP */ + +#if UIP_UDP +struct uip_udp_conn *uip_udp_conn; +struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS]; +#endif /* UIP_UDP */ + +static u16_t ipid; /* Ths ipid variable is an increasing + number that is used for the IP ID + field. */ + +void uip_setipid(u16_t id) { ipid = id; } + +#if UIP_TCP +static u8_t iss[4]; /* The iss variable is used for the TCP + initial sequence number. */ +#endif /* UIP_TCP */ + +#if UIP_ACTIVE_OPEN +static u16_t lastport; /* Keeps track of the last port used for + a new connection. */ +#endif /* UIP_ACTIVE_OPEN */ + +/* Temporary variables. */ +#if UIP_TCP +u8_t uip_acc32[4]; +static u8_t c, opt; +static u16_t tmp16; +#endif /* UIP_TCP */ + +/* Structures and definitions. */ +#define TCP_FIN 0x01 +#define TCP_SYN 0x02 +#define TCP_RST 0x04 +#define TCP_PSH 0x08 +#define TCP_ACK 0x10 +#define TCP_URG 0x20 +#define TCP_CTL 0x3f + +#define TCP_OPT_END 0 /* End of TCP options list */ +#define TCP_OPT_NOOP 1 /* "No-operation" TCP option */ +#define TCP_OPT_MSS 2 /* Maximum segment size TCP option */ + +#define TCP_OPT_MSS_LEN 4 /* Length of TCP MSS option. */ + +#define ICMP_ECHO_REPLY 0 +#define ICMP_ECHO 8 + +#define ICMP6_ECHO_REPLY 129 +#define ICMP6_ECHO 128 +#define ICMP6_NEIGHBOR_SOLICITATION 135 +#define ICMP6_NEIGHBOR_ADVERTISEMENT 136 + +#define ICMP6_FLAG_S (1 << 6) + +#define ICMP6_OPTION_SOURCE_LINK_ADDRESS 1 +#define ICMP6_OPTION_TARGET_LINK_ADDRESS 2 + + +/* Macros. */ +#define BUF ((struct uip_tcpip_hdr *)&uip_buf[UIP_LLH_LEN]) +#define FBUF ((struct uip_tcpip_hdr *)&uip_reassbuf[0]) +#define ICMPBUF ((struct uip_icmpip_hdr *)&uip_buf[UIP_LLH_LEN]) +#define UDPBUF ((struct uip_udpip_hdr *)&uip_buf[UIP_LLH_LEN]) + + +#if UIP_STATISTICS == 1 +struct uip_stats uip_stat; +#define UIP_STAT(s) s +#else +#define UIP_STAT(s) +#endif /* UIP_STATISTICS == 1 */ + +#if UIP_LOGGING == 1 +#include +void uip_log(char *msg); +#define UIP_LOG(m) uip_log(m) +#else +#define UIP_LOG(m) +#endif /* UIP_LOGGING == 1 */ + +#if ! UIP_ARCH_ADD32 && UIP_TCP +void +uip_add32(u8_t *op32, u16_t op16) +{ + uip_acc32[3] = op32[3] + (op16 & 0xff); + uip_acc32[2] = op32[2] + (op16 >> 8); + uip_acc32[1] = op32[1]; + uip_acc32[0] = op32[0]; + + if(uip_acc32[2] < (op16 >> 8)) { + ++uip_acc32[1]; + if(uip_acc32[1] == 0) { + ++uip_acc32[0]; + } + } + + + if(uip_acc32[3] < (op16 & 0xff)) { + ++uip_acc32[2]; + if(uip_acc32[2] == 0) { + ++uip_acc32[1]; + if(uip_acc32[1] == 0) { + ++uip_acc32[0]; + } + } + } +} + +#endif /* ! UIP_ARCH_ADD32 && UIP_TCP */ + +#if ! UIP_ARCH_CHKSUM +/*---------------------------------------------------------------------------*/ +static u16_t +chksum(u16_t sum, const u8_t *data, u16_t len) +{ + u16_t t; + const u8_t *dataptr; + const u8_t *last_byte; + + dataptr = data; + last_byte = data + len - 1; + + while(dataptr < last_byte) { /* At least two more bytes */ + t = (dataptr[0] << 8) + dataptr[1]; + sum += t; + if(sum < t) { + sum++; /* carry */ + } + dataptr += 2; + } + + if(dataptr == last_byte) { + t = (dataptr[0] << 8) + 0; + sum += t; + if(sum < t) { + sum++; /* carry */ + } + } + + /* Return sum in host byte order. */ + return sum; +} +/*---------------------------------------------------------------------------*/ +u16_t +uip_chksum(u16_t *data, u16_t len) +{ + return htons(chksum(0, (u8_t *)data, len)); +} +/*---------------------------------------------------------------------------*/ +#ifndef UIP_ARCH_IPCHKSUM +u16_t +uip_ipchksum(void) +{ + u16_t sum; + + sum = chksum(0, &uip_buf[UIP_LLH_LEN], UIP_IPH_LEN); + DEBUG_PRINTF("uip_ipchksum: sum 0x%04x\n", sum); + return (sum == 0) ? 0xffff : htons(sum); +} +#endif +/*---------------------------------------------------------------------------*/ +#if UIP_CONF_IPV6 || UIP_TCP || UIP_UDP_CHECKSUMS +static u16_t +upper_layer_chksum(u8_t proto) +{ + u16_t upper_layer_len; + u16_t sum; + +#if UIP_CONF_IPV6 + upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]); +#else /* UIP_CONF_IPV6 */ + upper_layer_len = (((u16_t)(BUF->len[0]) << 8) + BUF->len[1]) - UIP_IPH_LEN; +#endif /* UIP_CONF_IPV6 */ + + /* First sum pseudoheader. */ + + /* IP protocol and length fields. This addition cannot carry. */ + sum = upper_layer_len + proto; + /* Sum IP source and destination addresses. */ + sum = chksum(sum, (u8_t *)&BUF->srcipaddr[0], 2 * sizeof(uip_ipaddr_t)); + + /* Sum TCP header and data. */ + sum = chksum(sum, &uip_buf[UIP_IPH_LEN + UIP_LLH_LEN], + upper_layer_len); + + return (sum == 0) ? 0xffff : htons(sum); +} +#endif /* UIP_CONF_IPV6 || UIP_TCP || UIP_UDP_CHECKSUMS */ +/*---------------------------------------------------------------------------*/ +#if UIP_CONF_IPV6 +u16_t +uip_icmp6chksum(void) +{ + return upper_layer_chksum(UIP_PROTO_ICMP6); + +} +#endif /* UIP_CONF_IPV6 */ +/*---------------------------------------------------------------------------*/ +#if UIP_TCP +u16_t +uip_tcpchksum(void) +{ + return upper_layer_chksum(UIP_PROTO_TCP); +} +#endif /* UIP_TCP */ +/*---------------------------------------------------------------------------*/ +#if UIP_UDP_CHECKSUMS +u16_t +uip_udpchksum(void) +{ + return upper_layer_chksum(UIP_PROTO_UDP); +} +#endif /* UIP_UDP_CHECKSUMS */ +#endif /* UIP_ARCH_CHKSUM */ +/*---------------------------------------------------------------------------*/ +void +uip_init(void) +{ +#if UIP_TCP + for(c = 0; c < UIP_LISTENPORTS; ++c) { + uip_listenports[c] = 0; + } + for(c = 0; c < UIP_CONNS; ++c) { + uip_conns[c].tcpstateflags = UIP_CLOSED; + } +#endif /* UIP_TCP */ +#if UIP_ACTIVE_OPEN + lastport = 1024; +#endif /* UIP_ACTIVE_OPEN */ + +#if UIP_UDP + for(c = 0; c < UIP_UDP_CONNS; ++c) { + uip_udp_conns[c].lport = 0; + } +#endif /* UIP_UDP */ + + + /* IPv4 initialization. */ +#if UIP_FIXEDADDR == 0 + /* uip_hostaddr[0] = uip_hostaddr[1] = 0;*/ +#endif /* UIP_FIXEDADDR */ + +} +/*---------------------------------------------------------------------------*/ +#if UIP_ACTIVE_OPEN && UIP_TCP +struct uip_conn * +uip_connect(uip_ipaddr_t *ripaddr, u16_t rport) +{ + register struct uip_conn *conn, *cconn; + + /* Find an unused local port. */ + again: + ++lastport; + + if(lastport >= 32000) { + lastport = 4096; + } + + /* Check if this port is already in use, and if so try to find + another one. */ + for(c = 0; c < UIP_CONNS; ++c) { + conn = &uip_conns[c]; + if(conn->tcpstateflags != UIP_CLOSED && + conn->lport == htons(lastport)) { + goto again; + } + } + + conn = 0; + for(c = 0; c < UIP_CONNS; ++c) { + cconn = &uip_conns[c]; + if(cconn->tcpstateflags == UIP_CLOSED) { + conn = cconn; + break; + } + if(cconn->tcpstateflags == UIP_TIME_WAIT) { + if(conn == 0 || + cconn->timer > conn->timer) { + conn = cconn; + } + } + } + + if(conn == 0) { + return 0; + } + + conn->tcpstateflags = UIP_SYN_SENT; + + conn->snd_nxt[0] = iss[0]; + conn->snd_nxt[1] = iss[1]; + conn->snd_nxt[2] = iss[2]; + conn->snd_nxt[3] = iss[3]; + + conn->initialmss = conn->mss = UIP_TCP_MSS; + + conn->len = 1; /* TCP length of the SYN is one. */ + conn->nrtx = 0; + conn->timer = 1; /* Send the SYN next time around. */ + conn->rto = UIP_RTO; + conn->sa = 0; + conn->sv = 16; /* Initial value of the RTT variance. */ + conn->lport = htons(lastport); + conn->rport = rport; + uip_ipaddr_copy(&conn->ripaddr, ripaddr); + + return conn; +} +#endif /* UIP_ACTIVE_OPEN && UIP_TCP */ +/*---------------------------------------------------------------------------*/ +#if UIP_UDP +struct uip_udp_conn * +uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport) +{ + register struct uip_udp_conn *conn; + + /* Find an unused local port. */ + again: + ++lastport; + + if(lastport >= 32000) { + lastport = 4096; + } + + for(c = 0; c < UIP_UDP_CONNS; ++c) { + if(uip_udp_conns[c].lport == htons(lastport)) { + goto again; + } + } + + + conn = 0; + for(c = 0; c < UIP_UDP_CONNS; ++c) { + if(uip_udp_conns[c].lport == 0) { + conn = &uip_udp_conns[c]; + break; + } + } + + if(conn == 0) { + return 0; + } + + conn->lport = HTONS(lastport); + conn->rport = rport; + if(ripaddr == NULL) { + memset(conn->ripaddr, 0, sizeof(uip_ipaddr_t)); + } else { + uip_ipaddr_copy(&conn->ripaddr, ripaddr); + } + conn->ttl = UIP_TTL; + + return conn; +} +#endif /* UIP_UDP */ +/*---------------------------------------------------------------------------*/ +#if UIP_TCP +void +uip_unlisten(u16_t port) +{ + for(c = 0; c < UIP_LISTENPORTS; ++c) { + if(uip_listenports[c] == port) { + uip_listenports[c] = 0; + return; + } + } +} +#endif /* UIP_TCP */ +/*---------------------------------------------------------------------------*/ +#if UIP_TCP +void +uip_listen(u16_t port) +{ + for(c = 0; c < UIP_LISTENPORTS; ++c) { + if(uip_listenports[c] == 0) { + uip_listenports[c] = port; + return; + } + } +} +#endif /* UIP_TCP */ +/*---------------------------------------------------------------------------*/ +/* XXX: IP fragment reassembly: not well-tested. */ + +#if UIP_REASSEMBLY && !UIP_CONF_IPV6 +#define UIP_REASS_BUFSIZE (UIP_BUFSIZE - UIP_LLH_LEN) +static u8_t uip_reassbuf[UIP_REASS_BUFSIZE]; +static u8_t uip_reassbitmap[UIP_REASS_BUFSIZE / (8 * 8)]; +static const u8_t bitmap_bits[8] = {0xff, 0x7f, 0x3f, 0x1f, + 0x0f, 0x07, 0x03, 0x01}; +static u16_t uip_reasslen; +static u8_t uip_reassflags; +#define UIP_REASS_FLAG_LASTFRAG 0x01 +static u8_t uip_reasstmr; + +#define IP_MF 0x20 + +static u8_t +uip_reass(void) +{ + u16_t offset, len; + u16_t i; + + /* If ip_reasstmr is zero, no packet is present in the buffer, so we + write the IP header of the fragment into the reassembly + buffer. The timer is updated with the maximum age. */ + if(uip_reasstmr == 0) { + memcpy(uip_reassbuf, &BUF->vhl, UIP_IPH_LEN); + uip_reasstmr = UIP_REASS_MAXAGE; + uip_reassflags = 0; + /* Clear the bitmap. */ + memset(uip_reassbitmap, 0, sizeof(uip_reassbitmap)); + } + + /* Check if the incoming fragment matches the one currently present + in the reassembly buffer. If so, we proceed with copying the + fragment into the buffer. */ + if(BUF->srcipaddr[0] == FBUF->srcipaddr[0] && + BUF->srcipaddr[1] == FBUF->srcipaddr[1] && + BUF->destipaddr[0] == FBUF->destipaddr[0] && + BUF->destipaddr[1] == FBUF->destipaddr[1] && + BUF->ipid[0] == FBUF->ipid[0] && + BUF->ipid[1] == FBUF->ipid[1]) { + + len = (BUF->len[0] << 8) + BUF->len[1] - (BUF->vhl & 0x0f) * 4; + offset = (((BUF->ipoffset[0] & 0x3f) << 8) + BUF->ipoffset[1]) * 8; + + /* If the offset or the offset + fragment length overflows the + reassembly buffer, we discard the entire packet. */ + if(offset > UIP_REASS_BUFSIZE || + offset + len > UIP_REASS_BUFSIZE) { + uip_reasstmr = 0; + goto nullreturn; + } + + /* Copy the fragment into the reassembly buffer, at the right + offset. */ + memcpy(&uip_reassbuf[UIP_IPH_LEN + offset], + (char *)BUF + (int)((BUF->vhl & 0x0f) * 4), + len); + + /* Update the bitmap. */ + if(offset / (8 * 8) == (offset + len) / (8 * 8)) { + /* If the two endpoints are in the same byte, we only update + that byte. */ + + uip_reassbitmap[offset / (8 * 8)] |= + bitmap_bits[(offset / 8 ) & 7] & + ~bitmap_bits[((offset + len) / 8 ) & 7]; + } else { + /* If the two endpoints are in different bytes, we update the + bytes in the endpoints and fill the stuff inbetween with + 0xff. */ + uip_reassbitmap[offset / (8 * 8)] |= + bitmap_bits[(offset / 8 ) & 7]; + for(i = 1 + offset / (8 * 8); i < (offset + len) / (8 * 8); ++i) { + uip_reassbitmap[i] = 0xff; + } + uip_reassbitmap[(offset + len) / (8 * 8)] |= + ~bitmap_bits[((offset + len) / 8 ) & 7]; + } + + /* If this fragment has the More Fragments flag set to zero, we + know that this is the last fragment, so we can calculate the + size of the entire packet. We also set the + IP_REASS_FLAG_LASTFRAG flag to indicate that we have received + the final fragment. */ + + if((BUF->ipoffset[0] & IP_MF) == 0) { + uip_reassflags |= UIP_REASS_FLAG_LASTFRAG; + uip_reasslen = offset + len; + } + + /* Finally, we check if we have a full packet in the buffer. We do + this by checking if we have the last fragment and if all bits + in the bitmap are set. */ + if(uip_reassflags & UIP_REASS_FLAG_LASTFRAG) { + /* Check all bytes up to and including all but the last byte in + the bitmap. */ + for(i = 0; i < uip_reasslen / (8 * 8) - 1; ++i) { + if(uip_reassbitmap[i] != 0xff) { + goto nullreturn; + } + } + /* Check the last byte in the bitmap. It should contain just the + right amount of bits. */ + if(uip_reassbitmap[uip_reasslen / (8 * 8)] != + (u8_t)~bitmap_bits[uip_reasslen / 8 & 7]) { + goto nullreturn; + } + + /* If we have come this far, we have a full packet in the + buffer, so we allocate a pbuf and copy the packet into it. We + also reset the timer. */ + uip_reasstmr = 0; + memcpy(BUF, FBUF, uip_reasslen); + + /* Pretend to be a "normal" (i.e., not fragmented) IP packet + from now on. */ + BUF->ipoffset[0] = BUF->ipoffset[1] = 0; + BUF->len[0] = uip_reasslen >> 8; + BUF->len[1] = uip_reasslen & 0xff; + BUF->ipchksum = 0; + BUF->ipchksum = ~(uip_ipchksum()); + + return uip_reasslen; + } + } + + nullreturn: + return 0; +} +#endif /* UIP_REASSEMBLY */ +/*---------------------------------------------------------------------------*/ +#if UIP_TCP +static void +uip_add_rcv_nxt(u16_t n) +{ + uip_add32(uip_conn->rcv_nxt, n); + uip_conn->rcv_nxt[0] = uip_acc32[0]; + uip_conn->rcv_nxt[1] = uip_acc32[1]; + uip_conn->rcv_nxt[2] = uip_acc32[2]; + uip_conn->rcv_nxt[3] = uip_acc32[3]; +} +#endif /* UIP_TCP */ +/*---------------------------------------------------------------------------*/ +void +uip_process(u8_t flag) +{ +#if UIP_TCP + register struct uip_conn *uip_connr = uip_conn; +#endif /* UIP_TCP */ + +#if UIP_UDP + if(flag == UIP_UDP_SEND_CONN) { + goto udp_send; + } +#endif /* UIP_UDP */ + + uip_sappdata = uip_appdata = &uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN]; + + /* Check if we were invoked because of a poll request for a + particular connection. */ +#if UIP_TCP + if(flag == UIP_POLL_REQUEST) { + if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED && + !uip_outstanding(uip_connr)) { + uip_flags = UIP_POLL; + UIP_APPCALL(); + goto appsend; + } + goto drop; + + /* Check if we were invoked because of the periodic timer firing. */ + } else if(flag == UIP_TIMER) { +#if UIP_REASSEMBLY + if(uip_reasstmr != 0) { + --uip_reasstmr; + } +#endif /* UIP_REASSEMBLY */ + /* Increase the initial sequence number. */ + if(++iss[3] == 0) { + if(++iss[2] == 0) { + if(++iss[1] == 0) { + ++iss[0]; + } + } + } + + /* Reset the length variables. */ + uip_len = 0; + uip_slen = 0; + + /* Check if the connection is in a state in which we simply wait + for the connection to time out. If so, we increase the + connection's timer and remove the connection if it times + out. */ + if(uip_connr->tcpstateflags == UIP_TIME_WAIT || + uip_connr->tcpstateflags == UIP_FIN_WAIT_2) { + ++(uip_connr->timer); + if(uip_connr->timer == UIP_TIME_WAIT_TIMEOUT) { + uip_connr->tcpstateflags = UIP_CLOSED; + } + } else if(uip_connr->tcpstateflags != UIP_CLOSED) { + /* If the connection has outstanding data, we increase the + connection's timer and see if it has reached the RTO value + in which case we retransmit. */ + if(uip_outstanding(uip_connr)) { + if(uip_connr->timer-- == 0) { + if(uip_connr->nrtx == UIP_MAXRTX || + ((uip_connr->tcpstateflags == UIP_SYN_SENT || + uip_connr->tcpstateflags == UIP_SYN_RCVD) && + uip_connr->nrtx == UIP_MAXSYNRTX)) { + uip_connr->tcpstateflags = UIP_CLOSED; + + /* We call UIP_APPCALL() with uip_flags set to + UIP_TIMEDOUT to inform the application that the + connection has timed out. */ + uip_flags = UIP_TIMEDOUT; + UIP_APPCALL(); + + /* We also send a reset packet to the remote host. */ + BUF->flags = TCP_RST | TCP_ACK; + goto tcp_send_nodata; + } + + /* Exponential backoff. */ + uip_connr->timer = UIP_RTO << (uip_connr->nrtx > 4? + 4: + uip_connr->nrtx); + ++(uip_connr->nrtx); + + /* Ok, so we need to retransmit. We do this differently + depending on which state we are in. In ESTABLISHED, we + call upon the application so that it may prepare the + data for the retransmit. In SYN_RCVD, we resend the + SYNACK that we sent earlier and in LAST_ACK we have to + retransmit our FINACK. */ + UIP_STAT(++uip_stat.tcp.rexmit); + switch(uip_connr->tcpstateflags & UIP_TS_MASK) { + case UIP_SYN_RCVD: + /* In the SYN_RCVD state, we should retransmit our + SYNACK. */ + goto tcp_send_synack; + +#if UIP_ACTIVE_OPEN + case UIP_SYN_SENT: + /* In the SYN_SENT state, we retransmit out SYN. */ + BUF->flags = 0; + goto tcp_send_syn; +#endif /* UIP_ACTIVE_OPEN */ + + case UIP_ESTABLISHED: + /* In the ESTABLISHED state, we call upon the application + to do the actual retransmit after which we jump into + the code for sending out the packet (the apprexmit + label). */ + uip_flags = UIP_REXMIT; + UIP_APPCALL(); + goto apprexmit; + + case UIP_FIN_WAIT_1: + case UIP_CLOSING: + case UIP_LAST_ACK: + /* In all these states we should retransmit a FINACK. */ + goto tcp_send_finack; + + } + } + } else if((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_ESTABLISHED) { + /* If there was no need for a retransmission, we poll the + application for new data. */ + uip_flags = UIP_POLL; + UIP_APPCALL(); + goto appsend; + } + } + goto drop; + } +#endif /* UIP_TCP */ +#if UIP_UDP + if(flag == UIP_UDP_TIMER) { + if(uip_udp_conn->lport != 0) { +#if UIP_TCP + uip_conn = NULL; +#endif /* UIP_TCP */ + uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; + uip_len = uip_slen = 0; + uip_flags = UIP_POLL; + UIP_UDP_APPCALL(); + goto udp_send; + } else { + goto drop; + } + } +#endif + + /* This is where the input processing starts. */ + UIP_STAT(++uip_stat.ip.recv); + + /* Start of IP input header processing code. */ + +#if UIP_CONF_IPV6 + /* Check validity of the IP header. */ + if((BUF->vtc & 0xf0) != 0x60) { /* IP version and header length. */ + UIP_STAT(++uip_stat.ip.drop); + UIP_STAT(++uip_stat.ip.vhlerr); + UIP_LOG("ipv6: invalid version."); + goto drop; + } +#else /* UIP_CONF_IPV6 */ + /* Check validity of the IP header. */ + if(BUF->vhl != 0x45) { /* IP version and header length. */ + UIP_STAT(++uip_stat.ip.drop); + UIP_STAT(++uip_stat.ip.vhlerr); + UIP_LOG("ip: invalid version or header length."); + goto drop; + } +#endif /* UIP_CONF_IPV6 */ + + /* Check the size of the packet. If the size reported to us in + uip_len is smaller the size reported in the IP header, we assume + that the packet has been corrupted in transit. If the size of + uip_len is larger than the size reported in the IP packet header, + the packet has been padded and we set uip_len to the correct + value.. */ + + if((BUF->len[0] << 8) + BUF->len[1] <= uip_len) { + uip_len = (BUF->len[0] << 8) + BUF->len[1]; +#if UIP_CONF_IPV6 + uip_len += 40; /* The length reported in the IPv6 header is the + length of the payload that follows the + header. However, uIP uses the uip_len variable + for holding the size of the entire packet, + including the IP header. For IPv4 this is not a + problem as the length field in the IPv4 header + contains the length of the entire packet. But + for IPv6 we need to add the size of the IPv6 + header (40 bytes). */ +#endif /* UIP_CONF_IPV6 */ + } else { + UIP_LOG("ip: packet shorter than reported in IP header."); + goto drop; + } + +#if !UIP_CONF_IPV6 + /* Check the fragment flag. */ + if((BUF->ipoffset[0] & 0x3f) != 0 || + BUF->ipoffset[1] != 0) { +#if UIP_REASSEMBLY + uip_len = uip_reass(); + if(uip_len == 0) { + goto drop; + } +#else /* UIP_REASSEMBLY */ + UIP_STAT(++uip_stat.ip.drop); + UIP_STAT(++uip_stat.ip.fragerr); + UIP_LOG("ip: fragment dropped."); + goto drop; +#endif /* UIP_REASSEMBLY */ + } +#endif /* UIP_CONF_IPV6 */ + + if(uip_ipaddr_cmp(uip_hostaddr, all_zeroes_addr)) { + /* If we are configured to use ping IP address configuration and + hasn't been assigned an IP address yet, we accept all ICMP + packets. */ +#if UIP_PINGADDRCONF && !UIP_CONF_IPV6 + if(BUF->proto == UIP_PROTO_ICMP) { + UIP_LOG("ip: possible ping config packet received."); + goto icmp_input; + } else { + UIP_LOG("ip: packet dropped since no address assigned."); + goto drop; + } +#endif /* UIP_PINGADDRCONF */ + + } else { + /* If IP broadcast support is configured, we check for a broadcast + UDP packet, which may be destined to us. */ +#if UIP_BROADCAST + DEBUG_PRINTF("UDP IP checksum 0x%04x\n", uip_ipchksum()); + if(BUF->proto == UIP_PROTO_UDP && + uip_ipaddr_cmp(BUF->destipaddr, all_ones_addr) + /*&& + uip_ipchksum() == 0xffff*/) { + goto udp_input; + } +#endif /* UIP_BROADCAST */ + + /* Check if the packet is destined for our IP address. */ +#if !UIP_CONF_IPV6 + if(!uip_ipaddr_cmp(BUF->destipaddr, uip_hostaddr)) { + UIP_STAT(++uip_stat.ip.drop); + goto drop; + } +#else /* UIP_CONF_IPV6 */ + /* For IPv6, packet reception is a little trickier as we need to + make sure that we listen to certain multicast addresses (all + hosts multicast address, and the solicited-node multicast + address) as well. However, we will cheat here and accept all + multicast packets that are sent to the ff02::/16 addresses. */ + if(!uip_ipaddr_cmp(BUF->destipaddr, uip_hostaddr) && + BUF->destipaddr[0] != HTONS(0xff02)) { + UIP_STAT(++uip_stat.ip.drop); + goto drop; + } +#endif /* UIP_CONF_IPV6 */ + } + +#if !UIP_CONF_IPV6 + if(uip_ipchksum() != 0xffff) { /* Compute and check the IP header + checksum. */ + UIP_STAT(++uip_stat.ip.drop); + UIP_STAT(++uip_stat.ip.chkerr); + UIP_LOG("ip: bad checksum."); + goto drop; + } +#endif /* UIP_CONF_IPV6 */ + +#if UIP_TCP + if(BUF->proto == UIP_PROTO_TCP) { /* Check for TCP packet. If so, + proceed with TCP input + processing. */ + goto tcp_input; + } +#endif /* UIP_TCP */ + +#if UIP_UDP + if(BUF->proto == UIP_PROTO_UDP) { + goto udp_input; + } +#endif /* UIP_UDP */ + +#if !UIP_CONF_IPV6 + /* ICMPv4 processing code follows. */ + if(BUF->proto != UIP_PROTO_ICMP) { /* We only allow ICMP packets from + here. */ + UIP_STAT(++uip_stat.ip.drop); + UIP_STAT(++uip_stat.ip.protoerr); + UIP_LOG("ip: neither tcp nor icmp."); + goto drop; + } + +#if UIP_PINGADDRCONF + icmp_input: +#endif /* UIP_PINGADDRCONF */ + UIP_STAT(++uip_stat.icmp.recv); + + /* ICMP echo (i.e., ping) processing. This is simple, we only change + the ICMP type from ECHO to ECHO_REPLY and adjust the ICMP + checksum before we return the packet. */ + if(ICMPBUF->type != ICMP_ECHO) { + UIP_STAT(++uip_stat.icmp.drop); + UIP_STAT(++uip_stat.icmp.typeerr); + UIP_LOG("icmp: not icmp echo."); + goto drop; + } + + /* If we are configured to use ping IP address assignment, we use + the destination IP address of this ping packet and assign it to + ourself. */ +#if UIP_PINGADDRCONF + if((uip_hostaddr[0] | uip_hostaddr[1]) == 0) { + uip_hostaddr[0] = BUF->destipaddr[0]; + uip_hostaddr[1] = BUF->destipaddr[1]; + } +#endif /* UIP_PINGADDRCONF */ + + ICMPBUF->type = ICMP_ECHO_REPLY; + +#if UIP_OFFLOAD_ICMP_CHKSUM + /* If the hardware is inserting ICMP checksums for us, clear the field to + ensure that the correct checksum is calculated. */ + ICMPBUF->icmpchksum = 0; +#else + if(ICMPBUF->icmpchksum >= HTONS(0xffff - (ICMP_ECHO << 8))) { + ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8) + 1; + } else { + ICMPBUF->icmpchksum += HTONS(ICMP_ECHO << 8); + } +#endif + + /* Swap IP addresses. */ + uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr); + uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr); + + UIP_STAT(++uip_stat.icmp.sent); + goto send; + + /* End of IPv4 input header processing code. */ +#else /* !UIP_CONF_IPV6 */ + + /* This is IPv6 ICMPv6 processing code. */ + DEBUG_PRINTF("icmp6_input: length %d\n", uip_len); + + if(BUF->proto != UIP_PROTO_ICMP6) { /* We only allow ICMPv6 packets from + here. */ + UIP_STAT(++uip_stat.ip.drop); + UIP_STAT(++uip_stat.ip.protoerr); + UIP_LOG("ip: neither tcp nor icmp6."); + goto drop; + } + + UIP_STAT(++uip_stat.icmp.recv); + + /* If we get a neighbor solicitation for our address we should send + a neighbor advertisement message back. */ + if(ICMPBUF->type == ICMP6_NEIGHBOR_SOLICITATION) { + if(uip_ipaddr_cmp(ICMPBUF->icmp6data, uip_hostaddr)) { + + if(ICMPBUF->options[0] == ICMP6_OPTION_SOURCE_LINK_ADDRESS) { + /* Save the sender's address in our neighbor list. */ + uip_neighbor_add(ICMPBUF->srcipaddr, &(ICMPBUF->options[2])); + } + + /* We should now send a neighbor advertisement back to where the + neighbor solicitation came from. */ + ICMPBUF->type = ICMP6_NEIGHBOR_ADVERTISEMENT; + ICMPBUF->flags = ICMP6_FLAG_S; /* Solicited flag. */ + + ICMPBUF->reserved1 = ICMPBUF->reserved2 = ICMPBUF->reserved3 = 0; + + uip_ipaddr_copy(ICMPBUF->destipaddr, ICMPBUF->srcipaddr); + uip_ipaddr_copy(ICMPBUF->srcipaddr, uip_hostaddr); + ICMPBUF->options[0] = ICMP6_OPTION_TARGET_LINK_ADDRESS; + ICMPBUF->options[1] = 1; /* Options length, 1 = 8 bytes. */ + memcpy(&(ICMPBUF->options[2]), &uip_ethaddr, sizeof(uip_ethaddr)); + ICMPBUF->icmpchksum = 0; + ICMPBUF->icmpchksum = ~uip_icmp6chksum(); + goto send; + + } + goto drop; + } else if(ICMPBUF->type == ICMP6_ECHO) { + /* ICMP echo (i.e., ping) processing. This is simple, we only + change the ICMP type from ECHO to ECHO_REPLY and update the + ICMP checksum before we return the packet. */ + + ICMPBUF->type = ICMP6_ECHO_REPLY; + + uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr); + uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr); + ICMPBUF->icmpchksum = 0; + ICMPBUF->icmpchksum = ~uip_icmp6chksum(); + + UIP_STAT(++uip_stat.icmp.sent); + goto send; + } else { + DEBUG_PRINTF("Unknown icmp6 message type %d\n", ICMPBUF->type); + UIP_STAT(++uip_stat.icmp.drop); + UIP_STAT(++uip_stat.icmp.typeerr); + UIP_LOG("icmp: unknown ICMP message."); + goto drop; + } + + /* End of IPv6 ICMP processing. */ + +#endif /* !UIP_CONF_IPV6 */ + +#if UIP_UDP + /* UDP input processing. */ + udp_input: + /* UDP processing is really just a hack. We don't do anything to the + UDP/IP headers, but let the UDP application do all the hard + work. If the application sets uip_slen, it has a packet to + send. */ +#if UIP_UDP_CHECKSUMS + uip_len = uip_len - UIP_IPUDPH_LEN; + uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; + if(UDPBUF->udpchksum != 0 && uip_udpchksum() != 0xffff) { + UIP_STAT(++uip_stat.udp.drop); + UIP_STAT(++uip_stat.udp.chkerr); + UIP_LOG("udp: bad checksum."); + goto drop; + } +#else /* UIP_UDP_CHECKSUMS */ + uip_len = uip_len - UIP_IPUDPH_LEN; +#endif /* UIP_UDP_CHECKSUMS */ + + /* Demultiplex this UDP packet between the UDP "connections". */ + for(uip_udp_conn = &uip_udp_conns[0]; + uip_udp_conn < &uip_udp_conns[UIP_UDP_CONNS]; + ++uip_udp_conn) { + /* If the local UDP port is non-zero, the connection is considered + to be used. If so, the local port number is checked against the + destination port number in the received packet. If the two port + numbers match, the remote port number is checked if the + connection is bound to a remote port. Finally, if the + connection is bound to a remote IP address, the source IP + address of the packet is checked. */ + if(uip_udp_conn->lport != 0 && + UDPBUF->destport == uip_udp_conn->lport && + (uip_udp_conn->rport == 0 || + UDPBUF->srcport == uip_udp_conn->rport || + uip_udp_conn->rport == HTONS(69)) && + (uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_zeroes_addr) || + uip_ipaddr_cmp(uip_udp_conn->ripaddr, all_ones_addr) || + uip_ipaddr_cmp(BUF->srcipaddr, uip_udp_conn->ripaddr))) { + goto udp_found; + } + } + UIP_LOG("udp: no matching connection found"); + goto drop; + + udp_found: +#if UIP_TCP + uip_conn = NULL; +#endif /* UIP_TCP */ + uip_flags = UIP_NEWDATA; + uip_sappdata = uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPUDPH_LEN]; + uip_slen = 0; + UIP_UDP_APPCALL(); + udp_send: + if(uip_slen == 0) { + goto drop; + } + uip_len = uip_slen + UIP_IPUDPH_LEN; + +#if UIP_CONF_IPV6 + /* For IPv6, the IP length field does not include the IPv6 IP header + length. */ + BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8); + BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff); +#else /* UIP_CONF_IPV6 */ + BUF->len[0] = (uip_len >> 8); + BUF->len[1] = (uip_len & 0xff); +#endif /* UIP_CONF_IPV6 */ + + BUF->ttl = uip_udp_conn->ttl; + BUF->proto = UIP_PROTO_UDP; + + UDPBUF->udplen = HTONS(uip_slen + UIP_UDPH_LEN); + UDPBUF->udpchksum = 0; + + BUF->srcport = uip_udp_conn->lport; + BUF->destport = uip_udp_conn->rport; + + uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr); + uip_ipaddr_copy(BUF->destipaddr, uip_udp_conn->ripaddr); + + uip_appdata = &uip_buf[UIP_LLH_LEN + UIP_IPTCPH_LEN]; + +#if UIP_UDP_CHECKSUMS + /* Calculate UDP checksum. */ + UDPBUF->udpchksum = ~(uip_udpchksum()); + if(UDPBUF->udpchksum == 0) { + UDPBUF->udpchksum = 0xffff; + } +#endif /* UIP_UDP_CHECKSUMS */ + + goto ip_send_nolen; +#endif /* UIP_UDP */ + + /* TCP input processing. */ +#if UIP_TCP + tcp_input: + UIP_STAT(++uip_stat.tcp.recv); + + /* Start of TCP input header processing code. */ + + if(uip_tcpchksum() != 0xffff) { /* Compute and check the TCP + checksum. */ + UIP_STAT(++uip_stat.tcp.drop); + UIP_STAT(++uip_stat.tcp.chkerr); + UIP_LOG("tcp: bad checksum."); + goto drop; + } + + + /* Demultiplex this segment. */ + /* First check any active connections. */ + for(uip_connr = &uip_conns[0]; uip_connr <= &uip_conns[UIP_CONNS - 1]; + ++uip_connr) { + if(uip_connr->tcpstateflags != UIP_CLOSED && + BUF->destport == uip_connr->lport && + BUF->srcport == uip_connr->rport && + uip_ipaddr_cmp(BUF->srcipaddr, uip_connr->ripaddr)) { + goto found; + } + } + + /* If we didn't find and active connection that expected the packet, + either this packet is an old duplicate, or this is a SYN packet + destined for a connection in LISTEN. If the SYN flag isn't set, + it is an old packet and we send a RST. */ + if((BUF->flags & TCP_CTL) != TCP_SYN) { + goto reset; + } + + tmp16 = BUF->destport; + /* Next, check listening connections. */ + for(c = 0; c < UIP_LISTENPORTS; ++c) { + if(tmp16 == uip_listenports[c]) + goto found_listen; + } + + /* No matching connection found, so we send a RST packet. */ + UIP_STAT(++uip_stat.tcp.synrst); + reset: + + /* We do not send resets in response to resets. */ + if(BUF->flags & TCP_RST) { + goto drop; + } + + UIP_STAT(++uip_stat.tcp.rst); + + BUF->flags = TCP_RST | TCP_ACK; + uip_len = UIP_IPTCPH_LEN; + BUF->tcpoffset = 5 << 4; + + /* Flip the seqno and ackno fields in the TCP header. */ + c = BUF->seqno[3]; + BUF->seqno[3] = BUF->ackno[3]; + BUF->ackno[3] = c; + + c = BUF->seqno[2]; + BUF->seqno[2] = BUF->ackno[2]; + BUF->ackno[2] = c; + + c = BUF->seqno[1]; + BUF->seqno[1] = BUF->ackno[1]; + BUF->ackno[1] = c; + + c = BUF->seqno[0]; + BUF->seqno[0] = BUF->ackno[0]; + BUF->ackno[0] = c; + + /* We also have to increase the sequence number we are + acknowledging. If the least significant byte overflowed, we need + to propagate the carry to the other bytes as well. */ + if(++BUF->ackno[3] == 0) { + if(++BUF->ackno[2] == 0) { + if(++BUF->ackno[1] == 0) { + ++BUF->ackno[0]; + } + } + } + + /* Swap port numbers. */ + tmp16 = BUF->srcport; + BUF->srcport = BUF->destport; + BUF->destport = tmp16; + + /* Swap IP addresses. */ + uip_ipaddr_copy(BUF->destipaddr, BUF->srcipaddr); + uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr); + + /* And send out the RST packet! */ + goto tcp_send_noconn; + + /* This label will be jumped to if we matched the incoming packet + with a connection in LISTEN. In that case, we should create a new + connection and send a SYNACK in return. */ + found_listen: + /* First we check if there are any connections available. Unused + connections are kept in the same table as used connections, but + unused ones have the tcpstate set to CLOSED. Also, connections in + TIME_WAIT are kept track of and we'll use the oldest one if no + CLOSED connections are found. Thanks to Eddie C. Dost for a very + nice algorithm for the TIME_WAIT search. */ + uip_connr = 0; + for(c = 0; c < UIP_CONNS; ++c) { + if(uip_conns[c].tcpstateflags == UIP_CLOSED) { + uip_connr = &uip_conns[c]; + break; + } + if(uip_conns[c].tcpstateflags == UIP_TIME_WAIT) { + if(uip_connr == 0 || + uip_conns[c].timer > uip_connr->timer) { + uip_connr = &uip_conns[c]; + } + } + } + + if(uip_connr == 0) { + /* All connections are used already, we drop packet and hope that + the remote end will retransmit the packet at a time when we + have more spare connections. */ + UIP_STAT(++uip_stat.tcp.syndrop); + UIP_LOG("tcp: found no unused connections."); + goto drop; + } + uip_conn = uip_connr; + + /* Fill in the necessary fields for the new connection. */ + uip_connr->rto = uip_connr->timer = UIP_RTO; + uip_connr->sa = 0; + uip_connr->sv = 4; + uip_connr->nrtx = 0; + uip_connr->lport = BUF->destport; + uip_connr->rport = BUF->srcport; + uip_ipaddr_copy(uip_connr->ripaddr, BUF->srcipaddr); + uip_connr->tcpstateflags = UIP_SYN_RCVD; + + uip_connr->snd_nxt[0] = iss[0]; + uip_connr->snd_nxt[1] = iss[1]; + uip_connr->snd_nxt[2] = iss[2]; + uip_connr->snd_nxt[3] = iss[3]; + uip_connr->len = 1; + + /* rcv_nxt should be the seqno from the incoming packet + 1. */ + uip_connr->rcv_nxt[3] = BUF->seqno[3]; + uip_connr->rcv_nxt[2] = BUF->seqno[2]; + uip_connr->rcv_nxt[1] = BUF->seqno[1]; + uip_connr->rcv_nxt[0] = BUF->seqno[0]; + uip_add_rcv_nxt(1); + + /* Parse the TCP MSS option, if present. */ + if((BUF->tcpoffset & 0xf0) > 0x50) { + for(c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2 ;) { + opt = uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + c]; + if(opt == TCP_OPT_END) { + /* End of options. */ + break; + } else if(opt == TCP_OPT_NOOP) { + ++c; + /* NOP option. */ + } else if(opt == TCP_OPT_MSS && + uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) { + /* An MSS option with the right option length. */ + tmp16 = ((u16_t)uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8) | + (u16_t)uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + 3 + c]; + uip_connr->initialmss = uip_connr->mss = + tmp16 > UIP_TCP_MSS? UIP_TCP_MSS: tmp16; + + /* And we are done processing options. */ + break; + } else { + /* All other options have a length field, so that we easily + can skip past them. */ + if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0) { + /* If the length field is zero, the options are malformed + and we don't process them further. */ + break; + } + c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c]; + } + } + } + + /* Our response will be a SYNACK. */ +#if UIP_ACTIVE_OPEN + tcp_send_synack: + BUF->flags = TCP_ACK; + + tcp_send_syn: + BUF->flags |= TCP_SYN; +#else /* UIP_ACTIVE_OPEN */ + tcp_send_synack: + BUF->flags = TCP_SYN | TCP_ACK; +#endif /* UIP_ACTIVE_OPEN */ + + /* We send out the TCP Maximum Segment Size option with our + SYNACK. */ + BUF->optdata[0] = TCP_OPT_MSS; + BUF->optdata[1] = TCP_OPT_MSS_LEN; + BUF->optdata[2] = (UIP_TCP_MSS) / 256; + BUF->optdata[3] = (UIP_TCP_MSS) & 255; + uip_len = UIP_IPTCPH_LEN + TCP_OPT_MSS_LEN; + BUF->tcpoffset = ((UIP_TCPH_LEN + TCP_OPT_MSS_LEN) / 4) << 4; + goto tcp_send; + + /* This label will be jumped to if we found an active connection. */ + found: + uip_conn = uip_connr; + uip_flags = 0; + /* We do a very naive form of TCP reset processing; we just accept + any RST and kill our connection. We should in fact check if the + sequence number of this reset is within our advertised window + before we accept the reset. */ + if(BUF->flags & TCP_RST) { + uip_connr->tcpstateflags = UIP_CLOSED; + UIP_LOG("tcp: got reset, aborting connection."); + uip_flags = UIP_ABORT; + UIP_APPCALL(); + goto drop; + } + /* Calculated the length of the data, if the application has sent + any data to us. */ + c = (BUF->tcpoffset >> 4) << 2; + /* uip_len will contain the length of the actual TCP data. This is + calculated by subtracting the length of the TCP header (in + c) and the length of the IP header (20 bytes). */ + uip_len = uip_len - c - UIP_IPH_LEN; + + /* First, check if the sequence number of the incoming packet is + what we're expecting next. If not, we send out an ACK with the + correct numbers in. */ + if(!(((uip_connr->tcpstateflags & UIP_TS_MASK) == UIP_SYN_SENT) && + ((BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)))) { + if((uip_len > 0 || ((BUF->flags & (TCP_SYN | TCP_FIN)) != 0)) && + (BUF->seqno[0] != uip_connr->rcv_nxt[0] || + BUF->seqno[1] != uip_connr->rcv_nxt[1] || + BUF->seqno[2] != uip_connr->rcv_nxt[2] || + BUF->seqno[3] != uip_connr->rcv_nxt[3])) { + goto tcp_send_ack; + } + } + + /* Next, check if the incoming segment acknowledges any outstanding + data. If so, we update the sequence number, reset the length of + the outstanding data, calculate RTT estimations, and reset the + retransmission timer. */ + if((BUF->flags & TCP_ACK) && uip_outstanding(uip_connr)) { + uip_add32(uip_connr->snd_nxt, uip_connr->len); + + if(BUF->ackno[0] == uip_acc32[0] && + BUF->ackno[1] == uip_acc32[1] && + BUF->ackno[2] == uip_acc32[2] && + BUF->ackno[3] == uip_acc32[3]) { + /* Update sequence number. */ + uip_connr->snd_nxt[0] = uip_acc32[0]; + uip_connr->snd_nxt[1] = uip_acc32[1]; + uip_connr->snd_nxt[2] = uip_acc32[2]; + uip_connr->snd_nxt[3] = uip_acc32[3]; + + + /* Do RTT estimation, unless we have done retransmissions. */ + if(uip_connr->nrtx == 0) { + signed char m; + m = uip_connr->rto - uip_connr->timer; + /* This is taken directly from VJs original code in his paper */ + m = m - (uip_connr->sa >> 3); + uip_connr->sa += m; + if(m < 0) { + m = -m; + } + m = m - (uip_connr->sv >> 2); + uip_connr->sv += m; + uip_connr->rto = (uip_connr->sa >> 3) + uip_connr->sv; + + } + /* Set the acknowledged flag. */ + uip_flags = UIP_ACKDATA; + /* Reset the retransmission timer. */ + uip_connr->timer = uip_connr->rto; + + /* Reset length of outstanding data. */ + uip_connr->len = 0; + } + + } + + /* Do different things depending on in what state the connection is. */ + switch(uip_connr->tcpstateflags & UIP_TS_MASK) { + /* CLOSED and LISTEN are not handled here. CLOSE_WAIT is not + implemented, since we force the application to close when the + peer sends a FIN (hence the application goes directly from + ESTABLISHED to LAST_ACK). */ + case UIP_SYN_RCVD: + /* In SYN_RCVD we have sent out a SYNACK in response to a SYN, and + we are waiting for an ACK that acknowledges the data we sent + out the last time. Therefore, we want to have the UIP_ACKDATA + flag set. If so, we enter the ESTABLISHED state. */ + if(uip_flags & UIP_ACKDATA) { + uip_connr->tcpstateflags = UIP_ESTABLISHED; + uip_flags = UIP_CONNECTED; + uip_connr->len = 0; + if(uip_len > 0) { + uip_flags |= UIP_NEWDATA; + uip_add_rcv_nxt(uip_len); + } + uip_slen = 0; + UIP_APPCALL(); + goto appsend; + } + goto drop; +#if UIP_ACTIVE_OPEN + case UIP_SYN_SENT: + /* In SYN_SENT, we wait for a SYNACK that is sent in response to + our SYN. The rcv_nxt is set to sequence number in the SYNACK + plus one, and we send an ACK. We move into the ESTABLISHED + state. */ + if((uip_flags & UIP_ACKDATA) && + (BUF->flags & TCP_CTL) == (TCP_SYN | TCP_ACK)) { + + /* Parse the TCP MSS option, if present. */ + if((BUF->tcpoffset & 0xf0) > 0x50) { + for(c = 0; c < ((BUF->tcpoffset >> 4) - 5) << 2 ;) { + opt = uip_buf[UIP_IPTCPH_LEN + UIP_LLH_LEN + c]; + if(opt == TCP_OPT_END) { + /* End of options. */ + break; + } else if(opt == TCP_OPT_NOOP) { + ++c; + /* NOP option. */ + } else if(opt == TCP_OPT_MSS && + uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == TCP_OPT_MSS_LEN) { + /* An MSS option with the right option length. */ + tmp16 = (uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 2 + c] << 8) | + uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 3 + c]; + uip_connr->initialmss = + uip_connr->mss = tmp16 > UIP_TCP_MSS? UIP_TCP_MSS: tmp16; + + /* And we are done processing options. */ + break; + } else { + /* All other options have a length field, so that we easily + can skip past them. */ + if(uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c] == 0) { + /* If the length field is zero, the options are malformed + and we don't process them further. */ + break; + } + c += uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN + 1 + c]; + } + } + } + uip_connr->tcpstateflags = UIP_ESTABLISHED; + uip_connr->rcv_nxt[0] = BUF->seqno[0]; + uip_connr->rcv_nxt[1] = BUF->seqno[1]; + uip_connr->rcv_nxt[2] = BUF->seqno[2]; + uip_connr->rcv_nxt[3] = BUF->seqno[3]; + uip_add_rcv_nxt(1); + uip_flags = UIP_CONNECTED | UIP_NEWDATA; + uip_connr->len = 0; + uip_len = 0; + uip_slen = 0; + UIP_APPCALL(); + goto appsend; + } + /* Inform the application that the connection failed */ + uip_flags = UIP_ABORT; + UIP_APPCALL(); + /* The connection is closed after we send the RST */ + uip_conn->tcpstateflags = UIP_CLOSED; + goto reset; +#endif /* UIP_ACTIVE_OPEN */ + + case UIP_ESTABLISHED: + /* In the ESTABLISHED state, we call upon the application to feed + data into the uip_buf. If the UIP_ACKDATA flag is set, the + application should put new data into the buffer, otherwise we are + retransmitting an old segment, and the application should put that + data into the buffer. + + If the incoming packet is a FIN, we should close the connection on + this side as well, and we send out a FIN and enter the LAST_ACK + state. We require that there is no outstanding data; otherwise the + sequence numbers will be screwed up. */ + + if(BUF->flags & TCP_FIN && !(uip_connr->tcpstateflags & UIP_STOPPED)) { + if(uip_outstanding(uip_connr)) { + goto drop; + } + uip_add_rcv_nxt(1 + uip_len); + uip_flags |= UIP_CLOSE; + if(uip_len > 0) { + uip_flags |= UIP_NEWDATA; + } + UIP_APPCALL(); + uip_connr->len = 1; + uip_connr->tcpstateflags = UIP_LAST_ACK; + uip_connr->nrtx = 0; + tcp_send_finack: + BUF->flags = TCP_FIN | TCP_ACK; + goto tcp_send_nodata; + } + + /* Check the URG flag. If this is set, the segment carries urgent + data that we must pass to the application. */ + if((BUF->flags & TCP_URG) != 0) { +#if UIP_URGDATA > 0 + uip_urglen = (BUF->urgp[0] << 8) | BUF->urgp[1]; + if(uip_urglen > uip_len) { + /* There is more urgent data in the next segment to come. */ + uip_urglen = uip_len; + } + uip_add_rcv_nxt(uip_urglen); + uip_len -= uip_urglen; + uip_urgdata = uip_appdata; + uip_appdata += uip_urglen; + } else { + uip_urglen = 0; +#else /* UIP_URGDATA > 0 */ + uip_appdata = ((char *)uip_appdata) + ((BUF->urgp[0] << 8) | BUF->urgp[1]); + uip_len -= (BUF->urgp[0] << 8) | BUF->urgp[1]; +#endif /* UIP_URGDATA > 0 */ + } + + /* If uip_len > 0 we have TCP data in the packet, and we flag this + by setting the UIP_NEWDATA flag and update the sequence number + we acknowledge. If the application has stopped the dataflow + using uip_stop(), we must not accept any data packets from the + remote host. */ + if(uip_len > 0 && !(uip_connr->tcpstateflags & UIP_STOPPED)) { + uip_flags |= UIP_NEWDATA; + uip_add_rcv_nxt(uip_len); + } + + /* Check if the available buffer space advertised by the other end + is smaller than the initial MSS for this connection. If so, we + set the current MSS to the window size to ensure that the + application does not send more data than the other end can + handle. + + If the remote host advertises a zero window, we set the MSS to + the initial MSS so that the application will send an entire MSS + of data. This data will not be acknowledged by the receiver, + and the application will retransmit it. This is called the + "persistent timer" and uses the retransmission mechanism. + */ + tmp16 = ((u16_t)BUF->wnd[0] << 8) + (u16_t)BUF->wnd[1]; + if(tmp16 > uip_connr->initialmss || + tmp16 == 0) { + tmp16 = uip_connr->initialmss; + } + uip_connr->mss = tmp16; + + /* If this packet constitutes an ACK for outstanding data (flagged + by the UIP_ACKDATA flag, we should call the application since it + might want to send more data. If the incoming packet had data + from the peer (as flagged by the UIP_NEWDATA flag), the + application must also be notified. + + When the application is called, the global variable uip_len + contains the length of the incoming data. The application can + access the incoming data through the global pointer + uip_appdata, which usually points UIP_IPTCPH_LEN + UIP_LLH_LEN + bytes into the uip_buf array. + + If the application wishes to send any data, this data should be + put into the uip_appdata and the length of the data should be + put into uip_len. If the application don't have any data to + send, uip_len must be set to 0. */ + if(uip_flags & (UIP_NEWDATA | UIP_ACKDATA)) { + uip_slen = 0; + UIP_APPCALL(); + + appsend: + + if(uip_flags & UIP_ABORT) { + uip_slen = 0; + uip_connr->tcpstateflags = UIP_CLOSED; + BUF->flags = TCP_RST | TCP_ACK; + goto tcp_send_nodata; + } + + if(uip_flags & UIP_CLOSE) { + uip_slen = 0; + uip_connr->len = 1; + uip_connr->tcpstateflags = UIP_FIN_WAIT_1; + uip_connr->nrtx = 0; + BUF->flags = TCP_FIN | TCP_ACK; + goto tcp_send_nodata; + } + + /* If uip_slen > 0, the application has data to be sent. */ + if(uip_slen > 0) { + + /* If the connection has acknowledged data, the contents of + the ->len variable should be discarded. */ + if((uip_flags & UIP_ACKDATA) != 0) { + uip_connr->len = 0; + } + + /* If the ->len variable is non-zero the connection has + already data in transit and cannot send anymore right + now. */ + if(uip_connr->len == 0) { + + /* The application cannot send more than what is allowed by + the mss (the minimum of the MSS and the available + window). */ + if(uip_slen > uip_connr->mss) { + uip_slen = uip_connr->mss; + } + + /* Remember how much data we send out now so that we know + when everything has been acknowledged. */ + uip_connr->len = uip_slen; + } else { + + /* If the application already had unacknowledged data, we + make sure that the application does not send (i.e., + retransmit) out more than it previously sent out. */ + uip_slen = uip_connr->len; + } + } + uip_connr->nrtx = 0; + apprexmit: + uip_appdata = uip_sappdata; + + /* If the application has data to be sent, or if the incoming + packet had new data in it, we must send out a packet. */ + if(uip_slen > 0 && uip_connr->len > 0) { + /* Add the length of the IP and TCP headers. */ + uip_len = uip_connr->len + UIP_TCPIP_HLEN; + /* We always set the ACK flag in response packets. */ + BUF->flags = TCP_ACK | TCP_PSH; + /* Send the packet. */ + goto tcp_send_noopts; + } + /* If there is no data to send, just send out a pure ACK if + there is newdata. */ + if(uip_flags & UIP_NEWDATA) { + uip_len = UIP_TCPIP_HLEN; + BUF->flags = TCP_ACK; + goto tcp_send_noopts; + } + } + goto drop; + case UIP_LAST_ACK: + /* We can close this connection if the peer has acknowledged our + FIN. This is indicated by the UIP_ACKDATA flag. */ + if(uip_flags & UIP_ACKDATA) { + uip_connr->tcpstateflags = UIP_CLOSED; + uip_flags = UIP_CLOSE; + UIP_APPCALL(); + } + break; + + case UIP_FIN_WAIT_1: + /* The application has closed the connection, but the remote host + hasn't closed its end yet. Thus we do nothing but wait for a + FIN from the other side. */ + if(uip_len > 0) { + uip_add_rcv_nxt(uip_len); + } + if(BUF->flags & TCP_FIN) { + if(uip_flags & UIP_ACKDATA) { + uip_connr->tcpstateflags = UIP_TIME_WAIT; + uip_connr->timer = 0; + uip_connr->len = 0; + } else { + uip_connr->tcpstateflags = UIP_CLOSING; + } + uip_add_rcv_nxt(1); + uip_flags = UIP_CLOSE; + UIP_APPCALL(); + goto tcp_send_ack; + } else if(uip_flags & UIP_ACKDATA) { + uip_connr->tcpstateflags = UIP_FIN_WAIT_2; + uip_connr->len = 0; + goto drop; + } + if(uip_len > 0) { + goto tcp_send_ack; + } + goto drop; + + case UIP_FIN_WAIT_2: + if(uip_len > 0) { + uip_add_rcv_nxt(uip_len); + } + if(BUF->flags & TCP_FIN) { + uip_connr->tcpstateflags = UIP_TIME_WAIT; + uip_connr->timer = 0; + uip_add_rcv_nxt(1); + uip_flags = UIP_CLOSE; + UIP_APPCALL(); + goto tcp_send_ack; + } + if(uip_len > 0) { + goto tcp_send_ack; + } + goto drop; + + case UIP_TIME_WAIT: + goto tcp_send_ack; + + case UIP_CLOSING: + if(uip_flags & UIP_ACKDATA) { + uip_connr->tcpstateflags = UIP_TIME_WAIT; + uip_connr->timer = 0; + } + } + goto drop; + + + /* We jump here when we are ready to send the packet, and just want + to set the appropriate TCP sequence numbers in the TCP header. */ + tcp_send_ack: + BUF->flags = TCP_ACK; + tcp_send_nodata: + uip_len = UIP_IPTCPH_LEN; + tcp_send_noopts: + BUF->tcpoffset = (UIP_TCPH_LEN / 4) << 4; + tcp_send: + /* We're done with the input processing. We are now ready to send a + reply. Our job is to fill in all the fields of the TCP and IP + headers before calculating the checksum and finally send the + packet. */ + BUF->ackno[0] = uip_connr->rcv_nxt[0]; + BUF->ackno[1] = uip_connr->rcv_nxt[1]; + BUF->ackno[2] = uip_connr->rcv_nxt[2]; + BUF->ackno[3] = uip_connr->rcv_nxt[3]; + + BUF->seqno[0] = uip_connr->snd_nxt[0]; + BUF->seqno[1] = uip_connr->snd_nxt[1]; + BUF->seqno[2] = uip_connr->snd_nxt[2]; + BUF->seqno[3] = uip_connr->snd_nxt[3]; + + BUF->proto = UIP_PROTO_TCP; + + BUF->srcport = uip_connr->lport; + BUF->destport = uip_connr->rport; + + uip_ipaddr_copy(BUF->srcipaddr, uip_hostaddr); + uip_ipaddr_copy(BUF->destipaddr, uip_connr->ripaddr); + + if(uip_connr->tcpstateflags & UIP_STOPPED) { + /* If the connection has issued uip_stop(), we advertise a zero + window so that the remote host will stop sending data. */ + BUF->wnd[0] = BUF->wnd[1] = 0; + } else { + BUF->wnd[0] = ((UIP_RECEIVE_WINDOW) >> 8); + BUF->wnd[1] = ((UIP_RECEIVE_WINDOW) & 0xff); + } + + tcp_send_noconn: + BUF->ttl = UIP_TTL; +#if UIP_CONF_IPV6 + /* For IPv6, the IP length field does not include the IPv6 IP header + length. */ + BUF->len[0] = ((uip_len - UIP_IPH_LEN) >> 8); + BUF->len[1] = ((uip_len - UIP_IPH_LEN) & 0xff); +#else /* UIP_CONF_IPV6 */ + BUF->len[0] = (uip_len >> 8); + BUF->len[1] = (uip_len & 0xff); +#endif /* UIP_CONF_IPV6 */ + + BUF->urgp[0] = BUF->urgp[1] = 0; + + /* Calculate TCP checksum. */ + BUF->tcpchksum = 0; + BUF->tcpchksum = ~(uip_tcpchksum()); +#endif /* UIP_TCP */ + + ip_send_nolen: + +#if UIP_CONF_IPV6 + BUF->vtc = 0x60; + BUF->tcflow = 0x00; + BUF->flow = 0x00; +#else /* UIP_CONF_IPV6 */ + BUF->vhl = 0x45; + BUF->tos = 0; + BUF->ipoffset[0] = BUF->ipoffset[1] = 0; + ++ipid; + BUF->ipid[0] = ipid >> 8; + BUF->ipid[1] = ipid & 0xff; + /* Calculate IP checksum. */ + BUF->ipchksum = 0; + BUF->ipchksum = ~(uip_ipchksum()); + DEBUG_PRINTF("uip ip_send_nolen: checksum 0x%04x\n", uip_ipchksum()); +#endif /* UIP_CONF_IPV6 */ + + UIP_STAT(++uip_stat.tcp.sent); + send: + DEBUG_PRINTF("Sending packet with length %d (%d)\n", uip_len, + (BUF->len[0] << 8) | BUF->len[1]); + + UIP_STAT(++uip_stat.ip.sent); + /* Return and let the caller do the actual transmission. */ + uip_flags = 0; + return; + drop: + uip_len = 0; + uip_flags = 0; + return; +} +/*---------------------------------------------------------------------------*/ +u16_t +htons(u16_t val) +{ + return HTONS(val); +} +/*---------------------------------------------------------------------------*/ +void +uip_send(const void *data, int len) +{ + if(len > 0) { + uip_slen = len; + if(data != uip_sappdata) { + memcpy(uip_sappdata, (data), uip_slen); + } + } +} +/** @} */ diff --git a/third_party/uip-1.0/uip/uip.h b/third_party/uip-1.0/uip/uip.h new file mode 100644 index 0000000..eca2008 --- /dev/null +++ b/third_party/uip-1.0/uip/uip.h @@ -0,0 +1,1611 @@ + +/** + * \addtogroup uip + * @{ + */ + +/** + * \file + * Header file for the uIP TCP/IP stack. + * \author Adam Dunkels + * + * The uIP TCP/IP stack header file contains definitions for a number + * of C macros that are used by uIP programs as well as internal uIP + * structures, TCP/IP header structures and function declarations. + * + */ + + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip.h,v 1.40 2006/06/08 07:12:07 adam Exp $ + * + */ + +#ifndef __UIP_H__ +#define __UIP_H__ + +#include "uipopt.h" + +/** + * Repressentation of an IP address. + * + */ +typedef u16_t uip_ip4addr_t[2]; +typedef u16_t uip_ip6addr_t[8]; +#if UIP_CONF_IPV6 +typedef uip_ip6addr_t uip_ipaddr_t; +#else /* UIP_CONF_IPV6 */ +typedef uip_ip4addr_t uip_ipaddr_t; +#endif /* UIP_CONF_IPV6 */ + +/*---------------------------------------------------------------------------*/ +/* First, the functions that should be called from the + * system. Initialization, the periodic timer and incoming packets are + * handled by the following three functions. + */ + +/** + * \defgroup uipconffunc uIP configuration functions + * @{ + * + * The uIP configuration functions are used for setting run-time + * parameters in uIP such as IP addresses. + */ + +/** + * Set the IP address of this host. + * + * The IP address is represented as a 4-byte array where the first + * octet of the IP address is put in the first member of the 4-byte + * array. + * + * Example: + \code + + uip_ipaddr_t addr; + + uip_ipaddr(&addr, 192,168,1,2); + uip_sethostaddr(&addr); + + \endcode + * \param addr A pointer to an IP address of type uip_ipaddr_t; + * + * \sa uip_ipaddr() + * + * \hideinitializer + */ +#define uip_sethostaddr(addr) uip_ipaddr_copy(uip_hostaddr, (addr)) + +/** + * Get the IP address of this host. + * + * The IP address is represented as a 4-byte array where the first + * octet of the IP address is put in the first member of the 4-byte + * array. + * + * Example: + \code + uip_ipaddr_t hostaddr; + + uip_gethostaddr(&hostaddr); + \endcode + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the currently configured IP address. + * + * \hideinitializer + */ +#define uip_gethostaddr(addr) uip_ipaddr_copy((addr), uip_hostaddr) + +/** + * Set the default router's IP address. + * + * \param addr A pointer to a uip_ipaddr_t variable containing the IP + * address of the default router. + * + * \sa uip_ipaddr() + * + * \hideinitializer + */ +#define uip_setdraddr(addr) uip_ipaddr_copy(uip_draddr, (addr)) + +/** + * Set the netmask. + * + * \param addr A pointer to a uip_ipaddr_t variable containing the IP + * address of the netmask. + * + * \sa uip_ipaddr() + * + * \hideinitializer + */ +#define uip_setnetmask(addr) uip_ipaddr_copy(uip_netmask, (addr)) + + +/** + * Get the default router's IP address. + * + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the IP address of the default router. + * + * \hideinitializer + */ +#define uip_getdraddr(addr) uip_ipaddr_copy((addr), uip_draddr) + +/** + * Get the netmask. + * + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the value of the netmask. + * + * \hideinitializer + */ +#define uip_getnetmask(addr) uip_ipaddr_copy((addr), uip_netmask) + +/** @} */ + +/** + * \defgroup uipinit uIP initialization functions + * @{ + * + * The uIP initialization functions are used for booting uIP. + */ + +/** + * uIP initialization function. + * + * This function should be called at boot up to initilize the uIP + * TCP/IP stack. + */ +void uip_init(void); + +/** + * uIP initialization function. + * + * This function may be used at boot time to set the initial ip_id. + */ +void uip_setipid(u16_t id); + +/** @} */ + +/** + * \defgroup uipdevfunc uIP device driver functions + * @{ + * + * These functions are used by a network device driver for interacting + * with uIP. + */ + +/** + * Process an incoming packet. + * + * This function should be called when the device driver has received + * a packet from the network. The packet from the device driver must + * be present in the uip_buf buffer, and the length of the packet + * should be placed in the uip_len variable. + * + * When the function returns, there may be an outbound packet placed + * in the uip_buf packet buffer. If so, the uip_len variable is set to + * the length of the packet. If no packet is to be sent out, the + * uip_len variable is set to 0. + * + * The usual way of calling the function is presented by the source + * code below. + \code + uip_len = devicedriver_poll(); + if(uip_len > 0) { + uip_input(); + if(uip_len > 0) { + devicedriver_send(); + } + } + \endcode + * + * \note If you are writing a uIP device driver that needs ARP + * (Address Resolution Protocol), e.g., when running uIP over + * Ethernet, you will need to call the uIP ARP code before calling + * this function: + \code + #define BUF ((struct uip_eth_hdr *)&uip_buf[0]) + uip_len = ethernet_devicedrver_poll(); + if(uip_len > 0) { + if(BUF->type == HTONS(UIP_ETHTYPE_IP)) { + uip_arp_ipin(); + uip_input(); + if(uip_len > 0) { + uip_arp_out(); + ethernet_devicedriver_send(); + } + } else if(BUF->type == HTONS(UIP_ETHTYPE_ARP)) { + uip_arp_arpin(); + if(uip_len > 0) { + ethernet_devicedriver_send(); + } + } + \endcode + * + * \hideinitializer + */ +#define uip_input() uip_process(UIP_DATA) + +/** + * Periodic processing for a connection identified by its number. + * + * This function does the necessary periodic processing (timers, + * polling) for a uIP TCP conneciton, and should be called when the + * periodic uIP timer goes off. It should be called for every + * connection, regardless of whether they are open of closed. + * + * When the function returns, it may have an outbound packet waiting + * for service in the uIP packet buffer, and if so the uip_len + * variable is set to a value larger than zero. The device driver + * should be called to send out the packet. + * + * The ususal way of calling the function is through a for() loop like + * this: + \code + for(i = 0; i < UIP_CONNS; ++i) { + uip_periodic(i); + if(uip_len > 0) { + devicedriver_send(); + } + } + \endcode + * + * \note If you are writing a uIP device driver that needs ARP + * (Address Resolution Protocol), e.g., when running uIP over + * Ethernet, you will need to call the uip_arp_out() function before + * calling the device driver: + \code + for(i = 0; i < UIP_CONNS; ++i) { + uip_periodic(i); + if(uip_len > 0) { + uip_arp_out(); + ethernet_devicedriver_send(); + } + } + \endcode + * + * \param conn The number of the connection which is to be periodically polled. + * + * \hideinitializer + */ +#define uip_periodic(conn) do { uip_conn = &uip_conns[conn]; \ + uip_process(UIP_TIMER); } while (0) + +/** + * + * + */ +#define uip_conn_active(conn) (uip_conns[conn].tcpstateflags != UIP_CLOSED) + +/** + * Perform periodic processing for a connection identified by a pointer + * to its structure. + * + * Same as uip_periodic() but takes a pointer to the actual uip_conn + * struct instead of an integer as its argument. This function can be + * used to force periodic processing of a specific connection. + * + * \param conn A pointer to the uip_conn struct for the connection to + * be processed. + * + * \hideinitializer + */ +#define uip_periodic_conn(conn) do { uip_conn = conn; \ + uip_process(UIP_TIMER); } while (0) + +/** + * Reuqest that a particular connection should be polled. + * + * Similar to uip_periodic_conn() but does not perform any timer + * processing. The application is polled for new data. + * + * \param conn A pointer to the uip_conn struct for the connection to + * be processed. + * + * \hideinitializer + */ +#define uip_poll_conn(conn) do { uip_conn = conn; \ + uip_process(UIP_POLL_REQUEST); } while (0) + + +#if UIP_UDP +/** + * Periodic processing for a UDP connection identified by its number. + * + * This function is essentially the same as uip_periodic(), but for + * UDP connections. It is called in a similar fashion as the + * uip_periodic() function: + \code + for(i = 0; i < UIP_UDP_CONNS; i++) { + uip_udp_periodic(i); + if(uip_len > 0) { + devicedriver_send(); + } + } + \endcode + * + * \note As for the uip_periodic() function, special care has to be + * taken when using uIP together with ARP and Ethernet: + \code + for(i = 0; i < UIP_UDP_CONNS; i++) { + uip_udp_periodic(i); + if(uip_len > 0) { + uip_arp_out(); + ethernet_devicedriver_send(); + } + } + \endcode + * + * \param conn The number of the UDP connection to be processed. + * + * \hideinitializer + */ +#define uip_udp_periodic(conn) do { uip_udp_conn = &uip_udp_conns[conn]; \ + uip_process(UIP_UDP_TIMER); } while (0) + +/** + * Periodic processing for a UDP connection identified by a pointer to + * its structure. + * + * Same as uip_udp_periodic() but takes a pointer to the actual + * uip_conn struct instead of an integer as its argument. This + * function can be used to force periodic processing of a specific + * connection. + * + * \param conn A pointer to the uip_udp_conn struct for the connection + * to be processed. + * + * \hideinitializer + */ +#define uip_udp_periodic_conn(conn) do { uip_udp_conn = conn; \ + uip_process(UIP_UDP_TIMER); } while (0) + + +#endif /* UIP_UDP */ + +/** + * The uIP packet buffer. + * + * The uip_buf array is used to hold incoming and outgoing + * packets. The device driver should place incoming data into this + * buffer. When sending data, the device driver should read the link + * level headers and the TCP/IP headers from this buffer. The size of + * the link level headers is configured by the UIP_LLH_LEN define. + * + * \note The application data need not be placed in this buffer, so + * the device driver must read it from the place pointed to by the + * uip_appdata pointer as illustrated by the following example: + \code + void + devicedriver_send(void) + { + hwsend(&uip_buf[0], UIP_LLH_LEN); + if(uip_len <= UIP_LLH_LEN + UIP_TCPIP_HLEN) { + hwsend(&uip_buf[UIP_LLH_LEN], uip_len - UIP_LLH_LEN); + } else { + hwsend(&uip_buf[UIP_LLH_LEN], UIP_TCPIP_HLEN); + hwsend(uip_appdata, uip_len - UIP_TCPIP_HLEN - UIP_LLH_LEN); + } + } + \endcode + */ +#ifdef UIP_CONF_EXTERNAL_BUFFER +extern u8_t *uip_buf; +#else +extern u8_t uip_buf[UIP_BUFSIZE+2]; +#endif + +/** @} */ + +/*---------------------------------------------------------------------------*/ +/* Functions that are used by the uIP application program. Opening and + * closing connections, sending and receiving data, etc. is all + * handled by the functions below. +*/ +/** + * \defgroup uipappfunc uIP application functions + * @{ + * + * Functions used by an application running of top of uIP. + */ + +/** + * Start listening to the specified port. + * + * \note Since this function expects the port number in network byte + * order, a conversion using HTONS() or htons() is necessary. + * + \code + uip_listen(HTONS(80)); + \endcode + * + * \param port A 16-bit port number in network byte order. + */ +void uip_listen(u16_t port); + +/** + * Stop listening to the specified port. + * + * \note Since this function expects the port number in network byte + * order, a conversion using HTONS() or htons() is necessary. + * + \code + uip_unlisten(HTONS(80)); + \endcode + * + * \param port A 16-bit port number in network byte order. + */ +void uip_unlisten(u16_t port); + +/** + * Connect to a remote host using TCP. + * + * This function is used to start a new connection to the specified + * port on the specied host. It allocates a new connection identifier, + * sets the connection to the SYN_SENT state and sets the + * retransmission timer to 0. This will cause a TCP SYN segment to be + * sent out the next time this connection is periodically processed, + * which usually is done within 0.5 seconds after the call to + * uip_connect(). + * + * \note This function is avaliable only if support for active open + * has been configured by defining UIP_ACTIVE_OPEN to 1 in uipopt.h. + * + * \note Since this function requires the port number to be in network + * byte order, a conversion using HTONS() or htons() is necessary. + * + \code + uip_ipaddr_t ipaddr; + + uip_ipaddr(&ipaddr, 192,168,1,2); + uip_connect(&ipaddr, HTONS(80)); + \endcode + * + * \param ripaddr The IP address of the remote hot. + * + * \param port A 16-bit port number in network byte order. + * + * \return A pointer to the uIP connection identifier for the new connection, + * or NULL if no connection could be allocated. + * + */ +struct uip_conn *uip_connect(uip_ipaddr_t *ripaddr, u16_t port); + + + +/** + * \internal + * + * Check if a connection has outstanding (i.e., unacknowledged) data. + * + * \param conn A pointer to the uip_conn structure for the connection. + * + * \hideinitializer + */ +#define uip_outstanding(conn) ((conn)->len) + +/** + * Send data on the current connection. + * + * This function is used to send out a single segment of TCP + * data. Only applications that have been invoked by uIP for event + * processing can send data. + * + * The amount of data that actually is sent out after a call to this + * funcion is determined by the maximum amount of data TCP allows. uIP + * will automatically crop the data so that only the appropriate + * amount of data is sent. The function uip_mss() can be used to query + * uIP for the amount of data that actually will be sent. + * + * \note This function does not guarantee that the sent data will + * arrive at the destination. If the data is lost in the network, the + * application will be invoked with the uip_rexmit() event being + * set. The application will then have to resend the data using this + * function. + * + * \param data A pointer to the data which is to be sent. + * + * \param len The maximum amount of data bytes to be sent. + * + * \hideinitializer + */ +void uip_send(const void *data, int len); + +/** + * The length of any incoming data that is currently avaliable (if avaliable) + * in the uip_appdata buffer. + * + * The test function uip_data() must first be used to check if there + * is any data available at all. + * + * \hideinitializer + */ +/*void uip_datalen(void);*/ +#define uip_datalen() uip_len + +/** + * The length of any out-of-band data (urgent data) that has arrived + * on the connection. + * + * \note The configuration parameter UIP_URGDATA must be set for this + * function to be enabled. + * + * \hideinitializer + */ +#define uip_urgdatalen() uip_urglen + +/** + * Close the current connection. + * + * This function will close the current connection in a nice way. + * + * \hideinitializer + */ +#define uip_close() (uip_flags = UIP_CLOSE) + +/** + * Abort the current connection. + * + * This function will abort (reset) the current connection, and is + * usually used when an error has occured that prevents using the + * uip_close() function. + * + * \hideinitializer + */ +#define uip_abort() (uip_flags = UIP_ABORT) + +/** + * Tell the sending host to stop sending data. + * + * This function will close our receiver's window so that we stop + * receiving data for the current connection. + * + * \hideinitializer + */ +#define uip_stop() (uip_conn->tcpstateflags |= UIP_STOPPED) + +/** + * Find out if the current connection has been previously stopped with + * uip_stop(). + * + * \hideinitializer + */ +#define uip_stopped(conn) ((conn)->tcpstateflags & UIP_STOPPED) + +/** + * Restart the current connection, if is has previously been stopped + * with uip_stop(). + * + * This function will open the receiver's window again so that we + * start receiving data for the current connection. + * + * \hideinitializer + */ +#define uip_restart() do { uip_flags |= UIP_NEWDATA; \ + uip_conn->tcpstateflags &= ~UIP_STOPPED; \ + } while(0) + + +/* uIP tests that can be made to determine in what state the current + connection is, and what the application function should do. */ + +/** + * Is the current connection a UDP connection? + * + * This function checks whether the current connection is a UDP connection. + * + * \hideinitializer + * + */ +#define uip_udpconnection() (uip_conn == NULL) + +/** + * Is new incoming data available? + * + * Will reduce to non-zero if there is new data for the application + * present at the uip_appdata pointer. The size of the data is + * avaliable through the uip_len variable. + * + * \hideinitializer + */ +#define uip_newdata() (uip_flags & UIP_NEWDATA) + +/** + * Has previously sent data been acknowledged? + * + * Will reduce to non-zero if the previously sent data has been + * acknowledged by the remote host. This means that the application + * can send new data. + * + * \hideinitializer + */ +#define uip_acked() (uip_flags & UIP_ACKDATA) + +/** + * Has the connection just been connected? + * + * Reduces to non-zero if the current connection has been connected to + * a remote host. This will happen both if the connection has been + * actively opened (with uip_connect()) or passively opened (with + * uip_listen()). + * + * \hideinitializer + */ +#define uip_connected() (uip_flags & UIP_CONNECTED) + +/** + * Has the connection been closed by the other end? + * + * Is non-zero if the connection has been closed by the remote + * host. The application may then do the necessary clean-ups. + * + * \hideinitializer + */ +#define uip_closed() (uip_flags & UIP_CLOSE) + +/** + * Has the connection been aborted by the other end? + * + * Non-zero if the current connection has been aborted (reset) by the + * remote host. + * + * \hideinitializer + */ +#define uip_aborted() (uip_flags & UIP_ABORT) + +/** + * Has the connection timed out? + * + * Non-zero if the current connection has been aborted due to too many + * retransmissions. + * + * \hideinitializer + */ +#define uip_timedout() (uip_flags & UIP_TIMEDOUT) + +/** + * Do we need to retransmit previously data? + * + * Reduces to non-zero if the previously sent data has been lost in + * the network, and the application should retransmit it. The + * application should send the exact same data as it did the last + * time, using the uip_send() function. + * + * \hideinitializer + */ +#define uip_rexmit() (uip_flags & UIP_REXMIT) + +/** + * Is the connection being polled by uIP? + * + * Is non-zero if the reason the application is invoked is that the + * current connection has been idle for a while and should be + * polled. + * + * The polling event can be used for sending data without having to + * wait for the remote host to send data. + * + * \hideinitializer + */ +#define uip_poll() (uip_flags & UIP_POLL) + +/** + * Get the initial maxium segment size (MSS) of the current + * connection. + * + * \hideinitializer + */ +#define uip_initialmss() (uip_conn->initialmss) + +/** + * Get the current maxium segment size that can be sent on the current + * connection. + * + * The current maxiumum segment size that can be sent on the + * connection is computed from the receiver's window and the MSS of + * the connection (which also is available by calling + * uip_initialmss()). + * + * \hideinitializer + */ +#define uip_mss() (uip_conn->mss) + +/** + * Set up a new UDP connection. + * + * This function sets up a new UDP connection. The function will + * automatically allocate an unused local port for the new + * connection. However, another port can be chosen by using the + * uip_udp_bind() call, after the uip_udp_new() function has been + * called. + * + * Example: + \code + uip_ipaddr_t addr; + struct uip_udp_conn *c; + + uip_ipaddr(&addr, 192,168,2,1); + c = uip_udp_new(&addr, HTONS(12345)); + if(c != NULL) { + uip_udp_bind(c, HTONS(12344)); + } + \endcode + * \param ripaddr The IP address of the remote host. + * + * \param rport The remote port number in network byte order. + * + * \return The uip_udp_conn structure for the new connection or NULL + * if no connection could be allocated. + */ +struct uip_udp_conn *uip_udp_new(uip_ipaddr_t *ripaddr, u16_t rport); + +/** + * Removed a UDP connection. + * + * \param conn A pointer to the uip_udp_conn structure for the connection. + * + * \hideinitializer + */ +#define uip_udp_remove(conn) (conn)->lport = 0 + +/** + * Bind a UDP connection to a local port. + * + * \param conn A pointer to the uip_udp_conn structure for the + * connection. + * + * \param port The local port number, in network byte order. + * + * \hideinitializer + */ +#define uip_udp_bind(conn, port) (conn)->lport = port + +/** + * Send a UDP datagram of length len on the current connection. + * + * This function can only be called in response to a UDP event (poll + * or newdata). The data must be present in the uip_buf buffer, at the + * place pointed to by the uip_appdata pointer. + * + * \param len The length of the data in the uip_buf buffer. + * + * \hideinitializer + */ +#define uip_udp_send(len) uip_send((char *)uip_appdata, len) + +/** @} */ + +/* uIP convenience and converting functions. */ + +/** + * \defgroup uipconvfunc uIP conversion functions + * @{ + * + * These functions can be used for converting between different data + * formats used by uIP. + */ + +/** + * Construct an IP address from four bytes. + * + * This function constructs an IP address of the type that uIP handles + * internally from four bytes. The function is handy for specifying IP + * addresses to use with e.g. the uip_connect() function. + * + * Example: + \code + uip_ipaddr_t ipaddr; + struct uip_conn *c; + + uip_ipaddr(&ipaddr, 192,168,1,2); + c = uip_connect(&ipaddr, HTONS(80)); + \endcode + * + * \param addr A pointer to a uip_ipaddr_t variable that will be + * filled in with the IP address. + * + * \param addr0 The first octet of the IP address. + * \param addr1 The second octet of the IP address. + * \param addr2 The third octet of the IP address. + * \param addr3 The forth octet of the IP address. + * + * \hideinitializer + */ +#define uip_ipaddr(addr, addr0,addr1,addr2,addr3) do { \ + ((u16_t *)(addr))[0] = HTONS(((addr0) << 8) | (addr1)); \ + ((u16_t *)(addr))[1] = HTONS(((addr2) << 8) | (addr3)); \ + } while(0) + +/** + * Construct an IPv6 address from eight 16-bit words. + * + * This function constructs an IPv6 address. + * + * \hideinitializer + */ +#define uip_ip6addr(addr, addr0,addr1,addr2,addr3,addr4,addr5,addr6,addr7) do { \ + ((u16_t *)(addr))[0] = HTONS((addr0)); \ + ((u16_t *)(addr))[1] = HTONS((addr1)); \ + ((u16_t *)(addr))[2] = HTONS((addr2)); \ + ((u16_t *)(addr))[3] = HTONS((addr3)); \ + ((u16_t *)(addr))[4] = HTONS((addr4)); \ + ((u16_t *)(addr))[5] = HTONS((addr5)); \ + ((u16_t *)(addr))[6] = HTONS((addr6)); \ + ((u16_t *)(addr))[7] = HTONS((addr7)); \ + } while(0) + +/** + * Copy an IP address to another IP address. + * + * Copies an IP address from one place to another. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2; + + uip_ipaddr(&ipaddr1, 192,16,1,2); + uip_ipaddr_copy(&ipaddr2, &ipaddr1); + \endcode + * + * \param dest The destination for the copy. + * \param src The source from where to copy. + * + * \hideinitializer + */ +#if !UIP_CONF_IPV6 +#define uip_ipaddr_copy(dest, src) do { \ + ((u16_t *)dest)[0] = ((u16_t *)src)[0]; \ + ((u16_t *)dest)[1] = ((u16_t *)src)[1]; \ + } while(0) +#else /* !UIP_CONF_IPV6 */ +#define uip_ipaddr_copy(dest, src) memcpy(dest, src, sizeof(uip_ip6addr_t)) +#endif /* !UIP_CONF_IPV6 */ + +/** + * Compare two IP addresses + * + * Compares two IP addresses. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2; + + uip_ipaddr(&ipaddr1, 192,16,1,2); + if(uip_ipaddr_cmp(&ipaddr2, &ipaddr1)) { + printf("They are the same"); + } + \endcode + * + * \param addr1 The first IP address. + * \param addr2 The second IP address. + * + * \hideinitializer + */ +#if !UIP_CONF_IPV6 +#define uip_ipaddr_cmp(addr1, addr2) (((u16_t *)addr1)[0] == ((u16_t *)addr2)[0] && \ + ((u16_t *)addr1)[1] == ((u16_t *)addr2)[1]) +#else /* !UIP_CONF_IPV6 */ +#define uip_ipaddr_cmp(addr1, addr2) (memcmp(addr1, addr2, sizeof(uip_ip6addr_t)) == 0) +#endif /* !UIP_CONF_IPV6 */ + +/** + * Compare two IP addresses with netmasks + * + * Compares two IP addresses with netmasks. The masks are used to mask + * out the bits that are to be compared. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2, mask; + + uip_ipaddr(&mask, 255,255,255,0); + uip_ipaddr(&ipaddr1, 192,16,1,2); + uip_ipaddr(&ipaddr2, 192,16,1,3); + if(uip_ipaddr_maskcmp(&ipaddr1, &ipaddr2, &mask)) { + printf("They are the same"); + } + \endcode + * + * \param addr1 The first IP address. + * \param addr2 The second IP address. + * \param mask The netmask. + * + * \hideinitializer + */ +#define uip_ipaddr_maskcmp(addr1, addr2, mask) \ + (((((u16_t *)addr1)[0] & ((u16_t *)mask)[0]) == \ + (((u16_t *)addr2)[0] & ((u16_t *)mask)[0])) && \ + ((((u16_t *)addr1)[1] & ((u16_t *)mask)[1]) == \ + (((u16_t *)addr2)[1] & ((u16_t *)mask)[1]))) + + +/** + * Mask out the network part of an IP address. + * + * Masks out the network part of an IP address, given the address and + * the netmask. + * + * Example: + \code + uip_ipaddr_t ipaddr1, ipaddr2, netmask; + + uip_ipaddr(&ipaddr1, 192,16,1,2); + uip_ipaddr(&netmask, 255,255,255,0); + uip_ipaddr_mask(&ipaddr2, &ipaddr1, &netmask); + \endcode + * + * In the example above, the variable "ipaddr2" will contain the IP + * address 192.168.1.0. + * + * \param dest Where the result is to be placed. + * \param src The IP address. + * \param mask The netmask. + * + * \hideinitializer + */ +#define uip_ipaddr_mask(dest, src, mask) do { \ + ((u16_t *)dest)[0] = ((u16_t *)src)[0] & ((u16_t *)mask)[0]; \ + ((u16_t *)dest)[1] = ((u16_t *)src)[1] & ((u16_t *)mask)[1]; \ + } while(0) + +/** + * Pick the first octet of an IP address. + * + * Picks out the first octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr1(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 1. + * + * \hideinitializer + */ +#define uip_ipaddr1(addr) (htons(((u16_t *)(addr))[0]) >> 8) + +/** + * Pick the second octet of an IP address. + * + * Picks out the second octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr2(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 2. + * + * \hideinitializer + */ +#define uip_ipaddr2(addr) (htons(((u16_t *)(addr))[0]) & 0xff) + +/** + * Pick the third octet of an IP address. + * + * Picks out the third octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr3(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 3. + * + * \hideinitializer + */ +#define uip_ipaddr3(addr) (htons(((u16_t *)(addr))[1]) >> 8) + +/** + * Pick the fourth octet of an IP address. + * + * Picks out the fourth octet of an IP address. + * + * Example: + \code + uip_ipaddr_t ipaddr; + u8_t octet; + + uip_ipaddr(&ipaddr, 1,2,3,4); + octet = uip_ipaddr4(&ipaddr); + \endcode + * + * In the example above, the variable "octet" will contain the value 4. + * + * \hideinitializer + */ +#define uip_ipaddr4(addr) (htons(((u16_t *)(addr))[1]) & 0xff) + +/** + * Convert 16-bit quantity from host byte order to network byte order. + * + * This macro is primarily used for converting constants from host + * byte order to network byte order. For converting variables to + * network byte order, use the htons() function instead. + * + * \hideinitializer + */ +#ifndef HTONS +# if UIP_BYTE_ORDER == UIP_BIG_ENDIAN +# define HTONS(n) (n) +# else /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ +# define HTONS(n) (u16_t)((((u16_t) (n)) << 8) | (((u16_t) (n)) >> 8)) +# endif /* UIP_BYTE_ORDER == UIP_BIG_ENDIAN */ +#else +#error "HTONS already defined!" +#endif /* HTONS */ + +/** + * Convert 16-bit quantity from host byte order to network byte order. + * + * This function is primarily used for converting variables from host + * byte order to network byte order. For converting constants to + * network byte order, use the HTONS() macro instead. + */ +#ifndef htons +u16_t htons(u16_t val); +#endif /* htons */ +#ifndef ntohs +#define ntohs htons +#endif + +/** @} */ + +/** + * Pointer to the application data in the packet buffer. + * + * This pointer points to the application data when the application is + * called. If the application wishes to send data, the application may + * use this space to write the data into before calling uip_send(). + */ +extern void *uip_appdata; + +#if UIP_URGDATA > 0 +/* u8_t *uip_urgdata: + * + * This pointer points to any urgent data that has been received. Only + * present if compiled with support for urgent data (UIP_URGDATA). + */ +extern void *uip_urgdata; +#endif /* UIP_URGDATA > 0 */ + + +/** + * \defgroup uipdrivervars Variables used in uIP device drivers + * @{ + * + * uIP has a few global variables that are used in device drivers for + * uIP. + */ + +/** + * The length of the packet in the uip_buf buffer. + * + * The global variable uip_len holds the length of the packet in the + * uip_buf buffer. + * + * When the network device driver calls the uIP input function, + * uip_len should be set to the length of the packet in the uip_buf + * buffer. + * + * When sending packets, the device driver should use the contents of + * the uip_len variable to determine the length of the outgoing + * packet. + * + */ +extern u16_t uip_len; + +/** @} */ + +#if UIP_URGDATA > 0 +extern u16_t uip_urglen, uip_surglen; +#endif /* UIP_URGDATA > 0 */ + + +#if UIP_TCP +/** + * Representation of a uIP TCP connection. + * + * The uip_conn structure is used for identifying a connection. All + * but one field in the structure are to be considered read-only by an + * application. The only exception is the appstate field whos purpose + * is to let the application store application-specific state (e.g., + * file pointers) for the connection. The type of this field is + * configured in the "uipopt.h" header file. + */ +struct uip_conn { + uip_ipaddr_t ripaddr; /**< The IP address of the remote host. */ + + u16_t lport; /**< The local TCP port, in network byte order. */ + u16_t rport; /**< The local remote TCP port, in network byte + order. */ + + u8_t rcv_nxt[4]; /**< The sequence number that we expect to + receive next. */ + u8_t snd_nxt[4]; /**< The sequence number that was last sent by + us. */ + u16_t len; /**< Length of the data that was previously sent. */ + u16_t mss; /**< Current maximum segment size for the + connection. */ + u16_t initialmss; /**< Initial maximum segment size for the + connection. */ + u8_t sa; /**< Retransmission time-out calculation state + variable. */ + u8_t sv; /**< Retransmission time-out calculation state + variable. */ + u8_t rto; /**< Retransmission time-out. */ + u8_t tcpstateflags; /**< TCP state and flags. */ + u8_t timer; /**< The retransmission timer. */ + u8_t nrtx; /**< The number of retransmissions for the last + segment sent. */ + + /** The application state. */ + uip_tcp_appstate_t appstate; +}; + + +/** + * Pointer to the current TCP connection. + * + * The uip_conn pointer can be used to access the current TCP + * connection. + */ +extern struct uip_conn *uip_conn; +/* The array containing all uIP connections. */ +extern struct uip_conn uip_conns[UIP_CONNS]; +#endif /* UIP_TCP */ +/** + * \addtogroup uiparch + * @{ + */ + +/** + * 4-byte array used for the 32-bit sequence number calculations. + */ +#if UIP_TCP +extern u8_t uip_acc32[4]; +#endif /* UIP_TCP */ + +/** @} */ + + +#if UIP_UDP +/** + * Representation of a uIP UDP connection. + */ +struct uip_udp_conn { + uip_ipaddr_t ripaddr; /**< The IP address of the remote peer. */ + u16_t lport; /**< The local port number in network byte order. */ + u16_t rport; /**< The remote port number in network byte order. */ + u8_t ttl; /**< Default time-to-live. */ + + /** The application state. */ + uip_udp_appstate_t appstate; +}; + +/** + * The current UDP connection. + */ +extern struct uip_udp_conn *uip_udp_conn; +extern struct uip_udp_conn uip_udp_conns[UIP_UDP_CONNS]; +#endif /* UIP_UDP */ + +/** + * The structure holding the TCP/IP statistics that are gathered if + * UIP_STATISTICS is set to 1. + * + */ +struct uip_stats { + struct { + uip_stats_t drop; /**< Number of dropped packets at the IP + layer. */ + uip_stats_t recv; /**< Number of received packets at the IP + layer. */ + uip_stats_t sent; /**< Number of sent packets at the IP + layer. */ + uip_stats_t vhlerr; /**< Number of packets dropped due to wrong + IP version or header length. */ + uip_stats_t hblenerr; /**< Number of packets dropped due to wrong + IP length, high byte. */ + uip_stats_t lblenerr; /**< Number of packets dropped due to wrong + IP length, low byte. */ + uip_stats_t fragerr; /**< Number of packets dropped since they + were IP fragments. */ + uip_stats_t chkerr; /**< Number of packets dropped due to IP + checksum errors. */ + uip_stats_t protoerr; /**< Number of packets dropped since they + were neither ICMP, UDP nor TCP. */ + } ip; /**< IP statistics. */ + struct { + uip_stats_t drop; /**< Number of dropped ICMP packets. */ + uip_stats_t recv; /**< Number of received ICMP packets. */ + uip_stats_t sent; /**< Number of sent ICMP packets. */ + uip_stats_t typeerr; /**< Number of ICMP packets with a wrong + type. */ + } icmp; /**< ICMP statistics. */ +#if UIP_TCP + struct { + uip_stats_t drop; /**< Number of dropped TCP segments. */ + uip_stats_t recv; /**< Number of recived TCP segments. */ + uip_stats_t sent; /**< Number of sent TCP segments. */ + uip_stats_t chkerr; /**< Number of TCP segments with a bad + checksum. */ + uip_stats_t ackerr; /**< Number of TCP segments with a bad ACK + number. */ + uip_stats_t rst; /**< Number of recevied TCP RST (reset) segments. */ + uip_stats_t rexmit; /**< Number of retransmitted TCP segments. */ + uip_stats_t syndrop; /**< Number of dropped SYNs due to too few + connections was avaliable. */ + uip_stats_t synrst; /**< Number of SYNs for closed ports, + triggering a RST. */ + } tcp; /**< TCP statistics. */ +#endif /* UIP_TCP */ +#if UIP_UDP + struct { + uip_stats_t drop; /**< Number of dropped UDP segments. */ + uip_stats_t recv; /**< Number of recived UDP segments. */ + uip_stats_t sent; /**< Number of sent UDP segments. */ + uip_stats_t chkerr; /**< Number of UDP segments with a bad + checksum. */ + } udp; /**< UDP statistics. */ +#endif /* UIP_UDP */ +}; + +/** + * The uIP TCP/IP statistics. + * + * This is the variable in which the uIP TCP/IP statistics are gathered. + */ +extern struct uip_stats uip_stat; + + +/*---------------------------------------------------------------------------*/ +/* All the stuff below this point is internal to uIP and should not be + * used directly by an application or by a device driver. + */ +/*---------------------------------------------------------------------------*/ +/* u8_t uip_flags: + * + * When the application is called, uip_flags will contain the flags + * that are defined in this file. Please read below for more + * infomation. + */ +extern u8_t uip_flags; + +/* The following flags may be set in the global variable uip_flags + before calling the application callback. The UIP_ACKDATA, + UIP_NEWDATA, and UIP_CLOSE flags may both be set at the same time, + whereas the others are mutualy exclusive. Note that these flags + should *NOT* be accessed directly, but only through the uIP + functions/macros. */ + +#define UIP_ACKDATA 1 /* Signifies that the outstanding data was + acked and the application should send + out new data instead of retransmitting + the last data. */ +#define UIP_NEWDATA 2 /* Flags the fact that the peer has sent + us new data. */ +#define UIP_REXMIT 4 /* Tells the application to retransmit the + data that was last sent. */ +#define UIP_POLL 8 /* Used for polling the application, to + check if the application has data that + it wants to send. */ +#define UIP_CLOSE 16 /* The remote host has closed the + connection, thus the connection has + gone away. Or the application signals + that it wants to close the + connection. */ +#define UIP_ABORT 32 /* The remote host has aborted the + connection, thus the connection has + gone away. Or the application signals + that it wants to abort the + connection. */ +#define UIP_CONNECTED 64 /* We have got a connection from a remote + host and have set up a new connection + for it, or an active connection has + been successfully established. */ + +#define UIP_TIMEDOUT 128 /* The connection has been aborted due to + too many retransmissions. */ + +/* uip_process(flag): + * + * The actual uIP function which does all the work. + */ +void uip_process(u8_t flag); + +/* The following flags are passed as an argument to the uip_process() + function. They are used to distinguish between the two cases where + uip_process() is called. It can be called either because we have + incoming data that should be processed, or because the periodic + timer has fired. These values are never used directly, but only in + the macrose defined in this file. */ + +#define UIP_DATA 1 /* Tells uIP that there is incoming + data in the uip_buf buffer. The + length of the data is stored in the + global variable uip_len. */ +#define UIP_TIMER 2 /* Tells uIP that the periodic timer + has fired. */ +#define UIP_POLL_REQUEST 3 /* Tells uIP that a connection should + be polled. */ +#define UIP_UDP_SEND_CONN 4 /* Tells uIP that a UDP datagram + should be constructed in the + uip_buf buffer. */ +#if UIP_UDP +#define UIP_UDP_TIMER 5 +#endif /* UIP_UDP */ + +/* The TCP states used in the uip_conn->tcpstateflags. */ +#define UIP_CLOSED 0 +#define UIP_SYN_RCVD 1 +#define UIP_SYN_SENT 2 +#define UIP_ESTABLISHED 3 +#define UIP_FIN_WAIT_1 4 +#define UIP_FIN_WAIT_2 5 +#define UIP_CLOSING 6 +#define UIP_TIME_WAIT 7 +#define UIP_LAST_ACK 8 +#define UIP_TS_MASK 15 + +#define UIP_STOPPED 16 + +/* The TCP and IP headers. */ +struct uip_tcpip_hdr { +#if UIP_CONF_IPV6 + /* IPv6 header. */ + u8_t vtc, + tcflow; + u16_t flow; + u8_t len[2]; + u8_t proto, ttl; + uip_ip6addr_t srcipaddr, destipaddr; +#else /* UIP_CONF_IPV6 */ + /* IPv4 header. */ + u8_t vhl, + tos, + len[2], + ipid[2], + ipoffset[2], + ttl, + proto; + u16_t ipchksum; + u16_t srcipaddr[2], + destipaddr[2]; +#endif /* UIP_CONF_IPV6 */ + + /* TCP header. */ + u16_t srcport, + destport; + u8_t seqno[4], + ackno[4], + tcpoffset, + flags, + wnd[2]; + u16_t tcpchksum; + u8_t urgp[2]; + u8_t optdata[4]; +}; + +/* The ICMP and IP headers. */ +struct uip_icmpip_hdr { +#if UIP_CONF_IPV6 + /* IPv6 header. */ + u8_t vtc, + tcf; + u16_t flow; + u8_t len[2]; + u8_t proto, ttl; + uip_ip6addr_t srcipaddr, destipaddr; +#else /* UIP_CONF_IPV6 */ + /* IPv4 header. */ + u8_t vhl, + tos, + len[2], + ipid[2], + ipoffset[2], + ttl, + proto; + u16_t ipchksum; + u16_t srcipaddr[2], + destipaddr[2]; +#endif /* UIP_CONF_IPV6 */ + + /* ICMP (echo) header. */ + u8_t type, icode; + u16_t icmpchksum; +#if !UIP_CONF_IPV6 + u16_t id, seqno; +#else /* !UIP_CONF_IPV6 */ + u8_t flags, reserved1, reserved2, reserved3; + u8_t icmp6data[16]; + u8_t options[1]; +#endif /* !UIP_CONF_IPV6 */ +}; + + +/* The UDP and IP headers. */ +struct uip_udpip_hdr { +#if UIP_CONF_IPV6 + /* IPv6 header. */ + u8_t vtc, + tcf; + u16_t flow; + u8_t len[2]; + u8_t proto, ttl; + uip_ip6addr_t srcipaddr, destipaddr; +#else /* UIP_CONF_IPV6 */ + /* IP header. */ + u8_t vhl, + tos, + len[2], + ipid[2], + ipoffset[2], + ttl, + proto; + u16_t ipchksum; + u16_t srcipaddr[2], + destipaddr[2]; +#endif /* UIP_CONF_IPV6 */ + + /* UDP header. */ + u16_t srcport, + destport; + u16_t udplen; + u16_t udpchksum; +}; + + + +/** + * The buffer size available for user data in the \ref uip_buf buffer. + * + * This macro holds the available size for user data in the \ref + * uip_buf buffer. The macro is intended to be used for checking + * bounds of available user data. + * + * Example: + \code + snprintf(uip_appdata, UIP_APPDATA_SIZE, "%u\n", i); + \endcode + * + * \hideinitializer + */ +#define UIP_APPDATA_SIZE (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN) + + +#define UIP_PROTO_ICMP 1 +#define UIP_PROTO_TCP 6 +#define UIP_PROTO_UDP 17 +#define UIP_PROTO_ICMP6 58 + +/* Header sizes. */ +#if UIP_CONF_IPV6 +#define UIP_IPH_LEN 40 +#else /* UIP_CONF_IPV6 */ +#define UIP_IPH_LEN 20 /* Size of IP header */ +#endif /* UIP_CONF_IPV6 */ +#define UIP_UDPH_LEN 8 /* Size of UDP header */ +#define UIP_TCPH_LEN 20 /* Size of TCP header */ +#define UIP_IPUDPH_LEN (UIP_UDPH_LEN + UIP_IPH_LEN) /* Size of IP + + UDP + header */ +#define UIP_IPTCPH_LEN (UIP_TCPH_LEN + UIP_IPH_LEN) /* Size of IP + + TCP + header */ +#define UIP_TCPIP_HLEN UIP_IPTCPH_LEN + + +#if UIP_FIXEDADDR +extern const uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr; +#else /* UIP_FIXEDADDR */ +extern uip_ipaddr_t uip_hostaddr, uip_netmask, uip_draddr; +#endif /* UIP_FIXEDADDR */ + + + +/** + * Representation of a 48-bit Ethernet address. + */ +struct uip_eth_addr { + u8_t addr[6]; +}; + +/** + * Calculate the Internet checksum over a buffer. + * + * The Internet checksum is the one's complement of the one's + * complement sum of all 16-bit words in the buffer. + * + * See RFC1071. + * + * \param buf A pointer to the buffer over which the checksum is to be + * computed. + * + * \param len The length of the buffer over which the checksum is to + * be computed. + * + * \return The Internet checksum of the buffer. + */ +u16_t uip_chksum(u16_t *buf, u16_t len); + +/** + * Calculate the IP header checksum of the packet header in uip_buf. + * + * The IP header checksum is the Internet checksum of the 20 bytes of + * the IP header. + * + * \return The IP header checksum of the IP header in the uip_buf + * buffer. + */ +u16_t uip_ipchksum(void); + +/** + * Calculate the TCP checksum of the packet in uip_buf and uip_appdata. + * + * The TCP checksum is the Internet checksum of data contents of the + * TCP segment, and a pseudo-header as defined in RFC793. + * + * \return The TCP checksum of the TCP segment in uip_buf and pointed + * to by uip_appdata. + */ +u16_t uip_tcpchksum(void); + +/** + * Calculate the UDP checksum of the packet in uip_buf and uip_appdata. + * + * The UDP checksum is the Internet checksum of data contents of the + * UDP segment, and a pseudo-header as defined in RFC768. + * + * \return The UDP checksum of the UDP segment in uip_buf and pointed + * to by uip_appdata. + */ +u16_t uip_udpchksum(void); + + +#endif /* __UIP_H__ */ + + +/** @} */ diff --git a/third_party/uip-1.0/uip/uip_arch.h b/third_party/uip-1.0/uip/uip_arch.h new file mode 100644 index 0000000..5ea4578 --- /dev/null +++ b/third_party/uip-1.0/uip/uip_arch.h @@ -0,0 +1,138 @@ +/** + * \addtogroup uip + * {@ + */ + +/** + * \defgroup uiparch Architecture specific uIP functions + * @{ + * + * The functions in the architecture specific module implement the IP + * check sum and 32-bit additions. + * + * The IP checksum calculation is the most computationally expensive + * operation in the TCP/IP stack and it therefore pays off to + * implement this in efficient assembler. The purpose of the uip-arch + * module is to let the checksum functions to be implemented in + * architecture specific assembler. + * + */ + +/** + * \file + * Declarations of architecture specific functions. + * \author Adam Dunkels + */ + +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip_arch.h,v 1.2 2006/06/07 09:15:19 adam Exp $ + * + */ + +#ifndef __UIP_ARCH_H__ +#define __UIP_ARCH_H__ + +#include "uip.h" + +/** + * Carry out a 32-bit addition. + * + * Because not all architectures for which uIP is intended has native + * 32-bit arithmetic, uIP uses an external C function for doing the + * required 32-bit additions in the TCP protocol processing. This + * function should add the two arguments and place the result in the + * global variable uip_acc32. + * + * \note The 32-bit integer pointed to by the op32 parameter and the + * result in the uip_acc32 variable are in network byte order (big + * endian). + * + * \param op32 A pointer to a 4-byte array representing a 32-bit + * integer in network byte order (big endian). + * + * \param op16 A 16-bit integer in host byte order. + */ +void uip_add32(u8_t *op32, u16_t op16); + +/** + * Calculate the Internet checksum over a buffer. + * + * The Internet checksum is the one's complement of the one's + * complement sum of all 16-bit words in the buffer. + * + * See RFC1071. + * + * \note This function is not called in the current version of uIP, + * but future versions might make use of it. + * + * \param buf A pointer to the buffer over which the checksum is to be + * computed. + * + * \param len The length of the buffer over which the checksum is to + * be computed. + * + * \return The Internet checksum of the buffer. + */ +u16_t uip_chksum(u16_t *buf, u16_t len); + +/** + * Calculate the IP header checksum of the packet header in uip_buf. + * + * The IP header checksum is the Internet checksum of the 20 bytes of + * the IP header. + * + * \return The IP header checksum of the IP header in the uip_buf + * buffer. + */ +u16_t uip_ipchksum(void); + +/** + * Calculate the TCP checksum of the packet in uip_buf and uip_appdata. + * + * The TCP checksum is the Internet checksum of data contents of the + * TCP segment, and a pseudo-header as defined in RFC793. + * + * \note The uip_appdata pointer that points to the packet data may + * point anywhere in memory, so it is not possible to simply calculate + * the Internet checksum of the contents of the uip_buf buffer. + * + * \return The TCP checksum of the TCP segment in uip_buf and pointed + * to by uip_appdata. + */ +u16_t uip_tcpchksum(void); + +u16_t uip_udpchksum(void); + +/** @} */ +/** @} */ + +#endif /* __UIP_ARCH_H__ */ diff --git a/third_party/uip-1.0/uip/uip_arp.c b/third_party/uip-1.0/uip/uip_arp.c new file mode 100644 index 0000000..96cea8b --- /dev/null +++ b/third_party/uip-1.0/uip/uip_arp.c @@ -0,0 +1,423 @@ +/** + * \addtogroup uip + * @{ + */ + +/** + * \defgroup uiparp uIP Address Resolution Protocol + * @{ + * + * The Address Resolution Protocol ARP is used for mapping between IP + * addresses and link level addresses such as the Ethernet MAC + * addresses. ARP uses broadcast queries to ask for the link level + * address of a known IP address and the host which is configured with + * the IP address for which the query was meant, will respond with its + * link level address. + * + * \note This ARP implementation only supports Ethernet. + */ + +/** + * \file + * Implementation of the ARP Address Resolution Protocol. + * \author Adam Dunkels + * + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip_arp.c,v 1.8 2006/06/02 23:36:21 adam Exp $ + * + */ + + +#include "uip_arp.h" + +#include + +struct arp_hdr { + struct uip_eth_hdr ethhdr; + u16_t hwtype; + u16_t protocol; + u8_t hwlen; + u8_t protolen; + u16_t opcode; + struct uip_eth_addr shwaddr; + u16_t sipaddr[2]; + struct uip_eth_addr dhwaddr; + u16_t dipaddr[2]; +}; + +struct ethip_hdr { + struct uip_eth_hdr ethhdr; + /* IP header. */ + u8_t vhl, + tos, + len[2], + ipid[2], + ipoffset[2], + ttl, + proto; + u16_t ipchksum; + u16_t srcipaddr[2], + destipaddr[2]; +}; + +#define ARP_REQUEST 1 +#define ARP_REPLY 2 + +#define ARP_HWTYPE_ETH 1 + +struct arp_entry { + u16_t ipaddr[2]; + struct uip_eth_addr ethaddr; + u8_t time; +}; + +static const struct uip_eth_addr broadcast_ethaddr = + {{0xff,0xff,0xff,0xff,0xff,0xff}}; +static const u16_t broadcast_ipaddr[2] = {0xffff,0xffff}; + +static struct arp_entry arp_table[UIP_ARPTAB_SIZE]; +static u16_t ipaddr[2]; +static u8_t i, c; + +static u8_t arptime; +static u8_t tmpage; + +#define BUF ((struct arp_hdr *)&uip_buf[0]) +#define IPBUF ((struct ethip_hdr *)&uip_buf[0]) +/*-----------------------------------------------------------------------------------*/ +/** + * Initialize the ARP module. + * + */ +/*-----------------------------------------------------------------------------------*/ +void +uip_arp_init(void) +{ + for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { + memset(arp_table[i].ipaddr, 0, 4); + } +} +/*-----------------------------------------------------------------------------------*/ +/** + * Periodic ARP processing function. + * + * This function performs periodic timer processing in the ARP module + * and should be called at regular intervals. The recommended interval + * is 10 seconds between the calls. + * + */ +/*-----------------------------------------------------------------------------------*/ +void +uip_arp_timer(void) +{ + struct arp_entry *tabptr; + + ++arptime; + for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { + tabptr = &arp_table[i]; + if((tabptr->ipaddr[0] | tabptr->ipaddr[1]) != 0 && + arptime - tabptr->time >= UIP_ARP_MAXAGE) { + memset(tabptr->ipaddr, 0, 4); + } + } + +} +/*-----------------------------------------------------------------------------------*/ +static void +uip_arp_update(u16_t *ipaddr, struct uip_eth_addr *ethaddr) +{ + register struct arp_entry *tabptr; + /* Walk through the ARP mapping table and try to find an entry to + update. If none is found, the IP -> MAC address mapping is + inserted in the ARP table. */ + for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { + + tabptr = &arp_table[i]; + /* Only check those entries that are actually in use. */ + if(tabptr->ipaddr[0] != 0 && + tabptr->ipaddr[1] != 0) { + + /* Check if the source IP address of the incoming packet matches + the IP address in this ARP table entry. */ + if(ipaddr[0] == tabptr->ipaddr[0] && + ipaddr[1] == tabptr->ipaddr[1]) { + + /* An old entry found, update this and return. */ + memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6); + tabptr->time = arptime; + + return; + } + } + } + + /* If we get here, no existing ARP table entry was found, so we + create one. */ + + /* First, we try to find an unused entry in the ARP table. */ + for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { + tabptr = &arp_table[i]; + if(tabptr->ipaddr[0] == 0 && + tabptr->ipaddr[1] == 0) { + break; + } + } + + /* If no unused entry is found, we try to find the oldest entry and + throw it away. */ + if(i == UIP_ARPTAB_SIZE) { + tmpage = 0; + c = 0; + for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { + tabptr = &arp_table[i]; + if(arptime - tabptr->time > tmpage) { + tmpage = arptime - tabptr->time; + c = i; + } + } + i = c; + tabptr = &arp_table[i]; + } + + /* Now, i is the ARP table entry which we will fill with the new + information. */ + memcpy(tabptr->ipaddr, ipaddr, 4); + memcpy(tabptr->ethaddr.addr, ethaddr->addr, 6); + tabptr->time = arptime; +} +/*-----------------------------------------------------------------------------------*/ +/** + * ARP processing for incoming IP packets + * + * This function should be called by the device driver when an IP + * packet has been received. The function will check if the address is + * in the ARP cache, and if so the ARP cache entry will be + * refreshed. If no ARP cache entry was found, a new one is created. + * + * This function expects an IP packet with a prepended Ethernet header + * in the uip_buf[] buffer, and the length of the packet in the global + * variable uip_len. + */ +/*-----------------------------------------------------------------------------------*/ +#if 0 +void +uip_arp_ipin(void) +{ + uip_len -= sizeof(struct uip_eth_hdr); + + /* Only insert/update an entry if the source IP address of the + incoming IP packet comes from a host on the local network. */ + if((IPBUF->srcipaddr[0] & uip_netmask[0]) != + (uip_hostaddr[0] & uip_netmask[0])) { + return; + } + if((IPBUF->srcipaddr[1] & uip_netmask[1]) != + (uip_hostaddr[1] & uip_netmask[1])) { + return; + } + uip_arp_update(IPBUF->srcipaddr, &(IPBUF->ethhdr.src)); + + return; +} +#endif /* 0 */ +/*-----------------------------------------------------------------------------------*/ +/** + * ARP processing for incoming ARP packets. + * + * This function should be called by the device driver when an ARP + * packet has been received. The function will act differently + * depending on the ARP packet type: if it is a reply for a request + * that we previously sent out, the ARP cache will be filled in with + * the values from the ARP reply. If the incoming ARP packet is an ARP + * request for our IP address, an ARP reply packet is created and put + * into the uip_buf[] buffer. + * + * When the function returns, the value of the global variable uip_len + * indicates whether the device driver should send out a packet or + * not. If uip_len is zero, no packet should be sent. If uip_len is + * non-zero, it contains the length of the outbound packet that is + * present in the uip_buf[] buffer. + * + * This function expects an ARP packet with a prepended Ethernet + * header in the uip_buf[] buffer, and the length of the packet in the + * global variable uip_len. + */ +/*-----------------------------------------------------------------------------------*/ +void +uip_arp_arpin(void) +{ + + if(uip_len < sizeof(struct arp_hdr)) { + uip_len = 0; + return; + } + uip_len = 0; + + switch(BUF->opcode) { + case HTONS(ARP_REQUEST): + /* ARP request. If it asked for our address, we send out a + reply. */ + if(uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr)) { + /* First, we register the one who made the request in our ARP + table, since it is likely that we will do more communication + with this host in the future. */ + uip_arp_update(BUF->sipaddr, &BUF->shwaddr); + + /* The reply opcode is 2. */ + BUF->opcode = HTONS(2); + + memcpy(BUF->dhwaddr.addr, BUF->shwaddr.addr, 6); + memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6); + memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6); + memcpy(BUF->ethhdr.dest.addr, BUF->dhwaddr.addr, 6); + + BUF->dipaddr[0] = BUF->sipaddr[0]; + BUF->dipaddr[1] = BUF->sipaddr[1]; + BUF->sipaddr[0] = uip_hostaddr[0]; + BUF->sipaddr[1] = uip_hostaddr[1]; + + BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP); + uip_len = sizeof(struct arp_hdr); + } + break; + case HTONS(ARP_REPLY): + /* ARP reply. We insert or update the ARP table if it was meant + for us. */ + if(uip_ipaddr_cmp(BUF->dipaddr, uip_hostaddr)) { + uip_arp_update(BUF->sipaddr, &BUF->shwaddr); + } + break; + } + + return; +} +/*-----------------------------------------------------------------------------------*/ +/** + * Prepend Ethernet header to an outbound IP packet and see if we need + * to send out an ARP request. + * + * This function should be called before sending out an IP packet. The + * function checks the destination IP address of the IP packet to see + * what Ethernet MAC address that should be used as a destination MAC + * address on the Ethernet. + * + * If the destination IP address is in the local network (determined + * by logical ANDing of netmask and our IP address), the function + * checks the ARP cache to see if an entry for the destination IP + * address is found. If so, an Ethernet header is prepended and the + * function returns. If no ARP cache entry is found for the + * destination IP address, the packet in the uip_buf[] is replaced by + * an ARP request packet for the IP address. The IP packet is dropped + * and it is assumed that they higher level protocols (e.g., TCP) + * eventually will retransmit the dropped packet. + * + * If the destination IP address is not on the local network, the IP + * address of the default router is used instead. + * + * When the function returns, a packet is present in the uip_buf[] + * buffer, and the length of the packet is in the global variable + * uip_len. + */ +/*-----------------------------------------------------------------------------------*/ +void +uip_arp_out(void) +{ + struct arp_entry *tabptr; + + /* Find the destination IP address in the ARP table and construct + the Ethernet header. If the destination IP addres isn't on the + local network, we use the default router's IP address instead. + + If not ARP table entry is found, we overwrite the original IP + packet with an ARP request for the IP address. */ + + /* First check if destination is a local broadcast. */ + if(uip_ipaddr_cmp(IPBUF->destipaddr, broadcast_ipaddr)) { + memcpy(IPBUF->ethhdr.dest.addr, broadcast_ethaddr.addr, 6); + } else { + /* Check if the destination address is on the local network. */ + if(!uip_ipaddr_maskcmp(IPBUF->destipaddr, uip_hostaddr, uip_netmask)) { + /* Destination address was not on the local network, so we need to + use the default router's IP address instead of the destination + address when determining the MAC address. */ + uip_ipaddr_copy(ipaddr, uip_draddr); + } else { + /* Else, we use the destination IP address. */ + uip_ipaddr_copy(ipaddr, IPBUF->destipaddr); + } + + for(i = 0; i < UIP_ARPTAB_SIZE; ++i) { + tabptr = &arp_table[i]; + if(uip_ipaddr_cmp(ipaddr, tabptr->ipaddr)) { + break; + } + } + + if(i == UIP_ARPTAB_SIZE) { + /* The destination address was not in our ARP table, so we + overwrite the IP packet with an ARP request. */ + + memset(BUF->ethhdr.dest.addr, 0xff, 6); + memset(BUF->dhwaddr.addr, 0x00, 6); + memcpy(BUF->ethhdr.src.addr, uip_ethaddr.addr, 6); + memcpy(BUF->shwaddr.addr, uip_ethaddr.addr, 6); + + uip_ipaddr_copy(BUF->dipaddr, ipaddr); + uip_ipaddr_copy(BUF->sipaddr, uip_hostaddr); + BUF->opcode = HTONS(ARP_REQUEST); /* ARP request. */ + BUF->hwtype = HTONS(ARP_HWTYPE_ETH); + BUF->protocol = HTONS(UIP_ETHTYPE_IP); + BUF->hwlen = 6; + BUF->protolen = 4; + BUF->ethhdr.type = HTONS(UIP_ETHTYPE_ARP); + + uip_appdata = &uip_buf[UIP_TCPIP_HLEN + UIP_LLH_LEN]; + + uip_len = sizeof(struct arp_hdr); + return; + } + + /* Build an ethernet header. */ + memcpy(IPBUF->ethhdr.dest.addr, tabptr->ethaddr.addr, 6); + } + memcpy(IPBUF->ethhdr.src.addr, uip_ethaddr.addr, 6); + + IPBUF->ethhdr.type = HTONS(UIP_ETHTYPE_IP); + + uip_len += sizeof(struct uip_eth_hdr); +} +/*-----------------------------------------------------------------------------------*/ + +/** @} */ +/** @} */ diff --git a/third_party/uip-1.0/uip/uip_arp.h b/third_party/uip-1.0/uip/uip_arp.h new file mode 100644 index 0000000..dc829e0 --- /dev/null +++ b/third_party/uip-1.0/uip/uip_arp.h @@ -0,0 +1,144 @@ +/** + * \addtogroup uip + * @{ + */ + +/** + * \addtogroup uiparp + * @{ + */ + +/** + * \file + * Macros and definitions for the ARP module. + * \author Adam Dunkels + */ + + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uip_arp.h,v 1.5 2006/06/11 21:46:39 adam Exp $ + * + */ + +#ifndef __UIP_ARP_H__ +#define __UIP_ARP_H__ + +#include "uip.h" + + +extern struct uip_eth_addr uip_ethaddr; + +/** + * The Ethernet header. + */ +struct uip_eth_hdr { + struct uip_eth_addr dest; + struct uip_eth_addr src; + u16_t type; +}; + +#define UIP_ETHTYPE_ARP 0x0806 +#define UIP_ETHTYPE_IP 0x0800 +#define UIP_ETHTYPE_IP6 0x86dd + + +/* The uip_arp_init() function must be called before any of the other + ARP functions. */ +void uip_arp_init(void); + +/* The uip_arp_ipin() function should be called whenever an IP packet + arrives from the Ethernet. This function refreshes the ARP table or + inserts a new mapping if none exists. The function assumes that an + IP packet with an Ethernet header is present in the uip_buf buffer + and that the length of the packet is in the uip_len variable. */ +/*void uip_arp_ipin(void);*/ +#define uip_arp_ipin() + +/* The uip_arp_arpin() should be called when an ARP packet is received + by the Ethernet driver. This function also assumes that the + Ethernet frame is present in the uip_buf buffer. When the + uip_arp_arpin() function returns, the contents of the uip_buf + buffer should be sent out on the Ethernet if the uip_len variable + is > 0. */ +void uip_arp_arpin(void); + +/* The uip_arp_out() function should be called when an IP packet + should be sent out on the Ethernet. This function creates an + Ethernet header before the IP header in the uip_buf buffer. The + Ethernet header will have the correct Ethernet MAC destination + address filled in if an ARP table entry for the destination IP + address (or the IP address of the default router) is present. If no + such table entry is found, the IP packet is overwritten with an ARP + request and we rely on TCP to retransmit the packet that was + overwritten. In any case, the uip_len variable holds the length of + the Ethernet frame that should be transmitted. */ +void uip_arp_out(void); + +/* The uip_arp_timer() function should be called every ten seconds. It + is responsible for flushing old entries in the ARP table. */ +void uip_arp_timer(void); + +/** @} */ + +/** + * \addtogroup uipconffunc + * @{ + */ + + +/** + * Specifiy the Ethernet MAC address. + * + * The ARP code needs to know the MAC address of the Ethernet card in + * order to be able to respond to ARP queries and to generate working + * Ethernet headers. + * + * \note This macro only specifies the Ethernet MAC address to the ARP + * code. It cannot be used to change the MAC address of the Ethernet + * card. + * + * \param eaddr A pointer to a struct uip_eth_addr containing the + * Ethernet MAC address of the Ethernet card. + * + * \hideinitializer + */ +#define uip_setethaddr(eaddr) do {uip_ethaddr.addr[0] = eaddr.addr[0]; \ + uip_ethaddr.addr[1] = eaddr.addr[1];\ + uip_ethaddr.addr[2] = eaddr.addr[2];\ + uip_ethaddr.addr[3] = eaddr.addr[3];\ + uip_ethaddr.addr[4] = eaddr.addr[4];\ + uip_ethaddr.addr[5] = eaddr.addr[5];} while(0) + +/** @} */ +/** @} */ + +#endif /* __UIP_ARP_H__ */ diff --git a/third_party/uip-1.0/uip/uip_timer.c b/third_party/uip-1.0/uip/uip_timer.c new file mode 100644 index 0000000..6bc21b3 --- /dev/null +++ b/third_party/uip-1.0/uip/uip_timer.c @@ -0,0 +1,127 @@ +/** + * \addtogroup timer + * @{ + */ + +/** + * \file + * Timer library implementation. + * \author + * Adam Dunkels + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: timer.c,v 1.2 2006/06/12 08:00:30 adam Exp $ + */ + +#include "clock.h" +#include "uip_timer.h" + +/*---------------------------------------------------------------------------*/ +/** + * Set a timer. + * + * This function is used to set a timer for a time sometime in the + * future. The function timer_expired() will evaluate to true after + * the timer has expired. + * + * \param t A pointer to the timer + * \param interval The interval before the timer expires. + * + */ +void +timer_set(struct timer *t, clock_time_t interval) +{ + t->interval = interval; + t->start = clock_time(); +} +/*---------------------------------------------------------------------------*/ +/** + * Reset the timer with the same interval. + * + * This function resets the timer with the same interval that was + * given to the timer_set() function. The start point of the interval + * is the exact time that the timer last expired. Therefore, this + * function will cause the timer to be stable over time, unlike the + * timer_rester() function. + * + * \param t A pointer to the timer. + * + * \sa timer_restart() + */ +void +timer_reset(struct timer *t) +{ + t->start += t->interval; +} +/*---------------------------------------------------------------------------*/ +/** + * Restart the timer from the current point in time + * + * This function restarts a timer with the same interval that was + * given to the timer_set() function. The timer will start at the + * current time. + * + * \note A periodic timer will drift if this function is used to reset + * it. For preioric timers, use the timer_reset() function instead. + * + * \param t A pointer to the timer. + * + * \sa timer_reset() + */ +void +timer_restart(struct timer *t) +{ + t->start = clock_time(); +} +/*---------------------------------------------------------------------------*/ +/** + * Check if a timer has expired. + * + * This function tests if a timer has expired and returns true or + * false depending on its status. + * + * \param t A pointer to the timer + * + * \return Non-zero if the timer has expired, zero otherwise. + * + */ +int +timer_expired(struct timer *t) +{ + return (clock_time_t)(clock_time() - t->start) >= (clock_time_t)t->interval; +} +/*---------------------------------------------------------------------------*/ + +/** @} */ diff --git a/third_party/uip-1.0/uip/uip_timer.h b/third_party/uip-1.0/uip/uip_timer.h new file mode 100644 index 0000000..ac05f00 --- /dev/null +++ b/third_party/uip-1.0/uip/uip_timer.h @@ -0,0 +1,86 @@ +/** + * \defgroup timer Timer library + * + * The timer library provides functions for setting, resetting and + * restarting timers, and for checking if a timer has expired. An + * application must "manually" check if its timers have expired; this + * is not done automatically. + * + * A timer is declared as a \c struct \c timer and all access to the + * timer is made by a pointer to the declared timer. + * + * \note The timer library uses the \ref clock "Clock library" to + * measure time. Intervals should be specified in the format used by + * the clock library. + * + * @{ + */ + + +/** + * \file + * Timer library header file. + * \author + * Adam Dunkels + */ + +/* + * Copyright (c) 2004, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * Author: Adam Dunkels + * + * $Id: timer.h,v 1.3 2006/06/11 21:46:39 adam Exp $ + */ +#ifndef __UIP_TIMER_H__ +#define __UIP_TIMER_H__ + +#include "clock.h" + +/** + * A timer. + * + * This structure is used for declaring a timer. The timer must be set + * with timer_set() before it can be used. + * + * \hideinitializer + */ +struct timer { + clock_time_t start; + clock_time_t interval; +}; + +void timer_set(struct timer *t, clock_time_t interval); +void timer_reset(struct timer *t); +void timer_restart(struct timer *t); +int timer_expired(struct timer *t); + +#endif /* __TIMER_H__ */ + +/** @} */ diff --git a/third_party/uip-1.0/uip/uiplib.c b/third_party/uip-1.0/uip/uiplib.c new file mode 100644 index 0000000..647b0b2 --- /dev/null +++ b/third_party/uip-1.0/uip/uiplib.c @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2004, Adam Dunkels and the Swedish Institute of + * Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uiplib.c,v 1.2 2006/06/12 08:00:31 adam Exp $ + * + */ + + +#include "uip.h" +#include "uiplib.h" + + +/*-----------------------------------------------------------------------------------*/ +unsigned char +uiplib_ipaddrconv(char *addrstr, unsigned char *ipaddr) +{ + unsigned char tmp; + char c; + unsigned char i, j; + + tmp = 0; + + for(i = 0; i < 4; ++i) { + j = 0; + do { + c = *addrstr; + ++j; + if(j > 4) { + return 0; + } + if(c == '.' || c == 0) { + *ipaddr = tmp; + ++ipaddr; + tmp = 0; + } else if(c >= '0' && c <= '9') { + tmp = (tmp * 10) + (c - '0'); + } else { + return 0; + } + ++addrstr; + } while(c != '.' && c != 0); + } + return 1; +} + +/*-----------------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/uip/uiplib.h b/third_party/uip-1.0/uip/uiplib.h new file mode 100644 index 0000000..6eb0c66 --- /dev/null +++ b/third_party/uip-1.0/uip/uiplib.h @@ -0,0 +1,71 @@ +/** + * \file + * Various uIP library functions. + * \author + * Adam Dunkels + * + */ + +/* + * Copyright (c) 2002, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uiplib.h,v 1.1 2006/06/07 09:15:19 adam Exp $ + * + */ +#ifndef __UIPLIB_H__ +#define __UIPLIB_H__ + +/** + * \addtogroup uipconvfunc + * @{ + */ + +/** + * Convert a textual representation of an IP address to a numerical representation. + * + * This function takes a textual representation of an IP address in + * the form a.b.c.d and converts it into a 4-byte array that can be + * used by other uIP functions. + * + * \param addrstr A pointer to a string containing the IP address in + * textual form. + * + * \param addr A pointer to a 4-byte array that will be filled in with + * the numerical representation of the address. + * + * \retval 0 If the IP address could not be parsed. + * \retval Non-zero If the IP address was parsed. + */ +unsigned char uiplib_ipaddrconv(char *addrstr, unsigned char *addr); + +/** @} */ + +#endif /* __UIPLIB_H__ */ diff --git a/third_party/uip-1.0/uip/uipopt.h b/third_party/uip-1.0/uip/uipopt.h new file mode 100644 index 0000000..94ad88f --- /dev/null +++ b/third_party/uip-1.0/uip/uipopt.h @@ -0,0 +1,550 @@ +/** + * \defgroup uipopt Configuration options for uIP + * @{ + * + * uIP is configured using the per-project configuration file + * uipopt.h. This file contains all compile-time options for uIP and + * should be tweaked to match each specific project. The uIP + * distribution contains a documented example "uipopt.h" that can be + * copied and modified for each project. + * + * \note Most of the configuration options in the uipopt.h should not + * be changed, but rather the per-project uip-conf.h file. + */ + +/** + * \file + * Configuration options for uIP. + * \author Adam Dunkels + * + * This file is used for tweaking various configuration options for + * uIP. You should make a copy of this file into one of your project's + * directories instead of editing this example "uipopt.h" file that + * comes with the uIP distribution. + */ + +/* + * Copyright (c) 2001-2003, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: uipopt.h,v 1.4 2006/06/12 08:00:31 adam Exp $ + * + */ + +#ifndef __UIPOPT_H__ +#define __UIPOPT_H__ + +#ifndef UIP_LITTLE_ENDIAN +#define UIP_LITTLE_ENDIAN 3412 +#endif /* UIP_LITTLE_ENDIAN */ +#ifndef UIP_BIG_ENDIAN +#define UIP_BIG_ENDIAN 1234 +#endif /* UIP_BIG_ENDIAN */ + +#include "uip-conf.h" + +/*------------------------------------------------------------------------------*/ + +/** + * \name Static configuration options + * @{ + * + * These configuration options can be used for setting the IP address + * settings statically, but only if UIP_FIXEDADDR is set to 1. The + * configuration options for a specific node includes IP address, + * netmask and default router as well as the Ethernet address. The + * netmask, default router and Ethernet address are appliciable only + * if uIP should be run over Ethernet. + * + * All of these should be changed to suit your project. +*/ + +/** + * Determines if uIP should use a fixed IP address or not. + * + * If uIP should use a fixed IP address, the settings are set in the + * uipopt.h file. If not, the macros uip_sethostaddr(), + * uip_setdraddr() and uip_setnetmask() should be used instead. + * + * \hideinitializer + */ +#define UIP_FIXEDADDR 0 + +/** + * Ping IP address asignment. + * + * uIP uses a "ping" packets for setting its own IP address if this + * option is set. If so, uIP will start with an empty IP address and + * the destination IP address of the first incoming "ping" (ICMP echo) + * packet will be used for setting the hosts IP address. + * + * \note This works only if UIP_FIXEDADDR is 0. + * + * \hideinitializer + */ +#ifdef UIP_CONF_PINGADDRCONF +#define UIP_PINGADDRCONF UIP_CONF_PINGADDRCONF +#else /* UIP_CONF_PINGADDRCONF */ +#define UIP_PINGADDRCONF 0 +#endif /* UIP_CONF_PINGADDRCONF */ + + +/** + * Specifies if the uIP ARP module should be compiled with a fixed + * Ethernet MAC address or not. + * + * If this configuration option is 0, the macro uip_setethaddr() can + * be used to specify the Ethernet address at run-time. + * + * \hideinitializer + */ +#define UIP_FIXEDETHADDR 0 + +/** @} */ +/*------------------------------------------------------------------------------*/ +/** + * \name IP configuration options + * @{ + * + */ +/** + * The IP TTL (time to live) of IP packets sent by uIP. + * + * This should normally not be changed. + */ +#define UIP_TTL 64 + +/** + * Turn on support for IP packet reassembly. + * + * uIP supports reassembly of fragmented IP packets. This features + * requires an additonal amount of RAM to hold the reassembly buffer + * and the reassembly code size is approximately 700 bytes. The + * reassembly buffer is of the same size as the uip_buf buffer + * (configured by UIP_BUFSIZE). + * + * \note IP packet reassembly is not heavily tested. + * + * \hideinitializer + */ +#define UIP_REASSEMBLY 0 + +/** + * The maximum time an IP fragment should wait in the reassembly + * buffer before it is dropped. + * + */ +#define UIP_REASS_MAXAGE 40 + +/** @} */ + +/*------------------------------------------------------------------------------*/ +/** + * \name UDP configuration options + * @{ + */ + +/** + * Toggles wether UDP support should be compiled in or not. + * + * \hideinitializer + */ +#ifdef UIP_CONF_UDP +#define UIP_UDP UIP_CONF_UDP +#else /* UIP_CONF_UDP */ +#define UIP_UDP 0 +#endif /* UIP_CONF_UDP */ + +/** + * Toggles if UDP checksums should be used or not. + * + * \note Support for UDP checksums is currently not included in uIP, + * so this option has no function. + * + * \hideinitializer + */ +#ifdef UIP_CONF_UDP_CHECKSUMS +#define UIP_UDP_CHECKSUMS UIP_CONF_UDP_CHECKSUMS +#else +#define UIP_UDP_CHECKSUMS 0 +#endif + +/** + * The maximum amount of concurrent UDP connections. + * + * \hideinitializer + */ +#ifdef UIP_CONF_UDP_CONNS +#define UIP_UDP_CONNS UIP_CONF_UDP_CONNS +#else /* UIP_CONF_UDP_CONNS */ +#define UIP_UDP_CONNS 10 +#endif /* UIP_CONF_UDP_CONNS */ + +/** + * The name of the function that should be called when UDP datagrams arrive. + * + * \hideinitializer + */ + + +/** @} */ +/*------------------------------------------------------------------------------*/ +/** + * \name TCP configuration options + * @{ + */ + +/** + * Toggles whether TCP support should be compiled in or not. + * + * \hideinitializer + */ +#ifdef UIP_CONF_TCP +#define UIP_TCP UIP_CONF_TCP +#else /* UIP_CONF_TCP */ +#define UIP_TCP 1 +#endif /* UIP_CONF_TCP */ + +/** + * Determines if support for opening connections from uIP should be + * compiled in. + * + * If the applications that are running on top of uIP for this project + * do not need to open outgoing TCP connections, this configration + * option can be turned off to reduce the code size of uIP. + * + * \hideinitializer + */ +#define UIP_ACTIVE_OPEN 1 + +/** + * The maximum number of simultaneously open TCP connections. + * + * Since the TCP connections are statically allocated, turning this + * configuration knob down results in less RAM used. Each TCP + * connection requires approximatly 30 bytes of memory. + * + * \hideinitializer + */ +#ifndef UIP_CONF_MAX_CONNECTIONS +#define UIP_CONNS 10 +#else /* UIP_CONF_MAX_CONNECTIONS */ +#define UIP_CONNS UIP_CONF_MAX_CONNECTIONS +#endif /* UIP_CONF_MAX_CONNECTIONS */ + + +/** + * The maximum number of simultaneously listening TCP ports. + * + * Each listening TCP port requires 2 bytes of memory. + * + * \hideinitializer + */ +#ifndef UIP_CONF_MAX_LISTENPORTS +#define UIP_LISTENPORTS 20 +#else /* UIP_CONF_MAX_LISTENPORTS */ +#define UIP_LISTENPORTS UIP_CONF_MAX_LISTENPORTS +#endif /* UIP_CONF_MAX_LISTENPORTS */ + +/** + * Determines if support for TCP urgent data notification should be + * compiled in. + * + * Urgent data (out-of-band data) is a rarely used TCP feature that + * very seldom would be required. + * + * \hideinitializer + */ +#define UIP_URGDATA 0 + +/** + * The initial retransmission timeout counted in timer pulses. + * + * This should not be changed. + */ +#define UIP_RTO 3 + +/** + * The maximum number of times a segment should be retransmitted + * before the connection should be aborted. + * + * This should not be changed. + */ +#define UIP_MAXRTX 8 + +/** + * The maximum number of times a SYN segment should be retransmitted + * before a connection request should be deemed to have been + * unsuccessful. + * + * This should not need to be changed. + */ +#define UIP_MAXSYNRTX 5 + +/** + * The TCP maximum segment size. + * + * This is should not be to set to more than + * UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN. + */ +#define UIP_TCP_MSS (UIP_BUFSIZE - UIP_LLH_LEN - UIP_TCPIP_HLEN) + +/** + * The size of the advertised receiver's window. + * + * Should be set low (i.e., to the size of the uip_buf buffer) is the + * application is slow to process incoming data, or high (32768 bytes) + * if the application processes data quickly. + * + * \hideinitializer + */ +#ifndef UIP_CONF_RECEIVE_WINDOW +#define UIP_RECEIVE_WINDOW UIP_TCP_MSS +#else +#define UIP_RECEIVE_WINDOW UIP_CONF_RECEIVE_WINDOW +#endif + +/** + * How long a connection should stay in the TIME_WAIT state. + * + * This configiration option has no real implication, and it should be + * left untouched. + */ +#define UIP_TIME_WAIT_TIMEOUT 120 + + +/** @} */ +/*------------------------------------------------------------------------------*/ +/** + * \name ARP configuration options + * @{ + */ + +/** + * The size of the ARP table. + * + * This option should be set to a larger value if this uIP node will + * have many connections from the local network. + * + * \hideinitializer + */ +#ifdef UIP_CONF_ARPTAB_SIZE +#define UIP_ARPTAB_SIZE UIP_CONF_ARPTAB_SIZE +#else +#define UIP_ARPTAB_SIZE 8 +#endif + +/** + * The maxium age of ARP table entries measured in 10ths of seconds. + * + * An UIP_ARP_MAXAGE of 120 corresponds to 20 minutes (BSD + * default). + */ +#define UIP_ARP_MAXAGE 120 + +/** @} */ + +/*------------------------------------------------------------------------------*/ + +/** + * \name General configuration options + * @{ + */ + +/** + * The size of the uIP packet buffer. + * + * The uIP packet buffer should not be smaller than 60 bytes, and does + * not need to be larger than 1500 bytes. Lower size results in lower + * TCP throughput, larger size results in higher TCP throughput. + * + * \hideinitializer + */ +#ifndef UIP_CONF_BUFFER_SIZE +#define UIP_BUFSIZE 400 +#else /* UIP_CONF_BUFFER_SIZE */ +#define UIP_BUFSIZE UIP_CONF_BUFFER_SIZE +#endif /* UIP_CONF_BUFFER_SIZE */ + + +/** + * Determines if statistics support should be compiled in. + * + * The statistics is useful for debugging and to show the user. + * + * \hideinitializer + */ +#ifndef UIP_CONF_STATISTICS +#define UIP_STATISTICS 0 +#else /* UIP_CONF_STATISTICS */ +#define UIP_STATISTICS UIP_CONF_STATISTICS +#endif /* UIP_CONF_STATISTICS */ + +/** + * Determines if logging of certain events should be compiled in. + * + * This is useful mostly for debugging. The function uip_log() + * must be implemented to suit the architecture of the project, if + * logging is turned on. + * + * \hideinitializer + */ +#ifndef UIP_CONF_LOGGING +#define UIP_LOGGING 0 +#else /* UIP_CONF_LOGGING */ +#define UIP_LOGGING UIP_CONF_LOGGING +#endif /* UIP_CONF_LOGGING */ + +/** + * Broadcast support. + * + * This flag configures IP broadcast support. This is useful only + * together with UDP. + * + * \hideinitializer + * + */ +#ifndef UIP_CONF_BROADCAST +#define UIP_BROADCAST 0 +#else /* UIP_CONF_BROADCAST */ +#define UIP_BROADCAST UIP_CONF_BROADCAST +#endif /* UIP_CONF_BROADCAST */ + +/** + * Print out a uIP log message. + * + * This function must be implemented by the module that uses uIP, and + * is called by uIP whenever a log message is generated. + */ +void uip_log(char *msg); + +/** + * The link level header length. + * + * This is the offset into the uip_buf where the IP header can be + * found. For Ethernet, this should be set to 14. For SLIP, this + * should be set to 0. + * + * \hideinitializer + */ +#ifdef UIP_CONF_LLH_LEN +#define UIP_LLH_LEN UIP_CONF_LLH_LEN +#else /* UIP_CONF_LLH_LEN */ +#define UIP_LLH_LEN 14 +#endif /* UIP_CONF_LLH_LEN */ + +/** @} */ +/*------------------------------------------------------------------------------*/ +/** + * \name CPU architecture configuration + * @{ + * + * The CPU architecture configuration is where the endianess of the + * CPU on which uIP is to be run is specified. Most CPUs today are + * little endian, and the most notable exception are the Motorolas + * which are big endian. The BYTE_ORDER macro should be changed to + * reflect the CPU architecture on which uIP is to be run. + */ + +/** + * The byte order of the CPU architecture on which uIP is to be run. + * + * This option can be either BIG_ENDIAN (Motorola byte order) or + * LITTLE_ENDIAN (Intel byte order). + * + * \hideinitializer + */ +#ifdef UIP_CONF_BYTE_ORDER +#define UIP_BYTE_ORDER UIP_CONF_BYTE_ORDER +#else /* UIP_CONF_BYTE_ORDER */ +#define UIP_BYTE_ORDER UIP_LITTLE_ENDIAN +#endif /* UIP_CONF_BYTE_ORDER */ + +/** @} */ +/*------------------------------------------------------------------------------*/ + +/** + * \name Appication specific configurations + * @{ + * + * An uIP application is implemented using a single application + * function that is called by uIP whenever a TCP/IP event occurs. The + * name of this function must be registered with uIP at compile time + * using the UIP_APPCALL definition. + * + * uIP applications can store the application state within the + * uip_conn structure by specifying the type of the application + * structure by typedef:ing the type uip_tcp_appstate_t and uip_udp_appstate_t. + * + * The file containing the definitions must be included in the + * uipopt.h file. + * + * The following example illustrates how this can look. + \code + +void httpd_appcall(void); +#define UIP_APPCALL httpd_appcall + +struct httpd_state { + u8_t state; + u16_t count; + char *dataptr; + char *script; +}; +typedef struct httpd_state uip_tcp_appstate_t + \endcode + */ + +/** + * \var #define UIP_APPCALL + * + * The name of the application function that uIP should call in + * response to TCP/IP events. + * + */ + +/** + * \var typedef uip_tcp_appstate_t + * + * The type of the application state that is to be stored in the + * uip_conn structure. This usually is typedef:ed to a struct holding + * application state information. + */ + +/** + * \var typedef uip_udp_appstate_t + * + * The type of the application state that is to be stored in the + * uip_conn structure. This usually is typedef:ed to a struct holding + * application state information. + */ +/** @} */ +/** @} */ + +#endif /* __UIPOPT_H__ */ diff --git a/third_party/uip-1.0/unix/Makefile b/third_party/uip-1.0/unix/Makefile new file mode 100644 index 0000000..67d3c52 --- /dev/null +++ b/third_party/uip-1.0/unix/Makefile @@ -0,0 +1,44 @@ +# Copyright (c) 2001, Adam Dunkels. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. The name of the author may not be used to endorse or promote +# products derived from this software without specific prior +# written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS +# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +# GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# This file is part of the uIP TCP/IP stack. +# +# $Id: Makefile,v 1.13 2006/06/11 21:55:03 adam Exp $ +# + +all: uip + +CC = gcc +AR = ar +APPS = webserver +CFLAGS = -Wall -g -I../uip -I. -fpack-struct -Os +-include ../uip/Makefile.include + +uip: $(addprefix $(OBJECTDIR)/, main.o tapdev.o clock-arch.o) apps.a uip.a + +clean: + rm -fr *.o *~ *core uip $(OBJECTDIR) *.a diff --git a/third_party/uip-1.0/unix/clock-arch.c b/third_party/uip-1.0/unix/clock-arch.c new file mode 100644 index 0000000..f19d1cb --- /dev/null +++ b/third_party/uip-1.0/unix/clock-arch.c @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.c,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * Implementation of architecture-specific clock functionality + * \author + * Adam Dunkels + */ + +#include "clock-arch.h" +#include + +/*---------------------------------------------------------------------------*/ +clock_time_t +clock_time(void) +{ + struct timeval tv; + struct timezone tz; + + gettimeofday(&tv, &tz); + + return tv.tv_sec * 1000 + tv.tv_usec / 1000; +} +/*---------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/unix/clock-arch.h b/third_party/uip-1.0/unix/clock-arch.h new file mode 100644 index 0000000..aa97f0e --- /dev/null +++ b/third_party/uip-1.0/unix/clock-arch.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +typedef int clock_time_t; +#define CLOCK_CONF_SECOND 1000 + +#endif /* __CLOCK_ARCH_H__ */ diff --git a/third_party/uip-1.0/unix/main.c b/third_party/uip-1.0/unix/main.c new file mode 100644 index 0000000..ae1bcdf --- /dev/null +++ b/third_party/uip-1.0/unix/main.c @@ -0,0 +1,218 @@ +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Adam Dunkels. + * 4. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: main.c,v 1.16 2006/06/11 21:55:03 adam Exp $ + * + */ + + +#include "uip.h" +#include "uip_arp.h" +#include "tapdev.h" + +#include "timer.h" + +#define BUF ((struct uip_eth_hdr *)&uip_buf[0]) + +#ifndef NULL +#define NULL (void *)0 +#endif /* NULL */ + +/*---------------------------------------------------------------------------*/ +int +main(void) +{ + int i; + uip_ipaddr_t ipaddr; + struct timer periodic_timer, arp_timer; + + timer_set(&periodic_timer, CLOCK_SECOND / 2); + timer_set(&arp_timer, CLOCK_SECOND * 10); + + tapdev_init(); + uip_init(); + + uip_ipaddr(ipaddr, 192,168,0,2); + uip_sethostaddr(ipaddr); + uip_ipaddr(ipaddr, 192,168,0,1); + uip_setdraddr(ipaddr); + uip_ipaddr(ipaddr, 255,255,255,0); + uip_setnetmask(ipaddr); + + httpd_init(); + + /* telnetd_init();*/ + + /* hello_world_init();*/ + + /* { + u8_t mac[6] = {1,2,3,4,5,6}; + dhcpc_init(&mac, 6); + }*/ + + /*uip_ipaddr(ipaddr, 127,0,0,1); + smtp_configure("localhost", ipaddr); + SMTP_SEND("adam@sics.se", NULL, "uip-testing@example.com", + "Testing SMTP from uIP", + "Test message sent by uIP\r\n");*/ + + /* + webclient_init(); + resolv_init(); + uip_ipaddr(ipaddr, 195,54,122,204); + resolv_conf(ipaddr); + resolv_query("www.sics.se");*/ + + + + while(1) { + uip_len = tapdev_read(); + if(uip_len > 0) { + if(BUF->type == htons(UIP_ETHTYPE_IP)) { + uip_arp_ipin(); + uip_input(); + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if(uip_len > 0) { + uip_arp_out(); + tapdev_send(); + } + } else if(BUF->type == htons(UIP_ETHTYPE_ARP)) { + uip_arp_arpin(); + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if(uip_len > 0) { + tapdev_send(); + } + } + + } else if(timer_expired(&periodic_timer)) { + timer_reset(&periodic_timer); + for(i = 0; i < UIP_CONNS; i++) { + uip_periodic(i); + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if(uip_len > 0) { + uip_arp_out(); + tapdev_send(); + } + } + +#if UIP_UDP + for(i = 0; i < UIP_UDP_CONNS; i++) { + uip_udp_periodic(i); + /* If the above function invocation resulted in data that + should be sent out on the network, the global variable + uip_len is set to a value > 0. */ + if(uip_len > 0) { + uip_arp_out(); + tapdev_send(); + } + } +#endif /* UIP_UDP */ + + /* Call the ARP timer function every 10 seconds. */ + if(timer_expired(&arp_timer)) { + timer_reset(&arp_timer); + uip_arp_timer(); + } + } + } + return 0; +} +/*---------------------------------------------------------------------------*/ +void +uip_log(char *m) +{ + printf("uIP log message: %s\n", m); +} +void +resolv_found(char *name, u16_t *ipaddr) +{ + u16_t *ipaddr2; + + if(ipaddr == NULL) { + printf("Host '%s' not found.\n", name); + } else { + printf("Found name '%s' = %d.%d.%d.%d\n", name, + htons(ipaddr[0]) >> 8, + htons(ipaddr[0]) & 0xff, + htons(ipaddr[1]) >> 8, + htons(ipaddr[1]) & 0xff); + /* webclient_get("www.sics.se", 80, "/~adam/uip");*/ + } +} +#ifdef __DHCPC_H__ +void +dhcpc_configured(const struct dhcpc_state *s) +{ + uip_sethostaddr(s->ipaddr); + uip_setnetmask(s->netmask); + uip_setdraddr(s->default_router); + resolv_conf(s->dnsaddr); +} +#endif /* __DHCPC_H__ */ +void +smtp_done(unsigned char code) +{ + printf("SMTP done with code %d\n", code); +} +void +webclient_closed(void) +{ + printf("Webclient: connection closed\n"); +} +void +webclient_aborted(void) +{ + printf("Webclient: connection aborted\n"); +} +void +webclient_timedout(void) +{ + printf("Webclient: connection timed out\n"); +} +void +webclient_connected(void) +{ + printf("Webclient: connected, waiting for data...\n"); +} +void +webclient_datahandler(char *data, u16_t len) +{ + printf("Webclient: got %d bytes of data.\n", len); +} +/*---------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/unix/tapdev.c b/third_party/uip-1.0/unix/tapdev.c new file mode 100644 index 0000000..80c78c4 --- /dev/null +++ b/third_party/uip-1.0/unix/tapdev.c @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Author: Adam Dunkels + * + * $Id: tapdev.c,v 1.8 2006/06/07 08:39:58 adam Exp $ + */ + +#define UIP_DRIPADDR0 192 +#define UIP_DRIPADDR1 168 +#define UIP_DRIPADDR2 0 +#define UIP_DRIPADDR3 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef linux +#include +#include +#include +#define DEVTAP "/dev/net/tun" +#else /* linux */ +#define DEVTAP "/dev/tap0" +#endif /* linux */ + +#include "uip.h" + +static int drop = 0; +static int fd; + + +/*---------------------------------------------------------------------------*/ +void +tapdev_init(void) +{ + char buf[1024]; + + fd = open(DEVTAP, O_RDWR); + if(fd == -1) { + perror("tapdev: tapdev_init: open"); + exit(1); + } + +#ifdef linux + { + struct ifreq ifr; + memset(&ifr, 0, sizeof(ifr)); + ifr.ifr_flags = IFF_TAP|IFF_NO_PI; + if (ioctl(fd, TUNSETIFF, (void *) &ifr) < 0) { + perror(buf); + exit(1); + } + } +#endif /* Linux */ + + snprintf(buf, sizeof(buf), "ifconfig tap0 inet %d.%d.%d.%d", + UIP_DRIPADDR0, UIP_DRIPADDR1, UIP_DRIPADDR2, UIP_DRIPADDR3); + system(buf); + +} +/*---------------------------------------------------------------------------*/ +unsigned int +tapdev_read(void) +{ + fd_set fdset; + struct timeval tv, now; + int ret; + + tv.tv_sec = 0; + tv.tv_usec = 1000; + + + FD_ZERO(&fdset); + FD_SET(fd, &fdset); + + ret = select(fd + 1, &fdset, NULL, NULL, &tv); + if(ret == 0) { + return 0; + } + ret = read(fd, uip_buf, UIP_BUFSIZE); + if(ret == -1) { + perror("tap_dev: tapdev_read: read"); + } + + /* printf("--- tap_dev: tapdev_read: read %d bytes\n", ret);*/ + /* { + int i; + for(i = 0; i < 20; i++) { + printf("%x ", uip_buf[i]); + } + printf("\n"); + }*/ + /* check_checksum(uip_buf, ret);*/ + return ret; +} +/*---------------------------------------------------------------------------*/ +void +tapdev_send(void) +{ + int ret; + /* printf("tapdev_send: sending %d bytes\n", size);*/ + /* check_checksum(uip_buf, size);*/ + + /* drop++; + if(drop % 8 == 7) { + printf("Dropped a packet!\n"); + return; + }*/ + ret = write(fd, uip_buf, uip_len); + if(ret == -1) { + perror("tap_dev: tapdev_send: writev"); + exit(1); + } +} +/*---------------------------------------------------------------------------*/ diff --git a/third_party/uip-1.0/unix/tapdev.h b/third_party/uip-1.0/unix/tapdev.h new file mode 100644 index 0000000..27aa2f1 --- /dev/null +++ b/third_party/uip-1.0/unix/tapdev.h @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Adam Dunkels. + * 4. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: tapdev.h,v 1.1 2002/01/10 06:22:56 adam Exp $ + * + */ + +#ifndef __TAPDEV_H__ +#define __TAPDEV_H__ + +void tapdev_init(void); +unsigned int tapdev_read(void); +void tapdev_send(void); + +#endif /* __TAPDEV_H__ */ diff --git a/third_party/uip-1.0/unix/uip-conf.h b/third_party/uip-1.0/unix/uip-conf.h new file mode 100644 index 0000000..95725ba --- /dev/null +++ b/third_party/uip-1.0/unix/uip-conf.h @@ -0,0 +1,157 @@ +/** + * \addtogroup uipopt + * @{ + */ + +/** + * \name Project-specific configuration options + * @{ + * + * uIP has a number of configuration options that can be overridden + * for each project. These are kept in a project-specific uip-conf.h + * file and all configuration names have the prefix UIP_CONF. + */ + +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * An example uIP configuration file + * \author + * Adam Dunkels + */ + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + +#include + +/** + * 8 bit datatype + * + * This typedef defines the 8-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint8_t u8_t; + +/** + * 16 bit datatype + * + * This typedef defines the 16-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef uint16_t u16_t; + +/** + * Statistics datatype + * + * This typedef defines the dataype used for keeping statistics in + * uIP. + * + * \hideinitializer + */ +typedef unsigned short uip_stats_t; + +/** + * Maximum number of TCP connections. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_CONNECTIONS 40 + +/** + * Maximum number of listening TCP ports. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_LISTENPORTS 40 + +/** + * uIP buffer size. + * + * \hideinitializer + */ +#define UIP_CONF_BUFFER_SIZE 420 + +/** + * CPU byte order. + * + * \hideinitializer + */ +#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN + +/** + * Logging on or off + * + * \hideinitializer + */ +#define UIP_CONF_LOGGING 1 + +/** + * UDP support on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP 0 + +/** + * UDP checksums on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP_CHECKSUMS 1 + +/** + * uIP statistics on or off + * + * \hideinitializer + */ +#define UIP_CONF_STATISTICS 1 + +/* Here we include the header file for the application(s) we use in + our project. */ +/*#include "smtp.h"*/ +/*#include "hello-world.h"*/ +/*#include "telnetd.h"*/ +#include "webserver.h" +/*#include "dhcpc.h"*/ +/*#include "resolv.h"*/ +/*#include "webclient.h"*/ + +#endif /* __UIP_CONF_H__ */ + +/** @} */ +/** @} */ diff --git a/third_party/windows/fltk-1.1.10/ANNOUNCEMENT b/third_party/windows/fltk-1.1.10/ANNOUNCEMENT new file mode 100644 index 0000000..8fb0160 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/ANNOUNCEMENT @@ -0,0 +1,83 @@ +The FLTK Team is proud to announce the release of FLTK 1.1.10, +a cross-platform C++ GUI toolkit for UNIX(r)/Linux(r) (X11), +Microsoft(r) Windows(r), and MacOS(r) X. FLTK provides +modern GUI functionality without the bloat and supports 3D +graphics via OpenGL(r) and its built-in GLUT emulation. + +FLTK 1.1.10 fixes some bugs and updates the bundled png image +library. + +This is the final release of the FLTK 1.1.x development tree. + +FLTK is provided under the GNU Library Public License with +exceptions that allow for static linking. + +Changes since FLTK 1.1.9 include: + + - Updated the bundled libpng to v1.2.35 (released 18 Feb. 2009) + - Added Fl_Scroll::bbox() documentation (STR #1893) + - Fixed static linking of image libraries (STR #1962) + - Fixed callback would not be called when shortcut was used with + radio and toggle buttons in default FL_RELEASE mode. + - Fixed a problem with TrackMouseEvent() (Windows only) that would + generate wrong FL_LEAVE events with subwindows. TrackMouseEvent + is now enabled by default (it was disabled for GNU compilers). + It can be disabled by defining NO_TRACK_MOUSE. + Improved test/subwindow.cxx (STR #2079) + - Fixed RGB colors for round box (STR #2097) + - Fixed documentation (added missing COMCTRL32.LIB dependency) + - Fl_Group::clip_children() is now public (STR #2017) + - Fixed first modifier key event (STR #1952) + - Fixed wrong default value of Fl_Spinner in Fluid (STR #1991) + - Fixed Fluid textcolor output (STR #1992) + - Added clarification to Fl_GL_Window mode function (STR #1945) + - Fl_Group and Fl_Scroll now resize themselves before + resizing their children (STR #2032) + - Fixed adding an idle handler during a draw() call (STR #1950) + - Improved stability of fl_read_image (STR #2021) + - Fixed menu position close to screen border (STR #2057) + +----HTML---- + +

The FLTK Team is proud to announce the release of FLTK 1.1.10, +a cross-platform C++ GUI toolkit for UNIX(r)/Linux(r) (X11), +Microsoft(r) Windows(r), and MacOS(r) X. FLTK provides +modern GUI functionality without the bloat and supports 3D +graphics via OpenGL(r) and its built-in GLUT emulation.

+ +

FLTK 1.1.10 fixes some bugs and updates the bundled png image +library.

+ +

This is the final release of the FLTK 1.1.x development tree.

+ +

FLTK is provided under the GNU Library Public License with +exceptions that allow for static linking.

+ +

Changes since FLTK 1.1.9 include:

+ +
    + +
  • Updated the bundled libpng to v1.2.35 (released 18 Feb. 2009) +
  • Added Fl_Scroll::bbox() documentation (STR #1893) +
  • Fixed static linking of image libraries (STR #1962) +
  • Fixed callback would not be called when shortcut was used with + radio and toggle buttons in default FL_RELEASE mode. +
  • Fixed a problem with TrackMouseEvent() (Windows only) that would + generate wrong FL_LEAVE events with subwindows. TrackMouseEvent + is now enabled by default (it was disabled for GNU compilers). + It can be disabled by defining NO_TRACK_MOUSE. + Improved test/subwindow.cxx (STR #2079) +
  • Fixed RGB colors for round box (STR #2097) +
  • Fixed documentation (added missing COMCTRL32.LIB dependency) +
  • Fl_Group::clip_children() is now public (STR #2017) +
  • Fixed first modifier key event (STR #1952) +
  • Fixed wrong default value of Fl_Spinner in Fluid (STR #1991) +
  • Fixed Fluid textcolor output (STR #1992) +
  • Added clarification to Fl_GL_Window mode function (STR #1945) +
  • Fl_Group and Fl_Scroll now resize themselves before + resizing their children (STR #2032) +
  • Fixed adding an idle handler during a draw() call (STR #1950) +
  • Improved stability of fl_read_image (STR #2021) +
  • Fixed menu position close to screen border (STR #2057) + +
diff --git a/third_party/windows/fltk-1.1.10/CHANGES b/third_party/windows/fltk-1.1.10/CHANGES new file mode 100644 index 0000000..80b7548 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/CHANGES @@ -0,0 +1,3454 @@ +CHANGES IN FLTK 1.1.10 + + - Widgets now remove stale entries from the default callback + queue when they are deleted (STR #2302) + - Fixed selection bug in Fl_Int_Input (STR #2292) + - Fixed character set conversion functions (STR #2268) + - Fixed image lib configure and fltk-config issues by backporting + the image lib and zlib configure code from FLTK 1.3 (STR #2203) + - Updated the bundled libpng to v1.2.40 (released Sep. 10, 2009) + - Fixed Fl_Choice contrast with light-on-dark settings (STR #2219) + - Added Xft2 font lookup table (STR #2215) + - Fixed X server "lock", if a modal dialog window is opened + while a menu is active (STR #1986) + - Updated mirror sites in documentation (STR #2220) + - Setting a default font for Xft (STR #2216) + - Temporarily limited builds to 32-bit on OX S to stay + compatible to Snow Leopard + - Fixed Windows compile bug with "#define USE_COLORMAP 0" + (STR #2241) + - Fixed glibc 2.10 compiler problems (Fedora 11 and others) + with scandir() and strchr() (STR #2222) + - Fixed OpenGL shared context handling (STR #2135) + - Fixed gray-scale images with alpha channel (STR #2105) + - Fixed unexpected shortcut behavior for Win32 (STR #2199) + - Added cast to Fl_Color in all Fluid code (STR #2206) + - Fixed wrong identifier for special keys combined with + modifier (STR #2196) + - Fixed documentation for Fl_Progress (STR #2209) + - Fix for multiple popups, when dragging and calling fl_alert() + and friends from the callback (STR #2159) + - Avoiding crashes for recursive common dialogs (this does not + fix the issue at hand yet) (STR 2150) + - Fluid printing used wrong colors under Windows (STR #2195) + - Fixed bad system menu hadling in OS X (STR #2153) + - Fixed File Input mouse pointer dragging (STR #2181) + - Added Fl_Scroll::bbox() documentation (STR #1893) + - Fixed static linking of image libraries (STR #1962) + - Fixed callback would not be called when shortcut was used with + radio and toggle buttons in default FL_RELEASE mode. + - Fixed a problem with TrackMouseEvent() (Windows only) that would + generate wrong FL_LEAVE events with subwindows. TrackMouseEvent + is now enabled by default (it was disabled for GNU compilers). + It can be disabled by defining NO_TRACK_MOUSE. + Improved test/subwindow.cxx (STR #2079) + - Fixed RGB colors for round box (STR #2097) + - Fixed documentation (added missing COMCTRL32.LIB dependency) + - Fl_Group::clip_children() is now public (STR #2017) + - Fixed first modifier key event (STR #1952) + - Fixed wrong default value of Fl_Spinner in Fluid (STR #1991) + - Fixed Fluid textcolor output (STR #1992) + - Added clarification to Fl_GL_Window mode function (STR #1945) + - Fl_Group and Fl_Scroll now resize themselves before + resizing their children (STR #2032) + - Fixed adding an idle handler during a draw() call (STR #1950) + - Improved stability of fl_read_image (STR #2021) + - Fixed menu position close to screen border (STR #2057) + +CHANGES IN FLTK 1.1.9 + + - Improved color contrast in secondary selection blocks + of Fl_Text_Display (STR #1917) + - Fixed regression in callback handling (STR #1918) + - Fixed wrong relative path when absolute path has a + trailing slash in fl_filename_relative (STR #1920) + - Fixed multiple selction of files and directories in + Fl_File_Chooser (STR #1913) + - Fixed MSWindows crash when selecting umlauts + in Fl_Help_View (STR #1912) + +CHANGES IN FLTK 1.1.8 + + - Documentation fixes (STR #1454, STR #1455, STR #1456, + STR #1457, STR #1458, STR #1460, STR #1481, STR #1578, + STR #1639, STR #1645, STR #1644, STR #1792, STR #1793, + STR #1742, STR #1777, STR #1794, STR #1827, STR #1843, + STR #1796, STR #1815, STR #1726, STR #1753, STR #1855, + STR #1862, STR #1867, STR #1874, STR #1888) + - Fixed library path in Makefile (STR #1885) + - Fixed image read for partial regions on X11 + (STR #1716) + - Fixed KDE/Gnome icon paths (STR #1795) + - Fixed Tab key to wrap around menu bars (STR #1877) + - Fixed possible timer leak in Scrollbar (STR #1880) + - Added documentation about the potential limitations + of Fl::grab on newer operating systems (STR #1747) + - Fixed lockout when mixing popups and alerts + (STR # 1869) + - Fixed recursion crash in event handling (STR #1873) + - Fixed missing return code in 'fltk-config' (STR #1875) + - Fixed inconsistencies with CHANGED flags (STR #1719) + - Fixed message sent to hidden widgets (STR #1849) + - Fixed width calculation in Fl_Help_View (STR #1868) + - Fixed offset bug in OS X pixmap code (STR #1856) + - Fixed potential buffer overrun + in Fl_Preferences (STR #1853) + - Fixed method attributes in consecutive class + declarations in FLUID (STR #1741) + - FLUID checks for seperately declared callbacks to + avoid a bogus "extern" declaration (STR #1776) + - Added "protected" class memebrs in FLUID + - Double-clicking a widget in a FLUID layout will show + the item in the widget browser + - Fixed color highlighting in Text_Display + - Fixed 16 bit PNM image support (STR #1847) + - Fixed exposure event on zero size windows (STR #1824) + - Fixed overlay offset for OS X Quartz (STR #1729) + - gl_font() support for Xft+X11 (STR #1809) + - Fl_Gl_Window::mode() needed to hide and show the window + when toggling stereo mode (STR #1846) + - Fl_Gl_Window::show() did not work reliably on Mac OS X + (STR #1707) + - Added Fl_Group::clip_children() methods to support + automatic clipping of child widget drawing (STR #1844) + - Fl_Browser_ and friends now support FL_WHEN_ENTER_KEY + for both Enter/Return and double-clicks (STR #1818) + - Fl_Help_View did not release the images it used (STR + #1817) + - Shared libraries would not build on 64-bit Linux + systems with an existing non-PIC FLTK installation + (STR #1791) + - Fl_Browser::hide() and Fl_Browser::show() did not + correctly update the scrollbar (STR #1724) + - The configure script now shows a summry of the + configuration results (STR #1810) + - "fltk-config --use-* --libs" did not list all of the + dependent libraries (STR #1799) + - Hiding a nested window on WIN32 caused 100% CPU (STR #1748) + - Changing the window size in FLUID would not mark the + project as modified (STR #1751) + - Fixed fl_filename_isdir for "/"-path (STR #1761) + - Fixed Fl_Chart drawing (STR #1756) + - Fixed mapping of subwindows with unmapped parent + windows (STR #1706) + - Fixed rendering of grayscale images with alpha + channel (STR #1703) + - Fixed occasional incomplete refresh (STR #1681) + - Improved fl_down, fl_frame, added fl_box (STR #1678) + - Fixed selection of submenu items in + input_choice (STR #1676) + - Fixed calculation of stride for image scaling and + color manipulation (STR #1673) + - Made -O3 the default optimization on Cygwin/Mingw since + -Os currently creates bad code (STR #1656) + - OSF/Tru64 now uses 'install-sh' instead of 'install' to + accomodate for a missing '-d' option (STR #1632) + - New option in Fluid project settings to translate all + shortcut modifiers from FL_META or FL_CTRL to FL_COMMAND + - Made icon size fixed (50x50) in fl_message etc. (STR #1626) + - Fixed selection of first word in Fl_Help_View + - Fixed endless loop in Fl_Text_Display (STR #1655) + - Allowing shortcuts in Tabs (STR #1652) + - Fixed Makefile "make clean" (STR #1642, + STR #1643, STR #1641) + - The sample RPM spec file now enables large file support + and threading support (STR #1603) + - Changed minimum contrast between background and text to + 99 and added more weight to the blue component to improve + readability for certain color combinations (STR #1625) + - Fixed VCNet OpenGL project file (STR #1617) + - Fixed scrolling of clipped areas in MSWindows (STR + #1601) + - Fixed clipping in OS X Quartz offscreen buffers (STR + #1595) + - Now flush file chooser preferences after every change to + avoid data loss (STR #1609) + - The Fl_File_Chooser constructor now saves and restores the + current group (STR #1611) + - Added Fl::awake(fn*,void*) to set a handler for thread + messages (STR #1536) + - Added "mute sound" option to Sudoku game. + - Updated the bundled zlib to v1.2.3. + - Updated the bundled libpng to v1.2.16. + - "make install" now uses the install command (or the + included install-sh script) to copy files to the + install directories, to ensure that permissions are + correct. + - Fixed DLL generation via MingW/Cygwin (STR #1546) + - FLUID incorrectly opened the display when generating + source code for Fl_Help_View widgets (STR #1318) + - Fl_Double_Window did not always show the scheme + background image. + - Fixed first window behavior in OS X (STR #1548) + - Fixed calculation of character widths for OS X + Quartz rendering (no STR) + - Fixed OS X mouse click handling (STR #1504) + - Added missing GLUT functions so that FLTK can be used + as a fairly complete C++ replacement for the original + GLUT library (STR #1522) + - Fl::awake() could block on X11 and OSX (STR #1537) + - Updated recursive mutex code to run on platforms other + than Linux and to do a run-time check to determine + whether they are supported by the kernel (STR #1575) + - WIN32 did check callbacks after the event processing instead of + before as documented (STR #1535) + - Fl_File_Chooser now hides the window before doing a callback + when the user clicks on the OK button (STR #1565) + - Fixed indentation of nested HTML elements (STR #1549) + - Made layout of Fl_Help_Dialog consistent with other + help windows and web browsers. + - Improved GTK+ schemed round box (STR #1531) + - Fluid avoids writing unsupported combinations of the + "when()" flags (STR #1501) + - Fl_Browser_ would allow keyboard callbacks even though + "when()" was set to "never" (STR #1501) + - Added automated little helpers to Sudoku + - Added example code for Wizard with the + Tabs demo (STR #1564) + - Optimized Fl_Tabs drawing for speed (STR #1520) + - OS X resource fork now obsolete (STR #1453) + - Added chapter 10 about multithreading (STR #1532, + 1533) + - OS X system menu bar top level attribute support + improved (STR #1505) + - Fixed Quartz image drawing bug (STR #1438) + - Fixed Quartz fl_read_image + - Overlay drawing is now avoiding XOR mode (STR #1438) + - Fixed Scroll crash in Fluid Live Mode (STR #1524) + - Fixed mousewheel event propagation (STR #1521) + - Fixed drawing issues of a tile in a scroll (STR #1507) + - Fixed dismissing buttons in menu bars (STR #1494) + - Making a child group visible in a Fl_Tabs or Fl_Wizard + group now shows that tab or pane. + - Added fl_open_uri() function as proposed on + fltk.development. + - Added Fl::has_check() which previously was prototyped + and documented, but not implemented (STR #1542) + - Enabled Fl::add_check() on OS X (STR #1534) + - Documented tooltip inheritance (STR #1467) + - Better event mouse handling fixing detached menus and + sticky tooltips (STR #1463, STR #449) + - Added Fl::scrollbar_size() methods that are used by all + of the scrollbar-using widgets (STR #1500) + - fl_read_image() was broken on Intel-based Macs (STR + #1490) + - Fl_Progress was using the wrong width to calculate + progress (STR #1492) + - Fl::x(), Fl::y(), Fl::w(), and Fl::h() did not report + the desktop work area on X11 (STR #1482) + - Shortcut events could be sent to the wrong window (STR + #1451) + - Fl_Spinner did not handle the arrow keys properly (STR + #1476) + - Fl_File_Browser did not calculate the width of + directory items correctly (STR #1469, STR #1470) + - Fl_Pack incorrectly started widgets at an offset of 1/2 + the spacing value. + - FLUID did not generate correct window class code if + the class name was not a standard FLTK window class. + - FLUID incorrectly included for + widget classes that were not subclassed from a standard + FLTK widget class. + - The demo master test program now supports scheme + selection and all demos use it (STR #1459) + - fl_arc() and fl_pie() did not draw properly on WIN32 + when the start and end points were identical (STR + #1461) + - Fl_Input and Fl_Text_Editor now hide the mouse pointer + when typing into them (STR #1466) + - Implemented alpha blending for Quartz, WIN32, and X11 + - Check buttons did not redraw properly with box() set to + FL_NO_BOX (STR #1440) + - Added the Bluecurve-inspired scheme "gtk+". + - Updated documentation (STR #1420, STR #1421) + - Fixed font caching issue (STR #1415) + - Fixed crash in fl_file_chooser (STR #1410) + - Fixed Fluid hotspot bug (STR #1416) + - Fixed image copy code (STR #1412) + - Fixed latin-to-roman text conversion (STR #1411) + - Fixed Cygwin timeout for "select" calls (STR #1151) + - Improved Mac OS X subwindow handling (STR #1402) + - Fixed more inconsistencies between fl_draw and + fl_measure (STR #1408) + - Fixed fl_measure which mistook a trailing '@@' for a + symbol (STR #1406) + - Fixed GLUT behavior on window creation (STR #1403) + - Fixed OS X bug that would hide tooltips before they + were shown (STR #1392) + - Fixed Fl_Tabs tooltip reappearing (STR #1324) + - Added a new demo game called "Block Attack!" + - Updated the Sudoku game to show a notice about Hard and + Impossible puzzles having multiple solutions which are + not a bug or error (STR #1361) + - Fixed filechooser to behave as documented when file + pattern changes (STR #1359) + - Completed the global function index and added an + alphabetical list of all methods (STR #1319) + - Avoiding problems with some platforms that don't + implement hypot() (STR #1366) + - Fixed floating point value formatting for Fl_Spinner + (STR #1331) + - Fixed Fl_Positioner callback when released (STR #1387) + - Fixed WIN32 zero size window issue (STR #1387) + - Fixed Sudoku window positioning (STR #1398) + - Fluid Code Declarations can now handle C++ style + comments (STR #1383) + - Fixed uninitialized data in OS X and WIN32 timeout + functions (STR #1374). + - Fixed speed issues when measuring text on OS X with + Quartz (STR #1386). + - Fixed focus issues on OS X (STR #1377) + - Optional precision argument when storing floats or + doubles in a Preferences file (STR #1381) + - Fixed callback not called when using arrow keys in + Fl_Slider (STR #1333) + - Changing the shortcut of a widget in fluid now marks the + document as dirty (STR #1382) + - Fl_Text_Editor now correctly handles middle mouse + clicks (STR #1384) + - Added some GLUT4 functions (STR #1370) + - Added "context_changed()" function for OpenGL windows + which allows efficient texture loading (STR #1372) + - Added missing "const" to GLUT call (STR #1371) + - Fixed stray FL_RELEASE events after clicking system + areas on OS X (STR #1376) + - FLUID now only writes definitions of "o" and "w" + variables as needed, reducing the number of "variable + is shadowed" warnings from GCC. + - Added access to Xft font pointer (STR #1328) + - Fixed endianness in OS X mouse cursor graphics (STR + #1348) + - Fixed crash on mixed use of keyboard and mouse for + Fl_Menu_Button (STR #1356) + - Fixed Fl_Window::visible() and shown() for OS X + (STR #1341) + - Fixed Fl_Window::copy_label() losing copy (STR #1332) + - Documentation fixes (STR #1336, STR #1329, STR #1339, + STR #1340) + - Added support for floating point Fl_Spinner in the + API, documentation, and Fluid (STR #1331) + - Repeat button now cancels timeout if it should get + deactivated during a callback (STR #1330) + - Added support for assigning Fl_Menu_Items to array + variables in Fluid (STR #1280) + - Added --with-archflags configure option to allow + passing of specific architecture-selection options to + the compiler and linker. + - Fixed WIN32 window stacking bug (STR #1296) + - Fixed wrong code generated by FLUID for Scrollbars (STR + #1287) + - Loading a file would not update the Widget Properties + dialog in FLUID (STR #1326) + - Fixed key compose sequences for shifted keys (STR + #1194) + - Added text selection and copy to Fl_Help_View. + - Fixed position of popup menu titles (STR #1322) + - Showing any window will disable the current tooltip + so it won't pop over menus (STR #1321) + - Updated documentation to reflect limitation of + Fl::delete_widget() (STR #1306) + - Fixed line wrapping in Fl_Text_Display (STR #1227) + - New function Fl::event_original_key() returns key code + before NumLock handling. + - Many OS X Quartz fixes (STR #1310, etc.) + - Fixed shortcut and default focus for message dialogs + (STR #1298) + - Fixed focus issues (STR #1286, STR #1289, STR #1296) + - Fixed window resizing in OS X (STR #1297) + - In FLUID, declarations starting with the keyword + 'typedef', 'class', or 'struct' are now treated + correctly if inside a class (STR #1283) + - Tabs now show the correct tooltip (STR #1282) + - Included fltk.spec in configure.in (STR #1274) + - Fixed insufficiently invalidated cache + in Fl_Browser (STR #1265) + - Attempt to fix multi monitor issues (STR #1153) + - Fixed warnings when compiling w/Cygwin (STR #1152) + - Fixed missing reset of flag in FLUID (STR #1187) + - Fixed maximizing in OS X (STR #1221) + - Fixed 'make distclean' to remove binaries inside + MacOS app packages (STR #1169) + - FLUID Code Viewer is now truly a viewer, not a text + editor because edited text can not be saved. + - Fl_Spinner is now fully supported by FLUID (STR #1158) + - Fixed usage of deleted object after menu pulldown + (STR #1162) + - Calling fl_font(0, 0) under Xft would access a NULL + pointer (STR #1205) + - Setting a new value in Fl_Input_ wil now actually move + cursor to the end of the input field as documented + (STR #1161) + - FLUID crashed on WIN32 with international characters + (STR #1176) + - Fl_Check_Browser did not allow the user to toggle the + check boxes (STR #1232) + - Fl_Help_View crashed on WIN32 with international + characters (STR #1228) + - Fl::run() no longer clears resources on WIN32 (STR + #1231) + - Fl::add_timeout() leaked resources on OSX (STR #1233) + - Accented characters could not be entered on OSX (STR + #1195) + - The caret key lookup was missing for OS X + - FLUID didn't handle loading .fl files with + international characters properly with all compilers + (STR #1150) + - Fl_Spinner's minimum() and maximum() "get" methods were + misspelled (STR #1146) + - The largefile support changes in 1.1.7 broke binary + compability for fl_filename_list(); you must now use + "--enable-largefile" when configuring to get large file + support, and the large file support definitions are + added to the output of "fltk-config --cflags" (STR + #1159) + + +CHANGES IN FLTK 1.1.7 + + - Documentation fixes (STR #571, STR #648, STR #692, STR + #730, STR #744, STR #745, STR #931, STR #942, STR #960, + STR #969) + - Various menu widget fixes (STR #1140, STR #1143, STR + #1144) + - The threads demo would display negative prime numbers + on MacOS X; this appears to be a MacOS X bug, but we + added a workaround to "fix" this (STR #1138) + - Fl::dnd() now sets the content type of the drag to + "text/uri-list" when it sees the dragged text is + composed of URIs. + - Fixed keyboard shortcut handling in FLUID and shortcut + labeling in FLTK (STR #1129) + - Fixed include path for CMake build (STR #1123) + - Fixed unnecessary delay in WIN32 event handling + (STR #1104) + - Fixed handling of Ctrl-C in Fl_Text_Display (STR #1122) + - OS X Quartz version now draw a nice resize control (STR + #1099) + - FLTK now enables large file support when available (STR + #1087) + - Fl_Clock_Output depended on a time value that was the + same as an unsigned long, which is incorrect for WIN64 + and VC++ 2005 (STR #1079) + - Fl_Text_Display::wrap_mode() would crash if no buffer + was associated with the widget (STR #1069) + - Updated the default label and text colors of all widgets + to use FL_FOREGROUND_COLOR instead of FL_BLACK (STR + #1052) + - Fl::set_fonts() now works with Xft (STR #1012) + - Fl_Value_Input now uses the screen-absolute position + instead of the window-relative position when dragging + the value; this avoids some jumping conditions (STR + #1037) + - Menus now pop up fully inside the screen if possible + (STR #973) + - Fixed illegal access in Preferences (STR #1025) + - Fixed x-offset problem in Help_Widget (STR #998) + - Clipboard will persist if owner window is hidden (STR + #1019) + - Fixed handling of Win32 Device Contexts (STR #1007) + - Fixed C++ style comments in C files (STR #997) + - Fixed signedness of scanf() argument (STR #996) + - Fixed cross-compiling problem (STR #995). + - FLUID now knows if a static callback is already + declared in a class and won't declare it 'extern' (STR + #776) + - Some actions in FLUID would not set the "changed" flag + (STR #984, STR #999) + - fl_filename_list now always appends a forward slash to + directory names (STR #874) + - Multiline Input will update right if a space character is + inserted in word wrap mode (STR #981) + - FLUID group labels redraw correctly (STR #959) + - FLUID now updates color of Fl_Tabs children (STR #979) + - FLUID now supports 'size_range()' (STR #851) + - FLUID selection boxes now synchronised (STR #964) + - fl_filename_list() now recognizes pathnames without + trailing slash as directions (STR #854) + - Fl_Text_Display now auto-scrolls in all + directions (STR #915) + - Borderless windows will not show in the taskbar anymore + on X11 (STR #933) + - Fixed event_text() field on FL_DND_* event on + OS X and WIN32 (STR #968) + - The fltk-config utility now supports "--cc" and "--cxx" + options to get the C and C++ compilers that were used + to compile FLTK (STR #868) + - Fl_Valuator-derived widgets could show more digits than + were necessary (STR #971) + - Fl_GIF_Image did not handle images with an incorrect + number of data bits (STR #914) + - Fixed some plastic drawing artifacts (STR #906) + - Fl_Help_View now draws the box outside the scrollbars, + like the other scrollable widgets (STR #871) + - The fltk-config script now handles invocation via a + symlink (STR #869) + - Updated WIN32 cut/paste code to consistently handle DOS + text (STR #961) + - Added shared library support for Cygwin and MingW (STR + #893) + - Fl_File_Chooser did not implement the user_data() + methods (STR #970) + - Compilation could fail if a previous installation of + FLTK was in the same (non-standard) directory as an + image library (STR #926) + - Fixed OSX compilation problems with non-HFS filesystems + (STR #972) + - Problems with CMake on MinGW have been solved, thanks + to Mr. "fltk.x0", who submitted the patch. (STR #863) + - Fixed memory leak in Fl_Check_Browser reported by + "miguel2i". (STR #967) + - Fl_File_Input could draw in the wrong window (STR #958) + - WIN32: Internal WM_PAINT message now ignored (STR #831) + - Added Windows support for Fl_Window::xclass() (STR #848) + - Floating point input field allows characters from + current locale (STR #903) + - Fixed integration of Fl_Input_Choice into FLUID (STR + #879) + - New windows touching the right screen border would be + positioned all the way to the left (STR #898) + - Made pie drawing size for WIN32 and OS X the same as + X11 (STR #905) + - Fixed OS X issue with OpenGL windows inside of Tabs + (STR #602) + - FLUID Code Editor would occasionally not draw the last + character in the buffer (STR #798) + - FLUID Declaration private flag fixed (STR #799) + - FLUID overlay now shows a seperate bounding box of + selected items with correct handles and a dotted + boundig box for all labels (STR #790) + - Fixed left overhang of large chracters in Fl_Input_ + (STR #941) + - Fixed button resizing in File Chooser (STR #884) + - Fixed FLUID redraw issue (STR #912) + - Added 32bit BMP Image file format support (STR #918) + - Value Sliders would not receive focus when clicked on + (STR #911) + - Added redraw of some widgets to show focus change (STR + #910) + - Fl::set_font would not clear 'pretty' name (STR #902) + - Fixed unescaped '@' in fonts demo (STR #867) + - FLUID should not open the Display connection anymore if + creating code only (STR #904) + - Improved hidden copy / ctor implementation (STR #860) + - Increased matrix stack depth and added over/underflow + error (STR #924) + - Reverted Mac Carbon Clipping simplification that broke + subwindow clipping (STR #908, SVN r4386) + - Fixed bitmap scaling code + - Fixed tiny memory leak (STR #878) + - Fixed hang on corrupt jpeg (STR #915) + - Fixed static allocation of font buffer in demo (STR #909) + - Added symbols 'refresh', 'reload', 'undo', and 'redo'. + - Fixed focus loss on Fl_Window:resize() + - Fl::delete_widget would hang fl_wait after deleting the + window (STR #679) + - Fl::paste would sometimes not recoginze external + changes of the clipboard (STR #722) + - Clipping fixes for OSX + - Removed attempt to find items via + Fl_Menu_::find_item() in linked submenus + - FLUID interactive window resizing fixes (STR #873, 791) + - FLUID panel resize and alignment fixes (STR #891) + - Fl_Window::show(argc, argv) now sets the scheme before + showing the window; this should eliminate any + flickering between the standard and plastic schemes on + startup (STR #886) + - Selected tabs are now drawn slightly larger than + unselected tabs so they stand out more (STR #882) + - Round Plastic boxes now draw round (STR #841) + - FL_PLASTIC_DOWN_BOX drew with artifacts (STR #852) + - Changed initializations on WIN32 (STR #862) + - Fl_Preferences::getUserdataPath() didn't work for + sub-groups (STR #872) + - Fixed some redraw issues on Windows XP. + - FLUID didn't set the initial size of widgets properly + (STR #850) + - Fl_Tabs would steal focus away from its children on a + window focus change (STR #870) + - filename_relative() now converts the current directory + to forward slashes as needed on WIN32 (STR #816) + - Fl_File_Chooser::value() and ::directory() now handle + paths with backslashes on WIN32 (STR #811) + - Added the standard rgb.txt file from X11 to the test + directory, allowing all platforms to try the colbrowser + demo (STR #843) + - Resizing of OpenGL subwindows was broken on OSX (STR #804) + - The fltk-config script now supports running from a + source directory (STR #840) + - Fl_Browser_ didn't update the position properly when an + item was deleted (STR #839) + - fl_contrast() now compares the luminosity of each color + (STR #837) + - Fl_Input_ crashed on some platforms when wrapping + international text characters (STR #836) + - Fixed some BMP images loading bugs (STR #825) + - Fl_File_Chooser now returns directory names with a + trailing slash to avoid problems with relative + filenames (STR #819) + - Fl_Help_View now supports the FONT and U elements (STR + #815) + - OpenGL windows that were completely off-screen caused + problems with some graphics cards on WIN32 (STR #831) + - Multiple screen support didn't work on Windows NT and + 95 (STR #821) + - Fl_Scrollbar didn't compute the correct knob size when + using the "nice" types (STR #845) + - fl_draw() would segfault on WIN32 if no font was set; + it now uses the default font (STR #828) + - Fl_Browser_ was calling the callback multiple times for + a single selection change with FL_WHEN_CHANGED (STR + #834) + - Added "filenew", "fileopen", "filesave", "filesaveas", + and "fileprint" symbols with standard toolbar + symbology. + - Updated Fl_Tabs to check the contrast of the label + color against the tab background, and to highlight the + top 5 lines of the tab pane with the selection color so + that selected tabs stand out more. + - The example programs can now compile separate from the + FLTK source distribution (STR #809) + - The example programs are now installed with the + documentation (STR #809) + - Fixed the drawing of the Fl_Browser_ selection box (STR + #786) + - Dropped Codewarrier project files and support. + - The FLTK string functions are now compiled in on all + systems (STR #774) + - Fixed symbol demo label bug (STR #777) + - Fixed position of menu titles (STR #795) + - Added missing Fl_Window::copy_label() method. + - Fixed wrong tooltip in FLUID (STR #784) + - Added zlib path to FLUID (STR #783) + - Menus and other pop-up windows now obey screen + boundaries on multi-screen displays (STR #781) + - Fl_Chart would draw outside its bounding box (STR #780) + - Added Fl::screen_count() and Fl::screen_xywh() APIs to + support multi-screen displays. + - FLUID now supports direct creation of widget classes. + - Fl_File_Chooser now correctly handles multiple + selections that are a mix of files and directories. + - Fl_File_Chooser no longer resets the type() when + choosing a single file, and it now works when selecting + multiple directories (STR #747) + - Fl_File_Icon::load_system_icons() now only loads 16x16 + and 32x32 icon images to improve startup performance. + - Pressing Enter in the file chooser when selecting a + directory will choose that directory if it is currently + shown (STR #746) + - Added a fl_file_chooser_ok_label() function to set the + "OK" button label for the fl_file_chooser() and + fl_dir_chooser() functions. + - Added Fl_File_Chooser::ok_label() methods to set the + "OK" button label. + - The fl_ask() function is now deprecated since it does + not conform to the FLTK Human Interface Guidelines. + - The Fl_File_Chooser window now properly resizes its + controls (STR #766) + - The Fl_Help_Dialog window now properly resizes its + controls (STR #768) + - The Fl_File_Chooser favorites window is now resizable + (STR #770) + - Now provide FL_PLASTIC_ROUND_UP/DOWN_BOX box types + which are used by the plastic scheme. + - FLUID windows that are resized through the widget panel + now remain resizable by the window manager. + - Increased the size of the background image used by + the plastic scheme to reduce the CPU load of redraws + (STR #769) + - Fixed a syntax highlighting bug in the editor demo. + - Fl_Progress now contrasts the label color with the bar + color, so labels will be readable at all times. + - fl_read_image() didn't use the right red, green, and + blue masks on XFree86. + - Fixed Quickdraw drawing of 3 and 4 sided polygons (STR + #765) + - Fixed fl_message() code so that it does not get + accidentaly addded to the current group (STR #253) + - FLUID now highlights code in the widget callback and + code editors. + - FLUID now supports printing of windows. + - Fixed inactive drawing of border, embossed, and + engraved box types. + - Added Fl_Spinner widget (another combination of + existing widgets in a header file) + - FLUID now provides support for UI templates. + - fl_not_clipped() incorrectly used the current window + dimensions for gross clipping, which interfered with + off-screen rendering. + - Fl_Window::draw() and Fl_Window::iconlabel() could leak + memory if copy_label() was used on the window. + - fl_shortcut_label() now shows letter shortcuts in + uppercase, e.g. "Ctrl+N" instead of "Ctrl+n" to be + consistent with other toolkits. + - FLUID now provides unlimited undo/redo support. + - FLUID now provides an option to choose which scheme + (default, none, plastic) to display. + - Fixed scheme background issue with windows in FLUID. + - In FLUID, new widgets are now created with the ideal + size by default, and menu bars are positioned to use + the entire width of the window. + - Added Layout/Widget Size submenu to select default + label and text size (Tiny, Small, and Normal). + - Added Edit/Duplicate command to FLUID to duplicate the + current selection. + - FLUID now tracks the current state of the widget bin + and overlays. + - Now fill the widget image paths with relative + filenames. + - Fixed frame drawing of Fl_Text_Display (STR #762) + - Fl_Clock_Output::value() did not return the previously + set value (STR #748) + - Added comment type to FLUID. This is useful for + generating copyright notices in the source and header + files. + - Fl_Valuator would not format text output with decimal + point when the step value was fractional, but above 1. + - fl_filename_relative() didn't compare drive letters in + a case-insensitive way (STR #741) + - Fixed menu item width calculations with symbols (STR + #740) + - The keyboard shortcut handling code did not handle + 8-bit characters properly (STR #731) + - Fl_JPEG_Image could still crash an app with a corrupt + JPEG file (STR #739) + - Using the layout alignment controls on a menu widget + would cause FLUID to crash (STR #742) + - Added QNX bug workaround for menu handling (STR #704) + - Added Greg Ercolano's simple Fl_Input_Choice widget + which is a combination of the Fl_Input and + Fl_Menu_Button widgets (STR #650) + - Fl_Multiline_Input now scrolls the full height of the + widget instead of 5 lines when the user presses PageUp + or PageDown (STR #727) + - CMake build fixes (STR #724) + - Fl_Browser::swap() didn't handle redraws properly when + the swapped lines had different heights (STR #729) + - FL_MOUSEWHEEL events are now sent first to the widget + under the mouse pointer and then to the first widget + which accepts them. This is similar to the way + shortcut events are handled and is consistent with the + way the mouse wheel is handled by other toolkits. + - Fl::wait() could block on WIN32 if the window was + deleted via Fl::delete_widget() (STR #679) + - Fl_Preferences::RootNode did not find the user's home + directory on some non-US versions of Windows (STR + #720) + - Fl_Window::hide() didn't delete the current clipping + region on WIN32, causing a GDI resource leak in some + situations (STR #723) + - Removed a few warnings when compiling on OS X + - Fl_Menu now draws the arrow more like other toolkits + and 2.0 (STR #651) + - Fixed a VC++ compiler error in Fl_JPEG_Image.cxx (STR + #676) + - FL_SHADOW_BOX/FRAME drew outside of the bounding box + (STR #694) + - Fl_Widget::copy_label(NULL) didn't work (STR #707) + - Fl_Choice now allows click selection like + Fl_Menu_Button and Fl_Menubar (STR #706) + - Updated cmake support (STR #645) + - Fl_Check_Browser didn't draw properly when inactive + (STR #681) + - Removed some redundant code in Fl_Group::handle() (STR + #669) + - The file chooser didn't always deactivate the OK + button when necessary (STR #653) + - Image drawing on OSX changed the current drawing + colors (STR #662) + - Fixed some compiler errors on WIN32 (STR #647, STR + #726) + - FLUID didn't update the widget panel X/Y/W/H values + when moving the selected window (STR #701) + - FLUID didn't use the label type constant names for + menu items, causing them to be drawn using the normal + label type (STR #668) + - Fl_File_Chooser was slow with large directories (STR + #654) + - FLUID didn't add xclass() calls to windows (STR #718) + - The X11 DND code did not correctly select a text + format for incoming data (STR #711) + - Fixes to Fl_JPEG_Image error handler. + - Fl_Menu::popup() and ::pulldown() would crash an + application if a callback created widgets before they + returned (STR #685) + - Fl_Double_Window would cause a full redraw, even if + only small parts of the UI were changed on Mac OS X. + - Fl_JPEG_Image did not correctly handle errors reported + by the JPEG library (STR #652) + - Fl_Menu now draws sub-menu arrows like other toolkits + and FLTK 2.0 (STR #651) + - Fixed a compiler warning in Fl_Window.H (STR #641) + - Tooltips disabled shortcut processing (STR #643) + - Fl::event_number() didn't always match the value sent + to the handle() method (STR #634) + - Fl_Shared_Image::reload() didn't set the image_ + pointer properly in all cases (STR #632) + - Fl_Help_View::topline() incorrectly set the changed() + flag (STR #631) + - Fl_Choice::value() now supports NULL or -1 to deselect + the current item (STR #637) + - More VC++ 6 project file fixes (STR #638) + - Added missing Watcom makefile in the test directory + (STR #636) + - Fl_Text_Display::word_left would hang if the cursor + was at position 0 (STR #635) + + +CHANGES IN FLTK 1.1.6 + + - Documentation updates (STR #552, STR #608) + - Added the 2.0 Fl_Widget::copy_label() method to + allow FLTK 1.x applications to have their label + strings managed by FLTK (STR #630) + - Added Fl::delete_widget() method to safely delete + widgets in callback methods (STR #629) + - Fl_Widget::damage(uchar,int,int,int,int) didn't clip + the bounding box properly (STR #626) + - Windows could appear on the wrong screen on OSX (STR + #628) + - Fl_Double_Window produced an error on resize with X11 + - FLUID didn't display menu items using images properly + (STR #564) + - Fl_Sys_Menu_Bar didn't compile on case-sensitive + file-systems (STR #622) + - FLUID didn't handle default function parameters + properly (STR #579) + - Moving or resizing widgets in FLUID didn't always + update the widget panel (STR #600) + - FLTK windows could appear off-screen on X11 (STR #586) + - The configure script did not support + --disable-localfoo to completely disable image file + support (STR #582) + - The Visual C++ 6.0 project files still listed the old + JPEG, PNG, and ZLIB library names (STR #577) + - Fixed the scandir() conditional code for HP-UX 11i + (STR #585) + - Fl_Text_Display didn't support CTRL/CMD-A/C (STR #601) + - Watcom fixes (STR #581, STR #584, STR #594, STR #595, + STR #623, STR #627) + - Fixed library include order when building DSOs on + MacOS X (STR #596) + - fl_xid() could cause a WIN32 application to crash (STR + #560, STR #576, STR #618) + - Fl_Browser::remove_() removed the item from the list + before computing the item height, which caused + problems with some programs (STR #613) + + +CHANGES IN FLTK 1.1.5 + + - Documentation updates (STR #568, STR #570) + - Shortcuts were incorrectly underlined in multi-line + labels (STR #566) + - More CMake updates (STR #499) + - The Watcom C++ compiler needed a small change (STR + #567) + - Added DESTDIR support and now remove all man pages for + the "uninstall" target (STR #545) + - Fix PNG drawing on buggy WIN32 graphics cards (STR + #548) + - The configure script didn't propagate the CPPFLAGS + environment variable (STR #549) + - The numpad keys didn't work properly on WIN32 (STR + #502) + - fl_input() and friends now set the input focus to the + text field when the dialog is shown (STR #553) + - Fixed background color mixup when drawing Fl_Choice + menus (STR #544) + - Fixed MingW makefiles (STR #550) + - More VC++ project file tweaking (STR #559) + - Fl_PNG_Image didn't use the png_set_trns_to_alpha + function when available (STR #547) + - The FL_UNFOCUS event wasn't always sent when switching + tabs (STR #558) + + +CHANGES IN FLTK 1.1.5rc3 + + - Documentation updates (STR #505, STR #513) + - Updated PNG library source to 1.2.7. + - Updated ZLIB library source to 1.2.1. + - Fixed VC++ project file problems (STR #476, STR #478, + STR #520, STR #527, STR #537) + - Now look for 8 bits of alpha when the developer has + requested FL_RGB8 (STR #541) + - The last line in an Fl_Help_View widget was not + aligned properly (STR #536) + - The "search" symbol looked like a Q (STR #536) + - Changed Fl_Help_View::get_color() to use a lookup + table to avoid serious Borland C++ 5.5 compiler bugs + (STR #533) + - Fixed Watcom compiler warnings with FL/Fl_Widget.H + (STR #540) + - The image class copy() methods did not always make a + separate copy of the image data (STR #539) + - Fixed an edge case in fl_old_shortcut() that could + cause it to read beyond then end of the shortcut + string (used for XForms named shortcuts) + - Added (unsupported) CMake files (STR #499) + - Tooltips would not reappear on the same widget, and + the initial tooltip delay was not used after a tooltip + was shown (STR #465) + - Fixed a compile problem with the Linux 2.6 threading + support (STR #483) + - Fixed problems with 2-byte Xpm files on 64-bit + platforms (STR #525) + - FLTK didn't handle the ReparentNotify event on X11 + (STR #524) + - The old source file "fl_set_gray.cxx" is not needed + (STR #516) + - Fl_Text_Display still called delete[] instead of + free() in one place (STR #503) + - The symbol test program did not handle the @+ symbol + properly (STR #490) + - Fl_File_Chooser didn't correctly call isprint() and + isspace() when checking to see if the current file was + text that can be previewed (STR #517) + - FLUID didn't compile with Borland C++ due to a + compiler bug (STR #496) + - Fl_Positioner did not handle reversed min and max + values (STR #510) + - fl_descent(), fl_height(), and fl_width() would crash + a program if you didn't call fl_font() first; they now + return -1 if no font is set (STR #500) + - Added test/unittests to verify pixel drawing and + alignment across platforms + - Fl_Menu_::find_item() didn't determine the menu path + properly (STR #481) + - The build system now installs image library header + files in FL/images/filename.h so that FLTK programs + will use the same header files as the FLTK image + libraries. + - The build system now creates image libraries named + "libfltk_name.a" instead of "libname.a" to avoid + clobbering an existing installed library (STR #480) + + +CHANGES IN FLTK 1.1.5rc2 + + - Documentation updates (STR #365, STR #399, STR #407, + STR #412, STR #414, STR #452, STR #462) + - Fl_Text_Display did not handle drawing of overlapping + text (italic next to plain, etc.) properly (STR #381) + - All of the core widgets now consistently set changed() + before calling the callback function for a change in + value; this allows programs to check the changed() + state in a callback to see why they are being called + (STR #475) + - Fl_File_Chooser did not handle some cases for filename + completion (STR #376) + - Fl_Help_View didn't properly compute the default + maximum width of the page properly, resulting in + non-wrapped text in table cells (STR #464) + - Fl_Text_Editor no longer tries to emulate the Emacs + CTRL-A shortcut to move to the first column, since + there is a key for that and the widget does not + emulate any other Emacs keys (STR #421) + - Fl_File_Chooser always disabled the OK button when the + user pressed DELETE or BACKSPACE (STR #397) + - Added Fl_Browser::swap() methods (STR #459) + - Fl_Counter didn't use a thin down box for the text + field if the box type was set to FL_THIN_UP_BOX (STR + #467) + - Fl_Help_View now resets the scrollbars if they go + outside the current view (STR #464) + - fl_dir_chooser() did not show the previous selection + as documented (STR #443) + - Fl_Text_Display used delete[] instead of free() in + some places (STR #466) + - FLTK now includes copies of the PNG, JPEG, and ZLIB + libraries for platforms that do not have them (STR + #441) + - The fltk-config script did not include the + "-mno-cygwin" option under CygWin (STR #434) + - Fl_Help_View::find() did not check for a NULL value + (STR #442) + - Added search symbol to the search field of + Fl_Help_Dialog (STR #417) + - Added two new symbols, @search and @FLTK, which can be + used in labels. + - MacOS X: fixed NumLock mixup, added support for + FL_Menu and FL_Delete keys on external (PC) keyboards + (STR #445) + - Fl_File_Icon::draw() did not support drawing of complex + polygons in icon descriptions (STR #474) + - The configure script now offers options for JPEG, PNG, + and ZLIB libraries (STR #416) + - The first menu item in a list would not go invisible + (STR #406) + - Fl_Text_Buffer::replace() now range checks its input + (STR #385) + - FLTK now builds with the current release of MinGW (STR + #325, STR #401, STR #402) + - FLTK now honors the numlock key state (STR #369) + - The Fl_Text_Display widget did not redraw selections + when focus changed (STR #390) + - The plastic background image is now less contrasty + (STR #394) + - Fl_Scroll now uses a full redraw when the scheme is + set to plastic and the box type is a frame (STR #205) + - Fl_Window::resize() did not work properly with KDE 3.2 + (STR #356) + - FLTK didn't delete font bitmaps when the last OpenGL + window was deleted, preventing future text from + displaying (STR #310) + - FLUID didn't include a full initialization record for + the trailing NULL menu items (STR #375) + - Fl_Browser::item_width() did not properly handle + format modifiers (STR #372) + - Fl_Browser::item_height() did not handle columns + properly (STR #371) + - Fl_Gl_Window's on WIN32 now prefer accelerated pixel + formats over generic formats (STR #382) + - Fl_Window::resize() did not work on some systems if + the window was not shown (STR #373) + - FLUID did not write the user_data type if the + user_data field was empty (STR #374) + - The value(const Fl_Menu_Item*) method was not + implemented for Fl_Choice (STR #366) + - Fl_Pack didn't draw child widget labels the same way + as Fl_Group, causing display problems (STR #360) + - fl_read_image() didn't work when reading from an + offscreen buffer with some X11 servers (STR #364) + + +CHANGES IN FLTK 1.1.5rc1 + + - Documentation updates (STR #186, STR #245, STR #250, + STR #277, STR #281, STR #328, STR #338) + - fl_scroll() did not handle scrolling from off-screen on + WIN32 (STR #315) + - Fl_File_Chooser did not allow manual entry of a drive + letter (STR #339) + - Fl_Menu now uses the boxtype to redraw the menu + background (STR #204) + - Fl_Scroll now shows the background image when a framed + box type is used and the Fl_Scroll is a direct + decendent of a window (STR #205) + - Added a new_directory_tooltip string pointer to allow + localization of the file chooser's new directory + button (STR #340) + - Added Fl_Menu_::find_item() method (STR #316) + - The Fl_Widget copy operator definitions were not + conditionally compiled properly (STR #329) + - FLUID's Layout functionality did not move child + widgets when laying out group widgets (STR #319) + - FLUID's Layout->Center In Group functionality did not + properly handle widgets that were children of a + Fl_Window widget (STR #318) + - The Fl_Text_Display destructor did not remove the + predelete callback associated with the current buffer + (STR #332) + - Fixed several bugs in the MacOS X Fl::add_fd() + handling (STR #333, STR #337) + - The Fl_Text_Display widget did not display selections + set by the application (STR #322) + - FLUID crashed if you did layout with a window widget + (STR #317) + - Fl_Scroll::clear() didn't remove the child widget from + the Fl_Scroll widget (STR #327) + - Fl_Value_Slider::draw_bg() didn't always apply the + clipping rectangle (STR #235) + - fl_filename_relative() returned the wrong string if + the absolute pathname was equal to the current working + directory (STR #224) + - Fl_Help_Dialog didn't correctly restore the scroll + position when going forward/back in the link history + if the file changed (STR #218) + - glutGetModifiers() did not mask off extra state bits, + confusing some GLUT-based applications (STR #213) + - Fixed mouse capture problems on MacOS X (STR #209, STR + #229) + - Fl_Sys_Menu_Bar is now built into the library for + MacOS X (STR #229) + - Fl_Menu_ now provides item_pathname() methods to get + the "pathname" of a menu item, e.g. "File/Quit" (STR + #283) + - Fl_Text_Display now provides cursor_color() methods to + get and set the cursor color (STR #271) + - Fl_Scroll didn't honor FL_NO_BOX (STR #305) + - FLUID declaration blocks didn't support public/private + definitions (STR #301) + - Fl_Preferences incorrectly created the preferences + directory before necessary (STR #247) + - The WIN32 project files still defined the (obsolete) + FL_STATIC constant (STR #279) + - Fl_Text_Display::buffer() did not support NULL values, + making it impossible to clean up text buffers from a + subclass (STR #295) + - Fl_Text_Display did not support a NULL + unfinishedStyleCB function (STR #241) + - Fl::background2() incorrectly marked the foreground + color as initialized (STR #255) + - Fixed the X11 CTRL + "-" detection code to properly + track the state of the CTRL key (STR #264) + - Fl_File_Icon::load_system_icons() didn't support KDE + 3.x (STR #299) + - WIN32's scandir() emulation did not allocate enough + memory for directory names (STR #263) + - Fl::compose() did not handle special keys like + backspace properly (STR #293) + - Fl_Choice did not clip its text when drawing using the + plastic scheme (STR #287) + - Fl_Group incorrectly mapped the emacs CTRL keys to + keyboard navigation (STR #228) + - Fl_File_Browser::load() didn't handle a NULL directory + name (STR #266) + - 64-bit library fixes (STR #261) + - The Fl_Valuator::format() function did not limit the + size of the number buffer (STR #268) + - The keypad Enter key works as the normal Enter/Return + key in common widgets (STR #191) + - Fixed some OS/2-specific build problems (STR #185, STR + #197) + - Calling Fl_Text_Display::buffer() with the same buffer + would cause an application to lockup (STR #196) + - Some of the widgets could crash an application if the + cursor was changed after a window was deleted (STR + #181) + - The Fl_Gl_Window WIN32 pixel format code did not + choose the pixel format with the largest depth buffer + (STR #175) + - The configure script didn't leave space between the + CFLAGS/CXXFLAGS and X_CFLAGS variables (STR #174) + - The Fl_JPEG_Image and Fl_PNG_Image classes did not + trap errors from the corresponding image libraries + (STR #168) + - Added "--with-links" configure option to control + whether symlinks are created for the FLTK header files + (STR #164) + - Added new hoverdelay() to Fl_Tooltip to control how + quickly recent tooltips appear (STR #126) + - FLUID now sets the size range when a window is shown. + This seems to be necessary with some window managers + (STR #166) + + +CHANGES IN FLTK 1.1.4 + + - The fl_read_image() function was not implemented on + OSX (STR #161) + - VC++ 7.1 didn't like how the copy operators were + disabled for the Fl_Widget class; now include inline + code which will never be used but makes VC++ happy + (STR #156) + - Fixed an IRIX compile problem caused by a missing + #include (STR #157) + - FLUID didn't write color/selection_color() calls using + the symbolic names when possible, nor did it cast + integer colors to Fl_Color (STR #146) + - Fl_File_Chooser was very close for multiple file + selection in large directories (STR #140) + - Fl_Text_Display/Editor did not disable the current + selection when focus was shifted to another widget + (STR #131) + - Fl_Choice didn't use the normal focus box when the + plastic scheme was in use (STR #129) + - Fl_Text_Editor didn't use selection_color() + consistently (STR #130) + - The fltk_forms, fltk_gl, and fltk_images DSO's and + HP-UX shared libraries are now linked against the fltk + shared library to provide complete dependency + resolution (STR #118) + - The configure.in file did not work with autoconf 2.57. + - FLUID didn't redraw widgets when changing the X, Y, W, + or H values in the widget panel (STR #120) + - Fl_Window::show(argc, argv) wasn't calling + Fl::get_system_colors() as documented (STR #119) + - DSO (shared library) building wasn't quite right for + some platforms (STR #118) + - OSX: some changes to make ProjectBuilder compiles + possible. + - OSX: FLTK would not know where a window was positioned + by the OS. As a result, popup menus could open at + wrong positions. + + +CHANGES IN FLTK 1.1.4rc2 + + - Fl_Window::show(argc,argv) incorrectly opened the + display prior to parsing the arguments; this prevented + the "-display foo" option from working (STR #111) + - Images were not clipped properly on MacOS X (STR #114) + - Fl::reload_scheme() and Fl::scheme("foo") incorrectly + called Fl::get_system_colors(). This prevented an + application from setting its own color preferences + (STR #115) + - The 'Enter' key event on OS X would not set + Fl::e_text. + - Changed behaviour of FLUID to always paste into + a selected group (STR #88) + - Menuitem now changes font, even if fontsize + is not set (STR #110) + - Swapped shortcut labels in OS X (STR #86) + - Non-square Fl_Dial would calculate angle from user + input wrong (STR #101) + - Updated documentatiopn of fl_draw (STR #94) + and Fl_Menu_::add() (STR #99) + - FLUID collapse triangle events were not offset by + horizontal scroll (STR #106) + - QuitAppleEvent now correctly returns from Fl::run() + instead of just exiting (STR #87) + - Hiding the first created OpenGL context was not + possible. FLTK now manages a list of contexts (STR #77) + - FLUID didn't keep the double/single buffer type for + windows. + - FLTK didn't work with Xft2. + - OSX window resizing didn't work (STR #64) + - Fixed MacOS X shared library generation (STR #51) + - Several widgets defined their own size() method but + didn't provide an inline method that mapped to the + Fl_Widget::size() method (STR #62) + - Fl_Scroll didn't provide its own clear() method, so + calling clear() on a Fl_Scroll widget would also + destroy the scrollbars (STR #75) + - Fl::event_text() was sometimes initialized to NULL + instead of an empty string (STR #70) + - fl_draw() didn't properly handle a trailing escaped + "@" character (STR #84) + - Added documentation for all forms of + Fl_Widget::damage() (STR #61) + - Fl_Double_Window now has a type() value of + FL_DOUBLE_WINDOW, to allow double-buffered windows to + process redraws properly on WIN32 (STR #46) + - Added FL_DAMAGE_USER1 and FL_DAMAGE_USER2 damage bits + for use by widget developers (STR #57) + - Fl_Help_View didn't support numeric character entities + (STR #66) + - Menu shortcuts didn't use the Mac key names under + MacOS X (STR #71) + - CodeWarrior Mac OS X updated to work with current + CW8.3 (STR #34) + - Apple-C/X/V/Z didn't work in the Fl_Input widget due + to a bad mapping to control keys (STR #79) + - Added the OSX-specific fl_open_callback() function to + handle Open Documents messages from the Finder (STR + #80) + - The configure script contained erroneous whitespace in + various tests which caused errors on some platforms + (STR #60) + - The fltk-config script still supported the deprecated + --prefix and --exec-prefix options; dropped them since + they serve no useful purpose and would never have + worked for the intended purpose anyways... (STR #56) + - fl_filename_list returned 0 on Win32 if no directory + existed (STR #54) + - Pressing 'home' after the last letter in a Text_Editor + would move the cursor to pos 0 (STR #39) + - Fl::get_key(x) would mix up Ctrl and Meta on OS X (STR + #55) + - The configure script used the wrong dynamic library + linking command for OSX (STR #51) + - The Fl_Text_Editor widget did not set changed() nor + did it call the widget's callback function for + FL_WHEN_CHANGED when processing characters that + Fl::compose() handles (STR #52) + + +CHANGES IN FLTK 1.1.4rc1 + + - The file chooser did not reset the click count when + changing directories; if you clicked on a file in the + same position after changing directories with a + double-click, the chooser treated it as a triple + click (STR #27) + - Symbols with outlines did not get drawn inactive. + - The Fl_Help_View widget now provides a find() method + to search for text within the page. + - The Fl_Help_Dialog widget now provides a search box + for entering text to search for. + - The default font encoding on OSX did not match the + default on WIN32 or X11. + - Menu items were not drawn using the font specified in + the Fl_Menu_Item structure (STR #30) + - Long menus that were aligned such that the top of an + item was exactly at the top of the screen would not + scroll (STR #33) + - The OS issues appendix incorrectly stated that MacOS + 8.6 and 9 were supported; they are not (STR #28) + - Fixed handling of nested double-buffered windows (STR + #1) + - Showing a subwindow inside a hidden window would crash + the application (STR #23) + - OSX users couldn't enter some special chars when using + some foreign key layouts (STR #32) + - Hiding subwindows on OSX would hide the parent window + (STR #22) + - Added thin plastic box types. + - Fl_Pack ignored the box() setting and cleared any + unused areas to the widget color; it now only does so + if the box() is set to something other than FL_NO_BOX. + - Updated the Fl_Tabs widget to offset the first tab by + the box dx value to avoid visual errors. + - Updated the plastic up box to draw only a single + border frame instead of the old double one for + improved appearance. + - Updated the default background color on OSX to provide + better contrast. + - Fl_Text_Display and friends now look for the next + non-punctuation/space character for word boundaries + (STR #26) + - gl_font() didn't work properly for X11 when Xft was + used (STR #12) + - Fl_File_Browser incorrectly included "." on WIN32 (STR + #9) + - Include shellapi.h instead of ShellAPI.h in the WIN32 + drag-n-drop code in order to work with the MingW cross + compiler (STR #6) + - The cursor was not properly restored when doing + drag-n-drop on X11 (STR #4) + - Fl::remove_fd() didn't recalculate the highest file + descriptor properly (STR #20) + - Fl_Preferences::deleteGroup() didn't work properly + (STR #13) + - Fixed the fl_show_file_selector() function - it was + copying using the wrong string size (STR #14) + - fl_font() and fl_size() were not implemented on MacOS + X. + - Sorted the icon menu bar in FLUID. + - Fixed minor memory access complaints from Valgrind + - Compiling src/flstring.h on OS X with BSD header would + fail. + - Fl_Text_Editor didn't scroll the buffer when the user + pressed Ctrl+End or Ctrl+Home. + - Fl_Text_Editor didn't show its cursor when the mouse + was moved inside the window. + - FLUID now uses an Fl_Text_Display widget for command + output, which allows you to copy and paste text from + command output into other windows. + - Fl_Gl_Window could cause a bus error on MacOS X if the + parent window was not yet shown. + - FLUID could crash after displaying a syntax error + dialog for the callback code. + - FLUID would reset the callback code if you opened the + widget panel for multiple widgets. + - Added a NULL check to Fl_Text_Display (SF Bug #706921). + - The fltk-config script placed the LDFLAGS at the wrong + place in the linker options. + - Fl_Text_Display didn't draw the outer box in the right + dimensions, so it was invisible. + - Fl_Help_Dialog used the same color for links as for + the background, causing links to be invisible on pages + without a background color set. + + +CHANGES IN FLTK 1.1.3 + + - Documentation updates. + - FLTK now ignores KeyRelease events when X11 sends them + for repeating keys. + - FLUID now supports up to two additional qualifiers + before a class name (FL_EXPORT, etc.) to aide in + developing DLL interfaces for WIN32. + - Additional NULL checks in Fl_Button, + fl_draw_boxtype(), Fl_File_Chooser, and + Fl_Window::hotspot(). + - The Fl_Preferences header file needed to FL_EXPORT all + of the nested classes for WIN32. + - Fl_Double_Window couldn't be nested on WIN32. [SF Bug + #658219] + - Fl_Slider didn't call the callback function when the + user changed the value using the keyboard and the + "when" condition was FL_WHEN_RELEASE. [SF Bug #647072] + - Lines with less than 2 unique vertices and polygons + with less the 3 unique vertices were not drawn + properly. [SF Bug #647067] + - The size_range() values were not honored under MacOS + X. [SF Bug #647074] + - OpenGL windows didn't resize correctly on MacOS X. + [SF Bug #667855] + - The menus incorrectly used the overlay visual when one + or more menu items contained an image. [SF Bug #653846] + - Changed some error messages to use Fl::error() instead + of fprintf()... + - Fl_Text_Buffer and Fl_Text_Display used free to free + memory that was allocated using the new operator. + - Tweeked the plastic scheme under MacOSX to better + match the colors. + - The Fl_Image.H always included the x.H header file, + which included many system headers that could + interfere with normal GUI applications. It now uses + the corresponding based types for the image id and + mask to avoid this. + - The FLUID widget panel wasn't sorted, so keyboard + navigation was strange. [SF Bug #647069] + - Fl_Scroll didn't compute the location of labels to the + right or below when determining the area to erase. + - Added backward-compatibility macro for + filename_setext(). + - Fl_Bitmap::copy(), Fl_Pixmap::copy(), and + Fl_RGB_Image::copy() all could overflow the source + image when scaling the image. + - Double/triple clicks in Fl_Input fields didn't copy + the expanded selection to the clipboard. + - Fl_Glut_Window and Fl_Gl_Window didn't always initialize + the OpenGL context on MacOS. + + +CHANGES IN FLTK 1.1.2 + + - Fl_Menu_Bar now supports drawing vertical dividers + between menu items and submenus in the menu bar. + - Fl_File_Chooser::value() didn't return NULL when the + user clicked Cancel while selecting a directory. This + bug also affected fl_dir_chooser(). + - Fl_Menu_::add(const char *) used too small a menu item + label buffer and didn't do bounds checking. + - Eliminate some compiler warnings with CodeWarrier + under WIN32 (Paul Chambers) + - Fl_Gl_Window widgets did not resize properly under + MacOS X. + - The cursor could be set for the wrong window in the + text widgets. + - Fl_Check_Browser didn't provide const char * add + methods as documented. + - Fl_Check_Browser didn't draw the same style of check + marks at the other widgets. + - Fl_Button, Fl_Choice, and Fl_Menu_Button incorrectly + activated the button/menu when the spacebar was + pressed in conjunction with shift, control, alt, or + meta. + - FLTK should now compile with Xft 2.0. + - Some versions of Tru64 4.0 have snprintf and + vnsprintf, but don't have the prototypes for those + functions. + - FLTK had trouble doing character composition with some + keyboard layouts under X11 (in particular, Belgian). + - Fl_Text_Editor would cause a segfault if the user + pressed CTRL-V (paste) without having any data in the + clipboard... + - The tab key moved backwards in menus instead of + forwards. Shift-tab still moves backwards. + - The redraw_label() method didn't damage the parent + window when the label was outside the widget's + bounding box. + - Added a "draw_children()" method to Fl_Group to make + subclassing Fl_Group with a custom draw() function + easier. + - Fl_Text_Editor now supports basic undo functionality. + - FLUID now uses Fl_Text_Editor widgets for all + multi-line code fields. + - Added new widget bin and icons to FLUID. + - FLUID would try running multiple commands in parallel, + even though it wasn't capable of handling it. + - FLUID didn't generate code for some attributes when + using custom/named widget classes. + - Added a new FL_COMMAND state bit which maps to FL_CTRL + on X11 and WIN32 and FL_META on MacOS. + - MacOS keyboard modifiers mapping corrections. Cmd and + Control are no longer swapped, event_key and event_text + return (mostly) the same values as on other platforms. + - The Fl_Tabs widget should no longer be a focus hog; + previously it would take focus from child widgets. + - The file chooser now activates the OK button when + opening a directory in directory selection mode. + - Fixed a bug in the file chooser when entering an + absolute path. + - Back-ported some FLTK 2.0 tooltip changes to eliminate + erroneous tooltip display. + - MacOS windows were resizable, even when size_range + would not allow for resizing. + - Fl_Text_Editor now supports Shift+Delete, Ctrl+Insert, + and Shift+Insert for cut, copy, and paste, + respectively. + - Fl_Text_Display didn't restore the mouse pointer when + hidden. + - Fl::arg() now ignores the MacOS X -psn_N_NNNNN option. + - Added another change to the WIN32 redraw handling for + the MingW compilers. + - Fl_File_Chooser didn't handle WIN32 home directories + that used backslashes instead of forward slashes. + - Fl_Text_Display didn't limit the resize height to 1 + line. + - Fl_Scrollbar widgets incorrectly took keyboard focus + when clicked on. This caused widgets such as + Fl_Text_Display to hide the cursor when you scrolled + the text. + + +CHANGES IN FLTK 1.1.1 + + - Fl_Text_Display didn't always show the cursor. + - Fl_Tabs now only redraws the tabs themselves when + making focus changes. This reduces flicker in tabbed + interfaces. + - The WIN32 redraw handler now correctly merges the FLTK + and Windows redraw regions. + - The Fl_Text_* widgets use the C++ bool type, which is + not supported by older C++ compilers. Added a + configure check and workaround code for this. + - Fl_X::set_xid() didn't initialize the backbuffer_bad + element that was used with XDBE. + - Fl_Shared_Image::uncache() was not implemented. + - Fl::set_font() didn't 0-initialize all font descriptor + data. + - Some OpenGL implementations don't support single- + buffered visuals. The Fl_Gl_Window class now emulates + single-buffered windows using double-buffered + windows. + - Added a workaround for a compiler bug in Borland C++ + that prevented Fl_Help_View.cxx from compiling. + - Checkmarks didn't scale properly; copied the 2.0 check + mark code over. + - Replaced several memcpy's with memmove's for + portability (memmove allows for overlapping copies, + memcpy does not) + - Bug #621737: Fl_Bitmap::copy(), Fl_Pixmap::copy(), and + Fl_RGB_Image::copy() now range-check the new width and + height to make sure they are positive integers. + - Bug #621740: the WIN32 port needed to handle WM_MOUSELEAVE events + in order to avoid problems with tooltips. + - Fl_PNM_Image didn't set the "alloc" flag for the data, + which could lead to a memory leak. + - fl_filename_match() was inconsistently doing case- + insensitive matching. + - Fl_Button redraw fix for bug #620979 (focus boxes and + check buttons). + - Fl_Text_Display fix for bug #620633 (crash on + redisplay). + - Fl_Output now calls its callback when the user clicks + or drags in the widget. + - Shortcuts now cause buttons to take focus when visible + focus is enabled. + - fl_filename_relative() didn't check that the path was + absolute under WIN32. + - fl_filename_relative() didn't check that the path was + on the current drive under WIN32. + - The Fl_BMP_Image class now handles 16-bit BMP files + and BMP files with a transparency mask. + - The fltk-config script didn't add the required include + path, if any, when compiling a program. + - Added a license clarification that the FLTK manual is + covered by the same license as FLTK itself. + - Fl_Check_Browser wasn't documented. + - Fl_Preferences::Node::addChild(), deleteEntry(), and + remove() didn't set the "dirty" flag. + - The "no change" button didn't work in the FLUID widget + panel. + - Vertical scrollbars did not draw the arrows inactive + when the scrollbar was inactive. + + +CHANGES IN FLTK 1.1.0 + + - Documentation updates. + - Added a Fl_Widget::redraw_label() method which flags a + redraw of the appropriate area. This helps to + eliminate flicker when updating the value of a widget. + - Fl_Wizard::value() now resets the mouse cursor to the + window's default cursor. + - Fl_File_Chooser::type() didn't enable/disable the new + directory button correctly. + - Fl_Preferences::entryExists() did not work properly. + - FLUID's image file chooser pattern was incorrect. + - Fl_File_Icon::load_system_icons() now detects KDE + icons in /opt/kde, /usr/local, and /usr automatically, + and supports the KDEDIR environment variable as well. + - Submenus now display to the left of the parent menu if + they won't fit to the right. Previously they would + display right on top of the parent menu... + - Fl_Menu_:add() didn't handle a trailing "\" character + gracefully. + - Clicking/dragging the middle mouse button in a + scrollbar now moves directly to that scroll position, + matching the behavior of other toolkits. + - Added some more range checking to the Fl_Text_Display + widget. + - The editor demo did not correctly update the style + (syntax highlighting) information. + + +CHANGES IN FLTK 1.1.0rc7 + + - Updated the Fl_Text_Buffer and Fl_Text_Display classes + to be based on NEdit 5.3 (patch from George Garvey). + - Fixed a problem with Fl::wait(0.0) on MacOS X 10.2; + this affected the fractals demo and other OpenGL + applications. + - Fl_Glut_Window now takes keyboard focus and handles + shortcut events. + - The MacOS X implementation of fl_ready() now checks + the event queue for events. + - Fl_PNM_Image now supports the XV/GIMP thumbnail format + (P7). + - Fl_Preferences would not find groups inside the root + group. + - Small bug fixes for Fl_Chart, Fl_Scrollbar, Fl_Tabs, + and FLUID from Matthew Morrise. + - Fl_Chart didn't have its own destructor, so data in + the chart wasn't freed. + - Fl_Menu_Button no longer responds to focus or keyboard + events when box() is FL_NO_BOX. + - FLTK convenience dialogs put the buttons in the wrong + order. + - Fl_BMP_Image didn't load 4-bit BMP files properly. + - Minor tweeks to the WIN32 DLL support. + - Fl_Text_Display::resize() could go into an infinite + loop if the buffer is emptied. + - Fl::handle() didn't pass FL_RELEASE events to the + grab() widget if pushed() was set (for proper menu + handling...) + - DND events were being sent to the target window + instead of the target widget under WIN32. + - The newest Cygwin needs the same scandir() handling as + HP-UX. + - FLUID didn't register the image formats in the + fltk_images library, and had some other image + management problems. + - Fixed one more redraw bug in Fl_Browser_ where we + weren't using the box function to erase empty space in + the list. + - Fl_Text_Display::buffer() now calls resize() to show + the buffer. + - Fl_Help_View didn't support HTML comments. + - Fl_Help_View didn't include the extra cellpadding when + handling colspan attributes in cells. + - Fl_Help_View didn't support table alignment. + + +CHANGES IN FLTK 1.1.0rc6 + + - Documentation updates. + - Fl::handle() didn't apply the modal tests for + FL_RELEASE events, which caused Fl_Tabs to allow users + to change tabs even when a modal window was open. + - Fl_Browser_, Fl_Input_, Fl_Slider now use the box + function to erase the background. This fixes some + long-standing redraw problems. + - More snprintf/strlcpy/strlcat changes where needed. + - Fl::get_font_name() would leak 128 bytes. + - Eliminated most of the "shadowed" variables to avoid + potential problems with using the wrong copy of "foo" + in a class method. + - Moved Fl_BMP_Image, Fl_GIF_Image, and Fl_PNM_Image to + the fltk_images library, so the only image formats + that are supported by the core library are XBM and XPM + files. This reduces the size of the FLTK core library + by about 16k... + - The Fl_Text_Display::resize() method was incorrectly + flagged as protected. + - Fixed some memory/initialization bugs in + Fl_File_Chooser that valgrind caught. + - The PNG library png_read_destroy() is deprecated and + does not free all of the memory allocated by + png_create_read_struct(). This caused a memory leak in + FLTK apps that loaded PNG images. + - Added uncache() method to Fl_Image and friends. + - Added image() methods to Fl_Menu_Item. + - Added default_cursor() method and data to Fl_Window. + - Fl_Group would send FL_ENTER events before FL_LEAVE + events, causing problems with adjacent widgets. + - Fixed filename problems with Fl_File_Chooser - + changing the filename field directly or choosing files + from the root directory could yield interesting + filenames. + - Fl_Input_ could crash if it received an empty paste + event. + - The mouse pointer now changes to the I beam + (FL_CURSOR_INSERT) when moved over an input field or + text widget. + - "make install" didn't automatically (re)compile the + FLUID executable. + - Added an Fl::get_boxtype() method to get the current + drawing function for a specific box type. + - Fl_Output and Fl_Multiline_Output didn't prevent + middle-mouse pastes. + - Fl_JPEG_Image didn't compile out-of-the-box with Cygwin + due to a bug in the Cygwin JPEG library headers. + - Fl_BMP_Image still didn't work with some old BMP files. + - "make distclean" didn't really clean out everything. + - Tweeked the look of the check button with a patch from + Albrecht Schlosser. + + +CHANGES IN FLTK 1.1.0rc5 + + - Added "wrap" type bit to Fl_Input_, so you can now + have a multiline text field that wraps text. + - Setting the value() of an output text field no longer + selects the text in it. + - Output text fields now show a caret for the cursor + instead of the vertical bar. + - The newButton and previewButton widgets are now public + members of the Fl_File_Chooser class. This allows + developers to disable or hide the "new directory" and + "preview" buttons as desired. + - Added new visible focus flag bit and methods to + Fl_Widget, so it is now possible to do both global and + per-widget keyboard focus control. + - Removed extra 3 pixel border around input fields. + - No longer quote characters from 0x80 to 0x9f in input + fields. + - Improved speed of Fl_Browser_::display() method with + large lists (patch from Stephen Davies.) + - Fl_Help_View didn't properly handle NULL from the link + callback (the original filename/directory name were + not preserved...) + - Fl_Help_View didn't use the boxtype border values when + clipping the page that was displayed. + - Added first steps to CodeWarrior/OS_X support (see + fltk-1.1.x/CodeWarrior/OS_X.sit) + - Cleaned up the WIN32 export definitions for some of + the widget classes. + - Fixed a filename completion bug when changing + directories. + - Fl_File_Chooser::value() would return directories with + a trailing slash, but would not accept a directory + without a trailing slash. + - When installing shared libraries, FLUID is now linked + against the shared libraries. + - MacOS: missing compile rule for .dylib files. + - Fl_Group::current(), Fl_Group::begin(), and + Fl_Group::end() are no longer inlined so that they are + properly exported in DLLs under WIN32. Similar + changes for all static inline methods in other + classes. + - MacOS: support for Mac system menu (Fl_Sys_Menu_Bar) + - MacOS: wait(0) would not handle all pending events + - Added new makeinclude file for MingW using GCC 3.1.x. + - Fl_Choice::value(n) didn't range check "n". + - The MingW and OS/2 makeinclude files didn't have the + new fltk_images library definitions. + - Fl_Text_Editor didn't scroll the text in the widget + when dragging text. + - Config header file changes for Borland C++. + - FLTK didn't provide a Fl::remove_handler() method. + + +CHANGES IN FLTK 1.1.0rc4 + + - Added new filter_value() methods to Fl_File_Chooser to + get and set the current file filters. + - Added support for custom filters to Fl_File_Chooser. + - Added Borland C++ Builder IDE project files from + Alexey Parshin. + - Resource leak fixes under WIN32 from Ori Berger. + - Now register a WIN32 message for thread messages. + - Fl_Window didn't initialize the min and max window + size fields. + - The JPEG and PNG image classes have been moved to the + fltk_images library, a la FLTK 2.0. You can register + all image file formats provided in fltk_images using + the new fl_register_images() function. + - Fl_XBM_Image didn't correctly load XBM files. + - MacOS: Added Greg Ercolano's file descriptor support. + - MacOS: Fixed text width bug. + - A change in fl_fix_focus() broken click-focus in FLWM. + - Cygwin with -mnocygwin didn't like the FL/math.h + header file. + - Fl_Browser_ cleared the click count unnecessarily. + - MacOS: Pixmap draw fix, gl_font implemented + FL_FOCUS fix, window type fix for modal and nonmodal + windows, glut uninitialised 'display' proc fix + - Now support FLTK_1_0_COMPAT symbol to define + compatibility macros for the old FLTK 1.0.x function + names to the 1.1.x names. + - Now translate the window coordinates when a window is + shown, moved, or resized. This should fix the "menus + showing up at the wrong position" bug under XFree86. + - Fixed some more problems with the Fl_BMP_Image file + loader. + - BC++ fixes. + - The pixmap_browser demo didn't check for a NULL image + pointer. + - Fl_File_Icon::find() now uses fl_filename_isdir() + under WIN32 to check for directories. + - Fl_File_Chooser's preview code called refcount() + on the deleted image's object. + - Fixed another problem with the Fl_BMP_Image loader. + - The fl_file_chooser() callback was being called with a + NULL filename. + - Documented that fl_push_clip() is preferred over + fl_clip(), with a corresponding source change. + - Minor changes to the MacOS X event handling code. + - Added syntax highlighting example code to the editor + test program. + - Fl_Text_Display didn't range check style buffer + values. + - Added "dark" color constants (FL_DARK_RED, etc.) + - The MacOS font code was missing definitions for + fl_font_ and fl_size_. + + +CHANGES IN FLTK 1.1.0rc3 + + - Documentation updates. + - New file chooser from design contest. + - Did some testing with Valgrind and fixed some memory + problems in Fl_Help_View::Fl_HelpView, + Fl_Menu_::remove(), Fl_Text_Display::draw_vline(), and + resizeform() (convenience dialogs). + - Fixed some redraw() bugs, and now redraw portions of + the parent widget when the label appears outside the + widget. + - The boolean (char) value methods in Fl_Preferences + have been removed since some C++ compilers can't + handle char and int value methods with the same name. + - Added fl_read_image() function. + - Fixed Fl_Valuator::format() so that the correct format + type is used when step == 1.0. + - Fl_Help_View didn't support the TT markup. + - Fl_Shared_Image used a double-pointer to the image + handler functions, which was unnecessary and + unintuitive. + - Fl_PNM_Image didn't load the height of the image + properly. + - Fl_BMP_Image, Fl_JPEG_Image, Fl_PNG_Image, and + Fl_Shared_Image didn't delete image data that was + allocated. + - Enabled the OpenGL and threads demos when compiling + for MingW. + - Fl_File_Input didn't update the directory buttons if a + callback was registered with the widget. + - The file chooser would return the last selected + file(s) when cancel was pressed. + - The file chooser limited the resizing of the chooser + window unnecessarily. + - Fixed WM_PAINT handling under WIN32. + - Minor tweeks to MingW and OS/2 config headers. + - Fl_Value_Input now correctly determines if step() + specifies an integer value. + - Fl_Help_View didn't add links inside PRE elements. + - OS/2 build fixes from Alexander Mai. + - Now use strlcat() instead of strncat() which could + cause buffer overflows. + - Now use of strlcpy() instead of strncpy() to simplify + the code. + - Drag-n-drop under WIN32 now shows a [+] cursor instead + of the link cursor. + - Fixed widget width tooltip and default argument + handling code in FLUID. + - Fixed colors used when drawing antialiased text using + Xft. + - Fl_Preferences::makePath() now uses access() instead + of stat() when checking to see if the destination + directory already exists. + - Fl_BMP_Image now supports older BMP files with the 12 + byte header. + - Optimized the redrawing of tabs and radio/check + buttons when the keyboard focus changes. + - More tooltip fixes. + - DND text operations would loop under X11. + + +CHANGES IN FLTK 1.1.0rc2 + + - Portability fixes. + - Backported 2.0 tooltip changes. + - Several of the valuators did not support tooltips. + - The last menu item in a menu didn't pick up on font + changes. + - FLUID now properly handles default argument parameters + properly. + - Fixed WM_PAINT handling under WIN32 - didn't validate + the correct region that was drawn. + - Fl_Multiline_Output would insert the enter key. + - Fl_File_Browser didn't clip items to the column width. + - Fl_Window::draw() cleared the window label but didn't + restore it, so windows could lose their titles. + - Eliminated multiple definitions of dirent structure + when compiling under WIN32. + - Adjusted the size of the circle that is drawn inside + radio buttons to scale better for larger labels. + - FLUID was opening the display when it shouldn't have. + - Fl_File_Chooser.cxx defined the file chooser functions + again; they should only be defined in the header file. + - Wide arcs would draw with "teeth". + - The preferences demo included Fl/Fl_Preferences.H + instead of FL/Fl_Preferences.H. + + +CHANGES IN FLTK 1.1.0rc1 + + - The fl_file_chooser() and fl_dir_chooser() functions + now support an optional "relative" argument to get + relative pathnames; the default is to return absolute + pathnames. + - The backspace and delete keys now work as expected in + the file chooser when doing filename completion. + - FLUID now supports running shell commands. + - New Fl_File_Input widget that shows directory + separators with filename in input field. + - The Fl_File_Chooser dialog now shows the absolute path + in the filename field using the Fl_File_Input widget. + - FLUID now keeps track of grid, tooltip, and other + GUI options, along with the last 10 files opened. + - Tooltip windows would show up in the task bar under + WIN32. + - Now append trailing slash to directory names in names + in WIN32 version of scandir(). This takes care of a + file chooser performance problem with large + directories. + - Added Fl_Preferences class from Matthias Melcher, + including binary data support. + - FLUID now recognizes the "using" keyword in + declarations. + - fl_file_chooser() didn't highlight the requested file + the second time the file chooser dialog was shown. + - Fixed rendering of Fl_Light_Button with the plastic + scheme. + - Fixed a bug in the MacOS font enumeration code. + - Now show a "locked" icon next to static/private + elements in FLUID, and "unlocked" icon next to + global/public elements. + - Implemented Fl_Menu_Item image labels using older + 1.0.x labeltype method. + - Updated the PNG library check to support both png.h + and libpng/png.h. + - Fixed a recursion bug in tooltips that was causing + random crashes. + - fl_file_chooser() could cause a segfault when passed a + NULL filename parameter in some situations. + - Added a "-g" option to fltk-config to support quick + compiling with debugging enabled. + - Fixed redraw problem with Fl_Input and anti-aliased + text. + - Added threading support for MacOS X and Darwin. + - The filesystem list in the file chooser now works under + MacOS X and Darwin. + - The fl_msg structure now contains all data passed to + the WndProc function under WIN32. + - Fixed some window focus/positioning problems under + MacOS X. + - Added fl_create_alphamask() function to create an alpha + mask from 8-bit data; currently this always generates a + 1-bit screen-door bitmask, however in the future it will + allow us to generate N-bit masks as needed by various + OS's. + - Fl_File_Browser::load() didn't properly show drives + when compiled in Cygwin mode. + - Now pass correctly pass keyboard and mouse events to + widget under tooltip as needed... + - Added new Fl::dnd_text_ops() methods to enable/disable + drag-and-drop text operations. + - Fl_Input now supports clicking inside a selection to + set the new text position when drag-and-drop is + enabled. + - Added support of X resources for scheme, dnd_text_ops, + tooltips, and visible_focus... + - Fixed some case problems in includes for the MacOS X + code. + - Fl_Widget::handle() returned 1 for FL_ENTER and + FL_LEAVE events, which caused some compatibility + problems with 1.0 code. + - Fl_Box::handle() now returns 1 for FL_ENTER and + FL_LEAVE events so that tooltips will work with Fl_Box + widgets. + - Some source files still defined strcasecmp and + strncasecmp under WIN32. + - Some source files still used the "false" and "true" + C++ keywords, even though several of our "supported" + C++ compilers don't support them. Using 0 and 1 until + FLTK 2.0 (which uses the bool type instead of int for + any boolean values...) + - Minor Fl_Color revamping, so that color constants map + to the color cube and FL_FOREGROUND_COLOR, + FL_BACKGROUND_COLOR, FL_BACKGROUND2_COLOR, + FL_INACTIVE_COLOR, and FL_SELECTION_COLOR map to the + user-defined colors. + + +CHANGES IN FLTK 1.1.0b13 + + - Fixed a bug in the Xft support in Fl_Window::hide() + (the config header wasn't included, so the Xft code + wasn't getting called) + - Xdbe support must now be enabled explicitly using + --enable-xdbe due to inconsistent bugs in XFree86 and + others. + - Windows resized by a program would revert to their + original size when moved under WIN32. + - Cygwin can only compile the new WIN32 drag-n-drop code + using GCC 3.x. + - Tooltips now appear for inactive and output widgets. + - Tooltips no longer steal keyboard events other than + ESCape. + - Tooltips are no longer delayed when moving between + adjacent widgets. + - fl_beep(FL_BEEP_DEFAULT) now uses the PC speaker under + Windows (0xFFFFFFFF) rather than an event sound. + - The configure script didn't include the -mwindows or + -DWIN32 compiler options in the output of fltk-config + when using the Cygwin tools. + - Fl_Output didn't take input focus when needed, so it + was unable to support CTRL-C for copying text in the + field and did not unhighlight selections when the + widget lost focus. + - The fl_filename_name() function didn't handle a NULL + input string. + - The input field used by the fl_input() and + fl_password() functions was resized too small in + 1.1.0b12. + - Added casts in fl_set_fonts_win32.cxx for VC++ 5.0. + - Fl_File_Icon::find() did not check the basename of a + filename for a match; this caused matches for a + specific filename (e.g. "fluid") to fail. + - The Fl_Shared_Image class now supports additional + image handling functions - this allows you to support + additional image file formats transparently. + + +CHANGES IN FLTK 1.1.0b12 + + - Documentation updates. + - Fl_Choice didn't clip the current value properly - it + wasn't accounting for the box border width. + - The forms compatibility functions are now placed in a + "fltk_forms" library to match FLTK 2.0. + - Renamed down() and frame() to fl_down() and + fl_frame(), filename_xyz() to fl_filename_xyz(), and + all of the define_FL_FOO() functions for the custom + boxtypes to fl_define_FL_FOO() to avoid namespace + clashes. + - Stereo OpenGL support (patch from Stuart Levy) + - All of the convenience functions defined in fl_ask.H + now resize the widgets and dialog window as needed for + the labels and prompt. + - Backported FLTK 2.0 dual cut/paste buffer code. + - Added support for Xft library to provide anti-aliased + text on X11. + - Fl_Help_View didn't keep track of the background color + of cells properly. + - Fl_Browser::item_width() didn't compute the width of + the item properly when column_widths() was set. + - Fl_Button didn't check to see if the widget could + accept focus before taking input focus. + - Fl_Help_View didn't preserve target names (e.g. + "filename.html#target") when following links. + - Drag-and-drop support for MacOS. + - Updated MacOS issues documentation. + + +CHANGES IN FLTK 1.1.0b11 + + - Now conditionally use the WIN32 TrackMouseEvent API + (default is no...) + - Fixed a table rendering bug in the Fl_Help_View + widget. + - The fltk-config script now recognizes all common C++ + extensions. + - The menu code was using overlay visuals when the + scheme was set to "plastic". + - Fixed some drawing problems with Fl_Light_Button and + its subclasses. + - Fixed a minor event propagation bug in Fl_Group that + caused mousewheel events to be passed to scrollbars + that were not visible. + - The fl_file_chooser() function did not preserve the + old file/directory like the old file chooser did. + - The prototypes for fl_input() and fl_password() did + not default the "default value" to NULL. + - Fl_Tabs now draws tabs using the selection_color() of + the child groups; this allows the tabs to be colored + separately from the body. Selected tabs are a mix of + the Fl_Tabs selection_color() and the child group's + selection_color(). + - Fl_Tabs didn't include images in the measurement of + the tabs if no label text was defined. + - The WIN32 code didn't return 0 from the window + procedure after handling WM_PAINT messages. + - fl_draw() would incorrectly test the clipping of + labels the lay outside the bounding box. + - filename_relative() didn't always return the correct + relative path. + - Updated the test makefile to work with more versions + of "make". + - Added new "--with-optim" configure option to set the + optimization flags to use when compiling FLTK. + - The fltk-config script no longer reports the + optimization flags that were used to compile FLTK. + - Initial port of FLTK 2.0 drag-and-drop support. + + +CHANGES IN FLTK 1.1.0b10 + + - Fixed the new WIN32 TrackMouseEvent code. + - Fixed the VC++ project files to link against + comctl32.lib. + + +CHANGES IN FLTK 1.1.0b9 + + - Better FL_LEAVE event handling for WIN32. + - The alpha mask was bit-reversed. + - Fl::scheme() applied the scheme tile image to overlay + and menu windows, which caused problems when the + overlay planes were in use. + - Fixed Fl::event_button() value when hiding tooltip on + some systems. + - Added Fl_BMP_Image class to support loading of Windows + bitmap (BMP) files. + - The shiny demo didn't work on some systems (no + single-buffered OpenGL visual), and the new box types + were reset when show(argc, argv) was called. + - Fl::scheme() didn't update windows that were not + shown. + - The fractals demo would get far ahead of the UI with + some Linux OpenGL drivers. Now use glFinish() instead + of glFlush() so we are at most 1 frame ahead. + - The fractals demo Y axis controls were backwards for + the "flying" mode. + - MacOS: cleaned up src/Fl_mac.cxx + - MacOS: fixed Fl::wait(0.0), fixed Cmd-Q handling + - Update CygWin support for Fl::add_fd(). + - Update the plastic scheme to not override the default + colors - move the color code to the MacOS-specific + code. Also updates the tile image colormap to match + the current background color. + - Add fl_parse_color() to X11 as well, removing a bunch + of conditional code and providing a common interface + for looking up color values. + - Fixed the make problems in the test directory - some + make programs had trouble handling the recursive + dependencies on the FLUID files... + - Now use rint() to round floating-point coordinates. + - Demo cleanup - made sure they all worked with schemes. + - Fl_Tabs no longer clears the unused area of the tab + bar. + - Added show(argc, argv) method to Fl_Help_Dialog. + - MacOS: implemented cut/copy/paste. + - MacOS: improved keyboard handling, fixed keyboard + focus handling, fixed get_key, modified 'keyboard' + demo to show second mouse wheel and additional keys + 'help' and FL_NK+'=' + + +CHANGES IN FLTK 1.1.0b8 + + - OS/2 build fixes. + - fl_draw() didn't ignore symbol escapes properly for + the browsers... + - New Fl::scheme() methods from FLTK 2.0; currently only + the standard ("") and plastic ("plastic") methods are + supported. Schemes can be set on the command-line + ("-scheme plastic") or using the FLTK_SCHEME + environment variable. + - MacOS: fixed iBook keyboard handling, moved + remaining message handling to Carbon, added mouse + capture support, added timer support, added overlay + support, fixed double-buffering side effects. + - The configure script wasn't using the -fpermissive or + -fno-exceptions options with GCC. + - Fl_JPEG_Image and friends didn't set the depth if the + image file couldn't be loaded; since Fl_RGB_Image + didn't check for this, it could fail when displaying + or copying these images. + - filename_absolute() did not always free its temporary + buffer. + - filename_relative() did not do a case-insensitive + comparison under MacOS, OS/2, and Windows. + - filename_isdir() didn't properly handle "D:L" under + WIN32. + - Fl_Shared_Image::get() did not check to see if the + image could not be loaded. + - Fl_Help_View didn't clear the line array in the + Fl_Help_Block structure; this causes erratic + formatting for some pages. + - The font and size members of Fl_Help_Block were never + used. + - The threading functions (Fl::lock() and friends) were + not exported under WIN32. + - The Fl_Text_Display destructor deleted the scrollbars + twice... + - Fl_Help_View didn't reset the horizontal scroll + position when showing a new page. + - Fl_Pack now allows any child widget to be the + resizable() widget, not just the last one. + - MacOS: opaque window resizing, all events except + Mac menus are now handled using Carbon, window + activation fixed, GL_SWAP_TYPE default changed to + make gl_overlay work. + - Fl_Help_View::resize() didn't resize the horizontal + scrollbar. + - MacOS: list all fonts, fixed clipping and mouse + pointer bugs. + - The Fl_File_Chooser widget now uses hotspot() to + position the dialog under the mouse pointer prior to + showing it. + - Added a configure check for *BSD - use -pthread option + instead of -lpthread. + - Fl_Text_Display could get in an infinite loop when + redrawing a portion of the screen. Added a check for + the return value from fl_clip_box() so that the + correct bounding box is used. + - Removed the Fl_Mutex and Fl_Signal_Mutex classes from + the threads example, since they weren't being used + and apparently are not very portable. + - Fl_Help_View now ignores links when the link callback + returns NULL, and displays a sensible error message + when an unhandled URI scheme is used (e.g. http:, + ftp:) + - Fl_File_Icon::load_system_icons() no longer complains + about missing icon files, just files that exist but + can't be loaded. + - FLUID didn't list the plastic box and frame types. + - Now hide the tooltip window whenever a window is + hidden. Otherwise a tooltip window could keep an + application running. + - Updated FLUID to only append a trailing semicolon to + code lines in a callback (so "#include" and friends + will work...) + - The Fl_Color_Chooser widget now supports keyboard + navigation. + - Fixed button and valuator widgets to call Fl::focus() + instead of take_focus(). + - Tweeked the radio button drawing code for better + circles with different boxtypes. + - The Fl_File_Chooser widget did not provide a shown() + method, and fl_file_chooser() and fl_dir_chooser() did + not wait on shown(); this would cause them to return + prematurely if you switched desktops/workspaces. + - Cosmetic changes to plastic boxtypes. Now look much + better for large areas and the buttons now have a much + greater "3D" feeling to them. + - Added new Fl::draw_box_active() method so that + boxtypes can find out if the widget they are drawing + for is active or not. + - Fl_Button and its subclasses did not redraw the parent + when the boxtype was FL_NO_BOX and they lost keyboard + focus (the parent redraw clears the focus box.) + - Fixed the example program makefile - wasn't building + the mandelbrot and shiny demos right. + - Fl::set_font(Fl_Font, Fl_Font) was not implemented. + - Fixed the documentation Makefile commands; was not + using the fltk.book file for some reason... + + +CHANGES IN FLTK 1.1.0b7 + + - More documentation updates... + - Mac OS X support works 95% + - The Fl_Window::hotspot() off-screen avoidance code was + commented out. + - Mac OS X uses mostly Carbon event handling to support + Mousewheel, three buttons, all modifier keys, etc. + - Updated paragraph 4 of the FLTK license exceptions; + there was some question about the requirement to show + that a program uses FLTK, which is required by section + 6 of the LGPL. The new exemption specifies that + inclusion of the FLTK license is not required, just a + statement that the program uses FLTK. + - Fl_Button::handle() was calling take_focus() for both + FL_PUSH and FL_DRAG. + - File and memory fixes for Fl_GIF_Image, Fl_PNG_Image, + Fl_PNM_Image, Fl_Shared_Image, Fl_Tiled_Image, and + Fl_XBM_Image. + - filename_match() didn't handle backslashes properly + under WIN32, and didn't use a case-insensitive + comparison under MacOS X. + - The Fl class was missing access methods for the + FL_MOUSEWHEEL event values - Fl::event_dx() and + Fl::event_dy(). + - The default help string didn't include the -nokbd + option. + - "make uninstall" didn't uninstall the static OpenGL + widget library. + - Mac cursor shapes added... + - Fl_Text_Display would lockup when all text was + deleted; for example, when running the editor + demo, you couldn't load a second file. + - Added Fl::lock() and friends from FLTK 2.0 to + support multi-threaded applications; see the + "threads" demo for an example of this. + - Fl_Check_Button and Fl_Round_Button now use the + FL_NO_BOX box type to show the background of the + parent widget. + - Tweeked the plastic boxtype code to draw with the + right shading for narrow, but horizontal buttons. + - Fl_Progress now shades the bounding box instead of + drawing a polygon inside it. + - Fl::warning() under WIN32 defaults to no action. This + avoids warning dialogs when an image file cannot be + loaded. + - Some Win32 drivers would draw into wrong buffers + after OpenGL mode change + - The file chooser would cause a segfault if you + clicked in an empty area of the file list. + - Fl_File_Icon::labeltype() would cause a segfault + if the value pointer was NULL. + - Fl_File_Icon::load_image() could cause segfaults + (NULL data and incrementing the data pointer too + often.) + - Fl_File_Icon::load_image() now handles 2-byte + per color XPM files. + - Some Win32 drivers would draw into wrong buffers + after OpenGL mode change. + - Message handling and Resources for MacOS port. + - Fl_Help_View could get in an infinitely loop when + determining the maximum width of the page; this + was due to a bug in the get_length() method with + percentages (100% width would cause the bug.) + - Don't need -lgdi32 for CygWin, since -mwindows + does this for us. + - The WIN32 event handler did not properly handle + WM_SYNCPAINT messages. + - Fl_Tabs now uses the boxtype exclusively to draw + both the tabs and surrounding box, so alternate + box types actually work and the look is a little + nicer. + - Fixed the drawing of large areas with the new + plastic boxtypes. + - Updated the Visual C++ demo projects to use FLUID + to generate the GUI files as needed. + - The demo program didn't load the right menu file + when compiled for debugging under WIN32. + - Added plastic box types to forms demo. + - Added mousewheel to keyboard demo. + - The Fl_Text_Editor widget caused an infinite loop + when it received keyboard focus. + - filename_isdir() didn't properly handle drive letters + properly; WIN32 needs a trailing slash for drive + letters by themselves, but cannot have a trailing + slash for directory names, go figure... + - The Fl_Text_Buffer and Fl_Text_Display classes did not + initialize all of their members. + - fl_normal_label() had a totally redundant set of + if/else tests, which the new code handles all from + fl_draw(). + - The Fl_File_Chooser dialog contained two hotspots. + - The fl_draw_pixmap() function didn't free the 2-byte + color lookup table properly (delete instead of + delete[]). + - fl_draw() reset the text color under WIN32, causing + bitmaps to draw incorrectly. + - Fl::get_font_sizes() is now implemented under WIN32. + - Fl_Text_Display now uses the same default colors for + selection and text as Fl_Input_ and friends. + - Changed the default line scrolling in Fl_Text_Display + to 3 lines for the mouse wheel and scrollbar arrows. + + +CHANGES IN FLTK 1.1.0b6 + + - Documentation updates... + - The configure script now works within the CygWin + environment. + - Tooltips are now enabled by default, but are not + re-enabled when calling the Fl_Widget::tooltip() + method. + - Added new Fl::version() method to get the current + FLTK library version (for shared libraries/DLLs) + - Added new Fl::event() method to get the current + event that is being processed. + - Added new fl_beep() function to do audible + notifications of various types. + - Added new Fl_GIF_Image, Fl_JPEG_Image, Fl_PNG_Image, + Fl_PNM_Image, Fl_XBM_Image, and Fl_XPM_Image classes. + - Added new Fl_Shared_Image class, a la FLTK 2.0. + - Added new Fl_Tiled_Image class for tiled backgrounds. + - Added new copy(), desaturate(), inactive(), and + color_average() methods to the Fl_Image classes. + - Added a horizontal scrollbar to the Fl_Help_View + widget. + - Added new FL_PLASTIC_{UP/DOWN}_{BOX/FRAME} boxtypes + for a more "modern" look (sort of a cross between KDE + 2.2 and Aqua.) + - Fl_Float_Input and Fl_Int_Input no longer accept + pasted text that is not a floating point or integer + value. Pasted numbers now replace text in these + widgets. + - Implemented the Fl_File_Icon::load_png() method. + - The Fl_File_Icon::load_system_icons() method now + supports KDE 2.x icons. + - Fixed PNG support in Fl_Help_View. + - Removed the "Microsoft" mode button from the menubar + demo. + - The browser demo now makes sure that the input field + contains a number. + - The Fl_Browser::make_visible() method now range checks + the input. + - Updated the fl_draw() and fl_measure() methods to + accept an optional draw_symbols argument, which + controls whether symbols are drawn in the text. + - Added new Fl::visible_focus() methods to control + whether the focus box is drawn. + - The focus box is now drawn using the contrast color. + - Fl_Repeat_Button didn't accept keyboard focus. + - Added new Fl::visible_focus() method and standard + "-kbd" and "-nokbd" options in Fl::args() processing + to control whether keyboard focus is shown and handled + by non-text widgets. + - The wrong tooltip could be shown if the user moved the + mouse over adjacent widgets with tooltips. + - The drop-down button on Fl_Choice widgets was not + limited in width. + - Tooltips could appear off the screen. + - Mouse wheel events are now sent to the focus widget + first, then to any other interested widget. + - The Fl_RGB_Image class now supports images with an + alpha channel. Images are currently drawn using + "screen door" transparency... See the "image" demo + for an example. + - Added new fl_create_bitmask() and fl_delete_bitmask() + functions that create bitmap objects for masking and + bitmap drawing. + - Was sending FL_RELEASE events for buttons 4 and 5 + under X11, which are only for FL_MOUSEWHEEL. + - Fl_Help_View now supports the EM and STRONG elements. + - Didn't do callbacks when changing tabs via keyboard. + - FLUID didn't write tooltip strings to the message + catalog file. + - Fl_File_Icon now uses Fl_Shared_Image to load icon + images; the load_png() and load_xpm() methods have + been replaced by a single load_image() method. + - Fl_File_Icon::load_system_icons() now does a better + job of finding KDE icons. + - Now use Fl::warning() and Fl::error() in place of + printf's in some of the newer widgets. + - The default behavior of Fl::error() is now to display + an error but not to exit; Fl::fatal() still exits. + - FLUID now uses the Fl_Shared_Image class, so FLUID- + generated GUIs can embed any of the supported image + file formats. + - New filename_relative() function to convert an + absolute filename to a relative one. + - Updated the filename_absolute(), filename_expand(), + and filename_setext() functions to take the + destination string size, with inline functions for the + old FL_PATH_MAX size. + - fl_file_chooser() and fl_dir_chooser() now return a + relative path. + - Fl_Help_View now supports all ampersand escapes. + + +CHANGES IN FLTK 1.1.0b5 + + **** NOTE: DUE TO CHANGES IN THE WIDGET CLASSES, **** + **** YOU MUST RECOMPILE ALL SOURCE FILES **** + **** THAT USE FLTK!!! **** + + - All FLTK color values are now 32-bits and support + both the legacy 8-bit color values as well as 24-bit + RGB values (0xRRGGBB00 for 24-bit RGB, 0x000000II + for indexed color). + - Fl::set_boxtype() and fl_internal_boxtype() now keep + track of when a boxtype is changed; this allows you to + override the "special" boxtypes without references to + those boxtypes causing them to be reset. + - Fl_Help_Func now takes a Fl_Widget pointer as well as + a pathname. + - Added code to support FL_KEYUP events. + - Focus did not return to the Fl_Text_Display and Editor + widgets when scrolling and then clicking inside the + editor window. + - Now set the line size of the vertical scrollbar in the + text editor to 1. + - The symbols demo didn't show the strings needed to + show the corresponding symbol (the label string was + not quoted...) + - FLTK should now compile with Cygwin cleanly. + - Shortcut changes were not being saved by FLUID. + - FLUID didn't write the deimage() static data. + + +CHANGES IN FLTK 1.1.0b4 + + **** NOTE: DUE TO CHANGES IN THE FL_WIDGET CLASS, **** + **** YOU MUST RECOMPILE ALL SOURCE FILES **** + **** THAT USE FLTK!!! **** + + - Updated the flags_ member of Fl_Widget to be an + integer instead of uchar, to support the new + FL_OVERRIDE flag for Fl_Window. + + - The parent() method of Fl_Widget now uses pointers to + Fl_Group instead of Fl_Widget. + + - Fl_Window now provides the FLTK 2.0 "override()" and + "set_override()" methods for windows. + + - Added a configure check (and warning) for GCC 3.0.x. + + - Updated the configure script to check for the + png_set_tRNS_to_alpha() function. + + - Updated the config.h files for all platforms for the + image and FLTK documentation defines. + + - Updated the makeinclude files for all platforms to + match the current makeinclude.in file. + + - FLUID would crash if you cleared an image for a + widget. + + - Fl_Help_View::add_image() did not initialize the image + member of the base (unscaled) image. + + - Fl_Help_View didn't support A elements with both a + NAME and HREF attribute - the HREF was ignored. + + - Miscellaneous compile warning fixes. + + - Tooltips were being reset by Fl::belowmouse(), which + caused problems with the FLUID main window (flashing + tooltip windows and serious problems with KDE 2.2) + + - The editor demo had the save and discard button + actions reversed. + + - The Fl_Help_View widget now uses + png_destroy_read_struct() if the older + png_read_destroy() function is not available. + + - The WIN32 DLL library now includes the OpenGL widgets. + This is a simpler solution for the export/import + dillemma under WIN32, as OpenGL and non-OpenGL symbols + need to be exported at different times with the + separate library scheme. Since OpenGL is standard + under Windows, this is less of a problem than under + UNIX... + + +CHANGES IN FLTK 1.1.0b3 + + - The top-level makefile did not include the makeinclude + file, causing the fltk-config installation commands to + fail. + + - The fl_file_chooser.cxx source file conflicted with + Fl_File_Chooser.cxx under Windows. Similarly, the + fl_file_chooser.H header file conflicts with the + Fl_File_Chooser.H header file. + + - Now save and restore the GDI pen object when + responding to WIN32 paint messages. + + - Documentation updates from A. Suatoni. + + +CHANGES IN FLTK 1.1.0b2 + + - New fltk-config script. + + - Fixed image/text label handling; in b1 the label + needed a non-blank text string to display the image. + This bug also caused all sorts of crashes and display + problems. + + - Added new filetype() method to Fl_FileBrowser to allow + for file or directory browsing. + + - Fixed the drawing of the focus box around + Fl_Return_Button. + + - Fixed menu item measurement bug (wasn't initializing + image pointers to 0...) + + - Radio and checkbox menu items now draw with the new + style (round radio buttons with dots and square check + buttons with check marks.) + + - Improved the appearance of Fl_Check_Button. + + - Improved the Fl_HelpView table formatting code; now + dynamically sizes the table columns, and supports + COLSPAN. + + - The FLUID keyboard shortcuts now work as expected + (CTRL-C copies, SHIFT-CTRL-C writes code, etc.) + + - The FLTK_DOCDIR environment variable can now be + used to tell FLUID where to find the on-line + documentation files. + + - FLUID now supports image labels in addition to text + labels + text over image alignment. + + - FLUID now supports tooltips. + + - The widget panel in FLUID is now tabbed, a la FLTK + 2.0. + + - The FLUID pixmap destructor tried to free 1 too many + lines of image data. + + - FLUID now provides on-line help. + + - Changed Fl_FileXYZ to Fl_File_XYZ. + + - Changed Fl_HelpXYZ to Fl_Help_XYZ. + + - Tooltip fixes for Fl_Browser_, Fl_Choice, and Fl_Input_. + + - Added tooltips to FLUID, help dialog, and file chooser. + + - Now load system icons in FLUID. + + +CHANGES IN FLTK 1.1.0b1 + + - Added new image() and deimage() methods to support + image + text labels more easily. + + - Added new alignment bit FL_ALIGN_TEXT_OVER_IMAGE. + + - Added tooltip support using Jacques Tremblay's tooltip + patch. + + - Added keyboard navigation to all widgets. + + - Added support for mouse wheels using the new + FL_MOUSEWHEEL event type. Get the mouse wheel + movement values from Fl::e_dx (horizontal) and + Fl::e_dy (vertical). + + - Added the Fl_Check_Browser, Fl_FileBrowser, + Fl_FileChooser, Fl_FileIcon, Fl_HelpDialog, + Fl_HelpView, Fl_Progress, and Fl_Wizard widgets from + the bazaar. + + - Added 2.0 Fl_Text_Display and Fl_Text_Editor widgets + based on NEdit. + + - The Fl_Choice widget now looks more line a combo box + than a Motif option menu. + + - Moved the OpenGL widgets into a separate library + called fltkgl - this eliminates shared library + dependencies on OpenGL when no OpenGL functionality is + used/required. + + - FLUID now supports the new Fl_CheckBrowser, + Fl_FileBrowser, Fl_FileIcon, Fl_HelpView, + Fl_Text_Display, Fl_Text_Editor, and Fl_Wizard + widgets. + + - Updated configure stuff to support shared libraries + under AIX (link to -lfltk_s) + + - Symbol labels can now contain regular text. + + - FLUID now supports relative filenames for the source + and header files you generate. + + - Fl_Menu_Item::add() didn't use the flags that were + passed in. + + - Fixed a bug in Fl_Scrollbar - clicking in the "trough" + of the scrollbar would move the scroller in the wrong + direction. + + - Made the Forms pixmap parameter const to match the + Fl_Pixmap.H definitions. + + - Changed the Fl_Pixmap constructor to use the explicit + keyword which should work for all C++ compilers. + + - Fl_Menu_add of a menu item with the same name as an + existing submenu title would mess up by replacing that + menu title, it now adds a new item. + + - Fl_Menu::add() of text starting with '/' to a menu is + assummed to be a filename. So "/foo/bar" creates a + single menu item. You can also put filenames into + submenus by doing "submenu//foo/bar", this will create + a submenu called "submenu" with an item "/foo/bar". + Menu items starting with "\_" will insert an item + starting with '_' rather than a divider line. These + changes make the menus compatable with fltk 2.0. + + - Another little fix for the BoXX OpenGL overlays. + + - Fl_Gl_Window no longer blanks the mouse pointer on + WIN32 unless an OpenGL overlay is being used. This + should make non-overlay displays faster when a cursor + is set. + + +CHANGES SINCE FLTK 1.0.10 + + - CHANGED THE DEFAULT RUN-TIME LINKING TO "MULTITHREADED + DLL". You'll need to change your project settings to + use this as well or you'll get errors. + + - Added new --disable-gl option to configure script. + + - Added new const const pointer versions of pixmap + functions to eliminate an annoying pointer warning + message that was generated by the Sun and other C++ + compilers. + + - Eliminated all "var hides class::var" warnings. + + - Eliminated all "string literal converted to char *" + warnings. + + - OS/2 updates from Alexander Mai. + + - Tidied up the HTML documentation to be more standards + compliant. + + - Compiling with -DBOXX_BUGS will work around some + problems with the newest X drivers that BoXX delivers, + the problems all affect use of Overlays for normal X + drawing and OpenGL drawing. Normal compilation is + unchanged. + + - The file chooser buttons use user_data() rather than + the label to decide what to do, allowing the label to + be somewhat cleaner. + + - Selection color on X changed to blue, to match what + happens on Windows now. + + - Added support for AIX (static library only). + + - Added support for SunOS 4.x + + - Now process WIN32 WM_ACTIVATEAPP message to reset the + key and button states in Fl::e_state. + + - Fl_has_idle only tested N-1 callbacks and missed one. + + - Restored WM_SYNCPAINT handling under WIN32; this fixed + a refresh bug under some versions of Windows. + + - Check for OpenGL headers before checking to see if + OpenGL is supported. This should eliminate compile + errors due to missing non-FLTK header files... + + - Add -D_INCLUDE_POSIX_SOURCE option when compiling with + the HP compilers. + + - Replaced remaining _WIN32 symbols with WIN32 + + - Removed reference to unused GL/glu.h header file, which is missing on + some Linux systems. + + - Fl_Gl_Window has a new method to allow you to get and set the context: + + void Fl_Gl_Window::context(void*, int destroy = 0) + void* Fl_Gl_Window::context() const; + + Return or set a pointer to the GLContext that this window is + using. This is a system-dependent structure, but it is portable to + copy the context from one window to another. You can also set it to + NULL, which will force FLTK to recreate the context the next time + make_current() is called, this is useful for getting around bugs in + OpenGL implementations. + + If destroy_flag is true the context will be destroyed by fltk when + the window is destroyed, or when the mode() is changed, or the next + time context(x) is called. + + - Some cleanup of Fl_Gl_Choice to move most of the system dependent + #ifdefs into Fl_Gl_Choice.cxx. + + - Fl_Gl_Window does not set drawbuffer(BACKBUFFER) for + single-buffered windows. + + - Fl_Input::replace(...) correctly updates the display + if the replaced region does not include the mark, + point, or selected region. + + - Added Fl::add_check(...), Fl::remove_check, and + Fl::has_check. These are similar to idle callbacks but + are only called just before it waits for new events. + They can be used to watch for changes in global state + and respond to them. + + - "accu-timer": some changes to repeat_timeout that seem + to make it accurate on Unix and WIN32 at speeds up to + 500000 timeouts/second (and 700000 on Linux), and + within about .001% as accurate as the system clock. + + - Fix to Fl_Valuator::step() by Guillermo Andrade. + + - Fixed the FLUID write-menu bug introduced in 1.0.10 + + - Fl::flush() now calls GdiFlush() under WIN32 to + ensure that all graphics are drawn. + + - fl_curve() now uses a much better algorithim to figure + out how many pieces to cut the curve into. + + - FLUID now uses GetTempPath() under WIN32 to determine + where to store the clipboard. + + - Right-ctrl does not delete selected text in Fl_Input, + until you type a composed character. + + - Added simple FLTK and FLUID manual pages. + + - Fl_Gl_Window leaked memory under WIN32. + + - The colbrowser demo was missing an include file when + compiled under OS/2. + + +CHANGES SINCE FLTK 1.0.9 + + - Added a strcasecmp() function to FLUID; AIX doesn't + have it. + + - Bug #115509: Fl_Scroll not repainting background. + + - Updated the configure script and makeinclude.in file + to work with the Sun PRO compilers. + + - Disabled the WIN32 async socket select code by default: + it doesn't seem to work anymore... + + - Fl::below_mouse() was incorrectly clearing e_is_click; + this prevented any double-clicks from getting + through... + + - No longer clear Fl::keysym on every event, this makes + better back compatability and fixes Win2000 + + - FLUID now restores which tab in an Fl_Tabs was + selected when loads .fl files. + + - Hack to fix the annoying "raise another application + when a modal window is closed" problem on WIN32. + + - Fl_Tabs now draws the background behind the tabs. + + - Fl::set_fonts() on WIN32 fixed to work before the + first window is shown. + + - CUA function keys, code submitted by George Yohng + + + - Another attempt to get glut.h to work on WIN32. + + - Fl_Menu_::add() ignores '&' signs when comparing menu + items, so you don't have to make the shortcuts the + same all the time. + + - Fixed bit-flipping patterns in WIN32 bitmap code. + + - Fixed size of data written by gif images to .C files + + - Menu titles and buttons in the menubar can be images + (allows it to be used as a toolbar) + + - Reads selectBackground from the xrdb database to set + the selection color. Adding this to your .Xdefaults + will make fltk and Motif programs look much more + Windoze-like: + + *selectForeground: white + *selectBackground: #000080 + + - FL_WHEN_RELEASE on Fl_Input will now do the callback + when the input field is hidden, for instance when it + is on a tab and the user switches to another tab. + + - Fl_Gl_Window with an overlay on X always resized any + child windows even if you turned resizable() off + because it turned it back on to resize the overlay + window. This patch avoids changing resizable(). + + - Fix so multiple Fl::add_idle() calls works + + - The input focus got messed up if you called + Fl_Tabs::value(x) and there was something that took + focus on an earlier tab. + + - Removed some (not all) of the warnings when compiled + with -Wwrite-strings, this should also get similar + warnings Solaris produces. + + - Made Fl_Browser not hide the Fl_Widget::show() method + + - Changes & additions for OS/2 from Alexander Mai + + - Patch from Mike Lindner to make the turning on/off of + scrollbars on Fl_Scroll smarter. + + - Added missing FL_EXPORT for Fl_Valuator::format() + + - Shortcuts for "buttons" in a Fl_Menu_Bar work again. + + - Fix for cut/paste support and Xdnd. + + - Shortcuts for submenu titles in a menubar pop up the + submenu (rather than calling the callback) + + - Added documentation for GL_SWAP_TYPE + + - Buttons with box(FL_NO_BOX) did not draw. Apparently + they did in older versions of fltk, I restored this. + (bug 108771) + + - Removed 8-bit colormap drawing code that was not doing + anything in fl_draw_image due to the colormap + allocation changes. I also made fl_color(r,g,b) + actually allocate the requested color rather than the + nearest fltk color-cube color (this is only done for + the first color that maps to a given entry in the fltk + color cube), the result is that pixmaps with a small + number of colors are drawn much more accurately. The + resulting code seems to produce better images and is a + good deal smaller! + + - Fixed makeinclude.in so CFLAGS are used for c source + code instead of CXXFLAGS. (bug 108694) + + - Better fix for gif files suggested by pauly (bug + 108770) + + - Performance of Fl_Gl_Window may be improved on some + types of OpenGL implementations, in particular MESA + or other software emulators, by setting the + GL_SWAP_TYPE environment variable. This variable + declares what is in the back buffer after you do a + swapbuffers: + + setenv GL_SWAP_TYPE COPY + + This indicates that the back buffer is copied to + the front buffer, and still contains it's old + data. This is true of many hardware + implementations. Setting this will speed up + emulation of overlays, and widgets that can do + partial update can take advantage of this as + damage() will not be cleared to -1. + + setenv GL_SWAP_TYPE NODAMAGE + + This indicates that nothing changes the back + buffer except drawing into it. This is true of + MESA and Win32 software emulation and perhaps some + hardware emulation on systems with lots of memory. + + All other values for GL_SWAP_TYPE, and not setting + the variable, cause fltk to assumme that the back + buffer must be completely redrawn after a swap. + + This is easily tested by running the gl_overlay demo + program and seeing if the display is correct when + you drag another window over it or if you drag the + window off the screen and back on. You have to exit + and run the program again for it to see any changes + to the environment variable. + + - Optimized colormap usage on 8-bit displays with + images. New code only allocates colors as they are + needed (still converts indexed images to full RGB and + dithers, tho...) + + - Fixed .gif files in FLUID, they were broken by the fix + for large .xpm files in version 1.0.9. + + - Fix for OpenGL hardware overlays with the transparent + index != 0. Tested on the brand new HP Linux + Workstations, this is the only bug encountered. Both + X and OpenGL hardware overlay works perfectly on + these, though configue may not enable it by + default...) + + - Fl_Choice and all other Fl_Menu_ subclasses draw the + items using textcolor() as the default color of the + text. + + - Fix suggested by Stuart Levy to fix scrolling when + deleting items from the browser. + + - Replaced the -$(MAKEFLAGS) with $(MFLAGS) as per the + gmake documenation. Apperntly this works with other + make programs and MAKEFLAGS is passed invisibly by + gmake, though the documenation is not too clear... + + +CHANGES SINCE FLTK 1.0.8 + + - More documentation fixes. + - GLUT_STROKE_*_ROMAN in glut.h are defined as 0,1 on + WIN32 to match the glut header files there. + - Added Fl::has_timeout() and Fl::has_idle() functions. + - Added new Fl::repeat_timeout() method that + measures time from when the last timeout was called. + This has slightly less overhead and allows accurate + spacing of timeouts. + - More Cygwin changes + - FLUID could crash with identifiers with trailing + whitespace. + - Fixed the XPM loading code in FLUID to handle files + longer than 2048 lines. + - Added a bunch of missing FL_EXTERN's to glut.h to + eliminate GLUT linking errors under WIN32. + - Fix for sliders so that clicking on one with a small + (or zero) slider_size will not move the slider. + - fl_shortcut.cxx didn't export fl_old_shortcut() in the + WIN32 DLL. + - Fixed xpaint link in the documentation. + - Included Fl_Input word-wrap fixes from Alexander Rabi + Beels. This will not affect things much because + word-wrap is normally disabled. + - Patch from Stuart Levy so the *last* widget in an + Fl_Pack may be resizable. This should be compatable + because resizable didn't do anything before so there + was no reason to set it. + - Cleaned up the timeout and Fl::wait() code. The new + code calls the clock function less than half as much, + which results in a noticable performance improvement + in some apps. + - Fl::wait(time) with a time greater than the system can + handle (24.855 days on NT, the same on some Unix + systems) will now act as though the time is infinity. + Before it would do unpredictable things. + - "USE_POLL" now compiles and works, although it is + disabled by default. poll() is an alternative to the + UNIX select() call which is available on some version + of UNIX and may be faster depending on the platform; + try it by editing config.h. + - The WIN32 USE_ASYNC_SELECT code now does translation + and dispatching of the select events; this makes + Windows a lot happier. + - Added a check for an open display in Fl::wait() so + that you don't need an open window under X to call it. + + [changes in snapshot 2] + + - fl_old_shortcut() wasn't being exported in the WIN32 DLL + project. + - Updated Cygwin and Mingw makefiles. + - Updated the BC++ project file. + - You can no longer insert control chars into Fl_Int/Float_Input. + - Fl_Multiline_Input now resets the horizontal position when + focus is changed; this caused problems when multiple multiline + widgets were used in an application. + - All handle() methods are now public, and all draw() methods are + now protected in FLTK widgets. + - More fixes to the OpenGL overlay code on win32. This now + seems to work quite reliably on several different pieces of + hardware. Apparently doing SetLayerPaletteEntries with a + palette larger than the overlay size caused the drivers to + screw up in unpredictable ways. Also SwapBuffers swapped both + the overlay and main window, which is not what fltk's + interface wanted, this was easy to fix however. + - Patch for full scrollbars so that clicking on them does not + move anything. + - Documentation fixes. + - Better horizontal scrolling of Fl_Input when cursor is near + the end of the line. + - Fl_Input::value(x) selects all text. + - Fl_Output and Fl_Multiline_Output would scroll to the end + of the text. + - filename_isdir() now drops any trailing slash from the + filename (needed for Windows) + - Added return type for main() function in line_style demo. + - Running FLUID with the "-cs" option writes the I18N message + file. + - The WIN32 version of XParseGeometry() didn't initialize some + variables. This caused a compiler warning but did not affect + the actual code. + + [changes in snapshot 1] + + - EMail changes - fltk-bugs@easysw.com now officially + fltk-bugs@fltk.org. + - The FLTK DLL project file didn't include fl_compose.cxx + - Dropped the GCC -fno-rtti option since it caused problems + with existing programs. + - Moved the .fl rules back to the test directory. + - Fixed some makefile and spec file problems. + - Fixed hardware overlays. The problem was the new + fl_clipped() code, which tests against the current window + size. The hardware overlay code did not set the current + window when drawing the overlay. I needed hardware overlay + for DD's code, I'm not sure if these fixes are good enough to + enable this in our general release. Hardware overlay still + only works on SGI Irix. + - Some patches to turn off the MSVC++ -Oa (assumme no aliasing) + optimization flag. Suprisingly this only broke a few parts + of fltk, or at least these are the only ones I found. + - Does not unmap child windows when the main window is + iconized. This reduces flashing when the window is + deiconized. + - Fl::key() is set to zero by all events except key down/up. + This will allow you to reliably test if an event or callback + was produced by a keystroke. Fixes the bug posted about + stopping Escape from closing the window. + - User defined cursors on OpenGL windows slowed down NT a + *LOT*. Some attempts to fix this by turning off the cursor + while drawing the window. + - Filename completion in the file chooser works better on NT. + Typing TAB fixes the case of everything you typed to match + the shortest name that can be completed. + + +CHANGES SINCE FLTK 1.0.7 + + - Many documentation changes/fixes/improvements. + - FLUID didn't save Fl_Double_Window's as + double-buffered windows. + - Fl_Menu_ text color is used if Fl_Menu_Item text color + is not set. + - Added Fl::first_window(window) method to change the + "top" window that is used when showing modal windows. + By default it is the window the user last + clicked/typed in. + - The Fl_Menu::global() handler now uses the current top + window instead of the menu bar for modal stuff. + - Added fl_line_style() function to set the line style. + Note that user-defined line styles ONLY WORK UNDER X11 + and Windows NT/2000. Windows 95/98 do, however, + support the "standard" line styles. + - Fl::wait() does not return immediately when no windows + - XForms keyboard shortcuts using hex keycode constants + now work. + - Updated the configure script for *BSD and to turn off + exceptions and RTTI in the FLTK library itself (does + not affect applications which use these things) + - FLUID now supports I18N using the POSIX or GNU + mechanisms. + - Fixed definition of glutBitmapWidth to match header + file. + - Does not turn visible() on when a window is iconized() + or if a modal window is shown and it's parent is + iconized. This allows the code "while (w->visible() + && w->damage()) Fl::check();" to reliably wait for the + window to be mapped and drawn the first time. + - Setting box(FL_NO_BOX) on a button makes it an + invisible overlay + - FL_NORMAL_SIZE is now a global variable so you can + change the default text size prior to creating your + widgets. + - Menus now draw properly with a box type of + FL_FLAT_BOX. + - Cygwin fixes to compile in POSIX mode. + - Fl_Value_Input callback can call value() or + destructor. + - OpenGL overlays now work under Windows NT! + - Fl_Slider and Fl_Scrollbar could cause a divide by + zero. + - Clicking in an Fl_Input field no longer selects the + whole field, it just moves the text cursor. + - Tru64 UNIX fixes for filename_list() + - Fl_Browser now draws itself properly when deactivated. + - FLUID GUIs now use Courier font for all code input. + - The FLUID OK and Cancel buttons are now all shown in + the same order in all windows. + - Fixes to compile under GCC 2.95.2 + - Fixed the BC5 project files. + - FL_LEFT_MOUSE and friends are now in + + - Fixes for fake OpenGL overlay code under WIN32. + - Message windows are now resizeable. + - On WIN32 non_modal (but not modal) windows have the + close and size boxes. + - Fl_Button and friends didn't honor the + FL_WHEN_NOT_CHANGED condition. + - Disabled XDBE on all platforms. + - XGetDefault patch from James Roth + - New fl_open_display(Display *) function to allow FLTK + to share a display connection with another toolkit + (like Xt, GTK, etc.) + - Shortcut labels for special keys should now display + properly under WIN32. + - fl_set_fonts() did not reuse fonts. + - Fixed shortcut problem under WIN32 when the focus + window changes. + - "dead" keys should now work under X11. + - Fixes to make FLTK compile with GCC 2.95.2 + - FL_SHORTCUT fix for I18N. + - Fixed cut/paste problems under WIN32 + - FLUID now produces correct code for nested class + destructors. + - Nested windows should now redraw properly under WIN32. + - "table" is now static in fl_cursor.cxx + - Fl_Chart used the textcolor() and not the color() for + horizontal bar charts. + - Now set the input hint for TWM and TWM-derived window + managers. + - Now look for TrueColor visual if FLTK is compiled with + USE_COLORMAP == 0. + - Fl_Scrollbar could generate a divide-by-0 error if the + min and max values were the same. + - Fl_Menu_::remove() now removes whole submenus if + needed. + - Scrollbar buttons now draw themselves pushed in as + needed. + - Fixed the gl_overlay demo (and gl overlays in general) + when they are faked with no hardware and the window is + resized. + - Selections weren't shown in Fl_Browser widgets when an + item used the @B (background) format. + - Windows can now be resized by the program under X11 + for more window managers. + - OS/2 makeinclude updates. + - Added Fl.H required by an inline function in + Fl_Repeat_Button.H + - Fl_add_idle adds new functions to the end of the queue + ring, rather than the start, so they are executed in + the order added, and a callback that adds itself does + not prevent others from being called. + - FLUID lets you type in code that starts with '#' for + cpp directives. + - XBell() could be called before the X11 display was + opened, causing a segfault. + - Fixed Fl_Gl_Window::ortho() - Borland C++ doesn't + define GLint to "int", but instead to "long"... + - Fixed Fl_Browser scrollbars within an Fl_Scroll + widget. + - Fl_Output (and non-focused Fl_Input) now scroll in + response to position() + - Fl_Input now does not scroll horizontally if the + entire string will fit in the widget. + - Fl_Scrollbar didn't push the right arrow buttons when + you clicked outside the scroller. + - Now use WSAAsyncSelect() for better socket performance + with Fl::add_fd() + + +CHANGES SINCE FLTK 1.0.6 + + - Fixed Fl_Input_ bug under WIN32 - no longer stop accepting input + when one of the "Windows" keys is pressed. + - Now call TranslateEvent for all events under WIN32. + - Fixes for OpenBSD and NetBSD + - The FL_CURSOR_HAND cursor now uses the IDC_HAND cursor instead of + IDC_UPARROW under Windows 98 and 2000. + - Fl_Scrollbar now does a page-up/down when you click outside the + scroller. + - Fl_Window::show(0, NULL) causes core dump + - Fixed a compile-time error in fl_call_main.c for Borland C++. + - "fluid -c filename.fl" would try to open an X display if the + FLUID file contained an Fl_Browser widget. + - Fl_Browser now correctly measures items with @C or @B color + formatting commands. + - Fixed a bitmap drawing bug for WIN32 (bit reversal table was wrong) + - fl_xyz() dialogs now set a title in the title bar. + - fl_alert() sounds the bell under X11. + - fl_xyz() dialogs now call MessageBeep() under WIN32. + - Fl_Browser_ didn't draw the selection box with the inactive color + when the browser wasn't activated. + - Fl_Browser now responds to FL_KEYBOARD as well as FL_SHORTCUT. If + you subclass it to accept focus then keyboard navigation will work. + - Fl_Tile and Fl_Tabs do their callback when the user changes their + display. + - Made some of the private methods of Fl_Browser protected. + - Now set win_gravity correctly, this helps some X + window managers that use it position the window where + FLTK wants it to be. + - 0-width browsers crashed. + - Minor change: if the X window manager does not do + anything else with windows that don't have their + position specified, the windows appear centered in the + screen, rather than in the top-left corner. This + happened with modal windows under Irix 4Dwm. This + also causes windows to be centered when no window + manager is running, which might be useful for + installation gui programs? + - Clicking in an Fl_Input field the first time selects the entire + field. + - Clicking the middle mouse button in an Fl_Input field now inserts + the text at the indicated position instead of the cursor position. + - Drag-selecting text in an Fl_Input field now copies the text + automatically. + - Fl::flush() no longer calls the draw() method for invisible windows. + - Calling deactivate() on an invisible widget could cause an + infinite loop in some obscure cases. + - Added #pragma's for SGI C++ compilers - the 6.{23} X headers had + errors in them. + - Fl_Gl_Window::ortho() changed so that text and images + are not erased if the origin is off the left/bottom of the + window. + - Small change to Fl_Input so that a click that gives it + the focus also selects all the text. + - Fixed a slider drawing problem. + - You can now add/delete children of Fl_Tabs widgets whether or + not they are visible. + - Now embed woff options for SGI C++ compilers (gets rid of X11 + header warnings) + - draw_pixmap used a cast that the Digital UNIX C++ compiler didn't + like. + - The GLUT function key constants were off by one. + - The XPM reading code didn't handle RGB colors other than #rrggbb. + + +CHANGES SINCE FLTK 1.0.5 + + - Fl_win32.cxx defined WM_MOUSE_LEAVE instead of WM_MOUSELEAVE. + - Fl_get_key_win32.cxx needed to include + - gl_draw_pixmap.cxx needed a pointer cast for ANSI C++. + - Fl_Repeat_Button didn't always delete its timeout. + - Now keep track of the current OpenGL context; this provides + significant performance improvements for OpenGL applications + with a single context. + + +CHANGES SINCE FLTK 1.0.4 + + - Fl_Roller didn't handle a width and height of 0. + - filename_list() fix for FreeBSD. + - Fixed RPM install docos - needed "--install" option... + - Fl_Browser_ wouldn't draw the vertical scrollbar right away if it + added a horizontal one which covered the last line. + - Fl_Tabs problems - single-character labels don't show up (problem in + measure_tabs() or measure_label() methods?), and doesn't clear top + tab area before drawing tabs. + - Fl_Browser needs a destructor. + - fl_draw_label() quoted characters between 0x80 and 0xa0, which + caused problems for some programs using the WinANSI character set. + - FLUID didn't handle declared class destructors. + - Fixed another WIN32 cut/paste bug. + - Fl_Tabs didn't work properly when there was only 1 tab. + - Fl_Menu::add() didn't delete the old array. + - Fl_Repeat_Button didn't delete its timeout when disabled. + - fl_draw() would crash if no font was set (now defaults to + a 14-pixel Helvetica font) + - Can't forward declare classes; need to check for "class ", "struct ", + "union ", etc. See Bill's message + - Added #pragma around xlib.h for IRIX + - FL_KEYBOARD events have the correct x/y when sent to child X + windows. Note that if you worked around this bug by adjusting the + x/y yourself you will have to change your code. In addition all + events have the correct x/y when sent to the grab() widget. And + the code to do all this was simplified a lot. + - The XPM code didn't handle named colors with spaces in the names. + - Pressing ESCape closed the window with pointer focus, even if there + was a modal window open (now closes the modal window). + - FLUID no longer produces trigraphs accidentally in the image data. + - FLUID uses string constant concatenation to produce shorter image + data. + - The Fl_Group deletion code crashed if there was exactly one child + widget. + - Simulated overlays in single-buffered Fl_Gl_Windows now draw + correctly (though very slowly as it requires the entire window to + be redrawn to erase the overlay). This fix ported our Digital + Domain programs better to systems with no overlay hardware. + - Added support for extern "C" declarations in FLUID. + - Added Fl_Pack support to FLUID. + - Fixed the order of #include's in FLUID generated header files. + - Fixed detection of vsnprintf and snprintf under HP-UX 10.20 once + and for all. + - The checkers demo did not compile with GCC 2.95 + - FLUID didn't output virtual destructors properly. + - Added inline "make_visible()" method to Fl_Browser. + - Fl::wait() now returns immediately if any timeouts are + called. + - 16-bit XPM files are now properly handled. + - Fl_Window::resize() was missing FL_EXPORT (caused problems + with Windows DLLs) + - FLUID was writing extern declarations twice. + - New FLUID arrow key functionality: arrows move by one pixel, shift+arrow + resizes, ctrl+arrow steps by grid + + +CHANGES SINCE FLTK 1.0.3 + + - Documentation updates + - Fl_Browser::bottomline(size) didn't scroll to the bottom + if the second-to-last line was visible. + - fl_wait() didn't poll FDs properly for WIN32. + - Fixed DLL definitions for BC++. + - FLUID now handles nested classes properly. + - The "connect" demo now does a wait() for the PPP process + so that you aren't left with a lot of zombie processes. + - Fixed the FLTK colormap to use FF instead of F4 for full + intensity values. + - Minor change to scrollbar drawing code to match other + toolkits. + - New selections would cancel themselves out in WIN32. + - The header file links were broken in the IRIX + distributions. + - fl_elapsed() now always uses GetClockTick() for WIN32. + - fl_display is now initialized to GetModuleHandle(NULL) - + this fixes problems people had with Cygwin and MingW32. + - WinMain() is no longer compiled in with Cygwin and + MingW32; it wasn't being used for those compilers anyways. + - Added Solaris compiler options to configure script. + - Fl_Value_Input wouldn't update properly if you set the + value from a callback. + - Fl_Tile wouldn't resize if the resizeable widget was the + last child. + - Was missing #include and #include in + several files, which caused problems on some platforms. + - Fixed another case where Fl_Browser_ could get in an + infinite resizing loop. + - Fl_win32.cxx now includes to export missing + DLL symbols. + - FLUID didn't handle member functions that include the + scope operator. + - Fl_Chart was dividing by 0 if there were no data samples + or if they were all the same (min == max). + + +CHANGES SINCE FLTK 1.0.2 + + - XDBE is now enabled for IRIX 6.[234] as well as 6.5. + - FLUID didn't write the when() condition properly. + - Tab/space/backtab/backspace can be used to navigate + through menus. + - Changed $(DSONAME) in the src/Makefile to "libfltk.so.1 + libfltk.sl.1". + - Fl_Browser could read past the end of the string when + computing the item height. + - Fl_Browser could get in an infinite loop when checking to + see if scrollbars needed to be displayed. + - FLUID now honors the return type of the outermost widget. + This was a problem when substituting Fl_Group in an + Fl_Window widget. + - Fl_Menu_::copy() wasn't allocating a power of 2 for the + array size. + - FLWM would crash if fl_xmousewin was deleted. + - The fast_slow demo now uses output widgets. + - Timers under WIN32 were unreliable. + + +CHANGES SINCE FLTK 1.0.1 + + - Documentation updates + - The Visual C++ project files didn't include fl_add_idle.cxx. + - LIBRARY/DSO name inconsistencies in src/Makefile. + - src/Makefile didn't clean the DSO. + - The valuator demo now has only a single callback. + - The code looked for HAVE_SYS_SELECT_H, but the + config file uses HAVE_SYS_SELECT. + - Fl_Image redraw not quite right under X11 or WIN32 + - Problems with timeouts & cube demo under WIN32 + - FLUID problems with inline functions. + - Documentation fixes... + - Fl_Browser::item_height() didn't handle blank lines or + non-default fonts properly. + - FL/math.h didn't have #ifndef...#define...#endif guards + against multiple inclusion... + - Fl_Menu_::copy() fix - didn't allocate power of 2... + - Fl::damage() now remains true until all windows are actually + redrawn. + - Fl_Widget destructor, hide(), and deactivate() methods no longer + send FL_LEAVE, FL_RELEASE, or FL_UNFOCUS events to the widget + (which could cause applications to crash). + - FLUID now outputs symbolic names for align() and when(). + - Fixed select() to use maxfd + 1 instead of maxfd. + - Added "Fl::remove_fd(fd, when)" function so you can remove the + read and write callbacks separately. + - The Fl::add_fd() and Fl::add_timeout() arrays are now dynamically + allocated. + - FLUID didn't always turn the FL_SUBMENU flag on for submenu titles. + - The "extra code" in FLUID now is placed before the "o->end()" call + for Fl_Group and its derived classes. + - You can now set a FL_Window widget's class in FLUID to Fl_Group to + generate a function or class that builds part of a GUI (i.e. no window). + - FLUID now displays "Save file before exiting?" with the standard yes, + no, and cancel buttons rather than "Discard changes?". + - Fl_Menu_::add() now works with any type of menu, even one set with + the menu() method. + - The keypad keys were not always decoded properly under X11. + - Some pointers were not being turned off when widgets were deleted, + which caused some applications (like FLWM) to crash. + + +CHANGES SINCE FLTK 1.0 + + - Documentation fixes. + - Fl::check() didn't return the correct value, breaking a number + of applications. + - Fixed FLUID bug that caused styles patch to crash when you delete + a menu item. + - Updated valuators demo to put the values in the gui box. + - Fl_Browser_::item_height() didn't always compute the correct + value. + - Fixed the alignment of Fl_Choice text. + - Fixes for OS/2. + - Fl_Menu_Item::clear() didn't clear value. + - Added some changes to make FLTK work with Borland C++. + - ANSI C++ fixes. + - Plugged a memory leak in the fractal demo. + - Fl::add_timeout() didn't work under WIN32 with small values. + - The configure script and makefiles now define DSONAME and + use the static library for all example programs. diff --git a/third_party/windows/fltk-1.1.10/CMake/CheckFunctionWithHeaderExists.cmake b/third_party/windows/fltk-1.1.10/CMake/CheckFunctionWithHeaderExists.cmake new file mode 100644 index 0000000..7d824cd --- /dev/null +++ b/third_party/windows/fltk-1.1.10/CMake/CheckFunctionWithHeaderExists.cmake @@ -0,0 +1,54 @@ +# +# Check if the symbol exists in include files +# +# CHECK_FUNCTIONWITHHEADER_EXISTS - macro which checks the symbol exists in include files. +# SYMBOL - symbol +# FILES - include files to check +# VARIABLE - variable to return result +# + +MACRO(CHECK_FUNCTIONWITHHEADER_EXISTS SYMBOL FILES VARIABLE) + IF("${VARIABLE}" MATCHES "^${VARIABLE}$") + SET(CHECK_SYMBOL_EXISTS_CONTENT "/* */\n") + SET(MACRO_CHECK_SYMBOL_EXISTS_FLAGS ${CMAKE_REQUIRED_FLAGS}) + IF(CMAKE_REQUIRED_LIBRARIES) + SET(CHECK_SYMBOL_EXISTS_LIBS + "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") + ENDIF(CMAKE_REQUIRED_LIBRARIES) + FOREACH(FILE ${FILES}) + SET(CHECK_SYMBOL_EXISTS_CONTENT + "${CHECK_SYMBOL_EXISTS_CONTENT}#include <${FILE}>\n") + ENDFOREACH(FILE) + SET(CHECK_SYMBOL_EXISTS_CONTENT + "${CHECK_SYMBOL_EXISTS_CONTENT}\nint main()\n{\n${SYMBOL};return 0;\n}\n") + + FILE(WRITE ${CMAKE_BINARY_DIR}/CMakeTmp/CheckSymbolExists.c + "${CHECK_SYMBOL_EXISTS_CONTENT}") + + MESSAGE(STATUS "Looking for ${SYMBOL}") + TRY_COMPILE(${VARIABLE} + ${CMAKE_BINARY_DIR} + ${CMAKE_BINARY_DIR}/CMakeTmp/CheckSymbolExists.c + CMAKE_FLAGS + -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_SYMBOL_EXISTS_FLAGS} + "${CHECK_SYMBOL_EXISTS_LIBS}" + OUTPUT_VARIABLE OUTPUT) + IF(${VARIABLE}) + MESSAGE(STATUS "Looking for ${SYMBOL} - found") + SET(${VARIABLE} 1 CACHE INTERNAL "Have symbol ${SYMBOL}") + FILE(APPEND ${CMAKE_BINARY_DIR}/CMakeOutput.log + "Determining if the ${SYMBOL} " + "exist passed with the following output:\n" + "${OUTPUT}\nFile ${CMAKE_BINARY_DIR}/CMakeTmp/CheckSymbolExists.c:\n" + "${CHECK_SYMBOL_EXISTS_CONTENT}\n") + ELSE(${VARIABLE}) + MESSAGE(STATUS "Looking for ${SYMBOL} - not found.") + SET(${VARIABLE} "" CACHE INTERNAL "Have symbol ${SYMBOL}") + FILE(APPEND ${CMAKE_BINARY_DIR}/CMakeError.log + "Determining if the ${SYMBOL} " + "exist failed with the following output:\n" + "${OUTPUT}\nFile ${CMAKE_BINARY_DIR}/CMakeTmp/CheckSymbolExists.c:\n" + "${CHECK_SYMBOL_EXISTS_CONTENT}\n") + ENDIF(${VARIABLE}) + ENDIF("${VARIABLE}" MATCHES "^${VARIABLE}$") +ENDMACRO(CHECK_FUNCTIONWITHHEADER_EXISTS) diff --git a/third_party/windows/fltk-1.1.10/CMake/FLTKConfig.cmake.in b/third_party/windows/fltk-1.1.10/CMake/FLTKConfig.cmake.in new file mode 100644 index 0000000..574c74e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/CMake/FLTKConfig.cmake.in @@ -0,0 +1,37 @@ +#----------------------------------------------------------------------------- +# +# FLTKConfig.cmake - FLTK CMake configuration file for external projects. +# +# This file is configured by FLTK and used by the UseFLTK.cmake module +# to load FLTK's settings for an external project. + +# The FLTK source tree. +SET(FLTK_SOURCE_DIR "@FLTK_SOURCE_DIR@") + +# The FLTK include file directories. +SET(FLUID_COMMAND "@FLTK_FLUID_COMMAND@") +SET(FLTK_EXECUTABLE_DIRS "@FLTK_EXECUTABLE_DIRS@") +SET(FLTK_LIBRARY_DIRS "@FLTK_LIBRARY_DIRS@") +SET(FLTK_LIBRARIES "@FLTK_LIBRARIES@") +SET(FLTK_INCLUDE_DIRS "@FLTK_INCLUDE_DIRS@") + +# The C and C++ flags added by FLTK to the cmake-configured flags. +SET(FLTK_REQUIRED_C_FLAGS "@FLTK_REQUIRED_C_FLAGS@") +SET(FLTK_REQUIRED_CXX_FLAGS "@FLTK_REQUIRED_CXX_FLAGS@") + +# The FLTK version number +SET(FLTK_VERSION_MAJOR "@FLTK_VERSION_MAJOR@") +SET(FLTK_VERSION_MINOR "@FLTK_VERSION_MINOR@") +SET(FLTK_VERSION_PATCH "@FLTK_VERSION_PATCH@") + +# Is FLTK using shared libraries? +SET(FLTK_BUILD_SHARED_LIBS "@BUILD_SHARED_LIBS@") +SET(FLTK_BUILD_SETTINGS_FILE "@FLTK_BUILD_SETTINGS_FILE@") + +# The location of the UseFLTK.cmake file. +SET(FLTK11_USE_FILE "@FLTK_USE_FILE@") + +# The ExodusII library dependencies. +IF(NOT FLTK_NO_LIBRARY_DEPENDS) + INCLUDE("@FLTK_LIBRARY_DEPENDS_FILE@") +ENDIF(NOT FLTK_NO_LIBRARY_DEPENDS) diff --git a/third_party/windows/fltk-1.1.10/CMake/FLTKUse.cmake b/third_party/windows/fltk-1.1.10/CMake/FLTKUse.cmake new file mode 100644 index 0000000..8b3a2b8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/CMake/FLTKUse.cmake @@ -0,0 +1,68 @@ +IF(NOT FLTK11_FOUND) + MESSAGE(FATAL_ERROR "Something went wrong. You are including FLTKUse.cmake but FLTK was not found") +ENDIF(NOT FLTK11_FOUND) + +# ------------------------------------------------------------- +# This macro automates wrapping of Fluid files +# Specify the output variable name and the list of sources +# The output variable can be directly added to the target. +# +# For example: +# FLTK_WRAP_FLUID(CubeView_SRCS CubeViewUI.fl) +# ADD_EXECUTABLE(CubeView CubeMain.cxx CubeView.cxx CubeView.h ${CubeView_SRCS}) +# ------------------------------------------------------------- +MACRO(FLTK_WRAP_FLUID VARIABLE) + FOREACH(src ${ARGN}) + IF("${src}" MATCHES ".fl$") + GET_FILENAME_COMPONENT(fname ${src} NAME_WE) + GET_FILENAME_COMPONENT(fpath ${src} PATH) + GET_SOURCE_FILE_PROPERTY(gen ${src} GENERATED) + IF(gen) + SET(fluid_name "${src}") + ELSE(gen) + SET(fluid_name "${CMAKE_CURRENT_SOURCE_DIR}/${fpath}/${fname}.fl") + IF(NOT EXISTS "${fluid_name}") + SET(fluid_name "${CMAKE_CURRENT_BINARY_DIR}/${fpath}/${fname}.fl") + IF(NOT EXISTS "${fluid_name}") + SET(fluid_name "${fpath}/${fname}.fl") + IF(NOT EXISTS "${fluid_name}") + MESSAGE(SEND_ERROR "Cannot find Fluid source file: ${fpath}/${fname}.fl") + ENDIF(NOT EXISTS "${fluid_name}") + ENDIF(NOT EXISTS "${fluid_name}") + ENDIF(NOT EXISTS "${fluid_name}") + ENDIF(gen) + SET(cxx_name "${CMAKE_CURRENT_BINARY_DIR}/${fname}.cxx") + SET(h_name "${CMAKE_CURRENT_BINARY_DIR}/${fname}.h") + SET(${VARIABLE} "${${VARIABLE}};${cxx_name}") + ADD_CUSTOM_COMMAND( + OUTPUT ${cxx_name} + DEPENDS "${fluid_name}" "${FLUID_COMMAND}" + COMMAND ${FLUID_COMMAND} + ARGS -c ${fluid_name}) + ADD_CUSTOM_COMMAND( + OUTPUT ${h_name} + DEPENDS "${fluid_name}" "${FLUID_COMMAND}" + COMMAND ${FLUID_COMMAND} + ARGS -c ${fluid_name}) + ENDIF("${src}" MATCHES ".fl$") + ENDFOREACH(src) +ENDMACRO(FLTK_WRAP_FLUID VARIABLE) + + +# Make FLTK easier to use +INCLUDE_DIRECTORIES(${FLTK_INCLUDE_DIRS}) +LINK_DIRECTORIES(${FLTK_LIBRARY_DIRS}) + +# Load the compiler settings used for FLTK. +IF(FLTK_BUILD_SETTINGS_FILE) + INCLUDE(CMakeImportBuildSettings) + CMAKE_IMPORT_BUILD_SETTINGS(${FLTK_BUILD_SETTINGS_FILE}) +ENDIF(FLTK_BUILD_SETTINGS_FILE) + +# Add compiler flags needed to use FLTK. +SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLTK_REQUIRED_C_FLAGS}") +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLTK_REQUIRED_CXX_FLAGS}") +SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FLTK_REQUIRED_EXE_LINKER_FLAGS}") +SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${FLTK_REQUIRED_SHARED_LINKER_FLAGS}") +SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${FLTK_REQUIRED_MODULE_LINKER_FLAGS}") + diff --git a/third_party/windows/fltk-1.1.10/CMake/PlatformTests.cxx b/third_party/windows/fltk-1.1.10/CMake/PlatformTests.cxx new file mode 100644 index 0000000..828a93e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/CMake/PlatformTests.cxx @@ -0,0 +1,81 @@ +#ifdef HAVE_LIBZ + +#include + +int main() +{ + unsigned long compressedSize = 0; + unsigned char cd[100]; + const unsigned char ud[100] = ""; + unsigned long uncompressedSize = 0; + + // Call zlib's compress function. + if(compress(cd, &compressedSize, ud, uncompressedSize) != Z_OK) + { + return 0; + } + return 1; +} + + +#endif + +#ifdef HAVE_LIBJPEG + +#include +#include + +int main() +{ + struct jpeg_decompress_struct cinfo; + jpeg_create_decompress(&cinfo); + jpeg_read_header(&cinfo, TRUE); + return 1; +} + +#endif + +#ifdef HAVE_LIBPNG +#include +int main() +{ + png_structp png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)NULL, + NULL, NULL); + png_infop info_ptr = png_create_info_struct(png_ptr); + png_set_sig_bytes(png_ptr, 8); + png_read_info(png_ptr, info_ptr); + + return 0; +} +#endif + +#ifdef HAVE_PNG_H +#include +int main() { retunr 0;} +#endif + +#ifdef HAVE_PNG_GET_VALID +#include +int main() +{ + png_structp png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)NULL, + NULL, NULL); + png_infop info_ptr = png_create_info_struct(png_ptr); + png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS); + return 0; +} +#endif + +#ifdef HAVE_PNG_SET_TRNS_TO_ALPHA +#include +int main() +{ + png_structp png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)NULL, + NULL, NULL); + png_set_tRNS_to_alpha(png_ptr); + return 0; +} +#endif diff --git a/third_party/windows/fltk-1.1.10/CMakeLists.txt b/third_party/windows/fltk-1.1.10/CMakeLists.txt new file mode 100644 index 0000000..9f41188 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/CMakeLists.txt @@ -0,0 +1,410 @@ +# Main CMakeLists.txt to build the FLTK project using CMake (www.cmake.org) +# Written by Andy Cedilnik and Julien Jomier + +PROJECT(FLTK) +CMAKE_MINIMUM_REQUIRED(VERSION 2.0) + +# The FLTK version +SET(FLTK_VERSION_MAJOR "1") +SET(FLTK_VERSION_MINOR "1") +SET(FLTK_VERSION_PATCH "10") +SET(FLTK_VERSION "${FLTK_VERSION_MAJOR}.${FLTK_VERSION_MINOR}") +SET(FLTK_VERSION_FULL "${FLTK_VERSION}.${FLTK_VERSION_PATCH}") + +SET(FLTK_LIBRARIES "fltk_images;fltk;fltk_gl;fltk_forms") + +# Executables and libraries should just go to bin +SET(EXECUTABLE_OUTPUT_PATH "${FLTK_BINARY_DIR}/bin" CACHE INTERNAL + "Where to put the executables for FLTK" + ) +SET(LIBRARY_OUTPUT_PATH "${FLTK_BINARY_DIR}/bin" CACHE INTERNAL + "Where to put the libraries for FLTK" + ) + +# Allow building shared libraries +OPTION(BUILD_SHARED_LIBS "Build FLTK as a shared library" OFF) + +# Search for modules in the FLTK source dir first +SET(CMAKE_MODULE_PATH "${FLTK_SOURCE_DIR}/CMake") + +#----------------------------------------------------------------------------- +# Test for some required system information. +FIND_PACKAGE(Threads) +SET (CMAKE_USE_PTHREADS + "${CMAKE_USE_PTHREADS_INIT}" CACHE BOOL "Use the pthreads library.") + +# We need ansi c-flags, especially on HP +SET(CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}") +SET(CMAKE_REQUIRED_FLAGS ${CMAKE_ANSI_CFLAGS}) + +IF(WIN32) + IF(NOT CYGWIN) + IF(BORLAND) + SET( FLTK_PLATFORM_DEPENDENT_LIBS import32 ) + ELSE(BORLAND) + SET( FLTK_PLATFORM_DEPENDENT_LIBS wsock32 comctl32 ) + ENDIF(BORLAND) + ENDIF(NOT CYGWIN) +ENDIF(WIN32) + +SET(FLTK_X11 1) +SET(FLTK_APPLE 0) +IF(APPLE) + OPTION(FLTK_APPLE_X11 "Use X11 on Mac instead of Carbon" OFF) + MARK_AS_ADVANCED(FLTK_APPLE_X11) + IF(NOT FLTK_APPLE_X11) + SET(FLTK_APPLE 1) + SET(FLTK_X11 0) + OPTION(FLTK_QUARTZ "Use Quartz instead of Quickdraw" OFF) + ENDIF(NOT FLTK_APPLE_X11) +ENDIF(APPLE) + +IF(UNIX) + FIND_PACKAGE(X11) + SET( FLTK_PLATFORM_DEPENDENT_LIBS ${X11_LIBRARIES} -lm) +ENDIF(UNIX) + +IF(APPLE AND NOT FLTK_APPLE_X11) + SET( FLTK_PLATFORM_DEPENDENT_LIBS + "-framework Carbon -framework Cocoa -framework ApplicationServices -lz") +ENDIF(APPLE AND NOT FLTK_APPLE_X11) + +IF(CYGWIN) + ADD_DEFINITIONS(-DWIN32) + SET( FLTK_PLATFORM_DEPENDENT_LIBS ole32 uuid comctl32 wsock32 supc++ -lm -lgdi32) +ENDIF(CYGWIN) + +IF(MINGW) + ADD_DEFINITIONS(-DWIN32) + SET( FLTK_PLATFORM_DEPENDENT_LIBS ole32 uuid wsock32 gdi32 comdlg32) +ENDIF(MINGW) + +INCLUDE(CheckIncludeFiles) +# Check if header file exists and add it to the list. +MACRO(CHECK_INCLUDE_FILE_CONCAT FILE VARIABLE) + CHECK_INCLUDE_FILES("${PROJECT_INCLUDES};${FILE}" ${VARIABLE}) + IF(${VARIABLE}) + SET(PROJECT_INCLUDES ${PROJECT_INCLUDES} ${FILE}) + ENDIF(${VARIABLE}) +ENDMACRO(CHECK_INCLUDE_FILE_CONCAT) +CHECK_INCLUDE_FILE_CONCAT("GL/glu.h" HAVE_GL_GLU_H) +CHECK_INCLUDE_FILE_CONCAT("OpenGL/glu.h" HAVE_OPENGL_GLU_H) +CHECK_INCLUDE_FILE_CONCAT("dirent.h" HAVE_DIRENT_H) +CHECK_INCLUDE_FILE_CONCAT("stdio.h" HAVE_STDIO_H) +CHECK_INCLUDE_FILE_CONCAT("strings.h" HAVE_STRINGS_H) +CHECK_INCLUDE_FILE_CONCAT("sys/dir.h" HAVE_SYS_DIR_H) +CHECK_INCLUDE_FILE_CONCAT("sys/ndir.h" HAVE_SYS_NDIR_H) +CHECK_INCLUDE_FILE_CONCAT("sys/select.h" HAVE_SYS_SELECT_H) +CHECK_INCLUDE_FILE_CONCAT("sys/stdtypes.h" HAVE_SYS_STDTYPES_H) +CHECK_INCLUDE_FILE("pthread.h" CMAKE_HAVE_PTHREAD_H) + +FIND_PACKAGE(ZLIB) +FIND_PACKAGE(PNG) +FIND_PACKAGE(JPEG) + +INCLUDE(CheckSymbolExists) +INCLUDE(CheckFunctionWithHeaderExists) + +CHECK_FUNCTIONWITHHEADER_EXISTS("int strcasecmp()" "${PROJECT_INCLUDES}" HAVE_STRCASECMP) + +CHECK_SYMBOL_EXISTS(strlcat "${PROJECT_INCLUDES}" HAVE_STRLCAT) +CHECK_SYMBOL_EXISTS(strlcpy "${PROJECT_INCLUDES}" HAVE_STRLCPY) +CHECK_SYMBOL_EXISTS(vsnprintf "${PROJECT_INCLUDES}" HAVE_VSNPRINTF) +CHECK_SYMBOL_EXISTS(snprintf "${PROJECT_INCLUDES}" HAVE_SNPRINTF) +CHECK_SYMBOL_EXISTS(scandir "${PROJECT_INCLUDES}" HAVE_SCANDIR) + +INCLUDE(CheckTypeSize) + +CHECK_TYPE_SIZE(short SIZEOF_SHORT) +CHECK_TYPE_SIZE(int SIZEOF_INT) +CHECK_TYPE_SIZE(long SIZEOF_LONG) + +IF(${SIZEOF_SHORT} MATCHES "^2$") + SET(U16 "unsigned short") +ENDIF(${SIZEOF_SHORT} MATCHES "^2$") + +IF(${SIZEOF_INT} MATCHES "^4$") + SET(U32 "unsigned") +ELSE(${SIZEOF_INT} MATCHES "^4$") + IF(${SIZEOF_LONG} MATCHES "^4$") + SET(U32 "unsigned long") + ENDIF(${SIZEOF_LONG} MATCHES "^4$") +ENDIF(${SIZEOF_INT} MATCHES "^4$") + +IF(${SIZEOF_INT} MATCHES "^8$") + SET(U64 "unsigned") +ELSE(${SIZEOF_INT} MATCHES "^8$") + IF(${SIZEOF_LONG} MATCHES "^8$") + SET(U64 "unsigned long") + ENDIF(${SIZEOF_LONG} MATCHES "^8$") +ENDIF(${SIZEOF_INT} MATCHES "^8$") + +# Set an option to build FLTK with OpenGL support +SET(HAVE_GL 0) +OPTION(USE_OPENGL "OpenGL Support" ON) +IF(USE_OPENGL) + FIND_PACKAGE(OpenGL) + IF(OPENGL_FOUND) + SET(HAVE_GL 1) + INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR}) + ENDIF(OPENGL_FOUND) +ENDIF(USE_OPENGL) + +# +# Perform the FLTK specific test with status output +# +MACRO(PERFORM_CMAKE_TEST FILE TEST) + IF("${TEST}" MATCHES "^${TEST}$") + # Perform test + SET(MACRO_CHECK_FUNCTION_DEFINITIONS + "-D${TEST} ${CMAKE_REQUIRED_FLAGS}") + IF(CMAKE_REQUIRED_LIBRARIES) + SET(TEST_ADD_LIBRARIES + "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") + ENDIF(CMAKE_REQUIRED_LIBRARIES) + MESSAGE(STATUS "Performing Test ${TEST}") + + TRY_COMPILE(${TEST} + ${CMAKE_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/${FILE} + CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_FUNCTION_DEFINITIONS} + -DLINK_LIBRARIES:STRING=${CMAKE_TEST_SPECIAL_LIBRARIES} + "${TEST_ADD_LIBRARIES}" + OUTPUT_VARIABLE OUTPUT) + IF(${TEST}) + SET(${TEST} 1 CACHE INTERNAL "CMake test ${FUNCTION}") + MESSAGE(STATUS "Performing Test ${TEST} - Success") + ELSE(${TEST}) + MESSAGE(STATUS "Performing Test ${TEST} - Failed") + SET(${TEST} 0 CACHE INTERNAL "Test ${FUNCTION}") + WRITE_FILE(${CMAKE_BINARY_DIR}/CMakeError.log + "Performing Test ${TEST} failed with the following output:\n" + "${OUTPUT}\n" APPEND) + ENDIF(${TEST}) + ENDIF("${TEST}" MATCHES "^${TEST}$") +ENDMACRO(PERFORM_CMAKE_TEST FILE TEST) + +# Set an option to build the zlib library or not +OPTION(FLTK_USE_SYSTEM_ZLIB "Use's system zlib" OFF) +IF(FLTK_USE_SYSTEM_ZLIB) + IF(ZLIB_FOUND) + SET(CMAKE_TEST_SPECIAL_LIBRARIES ${ZLIB_LIBRARIES}) + SET(FLTK_ZLIB_LIBRARIES ${ZLIB_LIBRARIES}) + PERFORM_CMAKE_TEST(CMake/PlatformTests.cxx HAVE_LIBZ) + ENDIF(ZLIB_FOUND) + # We build the fltk zlib +ELSE(FLTK_USE_SYSTEM_ZLIB) + MARK_AS_ADVANCED(ZLIB_INCLUDE_DIR) + MARK_AS_ADVANCED(ZLIB_LIBRARY) + SUBDIRS(zlib) + SET(HAVE_LIBZ 1) + SET(FLTK_ZLIB_LIBRARIES fltk_zlib) + SET(FLTK_LIBRARIES "${FLTK_LIBRARIES};fltk_zlib") + INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/zlib") +ENDIF(FLTK_USE_SYSTEM_ZLIB) + +# Set an option to build the jpeg library or not +OPTION(FLTK_USE_SYSTEM_JPEG "Use's system jpeg" OFF) +IF(FLTK_USE_SYSTEM_JPEG) + IF(JPEG_FOUND) + SET(CMAKE_TEST_SPECIAL_LIBRARIES ${JPEG_LIBRARIES}) + SET(FLTK_JPEG_LIBRARIES ${JPEG_LIBRARIES}) + PERFORM_CMAKE_TEST(CMake/PlatformTests.cxx HAVE_LIBJPEG) + ENDIF(JPEG_FOUND) + # We build the fltk png +ELSE(FLTK_USE_SYSTEM_JPEG) + MARK_AS_ADVANCED(JPEG_INCLUDE_DIR) + MARK_AS_ADVANCED(JPEG_LIBRARY) + SUBDIRS(jpeg) + SET(HAVE_LIBJPEG 1) + SET(FLTK_JPEG_LIBRARIES fltk_jpeg) + SET(FLTK_LIBRARIES "${FLTK_LIBRARIES};fltk_jpeg") + INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/jpeg") +ENDIF(FLTK_USE_SYSTEM_JPEG) + +# Set an option to build the png library or not +OPTION(FLTK_USE_SYSTEM_PNG "Use's system png" OFF) +IF(FLTK_USE_SYSTEM_PNG) + IF(PNG_FOUND) + SET(CMAKE_TEST_SPECIAL_LIBRARIES ${PNG_LIBRARIES}) + SET(FLTK_PNG_LIBRARIES ${PNG_LIBRARIES}) + PERFORM_CMAKE_TEST(CMake/PlatformTests.cxx HAVE_LIBPNG) + PERFORM_CMAKE_TEST(CMake/PlatformTests.cxx HAVE_PNG_GET_VALID) + PERFORM_CMAKE_TEST(CMake/PlatformTests.cxx HAVE_PNG_SET_TRNS_TO_ALPHA) + SET(HAVE_PNG_H 1) + ENDIF(PNG_FOUND) + # We build the fltk png +ELSE(FLTK_USE_SYSTEM_PNG) + MARK_AS_ADVANCED(PNG_INCLUDE_DIR) + MARK_AS_ADVANCED(PNG_LIBRARY) + SUBDIRS(png) + SET(HAVE_LIBPNG 1) + SET(HAVE_PNG_H 1) + SET(FLTK_PNG_LIBRARIES fltk_png) + SET(FLTK_LIBRARIES "${FLTK_LIBRARIES};fltk_png") + INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/png") +ENDIF(FLTK_USE_SYSTEM_PNG) + +SET(FLTK_DATADIR "${CMAKE_INSTALL_PREFIX}/share/FLTK") +SET(FLTK_DOCDIR "${CMAKE_INSTALL_PREFIX}/share/doc/FLTK") + +# Write out configuration header file +CONFIGURE_FILE(${FLTK_SOURCE_DIR}/configh.cmake.in + ${FLTK_BINARY_DIR}/config.h) + +# On unix create symlinks for backward compatibility +SET(FLTK_CREATE_SYMLINKS 1) +IF(WIN32) + IF(NOT UNIX) + SET(FLTK_CREATE_SYMLINKS 0) + ENDIF(NOT UNIX) +ENDIF(WIN32) + +MACRO(SAFE_CREATE_SYMLINK SOURCE DESTINATION) + IF(EXISTS "${DESTINATION}") + ELSE(EXISTS "${DESTINATION}") + MESSAGE(STATUS "Create symlink from: \"${SOURCE}\" to \"${DESTINATION}\"") + # The quoting here does seems unnatural, but this is to prevent bug in CMake + EXEC_PROGRAM(ln ARGS + "-s \"${SOURCE}\" \"${DESTINATION}\"" OUTPUT_VARIABLE ln_output + RETURN_VALUE ln_retval) + IF("${ln_retval}" GREATER 0) + MESSAGE(FATAL_ERROR "Problem creatin symlink from \"${SOURCE}\" to \"${DESTINATION}\":\n${ln_output}") + ENDIF("${ln_retval}" GREATER 0) + ENDIF(EXISTS "${DESTINATION}") +ENDMACRO(SAFE_CREATE_SYMLINK SOURCE DESTINATION) + +# If this is out-of-source build, then copy FL directory +FILE(GLOB FLTK_HEADER_FILES "${FLTK_SOURCE_DIR}/FL/*.[hHr]") +FOREACH(file ${FLTK_HEADER_FILES}) + GET_FILENAME_COMPONENT(ext "${file}" EXT) + GET_FILENAME_COMPONENT(namewe "${file}" NAME_WE) + GET_FILENAME_COMPONENT(name "${file}" NAME) + STRING(COMPARE EQUAL "${ext}" ".h" lower_case_h) + STRING(COMPARE EQUAL "${ext}" ".H" upper_case_h) + IF(lower_case_h OR upper_case_h) + SET(outfile_h "${FLTK_BINARY_DIR}/FL/${namewe}.h") + SET(outfile_H "${FLTK_BINARY_DIR}/FL/${namewe}.H") + CONFIGURE_FILE("${file}" "${outfile_H}" COPYONLY IMMEDIATE) + CONFIGURE_FILE("${file}" "${outfile_h}" COPYONLY IMMEDIATE) +# IF(FLTK_CREATE_SYMLINKS) +# SAFE_CREATE_SYMLINK("${outfile_H}" "${outfile_h}") +# ENDIF(FLTK_CREATE_SYMLINKS) + ELSE(lower_case_h OR upper_case_h) + STRING(COMPARE EQUAL "${ext}" ".r" mac_resource_file) + IF(mac_resource_file) + SET(outfile "${FLTK_BINARY_DIR}/FL/${name}") + CONFIGURE_FILE("${file}" "${outfile}" COPYONLY IMMEDIATE) + ENDIF(mac_resource_file) + ENDIF(lower_case_h OR upper_case_h) +ENDFOREACH(file) + +IF(FLTK_CREATE_SYMLINKS) + SAFE_CREATE_SYMLINK( + "${FLTK_BINARY_DIR}/FL" + "${FLTK_BINARY_DIR}/Fl") + + SAFE_CREATE_SYMLINK( + "${FLTK_BINARY_DIR}/FL/gl.H" + "${FLTK_BINARY_DIR}/FL/gl.h") + + # Create the symlinks + FILE(READ ${FLTK_SOURCE_DIR}/fltk.list.in SYMLINKSFILE) + STRING(REGEX MATCHALL "(l 0000 root sys .includedir/)([^(\n)])+" + SYMLINKS ${SYMLINKSFILE}) + FOREACH(var ${SYMLINKS} ) + IF("${var}" MATCHES ".H") + STRING(REGEX MATCH "(/F)([^(\n)])+" tmp ${var}) + STRING(REGEX MATCH "(/F)([^( )])+" in ${tmp}) + STRING(REGEX MATCH "( )([^(\n)])+" out ${tmp}) + STRING(REGEX REPLACE "( )" "" out ${out}) + SAFE_CREATE_SYMLINK("${FLTK_BINARY_DIR}/FL/${out}" "${FLTK_BINARY_DIR}/${in}") + ENDIF("${var}" MATCHES ".H") + ENDFOREACH(var) +ENDIF(FLTK_CREATE_SYMLINKS) + +# Set the fluid executable path +UTILITY_SOURCE(FLUID_COMMAND fluid fluid fluid.cxx) +SET(FLUID_COMMAND "${FLUID_COMMAND}" CACHE INTERNAL "" FORCE) + +# Include header files in fltk binary tree +INCLUDE_DIRECTORIES(${FLTK_BINARY_DIR}) + +# Do the build of fltk libraries and fluid +SUBDIRS(src) +SUBDIRS(fluid) + + +# Set an option to build the examples and testing +OPTION(BUILD_EXAMPLES "Build the tests" ON) +IF(BUILD_EXAMPLES) + SUBDIRS(test) +ENDIF(BUILD_EXAMPLES) + +OPTION(BUILD_TESTING "Build testing of FLTK" ON) +IF(BUILD_TESTING) + ENABLE_TESTING() + INCLUDE(Dart) +ENDIF(BUILD_TESTING) + +#----------------------------------------------------------------------------- +# Help outside projects build FLTK projects. +INCLUDE(CMakeExportBuildSettings) +EXPORT_LIBRARY_DEPENDENCIES(${FLTK_BINARY_DIR}/FLTKLibraryDepends.cmake) +CMAKE_EXPORT_BUILD_SETTINGS(${FLTK_BINARY_DIR}/FLTKBuildSettings.cmake) +SET(FL_MAJOR_VERSION "${FLTK_VERSION_MAJOR}") +SET(FL_MINOR_VERSION "${FLTK_VERSION_MINOR}") +SET(FL_PATCH_VERSION "${FLTK_VERSION_PATCH}") + +SET(CFLAGS "${CMAKE_C_FLAGS}") +SET(CXXFLAGS "${CMAKE_CXX_FLAGS}") +SET(CC "${CMAKE_C_COMPILER}") +SET(CXX "${CMAKE_CXX_COMPILER}") + +# For build tree usage +SET(FLTK_FLUID_COMMAND "${FLUID_COMMAND}") +SET(FLTK_LIBRARY_DEPENDS_FILE ${FLTK_BINARY_DIR}/FLTKLibraryDepends.cmake) +SET(FLTK_EXECUTABLE_DIRS ${EXECUTABLE_OUTPUT_PATH}) +SET(FLTK_LIBRARY_DIRS ${LIBRARY_OUTPUT_PATH}) +SET(FLTK_USE_FILE ${FLTK_SOURCE_DIR}/CMake/FLTKUse.cmake) +SET(FLTK_INCLUDE_DIRS "${FLTK_BINARY_DIR}/") +SET(FLTK_BUILD_SETTINGS_FILE ${FLTK_BINARY_DIR}/FLTKBuildSettings.cmake) +SET(prefix "${FLTK_BINARY_DIR}") +SET(exec_prefix "${prefix}") +SET(exec_prefix_set "no") +SET(bindir "${prefix}/bin") +SET(includedir "${prefix}") +SET(libdir "${prefix}/bin") +SET(srcdir "${FLTK_SOURCE_DIR}") + +CONFIGURE_FILE("${FLTK_SOURCE_DIR}/CMake/FLTKConfig.cmake.in" + "${FLTK_BINARY_DIR}/FLTKConfig.cmake" @ONLY IMMEDIATE) +CONFIGURE_FILE("${FLTK_SOURCE_DIR}/fltk-config.in" + "${FLTK_BINARY_DIR}/fltk-config" @ONLY IMMEDIATE) + +# For installed tree usage +SET(FLTK_FLUID_COMMAND "${CMAKE_INSTALL_PREFIX}/bin/fluid") +SET(FLTK_LIBRARY_DEPENDS_FILE ${CMAKE_INSTALL_PREFIX}/lib/FLTK-${FLTK_VERSION}/FLTKLibraryDepends.cmake) +SET(FLTK_EXECUTABLE_DIRS "${CMAKE_INSTALL_PREFIX}/bin") +SET(FLTK_LIBRARY_DIRS "${CMAKE_INSTALL_PREFIX}/lib") +SET(FLTK_USE_FILE "${CMAKE_INSTALL_PREFIX}/lib/FLTK-${FLTK_VERSION}/FLTKUse.cmake") +SET(FLTK_INCLUDE_DIRS "${CMAKE_INSTALL_PREFIX}/") +SET(FLTK_BUILD_SETTINGS_FILE ${CMAKE_INSTALL_PREFIX}/lib/FLTK-${FLTK_VERSION}/FLTKBuildSettings.cmake) +SET(prefix "${CMAKE_INSTALL_PREFIX}") +SET(exec_prefix "${prefix}") +SET(exec_prefix_set "no") +SET(bindir "${prefix}/bin") +SET(includedir "${prefix}") +SET(libdir "${prefix}/lib") +SET(srcdir ".") + +CONFIGURE_FILE("${FLTK_SOURCE_DIR}/CMake/FLTKConfig.cmake.in" + "${FLTK_BINARY_DIR}/CMake/FLTKConfig.cmake" @ONLY IMMEDIATE) +CONFIGURE_FILE("${FLTK_SOURCE_DIR}/fltk-config.in" + "${FLTK_BINARY_DIR}/CMake/fltk-config" @ONLY IMMEDIATE) + +INSTALL_FILES(/include/FL FILES ${FLTK_HEADER_FILES}) +INSTALL_FILES(/lib/FLTK-${FLTK_VERSION} FILES "${FLTK_SOURCE_DIR}/CMake/FLTKUse.cmake") +INSTALL_FILES(/lib/FLTK-${FLTK_VERSION} FILES "${FLTK_BINARY_DIR}/FLTKBuildSettings.cmake") +INSTALL_FILES(/lib/FLTK-${FLTK_VERSION} FILES "${FLTK_BINARY_DIR}/FLTKLibraryDepends.cmake") +INSTALL_FILES(/lib/FLTK-${FLTK_VERSION} FILES "${FLTK_BINARY_DIR}/CMake/FLTKConfig.cmake") diff --git a/third_party/windows/fltk-1.1.10/COPYING b/third_party/windows/fltk-1.1.10/COPYING new file mode 100644 index 0000000..f3d6be5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/COPYING @@ -0,0 +1,528 @@ + FLTK License + December 11, 2001 + +The FLTK library and included programs are provided under the terms +of the GNU Library General Public License (LGPL) with the following +exceptions: + + 1. Modifications to the FLTK configure script, config + header file, and makefiles by themselves to support + a specific platform do not constitute a modified or + derivative work. + + The authors do request that such modifications be + contributed to the FLTK project - send all + contributions to "fltk-bugs@fltk.org". + + 2. Widgets that are subclassed from FLTK widgets do not + constitute a derivative work. + + 3. Static linking of applications and widgets to the + FLTK library does not constitute a derivative work + and does not require the author to provide source + code for the application or widget, use the shared + FLTK libraries, or link their applications or + widgets against a user-supplied version of FLTK. + + If you link the application or widget to a modified + version of FLTK, then the changes to FLTK must be + provided under the terms of the LGPL in sections + 1, 2, and 4. + + 4. You do not have to provide a copy of the FLTK license + with programs that are linked to the FLTK library, nor + do you have to identify the FLTK license in your + program or documentation as required by section 6 + of the LGPL. + + However, programs must still identify their use of FLTK. + The following example statement can be included in user + documentation to satisfy this requirement: + + [program/widget] is based in part on the work of + the FLTK project (http://www.fltk.org). + +----------------------------------------------------------------------- + + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + [This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. + + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library 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 Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + Appendix: How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/third_party/windows/fltk-1.1.10/CREDITS b/third_party/windows/fltk-1.1.10/CREDITS new file mode 100644 index 0000000..a2769e2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/CREDITS @@ -0,0 +1,54 @@ +CREDITS - Fast Light Tool Kit (FLTK) Version 1.1.5 +-------------------------------------------------- + + This file lists the people responsible for the toolkit you + are now using. If you've looking for your name in lights + but we've forgotten you here, please send an email to + "fltk-bugs@fltk.org" and we'll update this file accordingly. + + +CORE DEVELOPERS + + The following people do the day-to-day development of FLTK: + + Craig P. Earls + Curtis Edwards (trilec@users.sourceforge.net) + Gustavo Hime (hime@users.sourceforge.net) + Talbot Hughes + Robert Kesterson (robertk@users.sourceforge.net) + Matthias Melcher (matthias@users.sourceforge.net) + James Dean Palmer (jamespalmer@users.sourceforge.net) + Vincent Penne (vincentp@users.sourceforge.net) + Bill Spitzak (spitzak@users.sourceforge.net) + Michael Sweet (easysw@users.sourceforge.net) + Carl Thompson (clip@users.sourceforge.net) + Nafees Bin Zafar (nafees@users.sourceforge.net) + + +OTHER CONTRIBUTORS + + The following people have contributed fixes or enhancements + for FLTK: + + Teun Burgers + Paul Chambers + Fabien Costantini + Stephen Davies + Yuri D'Elia + Greg Ercolano + Yuri Fedorchenko + George Garvey + Mikael Hultgren + Stuart Levy + Howard Lightstone + Mike Lindner + Alexander Mai + Alexander Rabi + James Roth + Albrecht Schlosser + Andrea Suatoni + Paul Sydney + Aaron Ucko + Emanuele Vicentini + Jim Wilson + Ken Yarnall diff --git a/third_party/windows/fltk-1.1.10/DartConfig.cmake b/third_party/windows/fltk-1.1.10/DartConfig.cmake new file mode 100644 index 0000000..a72cf9d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/DartConfig.cmake @@ -0,0 +1,38 @@ +# Dashboard is opened for submissions for a 24 hour period starting at +# the specified NIGHLY_START_TIME. Time is specified in 24 hour format. +SET (NIGHTLY_START_TIME "21:00:00 EDT") + +# Dart server to submit results (used by client) +SET (DROP_METHOD "http") +SET (DROP_SITE "public.kitware.com") +SET (DROP_LOCATION "/cgi-bin/HTTPUploadDartFile.cgi") +SET (TRIGGER_SITE "http://${DROP_SITE}/cgi-bin/Submit-Fltk-TestingResults.pl") + +# Project Home Page +SET (PROJECT_URL "http://www.fltk.org") + +# Dart server configuration +SET (ROLLUP_URL "http://${DROP_SITE}/cgi-bin/fltk-rollup-dashboard.sh") +SET (CVS_WEB_URL "http://cvs.sourceforge.net/viewcvs.py/fltk/fltk/") +SET (CVS_WEB_CVSROOT "fltk") + +SET (USE_GNATS "On") +SET (GNATS_WEB_URL "http://www.fltk.org/str.php") + +# Continuous email delivery variables +SET (CONTINUOUS_FROM "fltk-dashboard@public.kitware.com") +SET (SMTP_MAILHOST "public.kitware.com") +SET (CONTINUOUS_MONITOR_LIST "fltk-dashboard@public.kitware.com") +SET (CONTINUOUS_BASE_URL "http://public.kitware.com/Fltk/Testing") + +SET (DELIVER_BROKEN_BUILD_EMAIL_WITH_TEST_FAILURES ON) +SET (DELIVER_BROKEN_BUILD_EMAIL "Continuous Nightly") +SET (EMAIL_FROM "fltk-dashboard@public.kitware.com") +SET (DARTBOARD_BASE_URL "http://public.kitware.com/Fltk/Testing") + +SET (DELIVER_BROKEN_BUILD_EMAIL_WITH_CONFIGURE_FAILURES 1) +SET (DELIVER_BROKEN_BUILD_EMAIL_WITH_BUILD_ERRORS 1) +SET (DELIVER_BROKEN_BUILD_EMAIL_WITH_BUILD_WARNINGS 1) +SET (DELIVER_BROKEN_BUILD_EMAIL_WITH_TEST_NOT_RUNS 1) +SET (DELIVER_BROKEN_BUILD_EMAIL_WITH_TEST_FAILURES 1) + diff --git a/third_party/windows/fltk-1.1.10/FL/Enumerations.H b/third_party/windows/fltk-1.1.10/FL/Enumerations.H new file mode 100644 index 0000000..f9c1fba --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Enumerations.H @@ -0,0 +1,456 @@ +// +// "$Id: Enumerations.H 6817 2009-07-02 09:42:17Z AlbrechtS $" +// +// Enumerations for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2009 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Enumerations_H +#define Fl_Enumerations_H + +# include "Fl_Export.H" + + +// +// The FLTK version number; this is changed slightly from the beta versions +// because the old "const double" definition would not allow for conditional +// compilation... +// +// FL_VERSION is a double that describes the major and minor version numbers. +// Version 1.1 is actually stored as 1.01 to allow for more than 9 minor +// releases. +// +// The FL_MAJOR_VERSION, FL_MINOR_VERSION, and FL_PATCH_VERSION constants +// give the integral values for the major, minor, and patch releases +// respectively. +// + +#define FL_MAJOR_VERSION 1 +#define FL_MINOR_VERSION 1 +#define FL_PATCH_VERSION 10 +#define FL_VERSION ((double)FL_MAJOR_VERSION + \ + (double)FL_MINOR_VERSION * 0.01 + \ + (double)FL_PATCH_VERSION * 0.0001) + +typedef unsigned char uchar; +typedef unsigned long ulong; + +enum Fl_Event { // events + FL_NO_EVENT = 0, + FL_PUSH = 1, + FL_RELEASE = 2, + FL_ENTER = 3, + FL_LEAVE = 4, + FL_DRAG = 5, + FL_FOCUS = 6, + FL_UNFOCUS = 7, + FL_KEYDOWN = 8, + FL_KEYUP = 9, + FL_CLOSE = 10, + FL_MOVE = 11, + FL_SHORTCUT = 12, + FL_DEACTIVATE = 13, + FL_ACTIVATE = 14, + FL_HIDE = 15, + FL_SHOW = 16, + FL_PASTE = 17, + FL_SELECTIONCLEAR = 18, + FL_MOUSEWHEEL = 19, + FL_DND_ENTER = 20, + FL_DND_DRAG = 21, + FL_DND_LEAVE = 22, + FL_DND_RELEASE = 23 +}; +#define FL_KEYBOARD FL_KEYDOWN + +enum Fl_When { // Fl_Widget::when(): + FL_WHEN_NEVER = 0, + FL_WHEN_CHANGED = 1, + FL_WHEN_RELEASE = 4, + FL_WHEN_RELEASE_ALWAYS= 6, + FL_WHEN_ENTER_KEY = 8, + FL_WHEN_ENTER_KEY_ALWAYS=10, + FL_WHEN_ENTER_KEY_CHANGED=11, + FL_WHEN_NOT_CHANGED = 2 // modifier bit to disable changed() test +}; + +// Fl::event_key() and Fl::get_key(n) (use ascii letters for all other keys): +#define FL_Button 0xfee8 // use Fl_Button+FL_*_MOUSE +#define FL_BackSpace 0xff08 +#define FL_Tab 0xff09 +#define FL_Enter 0xff0d +#define FL_Pause 0xff13 +#define FL_Scroll_Lock 0xff14 +#define FL_Escape 0xff1b +#define FL_Home 0xff50 +#define FL_Left 0xff51 +#define FL_Up 0xff52 +#define FL_Right 0xff53 +#define FL_Down 0xff54 +#define FL_Page_Up 0xff55 +#define FL_Page_Down 0xff56 +#define FL_End 0xff57 +#define FL_Print 0xff61 +#define FL_Insert 0xff63 +#define FL_Menu 0xff67 // the "menu/apps" key on XFree86 +#define FL_Help 0xff68 // the 'help' key on Mac keyboards +#define FL_Num_Lock 0xff7f +#define FL_KP 0xff80 // use FL_KP+'x' for 'x' on numeric keypad +#define FL_KP_Enter 0xff8d // same as Fl_KP+'\r' +#define FL_KP_Last 0xffbd // use to range-check keypad +#define FL_F 0xffbd // use FL_F+n for function key n +#define FL_F_Last 0xffe0 // use to range-check function keys +#define FL_Shift_L 0xffe1 +#define FL_Shift_R 0xffe2 +#define FL_Control_L 0xffe3 +#define FL_Control_R 0xffe4 +#define FL_Caps_Lock 0xffe5 +#define FL_Meta_L 0xffe7 // the left MSWindows key on XFree86 +#define FL_Meta_R 0xffe8 // the right MSWindows key on XFree86 +#define FL_Alt_L 0xffe9 +#define FL_Alt_R 0xffea +#define FL_Delete 0xffff + +// Fl::event_button(): +#define FL_LEFT_MOUSE 1 +#define FL_MIDDLE_MOUSE 2 +#define FL_RIGHT_MOUSE 3 + +// Fl::event_state(): +#define FL_SHIFT 0x00010000 +#define FL_CAPS_LOCK 0x00020000 +#define FL_CTRL 0x00040000 +#define FL_ALT 0x00080000 +#define FL_NUM_LOCK 0x00100000 // most X servers do this? +#define FL_META 0x00400000 // correct for XFree86 +#define FL_SCROLL_LOCK 0x00800000 // correct for XFree86 +#define FL_BUTTON1 0x01000000 +#define FL_BUTTON2 0x02000000 +#define FL_BUTTON3 0x04000000 +#define FL_BUTTONS 0x7f000000 // All possible buttons +#define FL_BUTTON(n) (0x00800000<<(n)) + +#ifdef __APPLE__ +# define FL_COMMAND FL_META +#else +# define FL_COMMAND FL_CTRL +#endif // __APPLE__ + +enum Fl_Boxtype { // boxtypes (if you change these you must fix fl_boxtype.C): + FL_NO_BOX = 0, FL_FLAT_BOX, + + FL_UP_BOX, FL_DOWN_BOX, + FL_UP_FRAME, FL_DOWN_FRAME, + FL_THIN_UP_BOX, FL_THIN_DOWN_BOX, + FL_THIN_UP_FRAME, FL_THIN_DOWN_FRAME, + FL_ENGRAVED_BOX, FL_EMBOSSED_BOX, + FL_ENGRAVED_FRAME, FL_EMBOSSED_FRAME, + FL_BORDER_BOX, _FL_SHADOW_BOX, + FL_BORDER_FRAME, _FL_SHADOW_FRAME, + _FL_ROUNDED_BOX, _FL_RSHADOW_BOX, + _FL_ROUNDED_FRAME, _FL_RFLAT_BOX, + _FL_ROUND_UP_BOX, _FL_ROUND_DOWN_BOX, + _FL_DIAMOND_UP_BOX, _FL_DIAMOND_DOWN_BOX, + _FL_OVAL_BOX, _FL_OSHADOW_BOX, + _FL_OVAL_FRAME, _FL_OFLAT_BOX, + _FL_PLASTIC_UP_BOX, _FL_PLASTIC_DOWN_BOX, + _FL_PLASTIC_UP_FRAME, _FL_PLASTIC_DOWN_FRAME, + _FL_PLASTIC_THIN_UP_BOX, _FL_PLASTIC_THIN_DOWN_BOX, + _FL_PLASTIC_ROUND_UP_BOX, _FL_PLASTIC_ROUND_DOWN_BOX, + _FL_GTK_UP_BOX, _FL_GTK_DOWN_BOX, + _FL_GTK_UP_FRAME, _FL_GTK_DOWN_FRAME, + _FL_GTK_THIN_UP_BOX, _FL_GTK_THIN_DOWN_BOX, + _FL_GTK_THIN_UP_FRAME, _FL_GTK_THIN_DOWN_FRAME, + _FL_GTK_ROUND_UP_BOX, _FL_GTK_ROUND_DOWN_BOX, + FL_FREE_BOXTYPE +}; +extern FL_EXPORT Fl_Boxtype fl_define_FL_ROUND_UP_BOX(); +#define FL_ROUND_UP_BOX fl_define_FL_ROUND_UP_BOX() +#define FL_ROUND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_ROUND_UP_BOX()+1) +extern FL_EXPORT Fl_Boxtype fl_define_FL_SHADOW_BOX(); +#define FL_SHADOW_BOX fl_define_FL_SHADOW_BOX() +#define FL_SHADOW_FRAME (Fl_Boxtype)(fl_define_FL_SHADOW_BOX()+2) +extern FL_EXPORT Fl_Boxtype fl_define_FL_ROUNDED_BOX(); +#define FL_ROUNDED_BOX fl_define_FL_ROUNDED_BOX() +#define FL_ROUNDED_FRAME (Fl_Boxtype)(fl_define_FL_ROUNDED_BOX()+2) +extern FL_EXPORT Fl_Boxtype fl_define_FL_RFLAT_BOX(); +#define FL_RFLAT_BOX fl_define_FL_RFLAT_BOX() +extern FL_EXPORT Fl_Boxtype fl_define_FL_RSHADOW_BOX(); +#define FL_RSHADOW_BOX fl_define_FL_RSHADOW_BOX() +extern FL_EXPORT Fl_Boxtype fl_define_FL_DIAMOND_BOX(); +#define FL_DIAMOND_UP_BOX fl_define_FL_DIAMOND_BOX() +#define FL_DIAMOND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_DIAMOND_BOX()+1) +extern FL_EXPORT Fl_Boxtype fl_define_FL_OVAL_BOX(); +#define FL_OVAL_BOX fl_define_FL_OVAL_BOX() +#define FL_OSHADOW_BOX (Fl_Boxtype)(fl_define_FL_OVAL_BOX()+1) +#define FL_OVAL_FRAME (Fl_Boxtype)(fl_define_FL_OVAL_BOX()+2) +#define FL_OFLAT_BOX (Fl_Boxtype)(fl_define_FL_OVAL_BOX()+3) + +extern FL_EXPORT Fl_Boxtype fl_define_FL_PLASTIC_UP_BOX(); +#define FL_PLASTIC_UP_BOX fl_define_FL_PLASTIC_UP_BOX() +#define FL_PLASTIC_DOWN_BOX (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+1) +#define FL_PLASTIC_UP_FRAME (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+2) +#define FL_PLASTIC_DOWN_FRAME (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+3) +#define FL_PLASTIC_THIN_UP_BOX (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+4) +#define FL_PLASTIC_THIN_DOWN_BOX (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+5) +#define FL_PLASTIC_ROUND_UP_BOX (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+6) +#define FL_PLASTIC_ROUND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_PLASTIC_UP_BOX()+7) + +extern FL_EXPORT Fl_Boxtype fl_define_FL_GTK_UP_BOX(); +#define FL_GTK_UP_BOX fl_define_FL_GTK_UP_BOX() +#define FL_GTK_DOWN_BOX (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+1) +#define FL_GTK_UP_FRAME (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+2) +#define FL_GTK_DOWN_FRAME (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+3) +#define FL_GTK_THIN_UP_BOX (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+4) +#define FL_GTK_THIN_DOWN_BOX (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+5) +#define FL_GTK_THIN_UP_FRAME (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+6) +#define FL_GTK_THIN_DOWN_FRAME (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+7) +#define FL_GTK_ROUND_UP_BOX (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+8) +#define FL_GTK_ROUND_DOWN_BOX (Fl_Boxtype)(fl_define_FL_GTK_UP_BOX()+9) + +// conversions of box types to other boxtypes: +inline Fl_Boxtype fl_box(Fl_Boxtype b) { + return (Fl_Boxtype)((b1)?b:(b-2)); +} +inline Fl_Boxtype fl_down(Fl_Boxtype b) { + return (Fl_Boxtype)((b lines) Fl_Browser_::display(find_line(lines)); + else Fl_Browser_::display(find_line(n)); + } + + // for back compatability only: + void replace(int a, const char* b) {text(a, b);} + void display(int, int=1); +}; + +#endif + +// +// End of "$Id: Fl_Browser.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Browser_.H b/third_party/windows/fltk-1.1.10/FL/Fl_Browser_.H new file mode 100644 index 0000000..90da2e7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Browser_.H @@ -0,0 +1,154 @@ +// +// "$Id: Fl_Browser_.H 4879 2006-03-28 23:27:20Z matt $" +// +// Common browser header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// This is the base class for browsers. To be useful it must +// be subclassed and several virtual functions defined. The +// Forms-compatable browser and the file chooser's browser are +// subclassed off of this. + +// Yes, I know this should be a template... + +#ifndef Fl_Browser__H +#define Fl_Browser__H + +#ifndef Fl_Group_H +#include "Fl_Group.H" +#endif +#include "Fl_Scrollbar.H" + +#define FL_NORMAL_BROWSER 0 +#define FL_SELECT_BROWSER 1 +#define FL_HOLD_BROWSER 2 +#define FL_MULTI_BROWSER 3 + +class FL_EXPORT Fl_Browser_ : public Fl_Group { + int position_; // where user wants it scrolled to + int real_position_; // the current vertical scrolling position + int hposition_; // where user wants it panned to + int real_hposition_; // the current horizontal scrolling position + int offset_; // how far down top_ item the real_position is + int max_width; // widest object seen so far + uchar has_scrollbar_; // which scrollbars are enabled + uchar textfont_, textsize_; + unsigned textcolor_; + void* top_; // which item scrolling position is in + void* selection_; // which is selected (except for FL_MULTI_BROWSER) + void *redraw1,*redraw2; // minimal update pointers + void* max_width_item; // which item has max_width_ + + static int scrollbar_width_; + + void update_top(); + +protected: + + // All of the following must be supplied by the subclass: + virtual void *item_first() const = 0; + virtual void *item_next(void *) const = 0; + virtual void *item_prev(void *) const = 0; + virtual int item_height(void *) const = 0; + virtual int item_width(void *) const = 0; + virtual int item_quick_height(void *) const ; + virtual void item_draw(void *,int,int,int,int) const = 0; + // you don't have to provide these but it may help speed it up: + virtual int full_width() const ; // current width of all items + virtual int full_height() const ; // current height of all items + virtual int incr_height() const ; // average height of an item + // These only need to be done by subclass if you want a multi-browser: + virtual void item_select(void *,int=1); + virtual int item_selected(void *) const ; + + // things the subclass may want to call: + void *top() const {return top_;} + void *selection() const {return selection_;} + void new_list(); // completely clobber all data, as though list replaced + void deleting(void *a); // get rid of any pointers to a + void replacing(void *a,void *b); // change a pointers to b + void swapping(void *a,void *b); // exchange pointers a and b + void inserting(void *a,void *b); // insert b near a + int displayed(void *) const ; // true if this line is visible + void redraw_line(void *); // minimal update, no change in size + void redraw_lines() {damage(FL_DAMAGE_SCROLL);} // redraw all of them + void bbox(int&,int&,int&,int&) const; + int leftedge() const; // x position after scrollbar & border + void *find_item(int my); // item under mouse + void draw(int,int,int,int); + int handle(int,int,int,int,int); + + void draw(); + Fl_Browser_(int,int,int,int,const char * = 0); + +public: + + Fl_Scrollbar scrollbar; // Vertical scrollbar + Fl_Scrollbar hscrollbar; // Horizontal scrollbar + + int handle(int); + void resize(int,int,int,int); + + int select(void *,int=1,int docallbacks=0); + int select_only(void *,int docallbacks=0); + int deselect(int docallbacks=0); + int position() const {return position_;} + int hposition() const {return hposition_;} + void position(int); // scroll to here + void hposition(int); // pan to here + void display(void*); // scroll so this item is shown + + uchar has_scrollbar() const {return has_scrollbar_;} + void has_scrollbar(uchar i) {has_scrollbar_ = i;} + enum { // values for has_scrollbar() + HORIZONTAL = 1, + VERTICAL = 2, + BOTH = 3, + ALWAYS_ON = 4, + HORIZONTAL_ALWAYS = 5, + VERTICAL_ALWAYS = 6, + BOTH_ALWAYS = 7 + }; + + Fl_Font textfont() const {return (Fl_Font)textfont_;} + void textfont(uchar s) {textfont_ = s;} + uchar textsize() const {return textsize_;} + void textsize(uchar s) {textsize_ = s;} + Fl_Color textcolor() const {return (Fl_Color)textcolor_;} + void textcolor(unsigned n) {textcolor_ = n;} + + static void scrollbar_width(int b) {scrollbar_width_ = b;} + static int scrollbar_width() {return scrollbar_width_;} + + // for back compatability: + void scrollbar_right() {scrollbar.align(FL_ALIGN_RIGHT);} + void scrollbar_left() {scrollbar.align(FL_ALIGN_LEFT);} + +}; + +#endif + +// +// End of "$Id: Fl_Browser_.H 4879 2006-03-28 23:27:20Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Button.H b/third_party/windows/fltk-1.1.10/FL/Fl_Button.H new file mode 100644 index 0000000..4b3b5ae --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Button.H @@ -0,0 +1,78 @@ +// +// "$Id: Fl_Button.H 4288 2005-04-16 00:13:17Z mike $" +// +// Button header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Button_H +#define Fl_Button_H + +#ifndef Fl_Widget_H +#include "Fl_Widget.H" +#endif + +// values for type() +#define FL_NORMAL_BUTTON 0 +#define FL_TOGGLE_BUTTON 1 +#define FL_RADIO_BUTTON (FL_RESERVED_TYPE+2) +#define FL_HIDDEN_BUTTON 3 // for Forms compatability + +extern FL_EXPORT int fl_old_shortcut(const char*); + +class FL_EXPORT Fl_Button : public Fl_Widget { + + int shortcut_; + char value_; + char oldval; + uchar down_box_; + +protected: + + virtual void draw(); + +public: + + virtual int handle(int); + Fl_Button(int,int,int,int,const char * = 0); + int value(int); + char value() const {return value_;} + int set() {return value(1);} + int clear() {return value(0);} + void setonly(); // this should only be called on FL_RADIO_BUTTONs + int shortcut() const {return shortcut_;} + void shortcut(int s) {shortcut_ = s;} + Fl_Boxtype down_box() const {return (Fl_Boxtype)down_box_;} + void down_box(Fl_Boxtype b) {down_box_ = b;} + + // back compatability: + void shortcut(const char *s) {shortcut(fl_old_shortcut(s));} + Fl_Color down_color() const {return selection_color();} + void down_color(unsigned c) {selection_color(c);} +}; + +#endif + +// +// End of "$Id: Fl_Button.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Chart.H b/third_party/windows/fltk-1.1.10/FL/Fl_Chart.H new file mode 100644 index 0000000..528594e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Chart.H @@ -0,0 +1,93 @@ +// +// "$Id: Fl_Chart.H 4288 2005-04-16 00:13:17Z mike $" +// +// Forms chart header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Chart_H +#define Fl_Chart_H + +#ifndef Fl_Widget_H +#include "Fl_Widget.H" +#endif + +// values for type() +#define FL_BAR_CHART 0 +#define FL_HORBAR_CHART 1 +#define FL_LINE_CHART 2 +#define FL_FILL_CHART 3 +#define FL_SPIKE_CHART 4 +#define FL_PIE_CHART 5 +#define FL_SPECIALPIE_CHART 6 + +#define FL_FILLED_CHART FL_FILL_CHART // compatibility + +#define FL_CHART_MAX 128 +#define FL_CHART_LABEL_MAX 18 + +struct FL_CHART_ENTRY { + float val; + unsigned col; + char str[FL_CHART_LABEL_MAX+1]; +}; + +class FL_EXPORT Fl_Chart : public Fl_Widget { + int numb; + int maxnumb; + int sizenumb; + FL_CHART_ENTRY *entries; + double min,max; + uchar autosize_; + uchar textfont_,textsize_; + unsigned textcolor_; +protected: + void draw(); +public: + Fl_Chart(int,int,int,int,const char * = 0); + ~Fl_Chart(); + void clear(); + void add(double, const char * =0, unsigned=0); + void insert(int, double, const char * =0, unsigned=0); + void replace(int, double, const char * =0, unsigned=0); + void bounds(double *a,double *b) const {*a = min; *b = max;} + void bounds(double a,double b); + int size() const {return numb;} + void size(int W, int H) { Fl_Widget::size(W, H); } + int maxsize() const {return maxnumb;} + void maxsize(int); + Fl_Font textfont() const {return (Fl_Font)textfont_;} + void textfont(uchar s) {textfont_ = s;} + uchar textsize() const {return textsize_;} + void textsize(uchar s) {textsize_ = s;} + Fl_Color textcolor() const {return (Fl_Color)textcolor_;} + void textcolor(unsigned n) {textcolor_ = n;} + uchar autosize() const {return autosize_;} + void autosize(uchar n) {autosize_ = n;} +}; + +#endif + +// +// End of "$Id: Fl_Chart.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Check_Browser.H b/third_party/windows/fltk-1.1.10/FL/Fl_Check_Browser.H new file mode 100644 index 0000000..03bcf95 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Check_Browser.H @@ -0,0 +1,103 @@ +// +// "$Id: Fl_Check_Browser.H 5979 2007-11-19 15:46:24Z matt $" +// +// Fl_Check_Browser header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Check_Browser_H +#define Fl_Check_Browser_H + +#include "Fl.H" +#include "Fl_Browser_.H" + +class FL_EXPORT Fl_Check_Browser : public Fl_Browser_ { + /* required routines for Fl_Browser_ subclass: */ + + void *item_first() const; + void *item_next(void *) const; + void *item_prev(void *) const; + int item_height(void *) const; + int item_width(void *) const; + void item_draw(void *, int, int, int, int) const; + void item_select(void *, int); + int item_selected(void *) const; + + /* private data */ + + public: // IRIX 5.3 C++ compiler doesn't support private structures... + + struct cb_item { + cb_item *next; + cb_item *prev; + char checked; + char selected; + char *text; + }; + + private: + + cb_item *first; + cb_item *last; + cb_item *cache; + int cached_item; + int nitems_; + int nchecked_; + cb_item *find_item(int) const; + int lineno(cb_item *) const; + + public: + + Fl_Check_Browser(int x, int y, int w, int h, const char *l = 0); + ~Fl_Check_Browser() { clear(); } + int add(char *s); // add an (unchecked) item + int add(char *s, int b); // add an item and set checked + // both return the new nitems() + int remove(int item); // delete an item. Returns nitems() + + // inline const char * methods to avoid breaking binary compatibility... + int add(const char *s) { return add((char *)s); } + int add(const char *s, int b) { return add((char *)s, b); } + + void clear(); // delete all items + int nitems() const { return nitems_; } + int nchecked() const { return nchecked_; } + int checked(int item) const; + void checked(int item, int b); + void set_checked(int item) { checked(item, 1); } + void check_all(); + void check_none(); + int value() const; // currently selected item + char *text(int item) const; // returns pointer to internal buffer + + protected: + + int handle(int); +}; + +#endif // Fl_Check_Browser_H + +// +// End of "$Id: Fl_Check_Browser.H 5979 2007-11-19 15:46:24Z matt $". +// + diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Check_Button.H b/third_party/windows/fltk-1.1.10/FL/Fl_Check_Button.H new file mode 100644 index 0000000..689a24b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Check_Button.H @@ -0,0 +1,42 @@ +// +// "$Id: Fl_Check_Button.H 4288 2005-04-16 00:13:17Z mike $" +// +// Check button header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Check_Button_H +#define Fl_Check_Button_H + +#include "Fl_Light_Button.H" + +class FL_EXPORT Fl_Check_Button : public Fl_Light_Button { +public: + Fl_Check_Button(int x,int y,int w,int h,const char *l = 0); +}; + +#endif + +// +// End of "$Id: Fl_Check_Button.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Choice.H b/third_party/windows/fltk-1.1.10/FL/Fl_Choice.H new file mode 100644 index 0000000..d547547 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Choice.H @@ -0,0 +1,48 @@ +// +// "$Id: Fl_Choice.H 4288 2005-04-16 00:13:17Z mike $" +// +// Choice header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Choice_H +#define Fl_Choice_H + +#include "Fl_Menu_.H" + +class FL_EXPORT Fl_Choice : public Fl_Menu_ { +protected: + void draw(); +public: + int handle(int); + Fl_Choice(int,int,int,int,const char * = 0); + int value(const Fl_Menu_Item*); + int value(int i); + int value() const {return Fl_Menu_::value();} +}; + +#endif + +// +// End of "$Id: Fl_Choice.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Clock.H b/third_party/windows/fltk-1.1.10/FL/Fl_Clock.H new file mode 100644 index 0000000..b1aaed5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Clock.H @@ -0,0 +1,75 @@ +// +// "$Id: Fl_Clock.H 4288 2005-04-16 00:13:17Z mike $" +// +// Clock header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Clock_H +#define Fl_Clock_H + +#ifndef Fl_Widget_H +#include "Fl_Widget.H" +#endif + +// values for type: +#define FL_SQUARE_CLOCK 0 +#define FL_ROUND_CLOCK 1 +#define FL_ANALOG_CLOCK FL_SQUARE_CLOCK +#define FL_DIGITAL_CLOCK FL_SQUARE_CLOCK // nyi + +// a Fl_Clock_Output can be used to display a program-supplied time: + +class FL_EXPORT Fl_Clock_Output : public Fl_Widget { + int hour_, minute_, second_; + ulong value_; + void drawhands(Fl_Color,Fl_Color); // part of draw +protected: + void draw(int, int, int, int); + void draw(); +public: + Fl_Clock_Output(int x,int y,int w,int h, const char *l = 0); + void value(ulong v); // set to this Unix time + void value(int,int,int); // set hour, minute, second + ulong value() const {return value_;} + int hour() const {return hour_;} + int minute() const {return minute_;} + int second() const {return second_;} +}; + +// a Fl_Clock displays the current time always by using a timeout: + +class FL_EXPORT Fl_Clock : public Fl_Clock_Output { +public: + int handle(int); + void update(); + Fl_Clock(int x,int y,int w,int h, const char *l = 0); + Fl_Clock(uchar t,int x,int y,int w,int h, const char *l); + ~Fl_Clock(); +}; + +#endif + +// +// End of "$Id: Fl_Clock.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Color_Chooser.H b/third_party/windows/fltk-1.1.10/FL/Fl_Color_Chooser.H new file mode 100644 index 0000000..6bd49d5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Color_Chooser.H @@ -0,0 +1,104 @@ +// +// "$Id: Fl_Color_Chooser.H 4288 2005-04-16 00:13:17Z mike $" +// +// Color chooser header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// The color chooser object and the color chooser popup. The popup +// is just a window containing a single color chooser and some boxes +// to indicate the current and cancelled color. + +#ifndef Fl_Color_Chooser_H +#define Fl_Color_Chooser_H + +#include +#include +#include +#include +#include + +class FL_EXPORT Flcc_HueBox : public Fl_Widget { + int px, py; +protected: + void draw(); + int handle_key(int); +public: + int handle(int); + Flcc_HueBox(int X, int Y, int W, int H) : Fl_Widget(X,Y,W,H) { + px = py = 0;} +}; + +class FL_EXPORT Flcc_ValueBox : public Fl_Widget { + int py; +protected: + void draw(); + int handle_key(int); +public: + int handle(int); + Flcc_ValueBox(int X, int Y, int W, int H) : Fl_Widget(X,Y,W,H) { + py = 0;} +}; + +class FL_EXPORT Flcc_Value_Input : public Fl_Value_Input { +public: + int format(char*); + Flcc_Value_Input(int X, int Y, int W, int H) : Fl_Value_Input(X,Y,W,H) {} +}; + +class FL_EXPORT Fl_Color_Chooser : public Fl_Group { + Flcc_HueBox huebox; + Flcc_ValueBox valuebox; + Fl_Choice choice; + Flcc_Value_Input rvalue; + Flcc_Value_Input gvalue; + Flcc_Value_Input bvalue; + Fl_Box resize_box; + double hue_, saturation_, value_; + double r_, g_, b_; + void set_valuators(); + static void rgb_cb(Fl_Widget*, void*); + static void mode_cb(Fl_Widget*, void*); +public: + int mode() {return choice.value();} + double hue() const {return hue_;} + double saturation() const {return saturation_;} + double value() const {return value_;} + double r() const {return r_;} + double g() const {return g_;} + double b() const {return b_;} + int hsv(double,double,double); + int rgb(double,double,double); + static void hsv2rgb(double, double, double,double&,double&,double&); + static void rgb2hsv(double, double, double,double&,double&,double&); + Fl_Color_Chooser(int,int,int,int,const char* = 0); +}; + +FL_EXPORT int fl_color_chooser(const char* name, double& r, double& g, double& b); +FL_EXPORT int fl_color_chooser(const char* name, uchar& r, uchar& g, uchar& b); + +#endif + +// +// End of "$Id: Fl_Color_Chooser.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Counter.H b/third_party/windows/fltk-1.1.10/FL/Fl_Counter.H new file mode 100644 index 0000000..412325a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Counter.H @@ -0,0 +1,76 @@ +// +// "$Id: Fl_Counter.H 4288 2005-04-16 00:13:17Z mike $" +// +// Counter header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// A numerical value with up/down step buttons. From Forms. + +#ifndef Fl_Counter_H +#define Fl_Counter_H + +#ifndef Fl_Valuator_H +#include "Fl_Valuator.H" +#endif + +// values for type(): +#define FL_NORMAL_COUNTER 0 +#define FL_SIMPLE_COUNTER 1 + +class FL_EXPORT Fl_Counter : public Fl_Valuator { + + uchar textfont_, textsize_; + unsigned textcolor_; + double lstep_; + uchar mouseobj; + static void repeat_callback(void *); + int calc_mouseobj(); + void increment_cb(); + +protected: + + void draw(); + +public: + + int handle(int); + Fl_Counter(int,int,int,int,const char * = 0); + ~Fl_Counter(); + void lstep(double a) {lstep_ = a;} + void step(double a,double b) {Fl_Valuator::step(a); lstep_ = b;} + void step(double a) {Fl_Valuator::step(a);} + Fl_Font textfont() const {return (Fl_Font)textfont_;} + void textfont(uchar s) {textfont_ = s;} + uchar textsize() const {return textsize_;} + void textsize(uchar s) {textsize_ = s;} + Fl_Color textcolor() const {return (Fl_Color)textcolor_;} + void textcolor(unsigned s) {textcolor_ = s;} + +}; + +#endif + +// +// End of "$Id: Fl_Counter.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Dial.H b/third_party/windows/fltk-1.1.10/FL/Fl_Dial.H new file mode 100644 index 0000000..07bbd21 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Dial.H @@ -0,0 +1,67 @@ +// +// "$Id: Fl_Dial.H 4288 2005-04-16 00:13:17Z mike $" +// +// Dial header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Dial_H +#define Fl_Dial_H + +#ifndef Fl_Valuator_H +#include "Fl_Valuator.H" +#endif + +// values for type(): +#define FL_NORMAL_DIAL 0 +#define FL_LINE_DIAL 1 +#define FL_FILL_DIAL 2 + +class FL_EXPORT Fl_Dial : public Fl_Valuator { + + short a1,a2; + +protected: + + // these allow subclasses to put the dial in a smaller area: + void draw(int, int, int, int); + int handle(int, int, int, int, int); + void draw(); + +public: + + int handle(int); + Fl_Dial(int x,int y,int w,int h, const char *l = 0); + short angle1() const {return a1;} + void angle1(short a) {a1 = a;} + short angle2() const {return a2;} + void angle2(short a) {a2 = a;} + void angles(short a, short b) {a1 = a; a2 = b;} + +}; + +#endif + +// +// End of "$Id: Fl_Dial.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Double_Window.H b/third_party/windows/fltk-1.1.10/FL/Fl_Double_Window.H new file mode 100644 index 0000000..5a8c767 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Double_Window.H @@ -0,0 +1,54 @@ +// +// "$Id: Fl_Double_Window.H 4288 2005-04-16 00:13:17Z mike $" +// +// Double-buffered window header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Double_Window_H +#define Fl_Double_Window_H + +#include "Fl_Window.H" + +class FL_EXPORT Fl_Double_Window : public Fl_Window { +protected: + void flush(int eraseoverlay); + char force_doublebuffering_; // force db, even if the OS already buffers windows (overlays need that on MacOS and Windows2000) +public: + void show(); + void show(int a, char **b) {Fl_Window::show(a,b);} + void flush(); + void resize(int,int,int,int); + void hide(); + ~Fl_Double_Window(); + Fl_Double_Window(int W, int H, const char *l = 0) + : Fl_Window(W,H,l), force_doublebuffering_(0) { type(FL_DOUBLE_WINDOW); } + Fl_Double_Window(int X, int Y, int W, int H, const char *l = 0) + : Fl_Window(X,Y,W,H,l), force_doublebuffering_(0) { type(FL_DOUBLE_WINDOW); } +}; + +#endif + +// +// End of "$Id: Fl_Double_Window.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Export.H b/third_party/windows/fltk-1.1.10/FL/Fl_Export.H new file mode 100644 index 0000000..a78daa0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Export.H @@ -0,0 +1,49 @@ +/* + * "$Id: Fl_Export.H 4288 2005-04-16 00:13:17Z mike $" + * + * WIN32 DLL export definitions for the Fast Light Tool Kit (FLTK). + * + * Copyright 1998-2005 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems on the following page: + * + * http://www.fltk.org/str.php + */ + +#ifndef Fl_Export_H +# define Fl_Export_H + +/* + * The following is only used when building DLLs under WIN32... + */ + +# if defined(FL_DLL) && (defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__) || __GNUC__ >= 3) +# ifdef FL_LIBRARY +# define FL_EXPORT __declspec(dllexport) +# else +# define FL_EXPORT __declspec(dllimport) +# endif /* FL_LIBRARY */ +# else +# define FL_EXPORT +# endif /* FL_DLL */ + +#endif /* !Fl_Export_H */ + +/* + * End of "$Id: Fl_Export.H 4288 2005-04-16 00:13:17Z mike $". + */ diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_File_Browser.H b/third_party/windows/fltk-1.1.10/FL/Fl_File_Browser.H new file mode 100644 index 0000000..463f5ac --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_File_Browser.H @@ -0,0 +1,81 @@ +// +// "$Id: Fl_File_Browser.H 4288 2005-04-16 00:13:17Z mike $" +// +// FileBrowser definitions. +// +// Copyright 1999-2005 by Michael Sweet. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// +// Include necessary header files... +// + +#ifndef _Fl_File_Browser_H_ +# define _Fl_File_Browser_H_ + +# include "Fl_Browser.H" +# include "Fl_File_Icon.H" +# include "filename.H" + + +// +// Fl_File_Browser class... +// + +class FL_EXPORT Fl_File_Browser : public Fl_Browser +{ + int filetype_; + const char *directory_; + uchar iconsize_; + const char *pattern_; + + int full_height() const; + int item_height(void *) const; + int item_width(void *) const; + void item_draw(void *, int, int, int, int) const; + int incr_height() const { return (item_height(0)); } + +public: + enum { FILES, DIRECTORIES }; + + Fl_File_Browser(int, int, int, int, const char * = 0); + + uchar iconsize() const { return (iconsize_); }; + void iconsize(uchar s) { iconsize_ = s; redraw(); }; + + void filter(const char *pattern); + const char *filter() const { return (pattern_); }; + + int load(const char *directory, Fl_File_Sort_F *sort = fl_numericsort); + + uchar textsize() const { return (Fl_Browser::textsize()); }; + void textsize(uchar s) { Fl_Browser::textsize(s); iconsize_ = (uchar)(3 * s / 2); }; + + int filetype() const { return (filetype_); }; + void filetype(int t) { filetype_ = t; }; +}; + +#endif // !_Fl_File_Browser_H_ + +// +// End of "$Id: Fl_File_Browser.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_File_Chooser.H b/third_party/windows/fltk-1.1.10/FL/Fl_File_Chooser.H new file mode 100644 index 0000000..62841d3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_File_Chooser.H @@ -0,0 +1,187 @@ +// +// "$Id: Fl_File_Chooser.H 5644 2007-01-28 19:41:56Z mike $" +// +// Fl_File_Chooser dialog for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0108 + +#ifndef Fl_File_Chooser_H +#define Fl_File_Chooser_H +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class FL_EXPORT Fl_File_Chooser { +public: + enum { SINGLE = 0, MULTI = 1, CREATE = 2, DIRECTORY = 4 }; +private: + static Fl_Preferences prefs_; + void (*callback_)(Fl_File_Chooser*, void *); + void *data_; + char directory_[1024]; + char pattern_[1024]; + char preview_text_[2048]; + int type_; + void favoritesButtonCB(); + void favoritesCB(Fl_Widget *w); + void fileListCB(); + void fileNameCB(); + void newdir(); + static void previewCB(Fl_File_Chooser *fc); + void showChoiceCB(); + void update_favorites(); + void update_preview(); +public: + Fl_File_Chooser(const char *d, const char *p, int t, const char *title); +private: + Fl_Double_Window *window; + void cb_window_i(Fl_Double_Window*, void*); + static void cb_window(Fl_Double_Window*, void*); + Fl_Choice *showChoice; + void cb_showChoice_i(Fl_Choice*, void*); + static void cb_showChoice(Fl_Choice*, void*); + Fl_Menu_Button *favoritesButton; + void cb_favoritesButton_i(Fl_Menu_Button*, void*); + static void cb_favoritesButton(Fl_Menu_Button*, void*); +public: + Fl_Button *newButton; +private: + void cb_newButton_i(Fl_Button*, void*); + static void cb_newButton(Fl_Button*, void*); + void cb__i(Fl_Tile*, void*); + static void cb_(Fl_Tile*, void*); + Fl_File_Browser *fileList; + void cb_fileList_i(Fl_File_Browser*, void*); + static void cb_fileList(Fl_File_Browser*, void*); + Fl_Box *previewBox; +public: + Fl_Check_Button *previewButton; +private: + void cb_previewButton_i(Fl_Check_Button*, void*); + static void cb_previewButton(Fl_Check_Button*, void*); + Fl_File_Input *fileName; + void cb_fileName_i(Fl_File_Input*, void*); + static void cb_fileName(Fl_File_Input*, void*); + Fl_Return_Button *okButton; + void cb_okButton_i(Fl_Return_Button*, void*); + static void cb_okButton(Fl_Return_Button*, void*); + Fl_Button *cancelButton; + void cb_cancelButton_i(Fl_Button*, void*); + static void cb_cancelButton(Fl_Button*, void*); + Fl_Double_Window *favWindow; + Fl_File_Browser *favList; + void cb_favList_i(Fl_File_Browser*, void*); + static void cb_favList(Fl_File_Browser*, void*); + Fl_Button *favUpButton; + void cb_favUpButton_i(Fl_Button*, void*); + static void cb_favUpButton(Fl_Button*, void*); + Fl_Button *favDeleteButton; + void cb_favDeleteButton_i(Fl_Button*, void*); + static void cb_favDeleteButton(Fl_Button*, void*); + Fl_Button *favDownButton; + void cb_favDownButton_i(Fl_Button*, void*); + static void cb_favDownButton(Fl_Button*, void*); + Fl_Button *favCancelButton; + void cb_favCancelButton_i(Fl_Button*, void*); + static void cb_favCancelButton(Fl_Button*, void*); + Fl_Return_Button *favOkButton; + void cb_favOkButton_i(Fl_Return_Button*, void*); + static void cb_favOkButton(Fl_Return_Button*, void*); +public: + ~Fl_File_Chooser(); + void callback(void (*cb)(Fl_File_Chooser *, void *), void *d = 0); + void color(Fl_Color c); + Fl_Color color(); + int count(); + void directory(const char *d); + char * directory(); + void filter(const char *p); + const char * filter(); + int filter_value(); + void filter_value(int f); + void hide(); + void iconsize(uchar s); + uchar iconsize(); + void label(const char *l); + const char * label(); + void ok_label(const char *l); + const char * ok_label(); + void preview(int e); + int preview() const { return previewButton->value(); }; + void rescan(); + void rescan_keep_filename(); + void show(); + int shown(); + void textcolor(Fl_Color c); + Fl_Color textcolor(); + void textfont(uchar f); + uchar textfont(); + void textsize(uchar s); + uchar textsize(); + void type(int t); + int type(); + void * user_data() const; + void user_data(void *d); + const char *value(int f = 1); + void value(const char *filename); + int visible(); + static const char *add_favorites_label; + static const char *all_files_label; + static const char *custom_filter_label; + static const char *existing_file_label; + static const char *favorites_label; + static const char *filename_label; + static const char *filesystems_label; + static const char *manage_favorites_label; + static const char *new_directory_label; + static const char *new_directory_tooltip; + static const char *preview_label; + static const char *save_label; + static const char *show_label; + static Fl_File_Sort_F *sort; +}; +FL_EXPORT char *fl_dir_chooser(const char *message,const char *fname,int relative=0); +FL_EXPORT char *fl_file_chooser(const char *message,const char *pat,const char *fname,int relative=0); +FL_EXPORT void fl_file_chooser_callback(void (*cb)(const char*)); +FL_EXPORT void fl_file_chooser_ok_label(const char*l); +#endif + +// +// End of "$Id: Fl_File_Chooser.H 5644 2007-01-28 19:41:56Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_File_Icon.H b/third_party/windows/fltk-1.1.10/FL/Fl_File_Icon.H new file mode 100644 index 0000000..3f01fda --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_File_Icon.H @@ -0,0 +1,115 @@ +// +// "$Id: Fl_File_Icon.H 4288 2005-04-16 00:13:17Z mike $" +// +// Fl_File_Icon definitions. +// +// Copyright 1999-2005 by Michael Sweet. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// +// Include necessary header files... +// + +#ifndef _Fl_Fl_File_Icon_H_ +# define _Fl_Fl_File_Icon_H_ + +# include "Fl.H" + + +// +// Special color value for the icon color. +// + +# define FL_ICON_COLOR (Fl_Color)0xffffffff + + +// +// Fl_File_Icon class... +// + +class FL_EXPORT Fl_File_Icon //// Icon data +{ + static Fl_File_Icon *first_; // Pointer to first icon/filetype + Fl_File_Icon *next_; // Pointer to next icon/filetype + const char *pattern_; // Pattern string + int type_; // Match only if directory or file? + int num_data_; // Number of data elements + int alloc_data_; // Number of allocated elements + short *data_; // Icon data + + public: + + enum // File types + { + ANY, // Any kind of file + PLAIN, // Only plain files + FIFO, // Only named pipes + DEVICE, // Only character and block devices + LINK, // Only symbolic links + DIRECTORY // Only directories + }; + + enum // Data opcodes + { + END, // End of primitive/icon + COLOR, // Followed by color value (2 shorts) + LINE, // Start of line + CLOSEDLINE, // Start of closed line + POLYGON, // Start of polygon + OUTLINEPOLYGON, // Followed by outline color (2 shorts) + VERTEX // Followed by scaled X,Y + }; + + Fl_File_Icon(const char *p, int t, int nd = 0, short *d = 0); + ~Fl_File_Icon(); + + short *add(short d); + short *add_color(Fl_Color c) + { short *d = add((short)COLOR); add((short)(c >> 16)); add((short)c); return (d); } + short *add_vertex(int x, int y) + { short *d = add((short)VERTEX); add((short)x); add((short)y); return (d); } + short *add_vertex(float x, float y) + { short *d = add((short)VERTEX); add((short)(x * 10000.0)); + add((short)(y * 10000.0)); return (d); } + void clear() { num_data_ = 0; } + void draw(int x, int y, int w, int h, Fl_Color ic, int active = 1); + void label(Fl_Widget *w); + static void labeltype(const Fl_Label *o, int x, int y, int w, int h, Fl_Align a); + void load(const char *f); + int load_fti(const char *fti); + int load_image(const char *i); + Fl_File_Icon *next() { return (next_); } + const char *pattern() { return (pattern_); } + int size() { return (num_data_); } + int type() { return (type_); } + short *value() { return (data_); } + + static Fl_File_Icon *find(const char *filename, int filetype = ANY); + static Fl_File_Icon *first() { return (first_); } + static void load_system_icons(void); +}; + +#endif // !_Fl_Fl_File_Icon_H_ + +// +// End of "$Id: Fl_File_Icon.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_File_Input.H b/third_party/windows/fltk-1.1.10/FL/Fl_File_Input.H new file mode 100644 index 0000000..545eeeb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_File_Input.H @@ -0,0 +1,68 @@ +// +// "$Id: Fl_File_Input.H 4288 2005-04-16 00:13:17Z mike $" +// +// File_Input header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// Original version Copyright 1998 by Curtis Edwards. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_File_Input_H +# define Fl_File_Input_H + +# include + + +class FL_EXPORT Fl_File_Input : public Fl_Input +{ + Fl_Color errorcolor_; + char ok_entry_; + uchar down_box_; + short buttons_[200]; + short pressed_; + + void draw_buttons(); + int handle_button(int event); + void update_buttons(); + +public: + + Fl_File_Input(int,int,int,int,const char *t=0); + + virtual int handle(int); + virtual void draw(); + + Fl_Boxtype down_box() const { return (Fl_Boxtype)down_box_; } + void down_box(Fl_Boxtype b) { down_box_ = b; } + Fl_Color errorcolor() const { return errorcolor_; } + void errorcolor(Fl_Color c) { errorcolor_ = c; } + int value(const char*); + int value(const char*, int); + const char *value() { return Fl_Input_::value(); } +}; + +#endif // !Fl_File_Input_H + + +// +// End of "$Id: Fl_File_Input.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Fill_Dial.H b/third_party/windows/fltk-1.1.10/FL/Fl_Fill_Dial.H new file mode 100644 index 0000000..3e76b44 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Fill_Dial.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Fill_Dial.H 4288 2005-04-16 00:13:17Z mike $" +// +// Filled dial header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Fill_Dial_H +#define Fl_Fill_Dial_H + +#include "Fl_Dial.H" + +class Fl_Fill_Dial : public Fl_Dial { +public: + Fl_Fill_Dial(int x,int y,int w,int h, const char *l = 0) + : Fl_Dial(x,y,w,h,l) {type(FL_FILL_DIAL);} +}; + +#endif + +// +// End of "$Id: Fl_Fill_Dial.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Fill_Slider.H b/third_party/windows/fltk-1.1.10/FL/Fl_Fill_Slider.H new file mode 100644 index 0000000..a3b51d6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Fill_Slider.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Fill_Slider.H 4288 2005-04-16 00:13:17Z mike $" +// +// Filled slider header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Fill_Slider_H +#define Fl_Fill_Slider_H + +#include "Fl_Slider.H" + +class Fl_Fill_Slider : public Fl_Slider { +public: + Fl_Fill_Slider(int x,int y,int w,int h,const char *l=0) + : Fl_Slider(x,y,w,h,l) {type(FL_VERT_FILL_SLIDER);} +}; + +#endif + +// +// End of "$Id: Fl_Fill_Slider.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Float_Input.H b/third_party/windows/fltk-1.1.10/FL/Fl_Float_Input.H new file mode 100644 index 0000000..96ba14b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Float_Input.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Float_Input.H 4288 2005-04-16 00:13:17Z mike $" +// +// Floating point input header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Float_Input_H +#define Fl_Float_Input_H + +#include "Fl_Input.H" + +class Fl_Float_Input : public Fl_Input { +public: + Fl_Float_Input(int X,int Y,int W,int H,const char *l = 0) + : Fl_Input(X,Y,W,H,l) {type(FL_FLOAT_INPUT);} +}; + +#endif + +// +// End of "$Id: Fl_Float_Input.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_FormsBitmap.H b/third_party/windows/fltk-1.1.10/FL/Fl_FormsBitmap.H new file mode 100644 index 0000000..423ab62 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_FormsBitmap.H @@ -0,0 +1,48 @@ +// +// "$Id: Fl_FormsBitmap.H 4288 2005-04-16 00:13:17Z mike $" +// +// Forms bitmap header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_FormsBitmap_H +#define Fl_FormsBitmap_H + +#include "Fl_Bitmap.H" + +class FL_EXPORT Fl_FormsBitmap : public Fl_Widget { + Fl_Bitmap *b; +protected: + void draw(); +public: + Fl_FormsBitmap(Fl_Boxtype, int, int, int, int, const char * = 0); + void set(int W, int H, const uchar *bits); + void bitmap(Fl_Bitmap *B) {b = B;} + Fl_Bitmap *bitmap() const {return b;} +}; + +#endif + +// +// End of "$Id: Fl_FormsBitmap.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_FormsPixmap.H b/third_party/windows/fltk-1.1.10/FL/Fl_FormsPixmap.H new file mode 100644 index 0000000..c34af69 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_FormsPixmap.H @@ -0,0 +1,48 @@ +// +// "$Id: Fl_FormsPixmap.H 4288 2005-04-16 00:13:17Z mike $" +// +// Forms pixmap header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_FormsPixmap_H +#define Fl_FormsPixmap_H + +#include "Fl_Pixmap.H" + +class FL_EXPORT Fl_FormsPixmap : public Fl_Widget { + Fl_Pixmap *b; +protected: + void draw(); +public: + Fl_FormsPixmap(Fl_Boxtype, int, int, int, int, const char * = 0); + void set(/*const*/char * const * bits); + void Pixmap(Fl_Pixmap *B) {b = B;} + Fl_Pixmap *Pixmap() const {return b;} +}; + +#endif + +// +// End of "$Id: Fl_FormsPixmap.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Free.H b/third_party/windows/fltk-1.1.10/FL/Fl_Free.H new file mode 100644 index 0000000..a279b6c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Free.H @@ -0,0 +1,66 @@ +// +// "$Id: Fl_Free.H 4288 2005-04-16 00:13:17Z mike $" +// +// Forms free header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Free_H +#define Fl_Free_H + +#ifndef Fl_Widget_H +#include "Fl_Widget.H" +#endif + +#define FL_NORMAL_FREE 1 +#define FL_SLEEPING_FREE 2 +#define FL_INPUT_FREE 3 +#define FL_CONTINUOUS_FREE 4 +#define FL_ALL_FREE 5 + +typedef int (*FL_HANDLEPTR)(Fl_Widget *, int , float, float, char); + +class FL_EXPORT Fl_Free : public Fl_Widget { + FL_HANDLEPTR hfunc; + static void step(void *); +protected: + void draw(); +public: + int handle(int); + Fl_Free(uchar t,int x,int y,int w,int h,const char *l,FL_HANDLEPTR hdl); + ~Fl_Free(); +}; + +// old event names for compatability: +#define FL_MOUSE FL_DRAG +#define FL_DRAW 100 // NOT USED +#define FL_STEP 101 +#define FL_FREEMEM 102 // NOT USED +#define FL_FREEZE 103 // NOT USED +#define FL_THAW 104 // NOT USED + +#endif + +// +// End of "$Id: Fl_Free.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_GIF_Image.H b/third_party/windows/fltk-1.1.10/FL/Fl_GIF_Image.H new file mode 100644 index 0000000..54fdeee --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_GIF_Image.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_GIF_Image.H 4288 2005-04-16 00:13:17Z mike $" +// +// GIF image header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_GIF_Image_H +#define Fl_GIF_Image_H +# include "Fl_Pixmap.H" + +class FL_EXPORT Fl_GIF_Image : public Fl_Pixmap { + + public: + + Fl_GIF_Image(const char* filename); +}; + +#endif + +// +// End of "$Id: Fl_GIF_Image.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Gl_Window.H b/third_party/windows/fltk-1.1.10/FL/Fl_Gl_Window.H new file mode 100644 index 0000000..7a6dec8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Gl_Window.H @@ -0,0 +1,99 @@ +// +// "$Id: Fl_Gl_Window.H 5322 2006-08-17 09:49:43Z matt $" +// +// OpenGL header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +#ifndef Fl_Gl_Window_H +#define Fl_Gl_Window_H + +#include "Fl_Window.H" + +#ifndef GLContext +typedef void* GLContext; // actually a GLXContext or HGLDC +#endif + +class Fl_Gl_Choice; // structure to hold result of glXChooseVisual + +class FL_EXPORT Fl_Gl_Window : public Fl_Window { + + int mode_; + const int *alist; + Fl_Gl_Choice *g; + GLContext context_; + char valid_f_; + char damage1_; // damage() of back buffer + virtual void draw_overlay(); + void init(); + + void *overlay; + void make_overlay(); + friend class _Fl_Gl_Overlay; + + static int can_do(int, const int *); + int mode(int, const int *); + +public: + + void show(); + void show(int a, char **b) {Fl_Window::show(a,b);} + void flush(); + void hide(); + void resize(int,int,int,int); + + char valid() const {return valid_f_ & 1;} + void valid(char v) {if (v) valid_f_ |= 1; else valid_f_ &= 0xfe;} + void invalidate(); + + char context_valid() const {return valid_f_ & 2;} + void context_valid(char v) {if (v) valid_f_ |= 2; else valid_f_ &= 0xfd;} + + static int can_do(int m) {return can_do(m,0);} + static int can_do(const int *m) {return can_do(0, m);} + int can_do() {return can_do(mode_,alist);} + Fl_Mode mode() const {return (Fl_Mode)mode_;} + int mode(int a) {return mode(a,0);} + int mode(const int *a) {return mode(0, a);} + + void* context() const {return context_;} + void context(void*, int destroy_flag = 0); + void make_current(); + void swap_buffers(); + void ortho(); + + int can_do_overlay(); + void redraw_overlay(); + void hide_overlay(); + void make_overlay_current(); + + ~Fl_Gl_Window(); + Fl_Gl_Window(int W, int H, const char *l=0) : Fl_Window(W,H,l) {init();} + Fl_Gl_Window(int X, int Y, int W, int H, const char *l=0) + : Fl_Window(X,Y,W,H,l) {init();} +}; + +#endif + +// +// End of "$Id: Fl_Gl_Window.H 5322 2006-08-17 09:49:43Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Group.H b/third_party/windows/fltk-1.1.10/FL/Fl_Group.H new file mode 100644 index 0000000..ebf5dc7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Group.H @@ -0,0 +1,111 @@ +// +// "$Id: Fl_Group.H 6468 2008-10-19 10:35:06Z AlbrechtS $" +// +// Group header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Group_H +#define Fl_Group_H + +#ifndef Fl_Widget_H +#include "Fl_Widget.H" +#endif + +class FL_EXPORT Fl_Group : public Fl_Widget { + + Fl_Widget** array_; + Fl_Widget* savedfocus_; + Fl_Widget* resizable_; + int children_; + short *sizes_; // remembered initial sizes of children + + int navigation(int); + static Fl_Group *current_; + + // unimplemented copy ctor and assignment operator + Fl_Group(const Fl_Group&); + Fl_Group& operator=(const Fl_Group&); + +protected: + enum { CLIP_CHILDREN = 2048 }; + + void draw(); + void draw_child(Fl_Widget&) const; + void draw_children(); + void draw_outside_label(const Fl_Widget&) const ; + void update_child(Fl_Widget&) const; + short* sizes(); + +public: + + int handle(int); + void begin(); + void end(); + static Fl_Group *current(); + static void current(Fl_Group *g); + + int children() const {return children_;} + Fl_Widget* child(int n) const {return array()[n];} + int find(const Fl_Widget*) const; + int find(const Fl_Widget& o) const {return find(&o);} + Fl_Widget* const* array() const; + + void resize(int,int,int,int); + Fl_Group(int,int,int,int, const char * = 0); + virtual ~Fl_Group(); + void add(Fl_Widget&); + void add(Fl_Widget* o) {add(*o);} + void insert(Fl_Widget&, int i); + void insert(Fl_Widget& o, Fl_Widget* before) {insert(o,find(before));} + void remove(Fl_Widget&); + void remove(Fl_Widget* o) {remove(*o);} + void clear(); + + void resizable(Fl_Widget& o) {resizable_ = &o;} + void resizable(Fl_Widget* o) {resizable_ = o;} + Fl_Widget* resizable() const {return resizable_;} + void add_resizable(Fl_Widget& o) {resizable_ = &o; add(o);} + void init_sizes(); + + void clip_children(int c) { if (c) set_flag(CLIP_CHILDREN); else clear_flag(CLIP_CHILDREN); } + int clip_children() { return (flags() & CLIP_CHILDREN) != 0; } + + // back compatibility functions: + void focus(Fl_Widget* o) {o->take_focus();} + Fl_Widget* & _ddfdesign_kludge() {return resizable_;} + void forms_end(); +}; + +// dummy class used to end child groups in constructors for complex +// subclasses of Fl_Group: +class FL_EXPORT Fl_End { +public: + Fl_End() {Fl_Group::current()->end();} +}; + +#endif + +// +// End of "$Id: Fl_Group.H 6468 2008-10-19 10:35:06Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Help_Dialog.H b/third_party/windows/fltk-1.1.10/FL/Fl_Help_Dialog.H new file mode 100644 index 0000000..5a93aa8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Help_Dialog.H @@ -0,0 +1,92 @@ +// +// "$Id: Fl_Help_Dialog.H 5643 2007-01-28 19:36:51Z mike $" +// +// Fl_Help_Dialog dialog for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0108 + +#ifndef Fl_Help_Dialog_H +#define Fl_Help_Dialog_H +#include +#include +#include +#include +#include +#include +#include + +class FL_EXPORT Fl_Help_Dialog { + int index_; + int max_; + int line_[100]; + char file_[100][256]; + int find_pos_; +public: + Fl_Help_Dialog(); +private: + Fl_Double_Window *window_; + Fl_Button *back_; + void cb_back__i(Fl_Button*, void*); + static void cb_back_(Fl_Button*, void*); + Fl_Button *forward_; + void cb_forward__i(Fl_Button*, void*); + static void cb_forward_(Fl_Button*, void*); + Fl_Button *smaller_; + void cb_smaller__i(Fl_Button*, void*); + static void cb_smaller_(Fl_Button*, void*); + Fl_Button *larger_; + void cb_larger__i(Fl_Button*, void*); + static void cb_larger_(Fl_Button*, void*); + Fl_Input *find_; + void cb_find__i(Fl_Input*, void*); + static void cb_find_(Fl_Input*, void*); + Fl_Help_View *view_; + void cb_view__i(Fl_Help_View*, void*); + static void cb_view_(Fl_Help_View*, void*); +public: + ~Fl_Help_Dialog(); + int h(); + void hide(); + void load(const char *f); + void position(int xx, int yy); + void resize(int xx, int yy, int ww, int hh); + void show(); + void show(int argc, char **argv); + void textsize(uchar s); + uchar textsize(); + void topline(const char *n); + void topline(int n); + void value(const char *f); + const char * value() const; + int visible(); + int w(); + int x(); + int y(); +}; +#endif + +// +// End of "$Id: Fl_Help_Dialog.H 5643 2007-01-28 19:36:51Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Help_View.H b/third_party/windows/fltk-1.1.10/FL/Fl_Help_View.H new file mode 100644 index 0000000..d834d82 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Help_View.H @@ -0,0 +1,221 @@ +// +// "$Id: Fl_Help_View.H 5991 2007-12-15 16:08:23Z mike $" +// +// Help Viewer widget definitions. +// +// Copyright 1997-2005 by Easy Software Products. +// Image support donated by Matthias Melcher, Copyright 2000. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Help_View_H +# define Fl_Help_View_H + +// +// Include necessary header files... +// + +# include +# include "Fl.H" +# include "Fl_Group.H" +# include "Fl_Scrollbar.H" +# include "fl_draw.H" +# include "Fl_Shared_Image.H" + + +// +// Fl_Help_Func type - link callback function for files... +// + + +typedef const char *(Fl_Help_Func)(Fl_Widget *, const char *); + + +// +// Fl_Help_Block structure... +// + +struct Fl_Help_Block +{ + const char *start, // Start of text + *end; // End of text + uchar border; // Draw border? + Fl_Color bgcolor; // Background color + int x, // Indentation/starting X coordinate + y, // Starting Y coordinate + w, // Width + h; // Height + int line[32]; // Left starting position for each line +}; + +// +// Fl_Help_Link structure... +// + +struct Fl_Help_Link +{ + char filename[192], // Reference filename + name[32]; // Link target (blank if none) + int x, // X offset of link text + y, // Y offset of link text + w, // Width of link text + h; // Height of link text +}; + +// +// Fl_Help_Target structure... +// + +struct Fl_Help_Target +{ + char name[32]; // Target name + int y; // Y offset of target +}; + +// +// Fl_Help_View class... +// + +class FL_EXPORT Fl_Help_View : public Fl_Group //// Help viewer widget +{ + enum { RIGHT = -1, CENTER, LEFT }; // Alignments + + char title_[1024]; // Title string + Fl_Color defcolor_, // Default text color + bgcolor_, // Background color + textcolor_, // Text color + linkcolor_; // Link color + uchar textfont_, // Default font for text + textsize_; // Default font size + const char *value_; // HTML text value + + int nblocks_, // Number of blocks/paragraphs + ablocks_; // Allocated blocks + Fl_Help_Block *blocks_; // Blocks + + int nfonts_; // Number of fonts in stack + uchar fonts_[100][2]; // Font stack + + Fl_Help_Func *link_; // Link transform function + + int nlinks_, // Number of links + alinks_; // Allocated links + Fl_Help_Link *links_; // Links + + int ntargets_, // Number of targets + atargets_; // Allocated targets + Fl_Help_Target *targets_; // Targets + + char directory_[1024]; // Directory for current file + char filename_[1024]; // Current filename + int topline_, // Top line in document + leftline_, // Lefthand position + size_, // Total document length + hsize_; // Maximum document width + Fl_Scrollbar scrollbar_, // Vertical scrollbar for document + hscrollbar_; // Horizontal scrollbar + + static int selection_first; + static int selection_last; + static int selection_push_first; + static int selection_push_last; + static int selection_drag_first; + static int selection_drag_last; + static int selected; + static int draw_mode; + static int mouse_x; + static int mouse_y; + static int current_pos; + static Fl_Help_View *current_view; + static Fl_Color hv_selection_color; + static Fl_Color hv_selection_text_color; + + Fl_Help_Block *add_block(const char *s, int xx, int yy, int ww, int hh, uchar border = 0); + void add_link(const char *n, int xx, int yy, int ww, int hh); + void add_target(const char *n, int yy); + static int compare_targets(const Fl_Help_Target *t0, const Fl_Help_Target *t1); + int do_align(Fl_Help_Block *block, int line, int xx, int a, int &l); + void draw(); + void format(); + void format_table(int *table_width, int *columns, const char *table); + void free_data(); + int get_align(const char *p, int a); + const char *get_attr(const char *p, const char *n, char *buf, int bufsize); + Fl_Color get_color(const char *n, Fl_Color c); + Fl_Shared_Image *get_image(const char *name, int W, int H); + int get_length(const char *l); + int handle(int); + + void initfont(uchar &f, uchar &s) { nfonts_ = 0; + fl_font(f = fonts_[0][0] = textfont_, + s = fonts_[0][1] = textsize_); } + void pushfont(uchar f, uchar s) { if (nfonts_ < 99) nfonts_ ++; + fl_font(fonts_[nfonts_][0] = f, + fonts_[nfonts_][1] = s); } + void popfont(uchar &f, uchar &s) { if (nfonts_ > 0) nfonts_ --; + fl_font(f = fonts_[nfonts_][0], + s = fonts_[nfonts_][1]); } + + void hv_draw(const char *t, int x, int y); + char begin_selection(); + char extend_selection(); + void end_selection(int c=0); + void clear_global_selection(); + Fl_Help_Link *find_link(int, int); + void follow_link(Fl_Help_Link*); + +public: + + Fl_Help_View(int xx, int yy, int ww, int hh, const char *l = 0); + ~Fl_Help_View(); + const char *directory() const { if (directory_[0]) return (directory_); + else return ((const char *)0); } + const char *filename() const { if (filename_[0]) return (filename_); + else return ((const char *)0); } + int find(const char *s, int p = 0); + void link(Fl_Help_Func *fn) { link_ = fn; } + int load(const char *f); + void resize(int,int,int,int); + int size() const { return (size_); } + void size(int W, int H) { Fl_Widget::size(W, H); } + void textcolor(Fl_Color c) { if (textcolor_ == defcolor_) textcolor_ = c; defcolor_ = c; } + Fl_Color textcolor() const { return (defcolor_); } + void textfont(uchar f) { textfont_ = f; format(); } + uchar textfont() const { return (textfont_); } + void textsize(uchar s) { textsize_ = s; format(); } + uchar textsize() const { return (textsize_); } + const char *title() { return (title_); } + void topline(const char *n); + void topline(int); + int topline() const { return (topline_); } + void leftline(int); + int leftline() const { return (leftline_); } + void value(const char *v); + const char *value() const { return (value_); } + void clear_selection(); + void select_all(); +}; + +#endif // !Fl_Help_View_H + +// +// End of "$Id: Fl_Help_View.H 5991 2007-12-15 16:08:23Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Hold_Browser.H b/third_party/windows/fltk-1.1.10/FL/Fl_Hold_Browser.H new file mode 100644 index 0000000..c9290db --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Hold_Browser.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Hold_Browser.H 4288 2005-04-16 00:13:17Z mike $" +// +// Hold browser header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Hold_Browser_H +#define Fl_Hold_Browser_H + +#include "Fl_Browser.H" + +class Fl_Hold_Browser : public Fl_Browser { +public: + Fl_Hold_Browser(int X,int Y,int W,int H,const char *l=0) + : Fl_Browser(X,Y,W,H,l) {type(FL_HOLD_BROWSER);} +}; + +#endif + +// +// End of "$Id: Fl_Hold_Browser.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Hor_Fill_Slider.H b/third_party/windows/fltk-1.1.10/FL/Fl_Hor_Fill_Slider.H new file mode 100644 index 0000000..1bcbc9a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Hor_Fill_Slider.H @@ -0,0 +1,42 @@ +// +// "$Id: Fl_Hor_Fill_Slider.H 4288 2005-04-16 00:13:17Z mike $" +// +// Horizontal fill slider header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +#ifndef Fl_Hor_Fill_Slider_H +#define Fl_Hor_Fill_Slider_H + +#include "Fl_Slider.H" + +class Fl_Hor_Fill_Slider : public Fl_Slider { +public: + Fl_Hor_Fill_Slider(int x,int y,int w,int h,const char *l=0) + : Fl_Slider(x,y,w,h,l) {type(FL_HOR_FILL_SLIDER);} +}; + +#endif + +// +// End of "$Id: Fl_Hor_Fill_Slider.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Hor_Nice_Slider.H b/third_party/windows/fltk-1.1.10/FL/Fl_Hor_Nice_Slider.H new file mode 100644 index 0000000..06e3c60 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Hor_Nice_Slider.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Hor_Nice_Slider.H 4288 2005-04-16 00:13:17Z mike $" +// +// Horizontal "nice" slider header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Hor_Nice_Slider_H +#define Fl_Hor_Nice_Slider_H + +#include "Fl_Slider.H" + +class Fl_Hor_Nice_Slider : public Fl_Slider { +public: + Fl_Hor_Nice_Slider(int x,int y,int w,int h,const char *l=0) + : Fl_Slider(x,y,w,h,l) {type(FL_HOR_NICE_SLIDER); box(FL_FLAT_BOX);} +}; + +#endif + +// +// End of "$Id: Fl_Hor_Nice_Slider.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Hor_Slider.H b/third_party/windows/fltk-1.1.10/FL/Fl_Hor_Slider.H new file mode 100644 index 0000000..76d9c66 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Hor_Slider.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Hor_Slider.H 4288 2005-04-16 00:13:17Z mike $" +// +// Horizontal slider header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Hor_Slider_H +#define Fl_Hor_Slider_H + +#include "Fl_Slider.H" + +class Fl_Hor_Slider : public Fl_Slider { +public: + Fl_Hor_Slider(int X,int Y,int W,int H,const char *l=0) + : Fl_Slider(X,Y,W,H,l) {type(FL_HOR_SLIDER);} +}; + +#endif + +// +// End of "$Id: Fl_Hor_Slider.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Hor_Value_Slider.H b/third_party/windows/fltk-1.1.10/FL/Fl_Hor_Value_Slider.H new file mode 100644 index 0000000..990f6da --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Hor_Value_Slider.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Hor_Value_Slider.H 4288 2005-04-16 00:13:17Z mike $" +// +// Horizontal value slider header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Hor_Value_Slider_H +#define Fl_Hor_Value_Slider_H + +#include "Fl_Value_Slider.H" + +class Fl_Hor_Value_Slider : public Fl_Value_Slider { +public: + Fl_Hor_Value_Slider(int X,int Y,int W,int H,const char *l=0) + : Fl_Value_Slider(X,Y,W,H,l) {type(FL_HOR_SLIDER);} +}; + +#endif + +// +// End of "$Id: Fl_Hor_Value_Slider.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Image.H b/third_party/windows/fltk-1.1.10/FL/Fl_Image.H new file mode 100644 index 0000000..769aaa9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Image.H @@ -0,0 +1,112 @@ +// +// "$Id: Fl_Image.H 4288 2005-04-16 00:13:17Z mike $" +// +// Image header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Image_H +# define Fl_Image_H + +# include "Enumerations.H" + +class Fl_Widget; +struct Fl_Menu_Item; +struct Fl_Label; + +class FL_EXPORT Fl_Image { + int w_, h_, d_, ld_, count_; + const char * const *data_; + + // Forbid use of copy contructor and assign operator + Fl_Image & operator=(const Fl_Image &); + Fl_Image(const Fl_Image &); + + protected: + + void w(int W) {w_ = W;} + void h(int H) {h_ = H;} + void d(int D) {d_ = D;} + void ld(int LD) {ld_ = LD;} + void data(const char * const *p, int c) {data_ = p; count_ = c;} + void draw_empty(int X, int Y); + + static void labeltype(const Fl_Label *lo, int lx, int ly, int lw, int lh, Fl_Align la); + static void measure(const Fl_Label *lo, int &lw, int &lh); + + public: + + int w() const {return w_;} + int h() const {return h_;} + int d() const {return d_;} + int ld() const {return ld_;} + int count() const {return count_;} + const char * const *data() const {return data_;} + + Fl_Image(int W, int H, int D) {w_ = W; h_ = H; d_ = D; ld_ = 0; count_ = 0; data_ = 0;} + virtual ~Fl_Image(); + virtual Fl_Image *copy(int W, int H); + Fl_Image *copy() { return copy(w(), h()); } + virtual void color_average(Fl_Color c, float i); + void inactive() { color_average(FL_GRAY, .33f); } + virtual void desaturate(); + virtual void label(Fl_Widget*w); + virtual void label(Fl_Menu_Item*m); + virtual void draw(int X, int Y, int W, int H, int cx=0, int cy=0); + void draw(int X, int Y) {draw(X, Y, w(), h(), 0, 0);} + virtual void uncache(); +}; + +class FL_EXPORT Fl_RGB_Image : public Fl_Image { + public: + + const uchar *array; + int alloc_array; // Non-zero if array was allocated + +#if defined(__APPLE__) || defined(WIN32) + void *id; // for internal use + void *mask; // for internal use (mask bitmap) +#else + unsigned id; // for internal use + unsigned mask; // for internal use (mask bitmap) +#endif // __APPLE__ || WIN32 + + Fl_RGB_Image(const uchar *bits, int W, int H, int D=3, int LD=0) : + Fl_Image(W,H,D), array(bits), alloc_array(0), id(0), mask(0) {data((const char **)&array, 1); ld(LD);} + virtual ~Fl_RGB_Image(); + virtual Fl_Image *copy(int W, int H); + Fl_Image *copy() { return copy(w(), h()); } + virtual void color_average(Fl_Color c, float i); + virtual void desaturate(); + virtual void draw(int X, int Y, int W, int H, int cx=0, int cy=0); + void draw(int X, int Y) {draw(X, Y, w(), h(), 0, 0);} + virtual void label(Fl_Widget*w); + virtual void label(Fl_Menu_Item*m); + virtual void uncache(); +}; + +#endif // !Fl_Image_H + +// +// End of "$Id: Fl_Image.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Input.H b/third_party/windows/fltk-1.1.10/FL/Fl_Input.H new file mode 100644 index 0000000..4ae0dc8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Input.H @@ -0,0 +1,47 @@ +// +// "$Id: Fl_Input.H 5300 2006-08-14 07:06:45Z matt $" +// +// Input header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Input_H +#define Fl_Input_H + +#include "Fl_Input_.H" + +class FL_EXPORT Fl_Input : public Fl_Input_ { + int handle_key(); + int shift_position(int p); + int shift_up_down_position(int p); +public: + void draw(); + int handle(int); + Fl_Input(int,int,int,int,const char * = 0); +}; + +#endif + +// +// End of "$Id: Fl_Input.H 5300 2006-08-14 07:06:45Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Input_.H b/third_party/windows/fltk-1.1.10/FL/Fl_Input_.H new file mode 100644 index 0000000..efc7b53 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Input_.H @@ -0,0 +1,145 @@ +// +// "$Id: Fl_Input_.H 4288 2005-04-16 00:13:17Z mike $" +// +// Input base class header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Input__H +#define Fl_Input__H + +#ifndef Fl_Widget_H +#include "Fl_Widget.H" +#endif + +#define FL_NORMAL_INPUT 0 +#define FL_FLOAT_INPUT 1 +#define FL_INT_INPUT 2 +#define FL_HIDDEN_INPUT 3 +#define FL_MULTILINE_INPUT 4 +#define FL_SECRET_INPUT 5 +#define FL_INPUT_TYPE 7 +#define FL_INPUT_READONLY 8 +#define FL_NORMAL_OUTPUT (FL_NORMAL_INPUT | FL_INPUT_READONLY) +#define FL_MULTILINE_OUTPUT (FL_MULTILINE_INPUT | FL_INPUT_READONLY) +#define FL_INPUT_WRAP 16 +#define FL_MULTILINE_INPUT_WRAP (FL_MULTILINE_INPUT | FL_INPUT_WRAP) +#define FL_MULTILINE_OUTPUT_WRAP (FL_MULTILINE_INPUT | FL_INPUT_READONLY | FL_INPUT_WRAP) + +class FL_EXPORT Fl_Input_ : public Fl_Widget { + + const char* value_; + char* buffer; + + int size_; + int bufsize; + int position_; + int mark_; + int xscroll_, yscroll_; + int mu_p; + int maximum_size_; + + uchar erase_cursor_only; + uchar textfont_; + uchar textsize_; + unsigned textcolor_; + unsigned cursor_color_; + + const char* expand(const char*, char*) const; + double expandpos(const char*, const char*, const char*, int*) const; + void minimal_update(int, int); + void minimal_update(int p); + void put_in_buffer(int newsize); + + void setfont() const; + +protected: + + int word_start(int i) const; + int word_end(int i) const; + int line_start(int i) const; + int line_end(int i) const; + void drawtext(int, int, int, int); + int up_down_position(int, int keepmark=0); + void handle_mouse(int, int, int, int, int keepmark=0); + int handletext(int e, int, int, int, int); + void maybe_do_callback(); + int xscroll() const {return xscroll_;} + int yscroll() const {return yscroll_;} + +public: + + void resize(int, int, int, int); + + Fl_Input_(int, int, int, int, const char* = 0); + ~Fl_Input_(); + + int value(const char*); + int value(const char*, int); + int static_value(const char*); + int static_value(const char*, int); + const char* value() const {return value_;} + char index(int i) const {return value_[i];} + int size() const {return size_;} + void size(int W, int H) { Fl_Widget::size(W, H); } + int maximum_size() const {return maximum_size_;} + void maximum_size(int m) {maximum_size_ = m;} + + int position() const {return position_;} + int mark() const {return mark_;} + int position(int p, int m); + int position(int p) {return position(p, p);} + int mark(int m) {return position(position(), m);} + int replace(int, int, const char*, int=0); + int cut() {return replace(position(), mark(), 0);} + int cut(int n) {return replace(position(), position()+n, 0);} + int cut(int a, int b) {return replace(a, b, 0);} + int insert(const char* t, int l=0){return replace(position_, mark_, t, l);} + int copy(int clipboard); + int undo(); + int copy_cuts(); + + Fl_Font textfont() const {return (Fl_Font)textfont_;} + void textfont(uchar s) {textfont_ = s;} + uchar textsize() const {return textsize_;} + void textsize(uchar s) {textsize_ = s;} + Fl_Color textcolor() const {return (Fl_Color)textcolor_;} + void textcolor(unsigned n) {textcolor_ = n;} + Fl_Color cursor_color() const {return (Fl_Color)cursor_color_;} + void cursor_color(unsigned n) {cursor_color_ = n;} + + int input_type() const {return type() & FL_INPUT_TYPE; } + void input_type(int t) { type((uchar)(t | readonly())); } + int readonly() const { return type() & FL_INPUT_READONLY; } + void readonly(int b) { if (b) type((uchar)(type() | FL_INPUT_READONLY)); + else type((uchar)(type() & ~FL_INPUT_READONLY)); } + int wrap() const { return type() & FL_INPUT_WRAP; } + void wrap(int b) { if (b) type((uchar)(type() | FL_INPUT_WRAP)); + else type((uchar)(type() & ~FL_INPUT_WRAP)); } +}; + +#endif + +// +// End of "$Id: Fl_Input_.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Input_Choice.H b/third_party/windows/fltk-1.1.10/FL/Fl_Input_Choice.H new file mode 100644 index 0000000..391a815 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Input_Choice.H @@ -0,0 +1,199 @@ +// +// "$Id$" +// +// An input/chooser widget. +// ______________ ____ +// | || __ | +// | input area || \/ | +// |______________||____| +// +// Copyright 1998-2005 by Bill Spitzak and others. +// Copyright 2004 by Greg Ercolano. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Input_Choice_H +#define Fl_Input_Choice_H + +#include +#include +#include +#include +#include +#include + +class Fl_Input_Choice : public Fl_Group { + // Private class to handle slightly 'special' behavior of menu button + class InputMenuButton : public Fl_Menu_Button { + void draw() { + draw_box(FL_UP_BOX, color()); + fl_color(active_r() ? labelcolor() : fl_inactive(labelcolor())); + int xc = x()+w()/2, yc=y()+h()/2; + fl_polygon(xc-5,yc-3,xc+5,yc-3,xc,yc+3); + if (Fl::focus() == this) draw_focus(); + } + public: + InputMenuButton(int x,int y,int w,int h,const char*l=0) : + Fl_Menu_Button(x,y,w,h,l) { box(FL_UP_BOX); } + }; + + Fl_Input *inp_; + InputMenuButton *menu_; + + static void menu_cb(Fl_Widget*, void *data) { + Fl_Input_Choice *o=(Fl_Input_Choice *)data; + const Fl_Menu_Item *item = o->menubutton()->mvalue(); + if (item && item->flags & (FL_SUBMENU|FL_SUBMENU_POINTER)) return; // ignore submenus + if (!strcmp(o->inp_->value(), o->menu_->text())) + { + o->Fl_Widget::clear_changed(); + if (o->when() & FL_WHEN_NOT_CHANGED) + o->do_callback(); + } + else + { + o->inp_->value(o->menu_->text()); + o->inp_->set_changed(); + o->Fl_Widget::set_changed(); + if (o->when() & (FL_WHEN_CHANGED|FL_WHEN_RELEASE)) + o->do_callback(); + } + + if (o->callback() != default_callback) + { + o->Fl_Widget::clear_changed(); + o->inp_->clear_changed(); + } + } + + static void inp_cb(Fl_Widget*, void *data) { + Fl_Input_Choice *o=(Fl_Input_Choice *)data; + if (o->inp_->changed()) { + o->Fl_Widget::set_changed(); + if (o->when() & (FL_WHEN_CHANGED|FL_WHEN_RELEASE)) + o->do_callback(); + } else { + o->Fl_Widget::clear_changed(); + if (o->when() & FL_WHEN_NOT_CHANGED) + o->do_callback(); + } + + if (o->callback() != default_callback) + o->Fl_Widget::clear_changed(); + } + + // Custom resize behavior -- input stretches, menu button doesn't + inline int inp_x() { return(x() + Fl::box_dx(box())); } + inline int inp_y() { return(y() + Fl::box_dy(box())); } + inline int inp_w() { return(w() - Fl::box_dw(box()) - 20); } + inline int inp_h() { return(h() - Fl::box_dh(box())); } + + inline int menu_x() { return(x() + w() - 20 - Fl::box_dx(box())); } + inline int menu_y() { return(y() + Fl::box_dy(box())); } + inline int menu_w() { return(20); } + inline int menu_h() { return(h() - Fl::box_dh(box())); } + +public: + Fl_Input_Choice (int x,int y,int w,int h,const char*l=0) : Fl_Group(x,y,w,h,l) { + Fl_Group::box(FL_DOWN_BOX); + align(FL_ALIGN_LEFT); // default like Fl_Input + inp_ = new Fl_Input(inp_x(), inp_y(), + inp_w(), inp_h()); + inp_->callback(inp_cb, (void*)this); + inp_->box(FL_FLAT_BOX); // cosmetic + inp_->when(FL_WHEN_CHANGED|FL_WHEN_NOT_CHANGED); + menu_ = new InputMenuButton(menu_x(), menu_y(), + menu_w(), menu_h()); + menu_->callback(menu_cb, (void*)this); + menu_->box(FL_FLAT_BOX); // cosmetic + end(); + } + void add(const char *s) { + menu_->add(s); + } + int changed() const { + return inp_->changed() | Fl_Widget::changed(); + } + void clear_changed() { + inp_->clear_changed(); + Fl_Widget::clear_changed(); + } + void set_changed() { + inp_->set_changed(); + // no need to call Fl_Widget::set_changed() + } + void clear() { + menu_->clear(); + } + Fl_Boxtype down_box() const { + return (menu_->down_box()); + } + void down_box(Fl_Boxtype b) { + menu_->down_box(b); + } + const Fl_Menu_Item *menu() { + return (menu_->menu()); + } + void menu(const Fl_Menu_Item *m) { + menu_->menu(m); + } + void resize(int X, int Y, int W, int H) { + Fl_Group::resize(X,Y,W,H); + inp_->resize(inp_x(), inp_y(), inp_w(), inp_h()); + menu_->resize(menu_x(), menu_y(), menu_w(), menu_h()); + } + Fl_Color textcolor() const { + return (inp_->textcolor()); + } + void textcolor(Fl_Color c) { + inp_->textcolor(c); + } + uchar textfont() const { + return (inp_->textfont()); + } + void textfont(uchar f) { + inp_->textfont(f); + } + uchar textsize() const { + return (inp_->textsize()); + } + void textsize(uchar s) { + inp_->textsize(s); + } + const char* value() const { + return (inp_->value()); + } + void value(const char *val) { + inp_->value(val); + } + void value(int val) { + menu_->value(val); + inp_->value(menu_->text(val)); + } + Fl_Menu_Button *menubutton() { return menu_; } + Fl_Input *input() { return inp_; } +}; + +#endif // !Fl_Input_Choice_H + +// +// End of "$Id$". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Int_Input.H b/third_party/windows/fltk-1.1.10/FL/Fl_Int_Input.H new file mode 100644 index 0000000..abe012f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Int_Input.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Int_Input.H 4288 2005-04-16 00:13:17Z mike $" +// +// Integer input header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Int_Input_H +#define Fl_Int_Input_H + +#include "Fl_Input.H" + +class Fl_Int_Input : public Fl_Input { +public: + Fl_Int_Input(int X,int Y,int W,int H,const char *l = 0) + : Fl_Input(X,Y,W,H,l) {type(FL_INT_INPUT);} +}; + +#endif + +// +// End of "$Id: Fl_Int_Input.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_JPEG_Image.H b/third_party/windows/fltk-1.1.10/FL/Fl_JPEG_Image.H new file mode 100644 index 0000000..4d1d09d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_JPEG_Image.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_JPEG_Image.H 4288 2005-04-16 00:13:17Z mike $" +// +// JPEG image header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_JPEG_Image_H +#define Fl_JPEG_Image_H +# include "Fl_Image.H" + +class FL_EXPORT Fl_JPEG_Image : public Fl_RGB_Image { + + public: + + Fl_JPEG_Image(const char* filename); +}; + +#endif + +// +// End of "$Id: Fl_JPEG_Image.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Light_Button.H b/third_party/windows/fltk-1.1.10/FL/Fl_Light_Button.H new file mode 100644 index 0000000..80cd5bc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Light_Button.H @@ -0,0 +1,45 @@ +// +// "$Id: Fl_Light_Button.H 4288 2005-04-16 00:13:17Z mike $" +// +// Lighted button header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Light_Button_H +#define Fl_Light_Button_H + +#include "Fl_Button.H" + +class FL_EXPORT Fl_Light_Button : public Fl_Button { +protected: + virtual void draw(); +public: + virtual int handle(int); + Fl_Light_Button(int x,int y,int w,int h,const char *l = 0); +}; + +#endif + +// +// End of "$Id: Fl_Light_Button.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Line_Dial.H b/third_party/windows/fltk-1.1.10/FL/Fl_Line_Dial.H new file mode 100644 index 0000000..b08a82a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Line_Dial.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Line_Dial.H 4288 2005-04-16 00:13:17Z mike $" +// +// Line dial header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Line_Dial_H +#define Fl_Line_Dial_H + +#include "Fl_Dial.H" + +class Fl_Line_Dial : public Fl_Dial { +public: + Fl_Line_Dial(int x,int y,int w,int h, const char *l = 0) + : Fl_Dial(x,y,w,h,l) {type(FL_LINE_DIAL);} +}; + +#endif + +// +// End of "$Id: Fl_Line_Dial.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Menu.H b/third_party/windows/fltk-1.1.10/FL/Fl_Menu.H new file mode 100644 index 0000000..8b9e697 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Menu.H @@ -0,0 +1,33 @@ +// +// "$Id: Fl_Menu.H 4288 2005-04-16 00:13:17Z mike $" +// +// Old menu header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// this include file is for back compatability only +#include "Fl_Menu_Item.H" + +// +// End of "$Id: Fl_Menu.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Menu_.H b/third_party/windows/fltk-1.1.10/FL/Fl_Menu_.H new file mode 100644 index 0000000..5be4045 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Menu_.H @@ -0,0 +1,102 @@ +// +// "$Id: Fl_Menu_.H 4288 2005-04-16 00:13:17Z mike $" +// +// Menu base class header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Menu__H +#define Fl_Menu__H + +#ifndef Fl_Widget_H +#include "Fl_Widget.H" +#endif +#include "Fl_Menu_Item.H" + +class FL_EXPORT Fl_Menu_ : public Fl_Widget { + + Fl_Menu_Item *menu_; + const Fl_Menu_Item *value_; + +protected: + + uchar alloc; + uchar down_box_; + uchar textfont_; + uchar textsize_; + unsigned textcolor_; + +public: + Fl_Menu_(int,int,int,int,const char * =0); + ~Fl_Menu_(); + + int item_pathname(char *name, int namelen, const Fl_Menu_Item *finditem=0) const; + const Fl_Menu_Item* picked(const Fl_Menu_Item*); + const Fl_Menu_Item* find_item(const char *name); + + const Fl_Menu_Item* test_shortcut() {return picked(menu()->test_shortcut());} + void global(); + + const Fl_Menu_Item *menu() const {return menu_;} + void menu(const Fl_Menu_Item *m); + void copy(const Fl_Menu_Item *m, void* user_data = 0); + int add(const char*, int shortcut, Fl_Callback*, void* = 0, int = 0); + int add(const char* a, const char* b, Fl_Callback* c, + void* d = 0, int e = 0) {return add(a,fl_old_shortcut(b),c,d,e);} + int size() const ; + void size(int W, int H) { Fl_Widget::size(W, H); } + void clear(); + int add(const char *); + void replace(int,const char *); + void remove(int); + void shortcut(int i, int s) {menu_[i].shortcut(s);} + void mode(int i,int fl) {menu_[i].flags = fl;} + int mode(int i) const {return menu_[i].flags;} + + const Fl_Menu_Item *mvalue() const {return value_;} + int value() const {return value_ ? (int)(value_-menu_) : -1;} + int value(const Fl_Menu_Item*); + int value(int i) {return value(menu_+i);} + const char *text() const {return value_ ? value_->text : 0;} + const char *text(int i) const {return menu_[i].text;} + + Fl_Font textfont() const {return (Fl_Font)textfont_;} + void textfont(uchar c) {textfont_=c;} + uchar textsize() const {return textsize_;} + void textsize(uchar c) {textsize_=c;} + Fl_Color textcolor() const {return (Fl_Color)textcolor_;} + void textcolor(unsigned c) {textcolor_=c;} + + Fl_Boxtype down_box() const {return (Fl_Boxtype)down_box_;} + void down_box(Fl_Boxtype b) {down_box_ = b;} + + // back compatability: + Fl_Color down_color() const {return selection_color();} + void down_color(unsigned c) {selection_color(c);} +}; + +#endif + +// +// End of "$Id: Fl_Menu_.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Menu_Bar.H b/third_party/windows/fltk-1.1.10/FL/Fl_Menu_Bar.H new file mode 100644 index 0000000..24e564a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Menu_Bar.H @@ -0,0 +1,46 @@ +// +// "$Id: Fl_Menu_Bar.H 4288 2005-04-16 00:13:17Z mike $" +// +// Menu bar header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Menu_Bar_H +#define Fl_Menu_Bar_H + +#include "Fl_Menu_.H" + +class FL_EXPORT Fl_Menu_Bar : public Fl_Menu_ { +protected: + void draw(); +public: + int handle(int); + Fl_Menu_Bar(int X, int Y, int W, int H,const char *l=0) + : Fl_Menu_(X,Y,W,H,l) {} +}; + +#endif + +// +// End of "$Id: Fl_Menu_Bar.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Menu_Button.H b/third_party/windows/fltk-1.1.10/FL/Fl_Menu_Button.H new file mode 100644 index 0000000..68f53ee --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Menu_Button.H @@ -0,0 +1,48 @@ +// +// "$Id: Fl_Menu_Button.H 4288 2005-04-16 00:13:17Z mike $" +// +// Menu button header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Menu_Button_H +#define Fl_Menu_Button_H + +#include "Fl_Menu_.H" + +class FL_EXPORT Fl_Menu_Button : public Fl_Menu_ { +protected: + void draw(); +public: + // values for type: + enum {POPUP1 = 1, POPUP2, POPUP12, POPUP3, POPUP13, POPUP23, POPUP123}; + int handle(int); + const Fl_Menu_Item* popup(); + Fl_Menu_Button(int,int,int,int,const char * =0); +}; + +#endif + +// +// End of "$Id: Fl_Menu_Button.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Menu_Item.H b/third_party/windows/fltk-1.1.10/FL/Fl_Menu_Item.H new file mode 100644 index 0000000..d8f3ddb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Menu_Item.H @@ -0,0 +1,167 @@ +// +// "$Id: Fl_Menu_Item.H 4288 2005-04-16 00:13:17Z mike $" +// +// Menu item header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Menu_Item_H +#define Fl_Menu_Item_H + +# include "Fl_Widget.H" +# include "Fl_Image.H" + +# if defined(__APPLE__) && defined(check) +# undef check +# endif + +enum { // values for flags: + FL_MENU_INACTIVE = 1, + FL_MENU_TOGGLE= 2, + FL_MENU_VALUE = 4, + FL_MENU_RADIO = 8, + FL_MENU_INVISIBLE = 0x10, + FL_SUBMENU_POINTER = 0x20, + FL_SUBMENU = 0x40, + FL_MENU_DIVIDER = 0x80, + FL_MENU_HORIZONTAL = 0x100 +}; + +extern FL_EXPORT int fl_old_shortcut(const char*); + +class Fl_Menu_; + +struct FL_EXPORT Fl_Menu_Item { + const char *text; // label() + int shortcut_; + Fl_Callback *callback_; + void *user_data_; + int flags; + uchar labeltype_; + uchar labelfont_; + uchar labelsize_; + unsigned labelcolor_; + + // advance N items, skipping submenus: + const Fl_Menu_Item *next(int=1) const; + Fl_Menu_Item *next(int i=1) { + return (Fl_Menu_Item*)(((const Fl_Menu_Item*)this)->next(i));} + const Fl_Menu_Item *first() const { return next(0); } + Fl_Menu_Item *first() { return next(0); } + + // methods on menu items: + const char* label() const {return text;} + void label(const char* a) {text=a;} + void label(Fl_Labeltype a,const char* b) {labeltype_ = a; text = b;} + Fl_Labeltype labeltype() const {return (Fl_Labeltype)labeltype_;} + void labeltype(Fl_Labeltype a) {labeltype_ = a;} + Fl_Color labelcolor() const {return (Fl_Color)labelcolor_;} + void labelcolor(unsigned a) {labelcolor_ = a;} + Fl_Font labelfont() const {return (Fl_Font)labelfont_;} + void labelfont(uchar a) {labelfont_ = a;} + uchar labelsize() const {return labelsize_;} + void labelsize(uchar a) {labelsize_ = a;} + Fl_Callback_p callback() const {return callback_;} + void callback(Fl_Callback* c, void* p) {callback_=c; user_data_=p;} + void callback(Fl_Callback* c) {callback_=c;} + void callback(Fl_Callback0*c) {callback_=(Fl_Callback*)c;} + void callback(Fl_Callback1*c, long p=0) {callback_=(Fl_Callback*)c; user_data_=(void*)p;} + void* user_data() const {return user_data_;} + void user_data(void* v) {user_data_ = v;} + long argument() const {return (long)user_data_;} + void argument(long v) {user_data_ = (void*)v;} + int shortcut() const {return shortcut_;} + void shortcut(int s) {shortcut_ = s;} + int submenu() const {return flags&(FL_SUBMENU|FL_SUBMENU_POINTER);} + int checkbox() const {return flags&FL_MENU_TOGGLE;} + int radio() const {return flags&FL_MENU_RADIO;} + int value() const {return flags&FL_MENU_VALUE;} + void set() {flags |= FL_MENU_VALUE;} + void clear() {flags &= ~FL_MENU_VALUE;} + void setonly(); + int visible() const {return !(flags&FL_MENU_INVISIBLE);} + void show() {flags &= ~FL_MENU_INVISIBLE;} + void hide() {flags |= FL_MENU_INVISIBLE;} + int active() const {return !(flags&FL_MENU_INACTIVE);} + void activate() {flags &= ~FL_MENU_INACTIVE;} + void deactivate() {flags |= FL_MENU_INACTIVE;} + int activevisible() const {return !(flags&0x11);} + + // compatibility for FLUID so it can set the image of a menu item... + void image(Fl_Image* a) {a->label(this);} + void image(Fl_Image& a) {a.label(this);} + + // used by menubar: + int measure(int* h, const Fl_Menu_*) const; + void draw(int x, int y, int w, int h, const Fl_Menu_*, int t=0) const; + + // popup menus without using an Fl_Menu_ widget: + const Fl_Menu_Item* popup( + int X, int Y, + const char *title = 0, + const Fl_Menu_Item* picked=0, + const Fl_Menu_* = 0) const; + const Fl_Menu_Item* pulldown( + int X, int Y, int W, int H, + const Fl_Menu_Item* picked = 0, + const Fl_Menu_* = 0, + const Fl_Menu_Item* title = 0, + int menubar=0) const; + const Fl_Menu_Item* test_shortcut() const; + const Fl_Menu_Item* find_shortcut(int *ip=0) const; + + void do_callback(Fl_Widget* o) const {callback_(o, user_data_);} + void do_callback(Fl_Widget* o,void* arg) const {callback_(o, arg);} + void do_callback(Fl_Widget* o,long arg) const {callback_(o, (void*)arg);} + + // back-compatability, do not use: + int checked() const {return flags&FL_MENU_VALUE;} + void check() {flags |= FL_MENU_VALUE;} + void uncheck() {flags &= ~FL_MENU_VALUE;} + int add(const char*, int shortcut, Fl_Callback*, void* =0, int = 0); + int add(const char*a, const char* b, Fl_Callback* c, + void* d = 0, int e = 0) { + return add(a,fl_old_shortcut(b),c,d,e);} + int size() const ; +}; + +typedef Fl_Menu_Item Fl_Menu; // back compatability + +enum { // back-compatability enum: + FL_PUP_NONE = 0, + FL_PUP_GREY = FL_MENU_INACTIVE, + FL_PUP_GRAY = FL_MENU_INACTIVE, + FL_MENU_BOX = FL_MENU_TOGGLE, + FL_PUP_BOX = FL_MENU_TOGGLE, + FL_MENU_CHECK = FL_MENU_VALUE, + FL_PUP_CHECK = FL_MENU_VALUE, + FL_PUP_RADIO = FL_MENU_RADIO, + FL_PUP_INVISIBLE = FL_MENU_INVISIBLE, + FL_PUP_SUBMENU = FL_SUBMENU_POINTER +}; + +#endif + +// +// End of "$Id: Fl_Menu_Item.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Menu_Window.H b/third_party/windows/fltk-1.1.10/FL/Fl_Menu_Window.H new file mode 100644 index 0000000..79bfd79 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Menu_Window.H @@ -0,0 +1,54 @@ +// +// "$Id: Fl_Menu_Window.H 4288 2005-04-16 00:13:17Z mike $" +// +// Menu window header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Menu_Window_H +#define Fl_Menu_Window_H + +#include "Fl_Single_Window.H" + +class FL_EXPORT Fl_Menu_Window : public Fl_Single_Window { + enum {NO_OVERLAY = 128}; +public: + void show(); + void erase(); + void flush(); + void hide(); + int overlay() {return !(flags()&NO_OVERLAY);} + void set_overlay() {clear_flag(NO_OVERLAY);} + void clear_overlay() {set_flag(NO_OVERLAY);} + ~Fl_Menu_Window(); + Fl_Menu_Window(int W, int H, const char *l = 0) + : Fl_Single_Window(W,H,l) { image(0); } + Fl_Menu_Window(int X, int Y, int W, int H, const char *l = 0) + : Fl_Single_Window(X,Y,W,H,l) { image(0); } +}; + +#endif + +// +// End of "$Id: Fl_Menu_Window.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Multi_Browser.H b/third_party/windows/fltk-1.1.10/FL/Fl_Multi_Browser.H new file mode 100644 index 0000000..6491077 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Multi_Browser.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Multi_Browser.H 4288 2005-04-16 00:13:17Z mike $" +// +// Multi browser header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Multi_Browser_H +#define Fl_Multi_Browser_H + +#include "Fl_Browser.H" + +class Fl_Multi_Browser : public Fl_Browser { +public: + Fl_Multi_Browser(int X,int Y,int W,int H,const char *L=0) + : Fl_Browser(X,Y,W,H,L) {type(FL_MULTI_BROWSER);} +}; + +#endif + +// +// End of "$Id: Fl_Multi_Browser.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Multi_Label.H b/third_party/windows/fltk-1.1.10/FL/Fl_Multi_Label.H new file mode 100644 index 0000000..560a9c5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Multi_Label.H @@ -0,0 +1,47 @@ +// +// "$Id: Fl_Multi_Label.H 4288 2005-04-16 00:13:17Z mike $" +// +// Multi-label header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Multi_Label_H +#define Fl_Multi_Label_H + +class Fl_Widget; +struct Fl_Menu_Item; + +struct FL_EXPORT Fl_Multi_Label { + const char* labela; + const char* labelb; + uchar typea; + uchar typeb; + void label(Fl_Widget*); + void label(Fl_Menu_Item*); +}; + +#endif + +// +// End of "$Id: Fl_Multi_Label.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Multiline_Input.H b/third_party/windows/fltk-1.1.10/FL/Fl_Multiline_Input.H new file mode 100644 index 0000000..55fd5e1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Multiline_Input.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Multiline_Input.H 4288 2005-04-16 00:13:17Z mike $" +// +// Multiline input header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Multiline_Input_H +#define Fl_Multiline_Input_H + +#include "Fl_Input.H" + +class Fl_Multiline_Input : public Fl_Input { +public: + Fl_Multiline_Input(int X,int Y,int W,int H,const char *l = 0) + : Fl_Input(X,Y,W,H,l) {type(FL_MULTILINE_INPUT);} +}; + +#endif + +// +// End of "$Id: Fl_Multiline_Input.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Multiline_Output.H b/third_party/windows/fltk-1.1.10/FL/Fl_Multiline_Output.H new file mode 100644 index 0000000..522c5b8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Multiline_Output.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Multiline_Output.H 4288 2005-04-16 00:13:17Z mike $" +// +// Multi line output header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Multiline_Output_H +#define Fl_Multiline_Output_H + +#include "Fl_Output.H" + +class Fl_Multiline_Output : public Fl_Output { +public: + Fl_Multiline_Output(int X,int Y,int W,int H,const char *l = 0) + : Fl_Output(X,Y,W,H,l) {type(FL_MULTILINE_OUTPUT);} +}; + +#endif + +// +// End of "$Id: Fl_Multiline_Output.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Nice_Slider.H b/third_party/windows/fltk-1.1.10/FL/Fl_Nice_Slider.H new file mode 100644 index 0000000..f4fcdcb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Nice_Slider.H @@ -0,0 +1,42 @@ +// +// "$Id: Fl_Nice_Slider.H 4288 2005-04-16 00:13:17Z mike $" +// +// "Nice" slider header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +#ifndef Fl_Nice_Slider_H +#define Fl_Nice_Slider_H + +#include "Fl_Slider.H" + +class Fl_Nice_Slider : public Fl_Slider { +public: + Fl_Nice_Slider(int x,int y,int w,int h,const char *l=0) + : Fl_Slider(x,y,w,h,l) {type(FL_VERT_NICE_SLIDER); box(FL_FLAT_BOX);} +}; + +#endif + +// +// End of "$Id: Fl_Nice_Slider.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Object.H b/third_party/windows/fltk-1.1.10/FL/Fl_Object.H new file mode 100644 index 0000000..2d7e4a0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Object.H @@ -0,0 +1,36 @@ +// +// "$Id: Fl_Object.H 4288 2005-04-16 00:13:17Z mike $" +// +// Old Fl_Object header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// This file is provided for back compatability only. Please use Fl_Widget +#ifndef Fl_Object +#define Fl_Object Fl_Widget +#endif +#include "Fl_Widget.H" + +// +// End of "$Id: Fl_Object.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Output.H b/third_party/windows/fltk-1.1.10/FL/Fl_Output.H new file mode 100644 index 0000000..b5dc531 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Output.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Output.H 4288 2005-04-16 00:13:17Z mike $" +// +// Output header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Output_H +#define Fl_Output_H + +#include "Fl_Input.H" + +class Fl_Output : public Fl_Input { +public: + Fl_Output(int X,int Y,int W,int H, const char *l = 0) + : Fl_Input(X, Y, W, H, l) {type(FL_NORMAL_OUTPUT);} +}; + +#endif + +// +// End of "$Id: Fl_Output.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Overlay_Window.H b/third_party/windows/fltk-1.1.10/FL/Fl_Overlay_Window.H new file mode 100644 index 0000000..908ea2b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Overlay_Window.H @@ -0,0 +1,56 @@ +// +// "$Id: Fl_Overlay_Window.H 4288 2005-04-16 00:13:17Z mike $" +// +// Overlay window header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Overlay_Window_H +#define Fl_Overlay_Window_H + +#include "Fl_Double_Window.H" + +class FL_EXPORT Fl_Overlay_Window : public Fl_Double_Window { + friend class _Fl_Overlay; + virtual void draw_overlay() = 0; + Fl_Window *overlay_; +public: + void show(); + void flush(); + void hide(); + void resize(int,int,int,int); + ~Fl_Overlay_Window(); + int can_do_overlay(); + void redraw_overlay(); + Fl_Overlay_Window(int W, int H, const char *l=0) + : Fl_Double_Window(W,H,l) {overlay_ = 0; force_doublebuffering_=1; image(0); } + Fl_Overlay_Window(int X, int Y, int W, int H, const char *l=0) + : Fl_Double_Window(X,Y,W,H,l) {overlay_ = 0; force_doublebuffering_=1; image(0); } + void show(int a, char **b) {Fl_Double_Window::show(a,b);} +}; + +#endif + +// +// End of "$Id: Fl_Overlay_Window.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_PNG_Image.H b/third_party/windows/fltk-1.1.10/FL/Fl_PNG_Image.H new file mode 100644 index 0000000..022b6ec --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_PNG_Image.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_PNG_Image.H 4288 2005-04-16 00:13:17Z mike $" +// +// PNG image header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_PNG_Image_H +#define Fl_PNG_Image_H +# include "Fl_Image.H" + +class FL_EXPORT Fl_PNG_Image : public Fl_RGB_Image { + + public: + + Fl_PNG_Image(const char* filename); +}; + +#endif + +// +// End of "$Id: Fl_PNG_Image.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_PNM_Image.H b/third_party/windows/fltk-1.1.10/FL/Fl_PNM_Image.H new file mode 100644 index 0000000..a79a397 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_PNM_Image.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_PNM_Image.H 4288 2005-04-16 00:13:17Z mike $" +// +// PNM image header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_PNM_Image_H +#define Fl_PNM_Image_H +# include "Fl_Image.H" + +class FL_EXPORT Fl_PNM_Image : public Fl_RGB_Image { + + public: + + Fl_PNM_Image(const char* filename); +}; + +#endif + +// +// End of "$Id: Fl_PNM_Image.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Pack.H b/third_party/windows/fltk-1.1.10/FL/Fl_Pack.H new file mode 100644 index 0000000..0a96a7c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Pack.H @@ -0,0 +1,51 @@ +// +// "$Id: Fl_Pack.H 4288 2005-04-16 00:13:17Z mike $" +// +// Pack header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Pack_H +#define Fl_Pack_H + +#include + +class FL_EXPORT Fl_Pack : public Fl_Group { + int spacing_; +public: + enum { // values for type(int) + VERTICAL = 0, + HORIZONTAL = 1 + }; + void draw(); + Fl_Pack(int x,int y,int w ,int h,const char *l = 0); + int spacing() const {return spacing_;} + void spacing(int i) {spacing_ = i;} + uchar horizontal() const {return type();} +}; + +#endif + +// +// End of "$Id: Fl_Pack.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Pixmap.H b/third_party/windows/fltk-1.1.10/FL/Fl_Pixmap.H new file mode 100644 index 0000000..7db82c2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Pixmap.H @@ -0,0 +1,80 @@ +// +// "$Id: Fl_Pixmap.H 4288 2005-04-16 00:13:17Z mike $" +// +// Pixmap header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Pixmap_H +#define Fl_Pixmap_H +# include "Fl_Image.H" + +class Fl_Widget; +struct Fl_Menu_Item; + +// Older C++ compilers don't support the explicit keyword... :( +# if defined(__sgi) && !defined(_COMPILER_VERSION) +# define explicit +# endif // __sgi && !_COMPILER_VERSION + +class FL_EXPORT Fl_Pixmap : public Fl_Image { + void copy_data(); + void delete_data(); + void set_data(const char * const *p); + + protected: + + void measure(); + + public: + + int alloc_data; // Non-zero if data was allocated +#if defined(__APPLE__) || defined(WIN32) + void *id; // for internal use + void *mask; // for internal use (mask bitmap) +#else + unsigned id; // for internal use + unsigned mask; // for internal use (mask bitmap) +#endif // __APPLE__ || WIN32 + + explicit Fl_Pixmap(char * const * D) : Fl_Image(-1,0,1), alloc_data(0), id(0), mask(0) {set_data((const char*const*)D); measure();} + explicit Fl_Pixmap(uchar* const * D) : Fl_Image(-1,0,1), alloc_data(0), id(0), mask(0) {set_data((const char*const*)D); measure();} + explicit Fl_Pixmap(const char * const * D) : Fl_Image(-1,0,1), alloc_data(0), id(0), mask(0) {set_data((const char*const*)D); measure();} + explicit Fl_Pixmap(const uchar* const * D) : Fl_Image(-1,0,1), alloc_data(0), id(0), mask(0) {set_data((const char*const*)D); measure();} + virtual ~Fl_Pixmap(); + virtual Fl_Image *copy(int W, int H); + Fl_Image *copy() { return copy(w(), h()); } + virtual void color_average(Fl_Color c, float i); + virtual void desaturate(); + virtual void draw(int X, int Y, int W, int H, int cx=0, int cy=0); + void draw(int X, int Y) {draw(X, Y, w(), h(), 0, 0);} + virtual void label(Fl_Widget*w); + virtual void label(Fl_Menu_Item*m); + virtual void uncache(); +}; + +#endif + +// +// End of "$Id: Fl_Pixmap.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Positioner.H b/third_party/windows/fltk-1.1.10/FL/Fl_Positioner.H new file mode 100644 index 0000000..b20c769 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Positioner.H @@ -0,0 +1,77 @@ +// +// "$Id: Fl_Positioner.H 4288 2005-04-16 00:13:17Z mike $" +// +// Positioner header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Positioner_H +#define Fl_Positioner_H + +#ifndef Fl_Widget_H +#include "Fl_Widget.H" +#endif + +class FL_EXPORT Fl_Positioner : public Fl_Widget { + + double xmin, ymin; + double xmax, ymax; + double xvalue_, yvalue_; + double xstep_, ystep_; + +protected: + + // these allow subclasses to put the dial in a smaller area: + void draw(int, int, int, int); + int handle(int, int, int, int, int); + void draw(); + +public: + + int handle(int); + Fl_Positioner(int x,int y,int w,int h, const char *l=0); + double xvalue() const {return xvalue_;} + double yvalue() const {return yvalue_;} + int xvalue(double); + int yvalue(double); + int value(double,double); + void xbounds(double, double); + double xminimum() const {return xmin;} + void xminimum(double a) {xbounds(a,xmax);} + double xmaximum() const {return xmax;} + void xmaximum(double a) {xbounds(xmin,a);} + void ybounds(double, double); + double yminimum() const {return ymin;} + void yminimum(double a) {ybounds(a,ymax);} + double ymaximum() const {return ymax;} + void ymaximum(double a) {ybounds(ymin,a);} + void xstep(double a) {xstep_ = a;} + void ystep(double a) {ystep_ = a;} + +}; + +#endif + +// +// End of "$Id: Fl_Positioner.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Preferences.H b/third_party/windows/fltk-1.1.10/FL/Fl_Preferences.H new file mode 100644 index 0000000..6fbfcc1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Preferences.H @@ -0,0 +1,171 @@ +// +// "$Id: Fl_Preferences.H 5330 2006-08-18 07:29:09Z matt $" +// +// Preferences definitions for the Fast Light Tool Kit (FLTK). +// +// Copyright 2002-2005 by Matthias Melcher. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Preferences_H +# define Fl_Preferences_H + +# ifdef WIN32 +# include +# endif // WIN32 + +# include +# include "Fl_Export.H" + + +/** + * Preferences are a data tree containing a root, branches and leafs + */ +class FL_EXPORT Fl_Preferences +{ + +public: + + enum Root { SYSTEM=0, USER }; + // enum Type { win32, macos, fltk }; + + Fl_Preferences( Root root, const char *vendor, const char *application ); + Fl_Preferences( const char *path, const char *vendor, const char *application ); + Fl_Preferences( Fl_Preferences&, const char *group ); + Fl_Preferences( Fl_Preferences*, const char *group ); + ~Fl_Preferences(); + + int groups(); + const char *group( int ); + char groupExists( const char *group ); + char deleteGroup( const char *group ); + + int entries(); + const char *entry( int ); + char entryExists( const char *entry ); + char deleteEntry( const char *entry ); + + char set( const char *entry, int value ); + char set( const char *entry, float value ); + char set( const char *entry, float value, int precision ); + char set( const char *entry, double value ); + char set( const char *entry, double value, int precision ); + char set( const char *entry, const char *value ); + char set( const char *entry, const void *value, int size ); + + char get( const char *entry, int &value, int defaultValue ); + char get( const char *entry, float &value, float defaultValue ); + char get( const char *entry, double &value, double defaultValue ); + char get( const char *entry, char *&value, const char *defaultValue ); + char get( const char *entry, char *value, const char *defaultValue, int maxSize ); + char get( const char *entry, void *&value, const void *defaultValue, int defaultSize ); + char get( const char *entry, void *value, const void *defaultValue, int defaultSize, int maxSize ); + int size( const char *entry ); + + char getUserdataPath( char *path, int pathlen ); + + void flush(); + + // char export( const char *filename, Type fileFormat ); + // char import( const char *filename ); + + class FL_EXPORT Name { + char *data_; + public: + Name( unsigned int n ); + Name( const char *format, ... ); + operator const char *() { return data_; } + ~Name(); + }; + + struct Entry + { + char *name, *value; + }; + +private: + + // make the following functions unavailable + Fl_Preferences(); + Fl_Preferences(const Fl_Preferences&); + Fl_Preferences &operator=(const Fl_Preferences&); + + static char nameBuffer[128]; + + class FL_EXPORT Node // a node contains a list to all its entries + { // and all means to manage the tree structure + Node *child_, *next_, *parent_; + char *path_; + char dirty_; + public: + Node( const char *path ); + ~Node(); + // node methods + int write( FILE *f ); + Node *find( const char *path ); + Node *search( const char *path, int offset=0 ); + Node *addChild( const char *path ); + void setParent( Node *parent ); + Node *parent() { return parent_; } + char remove(); + char dirty(); + // entry methods + int nChildren(); + const char *child( int ix ); + void set( const char *name, const char *value ); + void set( const char *line ); + void add( const char *line ); + const char *get( const char *name ); + int getEntry( const char *name ); + char deleteEntry( const char *name ); + // public values + Entry *entry; + int nEntry, NEntry; + static int lastEntrySet; + }; + friend class Node; + + class FL_EXPORT RootNode // the root node manages file paths and basic reading and writing + { + Fl_Preferences *prefs_; + char *filename_; + char *vendor_, *application_; + public: + RootNode( Fl_Preferences *, Root root, const char *vendor, const char *application ); + RootNode( Fl_Preferences *, const char *path, const char *vendor, const char *application ); + ~RootNode(); + int read(); + int write(); + char getPath( char *path, int pathlen ); + }; + friend class RootNode; + + Node *node; + RootNode *rootNode; + +}; + + +#endif // !Fl_Preferences_H + +// +// End of "$Id: Fl_Preferences.H 5330 2006-08-18 07:29:09Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Progress.H b/third_party/windows/fltk-1.1.10/FL/Fl_Progress.H new file mode 100644 index 0000000..a58a2d7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Progress.H @@ -0,0 +1,70 @@ +// +// "$Id: Fl_Progress.H 4288 2005-04-16 00:13:17Z mike $" +// +// Progress bar widget definitions. +// +// Copyright 2000-2005 by Michael Sweet. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef _Fl_Progress_H_ +# define _Fl_Progress_H_ + +// +// Include necessary headers. +// + +#include "Fl_Widget.H" + + +// +// Progress class... +// + +class FL_EXPORT Fl_Progress : public Fl_Widget +{ + float value_, + minimum_, + maximum_; + + protected: + + virtual void draw(); + + public: + + Fl_Progress(int x, int y, int w, int h, const char *l = 0); + + void maximum(float v) { maximum_ = v; redraw(); } + float maximum() const { return (maximum_); } + + void minimum(float v) { minimum_ = v; redraw(); } + float minimum() const { return (minimum_); } + + void value(float v) { value_ = v; redraw(); } + float value() const { return (value_); } +}; + +#endif // !_Fl_Progress_H_ + +// +// End of "$Id: Fl_Progress.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_RGB_Image.H b/third_party/windows/fltk-1.1.10/FL/Fl_RGB_Image.H new file mode 100644 index 0000000..34f546c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_RGB_Image.H @@ -0,0 +1,35 @@ +// +// "$Id:$" +// +// RGB Image header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_RGB_Image_H +# define Fl_RGB_Image_H +# include "Fl_Image.H" +#endif // !Fl_RGB_Image_H + +// +// End of "$Id:$". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Radio_Button.H b/third_party/windows/fltk-1.1.10/FL/Fl_Radio_Button.H new file mode 100644 index 0000000..0d66a1b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Radio_Button.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Radio_Button.H 4288 2005-04-16 00:13:17Z mike $" +// +// Radio button header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Radio_Button_H +#define Fl_Radio_Button_H + +#include "Fl_Button.H" + +class Fl_Radio_Button : public Fl_Button { +public: + Fl_Radio_Button(int x,int y,int w,int h,const char *l=0) + : Fl_Button(x,y,w,h,l) {type(FL_RADIO_BUTTON);} +}; + +#endif + +// +// End of "$Id: Fl_Radio_Button.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Radio_Light_Button.H b/third_party/windows/fltk-1.1.10/FL/Fl_Radio_Light_Button.H new file mode 100644 index 0000000..bf4457e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Radio_Light_Button.H @@ -0,0 +1,42 @@ +// +// "$Id: Fl_Radio_Light_Button.H 4288 2005-04-16 00:13:17Z mike $" +// +// Radio light button header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +#ifndef Fl_Radio_Light_Button_H +#define Fl_Radio_Light_Button_H + +#include "Fl_Light_Button.H" + +class Fl_Radio_Light_Button : public Fl_Light_Button { +public: + Fl_Radio_Light_Button(int X,int Y,int W,int H,const char *l=0) + : Fl_Light_Button(X,Y,W,H,l) {type(FL_RADIO_BUTTON);} +}; + +#endif + +// +// End of "$Id: Fl_Radio_Light_Button.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Radio_Round_Button.H b/third_party/windows/fltk-1.1.10/FL/Fl_Radio_Round_Button.H new file mode 100644 index 0000000..0b7319e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Radio_Round_Button.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Radio_Round_Button.H 4288 2005-04-16 00:13:17Z mike $" +// +// Radio round button header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Radio_Round_Button_H +#define Fl_Radio_Round_Button_H + +#include "Fl_Round_Button.H" + +class Fl_Radio_Round_Button : public Fl_Round_Button { +public: + Fl_Radio_Round_Button(int x,int y,int w,int h,const char *l=0) + : Fl_Round_Button(x,y,w,h,l) {type(FL_RADIO_BUTTON);} +}; + +#endif + +// +// End of "$Id: Fl_Radio_Round_Button.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Repeat_Button.H b/third_party/windows/fltk-1.1.10/FL/Fl_Repeat_Button.H new file mode 100644 index 0000000..705c0d7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Repeat_Button.H @@ -0,0 +1,49 @@ +// +// "$Id: Fl_Repeat_Button.H 4288 2005-04-16 00:13:17Z mike $" +// +// Repeat button header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Repeat_Button_H +#define Fl_Repeat_Button_H +#include "Fl.H" +#include "Fl_Button.H" + +class FL_EXPORT Fl_Repeat_Button : public Fl_Button { + static void repeat_callback(void *); +public: + int handle(int); + Fl_Repeat_Button(int X,int Y,int W,int H,const char *l=0) + : Fl_Button(X,Y,W,H,l) {} + void deactivate() { + Fl::remove_timeout(repeat_callback,this); + Fl_Button::deactivate(); + } +}; + +#endif + +// +// End of "$Id: Fl_Repeat_Button.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Return_Button.H b/third_party/windows/fltk-1.1.10/FL/Fl_Return_Button.H new file mode 100644 index 0000000..afb3c20 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Return_Button.H @@ -0,0 +1,45 @@ +// +// "$Id: Fl_Return_Button.H 4288 2005-04-16 00:13:17Z mike $" +// +// Return button header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Return_Button_H +#define Fl_Return_Button_H +#include "Fl_Button.H" + +class FL_EXPORT Fl_Return_Button : public Fl_Button { +protected: + void draw(); +public: + int handle(int); + Fl_Return_Button(int X, int Y, int W, int H,const char *l=0) + : Fl_Button(X,Y,W,H,l) {} +}; + +#endif + +// +// End of "$Id: Fl_Return_Button.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Roller.H b/third_party/windows/fltk-1.1.10/FL/Fl_Roller.H new file mode 100644 index 0000000..b063176 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Roller.H @@ -0,0 +1,47 @@ +// +// "$Id: Fl_Roller.H 4288 2005-04-16 00:13:17Z mike $" +// +// Roller header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Roller_H +#define Fl_Roller_H + +#ifndef Fl_Valuator_H +#include "Fl_Valuator.H" +#endif + +class FL_EXPORT Fl_Roller : public Fl_Valuator { +protected: + void draw(); +public: + int handle(int); + Fl_Roller(int X,int Y,int W,int H,const char* L=0); +}; + +#endif + +// +// End of "$Id: Fl_Roller.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Round_Button.H b/third_party/windows/fltk-1.1.10/FL/Fl_Round_Button.H new file mode 100644 index 0000000..2b9e433 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Round_Button.H @@ -0,0 +1,42 @@ +// +// "$Id: Fl_Round_Button.H 4288 2005-04-16 00:13:17Z mike $" +// +// Round button header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Round_Button_H +#define Fl_Round_Button_H + +#include "Fl_Light_Button.H" + +class FL_EXPORT Fl_Round_Button : public Fl_Light_Button { +public: + Fl_Round_Button(int x,int y,int w,int h,const char *l = 0); +}; + +#endif + +// +// End of "$Id: Fl_Round_Button.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Round_Clock.H b/third_party/windows/fltk-1.1.10/FL/Fl_Round_Clock.H new file mode 100644 index 0000000..74d1e17 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Round_Clock.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Round_Clock.H 4288 2005-04-16 00:13:17Z mike $" +// +// Round clock header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Round_Clock_H +#define Fl_Round_Clock_H + +#include "Fl_Clock.H" + +class Fl_Round_Clock : public Fl_Clock { +public: + Fl_Round_Clock(int x,int y,int w,int h, const char *l = 0) + : Fl_Clock(x,y,w,h,l) {type(FL_ROUND_CLOCK); box(FL_NO_BOX);} +}; + +#endif + +// +// End of "$Id: Fl_Round_Clock.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Scroll.H b/third_party/windows/fltk-1.1.10/FL/Fl_Scroll.H new file mode 100644 index 0000000..655cfa6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Scroll.H @@ -0,0 +1,79 @@ +// +// "$Id: Fl_Scroll.H 5618 2007-01-18 19:23:24Z matt $" +// +// Scroll header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Scroll_H +#define Fl_Scroll_H + +#include "Fl_Group.H" +#include "Fl_Scrollbar.H" + +class FL_EXPORT Fl_Scroll : public Fl_Group { + + int xposition_, yposition_; + int width_, height_; + int oldx, oldy; + static void hscrollbar_cb(Fl_Widget*, void*); + static void scrollbar_cb(Fl_Widget*, void*); + void fix_scrollbar_order(); + static void draw_clip(void*,int,int,int,int); + +protected: + + void bbox(int&,int&,int&,int&); + void draw(); + +public: + + Fl_Scrollbar scrollbar; + Fl_Scrollbar hscrollbar; + + void resize(int,int,int,int); + int handle(int); + + Fl_Scroll(int X,int Y,int W,int H,const char*l=0); + + enum { // values for type() + HORIZONTAL = 1, + VERTICAL = 2, + BOTH = 3, + ALWAYS_ON = 4, + HORIZONTAL_ALWAYS = 5, + VERTICAL_ALWAYS = 6, + BOTH_ALWAYS = 7 + }; + + int xposition() const {return xposition_;} + int yposition() const {return yposition_;} + void position(int, int); + void clear(); +}; + +#endif + +// +// End of "$Id: Fl_Scroll.H 5618 2007-01-18 19:23:24Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Scrollbar.H b/third_party/windows/fltk-1.1.10/FL/Fl_Scrollbar.H new file mode 100644 index 0000000..314ac0f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Scrollbar.H @@ -0,0 +1,61 @@ +// +// "$Id: Fl_Scrollbar.H 6042 2008-02-25 13:00:53Z matt $" +// +// Scroll bar header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Scrollbar_H +#define Fl_Scrollbar_H + +#include "Fl_Slider.H" + +class FL_EXPORT Fl_Scrollbar : public Fl_Slider { + + int linesize_; + int pushed_; + static void timeout_cb(void*); + void increment_cb(); +protected: + void draw(); + +public: + + Fl_Scrollbar(int x,int y,int w,int h, const char *l = 0); + ~Fl_Scrollbar(); + int handle(int); + + int value() {return int(Fl_Slider::value());} + int value(int p, int s, int top, int total) { + return scrollvalue(p, s, top, total); + } + int linesize() const {return linesize_;} + void linesize(int i) {linesize_ = i;} + +}; + +#endif + +// +// End of "$Id: Fl_Scrollbar.H 6042 2008-02-25 13:00:53Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Secret_Input.H b/third_party/windows/fltk-1.1.10/FL/Fl_Secret_Input.H new file mode 100644 index 0000000..fee328e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Secret_Input.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Secret_Input.H 4288 2005-04-16 00:13:17Z mike $" +// +// Secret input header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Secret_Input_H +#define Fl_Secret_Input_H + +#include "Fl_Input.H" + +class Fl_Secret_Input : public Fl_Input { +public: + Fl_Secret_Input(int X,int Y,int W,int H,const char *l = 0) + : Fl_Input(X,Y,W,H,l) {type(FL_SECRET_INPUT);} +}; + +#endif + +// +// End of "$Id: Fl_Secret_Input.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Select_Browser.H b/third_party/windows/fltk-1.1.10/FL/Fl_Select_Browser.H new file mode 100644 index 0000000..25639d3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Select_Browser.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Select_Browser.H 4288 2005-04-16 00:13:17Z mike $" +// +// Select browser header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Select_Browser_H +#define Fl_Select_Browser_H + +#include "Fl_Browser.H" + +class Fl_Select_Browser : public Fl_Browser { +public: + Fl_Select_Browser(int X,int Y,int W,int H,const char *l=0) + : Fl_Browser(X,Y,W,H,l) {type(FL_SELECT_BROWSER);} +}; + +#endif + +// +// End of "$Id: Fl_Select_Browser.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Shared_Image.H b/third_party/windows/fltk-1.1.10/FL/Fl_Shared_Image.H new file mode 100644 index 0000000..e159f80 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Shared_Image.H @@ -0,0 +1,99 @@ +// +// "$Id: Fl_Shared_Image.H 4288 2005-04-16 00:13:17Z mike $" +// +// Shared image header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Shared_Image_H +# define Fl_Shared_Image_H + +# include "Fl_Image.H" + + +// Test function for adding new formats +typedef Fl_Image *(*Fl_Shared_Handler)(const char *name, uchar *header, + int headerlen); + +// Shared images class. +class FL_EXPORT Fl_Shared_Image : public Fl_Image { + protected: + + static Fl_Shared_Image **images_; // Shared images + static int num_images_; // Number of shared images + static int alloc_images_; // Allocated shared images + static Fl_Shared_Handler *handlers_; // Additional format handlers + static int num_handlers_; // Number of format handlers + static int alloc_handlers_; // Allocated format handlers + + const char *name_; // Name of image file + int original_; // Original image? + int refcount_; // Number of times this image has been used + Fl_Image *image_; // The image that is shared + int alloc_image_; // Was the image allocated? + + static int compare(Fl_Shared_Image **i0, Fl_Shared_Image **i1); + + // Use get() and release() to load/delete images in memory... + Fl_Shared_Image(); + Fl_Shared_Image(const char *n, Fl_Image *img = 0); + virtual ~Fl_Shared_Image(); + void add(); + void update(); + + public: + + const char *name() { return name_; } + int refcount() { return refcount_; } + void release(); + void reload(); + + virtual Fl_Image *copy(int W, int H); + Fl_Image *copy() { return copy(w(), h()); } + virtual void color_average(Fl_Color c, float i); + virtual void desaturate(); + virtual void draw(int X, int Y, int W, int H, int cx, int cy); + void draw(int X, int Y) { draw(X, Y, w(), h(), 0, 0); } + virtual void uncache(); + + static Fl_Shared_Image *find(const char *n, int W = 0, int H = 0); + static Fl_Shared_Image *get(const char *n, int W = 0, int H = 0); + static Fl_Shared_Image **images(); + static int num_images(); + static void add_handler(Fl_Shared_Handler f); + static void remove_handler(Fl_Shared_Handler f); +}; + +// +// The following function is provided in the fltk_images library and +// registers all of the "extra" image file formats that are not part +// of the core FLTK library... +// + +FL_EXPORT extern void fl_register_images(); + +#endif // !Fl_Shared_Image_H + +// +// End of "$Id: Fl_Shared_Image.H 4288 2005-04-16 00:13:17Z mike $" +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Simple_Counter.H b/third_party/windows/fltk-1.1.10/FL/Fl_Simple_Counter.H new file mode 100644 index 0000000..bf08d02 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Simple_Counter.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Simple_Counter.H 4288 2005-04-16 00:13:17Z mike $" +// +// Simple counter header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Simple_Counter_H +#define Fl_Simple_Counter_H + +#include "Fl_Counter.H" + +class Fl_Simple_Counter : public Fl_Counter { +public: + Fl_Simple_Counter(int x,int y,int w,int h, const char *l = 0) + : Fl_Counter(x,y,w,h,l) {type(FL_SIMPLE_COUNTER);} +}; + +#endif + +// +// End of "$Id: Fl_Simple_Counter.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Single_Window.H b/third_party/windows/fltk-1.1.10/FL/Fl_Single_Window.H new file mode 100644 index 0000000..6611d14 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Single_Window.H @@ -0,0 +1,49 @@ +// +// "$Id: Fl_Single_Window.H 4288 2005-04-16 00:13:17Z mike $" +// +// Single-buffered window header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Single_Window_H +#define Fl_Single_Window_H + +#include "Fl_Window.H" + +class FL_EXPORT Fl_Single_Window : public Fl_Window { +public: + void show(); + void show(int a, char **b) {Fl_Window::show(a,b);} + void flush(); + Fl_Single_Window(int W, int H, const char *l=0) + : Fl_Window(W,H,l) {} + Fl_Single_Window(int X, int Y, int W, int H, const char *l=0) + : Fl_Window(X,Y,W,H,l) {} + int make_current(); +}; + +#endif + +// +// End of "$Id: Fl_Single_Window.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Slider.H b/third_party/windows/fltk-1.1.10/FL/Fl_Slider.H new file mode 100644 index 0000000..7b50c81 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Slider.H @@ -0,0 +1,75 @@ +// +// "$Id: Fl_Slider.H 4288 2005-04-16 00:13:17Z mike $" +// +// Slider header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Slider_H +#define Fl_Slider_H + +#ifndef Fl_Valuator_H +#include "Fl_Valuator.H" +#endif + +// values for type(), lowest bit indicate horizontal: +#define FL_VERT_SLIDER 0 +#define FL_HOR_SLIDER 1 +#define FL_VERT_FILL_SLIDER 2 +#define FL_HOR_FILL_SLIDER 3 +#define FL_VERT_NICE_SLIDER 4 +#define FL_HOR_NICE_SLIDER 5 + +class FL_EXPORT Fl_Slider : public Fl_Valuator { + + float slider_size_; + uchar slider_; + void _Fl_Slider(); + void draw_bg(int, int, int, int); + +protected: + + // these allow subclasses to put the slider in a smaller area: + void draw(int, int, int, int); + int handle(int, int, int, int, int); + +public: + + void draw(); + int handle(int); + Fl_Slider(int x,int y,int w,int h, const char *l = 0); + Fl_Slider(uchar t,int x,int y,int w,int h, const char *l); + + int scrollvalue(int windowtop,int windowsize,int first,int totalsize); + void bounds(double a, double b); + float slider_size() const {return slider_size_;} + void slider_size(double v); + Fl_Boxtype slider() const {return (Fl_Boxtype)slider_;} + void slider(Fl_Boxtype c) {slider_ = c;} +}; + +#endif + +// +// End of "$Id: Fl_Slider.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Spinner.H b/third_party/windows/fltk-1.1.10/FL/Fl_Spinner.H new file mode 100644 index 0000000..fe9872d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Spinner.H @@ -0,0 +1,224 @@ +// +// "$Id$" +// +// Spinner widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Spinner_H +# define Fl_Spinner_H + +// +// Include necessary headers... +// + +# include +# include +# include +# include +# include +# include + + +// +// Fl_Spinner widget class... +// + +class Fl_Spinner : public Fl_Group +{ + double value_; // Current value + double minimum_; // Minimum value + double maximum_; // Maximum value + double step_; // Amount to add/subtract for up/down + const char *format_; // Format string + + Fl_Input input_; // Input field for the value + Fl_Repeat_Button + up_button_, // Up button + down_button_; // Down button + + + static void sb_cb(Fl_Widget *w, Fl_Spinner *sb) { + double v; // New value + + if (w == &(sb->input_)) { + // Something changed in the input field... + v = atof(sb->input_.value()); + + if (v < sb->minimum_) { + sb->value_ = sb->minimum_; + sb->update(); + } else if (v > sb->maximum_) { + sb->value_ = sb->maximum_; + sb->update(); + } else sb->value_ = v; + } else if (w == &(sb->up_button_)) { + // Up button pressed... + v = sb->value_ + sb->step_; + + if (v > sb->maximum_) sb->value_ = sb->minimum_; + else sb->value_ = v; + + sb->update(); + } else if (w == &(sb->down_button_)) { + // Down button pressed... + v = sb->value_ - sb->step_; + + if (v < sb->minimum_) sb->value_ = sb->maximum_; + else sb->value_ = v; + + sb->update(); + } + + sb->do_callback(); + } + void update() { + char s[255]; // Value string + + if (format_[0]=='%'&&format_[1]=='.'&&format_[2]=='*') { // precision argument + // this code block is a simplified version of + // Fl_Valuator::format() and works well (but looks ugly) + int c = 0; + char temp[64], *sp = temp; + sprintf(temp, "%.12f", step_); + while (*sp) sp++; + sp--; + while (sp>temp && *sp=='0') sp--; + while (sp>temp && (*sp>='0' && *sp<='9')) { sp--; c++; } + sprintf(s, format_, c, value_); + } else { + sprintf(s, format_, value_); + } + input_.value(s); + } + + public: + + Fl_Spinner(int X, int Y, int W, int H, const char *L = 0) + : Fl_Group(X, Y, W, H, L), + input_(X, Y, W - H / 2 - 2, H), + up_button_(X + W - H / 2 - 2, Y, H / 2 + 2, H / 2, "@-42<"), + down_button_(X + W - H / 2 - 2, Y + H - H / 2, + H / 2 + 2, H / 2, "@-42>") { + end(); + + value_ = 1.0; + minimum_ = 1.0; + maximum_ = 100.0; + step_ = 1.0; + format_ = "%g"; + + align(FL_ALIGN_LEFT); + + input_.value("1"); + input_.type(FL_INT_INPUT); + input_.when(FL_WHEN_ENTER_KEY | FL_WHEN_RELEASE); + input_.callback((Fl_Callback *)sb_cb, this); + + up_button_.callback((Fl_Callback *)sb_cb, this); + + down_button_.callback((Fl_Callback *)sb_cb, this); + } + + const char *format() { return (format_); } + void format(const char *f) { format_ = f; update(); } + + int handle(int event) { + switch (event) { + case FL_KEYDOWN : + case FL_SHORTCUT : + if (Fl::event_key() == FL_Up) { + up_button_.do_callback(); + return 1; + } else if (Fl::event_key() == FL_Down) { + down_button_.do_callback(); + return 1; + } else return 0; + + case FL_FOCUS : + if (input_.take_focus()) return 1; + else return 0; + } + + return Fl_Group::handle(event); + } + + // Speling mistaks retained for source compatibility... + double maxinum() const { return (maximum_); } + double maximum() const { return (maximum_); } + void maximum(double m) { maximum_ = m; } + double mininum() const { return (minimum_); } + double minimum() const { return (minimum_); } + void minimum(double m) { minimum_ = m; } + void range(double a, double b) { minimum_ = a; maximum_ = b; } + void resize(int X, int Y, int W, int H) { + Fl_Group::resize(X,Y,W,H); + + input_.resize(X, Y, W - H / 2 - 2, H); + up_button_.resize(X + W - H / 2 - 2, Y, H / 2 + 2, H / 2); + down_button_.resize(X + W - H / 2 - 2, Y + H - H / 2, + H / 2 + 2, H / 2); + } + double step() const { return (step_); } + void step(double s) { + step_ = s; + if (step_ != (int)step_) input_.type(FL_FLOAT_INPUT); + else input_.type(FL_INT_INPUT); + update(); + } + Fl_Color textcolor() const { + return (input_.textcolor()); + } + void textcolor(Fl_Color c) { + input_.textcolor(c); + } + uchar textfont() const { + return (input_.textfont()); + } + void textfont(uchar f) { + input_.textfont(f); + } + uchar textsize() const { + return (input_.textsize()); + } + void textsize(uchar s) { + input_.textsize(s); + } + uchar type() const { return (input_.type()); } + void type(uchar v) { + if (v==FL_FLOAT_INPUT) { + format("%.*f"); + } else { + format("%.0f"); + } + input_.type(v); + } + double value() const { return (value_); } + void value(double v) { value_ = v; update(); } +}; + +#endif // !Fl_Spinner_H + +// +// End of "$Id$". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Sys_Menu_Bar.H b/third_party/windows/fltk-1.1.10/FL/Fl_Sys_Menu_Bar.H new file mode 100644 index 0000000..d3e2724 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Sys_Menu_Bar.H @@ -0,0 +1,56 @@ +// +// "$Id: Fl_Sys_Menu_Bar.H 4546 2005-08-29 20:05:38Z matt $" +// +// MacOS system menu bar header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Sys_Menu_Bar_H +#define Fl_Sys_Menu_Bar_H + +#include "Fl_Menu_Bar.H" + +#ifdef __APPLE__ + +class FL_EXPORT Fl_Sys_Menu_Bar : public Fl_Menu_Bar { +protected: + void draw(); +public: + Fl_Sys_Menu_Bar(int x,int y,int w,int h,const char *l=0) + : Fl_Menu_Bar(x,y,w,h,l) { + deactivate(); // don't let the old area take events + } + void menu(const Fl_Menu_Item *m); +}; + +#else + +typedef Fl_Menu_Bar Fl_Sys_Menu_Bar; + +#endif + +#endif + +// +// End of "$Id: Fl_Sys_Menu_Bar.H 4546 2005-08-29 20:05:38Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Tabs.H b/third_party/windows/fltk-1.1.10/FL/Fl_Tabs.H new file mode 100644 index 0000000..d242844 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Tabs.H @@ -0,0 +1,57 @@ +// +// "$Id: Fl_Tabs.H 5326 2006-08-17 13:43:07Z matt $" +// +// Tab header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Tabs_H +#define Fl_Tabs_H + +#include "Fl_Group.H" + +class FL_EXPORT Fl_Tabs : public Fl_Group { + Fl_Widget *value_; + Fl_Widget *push_; + int tab_positions(int*, int*); + int tab_height(); + void draw_tab(int x1, int x2, int W, int H, Fl_Widget* o, int sel=0); +protected: + void redraw_tabs(); + void draw(); + +public: + int handle(int); + Fl_Widget *value(); + int value(Fl_Widget *); + Fl_Widget *push() const {return push_;} + int push(Fl_Widget *); + Fl_Tabs(int,int,int,int,const char * = 0); + Fl_Widget *which(int event_x, int event_y); +}; + +#endif + +// +// End of "$Id: Fl_Tabs.H 5326 2006-08-17 13:43:07Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Text_Buffer.H b/third_party/windows/fltk-1.1.10/FL/Fl_Text_Buffer.H new file mode 100644 index 0000000..4076366 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Text_Buffer.H @@ -0,0 +1,263 @@ +// +// "$Id: Fl_Text_Buffer.H 6010 2008-01-04 20:31:52Z matt $" +// +// Header file for Fl_Text_Buffer class. +// +// Copyright 2001-2005 by Bill Spitzak and others. +// Original code Copyright Mark Edel. Permission to distribute under +// the LGPL for the FLTK library granted by Mark Edel. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef FL_TEXT_BUFFER_H +#define FL_TEXT_BUFFER_H + +/* Maximum length in characters of a tab or control character expansion + of a single buffer character */ +#define FL_TEXT_MAX_EXP_CHAR_LEN 20 + +#include "Fl_Export.H" + +class FL_EXPORT Fl_Text_Selection { + friend class Fl_Text_Buffer; + + public: + void set(int start, int end); + void set_rectangular(int start, int end, int rectStart, int rectEnd); + void update(int pos, int nDeleted, int nInserted); + char rectangular() { return mRectangular; } + int start() { return mStart; } + int end() { return mEnd; } + int rect_start() { return mRectStart; } + int rect_end() { return mRectEnd; } + char selected() { return mSelected; } + void selected(char b) { mSelected = b; } + int includes(int pos, int lineStartPos, int dispIndex); + int position(int* start, int* end); + int position(int* start, int* end, int* isRect, int* rectStart, int* rectEnd); + + + protected: + char mSelected; + char mRectangular; + int mStart; + int mEnd; + int mRectStart; + int mRectEnd; +}; + +typedef void (*Fl_Text_Modify_Cb)(int pos, int nInserted, int nDeleted, + int nRestyled, const char* deletedText, + void* cbArg); +typedef void (*Fl_Text_Predelete_Cb)(int pos, int nDeleted, void* cbArg); + +class FL_EXPORT Fl_Text_Buffer { + public: + Fl_Text_Buffer(int requestedSize = 0); + ~Fl_Text_Buffer(); + + int length() { return mLength; } + char* text(); + void text(const char* text); + char* text_range(int start, int end); + char character(int pos); + char* text_in_rectangle(int start, int end, int rectStart, int rectEnd); + void insert(int pos, const char* text); + void append(const char* t) { insert(length(), t); } + void remove(int start, int end); + void replace(int start, int end, const char *text); + void copy(Fl_Text_Buffer* fromBuf, int fromStart, int fromEnd, int toPos); + int undo(int *cp=0); + void canUndo(char flag=1); + int insertfile(const char *file, int pos, int buflen = 128*1024); + int appendfile(const char *file, int buflen = 128*1024) + { return insertfile(file, length(), buflen); } + int loadfile(const char *file, int buflen = 128*1024) + { select(0, length()); remove_selection(); return appendfile(file, buflen); } + int outputfile(const char *file, int start, int end, int buflen = 128*1024); + int savefile(const char *file, int buflen = 128*1024) + { return outputfile(file, 0, length(), buflen); } + + void insert_column(int column, int startPos, const char* text, + int* charsInserted, int* charsDeleted); + + void replace_rectangular(int start, int end, int rectStart, int rectEnd, + const char* text); + + void overlay_rectangular(int startPos, int rectStart, int rectEnd, + const char* text, int* charsInserted, + int* charsDeleted); + + void remove_rectangular(int start, int end, int rectStart, int rectEnd); + void clear_rectangular(int start, int end, int rectStart, int rectEnd); + int tab_distance() { return mTabDist; } + void tab_distance(int tabDist); + void select(int start, int end); + int selected() { return mPrimary.selected(); } + void unselect(); + void select_rectangular(int start, int end, int rectStart, int rectEnd); + int selection_position(int* start, int* end); + + int selection_position(int* start, int* end, int* isRect, int* rectStart, + int* rectEnd); + + char* selection_text(); + void remove_selection(); + void replace_selection(const char* text); + void secondary_select(int start, int end); + int secondary_selected() { return mSecondary.selected(); } + void secondary_unselect(); + + void secondary_select_rectangular(int start, int end, int rectStart, + int rectEnd); + + int secondary_selection_position(int* start, int* end); + int secondary_selection_position(int* start, int* end, int* isRect, + int* rectStart, int* rectEnd); + + char* secondary_selection_text(); + void remove_secondary_selection(); + void replace_secondary_selection(const char* text); + void highlight(int start, int end); + int highlight() { return mHighlight.selected(); } + void unhighlight(); + void highlight_rectangular(int start, int end, int rectStart, int rectEnd); + + int highlight_position(int* start, int* end); + int highlight_position(int* start, int* end, int* isRect, int* rectStart, + int* rectEnd); + + char* highlight_text(); + void add_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg); + void remove_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg); + + void call_modify_callbacks() { call_modify_callbacks(0, 0, 0, 0, 0); } + + void add_predelete_callback(Fl_Text_Predelete_Cb bufPredelCB, void* cbArg); + void remove_predelete_callback(Fl_Text_Predelete_Cb predelCB, void* cbArg); + + void call_predelete_callbacks() { call_predelete_callbacks(0, 0); } + + char* line_text(int pos); + int line_start(int pos); + int line_end(int pos); + int word_start(int pos); + int word_end(int pos); + int expand_character(int pos, int indent, char *outStr); + + static int expand_character(char c, int indent, char* outStr, int tabDist, + char nullSubsChar); + + static int character_width(char c, int indent, int tabDist, char nullSubsChar); + int count_displayed_characters(int lineStartPos, int targetPos); + int skip_displayed_characters(int lineStartPos, int nChars); + int count_lines(int startPos, int endPos); + int skip_lines(int startPos, int nLines); + int rewind_lines(int startPos, int nLines); + int findchar_forward(int startPos, char searchChar, int* foundPos); + int findchar_backward(int startPos, char searchChar, int* foundPos); + int findchars_forward(int startPos, const char* searchChars, int* foundPos); + int findchars_backward(int startPos, const char* searchChars, int* foundPos); + + int search_forward(int startPos, const char* searchString, int* foundPos, + int matchCase = 0); + + int search_backward(int startPos, const char* searchString, int* foundPos, + int matchCase = 0); + + int substitute_null_characters(char* string, int length); + void unsubstitute_null_characters(char* string); + char null_substitution_character() { return mNullSubsChar; } + Fl_Text_Selection* primary_selection() { return &mPrimary; } + Fl_Text_Selection* secondary_selection() { return &mSecondary; } + Fl_Text_Selection* highlight_selection() { return &mHighlight; } + + protected: + void call_modify_callbacks(int pos, int nDeleted, int nInserted, + int nRestyled, const char* deletedText); + void call_predelete_callbacks(int pos, int nDeleted); + + int insert_(int pos, const char* text); + void remove_(int start, int end); + + void remove_rectangular_(int start, int end, int rectStart, int rectEnd, + int* replaceLen, int* endPos); + + void insert_column_(int column, int startPos, const char* insText, + int* nDeleted, int* nInserted, int* endPos); + + void overlay_rectangular_(int startPos, int rectStart, int rectEnd, + const char* insText, int* nDeleted, + int* nInserted, int* endPos); + + void redisplay_selection(Fl_Text_Selection* oldSelection, + Fl_Text_Selection* newSelection); + + void move_gap(int pos); + void reallocate_with_gap(int newGapStart, int newGapLen); + char* selection_text_(Fl_Text_Selection* sel); + void remove_selection_(Fl_Text_Selection* sel); + void replace_selection_(Fl_Text_Selection* sel, const char* text); + + void rectangular_selection_boundaries(int lineStartPos, int rectStart, + int rectEnd, int* selStart, + int* selEnd); + + void update_selections(int pos, int nDeleted, int nInserted); + + Fl_Text_Selection mPrimary; /* highlighted areas */ + Fl_Text_Selection mSecondary; + Fl_Text_Selection mHighlight; + int mLength; /* length of the text in the buffer (the length + of the buffer itself must be calculated: + gapEnd - gapStart + length) */ + char* mBuf; /* allocated memory where the text is stored */ + int mGapStart; /* points to the first character of the gap */ + int mGapEnd; /* points to the first char after the gap */ + // The hardware tab distance used by all displays for this buffer, + // and used in computing offsets for rectangular selection operations. + int mTabDist; /* equiv. number of characters in a tab */ + int mUseTabs; /* True if buffer routines are allowed to use + tabs for padding in rectangular operations */ + int mNModifyProcs; /* number of modify-redisplay procs attached */ + Fl_Text_Modify_Cb* /* procedures to call when buffer is */ + mNodifyProcs; /* modified to redisplay contents */ + void** mCbArgs; /* caller arguments for modifyProcs above */ + int mNPredeleteProcs; /* number of pre-delete procs attached */ + Fl_Text_Predelete_Cb* /* procedure to call before text is deleted */ + mPredeleteProcs; /* from the buffer; at most one is supported. */ + void **mPredeleteCbArgs; /* caller argument for pre-delete proc above */ + int mCursorPosHint; /* hint for reasonable cursor position after + a buffer modification operation */ + char mNullSubsChar; /* NEdit is based on C null-terminated strings, + so ascii-nul characters must be substituted + with something else. This is the else, but + of course, things get quite messy when you + use it */ + char mCanUndo; /* if this buffer is used for attributes, it must + not do any undo calls */ +}; + +#endif + +// +// End of "$Id: Fl_Text_Buffer.H 6010 2008-01-04 20:31:52Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Text_Display.H b/third_party/windows/fltk-1.1.10/FL/Fl_Text_Display.H new file mode 100644 index 0000000..7d33bc8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Text_Display.H @@ -0,0 +1,298 @@ +// +// "$Id: Fl_Text_Display.H 4502 2005-08-10 23:11:51Z matt $" +// +// Header file for Fl_Text_Display class. +// +// Copyright 2001-2005 by Bill Spitzak and others. +// Original code Copyright Mark Edel. Permission to distribute under +// the LGPL for the FLTK library granted by Mark Edel. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef FL_TEXT_DISPLAY_H +#define FL_TEXT_DISPLAY_H + +#include "fl_draw.H" +#include "Fl_Group.H" +#include "Fl_Widget.H" +#include "Fl_Scrollbar.H" +#include "Fl_Text_Buffer.H" + +class FL_EXPORT Fl_Text_Display: public Fl_Group { + public: + enum { + NORMAL_CURSOR, CARET_CURSOR, DIM_CURSOR, + BLOCK_CURSOR, HEAVY_CURSOR + }; + + enum { + CURSOR_POS, CHARACTER_POS + }; + + // drag types- they match Fl::event_clicks() so that single clicking to + // start a collection selects by character, double clicking selects by + // word and triple clicking selects by line. + enum { + DRAG_CHAR = 0, DRAG_WORD = 1, DRAG_LINE = 2 + }; + friend void fl_text_drag_me(int pos, Fl_Text_Display* d); + + typedef void (*Unfinished_Style_Cb)(int, void *); + + // style attributes - currently not implemented! + enum { + ATTR_NONE = 0, + ATTR_UNDERLINE = 1, + ATTR_HIDDEN = 2 + }; + + struct Style_Table_Entry { + Fl_Color color; + Fl_Font font; + int size; + unsigned attr; + }; + + Fl_Text_Display(int X, int Y, int W, int H, const char *l = 0); + ~Fl_Text_Display(); + + virtual int handle(int e); + void buffer(Fl_Text_Buffer* buf); + void buffer(Fl_Text_Buffer& buf) { buffer(&buf); } + Fl_Text_Buffer* buffer() { return mBuffer; } + void redisplay_range(int start, int end); + void scroll(int topLineNum, int horizOffset); + void insert(const char* text); + void overstrike(const char* text); + void insert_position(int newPos); + int insert_position() { return mCursorPos; } + int in_selection(int x, int y); + void show_insert_position(); + int move_right(); + int move_left(); + int move_up(); + int move_down(); + int count_lines(int start, int end, bool start_pos_is_line_start); + int line_start(int pos); + int line_end(int pos, bool start_pos_is_line_start); + int skip_lines(int startPos, int nLines, bool startPosIsLineStart); + int rewind_lines(int startPos, int nLines); + void next_word(void); + void previous_word(void); + void show_cursor(int b = 1); + void hide_cursor() { show_cursor(0); } + void cursor_style(int style); + Fl_Color cursor_color() const {return mCursor_color;} + void cursor_color(Fl_Color n) {mCursor_color = n;} + int scrollbar_width() { return scrollbar_width_; } + Fl_Align scrollbar_align() { return scrollbar_align_; } + void scrollbar_width(int W) { scrollbar_width_ = W; } + void scrollbar_align(Fl_Align a) { scrollbar_align_ = a; } + int word_start(int pos) { return buffer()->word_start(pos); } + int word_end(int pos) { return buffer()->word_end(pos); } + + + void highlight_data(Fl_Text_Buffer *styleBuffer, + const Style_Table_Entry *styleTable, + int nStyles, char unfinishedStyle, + Unfinished_Style_Cb unfinishedHighlightCB, + void *cbArg); + + int position_style(int lineStartPos, int lineLen, int lineIndex, + int dispIndex); + + Fl_Font textfont() const {return (Fl_Font)textfont_;} + void textfont(uchar s) {textfont_ = s;} + uchar textsize() const {return textsize_;} + void textsize(uchar s) {textsize_ = s;} + Fl_Color textcolor() const {return (Fl_Color)textcolor_;} + void textcolor(unsigned n) {textcolor_ = n;} + + int wrapped_column(int row, int column); + int wrapped_row(int row); + void wrap_mode(int wrap, int wrap_margin); + + virtual void resize(int X, int Y, int W, int H); + + protected: + // Most (all?) of this stuff should only be called from resize() or + // draw(). + // Anything with "vline" indicates thats it deals with currently + // visible lines. + + virtual void draw(); + void draw_text(int X, int Y, int W, int H); + void draw_range(int start, int end); + void draw_cursor(int, int); + + void draw_string(int style, int x, int y, int toX, const char *string, + int nChars); + + void draw_vline(int visLineNum, int leftClip, int rightClip, + int leftCharIndex, int rightCharIndex); + + void draw_line_numbers(bool clearAll); + + void clear_rect(int style, int x, int y, int width, int height); + void display_insert(); + + void offset_line_starts(int newTopLineNum); + + void calc_line_starts(int startLine, int endLine); + + void update_line_starts(int pos, int charsInserted, int charsDeleted, + int linesInserted, int linesDeleted, int *scrolled); + + void calc_last_char(); + + int position_to_line( int pos, int* lineNum ); + int string_width(const char* string, int length, int style); + + static void scroll_timer_cb(void*); + + static void buffer_predelete_cb(int pos, int nDeleted, void* cbArg); + static void buffer_modified_cb(int pos, int nInserted, int nDeleted, + int nRestyled, const char* deletedText, + void* cbArg); + + static void h_scrollbar_cb(Fl_Scrollbar* w, Fl_Text_Display* d); + static void v_scrollbar_cb( Fl_Scrollbar* w, Fl_Text_Display* d); + void update_v_scrollbar(); + void update_h_scrollbar(); + int measure_vline(int visLineNum); + int longest_vline(); + int empty_vlines(); + int vline_length(int visLineNum); + int xy_to_position(int x, int y, int PosType = CHARACTER_POS); + + void xy_to_rowcol(int x, int y, int* row, int* column, + int PosType = CHARACTER_POS); + + int position_to_xy(int pos, int* x, int* y); + void maintain_absolute_top_line_number(int state); + int get_absolute_top_line_number(); + void absolute_top_line_number(int oldFirstChar); + int maintaining_absolute_top_line_number(); + void reset_absolute_top_line_number(); + int position_to_linecol(int pos, int* lineNum, int* column); + void scroll_(int topLineNum, int horizOffset); + + void extend_range_for_styles(int* start, int* end); + + void find_wrap_range(const char *deletedText, int pos, int nInserted, + int nDeleted, int *modRangeStart, int *modRangeEnd, + int *linesInserted, int *linesDeleted); + void measure_deleted_lines(int pos, int nDeleted); + void wrapped_line_counter(Fl_Text_Buffer *buf, int startPos, int maxPos, + int maxLines, bool startPosIsLineStart, + int styleBufOffset, int *retPos, int *retLines, + int *retLineStart, int *retLineEnd, + bool countLastLineMissingNewLine = true); + void find_line_end(int pos, bool start_pos_is_line_start, int *lineEnd, + int *nextLineStart); + int measure_proportional_character(char c, int colNum, int pos); + int wrap_uses_character(int lineEndPos); + int range_touches_selection(Fl_Text_Selection *sel, int rangeStart, + int rangeEnd); + + int damage_range1_start, damage_range1_end; + int damage_range2_start, damage_range2_end; + int mCursorPos; + int mCursorOn; + int mCursorOldY; /* Y pos. of cursor for blanking */ + int mCursorToHint; /* Tells the buffer modified callback + where to move the cursor, to reduce + the number of redraw calls */ + int mCursorStyle; /* One of enum cursorStyles above */ + int mCursorPreferredCol; /* Column for vert. cursor movement */ + int mNVisibleLines; /* # of visible (displayed) lines */ + int mNBufferLines; /* # of newlines in the buffer */ + Fl_Text_Buffer* mBuffer; /* Contains text to be displayed */ + Fl_Text_Buffer* mStyleBuffer; /* Optional parallel buffer containing + color and font information */ + int mFirstChar, mLastChar; /* Buffer positions of first and last + displayed character (lastChar points + either to a newline or one character + beyond the end of the buffer) */ + int mContinuousWrap; /* Wrap long lines when displaying */ + int mWrapMargin; /* Margin in # of char positions for + wrapping in continuousWrap mode */ + int* mLineStarts; + int mTopLineNum; /* Line number of top displayed line + of file (first line of file is 1) */ + int mAbsTopLineNum; /* In continuous wrap mode, the line + number of the top line if the text + were not wrapped (note that this is + only maintained as needed). */ + int mNeedAbsTopLineNum; /* Externally settable flag to continue + maintaining absTopLineNum even if + it isn't needed for line # display */ + int mHorizOffset; /* Horizontal scroll pos. in pixels */ + int mTopLineNumHint; /* Line number of top displayed line + of file (first line of file is 1) */ + int mHorizOffsetHint; /* Horizontal scroll pos. in pixels */ + int mNStyles; /* Number of entries in styleTable */ + const Style_Table_Entry *mStyleTable; /* Table of fonts and colors for + coloring/syntax-highlighting */ + char mUnfinishedStyle; /* Style buffer entry which triggers + on-the-fly reparsing of region */ + Unfinished_Style_Cb mUnfinishedHighlightCB; /* Callback to parse "unfinished" */ + /* regions */ + void* mHighlightCBArg; /* Arg to unfinishedHighlightCB */ + + int mMaxsize; + + int mFixedFontWidth; /* Font width if all current fonts are + fixed and match in width, else -1 */ + int mSuppressResync; /* Suppress resynchronization of line + starts during buffer updates */ + int mNLinesDeleted; /* Number of lines deleted during + buffer modification (only used + when resynchronization is suppressed) */ + int mModifyingTabDistance; /* Whether tab distance is being + modified */ + + Fl_Color mCursor_color; + + Fl_Scrollbar* mHScrollBar; + Fl_Scrollbar* mVScrollBar; + int scrollbar_width_; + Fl_Align scrollbar_align_; + int dragPos, dragType, dragging; + int display_insert_position_hint; + struct { int x, y, w, h; } text_area; + + uchar textfont_; + uchar textsize_; + unsigned textcolor_; + + // The following are not presently used from the original NEdit code, + // but are being put here so that future versions of Fl_Text_Display + // can implement line numbers without breaking binary compatibility. + int mLineNumLeft, mLineNumWidth; + /* Line number margin and width */ +}; + +#endif + +// +// End of "$Id: Fl_Text_Display.H 4502 2005-08-10 23:11:51Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Text_Editor.H b/third_party/windows/fltk-1.1.10/FL/Fl_Text_Editor.H new file mode 100644 index 0000000..31d468f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Text_Editor.H @@ -0,0 +1,110 @@ +// +// "$Id: Fl_Text_Editor.H 4288 2005-04-16 00:13:17Z mike $" +// +// Header file for Fl_Text_Editor class. +// +// Copyright 2001-2005 by Bill Spitzak and others. +// Original code Copyright Mark Edel. Permission to distribute under +// the LGPL for the FLTK library granted by Mark Edel. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + + +#ifndef FL_TEXT_EDITOR_H +#define FL_TEXT_EDITOR_H + +#include "Fl_Text_Display.H" + +// key will match in any state +#define FL_TEXT_EDITOR_ANY_STATE (-1L) + +class FL_EXPORT Fl_Text_Editor : public Fl_Text_Display { + public: + typedef int (*Key_Func)(int key, Fl_Text_Editor* editor); + + struct Key_Binding { + int key; + int state; + Key_Func function; + Key_Binding* next; + }; + + Fl_Text_Editor(int X, int Y, int W, int H, const char* l = 0); + ~Fl_Text_Editor() { remove_all_key_bindings(); } + virtual int handle(int e); + void insert_mode(int b) { insert_mode_ = b; } + int insert_mode() { return insert_mode_; } + + void add_key_binding(int key, int state, Key_Func f, Key_Binding** list); + void add_key_binding(int key, int state, Key_Func f) + { add_key_binding(key, state, f, &key_bindings); } + void remove_key_binding(int key, int state, Key_Binding** list); + void remove_key_binding(int key, int state) + { remove_key_binding(key, state, &key_bindings); } + void remove_all_key_bindings(Key_Binding** list); + void remove_all_key_bindings() { remove_all_key_bindings(&key_bindings); } + void add_default_key_bindings(Key_Binding** list); + Key_Func bound_key_function(int key, int state, Key_Binding* list); + Key_Func bound_key_function(int key, int state) + { return bound_key_function(key, state, key_bindings); } + void default_key_function(Key_Func f) { default_key_function_ = f; } + + // functions for the built in default bindings + static int kf_default(int c, Fl_Text_Editor* e); + static int kf_ignore(int c, Fl_Text_Editor* e); + static int kf_backspace(int c, Fl_Text_Editor* e); + static int kf_enter(int c, Fl_Text_Editor* e); + static int kf_move(int c, Fl_Text_Editor* e); + static int kf_shift_move(int c, Fl_Text_Editor* e); + static int kf_ctrl_move(int c, Fl_Text_Editor* e); + static int kf_c_s_move(int c, Fl_Text_Editor* e); + static int kf_home(int, Fl_Text_Editor* e); + static int kf_end(int c, Fl_Text_Editor* e); + static int kf_left(int c, Fl_Text_Editor* e); + static int kf_up(int c, Fl_Text_Editor* e); + static int kf_right(int c, Fl_Text_Editor* e); + static int kf_down(int c, Fl_Text_Editor* e); + static int kf_page_up(int c, Fl_Text_Editor* e); + static int kf_page_down(int c, Fl_Text_Editor* e); + static int kf_insert(int c, Fl_Text_Editor* e); + static int kf_delete(int c, Fl_Text_Editor* e); + static int kf_copy(int c, Fl_Text_Editor* e); + static int kf_cut(int c, Fl_Text_Editor* e); + static int kf_paste(int c, Fl_Text_Editor* e); + static int kf_select_all(int c, Fl_Text_Editor* e); + static int kf_undo(int c, Fl_Text_Editor* e); + + protected: + int handle_key(); + void maybe_do_callback(); + + int insert_mode_; + Key_Binding* key_bindings; + static Key_Binding* global_key_bindings; + Key_Func default_key_function_; +}; + +#endif + +// +// End of "$Id: Fl_Text_Editor.H 4288 2005-04-16 00:13:17Z mike $". +// + diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Tile.H b/third_party/windows/fltk-1.1.10/FL/Fl_Tile.H new file mode 100644 index 0000000..b227907 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Tile.H @@ -0,0 +1,45 @@ +// +// "$Id: Fl_Tile.H 4288 2005-04-16 00:13:17Z mike $" +// +// Tile header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Tile_H +#define Fl_Tile_H + +#include "Fl_Group.H" + +class FL_EXPORT Fl_Tile : public Fl_Group { +public: + int handle(int); + Fl_Tile(int X,int Y,int W,int H,const char*l=0) : Fl_Group(X,Y,W,H,l) {} + void resize(int, int, int, int); + void position(int, int, int, int); +}; + +#endif + +// +// End of "$Id: Fl_Tile.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Tiled_Image.H b/third_party/windows/fltk-1.1.10/FL/Fl_Tiled_Image.H new file mode 100644 index 0000000..eb671cc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Tiled_Image.H @@ -0,0 +1,59 @@ +// +// "$Id: Fl_Tiled_Image.H 4288 2005-04-16 00:13:17Z mike $" +// +// Tiled image header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Tiled_Image_H +# define Fl_Tiled_Image_H + +# include "Fl_Image.H" + + +// Tiled image class. +class FL_EXPORT Fl_Tiled_Image : public Fl_Image { + protected: + + Fl_Image *image_; // The image that is shared + int alloc_image_; // Did we allocate this image? + + public: + + Fl_Tiled_Image(Fl_Image *i, int W = 0, int H = 0); + virtual ~Fl_Tiled_Image(); + + virtual Fl_Image *copy(int W, int H); + Fl_Image *copy() { return copy(w(), h()); } + virtual void color_average(Fl_Color c, float i); + virtual void desaturate(); + virtual void draw(int X, int Y, int W, int H, int cx, int cy); + void draw(int X, int Y) { draw(X, Y, w(), h(), 0, 0); } + Fl_Image *image() { return image_; } +}; + +#endif // !Fl_Tiled_Image_H + +// +// End of "$Id: Fl_Tiled_Image.H 4288 2005-04-16 00:13:17Z mike $" +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Timer.H b/third_party/windows/fltk-1.1.10/FL/Fl_Timer.H new file mode 100644 index 0000000..8ba564d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Timer.H @@ -0,0 +1,65 @@ +// +// "$Id: Fl_Timer.H 4288 2005-04-16 00:13:17Z mike $" +// +// Timer header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Timer_H +#define Fl_Timer_H + +#ifndef Fl_Widget_H +#include "Fl_Widget.H" +#endif + +// values for type(): +#define FL_NORMAL_TIMER 0 +#define FL_VALUE_TIMER 1 +#define FL_HIDDEN_TIMER 2 + +class FL_EXPORT Fl_Timer : public Fl_Widget { + static void stepcb(void *); + void step(); + char on, direction_; + double delay, total; + long lastsec,lastusec; +protected: + void draw(); +public: + int handle(int); + Fl_Timer(uchar t,int x,int y,int w,int h, const char *l); + ~Fl_Timer(); + void value(double); + double value() const {return delay>0.0?delay:0.0;} + char direction() const {return direction_;} + void direction(char d) {direction_ = d;} + char suspended() const {return !on;} + void suspended(char d); +}; + +#endif + +// +// End of "$Id: Fl_Timer.H 4288 2005-04-16 00:13:17Z mike $". +// + diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Toggle_Button.H b/third_party/windows/fltk-1.1.10/FL/Fl_Toggle_Button.H new file mode 100644 index 0000000..8537a73 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Toggle_Button.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_Toggle_Button.H 4288 2005-04-16 00:13:17Z mike $" +// +// Toggle button header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Toggle_Button_H +#define Fl_Toggle_Button_H + +#include "Fl_Button.H" + +class Fl_Toggle_Button : public Fl_Button { +public: + Fl_Toggle_Button(int X,int Y,int W,int H,const char *l=0) + : Fl_Button(X,Y,W,H,l) {type(FL_TOGGLE_BUTTON);} +}; + +#endif + +// +// End of "$Id: Fl_Toggle_Button.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Toggle_Light_Button.H b/third_party/windows/fltk-1.1.10/FL/Fl_Toggle_Light_Button.H new file mode 100644 index 0000000..6407edf --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Toggle_Light_Button.H @@ -0,0 +1,37 @@ +// +// "$Id: Fl_Toggle_Light_Button.H 4288 2005-04-16 00:13:17Z mike $" +// +// Toggle light button header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// provided for back-compatability only + +#ifndef Fl_Toggle_Light_Button +#include "Fl_Light_Button.H" +#define Fl_Toggle_Light_Button Fl_Light_Button +#endif + +// +// End of "$Id: Fl_Toggle_Light_Button.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Toggle_Round_Button.H b/third_party/windows/fltk-1.1.10/FL/Fl_Toggle_Round_Button.H new file mode 100644 index 0000000..ddf8b55 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Toggle_Round_Button.H @@ -0,0 +1,37 @@ +// +// "$Id: Fl_Toggle_Round_Button.H 4288 2005-04-16 00:13:17Z mike $" +// +// Toggle round button header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// provided for back-compatability only + +#ifndef Fl_Toggle_Round_Button +#include "Fl_Round_Button.H" +#define Fl_Toggle_Round_Button Fl_Round_Button +#endif + +// +// End of "$Id: Fl_Toggle_Round_Button.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Tooltip.H b/third_party/windows/fltk-1.1.10/FL/Fl_Tooltip.H new file mode 100644 index 0000000..2e6fab0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Tooltip.H @@ -0,0 +1,77 @@ +// +// "$Id: Fl_Tooltip.H 4288 2005-04-16 00:13:17Z mike $" +// +// Tooltip header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Tooltip_H +#define Fl_Tooltip_H + +#include +#include + +class FL_EXPORT Fl_Tooltip { +public: + static float delay() { return delay_; } + static void delay(float f) { delay_ = f; } + static float hoverdelay() { return hoverdelay_; } + static void hoverdelay(float f) { hoverdelay_ = f; } + static int enabled() { return enabled_; } + static void enable(int b = 1) { enabled_ = b;} + static void disable() { enabled_ = 0; } + static void (*enter)(Fl_Widget* w); + static void enter_area(Fl_Widget* w, int X, int Y, int W, int H, const char* tip); + static void (*exit)(Fl_Widget *w); + static Fl_Widget* current() {return widget_;} + static void current(Fl_Widget*); + + static int font() { return font_; } + static int size() { return size_; } + static void font(int i) { font_ = i; } + static void size(int s) { size_ = s; } + static void color(unsigned c) { color_ = c; } + static Fl_Color color() { return (Fl_Color)color_; } + static void textcolor(unsigned c) { textcolor_ = c; } + static Fl_Color textcolor() { return (Fl_Color)textcolor_; } + + // These should not be public, but Fl_Widget::tooltip() needs them... + static void enter_(Fl_Widget* w); + static void exit_(Fl_Widget *w); + +private: + static float delay_; + static float hoverdelay_; + static int enabled_; + static unsigned color_; + static unsigned textcolor_; + static int font_; + static int size_; + static Fl_Widget* widget_; +}; + +#endif + +// +// End of "$Id: Fl_Tooltip.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Valuator.H b/third_party/windows/fltk-1.1.10/FL/Fl_Valuator.H new file mode 100644 index 0000000..f3e71bb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Valuator.H @@ -0,0 +1,86 @@ +// +// "$Id: Fl_Valuator.H 4288 2005-04-16 00:13:17Z mike $" +// +// Valuator header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Valuator_H +#define Fl_Valuator_H + +#ifndef Fl_Widget_H +#include "Fl_Widget.H" +#endif + +// shared type() values for classes that work in both directions: +#define FL_VERTICAL 0 +#define FL_HORIZONTAL 1 + +class FL_EXPORT Fl_Valuator : public Fl_Widget { + + double value_; + double previous_value_; + double min, max; // truncates to this range *after* rounding + double A; int B; // rounds to multiples of A/B, or no rounding if A is zero + +protected: + + int horizontal() const {return type()&1;} + Fl_Valuator(int X, int Y, int W, int H, const char* L); + + double previous_value() const {return previous_value_;} + void handle_push() {previous_value_ = value_;} + double softclamp(double); + void handle_drag(double newvalue); + void handle_release(); // use drag() value + virtual void value_damage(); // cause damage() due to value() changing + void set_value(double v) {value_ = v;} + +public: + + void bounds(double a, double b) {min=a; max=b;} + double minimum() const {return min;} + void minimum(double a) {min = a;} + double maximum() const {return max;} + void maximum(double a) {max = a;} + void range(double a, double b) {min = a; max = b;} + void step(int a) {A = a; B = 1;} + void step(double a, int b) {A = a; B = b;} + void step(double s); + double step() const {return A/B;} + void precision(int); + + double value() const {return value_;} + int value(double); + + virtual int format(char*); + double round(double); // round to nearest multiple of step + double clamp(double); // keep in range + double increment(double, int); // add n*step to value +}; + +#endif + +// +// End of "$Id: Fl_Valuator.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Value_Input.H b/third_party/windows/fltk-1.1.10/FL/Fl_Value_Input.H new file mode 100644 index 0000000..5b5cdd6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Value_Input.H @@ -0,0 +1,65 @@ +// +// "$Id: Fl_Value_Input.H 4288 2005-04-16 00:13:17Z mike $" +// +// Value input header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Value_Input_H +#define Fl_Value_Input_H + +#include "Fl_Valuator.H" +#include "Fl_Input.H" + +class FL_EXPORT Fl_Value_Input : public Fl_Valuator { +public: + Fl_Input input; +private: + char soft_; + static void input_cb(Fl_Widget*,void*); + virtual void value_damage(); // cause damage() due to value() changing +public: + int handle(int); + void draw(); + void resize(int,int,int,int); + Fl_Value_Input(int x,int y,int w,int h,const char *l=0); + + void soft(char s) {soft_ = s;} + char soft() const {return soft_;} + + Fl_Font textfont() const {return input.textfont();} + void textfont(uchar s) {input.textfont(s);} + uchar textsize() const {return input.textsize();} + void textsize(uchar s) {input.textsize(s);} + Fl_Color textcolor() const {return input.textcolor();} + void textcolor(unsigned n) {input.textcolor(n);} + Fl_Color cursor_color() const {return input.cursor_color();} + void cursor_color(unsigned n) {input.cursor_color(n);} + +}; + +#endif + +// +// End of "$Id: Fl_Value_Input.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Value_Output.H b/third_party/windows/fltk-1.1.10/FL/Fl_Value_Output.H new file mode 100644 index 0000000..92337b1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Value_Output.H @@ -0,0 +1,58 @@ +// +// "$Id: Fl_Value_Output.H 4288 2005-04-16 00:13:17Z mike $" +// +// Value output header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Value_Output_H +#define Fl_Value_Output_H + +#ifndef Fl_Valuator_H +#include "Fl_Valuator.H" +#endif + +class FL_EXPORT Fl_Value_Output : public Fl_Valuator { + uchar textfont_, textsize_, soft_; + unsigned textcolor_; +public: + int handle(int); + void draw(); + Fl_Value_Output(int x,int y,int w,int h,const char *l=0); + + void soft(uchar s) {soft_ = s;} + uchar soft() const {return soft_;} + + Fl_Font textfont() const {return (Fl_Font)textfont_;} + void textfont(uchar s) {textfont_ = s;} + uchar textsize() const {return textsize_;} + void textsize(uchar s) {textsize_ = s;} + Fl_Color textcolor() const {return (Fl_Color)textcolor_;} + void textcolor(unsigned s) {textcolor_ = s;} +}; + +#endif + +// +// End of "$Id: Fl_Value_Output.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Value_Slider.H b/third_party/windows/fltk-1.1.10/FL/Fl_Value_Slider.H new file mode 100644 index 0000000..dca6384 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Value_Slider.H @@ -0,0 +1,52 @@ +// +// "$Id: Fl_Value_Slider.H 4288 2005-04-16 00:13:17Z mike $" +// +// Value slider header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Value_Slider_H +#define Fl_Value_Slider_H + +#include "Fl_Slider.H" + +class FL_EXPORT Fl_Value_Slider : public Fl_Slider { + uchar textfont_, textsize_; + unsigned textcolor_; +public: + void draw(); + int handle(int); + Fl_Value_Slider(int x,int y,int w,int h, const char *l = 0); + Fl_Font textfont() const {return (Fl_Font)textfont_;} + void textfont(uchar s) {textfont_ = s;} + uchar textsize() const {return textsize_;} + void textsize(uchar s) {textsize_ = s;} + Fl_Color textcolor() const {return (Fl_Color)textcolor_;} + void textcolor(unsigned s) {textcolor_ = s;} +}; + +#endif + +// +// End of "$Id: Fl_Value_Slider.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Widget.H b/third_party/windows/fltk-1.1.10/FL/Fl_Widget.H new file mode 100644 index 0000000..b0e6db4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Widget.H @@ -0,0 +1,221 @@ +// +// "$Id: Fl_Widget.H 5982 2007-11-19 16:21:48Z matt $" +// +// Widget header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Widget_H +#define Fl_Widget_H + +#include "Enumerations.H" + +class Fl_Widget; +class Fl_Window; +class Fl_Group; +class Fl_Image; + +typedef void (Fl_Callback )(Fl_Widget*, void*); +typedef Fl_Callback* Fl_Callback_p; // needed for BORLAND +typedef void (Fl_Callback0)(Fl_Widget*); +typedef void (Fl_Callback1)(Fl_Widget*, long); + +struct FL_EXPORT Fl_Label { + const char* value; + Fl_Image* image; + Fl_Image* deimage; + uchar type; + uchar font; + uchar size; + unsigned color; + void draw(int,int,int,int, Fl_Align) const ; + void measure(int&, int&) const ; +}; + +class FL_EXPORT Fl_Widget { + friend class Fl_Group; + + Fl_Group* parent_; + Fl_Callback* callback_; + void* user_data_; + short x_,y_,w_,h_; + Fl_Label label_; + int flags_; + unsigned color_; + unsigned color2_; + uchar type_; + uchar damage_; + uchar box_; + uchar align_; + uchar when_; + + const char *tooltip_; + + // unimplemented copy ctor and assignment operator + Fl_Widget(const Fl_Widget &); + Fl_Widget& operator=(const Fl_Widget &); + +protected: + + Fl_Widget(int,int,int,int,const char* =0); + + void x(int v) {x_ = (short)v;} + void y(int v) {y_ = (short)v;} + void w(int v) {w_ = (short)v;} + void h(int v) {h_ = (short)v;} + + int flags() const {return flags_;} + void set_flag(int c) {flags_ |= c;} + void clear_flag(int c) {flags_ &= ~c;} + enum {INACTIVE=1, INVISIBLE=2, OUTPUT=4, SHORTCUT_LABEL=64, + CHANGED=128, VISIBLE_FOCUS=512, COPIED_LABEL = 1024}; + + void draw_box() const; + void draw_box(Fl_Boxtype, Fl_Color) const; + void draw_box(Fl_Boxtype, int,int,int,int, Fl_Color) const; + void draw_focus() {draw_focus(box(),x(),y(),w(),h());} + void draw_focus(Fl_Boxtype, int,int,int,int) const; + void draw_label() const; + void draw_label(int, int, int, int) const; + +public: + + virtual ~Fl_Widget(); + + virtual void draw() = 0; + virtual int handle(int); + Fl_Group* parent() const {return parent_;} + void parent(Fl_Group* p) {parent_ = p;} // for hacks only, Fl_Group::add() + + uchar type() const {return type_;} + void type(uchar t) {type_ = t;} + + int x() const {return x_;} + int y() const {return y_;} + int w() const {return w_;} + int h() const {return h_;} + virtual void resize(int,int,int,int); + int damage_resize(int,int,int,int); + void position(int X,int Y) {resize(X,Y,w_,h_);} + void size(int W,int H) {resize(x_,y_,W,H);} + + Fl_Align align() const {return (Fl_Align)align_;} + void align(uchar a) {align_ = a;} + Fl_Boxtype box() const {return (Fl_Boxtype)box_;} + void box(Fl_Boxtype a) {box_ = a;} + Fl_Color color() const {return (Fl_Color)color_;} + void color(unsigned a) {color_ = a;} + Fl_Color selection_color() const {return (Fl_Color)color2_;} + void selection_color(unsigned a) {color2_ = a;} + void color(unsigned a, unsigned b) {color_=a; color2_=b;} + const char* label() const {return label_.value;} + void label(const char* a); + void copy_label(const char* a); + void label(Fl_Labeltype a,const char* b) {label_.type = a; label_.value = b;} + Fl_Labeltype labeltype() const {return (Fl_Labeltype)label_.type;} + void labeltype(Fl_Labeltype a) {label_.type = a;} + Fl_Color labelcolor() const {return (Fl_Color)label_.color;} + void labelcolor(unsigned a) {label_.color=a;} + Fl_Font labelfont() const {return (Fl_Font)label_.font;} + void labelfont(uchar a) {label_.font=a;} + uchar labelsize() const {return label_.size;} + void labelsize(uchar a) {label_.size=a;} + Fl_Image* image() {return label_.image;} + void image(Fl_Image* a) {label_.image=a;} + void image(Fl_Image& a) {label_.image=&a;} + Fl_Image* deimage() {return label_.deimage;} + void deimage(Fl_Image* a) {label_.deimage=a;} + void deimage(Fl_Image& a) {label_.deimage=&a;} + const char *tooltip() const {return tooltip_;} + void tooltip(const char *t); + Fl_Callback_p callback() const {return callback_;} + void callback(Fl_Callback* c, void* p) {callback_=c; user_data_=p;} + void callback(Fl_Callback* c) {callback_=c;} + void callback(Fl_Callback0*c) {callback_=(Fl_Callback*)c;} + void callback(Fl_Callback1*c, long p=0) {callback_=(Fl_Callback*)c; user_data_=(void*)p;} + void* user_data() const {return user_data_;} + void user_data(void* v) {user_data_ = v;} + long argument() const {return (long)user_data_;} + void argument(long v) {user_data_ = (void*)v;} + Fl_When when() const {return (Fl_When)when_;} + void when(uchar i) {when_ = i;} + + int visible() const {return !(flags_&INVISIBLE);} + int visible_r() const; + void show(); + void hide(); + void set_visible() {flags_ &= ~INVISIBLE;} + void clear_visible() {flags_ |= INVISIBLE;} + int active() const {return !(flags_&INACTIVE);} + int active_r() const; + void activate(); + void deactivate(); + int output() const {return (flags_&OUTPUT);} + void set_output() {flags_ |= OUTPUT;} + void clear_output() {flags_ &= ~OUTPUT;} + int takesevents() const {return !(flags_&(INACTIVE|INVISIBLE|OUTPUT));} + int changed() const {return flags_&CHANGED;} + void set_changed() {flags_ |= CHANGED;} + void clear_changed() {flags_ &= ~CHANGED;} + int take_focus(); + void set_visible_focus() { flags_ |= VISIBLE_FOCUS; } + void clear_visible_focus() { flags_ &= ~VISIBLE_FOCUS; } + void visible_focus(int v) { if (v) set_visible_focus(); else clear_visible_focus(); } + int visible_focus() { return flags_ & VISIBLE_FOCUS; } + + static void default_callback(Fl_Widget*, void*); + void do_callback() {callback_(this,user_data_); if (callback_ != default_callback) clear_changed();} + void do_callback(Fl_Widget* o,void* arg=0) {callback_(o,arg); if (callback_ != default_callback) clear_changed();} + void do_callback(Fl_Widget* o,long arg) {callback_(o,(void*)arg); if (callback_ != default_callback) clear_changed();} + int test_shortcut(); + static char label_shortcut(const char *t); + static int test_shortcut(const char*); + int contains(const Fl_Widget*) const ; + int inside(const Fl_Widget* o) const {return o ? o->contains(this) : 0;} + + void redraw(); + void redraw_label(); + uchar damage() const {return damage_;} + void clear_damage(uchar c = 0) {damage_ = c;} + void damage(uchar c); + void damage(uchar c,int,int,int,int); + void draw_label(int, int, int, int, Fl_Align) const; + void measure_label(int& xx, int& yy) {label_.measure(xx,yy);} + + Fl_Window* window() const ; + + // back compatability only: + Fl_Color color2() const {return (Fl_Color)color2_;} + void color2(unsigned a) {color2_ = a;} +}; + +// reserved type numbers (necessary for my cheapo RTTI) start here. +// grep the header files for "RESERVED_TYPE" to find the next available +// number. +#define FL_RESERVED_TYPE 100 + +#endif + +// +// End of "$Id: Fl_Widget.H 5982 2007-11-19 16:21:48Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Window.H b/third_party/windows/fltk-1.1.10/FL/Fl_Window.H new file mode 100644 index 0000000..ebfdd81 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Window.H @@ -0,0 +1,135 @@ +// +// "$Id: Fl_Window.H 4421 2005-07-15 09:34:53Z matt $" +// +// Window header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_Window_H +#define Fl_Window_H + +#include "Fl_Group.H" + +#define FL_WINDOW 0xF0 // all subclasses have type() >= this +#define FL_DOUBLE_WINDOW 0xF1 + +class Fl_X; + +class FL_EXPORT Fl_Window : public Fl_Group { + + friend class Fl_X; + Fl_X *i; // points at the system-specific stuff + + const char* iconlabel_; + const char* xclass_; + const void* icon_; + // size_range stuff: + short minw, minh, maxw, maxh; + uchar dw, dh, aspect, size_range_set; + // cursor stuff + Fl_Cursor cursor_default; + Fl_Color cursor_fg, cursor_bg; + void size_range_(); + // values for flags(): + enum { + FL_MODAL = 64, + FL_NOBORDER = 8, + FL_FORCE_POSITION = 16, + FL_NON_MODAL = 32, + FL_OVERRIDE = 256 + }; + void _Fl_Window(); // constructor innards + + // unimplemented copy ctor and assignment operator + Fl_Window(const Fl_Window&); + Fl_Window& operator=(const Fl_Window&); + +protected: + + static Fl_Window *current_; + virtual void draw(); + virtual void flush(); + +public: + + Fl_Window(int,int,int,int, const char* = 0); + Fl_Window(int,int, const char* = 0); + virtual ~Fl_Window(); + + virtual int handle(int); + + virtual void resize(int,int,int,int); + void border(int b); + void clear_border() {set_flag(FL_NOBORDER);} + int border() const {return !(flags() & FL_NOBORDER);} + void set_override() {set_flag(FL_NOBORDER|FL_OVERRIDE);} + int override() const { return flags()&FL_OVERRIDE; } + void set_modal() {set_flag(FL_MODAL);} + int modal() const {return flags() & FL_MODAL;} + void set_non_modal() {set_flag(FL_NON_MODAL);} + int non_modal() const {return flags() & (FL_NON_MODAL|FL_MODAL);} + + void hotspot(int x, int y, int offscreen = 0); + void hotspot(const Fl_Widget*, int offscreen = 0); + void hotspot(const Fl_Widget& p, int offscreen = 0) {hotspot(&p,offscreen);} + void free_position() {clear_flag(FL_FORCE_POSITION);} + void size_range(int a, int b, int c=0, int d=0, int e=0, int f=0, int g=0) { + minw=(short)a; minh=(short)b; maxw=(short)c; maxh=(short)d; dw=(uchar)e; dh=(uchar)f; aspect=(uchar)g; size_range_();} + + const char* label() const {return Fl_Widget::label();} + const char* iconlabel() const {return iconlabel_;} + void label(const char*); + void iconlabel(const char*); + void label(const char* label, const char* iconlabel); + void copy_label(const char* a); + const char* xclass() const {return xclass_;} + void xclass(const char* c) {xclass_ = c;} + const void* icon() const {return icon_;} + void icon(const void * ic) {icon_ = ic;} + + int shown() {return i != 0;} + virtual void show(); + virtual void hide(); + void show(int, char**); + void fullscreen(); + void fullscreen_off(int,int,int,int); + void iconize(); + + int x_root() const ; + int y_root() const ; + + static Fl_Window *current(); + void make_current(); + + // for back-compatability only: + void cursor(Fl_Cursor, Fl_Color=FL_BLACK, Fl_Color=FL_WHITE); + void default_cursor(Fl_Cursor, Fl_Color=FL_BLACK, Fl_Color=FL_WHITE); + static void default_callback(Fl_Window*, void* v); + +}; + +#endif + +// +// End of "$Id: Fl_Window.H 4421 2005-07-15 09:34:53Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_Wizard.H b/third_party/windows/fltk-1.1.10/FL/Fl_Wizard.H new file mode 100644 index 0000000..098240d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_Wizard.H @@ -0,0 +1,62 @@ +// +// "$Id: Fl_Wizard.H 4288 2005-04-16 00:13:17Z mike $" +// +// Fl_Wizard widget definitions. +// +// Copyright 1999-2005 by Easy Software Products. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// +// Include necessary header files... +// + +#ifndef _Fl_Wizard_H_ +# define _Fl_Wizard_H_ + +# include + + +// +// Fl_Wizard class... +// + +class FL_EXPORT Fl_Wizard : public Fl_Group +{ + Fl_Widget *value_; + + void draw(); + + public: + + Fl_Wizard(int, int, int, int, const char * = 0); + + void next(); + void prev(); + Fl_Widget *value(); + void value(Fl_Widget *); +}; + +#endif // !_Fl_Wizard_H_ + +// +// End of "$Id: Fl_Wizard.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_XBM_Image.H b/third_party/windows/fltk-1.1.10/FL/Fl_XBM_Image.H new file mode 100644 index 0000000..55d8f0c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_XBM_Image.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_XBM_Image.H 4288 2005-04-16 00:13:17Z mike $" +// +// XBM image header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_XBM_Image_H +#define Fl_XBM_Image_H +# include "Fl_Bitmap.H" + +class FL_EXPORT Fl_XBM_Image : public Fl_Bitmap { + + public: + + Fl_XBM_Image(const char* filename); +}; + +#endif // !Fl_XBM_Image_H + +// +// End of "$Id: Fl_XBM_Image.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Fl_XPM_Image.H b/third_party/windows/fltk-1.1.10/FL/Fl_XPM_Image.H new file mode 100644 index 0000000..0ddda9c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Fl_XPM_Image.H @@ -0,0 +1,43 @@ +// +// "$Id: Fl_XPM_Image.H 4288 2005-04-16 00:13:17Z mike $" +// +// XPM image header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef Fl_XPM_Image_H +#define Fl_XPM_Image_H +# include "Fl_Pixmap.H" + +class FL_EXPORT Fl_XPM_Image : public Fl_Pixmap { + + public: + + Fl_XPM_Image(const char* filename); +}; + +#endif // !Fl_XPM_Image + +// +// End of "$Id: Fl_XPM_Image.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/Makefile.in b/third_party/windows/fltk-1.1.10/FL/Makefile.in new file mode 100644 index 0000000..daafb94 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/Makefile.in @@ -0,0 +1,63 @@ +# +# "$Id: Makefile.in 5745 2007-03-15 13:27:41Z mike $" +# +# Header makefile for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2007 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems on the following page: +# +# http://www.fltk.org/str.php +# + +include ../makeinclude + +all: + +clean: + +depend: + +install: + echo "Installing include files in $(DESTDIR)$(includedir)..." + $(RMDIR) $(DESTDIR)$(includedir)/FL + $(INSTALL_DIR) $(DESTDIR)$(includedir)/FL + for file in *.[hrH]; do \ + $(INSTALL_DATA) $$file $(DESTDIR)$(includedir)/FL; \ + done +@HLINKS@ cd $(DESTDIR)$(includedir)/FL;\ +@HLINKS@ for file in *.H; do\ +@HLINKS@ $(RM) "`basename $$file H`h";\ +@HLINKS@ $(LN) $$file "`basename $$file H`h";\ +@HLINKS@ done +@HLINKS@ $(RM) $(DESTDIR)$(includedir)/FL/fl_file_chooser.H +@HLINKS@ $(LN) Fl_File_Chooser.H $(DESTDIR)$(includedir)/FL/fl_file_chooser.H +@HLINKS@ $(RM) $(DESTDIR)$(includedir)/FL/fl_file_chooser.h +@HLINKS@ $(LN) Fl_File_Chooser.H $(DESTDIR)$(includedir)/FL/fl_file_chooser.h +@HLINKS@ $(RM) $(DESTDIR)$(includedir)/Fl +@HLINKS@ $(LN) FL $(DESTDIR)$(includedir)/Fl + +uninstall: + echo "Uninstalling include files..." + $(RMDIR) $(DESTDIR)$(includedir)/FL +@HLINKS@ $(RM) $(DESTDIR)$(includedir)/Fl + + +# +# End of "$Id: Makefile.in 5745 2007-03-15 13:27:41Z mike $". +# diff --git a/third_party/windows/fltk-1.1.10/FL/dirent.h b/third_party/windows/fltk-1.1.10/FL/dirent.h new file mode 100644 index 0000000..b8dc67b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/dirent.h @@ -0,0 +1,33 @@ +// +// "$Id: dirent.h 4288 2005-04-16 00:13:17Z mike $" +// +// Directory header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// this file is for back-compatability only +#include "filename.H" + +// +// End of "$Id: dirent.h 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/filename.H b/third_party/windows/fltk-1.1.10/FL/filename.H new file mode 100644 index 0000000..682b676 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/filename.H @@ -0,0 +1,156 @@ +/* + * "$Id: filename.H 5635 2007-01-23 15:02:00Z mike $" + * + * Filename header file for the Fast Light Tool Kit (FLTK). + * + * Copyright 1998-2005 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems on the following page: + * + * http://www.fltk.org/str.php + */ + +#ifndef FL_FILENAME_H +# define FL_FILENAME_H + +# include "Fl_Export.H" + +# define FL_PATH_MAX 256 /* all buffers are this length */ + +FL_EXPORT const char *fl_filename_name(const char *); +FL_EXPORT const char *fl_filename_ext(const char *); +FL_EXPORT char *fl_filename_setext(char *to, int tolen, const char *ext); +FL_EXPORT int fl_filename_expand(char *to, int tolen, const char *from); +FL_EXPORT int fl_filename_absolute(char *to, int tolen, const char *from); +FL_EXPORT int fl_filename_relative(char *to, int tolen, const char *from); +FL_EXPORT int fl_filename_match(const char *name, const char *pattern); +FL_EXPORT int fl_filename_isdir(const char *name); + +# ifdef __cplusplus +/* + * Under WIN32, we include filename.H from numericsort.c; this should probably change... + */ + +inline char *fl_filename_setext(char *to, const char *ext) { return fl_filename_setext(to, FL_PATH_MAX, ext); } +inline int fl_filename_expand(char *to, const char *from) { return fl_filename_expand(to, FL_PATH_MAX, from); } +inline int fl_filename_absolute(char *to, const char *from) { return fl_filename_absolute(to, FL_PATH_MAX, from); } +inline int fl_filename_relative(char *to, const char *from) { return fl_filename_relative(to, FL_PATH_MAX, from); } +# endif /* __cplusplus */ + + +# if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) + +struct dirent {char d_name[1];}; + +# elif defined(__APPLE__) && defined(__PROJECTBUILDER__) + +/* Apple's ProjectBuilder has the nasty habit of including recursively + * down the file tree. To avoid re-including we must + * directly include the systems math file. (Plus, I could not find a + * predefined macro for ProjectBuilder builds, so we have to define it + * in the project) + */ +# include +# include "/usr/include/dirent.h" + +# elif defined(__WATCOMC__) +# include +# include + +# else +/* + * WARNING: on some systems (very few nowadays?) may not exist. + * The correct information is in one of these files: + * + * #include + * #include + * #include + * + * plus you must do the following #define: + * + * #define dirent direct + * + * It would be best to create a file that does this... + */ +# include +# include +# endif + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + +FL_EXPORT int fl_alphasort(struct dirent **, struct dirent **); +FL_EXPORT int fl_casealphasort(struct dirent **, struct dirent **); +FL_EXPORT int fl_casenumericsort(struct dirent **, struct dirent **); +FL_EXPORT int fl_numericsort(struct dirent **, struct dirent **); + +typedef int (Fl_File_Sort_F)(struct dirent **, struct dirent **); + +# ifdef __cplusplus +} + +/* + * Portable "scandir" function. Ugly but necessary... + */ + +FL_EXPORT int fl_filename_list(const char *d, struct dirent ***l, + Fl_File_Sort_F *s = fl_numericsort); + +/* + * Generic function to open a Uniform Resource Identifier (URI) using a + * system-defined program (added in FLTK 1.1.8) + */ + +FL_EXPORT int fl_open_uri(const char *uri, char *msg = (char *)0, + int msglen = 0); + +/* + * _fl_filename_isdir_quick() is a private function that checks for a + * trailing slash and assumes that the passed name is a directory if + * it finds one. This function is used by Fl_File_Browser and + * Fl_File_Chooser to avoid extra stat() calls, but is not supported + * outside of FLTK... + */ +int _fl_filename_isdir_quick(const char *name); + +# endif /* __cplusplus */ + +/* + * FLTK 1.0.x compatibility definitions... + */ + +# ifdef FLTK_1_0_COMPAT +# define filename_absolute fl_filename_absolute +# define filename_expand fl_filename_expand +# define filename_ext fl_filename_ext +# define filename_isdir fl_filename_isdir +# define filename_list fl_filename_list +# define filename_match fl_filename_match +# define filename_name fl_filename_name +# define filename_relative fl_filename_relative +# define filename_setext fl_filename_setext +# define numericsort fl_numericsort +# endif /* FLTK_1_0_COMPAT */ + + +#endif /* FL_FILENAME_H */ + +/* + * End of "$Id: filename.H 5635 2007-01-23 15:02:00Z mike $". + */ diff --git a/third_party/windows/fltk-1.1.10/FL/fl_ask.H b/third_party/windows/fltk-1.1.10/FL/fl_ask.H new file mode 100644 index 0000000..7c6b1b7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/fl_ask.H @@ -0,0 +1,81 @@ +// +// "$Id: fl_ask.H 4279 2005-04-13 19:35:28Z mike $" +// +// Standard dialog header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef fl_ask_H +# define fl_ask_H + +# include "Enumerations.H" + +class Fl_Widget; + +enum { + FL_BEEP_DEFAULT = 0, + FL_BEEP_MESSAGE, + FL_BEEP_ERROR, + FL_BEEP_QUESTION, + FL_BEEP_PASSWORD, + FL_BEEP_NOTIFICATION +}; + +# ifdef __GNUC__ +# define __fl_attr(x) __attribute__ (x) +# if __GNUC__ < 3 +# define __deprecated__ +# endif // __GNUC__ < 3 +# else +# define __fl_attr(x) +# endif // __GNUC__ + +FL_EXPORT void fl_beep(int type = FL_BEEP_DEFAULT); +FL_EXPORT void fl_message(const char *,...) __fl_attr((__format__ (__printf__, 1, 2))); +FL_EXPORT void fl_alert(const char *,...) __fl_attr((__format__ (__printf__, 1, 2))); +// fl_ask() is deprecated since it uses "Yes" and "No" for the buttons, +// which does not conform to the current FLTK Human Interface Guidelines. +// Use fl_choice() instead with the appropriate verbs instead. +FL_EXPORT int fl_ask(const char *,...) __fl_attr((__format__ (__printf__, 1, 2), __deprecated__)); +FL_EXPORT int fl_choice(const char *q,const char *b0,const char *b1,const char *b2,...) __fl_attr((__format__ (__printf__, 1, 5))); +FL_EXPORT const char *fl_input(const char *label, const char *deflt = 0, ...) __fl_attr((__format__ (__printf__, 1, 3))); +FL_EXPORT const char *fl_password(const char *label, const char *deflt = 0, ...) __fl_attr((__format__ (__printf__, 1, 3))); + +FL_EXPORT Fl_Widget *fl_message_icon(); +extern FL_EXPORT Fl_Font fl_message_font_; +extern FL_EXPORT unsigned char fl_message_size_; +inline void fl_message_font(unsigned char f,unsigned char s) { + fl_message_font_ = (Fl_Font)f; fl_message_size_ = s;} + +// pointers you can use to change FLTK to a foreign language: +extern FL_EXPORT const char* fl_no; +extern FL_EXPORT const char* fl_yes; +extern FL_EXPORT const char* fl_ok; +extern FL_EXPORT const char* fl_cancel; +extern FL_EXPORT const char* fl_close; + +#endif // !fl_ask_H + +// +// End of "$Id: fl_ask.H 4279 2005-04-13 19:35:28Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/fl_draw.H b/third_party/windows/fltk-1.1.10/FL/fl_draw.H new file mode 100644 index 0000000..7dc1f8f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/fl_draw.H @@ -0,0 +1,207 @@ +// +// "$Id: fl_draw.H 5430 2006-09-15 15:35:16Z matt $" +// +// Portable drawing function header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef fl_draw_H +#define fl_draw_H + +#include "Enumerations.H" // for the color names + +// Image class... +class Fl_Image; + +// Label flags... +FL_EXPORT extern char fl_draw_shortcut; + +// Colors: +FL_EXPORT void fl_color(Fl_Color); // select indexed color +inline void fl_color(int c) {fl_color((Fl_Color)c);} // for back compatability +FL_EXPORT void fl_color(uchar, uchar, uchar); // select actual color +extern FL_EXPORT Fl_Color fl_color_; +inline Fl_Color fl_color() {return fl_color_;} + +// clip: +FL_EXPORT void fl_push_clip(int x, int y, int w, int h); +#define fl_clip fl_push_clip +FL_EXPORT void fl_push_no_clip(); +FL_EXPORT void fl_pop_clip(); +FL_EXPORT int fl_not_clipped(int x, int y, int w, int h); +FL_EXPORT int fl_clip_box(int, int, int, int, int& x, int& y, int& w, int& h); + +// points: +FL_EXPORT void fl_point(int x, int y); + +// line type: +FL_EXPORT void fl_line_style(int style, int width=0, char* dashes=0); +enum { + FL_SOLID = 0, + FL_DASH = 1, + FL_DOT = 2, + FL_DASHDOT = 3, + FL_DASHDOTDOT = 4, + + FL_CAP_FLAT = 0x100, + FL_CAP_ROUND = 0x200, + FL_CAP_SQUARE = 0x300, + + FL_JOIN_MITER = 0x1000, + FL_JOIN_ROUND = 0x2000, + FL_JOIN_BEVEL = 0x3000 +}; + +// rectangles tweaked to exactly fill the pixel rectangle: +FL_EXPORT void fl_rect(int x, int y, int w, int h); +inline void fl_rect(int x, int y, int w, int h, Fl_Color c) {fl_color(c); fl_rect(x,y,w,h);} +FL_EXPORT void fl_rectf(int x, int y, int w, int h); +inline void fl_rectf(int x, int y, int w, int h, Fl_Color c) {fl_color(c); fl_rectf(x,y,w,h);} + +// line segments: +FL_EXPORT void fl_line(int,int, int,int); +FL_EXPORT void fl_line(int,int, int,int, int,int); + +// closed line segments: +FL_EXPORT void fl_loop(int,int, int,int, int,int); +FL_EXPORT void fl_loop(int,int, int,int, int,int, int,int); + +// filled polygons +FL_EXPORT void fl_polygon(int,int, int,int, int,int); +FL_EXPORT void fl_polygon(int,int, int,int, int,int, int,int); + +// draw rectilinear lines, horizontal segment first: +FL_EXPORT void fl_xyline(int x, int y, int x1); +FL_EXPORT void fl_xyline(int x, int y, int x1, int y2); +FL_EXPORT void fl_xyline(int x, int y, int x1, int y2, int x3); + +// draw rectilinear lines, vertical segment first: +FL_EXPORT void fl_yxline(int x, int y, int y1); +FL_EXPORT void fl_yxline(int x, int y, int y1, int x2); +FL_EXPORT void fl_yxline(int x, int y, int y1, int x2, int y3); + +// circular lines and pie slices (code in fl_arci.C): +FL_EXPORT void fl_arc(int x, int y, int w, int h, double a1, double a2); +FL_EXPORT void fl_pie(int x, int y, int w, int h, double a1, double a2); +FL_EXPORT void fl_chord(int x, int y, int w, int h, double a1, double a2); // nyi + +// scalable drawing code (code in fl_vertex.C and fl_arc.C): +FL_EXPORT void fl_push_matrix(); +FL_EXPORT void fl_pop_matrix(); +FL_EXPORT void fl_scale(double x, double y); +FL_EXPORT void fl_scale(double x); +FL_EXPORT void fl_translate(double x, double y); +FL_EXPORT void fl_rotate(double d); +FL_EXPORT void fl_mult_matrix(double a, double b, double c, double d, double x,double y); +FL_EXPORT void fl_begin_points(); +FL_EXPORT void fl_begin_line(); +FL_EXPORT void fl_begin_loop(); +FL_EXPORT void fl_begin_polygon(); +FL_EXPORT void fl_vertex(double x, double y); +FL_EXPORT void fl_curve(double, double, double, double, double, double, double, double); +FL_EXPORT void fl_arc(double x, double y, double r, double start, double a); +FL_EXPORT void fl_circle(double x, double y, double r); +FL_EXPORT void fl_end_points(); +FL_EXPORT void fl_end_line(); +FL_EXPORT void fl_end_loop(); +FL_EXPORT void fl_end_polygon(); +FL_EXPORT void fl_begin_complex_polygon(); +FL_EXPORT void fl_gap(); +FL_EXPORT void fl_end_complex_polygon(); +// get and use transformed positions: +FL_EXPORT double fl_transform_x(double x, double y); +FL_EXPORT double fl_transform_y(double x, double y); +FL_EXPORT double fl_transform_dx(double x, double y); +FL_EXPORT double fl_transform_dy(double x, double y); +FL_EXPORT void fl_transformed_vertex(double x, double y); + +// current font: +FL_EXPORT void fl_font(int face, int size); +extern FL_EXPORT int fl_font_; +inline int fl_font() {return fl_font_;} +extern FL_EXPORT int fl_size_; +inline int fl_size() {return fl_size_;} + +// information you can get about the current font: +FL_EXPORT int fl_height(); // using "size" should work ok +inline int fl_height(int, int size) {return size;} +FL_EXPORT int fl_descent(); +FL_EXPORT double fl_width(const char*); +FL_EXPORT double fl_width(const char*, int n); +FL_EXPORT double fl_width(uchar); + +// draw using current font: +FL_EXPORT void fl_draw(const char*, int x, int y); +FL_EXPORT void fl_draw(const char*, int n, int x, int y); +FL_EXPORT void fl_measure(const char*, int& x, int& y, int draw_symbols = 1); +FL_EXPORT void fl_draw(const char*, int,int,int,int, Fl_Align, Fl_Image* img=0, + int draw_symbols = 1); +FL_EXPORT void fl_draw(const char*, int,int,int,int, Fl_Align, + void (*callthis)(const char *, int n, int x, int y), + Fl_Image* img=0, int draw_symbols = 1); + +// font encoding: +FL_EXPORT const char *fl_latin1_to_local(const char *, int n=-1); +FL_EXPORT const char *fl_local_to_latin1(const char *, int n=-1); +FL_EXPORT const char *fl_mac_roman_to_local(const char *, int n=-1); +FL_EXPORT const char *fl_local_to_mac_roman(const char *, int n=-1); + +// boxtypes: +FL_EXPORT void fl_frame(const char* s, int x, int y, int w, int h); +FL_EXPORT void fl_frame2(const char* s, int x, int y, int w, int h); +FL_EXPORT void fl_draw_box(Fl_Boxtype, int x, int y, int w, int h, Fl_Color); + +// images: +FL_EXPORT void fl_draw_image(const uchar*, int,int,int,int, int delta=3, int ldelta=0); +FL_EXPORT void fl_draw_image_mono(const uchar*, int,int,int,int, int delta=1, int ld=0); +typedef void (*Fl_Draw_Image_Cb)(void*,int,int,int,uchar*); +FL_EXPORT void fl_draw_image(Fl_Draw_Image_Cb, void*, int,int,int,int, int delta=3); +FL_EXPORT void fl_draw_image_mono(Fl_Draw_Image_Cb, void*, int,int,int,int, int delta=1); +FL_EXPORT void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b); +FL_EXPORT char fl_can_do_alpha_blending(); + +FL_EXPORT uchar *fl_read_image(uchar *p, int x,int y, int w, int h, int alpha=0); + +// pixmaps: +FL_EXPORT int fl_draw_pixmap(/*const*/ char* const* data, int x,int y,Fl_Color=FL_GRAY); +FL_EXPORT int fl_measure_pixmap(/*const*/ char* const* data, int &w, int &h); +FL_EXPORT int fl_draw_pixmap(const char* const* data, int x,int y,Fl_Color=FL_GRAY); +FL_EXPORT int fl_measure_pixmap(const char* const* data, int &w, int &h); + +// other: +FL_EXPORT void fl_scroll(int X, int Y, int W, int H, int dx, int dy, + void (*draw_area)(void*, int,int,int,int), void* data); +FL_EXPORT const char* fl_shortcut_label(int); +FL_EXPORT void fl_overlay_rect(int,int,int,int); +FL_EXPORT void fl_overlay_clear(); +FL_EXPORT void fl_cursor(Fl_Cursor, Fl_Color=FL_BLACK, Fl_Color=FL_WHITE); + +// XForms symbols: +FL_EXPORT int fl_draw_symbol(const char* label,int x,int y,int w,int h, Fl_Color); +FL_EXPORT int fl_add_symbol(const char* name, void (*drawit)(Fl_Color), int scalable); + +#endif + +// +// End of "$Id: fl_draw.H 5430 2006-09-15 15:35:16Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/fl_message.H b/third_party/windows/fltk-1.1.10/FL/fl_message.H new file mode 100644 index 0000000..3cb0411 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/fl_message.H @@ -0,0 +1,32 @@ +// +// "$Id: fl_message.H 4288 2005-04-16 00:13:17Z mike $" +// +// Standard message header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "fl_ask.H" + +// +// End of "$Id: fl_message.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/fl_show_colormap.H b/third_party/windows/fltk-1.1.10/FL/fl_show_colormap.H new file mode 100644 index 0000000..2ee716a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/fl_show_colormap.H @@ -0,0 +1,37 @@ +// +// "$Id: fl_show_colormap.H 4288 2005-04-16 00:13:17Z mike $" +// +// Colormap picker header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef fl_show_colormap_H +#define fl_show_colormap_H + +FL_EXPORT Fl_Color fl_show_colormap(Fl_Color oldcol); + +#endif + +// +// End of "$Id: fl_show_colormap.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/fl_show_input.H b/third_party/windows/fltk-1.1.10/FL/fl_show_input.H new file mode 100644 index 0000000..4ae5ae9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/fl_show_input.H @@ -0,0 +1,32 @@ +// +// "$Id: fl_show_input.H 4288 2005-04-16 00:13:17Z mike $" +// +// Standard input dialog header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "fl_ask.H" + +// +// End of "$Id: fl_show_input.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/forms.H b/third_party/windows/fltk-1.1.10/FL/forms.H new file mode 100644 index 0000000..896d629 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/forms.H @@ -0,0 +1,844 @@ +// +// "$Id: forms.H 4288 2005-04-16 00:13:17Z mike $" +// +// Forms emulation header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef __FORMS_H__ +#define __FORMS_H__ + +#include "Fl.H" +#include "Fl_Group.H" +#include "Fl_Window.H" +#include "fl_draw.H" + +typedef Fl_Widget FL_OBJECT; +typedef Fl_Window FL_FORM; + +//////////////////////////////////////////////////////////////// +// Random constants & symbols defined by forms.h file: + +#ifndef NULL +#define NULL 0 +#endif +#ifndef FALSE +#define FALSE 0 +#define TRUE 1 +#endif + +#define FL_ON 1 +#define FL_OK 1 +#define FL_VALID 1 +#define FL_PREEMPT 1 +#define FL_AUTO 2 +#define FL_WHEN_NEEDED FL_AUTO +#define FL_OFF 0 +#define FL_NONE 0 +#define FL_CANCEL 0 +#define FL_INVALID 0 +#define FL_IGNORE -1 +#define FL_CLOSE -2 + +#define FL_LCOL FL_BLACK +#define FL_COL1 FL_GRAY +#define FL_MCOL FL_LIGHT1 +#define FL_LEFT_BCOL FL_LIGHT3 // 53 is better match +#define FL_TOP_BCOL FL_LIGHT2 // 51 +#define FL_BOTTOM_BCOL FL_DARK2 // 40 +#define FL_RIGHT_BCOL FL_DARK3 // 36 +#define FL_INACTIVE FL_INACTIVE_COLOR +#define FL_INACTIVE_COL FL_INACTIVE_COLOR +#define FL_FREE_COL1 FL_FREE_COLOR +#define FL_FREE_COL2 ((Fl_Color)(FL_FREE_COLOR+1)) +#define FL_FREE_COL3 ((Fl_Color)(FL_FREE_COLOR+2)) +#define FL_FREE_COL4 ((Fl_Color)(FL_FREE_COLOR+3)) +#define FL_FREE_COL5 ((Fl_Color)(FL_FREE_COLOR+4)) +#define FL_FREE_COL6 ((Fl_Color)(FL_FREE_COLOR+5)) +#define FL_FREE_COL7 ((Fl_Color)(FL_FREE_COLOR+6)) +#define FL_FREE_COL8 ((Fl_Color)(FL_FREE_COLOR+7)) +#define FL_FREE_COL9 ((Fl_Color)(FL_FREE_COLOR+8)) +#define FL_FREE_COL10 ((Fl_Color)(FL_FREE_COLOR+9)) +#define FL_FREE_COL11 ((Fl_Color)(FL_FREE_COLOR+10)) +#define FL_FREE_COL12 ((Fl_Color)(FL_FREE_COLOR+11)) +#define FL_FREE_COL13 ((Fl_Color)(FL_FREE_COLOR+12)) +#define FL_FREE_COL14 ((Fl_Color)(FL_FREE_COLOR+13)) +#define FL_FREE_COL15 ((Fl_Color)(FL_FREE_COLOR+14)) +#define FL_FREE_COL16 ((Fl_Color)(FL_FREE_COLOR+15)) +#define FL_TOMATO ((Fl_Color)(131)) +#define FL_INDIANRED ((Fl_Color)(164)) +#define FL_SLATEBLUE ((Fl_Color)(195)) +#define FL_DARKGOLD ((Fl_Color)(84)) +#define FL_PALEGREEN ((Fl_Color)(157)) +#define FL_ORCHID ((Fl_Color)(203)) +#define FL_DARKCYAN ((Fl_Color)(189)) +#define FL_DARKTOMATO ((Fl_Color)(113)) +#define FL_WHEAT ((Fl_Color)(174)) + +#define FL_ALIGN_BESIDE FL_ALIGN_INSIDE + +#define FL_PUP_TOGGLE 2 // FL_MENU_TOGGLE +#define FL_PUP_INACTIVE 1 // FL_MENU_INACTIVE +#define FL_NO_FRAME FL_NO_BOX +#define FL_ROUNDED3D_UPBOX FL_ROUND_UP_BOX +#define FL_ROUNDED3D_DOWNBOX FL_ROUND_DOWN_BOX +#define FL_OVAL3D_UPBOX FL_ROUND_UP_BOX +#define FL_OVAL3D_DOWNBOX FL_ROUND_DOWN_BOX + +#define FL_MBUTTON1 1 +#define FL_LEFTMOUSE 1 +#define FL_MBUTTON2 2 +#define FL_MIDDLEMOUSE 2 +#define FL_MBUTTON3 3 +#define FL_RIGHTMOUSE 3 +#define FL_MBUTTON4 4 +#define FL_MBUTTON5 5 + +#define FL_INVALID_STYLE 255 +#define FL_NORMAL_STYLE FL_HELVETICA +#define FL_BOLD_STYLE FL_HELVETICA_BOLD +#define FL_ITALIC_STYLE FL_HELVETICA_ITALIC +#define FL_BOLDITALIC_STYLE FL_HELVETICA_BOLD_ITALIC +#define FL_FIXED_STYLE FL_COURIER +#define FL_FIXEDBOLD_STYLE FL_COURIER_BOLD +#define FL_FIXEDITALIC_STYLE FL_COURIER_ITALIC +#define FL_FIXEDBOLDITALIC_STYLE FL_COURIER_BOLD_ITALIC +#define FL_TIMES_STYLE FL_TIMES +#define FL_TIMESBOLD_STYLE FL_TIMES_BOLD +#define FL_TIMESITALIC_STYLE FL_TIMES_ITALIC +#define FL_TIMESBOLDITALIC_STYLE FL_TIMES_BOLD_ITALIC + +// hacks to change the labeltype() when passed to fl_set_object_lstyle(): +#define FL_SHADOW_STYLE (FL_SHADOW_LABEL<<8) +#define FL_ENGRAVED_STYLE (FL_ENGRAVED_LABEL<<8) +#define FL_EMBOSSED_STYLE (FL_EMBOSSED_LABEL<<0) + +// size values are different from XForms, match older Forms: +#define FL_TINY_SIZE 8 +#define FL_SMALL_SIZE 11 // 10 +//#define FL_NORMAL_SIZE 14 // 12 +#define FL_MEDIUM_SIZE 18 // 14 +#define FL_LARGE_SIZE 24 // 18 +#define FL_HUGE_SIZE 32 // 24 +#define FL_DEFAULT_SIZE FL_SMALL_SIZE +#define FL_TINY_FONT FL_TINY_SIZE +#define FL_SMALL_FONT FL_SMALL_SIZE +#define FL_NORMAL_FONT FL_NORMAL_SIZE +#define FL_MEDIUM_FONT FL_MEDIUM_SIZE +#define FL_LARGE_FONT FL_LARGE_SIZE +#define FL_HUGE_FONT FL_HUGE_SIZE +#define FL_NORMAL_FONT1 FL_SMALL_FONT +#define FL_NORMAL_FONT2 FL_NORMAL_FONT +#define FL_DEFAULT_FONT FL_SMALL_FONT + +#define FL_RETURN_END_CHANGED FL_WHEN_RELEASE +#define FL_RETURN_CHANGED FL_WHEN_CHANGED +#define FL_RETURN_END FL_WHEN_RELEASE_ALWAYS +#define FL_RETURN_ALWAYS (FL_WHEN_CHANGED|FL_WHEN_NOT_CHANGED) + +#define FL_BOUND_WIDTH 3 + +typedef int FL_Coord; +typedef int FL_COLOR; + +//////////////////////////////////////////////////////////////// +// fltk interaction: + +#define FL_CMD_OPT void +extern FL_EXPORT void fl_initialize(int*, char*[], const char*, FL_CMD_OPT*, int); +inline void fl_finish() {} + +typedef void (*FL_IO_CALLBACK) (int, void*); +inline void fl_add_io_callback(int fd, short w, FL_IO_CALLBACK cb, void* v) { + Fl::add_fd(fd,w,cb,v);} +inline void fl_remove_io_callback(int fd, short, FL_IO_CALLBACK) { + Fl::remove_fd(fd);} // removes all the callbacks! + +// type of callback is different and no "id" number is returned: +inline void fl_add_timeout(long msec, void (*cb)(void*), void* v) { + Fl::add_timeout(msec*.001, cb, v);} +inline void fl_remove_timeout(int) {} + +// type of callback is different! +inline void fl_set_idle_callback(void (*cb)()) {Fl::set_idle(cb);} + +FL_EXPORT Fl_Widget* fl_do_forms(void); +FL_EXPORT Fl_Widget* fl_check_forms(); +inline Fl_Widget* fl_do_only_forms(void) {return fl_do_forms();} +inline Fl_Widget* fl_check_only_forms(void) {return fl_check_forms();} + +// because of new redraw behavior, these are no-ops: +inline void fl_freeze_object(Fl_Widget*) {} +inline void fl_unfreeze_object(Fl_Widget*) {} +inline void fl_freeze_form(Fl_Window*) {} +inline void fl_unfreeze_form(Fl_Window*) {} +inline void fl_freeze_all_forms() {} +inline void fl_unfreeze_all_forms() {} + +inline void fl_set_focus_object(Fl_Window*, Fl_Widget* o) {Fl::focus(o);} +inline void fl_reset_focus_object(Fl_Widget* o) {Fl::focus(o);} +#define fl_set_object_focus fl_set_focus_object + +// void fl_set_form_atclose(Fl_Window*w,int (*cb)(Fl_Window*,void*),void* v) +// void fl_set_atclose(int (*cb)(Fl_Window*,void*),void*) +// fl_set_form_atactivate/atdeactivate not implemented! + +//////////////////////////////////////////////////////////////// +// Fl_Widget: + +inline void fl_set_object_boxtype(Fl_Widget* o, Fl_Boxtype a) {o->box(a);} +inline void fl_set_object_lsize(Fl_Widget* o,int s) {o->labelsize(s);} +inline void fl_set_object_lstyle(Fl_Widget* o,int a) { + o->labelfont((uchar)a); o->labeltype((Fl_Labeltype)(a>>8));} +inline void fl_set_object_lcol(Fl_Widget* o, unsigned a) {o->labelcolor(a);} +#define fl_set_object_lcolor fl_set_object_lcol +inline void fl_set_object_lalign(Fl_Widget* o, Fl_Align a) {o->align(a);} +#define fl_set_object_align fl_set_object_lalign +inline void fl_set_object_color(Fl_Widget* o,unsigned a,unsigned b) {o->color(a,b);} +inline void fl_set_object_label(Fl_Widget* o, const char* a) {o->label(a); o->redraw();} +inline void fl_set_object_position(Fl_Widget*o,int x,int y) {o->position(x,y);} +inline void fl_set_object_size(Fl_Widget* o, int w, int h) {o->size(w,h);} +inline void fl_set_object_geometry(Fl_Widget* o,int x,int y,int w,int h) {o->resize(x,y,w,h);} + +inline void fl_get_object_geometry(Fl_Widget* o,int*x,int*y,int*w,int*h) { + *x = o->x(); *y = o->y(); *w = o->w(); *h = o->h();} +inline void fl_get_object_position(Fl_Widget* o,int*x,int*y) { + *x = o->x(); *y = o->y();} + +typedef void (*Forms_CB)(Fl_Widget*, long); +inline void fl_set_object_callback(Fl_Widget*o,Forms_CB c,long a) {o->callback(c,a);} +#define fl_set_call_back fl_set_object_callback +inline void fl_call_object_callback(Fl_Widget* o) {o->do_callback();} +inline void fl_trigger_object(Fl_Widget* o) {o->do_callback();} +inline void fl_set_object_return(Fl_Widget* o, int v) { + o->when((Fl_When)(v|FL_WHEN_RELEASE));} + +inline void fl_redraw_object(Fl_Widget* o) {o->redraw();} +inline void fl_show_object(Fl_Widget* o) {o->show();} +inline void fl_hide_object(Fl_Widget* o) {o->hide();} +inline void fl_free_object(Fl_Widget* x) {delete x;} +inline void fl_delete_object(Fl_Widget* o) {((Fl_Group*)(o->parent()))->remove(*o);} +inline void fl_activate_object(Fl_Widget* o) {o->activate();} +inline void fl_deactivate_object(Fl_Widget* o) {o->deactivate();} + +inline void fl_add_object(Fl_Window* f, Fl_Widget* x) {f->add(x);} +inline void fl_insert_object(Fl_Widget* o, Fl_Widget* b) { + ((Fl_Group*)(b->parent()))->insert(*o,b);} + +inline Fl_Window* FL_ObjWin(Fl_Widget* o) {return o->window();} + +//////////////////////////////////////////////////////////////// +// things that appered in the demos a lot that I don't emulate, but +// I did not want to edit out of all the demos... + +inline int fl_get_border_width() {return 3;} +inline void fl_set_border_width(int) {} +inline void fl_set_object_dblbuffer(Fl_Widget*, int) {} +inline void fl_set_form_dblbuffer(Fl_Window*, int) {} + +//////////////////////////////////////////////////////////////// +// Fl_Window: + +inline void fl_free_form(Fl_Window* x) {delete x;} +inline void fl_redraw_form(Fl_Window* f) {f->redraw();} + +inline Fl_Window* fl_bgn_form(Fl_Boxtype b,int w,int h) { + Fl_Window* g = new Fl_Window(w,h,0); + g->box(b); + return g; +} +FL_EXPORT void fl_end_form(); +inline void fl_addto_form(Fl_Window* f) {f->begin();} +inline Fl_Group* fl_bgn_group() {return new Fl_Group(0,0,0,0,0);} +inline void fl_end_group() {Fl_Group::current()->forms_end();} +inline void fl_addto_group(Fl_Widget* o) {((Fl_Group* )o)->begin();} +#define resizebox _ddfdesign_kludge() + +inline void fl_scale_form(Fl_Window* f, double x, double y) { + f->resizable(f); f->size(int(f->w()*x),int(f->h()*y));} +inline void fl_set_form_position(Fl_Window* f,int x,int y) {f->position(x,y);} +inline void fl_set_form_size(Fl_Window* f, int w, int h) {f->size(w,h);} +inline void fl_set_form_geometry(Fl_Window* f,int x,int y,int w,int h) { + f->resize(x,y,w,h);} +#define fl_set_initial_placement fl_set_form_geometry +inline void fl_adjust_form_size(Fl_Window*) {} + +FL_EXPORT void fl_show_form(Fl_Window* f,int p,int b,const char* n); +enum { // "p" argument values: + FL_PLACE_FREE = 0, // make resizable + FL_PLACE_MOUSE = 1, // mouse centered on form + FL_PLACE_CENTER = 2, // center of the screen + FL_PLACE_POSITION = 4,// fixed position, resizable + FL_PLACE_SIZE = 8, // fixed size, normal fltk behavior + FL_PLACE_GEOMETRY =16,// fixed size and position + FL_PLACE_ASPECT = 32, // keep aspect ratio (ignored) + FL_PLACE_FULLSCREEN=64,// fill screen + FL_PLACE_HOTSPOT = 128,// enables hotspot + FL_PLACE_ICONIC = 256,// iconic (ignored) + FL_FREE_SIZE=(1<<14), // force resizable + FL_FIX_SIZE =(1<<15) // force off resizable +}; +#define FL_PLACE_FREE_CENTER (FL_PLACE_CENTER|FL_FREE_SIZE) +#define FL_PLACE_CENTERFREE (FL_PLACE_CENTER|FL_FREE_SIZE) +enum { // "b" arguement values: + FL_NOBORDER = 0, + FL_FULLBORDER, + FL_TRANSIENT +//FL_MODAL = (1<<8) // not implemented yet in Forms +}; +inline void fl_set_form_hotspot(Fl_Window* w,int x,int y) {w->hotspot(x,y);} +inline void fl_set_form_hotobject(Fl_Window* w, Fl_Widget* o) {w->hotspot(o);} +extern FL_EXPORT char fl_flip; // in forms.C +inline void fl_flip_yorigin() {fl_flip = 1;} + +#define fl_prepare_form_window fl_show_form +inline void fl_show_form_window(Fl_Window*) {} + +inline void fl_raise_form(Fl_Window* f) {f->show();} + +inline void fl_hide_form(Fl_Window* f) {f->hide();} +inline void fl_pop_form(Fl_Window* f) {f->show();} + +extern FL_EXPORT char fl_modal_next; // in forms.C +inline void fl_activate_all_forms() {} +inline void fl_deactivate_all_forms() {fl_modal_next = 1;} +inline void fl_deactivate_form(Fl_Window*w) {w->deactivate();} +inline void fl_activate_form(Fl_Window*w) {w->activate();} + +inline void fl_set_form_title(Fl_Window* f, const char* s) {f->label(s);} +inline void fl_title_form(Fl_Window* f, const char* s) {f->label(s);} + +typedef void (*Forms_FormCB)(Fl_Widget*); +inline void fl_set_form_callback(Fl_Window* f,Forms_FormCB c) {f->callback(c);} +#define fl_set_form_call_back fl_set_form_callback + +inline void fl_init() {} +FL_EXPORT void fl_set_graphics_mode(int,int); + +inline int fl_form_is_visible(Fl_Window* f) {return f->visible();} + +inline int fl_mouse_button() {return Fl::event_button();} +#define fl_mousebutton fl_mouse_button + +#define fl_free free +#define fl_malloc malloc +#define fl_calloc calloc +#define fl_realloc realloc + +//////////////////////////////////////////////////////////////// +// Drawing functions. Only usable inside an Fl_Free object? + +inline void fl_drw_box(Fl_Boxtype b,int x,int y,int w,int h,Fl_Color bgc,int=3) { + fl_draw_box(b,x,y,w,h,bgc);} +inline void fl_drw_frame(Fl_Boxtype b,int x,int y,int w,int h,Fl_Color bgc,int=3) { + fl_draw_box(b,x,y,w,h,bgc);} + +inline void fl_drw_text(Fl_Align align, int x, int y, int w, int h, + Fl_Color fgcolor, int size, Fl_Font style, + const char* s) { + fl_font(style,size); + fl_color(fgcolor); + fl_draw(s,x,y,w,h,align); +} + +// this does not work except for CENTER... +inline void fl_drw_text_beside(Fl_Align align, int x, int y, int w, int h, + Fl_Color fgcolor, int size, Fl_Font style, + const char* s) { + fl_font(style,size); + fl_color(fgcolor); + fl_draw(s,x,y,w,h,align); +} + +inline void fl_set_font_name(Fl_Font n,const char* s) {Fl::set_font(n,s);} + +inline void fl_mapcolor(Fl_Color c, uchar r, uchar g, uchar b) {Fl::set_color(c,r,g,b);} + +#define fl_set_clipping(x,y,w,h) fl_clip(x,y,w,h) +#define fl_unset_clipping() fl_pop_clip() + +//////////////////////////////////////////////////////////////// +// Forms classes: + +inline Fl_Widget* fl_add_new(Fl_Widget* p) {return p;} +inline Fl_Widget* fl_add_new(uchar t,Fl_Widget* p) {p->type(t); return p;} + +#define forms_constructor(type,name) \ +inline type* name(uchar t,int x,int y,int w,int h,const char* l) { \ + return (type*)(fl_add_new(t, new type(x,y,w,h,l)));} +#define forms_constructort(type,name) \ +inline type* name(uchar t,int x,int y,int w,int h,const char* l) { \ + return (type*)(fl_add_new(new type(t,x,y,w,h,l)));} +#define forms_constructorb(type,name) \ +inline type* name(Fl_Boxtype t,int x,int y,int w,int h,const char* l) { \ + return (type*)(fl_add_new(new type(t,x,y,w,h,l)));} + +#include "Fl_FormsBitmap.H" +#define FL_NORMAL_BITMAP FL_NO_BOX +forms_constructorb(Fl_FormsBitmap, fl_add_bitmap) +inline void fl_set_bitmap_data(Fl_Widget* o, int w, int h, const uchar* b) { + ((Fl_FormsBitmap*)o)->set(w,h,b); +} + +#include "Fl_FormsPixmap.H" +#define FL_NORMAL_PIXMAP FL_NO_BOX +forms_constructorb(Fl_FormsPixmap, fl_add_pixmap) +inline void fl_set_pixmap_data(Fl_Widget* o, char*const* b) { + ((Fl_FormsPixmap*)o)->set(b); +} +//inline void fl_set_pixmap_file(Fl_Widget*, const char*); +inline void fl_set_pixmap_align(Fl_Widget* o,Fl_Align a,int,int) {o->align(a);} +//inline void fl_set_pixmap_colorcloseness(int, int, int); + +#include "Fl_Box.H" +forms_constructorb(Fl_Box, fl_add_box) + +#include "Fl_Browser.H" +forms_constructor(Fl_Browser, fl_add_browser) + +inline void fl_clear_browser(Fl_Widget* o) { + ((Fl_Browser*)o)->clear();} +inline void fl_add_browser_line(Fl_Widget* o, const char* s) { + ((Fl_Browser*)o)->add(s);} +inline void fl_addto_browser(Fl_Widget* o, const char* s) { + ((Fl_Browser*)o)->add(s);} /* should also scroll to bottom */ +//inline void fl_addto_browser_chars(Fl_Widget*, const char*) +//#define fl_append_browser fl_addto_browser_chars +inline void fl_insert_browser_line(Fl_Widget* o, int n, const char* s) { + ((Fl_Browser*)o)->insert(n,s);} +inline void fl_delete_browser_line(Fl_Widget* o, int n) { + ((Fl_Browser*)o)->remove(n);} +inline void fl_replace_browser_line(Fl_Widget* o, int n, const char* s) { + ((Fl_Browser*)o)->replace(n,s);} +inline char* fl_get_browser_line(Fl_Widget* o, int n) { + return (char*)(((Fl_Browser*)o)->text(n));} +inline int fl_load_browser(Fl_Widget* o, const char* f) { + return ((Fl_Browser*)o)->load(f);} +inline void fl_select_browser_line(Fl_Widget* o, int n) { + ((Fl_Browser*)o)->select(n,1);} +inline void fl_deselect_browser_line(Fl_Widget* o, int n) { + ((Fl_Browser*)o)->select(n,0);} +inline void fl_deselect_browser(Fl_Widget* o) { + ((Fl_Browser*)o)->deselect();} +inline int fl_isselected_browser_line(Fl_Widget* o, int n) { + return ((Fl_Browser*)o)->selected(n);} +inline int fl_get_browser_topline(Fl_Widget* o) { + return ((Fl_Browser*)o)->topline();} +inline int fl_get_browser(Fl_Widget* o) { + return ((Fl_Browser*)o)->value();} +inline int fl_get_browser_maxline(Fl_Widget* o) { + return ((Fl_Browser*)o)->size();} +//linline int fl_get_browser_screenlines(Fl_Widget*); +inline void fl_set_browser_topline(Fl_Widget* o, int n) { + ((Fl_Browser*)o)->topline(n);} +inline void fl_set_browser_fontsize(Fl_Widget* o, int s) { + ((Fl_Browser*)o)->textsize(s);} +inline void fl_set_browser_fontstyle(Fl_Widget* o, Fl_Font s) { + ((Fl_Browser*)o)->textfont(s);} +inline void fl_set_browser_specialkey(Fl_Widget* o, char c) { + ((Fl_Browser*)o)->format_char(c);} +//inline void fl_set_browser_vscrollbar(Fl_Widget*, int); +//inline void fl_set_browser_hscrollbar(Fl_Widget*, int); +//inline void fl_set_browser_leftslider(Fl_Widget*, int); +//#define fl_set_browser_leftscrollbar fl_set_browser_leftslider +//inline void fl_set_browser_line_selectable(Fl_Widget*, int, int); +//inline void fl_get_browser_dimension(Fl_Widget*,int*,int*,int*,int*); +//inline void fl_set_browser_dblclick_callback(Fl_Widget*,FL_CALLBACKPTR,long); +//inline void fl_set_browser_xoffset(Fl_Widget*, FL_Coord); +//inline void fl_set_browser_scrollbarsize(Fl_Widget*, int, int); +inline void fl_setdisplayed_browser_line(Fl_Widget* o, int n, int i) { + ((Fl_Browser*)o)->display(n,i);} +inline int fl_isdisplayed_browser_line(Fl_Widget* o, int n) { + return ((Fl_Browser*)o)->displayed(n);} + +#include "Fl_Button.H" + +#define FL_NORMAL_BUTTON 0 +#define FL_TOUCH_BUTTON 4 +#define FL_INOUT_BUTTON 5 +#define FL_RETURN_BUTTON 6 +#define FL_HIDDEN_RET_BUTTON 7 +#define FL_PUSH_BUTTON FL_TOGGLE_BUTTON +#define FL_MENU_BUTTON 9 + +FL_EXPORT Fl_Button* fl_add_button(uchar t,int x,int y,int w,int h,const char* l); +inline int fl_get_button(Fl_Widget* b) {return ((Fl_Button*)b)->value();} +inline void fl_set_button(Fl_Widget* b, int v) {((Fl_Button*)b)->value(v);} +inline int fl_get_button_numb(Fl_Widget*) {return Fl::event_button();} +inline void fl_set_button_shortcut(Fl_Widget* b, const char* s,int=0) { + ((Fl_Button*)b)->shortcut(s);} +//#define fl_set_object_shortcut(b,s) fl_set_button_shortcut(b,s) + +#include "Fl_Light_Button.H" +forms_constructor(Fl_Light_Button, fl_add_lightbutton) + +#include "Fl_Round_Button.H" +forms_constructor(Fl_Round_Button, fl_add_roundbutton) +forms_constructor(Fl_Round_Button, fl_add_round3dbutton) + +#include "Fl_Check_Button.H" +forms_constructor(Fl_Check_Button, fl_add_checkbutton) + +inline Fl_Widget* fl_add_bitmapbutton(int t,int x,int y,int w,int h,const char* l) {Fl_Widget* o = fl_add_button(t,x,y,w,h,l); return o;} +inline void fl_set_bitmapbutton_data(Fl_Widget* o,int a,int b,uchar* c) { + (new Fl_Bitmap(c,a,b))->label(o);} // does not delete old Fl_Bitmap! + +inline Fl_Widget* fl_add_pixmapbutton(int t,int x,int y,int w,int h,const char* l) {Fl_Widget* o = fl_add_button(t,x,y,w,h,l); return o;} +inline void fl_set_pixmapbutton_data(Fl_Widget* o, const char*const* c) { + (new Fl_Pixmap(c))->label(o);} // does not delete old Fl_Pixmap! + +// Fl_Canvas object not yet implemented! + +#include "Fl_Chart.H" + +forms_constructor(Fl_Chart, fl_add_chart) +inline void fl_clear_chart(Fl_Widget* o) { + ((Fl_Chart*)o)->clear();} +inline void fl_add_chart_value(Fl_Widget* o,double v,const char* s,uchar c){ + ((Fl_Chart*)o)->add(v,s,c);} +inline void fl_insert_chart_value(Fl_Widget* o, int i, double v, const char* s, uchar c) { + ((Fl_Chart*)o)->insert(i,v,s,c);} +inline void fl_replace_chart_value(Fl_Widget* o, int i, double v, const char* s, uchar c) { + ((Fl_Chart*)o)->replace(i,v,s,c);} +inline void fl_set_chart_bounds(Fl_Widget* o, double a, double b) { + ((Fl_Chart*)o)->bounds(a,b);} +inline void fl_set_chart_maxnumb(Fl_Widget* o, int v) { + ((Fl_Chart*)o)->maxsize(v);} +inline void fl_set_chart_autosize(Fl_Widget* o, int v) { + ((Fl_Chart*)o)->autosize(v);} +inline void fl_set_chart_lstyle(Fl_Widget* o, Fl_Font v) { + ((Fl_Chart*)o)->textfont(v);} +inline void fl_set_chart_lsize(Fl_Widget* o, int v) { + ((Fl_Chart*)o)->textsize(v);} +inline void fl_set_chart_lcolor(Fl_Widget* o, unsigned v) { + ((Fl_Chart*)o)->textcolor(v);} +#define fl_set_chart_lcol fl_set_chart_lcolor + +#include "Fl_Choice.H" + +#define FL_NORMAL_CHOICE 0 +#define FL_NORMAL_CHOICE2 0 +#define FL_DROPLIST_CHOICE 0 + +forms_constructor(Fl_Choice, fl_add_choice) +inline void fl_clear_choice(Fl_Widget* o) { + ((Fl_Choice*)o)->clear();} +inline void fl_addto_choice(Fl_Widget* o, const char* s) { + ((Fl_Choice*)o)->add(s);} +inline void fl_replace_choice(Fl_Widget* o, int i, const char* s) { + ((Fl_Choice*)o)->replace(i-1,s);} +inline void fl_delete_choice(Fl_Widget* o, int i) { + ((Fl_Choice*)o)->remove(i-1);} +inline void fl_set_choice(Fl_Widget* o, int i) { + ((Fl_Choice*)o)->value(i-1);} +// inline void fl_set_choice_text(Fl_Widget*, const char*); +inline int fl_get_choice(Fl_Widget* o) { + return ((Fl_Choice*)o)->value()+1;} +// inline const char* fl_get_choice_item_text(Fl_Widget*, int); +// inline int fl_get_choice_maxitems(Fl_Widget*); +inline const char* fl_get_choice_text(Fl_Widget* o) { + return ((Fl_Choice*)o)->text();} +inline void fl_set_choice_fontsize(Fl_Widget* o, int x) { + ((Fl_Choice*)o)->textsize(x);} +inline void fl_set_choice_fontstyle(Fl_Widget* o, Fl_Font x) { + ((Fl_Choice*)o)->textfont(x);} +// inline void fl_set_choice_item_mode(Fl_Widget*, int, unsigned); +// inline void fl_set_choice_item_shortcut(Fl_Widget*, int, const char*); + +#include "Fl_Clock.H" +forms_constructort(Fl_Clock, fl_add_clock) +inline void fl_get_clock(Fl_Widget* o, int* h, int* m, int* s) { + *h = ((Fl_Clock*)o)->hour(); + *m = ((Fl_Clock*)o)->minute(); + *s = ((Fl_Clock*)o)->second(); +} + +#include "Fl_Counter.H" +forms_constructor(Fl_Counter, fl_add_counter) +inline void fl_set_counter_value(Fl_Widget* o, double v) { + ((Fl_Counter*)o)->value(v);} +inline void fl_set_counter_bounds(Fl_Widget* o, double a, double b) { + ((Fl_Counter*)o)->bounds(a,b);} +inline void fl_set_counter_step(Fl_Widget* o, double a, double b) { + ((Fl_Counter*)o)->step(a,b);} +inline void fl_set_counter_precision(Fl_Widget* o, int v) { + ((Fl_Counter*)o)->precision(v);} +inline void fl_set_counter_return(Fl_Widget* o, int v) { + ((Fl_Counter*)o)->when((Fl_When)(v|FL_WHEN_RELEASE));} +inline double fl_get_counter_value(Fl_Widget* o) { + return ((Fl_Counter*)o)->value();} +inline void fl_get_counter_bounds(Fl_Widget* o, float* a, float* b) { + *a = float(((Fl_Counter*)o)->minimum()); + *b = float(((Fl_Counter*)o)->maximum()); +} +//inline void fl_set_counter_filter(Fl_Widget*,const char* (*)(Fl_Widget*,double,int)); + +// Cursor stuff cannot be emulated because it uses X stuff +inline void fl_set_cursor(Fl_Window* w, Fl_Cursor c) {w->cursor(c);} +#define FL_INVISIBLE_CURSOR FL_CURSOR_NONE +#define FL_DEFAULT_CURSOR FL_CURSOR_DEFAULT + +#include "Fl_Dial.H" + +#define FL_DIAL_COL1 FL_GRAY +#define FL_DIAL_COL2 37 + +forms_constructor(Fl_Dial, fl_add_dial) +inline void fl_set_dial_value(Fl_Widget* o, double v) { + ((Fl_Dial*)o)->value(v);} +inline double fl_get_dial_value(Fl_Widget* o) { + return ((Fl_Dial*)o)->value();} +inline void fl_set_dial_bounds(Fl_Widget* o, double a, double b) { + ((Fl_Dial*)o)->bounds(a, b);} +inline void fl_get_dial_bounds(Fl_Widget* o, float* a, float* b) { + *a = float(((Fl_Dial*)o)->minimum()); + *b = float(((Fl_Dial*)o)->maximum()); +} +inline void fl_set_dial_return(Fl_Widget* o, int i) { + ((Fl_Dial*)o)->when((Fl_When)(i|FL_WHEN_RELEASE));} +inline void fl_set_dial_angles(Fl_Widget* o, int a, int b) { + ((Fl_Dial*)o)->angles((short)a, (short)b);} +//inline void fl_set_dial_cross(Fl_Widget* o, int); +// inline void fl_set_dial_direction(Fl_Widget* o, uchar d) { +// ((Fl_Dial*)o)->direction(d);} +inline void fl_set_dial_step(Fl_Widget* o, double v) { + ((Fl_Dial*)o)->step(v);} + +// Frames: + +inline Fl_Widget* fl_add_frame(Fl_Boxtype i,int x,int y,int w,int h,const char* l) { + return fl_add_box(i,x-3,y-3,w+6,h+6,l);} + +// labelframe nyi +inline Fl_Widget* fl_add_labelframe(Fl_Boxtype i,int x,int y,int w,int h,const char* l) { + Fl_Widget* o = fl_add_box(i,x-3,y-3,w+6,h+6,l); + o->align(FL_ALIGN_TOP_LEFT); + return o; +} + +#include "Fl_Free.H" +inline Fl_Free* +fl_add_free(int t,double x,double y,double w,double h,const char* l, + FL_HANDLEPTR hdl) { + return (Fl_Free*)(fl_add_new( + new Fl_Free(t,int(x),int(y),int(w),int(h),l,hdl))); +} + +#include "fl_ask.H" +#include "fl_show_colormap.H" + +inline int fl_show_question(const char* c, int = 0) {return fl_choice("%s",fl_no,fl_yes,0L,c);} +FL_EXPORT void fl_show_message(const char *,const char *,const char *); +FL_EXPORT void fl_show_alert(const char *,const char *,const char *,int=0); +FL_EXPORT int fl_show_question(const char *,const char *,const char *); +inline const char *fl_show_input(const char *l,const char*d=0) {return fl_input(l,d);} +FL_EXPORT /*const*/ char *fl_show_simple_input(const char *label, const char *deflt = 0); +FL_EXPORT int fl_show_choice( + const char *m1, + const char *m2, + const char *m3, + int numb, + const char *b0, + const char *b1, + const char *b2); + +inline void fl_set_goodies_font(uchar a, uchar b) {fl_message_font(a,b);} +#define fl_show_messages fl_message +inline int fl_show_choices(const char* c,int n,const char* b1,const char* b2, + const char* b3, int) { + return fl_show_choice(0,c,0,n,b1,b2,b3); +} + +#include "filename.H" +#include "Fl_File_Chooser.H" +inline int do_matching(char* a, const char* b) {return fl_filename_match(a,b);} + +// Forms-compatable file chooser (implementation in fselect.C): +FL_EXPORT char* fl_show_file_selector(const char* message,const char* dir, + const char* pat,const char* fname); +FL_EXPORT char* fl_get_directory(); +FL_EXPORT char* fl_get_pattern(); +FL_EXPORT char* fl_get_filename(); + +#include "Fl_Input.H" +forms_constructor(Fl_Input, fl_add_input) +inline void fl_set_input(Fl_Widget* o, const char* v) { + ((Fl_Input*)o)->value(v);} +inline void fl_set_input_return(Fl_Widget* o, int x) { + ((Fl_Input*)o)->when((Fl_When)(x | FL_WHEN_RELEASE));} +inline void fl_set_input_color(Fl_Widget* o, unsigned a, unsigned b) { + ((Fl_Input*)o)->textcolor(a); + ((Fl_Input*)o)->cursor_color(b); +} +// inline void fl_set_input_scroll(Fl_Widget*, int); +inline void fl_set_input_cursorpos(Fl_Widget* o, int x, int /*y*/) { + ((Fl_Input*)o)->position(x);} +// inline void fl_set_input_selected(Fl_Widget*, int); +// inline void fl_set_input_selected_range(Fl_Widget*, int, int); +// inline void fl_set_input_maxchars(Fl_Widget*, int); +// inline void fl_set_input_format(Fl_Widget*, int, int); +// inline void fl_set_input_hscrollbar(Fl_Widget*, int); +// inline void fl_set_input_vscrollbar(Fl_Widget*, int); +// inline void fl_set_input_xoffset(Fl_Widget*, int); +// inline void fl_set_input_topline(Fl_Widget*, int); +// inline void fl_set_input_scrollbarsize(Fl_Widget*, int, int); +// inline int fl_get_input_topline(Fl_Widget*); +// inline int fl_get_input_screenlines(Fl_Widget*); +inline int fl_get_input_cursorpos(Fl_Widget* o, int*x, int*y) { + *x = ((Fl_Input*)o)->position(); *y = 0; return *x;} +// inline int fl_get_input_numberoflines(Fl_Widget*); +// inline void fl_get_input_format(Fl_Widget*, int*, int*); +inline const char* fl_get_input(Fl_Widget* o) {return ((Fl_Input*)o)->value();} + +#include "Fl_Menu_Button.H" + +// types are not implemented, they all act like FL_PUSH_MENU: +#define FL_TOUCH_MENU 0 +#define FL_PUSH_MENU 1 +#define FL_PULLDOWN_MENU 2 +forms_constructor(Fl_Menu_Button, fl_add_menu) + +inline void fl_clear_menu(Fl_Widget* o) { + ((Fl_Menu_Button*)o)->clear();} +inline void fl_set_menu(Fl_Widget* o, const char* s) { + ((Fl_Menu_Button*)o)->clear(); ((Fl_Menu_Button*)o)->add(s);} +inline void fl_addto_menu(Fl_Widget* o, const char* s) { + ((Fl_Menu_Button*)o)->add(s);} +inline void fl_replace_menu_item(Fl_Widget* o, int i, const char* s) { + ((Fl_Menu_Button*)o)->replace(i-1,s);} +inline void fl_delete_menu_item(Fl_Widget* o, int i) { + ((Fl_Menu_Button*)o)->remove(i-1);} +inline void fl_set_menu_item_shortcut(Fl_Widget* o, int i, const char* s) { + ((Fl_Menu_Button*)o)->shortcut(i-1,fl_old_shortcut(s));} +inline void fl_set_menu_item_mode(Fl_Widget* o, int i, long x) { + ((Fl_Menu_Button*)o)->mode(i-1,x);} +inline void fl_show_menu_symbol(Fl_Widget*, int ) { +/* ((Fl_Menu_Button*)o)->show_menu_symbol(i); */} +// inline void fl_set_menu_popup(Fl_Widget*, int); +inline int fl_get_menu(Fl_Widget* o) { + return ((Fl_Menu_Button*)o)->value()+1;} +inline const char* fl_get_menu_item_text(Fl_Widget* o, int i) { + return ((Fl_Menu_Button*)o)->text(i);} +inline int fl_get_menu_maxitems(Fl_Widget* o) { + return ((Fl_Menu_Button*)o)->size();} +inline int fl_get_menu_item_mode(Fl_Widget* o, int i) { + return ((Fl_Menu_Button*)o)->mode(i);} +inline const char* fl_get_menu_text(Fl_Widget* o) { + return ((Fl_Menu_Button*)o)->text();} + +#include "Fl_Positioner.H" +#define FL_NORMAL_POSITIONER 0 +forms_constructor(Fl_Positioner, fl_add_positioner) +inline void fl_set_positioner_xvalue(Fl_Widget* o, double v) { + ((Fl_Positioner*)o)->xvalue(v);} +inline double fl_get_positioner_xvalue(Fl_Widget* o) { + return ((Fl_Positioner*)o)->xvalue();} +inline void fl_set_positioner_xbounds(Fl_Widget* o, double a, double b) { + ((Fl_Positioner*)o)->xbounds(a,b);} +inline void fl_get_positioner_xbounds(Fl_Widget* o, float* a, float* b) { + *a = float(((Fl_Positioner*)o)->xminimum()); + *b = float(((Fl_Positioner*)o)->xmaximum()); +} +inline void fl_set_positioner_yvalue(Fl_Widget* o, double v) { + ((Fl_Positioner*)o)->yvalue(v);} +inline double fl_get_positioner_yvalue(Fl_Widget* o) { + return ((Fl_Positioner*)o)->yvalue();} +inline void fl_set_positioner_ybounds(Fl_Widget* o, double a, double b) { + ((Fl_Positioner*)o)->ybounds(a,b);} +inline void fl_get_positioner_ybounds(Fl_Widget* o, float* a, float* b) { + *a = float(((Fl_Positioner*)o)->yminimum()); + *b = float(((Fl_Positioner*)o)->ymaximum()); +} +inline void fl_set_positioner_xstep(Fl_Widget* o, double v) { + ((Fl_Positioner*)o)->xstep(v);} +inline void fl_set_positioner_ystep(Fl_Widget* o, double v) { + ((Fl_Positioner*)o)->ystep(v);} +inline void fl_set_positioner_return(Fl_Widget* o, int v) { + ((Fl_Positioner*)o)->when((Fl_When)(v|FL_WHEN_RELEASE));} + +#include "Fl_Slider.H" + +#define FL_HOR_BROWSER_SLIDER FL_HOR_SLIDER +#define FL_VERT_BROWSER_SLIDER FL_VERT_SLIDER + +forms_constructort(Fl_Slider, fl_add_slider) +#define FL_SLIDER_COL1 FL_GRAY +inline void fl_set_slider_value(Fl_Widget* o, double v) { + ((Fl_Slider*)o)->value(v);} +inline double fl_get_slider_value(Fl_Widget* o) { + return ((Fl_Slider*)o)->value();} +inline void fl_set_slider_bounds(Fl_Widget* o, double a, double b) { + ((Fl_Slider*)o)->bounds(a, b);} +inline void fl_get_slider_bounds(Fl_Widget* o, float* a, float* b) { + *a = float(((Fl_Slider*)o)->minimum()); + *b = float(((Fl_Slider*)o)->maximum()); +} +inline void fl_set_slider_return(Fl_Widget* o, int i) { + ((Fl_Slider*)o)->when((Fl_When)(i|FL_WHEN_RELEASE));} +inline void fl_set_slider_step(Fl_Widget* o, double v) { + ((Fl_Slider*)o)->step(v);} +// inline void fl_set_slider_increment(Fl_Widget* o, double v, double); +inline void fl_set_slider_size(Fl_Widget* o, double v) { + ((Fl_Slider*)o)->slider_size(v);} + +#include "Fl_Value_Slider.H" +forms_constructor(Fl_Value_Slider, fl_add_valslider) + +inline void fl_set_slider_precision(Fl_Widget* o, int i) { + ((Fl_Value_Slider*)o)->precision(i);} +// filter function! + +// The forms text object was the same as an Fl_Box except it inverted the +// meaning of FL_ALIGN_INSIDE. Implementation in forms.cxx +class FL_EXPORT Fl_FormsText : public Fl_Widget { +protected: + void draw(); +public: + Fl_FormsText(Fl_Boxtype b, int X, int Y, int W, int H, const char* l=0) + : Fl_Widget(X,Y,W,H,l) {box(b); align(FL_ALIGN_LEFT);} +}; +#define FL_NORMAL_TEXT FL_NO_BOX +forms_constructorb(Fl_FormsText, fl_add_text) + +#include "Fl_Timer.H" +forms_constructort(Fl_Timer, fl_add_timer) +inline void fl_set_timer(Fl_Widget* o, double v) {((Fl_Timer*)o)->value(v);} +inline double fl_get_timer(Fl_Widget* o) {return ((Fl_Timer*)o)->value();} +inline void fl_suspend_timer(Fl_Widget* o) {((Fl_Timer*)o)->suspended(1);} +inline void fl_resume_timer(Fl_Widget* o) {((Fl_Timer*)o)->suspended(0);} +inline void fl_set_timer_countup(Fl_Widget* o,char d) {((Fl_Timer*)o)->direction(d);} +void fl_gettime(long* sec, long* usec); + +// Fl_XYPlot nyi + + +// stuff from DDForms: + +inline int fl_double_click() {return Fl::event_clicks();} +inline void fl_draw() {Fl::flush();} + +#endif /* define __FORMS_H__ */ + +// +// End of "$Id: forms.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/gl.h b/third_party/windows/fltk-1.1.10/FL/gl.h new file mode 100644 index 0000000..6d10075 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/gl.h @@ -0,0 +1,87 @@ +// +// "$Id: gl.h 4288 2005-04-16 00:13:17Z mike $" +// +// OpenGL header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// You must include this instead of GL/gl.h to get the Microsoft +// APIENTRY stuff included (from ) prior to the OpenGL +// header files. +// +// This file also provides "missing" OpenGL functions, and +// gl_start() and gl_finish() to allow OpenGL to be used in any window +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef FL_gl_H +# define FL_gl_H + +# include "Enumerations.H" // for color names +# ifdef WIN32 +# include +# endif +# ifndef APIENTRY +# if defined(__CYGWIN__) +# define APIENTRY __attribute__ ((__stdcall__)) +# else +# define APIENTRY +# endif +# endif + +# ifdef __APPLE__ +# include +# else +# include +# endif + +FL_EXPORT void gl_start(); +FL_EXPORT void gl_finish(); + +FL_EXPORT void gl_color(Fl_Color); +inline void gl_color(int c) {gl_color((Fl_Color)c);} // back compatability + +FL_EXPORT void gl_rect(int x,int y,int w,int h); +inline void gl_rectf(int x,int y,int w,int h) {glRecti(x,y,x+w,y+h);} + +FL_EXPORT void gl_font(int fontid, int size); +FL_EXPORT int gl_height(); +FL_EXPORT int gl_descent(); +FL_EXPORT double gl_width(const char *); +FL_EXPORT double gl_width(const char *, int n); +FL_EXPORT double gl_width(uchar); + +FL_EXPORT void gl_draw(const char*); +FL_EXPORT void gl_draw(const char*, int n); +FL_EXPORT void gl_draw(const char*, int x, int y); +FL_EXPORT void gl_draw(const char*, float x, float y); +FL_EXPORT void gl_draw(const char*, int n, int x, int y); +FL_EXPORT void gl_draw(const char*, int n, float x, float y); +FL_EXPORT void gl_draw(const char*, int x, int y, int w, int h, Fl_Align); +FL_EXPORT void gl_measure(const char*, int& x, int& y); + +FL_EXPORT void gl_draw_image(const uchar *, int x,int y,int w,int h, int d=3, int ld=0); + +#endif // !FL_gl_H + +// +// End of "$Id: gl.h 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/gl2opengl.h b/third_party/windows/fltk-1.1.10/FL/gl2opengl.h new file mode 100644 index 0000000..98c6aec --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/gl2opengl.h @@ -0,0 +1,35 @@ +/* gl.h + + GL to OpenGL translator. + If you include this, you might be able to port old GL programs. + There are also much better emulators available on the net. + +*/ + +#include +#include "gl_draw.H" + +inline void clear() {glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);} +#define RGBcolor(r,g,b) glColor3ub(r,g,b) +#define bgnline() glBegin(GL_LINE_STRIP) +#define bgnpolygon() glBegin(GL_POLYGON) +#define bgnclosedline() glBegin(GL_LINE_LOOP) +#define endline() glEnd() +#define endpolygon() glEnd() +#define endclosedline() glEnd() +#define v2f(v) glVertex2fv(v) +#define v2s(v) glVertex2sv(v) +#define cmov(x,y,z) glRasterPos3f(x,y,z) +#define charstr(s) gl_draw(s) +#define fmprstr(s) gl_draw(s) +typedef float Matrix[4][4]; +inline void pushmatrix() {glPushMatrix();} +inline void popmatrix() {glPopMatrix();} +inline void multmatrix(Matrix m) {glMultMatrixf((float *)m);} +inline void color(int n) {glIndexi(n);} +inline void rect(int x,int y,int r,int t) {gl_rect(x,y,r-x,t-y);} +inline void rectf(int x,int y,int r,int t) {glRectf(x,y,r+1,t+1);} +inline void recti(int x,int y,int r,int t) {gl_rect(x,y,r-x,t-y);} +inline void rectfi(int x,int y,int r,int t) {glRecti(x,y,r+1,t+1);} +inline void rects(int x,int y,int r,int t) {gl_rect(x,y,r-x,t-y);} +inline void rectfs(int x,int y,int r,int t) {glRects(x,y,r+1,t+1);} diff --git a/third_party/windows/fltk-1.1.10/FL/gl_draw.H b/third_party/windows/fltk-1.1.10/FL/gl_draw.H new file mode 100644 index 0000000..e0f5f48 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/gl_draw.H @@ -0,0 +1,35 @@ +// +// "$Id: gl_draw.H 4288 2005-04-16 00:13:17Z mike $" +// +// OpenGL header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "gl.h" + +extern FL_EXPORT void gl_remove_displaylist_fonts(); + + +// +// End of "$Id: gl_draw.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/glu.h b/third_party/windows/fltk-1.1.10/FL/glu.h new file mode 100644 index 0000000..3d2c9f3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/glu.h @@ -0,0 +1,60 @@ +// +// "$Id:$" +// +// GLu header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// You must include this instead of GL/gl.h to get the Microsoft +// APIENTRY stuff included (from ) prior to the OpenGL +// header files. +// +// This file also provides "missing" OpenGL functions, and +// gl_start() and gl_finish() to allow OpenGL to be used in any window +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef FL_glu_H +# define FL_glu_H + +# include "Enumerations.H" // for color names +# ifdef WIN32 +# include +# endif +# ifndef APIENTRY +# if defined(__CYGWIN__) +# define APIENTRY __attribute__ ((__stdcall__)) +# else +# define APIENTRY +# endif +# endif + +# ifdef __APPLE__ +# include +# else +# include +# endif + +#endif // !FL_glu_H + +// +// End of "$Id: $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/glut.H b/third_party/windows/fltk-1.1.10/FL/glut.H new file mode 100644 index 0000000..0dc1331 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/glut.H @@ -0,0 +1,487 @@ +// +// "$Id: glut.H 5889 2007-06-07 17:28:43Z matt $" +// +// GLUT emulation header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Emulation of GLUT using fltk. + +// GLUT is Copyright (c) Mark J. Kilgard, 1994, 1995, 1996: +// "This program is freely distributable without licensing fees and is +// provided without guarantee or warrantee expressed or implied. This +// program is -not- in the public domain." + +// Although I have copied the GLUT API, none of my code is based on +// any GLUT implementation details and is therefore covered by the LGPL. + +// Commented out lines indicate parts of GLUT that are not emulated. + +#ifndef Fl_glut_H +# define Fl_glut_H + +# include "gl.h" + +//////////////////////////////////////////////////////////////// +// GLUT is emulated using this window class and these static variables +// (plus several more static variables hidden in glut_compatability.cxx): + +# include "Fl.H" +# include "Fl_Gl_Window.H" + +class FL_EXPORT Fl_Glut_Window : public Fl_Gl_Window { + void _init(); + int mouse_down; +protected: + void draw(); + void draw_overlay(); + int handle(int); +public: // so the inline functions work + int number; + int menu[3]; + void make_current(); + void (*display)(); + void (*overlaydisplay)(); + void (*reshape)(int w, int h); + void (*keyboard)(uchar, int x, int y); + void (*mouse)(int b, int state, int x, int y); + void (*motion)(int x, int y); + void (*passivemotion)(int x, int y); + void (*entry)(int); + void (*visibility)(int); + void (*special)(int, int x, int y); + Fl_Glut_Window(int w, int h, const char *); + Fl_Glut_Window(int x, int y, int w, int h, const char *); + ~Fl_Glut_Window(); +}; + +extern FL_EXPORT Fl_Glut_Window *glut_window; // the current window +extern FL_EXPORT int glut_menu; // the current menu + +// function pointers that are not per-window: +extern FL_EXPORT void (*glut_idle_function)(); +extern FL_EXPORT void (*glut_menustate_function)(int); +extern FL_EXPORT void (*glut_menustatus_function)(int,int,int); + +//////////////////////////////////////////////////////////////// + +//# define GLUT_API_VERSION This does not match any version of GLUT exactly... + +FL_EXPORT void glutInit(int *argcp, char **argv); // creates first window + +FL_EXPORT void glutInitDisplayMode(unsigned int mode); +// the FL_ symbols have the same value as the GLUT ones: +# define GLUT_RGB FL_RGB +# define GLUT_RGBA FL_RGB +# define GLUT_INDEX FL_INDEX +# define GLUT_SINGLE FL_SINGLE +# define GLUT_DOUBLE FL_DOUBLE +# define GLUT_ACCUM FL_ACCUM +# define GLUT_ALPHA FL_ALPHA +# define GLUT_DEPTH FL_DEPTH +# define GLUT_STENCIL FL_STENCIL +# define GLUT_MULTISAMPLE FL_MULTISAMPLE +# define GLUT_STEREO FL_STEREO +// # define GLUT_LUMINANCE 512 + +FL_EXPORT void glutInitWindowPosition(int x, int y); + +FL_EXPORT void glutInitWindowSize(int w, int h); + +FL_EXPORT void glutMainLoop(); + +FL_EXPORT int glutCreateWindow(char *title); +FL_EXPORT int glutCreateWindow(const char *title); + +FL_EXPORT int glutCreateSubWindow(int win, int x, int y, int width, int height); + +FL_EXPORT void glutDestroyWindow(int win); + +inline void glutPostRedisplay() {glut_window->redraw();} + +FL_EXPORT void glutPostWindowRedisplay(int win); + +FL_EXPORT void glutSwapBuffers(); + +inline int glutGetWindow() {return glut_window->number;} + +FL_EXPORT void glutSetWindow(int win); + +inline void glutSetWindowTitle(char *t) {glut_window->label(t);} + +inline void glutSetIconTitle(char *t) {glut_window->iconlabel(t);} + +inline void glutPositionWindow(int x, int y) {glut_window->position(x,y);} + +inline void glutReshapeWindow(int w, int h) {glut_window->size(w,h);} + +inline void glutPopWindow() {glut_window->show();} + +inline void glutPushWindow() { /* do nothing */ } + +inline void glutIconifyWindow() {glut_window->iconize();} + +inline void glutShowWindow() {glut_window->show();} + +inline void glutHideWindow() {glut_window->hide();} + +inline void glutFullScreen() {glut_window->fullscreen();} + +inline void glutSetCursor(Fl_Cursor cursor) {glut_window->cursor(cursor);} +// notice that the numeric values are different than glut: +# define GLUT_CURSOR_RIGHT_ARROW ((Fl_Cursor)2) +# define GLUT_CURSOR_LEFT_ARROW ((Fl_Cursor)67) +# define GLUT_CURSOR_INFO FL_CURSOR_HAND +# define GLUT_CURSOR_DESTROY ((Fl_Cursor)45) +# define GLUT_CURSOR_HELP FL_CURSOR_HELP +# define GLUT_CURSOR_CYCLE ((Fl_Cursor)26) +# define GLUT_CURSOR_SPRAY ((Fl_Cursor)63) +# define GLUT_CURSOR_WAIT FL_CURSOR_WAIT +# define GLUT_CURSOR_TEXT FL_CURSOR_INSERT +# define GLUT_CURSOR_CROSSHAIR FL_CURSOR_CROSS +# define GLUT_CURSOR_UP_DOWN FL_CURSOR_NS +# define GLUT_CURSOR_LEFT_RIGHT FL_CURSOR_WE +# define GLUT_CURSOR_TOP_SIDE FL_CURSOR_N +# define GLUT_CURSOR_BOTTOM_SIDE FL_CURSOR_S +# define GLUT_CURSOR_LEFT_SIDE FL_CURSOR_W +# define GLUT_CURSOR_RIGHT_SIDE FL_CURSOR_E +# define GLUT_CURSOR_TOP_LEFT_CORNER FL_CURSOR_NW +# define GLUT_CURSOR_TOP_RIGHT_CORNER FL_CURSOR_NE +# define GLUT_CURSOR_BOTTOM_RIGHT_CORNER FL_CURSOR_SE +# define GLUT_CURSOR_BOTTOM_LEFT_CORNER FL_CURSOR_SW +# define GLUT_CURSOR_INHERIT FL_CURSOR_DEFAULT +# define GLUT_CURSOR_NONE FL_CURSOR_NONE +# define GLUT_CURSOR_FULL_CROSSHAIR FL_CURSOR_CROSS + +inline void glutWarpPointer(int, int) { /* do nothing */ } + +inline void glutEstablishOverlay() {glut_window->make_overlay_current();} + +inline void glutRemoveOverlay() {glut_window->hide_overlay();} + +inline void glutUseLayer(GLenum layer) { + layer ? glut_window->make_overlay_current() : glut_window->make_current();} +enum {GLUT_NORMAL, GLUT_OVERLAY}; + +inline void glutPostOverlayRedisplay() {glut_window->redraw_overlay();} + +inline void glutShowOverlay() {glut_window->redraw_overlay();} + +inline void glutHideOverlay() {glut_window->hide_overlay();} + +FL_EXPORT int glutCreateMenu(void (*)(int)); + +FL_EXPORT void glutDestroyMenu(int menu); + +inline int glutGetMenu() {return glut_menu;} + +inline void glutSetMenu(int m) {glut_menu = m;} + +FL_EXPORT void glutAddMenuEntry(char *label, int value); + +FL_EXPORT void glutAddSubMenu(char *label, int submenu); + +FL_EXPORT void glutChangeToMenuEntry(int item, char *labela, int value); + +FL_EXPORT void glutChangeToSubMenu(int item, char *label, int submenu); + +FL_EXPORT void glutRemoveMenuItem(int item); + +inline void glutAttachMenu(int b) {glut_window->menu[b] = glut_menu;} + +inline void glutDetachMenu(int b) {glut_window->menu[b] = 0;} + +inline void glutDisplayFunc(void (*f)()) {glut_window->display = f;} + +inline void glutReshapeFunc(void (*f)(int w, int h)) {glut_window->reshape=f;} + +inline void glutKeyboardFunc(void (*f)(uchar key, int x, int y)) { + glut_window->keyboard = f;} + +inline void glutMouseFunc(void (*f)(int b, int state, int x, int y)) { + glut_window->mouse = f;} +# define GLUT_LEFT_BUTTON 0 +# define GLUT_MIDDLE_BUTTON 1 +# define GLUT_RIGHT_BUTTON 2 +# define GLUT_DOWN 0 +# define GLUT_UP 1 + +inline void glutMotionFunc(void (*f)(int x, int y)) {glut_window->motion= f;} + +inline void glutPassiveMotionFunc(void (*f)(int x, int y)) { + glut_window->passivemotion= f;} + +inline void glutEntryFunc(void (*f)(int s)) {glut_window->entry = f;} +enum {GLUT_LEFT, GLUT_ENTERED}; + +inline void glutVisibilityFunc(void (*f)(int s)) {glut_window->visibility=f;} +enum {GLUT_NOT_VISIBLE, GLUT_VISIBLE}; + +inline void glutIdleFunc(void (*f)()) {Fl::set_idle(f);} + +// Warning: this cast may not work on all machines: +inline void glutTimerFunc(unsigned int msec, void (*f)(int), int value) { + Fl::add_timeout(msec*.001, (void (*)(void *))f, (void *)value); +} + +inline void glutMenuStateFunc(void (*f)(int state)) { + glut_menustate_function = f;} + +inline void glutMenuStatusFunc(void (*f)(int status, int x, int y)) { + glut_menustatus_function = f;} +enum {GLUT_MENU_NOT_IN_USE, GLUT_MENU_IN_USE}; + +inline void glutSpecialFunc(void (*f)(int key, int x, int y)) { + glut_window->special = f;} +# define GLUT_KEY_F1 1 +# define GLUT_KEY_F2 2 +# define GLUT_KEY_F3 3 +# define GLUT_KEY_F4 4 +# define GLUT_KEY_F5 5 +# define GLUT_KEY_F6 6 +# define GLUT_KEY_F7 7 +# define GLUT_KEY_F8 8 +# define GLUT_KEY_F9 9 +# define GLUT_KEY_F10 10 +# define GLUT_KEY_F11 11 +# define GLUT_KEY_F12 12 +// WARNING: Different values than GLUT uses: +# define GLUT_KEY_LEFT FL_Left +# define GLUT_KEY_UP FL_Up +# define GLUT_KEY_RIGHT FL_Right +# define GLUT_KEY_DOWN FL_Down +# define GLUT_KEY_PAGE_UP FL_Page_Up +# define GLUT_KEY_PAGE_DOWN FL_Page_Down +# define GLUT_KEY_HOME FL_Home +# define GLUT_KEY_END FL_End +# define GLUT_KEY_INSERT FL_Insert + +//inline void glutSpaceballMotionFunc(void (*)(int x, int y, int z)); + +//inline void glutSpaceballRotateFunc(void (*)(int x, int y, int z)); + +//inline void glutSpaceballButtonFunc(void (*)(int button, int state)); + +//inline void glutButtonBoxFunc(void (*)(int button, int state)); + +//inline void glutDialsFunc(void (*)(int dial, int value)); + +//inline void glutTabletMotionFunc(void (*)(int x, int y)); + +//inline void glutTabletButtonFunc(void (*)(int button, int state, int x, int y)); + +inline void glutOverlayDisplayFunc(void (*f)()) { + glut_window->overlaydisplay = f;} + +//inline void glutWindowStatusFunc(void (*)(int state)); +//enum {GLUT_HIDDEN, GLUT_FULLY_RETAINED, GLUT_PARTIALLY_RETAINED, +// GLUT_FULLY_COVERED}; + +//inline void glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue); + +//inline GLfloat glutGetColor(int ndx, int component); +//#define GLUT_RED 0 +//#define GLUT_GREEN 1 +//#define GLUT_BLUE 2 + +//inline void glutCopyColormap(int win); + +// Warning: values are changed from GLUT! +// Also relies on the GL_ symbols having values greater than 100 +FL_EXPORT int glutGet(GLenum type); +enum { + GLUT_RETURN_ZERO = 0, + GLUT_WINDOW_X, + GLUT_WINDOW_Y, + GLUT_WINDOW_WIDTH, + GLUT_WINDOW_HEIGHT, + GLUT_WINDOW_PARENT, + GLUT_SCREEN_WIDTH, + GLUT_SCREEN_HEIGHT, + GLUT_MENU_NUM_ITEMS, + GLUT_DISPLAY_MODE_POSSIBLE, + GLUT_INIT_WINDOW_X, + GLUT_INIT_WINDOW_Y, + GLUT_INIT_WINDOW_WIDTH, + GLUT_INIT_WINDOW_HEIGHT, + GLUT_INIT_DISPLAY_MODE, + GLUT_WINDOW_BUFFER_SIZE, + GLUT_VERSION +//GLUT_WINDOW_NUM_CHILDREN, +//GLUT_WINDOW_CURSOR, +//GLUT_SCREEN_WIDTH_MM, +//GLUT_SCREEN_HEIGHT_MM, +//GLUT_ELAPSED_TIME, +}; + +# define GLUT_WINDOW_STENCIL_SIZE GL_STENCIL_BITS +# define GLUT_WINDOW_DEPTH_SIZE GL_DEPTH_BITS +# define GLUT_WINDOW_RED_SIZE GL_RED_BITS +# define GLUT_WINDOW_GREEN_SIZE GL_GREEN_BITS +# define GLUT_WINDOW_BLUE_SIZE GL_BLUE_BITS +# define GLUT_WINDOW_ALPHA_SIZE GL_ALPHA_BITS +# define GLUT_WINDOW_ACCUM_RED_SIZE GL_ACCUM_RED_BITS +# define GLUT_WINDOW_ACCUM_GREEN_SIZE GL_ACCUM_GREEN_BITS +# define GLUT_WINDOW_ACCUM_BLUE_SIZE GL_ACCUM_BLUE_BITS +# define GLUT_WINDOW_ACCUM_ALPHA_SIZE GL_ACCUM_ALPHA_BITS +# define GLUT_WINDOW_DOUBLEBUFFER GL_DOUBLEBUFFER +# define GLUT_WINDOW_RGBA GL_RGBA +# define GLUT_WINDOW_COLORMAP_SIZE GL_INDEX_BITS +# ifdef GL_SAMPLES_SGIS +# define GLUT_WINDOW_NUM_SAMPLES GL_SAMPLES_SGIS +# else +# define GLUT_WINDOW_NUM_SAMPLES GLUT_RETURN_ZERO +# endif +# define GLUT_WINDOW_STEREO GL_STEREO + +# define GLUT_HAS_KEYBOARD 600 +# define GLUT_HAS_MOUSE 601 +# define GLUT_HAS_SPACEBALL 602 +# define GLUT_HAS_DIAL_AND_BUTTON_BOX 603 +# define GLUT_HAS_TABLET 604 +# define GLUT_NUM_MOUSE_BUTTONS 605 +# define GLUT_NUM_SPACEBALL_BUTTONS 606 +# define GLUT_NUM_BUTTON_BOX_BUTTONS 607 +# define GLUT_NUM_DIALS 608 +# define GLUT_NUM_TABLET_BUTTONS 609 +FL_EXPORT int glutDeviceGet(GLenum type); + +// WARNING: these values are different than GLUT uses: +# define GLUT_ACTIVE_SHIFT FL_SHIFT +# define GLUT_ACTIVE_CTRL FL_CTRL +# define GLUT_ACTIVE_ALT FL_ALT +inline int glutGetModifiers() {return Fl::event_state() & (GLUT_ACTIVE_SHIFT | GLUT_ACTIVE_CTRL | GLUT_ACTIVE_ALT);} + +FL_EXPORT int glutLayerGet(GLenum); +# define GLUT_OVERLAY_POSSIBLE 800 +//#define GLUT_LAYER_IN_USE 801 +//#define GLUT_HAS_OVERLAY 802 +# define GLUT_TRANSPARENT_INDEX 803 +# define GLUT_NORMAL_DAMAGED 804 +# define GLUT_OVERLAY_DAMAGED 805 + +extern "C" { +typedef void (*GLUTproc)(); +} + +FL_EXPORT GLUTproc glutGetProcAddress(const char *procName); + +//inline int glutVideoResizeGet(GLenum param); +//#define GLUT_VIDEO_RESIZE_POSSIBLE 900 +//#define GLUT_VIDEO_RESIZE_IN_USE 901 +//#define GLUT_VIDEO_RESIZE_X_DELTA 902 +//#define GLUT_VIDEO_RESIZE_Y_DELTA 903 +//#define GLUT_VIDEO_RESIZE_WIDTH_DELTA 904 +//#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA 905 +//#define GLUT_VIDEO_RESIZE_X 906 +//#define GLUT_VIDEO_RESIZE_Y 907 +//#define GLUT_VIDEO_RESIZE_WIDTH 908 +//#define GLUT_VIDEO_RESIZE_HEIGHT 909 + +//inline void glutSetupVideoResizing(); + +//inline void glutStopVideoResizing(); + +//inline void glutVideoResize(int x, int y, int width, int height); + +//inline void glutVideoPan(int x, int y, int width, int height); + +// Font argument must be a void* for compatability, so... +extern FL_EXPORT struct Fl_Glut_Bitmap_Font {uchar font; int size;} + glutBitmap9By15, glutBitmap8By13, glutBitmapTimesRoman10, + glutBitmapTimesRoman24, glutBitmapHelvetica10, glutBitmapHelvetica12, + glutBitmapHelvetica18; +# define GLUT_BITMAP_9_BY_15 (&glutBitmap9By15) +# define GLUT_BITMAP_8_BY_13 (&glutBitmap8By13) +# define GLUT_BITMAP_TIMES_ROMAN_10 (&glutBitmapTimesRoman10) +# define GLUT_BITMAP_TIMES_ROMAN_24 (&glutBitmapTimesRoman24) +# define GLUT_BITMAP_HELVETICA_10 (&glutBitmapHelvetica10) +# define GLUT_BITMAP_HELVETICA_12 (&glutBitmapHelvetica12) +# define GLUT_BITMAP_HELVETICA_18 (&glutBitmapHelvetica18) + +FL_EXPORT void glutBitmapCharacter(void *font, int character); +FL_EXPORT int glutBitmapHeight(void *font); +FL_EXPORT int glutBitmapLength(void *font, const unsigned char *string); +FL_EXPORT void glutBitmapString(void *font, const unsigned char *string); +FL_EXPORT int glutBitmapWidth(void *font, int character); + +FL_EXPORT int glutExtensionSupported(char *name); + +/* GLUT stroked font sub-API */ +struct Fl_Glut_StrokeVertex { + GLfloat X, Y; +}; + +struct Fl_Glut_StrokeStrip { + int Number; + const Fl_Glut_StrokeVertex* Vertices; +}; + +struct Fl_Glut_StrokeChar { + GLfloat Right; + int Number; + const Fl_Glut_StrokeStrip* Strips; +}; + +struct Fl_Glut_StrokeFont { + char* Name; // The source font name + int Quantity; // Number of chars in font + GLfloat Height; // Height of the characters + const Fl_Glut_StrokeChar** Characters;// The characters mapping +}; +extern FL_EXPORT Fl_Glut_StrokeFont glutStrokeRoman; +extern FL_EXPORT Fl_Glut_StrokeFont glutStrokeMonoRoman; +# define GLUT_STROKE_ROMAN (&glutStrokeRoman) +# define GLUT_STROKE_MONO_ROMAN (&glutStrokeMonoRoman) + +FL_EXPORT void glutStrokeCharacter(void *font, int character); +FL_EXPORT GLfloat glutStrokeHeight(void *font); +FL_EXPORT int glutStrokeLength(void *font, const unsigned char *string); +FL_EXPORT void glutStrokeString(void *font, const unsigned char *string); +FL_EXPORT int glutStrokeWidth(void *font, int character); + +/* GLUT pre-built models sub-API */ +FL_EXPORT void glutWireSphere(GLdouble radius, GLint slices, GLint stacks); +FL_EXPORT void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); +FL_EXPORT void glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks); +FL_EXPORT void glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks); +FL_EXPORT void glutWireCube(GLdouble size); +FL_EXPORT void glutSolidCube(GLdouble size); +FL_EXPORT void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings); +FL_EXPORT void glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings); +FL_EXPORT void glutWireDodecahedron(); +FL_EXPORT void glutSolidDodecahedron(); +FL_EXPORT void glutWireTeapot(GLdouble size); +FL_EXPORT void glutSolidTeapot(GLdouble size); +FL_EXPORT void glutWireOctahedron(); +FL_EXPORT void glutSolidOctahedron(); +FL_EXPORT void glutWireTetrahedron(); +FL_EXPORT void glutSolidTetrahedron(); +FL_EXPORT void glutWireIcosahedron(); +FL_EXPORT void glutSolidIcosahedron(); + +#endif // !Fl_glut_H + +// +// End of "$Id: glut.H 5889 2007-06-07 17:28:43Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/mac.H b/third_party/windows/fltk-1.1.10/FL/mac.H new file mode 100644 index 0000000..fe37c42 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/mac.H @@ -0,0 +1,136 @@ +// +// "$Id: mac.H 5379 2006-08-29 11:03:05Z matt $" +// +// Mac header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Do not directly include this file, instead use . It will +// include this file if "__APPLE__" is defined. This is to encourage +// portability of even the system-specific code... + +#ifndef Fl_X_H +# error "Never use directly; include instead." +#endif // !Fl_X_H + +// Standard MacOS Carbon API includes... +#include + +// Now make some fixes to the headers... +#undef check // Dunno where this comes from... + +// Some random X equivalents +typedef WindowPtr Window; +struct XPoint { int x, y; }; +struct XRectangle {int x, y, width, height;}; +typedef RgnHandle Fl_Region; +void fl_clip_region(Fl_Region); +inline Fl_Region XRectangleRegion(int x, int y, int w, int h) { + Fl_Region R = NewRgn(); + SetRectRgn(R, x, y, x+w, y+h); + return R; +} +inline void XDestroyRegion(Fl_Region r) { + DisposeRgn(r); +} + +# include "Fl_Window.H" + +// This object contains all mac-specific stuff about a window: +// WARNING: this object is highly subject to change! +class Fl_X +{ +public: + Window xid; // Mac WindowPtr + GWorldPtr other_xid; // pointer for offscreen bitmaps (doublebuffer) + Fl_Window *w; // FLTK window for + Fl_Region region; + Fl_Region subRegion; // region for this specific subwindow + Fl_X *next; // linked tree to support subwindows + Fl_X *xidChildren, *xidNext; // more subwindow tree + int wait_for_expose; + CursHandle cursor; + static Fl_X* first; + static Fl_X* i(const Fl_Window* w) {return w->i;} + static int fake_X_wm(const Fl_Window*,int&,int&,int&,int&,int&); + static void make(Fl_Window*); + void flush(); + // Quartz additions: + CGContextRef gc; // graphics context (NULL when using QD) + static ATSUTextLayout atsu_layout; // windows share a global font + static ATSUStyle atsu_style; + static void q_fill_context(); // fill a Quartz context with current FLTK state + static void q_clear_clipping(); // remove all clipping from a Quartz context + static void q_release_context(Fl_X *x=0); // free all resources associated with fl_gc + static void q_begin_image(CGRect&, int x, int y, int w, int h); + static void q_end_image(); +}; + +extern void MacDestroyWindow(Fl_Window*,WindowPtr); +extern void MacMapWindow(Fl_Window*,WindowPtr); +extern void MacUnmapWindow(Fl_Window*,WindowPtr); +extern int MacUnlinkWindow(Fl_X*,Fl_X*start=0L); + +inline Window fl_xid(const Fl_Window*w) +{ + return Fl_X::i(w)->xid; +} + +extern CursHandle fl_default_cursor; + +extern struct Fl_XMap { + RGBColor rgb; + ulong pen; +} *fl_current_xmap; + +extern FL_EXPORT void *fl_display; +extern FL_EXPORT Window fl_window; +extern FL_EXPORT CGContextRef fl_gc; +extern FL_EXPORT Handle fl_system_menu; +extern FL_EXPORT class Fl_Sys_Menu_Bar *fl_sys_menu_bar; + +typedef GWorldPtr Fl_Offscreen; + +extern Fl_Offscreen fl_create_offscreen(int w, int h); +extern void fl_copy_offscreen(int x,int y,int w,int h, Fl_Offscreen gWorld, int srcx,int srcy); +extern void fl_delete_offscreen(Fl_Offscreen gWorld); +extern void fl_begin_offscreen(Fl_Offscreen gWorld); +extern void fl_end_offscreen(); + +typedef GWorldPtr Fl_Bitmask; // Carbon requires a 1-bit GWorld instead of a BitMap + +extern FL_EXPORT Fl_Bitmask fl_create_bitmask(int w, int h, const uchar *data); +extern FL_EXPORT Fl_Bitmask fl_create_alphamask(int w, int h, int d, int ld, const uchar *data); +extern FL_EXPORT void fl_delete_bitmask(Fl_Bitmask bm); + +extern void fl_open_display(); + +// Register a function for opening files via the finder... +extern void fl_open_callback(void (*cb)(const char *)); + +extern FL_EXPORT int fl_parse_color(const char* p, uchar& r, uchar& g, uchar& b); + +// +// End of "$Id: mac.H 5379 2006-08-29 11:03:05Z matt $". +// + diff --git a/third_party/windows/fltk-1.1.10/FL/mac.r b/third_party/windows/fltk-1.1.10/FL/mac.r new file mode 100644 index 0000000..cbd53a7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/mac.r @@ -0,0 +1,13 @@ +data 'MBAR' (128) { + $"0001 0080" /* ...€ */ +}; + +data 'MENU' (128, "Apple") { + $"0080 0000 0000 0000 0000 FFFF FFFB 0114" /* .€........ÿÿÿû.. */ + $"0A41 626F 7574 2046 4C54 4B00 0000 0001" /* ÂAbout FLTK..... */ + $"2D00 0000 0000" /* -..... */ +}; + +data 'carb' (0) { +}; + diff --git a/third_party/windows/fltk-1.1.10/FL/math.h b/third_party/windows/fltk-1.1.10/FL/math.h new file mode 100644 index 0000000..677d6ac --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/math.h @@ -0,0 +1,72 @@ +// +// "$Id: math.h 4288 2005-04-16 00:13:17Z mike $" +// +// Math header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef fl_math_h +# define fl_math_h + +// Apple's ProjectBuilder has the nasty habit of including recursively +// down the file tree. To avoid re-including we must +// directly include the systems math file. (Plus, I could not find a +// predefined macro for ProjectBuilder builds, so we have to define it +// in the project) +# if defined(__APPLE__) && defined(__PROJECTBUILDER__) +# include "/usr/include/math.h" +# else +# include +# endif + +# ifdef __EMX__ +# include +# endif + + +# ifndef M_PI +# define M_PI 3.14159265358979323846 +# define M_PI_2 1.57079632679489661923 +# define M_PI_4 0.78539816339744830962 +# define M_1_PI 0.31830988618379067154 +# define M_2_PI 0.63661977236758134308 +# endif // !M_PI + +# ifndef M_SQRT2 +# define M_SQRT2 1.41421356237309504880 +# define M_SQRT1_2 0.70710678118654752440 +# endif // !M_SQRT2 + +# if (defined(WIN32) || defined(CRAY)) && !defined(__MINGW32__) && !defined(__MWERKS__) + +inline double rint(double v) {return floor(v+.5);} +inline double copysign(double a, double b) {return b<0 ? -a : a;} + +# endif // (WIN32 || CRAY) && !__MINGW32__ && !__MWERKS__ + +#endif // !fl_math_h + + +// +// End of "$Id: math.h 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/names.h b/third_party/windows/fltk-1.1.10/FL/names.h new file mode 100644 index 0000000..767f2bc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/names.h @@ -0,0 +1,85 @@ +// +// "$Id:$" +// +// Event names header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Thanks to Greg Ercolano for this addition. + +#ifndef FL_NAMES_H +#define FL_NAMES_H + +char *fl_eventnames[] = +{ + "FL_NO_EVENT", + "FL_PUSH", + "FL_RELEASE", + "FL_ENTER", + "FL_LEAVE", + "FL_DRAG", + "FL_FOCUS", + "FL_UNFOCUS", + "FL_KEYDOWN", + "FL_KEYUP", + "FL_CLOSE", + "FL_MOVE", + "FL_SHORTCUT", + "FL_DEACTIVATE", + "FL_ACTIVATE", + "FL_HIDE", + "FL_SHOW", + "FL_PASTE", + "FL_SELECTIONCLEAR", + "FL_MOUSEWHEEL", + "FL_DND_ENTER", + "FL_DND_DRAG", + "FL_DND_LEAVE", + "FL_DND_RELEASE", +}; + +char *fl_fontnames[] = +{ + "FL_HELVETICA", + "FL_HELVETICA_BOLD", + "FL_HELVETICA_ITALIC", + "FL_HELVETICA_BOLD_ITALIC", + "FL_COURIER", + "FL_COURIER_BOLD", + "FL_COURIER_ITALIC", + "FL_COURIER_BOLD_ITALIC", + "FL_TIMES", + "FL_TIMES_BOLD", + "FL_TIMES_ITALIC", + "FL_TIMES_BOLD_ITALIC", + "FL_SYMBOL", + "FL_SCREEN", + "FL_SCREEN_BOLD", + "FL_ZAPF_DINGBATS", +}; + +#endif /* FL_NAMES_H */ + +// +// End of "$Id:$". +// diff --git a/third_party/windows/fltk-1.1.10/FL/win32.H b/third_party/windows/fltk-1.1.10/FL/win32.H new file mode 100644 index 0000000..0737d97 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/win32.H @@ -0,0 +1,152 @@ +// +// "$Id: win32.H 5436 2006-09-16 16:02:00Z matt $" +// +// WIN32 header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Do not directly include this file, instead use . It will +// include this file if WIN32 is defined. This is to encourage +// portability of even the system-specific code... + +#ifndef Fl_X_H +# error "Never use directly; include instead." +#endif // !Fl_X_H + +#include +// In some of the distributions, the gcc header files are missing some stuff: +#ifndef LPMINMAXINFO +#define LPMINMAXINFO MINMAXINFO* +#endif +#ifndef VK_LWIN +#define VK_LWIN 0x5B +#define VK_RWIN 0x5C +#define VK_APPS 0x5D +#endif + +// some random X equivalents +typedef HWND Window; +typedef POINT XPoint; +struct XRectangle {int x, y, width, height;}; +typedef HRGN Fl_Region; +FL_EXPORT void fl_clip_region(Fl_Region); +inline Fl_Region XRectangleRegion(int x, int y, int w, int h) { + return CreateRectRgn(x,y,x+w,y+h); +} +inline void XDestroyRegion(Fl_Region r) {DeleteObject(r);} +inline void XClipBox(Fl_Region r,XRectangle* rect) { + RECT win_rect; GetRgnBox(r,&win_rect); + rect->x=win_rect.left; + rect->y=win_rect.top; + rect->width=win_rect.right-win_rect.left; + rect->height=win_rect.bottom-win_rect.top; +} +#define XDestroyWindow(a,b) DestroyWindow(b) +#define XMapWindow(a,b) ShowWindow(b, SW_RESTORE) +#define XUnmapWindow(a,b) ShowWindow(b, SW_HIDE) + +#include "Fl_Window.H" +// this object contains all win32-specific stuff about a window: +// Warning: this object is highly subject to change! +class FL_EXPORT Fl_X { +public: + // member variables - add new variables only at the end of this block + Window xid; + HBITMAP other_xid; // for double-buffered windows + Fl_Window* w; + Fl_Region region; + Fl_X *next; + int wait_for_expose; + HDC private_dc; // used for OpenGL + HCURSOR cursor; + HDC saved_hdc; // saves the handle of the DC currently loaded + // static variables, static functions and member functions + static Fl_X* first; + static Fl_X* i(const Fl_Window* w) {return w->i;} + static int fake_X_wm(const Fl_Window* w,int &X, int &Y, + int &bt,int &bx,int &by); + void setwindow(Fl_Window* wi) {w=wi; wi->i=this;} + void flush() {w->flush();} + void set_minmax(LPMINMAXINFO minmax); + void mapraise(); + static Fl_X* make(Fl_Window*); +}; +extern FL_EXPORT HCURSOR fl_default_cursor; +extern FL_EXPORT UINT fl_wake_msg; +inline Window fl_xid(const Fl_Window*w) {Fl_X *temp = Fl_X::i(w); return temp ? temp->xid : 0;} +FL_EXPORT Fl_Window* fl_find(Window xid); +extern FL_EXPORT char fl_override_redirect; // hack into Fl_Window::make_xid() +extern FL_EXPORT int fl_background_pixel; // hack into Fl_Window::make_xid() + +// most recent fl_color() or fl_rgbcolor() points at one of these: +extern FL_EXPORT struct Fl_XMap { + COLORREF rgb; // this should be the type the RGB() macro returns + HPEN pen; // pen, 0 if none created yet + int brush; // ref to solid brush, 0 if none created yet +} *fl_current_xmap; +inline COLORREF fl_RGB() {return fl_current_xmap->rgb;} +inline HPEN fl_pen() {return fl_current_xmap->pen;} +FL_EXPORT HBRUSH fl_brush(); // allocates a brush if necessary +FL_EXPORT HBRUSH fl_brush_action(int); // now does the real work + +extern FL_EXPORT HINSTANCE fl_display; +extern FL_EXPORT Window fl_window; +extern FL_EXPORT HDC fl_gc; +extern FL_EXPORT HPALETTE fl_palette; // non-zero only on 8-bit displays! +extern FL_EXPORT HDC fl_GetDC(Window); +extern FL_EXPORT MSG fl_msg; +extern FL_EXPORT void fl_release_dc(HWND w, HDC dc); +extern FL_EXPORT void fl_save_dc( HWND w, HDC dc); + +// off-screen pixmaps: create, destroy, draw into, copy to window +typedef HBITMAP Fl_Offscreen; +#define fl_create_offscreen(w, h) CreateCompatibleBitmap(fl_gc, w, h) + +extern FL_EXPORT HDC fl_makeDC(HBITMAP); + +#define fl_begin_offscreen(b) \ + HDC _sgc=fl_gc; Window _sw=fl_window; \ + fl_gc=fl_makeDC(b); int _savedc = SaveDC(fl_gc); fl_window=(HWND)b; fl_push_no_clip() + +#define fl_end_offscreen() \ + fl_pop_clip(); RestoreDC(fl_gc, _savedc); DeleteDC(fl_gc); fl_window=_sw; fl_gc = _sgc + +FL_EXPORT void fl_copy_offscreen(int x,int y,int w,int h,HBITMAP pixmap,int srcx,int srcy); +FL_EXPORT void fl_copy_offscreen_with_alpha(int x,int y,int w,int h,HBITMAP pixmap,int srcx,int srcy); +#define fl_delete_offscreen(bitmap) DeleteObject(bitmap); + +// Bitmap masks +typedef HBITMAP Fl_Bitmask; + +extern FL_EXPORT Fl_Bitmask fl_create_bitmask(int w, int h, const uchar *data); +extern FL_EXPORT Fl_Bitmask fl_create_alphamask(int w, int h, int d, int ld, const uchar *data); +extern FL_EXPORT void fl_delete_bitmask(Fl_Bitmask bm); + +// Dummy function to register a function for opening files via the window manager... +inline void fl_open_callback(void (*)(const char *)) {} + +extern FL_EXPORT int fl_parse_color(const char* p, uchar& r, uchar& g, uchar& b); + +// +// End of "$Id: win32.H 5436 2006-09-16 16:02:00Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/FL/x.H b/third_party/windows/fltk-1.1.10/FL/x.H new file mode 100644 index 0000000..231ecb1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/FL/x.H @@ -0,0 +1,148 @@ +// +// "$Id: x.H 5262 2006-07-18 11:23:20Z matt $" +// +// X11 header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// These are internal fltk symbols that are necessary or useful for +// calling Xlib. You should include this file if (and ONLY if) you +// need to call Xlib directly. These symbols may not exist on non-X +// systems. + +#ifndef Fl_X_H +# define Fl_X_H + +# include "Enumerations.H" + +# ifdef WIN32 +# include "win32.H" +# elif defined(__APPLE__) +# include "mac.H" +# else +# if defined(_ABIN32) || defined(_ABI64) // fix for broken SGI Irix X .h files +# pragma set woff 3322 +# endif +# include +# include +# if defined(_ABIN32) || defined(_ABI64) +# pragma reset woff 3322 +# endif +# include +# include "Fl_Window.H" + +// Mirror X definition of Region to Fl_Region, for portability... +typedef Region Fl_Region; + +FL_EXPORT void fl_open_display(); +FL_EXPORT void fl_open_display(Display*); +FL_EXPORT void fl_close_display(); + +// constant info about the X server connection: +extern FL_EXPORT Display *fl_display; +extern FL_EXPORT Window fl_message_window; +extern FL_EXPORT int fl_screen; +extern FL_EXPORT XVisualInfo *fl_visual; +extern FL_EXPORT Colormap fl_colormap; + +// drawing functions: +extern FL_EXPORT GC fl_gc; +extern FL_EXPORT Window fl_window; +extern FL_EXPORT XFontStruct* fl_xfont; +extern FL_EXPORT void *fl_xftfont; +FL_EXPORT ulong fl_xpixel(Fl_Color i); +FL_EXPORT ulong fl_xpixel(uchar r, uchar g, uchar b); +FL_EXPORT void fl_clip_region(Fl_Region); +FL_EXPORT Fl_Region fl_clip_region(); +FL_EXPORT Fl_Region XRectangleRegion(int x, int y, int w, int h); // in fl_rect.cxx + +// feed events into fltk: +FL_EXPORT int fl_handle(const XEvent&); + +// you can use these in Fl::add_handler() to look at events: +extern FL_EXPORT const XEvent* fl_xevent; +extern FL_EXPORT ulong fl_event_time; + +// off-screen pixmaps: create, destroy, draw into, copy to window: +typedef ulong Fl_Offscreen; +#define fl_create_offscreen(w,h) \ + XCreatePixmap(fl_display, fl_window, w, h, fl_visual->depth) +// begin/end are macros that save the old state in local variables: +# define fl_begin_offscreen(pixmap) \ + Window _sw=fl_window; fl_window=pixmap; fl_push_no_clip() +# define fl_end_offscreen() \ + fl_pop_clip(); fl_window = _sw + +# define fl_copy_offscreen(x,y,w,h,pixmap,srcx,srcy) \ + XCopyArea(fl_display, pixmap, fl_window, fl_gc, srcx, srcy, w, h, x, y) +# define fl_delete_offscreen(pixmap) XFreePixmap(fl_display, pixmap) + +// Bitmap masks +typedef ulong Fl_Bitmask; + +extern FL_EXPORT Fl_Bitmask fl_create_bitmask(int w, int h, const uchar *data); +extern FL_EXPORT Fl_Bitmask fl_create_alphamask(int w, int h, int d, int ld, const uchar *data); +extern FL_EXPORT void fl_delete_bitmask(Fl_Bitmask bm); + +// this object contains all X-specific stuff about a window: +// Warning: this object is highly subject to change! It's definition +// is only here so that fl_xid can be declared inline: +class FL_EXPORT Fl_X { +public: + Window xid; + Window other_xid; + Fl_Window *w; + Fl_Region region; + Fl_X *next; + char wait_for_expose; + char backbuffer_bad; // used for XDBE + static Fl_X* first; + static Fl_X* i(const Fl_Window* wi) {return wi->i;} + void setwindow(Fl_Window* wi) {w=wi; wi->i=this;} + void sendxjunk(); + static void make_xid(Fl_Window*,XVisualInfo* =fl_visual, Colormap=fl_colormap); + static Fl_X* set_xid(Fl_Window*, Window); + // kludges to get around protection: + void flush() {w->flush();} + static void x(Fl_Window* wi, int X) {wi->x(X);} + static void y(Fl_Window* wi, int Y) {wi->y(Y);} +}; + +// convert xid <-> Fl_Window: +inline Window fl_xid(const Fl_Window*w) {return Fl_X::i(w)->xid;} +FL_EXPORT Fl_Window* fl_find(Window xid); + +extern FL_EXPORT char fl_override_redirect; // hack into Fl_X::make_xid() +extern FL_EXPORT int fl_background_pixel; // hack into Fl_X::make_xid() + +// Dummy function to register a function for opening files via the window manager... +inline void fl_open_callback(void (*)(const char *)) {} + +extern FL_EXPORT int fl_parse_color(const char* p, uchar& r, uchar& g, uchar& b); + +# endif +#endif + +// +// End of "$Id: x.H 5262 2006-07-18 11:23:20Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/Makefile b/third_party/windows/fltk-1.1.10/Makefile new file mode 100644 index 0000000..f98e756 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/Makefile @@ -0,0 +1,127 @@ +# +# "$Id: Makefile 6817 2009-07-02 09:42:17Z AlbrechtS $" +# +# Top-level makefile for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2009 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems on the following page: +# +# http://www.fltk.org/str.php +# + +include makeinclude + +DIRS = $(IMAGEDIRS) src fluid test documentation + +all: makeinclude fltk-config + for dir in $(DIRS); do\ + echo "=== making $$dir ===";\ + (cd $$dir; $(MAKE) $(MFLAGS)) || exit 1;\ + done + +install: makeinclude + -mkdir -p $(DESTDIR)$(bindir) + $(RM) $(DESTDIR)$(bindir)/fltk-config + $(INSTALL_SCRIPT) fltk-config $(DESTDIR)$(bindir) + for dir in FL $(DIRS); do\ + echo "=== installing $$dir ===";\ + (cd $$dir; $(MAKE) $(MFLAGS) install) || exit 1;\ + done + +install-desktop: makeinclude + cd documentation; $(MAKE) $(MFLAGS) $(INSTALL_DESKTOP) + cd fluid; $(MAKE) $(MFLAGS) $(INSTALL_DESKTOP) + cd test; $(MAKE) $(MFLAGS) $(INSTALL_DESKTOP) + +uninstall: makeinclude + $(RM) $(DESTDIR)$(bindir)/fltk-config + for dir in FL $(DIRS); do\ + echo "=== uninstalling $$dir ===";\ + (cd $$dir; $(MAKE) $(MFLAGS) uninstall) || exit 1;\ + done + +uninstall-desktop: makeinclude + cd documentation; $(MAKE) $(MFLAGS) $(UNINSTALL_DESKTOP) + cd fluid; $(MAKE) $(MFLAGS) $(UNINSTALL_DESKTOP) + cd test; $(MAKE) $(MFLAGS) $(UNINSTALL_DESKTOP) + +depend: makeinclude + for dir in $(DIRS); do\ + echo "=== making dependencies in $$dir ===";\ + (cd $$dir; $(MAKE) $(MFLAGS) depend) || exit 1;\ + done + +clean: + -$(RM) core *.o + for dir in $(DIRS); do\ + echo "=== cleaning $$dir ===";\ + (cd $$dir; $(MAKE) $(MFLAGS) clean) || exit 1;\ + done + +distclean: clean + $(RM) config.* + $(RM) fltk-config fltk.list makeinclude + $(RM) fltk.spec + $(RM) FL/Makefile + $(RM) documentation/*.$(CAT1EXT) + $(RM) documentation/*.$(CAT3EXT) + $(RM) documentation/*.$(CAT6EXT) + $(RM) documentation/fltk.pdf + $(RM) documentation/fltk.ps + $(RM) -r documentation/fltk.d + for file in test/*.fl; do\ + $(RM) test/`basename $$file .fl`.cxx; \ + $(RM) test/`basename $$file .fl`.h; \ + done + +fltk-config: configure configh.in fltk-config.in + if test -f config.status; then \ + ./config.status --recheck; \ + ./config.status; \ + else \ + ./configure; \ + fi + touch config.h + chmod +x fltk-config + +makeinclude: configure configh.in makeinclude.in + if test -f config.status; then \ + ./config.status --recheck; \ + ./config.status; \ + else \ + ./configure; \ + fi + touch config.h + chmod +x fltk-config + +configure: configure.in + autoconf + +portable-dist: + epm -v -s fltk.xpm fltk + +native-dist: + epm -v -f native fltk + +etags: + etags FL/*.H FL/*.h src/*.cxx src/*.c src/*.h fluid/*.h fluid/*.cxx test/*.h test/*.cxx + +# +# End of "$Id: Makefile 6817 2009-07-02 09:42:17Z AlbrechtS $". +# diff --git a/third_party/windows/fltk-1.1.10/README b/third_party/windows/fltk-1.1.10/README new file mode 100644 index 0000000..81f7c0f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/README @@ -0,0 +1,197 @@ +README - Fast Light Tool Kit (FLTK) Version 1.1.10 +-------------------------------------------------- + +WHAT IS FLTK? + + The Fast Light Tool Kit ("FLTK", pronounced "fulltick") is a + a cross-platform C++ GUI toolkit for UNIX(r)/Linux(r) (X11), + Microsoft(r) Windows(r), and MacOS(r) X. FLTK provides + modern GUI functionality without the bloat and supports 3D + graphics via OpenGL(r) and its built-in GLUT emulation. It + was originally developed by Mr. Bill Spitzak and is + currently maintained by a small group of developers across + the world with a central repository in the US. + + +LICENSING + + FLTK comes with complete free source code. FLTK is available + under the terms of the GNU Library General Public License. + Contrary to popular belief, it can be used in commercial + software! (Even Bill Gates could use it.) + + +ON-LINE DOCUMENTATION + + All of the documentation is in HTML in the subdirectory + "documentation". The "index.html" file should be your + starting point. PostScript(tm) and PDF versions of this + documentation is also available from the FLTK web site at: + + http://www.fltk.org/documentation.php + + +BUILDING AND INSTALLING FLTK UNDER UNIX AND MacOS X + + In most cases you can just type "make". This will run + configure with the default (no) options and then compile + everything. + + FLTK uses GNU autoconf to configure itself for your UNIX + platform. The main things that the configure script will + look for are the X11, OpenGL (or Mesa), and JPEG header and + library files. Make sure that they are in the standard + include/library locations. If they aren't you need to + define the CFLAGS, CXXFLAGS, and LDFLAGS environment + variables. + + If you aren't using "gcc", "g++", "c++", or "CC" for your + C++ compiler, you'll also need to set the CXX environment + variable. Similarly, if you aren't using "gcc" or "cc" for + your C compiler you'll need to set the CC environment + variable. + + You can run configure yourself to get the exact setup you + need. Type "./configure ". Options include: + + --enable-cygwin - Enable the Cygwin libraries (WIN32) + --enable-debug - Enable debugging code & symbols + --disable-gl - Disable OpenGL support + --enable-shared - Enable generation of shared libraries + --enable-threads - Enable multithreading support + --enable-xdbe - Enable the X double-buffer extension + --enable-xft - Enable the Xft library (anti-aliased fonts) + + --bindir=/path - Set the location for executables + [default = /usr/local/bin] + --libdir=/path - Set the location for libraries + [default = /usr/local/lib] + --includedir=/path - Set the location for include files. + [default = /usr/local/include] + --prefix=/dir - Set the directory prefix for files + [default = /usr/local] + + When the configure script is done you can just run the + "make" command. This will build the library, FLUID tool, and + all of the test programs. + + To install the library, become root and type "make + install". This will copy the "fluid" executable to + "bindir", the header files to "includedir", and the library + files to "libdir". + + +BUILDING FLTK UNDER MICROSOFT WINDOWS + + There are two ways to build FLTK under Microsoft Windows. + The first is to use the VC++ 6.0 project files under the + "visualc" directory. Just open (or double-click on) the + "fltk.dsw" file to get the whole shebang. + + The second method is to use a GNU-based development tool + with the files in the "makefiles" directory. To build + with the CygWin tools, use the supplied configure script + as specified in the UNIX section above: + + sh configure ...options... + + To build using other tools simply copy the appropriate + makeinclude and config files to the main directory and do a + make: + + copy makefiles\Makefile. Makefile + make + + +BUILDING FLTK UNDER OS/2 + + The current OS/2 build requires XFree86 for OS/2 to work. A + native Presentation Manager version has not been implemented + yet (volunteers are welcome!). + + To build the XFree86 version of FLTK for OS/2, copy the + appropriate makeinclude and config files to the main + directory and do a make: + + copy makefiles\Makefile.os2x Makefile + make + + +INTERNET RESOURCES + + FLTK is available on the 'net in a bunch of locations: + + - WWW: http://www.fltk.org/ + http://www.fltk.org/str.php [for reporting bugs] + http://www.fltk.org/software.php [source code] + + - FTP: http://ftp.easysw.com/pub/fltk + ftp://ftp.easysw.com/pub/fltk + ftp://ftp2.easysw.com/pub/fltk + ftp://ftp.funet.fi/pub/mirrors/ftp.easysw.com/pub/fltk + ftp://linux.mathematik.tu-darmstadt.de/pub/linux/mirrors/misc/fltk + ftp://gd.tuwien.ac.at/hci/fltk + + - EMail: fltk@fltk.org [see instructions below] + + To send a message to the FLTK mailing list ("fltk@fltk.org") + you must first join the list. Non-member submissions are + blocked to avoid problems with SPAM. + + To join the FLTK mailing list, go the following web page: + + http://lists.easysw.com/listinfo/fltk + + +REPORTING BUGS + + To report a bug in FLTK, use the form at: + + http://www.fltk.org/str.php + + For general support and questions, please use the FLTK + mailing list at "fltk@fltk.org". + + +TRADEMARKS + + Microsoft and Windows are registered trademarks of Microsoft + Corporation. UNIX is a registered trademark of the X/Open + Group, Inc. OpenGL is a registered trademark of Silicon + Graphics, Inc. MacOS is a registered trademark of Apple + Computers, Inc. + + +COPYRIGHT + + FLTK is copyright 1998-2009 by Bill Spitzak + (spitzak@users.sourceforge.net) and others, including: + + Craig P. Earls + Curtis Edwards (trilex@users.sourceforge.net) + Gustavo Hime (hime@users.sourceforge.net) + Talbot Hughes + Robert Kesterson (robertk@users.sourceforge.net) + Matthias Melcher (matthiaswm@users.sourceforge.net) + James Dean Palmer (jamespalmer@users.sourceforge.net) + Vincent Penne (vincentp@users.sourceforge.net) + Michael Sweet (easysw@users.sourceforge.net) + Carl Thompson (clip@users.sourceforge.net) + Nafees Bin Zafar (nafees@users.sourceforge.net) + + This library is free software; you can redistribute it + and/or modify it under the terms of the GNU Library General + Public License as published by the Free Software Foundation; + either version 2 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 Library General Public License for + more details. + + You should have received a copy of the GNU Library General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA. diff --git a/third_party/windows/fltk-1.1.10/README.mac b/third_party/windows/fltk-1.1.10/README.mac new file mode 100644 index 0000000..c5c24b3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/README.mac @@ -0,0 +1,87 @@ +README.mac - 2007-02-06 - Building FLTK under MacOS X +----------------------------------------------------- + +CONTENTS + + - Introduction + - How to Build Using GCC (MacOS X) + - Scripts + - Known MacFLTK bugs + - Test suite status + - Other stuff + - FLTK 1.0.x for Mac + + +INTRODUCTION + + FLTK currently supports the following development + environments on the MacOS X platform: + + - GCC + - Metrowerks CodeWarrior + - (Apple Project Builder - future releases) + - (MPW - future releases) + + +HOW TO BUILD USING GCC (MacOS X) + + Since the MacOS X command line build environment is based on + BSD UNIX, the normal UNIX build procedure as described in + 'README' applies. + + +KNOWN MacFLTK BUGS + + The following FLTK things are not implemented or don't work + at present: + + - Line styles are not fully implemented. + - Sub-sub-subwindow not tested. + - The 'shiny' demo needs work (flush/aglFlush). + + +TEST SUITE STATUS + + OS X: + + CubeView(++), adjuster(++), arc(++), ask(++), bitmap(++), + boxtype(++), browser(++), button(++), buttons(++), + checkers(++), clock(++), colbrowser(++), color_chooser(++), + cube(++), cursor(++), curve(++), demo(++), doublebuffer(++), + editor(++), fast_slow(++), file_chooser(++), fonts(++), + forms(++), fractals(++), fullscreen(++), gl_overlay(++), + glpuzzle(++), hello(++), help(++), iconize(++), image(+), + inactive(++), input(++), keyboard(++), label(++), + line_style(+), mandelbrot(++), menubar(++), message(++), + minimum(++), navigation(++), output(++), overlay(++), + pack(++), pixmap(++), pixmap_browser(++), radio(++), + resizebox(++), scroll(++), shape(++), shiny(-), + subwindow(++), symbols(++), tabs(++), tile(++), + tiled_image(++), valuators(++), fluid(++) + + (o)=minor bugs, (+)=usable, (++)=running perfectly, + (-)=major bugs, (--)=crashes + + +OTHER STUFF + + The creator ID's 'FLTK', 'Fltk', 'FLID', and 'Flid' are + officially registered with Apple Computers, Inc. and can be + used for FLTK applications ('FLTK') and FLUID files + ('Flid'). + + Under MacOS X, all windows are double-buffered. Using + Fl_Window has the same effect as using Fl_Double_Window on + other operating systems. Fl_Overlay_Window however uses one + additional buffer for the overlay plane. + + +FLTK 1.0.X FOR MAC + + FLTK 1.0.6 for MacOS 8.x and OS 9.x is in beta stage and can + be downloaded from http://www.matthiasm.com/flMac.html . + The archive contains build files for Metrowerks CodeWarrior + 5 and 6. + + FLTK 1.0.6 for Mac is not supported by the FLTK team and + will not be further developed by the author. diff --git a/third_party/windows/fltk-1.1.10/README.win32 b/third_party/windows/fltk-1.1.10/README.win32 new file mode 100644 index 0000000..c3ec212 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/README.win32 @@ -0,0 +1,191 @@ +README.win32 - Building FLTK under Windows +------------------------------------------ +Last Update: May 2009 for release 1.1.10 + +INTRODUCTION + + This document is split into two main sections. The first + describes several possible build environments, while the + second describes some of the issues associated with using + the GNU-like build configurations in the "makefiles" + subdirectory. + + FLTK currently supports the following development + environments on the Windows platform: + + - Microsoft Visual C++ 6.0, VC2005 and VC.NET using the + supplied workspace and project files. Be sure to get + your service packs! + + - Borland C++ Builder 5 and 6 using the supplied IDE + files. These files are not as actively maintained as + the VC and GNU versions, so may not work for you. + + - Watcom. There is a partial solution for the Watcom + toolchain. It is no longer actively maintained. + + - GNU toolsets (Cygwin or MinGW) hosted on Windows + 9x/2000/NT/XP. + + This remainder of this document gives a brief overview of + compiling and using FLTK with the Cygwin and MinGW compiler + toolkits. Both toolkits provide a build environment based + around the GNU C/C++ compiler. Further information is + available from the FLTK website at http://www.fltk.org, such + as this Howto note: http://www.fltk.org/articles.php?L598 + + The Cygwin build environment supplies a library (the Cygwin + DLL) that is primarily intended to provide a number of + Unix-like POSIX facilities for programs being ported to the + Windows environment (Win32 or WinNT). Cygwin also supplies + a very Unix-like build environment for Windows, including + the "BASH" Bourne-compatible shell and all of the standard + Unix file utilities (ls, cat, grep, etc.). + + Cygwin is developed by Cygnus (now part of RedHat, Inc). + Although provided for free download under the GPL, + distributing programs that require the Cygwin DLL under a + license other than the GPL requires a commercial license for + the Cygwin DLL. Native Windows programs that do not require + the Cygwin DLL (compiled and linked with the "-mno-cygwin" + option) may be released under any license freely. + + The MinGW distribution (Minimalist GNU for Windows) provides + a similar toolset but geared solely towards native Windows + development without the Unix-like POSIX library. The lack of + any libraries under the GPL or any other restrictive license + means that programs built with the MinGW environment may + always be released under any license freely. MinGW also + supplies a Unix-like build environment for Windows, + including MSYS (a Bourne-compatible shell) and the standard + Unix file utilities (ls, cat, grep, etc.) + + If you are not familiar with these GNU-like toolkits please + refer to the links section later in this note. In particular, + check out their license conditions carefully before use. + + +THE TOOLS + + There are currently three main configurations supported by + FLTK with the GNU tools: + + 1. Cygwin: Built using the Cygwin toolset and using the + Unix-like POSIX compatibility layer provided by the + Cygwin DLL. + + 2. Cygwin using the "-mno-cygwin" option: Built using + the Cygwin toolset but not using the Cygwin DLL. + + 3. MinGW: Built using the MinGW utilities, compiler and + tools. This is, in many aspects, analogous to the + Cygwin "-mno-cygwin" option. + + +RECOMMENDED BUILD ENVIRONMENTS + + Our recommendation is to: + + 1. Get the current Cygwin toolset. + + This can either produce executables that do or do not + rely on the Cygwin DLL (check licensing) at your choice. + + 2. Get the latest MinGW toolset. It is recommended that you + also get the MSYS shell and the msysDTK developer toolset. + + This will only produce normal Windows native executables + without any Unix or POSIX compatibility layer. + + See the links section below for more information. + + Either option can generate windows-native executables and + option 1 can provide a Unix-like POSIX portability layer that + is reliant on a GPLed library. + + See the later sections for detailed information about using + one of these configurations. + +LINKS + + The following links may be of use: + + 1. Main Cygwin homepage: + + http://www.cygwin.com/ + + 2. Main Mingw homepage: + + http://www.mingw.org/ + + In particular look for the MinGW FAQ at this link for + a lot of useful Mingw-native development + documentation. + + + 3. Check out the FLTK newsgroups at the FLTK homepage: + + http://www.fltk.org/ + + Its archival search facilities are EXTREMELY useful + to check back through previous problems with this + sort of configuration before posting new questions. + + 4. Carl Thompson (member of the core team responsible + for FLTK): + + http://www.carlthompson.net/ + + A pre-bundled development toolset tailored for use + with an earlier version of FLTK may be found at: + + http://www.carlthompson.net/cygwin/ + + However, this has not been actively maintained since + the Cygwin and MinGW offerings are now more complete + these days. + + 5. GNU Compiler Collection (GCC) compiler homepage: + + http://gcc.gnu.org/ + + 6. OpenGL page - for OpenGL and GLUT libs + + http://www.opengl.org/ + + +BUILDING FLTK WITH CYGWIN OR MINGW + + Please read chapter 1 of the FLTK Programmers Manual for + compilation instructions. + + +WHY DOES A CONSOLE WINDOW APPEAR WHEN I RUN MY PROGRAM? + + Windows has a flag that determines whether an application + runs in the foreground with a console or in the background + without a console. Use the "-mwindows" option to make your + application run in the background and "-mconsole" to run in + the foreground. + + Keep in mind that a windows application cannot send output + to stdout, even if you run it from an existing console + application. + (Note: A special case of this exists if running a MinGW + application from the command line of an MSYS shell, when an + application is able to write to stdout, even if compiled with + "-mwindows".) + + +HOW DO I GET OPENGL TO WORK? + + Both builds should automatically support OpenGL. + + The configuration file config.h has a number of settings + which control compile-time compilation. One such setting is + "HAVE_GL". This may be set to 0 to disable Open GL operation. + Changing the line in config.h to + + #define HAVE_GL 1 + + will change this to compile and link in OpenGL. diff --git a/third_party/windows/fltk-1.1.10/autom4te.cache/output.0 b/third_party/windows/fltk-1.1.10/autom4te.cache/output.0 new file mode 100644 index 0000000..00d2d72 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/autom4te.cache/output.0 @@ -0,0 +1,9045 @@ +@%:@! /bin/sh +@%:@ Guess values for system-dependent variables and create Makefiles. +@%:@ Generated by GNU Autoconf 2.65. +@%:@ +@%:@ +@%:@ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +@%:@ 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +@%:@ Inc. +@%:@ +@%:@ +@%:@ This configure script is free software; the Free Software Foundation +@%:@ gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in @%:@( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +@%:@ as_fn_error ERROR [LINENO LOG_FD] +@%:@ --------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with status @S|@?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in @%:@( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIB@&t@OBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= +PACKAGE_URL= + +ac_unique_file="src/Fl.cxx" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIB@&t@OBJS +MAKEDEPEND +CAT6EXT +CAT3EXT +CAT1EXT +UNINSTALL_DESKTOP +INSTALL_DESKTOP +THREADS +OSX_ONLY +POSTBUILD +HLINKS +GLLIB +XPROP +FTCONFIG +X_EXTRA_LIBS +X_LIBS +X_PRE_LIBS +X_CFLAGS +XMKMF +PTHREAD_FLAGS +ZLIBINC +ZLIB +PNGINC +PNG +JPEGINC +JPEG +STATICIMAGELIBS +IMAGELIBS +AUDIOLIBS +LARGEFILE +EGREP +GREP +CPP +LIBCOMMAND +AR +RANLIB +HTMLDOC +GROFF +NROFF +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +ac_ct_CXX +CXXFLAGS +CXX +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +FLUID +LINKSHARED +SHAREDSUFFIX +IMGDSONAME +GLDSONAME +FLDSONAME +DSONAME +DSOLINK +DSOFLAGS +DSOCOMMAND +IMGLIBBASENAME +GLLIBBASENAME +FLLIBBASENAME +LIBBASENAME +LINKFLTKIMG +LINKFLTKGL +LINKFLTKFORMS +LINKFLTK +LIBNAME +LIBEXT +IMGLIBNAME +GLLIBNAME +GLDEMOS +FLLIBNAME +OPTIM +ARCHFLAGS +FL_API_VERSION +FL_PATCH_VERSION +FL_MINOR_VERSION +FL_MAJOR_VERSION +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_cygwin +enable_debug +enable_gl +enable_shared +enable_threads +with_optim +with_archflags +enable_quartz +enable_largefile +enable_localjpeg +enable_localzlib +enable_localpng +with_links +with_x +enable_xinerama +enable_xft +enable_xdbe +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CPP +XMKMF' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information." + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + @<:@@S|@ac_default_prefix@:>@ + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + @<:@PREFIX@:>@ + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root @<:@DATAROOTDIR/doc/PACKAGE@:>@ + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-cygwin use the CygWin libraries default=no + --enable-debug turn on debugging default=no + --enable-gl turn on OpenGL support default=yes + --enable-shared turn on shared libraries default=no + --enable-threads enable multi-threading support + --enable-quartz use Quartz instead of Quickdraw (default=no) + --disable-largefile omit support for large files + --enable-localjpeg use local JPEG library, default=auto + --enable-localzlib use local ZLIB library, default=auto + --enable-localpng use local PNG library, default=auto + --enable-xinerama turn on Xinerama support default=no + --enable-xft turn on Xft support default=no + --enable-xdbe turn on Xdbe support default=no + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-optim="flags" use custom optimization flags + --with-archflags="flags" + use custom architecture flags + --with-links make header links for common misspellings + --with-x use the X Window System + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + XMKMF Path to xmkmf, Makefile generator for X Window System + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.65 + +Copyright (C) 2009 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +@%:@ ac_fn_c_try_compile LINENO +@%:@ -------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_compile + +@%:@ ac_fn_cxx_try_compile LINENO +@%:@ ---------------------------- +@%:@ Try to compile conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} @%:@ ac_fn_cxx_try_compile + +@%:@ ac_fn_c_try_run LINENO +@%:@ ---------------------- +@%:@ Try to link conftest.@S|@ac_ext, and return whether this succeeded. Assumes +@%:@ that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_run + +@%:@ ac_fn_c_try_cpp LINENO +@%:@ ---------------------- +@%:@ Try to preprocess conftest.@S|@ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_cpp + +@%:@ ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists and can be compiled using the include files in +@%:@ INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} @%:@ ac_fn_c_check_header_compile + +@%:@ ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +@%:@ -------------------------------------------- +@%:@ Tries to find the compile-time value of EXPR in a program that includes +@%:@ INCLUDES, setting VAR accordingly. Returns whether the value could be +@%:@ computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array @<:@1 - 2 * !(($2) >= 0)@:>@; +test_array @<:@0@:>@ = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array @<:@1 - 2 * !(($2) <= $ac_mid)@:>@; +test_array @<:@0@:>@ = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array @<:@1 - 2 * !(($2) < 0)@:>@; +test_array @<:@0@:>@ = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array @<:@1 - 2 * !(($2) >= $ac_mid)@:>@; +test_array @<:@0@:>@ = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array @<:@1 - 2 * !(($2) <= $ac_mid)@:>@; +test_array @<:@0@:>@ = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in @%:@(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +@%:@include +@%:@include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 &5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} @%:@ ac_fn_c_try_link + +@%:@ ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +@%:@ ------------------------------------------------------- +@%:@ Tests whether HEADER exists, giving a warning if it cannot be compiled using +@%:@ the include files in INCLUDES and setting the cache variable VAR +@%:@ accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +@%:@include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} @%:@ ac_fn_c_check_header_mongrel + +@%:@ ac_fn_c_check_func LINENO FUNC VAR +@%:@ ---------------------------------- +@%:@ Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} @%:@ ac_fn_c_check_func +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.65. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +@%:@define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +FL_MAJOR_VERSION=1 +FL_MINOR_VERSION=1 +FL_PATCH_VERSION=10 +FL_API_VERSION=${FL_MAJOR_VERSION}.${FL_MINOR_VERSION} + + + + + + +uname=`uname` +uversion=`uname -r | sed -e '1,$s/[^0-9]//g'` +if test "x$uname" = xIRIX64; then + uname="IRIX" +fi +if test "x$uname" = x; then + # MingW doesn't provide any output when uname is run, even with "-s"... + uname="CYGWIN" +fi + +ARCHFLAGS="${ARCHFLAGS:=}" +CFLAGS="${CFLAGS:=}" +CPPFLAGS="${CPPFLAGS:=}" +CXXFLAGS="${CXXFLAGS:=}" +DSOFLAGS="${DSOFLAGS:=}" +LDFLAGS="${LDFLAGS:=}" +OPTIM="${OPTIM:=}" + + + + +case $uname in + CYGWIN* | MINGW*) + # Handle Cygwin option *first*, before all other tests. + @%:@ Check whether --enable-cygwin was given. +if test "${enable_cygwin+set}" = set; then : + enableval=$enable_cygwin; +fi + + if test x$enable_cygwin != xyes; then + # NOTE: We can't use ARCHFLAGS for this, since it does not work + # with some of the function tests - Cygwin uses a + # different C library... + CFLAGS="$CFLAGS -mno-cygwin" + CPPFLAGS="$CPPFLAGS -mno-cygwin" + CXXFLAGS="$CXXFLAGS -mno-cygwin" + LDFLAGS="$LDFLAGS -mno-cygwin" + DSOFLAGS="$DSOFLAGS -mno-cygwin" + fi + ;; + Darwin*) + # Starting with 10.6 (Snow Leopard), OS X does not support + # Carbon calls anymore. We patch this until we are completely Cocoa compliant + # by limiting ourselves to 32 bit Intel compiles + d_ver_rev=`sw_vers -productVersion | sed -e 's/\.[0-9][0-9]*//2'` + d_ver=`echo $d_ver_rev | sed -e 's/\.[0-9][0-9]*//'` + d_rev=`echo $d_ver_rev | sed -e 's/[0-9][0-9]*\.//'` + if test $d_ver -gt 10 -o $d_ver -eq 10 -a $d_rev -ge 6; then + CFLAGS="$CFLAGS -arch i386" + CXXFLAGS="$CXXFLAGS -arch i386" + LDFLAGS="$LDFLAGS -arch i386" + fi + ;; +esac + +LINKFLTK="../lib/libfltk.a" +LINKFLTKFORMS="../lib/libfltk_forms.a" +LINKFLTKGL="../lib/libfltk_gl.a" +LINKFLTKIMG="../lib/libfltk_images.a" +GLDEMOS="gldemos" + +LIBEXT=".a" +LIBNAME="../lib/libfltk.a" +FLLIBNAME="../lib/libfltk_forms.a" +GLLIBNAME="../lib/libfltk_gl.a" +IMGLIBNAME="../lib/libfltk_images.a" + +LIBBASENAME="libfltk.a" +FLLIBBASENAME="libfltk_forms.a" +GLLIBBASENAME="libfltk_gl.a" +IMGLIBBASENAME="libfltk_images.a" + + + + + + + + + + + + + + + + + +@%:@ Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; +fi + +if test x$enable_debug = xyes; then + DEBUGFLAG="-g " +else + DEBUGFLAG="" +fi + +@%:@ Check whether --enable-gl was given. +if test "${enable_gl+set}" = set; then : + enableval=$enable_gl; +fi + + +@%:@ Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; +fi + +if test x$enable_shared = xyes; then + PICFLAG=1 + SHAREDSUFFIX="" + FLUID="fluid-shared" + + case $uname in + Darwin*) + DSONAME="libfltk.$FL_API_VERSION.dylib" + FLDSONAME="libfltk_forms.$FL_API_VERSION.dylib" + GLDSONAME="libfltk_gl.$FL_API_VERSION.dylib" + IMGDSONAME="libfltk_images.$FL_API_VERSION.dylib" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -dynamiclib -lc -o" + ;; + + SunOS* | UNIX_S*) + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -h \$@ \$(LDLIBS) -G $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib"; then + DSOLINK="-R$libdir" + fi + ;; + HP-UX*) + DSONAME="libfltk.sl.$FL_API_VERSION" + FLDSONAME="libfltk_forms.sl.$FL_API_VERSION" + GLDSONAME="libfltk_gl.sl.$FL_API_VERSION" + IMGDSONAME="libfltk_images.sl.$FL_API_VERSION" + DSOCOMMAND="ld \$(DSOFLAGS) -b -z +h \$@ $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib"; then + DSOLINK="-Wl,-rpath,$libdir" + fi + ;; + IRIX*) + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@,-set_version,sgi1.1 \$(LDLIBS) -shared $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/usr/lib32" -a "x$libdir" != "x/usr/lib64"; then + DSOLINK="-Wl,-rpath,$libdir" + fi + ;; + OSF1*) + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/usr/lib32"; then + DSOLINK="-Wl,-rpath,$libdir" + fi + ;; + Linux* | *BSD*) + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared -fPIC $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib"; then + DSOLINK="-Wl,-rpath,$libdir" + fi + ;; + AIX*) + DSONAME="libfltk_s.a" + FLDSONAME="libfltk_forms_s.a" + GLDSONAME="libfltk_gl_s.a" + IMGDSONAME="libfltk_images_s.a" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-bexpall,-bM:SRE,-bnoentry -o" + SHAREDSUFFIX="_s" + ;; + CYGWIN* | MINGW*) + PICFLAG=0 + if test x$enable_cygwin != xyes; then + DSONAME="mgwfltknox-$FL_API_VERSION.dll" + FLDSONAME="mgwfltknox_forms-$FL_API_VERSION.dll" + GLDSONAME="mgwfltknox_gl-$FL_API_VERSION.dll" + IMGDSONAME="mgwfltknox_images-$FL_API_VERSION.dll" + else + DSONAME="cygfltknox-$FL_API_VERSION.dll" + FLDSONAME="cygfltknox_forms-$FL_API_VERSION.dll" + GLDSONAME="cygfltknox_gl-$FL_API_VERSION.dll" + IMGDSONAME="cygfltknox_images-$FL_API_VERSION.dll" + fi + #----------------------------------------------------------- + # -Wl,--enable-runtime-pseudo-reloc: See str 1585 + # appears to be necessary for older binutils versions < 2.16 + #----------------------------------------------------------- + LDFLAGS="$LDFLAGS -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -shared \ + -Wl,--whole-archive -Wl,--export-all-symbols \ + -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-import \ + -Wl,--enable-auto-image-base -o \$@" + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Shared libraries may not be supported. Trying -shared option with compiler." >&5 +$as_echo "$as_me: WARNING: Shared libraries may not be supported. Trying -shared option with compiler." >&2;} + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o" + ;; + esac + + LINKSHARED="-L../src -lfltk_images$SHAREDSUFFIX -lfltk_forms$SHAREDSUFFIX -lfltk$SHAREDSUFFIX" +else + DSOCOMMAND="echo" + DSOLINK="" + DSONAME="" + FLDSONAME="" + GLDSONAME="" + IMGDSONAME="" + PICFLAG=0 + SHAREDSUFFIX="" + FLUID="fluid" + LINKSHARED="../lib/libfltk_images.a ../lib/libfltk_forms.a ../lib/libfltk.a" +fi + + + + + + + + + + + + +@%:@ Check whether --enable-threads was given. +if test "${enable_threads+set}" = set; then : + enableval=$enable_threads; +fi + + + +@%:@ Check whether --with-optim was given. +if test "${with_optim+set}" = set; then : + withval=$with_optim; +fi + + + +@%:@ Check whether --with-archflags was given. +if test "${with_archflags+set}" = set; then : + withval=$with_archflags; ARCHFLAGS="$withval" +fi + + +case $uname in + Darwin*) + @%:@ Check whether --enable-quartz was given. +if test "${enable_quartz+set}" = set; then : + enableval=$enable_quartz; +fi + + if test "x$enable_quartz" = "xyes"; then + $as_echo "@%:@define USE_QUARTZ 1" >>confdefs.h + + $as_echo "@%:@define __APPLE_QUARTZ__ 1" >>confdefs.h + + else + $as_echo "@%:@define __APPLE_QD__ 1" >>confdefs.h + + fi + ;; +esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $@%:@ != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "no acceptable C compiler found in \$PATH +See \`config.log' for more details." "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "C compiler cannot create executables +See \`config.log' for more details." "$LINENO" 5; }; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of object files: cannot compile +See \`config.log' for more details." "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + for ac_t in install-sh install.sh shtool; do + if test -f "$ac_dir/$ac_t"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/$ac_t -c" + break 2 + fi + done +done +if test -z "$ac_aux_dir"; then + as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in @%:@(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +case $uname in + OSF1*) + INSTALL="`pwd`/install-sh -c" + ;; +esac +if test "$INSTALL" = "$ac_install_sh"; then + # Use full path to install-sh script... + INSTALL="`pwd`/install-sh -c" +fi +# Extract the first word of "nroff", so it can be a program name with args. +set dummy nroff; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_NROFF+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $NROFF in + [\\/]* | ?:[\\/]*) + ac_cv_path_NROFF="$NROFF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_NROFF="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +NROFF=$ac_cv_path_NROFF +if test -n "$NROFF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NROFF" >&5 +$as_echo "$NROFF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test "x$NROFF" = "x:"; then + # Try groff instead of nroff... + # Extract the first word of "groff", so it can be a program name with args. +set dummy groff; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_GROFF+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $GROFF in + [\\/]* | ?:[\\/]*) + ac_cv_path_GROFF="$GROFF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_GROFF="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GROFF=$ac_cv_path_GROFF +if test -n "$GROFF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GROFF" >&5 +$as_echo "$GROFF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$GROFF" = "x:"; then + NROFF="echo" + else + NROFF="$GROFF -T ascii" + fi +fi +# Extract the first word of "htmldoc", so it can be a program name with args. +set dummy htmldoc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_HTMLDOC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $HTMLDOC in + [\\/]* | ?:[\\/]*) + ac_cv_path_HTMLDOC="$HTMLDOC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_HTMLDOC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +HTMLDOC=$ac_cv_path_HTMLDOC +if test -n "$HTMLDOC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HTMLDOC" >&5 +$as_echo "$HTMLDOC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +# Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_AR+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $AR in + [\\/]* | ?:[\\/]*) + ac_cv_path_AR="$AR" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +AR=$ac_cv_path_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +if test "x$AR" = "x:"; then + { as_fn_set_status aborting. +as_fn_error "Configure could not find the library archiver" "$LINENO" 5; } +fi + +if test "x$RANLIB" != "x:"; then + LIBCOMMAND="$AR cr" +else + LIBCOMMAND="$AR crs" +fi + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@ifdef __STDC__ +@%:@ include +@%:@else +@%:@ include +@%:@endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "@%:@define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if test "${ac_cv_c_bigendian+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + $as_echo "@%:@define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +$as_echo "@%:@define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 +$as_echo_n "checking size of short... " >&6; } +if test "${ac_cv_sizeof_short+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_short" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (short) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_short=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 +$as_echo "$ac_cv_sizeof_short" >&6; } + + + +cat >>confdefs.h <<_ACEOF +@%:@define SIZEOF_SHORT $ac_cv_sizeof_short +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if test "${ac_cv_sizeof_int+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (int) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_int=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +@%:@define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if test "${ac_cv_sizeof_long+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (long) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +@%:@define SIZEOF_LONG $ac_cv_sizeof_long +_ACEOF + + +if test $ac_cv_sizeof_short -eq 2; then + $as_echo "@%:@define U16 unsigned short" >>confdefs.h + +fi +if test $ac_cv_sizeof_int -eq 4; then + $as_echo "@%:@define U32 unsigned" >>confdefs.h + +else + if test $ac_cv_sizeof_long -eq 4; then + $as_echo "@%:@define U32 unsigned long" >>confdefs.h + + fi +fi +if test $ac_cv_sizeof_int -eq 8; then + $as_echo "@%:@define U64 unsigned" >>confdefs.h + +else + if test $ac_cv_sizeof_long -eq 8; then + $as_echo "@%:@define U64 unsigned long" >>confdefs.h + + fi +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler recognizes bool as a built-in type" >&5 +$as_echo_n "checking whether the compiler recognizes bool as a built-in type... " >&6; } +if test "${ac_cv_cxx_bool+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + int f(int x){return 1;} + int f(char x){return 1;} + int f(bool x){return 1;} + +int +main () +{ + + bool b = true; + return f(b); + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_cxx_bool=yes +else + ac_cv_cxx_bool=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_bool" >&5 +$as_echo "$ac_cv_cxx_bool" >&6; } + +if test "$ac_cv_cxx_bool" != yes; then + CXXFLAGS="-Dbool=char -Dfalse=0 -Dtrue=1 $CXXFLAGS" +fi + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do + as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 +$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include <$ac_hdr> + +int +main () +{ +if ((DIR *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$as_ac_Header=yes" +else + eval "$as_ac_Header=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$as_ac_Header + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +_ACEOF + +ac_header_dirent=$ac_hdr; break +fi + +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dir; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : + +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' x; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : + +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +fi + +ac_fn_c_check_header_mongrel "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_select_h" = x""yes; then : + $as_echo "@%:@define HAVE_SYS_SELECT_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/stdtypes.h" "ac_cv_header_sys_stdtypes_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_stdtypes_h" = x""yes; then : + $as_echo "@%:@define HAVE_SYS_SELECT_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_func "$LINENO" "scandir" "ac_cv_func_scandir" +if test "x$ac_cv_func_scandir" = x""yes; then : + if test "x$uname" = xSunOS -o "x$uname" = xQNX; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using $uname scandir emulation function." >&5 +$as_echo "$as_me: WARNING: Not using $uname scandir emulation function." >&2;} + else + $as_echo "@%:@define HAVE_SCANDIR 1" >>confdefs.h + + fi +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have the POSIX compatible scandir() prototype" >&5 +$as_echo_n "checking whether we have the POSIX compatible scandir() prototype... " >&6; } +if test "${ac_cv_cxx_scandir_posix+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + int func (const char *d, dirent ***list, void *sort) { + int n = scandir(d, list, 0, (int(*)(const dirent **, const dirent **))sort); + } + +int +main () +{ + + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_cxx_scandir_posix=yes +else + ac_cv_cxx_scandir_posix=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_scandir_posix" >&5 +$as_echo "$ac_cv_cxx_scandir_posix" >&6; } + +if test "$ac_cv_cxx_scandir_posix" = yes; then + $as_echo "@%:@define HAVE_SCANDIR_POSIX 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" +if test "x$ac_cv_func_vsnprintf" = x""yes; then : + + case "$uname" in + HP-UX*) + if test "$uversion" = "1020"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in vsnprintf function because you are running HP-UX 10.20." >&5 +$as_echo "$as_me: WARNING: Not using built-in vsnprintf function because you are running HP-UX 10.20." >&2;} + else + $as_echo "@%:@define HAVE_VSNPRINTF 1" >>confdefs.h + + fi + ;; + + OSF1*) + if test "$uversion" = "40"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in vsnprintf function because you are running Tru64 4.0." >&5 +$as_echo "$as_me: WARNING: Not using built-in vsnprintf function because you are running Tru64 4.0." >&2;} + else + $as_echo "@%:@define HAVE_VSNPRINTF 1" >>confdefs.h + + fi + ;; + + *) + $as_echo "@%:@define HAVE_VSNPRINTF 1" >>confdefs.h + + ;; + esac +fi + +ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" +if test "x$ac_cv_func_snprintf" = x""yes; then : + + case "$uname" in + HP-UX*) + if test "$uversion" = "1020"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in snprintf function because you are running HP-UX 10.20." >&5 +$as_echo "$as_me: WARNING: Not using built-in snprintf function because you are running HP-UX 10.20." >&2;} + else + $as_echo "@%:@define HAVE_SNPRINTF 1" >>confdefs.h + + fi + ;; + + OSF1*) + if test "$uversion" = "40"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in snprintf function because you are running Tru64 4.0." >&5 +$as_echo "$as_me: WARNING: Not using built-in snprintf function because you are running Tru64 4.0." >&2;} + else + $as_echo "@%:@define HAVE_SNPRINTF 1" >>confdefs.h + + fi + ;; + + *) + $as_echo "@%:@define HAVE_SNPRINTF 1" >>confdefs.h + + ;; + esac +fi + +ac_fn_c_check_header_mongrel "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" +if test "x$ac_cv_header_strings_h" = x""yes; then : + $as_echo "@%:@define HAVE_STRINGS_H 1" >>confdefs.h + +fi + + +for ac_func in strcasecmp strlcat strlcpy +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = x""yes; then : + $as_echo "@%:@define HAVE_LOCALE_H 1" >>confdefs.h + +fi + + +for ac_func in localeconv +do : + ac_fn_c_check_func "$LINENO" "localeconv" "ac_cv_func_localeconv" +if test "x$ac_cv_func_localeconv" = x""yes; then : + cat >>confdefs.h <<_ACEOF +@%:@define HAVE_LOCALECONV 1 +_ACEOF + +fi +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pow" >&5 +$as_echo_n "checking for library containing pow... " >&6; } +if test "${ac_cv_search_pow+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pow (); +int +main () +{ +return pow (); + ; + return 0; +} +_ACEOF +for ac_lib in '' m; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_pow=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_pow+set}" = set; then : + break +fi +done +if test "${ac_cv_search_pow+set}" = set; then : + +else + ac_cv_search_pow=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_pow" >&5 +$as_echo "$ac_cv_search_pow" >&6; } +ac_res=$ac_cv_search_pow +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +@%:@ Check whether --enable-largefile was given. +if test "${enable_largefile+set}" = set; then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +$as_echo_n "checking for special C compiler options needed for large files... " >&6; } +if test "${ac_cv_sys_largefile_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +@%:@define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +$as_echo "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if test "${ac_cv_sys_file_offset_bits+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +@%:@define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@define _FILE_OFFSET_BITS 64 +@%:@include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +@%:@define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +@%:@define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } +if test "${ac_cv_sys_large_files+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +@%:@define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@define _LARGE_FILES 1 +@%:@include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +@%:@define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +$as_echo "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +@%:@define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + fi +fi + + +LARGEFILE="" +if test x$enable_largefile = xyes; then + LARGEFILE="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE" + + if test x$ac_cv_sys_large_files = x1; then + LARGEFILE="$LARGEFILE -D_LARGE_FILES" + fi + + if test x$ac_cv_sys_file_offset_bits = x64; then + LARGEFILE="$LARGEFILE -D_FILE_OFFSET_BITS=64" + fi +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5 +$as_echo_n "checking for long long int... " >&6; } +if test "${ac_cv_c_long_long+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$GCC" = yes; then + ac_cv_c_long_long=yes + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +long long int i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_long_long=yes +else + ac_cv_c_long_long=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_long_long" >&5 +$as_echo "$ac_cv_c_long_long" >&6; } + +if test $ac_cv_c_long_long = yes; then + $as_echo "@%:@define HAVE_LONG_LONG 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "strtoll" "ac_cv_func_strtoll" +if test "x$ac_cv_func_strtoll" = x""yes; then : + $as_echo "@%:@define HAVE_STRTOLL 1" >>confdefs.h + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlsym" >&5 +$as_echo_n "checking for library containing dlsym... " >&6; } +if test "${ac_cv_search_dlsym+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlsym (); +int +main () +{ +return dlsym (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_dlsym=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_dlsym+set}" = set; then : + break +fi +done +if test "${ac_cv_search_dlsym+set}" = set; then : + +else + ac_cv_search_dlsym=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlsym" >&5 +$as_echo "$ac_cv_search_dlsym" >&6; } +ac_res=$ac_cv_search_dlsym +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + $as_echo "@%:@define HAVE_DLSYM 1" >>confdefs.h + +fi + +ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" +if test "x$ac_cv_header_dlfcn_h" = x""yes; then : + $as_echo "@%:@define HAVE_DLFCN_H 1" >>confdefs.h + +fi + + + +AUDIOLIBS="" + +case $uname in + CYGWIN* | MINGW*) + AUDIOLIBS="-lwinmm" + ;; + + Darwin*) + AUDIOLIBS="-framework CoreAudio" + ;; + + *) + ac_fn_c_check_header_mongrel "$LINENO" "alsa/asoundlib.h" "ac_cv_header_alsa_asoundlib_h" "$ac_includes_default" +if test "x$ac_cv_header_alsa_asoundlib_h" = x""yes; then : + $as_echo "@%:@define HAVE_ALSA_ASOUNDLIB_H 1" >>confdefs.h + + AUDIOLIBS="-lasound" +fi + + + ;; +esac + + + +SAVELIBS="$LIBS" +IMAGELIBS="" +STATICIMAGELIBS="" + + + + +# Handle the JPEG lib linking mode (use fltk local or system lib) +# If --enable-(resp. --disable-)localjpeg parameter is not set by user +# Then we check the JPEG lib usability, with result in sysjpeglib_ok variable +@%:@ Check whether --enable-localjpeg was given. +if test "${enable_localjpeg+set}" = set; then : + enableval=$enable_localjpeg; +fi + +# Check for System lib use if automatic mode or --disable-localjpeg is requested +sysjpeglib_ok=no +sysjpeginc_ok=no +if test x$enable_localjpeg != xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_CreateCompress in -ljpeg" >&5 +$as_echo_n "checking for jpeg_CreateCompress in -ljpeg... " >&6; } +if test "${ac_cv_lib_jpeg_jpeg_CreateCompress+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ljpeg $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char jpeg_CreateCompress (); +int +main () +{ +return jpeg_CreateCompress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_jpeg_jpeg_CreateCompress=yes +else + ac_cv_lib_jpeg_jpeg_CreateCompress=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_CreateCompress" >&5 +$as_echo "$ac_cv_lib_jpeg_jpeg_CreateCompress" >&6; } +if test "x$ac_cv_lib_jpeg_jpeg_CreateCompress" = x""yes; then : + ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" +if test "x$ac_cv_header_jpeglib_h" = x""yes; then : + sysjpeginc_ok=yes +fi + + + if test x$sysjpeginc_ok = xyes; then + sysjpeglib_ok=yes + fi +fi + +fi +# Now set the jpeg lib and include flags according to the requested mode and availability +if test x$enable_localjpeg = xyes -o x$sysjpeglib_ok = xno; then + JPEGINC="-I../jpeg" + JPEG="jpeg" + IMAGELIBS="-lfltk_jpeg $IMAGELIBS" + STATICIMAGELIBS="\$libdir/libfltk_jpeg.a $STATICIMAGELIBS" + $as_echo "@%:@define HAVE_LIBJPEG 1" >>confdefs.h + + #ac_cv_lib_jpeg_jpeg_CreateCompress=no # from ima: should not be necessary + # Finally, warn user if system lib was requested but not found + if test x$enable_localjpeg = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find system jpeg lib or header: choosing the local lib mode." >&5 +$as_echo "$as_me: WARNING: Cannot find system jpeg lib or header: choosing the local lib mode." >&2;} + fi +else + JPEGINC="" + JPEG="" + IMAGELIBS="-ljpeg $IMAGELIBS" + STATICIMAGELIBS="-ljpeg $STATICIMAGELIBS" + $as_echo "@%:@define HAVE_LIBJPEG 1" >>confdefs.h + +fi + +# Handle the ZLIB lib linking mode (use fltk local or system lib) +# If --enable-(resp. --disable-)localzlib parameter is not set by user +# Then we check the ZLIB lib usability, with result in syszlib_ok variable +@%:@ Check whether --enable-localzlib was given. +if test "${enable_localzlib+set}" = set; then : + enableval=$enable_localzlib; +fi + +# Check for System lib use if automatic mode or --disable-localzlib is requested +syszlib_ok=no +syszinc_ok=no +if test x$enable_localzlib != xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzgets in -lz" >&5 +$as_echo_n "checking for gzgets in -lz... " >&6; } +if test "${ac_cv_lib_z_gzgets+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gzgets (); +int +main () +{ +return gzgets (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_z_gzgets=yes +else + ac_cv_lib_z_gzgets=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzgets" >&5 +$as_echo "$ac_cv_lib_z_gzgets" >&6; } +if test "x$ac_cv_lib_z_gzgets" = x""yes; then : + ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = x""yes; then : + syszinc_ok=yes +fi + + + if test x$syszinc_ok = xyes; then + syszlib_ok=yes + fi +fi + +fi +# Now set the Z lib and include flags according to the requested mode and availability +if test x$enable_localzlib = xyes -o x$syszlib_ok = xno ; then + ZLIBINC="-I../zlib" + ZLIB="zlib" + LIBS="-lfltk_z $LIBS" + IMAGELIBS="-lfltk_z $IMAGELIBS" + STATICIMAGELIBS="\$libdir/libfltk_z.a $STATICIMAGELIBS" + $as_echo "@%:@define HAVE_LIBZ 1" >>confdefs.h + + ac_cv_lib_z_gzgets=no # fc: is still necessary ? + # Finally, warn user if system lib was requested but not found + if test x$enable_localzlib = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find system z lib or header: choosing the local lib mode." >&5 +$as_echo "$as_me: WARNING: Cannot find system z lib or header: choosing the local lib mode." >&2;} + fi +else + ZLIBINC="" + ZLIB="" + LIBS="-lz $LIBS" + IMAGELIBS="-lz $IMAGELIBS" + STATICIMAGELIBS="-lz $STATICIMAGELIBS" + $as_echo "@%:@define HAVE_LIBZ 1" >>confdefs.h + +fi + +# Handle the PNG lib linking mode (use fltk local or system lib) +# If --enable-(resp. --disable-)localpng parameter is not set by user +# Then we check the png lib usability with result in syspng_lib variable +@%:@ Check whether --enable-localpng was given. +if test "${enable_localpng+set}" = set; then : + enableval=$enable_localpng; +fi + + +# Now check if system lib is usable, we check Lib AND include availability with inc variant, +# but only, if the builtin lib is not requested +syspnglib_ok=no +syspnginc_ok=no +if test x$enable_localpng != xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_read_info in -lpng" >&5 +$as_echo_n "checking for png_read_info in -lpng... " >&6; } +if test "${ac_cv_lib_png_png_read_info+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char png_read_info (); +int +main () +{ +return png_read_info (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_png_png_read_info=yes +else + ac_cv_lib_png_png_read_info=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_read_info" >&5 +$as_echo "$ac_cv_lib_png_png_read_info" >&6; } +if test "x$ac_cv_lib_png_png_read_info" = x""yes; then : + ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" +if test "x$ac_cv_header_png_h" = x""yes; then : + $as_echo "@%:@define HAVE_PNG_H 1" >>confdefs.h + + syspnginc_ok=yes +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "libpng/png.h" "ac_cv_header_libpng_png_h" "$ac_includes_default" +if test "x$ac_cv_header_libpng_png_h" = x""yes; then : + $as_echo "@%:@define HAVE_LIBPNG_PNG_H 1" >>confdefs.h + + syspnginc_ok=yes +fi + + + if test x$syspnginc_ok = xyes; then + syspnglib_ok=yes + fi +fi + +fi + +# The following is executed if the lib was not found usable or if local lib is required explicitly +if test x$enable_localpng = xyes -o x$syspnglib_ok = xno ; then + PNGINC="-I../png" + PNG="png" + IMAGELIBS="-lfltk_png $IMAGELIBS" + STATICIMAGELIBS="\$libdir/libfltk_png.a $STATICIMAGELIBS" + $as_echo "@%:@define HAVE_LIBPNG 1" >>confdefs.h + + $as_echo "@%:@define HAVE_PNG_H 1" >>confdefs.h + + $as_echo "@%:@define HAVE_PNG_GET_VALID 1" >>confdefs.h + + $as_echo "@%:@define HAVE_PNG_SET_TRNS_TO_ALPHA 1" >>confdefs.h + + # Finally, warn user if system lib was requested but not found + if test x$enable_localpng = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find system png lib or header: choosing the local lib mode." >&5 +$as_echo "$as_me: WARNING: Cannot find system png lib or header: choosing the local lib mode." >&2;} + fi +else + PNGINC="" + PNG="" + IMAGELIBS="-lpng $IMAGELIBS" + STATICIMAGELIBS="-lpng $STATICIMAGELIBS" + $as_echo "@%:@define HAVE_LIBPNG 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_get_valid in -lpng" >&5 +$as_echo_n "checking for png_get_valid in -lpng... " >&6; } +if test "${ac_cv_lib_png_png_get_valid+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char png_get_valid (); +int +main () +{ +return png_get_valid (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_png_png_get_valid=yes +else + ac_cv_lib_png_png_get_valid=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_get_valid" >&5 +$as_echo "$ac_cv_lib_png_png_get_valid" >&6; } +if test "x$ac_cv_lib_png_png_get_valid" = x""yes; then : + $as_echo "@%:@define HAVE_PNG_GET_VALID 1" >>confdefs.h + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_set_tRNS_to_alpha in -lpng" >&5 +$as_echo_n "checking for png_set_tRNS_to_alpha in -lpng... " >&6; } +if test "${ac_cv_lib_png_png_set_tRNS_to_alpha+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char png_set_tRNS_to_alpha (); +int +main () +{ +return png_set_tRNS_to_alpha (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_png_png_set_tRNS_to_alpha=yes +else + ac_cv_lib_png_png_set_tRNS_to_alpha=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_set_tRNS_to_alpha" >&5 +$as_echo "$ac_cv_lib_png_png_set_tRNS_to_alpha" >&6; } +if test "x$ac_cv_lib_png_png_set_tRNS_to_alpha" = x""yes; then : + $as_echo "@%:@define HAVE_PNG_SET_TRNS_TO_ALPHA 1" >>confdefs.h + +fi + +fi + + + + + + + + +LIBS="$SAVELIBS" + + + +have_pthread=no +PTHREAD_FLAGS="" + +if test "x$enable_threads" = xyes; then + ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_h" = x""yes; then : + $as_echo "@%:@define HAVE_PTHREAD_H 1" >>confdefs.h + +fi + + + + if test x$ac_cv_header_pthread_h = xyes; then + for flag in -lpthreads -lpthread -pthread; do + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create using $flag" >&5 +$as_echo_n "checking for pthread_create using $flag... " >&6; } + SAVELIBS="$LIBS" + LIBS="$flag $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +pthread_create(0, 0, 0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + have_pthread=yes +else + LIBS="$SAVELIBS" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_pthread" >&5 +$as_echo "$have_pthread" >&6; } + + if test $have_pthread = yes; then + $as_echo "@%:@define HAVE_PTHREAD 1" >>confdefs.h + + PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT" + + # Solaris requires -D_POSIX_PTHREAD_SEMANTICS to + # be POSIX-compliant... :( + if test $uname = SunOS; then + PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS" + fi + break + fi + done + fi +fi + + + +HLINKS= +POSTBUILD=: +OSX_ONLY=: +THREADS= + + +@%:@ Check whether --with-links was given. +if test "${with_links+set}" = set; then : + withval=$with_links; +fi + + +INSTALL_DESKTOP="" +UNINSTALL_DESKTOP="" + +case $uname in + CYGWIN* | MINGW*) + # Recent versions of Cygwin are seriously broken and the size + # checks don't work because the shell puts out \r\n instead of + # \n. Here we just force U32 to be defined to "unsigned"... + $as_echo "@%:@define U32 unsigned" >>confdefs.h + + CFLAGS="-mwindows -DWIN32 $CFLAGS" + CXXFLAGS="-mwindows -DWIN32 $CXXFLAGS" + LDFLAGS="-mwindows $LDFLAGS" + DSOFLAGS="-mwindows $DSOFLAGS" + LIBS="$LIBS -lole32 -luuid -lcomctl32 -lwsock32" + if test "x$with_optim" = x; then + with_optim="-O3" + fi + + if test x$enable_gl != xno; then + ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_gl_h" = x""yes; then : + $as_echo "@%:@define HAVE_GL 1" >>confdefs.h + + GLLIB="-lopengl32" +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_glu_h" = x""yes; then : + $as_echo "@%:@define HAVE_GL_GLU_H 1" >>confdefs.h + + GLLIB="-lglu32 $GLLIB" +fi + + + else + LINKFLTKGL="" + GLLIBNAME="" + GLDSONAME="" + GLDEMOS="" + fi + + if test "x$enable_threads" = xyes; then + if test x$have_pthread = xyes; then + $as_echo "@%:@define HAVE_PTHREAD 1" >>confdefs.h + + fi + + THREADS="threads.exe" + fi + + # Don't make symlinks since Windows is not case sensitive. + if test "x$with_links" != xyes; then + HLINKS="#" + fi + ;; + + Darwin*) + # MacOS X uses Carbon for graphics... + LIBS="$LIBS -framework Carbon -framework ApplicationServices" + + if test x$have_pthread = xyes; then + $as_echo "@%:@define HAVE_PTHREAD 1" >>confdefs.h + + THREADS="threads" + fi + + if test x$enable_gl != xno; then + $as_echo "@%:@define HAVE_GL 1" >>confdefs.h + + $as_echo "@%:@define HAVE_GL_GLU_H 1" >>confdefs.h + + GLLIB="-framework AGL -framework OpenGL" + else + LINKFLTKGL="" + GLLIBNAME="" + GLDSONAME="" + GLDEMOS="" + fi + + # Don't make symlinks because HFS+ is not case sensitive... + if test "x$with_links" != xyes; then + HLINKS="#" + fi + + # Add a postbuild step after linking applications + POSTBUILD="/Developer/Tools/Rez -t APPL -o" + + # Some steps are only done for OS X package management + OSX_ONLY= + + # Install/Uninstall FLUID application + INSTALL_DESKTOP="install-osx" + UNINSTALL_DESKTOP="uninstall-osx" + ;; + + *) + # All others are UNIX/X11... + if test x$have_pthread = xyes; then + $as_echo "@%:@define HAVE_PTHREAD 1" >>confdefs.h + + THREADS="threads" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 +$as_echo_n "checking for X... " >&6; } + + +@%:@ Check whether --with-x was given. +if test "${with_x+set}" = set; then : + withval=$with_x; +fi + +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + case $x_includes,$x_libraries in #( + *\'*) as_fn_error "cannot use X directory names containing '" "$LINENO" 5;; #( + *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -f -r conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + cat >Imakefile <<'_ACEOF' +incroot: + @echo incroot='${INCROOT}' +usrlibdir: + @echo usrlibdir='${USRLIBDIR}' +libdir: + @echo libdir='${LIBDIR}' +_ACEOF + if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + for ac_var in incroot usrlibdir libdir; do + eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" + done + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl dylib la dll; do + if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && + test -f "$ac_im_libdir/libX11.$ac_extension"; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ac_x_includes= ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /usr/lib64 | /lib | /lib64) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -f -r conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R7/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R7 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R7/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R7 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Xlib.h. + # First, try using that file with no special directory specified. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # We can compile using X headers with no special include directory. +ac_x_includes= +else + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Xlib.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lX11 $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +@%:@include +int +main () +{ +XrmInitialize () + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + LIBS=$ac_save_LIBS +for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl dylib la dll; do + if test -r "$ac_dir/libX11.$ac_extension"; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +case $ac_x_includes,$ac_x_libraries in #( + no,* | *,no | *\'*) + # Didn't find X, or a directory has "'" in its name. + ac_cv_have_x="have_x=no";; #( + *) + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$ac_x_includes'\ + ac_x_libraries='$ac_x_libraries'" +esac +fi +;; #( + *) have_x=yes;; + esac + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 +$as_echo "$have_x" >&6; } + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$x_includes'\ + ac_x_libraries='$x_libraries'" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 +$as_echo "libraries $x_libraries, headers $x_includes" >&6; } +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +$as_echo "@%:@define X_DISPLAY_MISSING 1" >>confdefs.h + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 +$as_echo_n "checking whether -R must be followed by a space... " >&6; } + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + ac_xsave_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + X_LIBS="$X_LIBS -R$x_libraries" +else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + X_LIBS="$X_LIBS -R $x_libraries" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 +$as_echo "neither works" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_c_werror_flag=$ac_xsave_c_werror_flag + LIBS=$ac_xsave_LIBS + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XOpenDisplay (); +int +main () +{ +return XOpenDisplay (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } +if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_dnet_ntoa=yes +else + ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } +if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = x""yes; then : + +fi + + if test $ac_cv_func_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyname=yes +else + ac_cv_lib_nsl_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 +$as_echo_n "checking for gethostbyname in -lbsd... " >&6; } +if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bsd_gethostbyname=yes +else + ac_cv_lib_bsd_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 +$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } +if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" +if test "x$ac_cv_func_connect" = x""yes; then : + +fi + + if test $ac_cv_func_connect = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 +$as_echo_n "checking for connect in -lsocket... " >&6; } +if test "${ac_cv_lib_socket_connect+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char connect (); +int +main () +{ +return connect (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_connect=yes +else + ac_cv_lib_socket_connect=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 +$as_echo "$ac_cv_lib_socket_connect" >&6; } +if test "x$ac_cv_lib_socket_connect" = x""yes; then : + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" +if test "x$ac_cv_func_remove" = x""yes; then : + +fi + + if test $ac_cv_func_remove = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 +$as_echo_n "checking for remove in -lposix... " >&6; } +if test "${ac_cv_lib_posix_remove+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char remove (); +int +main () +{ +return remove (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_posix_remove=yes +else + ac_cv_lib_posix_remove=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 +$as_echo "$ac_cv_lib_posix_remove" >&6; } +if test "x$ac_cv_lib_posix_remove" = x""yes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" +if test "x$ac_cv_func_shmat" = x""yes; then : + +fi + + if test $ac_cv_func_shmat = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 +$as_echo_n "checking for shmat in -lipc... " >&6; } +if test "${ac_cv_lib_ipc_shmat+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shmat (); +int +main () +{ +return shmat (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ipc_shmat=yes +else + ac_cv_lib_ipc_shmat=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 +$as_echo "$ac_cv_lib_ipc_shmat" >&6; } +if test "x$ac_cv_lib_ipc_shmat" = x""yes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 +$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } +if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char IceConnectionNumber (); +int +main () +{ +return IceConnectionNumber (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ICE_IceConnectionNumber=yes +else + ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } +if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then : + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + + + if test x$no_x = xyes; then + { as_fn_set_status aborting. +as_fn_error "Configure could not find required X11 libraries" "$LINENO" 5; } + fi + + if test "x$X_PRE_LIBS" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring libraries \"$X_PRE_LIBS\" requested by configure." >&5 +$as_echo "$as_me: WARNING: Ignoring libraries \"$X_PRE_LIBS\" requested by configure." >&2;} + fi + + LIBS="$LIBS -lXext -lX11 $X_EXTRA_LIBS" + CFLAGS="$CFLAGS $X_CFLAGS" + CXXFLAGS="$CXXFLAGS $X_CFLAGS" + LDFLAGS="$X_LIBS $LDFLAGS" + DSOFLAGS="$X_LIBS $DSOFLAGS" + + if test "x$x_includes" != x; then + ac_cpp="$ac_cpp -I$x_includes" + fi + + GLLIB= + + if test x$enable_gl != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 +$as_echo_n "checking for library containing dlopen... " >&6; } +if test "${ac_cv_search_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_dlopen=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_dlopen+set}" = set; then : + break +fi +done +if test "${ac_cv_search_dlopen+set}" = set; then : + +else + ac_cv_search_dlopen=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 +$as_echo "$ac_cv_search_dlopen" >&6; } +ac_res=$ac_cv_search_dlopen +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_gl_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXMakeCurrent in -lGL" >&5 +$as_echo_n "checking for glXMakeCurrent in -lGL... " >&6; } +if test "${ac_cv_lib_GL_glXMakeCurrent+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lGL -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char glXMakeCurrent (); +int +main () +{ +return glXMakeCurrent (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_GL_glXMakeCurrent=yes +else + ac_cv_lib_GL_glXMakeCurrent=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glXMakeCurrent" >&5 +$as_echo "$ac_cv_lib_GL_glXMakeCurrent" >&6; } +if test "x$ac_cv_lib_GL_glXMakeCurrent" = x""yes; then : + $as_echo "@%:@define HAVE_GL 1" >>confdefs.h + GLLIB="-lGL" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXMakeCurrent in -lMesaGL" >&5 +$as_echo_n "checking for glXMakeCurrent in -lMesaGL... " >&6; } +if test "${ac_cv_lib_MesaGL_glXMakeCurrent+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lMesaGL -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char glXMakeCurrent (); +int +main () +{ +return glXMakeCurrent (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_MesaGL_glXMakeCurrent=yes +else + ac_cv_lib_MesaGL_glXMakeCurrent=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_MesaGL_glXMakeCurrent" >&5 +$as_echo "$ac_cv_lib_MesaGL_glXMakeCurrent" >&6; } +if test "x$ac_cv_lib_MesaGL_glXMakeCurrent" = x""yes; then : + $as_echo "@%:@define HAVE_GL 1" >>confdefs.h + GLLIB=" -lMesaGL" +fi + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXGetProcAddressARB in -lGL" >&5 +$as_echo_n "checking for glXGetProcAddressARB in -lGL... " >&6; } +if test "${ac_cv_lib_GL_glXGetProcAddressARB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lGL -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char glXGetProcAddressARB (); +int +main () +{ +return glXGetProcAddressARB (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_GL_glXGetProcAddressARB=yes +else + ac_cv_lib_GL_glXGetProcAddressARB=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glXGetProcAddressARB" >&5 +$as_echo "$ac_cv_lib_GL_glXGetProcAddressARB" >&6; } +if test "x$ac_cv_lib_GL_glXGetProcAddressARB" = x""yes; then : + $as_echo "@%:@define HAVE_GLXGETPROCADDRESSARB 1" >>confdefs.h + +fi + + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_glu_h" = x""yes; then : + $as_echo "@%:@define HAVE_GL_GLU_H 1" >>confdefs.h + + if test x$ac_cv_lib_GL_glXMakeCurrent = xyes; then + GLLIB="-lGLU $GLLIB" + fi + if test x$ac_cv_lib_MesaGL_glXMakeCurrent = xyes; then + GLLIB="-lMesaGLU $GLLIB" + fi + +fi + + + + if test x$ac_cv_lib_GL_glXMakeCurrent != xyes -a x$ac_cv_lib_MesaGL_glXMakeCurrent != xyes; then + LINKFLTKGL="" + GLLIBNAME="" + GLDSONAME="" + GLDEMOS="" + fi + else + LINKFLTKGL="" + GLLIBNAME="" + GLDSONAME="" + GLDEMOS="" + fi + + @%:@ Check whether --enable-xinerama was given. +if test "${enable_xinerama+set}" = set; then : + enableval=$enable_xinerama; +fi + + + if test x$enable_xinerama = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XineramaIsActive in -lXinerama" >&5 +$as_echo_n "checking for XineramaIsActive in -lXinerama... " >&6; } +if test "${ac_cv_lib_Xinerama_XineramaIsActive+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXinerama $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XineramaIsActive (); +int +main () +{ +return XineramaIsActive (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_Xinerama_XineramaIsActive=yes +else + ac_cv_lib_Xinerama_XineramaIsActive=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xinerama_XineramaIsActive" >&5 +$as_echo "$ac_cv_lib_Xinerama_XineramaIsActive" >&6; } +if test "x$ac_cv_lib_Xinerama_XineramaIsActive" = x""yes; then : + $as_echo "@%:@define HAVE_XINERAMA 1" >>confdefs.h + + LIBS="-lXinerama $LIBS" +fi + + fi + + @%:@ Check whether --enable-xft was given. +if test "${enable_xft+set}" = set; then : + enableval=$enable_xft; +fi + + + if test x$enable_xft = xyes; then + # Extract the first word of "freetype-config", so it can be a program name with args. +set dummy freetype-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_FTCONFIG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $FTCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_FTCONFIG="$FTCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_FTCONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +FTCONFIG=$ac_cv_path_FTCONFIG +if test -n "$FTCONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FTCONFIG" >&5 +$as_echo "$FTCONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + if test "x$FTCONFIG" != x; then + CPPFLAGS="`$FTCONFIG --cflags` $CPPFLAGS" + CXXFLAGS="`$FTCONFIG --cflags` $CXXFLAGS" + + ac_fn_c_check_header_mongrel "$LINENO" "X11/Xft/Xft.h" "ac_cv_header_X11_Xft_Xft_h" "$ac_includes_default" +if test "x$ac_cv_header_X11_Xft_Xft_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XftDrawCreate in -lXft" >&5 +$as_echo_n "checking for XftDrawCreate in -lXft... " >&6; } +if test "${ac_cv_lib_Xft_XftDrawCreate+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXft $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XftDrawCreate (); +int +main () +{ +return XftDrawCreate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_Xft_XftDrawCreate=yes +else + ac_cv_lib_Xft_XftDrawCreate=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xft_XftDrawCreate" >&5 +$as_echo "$ac_cv_lib_Xft_XftDrawCreate" >&6; } +if test "x$ac_cv_lib_Xft_XftDrawCreate" = x""yes; then : + $as_echo "@%:@define USE_XFT 1" >>confdefs.h + + LIBS="-lXft $LIBS" +fi + +fi + + + fi + fi + + @%:@ Check whether --enable-xdbe was given. +if test "${enable_xdbe+set}" = set; then : + enableval=$enable_xdbe; +fi + + + if test x$enable_xdbe = xyes; then + ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xdbe.h" "ac_cv_header_X11_extensions_Xdbe_h" "#include +" +if test "x$ac_cv_header_X11_extensions_Xdbe_h" = x""yes; then : + $as_echo "@%:@define HAVE_XDBE 1" >>confdefs.h + +fi + + + fi + + # Extract the first word of "xprop", so it can be a program name with args. +set dummy xprop; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_XPROP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $XPROP in + [\\/]* | ?:[\\/]*) + ac_cv_path_XPROP="$XPROP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_XPROP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +XPROP=$ac_cv_path_XPROP +if test -n "$XPROP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPROP" >&5 +$as_echo "$XPROP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X overlay visuals" >&5 +$as_echo_n "checking for X overlay visuals... " >&6; } +if test "${ac_cv_have_overlay+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "x$XPROP" != x; then + if $XPROP -root 2>/dev/null | grep -c "SERVER_OVERLAY_VISUALS" >/dev/null; then + ac_cv_have_overlay=yes + else + ac_cv_have_overlay=no + fi + else + ac_cv_have_overlay=no + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_overlay" >&5 +$as_echo "$ac_cv_have_overlay" >&6; } + + if test x$ac_cv_have_overlay = xyes; then + $as_echo "@%:@define HAVE_OVERLAY 1" >>confdefs.h + + fi + + # Make symlinks since UNIX/Linux is case sensitive. + if test "x$with_links" = xno; then + HLINKS="#" + fi + + # Install/Uninstall FLUID application support files + INSTALL_DESKTOP="install-linux" + UNINSTALL_DESKTOP="uninstall-linux" + ;; +esac + + + + + + + + + + + +case "$uname" in + *BSD* | Darwin*) + # *BSD + CAT1EXT=0 + CAT3EXT=0 + CAT6EXT=0 + ;; + IRIX*) + # SGI IRIX + CAT1EXT=z + CAT3EXT=z + CAT6EXT=z + ;; + *) + # All others + CAT1EXT=1 + CAT3EXT=3 + CAT6EXT=6 + ;; +esac + + + + + +if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/usr"; then + case "$uname" in + *BSD* | Darwin* | Linux*) + # *BSD, Darwin, and Linux + mandir="\${prefix}/share/man" + ;; + IRIX*) + # SGI IRIX + mandir="\${prefix}/share/catman" + ;; + esac +fi + +if test "$prefix" = NONE; then + prefix=/usr/local +fi + +if test "$exec_prefix" = NONE; then + exec_prefix="\${prefix}" +fi + +if test "$uname" = "IRIX" -a $uversion -ge 62 -a "$libdir" = "\${exec_prefix}/lib" -a "$exec_prefix" = "\${prefix}" -a "$prefix" = "/usr"; then + libdir="/usr/lib32" +fi + +MAKEDEPEND="\$(CXX) -M" + + + +if test -n "$GCC"; then + # Show all standard warnings + unused variables, conversion errors, + # and inlining problems when compiling... + OPTIM="-Wall -Wunused -Wno-format-y2k $OPTIM" + + # The following additional warnings are useful for tracking down problems... + #OPTIM="-Wshadow -Wconversion $OPTIM" + + # We know that Carbon is deprecated on OS X 10.4. To avoid hundreds of warnings + # we will temporarily disable 'deprecated' warnings on OS X. + if test "$uname" = "Darwin" -a $uversion -ge 800; then + OPTIM="-Wno-deprecated-declarations $OPTIM" + fi + + # Set the default compiler optimizations... + if test -z "$DEBUGFLAG"; then + # + # Note: Can't use -fomit-frame-pointer - prevents tools like + # libsafe from working! + # + # Don't use -fforce-mem, -fforce-addr, or -fcaller-saves. + # They all seem to make either no difference or enlarge + # the code by a few hundred bytes. + # + # "-Os" seems to be the best compromise between speed and + # code size. "-O3" and higher seem to make no effective + # difference in the speed of the code, but does bloat the + # library 10+%. + # + + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-Os $OPTIM" + fi + fi + + # Generate position-independent code when needed... + if test $PICFLAG = 1; then + OPTIM="$OPTIM -fPIC" + fi + + # See if GCC supports -fno-exceptions... + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fno-exceptions" >&5 +$as_echo_n "checking if GCC supports -fno-exceptions... " >&6; } + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-exceptions" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + OPTIM="$OPTIM -fno-exceptions" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$OLDCFLAGS" + + # See if GCC supports -fno-strict-aliasing... + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fno-strict-aliasing" >&5 +$as_echo_n "checking if GCC supports -fno-strict-aliasing... " >&6; } + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-strict-aliasing" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + OPTIM="$OPTIM -fno-strict-aliasing" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$OLDCFLAGS" + + # See if we are running Solaris; if so, try the -fpermissive option... + # This option is required on some versions of Solaris to work around + # bugs in the X headers up through Solaris 7. + # + # Unlike the other compiler/optimization settings, this one is placed + # in CFLAGS and CXXFLAGS so that fltk-config will provide the option + # to clients - otherwise client apps will not compile properly... + if test "$uname" = SunOS; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fpermissive" >&5 +$as_echo_n "checking if GCC supports -fpermissive... " >&6; } + + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fpermissive" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + CXXFLAGS="$CXXFLAGS -fpermissive" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + CFLAGS="$OLDCFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi +else + case "$uname" in + IRIX*) + # Running some flavor of IRIX; see which version and + # set things up according... + if test "$uversion" -ge 62; then + # We are running IRIX 6.2 or higher; uncomment the following + # lines if you don't have IDO 7.2 or higher: + # + # CXX="CC -n32 -mips3" + # CC="cc -n32 -mips3" + # LD="ld -n32 -mips3" + # MAKEDEPEND="CC -M" + + if test "x`grep abi=n32 /etc/compiler.defaults`" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: FOR BEST RESULTS BEFORE COMPILING: setenv SGI_ABI \"-n32 -mips3\"" >&5 +$as_echo "$as_me: WARNING: FOR BEST RESULTS BEFORE COMPILING: setenv SGI_ABI \"-n32 -mips3\"" >&2;} + fi + + OPTIM="-fullwarn $OPTIM" + fi + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-O2 $OPTIM" + if test $uversion -gt 62; then + OPTIM="-OPT:Olimit=4000 $OPTIM" + fi + fi + fi + ;; + HP-UX*) + # Running HP-UX; these options should work for the HP compilers. + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="+O2 $OPTIM" + fi + fi + + if test $PICFLAG = 1; then + OPTIM="+z $OPTIM" + fi + + CXXFLAGS="$CXXFLAGS +W336,501,736,740,749,829" + ;; + OSF1*) + # Running Digital/Tru64 UNIX; these options should work for the + # Digital/Compaq/NewHP compilers. + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-O2 $OPTIM" + fi + fi + ;; + SunOS*) + # Solaris + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-xO3 $OPTIM" + fi + fi + + if test $PICFLAG = 1; then + OPTIM="-KPIC $OPTIM" + fi + ;; + AIX*) + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-O2 $OPTIM" + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The AIX C and C++ compilers are known not to correctly compile the FLTK library." >&5 +$as_echo "$as_me: WARNING: The AIX C and C++ compilers are known not to correctly compile the FLTK library." >&2;} + ;; + *) + # Running some other operating system; inform the user they + # should contribute the necessary options to fltk-bugs@fltk.org... + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building FLTK with default compiler optimizations" >&5 +$as_echo "$as_me: WARNING: Building FLTK with default compiler optimizations" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Contact fltk-bugs@fltk.org with uname and compiler options." >&5 +$as_echo "$as_me: WARNING: Contact fltk-bugs@fltk.org with uname and compiler options." >&2;} + ;; + esac +fi + +OPTIM="$DEBUGFLAG $OPTIM" + +if test x$prefix = xNONE; then + cat >>confdefs.h <<_ACEOF +@%:@define FLTK_DOCDIR "/usr/local/share/doc/fltk" +_ACEOF + +else + cat >>confdefs.h <<_ACEOF +@%:@define FLTK_DOCDIR "$prefix/share/doc/fltk" +_ACEOF + +fi + +if test x$prefix = xNONE; then + cat >>confdefs.h <<_ACEOF +@%:@define FLTK_DATADIR "/usr/local/share/fltk" +_ACEOF + +else + cat >>confdefs.h <<_ACEOF +@%:@define FLTK_DATADIR "$prefix/share/fltk" +_ACEOF + +fi + +echo "" +echo "Configuration Summary" +echo "-------------------------------------------------------------------------" + +case $uname in + CYGWIN* | MINGW*) + graphics="GDI" + ;; + Darwin*) + if test x$enable_quartz = xyes; then + graphics="Quartz" + else + graphics="Quickdraw" + fi + ;; + *) + graphics="X11" + if test x$enable_xft = xyes; then + graphics="$graphics+Xft" + fi + if test x$enable_xdbe = xyes; then + graphics="$graphics+Xdbe" + fi + if test x$enable_xinerama = xyes; then + graphics="$graphics+Xinerama" + fi + ;; +esac + +echo " Directories: prefix=$prefix" +echo " bindir=$bindir" +echo " datadir=$datadir" +echo " datarootdir=$datarootdir" +echo " exec_prefix=$exec_prefix" +echo " includedir=$includedir" +echo " libdir=$libdir" +echo " mandir=$mandir" +echo " Graphics: $graphics" + +if test x$JPEG = x; then + echo "Image Libraries: JPEG=System" +else + echo "Image Libraries: JPEG=Builtin" +fi +if test x$PNG = x; then + echo " PNG=System" +else + echo " PNG=Builtin" +fi +if test x$ZLIB = x; then + echo " ZLIB=System" +else + echo " ZLIB=Builtin" +fi + +if test x$enable_largefile = xyes; then + echo " Large Files: YES" +else + echo " Large Files: NO" +fi + +if test x$GLDEMOS = x; then + echo " OpenGL: NO" +else + echo " OpenGL: YES" +fi + +if test x$THREADS = x; then + echo " Threads: NO" +else + echo " Threads: YES" +fi + +ac_config_headers="$ac_config_headers config.h:configh.in" + +ac_config_files="$ac_config_files makeinclude fltk.list fltk-config fltk.spec FL/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIB@&t@OBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIB@&t@OBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in @%:@( + *posix*) : + set -o posix ;; @%:@( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in @%:@( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in @%:@(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +@%:@ as_fn_error ERROR [LINENO LOG_FD] +@%:@ --------------------------------- +@%:@ Output "`basename @S|@0`: error: ERROR" to stderr. If LINENO and LOG_FD are +@%:@ provided, also output the error to LOG_FD, referencing LINENO. Then exit the +@%:@ script with status @S|@?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} @%:@ as_fn_error + + +@%:@ as_fn_set_status STATUS +@%:@ ----------------------- +@%:@ Set @S|@? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} @%:@ as_fn_set_status + +@%:@ as_fn_exit STATUS +@%:@ ----------------- +@%:@ Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} @%:@ as_fn_exit + +@%:@ as_fn_unset VAR +@%:@ --------------- +@%:@ Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +@%:@ as_fn_append VAR VALUE +@%:@ ---------------------- +@%:@ Append the text in VALUE to the end of the definition contained in VAR. Take +@%:@ advantage of any shell optimizations that allow amortized linear growth over +@%:@ repeated appends, instead of the typical quadratic growth present in naive +@%:@ implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +@%:@ as_fn_arith ARG... +@%:@ ------------------ +@%:@ Perform arithmetic evaluation on the ARGs, and store the result in the +@%:@ global @S|@as_val. Take advantage of shells that can avoid forks. The arguments +@%:@ must be portable across @S|@(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in @%:@((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +@%:@ as_fn_mkdir_p +@%:@ ------------- +@%:@ Create "@S|@as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} @%:@ as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in @%:@( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in @%:@(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by $as_me, which was +generated by GNU Autoconf 2.65. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.65, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2009 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../@%:@@%:@ /;s/...$/ @%:@@%:@/;p;x;p;x' <<_ASBOX +@%:@@%:@ Running $as_me. @%:@@%:@ +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:configh.in" ;; + "makeinclude") CONFIG_FILES="$CONFIG_FILES makeinclude" ;; + "fltk.list") CONFIG_FILES="$CONFIG_FILES fltk.list" ;; + "fltk-config") CONFIG_FILES="$CONFIG_FILES fltk-config" ;; + "fltk.spec") CONFIG_FILES="$CONFIG_FILES fltk.spec" ;; + "FL/Makefile") CONFIG_FILES="$CONFIG_FILES FL/Makefile" ;; + + *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error "could not create -" "$LINENO" 5 + fi + ;; + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit $? +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +chmod +x fltk-config + diff --git a/third_party/windows/fltk-1.1.10/autom4te.cache/requests b/third_party/windows/fltk-1.1.10/autom4te.cache/requests new file mode 100644 index 0000000..1fc2c87 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/autom4te.cache/requests @@ -0,0 +1,67 @@ +# This file was generated by Autom4te Tue Nov 24 20:00:17 PST 2009. +# It contains the lists of macros which have been traced. +# It can be safely removed. + +@request = ( + bless( [ + '0', + 1, + [ + '/usr/share/autoconf' + ], + [ + '/usr/share/autoconf/autoconf/autoconf.m4f', + 'configure.in' + ], + { + '_LT_AC_TAGCONFIG' => 1, + 'AM_PROG_F77_C_O' => 1, + 'AC_INIT' => 1, + 'm4_pattern_forbid' => 1, + '_AM_COND_IF' => 1, + 'AC_CANONICAL_TARGET' => 1, + 'AC_SUBST' => 1, + 'AC_CONFIG_LIBOBJ_DIR' => 1, + 'AC_FC_SRCEXT' => 1, + 'AC_CANONICAL_HOST' => 1, + 'AC_PROG_LIBTOOL' => 1, + 'AM_INIT_AUTOMAKE' => 1, + 'AC_CONFIG_SUBDIRS' => 1, + 'AM_AUTOMAKE_VERSION' => 1, + 'LT_CONFIG_LTDL_DIR' => 1, + 'AC_REQUIRE_AUX_FILE' => 1, + 'AC_CONFIG_LINKS' => 1, + 'm4_sinclude' => 1, + 'LT_SUPPORTED_TAG' => 1, + 'AM_MAINTAINER_MODE' => 1, + 'AM_GNU_GETTEXT_INTL_SUBDIR' => 1, + '_m4_warn' => 1, + 'AM_PROG_CXX_C_O' => 1, + '_AM_COND_ENDIF' => 1, + 'AM_ENABLE_MULTILIB' => 1, + 'AM_SILENT_RULES' => 1, + 'AC_CONFIG_FILES' => 1, + 'include' => 1, + 'LT_INIT' => 1, + 'AM_GNU_GETTEXT' => 1, + 'AC_LIBSOURCE' => 1, + 'AM_PROG_FC_C_O' => 1, + 'AC_CANONICAL_BUILD' => 1, + 'AC_FC_FREEFORM' => 1, + 'AH_OUTPUT' => 1, + '_AM_SUBST_NOTMAKE' => 1, + 'AC_CONFIG_AUX_DIR' => 1, + 'sinclude' => 1, + 'm4_pattern_allow' => 1, + 'AM_PROG_CC_C_O' => 1, + 'AC_CANONICAL_SYSTEM' => 1, + 'AM_CONDITIONAL' => 1, + 'AC_CONFIG_HEADERS' => 1, + 'AC_DEFINE_TRACE_LITERAL' => 1, + 'm4_include' => 1, + '_AM_COND_ELSE' => 1, + 'AC_SUBST_TRACE' => 1 + } + ], 'Autom4te::Request' ) + ); + diff --git a/third_party/windows/fltk-1.1.10/autom4te.cache/traces.0 b/third_party/windows/fltk-1.1.10/autom4te.cache/traces.0 new file mode 100644 index 0000000..71edbcb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/autom4te.cache/traces.0 @@ -0,0 +1,722 @@ +m4trace:configure.in:34: -1- AC_INIT([src/Fl.cxx]) +m4trace:configure.in:34: -1- m4_pattern_forbid([^_?A[CHUM]_]) +m4trace:configure.in:34: -1- m4_pattern_forbid([_AC_]) +m4trace:configure.in:34: -1- m4_pattern_forbid([^LIBOBJS$], [do not use LIBOBJS directly, use AC_LIBOBJ (see section `AC_LIBOBJ vs LIBOBJS']) +m4trace:configure.in:34: -1- m4_pattern_allow([^AS_FLAGS$]) +m4trace:configure.in:34: -1- m4_pattern_forbid([^_?m4_]) +m4trace:configure.in:34: -1- m4_pattern_forbid([^dnl$]) +m4trace:configure.in:34: -1- m4_pattern_forbid([^_?AS_]) +m4trace:configure.in:34: -1- AC_SUBST([SHELL]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([SHELL]) +m4trace:configure.in:34: -1- m4_pattern_allow([^SHELL$]) +m4trace:configure.in:34: -1- AC_SUBST([PATH_SEPARATOR]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([PATH_SEPARATOR]) +m4trace:configure.in:34: -1- m4_pattern_allow([^PATH_SEPARATOR$]) +m4trace:configure.in:34: -1- AC_SUBST([PACKAGE_NAME], [m4_ifdef([AC_PACKAGE_NAME], ['AC_PACKAGE_NAME'])]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([PACKAGE_NAME]) +m4trace:configure.in:34: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.in:34: -1- AC_SUBST([PACKAGE_TARNAME], [m4_ifdef([AC_PACKAGE_TARNAME], ['AC_PACKAGE_TARNAME'])]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([PACKAGE_TARNAME]) +m4trace:configure.in:34: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.in:34: -1- AC_SUBST([PACKAGE_VERSION], [m4_ifdef([AC_PACKAGE_VERSION], ['AC_PACKAGE_VERSION'])]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([PACKAGE_VERSION]) +m4trace:configure.in:34: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.in:34: -1- AC_SUBST([PACKAGE_STRING], [m4_ifdef([AC_PACKAGE_STRING], ['AC_PACKAGE_STRING'])]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([PACKAGE_STRING]) +m4trace:configure.in:34: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.in:34: -1- AC_SUBST([PACKAGE_BUGREPORT], [m4_ifdef([AC_PACKAGE_BUGREPORT], ['AC_PACKAGE_BUGREPORT'])]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([PACKAGE_BUGREPORT]) +m4trace:configure.in:34: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.in:34: -1- AC_SUBST([PACKAGE_URL], [m4_ifdef([AC_PACKAGE_URL], ['AC_PACKAGE_URL'])]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([PACKAGE_URL]) +m4trace:configure.in:34: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.in:34: -1- AC_SUBST([exec_prefix], [NONE]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([exec_prefix]) +m4trace:configure.in:34: -1- m4_pattern_allow([^exec_prefix$]) +m4trace:configure.in:34: -1- AC_SUBST([prefix], [NONE]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([prefix]) +m4trace:configure.in:34: -1- m4_pattern_allow([^prefix$]) +m4trace:configure.in:34: -1- AC_SUBST([program_transform_name], [s,x,x,]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([program_transform_name]) +m4trace:configure.in:34: -1- m4_pattern_allow([^program_transform_name$]) +m4trace:configure.in:34: -1- AC_SUBST([bindir], ['${exec_prefix}/bin']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([bindir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^bindir$]) +m4trace:configure.in:34: -1- AC_SUBST([sbindir], ['${exec_prefix}/sbin']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([sbindir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^sbindir$]) +m4trace:configure.in:34: -1- AC_SUBST([libexecdir], ['${exec_prefix}/libexec']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([libexecdir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^libexecdir$]) +m4trace:configure.in:34: -1- AC_SUBST([datarootdir], ['${prefix}/share']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([datarootdir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^datarootdir$]) +m4trace:configure.in:34: -1- AC_SUBST([datadir], ['${datarootdir}']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([datadir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^datadir$]) +m4trace:configure.in:34: -1- AC_SUBST([sysconfdir], ['${prefix}/etc']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([sysconfdir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^sysconfdir$]) +m4trace:configure.in:34: -1- AC_SUBST([sharedstatedir], ['${prefix}/com']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([sharedstatedir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^sharedstatedir$]) +m4trace:configure.in:34: -1- AC_SUBST([localstatedir], ['${prefix}/var']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([localstatedir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^localstatedir$]) +m4trace:configure.in:34: -1- AC_SUBST([includedir], ['${prefix}/include']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([includedir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^includedir$]) +m4trace:configure.in:34: -1- AC_SUBST([oldincludedir], ['/usr/include']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([oldincludedir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^oldincludedir$]) +m4trace:configure.in:34: -1- AC_SUBST([docdir], [m4_ifset([AC_PACKAGE_TARNAME], + ['${datarootdir}/doc/${PACKAGE_TARNAME}'], + ['${datarootdir}/doc/${PACKAGE}'])]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([docdir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^docdir$]) +m4trace:configure.in:34: -1- AC_SUBST([infodir], ['${datarootdir}/info']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([infodir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^infodir$]) +m4trace:configure.in:34: -1- AC_SUBST([htmldir], ['${docdir}']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([htmldir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^htmldir$]) +m4trace:configure.in:34: -1- AC_SUBST([dvidir], ['${docdir}']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([dvidir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^dvidir$]) +m4trace:configure.in:34: -1- AC_SUBST([pdfdir], ['${docdir}']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([pdfdir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^pdfdir$]) +m4trace:configure.in:34: -1- AC_SUBST([psdir], ['${docdir}']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([psdir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^psdir$]) +m4trace:configure.in:34: -1- AC_SUBST([libdir], ['${exec_prefix}/lib']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([libdir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^libdir$]) +m4trace:configure.in:34: -1- AC_SUBST([localedir], ['${datarootdir}/locale']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([localedir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^localedir$]) +m4trace:configure.in:34: -1- AC_SUBST([mandir], ['${datarootdir}/man']) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([mandir]) +m4trace:configure.in:34: -1- m4_pattern_allow([^mandir$]) +m4trace:configure.in:34: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_NAME]) +m4trace:configure.in:34: -1- m4_pattern_allow([^PACKAGE_NAME$]) +m4trace:configure.in:34: -1- AH_OUTPUT([PACKAGE_NAME], [/* Define to the full name of this package. */ +@%:@undef PACKAGE_NAME]) +m4trace:configure.in:34: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_TARNAME]) +m4trace:configure.in:34: -1- m4_pattern_allow([^PACKAGE_TARNAME$]) +m4trace:configure.in:34: -1- AH_OUTPUT([PACKAGE_TARNAME], [/* Define to the one symbol short name of this package. */ +@%:@undef PACKAGE_TARNAME]) +m4trace:configure.in:34: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_VERSION]) +m4trace:configure.in:34: -1- m4_pattern_allow([^PACKAGE_VERSION$]) +m4trace:configure.in:34: -1- AH_OUTPUT([PACKAGE_VERSION], [/* Define to the version of this package. */ +@%:@undef PACKAGE_VERSION]) +m4trace:configure.in:34: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_STRING]) +m4trace:configure.in:34: -1- m4_pattern_allow([^PACKAGE_STRING$]) +m4trace:configure.in:34: -1- AH_OUTPUT([PACKAGE_STRING], [/* Define to the full name and version of this package. */ +@%:@undef PACKAGE_STRING]) +m4trace:configure.in:34: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_BUGREPORT]) +m4trace:configure.in:34: -1- m4_pattern_allow([^PACKAGE_BUGREPORT$]) +m4trace:configure.in:34: -1- AH_OUTPUT([PACKAGE_BUGREPORT], [/* Define to the address where bug reports for this package should be sent. */ +@%:@undef PACKAGE_BUGREPORT]) +m4trace:configure.in:34: -1- AC_DEFINE_TRACE_LITERAL([PACKAGE_URL]) +m4trace:configure.in:34: -1- m4_pattern_allow([^PACKAGE_URL$]) +m4trace:configure.in:34: -1- AH_OUTPUT([PACKAGE_URL], [/* Define to the home page for this package. */ +@%:@undef PACKAGE_URL]) +m4trace:configure.in:34: -1- AC_SUBST([DEFS]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([DEFS]) +m4trace:configure.in:34: -1- m4_pattern_allow([^DEFS$]) +m4trace:configure.in:34: -1- AC_SUBST([ECHO_C]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([ECHO_C]) +m4trace:configure.in:34: -1- m4_pattern_allow([^ECHO_C$]) +m4trace:configure.in:34: -1- AC_SUBST([ECHO_N]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([ECHO_N]) +m4trace:configure.in:34: -1- m4_pattern_allow([^ECHO_N$]) +m4trace:configure.in:34: -1- AC_SUBST([ECHO_T]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([ECHO_T]) +m4trace:configure.in:34: -1- m4_pattern_allow([^ECHO_T$]) +m4trace:configure.in:34: -1- AC_SUBST([LIBS]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.in:34: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.in:34: -1- AC_SUBST([build_alias]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([build_alias]) +m4trace:configure.in:34: -1- m4_pattern_allow([^build_alias$]) +m4trace:configure.in:34: -1- AC_SUBST([host_alias]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([host_alias]) +m4trace:configure.in:34: -1- m4_pattern_allow([^host_alias$]) +m4trace:configure.in:34: -1- AC_SUBST([target_alias]) +m4trace:configure.in:34: -1- AC_SUBST_TRACE([target_alias]) +m4trace:configure.in:34: -1- m4_pattern_allow([^target_alias$]) +m4trace:configure.in:42: -1- AC_SUBST([FL_MAJOR_VERSION]) +m4trace:configure.in:42: -1- AC_SUBST_TRACE([FL_MAJOR_VERSION]) +m4trace:configure.in:42: -1- m4_pattern_allow([^FL_MAJOR_VERSION$]) +m4trace:configure.in:43: -1- AC_SUBST([FL_MINOR_VERSION]) +m4trace:configure.in:43: -1- AC_SUBST_TRACE([FL_MINOR_VERSION]) +m4trace:configure.in:43: -1- m4_pattern_allow([^FL_MINOR_VERSION$]) +m4trace:configure.in:44: -1- AC_SUBST([FL_PATCH_VERSION]) +m4trace:configure.in:44: -1- AC_SUBST_TRACE([FL_PATCH_VERSION]) +m4trace:configure.in:44: -1- m4_pattern_allow([^FL_PATCH_VERSION$]) +m4trace:configure.in:45: -1- AC_SUBST([FL_API_VERSION]) +m4trace:configure.in:45: -1- AC_SUBST_TRACE([FL_API_VERSION]) +m4trace:configure.in:45: -1- m4_pattern_allow([^FL_API_VERSION$]) +m4trace:configure.in:67: -1- AC_SUBST([ARCHFLAGS]) +m4trace:configure.in:67: -1- AC_SUBST_TRACE([ARCHFLAGS]) +m4trace:configure.in:67: -1- m4_pattern_allow([^ARCHFLAGS$]) +m4trace:configure.in:68: -1- AC_SUBST([OPTIM]) +m4trace:configure.in:68: -1- AC_SUBST_TRACE([OPTIM]) +m4trace:configure.in:68: -1- m4_pattern_allow([^OPTIM$]) +m4trace:configure.in:119: -1- AC_SUBST([FLLIBNAME]) +m4trace:configure.in:119: -1- AC_SUBST_TRACE([FLLIBNAME]) +m4trace:configure.in:119: -1- m4_pattern_allow([^FLLIBNAME$]) +m4trace:configure.in:120: -1- AC_SUBST([GLDEMOS]) +m4trace:configure.in:120: -1- AC_SUBST_TRACE([GLDEMOS]) +m4trace:configure.in:120: -1- m4_pattern_allow([^GLDEMOS$]) +m4trace:configure.in:121: -1- AC_SUBST([GLLIBNAME]) +m4trace:configure.in:121: -1- AC_SUBST_TRACE([GLLIBNAME]) +m4trace:configure.in:121: -1- m4_pattern_allow([^GLLIBNAME$]) +m4trace:configure.in:122: -1- AC_SUBST([IMGLIBNAME]) +m4trace:configure.in:122: -1- AC_SUBST_TRACE([IMGLIBNAME]) +m4trace:configure.in:122: -1- m4_pattern_allow([^IMGLIBNAME$]) +m4trace:configure.in:123: -1- AC_SUBST([LIBEXT]) +m4trace:configure.in:123: -1- AC_SUBST_TRACE([LIBEXT]) +m4trace:configure.in:123: -1- m4_pattern_allow([^LIBEXT$]) +m4trace:configure.in:124: -1- AC_SUBST([LIBNAME]) +m4trace:configure.in:124: -1- AC_SUBST_TRACE([LIBNAME]) +m4trace:configure.in:124: -1- m4_pattern_allow([^LIBNAME$]) +m4trace:configure.in:125: -1- AC_SUBST([LINKFLTK]) +m4trace:configure.in:125: -1- AC_SUBST_TRACE([LINKFLTK]) +m4trace:configure.in:125: -1- m4_pattern_allow([^LINKFLTK$]) +m4trace:configure.in:126: -1- AC_SUBST([LINKFLTKFORMS]) +m4trace:configure.in:126: -1- AC_SUBST_TRACE([LINKFLTKFORMS]) +m4trace:configure.in:126: -1- m4_pattern_allow([^LINKFLTKFORMS$]) +m4trace:configure.in:127: -1- AC_SUBST([LINKFLTKGL]) +m4trace:configure.in:127: -1- AC_SUBST_TRACE([LINKFLTKGL]) +m4trace:configure.in:127: -1- m4_pattern_allow([^LINKFLTKGL$]) +m4trace:configure.in:128: -1- AC_SUBST([LINKFLTKIMG]) +m4trace:configure.in:128: -1- AC_SUBST_TRACE([LINKFLTKIMG]) +m4trace:configure.in:128: -1- m4_pattern_allow([^LINKFLTKIMG$]) +m4trace:configure.in:130: -1- AC_SUBST([LIBBASENAME]) +m4trace:configure.in:130: -1- AC_SUBST_TRACE([LIBBASENAME]) +m4trace:configure.in:130: -1- m4_pattern_allow([^LIBBASENAME$]) +m4trace:configure.in:131: -1- AC_SUBST([FLLIBBASENAME]) +m4trace:configure.in:131: -1- AC_SUBST_TRACE([FLLIBBASENAME]) +m4trace:configure.in:131: -1- m4_pattern_allow([^FLLIBBASENAME$]) +m4trace:configure.in:132: -1- AC_SUBST([GLLIBBASENAME]) +m4trace:configure.in:132: -1- AC_SUBST_TRACE([GLLIBBASENAME]) +m4trace:configure.in:132: -1- m4_pattern_allow([^GLLIBBASENAME$]) +m4trace:configure.in:133: -1- AC_SUBST([IMGLIBBASENAME]) +m4trace:configure.in:133: -1- AC_SUBST_TRACE([IMGLIBBASENAME]) +m4trace:configure.in:133: -1- m4_pattern_allow([^IMGLIBBASENAME$]) +m4trace:configure.in:265: -1- AC_SUBST([DSOCOMMAND]) +m4trace:configure.in:265: -1- AC_SUBST_TRACE([DSOCOMMAND]) +m4trace:configure.in:265: -1- m4_pattern_allow([^DSOCOMMAND$]) +m4trace:configure.in:266: -1- AC_SUBST([DSOFLAGS]) +m4trace:configure.in:266: -1- AC_SUBST_TRACE([DSOFLAGS]) +m4trace:configure.in:266: -1- m4_pattern_allow([^DSOFLAGS$]) +m4trace:configure.in:267: -1- AC_SUBST([DSOLINK]) +m4trace:configure.in:267: -1- AC_SUBST_TRACE([DSOLINK]) +m4trace:configure.in:267: -1- m4_pattern_allow([^DSOLINK$]) +m4trace:configure.in:268: -1- AC_SUBST([DSONAME]) +m4trace:configure.in:268: -1- AC_SUBST_TRACE([DSONAME]) +m4trace:configure.in:268: -1- m4_pattern_allow([^DSONAME$]) +m4trace:configure.in:269: -1- AC_SUBST([FLDSONAME]) +m4trace:configure.in:269: -1- AC_SUBST_TRACE([FLDSONAME]) +m4trace:configure.in:269: -1- m4_pattern_allow([^FLDSONAME$]) +m4trace:configure.in:270: -1- AC_SUBST([GLDSONAME]) +m4trace:configure.in:270: -1- AC_SUBST_TRACE([GLDSONAME]) +m4trace:configure.in:270: -1- m4_pattern_allow([^GLDSONAME$]) +m4trace:configure.in:271: -1- AC_SUBST([IMGDSONAME]) +m4trace:configure.in:271: -1- AC_SUBST_TRACE([IMGDSONAME]) +m4trace:configure.in:271: -1- m4_pattern_allow([^IMGDSONAME$]) +m4trace:configure.in:272: -1- AC_SUBST([SHAREDSUFFIX]) +m4trace:configure.in:272: -1- AC_SUBST_TRACE([SHAREDSUFFIX]) +m4trace:configure.in:272: -1- m4_pattern_allow([^SHAREDSUFFIX$]) +m4trace:configure.in:273: -1- AC_SUBST([LINKSHARED]) +m4trace:configure.in:273: -1- AC_SUBST_TRACE([LINKSHARED]) +m4trace:configure.in:273: -1- m4_pattern_allow([^LINKSHARED$]) +m4trace:configure.in:274: -1- AC_SUBST([FLUID]) +m4trace:configure.in:274: -1- AC_SUBST_TRACE([FLUID]) +m4trace:configure.in:274: -1- m4_pattern_allow([^FLUID$]) +m4trace:configure.in:288: -1- AC_DEFINE_TRACE_LITERAL([USE_QUARTZ]) +m4trace:configure.in:288: -1- m4_pattern_allow([^USE_QUARTZ$]) +m4trace:configure.in:289: -1- AC_DEFINE_TRACE_LITERAL([__APPLE_QUARTZ__]) +m4trace:configure.in:289: -1- m4_pattern_allow([^__APPLE_QUARTZ__$]) +m4trace:configure.in:291: -1- AC_DEFINE_TRACE_LITERAL([__APPLE_QD__]) +m4trace:configure.in:291: -1- m4_pattern_allow([^__APPLE_QD__$]) +m4trace:configure.in:297: -1- AC_SUBST([CC]) +m4trace:configure.in:297: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:297: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:297: -1- AC_SUBST([CFLAGS]) +m4trace:configure.in:297: -1- AC_SUBST_TRACE([CFLAGS]) +m4trace:configure.in:297: -1- m4_pattern_allow([^CFLAGS$]) +m4trace:configure.in:297: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.in:297: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.in:297: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.in:297: -1- AC_SUBST([LIBS]) +m4trace:configure.in:297: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.in:297: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.in:297: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.in:297: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.in:297: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.in:297: -1- AC_SUBST([CC]) +m4trace:configure.in:297: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:297: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:297: -1- AC_SUBST([CC]) +m4trace:configure.in:297: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:297: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:297: -1- AC_SUBST([CC]) +m4trace:configure.in:297: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:297: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:297: -1- AC_SUBST([CC]) +m4trace:configure.in:297: -1- AC_SUBST_TRACE([CC]) +m4trace:configure.in:297: -1- m4_pattern_allow([^CC$]) +m4trace:configure.in:297: -1- AC_SUBST([ac_ct_CC]) +m4trace:configure.in:297: -1- AC_SUBST_TRACE([ac_ct_CC]) +m4trace:configure.in:297: -1- m4_pattern_allow([^ac_ct_CC$]) +m4trace:configure.in:297: -1- AC_SUBST([EXEEXT], [$ac_cv_exeext]) +m4trace:configure.in:297: -1- AC_SUBST_TRACE([EXEEXT]) +m4trace:configure.in:297: -1- m4_pattern_allow([^EXEEXT$]) +m4trace:configure.in:297: -1- AC_SUBST([OBJEXT], [$ac_cv_objext]) +m4trace:configure.in:297: -1- AC_SUBST_TRACE([OBJEXT]) +m4trace:configure.in:297: -1- m4_pattern_allow([^OBJEXT$]) +m4trace:configure.in:298: -1- AC_SUBST([CXX]) +m4trace:configure.in:298: -1- AC_SUBST_TRACE([CXX]) +m4trace:configure.in:298: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.in:298: -1- AC_SUBST([CXXFLAGS]) +m4trace:configure.in:298: -1- AC_SUBST_TRACE([CXXFLAGS]) +m4trace:configure.in:298: -1- m4_pattern_allow([^CXXFLAGS$]) +m4trace:configure.in:298: -1- AC_SUBST([LDFLAGS]) +m4trace:configure.in:298: -1- AC_SUBST_TRACE([LDFLAGS]) +m4trace:configure.in:298: -1- m4_pattern_allow([^LDFLAGS$]) +m4trace:configure.in:298: -1- AC_SUBST([LIBS]) +m4trace:configure.in:298: -1- AC_SUBST_TRACE([LIBS]) +m4trace:configure.in:298: -1- m4_pattern_allow([^LIBS$]) +m4trace:configure.in:298: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.in:298: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.in:298: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.in:298: -1- AC_SUBST([CXX]) +m4trace:configure.in:298: -1- AC_SUBST_TRACE([CXX]) +m4trace:configure.in:298: -1- m4_pattern_allow([^CXX$]) +m4trace:configure.in:298: -1- AC_SUBST([ac_ct_CXX]) +m4trace:configure.in:298: -1- AC_SUBST_TRACE([ac_ct_CXX]) +m4trace:configure.in:298: -1- m4_pattern_allow([^ac_ct_CXX$]) +m4trace:configure.in:299: -1- AC_REQUIRE_AUX_FILE([install-sh]) +m4trace:configure.in:299: -1- AC_SUBST([INSTALL_PROGRAM]) +m4trace:configure.in:299: -1- AC_SUBST_TRACE([INSTALL_PROGRAM]) +m4trace:configure.in:299: -1- m4_pattern_allow([^INSTALL_PROGRAM$]) +m4trace:configure.in:299: -1- AC_SUBST([INSTALL_SCRIPT]) +m4trace:configure.in:299: -1- AC_SUBST_TRACE([INSTALL_SCRIPT]) +m4trace:configure.in:299: -1- m4_pattern_allow([^INSTALL_SCRIPT$]) +m4trace:configure.in:299: -1- AC_SUBST([INSTALL_DATA]) +m4trace:configure.in:299: -1- AC_SUBST_TRACE([INSTALL_DATA]) +m4trace:configure.in:299: -1- m4_pattern_allow([^INSTALL_DATA$]) +m4trace:configure.in:309: -1- AC_SUBST([NROFF]) +m4trace:configure.in:309: -1- AC_SUBST_TRACE([NROFF]) +m4trace:configure.in:309: -1- m4_pattern_allow([^NROFF$]) +m4trace:configure.in:312: -1- AC_SUBST([GROFF]) +m4trace:configure.in:312: -1- AC_SUBST_TRACE([GROFF]) +m4trace:configure.in:312: -1- m4_pattern_allow([^GROFF$]) +m4trace:configure.in:319: -1- AC_SUBST([HTMLDOC]) +m4trace:configure.in:319: -1- AC_SUBST_TRACE([HTMLDOC]) +m4trace:configure.in:319: -1- m4_pattern_allow([^HTMLDOC$]) +m4trace:configure.in:322: -1- AC_SUBST([RANLIB]) +m4trace:configure.in:322: -1- AC_SUBST_TRACE([RANLIB]) +m4trace:configure.in:322: -1- m4_pattern_allow([^RANLIB$]) +m4trace:configure.in:323: -1- AC_SUBST([AR]) +m4trace:configure.in:323: -1- AC_SUBST_TRACE([AR]) +m4trace:configure.in:323: -1- m4_pattern_allow([^AR$]) +m4trace:configure.in:335: -1- AC_SUBST([LIBCOMMAND]) +m4trace:configure.in:335: -1- AC_SUBST_TRACE([LIBCOMMAND]) +m4trace:configure.in:335: -1- m4_pattern_allow([^LIBCOMMAND$]) +m4trace:configure.in:338: -1- AH_OUTPUT([WORDS_BIGENDIAN], [/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif]) +m4trace:configure.in:338: -1- AC_SUBST([CPP]) +m4trace:configure.in:338: -1- AC_SUBST_TRACE([CPP]) +m4trace:configure.in:338: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.in:338: -1- AC_SUBST([CPPFLAGS]) +m4trace:configure.in:338: -1- AC_SUBST_TRACE([CPPFLAGS]) +m4trace:configure.in:338: -1- m4_pattern_allow([^CPPFLAGS$]) +m4trace:configure.in:338: -1- AC_SUBST([CPP]) +m4trace:configure.in:338: -1- AC_SUBST_TRACE([CPP]) +m4trace:configure.in:338: -1- m4_pattern_allow([^CPP$]) +m4trace:configure.in:338: -1- AC_SUBST([GREP]) +m4trace:configure.in:338: -1- AC_SUBST_TRACE([GREP]) +m4trace:configure.in:338: -1- m4_pattern_allow([^GREP$]) +m4trace:configure.in:338: -1- AC_SUBST([EGREP]) +m4trace:configure.in:338: -1- AC_SUBST_TRACE([EGREP]) +m4trace:configure.in:338: -1- m4_pattern_allow([^EGREP$]) +m4trace:configure.in:338: -1- AC_DEFINE_TRACE_LITERAL([STDC_HEADERS]) +m4trace:configure.in:338: -1- m4_pattern_allow([^STDC_HEADERS$]) +m4trace:configure.in:338: -1- AH_OUTPUT([STDC_HEADERS], [/* Define to 1 if you have the ANSI C header files. */ +@%:@undef STDC_HEADERS]) +m4trace:configure.in:338: -1- AH_OUTPUT([HAVE_SYS_TYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_TYPES_H]) +m4trace:configure.in:338: -1- AH_OUTPUT([HAVE_SYS_STAT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_SYS_STAT_H]) +m4trace:configure.in:338: -1- AH_OUTPUT([HAVE_STDLIB_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDLIB_H]) +m4trace:configure.in:338: -1- AH_OUTPUT([HAVE_STRING_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRING_H]) +m4trace:configure.in:338: -1- AH_OUTPUT([HAVE_MEMORY_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_MEMORY_H]) +m4trace:configure.in:338: -1- AH_OUTPUT([HAVE_STRINGS_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STRINGS_H]) +m4trace:configure.in:338: -1- AH_OUTPUT([HAVE_INTTYPES_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_INTTYPES_H]) +m4trace:configure.in:338: -1- AH_OUTPUT([HAVE_STDINT_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_STDINT_H]) +m4trace:configure.in:338: -1- AH_OUTPUT([HAVE_UNISTD_H], [/* Define to 1 if you have the header file. */ +@%:@undef HAVE_UNISTD_H]) +m4trace:configure.in:338: -1- AC_DEFINE_TRACE_LITERAL([WORDS_BIGENDIAN]) +m4trace:configure.in:338: -1- m4_pattern_allow([^WORDS_BIGENDIAN$]) +m4trace:configure.in:338: -1- AC_DEFINE_TRACE_LITERAL([AC_APPLE_UNIVERSAL_BUILD]) +m4trace:configure.in:338: -1- m4_pattern_allow([^AC_APPLE_UNIVERSAL_BUILD$]) +m4trace:configure.in:338: -1- AH_OUTPUT([AC_APPLE_UNIVERSAL_BUILD], [/* Define if building universal (internal helper macro) */ +@%:@undef AC_APPLE_UNIVERSAL_BUILD]) +m4trace:configure.in:340: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_SHORT]) +m4trace:configure.in:340: -1- m4_pattern_allow([^SIZEOF_SHORT$]) +m4trace:configure.in:340: -1- AH_OUTPUT([SIZEOF_SHORT], [/* The size of `short\', as computed by sizeof. */ +@%:@undef SIZEOF_SHORT]) +m4trace:configure.in:341: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_INT]) +m4trace:configure.in:341: -1- m4_pattern_allow([^SIZEOF_INT$]) +m4trace:configure.in:341: -1- AH_OUTPUT([SIZEOF_INT], [/* The size of `int\', as computed by sizeof. */ +@%:@undef SIZEOF_INT]) +m4trace:configure.in:342: -1- AC_DEFINE_TRACE_LITERAL([SIZEOF_LONG]) +m4trace:configure.in:342: -1- m4_pattern_allow([^SIZEOF_LONG$]) +m4trace:configure.in:342: -1- AH_OUTPUT([SIZEOF_LONG], [/* The size of `long\', as computed by sizeof. */ +@%:@undef SIZEOF_LONG]) +m4trace:configure.in:344: -1- AC_DEFINE_TRACE_LITERAL([U16]) +m4trace:configure.in:344: -1- m4_pattern_allow([^U16$]) +m4trace:configure.in:347: -1- AC_DEFINE_TRACE_LITERAL([U32]) +m4trace:configure.in:347: -1- m4_pattern_allow([^U32$]) +m4trace:configure.in:350: -1- AC_DEFINE_TRACE_LITERAL([U32]) +m4trace:configure.in:350: -1- m4_pattern_allow([^U32$]) +m4trace:configure.in:354: -1- AC_DEFINE_TRACE_LITERAL([U64]) +m4trace:configure.in:354: -1- m4_pattern_allow([^U64$]) +m4trace:configure.in:357: -1- AC_DEFINE_TRACE_LITERAL([U64]) +m4trace:configure.in:357: -1- m4_pattern_allow([^U64$]) +m4trace:configure.in:362: -1- _m4_warn([obsolete], [The macro `AC_LANG_SAVE' is obsolete. +You should run autoupdate.], [/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/lang.m4:126: AC_LANG_SAVE is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/m4sugar/m4sh.m4:598: AS_IF is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:1998: AC_CACHE_VAL is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2019: AC_CACHE_CHECK is expanded from... +configure.in:362: the top level]) +m4trace:configure.in:362: -1- _m4_warn([obsolete], [The macro `AC_LANG_CPLUSPLUS' is obsolete. +You should run autoupdate.], [/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/c.m4:252: AC_LANG_CPLUSPLUS is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/m4sugar/m4sh.m4:598: AS_IF is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:1998: AC_CACHE_VAL is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2019: AC_CACHE_CHECK is expanded from... +configure.in:362: the top level]) +m4trace:configure.in:362: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +You should run autoupdate.], [/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2581: AC_TRY_COMPILE is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/m4sugar/m4sh.m4:598: AS_IF is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:1998: AC_CACHE_VAL is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2019: AC_CACHE_CHECK is expanded from... +configure.in:362: the top level]) +m4trace:configure.in:362: -1- _m4_warn([obsolete], [The macro `AC_LANG_RESTORE' is obsolete. +You should run autoupdate.], [/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/lang.m4:135: AC_LANG_RESTORE is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/m4sugar/m4sh.m4:598: AS_IF is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:1998: AC_CACHE_VAL is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2019: AC_CACHE_CHECK is expanded from... +configure.in:362: the top level]) +m4trace:configure.in:382: -1- AH_OUTPUT([HAVE_DIRENT_H], [/* Define to 1 if you have the header file, and it defines `DIR\'. + */ +@%:@undef HAVE_DIRENT_H]) +m4trace:configure.in:382: -1- AH_OUTPUT([HAVE_SYS_NDIR_H], [/* Define to 1 if you have the header file, and it defines `DIR\'. + */ +@%:@undef HAVE_SYS_NDIR_H]) +m4trace:configure.in:382: -1- AH_OUTPUT([HAVE_SYS_DIR_H], [/* Define to 1 if you have the header file, and it defines `DIR\'. + */ +@%:@undef HAVE_SYS_DIR_H]) +m4trace:configure.in:382: -1- AH_OUTPUT([HAVE_NDIR_H], [/* Define to 1 if you have the header file, and it defines `DIR\'. */ +@%:@undef HAVE_NDIR_H]) +m4trace:configure.in:383: -2- AC_DEFINE_TRACE_LITERAL([HAVE_SYS_SELECT_H]) +m4trace:configure.in:383: -2- m4_pattern_allow([^HAVE_SYS_SELECT_H$]) +m4trace:configure.in:384: -2- AC_DEFINE_TRACE_LITERAL([HAVE_SYS_SELECT_H]) +m4trace:configure.in:384: -2- m4_pattern_allow([^HAVE_SYS_SELECT_H$]) +m4trace:configure.in:389: -2- AC_DEFINE_TRACE_LITERAL([HAVE_SCANDIR]) +m4trace:configure.in:389: -2- m4_pattern_allow([^HAVE_SCANDIR$]) +m4trace:configure.in:393: -1- _m4_warn([obsolete], [The macro `AC_LANG_SAVE' is obsolete. +You should run autoupdate.], [/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/lang.m4:126: AC_LANG_SAVE is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/m4sugar/m4sh.m4:598: AS_IF is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:1998: AC_CACHE_VAL is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2019: AC_CACHE_CHECK is expanded from... +configure.in:393: the top level]) +m4trace:configure.in:393: -1- _m4_warn([obsolete], [The macro `AC_LANG_CPLUSPLUS' is obsolete. +You should run autoupdate.], [/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/c.m4:252: AC_LANG_CPLUSPLUS is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/m4sugar/m4sh.m4:598: AS_IF is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:1998: AC_CACHE_VAL is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2019: AC_CACHE_CHECK is expanded from... +configure.in:393: the top level]) +m4trace:configure.in:393: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +You should run autoupdate.], [/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2581: AC_TRY_COMPILE is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/m4sugar/m4sh.m4:598: AS_IF is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:1998: AC_CACHE_VAL is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2019: AC_CACHE_CHECK is expanded from... +configure.in:393: the top level]) +m4trace:configure.in:393: -1- _m4_warn([obsolete], [The macro `AC_LANG_RESTORE' is obsolete. +You should run autoupdate.], [/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/lang.m4:135: AC_LANG_RESTORE is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/m4sugar/m4sh.m4:598: AS_IF is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:1998: AC_CACHE_VAL is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2019: AC_CACHE_CHECK is expanded from... +configure.in:393: the top level]) +m4trace:configure.in:408: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SCANDIR_POSIX]) +m4trace:configure.in:408: -1- m4_pattern_allow([^HAVE_SCANDIR_POSIX$]) +m4trace:configure.in:411: -1- AC_DEFINE_TRACE_LITERAL([HAVE_VSNPRINTF]) +m4trace:configure.in:411: -1- m4_pattern_allow([^HAVE_VSNPRINTF$]) +m4trace:configure.in:411: -1- AC_DEFINE_TRACE_LITERAL([HAVE_VSNPRINTF]) +m4trace:configure.in:411: -1- m4_pattern_allow([^HAVE_VSNPRINTF$]) +m4trace:configure.in:411: -1- AC_DEFINE_TRACE_LITERAL([HAVE_VSNPRINTF]) +m4trace:configure.in:411: -1- m4_pattern_allow([^HAVE_VSNPRINTF$]) +m4trace:configure.in:433: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SNPRINTF]) +m4trace:configure.in:433: -1- m4_pattern_allow([^HAVE_SNPRINTF$]) +m4trace:configure.in:433: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SNPRINTF]) +m4trace:configure.in:433: -1- m4_pattern_allow([^HAVE_SNPRINTF$]) +m4trace:configure.in:433: -1- AC_DEFINE_TRACE_LITERAL([HAVE_SNPRINTF]) +m4trace:configure.in:433: -1- m4_pattern_allow([^HAVE_SNPRINTF$]) +m4trace:configure.in:455: -2- AC_DEFINE_TRACE_LITERAL([HAVE_STRINGS_H]) +m4trace:configure.in:455: -2- m4_pattern_allow([^HAVE_STRINGS_H$]) +m4trace:configure.in:456: -1- AH_OUTPUT([HAVE_STRCASECMP], [/* Define to 1 if you have the `strcasecmp\' function. */ +@%:@undef HAVE_STRCASECMP]) +m4trace:configure.in:456: -1- AH_OUTPUT([HAVE_STRLCAT], [/* Define to 1 if you have the `strlcat\' function. */ +@%:@undef HAVE_STRLCAT]) +m4trace:configure.in:456: -1- AH_OUTPUT([HAVE_STRLCPY], [/* Define to 1 if you have the `strlcpy\' function. */ +@%:@undef HAVE_STRLCPY]) +m4trace:configure.in:458: -2- AC_DEFINE_TRACE_LITERAL([HAVE_LOCALE_H]) +m4trace:configure.in:458: -2- m4_pattern_allow([^HAVE_LOCALE_H$]) +m4trace:configure.in:459: -1- AH_OUTPUT([HAVE_LOCALECONV], [/* Define to 1 if you have the `localeconv\' function. */ +@%:@undef HAVE_LOCALECONV]) +m4trace:configure.in:459: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LOCALECONV]) +m4trace:configure.in:459: -1- m4_pattern_allow([^HAVE_LOCALECONV$]) +m4trace:configure.in:465: -1- AC_DEFINE_TRACE_LITERAL([_FILE_OFFSET_BITS]) +m4trace:configure.in:465: -1- m4_pattern_allow([^_FILE_OFFSET_BITS$]) +m4trace:configure.in:465: -1- AH_OUTPUT([_FILE_OFFSET_BITS], [/* Number of bits in a file offset, on hosts where this is settable. */ +@%:@undef _FILE_OFFSET_BITS]) +m4trace:configure.in:465: -1- AC_DEFINE_TRACE_LITERAL([_LARGE_FILES]) +m4trace:configure.in:465: -1- m4_pattern_allow([^_LARGE_FILES$]) +m4trace:configure.in:465: -1- AH_OUTPUT([_LARGE_FILES], [/* Define for large files, on AIX-style hosts. */ +@%:@undef _LARGE_FILES]) +m4trace:configure.in:480: -1- AC_SUBST([LARGEFILE]) +m4trace:configure.in:480: -1- AC_SUBST_TRACE([LARGEFILE]) +m4trace:configure.in:480: -1- m4_pattern_allow([^LARGEFILE$]) +m4trace:configure.in:483: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +You should run autoupdate.], [/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2581: AC_TRY_COMPILE is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/m4sugar/m4sh.m4:598: AS_IF is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:1998: AC_CACHE_VAL is expanded from... +/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2019: AC_CACHE_CHECK is expanded from... +configure.in:483: the top level]) +m4trace:configure.in:493: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LONG_LONG]) +m4trace:configure.in:493: -1- m4_pattern_allow([^HAVE_LONG_LONG$]) +m4trace:configure.in:496: -2- AC_DEFINE_TRACE_LITERAL([HAVE_STRTOLL]) +m4trace:configure.in:496: -2- m4_pattern_allow([^HAVE_STRTOLL$]) +m4trace:configure.in:499: -2- AC_DEFINE_TRACE_LITERAL([HAVE_DLSYM]) +m4trace:configure.in:499: -2- m4_pattern_allow([^HAVE_DLSYM$]) +m4trace:configure.in:500: -2- AC_DEFINE_TRACE_LITERAL([HAVE_DLFCN_H]) +m4trace:configure.in:500: -2- m4_pattern_allow([^HAVE_DLFCN_H$]) +m4trace:configure.in:517: -2- AC_DEFINE_TRACE_LITERAL([HAVE_ALSA_ASOUNDLIB_H]) +m4trace:configure.in:517: -2- m4_pattern_allow([^HAVE_ALSA_ASOUNDLIB_H$]) +m4trace:configure.in:522: -1- AC_SUBST([AUDIOLIBS]) +m4trace:configure.in:522: -1- AC_SUBST_TRACE([AUDIOLIBS]) +m4trace:configure.in:522: -1- m4_pattern_allow([^AUDIOLIBS$]) +m4trace:configure.in:529: -1- AC_SUBST([IMAGELIBS]) +m4trace:configure.in:529: -1- AC_SUBST_TRACE([IMAGELIBS]) +m4trace:configure.in:529: -1- m4_pattern_allow([^IMAGELIBS$]) +m4trace:configure.in:530: -1- AC_SUBST([STATICIMAGELIBS]) +m4trace:configure.in:530: -1- AC_SUBST_TRACE([STATICIMAGELIBS]) +m4trace:configure.in:530: -1- m4_pattern_allow([^STATICIMAGELIBS$]) +m4trace:configure.in:553: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBJPEG]) +m4trace:configure.in:553: -1- m4_pattern_allow([^HAVE_LIBJPEG$]) +m4trace:configure.in:564: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBJPEG]) +m4trace:configure.in:564: -1- m4_pattern_allow([^HAVE_LIBJPEG$]) +m4trace:configure.in:589: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBZ]) +m4trace:configure.in:589: -1- m4_pattern_allow([^HAVE_LIBZ$]) +m4trace:configure.in:601: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBZ]) +m4trace:configure.in:601: -1- m4_pattern_allow([^HAVE_LIBZ$]) +m4trace:configure.in:614: -2- AC_DEFINE_TRACE_LITERAL([HAVE_PNG_H]) +m4trace:configure.in:614: -2- m4_pattern_allow([^HAVE_PNG_H$]) +m4trace:configure.in:614: -2- AC_DEFINE_TRACE_LITERAL([HAVE_LIBPNG_PNG_H]) +m4trace:configure.in:614: -2- m4_pattern_allow([^HAVE_LIBPNG_PNG_H$]) +m4trace:configure.in:632: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBPNG]) +m4trace:configure.in:632: -1- m4_pattern_allow([^HAVE_LIBPNG$]) +m4trace:configure.in:633: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PNG_H]) +m4trace:configure.in:633: -1- m4_pattern_allow([^HAVE_PNG_H$]) +m4trace:configure.in:634: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PNG_GET_VALID]) +m4trace:configure.in:634: -1- m4_pattern_allow([^HAVE_PNG_GET_VALID$]) +m4trace:configure.in:635: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PNG_SET_TRNS_TO_ALPHA]) +m4trace:configure.in:635: -1- m4_pattern_allow([^HAVE_PNG_SET_TRNS_TO_ALPHA$]) +m4trace:configure.in:645: -1- AC_DEFINE_TRACE_LITERAL([HAVE_LIBPNG]) +m4trace:configure.in:645: -1- m4_pattern_allow([^HAVE_LIBPNG$]) +m4trace:configure.in:646: -2- AC_DEFINE_TRACE_LITERAL([HAVE_PNG_GET_VALID]) +m4trace:configure.in:646: -2- m4_pattern_allow([^HAVE_PNG_GET_VALID$]) +m4trace:configure.in:647: -2- AC_DEFINE_TRACE_LITERAL([HAVE_PNG_SET_TRNS_TO_ALPHA]) +m4trace:configure.in:647: -2- m4_pattern_allow([^HAVE_PNG_SET_TRNS_TO_ALPHA$]) +m4trace:configure.in:650: -1- AC_SUBST([JPEG]) +m4trace:configure.in:650: -1- AC_SUBST_TRACE([JPEG]) +m4trace:configure.in:650: -1- m4_pattern_allow([^JPEG$]) +m4trace:configure.in:651: -1- AC_SUBST([JPEGINC]) +m4trace:configure.in:651: -1- AC_SUBST_TRACE([JPEGINC]) +m4trace:configure.in:651: -1- m4_pattern_allow([^JPEGINC$]) +m4trace:configure.in:652: -1- AC_SUBST([PNG]) +m4trace:configure.in:652: -1- AC_SUBST_TRACE([PNG]) +m4trace:configure.in:652: -1- m4_pattern_allow([^PNG$]) +m4trace:configure.in:653: -1- AC_SUBST([PNGINC]) +m4trace:configure.in:653: -1- AC_SUBST_TRACE([PNGINC]) +m4trace:configure.in:653: -1- m4_pattern_allow([^PNGINC$]) +m4trace:configure.in:654: -1- AC_SUBST([ZLIB]) +m4trace:configure.in:654: -1- AC_SUBST_TRACE([ZLIB]) +m4trace:configure.in:654: -1- m4_pattern_allow([^ZLIB$]) +m4trace:configure.in:655: -1- AC_SUBST([ZLIBINC]) +m4trace:configure.in:655: -1- AC_SUBST_TRACE([ZLIBINC]) +m4trace:configure.in:655: -1- m4_pattern_allow([^ZLIBINC$]) +m4trace:configure.in:668: -2- AC_DEFINE_TRACE_LITERAL([HAVE_PTHREAD_H]) +m4trace:configure.in:668: -2- m4_pattern_allow([^HAVE_PTHREAD_H$]) +m4trace:configure.in:676: -1- _m4_warn([obsolete], [The macro `AC_TRY_LINK' is obsolete. +You should run autoupdate.], [/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2654: AC_TRY_LINK is expanded from... +configure.in:676: the top level]) +m4trace:configure.in:683: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTHREAD]) +m4trace:configure.in:683: -1- m4_pattern_allow([^HAVE_PTHREAD$]) +m4trace:configure.in:697: -1- AC_SUBST([PTHREAD_FLAGS]) +m4trace:configure.in:697: -1- AC_SUBST_TRACE([PTHREAD_FLAGS]) +m4trace:configure.in:697: -1- m4_pattern_allow([^PTHREAD_FLAGS$]) +m4trace:configure.in:716: -1- AC_DEFINE_TRACE_LITERAL([U32]) +m4trace:configure.in:716: -1- m4_pattern_allow([^U32$]) +m4trace:configure.in:729: -2- AC_DEFINE_TRACE_LITERAL([HAVE_GL]) +m4trace:configure.in:729: -2- m4_pattern_allow([^HAVE_GL$]) +m4trace:configure.in:732: -2- AC_DEFINE_TRACE_LITERAL([HAVE_GL_GLU_H]) +m4trace:configure.in:732: -2- m4_pattern_allow([^HAVE_GL_GLU_H$]) +m4trace:configure.in:743: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTHREAD]) +m4trace:configure.in:743: -1- m4_pattern_allow([^HAVE_PTHREAD$]) +m4trace:configure.in:760: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTHREAD]) +m4trace:configure.in:760: -1- m4_pattern_allow([^HAVE_PTHREAD$]) +m4trace:configure.in:765: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GL]) +m4trace:configure.in:765: -1- m4_pattern_allow([^HAVE_GL$]) +m4trace:configure.in:766: -1- AC_DEFINE_TRACE_LITERAL([HAVE_GL_GLU_H]) +m4trace:configure.in:766: -1- m4_pattern_allow([^HAVE_GL_GLU_H$]) +m4trace:configure.in:794: -1- AC_DEFINE_TRACE_LITERAL([HAVE_PTHREAD]) +m4trace:configure.in:794: -1- m4_pattern_allow([^HAVE_PTHREAD$]) +m4trace:configure.in:799: -1- AC_SUBST([XMKMF]) +m4trace:configure.in:799: -1- AC_SUBST_TRACE([XMKMF]) +m4trace:configure.in:799: -1- m4_pattern_allow([^XMKMF$]) +m4trace:configure.in:799: -1- AC_DEFINE_TRACE_LITERAL([X_DISPLAY_MISSING]) +m4trace:configure.in:799: -1- m4_pattern_allow([^X_DISPLAY_MISSING$]) +m4trace:configure.in:799: -1- AH_OUTPUT([X_DISPLAY_MISSING], [/* Define to 1 if the X Window System is missing or not being used. */ +@%:@undef X_DISPLAY_MISSING]) +m4trace:configure.in:799: -1- AC_SUBST([X_CFLAGS]) +m4trace:configure.in:799: -1- AC_SUBST_TRACE([X_CFLAGS]) +m4trace:configure.in:799: -1- m4_pattern_allow([^X_CFLAGS$]) +m4trace:configure.in:799: -1- AC_SUBST([X_PRE_LIBS]) +m4trace:configure.in:799: -1- AC_SUBST_TRACE([X_PRE_LIBS]) +m4trace:configure.in:799: -1- m4_pattern_allow([^X_PRE_LIBS$]) +m4trace:configure.in:799: -1- AC_SUBST([X_LIBS]) +m4trace:configure.in:799: -1- AC_SUBST_TRACE([X_LIBS]) +m4trace:configure.in:799: -1- m4_pattern_allow([^X_LIBS$]) +m4trace:configure.in:799: -1- AC_SUBST([X_EXTRA_LIBS]) +m4trace:configure.in:799: -1- AC_SUBST_TRACE([X_EXTRA_LIBS]) +m4trace:configure.in:799: -1- m4_pattern_allow([^X_EXTRA_LIBS$]) +m4trace:configure.in:806: -1- _m4_warn([obsolete], [back quotes and double quotes must not be escaped in: $as_me:${as_lineno-$LINENO}: WARNING: Ignoring libraries \"$X_PRE_LIBS\" requested by configure.], []) +m4trace:configure.in:806: -1- _m4_warn([obsolete], [back quotes and double quotes must not be escaped in: $as_me: WARNING: Ignoring libraries \"$X_PRE_LIBS\" requested by configure.], []) +m4trace:configure.in:825: -3- AC_DEFINE_TRACE_LITERAL([HAVE_GL]) +m4trace:configure.in:825: -3- m4_pattern_allow([^HAVE_GL$]) +m4trace:configure.in:826: -4- AC_DEFINE_TRACE_LITERAL([HAVE_GL]) +m4trace:configure.in:826: -4- m4_pattern_allow([^HAVE_GL$]) +m4trace:configure.in:830: -3- AC_DEFINE_TRACE_LITERAL([HAVE_GLXGETPROCADDRESSARB]) +m4trace:configure.in:830: -3- m4_pattern_allow([^HAVE_GLXGETPROCADDRESSARB$]) +m4trace:configure.in:833: -2- AC_DEFINE_TRACE_LITERAL([HAVE_GL_GLU_H]) +m4trace:configure.in:833: -2- m4_pattern_allow([^HAVE_GL_GLU_H$]) +m4trace:configure.in:860: -2- AC_DEFINE_TRACE_LITERAL([HAVE_XINERAMA]) +m4trace:configure.in:860: -2- m4_pattern_allow([^HAVE_XINERAMA$]) +m4trace:configure.in:868: -1- AC_SUBST([FTCONFIG]) +m4trace:configure.in:868: -1- AC_SUBST_TRACE([FTCONFIG]) +m4trace:configure.in:868: -1- m4_pattern_allow([^FTCONFIG$]) +m4trace:configure.in:876: -3- AC_DEFINE_TRACE_LITERAL([USE_XFT]) +m4trace:configure.in:876: -3- m4_pattern_allow([^USE_XFT$]) +m4trace:configure.in:885: -2- AC_DEFINE_TRACE_LITERAL([HAVE_XDBE]) +m4trace:configure.in:885: -2- m4_pattern_allow([^HAVE_XDBE$]) +m4trace:configure.in:890: -1- AC_SUBST([XPROP]) +m4trace:configure.in:890: -1- AC_SUBST_TRACE([XPROP]) +m4trace:configure.in:890: -1- m4_pattern_allow([^XPROP$]) +m4trace:configure.in:903: -1- AC_DEFINE_TRACE_LITERAL([HAVE_OVERLAY]) +m4trace:configure.in:903: -1- m4_pattern_allow([^HAVE_OVERLAY$]) +m4trace:configure.in:917: -1- AC_SUBST([GLDEMOS]) +m4trace:configure.in:917: -1- AC_SUBST_TRACE([GLDEMOS]) +m4trace:configure.in:917: -1- m4_pattern_allow([^GLDEMOS$]) +m4trace:configure.in:918: -1- AC_SUBST([GLLIB]) +m4trace:configure.in:918: -1- AC_SUBST_TRACE([GLLIB]) +m4trace:configure.in:918: -1- m4_pattern_allow([^GLLIB$]) +m4trace:configure.in:919: -1- AC_SUBST([HLINKS]) +m4trace:configure.in:919: -1- AC_SUBST_TRACE([HLINKS]) +m4trace:configure.in:919: -1- m4_pattern_allow([^HLINKS$]) +m4trace:configure.in:920: -1- AC_SUBST([POSTBUILD]) +m4trace:configure.in:920: -1- AC_SUBST_TRACE([POSTBUILD]) +m4trace:configure.in:920: -1- m4_pattern_allow([^POSTBUILD$]) +m4trace:configure.in:921: -1- AC_SUBST([OSX_ONLY]) +m4trace:configure.in:921: -1- AC_SUBST_TRACE([OSX_ONLY]) +m4trace:configure.in:921: -1- m4_pattern_allow([^OSX_ONLY$]) +m4trace:configure.in:922: -1- AC_SUBST([THREADS]) +m4trace:configure.in:922: -1- AC_SUBST_TRACE([THREADS]) +m4trace:configure.in:922: -1- m4_pattern_allow([^THREADS$]) +m4trace:configure.in:924: -1- AC_SUBST([INSTALL_DESKTOP]) +m4trace:configure.in:924: -1- AC_SUBST_TRACE([INSTALL_DESKTOP]) +m4trace:configure.in:924: -1- m4_pattern_allow([^INSTALL_DESKTOP$]) +m4trace:configure.in:925: -1- AC_SUBST([UNINSTALL_DESKTOP]) +m4trace:configure.in:925: -1- AC_SUBST_TRACE([UNINSTALL_DESKTOP]) +m4trace:configure.in:925: -1- m4_pattern_allow([^UNINSTALL_DESKTOP$]) +m4trace:configure.in:949: -1- AC_SUBST([CAT1EXT]) +m4trace:configure.in:949: -1- AC_SUBST_TRACE([CAT1EXT]) +m4trace:configure.in:949: -1- m4_pattern_allow([^CAT1EXT$]) +m4trace:configure.in:950: -1- AC_SUBST([CAT3EXT]) +m4trace:configure.in:950: -1- AC_SUBST_TRACE([CAT3EXT]) +m4trace:configure.in:950: -1- m4_pattern_allow([^CAT3EXT$]) +m4trace:configure.in:951: -1- AC_SUBST([CAT6EXT]) +m4trace:configure.in:951: -1- AC_SUBST_TRACE([CAT6EXT]) +m4trace:configure.in:951: -1- m4_pattern_allow([^CAT6EXT$]) +m4trace:configure.in:983: -1- AC_SUBST([MAKEDEPEND]) +m4trace:configure.in:983: -1- AC_SUBST_TRACE([MAKEDEPEND]) +m4trace:configure.in:983: -1- m4_pattern_allow([^MAKEDEPEND$]) +m4trace:configure.in:1034: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +You should run autoupdate.], [/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2581: AC_TRY_COMPILE is expanded from... +configure.in:1034: the top level]) +m4trace:configure.in:1044: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +You should run autoupdate.], [/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2581: AC_TRY_COMPILE is expanded from... +configure.in:1044: the top level]) +m4trace:configure.in:1062: -1- _m4_warn([obsolete], [The macro `AC_TRY_COMPILE' is obsolete. +You should run autoupdate.], [/usr/src/packages/autoconf/26/autoconf2.5-2.65-1/src/autoconf-2.65/lib/autoconf/general.m4:2581: AC_TRY_COMPILE is expanded from... +configure.in:1062: the top level]) +m4trace:configure.in:1083: -1- _m4_warn([obsolete], [back quotes and double quotes must not be escaped in: $as_me:${as_lineno-$LINENO}: WARNING: FOR BEST RESULTS BEFORE COMPILING: setenv SGI_ABI \"-n32 -mips3\"], []) +m4trace:configure.in:1083: -1- _m4_warn([obsolete], [back quotes and double quotes must not be escaped in: $as_me: WARNING: FOR BEST RESULTS BEFORE COMPILING: setenv SGI_ABI \"-n32 -mips3\"], []) +m4trace:configure.in:1164: -1- AC_DEFINE_TRACE_LITERAL([FLTK_DOCDIR]) +m4trace:configure.in:1164: -1- m4_pattern_allow([^FLTK_DOCDIR$]) +m4trace:configure.in:1166: -1- AC_DEFINE_TRACE_LITERAL([FLTK_DOCDIR]) +m4trace:configure.in:1166: -1- m4_pattern_allow([^FLTK_DOCDIR$]) +m4trace:configure.in:1171: -1- AC_DEFINE_TRACE_LITERAL([FLTK_DATADIR]) +m4trace:configure.in:1171: -1- m4_pattern_allow([^FLTK_DATADIR$]) +m4trace:configure.in:1173: -1- AC_DEFINE_TRACE_LITERAL([FLTK_DATADIR]) +m4trace:configure.in:1173: -1- m4_pattern_allow([^FLTK_DATADIR$]) +m4trace:configure.in:1251: -1- AC_CONFIG_HEADERS([config.h:configh.in]) +m4trace:configure.in:1252: -1- AC_CONFIG_FILES([makeinclude fltk.list fltk-config fltk.spec FL/Makefile]) +m4trace:configure.in:1252: -1- _m4_warn([obsolete], [AC_OUTPUT should be used without arguments. +You should run autoupdate.], []) +m4trace:configure.in:1252: -1- AC_SUBST([LIB@&t@OBJS], [$ac_libobjs]) +m4trace:configure.in:1252: -1- AC_SUBST_TRACE([LIB@&t@OBJS]) +m4trace:configure.in:1252: -1- m4_pattern_allow([^LIB@&t@OBJS$]) +m4trace:configure.in:1252: -1- AC_SUBST([LTLIBOBJS], [$ac_ltlibobjs]) +m4trace:configure.in:1252: -1- AC_SUBST_TRACE([LTLIBOBJS]) +m4trace:configure.in:1252: -1- m4_pattern_allow([^LTLIBOBJS$]) +m4trace:configure.in:1252: -1- AC_SUBST_TRACE([top_builddir]) +m4trace:configure.in:1252: -1- AC_SUBST_TRACE([top_build_prefix]) +m4trace:configure.in:1252: -1- AC_SUBST_TRACE([srcdir]) +m4trace:configure.in:1252: -1- AC_SUBST_TRACE([abs_srcdir]) +m4trace:configure.in:1252: -1- AC_SUBST_TRACE([top_srcdir]) +m4trace:configure.in:1252: -1- AC_SUBST_TRACE([abs_top_srcdir]) +m4trace:configure.in:1252: -1- AC_SUBST_TRACE([builddir]) +m4trace:configure.in:1252: -1- AC_SUBST_TRACE([abs_builddir]) +m4trace:configure.in:1252: -1- AC_SUBST_TRACE([abs_top_builddir]) +m4trace:configure.in:1252: -1- AC_SUBST_TRACE([INSTALL]) diff --git a/third_party/windows/fltk-1.1.10/borlandc/README b/third_party/windows/fltk-1.1.10/borlandc/README new file mode 100644 index 0000000..4e42f25 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/README @@ -0,0 +1,43 @@ +Compilation of FLTK 1.1rc2 in Borland C++ Builder 6.0 +(by Alexey Parshin alexeyp@m7.tts-sf.com) + +FLTK library compile: +--------------------- +0) Open the project group fltk.bpg. It contains all the other projects. +1) Create the directory ../obj (obj in fltk) +2) During the compilation of fltklib project I had two compile + errors in scandir_win32.c. Just add the required type conversions: + + Line 46: + findIn = (char *)malloc(len+5); + + Line 75: + struct dirent **tempDir = (struct dirent **) calloc(sizeof(struct dirent*), NDir+33); +3) For some reason BCB 6.0 doesn't like the word 'DIRECTORY' so I had to replace + it everywhere in source code and examples with '_DIRECTORY'. The case is + very important. For instance (file Fl_File_Icon.cxx): + + icon = new Fl_File_Icon("*", Fl_File_Icon::DIRECTORY); + + replaced with + + icon = new Fl_File_Icon("*", Fl_File_Icon::_DIRECTORY); + + +FLTK examples compile: +--------------------- +0) All the examples create an empty console window when start. I know how to + avoid this window but it requires the modification of the examples. So I leave + it on FLTK authors. +1) File connect.cxx doesn't support Windows - example is not generated. +2) The colbrowser example uses the color map file which is not presented on + Windows. If you modify this example so it uses the file stolen from Linux + you can test it. +3) The (cube, fullscreen, fractals) examples use GL which I don't have. For this + reason I was unable to test how it works with GL. + +Your own projects in BCB 6.0: +---------------------------- +1) Make sure you have 'Treat enums as integers' option checked (in project options). +2) To make it simple you can take fltk_app_template.bpr and replace bitmap.cxx in + this project with your files. diff --git a/third_party/windows/fltk-1.1.10/borlandc/arc.bpf b/third_party/windows/fltk-1.1.10/borlandc/arc.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/arc.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/arc.bpr b/third_party/windows/fltk-1.1.10/borlandc/arc.bpr new file mode 100644 index 0000000..68842d3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/arc.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/arc.res b/third_party/windows/fltk-1.1.10/borlandc/arc.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/arc.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/ask.bpf b/third_party/windows/fltk-1.1.10/borlandc/ask.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/ask.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/ask.bpr b/third_party/windows/fltk-1.1.10/borlandc/ask.bpr new file mode 100644 index 0000000..f5b7ead --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/ask.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/ask.res b/third_party/windows/fltk-1.1.10/borlandc/ask.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/ask.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/bitmap.bpf b/third_party/windows/fltk-1.1.10/borlandc/bitmap.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/bitmap.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/bitmap.bpr b/third_party/windows/fltk-1.1.10/borlandc/bitmap.bpr new file mode 100644 index 0000000..219d9c6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/bitmap.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/bitmap.res b/third_party/windows/fltk-1.1.10/borlandc/bitmap.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/bitmap.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/boxtype.bpf b/third_party/windows/fltk-1.1.10/borlandc/boxtype.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/boxtype.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/boxtype.bpr b/third_party/windows/fltk-1.1.10/borlandc/boxtype.bpr new file mode 100644 index 0000000..1452195 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/boxtype.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/boxtype.res b/third_party/windows/fltk-1.1.10/borlandc/boxtype.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/boxtype.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/browser.bpf b/third_party/windows/fltk-1.1.10/borlandc/browser.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/browser.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/browser.bpr b/third_party/windows/fltk-1.1.10/borlandc/browser.bpr new file mode 100644 index 0000000..2694c4a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/browser.bpr @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=3 +Item0=WIN32;_MSC_VER +Item1=WIN32 +Item2=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/browser.res b/third_party/windows/fltk-1.1.10/borlandc/browser.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/browser.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/button.bpf b/third_party/windows/fltk-1.1.10/borlandc/button.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/button.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/button.bpr b/third_party/windows/fltk-1.1.10/borlandc/button.bpr new file mode 100644 index 0000000..130c222 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/button.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/button.res b/third_party/windows/fltk-1.1.10/borlandc/button.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/button.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/buttons.bpf b/third_party/windows/fltk-1.1.10/borlandc/buttons.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/buttons.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/buttons.bpr b/third_party/windows/fltk-1.1.10/borlandc/buttons.bpr new file mode 100644 index 0000000..35dce2c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/buttons.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/buttons.res b/third_party/windows/fltk-1.1.10/borlandc/buttons.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/buttons.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/checkers.bpf b/third_party/windows/fltk-1.1.10/borlandc/checkers.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/checkers.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/checkers.bpr b/third_party/windows/fltk-1.1.10/borlandc/checkers.bpr new file mode 100644 index 0000000..baa37fe --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/checkers.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/checkers.res b/third_party/windows/fltk-1.1.10/borlandc/checkers.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/checkers.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/clock.bpf b/third_party/windows/fltk-1.1.10/borlandc/clock.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/clock.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/clock.bpr b/third_party/windows/fltk-1.1.10/borlandc/clock.bpr new file mode 100644 index 0000000..cc7f288 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/clock.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/clock.res b/third_party/windows/fltk-1.1.10/borlandc/clock.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/clock.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/colbrowser.bpf b/third_party/windows/fltk-1.1.10/borlandc/colbrowser.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/colbrowser.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/colbrowser.bpr b/third_party/windows/fltk-1.1.10/borlandc/colbrowser.bpr new file mode 100644 index 0000000..c2049b3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/colbrowser.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/colbrowser.res b/third_party/windows/fltk-1.1.10/borlandc/colbrowser.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/colbrowser.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/color_chooser.bpf b/third_party/windows/fltk-1.1.10/borlandc/color_chooser.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/color_chooser.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/color_chooser.bpr b/third_party/windows/fltk-1.1.10/borlandc/color_chooser.bpr new file mode 100644 index 0000000..f2f2341 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/color_chooser.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams=- +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/color_chooser.res b/third_party/windows/fltk-1.1.10/borlandc/color_chooser.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/color_chooser.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/config.h b/third_party/windows/fltk-1.1.10/borlandc/config.h new file mode 100644 index 0000000..f3c03cf --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/config.h @@ -0,0 +1,229 @@ +/* + * "$Id: config.h 4454 2005-07-24 18:41:30Z matt $" + * + * Configuration file for the Fast Light Tool Kit (FLTK) for Borland C++. + * + * Copyright 1998-2005 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems to "fltk-bugs@fltk.org". + */ + +/* + * Where to find the documentation files... + */ + +#define FLTK_DATADIR "C:/FLTK" +#define FLTK_DOCDIR "C:/FLTK/DOC" + + +/* + * BORDER_WIDTH: + * + * Thickness of FL_UP_BOX and FL_DOWN_BOX. Current 1,2, and 3 are + * supported. 3 is the historic FLTK look. 2 looks more like Microsoft + * Windows, KDE, and Qt, and is the default when building for Windows. + * 1 is a plausible future evolution... Note that this may be simulated + * at runtime by redefining the boxtypes using Fl::set_boxtype(). + */ + +#define BORDER_WIDTH 2 + +/* + * HAVE_GL: + * + * Do you have OpenGL? Set this to 0 if you don't have or plan to use + * OpenGL, and FLTK will be smaller. + */ + +#define HAVE_GL 1 + +/* + * HAVE_GL_GLU_H: + * + * Do you have the OpenGL Utility Library header file? + * (many broken Mesa RPMs do not...) + */ + +#define HAVE_GL_GLU_H 1 + +/* + * USE_COLORMAP: + * + * Setting this to zero will save a good deal of code (especially for + * fl_draw_image), but FLTK will only work on TrueColor visuals. + */ + +#define USE_COLORMAP 1 + +/* + * USE_XFT + * + * Use the new Xft library to draw anti-aliased text. + */ + +#define USE_XFT 0 + +/* + * HAVE_XDBE: + * + * Do we have the X double-buffer extension? + */ + +#define HAVE_XDBE 0 + +/* + * USE_XDBE: + * + * Actually try to use the double-buffer extension? Set this to zero + * disable use of XDBE without breaking the list_visuals program. + */ + +#define USE_XDBE HAVE_XDBE + +/* + * HAVE_OVERLAY: + * + * Use the X overlay extension? FLTK will try to use an overlay + * visual for Fl_Overlay_Window, the Gl_Window overlay, and for the + * menus. Setting this to zero will remove a substantial amount of + * code from FLTK. Overlays have only been tested on SGI servers! + */ + +#define HAVE_OVERLAY 0 + +/* + * HAVE_GL_OVERLAY: + * + * It is possible your GL has an overlay even if X does not. If so, + * set this to 1. + */ + +#define HAVE_GL_OVERLAY 1 + +/* + * WORDS_BIGENDIAN: + * + * Byte order of your machine: 1 = big-endian, 0 = little-endian. + */ + +#define WORDS_BIGENDIAN 0 + +/* + * U16, U32, U64: + * + * Types used by fl_draw_image. One of U32 or U64 must be defined. + * U16 is optional but FLTK will work better with it! + */ + +#define U16 unsigned short +#define U32 unsigned +/* #undef U64 */ + +/* + * HAVE_DIRENT_H, HAVE_SYS_NDIR_H, HAVE_SYS_DIR_H, HAVE_NDIR_H, HAVE_SCANDIR: + * + * Where is (used only by fl_file_chooser and scandir). + */ + +#define HAVE_DIRENT_H 1 +/* #undef HAVE_SYS_NDIR_H */ +/* #undef HAVE_SYS_DIR_H */ +/* #undef HAVE_NDIR_H */ +/* #undef HAVE_SCANDIR */ + +/* + * Possibly missing sprintf-style functions: + */ + +#define HAVE_VSNPRINTF 1 +#define HAVE_SNPRINTF 1 + +/* + * String functions and headers... + */ + +/* #undef HAVE_STRINGS_H */ +#define HAVE_STRCASECMP 1 +/* #undef HAVE_STRLCAT */ +/* #undef HAVE_STRLCPY */ + +/* + * Do we have POSIX locale support? + */ + +#define HAVE_LOCALE_H 1 +#define HAVE_LOCALECONV 1 + +/* + * HAVE_SYS_SELECT_H: + * + * Whether or not select() call has its own header file. + */ + +/* #undef HAVE_SYS_SELECT_H */ + +/* + * HAVE_SYS_STDTYPES_H: + * + * Whether or not we have the header file. + */ + +/* #undef HAVE_SYS_STDTYPES_H */ + +/* + * HAVE_POLL: + * + * Use poll() if we don't have select(). + */ + +#define HAVE_POLL 0 + +/* + * Do we have various image libraries? + */ + +/* #undef HAVE_LIBPNG */ +/* #undef HAVE_LIBZ */ +/* #undef HAVE_LIBJPEG */ + +/* + * Which header file do we include for libpng? + */ + +/* #undef HAVE_PNG_H */ +/* #undef HAVE_LIBPNG_PNG_H */ + +/* + * Do we have the png_xyz() functions? + */ + +/* #undef HAVE_PNG_GET_VALID */ +/* #undef HAVE_PNG_SET_TRNS_TO_ALPHA */ +/* #undef HAVE_PNG_READ_DESTROY */ + +/* + * Do we have POSIX threading? + */ + +/* #undef HAVE_PTHREAD */ +/* #undef HAVE_PTHREAD_H */ + + +/* + * End of "$Id: config.h 4454 2005-07-24 18:41:30Z matt $". + */ diff --git a/third_party/windows/fltk-1.1.10/borlandc/cube.bpf b/third_party/windows/fltk-1.1.10/borlandc/cube.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/cube.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/cube.bpr b/third_party/windows/fltk-1.1.10/borlandc/cube.bpr new file mode 100644 index 0000000..1823269 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/cube.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/cube.res b/third_party/windows/fltk-1.1.10/borlandc/cube.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/cube.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/cursor.bpf b/third_party/windows/fltk-1.1.10/borlandc/cursor.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/cursor.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/cursor.bpr b/third_party/windows/fltk-1.1.10/borlandc/cursor.bpr new file mode 100644 index 0000000..772b42c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/cursor.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/cursor.res b/third_party/windows/fltk-1.1.10/borlandc/cursor.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/cursor.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/curve.bpf b/third_party/windows/fltk-1.1.10/borlandc/curve.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/curve.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/curve.bpr b/third_party/windows/fltk-1.1.10/borlandc/curve.bpr new file mode 100644 index 0000000..baad23d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/curve.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/curve.res b/third_party/windows/fltk-1.1.10/borlandc/curve.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/curve.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/demo.bpf b/third_party/windows/fltk-1.1.10/borlandc/demo.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/demo.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/demo.bpr b/third_party/windows/fltk-1.1.10/borlandc/demo.bpr new file mode 100644 index 0000000..f5029e4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/demo.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/demo.menu b/third_party/windows/fltk-1.1.10/borlandc/demo.menu new file mode 100644 index 0000000..fd10213 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/demo.menu @@ -0,0 +1,87 @@ +# Menu description file for the generic demo program +# +# Each line consists of three fields, separated by : +# +# - menu name : To which the item belongs (starts with @) +# - item name : Placed on button. (use \n for newline) +# - command name: To be executed. Use a menu name to define a submenu. +# +# @main indicates the main menu. +# + +@main:Widget\nTests:@x + @x:Fl_Browser:browser + @x:Fl_Input:input + @x:Fl_Output:output + @x:Fl_Button:radio + @x:Fl_Tabs:tabs + @x:Fl_Tile:tile + @x:Fl_Scroll:scroll + @x:Fl_Pack:pack + @x:Fl_Menu:menubar + +@main:Window\nTests:@w + @w:overlay:overlay + @w:subwindow:subwindow + @w:double\nbuffer:doublebuffer + @w:GL window:cube + @w:GL overlay:gl_overlay + @w:iconize:iconize + @w:fullscreen:fullscreen + @w:resizable:resizebox + @w:resize:resize + +@main:Drawing\nTests:@d + @d:Images:@di + @di:Fl_Bitmap:bitmap + @di:Fl_Pixmap:pixmap + @di:Fl_RGB\n_Image:image + @di:Fl_Shared\n_Image:pixmap_browser + @di:Fl_Tiled\n_Image:tiled_image + @d:cursor:cursor + @d:labels:label + @d:fl_arc:arc + @d:fl_curve:curve + @d:fl_line_style:line_style + +@main:Events:@u + @u:navigation:navigation + @u:minimum update:minimum + @u:keyboard:keyboard + @u:fast & slow widgets:fast_slow + @u:inactive:inactive + +@main:Fluid\n(UI design tool):../fluid/fluid valuators.fl + +@main:Cool\nDemos:@e + @e:X Color\nBrowser:colbrowser + @e:Mandelbrot:mandelbrot + @e:Fractals:fractals + @e:Puzzle:glpuzzle + @e:shiny\nOpenGL\nbuttons:shiny + @e:Checkers:checkers + +@main:Other\nTests:@o + @o:Color Choosers:color_chooser r + @o:File Chooser:file_chooser + @o:Fonts:fonts + @o:HelpDialog:help + @o:Preferences:preferences + @o:Threading:threads + @o:XForms Emulation:forms + +@main:Tutorial\nfrom\nManual:@j + @j:ask\n(modified):ask + @j:button:button + @j:CubeView:CubeView + @j:editor:editor editor.cxx + @j:hello:hello + @j:shape:shape + +@main:Images\nfor\nManual:@i + @i:valuators:valuators + @i:symbols:symbols + @i:buttons:buttons + @i:clock:clock + @i:popups:message + @i:boxtypes:boxtype diff --git a/third_party/windows/fltk-1.1.10/borlandc/demo.res b/third_party/windows/fltk-1.1.10/borlandc/demo.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/demo.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/doublebuffer.bpf b/third_party/windows/fltk-1.1.10/borlandc/doublebuffer.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/doublebuffer.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/doublebuffer.bpr b/third_party/windows/fltk-1.1.10/borlandc/doublebuffer.bpr new file mode 100644 index 0000000..30b007b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/doublebuffer.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/doublebuffer.res b/third_party/windows/fltk-1.1.10/borlandc/doublebuffer.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/doublebuffer.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/editor.bpf b/third_party/windows/fltk-1.1.10/borlandc/editor.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/editor.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/editor.bpr b/third_party/windows/fltk-1.1.10/borlandc/editor.bpr new file mode 100644 index 0000000..3fa7a31 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/editor.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/editor.res b/third_party/windows/fltk-1.1.10/borlandc/editor.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/editor.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/file_chooser.bpf b/third_party/windows/fltk-1.1.10/borlandc/file_chooser.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/file_chooser.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/file_chooser.bpr b/third_party/windows/fltk-1.1.10/borlandc/file_chooser.bpr new file mode 100644 index 0000000..f051bf8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/file_chooser.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/file_chooser.res b/third_party/windows/fltk-1.1.10/borlandc/file_chooser.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/file_chooser.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/fltk.bpf b/third_party/windows/fltk-1.1.10/borlandc/fltk.bpf new file mode 100644 index 0000000..f5907ba --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fltk.bpf @@ -0,0 +1,9 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#define Library + +// To add a file to the library use the Project menu 'Add to Project'. + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fltk.bpg b/third_party/windows/fltk-1.1.10/borlandc/fltk.bpg new file mode 100644 index 0000000..f273488 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fltk.bpg @@ -0,0 +1,216 @@ +#------------------------------------------------------------------------------ +VERSION = BWS.01 +#------------------------------------------------------------------------------ +!ifndef ROOT +ROOT = $(MAKEDIR)\.. +!endif +#------------------------------------------------------------------------------ +MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$** +DCC = $(ROOT)\bin\dcc32.exe $** +BRCC = $(ROOT)\bin\brcc32.exe $** +#------------------------------------------------------------------------------ +PROJECTS = fltklib.lib fluid.exe arc.exe ask.exe bitmap.exe boxtype.exe \ + browser.exe button.exe buttons.exe checkers.exe clock.exe colbrowser.exe \ + color_chooser.exe cube.exe cursor.exe curve.exe demo.exe doublebuffer.exe \ + editor.exe file_chooser.exe fonts.exe forms.exe fractals.exe fullscreen.exe \ + hello.exe help.exe iconize.exe image.exe input.exe label.exe line_style.exe \ + menubar.exe message.exe minimum.exe navigation.exe output.exe overlay.exe \ + pack.exe pixmap.exe pixmap_browser.exe resizebox.exe scroll.exe shape.exe \ + subwindow.exe symbols.exe tile.exe tiled_image.exe +#------------------------------------------------------------------------------ +default: $(PROJECTS) +#------------------------------------------------------------------------------ + +fltklib.lib: fltklib.bpr + $(ROOT)\bin\bpr2mak -t$(ROOT)\bin\deflib.bmk $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +ask.exe: ..\test\ask.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +bitmap.exe: bitmap.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +arc.exe: arc.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +ask.exe: ask.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +boxtype.exe: boxtype.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +browser.exe: browser.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +button.exe: button.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +buttons.exe: buttons.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +checkers.exe: checkers.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +clock.exe: clock.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +colbrowser.exe: colbrowser.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +color_chooser.exe: color_chooser.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +cube.exe: cube.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +cursor.exe: cursor.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +curve.exe: curve.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +demo.exe: demo.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +doublebuffer.exe: doublebuffer.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +editor.exe: editor.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +file_chooser.exe: file_chooser.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +fonts.exe: fonts.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +forms.exe: forms.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +fractals.exe: fractals.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +fullscreen.exe: fullscreen.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +help.exe: help.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +hello.exe: hello.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +iconize.exe: iconize.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +image.exe: image.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +input.exe: input.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +label.exe: label.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +line_style.exe: line_style.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +menubar.exe: menubar.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +message.exe: message.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +minimum.exe: minimum.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +navigation.exe: navigation.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +output.exe: output.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +overlay.exe: overlay.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +pack.exe: pack.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +pixmap.exe: pixmap.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +pixmap_browser.exe: pixmap_browser.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +resizebox.exe: resizebox.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +scroll.exe: scroll.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +shape.exe: shape.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +subwindow.exe: subwindow.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +symbols.exe: symbols.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +tile.exe: tile.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +tiled_image.exe: tiled_image.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + +fluid.exe: fluid.bpr + $(ROOT)\bin\bpr2mak $** + $(ROOT)\bin\make -$(MAKEFLAGS) -f$*.mak + + diff --git a/third_party/windows/fltk-1.1.10/borlandc/fltk.bpr b/third_party/windows/fltk-1.1.10/borlandc/fltk.bpr new file mode 100644 index 0000000..468a879 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fltk.bpr @@ -0,0 +1,303 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=3 +Item0=.;..;..\src;$(BCB)\include;$(BCB)\include\vcl +Item1=.;..\src;$(BCB)\include;$(BCB)\include\vcl +Item2=..\src;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=1 +Item0=..\src;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=_DEBUG,WIN32 +Item1=_DEBUG + +[HistoryLists\hlTlibPageSize] +Count=1 +Item0=0x0010 + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fltk.dsk b/third_party/windows/fltk-1.1.10/borlandc/fltk.dsk new file mode 100644 index 0000000..381e2ef --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fltk.dsk @@ -0,0 +1,441 @@ +[Closed Files] +File_0=SourceModule,'R:\fltk\test\threads.cxx',0,1,73,1,73,0,0 +File_1=SourceModule,'R:\fltk\test\tile.cxx',0,1,22,9,31,0,0 +File_2=SourceModule,'R:\fltk\test\tiled_image.cxx',0,1,73,1,73,0,0 +File_3=SourceModule,'R:\fltk\test\pixmap.cxx',0,1,53,18,61,0,0 +File_4=SourceModule,'R:\fltk\test\pixmap_browser.cxx',0,1,71,9,80,0,0 +File_5=SourceModule,'R:\fltk\test\list_visuals.cxx',0,1,29,9,39,0,0 +File_6=SourceModule,'R:\fltk\test\keyboard.cxx',0,1,34,22,43,0,0 +File_7=SourceModule,'R:\fltk\BCB6\_readme1st.txt',0,1,26,1,33,0,0 +File_8=SourceModule,'R:\fltk\test\fracviewer.cxx',0,1,1,1,1,0,0 +File_9=SourceModule,'R:\fltk\src\numericsort.c',0,1,1,1,1,0,0 + +[Modules] +Module0=R:\fltk\BCB6\fluid.bpr +Count=1 +EditWindowCount=1 + +[R:\fltk\BCB6\fluid.bpr] +ModuleType=SourceModule +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\fltk.bpg] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\fltklib.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\arc.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\ask.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\bitmap.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\boxtype.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\browser.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\button.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\buttons.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\checkers.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\clock.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\colbrowser.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\color_chooser.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\cube.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\cursor.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\curve.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\demo.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\doublebuffer.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\editor.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\file_chooser.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\fonts.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\forms.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\fractals.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\fullscreen.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\hello.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\help.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\iconize.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\image.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\input.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\label.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\line_style.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\menubar.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\message.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\minimum.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\navigation.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\output.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\overlay.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\pack.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\pixmap.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\pixmap_browser.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\resizebox.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\scroll.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\shape.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\subwindow.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\symbols.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\tile.bpr] +FormState=0 +FormOnTop=0 + +[R:\fltk\BCB6\tiled_image.bpr] +FormState=0 +FormOnTop=0 + +[EditWindow0] +ViewCount=1 +CurrentView=0 +View0=0 +CodeExplorer=CodeExplorer@EditWindow0 +MessageView=MessageView@EditWindow0 +ClassHierarchy=ClassHierarchy@EditWindow0 +Create=1 +Visible=1 +State=0 +Left=339 +Top=125 +Width=696 +Height=482 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=688 +ClientHeight=455 +LeftPanelSize=170 +LeftPanelClients=CodeExplorer@EditWindow0 +LeftPanelData=000004000000000000000000000000000000000000000000000100000000000000000C000000436F64654578706C6F726572FFFFFFFF +RightPanelSize=0 +BottomPanelSize=0 +BottomPanelClients=MessageView@EditWindow0 +BottomPanelData=00000400010000000B0000004D657373616765566965770000000000000000000000000000000000FFFFFFFF + +[View0] +Module=R:\fltk\BCB6\fluid.bpf +CursorX=1 +CursorY=1 +TopLine=1 +LeftCol=1 + +[Watches] +Count=1 +Watch0='h_,x',256,0,18,1,0,'Watches' + +[Breakpoints] +Count=0 + +[AddressBreakpoints] +Count=0 + +[Main Window] +Create=1 +Visible=1 +State=2 +Left=0 +Top=0 +Width=1024 +Height=105 +MaxLeft=-1 +MaxTop=-1 +MaxWidth=1032 +MaxHeight=105 +ClientWidth=1024 +ClientHeight=78 + +[ProjectManager] +Create=1 +Visible=1 +State=0 +Left=1 +Top=100 +Width=320 +Height=605 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=312 +ClientHeight=581 +TBDockHeight=303 +LRDockWidth=438 +Dockable=1 + +[CPUWindow] +Create=1 +Visible=0 +State=0 +Left=75 +Top=78 +Width=949 +Height=690 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=941 +ClientHeight=663 +DumpPane=79 +DisassemblyPane=196 +RegisterPane=231 +FlagPane=78 + +[WatchWindow] +Create=1 +Visible=0 +State=0 +Left=361 +Top=612 +Width=666 +Height=173 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=658 +ClientHeight=149 +TBDockHeight=149 +LRDockWidth=421 +Dockable=1 + +[AlignmentPalette] +Create=1 +Visible=0 +State=0 +Left=200 +Top=107 +Width=156 +Height=82 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=150 +ClientHeight=60 + +[PropertyInspector] +Create=1 +Visible=0 +State=0 +Left=28 +Top=125 +Width=301 +Height=301 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=293 +ClientHeight=277 +TBDockHeight=556 +LRDockWidth=193 +Dockable=1 +SplitPos=85 +ArrangeBy=Name +SelectedItem= +ExpandedItems= +HiddenCategories= + +[ObjectTree] +Create=1 +Visible=0 +State=0 +Left=0 +Top=105 +Width=190 +Height=264 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=182 +ClientHeight=240 +TBDockHeight=264 +LRDockWidth=190 +Dockable=1 + +[CodeguardLog] +Create=1 +Visible=0 +State=0 +Left=191 +Top=108 +Width=448 +Height=190 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=440 +ClientHeight=166 +TBDockHeight=190 +LRDockWidth=448 +Dockable=1 + +[ClassHierarchy@EditWindow0] +Create=1 +Visible=0 +State=0 +Left=218 +Top=113 +Width=403 +Height=284 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=395 +ClientHeight=260 +TBDockHeight=284 +LRDockWidth=403 +Dockable=1 +TreeWidth=121 +Col1Width=120 +Col2Width=120 + +[CodeExplorer@EditWindow0] +Create=1 +Visible=1 +State=0 +Left=0 +Top=12 +Width=170 +Height=443 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=170 +ClientHeight=443 +TBDockHeight=388 +LRDockWidth=170 +Dockable=1 +ClassViewDisplayMode=0 + +[MessageView@EditWindow0] +Create=1 +Visible=0 +State=0 +Left=-145 +Top=-496 +Width=443 +Height=85 +MaxLeft=-1 +MaxTop=-1 +ClientWidth=443 +ClientHeight=85 +TBDockHeight=85 +LRDockWidth=443 +Dockable=1 + +[DockHosts] +DockHostCount=0 + +[ActiveProject] +ActiveProject=47 + diff --git a/third_party/windows/fltk-1.1.10/borlandc/fltk_app_template.bpf b/third_party/windows/fltk-1.1.10/borlandc/fltk_app_template.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fltk_app_template.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fltk_app_template.bpr b/third_party/windows/fltk-1.1.10/borlandc/fltk_app_template.bpr new file mode 100644 index 0000000..8450f54 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fltk_app_template.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fltk_app_template.res b/third_party/windows/fltk-1.1.10/borlandc/fltk_app_template.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/fltk_app_template.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/fltklib.bpf b/third_party/windows/fltk-1.1.10/borlandc/fltklib.bpf new file mode 100644 index 0000000..f5907ba --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fltklib.bpf @@ -0,0 +1,9 @@ +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop +#define Library + +// To add a file to the library use the Project menu 'Add to Project'. + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fltklib.bpr b/third_party/windows/fltk-1.1.10/borlandc/fltklib.bpr new file mode 100644 index 0000000..22e12ad --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fltklib.bpr @@ -0,0 +1,344 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=4 +Item0=..\src;$(BCB)\include;$(BCB)\include\vcl;..\FL;.. +Item1=..\src;$(BCB)\include;$(BCB)\include\vcl;R:\develop.w32\fltk-1.1.0rc3\FL;.. +Item2=..\src;$(BCB)\include;$(BCB)\include\vcl;R:\develop.w32\fltk-1.1.0rc3\FL +Item3=..\src;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=1 +Item0=..\src;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=_DEBUG;WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[HistoryLists\hlFinalOutputDir] +Count=2 +Item0=..\lib\ +Item1=..\lib + +[HistoryLists\hlTlibPageSize] +Count=2 +Item0=0x0040 +Item1=0x0010 + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fluid.bpf b/third_party/windows/fltk-1.1.10/borlandc/fluid.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fluid.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fluid.bpr b/third_party/windows/fltk-1.1.10/borlandc/fluid.bpr new file mode 100644 index 0000000..f8f2624 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fluid.bpr @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fluid.res b/third_party/windows/fltk-1.1.10/borlandc/fluid.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/fluid.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/fonts.bpf b/third_party/windows/fltk-1.1.10/borlandc/fonts.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fonts.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fonts.bpr b/third_party/windows/fltk-1.1.10/borlandc/fonts.bpr new file mode 100644 index 0000000..3878548 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fonts.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fonts.res b/third_party/windows/fltk-1.1.10/borlandc/fonts.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/fonts.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/forms.bpf b/third_party/windows/fltk-1.1.10/borlandc/forms.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/forms.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/forms.bpr b/third_party/windows/fltk-1.1.10/borlandc/forms.bpr new file mode 100644 index 0000000..b4a9554 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/forms.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/forms.res b/third_party/windows/fltk-1.1.10/borlandc/forms.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/forms.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/fractals.bpf b/third_party/windows/fltk-1.1.10/borlandc/fractals.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fractals.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fractals.bpr b/third_party/windows/fltk-1.1.10/borlandc/fractals.bpr new file mode 100644 index 0000000..baed0ad --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fractals.bpr @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fractals.res b/third_party/windows/fltk-1.1.10/borlandc/fractals.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/fractals.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/fullscreen.bpf b/third_party/windows/fltk-1.1.10/borlandc/fullscreen.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fullscreen.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fullscreen.bpr b/third_party/windows/fltk-1.1.10/borlandc/fullscreen.bpr new file mode 100644 index 0000000..8a07e00 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/fullscreen.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/fullscreen.res b/third_party/windows/fltk-1.1.10/borlandc/fullscreen.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/fullscreen.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/hello.bpf b/third_party/windows/fltk-1.1.10/borlandc/hello.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/hello.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/hello.bpr b/third_party/windows/fltk-1.1.10/borlandc/hello.bpr new file mode 100644 index 0000000..0a716ab --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/hello.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/hello.res b/third_party/windows/fltk-1.1.10/borlandc/hello.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/hello.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/help.bpf b/third_party/windows/fltk-1.1.10/borlandc/help.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/help.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/help.bpr b/third_party/windows/fltk-1.1.10/borlandc/help.bpr new file mode 100644 index 0000000..a346d02 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/help.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/help.res b/third_party/windows/fltk-1.1.10/borlandc/help.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/help.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/iconize.bpf b/third_party/windows/fltk-1.1.10/borlandc/iconize.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/iconize.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/iconize.bpr b/third_party/windows/fltk-1.1.10/borlandc/iconize.bpr new file mode 100644 index 0000000..5af8581 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/iconize.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/iconize.res b/third_party/windows/fltk-1.1.10/borlandc/iconize.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/iconize.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/image.bpf b/third_party/windows/fltk-1.1.10/borlandc/image.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/image.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/image.bpr b/third_party/windows/fltk-1.1.10/borlandc/image.bpr new file mode 100644 index 0000000..d54cd2b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/image.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/image.res b/third_party/windows/fltk-1.1.10/borlandc/image.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/image.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/input.bpf b/third_party/windows/fltk-1.1.10/borlandc/input.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/input.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/input.bpr b/third_party/windows/fltk-1.1.10/borlandc/input.bpr new file mode 100644 index 0000000..9b80f6f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/input.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/input.res b/third_party/windows/fltk-1.1.10/borlandc/input.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/input.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/keyboard.bpf b/third_party/windows/fltk-1.1.10/borlandc/keyboard.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/keyboard.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/keyboard.bpr b/third_party/windows/fltk-1.1.10/borlandc/keyboard.bpr new file mode 100644 index 0000000..4cdc021 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/keyboard.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/keyboard.res b/third_party/windows/fltk-1.1.10/borlandc/keyboard.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/keyboard.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/label.bpf b/third_party/windows/fltk-1.1.10/borlandc/label.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/label.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/label.bpr b/third_party/windows/fltk-1.1.10/borlandc/label.bpr new file mode 100644 index 0000000..23d6afc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/label.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/label.res b/third_party/windows/fltk-1.1.10/borlandc/label.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/label.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/line_style.bpf b/third_party/windows/fltk-1.1.10/borlandc/line_style.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/line_style.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/line_style.bpr b/third_party/windows/fltk-1.1.10/borlandc/line_style.bpr new file mode 100644 index 0000000..c35a431 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/line_style.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/line_style.res b/third_party/windows/fltk-1.1.10/borlandc/line_style.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/line_style.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/menubar.bpf b/third_party/windows/fltk-1.1.10/borlandc/menubar.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/menubar.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/menubar.bpr b/third_party/windows/fltk-1.1.10/borlandc/menubar.bpr new file mode 100644 index 0000000..112a2ba --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/menubar.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/menubar.res b/third_party/windows/fltk-1.1.10/borlandc/menubar.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/menubar.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/message.bpf b/third_party/windows/fltk-1.1.10/borlandc/message.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/message.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/message.bpr b/third_party/windows/fltk-1.1.10/borlandc/message.bpr new file mode 100644 index 0000000..e58c2b2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/message.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/message.res b/third_party/windows/fltk-1.1.10/borlandc/message.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/message.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/minimum.bpf b/third_party/windows/fltk-1.1.10/borlandc/minimum.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/minimum.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/minimum.bpr b/third_party/windows/fltk-1.1.10/borlandc/minimum.bpr new file mode 100644 index 0000000..398ae0f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/minimum.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/minimum.res b/third_party/windows/fltk-1.1.10/borlandc/minimum.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/minimum.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/navigation.bpf b/third_party/windows/fltk-1.1.10/borlandc/navigation.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/navigation.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/navigation.bpr b/third_party/windows/fltk-1.1.10/borlandc/navigation.bpr new file mode 100644 index 0000000..8dfebd4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/navigation.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/navigation.res b/third_party/windows/fltk-1.1.10/borlandc/navigation.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/navigation.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/output.bpf b/third_party/windows/fltk-1.1.10/borlandc/output.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/output.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/output.bpr b/third_party/windows/fltk-1.1.10/borlandc/output.bpr new file mode 100644 index 0000000..fdde266 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/output.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/output.res b/third_party/windows/fltk-1.1.10/borlandc/output.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/output.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/overlay.bpf b/third_party/windows/fltk-1.1.10/borlandc/overlay.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/overlay.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/overlay.bpr b/third_party/windows/fltk-1.1.10/borlandc/overlay.bpr new file mode 100644 index 0000000..26b11f5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/overlay.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/overlay.res b/third_party/windows/fltk-1.1.10/borlandc/overlay.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/overlay.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/pack.bpf b/third_party/windows/fltk-1.1.10/borlandc/pack.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/pack.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/pack.bpr b/third_party/windows/fltk-1.1.10/borlandc/pack.bpr new file mode 100644 index 0000000..15163fc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/pack.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/pack.res b/third_party/windows/fltk-1.1.10/borlandc/pack.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/pack.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/pixmap.bpf b/third_party/windows/fltk-1.1.10/borlandc/pixmap.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/pixmap.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/pixmap.bpr b/third_party/windows/fltk-1.1.10/borlandc/pixmap.bpr new file mode 100644 index 0000000..3ca32b1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/pixmap.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/pixmap.res b/third_party/windows/fltk-1.1.10/borlandc/pixmap.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/pixmap.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/pixmap_browser.bpf b/third_party/windows/fltk-1.1.10/borlandc/pixmap_browser.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/pixmap_browser.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/pixmap_browser.bpr b/third_party/windows/fltk-1.1.10/borlandc/pixmap_browser.bpr new file mode 100644 index 0000000..60657df --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/pixmap_browser.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/pixmap_browser.res b/third_party/windows/fltk-1.1.10/borlandc/pixmap_browser.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/pixmap_browser.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/resizebox.bpf b/third_party/windows/fltk-1.1.10/borlandc/resizebox.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/resizebox.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/resizebox.bpr b/third_party/windows/fltk-1.1.10/borlandc/resizebox.bpr new file mode 100644 index 0000000..78f0004 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/resizebox.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/resizebox.res b/third_party/windows/fltk-1.1.10/borlandc/resizebox.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/resizebox.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/scroll.bpf b/third_party/windows/fltk-1.1.10/borlandc/scroll.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/scroll.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/scroll.bpr b/third_party/windows/fltk-1.1.10/borlandc/scroll.bpr new file mode 100644 index 0000000..628c053 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/scroll.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/scroll.res b/third_party/windows/fltk-1.1.10/borlandc/scroll.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/scroll.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/shape.bpf b/third_party/windows/fltk-1.1.10/borlandc/shape.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/shape.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/shape.bpr b/third_party/windows/fltk-1.1.10/borlandc/shape.bpr new file mode 100644 index 0000000..a469b9c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/shape.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/shape.res b/third_party/windows/fltk-1.1.10/borlandc/shape.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/shape.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/subwindow.bpf b/third_party/windows/fltk-1.1.10/borlandc/subwindow.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/subwindow.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/subwindow.bpr b/third_party/windows/fltk-1.1.10/borlandc/subwindow.bpr new file mode 100644 index 0000000..fbb8b26 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/subwindow.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/subwindow.res b/third_party/windows/fltk-1.1.10/borlandc/subwindow.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/subwindow.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/symbols.bpf b/third_party/windows/fltk-1.1.10/borlandc/symbols.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/symbols.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/symbols.bpr b/third_party/windows/fltk-1.1.10/borlandc/symbols.bpr new file mode 100644 index 0000000..f3826d1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/symbols.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/symbols.res b/third_party/windows/fltk-1.1.10/borlandc/symbols.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/symbols.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/tile.bpf b/third_party/windows/fltk-1.1.10/borlandc/tile.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/tile.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/tile.bpr b/third_party/windows/fltk-1.1.10/borlandc/tile.bpr new file mode 100644 index 0000000..f1988d9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/tile.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/tile.res b/third_party/windows/fltk-1.1.10/borlandc/tile.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/tile.res differ diff --git a/third_party/windows/fltk-1.1.10/borlandc/tiled_image.bpf b/third_party/windows/fltk-1.1.10/borlandc/tiled_image.bpf new file mode 100644 index 0000000..34bb717 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/tiled_image.bpf @@ -0,0 +1,3 @@ +This file is used by the project manager only and should be treated like the project file + + main \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/tiled_image.bpr b/third_party/windows/fltk-1.1.10/borlandc/tiled_image.bpr new file mode 100644 index 0000000..22f355e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/borlandc/tiled_image.bpr @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[Version Info] +IncludeVerInfo=0 +AutoIncBuild=0 +MajorVer=1 +MinorVer=0 +Release=0 +Build=0 +Debug=0 +PreRelease=0 +Special=0 +Private=0 +DLL=0 +Locale=1033 +CodePage=1252 + +[Version Info Keys] +CompanyName= +FileDescription= +FileVersion=1.0.0.0 +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion=1.0.0.0 +Comments= + +[HistoryLists\hlIncludePath] +Count=2 +Item0=..\test;..;$(BCB)\include;$(BCB)\include\vcl +Item1=..\test;R:\fltk\BCB6;$(BCB)\include;$(BCB)\include\vcl + +[HistoryLists\hlLibraryPath] +Count=3 +Item0=$(BCB)\Projects\Lib;..\test;$(BCB)\lib\obj;$(BCB)\lib +Item1=..\test;$(BCB)\lib\obj;$(BCB)\lib +Item2=$(BCB)\Projects\Lib;..\test;R:\fltk\BCB6;$(BCB)\lib\obj;$(BCB)\lib + +[HistoryLists\hlDebugSourcePath] +Count=1 +Item0=$(BCB)\source\vcl + +[HistoryLists\hlConditionals] +Count=2 +Item0=WIN32 +Item1=_DEBUG + +[HistoryLists\hlIntOutputDir] +Count=1 +Item0=..\obj + +[Debugging] +DebugSourceDirs=$(BCB)\source\vcl + +[Parameters] +RunParams= +Launcher= +UseLauncher=0 +DebugCWD= +HostApplication= +RemoteHost= +RemotePath= +RemoteLauncher= +RemoteCWD= +RemoteDebug=0 + +[Compiler] +ShowInfoMsgs=0 +LinkDebugVcl=0 +LinkCGLIB=0 + +[CORBA] +AddServerUnit=1 +AddClientUnit=1 +PrecompiledHeaders=1 + + \ No newline at end of file diff --git a/third_party/windows/fltk-1.1.10/borlandc/tiled_image.res b/third_party/windows/fltk-1.1.10/borlandc/tiled_image.res new file mode 100644 index 0000000..e468bf9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/borlandc/tiled_image.res differ diff --git a/third_party/windows/fltk-1.1.10/configh.cmake.in b/third_party/windows/fltk-1.1.10/configh.cmake.in new file mode 100644 index 0000000..acd6298 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/configh.cmake.in @@ -0,0 +1,265 @@ +/* + * "$Id: configh.cmake.in 6106 2008-04-21 21:10:47Z matt $" + * + * Configuration file for the Fast Light Tool Kit (FLTK). + * @configure_input@ + * + * Copyright 1998-2008 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems to "fltk-bugs@fltk.org". + */ + +/* + * Where to find files... + */ + +#define FLTK_DATADIR "@FLTK_DATADIR@" +#define FLTK_DOCDIR "@FLTK_DOCDIR@" + +/* + * BORDER_WIDTH: + * + * Thickness of FL_UP_BOX and FL_DOWN_BOX. Current 1,2, and 3 are + * supported. + * + * 3 is the historic FLTK look. + * 2 is the default and looks like Microsoft Windows, KDE, and Qt. + * 1 is a plausible future evolution... + * + * Note that this may be simulated at runtime by redefining the boxtypes + * using Fl::set_boxtype(). + */ + +#define BORDER_WIDTH 2 + +/* + * HAVE_GL: + * + * Do you have OpenGL? Set this to 0 if you don't have or plan to use + * OpenGL, and FLTK will be smaller. + */ + +#define HAVE_GL @HAVE_GL@ + +/* + * HAVE_GL_GLU_H: + * + * Do you have the OpenGL Utility Library header file? + * (many broken Mesa RPMs do not...) + */ + +#cmakedefine HAVE_GL_GLU_H @HAVE_GL_GLU_H@ + +/* + * USE_COLORMAP: + * + * Setting this to zero will save a good deal of code (especially for + * fl_draw_image), but FLTK will only work on TrueColor visuals. + */ + +#define USE_COLORMAP 1 + +/* + * USE_XFT + * + * Use the new Xft library to draw anti-aliased text. + */ + +#define USE_XFT 0 + +/* + * HAVE_XDBE: + * + * Do we have the X double-buffer extension? + */ + +#define HAVE_XDBE 0 + +/* + * USE_XDBE: + * + * Actually try to use the double-buffer extension? + */ + +#define USE_XDBE HAVE_XDBE + +/* + * USE_QUARTZ: + * + * Use Quartz instead of Quickdraw on Apple Mac OS X machines. + * FLTK was originally ported to Quickdraw which is no longer + * supported by Apple. If USE_QUARTZ is defined, FLTK will be + * compiled using Quartz instead. This flag has no meaning on + * other operating systems. + */ + +#cmakedefine FLTK_APPLE +#ifdef FLTK_APPLE + #cmakedefine FLTK_QUARTZ + #ifdef FLTK_QUARTZ + #define USE_QUARTZ 1 + #define __APPLE_QUARTZ__ + #undef __APPLE_QD__ + #else + #define USE_QUARTZ 0 + #undef __APPLE_QUARTZ__ + #define __APPLE_QD__ + #endif +#endif + +/* + * HAVE_OVERLAY: + * + * Use the X overlay extension? FLTK will try to use an overlay + * visual for Fl_Overlay_Window, the Gl_Window overlay, and for the + * menus. Setting this to zero will remove a substantial amount of + * code from FLTK. Overlays have only been tested on SGI servers! + */ + +#define HAVE_OVERLAY 0 + +/* + * HAVE_GL_OVERLAY: + * + * It is possible your GL has an overlay even if X does not. If so, + * set this to 1. + */ + +#define HAVE_GL_OVERLAY HAVE_OVERLAY + +/* + * WORDS_BIGENDIAN: + * + * Byte order of your machine: 1 = big-endian, 0 = little-endian. + */ + +#define WORDS_BIGENDIAN 0 + +/* + * U16, U32, U64: + * + * Types used by fl_draw_image. One of U32 or U64 must be defined. + * U16 is optional but FLTK will work better with it! + */ + +#cmakedefine U16 @U16@ +#cmakedefine U32 @U32@ +#cmakedefine U64 @U64@ + +/* + * HAVE_DIRENT_H, HAVE_SYS_NDIR_H, HAVE_SYS_DIR_H, HAVE_NDIR_H, HAVE_SCANDIR: + * + * Where is (used only by fl_file_chooser and scandir). + */ + +#cmakedefine HAVE_DIRENT_H @HAVE_DIRENT_H@ +#cmakedefine HAVE_SYS_NDIR_H @HAVE_SYS_NDIR_H@ +#cmakedefine HAVE_SYS_DIR_H @HAVE_SYS_DIR_H@ +#cmakedefine HAVE_NDIR_H @HAVE_NDIR_H@ +#cmakedefine HAVE_SCANDIR @HAVE_SCANDIR@ + +/* + * Possibly missing sprintf-style functions: + */ + +#cmakedefine HAVE_VSNPRINTF @HAVE_VSNPRINTF@ +#cmakedefine HAVE_SNPRINTF @HAVE_SNPRINTF@ + +/* + * String functions and headers... + */ + +#cmakedefine HAVE_STRINGS_H @HAVE_STRINGS_H@ +#cmakedefine HAVE_STRCASECMP @HAVE_STRCASECMP@ +#cmakedefine HAVE_STRLCAT @HAVE_STRLCAT@ +#cmakedefine HAVE_STRLCPY @HAVE_STRLCPY@ + +/* + * 'locale' functions + */ + +#cmakedefine HAVE_LOCALE_H @HAVE_LOCALE_H@ +#cmakedefine HAVE_LOCALECONV @HAVE_LOCALECONV@ + +/* + * HAVE_SYS_SELECT_H: + * + * Whether or not select() call has its own header file. + */ + +#cmakedefine HAVE_SYS_SELECT_H @HAVE_SYS_SELECT_H@ + +/* + * HAVE_SYS_STDTYPES_H: + * + * Whether or not we have the header file. + */ + +#cmakedefine HAVE_SYS_STDTYPES_H @HAVE_SYS_STDTYPES_H@ + +/* + * USE_POLL: + * + * Use the poll() call provided on Linux and Irix instead of select() + */ + +#define USE_POLL 0 + +/* + * Do we have various image libraries? + */ + +#cmakedefine HAVE_LIBPNG @HAVE_LIBPNG@ +#cmakedefine HAVE_LIBZ @HAVE_LIBZ@ +#cmakedefine HAVE_LIBJPEG @HAVE_LIBJPEG@ + +/* + * Which header file do we include for libpng? + */ + +#cmakedefine HAVE_PNG_H @HAVE_PNG_H@ +#cmakedefine HAVE_LIBPNG_PNG_H @HAVE_LIBPNG_PNG_H@ + +/* + * Do we have the png_xyz() functions? + */ + +#cmakedefine HAVE_PNG_GET_VALID @HAVE_PNG_GET_VALID@ +#cmakedefine HAVE_PNG_SET_TRNS_TO_ALPHA @HAVE_PNG_SET_TRNS_TO_ALPHA@ + +/* + * Do we have POSIX threading? + */ + +#cmakedefine CMAKE_USE_PTHREADS +#ifdef CMAKE_USE_PTHREADS +#define HAVE_PTHREAD 1 +#else +#define HAVE_PTHREAD 0 +#endif + +#cmakedefine CMAKE_HAVE_PTHREAD_H +#ifdef CMAKE_HAVE_PTHREAD_H +#define HAVE_PTHREAD_H 1 +#else +#define HAVE_PTHREAD_H 0 +#endif + +/* + * End of "$Id: configh.cmake.in 6106 2008-04-21 21:10:47Z matt $". + */ diff --git a/third_party/windows/fltk-1.1.10/configh.in b/third_party/windows/fltk-1.1.10/configh.in new file mode 100644 index 0000000..2a9a034 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/configh.in @@ -0,0 +1,301 @@ +/* + * "$Id: configh.in 6832 2009-07-23 22:36:04Z AlbrechtS $" + * + * Configuration file for the Fast Light Tool Kit (FLTK). + * @configure_input@ + * + * Copyright 1998-2007 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems on the following page: + * + * http://www.fltk.org/str.php + */ + +/* + * Where to find files... + */ + +#define FLTK_DATADIR "" +#define FLTK_DOCDIR "" + +/* + * BORDER_WIDTH: + * + * Thickness of FL_UP_BOX and FL_DOWN_BOX. Current 1,2, and 3 are + * supported. + * + * 3 is the historic FLTK look. + * 2 is the default and looks like Microsoft Windows, KDE, and Qt. + * 1 is a plausible future evolution... + * + * Note that this may be simulated at runtime by redefining the boxtypes + * using Fl::set_boxtype(). + */ + +#define BORDER_WIDTH 2 + +/* + * HAVE_GL: + * + * Do you have OpenGL? Set this to 0 if you don't have or plan to use + * OpenGL, and FLTK will be smaller. + */ + +#define HAVE_GL 0 + +/* + * HAVE_GL_GLU_H: + * + * Do you have the OpenGL Utility Library header file? + * (many broken Mesa RPMs do not...) + */ + +#undef HAVE_GL_GLU_H + +/* + * HAVE_GLXGETPROCADDRESSARB: + * + * Do you have the OpenGL glXGetProcAddressARB() function? + */ + +#undef HAVE_GLXGETPROCADDRESSARB + +/* + * USE_COLORMAP: + * + * Setting this to zero will save a good deal of code (especially for + * fl_draw_image), but FLTK will only work on TrueColor visuals. + */ + +#define USE_COLORMAP 1 + +/* + * HAVE_XINERAMA + * + * Do we have the Xinerama library to support multi-head displays? + */ + +#define HAVE_XINERAMA 0 + +/* + * USE_XFT + * + * Use the new Xft library to draw anti-aliased text. + */ + +#define USE_XFT 0 + +/* + * HAVE_XDBE: + * + * Do we have the X double-buffer extension? + */ + +#define HAVE_XDBE 0 + +/* + * USE_XDBE: + * + * Actually try to use the double-buffer extension? + */ + +#define USE_XDBE HAVE_XDBE + +/* + * USE_QUARTZ: + * + * Use Quartz instead of Quickdraw on Apple Mac OS X machines. + * FLTK was originally ported to Quickdraw which is no longer + * supported by Apple. If USE_QUARTZ is defined, FLTK will be + * compiled using Quartz instead. This flag has no meaning on + * other operating systems. + */ + +#define USE_QUARTZ 0 +#undef __APPLE_QUARTZ__ +#undef __APPLE_QD__ + +/* + * HAVE_OVERLAY: + * + * Use the X overlay extension? FLTK will try to use an overlay + * visual for Fl_Overlay_Window, the Gl_Window overlay, and for the + * menus. Setting this to zero will remove a substantial amount of + * code from FLTK. Overlays have only been tested on SGI servers! + */ + +#define HAVE_OVERLAY 0 + +/* + * HAVE_GL_OVERLAY: + * + * It is possible your GL has an overlay even if X does not. If so, + * set this to 1. + */ + +#define HAVE_GL_OVERLAY HAVE_OVERLAY + +/* + * WORDS_BIGENDIAN: + * + * Byte order of your machine: 1 = big-endian, 0 = little-endian. + */ + +#define WORDS_BIGENDIAN 0 + +/* + * U16, U32, U64: + * + * Types used by fl_draw_image. One of U32 or U64 must be defined. + * U16 is optional but FLTK will work better with it! + */ + +#undef U16 +#undef U32 +#undef U64 + +/* + * HAVE_DIRENT_H, HAVE_SYS_NDIR_H, HAVE_SYS_DIR_H, HAVE_NDIR_H, + * HAVE_SCANDIR, HAVE_SCANDIR_POSIX: + * + * Where is (used only by fl_file_chooser and scandir). + */ + +#undef HAVE_DIRENT_H +#undef HAVE_SYS_NDIR_H +#undef HAVE_SYS_DIR_H +#undef HAVE_NDIR_H +#undef HAVE_SCANDIR +#undef HAVE_SCANDIR_POSIX + +/* + * Possibly missing sprintf-style functions: + */ + +#undef HAVE_VSNPRINTF +#undef HAVE_SNPRINTF + +/* + * String functions and headers... + */ + +#undef HAVE_STRINGS_H +#undef HAVE_STRCASECMP +#undef HAVE_STRLCAT +#undef HAVE_STRLCPY + +/* + * Do we have POSIX locale support? + */ + +#undef HAVE_LOCALE_H +#undef HAVE_LOCALECONV + +/* + * HAVE_SYS_SELECT_H: + * + * Whether or not select() call has its own header file. + */ + +#undef HAVE_SYS_SELECT_H + +/* + * HAVE_SYS_STDTYPES_H: + * + * Whether or not we have the header file. + */ + +#undef HAVE_SYS_STDTYPES_H + +/* + * USE_POLL: + * + * Use the poll() call provided on Linux and Irix instead of select() + */ + +#define USE_POLL 0 + +/* + * Do we have various image libraries? + */ + +#undef HAVE_LIBPNG +#undef HAVE_LIBZ +#undef HAVE_LIBJPEG + +/* + * Which header file do we include for libpng? + */ + +#undef HAVE_PNG_H +#undef HAVE_LIBPNG_PNG_H + +/* + * Do we have the png_xyz() functions? + */ + +#undef HAVE_PNG_GET_VALID +#undef HAVE_PNG_SET_TRNS_TO_ALPHA + +/* + * Do we have POSIX threading? + */ + +#undef HAVE_PTHREAD +#undef HAVE_PTHREAD_H + +/* + * Do we have the ALSA library? + */ + +#undef HAVE_ALSA_ASOUNDLIB_H + +/* + * Do we have the long long type? + */ + +#undef HAVE_LONG_LONG + +#ifdef HAVE_LONG_LONG +# define FLTK_LLFMT "%lld" +# define FLTK_LLCAST (long long) +#else +# define FLTK_LLFMT "%ld" +# define FLTK_LLCAST (long) +#endif /* HAVE_LONG_LONG */ + +/* + * Do we have the strtoll() function? + */ + +#undef HAVE_STRTOLL + +#ifndef HAVE_STRTOLL +# define strtoll(nptr,endptr,base) strtol((nptr), (endptr), (base)) +#endif /* !HAVE_STRTOLL */ + +/* + * Do we have the dlsym() function and header? + */ + +#undef HAVE_DLFCN_H +#undef HAVE_DLSYM + +/* + * End of "$Id: configh.in 6832 2009-07-23 22:36:04Z AlbrechtS $". + */ diff --git a/third_party/windows/fltk-1.1.10/configure b/third_party/windows/fltk-1.1.10/configure new file mode 100644 index 0000000..a3738fd --- /dev/null +++ b/third_party/windows/fltk-1.1.10/configure @@ -0,0 +1,9045 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.65. +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= +PACKAGE_URL= + +ac_unique_file="src/Fl.cxx" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +MAKEDEPEND +CAT6EXT +CAT3EXT +CAT1EXT +UNINSTALL_DESKTOP +INSTALL_DESKTOP +THREADS +OSX_ONLY +POSTBUILD +HLINKS +GLLIB +XPROP +FTCONFIG +X_EXTRA_LIBS +X_LIBS +X_PRE_LIBS +X_CFLAGS +XMKMF +PTHREAD_FLAGS +ZLIBINC +ZLIB +PNGINC +PNG +JPEGINC +JPEG +STATICIMAGELIBS +IMAGELIBS +AUDIOLIBS +LARGEFILE +EGREP +GREP +CPP +LIBCOMMAND +AR +RANLIB +HTMLDOC +GROFF +NROFF +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +ac_ct_CXX +CXXFLAGS +CXX +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +FLUID +LINKSHARED +SHAREDSUFFIX +IMGDSONAME +GLDSONAME +FLDSONAME +DSONAME +DSOLINK +DSOFLAGS +DSOCOMMAND +IMGLIBBASENAME +GLLIBBASENAME +FLLIBBASENAME +LIBBASENAME +LINKFLTKIMG +LINKFLTKGL +LINKFLTKFORMS +LINKFLTK +LIBNAME +LIBEXT +IMGLIBNAME +GLLIBNAME +GLDEMOS +FLLIBNAME +OPTIM +ARCHFLAGS +FL_API_VERSION +FL_PATCH_VERSION +FL_MINOR_VERSION +FL_MAJOR_VERSION +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_cygwin +enable_debug +enable_gl +enable_shared +enable_threads +with_optim +with_archflags +enable_quartz +enable_largefile +enable_localjpeg +enable_localzlib +enable_localpng +with_links +with_x +enable_xinerama +enable_xft +enable_xdbe +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CPP +XMKMF' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information." + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +X features: + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-cygwin use the CygWin libraries default=no + --enable-debug turn on debugging default=no + --enable-gl turn on OpenGL support default=yes + --enable-shared turn on shared libraries default=no + --enable-threads enable multi-threading support + --enable-quartz use Quartz instead of Quickdraw (default=no) + --disable-largefile omit support for large files + --enable-localjpeg use local JPEG library, default=auto + --enable-localzlib use local ZLIB library, default=auto + --enable-localpng use local PNG library, default=auto + --enable-xinerama turn on Xinerama support default=no + --enable-xft turn on Xft support default=no + --enable-xdbe turn on Xdbe support default=no + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-optim="flags" use custom optimization flags + --with-archflags="flags" + use custom architecture flags + --with-links make header links for common misspellings + --with-x use the X Window System + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + XMKMF Path to xmkmf, Makefile generator for X Window System + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.65 + +Copyright (C) 2009 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_compile + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 &5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_func +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by $as_me, which was +generated by GNU Autoconf 2.65. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +FL_MAJOR_VERSION=1 +FL_MINOR_VERSION=1 +FL_PATCH_VERSION=10 +FL_API_VERSION=${FL_MAJOR_VERSION}.${FL_MINOR_VERSION} + + + + + + +uname=`uname` +uversion=`uname -r | sed -e '1,$s/[^0-9]//g'` +if test "x$uname" = xIRIX64; then + uname="IRIX" +fi +if test "x$uname" = x; then + # MingW doesn't provide any output when uname is run, even with "-s"... + uname="CYGWIN" +fi + +ARCHFLAGS="${ARCHFLAGS:=}" +CFLAGS="${CFLAGS:=}" +CPPFLAGS="${CPPFLAGS:=}" +CXXFLAGS="${CXXFLAGS:=}" +DSOFLAGS="${DSOFLAGS:=}" +LDFLAGS="${LDFLAGS:=}" +OPTIM="${OPTIM:=}" + + + + +case $uname in + CYGWIN* | MINGW*) + # Handle Cygwin option *first*, before all other tests. + # Check whether --enable-cygwin was given. +if test "${enable_cygwin+set}" = set; then : + enableval=$enable_cygwin; +fi + + if test x$enable_cygwin != xyes; then + # NOTE: We can't use ARCHFLAGS for this, since it does not work + # with some of the function tests - Cygwin uses a + # different C library... + CFLAGS="$CFLAGS -mno-cygwin" + CPPFLAGS="$CPPFLAGS -mno-cygwin" + CXXFLAGS="$CXXFLAGS -mno-cygwin" + LDFLAGS="$LDFLAGS -mno-cygwin" + DSOFLAGS="$DSOFLAGS -mno-cygwin" + fi + ;; + Darwin*) + # Starting with 10.6 (Snow Leopard), OS X does not support + # Carbon calls anymore. We patch this until we are completely Cocoa compliant + # by limiting ourselves to 32 bit Intel compiles + d_ver_rev=`sw_vers -productVersion | sed -e 's/\.[0-9][0-9]*//2'` + d_ver=`echo $d_ver_rev | sed -e 's/\.[0-9][0-9]*//'` + d_rev=`echo $d_ver_rev | sed -e 's/[0-9][0-9]*\.//'` + if test $d_ver -gt 10 -o $d_ver -eq 10 -a $d_rev -ge 6; then + CFLAGS="$CFLAGS -arch i386" + CXXFLAGS="$CXXFLAGS -arch i386" + LDFLAGS="$LDFLAGS -arch i386" + fi + ;; +esac + +LINKFLTK="../lib/libfltk.a" +LINKFLTKFORMS="../lib/libfltk_forms.a" +LINKFLTKGL="../lib/libfltk_gl.a" +LINKFLTKIMG="../lib/libfltk_images.a" +GLDEMOS="gldemos" + +LIBEXT=".a" +LIBNAME="../lib/libfltk.a" +FLLIBNAME="../lib/libfltk_forms.a" +GLLIBNAME="../lib/libfltk_gl.a" +IMGLIBNAME="../lib/libfltk_images.a" + +LIBBASENAME="libfltk.a" +FLLIBBASENAME="libfltk_forms.a" +GLLIBBASENAME="libfltk_gl.a" +IMGLIBBASENAME="libfltk_images.a" + + + + + + + + + + + + + + + + + +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; +fi + +if test x$enable_debug = xyes; then + DEBUGFLAG="-g " +else + DEBUGFLAG="" +fi + +# Check whether --enable-gl was given. +if test "${enable_gl+set}" = set; then : + enableval=$enable_gl; +fi + + +# Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; +fi + +if test x$enable_shared = xyes; then + PICFLAG=1 + SHAREDSUFFIX="" + FLUID="fluid-shared" + + case $uname in + Darwin*) + DSONAME="libfltk.$FL_API_VERSION.dylib" + FLDSONAME="libfltk_forms.$FL_API_VERSION.dylib" + GLDSONAME="libfltk_gl.$FL_API_VERSION.dylib" + IMGDSONAME="libfltk_images.$FL_API_VERSION.dylib" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -dynamiclib -lc -o" + ;; + + SunOS* | UNIX_S*) + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -h \$@ \$(LDLIBS) -G $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib"; then + DSOLINK="-R$libdir" + fi + ;; + HP-UX*) + DSONAME="libfltk.sl.$FL_API_VERSION" + FLDSONAME="libfltk_forms.sl.$FL_API_VERSION" + GLDSONAME="libfltk_gl.sl.$FL_API_VERSION" + IMGDSONAME="libfltk_images.sl.$FL_API_VERSION" + DSOCOMMAND="ld \$(DSOFLAGS) -b -z +h \$@ $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib"; then + DSOLINK="-Wl,-rpath,$libdir" + fi + ;; + IRIX*) + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@,-set_version,sgi1.1 \$(LDLIBS) -shared $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/usr/lib32" -a "x$libdir" != "x/usr/lib64"; then + DSOLINK="-Wl,-rpath,$libdir" + fi + ;; + OSF1*) + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/usr/lib32"; then + DSOLINK="-Wl,-rpath,$libdir" + fi + ;; + Linux* | *BSD*) + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared -fPIC $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib"; then + DSOLINK="-Wl,-rpath,$libdir" + fi + ;; + AIX*) + DSONAME="libfltk_s.a" + FLDSONAME="libfltk_forms_s.a" + GLDSONAME="libfltk_gl_s.a" + IMGDSONAME="libfltk_images_s.a" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-bexpall,-bM:SRE,-bnoentry -o" + SHAREDSUFFIX="_s" + ;; + CYGWIN* | MINGW*) + PICFLAG=0 + if test x$enable_cygwin != xyes; then + DSONAME="mgwfltknox-$FL_API_VERSION.dll" + FLDSONAME="mgwfltknox_forms-$FL_API_VERSION.dll" + GLDSONAME="mgwfltknox_gl-$FL_API_VERSION.dll" + IMGDSONAME="mgwfltknox_images-$FL_API_VERSION.dll" + else + DSONAME="cygfltknox-$FL_API_VERSION.dll" + FLDSONAME="cygfltknox_forms-$FL_API_VERSION.dll" + GLDSONAME="cygfltknox_gl-$FL_API_VERSION.dll" + IMGDSONAME="cygfltknox_images-$FL_API_VERSION.dll" + fi + #----------------------------------------------------------- + # -Wl,--enable-runtime-pseudo-reloc: See str 1585 + # appears to be necessary for older binutils versions < 2.16 + #----------------------------------------------------------- + LDFLAGS="$LDFLAGS -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -shared \ + -Wl,--whole-archive -Wl,--export-all-symbols \ + -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-import \ + -Wl,--enable-auto-image-base -o \$@" + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Shared libraries may not be supported. Trying -shared option with compiler." >&5 +$as_echo "$as_me: WARNING: Shared libraries may not be supported. Trying -shared option with compiler." >&2;} + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o" + ;; + esac + + LINKSHARED="-L../src -lfltk_images$SHAREDSUFFIX -lfltk_forms$SHAREDSUFFIX -lfltk$SHAREDSUFFIX" +else + DSOCOMMAND="echo" + DSOLINK="" + DSONAME="" + FLDSONAME="" + GLDSONAME="" + IMGDSONAME="" + PICFLAG=0 + SHAREDSUFFIX="" + FLUID="fluid" + LINKSHARED="../lib/libfltk_images.a ../lib/libfltk_forms.a ../lib/libfltk.a" +fi + + + + + + + + + + + + +# Check whether --enable-threads was given. +if test "${enable_threads+set}" = set; then : + enableval=$enable_threads; +fi + + + +# Check whether --with-optim was given. +if test "${with_optim+set}" = set; then : + withval=$with_optim; +fi + + + +# Check whether --with-archflags was given. +if test "${with_archflags+set}" = set; then : + withval=$with_archflags; ARCHFLAGS="$withval" +fi + + +case $uname in + Darwin*) + # Check whether --enable-quartz was given. +if test "${enable_quartz+set}" = set; then : + enableval=$enable_quartz; +fi + + if test "x$enable_quartz" = "xyes"; then + $as_echo "#define USE_QUARTZ 1" >>confdefs.h + + $as_echo "#define __APPLE_QUARTZ__ 1" >>confdefs.h + + else + $as_echo "#define __APPLE_QD__ 1" >>confdefs.h + + fi + ;; +esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "no acceptable C compiler found in \$PATH +See \`config.log' for more details." "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "C compiler cannot create executables +See \`config.log' for more details." "$LINENO" 5; }; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of object files: cannot compile +See \`config.log' for more details." "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + for ac_t in install-sh install.sh shtool; do + if test -f "$ac_dir/$ac_t"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/$ac_t -c" + break 2 + fi + done +done +if test -z "$ac_aux_dir"; then + as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +case $uname in + OSF1*) + INSTALL="`pwd`/install-sh -c" + ;; +esac +if test "$INSTALL" = "$ac_install_sh"; then + # Use full path to install-sh script... + INSTALL="`pwd`/install-sh -c" +fi +# Extract the first word of "nroff", so it can be a program name with args. +set dummy nroff; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_NROFF+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $NROFF in + [\\/]* | ?:[\\/]*) + ac_cv_path_NROFF="$NROFF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_NROFF="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +NROFF=$ac_cv_path_NROFF +if test -n "$NROFF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NROFF" >&5 +$as_echo "$NROFF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test "x$NROFF" = "x:"; then + # Try groff instead of nroff... + # Extract the first word of "groff", so it can be a program name with args. +set dummy groff; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_GROFF+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $GROFF in + [\\/]* | ?:[\\/]*) + ac_cv_path_GROFF="$GROFF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_GROFF="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +GROFF=$ac_cv_path_GROFF +if test -n "$GROFF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GROFF" >&5 +$as_echo "$GROFF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$GROFF" = "x:"; then + NROFF="echo" + else + NROFF="$GROFF -T ascii" + fi +fi +# Extract the first word of "htmldoc", so it can be a program name with args. +set dummy htmldoc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_HTMLDOC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $HTMLDOC in + [\\/]* | ?:[\\/]*) + ac_cv_path_HTMLDOC="$HTMLDOC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_HTMLDOC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +HTMLDOC=$ac_cv_path_HTMLDOC +if test -n "$HTMLDOC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HTMLDOC" >&5 +$as_echo "$HTMLDOC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +# Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_AR+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $AR in + [\\/]* | ?:[\\/]*) + ac_cv_path_AR="$AR" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_AR="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +AR=$ac_cv_path_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +if test "x$AR" = "x:"; then + { as_fn_set_status aborting. +as_fn_error "Configure could not find the library archiver" "$LINENO" 5; } +fi + +if test "x$RANLIB" != "x:"; then + LIBCOMMAND="$AR cr" +else + LIBCOMMAND="$AR crs" +fi + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if test "${ac_cv_c_bigendian+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + + # Check for potential -arch flags. It is not universal unless + # there are at least two -arch flags with different values. + ac_arch= + ac_prev= + for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do + if test -n "$ac_prev"; then + case $ac_word in + i?86 | x86_64 | ppc | ppc64) + if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then + ac_arch=$ac_word + else + ac_cv_c_bigendian=universal + break + fi + ;; + esac + ac_prev= + elif test "x$ac_word" = "x-arch"; then + ac_prev=arch + fi + done +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_bigendian=yes +else + ac_cv_c_bigendian=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then : + # Try to guess by grepping values from an object file. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + ac_cv_c_bigendian=no +else + ac_cv_c_bigendian=yes +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h +;; #( + no) + ;; #( + universal) + +$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h + + ;; #( + *) + as_fn_error "unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; + esac + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 +$as_echo_n "checking size of short... " >&6; } +if test "${ac_cv_sizeof_short+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_short" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (short) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_short=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 +$as_echo "$ac_cv_sizeof_short" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SHORT $ac_cv_sizeof_short +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if test "${ac_cv_sizeof_int+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (int) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_int=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if test "${ac_cv_sizeof_long+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "cannot compute sizeof (long) +See \`config.log' for more details." "$LINENO" 5; }; } + else + ac_cv_sizeof_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG $ac_cv_sizeof_long +_ACEOF + + +if test $ac_cv_sizeof_short -eq 2; then + $as_echo "#define U16 unsigned short" >>confdefs.h + +fi +if test $ac_cv_sizeof_int -eq 4; then + $as_echo "#define U32 unsigned" >>confdefs.h + +else + if test $ac_cv_sizeof_long -eq 4; then + $as_echo "#define U32 unsigned long" >>confdefs.h + + fi +fi +if test $ac_cv_sizeof_int -eq 8; then + $as_echo "#define U64 unsigned" >>confdefs.h + +else + if test $ac_cv_sizeof_long -eq 8; then + $as_echo "#define U64 unsigned long" >>confdefs.h + + fi +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler recognizes bool as a built-in type" >&5 +$as_echo_n "checking whether the compiler recognizes bool as a built-in type... " >&6; } +if test "${ac_cv_cxx_bool+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + int f(int x){return 1;} + int f(char x){return 1;} + int f(bool x){return 1;} + +int +main () +{ + + bool b = true; + return f(b); + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_cxx_bool=yes +else + ac_cv_cxx_bool=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_bool" >&5 +$as_echo "$ac_cv_cxx_bool" >&6; } + +if test "$ac_cv_cxx_bool" != yes; then + CXXFLAGS="-Dbool=char -Dfalse=0 -Dtrue=1 $CXXFLAGS" +fi + +ac_header_dirent=no +for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do + as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 +$as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include <$ac_hdr> + +int +main () +{ +if ((DIR *) 0) +return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$as_ac_Header=yes" +else + eval "$as_ac_Header=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$as_ac_Header + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 +_ACEOF + +ac_header_dirent=$ac_hdr; break +fi + +done +# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. +if test $ac_header_dirent = dirent.h; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dir; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : + +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 +$as_echo_n "checking for library containing opendir... " >&6; } +if test "${ac_cv_search_opendir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char opendir (); +int +main () +{ +return opendir (); + ; + return 0; +} +_ACEOF +for ac_lib in '' x; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_opendir=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_opendir+set}" = set; then : + break +fi +done +if test "${ac_cv_search_opendir+set}" = set; then : + +else + ac_cv_search_opendir=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 +$as_echo "$ac_cv_search_opendir" >&6; } +ac_res=$ac_cv_search_opendir +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +fi + +ac_fn_c_check_header_mongrel "$LINENO" "sys/select.h" "ac_cv_header_sys_select_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_select_h" = x""yes; then : + $as_echo "#define HAVE_SYS_SELECT_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_header_mongrel "$LINENO" "sys/stdtypes.h" "ac_cv_header_sys_stdtypes_h" "$ac_includes_default" +if test "x$ac_cv_header_sys_stdtypes_h" = x""yes; then : + $as_echo "#define HAVE_SYS_SELECT_H 1" >>confdefs.h + +fi + + +ac_fn_c_check_func "$LINENO" "scandir" "ac_cv_func_scandir" +if test "x$ac_cv_func_scandir" = x""yes; then : + if test "x$uname" = xSunOS -o "x$uname" = xQNX; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using $uname scandir emulation function." >&5 +$as_echo "$as_me: WARNING: Not using $uname scandir emulation function." >&2;} + else + $as_echo "#define HAVE_SCANDIR 1" >>confdefs.h + + fi +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we have the POSIX compatible scandir() prototype" >&5 +$as_echo_n "checking whether we have the POSIX compatible scandir() prototype... " >&6; } +if test "${ac_cv_cxx_scandir_posix+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + + + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + #include + int func (const char *d, dirent ***list, void *sort) { + int n = scandir(d, list, 0, (int(*)(const dirent **, const dirent **))sort); + } + +int +main () +{ + + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_cxx_scandir_posix=yes +else + ac_cv_cxx_scandir_posix=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_scandir_posix" >&5 +$as_echo "$ac_cv_cxx_scandir_posix" >&6; } + +if test "$ac_cv_cxx_scandir_posix" = yes; then + $as_echo "#define HAVE_SCANDIR_POSIX 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" +if test "x$ac_cv_func_vsnprintf" = x""yes; then : + + case "$uname" in + HP-UX*) + if test "$uversion" = "1020"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in vsnprintf function because you are running HP-UX 10.20." >&5 +$as_echo "$as_me: WARNING: Not using built-in vsnprintf function because you are running HP-UX 10.20." >&2;} + else + $as_echo "#define HAVE_VSNPRINTF 1" >>confdefs.h + + fi + ;; + + OSF1*) + if test "$uversion" = "40"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in vsnprintf function because you are running Tru64 4.0." >&5 +$as_echo "$as_me: WARNING: Not using built-in vsnprintf function because you are running Tru64 4.0." >&2;} + else + $as_echo "#define HAVE_VSNPRINTF 1" >>confdefs.h + + fi + ;; + + *) + $as_echo "#define HAVE_VSNPRINTF 1" >>confdefs.h + + ;; + esac +fi + +ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" +if test "x$ac_cv_func_snprintf" = x""yes; then : + + case "$uname" in + HP-UX*) + if test "$uversion" = "1020"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in snprintf function because you are running HP-UX 10.20." >&5 +$as_echo "$as_me: WARNING: Not using built-in snprintf function because you are running HP-UX 10.20." >&2;} + else + $as_echo "#define HAVE_SNPRINTF 1" >>confdefs.h + + fi + ;; + + OSF1*) + if test "$uversion" = "40"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not using built-in snprintf function because you are running Tru64 4.0." >&5 +$as_echo "$as_me: WARNING: Not using built-in snprintf function because you are running Tru64 4.0." >&2;} + else + $as_echo "#define HAVE_SNPRINTF 1" >>confdefs.h + + fi + ;; + + *) + $as_echo "#define HAVE_SNPRINTF 1" >>confdefs.h + + ;; + esac +fi + +ac_fn_c_check_header_mongrel "$LINENO" "strings.h" "ac_cv_header_strings_h" "$ac_includes_default" +if test "x$ac_cv_header_strings_h" = x""yes; then : + $as_echo "#define HAVE_STRINGS_H 1" >>confdefs.h + +fi + + +for ac_func in strcasecmp strlcat strlcpy +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" +if test "x$ac_cv_header_locale_h" = x""yes; then : + $as_echo "#define HAVE_LOCALE_H 1" >>confdefs.h + +fi + + +for ac_func in localeconv +do : + ac_fn_c_check_func "$LINENO" "localeconv" "ac_cv_func_localeconv" +if test "x$ac_cv_func_localeconv" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LOCALECONV 1 +_ACEOF + +fi +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pow" >&5 +$as_echo_n "checking for library containing pow... " >&6; } +if test "${ac_cv_search_pow+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pow (); +int +main () +{ +return pow (); + ; + return 0; +} +_ACEOF +for ac_lib in '' m; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_pow=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_pow+set}" = set; then : + break +fi +done +if test "${ac_cv_search_pow+set}" = set; then : + +else + ac_cv_search_pow=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_pow" >&5 +$as_echo "$ac_cv_search_pow" >&6; } +ac_res=$ac_cv_search_pow +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +# Check whether --enable-largefile was given. +if test "${enable_largefile+set}" = set; then : + enableval=$enable_largefile; +fi + +if test "$enable_largefile" != no; then + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 +$as_echo_n "checking for special C compiler options needed for large files... " >&6; } +if test "${ac_cv_sys_largefile_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_sys_largefile_CC=no + if test "$GCC" != yes; then + ac_save_CC=$CC + while :; do + # IRIX 6.2 and later do not support large files by default, + # so use the C compiler's -n32 option if that helps. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF + if ac_fn_c_try_compile "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext + CC="$CC -n32" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_largefile_CC=' -n32'; break +fi +rm -f core conftest.err conftest.$ac_objext + break + done + CC=$ac_save_CC + rm -f conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 +$as_echo "$ac_cv_sys_largefile_CC" >&6; } + if test "$ac_cv_sys_largefile_CC" != no; then + CC=$CC$ac_cv_sys_largefile_CC + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 +$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } +if test "${ac_cv_sys_file_offset_bits+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _FILE_OFFSET_BITS 64 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_file_offset_bits=64; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_file_offset_bits=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 +$as_echo "$ac_cv_sys_file_offset_bits" >&6; } +case $ac_cv_sys_file_offset_bits in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits +_ACEOF +;; +esac +rm -rf conftest* + if test $ac_cv_sys_file_offset_bits = unknown; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 +$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } +if test "${ac_cv_sys_large_files+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=no; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#define _LARGE_FILES 1 +#include + /* Check that off_t can represent 2**63 - 1 correctly. + We can't simply define LARGE_OFF_T to be 9223372036854775807, + since some C++ compilers masquerading as C compilers + incorrectly reject 9223372036854775807. */ +#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) + int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 + && LARGE_OFF_T % 2147483647 == 1) + ? 1 : -1]; +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_sys_large_files=1; break +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cv_sys_large_files=unknown + break +done +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 +$as_echo "$ac_cv_sys_large_files" >&6; } +case $ac_cv_sys_large_files in #( + no | unknown) ;; + *) +cat >>confdefs.h <<_ACEOF +#define _LARGE_FILES $ac_cv_sys_large_files +_ACEOF +;; +esac +rm -rf conftest* + fi +fi + + +LARGEFILE="" +if test x$enable_largefile = xyes; then + LARGEFILE="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE" + + if test x$ac_cv_sys_large_files = x1; then + LARGEFILE="$LARGEFILE -D_LARGE_FILES" + fi + + if test x$ac_cv_sys_file_offset_bits = x64; then + LARGEFILE="$LARGEFILE -D_FILE_OFFSET_BITS=64" + fi +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for long long int" >&5 +$as_echo_n "checking for long long int... " >&6; } +if test "${ac_cv_c_long_long+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "$GCC" = yes; then + ac_cv_c_long_long=yes + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +long long int i; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_long_long=yes +else + ac_cv_c_long_long=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_long_long" >&5 +$as_echo "$ac_cv_c_long_long" >&6; } + +if test $ac_cv_c_long_long = yes; then + $as_echo "#define HAVE_LONG_LONG 1" >>confdefs.h + +fi + +ac_fn_c_check_func "$LINENO" "strtoll" "ac_cv_func_strtoll" +if test "x$ac_cv_func_strtoll" = x""yes; then : + $as_echo "#define HAVE_STRTOLL 1" >>confdefs.h + +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlsym" >&5 +$as_echo_n "checking for library containing dlsym... " >&6; } +if test "${ac_cv_search_dlsym+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlsym (); +int +main () +{ +return dlsym (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_dlsym=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_dlsym+set}" = set; then : + break +fi +done +if test "${ac_cv_search_dlsym+set}" = set; then : + +else + ac_cv_search_dlsym=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlsym" >&5 +$as_echo "$ac_cv_search_dlsym" >&6; } +ac_res=$ac_cv_search_dlsym +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + $as_echo "#define HAVE_DLSYM 1" >>confdefs.h + +fi + +ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" +if test "x$ac_cv_header_dlfcn_h" = x""yes; then : + $as_echo "#define HAVE_DLFCN_H 1" >>confdefs.h + +fi + + + +AUDIOLIBS="" + +case $uname in + CYGWIN* | MINGW*) + AUDIOLIBS="-lwinmm" + ;; + + Darwin*) + AUDIOLIBS="-framework CoreAudio" + ;; + + *) + ac_fn_c_check_header_mongrel "$LINENO" "alsa/asoundlib.h" "ac_cv_header_alsa_asoundlib_h" "$ac_includes_default" +if test "x$ac_cv_header_alsa_asoundlib_h" = x""yes; then : + $as_echo "#define HAVE_ALSA_ASOUNDLIB_H 1" >>confdefs.h + + AUDIOLIBS="-lasound" +fi + + + ;; +esac + + + +SAVELIBS="$LIBS" +IMAGELIBS="" +STATICIMAGELIBS="" + + + + +# Handle the JPEG lib linking mode (use fltk local or system lib) +# If --enable-(resp. --disable-)localjpeg parameter is not set by user +# Then we check the JPEG lib usability, with result in sysjpeglib_ok variable +# Check whether --enable-localjpeg was given. +if test "${enable_localjpeg+set}" = set; then : + enableval=$enable_localjpeg; +fi + +# Check for System lib use if automatic mode or --disable-localjpeg is requested +sysjpeglib_ok=no +sysjpeginc_ok=no +if test x$enable_localjpeg != xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_CreateCompress in -ljpeg" >&5 +$as_echo_n "checking for jpeg_CreateCompress in -ljpeg... " >&6; } +if test "${ac_cv_lib_jpeg_jpeg_CreateCompress+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ljpeg $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char jpeg_CreateCompress (); +int +main () +{ +return jpeg_CreateCompress (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_jpeg_jpeg_CreateCompress=yes +else + ac_cv_lib_jpeg_jpeg_CreateCompress=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_CreateCompress" >&5 +$as_echo "$ac_cv_lib_jpeg_jpeg_CreateCompress" >&6; } +if test "x$ac_cv_lib_jpeg_jpeg_CreateCompress" = x""yes; then : + ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default" +if test "x$ac_cv_header_jpeglib_h" = x""yes; then : + sysjpeginc_ok=yes +fi + + + if test x$sysjpeginc_ok = xyes; then + sysjpeglib_ok=yes + fi +fi + +fi +# Now set the jpeg lib and include flags according to the requested mode and availability +if test x$enable_localjpeg = xyes -o x$sysjpeglib_ok = xno; then + JPEGINC="-I../jpeg" + JPEG="jpeg" + IMAGELIBS="-lfltk_jpeg $IMAGELIBS" + STATICIMAGELIBS="\$libdir/libfltk_jpeg.a $STATICIMAGELIBS" + $as_echo "#define HAVE_LIBJPEG 1" >>confdefs.h + + #ac_cv_lib_jpeg_jpeg_CreateCompress=no # from ima: should not be necessary + # Finally, warn user if system lib was requested but not found + if test x$enable_localjpeg = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find system jpeg lib or header: choosing the local lib mode." >&5 +$as_echo "$as_me: WARNING: Cannot find system jpeg lib or header: choosing the local lib mode." >&2;} + fi +else + JPEGINC="" + JPEG="" + IMAGELIBS="-ljpeg $IMAGELIBS" + STATICIMAGELIBS="-ljpeg $STATICIMAGELIBS" + $as_echo "#define HAVE_LIBJPEG 1" >>confdefs.h + +fi + +# Handle the ZLIB lib linking mode (use fltk local or system lib) +# If --enable-(resp. --disable-)localzlib parameter is not set by user +# Then we check the ZLIB lib usability, with result in syszlib_ok variable +# Check whether --enable-localzlib was given. +if test "${enable_localzlib+set}" = set; then : + enableval=$enable_localzlib; +fi + +# Check for System lib use if automatic mode or --disable-localzlib is requested +syszlib_ok=no +syszinc_ok=no +if test x$enable_localzlib != xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gzgets in -lz" >&5 +$as_echo_n "checking for gzgets in -lz... " >&6; } +if test "${ac_cv_lib_z_gzgets+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gzgets (); +int +main () +{ +return gzgets (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_z_gzgets=yes +else + ac_cv_lib_z_gzgets=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_gzgets" >&5 +$as_echo "$ac_cv_lib_z_gzgets" >&6; } +if test "x$ac_cv_lib_z_gzgets" = x""yes; then : + ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = x""yes; then : + syszinc_ok=yes +fi + + + if test x$syszinc_ok = xyes; then + syszlib_ok=yes + fi +fi + +fi +# Now set the Z lib and include flags according to the requested mode and availability +if test x$enable_localzlib = xyes -o x$syszlib_ok = xno ; then + ZLIBINC="-I../zlib" + ZLIB="zlib" + LIBS="-lfltk_z $LIBS" + IMAGELIBS="-lfltk_z $IMAGELIBS" + STATICIMAGELIBS="\$libdir/libfltk_z.a $STATICIMAGELIBS" + $as_echo "#define HAVE_LIBZ 1" >>confdefs.h + + ac_cv_lib_z_gzgets=no # fc: is still necessary ? + # Finally, warn user if system lib was requested but not found + if test x$enable_localzlib = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find system z lib or header: choosing the local lib mode." >&5 +$as_echo "$as_me: WARNING: Cannot find system z lib or header: choosing the local lib mode." >&2;} + fi +else + ZLIBINC="" + ZLIB="" + LIBS="-lz $LIBS" + IMAGELIBS="-lz $IMAGELIBS" + STATICIMAGELIBS="-lz $STATICIMAGELIBS" + $as_echo "#define HAVE_LIBZ 1" >>confdefs.h + +fi + +# Handle the PNG lib linking mode (use fltk local or system lib) +# If --enable-(resp. --disable-)localpng parameter is not set by user +# Then we check the png lib usability with result in syspng_lib variable +# Check whether --enable-localpng was given. +if test "${enable_localpng+set}" = set; then : + enableval=$enable_localpng; +fi + + +# Now check if system lib is usable, we check Lib AND include availability with inc variant, +# but only, if the builtin lib is not requested +syspnglib_ok=no +syspnginc_ok=no +if test x$enable_localpng != xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_read_info in -lpng" >&5 +$as_echo_n "checking for png_read_info in -lpng... " >&6; } +if test "${ac_cv_lib_png_png_read_info+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char png_read_info (); +int +main () +{ +return png_read_info (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_png_png_read_info=yes +else + ac_cv_lib_png_png_read_info=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_read_info" >&5 +$as_echo "$ac_cv_lib_png_png_read_info" >&6; } +if test "x$ac_cv_lib_png_png_read_info" = x""yes; then : + ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" +if test "x$ac_cv_header_png_h" = x""yes; then : + $as_echo "#define HAVE_PNG_H 1" >>confdefs.h + + syspnginc_ok=yes +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "libpng/png.h" "ac_cv_header_libpng_png_h" "$ac_includes_default" +if test "x$ac_cv_header_libpng_png_h" = x""yes; then : + $as_echo "#define HAVE_LIBPNG_PNG_H 1" >>confdefs.h + + syspnginc_ok=yes +fi + + + if test x$syspnginc_ok = xyes; then + syspnglib_ok=yes + fi +fi + +fi + +# The following is executed if the lib was not found usable or if local lib is required explicitly +if test x$enable_localpng = xyes -o x$syspnglib_ok = xno ; then + PNGINC="-I../png" + PNG="png" + IMAGELIBS="-lfltk_png $IMAGELIBS" + STATICIMAGELIBS="\$libdir/libfltk_png.a $STATICIMAGELIBS" + $as_echo "#define HAVE_LIBPNG 1" >>confdefs.h + + $as_echo "#define HAVE_PNG_H 1" >>confdefs.h + + $as_echo "#define HAVE_PNG_GET_VALID 1" >>confdefs.h + + $as_echo "#define HAVE_PNG_SET_TRNS_TO_ALPHA 1" >>confdefs.h + + # Finally, warn user if system lib was requested but not found + if test x$enable_localpng = xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find system png lib or header: choosing the local lib mode." >&5 +$as_echo "$as_me: WARNING: Cannot find system png lib or header: choosing the local lib mode." >&2;} + fi +else + PNGINC="" + PNG="" + IMAGELIBS="-lpng $IMAGELIBS" + STATICIMAGELIBS="-lpng $STATICIMAGELIBS" + $as_echo "#define HAVE_LIBPNG 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_get_valid in -lpng" >&5 +$as_echo_n "checking for png_get_valid in -lpng... " >&6; } +if test "${ac_cv_lib_png_png_get_valid+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char png_get_valid (); +int +main () +{ +return png_get_valid (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_png_png_get_valid=yes +else + ac_cv_lib_png_png_get_valid=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_get_valid" >&5 +$as_echo "$ac_cv_lib_png_png_get_valid" >&6; } +if test "x$ac_cv_lib_png_png_get_valid" = x""yes; then : + $as_echo "#define HAVE_PNG_GET_VALID 1" >>confdefs.h + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_set_tRNS_to_alpha in -lpng" >&5 +$as_echo_n "checking for png_set_tRNS_to_alpha in -lpng... " >&6; } +if test "${ac_cv_lib_png_png_set_tRNS_to_alpha+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char png_set_tRNS_to_alpha (); +int +main () +{ +return png_set_tRNS_to_alpha (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_png_png_set_tRNS_to_alpha=yes +else + ac_cv_lib_png_png_set_tRNS_to_alpha=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_set_tRNS_to_alpha" >&5 +$as_echo "$ac_cv_lib_png_png_set_tRNS_to_alpha" >&6; } +if test "x$ac_cv_lib_png_png_set_tRNS_to_alpha" = x""yes; then : + $as_echo "#define HAVE_PNG_SET_TRNS_TO_ALPHA 1" >>confdefs.h + +fi + +fi + + + + + + + + +LIBS="$SAVELIBS" + + + +have_pthread=no +PTHREAD_FLAGS="" + +if test "x$enable_threads" = xyes; then + ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" +if test "x$ac_cv_header_pthread_h" = x""yes; then : + $as_echo "#define HAVE_PTHREAD_H 1" >>confdefs.h + +fi + + + + if test x$ac_cv_header_pthread_h = xyes; then + for flag in -lpthreads -lpthread -pthread; do + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create using $flag" >&5 +$as_echo_n "checking for pthread_create using $flag... " >&6; } + SAVELIBS="$LIBS" + LIBS="$flag $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +pthread_create(0, 0, 0, 0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + have_pthread=yes +else + LIBS="$SAVELIBS" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_pthread" >&5 +$as_echo "$have_pthread" >&6; } + + if test $have_pthread = yes; then + $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h + + PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT" + + # Solaris requires -D_POSIX_PTHREAD_SEMANTICS to + # be POSIX-compliant... :( + if test $uname = SunOS; then + PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS" + fi + break + fi + done + fi +fi + + + +HLINKS= +POSTBUILD=: +OSX_ONLY=: +THREADS= + + +# Check whether --with-links was given. +if test "${with_links+set}" = set; then : + withval=$with_links; +fi + + +INSTALL_DESKTOP="" +UNINSTALL_DESKTOP="" + +case $uname in + CYGWIN* | MINGW*) + # Recent versions of Cygwin are seriously broken and the size + # checks don't work because the shell puts out \r\n instead of + # \n. Here we just force U32 to be defined to "unsigned"... + $as_echo "#define U32 unsigned" >>confdefs.h + + CFLAGS="-mwindows -DWIN32 $CFLAGS" + CXXFLAGS="-mwindows -DWIN32 $CXXFLAGS" + LDFLAGS="-mwindows $LDFLAGS" + DSOFLAGS="-mwindows $DSOFLAGS" + LIBS="$LIBS -lole32 -luuid -lcomctl32 -lwsock32" + if test "x$with_optim" = x; then + with_optim="-O3" + fi + + if test x$enable_gl != xno; then + ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_gl_h" = x""yes; then : + $as_echo "#define HAVE_GL 1" >>confdefs.h + + GLLIB="-lopengl32" +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_glu_h" = x""yes; then : + $as_echo "#define HAVE_GL_GLU_H 1" >>confdefs.h + + GLLIB="-lglu32 $GLLIB" +fi + + + else + LINKFLTKGL="" + GLLIBNAME="" + GLDSONAME="" + GLDEMOS="" + fi + + if test "x$enable_threads" = xyes; then + if test x$have_pthread = xyes; then + $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h + + fi + + THREADS="threads.exe" + fi + + # Don't make symlinks since Windows is not case sensitive. + if test "x$with_links" != xyes; then + HLINKS="#" + fi + ;; + + Darwin*) + # MacOS X uses Carbon for graphics... + LIBS="$LIBS -framework Carbon -framework ApplicationServices" + + if test x$have_pthread = xyes; then + $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h + + THREADS="threads" + fi + + if test x$enable_gl != xno; then + $as_echo "#define HAVE_GL 1" >>confdefs.h + + $as_echo "#define HAVE_GL_GLU_H 1" >>confdefs.h + + GLLIB="-framework AGL -framework OpenGL" + else + LINKFLTKGL="" + GLLIBNAME="" + GLDSONAME="" + GLDEMOS="" + fi + + # Don't make symlinks because HFS+ is not case sensitive... + if test "x$with_links" != xyes; then + HLINKS="#" + fi + + # Add a postbuild step after linking applications + POSTBUILD="/Developer/Tools/Rez -t APPL -o" + + # Some steps are only done for OS X package management + OSX_ONLY= + + # Install/Uninstall FLUID application + INSTALL_DESKTOP="install-osx" + UNINSTALL_DESKTOP="uninstall-osx" + ;; + + *) + # All others are UNIX/X11... + if test x$have_pthread = xyes; then + $as_echo "#define HAVE_PTHREAD 1" >>confdefs.h + + THREADS="threads" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 +$as_echo_n "checking for X... " >&6; } + + +# Check whether --with-x was given. +if test "${with_x+set}" = set; then : + withval=$with_x; +fi + +# $have_x is `yes', `no', `disabled', or empty when we do not yet know. +if test "x$with_x" = xno; then + # The user explicitly disabled X. + have_x=disabled +else + case $x_includes,$x_libraries in #( + *\'*) as_fn_error "cannot use X directory names containing '" "$LINENO" 5;; #( + *,NONE | NONE,*) if test "${ac_cv_have_x+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # One or both of the vars are not set, and there is no cached value. +ac_x_includes=no ac_x_libraries=no +rm -f -r conftest.dir +if mkdir conftest.dir; then + cd conftest.dir + cat >Imakefile <<'_ACEOF' +incroot: + @echo incroot='${INCROOT}' +usrlibdir: + @echo usrlibdir='${USRLIBDIR}' +libdir: + @echo libdir='${LIBDIR}' +_ACEOF + if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then + # GNU make sometimes prints "make[1]: Entering...", which would confuse us. + for ac_var in incroot usrlibdir libdir; do + eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" + done + # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. + for ac_extension in a so sl dylib la dll; do + if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && + test -f "$ac_im_libdir/libX11.$ac_extension"; then + ac_im_usrlibdir=$ac_im_libdir; break + fi + done + # Screen out bogus values from the imake configuration. They are + # bogus both because they are the default anyway, and because + # using them would break gcc on systems where it needs fixed includes. + case $ac_im_incroot in + /usr/include) ac_x_includes= ;; + *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; + esac + case $ac_im_usrlibdir in + /usr/lib | /usr/lib64 | /lib | /lib64) ;; + *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; + esac + fi + cd .. + rm -f -r conftest.dir +fi + +# Standard set of common directories for X headers. +# Check X11 before X11Rn because it is often a symlink to the current release. +ac_x_header_dirs=' +/usr/X11/include +/usr/X11R7/include +/usr/X11R6/include +/usr/X11R5/include +/usr/X11R4/include + +/usr/include/X11 +/usr/include/X11R7 +/usr/include/X11R6 +/usr/include/X11R5 +/usr/include/X11R4 + +/usr/local/X11/include +/usr/local/X11R7/include +/usr/local/X11R6/include +/usr/local/X11R5/include +/usr/local/X11R4/include + +/usr/local/include/X11 +/usr/local/include/X11R7 +/usr/local/include/X11R6 +/usr/local/include/X11R5 +/usr/local/include/X11R4 + +/usr/X386/include +/usr/x386/include +/usr/XFree86/include/X11 + +/usr/include +/usr/local/include +/usr/unsupported/include +/usr/athena/include +/usr/local/x11r5/include +/usr/lpp/Xamples/include + +/usr/openwin/include +/usr/openwin/share/include' + +if test "$ac_x_includes" = no; then + # Guess where to find include files, by looking for Xlib.h. + # First, try using that file with no special directory specified. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # We can compile using X headers with no special include directory. +ac_x_includes= +else + for ac_dir in $ac_x_header_dirs; do + if test -r "$ac_dir/X11/Xlib.h"; then + ac_x_includes=$ac_dir + break + fi +done +fi +rm -f conftest.err conftest.$ac_ext +fi # $ac_x_includes = no + +if test "$ac_x_libraries" = no; then + # Check for the libraries. + # See if we find them without any special options. + # Don't add to $LIBS permanently. + ac_save_LIBS=$LIBS + LIBS="-lX11 $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +XrmInitialize () + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + LIBS=$ac_save_LIBS +# We can link X programs with no special library path. +ac_x_libraries= +else + LIBS=$ac_save_LIBS +for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` +do + # Don't even attempt the hair of trying to link an X program! + for ac_extension in a so sl dylib la dll; do + if test -r "$ac_dir/libX11.$ac_extension"; then + ac_x_libraries=$ac_dir + break 2 + fi + done +done +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi # $ac_x_libraries = no + +case $ac_x_includes,$ac_x_libraries in #( + no,* | *,no | *\'*) + # Didn't find X, or a directory has "'" in its name. + ac_cv_have_x="have_x=no";; #( + *) + # Record where we found X for the cache. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$ac_x_includes'\ + ac_x_libraries='$ac_x_libraries'" +esac +fi +;; #( + *) have_x=yes;; + esac + eval "$ac_cv_have_x" +fi # $with_x != no + +if test "$have_x" != yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 +$as_echo "$have_x" >&6; } + no_x=yes +else + # If each of the values was on the command line, it overrides each guess. + test "x$x_includes" = xNONE && x_includes=$ac_x_includes + test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries + # Update the cache value to reflect the command line values. + ac_cv_have_x="have_x=yes\ + ac_x_includes='$x_includes'\ + ac_x_libraries='$x_libraries'" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 +$as_echo "libraries $x_libraries, headers $x_includes" >&6; } +fi + +if test "$no_x" = yes; then + # Not all programs may use this symbol, but it does not hurt to define it. + +$as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h + + X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= +else + if test -n "$x_includes"; then + X_CFLAGS="$X_CFLAGS -I$x_includes" + fi + + # It would also be nice to do this for all -L options, not just this one. + if test -n "$x_libraries"; then + X_LIBS="$X_LIBS -L$x_libraries" + # For Solaris; some versions of Sun CC require a space after -R and + # others require no space. Words are not sufficient . . . . + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 +$as_echo_n "checking whether -R must be followed by a space... " >&6; } + ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" + ac_xsave_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + X_LIBS="$X_LIBS -R$x_libraries" +else + LIBS="$ac_xsave_LIBS -R $x_libraries" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + X_LIBS="$X_LIBS -R $x_libraries" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 +$as_echo "neither works" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_c_werror_flag=$ac_xsave_c_werror_flag + LIBS=$ac_xsave_LIBS + fi + + # Check for system-dependent libraries X programs must link with. + # Do this before checking for the system-independent R6 libraries + # (-lICE), since we may need -lsocket or whatever for X linking. + + if test "$ISC" = yes; then + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" + else + # Martyn Johnson says this is needed for Ultrix, if the X + # libraries were built with DECnet support. And Karl Berry says + # the Alpha needs dnet_stub (dnet does not exist). + ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XOpenDisplay (); +int +main () +{ +return XOpenDisplay (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } +if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_dnet_ntoa=yes +else + ac_cv_lib_dnet_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_dnet_ntoa" = x""yes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" +fi + + if test $ac_cv_lib_dnet_dnet_ntoa = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 +$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } +if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldnet_stub $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dnet_ntoa (); +int +main () +{ +return dnet_ntoa (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dnet_stub_dnet_ntoa=yes +else + ac_cv_lib_dnet_stub_dnet_ntoa=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 +$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } +if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = x""yes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" +fi + + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$ac_xsave_LIBS" + + # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, + # to get the SysV transport functions. + # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) + # needs -lnsl. + # The nsl library prevents programs from opening the X display + # on Irix 5.2, according to T.E. Dickey. + # The functions gethostbyname, getservbyname, and inet_addr are + # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. + ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" +if test "x$ac_cv_func_gethostbyname" = x""yes; then : + +fi + + if test $ac_cv_func_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_nsl_gethostbyname=yes +else + ac_cv_lib_nsl_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" +fi + + if test $ac_cv_lib_nsl_gethostbyname = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 +$as_echo_n "checking for gethostbyname in -lbsd... " >&6; } +if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bsd_gethostbyname=yes +else + ac_cv_lib_bsd_gethostbyname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 +$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } +if test "x$ac_cv_lib_bsd_gethostbyname" = x""yes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" +fi + + fi + fi + + # lieder@skyler.mavd.honeywell.com says without -lsocket, + # socket/setsockopt and other routines are undefined under SCO ODT + # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary + # on later versions), says Simon Leinen: it contains gethostby* + # variants that don't use the name server (or something). -lsocket + # must be given before -lnsl if both are needed. We assume that + # if connect needs -lnsl, so does gethostbyname. + ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" +if test "x$ac_cv_func_connect" = x""yes; then : + +fi + + if test $ac_cv_func_connect = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 +$as_echo_n "checking for connect in -lsocket... " >&6; } +if test "${ac_cv_lib_socket_connect+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char connect (); +int +main () +{ +return connect (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_connect=yes +else + ac_cv_lib_socket_connect=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 +$as_echo "$ac_cv_lib_socket_connect" >&6; } +if test "x$ac_cv_lib_socket_connect" = x""yes; then : + X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" +fi + + fi + + # Guillermo Gomez says -lposix is necessary on A/UX. + ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" +if test "x$ac_cv_func_remove" = x""yes; then : + +fi + + if test $ac_cv_func_remove = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 +$as_echo_n "checking for remove in -lposix... " >&6; } +if test "${ac_cv_lib_posix_remove+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lposix $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char remove (); +int +main () +{ +return remove (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_posix_remove=yes +else + ac_cv_lib_posix_remove=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 +$as_echo "$ac_cv_lib_posix_remove" >&6; } +if test "x$ac_cv_lib_posix_remove" = x""yes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" +fi + + fi + + # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. + ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" +if test "x$ac_cv_func_shmat" = x""yes; then : + +fi + + if test $ac_cv_func_shmat = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 +$as_echo_n "checking for shmat in -lipc... " >&6; } +if test "${ac_cv_lib_ipc_shmat+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lipc $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shmat (); +int +main () +{ +return shmat (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ipc_shmat=yes +else + ac_cv_lib_ipc_shmat=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 +$as_echo "$ac_cv_lib_ipc_shmat" >&6; } +if test "x$ac_cv_lib_ipc_shmat" = x""yes; then : + X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" +fi + + fi + fi + + # Check for libraries that X11R6 Xt/Xaw programs need. + ac_save_LDFLAGS=$LDFLAGS + test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" + # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to + # check for ICE first), but we must link in the order -lSM -lICE or + # we get undefined symbols. So assume we have SM if we have ICE. + # These have to be linked with before -lX11, unlike the other + # libraries we check for below, so use a different variable. + # John Interrante, Karl Berry + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 +$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } +if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lICE $X_EXTRA_LIBS $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char IceConnectionNumber (); +int +main () +{ +return IceConnectionNumber (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ICE_IceConnectionNumber=yes +else + ac_cv_lib_ICE_IceConnectionNumber=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 +$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } +if test "x$ac_cv_lib_ICE_IceConnectionNumber" = x""yes; then : + X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" +fi + + LDFLAGS=$ac_save_LDFLAGS + +fi + + + if test x$no_x = xyes; then + { as_fn_set_status aborting. +as_fn_error "Configure could not find required X11 libraries" "$LINENO" 5; } + fi + + if test "x$X_PRE_LIBS" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring libraries \"$X_PRE_LIBS\" requested by configure." >&5 +$as_echo "$as_me: WARNING: Ignoring libraries \"$X_PRE_LIBS\" requested by configure." >&2;} + fi + + LIBS="$LIBS -lXext -lX11 $X_EXTRA_LIBS" + CFLAGS="$CFLAGS $X_CFLAGS" + CXXFLAGS="$CXXFLAGS $X_CFLAGS" + LDFLAGS="$X_LIBS $LDFLAGS" + DSOFLAGS="$X_LIBS $DSOFLAGS" + + if test "x$x_includes" != x; then + ac_cpp="$ac_cpp -I$x_includes" + fi + + GLLIB= + + if test x$enable_gl != xno; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 +$as_echo_n "checking for library containing dlopen... " >&6; } +if test "${ac_cv_search_dlopen+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +for ac_lib in '' dl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_dlopen=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if test "${ac_cv_search_dlopen+set}" = set; then : + break +fi +done +if test "${ac_cv_search_dlopen+set}" = set; then : + +else + ac_cv_search_dlopen=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 +$as_echo "$ac_cv_search_dlopen" >&6; } +ac_res=$ac_cv_search_dlopen +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_gl_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXMakeCurrent in -lGL" >&5 +$as_echo_n "checking for glXMakeCurrent in -lGL... " >&6; } +if test "${ac_cv_lib_GL_glXMakeCurrent+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lGL -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char glXMakeCurrent (); +int +main () +{ +return glXMakeCurrent (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_GL_glXMakeCurrent=yes +else + ac_cv_lib_GL_glXMakeCurrent=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glXMakeCurrent" >&5 +$as_echo "$ac_cv_lib_GL_glXMakeCurrent" >&6; } +if test "x$ac_cv_lib_GL_glXMakeCurrent" = x""yes; then : + $as_echo "#define HAVE_GL 1" >>confdefs.h + GLLIB="-lGL" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXMakeCurrent in -lMesaGL" >&5 +$as_echo_n "checking for glXMakeCurrent in -lMesaGL... " >&6; } +if test "${ac_cv_lib_MesaGL_glXMakeCurrent+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lMesaGL -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char glXMakeCurrent (); +int +main () +{ +return glXMakeCurrent (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_MesaGL_glXMakeCurrent=yes +else + ac_cv_lib_MesaGL_glXMakeCurrent=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_MesaGL_glXMakeCurrent" >&5 +$as_echo "$ac_cv_lib_MesaGL_glXMakeCurrent" >&6; } +if test "x$ac_cv_lib_MesaGL_glXMakeCurrent" = x""yes; then : + $as_echo "#define HAVE_GL 1" >>confdefs.h + GLLIB=" -lMesaGL" +fi + +fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glXGetProcAddressARB in -lGL" >&5 +$as_echo_n "checking for glXGetProcAddressARB in -lGL... " >&6; } +if test "${ac_cv_lib_GL_glXGetProcAddressARB+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lGL -lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char glXGetProcAddressARB (); +int +main () +{ +return glXGetProcAddressARB (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_GL_glXGetProcAddressARB=yes +else + ac_cv_lib_GL_glXGetProcAddressARB=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glXGetProcAddressARB" >&5 +$as_echo "$ac_cv_lib_GL_glXGetProcAddressARB" >&6; } +if test "x$ac_cv_lib_GL_glXGetProcAddressARB" = x""yes; then : + $as_echo "#define HAVE_GLXGETPROCADDRESSARB 1" >>confdefs.h + +fi + + +fi + + + ac_fn_c_check_header_mongrel "$LINENO" "GL/glu.h" "ac_cv_header_GL_glu_h" "$ac_includes_default" +if test "x$ac_cv_header_GL_glu_h" = x""yes; then : + $as_echo "#define HAVE_GL_GLU_H 1" >>confdefs.h + + if test x$ac_cv_lib_GL_glXMakeCurrent = xyes; then + GLLIB="-lGLU $GLLIB" + fi + if test x$ac_cv_lib_MesaGL_glXMakeCurrent = xyes; then + GLLIB="-lMesaGLU $GLLIB" + fi + +fi + + + + if test x$ac_cv_lib_GL_glXMakeCurrent != xyes -a x$ac_cv_lib_MesaGL_glXMakeCurrent != xyes; then + LINKFLTKGL="" + GLLIBNAME="" + GLDSONAME="" + GLDEMOS="" + fi + else + LINKFLTKGL="" + GLLIBNAME="" + GLDSONAME="" + GLDEMOS="" + fi + + # Check whether --enable-xinerama was given. +if test "${enable_xinerama+set}" = set; then : + enableval=$enable_xinerama; +fi + + + if test x$enable_xinerama = xyes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XineramaIsActive in -lXinerama" >&5 +$as_echo_n "checking for XineramaIsActive in -lXinerama... " >&6; } +if test "${ac_cv_lib_Xinerama_XineramaIsActive+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXinerama $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XineramaIsActive (); +int +main () +{ +return XineramaIsActive (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_Xinerama_XineramaIsActive=yes +else + ac_cv_lib_Xinerama_XineramaIsActive=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xinerama_XineramaIsActive" >&5 +$as_echo "$ac_cv_lib_Xinerama_XineramaIsActive" >&6; } +if test "x$ac_cv_lib_Xinerama_XineramaIsActive" = x""yes; then : + $as_echo "#define HAVE_XINERAMA 1" >>confdefs.h + + LIBS="-lXinerama $LIBS" +fi + + fi + + # Check whether --enable-xft was given. +if test "${enable_xft+set}" = set; then : + enableval=$enable_xft; +fi + + + if test x$enable_xft = xyes; then + # Extract the first word of "freetype-config", so it can be a program name with args. +set dummy freetype-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_FTCONFIG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $FTCONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_FTCONFIG="$FTCONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_FTCONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +FTCONFIG=$ac_cv_path_FTCONFIG +if test -n "$FTCONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FTCONFIG" >&5 +$as_echo "$FTCONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + if test "x$FTCONFIG" != x; then + CPPFLAGS="`$FTCONFIG --cflags` $CPPFLAGS" + CXXFLAGS="`$FTCONFIG --cflags` $CXXFLAGS" + + ac_fn_c_check_header_mongrel "$LINENO" "X11/Xft/Xft.h" "ac_cv_header_X11_Xft_Xft_h" "$ac_includes_default" +if test "x$ac_cv_header_X11_Xft_Xft_h" = x""yes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XftDrawCreate in -lXft" >&5 +$as_echo_n "checking for XftDrawCreate in -lXft... " >&6; } +if test "${ac_cv_lib_Xft_XftDrawCreate+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lXft $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char XftDrawCreate (); +int +main () +{ +return XftDrawCreate (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_Xft_XftDrawCreate=yes +else + ac_cv_lib_Xft_XftDrawCreate=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xft_XftDrawCreate" >&5 +$as_echo "$ac_cv_lib_Xft_XftDrawCreate" >&6; } +if test "x$ac_cv_lib_Xft_XftDrawCreate" = x""yes; then : + $as_echo "#define USE_XFT 1" >>confdefs.h + + LIBS="-lXft $LIBS" +fi + +fi + + + fi + fi + + # Check whether --enable-xdbe was given. +if test "${enable_xdbe+set}" = set; then : + enableval=$enable_xdbe; +fi + + + if test x$enable_xdbe = xyes; then + ac_fn_c_check_header_compile "$LINENO" "X11/extensions/Xdbe.h" "ac_cv_header_X11_extensions_Xdbe_h" "#include +" +if test "x$ac_cv_header_X11_extensions_Xdbe_h" = x""yes; then : + $as_echo "#define HAVE_XDBE 1" >>confdefs.h + +fi + + + fi + + # Extract the first word of "xprop", so it can be a program name with args. +set dummy xprop; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_XPROP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $XPROP in + [\\/]* | ?:[\\/]*) + ac_cv_path_XPROP="$XPROP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_XPROP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +XPROP=$ac_cv_path_XPROP +if test -n "$XPROP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XPROP" >&5 +$as_echo "$XPROP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X overlay visuals" >&5 +$as_echo_n "checking for X overlay visuals... " >&6; } +if test "${ac_cv_have_overlay+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test "x$XPROP" != x; then + if $XPROP -root 2>/dev/null | grep -c "SERVER_OVERLAY_VISUALS" >/dev/null; then + ac_cv_have_overlay=yes + else + ac_cv_have_overlay=no + fi + else + ac_cv_have_overlay=no + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_overlay" >&5 +$as_echo "$ac_cv_have_overlay" >&6; } + + if test x$ac_cv_have_overlay = xyes; then + $as_echo "#define HAVE_OVERLAY 1" >>confdefs.h + + fi + + # Make symlinks since UNIX/Linux is case sensitive. + if test "x$with_links" = xno; then + HLINKS="#" + fi + + # Install/Uninstall FLUID application support files + INSTALL_DESKTOP="install-linux" + UNINSTALL_DESKTOP="uninstall-linux" + ;; +esac + + + + + + + + + + + +case "$uname" in + *BSD* | Darwin*) + # *BSD + CAT1EXT=0 + CAT3EXT=0 + CAT6EXT=0 + ;; + IRIX*) + # SGI IRIX + CAT1EXT=z + CAT3EXT=z + CAT6EXT=z + ;; + *) + # All others + CAT1EXT=1 + CAT3EXT=3 + CAT6EXT=6 + ;; +esac + + + + + +if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/usr"; then + case "$uname" in + *BSD* | Darwin* | Linux*) + # *BSD, Darwin, and Linux + mandir="\${prefix}/share/man" + ;; + IRIX*) + # SGI IRIX + mandir="\${prefix}/share/catman" + ;; + esac +fi + +if test "$prefix" = NONE; then + prefix=/usr/local +fi + +if test "$exec_prefix" = NONE; then + exec_prefix="\${prefix}" +fi + +if test "$uname" = "IRIX" -a $uversion -ge 62 -a "$libdir" = "\${exec_prefix}/lib" -a "$exec_prefix" = "\${prefix}" -a "$prefix" = "/usr"; then + libdir="/usr/lib32" +fi + +MAKEDEPEND="\$(CXX) -M" + + + +if test -n "$GCC"; then + # Show all standard warnings + unused variables, conversion errors, + # and inlining problems when compiling... + OPTIM="-Wall -Wunused -Wno-format-y2k $OPTIM" + + # The following additional warnings are useful for tracking down problems... + #OPTIM="-Wshadow -Wconversion $OPTIM" + + # We know that Carbon is deprecated on OS X 10.4. To avoid hundreds of warnings + # we will temporarily disable 'deprecated' warnings on OS X. + if test "$uname" = "Darwin" -a $uversion -ge 800; then + OPTIM="-Wno-deprecated-declarations $OPTIM" + fi + + # Set the default compiler optimizations... + if test -z "$DEBUGFLAG"; then + # + # Note: Can't use -fomit-frame-pointer - prevents tools like + # libsafe from working! + # + # Don't use -fforce-mem, -fforce-addr, or -fcaller-saves. + # They all seem to make either no difference or enlarge + # the code by a few hundred bytes. + # + # "-Os" seems to be the best compromise between speed and + # code size. "-O3" and higher seem to make no effective + # difference in the speed of the code, but does bloat the + # library 10+%. + # + + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-Os $OPTIM" + fi + fi + + # Generate position-independent code when needed... + if test $PICFLAG = 1; then + OPTIM="$OPTIM -fPIC" + fi + + # See if GCC supports -fno-exceptions... + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fno-exceptions" >&5 +$as_echo_n "checking if GCC supports -fno-exceptions... " >&6; } + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-exceptions" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + OPTIM="$OPTIM -fno-exceptions" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$OLDCFLAGS" + + # See if GCC supports -fno-strict-aliasing... + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fno-strict-aliasing" >&5 +$as_echo_n "checking if GCC supports -fno-strict-aliasing... " >&6; } + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-strict-aliasing" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + OPTIM="$OPTIM -fno-strict-aliasing" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$OLDCFLAGS" + + # See if we are running Solaris; if so, try the -fpermissive option... + # This option is required on some versions of Solaris to work around + # bugs in the X headers up through Solaris 7. + # + # Unlike the other compiler/optimization settings, this one is placed + # in CFLAGS and CXXFLAGS so that fltk-config will provide the option + # to clients - otherwise client apps will not compile properly... + if test "$uname" = SunOS; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GCC supports -fpermissive" >&5 +$as_echo_n "checking if GCC supports -fpermissive... " >&6; } + + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fpermissive" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + CXXFLAGS="$CXXFLAGS -fpermissive" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + CFLAGS="$OLDCFLAGS" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi +else + case "$uname" in + IRIX*) + # Running some flavor of IRIX; see which version and + # set things up according... + if test "$uversion" -ge 62; then + # We are running IRIX 6.2 or higher; uncomment the following + # lines if you don't have IDO 7.2 or higher: + # + # CXX="CC -n32 -mips3" + # CC="cc -n32 -mips3" + # LD="ld -n32 -mips3" + # MAKEDEPEND="CC -M" + + if test "x`grep abi=n32 /etc/compiler.defaults`" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: FOR BEST RESULTS BEFORE COMPILING: setenv SGI_ABI \"-n32 -mips3\"" >&5 +$as_echo "$as_me: WARNING: FOR BEST RESULTS BEFORE COMPILING: setenv SGI_ABI \"-n32 -mips3\"" >&2;} + fi + + OPTIM="-fullwarn $OPTIM" + fi + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-O2 $OPTIM" + if test $uversion -gt 62; then + OPTIM="-OPT:Olimit=4000 $OPTIM" + fi + fi + fi + ;; + HP-UX*) + # Running HP-UX; these options should work for the HP compilers. + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="+O2 $OPTIM" + fi + fi + + if test $PICFLAG = 1; then + OPTIM="+z $OPTIM" + fi + + CXXFLAGS="$CXXFLAGS +W336,501,736,740,749,829" + ;; + OSF1*) + # Running Digital/Tru64 UNIX; these options should work for the + # Digital/Compaq/NewHP compilers. + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-O2 $OPTIM" + fi + fi + ;; + SunOS*) + # Solaris + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-xO3 $OPTIM" + fi + fi + + if test $PICFLAG = 1; then + OPTIM="-KPIC $OPTIM" + fi + ;; + AIX*) + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-O2 $OPTIM" + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: The AIX C and C++ compilers are known not to correctly compile the FLTK library." >&5 +$as_echo "$as_me: WARNING: The AIX C and C++ compilers are known not to correctly compile the FLTK library." >&2;} + ;; + *) + # Running some other operating system; inform the user they + # should contribute the necessary options to fltk-bugs@fltk.org... + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building FLTK with default compiler optimizations" >&5 +$as_echo "$as_me: WARNING: Building FLTK with default compiler optimizations" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Contact fltk-bugs@fltk.org with uname and compiler options." >&5 +$as_echo "$as_me: WARNING: Contact fltk-bugs@fltk.org with uname and compiler options." >&2;} + ;; + esac +fi + +OPTIM="$DEBUGFLAG $OPTIM" + +if test x$prefix = xNONE; then + cat >>confdefs.h <<_ACEOF +#define FLTK_DOCDIR "/usr/local/share/doc/fltk" +_ACEOF + +else + cat >>confdefs.h <<_ACEOF +#define FLTK_DOCDIR "$prefix/share/doc/fltk" +_ACEOF + +fi + +if test x$prefix = xNONE; then + cat >>confdefs.h <<_ACEOF +#define FLTK_DATADIR "/usr/local/share/fltk" +_ACEOF + +else + cat >>confdefs.h <<_ACEOF +#define FLTK_DATADIR "$prefix/share/fltk" +_ACEOF + +fi + +echo "" +echo "Configuration Summary" +echo "-------------------------------------------------------------------------" + +case $uname in + CYGWIN* | MINGW*) + graphics="GDI" + ;; + Darwin*) + if test x$enable_quartz = xyes; then + graphics="Quartz" + else + graphics="Quickdraw" + fi + ;; + *) + graphics="X11" + if test x$enable_xft = xyes; then + graphics="$graphics+Xft" + fi + if test x$enable_xdbe = xyes; then + graphics="$graphics+Xdbe" + fi + if test x$enable_xinerama = xyes; then + graphics="$graphics+Xinerama" + fi + ;; +esac + +echo " Directories: prefix=$prefix" +echo " bindir=$bindir" +echo " datadir=$datadir" +echo " datarootdir=$datarootdir" +echo " exec_prefix=$exec_prefix" +echo " includedir=$includedir" +echo " libdir=$libdir" +echo " mandir=$mandir" +echo " Graphics: $graphics" + +if test x$JPEG = x; then + echo "Image Libraries: JPEG=System" +else + echo "Image Libraries: JPEG=Builtin" +fi +if test x$PNG = x; then + echo " PNG=System" +else + echo " PNG=Builtin" +fi +if test x$ZLIB = x; then + echo " ZLIB=System" +else + echo " ZLIB=Builtin" +fi + +if test x$enable_largefile = xyes; then + echo " Large Files: YES" +else + echo " Large Files: NO" +fi + +if test x$GLDEMOS = x; then + echo " OpenGL: NO" +else + echo " OpenGL: YES" +fi + +if test x$THREADS = x; then + echo " Threads: NO" +else + echo " Threads: YES" +fi + +ac_config_headers="$ac_config_headers config.h:configh.in" + +ac_config_files="$ac_config_files makeinclude fltk.list fltk-config fltk.spec FL/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by $as_me, which was +generated by GNU Autoconf 2.65. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Report bugs to the package provider." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.65, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2009 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:configh.in" ;; + "makeinclude") CONFIG_FILES="$CONFIG_FILES makeinclude" ;; + "fltk.list") CONFIG_FILES="$CONFIG_FILES fltk.list" ;; + "fltk-config") CONFIG_FILES="$CONFIG_FILES fltk-config" ;; + "fltk.spec") CONFIG_FILES="$CONFIG_FILES fltk.spec" ;; + "FL/Makefile") CONFIG_FILES="$CONFIG_FILES FL/Makefile" ;; + + *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error "could not create -" "$LINENO" 5 + fi + ;; + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit $? +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +chmod +x fltk-config + diff --git a/third_party/windows/fltk-1.1.10/configure.in b/third_party/windows/fltk-1.1.10/configure.in new file mode 100644 index 0000000..799ee72 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/configure.in @@ -0,0 +1,1259 @@ +dnl -*- sh -*- +dnl the "configure" script is made from this by running GNU "autoconf" +dnl +dnl "$Id: configure.in 6892 2009-09-20 17:25:25Z AlbrechtS $" +dnl +dnl Configuration script for the Fast Light Tool Kit (FLTK). +dnl +dnl Copyright 1998-2009 by Bill Spitzak and others. +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Library General Public +dnl License as published by the Free Software Foundation; either +dnl version 2 of the License, or (at your option) any later version. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Library General Public License for more details. +dnl +dnl You should have received a copy of the GNU Library General Public +dnl License along with this library; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +dnl USA. +dnl +dnl Please report all bugs and problems on the following page: +dnl +dnl http://www.fltk.org/str.php +dnl + +dnl We need at least autoconf 2.50... +AC_PREREQ(2.50) + +dnl Required file in package... +AC_INIT(src/Fl.cxx) + +dnl FLTK library versions... +FL_MAJOR_VERSION=1 +FL_MINOR_VERSION=1 +FL_PATCH_VERSION=10 +FL_API_VERSION=${FL_MAJOR_VERSION}.${FL_MINOR_VERSION} + +AC_SUBST(FL_MAJOR_VERSION) +AC_SUBST(FL_MINOR_VERSION) +AC_SUBST(FL_PATCH_VERSION) +AC_SUBST(FL_API_VERSION) + +dnl Get the operating system and version number... +uname=`uname` +uversion=`uname -r | sed -e '1,$s/[[^0-9]]//g'` +if test "x$uname" = xIRIX64; then + uname="IRIX" +fi +if test "x$uname" = x; then + # MingW doesn't provide any output when uname is run, even with "-s"... + uname="CYGWIN" +fi + +dnl Don't automatically add "-g" to compiler options... +ARCHFLAGS="${ARCHFLAGS:=}" +CFLAGS="${CFLAGS:=}" +CPPFLAGS="${CPPFLAGS:=}" +CXXFLAGS="${CXXFLAGS:=}" +DSOFLAGS="${DSOFLAGS:=}" +LDFLAGS="${LDFLAGS:=}" +OPTIM="${OPTIM:=}" + +AC_SUBST(ARCHFLAGS) +AC_SUBST(OPTIM) + +dnl OS-specific pre-tests... +case $uname in + CYGWIN* | MINGW*) + # Handle Cygwin option *first*, before all other tests. + AC_ARG_ENABLE(cygwin, [ --enable-cygwin use the CygWin libraries [default=no]]) + if test x$enable_cygwin != xyes; then + # NOTE: We can't use ARCHFLAGS for this, since it does not work + # with some of the function tests - Cygwin uses a + # different C library... + CFLAGS="$CFLAGS -mno-cygwin" + CPPFLAGS="$CPPFLAGS -mno-cygwin" + CXXFLAGS="$CXXFLAGS -mno-cygwin" + LDFLAGS="$LDFLAGS -mno-cygwin" + DSOFLAGS="$DSOFLAGS -mno-cygwin" + fi + ;; + Darwin*) + # Starting with 10.6 (Snow Leopard), OS X does not support + # Carbon calls anymore. We patch this until we are completely Cocoa compliant + # by limiting ourselves to 32 bit Intel compiles + d_ver_rev=`sw_vers -productVersion | sed -e 's/\.[[0-9]][[0-9]]*//2'` + d_ver=`echo $d_ver_rev | sed -e 's/\.[[0-9]][[0-9]]*//'` + d_rev=`echo $d_ver_rev | sed -e 's/[[0-9]][[0-9]]*\.//'` + if test $d_ver -gt 10 -o $d_ver -eq 10 -a $d_rev -ge 6; then + CFLAGS="$CFLAGS -arch i386" + CXXFLAGS="$CXXFLAGS -arch i386" + LDFLAGS="$LDFLAGS -arch i386" + fi + ;; +esac + +dnl Define the libraries and link options we'll need. +LINKFLTK="../lib/libfltk.a" +LINKFLTKFORMS="../lib/libfltk_forms.a" +LINKFLTKGL="../lib/libfltk_gl.a" +LINKFLTKIMG="../lib/libfltk_images.a" +GLDEMOS="gldemos" + +LIBEXT=".a" +LIBNAME="../lib/libfltk.a" +FLLIBNAME="../lib/libfltk_forms.a" +GLLIBNAME="../lib/libfltk_gl.a" +IMGLIBNAME="../lib/libfltk_images.a" + +LIBBASENAME="libfltk.a" +FLLIBBASENAME="libfltk_forms.a" +GLLIBBASENAME="libfltk_gl.a" +IMGLIBBASENAME="libfltk_images.a" + +AC_SUBST(FLLIBNAME) +AC_SUBST(GLDEMOS) +AC_SUBST(GLLIBNAME) +AC_SUBST(IMGLIBNAME) +AC_SUBST(LIBEXT) +AC_SUBST(LIBNAME) +AC_SUBST(LINKFLTK) +AC_SUBST(LINKFLTKFORMS) +AC_SUBST(LINKFLTKGL) +AC_SUBST(LINKFLTKIMG) + +AC_SUBST(LIBBASENAME) +AC_SUBST(FLLIBBASENAME) +AC_SUBST(GLLIBBASENAME) +AC_SUBST(IMGLIBBASENAME) + +dnl Handle compile-time options... +AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging [default=no]]) +if test x$enable_debug = xyes; then + DEBUGFLAG="-g " +else + DEBUGFLAG="" +fi + +AC_ARG_ENABLE(gl, [ --enable-gl turn on OpenGL support [default=yes]]) + +AC_ARG_ENABLE(shared, [ --enable-shared turn on shared libraries [default=no]]) +if test x$enable_shared = xyes; then + PICFLAG=1 + SHAREDSUFFIX="" + FLUID="fluid-shared" + + case $uname in + Darwin*) + DSONAME="libfltk.$FL_API_VERSION.dylib" + FLDSONAME="libfltk_forms.$FL_API_VERSION.dylib" + GLDSONAME="libfltk_gl.$FL_API_VERSION.dylib" + IMGDSONAME="libfltk_images.$FL_API_VERSION.dylib" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -dynamiclib -lc -o" + ;; + + SunOS* | UNIX_S*) + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -h \$@ \$(LDLIBS) -G $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib"; then + DSOLINK="-R$libdir" + fi + ;; + HP-UX*) + DSONAME="libfltk.sl.$FL_API_VERSION" + FLDSONAME="libfltk_forms.sl.$FL_API_VERSION" + GLDSONAME="libfltk_gl.sl.$FL_API_VERSION" + IMGDSONAME="libfltk_images.sl.$FL_API_VERSION" + DSOCOMMAND="ld \$(DSOFLAGS) -b -z +h \$@ $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib"; then + DSOLINK="-Wl,-rpath,$libdir" + fi + ;; + IRIX*) + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@,-set_version,sgi1.1 \$(LDLIBS) -shared $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/usr/lib32" -a "x$libdir" != "x/usr/lib64"; then + DSOLINK="-Wl,-rpath,$libdir" + fi + ;; + OSF1*) + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib" -a "x$libdir" != "x/usr/lib32"; then + DSOLINK="-Wl,-rpath,$libdir" + fi + ;; + Linux* | *BSD*) + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared -fPIC $DEBUGFLAG -o" + if test "x$libdir" != "x/usr/lib"; then + DSOLINK="-Wl,-rpath,$libdir" + fi + ;; + AIX*) + DSONAME="libfltk_s.a" + FLDSONAME="libfltk_forms_s.a" + GLDSONAME="libfltk_gl_s.a" + IMGDSONAME="libfltk_images_s.a" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-bexpall,-bM:SRE,-bnoentry -o" + SHAREDSUFFIX="_s" + ;; + CYGWIN* | MINGW*) + PICFLAG=0 + if test x$enable_cygwin != xyes; then + DSONAME="mgwfltknox-$FL_API_VERSION.dll" + FLDSONAME="mgwfltknox_forms-$FL_API_VERSION.dll" + GLDSONAME="mgwfltknox_gl-$FL_API_VERSION.dll" + IMGDSONAME="mgwfltknox_images-$FL_API_VERSION.dll" + else + DSONAME="cygfltknox-$FL_API_VERSION.dll" + FLDSONAME="cygfltknox_forms-$FL_API_VERSION.dll" + GLDSONAME="cygfltknox_gl-$FL_API_VERSION.dll" + IMGDSONAME="cygfltknox_images-$FL_API_VERSION.dll" + fi + #----------------------------------------------------------- + # -Wl,--enable-runtime-pseudo-reloc: See str 1585 + # appears to be necessary for older binutils versions < 2.16 + #----------------------------------------------------------- + LDFLAGS="$LDFLAGS -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -shared \ + -Wl,--whole-archive -Wl,--export-all-symbols \ + -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-import \ + -Wl,--enable-auto-image-base -o \$@" + ;; + *) + AC_MSG_WARN(Shared libraries may not be supported. Trying -shared option with compiler.) + DSONAME="libfltk.so.$FL_API_VERSION" + FLDSONAME="libfltk_forms.so.$FL_API_VERSION" + GLDSONAME="libfltk_gl.so.$FL_API_VERSION" + IMGDSONAME="libfltk_images.so.$FL_API_VERSION" + DSOCOMMAND="\$(CXX) \$(DSOFLAGS) -Wl,-soname,\$@ \$(LDLIBS) -shared $DEBUGFLAG -o" + ;; + esac + + LINKSHARED="-L../src -lfltk_images$SHAREDSUFFIX -lfltk_forms$SHAREDSUFFIX -lfltk$SHAREDSUFFIX" +else + DSOCOMMAND="echo" + DSOLINK="" + DSONAME="" + FLDSONAME="" + GLDSONAME="" + IMGDSONAME="" + PICFLAG=0 + SHAREDSUFFIX="" + FLUID="fluid" + LINKSHARED="../lib/libfltk_images.a ../lib/libfltk_forms.a ../lib/libfltk.a" +fi + +AC_SUBST(DSOCOMMAND) +AC_SUBST(DSOFLAGS) +AC_SUBST(DSOLINK) +AC_SUBST(DSONAME) +AC_SUBST(FLDSONAME) +AC_SUBST(GLDSONAME) +AC_SUBST(IMGDSONAME) +AC_SUBST(SHAREDSUFFIX) +AC_SUBST(LINKSHARED) +AC_SUBST(FLUID) + +AC_ARG_ENABLE(threads, [ --enable-threads enable multi-threading support]) + +AC_ARG_WITH(optim, [ --with-optim="flags" use custom optimization flags]) + +AC_ARG_WITH(archflags, [ --with-archflags="flags" + use custom architecture flags], + ARCHFLAGS="$withval") + +case $uname in + Darwin*) + AC_ARG_ENABLE(quartz, [ --enable-quartz use Quartz instead of Quickdraw (default=no)]) + if test "x$enable_quartz" = "xyes"; then + AC_DEFINE(USE_QUARTZ, 1) + AC_DEFINE(__APPLE_QUARTZ__) + else + AC_DEFINE(__APPLE_QD__) + fi + ;; +esac + +dnl Find commands... +AC_PROG_CC +AC_PROG_CXX +AC_PROG_INSTALL +case $uname in + OSF1*) + INSTALL="`pwd`/install-sh -c" + ;; +esac +if test "$INSTALL" = "$ac_install_sh"; then + # Use full path to install-sh script... + INSTALL="`pwd`/install-sh -c" +fi +AC_PATH_PROG(NROFF,nroff) +if test "x$NROFF" = "x:"; then + # Try groff instead of nroff... + AC_PATH_PROG(GROFF,groff) + if test "x$GROFF" = "x:"; then + NROFF="echo" + else + NROFF="$GROFF -T ascii" + fi +fi +AC_PATH_PROG(HTMLDOC,htmldoc) + +dnl How do we make libraries? +AC_PROG_RANLIB +AC_PATH_PROG(AR, ar) + +if test "x$AR" = "x:"; then + AC_MSG_ERROR(Configure could not find the library archiver, aborting.) +fi + +if test "x$RANLIB" != "x:"; then + LIBCOMMAND="$AR cr" +else + LIBCOMMAND="$AR crs" +fi + +AC_SUBST(LIBCOMMAND) + +dnl Architecture checks... +AC_C_BIGENDIAN + +AC_CHECK_SIZEOF(short, 2) +AC_CHECK_SIZEOF(int, 4) +AC_CHECK_SIZEOF(long, 4) +if test $ac_cv_sizeof_short -eq 2; then + AC_DEFINE(U16,unsigned short) +fi +if test $ac_cv_sizeof_int -eq 4; then + AC_DEFINE(U32,unsigned) +else + if test $ac_cv_sizeof_long -eq 4; then + AC_DEFINE(U32,unsigned long) + fi +fi +if test $ac_cv_sizeof_int -eq 8; then + AC_DEFINE(U64,unsigned) +else + if test $ac_cv_sizeof_long -eq 8; then + AC_DEFINE(U64,unsigned long) + fi +fi + +dnl Does the C++ compiler support the bool type? +AC_CACHE_CHECK(whether the compiler recognizes bool as a built-in type, + ac_cv_cxx_bool,[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([ + int f(int x){return 1;} + int f(char x){return 1;} + int f(bool x){return 1;} + ],[ + bool b = true; + return f(b); + ], ac_cv_cxx_bool=yes, ac_cv_cxx_bool=no) + AC_LANG_RESTORE + ]) + +if test "$ac_cv_cxx_bool" != yes; then + CXXFLAGS="-Dbool=char -Dfalse=0 -Dtrue=1 $CXXFLAGS" +fi + +dnl Standard headers and functions... +AC_HEADER_DIRENT +AC_CHECK_HEADER(sys/select.h,AC_DEFINE(HAVE_SYS_SELECT_H)) +AC_CHECK_HEADER(sys/stdtypes.h,AC_DEFINE(HAVE_SYS_SELECT_H)) +AC_CHECK_FUNC(scandir, + if test "x$uname" = xSunOS -o "x$uname" = xQNX; then + AC_MSG_WARN(Not using $uname scandir emulation function.) + else + AC_DEFINE(HAVE_SCANDIR) + fi) + +dnl Do we have the POSIX compatible scandir() prototype? +AC_CACHE_CHECK([whether we have the POSIX compatible scandir() prototype], + ac_cv_cxx_scandir_posix,[ + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([ + #include + int func (const char *d, dirent ***list, void *sort) { + int n = scandir(d, list, 0, (int(*)(const dirent **, const dirent **))sort); + } + ],[ + ], ac_cv_cxx_scandir_posix=yes, ac_cv_cxx_scandir_posix=no) + AC_LANG_RESTORE + ]) + +if test "$ac_cv_cxx_scandir_posix" = yes; then + AC_DEFINE(HAVE_SCANDIR_POSIX) +fi + +AC_CHECK_FUNC(vsnprintf,[ + case "$uname" in + HP-UX*) + if test "$uversion" = "1020"; then + AC_MSG_WARN(Not using built-in vsnprintf function because you are running HP-UX 10.20.) + else + AC_DEFINE(HAVE_VSNPRINTF) + fi + ;; + + OSF1*) + if test "$uversion" = "40"; then + AC_MSG_WARN(Not using built-in vsnprintf function because you are running Tru64 4.0.) + else + AC_DEFINE(HAVE_VSNPRINTF) + fi + ;; + + *) + AC_DEFINE(HAVE_VSNPRINTF) + ;; + esac]) +AC_CHECK_FUNC(snprintf,[ + case "$uname" in + HP-UX*) + if test "$uversion" = "1020"; then + AC_MSG_WARN(Not using built-in snprintf function because you are running HP-UX 10.20.) + else + AC_DEFINE(HAVE_SNPRINTF) + fi + ;; + + OSF1*) + if test "$uversion" = "40"; then + AC_MSG_WARN(Not using built-in snprintf function because you are running Tru64 4.0.) + else + AC_DEFINE(HAVE_SNPRINTF) + fi + ;; + + *) + AC_DEFINE(HAVE_SNPRINTF) + ;; + esac]) +AC_CHECK_HEADER(strings.h, AC_DEFINE(HAVE_STRINGS_H)) +AC_CHECK_FUNCS(strcasecmp strlcat strlcpy) + +AC_CHECK_HEADER(locale.h, AC_DEFINE(HAVE_LOCALE_H)) +AC_CHECK_FUNCS(localeconv) + +dnl FLTK library uses math library functions... +AC_SEARCH_LIBS(pow, m) + +dnl Check for largefile support... +AC_SYS_LARGEFILE + +dnl Define largefile options as needed... +LARGEFILE="" +if test x$enable_largefile = xyes; then + LARGEFILE="-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE" + + if test x$ac_cv_sys_large_files = x1; then + LARGEFILE="$LARGEFILE -D_LARGE_FILES" + fi + + if test x$ac_cv_sys_file_offset_bits = x64; then + LARGEFILE="$LARGEFILE -D_FILE_OFFSET_BITS=64" + fi +fi +AC_SUBST(LARGEFILE) + +dnl Check for "long long" support... +AC_CACHE_CHECK(for long long int, ac_cv_c_long_long, + [if test "$GCC" = yes; then + ac_cv_c_long_long=yes + else + AC_TRY_COMPILE(,[long long int i;], + ac_cv_c_long_long=yes, + ac_cv_c_long_long=no) + fi]) + +if test $ac_cv_c_long_long = yes; then + AC_DEFINE(HAVE_LONG_LONG) +fi + +AC_CHECK_FUNC(strtoll, AC_DEFINE(HAVE_STRTOLL)) + +dnl Check for dlopen/dlsym... +AC_SEARCH_LIBS(dlsym, dl, AC_DEFINE(HAVE_DLSYM)) +AC_CHECK_HEADER(dlfcn.h, AC_DEFINE(HAVE_DLFCN_H)) + +dnl Check for audio libraries... +AUDIOLIBS="" + +case $uname in + CYGWIN* | MINGW*) + dnl Cygwin environment... + AUDIOLIBS="-lwinmm" + ;; + + Darwin*) + AUDIOLIBS="-framework CoreAudio" + ;; + + *) + AC_CHECK_HEADER(alsa/asoundlib.h, + AC_DEFINE(HAVE_ALSA_ASOUNDLIB_H) + AUDIOLIBS="-lasound") + ;; +esac + +AC_SUBST(AUDIOLIBS) + +dnl Check for image libraries... +SAVELIBS="$LIBS" +IMAGELIBS="" +STATICIMAGELIBS="" + +AC_SUBST(IMAGELIBS) +AC_SUBST(STATICIMAGELIBS) + +# Handle the JPEG lib linking mode (use fltk local or system lib) +# If --enable-(resp. --disable-)localjpeg parameter is not set by user +# Then we check the JPEG lib usability, with result in sysjpeglib_ok variable +AC_ARG_ENABLE(localjpeg, [ --enable-localjpeg use local JPEG library, default=auto]) +# Check for System lib use if automatic mode or --disable-localjpeg is requested +sysjpeglib_ok=no +sysjpeginc_ok=no +if test x$enable_localjpeg != xyes; then + AC_CHECK_LIB(jpeg,jpeg_CreateCompress, + [AC_CHECK_HEADER(jpeglib.h, + sysjpeginc_ok=yes) + if test x$sysjpeginc_ok = xyes; then + sysjpeglib_ok=yes + fi]) +fi +# Now set the jpeg lib and include flags according to the requested mode and availability +if test x$enable_localjpeg = xyes -o x$sysjpeglib_ok = xno; then + JPEGINC="-I../jpeg" + JPEG="jpeg" + IMAGELIBS="-lfltk_jpeg $IMAGELIBS" + STATICIMAGELIBS="\$libdir/libfltk_jpeg.a $STATICIMAGELIBS" + AC_DEFINE(HAVE_LIBJPEG) + #ac_cv_lib_jpeg_jpeg_CreateCompress=no # from ima: should not be necessary + # Finally, warn user if system lib was requested but not found + if test x$enable_localjpeg = xno; then + AC_MSG_WARN(Cannot find system jpeg lib or header: choosing the local lib mode.) + fi +else + JPEGINC="" + JPEG="" + IMAGELIBS="-ljpeg $IMAGELIBS" + STATICIMAGELIBS="-ljpeg $STATICIMAGELIBS" + AC_DEFINE(HAVE_LIBJPEG) +fi + +# Handle the ZLIB lib linking mode (use fltk local or system lib) +# If --enable-(resp. --disable-)localzlib parameter is not set by user +# Then we check the ZLIB lib usability, with result in syszlib_ok variable +AC_ARG_ENABLE(localzlib, [ --enable-localzlib use local ZLIB library, default=auto]) +# Check for System lib use if automatic mode or --disable-localzlib is requested +syszlib_ok=no +syszinc_ok=no +if test x$enable_localzlib != xyes; then + AC_CHECK_LIB(z,gzgets, + [AC_CHECK_HEADER(zlib.h, + syszinc_ok=yes) + if test x$syszinc_ok = xyes; then + syszlib_ok=yes + fi]) +fi +# Now set the Z lib and include flags according to the requested mode and availability +if test x$enable_localzlib = xyes -o x$syszlib_ok = xno ; then + ZLIBINC="-I../zlib" + ZLIB="zlib" + LIBS="-lfltk_z $LIBS" + IMAGELIBS="-lfltk_z $IMAGELIBS" + STATICIMAGELIBS="\$libdir/libfltk_z.a $STATICIMAGELIBS" + AC_DEFINE(HAVE_LIBZ) + ac_cv_lib_z_gzgets=no # fc: is still necessary ? + # Finally, warn user if system lib was requested but not found + if test x$enable_localzlib = xno; then + AC_MSG_WARN(Cannot find system z lib or header: choosing the local lib mode.) + fi +else + ZLIBINC="" + ZLIB="" + LIBS="-lz $LIBS" + IMAGELIBS="-lz $IMAGELIBS" + STATICIMAGELIBS="-lz $STATICIMAGELIBS" + AC_DEFINE(HAVE_LIBZ) +fi + +# Handle the PNG lib linking mode (use fltk local or system lib) +# If --enable-(resp. --disable-)localpng parameter is not set by user +# Then we check the png lib usability with result in syspng_lib variable +AC_ARG_ENABLE(localpng, [ --enable-localpng use local PNG library, default=auto]) + +# Now check if system lib is usable, we check Lib AND include availability with inc variant, +# but only, if the builtin lib is not requested +syspnglib_ok=no +syspnginc_ok=no +if test x$enable_localpng != xyes; then + AC_CHECK_LIB(png, png_read_info, + [AC_CHECK_HEADER(png.h, + AC_DEFINE(HAVE_PNG_H) + syspnginc_ok=yes) + AC_CHECK_HEADER(libpng/png.h, + AC_DEFINE(HAVE_LIBPNG_PNG_H) + syspnginc_ok=yes) + if test x$syspnginc_ok = xyes; then + syspnglib_ok=yes + fi]) +fi + +# The following is executed if the lib was not found usable or if local lib is required explicitly +if test x$enable_localpng = xyes -o x$syspnglib_ok = xno ; then + PNGINC="-I../png" + PNG="png" + IMAGELIBS="-lfltk_png $IMAGELIBS" + STATICIMAGELIBS="\$libdir/libfltk_png.a $STATICIMAGELIBS" + AC_DEFINE(HAVE_LIBPNG) + AC_DEFINE(HAVE_PNG_H) + AC_DEFINE(HAVE_PNG_GET_VALID) + AC_DEFINE(HAVE_PNG_SET_TRNS_TO_ALPHA) + # Finally, warn user if system lib was requested but not found + if test x$enable_localpng = xno; then + AC_MSG_WARN(Cannot find system png lib or header: choosing the local lib mode.) + fi +else + PNGINC="" + PNG="" + IMAGELIBS="-lpng $IMAGELIBS" + STATICIMAGELIBS="-lpng $STATICIMAGELIBS" + AC_DEFINE(HAVE_LIBPNG) + AC_CHECK_LIB(png,png_get_valid, AC_DEFINE(HAVE_PNG_GET_VALID)) + AC_CHECK_LIB(png,png_set_tRNS_to_alpha, AC_DEFINE(HAVE_PNG_SET_TRNS_TO_ALPHA)) +fi + +AC_SUBST(JPEG) +AC_SUBST(JPEGINC) +AC_SUBST(PNG) +AC_SUBST(PNGINC) +AC_SUBST(ZLIB) +AC_SUBST(ZLIBINC) + +dnl Restore original LIBS settings... +LIBS="$SAVELIBS" + +dnl See if we need a .exe extension on executables... +AC_EXEEXT + +dnl Check for pthreads for multi-threaded apps... +have_pthread=no +PTHREAD_FLAGS="" + +if test "x$enable_threads" = xyes; then + AC_CHECK_HEADER(pthread.h, AC_DEFINE(HAVE_PTHREAD_H)) + + if test x$ac_cv_header_pthread_h = xyes; then + dnl Check various threading options for the platforms we support + for flag in -lpthreads -lpthread -pthread; do + AC_MSG_CHECKING([for pthread_create using $flag]) + SAVELIBS="$LIBS" + LIBS="$flag $LIBS" + AC_TRY_LINK([#include ], + [pthread_create(0, 0, 0, 0);], + have_pthread=yes, + LIBS="$SAVELIBS") + AC_MSG_RESULT([$have_pthread]) + + if test $have_pthread = yes; then + AC_DEFINE(HAVE_PTHREAD) + PTHREAD_FLAGS="-D_THREAD_SAFE -D_REENTRANT" + + # Solaris requires -D_POSIX_PTHREAD_SEMANTICS to + # be POSIX-compliant... :( + if test $uname = SunOS; then + PTHREAD_FLAGS="$PTHREAD_FLAGS -D_POSIX_PTHREAD_SEMANTICS" + fi + break + fi + done + fi +fi + +AC_SUBST(PTHREAD_FLAGS) + +dnl Define OS-specific stuff... +HLINKS= +POSTBUILD=: +OSX_ONLY=: +THREADS= + +AC_ARG_WITH(links, [ --with-links make header links for common misspellings]) + +INSTALL_DESKTOP="" +UNINSTALL_DESKTOP="" + +case $uname in + CYGWIN* | MINGW*) + dnl Cygwin environment... + # Recent versions of Cygwin are seriously broken and the size + # checks don't work because the shell puts out \r\n instead of + # \n. Here we just force U32 to be defined to "unsigned"... + AC_DEFINE(U32,unsigned) + CFLAGS="-mwindows -DWIN32 $CFLAGS" + CXXFLAGS="-mwindows -DWIN32 $CXXFLAGS" + LDFLAGS="-mwindows $LDFLAGS" + DSOFLAGS="-mwindows $DSOFLAGS" + LIBS="$LIBS -lole32 -luuid -lcomctl32 -lwsock32" + if test "x$with_optim" = x; then + dnl Avoid -Os optimization on Cygwin/Mingw + with_optim="-O3" + fi + + if test x$enable_gl != xno; then + AC_CHECK_HEADER(GL/gl.h, + AC_DEFINE(HAVE_GL) + GLLIB="-lopengl32") + AC_CHECK_HEADER(GL/glu.h, + AC_DEFINE(HAVE_GL_GLU_H) + GLLIB="-lglu32 $GLLIB") + else + LINKFLTKGL="" + GLLIBNAME="" + GLDSONAME="" + GLDEMOS="" + fi + + if test "x$enable_threads" = xyes; then + if test x$have_pthread = xyes; then + AC_DEFINE(HAVE_PTHREAD) + fi + + THREADS="threads.exe" + fi + + # Don't make symlinks since Windows is not case sensitive. + if test "x$with_links" != xyes; then + HLINKS="#" + fi + ;; + + Darwin*) + # MacOS X uses Carbon for graphics... + LIBS="$LIBS -framework Carbon -framework ApplicationServices" + + if test x$have_pthread = xyes; then + AC_DEFINE(HAVE_PTHREAD) + THREADS="threads" + fi + + if test x$enable_gl != xno; then + AC_DEFINE(HAVE_GL) + AC_DEFINE(HAVE_GL_GLU_H) + GLLIB="-framework AGL -framework OpenGL" + else + LINKFLTKGL="" + GLLIBNAME="" + GLDSONAME="" + GLDEMOS="" + fi + + # Don't make symlinks because HFS+ is not case sensitive... + if test "x$with_links" != xyes; then + HLINKS="#" + fi + + # Add a postbuild step after linking applications + POSTBUILD="/Developer/Tools/Rez -t APPL -o" + + # Some steps are only done for OS X package management + OSX_ONLY= + + # Install/Uninstall FLUID application + INSTALL_DESKTOP="install-osx" + UNINSTALL_DESKTOP="uninstall-osx" + ;; + + *) + # All others are UNIX/X11... + if test x$have_pthread = xyes; then + AC_DEFINE(HAVE_PTHREAD) + THREADS="threads" + fi + + dnl Check for X11... + AC_PATH_XTRA + + if test x$no_x = xyes; then + AC_MSG_ERROR(Configure could not find required X11 libraries, aborting.) + fi + + if test "x$X_PRE_LIBS" != x; then + AC_MSG_WARN(Ignoring libraries \"$X_PRE_LIBS\" requested by configure.) + fi + + LIBS="$LIBS -lXext -lX11 $X_EXTRA_LIBS" + CFLAGS="$CFLAGS $X_CFLAGS" + CXXFLAGS="$CXXFLAGS $X_CFLAGS" + LDFLAGS="$X_LIBS $LDFLAGS" + DSOFLAGS="$X_LIBS $DSOFLAGS" + + if test "x$x_includes" != x; then + ac_cpp="$ac_cpp -I$x_includes" + fi + + dnl Check for OpenGL unless disabled... + GLLIB= + + if test x$enable_gl != xno; then + AC_SEARCH_LIBS(dlopen, dl) + AC_CHECK_HEADER(GL/gl.h, + AC_CHECK_LIB(GL, glXMakeCurrent, AC_DEFINE(HAVE_GL) GLLIB="-lGL", + AC_CHECK_LIB(MesaGL,glXMakeCurrent, AC_DEFINE(HAVE_GL) GLLIB=" -lMesaGL",, + -lm), + -lm) + AC_CHECK_LIB(GL, glXGetProcAddressARB, + AC_DEFINE(HAVE_GLXGETPROCADDRESSARB),, -lm) + ) + AC_CHECK_HEADER(GL/glu.h, + AC_DEFINE(HAVE_GL_GLU_H) + if test x$ac_cv_lib_GL_glXMakeCurrent = xyes; then + GLLIB="-lGLU $GLLIB" + fi + if test x$ac_cv_lib_MesaGL_glXMakeCurrent = xyes; then + GLLIB="-lMesaGLU $GLLIB" + fi + ) + + if test x$ac_cv_lib_GL_glXMakeCurrent != xyes -a x$ac_cv_lib_MesaGL_glXMakeCurrent != xyes; then + LINKFLTKGL="" + GLLIBNAME="" + GLDSONAME="" + GLDEMOS="" + fi + else + LINKFLTKGL="" + GLLIBNAME="" + GLDSONAME="" + GLDEMOS="" + fi + + dnl Check for Xinerama support unless disabled... + AC_ARG_ENABLE(xinerama, [ --enable-xinerama turn on Xinerama support [default=no]]) + + if test x$enable_xinerama = xyes; then + AC_CHECK_LIB(Xinerama,XineramaIsActive, + AC_DEFINE(HAVE_XINERAMA) + LIBS="-lXinerama $LIBS") + fi + + dnl Check for the Xft library unless disabled... + AC_ARG_ENABLE(xft, [ --enable-xft turn on Xft support [default=no]]) + + if test x$enable_xft = xyes; then + AC_PATH_PROG(FTCONFIG,freetype-config) + + if test "x$FTCONFIG" != x; then + CPPFLAGS="`$FTCONFIG --cflags` $CPPFLAGS" + CXXFLAGS="`$FTCONFIG --cflags` $CXXFLAGS" + + AC_CHECK_HEADER(X11/Xft/Xft.h, + AC_CHECK_LIB(Xft, XftDrawCreate, + AC_DEFINE(USE_XFT) + LIBS="-lXft $LIBS")) + fi + fi + + dnl Check for the Xdbe extension unless disabled... + AC_ARG_ENABLE(xdbe, [ --enable-xdbe turn on Xdbe support [default=no]]) + + if test x$enable_xdbe = xyes; then + AC_CHECK_HEADER(X11/extensions/Xdbe.h, AC_DEFINE(HAVE_XDBE),, + [#include ]) + fi + + dnl Check for overlay visuals... + AC_PATH_PROG(XPROP, xprop) + AC_CACHE_CHECK(for X overlay visuals, ac_cv_have_overlay, + if test "x$XPROP" != x; then + if $XPROP -root 2>/dev/null | grep -c "SERVER_OVERLAY_VISUALS" >/dev/null; then + ac_cv_have_overlay=yes + else + ac_cv_have_overlay=no + fi + else + ac_cv_have_overlay=no + fi) + + if test x$ac_cv_have_overlay = xyes; then + AC_DEFINE(HAVE_OVERLAY) + fi + + # Make symlinks since UNIX/Linux is case sensitive. + if test "x$with_links" = xno; then + HLINKS="#" + fi + + # Install/Uninstall FLUID application support files + INSTALL_DESKTOP="install-linux" + UNINSTALL_DESKTOP="uninstall-linux" + ;; +esac + +AC_SUBST(GLDEMOS) +AC_SUBST(GLLIB) +AC_SUBST(HLINKS) +AC_SUBST(POSTBUILD) +AC_SUBST(OSX_ONLY) +AC_SUBST(THREADS) + +AC_SUBST(INSTALL_DESKTOP) +AC_SUBST(UNINSTALL_DESKTOP) + +dnl Figure out the appropriate formatted man page extension... +case "$uname" in + *BSD* | Darwin*) + # *BSD + CAT1EXT=0 + CAT3EXT=0 + CAT6EXT=0 + ;; + IRIX*) + # SGI IRIX + CAT1EXT=z + CAT3EXT=z + CAT6EXT=z + ;; + *) + # All others + CAT1EXT=1 + CAT3EXT=3 + CAT6EXT=6 + ;; +esac + +AC_SUBST(CAT1EXT) +AC_SUBST(CAT3EXT) +AC_SUBST(CAT6EXT) + +dnl Fix "mandir" variable... +if test "$mandir" = "\${prefix}/man" -a "$prefix" = "/usr"; then + case "$uname" in + *BSD* | Darwin* | Linux*) + # *BSD, Darwin, and Linux + mandir="\${prefix}/share/man" + ;; + IRIX*) + # SGI IRIX + mandir="\${prefix}/share/catman" + ;; + esac +fi + +dnl Fix "libdir" variable... +if test "$prefix" = NONE; then + prefix=/usr/local +fi + +if test "$exec_prefix" = NONE; then + exec_prefix="\${prefix}" +fi + +if test "$uname" = "IRIX" -a $uversion -ge 62 -a "$libdir" = "\${exec_prefix}/lib" -a "$exec_prefix" = "\${prefix}" -a "$prefix" = "/usr"; then + libdir="/usr/lib32" +fi + +dnl Define the command used to update the dependencies (this option +dnl mainly for FLTK core developers - not necessary for users) +MAKEDEPEND="\$(CXX) -M" +AC_SUBST(MAKEDEPEND) + +dnl Add warnings to compiler switches: +dnl do this last so messing with switches does not break tests + +if test -n "$GCC"; then + # Show all standard warnings + unused variables, conversion errors, + # and inlining problems when compiling... + OPTIM="-Wall -Wunused -Wno-format-y2k $OPTIM" + + # The following additional warnings are useful for tracking down problems... + #OPTIM="-Wshadow -Wconversion $OPTIM" + + # We know that Carbon is deprecated on OS X 10.4. To avoid hundreds of warnings + # we will temporarily disable 'deprecated' warnings on OS X. + if test "$uname" = "Darwin" -a $uversion -ge 800; then + OPTIM="-Wno-deprecated-declarations $OPTIM" + fi + + # Set the default compiler optimizations... + if test -z "$DEBUGFLAG"; then + # + # Note: Can't use -fomit-frame-pointer - prevents tools like + # libsafe from working! + # + # Don't use -fforce-mem, -fforce-addr, or -fcaller-saves. + # They all seem to make either no difference or enlarge + # the code by a few hundred bytes. + # + # "-Os" seems to be the best compromise between speed and + # code size. "-O3" and higher seem to make no effective + # difference in the speed of the code, but does bloat the + # library 10+%. + # + + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-Os $OPTIM" + fi + fi + + # Generate position-independent code when needed... + if test $PICFLAG = 1; then + OPTIM="$OPTIM -fPIC" + fi + + # See if GCC supports -fno-exceptions... + AC_MSG_CHECKING(if GCC supports -fno-exceptions) + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-exceptions" + AC_TRY_COMPILE(,, + OPTIM="$OPTIM -fno-exceptions" + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) + CFLAGS="$OLDCFLAGS" + + # See if GCC supports -fno-strict-aliasing... + AC_MSG_CHECKING(if GCC supports -fno-strict-aliasing) + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-strict-aliasing" + AC_TRY_COMPILE(,, + OPTIM="$OPTIM -fno-strict-aliasing" + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) + CFLAGS="$OLDCFLAGS" + + # See if we are running Solaris; if so, try the -fpermissive option... + # This option is required on some versions of Solaris to work around + # bugs in the X headers up through Solaris 7. + # + # Unlike the other compiler/optimization settings, this one is placed + # in CFLAGS and CXXFLAGS so that fltk-config will provide the option + # to clients - otherwise client apps will not compile properly... + if test "$uname" = SunOS; then + AC_MSG_CHECKING(if GCC supports -fpermissive) + + OLDCFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fpermissive" + AC_TRY_COMPILE(,, + CXXFLAGS="$CXXFLAGS -fpermissive" + AC_MSG_RESULT(yes), + CFLAGS="$OLDCFLAGS" + AC_MSG_RESULT(no)) + fi +else + case "$uname" in + IRIX*) + # Running some flavor of IRIX; see which version and + # set things up according... + if test "$uversion" -ge 62; then + # We are running IRIX 6.2 or higher; uncomment the following + # lines if you don't have IDO 7.2 or higher: + # + # CXX="CC -n32 -mips3" + # CC="cc -n32 -mips3" + # LD="ld -n32 -mips3" + # MAKEDEPEND="CC -M" + + if test "x`grep abi=n32 /etc/compiler.defaults`" = x; then + AC_MSG_WARN(FOR BEST RESULTS BEFORE COMPILING: setenv SGI_ABI \"-n32 -mips3\") + fi + + OPTIM="-fullwarn $OPTIM" + fi + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-O2 $OPTIM" + if test $uversion -gt 62; then + OPTIM="-OPT:Olimit=4000 $OPTIM" + fi + fi + fi + ;; + HP-UX*) + # Running HP-UX; these options should work for the HP compilers. + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="+O2 $OPTIM" + fi + fi + + if test $PICFLAG = 1; then + OPTIM="+z $OPTIM" + fi + + CXXFLAGS="$CXXFLAGS +W336,501,736,740,749,829" + ;; + OSF1*) + # Running Digital/Tru64 UNIX; these options should work for the + # Digital/Compaq/NewHP compilers. + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-O2 $OPTIM" + fi + fi + ;; + SunOS*) + # Solaris + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-xO3 $OPTIM" + fi + fi + + if test $PICFLAG = 1; then + OPTIM="-KPIC $OPTIM" + fi + ;; + AIX*) + if test -z "$DEBUGFLAG"; then + if test "x$with_optim" != x; then + OPTIM="$with_optim $OPTIM" + else + OPTIM="-O2 $OPTIM" + fi + fi + + AC_MSG_WARN(The AIX C and C++ compilers are known not to correctly compile the FLTK library.) + ;; + *) + # Running some other operating system; inform the user they + # should contribute the necessary options to fltk-bugs@fltk.org... + AC_MSG_WARN(Building FLTK with default compiler optimizations) + AC_MSG_WARN(Contact fltk-bugs@fltk.org with uname and compiler options.) + ;; + esac +fi + +OPTIM="$DEBUGFLAG $OPTIM" + +dnl Define the FLTK documentation directory... +if test x$prefix = xNONE; then + AC_DEFINE_UNQUOTED(FLTK_DOCDIR, "/usr/local/share/doc/fltk") +else + AC_DEFINE_UNQUOTED(FLTK_DOCDIR, "$prefix/share/doc/fltk") +fi + +dnl Define the FLTK data directory... +if test x$prefix = xNONE; then + AC_DEFINE_UNQUOTED(FLTK_DATADIR, "/usr/local/share/fltk") +else + AC_DEFINE_UNQUOTED(FLTK_DATADIR, "$prefix/share/fltk") +fi + +dnl Summarize results of configure tests... +echo "" +echo "Configuration Summary" +echo "-------------------------------------------------------------------------" + +case $uname in + CYGWIN* | MINGW*) + graphics="GDI" + ;; + Darwin*) + if test x$enable_quartz = xyes; then + graphics="Quartz" + else + graphics="Quickdraw" + fi + ;; + *) + graphics="X11" + if test x$enable_xft = xyes; then + graphics="$graphics+Xft" + fi + if test x$enable_xdbe = xyes; then + graphics="$graphics+Xdbe" + fi + if test x$enable_xinerama = xyes; then + graphics="$graphics+Xinerama" + fi + ;; +esac + +echo " Directories: prefix=$prefix" +echo " bindir=$bindir" +echo " datadir=$datadir" +echo " datarootdir=$datarootdir" +echo " exec_prefix=$exec_prefix" +echo " includedir=$includedir" +echo " libdir=$libdir" +echo " mandir=$mandir" +echo " Graphics: $graphics" + +if test x$JPEG = x; then + echo "Image Libraries: JPEG=System" +else + echo "Image Libraries: JPEG=Builtin" +fi +if test x$PNG = x; then + echo " PNG=System" +else + echo " PNG=Builtin" +fi +if test x$ZLIB = x; then + echo " ZLIB=System" +else + echo " ZLIB=Builtin" +fi + +if test x$enable_largefile = xyes; then + echo " Large Files: YES" +else + echo " Large Files: NO" +fi + +if test x$GLDEMOS = x; then + echo " OpenGL: NO" +else + echo " OpenGL: YES" +fi + +if test x$THREADS = x; then + echo " Threads: NO" +else + echo " Threads: YES" +fi + +dnl Write all of the files... +AC_CONFIG_HEADER(config.h:configh.in) +AC_OUTPUT(makeinclude fltk.list fltk-config fltk.spec FL/Makefile) + +dnl Make sure the fltk-config script is executable... +chmod +x fltk-config + +dnl +dnl End of "$Id: configure.in 6892 2009-09-20 17:25:25Z AlbrechtS $". +dnl diff --git a/third_party/windows/fltk-1.1.10/documentation/FL.gif b/third_party/windows/fltk-1.1.10/documentation/FL.gif new file mode 100644 index 0000000..823e0bd Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/FL.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl.html b/third_party/windows/fltk-1.1.10/documentation/Fl.html new file mode 100644 index 0000000..9196e4a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl.html @@ -0,0 +1,1391 @@ + + + Fl + + + + + +

class Fl

+
+ +

Class Hierarchy

+ +
    +Fl
    +
+ +

Include Files

+ +
    +#include <FL/Fl.H>
    +
+ +

Description

+ +

The Fl class is the FLTK global (static) class containing +state information and global methods for the current application.

+ +

Methods

+ + + +

void add_check(Fl_Timeout_Handler, void* = 0);

+ +

FLTK will call this callback just before it flushes the display and +waits for events. This is different than an idle callback because it +is only called once, then FLTK calls the system and tells it not to +return until an event happens. + +

This can be used by code that wants to monitor the +application's state, such as to keep a display up to date. The +advantage of using a check callback is that it is called only when no +events are pending. If events are coming in quickly, whole blocks of +them will be processed before this is called once. This can save +significant time and avoid the application falling behind the events. + +

Sample code: + +

    +bool state_changed; // anything that changes the display turns this on
    +
    +void callback(void*) {
    +  if (!state_changed) return;
    +  state_changed = false;
    +  do_expensive_calculation();
    +  widget->redraw();
    +}
    +
    +main() {
    +  Fl::add_check(callback);
    +  return Fl::run();
    +}
    +
+ +

void add_fd(int fd, void (*cb)(int,void*),void* =0);
+void add_fd(int fd, int when, void (*cb)(int, void*), void* = 0);

+ +

Add file descriptor fd to listen to. When the fd +becomes ready for reading Fl::wait() will call the callback +and then return. The callback is +passed the fd and the arbitrary void* argument.

+ +

The second version takes a when bitfield, with the bits +FL_READ, FL_WRITE, and FL_EXCEPT defined, +to indicate when the callback should be done. + +

There can only be one callback of each type for a file descriptor. +Fl::remove_fd() gets rid of all the callbacks for a given +file descriptor. + +

Under UNIX any file descriptor can be monitored (files, +devices, pipes, sockets, etc.) Due to limitations in Microsoft Windows, +WIN32 applications can only monitor sockets. + +

void add_handler(int (*h)(int));

+ +

Install a function to parse unrecognized events. If FLTK cannot +figure out what to do with an event, it calls each of these functions +(most recent first) until one of them returns non-zero. If none of +them returns non zero then the event is ignored. Events that cause +this to be called are: + +

    +
  • FL_SHORTCUT events that are not recognized by any widget. +This lets you provide global shortcut keys.
  • +
  • System events that FLTK does not recognize. See +fl_xevent.
  • +
  • Some other events when the widget FLTK selected returns +zero from its handle() method. Exactly which ones may change +in future versions, however.
  • +
+ +

void add_idle(void (*cb)(void*), void* = 0);

+ +

Adds a callback function that is called every time by +Fl::wait() and also makes it act as though the timeout is +zero (this makes Fl::wait() return immediately, so if it is +in a loop it is called repeatedly, and thus the idle fucntion is +called repeatedly). The idle function can be used to get background +processing done. + +

You can have multiple idle callbacks. To remove an idle callback use Fl::remove_idle(). + +

Fl::wait() and Fl::check() call idle callbacks, +but Fl::ready() does not. + +

The idle callback can call any FLTK functions, including +Fl::wait(), Fl::check(), and Fl::ready(). +FLTK will not recursively call the idle callback. + +

void add_timeout(double t, Fl_Timeout_Handler,void* = 0);

+ +

Add a one-shot timeout callback. The function will be called by +Fl::wait() at t seconds after this function is called. +The optional void* argument is passed to the callback. + +

You can have multiple timeout callbacks. To remove an timeout +callback use Fl::remove_timeout(). + +

If you need more accurate, repeated timeouts, use Fl::repeat_timeout() to +reschedule the subsequent timeouts.

+ +

The following code will print "TICK" each second on +stdout with a fair degree of accuracy:

+ +
+    void callback(void*) {
+      puts("TICK");
+      Fl::repeat_timeout(1.0, callback);
+    }
+
+    int main() {
+      Fl::add_timeout(1.0, callback);
+      return Fl::run();
+    }
+
+ +

int arg(int, char**, int&);

+ +

Consume a single switch from argv, starting at word i. +Returns the number of words eaten (1 or 2, or 0 if it is not +recognized) and adds the same value to i. You can use this +function if you prefer to control the incrementing through the +arguments yourself. + +

int args(int, char**, int&, int (*)(int,char**,int&) = 0);

+ +

FLTK provides an entirely optional command-line switch parser. +You don't have to call it if you don't like them! Everything it can do +can be done with other calls to FLTK. + +

To use the switch parser, call Fl::args(...) near the start +of your program. This does not open the display, instead +switches that need the display open are stashed into static variables. +Then you must display your first window by calling +window->show(argc,argv), which will do anything stored in the +static variables. + +

callback lets you define your own switches. It is called +with the same argc and argv, and with i the +index of each word. The callback should return zero if the switch is +unrecognized, and not change i. It should return non-zero if +the switch is recognized, and add at least 1 to i (it can add +more to consume words after the switch). This function is called +before any other tests, so you can override any FLTK +switch (this is why FLTK can use very short switches instead of +the long ones all other toolkits force you to use). + +

On return i is set to the index of the first non-switch. +This is either: + +

    +
  • The first word that does not start with '-'.
  • +
  • The word '-' (used by many programs to name stdin as a file)
  • +
  • The first unrecognized switch (return value is 0).
  • +
  • argc
  • +
+ +

The return value is i unless an unrecognized switch is found, +in which case it is zero. If your program takes no arguments other +than switches you should produce an error if the return value is less +than argc. + +

All switches except -bg2 may be abbreviated one letter and case is ignored: + +

    + +
  • -bg color or -background color + +

    Sets the background color using Fl::background().

  • + +
  • -bg2 color or -background2 color + +

    Sets the secondary background color using Fl::background2().

  • + +
  • -display host:n.n + +

    Sets the X display to use; this option is silently + ignored under WIN32 and MacOS.

  • + +
  • -dnd and -nodnd + +

    Enables or disables drag and drop text operations + using Fl::dnd_text_ops().

  • + +
  • -fg color or -foreground color + +

    Sets the foreground color using Fl::foreground().

  • + +
  • -geometry WxH+X+Y + +

    Sets the initial window position and size according + the the standard X geometry string.

  • + +
  • -iconic + +

    Iconifies the window using Fl_Window::iconize().

  • + +
  • -kbd and -nokbd + +

    Enables or disables visible keyboard focus for + non-text widgets using Fl::visible_focus().

  • + +
  • -name string + +

    Sets the window class using Fl_Window::xclass().

  • + +
  • -scheme string + +

    Sets the widget scheme using Fl::scheme().

  • + +
  • -title string + +

    Sets the window title using Fl_Window::label().

  • + +
  • -tooltips and -notooltips + +

    Enables or disables tooltips using Fl_Tooltip::enable().

  • + +
+ +

The second form of Fl::args() is useful if your program does +not have command line switches of its own. It parses all the switches, +and if any are not recognized it calls Fl::abort(Fl::help). + +

A usage string is displayed if Fl::args() detects an invalid +argument on the command-line. You can change the message by setting the +Fl::help pointer. + +

void (*atclose)(Fl_Window*,void*);

+ +

void awake(void *p);

+ +

int awake(void (*callback)(void*), void *userdata);

+ +

The awake() method sends a message pointer to the main thread, +causing any pending Fl::wait() call to +terminate so that the main thread can retrieve the message and any pending +redraws can be processed. + +

Multiple calls to Fl::awake() will queue multiple pointers +for the main thread to process, up to a system-defined (typically several +thousand) depth. The default message handler saves the last message which +can be accessed using the +Fl::thread_message() function. + +

The second form of awake() registers a function that will be +called by the main thread during the next message handling cycle. +awake() will return 0 if the callback function was registered, +and -1 if registration failed. Over a thousand awake callbacks can be +registered simultaneously. + +

See also: multithreading. + +

void background2(uchar, uchar, uchar);

+ +

Changes the alternative background color. This color is used as a +background by Fl_Input and other text widgets. +

This call may change fl_color(FL_FOREGROUND_COLOR) if it +does not provide sufficient contrast to FL_BACKGROUND2_COLOR. + +

void background(uchar, uchar, uchar);

+ +

Changes fl_color(FL_BACKGROUND_COLOR) to the given color, +and changes the gray ramp from 32 to 56 to black to white. These are +the colors used as backgrounds by almost all widgets and used to draw +the edges of all the boxtypes. + +

Fl_Widget* belowmouse();
+void belowmouse(Fl_Widget*);

+ +

Get or set the widget that is below the mouse. This is for +highlighting buttons. It is not used to send FL_PUSH or +FL_MOVE directly, for several obscure reasons, but those events +typically go to this widget. This is also the first widget tried for +FL_SHORTCUT events. + +

If you change the belowmouse widget, the previous one and all +parents (that don't contain the new widget) are sent FL_LEAVE +events. Changing this does not send FL_ENTER to this +or any widget, because sending FL_ENTER is supposed to test +if the widget wants the mouse (by it returning non-zero from +handle()). + +

int box_dh(Fl_Boxtype);

+ +

Returns the height offset for the given boxtype. +See box_dy. + +

int box_dw(Fl_Boxtype);

+ +

Returns the width offset for the given boxtype. +See box_dy. + +

int box_dx(Fl_Boxtype);

+ +

Returns the X offset for the given boxtype. +See box_dy. + +

int box_dy(Fl_Boxtype);

+ +

Returns the Y offset for the given boxtype. + +

These functions return the offset values necessary for a given +boxtype, useful for computing the area inside a box's borders, to +prevent overdrawing the borders. + +

For instance, in the case of a boxtype like FL_DOWN_BOX +where the border width might be 2 pixels all around, the above +functions would return 2, 2, 4, and 4 for box_dx, +box_dy, box_dw, and box_dh +respectively. + +

An example to compute the area inside a widget's box(): +

+      int X = yourwidget->x() + Fl::box_dx(yourwidget->box());
+      int Y = yourwidget->y() + Fl::box_dy(yourwidget->box());
+      int W = yourwidget->w() - Fl::box_dw(yourwidget->box());
+      int H = yourwidget->h() - Fl::box_dh(yourwidget->box());
+
+

These functions are mainly useful in the draw() code +for deriving custom widgets, where one wants to avoid drawing +over the widget's own border box(). + +

int check();

+ +

Same as Fl::wait(0). Calling this during a big calculation +will keep the screen up to date and the interface responsive: + +

    +while (!calculation_done()) {
    + calculate();
    + Fl::check();
    + if (user_hit_abort_button()) break;
    +}
    +
+ +

The returns non-zero if any windows are displayed, and 0 if no +windows are displayed (this is likely to change in future versions of +FLTK). + +

int compose(int &del);

+ +

Use of this function is very simple. Any text editing widget should +call this for each FL_KEYBOARD event. + +

If true is returned, then it has modified the +Fl::event_text() and Fl::event_length() to a set of bytes to +insert (it may be of zero length!). In will also set the "del" +parameter to the number of bytes to the left of the cursor to +delete, this is used to delete the results of the previous call to +Fl::compose(). + +

If false is returned, the keys should be treated as function +keys, and del is set to zero. You could insert the text anyways, if +you don't know what else to do. + +

Though the current implementation returns immediately, future +versions may take quite awhile, as they may pop up a window or do +other user-interface things to allow characters to be selected. + +

void compose_reset();

+ +

If the user moves the cursor, be sure to call Fl::compose_reset(). +The next call to Fl::compose() will start out in an initial state. In +particular it will not set "del" to non-zero. This call is very fast +so it is ok to call it many times and in many places. + +

void copy(const char *stuff, int len, int clipboard);

+ +

Copies the data pointed to by stuff to the selection +(0) or primary (1) clipboard. The selection clipboard is used +for middle-mouse pastes and for drag-and-drop selections. The +primary clipboard is used for traditional copy/cut/paste +operations. + +

int damage();
+void damage(int x);

+ +

If true then flush() will do something. + +

void default_atclose(Fl_Window*,void*);

+ +

This is the default callback for window widgets. It hides the +window and then calls the default widget callback.

+ +

void delete_widget(Fl_Widget*);

+ +

Schedules a widget for deletion at the next call to the event loop. +Use this method to delete a widget inside a callback function. As with +normal widget deletion it is your responsibility to remove() the widget +from any parent group or window before calling this.

+ +

To avoid early deletion of widgets, this function +should be called toward the end of a callback and only after any call +to the event loop (Fl::wait(), Fl::flush(), +Fl::check(), fl_ask(), etc.).

+ +

When deleting groups or windows, you must only delete the group or +window widget and not the individual child widgets.

+ +

void display(const char*);

+ +

Sets the X display to use for all windows. Actually this just sets +the environment variable $DISPLAY to the passed string, so this only +works before you show() the first window or otherwise open the display, +and does nothing useful under WIN32. + +

int dnd();

+ +

Initiate a Drag And Drop operation. The clipboard should be +filled with relevant data before calling this method. FLTK will +then initiate the system wide drag and drop handling. Dropped data +will be marked as text. + +

void dnd_text_ops(int d);
+int dnd_text_ops();

+ +

Gets or sets whether drag and drop text operations are +supported. This specifically affects whether selected text can +be dragged from text fields or dragged within a text field as a +cut/paste shortcut. + +

void (*error)(const char*, ...);

+ +

FLTK calls this to print a normal error message. You can +override the behavior by setting the function pointer to your +own routine. + +

Fl::error means there is a recoverable error such as +the inability to read an image file. The default implementation +prints the error message to stderr and returns. + +

int event_alt();

+ +

Returns non-zero if the Alt key is pressed. + +

int event_button1();

+ +

Returns non-zero if button 1 is currently held down. +For more details, see Fl::event_buttons(). + +

int event_button2();

+ +

Returns non-zero if button 2 is currently held down. +For more details, see Fl::event_buttons(). + +

int event_button3();

+ +

Returns non-zero if button 3 is currently held down. +For more details, see Fl::event_buttons(). + +

int event_button();

+ +

Returns which mouse button caused te current event. This returns garbage if the +most recent event was not a FL_PUSH or FL_RELEASE +event. + +

int event_buttons();

+ +

Returns the button state bits; if non-zero, then at least one +button is pressed. This function returns the button state at the +time of the event. During an FL_RELEASE event, the state +of the released button will be 0. To find out, which button +caused an FL_RELEASE event, you can use +Fl::event_button() instead. + +

int event_clicks();
+void event_clicks(int i);

+ +

The first form returns non-zero if the most recent FL_PUSH or +FL_KEYBOARD was a "double click". Returns N-1 for +N clicks. A double click is counted if the same button is pressed +again while event_is_click() is true. + +

The second form directly sets the number returned by +Fl::event_clicks(). This can be used to set it to zero so that +later code does not think an item was double-clicked. + +

int event_ctrl();

+ +

Returns non-zero if the Control key is pressed. + +

int event();

+ +

Returns the last event that was processed. This can be used +to determine if a callback is being done in response to a +keypress, mouse click, etc. + +

int event_inside(int,int,int,int);
+int event_inside(const Fl_Widget*);

+ +

Returns non-zero if the current event_x and event_y +put it inside the widget or inside an arbitrary bounding box. You +should always call this rather than doing your own comparison so you +are consistent about edge effects. + +

int event_is_click();
+void event_is_click(0);

+ +

The first form returns non-zero if the mouse has not moved far enough +and not enough time has passed since the last FL_PUSH or +FL_KEYBOARD event for it to be considered a "drag" rather than a +"click". You can test this on FL_DRAG, FL_RELEASE, +and FL_MOVE events. The second form clears the value returned +by Fl::event_is_click(). Useful to prevent the next +click from being counted as a double-click or to make a popup menu +pick an item with a single click. Don't pass non-zero to this. + +

int event_key();
+int event_key(int s);

+ +

Fl::event_key() returns which key on the keyboard was last +pushed. It returns zero if the last event was not a key press or release. + +

Fl::event_key(int) returns true if the given key was held +down (or pressed) during the last event. This is constant until +the next event is read from the server. + +

Fl::get_key(int) returns true if the given key is held down +now. Under X this requires a round-trip to the server and is +much slower than Fl::event_key(int). + +

Keys are identified by the unshifted values. FLTK defines a +set of symbols that should work on most modern machines for every key +on the keyboard: + +

    +
  • All keys on the main keyboard producing a printable ASCII +character use the value of that ASCII character (as though shift, +ctrl, and caps lock were not on). The space bar is 32.
  • +
  • All keys on the numeric keypad producing a printable ASCII +character use the value of that ASCII character plus FL_KP. +The highest possible value is FL_KP_Last so you can +range-check to see if something is on the keypad.
  • +
  • All numbered function keys use the number on the function key plus +FL_F. The highest possible number is FL_F_Last, so you +can range-check a value.
  • +
  • Buttons on the mouse are considered keys, and use the button +number (where the left button is 1) plus FL_Button.
  • +
  • All other keys on the keypad have a symbol: FL_Escape, +FL_BackSpace, FL_Tab, FL_Enter, FL_Print, FL_Scroll_Lock, FL_Pause, +FL_Insert, FL_Home, FL_Page_Up, FL_Delete, FL_End, FL_Page_Down, +FL_Left, FL_Up, FL_Right, FL_Down, FL_Shift_L, FL_Shift_R, +FL_Control_L, FL_Control_R, FL_Caps_Lock, FL_Alt_L, FL_Alt_R, +FL_Meta_L, FL_Meta_R, FL_Menu, FL_Num_Lock, FL_KP_Enter. Be +careful not to confuse these with the very similar, but all-caps, +symbols used by Fl::event_state() +.
  • +
+ +

On X Fl::get_key(FL_Button+n) does not work. + +

On WIN32 Fl::get_key(FL_KP_Enter) and +Fl::event_key(FL_KP_Enter) do not work. + +

int event_length();

+ +

Returns the length of the text in Fl::event_text(). There +will always be a nul at this position in the text. However there may +be a nul before that if the keystroke translates to a nul character or +you paste a nul character. + +

int event_original_key();

+ +

If NumLock is deactivated, FLTK translates events from the +numeric keypad into the corresponding arrow key events. +event_key() returns the translated key code, whereas +event_original_key() returns the keycode before +NumLock translation. + +

int event_shift();

+ +

Returns non-zero if the Shift key is pressed. + +

int event_state();
+int event_state(int i);

+ +

This is a bitfield of what shift states were on and what mouse buttons +were held down during the most recent event. The second version +returns non-zero if any of the passed bits are turned on. The legal +bits are: + +

    +
  • FL_SHIFT
  • +
  • FL_CAPS_LOCK
  • +
  • FL_CTRL
  • +
  • FL_ALT
  • +
  • FL_NUM_LOCK
  • +
  • FL_META
  • +
  • FL_SCROLL_LOCK
  • +
  • FL_BUTTON1
  • +
  • FL_BUTTON2
  • +
  • FL_BUTTON3
  • +
+ +

X servers do not agree on shift states, and FL_NUM_LOCK, FL_META, and +FL_SCROLL_LOCK may not work. The values were selected to match the +XFree86 server on Linux. In addition there is a bug in the way X works +so that the shift state is not correctly reported until the first event +after the shift key is pressed or released. + +

int event_x();

+ +

Returns the mouse position of the event relative to the Fl_Window +it was passed to. + +

int event_x_root();

+ +

Returns the mouse position on the screen of the event. To find the +absolute position of an Fl_Window on the screen, use the +difference between event_x_root(),event_y_root() and +event_x(),event_y(). + +

int event_y();

+ +

Returns the mouse position of the event relative to the Fl_Window +it was passed to. + +

int event_y_root();

+ +

Returns the mouse position on the screen of the event. To find the +absolute position of an Fl_Window on the screen, use the +difference between event_x_root(),event_y_root() and +event_x(),event_y(). + +

void (*fatal)(const char*, ...);

+ +

FLTK calls this to print a fatal error message. You can +override the behavior by setting the function pointer to your +own routine. + +

Fl::fatal must not return, as FLTK is in an unusable +state, however your version may be able to use longjmp +or an exception to continue, as long as it does not call FLTK +again. The default implementation prints the error message to +stderr and exits with status 1. + +

Fl_Window* first_window();
+void first_window(Fl_Window*);

+ +

Returns the first top-level window in the list of shown() windows. If +a modal() window is shown this is the top-most modal window, otherwise +it is the most recent window to get an event. + +

The second form sets the window that is returned by +first_window. The window is removed from wherever it is in the +list and inserted at the top. This is not done if Fl::modal() +is on or if the window is not shown(). Because the first window +is used to set the "parent" of modal windows, this is often +useful. + +

void flush();

+ +

Causes all the windows that need it to be redrawn and graphics forced +out through the pipes. This is what wait() does before +looking for events. + +

Fl_Widget* focus();
+void focus(Fl_Widget*);

+ +

Get or set the widget that will receive FL_KEYBOARD events. + +

If you change Fl::focus(), the previous widget and all +parents (that don't contain the new widget) are sent FL_UNFOCUS +events. Changing the focus does not send FL_FOCUS to +this or any widget, because sending FL_FOCUS is supposed to +test if the widget wants the focus (by it returning non-zero from +handle()). + +

void foreground(uchar, uchar, uchar);

+ +

Changes fl_color(FL_FOREGROUND_COLOR). + +

void free_color(Fl_Color c, int overlay = 0);

+ +

Frees the specified color from the colormap, if applicable. +If overlay is non-zero then the color is freed from the +overlay colormap. + +

Fl_Box_Draw_F *get_boxtype(Fl_Boxtype);

+ +

Gets the current box drawing function for the specified box type. + + +

unsigned get_color(Fl_Color c);
+void get_color(Fl_Color c, uchar&r, uchar&g, uchar&b);

+ +

Returns the RGB value(s) for the given FLTK color index. The +first form returns the RGB values packed in a 32-bit unsigned +integer with the red value in the upper 8 bits, the green value +in the next 8 bits, and the blue value in bits 8-15. The lower +8 bits will always be 0. + +

The second form returns the red, green, and blue values +separately in referenced variables. + + +

const char* get_font(Fl_Font);

+ +

Get the string for this face. This string is different for each +face. Under X this value is passed to XListFonts to get all the sizes +of this face. + +

const char* get_font_name(Fl_Font, int* attributes = 0);

+ +

Get a human-readable string describing the family of this face. This +is useful if you are presenting a choice to the user. There is no +guarantee that each face has a different name. The return value points +to a static buffer that is overwritten each call. + +

The integer pointed to by attributes (if the pointer is not +zero) is set to zero, FL_BOLD or FL_ITALIC or +FL_BOLD | FL_ITALIC. To locate a "family" of fonts, search +forward and back for a set with non-zero attributes, these faces along +with the face with a zero attribute before them constitute a family. + +

int get_font_sizes(Fl_Font, int*& sizep);

+ +

Return an array of sizes in sizep. The return value is the +length of this array. The sizes are sorted from smallest to largest +and indicate what sizes can be given to fl_font() that will +be matched exactly (fl_font() will pick the closest size for +other sizes). A zero in the first location of the array indicates a +scalable font, where any size works, although the array may list sizes +that work "better" than others. Warning: the returned array +points at a static buffer that is overwritten each call. Under X this +will open the display. + +

int get_key(int);

+ +

void get_mouse(int &x,int &y);

+ +

Return where the mouse is on the screen by doing a round-trip query to +the server. You should use Fl::event_x_root() and +Fl::event_y_root() if possible, but this is necessary if you are +not sure if a mouse event has been processed recently (such as to +position your first window). If the display is not open, this will +open it. + +

void get_system_colors();

+ +

Read the user preference colors from the system and use them to call + Fl::foreground(), Fl::background(), and +Fl::background2(). This is done by +Fl_Window::show(argc,argv) before applying the -fg and -bg +switches. + +

On X this reads some common values from the Xdefaults database. +KDE users can set these values by running the "krdb" program, and +newer versions of KDE set this automatically if you check the "apply +style to other X programs" switch in their control panel. + +

int gl_visual(int, int *alist=0);

+ +

This does the same thing as +Fl::visual(int) but also +requires OpenGL drawing to work. This must be done if +you want to draw in normal windows with OpenGL with gl_start() and +gl_end(). It may be useful to call this so your X +windows use the same visual as an +Fl_Gl_Window, which on +some servers will reduce colormap flashing. + +

See Fl_Gl_Window +for a list of additional values for the argument. + +

Fl_Window* grab();
+void grab(Fl_Window&w) {grab(&w);}

+ +

This is used when pop-up menu systems are active. Send all events to +the passed window no matter where the pointer or focus is (including +in other programs). The window does not have to be +shown() , this lets the handle() method of a +"dummy" window override all event handling and allows you to +map and unmap a complex set of windows (under both X and WIN32 +some window must be mapped because the system interface needs a +window id). + +

If grab() is on it will also affect show() of windows by +doing system-specific operations (on X it turns on +override-redirect). These are designed to make menus popup reliably +and faster on the system. + +

To turn off grabbing do Fl::grab(0). + +

Be careful that your program does not enter an infinite loop +while grab() is on. On X this will lock up your screen! +To avoid this potential lockup, all newer operating systems seem to +limit mouse pointer grabbing to the time during which a mouse button +is held down. Some OS's may not support grabbing at all. + +

int h();

+ +

Returns the height of the screen in pixels. + +

int handle(int, Fl_Window*);

+ +

Sends the event to a window for processing. Returns non-zero if any +widget uses the event. + +

int has_check(Fl_Timeout_Handler, void* = 0);

+ +

Returns true if the check exists and has not been called yet. + +

int has_idle(void (*cb)(void*), void* = 0);

+ +

Returns true if the specified idle callback is currently installed. + +

int has_timeout(Fl_Timeout_Handler, void* = 0);

+ +

Returns true if the timeout exists and has not been called yet. + +

void lock();

+ +

The lock() method blocks the current thread until it +can safely access FLTK widgets and data. Child threads should +call this method prior to updating any widgets or accessing +data. The main thread must call lock() to initialize +the threading support in FLTK. + +

Child threads must call unlock() when they are done +accessing FLTK. + +

When the wait() method is waiting +for input or timeouts, child threads are given access to FLTK. +Similarly, when the main thread needs to do processing, it will +wait until all child threads have called unlock() before processing +additional data. + +

See also: multithreading + +

Fl_Window* modal();

+ +

Returns the top-most modal() window currently shown. +This is the most recently +shown() window with +modal() true, or NULL if there are no modal() +windows shown(). +The modal() window has its handle() method called +for all events, and no other windows will have handle() +called (grab() overrides this). + +

Fl_Window* next_window(const Fl_Window*);

+ +

Returns the next top-level window in the list of shown() windows. You can +use this call to iterate through all the windows that are shown(). + +

void own_colormap();

+ +

Makes FLTK use its own colormap. This may make FLTK display better +and will reduce conflicts with other programs that want lots of colors. +However the colors may flash as you move the cursor between windows. + +

This does nothing if the current visual is not colormapped. + +

void paste(Fl_Widget &receiver, int clipboard=0);

+ +

Set things up so the receiver widget will be called with an FL_PASTE event some +time in the future for the specified clipboard. The reciever +should be prepared to be called directly by this, or for +it to happen later, or possibly not at all. This +allows the window system to take as long as necessary to retrieve +the paste buffer (or even to screw up completely) without complex +and error-prone synchronization code in FLTK. + +

Fl_Widget* pushed();
+void pushed(Fl_Widget*);

+ +

Get or set the widget that is being pushed. FL_DRAG or +FL_RELEASE (and any more FL_PUSH) events will be sent to +this widget. + +

If you change the pushed widget, the previous one and all parents +(that don't contain the new widget) are sent FL_RELEASE +events. Changing this does not send FL_PUSH to this +or any widget, because sending FL_PUSH is supposed to test +if the widget wants the mouse (by it returning non-zero from +handle()). + +

Fl_Widget* readqueue();

+ +

All Fl_Widgets that don't have a callback defined use a +default callback that puts a pointer to the widget in this queue, and +this method reads the oldest widget out of this queue. + +

int ready();

+ +

This is similar to Fl::check() except this does not +call Fl::flush() or any callbacks, which is useful if your +program is in a state where such callbacks are illegal. This returns +true if Fl::check() would do anything (it will continue to +return true until you call Fl::check() or Fl::wait()). + +

    +while (!calculation_done()) {
    + calculate();
    + if (Fl::ready()) {
    +   do_expensive_cleanup();
    +   Fl::check();
    +   if (user_hit_abort_button()) break;
    + }
    +}
    +
+ +

void redraw();

+ +

Redraws all widgets. + +

void release();

+ +

void remove_check(Fl_Timeout_Handler, void* = 0);

+ +

Removes a check callback. It is harmless to remove a check +callback that no longer exists. + +

void remove_fd(int, int when);
+void remove_fd(int);

+ +

Removes a file descriptor handler. + +

void remove_handler(int (*h)(int));

+ +

Removes a previously added event handler. + +

void remove_idle(void (*cb)(void*), void* = 0);

+ +

Removes the specified idle callback, if it is installed. + +

void remove_timeout(Fl_Timeout_Handler, void* = 0);

+ +

Removes a timeout callback. It is harmless to remove a timeout +callback that no longer exists. + +

void repeat_timeout(double t, Fl_Timeout_Handler,void* = 0);

+ +

This method repeats a timeout callback from the expiration of the +previous timeout, allowing for more accurate timing. You may only call +this method inside a timeout callback. + +

The following code will print "TICK" each second on +stdout with a fair degree of accuracy:

+ +
+    void callback(void*) {
+      puts("TICK");
+      Fl::repeat_timeout(1.0, callback);
+    }
+
+    int main() {
+      Fl::add_timeout(1.0, callback);
+      return Fl::run();
+    }
+
+ +

int run();

+ +

As long as any windows are displayed this calls Fl::wait() +repeatedly. When all the windows are closed it returns zero +(supposedly it would return non-zero on any errors, but FLTK calls +exit directly for these). A normal program will end main() +with return Fl::run();. + +

void scheme(const char *name); +
const char *scheme();

+ +

Gets or sets the current widget scheme. NULL will use +the scheme defined in the FLTK_SCHEME environment +variable or the scheme resource under X11. Otherwise, +any of the following schemes can be used:

+ +
    + +
  • "none" - This is the default look-n-feel which resembles old + Windows (95/98/Me/NT/2000) and old GTK/KDE
  • + +
  • "plastic" - This scheme is inspired by the Aqua user interface + on Mac OS X
  • + +
  • "gtk+" - This scheme is inspired by the Red Hat Bluecurve + theme
  • + +
+ +

int screen_count();

+ +

Gets the number of available screens.

+ +

void screen_xywh(int &x, int &y, int &w, int &h);
+void screen_xywh(int &x, int &y, int &w, int &h, int mx, int my);
+void screen_xywh(int &x, int &y, int &w, int &h, int n);

+ +

Gets the bounding box of a screen. The first form gets the +bounding box for the screen the mouse pointer is in. The second +form gets the bounding box for the screen that contains the +specified coordinates. The last form gets the bounding box for +the numbered screen, where n is a number from 0 to the +number of screens less 1.

+ +

void scrollbar_size(int W);
+int scrollbar_size();

+ +

Sets or gets the default scrollbar size that is used by the +Fl_Browser_, +Fl_Help_View, +Fl_Scroll, and +Fl_Text_Display widgets.

+ +

void selection(Fl_Widget &owner, const char* stuff, int len);

+ +

Changes the current selection. The block of text is +copied to an internal buffer by FLTK (be careful if doing this in +response to an FL_PASTE as this may be the same buffer +returned by event_text()). The selection_owner() +widget is set to the passed owner. + +

Fl_Widget* selection_owner();
+void selection_owner(Fl_Widget*);

+ +

The single-argument selection_owner(x) call can be used to +move the selection to another widget or to set the owner to +NULL, without changing the actual text of the +selection. FL_SELECTIONCLEAR is sent to the previous +selection owner, if any. + +

Copying the buffer every time the selection is changed is +obviously wasteful, especially for large selections. An interface will +probably be added in a future version to allow the selection to be made +by a callback function. The current interface will be emulated on top +of this. + +

void set_abort(void (*f)(const char*,...));

+ +

void set_atclose(void (*f)(Fl_Window*,void*));

+ +

void set_boxtype(Fl_Boxtype, Fl_Box_Draw_F*,uchar,uchar,uchar,uchar);
+void set_boxtype(Fl_Boxtype, Fl_Boxtype from);

+ +

The first form sets the function to call to draw a specific boxtype. + +

The second form copies the from boxtype. + +

void set_color(Fl_Color, uchar, uchar, uchar);
+void set_color(Fl_Color, unsigned);

+ +

Sets an entry in the fl_color index table. You can set it to +any 8-bit RGB color. The color is not allocated until fl_color(i) +is used. + +

void set_font(Fl_Font, const char*);
+void set_font(Fl_Font, Fl_Font);

+ +

The first form changes a face. The string pointer is simply stored, +the string is not copied, so the string must be in static memory. + +

The second form copies one face to another. + +

Fl_Font set_fonts(const char* = 0);

+ +

FLTK will open the display, and add every font on the server to the +face table. It will attempt to put "families" of faces together, so +that the normal one is first, followed by bold, italic, and bold +italic. + +

The optional argument is a string to describe the set of fonts to +add. Passing NULL will select only fonts that have the +ISO8859-1 character set (and are thus usable by normal text). Passing +"-*" will select all fonts with any encoding as long as they have +normal X font names with dashes in them. Passing "*" will list every +font that exists (on X this may produce some strange output). Other +values may be useful but are system dependent. With WIN32 NULL +selects fonts with ISO8859-1 encoding and non-NULL selects +all fonts. + +

The return value is how many faces are in the table after this is +done. + +

void set_idle(void (*cb)());

+ +

Sets an idle callback. + +

This method is obsolete - use the add_idle() method instead. + +

void set_labeltype(Fl_Labeltype,Fl_Label_Draw_F*,Fl_Label_Measure_F*);

+ +

Sets the functions to call to draw and measure a specific labeltype. + +

int test_shortcut(int);

+ +

Test the current event, which must be an FL_KEYBOARD or +FL_SHORTCUT, against a shortcut value (described in +Fl_Button). Returns non-zero if there is a match. Not to +be confused with +Fl_Widget::test_shortcut(). + +

void *thread_message();

+ +

The thread_message() method returns the last message +that was sent from a child by the awake() method. + +

See also: multithreading + +

void unlock();

+ +

The unlock() method releases the lock that was set +using the lock() method. Child +threads should call this method as soon as they are finished +accessing FLTK. + +

See also: multithreading + +

double version();

+ +

Returns the compiled-in value of the FL_VERSION constant. This +is useful for checking the version of a shared library. + +

void visible_focus(int v);
+int visible_focus();

+ +

Gets or sets the visible keyboard focus on buttons and other +non-text widgets. The default mode is to enable keyboard focus +for all widgets. + +

int visual(int);

+ +

Selects a visual so that your graphics are drawn correctly. This is +only allowed before you call show() on any windows. This does nothing +if the default visual satisfies the capabilities, or if no visual +satisfies the capabilities, or on systems that don't have such +brain-dead notions. + +

Only the following combinations do anything useful: + +

    +
  • Fl::visual(FL_RGB) +
    Full/true color (if there are several depths FLTK chooses the +largest). Do this if you use fl_draw_image + for much better (non-dithered) output. +
     
  • +
  • Fl::visual(FL_RGB8) +
    Full color with at least 24 bits of color. FL_RGB will +always pick this if available, but if not it will happily return a +less-than-24 bit deep visual. This call fails if 24 bits are not +available. +
     
  • +
  • Fl::visual(FL_DOUBLE|FL_INDEX) +
    Hardware double buffering. Call this if you are going to use +Fl_Double_Window. +
     
  • +
  • Fl::visual(FL_DOUBLE|FL_RGB)
  • +
  • Fl::visual(FL_DOUBLE|FL_RGB8) +
    Hardware double buffering and full color. +
+ +

This returns true if the system has the capabilities by default or +FLTK suceeded in turing them on. Your program will still work even if +this returns false (it just won't look as good). + +

int w();

+ +

Returns the width of the screen in pixels. + +

int wait();
+double wait(double time);

+ +

Waits until "something happens" and then returns. Call this +repeatedly to "run" your program. You can also check what happened +each time after this returns, which is quite useful for managing +program state. + +

What this really does is call all idle callbacks, all elapsed +timeouts, call Fl::flush() to get the screen to update, and +then wait some time (zero if there are idle callbacks, the shortest of +all pending timeouts, or infinity), for any events from the user or +any Fl::add_fd() callbacks. It then handles the events and +calls the callbacks and then returns. + +

The return value of the first form is non-zero if there are +any visible windows - this may change in future versions of +FLTK. + +

The second form waits a maximum of time +seconds. It can return much sooner if something happens. + +

The return value is positive if an event or fd happens before the +time elapsed. It is zero if nothing happens (on Win32 this will only +return zero if time is zero). It is negative if an error +occurs (this will happen on UNIX if a signal happens). + +

void (*warning)(const char*, ...);

+ +

FLTK calls this to print a warning message. You can +override the behavior by setting the function pointer to your +own routine. + +

Fl::warning means that there was a recoverable +problem, the display may be messed up but the user can probably +keep working - all X protocol errors call this, for example. + +

int x();

+ +

Returns the origin of the current screen, where 0 indicates +the left side of the screen. + +

int y();

+ +

Returns the origin of the current screen, where 0 indicates +the top edge of the screen. + +

int event_dx();

+ +Returns the current horizontal mouse scrolling associated with the +FL_MOUSEWHEEL event. Right is positive. + +

int event_dy();

+ +Returns the current vertical mouse scrolling assoaciated with the +FL_MOUSEWHEEL event. Down is positive. + +

const char* event_text();

+ +Returns the text associated with the current FL_PASTE or +FL_DND_RELEASE event. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Adjuster.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Adjuster.html new file mode 100644 index 0000000..5fe8a2d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Adjuster.html @@ -0,0 +1,53 @@ + + + Fl_Adjuster + + + +

class Fl_Adjuster

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Adjuster.H>
    +
    +
+

Description

+The Fl_Adjuster widget was stolen from Prisms, and has proven +to be very useful for values that need a large dynamic range. +

Fl_Adjuster widget.

+

When you press a button and drag to the right the value increases. +When you drag to the left it decreases. The largest button adjusts by +100 * step(), the next by 10 * step() and that +smallest button by step(). Clicking on the buttons +increments by 10 times the amount dragging by a pixel does. Shift + +click decrements by 10 times the amount. +

Methods

+ +

Fl_Adjuster::Fl_Adjuster(int x, int +y, int w, int h, const char *label = 0)

+ Creates a new Fl_Adjuster widget using the given position, +size, and label string. It looks best if one of the dimensions is 3 +times the other. +

virtual Fl_Adjuster::~Fl_Adjuster() +

+ Destroys the valuator. +

uchar Fl_Adjuster::soft() const +
void Fl_Adjuster::soft(uchar)

+ If "soft" is turned on, the user is allowed to drag the value outside +the range. If they drag the value to one of the ends, let go, then +grab again and continue to drag, they can get to any value. Default is +one. + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_BMP_Image.html b/third_party/windows/fltk-1.1.10/documentation/Fl_BMP_Image.html new file mode 100644 index 0000000..7b96a48 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_BMP_Image.html @@ -0,0 +1,57 @@ + + + Fl_BMP_Image + + + + + +

class Fl_BMP_Image

+
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_BMP_Image.H>
    +
+ +

Additional Libraries

+ +
    +-lfltk_images  /  fltkimages.lib
    +
+ +

Description

+ +

The Fl_BMP_Image class supports loading, caching, +and drawing of Windows Bitmap (BMP) image files.

+ +

Methods

+ + + +

Fl_BMP_Image::Fl_BMP_Image(const char *filename);

+ +

The constructor loads the named BMP image.

+ +

Fl_BMP_Image::~Fl_BMP_Image();

+ +

The destructor free all memory and server resources that are used by +the image.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Bitmap.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Bitmap.html new file mode 100644 index 0000000..cb90adf --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Bitmap.html @@ -0,0 +1,54 @@ + + + Fl_Bitmap + + + + + +

class Fl_Bitmap

+
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Bitmap.H>
    +
+ +

Description

+ +

The Fl_Bitmap class supports caching and drawing of mono-color +(bitmap) images. Images are drawn using the current color.

+ +

Methods

+ + + +

Fl_Bitmap::Fl_Bitmap(const char *array, int W, int H);
+Fl_Bitmap::Fl_Bitmap(const unsigned char *array, int W, int H);

+ +

The constructors create a new bitmap from the specified bitmap data.

+ +

Fl_Bitmap::~Fl_Bitmap();

+ +

The destructor free all memory and server resources that are used by +the bitmap.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Box.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Box.html new file mode 100644 index 0000000..5ae8aa6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Box.html @@ -0,0 +1,44 @@ + + + Fl_Box + + + +

class Fl_Box

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Box.H>
    +
    +
+

Description

+ This widget simply draws its box, and possibly it's label. Putting it +before some other widgets and making it big enough to surround them +will let you draw a frame around them. +

Methods

+ +

Fl_Box::Fl_Box(int x, int y, int w, int h, +const char * = 0) +
Fl_Box::Fl_Box(Fl_Boxtype b, int x, int y, int w, int h, const +char *)

+ The first constructor sets box() to FL_NO_BOX, which +means it is invisible. However such widgets are useful as placeholders +or Fl_Group::resizable() + values. To change the box to something visible, use box(n). +

The second form of the constructor sets the box to the specified box +type.

+

Fl_Box::~Fl_Box(void)

+The destructor removes the box. + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Browser.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Browser.html new file mode 100644 index 0000000..5fb2c72 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Browser.html @@ -0,0 +1,220 @@ + + + Fl_Browser + + + +

class Fl_Browser

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Browser.H>
    +
    +
+

Description

+ The Fl_Browser widget displays a scrolling list of text +lines, and manages all the storage for the text. This is not a text +editor or spreadsheet! But it is useful for showing a vertical list of +named objects to the user. +

Each line in the browser is identified by number. The numbers +start at one (this is so that zero can be reserved for "no line" in +the selective browsers). Unless otherwise noted, the methods do not +check to see if the passed line number is in range and legal. It must +always be greater than zero and <= size().

+

Each line contains a null-terminated string of text and a void * + data pointer. The text string is displayed, the void * + pointer can be used by the callbacks to reference the object the text +describes.

+

The base class does nothing when the user clicks on it. The +subclasses +Fl_Select_Browser, +Fl_Hold_Browser, and +Fl_Multi_Browser react to user clicks to select lines in +the browser and do callbacks.

+

The base class called +Fl_Browser_ provides the scrolling and selection mechanisms of +this and all the subclasses, but the dimensions and appearance of each +item are determined by the subclass. You can use Fl_Browser_ + to display information other than text, or text that is dynamically +produced from your own data structures. If you find that loading the +browser is a lot of work or is inefficient, you may want to make a +subclass of Fl_Browser_.

+

Methods

+
+ + + +
+ + + + + + + + + + + +
+
+

Fl_Browser::Fl_Browser(int, int, int, +int, const char * = 0)

+ The constructor makes an empty browser. +

Fl_Browser::~Fl_Browser(void)

+ The destructor deletes all list items and destroys the browser. +

void Fl_Browser::add(const char *, void * = +0)

+ Add a new line to the end of the browser. The text is copied using +the strdup() function. It may also be NULL to make a +blank line. The void * argument is returned as the data() + of the new item. +

void Fl_Browser::bottomline(int n)

+Scrolls the browser so the bottom line in the browser is n. +

void Fl_Browser::clear()

+ Remove all the lines in the browser. +

uchar Fl_Browser::column_char() const +
void Fl_Browser::column_char(char c)

+ The first form gets the current column separator character. By default +this is '\t' (tab). +

The second form sets the column separator to c. This will +only have an effect if you also set column_widths().

+

const int +*Fl_Browser::column_widths() const +
void Fl_Browser::column_widths(const int *w)

+ The first form gets the current column width array. This array is +zero-terminated and specifies the widths in pixels of each column. The +text is split at each column_char() and each part is formatted +into it's own column. After the last column any remaining text is +formatted into the space between the last column and the right edge of +the browser, even if the text contains instances of column_char() +. The default value is a one-element array of just a zero, which makes +there are no columns. +

The second form sets the current array to w. Make sure the +last entry is zero.

+

void *Fl_Browser::data(int n) const +
void Fl_Browser::data(int n, void *)

+ The first form returns the data for line n. If n is +out of range this returns NULL. +

The second form sets the data for line n.

+

uchar Fl_Browser::format_char() const +
void Fl_Browser::format_char(char c)

+ The first form gets the current format code prefix character, which by +default is @. A string of formatting codes at the start of +each column are stripped off and used to modify how the rest of the +line is printed: +
    +
  • @. Print rest of line, don't look for more '@' signs
  • +
  • @@ Print rest of line starting with '@'
  • +
  • @l Use a large (24 point) font
  • +
  • @m Use a medium large (18 point) font
  • +
  • @s Use a small (11 point) font
  • +
  • @b Use a bold font (adds FL_BOLD to font)
  • +
  • @i Use an italic font (adds FL_ITALIC to font)
  • +
  • @f or @t Use a fixed-pitch + font (sets font to FL_COURIER)
  • +
  • @c Center the line horizontally
  • +
  • @r Right-justify the text
  • +
  • @B0, @B1, ... @B255 Fill the backgound with +fl_color(n)
  • +
  • @C0, @C1, ... @C255 Use fl_color(n) to draw the text
  • +
  • @F0, @F1, ... Use fl_font(n) to draw the text
  • +
  • @S1, @S2, ... Use point size n to draw the text
  • +
  • @u or @_ Underline the text.
  • +
  • @- draw an engraved line through the middle.
  • +
+ Notice that the @. command can be used to reliably +terminate the parsing. To print a random string in a random color, use +sprintf("@C%d@.%s", color, string) and it will work even if the +string starts with a digit or has the format character in it. +

The second form sets the current prefix to c. Set the +prefix to 0 to disable formatting.

+

void Fl_Browser::hide(int n)

+ Makes line n invisible, preventing selection by the user. + The line can still be selected under program control. +

void Fl_Browser::insert(int n, const char +*, void * = 0)

+ Insert a new line before line n. If n > +size() then the line is added to the end. +

int Fl_Browser::load(const char *filename) +

+ Clears the browser and reads the file, adding each line from the file +to the browser. If the filename is NULL or a zero-length +string then this just clears the browser. This returns zero if there +was any error in opening or reading the file, in which case errno + is set to the system error. The data() of each line is set +to NULL. +

void Fl_Browser::middleline(int n)

+Scrolls the browser so the middle line in the browser is n. +

void Fl_Browser::move(int to, int from)

+ Line from is removed and reinserted at to; to + is calculated after the line is removed. +

int Fl_Browser::position() const +
void Fl_Browser::position(int p)

+ The first form returns the current vertical scrollbar position, where +0 corresponds to the top. If there is not vertical scrollbar then this +will always return 0. +

The second form sets the vertical scrollbar position to p.

+

void Fl_Browser::remove(int n)

+ Remove line n and make the browser one line shorter. +

int Fl_Browser::selected(int n) const

+ Return 1 if line n is selected, 0 if it not selected. +

void Fl_Browser::show(int n)

+ Makes line n visible for selection. +

int Fl_Browser::size() const

+ Returns how many lines are in the browser. The last line number is +equal to this. +

void Fl_Browser::swap(int a, int b)

+Swaps two lines in the browser. +

const char *Fl_Browser::text(int n) const +
void Fl_Browser::text(int n, const char *)

+ The first form returns the text for line n. If n is +out of range it returns NULL. +

The second form sets the text for line n.

+

int Fl_Browser::topline() const +
void Fl_Browser::topline(int n)

+The first form returns the current top line in the browser. If there +is no vertical scrollbar then this will always return 1. +

The second form scrolls the browser so the top line in the browser is n.

+

int Fl_Browser::visible(int n) const

+ Returns a non-zero value if line n is visible. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Browser_.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Browser_.html new file mode 100644 index 0000000..c7b855d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Browser_.html @@ -0,0 +1,419 @@ + + + Fl_Browser_ + + + +

class Fl_Browser_

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Browser_.H>
    +
    +
+

Description

+ This is the base class for browsers. To be useful it must be +subclassed and several virtual functions defined. The Forms-compatible +browser and the file chooser's browser are subclassed off of this. +

This has been designed so that the subclass has complete control +over the storage of the data, although because next() and +prev() functions are used to index, it works best as a linked list +or as a large block of characters in which the line breaks must be +searched for.

+

A great deal of work has been done so that the "height" of a data +object does not need to be determined until it is drawn. This is +useful if actually figuring out the size of an object requires +accessing image data or doing stat() on a file or doing some +other slow operation.

+

Methods

+
+ + +
+ + + + + + + + + +
+
+ +

Fl_Browser::Fl_Browser(int, int, +int, int, const char * = 0)

+ +

The constructor makes an empty browser. + + +

Fl_Browser::~Fl_Browser(void)

+ +

The destructor deletes all list items and destroys the browser. + + +

Fl_Browser_::bbox(int &x, int &y, int &w, int &h) const

+ +

[protected] This method returns the bounding box for the interior of the list, inside +the scrollbars. + + +

Fl_Browser_::deleting(void *a)

+ +

[protected] This method should be used when an item is deleted from the list. +It allows the Fl_Browser_ to discard any cached data it has +on the item. + + +

int Fl_Browser_::deselect(int docb=0)

+ +

Deselects all items in the list and returns 1 if the state changed +or 0 if it did not. + +

If docb is non-zero, deselect tries to call the +callback function for the widget. + + +

Fl_Browser_::display(void *p)

+ +

Displays item p, scrolling the list as necessary. + + +

int Fl_Browser_::displayed(void *p) const

+ +

[protected] This method returns non-zero if item p is currently visible in +the list. + + +

Fl_Browser_::draw() +
Fl_Browser_::draw(int x, int y, int w, int h)

+ +

[protected] The first form draws the list within the normal widget bounding box. + +

[protected] The second form draws the contents of the browser within the +specified bounding box. + + +

void *Fl_Browser_::find_item(int my)

+ +

This method returns the item under mouse at my. If no item is +displayed at that position then NULL is returned. + + +

virtual int Fl_Browser_::full_height() const

+ +

[protected] This method may be provided by the subclass to indicate the full height +of the item list in pixels. The default implementation computes the full +height from the item heights. + + +

Fl_Browser_::full_width() const

+ +

[protected] This method may be provided by the subclass to indicate the full width +of the item list in pixels. The default implementation computes the full +width from the item widths. + + +

Fl_Browser_::handle(int event) +
Fl_Browser_::handle(int event, int x, int y, int w, int h)

+ +

The first form handles an event within the normal widget bounding box. + +

[protected] The second form handles an event within the specified bounding box. + + +

void +Fl_Browser_::has_scrollbar(int h)

+ +

By default you can scroll in both directions, and the scrollbars +disappear if the data will fit in the widget. has_scrollbar() changes +this based on the value of h: + +

    + +
  • 0 - No scrollbars. + +
  • Fl_Browser_::HORIZONTAL - Only a horizontal + scrollbar. + +
  • Fl_Browser_::VERTICAL - Only a vertical + scrollbar. + +
  • Fl_Browser_::BOTH - The default is both + scrollbars. + +
  • Fl_Browser_::HORIZONTAL_ALWAYS - Horizontal + scrollbar always on, vertical always off. + +
  • Fl_Browser_::VERTICAL_ALWAYS - Vertical + scrollbar always on, horizontal always off. + +
  • Fl_Browser_::BOTH_ALWAYS - Both always on. + +
+ + +

int Fl_Browser_::hposition() const +
Fl_Browser_::hposition(int h)

+ +

Gets or sets the horizontal scrolling position of the list, +which is the pixel offset of the list items within the list +area. + + +

virtual int Fl_Browser_::incr_height() const

+ +

[protected] This method may be provided to return the average height of all items, to +be used for scrolling. The default implementation uses the height of the first +item. + + +

Fl_Browser_::inserting(void *a, void *b)

+ +

[protected] This method should be used when an item is added to the list. +It allows the Fl_Browser_ to update its cache data as needed. + + +

virtual void Fl_Browser_::item_draw(void *p, int x, int y, int w, int h)

+ +

[protected] This method must be provided by the subclass to draw the item +p in the area indicated by x, y, w, +and h. + + +

virtual void *Fl_Browser_::item_first() const

+ +

[protected] This method must be provided by the subclass to return the first item in +the list. + + +

virtual int Fl_Browser_::item_height(void *p) const

+ +

[protected] This method must be provided by the subclass to return the height of the +item p in pixels. Allow for two additional pixels for the list +selection box. + + +

virtual void *Fl_Browser_::item_next(void *p) const

+ +

[protected] This method must be provided by the subclass to return the item in +the list after p. + + +

virtual void *Fl_Browser_::item_prev(void *p) const

+ +

[protected] This method must be provided by the subclass to return the item in +the list before p. + + +

virtual int Fl_Browser_::item_quick_height(void *p) const

+ +

[protected] This method may be provided by the subclass to return the height of the +item p in pixels. Allow for two additional pixels for the list +selection box. This method differs from +item_height in that it is only +called for selection and scrolling operations. The default implementation +calls item_height. + + +

virtual void Fl_Browser_::item_select(void *p, int s=1)

+ +

[protected] This method must be implemented by the subclass if it supports +multiple selections in the browser. The s argument specifies the +selection state for item p: 0 = off, 1 = on. + + +

virtual int Fl_Browser_::item_selected(void *p) const

+ +

[protected] This method must be implemented by the subclass if it supports +multiple selections in the browser. The method should return 1 if p +is selected and 0 otherwise. + + +

virtual int Fl_Browser_::item_width(void *p) const

+ +

[protected] This method must be provided by the subclass to return the width of the +item p in pixels. Allow for two additional pixels for the list +selection box. + + +

int Fl_Browser_::leftedge() const

+ +

[protected] This method returns the X position of the left edge of the list area +after adjusting for the scrollbar and border, if any. + + +

Fl_Browser_::new_list()

+ +

[protected] This method should be called when the list data is completely replaced +or cleared. It informs the Fl_Browser_ widget that any cached +information it has concerning the items is invalid. + + +

int Fl_Browser_::position() const +
Fl_Browser_::position(int v) const

+ +

Gets or sets the vertical scrolling position of the list, +which is the pixel offset of the list items within the list +area. + + +

Fl_Browser_::redraw_line(void *p)

+ +

[protected] This method should be called when the contents of an item have changed +but not changed the height of the item. + + +

Fl_Browser_::redraw_lines()

+ +

[protected] This method will cause the entire list to be redrawn. + + +

Fl_Browser_::replacing(void *a, void *b)

+ +

[protected] This method should be used when an item is replaced in the list. +It allows the Fl_Browser_ to update its cache data as needed. + + +

Fl_Browser_::resize(int x, int y, int w, int h)

+ +

Repositions and/or resizes the browser. + + +

Fl_Browser_::scrollbar_left()

+ +

This method moves the vertical scrollbar to the lefthand side of the list. + + +

Fl_Browser_::scrollbar_right()

+ +

This method moves the vertical scrollbar to the righthand side of the list. + + +

static void Fl_Browser_::scrollbar_width(int sw);
+static int Fl_Browser_::scrollbar_width() const;

+ +

Sets or gets the width of any scrollbars that are used. + + +

int Fl_Browser_::select(void *p, int s=1, int docb=0)

+ +

Sets the selection state of item p to s and +returns 1 if the state changed or 0 if it did not. + +

If docb is non-zero, select tries to call the callback +function for the widget. + + +

Fl_Browser_::select_only(void *p, int docb=0)

+ +

Selects item p and returns 1 if the state changed or 0 if it did +not. Any other items in the list are deselected. + +

If docb is non-zero, select_only tries to call the +callback function for the widget. + + +

void *Fl_Browser_::selection() const

+ +

[protected] Returns the item currently selected, or NULL if there is no selection. + +

For multiple selection browsers this call returns the currently focused item, +even if it is not selected. To find all selected items, call + +Fl_Multi_Browser::selected() for every item in question. + + +

Fl_Color Fl_Browser_::textcolor() const +
void Fl_Browser_::textcolor(Fl_Color color)

+ +

The first form gets the default text color for the lines in the +browser. + +

The second form sets the default text color to color

+ + +

Fl_Font Fl_Browser_::textfont() const +
void Fl_Browser_::textfont(Fl_Font font)

+ +

The first form gets the default text font for the lines in the +browser. + +

The second form sets the default text font to font

+ + +

uchar Fl_Browser_::textsize() const +
void Fl_Browser_::textsize(uchar size)

+ +

The first form gets the default text size for the lines in the +browser. + +

The second form sets the default text size to size

+ + +

void *Fl_Browser_::top() const

+ +

[protected] Returns the item the appears at the top of the list. + + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Button.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Button.html new file mode 100644 index 0000000..aa52836 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Button.html @@ -0,0 +1,134 @@ + + + Fl_Button + + + +

class Fl_Button

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Button.H>
    +
    +
+

Description

+

Buttons generate callbacks when they are clicked by the user. You +control exactly when and how by changing the values for type() + and when().

+

Buttons can also generate callbacks in response to FL_SHORTCUT + events. The button can either have an explicit +shortcut() value or a letter shortcut can be indicated in +the label() with an '&' character before it. For the label +shortcut it does not matter if Alt is held down, but if you have +an input field in the same window, the user will have to hold down the +Alt key so that the input field does not eat the event first as an +FL_KEYBOARD event.

+

Methods

+
+ + +
+ + + + + + + + + +
+
+

Fl_Button::Fl_Button(int x, int y, int +w, int h, const char *label = 0)

+ The constructor creates the button using the position, size, and +label. +

Fl_Button::~Fl_Button(void)

+ The destructor removes the button. +

int Fl_Button::clear()

+ Same as value(0). +

Fl_Boxtype Fl_Button::down_box() const +
void Fl_Button::down_box(Fl_Boxtype bt)

+ The first form returns the current down box type, which is drawn when +value() is non-zero. +

The second form sets the down box type. The default value of 0 +causes FLTK to figure out the correct matching down version of box() +.

+

int Fl_Button::set()

+ Same as value(1). +

void Fl_Button::setonly()

+ Turns on this button and turns off all other radio buttons in the +group (calling value(1) or set() does not do this). +

ulong Fl_Button::shortcut() const +
void Fl_Button::shortcut(ulong key)

+ The first form returns the current shortcut key for the button. +

The second form sets the shortcut key to key. Setting this +overrides the use of '&' in the label(). The value is a bitwise +OR of a key and a set of shift flags, for example FL_ALT | 'a' +, FL_ALT | (FL_F + 10), or just 'a'. A value +of 0 disables the shortcut.

+

The key can be any value returned by +Fl::event_key(), but will usually be an ASCII letter. Use +a lower-case letter unless you require the shift key to be held down.

+

The shift flags can be any set of values accepted by +Fl::event_state(). If the bit is on that shift key must +be pushed. Meta, Alt, Ctrl, and Shift must be off if they are not in +the shift flags (zero for the other bits indicates a "don't care" +setting).

+

uchar Fl_Button::type() const +
void Fl_Button::type(uchar t)

+ The first form of type() returns the current button type, +which can be one of: +
    +
  • 0: The value is unchanged.
  • +
  • FL_TOGGLE_BUTTON: The value is inverted.
  • +
  • FL_RADIO_BUTTON: The value is set to 1, and all other +buttons in the current group with type() == FL_RADIO_BUTTON + are set to zero.
  • +
+ The second form sets the button type to t. +

char Fl_Button::value() const +
int Fl_Button::value(int)

+ The first form returns the current value (0 or 1). The second form +sets the current value. +

Fl_When Fl_Widget::when() const +
void Fl_Widget::when(Fl_When w)

+ Controls when callbacks are done. The following values are useful, +the default value is FL_WHEN_RELEASE: +
    +
  • 0: The callback is not done, instead changed() is + turned on.
  • +
  • FL_WHEN_RELEASE: The callback is done after the user + successfully clicks the button, or when a shortcut is typed.
  • +
  • FL_WHEN_CHANGED : The callback is done each time the + value() changes (when the user pushes and releases the button, and as + the mouse is dragged around in and out of the button).
  • +
+ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Chart.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Chart.html new file mode 100644 index 0000000..57708be --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Chart.html @@ -0,0 +1,123 @@ + + + Fl_Chart + + + +

class Fl_Chart

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Chart.H>
    +
    +
+

Description

+This widget displays simple charts and is provided for Forms compatibility. +
Fl_Chart widget
+

Methods

+
+ + +
+ + + + + + + + + +
+
+

Fl_Chart::Fl_Chart(int x, int y, int w, +int h, const char *label = 0)

+ Creates a new Fl_Chart widget using the given position, size, +and label string. The default boxtype is FL_NO_BOX. +

virtual Fl_Chart::~Fl_Chart()

+ Destroys the Fl_Chart widget and all of its data. +

void add(double value, const char *label = +NULL, uchar color = 0)

+ The add method adds the value and optionally +label and color to the chart. +

uchar autosize(void) const +
void autosize(uchar onoff)

+ The autosize method controls whether or not the chart will +automatically adjust the bounds of the chart. The first form returns a +boolean value that is non-zero if auto-sizing is enabled and zero is +auto-sizing is disabled. +

The second form of autosize sets the auto-sizing property +to onoff.

+

void bounds(double *a, double *b) +
void bounds(double a, double b)

+ The bounds method gets or sets the lower and upper bounds of +the chart values to a and b respectively. +

void clear(void)

+ The clear method removes all values from the chart. +

void insert(int pos, double value, const +char *label = NULL, uchar color = 0)

+ The insert method inserts a data value at the given position +pos. Position 1 is the first data value. +

int maxsize(void) const +
void maxsize(int n)

+The maxsize method gets or sets the maximum number of data +values for a chart. If you do not call this method then the chart will +be allowed to grow to any size depending on available memory. +

void replace(int pos, double value, const +char *label = NULL, uchar color = 0)

+ The replace method replaces data value pos with +value, label, and color. Position 1 is the +first data value. +

int size(void) const

+ The size method returns the number of data values in the +chart. +

uchar type() const +
void type(uchar t)

+ The first form of type() returns the current chart type. The +chart type can be one of the following: +
+
FL_BAR_CHART
+
Each sample value is drawn as a vertical bar.
+
FL_FILLED_CHART
+
The chart is filled from the bottom of the graph to the sample +values.
+
FL_HORBAR_CHART
+
Each sample value is drawn as a horizontal bar.
+
FL_LINE_CHART
+
The chart is drawn as a polyline with vertices at each sample +value.
+
FL_PIE_CHART
+
A pie chart is drawn with each sample value being drawn as a +proportionate slice in the circle.
+
FL_SPECIALPIE_CHART
+
Like FL_PIE_CHART, but the first slice is separated from the pie.
+
FL_SPIKE_CHART
+
Each sample value is drawn as a vertical line.
+
+ The second form of type() sets the chart type to t. + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Check_Browser.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Check_Browser.html new file mode 100644 index 0000000..e0b69a0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Check_Browser.html @@ -0,0 +1,104 @@ + + + Fl_Check_Browser + + + +

class Fl_Check_Browser

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Check_Browser.H>
    +
    +
+

Description

+ +The Fl_Check_Browser widget displays a scrolling list of text +lines that may be selected and/or checked by the user. + +

Methods

+
+ + +
+ + + + + +
+
+ +

Fl_Check_Browser::Fl_Check_Browser(int, int, int, int, const char * = 0)

+The constructor makes an empty browser. + +

int Fl_Check_Browser::add(const char *)
+int Fl_Check_Browser::add(const char *, int)

+Add a new unchecked line to the end of the browser. The text is copied +using the strdup() function. It may also be NULL to make +a blank line. The second form can set the item checked. + +

void Fl_Check_Browser::check_all()

+Sets all the items checked. + +

void Fl_Check_Browser::check_none()

+Sets all the items unchecked. + +

int Fl_Check_Browser::checked(int item) const
+void Fl_Check_Browser::checked(int item, int b)

+The first form gets the current status of item item. The second form +sets the check status of item item to b. + +

void Fl_Check_Browser::clear()

+Remove every item from the browser. + +

int Fl_Check_Browser::nchecked() const

+Returns how many items are currently checked. + +

int Fl_Check_Browser::nitems() const

+Returns how many lines are in the browser. The last line number is equal to +this. + +

int Fl_Check_Browser::remove(int n)

+Remove line n and make the browser one line shorter. Returns the +number of lines left in the browser. + +

void Fl_Check_Browser::set_checked(int item)

+Equivalent to Fl_Check_Browser::checked(item, 1). + +

char *Fl_Check_Browser::text(int item) const

+Return a pointer to an internal buffer holding item item's text. + +

int Fl_Check_Browser::value() const

+Returns the index of the currently selected item. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Check_Button.gif b/third_party/windows/fltk-1.1.10/documentation/Fl_Check_Button.gif new file mode 100644 index 0000000..bbd6f4e Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/Fl_Check_Button.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Check_Button.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Check_Button.html new file mode 100644 index 0000000..ae4c8df --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Check_Button.html @@ -0,0 +1,45 @@ + + + Fl_Check_Button + + + +

class Fl_Check_Button

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Check_Button.H>
    +
    +
+

Description

+Buttons generate callbacks when they are clicked by the user. You +control exactly when and how by changing the values for type() +and when(). +

Fl_Check_Button widget

+

The Fl_Check_Button subclass display the "on" state by +turning on a light, rather than drawing pushed in. The shape of the +"light" is initially set to FL_DIAMOND_DOWN_BOX. The color of the +light when on is controlled with selection_color(), which +defaults to FL_RED.

+

Methods

+ +

+Fl_Check_Button::Fl_Check_Button(int x, int y, int w, int h, const char +*label = 0)

+ Creates a new Fl_Check_Button widget using the given +position, size, and label string. +

+Fl_Check_Button::~Fl_Check_Button()

+ The destructor deletes the check button. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Choice.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Choice.html new file mode 100644 index 0000000..fbe040f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Choice.html @@ -0,0 +1,88 @@ + + + Fl_Choice + + + +

class Fl_Choice

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Choice.H>
    +
    +
+

Description

+ This is a button that when pushed pops up a menu (or hierarchy of +menus) defined by an array of +Fl_Menu_Item objects. Motif calls this an OptionButton. +

The only difference between this and a +Fl_Menu_Button is that the name of the most recent chosen +menu item is displayed inside the box, while the label is displayed +outside the box. However, since the use of this is most often to +control a single variable rather than do individual callbacks, some of +the Fl_Menu_Button methods are redescribed here in those +terms.

+

When the user picks an item off the menu the value() +is set to that item and then the item's callback is done with +the menu_button as the Fl_Widget* argument. If the +item does not have a callback the menu_button's callback is done +instead.

+

All three mouse buttons pop up the menu. The Forms behavior of the +first two buttons to increment/decrement the choice is not implemented. + This could be added with a subclass, however.

+

The menu will also pop up in response to shortcuts indicated by +putting a '&' character in the label(). See +Fl_Button for a description of this.

+

Typing the shortcut() of any of the items will do exactly +the same as when you pick the item with the mouse. The '&' character in +item names are only looked at when the menu is popped up, however.

+

Fl_Choice widget.

+

Methods

+ +

Fl_Choice::Fl_Choice(int x, int y, int +w, int h, const char *label = 0)

+ Creates a new Fl_Choice widget using the given position, +size, and label string. The default boxtype is FL_UP_BOX. +

The constructor sets menu() to NULL. See +Fl_Menu_ for the methods to set or change the menu.

+

virtual Fl_Choice::~Fl_Choice()

+ The destructor removes the Fl_Choice widget and all of its +menu items. +

int Fl_Choice::value() const +
int Fl_Choice::value(int) +
int Fl_Choice::value(const Fl_Menu *)

+ The value is the index into the Fl_Menu array of the last +item chosen by the user. It is zero initially. You can set it as an +integer, or set it with a pointer to a menu item. The set routines +return non-zero if the new value is different than the old one. + Changing it causes a redraw(). +

int Fl_Widget::changed() const

+ This value is true if the user picks a different value. It is +turned off by value() and just before doing a callback (the +callback can turn it back on if desired). +

void Fl_Widget::set_changed()

+ This method sets the changed() flag. +

void Fl_Widget::clear_changed()

+ This method clears the changed() flag. +

Fl_Boxtype Fl_Choice::down_box() const +
void Fl_Choice::down_box(Fl_Boxtype b)

+ The first form gets the current down box, which is used when the menu +is popped up. The default down box type is FL_DOWN_BOX The +second form sets the current down box type to b. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Clock.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Clock.html new file mode 100644 index 0000000..768c6bb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Clock.html @@ -0,0 +1,52 @@ + + + Fl_Clock + + + +

class Fl_Clock

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Clock.H>
    +
    +
+

Description

+ This widget provides a round analog clock display and is provided for +Forms compatibility. It installs a 1-second timeout callback using +Fl::add_timeout(). +

Fl_Clock widget. Fl_Clock widget.

+

Methods

+ +

Fl_Clock::Fl_Clock(int x, int y, int w, +int h, const char *label = 0)

+ Creates a new Fl_Clock widget using the given position, size, +and label string. The default boxtype is FL_NO_BOX. +

virtual Fl_Clock::~Fl_Clock()

+ The destructor removes the clock. +

int Fl_Clock_Output::hour() const

+ Returns the current hour (0 to 23). +

int Fl_Clock_Output::minute() const

+ Returns the current minute (0 to 59). +

int Fl_Clock_Output::second() const

+ Returns the current second (0 to 60, 60 = leap second). +

ulong Fl_Clock::value(void)

+ Returns the displayed time in seconds since the UNIX epoch (January 1, 1970). + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Clock_Output.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Clock_Output.html new file mode 100644 index 0000000..dea326a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Clock_Output.html @@ -0,0 +1,62 @@ + + + Fl_Clock_Output + + + +

class Fl_Clock_Output

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Clock.H>
    +
    +
+

Description

+ +

This widget can be used to display a program-supplied time. +The time shown on the clock is not updated. +To display the current time, use Fl_Clock +instead. + +

Methods

+ +

Fl_Clock_Output::Fl_Clock_Output(int x, int y, int w, +int h, const char *label = 0)

+ Creates a new Fl_Clock_Output widget using the given position, size, +and label string. The default boxtype is FL_NO_BOX. +

virtual Fl_Clock_Output::~Fl_Clock_Output()

+ The destructor removes the clock. +

int Fl_Clock_Output::hour() const

+ Returns the current hour (0 to 23). +

int Fl_Clock_Output::minute() const

+ Returns the current minute (0 to 59). +

int Fl_Clock_Output::second() const

+ Returns the current second (0 to 60, 60 = leap second). +

void Fl_Clock_Output::value(ulong v) +
void Fl_Clock_Output::value(int h, int m, int s) +
ulong Fl_Clock_Output::value(void)

+ The first two forms of value set the displayed time to the +given UNIX time value or specific hours, minutes, and seconds. +

The third form of value returns the displayed time in +seconds since the UNIX epoch (January 1, 1970).

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Color_Chooser.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Color_Chooser.html new file mode 100644 index 0000000..fec7db6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Color_Chooser.html @@ -0,0 +1,91 @@ + + + Fl_Color_Chooser + + + +

class Fl_Color_Chooser

+
+

Class Hierarchy

+
    +
    +Fl_Group
    +   |
    +   +----Fl_Color_Chooser
    +
    +
+

Include Files

+
    +
    +#include <FL/Fl_Color_Chooser.H>
    +
    +
+

Description

+ The Fl_Color_Chooser widget provides a standard RGB color +chooser. You can place any number of these into a panel of your own +design. This widget contains the hue box, value slider, and rgb input +fields from the above diagram (it does not have the color chips or the +Cancel or OK buttons). The callback is done every time the user +changes the rgb value. It is not done if they move the hue control in +a way that produces the same rgb value, such as when saturation +or value is zero. +

Methods

+ +

+Fl_Color_Chooser::Fl_Color_Chooser(int x, int y, int w, int h, const +char *label = 0)

+ Creates a new Fl_Color_Chooser widget using the given +position, size, and label string. The recommended dimensions are +200x95. The color is initialized to black. +

virtual +Fl_Color_Chooser::~Fl_Color_Chooser()

+ The destructor removes the color chooser and all of its controls. +

double Fl_Color_Chooser::hue() const +

+ Return the current hue. 0 <= hue < 6. Zero is red, one is yellow, +two is green, etc. This value is convienent for the internal +calculations - some other systems consider hue to run from zero to one, +or from 0 to 360. +

double +Fl_Color_Chooser::saturation() const

+ Returns the saturation. 0 <= saturation <= 1. +

double Fl_Color_Chooser::value() +const

+ Returns the value/brightness. 0 <= value <= 1. +

double Fl_Color_Chooser::r() const

+ Returns the current red value. 0 <= r <= 1. +

double Fl_Color_Chooser::g() const

+ Returns the current green value. 0 <= g <= 1. +

double Fl_Color_Chooser::b() const

+ Returns the current blue value. 0 <= b <= 1. +

int Fl_Color_Chooser::rgb(double, +double, double)

+ Sets the current rgb color values. Does not do the callback. Does +not clamp (but out of range values will produce psychedelic effects in +the hue selector). +

int +Fl_Color_Chooser::hsv(double,double,double)

+ Set the hsv values. The passed values are clamped (or for hue, +modulus 6 is used) to get legal values. Does not do the callback. +

static void +Fl_Color_Chooser::hsv2rgb(double, double, double, double&, double&, +double&)

+ This static method converts HSV colors to RGB colorspace. +

static void +Fl_Color_Chooser::rgb2hsv(double, double, double, double&, double&, +double&)

+ This static method converts RGB colors to HSV colorspace. + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Counter.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Counter.html new file mode 100644 index 0000000..d8aff39 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Counter.html @@ -0,0 +1,51 @@ + + + Fl_Counter + + + +

class Fl_Counter

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Counter.H>
    +
    +
+

Description

+ The Fl_Counter widget is provided for forms compatibility. + It controls a single floating point value. +

Fl_Counter widget.

+

Methods

+ +

Fl_Counter::Fl_Counter(int x, int y, +int w, int h, const char *label = 0)

+ Creates a new Fl_Counter widget using the given position, +size, and label string. The default type is FL_NORMAL_COUNTER. +

virtual Fl_Counter::~Fl_Counter()

+Destroys the valuator. +

double Fl_Counter::lstep() const

+Set the increment for the double-arrow buttons. The default +value is 1.0. +

type(uchar)

+ Sets the type of counter: +
    +
  • FL_NORMAL_COUNTER - Displays a counter with 4 arrow + buttons.
  • +
  • FL_SIMPLE_COUNTER - Displays a counter with only 2 arrow +buttons.
  • +
+ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Dial.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Dial.html new file mode 100644 index 0000000..bcf1abb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Dial.html @@ -0,0 +1,65 @@ + + + Fl_Dial + + + +

class Fl_Dial

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Dial.H>
    +
    +
+

Description

+ The Fl_Dial widget provides a circular dial to control a +single floating point value. +

Fl_Dial widget.

+

Methods

+ +

Fl_Dial::Fl_Dial(int x, int y, int w, int +h, const char *label = 0)

+ Creates a new Fl_Dial widget using the given position, size, +and label string. The default type is FL_NORMAL_DIAL. +

virtual Fl_Dial::~Fl_Dial()

+ Destroys the valuator. + +

+ +short Fl_Dial::angle1() const;
+void Fl_Dial::angle1(short);
+short Fl_Dial::angle2() const;
+void Fl_Dial::angle2(short);
+void Fl_Dial::angles(short a, short b); +
+

+ +Sets the angles used for the minimum and maximum values. The default +values are 45 and 315 (0 degrees is straight down and the angles +progress clockwise). Normally angle1 is less than angle2, but if you +reverse them the dial moves counter-clockwise. + +

type(uchar)

+ Sets the type of the dial to: +
    +
  • FL_NORMAL_DIAL - Draws a normal dial with a knob.
  • +
  • FL_LINE_DIAL - Draws a dial with a line.
  • +
  • FL_FILL_DIAL - Draws a dial with a filled arc.
  • +
+ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Double_Window.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Double_Window.html new file mode 100644 index 0000000..88441d2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Double_Window.html @@ -0,0 +1,54 @@ + + + Fl_Double_Window + + + +

class Fl_Double_Window

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Double_Window.H>
    +
    +
+

Description

+ The Fl_Double_Window class provides a double-buffered window. + If possible this will use the X double buffering extension (Xdbe). If +not, it will draw the window data into an off-screen pixmap, and then +copy it to the on-screen window. +

It is highly recommended that you put the following code before the +first show() of any window in your program:

+
    +
    +Fl::visual(FL_DOUBLE|FL_INDEX)
    +
    +
+ This makes sure you can use Xdbe on servers where double buffering +does not exist for every visual. +

Methods

+ +

+Fl_Double_Window::Fl_Double_Window(int w, int h, const +char *label = 0)
+Fl_Double_Window::Fl_Double_Window(int x, int y, int w, int h, const +char *label = 0)

+

Creates a new Fl_Double_Window widget using the given +position, size, and label (title) string.

+

virtual +Fl_Double_Window::~Fl_Double_Window()

+ The destructor also deletes all the children. This allows a +whole tree to be deleted at once, without having to keep a pointer to +all the children in the user code. + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_End.html b/third_party/windows/fltk-1.1.10/documentation/Fl_End.html new file mode 100644 index 0000000..faea027 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_End.html @@ -0,0 +1,45 @@ + + + Fl_End + + + +

class Fl_End

+
+

Class Hierarchy

+
    +
    +Fl_End
    +
    +
+

Include Files

+
    +
    +#include <FL/Fl_Group.H>
    +
    +
+

Description

+This is a dummy class that allows you to end a Fl_Group in a constructor list of a +class: +
    +
    class MyClass {
    +  Fl_Group group;
    +  Fl_Button button_in_group;
    +  Fl_End end;
    +  Fl_Button button_outside_group;
    +  MyClass();
    +};
    +MyClass::MyClass() :
    +  group(10,10,100,100),
    +  button_in_group(20,20,60,30),
    +  end(),
    +  button_outside_group(10,120,60,30)
    +{}
    +
+

Methods

+ +

Fl_End::Fl_End

+ The constructor does Fl_Group::current()->end(). diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_File_Browser.html b/third_party/windows/fltk-1.1.10/documentation/Fl_File_Browser.html new file mode 100644 index 0000000..d516033 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_File_Browser.html @@ -0,0 +1,84 @@ + + + Fl_File_Browser + + + + +

class Fl_File_Browser

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_File_Browser.H>
    +
+ +

Description

+ +

The Fl_File_Browser widget displays a list of filenames, +optionally with file-specific icons. + +

Methods

+ + + +

Fl_File_Browser(int xx, int yy, int ww, int hh, const char *l = 0)

+ +

The constructor creates the Fl_File_Browser widget at the specified +position and size. + +

~Fl_File_Browser()

+ +

The destructor destroys the widget and frees all memory that has been +allocated. + +

void iconsize(uchar s)
+uchar iconsize() const

+ +

Sets or gets the size of the icons. The default size is 20 pixels. + +

void filter(const char *pattern)
+const char *filter() const

+ +

Sets or gets the filename filter. The pattern matching uses +the fl_filename_match() +function in FLTK. + +

void filetype(int type)
+int filetype() const

+ +

Sets or gets the file browser type, FILES or +DIRECTORIES. When set to FILES, both +files and directories are shown. Otherwise only directories are +shown. + +

int load(const char *directory, Fl_File_Sort_F *sort = fl_numeric_sort)

+ +

Loads the specified directory into the browser. If icons have been +loaded then the correct icon is associated with each file in the list. + +

The sort argument specifies a sort function to be used with +fl_filename_list(). + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_File_Chooser.html b/third_party/windows/fltk-1.1.10/documentation/Fl_File_Chooser.html new file mode 100644 index 0000000..7bee2d1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_File_Chooser.html @@ -0,0 +1,295 @@ + + + Fl_File_Chooser + + + + +

class Fl_File_Chooser

+ +
+ +

Class Hierarchy

+ +
    +Fl_File_Chooser
    +
+ +

Include Files

+ +
    +#include <FL/Fl_File_Chooser.H>
    +
+ +

Description

+ +

The Fl_File_Chooser widget displays a standard file selection +dialog that supports various selection modes. + +

Fl_File_Chooser widget
+ +

The Fl_File_Chooser class also exports several static values +that may be used to localize or customize the appearance of all file chooser +dialogs: + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MemberDefault value
add_favorites_label"Add to Favorites"
all_files_label"All Files (*)"
custom_filter_label"Custom Filter"
existing_file_label"Please choose an existing file!"
favorites_label"Favorites"
filename_label"Filename:"
filesystems_label"My Computer" (WIN32)
+ "File Systems" (all others)
manage_favorites_label"Manage Favorites"
new_directory_label"New Directory?"
new_directory_tooltip"Create a new directory."
preview_label"Preview"
save_label"Save"
show_label"Show:"
sortfl_numericsort
+ +

The sort member specifies the sort function that is +used when loading the contents of a directory. + +

Public Members

+ +

The Fl_File_Chooser class exports the "new +directory" (newButton) and "preview" +(previewButton) widgets so that application +developers can control their appearance and use. For more +complex customization, consider copying the FLTK file chooser +code and changing it accordingly. + +

Methods

+ + + +

Fl_File_Chooser(const char *pathname, const char *pattern, +int type, const char *title)

+ +

The constructor creates the Fl_File_Chooser dialog pictured +above. The pathname argument can be a directory name or a +complete file name (in which case the corresponding file is highlighted +in the list and in the filename input field.) + +

The pattern argument can be a NULL +string or "*" to list all files, or it can be a +series of descriptions and filter strings separated by tab +characters (\t). The format of filters is either +"Description text (patterns)" or just "patterns". A file chooser +that provides filters for HTML and image files might look like: + +

    +"HTML Files (*.html)\tImage Files (*.{bmp,gif,jpg,png})"
    +
+ +

The file chooser will automatically add the "All Files (*)" +pattern to the end of the string you pass if you do not provide +one. The first filter in the string is the default filter. + +

See the FLTK documentation on fl_filename_match() +for the kinds of pattern strings that are supported. + +

The type argument can be one of the following: + +

    +
  • SINGLE - allows the user to select a + single, existing file. +
  • MULTI - allows the user to select one + or more existing files. +
  • CREATE - allows the user to select a + single, existing file or specify a new filename. +
  • DIRECTORY - allows the user to select a + single, existing directory. +
+ +

The title argument is used to set the title bar text for the +Fl_File_Chooser window. + +

~Fl_File_Chooser()

+ +

Destroys the widget and frees all memory used by it. + +

void color(Fl_Color c)
+Fl_Color color()

+ +

Sets or gets the background color of the Fl_File_Browser list. + +

int count()

+ +

Returns the number of selected files. + +

void directory(const char *pathname)
+const char *directory()

+ +

Sets or gets the current directory. + +

void filter(const char *pattern)
+const char *filter()

+ +

Sets or gets the current filename filter patterns. The filter +patterns use fl_filename_match(). +Multiple patterns can be used by separating them with tabs, like +"*.jpg\t*.png\t*.gif\t*". In addition, you can provide +human-readable labels with the patterns inside parenthesis, like +"JPEG Files (*.jpg)\tPNG Files (*.png)\tGIF Files (*.gif)\tAll Files (*)". +Use filter(NULL) to show all files.

+ +

void filter_value(int f)
+int filter_value()

+ +

Sets or gets the current filename filter selection. + +

void hide()

+ +

Hides the Fl_File_Chooser window. + +

void iconsize(uchar s)
+uchar iconsize()

+ +

Sets or gets the size of the icons in the Fl_File_Browser. By +default the icon size is set to 1.5 times the textsize(). + +

void label(const char *l)
+const char *label()

+ +

Sets or gets the title bar text for the Fl_File_Chooser. + +

void ok_label(const char *l)
+const char *ok_label()

+ +

Sets or gets the label for the "ok" button in the +Fl_File_Chooser. + +

void preview(int e)
+int preview()

+ +

The first form enables or disables the preview box in the file chooser. +The second form returns the current state of the preview box. + +

void rescan()

+ +

Reloads the current directory in the Fl_File_Browser. + +

void show()

+ +

Shows the Fl_File_Chooser window. + +

void textcolor(Fl_Color c)
+Fl_Color textcolor()

+ +

Sets or gets the current Fl_File_Browser text color. + +

void textfont(uchar f)
+uchar textfont()

+ +

Sets or gets the current Fl_File_Browser text font. + +

void textsize(uchar s)
+uchar textsize()

+ +

Sets or gets the current Fl_File_Browser text size. + +

void type(int t)
+int type()

+ +

Sets or gets the current type of Fl_File_Chooser. + +

const char *value(const char *pathname)
+const char *value(int file)
+const char *value()

+ +

Sets or gets the current value of the selected file. + +

In the second form, file is a 1-based index into a list of +file names. The number of selected files is returned by +Fl_File_Chooser::count(). + +

This sample code loops through all selected files: +

+// Get list of filenames user selected from a MULTI chooser
+for ( int t=1; t<=chooser->count(); t++ ) {
+    const char *filename = chooser->value(t);
+    ..
+}
+
+ +

int visible()

+ +

Returns 1 if the Fl_File_Chooser window is visible. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_File_Chooser.jpg b/third_party/windows/fltk-1.1.10/documentation/Fl_File_Chooser.jpg new file mode 100644 index 0000000..050227d Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/Fl_File_Chooser.jpg differ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_File_Icon.html b/third_party/windows/fltk-1.1.10/documentation/Fl_File_Icon.html new file mode 100644 index 0000000..4cef8af --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_File_Icon.html @@ -0,0 +1,156 @@ + + + Fl_File_Icon + + + + +

class Fl_File_Icon

+ +
+ +

Class Hierarchy

+ +
    +Fl_File_Icon
    +
+ +

Include Files

+ +
    +#include <FL/Fl_File_Icon.H>
    +
+ +

Description

+ +

The Fl_File_Icon class manages icon images that can be +used as labels in other widgets and as icons in the FileBrowser +widget. + +

Methods

+ + + +

Fl_File_Icon()

+ +

The constructor creates a new Fl_File_Icon with the specified +information. + +

~Fl_File_Icon()

+ +

The destructor destroys the icon and frees all memory that has been +allocated for it. + +

short *add(short d)

+ +

Adds a keyword value to the icon array, returning a pointer to it. + +

short *add_color(short c)

+ +

Adds a color value to the icon array, returning a pointer to it. + +

short *add_vertex(int x, int y)
+short *add_vertex(float x, float y)

+ +

Adds a vertex value to the icon array, returning a pointer to it. +The integer version accepts coordinates from 0 to 10000, while the +floating point version goes from 0.0 to 1.0. The origin (0.0) is in +the lower-lefthand corner of the icon. + +

void clear()

+ +

Clears all icon data from the icon. + +

void draw(int x, int y, int w, int h, Fl_Color ic, int active = 1)

+ +

Draws the icon in the indicated area. + +

static Fl_File_Icon *find(const char *filename, int filetype = ANY);

+ +

Finds an icon that matches the given filename and file type. + +

static Fl_File_Icon *first()

+ +

Returns a pointer to the first icon in the list. + +

void label(Fl_Widget *w)

+ +

Applies the icon to the widget, registering the Fl_File_Icon +label type as needed. + +

static void labeltype(const Fl_Label *o, int x, int y, int w, int h, Fl_Align a)

+ +

The labeltype function for icons. + +

void load(const char *f)

+ +

Loads the specified icon image. The format is deduced from the filename. + +

void load_fti(const char *fti)

+ +

Loads an SGI icon file. + +

static void load_system_icons(void)

+ +

Loads all system-defined icons. This call is useful when using the +FileChooser widget and should be used when the application +starts: + +

    +Fl_File_Icon::load_system_icons();
    +
+ +

void load_xpm(const char *xpm)

+ +

Loads an XPM icon file. + +

const char *pattern()

+ +

Returns the filename matching pattern for the icon. + +

int size()

+ +

Returns the number of words of data used by the icon. + +

int type()

+ +

Returns the filetype associated with the icon, which can be one of the +following: + +

    +
  • Fl_File_Icon::ANY, any kind of file. +
  • Fl_File_Icon::PLAIN, plain files. +
  • Fl_File_Icon::FIFO, named pipes. +
  • Fl_File_Icon::DEVICE, character and block devices. +
  • Fl_File_Icon::LINK, symbolic links. +
  • Fl_File_Icon::DIRECTORY, directories. +
+ +

short *value()

+ +

Returns the data array for the icon. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_File_Input.gif b/third_party/windows/fltk-1.1.10/documentation/Fl_File_Input.gif new file mode 100644 index 0000000..4a1f31d Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/Fl_File_Input.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_File_Input.html b/third_party/windows/fltk-1.1.10/documentation/Fl_File_Input.html new file mode 100644 index 0000000..3dc24dc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_File_Input.html @@ -0,0 +1,60 @@ + + + Fl_File_Input + + + + +

class Fl_File_Input

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_File_Input.H>
    +
+ +

Description

+ +

This widget displays a pathname in a text input field. A navigation bar +located above the input field allows the user to navigate upward in the +directory tree. + +

Fl_File_Input widget.
+ +

Methods

+ + + +

Fl_File_Input::Fl_File_Input(int x, int y, int +w, int h, const char *label = 0)

+ +

Creates a new Fl_File_Input widget using the given position, +size, and label string. The default boxtype is FL_DOWN_BOX. + +

virtual Fl_File_Input::~Fl_File_Input()

+ +

Destroys the widget and any value associated with it. + +

Fl_Boxtype Fl_File_Input::down_box() const +
void Fl_File_Input::down_box(Fl_Boxtype b)

+ +

Gets or sets the box type to use for the navigation bar. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Float_Input.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Float_Input.html new file mode 100644 index 0000000..8ca60f1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Float_Input.html @@ -0,0 +1,39 @@ + + + Fl_Float_Input + + + +

class Fl_Float_Input

+
+

Class Hierarchy

+
    +
    +Fl_Input
    +   |
    +   +----Fl_Float_Input
    +
    +
+

Include Files

+
    +
    +#include <FL/Fl_Float_Input.H>
    +
    +
+

Description

+ The Fl_Float_Input class is a subclass of Fl_Input + that only allows the user to type floating point numbers (sign, + digits, decimal point, more digits, 'E' or 'e', sign, digits). +

Methods

+ +

+Fl_Float_Input::Fl_Float_Input(int x, int y, int w, int h, const char +*label = 0)

+ Creates a new Fl_Float_Input widget using the given position, +size, and label string. The default boxtype is FL_DOWN_BOX. +

virtual +Fl_Float_Input::~Fl_Float_Input()

+ Destroys the widget and any value associated with it. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Free.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Free.html new file mode 100644 index 0000000..11585a3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Free.html @@ -0,0 +1,78 @@ + + + Fl_Free + + + +

class Fl_Free

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Free.H>
    +
    +
+

Description

+ Emulation of the Forms "free" widget. This emulation allows the free +demo to run, and appears to be useful for porting programs written in +Forms which use the free widget or make subclasses of the Forms +widgets. +

There are five types of free, which determine when the handle +function is called:

+
    +
    +#define FL_NORMAL_FREE		1
    +#define FL_SLEEPING_FREE	2
    +#define FL_INPUT_FREE		3
    +#define FL_CONTINUOUS_FREE	4
    +#define FL_ALL_FREE		5
    +
    +
+

An FL_INPUT_FREE accepts FL_FOCUS events. A FL_CONTINUOUS_FREE sets +a timeout callback 100 times a second and provides a FL_STEP event, +this has obvious detrimental effects on machine performance. +FL_ALL_FREE does both. FL_SLEEPING_FREE are deactivated.

+

Methods

+ +

Fl_Free(uchar type, int, int, int, int, +const char*l, FL_HANDLEPTR hdl)

+ The constructor takes both the type and the handle + function. The handle function should be declared as follows: +
    +
    +int
    +handle_function(Fl_Widget *w,
    +                int       event,
    +	        float     event_x,
    +		float     event_y,
    +		char      key)
    +
    +
+ This function is called from the the handle() method in +response to most events, and is called by the draw() method. +The event argument contains the event type: +
    +
    +// old event names for compatability:
    +#define FL_MOUSE		FL_DRAG
    +#define FL_DRAW			0
    +#define FL_STEP			9
    +#define FL_FREEMEM		12
    +#define FL_FREEZE		FL_UNMAP
    +#define FL_THAW			FL_MAP
    +
    +
+

virtual Fl_Free::~Fl_Free()

+ The destructor will call the handle function with the event +FL_FREE_MEM. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_GIF_Image.html b/third_party/windows/fltk-1.1.10/documentation/Fl_GIF_Image.html new file mode 100644 index 0000000..a9a4854 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_GIF_Image.html @@ -0,0 +1,58 @@ + + + Fl_GIF_Image + + + + + +

class Fl_GIF_Image

+
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_GIF_Image.H>
    +
+ +

Additional Libraries

+ +
    +-lfltk_images  /  fltkimages.lib
    +
+ +

Description

+ +

The Fl_GIF_Image class supports loading, caching, +and drawing of Compuserve GIFSM images. The class +loads the first image and supports transparency.

+ +

Methods

+ + + +

Fl_GIF_Image::Fl_GIF_Image(const char *filename);

+ +

The constructor loads the named GIF image.

+ +

Fl_GIF_Image::~Fl_GIF_Image();

+ +

The destructor free all memory and server resources that are used by +the image.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Gl_Window.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Gl_Window.html new file mode 100644 index 0000000..75743c7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Gl_Window.html @@ -0,0 +1,246 @@ + + + Fl_Gl_Window + + + + + +

class Fl_Gl_Window

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Gl_Window.H>
    +
+ +

Additional Libraries

+ +
    +-lfltk_gl  /  fltkgl.lib
    +
+ +

Description

+ The Fl_Gl_Window widget sets things up so OpenGL works, and +also keeps an OpenGL "context" for that window, so that changes to the +lighting and projection may be reused between redraws. Fl_Gl_Window + also flushes the OpenGL streams and swaps buffers after draw() + returns. +

OpenGL hardware typically provides some overlay bit planes, which +are very useful for drawing UI controls atop your 3D graphics. If the +overlay hardware is not provided, FLTK tries to simulate the overlay, +This works pretty well if your graphics are double buffered, but not +very well for single-buffered.

+

Please note that the FLTK drawing and clipping functions +will not work inside an Fl_Gl_Window. All drawing +should be done using OpenGL calls exclusively. +Even though Fl_Gl_Window is derived from Fl_Group, +it is not useful to add other FLTK Widgets as children, +unless those Widgets are modified to draw using OpenGL calls.

+ +

Methods

+
+ + +
+ + + + + + + + + +
+
+

Fl_Gl_Window::Fl_Gl_Window(int x, +int y, int w, int h, const char *label = 0)

+ Creates a new Fl_Gl_Window widget using the given position, +size, and label string. The default boxtype is FL_NO_BOX. The +default mode is FL_RGB|FL_DOUBLE|FL_DEPTH. +

virtual +Fl_Gl_Window::~Fl_Gl_Window()

+ The destructor removes the widget and destroys the OpenGL context +associated with it. +

virtual void Fl_Gl_Window::draw(void)

+Fl_Gl_Window::draw() is a pure virtual method. You must +subclass Fl_Gl_Window and provide an implementation for +draw(). You may also provide an implementation of draw_overlay() +if you want to draw into the overlay planes. You can avoid +reinitializing the viewport and lights and other things by checking +valid() at the start of draw() and only doing the +initialization if it is false. +

The draw() method can only use OpenGL calls. Do not +attempt to call X, any of the functions in <FL/fl_draw.H>, or glX + directly. Do not call gl_start() or gl_finish().

+

If double-buffering is enabled in the window, the back and front +buffers are swapped after this function is completed.

+

const int Fl_Gl_Window::mode() const +
int Fl_Gl_Window::mode(int m)

+ Set or change the OpenGL capabilites of the window. The value can be +any of the following OR'd together: +
    +
  • FL_RGB - RGB color (not indexed)
  • +
  • FL_RGB8 - RGB color with at least 8 bits of each color
  • +
  • FL_INDEX - Indexed mode
  • +
  • FL_SINGLE - not double buffered
  • +
  • FL_DOUBLE - double buffered
  • +
  • FL_ACCUM - accumulation buffer
  • +
  • FL_ALPHA - alpha channel in color
  • +
  • FL_DEPTH - depth buffer
  • +
  • FL_STENCIL - stencil buffer
  • +
  • FL_MULTISAMPLE - multisample antialiasing
  • +
+FL_RGB and FL_SINGLE have a value of zero, so they +are "on" unless you give FL_INDEX or FL_DOUBLE. +

If the desired combination cannot be done, FLTK will try turning off +FL_MULTISAMPLE. If this also fails the show() will call +Fl::error() and not show the window.

+

You can change the mode while the window is displayed. This is most +useful for turning double-buffering on and off. Under X this will +cause the old X window to be destroyed and a new one to be created. If +this is a top-level window this will unfortunately also cause the +window to blink, raise to the top, and be de-iconized, and the xid() + will change, possibly breaking other code. It is best to make the GL +window a child of another window if you wish to do this!

+

mode() must not be called within draw() since it +changes the current context.

+

static int Fl_Gl_Window::can_do(int) +
int Fl_Gl_Window::can_do() const

+ Returns non-zero if the hardware supports the given or current OpenGL +mode. + +

void* Fl_Gl_Window::context() const; +
void Fl_Gl_Window::context(void*, int destroy_flag = false);

+ +Return or set a pointer to the GLContext that this window is +using. This is a system-dependent structure, but it is portable to copy +the context from one window to another. You can also set it to NULL, +which will force FLTK to recreate the context the next time make_current() is called, this is +useful for getting around bugs in OpenGL implementations. + +

If destroy_flag is true the context will be destroyed by +fltk when the window is destroyed, or when the mode() is changed, or the next time +context(x) is called. + +

char Fl_Gl_Window::valid() const +
void Fl_Gl_Window::valid(char i)

+Fl_Gl_Window::valid() is turned off when FLTK creates a new +context for this window or when the window resizes, and is turned on +after draw() is called. You can use this inside your +draw() method to avoid unneccessarily initializing the OpenGL +context. Just do this: +
    +void mywindow::draw() {
    +  if (!valid()) {
    +    glViewport(0,0,w(),h());
    +    glFrustum(...);
    +    ...other initialization...
    +  }
    +  if (!context_valid()) {
    +    ...load textures, etc. ...
    +  }
    +  ... draw your geometry here ...
    +}
    +
+ +You can turn valid() on by calling valid(1). You +should only do this after fixing the transformation inside a draw() +or after make_current(). This is done automatically after +draw() returns. +

void Fl_Gl_Window::invalidate()

+ The invalidate() method turns off valid() and is +equivalent to calling value(0). + +

char Fl_Gl_Window::context_valid() const +
void Fl_Gl_Window::context_valid(char i)

+Fl_Gl_Window::context_valid() will only be set if the +OpenGL context is created or recreated. It differs from +Fl_Gl_Window::valid() which is also set whenever the context +changes size. + +

void Fl_Gl_Window::ortho()

+ Set the projection so 0,0 is in the lower left of the window and each +pixel is 1 unit wide/tall. If you are drawing 2D images, your +draw() method may want to call this if valid() is false. +

void Fl_Gl_Window::make_current() +

+ The make_current() method selects the OpenGL context for the +widget. It is called automatically prior to the draw() method +being called and can also be used to implement feedback and/or +selection within the handle() method. +

void +Fl_Gl_Window::make_overlay_current()

+ The make_overlay_current() method selects the OpenGL context +for the widget's overlay. It is called automatically prior to the +draw_overlay() method being called and can also be used to +implement feedback and/or selection within the handle() + method. +

void Fl_Gl_Window::swap_buffers() +

+ The swap_buffers() method swaps the back and front buffers. +It is called automatically after the draw() method is called. +

void Fl_Gl_Window::hide()

+ Hides the window and destroys the OpenGL context. +

int +Fl_Gl_Window::can_do_overlay()

+ Returns true if the hardware overlay is possible. If this is false, +FLTK will try to simulate the overlay, with significant loss of update +speed. Calling this will cause FLTK to open the display. +

void +Fl_Gl_Window::redraw_overlay()

+ This method causes draw_overlay to be called at a later time. + Initially the overlay is clear, if you want the window to display +something in the overlay when it first appears, you must call this +immediately after you show() your window. +

virtual void +Fl_Gl_Window::draw_overlay()

+ You must implement this virtual function if you want to draw into the +overlay. The overlay is cleared before this is called. You should +draw anything that is not clear using OpenGL. You must use +gl_color(i) to choose colors (it allocates them from the colormap +using system-specific calls), and remember that you are in an indexed +OpenGL mode and drawing anything other than flat-shaded will probably +not work. +

Both this function and Fl_Gl_Window::draw() should check +Fl_Gl_Window::valid() and set the same transformation. If you +don't your code may not work on other systems. Depending on the OS, +and on whether overlays are real or simulated, the OpenGL context may +be the same or different between the overlay and main window.

+ + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Group.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Group.html new file mode 100644 index 0000000..cba185d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Group.html @@ -0,0 +1,190 @@ + + + Fl_Group + + + +

class Fl_Group

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Group.H>
    +
    +
+

Description

+ The Fl_Group class is the FLTK container widget. It maintains +an array of child widgets. These children can themselves be any widget +including Fl_Group. The most important subclass of Fl_Group + is Fl_Window, however +groups can also be used to control radio buttons or to enforce resize +behavior. +

Methods

+
+ + +
+ + + + + + + + + +
+
+

Fl_Group::Fl_Group(int x, int y, int w, +int h, const char *label = 0)

+ Creates a new Fl_Group widget using the given position, size, +and label string. The default boxtype is FL_NO_BOX. +

virtual Fl_Group::~Fl_Group()

+ The destructor also deletes all the children. This allows a +whole tree to be deleted at once, without having to keep a pointer to +all the children in the user code. A kludge has been done so the +Fl_Group and all of it's children can be automatic (local) +variables, but you must declare the Fl_Group first, so +that it is destroyed last. +

void Fl_Group::add(Fl_Widget &w) +
void Fl_Group::add(Fl_Widget *w)

+ +The widget is removed from it's current group (if any) and then added +to the end of this group. + +

void Fl_Group::clear()

+ +

The clear() method deletes all child widgets from +memory recursively.

+ +

This method differs from the remove() method in that it +affects all child widgets and deletes them from memory.

+ +

void Fl_Group::clip_children(int c);
+int Fl_Group::clip_children();

+ +The first method controls whether the group widget clips the drawing of +child widgets to its bounding box. + +

The second method returns the current clipping mode. + +

The default is to not clip (0) the drawing of child widgets. + +

void Fl_Group::init_sizes()

+ +The Fl_Group widget keeps track of the original widget sizes and +positions when resizing occurs so that if you resize a window back to its +original size the widgets will be in the correct places. If you rearrange +the widgets in your group, call this method to register the new arrangement +with the Fl_Group that contains them. + +

void Fl_Group::insert(Fl_Widget &w, int n)

+ +The widget is removed from it's current group (if any) and then +inserted into this group. It is put at index n (or at the end +if n >= children(). This can also be used to rearrange +the widgets inside a group. + +

void Fl_Group::insert(Fl_Widget &w, Fl_Widget* beforethis)

+ +This does insert(w, find(beforethis)). This will append the +widget if beforethis is not in the group. + +

void Fl_Group::remove(Fl_Widget &w)

+ +

Removes a widget from the group but does not delete it. This +method does nothing if the widget is not a child of the +group.

+ +

This method differs from the clear() method in that it +only affects a single widget and does not delete it from +memory.

+ +

static Fl_Group *Fl_Group::current() +
static void Fl_Group::current(Fl_Group *w)

+current() returns the currently active group. The Fl_Widget + constructor automatically does current()->add(widget) if this is not null. + To prevent new widgets from being added to a group, call Fl_Group::current(0). +

void Fl_Group::begin()

+begin() sets the current group so you can build the widget +tree by just constructing the widgets. begin() is +automatically called by the constructor for Fl_Group (and thus for +Fl_Window as well). begin() is exactly the same as current(this). +

Don't forget to end() the group or window!

+

void Fl_Group::end()

+end() is exactly the same as current(this->parent()). Any new widgets +added to the widget tree will be added to the parent of the group. +

const Fl_Widget **Fl_Group::array() const

+ Returns a pointer to the array of children. This pointer is only + valid until the next time a child is added or removed. +

Fl_Widget *Fl_Group::child(int n) const

+ Returns array()[n]. No range checking is done! +

int Fl_Group::children() const

+ Returns how many child widgets the group has. +

int Fl_Group::find(const Fl_Widget *w) const +
int Fl_Group::find(const Fl_Widget &w) const

+ Searches the child array for the widget and returns the index. Returns children() if the widget is +NULL or not found. +

void Fl_Group::resizable(Fl_Widget *box) +
void Fl_Group::resizable(Fl_Widget &box) +
Fl_Widget *Fl_Group::resizable() const

+ The resizable widget defines the resizing box for the group. When the +group is resized it calculates a new size and position for all of its +children. Widgets that are horizontally or vertically inside the +dimensions of the box are scaled to the new size. Widgets outside the +box are moved. +

In these examples the gray area is the resizable: +

+

Resizeable groups   +Resizeable groups

+

The resizable may be set to the group itself (this is the default +value for an Fl_Group, although NULL is the default +for Fl_Window and Fl_Pack), in which case all the +contents are resized. +If the resizable is NULL then all widgets remain a fixed size +and distance from the top-left corner.

+

It is possible to achieve any type of resize behavior by using an +invisible Fl_Box as the resizable and/or by using a hierarchy +of child Fl_Group's.

+ +

Fl_Group +&Fl_Group::add_resizable(Fl_Widget &box)

+ Adds a widget to the group and makes it the resizable widget. + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Help_Dialog.gif b/third_party/windows/fltk-1.1.10/documentation/Fl_Help_Dialog.gif new file mode 100644 index 0000000..92b0840 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/Fl_Help_Dialog.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Help_Dialog.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Help_Dialog.html new file mode 100644 index 0000000..8b74a64 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Help_Dialog.html @@ -0,0 +1,120 @@ + + + Fl_Help_Dialog + + + + +

class Fl_Help_Dialog

+ +
+ +

Class Hierarchy

+ +
    +Fl_Help_Dialog
    +
+ +

Include Files

+ +
    +#include "Fl_Help_Dialog.h"
    +
+ +

Additional Libraries

+ +
    +-lfltk_images  /  fltkimages.lib
    +
+ +

Description

+ +

The Fl_Help_Dialog widget displays a standard help dialog window +using the Fl_Help_View widget. + +

Fl_Help_Dialog Window
+ +

Methods

+ + + +

Fl_Help_Dialog()

+ +

The constructor creates the dialog pictured above. + +

~Fl_Help_Dialog()

+ +

The destructor destroys the widget and frees all memory that has been +allocated for the current file. + +

void hide()

+ +

Hides the Fl_Help_Dialog window. + +

void load(const char *f)

+ +

Loads the specified HTML file into the Fl_Help_View widget. +The filename can also contain a target name ("filename.html#target"). + +

void position(int x, int y)

+ +

Set the screen position of the dialog. + +

void resize(int xx, int yy, int ww, int hh)

+ +

Change the position and size of the dialog. + +

void show()

+ +

Shows the Fl_Help_Dialog window. + +

void textsize(uchar s)
+uchar textsize()

+ +

Sets or gets the default text size for the help view. + +

void topline(const char *n)
+void topline(int n)

+ +

Sets the top line in the Fl_Help_View widget to the named or +numbered line. + +

void value(const char *v)
+const char *value() const

+ +

The first form sets the current buffer to the string provided and +reformats the text. It also clears the history of the "back" and +"forward" buttons. The second form returns the current buffer contents. + +

int visible()

+ +

Returns 1 if the Fl_Help_Dialog window is visible. + +

int x()
+int y()
+int w()
+int h()
+

+ +

Returns the position and size of the help dialog. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Help_View.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Help_View.html new file mode 100644 index 0000000..b324af5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Help_View.html @@ -0,0 +1,141 @@ + + + Fl_Help_View + + + +

class Fl_Help_View

+ +
+ +

Class Hierarchy

+ +
    +Fl_Group
    +   |
    +   +----Fl_Help_View
    +
+ +

Include Files

+ +
    +#include "Fl_Help_View.h"
    +
+ +

Description

+ +

The Fl_Help_View widget displays HTML text. Most HTML 2.0 +elements are supported, as well as a primitive implementation of tables. +GIF, JPEG, and PNG images are displayed inline. + +

Methods

+ + + +

Fl_Help_View(int xx, int yy, int ww, int hh, const char *l = 0)

+ +

The constructor creates the Fl_Help_View widget at the specified +position and size. + +

~Fl_Help_View()

+ +

The destructor destroys the widget and frees all memory that has been +allocated for the current file. + +

const char *directory() const

+ +

This method returns the current directory (base) path for the file +in the buffer. + +

const char *filename() const

+ +

This method returns the current filename for the text in the buffer. + +

void link(Fl_Help_Func *fn)

+ +

This method assigns a callback function to use when a link is +followed or a file is loaded (via +Fl_Help_View::load()) that requires a different +file or path. The callback function receives a pointer to the +Fl_Help_View widget and the URI or full pathname +for the file in question. It must return a pathname that can be +opened as a local file or NULL:

+ +
    +const char *fn(Fl_Widget *w, const char *uri);
    +
+ +

The link function can be used to retrieve remote or virtual +documents, returning a temporary file that contains the actual +data. If the link function returns NULL, the value of +the Fl_Help_View widget will remain unchanged.

+ +

If the link callback cannot handle the URI scheme, it should +return the uri value unchanged or set the value() of the widget +before returning NULL.

+ +

int load(const char *f)

+ +

This method loads the specified file or URL. + +

int size() const

+ +

This method returns the length of the buffer text in pixels. + +

void textcolor(Fl_Color c)
+Fl_Color textcolor() const

+ +

The first form sets the default text color. The second returns +the current default text color. + +

void textfont(uchar f)
+uchar textfont() const

+ +

The first form sets the default text font. The second returns +the current default text font. + +

void textsize(uchar s)
+uchar textsize() const

+ +

The first form sets the default text size. The second returns +the current default text size. + +

const char *title()

+ +

This method returns the current document title, or NULL if there +is no title. + +

void topline(const char *n)
+void topline(int)
+int topline() const

+ +

The first two forms scroll the text to the indicated position, either +with a named destination or by pixel line. + +

The second form returns the current top line in pixels. + +

void value(const char *v)
+const char *value() const

+ +

The first form sets the current buffer to the string provided and +reformats the text. The second form returns the current buffer contents. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Hold_Browser.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Hold_Browser.html new file mode 100644 index 0000000..cf54916 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Hold_Browser.html @@ -0,0 +1,59 @@ + + + Fl_Hold_Browser + + + +

class Fl_Hold_Browser

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Hold_Browser.H>
    +
    +
+

Description

+ The Fl_Hold_Browser class is a subclass of Fl_Browser + which lets the user select a single item, or no items by clicking on +the empty space. As long as the mouse button is held down the item +pointed to by it is highlighted, and this highlighting remains on when +the mouse button is released. Normally the callback is done when the +user releases the mouse, but you can change this with when(). +

See Fl_Browser for +methods to add and remove lines from the browser.

+

Methods

+ +

+Fl_Hold_Browser::Fl_Hold_Browser(int x, int y, int w, int h, const char +*label = 0)

+ Creates a new Fl_Hold_Browser widget using the given +position, size, and label string. The default boxtype is FL_DOWN_BOX +. +

virtual +Fl_Hold_Browser::~Fl_Hold_Browser()

+ The destructor also deletes all the items in the list. +

int Fl_Browser::deselect()

+

Deselects any selected item. +

int Fl_Browser::select(int,int=1) +
int Fl_Browser::selected(int) const

+ You can use these for compatibility with +Fl_Multi_Browser. If you turn on the selection of more +than one line the results are unpredictable. +

int Fl_Browser::value() const +
void Fl_Browser::value(int)

+ Set or get which line is selected. This returns zero if no line is +selected, so be aware that this can happen in a callback. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Image.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Image.html new file mode 100644 index 0000000..95706c7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Image.html @@ -0,0 +1,212 @@ + + + Fl_Image + + + + + +

class Fl_Image

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Image.H>
    +
+ +

Description

+ +

Fl_Image is the base class used for caching and +drawing all kinds of images in FLTK. This class keeps track of +common image data such as the pixels, colormap, width, height, +and depth. Virtual methods are used to provide type-specific +image handling.

+ +

Since the Fl_Image class does not support image +drawing by itself, calling the draw() method results in +a box with an X in it being drawn instead.

+ +

Methods

+ + + +

Fl_Image(int W, int H, int D);

+ +

The constructor creates an empty image with the specified +width, height, and depth. The width and height are in pixels. +The depth is 0 for bitmaps, 1 for pixmap (colormap) images, and +1 to 4 for color images.

+ +

virtual ~Fl_Image();

+ +

The destructor is a virtual method that frees all memory used +by the image.

+ +

virtual void color_average(Fl_Color c, float i);

+ +

The color_average() method averages the colors in +the image with the FLTK color value c. The i +argument specifies the amount of the original image to combine +with the color, so a value of 1.0 results in no color blend, and +a value of 0.0 results in a constant image of the specified +color. The original image data is not altered by this +method.

+ +

virtual Fl_Image *copy(int W, int H);
+copy();

+ +

The copy() method creates a copy of the specified +image. If the width and height are provided, the image is +resized to the specified size. The image should be deleted (or in +the case of Fl_Shared_Image, released) when you are done +with it.

+ +

int count();

+ +

The count() method returns the number of data values +associated with the image. The value will be 0 for images with +no associated data, 1 for bitmap and color images, and greater +than 2 for pixmap images.

+ +

int d();
+protected void d(int D);

+ +

The first form of the d() method returns the current +image depth. The return value will be 0 for bitmaps, 1 for +pixmaps, and 1 to 4 for color images.

+ +

The second form is a protected method that sets the current +image depth.

+ +

const char * const *data();
+protected void data(const char * const *data, int count);

+ +

The first form of the data() method returns a +pointer to the current image data array. Use the +count() method to find the size of the data array.

+ +

The second form is a protected method that sets the current +array pointer and count of pointers in the array.

+ +

virtual void desaturate()

+ +

The desaturate() method converts an image to +grayscale. If the image contains an alpha channel (depth = 4), +the alpha channel is preserved. This method does not alter +the original image data.

+ +

void draw(int X, int Y);
+virtual void draw(int X, int Y, int W, int H, int cx, int cy);

+ +

The draw() methods draw the image. The first form +specifies the upper-lefthand corner of the image. The second +form specifies a bounding box for the image, with the origin +(upper-lefthand corner) of the image offset by the cx +and cy arguments.

+ +

protected void draw_empty(int X, int Y);

+ +

The protected method draw_empty() draws a box with +an X in it. It can be used to draw any image that lacks image +data.

+ +

int h();
+protected void h(int H);

+ +

The first form of the h() method returns the current +image height in pixels.

+ +

The second form is a protected method that sets the current +image height.

+ +

void inactive();

+ +

The inactive() method calls +color_average(FL_BACKGROUND_COLOR, 0.33f) to produce +an image that appears grayed out. This method does not +alter the original image data.

+ +

virtual void label(Fl_Widget *w); +virtual void label(Fl_Menu_Item *m);

+ +

The label() methods are an obsolete way to set the +image attribute of a widget or menu item. Use the +image() or deimage() methods of the +Fl_Widget and Fl_Menu_Item classes +instead.

+ +

int ld();
+protected void ld(int LD);

+ +

The first form of the ld() method returns the current +line data size in bytes. Line data is extra data that is included +after each line of color image data and is normally not present.

+ +

The second form is a protected method that sets the current +line data size in bytes.

+ +

void uncache();

+ +

If the image has been cached for display, delete the cache +data. This allows you to change the data used for the image and +then redraw it without recreating an image object. + +

int w();
+protected void w(int W);

+ +

The first form of the w() method returns the current +image width in pixels.

+ +

The second form is a protected method that sets the current +image width.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Input.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Input.html new file mode 100644 index 0000000..3d03e86 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Input.html @@ -0,0 +1,383 @@ + + + Fl_Input + + + + + +

class Fl_Input

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Input.H>
    +
+ +

Description

+ +

This is the FLTK text input widget. It displays a single line +of text and lets the user edit it. Normally it is drawn with an +inset box and a white background. The text may contain any +characters (even 0), and will correctly display anything, using +^X notation for unprintable control characters and \nnn notation +for unprintable characters with the high bit set. It assumes the +font can draw any characters in the ISO-8859-1 character set.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Mouse button 1Moves the cursor to + this point. Drag selects characters. Double click selects words. + Triple click selects all text. Shift+click extends the selection. + When you select text it is automatically copied to the clipboard. +
Mouse button 2Insert the clipboard at +the point clicked. You can also select a region and replace it with the +clipboard by selecting the region with mouse button 2. +
Mouse button 3Currently acts like button 1.
BackspaceDeletes one character to the left, or +deletes the selected region.
EnterMay cause the callback, see when().
^A or HomeGo to start of line.
^B or LeftMove left
^CCopy the selection to the clipboard
^D or DeleteDeletes one character to the right +or deletes the selected region.
^E or EndGo to the end of line.
^F or RightMove right
^KDelete to the end of line (next \n character) +or deletes a single \n character. These deletions are all concatenated +into the clipboard.
^N or DownMove down (for Fl_Multiline_Input +only, otherwise it moves to the next input field).
^P or UpMove up (for Fl_Multiline_Input only, +otherwise it moves to the previous input field).
^UDelete everything.
^V or ^YPaste the clipboard
^X or ^WCopy the region to the clipboard and +delete it.
^Z or ^_Undo. This is a single-level undo +mechanism, but all adjacent deletions and insertions are concatenated +into a single "undo". Often this will undo a lot more than you +expected.
Shift+moveMove the cursor but also extend the +selection.
RightCtrl or +
Compose
Start +a compose-character +sequence. The next one or two keys typed define the character to +insert (see table that follows.) + +

For instance, to type "á" type [compose][a]['] or [compose]['][a]. + +

The character "nbsp" (non-breaking space) is typed by using +[compose][space]. + +

The single-character sequences may be followed by a space if +necessary to remove ambiguity. For instance, if you really want to +type "ª~" rather than "ã" you must type [compose][a][space][~]. + +

The same key may be used to "quote" control characters into the +text. If you need a ^Q character you can get one by typing +[compose][Control+Q]. + +

X may have a key on the keyboard +defined as XK_Multi_key. If so this key may be used as well +as the right-hand control key. You can set this up with the program +xmodmap. + +

If your keyboard is set to support a foreign language you should +also be able to type "dead key" prefix characters. On X you will +actually be able to see what dead key you typed, and if you then move +the cursor without completing the sequence the accent will remain +inserted.

+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Character Composition Table
KeysCharKeysCharKeysCharKeysCharKeysCharKeysChar
spnbsp*°` AÀD -Ð` aàd -ð
!¡+ -±' AÁ~ NÑ' aá~ nñ
%¢2²A ^Â` OÒ^ aâ` oò
#£3³~ AÃ' OÓ~ aã' oó
$¤'´: AÄ^ OÔ: aä^ oô
y =¥uµ* AÅ~ OÕ* aå~ oõ
|¦pA EÆ: OÖa eæ: oö
&§.·, CÇx×, cç- :÷
:¨,¸E `ÈO /Ø` eèo /ø
c©1¹' EÉ` UÙ' eé` uù
aªoº^ EÊ' UÚ^ eê' uú
< <«> >»: EË^ UÛ: eë^ uû
~¬1 4¼` IÌ: UÜ` iì: uü
-­1 2½' IÍ' YÝ' ií' yý
r®3 4¾^ IÎT HÞ^ iît hþ
_¯?¿: IÏs sß: iï: yÿ
+

Methods

+
+ + +
+ + + + + + + + + +
+
+ +

Fl_Input::Fl_Input(int x, int y, int w, +int h, const char *label = 0)

+ +

Creates a new Fl_Input widget using the given position, size, +and label string. The default boxtype is FL_DOWN_BOX. + +

virtual Fl_Input::~Fl_Input()

+ +

Destroys the widget and any value associated with it. + +

const char *Fl_Input::value() const +
int Fl_Input::value(const char*) +
int Fl_Input::value(const char*, int)

+ +

The first form returns the current value, which is a pointer +to the internal buffer and is valid only until the next event is +handled. + +

The second two forms change the text and set the mark and the +point to the end of it. The string is copied to the internal +buffer. Passing NULL is the same as "". +This returns non-zero if the new value is different than the +current one. You can use the second version to directly set the +length if you know it already or want to put nul's in the +text.

+ +

int Fl_Input::static_value(const +char*) +
int Fl_Input::static_value(const char*, int)

+ +

Change the text and set the mark and the point to the end of +it. The string is not copied. If the user edits the +string it is copied to the internal buffer then. This can save a +great deal of time and memory if your program is rapidly +changing the values of text fields, but this will only work if +the passed string remains unchanged until either the +Fl_Input is destroyed or value() is called +again. + +

int Fl_Input::size() const

+ +

Returns the number of characters in value(). This +may be greater than strlen(value()) if there are nul +characters in it. + +

char Fl_Input::index(int) const

+ +

Same as value()[n], but may be faster in plausible +implementations. No bounds checking is done. + +

Fl_When Fl_Widget::when() const +
void Fl_Widget::when(Fl_When)

+ +

Controls when callbacks are done. The following values are useful, +the default value is FL_WHEN_RELEASE: + +

    + +
  • 0: The callback is not done, but + changed() is turned on.
  • + +
  • FL_WHEN_CHANGED: The callback is done each + time the text is changed by the user.
  • + +
  • FL_WHEN_RELEASE: The callback will be done + when this widget loses the focus, including when the + window is unmapped. This is a useful value for text + fields in a panel where doing the callback on every + change is wasteful. However the callback will also + happen if the mouse is moved out of the window, which + means it should not do anything visible (like pop up an + error message). You might do better setting this to + zero, and scanning all the items for changed() + when the OK button on a panel is pressed.
  • + +
  • FL_WHEN_ENTER_KEY: If the user types the + Enter key, the entire text is selected, and the callback + is done if the text has changed. Normally the Enter key + will navigate to the next field (or insert a newline for + a Fl_Mulitline_Input), this changes the + behavior.
  • + +
  • FL_WHEN_ENTER_KEY|FL_WHEN_NOT_CHANGED: The + Enter key will do the callback even if the text has not + changed. Useful for command fields.
  • + +
+ +

Fl_Color Fl_Input::textcolor() const +
void Fl_Input::textcolor(Fl_Color)

+ +

Gets or sets the color of the text in the input field. + +

Fl_Font Fl_Input::textfont() const +
void Fl_Input::textfont(Fl_Font)

+ +

Gets or sets the font of the text in the input field. + +

uchar Fl_Input::textsize() const +
void Fl_Input::textsize(uchar)

+ +

Gets or sets the size of the text in the input field. + +

Fl_Color Fl_Input::cursor_color() +const +
void Fl_Input::cursor_color(Fl_Color)

+ +

Get or set the color of the cursor. This is black by default. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Input_.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Input_.html new file mode 100644 index 0000000..8434f08 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Input_.html @@ -0,0 +1,265 @@ + + + Fl_Input_ + + + + + +

class Fl_Input_

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Input_.H>
    +
+ +

Description

+ +

This is a virtual base class below Fl_Input. It has all +the same interfaces, but lacks the handle() and +draw() method. You may want to subclass it if you are +one of those people who likes to change how the editing keys +work. + +

This can act like any of the subclasses of Fl_Input, by +setting type() to one of the following values:

+ +
    +#define FL_NORMAL_INPUT		0
    +#define FL_FLOAT_INPUT		1
    +#define FL_INT_INPUT		2
    +#define FL_MULTILINE_INPUT	4
    +#define FL_SECRET_INPUT		5
    +#define FL_INPUT_TYPE		7
    +#define FL_INPUT_READONLY	8
    +#define FL_NORMAL_OUTPUT	(FL_NORMAL_INPUT | FL_INPUT_READONLY)
    +#define FL_MULTILINE_OUTPUT	(FL_MULTILINE_INPUT | FL_INPUT_READONLY)
    +#define FL_INPUT_WRAP		16
    +#define FL_MULTILINE_INPUT_WRAP	(FL_MULTILINE_INPUT | FL_INPUT_WRAP)
    +#define FL_MULTILINE_OUTPUT_WRAP (FL_MULTILINE_INPUT | FL_INPUT_READONLY | FL_INPUT_WRAP)
    +
+ +

Methods

+ +
+ + +
+ + + + + + + + + +
+
+ +

Fl_Input_::Fl_Input_(int x, int y, int +w, int h, const char *label = 0)

+ +

Creates a new Fl_Input_ widget using the given +position, size, and label string. The default boxtype is +FL_DOWN_BOX. + +

virtual Fl_Input_::~Fl_Input_()

+ +

The destructor removes the widget and any value associated with it. + +

int Fl_Input_::wordboundary(int i) +const

+ +

Returns true if position i is at the start or end of a word. + +

int Fl_Input_::lineboundary(int i) +const

+ +

Returns true if position i is at the start or end of a line. + +

void Fl_Input_::drawtext(int,int,int,int)

+ +

Draw the text in the passed bounding box. If damage() +& FL_DAMAGE_ALL is true, this assumes the area has +already been erased to color(). Otherwise it does +minimal update and erases the area itself. + +

int Fl_Input_::handletext(int +e,int,int,int,int)

+ +

Default handler for all event types. Your handle() +method should call this for all events that it does not handle +completely. You must pass it the same bounding box as you do +when calling drawtext() from your draw() +method. Handles FL_PUSH, FL_DRAG, +FL_RELEASE to select text, handles FL_FOCUS +and FL_UNFOCUS to show and hide the cursor. + +

int +Fl_Input_::up_down_position(int i, int keepmark=0)

+ +

Do the correct thing for arrow keys. Sets the position (and +mark if keepmark is zero) to somewhere in the same line +as i, such that pressing the arrows repeatedly will cause +the point to move up and down. + +

void +Fl_Input_::maybe_do_callback()

+ +

Does the callback if changed() is true or if +when() & FL_WHEN_NOT_CHANGED is non-zero. You +should call this at any point you think you should generate a +callback. + +

void Fl_Input_::maximum_size(int m)
+int Fl_Input_::maximum_size() const

+ +

Sets or returns the maximum length of the input field. + +

int Fl_Input_::position() const +
int Fl_Input_::position(int new_position, int new_mark) +
int Fl_Input_::position(int new_position_and_new_mark)

+ +

The input widget maintains two pointers into the string. The +"position" is where the cursor is. The +"mark" is the other end of the selected text. If they +are equal then there is no selection. Changing this does not +affect the clipboard (use copy() to do that). + +

Changing these values causes a redraw(). The new +values are bounds checked. The return value is non-zero if the +new position is different than the old one. position(n) +is the same as position(n,n). mark(n) is the +same as position(position(),n).

+ +

int Fl_Input_::mark() const +
int Fl_Input_::mark(int new_mark)

+ +

Gets or sets the current selection mark. mark(n) is +the same as position(position(),n). + +

int Fl_Input_::replace(int a, int b, +const char *insert, int length=0)

+ +

This call does all editing of the text. It deletes the region +between a and b (either one may be less or +equal to the other), and then inserts the string insert +at that point and leaves the mark() and +position() after the insertion. Does the callback if +when() & FL_WHEN_CHANGED and there is a change. + +

Set start and end equal to not delete +anything. Set insert to NULL to not insert +anything.

+ +

length must be zero or strlen(insert), this +saves a tiny bit of time if you happen to already know the +length of the insertion, or can be used to insert a portion of a +string or a string containing nul's.

+ +

a and b are clamped to the +0..size() range, so it is safe to pass any values.

+ +

cut() and insert() are just inline +functions that call replace().

+ +

int Fl_Input_::cut() +
int Fl_Input_::cut(int n) +
int Fl_Input_::cut(int a, int b);

+ +

Fl_Input_::cut() deletes the current selection. +cut(n) deletes n characters after the +position(). cut(-n) deletes n +characters before the position(). cut(a,b) +deletes the characters between offsets a and +b. A, b, and n are all +clamped to the size of the string. The mark and point are left +where the deleted text was. + +

If you want the data to go into the clipboard, do +Fl_Input_::copy() before calling +Fl_Input_::cut(), or do Fl_Input_::copy_cuts() +afterwards.

+ +

int Fl_Input_::insert(const char *t,int +l=0)

+ +

Insert the string t at the current position, and +leave the mark and position after it. If l is not zero +then it is assumed to be strlen(t). + +

int Fl_Input_::copy(int clipboard)

+ +

Put the current selection between mark() and +position() into the specified clipboard. Does not +replace the old clipboard contents if position() and +mark() are equal. Clipboard 0 maps to the current text +selection and clipboard 1 maps to the cut/paste clipboard. + +

int Fl_Input_::undo()

+ +

Does undo of several previous calls to replace(). +Returns non-zero if any change was made. + +

int Fl_Input_::copy_cuts()

+ +

Copy all the previous contiguous cuts from the undo +information to the clipboard. This is used to make ^K work. + +

int Fl_Input_::input_type() const +
void Fl_Input_::input_type(int)

+ +

Gets or sets the input field type. + +

int Fl_Input_::readonly() const +
void Fl_Input_::readonly(int)

+ +

Gets or sets the read-only state of the input field. + +

int Fl_Input_::wrap() const +
void Fl_Input_::wrap(int)

+ +

Gets or sets the word wrapping state of the input field. Word +wrap is only functional with multi-line input fields. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Input_Choice.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Input_Choice.html new file mode 100644 index 0000000..6003646 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Input_Choice.html @@ -0,0 +1,100 @@ + + + Fl_Input_Choice + + + + + +

class Fl_Input_Choice

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Input_Choice.H>
    +
+ +

+
+Plastic and normal Fl::scheme()s. +

+ +

Description

+

A combination of the input widget and a menu button. +The user can either type into the input area, or use the +menu button chooser on the right, which loads the input area +with predefined text. Normally it is drawn with an inset box +and a white background. +

+The application can directly access both the input and menu +widgets directly, using the menubutton() +and input() accessor methods. + +

Methods

+
+
+
+
+ +

Fl_Input_Choice::Fl_Input_Choice(int x, int y, int w, +int h, const char *label = 0)

+ +

Creates a new Fl_Input_Choice widget using the given position, size, +and label string. + +

virtual Fl_Input_Choice::~Fl_Input_Choice()

+ +

Destroys the widget and any value associated with it. + +

void Fl_Input_Choice::add(const char *s)

+ +

Adds an item to the menu.

+ +

void Fl_Input_Choice::clear()

+ +

Removes all items from the menu.

+ +

Fl_Input *Fl_Input_Choice::input()

+ +

Returns a reference to the internal Fl_Input widget.

+ +

void Fl_Input_Choice::menu(const Fl_Menu_Item *m)
+const Fl_Menu_Item *menu()

+ +

Gets or sets the Fl_Menu_Item array used for the menu.

+ +

Fl_Menu_Button *Fl_Input_Choice::menubutton()

+ +

Returns a reference to the internal Fl_Menu_Button widget. + +

void Fl_Input_Choice::value(const char *s)
+void Fl_Input_Choice::value(int v)
+const char *Fl_Input_Choice::value() const

+ +

Sets or returns the input widget's current contents. The +second form sets the contents using the index into the menu +which you can set as an integer. Setting the value effectively +'chooses' this menu item, and sets it as the new input text, +deleting the previous text.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Int_Input.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Int_Input.html new file mode 100644 index 0000000..f0dfcfe --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Int_Input.html @@ -0,0 +1,38 @@ + + + Fl_Int_Input + + + +

class Fl_Int_Input

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Int_Input.H>
    +
    +
+

Description

+ The Fl_Int_Input class is a subclass of Fl_Input + that only allows the user to type decimal digits (or hex numbers of + the form 0xaef). +

Methods

+ +

Fl_Int_Input::Fl_Int_Input(int x, +int y, int w, int h, const char *label = 0)

+ Creates a new Fl_Int_Input widget using the given position, +size, and label string. The default boxtype is FL_DOWN_BOX. +

virtual +Fl_Int_Input::~Fl_Int_Input()

+ Destroys the widget and any value associated with it. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_JPEG_Image.html b/third_party/windows/fltk-1.1.10/documentation/Fl_JPEG_Image.html new file mode 100644 index 0000000..a5cfd05 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_JPEG_Image.html @@ -0,0 +1,59 @@ + + + Fl_JPEG_Image + + + + + +

class Fl_JPEG_Image

+
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_JPEG_Image.H>
    +
+ +

Additional Libraries

+ +
    +-lfltk_images  /  fltkimages.lib
    +
+ +

Description

+ +

The Fl_JPEG_Image class supports loading, caching, +and drawing of Joint Photographic Experts Group (JPEG) File +Interchange Format (JFIF) images. The class supports grayscale +and color (RGB) JPEG image files.

+ +

Methods

+ + + +

Fl_JPEG_Image::Fl_JPEG_Image(const char *filename);

+ +

The constructor loads the named JPEG image.

+ +

Fl_JPEG_Image::~Fl_JPEG_Image();

+ +

The destructor free all memory and server resources that are used by +the image.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Light_Button.gif b/third_party/windows/fltk-1.1.10/documentation/Fl_Light_Button.gif new file mode 100644 index 0000000..0d38093 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/Fl_Light_Button.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Light_Button.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Light_Button.html new file mode 100644 index 0000000..e819dbf --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Light_Button.html @@ -0,0 +1,45 @@ + + + Fl_Light_Button + + + +

class Fl_Light_Button

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Light_Button.H>
    +
    +
+

Description

+Buttons generate callbacks when they are clicked by the user. You +control exactly when and how by changing the values for type() +and when(). +

Fl_Light_Button widget.

+

The Fl_Light_Button subclass display the "on" state by +turning on a light, rather than drawing pushed in. The shape of the +"light" is initially set to FL_DOWN_BOX. The color of the light when +on is controlled with selection_color(), which defaults to +FL_YELLOW.

+

Methods

+ +

+Fl_Light_Button::Fl_Light_Button(int x, int y, int w, int h, const char +*label = 0)

+ Creates a new Fl_Light_Button widget using the given +position, size, and label string. +

+Fl_Light_Button::~Fl_Light_Button()

+ The destructor deletes the check button. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_.html new file mode 100644 index 0000000..ec807a9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_.html @@ -0,0 +1,316 @@ + + + Fl_Menu_ + + + +

class Fl_Menu_

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Menu_.H>
    +
    +
+

Description

+All widgets that have a menu in FLTK are subclassed off of this class. +Currently FLTK provides you with +Fl_Menu_Button, +Fl_Menu_Bar, and Fl_Choice +. + +

The class contains a pointer to an array of structures of type Fl_Menu_Item. The +array may either be supplied directly by the user program, or it may +be "private": a dynamically allocated array managed by the Fl_Menu_. + +

Methods

+
+ + +
+ + + + + + + + + +
+
+ +

Fl_Menu_::Fl_Menu_(int x, int y, int w, +int h, const char *label = 0)

+ +Creates a new Fl_Menu_ widget using the given position, size, +and label string. menu() is initialized to null. + + +

virtual Fl_Menu_::~Fl_Menu_()

+ +If the menu array is private the memory it uses is freed. + + +

int Fl_Menu_::add(const char* label, const +char* shortcut, Fl_Callback*, void *user_data=0, int flags=0)
+int Fl_Menu_::add(const char* label, int shortcut, Fl_Callback*, +void *user_data=0, int flags=0)

+ +

Adds a new menu item, with a title string, +shortcut string, callback, argument to the +callback, and flags. If the menu array was directly set with +menu(x) then copy() is done to make a private +array. + +

The characters "&", "/", "\", and "_" are treated as +special characters in the label string. The "&" character +specifies that the following character is an accelerator and +will be underlined. The "\" character is used to escape the next +character in the string. Labels starting with the "_" character +cause a divider to be placed after that menu item.

+ +

A label of the form "foo/bar/baz" will create a +submenus called "foo" and "bar" with an +entry called "baz". The "/" character is ignored if it +appears as the first character of the label string, e.g. +"/foo/bar/baz".

+ +

The label string is copied to new memory and can be freed. +The other arguments (including the shortcut) are copied into the +menu item unchanged.

+ +

If an item exists already with that name then it is replaced with +this new one. Otherwise this new one is added to the end of the +correct menu or submenu. The return value is the offset into the array +that the new entry was placed at.

+ +

Shortcut can be 0L, or either a modifier/key combination (for example +FL_CTRL+'A') or a string describing the shortcut in one of two ways:

+ +
+  [#+^]<ascii_value>    eg. "97", "^97", "+97", "#97"
+  [#+^]<ascii_char>     eg. "a", "^a", "+a", "#a"
+
+..where <ascii_value> is a decimal value representing an +ascii character (eg. 97 is the ascii for 'a'), and the optional +prefixes enhance the value that follows. Multiple prefixes must +appear in the above order. +
+  # - Alt
+  + - Shift
+  ^ - Control
+
+Text shortcuts are converted to integer shortcut by calling +int fl_old_shortcut(const char*). + +

The return value is the index into the array that the entry was put.

+ +

No items must be added to a menu during a callback to the same menu.

+ + +

int Fl_Menu_::add(const char *)

+ +

The passed string is split at any '|' characters and then +add(s,0,0,0,0) is done with each section. This is +often useful if you are just using the value, and is compatible +with Forms and other GL programs. The section strings use the +same special characters as described for the long version of add()

+ +

No items must be added to a menu during a callback to the same menu.

+ + +

void Fl_Menu_::clear()

+Same as menu(NULL), set the array pointer to null, indicating +a zero-length menu. + +

Menus must no be cleared during a callback to the same menu.

+ + +

void Fl_Menu_::copy(const +Fl_Menu_Item*, void* user_data = 0)

+ +

The menu is set to a private copy of the passed Fl_Menu_Item +array. This is useful if you want to modify the flags of the +menu items. If the user_data argument is non-NULL, then +the user_data members of the menu items are set to the +given value. + + +

Fl_Boxtype Fl_Menu_::down_box() const +
void Fl_Menu_::down_box(Fl_Boxtype)

+ This box type is used to surround the currently-selected items in the +menus. If this is FL_NO_BOX then it acts like +FL_THIN_UP_BOX and selection_color() acts like +FL_WHITE, for back compatability. + + +

const Fl_Menu_Item *Fl_Menu_::find_item(const char *name);

+ +

Returns a pointer to the menu item with the given (full) +pathname. If no matching menu item can be found, a NULL pointer +is returned. This function does not search submenus that are linked +via FL_SUBMENU_POINTER.

+ + +

int Fl_Menu_::item_pathname(char *name, int namelen ) const;
+int Fl_Menu_::item_pathname(char *name, int namelen, const Fl_Menu_Item *finditem) const;

+ +

Returns the 'menu pathname' (eg. "File/Quit") for the recently picked item in user supplied string 'name'. Useful in the callback function for a menu item, to determine the last picked item's 'menu pathname' string. + +

If finditem is specified, name will contain the 'menu pathname' for that item. + +

Returns: + +

    +
  • 0 - OK: 'name' has the pathname, guaranteed not longer than namelen +
  • -1 - Failed: 'finditem' was not found in the menu +
  • -2 - Failed: 'name' is not large enough to handle the menu names +
+ +

In the case of errors (-1 or -2), 'name' will be an empty string. + + +

const Fl_Menu_Item* Fl_Menu_::menu() +const

+ +Returns a pointer to the array of Fl_Menu_Items. This will either be +the value passed to menu(value) or the private copy. + +

void Fl_Menu_::menu(const Fl_Menu_Item*)

+Set the menu array pointer directly. If the old menu is private it is +deleted. NULL is allowed and acts the same as a zero-length +menu. If you try to modify the array (with add(), replace(), or +delete()) a private copy is automatically done. + + +

void Fl_Menu_::mode(int i, int x);

+ +Changes the flags of item i. For a list of the flags, see Fl_Menu_Item. + + +

const Fl_Menu_Item* Fl_Menu_::mvalue() +const

+ +

Returns a pointer to the last menu item that was picked. + + +

void Fl_Menu_::remove(int n)

+ +Deletes item n from the menu. If the menu array was directly +set with menu(x) then copy() is done to make a private array. + +

No items must be removed from a menu during a callback to the same menu.

+ + +

void Fl_Menu_::replace(int n, const char *) +

+ +Changes the text of item n. This is the only way to get +slash into an add()'ed menu item. If the menu array was directly set +with menu(x) then copy() is done to make a private array. + + +

void Fl_Menu_::shortcut(int i, int n);

+ +Changes the shortcut of item i to n. + + +

int Fl_Menu_::size() const

+ +This returns the number of Fl_Menu_Item structures that make up the +menu, correctly counting submenus. This includes the "terminator" +item at the end. To copy a menu array you need to copy +size()*sizeof(Fl_Menu_Item) bytes. If the menu is +NULL this returns zero (an empty menu will return 1). + + +

const Fl_Menu_Item* +Fl_Menu_::test_shortcut()

+ Only call this in response to FL_SHORTCUT events. If the +event matches an entry in the menu that entry is selected and the +callback will be done (or changed() will be set). This allows +shortcuts directed at one window to call menus in another. +

void Fl_Menu_::global()

+ Make the shortcuts for this menu work no matter what window has the +focus when you type it. This is done by using +Fl::add_handler(). This Fl_Menu_ widget does not +have to be visible (ie the window it is in can be hidden, or it does +not have to be put in a window at all). +

Currently there can be only one global()menu. Setting a new +one will replace the old one. There is no way to remove the +global() setting (so don't destroy the widget!)

+ + +

const char* Fl_Menu_::text() const +
const char* Fl_Menu_::text(int i) const

+ Returns the title of the last item chosen, or of item i. + + +

Fl_Color Fl_Menu_::textcolor() const +
void Fl_Menu_::textcolor(Fl_Color)

+ Get or set the current color of menu item labels. + + +

Fl_Font Fl_Menu_::textfont() const +
void Fl_Menu_::textfont(Fl_Font)

+ Get or set the current font of menu item labels. + + +

uchar Fl_Menu_::textsize() const +
void Fl_Menu_::textsize(uchar)

+ Get or set the font size of menu item labels. + + +

int Fl_Menu_::value() const +
int Fl_Menu_::value(int) +
const Fl_Menu_Item* mvalue() const +
int Fl_Menu_::value(const Fl_Menu_Item*)

+ The value is the index into menu() of the last item chosen by +the user. It is zero initially. You can set it as an integer, or set +it with a pointer to a menu item. The set routines return non-zero if +the new value is different than the old one. + + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Bar.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Bar.html new file mode 100644 index 0000000..8e2c8ae --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Bar.html @@ -0,0 +1,67 @@ + + + Fl_Menu_Bar + + + +

class Fl_Menu_Bar

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Menu_Bar.H>
    +
    +
+

Description

+ This widget provides a standard menubar interface. Usually you will +put this widget along the top edge of your window. The height of the +widget should be 30 for the menu titles to draw correctly with the +default font. +

The items on the bar and the menus they bring up are defined by a +single Fl_Menu_Item + array. Because a Fl_Menu_Item array defines a hierarchy, the +top level menu defines the items in the menubar, while the submenus +define the pull-down menus. Sub-sub menus and lower pop up to the right +of the submenus.

+

Fl_Menu_Bar widget.

+

If there is an item in the top menu that is not a title of a +submenu, then it acts like a "button" in the menubar. Clicking on it +will pick it.

+

When the user picks an item off the menu, the item's callback is +done with the menubar as the Fl_Widget* argument. If the item +does not have a callback the menubar's callback is done instead.

+

Submenus will also pop up in response to shortcuts indicated by +putting a '&' character in the name field of the menu item. If you put a +'&' character in a top-level "button" then the shortcut picks it. The +'&' character in submenus is ignored until the menu is popped up.

+

Typing the shortcut() of any of the menu items will cause +callbacks exactly the same as when you pick the item with the mouse.

+

Methods

+ +

Fl_Menu_Bar::Fl_Menu_Bar(int x, int +y, int w, int h, const char *label = 0)

+ Creates a new Fl_Menu_Bar widget using the given position, +size, and label string. The default boxtype is FL_UP_BOX. +

The constructor sets menu() to NULL. See +Fl_Menu_ for the methods to set or change the menu.

+

labelsize(), labelfont(), and labelcolor() + are used to control how the menubar items are drawn. They are +initialized from the Fl_Menu static variables, but you can +change them if desired.

+

label() is ignored unless you change align() to +put it outside the menubar.

+

virtual Fl_Menu_Bar::~Fl_Menu_Bar() +

+ The destructor removes the Fl_Menu_Bar widget and all of its +menu items. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Button.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Button.html new file mode 100644 index 0000000..eb585c7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Button.html @@ -0,0 +1,83 @@ + + + Fl_Menu_Button + + + +

class Fl_Menu_Button

+
+

Class Hierarchy

+
    +
    +Fl_Menu_
    +   |
    +   +----Fl_Menu_Button
    +
    +
+

Include Files

+
    +
    +#include <FL/Fl_Menu_Button.H>
    +
    +
+

Description

+ This is a button that when pushed pops up a menu (or hierarchy of +menus) defined by an array of +Fl_Menu_Item objects. +

Fl_Menu_Button widget.

+

Normally any mouse button will pop up a menu and it is lined up +below the button as shown in the picture. However an Fl_Menu_Button + may also control a pop-up menu. This is done by setting the type() +, see below.

+

The menu will also pop up in response to shortcuts indicated by +putting a '&' character in the label().

+

Typing the shortcut() of any of the menu items will cause +callbacks exactly the same as when you pick the item with the mouse. + The '&' character in menu item names are only looked at when the menu is +popped up, however.

+

When the user picks an item off the menu, the item's callback is +done with the menu_button as the Fl_Widget* argument. If the +item does not have a callback the menu_button's callback is done +instead.

+

Methods

+ +

+Fl_Menu_Button::Fl_Menu_Button(int x, int y, int w, int h, const char +*label = 0)

+ Creates a new Fl_Menu_Button widget using the given position, +size, and label string. The default boxtype is FL_UP_BOX. +

The constructor sets menu() to NULL. See +Fl_Menu_ for the methods to set or change the menu.

+

virtual +Fl_Menu_Button::~Fl_Menu_Button()

+ The destructor removes the Fl_Menu_Button widget and all of +its menu items. +

const Fl_Menu* Fl_Menu_Button::popup() +

+ Act exactly as though the user clicked the button or typed the +shortcut key. The menu appears, it waits for the user to pick an item, +and if they pick one it sets value() and does the callback or +sets changed() as described above. The menu item is returned +or NULL if the user dismisses the menu. +

void Fl_Menu_Button::type(uchar)

+ If type() is zero a normal menu button is produced. If it is +nonzero then this is a pop-up menu. The bits in type() + indicate what mouse buttons pop up the menu. For convienece the +constants Fl_Menu_Button::POPUP1, POPUP2, POPUP3, POPUP12, POPUP13, +POPUP23, and POPUP123 are defined. +Fl_Menu_Button::POPUP3 is usually what you want. +

A popup menu button is invisible and does not interfere with any +events other than the mouse button specified (and any shortcuts). The +widget can be stretched to cover all your other widgets by putting it +last in the hierarchy so it is "on top". You can also make several +widgets covering different areas for context-sensitive popup menus.

+

The popup menus appear with the cursor pointing at the previously +selected item. This is a feature. If you don't like it, do +value(0) after the menu items are picked to forget the current +item.

+ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Item.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Item.html new file mode 100644 index 0000000..4e2ea25 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Item.html @@ -0,0 +1,300 @@ + + + Fl_Menu_Item + + + +

struct Fl_Menu_Item

+
+

Class Hierarchy

+
    +
    +struct Fl_Menu_Item
    +
    +
+

Include Files

+
    +
    +#include <FL/Fl_Menu_Item.H>
    +
    +
+

Description

+ +The Fl_Menu_Item structure defines a single menu item that +is used by the Fl_Menu_ class. This +structure is defined in <FL/Fl_Menu_Item.H> + +
    +
    +struct Fl_Menu_Item {
    +  const char*	text; // label()
    +  ulong		shortcut_;
    +  Fl_Callback*	callback_;
    +  void*		user_data_;
    +  int		flags;
    +  uchar		labeltype_;
    +  uchar		labelfont_;
    +  uchar		labelsize_;
    +  uchar		labelcolor_;
    +};
    +
    +enum { // values for flags:
    +  FL_MENU_INACTIVE	= 1,
    +  FL_MENU_TOGGLE	= 2,
    +  FL_MENU_VALUE		= 4,
    +  FL_MENU_RADIO		= 8,
    +  FL_MENU_INVISIBLE	= 0x10,
    +  FL_SUBMENU_POINTER	= 0x20,
    +  FL_SUBMENU		= 0x40,
    +  FL_MENU_DIVIDER	= 0x80,
    +  FL_MENU_HORIZONTAL	= 0x100
    +};
    +
    +
+Typically menu items are statically defined; for example: +
    +Fl_Menu_Item popup[] = {
    +  {"&alpha",   FL_ALT+'a', the_cb, (void*)1},
    +  {"&beta",    FL_ALT+'b', the_cb, (void*)2},
    +  {"gamma",    FL_ALT+'c', the_cb, (void*)3, FL_MENU_DIVIDER},
    +  {"&strange",  0,   strange_cb},
    +  {"&charm",    0,   charm_cb},
    +  {"&truth",    0,   truth_cb},
    +  {"b&eauty",   0,   beauty_cb},
    +  {"sub&menu",	0,   0, 0, FL_SUBMENU},
    +    {"one"},
    +    {"two"},
    +    {"three"},
    +  {0},
    +  {"inactive", FL_ALT+'i', 0, 0, FL_MENU_INACTIVE|FL_MENU_DIVIDER},
    +  {"invisible",FL_ALT+'i', 0, 0, FL_MENU_INVISIBLE},
    +  {"check",    FL_ALT+'i', 0, 0, FL_MENU_TOGGLE|FL_MENU_VALUE},
    +  {"box",      FL_ALT+'i', 0, 0, FL_MENU_TOGGLE},
    +{0}};
    +
+produces: +

Fl_Menu_Item widgets.

+ +A submenu title is identified by the bit FL_SUBMENU in the +flags field, and ends with a label() that is NULL. +You can nest menus to any depth. A pointer to the first item in the +submenu can be treated as an Fl_Menu array itself. It is also +possible to make separate submenu arrays with FL_SUBMENU_POINTER +flags. +

You should use the method functions to access structure members and +not access them directly to avoid compatibility problems with future +releases of FLTK.

+

Methods

+
+ + +
+ + + + + + + + + +
+
+

const char* Fl_Menu_Item::label() const +
void Fl_Menu_Item::label(const char*) +
void Fl_Menu_Item::label(Fl_Labeltype, const char*)

+ This is the title of the item. A NULL here indicates the end +of the menu (or of a submenu). A '&' in the item will print an +underscore under the next letter, and if the menu is popped up that +letter will be a "shortcut" to pick that item. To get a +real '&' put two +in a row. +

Fl_Labeltype +Fl_Menu_Item::labeltype() const +
void Fl_Menu_Item::labeltype(Fl_Labeltype)

+ A labeltype identifies a routine that draws the label of the +widget. This can be used for special effects such as emboss, or to use +the label() pointer as another form of data such as a bitmap. + The value FL_NORMAL_LABEL prints the label as text. +

Fl_Color Fl_Menu_Item::labelcolor() +const +
void Fl_Menu_Item::labelcolor(Fl_Color)

+ This color is passed to the labeltype routine, and is typically the +color of the label text. This defaults to FL_BLACK. If this +color is not black fltk will not use overlay bitplanes to draw +the menu - this is so that images put in the menu draw correctly. +

Fl_Font Fl_Menu_Item::labelfont() +const +
void Fl_Menu_Item::labelfont(Fl_Font)

+ Fonts are identified by small 8-bit indexes into a table. See the +enumeration list for predefined fonts. The default value is a +Helvetica font. The function +Fl::set_font() can define new fonts. +

uchar Fl_Menu_Item::labelsize() const +
void Fl_Menu_Item::labelsize(uchar)

+ Gets or sets the label font pixel size/height. +

typedef void +(Fl_Callback)(Fl_Widget*, void*) +
Fl_Callback* Fl_Menu_Item::callback() const +
void Fl_Menu_Item::callback(Fl_Callback*, void* = 0) +
void Fl_Menu_Item::callback(void (*)(Fl_Widget*))

+ Each item has space for a callback function and an argument for that +function. Due to back compatability, the Fl_Menu_Item itself +is not passed to the callback, instead you have to get it by calling +((Fl_Menu_*)w)->mvalue() where w is the widget argument. +

void* Fl_Menu_Item::user_data() const +
void Fl_Menu_Item::user_data(void*)

+ Get or set the user_data argument that is sent to the +callback function. +

void Fl_Menu_Item::callback(void +(*)(Fl_Widget*, long), long = 0) +
long Fl_Menu_Item::argument() const +
void Fl_Menu_Item::argument(long)

+ For convenience you can also define the callback as taking a long + argument. This is implemented by casting this to a Fl_Callback + and casting the long to a void* and may not be +portable to some machines. +

void +Fl_Menu_Item::do_callback(Fl_Widget*) +
void Fl_Menu_Item::do_callback(Fl_Widget*, void*) +
void Fl_Menu_Item::do_callback(Fl_Widget*, long)

+ Call the Fl_Menu_Item item's callback, and provide the +Fl_Widget argument (and optionally override the user_data() +argument). You must first check that callback() is non-zero +before calling this. +

ulong Fl_Menu_Item::shortcut() const +
void Fl_Menu_Item::shortcut(ulong)

+ Sets exactly what key combination will trigger the menu item. The +value is a logical 'or' of a key and a set of shift flags, for instance +FL_ALT+'a' or FL_ALT+FL_F+10 or just 'a'. A value of +zero disables the shortcut. +

The key can be any value returned by +Fl::event_key(), but will usually be an ASCII letter. Use +a lower-case letter unless you require the shift key to be held down.

+

The shift flags can be any set of values accepted by +Fl::event_state(). If the bit is on that shift key must +be pushed. Meta, Alt, Ctrl, and Shift must be off if they are not in +the shift flags (zero for the other bits indicates a "don't care" +setting).

+

int Fl_Menu_Item::submenu() const

+ Returns true if either FL_SUBMENU or FL_SUBMENU_POINTER + is on in the flags. FL_SUBMENU indicates an embedded submenu +that goes from the next item through the next one with a NULL +label(). FL_SUBMENU_POINTER indicates that user_data() + is a pointer to another menu array. +

int Fl_Menu_Item::checkbox() const

+ Returns true if a checkbox will be drawn next to this item. This is +true if FL_MENU_TOGGLE or FL_MENU_RADIO is set in the +flags. +

int Fl_Menu_Item::radio() const

+ Returns true if this item is a radio item. When a radio button is +selected all "adjacent" radio buttons are turned off. A set of radio +items is delimited by an item that has radio() false, or by an +item with FL_MENU_DIVIDER turned on. +

int Fl_Menu_Item::value() const

+ Returns the current value of the check or radio item. +

void Fl_Menu_Item::set()

+ Turns the check or radio item "on" for the menu item. Note that this +does not turn off any adjacent radio items like set_only() + does. +

void Fl_Menu_Item::setonly()

+ Turns the radio item "on" for the menu item and turns off adjacent +radio item. +

void Fl_Menu_Item::clear()

+ Turns the check or radio item "off" for the menu item. +

int Fl_Menu_Item::visible() const

+ Gets the visibility of an item. +

void Fl_Menu_Item::show()

+ Makes an item visible in the menu. +

void Fl_Menu_Item::hide()

+ Hides an item in the menu. +

int Fl_Menu_Item::active() const

+ Get whether or not the item can be picked. +

void Fl_Menu_Item::activate()

+ Allows a menu item to be picked. +

void Fl_Menu_Item::deactivate()

+ Prevents a menu item from being picked. Note that this will also cause +the menu item to appear grayed-out. +

const Fl_Menu_Item +*Fl_Menu_Item::popup(int X, int Y, const char* title = 0, const +Fl_Menu_Item* picked = 0, const Fl_Menu_* button = 0) const

+ This method is called by widgets that want to display menus. The menu +stays up until the user picks an item or dismisses it. The selected +item (or NULL if none) is returned. This does not do the +callbacks or change the state of check or radio items. +

X,Y is the position of the mouse cursor, relative to the +window that got the most recent event (usually you can pass +Fl::event_x() and Fl::event_y() unchanged here).

+

title is a character string title for the menu. If +non-zero a small box appears above the menu with the title in it.

+

The menu is positioned so the cursor is centered over the item +picked. This will work even if picked is in a submenu. +If picked is zero or not in the menu item table the menu is +positioned with the cursor in the top-left corner.

+

button is a pointer to an +Fl_Menu_ from which the color and boxtypes for the menu are +pulled. If NULL then defaults are used.

+

const Fl_Menu_Item +*Fl_Menu_Item::pulldown(int X, int Y, int W, int H, const Fl_Menu_Item* +picked = 0, const Fl_Menu_* button = 0, const Fl_Menu_Item* title = 0, +int menubar=0) const

+pulldown() is similar to popup(), but a rectangle is +provided to position the menu. The menu is made at least W + wide, and the picked item is centered over the rectangle +(like Fl_Choice uses). If picked is zero or not +found, the menu is aligned just below the rectangle (like a pulldown +menu). +

The title and menubar arguments are used +internally by the Fl_Menu_Bar widget.

+

const Fl_Menu_Item* +Fl_Menu_Item::test_shortcut() const

+ This is designed to be called by a widgets handle() method in +response to a FL_SHORTCUT event. If the current event matches +one of the items shortcut, that item is returned. If the keystroke +does not match any shortcuts then NULL is returned. This only +matches the shortcut() fields, not the letters in the title +preceeded by ' +

int Fl_Menu_Item::size()

+ Returns the number of Fl_Menu_Item structures that make up this menu, +correctly counting submenus. This includes the "terminator" item at +the end. So to copy a menu you need to copy +size()*sizeof(Fl_Menu_Item) bytes. +

const Fl_Menu_Item* +Fl_Menu_Item::next(int n=1) const +
Fl_Menu_Item* Fl_Menu_Item::next(int n=1);

+ Advance a pointer by n items through a menu array, skipping +the contents of submenus and invisible items. There are two calls so +that you can advance through const and non-const data. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Window.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Window.html new file mode 100644 index 0000000..57f0e41 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Menu_Window.html @@ -0,0 +1,49 @@ + + + Fl_Menu_Window + + + +

class Fl_Menu_Window

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Menu_Window.H>
    +
    +
+

Description

+ The Fl_Menu_Window widget is a window type used for menus. By +default the window is drawn in the hardware overlay planes if they are +available so that the menu don't force the rest of the window to +redraw. +

Methods

+ +

+Fl_Menu_Window::Fl_Menu_Window(int x, int y, int w, int h, const char +*label = 0)

+ Creates a new Fl_Menu_Window widget using the given position, +size, and label string. +

virtual +Fl_Menu_Window::~Fl_Menu_Window()

+ Destroys the window and all of its children. +

+Fl_Menu_Window::clear_overlay();

+ Tells FLTK to use normal drawing planes instead of overlay planes. +This is usually necessary if your menu contains multi-color pixmaps. +

Fl_Menu_Window::set_overlay()

+ Tells FLTK to use hardware overlay planes if they are available. + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Multi_Browser.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Multi_Browser.html new file mode 100644 index 0000000..3c3f0b6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Multi_Browser.html @@ -0,0 +1,79 @@ + + + Fl_Multi_Browser + + + +

class Fl_Multi_Browser

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Multi_Browser.H>
    +
    +
+

Description

+ The Fl_Multi_Browser class is a subclass of Fl_Browser + which lets the user select any set of the lines. The user interface +is Macintosh style: clicking an item turns off all the others and +selects that one, dragging selects all the items the mouse moves over, +and shift + click toggles the items. This is different then how forms +did it. Normally the callback is done when the user releases the +mouse, but you can change this with when(). +

See Fl_Browser for +methods to add and remove lines from the browser.

+

Methods

+ + +

+Fl_Multi_Browser::Fl_Multi_Browser(int x, int y, int w, int h, const +char *label = 0)

+ +Creates a new Fl_Multi_Browser widget using the given +position, size, and label string. The default boxtype is FL_DOWN_BOX +. + + +

virtual +Fl_Multi_Browser::~Fl_Multi_Browser()

+ +The destructor also deletes all the items in the list. + + +

int Fl_Browser::deselect()

+ +Deselects all lines. + + +

int Fl_Browser::select(int line_no,int v=1) +
int Fl_Browser::selected(int line_no) const

+ +The first version of this call selects (v=1) or deselects (v=0) +a line in the browser. The second call returns the current selection +state of a line. + + +

void Fl_Browser::value(int) +
int Fl_Browser::value() const

+ +The first version of this call selects a single line. The second version returns +the currently focused item, even if it is not selected. To find all +selected items, call + +Fl_Multi_Browser::selected() for every item in question. + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Multiline_Input.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Multiline_Input.html new file mode 100644 index 0000000..463577b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Multiline_Input.html @@ -0,0 +1,47 @@ + + + Fl_Multiline_Input + + + +

class Fl_Multiline_Input

+
+

Class Hierarchy

+
    +
    +Fl_Input
    +   |
    +   +----Fl_Multiline_Input
    +
    +
+

Include Files

+
    +
    +#include <FL/Fl_Multiline_Input.H>
    +
    +
+

Description

+ This input field displays '\n' characters as new lines rather than ^J, +and accepts the Return, Tab, and up and down arrow keys. This is for +editing multiline text. +

This is far from the nirvana of text editors, and is probably only +good for small bits of text, 10 lines at most. I think FLTK can be +used to write a powerful text editor, but it is not going to be a +built-in feature. Powerful text editors in a toolkit are a big source +of bloat.

+

Methods

+ +

+Fl_Multiline_Input::Fl_Multiline_Input(int x, int y, int w, int h, +const char *label = 0)

+ Creates a new Fl_Multiline_Input widget using the given +position, size, and label string. The default boxtype is FL_DOWN_BOX +. +

virtual +Fl_Multiline_Input::~Fl_Multiline_Input()

+ Destroys the widget and any value associated with it. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Multiline_Output.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Multiline_Output.html new file mode 100644 index 0000000..58dc940 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Multiline_Output.html @@ -0,0 +1,42 @@ + + + Fl_Multiline_Output + + + +

class Fl_Multiline_Output

+
+

Class Hierarchy

+
    +
    +Fl_Output
    +   |
    +   +----Fl_Multiline_Output
    +
    +
+

Include Files

+
    +
    +#include <FL/Fl_Multiline_Output.H>
    +
    +
+

Description

+ This widget is a subclass of Fl_Output that displays multiple +lines of text. It also displays tab characters as whitespace to the +next column. +

Methods

+ +

+Fl_Multiline_Output::Fl_Multiline_Output(int x, int y, int w, int h, +const char *label = 0)

+ Creates a new Fl_Multiline_Output widget using the given +position, size, and label string. The default boxtype is FL_DOWN_BOX +. +

virtual +Fl_Multiline_Output::~Fl_Multiline_Output()

+ Destroys the widget and any value associated with it. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Output.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Output.html new file mode 100644 index 0000000..1ddc84b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Output.html @@ -0,0 +1,83 @@ + + + Fl_Output + + + +

class Fl_Output

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Output.H>
    +
    +
+

Description

+ This widget displays a piece of text. When you set the value() +, Fl_Output does a strcpy() to it's own storage, +which is useful for program-generated values. The user may select +portions of the text using the mouse and paste the contents into other +fields or programs. +
Fl_Output widget.
+

There is a single subclass, +Fl_Multiline_Output, which allows you to display multiple lines of +text.

+

The text may contain any characters except \0, and will correctly +display anything, using ^X notation for unprintable control characters +and \nnn notation for unprintable characters with the high bit set. It +assumes the font can draw any characters in the ISO-Latin1 character +set.

+

Methods

+ +

Fl_Output::Fl_Output(int x, int y, int +w, int h, const char *label = 0)

+ Creates a new Fl_Output widget using the given position, +size, and label string. The default boxtype is FL_DOWN_BOX. +

virtual Fl_Output::~Fl_Output()

+ Destroys the widget and any value associated with it. +

const char *Fl_Output::value() const +
int Fl_Output::value(const char*) +
int Fl_Output::value(const char*, int)

+ The first form returns the current value, which is a pointer to the +internal buffer and is valid only until the value is changed. +

The second two forms change the text and set the mark and the point +to the end of it. The string is copied to the internal buffer. Passing +NULL is the same as "". This returns non-zero if the new value is +different than the current one. You can use the second version to +directly set the length if you know it already or want to put nul's in +the text.

+

int Fl_Output::size() const

+ Returns the number of characters in value(). This may be +greater than strlen(value()) if there are nul characters in +it. +

char Fl_Output::index(int) const

+ Same as value()[n], but may be faster in plausible +implementations. No bounds checking is done. +

Fl_Color Fl_Output::textcolor() const +
void Fl_Output::textcolor(Fl_Color)

+ Gets or sets the color of the text in the input field. +

Fl_Font Fl_Output::textfont() const +
void Fl_Output::textfont(Fl_Font)

+ Gets or sets the font of the text in the input field. +

uchar Fl_Output::textsize() const +
void Fl_Output::textsize(uchar)

+ Gets or sets the size of the text in the input field. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Overlay_Window.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Overlay_Window.html new file mode 100644 index 0000000..cd3b486 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Overlay_Window.html @@ -0,0 +1,59 @@ + + + Fl_Overlay_Window + + + +

class Fl_Overlay_Window

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Overlay_Window.H>
    +
    +
+

Description

+ This window provides double buffering and also the ability to draw the +"overlay" which is another picture placed on top of the main image. The +overlay is designed to be a rapidly-changing but simple graphic such as +a mouse selection box. Fl_Overlay_Window uses the overlay +planes provided by your graphics hardware if they are available. +

If no hardware support is found the overlay is simulated by drawing +directly into the on-screen copy of the double-buffered window, and +"erased" by copying the backbuffer over it again. This means the +overlay will blink if you change the image in the window.

+

Methods

+ +

+Fl_Overlay_Window::Fl_Overlay_Window(int x, int y, int w, int h, const +char *label = 0)

+ Creates a new Fl_Overlay_Window widget using the given +position, size, and label (title) string. +

virtual +Fl_Overlay_Window::~Fl_Overlay_Window()

+ Destroys the window and all child widgets. +

virtual void +Fl_Overlay_Window::draw_overlay() = 0

+ You must subclass Fl_Overlay_Window and provide this method. + It is just like a draw() method, except it draws the overlay. + The overlay will have already been "cleared" when this is called. You +can use any of the routines described in <FL/fl_draw.H>. +

void Fl_Overlay_Window::redraw_overlay() +

+ Call this to indicate that the overlay data has changed and needs to +be redrawn. The overlay will be clear until the first time this is +called, so if you want an initial display you must call this after +calling show(). diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_PNG_Image.html b/third_party/windows/fltk-1.1.10/documentation/Fl_PNG_Image.html new file mode 100644 index 0000000..0fd6200 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_PNG_Image.html @@ -0,0 +1,59 @@ + + + Fl_PNG_Image + + + + + +

class Fl_PNG_Image

+
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_PNG_Image.H>
    +
+ +

Additional Libraries

+ +
    +-lfltk_images  /  fltkimages.lib
    +
+ +

Description

+ +

The Fl_PNG_Image class supports loading, caching, +and drawing of Portable Network Graphics (PNG) image files. The +class loads colormapped and full-color images and handles color- +and alpha-based transparency.

+ +

Methods

+ + + +

Fl_PNG_Image::Fl_PNG_Image(const char *filename);

+ +

The constructor loads the named PNG image.

+ +

Fl_PNG_Image::~Fl_PNG_Image();

+ +

The destructor free all memory and server resources that are used by +the image.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_PNM_Image.html b/third_party/windows/fltk-1.1.10/documentation/Fl_PNM_Image.html new file mode 100644 index 0000000..7546c43 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_PNM_Image.html @@ -0,0 +1,59 @@ + + + Fl_PNM_Image + + + + + +

class Fl_PNM_Image

+
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_PNM_Image.H>
    +
+ +

Additional Libraries

+ +
    +-lfltk_images  /  fltkimages.lib
    +
+ +

Description

+ +

The Fl_PNM_Image class supports loading, caching, +and drawing of Portable Anymap (PNM, PBM, PGM, PPM) image files. The class +loads bitmap, grayscale, and full-color images in both ASCII and +binary formats.

+ +

Methods

+ + + +

Fl_PNM_Image::Fl_PNM_Image(const char *filename);

+ +

The constructor loads the named PNM image.

+ +

Fl_PNM_Image::~Fl_PNM_Image();

+ +

The destructor free all memory and server resources that are used by +the image.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Pack.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Pack.html new file mode 100644 index 0000000..79a5f6d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Pack.html @@ -0,0 +1,73 @@ + + + Fl_Pack + + + +

class Fl_Pack

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Pack.H>
    +
    +
+

Description

+ This widget was designed to add the functionality of compressing and +aligning widgets. +

If type() is Fl_Pack::HORIZONTAL all the children are +resized to the height of the Fl_Pack, and are moved next to +each other horizontally. If type() is not Fl_Pack::HORIZONTAL + then the children are resized to the width and are stacked below each +other. Then the Fl_Pack resizes itself to surround the child +widgets.

+

This widget is needed for the Fl_Tabs. + In addition you may want to put the Fl_Pack inside an +Fl_Scroll.

+

Methods

+ +

Fl_Pack::Fl_Pack(int x, int y, int w, int +h, const char *label = 0)

+ Creates a new Fl_Pack widget using the given position, size, +and label string. The default boxtype is FL_NO_BOX. +

virtual Fl_Pack::~Fl_Pack()

+ The destructor also deletes all the children. This allows a +whole tree to be deleted at once, without having to keep a pointer to +all the children in the user code. A kludge has been done so the +Fl_Pack and all of it's children can be automatic (local) +variables, but you must declare the Fl_Packfirst, so +that it is destroyed last. + +

Fl_Boxtype Fl_Pack::box() const +
void Fl_Pack::box(Fl_Boxtype)

+ +

Gets or sets the box type for the widget, which identifies a +routine that draws the background of the widget. Only frame +box types may be used with the Fl_Pack widget.

+ +

void Fl_Pack::resizable(Fl_Widget *box) +
void Fl_Pack::resizable(Fl_Widget &box) +
Fl_Widget *Fl_Pack::resizable() const

+

The resizable for Fl_Pack is set to NULL by +default.

+ +

See also: Fl_Group::resizable()

+ +

int Fl_Pack::spacing() const +
void Fl_Pack::spacing(int)

+ Gets or sets the number of extra pixels of blank space that are added +between the children. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Pixmap.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Pixmap.html new file mode 100644 index 0000000..8c2af04 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Pixmap.html @@ -0,0 +1,57 @@ + + + Fl_Pixmap + + + + + +

class Fl_Pixmap

+
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Pixmap.H>
    +
+ +

Description

+ +

The Fl_Pixmap class supports caching and drawing of colormap +(pixmap) images, including transparency.

+ +

Methods

+ + + +

Fl_Pixmap::Fl_Pixmap(const char * const *data);
+Fl_Pixmap::Fl_Pixmap(const char **data);
+Fl_Pixmap::Fl_Pixmap(const unsigned char * const *data);
+Fl_Pixmap::Fl_Pixmap(const unsigned char **data);

+ +

The constructors create a new pixmap from the specified XPM data.

+ +

Fl_Pixmap::~Fl_Pixmap();

+ +

The destructor free all memory and server resources that are used by +the pixmap.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Positioner.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Positioner.html new file mode 100644 index 0000000..cd78346 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Positioner.html @@ -0,0 +1,73 @@ + + + Fl_Positioner + + + +

class Fl_Positioner

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Positioner.H>
    +
    +
+

Description

+ This class is provided for Forms compatibility. It provides 2D input. +It would be useful if this could be put atop another widget so that the +crosshairs are on top, but this is not implemented. The color of the +crosshairs is selection_color(). +

Fl_Positioner widget.

+

Methods

+
+ + +
+ +
+
+

+Fl_Positioner::Fl_Positioner(int x, int y, int w, int h, const char +*label = 0)

+ Creates a new Fl_Positioner widget using the given position, +size, and label string. The default boxtype is FL_NO_BOX. +

virtual +Fl_Positioner::~Fl_Positioner()

+ Deletes the widget. +

void Fl_Positioner::value(float *x, +float *y) const

+ Returns the current position in x and y. +

void xbounds(float *xmin, float *xmax) +
void xbounds(float xmin, float xmax)

+ Gets or sets the X axis bounds. +

void xstep(float x)

+ Sets the stepping value for the X axis. +

float Fl_Positioner::xvalue(void) const +
void Fl_Positioner::xvalue(float x)

+ Gets or sets the X axis coordinate. +

void ybounds(float *ymin, float *ymay) +
void ybounds(float ymin, float ymay)

+ Gets or sets the Y axis bounds. +

void ystep(float y)

+ Sets the stepping value for the Y axis. +

float Fl_Positioner::yvalue(void) const +
void Fl_Positioner::yvalue(float y)

+ Gets or sets the Y axis coordinate. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Preferences.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Preferences.html new file mode 100644 index 0000000..c1a7e31 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Preferences.html @@ -0,0 +1,216 @@ + + + Fl_Preferences + + + + + +

class Fl_Preferences

+ +
+ +

Class Hierarchy

+ +
    +Fl_Preferences
    +
+ +

Include Files

+ +
    +#include <FL/Fl_Preferences.H>
    +
+ +

Description

+ +

Fl_Preferences provides methods to store user +setting between application starts. It is similar to the +Registry on WIN32 and Preferences on MacOS, and provides a +simple configuration mechanism for UNIX. + +

Fl_Preferences uses a hierarchy to store data. It +bundles similar data into groups and manages entries into those +groups as name/value pairs. + +

Preferences are stored in text files that can be edited +manually. The file format is easy to read and relatively +forgiving. Preferences files are the same on all platforms. User +comments in preference files are preserved. Filenames are unique +for each application by using a vendor/application naming +scheme. The user must provide default values for all entries to +ensure proper operation should preferences be corrupted or not +yet exist. + +

Entries can be of any length. However, the size of each +preferences file should be kept under 100k for performance +reasons. One application can have multiple preferences files. +Extensive binary data however should be stored in separate +files; see the getUserdataPath() +method. + +

Methods

+ + + +

+Fl_Preferences(enum Root root, const char *vendor, const char *application)
+Fl_Preferences(const char *path, const char *vendor, const char *application)
+Fl_Preferences(Fl_Preferences &p, const char *groupname)
+

+ +

The constructor creates a group that manages name/value pairs and +child groups. Groups are ready for reading and writing at any time. +The root argument is either Fl_Preferences::USER +or Fl_Preferences::SYSTEM. + +

The first format creates the base instance for all +following entries and reads existing databases into memory. The +vendor argument is a unique text string identifying the +development team or vendor of an application. A domain name or +an EMail address are great unique names, e.g. +"researchATmatthiasm.com" or "fltk.org". The +application argument can be the working title or final +name of your application. Both vendor and +application must be valid relative UNIX pathnames and +may contain '/'s to create deeper file structures. + +

The second format is used to create a preferences file at an +arbitrary position in the file system. The file name is generated +as path/application.prefs. If application +is 0, path must contain the full file name. + +

The third format generates a new group of preference entries +inside the group or file p. The groupname argument +identifies a group of entries. It can contain '/'s to get quick +access to individual elements inside the hierarchy. + +

~Fl_Preferences()

+ +

The destructor removes allocated resources. When used on the +base preferences group, the destructor flushes all +changes to the preferences file and deletes all internal +databases. + +

int Fl_Preferences::deleteEntry(const char *entry)

+ +

Removes a single entry (name/value pair). + +

int Fl_Preferences::deleteGroup(const char *groupname)

+ +

Deletes a group. + +

int Fl_Preferences::entries()

+ +

Returns the number of entries (name/value) pairs in a group. + +

const char *Fl_Preferences::entry(int ix)

+ +

Returns the name of an entry. There is no guaranteed order of +entry names. The index must be within the range given by +entries(). + +

int Fl_Preferences::entryExists(const char *entry)

+ +

Returns non-zero if an entry with this name exists. + +

void Fl_Preferences::flush()

+ +

Write all preferences to disk. This function works only with +the base preference group. This function is rarely used as +deleting the base preferences flushes automatically. + +

int Fl_Preferences::getUserdataPath(char *path, int path_size)

+ +

Creates a path that is related to the preferences file and +that is usable for application data beyond what is covered by +Fl_Preferences. + +

int get(const char *entry, int &value, int defaultValue)
+int get(const char *entry, int &value, int defaultValue)
+int get(const char *entry, float &value, float defaultValue)
+int get(const char *entry, double &value, double defaultValue )
+int get(const char *entry, char *&text, const char *defaultValue)
+int get(const char *entry, char *text, const char *defaultValue, int maxLength)
+int get(const char *entry, void *&data, const void *defaultValue, int defaultSize)
+int get(const char *entry, void *data, const void *defaultValue, int defaultSize, +int maxSize)

+ +

Reads an entry from the group. A default value must be +supplied. The return value indicates if the value was available +(non-zero) or the default was used (0). If the 'char +*&text' or 'void *&data' form is used, +the resulting data must be freed with 'free(value)'. +

'maxLength' is the maximum length of text that will be read. The text buffer must allow for one additional byte for a trailling zero. + +

const char +*Fl_Preferences::group(int ix)

+ +

Returns the name of the Nth group. There is no guaranteed +order of group names. The index must be within the range given +by groups(). + +

int Fl_Preferences::groupExists(const char *groupname)

+ +

Returns non-zero if a group with this name exists. +Groupnames are relative to the Preferences node and can contain a path. +"." describes the current node, "./" describes the topmost node. +By preceding a groupname with a "./", its path becomes relative to the topmost node. + +

int Fl_Preferences::groups()

+ +

Returns the number of groups that are contained within a +group. + +

int set(const char *entry, int value)
+int set(const char *entry, int value)
+int set(const char *entry, float value)
+int set(const char *entry, float value, int precision)
+int set(const char *entry, double value)
+int set(const char *entry, double value, int precision)
+int set(const char *entry, const char *text)
+int set(const char *entry, const void *data, int size)

+ +

Sets an entry (name/value pair). The return value indicates if there +was a problem storing the data in memory. However it does not +reflect if the value was actually stored in the preferences +file. + +

int Fl_Preferences::size(const char *key)

+ +

Returns the size of the value part of an entry. + +

+Fl_Preferences::Name( unsigned int numericName )
+Fl_Preferences::Name( const char *format, ... ) +

+ +

'Name' provides a simple method to create numerical or more complex +procedural names for entries and groups on the fly, +i.e. prefs.set(Fl_Preferences::Name("File%d",i),file[i]);. +See test/preferences.cxx as a sample for writing arrays into preferences.

+'Name' is actually implemented as a class inside Fl_Preferences. It casts +into const char* and gets automatically destroyed after the enclosing call. + + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Progress.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Progress.html new file mode 100644 index 0000000..f6005c3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Progress.html @@ -0,0 +1,73 @@ + + + Fl_Progress + + + + +

class Fl_Progress

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Progress.H>
    +
+ +

Description

+ +

The Fl_Progress widget displays a progress bar for the +user. + +

Methods

+ + + +

Fl_Progress::Fl_Progress(int x, int y, int w, int h, const char *label = 0)

+ +

The constructor creates the progress bar using the position, +size, and label. + +

You can set the background color with color() and the progress bar color with +selection_color(), or you can set both colors together with color(unsigned bg, unsigned sel). + +

The default colors are FL_BACKGROUND2_COLOR and FL_YELLOW, resp. + +

Fl_Progress::~Fl_Progress(void)

+ +

The destructor removes the progress bar. + +

void maximum(float v); +
float maximum() const;

+ +

Gets or sets the maximum value in the progress widget. + +

void minimum(float v); +
float minimum() const;

+ +

Gets or sets the minimum value in the progress widget. + +

void value(float v); +
float value() const;

+ +

Gets or sets the current value in the progress widget. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_RGB_Image.html b/third_party/windows/fltk-1.1.10/documentation/Fl_RGB_Image.html new file mode 100644 index 0000000..d67f48b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_RGB_Image.html @@ -0,0 +1,64 @@ + + + Fl_RGB_Image + + + + + +

class Fl_RGB_Image

+
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_RGB_Image.H>
    +
+ +

Description

+ +

The Fl_RGB_Image class supports caching and drawing +of full-color images with 1 to 4 channels of color information. +Images with an even number of channels are assumed to contain +alpha information, which is used to blend the image with the +contents of the screen.

+ +

Fl_RGB_Image is defined in +<FL/Fl_Image.H>, however for compatibility reasons +<FL/Fl_RGB_Image.H> should be included.

+ +

Methods

+ + + +

Fl_RGB_Image::Fl_RGB_Image(const unsigned char *array, int W, int H, int D = 3, int LD = 0);

+ +

The constructor creates a new image from the specified data.

+ +

Fl_RGB_Image::~Fl_RGB_Image();

+ +

The destructor free all memory and server resources that are used by +the image.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Repeat_Button.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Repeat_Button.html new file mode 100644 index 0000000..bc234c6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Repeat_Button.html @@ -0,0 +1,38 @@ + + + Fl_Repeat_Button + + + +

class Fl_Repeat_Button

+
+

Class Hierarchy

+ +

Include Files

+
    +
    #include <FL/Fl_Repeat_Button.H>
    +
+

Description

+ The Fl_Repeat_Button is a subclass of Fl_Button that +generates a callback when it is pressed and then repeatedly generates +callbacks as long as it is held down. The speed of the repeat is fixed +and depends on the implementation. +

Methods

+ +

+Fl_Repeat_Button::Fl_Repeat_Button(int x, int y, int w, int h, const +char *label = 0)

+ Creates a new Fl_Repeat_Button widget using the given +position, size, and label string. The default boxtype is FL_UP_BOX +. +

virtual +Fl_Repeat_Button::~Fl_Repeat_Button()

+ Deletes the button. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Return_Button.gif b/third_party/windows/fltk-1.1.10/documentation/Fl_Return_Button.gif new file mode 100644 index 0000000..349163c Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/Fl_Return_Button.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Return_Button.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Return_Button.html new file mode 100644 index 0000000..e1e68ee --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Return_Button.html @@ -0,0 +1,38 @@ + + + Fl_Return_Button + + + +

class Fl_Return_Button

+
+

Class Hierarchy

+ +

Include Files

+
    +
    #include <FL/Fl_Return_Button.H>
    +
+

Description

+The Fl_Return_Button is a subclass of Fl_Button that +generates a callback when it is pressed or when the user presses the +Enter key. A carriage-return symbol is drawn next to the button label. +

Fl_Return_Button widget.

+

Methods

+ +

+Fl_Return_Button::Fl_Return_Button(int x, int y, int w, int h, const +char *label = 0)

+ Creates a new Fl_Return_Button widget using the given +position, size, and label string. The default boxtype is FL_UP_BOX +. +

virtual +Fl_Return_Button::~Fl_Return_Button()

+ Deletes the button. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Roller.gif b/third_party/windows/fltk-1.1.10/documentation/Fl_Roller.gif new file mode 100644 index 0000000..48cd5b1 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/Fl_Roller.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Roller.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Roller.html new file mode 100644 index 0000000..9738395 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Roller.html @@ -0,0 +1,37 @@ + + + Fl_Roller + + + +

class Fl_Roller

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Roller.H>
    +
    +
+

Description

+ The Fl_Roller widget is a "dolly" control commonly used to +move 3D objects. +

Fl_Roller widget.

+

Methods

+ +

Fl_Roller::Fl_Roller(int x, int y, int +w, int h, const char *label = 0)

+ Creates a new Fl_Roller widget using the given position, +size, and label string. The default boxtype is FL_NO_BOX. +

virtual Fl_Roller::~Fl_Roller()

+ Destroys the valuator. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Round_Button.gif b/third_party/windows/fltk-1.1.10/documentation/Fl_Round_Button.gif new file mode 100644 index 0000000..3acb888 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/Fl_Round_Button.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Round_Button.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Round_Button.html new file mode 100644 index 0000000..a2397aa --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Round_Button.html @@ -0,0 +1,45 @@ + + + Fl_Round_Button + + + +

class Fl_Round_Button

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Round_Button.H>
    +
    +
+

Description

+Buttons generate callbacks when they are clicked by the user. You +control exactly when and how by changing the values for type() +and when(). +

Fl_Round_Button widget.

+

The Fl_Round_Button subclass display the "on" state by +turning on a light, rather than drawing pushed in. The shape of the +"light" is initially set to FL_ROUND_DOWN_BOX. The color of the light +when on is controlled with selection_color(), which defaults to +FL_RED.

+

Methods

+ +

+Fl_Round_Button::Fl_Round_Button(int x, int y, int w, int h, const char +*label = 0)

+ Creates a new Fl_Round_Button widget using the given +position, size, and label string. +

+Fl_Round_Button::~Fl_Round_Button()

+ The destructor deletes the check button. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Scroll.gif b/third_party/windows/fltk-1.1.10/documentation/Fl_Scroll.gif new file mode 100644 index 0000000..3055429 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/Fl_Scroll.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Scroll.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Scroll.html new file mode 100644 index 0000000..d8810c8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Scroll.html @@ -0,0 +1,117 @@ + + + Fl_Scroll + + + +

class Fl_Scroll

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Scroll.H>
    +
    +
+

Description

+ This container widget lets you maneuver around a set of widgets much +larger than your window. If the child widgets are larger than the size +of this object then scrollbars will appear so that you can scroll over +to them: +

Fl_Scroll widget.

+

If all of the child widgets are packed together into a solid +rectangle then you want to set box() to FL_NO_BOX or +one of the _FRAME types. This will result in the best output. + However, if the child widgets are a sparse arrangment you must set +box() to a real _BOX type. This can result in some +blinking during redrawing, but that can be solved by using a +Fl_Double_Window.

+

This widget can also be used to pan around a single child widget +"canvas". This child widget should be of your own class, with a +draw() method that draws the contents. The scrolling is done by +changing the x() and y() of the widget, so this child +must use the x() and y() to position it's drawing. + To speed up drawing it should test fl_push_clip() +.

+

Another very useful child is a single +Fl_Pack, which is itself a group that packs it's children +together and changes size to surround them. Filling the Fl_Pack + with Fl_Tabs groups (and then putting +normal widgets inside those) gives you a very powerful scrolling list +of individually-openable panels.

+

Fluid lets you create these, but you can only lay out objects that +fit inside the Fl_Scroll without scrolling. Be sure to leave +space for the scrollbars, as Fluid won't show these either.

+

You cannot use Fl_Window as a child of this since the +clipping is not conveyed to it when drawn, and it will draw over the +scrollbars and neighboring objects.

+

Fl_Scroll widgets should not be nested. Having an Fl_Scroll +inside another Fl_Scroll may result in drawing errors when resizing.

+

Methods

+ +

Fl_Scroll::Fl_Scroll(int x, int y, int +w, int h, const char *label = 0)

+ Creates a new Fl_Scroll widget using the given position, +size, and label string. The default boxtype is FL_NO_BOX. +

virtual Fl_Scroll::~Fl_Scroll()

+ The destructor also deletes all the children. This allows a +whole tree to be deleted at once, without having to keep a pointer to +all the children in the user code. A kludge has been done so the +Fl_Scroll and all of it's children can be automatic (local) +variables, but you must declare the Fl_Scrollfirst, so +that it is destroyed last. +

void Fl_Widget::type(int)

+ By default you can scroll in both directions, and the scrollbars +disappear if the data will fit in the area of the scroll. type() + can change this: +
    +
  • 0 - No scrollbars
  • +
  • Fl_Scroll::HORIZONTAL - Only a horizontal scrollbar.
  • +
  • Fl_Scroll::VERTICAL - Only a vertical scrollbar.
  • +
  • Fl_Scroll::BOTH - The default is both scrollbars.
  • +
  • Fl_Scroll::HORIZONTAL_ALWAYS - Horizontal scrollbar + always on, vertical always off.
  • +
  • Fl_Scroll::VERTICAL_ALWAYS - Vertical scrollbar always on, + horizontal always off.
  • +
  • Fl_Scroll::BOTH_ALWAYS - Both always on.
  • +
+ +

void Fl_Scroll::scrollbar.align(int)

+ This is used to change what side the scrollbars are drawn on. If the +FL_ALIGN_LEFT bit is on, the vertical scrollbar is on the left. + If the FL_ALIGN_TOP bit is on, the horizontal scrollbar is on +the top. Note that only the alignment flags in scrollbar are +considered. The flags in hscrollbar however are ignored. + +

Fl_Scroll::bbox(int &x, int &y, int &w, int &h)

+ +

[protected] This method returns the bounding box for the interior of the scrolling +area, inside the scrollbars. + +

int Fl_Scroll::xposition() const

+ Gets the current horizontal scrolling position. + +

int Fl_Scroll::yposition() const

+ Gets the current vertical scrolling position. + +

void Fl_Scroll::position(int w, int h) +

+ Sets the upper-lefthand corner of the scrolling region. + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Scrollbar.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Scrollbar.html new file mode 100644 index 0000000..b16a4a6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Scrollbar.html @@ -0,0 +1,64 @@ + + + Fl_Scrollbar + + + +

class Fl_Scrollbar

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Scrollbar.H>
    +
    +
+

Description

+ The Fl_Scrollbar widget displays a slider with arrow buttons +at the ends of the scrollbar. Clicking on the arrows move up/left and +down/right by linesize(). Scrollbars also accept +FL_SHORTCUT events: the arrows move by linesize(), and +vertical scrollbars take Page Up/Down (they move by the page size minus +linesize()) and Home/End (they jump to the top or bottom). +

Scrollbars have step(1) preset (they always return +integers). If desired you can set the step() to non-integer +values. You will then have to use casts to get at the floating-point +versions of value() from Fl_Slider.

+

Fl_Scrollbar widget.

+

Methods

+ +

Fl_Scrollbar::Fl_Scrollbar(int x, +int y, int w, int h, const char *label = 0)

+ Creates a new Fl_Scrollbar widget using the given position, +size, and label string. You need to do type(FL_HORIZONTAL) if +you want a horizontal scrollbar. +

virtual +Fl_Scrollbar::~Fl_Scrollbar()

+ Destroys the valuator. +

int Fl_Scrollbar::linesize() const +
void Fl_Scrollbar::linesize(int i)

+ This number controls how big the steps are that the arrow keys do. In +addition page up/down move by the size last sent to value() + minus one linesize(). The default is 16. +

int Fl_Scrollbar::value() +
int Fl_Scrollbar::value(int position, int size, int top, int total)
+

+ The first form returns the integer value of the scrollbar. You can get +the floating point value with Fl_Slider::value(). The second +form sets value(), range(), and slider_size() + to make a variable-sized scrollbar. You should call this every time +your window changes size, your data changes size, or your scroll +position changes (even if in response to a callback from this +scrollbar). All necessary calls to redraw() are done. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Secret_Input.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Secret_Input.html new file mode 100644 index 0000000..2269a54 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Secret_Input.html @@ -0,0 +1,40 @@ + + + Fl_Secret_Input + + + +

class Fl_Secret_Input

+
+

Class Hierarchy

+
    +
    +Fl_Input
    +   |
    +   +----Fl_Secret_Input
    +
    +
+

Include Files

+
    +
    +#include <FL/Fl_Secret_Input.H>
    +
    +
+

Description

+ The Fl_Secret_Input class is a subclass of Fl_Input + that displays its input as a string of asterisks. This subclass is +usually used to receive passwords and other "secret" information. +

Methods

+ +

+Fl_Secret_Input::Fl_Secret_Input(int x, int y, int w, int h, const char +*label = 0)

+ Creates a new Fl_Secret_Input widget using the given +position, size, and label string. The default boxtype is FL_DOWN_BOX +. +

virtual +Fl_Secret_Input::~Fl_Secret_Input()

+ Destroys the widget and any value associated with it. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Select_Browser.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Select_Browser.html new file mode 100644 index 0000000..134bb2f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Select_Browser.html @@ -0,0 +1,57 @@ + + + Fl_Select_Browser + + + +

class Fl_Select_Browser

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Select_Browser.H>
    +
    +
+

Description

+The Fl_Select_Browser class is a subclass of Fl_Browser +which lets the user select a single item, or no items by clicking on +the empty space. As long as the mouse button is held down on an +unselected item it is highlighted. Normally the callback is done when the +user presses the mouse, but you can change this with when(). +

See Fl_Browser for +methods to add and remove lines from the browser.

+

Methods

+ +

+Fl_Select_Browser::Fl_Select_Browser(int x, int y, int w, int h, const +char *label = 0)

+ Creates a new Fl_Select_Browser widget using the given +position, size, and label string. The default boxtype is FL_DOWN_BOX +. +

virtual +Fl_Select_Browser::~Fl_Select_Browser()

+ The destructor also deletes all the items in the list. +

int Fl_Browser::deselect()

+

Deselects any selected item. +

int Fl_Browser::select(int,int=1) +
int Fl_Browser::selected(int) const

+ You can use these for compatibility with +Fl_Multi_Browser. If you turn on the selection of more +than one line the results are unpredictable. +

int Fl_Browser::value() const

+ Returns the number of the highlighted item, or zero if none. Notice +that this is going to be zero except during a callback! diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Shared_Image.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Shared_Image.html new file mode 100644 index 0000000..2f45b77 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Shared_Image.html @@ -0,0 +1,96 @@ + + + Fl_Shared_Image + + + + + +

class Fl_Shared_Image

+
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Shared_Image.H>
    +
+ +

Description

+ +

The Fl_Shared_Image class supports caching, loading, +and drawing of image files. Most applications will also want to +link against the fltk_images library and call the +fl_register_images() +function to support standard image formats such as BMP, GIF, JPEG, and PNG.

+ +

Methods

+ + + +

protected Fl_Shared_Image::Fl_Shared_Image();
+protected Fl_Shared_Image::Fl_Shared_Image(const char *name, Fl_Image *img);

+ +

The constructors create a new shared image record in the +image cache. + +

The constructors are protected and cannot be used directly +from a program. Use the get() method instead. + +

protected Fl_Shared_Image::~Fl_Shared_Image();

+ +

The destructor free all memory and server resources that are +used by the image. The destructor is protected and cannot be +used directly from a program. Use the release() method +instead. + +

static Fl_Shared_Image *find(const char *n, int W = 0, int H = 0);

+ +

static Fl_Shared_Image *get(const char *n, int W = 0, int H = 0);

+ +

static Fl_Shared_Image **images();

+ +

const char *name();

+ +

static int num_images();

+ +

int refcount();

+ +

void release();

+ +

void reload();

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Single_Window.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Single_Window.html new file mode 100644 index 0000000..b54cc3b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Single_Window.html @@ -0,0 +1,42 @@ + + + Fl_Single_Window + + + +

class Fl_Single_Window

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Single_Window.H>
    +
    +
+

Description

+ This is the same as Fl_Window. However, it is possible that +some implementations will provide double-buffered windows by default. +This subclass can be used to force single-buffering. This may be +useful for modifying existing programs that use incremental update, or +for some types of image data, such as a movie flipbook. +

Methods

+ +

+Fl_Single_Window::Fl_Single_Window(int x, int y, int w, int h, const +char *label = 0)

+ Creates a new Fl_Single_Window widget using the given +position, size, and label (title) string. +

virtual +Fl_Single_Window::~Fl_Single_Window()

+ Destroys the window and all child widgets. + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Slider.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Slider.html new file mode 100644 index 0000000..5c5b770 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Slider.html @@ -0,0 +1,82 @@ + + + Fl_Slider + + + +

class Fl_Slider

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Slider.H>
    +
    +
+

Description

+ The Fl_Slider widget contains a sliding knob inside a box. It +if often used as a scrollbar. Moving the box all the way to the +top/left sets it to the minimum(), and to the bottom/right to +the maximum(). The minimum() may be greater than the +maximum() to reverse the slider direction. +

Fl_Slider widget.

+

Methods

+ +

Fl_Slider::Fl_Slider(int x, int y, int +w, int h, const char *label = 0)

+ Creates a new Fl_Slider widget using the given position, +size, and label string. The default boxtype is FL_DOWN_BOX. +

virtual Fl_Slider::~Fl_Slider()

+ Destroys the valuator. +

int Fl_Slider::scrollvalue(int +windowtop, int windowsize, int first, int totalsize)

+ Returns +Fl_Scrollbar::value(). +

Fl_Boxtype Fl_Slider::slider() const +
void Fl_Slider::slider(Fl_Boxtype)

+ Set the type of box to draw for the moving part of the slider. The +color of the moving part (or of the notch in it for the nice sliders) +is controlled by selection_color(). The default value of zero +causes the slider to figure out what to draw from box(). +

float Fl_Slider::slider_size() const +
void Fl_Slider::slider_size(float)

+ Get or set the dimensions of the moving piece of slider. This is the +fraction of the size of the entire widget. If you set this to 1 then +the slider cannot move. The default value is .08. +

For the "fill" sliders this is the size of the area around the end +that causes a drag effect rather than causing the slider to jump to the +mouse.

+

uchar Fl_Widget::type() const +
void Fl_Widget::type(uchar t)

+ Setting this changes how the slider is drawn, which can be one of the +following: +
    +
  • FL_VERTICAL - Draws a vertical slider (this is the +default).
  • +
  • FL_HORIZONTAL - Draws a horizontal slider.
  • +
  • FL_VERT_FILL_SLIDER - Draws a filled vertical slider, +useful as a progress or value meter.
  • +
  • FL_HOR_FILL_SLIDER - Draws a filled horizontal slider, +useful as a progress or value meter.
  • +
  • FL_VERT_NICE_SLIDER - Draws a vertical slider with a nice +looking control knob.
  • +
  • FL_HOR_NICE_SLIDER - Draws a horizontal slider with a +nice looking control knob.
  • +
+ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Spinner.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Spinner.html new file mode 100644 index 0000000..0345164 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Spinner.html @@ -0,0 +1,123 @@ + + + Fl_Spinner + + + + + +

class Fl_Spinner

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Spinner.H>
    +
+ +

Description

+ +

The Fl_Spinner widget is a combination of the input +widget and repeat buttons. The user can either type into the +input area or use the buttons to change the value. + +

Methods

+ + + +

Fl_Spinner::Fl_Spinner(int x, int y, int w, +int h, const char *label = 0)

+ +

Creates a new Fl_Spinner widget using the given position, size, +and label string. + +

virtual Fl_Spinner::~Fl_Spinner()

+ +

Destroys the widget and any value associated with it. + +

void format(const char *f)
+const char *format()

+ +

Sets or returns the format string for the value.

+ +

void maximum(double m)
+double maximum() const

+ +

Sets or returns the maximum value of the widget.

+ +

void minimum(double m)
+double minimum() const

+ +

Sets or returns the minimum value of the widget.

+ +

void range(double minval, double maxval)

+ +

Sets the minimum and maximum values for the widget.

+ +

void step(double s)
+double step() const

+ +

Sets or returns the amount to change the value when the user +clicks a button. +Before setting step to a non-integer value, the spinner +type() should be changed +to floating point.

+ +

void textcolor(Fl_Color c)
+Fl_Color textcolor() const

+ +

Sets or returns the color of the text in the input field.

+ +

void textfont(uchar f)
+uchar textfont() const

+ +

Sets or returns the font of the text in the input field.

+ +

void textsize(uchar s)
+uchar textsize() const

+ +

Sets or returns the size of the text in the input field.

+ +

void type(uchar s)
+uchar type() const

+ +

Sets or returns the numeric representation in the input field. +Valid values are FL_INT_INPUT and FL_FLOAT_INPUT. +The first form also changes the format() template. +Please note that type is not a virtual function. +Setting a new spinner type via a superclass pointer will not work.

+ +

void Fl_Spinner::value(double v)
+double Fl_Spinner::value() const

+ +

Sets or returns the current value of the widget. +Before setting value to a non-integer value, the spinner +type() should be changed +to floating point.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Tabs.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Tabs.html new file mode 100644 index 0000000..96cebef --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Tabs.html @@ -0,0 +1,91 @@ + + + Fl_Tabs + + + + + +

class Fl_Tabs

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Tabs.H>
    +
+ +

Description

+ +

The Fl_Tabs widget is the "file card tabs" +interface that allows you to put lots and lots of buttons and +switches in a panel, as popularized by many toolkits. + +

Fl_Tabs widget.

+ +

Clicking the tab makes a child visible() by calling +show() on it, and all other children are made invisible +by calling hide() on them. Usually the children are Fl_Group widgets +containing several widgets themselves. + +

Each child makes a card, and it's label() is printed +on the card tab, including the label font and style. The +selection color of that child is used to color the tab, while +the color of the child determines the background color of the +pane. + +

The size of the tabs is controlled by the bounding box of the +children (there should be some space between the children and +the edge of the Fl_Tabs), and the tabs may be placed +"inverted" on the bottom, this is determined by which +gap is larger. It is easiest to lay this out in fluid, using the +fluid browser to select each child group and resize them until +the tabs look the way you want them to. + +

Methods

+ + + +

Fl_Tabs::Fl_Tabs(int x, int y, int w, int h, +const char *label = 0)

+ +

Creates a new Fl_Tabs widget using the given position, size, +and label string. The default boxtype is FL_THIN_UP_BOX. + +

Use add(Fl_Widget +*) to add each child, which are usually +Fl_Group widgets. The children should be sized to stay +away from the top or bottom edge of the Fl_Tabs widget, +which is where the tabs will be drawn. + +

virtual Fl_Tabs::~Fl_Tabs()

+ +

The destructor also deletes all the children. This +allows a whole tree to be deleted at once, without having to +keep a pointer to all the children in the user code. A kludge +has been done so the Fl_Tabs and all of it's children +can be automatic (local) variables, but you must declare the +Fl_Tabs widget first so that it is destroyed +last. + +

Fl_Widget* Fl_Tabs::value() +
int Fl_Tabs::value(Fl_Widget*)

+ +

Gets or sets the currently visible widget/tab. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Text_Buffer.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Text_Buffer.html new file mode 100644 index 0000000..c17f8bc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Text_Buffer.html @@ -0,0 +1,465 @@ + + + Fl_Text_Buffer + + + + + +

class Fl_Text_Buffer

+ +
+ +

Class Hierarchy

+ +
    +Fl_Text_Buffer
    +
+ +

Include Files

+ +
    +#include <FL/Fl_Text_Buffer.H>
    +
+ +

Description

+ +

The Fl_Text_Buffer class is used by the +Fl_Text_Display +and +Fl_Text_Editor +to manage complex text data and is based upon the +excellent NEdit text editor engine - see +http://www.nedit.org/.

+ +

Methods

+ + + +
+ +

Fl_Text_Buffer(int requestedSize = 0);

+ +

Creates a new text buffer of the specified initial size. + +

~Fl_Text_Buffer();

+ +

Destroys a text buffer. + +

void add_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg);

+ +

Adds a callback function that is called whenever the text buffer is +modified. The callback function is declared as follows: + +

    +typedef void (*Fl_Text_Modify_Cb)(int pos, int nInserted, int nDeleted,
    +                                  int nRestyled, const char* deletedText,
    +                                  void* cbArg);
    +
+ +

void append(const char* text);

+ +

Appends the text string to the end of the buffer. + +

int appendfile(const char *file, int buflen = 128*1024);

+ +

Appends the named file to the end of the buffer. Returns 0 on +success, non-zero on error (strerror() contains reason). 1 indicates +open for read failed (no data loaded). 2 indicates error occurred +while reading data (data was partially loaded). + +

void call_modify_callbacks();

+ +

Calls all modify callbacks that have been registered using +the add_modify_callback() +method. + +

char character(int pos);

+ +

Returns the character at the specified position in the buffer. + +

static int character_width(char c, int indent, int tabDist, char nullSubsChar);

+ +

Returns the column width of the specified character. The +indent argument specifies the current column position, +and tabDist specifies the number of columns to use for +each tab. + +

The nullSubsChar argument specifies the current +nul character. + +

void clear_rectangular(int start, int end, int rectStart, int rectEnd);

+ +

Clears text in the specified area. + +

void copy(Fl_Text_Buffer* fromBuf, int fromStart, int fromEnd, int toPos);

+ +

Copies text from one buffer to this one; fromBuf may +be the same as this. + +

int count_displayed_characters(int lineStartPos, int targetPos);

+ +

Determines the number of characters that will be displayed +between lineStartPos and targetPos. + +

int count_lines(int startPos, int endPos);

+ +

Determines the number of lines between startPos and +endPos. + +

int expand_character(int pos, int indent, char *outStr);
+static int expand_character(char c, int indent, char* outStr, int tabDist, +char nullSubsChar);

+ +

Expands the given character to a displayable format. Tabs and +other control characters are given special treatment. + +

int findchar_backward(int startPos, char searchChar, int* foundPos);

+ +

Finds the previous occurrence of the specified character. + +

int findchar_forward(int startPos, char searchChar, int* foundPos);

+ +

Finds the next occurrence of the specified character. + +

int findchars_backward(int startPos, const char* searchChars, int* foundPos);

+ +

Finds the previous occurrence of the specified characters. + +

int findchars_forward(int startPos, const char* searchChars, int* foundPos);

+ +

Finds the next occurrence of the specified characters. +Search forwards in buffer for characters in searchChars, starting +with the character startPos, and returning the result in foundPos +returns 1 if found, 0 if not. + +

void highlight(int start, int end);

+ +

Highlights the specified text within the buffer. + +

int highlight_position(int* start, int* end, int* isRect, int* rectStart, +int* rectEnd);

+ +

Returns the current highlight positions. + +

void highlight_rectangular(int start, int end, int rectStart, int rectEnd);

+ +

Highlights the specified rectangle of text within the buffer. + +

Fl_Text_Selection* highlight_selection();

+ +

Returns the current highlight selection. + +

const char* highlight_text();

+ +

Returns the highlighted text. When you are done with the +text, free it using the free() function. + +

void insert_column(int column, int startPos, const char* text, +int* charsInserted, int* charsDeleted);

+ +

Inserts a column of text without calling the modify callbacks. + +

int insertfile(const char *file, int pos, int buflen = 128*1024);

+ +

Inserts a file at the specified position. Returns 0 on success, +non-zero on error (strerror() contains reason). 1 indicates open +for read failed (no data loaded). 2 indicates error occurred +while reading data (data was partially loaded). + +

void insert(int pos, const char* text);

+ +

Inserts text at the specified position. + +

int length();

+ +

Returns the number of characters in the buffer. + +

int line_end(int pos);

+ +

Returns the end position of the line. + +

int line_start(int pos);

+ +

Returns the start position of the line. + +

const char* line_text(int pos);

+ +

Returns the text for the line containing the specified +character position. When you are done with the text, free it +using the free() function. + +

int loadfile(const char *file, int buflen = 128*1024);

+ +

Replaces the current buffer with the contents of a file. Returns 0 +on success, non-zero on error (strerror() contains reason). 1 indicates +open for read failed (no data loaded). 2 indicates error occurred +while reading data (data was partially loaded). + +

char null_substitution_character();

+ +

Returns the current nul substitution character. + +

int outputfile(const char *file, int start, int end, int buflen = 128*1024);

+ +

Writes the specified portions of the file to a file. Returns 0 on success, non-zero +on error (strerror() contains reason). 1 indicates open for write failed +(no data saved). 2 indicates error occurred while writing data +(data was partially saved). + +

void overlay_rectangular(int startPos, int rectStart, int rectEnd, +const char* text, int* charsInserted, int* charsDeleted);

+ +

Replaces a rectangular region of text with the given text. + +

Fl_Text_Selection* primary_selection();

+ +

Returns the primary selection. + +

void remove_modify_callback(Fl_Text_Modify_Cb bufModifiedCB, void* cbArg);

+ +

Removes a modify callback. + +

void remove_rectangular(int start, int end, int rectStart, int rectEnd);

+ +

Deletes a rectangular area of text in the buffer. + +

void remove(int start, int end);

+ +

Deletes a range of characters in the buffer. + +

void remove_secondary_selection();

+ +

Removes the text in the secondary selection. + +

void remove_selection();

+ +

Removes the text in the primary selection. + +

void replace_rectangular(int start, int end, int rectStart, int rectEnd, +const char* text);

+ +

Replaces the text in a rectangular area. + +

void replace(int start, int end, const char *text);

+ +

Replaces the text in the specified range of characters in the buffer. + +

void replace_secondary_selection(const char* text);

+ +

Replaces the text in the secondary selection. + +

void replace_selection(const char* text);

+ +

Replaces the text in the primary selection. + +

int rewind_lines(int startPos, int nLines);

+ +

Returns the buffer position for the Nth previous line. + +

int savefile(const char *file, int buflen = 128*1024);

+ +

Saves the entire buffer to a file. Returns 0 on success, non-zero +on error (strerror() contains reason). 1 indicates open for write failed +(no data saved). 2 indicates error occurred while writing data +(data was partially saved). + +

int search_backward(int startPos, const char* searchString, int* foundPos, +int matchCase = 0);

+ +

Searches backwards for the specified string. + +

int search_forward(int startPos, const char* searchString, int* foundPos, +int matchCase = 0);

+ +

Searches forwards for the specified string. + +

int secondary_selection_position(int* start, int* end, int* isRect, +int* rectStart, int* rectEnd);

+ +

Fl_Text_Selection* secondary_selection();

+ +

Returns the secondary selection. + +

const char* secondary_selection_text();

+ +

Returns the text in the secondary selection. When you are +done with the text, free it using the free() function. + +

void secondary_select_rectangular(int start, int end, int rectStart, +int rectEnd);

+ +

Selects a rectangle of characters in the secondary selection. + +

void secondary_select(int start, int end);

+ +

Selects a range of characters in the secondary selection. + +

void secondary_unselect();

+ +

Turns the secondary selection off. + +

int selected();

+ +

Returns a non-zero number if any text has been selected, or 0 +if no text is selected. + +

int selection_position(int* start, int* end);
+int selection_position(int* start, int* end, int* isRect, int* rectStart, int* rectEnd);

+ +

Returns the current selection. + +

const char* selection_text();

+ +

Returns the currently selected text. When you are done with +the text, free it using the free() function. + +

void select_rectangular(int start, int end, int rectStart, int rectEnd);

+ +

Selects a rectangle of characters in the buffer. + +

void select(int start, int end);

+ +

Selects a range of characters in the buffer. + +

int skip_displayed_characters(int lineStartPos, int nChars);

+ +

Skips forward the indicated number of characters in the +buffer from the start position. + +

int skip_lines(int startPos, int nLines);

+ +

Returns the buffer position for the Nth line after the start +position. + +

int substitute_null_characters(char* string, int length);

+ +

Replaces nul characters in the given string with the +nul substitution character. + +

int tab_distance();
+void tab_distance(int tabDist);

+ +

Gets or sets the tab width. + +

const char* text_in_rectangle(int start, int end, int rectStart, int rectEnd);

+ +

Returns the text from the given rectangle. When you are done +with the text, free it using the free() function. + +

const char* text_range(int start, int end);

+ +

Returns the text from the range of characters. When you are +done with the text, free it using the free() function. + +

const char* text();
+void text(const char* text);

+ +

Gets or sets the text in the buffer. The first form +returns a copy of the text in the buffer which you must +later free() when done using it. The second form sets the text in +the buffer, making an internal copy of the string that is automatically managed. + +

void unhighlight();

+ +

Unhighlights text in the buffer. + +

void unselect();

+ +

Unselects text in the buffer. + +

void unsubstitute_null_characters(char* string);

+ +

Replaces the nul substitution characters in the +provided string with the nul character. + +

int word_end(int pos);

+ +

Returns the position for the end of the word. + +

int word_start(int pos);

+ +

Returns the position for the start of the word. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Text_Display.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Text_Display.html new file mode 100644 index 0000000..cc9e9d4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Text_Display.html @@ -0,0 +1,246 @@ + + + Fl_Text_Display + + + + + +

class Fl_Text_Display

+ +
+ +

Class Hierarchy

+ + +

Include Files

+ +
    +
    +#include <FL/Fl_Text_Display.H>
    +
    +
+ +

Description

+ +

This is the FLTK text display widget. It allows the user to +view multiple lines of text and supports highlighting and +scrolling. The buffer that is displayed in the widget is managed +by the Fl_Text_Buffer +class. + + +

Methods

+ + + +
+ +

Fl_Text_Display(int X, int Y, int W, int H, const char *l = 0);

+ +

Creates a new text display widget. + +

~Fl_Text_Display();

+ +

Destroys a text display widget. + +

void buffer(Fl_Text_Buffer* buf);
+void buffer(Fl_Text_Buffer& buf);
+Fl_Text_Buffer* buffer();

+ +

Sets or gets the current text buffer associated with the text widget. +Multiple text widgets can be associated with the same text buffer. + +

void cursor_color(Fl_Color c);
+Fl_Color cursor_color();

+ +

Sets or gets the text cursor color. + +

void cursor_style(int style);

+ +

Sets the text cursor style to one of the following: + +

    + +
  • Fl_Text_Display::NORMAL_CURSOR - Shows an I beam. + +
  • Fl_Text_Display::CARET_CURSOR - Shows a caret under the text. + +
  • Fl_Text_Display::DIM_CURSOR - Shows a dimmed I beam. + +
  • Fl_Text_Display::BLOCK_CURSOR - Shows an unfilled box around the current + character. + +
  • Fl_Text_Display::HEAVY_CURSOR - Shows a thick I beam. + +
+ +

void hide_cursor();

+ +

Hides the text cursor. + +

void highlight_data(Fl_Text_Buffer *styleBuffer, +Style_Table_Entry *styleTable, int nStyles, char +unfinishedStyle, Unfinished_Style_Cb unfinishedHighlightCB, void +*cbArg);

+ +

Sets the text buffer, text styles, and callbacks to use when +displaying text in the widget. Style buffers cannot be shared +between widgets and are often used to do syntax highlighting. +The editor example from Chapter 4 +shows how to use the highlight_data() method. + +

int in_selection(int x, int y);

+ +

Returns non-zero if the specified mouse position is inside the current +selection. + +

void insert(const char* text);

+ +

Inserts text at the current insert position. + +

void insert_position(int newPos);
+int insert_position()

+ +

Sets or gets the current insert position. + +

int move_down();

+ +

Moves the current insert position down one line. + +

int move_left();

+ +

Moves the current insert position left one character. + +

int move_right();

+ +

Moves the current insert position right one character. + +

int move_up();

+ +

Moves the current insert position up one line. + +

void next_word(void);

+ +

Moves the current insert position right one word. + +

void overstrike(const char* text);

+ +

Replaces text at the current insert position. + +

int position_style(int lineStartPos, int lineLen, int lineIndex, +int dispIndex);

+ +

Returns the style associated with the character at position +lineStartPos + lineIndex. + +

void previous_word(void);

+ +

Moves the current insert position left one word. + +

void redisplay_range(int start, int end);

+ +

Marks text from start to end as needing a redraw. + +

void scrollbar_align(Fl_Align a);
+Fl_Align scrollbar_align();

+ +

Sets or gets where scrollbars are attached to the widget - +FL_ALIGN_LEFT and FL_ALIGN_RIGHT for +the vertical scrollbar and FL_ALIGN_TOP and +FL_ALIGN_BOTTOM for the horizontal scrollbar. + +

void scrollbar_width(int w);
+int scrollbar_width();

+ +

Sets or gets the width/height of the scrollbars. + +

void scroll(int topLineNum, int horizOffset);

+ +

Scrolls the current buffer to start at the specified line and column. + +

void show_cursor(int b = 1);

+ +

Shows or hides the text cursor. + +

void show_insert_position();

+ +

Scrolls the text buffer to show the current insert position. + +

void textcolor(unsigned n);
+Fl_Color textcolor() const;

+ +

Sets or gets the default color of text in the widget. + +

void textfont(uchar s);
+Fl_Font textfont() const;

+ +

Sets or gets the default font used when drawing text in the widget. + +

void textsize(uchar s);
+uchar textsize() const;

+ +

Sets or gets the default size of text in the widget. + +

int word_end(int pos);

+ +

Moves the insert position to the end of the current word. + +

int word_start(int pos);

+ +

Moves the insert position to the beginning of the current word. + +

void wrap_mode(int mode, int pos);

+ +

If mode is not zero, this call enables automatic word wrapping at column pos. +Word-wrapping does not change the text buffer itself, only the way that the text is displayed. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Text_Editor.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Text_Editor.html new file mode 100644 index 0000000..2701647 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Text_Editor.html @@ -0,0 +1,221 @@ + + + Fl_Text_Editor + + + + + +

class Fl_Text_Editor

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +
    +#include <FL/Fl_Text_Editor.H>
    +
    +
+ +

Description

+ +

This is the FLTK text editor widget. It allows the user to +edit multiple lines of text and supports highlighting and +scrolling. The buffer that is displayed in the widget is managed +by the Fl_Text_Buffer +class. + +

Methods

+ + + +
+ +

Fl_Text_Editor(int X, int Y, int W, int H, const char* l = 0);

+ +

The constructor creates a new text editor widget. + +

~Fl_Text_Editor();

+ +

The destructor frees all memory used by the text editor widget. + +

void add_default_key_bindings(Key_Binding** list);

+ +

Adds all of the default editor key bindings to the specified key binding list. + +

void add_key_binding(int key, int state, Key_Func f, Key_Binding** list);
+void add_key_binding(int key, int state, Key_Func f);

+ +

Adds a single key binding to the specified or current key binding list. + +

Key_Func bound_key_function(int key, int state, Key_Binding* list);
+Key_Func bound_key_function(int key, int state);

+ +

Returns the function associated with a key binding. + +

void default_key_function(Key_Func f);

+ +

Sets the default key function for unassigned keys. + +

void insert_mode(int b);
+int insert_mode();

+ +

Sets or gets the current insert mode; if non-zero, new text +is inserted before the current cursor position. Otherwise, new +text replaces text at the current cursor position. + +

int kf_backspace(int c, Fl_Text_Editor* e);

+ +

Does a backspace in the current buffer. + +

int kf_copy(int c, Fl_Text_Editor* e);

+ +

Does a copy of selected text in the current buffer. + +

int kf_c_s_move(int c, Fl_Text_Editor* e);

+ +

Extends the current selection in the direction indicated by +control key c. + +

int kf_ctrl_move(int c, Fl_Text_Editor* e);

+ +

Moves the current text cursor in the direction indicated by +control key c. + +

int kf_cut(int c, Fl_Text_Editor* e);

+ +

Does a cut of selected text in the current buffer. + +

int kf_default(int c, Fl_Text_Editor* e);

+ +

Inserts the text associated with the key c. + +

int kf_delete(int c, Fl_Text_Editor* e);

+ +

Does a delete of selected text or the current character in +the current buffer. + +

int kf_down(int c, Fl_Text_Editor* e);

+ +

Moves the text cursor down one line. + +

int kf_end(int c, Fl_Text_Editor* e);

+ +

Moves the text cursor to the end of the current line. + +

int kf_enter(int c, Fl_Text_Editor* e);

+ +

Inserts a newline at the current cursor position. + +

int kf_home(int c, Fl_Text_Editor* e);

+ +

Moves the text cursor to the beginning of the current line. + +

int kf_ignore(int c, Fl_Text_Editor* e);

+ +

Ignores the keypress. + +

int kf_insert(int c, Fl_Text_Editor* e);

+ +

Toggles the insert mode in the text editor. + +

int kf_left(int c, Fl_Text_Editor* e);

+ +

Moves the text cursor to the left in the buffer. + +

int kf_move(int c, Fl_Text_Editor* e);

+ +

Moves the text cursor in the direction indicated by key +c. + +

int kf_page_down(int c, Fl_Text_Editor* e);

+ +

Moves the text cursor down one page. + +

int kf_page_up(int c, Fl_Text_Editor* e);

+ +

Moves the text cursor up one page. + +

int kf_paste(int c, Fl_Text_Editor* e);

+ +

Pastes the contents of the clipboard at the current text cursor position. + +

int kf_right(int c, Fl_Text_Editor* e);

+ +

Moves the text cursor one character to the right. + +

int kf_select_all(int c, Fl_Text_Editor* e);

+ +

Selects all text in the buffer. + +

int kf_shift_move(int c, Fl_Text_Editor* e);

+ +

Extends the current selection in the direction of key c. + +

int kf_up(int c, Fl_Text_Editor* e);

+ +

Moves the text cursor up one line. + +

void remove_all_key_bindings(Key_Binding** list);
+void remove_all_key_bindings();

+ +

Removes all of the key bindings associated with the text editor or list. + +

void remove_key_binding(int key, int state, Key_Binding** list);
+void remove_key_binding(int key, int state);

+ +

Removes a single key binding from the text editor or list. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Tile.gif b/third_party/windows/fltk-1.1.10/documentation/Fl_Tile.gif new file mode 100644 index 0000000..f14f0b4 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/Fl_Tile.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Tile.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Tile.html new file mode 100644 index 0000000..73df45f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Tile.html @@ -0,0 +1,91 @@ + + + Fl_Tile + + + + + +

class Fl_Tile

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Tile.H>
    +
+ +

Description

+ +

The Fl_Tile class lets you resize the children by dragging +the border between them: + +

Fl_Tile widget.

+ +

For the tiling to work correctly, the children of an +Fl_Tile must cover the entire area of the widget, but not +overlap. This means that all children must touch each +other at their edges, and no gaps can't be left inside the +Fl_Tile. + +

Fl_Tile does not normailly draw any graphics of its own. +The "borders" which can be seen in the snapshot above +are actually part of the children. Their boxtypes have been set +to FL_DOWN_BOX creating the impression of +"ridges" where the boxes touch. What you see are +actually two adjacent FL_DOWN_BOX's drawn next to each +other. All neighboring widgets share the same edge - the widget's +thick borders make it appear as though the widgets aren't actually +touching, but they are. If the edges of adjacent widgets do not +touch, then it will be impossible to drag the corresponding +edges.

+ +

Fl_Tile allows objects to be resized to zero dimensions. +To prevent this you can use the resizable() to limit where +corners can be dragged to.

+ +

Even though objects can be resized to zero sizes, they must +initially have non-zero sizes so the Fl_Tile can figure out +their layout. If desired, call position() after creating the +children but before displaying the window to set the borders where you +want.

+ +

Methods

+ +

Fl_Tile::Fl_Tile(int x, int y, int w, int +h, const char *label = 0)

+ Creates a new Fl_Tile widget using the given position, size, +and label string. The default boxtype is FL_NO_BOX. +

virtual Fl_Tile::~Fl_Tile()

+ The destructor also deletes all the children. This allows a +whole tree to be deleted at once, without having to keep a pointer to +all the children in the user code. A kludge has been done so the +Fl_Tile and all of it's children can be automatic (local) +variables, but you must declare the Fl_Tile first, so +that it is destroyed last. +

void Fl_Tile::position(from_x, from_y, +to_x, to_y)

+ Drag the intersection at from_x,from_y to to_x,to_y. + This redraws all the necessary children. +

void Fl_Tile::resizable(Fl_Widget &w)
+void Fl_Tile::resizable(Fl_Widget *w)

+The "resizable" child widget (which should be invisible) limits where the +border can be dragged to. If you don't set it, it will be possible to +drag the borders right to the edge, and thus resize objects on the edge +to zero width or height. The resizable() widget is not +resized by dragging any borders. + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Tiled_Image.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Tiled_Image.html new file mode 100644 index 0000000..ad8c137 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Tiled_Image.html @@ -0,0 +1,64 @@ + + + Fl_Tiled_Image + + + + + +

class Fl_Tiled_Image

+
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Tiled_Image.H>
    +
+ +

Description

+ +

The Fl_Tiled_Image class supports tiling of images +over a specified area. The source (tile) image is not +copied unless you call the color_average(), +desaturate(), +or inactive() +methods.

+ +

Methods

+ + + +

Fl_Tiled_Image::Fl_Tiled_Image(Fl_Image *img, int W, int H);

+ +

The constructors create a new tiled image containing the specified image.

+ +

Fl_Tiled_Image::~Fl_Tiled_Image();

+ +

The destructor frees all memory and server resources that are used by +the tiled image.

+ +

Fl_Image *Fl_Tiled_Image::image();

+ +

Returns the image that will be tiled.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Timer.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Timer.html new file mode 100644 index 0000000..0ef93c4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Timer.html @@ -0,0 +1,62 @@ + + + Fl_Timer + + + +

class Fl_Timer

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Timer.H>
    +
    +
+

Description

+ This is provided only to emulate the Forms Timer widget. It works by +making a timeout callback every 1/5 second. This is wasteful and +inaccurate if you just want something to happen a fixed time in the +future. You should directly call +Fl::add_timeout() instead. +

Methods

+ +

Fl_Timer::Fl_Timer(uchar type, int x, int +y, int w, int h, const char *label = 0)

+ Creates a new Fl_Timer widget using the given type, position, +size, and label string. The type parameter can be any of the +following symbolic constants: +
    +
  • FL_NORMAL_TIMER - The timer just does the callback and +displays the string "Timer" in the widget.
  • +
  • FL_VALUE_TIMER - The timer does the callback and displays +the current timer value in the widget.
  • +
  • FL_HIDDEN_TIMER - The timer just does the callback and +does not display anything.
  • +
+

virtual Fl_Timer::~Fl_Timer()

+ Destroys the timer and removes the timeout. +

char direction() const +
void direction(char d)

+ Gets or sets the direction of the timer. If the direction is zero +then the timer will count up, otherwise it will count down from the +initial value(). +

char suspended() const +
void suspended(char d)

+ Gets or sets whether the timer is suspended. +

float value() const +
void value(float)

+ Gets or sets the current timer value. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Toggle_Button.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Toggle_Button.html new file mode 100644 index 0000000..d65c136 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Toggle_Button.html @@ -0,0 +1,43 @@ + + + Fl_Toggle_Button + + + +

class Fl_Toggle_Button

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Toggle_Button.H>
    +
    +
+

Description

+

The toggle button is a push button that needs to be clicked once +to toggle on, and one more time to toggle off. +The Fl_Toggle_Button subclass displays the "on" state by +drawing a pushed-in button.

+

Buttons generate callbacks when they are clicked by the user. You +control exactly when and how by changing the values for type() +and when(). +

Methods

+ +

+Fl_Toggle_Button::Fl_Toggle_Button(int x, int y, int w, int h, const char +*label = 0)

+ Creates a new Fl_Toggle_Button widget using the given +position, size, and label string. +

+Fl_Toggle_Button::~Fl_Toggle_Button()

+ The destructor deletes the toggle button. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Tooltip.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Tooltip.html new file mode 100644 index 0000000..c671e7e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Tooltip.html @@ -0,0 +1,116 @@ + + + Fl_Tooltip + + + + + +

class Fl_Tooltip

+
+ +

Class Hierarchy

+ +
    +Fl_Tooltip
    +
+ +

Include Files

+ +
    +#include <FL/Fl_Tooltip.H>
    +
+ +

Description

+ +

The Fl_Tooltip class provides tooltip support for +all FLTK widgets.

+ +

Methods

+ + + +

void delay(float f);
+float delay();

+ +

Gets or sets the tooltip delay. The default delay is 1.0 seconds. + +

int enabled();

+ +

Returns non-zero if tooltips are enabled. + +

void enable(int b = 1);

+ +

Enables tooltips on all widgets (or disables if b is false). + +

void disable();

+ +

Same as enable(0), disables tooltips on all widgets. + +

void enter(Fl_Widget *w);

+ +

This method is called when the mouse pointer enters a +widget. + +

void enter_area(Fl_Widget* widget, int x,int y,int w,int h, const char* tip)

+ +

You may be able to use this to provide tooltips for internal pieces +of your widget. Call this after setting Fl::belowmouse() to +your widget (because that calls the above enter() method). Then figure +out what thing the mouse is pointing at, and call this with the widget +(this pointer is used to remove the tooltip if the widget is deleted +or hidden, and to locate the tooltip), the rectangle surrounding the +area, relative to the top-left corner of the widget (used to calculate +where to put the tooltip), and the text of the tooltip (which must be +a pointer to static data as it is not copied). + +

void exit(Fl_Widget *w);

+ +

This method is called when the mouse pointer leaves a +widget. + +

void color(unsigned c);
+Fl_Color color();

+ +

Gets or sets the background color for tooltips. The default +background color is a pale yellow. + +

void font(int i);
+int font();

+ +

Gets or sets the typeface for the tooltip text. + +

void hoverdelay(float f);
+float hoverdelay();

+ +

Gets or sets the tooltip hover delay, the delay between tooltips. +The default delay is 0.2 seconds. + +

void size(int s);
+int size();

+ +

Gets or sets the size of the tooltip text. + +

void textcolor(unsigned c);
+Fl_Color textcolor();

+ +

Gets or sets the color of the text in the tooltip. The default is +black. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Valuator.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Valuator.html new file mode 100644 index 0000000..7e90d96 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Valuator.html @@ -0,0 +1,199 @@ + + + Fl_Valuator + + + +

class Fl_Valuator

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Valuator.H>
    +
    +
+

Description

+ The Fl_Valuator class controls a single floating-point value +and provides a consistent interface to set the value, range, and step, +and insures that callbacks are done the same for every object. +

There are probably more of these classes in FLTK than any others:

+

Fl_Valuator widgets.

+

In the above diagram each box surrounds an actual subclass. These +are further differentiated by setting the +type() of the widget to the symbolic value labeling the +widget. The ones labelled "0" are the default versions with a +type(0). For consistency the symbol FL_VERTICAL is +defined as zero.

+

Methods

+
+ + +
+ + + + + + + +
+
+ +

Fl_Valuator::Fl_Valuator(int x, int +y, int w, int h, const char *label = 0)

+ +

Creates a new Fl_Valuator widget using the given position, +size, and label string. The default boxtype is FL_NO_BOX. + +

virtual Fl_Valuator::~Fl_Valuator()

+ +

Destroys the valuator. + +

void Fl_Valuator::bounds(double a, double b);

+ +

Sets the minimum (a) and maximum (b) values for +the valuator widget. + +

int Fl_Valuator::changed() const

+ +

This value is true if the user has moved the slider. It is +turned off by value(x) and just before doing a callback +(the callback can turn it back on if desired). + +

double Fl_Valuator::clamp(double)

+ +

Clamps the passed value to the valuator range. + +

void Fl_Valuator::clear_changed()

+ +

Clears the changed() flag. + +

int Fl_Valuator::format(char *buffer)

+ +

Uses internal rules to format the fields numerical value into +the character array pointed to by the passed parameter.

+ +

The actual format used depends on the current step value. If +the step value has been set to zero then a %g format is used. +If the step value is non-zero, then a %.*f format is used, +where the precision is calculated to show sufficient digits +for the current step value. An integer step value, such as 1 +or 1.0, gives a precision of 0, so the formatted value will +appear as an integer.

+ +

This method is used by the Fl_Value_... group of widgets to +format the current value into a text string. +The return value is the length of the formatted text. +The formatted value is written into in buffer. +buffer should have space for at least 128 bytes.

+ +

You may override this function to create your own text formatting.

+ +

double +Fl_Valuator::increment(double,int n)

+ +

Adds n times the step value to the passed value. If +step was set to zero it uses fabs(maximum() - minimum()) / +100. + +

double Fl_Valuator::maximum() const +
void Fl_Valuator::maximum(double)

+ +

Gets or sets the maximum value for the valuator. + +

double Fl_Valuator::minimum() const +
void Fl_Valuator::minimum(double)

+ +

Gets or sets the minimum value for the valuator. + +

void Fl_Valuator::precision(int digits);

+ +

Sets the step value to 1/10digits. + +

void Fl_Valuator::range(double min, +double max);

+ +

Sets the minimum and maximum values for the valuator. When +the user manipulates the widget, the value is limited to this +range. This clamping is done after rounding to the step +value (this makes a difference if the range is not a multiple of +the step). + +

The minimum may be greater than the maximum. This has the +effect of "reversing" the object so the larger values +are in the opposite direction. This also switches which end of +the filled sliders is filled.

+ +

Some widgets consider this a "soft" range. This +means they will stop at the range, but if the user releases and +grabs the control again and tries to move it further, it is +allowed.

+ +

The range may affect the display. You must redraw() +the widget after changing the range.

+ +

double Fl_Valuator::round(double)

+ +

Round the passed value to the nearest step increment. Does +nothing if step is zero. + +

void Fl_Valuator::set_changed()

+ +

Sets the changed() flag. + +

double Fl_Valuator::step() const +
void Fl_Valuator::step(double) +
void Fl_Valuator::step(int A, int B)

+ +

Gets or sets the step value. As the user moves the mouse the +value is rounded to the nearest multiple of the step value. This +is done before clamping it to the range. For most widgets +the default step is zero. + +

For precision the step is stored as the ratio of two +integers, A/B. You can set these integers directly. Currently +setting a floating point value sets the nearest A/1 or 1/B value +possible.

+ +

double Fl_Valuator::value() const +
int Fl_Valuator::value(double)

+ +

Gets or sets the current value. The new value is not +clamped or otherwise changed before storing it. Use +clamp() or round() to modify the value before +calling value(). The widget is redrawn if the new value +is different than the current one. The initial value is zero. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Input.gif b/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Input.gif new file mode 100644 index 0000000..feabbff Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Input.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Input.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Input.html new file mode 100644 index 0000000..2e776ba --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Input.html @@ -0,0 +1,115 @@ + + + Fl_Value_Input + + + + + +

class Fl_Value_Input

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_Value_Input.H>
    +
+ +

Description

+ +

The Fl_Value_Input widget displays a numeric value. +The user can click in the text field and edit it - there is in +fact a hidden Fl_Input widget with +type(FL_FLOAT_INPUT) or type(FL_INT_INPUT) in +there - and when they hit return or tab the value updates to +what they typed and the callback is done. + +

If step() is non-zero and integral, then the range of numbers +is limited to integers instead of floating point numbers. As +well as displaying the value as an integer, typed input is also +limited to integer values, even if the hidden Fl_Input widget +is of type(FL_FLOAT_INPUT).

+ +

If step() is non-zero, the user can also drag the +mouse across the object and thus slide the value. The left +button moves one step() per pixel, the middle by 10 +* step(), and the right button by 100 * step(). It +is therefore impossible to select text by dragging across it, +although clicking can still move the insertion cursor.

+ +

If step() is non-zero and integral, then the range +of numbers are limited to integers instead of floating point +values. + +

+ +

Methods

+ + +

Fl_Value_Input::Fl_Value_Input(int +x, int y, int w, int h, const char *label = 0)

+ +

Creates a new Fl_Value_Input widget using the given +position, size, and label string. The default boxtype is +FL_DOWN_BOX. + +

virtual +Fl_Value_Input::~Fl_Value_Input()

+ +

Destroys the valuator. + +

Fl_Color +Fl_Value_Input::cursor_color() const
+void Fl_Value_Input::cursor_color(Fl_Color)

+ +

Get or set the color of the text cursor. The text cursor is +black by default. + +

uchar Fl_Value_Input::soft() const
+void Fl_Value_Input::soft(uchar)

+ +

If "soft" is turned on, the user is allowed to drag +the value outside the range. If they drag the value to one of +the ends, let go, then grab again and continue to drag, they can +get to any value. The default is true. + +

Fl_Color +Fl_Value_Input::textcolor() const
+void Fl_Value_Input::textcolor(Fl_Color)

+ +

Gets or sets the color of the text in the value box. + +

Fl_Font +Fl_Value_Input::textfont() const
+void Fl_Value_Input::textfont(Fl_Font)

+ +

Gets or sets the typeface of the text in the value box. + +

uchar +Fl_Value_Input::textsize() const
+void Fl_Value_Input::textsize(uchar)

+ +

Gets or sets the size of the text in the value box. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Output.gif b/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Output.gif new file mode 100644 index 0000000..18cf45a Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Output.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Output.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Output.html new file mode 100644 index 0000000..234d27d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Output.html @@ -0,0 +1,69 @@ + + + Fl_Value_Output + + + +

class Fl_Value_Output

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Value_Output.H>
    +
    +
+

Description

+ The Fl_Value_Output widget displays a floating point value. +If step() is not zero, the user can adjust the value by +dragging the mouse left and right. The left button moves one step() + per pixel, the middle by 10 * step(), and the right button by +100 * step(). +

This is much lighter-weight than +Fl_Value_Input because it contains no text editing code or +character buffer.

+

Fl_Value_Output widget.

+

Methods

+ +

+Fl_Value_Output::Fl_Value_Output(int x, int y, int w, int h, const char +*label = 0)

+ Creates a new Fl_Value_Output widget using the given +position, size, and label string. The default boxtype is FL_NO_BOX +. +

virtual +Fl_Value_Output::~Fl_Value_Output()

+ Destroys the valuator. +

uchar Fl_Value_Output::soft() const +
void Fl_Value_Output::soft(uchar)

+ If "soft" is turned on, the user is allowed to drag the value outside +the range. If they drag the value to one of the ends, let go, then +grab again and continue to drag, they can get to any value. Default is +one. +

Fl_Color +Fl_Value_Output::textcolor() const +
void Fl_Value_Output::textcolor(Fl_Color)

+ Gets or sets the color of the text in the value box. +

Fl_Font +Fl_Value_Output::textfont() const +
+
void Fl_Value_Output::textfont(Fl_Font)

+ Gets or sets the typeface of the text in the value box. +

uchar Fl_Value_Output::textsize() +const +
void Fl_Value_Output::textsize(uchar)

+ Gets or sets the size of the text in the value box. diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Slider.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Slider.html new file mode 100644 index 0000000..a0aff36 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Value_Slider.html @@ -0,0 +1,57 @@ + + + Fl_Value_Slider + + + +

class Fl_Value_Slider

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Value_Slider.H>
    +
    +
+

Description

+ The Fl_Value_Slider widget is a Fl_Slider widget +with a box displaying the current value. +

Fl_Value_Slider widget.

+

Methods

+ +

+Fl_Value_Slider::Fl_Value_Slider(int x, int y, int w, int h, const char +*label = 0)

+ Creates a new Fl_Value_Slider widget using the given +position, size, and label string. The default boxtype is FL_DOWN_BOX +. +

virtual +Fl_Value_Slider::~Fl_Value_Slider()

+ Destroys the valuator. +

Fl_Color +Fl_Value_Slider::textcolor() const +
void Fl_Value_Slider::textcolor(Fl_Color)

+ Gets or sets the color of the text in the value box. +

Fl_Font +Fl_Value_Slider::textfont() const +
+
void Fl_Value_Slider::textfont(Fl_Font)

+ Gets or sets the typeface of the text in the value box. +

uchar Fl_Value_Slider::textsize() +const +
void Fl_Value_Slider::textsize(uchar)

+Gets or sets the size of the text in the value box. + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Widget.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Widget.html new file mode 100644 index 0000000..28ffc2f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Widget.html @@ -0,0 +1,568 @@ + + + Fl_Widget + + + +

class Fl_Widget

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Widget.H>
    +
    +
+

Description

+Fl_Widget is the base class for all widgets in FLTK. You can't +create one of these because the constructor is not public. However you +can subclass it. +

All "property" accessing methods, such as color(), +parent(), or argument() are implemented as trivial inline +functions and thus are as fast and small as accessing fields in a +structure. Unless otherwise noted, the property setting methods such as +color(n) or label(s) are also trivial inline functions, +even if they change the widget's appearance. It is up to the user code +to call redraw() after these.

+

Methods

+
+ + +
+ + + + + + + +
+
+ + +

protected Fl_Widget::Fl_Widget(int x, int y, int w, int h, const char* +label=0);

+ +

Creates a widget at the given position and size. The +Fl_Widget is a protected constructor, but all derived +widgets have a matching public constructor. It takes a value for +x(), y(), w(), h(), and an +optional value for label(). + + +

virtual Fl_Widget::~Fl_Widget();

+ +

Destroys the widget. Destroying single widgets is not very +common, and it is your responsibility to either +remove() them from any enclosing group or destroy that +group immediately after destroying the children. You +almost always want to destroy the parent group instead which +will destroy all of the child widgets and groups in that group. + + +

int Fl_Widget::active() const
+int Fl_Widget::active_r() const
+void Fl_Widget::activate()
+void Fl_Widget::deactivate()

+ +

Fl_Widget::active() returns whether the widget is +active. Fl_Widget::active_r() returns whether the +widget and all of its parents are active. Inactive widgets +will be drawn "grayed out", e.g. with less contrast than the +active widget. Inactive widgets will not receive any keyboard or +mouse button events. Other events (including FL_ENTER, +FL_MOVE, FL_LEAVE, FL_SHORTCUT, and +others) will still be sent. A widget is only active if +active() is true on it and all of its parents. + +

Changing this value will send FL_ACTIVATE or +FL_DEACTIVATE to the widget if active_r() is true. +

Currently you cannot deactivate Fl_Window widgets.

+ + +

Fl_Align Fl_Widget::align() const +
void Fl_Widget::align(Fl_Align)

+ +

Gets or sets the label alignment, which controls how the +label is displayed next to or inside the widget. The default +value is FL_ALIGN_CENTER, which centers the label +inside the widget. The value can be any of these constants +bitwise-OR'd together: + +

    +
  • FL_ALIGN_BOTTOM
  • +
  • FL_ALIGN_CENTER
  • +
  • FL_ALIGN_CLIP
  • +
  • FL_ALIGN_INSIDE
  • +
  • FL_ALIGN_LEFT
  • +
  • FL_ALIGN_RIGHT
  • +
  • FL_ALIGN_TEXT_OVER_IMAGE
  • +
  • FL_ALIGN_TOP
  • +
  • FL_ALIGN_WRAP
  • +
+ + +

long Fl_Widget::argument() const +
void Fl_Widget::argument(long)

+ +

Gets or sets the current user data (long) argument +that is passed to the callback function. + +

+ + + +
Note: + +

This is implemented by casting the long + value to a void * and may not be portable on + some machines. + +

+ + +

Fl_Boxtype Fl_Widget::box() const +
void Fl_Widget::box(Fl_Boxtype)

+ +

Gets or sets the box type for the widget, which identifies a +routine that draws the background of the widget. See Box Types for the available +types. The default depends on the widget, but is usually +FL_NO_BOX or FL_UP_BOX. + + +

typedef void (Fl_Callback)(Fl_Widget*, void*) +
Fl_Callback* Fl_Widget::callback() const +
void Fl_Widget::callback(Fl_Callback*, void* = 0) +
void Fl_Widget::callback(void (*)(Fl_Widget*, long), long = 0) +
void Fl_Widget::callback(void (*)(Fl_Widget*))

+ +

Gets or sets the current callback function for the widget. +Each widget has a single callback. + + +

int Fl_Widget::changed() const +
void Fl_Widget::clear_changed() +
void Fl_Widget::set_changed()

+ +

Fl_Widget::changed() is a flag that is turned on +when the user changes the value stored in the widget. This is +only used by subclasses of Fl_Widget that store values, +but is in the base class so it is easier to scan all the widgets +in a panel and do_callback() on the changed ones in +response to an "OK" button. + +

Most widgets turn this flag off when they do the callback, and when +the program sets the stored value.

+ + +

void Fl_Widget::clear_visible();

+ +

Hides the widget; you must still redraw the parent to see a +change in the window. Normally you want to use the hide() method instead. + + +

void Fl_Window::clear_visible_focus();

+ +

Disables keyboard focus navigation with this widget; +normally, all widgets participate in keyboard focus navigation. + + +

Fl_Color Fl_Widget::color() const +
void Fl_Widget::color(Fl_Color) +
void Fl_Widget::color(Fl_Color, Fl_Color)

+ +

Gets or sets the background color of the widget. The color is +passed to the box routine. The color is either an index into an +internal table of RGB colors or an RGB color value generated +using fl_rgb_color(). The default for most widgets is +FL_BACKGROUND_COLOR. See the enumeration list for +predefined colors. Use Fl::set_color() to +redefine colors. + +

The two color form sets both the background and selection +colors. See the description of the selection_color() +method for more information. + + +

int Fl_Widget::contains(Fl_Widget* b) const

+ +

Returns 1 if b is a child of this widget, or is +equal to this widget. Returns 0 if b is NULL. + + +

void Fl_Widget::copy_label(const char*)

+ +

Sets the current label. Unlike label(), this method +allocates a copy of the label string instead of using the +original string pointer.

+ + +

uchar Fl_Widget::damage() const
+void damage(uchar c);
+void damage(uchar c, int X, int Y, int W, int H);

+ +

The first version returns non-zero if draw() needs to be +called. The damage value is actually a bit field that the widget +subclass can use to figure out what parts to draw. + +

The last two forms set the damage bits for the widget; the +last form damages the widget within the specified bounding box. + +

static void +Fl_Widget::default_callback(Fl_Widget*, void*)

+ +

The default callback, which puts a pointer to the widget on +the queue returned by Fl::readqueue(). You +may want to call this from your own callback. + + +

Fl_Image* Fl_Widget::deimage()
+void Fl_Widget::deimage(Fl_Image* a)
+void Fl_Widget::deimage(Fl_Image& a)

+ +

Gets or sets the image to use as part of the widget label. +This image is used when drawing the widget in the inactive +state. + + +

void Fl_Widget::do_callback() +
void Fl_Widget::do_callback(Fl_Widget*, void* = 0) +
void Fl_Widget::do_callback(Fl_Widget*, long)

+ +

Causes a widget to invoke its callback function, optionally +with arbitrary arguments. + + +

virtual int Fl_Widget::handle(int event)

+ +

Handles the specified event. You normally don't call this +method directly, but instead let FLTK do it when the user +interacts with the widget.

+ +

When implemented in a new widget, this function must return 0 +if the widget does not use the event or 1 if it uses the +event.

+ + +

Fl_Image* Fl_Widget::image()
+void Fl_Widget::image(Fl_Image* a)
+void Fl_Widget::image(Fl_Image& a)

+ +

Gets or sets the image to use as part of the widget label. +This image is used when drawing the widget in the active state. + + +

int Fl_Widget::inside(const Fl_Widget* a) +const

+ +

Returns 1 if this widget is a child of a, or is +equal to a. Returns 0 if a is NULL. + + +

const char* Fl_Widget::label() const +
void Fl_Widget::label(const char*)

+ +

Get or set the current label pointer. The label is shown +somewhere on or next to the widget. The passed pointer is stored +unchanged in the widget (the string is not copied), so if +you need to set the label to a formatted value, make sure the +buffer is static, global, or allocated. The copy_label() method +can be used to make a copy of the label string +automatically.

+ + +

Fl_Color Fl_Widget::labelcolor() const +
void Fl_Widget::labelcolor(Fl_Color)

+ +

Gets or sets the label color. The default color is FL_FOREGROUND_COLOR. + + +

Fl_Font Fl_Widget::labelfont() const +
void Fl_Widget::labelfont(Fl_Font)

+ +

Gets or sets the font to use. Fonts are identified by small +8-bit indexes into a table. See the enumeration list for +predefined typefaces. The default value uses a Helvetica +typeface (Arial for Microsoft® Windows®). The function +Fl::set_font() can +define new typefaces. + + +

uchar Fl_Widget::labelsize() const +
void Fl_Widget::labelsize(uchar)

+ +

Gets or sets the font size in pixels. The default size is 14 +pixels. + + +

void Fl_Widget::label(Fl_Labeltype, +const char*) +
uchar Fl_Widget::labeltype() const +
void Fl_Widget::labeltype(Fl_Labeltype)

+ +

Gets or sets the labeltype which +identifies the function that draws the label of the widget. This +is generally used for special effects such as embossing or for +using the label() pointer as another form of data such +as an icon. The value FL_NORMAL_LABEL prints the label +as plain text. + + +

int Fl_Widget::output() const +
void Fl_Widget::clear_output() +
void Fl_Widget::set_output()

+ +

output() means the same as !active() except +it does not change how the widget is drawn. The widget will not +receive any events. This is useful for making scrollbars or +buttons that work as displays rather than input devices. + + +

Fl_Group *Fl_Widget::parent() const

+ +

Returns a pointer to the parent widget. Usually this is a Fl_Group or Fl_Window. Returns +NULL if the widget has no parent. + + +

void Fl_Widget::redraw()

+ +

Marks the widget as needing its draw() routine called. + + +

void Fl_Widget::redraw_label()

+ +

Marks the widget or the parent as needing a redraw for the +label area of a widget. + + +

virtual void +Fl_Widget::resize(int x, int y, int w, int h) +
void Fl_Widget::position(short x, short y) +
void Fl_Widget::size(short w, short h)

+ +

Change the size or position of the widget. This is a virtual +function so that the widget may implement its own handling of +resizing. The default version does not call the +redraw() method, but instead relies on the parent +widget to do so because the parent may know a faster way to +update the display, such as scrolling from the old position. + +

Some window managers under X11 call resize a lot more +often than needed. Please verify that the position or size of +a widget did actually change before doing any extensiive calculations. + +

position(x,y) is a shortcut for resize(x,y,w(),h()), +and size(w,h) is a shortcut for resize(x(),y(),w,h).

+ + +

Fl_Color +Fl_Widget::selection_color() const +
void Fl_Widget::selection_color(Fl_Color)

+ +

Gets or sets the selection color, which is defined for Forms +compatibility and is usually used to color the widget when it is +selected, although some widgets use this color for other +purposes. You can set both colors at once with +color(a,b). + + +

int Fl_Widget::takesevents() const

+ +

This is the same as (active() && !output() +&& visible()) but is faster. + + +

int Fl_Widget::take_focus()

+ Tries to make this widget be the Fl::focus() widget, by first +sending it an FL_FOCUS event, and if it returns non-zero, +setting Fl::focus() to this widget. You should use this +method to assign the focus to an widget. Returns true if the widget +accepted the focus. + + +

const char *Fl_Widget::tooltip()
+void Fl_Widget::tooltip(const char *t)

+ +

Gets or sets a string of text to display in a popup tooltip +window when the user hovers the mouse over the widget. The +string is not copied, so make sure any formatted string +is stored in a static, global, or allocated buffer. + +

If no tooltip is set, the tooltip of the parent is inherited. +Setting a tooltip for a group and setting no tooltip for a child +will show the group's tooltip instead. To avoid this behavior, +you can set the child's tooltip to an empty string +(""). + +

uchar Fl_Widget::type() const;

+ +

Returns the widget type value, which is used for Forms +compatability and to simulate RTTI. + +

short Fl_Widget::x() const +
short Fl_Widget::y() const +
short Fl_Widget::w() const +
short Fl_Widget::h() const

+ +

Returns the position of the upper-left corner of the widget +in its enclosing Fl_Window (not its parent if that is not +an Fl_Window), and its width and height. + + +

void* Fl_Widget::user_data() const +
void Fl_Widget::user_data(void*)

+ +

Gets or sets the current user data (void *) argument +that is passed to the callback function. + + +

Fl_Window* Fl_Widget::window() const;

+ +

Returns a pointer to the primary Fl_Window widget. +Returns NULL if no window is associated with this +widget. Note: for an Fl_Window widget, this returns +its parent window (if any), not this window. + + +

void Fl_Widget::set_visible();

+ +

Makes the widget visible; you must still redraw the parent +widget to see a change in the window. Normally you want to use +the show() method +instead. + + +

void Fl_Widget::set_visible_focus();

+ +

Enables keyboard focus navigation with this widget; note, +however, that this will not necessarily mean that the widget +will accept focus, but for widgets that can accept focus, this +method enables it if it has been disabled. + + +

int Fl_Widget::visible() const
+int Fl_Widget::visible_r() const
+void Fl_Widget::show()
+void Fl_Widget::hide()

+ +

An invisible widget never gets redrawn and does not get +events. The visible() method returns true if the +widget is set to be visible.The visible_r() method +returns true if the widget and all of its parents are visible. A +widget is only visible if visible() is true on it +and all of its parents. + +

Changing it will send FL_SHOW or FL_HIDE +events to the widget. Do not change it if the parent is not +visible, as this will send false FL_SHOW or FL_HIDE + events to the widget. redraw() is called if necessary on +this or the parent. + +

void Fl_Widget::visible_focus(int);
+int Fl_Widget::visible_focus();

+ +

Modifies keyboard focus navigation. +See set_visible_focus() and +clear_visible_focus(). +The second form returns non-zero if this widget will participate in keyboard focus navigation. + +

Fl_When Fl_Widget::when() const +
void Fl_Widget::when(Fl_When)

+ +

Fl_Widget::when() is a set of bitflags used by +subclasses of Fl_Widget to decide when to do the +callback. If the value is zero then the callback is never +done. Other values are described in the individual widgets. +This field is in the base class so that you can scan a panel and +do_callback() on all the ones that don't do their own +callbacks in response to an "OK" button. + + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Window.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Window.html new file mode 100644 index 0000000..d8d2198 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Window.html @@ -0,0 +1,290 @@ + + + Fl_Window + + + +

class Fl_Window

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/Fl_Window.H>
    +
    +
+

Description

+ This widget produces an actual window. This can either be a main +window, with a border and title and all the window management controls, +or a "subwindow" inside a window. This is controlled by whether or not +the window has a parent(). +

Once you create a window, you usually add children Fl_Widget +'s to it by using window->add(child) for each new widget. See Fl_Group for more information +on how to add and remove children.

+

There are several subclasses of Fl_Window that provide +double-buffering, overlay, menu, and OpenGL support.

+

The window's callback is done if the user tries to close a window +using the window manager and +Fl::modal() is zero or equal to the window. Fl_Window + has a default callback that calls Fl_Window::hide().

+

Methods

+
+ + +
+ + + + + + + + + +
+
+

Fl_Window::Fl_Window(int w, int h, const char *title = 0)
+Fl_Window::Fl_Window(int x, int y, int w, int h, const char *title = 0)

+ +

Creates a new window. If Fl_Group::current() +is not NULL, the window is created as a subwindow of +the parent window.

+ +

The first form of the constructor creates a top-level window +and asks the window manager to position the window. The second +form of the constructor either creates a subwindow or a +top-level window at the specified location, subject to window +manager configuration. If you do not specify the position of the +window, the window manager will pick a place to show the window +or allow the user to pick a location. Use position(x,y) +or hotspot() before calling show() to request a +position on the screen. See +Fl_Window::resize() for some more details on positioning +windows.

+ +

Top-level windows initially have visible() set to 0 +and parent() set to NULL. Subwindows initially +have visible() set to 1 and parent() set to +the parent window pointer.

+ +

Fl_Widget::box() defaults to FL_FLAT_BOX. If you +plan to completely fill the window with children widgets you should +change this to FL_NO_BOX. If you turn the window border off +you may want to change this to FL_UP_BOX.

+ +

virtual Fl_Window::~Fl_Window()

+ The destructor also deletes all the children. This allows a +whole tree to be deleted at once, without having to keep a pointer to +all the children in the user code. A kludge has been done so the +Fl_Window and all of its children can be automatic (local) +variables, but you must declare the Fl_Window first so +that it is destroyed last. +

void Fl_Window::size_range(int minw, +int minh, int maxw=0, int maxh=0, int dw=0, int dh=0, int aspect=0)

+ Set the allowable range the user can resize this window to. This only +works for top-level windows. +
    +
  • minw and minh are the smallest the window can +be. Either value must be greater than 0.
  • +
  • maxw and maxh are the largest the window can be. + If either is equal to the minimum then you cannot resize in +that direction. If either is zero then FLTK picks a maximum size in +that direction such that the window will fill the screen.
  • +
  • dw and dh are size increments. The window will +be constrained to widths of minw + N * dw, where N + is any non-negative integer. If these are less or equal to 1 they +are ignored. (this is ignored on WIN32)
  • +
  • aspect is a flag that indicates that the window should + preserve its aspect ratio. This only works if both the maximum and + minimum have the same aspect ratio. (ignored on WIN32 and by many X + window managers)
  • +
+ If this function is not called, FLTK tries to figure out the range +from the setting of resizable(): +
    +
  • If resizable() is NULL (this is the default) +then the window cannot be resized and the resize border and max-size +control will not be displayed for the window.
  • +
  • If either dimension of resizable() is less than 100, +then that is considered the minimum size. Otherwise the +resizable() has a minimum size of 100.
  • +
  • If either dimension of resizable() is zero, then that is +also the maximum size (so the window cannot resize in that direction).
  • +
+ It is undefined what happens if the current size does not fit in the +constraints passed to size_range(). +

virtual void Fl_Window::show() +
void Fl_Window::show(int argc, char **argv)

+Put the window on the screen. Usually this has the side effect of +opening the display. The second form is used for top-level +windows and allows standard arguments to be parsed from the +command-line. +

If the window is already shown then it is restored and raised to the +top. This is really convenient because your program can call show() + at any time, even if the window is already up. It also means that +show() serves the purpose of raise() in other toolkits.

+

virtual void Fl_Window::hide()

+ Remove the window from the screen. If the window is already hidden or +has not been shown then this does nothing and is harmless. +

int Fl_Window::shown() const

+ Returns non-zero if show() has been called (but not hide() +). You can tell if a window is iconified with (w->shown() +&& !w->visible()). +

void Fl_Window::iconize()

+ Iconifies the window. If you call this when shown() is false +it will show() it as an icon. If the window is already +iconified this does nothing. +

Call show() to restore the window.

+

When a window is iconified/restored (either by these calls or by the +user) the handle() method is called with FL_HIDE and +FL_SHOW events and visible() is turned on and off.

+

There is no way to control what is drawn in the icon except with the +string passed to Fl_Window::xclass(). You should not rely on +window managers displaying the icons.

+

void Fl_Window::resize(int,int,int,int)

+ Change the size and position of the window. If shown() is +true, these changes are communicated to the window server (which may +refuse that size and cause a further resize). If shown() is +false, the size and position are used when show() is called. +See Fl_Group for the effect +of resizing on the child widgets. +

You can also call the Fl_Widget methods size(x,y) + and position(w,h), which are inline wrappers for this virtual +function.

+

A top-level window can not force, but merely suggest a position and +size to the operating system. The window manager may not be willing or +able to display a window at the desired position or with the given +dimensions. It is up to the application developer to verify window +parameters after the resize request. +

void Fl_Window::free_position()

+ Undoes the effect of a previous resize() or show() + so that the next time show() is called the window manager is +free to position the window. +

void Fl_Window::hotspot(int x, int y, int +offscreen = 0) +
void Fl_Window::hotspot(const Fl_Widget*, int offscreen = 0) +
void Fl_Window::hotspot(const Fl_Widget&, int offscreen = 0)

+position() the window so that the mouse is pointing at the +given position, or at the center of the given widget, which may be the +window itself. If the optional offscreen parameter is +non-zero, then the window is allowed to extend off the screen (this +does not work with some X window managers). +

void Fl_Window::fullscreen()

+ Makes the window completely fill the screen, without any window +manager border visible. You must use fullscreen_off() to undo +this. This may not work with all window managers. +

int Fl_Window::fullscreen_off(int +x, int y, int w, int h)

+ Turns off any side effects of fullscreen() and does +resize(x,y,w,h). +

int Fl_Window::border(int) +
uchar Fl_Window::border() const

+ Gets or sets whether or not the window manager border is around the +window. The default value is true. border(n) can be used to +turn the border on and off, and returns non-zero if the value has been +changed. Under most X window managers this does not work after +show() has been called, although SGI's 4DWM does work. +

void Fl_Window::clear_border()

+clear_border() is a fast inline function to turn the border +off. It only works before show() is called. +

void Fl_Window::set_modal()

+ A "modal" window, when shown(), will prevent any events from +being delivered to other windows in the same program, and will also +remain on top of the other windows (if the X window manager supports +the "transient for" property). Several modal windows may be shown at +once, in which case only the last one shown gets events. You can see +which window (if any) is modal by calling +Fl::modal(). +

uchar Fl_Window::modal() const

+ Returns true if this window is modal. +

void Fl_Window::set_non_modal()

+ A "non-modal" window (terminology borrowed from Microsoft Windows) +acts like a modal() one in that it remains on top, but it has +no effect on event delivery. There are three states for a +window: modal, non-modal, and normal. +

uchar Fl_Window::non_modal() const

+ Returns true if this window is modal or non-modal. +

void Fl_Window::label(const char*) +
const char* Fl_Window::label() const

+ Gets or sets the window title bar label. +

void Fl_Window::iconlabel(const char*) +
const char* Fl_Window::iconlabel() const

+ Gets or sets the icon label. +

void Fl_Window::xclass(const char*) +
const char* Fl_Window::xclass() const

+ A string used to tell the system what type of window this is. Mostly +this identifies the picture to draw in the icon. Under X, this is +turned into a XA_WM_CLASS pair by truncating at the first +non-alphanumeric character and capitalizing the first character, and +the second one if the first is 'x'. Thus "foo" turns into "foo, Foo", +and "xprog.1" turns into "xprog, XProg". This only works if called +before calling show(). +

Under Microsoft Windows this string is used as the name of the +WNDCLASS structure, though it is not clear if this can have any +visible effect. The passed pointer is stored unchanged. The string +is not copied.

+

void Fl_Window::make_current()

+make_current() sets things up so that the drawing functions in <FL/fl_draw.H> will go into this +window. This is useful for incremental update of windows, such as in an +idle callback, which will make your program behave much better if it +draws a slow graphic. Danger: incremental update is very hard to +debug and maintain! +

This method only works for the Fl_Window and +Fl_Gl_Window classes.

+

static Fl_Window* Fl_Window::current()

+ Returns the last window that was made current. +

void Fl_Window::cursor(Fl_Cursor, Fl_Color = FL_WHITE, Fl_Color = FL_BLACK)

+Change the cursor for this window. This always calls the system, if +you are changing the cursor a lot you may want to keep track of how +you set it in a static variable and call this only if the new cursor +is different. + +

The type Fl_Cursor is an enumeration defined in <FL/Enumerations.H>. +(Under X you can get any XC_cursor value by passing +Fl_Cursor((XC_foo/2)+1)). The colors only work on X, they are +not implemented on WIN32. + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_Wizard.html b/third_party/windows/fltk-1.1.10/documentation/Fl_Wizard.html new file mode 100644 index 0000000..4cb7c9c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_Wizard.html @@ -0,0 +1,73 @@ + + + Fl_Wizard + + + + +

class Fl_Wizard

+ +
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include "Fl_Wizard.h"
    +
+ +

Description

+ +

The Fl_Wizard widget is based off the Fl_Tabs +widget, but instead of displaying tabs it only changes "tabs" under +program control. Its primary purpose is to support "wizards" that +step a user through configuration or troubleshooting tasks. + +

As with Fl_Tabs, wizard panes are composed of child (usually +Fl_Group) widgets. Navigation buttons must be added separately. + +

Methods

+ + + +

Fl_Wizard(int xx, int yy, int ww, int hh, const char *l = 0)

+ +

The constructor creates the Fl_Wizard widget at the specified +position and size. + +

~Fl_Wizard()

+ +

The destructor destroys the widget and its children. + +

void next()

+ +

This method shows the next child of the wizard. If the last child +is already visible, this function does nothing. + +

void prev()

+ +

This method shows the previous child of the wizard. If the first child +is already visible, this function does nothing. + +

void value(Fl_Widget *w)
+Fl_Widget *value()

+ +

Sets or gets the child widget that is visible. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_XBM_Image.html b/third_party/windows/fltk-1.1.10/documentation/Fl_XBM_Image.html new file mode 100644 index 0000000..fa0e2fb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_XBM_Image.html @@ -0,0 +1,57 @@ + + + Fl_XBM_Image + + + + + +

class Fl_XBM_Image

+
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_XBM_Image.H>
    +
+ +

Additional Libraries

+ +
    +-lfltk_images  /  fltkimages.lib
    +
+ +

Description

+ +

The Fl_XBM_Image class supports loading, caching, +and drawing of X Bitmap (XBM) bitmap files.

+ +

Methods

+ + + +

Fl_XBM_Image::Fl_XBM_Image(const char *filename);

+ +

The constructor loads the named XBM file.

+ +

Fl_XBM_Image::~Fl_XBM_Image();

+ +

The destructor free all memory and server resources that are used by +the image.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Fl_XPM_Image.html b/third_party/windows/fltk-1.1.10/documentation/Fl_XPM_Image.html new file mode 100644 index 0000000..67c6612 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Fl_XPM_Image.html @@ -0,0 +1,57 @@ + + + Fl_XPM_Image + + + + + +

class Fl_XPM_Image

+
+ +

Class Hierarchy

+ + + +

Include Files

+ +
    +#include <FL/Fl_XPM_Image.H>
    +
+ +

Additional Libraries

+ +
    +-lfltk_images  /  fltkimages.lib
    +
+ +

Description

+ +

The Fl_XPM_Image class supports loading, caching, +and drawing of X Pixmap (XPM) images, including transparency.

+ +

Methods

+ + + +

Fl_XPM_Image::Fl_XPM_Image(const char *filename);

+ +

The constructor loads the named XPM image.

+ +

Fl_XPM_Image::~Fl_XPM_Image();

+ +

The destructor free all memory and server resources that are used by +the image.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/Makefile b/third_party/windows/fltk-1.1.10/documentation/Makefile new file mode 100644 index 0000000..099e2d5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/Makefile @@ -0,0 +1,299 @@ +# +# "$Id: Makefile 5663 2007-02-06 19:35:28Z mike $" +# +# Documentation makefile for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2007 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems on the following page: +# +# http://www.fltk.org/str.php +# + +# Get configuration stuff... +include ../makeinclude + +# What media size to use: + +# "Universal" size - minimum of US Letter and A4 +MEDIA = --size universal + +# Standard US Letter +#MEDIA = --size letter + +# Standard A4 +#MEDIA = --size a4 + +# 7x8.5in (1/2 legal page) with reduced-size fonts +#MEDIA = --size 7x8.5in --fontsize 9.0 + +# These are the HTML "source" files... +HTMLFILES = \ + preface.html \ + intro.html \ + basics.html \ + common.html \ + editor.html \ + drawing.html \ + events.html \ + subclassing.html \ + opengl.html \ + fluid.html \ + advanced.html \ + widgets.html \ + Fl.html \ + Fl_Adjuster.html \ + Fl_Bitmap.html \ + Fl_BMP_Image.html \ + Fl_Box.html \ + Fl_Browser_.html \ + Fl_Browser.html \ + Fl_Button.html \ + Fl_Chart.html \ + Fl_Check_Browser.html \ + Fl_Check_Button.html \ + Fl_Choice.html \ + Fl_Clock.html \ + Fl_Clock_Output.html \ + Fl_Color_Chooser.html \ + Fl_Counter.html \ + Fl_Dial.html \ + Fl_Double_Window.html \ + Fl_End.html \ + Fl_File_Browser.html \ + Fl_File_Chooser.html \ + Fl_File_Icon.html \ + Fl_File_Input.html \ + Fl_Float_Input.html \ + Fl_Free.html \ + Fl_GIF_Image.html \ + Fl_Gl_Window.html \ + Fl_Group.html \ + Fl_Help_Dialog.html \ + Fl_Help_View.html \ + Fl_Hold_Browser.html \ + Fl_Image.html \ + Fl_Input.html \ + Fl_Input_.html \ + Fl_Input_Choice.html \ + Fl_Int_Input.html \ + Fl_JPEG_Image.html \ + Fl_Light_Button.html \ + Fl_Menu_.html \ + Fl_Menu_Bar.html \ + Fl_Menu_Button.html \ + Fl_Menu_Item.html \ + Fl_Menu_Window.html \ + Fl_Multi_Browser.html \ + Fl_Multiline_Input.html \ + Fl_Multiline_Output.html \ + Fl_Output.html \ + Fl_Overlay_Window.html \ + Fl_Pack.html \ + Fl_Pixmap.html \ + Fl_PNG_Image.html \ + Fl_PNM_Image.html \ + Fl_Positioner.html \ + Fl_Preferences.html \ + Fl_Progress.html \ + Fl_Repeat_Button.html \ + Fl_RGB_Image.html \ + Fl_Return_Button.html \ + Fl_Roller.html \ + Fl_Round_Button.html \ + Fl_Scroll.html \ + Fl_Scrollbar.html \ + Fl_Secret_Input.html \ + Fl_Select_Browser.html \ + Fl_Shared_Image.html \ + Fl_Single_Window.html \ + Fl_Slider.html \ + Fl_Spinner.html \ + Fl_Tabs.html \ + Fl_Text_Buffer.html \ + Fl_Text_Display.html \ + Fl_Text_Editor.html \ + Fl_Tile.html \ + Fl_Tiled_Image.html \ + Fl_Timer.html \ + Fl_Toggle_Button.html \ + Fl_Tooltip.html \ + Fl_Valuator.html \ + Fl_Value_Input.html \ + Fl_Value_Output.html \ + Fl_Value_Slider.html \ + Fl_Widget.html \ + Fl_Window.html \ + Fl_Wizard.html \ + Fl_XBM_Image.html \ + Fl_XPM_Image.html \ + functions.html \ + enumerations.html \ + glut.html \ + forms.html \ + osissues.html \ + migration.html \ + license.html \ + examples.html + +IMAGEFILES = \ + adjuster1.gif \ + boxtypes.gif \ + buttons.gif \ + charts.gif \ + choice.gif \ + clock.gif \ + counter.gif \ + cubeview.gif \ + dial.gif \ + editor.gif \ + editor-replace.gif \ + fl_alert.gif \ + fl_ask.gif \ + Fl_Check_Button.gif \ + fl_choice.gif \ + fl_color_chooser.jpg \ + Fl_File_Chooser.jpg \ + Fl_File_Input.gif \ + FL.gif \ + Fl_Help_Dialog.gif \ + fl_input.gif \ + Fl_Light_Button.gif \ + fl_message.gif \ + fl_password.gif \ + Fl_Return_Button.gif \ + Fl_Roller.gif \ + Fl_Round_Button.gif \ + Fl_Scroll.gif \ + fl_show_colormap.gif \ + Fl_Tile.gif \ + fluid1.gif \ + fluid2.gif \ + fluid3-cxx.gif \ + fluid3-gui.gif \ + fluid3-style.gif \ + fluid4.gif \ + fluid-catgets.gif \ + fluid-gettext.gif \ + fluid-org.gif \ + fluid_prefs.gif \ + fluid_widget_cxx.gif \ + fluid_widget_gui.gif \ + fluid_widget_style.gif \ + Fl_Value_Input.gif \ + Fl_Value_Output.gif \ + hello.C.gif \ + input_choice.jpg \ + menubar.gif \ + menu_button.gif \ + menu.gif \ + positioner.gif \ + resizebox1.gif \ + resizebox2.gif \ + round_clock.gif \ + scrollbar.gif \ + slider.gif \ + symbols.gif \ + tabs.gif \ + text.gif \ + valuators.gif \ + value_slider.gif + + +MANPAGES = fltk.$(CAT3EXT) fltk-config.$(CAT1EXT) fluid.$(CAT1EXT) \ + blocks.$(CAT6EXT) checkers.$(CAT6EXT) sudoku.$(CAT6EXT) + +all: $(MANPAGES) + +alldocs: fltk.ps fltk.pdf fltk.d/index.html $(MANPAGES) + +clean: + $(RM) fltk.ps + $(RM) fltk.pdf + $(RMDIR) fltk.d + $(RM) *~ *.bck *.bck + +depend: + +install: $(MANPAGES) + echo "Installing documentation files in $(DESTDIR)$(docdir)..." + -$(INSTALL_DIR) $(DESTDIR)$(docdir) + for file in $(HTMLFILES) $(IMAGEFILES) index.html; do \ + $(INSTALL_DATA) $$file $(DESTDIR)$(docdir); \ + done + echo "Installing man pages in $(DESTDIR)$(mandir)..." + -$(INSTALL_DIR) $(DESTDIR)$(mandir)/cat1 + $(INSTALL_MAN) fluid.$(CAT1EXT) $(DESTDIR)$(mandir)/cat1 + $(INSTALL_MAN) fltk-config.$(CAT1EXT) $(DESTDIR)$(mandir)/cat1 + -$(INSTALL_DIR) $(DESTDIR)$(mandir)/cat3 + $(INSTALL_MAN) fltk.$(CAT3EXT) $(DESTDIR)$(mandir)/cat3 + -$(INSTALL_DIR) $(DESTDIR)$(mandir)/man1 + $(INSTALL_MAN) fluid.man $(DESTDIR)$(mandir)/man1/fluid.1 + $(INSTALL_MAN) fltk-config.man $(DESTDIR)$(mandir)/man1/fltk-config.1 + -$(INSTALL_DIR) $(DESTDIR)$(mandir)/man3 + $(INSTALL_MAN) fltk.man $(DESTDIR)$(mandir)/man3/fltk.3 + +install-linux install-osx: + -$(INSTALL_DIR) $(DESTDIR)$(mandir)/cat6 + $(INSTALL_MAN) blocks.$(CAT6EXT) $(DESTDIR)$(mandir)/cat6 + $(INSTALL_MAN) checkers.$(CAT6EXT) $(DESTDIR)$(mandir)/cat6 + $(INSTALL_MAN) sudoku.$(CAT6EXT) $(DESTDIR)$(mandir)/cat6 + -$(INSTALL_DIR) $(DESTDIR)$(mandir)/man6 + $(INSTALL_MAN) blocks.man $(DESTDIR)$(mandir)/man6/blocks.6 + $(INSTALL_MAN) checkers.man $(DESTDIR)$(mandir)/man6/checkers.6 + $(INSTALL_MAN) sudoku.man $(DESTDIR)$(mandir)/man6/sudoku.6 + + +uninstall: + $(RMDIR) $(DESTDIR)$(docdir) + $(RM) $(DESTDIR)$(mandir)/cat1/fluid.$(CAT1EXT) + $(RM) $(DESTDIR)$(mandir)/man1/fluid.1 + $(RM) $(DESTDIR)$(mandir)/cat1/fltk-config.$(CAT1EXT) + $(RM) $(DESTDIR)$(mandir)/man1/fltk-config.1 + $(RM) $(DESTDIR)$(mandir)/cat3/fltk.$(CAT3EXT) + $(RM) $(DESTDIR)$(mandir)/man3/fltk.3 + +uninstall-linux uninstall-osx: + $(RM) $(DESTDIR)$(mandir)/cat6/blocks.$(CAT6EXT) + $(RM) $(DESTDIR)$(mandir)/cat6/checkers.$(CAT6EXT) + $(RM) $(DESTDIR)$(mandir)/cat6/sudoku.$(CAT6EXT) + $(RM) $(DESTDIR)$(mandir)/man6/blocks.6 + $(RM) $(DESTDIR)$(mandir)/man6/checkers.6 + $(RM) $(DESTDIR)$(mandir)/man6/sudoku.6 + +# Base html files are now the readable ones, so this target is not make by +# default... +fltk.d/index.html: $(HTMLFILES) $(IMAGEFILES) + echo "Generating HTML documentation..." + -$(RMDIR) fltk.d + -$(INSTALL_DIR) fltk.d + -$(HTMLDOC) --verbose --batch fltk.book -d fltk.d -t html + +fltk.ps: $(HTMLFILES) $(IMAGEFILES) + echo "Generating PostScript documentation..." + $(RM) fltk.ps + -$(HTMLDOC) --verbose --batch fltk.book $(MEDIA) -f fltk.ps + +fltk.pdf: $(HTMLFILES) $(IMAGEFILES) + echo "Generating PDF documentation..." + $(RM) fltk.pdf + -$(HTMLDOC) --verbose --batch fltk.book $(MEDIA) -f fltk.pdf + +# +# End of "$Id: Makefile 5663 2007-02-06 19:35:28Z mike $". +# diff --git a/third_party/windows/fltk-1.1.10/documentation/README b/third_party/windows/fltk-1.1.10/documentation/README new file mode 100644 index 0000000..b7b9a12 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/README @@ -0,0 +1,21 @@ +README +------ + +The documentation in this directory is in HTML format. To read it just +point your browser at the "index.html" file. A slightly more browseable +version is accessable at the FLTK web site, along with PostScript(tm) +and PDF versions of the manual. + +You can generate your own (printable) copy of the manual by typing +"make" in this directory. You will need to have the HTMLDOC software +installed on your system. HTMLDOC can be downloaded from: + + http://www.easysw.com/htmldoc + +The default media size is 8.27x11.0" (210x279mm), which is the lesser +of A4 and US Letter sizes. You can change this in the makefile by +uncommenting the corresponding media size or defining your own. + +If you find any typos, things that are unclear, or would like to +contribute an example, section, or chapter to the FLTK manual, please +contact Michael Sweet (mike@easysw.com). diff --git a/third_party/windows/fltk-1.1.10/documentation/adjuster1.gif b/third_party/windows/fltk-1.1.10/documentation/adjuster1.gif new file mode 100644 index 0000000..1f9f535 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/adjuster1.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/advanced.html b/third_party/windows/fltk-1.1.10/documentation/advanced.html new file mode 100644 index 0000000..8486095 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/advanced.html @@ -0,0 +1,95 @@ + + + 10 - Advanced FLTK + + + +

10 - Advanced FLTK

+ +

This chapter explains advanced programming and design topics +that will help you to get the most out of FLTK.

+ +

Multithreading

+ +

FLTK supports multithreaded application using a locking mechanism based on "pthreads". We do not provide a threading interface as part of the library. However a simple example how threads can be implemented for all supported platforms can be found in test/threads.h and test/threads.cxx. + +

To use the locking mechanism, FLTK must be compiled with --enable-threads set during the configure process. IDE-based versions of FLTK are automatically compiled with locking enabled if possible. + +

In main(), call Fl::lock() before Fl::run() or Fl::wait() to start the runtime multithreading support for your program. All callbacks and derived functions like handle() and draw() will now be properly locked:

+ +
+    int main() {
+      Fl::lock();
+      /* run thread */
+      while (Fl::wait() > 0) {
+        if (Fl::thread_message()) {
+          /* process your data */
+        }
+      }
+    }
+
+ +

You can now start as many threads as you like. From within +a thread (other than the main thread) FLTK calls must be wrapped +with calls to Fl::lock() +and Fl::unlock(): + +

+    Fl::lock();      // avoid conflicting calls
+    ...              // your code here
+    Fl::unlock();    // allow other threads to access FLTK again
+
+ +

You can send messages from child threads to the main thread +using Fl::awake(msg):

+ +
+    void *msg;       // "msg" is a pointer to your message
+    Fl::awake(msg);  // send "msg" to main thread
+
+ +

You can also tell the main thread to call a function for you +as soon as possible by using +Fl::awake(callback, userdata):

+ +
+    void do_something(void *userdata) {
+      // running with the main thread
+    }
+
+    // running in another thread
+    void *data;       // "data" is a pointer to your user data
+    Fl::awake(do_something, data);  // call something in main thread
+
+ + +

FLTK supports multiple platforms, some of them which do not +allow any other but the main thread to handle system events and +open or close windows. The safe thing to do is to adhere to the +following rules for threads on all operating systems: + +

    + +
  • Don't show() or hide()anything that contains +widgets derived from Fl_Window, including dialogs, file +choosers, subwindows or Fl_GL_Windows
  • + +
  • Don't call Fl::wait(), Fl::flush() or any +related methods that will handle system messages
  • + +
  • Don't start or cancel timers
  • + +
  • Don't change window decorations or titles
  • + +
  • The make_current() method may or may not work well for regular windows, but should always work for Fl_GL_Windows to allow for high speed rendering on graphics cards with multiple pipelines
  • + +
+ +

See also: +void awake(void *message), +void lock(), +void *thread_message(), +void unlock(). + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/basics.html b/third_party/windows/fltk-1.1.10/documentation/basics.html new file mode 100644 index 0000000..e596fb9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/basics.html @@ -0,0 +1,368 @@ + + + 2 - FLTK Basics + + + +

2 - FLTK Basics

+ +

This chapter teaches you the basics of compiling programs +that use FLTK.

+ +

Writing Your First FLTK Program

+ +

All programs must include the file <FL/Fl.H>. +In addition the program must include a header file for each +FLTK class it uses. Listing 1 shows a simple "Hello, +World!" program that uses FLTK to display the window.

+ + + + + +

After including the required header files, the program then creates a +window. All following widgets will automatically be children of this window.

+ +
    +Fl_Window *window = new Fl_Window(300,180);
    +
+ +

Then we create a box with the "Hello, World!" string in it. FLTK automatically adds +the new box to window, the current grouping widget.

+ +
    +Fl_Box *box = new Fl_Box(20,40,260,100,"Hello, World!");
    +
+ +

Next, we set the type of box and the size, font, and style of the label:

+ + + +

We tell FLTK that we will not add any more widgets to window.

+ +
    +window->end();
    +
+ +

Finally, we show the window and enter the FLTK event loop:

+ + + +

The resulting program will display the window in Figure 2-1. +You can quit the program by closing the window or pressing the +ESCape key.

+ +

Hello, World! Window
+Figure 2-1: The Hello, World! Window

+ +

Creating the Widgets

+ +

The widgets are created using the C++ new operator. For +most widgets the arguments to the constructor are:

+ +
    +Fl_Widget(x, y, width, height, label)
    +
+ +

The x and y parameters determine where the +widget or window is placed on the screen. In FLTK the top left +corner of the window or screen is the origin (i.e. x = 0, y = +0) and the units are in pixels.

+ +

The width and height parameters determine +the size of the widget or window in pixels. The maximum widget +size is typically governed by the underlying window system or +hardware.

+ +

label is a pointer to a character string to label +the widget with or NULL. If not specified the label +defaults to NULL. The label string must be in static +storage such as a string constant because FLTK does not make a +copy of it - it just uses the pointer.

+ +

Creating Widget hierarchies

+ +

Widgets are commonly ordered into functional groups, which +in turn may be grouped again, creating a hierarchy of widgets. +FLTK makes it easy to fill groups by automatically adding all widgets +that are created between a myGroup->begin() and +myGroup->end(). In this example, myGroup +would be the current group.

+ +

Newly created groups and their derived widgets implicitly call +begin() in the constructor, effectively adding all +subsequently created widgets to itself until end() +is called.

+ +

Setting the current group to NULL will stop automatic +hierarchies. New widgets can now be added manually using +Fl_Group::add(...) and Fl_Group::insert(...).

+ +

Get/Set Methods

+ +

box->box(FL_UP_BOX) sets the type of box the +Fl_Box draws, changing it from the default of +FL_NO_BOX, which means that no box is drawn. In our +"Hello, World!" example we use FL_UP_BOX, +which means that a raised button border will be drawn around +the widget. You can learn more about boxtypes in +Chapter 3.

+ +

You could examine the boxtype in by doing +box->box(). FLTK uses method name overloading to make +short names for get/set methods. A "set" method is always of +the form "void name(type)", and a "get" method is always +of the form "type name() const".

+ +

Redrawing After Changing Attributes

+ +

Almost all of the set/get pairs are very fast, short inline +functions and thus very efficient. However, the "set" methods +do not call redraw() - you have to call it +yourself. This greatly reduces code size and execution time. The +only common exceptions are value() which calls +redraw() and label() which calls +redraw_label() if necessary.

+ +

Labels

+ +

All widgets support labels. In the case of window widgets, +the label is used for the label in the title bar. Our example +program calls the +labelfont, + labelsize, +and labeltype +methods.

+ +

The labelfont method sets the typeface and style +that is used for the label, which for this example we are using +FL_BOLD and FL_ITALIC. You can also specify +typefaces directly.

The labelsize method sets +the height of the font in pixels.

The labeltype +method sets the type of label. FLTK supports normal, embossed, +and shadowed labels internally, and more types can be added as +desired.

+ +

A complete list of all label options can be found in +Chapter 3.

+ +

Showing the Window

+ +

The show() method shows the widget or window. For windows +you can also provide the command-line arguments to allow users to +customize the appearance, size, and position of your windows.

+ +

The Main Event Loop

+ +

All FLTK applications (and most GUI applications in general) +are based on a simple event processing model. User actions such +as mouse movement, button clicks, and keyboard activity generate +events that are sent to an application. The application may then +ignore the events or respond to the user, typically by redrawing +a button in the "down" position, adding the text to an input +field, and so forth.

+ +

FLTK also supports idle, timer, and file pseudo-events that +cause a function to be called when they occur. Idle functions +are called when no user input is present and no timers or files +need to be handled - in short, when the application is not doing +anything. Idle callbacks are often used to update a 3D display +or do other background processing.

+ +

Timer functions are called after a specific amount of time +has expired. They can be used to pop up a progress dialog after +a certain amount of time or do other things that need to happen +at more-or-less regular intervals. FLTK timers are not 100% +accurate, so they should not be used to measure time intervals, +for example.

+ +

File functions are called when data is ready to read or +write, or when an error condition occurs on a file. They are +most often used to monitor network connections (sockets) for +data-driven displays.

+ +

FLTK applications must periodically check +(Fl::check()) or wait (Fl::wait()) for events +or use the Fl::run() +method to enter a standard event processing loop. Calling +Fl::run() is equivalent to the following code:

+ +
    +while (Fl::wait());
    +
+ +

Fl::run() does not return until all of the windows +under FLTK control are closed by the user or your program.

+ +

Compiling Programs with Standard Compilers

+ +

Under UNIX (and under Microsoft Windows when using the GNU development +tools) you will probably need to tell the compiler where to find the +header files. This is usually done using the -I option:

+ +
    +CC -I/usr/local/include ...
    +gcc -I/usr/local/include ...
    +
+ +

The fltk-config script included with FLTK can be +used to get the options that are required by your compiler:

+ +
    +CC `fltk-config --cxxflags` ...
    +
+ +

Similarly, when linking your application you will need to tell the +compiler to use the FLTK library:

+ +
    +CC ... -L/usr/local/lib -lfltk -lXext -lX11 -lm
    +gcc ... -L/usr/local/lib -lfltk -lXext -lX11 -lm
    +
+ +

Aside from the "fltk" library, there is also a "fltk_forms" +library for the XForms compatibility classes, "fltk_gl" for the +OpenGL and GLUT classes, and "fltk_images" for the image file +classes, Fl_Help_Dialog +widget, and system icon support. + +

+ + + +
Note: +

The libraries are named "fltk.lib", "fltkgl.lib", "fltkforms.lib", + and "fltkimages.lib", respectively under Windows. +

+ +

As before, the fltk-config script included with FLTK can be +used to get the options that are required by your linker:

+ +
    +CC ... `fltk-config --ldflags`
    +
+ + + +

The forms, GL, and images libraries are included with the "--use-foo" +options, as follows: + +

    +CC ... `fltk-config --use-forms --ldflags`
    +CC ... `fltk-config --use-gl --ldflags`
    +CC ... `fltk-config --use-images --ldflags`
    +CC ... `fltk-config --use-forms --use-gl --use-images --ldflags`
    +
+ +

Finally, you can use the fltk-config script to +compile a single source file as a FLTK program: + +

    +fltk-config --compile filename.cpp
    +fltk-config --use-forms --compile filename.cpp
    +fltk-config --use-gl --compile filename.cpp
    +fltk-config --use-images --compile filename.cpp
    +fltk-config --use-forms --use-gl --use-images --compile filename.cpp
    +
+ +

Any of these will create an executable named filename. + +

Compiling Programs with Microsoft Visual C++

+ +

In Visual C++ you will need to tell the compiler where to +find the FLTK header files. This can be done by selecting +"Settings" from the "Project" menu and then +changing the "Preprocessor" settings under the +"C/C++" tab. You will also need to add the FLTK (FLTK.LIB +or FLTKD.LIB), the Windows Common Controls (COMCTRL32.LIB), and +WinSock (WSOCK32.LIB) libraries to the "Link" +settings.

+ +

You can build your Microsoft Windows applications as Console or +WIN32 applications. If you want to use the standard C main() +function as the entry point, FLTK includes a WinMain() +function that will call your main() function for you.

+ +

Note: The Visual C++ 5.0 optimizer is known to cause problems with +many programs. We only recommend using the "Favor Small Code" +optimization setting. The Visual C++ 6.0 optimizer seems to be much +better and can be used with the "optimized for speed" setting.

+ +

Naming

+ +

All public symbols in FLTK start with the characters 'F' and 'L':

+ +
    + +
  • Functions are either Fl::foo() or + fl_foo().
  • + +
  • Class and type names are capitalized: + Fl_Foo.
  • + +
  • Constants and + enumerations are uppercase: FL_FOO.
  • + +
  • All header files start with <FL/...>. +
  • + +
+ + + +

Header Files

+ +

The proper way to include FLTK header files is:

+ +
    +#include <FL/Fl_xyz.H>
    +
+ +
+ + + +
Note: + +

Case is significant on many operating systems, + and the C standard uses the forward slash (/) to + separate directories. Do not use any of the following + include lines:

+ +
    +	#include <FL\Fl_xyz.H>
    +	#include <fl/fl_xyz.h>
    +	#include <Fl/fl_xyz.h>
    +	
+ +
+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/blocks.man b/third_party/windows/fltk-1.1.10/documentation/blocks.man new file mode 100644 index 0000000..5da0b34 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/blocks.man @@ -0,0 +1,26 @@ +.TH blocks 6 "FLTK Checkers" "15 January 2006" +.SH NAME +blocks \- the fltk block attack! game +.sp +.SH SYNOPSIS +\fIBlocks\fR is a FLTK-based block elimination game. Stacks of +colored blocks move from right to left as you try to eliminate +groups adjacent blocks by clicking on them. As the game +progresses, more colors are added (up to a maximum of 7) and the +blocks move faster and faster. +.SH GAME PLAY +Press the N key to start a game. As the blocks move across the +window, click on groups of two or more blocks to clear them - the +larger the number of adjacent blocks, the greater the score. +Clicking on a blocks containing a dark ball will clear all blocks +of that color, however you will score much fewer points than a +normal click. The game is over when the blocks reach the left +side of the window. +.LP +Press the spacebar to pause the game. +.SH SEE ALSO +fltk(3) +.br +FLTK Web Site, http://www.fltk.org/ +.SH AUTHOR +Michael R Sweet. diff --git a/third_party/windows/fltk-1.1.10/documentation/boxtypes.gif b/third_party/windows/fltk-1.1.10/documentation/boxtypes.gif new file mode 100644 index 0000000..bf1b67f Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/boxtypes.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/buttons.gif b/third_party/windows/fltk-1.1.10/documentation/buttons.gif new file mode 100644 index 0000000..cadf9a3 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/buttons.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/charts.gif b/third_party/windows/fltk-1.1.10/documentation/charts.gif new file mode 100644 index 0000000..c68e66e Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/charts.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/checkers.man b/third_party/windows/fltk-1.1.10/documentation/checkers.man new file mode 100644 index 0000000..6545f08 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/checkers.man @@ -0,0 +1,24 @@ +.TH checkers 6 "FLTK Checkers" "15 January 2006" +.SH NAME +checkers \- the fltk checkers game +.sp +.SH SYNOPSIS +\fICheckers\fR is a FLTK-based version of the game of checkers. +The game is played on an 8x8 board with each player starting with +12 pieces or "checkers" on opposite sides of the board. The +computer plays the white checkers in this version of the game. +.LP +The object of the game is to remove all of your opponents pieces. +Players move one of their pieces diagonally forward on each move, +either a single space or by "jumping" an adjacent piece. Your +opponents pieces are removed by jumping them - you can make +multiple jumps in a single turn. +.LP +If a piece reaches the other side of the board, it is converted +to a "king" which can move both forwards and backwards. +.SH SEE ALSO +fltk(3) +.br +FLTK Web Site, http://www.fltk.org/ +.SH AUTHORS +Bill Spitzak and others. diff --git a/third_party/windows/fltk-1.1.10/documentation/choice.gif b/third_party/windows/fltk-1.1.10/documentation/choice.gif new file mode 100644 index 0000000..c446830 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/choice.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/clock.gif b/third_party/windows/fltk-1.1.10/documentation/clock.gif new file mode 100644 index 0000000..fd72953 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/clock.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/common.html b/third_party/windows/fltk-1.1.10/documentation/common.html new file mode 100644 index 0000000..aa2d5b3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/common.html @@ -0,0 +1,672 @@ + + + 3 - Common Widgets and Attributes + + + +

3 - Common Widgets and Attributes

+ +

This chapter describes many of the widgets that are provided +with FLTK and covers how to query and set the standard +attributes.

+ +

Buttons

+ +

FLTK provides many types of buttons:

+ + + +

FLTK Buttons
+Figure 3-1: FLTK Button Widgets

+ +

All of these buttons just need the corresponding +<FL/Fl_xyz_Button.H> header file. The constructor +takes the bounding box of the button and optionally a label +string:

+ +
    +Fl_Button *button = new Fl_Button(x, y, width, height, "label");
    +Fl_Light_Button *lbutton = new Fl_Light_Button(x, y, width, height);
    +Fl_Round_Button *rbutton = new Fl_Round_Button(x, y, width, height, "label");
    +
+ +

Each button has an associated +type() +which allows it to behave as a push button, toggle button, or +radio button:

+ +
    +button->type(FL_NORMAL_BUTTON);
    +lbutton->type(FL_TOGGLE_BUTTON);
    +rbutton->type(FL_RADIO_BUTTON);
    +
+ +

For toggle and radio buttons, the +value() +method returns the current button state (0 = off, 1 = on). The +set() and +clear() +methods can be used on toggle buttons to turn a toggle button +on or off, respectively. Radio buttons can be turned on with +the +setonly() +method; this will also turn off other radio buttons in the same +group.

+ +

Text

+ +

FLTK provides several text widgets for displaying and receiving text:

+ + + +

The Fl_Output and Fl_Multiline_Output +widgets allow the user to copy text from the output field but +not change it.

+ +

The value() +method is used to get or set the string that is displayed:

+ +
    +Fl_Input *input = new Fl_Input(x, y, width, height, "label");
    +input->value("Now is the time for all good men...");
    +
+ +

The string is copied to the widget's own storage when you set +the value() of the widget.

+ +

The Fl_Text_Display and Fl_Text_Editor +widgets use an associated Fl_Text_Buffer class for the +value, instead of a simple string.

+ + + +

Valuators

+ +

Unlike text widgets, valuators keep track of numbers instead of +strings. FLTK provides the following valuators:

+ + + +

FLTK Valuators
+Figure 3-2: FLTK valuator widgets

+ +

The value() +method gets and sets the current value of the widget. The +minimum() +and maximum() +methods set the range of values that are reported by the +widget.

+ + + +

Groups

+ +

The Fl_Group widget class is used as a general +purpose "container" widget. Besides grouping radio +buttons, the groups are used to encapsulate windows, tabs, and +scrolled windows. The following group classes are available +with FLTK:

+ +
    + +
  • Fl_Double_Window - A double-buffered window on the screen.
  • + +
  • Fl_Gl_Window - An OpenGL window on the screen.
  • + +
  • Fl_Group - The base container class; can be used to group + any widgets together.
  • + +
  • Fl_Pack - A collection of widgets that are packed into the group area.
  • + +
  • Fl_Scroll - A scrolled window area.
  • + +
  • Fl_Tabs - Displays child widgets as tabs.
  • + +
  • Fl_Tile - A tiled window area.
  • + +
  • Fl_Window - A window on the screen.
  • + +
+ +

Setting the Size and Position of Widgets

+ +

The size and position of widgets is usually set when you +create them. You can access them with the x(), +y(), w(), and h() methods.

+ +

You can change the size and position by using the +position(), resize(), and size() +methods:

+ +
    +button->position(x, y);
    +group->resize(x, y, width, height);
    +window->size(width, height);
    +
+ +

If you change a widget's size or position after it is +displayed you will have to call redraw() on the +widget's parent.

+ +

Colors

+ +

FLTK stores the colors of widgets as an 32-bit unsigned +number that is either an index into a color palette of 256 +colors or a 24-bit RGB color. The color palette is not +the X or WIN32 colormap, but instead is an internal table with +fixed contents.

+ +

There are symbols for naming some of the more common colors:

+ +
    +
  • FL_BLACK
  • + +
  • FL_RED
  • + +
  • FL_GREEN
  • + +
  • FL_YELLOW
  • + +
  • FL_BLUE
  • + +
  • FL_MAGENTA
  • + +
  • FL_CYAN
  • + +
  • FL_WHITE
  • +
+ +

These symbols are the default colors for all FLTK widgets. They are +explained in more detail in the chapter +Enumerations

+ +
    +
  • FL_FOREGROUND_COLOR
  • + +
  • FL_BACKGROUND_COLOR
  • + +
  • FL_INACTIVE_COLOR
  • + +
  • FL_SELECTION_COLOR
  • +
+ +

RGB colors can be set using the fl_rgb_color() +function:

+ +
    +Fl_Color c = fl_rgb_color(85, 170, 255);
    +
+ +

The widget color is set using the color() method:

+ +
    +button->color(FL_RED);
    +
+ +

Similarly, the label color is set using the labelcolor() +method:

+ +
    +button->labelcolor(FL_WHITE);
    +
+ +

Box Types

+ +

The type Fl_Boxtype stored and returned in +Fl_Widget::box() +is an enumeration defined in <Enumerations.H>. +Figure 3-3 shows the standard box types included with FLTK.

+ +

FLTK Box Types
+Figure 3-3: FLTK box types

+ +

FL_NO_BOX means nothing is drawn at all, so whatever is +already on the screen remains. The FL_..._FRAME types only +draw their edges, leaving the interior unchanged. The blue color in +Figure 3-3 is the area that is not drawn by the frame types.

+ +

Making Your Own Boxtypes

+ +

You can define your own boxtypes by making a small function that draws +the box and adding it to the table of boxtypes.

+ +
+ + + +
Note: +

This interface has changed in FLTK 2.0!

+
+ +

The Drawing Function

+ +

The drawing function is passed the bounding box and background color +for the widget:

+ +
    +void xyz_draw(int x, int y, int w, int h, Fl_Color c) {
    +...
    +}
    +
+ + + +

A simple drawing function might fill a rectangle with the +given color and then draw a black outline:

+ +
    +void xyz_draw(int x, int y, int w, int h, Fl_Color c) {
    +  fl_color(c);
    +  fl_rectf(x, y, w, h);
    +  fl_color(FL_BLACK);
    +  fl_rect(x, y, w, h);
    +}
    +
+ +

Fl_Boxtype fl_down(Fl_Boxtype)

+ +

fl_down returns the "pressed" or "down" version of a box. +If no "down" version of a given box exists, the behavior of this function +is undefined and some random box or frame is returned. +See also: fl_frame drawing. + +

Fl_Boxtype fl_frame(Fl_Boxtype)

+ +

fl_frame returns the unfilled, frame-only version of a box. +If no frame version of a given box exists, the behavior of this function +is undefined and some random box or frame is returned. +See also: fl_frame drawing. + +

Fl_Boxtype fl_box(Fl_Boxtype)

+ +

fl_box returns the filled version of a frame. +If no filled version of a given frame exists, the behavior of this function +is undefined and some random box or frame is returned. +See also: fl_frame. + +

Adding Your Box Type

+ +

The Fl::set_boxtype() method adds or replaces the +specified box type:

+ +
    +#define XYZ_BOX FL_FREE_BOXTYPE
    +
    +Fl::set_boxtype(XYZ_BOX, xyz_draw, 1, 1, 2, 2);
    +
+ +

The last 4 arguments to Fl::set_boxtype() are the +offsets for the x, y, width, and height values that should be +subtracted when drawing the label inside the box.

+ +

A complete box design contains four box types in this order: +a filled, neutral box (UP_BOX), a filled, depressed box +(DOWN_BOX), and the same as outlines only (UP_FRAME +and DOWN_FRAME). The function +fl_down(Fl_Boxtype) +expects the neutral design on a boxtype with a numerical +value evenly dividable by two. +fl_frame(Fl_Boxtype) +expects the UP_BOX design at a value dividable by four.

+ +

Labels and Label Types

+ +

The label(), align(), labelfont(), +labelsize(), labeltype(), image(), and +deimage() methods control the labeling of widgets.

+ +

label()

+ +

The label() method sets the string that is displayed +for the label. Symbols can be included with the label string by +escaping them using the "@" symbol - "@@" displays a single at +sign. Figure 3-4 shows the available symbols.

+ +

FLTK Symbols
+Figure 3-4: FLTK label symbols

+ + + +

The @ sign may also be followed by the following optional +"formatting" characters, in this order:

+ +
    + +
  • '#' forces square scaling, rather than distortion to + the widget's shape.
  • + +
  • +[1-9] or -[1-9] tweaks the scaling a little bigger + or smaller.
  • + +
  • '$' flips the symbol horizontally, '%' flips it vertically.
  • + +
  • [0-9] - rotates by a multiple of 45 degrees. '5' and + '6' do no rotation while the others point in the + direction of that key on a numeric keypad. '0', followed by four + more digits rotates the symbol by that amount in degrees.
  • + +
+ +

Thus, to show a very large arrow pointing downward you would use the +label string "@+92->". + +

align()

+ +

The align() method positions the label. The following +constants are defined and may be OR'd together as needed:

+ +
    + +
  • FL_ALIGN_CENTER - center the label in the widget.
  • + +
  • FL_ALIGN_TOP - align the label at the top of the widget.
  • + +
  • FL_ALIGN_BOTTOM - align the label at the bottom of the + widget.
  • + +
  • FL_ALIGN_LEFT - align the label to the left of the widget.
  • + +
  • FL_ALIGN_RIGHT - align the label to the right of the + widget.
  • + +
  • FL_ALIGN_INSIDE - align the label inside the widget.
  • + +
  • FL_ALIGN_CLIP - clip the label to the widget's bounding + box.
  • + +
  • FL_ALIGN_WRAP - wrap the label text as needed.
  • + +
  • FL_TEXT_OVER_IMAGE - show the label text over the image.
  • + +
  • FL_IMAGE_OVER_TEXT - show the label image over the text (default).
  • + +
+ +

labeltype()

+ +

The labeltype() method sets the type of the label. The +following standard label types are included:

+ +
    + +
  • FL_NORMAL_LABEL - draws the text.
  • + +
  • FL_NO_LABEL - does nothing.
  • + +
  • FL_SHADOW_LABEL - draws a drop shadow under + the text.
  • + +
  • FL_ENGRAVED_LABEL - draws edges as though + the text is engraved.
  • + +
  • FL_EMBOSSED_LABEL - draws edges as thought + the text is raised.
  • + +
  • FL_ICON_LABEL - draws the icon associated + with the text.
  • + +
+ +

image() and deimage()

+ +

The image() and deimage() methods set an image that +will be displayed with the widget. The deimage() method sets the +image that is shown when the widget is inactive, while the image() +method sets the image that is shown when the widget is active.

+ +

To make an image you use a subclass of +Fl_Image.

+ +

Making Your Own Label Types

+ +

Label types are actually indexes into a table of functions +that draw them. The primary purpose of this is to use this to +draw the labels in ways inaccessible through the +fl_font mechanism (e.g. FL_ENGRAVED_LABEL) or +with program-generated letters or symbology.

+ +
+ + + +
Note: +

This interface has changed in FLTK 2.0!

+
+ +
Label Type Functions
+ +

To setup your own label type you will need to write two +functions: one to draw and one to measure the label. The draw +function is called with a pointer to a Fl_Label +structure containing the label information, the bounding box for +the label, and the label alignment:

+ +
    +void xyz_draw(const Fl_Label *label, int x, int y, int w, int h, Fl_Align align) {
    +...
    +}
    +
+ +

The label should be drawn inside this bounding box, +even if FL_ALIGN_INSIDE is not enabled. The function +is not called if the label value is NULL.

+ +

The measure function is called with a pointer to a +Fl_Label structure and references to the width and +height:

+ +
    +void xyz_measure(const Fl_Label *label, int &w, int &h) {
    +...
    +}
    +
+ +

The function should measure the size of the label and set +w and h to the size it will occupy.

+ +
Adding Your Label Type
+ +

The Fl::set_labeltype method creates a label type +using your draw and measure functions:

+ +
    +#define XYZ_LABEL FL_FREE_LABELTYPE
    +
    +Fl::set_labeltype(XYZ_LABEL, xyz_draw, xyz_measure);
    +
+ +

The label type number n can be any integer value +starting at the constant FL_FREE_LABELTYPE. Once you +have added the label type you can use the labeltype() +method to select your label type.

+ +

The Fl::set_labeltype method can also be used to overload +an existing label type such as FL_NORMAL_LABEL.

+ +

Making your own symbols

+ +

It is also possible to define your own drawings and add +them to the symbol list, so they can be rendered as part of +any label.

+ +

To create a new symbol, you implement a drawing function +void drawit(Fl_Color c) which typically uses the +complex drawing functions +to generate a vector shape inside a two-by-two units sized box +around the origin. This function is then linked into the symbols +table using fl_add_symbol:

+ + + +

name is the name of the symbol without the "@"; scalable +must be set to 1 if the symbol is generated using scalable vector drawing +functions.

+ + + +

This function draw a named symbol fitting the given rectangle. + +

Callbacks

+ +

Callbacks are functions that are called when the value of a +widget changes. A callback function is sent a Fl_Widget +pointer of the widget that changed and a pointer to data that +you provide:

+ +
    +void xyz_callback(Fl_Widget *w, void *data) {
    +...
    +}
    +
+ +

The callback() method sets the callback function for a +widget. You can optionally pass a pointer to some data needed for the +callback:

+ +
    +int xyz_data;
    +
    +button->callback(xyz_callback, &xyz_data);
    +
+ +

Normally callbacks are performed only when the value of the +widget changes. You can change this using the +when() +method:

+ +
    +button->when(FL_WHEN_NEVER);
    +button->when(FL_WHEN_CHANGED);
    +button->when(FL_WHEN_RELEASE);
    +button->when(FL_WHEN_RELEASE_ALWAYS);
    +button->when(FL_WHEN_ENTER_KEY);
    +button->when(FL_WHEN_ENTER_KEY_ALWAYS);
    +button->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED);
    +
+ +
+ + + +
Note: + +

You cannot delete a widget inside a callback, as the + widget may still be accessed by FLTK after your callback + is completed. Instead, use the Fl::delete_widget() + method to mark your widget for deletion when it is safe + to do so.

+ +

Hint: + +

Many programmers new to FLTK or C++ try to use a + non-static class method instead of a static class method + or function for their callback. Since callbacks are done + outside a C++ class, the this pointer is not + initialized for class methods.

+ +

To work around this problem, define a static method + in your class that accepts a pointer to the class, and + then have the static method call the class method(s) as + needed. The data pointer you provide to the + callback() method of the widget can be a + pointer to the instance of your class.

+ +
+class Foo {
+  void my_callback(Fl_Widget *w);
+  static void my_static_callback(Fl_Widget *w, void *f) { ((Foo *)f)->my_callback(w); }
+  ...
+}
+
+...
+
+w->callback(my_static_callback, (void *)this);
+
+
+ +

Shortcuts

+ +

Shortcuts are key sequences that activate widgets such as +buttons or menu items. The shortcut() method sets the +shortcut for a widget:

+ +
    +button->shortcut(FL_Enter);
    +button->shortcut(FL_SHIFT + 'b');
    +button->shortcut(FL_CTRL + 'b');
    +button->shortcut(FL_ALT + 'b');
    +button->shortcut(FL_CTRL + FL_ALT + 'b');
    +button->shortcut(0); // no shortcut
    +
+ +

The shortcut value is the key event value - the ASCII value +or one of the special keys like +FL_Enter - +combined with any modifiers like Shift, +Alt, and Control.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/counter.gif b/third_party/windows/fltk-1.1.10/documentation/counter.gif new file mode 100644 index 0000000..6e05a65 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/counter.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/cubeview.gif b/third_party/windows/fltk-1.1.10/documentation/cubeview.gif new file mode 100644 index 0000000..024cc55 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/cubeview.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/dial.gif b/third_party/windows/fltk-1.1.10/documentation/dial.gif new file mode 100644 index 0000000..e52e180 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/dial.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/drawing.html b/third_party/windows/fltk-1.1.10/documentation/drawing.html new file mode 100644 index 0000000..c1fb63e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/drawing.html @@ -0,0 +1,972 @@ + + + 5 - Drawing Things in FLTK + + + +

5 - Drawing Things in FLTK

+ +

This chapter covers the drawing functions that are provided with FLTK. + +

When Can You Draw Things in FLTK?

+ +

There are only certain places you can execute drawing code in FLTK. +Calling these functions at other places will result in undefined +behavior! + +

    + +
  • The most common place is inside the virtual method + Fl_Widget::draw(). + To write code here, you must subclass one of the + existing Fl_Widget classes and implement your + own version of draw().
  • + +
  • You can also write boxtypes and labeltypes. These are + small procedures that can be called by existing Fl_Widget::draw() + methods. These "types" are identified by an + 8-bit index that is stored in the widget's + box(), labeltype(), and possibly other + properties.
  • + +
  • You can call Fl_Window::make_current() + to do incremental update of a widget. Use Fl_Widget::window() + to find the window.
  • + +
+ +

FLTK Drawing Functions

+ +

To use the drawing functions you must first include the +<FL/fl_draw.H> header file. FLTK provides the +following types of drawing functions: + +

+ +

Boxes

+ +

FLTK provides three functions that can be used to draw boxes +for buttons and other UI controls. Each function uses the +supplied upper-lefthand corner and width and height to determine +where to draw the box. + +

void fl_draw_box(Fl_Boxtype b, int x, int y, int w, int h, Fl_Color c);

+ +

The first box drawing function is fl_draw_box() +which draws a standard boxtype c in the specified +color c. + +

void fl_frame(const char *s, int x, int y, int w, int h);

+ +

The fl_frame() function draws a series of line +segments around the given box. The string s must +contain groups of 4 letters which specify one of 24 standard +grayscale values, where 'A' is black and 'X' is white. The order +of each set of 4 characters is: top, left, bottom, right. The +results of calling fl_frame() with a string that is +not a multiple of 4 characters in length are undefined. + +

The only difference between this function and +fl_frame2() is the order of the line segments. + +

See also: fl_frame boxtype. + +

void fl_frame2(const char *s, int x, int y, int w, int h);

+ +

The fl_frame2() function draws a series of line +segments around the given box. The string s must +contain groups of 4 letters which specify one of 24 standard +grayscale values, where 'A' is black and 'X' is white. The order +of each set of 4 characters is: bottom, right, top, left. The +results of calling fl_frame2() with a string that is +not a multiple of 4 characters in length are undefined. + +

The only difference between this function and +fl_frame() is the order of the line segments. + +

Clipping

+ +

You can limit all your drawing to a rectangular region by calling +fl_push_clip, and put the drawings back by using fl_pop_clip. +This rectangle is measured in pixels and is unaffected by the current +transformation matrix. + +

In addition, the system may provide clipping when updating windows +which may be more complex than a simple rectangle.

+ +

void fl_clip(int x, int y, int w, int h)
+void fl_push_clip(int x, int y, int w, int h)

+ +

Intersect the current clip region with a rectangle and push this new +region onto the stack. The fl_clip() name is deprecated and +will be removed from future releases. + +

void fl_push_no_clip()

+ +

Pushes an empty clip region on the stack so nothing will be clipped. + +

void fl_pop_clip()

+ +

Restore the previous clip region. + +

+ + + +
Note: + +

You must call fl_pop_clip() once for every + time you call fl_push_clip(). If you return to FLTK + with the clip stack not empty unpredictable results + occur. + +

+ +

int fl_not_clipped(int x, int y, int w, int h)

+ +

Returns non-zero if any of the rectangle intersects the current clip +region. If this returns 0 you don't have to draw the object. + +

+ + + +
Note: + +

Under X this returns 2 if the rectangle is partially + clipped, and 1 if it is entirely inside the clip region. + +

+ +

int fl_clip_box(int x, int y, int w, int h, int &X, int &Y, int &W, +int &H)

+ +

Intersect the rectangle x,y,w,h with the current +clip region and returns the bounding box of the result in +X,Y,W,H. Returns non-zero if the resulting rectangle is +different than the original. This can be used to limit the +necessary drawing to a rectangle. W and H are +set to zero if the rectangle is completely outside the region. + +

void fl_clip_region(Fl_Region r) +
Fl_Region fl_clip_region()

+ +

Replace the top of the clip stack with a clipping region of any shape. +Fl_Region is an operating system specific type. The second form returns +the current clipping region. + +

Colors

+ +

FLTK manages colors as 32-bit unsigned integers. Values from +0 to 255 represent colors from the FLTK 1.0.x standard colormap +and are allocated as needed on screens without TrueColor +support. The Fl_Color enumeration type defines the +standard colors and color cube for the first 256 colors. All of +these are named with symbols in <FL/Enumerations.H>. + +

Color values greater than 255 are treated as 24-bit RGB +values. These are mapped to the closest color supported by the +screen, either from one of the 256 colors in the FLTK 1.0.x +colormap or a direct RGB value on TrueColor screens. You can +generate 24-bit RGB color values using the fl_rgb_color() +function. + +

void fl_color(Fl_Color)

+ +

Sets the color for all subsequent drawing operations. + +

For colormapped displays, a color cell will be allocated out +of fl_colormap the first time you use a color. If the +colormap fills up then a least-squares algorithm is used to find +the closest color.

+ +

Fl_Color fl_color()

+ +

Returns the last fl_color() that was set. This can +be used for state save/restore. + +

void fl_color(uchar r, uchar g, uchar b)

+ +

Set the color for all subsequent drawing operations. The +closest possible match to the RGB color is used. The RGB color +is used directly on TrueColor displays. For colormap visuals the +nearest index in the gray ramp or color cube is used. + +

Line Dashes and Thickness

+ +

FLTK supports drawing of lines with different styles and +widths. Full functionality is not available under Windows 95, 98, +and Me due to the reduced drawing functionality these operating +systems provide. + +

void fl_line_style(int style, int width=0, char* dashes=0)

+ +

Set how to draw lines (the "pen"). If you change this it is your +responsibility to set it back to the default with +fl_line_style(0). + +

+ + + +
Note: + +

Because of how line styles are implemented on WIN32 + systems, you must set the line style after + setting the drawing color. If you set the color after + the line style you will lose the line style settings! + +

+ +

style is a bitmask which is a bitwise-OR of the following +values. If you don't specify a dash type you will get a solid +line. If you don't specify a cap or join type you will get a +system-defined default of whatever value is fastest. + +

    + +
  • FL_SOLID      ------- + +
  • FL_DASH       - - - - + +
  • FL_DOT        ....... + +
  • FL_DASHDOT    - . - . + +
  • FL_DASHDOTDOT - .. - + +
  • FL_CAP_FLAT + +
  • FL_CAP_ROUND + +
  • FL_CAP_SQUARE (extends past end point 1/2 line width) + +
  • FL_JOIN_MITER (pointed) + +
  • FL_JOIN_ROUND + +
  • FL_JOIN_BEVEL (flat) + +
+ +

width is the number of pixels thick to draw the lines. +Zero results in the system-defined default, which on both X and +Windows is somewhat different and nicer than 1. + + + +

dashes is a pointer to an array of dash lengths, measured in +pixels. The first location is how long to draw a solid portion, the +next is how long to draw the gap, then the solid, etc. It is +terminated with a zero-length entry. A NULL pointer or a zero-length +array results in a solid line. Odd array sizes are not supported and +result in undefined behavior. + +

+ + + +
Note: + +

The dashes array does not work under Windows 95, 98, + or Me, since those operating systems do not support + complex line styles. + +

+ +

Drawing Fast Shapes

+ +

These functions are used to draw almost all the FLTK widgets. +They draw on exact pixel boundaries and are as fast as possible. +Their behavior is duplicated exactly on all platforms FLTK is +ported. It is undefined whether these are affected by the transformation matrix, so you should only +call these while the matrix is set to the identity matrix (the +default). + +

void fl_point(int x, int y)

+ +

Draw a single pixel at the given coordinates. + +

void fl_rectf(int x, int y, int w, int h) +
void fl_rectf(int x, int y, int w, int h)

+ +

Color a rectangle that exactly fills the given bounding box. + +

void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b)

+ +

Color a rectangle with "exactly" the passed +r,g,b color. On screens with less than 24 bits of +color this is done by drawing a solid-colored block using fl_draw_image() so that +the correct color shade is produced. + +

void fl_rect(int x, int y, int w, int h) +
void fl_rect(int x, int y, int w, int h, Fl_Color c)

+ +

Draw a 1-pixel border inside this bounding box. + +

void fl_line(int x, int y, int x1, int y1) +
void fl_line(int x, int y, int x1, int y1, int x2, int y2)

+ +

Draw one or two lines between the given points. + +

void fl_loop(int x, int y, int x1, int y1, int x2, int y2) +
void fl_loop(int x, int y, int x1, int y1, int x2, int y2, int x3, +int y3)

+ +

Outline a 3 or 4-sided polygon with lines. + +

void fl_polygon(int x, int y, int x1, int y1, int x2, int y2) +
void fl_polygon(int x, int y, int x1, int y1, int x2, int y2, int +x3, int y3)

+ +

Fill a 3 or 4-sided polygon. The polygon must be convex. + +

void fl_xyline(int x, int y, int x1) +
void fl_xyline(int x, int y, int x1, int y2) +
void fl_xyline(int x, int y, int x1, int y2, int x3)

+ +

Draw horizontal and vertical lines. A horizontal line is +drawn first, then a vertical, then a horizontal. + +

void fl_yxline(int x, int y, int y1) +
void fl_yxline(int x, int y, int y1, int x2) +
void fl_yxline(int x, int y, int y1, int x2, int y3)

+ +

Draw vertical and horizontal lines. A vertical line is drawn +first, then a horizontal, then a vertical. + +

void fl_arc(int x, int y, int w, int h, double a1, double a2) +
void fl_pie(int x, int y, int w, int h, double a1, double a2)

+ +

Draw ellipse sections using integer coordinates. These +functions match the rather limited circle drawing code provided +by X and WIN32. The advantage over using fl_arc with floating point +coordinates is that they are faster because they often use the +hardware, and they draw much nicer small circles, since the +small sizes are often hard-coded bitmaps. + +

If a complete circle is drawn it will fit inside the passed bounding +box. The two angles are measured in degrees counterclockwise from +3'oclock and are the starting and ending angle of the arc, a2 +must be greater or equal to a1.

+ +

fl_arc() draws a series of lines to approximate the arc. +Notice that the integer version of fl_arc() has a different +number of arguments than the fl_arc() +function described later in this chapter.

+ +

fl_pie() draws a filled-in pie slice. This slice may +extend outside the line drawn by fl_arc; to avoid this +use w - 1 and h - 1.

+ +

void fl_scroll(int X, int Y, int W, int H, int dx, int dy, +void (*draw_area)(void*, int,int,int,int), void* data)

+ +

Scroll a rectangle and draw the newly exposed portions. The contents +of the rectangular area is first shifted by dx and +dy pixels. The callback is then called for every newly +exposed rectangular area, + +

Drawing Complex Shapes

+ +

The complex drawing functions let you draw arbitrary shapes +with 2-D linear transformations. The functionality matches that +found in the Adobe® PostScriptTM language. The +exact pixels that are filled are less defined than for the fast +drawing functions so that FLTK can take advantage of drawing +hardware. On both X and WIN32 the transformed vertices are +rounded to integers before drawing the line segments: this +severely limits the accuracy of these functions for complex +graphics, so use OpenGL when greater accuracy and/or performance +is required. + +

void fl_push_matrix() +
void fl_pop_matrix()

+ +

Save and restore the current transformation. The maximum +depth of the stack is 4. + +

void fl_scale(float x, float y) +
void fl_scale(float x) +
void fl_translate(float x, float y) +
void fl_rotate(float d) +
void fl_mult_matrix(float a, float b, float c, float d, float +x, float y)

+ +

Concatenate another transformation onto the current one. The rotation +angle is in degrees (not radians) and is counter-clockwise. + +

double fl_transform_x(double x, double y) +
double fl_transform_y(double x, double y) +
double fl_transform_dx(double x, double y) +
double fl_transform_dy(double x, double y) +
void fl_transformed_vertex(double xf, double yf)

+ +

Transform a coordinate or a distance trough the current transformation matrix. +After transforming a coordinate pair, it can be added to the vertex +list without any further translations using fl_transformed_vertex. + +

void fl_begin_points() +
void fl_end_points()

+ +

Start and end drawing a list of points. Points are added to +the list with fl_vertex. + +

void fl_begin_line() +
void fl_end_line()

+ +

Start and end drawing lines. + +

void fl_begin_loop() +
void fl_end_loop()

+ +

Start and end drawing a closed sequence of lines. + +

void fl_begin_polygon() +
void fl_end_polygon()

+ +

Start and end drawing a convex filled polygon. + +

void fl_begin_complex_polygon() +
void fl_gap() +
void fl_end_complex_polygon()

+ +

Start and end drawing a complex filled polygon. This polygon +may be concave, may have holes in it, or may be several +disconnected pieces. Call fl_gap() to separate loops of +the path. It is unnecessary but harmless to call +fl_gap() before the first vertex, after the last one, +or several times in a row. + +

+ + + +
Note: + +

For portability, you should only draw polygons that + appear the same whether "even/odd" or + "non-zero" winding rules are used to fill + them. Holes should be drawn in the opposite direction of + the outside loop. + +

+ +

fl_gap() should only be called between +fl_begin_complex_polygon() and +fl_end_complex_polygon(). To outline the polygon, use +fl_begin_loop() and replace each fl_gap() with +fl_end_loop();fl_begin_loop().

+ +

void fl_vertex(float x, float y)

+Add a single vertex to the current path. + +

void fl_curve(float x, float y, float x1, float y1, float x2, float +y2, float x3, float y3)

+ +

Add a series of points on a Bezier curve to the path. The curve ends +(and two of the points) are at x,y and x3,y3. + +

void fl_arc(float x, float y, float r, float start, float end)

+ +

Add a series of points to the current path on the arc of a +circle; you can get elliptical paths by using scale and rotate +before calling fl_arc(). x,y are the center of +the circle, and r is its radius. fl_arc() +takes start and end angles that are measured +in degrees counter-clockwise from 3 o'clock. If end is +less than start then it draws the arc in a clockwise +direction. + +

void fl_circle(float x, float y, float r)

+ +

fl_circle() is equivalent to fl_arc(...,0,360) but +may be faster. It must be the only thing in the path: if you +want a circle as part of a complex polygon you must use fl_arc(). + +

+ + + +
Note: + +

fl_circle() draws incorrectly if the + transformation is both rotated and non-square scaled. + +

+ +

Drawing Text

+ +

All text is drawn in the current font. +It is undefined whether this location or the characters are +modified by the current transformation. + +

void fl_draw(const char *, int x, int y) +
void fl_draw(const char *, int n, int x, int y)

+ +

Draw a nul-terminated string or an array of n characters +starting at the given location. Text is aligned to the left and to +the baseline of the font. To align to the bottom, subtract fl_descent() from +y. To align to the top, subtract fl_descent() and add fl_height(). +This version of fl_draw provides direct access to +the text drawing function of the underlying OS. It does not apply any +special handling to control characters. + +

void fl_draw(const char *, int x, int y, int w, int h, +Fl_Align align, Fl_Image *img = 0, int draw_symbols = 1)

+ +

Fancy string drawing function which is used to draw all the +labels. The string is formatted and aligned inside the passed +box. Handles '\t' and '\n', expands all other control +characters to ^X, and aligns inside or against the edges of the +box described by x, y, w and h. See Fl_Widget::align() +for values for align. The value +FL_ALIGN_INSIDE is ignored, as this function always +prints inside the box. + +

If img is provided and is not NULL, the +image is drawn above or below the text as specified by the +align value. + +

The draw_symbols argument specifies whether or not +to look for symbol names starting with the "@" character. + +

The text length is limited to 1024 caracters per line. + +

void fl_measure(const char *, int &w, +int &h, int draw_symbols = 1)

+ +

Measure how wide and tall the string will be when printed by +the fl_draw(...align) function. If the incoming +w is non-zero it will wrap to that width. + +

int fl_height()

+ +

Recommended minimum line spacing for the current font. You +can also just use the value of size passed to fl_font(). + +

int fl_descent()

+ +

Recommended distance above the bottom of a +fl_height() tall box to draw the text at so it looks +centered vertically in that box. + +

float fl_width(const char*) +
float fl_width(const char*, int n) +
float fl_width(uchar)

+ +

Return the pixel width of a nul-terminated string, a sequence of n +characters, or a single character in the current font. + +

const char *fl_shortcut_label(ulong)

+ +

Unparse a shortcut value as used by Fl_Button +or Fl_Menu_Item +into a human-readable string like "Alt+N". This only +works if the shortcut is a character key or a numbered function +key. If the shortcut is zero an empty string is returned. The +return value points at a static buffer that is overwritten with +each call. + +

Fonts

+ +

FLTK supports a set of standard fonts based on the Times, +Helvetica/Arial, Courier, and Symbol typefaces, as well as +custom fonts that your application may load. Each font is +accessed by an index into a font table. + +

Initially only the first 16 faces are filled in. There are +symbolic names for them: FL_HELVETICA, +FL_TIMES, FL_COURIER, and modifier values +FL_BOLD and FL_ITALIC which can be added to +these, and FL_SYMBOL and FL_ZAPF_DINGBATS. +Faces greater than 255 cannot be used in Fl_Widget +labels, since Fl_Widget stores the index as a byte.

+ +

void fl_font(int face, int size)

+ +

Set the current font, which is then used by the routines +described above. You may call this outside a draw context if +necessary to call fl_width(), but on X this will open +the display. + +

The font is identified by a face and a +size. The size of the font is measured in +pixels and not "points". Lines should be spaced +size pixels apart or more.

+ +

int fl_font() +
int fl_size()

+ +

Returns the face and size set by the most recent call to +fl_font(a,b). This can be used to save/restore the +font. + +

Character Encoding

+ +

FLTK 1 supports western character sets using the eight bit encoding +of the user-selected global code page. For MS Windows and X11, the code +page is assumed to be Windows-1252/Latin1, a superset to ISO 8859-1. +On Mac OS X, we assume MacRoman. + +

FLTK provides the functions fl_latin1_to_local, +fl_local_to_latin1, fl_mac_roman_to_local, and +fl_local_to_mac_roman to convert strings between both +encodings. These functions are only required if your source +code contains "C"-strings with international characters and +if this source will be compiled on multiple platforms. + +

Assuming that the following source code was written on MS Windows, +this example will output the correct label on OS X and X11 as well. +Without the conversion call, the label on OS X would read +Fahrvergn¸gen with a deformed umlaut u. +

+  btn = new Fl_Button(10, 10, 300, 25);
+  btn->copy_label(fl_latin1_to_local("Fahrvergnügen"));
+
+ +

If your application uses characters that are not part of both +encodings, or it will be used in areas that commonly use different +code pages, yoou might consider upgrading to FLTK 2 which supports +UTF-8 encoding. + +

Drawing Overlays

+ +

These functions allow you to draw interactive selection rectangles +without using the overlay hardware. FLTK will XOR a single rectangle +outline over a window. + +

void fl_overlay_rect(int x, int y, int w, int h); +
void fl_overlay_clear();

+ +

fl_overlay_rect() draws a selection rectangle, erasing any +previous rectangle by XOR'ing it first. fl_overlay_clear() +will erase the rectangle without drawing a new one. + +

Using these functions is tricky. You should make a widget +with both a handle() and draw() method. +draw() should call fl_overlay_clear() before +doing anything else. Your handle() method should call +window()->make_current() and then +fl_overlay_rect() after FL_DRAG events, and +should call fl_overlay_clear() after a +FL_RELEASE event.

+ +

Drawing Images

+ +

To draw images, you can either do it directly from data in +your memory, or you can create a Fl_Image object. The advantage of +drawing directly is that it is more intuitive, and it is faster +if the image data changes more often than it is redrawn. The +advantage of using the object is that FLTK will cache translated +forms of the image (on X it uses a server pixmap) and thus +redrawing is much faster. + +

Direct Image Drawing

+ +

The behavior when drawing images when the current +transformation matrix is not the identity is not defined, so you +should only draw images when the matrix is set to the identity. + +

void fl_draw_image(const uchar *, int X, int Y, int W, int H, int D += 3, int LD = 0) +
void fl_draw_image_mono(const uchar *, int X, int Y, int W, int H, +int D = 1, int LD = 0)

+ +

Draw an 8-bit per color RGB or luminance image. The pointer +points at the "r" data of the top-left pixel. Color +data must be in r,g,b order. X,Y are where to +put the top-left corner. W and H define the +size of the image. D is the delta to add to the pointer +between pixels, it may be any value greater or equal to +3, or it can be negative to flip the image +horizontally. LD is the delta to add to the pointer +between lines (if 0 is passed it uses W * D), and may +be larger than W * D to crop data, or negative to flip +the image vertically. + +

It is highly recommended that you put the following code before the +first show() of any window in your program to get rid +of the dithering if possible:

+ +
    +Fl::visual(FL_RGB);
    +
+ +

Gray scale (1-channel) images may be drawn. This is done if +abs(D) is less than 3, or by calling +fl_draw_image_mono(). Only one 8-bit sample is used for +each pixel, and on screens with different numbers of bits for +red, green, and blue only gray colors are used. Setting +D greater than 1 will let you display one channel of a +color image. + +

+ + + +
Note: + +

The X version does not support all possible visuals. + If FLTK cannot draw the image in the current visual it + will abort. FLTK supports any visual of 8 bits or less, + and all common TrueColor visuals up to 32 bits.

+ +
+ +

typedef void (*fl_draw_image_cb)(void *, int x, int y, int w, uchar +*) +
void fl_draw_image(fl_draw_image_cb, void *, int X, int Y, int W, +int H, int D = 3) +
void fl_draw_image_mono(fl_draw_image_cb, void *, int X, int Y, +int W, int H, int D = 1)

+ +

Call the passed function to provide each scan line of the +image. This lets you generate the image as it is being drawn, +or do arbitrary decompression of stored data, provided it can be +decompressed to individual scan lines easily. + +

The callback is called with the void * user data +pointer which can be used to point at a structure of information +about the image, and the x, y, and w +of the scan line desired from the image. 0,0 is the upper-left +corner of the image, not X,Y. A pointer to a +buffer to put the data into is passed. You must copy w +pixels from scanline y, starting at pixel x, +to this buffer.

+ +

Due to cropping, less than the whole image may be requested. +So x may be greater than zero, the first y may +be greater than zero, and w may be less than +W. The buffer is long enough to store the entire W +* D pixels, this is for convenience with some decompression +schemes where you must decompress the entire line at once: +decompress it into the buffer, and then if x is not +zero, copy the data over so the x'th pixel is at the +start of the buffer.

+ +

You can assume the y's will be consecutive, except +the first one may be greater than zero.

+ +

If D is 4 or more, you must fill in the unused bytes +with zero.

+ +

int fl_draw_pixmap(char **data, int X, int Y, Fl_Color = FL_GRAY)

+ +

Draws XPM image data, with the top-left corner at the given position. +The image is dithered on 8-bit displays so you won't lose color space +for programs displaying both images and pixmaps. This function returns +zero if there was any error decoding the XPM data. + +

To use an XPM, do:

+ +
    +#include "foo.xpm"
    +...
    +fl_draw_pixmap(foo, X, Y);
    +
+ +

Transparent colors are replaced by the optional +Fl_Color argument. To draw with true transparency you must +use the Fl_Pixmap class. + +

int fl_measure_pixmap(char **data, int &w, int &h)

+ +

An XPM image contains the dimensions in its data. This +function finds and returns the width and height. The return +value is non-zero if the dimensions were parsed ok and zero if +there was any problem. + +

Direct Image Reading

+ +

FLTK provides a single function for reading from the current +window or off-screen buffer into a RGB(A) image buffer.

+ +

uchar *fl_read_image(uchar *p, int +X, int Y, int W, int H, int alpha = 0);

+ +

Read a RGB(A) image from the current window or off-screen +buffer. The p argument points to a buffer that can hold +the image and must be at least W*H*3 bytes when reading +RGB images and W*H*4 bytes when reading RGBA images. If +NULL, fl_read_image() will create an array of +the proper size which can be freed using delete[].

+ +

The alpha parameter controls whether an alpha +channel is created and the value that is placed in the alpha +channel. If 0, no alpha channel is generated.

+ +

Image Classes

+ +

FLTK provides a base image class called Fl_Image which supports +creating, copying, and drawing images of various kinds, along +with some basic color operations. Images can be used as labels +for widgets using the image() and +deimage() +methods or drawn directly. + +

The Fl_Image class +does almost nothing by itself, but is instead supported by three +basic image types: + +

+ +

The Fl_Bitmap class encapsulates a mono-color bitmap image. +The draw() method draws the image using the current drawing +color. + +

The Fl_Pixmap class encapsulates a colormapped image. +The draw() method draws the image using the colors in the +file, and masks off any transparent colors automatically. + +

The Fl_RGB_Image class encapsulates a full-color +(or grayscale) image with 1 to 4 color components. Images with +an even number of components are assumed to contain an +alpha channel that is used for transparency. The transparency +provided by the draw() method is either a 24-bit +blend against the existing window contents or a "screen door" +transparency mask, depending on the platform and screen color depth. + +

char fl_can_do_alpha_blending()

+ +

fl_can_do_alpha_blending() will return 1, if your +platform supports true alpha blending for RGBA images, or 0, +if FLTK will use screen door transparency. + +

FLTK also provides several image classes based on the three +standard image types for common file formats: + +

+ +

Each of these image classes load a named file of the +corresponding format. The Fl_Shared_Image class +can be used to load any type of image file - the class examines +the file and constructs an image of the appropriate type. + +

Finally, FLTK provides a special image class called Fl_Tiled_Image to tile +another image object in the specified area. This class can be +used to tile a background image in a Fl_Group widget, +for example. + +

virtual void copy();
+virtual void copy(int w, int h);

+ +

The copy() method creates a copy of the image. The second form +specifies the new size of the image - the image is resized using the +nearest-neighbor algorithm. + +

void draw(int x, int y, int w, int h, int ox = 0, int oy = 0);

+ +

The draw() method draws the image object. +x,y,w,h indicates a destination rectangle. +ox,oy,w,h is a source rectangle. This source rectangle +is copied to the destination. The source rectangle may extend +outside the image, i.e. ox and oy may be +negative and w and h may be bigger than the +image, and this area is left unchanged. + +

void draw(int x, int y)

+ +

Draws the image with the upper-left corner at x,y. +This is the same as doing draw(x,y,img->w(),img->h(),0,0). + +

Offscreen Drawing

+ +Sometimes it can be very useful to generate a complex drawing +in memory first and copy it to the screen at a later point in +time. This technique can significantly reduce the amount of +repeated drawing. Fl_Double_Window uses offscreen rendering +to avoid flickering on systems that don't support +double-buffering natively. + +

Fl_Offscreen fl_create_offscreen(int w, int h)

+ +

Create an RGB offscreen buffer with w*h pixels. + +

void fl_delete_offscreen(Fl_Offscreen)

+ +

Delete a previously created offscreen buffer. All drawings are lost. + +

void fl_begin_offscreen(Fl_Offscreen)

+ +

Send all subsequent drawing commands to this offscreen buffer. +FLTK can draw into a buffer at any time. There is no need to wait for +an Fl_Widget::draw() to occur. + +

void fl_end_offscreen()

+ +

Quit sending drawing commands to this offscreen buffer. + +

void fl_copy_offscreen(int x, int y, +int w, int h, Fl_Offscreen osrc, int srcx, int srcy)

+ +

Copy a rectangular area of the size w*h from srcx, srcy in the offscreen +buffer into the current buffer at x, y. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/editor-replace.gif b/third_party/windows/fltk-1.1.10/documentation/editor-replace.gif new file mode 100644 index 0000000..73c2856 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/editor-replace.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/editor.gif b/third_party/windows/fltk-1.1.10/documentation/editor.gif new file mode 100644 index 0000000..8fce896 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/editor.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/editor.html b/third_party/windows/fltk-1.1.10/documentation/editor.html new file mode 100644 index 0000000..eebe86a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/editor.html @@ -0,0 +1,911 @@ + + + 4 - Designing a Simple Text Editor + + + +

4 - Designing a Simple Text Editor

+ +

This chapter takes you through the design of a simple +FLTK-based text editor. + +

Determining the Goals of the Text Editor

+ +

Since this will be the first big project you'll be doing with FLTK, +lets define what we want our text editor to do: + +

    + +
  1. Provide a menubar/menus for all functions.
  2. +
  3. Edit a single text file, possibly with multiple views.
  4. +
  5. Load from a file.
  6. +
  7. Save to a file.
  8. +
  9. Cut/copy/delete/paste functions.
  10. +
  11. Search and replace functions.
  12. +
  13. Keep track of when the file has been changed.
  14. + +
+ + + +

Designing the Main Window

+ +

Now that we've outlined the goals for our editor, we can begin with +the design of our GUI. Obviously the first thing that we need is a +window, which we'll place inside a class called EditorWindow: + +

    +class EditorWindow : public Fl_Double_Window {
    +  public:
    +    EditorWindow(int w, int h, const char* t);
    +    ~EditorWindow();
    +
    +    Fl_Window          *replace_dlg;
    +    Fl_Input           *replace_find;
    +    Fl_Input           *replace_with;
    +    Fl_Button          *replace_all;
    +    Fl_Return_Button   *replace_next;
    +    Fl_Button          *replace_cancel;
    +
    +    Fl_Text_Editor     *editor;
    +    char               search[256];
    +};
    +
+ +

Variables

+ +

Our text editor will need some global variables to keep track of +things: + +

    +int            changed = 0;
    +char           filename[256] = "";
    +Fl_Text_Buffer *textbuf;
    +
+ +

The textbuf variable is the text editor buffer for +our window class described previously. We'll cover the other +variables as we build the application.

+ +

Menubars and Menus

+ +

The first goal requires us to use a menubar and menus that +define each function the editor needs to perform. The Fl_Menu_Item structure is +used to define the menus and items in a menubar:

+ +
    +Fl_Menu_Item menuitems[] = {
    +  { "&File",              0, 0, 0, FL_SUBMENU },
    +    { "&New File",        0, (Fl_Callback *)new_cb },
    +    { "&Open File...",    FL_CTRL + 'o', (Fl_Callback *)open_cb },
    +    { "&Insert File...",  FL_CTRL + 'i', (Fl_Callback *)insert_cb, 0, FL_MENU_DIVIDER },
    +    { "&Save File",       FL_CTRL + 's', (Fl_Callback *)save_cb },
    +    { "Save File &As...", FL_CTRL + FL_SHIFT + 's', (Fl_Callback *)saveas_cb, 0, FL_MENU_DIVIDER },
    +    { "New &View", FL_ALT + 'v', (Fl_Callback *)view_cb, 0 },
    +    { "&Close View", FL_CTRL + 'w', (Fl_Callback *)close_cb, 0, FL_MENU_DIVIDER },
    +    { "E&xit", FL_CTRL + 'q', (Fl_Callback *)quit_cb, 0 },
    +    { 0 },
    +
    +  { "&Edit", 0, 0, 0, FL_SUBMENU },
    +    { "&Undo",       FL_CTRL + 'z', (Fl_Callback *)undo_cb, 0, FL_MENU_DIVIDER },
    +    { "Cu&t",        FL_CTRL + 'x', (Fl_Callback *)cut_cb },
    +    { "&Copy",       FL_CTRL + 'c', (Fl_Callback *)copy_cb },
    +    { "&Paste",      FL_CTRL + 'v', (Fl_Callback *)paste_cb },
    +    { "&Delete",     0, (Fl_Callback *)delete_cb },
    +    { 0 },
    +
    +  { "&Search", 0, 0, 0, FL_SUBMENU },
    +    { "&Find...",       FL_CTRL + 'f', (Fl_Callback *)find_cb },
    +    { "F&ind Again",    FL_CTRL + 'g', find2_cb },
    +    { "&Replace...",    FL_CTRL + 'r', replace_cb },
    +    { "Re&place Again", FL_CTRL + 't', replace2_cb },
    +    { 0 },
    +
    +  { 0 }
    +};
    +
+ +

Once we have the menus defined we can create the +Fl_Menu_Bar widget and assign the menus to it with:

+ +
    +Fl_Menu_Bar *m = new Fl_Menu_Bar(0, 0, 640, 30);
    +m->copy(menuitems);
    +
+ +

We'll define the callback functions later. + +

Editing the Text

+ +

To keep things simple our text editor will use the +Fl_Text_Editor +widget to edit the text: + +

    +w->editor = new Fl_Text_Editor(0, 30, 640, 370);
    +w->editor->buffer(textbuf);
    +
+ +

So that we can keep track of changes to the file, we also want to add +a "modify" callback:

+ +
    +textbuf->add_modify_callback(changed_cb, w);
    +textbuf->call_modify_callbacks();
    +
+ +

Finally, we want to use a mono-spaced font like FL_COURIER: + +

    +w->editor->textfont(FL_COURIER);
    +
+ +

The Replace Dialog

+ +

We can use the FLTK convenience functions for many of the +editor's dialogs, however the replace dialog needs its own +custom window. To keep things simple we will have a +"find" string, a "replace" string, and +"replace all", "replace next", and +"cancel" buttons. The strings are just +Fl_Input widgets, the "replace all" and +"cancel" buttons are Fl_Button widgets, and +the "replace next " button is a +Fl_Return_Button widget:

+ +

The search and replace dialog.
+Figure 4-1: The search and replace dialog.

+ +
    +Fl_Window *replace_dlg = new Fl_Window(300, 105, "Replace");
    +Fl_Input *replace_find = new Fl_Input(70, 10, 200, 25, "Find:");
    +Fl_Input *replace_with = new Fl_Input(70, 40, 200, 25, "Replace:");
    +Fl_Button *replace_all = new Fl_Button(10, 70, 90, 25, "Replace All");
    +Fl_Button *replace_next = new Fl_Button(105, 70, 120, 25, "Replace Next");
    +Fl_Button *replace_cancel = new Fl_Button(230, 70, 60, 25, "Cancel");
    +
+ +

Callbacks

+ +

Now that we've defined the GUI components of our editor, we +need to define our callback functions.

+ +

changed_cb()

+ +

This function will be called whenever the user changes any text in the +editor widget: + +

    +void changed_cb(int, int nInserted, int nDeleted,int, const char*, void* v) {
    +  if ((nInserted || nDeleted) && !loading) changed = 1;
    +  EditorWindow *w = (EditorWindow *)v;
    +  set_title(w);
    +  if (loading) w->editor->show_insert_position();
    +}
    +
+ +

The set_title() function is one that we will write to set +the changed status on the current file. We're doing it this way +because we want to show the changed status in the window's +title bar. + +

copy_cb()

+ +

This callback function will call kf_copy() +to copy the currently selected text to the clipboard:

+ +
    +void copy_cb(Fl_Widget*, void* v) {
    +  EditorWindow* e = (EditorWindow*)v;
    +  Fl_Text_Editor::kf_copy(0, e->editor);
    +}
    +
+ +

cut_cb()

+ +

This callback function will call kf_cut() +to cut the currently selected text to the clipboard:

+ +
    +void cut_cb(Fl_Widget*, void* v) {
    +  EditorWindow* e = (EditorWindow*)v;
    +  Fl_Text_Editor::kf_cut(0, e->editor);
    +}
    +
+ +

delete_cb()

+ +

This callback function will call remove_selection() +to delete the currently selected text to the clipboard:

+ +
    +void delete_cb(Fl_Widget*, void* v) {
    +  textbuf->remove_selection();
    +}
    +
+ +

find_cb()

+ +

This callback function asks for a search string using the fl_input() +convenience function and then calls the find2_cb() +function to find the string: + +

    +void find_cb(Fl_Widget* w, void* v) {
    +  EditorWindow* e = (EditorWindow*)v;
    +  const char *val;
    +
    +  val = fl_input("Search String:", e->search);
    +  if (val != NULL) {
    +    // User entered a string - go find it!
    +    strcpy(e->search, val);
    +    find2_cb(w, v);
    +  }
    +
+ +

find2_cb()

+ +

This function will find the next occurrence of the search +string. If the search string is blank then we want to pop up the +search dialog: + +

    +void find2_cb(Fl_Widget* w, void* v) {
    +  EditorWindow* e = (EditorWindow*)v;
    +  if (e->search[0] == '\0') {
    +    // Search string is blank; get a new one...
    +    find_cb(w, v);
    +    return;
    +  }
    +
    +  int pos = e->editor->insert_position();
    +  int found = textbuf->search_forward(pos, e->search, &pos);
    +  if (found) {
    +    // Found a match; select and update the position...
    +    textbuf->select(pos, pos+strlen(e->search));
    +    e->editor->insert_position(pos+strlen(e->search));
    +    e->editor->show_insert_position();
    +  }
    +  else fl_alert("No occurrences of \'%s\' found!", e->search);
    +}
    +
+ +

If the search string cannot be found we use the fl_alert() +convenience function to display a message to that effect. + +

new_cb()

+

This callback function will clear the editor widget and current +filename. It also calls the check_save() function to give the +user the opportunity to save the current file first as needed: + +

    +void new_cb(Fl_Widget*, void*) {
    +  if (!check_save()) return;
    +
    +  filename[0] = '\0';
    +  textbuf->select(0, textbuf->length());
    +  textbuf->remove_selection();
    +  changed = 0;
    +  textbuf->call_modify_callbacks();
    +}
    +
+ +

open_cb()

+ +

This callback function will ask the user for a filename and then load +the specified file into the input widget and current filename. It also +calls the check_save() function to give the user the +opportunity to save the current file first as needed: + +

    +void open_cb(Fl_Widget*, void*) {
    +  if (!check_save()) return;
    +
    +  char *newfile = fl_file_chooser("Open File?", "*", filename);
    +  if (newfile != NULL) load_file(newfile, -1);
    +}
    +
+ +

We call the load_file() function to actually load the file. + +

paste_cb()

+ +

This callback function will call kf_paste() +to paste the clipboard at the current position:

+ +
    +void paste_cb(Fl_Widget*, void* v) {
    +  EditorWindow* e = (EditorWindow*)v;
    +  Fl_Text_Editor::kf_paste(0, e->editor);
    +}
    +
+ +

quit_cb()

+ +

The quit callback will first see if the current file has been +modified, and if so give the user a chance to save it. It then exits +from the program: + +

    +void quit_cb(Fl_Widget*, void*) {
    +  if (changed && !check_save())
    +    return;
    +
    +  exit(0);
    +}
    +
+ +

replace_cb()

+ +

The replace callback just shows the replace dialog: + +

    +void replace_cb(Fl_Widget*, void* v) {
    +  EditorWindow* e = (EditorWindow*)v;
    +  e->replace_dlg->show();
    +}
    +
+ +

replace2_cb()

+ +

This callback will replace the next occurence of the replacement +string. If nothing has been entered for the replacement string, then +the replace dialog is displayed instead: + +

    +void replace2_cb(Fl_Widget*, void* v) {
    +  EditorWindow* e = (EditorWindow*)v;
    +  const char *find = e->replace_find->value();
    +  const char *replace = e->replace_with->value();
    +
    +  if (find[0] == '\0') {
    +    // Search string is blank; get a new one...
    +    e->replace_dlg->show();
    +    return;
    +  }
    +
    +  e->replace_dlg->hide();
    +
    +  int pos = e->editor->insert_position();
    +  int found = textbuf->search_forward(pos, find, &pos);
    +
    +  if (found) {
    +    // Found a match; update the position and replace text...
    +    textbuf->select(pos, pos+strlen(find));
    +    textbuf->remove_selection();
    +    textbuf->insert(pos, replace);
    +    textbuf->select(pos, pos+strlen(replace));
    +    e->editor->insert_position(pos+strlen(replace));
    +    e->editor->show_insert_position();
    +  }
    +  else fl_alert("No occurrences of \'%s\' found!", find);
    +}
    +
+ +

replall_cb()

+ +

This callback will replace all occurences of the search +string in the file: + +

    +void replall_cb(Fl_Widget*, void* v) {
    +  EditorWindow* e = (EditorWindow*)v;
    +  const char *find = e->replace_find->value();
    +  const char *replace = e->replace_with->value();
    +
    +  find = e->replace_find->value();
    +  if (find[0] == '\0') {
    +    // Search string is blank; get a new one...
    +    e->replace_dlg->show();
    +    return;
    +  }
    +
    +  e->replace_dlg->hide();
    +
    +  e->editor->insert_position(0);
    +  int times = 0;
    +
    +  // Loop through the whole string
    +  for (int found = 1; found;) {
    +    int pos = e->editor->insert_position();
    +    found = textbuf->search_forward(pos, find, &pos);
    +
    +    if (found) {
    +      // Found a match; update the position and replace text...
    +      textbuf->select(pos, pos+strlen(find));
    +      textbuf->remove_selection();
    +      textbuf->insert(pos, replace);
    +      e->editor->insert_position(pos+strlen(replace));
    +      e->editor->show_insert_position();
    +      times++;
    +    }
    +  }
    +
    +  if (times) fl_message("Replaced %d occurrences.", times);
    +  else fl_alert("No occurrences of \'%s\' found!", find);
    +}
    +
+ +

replcan_cb()

+ +

This callback just hides the replace dialog: + +

    +void replcan_cb(Fl_Widget*, void* v) {
    +  EditorWindow* e = (EditorWindow*)v;
    +  e->replace_dlg->hide();
    +}
    +
+ +

save_cb()

+ +

This callback saves the current file. If the current filename is +blank it calls the "save as" callback: + +

    +void save_cb(void) {
    +  if (filename[0] == '\0') {
    +    // No filename - get one!
    +    saveas_cb();
    +    return;
    +  }
    +  else save_file(filename);
    +}
    +
+ +

The save_file() function saves the current file to the +specified filename. + +

saveas_cb()

+ +

This callback asks the user for a filename and saves the current file: + +

    +void saveas_cb(void) {
    +  char *newfile;
    +
    +  newfile = fl_file_chooser("Save File As?", "*", filename);
    +  if (newfile != NULL) save_file(newfile);
    +}
    +
+ +

The save_file() function saves the current file to the +specified filename. + +

Other Functions

+ +

Now that we've defined the callback functions, we need our support +functions to make it all work: + +

check_save()

+ +

This function checks to see if the current file needs to be saved. If +so, it asks the user if they want to save it: + +

    +int check_save(void) {
    +  if (!changed) return 1;
    +
    +  int r = fl_choice("The current file has not been saved.\n"
    +                    "Would you like to save it now?",
    +                    "Cancel", "Save", "Discard");
    +
    +  if (r == 1) {
    +    save_cb(); // Save the file...
    +    return !changed;
    +  }
    +
    +  return (r == 2) ? 1 : 0;
    +}
    +
+ +

load_file()

+ +

This function loads the specified file into the textbuf class: + +

    +int loading = 0;
    +void load_file(char *newfile, int ipos) {
    +  loading = 1;
    +  int insert = (ipos != -1);
    +  changed = insert;
    +  if (!insert) strcpy(filename, "");
    +  int r;
    +  if (!insert) r = textbuf->loadfile(newfile);
    +  else r = textbuf->insertfile(newfile, ipos);
    +  if (r)
    +    fl_alert("Error reading from file \'%s\':\n%s.", newfile, strerror(errno));
    +  else
    +    if (!insert) strcpy(filename, newfile);
    +  loading = 0;
    +  textbuf->call_modify_callbacks();
    +}
    +
+ +

When loading the file we use the loadfile() +method to "replace" the text in the buffer, or the insertfile() +method to insert text in the buffer from the named file. + +

save_file()

+ +

This function saves the current buffer to the specified file: + +

    +void save_file(char *newfile) {
    +  if (textbuf->savefile(newfile))
    +    fl_alert("Error writing to file \'%s\':\n%s.", newfile, strerror(errno));
    +  else
    +    strcpy(filename, newfile);
    +  changed = 0;
    +  textbuf->call_modify_callbacks();
    +}
    +
+ +

set_title()

+ +

This function checks the changed variable and updates the +window label accordingly: +

    +void set_title(Fl_Window* w) {
    +  if (filename[0] == '\0') strcpy(title, "Untitled");
    +  else {
    +    char *slash;
    +    slash = strrchr(filename, '/');
    +#ifdef WIN32
    +    if (slash == NULL) slash = strrchr(filename, '\\');
    +#endif
    +    if (slash != NULL) strcpy(title, slash + 1);
    +    else strcpy(title, filename);
    +  }
    +
    +  if (changed) strcat(title, " (modified)");
    +
    +  w->label(title);
    +}
    +
+ +

The main() Function

+ +

Once we've created all of the support functions, the only thing left +is to tie them all together with the main() function. +The main() function creates a new text buffer, creates a +new view (window) for the text, shows the window, loads the file on +the command-line (if any), and then enters the FLTK event loop: + +

    +int main(int argc, char **argv) {
    +  textbuf = new Fl_Text_Buffer;
    +
    +  Fl_Window* window = new_view();
    +
    +  window->show(1, argv);
    +
    +  if (argc > 1) load_file(argv[1], -1);
    +
    +  return Fl::run();
    +}
    +
+ +

Compiling the Editor

+ +

The complete source for our text editor can be found in the test/editor.cxx source file. Both the Makefile and Visual C++ +workspace include the necessary rules to build the editor. You can +also compile it using a standard compiler with: + +

    +CC -o editor editor.cxx -lfltk -lXext -lX11 -lm
    +
+ +

or by using the fltk-config script with: + +

    +fltk-config --compile editor.cxx
    +
+ +

As noted in Chapter 1, you may need to +include compiler and linker options to tell them where to find the FLTK +library. Also, the CC command may also be called gcc +or c++ on your system. + +

Congratulations, you've just built your own text editor!

+ +

The Final Product

+ +The final editor window should look like the image in Figure 4-2. + +

The completed editor window.
+Figure 4-2: The completed editor window

+ +

Advanced Features

+ +

Now that we've implemented the basic functionality, it is +time to show off some of the advanced features of the +Fl_Text_Editor widget. + +

Syntax Highlighting

+ +

The Fl_Text_Editor widget supports highlighting +of text with different fonts, colors, and sizes. The +implementation is based on the excellent NEdit text editor core, which +uses a parallel "style" buffer which tracks the font, color, and +size of the text that is drawn. + +

Styles are defined using the +Fl_Text_Display::Style_Table_Entry structure +defined in <FL/Fl_Text_Display.H>: + +

    +struct Style_Table_Entry {
    +  Fl_Color color;
    +  Fl_Font  font;
    +  int      size;
    +  unsigned attr;
    +};
    +
+ +

The color member sets the color for the text, +the font member sets the FLTK font index to use, +and the size member sets the pixel size of the +text. The attr member is currently not used. + +

For our text editor we'll define 7 styles for plain code, +comments, keywords, and preprocessor directives: + +

    +Fl_Text_Display::Style_Table_Entry styletable[] = {     // Style table
    +  { FL_BLACK,      FL_COURIER,        FL_NORMAL_SIZE }, // A - Plain
    +  { FL_DARK_GREEN, FL_COURIER_ITALIC, FL_NORMAL_SIZE }, // B - Line comments
    +  { FL_DARK_GREEN, FL_COURIER_ITALIC, FL_NORMAL_SIZE }, // C - Block comments
    +  { FL_BLUE,       FL_COURIER,        FL_NORMAL_SIZE }, // D - Strings
    +  { FL_DARK_RED,   FL_COURIER,        FL_NORMAL_SIZE }, // E - Directives
    +  { FL_DARK_RED,   FL_COURIER_BOLD,   FL_NORMAL_SIZE }, // F - Types
    +  { FL_BLUE,       FL_COURIER_BOLD,   FL_NORMAL_SIZE }  // G - Keywords
    +};
    +
+ +

You'll notice that the comments show a letter next to each +style - each style in the style buffer is referenced using a +character starting with the letter 'A'. + +

You call the highlight_data() method to associate the +style data and buffer with the text editor widget: + +

    +Fl_Text_Buffer *stylebuf;
    +
    +w->editor->highlight_data(stylebuf, styletable,
    +                          sizeof(styletable) / sizeof(styletable[0]),
    +                          'A', style_unfinished_cb, 0);
    +
+ +

Finally, you need to add a callback to the main text buffer so +that changes to the text buffer are mirrored in the style buffer: + +

    +textbuf->add_modify_callback(style_update, w->editor);
    +
+ +

The style_update() function, like the change_cb() +function described earlier, is called whenever text is added or removed from +the text buffer. It mirrors the changes in the style buffer and then updates +the style data as necessary: + +

    +//
    +// 'style_update()' - Update the style buffer...
    +//
    +
    +void
    +style_update(int        pos,          // I - Position of update
    +             int        nInserted,    // I - Number of inserted chars
    +             int        nDeleted,     // I - Number of deleted chars
    +             int        nRestyled,    // I - Number of restyled chars
    +             const char *deletedText, // I - Text that was deleted
    +             void       *cbArg) {     // I - Callback data
    +  int  start,                         // Start of text
    +       end;                           // End of text
    +  char last,                          // Last style on line
    +       *style,                        // Style data
    +       *text;                         // Text data
    +
    +
    +  // If this is just a selection change, just unselect the style buffer...
    +  if (nInserted == 0 && nDeleted == 0) {
    +    stylebuf->unselect();
    +    return;
    +  }
    +
    +  // Track changes in the text buffer...
    +  if (nInserted > 0) {
    +    // Insert characters into the style buffer...
    +    style = new char[nInserted + 1];
    +    memset(style, 'A', nInserted);
    +    style[nInserted] = '\0';
    +
    +    stylebuf->replace(pos, pos + nDeleted, style);
    +    delete[] style;
    +  } else {
    +    // Just delete characters in the style buffer...
    +    stylebuf->remove(pos, pos + nDeleted);
    +  }
    +
    +  // Select the area that was just updated to avoid unnecessary
    +  // callbacks...
    +  stylebuf->select(pos, pos + nInserted - nDeleted);
    +
    +  // Re-parse the changed region; we do this by parsing from the
    +  // beginning of the line of the changed region to the end of
    +  // the line of the changed region...  Then we check the last
    +  // style character and keep updating if we have a multi-line
    +  // comment character...
    +  start = textbuf->line_start(pos);
    +  end   = textbuf->line_end(pos + nInserted - nDeleted);
    +  text  = textbuf->text_range(start, end);
    +  style = stylebuf->text_range(start, end);
    +  last  = style[end - start - 1];
    +
    +  style_parse(text, style, end - start);
    +
    +  stylebuf->replace(start, end, style);
    +  ((Fl_Text_Editor *)cbArg)->redisplay_range(start, end);
    +
    +  if (last != style[end - start - 1]) {
    +    // The last character on the line changed styles, so reparse the
    +    // remainder of the buffer...
    +    free(text);
    +    free(style);
    +
    +    end   = textbuf->length();
    +    text  = textbuf->text_range(start, end);
    +    style = stylebuf->text_range(start, end);
    +
    +    style_parse(text, style, end - start);
    +
    +    stylebuf->replace(start, end, style);
    +    ((Fl_Text_Editor *)cbArg)->redisplay_range(start, end);
    +  }
    +
    +  free(text);
    +  free(style);
    +}
    +
+ +

The style_parse() function scans a copy of the +text in the buffer and generates the necessary style characters +for display. It assumes that parsing begins at the start of a line: + +

    +//
    +// 'style_parse()' - Parse text and produce style data.
    +//
    +
    +void
    +style_parse(const char *text,
    +            char       *style,
    +            int        length) {
    +  char             current;
    +  int             col;
    +  int             last;
    +  char             buf[255],
    +             *bufptr;
    +  const char *temp;
    +
    +  for (current = *style, col = 0, last = 0; length > 0; length --, text ++) {
    +    if (current == 'A') {
    +      // Check for directives, comments, strings, and keywords...
    +      if (col == 0 && *text == '#') {
    +        // Set style to directive
    +        current = 'E';
    +      } else if (strncmp(text, "//", 2) == 0) {
    +        current = 'B';
    +      } else if (strncmp(text, "/*", 2) == 0) {
    +        current = 'C';
    +      } else if (strncmp(text, "\\\"", 2) == 0) {
    +        // Quoted quote...
    +        *style++ = current;
    +        *style++ = current;
    +        text ++;
    +        length --;
    +        col += 2;
    +        continue;
    +      } else if (*text == '\"') {
    +        current = 'D';
    +      } else if (!last && islower(*text)) {
    +        // Might be a keyword...
    +        for (temp = text, bufptr = buf;
    +             islower(*temp) && bufptr < (buf + sizeof(buf) - 1);
    +             *bufptr++ = *temp++);
    +
    +        if (!islower(*temp)) {
    +          *bufptr = '\0';
    +
    +          bufptr = buf;
    +
    +          if (bsearch(&bufptr, code_types,
    +                      sizeof(code_types) / sizeof(code_types[0]),
    +                      sizeof(code_types[0]), compare_keywords)) {
    +            while (text < temp) {
    +              *style++ = 'F';
    +              text ++;
    +              length --;
    +              col ++;
    +            }
    +
    +            text --;
    +            length ++;
    +            last = 1;
    +            continue;
    +          } else if (bsearch(&bufptr, code_keywords,
    +                             sizeof(code_keywords) / sizeof(code_keywords[0]),
    +                             sizeof(code_keywords[0]), compare_keywords)) {
    +            while (text < temp) {
    +              *style++ = 'G';
    +              text ++;
    +              length --;
    +              col ++;
    +            }
    +
    +            text --;
    +            length ++;
    +            last = 1;
    +            continue;
    +          }
    +        }
    +      }
    +    } else if (current == 'C' && strncmp(text, "*/", 2) == 0) {
    +      // Close a C comment...
    +      *style++ = current;
    +      *style++ = current;
    +      text ++;
    +      length --;
    +      current = 'A';
    +      col += 2;
    +      continue;
    +    } else if (current == 'D') {
    +      // Continuing in string...
    +      if (strncmp(text, "\\\"", 2) == 0) {
    +        // Quoted end quote...
    +        *style++ = current;
    +        *style++ = current;
    +        text ++;
    +        length --;
    +        col += 2;
    +        continue;
    +      } else if (*text == '\"') {
    +        // End quote...
    +        *style++ = current;
    +        col ++;
    +        current = 'A';
    +        continue;
    +      }
    +    }
    +
    +    // Copy style info...
    +    if (current == 'A' && (*text == '{' || *text == '}')) *style++ = 'G';
    +    else *style++ = current;
    +    col ++;
    +
    +    last = isalnum(*text) || *text == '.';
    +
    +    if (*text == '\n') {
    +      // Reset column and possibly reset the style
    +      col = 0;
    +      if (current == 'B' || current == 'E') current = 'A';
    +    }
    +  }
    +}
    +
+ + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/enumerations.html b/third_party/windows/fltk-1.1.10/documentation/enumerations.html new file mode 100644 index 0000000..f84230f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/enumerations.html @@ -0,0 +1,306 @@ + + + C - FLTK Enumerations + + +

C - FLTK Enumerations

+ +

This appendix lists the enumerations provided in the +<FL/Enumerations.H> header file, organized by +section. Constants whose value is zero are marked with "(0)", +this is often useful to know when programming. + +

Version Numbers

+ The FLTK version number is stored in a number of compile-time +constants: +
    +
  • FL_MAJOR_VERSION - The major release number, currently 1.
  • +
  • FL_MINOR_VERSION - The minor release number, currently 1.
  • +
  • FL_PATCH_VERSION - The patch release number, currently 0.
  • +
  • FL_VERSION - A combined floating-point version number for +the major, minor, and patch release numbers, currently 1.0100.
  • +
+

Events

+ Events are identified by an Fl_Event enumeration value. The +following events are currently defined: +
    +
  • FL_NO_EVENT - No event (or an event fltk does not +understand) occurred (0).
  • +
  • FL_PUSH - A mouse button was pushed.
  • +
  • FL_RELEASE - A mouse button was released.
  • +
  • FL_ENTER - The mouse pointer entered a widget.
  • +
  • FL_LEAVE - The mouse pointer left a widget.
  • +
  • FL_DRAG - The mouse pointer was moved with a button + pressed.
  • +
  • FL_FOCUS - A widget should receive keyboard focus.
  • +
  • FL_UNFOCUS - A widget loses keyboard focus.
  • +
  • FL_KEYBOARD - A key was pressed.
  • +
  • FL_CLOSE - A window was closed.
  • +
  • FL_MOVE - The mouse pointer was moved with no buttons + pressed.
  • +
  • FL_SHORTCUT - The user pressed a shortcut key.
  • +
  • FL_DEACTIVATE - The widget has been deactivated.
  • +
  • FL_ACTIVATE - The widget has been activated.
  • +
  • FL_HIDE - The widget has been hidden.
  • +
  • FL_SHOW - The widget has been shown.
  • +
  • FL_PASTE - The widget should paste the contents of the + clipboard.
  • +
  • FL_SELECTIONCLEAR - The widget should clear any selections + made for the clipboard.
  • +
  • FL_MOUSEWHEEL - The horizontal or vertical mousewheel was turned.
  • +
  • FL_DND_ENTER - The mouse pointer entered a widget dragging data.
  • +
  • FL_DND_DRAG - The mouse pointer was moved dragging data.
  • +
  • FL_DND_LEAVE - The mouse pointer left a widget still dragging data.
  • +
  • FL_DND_RELEASE - Dragged data is about to be dropped.
  • +
+

Callback "When" Conditions

+ The following constants determine when a callback is performed: +
    +
  • FL_WHEN_NEVER - Never call the callback (0).
  • +
  • FL_WHEN_CHANGED - Do the callback only when the widget +value changes.
  • +
  • FL_WHEN_NOT_CHANGED - Do the callback whenever the user +interacts with the widget.
  • +
  • FL_WHEN_RELEASE - Do the callback when the button or key +is released and the value changes.
  • +
  • FL_WHEN_ENTER_KEY - Do the callback when the user presses + the ENTER key and the value changes.
  • +
  • FL_WHEN_RELEASE_ALWAYS - Do the callback when the button + or key is released, even if the value doesn't change.
  • +
  • FL_WHEN_ENTER_KEY_ALWAYS - Do the callback when the user + presses the ENTER key, even if the value doesn't change.
  • +
+

Fl::event_button() Values

+ +

The following constants define the button numbers for FL_PUSH and +FL_RELEASE events: + +

    +
  • FL_LEFT_MOUSE - the left mouse button +
  • FL_MIDDLE_MOUSE - the middle mouse button +
  • FL_RIGHT_MOUSE - the right mouse button +
+ +

Fl::event_key() Values

+ The following constants define the non-ASCII keys on the keyboard for +FL_KEYBOARD and FL_SHORTCUT events: +
    +
  • FL_Button - A mouse button; use Fl_Button + n + for mouse button n.
  • +
  • FL_BackSpace - The backspace key.
  • +
  • FL_Tab - The tab key.
  • +
  • FL_Enter - The enter key.
  • +
  • FL_Pause - The pause key.
  • +
  • FL_Scroll_Lock - The scroll lock key.
  • +
  • FL_Escape - The escape key.
  • +
  • FL_Home - The home key.
  • +
  • FL_Left - The left arrow key.
  • +
  • FL_Up - The up arrow key.
  • +
  • FL_Right - The right arrow key.
  • +
  • FL_Down - The down arrow key.
  • +
  • FL_Page_Up - The page-up key.
  • +
  • FL_Page_Down - The page-down key.
  • +
  • FL_End - The end key.
  • +
  • FL_Print - The print (or print-screen) key.
  • +
  • FL_Insert - The insert key.
  • +
  • FL_Menu - The menu key.
  • +
  • FL_Num_Lock - The num lock key.
  • +
  • FL_KP - One of the keypad numbers; use FL_KP + n + for number n.
  • +
  • FL_KP_Enter - The enter key on the keypad.
  • +
  • FL_F - One of the function keys; use FL_F + n + for function key n.
  • +
  • FL_Shift_L - The lefthand shift key.
  • +
  • FL_Shift_R - The righthand shift key.
  • +
  • FL_Control_L - The lefthand control key.
  • +
  • FL_Control_R - The righthand control key.
  • +
  • FL_Caps_Lock - The caps lock key.
  • +
  • FL_Meta_L - The left meta/Windows key.
  • +
  • FL_Meta_R - The right meta/Windows key.
  • +
  • FL_Alt_L - The left alt key.
  • +
  • FL_Alt_R - The right alt key.
  • +
  • FL_Delete - The delete key.
  • +
+

Fl::event_state() Values

+ The following constants define bits in the Fl::event_state() + value: +
    +
  • FL_SHIFT - One of the shift keys is down.
  • +
  • FL_CAPS_LOCK - The caps lock is on.
  • +
  • FL_CTRL - One of the ctrl keys is down.
  • +
  • FL_ALT - One of the alt keys is down.
  • +
  • FL_NUM_LOCK - The num lock is on.
  • +
  • FL_META - One of the meta/Windows keys is down.
  • +
  • FL_COMMAND - An alias for FL_CTRL on WIN32 and X11, or +FL_META on MacOS X.
  • +
  • FL_SCROLL_LOCK - The scroll lock is on.
  • +
  • FL_BUTTON1 - Mouse button 1 is pushed.
  • +
  • FL_BUTTON2 - Mouse button 2 is pushed.
  • +
  • FL_BUTTON3 - Mouse button 3 is pushed.
  • +
  • FL_BUTTONS - Any mouse button is pushed.
  • +
  • FL_BUTTON(n) - Mouse button N (N > 0) is pushed.
  • + +
+ +

Alignment Values

+ The following constants define bits that can be used with +Fl_Widget::align() to control the positioning of the +label: +
    +
  • FL_ALIGN_CENTER - The label is centered (0).
  • +
  • FL_ALIGN_TOP - The label is top-aligned.
  • +
  • FL_ALIGN_BOTTOM - The label is bottom-aligned.
  • +
  • FL_ALIGN_LEFT - The label is left-aligned.
  • +
  • FL_ALIGN_RIGHT - The label is right-aligned.
  • +
  • FL_ALIGN_CLIP - The label is clipped to the widget.
  • +
  • FL_ALIGN_WRAP - The label text is wrapped as needed.
  • +
  • FL_ALIGN_TOP_LEFT
  • +
  • FL_ALIGN_TOP_RIGHT
  • +
  • FL_ALIGN_BOTTOM_LEFT
  • +
  • FL_ALIGN_BOTTOM_RIGHT
  • +
  • FL_ALIGN_LEFT_TOP
  • +
  • FL_ALIGN_RIGHT_TOP
  • +
  • FL_ALIGN_LEFT_BOTTOM
  • +
  • FL_ALIGN_RIGHT_BOTTOM
  • +
  • FL_ALIGN_INSIDE - 'or' this with other values to put +label inside the widget.
  • + +
+

Fonts

+ The following constants define the standard FLTK fonts: +
    +
  • FL_HELVETICA - Helvetica (or Arial) normal (0).
  • +
  • FL_HELVETICA_BOLD - Helvetica (or Arial) bold.
  • +
  • FL_HELVETICA_ITALIC - Helvetica (or Arial) oblique.
  • +
  • FL_HELVETICA_BOLD_ITALIC - Helvetica (or Arial) +bold-oblique.
  • +
  • FL_COURIER - Courier normal.
  • +
  • FL_COURIER_BOLD - Courier bold.
  • +
  • FL_COURIER_ITALIC - Courier italic.
  • +
  • FL_COURIER_BOLD_ITALIC - Courier bold-italic.
  • +
  • FL_TIMES - Times roman.
  • +
  • FL_TIMES_BOLD - Times bold.
  • +
  • FL_TIMES_ITALIC - Times italic.
  • +
  • FL_TIMES_BOLD_ITALIC - Times bold-italic.
  • +
  • FL_SYMBOL - Standard symbol font.
  • +
  • FL_SCREEN - Default monospaced screen font.
  • +
  • FL_SCREEN_BOLD - Default monospaced bold screen font.
  • +
  • FL_ZAPF_DINGBATS - Zapf-dingbats font. +
+ +

Colors

+ +

The Fl_Color enumeration type holds a FLTK color value. +Colors are either 8-bit indexes into a virtual colormap or 24-bit RGB +color values. Color indices occupy the lower 8 bits of the value, while +RGB colors occupy the upper 24 bits, for a byte organization of RGBI. + +

Color Constants

+ +

Constants are defined for the user-defined foreground and background +colors, as well as specific colors and the start of the grayscale ramp +and color cube in the virtual colormap. Inline functions are provided to +retrieve specific grayscale, color cube, or RGB color values. + +

The following color constants can be used to access the user-defined +colors: + +

    + +
  • FL_BACKGROUND_COLOR - the default + background color
  • + +
  • FL_BACKGROUND2_COLOR - the default + background color for text, list, and valuator widgets
  • + +
  • FL_FOREGROUND_COLOR - the default + foreground color (0) used for labels and text
  • + +
  • FL_INACTIVE_COLOR - the inactive foreground + color
  • + +
  • FL_SELECTION_COLOR - the default selection/highlight + color
  • + +
+ +

The following color constants can be used to access the colors from the +FLTK standard color cube: + +

    + +
  • FL_BLACK
  • +
  • FL_BLUE
  • +
  • FL_CYAN
  • +
  • FL_DARK_BLUE
  • +
  • FL_DARK_CYAN
  • +
  • FL_DARK_GREEN
  • +
  • FL_DARK_MAGENTA
  • +
  • FL_DARK_RED
  • +
  • FL_DARK_YELLOW
  • +
  • FL_GREEN
  • +
  • FL_MAGENTA
  • +
  • FL_RED
  • +
  • FL_WHITE
  • +
  • FL_YELLOW
  • + +
+ +

The inline methods for getting a grayscale, color cube, or +RGB color value are described in Appendix B - Function +Reference. + +

Cursors

+ +

The following constants define the mouse cursors that are available in +FLTK. The double-headed arrows are bitmaps +provided by FLTK on X, the others are provided by system-defined +cursors.

+ +
    + +
  • FL_CURSOR_DEFAULT - the default cursor, usually an arrow (0)
  • +
  • FL_CURSOR_ARROW - an arrow pointer
  • +
  • FL_CURSOR_CROSS - crosshair
  • +
  • FL_CURSOR_WAIT - watch or hourglass
  • +
  • FL_CURSOR_INSERT - I-beam
  • +
  • FL_CURSOR_HAND - hand (uparrow on MSWindows)
  • +
  • FL_CURSOR_HELP - question mark
  • +
  • FL_CURSOR_MOVE - 4-pointed arrow
  • +
  • FL_CURSOR_NS - up/down arrow
  • +
  • FL_CURSOR_WE - left/right arrow
  • +
  • FL_CURSOR_NWSE - diagonal arrow
  • +
  • FL_CURSOR_NESW - diagonal arrow
  • +
  • FL_CURSOR_NONE - invisible
  • + +
+ +

FD "When" Conditions

+ +
    + +
  • FL_READ - Call the callback when there is data to be + read.
  • + +
  • FL_WRITE - Call the callback when data can be written + without blocking.
  • + +
  • FL_EXCEPT - Call the callback if an exception occurs on + the file.
  • + +
+ +

Damage Masks

+ The following damage mask bits are used by the standard FLTK widgets: +
    +
  • FL_DAMAGE_CHILD - A child needs to be redrawn.
  • +
  • FL_DAMAGE_EXPOSE - The window was exposed.
  • +
  • FL_DAMAGE_SCROLL - The Fl_Scroll widget was + scrolled.
  • +
  • FL_DAMAGE_OVERLAY - The overlay planes need to be redrawn.
  • +
  • FL_DAMAGE_USER1 - First user-defined damage bit.
  • +
  • FL_DAMAGE_USER2 - Second user-defined damage bit.
  • +
  • FL_DAMAGE_ALL - Everything needs to be redrawn.
  • +
+ diff --git a/third_party/windows/fltk-1.1.10/documentation/events.html b/third_party/windows/fltk-1.1.10/documentation/events.html new file mode 100644 index 0000000..5fac10b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/events.html @@ -0,0 +1,394 @@ + + + 6 - Handling Events + + + +

6 - Handling Events

+ +

This chapter discusses the FLTK event model and how to handle +events in your program or widget. + +

The FLTK Event Model

+ +

Every time a user moves the mouse pointer, clicks a button, +or presses a key, an event is generated and sent to your +application. Events can also come from other programs like the +window manager. + +

Events are identified by the integer argument passed to the +Fl_Widget::handle() virtual +method. Other information about the most recent event is stored in +static locations and acquired by calling the Fl::event_*() methods. This static +information remains valid until the next event is read from the window +system, so it is ok to look at it outside of the handle() +method. + +

Mouse Events

+ +

FL_PUSH

+ +

A mouse button has gone down with the mouse pointing at this +widget. You can find out what button by calling +Fl::event_button(). You find out the mouse position by +calling Fl::event_x() and Fl::event_y(). + +

A widget indicates that it "wants" the mouse click +by returning non-zero from its handle() method. It +will then become the +Fl::pushed() widget and will get FL_DRAG and +the matching FL_RELEASE events. If handle() +returns zero then FLTK will try sending the FL_PUSH to +another widget.

+ +

FL_DRAG

+ +

The mouse has moved with a button held down. The current +button state is in Fl::event_state(). +The mouse position is in Fl::event_x() and Fl::event_y(). + +

In order to receive FL_DRAG events, the widget must +return non-zero when handling FL_PUSH.

+ +

FL_RELEASE

+ +

A mouse button has been released. You can find out what +button by calling Fl::event_button(). + +

In order to receive the FL_RELEASE event, the widget must +return non-zero when handling FL_PUSH.

+ +

FL_MOVE

+ +

The mouse has moved without any mouse buttons held down. +This event is sent to the Fl::belowmouse() +widget.

+ +

In order to receive FL_MOVE events, the widget must +return non-zero when handling FL_ENTER.

+ +

FL_MOUSEWHEEL

+ +

The user has moved the mouse wheel. The Fl::event_dx() and Fl::event_dy() methods +can be used to find the amount to scroll horizontally and +vertically. + +

Focus Events

+ +

FL_ENTER

+ +

The mouse has been moved to point at this widget. This can +be used for highlighting feedback. If a widget wants to +highlight or otherwise track the mouse, it indicates this by +returning non-zero from its handle() method. It then +becomes the Fl::belowmouse() +widget and will receive FL_MOVE and FL_LEAVE +events. + +

FL_LEAVE

+ +

The mouse has moved out of the widget. + +

In order to receive the FL_LEAVE event, the widget must +return non-zero when handling FL_ENTER.

+ +

FL_FOCUS

+ +

This indicates an attempt to give a widget the +keyboard focus. + +

If a widget wants the focus, it should change itself to +display the fact that it has the focus, and return non-zero from +its handle() +method. It then becomes the Fl::focus() widget and gets +FL_KEYDOWN, FL_KEYUP, and FL_UNFOCUS +events. + +

The focus will change either because the window manager +changed which window gets the focus, or because the user tried +to navigate using tab, arrows, or other keys. You can check Fl::event_key() to +figure out why it moved. For navigation it will be the key +pressed and interaction with the window manager it will be +zero. + +

FL_UNFOCUS

+ +

This event is sent to the previous Fl::focus() widget when +another widget gets the focus or the window loses focus. + +

Keyboard Events

+ +

FL_KEYDOWN, FL_KEYUP

+ +

A key was pressed or released. The key can be found in Fl::event_key(). The +text that the key should insert can be found with Fl::event_text() and +its length is in Fl::event_length(). +If you use the key handle() should return 1. If you +return zero then FLTK assumes you ignored the key and will +then attempt to send it to a parent widget. If none of them want +it, it will change the event into a FL_SHORTCUT event. + +

To receive FL_KEYBOARD events you must also +respond to the FL_FOCUS and FL_UNFOCUS +events. + +

If you are writing a text-editing widget you may also want to +call the Fl::compose() +function to translate individual keystrokes into foreign +characters. + +

FL_KEYUP events are sent to the widget that +currently has focus. This is not necessarily the same widget +that received the corresponding FL_KEYDOWN event +because focus may have changed between events. + +

FL_SHORTCUT

+ +

If the Fl::focus() +widget is zero or ignores an FL_KEYBOARD event then +FLTK tries sending this event to every widget it can, until one +of them returns non-zero. FL_SHORTCUT is first sent to +the Fl::belowmouse() widget, then its parents and +siblings, and eventually to every widget in the window, trying +to find an object that returns non-zero. FLTK tries really hard +to not to ignore any keystrokes! + +

You can also make "global" shortcuts by using Fl::add_handler(). A +global shortcut will work no matter what windows are displayed +or which one has the focus.

+ +

Widget Events

+ +

FL_DEACTIVATE

+ +

This widget is no longer active, due to deactivate() +being called on it or one of its parents. active() may +still be true after this, the widget is only active if +active() is true on it and all its parents (use active_r() to check this). + +

FL_ACTIVATE

+ +

This widget is now active, due to activate() +being called on it or one of its parents. + +

FL_HIDE

+ +

This widget is no longer visible, due to hide() being +called on it or one of its parents, or due to a parent window +being minimized. visible() may still be true after +this, but the widget is visible only if visible() is +true for it and all its parents (use visible_r() to +check this). + +

FL_SHOW

+ +

This widget is visible again, due to show() being +called on it or one of its parents, or due to a parent window +being restored. Child Fl_Windows respond to this by +actually creating the window if not done already, so if you +subclass a window, be sure to pass FL_SHOW to the base +class handle() method! + +

Clipboard Events

+ +

FL_PASTE

+ +

You should get this event some time after you call Fl::paste(). The contents +of Fl::event_text() +is the text to insert and the number of characters is in Fl::event_length(). + +

FL_SELECTIONCLEAR

+ +

The Fl::selection_owner() +will get this event before the selection is moved to another +widget. This indicates that some other widget or program has +claimed the selection. Motif programs used this to clear the +selection indication. Most modern programs ignore this. + +

Drag And Drop Events

+ +

FLTK supports drag and drop of text and files from any +application on the desktop. Text is transfered using +the current code page. Files are received as a list of full path +and file names, separated by newline. On some platforms, path +names are prepended with file://. + +

The drag and drop data is available in Fl::event_text() +at the concluding FL_PASTE. On some platforms, the +event text is also available for the FL_DND_* events, +however application must not depend on that behavior because it +depends on the protocol used on each platform. + +

FL_DND_* events cannot be used in widgets derived +from Fl_Group or Fl_Window. + +

FL_DND_ENTER

+ +

The mouse has been moved to point at this widget. A widget +that is interested in receiving drag'n'drop data must return 1 +to receive FL_DND_DRAG, FL_DND_LEAVE and FL_DND_RELEASE events. + +

FL_DND_DRAG

+ +

The mouse has been moved inside a widget while dragging data. +A widget that is interested in receiving drag'n'drop data should +indicate the possible drop position. + +

FL_DND_LEAVE

+ +

The mouse has moved out of the widget. + +

FL_DND_RELEASE

+ +

The user has released the mouse button dropping data into +the widget. If the widget returns 1, it will receive the data in +the immediately following FL_PASTE event. + + + +

Fl::event_*() methods

+ +

FLTK keeps the information about the most recent event in +static storage. This information is good until the next event is +processed. Thus it is valid inside handle() and +callback() methods. + +

These are all trivial inline functions and thus very fast and small:

+ + + +

Event Propagation

+ +

FLTK follows very simple and unchangeable rules for sending +events. The major innovation is that widgets can indicate (by +returning 0 from the handle() method) that they are not +interested in an event, and FLTK can then send that event +elsewhere. This eliminates the need for "interests" +(event masks or tables), and this is probably the main reason +FLTK is much smaller than other toolkits. + +

Most events are sent directly to the handle() method +of the Fl_Window that the window system says they +belong to. The window (actually the Fl_Group that +Fl_Window is a subclass of) is responsible for sending +the events on to any child widgets. To make the +Fl_Group code somewhat easier, FLTK sends some events +(FL_DRAG, FL_RELEASE, FL_KEYBOARD, +FL_SHORTCUT, FL_UNFOCUS, and +FL_LEAVE) directly to leaf widgets. These procedures +control those leaf widgets: + +

+ +

FLTK Compose-Character Sequences

+ +

The foreign-letter compose processing done by the Fl_Input widget is provided in +a function that you can call if you are writing your own text editor +widget. + +

FLTK uses its own compose processing to allow "preview" of +the partially composed sequence, which is impossible with the +usual "dead key" processing. + +

Although currently only characters in the ISO-8859-1 +character set are handled, you should call this in case any +enhancements to the processing are done in the future. The +interface has been designed to handle arbitrary UTF-8 encoded +text. + +

The following methods are provided for character composition: + +

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/examples.html b/third_party/windows/fltk-1.1.10/documentation/examples.html new file mode 100644 index 0000000..a748a4c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/examples.html @@ -0,0 +1,453 @@ + + + I - Tests and Demo Source Code + + + +

I - Tests and Demo Source Code

+ +

March 19, 2005

+ +

The FLTK distribution contains over 60 sample applications written +in, or ported to, FLTK. If the FLTK archive you received does not +contain a 'test' directory, you can download the complete FLTK +distribution from +http://fltk.org/software.php.

+ +

Most of the example programs were created while testing a group of widgets. +They are not meant to be great achievements in clean C++ programming, but merely +a test platform to verify the functionality of the FLTK library.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Example Applications
adjusterarcaskbitmapblocksboxtype
browserbuttonbuttonscheckersclockcolbrowser
color_choosercubeCubeViewcursorcurvedemo
doublebuffereditorfast_slowfile_chooserfluidfonts
formsfractalsfullscreengl_overlayglpuzzlehello
helpiconizeimageinactiveinputinput_choice
keyboardlabelline_stylelist_visualsmandelbrotmenubar
messageminimumnavigationoutputoverlaypack
pixmap_browserpixmappreferencesradioresizeboxresize
scrollshapesubwindowsudokusymbolstabs
threadstiletiled_imagevaluators
+ +

adjuster

+adjuster shows a nifty little widget for quickly +setting values in a great range. + +

arc

+The arc demo explains how to derive your own widget to +generate some custom drawings. The sample drawings use the matrix +based arc drawing for some fun effects. + +

ask

+ask shows some of FLTK's standard dialog boxes. Click +the correct answers or you may end up in a loop, or you may end +up in a loop, or you... . + +

bitmap

+This simple test shows the use of a single color bitmap as a +label for a box widget. Bitmaps are stored in the X11 '.bmp' +file format and can be part of the source code. + +

blocks

+A wonderful and addictive game that shows the usage of FLTK +timers, graphics, and how to implement sound on all platforms. +blocks is also a good example for the Mac OS X specific +bundle format. + +

boxtype

+boxtype gives an overview of readily available boxes and +frames in FLTK. More types can be added by the application programmer. +When using themes, FLTK shuffles boxtypes around to give your program +a new look. + +

browser

+browser shows the capabilities of the Fl_Browser widget. +Important features tested are loading of files, line formatting, and +correct positioning of the browser data window. + +

button

+The button test is a simple demo of push-buttons and callbacks. + +

buttons

+buttons shows a sample of FLTK button types. + +

checkers

+Written by Steve Poulsen in early 1979, checkers shows +how to convert a VT100 text-terminal based program into a neat +application with a graphical UI. Check out the code that drags the +pieces, and how the pieces are drawn by layering. Then tell me +how to beat the computer at Checkers. + +

clock

+The clock demo shows two analog clocks. The innards of +the Fl_Clock widget are pretty interesting, explaining +the use of timeouts and matrix based drawing. + +

colbrowser

+colbrowser runs only on X11 systems. It reads +/usr/lib/X11/rgb.txt to show the color representation +of every text entry in the file. This is beautiful, but +only moderately useful unless your UI is written in Motif. + +

color_chooser

+The color_chooser gives a short demo of FLTK's palette based +color chooser and of the RGB based color wheel. + +

cube

+The cube demo shows the speed of OpenGL. It also tests +the ability to render two OpenGL buffers into a single window, +and shows OpenGL text. + +

CubeView

+CubeView shows how to create a UI containing OpenGL with Fluid. + +

cursor

+The cursor demo shows all mouse cursor shapes that come standard +with FLTK. The fgcolor and bgcolor sliders work only +on few systems (some version of Irix for example). + +

curve

+curve draws a nice Bezier curve into a custom widget. The +points option for splines is not supported on all platforms. + +

demo

+This tool allows quick access to all programs in the test directory. +demo is based on the visuals of the IrixGL demo program. The menu +tree can be changed by editing test/demo.menu. + +

doublebuffer

+The doublebuffer demo shows the difference between a single +buffered window, which may flicker during a slow redraw, and a +double buffered window, which never flickers, but uses twice the +amount of RAM. Some modern OS's double buffer all windows automatically +to allow transparency and shadows on the desktop. FLTK is smart enough +to not tripple buffer a window in that case. + +

editor

+FLTK has two very different text input widgets. Fl_Input +and derived classes are rather leight weight, however +Fl_Text_Editor is a complete port of nedit (with permission). +The editor test is almost a full application, showing custom +syntax highlighting and dialog creation. + +

fast_slow

+fast_slow shows how an application can use the when() +setting to receive different kinds of callbacks. + +

file_chooser

+The standard FLTK file_chooser is the result of many +iterations, trying to find a middle ground between a complex +browser and a fast light implementation. + +

fonts

+fonts shows all available text fonts on the host system. +If your machine still has some pixmap based fonts, the supported +sizes will be shown in bold face. Only the first 256 fonts will +be listed. + +

forms

+forms is an XForms program with very few changes. +Search for "fltk" to find all changes necessary to port to fltk. +This demo shows the different boxtypes. Note that some +boxtypes are not appropriate for some objects. + +

fractals

+fractals shows how to mix OpenGL, Glut and FLTK code. +FLTK supports a rather large subset of Glut, so that many Glut +applications compile just fine. + +

fullscreen

+This demo shows how to do many of the window manipulations that +are popular for games. +You can toggle the border on/off, switch between single- +and double-buffered rendering, and take over the entire +screen. More information in the source code. + +

gl_overlay

+gl_overlay shows OpenGL overlay plane rendering. If no +hardware overlay plane is available, FLTK will simulate it +for you. + +

glpuzzle

+The glpuzzle test shows how most Glut source code compiles +easily under FLTK. + +

hello

+hello: Hello, World. Need I say more? Well, maybe. This +tiny demo shows how little is needed to get a functioning application +running with FLTK. Quite impressive, I'd say. + +

help

+help displays the built-in FLTK help browser. The +Fl_Help_Dialog understands a subset of html and renders +various image formats. This widget makes it easy to provide help +pages to the user without depending on the operating system's +html browser. + +

iconize

+iconize demonstrates the effect of the window functions +hide(), iconize(), and show(). + +

image

+The image demo shows how an image can be created on the fly. +This generated image contains an alpha (transparency) channel which +lets previous renderings 'shine through', either via true +transparency or by using screen door transparency (pixelation). + +

inactive

+inactive tests the correct rendering of inactive widgets. +To see the inactive version of images, you can check out the pixmap +or image test. + +

input

+This tool shows and tests different types of text input fields based on +Fl_Input_. The input program also tests various +settings of Fl_Input::when(). + +

input_choice

+input_choice tests the latest addition to FLTK1, a text input +field with an attached pulldown menu. Windows users will recognize +similarities to the 'ComboBox'. input_choice starts up in +'plastic' scheme, but the traditional scheme is also supported. + +

keyboard

+FLTK unifies keyboard events for all platforms. The keyboard +test can be used to check the return values of Fl::event_key() +and Fl::event_text(). It is also great to see the modifier +buttons and the scroll wheel at work. Quit this application by closing +the window. The ESC key will not work. + +

label

+Every FLTK widget can have a label attached to it. The label +demo shows alignment, clipping, and wrapping of text labels. Labels +can contain symbols at the start and end of the text, like @FLTK +or @circle uh-huh @square. + +

line_style

+Advanced line drawing can be tested with line_style. +Not all platforms support all line styles. + +

list_visuals

+This little app finds all available pixel formats for the current X11 +screen. But since you are now an FLTK user, you don't have to worry +about any of this. + +

mandelbrot

+mandelbrot shows two advanced topics in one test. It creates +grayscale images on the fly, updating them via the idle callback +system. This is one of the few occasions where the idle callback +is very useful by giving all available processor time to the application +without blocking the UI or other apps. + +

menubar

+The menubar tests many aspects of FLTK's popup menu system. +Among the features are radio buttons, menus taller than the screen, +arbitrary sub menu depth, and global shortcuts. + +

message

+message pops up a few of FLTK's standard message boxes. + +

minimum

+The minimum test program verifies that the update regions +are set correctly. In a real life application, the trail would +be avoided by choosing a smaller label or by setting label clipping +differently. + +

navigation

+navigation demonstrates how the text cursor moves from +text field to text field when using the arrow keys, tab, and shift-tab. + +

output

+output shows the difference between the single line and +multi line mode of the Fl_Output widget. Fonts can be +selected from the FLTK standard list of fonts. + +

overlay

+The overlay test app shows how easy an FLTK window can +be layered to display cursor and manipulator style elements. This +example derives a new class from Fl_Overlay_Window and +provides a new function to draw custom overlays. + +

pack

+The pack test program demonstrates the resizing +and repositioning of children of the Fl_Pack group. +Putting an Fl_Pack into an Fl_Scroll is +a useful way to create a browser for large sets of data. + +

pixmap_browser

+pixmap_browser tests the shared-image interface. When using +the same image multiple times, Fl_Shared_Image will keep it +only once in memory. + +

pixmap

+This simple test shows the use of a LUT based pixmap as a +label for a box widget. Pixmaps are stored in the X11 '.xpm' +file format and can be part of the source code. Pixmaps support +one transparent color. + +

preferences

+I do have my preferences in the morning, but sometimes I +just can't remember a thing. This is where the Fl_Preferences +come in handy. They remember any kind of data between program launches. + +

radio

+The radio tool was created entirely with fluid. It +shows some of the available button types and tests radio +button behavior. + +

resizebox

+resizebox shows some possible ways of FLTK's automatic +resize behavior. + +

resize

+The resize demo tests size and position functions with +the given window manager. + +

scroll

+scroll shows how to scroll an area of widgets, one of +them being a slow custom drawing. Fl_Scroll uses +clipping and smart window area copying to improve redraw speed. +The buttons at the bottom of the window control decoration rendering +and updates. + +

shape

+shape is a very minimal demo that shows how to create +your own OpenGL rendering widget. Now that you know that, go ahead +and write that flight simulator you always dreamt of. + +

subwindow

+The subwindow demo tests messaging and drawing between +the main window and 'true' sub windows. A sub window is different +to a group by resetting the FLTK coordinate system to 0, 0 in the +top left corner. On Win32 and X11, subwindows have their own +operating system specific handle. + +

sudoku

+Another highly addictive game - don't play it, I warned you. +The implementation shows how to create application icons, +how to deal with OS specifics, and how to generate sound. + +

symbols

+symbols are a speciality of FLTK. These little vector +drawings can be integrated into labels. They scale and rotate, +and with a little patience, you can define your own. The rotation +number refers to 45 degree rotations if you were looking at a +numeric keypad (2 is down, 6 is right, etc.). + +

tabs

+The tabs tool was created with fluid. It tests +correct hiding and redisplaying of tabs, navigation across tabs, +resize behavior, and no unneeded redrawing of invisible widgets. + +

The tabs application shows the Fl_Tabs widget +on the left and the Fl_Wizard widget on the right side +for direct comparison of these two panel management widgets. + +

threads

+FLTK can be used in a multithreading environment. There are some +limitations, mostly due to the underlying operating system. +threads shows how to use Fl::lock(), +Fl::unlock(), and Fl::awake() in secondary threads +to keep FLTK happy. Although locking works on all platforms, +this demo is not available on every machine. + +

tile

+The tile tool shows a nice way of using Fl_Tile. +To test correct resizing of subwindows, the widget for region +1 is created from an Fl_Window class. + +

tiled_image

+The tiled_image demo uses an image as the background +for a window by repeating it over the full size of the widget. +The window is resizable and shows how the image gets repeated. + +

valuators

+valuators shows all of FLTK's nifty widgets to change +numeric values. + +

fluid

+fluid is not only a big test program, but also a very +useful visual UI designer. Many parts of fluid were +created using fluid. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/fl_alert.gif b/third_party/windows/fltk-1.1.10/documentation/fl_alert.gif new file mode 100644 index 0000000..be008e3 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fl_alert.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fl_ask.gif b/third_party/windows/fltk-1.1.10/documentation/fl_ask.gif new file mode 100644 index 0000000..00a9fbb Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fl_ask.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fl_choice.gif b/third_party/windows/fltk-1.1.10/documentation/fl_choice.gif new file mode 100644 index 0000000..940b22c Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fl_choice.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fl_color_chooser.jpg b/third_party/windows/fltk-1.1.10/documentation/fl_color_chooser.jpg new file mode 100644 index 0000000..55dd82f Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fl_color_chooser.jpg differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fl_input.gif b/third_party/windows/fltk-1.1.10/documentation/fl_input.gif new file mode 100644 index 0000000..63dc51c Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fl_input.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fl_message.gif b/third_party/windows/fltk-1.1.10/documentation/fl_message.gif new file mode 100644 index 0000000..7780206 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fl_message.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fl_password.gif b/third_party/windows/fltk-1.1.10/documentation/fl_password.gif new file mode 100644 index 0000000..0523b57 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fl_password.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fl_show_colormap.gif b/third_party/windows/fltk-1.1.10/documentation/fl_show_colormap.gif new file mode 100644 index 0000000..5c3b351 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fl_show_colormap.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fltk-config.man b/third_party/windows/fltk-1.1.10/documentation/fltk-config.man new file mode 100644 index 0000000..168cb5e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/fltk-config.man @@ -0,0 +1,90 @@ +.TH fltk\-config 1 "Fast Light Tool Kit" "6 February 2007" +.SH NAME +fltk\-config \- script to get information about the installed version of fltk. +.sp +.SH SYNOPSIS +fltk\-config [ \-\-prefix +.I [=DIR] +] [ \-\-exec\-prefix +.I [=DIR] +] [ \-\-version ] [ \-\-api\-version ] [ \-\-use\-gl ] [ \-\-use\-images ] +[ \-\-use\-glut ] +[ \-\-cc ] [ \-\-cxx ] +[ \-\-cflags ] [ \-\-cxxflags ] [ \-\-ldflags ] [ \-\-ldstaticflags ] +[ \-\-libs ] +[ \-D\fIname[=value]\fR ] [ \-g ] [ \-\-compile +.I program.cxx +] +.SH DESCRIPTION +\fIfltk\-config\fR is a utility script that can be used to get information +about the current version of FLTK that is installed on the system, what +compiler and linker options to use when building FLTK-based applications, +and to build simple FLTK applications. +.LP +The following options are supported: +.TP 5 +\-\-api\-version +.br +Displays the current FLTK API version number, e.g. "1.1". +.TP 5 +\-\-cc +.TP 5 +\-\-cxx +.br +Displays the C/C++ compiler that was used to compile FLTK. +.TP 5 +\-\-cflags +.TP 5 +\-\-cxxflags +.br +Displays the C/C++ compiler options to use when compiling source +files that use FLTK. +.TP 5 +\-\-compile \fIprogram.cxx\fR +.br +Compiles the source file \fIprogram.cxx\fR into \fIprogram\fR. +This option implies "\-\-post \fIprogram\fR". +.TP 5 +\-g +.br +Enables debugging information when compiling with the \fI\-\-compile\fR +option. +.TP 5 +\-\-ldflags +.br +Displays the linker options to use when linking a FLTK +application. +.TP 5 +\-\-ldstaticflags +.br +Displays the linker options to use when linking a FLTK +application to the static FLTK libraries. +.TP 5 +\-\-libs +.br +Displays the full path to the FLTK library files, to be used for +dependency checking. +.TP 5 +\-\-use\-gl +.br +Enables OpenGL support. +.TP 5 +\-\-use\-glut +.br +Enables GLUT support. +.TP 5 +\-\-use\-images +.br +Enables image file support. +.TP 5 +\-\-version +.br +Displays the current FLTK version number, e.g. "1.1.0". +.SH SEE ALSO +fluid(1), fltk(3) +.br +FLTK Programming Manual +.br +FLTK Web Site, http://www.fltk.org/ +.SH AUTHORS +Bill Spitzak and others. diff --git a/third_party/windows/fltk-1.1.10/documentation/fltk.book b/third_party/windows/fltk-1.1.10/documentation/fltk.book new file mode 100644 index 0000000..2a46680 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/fltk.book @@ -0,0 +1,108 @@ +#HTMLDOC 1.8.27.1 +-t pdf13 -f "fltk.pdf" --book --toclevels 2 --no-numbered --toctitle "Table of Contents" --title --titleimage "FL.gif" --linkstyle underline --size Universal --left 1.00in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --header1 ... --footer h.1 --nup 1 --tocheader .t. --tocfooter ..i --duplex --portrait --color --no-pscommands --no-xrxcomments --compression=9 --jpeg=50 --fontsize 11.0 --fontspacing 1.2 --headingfont Helvetica --bodyfont Times --headfootsize 11.0 --headfootfont Helvetica --charset iso-8859-1 --links --no-embedfonts --pagemode outline --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password "" --user-password "" --browserwidth 680 --strict --no-overflow +preface.html +intro.html +basics.html +common.html +editor.html +drawing.html +events.html +subclassing.html +opengl.html +fluid.html +widgets.html +advanced.html +Fl.html +Fl_Adjuster.html +Fl_Bitmap.html +Fl_BMP_Image.html +Fl_Box.html +Fl_Browser_.html +Fl_Browser.html +Fl_Button.html +Fl_Chart.html +Fl_Check_Browser.html +Fl_Check_Button.html +Fl_Choice.html +Fl_Clock.html +Fl_Clock_Output.html +Fl_Color_Chooser.html +Fl_Counter.html +Fl_Dial.html +Fl_Double_Window.html +Fl_End.html +Fl_File_Browser.html +Fl_File_Chooser.html +Fl_File_Icon.html +Fl_File_Input.html +Fl_Float_Input.html +Fl_Free.html +Fl_GIF_Image.html +Fl_Gl_Window.html +Fl_Group.html +Fl_Help_Dialog.html +Fl_Help_View.html +Fl_Hold_Browser.html +Fl_Image.html +Fl_Input.html +Fl_Input_.html +Fl_Input_Choice.html +Fl_Int_Input.html +Fl_JPEG_Image.html +Fl_Light_Button.html +Fl_Menu_.html +Fl_Menu_Bar.html +Fl_Menu_Button.html +Fl_Menu_Item.html +Fl_Menu_Window.html +Fl_Multi_Browser.html +Fl_Multiline_Input.html +Fl_Multiline_Output.html +Fl_Output.html +Fl_Overlay_Window.html +Fl_Pack.html +Fl_Pixmap.html +Fl_PNG_Image.html +Fl_PNM_Image.html +Fl_Positioner.html +Fl_Preferences.html +Fl_Progress.html +Fl_Repeat_Button.html +Fl_RGB_Image.html +Fl_Return_Button.html +Fl_Roller.html +Fl_Round_Button.html +Fl_Scroll.html +Fl_Scrollbar.html +Fl_Secret_Input.html +Fl_Select_Browser.html +Fl_Shared_Image.html +Fl_Single_Window.html +Fl_Slider.html +Fl_Spinner.html +Fl_Tabs.html +Fl_Text_Buffer.html +Fl_Text_Display.html +Fl_Text_Editor.html +Fl_Tile.html +Fl_Tiled_Image.html +Fl_Timer.html +Fl_Toggle_Button.html +Fl_Tooltip.html +Fl_Valuator.html +Fl_Value_Input.html +Fl_Value_Output.html +Fl_Value_Slider.html +Fl_Widget.html +Fl_Window.html +Fl_Wizard.html +Fl_XBM_Image.html +Fl_XPM_Image.html +functions.html +enumerations.html +glut.html +forms.html +osissues.html +migration.html +license.html +examples.html diff --git a/third_party/windows/fltk-1.1.10/documentation/fltk.man b/third_party/windows/fltk-1.1.10/documentation/fltk.man new file mode 100644 index 0000000..c7c8846 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/fltk.man @@ -0,0 +1,55 @@ +.TH fltk 3 "Fast Light Tool Kit" "6 January 2002" +.SH NAME +fltk \- the fast light tool kit +.sp +.SH SYNOPSIS +The Fast Light Tool Kit ("FLTK", pronounced "fulltick") is a +C++ graphical user interface toolkit for the X Window +System, MacOS(r), and Microsoft Windows(r) that supports OpenGL(r). +It was originally developed by Mr. Bill Spitzak and is currently +maintained by a small group of developers across the world with +a central repository in the US. +.LP +FLTK is provides under the terms of the GNU Library General Public License, +with the following exceptions: +.IP +1. Modifications to the FLTK configure script, config header +file, and makefiles by themselves to support a specific platform +do not constitute a modified or derivative work. +.IP +The authors do request that such modifications be +contributed to the FLTK project - send all +contributions to "fltk\-bugs@fltk.org". +.IP +2. Widgets that are subclassed from FLTK widgets do not +constitute a derivative work. +.IP +3. Static linking of applications and widgets to the FLTK +library does not constitute a derivative work and does not +require the author to provide source code for the application or +widget, use the shared FLTK libraries, or link their +applications or widgets against a user-supplied version of FLTK. +.IP +If you link the application or widget to a modified version of +FLTK, then the changes to FLTK must be provided under the terms +of the LGPL in sections 1, 2, and 4. +.IP +4. You do not have to provide a copy of the FLTK license with +programs that are linked to the FLTK library, nor do you have to +identify the FLTK license in your program or documentation as +required by section 6 of the LGPL. +.IP +However, programs must still identify their use of FLTK. The +following example statement can be included in user +documentation to satisfy this requirement: +.IP +[program/widget] is based in part on the work of the FLTK +project (http://www.fltk.org). +.SH SEE ALSO +fltk\-config(1), fluid(1) +.br +FLTK Programming Manual +.br +FLTK Web Site, http://www.fltk.org/ +.SH AUTHORS +Bill Spitzak and others. diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid-catgets.gif b/third_party/windows/fltk-1.1.10/documentation/fluid-catgets.gif new file mode 100644 index 0000000..d81b200 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fluid-catgets.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid-gettext.gif b/third_party/windows/fltk-1.1.10/documentation/fluid-gettext.gif new file mode 100644 index 0000000..db16081 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fluid-gettext.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid-org.gif b/third_party/windows/fltk-1.1.10/documentation/fluid-org.gif new file mode 100644 index 0000000..e6e2ff6 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fluid-org.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid.html b/third_party/windows/fltk-1.1.10/documentation/fluid.html new file mode 100644 index 0000000..5d891a5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/fluid.html @@ -0,0 +1,1363 @@ + + + 9 - Programming with FLUID + + +

9 - Programming with FLUID

+ +

This chapter shows how to use the Fast Light User-Interface Designer +("FLUID") to create your GUIs.

+ +

Subchapters: +

+ +

What is FLUID?

+ +

The Fast Light User Interface Designer, or FLUID, is a +graphical editor that is used to produce FLTK source code. FLUID +edits and saves its state in .fl files. These files +are text, and you can (with care) edit them in a text editor, +perhaps to get some special effects.

+ +

FLUID can "compile" the .fl file into a +.cxx and a .h file. The .cxx file +defines all the objects from the .fl file and the +.h file declares all the global ones. FLUID also +supports localization (Internationalization) +of label strings using message files and the GNU gettext or +POSIX catgets interfaces. + +

A simple program can be made by putting all your code (including a +main() function) into the .fl file and thus making the .cxx file a +single source file to compile. Most programs are more complex than +this, so you write other .cxx files that call the FLUID functions. +These .cxx files must #include the .h file or they can +#include the .cxx file so it still appears to be a single source +file. + +

FLUID organization.
+Figure 9-1: FLUID organization.

+ +

Normally the FLUID file defines one or more functions or classes which +output C++ code. Each function defines a one or more FLTK +windows, and all the widgets that go inside those windows.

+

Widgets created by FLUID are either "named", "complex named" or +"unnamed". A named widget has a legal C++ variable identifier as its +name (i.e. only alphanumeric and underscore). In this case FLUID +defines a global variable or class member that will point at the widget +after the function defining it is called. A complex named object has +punctuation such as '.' or '->' or any other symbols in its name. In +this case FLUID assigns a pointer to the widget to the name, but does +not attempt to declare it. This can be used to get the widgets into +structures. An unnamed widget has a blank name and no pointer is stored.

+

Widgets may either call a named callback function that you write in +another source file, or you can supply a small piece of C++ source and +FLUID will write a private callback function into the .cxx file.

+

Running FLUID Under UNIX

+ To run FLUID under UNIX, type: +
    +
    +fluid filename.fl &
    +
+to edit the .fl file filename.fl. If the file does not exist +you will get an error pop-up, but if you dismiss it you will be editing +a blank file of that name. You can run FLUID without any name, in +which case you will be editing an unnamed blank setup (but you can use +save-as to write it to a file). +

You can provide any of the standard FLTK switches before the filename:

+
    +
    +-display host:n.n
    +-geometry WxH+X+Y
    +-title windowtitle
    +-name classname
    +-iconic
    +-fg color
    +-bg color
    +-bg2 color
    +-scheme schemename
    +
    +
+ +

Changing the colors may be useful to see what your interface +will look at if the user calls it with the same switches. +Similarly, using "-scheme plastic" will show how the interface +will look using the "plastic" scheme. + +

In the current version, if you don't put FLUID into the +background with '&' then you will be able to abort FLUID by +typing CTRL-C on the terminal. It will exit +immediately, losing any changes.

+ +

Running FLUID Under Microsoft Windows

+ +

To run FLUID under WIN32, double-click on the FLUID.exe +file. You can also run FLUID from the Command Prompt window. +FLUID always runs in the background under WIN32. + +

Compiling .fl files

+ +

FLUID can also be called as a command-line +"compiler" to create the .cxx and .h +file from a .fl file. To do this type: + +

    +fluid -c filename.fl
    +
+ +

This will read the filename.fl file and write +filename.cxx and filename.h. Any leading +directory on filename.fl will be stripped, so they are +always written to the current directory. If there are any errors +reading or writing the files, FLUID will print the error and +exit with a non-zero code. You can use the following lines in a +makefile to automate the creation of the source and header +files: + +

    +my_panels.h my_panels.cxx: my_panels.fl
    +	fluid -c my_panels.fl
    +
+ +

Most versions of make support rules that cause .fl +files to be compiled: + +

    +.SUFFIXES: .fl .cxx .h
    +.fl.h .fl.cxx:
    +	fluid -c $<
    +
+ +

A Short Tutorial

+ +

FLUID is an amazingly powerful little program. However, this +power comes at a price as it is not always obvious how to +accomplish seemingly simple tasks with it. This tutorial will +show you how to generate a complete user interface class with +FLUID that is used for the CubeView program provided with FLTK. + +

CubeView demo.
+Figure 9-2: CubeView demo.

+ +

The window is of class CubeViewUI, and is completely generated by FLUID, including +class member functions. The central display of the cube is a separate +subclass of Fl_Gl_Window called CubeView. CubeViewUI manages CubeView +using callbacks from the various sliders and rollers to manipulate the +viewing angle and zoom of CubeView. +

At the completion of this tutorial you will (hopefully) understand +how to: +

    +
  1. Use FLUID to create a complete user interface class, including +constructor and any member functions necessary. +
  2. Use FLUID to set callbacks member functions of a custom widget +classes. +
  3. Subclass an Fl_Gl_Window to suit +your purposes. +
+ +

The CubeView Class

+The CubeView class is a subclass of Fl_Gl_Window. It has methods for +setting the zoom, the x and y pan, and the rotation angle +about the x and yaxes. +

You can safely skip this section as long as you realize the CubeView +is a sublass of Fl_Gl_Window and will respond to calls from +CubeViewUI, generated by FLUID. +

The CubeView Class Definition

+Here is the CubeView class definition, as given by its header file +"test/CubeView.h": +
    +class CubeView : public Fl_Gl_Window {
    +  public:
    +    CubeView(int x,int y,int w,int h,const char *l=0);
    +    // this value determines the scaling factor used to draw the cube.
    +    double size;
    +    /* Set the rotation about the vertical (y ) axis.
    +     *
    +     * This function is called by the horizontal roller in CubeViewUI
    +     * and the initialize button in CubeViewUI.
    +     */
    +    void v_angle(float angle){vAng=angle;};
    +    // Return the rotation about the vertical (y ) axis.
    +    float v_angle(){return vAng;};
    +    /* Set the rotation about the horizontal (x ) axis.
    +     *
    +     * This function is called by the vertical roller in CubeViewUI
    +       and the
    +     * initialize button in CubeViewUI.
    +     */
    +    void h_angle(float angle){hAng=angle;};
    +    // the rotation about the horizontal (x ) axis.
    +    float h_angle(){return hAng;};
    +    /* Sets the x shift of the cube view camera.
    +     *
    +     * This function is called by the slider in CubeViewUI and the
    +     * initialize button in CubeViewUI.
    +     */
    +    void panx(float x){xshift=x;};
    +    /* Sets the y shift of the cube view camera.
    +     *
    +     * This function is called by the slider in CubeViewUI and the
    +     * initialize button in CubeViewUI.
    +     */
    +    void pany(float y){yshift=y;};
    +    /* The widget class draw() override.
    +     * The draw() function initialize Gl for another round of
    +     * drawing then calls specialized functions for drawing each
    +     * of the entities displayed in the cube view.
    +     */
    +    void draw();
    +
    +  private:
    +    /* Draw the cube boundaries
    +     * Draw the faces of the cube using the boxv[] vertices, using
    +     * GL_LINE_LOOP for the faces. The color is #defined by
    +     * CUBECOLOR.
    +     */
    +    void drawCube();
    +   
    +    float vAng,hAng; float xshift,yshift;
    +
    +    float boxv0[3];float boxv1[3]; float boxv2[3];float boxv3[3];
    +    float boxv4[3];float boxv5[3]; float boxv6[3];float boxv7[3];
    +};
    +
+ +

The CubeView Class Implementation

+ +

Here is the CubeView implementation. It is very similar to the +"cube" demo included with FLTK. + +

    +#include "CubeView.h"
    +#include <math.h>
    +
    +CubeView::CubeView(int x,int y,int w,int h,const char *l)
    +            : Fl_Gl_Window(x,y,w,h,l)
    +{
    +    vAng = 0.0; hAng=0.0; size=10.0;
    +    /* The cube definition. These are the vertices of a unit cube
    +     * centered on the origin.*/
    +    boxv0[0] = -0.5; boxv0[1] = -0.5; boxv0[2] = -0.5; boxv1[0] = 0.5;
    +    boxv1[1] = -0.5; boxv1[2] = -0.5; boxv2[0] = 0.5; boxv2[1] = 0.5;
    +    boxv2[2] = -0.5; boxv3[0] = -0.5; boxv3[1] = 0.5; boxv3[2] = -0.5;
    +    boxv4[0] = -0.5; boxv4[1] = -0.5; boxv4[2] = 0.5; boxv5[0] = 0.5;
    +    boxv5[1] = -0.5; boxv5[2] = 0.5; boxv6[0] = 0.5; boxv6[1] = 0.5;
    +    boxv6[2] = 0.5; boxv7[0] = -0.5; boxv7[1] = 0.5; boxv7[2] = 0.5;
    +};
    +
    +// The color used for the edges of the bounding cube.
    +#define CUBECOLOR 255,255,255,255
    +
    +void CubeView::drawCube() {
    +/* Draw a colored cube */
    +#define ALPHA 0.5
    +    glShadeModel(GL_FLAT);
    +
    +    glBegin(GL_QUADS);
    +      glColor4f(0.0, 0.0, 1.0, ALPHA);
    +      glVertex3fv(boxv0);
    +      glVertex3fv(boxv1);
    +      glVertex3fv(boxv2);
    +      glVertex3fv(boxv3);
    +
    +      glColor4f(1.0, 1.0, 0.0, ALPHA);
    +      glVertex3fv(boxv0);
    +      glVertex3fv(boxv4);
    +      glVertex3fv(boxv5);
    +      glVertex3fv(boxv1);
    +
    +      glColor4f(0.0, 1.0, 1.0, ALPHA);
    +      glVertex3fv(boxv2);
    +      glVertex3fv(boxv6);
    +      glVertex3fv(boxv7);
    +      glVertex3fv(boxv3);
    +
    +      glColor4f(1.0, 0.0, 0.0, ALPHA);
    +      glVertex3fv(boxv4);
    +      glVertex3fv(boxv5);
    +      glVertex3fv(boxv6);
    +      glVertex3fv(boxv7);
    +
    +      glColor4f(1.0, 0.0, 1.0, ALPHA);
    +      glVertex3fv(boxv0);
    +      glVertex3fv(boxv3);
    +      glVertex3fv(boxv7);
    +      glVertex3fv(boxv4);
    +
    +      glColor4f(0.0, 1.0, 0.0, ALPHA);
    +      glVertex3fv(boxv1);
    +      glVertex3fv(boxv5);
    +      glVertex3fv(boxv6);
    +      glVertex3fv(boxv2);
    +    glEnd();
    +
    +    glColor3f(1.0, 1.0, 1.0);
    +    glBegin(GL_LINES);
    +      glVertex3fv(boxv0);
    +      glVertex3fv(boxv1);
    +
    +      glVertex3fv(boxv1);
    +      glVertex3fv(boxv2);
    +
    +      glVertex3fv(boxv2);
    +      glVertex3fv(boxv3);
    +
    +      glVertex3fv(boxv3);
    +      glVertex3fv(boxv0);
    +
    +      glVertex3fv(boxv4);
    +      glVertex3fv(boxv5);
    +
    +      glVertex3fv(boxv5);
    +      glVertex3fv(boxv6);
    +
    +      glVertex3fv(boxv6);
    +      glVertex3fv(boxv7);
    +
    +      glVertex3fv(boxv7);
    +      glVertex3fv(boxv4);
    +
    +      glVertex3fv(boxv0);
    +      glVertex3fv(boxv4);
    +
    +      glVertex3fv(boxv1);
    +      glVertex3fv(boxv5);
    +
    +      glVertex3fv(boxv2);
    +      glVertex3fv(boxv6);
    +
    +      glVertex3fv(boxv3);
    +      glVertex3fv(boxv7);
    +    glEnd();
    +};//drawCube
    +
    +void CubeView::draw() {
    +    if (!valid()) {
    +        glLoadIdentity(); glViewport(0,0,w(),h());
    +        glOrtho(-10,10,-10,10,-20000,10000); glEnable(GL_BLEND);
    +        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    +    }
    +
    +    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    +    glPushMatrix(); glTranslatef(xshift, yshift, 0);
    +    glRotatef(hAng,0,1,0); glRotatef(vAng,1,0,0);
    +    glScalef(float(size),float(size),float(size)); drawCube();
    +    glPopMatrix();
    +};
    +
+ +

The CubeViewUI Class

+ +

We will completely construct a window to display and control the +CubeView defined in the previous section using FLUID. + +

Defining the CubeViewUI Class

+ +

Once you have started FLUID, the first step in defining a class is to +create a new class within FLUID using the New->Code->Class +menu item. Name the class "CubeViewUI" and leave the +subclass blank. We do not need any inheritance for this +window. You should see the new class declaration in the FLUID +browser window. + +

FLUID file for CubeView.
+Figure 9-3: FLUID file for CubeView.

+ +

Adding the Class Constructor

+ +

Click on the CubeViewUI class in the FLUID window and add a new method +by selecting New->Code->Function/Method. The name of the +function will also be CubeViewUI. FLUID will understands that this will +be the constructor for the class and will generate the appropriate +code. Make sure you declare the constructor public. + +

Then add a window to the CubeViewUI class. Highlight the name of +the constructor in the FLUID browser window and click on +New->Group->Window. In a similar manner add the +following to the CubeViewUI constructor: + +

    +
  • A horizontal roller named hrot +
  • A vertical roller named vrot +
  • A horizontal slider named xpan +
  • A vertical slider named ypan +
  • A horizontal value slider named zoom +
+ +

None of these additions need be public. And they shouldn't be +unless you plan to expose them as part of the interface for +CubeViewUI. + +

When you are finished you should have something like this: + +

FLUID window containing CubeView demo.
+Figure 9-4: FLUID window containing CubeView demo.

+ +

We will talk about the show() method that is highlighted +shortly. + +

Adding the CubeView Widget

+ +

What we have is nice, but does little to show our cube. We have already +defined the CubeView class and we would like to show it within the +CubeViewUI. + +

The CubeView class inherits the Fl_Gl_Window class, which +is created in the same way as a Fl_Box widget. Use +New->Other->Box to add a square box to the main window. +This will be no ordinary box, however. + +

The Box properties window will appear. The key to letting CubeViewUI +display CubeView is to enter CubeView in the "Class:" text +entry box. This tells FLUID that it is not an Fl_Box, but a +similar widget with the same constructor. In the "Extra +Code:" field enter #include "CubeView.h" + +

This #include is important, as we have just included +CubeView as a member of CubeViewUI, so any public CubeView methods are +now available to CubeViewUI. + +

CubeView methods.
+Figure 9-5: CubeView methods.

+ +

Defining the Callbacks

+ +

Each of the widgets we defined before adding CubeView can have +callbacks that call CubeView methods. You can call an external +function or put in a short amount of code in the "Callback" +field of the widget panel. For example, the callback for the +ypan slider is: + +

    +cube->pany(((Fl_Slider *)o)->value());
    +cube->redraw();
    +
+ +

We call cube->redraw() after changing the value to update +the CubeView window. CubeView could easily be modified to do this, but +it is nice to keep this exposed in the case where you may want to do +more than one view change only redrawing once saves a lot of time. + +

There is no reason no wait until after you have added CubeView to +enter these callbacks. FLUID assumes you are smart enough not to refer +to members or functions that don't exist. + +

Adding a Class Method

+ +

You can add class methods within FLUID that have nothing to do with the +GUI. An an example add a show function so that CubeViewUI can actually +appear on the screen. + +

Make sure the top level CubeViewUI is selected and select +New->Code->Function/Method. Just use the name +show(). We don't need a return value here, and since we will +not be adding any widgets to this method FLUID will assign it a return +type of void. + +

CubeView constructor.
+Figure 9-6: CubeView constructor.

+ +

Once the new method has been added, highlight its name and select +New->Code->Code. Enter the method's code in the code window. + +

Adding Constructor Initialization Code

+ +

If you need to add code to initialize class, for example setting +initial values of the horizontal and vertical angles in the +CubeView, you can simply highlight the Constructor and select +New->Code->Code. Add any required code. + +

Generating the Code

+ +

Now that we have completely defined the CubeViewUI, we have to generate +the code. There is one last trick to ensure this all works. Open the +preferences dialog from Edit->Preferences. + +

At the bottom of the preferences dialog box is the key: "Include +Header from Code". Select that option and set your desired file +extensions and you are in business. You can include the CubeViewUI.h +(or whatever extension you prefer) as you would any other C++ class. + + + +

FLUID Reference

+ +

The following sections describe each of the windows in FLUID. + +

The Widget Browser

+ +

The main window shows a menu bar and a scrolling browser of +all the defined widgets. The name of the .fl file being +edited is shown in the window title. + +

The widgets are stored in a hierarchy. You can open and close a +level by clicking the "triangle" at the left of a widget. +The leftmost widgets are the parents, and all the widgets +listed below them are their children. Parents don't have to have +any children.

+ +

The top level of the hierarchy is composed of functions and +classes. Each of these will produce a single C++ public +function or class in the output .cxx file. Calling the function or +instantiating the class will create all of the child widgets.

+ +

The second level of the hierarchy contains the windows. Each of these +produces an instance of class Fl_Window.

+ +

Below that are either widgets (subclasses of Fl_Widget) or +groups of widgets (including other groups). Plain groups are for +layout, navigation, and resize purposes. Tab groups provide the +well-known file-card tab interface.

+ +

Widgets are shown in the browser by either their name (such +as "main_panel" in the example), or by their type +and label (such as "Button "the green"").

+ +

You select widgets by clicking on their names, which highlights +them (you can also select widgets from any displayed window). You can +select many widgets by dragging the mouse across them, or by using +Shift+Click to toggle them on and off. To select no widgets, click in +the blank area under the last widget. Note that hidden children may +be selected even when there is no visual indication of this. + +

You open widgets by double-clicking on them, or (to open several +widgets you have picked) by typing the F1 key. A control panel will appear +so you can change the widget(s).

+ +

Menu Items

+ +

The menu bar at the top is duplicated as a pop-up menu on any +displayed window. The shortcuts for all the menu items work in any +window. The menu items are:

+ +

File/Open... (Ctrl+o)

+ +

Discards the current editing session and reads in a different +.fl file. You are asked for confirmation if you have +changed the current file. + +

FLUID can also read .fd files produced by the Forms +and XForms "fdesign" programs. It is best to +File/Merge them instead of opening them. FLUID does not +understand everything in a .fd file, and will print a +warning message on the controlling terminal for all data it does +not understand. You will probably need to edit the resulting +setup to fix these errors. Be careful not to save the file +without changing the name, as FLUID will write over the +.fd file with its own format, which fdesign cannot +read!

+ +

File/Insert... (Ctrl+i)

+ +

Inserts the contents of another .fl file, without +changing the name of the current .fl file. All the +functions (even if they have the same names as the current ones) +are added, and you will have to use cut/paste to put the widgets +where you want. + +

File/Save (Ctrl+s)

+ +

Writes the current data to the .fl file. If the +file is unnamed then FLUID will ask for a filename. + +

File/Save As...(Ctrl+Shift+S)

+ +

Asks for a new filename and saves the file. + +

File/Write Code (Ctrl+Shift+C)

+ +

"Compiles" the data into a .cxx and .h +file. These are exactly the same as the files you get when you run +FLUID with the -c switch. + +

The output file names are the same as the .fl file, with +the leading directory and trailing ".fl" stripped, and +".h" or ".cxx" appended.

+ +

File/Write Strings (Ctrl+Shift+W)

+ +

Writes a message file for all of the text labels defined in +the current file. + +

The output file name is the same as the .fl file, +with the leading directory and trailing ".fl" +stripped, and ".txt", ".po", or +".msg" appended depending on the Internationalization Mode.

+ +

File/Quit (Ctrl+q)

+ +

Exits FLUID. You are asked for confirmation if you have +changed the current file. + +

Edit/Undo (Ctrl+z)

+ +

This isn't implemented yet. You should do save often so you can +recover from any mistakes you make. + +

Edit/Cut (Ctrl+x)

+ +

Deletes the selected widgets and all of their children. +These are saved to a "clipboard" file and can be +pasted back into any FLUID window. + +

Edit/Copy (Ctrl+c)

+ +

Copies the selected widgets and all of their children to the +"clipboard" file. + +

Edit/Paste (Ctrl+c)

+ +

Pastes the widgets from the clipboard file. + +

If the widget is a window, it is added to whatever function +is selected, or contained in the current selection.

+ +

If the widget is a normal widget, it is added to whatever +window or group is selected. If none is, it is added to the +window or group that is the parent of the current selection.

+ +

To avoid confusion, it is best to select exactly one widget +before doing a paste.

+ +

Cut/paste is the only way to change the parent of a +widget.

+ +

Edit/Select All (Ctrl+a)

+ +

Selects all widgets in the same group as the current +selection. + +

If they are all selected already then this selects all +widgets in that group's parent. Repeatedly typing Ctrl+a will +select larger and larger groups of widgets until everything is +selected.

+ +

Edit/Open... (F1 or double click)

+ +

Displays the current widget in the attributes panel. If the +widget is a window and it is not visible then the window is +shown instead. + +

Edit/Sort

+ +

Sorts the selected widgets into left to right, top to bottom +order. You need to do this to make navigation keys in FLTK work +correctly. You may then fine-tune the sorting with +"Earlier" and "Later". This does not affect +the positions of windows or functions. + +

Edit/Earlier (F2)

+ +

Moves all of the selected widgets one earlier in order among +the children of their parent (if possible). This will affect +navigation order, and if the widgets overlap it will affect how +they draw, as the later widget is drawn on top of the earlier +one. You can also use this to reorder functions, classes, and +windows within functions. + +

Edit/Later (F3)

+ +

Moves all of the selected widgets one later in order among +the children of their parent (if possible). + +

Edit/Group (F7)

+ +

Creates a new Fl_Group and make all the currently +selected widgets children of it. + +

Edit/Ungroup (F8)

+ +

Deletes the parent group if all the children of a group are +selected. + +

Edit/Overlays on/off (Ctrl+Shift+O)

+ +

Toggles the display of the red overlays off, without changing +the selection. This makes it easier to see box borders and how +the layout looks. The overlays will be forced back on if you +change the selection. + +

Edit/Project Settings... (Ctrl+p)

+ +

Displays the project settings panel. +The output filenames control the extensions or names of the +files the are generated by FLUID. If you check the "Include .h +from .cxx" button the code file will include the header file +automatically. + +

The internationalization options are described later in this chapter. + +

FLUID Preferences Window.
+Figure 9-7: FLUID Preferences Window.

+ +

Edit/GUI Settings... (Shift+Ctrl+p)

+ +

Displays the GUI settings panel. This panel is used +to control the user interface settings. + +

New/Code/Function

+ +

Creates a new C function. You will be asked for a name for +the function. This name should be a legal C++ function +template, without the return type. You can pass arguments which +can be referred to by code you type into the individual widgets. + +

If the function contains any unnamed windows, it will be +declared as returning a Fl_Window pointer. The unnamed window +will be returned from it (more than one unnamed window is +useless). If the function contains only named windows, it will +be declared as returning nothing (void).

+ +

It is possible to make the .cxx output be a +self-contained program that can be compiled and executed. This +is done by deleting the function name so +main(argc,argv) is used. The function will call +show() on all the windows it creates and then call +Fl::run(). This can also be used to test resize +behavior or other parts of the user interface.

+ +

You can change the function name by double-clicking on the +function.

+ +

New/Window

+ +

Creates a new Fl_Window widget. The window is added +to the currently selected function, or to the function +containing the currently selected item. The window will appear, +sized to 100x100. You can resize it to whatever size you +require. + +

The widget panel will also appear and is described later in +this chapter.

+ +

New/...

+ +

All other items on the New menu are subclasses of +Fl_Widget. Creating them will add them to the +currently selected group or window, or the group or window +containing the currently selected widget. The initial +dimensions and position are chosen by copying the current +widget, if possible. + +

When you create the widget you will get the widget's control +panel, which is described later in this chapter.

+ + +

Layout/Align/...

+ +

Align all selected widgets to the first widget in the selection. + +

Layout/Space Evenly/...

+ +

Space all selected widgets evenly inside the selected space. +Widgets will be sorted from first to last. + +

Layout/Make Same Size/...

+ +

Make all selected widgets the same size as the first selected widget. + +

Layout/Center in Group/...

+ +

Center all selected widgets relative to their parent widget + +

Layout/Grid... (Ctrl+g)

+ +

Displays the grid settings panel. +This panel +controls the grid that all widgets snap to when you move and +resize them, and for the "snap" which is how far a widget has to +be dragged from its original position to actually change. + + +

Shell/Execute Command... (Alt+x)

+ +

Displays the shell command panel. The shell command +is commonly used to run a 'make' script to compile the FLTK output. + +

Shell/Execute Again (Alt+g)

+ +

Run the shell command again. + +

Help/About FLUID

+ +

Pops up a panel showing the version of FLUID. + +

Help/On FLUID

+ +

Shows this chapter of the manual. + +

Help/Manual

+ +

Shows the contents page of the manual + +

The Widget Panel

+ +

When you double-click on a widget or a set of widgets you +will get the "widget attribute panel". + +

When you change attributes using this panel, the changes are +reflected immediately in the window. It is useful to hit the +"no overlay" button (or type Ctrl+Shift+O) to hide the +red overlay so you can see the widgets more accurately, +especially when setting the box type. + +

If you have several widgets selected, they may have different +values for the fields. In this case the value for one of +the widgets is shown. But if you change this value, all +of the selected widgets are changed to the new value. + +

Hitting "OK" makes the changes permanent. +Selecting a different widget also makes the changes permanent. +FLUID checks for simple syntax errors such as mismatched +parenthesis in any code before saving any text. + +

"Revert" or "Cancel" put everything back +to when you last brought up the panel or hit OK. However in the +current version of FLUID, changes to "visible" +attributes (such as the color, label, box) are not undone by +revert or cancel. Changes to code like the callbacks are +undone, however. + + +

The FLUID widget GUI attributes.
+Figure 9-8: The FLUID widget GUI attributes.

+ +

GUI Attributes

+ +

Label (text field)

+ +

String to print next to or inside the button. You can put +newlines into the string to make multiple lines. The easiest way +is by typing Ctrl+j.

+ +

Symbols can be added to the +label using the at sign ("@"). + +

Label (pull down menu)

+ +

How to draw the label. Normal, shadowed, engraved, and +embossed change the appearance of the text. + +

Image

+ +

The active image for the widget. Click on the +Browse... button to pick an image file using the file +chooser. + +

Inactive

+ +

The inactive image for the widget. Click on the +Browse... button to pick an image file using the file +chooser. + +

Alignment (buttons)

+ +

Where to draw the label. The arrows put it on that side of +the widget, you can combine the to put it in the corner. The +"box" button puts the label inside the widget, rather +than outside. + +

The clip button clips the label to the widget box, the +wrap button wraps any text in the label, and the text +image button puts the text over the image instead of under +the image. + +

Position (text fields)

+ +

The position fields show the current position and size of the +widget box. Enter new values to move and/or resize a widget. + +

Values (text fields)

+ +

The values and limits of the current widget. Depending on the +type of widget, some or all of these fields may be inactive. + +

Shortcut

+ +

The shortcut key to activate the widget. Click on the +shortcut button and press any key sequence to set the shortcut. + +

Attributes (buttons)

+ +

The Visible button controls whether the widget is +visible (on) or hidden (off) initially. Don't change this for +windows or for the immediate children of a Tabs group. + +

The Active button controls whether the widget is +activated (on) or deactivated (off) initially. Most widgets +appear greyed out when deactivated. + +

The Resizable button controls whether the window is +resizeable. In addition all the size changes of a window or +group will go "into" the resizable child. If you have +a large data display surrounded by buttons, you probably want +that data area to be resizable. You can get more complex +behavior by making invisible boxes the resizable widget, or by +using hierarchies of groups. Unfortunately the only way to test +it is to compile the program. Resizing the FLUID window is +not the same as what will happen in the user program.

+ +

The Hotspot button causes the parent window to be +positioned with that widget centered on the mouse. This +position is determined when the FLUID function is called, +so you should call it immediately before showing the window. If +you want the window to hide and then reappear at a new position, +you should have your program set the hotspot itself just before +show(). + +

The Border button turns the window manager border on +or off. On most window managers you will have to close the +window and reopen it to see the effect. + +

X Class (text field)

+ +

The string typed into here is passed to the X window manager +as the class. This can change the icon or window decorations. +On most (all?) window managers you will have to close the window +and reopen it to see the effect. + + +

The FLUID widget Style attributes.
+Figure 9-9: The FLUID widget Style attributes.

+ +

Style Attributes

+ +

Label Font (pulldown menu)

+ +

Font to draw the label in. Ignored by symbols, bitmaps, and +pixmaps. Your program can change the actual font used by these +"slots" in case you want some font other than the 16 +provided. + +

Label Size (pulldown menu)

+ +

Pixel size (height) for the font to draw the label in. +Ignored by symbols, bitmaps, and pixmaps. To see the result +without dismissing the panel, type the new number and then Tab. + +

Label Color (button)

+ +

Color to draw the label. Ignored by pixmaps (bitmaps, +however, do use this color as the foreground color). + +

Box (pulldown menu)

+ +

The boxtype to draw as a background for the widget. + +

Many widgets will work, and draw faster, with a +"frame" instead of a "box". A frame does +not draw the colored interior, leaving whatever was already +there visible. Be careful, as FLUID may draw this ok but the +real program may leave unwanted stuff inside the widget.

+ +

If a window is filled with child widgets, you can speed up +redrawing by changing the window's box type to +"NO_BOX". FLUID will display a checkerboard for any +areas that are not colored in by boxes. Note that this +checkerboard is not drawn by the resulting program. Instead +random garbage will be displayed.

+ +

Down Box (pulldown menu)

+ +

The boxtype to draw when a button is pressed or for some +parts of other widgets like scrollbars and valuators. + +

Color (button)

+ +

The color to draw the box with.

+ +

Select Color (button)

+ +

Some widgets will use this color for certain parts. FLUID +does not always show the result of this: this is the color +buttons draw in when pushed down, and the color of input fields +when they have the focus.

+ +

Text Font, Size, and Color

+ +

Some widgets display text, such as input fields, pull-down +menus, and browsers. + + +

The FLUID widget C++ attributes.
+Figure 9-10: The FLUID widget C++ attributes.

+ +

C++ Attributes

+ +

Class

+ +

This is how you use your own subclasses of +Fl_Widget. Whatever identifier you type in here will +be the class that is instantiated. + +

In addition, no #include header file is put in the +.h file. You must provide a #include line as +the first line of the "Extra Code" which declares your +subclass.

+ +

The class must be similar to the class you are spoofing. It +does not have to be a subclass. It is sometimes useful to +change this to another FLTK class. Currently the only way to get +a double-buffered window is to change this field for the window +to "Fl_Double_Window" and to add "#include +<FL/Fl_Double_Window.h>" to the extra code.

+ +

Type (upper-right pulldown menu)

+ +

Some classes have subtypes that modify their appearance or behavior. +You pick the subtype off of this menu. + +

Name (text field)

+ +

Name of a variable to declare, and to store a pointer to this +widget into. This variable will be of type "<class>*". If the name is +blank then no variable is created. + +

You can name several widgets with "name[0]", "name[1]", "name[2]", +etc. This will cause FLUID to declare an array of pointers. The array +is big enough that the highest number found can be stored. All widgets +that in the array must be the same type.

+ +

Public (button)

+ +

Controls whether the widget is publicly accessible. When +embedding widgets in a C++ class, this controls whether the +widget is public or private in the class. +Otherwise is controls whether the widget is declared +static or global (extern). + +

Extra Code (text fields)

+ +

These four fields let you type in literal lines of code to +dump into the .h or .cxx files. + +

If the text starts with a # or the word +extern then FLUID thinks this is an "include" +line, and it is written to the .h file. If the same +include line occurs several times then only one copy is +written.

+ +

All other lines are "code" lines. The current +widget is pointed to by the local variable o. The +window being constructed is pointed to by the local variable +w. You can also access any arguments passed to the +function here, and any named widgets that are before this +one.

+ +

FLUID will check for matching parenthesis, braces, and +quotes, but does not do much other error checking. Be careful +here, as it may be hard to figure out what widget is producing +an error in the compiler. If you need more than four lines you +probably should call a function in your own .cxx +code.

+ +

Callback (text field)

+ +

This can either be the name of a function, or a small snippet +of code. If you enter anything but letters, numbers, and the +underscore then FLUID treats it as code. + +

A name names a function in your own code. It must be +declared as void name(<class>*,void*).

+ +

A code snippet is inserted into a static function in the +.cxx output file. The function prototype is void +name(class *o, void *v) so that you can refer to the +widget as o and the user_data() as +v. FLUID will check for matching parenthesis, braces, +and quotes, but does not do much other error checking. Be +careful here, as it may be hard to figure out what widget is +producing an error in the compiler.

+ +

If the callback is blank then no callback is set.

+ +

User Data (text field)

+ +

This is a value for the user_data() of the widget. +If blank the default value of zero is used. This can be any +piece of C code that can be cast to a void pointer. + +

Type (text field)

+ +

The void * in the callback function prototypes is +replaced with this. You may want to use long for old +XForms code. Be warned that anything other than void * +is not guaranteed to work! However on most architectures other +pointer types are ok, and long is usually ok, too. + +

When (pulldown menu)

+ +

When to do the callback. This can be Never, +Changed, Release, or Enter Key. The value of +Enter Key is only useful for text input fields. + +

There are other rare but useful values for the +when() field that are not in the menu. You should use +the extra code fields to put these values in.

+ +

No Change (button)

+ +

The No Change button means the callback is done on the +matching event even if the data is not changed. + +

Selecting and Moving Widgets

+ +

Double-clicking a window name in the browser will display it, +if not displayed yet. From this display you can select widgets, +sets of widgets, and move or resize them. To close a window +either double-click it or type ESC. + +

To select a widget, click it. To select several widgets drag +a rectangle around them. Holding down shift will toggle the +selection of the widgets instead.

+ +

You cannot pick hidden widgets. You also cannot choose some +widgets if they are completely overlapped by later widgets. Use +the browser to select these widgets.

+ +

The selected widgets are shown with a red "overlay" +line around them. You can move the widgets by dragging this +box. Or you can resize them by dragging the outer edges and +corners. Hold down the Alt key while dragging the mouse to +defeat the snap-to-grid effect for fine positioning.

+ +

If there is a tab box displayed you can change which child is +visible by clicking on the file tabs. The child you pick is +selected.

+ +

The arrow, tab, and shift+tab keys "navigate" the +selection. Left, right, tab, or shift+tab move to the next or +previous widgets in the hierarchy. Hit the right arrow enough +and you will select every widget in the window. Up/down widgets +move to the previous/next widgets that overlap horizontally. If +the navigation does not seem to work you probably need to +"Sort" the widgets. This is important if you have +input fields, as FLTK uses the same rules when using arrow keys +to move between input fields.

+ +

To "open" a widget, double click it. To open +several widgets select them and then type F1 or pick +"Edit/Open" off the pop-up menu.

+ +

Type Ctrl+o to temporarily toggle the overlay off without +changing the selection, so you can see the widget borders.

+ +

You can resize the window by using the window manager border +controls. FLTK will attempt to round the window size to the +nearest multiple of the grid size and makes it big enough to +contain all the widgets (it does this using illegal X methods, +so it is possible it will barf with some window managers!). +Notice that the actual window in your program may not be +resizable, and if it is, the effect on child widgets may be +different.

+ +

The panel for the window (which you get by double-clicking +it) is almost identical to the panel for any other Fl_Widget. +There are three extra items:

+ +

Images

+ +

The contents of the image files in the Image +and Inactive text fields are written to the .cxx +file. If many widgets share the same image then only one copy is +written. Since the image data is embedded in the generated +source code, you need only distribute the C++ code and not the +image files themselves.

+ +

However, the filenames are stored in the .fl +file so you will need the image files as well to read the +.fl file. Filenames are relative to the location of the +.fl file and not necessarily the current directory. We +recommend you either put the images in the same directory as the +.fl file, or use absolute path names.

+ +

Notes for All Image Types

+ +

FLUID runs using the default visual of your X server. This +may be 8 bits, which will give you dithered images. You may get +better results in your actual program by adding the code +"Fl::visual(FL_RGB)" to your code right before the +first window is displayed. + +

All widgets with the same image on them share the same code +and source X pixmap. Thus once you have put an image on a +widget, it is nearly free to put the same image on many other +widgets.

+ +

If you edit an image at the same time you are using it in FLUID, +the only way to convince FLUID to read the image file again is to +remove the image from all widgets that are using it or re-load the +.fl file.

+ +

Don't rely on how FLTK crops images that are outside the +widget, as this may change in future versions! The cropping of +inside labels will probably be unchanged.

+ +

To more accurately place images, make a new "box" +widget and put the image in that as the label.

+ +

XBM (X Bitmap) Files

+ +

FLUID reads X bitmap files which use C source code to define +a bitmap. Sometimes they are stored with the ".h" or +".bm" extension rather than the standard +".xbm" extension. + +

FLUID writes code to construct an Fl_Bitmap image and use it +to label the widget. The '1' bits in the bitmap are drawn using +the label color of the widget. You can change this color in the +FLUID widget attributes panel. The '0' bits are transparent.

+ +

The program "bitmap" on the X distribution does an +adequate job of editing bitmaps.

+ +

XPM (X Pixmap) Files

+ +

FLUID reads X pixmap files as used by the libxpm +library. These files use C source code to define a pixmap. The +filenames usually have the ".xpm" extension. + +

FLUID writes code to construct an Fl_Pixmap image and use it +to label the widget. The label color of the widget is ignored, +even for 2-color images that could be a bitmap. XPM files can +mark a single color as being transparent, and FLTK uses this +information to generate a transparency mask for the image.

+ +

We have not found any good editors for small iconic pictures. +For pixmaps we have used XPaint +and the KDE icon editor.

+ +

BMP Files

+ +

FLUID reads Windows BMP image files which are often used in +WIN32 applications for icons. FLUID converts BMP files into +(modified) XPM format and uses a Fl_BMP_Image image to label the +widget. Transparency is handled the same as for XPM files. All +image data is uncompressed when written to the source file, so +the code may be much bigger than the .bmp file.

+ +

GIF Files

+ +

FLUID reads GIF image files which are often used in HTML +documents to make icons. FLUID converts GIF files into +(modified) XPM format and uses a Fl_GIF_Image image to label the +widget. Transparency is handled the same as for XPM files. All +image data is uncompressed when written to the source file, so +the code may be much bigger than the .gif file. Only +the first image of an animated GIF file is used.

+ +

JPEG Files

+ +

If FLTK is compiled with JPEG support, FLUID can read JPEG +image files which are often used for digital photos. FLUID uses +a Fl_JPEG_Image image to label the widget, and writes +uncompressed RGB or grayscale data to the source file. + +

PNG (Portable Network Graphics) Files

+ +

If FLTK is compiled with PNG support, FLUID can read PNG +image files which are often used in HTML documents. FLUID uses a +Fl_PNG_Image image to label the widget, and writes uncompressed +RGB or grayscale data to the source file. PNG images can provide +a full alpha channel for partial transparency, and FLTK supports +this as best as possible on each platform. + +

Internationalization with FLUID

+ +

FLUID supports internationalization (I18N for short) of label +strings used by widgets. The preferences window +(Ctrl+p) provides access to the I18N options. + +

I18N Methods

+ +

FLUID supports three methods of I18N: use none, use GNU +gettext, and use POSIX catgets. The "use none" method is the +default and just passes the label strings as-is to the widget +constructors. + +

The "GNU gettext" method uses GNU gettext (or a similar +text-based I18N library) to retrieve a localized string before +calling the widget constructor. + +

The "POSIX catgets" method uses the POSIX catgets function to +retrieve a numbered message from a message catalog before +calling the widget constructor. + +

Using GNU gettext for I18N

+ +

FLUID's code support for GNU gettext is limited to calling a +function or macro to retrieve the localized label; you still +need to call setlocale() and textdomain() or +bindtextdomain() to select the appropriate language and +message file. + +

To use GNU gettext for I18N, open the preferences window and +choose "GNU gettext" from the "Use" chooser. Two new input +fields will then appear to control the include file and +function/macro name to use when retrieving the localized label +strings. + +

I18N using GNU gettext.
+Figure 9-11: Internationalization using GNU gettext.

+ +

The "#include" field controls the header file to include for +I18N; by default this is <libintl.h>, the +standard I18N file for GNU gettext. + +

The "Function" field controls the function (or macro) that +will retrieve the localized message; by default the +gettext function will be called. + +

Using POSIX catgets for I18N

+ +

FLUID's code support for POSIX catgets allows you to use a +global message file for all interfaces or a file specific to +each .fl file; you still need to call +setlocale() to select the appropriate language. + +

To use POSIX catgets for I18N, open the preferences window +and choose "POSIX catgets" from the "Use" chooser. Three new +input fields will then appear to control the include file, +catalog file, and set number for retrieving the localized label +strings. + +

I18N using POSIX catgets.
+Figure 9-12: Internationalization using POSIX catgets.

+ +

The "#include" field controls the header file to include for +I18N; by default this is <nl_types.h>, the +standard I18N file for POSIX catgets. + +

The "File" field controls the name of the catalog file +variable to use when retrieving localized messages; by default +the file field is empty which forces a local (static) catalog +file to be used for all of the windows defined in your +.fl file. + +

The "Set" field controls the set number in the catalog file. +The default set is 1 and rarely needs to be changed. + +

Know limitations

+ +Declaration Blocks can be used to temporarily block out already +designed code using #if 0 and #endif +type construction. This will effectively avoid compilation of +blocks of code. However, static code and data generated by this +segment (menu items, images, include statements, etc.) will still +be generated and likely cause compile-time warnings. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid.man b/third_party/windows/fltk-1.1.10/documentation/fluid.man new file mode 100644 index 0000000..924f440 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/fluid.man @@ -0,0 +1,32 @@ +.TH fluid 1 "Fast Light Tool Kit" "6 January 2002" +.SH NAME +fluid \- the fast light user-interface designer +.sp +.SH SYNOPSIS +fluid [ \-c [ \-o +.I code-filename +\-h +.I header-filename +] ] [ +.I filename.fl +] +.fi +.SH DESCRIPTION +\fIfluid\fR is an interactive GUI designer for FLTK. When run +with no arguments or with a filename, \fIfluid\fR will display +the GUI hierarchy and any windows defined in the file. +Functions, classes, windows, and GUI components can be +manipulated as needed. +.LP +When used with the \fI\-c\fR option, \fIfluid\fR will create the +necessary C++ header and code files in the current directory. +You can override the default extensions, filenames, and +directories using the \fI\-o\fR and \fI\-h\fR options. +.SH SEE ALSO +fltk\-config(1), fltk(3) +.br +FLTK Programming Manual, Chapter 9 +.br +FLTK Web Site, http://www.fltk.org/ +.SH AUTHORS +Bill Spitzak and others. diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid1.gif b/third_party/windows/fltk-1.1.10/documentation/fluid1.gif new file mode 100644 index 0000000..cfdefd7 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fluid1.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid2.gif b/third_party/windows/fltk-1.1.10/documentation/fluid2.gif new file mode 100644 index 0000000..e551e84 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fluid2.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid3-cxx.gif b/third_party/windows/fltk-1.1.10/documentation/fluid3-cxx.gif new file mode 100644 index 0000000..420ccaf Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fluid3-cxx.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid3-gui.gif b/third_party/windows/fltk-1.1.10/documentation/fluid3-gui.gif new file mode 100644 index 0000000..5f75726 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fluid3-gui.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid3-style.gif b/third_party/windows/fltk-1.1.10/documentation/fluid3-style.gif new file mode 100644 index 0000000..ecb55b4 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fluid3-style.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid4.gif b/third_party/windows/fltk-1.1.10/documentation/fluid4.gif new file mode 100644 index 0000000..d9e0292 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fluid4.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid_prefs.gif b/third_party/windows/fltk-1.1.10/documentation/fluid_prefs.gif new file mode 100644 index 0000000..0bc7d8d Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fluid_prefs.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid_widget_cxx.gif b/third_party/windows/fltk-1.1.10/documentation/fluid_widget_cxx.gif new file mode 100644 index 0000000..cb12e76 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fluid_widget_cxx.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid_widget_gui.gif b/third_party/windows/fltk-1.1.10/documentation/fluid_widget_gui.gif new file mode 100644 index 0000000..d5ac3c6 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fluid_widget_gui.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/fluid_widget_style.gif b/third_party/windows/fltk-1.1.10/documentation/fluid_widget_style.gif new file mode 100644 index 0000000..f5bf9b1 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/fluid_widget_style.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/forms.html b/third_party/windows/fltk-1.1.10/documentation/forms.html new file mode 100644 index 0000000..1e3af43 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/forms.html @@ -0,0 +1,203 @@ + + + E - Forms Compatibility + + +

E - Forms Compatibility

+ This appendix describes the Forms compatibility included with FLTK. +

Importing Forms Layout Files

+FLUID can read the .fd files put out by +all versions of Forms and XForms fdesign. However, it will mangle them +a bit, but it prints a warning message about anything it does not +understand. FLUID cannot write fdesign files, so you should save to a +new name so you don't write over the old one. +

You will need to edit your main code considerably to get it to link +with the output from FLUID. If you are not interested in this you may +have more immediate luck with the forms compatibility header, +<FL/forms.H>.

+

Using the Compatibility Header File

+ You should be able to compile existing Forms or XForms source code by +changing the include directory switch to your compiler so that the +forms.h file supplied with FLTK is included. Take a look at +forms.h to see how it works, but the basic trick is lots of inline +functions. Most of the XForms demo programs work without changes. +

You will also have to compile your Forms or XForms program using a +C++ compiler. The FLTK library does not provide C bindings or header +files.

+

Although FLTK was designed to be compatible with the GL Forms +library (version 0.3 or so), XForms has bloated severely and it's +interface is X-specific. Therefore, XForms compatibility is no longer +a goal of FLTK. Compatibility was limited to things that were free, or +that would add code that would not be linked in if the feature is +unused, or that was not X-specific.

+

To use any new features of FLTK, you should rewrite your code to not +use the inline functions and instead use "pure" FLTK. This will make +it a lot cleaner and make it easier to figure out how to call the FLTK +functions. Unfortunately this conversion is harder than expected and +even Digital Domain's inhouse code still uses forms.H a lot.

+

Problems You Will Encounter

+

Many parts of XForms use X-specific structures like XEvent + in their interface. I did not emulate these! Unfortunately these +features (such as the "canvas" widget) are needed by most large +programs. You will need to rewrite these to use FLTK subclasses.

+

Fl_Free widgets emulate +the old Forms "free" widget. It may be useful for porting +programs that change the handle() function on widgets, but you +will still need to rewrite things.

+

Fl_Timer widgets are +provided to emulate the XForms timer. These work, but are quite +inefficient and inaccurate compared to using +Fl::add_timeout().

+

All instance variables are hidden. If you directly refer to +the x, y, w, h, label, or other fields of your Forms widgets you will +have to add empty parenthesis after each reference. The easiest way to +do this is to globally replace "->x" with "->x()", etc. Replace +"boxtype" with "box()".

+

const char * arguments to most FLTK methods are simply +stored, while Forms would strdup() the passed string. This is +most noticable with the label of widgets. Your program must always +pass static data such as a string constant or malloc'd buffer to +label(). If you are using labels to display program output you +may want to try the Fl_Output + widget.

+

The default fonts and sizes are matched to the older GL version of +Forms, so all labels will draw somewhat larger than an XForms program +does.

+

fdesign outputs a setting of a "fdui" instance variable to the main +window. I did not emulate this because I wanted all instance variables +to be hidden. You can store the same information in the user_data() + field of a window. To do this, search through the fdesign output for +all occurances of "->fdui" and edit to use "->user_data()" instead. + This will require casts and is not trivial.

+

The prototype for the functions passed to fl_add_timeout() + and fl_set_idle_callback() callback are different.

+

All the following XForms calls are missing:

+
    +
  • FL_REVISION, fl_library_version()
  • +
  • FL_RETURN_DBLCLICK (use Fl::event_clicks())
  • +
  • fl_add_signal_callback()
  • +
  • fl_set_form_atactivate() fl_set_form_atdeactivate() +
  • +
  • fl_set_form_property()
  • +
  • fl_set_app_mainform(), fl_get_app_mainform()
  • +
  • fl_set_form_minsize(), fl_set_form_maxsize()
  • +
  • fl_set_form_event_cmask(), fl_get_form_event_cmask() +
  • +
  • fl_set_form_dblbuffer(), fl_set_object_dblbuffer() + (use an Fl_Double_Window instead)
  • +
  • fl_adjust_form_size()
  • +
  • fl_register_raw_callback()
  • +
  • fl_set_object_bw(), fl_set_border_width()
  • +
  • fl_set_object_resize(), fl_set_object_gravity()
  • +
  • fl_set_object_shortcutkey()
  • +
  • fl_set_object_automatic()
  • +
  • fl_get_object_bbox() (maybe FLTK should do this)
  • +
  • fl_set_object_prehandler(), fl_set_object_posthandler() +
  • +
  • fl_enumerate_fonts()
  • +
  • Most drawing functions
  • +
  • fl_set_coordunit() (FLTK uses pixels all the time)
  • +
  • fl_ringbell()
  • +
  • fl_gettime()
  • +
  • fl_win*() (all these functions)
  • +
  • fl_initialize(argc,argv,x,y,z) ignores last 3 arguments
  • +
  • fl_read_bitmapfile(), fl_read_pixmapfile()
  • +
  • fl_addto_browser_chars()
  • +
  • FL_MENU_BUTTON just draws normally
  • +
  • fl_set_bitmapbutton_file(), fl_set_pixmapbutton_file() +
  • +
  • FL_CANVAS objects
  • +
  • FL_DIGITAL_CLOCK (comes out analog)
  • +
  • fl_create_bitmap_cursor(), fl_set_cursor_color()
  • +
  • fl_set_dial_angles()
  • +
  • fl_show_oneliner()
  • +
  • fl_set_choice_shortcut(a,b,c)
  • +
  • command log
  • +
  • Only some of file selector is emulated
  • +
  • FL_DATE_INPUT
  • +
  • fl_pup*() (all these functions)
  • +
  • textbox object (should be easy but I had no sample programs)
  • +
  • xyplot object
  • +
+

Additional Notes

+ These notes were written for porting programs written with the older +IRISGL version of Forms. Most of these problems are the same ones +encountered when going from old Forms to XForms: +

Does Not Run In Background

+ The IRISGL library always forked when you created the first window, +unless "foreground()" was called. FLTK acts like "foreground()" is +called all the time. If you really want the fork behavior do "if +(fork()) exit(0)" right at the start of your program. +

You Cannot Use IRISGL Windows or fl_queue

+ If a Forms (not XForms) program if you wanted your own window for +displaying things you would create a IRISGL window and draw in it, +periodically calling Forms to check if the user hit buttons on the +panels. If the user did things to the IRISGL window, you would find +this out by having the value FL_EVENT returned from the call to Forms. +

None of this works with FLTK. Nor will it compile, the necessary +calls are not in the interface.

+

You have to make a subclass of +Fl_Gl_Window and write a draw() method and +handle() method. This may require anywhere from a trivial to a +major rewrite.

+

If you draw into the overlay planes you will have to also write a +draw_overlay() method and call redraw_overlay() on the +OpenGL window.

+

One easy way to hack your program so it works is to make the +draw() and handle() methods on your window set some +static variables, storing what event happened. Then in the main loop +of your program, call Fl::wait() and then check these +variables, acting on them as though they are events read from +fl_queue.

+

You Must Use OpenGL to Draw Everything

+

The file <FL/gl.h> defines replacements for a lot of IRISGL +calls, translating them to OpenGL. There are much better translators +available that you might want to investigate.

+

You Cannot Make Forms Subclasses

+ Programs that call fl_make_object or directly setting the +handle routine will not compile. You have to rewrite them to use a +subclass of Fl_Widget. It is important to note that the +handle() method is not exactly the same as the handle() + function of Forms. Where a Forms handle() returned non-zero, +your handle() must call do_callback(). And your +handle() must return non-zero if it "understood" the event. +

An attempt has been made to emulate the "free" widget. This appears +to work quite well. It may be quicker to modify your subclass into a +"free" widget, since the "handle" functions match.

+

If your subclass draws into the overlay you are in trouble and will +have to rewrite things a lot.

+

You Cannot Use <device.h>

+ If you have written your own "free" widgets you will probably get a +lot of errors about "getvaluator". You should substitute: +
+ + + + + + + + + + +
FormsFLTK
MOUSE_XFl::event_x_root()
MOUSE_YFl::event_y_root()
LEFTSHIFTKEY,RIGHTSHIFTKEYFl::event_shift()
CAPSLOCKKEYFl::event_capslock()
LEFTCTRLKEY,RIGHTCTRLKEYFl::event_ctrl()
LEFTALTKEY,RIGHTALTKEYFl::event_alt()
MOUSE1,RIGHTMOUSEFl::event_state()
MOUSE2,MIDDLEMOUSEFl::event_state()
MOUSE3,LEFTMOUSEFl::event_state()
+ Anything else in getvaluator and you are on your own... +

Font Numbers Are Different

+ The "style" numbers have been changed because I wanted to insert +bold-italic versions of the normal fonts. If you use Times, Courier, +or Bookman to display any text you will get a different font out of +FLTK. If you are really desperate to fix this use the following code: +
    +
    +fl_font_name(3,"*courier-medium-r-no*");
    +fl_font_name(4,"*courier-bold-r-no*");
    +fl_font_name(5,"*courier-medium-o-no*");
    +fl_font_name(6,"*times-medium-r-no*");
    +fl_font_name(7,"*times-bold-r-no*");
    +fl_font_name(8,"*times-medium-i-no*");
    +fl_font_name(9,"*bookman-light-r-no*");
    +fl_font_name(10,"*bookman-demi-r-no*");
    +fl_font_name(11,"*bookman-light-i-no*");
    +
    +
+ diff --git a/third_party/windows/fltk-1.1.10/documentation/functions.html b/third_party/windows/fltk-1.1.10/documentation/functions.html new file mode 100644 index 0000000..2e9d2b5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/functions.html @@ -0,0 +1,1483 @@ + + + B - Function Reference + + + +

B - Function Reference

+ +

This appendix describes all of the fl_ functions. For a +description of the FLTK classes, see Appendix +A. + +

Function List by Name

+ + + + + + + +
+ + + + + +
+ +

Function List by Category

+ + + + + +
+ + + +
+ + +

fl_alert

+ +
+ +

Include Files

+ +
    +#include <FL/fl_ask.H>
    +
+ +

Prototype

+ +
    +void fl_alert(const char *, ...);
    +
+ +

Description

+ +

Same as fl_message() except for the "!" symbol. + +

Note: Common dialog boxes are application modal. +No more than one common dialog box can be open at any time. +Requests for additional dialog boxes are ignored.

+ +

The fl_alert window + + + +

fl_ask

+ +
+ +

Include Files

+ +
    +#include <FL/fl_ask.H>
    +
+ +

Prototype

+ +
    +int fl_ask(const char *, ...);
    +
+ +

Description

+ +

Displays a printf-style message in a pop-up box with an +"Yes" and "No" button and waits for the user +to hit a button. The return value is 1 if the user hits Yes, +0 if they pick No or another dialog box is still open. + +The enter key is a shortcut for Yes and ESC is a shortcut for No. + +

Note: Common dialog boxes are application modal. +No more than one common dialog box can be open at any time. +Requests for additional dialog boxes are ignored.

+ + +

The fl_ask window. + +

Note: Use of this function is strongly +discouraged, and it will be removed in a later FLTK release. +Instead, use fl_choice() and +provide unambiguous verbs in place of "Yes" and "No".

+ + +

fl_beep

+ +
+ +

Include Files

+ +
    +#include <FL/fl_ask.H>
    +
+ +

Prototype

+ +
    +void fl_beep(int type = FL_BEEP_DEFAULT)
    +
+ +

Description

+ +

Sounds an audible notification; the default type argument +sounds a simple "beep" sound. Other values for type may use +a system or user-defined sound file: + +

    + +
  • FL_BEEP_DEFAULT - Make a generic "beep" sound. + +
  • FL_BEEP_MESSAGE - Make a sound appropriate for an + informational message. + +
  • FL_BEEP_ERROR - Make a sound appropriate for an + error message. + +
  • FL_BEEP_QUESTION - Make a sound appropriate for + a question. + +
  • FL_BEEP_PASSWORD - Make a sound appropriate for + a password prompt. + +
  • FL_BEEP_NOTIFICATION - Make a sound appropriate for + an event notification ("you have mail", etc.) + +
+ + + +

fl_choice

+ +
+ +

Include Files

+ +
    +#include <FL/fl_ask.H>
    +
+ +

Prototype

+ +
    +int fl_choice(const char *q, const char *b0, const char *b1, const char *b2, ...);
    +
+ +

Description

+ +

Shows the message with three buttons below it marked with the +strings b0, b1, and b2. Returns 0, +if button 0 is hit or another dialog box is still open. Returns +1 or 2 for buttons 1 or 2, respectively. ESC is a shortcut for +button 0 and the enter key is a shortcut for button 1. Notice +the buttons are positioned "backwards". You can hide +buttons by passing NULL as their labels. + +

Note: Common dialog boxes are application modal. +No more than one common dialog box can be open at any time. +Requests for additional dialog boxes are ignored.

+ +

The fl_choice window. + + + +

fl_color_average

+ +
+ +

Include Files

+ +
    +#include <FL/Enumerations.H>
    +
+ +

Prototype

+ +
    +Fl_Color fl_color_average(Fl_Color c1, Fl_Color c2, float weight);
    +
+ +

Description

+ +

Returns the weighted average color between the two colors. +The red, green, and blue values are averaged using the following +formula: + +

    +color = c1 * weight + c2 * (1 - weight)
    +
+ +

Thus, a weight value of 1.0 will return the +first color, while a value of 0.0 will return the second color. + + + +

fl_color_chooser

+ +
+ +

Include Files

+ +
    +#include <FL/Fl_Color_Chooser.H>
    +
+ +

Prototype

+ +
    +int fl_color_chooser(const char *title, double &r, double &g, double &b);
    +int fl_color_chooser(const char *title, uchar &r, uchar &g, uchar &b);
    +
+ +

Description

+ +

The double version takes RGB values in the range +0.0 to 1.0. The uchar version takes RGB values in +the range 0 to 255. The title argument specifies the +label (title) for the window. + +

The fl_color_chooser dialog.

+ +

fl_color_chooser() pops up a window to let the user +pick an arbitrary RGB color. They can pick the hue and +saturation in the "hue box" on the left (hold down +CTRL to just change the saturation), and the brighness using the +vertical slider. Or they can type the 8-bit numbers into the +RGB +Fl_Value_Input fields, or drag the mouse across them to +adjust them. The pull-down menu lets the user set the input +fields to show RGB, HSV, or 8-bit RGB (0 to 255). + +

This returns non-zero if the user picks ok, and updates the +RGB values. If the user picks cancel or closes the window this +returns zero and leaves RGB unchanged. + +

If you use the color chooser on an 8-bit screen, it will +allocate all the available colors, leaving you no space to +exactly represent the color the user picks! You can however use + fl_rectf() to fill a +region with a simulated color using dithering. + + + +

fl_color_cube

+ +
+ +

Include File

+ +
    +#include <FL/fl_draw.H>
    +
+ +

Prototype

+ +
    +Fl_Color fl_color_cube(int r, int g, int b);
    +
+ +

Description

+ +

Returns a color out of the color cube. r must be in +the range 0 to FL_NUM_RED (5) minus 1. g must be in the +range 0 to FL_NUM_GREEN (8) minus 1. b must be in the +range 0 to FL_NUM_BLUE (5) minus 1. + +

To get the closest color to a 8-bit set of R,G,B values use: + +

    +fl_color_cube(R * (FL_NUM_RED - 1) / 255,
    +              G * (FL_NUM_GREEN - 1) / 255,
    +              B * (FL_NUM_BLUE - 1) / 255);
    +
+ + + +

fl_contrast

+ +
+ +

Include Files

+ +
    +#include <FL/Enumerations.H>
    +
+ +

Prototype

+ +
    +Fl_Color fl_contrast(Fl_Color fg, Fl_Color bg);
    +
+ +

Description

+ +

Returns the foreground color if it contrasts sufficiently +with the background color. Otherwise, returns +FL_WHITE or FL_BLACK depending on +which color provides the best contrast. + + + +

fl_cursor

+ +
+ +

Include Files

+ +
    +#include <FL/fl_draw.H>
    +
+ +

Prototype

+ +
    +void fl_cursor(Fl_Cursor cursor, Fl_Color fg, Fl_Color bg);
    +
+ +

Description

+ +

Sets the cursor for the current window to the specified shape +and colors. The cursors are defined in the <FL/Enumerations.H> +header file. + + + +

fl_darker

+ +
+ +

Include Files

+ +
    +#include <FL/Enumerations.H>
    +
+ +

Prototype

+ +
    +Fl_Color fl_darker(Fl_Color c);
    +
+ +

Description

+ +

Returns a darker version of the specified color. + + + +

fl_dir_chooser

+ +
+ +

Include Files

+ +
    +#include <FL/Fl_File_Chooser.H>
    +
+ +

Prototype

+ +
    +char *fl_dir_chooser(const char * message, const char *fname, int relative = 0);
    +
+ +

Description

+ +

The fl_dir_chooser() function displays a Fl_File_Chooser dialog +so that the user can choose a directory. + +

message is a string used to title the window. + +

fname is a default filename to fill in the chooser +with. If this is NULL then the last filename that was +choosen is used. The first time the file chooser is called this +defaults to a blank string. + +

relative specifies whether the returned filename +should be relative (any non-zero value) or absolute (0). The +default is to return absolute paths. + +

The returned value points at a static buffer that is only +good until the next time fl_dir_chooser() is called. + + + +

fl_file_chooser

+ +
+ +

Include Files

+ +
    +#include <FL/Fl_File_Chooser.H>
    +
+ +

Prototype

+ +
    +char *fl_file_chooser(const char * message, const char *pattern, const char *fname, int relative = 0);
    +
+ +

Description

+ +

FLTK provides a "tab completion" file chooser that +makes it easy to choose files from large directories. This file +chooser has several unique features, the major one being that +the Tab key completes filenames like it does in Emacs or tcsh, +and the list always shows all possible completions. + +

The fl_file_chooser window. + +

fl_file_chooser() pops up the file chooser, waits +for the user to pick a file or Cancel, and then returns a +pointer to that filename or NULL if Cancel is chosen. + +

message is a string used to title the window. + +

pattern is used to limit the files listed in a +directory to those matching the pattern. This matching is done by +fl_filename_match(). +Multiple patterns can be used by separating them with tabs, like +"*.jpg\t*.png\t*.gif\t*". In addition, you can provide +human-readable labels with the patterns inside parenthesis, like +"JPEG Files (*.jpg)\tPNG Files (*.png)\tGIF Files (*.gif)\tAll Files (*)". +Pass NULL to show all files.

+ +

fname is a default filename to fill in the chooser +with. If this is NULL then the last filename that was +choosen is used (unless that had a different pattern, in which +case just the last directory with no name is used). The first +time the file chooser is called this defaults to a blank string. + +

relative specifies whether the returned filename +should be relative (any non-zero value) or absolute (0). The +default is to return absolute paths. + +

The returned value points at a static buffer that is only +good until the next time fl_file_chooser() is called. + + + +

fl_file_chooser_callback

+ +
+ +

Include Files

+ +
    +#include <FL/Fl_File_Chooser.H>
    +
+ +

Prototype

+ +
    +void fl_file_chooser_callback(void (*cb)(const char *));
    +
+ +

Description

+ +

Sets a function that is called every time the user clicks a +file in the currently popped-up file chooser. This could be used +to preview the contents of the file. It has to be reasonably +fast, and cannot create FLTK windows. + + + +

fl_file_chooser_ok_label

+ +
+ +

Include Files

+ +
    +#include <FL/Fl_File_Chooser.H>
    +
+ +

Prototype

+ +
    +void fl_file_chooser_ok_label(const char *l);
    +
+ +

Description

+ +

Sets the label that is shown on the "OK" button in the file +chooser. The default label (fl_ok) can be restored by +passing a NULL pointer for the label string.

+ + + +

fl_filename_absolute

+ +
+ +

Include Files

+ +
    +#include <FL/filename.H>
    +
+ +

Prototype

+ +
    +int fl_filename_absolute(char *to, int tolen, const char *from);
    +int fl_filename_absolute(char *to, const char *from);
    +
+ +

Description

+ +

Converts a relative pathname to an absolute pathname. If +from does not start with a slash, the current working +directory is prepended to from with any occurances of +. and x/.. deleted from the result. The +absolute pathname is copied to to; from and +to may point to the same buffer. +fl_filename_absolute returns non-zero if any changes +were made. + +

The first form accepts a maximum length (tolen) for +the destination buffer, while the second form assumes that the +destination buffer is at least FL_PATH_MAX characters +in length. + + + +

fl_filename_expand

+ +
+ +

Include Files

+ +
    +#include <FL/filename.H>
    +
+ +

Prototype

+ +
    +int fl_filename_expand(char *to, int tolen, const char *from);
    +int fl_filename_expand(char *to, const char *from);
    +
+ +

Description

+ +

This function replaces environment variables and home +directories with the corresponding strings. Any occurrence of +$X is replaced by getenv("X"); if +$X is not defined in the environment, the occurrence is +not replaced. Any occurence of ~X is replaced by user +X's home directory; if user X does not exist, +the occurrence is not replaced. Any resulting double slashes +cause everything before the second slash to be deleted. + +

The result is copied to to, and from and +to may point to the same buffer. +fl_filename_expand() returns non-zero if any changes +were made. + +

The first form accepts a maximum length (tolen) for +the destination buffer, while the second form assumes that the +destination buffer is at least FL_PATH_MAX characters +in length. + + + +

fl_filename_ext

+ +
+ +

Include Files

+ +
    +#include <FL/filename.H>
    +
+ +

Prototype

+ +
    +const char *fl_filename_ext(const char *f);
    +
+ +

Description

+ +

Returns a pointer to the last period in +fl_filename_name(f), or a pointer to the trailing +nul if none is found. + + + +

fl_filename_isdir

+ +
+ +

Include Files

+ +
    +#include <FL/filename.H>
    +
+ +

Prototype

+ +
    +int fl_filename_isdir(const char *f);
    +
+ +

Description

+ +

Returns non-zero if the file exists and is a directory. + + + +

fl_filename_list

+ +
+ +

Include Files

+ +
    +#include <FL/filename.H>
    +
+ +

Prototype

+ +
    +int fl_filename_list(const char *d, dirent ***list, Fl_File_Sort_F *sort = fl_numericsort);
    +
+ +

Description

+ +

This is a portable and const-correct wrapper for the +scandir() function. d is the name of a +directory; it does not matter if it has a trailing slash or not. +For each file in that directory a "dirent" structure +is created. The only portable thing about a dirent is that +dirent.d_name is the nul-terminated file name. +An array of pointers to these dirent's is created and a +pointer to the array is returned in *list. The number +of entries is given as a return value. If there is an error +reading the directory a number less than zero is returned, and +errno has the reason; errno does not work +under WIN32. + +

The name of directory always ends in a forward slash '/'. + +

The sort argument specifies a sort function to be used +when on the array of filenames. The following standard sort functions +are provided with FLTK: + +

    + +
  • fl_alphasort - The files are sorted in + ascending alphabetical order; upper- and lowercase + letters are compared according to their ASCII ordering - + uppercase before lowercase. + +
  • fl_casealphasort - The files are sorted in + ascending alphabetical order; upper- and lowercase + letters are compared equally - case is not significant. + +
  • fl_casenumericsort - The files are sorted + in ascending "alphanumeric" order, where an + attempt is made to put unpadded numbers in consecutive + order; upper- and lowercase letters are compared equally + - case is not significant. + +
  • fl_numericsort - The files are sorted in + ascending "alphanumeric" order, where an + attempt is made to put unpadded numbers in consecutive + order; upper- and lowercase letters are compared + according to their ASCII ordering - uppercase before + lowercase. + +
+ +

You can free the returned list of files with the following +code: + +

    +for (int i = return_value; i > 0;) {
    +  free((void*)(list[--i]));
    +}
    +
    +free((void*)list);
    +
+ + + +

fl_filename_match

+ +
+ +

Include Files

+ +
    +#include <FL/filename.H>
    +
+ +

Prototype

+ +
    +int fl_filename_match(const char *f, const char *pattern);
    +
+ +

Description

+ +

Returns non-zero if f matches pattern. The +following syntax is used by pattern: + +

    + +
  • * matches any sequence of 0 or more + characters.
  • + +
  • ? matches any single character.
  • + +
  • [set] matches any character in the set. Set + can contain any single characters, or a-z to represent a + range. To match ] or - they must be the first + characters. To match ^ or ! they must not be the first + characters.
  • + +
  • [^set] or [!set] matches any + character not in the set.
  • + +
  • {X|Y|Z} or {X,Y,Z} matches any one of the + subexpressions literally.
  • + +
  • \x quotes the character x so it has no + special meaning.
  • + +
  • x all other characters must be matched + exactly.
  • + +
+ + + +

fl_filename_name

+ +
+ +

Include Files

+ +
    +#include <FL/filename.H>
    +
+ +

Prototype

+ +
    +const char *fl_filename_name(const char *f);
    +
+ +

Description

+ +

Returns a pointer to the character after the last slash, or +to the start of the filename if there is none. + + + +

fl_filename_relative

+ +
+ +

Include Files

+ +
    +#include <FL/filename.H>
    +
+ +

Prototype

+ +
    +int fl_filename_relative(char *to, int tolen, const char *from);
    +int fl_filename_relative(char *to, const char *from);
    +
+ +

Description

+ +

Converts an absolute pathname to an relative pathname. The +relative pathname is copied to to; from and +to may point to the same buffer. +fl_filename_relative returns non-zero if any changes +were made. + +

The first form accepts a maximum length (tolen) for +the destination buffer, while the second form assumes that the +destination buffer is at least FL_PATH_MAX characters +in length. + + + +

fl_filename_setext

+ +
+ +

Include Files

+ +
    +#include <FL/filename.H>
    +
+ +

Prototype

+ +
    +char *fl_filename_setext(char *to, int tolen, const char *ext);
    +char *fl_filename_setext(char *to, const char *ext);
    +
+ +

Description

+ +

Replaces the extension in to with the extension in +ext. Returns a pointer to to. + +

The first form accepts a maximum length (tolen) for +the destination buffer, while the second form assumes that the +destination buffer is at least FL_PATH_MAX characters +in length. + + + +

fl_gray_ramp

+ +
+ +

Include File

+ +
    +#include <FL/fl_draw.H>
    +
+ +

Prototype

+ +
    +Fl_Color fl_gray_ramp(int i);
    +
+ +

Description

+ +

Returns a gray color value from black (i == 0) to +white (i == FL_NUM_GRAY - 1). FL_NUM_GRAY is +defined to be 24 in the current FLTK release. To get the closest +FLTK gray value to an 8-bit grayscale color 'I' use: + +

    +fl_gray_ramp(I * (FL_NUM_GRAY - 1) / 255)
    +
+ + + +

fl_inactive

+ +
+ +

Include File

+ +
    +#include <FL/Enumerations.H>
    +
+ +

Prototype

+ +
    +Fl_Color fl_inactive(Fl_Color c);
    +
+ +

Description

+ +

Returns the inactive, dimmed version of the give color + + + +

fl_input

+ +
+ +

Include Files

+ +
    +#include <FL/fl_ask.H>
    +
+ +

Prototype

+ +
    +const char *fl_input(const char *label, const char *deflt = 0, ...);
    +
+ +

Description

+ +

Pops up a window displaying a string, lets the user edit it, and +returns the new value. The function returns NULL if the +Cancel button is hit or another dialog box is still open. +The returned pointer is only valid until the +next time fl_input() is called. +Due to back-compatibility, the arguments to any printf commands +in the label are after the default value. + +

Note: Common dialog boxes are application modal. +No more than one common dialog box can be open at any time. +Requests for additional dialog boxes are ignored.

+ +

The fl_input window. + + + +

fl_lighter

+ +
+ +

Include Files

+ +
    +#include <FL/Enumerations.H>
    +
+ +

Prototype

+ +
    +Fl_Color fl_lighter(Fl_Color c);
    +
+ +

Description

+ +

Returns a lighter version of the specified color. + + + +

fl_message

+ +
+ +

Include Files

+ +
    +#include <FL/fl_ask.H>
    +
+ +

Prototype

+ +
    +void fl_message(const char *, ...);
    +
+ +

Description

+ +

Displays a printf-style message in a pop-up box with an +"OK" button, waits for the user to hit the button. +The message will wrap to fit the window, or may be many lines by +putting \n characters into it. The enter key is a +shortcut for the OK button. + +

The message text is limited to 1024 characters. + +

Note: Common dialog boxes are application modal. +No more than one common dialog box can be open at any time. +Requests for additional dialog boxes are ignored.

+ +

The fl_message window. + + + +

fl_message_font

+ +
+ +

Include Files

+ +
    +#include <FL/fl_ask.H>
    +
+ +

Prototype

+ +
    +void fl_message_font(Fl_Font fontid, uchar size);
    +
+ +

Description

+ +

Changes the font and font size used for the messages in all +the popups. + + + +

fl_message_icon

+ +
+ +

Include Files

+ +
    +#include <FL/fl_ask.H>
    +
+ +

Prototype

+ +
    +Fl_Widget *fl_message_icon();
    +
+ +

Description

+ +

Returns a pointer to the box at the left edge of all the +popups. You can alter the font, color, label, or image before +calling the functions. + + + +

fl_open_uri

+ +
+ +

Include Files

+ +
    +#include <FL/filename.H>
    +
+ +

Prototype

+ +
    +void fl_open_uri(const char *uri, char *msg = (char *)0, int msglen = 0);
    +
+ +

Description

+ +

fl_open_uri() opens the specified Uniform Resource Identifier (URI) using an operating-system dependent program or interface. For URIs using the "ftp", "http", or "https" schemes, the system default web browser is used to open the URI, while "mailto" and "news" URIs are typically opened using the system default mail reader and "file" URIs are opened using the file system navigator.

+ +

On success, the (optional) msg buffer is filled with the command that was run to open the URI; on Windows, this will always be "open uri".

+ +

On failure, the msg buffer is filled with an English error message.

+ + + +

fl_password

+ +
+ +

Include Files

+ +
    +#include <FL/fl_ask.H>
    +
+ +

Prototype

+ +
    +const char *fl_password(const char *label, const char *deflt = 0, ...);
    +
+ +

Description

+ +

Same as fl_input(), except an +Fl_Secret_Input +field is used. + +

Note: Common dialog boxes are application modal. +No more than one common dialog box can be open at any time. +Requests for additional dialog boxes are ignored.

+ + + +

fl_register_images

+ +
+ +

Include File

+ +
    +#include <FL/Fl_Shared_Image.H>
    +
+ +

Prototype

+ +
    +void fl_register_images();
    +
+ +

Description

+ +

Registers the extra image file formats that are not provided +as part of the core FLTK library for use with the Fl_Shared_Image +class. + +

This function is provided in the fltk_images +library. + + + +

fl_rgb_color

+ +
+ +

Include File

+ +
    +#include <FL/fl_draw.H>
    +
+ +

Prototype

+ +
    +Fl_Color fl_rgb_color(uchar r, uchar g, uchar b);
    +Fl_Color fl_rgb_color(uchar g);
    +
+ +

Description

+ +

Returns the 24-bit RGB color value for the specified 8-bit +RGB or grayscale values. + + + +

fl_show_colormap

+ +
+ +

Include Files

+ +
    +#include <FL/fl_show_colormap.H>
    +
+ +

Prototype

+ +
    +Fl_Color fl_show_colormap(Fl_Color oldcol)
    +
+ +

Description

+ +

fl_show_colormap() pops up a panel of the 256 colors +you can access with fl_color() and lets +the user pick one of them. It returns the new color index, or +the old one if the user types ESC or clicks outside the window. + +

The fl_show_colormap dialog + + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/glut.html b/third_party/windows/fltk-1.1.10/documentation/glut.html new file mode 100644 index 0000000..1669abb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/glut.html @@ -0,0 +1,196 @@ + + + D - GLUT Compatibility + + +

D - GLUT Compatibility

+

This appendix describes the GLUT compatibility header file supplied with FLTK. FLTK's GLUT compatibility is based on the original GLUT 3.7 and the follow-on FreeGLUT 2.4.0 libraries.

+

Using the GLUT Compatibility Header File

+

You should be able to compile existing GLUT source code by including <FL/glut.H> instead of <GL/glut.h>. This can be done by editing the source, by changing the -I switches to the compiler, or by providing a symbolic link from GL/glut.h to FL/glut.H.

+

All files calling GLUT procedures must be compiled with C++. You may have to alter them slightly to get them to compile without warnings, and you may have to rename them to get make to use the C++ compiler.

+

You must link with the FLTK library. Most of FL/glut.H is inline functions. You should take a look at it (and maybe at test/glpuzzle.cxx in the FLTK source) if you are having trouble porting your GLUT program.

+

This has been tested with most of the demo programs that come with the GLUT and FreeGLUT distributions.

+

Known Problems

+

The following functions and/or arguments to functions are missing, and +you will have to replace them or comment them out for your code to +compile: +

    +
  • glutGet(GLUT_ELAPSED_TIME)
  • +
  • glutGet(GLUT_SCREEN_HEIGHT_MM)
  • +
  • glutGet(GLUT_SCREEN_WIDTH_MM)
  • +
  • glutGet(GLUT_WINDOW_NUM_CHILDREN)
  • +
  • glutInitDisplayMode(GLUT_LUMINANCE)
  • +
  • glutLayerGet(GLUT_HAS_OVERLAY)
  • +
  • glutLayerGet(GLUT_LAYER_IN_USE)
  • +
  • glutPushWindow()
  • +
  • glutSetColor(), glutGetColor(), glutCopyColormap()
  • +
  • glutVideoResize() missing.
  • +
  • glutWarpPointer()
  • +
  • glutWindowStatusFunc()
  • +
  • Spaceball, buttonbox, dials, and tablet functions
  • +
+ Most of the symbols/enumerations have different values than GLUT uses. + This will break code that relies on the actual values. The only +symbols guaranteed to have the same values are true/false pairs like +GLUT_DOWN and GLUT_UP, mouse buttons +GLUT_LEFT_BUTTON, GLUT_MIDDLE_BUTTON, GLUT_RIGHT_BUTTON, and +GLUT_KEY_F1 thru F12. +

The strings passed as menu labels are not copied.

+

glutPostRedisplay() does not work if called from inside a +display function. You must use glutIdleFunc() if you want +your display to update continuously.

+

glutSwapBuffers() does not work from inside a display +function. This is on purpose, because FLTK swaps the buffers for you.

+

glutUseLayer() does not work well, and should only be used +to initialize transformations inside a resize callback. You should +redraw overlays by using glutOverlayDisplayFunc().

+

Overlays are cleared before the overlay display function is called. +glutLayerGet(GLUT_OVERLAY_DAMAGED) always returns true for +compatibility with some GLUT overlay programs. You must rewrite your +code so that gl_color() is used to choose colors in an +overlay, or you will get random overlay colors.

+

glutSetCursor(GLUT_CURSOR_FULL_CROSSHAIR) just results in a +small crosshair.

+

The fonts used by glutBitmapCharacter() and glutBitmapWidth() + may be different.

+

glutInit(argc,argv) will consume different switches than +GLUT does. It accepts the switches recognized by +Fl::args(), and will accept any abbreviation of these +switches (such as "-di" for "-display").

+

Mixing GLUT and FLTK Code

+ You can make your GLUT window a child of a Fl_Window with the +following scheme. The biggest trick is that GLUT insists on show() +'ing the window at the point it is created, which means the +Fl_Window parent window must already be shown. +
    +
  • Don't call glutInit().
  • +
  • Create your Fl_Window, and any FLTK widgets. Leave a +blank area in the window for your GLUT window.
  • +
  • show() the Fl_Window. Perhaps call +show(argc,argv).
  • +
  • Call window->begin() so that the GLUT window will be +automatically added to it.
  • +
  • Use glutInitWindowSize() and glutInitWindowPosition() + to set the location in the parent window to put the GLUT window.
  • +
  • Put your GLUT code next. It probably does not need many changes. + Call window->end() immediately after the +glutCreateWindow()!
  • +
  • You can call either glutMainLoop(), Fl::run(), or +loop calling Fl::wait() to run the program.
  • +
+
+

class Fl_Glut_Window

+
+

Class Hierarchy

+ +

Include Files

+
    +
    +#include <FL/glut.H>
    +
    +
+

Description

+ Each GLUT window is an instance of this class. You may find it useful +to manipulate instances directly rather than use GLUT window id's. + These may be created without opening the display, and thus can fit +better into FLTK's method of creating windows. +

The current GLUT window is available in the global variable +glut_window.

+

new Fl_Glut_Window(...) is the same as +glutCreateWindow() except it does not show() the window +or make the window current.

+

window->make_current() is the same as +glutSetWindow(number). If the window has not had show() + called on it yet, some functions that assumme an OpenGL context will +not work. If you do show() the window, call make_current() + again to set the context.

+

~Fl_Glut_Window() is the same as glutDestroyWindow() +.

+

Members

+The Fl_Glut_Window class contains several public members that can +be altered directly: +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
memberdescription
displayA pointer to the function to call to draw the normal planes.
entryA pointer to the function to call when the mouse moves into + or out of the window.
keyboardA pointer to the function to call when a regular key is pressed.
menu[3]The menu to post when one of the mouse buttons is pressed.
mouseA pointer to the function to call when a button is pressed or + released.
motionA pointer to the function to call when the mouse is moved with + a button down.
overlaydisplayA pointer to the function to call to draw the overlay planes.
passivemotionA pointer to the function to call when the mouse is moved with + no buttons down.
reshapeA pointer to the function to call when the window is resized.
specialA pointer to the function to call when a special key is pressed.
visibilityA pointer to the function to call when the window is iconified + or restored (made visible.)
+ +

Methods

+ +

+Fl_Glut_Window::Fl_Glut_Window(int x, int y, int w, int h, const char +*title = 0) +
Fl_Glut_Window::Fl_Glut_Window(int w, int h, const char *title = 0)
+

+ The first constructor takes 4 int arguments to create the window with +a preset position and size. The second constructor with 2 arguments +will create the window with a preset size, but the window manager will +choose the position according to it's own whims. +

virtual +Fl_Glut_Window::~Fl_Glut_Window()

+ Destroys the GLUT window. +

void Fl_Glut_Window::make_current()

+Switches all drawing functions to the GLUT window. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/hello.C.gif b/third_party/windows/fltk-1.1.10/documentation/hello.C.gif new file mode 100644 index 0000000..559b695 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/hello.C.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/index.html b/third_party/windows/fltk-1.1.10/documentation/index.html new file mode 100644 index 0000000..fb9f049 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/index.html @@ -0,0 +1,101 @@ + + + + FLTK 1.1.10 Programming Manual + + + + + + + + + + + +
+ FL +

FLTK 1.1.10 Programming Manual

+

Revision 10 by Michael Sweet, Craig P. Earls,
Matthias Melcher, and Bill Spitzak
+ Copyright 1998-2009 by Bill Spitzak and others.

+
This software and manual are provided under the terms of the GNU Library General Public License. Permission is granted to reproduce this manual or any portion for any purpose, provided this copyright and permission notice are preserved.
+ + + + + + +
Preface +
+
+ 1 - Introduction to FLTK +
+
+ 2 - FLTK Basics +
+
+ 3 - Common Widgets and Attributes + + 4 - Designing a Simple Text Editor +
+
+ 5 - Drawing Things in FLTK +
+
+ 6 - Handling Events + + 7 - Adding and Extending + Widgets +
+
+ 8 - Using OpenGL +
+ 9 - Programming with FLUID + + 10 - Advanced FLTK +
+
+ A - Class Reference +
+
+ B - Function Reference +
+
+ C - FLTK Enumerations.H + +
+
+ D - GLUT Compatibility + + E - Forms Compatibility +
+
+ F - Operating System Issues +
+
+ G - Migrating Code from FLTK 1.0.x +
+
+ H - Software License +
+
+ I - Example Source Code +
+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/input_choice.jpg b/third_party/windows/fltk-1.1.10/documentation/input_choice.jpg new file mode 100644 index 0000000..7f7b93f Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/input_choice.jpg differ diff --git a/third_party/windows/fltk-1.1.10/documentation/intro.html b/third_party/windows/fltk-1.1.10/documentation/intro.html new file mode 100644 index 0000000..02fd713 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/intro.html @@ -0,0 +1,373 @@ + + + 1 - Introduction to FLTK + + + +

1 - Introduction to FLTK

+ +

The Fast Light Tool Kit ("FLTK", pronounced +"fulltick") is a cross-platform C++ GUI toolkit for +UNIX®/Linux® (X11), Microsoft® Windows®, and +MacOS® X. FLTK provides modern GUI functionality without the +bloat and supports 3D graphics via OpenGL® and its built-in +GLUT emulation. It was originally developed by Mr. Bill Spitzak +and is currently maintained by a small group of developers +across the world with a central repository in the US.

+ +

History of FLTK

+ +

It has always been Bill's belief that the GUI API of all +modern systems is much too high level. Toolkits (even FLTK) are +not what should be provided and documented as part of an +operating system. The system only has to provide arbitrary +shaped but featureless windows, a powerful set of graphics +drawing calls, and a simple unalterable method of +delivering events to the owners of the windows. NeXT (if you +ignored NextStep) provided this, but they chose to hide it and +tried to push their own baroque toolkit instead.

+ +

Many of the ideas in FLTK were developed on a NeXT (but +not using NextStep) in 1987 in a C toolkit Bill called +"views". Here he came up with passing events downward +in the tree and having the handle routine return a value +indicating whether it used the event, and the table-driven menus. In +general he was trying to prove that complex UI ideas could be +entirely implemented in a user space toolkit, with no knowledge +or support by the system.

+ +

After going to film school for a few years, Bill worked at +Sun Microsystems on the (doomed) NeWS project. Here he found an +even better and cleaner windowing system, and he reimplemented +"views" atop that. NeWS did have an unnecessarily +complex method of delivering events which hurt it. But the +designers did admit that perhaps the user could write just as +good of a button as they could, and officially exposed the lower +level interface.

+ +

With the death of NeWS Bill realized that he would have to +live with X. The biggest problem with X is the "window +manager", which means that the toolkit can no longer +control the window borders or drag the window around.

+ +

At Digital Domain Bill discovered another toolkit, +"Forms". Forms was similar to his work, but provided +many more widgets, since it was used in many real applications, +rather then as theoretical work. He decided to use Forms, except +he integrated his table-driven menus into it. Several very large +programs were created using this version of Forms.

+ +

The need to switch to OpenGL and GLX, portability, and a +desire to use C++ subclassing required a rewrite of Forms. +This produced the first version of FLTK. The conversion to C++ +required so many changes it made it impossible to recompile any +Forms objects. Since it was incompatible anyway, Bill decided +to incorporate his older ideas as much as possible by +simplifying the lower level interface and the event passing +mechanism.

+ +

Bill received permission to release it for free on the +Internet, with the GNU general public license. Response from +Internet users indicated that the Linux market dwarfed the SGI +and high-speed GL market, so he rewrote it to use X for all +drawing, greatly speeding it up on these machines. That is the +version you have now.

+ +

Digital Domain has since withdrawn support for FLTK. While +Bill is no longer able to actively develop it, he still +contributes to FLTK in his free time and is a part of the FLTK +development team.

+ +

Features

+ +

FLTK was designed to be statically linked. This was done by +splitting it into many small objects and designing it so that +functions that are not used do not have pointers to them in the +parts that are used, and thus do not get linked in. This allows +you to make an easy-to-install program or to modify FLTK to +the exact requirements of your application without worrying +about bloat. FLTK works fine as a shared library, though, and +is now included with several Linux distributions.

+ +

Here are some of the core features unique to FLTK:

+ +
    + +
  • sizeof(Fl_Widget) == 64 to 92.
  • + +
  • The "core" (the "hello" program + compiled & linked with a static FLTK library using + gcc on a 486 and then stripped) is 114K.
  • + +
  • The FLUID program (which includes every widget) is + 538k.
  • + +
  • Written directly atop core libraries (Xlib, WIN32 or + Carbon) for maximum speed, and carefully optimized for + code size and performance.
  • + +
  • Precise low-level compatability between the X11, + WIN32 and MacOS versions - only about 10% of the code is + different.
  • + +
  • Interactive user interface builder program. Output is + human-readable and editable C++ source code.
  • + +
  • Support for overlay hardware, with emulation if none + is available.
  • + +
  • Very small & fast portable 2-D drawing library + to hide Xlib, WIN32, or QuickDraw.
  • + +
  • OpenGL/Mesa drawing area widget.
  • + +
  • Support for OpenGL overlay hardware on both X11 and + WIN32, with emulation if none is available.
  • + +
  • Text widgets with Emacs key bindings, X cut & + paste, and foreign letter compose!
  • + +
  • Compatibility header file for the GLUT library.
  • + +
  • Compatibility header file for the XForms library.
  • + +
+ +

Licensing

+ +

FLTK comes with complete free source code. FLTK is available +under the terms of the GNU Library +General Public License with exceptions that allow for static +linking. Contrary to popular belief, it can be used in +commercial software - even Bill Gates could use it!

+ +

What Does "FLTK" Mean?

+ +

FLTK was originally designed to be compatible with the Forms +Library written for SGI machines. In that library all the +functions and structures started with "fl_". This +naming was extended to all new methods and widgets in the C++ +library, and this prefix was taken as the name of the library. +It is almost impossible to search for "FL" on the +Internet, due to the fact that it is also the abbreviation for +Florida. After much debating and searching for a new name for +the toolkit, which was already in use by several people, Bill +came up with "FLTK", including a bogus excuse that it +stands for "The Fast Light Toolkit".

+ +

Building and Installing FLTK Under UNIX and MacOS X

+ +

In most cases you can just type "make". This will +run configure with the default of no options and then compile +everything.

+ +

FLTK uses GNU autoconf to configure itself for your UNIX +platform. The main things that the configure script will look +for are the X11 and OpenGL (or Mesa) header and library files. +If these cannot be found in the standard include/library +locations you'll need to define the CFLAGS, +CXXFLAGS, and LDFLAGS environment variables. +For the Bourne and Korn shells you'd use:

+ +
    +CFLAGS=-Iincludedir; export CFLAGS
    +CXXFLAGS=-Iincludedir; export CXXFLAGS
    +LDFLAGS=-Llibdir; export LDFLAGS
    +
+ +

For C shell and tcsh, use:

+ +
    +setenv CFLAGS "-Iincludedir"
    +setenv CXXFLAGS "-Iincludedir"
    +setenv LDFLAGS "-Llibdir"
    +
+ +

By default configure will look for a C++ compiler named +CC, c++, g++, or gcc in that +order. To use another compiler you need to set the CXX +environment variable:

+ +
    +CXX=xlC; export CXX
    +setenv CXX "xlC"
    +
+ +

The CC environment variable can also be used to +override the default C compiler (cc or gcc), +which is used for a few FLTK source files.

+ +

You can run configure yourself to get the exact setup you +need. Type "./configure <options>", where +options are:

+ +
+ +
--enable-cygwin
+
Enable the Cygwin libraries under WIN32
+ +
--enable-debug
+
Enable debugging code & symbols
+ +
--disable-gl
+
Disable OpenGL support
+ +
--enable-shared
+
Enable generation of shared libraries
+ +
--enable-threads
+
Enable multithreading support
+ +
--enable-xdbe
+
Enable the X double-buffer extension
+ +
--enable-xft
+
Enable the Xft library for anti-aliased fonts under X11
+ +
--bindir=/path
+
Set the location for executables [default = $prefix/bin]
+ +
--datadir=/path
+
Set the location for data files. [default = $prefix/share]
+ +
--libdir=/path
+
Set the location for libraries [default = $prefix/lib]
+ +
--includedir=/path
+
Set the location for include files. [default = $prefix/include]
+ +
--mandir=/path
+
Set the location for man pages. [default = $prefix/man]
+ +
--prefix=/dir
+
Set the directory prefix for files [default = /usr/local]
+ +
+ +

When the configure script is done you can just run the +"make" command. This will build the library, FLUID +tool, and all of the test programs.

+ +

To install the library, become root and type "make +install". This will copy the "fluid" executable +to "bindir", the header files to +"includedir", and the library files to +"libdir".

+ +

Building FLTK Under Microsoft Windows

+ +

There are three ways to build FLTK under Microsoft Windows. +The first is to use the Visual C++ 5.0 project files under the +"visualc" directory. Just open (or double-click on) +the "fltk.dsw" file to get the whole shebang.

+ +

The second method is to use the configure script +included with the FLTK software; this has only been tested with +the CygWin tools:

+ +
    +sh configure --prefix=C:/FLTK
    +make
    +
+ +

The final method is to use a GNU-based development tool with +the files in the "makefiles" directory. To build +using one of these tools simply copy the appropriate +makeinclude and config files to the main directory and do a +make:

+ +
    +copy makefiles\Makefile.<env> Makefile
    +make
    +
+ +

Using the Visual C++ DLL Library

+ +

The "fltkdll.dsp" project file builds a DLL-version +of the FLTK library. Because of name mangling differences +between PC compilers (even between different versions of Visual +C++!) you can only use the DLL that is generated with the same +version compiler that you built it with.

+ +

When compiling an application or DLL that uses the FLTK DLL, +you will need to define the FL_DLL preprocessor symbol +to get the correct linkage commands embedded within the FLTK +header files.

+ +

Building FLTK Under OS/2

+ +

The current OS/2 build requires XFree86 for OS/2 to work. A +native Presentation Manager version has not been implemented +yet (volunteers are welcome!).

+ +

The current set of Makefiles/configuration failes assumes that +EMX 0.9d and libExt +(from posix2.sourceforge.net) +is installed. + +

To build the XFree86 version of FLTK for OS/2, copy the appropriate +makeinclude and config files to the main directory and do a make:

+ +
    +copy makefiles\Makefile.os2x Makefile
    +make
    +
+ +

Internet Resources

+ +

FLTK is available on the 'net in a bunch of locations:

+ +
+ +
WWW +
http://www.fltk.org/ +
http://www.fltk.org/str.php + [for reporting bugs] +
http://www.fltk.org/software.php + [source code] + +
FTP +
California, USA, (http://ftp.easysw.com) +
California, USA (ftp://ftp.easysw.com) +
Maryland, USA (ftp2.easysw.com) +
Espoo, Finland (ftp.funet.fi) +
Germany (linux.mathematik.tu-darmstadt.de) +
Austria (gd.tuwien.ac.at) + +
EMail
+
fltk@fltk.org [see + instructions below] +
fltk-bugs@fltk.org [for + reporting bugs] + +
NNTP Newsgroups
+
news.easysw.com
+ +
+ +

To send a message to the FLTK mailing list +("fltk@fltk.org") you must first join the list. +Non-member submissions are blocked to avoid problems with +unsolicited email.

+ +

To join the FLTK mailing list, send a message to +"majordomo@fltk.org" with "subscribe fltk" +in the message body. A digest of this list is available by +subscribing to the "fltk-digest" mailing list.

+ +

Reporting Bugs

+ +

To report a bug in FLTK, send an email to +"fltk-bugs@fltk.org". Please include the FLTK version, +operating system & version, and compiler that you are using +when describing the bug or problem. We will be unable to provide +any kind of help without that basic information.

+ +

Bugs can also be reported to the "fltk.bugs" newsgroup or on the +SourceForge bug tracker pages.

+ +

For general support and questions, please use the FLTK mailing list +at "fltk@fltk.org" or one of the newsgroups.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/license.html b/third_party/windows/fltk-1.1.10/documentation/license.html new file mode 100644 index 0000000..558b9a0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/license.html @@ -0,0 +1,442 @@ + + + H - FLTK License + + + +

H - FLTK License

+ +

December 11, 2001

+ +

The FLTK library and included programs are provided under the terms +of the GNU Library General Public License (LGPL) with the following +exceptions:

+ +
    + +
  1. Modifications to the FLTK configure script, config + header file, and makefiles by themselves to support + a specific platform do not constitute a modified or + derivative work.
    +
    + The authors do request that such modifications be + contributed to the FLTK project - send all + contributions to "fltk-bugs@fltk.org".
    +
    +
  2. + +
  3. Widgets that are subclassed from FLTK widgets do not + constitute a derivative work.
    +
    +
  4. + +
  5. Static linking of applications and widgets to the + FLTK library does not constitute a derivative work + and does not require the author to provide source + code for the application or widget, use the shared + FLTK libraries, or link their applications or + widgets against a user-supplied version of FLTK.
    +
    + If you link the application or widget to a modified + version of FLTK, then the changes to FLTK must be + provided under the terms of the LGPL in sections + 1, 2, and 4.
    +
    +
  6. + +
  7. You do not have to provide a copy of the FLTK license + with programs that are linked to the FLTK library, nor + do you have to identify the FLTK license in your + program or documentation as required by section 6 + of the LGPL.
    +
    + However, programs must still identify their use of FLTK. + The following example statement can be included in user + documentation to satisfy this requirement:
    +
    + [program/widget] is based in part on the work of + the FLTK project (http://www.fltk.org).
  8. + +
+ +
+ +

GNU LIBRARY GENERAL PUBLIC LICENSE

+

Version 2, June 1991 +
Copyright (C) 1991 Free Software Foundation, Inc. +
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA +
Everyone is permitted to copy and distribute verbatim copies of +this license document, but changing it is not allowed. +
[This is the first released version of the library GPL. It is +numbered 2 because it goes with version 2 of the ordinary GPL.]

+

Preamble

+ The licenses for most software are designed to take away your freedom +to share and change it. By contrast, the GNU General Public Licenses +are intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. +

This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the library, or if you modify it.

+

For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights.

+

Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library.

+

Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations.

+

Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all.

+

Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License, which was designed for utility +programs. This license, the GNU Library General Public License, +applies to certain designated libraries. This license is quite +different from the ordinary one; be sure to read it in full, and don't +assume that anything in it is the same as in the ordinary license.

+

The reason we have a separate public license for some libraries is +that they blur the distinction we usually make between modifying or +adding to a program and simply using it. Linking a program with a +library, without changing the library, is in some sense simply using +the library, and is analogous to running a utility program or +application program. However, in a textual and legal sense, the linked +executable is a combined work, a derivative of the original library, +and the ordinary General Public License treats it as such.

+

Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better.

+

However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended +to permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to +achieve this as regards changes in header files, but we have achieved +it as regards changes in the actual functions of the Library.) The +hope is that this will lead to faster development of free libraries.

+

The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the libary" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library.

+

Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one.

+

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND +MODIFICATION

+0. This License Agreement applies to any software +library which contains a notice placed by the copyright holder or other +authorized party saying it may be distributed under the terms of this +Library General Public License (also called "this License"). Each +licensee is addressed as "you". +

A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables.

+

The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".)

+

"Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control +compilation and installation of the library.

+

Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does and +what the program that uses the Library does.

+

1. You may copy and distribute verbatim copies of +the Library's complete source code as you receive it, in any medium, +provided that you conspicuously and appropriately publish on each copy +an appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the Library.

+

You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee.

+

2. You may modify your copy or copies of the +Library or any portion of it, thus forming a work based on the Library, +and copy and distribute such modifications or work under the terms of +Section 1 above, provided that you also meet all of these conditions:

+a) The modified work must itself be a software +library. +

b) You must cause the files modified to carry +prominent notices stating that you changed the files and the date of +any change.

+

c) You must cause the whole of the work to be +licensed at no charge to all third parties under the terms of this +License.

+

d) If a facility in the modified Library refers to +a function or a table of data to be supplied by an application program +that uses the facility, other than as an argument passed when the +facility is invoked, then you must make a good faith effort to ensure +that, in the event an application does not supply such function or +table, the facility still operates, and performs whatever part of its +purpose remains meaningful.

+

(For example, a function in a library to compute square roots has a +purpose that is entirely well-defined independent of the application. + Therefore, Subsection 2d requires that any application-supplied +function or table used by this function must be optional: if the +application does not supply it, the square root function must still +compute square roots.)

+
+

These requirements apply to the modified work as a whole. +If identifiable sections of that work are not derived from the +Library, and can be reasonably considered independent and separate +works in themselves, then this License, and its terms, do not apply to +those sections when you distribute them as separate works. But when +you distribute the same sections as part of a whole which is a work +based on the Library, the distribution of the whole must be on the +terms of this License, whose permissions for other licensees extend to +the entire whole, and thus to each and every part regardless of who +wrote it.

+

Thus, it is not the intent of this section to claim rights or +contest your rights to work written entirely by you; rather, the intent +is to exercise the right to control the distribution of derivative or +collective works based on the Library.

+

In addition, mere aggregation of another work not based on the +Library with the Library (or with a work based on the Library) on a +volume of a storage or distribution medium does not bring the other +work under the scope of this License.

+

3. You may opt to apply the terms of the ordinary +GNU General Public License instead of this License to a given copy of +the Library. To do this, you must alter all the notices that refer to +this License, so that they refer to the ordinary GNU General Public +License, version 2, instead of to this License. (If a newer version +than version 2 of the ordinary GNU General Public License has appeared, +then you can specify that version instead if you wish.) Do not make +any other change in these notices.

+

Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy.

+

This option is useful when you wish to copy part of the code of the +Library into a program that is not a library.

+

4. You may copy and distribute the Library (or a +portion or derivative of it, under Section 2) in object code or +executable form under the terms of Sections 1 and 2 above provided that +you accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections 1 +and 2 above on a medium customarily used for software interchange.

+

If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to distribute +the source code, even though third parties are not compelled to copy +the source along with the object code.

+

5. A program that contains no derivative of any +portion of the Library, but is designed to work with the Library by +being compiled or linked with it, is called a "work that uses the +Library". Such a work, in isolation, is not a derivative work of the +Library, and therefore falls outside the scope of this License.

+

However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. Section +6 states terms for distribution of such executables.

+

When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law.

+

If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.)

+

Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, whether +or not they are linked directly with the Library itself.

+

6. As an exception to the Sections above, you may +also compile or link a "work that uses the Library" with the Library to +produce a work containing portions of the Library, and distribute that +work under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications.

+

You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things:

a) Accompany the work +with the complete corresponding machine-readable source code for the +Library including whatever changes were used in the work (which must +be distributed under Sections 1 and 2 above); and, if the work is an +executable linked with the Library, with the complete machine-readable +"work that uses the Library", as object code and/or source code, so +that the user can modify the Library and then relink to produce a +modified executable containing the modified Library. (It is +understood that the user who changes the contents of definitions files +in the Library will not necessarily be able to recompile the +application to use the modified definitions.) +

b) Accompany the work with a written offer, valid +for at least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more than the cost +of performing this distribution.

+

c) If distribution of the work is made by offering +access to copy from a designated place, offer equivalent access to +copy the above specified materials from the same place.

+

d) Verify that the user has already received a copy +of these materials or that you have already sent this user a copy.

+
+

For an executable, the required form of the "work that +uses the Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major components +(compiler, kernel, and so on) of the operating system on which the +executable runs, unless that component itself accompanies the +executable.

+

It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute.

+

7. You may place library facilities that are a work +based on the Library side-by-side in a single library together with +other library facilities not covered by this License, and distribute +such a combined library, provided that the separate distribution of the +work based on the Library and of the other library facilities is +otherwise permitted, and provided that you do these two things:

+a) Accompany the combined library with a copy of the +same work based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the Sections +above. +

b) Give prominent notice with the combined library +of the fact that part of it is a work based on the Library, and +explaining where to find the accompanying uncombined form of the same +work.

+
+

8. You may not copy, modify, sublicense, +link with, or distribute the Library except as expressly provided under +this License. Any attempt otherwise to copy, modify, sublicense, link +with, or distribute the Library is void, and will automatically +terminate your rights under this License. However, parties who have +received copies, or rights, from you under this License will not have +their licenses terminated so long as such parties remain in full +compliance.

+

9. You are not required to accept this License, +since you have not signed it. However, nothing else grants you +permission to modify or distribute the Library or its derivative works. + These actions are prohibited by law if you do not accept this License. + Therefore, by modifying or distributing the Library (or any work based +on the Library), you indicate your acceptance of this License to do so, +and all its terms and conditions for copying, distributing or modifying +the Library or works based on it.

+

10. Each time you redistribute the Library (or any +work based on the Library), the recipient automatically receives a +license from the original licensor to copy, distribute, link with or +modify the Library subject to these terms and conditions. You may not +impose any further restrictions on the recipients' exercise of the +rights granted herein. You are not responsible for enforcing compliance +by third parties to this License.

+

11. If, as a consequence of a court judgment or +allegation of patent infringement or for any other reason (not limited +to patent issues), 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 distribute so as to satisfy simultaneously your +obligations under this License and any other pertinent obligations, +then as a consequence you may not distribute the Library at all. For +example, if a patent license would not permit royalty-free +redistribution of the Library by all those who receive copies directly +or indirectly through you, then the only way you could satisfy both it +and this License would be to refrain entirely from distribution of the +Library.

+

If any portion of this section is held invalid or unenforceable +under any particular circumstance, the balance of the section is +intended to apply, and the section as a whole is intended to apply in +other circumstances.

+

It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is implemented +by public license practices. Many people have made generous +contributions to the wide range of software distributed through that +system in reliance on consistent application of that system; it is up +to the author/donor to decide if he or she is willing to distribute +software through any other system and a licensee cannot impose that +choice.

+

This section is intended to make thoroughly clear what is believed +to be a consequence of the rest of this License.

+

12. If the distribution and/or use of the Library +is restricted in certain countries either by patents or by copyrighted +interfaces, the original copyright holder who places the Library under +this License may add an explicit geographical distribution limitation +excluding those countries, so that distribution is permitted only in or +among countries not thus excluded. In such case, this License +incorporates the limitation as if written in the body of this License.

+

13. The Free Software Foundation may publish +revised and/or new versions of the Library 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 +Library specifies a version number of this License which applies to it +and "any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation.

+

14. If you wish to incorporate parts of the Library +into other free programs whose distribution conditions are incompatible +with these, write to the author to ask for permission. For software +which is copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally.

+

NO WARRANTY

+

15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, +THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU +ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

+

16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW +OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY +WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES.

+

END OF TERMS AND CONDITIONS

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/menu.gif b/third_party/windows/fltk-1.1.10/documentation/menu.gif new file mode 100644 index 0000000..6ed0f6d Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/menu.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/menu_button.gif b/third_party/windows/fltk-1.1.10/documentation/menu_button.gif new file mode 100644 index 0000000..9fc5df0 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/menu_button.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/menubar.gif b/third_party/windows/fltk-1.1.10/documentation/menubar.gif new file mode 100644 index 0000000..5c6c944 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/menubar.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/migration.html b/third_party/windows/fltk-1.1.10/documentation/migration.html new file mode 100644 index 0000000..df13fa2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/migration.html @@ -0,0 +1,163 @@ + + + G - Migrating Code from FLTK 1.0.x + + + +

G - Migrating Code from FLTK 1.0.x

+ +

This appendix describes the differences between the FLTK +1.0.x and FLTK 1.1.x functions and classes.

+ +

Color Values

+ +

Color values are now stored in a 32-bit unsigned integer +instead of the unsigned character in 1.0.x. This allows for the +specification of 24-bit RGB values or 8-bit FLTK color indices. + +

FL_BLACK and FL_WHITE now remain black and +white, even if the base color of the gray ramp is changed using +Fl::background(). +FL_DARK3 and FL_LIGHT3 can be used instead to +draw a very dark or a very bright background hue.

+ +

Widgets use the new color symbols FL_FORGROUND_COLOR, +FL_BACKGROUND_COLOR, FL_BACKGROUND2_COLOR, +FL_INACTIVE_COLOR, and FL_SELECTION_COLOR. +More details can be found in the chapter +Enumerations.

+ +

Cut and Paste Support

+ +

The FLTK clipboard is now broken into two parts - a local +selection value and a cut-and-paste value. This allows FLTK to +support things like highlighting and replacing text that was +previously cut or copied, which makes FLTK applications behave +like traditional GUI applications. + +

File Chooser

+ +

The file chooser in FLTK 1.1.x is significantly different +than the one supplied with FLTK 1.0.x. Any code that directly +references the old FCB class or members will need +to be ported to the new Fl_File_Chooser +class.

+ +

Function Names

+ +

Some function names have changed from FLTK 1.0.x to 1.1.x in +order to avoid name space collisions. You can still use the old +function names by defining the FLTK_1_0_COMPAT +symbol on the command-line when you compile +(-DFLTK_1_0_COMPAT) or in your source, e.g.: + +

    +#define FLTK_1_0_COMPAT
    +#include <FL/Fl.H>
    +#include <FL/Enumerations.H>
    +#include <FL/filename.H>
    +
+ +

The following table shows the old and new function names:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Old 1.0.x NameNew 1.1.x Name
contrast()fl_contrast()
down()fl_down()
filename_absolute()fl_filename_absolute()
filename_expand()fl_filename_expand()
filename_ext()fl_filename_ext()
filename_isdir()fl_filename_isdir()
filename_list()fl_filename_list()
filename_match()fl_filename_match()
filename_name()fl_filename_name()
filename_relative()fl_filename_relative()
filename_setext()fl_filename_setext()
frame()fl_frame()
inactive()fl_inactive()
numericsort()fl_numericsort()
+ +

Image Support

+ +

Image support in FLTK has been significantly revamped in +1.1.x. The Fl_Image class +is now a proper base class, with the core image drawing +functionality in the Fl_Bitmap, Fl_Pixmap, and Fl_RGB_Image classes. + +

BMP, GIF, JPEG, PNG, XBM, and XPM image files can now be +loaded using the appropriate image classes, and the Fl_Shared_Image class +can be used to cache images in memory. + +

Image labels are no longer provided as an add-on label type. +If you use the old label() methods on an image, the +widget's image() method is called to set the image +as the label. + +

Image labels in menu items must still use the old labeltype +mechanism to preserve source compatibility. + +

Keyboard Navigation

+ +

FLTK 1.1.x now supports keyboard navigation and control with +all widgets. To restore the old FLTK 1.0.x behavior so that only +text widgets get keyboard focus, call the Fl::visible_focus() +method to disable it: + +

    +Fl::visible_focus(0);
    +
+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/opengl.html b/third_party/windows/fltk-1.1.10/documentation/opengl.html new file mode 100644 index 0000000..fa5975c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/opengl.html @@ -0,0 +1,467 @@ + + + 8 - Using OpenGL + + +

8 - Using OpenGL

+ +

This chapter discusses using FLTK for your OpenGL applications. + +

Using OpenGL in FLTK

+ +

The easiest way to make an OpenGL display is to subclass Fl_Gl_Window. +Your subclass must implement a draw() method which uses +OpenGL calls to draw the display. Your main program should call +redraw() when the display needs to change, and +(somewhat later) FLTK will call draw(). + +

With a bit of care you can also use OpenGL to draw into +normal FLTK windows. This allows you to use Gouraud shading for +drawing your widgets. To do this you use the gl_start() and gl_finish() functions around your +OpenGL code.

+ +

You must include FLTK's <FL/gl.h> header +file. It will include the file <GL/gl.h>, define +some extra drawing functions provided by FLTK, and include the +<windows.h> header file needed by WIN32 +applications.

+ +

Making a Subclass of Fl_Gl_Window

+ +

To make a subclass of Fl_Gl_Window, you must provide: + +

    + +
  • A class definition.
  • + +
  • A draw() method.
  • + +
  • A handle() method if you need to receive + input from the user.
  • + +
+ +

If your subclass provides static controls in the window, they +must be redrawn whenever the FL_DAMAGE_ALL bit is set +in the value returned by damage(). For double-buffered +windows you will need to surround the drawing code with the +following code to make sure that both buffers are redrawn: + +

    +#ifndef MESA
    +glDrawBuffer(GL_FRONT_AND_BACK);
    +#endif // !MESA
    +... draw stuff here ...
    +#ifndef MESA
    +glDrawBuffer(GL_BACK);
    +#endif // !MESA
    +
+ +
+ + + + +
Note: + +

If you are using the Mesa graphics library, the call + to glDrawBuffer() is not required and will slow + down drawing considerably. The preprocessor instructions + shown above will optimize your code based upon the + graphics library used. + +

+ +

Defining the Subclass

+ +

To define the subclass you just subclass the +Fl_Gl_Window class: + +

    +class MyWindow : public Fl_Gl_Window {
    +  void draw();
    +  int handle(int);
    +
    +public:
    +  MyWindow(int X, int Y, int W, int H, const char *L)
    +    : Fl_Gl_Window(X, Y, W, H, L) {}
    +};
    +
+ +

The draw() and handle() methods are +described below. Like any widget, you can include additional +private and public data in your class (such as scene graph +information, etc.) + +

The draw() Method

+ +

The draw() method is where you actually do your +OpenGL drawing: + +

    +void MyWindow::draw() {
    +  if (!valid()) {
    +    ... set up projection, viewport, etc ...
    +    ... window size is in w() and h().
    +    ... valid() is turned on by FLTK after draw() returns
    +  }
    +  ... draw ...
    +}
    +
+ +

The handle() Method

+ +

The handle() method handles mouse and keyboard +events for the window: + +

    +int MyWindow::handle(int event) {
    +  switch(event) {
    +  case FL_PUSH:
    +    ... mouse down event ...
    +    ... position in Fl::event_x() and Fl::event_y()
    +    return 1;
    +  case FL_DRAG:
    +    ... mouse moved while down event ...
    +    return 1;
    +  case FL_RELEASE:   
    +    ... mouse up event ...
    +    return 1;
    +  case FL_FOCUS :
    +  case FL_UNFOCUS :
    +    ... Return 1 if you want keyboard events, 0 otherwise
    +    return 1;
    +  case FL_KEYBOARD:
    +    ... keypress, key is in Fl::event_key(), ascii in Fl::event_text()
    +    ... Return 1 if you understand/use the keyboard event, 0 otherwise...
    +    return 1;
    +  case FL_SHORTCUT:
    +    ... shortcut, key is in Fl::event_key(), ascii in Fl::event_text()
    +    ... Return 1 if you understand/use the shortcut event, 0 otherwise...
    +    return 1;
    +  default:
    +    // pass other events to the base class...
    +    return Fl_Gl_Window::handle(event);
    +  }
    +}
    +
+ +

When handle() is called, the OpenGL context is not +set up! If your display changes, you should call +redraw() and let draw() do the work. Don't +call any OpenGL drawing functions from inside handle()! + +

You can call some OpenGL stuff like hit detection and texture +loading functions by doing:

+ +
    +  case FL_PUSH:
    +    make_current(); // make OpenGL context current
    +    if (!valid()) {
    +      ... set up projection exactly the same as draw ...
    +      valid(1); // stop it from doing this next time
    +    }
    +    ... ok to call NON-DRAWING OpenGL code here, such as hit
    +    detection, loading textures, etc...
    +
+ +

Your main program can now create one of your windows by doing +new MyWindow(...). You can also use FLUID by: + +

    + +
  1. Putting your class definition in a + MyWindow.H file.
  2. + +
  3. Creating a Fl_Box widget in FLUID.
  4. + +
  5. In the widget panel fill in the "class" + field with MyWindow. This will make FLUID + produce constructors for your new class.
  6. + +
  7. In the "Extra Code" field put #include + "MyWindow.H", so that the FLUID output + file will compile.
  8. + +
+ +

You must put glwindow->show() in your main code +after calling show() on the window containing the +OpenGL window. + +

Using OpenGL in Normal FLTK Windows

+ +

You can put OpenGL code into an Fl_Widget::draw() +method or into the code for a boxtype or other places with some +care. + +

Most importantly, before you show any windows, +including those that don't have OpenGL drawing, you must +initialize FLTK so that it knows it is going to use OpenGL. You +may use any of the symbols described for Fl_Gl_Window::mode() +to describe how you intend to use OpenGL:

+ +
    +Fl::gl_visual(FL_RGB);
    +
+ +

You can then put OpenGL drawing code anywhere you can draw +normally by surrounding it with: + +

    +gl_start();
    +... put your OpenGL code here ...
    +gl_finish();
    +
+ +

gl_start() and gl_finish() set up an OpenGL +context with an orthographic projection so that 0,0 is the +lower-left corner of the window and each pixel is one unit. The +current clipping is reproduced with OpenGL glScissor() +commands. These functions also synchronize the OpenGL graphics stream +with the drawing done by other X, WIN32, or FLTK functions. + +

The same context is reused each time. If your code changes +the projection transformation or anything else you should use +glPushMatrix() and glPopMatrix() functions to +put the state back before calling gl_finish().

+ +

You may want to use Fl_Window::current()->h() to +get the drawable height so that you can flip the Y +coordinates.

+ +

Unfortunately, there are a bunch of limitations you must +adhere to for maximum portability:

+ +
    + +
  • You must choose a default visual with Fl::gl_visual().
  • + +
  • You cannot pass FL_DOUBLE to + Fl::gl_visual().
  • + +
  • You cannot use Fl_Double_Window or + Fl_Overlay_Window.
  • + +
+ +

Do not call gl_start() or +gl_finish() when drawing into an Fl_Gl_Window! + +

OpenGL Drawing Functions

+ +

FLTK provides some useful OpenGL drawing functions. They can +be freely mixed with any OpenGL calls, and are defined by +including <FL/gl.H> which you should include +instead of the OpenGL header <GL/gl.h>. + +

void gl_color(Fl_Color)

+ +

Sets the current OpenGL color to a FLTK color. For +color-index modes it will use fl_xpixel(c), which is +only right if this window uses the default colormap! + +

void gl_rect(int x, int y, int w, int h) +
void gl_rectf(int x, int y, int w, int h)

+ +

Outlines or fills a rectangle with the current color. If Fl_Gl_Window::ortho() +has been called, then the rectangle will exactly fill the pixel +rectangle passed. + +

void gl_font(Fl_Font fontid, int size)

+ +

Sets the current OpenGL font to the same font you get by +calling fl_font(). + +

int gl_height() +
int gl_descent() +
float gl_width(const char *) +
float gl_width(const char *, int n) +
float gl_width(uchar)

+ +

Returns information about the current OpenGL font. + +

void gl_draw(const char *) +
void gl_draw(const char *, int n)

+ +

Draws a nul-terminated string or an array of n +characters in the current OpenGL font at the current raster +position. + +

void gl_draw(const char *, int x, int y) +
void gl_draw(const char *, int n, int x, int y) +
void gl_draw(const char *, float x, float y) +
void gl_draw(const char *, int n, float x, float y)

+ +

Draws a nul-terminated string or an array of n +characters in the current OpenGL font at the given position. + +

void gl_draw(const char *, int x, int y, int w, int h, Fl_Align)

+ +

Draws a string formatted into a box, with newlines and tabs +expanded, other control characters changed to ^X, and aligned +with the edges or center. Exactly the same output as fl_draw(). + +

Speeding up OpenGL

+ +

Performance of Fl_Gl_Window may be improved on some types of +OpenGL implementations, in particular MESA and other software +emulators, by setting the GL_SWAP_TYPE environment +variable. This variable declares what is in the backbuffer after +you do a swapbuffers. + +

    + +
  • setenv GL_SWAP_TYPE COPY + +

    This indicates that the back buffer is copied to the + front buffer, and still contains it's old data. This is + true of many hardware implementations. Setting this + will speed up emulation of overlays, and widgets that + can do partial update can take advantage of this as + damage() will not be cleared to -1.

    + +

  • setenv GL_SWAP_TYPE NODAMAGE + +

    This indicates that nothing changes the back buffer + except drawing into it. This is true of MESA and Win32 + software emulation and perhaps some hardware emulation + on systems with lots of memory.

    + +

  • All other values for GL_SWAP_TYPE, and not + setting the variable, cause FLTK to assume that the + back buffer must be completely redrawn after a swap. + +
+ +

This is easily tested by running the gl_overlay demo +program and seeing if the display is correct when you drag +another window over it or if you drag the window off the screen +and back on. You have to exit and run the program again for it +to see any changes to the environment variable. + +

Using OpenGL Optimizer with FLTK

+ +

OpenGL +Optimizer is a scene graph toolkit for OpenGL available from +Silicon Graphics for IRIX and Microsoft Windows. It allows you +to view large scenes without writing a lot of OpenGL code. + +

OptimizerWindow Class Definition

+ +

To use OpenGL Optimizer with FLTK you'll need to create a +subclass of Fl_Gl_Widget that includes several state +variables: + +

    +class OptimizerWindow : public Fl_Gl_Window {
    +  csContext *context_; // Initialized to 0 and set by draw()...
    +  csDrawAction *draw_action_; // Draw action...
    +  csGroup *scene_; // Scene to draw...
    +  csCamara *camera_; // Viewport for scene...
    +
    +  void draw();
    +
    +public:
    +  OptimizerWindow(int X, int Y, int W, int H, const char *L)
    +    : Fl_Gl_Window(X, Y, W, H, L) {
    +      context_ = (csContext *)0;
    +      draw_action_ = (csDrawAction *)0;
    +      scene_ = (csGroup *)0;
    +      camera_ = (csCamera *)0;
    +    }
    +
    +  void scene(csGroup *g) { scene_ = g; redraw(); }
    +
    +  void camera(csCamera *c) {
    +    camera_ = c;
    +    if (context_) {
    +      draw_action_->setCamera(camera_);
    +      camera_->draw(draw_action_);
    +      redraw();
    +    }
    +  }
    +};
    +
+ +

The camera() Method

+ +

The camera() method sets the camera (projection and +viewpoint) to use when drawing the scene. The scene is redrawn after +this call. + +

The draw() Method

+ +

The draw() method performs the needed initialization and does +the actual drawing: + +

    +void OptimizerWindow::draw() {
    +  if (!context_) {
    +    // This is the first time we've been asked to draw; create the
    +    // Optimizer context for the scene...
    +
    +#ifdef WIN32
    +    context_ = new csContext((HDC)fl_getHDC());
    +    context_->ref();
    +    context_->makeCurrent((HDC)fl_getHDC());
    +#else
    +    context_ = new csContext(fl_display, fl_visual);
    +    context_->ref();
    +    context_->makeCurrent(fl_display, fl_window);
    +#endif // WIN32
    +
    +    ... perform other context setup as desired ...   
    +
    +    // Then create the draw action to handle drawing things...
    +
    +    draw_action_ = new csDrawAction;
    +    if (camera_) {
    +      draw_action_->setCamera(camera_);
    +      camera_->draw(draw_action_);
    +    }
    +  } else {
    +#ifdef WIN32
    +    context_->makeCurrent((HDC)fl_getHDC());
    +#else
    +    context_->makeCurrent(fl_display, fl_window);
    +#endif // WIN32
    +  }
    +
    +  if (!valid()) {
    +    // Update the viewport for this context...
    +    context_->setViewport(0, 0, w(), h());
    +  }
    +
    +  // Clear the window...
    +  context_->clear(csContext::COLOR_CLEAR | csContext::DEPTH_CLEAR,
    +                  0.0f,		// Red
    +		  0.0f,		// Green
    +		  0.0f,		// Blue
    +		  1.0f);	// Alpha
    +
    +  // Then draw the scene (if any)...
    +  if (scene_)
    +    draw_action_->apply(scene_);
    +}
    +
+ +

The scene() Method

+ +

The scene() method sets the scene to be drawn. The scene is +a collection of 3D objects in a csGroup. The scene is redrawn +after this call. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/osissues.html b/third_party/windows/fltk-1.1.10/documentation/osissues.html new file mode 100644 index 0000000..54e6884 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/osissues.html @@ -0,0 +1,745 @@ + + + F - Operating System Issues + + + +

F - Operating System Issues

+ +

This appendix describes the operating system specific interfaces in FLTK. + +

Accessing the OS Interfaces

+ +

All programs that need to access the operating system +specific interfaces must include the following header file: + +

    +#include <FL/x.H>
    +
+ +

Despite the name, this header file will define the +appropriate interface for your environment. The pages that +follow describe the functionality that is provided for each +operating system. + +

+ + + +
WARNING: + +

The interfaces provided by this header file may + change radically in new FLTK releases. Use them only + when an existing generic FLTK interface is not + sufficient.

+ +
+ +

The UNIX (X11) Interface

+ +

The UNIX interface provides access to the X Window System +state information and data structures. + +

Handling Other X Events

+ +

void Fl::add_handler(int (*f)(int))

+ +

Installs a function to parse unrecognized events. If FLTK +cannot figure out what to do with an event, it calls each of +these functions (most recent first) until one of them returns +non-zero. If none of them returns non-zero then the event is +ignored. + +

FLTK calls this for any X events it does not recognize, or X +events with a window ID that FLTK does not recognize. You can +look at the X event in the fl_xevent variable.

+ +

The argument is the FLTK event type that was not handled, or +zero for unrecognized X events. These handlers are also called +for global shortcuts and some other events that the widget they +were passed to did not handle, for example +FL_SHORTCUT.

+ +

extern XEvent *fl_xvent

+ +

This variable contains the most recent X event. + +

extern ulong fl_event_time

+ +

This variable contains the time stamp from the most recent X +event that reported it; not all events do. Many X calls like cut +and paste need this value. + +

Window fl_xid(const Fl_Window *)

+ +

Returns the XID for a window, or zero if not shown(). + +

Fl_Window *fl_find(ulong xid)

+ +

Returns the Fl_Window that corresponds to the given +XID, or NULL if not found. This function uses a cache +so it is slightly faster than iterating through the windows +yourself.

+ +

int fl_handle(const XEvent &)

+ +

This call allows you to supply the X events to FLTK, which +may allow FLTK to cooperate with another toolkit or library. The +return value is non-zero if FLTK understood the event. If the +window does not belong to FLTK and the add_handler() +functions all return 0, this function will return false. + +

Besides feeding events your code should call Fl::flush() +periodically so that FLTK redraws its windows.

+ +

This function will call the callback functions. It will not +return until they complete. In particular, if a callback pops up +a modal window by calling fl_ask(), for +instance, it will not return until the modal function +returns.

+ +

Drawing using Xlib

+ +

The following global variables are set before Fl_Widget::draw() is +called, or by Fl_Window::make_current(): + +

    +extern Display *fl_display;
    +extern Window fl_window;
    +extern GC fl_gc;
    +extern int fl_screen;
    +extern XVisualInfo *fl_visual;
    +extern Colormap fl_colormap;
    +
+ +

You must use them to produce Xlib calls. Don't attempt to change +them. A typical X drawing call is written like this: + +

    +XDrawSomething(fl_display, fl_window, fl_gc, ...);
    +
+ +

Other information such as the position or size of the X +window can be found by looking at Fl_Window::current(), +which returns a pointer to the Fl_Window being drawn. + +

unsigned long fl_xpixel(Fl_Color i)
+unsigned long fl_xpixel(uchar r, uchar g, uchar b)

+ +

Returns the X pixel number used to draw the given FLTK color +index or RGB color. This is the X pixel that fl_color() would use. + +

int fl_parse_color(const char* p, uchar& r, uchar& g, uchar& b)

+ +

Convert a name into the red, green, and blue values of a color +by parsing the X11 color names. On other systems, fl_parse_color +can only convert names in hexadecimal encoding, for example #ff8083. + +

extern XFontStruct *fl_xfont

+ +

Points to the font selected by the most recent fl_font(). This is not +necessarily the current font of fl_gc, which is not set +until fl_draw() is +called. If FLTK was compiled with Xft support, fl_xfont +will usually be 0 and fl_xftfont will contain a pointer +to the XftFont structure instead. + +

extern void *fl_xftfont

+ +

If FLTK was compiled with Xft support enabled, fl_xftfont +Points to the xft font selected by the most recent fl_font(). Otherwise +it will be 0. fl_xftfont should be cast to +XftFont*. + +

Changing the Display, Screen, or X Visual

+ +

FLTK uses only a single display, screen, X visual, and X +colormap. This greatly simplifies its internal structure and +makes it much smaller and faster. You can change which it uses +by setting global variables before the first +Fl_Window::show() is called. You may also want to +call Fl::visual(), which is +a portable interface to get a full color and/or double buffered +visual. + +

int Fl::display(const char *)

+ +

Set which X display to use. This actually does +putenv("DISPLAY=...") so that child programs +will display on the same screen if called with exec(). +This must be done before the display is opened. This call is +provided under MacOS and WIN32 but it has no effect. + +

extern Display *fl_display

+ +

The open X display. This is needed as an argument to most +Xlib calls. Don't attempt to change it! This is NULL +before the display is opened. + +

void fl_open_display()

+ +

Opens the display. Does nothing if it is already open. This +will make sure fl_display is non-zero. You should call +this if you wish to do X calls and there is a chance that your +code will be called before the first show() of a +window. + +

This may call Fl::abort() if there is an error +opening the display.

+ +

void fl_close_display()

+ +

This closes the X connection. You do not need to call +this to exit, and in fact it is faster to not do so! It may be +useful to call this if you want your program to continue without +the X connection. You cannot open the display again, and +probably cannot call any FLTK functions. + +

extern int fl_screen

+ +

Which screen number to use. This is set by +fl_open_display() to the default screen. You can change +it by setting this to a different value immediately afterwards. +It can also be set by changing the last number in the +Fl::display() string to "host:0.#". + +

extern XVisualInfo *fl_visual
+extern Colormap fl_colormap

+ +

The visual and colormap that FLTK will use for all windows. +These are set by fl_open_display() to the default +visual and colormap. You can change them before calling +show() on the first window. Typical code for changing +the default visual is: + +

    +Fl::args(argc, argv); // do this first so $DISPLAY is set
    +fl_open_display();
    +fl_visual = find_a_good_visual(fl_display, fl_screen);
    +if (!fl_visual) Fl::abort("No good visual");
    +fl_colormap = make_a_colormap(fl_display, fl_visual->visual, fl_visual->depth);
    +// it is now ok to show() windows:
    +window->show(argc, argv);
    +
+ +

Using a Subclass of Fl_Window for Special X Stuff

+ +

FLTK can manage an X window on a different screen, visual +and/or colormap, you just can't use FLTK's drawing routines to +draw into it. But you can write your own draw() method +that uses Xlib (and/or OpenGL) calls only. + +

FLTK can also manage XID's provided by other libraries or +programs, and call those libraries when the window needs to be +redrawn.

+ +

To do this, you need to make a subclass of Fl_Window and +override some of these virtual functions:

+ +

virtual void Fl_Window::show()

+ +

If the window is already shown() this must cause it +to be raised, this can usually be done by calling +Fl_Window::show(). If not shown() your +implementation must call either Fl_X::set_xid() or +Fl_X::make_xid(). + +

An example:

+ +
    +void MyWindow::show() {
    +  if (shown()) {Fl_Window::show(); return;}  // you must do this!
    +  fl_open_display();	// necessary if this is first window
    +  // we only calcualte the necessary visual colormap once:
    +  static XVisualInfo *visual;
    +  static Colormap colormap;
    +  if (!visual) {
    +    visual = figure_out_visual();
    +    colormap = XCreateColormap(fl_display, RootWindow(fl_display,fl_screen),
    +                               vis->visual, AllocNone);
    +  }
    +  Fl_X::make_xid(this, visual, colormap);
    +}
    +
+ +

Fl_X *Fl_X::set_xid(Fl_Window *, Window xid)

+ +

Allocate a hidden structure called an Fl_X, put the +XID into it, and set a pointer to it from the +Fl_Window. This causes Fl_Window::shown() to +return true. + +

void Fl_X::make_xid(Fl_Window *, XVisualInfo *= fl_visual, +Colormap = fl_colormap)

+ +

This static method does the most onerous parts of creating an +X window, including setting the label, resize limitations, etc. +It then does Fl_X::set_xid() with this new window and +maps the window. + +

virtual void Fl_Window::flush()

+ +

This virtual function is called by Fl::flush() to +update the window. For FLTK's own windows it does this by +setting the global variables fl_window and +fl_gc and then calling the draw() method. For +your own windows you might just want to put all the drawing code +in here. + +

The X region that is a combination of all damage() +calls done so far is in Fl_X::i(this)->region. If +NULL then you should redraw the entire window. The +undocumented function fl_clip_region(XRegion) will +initialize the FLTK clip stack with a region or NULL +for no clipping. You must set region to NULL afterwards +as fl_clip_region() will own and delete it when +done.

+ +

If damage() & FL_DAMAGE_EXPOSE then only X +expose events have happened. This may be useful if you have an +undamaged image (such as a backing buffer) around.

+ +

Here is a sample where an undamaged image is kept somewhere:

+ +
    +void MyWindow::flush() {
    +  fl_clip_region(Fl_X::i(this)->region);
    +  Fl_X::i(this)->region = 0;
    +  if (damage() != 2) {... draw things into backing store ...}
    +  ... copy backing store to window ...
    +}
    +
+ +

virtual void Fl_Window::hide()

+ +

Destroy the window server copy of the window. Usually you +will destroy contexts, pixmaps, or other resources used by the +window, and then call Fl_Window::hide() to get rid of +the main window identified by xid(). If you override +this, you must also override the destructor as shown: + +

    +void MyWindow::hide() {
    +  if (mypixmap) {
    +    XFreePixmap(fl_display,mypixmap);
    +    mypixmap = 0;
    +  }
    +  Fl_Window::hide(); // you must call this
    +}
    +
+ +

virtual void Fl_Window::~Fl_Window()

+ +

Because of the way C++ works, if you override hide() +you must override the destructor as well (otherwise only +the base class hide() is called): + +

    +MyWindow::~MyWindow() {
    +  hide();
    +}
    +
+ +

Setting the Icon of a Window

+ +

FLTK currently supports setting a window's icon before it +is shown using the Fl_Window::icon() method. + +

void Fl_Window::icon(char *)

+ +

Sets the icon for the window to the passed pointer. You will +need to cast the icon Pixmap to a char * when +calling this method. To set a monochrome icon using a bitmap compiled +with your application use: + +

    +#include "icon.xbm"
    +
    +fl_open_display(); // needed if display has not been previously opened
    +
    +Pixmap p = XCreateBitmapFromData(fl_display, DefaultRootWindow(fl_display),
    +                                 icon_bits, icon_width, icon_height);
    +
    +window->icon((char *)p);
    +
+ +

To use a multi-colored icon, the XPM format and library +should be used as follows: + +

    +#include <X11/xpm.h>
    +#include "icon.xpm"
    +
    +fl_open_display();                // needed if display has not been previously opened
    +
    +Pixmap p, mask;
    +
    +XpmCreatePixmapFromData(fl_display, DefaultRootWindow(fl_display),
    +                                 icon_xpm, &p, &mask, NULL);
    +
    +window->icon((char *)p);
    +
+ +

When using the Xpm library, be sure to include it in the list +of libraries that are used to link the application (usually +"-lXpm").

+ +
+ + + +
NOTE: + +

You must call Fl_Window::show(argc, + argv) for the icon to be used. The + Fl_Window::show() method does not bind the icon + to the window. + +

+ +

X Resources

+ +

When the Fl_Window::show(argc, +argv) method is called, FLTK looks for the following X +resources: + +

    + +
  • background - The default background color + for widgets (color). + +
  • dndTextOps - The default setting for + drag and drop text operations (boolean). + +
  • foreground - The default foreground (label) + color for widgets (color). + +
  • scheme - The default scheme to use + (string). + +
  • selectBackground - The default selection + color for menus, etc. (color). + +
  • Text.background - The default background + color for text fields (color). + +
  • tooltips - The default setting for + tooltips (boolean). + +
  • visibleFocus - The default setting for + visible keyboard focus on non-text widgets (boolean). + +
+ +

Resources associated with the first window's Fl_Window::xclass() +string are queried first, or if no class has been specified then +the class "fltk" is used (e.g. fltk.background). If no +match is found, a global search is done (e.g. +*background). + +

The Windows (WIN32) Interface

+ +

The Windows interface provides access to the WIN32 GDI +state information and data structures. + +

Handling Other WIN32 Messages

+ +

By default a single WNDCLASSEX called "FLTK" is +created. All Fl_Window's are of this class unless you +use Fl_Window::xclass(). The window class is created +the first time Fl_Window::show() is called. + +

You can probably combine FLTK with other libraries that make +their own WIN32 window classes. The easiest way is to call +Fl::wait(), as it will call DispatchMessage +for all messages to the other windows. If necessary you can let +the other library take over as long as it calls +DispatchMessage(), but you will have to arrange for the +function Fl::flush() to be called regularly so that +widgets are updated, timeouts are handled, and the idle +functions are called.

+ +

extern MSG fl_msg

+ +

This variable contains the most recent message read by +GetMessage, which is called by Fl::wait(). This may not be the +most recent message sent to an FLTK window, because silly WIN32 +calls the handle procedures directly for some events (sigh). + +

void Fl::add_handler(int (*f)(int))

+ +

Installs a function to parse unrecognized messages sent to +FLTK windows. If FLTK cannot figure out what to do with a +message, it calls each of these functions (most recent first) +until one of them returns non-zero. The argument passed to the +functions is the FLTK event that was not handled or zero for +unknown messages. If all the handlers return zero then FLTK +calls DefWindowProc(). + +

HWND fl_xid(const Fl_Window *)

+ +

Returns the window handle for a Fl_Window, or zero +if not shown(). + +

Fl_Window *fl_find(HWND xid)

+ +

Returns the Fl_Window that corresponds to the given +window handle, or NULL if not found. This function uses +a cache so it is slightly faster than iterating through the +windows yourself. + +

Drawing Things Using the WIN32 GDI

+ +

When the virtual function Fl_Widget::draw() is +called, FLTK stores all the silly extra arguments you need to +make a proper GDI call in some global variables: + +

    +extern HINSTANCE fl_display;
    +extern HWND fl_window;
    +extern HDC fl_gc;
    +COLORREF fl_RGB();
    +HPEN fl_pen();
    +HBRUSH fl_brush();
    +
+ +

These global variables are set before draw() is +called, or by Fl_Window::make_current(). +You can refer to them when needed to produce GDI calls, but don't +attempt to change them. The functions return GDI objects for +the current color set by fl_color() and are created as +needed and cached. A typical GDI drawing call is written like +this: + +

    +DrawSomething(fl_gc, ..., fl_brush());
    +
+ +

It may also be useful to refer to Fl_Window::current() +to get the window's size or position. + +

Setting the Icon of a Window

+ +

FLTK currently supports setting a window's icon *before* it +is shown using the Fl_Window::icon() method. + +

void Fl_Window::icon(char *)

+ +

Sets the icon for the window to the passed pointer. You will +need to cast the HICON handle to a char * when +calling this method. To set the icon using an icon resource +compiled with your application use: + +

    +window->icon((char *)LoadIcon(fl_display, MAKEINTRESOURCE(IDI_ICON)));
    +
+ +

You can also use the LoadImage() and related +functions to load specific resolutions or create the icon from +bitmap data. + +

+ + + +
NOTE: + +

You must call Fl_Window::show(argc, + argv) for the icon to be used. The + Fl_Window::show() method does not bind the icon + to the window. + +

+ +

How to Not Get a MSDOS Console Window

+ +

WIN32 has a really stupid mode switch stored in the +executables that controls whether or not to make a console +window. + +

To always get a console window you simply create a console +application (the "/SUBSYSTEM:CONSOLE" option for the +linker). For a GUI-only application create a WIN32 application +(the "/SUBSYSTEM:WINDOWS" option for the linker).

+ +

FLTK includes a WinMain() function that calls the +ANSI standard main() entry point for you. This +function creates a console window when you use the debug version +of the library.

+ +

WIN32 applications without a console cannot write to +stdout or stderr, even if they are run from a +console window. Any output is silently thrown away. +Additionally, WIN32 applications are run in the background by +the console, although you can use "start /wait program" to run +them in the foreground.

+ +

Known WIN32 Bugs and Problems

+ +

The following is a list of known bugs and problems in the WIN32 +version of FLTK: + +

    + +
  • If a program is deactivated, Fl::wait() + does not return until it is activated again, even though + many events are delivered to the program. This can cause + idle background processes to stop unexpectedly. This + also happens while the user is dragging or resizing + windows or otherwise holding the mouse down. We were + forced to remove most of the efficiency FLTK uses for + redrawing in order to get windows to update while being + moved. This is a design error in WIN32 and probably + impossible to get around.
  • + +
  • Fl_Gl_Window::can_do_overlay() returns true + until the first time it attempts to draw an overlay, and + then correctly returns whether or not there is overlay + hardware.
  • + +
  • SetCapture (used by Fl::grab()) + doesn't work, and the main window title bar turns gray + while menus are popped up.
  • + +
  • Compilation with gcc 3.4.4 and -Os exposes an + optimisation bug in gcc. The symptom is that when drawing + filled circles only the perimeter is drawn. This can for instance + be seen in the symbols demo. Other optimisation options such + as -O2 and -O3 seem to work OK. More details can be found + in STR#1656
  • +
+ +

The MacOS Interface

+ +

FLTK supports MacOS X using the Apple Carbon library. Older +versions of MacOS are not supported. + +

Control, Option, and Command Modifier Keys

+ +

FLTK maps the Mac 'control' key to FL_CTRL, the +'option' key to FL_ALT and the 'Apple' key to +FL_META. Keyboard events return the key name in +Fl::event_key() and the keystroke translation in +Fl::event_text(). For example, typing Option-Y on a Mac +keyboard will set FL_ALT in Fl::event_state(), +set Fl::event_key() to 'y' and return the Yen symbol in +Fl::event_text(). + +

WindowRef fl_xid(const Fl_Window *)

+ +

Returns the window reference for an Fl_Window, or +NULL if the window has not been shown. + +

Fl_Window *fl_find(WindowRef xid)

+ +

Returns the Fl_Window that corresponds to the give +window handle, or NULL if not found. FLTK windows that +are children of top-level windows share the WindowRef of the +top-level window. + +

Apple "Quit" Event

+ +

When the user press Cmd-Q or requests a termination of the +application, OS X will send a "Quit" Apple Event. FLTK handles +this event by sending an FL_CLOSE event to all open +windows. If all windows close, the application will terminate. + +

Apple "Open" Event

+ +Whenever the user drops a file onto an application icon, OS X +generates an Apple Event of the type "Open". You can have FLTK +notify you of an Open event by setting the fl_open_callback. + +

void fl_open_callback(void (*cb)(const char *))

+ +cb will be called with a single iUnix-style file name and path. +If multiple files were dropped, fl_open_callback will be called +multiple times. + +

Drawing Things Using QuickDraw

+ +

When the virtual function Fl_Widget::draw() is +called, FLTK has prepared the Window and CGrafPort for drawing. +Clipping and offsets are prepared to allow correct subwindow +drawing. + +

Drawing Things Using Quartz

+ +

If the FLTK library was compiled using the configuration +flag --enable-quartz, all code inside Fl_Widget::draw() +is expected to call Quartz drawing functions instead of +QuickDraw. The Quartz coordinate system is flipped to match +FLTK's coordinate system. The origin for all drawing is in the top +left corner of the enclosing Fl_Window. + +

Fl_Double_Window

+ +

OS X double-buffers all windows automatically. On OS X, +Fl_Window and Fl_Double_Window are handled +internally in the same way. + +

Mac File System Specifics

+ +

Resource Forks

+ +

FLTK does not access the resource fork of an application. +However, a minimal resource fork must be created for OS X +applications + +

+
Caution: + +

When using UNIX commands to copy or move executables, OS X +will NOT copy any resource forks! For copying and moving use +CpMac and MvMac respectively. For creating a tar archive, all +executables need to be stripped from their Resource Fork before +packing, e.g. "DeRez fluid > fluid.r". After unpacking the +Resource Fork needs to be reattached, e.g. "Rez fluid.r -o +fluid". +

+ +

It is advisable to use the Finder for moving and copying and +Mac archiving tools like Sit for distribution as they will +handle the Resource Fork correctly. + +

Mac File Paths

+ +

FLTK uses UNIX-style filenames and paths. + +

Known MacOS Bugs and Problems

+ +

The following is a list of known bugs and problems in the +MacOS version of FLTK: + +

    + +
  • Line styles are not well supported. This is due to + limitations in the QuickDraw interface.
  • + +
  • Nested subwindows are not supported, i.e. you can + have a Fl_Window widget inside a + Fl_Window, but not a Fl_Window inside a + Fl_Window inside a Fl_Window.
  • + +
+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/positioner.gif b/third_party/windows/fltk-1.1.10/documentation/positioner.gif new file mode 100644 index 0000000..ba9d269 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/positioner.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/preface.html b/third_party/windows/fltk-1.1.10/documentation/preface.html new file mode 100644 index 0000000..8c48226 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/preface.html @@ -0,0 +1,117 @@ + + + + + + FLTK 1.1.10 Programming Manual + + + +

Preface

+ +

This manual describes the Fast Light Tool Kit ("FLTK") +version 1.1.10, a C++ Graphical User Interface +("GUI") toolkit for UNIX, Microsoft Windows and MacOS. Each +of the chapters in this manual is designed as a tutorial for +using FLTK, while the appendices provide a convenient reference +for all FLTK widgets, functions, and operating system +interfaces.

+ +

This manual may be printed, modified, and/or used under +the terms of the FLTK license provided in Appendix A. + +

Organization

+ +

This manual is organized into the following chapters and appendices:

+ + + +

Conventions

+ +

The following typeface conventions are used in this manual:

+ +
    +
  • Function and constant names are shown in bold courier type
  • + +
  • Code samples and commands are shown in regular courier type
  • + +
+ +

Abbreviations

+ +

The following abbreviations are used in this manual:

+ +
+ +
X11
+
The X Window System version 11.
+ +
Xlib
+
The X Window System interface library.
+ +
WIN32
+
The Microsoft Windows 32-bit Application Programmer's Interface.
+ +
MacOS
+
The Apple Macintosh OS 8.6 and later, including OS X.
+ +
+ +

Copyrights and Trademarks

+ +

FLTK is Copyright 1998-2009 by Bill Spitzak and others. Use and +distribution of FLTK is governed by the GNU Library General Public +License, located in Appendix H.

+ +

UNIX is a registered trademark of the X Open Group, Inc. +Microsoft and Windows are registered trademarks of Microsoft +Corporation. OpenGL is a registered trademark of Silicon +Graphics, Inc. Apple, Macintosh, MacOS, and Mac OS X are +registered trademarks of Apple Computer, Inc.

+ + + diff --git a/third_party/windows/fltk-1.1.10/documentation/resizebox1.gif b/third_party/windows/fltk-1.1.10/documentation/resizebox1.gif new file mode 100644 index 0000000..c5e8c30 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/resizebox1.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/resizebox2.gif b/third_party/windows/fltk-1.1.10/documentation/resizebox2.gif new file mode 100644 index 0000000..2083afd Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/resizebox2.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/round_clock.gif b/third_party/windows/fltk-1.1.10/documentation/round_clock.gif new file mode 100644 index 0000000..939457a Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/round_clock.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/scrollbar.gif b/third_party/windows/fltk-1.1.10/documentation/scrollbar.gif new file mode 100644 index 0000000..96d0358 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/scrollbar.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/slider.gif b/third_party/windows/fltk-1.1.10/documentation/slider.gif new file mode 100644 index 0000000..923e257 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/slider.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/subclassing.html b/third_party/windows/fltk-1.1.10/documentation/subclassing.html new file mode 100644 index 0000000..93bc892 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/subclassing.html @@ -0,0 +1,434 @@ + + + 7 - Adding and Extending Widgets + + +

7 - Adding and Extending Widgets

+ This chapter describes how to add your own widgets or extend existing +widgets in FLTK. +

Subclassing

+ New widgets are created by subclassing an existing FLTK widget, +typically Fl_Widget for controls and Fl_Group for +composite widgets. +

A control widget typically interacts with the user to receive and/or +display a value of some sort.

+

A composite widget widget holds a list of child widgets and handles moving, +sizing, showing, or hiding them as needed. Fl_Group is the +main composite widget widget class in FLTK, and all of the other composite widgets ( +Fl_Pack, Fl_Scroll, Fl_Tabs, Fl_Tile, +and Fl_Window) are subclasses of it.

+

You can also subclass other existing widgets to provide a different +look or user-interface. For example, the button widgets are all +subclasses of Fl_Button since they all interact with the user +via a mouse button click. The only difference is the code that draws +the face of the button.

+

Making a Subclass of Fl_Widget

+ Your subclasses can directly descend from Fl_Widget or any +subclass of Fl_Widget. Fl_Widget has only four +virtual methods, and overriding some or all of these may be necessary. +

The Constructor

+ The constructor should have the following arguments: +
    +MyClass(int x, int y, int w, int h, const char *label = 0);
    +
+ This will allow the class to be used in FLUID + without problems. +

The constructor must call the constructor for the base class and +pass the same arguments:

+
    +MyClass::MyClass(int x, int y, int w, int h, const char *label)
    +: Fl_Widget(x, y, w, h, label) {
    +// do initialization stuff...
    +}
    +
+Fl_Widget's protected constructor sets x(), y(), +w(), h(), and label() to the passed values +and initializes the other instance variables to: +
    +type(0);
    +box(FL_NO_BOX);
    +color(FL_BACKGROUND_COLOR);
    +selection_color(FL_BACKGROUND_COLOR);
    +labeltype(FL_NORMAL_LABEL);
    +labelstyle(FL_NORMAL_STYLE);
    +labelsize(FL_NORMAL_SIZE);
    +labelcolor(FL_FOREGROUND_COLOR);
    +align(FL_ALIGN_CENTER);
    +callback(default_callback,0);
    +flags(ACTIVE|VISIBLE);
    +image(0);
    +deimage(0);
    +
+

Protected Methods of Fl_Widget

+ The following methods are provided for subclasses to use: + +

void Fl_Widget::damage(uchar mask) +
void Fl_Widget::damage(uchar mask, int x, int y, int w, int h) +
uchar Fl_Widget::damage()

+The first form indicates that a partial update of the object is +needed. The bits in mask are OR'd into damage(). Your +draw() routine can examine these bits to limit what it is +drawing. The public method Fl_Widget::redraw() simply does + Fl_Widget::damage(FL_DAMAGE_ALL), but the implementation of +your widget can call the private damage(n). +

The second form indicates that a region is damaged. If only these +calls are done in a window (no calls to damage(n)) then FLTK +will clip to the union of all these calls before drawing anything. + This can greatly speed up incremental displays. The mask bits are +OR'd into damage() unless this is a Fl_Window widget.

+

The third form returns the bitwise-OR of all damage(n) +calls done since the last draw().

+

When redrawing your widgets you should look at the damage bits to +see what parts of your widget need redrawing. The handle() +method can then set individual damage bits to limit the amount of drawing +that needs to be done: +

    +MyClass::handle(int event) {
    +  ...
    +  if (change_to_part1) damage(1);
    +  if (change_to_part2) damage(2);
    +  if (change_to_part3) damage(4);
    +}
    +
    +MyClass::draw() {
    +  if (damage() & FL_DAMAGE_ALL) {
    +    ... draw frame/box and other static stuff ...
    +  }
    +
    +  if (damage() & (FL_DAMAGE_ALL | 1)) draw_part1();
    +  if (damage() & (FL_DAMAGE_ALL | 2)) draw_part2();
    +  if (damage() & (FL_DAMAGE_ALL | 4)) draw_part3();
    +}
    +
+

void Fl_Widget::draw_box() const +
void Fl_Widget::draw_box(Fl_Boxtype b, ulong c) const

+ The first form draws this widget's box(), using the +dimensions of the widget. The second form uses b as the box +type and c as the color for the box. + +

void Fl_Widget::draw_focus() const +
void Fl_Widget::draw_focus(Fl_Boxtype b, int x, int y, int w, int h) const

+ +

Draws a focus box inside the widgets bounding box. The second +form allows you to specify a different bounding box. + +

void Fl_Widget::draw_label() const +
void Fl_Widget::draw_label(int x, int y, int w, int h) const +
void Fl_Widget::draw_label(int x, int y, int w, int h, Fl_Align +align) const

+ This is the usual function for a draw() method to call to +draw the widget's label. It does not draw the label if it is supposed +to be outside the box (on the assumption that the enclosing group will +draw those labels). +

The second form uses the passed bounding box instead of the widget's +bounding box. This is useful so "centered" labels are aligned with some +feature, like a moving slider.

+

The third form draws the label anywhere. It acts as though +FL_ALIGN_INSIDE has been forced on so the label will appear inside +the passed bounding box. This is designed for parent groups to draw +labels with.

+

void Fl_Widget::set_flag(SHORTCUT_LABEL)

+Modifies draw_label() so that '&' characters cause an underscore +to be printed under the next letter. +

void Fl_Widget::set_visible() +
void Fl_Widget::clear_visible()

+ Fast inline versions of Fl_Widget::hide() and +Fl_Widget::show(). These do not send the FL_HIDE and +FL_SHOW events to the widget. +

int Fl_Widget::test_shortcut() const +
static int Fl_Widget::test_shortcut(const char *s)

+ The first version tests Fl_Widget::label() against the +current event (which should be a FL_SHORTCUT event). If the +label contains a '&' character and the character after it matches the key +press, this returns true. This returns false if the SHORTCUT_LABEL +flag is off, if the label is NULL or does not have a +'&' character in it, or if the keypress does not match the character. +

The second version lets you do this test against an arbitrary +string.

+

uchar Fl_Widget::type() const +
void Fl_Widget::type(uchar t)

+ The property Fl_Widget::type() can return an arbitrary 8-bit +identifier, and can be set with the protected method type(uchar t) +. This value had to be provided for Forms compatibility, but you can +use it for any purpose you want. Try to keep the value less than 100 +to not interfere with reserved values. +

FLTK does not use RTTI (Run Time Typing Information), to enhance +portability. But this may change in the near future if RTTI becomes +standard everywhere.

+

If you don't have RTTI you can use the clumsy FLTK mechanism, by +having type() use a unique value. These unique values must +be greater than the symbol FL_RESERVED_TYPE (which is 100). +Look through the header files for FL_RESERVED_TYPE to find an +unused number. If you make a subclass of Fl_Window +you must use FL_WINDOW + n (n must be in the +range 1 to 7).

+

Handling Events

+ The virtual method int Fl_Widget::handle(int event) is called +to handle each event passed to the widget. It can: + + Events are identified by the integer argument. Other information +about the most recent event is stored in static locations and aquired +by calling the Fl::event_*() + functions. This information remains valid until another event is +handled. +

Here is a sample handle() method for a widget that acts as +a pushbutton and also accepts the keystroke 'x' to cause the callback:

+
    +int MyClass::handle(int event) {
    +  switch(event) {
    +    case FL_PUSH:
    +      highlight = 1;
    +      redraw();
    +      return 1;
    +    case FL_DRAG: {
    +        int t = Fl::event_inside(this);
    +        if (t != highlight) {
    +          highlight = t;
    +	  redraw();
    +	}
    +      }
    +      return 1;
    +    case FL_RELEASE:
    +      if (highlight) {
    +	highlight = 0;
    +	redraw();
    +        do_callback();
    +	// never do anything after a callback, as the callback
    +	// may delete the widget!
    +      }
    +      return 1;
    +    case FL_SHORTCUT:
    +      if (Fl::event_key() == 'x') {
    +        do_callback();
    +	return 1;
    +      }
    +      return 0;
    +    default:
    +      return Fl_Widget::handle(event);
    +  }
    +}
    +
+ +

You must return non-zero if your handle() method +uses the event. If you return zero, the parent widget will try +sending the event to another widget. + +

Drawing the Widget

+ +

The draw() virtual method is called when FLTK wants +you to redraw your widget. It will be called if and only if +damage() is non-zero, and damage() will be +cleared to zero after it returns. The draw() method +should be declared protected so that it can't be called from +non-drawing code. + +

The damage() value contains the bitwise-OR of all +the damage(n) calls to this widget since it was last +drawn. This can be used for minimal update, by only redrawing +the parts whose bits are set. FLTK will turn on the +FL_DAMAGE_ALL bit if it thinks the entire widget must +be redrawn, e.g. for an expose event.

+ +

Expose events (and the above damage(b,x,y,w,h)) will cause +draw() to be called with FLTK's +clipping turned on. You can greatly speed up redrawing in some +cases by testing fl_not_clipped(x,y,w,h) or fl_clip_box(...) and +skipping invisible parts.

+

Besides the protected methods described above, FLTK provides a large +number of basic drawing functions, which are described +below.

+

Resizing the Widget

+ The resize(int x, int y, int w, int h) method is called when +the widget is being resized or moved. The arguments are the new +position, width, and height. x(), y(), w(), +and h() still remain the old size. You must call resize() + on your base class with the same arguments to get the widget size to +actually change. +

This should not call redraw(), at least if only the +x() and y() change. This is because composite widgets like +Fl_Scroll may have a more efficient way of drawing the new +position.

+

Making a Composite Widget

+ A "composite" widget contains one or more "child" widgets. + To make a composite widget you should subclass Fl_Group +. It is possible to make a composite object that is not a subclass of +Fl_Group, but you'll have to duplicate the code in Fl_Group + anyways. +

Instances of the child widgets may be included in the parent:

+
    +class MyClass : public Fl_Group {
    +  Fl_Button the_button;
    +  Fl_Slider the_slider;
    +  ...
    +};
    +
+ The constructor has to initialize these instances. They are +automatically add()ed to the group, since the Fl_Group + constructor does begin(). Don't forget to call end() + or use the Fl_End pseudo-class: +
    +MyClass::MyClass(int x, int y, int w, int h) :
    +  Fl_Group(x, y, w, h),
    +  the_button(x + 5, y + 5, 100, 20),
    +  the_slider(x, y + 50, w, 20)
    +{
    +  ...(you could add dynamically created child widgets here)...
    +  end(); // don't forget to do this!
    +}
    +
+ The child widgets need callbacks. These will be called with a pointer +to the children, but the widget itself may be found in the parent() + pointer of the child. Usually these callbacks can be static private +methods, with a matching private method: +
    +void MyClass::static_slider_cb(Fl_Widget* v, void *) { // static method
    +  ((MyClass*)(v->parent())->slider_cb();
    +}
    +void MyClass::slider_cb() { // normal method
    +  use(the_slider->value());
    +}
    +
+ If you make the handle() method, you can quickly pass all the +events to the children using the Fl_Group::handle() method. +You don't need to override handle() if your composite widget +does nothing other than pass events to the children: +
    +int MyClass::handle(int event) {
    +  if (Fl_Group::handle(event)) return 1;
    +  ... handle events that children don't want ...
    +}
    +
+ +

If you override draw() you need to draw all the +children. If redraw() or damage() is called +on a child, damage(FL_DAMAGE_CHILD) is done to the +group, so this bit of damage() can be used to indicate +that a child needs to be drawn. It is fastest if you avoid +drawing anything else in this case: + +

    +int MyClass::draw() {
    +  Fl_Widget *const*a = array();
    +  if (damage() == FL_DAMAGE_CHILD) { // only redraw some children
    +    for (int i = children(); i --; a ++) update_child(**a);
    +  } else { // total redraw
    +    ... draw background graphics ...
    +    // now draw all the children atop the background:
    +    for (int i = children_; i --; a ++) {
    +      draw_child(**a);
    +      draw_outside_label(**a); // you may not need to do this
    +    }
    +  }
    +}
    +
+Fl_Group provides some protected methods to make drawing +easier: + +

void Fl_Group::draw_child(Fl_Widget&)

+ This will force the child's damage() bits all to one and call +draw() on it, then clear the damage(). You should call +this on all children if a total redraw of your widget is requested, or +if you draw something (like a background box) that damages the child. + Nothing is done if the child is not visible() or if it is +clipped. +

void +Fl_Group::draw_outside_label(Fl_Widget&) const

+ Draw the labels that are not drawn by +draw_label(). If you want more control over the label +positions you might want to call child->draw_label(x,y,w,h,a). +

void Fl_Group::update_child(Fl_Widget&)

+ Draws the child only if its damage() is non-zero. You +should call this on all the children if your own damage is equal to +FL_DAMAGE_CHILD. Nothing is done if the child is not visible() + or if it is clipped. + +

Cut and Paste Support

+FLTK provides routines to cut and paste 8-bit text (in the future this +may be UTF-8) between applications: + +It may be possible to cut/paste non-text data by using +Fl::add_handler(). + +

Drag And Drop Support

+ +FLTK provides routines to drag and drop 8-bit text between applications: + +

Drag'n'drop operations are are initiated by copying data to the +clipboard and calling the function +Fl::dnd(). + +

Drop attempts are handled via events: +

    +
  • FL_DND_ENTER
  • +
  • FL_DND_DRAG
  • +
  • FL_DND_LEAVE
  • +
  • FL_DND_RELEASE
  • +
  • FL_PASTE
  • +
+ +

Making a subclass of Fl_Window

+ +

You may want your widget to be a subclass of +Fl_Window, Fl_Double_Window, or +FL_Gl_Window. This can be useful if your widget wants +to occupy an entire window, and can also be used to take +advantage of system-provided clipping, or to work with a library +that expects a system window ID to indicate where to draw. + +

Subclassing Fl_Windowis almost exactly like +subclassing Fl_Group, and in fact you can easily +switch a subclass back and forth. Watch out for the following +differences:

+ +
    + +
  1. Fl_Window is a subclass of + Fl_Group so make sure your constructor calls + end() unless you actually want children + added to your window.
  2. + +
  3. When handling events and drawing, the upper-left + corner is at 0,0, not x(),y() as in other + Fl_Widget's. For instance, to draw a box + around the widget, call draw_box(0, 0, w(), + h()), rather than draw_box(x(), y(), w(), + h()).
  4. + +
+ +

You may also want to subclass Fl_Window in order to +get access to different visuals or to change other attributes of +the windows. See "Appendix F - Operating +System Issues" for more information. + + + diff --git a/third_party/windows/fltk-1.1.10/documentation/sudoku.man b/third_party/windows/fltk-1.1.10/documentation/sudoku.man new file mode 100644 index 0000000..6c35f7a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/sudoku.man @@ -0,0 +1,33 @@ +.TH sudoku 6 "FLTK Sudoku" "15 January 2006" +.SH NAME +sudoku \- the fltk sudoku game +.sp +.SH SYNOPSIS +\fISudoku\fR is a FLTK-based version of the game of Sudoku. +Sudoku (pronounced soo-dough-coo with the emphasis on the first +syllable) is a simple number-based puzzle/game played on a 9x9 +grid that is divided into 3x3 subgrids. The goal is to enter a +number from 1 to 9 in each cell so that each number appears only +once in each column and row. +.LP +At the start of a new game, Sudoku fills in a random selection of +cells for you - the number of cells depends on the difficulty +level you use. Click in any of the empty cells or use the arrow +keys to highlight individual cells and press a number from 1 to 9 +to fill in the cell. To clear a cell, press 0, Delete, or +Backspace. As you complete each subgrid, correct subgrids are +highlighted in green. When you have successfully completed all +subgrids, the entire puzzle is highlighted until you start a new +game. +.LP +As you work to complete the puzzle, you can display possible +solutions inside each cell by holding the Shift key and pressing +each number in turn. Repeat the process to remove individual +numbers, or press a number without the Shift key to replace them +with the actual number to use. +.SH SEE ALSO +fltk(3) +.br +FLTK Web Site, http://www.fltk.org/ +.SH AUTHOR +Michael R Sweet. diff --git a/third_party/windows/fltk-1.1.10/documentation/symbols.gif b/third_party/windows/fltk-1.1.10/documentation/symbols.gif new file mode 100644 index 0000000..54bda5b Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/symbols.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/tabs.gif b/third_party/windows/fltk-1.1.10/documentation/tabs.gif new file mode 100644 index 0000000..c347cba Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/tabs.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/text.gif b/third_party/windows/fltk-1.1.10/documentation/text.gif new file mode 100644 index 0000000..65a56da Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/text.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/valuators.gif b/third_party/windows/fltk-1.1.10/documentation/valuators.gif new file mode 100644 index 0000000..a2de738 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/valuators.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/value_slider.gif b/third_party/windows/fltk-1.1.10/documentation/value_slider.gif new file mode 100644 index 0000000..13fec43 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/documentation/value_slider.gif differ diff --git a/third_party/windows/fltk-1.1.10/documentation/widgets.html b/third_party/windows/fltk-1.1.10/documentation/widgets.html new file mode 100644 index 0000000..188a347 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/documentation/widgets.html @@ -0,0 +1,907 @@ + + + A - Class Reference + + + +

A - Class Reference

+ +This appendix describes all classes in FLTK and their methods. +For a description of the fl_ functions, see +Appendix B. + +

Alphabetical List of Classes

+ +
+ + + +
+Fl
+Fl_Adjuster
+Fl_Bitmap
+Fl_BMP_Image
+Fl_Box
+Fl_Browser_
+Fl_Browser
+Fl_Button
+Fl_Chart
+Fl_Check_Browser
+Fl_Check_Button
+Fl_Choice
+Fl_Clock
+Fl_Clock_Output
+Fl_Color_Chooser
+Fl_Counter
+Fl_Dial
+Fl_Double_Window
+Fl_End
+Fl_File_Browser
+Fl_File_Chooser
+Fl_File_Icon
+Fl_File_Input
+Fl_Float_Input
+Fl_Free
+Fl_GIF_Image
+Fl_Gl_Window
+Fl_Group
+Fl_Help_Dialog
+Fl_Help_View
+Fl_Hold_Browser
+Fl_Image
+Fl_Input_
+Fl_Input
+Fl_Input_Choice
+Fl_Int_Input
+Fl_JPEG_Image
+Fl_Light_Button
+Fl_Menu_Bar
+Fl_Menu_Button
+Fl_Menu_
+Fl_Menu_Item
+Fl_Menu_Window
+
+Fl_Multi_Browser
+Fl_Multiline_Input
+Fl_Multiline_Output
+Fl_Output
+Fl_Overlay_Window
+Fl_Pack
+Fl_Pixmap
+Fl_PNG_Image
+Fl_PNM_Image
+Fl_Positioner
+Fl_Preferences
+Fl_Progress
+Fl_Repeat_Button
+Fl_Return_Button
+Fl_RGB_Image
+Fl_Roller
+Fl_Round_Button
+Fl_Scrollbar
+Fl_Scroll
+Fl_Secret_Input
+Fl_Select_Browser
+Fl_Shared_Image
+Fl_Single_Window
+Fl_Slider
+Fl_Spinner
+Fl_Tabs
+Fl_Text_Buffer
+Fl_Text_Display
+Fl_Text_Editor
+Fl_Tiled_Image
+Fl_Tile
+Fl_Timer
+Fl_Toggle_Button
+Fl_Tooltip
+Fl_Valuator
+Fl_Value_Input
+Fl_Value_Output
+Fl_Value_Slider
+Fl_Widget
+Fl_Window
+Fl_Wizard
+Fl_XBM_Image
+Fl_XPM_Image
+
+ +

Class Hierarchy

+ + + +

Alphabetical List of Methods

+ +

A

+

B

+

C

+

D

+

E

+

F

+

G

+

H

+

I

+

K

+

L

+

M

+

N

+

O

+

P

+

R

+

S

+

T

+

U

+

V

+

W

+

X

+

y

+ + + diff --git a/third_party/windows/fltk-1.1.10/fltk-config.in b/third_party/windows/fltk-1.1.10/fltk-config.in new file mode 100644 index 0000000..868a2d0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fltk-config.in @@ -0,0 +1,344 @@ +#!/bin/sh +# +# "$Id: fltk-config.in 6610 2008-12-29 17:24:51Z matt $" +# +# FLTK configuration utility. +# +# Copyright 2000-2007 by Bill Spitzak and others. +# Original version Copyright 2000 by James Dean Palmer +# Adapted by Vincent Penne and Michael Sweet +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems on the following page: +# +# http://www.fltk.org/str.php +# + +MAJOR_VERSION=@FL_MAJOR_VERSION@ +MINOR_VERSION=@FL_MINOR_VERSION@ +PATCH_VERSION=@FL_PATCH_VERSION@ +VERSION="$MAJOR_VERSION.$MINOR_VERSION.$PATCH_VERSION" +APIVERSION="$MAJOR_VERSION.$MINOR_VERSION" + +### BEGIN fltk-config +selfdir=`dirname $0` + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +exec_prefix_set=no +bindir=@bindir@ +includedir=@includedir@ +libdir=@libdir@ +srcdir=@srcdir@ + +# compiler names +CC="@CC@" +CXX="@CXX@" + +# post-process command (only needed for MacOS) +POSTBUILD="@POSTBUILD@" + +# flags for C++ compiler: +ARCHFLAGS="@ARCHFLAGS@" +CFLAGS="@CFLAGS@ @LARGEFILE@ @PTHREAD_FLAGS@" +CXXFLAGS="@CXXFLAGS@ @LARGEFILE@ @PTHREAD_FLAGS@" +LDFLAGS="@LDFLAGS@" +LDLIBS="@LIBS@" +OPTIM="@OPTIM@" + +# Check for local invocation, and update paths accordingly... +if test -f "$selfdir/FL/Fl_Window.H"; then + bindir="$selfdir/fluid" + includedir="$selfdir" + libdir="$selfdir/lib" + + if test -f "$libdir/libfltk_jpeg.a"; then + CFLAGS="-I$includedir/jpeg $CFLAGS" + CXXFLAGS="-I$includedir/jpeg $CXXFLAGS" + fi + + if test -f "$libdir/libfltk_z.a"; then + CFLAGS="-I$includedir/zlib $CFLAGS" + CXXFLAGS="-I$includedir/zlib $CXXFLAGS" + fi + + if test -f "$libdir/libfltk_png.a"; then + CFLAGS="-I$includedir/png $CFLAGS" + CXXFLAGS="-I$includedir/png $CXXFLAGS" + fi +fi + +if test -d $includedir/FL/images; then + CFLAGS="-I$includedir/FL/images $CFLAGS" + CXXFLAGS="-I$includedir/FL/images $CXXFLAGS" +fi + +# libraries to link with: +LIBNAME="@LIBNAME@" +DSONAME="@DSONAME@" +DSOLINK="@DSOLINK@" +IMAGELIBS="@IMAGELIBS@" +STATICIMAGELIBS="@STATICIMAGELIBS@" +SHAREDSUFFIX="@SHAREDSUFFIX@" + +usage () +{ + echo "Usage: fltk-config [OPTIONS] +Options: + [--version] + [--api-version] + +Options telling what we are doing: + [--use-gl] use GL + [--use-images] use extra image formats (PNG, JPEG) + [--use-glut] use glut compatibility layer + [--use-forms] use forms compatibility layer + +Options telling what information we request: + [--cc] return C compiler used to compile FLTK + [--cxx] return C++ compiler used to compile FLTK + [--optim] return compiler optimization used to compile FLTK + [--cflags] return flags to compile C using FLTK + [--cxxflags] return flags to compile C++ using FLTK + [--ldflags] return flags to link against FLTK + [--ldstaticflags] return flags to link against static FLTK library + even if there are DSOs installed + [--libs] return FLTK libraries full path for dependencies + +Option to compile and link an application: + [-g] compile the program with debugging information + [-Dname[=value]] compile the program with the given define + [--compile program.cxx] + [--post program] +" + exit $1 +} + +if test $# -eq 0; then + usage 1 +fi + +no_plugins=no +compile= +post= +debug= + +# Parse command line options +while test $# -gt 0 +do + case "$1" in + -*=*) + optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` + ;; + *) + optarg= + ;; + esac + + case $1 in + --version) + echo $VERSION + ;; + --api-version) + echo $APIVERSION + ;; + --cc) + echo $CC + ;; + --cxx) + echo $CXX + ;; + --optim) + echo_optim=yes + ;; + --use-gl | --use-glut) + use_gl=yes + ;; + --use-forms) + use_forms=yes + ;; + --use-images) + use_images=yes + ;; + --cflags) + echo_cflags=yes + ;; + --cxxflags) + echo_cxxflags=yes + ;; + --ldflags) + echo_ldflags=yes + ;; + --ldstaticflags) + echo_ldstaticflags=yes + ;; + --libs) + echo_libs=yes + ;; + -g) + debug=-g + ;; + -D*) + CXXFLAGS="$CXXFLAGS $1" + ;; + --compile) + compile=$2 + post=$2 + shift + ;; + --post) + post=$2 + shift + ;; + *) + echo_help=yes + ;; + esac + shift +done + +if test "$includedir" != /usr/include; then + includes=-I$includedir +else + includes= +fi + +if test "$libdir" != /usr/lib -a "$libdir" != /usr/lib32; then + libs=-L$libdir +else + libs= +fi + +# Calculate needed libraries +LDSTATIC="$libdir/libfltk.a $LDLIBS" +LDLIBS="-lfltk$SHAREDSUFFIX $LDLIBS" + +if test x$use_forms = xyes; then + LDLIBS="-lfltk_forms$SHAREDSUFFIX $LDLIBS" + LDSTATIC="$libdir/libfltk_forms.a $LDSTATIC" +fi +if test x$use_gl = xyes; then + LDLIBS="-lfltk_gl$SHAREDSUFFIX @GLLIB@ $LDLIBS" + LDSTATIC="$libdir/libfltk_gl.a @GLLIB@ $LDSTATIC" +fi +if test x$use_images = xyes; then + LDLIBS="-lfltk_images$SHAREDSUFFIX $IMAGELIBS $LDLIBS" + LDSTATIC="$libdir/libfltk_images.a $STATICIMAGELIBS $LDSTATIC" +fi + +LDLIBS="$DSOLINK $LDFLAGS $libs $LDLIBS" +LDSTATIC="$LDFLAGS $LDSTATIC" + +# Answer to user requests +if test -n "$echo_help"; then + usage 1 +fi + +if test -n "$compile"; then + case $compile in + *.cxx) + prog=`basename $compile .cxx` + ;; + *.cpp) + prog=`basename $compile .cpp` + ;; + *.cc) + prog=`basename $compile .cc` + ;; + *.C) + prog=`basename $compile .C` + ;; + *) + echo "ERROR: Unknown/bad C++ source file extension on \"$compile\"!" + exit 1 + ;; + esac + + post=$prog + + echo $CXX $ARCHFLAGS $includes $CXXFLAGS $debug -o $prog $compile $LDSTATIC + $CXX $ARCHFLAGS $includes $CXXFLAGS $debug -o $prog $compile $LDSTATIC + + # stop after compilation in case of errors + err=$? + if test $err != 0; then + exit $err + fi +fi + +if test -n "$post" -a "$POSTBUILD" != ":"; then + echo $POSTBUILD $post $includedir/FL/mac.r + $POSTBUILD $post $includedir/FL/mac.r +fi + +if test "$echo_cflags" = "yes"; then + echo $includes $CFLAGS +fi + +if test "$echo_cxxflags" = "yes"; then + echo $includes $CXXFLAGS +fi + +if test "$echo_optim" = "yes"; then + echo $OPTIM +fi + +if test "$echo_ldflags" = "yes"; then + my_libs= + libdirs=$libs + + for i in $LDLIBS ; do + if test $i != -L$libdir ; then + if test -z "$my_libs" ; then + my_libs="$i" + else + my_libs="$my_libs $i" + fi + fi + done + echo $libdirs $my_libs +fi + +if test "$echo_ldstaticflags" = "yes"; then + echo $LDSTATIC +fi + +if test "$echo_libs" = "yes"; then + echo $libdir/libfltk.a + + if test x$use_forms = xyes; then + echo $libdir/libfltk_forms.a + fi + + if test x$use_gl = xyes; then + echo $libdir/libfltk_gl.a + fi + + if test x$use_images = xyes; then + echo $libdir/libfltk_images.a + + for lib in fltk_jpeg fltk_png fltk_z; do + if test -f $libdir/lib$lib.a; then + echo $libdir/lib$lib.a + fi + done + fi +fi + +# +# End of "$Id: fltk-config.in 6610 2008-12-29 17:24:51Z matt $". +# diff --git a/third_party/windows/fltk-1.1.10/fltk.list.in b/third_party/windows/fltk-1.1.10/fltk.list.in new file mode 100644 index 0000000..e0a7bcc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fltk.list.in @@ -0,0 +1,421 @@ +# +# "$Id: fltk.list.in 6059 2008-02-28 16:50:07Z mike $" +# +# EPM product list file for the Fast Light Tool Kit (FLTK). +# +# (EPM can be found at http://www.epmhome.org/) +# +# Copyright 1998-2008 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems on the following page: +# +# http://www.fltk.org/str.php +# + +%product Fast Light Tool Kit (FLTK) +%copyright 1998-2008 by Bill Spitzak and others. +%vendor FLTK Development Team +%license COPYING +%readme README +%version @FL_MAJOR_VERSION@.@FL_MINOR_VERSION@.@FL_PATCH_VERSION@ +%description The Fast Light Tool Kit ("FLTK", pronounced "fulltick") is a +%description cross-platform C++ GUI toolkit for UNIX(r)/Linux(r) (X11), +%description Microsoft(r) Windows(r), and MacOS(r) X. FLTK provides modern +%description GUI functionality without the bloat and supports 3D graphics via +%description OpenGL(r) and its built-in GLUT emulation. + +$prefix=@prefix@ +$exec_prefix=@exec_prefix@ +$bindir=@bindir@ +$datarootdir=@datarootdir@ +$datadir=@datadir@ +$includedir=@includedir@ +$libdir=@libdir@ +$mandir=@mandir@ +$docdir=${datadir}/doc/fltk + +$CAT1EXT=@CAT1EXT@ +$CAT3EXT=@CAT3EXT@ +$CAT6EXT=@CAT6EXT@ + +$DSONAME=@DSONAME@ +$FLDSONAME=@FLDSONAME@ +$FLLIBNAME=@FLLIBNAME@ +$GLDSONAME=@GLDSONAME@ +$GLLIBNAME=@GLLIBNAME@ +$FLUID=@FLUID@ +$JPEG=@JPEG@ +$PNG=@PNG@ +$ZLIB=@ZLIB@ + +%if DSONAME +%system aix +f 0555 root sys $libdir/libfltk_s.a src/libfltk_s.a nostrip() +%system hpux +f 0555 root sys $libdir/libfltk.sl.@FL_API_VERSION@ src/libfltk.sl.@FL_API_VERSION@ nostrip() +%system darwin +f 0555 root sys $libdir/libfltk.@FL_API_VERSION@.dylib src/libfltk.@FL_API_VERSION@.dylib nostrip() +%system !aix !darwin !hpux +f 0555 root sys $libdir/libfltk.so.@FL_API_VERSION@ src/libfltk.so.@FL_API_VERSION@ nostrip() +%system all + +%system aix +f 0555 root sys $libdir/libfltk_forms_s.a src/libfltk_forms_s.a nostrip() +%system hpux +f 0555 root sys $libdir/libfltk_forms.sl.@FL_API_VERSION@ src/libfltk_forms.sl.@FL_API_VERSION@ nostrip() +%system darwin +f 0555 root sys $libdir/libfltk_forms.@FL_API_VERSION@.dylib src/libfltk_forms.@FL_API_VERSION@.dylib nostrip() +%system !aix !darwin !hpux +f 0555 root sys $libdir/libfltk_forms.so.@FL_API_VERSION@ src/libfltk_forms.so.@FL_API_VERSION@ nostrip() +%system all + +%system aix +f 0555 root sys $libdir/libfltk_images_s.a src/libfltk_images_s.a nostrip() +%system hpux +f 0555 root sys $libdir/libfltk_images.sl.@FL_API_VERSION@ src/libfltk_images.sl.@FL_API_VERSION@ nostrip() +%system darwin +f 0555 root sys $libdir/libfltk_images.@FL_API_VERSION@.dylib src/libfltk_images.@FL_API_VERSION@.dylib nostrip() +%system !aix !darwin !hpux +f 0555 root sys $libdir/libfltk_images.so.@FL_API_VERSION@ src/libfltk_images.so.@FL_API_VERSION@ nostrip() +%system all +%endif + +%if GLDSONAME +%system aix +f 0555 root sys $libdir/libfltk_gl_s.a src/libfltk_gl_s.a nostrip() +%system hpux +f 0555 root sys $libdir/libfltk_gl.sl.@FL_API_VERSION@ src/libfltk_gl.sl.@FL_API_VERSION@ nostrip() +%system darwin +f 0555 root sys $libdir/libfltk_gl.@FL_API_VERSION@.dylib src/libfltk_gl.@FL_API_VERSION@.dylib nostrip() +%system !aix !darwin !hpux +f 0555 root sys $libdir/libfltk_gl.so.@FL_API_VERSION@ src/libfltk_gl.so.@FL_API_VERSION@ nostrip() +%system all +%endif + + +%subpackage devel +%description FLTK Development Environment +%description Install fltk-devel if you need to develop FLTK applications. +%description You'll need to install the fltk package if you plan to run +%description dynamically linked applications. + +%system darwin +l 0444 root sys /usr/include/gcc/darwin/3.1/g++-v3/FL $includedir/FL + +d 0555 root sys /Applications/fluid.app - +d 0555 root sys /Applications/fluid.app/Contents - +f 0444 root sys /Applications/fluid.app/Contents/Info.plist fluid/fluid.app/Contents/Info.plist +f 0444 root sys /Applications/fluid.app/Contents/PkgInfo fluid/fluid.app/Contents/PkgInfo +d 0555 root sys /Applications/fluid.app/Contents/MacOS - +l 0555 root sys /Applications/fluid.app/Contents/MacOS/fluid $bindir/fluid +d 0555 root sys /Applications/fluid.app/Contents/Resources - +f 0444 root sys /Applications/fluid.app/Contents/Resources/fluid.icns fluid/fluid.app/Contents/Resources/fluid.icns +%postinstall $bindir/fltk-config --post $bindir/fluid +%postremove /bin/rm -rf /Applications/fluid.app + +%system !darwin +f 0444 root sys /usr/share/applications/fluid.desktop fluid/fluid.desktop +f 0444 root sys /usr/share/icons/hicolor/16x16/apps/fluid.png fluid/icons/fluid-16.png +f 0444 root sys /usr/share/icons/hicolor/32x32/apps/fluid.png fluid/icons/fluid-32.png +f 0444 root sys /usr/share/icons/hicolor/48x48/apps/fluid.png fluid/icons/fluid-48.png +f 0444 root sys /usr/share/icons/hicolor/64x64/apps/fluid.png fluid/icons/fluid-64.png +f 0444 root sys /usr/share/icons/hicolor/128x128/apps/fluid.png fluid/icons/fluid-128.png +f 0444 root sys /usr/share/mimelnk/application/x-fluid.desktop fluid/x-fluid.desktop + +%system all + +# FLUID +f 0555 root sys $bindir/fluid fluid/$FLUID +f 0555 root sys $bindir/fltk-config fltk-config + +# Man pages +f 0444 root sys $mandir/cat1/fluid.$CAT1EXT documentation/fluid.$CAT1EXT +f 0444 root sys $mandir/cat1/fltk-config.$CAT1EXT documentation/fltk-config.$CAT1EXT +f 0444 root sys $mandir/cat3/fltk.$CAT3EXT documentation/fltk.$CAT3EXT +f 0444 root sys $mandir/man1/fluid.1 documentation/fluid.man +f 0444 root sys $mandir/man1/fltk-config.1 documentation/fltk-config.man +f 0444 root sys $mandir/man3/fltk.3 documentation/fltk.man + +# Library files +f 0444 root sys $libdir/libfltk.a lib/libfltk.a +f 0444 root sys $libdir/libfltk_forms.a lib/libfltk_forms.a +f 0444 root sys $libdir/libfltk_images.a lib/libfltk_images.a +%if GLLIBNAME +f 0444 root sys $libdir/libfltk_gl.a lib/libfltk_gl.a +%endif + +%if JPEG +f 0444 root sys $libdir/libfltk_jpeg.a lib/libfltk_jpeg.a +%endif + +%if PNG +f 0444 root sys $libdir/libfltk_png.a lib/libfltk_png.a +%endif + +%if ZLIB +f 0444 root sys $libdir/libfltk_z.a lib/libfltk_z.a +%endif + +%if DSONAME +%system hpux +l 0000 root sys $libdir/libfltk.sl libfltk.sl.@FL_API_VERSION@ +%system darwin +l 0000 root sys $libdir/libfltk.dylib libfltk.@FL_API_VERSION@.dylib +%system !aix !darwin !hpux +l 0000 root sys $libdir/libfltk.so libfltk.so.@FL_API_VERSION@ +%system all + +%system hpux +l 0000 root sys $libdir/libfltk_forms.sl libfltk_forms.sl.@FL_API_VERSION@ +%system darwin +l 0000 root sys $libdir/libfltk_forms.dylib libfltk_forms.@FL_API_VERSION@.dylib +%system !aix !darwin !hpux +l 0000 root sys $libdir/libfltk_forms.so libfltk_forms.so.@FL_API_VERSION@ +%system all + +%system hpux +l 0000 root sys $libdir/libfltk_images.sl libfltk_images.sl.@FL_API_VERSION@ +%system darwin +l 0000 root sys $libdir/libfltk_images.dylib libfltk_images.@FL_API_VERSION@.dylib +%system !aix !darwin !hpux +l 0000 root sys $libdir/libfltk_images.so libfltk_images.so.@FL_API_VERSION@ +%system all +%endif + +%if GLDSONAME +%system hpux +l 0000 root sys $libdir/libfltk_gl.sl libfltk_gl.sl.@FL_API_VERSION@ +%system darwin +l 0000 root sys $libdir/libfltk_gl.dylib libfltk_gl.@FL_API_VERSION@.dylib +%system !aix !darwin !hpux +l 0000 root sys $libdir/libfltk_gl.so libfltk_gl.so.@FL_API_VERSION@ +%system all +%endif + +# Header files +f 0444 root sys $includedir/FL/ FL/*.[hH] + +%if JPEG +f 0444 root sys $includedir/FL/images/jconfig.h jpeg/jconfig.h +f 0444 root sys $includedir/FL/images/jerror.h jpeg/jerror.h +f 0444 root sys $includedir/FL/images/jmorecfg.h jpeg/jmorecfg.h +f 0444 root sys $includedir/FL/images/jpeglib.h jpeg/jpeglib.h +%endif + +%if PNG +f 0444 root sys $includedir/FL/images/png.h png/png.h +f 0444 root sys $includedir/FL/images/pngconf.h png/pngconf.h +%endif + +%if ZLIB +f 0444 root sys $includedir/FL/images/zconf.h zlib/zconf.h +f 0444 root sys $includedir/FL/images/zlib.h zlib/zlib.h +f 0444 root sys $includedir/FL/images/zutil.h zlib/zutil.h +%endif + +%system !darwin +# Symlinks to handle common case problems... +l 0000 root sys $includedir/Fl FL +l 0000 root sys $includedir/FL/Enumerations.h Enumerations.H +l 0000 root sys $includedir/FL/Fl.h Fl.H +l 0000 root sys $includedir/FL/Fl_Adjuster.h Fl_Adjuster.H +l 0000 root sys $includedir/FL/Fl_Bitmap.h Fl_Bitmap.H +l 0000 root sys $includedir/FL/Fl_BMP_Image.h Fl_BMP_Image.H +l 0000 root sys $includedir/FL/Fl_Box.h Fl_Box.H +l 0000 root sys $includedir/FL/Fl_Browser.h Fl_Browser.H +l 0000 root sys $includedir/FL/Fl_Browser_.h Fl_Browser_.H +l 0000 root sys $includedir/FL/Fl_Button.h Fl_Button.H +l 0000 root sys $includedir/FL/Fl_Chart.h Fl_Chart.H +l 0000 root sys $includedir/FL/Fl_Check_Browser.h Fl_Check_Browser.H +l 0000 root sys $includedir/FL/Fl_Check_Button.h Fl_Check_Button.H +l 0000 root sys $includedir/FL/Fl_Choice.h Fl_Choice.H +l 0000 root sys $includedir/FL/Fl_Clock.h Fl_Clock.H +l 0000 root sys $includedir/FL/Fl_Color_Chooser.h Fl_Color_Chooser.H +l 0000 root sys $includedir/FL/Fl_Counter.h Fl_Counter.H +l 0000 root sys $includedir/FL/Fl_Dial.h Fl_Dial.H +l 0000 root sys $includedir/FL/Fl_Double_Window.h Fl_Double_Window.H +l 0000 root sys $includedir/FL/Fl_File_Browser.h Fl_File_Browser.H +l 0000 root sys $includedir/FL/Fl_File_Chooser.h Fl_File_Chooser.H +l 0000 root sys $includedir/FL/Fl_File_Icon.h Fl_File_Icon.H +l 0000 root sys $includedir/FL/Fl_Fill_Dial.h Fl_Fill_Dial.H +l 0000 root sys $includedir/FL/Fl_Fill_Slider.h Fl_Fill_Slider.H +l 0000 root sys $includedir/FL/Fl_Float_Input.h Fl_Float_Input.H +l 0000 root sys $includedir/FL/Fl_FormsBitmap.h Fl_FormsBitmap.H +l 0000 root sys $includedir/FL/Fl_FormsPixmap.h Fl_FormsPixmap.H +l 0000 root sys $includedir/FL/Fl_Free.h Fl_Free.H +l 0000 root sys $includedir/FL/Fl_GIF_Image.h Fl_GIF_Image.H +l 0000 root sys $includedir/FL/Fl_Gl_Window.h Fl_Gl_Window.H +l 0000 root sys $includedir/FL/Fl_Group.h Fl_Group.H +l 0000 root sys $includedir/FL/Fl_Help_Dialog.h Fl_Help_Dialog.H +l 0000 root sys $includedir/FL/Fl_Help_View.h Fl_Help_View.H +l 0000 root sys $includedir/FL/Fl_Hold_Browser.h Fl_Hold_Browser.H +l 0000 root sys $includedir/FL/Fl_Hor_Fill_Slider.h Fl_Hor_Fill_Slider.H +l 0000 root sys $includedir/FL/Fl_Hor_Nice_Slider.h Fl_Hor_Nice_Slider.H +l 0000 root sys $includedir/FL/Fl_Hor_Slider.h Fl_Hor_Slider.H +l 0000 root sys $includedir/FL/Fl_Hor_Value_Slider.h Fl_Hor_Value_Slider.H +l 0000 root sys $includedir/FL/Fl_Image.h Fl_Image.H +l 0000 root sys $includedir/FL/Fl_JPEG_Image.h Fl_JPEG_Image.H +l 0000 root sys $includedir/FL/Fl_Input.h Fl_Input.H +l 0000 root sys $includedir/FL/Fl_Input_.h Fl_Input_.H +l 0000 root sys $includedir/FL/Fl_Input_Choice.h Fl_Input_Choice.H +l 0000 root sys $includedir/FL/Fl_Int_Input.h Fl_Int_Input.H +l 0000 root sys $includedir/FL/Fl_Light_Button.h Fl_Light_Button.H +l 0000 root sys $includedir/FL/Fl_Line_Dial.h Fl_Line_Dial.H +l 0000 root sys $includedir/FL/Fl_Menu.h Fl_Menu.H +l 0000 root sys $includedir/FL/Fl_Menu_.h Fl_Menu_.H +l 0000 root sys $includedir/FL/Fl_Menu_Bar.h Fl_Menu_Bar.H +l 0000 root sys $includedir/FL/Fl_Menu_Button.h Fl_Menu_Button.H +l 0000 root sys $includedir/FL/Fl_Menu_Item.h Fl_Menu_Item.H +l 0000 root sys $includedir/FL/Fl_Menu_Window.h Fl_Menu_Window.H +l 0000 root sys $includedir/FL/Fl_Multi_Browser.h Fl_Multi_Browser.H +l 0000 root sys $includedir/FL/Fl_Multi_Label.h Fl_Multi_Label.H +l 0000 root sys $includedir/FL/Fl_Multiline_Input.h Fl_Multiline_Input.H +l 0000 root sys $includedir/FL/Fl_Multiline_Output.h Fl_Multiline_Output.H +l 0000 root sys $includedir/FL/Fl_Nice_Slider.h Fl_Nice_Slider.H +l 0000 root sys $includedir/FL/Fl_Object.h Fl_Object.H +l 0000 root sys $includedir/FL/Fl_Output.h Fl_Output.H +l 0000 root sys $includedir/FL/Fl_Overlay_Window.h Fl_Overlay_Window.H +l 0000 root sys $includedir/FL/Fl_Pack.h Fl_Pack.H +l 0000 root sys $includedir/FL/Fl_Pixmap.h Fl_Pixmap.H +l 0000 root sys $includedir/FL/Fl_PNG_Image.h Fl_PNG_Image.H +l 0000 root sys $includedir/FL/Fl_PNM_Image.h Fl_PNM_Image.H +l 0000 root sys $includedir/FL/Fl_Positioner.h Fl_Positioner.H +l 0000 root sys $includedir/FL/Fl_Progress.h Fl_Progress.H +l 0000 root sys $includedir/FL/Fl_Radio_Button.h Fl_Radio_Button.H +l 0000 root sys $includedir/FL/Fl_Radio_Light_Button.h Fl_Radio_Light_Button.H +l 0000 root sys $includedir/FL/Fl_Radio_Round_Button.h Fl_Radio_Round_Button.H +l 0000 root sys $includedir/FL/Fl_Repeat_Button.h Fl_Repeat_Button.H +l 0000 root sys $includedir/FL/Fl_Return_Button.h Fl_Return_Button.H +l 0000 root sys $includedir/FL/Fl_Roller.h Fl_Roller.H +l 0000 root sys $includedir/FL/Fl_Round_Button.h Fl_Round_Button.H +l 0000 root sys $includedir/FL/Fl_Round_Clock.h Fl_Round_Clock.H +l 0000 root sys $includedir/FL/Fl_Scroll.h Fl_Scroll.H +l 0000 root sys $includedir/FL/Fl_Scrollbar.h Fl_Scrollbar.H +l 0000 root sys $includedir/FL/Fl_Secret_Input.h Fl_Secret_Input.H +l 0000 root sys $includedir/FL/Fl_Select_Browser.h Fl_Select_Browser.H +l 0000 root sys $includedir/FL/Fl_Simple_Counter.h Fl_Simple_Counter.H +l 0000 root sys $includedir/FL/Fl_Single_Window.h Fl_Single_Window.H +l 0000 root sys $includedir/FL/Fl_Slider.h Fl_Slider.H +l 0000 root sys $includedir/FL/Fl_Spinner.h Fl_Spinner.H +l 0000 root sys $includedir/FL/Fl_Tabs.h Fl_Tabs.H +l 0000 root sys $includedir/FL/Fl_Tile.h Fl_Tile.H +l 0000 root sys $includedir/FL/Fl_Timer.h Fl_Timer.H +l 0000 root sys $includedir/FL/Fl_Toggle_Button.h Fl_Toggle_Button.H +l 0000 root sys $includedir/FL/Fl_Toggle_Light_Button.h Fl_Toggle_Light_Button.H +l 0000 root sys $includedir/FL/Fl_Toggle_Round_Button.h Fl_Toggle_Round_Button.H +l 0000 root sys $includedir/FL/Fl_Tooltip.h Fl_Tooltip.H +l 0000 root sys $includedir/FL/Fl_Valuator.h Fl_Valuator.H +l 0000 root sys $includedir/FL/Fl_Value_Input.h Fl_Value_Input.H +l 0000 root sys $includedir/FL/Fl_Value_Output.h Fl_Value_Output.H +l 0000 root sys $includedir/FL/Fl_Value_Slider.h Fl_Value_Slider.H +l 0000 root sys $includedir/FL/Fl_Widget.h Fl_Widget.H +l 0000 root sys $includedir/FL/Fl_Window.h Fl_Window.H +l 0000 root sys $includedir/FL/Fl_XBM_Image.h Fl_XBM_Image.H +l 0000 root sys $includedir/FL/Fl_XPM_Image.h Fl_XPM_Image.H +l 0000 root sys $includedir/FL/filename.h filename.H +l 0000 root sys $includedir/FL/fl_ask.h fl_ask.H +l 0000 root sys $includedir/FL/fl_draw.h fl_draw.H +l 0000 root sys $includedir/FL/fl_file_chooser.h Fl_File_Chooser.H +l 0000 root sys $includedir/FL/fl_file_chooser.H Fl_File_Chooser.H +l 0000 root sys $includedir/FL/fl_message.h fl_message.H +l 0000 root sys $includedir/FL/fl_show_colormap.h fl_show_colormap.H +l 0000 root sys $includedir/FL/fl_show_input.h fl_show_input.H +l 0000 root sys $includedir/FL/forms.h forms.H +l 0000 root sys $includedir/FL/gl_draw.h gl_draw.H +l 0000 root sys $includedir/FL/glut.h glut.H +l 0000 root sys $includedir/FL/win32.h win32.H +l 0000 root sys $includedir/FL/x.h x.H +%system all + +# Documentation +d 0555 root sys $docdir - +f 0444 root sys $docdir/ documentation/*.gif +f 0444 root sys $docdir/ documentation/*.html +f 0444 root sys $docdir/ documentation/*.jpg +f 0444 root sys $docdir/COPYING COPYING +f 0444 root sys $docdir/CHANGES CHANGES + +# Examples +d 0555 root sys $docdir/examples +f 0444 root sys $docdir/examples/config.h config.h +f 0444 root sys $docdir/examples/ test/*.cxx +f 0444 root sys $docdir/examples/ test/*.fl +f 0444 root sys $docdir/examples/ test/*.h + +%subpackage games +%description FLTK Games +%description Install fltk-games to play Block Attack!, checkers, or Sudoku on your computer. + +%system darwin +d 0555 root sys /Applications/blocks.app - +d 0555 root sys /Applications/blocks.app/Contents - +f 0444 root sys /Applications/blocks.app/Contents/Info.plist test/blocks.app/Contents/Info.plist +f 0444 root sys /Applications/blocks.app/Contents/PkgInfo test/blocks.app/Contents/PkgInfo +d 0555 root sys /Applications/blocks.app/Contents/MacOS - +f 0555 root sys /Applications/blocks.app/Contents/MacOS/blocks test/blocks +d 0555 root sys /Applications/blocks.app/Contents/Resources - +f 0444 root sys /Applications/blocks.app/Contents/Resources/blocks.icns test/blocks.app/Contents/Resources/blocks.icns +%postremove /bin/rm -rf /Applications/blocks.app + +d 0555 root sys /Applications/checkers.app - +d 0555 root sys /Applications/checkers.app/Contents - +f 0444 root sys /Applications/checkers.app/Contents/Info.plist test/checkers.app/Contents/Info.plist +f 0444 root sys /Applications/checkers.app/Contents/PkgInfo test/checkers.app/Contents/PkgInfo +d 0555 root sys /Applications/checkers.app/Contents/MacOS - +f 0555 root sys /Applications/checkers.app/Contents/MacOS/checkers test/checkers +d 0555 root sys /Applications/checkers.app/Contents/Resources - +f 0444 root sys /Applications/checkers.app/Contents/Resources/checkers.icns test/checkers.app/Contents/Resources/checkers.icns +%postremove /bin/rm -rf /Applications/checkers.app + +d 0555 root sys /Applications/sudoku.app - +d 0555 root sys /Applications/sudoku.app/Contents - +f 0444 root sys /Applications/sudoku.app/Contents/Info.plist test/sudoku.app/Contents/Info.plist +f 0444 root sys /Applications/sudoku.app/Contents/PkgInfo test/sudoku.app/Contents/PkgInfo +d 0555 root sys /Applications/sudoku.app/Contents/MacOS - +f 0555 root sys /Applications/sudoku.app/Contents/MacOS/sudoku test/sudoku +d 0555 root sys /Applications/sudoku.app/Contents/Resources - +f 0444 root sys /Applications/sudoku.app/Contents/Resources/sudoku.icns test/sudoku.app/Contents/Resources/sudoku.icns +%postremove /bin/rm -rf /Applications/sudoku.app + +%system !darwin +f 0555 root sys $bindir/blocks test/blocks +f 0444 root sys /usr/share/applications/blocks.desktop test/desktop/blocks.desktop +f 0444 root sys /usr/share/icons/hicolor/32x32/apps/blocks.png test/desktop/blocks-32.png +f 0444 root sys /usr/share/icons/hicolor/128x128/apps/blocks.png test/desktop/blocks-128.png + +f 0555 root sys $bindir/checkers test/checkers +f 0444 root sys /usr/share/applications/checkers.desktop test/desktop/checkers.desktop +f 0444 root sys /usr/share/icons/hicolor/32x32/apps/checkers.png test/desktop/checkers-32.png +f 0444 root sys /usr/share/icons/hicolor/128x128/apps/checkers.png test/desktop/checkers-128.png + +f 0555 root sys $bindir/sudoku test/sudoku +f 0444 root sys /usr/share/applications/sudoku.desktop test/desktop/sudoku.desktop +f 0444 root sys /usr/share/icons/hicolor/32x32/apps/sudoku.png test/desktop/sudoku-32.png +f 0444 root sys /usr/share/icons/hicolor/128x128/apps/sudoku.png test/desktop/sudoku-128.png + +%system all +f 0444 root sys $mandir/cat6/blocks.$CAT6EXT documentation/blocks.$CAT6EXT +f 0444 root sys $mandir/cat6/checkers.$CAT6EXT documentation/checkers.$CAT6EXT +f 0444 root sys $mandir/cat6/sudoku.$CAT6EXT documentation/sudoku.$CAT6EXT +f 0444 root sys $mandir/man6/blocks.6 documentation/blocks.man +f 0444 root sys $mandir/man6/checkers.6 documentation/checkers.man +f 0444 root sys $mandir/man6/sudoku.6 documentation/sudoku.man + +# +# End of "$Id: fltk.list.in 6059 2008-02-28 16:50:07Z mike $". +# diff --git a/third_party/windows/fltk-1.1.10/fltk.spec.in b/third_party/windows/fltk-1.1.10/fltk.spec.in new file mode 100644 index 0000000..8140fd7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fltk.spec.in @@ -0,0 +1,145 @@ +# +# "$Id: fltk.spec.in 6059 2008-02-28 16:50:07Z mike $" +# +# RPM spec file for FLTK. +# +# Copyright 1998-2008 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems on the following page: +# +# http://www.fltk.org/str.php +# + +%define version @FL_MAJOR_VERSION@.@FL_MINOR_VERSION@.@FL_PATCH_VERSION@ +%define release 1 +%define prefix /usr + +Summary: Fast Light Tool Kit (FLTK) +Name: fltk +Version: %{version} +Release: %{release} +License: LGPL +Group: System Environment/Libraries +Source: ftp://ftp.fltk.org/pub/fltk/%{version}/fltk-%{version}-source.tar.gz +URL: http://www.fltk.org/ +Packager: FLTK Developer +# use BuildRoot so as not to disturb the version already installed +BuildRoot: /var/tmp/fltk-%{PACKAGE_VERSION} + +%description +The Fast Light Tool Kit ("FLTK", pronounced "fulltick") is a +cross-platform C++ GUI toolkit for UNIX(r)/Linux(r) (X11), +Microsoft(r) Windows(r), and MacOS(r) X. FLTK provides modern +GUI functionality without the bloat and supports 3D graphics via +OpenGL(r) and its built-in GLUT emulation. + +%package devel +Summary: FLTK Development Environment +Group: Development/Libraries + +%description devel +Install fltk-devel if you need to develop FLTK applications. +You'll need to install the fltk package if you plan to run +dynamically linked applications. + +%package games +Summary: FLTK Games +Group: Games + +%description games +Install fltk-games to play Block Attack!, Checkers, or Sudoku on your computer. + +%prep +%setup + +%build +CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{prefix} --mandir=%{_mandir} --enable-largefile --enable-shared --enable-threads --enable-xft --enable-xdbe --enable-xinerama + +# If we got this far, all prerequisite libraries must be here. +make + +%install +# these lines just make sure the directory structure in the +# RPM_BUILD_ROOT exists +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT + +make -e DESTDIR=$RPM_BUILD_ROOT install install-desktop + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root) +%dir %{prefix}/lib +%{prefix}/lib/libfltk*.so.* + +%files devel +%defattr(-,root,root) + +%dir %{prefix}/bin +%{prefix}/bin/fltk-config +%{prefix}/bin/fluid + +%dir %{prefix}/include/FL +%{prefix}/include/FL/* +%{prefix}/include/Fl + +%dir %{prefix}/lib +%{prefix}/lib/libfltk*.so +%{prefix}/lib/libfltk*.a + +%dir %{_mandir} +%{_mandir}/cat1/* +%{_mandir}/cat3/* +%{_mandir}/man1/* +%{_mandir}/man3/* + +%dir %{prefix}/share/doc/fltk +%{prefix}/share/doc/fltk/* + +%dir %{prefix}/share/applications +%{prefix}/share/applications/* + +%dir %{prefix}/share/icons +%{prefix}/share/icons/hicolor/*/apps/fluid.png + +%dir %{prefix}/share/mimelnk +%{prefix}/share/mimelnk/* + +%files games +%dir %{prefix}/bin +%{prefix}/bin/blocks +%{prefix}/bin/checkers +%{prefix}/bin/sudoku + +%dir %{_mandir} +%{_mandir}/cat6/* +%{_mandir}/man6/* + +%dir %{prefix}/share/applications +%{prefix}/share/applications/* + +%dir %{prefix}/share/icons +%{prefix}/share/icons/hicolor/*/apps/blocks.png +%{prefix}/share/icons/hicolor/*/apps/checkers.png +%{prefix}/share/icons/hicolor/*/apps/sudoku.png + +# +# End of "$Id: fltk.spec.in 6059 2008-02-28 16:50:07Z mike $". +# diff --git a/third_party/windows/fltk-1.1.10/fltk.xpm b/third_party/windows/fltk-1.1.10/fltk.xpm new file mode 100644 index 0000000..3b5f9d9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fltk.xpm @@ -0,0 +1,225 @@ +/* XPM */ +static char * fltk_xpm[] = { +"229 70 152 2", +" c None", +". c #000066", +"+ c #68689A", +"@ c #9292AF", +"# c #232377", +"$ c #CCCCCC", +"% c #31317E", +"& c #7878A2", +"* c #5D5D95", +"= c #1F1F76", +"- c #31317F", +"; c #11116F", +"> c #B4B4C0", +", c #ADADBC", +"' c #4C4C8C", +") c #595993", +"! c #3A3A83", +"~ c #7373A0", +"{ c #51518E", +"] c #A1A1B6", +"^ c #49498B", +"/ c #8989AA", +"( c #020267", +"_ c #050568", +": c #444488", +"< c #71719F", +"[ c #1A1A73", +"} c #5E5E95", +"| c #9E9EB5", +"1 c #252578", +"2 c #A4A4B8", +"3 c #666699", +"4 c #2B2B7C", +"5 c #8383A7", +"6 c #10106E", +"7 c #6D6D9D", +"8 c #0B0B6B", +"9 c #CBCBCB", +"0 c #010166", +"a c #7979A2", +"b c #6E6E9D", +"c c #0A0A6B", +"d c #7676A1", +"e c #C9C9CA", +"f c #2A2A7B", +"g c #9696B1", +"h c #6A6A9B", +"i c #262679", +"j c #49498A", +"k c #C2C2C7", +"l c #47478A", +"m c #BCBCC4", +"n c #424287", +"o c #4A4A8B", +"p c #C5C5C9", +"q c #454588", +"r c #BBBBC3", +"s c #434388", +"t c #69699B", +"u c #535390", +"v c #5B5B93", +"w c #73739F", +"x c #CACACB", +"y c #8888AA", +"z c #050569", +"A c #7F7FA5", +"B c #7575A0", +"C c #8C8CAC", +"D c #8A8AAB", +"E c #13136F", +"F c #09096B", +"G c #C8C8CA", +"H c #040468", +"I c #7474A0", +"J c #8F8FAD", +"K c #12126F", +"L c #08086A", +"M c #70709E", +"N c #C7C7CA", +"O c #0D0D6C", +"P c #07076A", +"Q c #8B8BAC", +"R c #8787AA", +"S c #6F6F9D", +"T c #0F0F6E", +"U c #7575A1", +"V c #8787A9", +"W c #CBCBCC", +"X c #11116E", +"Y c #7777A2", +"Z c #8585A9", +"` c #8B8BAB", +" . c #8383A8", +".. c #030367", +"+. c #070769", +"@. c #8484A8", +"#. c #0F0F6D", +"$. c #0D0D6D", +"%. c #0C0C6C", +"&. c #8181A7", +"*. c #ABABBC", +"=. c #B5B5C0", +"-. c #1E1E75", +";. c #A3A3B7", +">. c #242478", +",. c #A8A8BA", +"'. c #141470", +"). c #A5A5B8", +"!. c #252579", +"~. c #A5A5B9", +"{. c #191973", +"]. c #B5B5C1", +"^. c #161671", +"/. c #B7B7C1", +"(. c #A3A3B8", +"_. c #212177", +":. c #B2B2BF", +"<. c #B0B0BE", +"[. c #232378", +"}. c #AEAEBD", +"|. c #B6B6C1", +"1. c #212176", +"2. c #C3C3C8", +"3. c #ABABBB", +"4. c #151570", +"5. c #414186", +"6. c #BBBBC4", +"7. c #B9B9C2", +"8. c #1D1D75", +"9. c #464689", +"0. c #BFBFC6", +"a. c #A7A7B9", +"b. c #28287A", +"c. c #010167", +"d. c #BDBDC5", +"e. c #B9B9C3", +"f. c #454589", +"g. c #BDBDC4", +"h. c #A9A9BB", +"i. c #414187", +"j. c #C0C0C6", +"k. c #27277A", +"l. c #3E3E85", +"m. c #A6A6B9", +"n. c #C3C3C7", +"o. c #151571", +"p. c #030368", +"q. c #0B0B6C", +"r. c #B1B1BF", +"s. c #404086", +"t. c #C7C7C9", +"u. c #0E0E6D", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . + @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # @ @ @ @ @ @ @ @ @ @ @ @ @ @ ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ : < @ @ @ @ @ @ @ @ @ @ @ @ [ . . . . . . . . . . . . . . . . . . . . . t @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ u . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ] $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ } | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . . . . . c w x $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ y z . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ] $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ } | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . . . . 0 B $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ C z . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ] $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ } | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . . . . h $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ D E . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ] $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ } | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . . F < G $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ y F . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ] $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ } | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . H I $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ J . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ] $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ } | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . 7 $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ y K . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ] $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ } | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . L M N $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 9 / O . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ] $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ } | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . P I $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ Q . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ] $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ } | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . M $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ R 6 . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ] $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ } | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . z S N $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 9 D T . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ] $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ } | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . F U $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ y . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ & * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * = $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ^ * * * * * * * * * * * * * * * * * * * * * * * * 2 $ $ $ $ $ $ $ $ $ $ $ $ $ 3 * * * * * * * * * * * * * * * * * * * * * * * 4 | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . ~ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ V O . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . ( 7 G $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ W C X . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . 8 Y $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ Z . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . d $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ R F . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . 7 x $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ` ; . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . 8 & 9 $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ .... . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . 0 a $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ / _ . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . b $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ y ; . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 c d e $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 5 +.. . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ f & $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ D . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ g $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ Z 6 . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 9 @.c . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ R . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ @.#.. . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ > , , , , , , , , , , , , , , , , , , , , , , , , , , , ' . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ x Z $.. . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ) . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ @.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ) . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ @.%.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ) . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 9 V #.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ) . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ &.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ) . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ @.L . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ) . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ *.$.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ) . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ =.-.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ) . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ;.>.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ) . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ,.'.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ) . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ > [ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ) . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ).!.. . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ) . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ~.{.. . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ > , , , , , , , , , , , , , , , , , , , , , , , , , , , ' . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ].^.. . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ,.!.. . . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ h $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 2 -.. . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ i j k $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ /.X . . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . l m $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ *.1 . . . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . n $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ (._.. . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . o p $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ :.; . . . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . q r $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ <.[.. . . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . s G $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 2 >.. . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . o x $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ }.K . . . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . n r $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ |.1.. . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . q 2.$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ).i . . . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . l $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 3.4.. . . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ { . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . 0 5.6.$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ 7.8.. . . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ( . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . 9.0.$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ a.b.. . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ _ . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . : $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ,.[ . . . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ _ . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . c.n d.$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ e.{.. . . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ _ . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . f.g.$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ h.b.. . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ _ . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . i.$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ a.= . . . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ _ . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . c.: j.$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ r '.. . . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ _ . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . . . : r $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ , k.. . . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ _ . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . . . . l.$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ m.[.. . . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ _ . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . . . . . q n.$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ |.o.. . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ _ . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . . . . . . n e.$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ r.i . . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ _ . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . . . . . . . s.N $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ m.i . . ", +". . @ $ $ $ $ $ $ $ $ $ $ $ $ - . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ; $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ _ . . . . . . . . . . . . . . . . . . . . 5 $ $ $ $ $ $ $ $ $ $ $ $ $ 6 . . . . . . . . . . . . . . . . . . . . . . . . | $ $ $ $ $ $ $ $ $ $ $ $ 1 . . . . . . . . . . . . . . . . . . . . . . q t.$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ r.T . ", +". . + @ @ @ @ @ @ @ @ @ @ @ @ [.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . %.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ p.. . . . . . . . . . . . . . . . . . . . } @ @ @ @ @ @ @ @ @ @ @ @ @ q.. . . . . . . . . . . . . . . . . . . . . . . . < @ @ @ @ @ @ @ @ @ @ @ @ [ . . . . . . . . . . . . . . . . . . . . . . . s.@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ u.. ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "}; diff --git a/third_party/windows/fltk-1.1.10/fluid/CMakeLists.txt b/third_party/windows/fltk-1.1.10/fluid/CMakeLists.txt new file mode 100644 index 0000000..8f19c03 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/CMakeLists.txt @@ -0,0 +1,30 @@ +SET(CPPFILES + CodeEditor.cxx + Fl_Function_Type.cxx + Fl_Group_Type.cxx + Fl_Menu_Type.cxx + Fl_Type.cxx + Fl_Widget_Type.cxx + Fl_Window_Type.cxx + Fluid_Image.cxx + about_panel.cxx + align_widget.cxx + alignment_panel.cxx + code.cxx + factory.cxx + file.cxx + fluid.cxx + function_panel.cxx + template_panel.cxx + undo.cxx + widget_panel.cxx +) + + +ADD_EXECUTABLE(fluid ${CPPFILES}) +INSTALL_TARGETS(/bin fluid) +TARGET_LINK_LIBRARIES(fluid fltk fltk_images fltk_forms ${FLTK_PLATFORM_DEPENDENT_LIBS}) +IF(OPENGL_FOUND) + TARGET_LINK_LIBRARIES(fluid fltk_gl) +ENDIF(OPENGL_FOUND) + diff --git a/third_party/windows/fltk-1.1.10/fluid/CodeEditor.cxx b/third_party/windows/fltk-1.1.10/fluid/CodeEditor.cxx new file mode 100644 index 0000000..a69f745 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/CodeEditor.cxx @@ -0,0 +1,419 @@ +// +// "$Id: CodeEditor.cxx 5498 2006-09-29 21:02:27Z mike $" +// +// Code editor widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// +// Include necessary headers... +// + +#include +#include +#include +#include +#include "CodeEditor.h" + + +Fl_Text_Display::Style_Table_Entry CodeEditor:: + styletable[] = { // Style table + { FL_FOREGROUND_COLOR, FL_COURIER, 11 }, // A - Plain + { FL_DARK_GREEN, FL_COURIER_ITALIC, 11 }, // B - Line comments + { FL_DARK_GREEN, FL_COURIER_ITALIC, 11 }, // C - Block comments + { FL_BLUE, FL_COURIER, 11 }, // D - Strings + { FL_DARK_RED, FL_COURIER, 11 }, // E - Directives + { FL_DARK_RED, FL_COURIER_BOLD, 11 }, // F - Types + { FL_BLUE, FL_COURIER_BOLD, 11 } // G - Keywords + }; +const char * const CodeEditor:: + code_keywords[] = { // Sorted list of C/C++ keywords... + "and", + "and_eq", + "asm", + "bitand", + "bitor", + "break", + "case", + "catch", + "compl", + "continue", + "default", + "delete", + "do", + "else", + "false", + "for", + "goto", + "if", + "new", + "not", + "not_eq", + "operator", + "or", + "or_eq", + "return", + "switch", + "template", + "this", + "throw", + "true", + "try", + "while", + "xor", + "xor_eq" + }; +const char * const CodeEditor:: + code_types[] = { // Sorted list of C/C++ types... + "auto", + "bool", + "char", + "class", + "const", + "const_cast", + "double", + "dynamic_cast", + "enum", + "explicit", + "extern", + "float", + "friend", + "inline", + "int", + "long", + "mutable", + "namespace", + "private", + "protected", + "public", + "register", + "short", + "signed", + "sizeof", + "static", + "static_cast", + "struct", + "template", + "typedef", + "typename", + "union", + "unsigned", + "virtual", + "void", + "volatile" + }; + + +// 'compare_keywords()' - Compare two keywords... +int CodeEditor::compare_keywords(const void *a, const void *b) { + return (strcmp(*((const char **)a), *((const char **)b))); +} + +// 'style_parse()' - Parse text and produce style data. +void CodeEditor::style_parse(const char *text, char *style, int length) { + char current; + int col; + int last; + char buf[255], + *bufptr; + const char *temp; + + // Style letters: + // + // A - Plain + // B - Line comments + // C - Block comments + // D - Strings + // E - Directives + // F - Types + // G - Keywords + + for (current = *style, col = 0, last = 0; length > 0; length --, text ++) { + if (current == 'B' || current == 'F' || current == 'G') current = 'A'; + if (current == 'A') { + // Check for directives, comments, strings, and keywords... + if (col == 0 && *text == '#') { + // Set style to directive + current = 'E'; + } else if (strncmp(text, "//", 2) == 0) { + current = 'B'; + for (; length > 0 && *text != '\n'; length --, text ++) *style++ = 'B'; + + if (length == 0) break; + } else if (strncmp(text, "/*", 2) == 0) { + current = 'C'; + } else if (strncmp(text, "\\\"", 2) == 0) { + // Quoted quote... + *style++ = current; + *style++ = current; + text ++; + length --; + col += 2; + continue; + } else if (*text == '\"') { + current = 'D'; + } else if (!last && (islower(*text) || *text == '_')) { + // Might be a keyword... + for (temp = text, bufptr = buf; + (islower(*temp) || *temp == '_') && bufptr < (buf + sizeof(buf) - 1); + *bufptr++ = *temp++); + + if (!islower(*temp) && *temp != '_') { + *bufptr = '\0'; + + bufptr = buf; + + if (bsearch(&bufptr, code_types, + sizeof(code_types) / sizeof(code_types[0]), + sizeof(code_types[0]), compare_keywords)) { + while (text < temp) { + *style++ = 'F'; + text ++; + length --; + col ++; + } + + text --; + length ++; + last = 1; + continue; + } else if (bsearch(&bufptr, code_keywords, + sizeof(code_keywords) / sizeof(code_keywords[0]), + sizeof(code_keywords[0]), compare_keywords)) { + while (text < temp) { + *style++ = 'G'; + text ++; + length --; + col ++; + } + + text --; + length ++; + last = 1; + continue; + } + } + } + } else if (current == 'C' && strncmp(text, "*/", 2) == 0) { + // Close a C comment... + *style++ = current; + *style++ = current; + text ++; + length --; + current = 'A'; + col += 2; + continue; + } else if (current == 'D') { + // Continuing in string... + if (strncmp(text, "\\\"", 2) == 0) { + // Quoted end quote... + *style++ = current; + *style++ = current; + text ++; + length --; + col += 2; + continue; + } else if (*text == '\"') { + // End quote... + *style++ = current; + col ++; + current = 'A'; + continue; + } + } + + // Copy style info... + if (current == 'A' && (*text == '{' || *text == '}')) *style++ = 'G'; + else *style++ = current; + col ++; + + last = isalnum(*text) || *text == '_' || *text == '.'; + + if (*text == '\n') { + // Reset column and possibly reset the style + col = 0; + if (current == 'B' || current == 'E') current = 'A'; + } + } +} + +// 'style_unfinished_cb()' - Update unfinished styles. +void CodeEditor::style_unfinished_cb(int, void*) { } + +// 'style_update()' - Update the style buffer... +void CodeEditor::style_update(int pos, int nInserted, int nDeleted, + int /*nRestyled*/, const char * /*deletedText*/, + void *cbArg) { + CodeEditor *editor = (CodeEditor *)cbArg; + int start, // Start of text + end; // End of text + char last, // Last style on line + *style, // Style data + *text; // Text data + + + // If this is just a selection change, just unselect the style buffer... + if (nInserted == 0 && nDeleted == 0) { + editor->mStyleBuffer->unselect(); + return; + } + + // Track changes in the text buffer... + if (nInserted > 0) { + // Insert characters into the style buffer... + style = new char[nInserted + 1]; + memset(style, 'A', nInserted); + style[nInserted] = '\0'; + + editor->mStyleBuffer->replace(pos, pos + nDeleted, style); + delete[] style; + } else { + // Just delete characters in the style buffer... + editor->mStyleBuffer->remove(pos, pos + nDeleted); + } + + // Select the area that was just updated to avoid unnecessary + // callbacks... + editor->mStyleBuffer->select(pos, pos + nInserted - nDeleted); + + // Re-parse the changed region; we do this by parsing from the + // beginning of the line of the changed region to the end of + // the line of the changed region... Then we check the last + // style character and keep updating if we have a multi-line + // comment character... + start = editor->mBuffer->line_start(pos); + end = editor->mBuffer->line_end(pos + nInserted); + text = editor->mBuffer->text_range(start, end); + style = editor->mStyleBuffer->text_range(start, end); + if (start==end) + last = 0; + else + last = style[end - start - 1]; + + style_parse(text, style, end - start); + + editor->mStyleBuffer->replace(start, end, style); + editor->redisplay_range(start, end); + + if (start==end || last != style[end - start - 1]) { + // The last character on the line changed styles, so reparse the + // remainder of the buffer... + free(text); + free(style); + + end = editor->mBuffer->length(); + text = editor->mBuffer->text_range(start, end); + style = editor->mStyleBuffer->text_range(start, end); + + style_parse(text, style, end - start); + + editor->mStyleBuffer->replace(start, end, style); + editor->redisplay_range(start, end); + } + + free(text); + free(style); +} + +int CodeEditor::auto_indent(int, CodeEditor* e) { + if (e->buffer()->selected()) { + e->insert_position(e->buffer()->primary_selection()->start()); + e->buffer()->remove_selection(); + } + + int pos = e->insert_position(); + int start = e->line_start(pos); + char *text = e->buffer()->text_range(start, pos); + char *ptr; + + for (ptr = text; isspace(*ptr); ptr ++); + *ptr = '\0'; + if (*text) { + // use only a single 'insert' call to avoid redraw issues + int n = strlen(text); + char *b = (char*)malloc(n+2); + *b = '\n'; + strcpy(b+1, text); + e->insert(b); + free(b); + } else { + e->insert("\n"); + } + e->show_insert_position(); + e->set_changed(); + if (e->when()&FL_WHEN_CHANGED) e->do_callback(); + + free(text); + + return 1; +} + +// Create a CodeEditor widget... +CodeEditor::CodeEditor(int X, int Y, int W, int H, const char *L) : + Fl_Text_Editor(X, Y, W, H, L) { + buffer(new Fl_Text_Buffer); + + char *style = new char[mBuffer->length() + 1]; + char *text = mBuffer->text(); + + memset(style, 'A', mBuffer->length()); + style[mBuffer->length()] = '\0'; + + highlight_data(new Fl_Text_Buffer(mBuffer->length()), styletable, + sizeof(styletable) / sizeof(styletable[0]), + 'A', style_unfinished_cb, this); + + style_parse(text, style, mBuffer->length()); + + mStyleBuffer->text(style); + delete[] style; + free(text); + + mBuffer->add_modify_callback(style_update, this); + add_key_binding(FL_Enter, FL_TEXT_EDITOR_ANY_STATE, + (Fl_Text_Editor::Key_Func)auto_indent); +} + +// Destroy a CodeEditor widget... +CodeEditor::~CodeEditor() { + Fl_Text_Buffer *buf = mStyleBuffer; + mStyleBuffer = 0; + delete buf; + + buf = mBuffer; + buffer(0); + delete buf; +} + + +CodeViewer::CodeViewer(int X, int Y, int W, int H, const char *L) +: CodeEditor(X, Y, W, H, L) +{ + default_key_function(kf_ignore); + remove_all_key_bindings(&key_bindings); + cursor_style(CARET_CURSOR); +} + +// +// End of "$Id: CodeEditor.cxx 5498 2006-09-29 21:02:27Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/CodeEditor.h b/third_party/windows/fltk-1.1.10/fluid/CodeEditor.h new file mode 100644 index 0000000..aa544ed --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/CodeEditor.h @@ -0,0 +1,88 @@ +// +// "$Id: CodeEditor.h 5498 2006-09-29 21:02:27Z mike $" +// +// Code editor widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef CodeEditor_h +# define CodeEditor_h + +// +// Include necessary headers... +// + +# include +# include +# include +# include +# include +# include +# include + + +class CodeEditor : public Fl_Text_Editor { + static Fl_Text_Display::Style_Table_Entry styletable[]; + static const char * const code_keywords[]; + static const char * const code_types[]; + + + // 'compare_keywords()' - Compare two keywords... + static int compare_keywords(const void *a, const void *b); + + // 'style_parse()' - Parse text and produce style data. + static void style_parse(const char *text, char *style, int length); + + // 'style_unfinished_cb()' - Update unfinished styles. + static void style_unfinished_cb(int, void*); + + // 'style_update()' - Update the style buffer... + static void style_update(int pos, int nInserted, int nDeleted, + int /*nRestyled*/, const char * /*deletedText*/, + void *cbArg); + + static int auto_indent(int, CodeEditor* e); + + public: + + CodeEditor(int X, int Y, int W, int H, const char *L=0); + ~CodeEditor(); + int top_line() { return get_absolute_top_line_number(); } +}; + +class CodeViewer : public CodeEditor { + + public: + + CodeViewer(int X, int Y, int W, int H, const char *L=0); + + protected: + + int handle(int ev) { return Fl_Text_Display::handle(ev); } +}; + +#endif // !CodeEditor_h + +// +// End of "$Id: CodeEditor.h 5498 2006-09-29 21:02:27Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/Fl_Function_Type.cxx b/third_party/windows/fltk-1.1.10/fluid/Fl_Function_Type.cxx new file mode 100644 index 0000000..138964e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/Fl_Function_Type.cxx @@ -0,0 +1,1184 @@ +// +// "$Id: Fl_Function_Type.cxx 6013 2008-01-04 22:18:40Z matt $" +// +// C function type code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include "Fl_Type.h" +#include +#include "../src/flstring.h" +#include +#include + +extern int i18n_type; +extern const char* i18n_include; +extern const char* i18n_function; +extern const char* i18n_file; +extern const char* i18n_set; +extern char i18n_program[]; + +extern void redraw_browser(); + +//////////////////////////////////////////////////////////////// +// quick check of any C code for legality, returns an error message + +static char buffer[128]; // for error messages + +// check a quoted string ending in either " or ' or >: +const char *_q_check(const char * & c, int type) { + for (;;) switch (*c++) { + case '\0': + sprintf(buffer,"missing %c",type); + return buffer; + case '\\': + if (*c) c++; + break; + default: + if (*(c-1) == type) return 0; + } +} + +// check normal code, match braces and parenthesis: +const char *_c_check(const char * & c, int type) { + const char *d; + for (;;) switch (*c++) { + case 0: + if (!type) return 0; + sprintf(buffer, "missing %c", type); + return buffer; + case '/': + // Skip comments as needed... + if (*c == '/') { + while (*c != '\n' && *c) c++; + } else if (*c == '*') { + c++; + while ((*c != '*' || c[1] != '/') && *c) c++; + if (*c == '*') c+=2; + else { + return "missing '*/'"; + } + } + break; + case '#': + // treat cpp directives as a comment: + while (*c != '\n' && *c) c++; + break; + case '{': + if (type==')') goto UNEXPECTED; + d = _c_check(c,'}'); + if (d) return d; + break; + case '(': + d = _c_check(c,')'); + if (d) return d; + break; + case '\"': + d = _q_check(c,'\"'); + if (d) return d; + break; + case '\'': + d = _q_check(c,'\''); + if (d) return d; + break; + case '}': + case ')': + UNEXPECTED: + if (type == *(c-1)) return 0; + sprintf(buffer, "unexpected %c", *(c-1)); + return buffer; + } +} + +const char *c_check(const char *c, int type) { + return _c_check(c,type); +} + +//////////////////////////////////////////////////////////////// + +int Fl_Function_Type::is_public() const {return public_;} + +Fl_Type *Fl_Function_Type::make() { + Fl_Type *p = Fl_Type::current; + while (p && !p->is_decl_block()) p = p->parent; + Fl_Function_Type *o = new Fl_Function_Type(); + o->name("make_window()"); + o->return_type = 0; + o->add(p); + o->factory = this; + o->public_ = 1; + o->cdecl_ = 0; + return o; +} + +void Fl_Function_Type::write_properties() { + Fl_Type::write_properties(); + switch (public_) { + case 0: write_string("private"); break; + case 2: write_string("protected"); break; + } + if (cdecl_) write_string("C"); + if (return_type) { + write_string("return_type"); + write_word(return_type); + } +} + +void Fl_Function_Type::read_property(const char *c) { + if (!strcmp(c,"private")) { + public_ = 0; + } else if (!strcmp(c,"protected")) { + public_ = 2; + } else if (!strcmp(c,"C")) { + cdecl_ = 1; + } else if (!strcmp(c,"return_type")) { + storestring(read_word(),return_type); + } else { + Fl_Type::read_property(c); + } +} + +#include "function_panel.h" +#include + +void Fl_Function_Type::open() { + if (!function_panel) make_function_panel(); + f_return_type_input->static_value(return_type); + f_name_input->static_value(name()); + if (is_in_class()) { + f_public_member_choice->value(public_); + f_public_member_choice->show(); + f_public_choice->hide(); + } else { + f_public_choice->value(public_>0); + f_public_choice->show(); + f_public_member_choice->hide(); + } + f_c_button->value(cdecl_); + function_panel->show(); + const char* message = 0; + for (;;) { // repeat as long as there are errors + if (message) fl_alert(message); + for (;;) { + Fl_Widget* w = Fl::readqueue(); + if (w == f_panel_cancel) goto BREAK2; + else if (w == f_panel_ok) break; + else if (!w) Fl::wait(); + } + const char*c = f_name_input->value(); + while (isspace(*c)) c++; + message = c_check(c); if (message) continue; + const char *d = c; + for (; *d != '('; d++) if (isspace(*d) || !*d) break; + if (*c && *d != '(') { + message = "must be name(arguments), try again:"; continue; + } + int mod = 0; + c = f_return_type_input->value(); + message = c_check(c); if (message) continue; + name(f_name_input->value()); + storestring(c, return_type); + if (is_in_class()) { + if (public_ != f_public_member_choice->value()) { + mod = 1; + public_ = f_public_member_choice->value(); + redraw_browser(); + } + } else { + if (public_ != f_public_choice->value()) { + mod = 1; + public_ = f_public_choice->value(); + redraw_browser(); + } + } + if (cdecl_ != f_c_button->value()) { + mod = 1; + cdecl_ = f_c_button->value(); + } + if (mod) set_modflag(1); + break; + } + BREAK2: + function_panel->hide(); +} + +Fl_Function_Type Fl_Function_type; + +extern const char* subclassname(Fl_Type*); + +void Fl_Function_Type::write_code1() { + constructor=0; + havewidgets = 0; + Fl_Type *child; + for (child = next; child && child->level > level; child = child->next) + if (child->is_widget()) { + havewidgets = 1; + break; + } + write_c("\n"); + if (ismain()) + write_c("int main(int argc, char **argv) {\n"); + else { + const char* rtype = return_type; + const char* star = ""; + // from matt: let the user type "static " at the start of type + // in order to declare a static method; + int is_static = 0; + int is_virtual = 0; + if (rtype) { + if (!strcmp(rtype,"static")) {is_static = 1; rtype = 0;} + else if (!strncmp(rtype, "static ",7)) {is_static = 1; rtype += 7;} + if (!strcmp(rtype, "virtual")) {is_virtual = 1; rtype = 0;} + else if (!strncmp(rtype, "virtual ",8)) {is_virtual = 1; rtype += 8;} + } + if (!rtype) { + if (havewidgets) { + rtype = subclassname(child); + star = "*"; + } else rtype = "void"; + } + + const char* k = class_name(0); + if (k) { + write_public(public_); + if (name()[0] == '~') + constructor = 1; + else { + size_t n = strlen(k); + if (!strncmp(name(), k, n) && name()[n] == '(') constructor = 1; + } + write_h(" "); + if (is_static) write_h("static "); + if (is_virtual) write_h("virtual "); + if (!constructor) { + write_h("%s%s ", rtype, star); + write_c("%s%s ", rtype, star); + } + + // if this is a subclass, only write_h() the part before the ':' + char s[1024], *sptr = s; + char *nptr = (char *)name(); + + while (*nptr) { + if (*nptr == ':') { + if (nptr[1] != ':') break; + // Copy extra ":" for "class::member"... + *sptr++ = *nptr++; + } + *sptr++ = *nptr++; + } + *sptr = '\0'; + + write_h("%s;\n", s); + // skip all function default param. init in body: + int skips=0,skipc=0; + int nc=0,plevel=0; + for (sptr=s,nptr=(char*)name(); *nptr; nc++,nptr++) { + if (!skips && *nptr=='(') plevel++; + else if (!skips && *nptr==')') plevel--; + if ( *nptr=='"' && !(nc && *(nptr-1)=='\\') ) + skips = skips ? 0 : 1; + else if(!skips && *nptr=='\'' && !(nc && *(nptr-1)=='\\')) + skipc = skipc ? 0 : 1; + if(!skips && !skipc && plevel==1 && *nptr =='=' && + !(nc && *(nptr-1)=='\'') ) // ignore '=' case + while(*++nptr && (skips || skipc || (*nptr!=',' && *nptr!=')' || plevel!=1) )) { + if ( *nptr=='"' && *(nptr-1)!='\\' ) + skips = skips ? 0 : 1; + else if(!skips && *nptr=='\'' && *(nptr-1)!='\\') + skipc = skipc ? 0 : 1; + if (!skips && !skipc && *nptr=='(') plevel++; + else if (!skips && *nptr==')') plevel--; + } + + if (sptr < (s + sizeof(s) - 1)) *sptr++ = *nptr; + } + *sptr = '\0'; + + write_c("%s::%s {\n", k, s); + } else { + if (public_) { + if (cdecl_) + write_h("extern \"C\" { %s%s %s; }\n", rtype, star, name()); + else + write_h("%s%s %s;\n", rtype, star, name()); + } + else write_c("static "); + + // write everything but the default parameters (if any) + char s[1024], *sptr; + char *nptr; + int skips=0,skipc=0; + int nc=0,plevel=0; + for (sptr=s,nptr=(char*)name(); *nptr; nc++,nptr++) { + if (!skips && *nptr=='(') plevel++; + else if (!skips && *nptr==')') plevel--; + if ( *nptr=='"' && !(nc && *(nptr-1)=='\\') ) + skips = skips ? 0 : 1; + else if(!skips && *nptr=='\'' && !(nc && *(nptr-1)=='\\')) + skipc = skipc ? 0 : 1; + if(!skips && !skipc && plevel==1 && *nptr =='=' && + !(nc && *(nptr-1)=='\'') ) // ignore '=' case + while(*++nptr && (skips || skipc || (*nptr!=',' && *nptr!=')' || plevel!=1) )) { + if ( *nptr=='"' && *(nptr-1)!='\\' ) + skips = skips ? 0 : 1; + else if(!skips && *nptr=='\'' && *(nptr-1)!='\\') + skipc = skipc ? 0 : 1; + if (!skips && !skipc && *nptr=='(') plevel++; + else if (!skips && *nptr==')') plevel--; + } + + if (sptr < (s + sizeof(s) - 1)) *sptr++ = *nptr; + } + *sptr = '\0'; + + write_c("%s%s %s {\n", rtype, star, s); + } + } + + if (havewidgets && !child->name()) write_c(" %s* w;\n", subclassname(child)); + indentation += 2; +} + +void Fl_Function_Type::write_code2() { + Fl_Type *child; + const char *var = "w"; + for (child = next; child && child->level > level; child = child->next) + if (child->is_window() && child->name()) var = child->name(); + + if (ismain()) { + if (havewidgets) write_c(" %s->show(argc, argv);\n", var); + write_c(" return Fl::run();\n"); + } else if (havewidgets && !constructor && !return_type) { + write_c(" return %s;\n", var); + } + write_c("}\n"); + indentation = 0; +} + +int Fl_Function_Type::has_signature(const char *rtype, const char *sig) const { + if (rtype && !return_type) return 0; + if (!name()) return 0; + if ( (rtype==0L || strcmp(return_type, rtype)==0) + && fl_filename_match(name(), sig)) { + return 1; + } + return 0; +} + +//////////////////////////////////////////////////////////////// + +Fl_Type *Fl_Code_Type::make() { + Fl_Type *p = Fl_Type::current; + while (p && !p->is_code_block()) p = p->parent; + if (!p) { + fl_message("Please select a function"); + return 0; + } + Fl_Code_Type *o = new Fl_Code_Type(); + o->name("printf(\"Hello, World!\\n\");"); + o->add(p); + o->factory = this; + return o; +} + +void Fl_Code_Type::open() { + if (!code_panel) make_code_panel(); + const char *text = name(); + code_input->buffer()->text( text ? text : "" ); + code_panel->show(); + const char* message = 0; + for (;;) { // repeat as long as there are errors + if (message) fl_alert(message); + for (;;) { + Fl_Widget* w = Fl::readqueue(); + if (w == code_panel_cancel) goto BREAK2; + else if (w == code_panel_ok) break; + else if (!w) Fl::wait(); + } + char*c = code_input->buffer()->text(); + message = c_check(c); if (message) continue; + name(c); + free(c); + break; + } + BREAK2: + code_panel->hide(); +} + +Fl_Code_Type Fl_Code_type; + +void Fl_Code_Type::write_code1() { + const char* c = name(); + if (!c) return; + write_c("%s%s\n", indent(), c); +} + +void Fl_Code_Type::write_code2() {} + +//////////////////////////////////////////////////////////////// + +Fl_Type *Fl_CodeBlock_Type::make() { + Fl_Type *p = Fl_Type::current; + while (p && !p->is_code_block()) p = p->parent; + if (!p) { + fl_message("Please select a function"); + return 0; + } + Fl_CodeBlock_Type *o = new Fl_CodeBlock_Type(); + o->name("if (test())"); + o->after = 0; + o->add(p); + o->factory = this; + return o; +} + +void Fl_CodeBlock_Type::write_properties() { + Fl_Type::write_properties(); + if (after) { + write_string("after"); + write_word(after); + } +} + +void Fl_CodeBlock_Type::read_property(const char *c) { + if (!strcmp(c,"after")) { + storestring(read_word(),after); + } else { + Fl_Type::read_property(c); + } +} + +void Fl_CodeBlock_Type::open() { + if (!codeblock_panel) make_codeblock_panel(); + code_before_input->static_value(name()); + code_after_input->static_value(after); + codeblock_panel->show(); + const char* message = 0; + for (;;) { // repeat as long as there are errors + if (message) fl_alert(message); + for (;;) { + Fl_Widget* w = Fl::readqueue(); + if (w == codeblock_panel_cancel) goto BREAK2; + else if (w == codeblock_panel_ok) break; + else if (!w) Fl::wait(); + } + const char*c = code_before_input->value(); + message = c_check(c); if (message) continue; + name(c); + c = code_after_input->value(); + message = c_check(c); if (message) continue; + storestring(c, after); + break; + } + BREAK2: + codeblock_panel->hide(); +} + +Fl_CodeBlock_Type Fl_CodeBlock_type; + +void Fl_CodeBlock_Type::write_code1() { + const char* c = name(); + write_c("%s%s {\n", indent(), c ? c : ""); + indentation += 2; +} + +void Fl_CodeBlock_Type::write_code2() { + indentation += 2; + if (after) write_c("%s} %s\n", indent(), after); + else write_c("%s}\n", indent()); +} + +//////////////////////////////////////////////////////////////// + +int Fl_Decl_Type::is_public() const +{ + Fl_Type *p = parent; + while (p && !p->is_decl_block()) p = p->parent; + if(p && p->is_public() && public_) + return public_; + else if(!p) + return public_; + return 0; +} + +Fl_Type *Fl_Decl_Type::make() { + Fl_Type *p = Fl_Type::current; + while (p && !p->is_decl_block()) p = p->parent; + Fl_Decl_Type *o = new Fl_Decl_Type(); + o->public_ = 0; + o->static_ = 1; + o->name("int x;"); + o->add(p); + o->factory = this; + return o; +} + +void Fl_Decl_Type::write_properties() { + Fl_Type::write_properties(); + switch (public_) { + case 1: write_string("public"); break; + case 2: write_string("protected"); break; + } + if (!static_) write_string("global"); +} + +void Fl_Decl_Type::read_property(const char *c) { + if (!strcmp(c,"public")) { + public_ = 1; + } else if (!strcmp(c,"protected")) { + public_ = 2; + } else if (!strcmp(c,"global")) { + static_ = 0; + } else { + Fl_Type::read_property(c); + } +} + +void Fl_Decl_Type::open() { + if (!decl_panel) make_decl_panel(); + decl_input->static_value(name()); + if (is_in_class()) { + decl_class_choice->value(public_); + decl_class_choice->show(); + decl_choice->hide(); + } else { + decl_choice->value((public_&1)|((static_&1)<<1)); + decl_choice->show(); + decl_class_choice->hide(); + } + decl_panel->show(); + const char* message = 0; + for (;;) { // repeat as long as there are errors + if (message) fl_alert(message); + for (;;) { + Fl_Widget* w = Fl::readqueue(); + if (w == decl_panel_cancel) goto BREAK2; + else if (w == decl_panel_ok) break; + else if (!w) Fl::wait(); + } + const char*c = decl_input->value(); + while (isspace(*c)) c++; + message = c_check(c&&c[0]=='#' ? c+1 : c); + if (message) continue; + name(c); + if (is_in_class()) { + if (public_!=decl_class_choice->value()) { + set_modflag(1); + public_ = decl_class_choice->value(); + } + } else { + if (public_!=(decl_choice->value()&1)) { + set_modflag(1); + public_ = (decl_choice->value()&1); + } + if (static_!=((decl_choice->value()>>1)&1)) { + set_modflag(1); + static_ = ((decl_choice->value()>>1)&1); + } + } + break; + } + BREAK2: + decl_panel->hide(); +} + +Fl_Decl_Type Fl_Decl_type; + +void Fl_Decl_Type::write_code1() { + const char* c = name(); + if (!c) return; + // handle a few keywords differently if inside a class + if (is_in_class() && ( + !strncmp(c,"class",5) && isspace(c[5]) + || !strncmp(c,"typedef",7) && isspace(c[7]) + || !strncmp(c,"FL_EXPORT",9) && isspace(c[9]) + || !strncmp(c,"struct",6) && isspace(c[6]) + ) ) { + write_public(public_); + write_h(" %s\n", c); + return; + } + // handle putting #include, extern, using or typedef into decl: + if (!isalpha(*c) && *c != '~' + || !strncmp(c,"extern",6) && isspace(c[6]) + || !strncmp(c,"class",5) && isspace(c[5]) + || !strncmp(c,"typedef",7) && isspace(c[7]) + || !strncmp(c,"using",5) && isspace(c[5]) + || !strncmp(c,"FL_EXPORT",9) && isspace(c[9]) +// || !strncmp(c,"struct",6) && isspace(c[6]) + ) { + if (public_) + write_h("%s\n", c); + else + write_c("%s\n", c); + return; + } + // find the first C++ style comment + const char* e = c+strlen(c), *csc = c; + while (cscc && e[-1]==' ') e--; + while (e>c && e[-1]==';') e--; + if (class_name(1)) { + write_public(public_); + write_h(" %.*s; %s\n", (int)(e-c), c, csc); + } else { + if (public_) { + if (static_) + write_h("extern "); + write_h("%.*s; %s\n", (int)(e-c), c, csc); + if (static_) + write_c("%.*s; %s\n", (int)(e-c), c, csc); + } else { + if (static_) + write_c("static "); + write_c("%.*s; %s\n", (int)(e-c), c, csc); + } + } +} + +void Fl_Decl_Type::write_code2() {} + +//////////////////////////////////////////////////////////////// + +int Fl_DeclBlock_Type::is_public() const {return public_;} + +Fl_Type *Fl_DeclBlock_Type::make() { + Fl_Type *p = Fl_Type::current; + while (p && !p->is_decl_block()) p = p->parent; + Fl_DeclBlock_Type *o = new Fl_DeclBlock_Type(); + o->name("#if 1"); + o->public_ = 0; + o->after = strdup("#endif"); + o->add(p); + o->factory = this; + return o; +} + +void Fl_DeclBlock_Type::write_properties() { + Fl_Type::write_properties(); + switch (public_) { + case 1: write_string("public"); break; + case 2: write_string("protected"); break; + } + write_string("after"); + write_word(after); +} + +void Fl_DeclBlock_Type::read_property(const char *c) { + if(!strcmp(c,"public")) { + public_ = 1; + } else if(!strcmp(c,"protected")) { + public_ = 2; + } else if (!strcmp(c,"after")) { + storestring(read_word(),after); + } else { + Fl_Type::read_property(c); + } +} + +void Fl_DeclBlock_Type::open() { + if (!declblock_panel) make_declblock_panel(); + decl_before_input->static_value(name()); + declblock_public_choice->value((public_>0)); + decl_after_input->static_value(after); + declblock_panel->show(); + const char* message = 0; + for (;;) { // repeat as long as there are errors + if (message) fl_alert(message); + for (;;) { + Fl_Widget* w = Fl::readqueue(); + if (w == declblock_panel_cancel) goto BREAK2; + else if (w == declblock_panel_ok) break; + else if (!w) Fl::wait(); + } + const char*c = decl_before_input->value(); + while (isspace(*c)) c++; + message = c_check(c&&c[0]=='#' ? c+1 : c); + if (message) continue; + name(c); + c = decl_after_input->value(); + while (isspace(*c)) c++; + message = c_check(c&&c[0]=='#' ? c+1 : c); + if (message) continue; + storestring(c,after); + if (public_ != declblock_public_choice->value()) { + set_modflag(1); + public_ = declblock_public_choice->value(); + redraw_browser(); + } + break; + } + BREAK2: + declblock_panel->hide(); +} + +Fl_DeclBlock_Type Fl_DeclBlock_type; + +void Fl_DeclBlock_Type::write_code1() { + const char* c = name(); + if (public_) + write_h("%s\n", c); + write_c("%s\n", c); +} + +void Fl_DeclBlock_Type::write_code2() { + const char* c = after; + if (public_) + write_h("%s\n", c); + write_c("%s\n", c); +} + +//////////////////////////////////////////////////////////////// + +Fl_Type *Fl_Comment_Type::make() { + Fl_Type *p = Fl_Type::current; + while (p && !p->is_code_block()) p = p->parent; + Fl_Comment_Type *o = new Fl_Comment_Type(); + o->in_c_ = 1; + o->in_h_ = 1; + o->style_ = 0; + o->name("my comment"); + o->add(p); + o->factory = this; + o->title_buf[0] = 0; + return o; +} + +void Fl_Comment_Type::write_properties() { + Fl_Type::write_properties(); + if (in_c_) write_string("in_source"); else write_string("not_in_source"); + if (in_h_) write_string("in_header"); else write_string("not_in_header"); +} + +void Fl_Comment_Type::read_property(const char *c) { + if (!strcmp(c,"in_source")) { + in_c_ = 1; + } else if (!strcmp(c,"not_in_source")) { + in_c_ = 0; + } else if (!strcmp(c,"in_header")) { + in_h_ = 1; + } else if (!strcmp(c,"not_in_header")) { + in_h_ = 0; + } else { + Fl_Type::read_property(c); + } +} + +#include "comments.h" + +static void load_comments_preset(Fl_Preferences &menu) { + static const char * const predefined_comment[] = { + "GNU Public License/GPL Header", "GNU Public License/GPL Footer", + "GNU Public License/LGPL Header", "GNU Public License/LGPL Footer", + "FLTK/Header", "FLTK/Footer" }; + int i; + menu.set("n", 6); + Fl_Preferences db(Fl_Preferences::USER, "fltk.org", "fluid_comments"); + for (i=0; i<6; i++) { + menu.set(Fl_Preferences::Name(i), predefined_comment[i]); + db.set(predefined_comment[i], comment_text[i]); + } +} + +void Fl_Comment_Type::open() { + if (!comment_panel) make_comment_panel(); + const char *text = name(); + { + int i=0, n=0; + Fl_Preferences menu(Fl_Preferences::USER, "fltk.org", "fluid_comments_menu"); + comment_predefined->clear(); + comment_predefined->add("_Edit/Add current comment..."); + comment_predefined->add("_Edit/Remove last selection..."); + menu.get("n", n, -1); + if (n==-1) load_comments_preset(menu); + menu.get("n", n, 0); + for (i=0;iadd(text); + free(text); + } + } + comment_input->buffer()->text( text ? text : "" ); + comment_in_source->value(in_c_); + comment_in_header->value(in_h_); + comment_panel->show(); + const char* message = 0; + char itempath[256]; itempath[0] = 0; + int last_selected_item = 0; + for (;;) { // repeat as long as there are errors + if (message) fl_alert(message); + for (;;) { + Fl_Widget* w = Fl::readqueue(); + if (w == comment_panel_cancel) goto BREAK2; + else if (w == comment_panel_ok) break; + else if (w == comment_predefined) { + if (comment_predefined->value()==1) { + // add the current comment to the database + const char *xname = fl_input( + "Please enter a name to reference the current\ncomment in your database.\n\n" + "Use forward slashes '/' to create submenus.", + "My Comment"); + if (xname) { + char *name = strdup(xname); + for (char*s=name;*s;s++) if (*s==':') *s = ';'; + int n; + Fl_Preferences db(Fl_Preferences::USER, "fltk.org", "fluid_comments"); + db.set(name, comment_input->buffer()->text()); + Fl_Preferences menu(Fl_Preferences::USER, "fltk.org", "fluid_comments_menu"); + menu.get("n", n, 0); + menu.set(Fl_Preferences::Name(n), name); + menu.set("n", ++n); + comment_predefined->add(name); + free(name); + } + } else if (comment_predefined->value()==2) { + // remove the last selected comment from the database + if (itempath[0]==0 || last_selected_item==0) { + fl_message("Please select an entry form this menu first."); + } else if (fl_choice("Are you sure that you want to delete the entry\n" + "\"%s\"\nfrom the database?", "Cancel", "Delete", + NULL, itempath)) { + Fl_Preferences db(Fl_Preferences::USER, "fltk.org", "fluid_comments"); + db.deleteEntry(itempath); + comment_predefined->remove(last_selected_item); + Fl_Preferences menu(Fl_Preferences::USER, "fltk.org", "fluid_comments_menu"); + int i, n; + for (i=4, n=0; isize(); i++) { + const Fl_Menu_Item *mi = comment_predefined->menu()+i; + if (comment_predefined->item_pathname(itempath, 255, mi)==0) { + if (itempath[0]=='/') memmove(itempath, itempath+1, 255); + if (itempath[0]) menu.set(Fl_Preferences::Name(n++), itempath); + } + } + menu.set("n", n); + } + } else { + // load the selected comment from the database + if (comment_predefined->item_pathname(itempath, 255)==0) { + if (itempath[0]=='/') memmove(itempath, itempath+1, 255); + Fl_Preferences db(Fl_Preferences::USER, "fltk.org", "fluid_comments"); + char *text; + db.get(itempath, text, "(no text found in data base)"); + comment_input->buffer()->text(text); + free(text); + last_selected_item = comment_predefined->value(); + } + } + } + else if (w == comment_load) { + // load a comment from disk + fl_file_chooser_ok_label("Use File"); + const char *fname = fl_file_chooser("Pick a comment", 0L, 0L); + fl_file_chooser_ok_label(NULL); + if (fname) { + if (comment_input->buffer()->loadfile(fname)) { + fl_alert("Error loading file\n%s", fname); + } + } + } + else if (!w) Fl::wait(); + } + char*c = comment_input->buffer()->text(); + name(c); + free(c); + int mod = 0; + if (in_c_ != comment_in_source->value()) { + in_c_ = comment_in_source->value(); + mod = 1; + } + if (in_h_ != comment_in_header->value()) { + in_h_ = comment_in_header->value(); + mod = 1; + } + if (mod) set_modflag(1); + break; + } + BREAK2: + title_buf[0] = 0; + comment_panel->hide(); +} + +const char *Fl_Comment_Type::title() { + const char* n = name(); + if (!n || !*n) return type_name(); + if (title_buf[0]==0) { + const char *s = n; + char *d = title_buf; + int i = 50; + while (--i > 0) { + char n = *s++; + if (n==0) break; + if (n=='\r') { *d++ = '\\'; *d++ = 'r'; i--; } + else if (n=='\n') { *d++ = '\\'; *d++ = 'n'; i--; } + else if (n<32) { *d++ = '^'; *d++ = 'A'+n; i--; } + else *d++ = n; + } + if (i<=0) { *d++ = '.'; *d++ = '.'; *d++ = '.'; } + *d++ = 0; + } + return title_buf; +} + +Fl_Comment_Type Fl_Comment_type; + +void Fl_Comment_Type::write_code1() { + const char* c = name(); + if (!c) return; + if (!in_c_ && !in_h_) return; + // find out if there is already a valid comment: + const char *s = c; + while (isspace(*s)) s++; + // if this seems to be a C style comment, copy the block as is + // (it's up to the user to correctly close the comment) + if (s[0]=='/' && s[1]=='*') { + if (in_h_) write_h("%s\n", c); + if (in_c_) write_c("%s\n", c); + return; + } + // copy the comment line by line, add the double slash if needed + char *txt = strdup(c); + char *b = txt, *e = txt; + for (;;) { + // find the end of the line and set it to NUL + while (*e && *e!='\n') e++; + char eol = *e; + *e = 0; + // check if there is a C++ style comment at the beginning of the line + char *s = b; + while (isspace(*s)) s++; + if (s!=e && ( s[0]!='/' || s[1]!='/') ) { + // if no comment marker was found, we add one ourselves + if (in_h_) write_h("// "); + if (in_c_) write_c("// "); + } + // now copy the rest of the line + if (in_h_) write_h("%s\n", b); + if (in_c_) write_c("%s\n", b); + if (eol==0) break; + *e++ = eol; + b = e; + } +} + +void Fl_Comment_Type::write_code2() {} + +//////////////////////////////////////////////////////////////// + +const char* Fl_Type::class_name(const int need_nest) const { + Fl_Type* p = parent; + while (p) { + if (p->is_class()) { + // see if we are nested in another class, we must fully-qualify name: + // this is lame but works... + const char* q = 0; + if(need_nest) q=p->class_name(need_nest); + if (q) { + static char s[256]; + if (q != s) strlcpy(s, q, sizeof(s)); + strlcat(s, "::", sizeof(s)); + strlcat(s, p->name(), sizeof(s)); + return s; + } + return p->name(); + } + p = p->parent; + } + return 0; +} + +/** + * If this Type resides inside a class, this function returns the class type, or null. + */ +const Fl_Class_Type *Fl_Type::is_in_class() const { + Fl_Type* p = parent; + while (p) { + if (p->is_class()) { + return (Fl_Class_Type*)p; + } + p = p->parent; + } + return 0; +} + +int Fl_Class_Type::is_public() const {return public_;} + +void Fl_Class_Type::prefix(const char*p) { + free((void*) class_prefix); + class_prefix=strdup(p ? p : "" ); +} + +Fl_Type *Fl_Class_Type::make() { + Fl_Type *p = Fl_Type::current; + while (p && !p->is_decl_block()) p = p->parent; + Fl_Class_Type *o = new Fl_Class_Type(); + o->name("UserInterface"); + o->class_prefix=0; + o->subclass_of = 0; + o->public_ = 1; + o->add(p); + o->factory = this; + return o; +} + +void Fl_Class_Type::write_properties() { + Fl_Type::write_properties(); + if (subclass_of) { + write_string(":"); + write_word(subclass_of); + } + switch (public_) { + case 0: write_string("private"); break; + case 2: write_string("protected"); break; + } +} + +void Fl_Class_Type::read_property(const char *c) { + if (!strcmp(c,"private")) { + public_ = 0; + } else if (!strcmp(c,"protected")) { + public_ = 2; + } else if (!strcmp(c,":")) { + storestring(read_word(), subclass_of); + } else { + Fl_Type::read_property(c); + } +} + +void Fl_Class_Type::open() { + if (!class_panel) make_class_panel(); + char fullname[1024]=""; + if (prefix() && strlen(prefix())) + sprintf(fullname,"%s %s",prefix(),name()); + else + strcpy(fullname, name()); + c_name_input->static_value(fullname); + c_subclass_input->static_value(subclass_of); + c_public_button->value(public_); + class_panel->show(); + const char* message = 0; + + char *na=0,*pr=0,*p=0; // name and prefix substrings + + for (;;) { // repeat as long as there are errors + if (message) fl_alert(message); + for (;;) { + Fl_Widget* w = Fl::readqueue(); + if (w == c_panel_cancel) goto BREAK2; + else if (w == c_panel_ok) break; + else if (!w) Fl::wait(); + } + const char*c = c_name_input->value(); + char *s = strdup(c); + size_t len = strlen(s); + if (!*s) goto OOPS; + p = (char*) (s+len-1); + while (p>=s && isspace(*p)) *(p--)='\0'; + if (p=s && is_id(*p)) p--; + if ( (ps) *p--='\0'; + while (p>=s && isspace(*p)) *(p--)='\0'; + while (p>=s && is_id(*p)) p--; + if (pvalue(); + message = c_check(c); + if (message) { free((void*)s);continue;} + name(na); + prefix(pr); + free((void*)s); + storestring(c, subclass_of); + if (public_ != c_public_button->value()) { + public_ = c_public_button->value(); + set_modflag(1); + } + break; + } + BREAK2: + class_panel->hide(); +} + +Fl_Class_Type Fl_Class_type; + +Fl_Class_Type *current_class; +extern Fl_Widget_Class_Type *current_widget_class; +void write_public(int state) { + if (!current_class && !current_widget_class) return; + if (current_class && current_class->write_public_state == state) return; + if (current_widget_class && current_widget_class->write_public_state == state) return; + if (current_class) current_class->write_public_state = state; + if (current_widget_class) current_widget_class->write_public_state = state; + switch (state) { + case 0: write_h("private:\n"); break; + case 1: write_h("public:\n"); break; + case 2: write_h("protected:\n"); break; + } +} + +void Fl_Class_Type::write_code1() { + parent_class = current_class; + current_class = this; + write_public_state = 0; + if (prefix() && strlen(prefix())) + write_h("\nclass %s %s ", prefix(), name()); + else + write_h("\nclass %s ", name()); + if (subclass_of) write_h(": %s ", subclass_of); + write_h("{\n"); +} + +void Fl_Class_Type::write_code2() { + write_h("};\n"); + current_class = parent_class; +} + +/** + * Return 1 if this class contains a function with the given signature. + */ +int Fl_Class_Type::has_function(const char *rtype, const char *sig) const { + Fl_Type *child; + for (child = next; child && child->level > level; child = child->next) { + if (child->level == level+1 && strcmp(child->type_name(), "Function")==0) { + const Fl_Function_Type *fn = (const Fl_Function_Type*)child; + if (fn->has_signature(rtype, sig)) + return 1; + } + } + return 0; +} + +// +// End of "$Id: Fl_Function_Type.cxx 6013 2008-01-04 22:18:40Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/Fl_Group_Type.cxx b/third_party/windows/fltk-1.1.10/fluid/Fl_Group_Type.cxx new file mode 100644 index 0000000..a44f000 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/Fl_Group_Type.cxx @@ -0,0 +1,330 @@ +// +// "$Id: Fl_Group_Type.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// Fl_Group object code for the Fast Light Tool Kit (FLTK). +// +// Object describing an Fl_Group and links to Fl_Window_Type.C and +// the Fl_Tabs widget, with special stuff to select tab items and +// insure that only one is visible. +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + + +#include +#include +#include +#include "Fl_Widget_Type.h" +#include "../src/flstring.h" + +// Override group's resize behavior to do nothing to children: +void igroup::resize(int X, int Y, int W, int H) { + Fl_Widget::resize(X,Y,W,H); + redraw(); +} + +Fl_Group_Type Fl_Group_type; // the "factory" + +Fl_Type *Fl_Group_Type::make() { + return Fl_Widget_Type::make(); +} + +void fix_group_size(Fl_Type *tt) { + if (!tt || !tt->is_group()) return; + Fl_Group_Type* t = (Fl_Group_Type*)tt; + int X = t->o->x(); + int Y = t->o->y(); + int R = X+t->o->w(); + int B = Y+t->o->h(); + for (Fl_Type *nn = t->next; nn && nn->level > t->level; nn = nn->next) { + if (!nn->is_widget() || nn->is_menu_item()) continue; + Fl_Widget_Type* n = (Fl_Widget_Type*)nn; + int x = n->o->x(); if (x < X) X = x; + int y = n->o->y(); if (y < Y) Y = y; + int r = x+n->o->w();if (r > R) R = r; + int b = y+n->o->h();if (b > B) B = b; + } + t->o->resize(X,Y,R-X,B-Y); +} + +extern int force_parent; + +void group_cb(Fl_Widget *, void *) { + // Find the current widget: + Fl_Type *qq = Fl_Type::current; + while (qq && (!qq->is_widget() || qq->is_menu_item())) qq = qq->parent; + if (!qq || qq->level < 1 || (qq->level == 1 && !strcmp(qq->type_name(), "widget_class"))) { + fl_message("Please select widgets to group"); + return; + } + Fl_Widget_Type* q = (Fl_Widget_Type*)qq; + force_parent = 1; + Fl_Group_Type *n = (Fl_Group_Type*)(Fl_Group_type.make()); + n->move_before(q); + n->o->resize(q->o->x(),q->o->y(),q->o->w(),q->o->h()); + for (Fl_Type *t = Fl_Type::first; t;) { + if (t->level != n->level || t == n || !t->selected) { + t = t->next; continue;} + Fl_Type *nxt = t->remove(); + t->add(n); + t = nxt; + } + fix_group_size(n); +} + +void ungroup_cb(Fl_Widget *, void *) { + // Find the group: + Fl_Type *q = Fl_Type::current; + while (q && (!q->is_widget() || q->is_menu_item())) q = q->parent; + if (q) q = q->parent; + if (!q || q->level < 1 || (q->level == 1 && !strcmp(q->type_name(), "widget_class"))) { + fl_message("Please select widgets in a group"); + return; + } + Fl_Type* n; + for (n = q->next; n && n->level > q->level; n = n->next) { + if (n->level == q->level+1 && !n->selected) { + fl_message("Please select all widgets in group"); + return; + } + } + for (n = q->next; n && n->level > q->level;) { + Fl_Type *nxt = n->remove(); + n->insert(q); + n = nxt; + } + delete q; +} + +//////////////////////////////////////////////////////////////// + +#include + +void Fl_Group_Type::write_code1() { + Fl_Widget_Type::write_code1(); +} + +void Fl_Group_Type::write_code2() { + const char *var = name() ? name() : "o"; + write_extra_code(); + write_c("%s%s->end();\n", indent(), var); + if (resizable()) { + write_c("%sFl_Group::current()->resizable(%s);\n", indent(), var); + } + write_block_close(); +} + +//////////////////////////////////////////////////////////////// + +const char pack_type_name[] = "Fl_Pack"; + +Fl_Menu_Item pack_type_menu[] = { + {"HORIZONTAL", 0, 0, (void*)Fl_Pack::HORIZONTAL}, + {"VERTICAL", 0, 0, (void*)Fl_Pack::VERTICAL}, + {0}}; + +Fl_Pack_Type Fl_Pack_type; // the "factory" + +//////////////////////////////////////////////////////////////// + +const char tabs_type_name[] = "Fl_Tabs"; + +// Override group's resize behavior to do nothing to children: +void itabs::resize(int X, int Y, int W, int H) { + Fl_Widget::resize(X,Y,W,H); + redraw(); +} + +Fl_Tabs_Type Fl_Tabs_type; // the "factory" + +// This is called when user clicks on a widget in the window. See +// if it is a tab title, and adjust visibility and return new selection: +// If none, return o unchanged: + +Fl_Type* Fl_Tabs_Type::click_test(int x, int y) { + Fl_Tabs *t = (Fl_Tabs*)o; + Fl_Widget *a = t->which(x,y); + if (!a) return 0; // didn't click on tab + // changing the visible tab has an impact on the generated + // source code, so mark this project as changed. + int changed = (a!=t->value()); + // okay, run the tabs ui until they let go of mouse: + t->handle(FL_PUSH); + Fl::pushed(t); + while (Fl::pushed()==t) Fl::wait(); + if (changed) set_modflag(1); + return (Fl_Type*)(t->value()->user_data()); +} + +//////////////////////////////////////////////////////////////// + +const char wizard_type_name[] = "Fl_Wizard"; + +// Override group's resize behavior to do nothing to children: +void iwizard::resize(int X, int Y, int W, int H) { + Fl_Widget::resize(X,Y,W,H); + redraw(); +} + +Fl_Wizard_Type Fl_Wizard_type; // the "factory" + +// This is called when o is created. If it is in the tab group make +// sure it is visible: + +void Fl_Group_Type::add_child(Fl_Type* cc, Fl_Type* before) { + Fl_Widget_Type* c = (Fl_Widget_Type*)cc; + Fl_Widget* b = before ? ((Fl_Widget_Type*)before)->o : 0; + ((Fl_Group*)o)->insert(*(c->o), b); + o->redraw(); +} + +void Fl_Tabs_Type::add_child(Fl_Type* c, Fl_Type* before) { + Fl_Group_Type::add_child(c, before); +} + +// This is called when o is deleted. If it is in the tab group make +// sure it is not visible: + +void Fl_Group_Type::remove_child(Fl_Type* cc) { + Fl_Widget_Type* c = (Fl_Widget_Type*)cc; + ((Fl_Group*)o)->remove(c->o); + o->redraw(); +} + +void Fl_Tabs_Type::remove_child(Fl_Type* cc) { + Fl_Widget_Type* c = (Fl_Widget_Type*)cc; + Fl_Tabs *t = (Fl_Tabs*)o; + if (t->value() == c->o) t->value(0); + Fl_Group_Type::remove_child(c); +} + +// move, don't change selected value: + +void Fl_Group_Type::move_child(Fl_Type* cc, Fl_Type* before) { + Fl_Widget_Type* c = (Fl_Widget_Type*)cc; + Fl_Widget* b = before ? ((Fl_Widget_Type*)before)->o : 0; + ((Fl_Group*)o)->remove(c->o); + ((Fl_Group*)o)->insert(*(c->o), b); + o->redraw(); +} + +//////////////////////////////////////////////////////////////// +// live mode support + +Fl_Widget *Fl_Group_Type::enter_live_mode(int) { + Fl_Group *grp = new Fl_Group(o->x(), o->y(), o->w(), o->h()); + live_widget = grp; + if (live_widget) { + copy_properties(); + Fl_Type *n; + for (n = next; n && n->level > level; n = n->next) { + if (n->level == level+1) + n->enter_live_mode(); + } + grp->end(); + } + return live_widget; +} + +Fl_Widget *Fl_Tabs_Type::enter_live_mode(int) { + Fl_Tabs *grp = new Fl_Tabs(o->x(), o->y(), o->w(), o->h()); + live_widget = grp; + if (live_widget) { + copy_properties(); + Fl_Type *n; + for (n = next; n && n->level > level; n = n->next) { + if (n->level == level+1) + n->enter_live_mode(); + } + grp->end(); + } + grp->value(((Fl_Tabs*)o)->value()); + return live_widget; +} + +void Fl_Group_Type::leave_live_mode() { +} + +/** + * copy all properties from the edit widget to the live widget + */ +void Fl_Group_Type::copy_properties() { + Fl_Widget_Type::copy_properties(); +} + +//////////////////////////////////////////////////////////////// +// some other group subclasses that fluid does not treat specially: + +#include + +const char scroll_type_name[] = "Fl_Scroll"; + +Fl_Widget *Fl_Scroll_Type::enter_live_mode(int) { + Fl_Group *grp = new Fl_Scroll(o->x(), o->y(), o->w(), o->h()); + grp->show(); + live_widget = grp; + if (live_widget) { + copy_properties(); + Fl_Type *n; + for (n = next; n && n->level > level; n = n->next) { + if (n->level == level+1) + n->enter_live_mode(); + } + grp->end(); + } + return live_widget; +} + +Fl_Menu_Item scroll_type_menu[] = { + {"BOTH", 0, 0, 0/*(void*)Fl_Scroll::BOTH*/}, + {"HORIZONTAL", 0, 0, (void*)Fl_Scroll::HORIZONTAL}, + {"VERTICAL", 0, 0, (void*)Fl_Scroll::VERTICAL}, + {"HORIZONTAL_ALWAYS", 0, 0, (void*)Fl_Scroll::HORIZONTAL_ALWAYS}, + {"VERTICAL_ALWAYS", 0, 0, (void*)Fl_Scroll::VERTICAL_ALWAYS}, + {"BOTH_ALWAYS", 0, 0, (void*)Fl_Scroll::BOTH_ALWAYS}, + {0}}; + +Fl_Scroll_Type Fl_Scroll_type; // the "factory" + +void Fl_Scroll_Type::copy_properties() { + Fl_Group_Type::copy_properties(); + Fl_Scroll *s = (Fl_Scroll*)o, *d = (Fl_Scroll*)live_widget; + d->position(s->xposition(), s->yposition()); + d->type(s->type()); // TODO: get this flag from Fl_Scroll_Type! + d->scrollbar.align(s->scrollbar.align()); + d->hscrollbar.align(s->hscrollbar.align()); +} + +//////////////////////////////////////////////////////////////// + +const char tile_type_name[] = "Fl_Tile"; + +Fl_Tile_Type Fl_Tile_type; // the "factory" + +void Fl_Tile_Type::copy_properties() { + Fl_Group_Type::copy_properties(); + // no additional properties +} + +// +// End of "$Id: Fl_Group_Type.cxx 5845 2007-05-20 00:01:06Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/Fl_Menu_Type.cxx b/third_party/windows/fltk-1.1.10/fluid/Fl_Menu_Type.cxx new file mode 100644 index 0000000..cb8f101 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/Fl_Menu_Type.cxx @@ -0,0 +1,611 @@ +// +// "$Id: Fl_Menu_Type.cxx 5808 2007-05-10 12:06:31Z matt $" +// +// Menu item code for the Fast Light Tool Kit (FLTK). +// +// Menu items are kludged by making a phony Fl_Box widget so the normal +// widget panel can be used to control them. +// +// This file also contains code to make Fl_Menu_Button, Fl_Menu_Bar, +// etc widgets. +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include "Fl_Widget_Type.h" +#include "alignment_panel.h" +#include +#include +#include +#include "../src/flstring.h" +#include +#include + +Fl_Menu_Item menu_item_type_menu[] = { + {"Normal",0,0,(void*)0}, + {"Toggle",0,0,(void*)FL_MENU_BOX}, + {"Radio",0,0,(void*)FL_MENU_RADIO}, + {0}}; + +extern int reading_file; +extern int force_parent; +extern int i18n_type; +extern const char* i18n_include; +extern const char* i18n_function; +extern const char* i18n_file; +extern const char* i18n_set; + +static char submenuflag; + +void Fl_Input_Choice_Type::build_menu() { + Fl_Input_Choice* w = (Fl_Input_Choice*)o; + // count how many Fl_Menu_Item structures needed: + int n = 0; + Fl_Type* q; + for (q = next; q && q->level > level; q = q->next) { + if (q->is_parent()) n++; // space for null at end of submenu + n++; + } + if (!n) { + if (menusize) delete[] (Fl_Menu_Item*)(w->menu()); + w->menu(0); + menusize = 0; + } else { + n++; // space for null at end of menu + if (menusizemenu()); + menusize = n+10; + w->menu(new Fl_Menu_Item[menusize]); + } + // fill them all in: + Fl_Menu_Item* m = (Fl_Menu_Item*)(w->menu()); + int lvl = level+1; + for (q = next; q && q->level > level; q = q->next) { + Fl_Menu_Item_Type* i = (Fl_Menu_Item_Type*)q; + if (i->o->image()) i->o->image()->label(m); + else { + m->label(i->o->label() ? i->o->label() : "(nolabel)"); + m->labeltype(i->o->labeltype()); + } + m->shortcut(((Fl_Button*)(i->o))->shortcut()); + m->callback(0,(void*)i); + m->flags = i->flags(); + m->labelfont(i->o->labelfont()); + m->labelsize(i->o->labelsize()); + m->labelcolor(i->o->labelcolor()); + if (q->is_parent()) {lvl++; m->flags |= FL_SUBMENU;} + m++; + int l1 = + (q->next && q->next->is_menu_item()) ? q->next->level : level; + while (lvl > l1) {m->label(0); m++; lvl--;} + lvl = l1; + } + } + o->redraw(); +} + + +Fl_Type *Fl_Menu_Item_Type::make() { + // Find the current menu item: + Fl_Type* q = Fl_Type::current; + Fl_Type* p = q; + if (p) { + if (force_parent && q->is_menu_item() || !q->is_parent()) p = p->parent; + } + force_parent = 0; + if (!p || !(p->is_menu_button() || p->is_menu_item() && p->is_parent())) { + fl_message("Please select a menu to add to"); + return 0; + } + if (!o) { + o = new Fl_Button(0,0,100,20); // create template widget + o->labelsize(Fl_Widget_Type::default_size); + } + + Fl_Menu_Item_Type* t = submenuflag ? new Fl_Submenu_Type() : new Fl_Menu_Item_Type(); + t->o = new Fl_Button(0,0,100,20); + t->factory = this; + t->add(p); + if (!reading_file) t->label(submenuflag ? "submenu" : "item"); + return t; +} + +Fl_Type *Fl_Submenu_Type::make() { + submenuflag = 1; + Fl_Type* t = Fl_Menu_Item_Type::make(); + submenuflag = 0; + return t; +} + +Fl_Menu_Item_Type Fl_Menu_Item_type; +Fl_Submenu_Type Fl_Submenu_type; + +//////////////////////////////////////////////////////////////// +// Writing the C code: + +// test functions in Fl_Widget_Type.C: +int is_name(const char *c); +const char *array_name(Fl_Widget_Type *o); +int isdeclare(const char *c); + +// Search backwards to find the parent menu button and return it's name. +// Also put in i the index into the button's menu item array belonging +// to this menu item. +const char* Fl_Menu_Item_Type::menu_name(int& i) { + i = 0; + Fl_Type* t = prev; + while (t && t->is_menu_item()) { + // be sure to count the {0} that ends a submenu: + if (t->level > t->next->level) i += (t->level - t->next->level); + // detect empty submenu: + else if (t->level == t->next->level && t->is_parent()) i++; + t = t->prev; + i++; + } + return unique_id(t, "menu", t->name(), t->label()); +} + +#include "Fluid_Image.h" + +void Fl_Menu_Item_Type::write_static() { + if (callback() && is_name(callback())) + write_declare("extern void %s(Fl_Menu_*, %s);", callback(), + user_data_type() ? user_data_type() : "void*"); + for (int n=0; n < NUM_EXTRA_CODE; n++) { + if (extra_code(n) && isdeclare(extra_code(n))) + write_declare("%s", extra_code(n)); + } + if (callback() && !is_name(callback())) { + // see if 'o' or 'v' used, to prevent unused argument warnings: + int use_o = 0; + int use_v = 0; + const char *d; + for (d = callback(); *d;) { + if (*d == 'o' && !is_id(d[1])) use_o = 1; + if (*d == 'v' && !is_id(d[1])) use_v = 1; + do d++; while (is_id(*d)); + while (*d && !is_id(*d)) d++; + } + const char* cn = callback_name(); + const char* k = class_name(1); + if (k) { + write_c("\nvoid %s::%s_i(Fl_Menu_*", k, cn); + } else { + write_c("\nstatic void %s(Fl_Menu_*", cn); + } + if (use_o) write_c(" o"); + const char* ut = user_data_type() ? user_data_type() : "void*"; + write_c(", %s", ut); + if (use_v) write_c(" v"); + write_c(") {\n %s", callback()); + if (*(d-1) != ';') { + const char *p = strrchr(callback(), '\n'); + if (p) p ++; + else p = callback(); + // Only add trailing semicolon if the last line is not a preprocessor + // statement... + if (*p != '#' && *p) write_c(";"); + } + write_c("\n}\n"); + if (k) { + write_c("void %s::%s(Fl_Menu_* o, %s v) {\n", k, cn, ut); + write_c(" ((%s*)(o->", k); + Fl_Type* t = parent; while (t->is_menu_item()) t = t->parent; + for (t = t->parent; t && t->is_widget() && !is_class(); t = t->parent) write_c("parent()->"); + write_c("user_data()))->%s_i(o,v);\n}\n", cn); + } + } + if (image) { + if (image->written != write_number) { + image->write_static(); + image->written = write_number; + } + } + if (next && next->is_menu_item()) return; + // okay, when we hit last item in the menu we have to write the + // entire array out: + const char* k = class_name(1); + if (k) { + int i; write_c("\nFl_Menu_Item %s::%s[] = {\n", k, menu_name(i)); + } else { + int i; write_c("\nFl_Menu_Item %s[] = {\n", menu_name(i)); + } + Fl_Type* t = prev; while (t && t->is_menu_item()) t = t->prev; + for (Fl_Type* q = t->next; q && q->is_menu_item(); q = q->next) { + ((Fl_Menu_Item_Type*)q)->write_item(); + int thislevel = q->level; if (q->is_parent()) thislevel++; + int nextlevel = + (q->next && q->next->is_menu_item()) ? q->next->level : t->level+1; + while (thislevel > nextlevel) {write_c(" {0,0,0,0,0,0,0,0,0},\n"); thislevel--;} + } + write_c(" {0,0,0,0,0,0,0,0,0}\n};\n"); + + if (k) { + // Write menu item variables... + t = prev; while (t && t->is_menu_item()) t = t->prev; + for (Fl_Type* q = t->next; q && q->is_menu_item(); q = q->next) { + Fl_Menu_Item_Type *m = (Fl_Menu_Item_Type*)q; + const char *c = array_name(m); + if (c) { + if (c==m->name()) { + // assign a menu item address directly to a variable + int i; + const char* n = ((Fl_Menu_Item_Type *)q)->menu_name(i); + write_c("Fl_Menu_Item* %s::%s = %s::%s + %d;\n", k, c, k, n, i); + } else { + // if the name is an array, only define the array. + // The actual assignment is in write_code1() + write_c("Fl_Menu_Item* %s::%s;\n", k, c); + } + } + } + } +} + +int Fl_Menu_Item_Type::flags() { + int i = o->type(); + if (((Fl_Button*)o)->value()) i |= FL_MENU_VALUE; + if (!o->active()) i |= FL_MENU_INACTIVE; + if (!o->visible()) i |= FL_MENU_INVISIBLE; + if (is_parent()) { + if (user_data() == NULL) i |= FL_SUBMENU; + else i |= FL_SUBMENU_POINTER; + } + if (hotspot()) i |= FL_MENU_DIVIDER; + return i; +} + +void Fl_Menu_Item_Type::write_item() { + static const char * const labeltypes[] = { + "FL_NORMAL_LABEL", + "FL_NO_LABEL", + "FL_SHADOW_LABEL", + "FL_ENGRAVED_LABEL", + "FL_EMBOSSED_LABEL", + "FL_MULTI_LABEL", + "FL_ICON_LABEL", + "FL_IMAGE_LABEL" + }; + + write_c(" {"); + if (image) write_c("0"); + else if (label()) { + switch (i18n_type) { + case 0 : /* None */ + write_cstring(label()); + break; + case 1 : /* GNU gettext */ + write_c("%s(", i18n_function); + write_cstring(label()); + write_c(")"); + break; + case 2 : /* POSIX catgets */ + write_c("catgets(%s,%s,%d,", i18n_file[0] ? i18n_file : "_catalog", + i18n_set, msgnum()); + write_cstring(label()); + write_c(")"); + break; + } + } + else write_c("\"\""); + if (((Fl_Button*)o)->shortcut()) { + int s = ((Fl_Button*)o)->shortcut(); + if (use_FL_COMMAND && (s & (FL_CTRL|FL_META))) { + write_c(", FL_COMMAND|0x%x, ", s & ~(FL_CTRL|FL_META)); + } else { + write_c(", 0x%x, ", s); + } + } else + write_c(", 0, "); + if (callback()) { + const char* k = is_name(callback()) ? 0 : class_name(1); + if (k) { + write_c(" (Fl_Callback*)%s::%s,", k, callback_name()); + } else { + write_c(" (Fl_Callback*)%s,", callback_name()); + } + } else + write_c(" 0,"); + if (user_data()) + write_c(" (void*)(%s),", user_data()); + else + write_c(" 0,"); + write_c(" %d, %s, %d, %d, %d", flags(), + labeltypes[o->labeltype()], o->labelfont(), o->labelsize(), o->labelcolor()); + write_c("},\n"); +} + +void Fl_Menu_Item_Type::write_code1() { + int i; const char* mname = menu_name(i); + if (!prev->is_menu_item()) { + // for first menu item, declare the array + if (class_name(1)) + write_h(" static Fl_Menu_Item %s[];\n", mname); + else + write_h("extern Fl_Menu_Item %s[];\n", mname); + } + + const char *c = array_name(this); + if (c) { + if (class_name(1)) { + write_public(public_); + write_h(" static Fl_Menu_Item *%s;\n", c); + } else { + if (c==name()) + write_h("#define %s (%s+%d)\n", c, mname, i); + else + write_h("extern Fl_Menu_Item *%s;\n", c); + } + } + + if (callback()) { + if (!is_name(callback()) && class_name(1)) { + const char* cn = callback_name(); + const char* ut = user_data_type() ? user_data_type() : "void*"; + write_public(0); + write_h(" void %s_i(Fl_Menu_*, %s);\n", cn, ut); + write_h(" static void %s(Fl_Menu_*, %s);\n", cn, ut); + } + } + + int init = 0; + // if the name is an array variable, assign the value here + if (name() && strchr(name(), '[')) { + write_c("%s%s = &%s[%d];\n", indent(), name(), mname, i); + } + if (image) { + if (!init) { + init = 1; + write_c("%s{ Fl_Menu_Item* o = &%s[%d];\n", indent(), mname, i); + } + image->write_code("o"); + } + for (int n=0; n < NUM_EXTRA_CODE; n++) + if (extra_code(n) && !isdeclare(extra_code(n))) { + if (!init) { + init = 1; + write_c("%s{ Fl_Menu_Item* o = &%s[%d];\n", indent(), mname, i); + } + write_c("%s %s\n", indent(), extra_code(n)); + } + if (init) write_c("%s}\n",indent()); +} + +void Fl_Menu_Item_Type::write_code2() {} + +//////////////////////////////////////////////////////////////// +// This is the base class for widgets that contain a menu (ie +// subclasses of Fl_Menu_. +// This is a parent widget and menu items can be added as +// children. An actual array of Fl_Menu_Items is kept parallel +// with the child objects and updated as they change. + +void Fl_Menu_Type::build_menu() { + Fl_Menu_* w = (Fl_Menu_*)o; + // count how many Fl_Menu_Item structures needed: + int n = 0; + Fl_Type* q; + for (q = next; q && q->level > level; q = q->next) { + if (q->is_parent()) n++; // space for null at end of submenu + n++; + } + if (!n) { + if (menusize) delete[] (Fl_Menu_Item*)(w->menu()); + w->menu(0); + menusize = 0; + } else { + n++; // space for null at end of menu + if (menusizemenu()); + menusize = n+10; + w->menu(new Fl_Menu_Item[menusize]); + } + // fill them all in: + Fl_Menu_Item* m = (Fl_Menu_Item*)(w->menu()); + int lvl = level+1; + for (q = next; q && q->level > level; q = q->next) { + Fl_Menu_Item_Type* i = (Fl_Menu_Item_Type*)q; + if (i->o->image()) i->o->image()->label(m); + else { + m->label(i->o->label() ? i->o->label() : "(nolabel)"); + m->labeltype(i->o->labeltype()); + } + m->shortcut(((Fl_Button*)(i->o))->shortcut()); + m->callback(0,(void*)i); + m->flags = i->flags(); + m->labelfont(i->o->labelfont()); + m->labelsize(i->o->labelsize()); + m->labelcolor(i->o->labelcolor()); + if (q->is_parent()) {lvl++; m->flags |= FL_SUBMENU;} + m++; + int l1 = + (q->next && q->next->is_menu_item()) ? q->next->level : level; + while (lvl > l1) {m->label(0); m++; lvl--;} + lvl = l1; + } + } + o->redraw(); +} + +Fl_Type* Fl_Menu_Type::click_test(int, int) { + if (selected) return 0; // let user move the widget + Fl_Menu_* w = (Fl_Menu_*)o; + if (!menusize) return 0; + const Fl_Menu_Item* save = w->mvalue(); + w->value((Fl_Menu_Item*)0); + Fl::pushed(w); + w->handle(FL_PUSH); + const Fl_Menu_Item* m = w->mvalue(); + if (m) { + // restore the settings of toggles & radio items: + if (m->flags & (FL_MENU_RADIO | FL_MENU_TOGGLE)) build_menu(); + return (Fl_Type*)(m->user_data()); + } + w->value(save); + return this; +} + +void Fl_Menu_Type::write_code2() { + if (next && next->is_menu_item()) + write_c("%s%s->menu(%s);\n", indent(), name() ? name() : "o", + unique_id(this, "menu", name(), label())); + Fl_Widget_Type::write_code2(); +} + +void Fl_Menu_Type::copy_properties() { + Fl_Widget_Type::copy_properties(); + Fl_Menu_ *s = (Fl_Menu_*)o, *d = (Fl_Menu_*)live_widget; + d->menu(s->menu()); + d->down_box(s->down_box()); + d->textcolor(s->textcolor()); + d->textfont(s->textfont()); + d->textsize(s->textsize()); +} + +//////////////////////////////////////////////////////////////// + +#include +Fl_Menu_Item button_type_menu[] = { + {"normal",0,0,(void*)0}, + {"popup1",0,0,(void*)Fl_Menu_Button::POPUP1}, + {"popup2",0,0,(void*)Fl_Menu_Button::POPUP2}, + {"popup3",0,0,(void*)Fl_Menu_Button::POPUP3}, + {"popup12",0,0,(void*)Fl_Menu_Button::POPUP12}, + {"popup23",0,0,(void*)Fl_Menu_Button::POPUP23}, + {"popup13",0,0,(void*)Fl_Menu_Button::POPUP13}, + {"popup123",0,0,(void*)Fl_Menu_Button::POPUP123}, + {0}}; + +Fl_Menu_Button_Type Fl_Menu_Button_type; + +//////////////////////////////////////////////////////////////// + +Fl_Menu_Item dummymenu[] = {{"CHOICE"},{0}}; + +Fl_Choice_Type Fl_Choice_type; + +Fl_Input_Choice_Type Fl_Input_Choice_type; + +void Fl_Input_Choice_Type::copy_properties() { + Fl_Widget_Type::copy_properties(); + Fl_Input_Choice *s = (Fl_Input_Choice*)o, *d = (Fl_Input_Choice*)live_widget; + d->menu(s->menu()); + d->down_box(s->down_box()); + d->textcolor(s->textcolor()); + d->textfont(s->textfont()); + d->textsize(s->textsize()); +} + +Fl_Type* Fl_Input_Choice_Type::click_test(int, int) { + if (selected) return 0; // let user move the widget + Fl_Menu_* w = ((Fl_Input_Choice*)o)->menubutton(); + if (!menusize) return 0; + const Fl_Menu_Item* save = w->mvalue(); + w->value((Fl_Menu_Item*)0); + Fl::pushed(w); + w->handle(FL_PUSH); + const Fl_Menu_Item* m = w->mvalue(); + if (m) { + // restore the settings of toggles & radio items: + if (m->flags & (FL_MENU_RADIO | FL_MENU_TOGGLE)) build_menu(); + return (Fl_Type*)(m->user_data()); + } + w->value(save); + return this; +} + +//////////////////////////////////////////////////////////////// + +Fl_Menu_Bar_Type Fl_Menu_Bar_type; + +//////////////////////////////////////////////////////////////// +// Shortcut entry item in panel: + +#include +#include "Shortcut_Button.h" +#include + +void Shortcut_Button::draw() { + if (value()) draw_box(FL_DOWN_BOX, (Fl_Color)9); + else draw_box(FL_UP_BOX, FL_WHITE); + fl_font(FL_HELVETICA,14); fl_color(FL_FOREGROUND_COLOR); + if (use_FL_COMMAND && (svalue & (FL_CTRL|FL_META))) { + char buf[1024]; + fl_snprintf(buf, 1023, "Command+%s", fl_shortcut_label(svalue&~(FL_CTRL|FL_META))); + fl_draw(buf,x()+6,y(),w(),h(),FL_ALIGN_LEFT); + } else { + fl_draw(fl_shortcut_label(svalue),x()+6,y(),w(),h(),FL_ALIGN_LEFT); + } +} + +int Shortcut_Button::handle(int e) { + when(0); type(FL_TOGGLE_BUTTON); + if (e == FL_KEYBOARD) { + if (!value()) return 0; + int v = Fl::event_text()[0]; + if (v > 32 && v < 0x7f || v > 0xa0 && v <= 0xff) { + if (isupper(v)) { + v = tolower(v); + v |= FL_SHIFT; + } + v = v | Fl::event_state()&(FL_META|FL_ALT|FL_CTRL); + } else { + v = Fl::event_state()&(FL_META|FL_ALT|FL_CTRL|FL_SHIFT) | Fl::event_key(); + if (v == FL_BackSpace && svalue) v = 0; + } + if (v != svalue) {svalue = v; set_changed(); redraw(); do_callback(); } + return 1; + } else if (e == FL_UNFOCUS) { + int c = changed(); value(0); if (c) set_changed(); + return 1; + } else if (e == FL_FOCUS) { + return value(); + } else { + int r = Fl_Button::handle(e); + if (e == FL_RELEASE && value() && Fl::focus() != this) take_focus(); + return r; + } +} + +void shortcut_in_cb(Shortcut_Button* i, void* v) { + if (v == LOAD) { + if (!current_widget->is_button()) {i->hide(); return;} + i->show(); + i->svalue = ((Fl_Button*)(current_widget->o))->shortcut(); + i->redraw(); + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_button()) { + Fl_Button* b = (Fl_Button*)(((Fl_Widget_Type*)o)->o); + if (b->shortcut()!=i->svalue) mod = 1; + b->shortcut(i->svalue); + if (o->is_menu_item()) ((Fl_Widget_Type*)o)->redraw(); + } + if (mod) set_modflag(1); + } +} + +// +// End of "$Id: Fl_Menu_Type.cxx 5808 2007-05-10 12:06:31Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/Fl_Type.cxx b/third_party/windows/fltk-1.1.10/fluid/Fl_Type.cxx new file mode 100644 index 0000000..c746351 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/Fl_Type.cxx @@ -0,0 +1,908 @@ +// +// "$Id: Fl_Type.cxx 6012 2008-01-04 21:45:49Z matt $" +// +// Widget type code for the Fast Light Tool Kit (FLTK). +// +// Each object described by Fluid is one of these objects. They +// are all stored in a double-linked list. +// +// They "type" of the object is covered by the virtual functions. +// There will probably be a lot of these virtual functions. +// +// The type browser is also a list of these objects, but they +// are "factory" instances, not "real" ones. These objects exist +// only so the "make" method can be called on them. They are +// not in the linked list and are not written to files or +// copied or otherwise examined. +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include "../src/flstring.h" +#include + +#include "Fl_Type.h" +#include "undo.h" + +#include +#include "pixmaps/lock.xpm" +#include "pixmaps/protected.xpm" +//#include "pixmaps/unlock.xpm" + +static Fl_Pixmap lock_pixmap(lock_xpm); +static Fl_Pixmap protected_pixmap(protected_xpm); +//static Fl_Pixmap unlock_pixmap(unlock_xpm); + +#include "pixmaps/flWindow.xpm" +#include "pixmaps/flButton.xpm" +#include "pixmaps/flCheckButton.xpm" +#include "pixmaps/flRoundButton.xpm" +#include "pixmaps/flBox.xpm" +#include "pixmaps/flGroup.xpm" +#include "pixmaps/flFunction.xpm" +#include "pixmaps/flCode.xpm" +#include "pixmaps/flCodeBlock.xpm" +#include "pixmaps/flComment.xpm" +#include "pixmaps/flDeclaration.xpm" +#include "pixmaps/flDeclarationBlock.xpm" +#include "pixmaps/flClass.xpm" +#include "pixmaps/flTabs.xpm" +#include "pixmaps/flInput.xpm" +#include "pixmaps/flChoice.xpm" +#include "pixmaps/flMenuitem.xpm" +#include "pixmaps/flMenubar.xpm" +#include "pixmaps/flSubmenu.xpm" +#include "pixmaps/flScroll.xpm" +#include "pixmaps/flTile.xpm" +#include "pixmaps/flWizard.xpm" +#include "pixmaps/flPack.xpm" +#include "pixmaps/flReturnButton.xpm" +#include "pixmaps/flLightButton.xpm" +#include "pixmaps/flRepeatButton.xpm" +#include "pixmaps/flMenuButton.xpm" +#include "pixmaps/flOutput.xpm" +#include "pixmaps/flTextDisplay.xpm" +#include "pixmaps/flTextEdit.xpm" +#include "pixmaps/flFileInput.xpm" +#include "pixmaps/flBrowser.xpm" +#include "pixmaps/flCheckBrowser.xpm" +#include "pixmaps/flFileBrowser.xpm" +#include "pixmaps/flClock.xpm" +#include "pixmaps/flHelp.xpm" +#include "pixmaps/flProgress.xpm" +#include "pixmaps/flSlider.xpm" +#include "pixmaps/flScrollBar.xpm" +#include "pixmaps/flValueSlider.xpm" +#include "pixmaps/flAdjuster.xpm" +#include "pixmaps/flCounter.xpm" +#include "pixmaps/flDial.xpm" +#include "pixmaps/flRoller.xpm" +#include "pixmaps/flValueInput.xpm" +#include "pixmaps/flValueOutput.xpm" +#include "pixmaps/flSpinner.xpm" +#include "pixmaps/flWidgetClass.xpm" + +static Fl_Pixmap window_pixmap(flWindow_xpm); +static Fl_Pixmap button_pixmap(flButton_xpm); +static Fl_Pixmap checkbutton_pixmap(flCheckButton_xpm); +static Fl_Pixmap roundbutton_pixmap(flRoundButton_xpm); +static Fl_Pixmap box_pixmap(flBox_xpm); +static Fl_Pixmap group_pixmap(flGroup_xpm); +static Fl_Pixmap function_pixmap(flFunction_xpm); +static Fl_Pixmap code_pixmap(flCode_xpm); +static Fl_Pixmap codeblock_pixmap(flCodeBlock_xpm); +static Fl_Pixmap comment_pixmap(flComment_xpm); +static Fl_Pixmap declaration_pixmap(flDeclaration_xpm); +static Fl_Pixmap declarationblock_pixmap(flDeclarationBlock_xpm); +static Fl_Pixmap class_pixmap(flClass_xpm); +static Fl_Pixmap tabs_pixmap(flTabs_xpm); +static Fl_Pixmap input_pixmap(flInput_xpm); +static Fl_Pixmap choice_pixmap(flChoice_xpm); +static Fl_Pixmap menuitem_pixmap(flMenuitem_xpm); +static Fl_Pixmap menubar_pixmap(flMenubar_xpm); +static Fl_Pixmap submenu_pixmap(flSubmenu_xpm); +static Fl_Pixmap scroll_pixmap(flScroll_xpm); +static Fl_Pixmap tile_pixmap(flTile_xpm); +static Fl_Pixmap wizard_pixmap(flWizard_xpm); +static Fl_Pixmap pack_pixmap(flPack_xpm); +static Fl_Pixmap returnbutton_pixmap(flReturnButton_xpm); +static Fl_Pixmap lightbutton_pixmap(flLightButton_xpm); +static Fl_Pixmap repeatbutton_pixmap(flRepeatButton_xpm); +static Fl_Pixmap menubutton_pixmap(flMenuButton_xpm); +static Fl_Pixmap output_pixmap(flOutput_xpm); +static Fl_Pixmap textdisplay_pixmap(flTextDisplay_xpm); +static Fl_Pixmap textedit_pixmap(flTextEdit_xpm); +static Fl_Pixmap fileinput_pixmap(flFileInput_xpm); +static Fl_Pixmap browser_pixmap(flBrowser_xpm); +static Fl_Pixmap checkbrowser_pixmap(flCheckBrowser_xpm); +static Fl_Pixmap filebrowser_pixmap(flFileBrowser_xpm); +static Fl_Pixmap clock_pixmap(flClock_xpm); +static Fl_Pixmap help_pixmap(flHelp_xpm); +static Fl_Pixmap progress_pixmap(flProgress_xpm); +static Fl_Pixmap slider_pixmap(flSlider_xpm); +static Fl_Pixmap scrollbar_pixmap(flScrollBar_xpm); +static Fl_Pixmap valueslider_pixmap(flValueSlider_xpm); +static Fl_Pixmap adjuster_pixmap(flAdjuster_xpm); +static Fl_Pixmap counter_pixmap(flCounter_xpm); +static Fl_Pixmap dial_pixmap(flDial_xpm); +static Fl_Pixmap roller_pixmap(flRoller_xpm); +static Fl_Pixmap valueinput_pixmap(flValueInput_xpm); +static Fl_Pixmap valueoutput_pixmap(flValueOutput_xpm); +static Fl_Pixmap spinner_pixmap(flSpinner_xpm); +static Fl_Pixmap widgetclass_pixmap(flWidgetClass_xpm); + +Fl_Pixmap *pixmap[] = { 0, &window_pixmap, &button_pixmap, &checkbutton_pixmap, &roundbutton_pixmap, /* 0..4 */ + &box_pixmap, &group_pixmap, &function_pixmap, &code_pixmap, &codeblock_pixmap, &declaration_pixmap, /* 5..10 */ + &declarationblock_pixmap, &class_pixmap, &tabs_pixmap, &input_pixmap, &choice_pixmap, /* 11..15 */ + &menuitem_pixmap, &menubar_pixmap, &submenu_pixmap, &scroll_pixmap, &tile_pixmap, &wizard_pixmap, /* 16..21 */ + &pack_pixmap, &returnbutton_pixmap, &lightbutton_pixmap, &repeatbutton_pixmap, &menubutton_pixmap, /* 22..26 */ + &output_pixmap, &textdisplay_pixmap, &textedit_pixmap, &fileinput_pixmap, &browser_pixmap, /* 27..32 */ + &checkbrowser_pixmap, &filebrowser_pixmap, &clock_pixmap, &help_pixmap, &progress_pixmap, /* 33..36 */ + &slider_pixmap, &scrollbar_pixmap, &valueslider_pixmap, &adjuster_pixmap, &counter_pixmap, /* 37..41 */ + &dial_pixmap, &roller_pixmap, &valueinput_pixmap, &valueoutput_pixmap, &comment_pixmap, /* 42..46 */ + &spinner_pixmap, &widgetclass_pixmap /* 47..48 */ }; + +//////////////////////////////////////////////////////////////// + +class Widget_Browser : public Fl_Browser_ { + friend class Fl_Type; + + // required routines for Fl_Browser_ subclass: + void *item_first() const ; + void *item_next(void *) const ; + void *item_prev(void *) const ; + int item_selected(void *) const ; + void item_select(void *,int); + int item_width(void *) const ; + int item_height(void *) const ; + void item_draw(void *,int,int,int,int) const ; + int incr_height() const ; + +public: + + int handle(int); + void callback(); + Widget_Browser(int,int,int,int,const char * =0); +}; + +static Widget_Browser *widget_browser; +Fl_Widget *make_widget_browser(int x,int y,int w,int h) { + return (widget_browser = new Widget_Browser(x,y,w,h)); +} + +void select(Fl_Type *o, int v) { + widget_browser->select(o,v,1); + // Fl_Type::current = o; +} + +void select_only(Fl_Type *o) { + widget_browser->select_only(o,1); +} + +void deselect() { + widget_browser->deselect(); + //Fl_Type::current = 0; // this breaks the paste & merge functions +} + +Fl_Type *Fl_Type::first; +Fl_Type *Fl_Type::last; + +static void Widget_Browser_callback(Fl_Widget *o,void *) { + ((Widget_Browser *)o)->callback(); +} + +Widget_Browser::Widget_Browser(int X,int Y,int W,int H,const char*l) +: Fl_Browser_(X,Y,W,H,l) { + type(FL_MULTI_BROWSER); + Fl_Widget::callback(Widget_Browser_callback); + when(FL_WHEN_RELEASE); +} + +void *Widget_Browser::item_first() const {return Fl_Type::first;} + +void *Widget_Browser::item_next(void *l) const {return ((Fl_Type*)l)->next;} + +void *Widget_Browser::item_prev(void *l) const {return ((Fl_Type*)l)->prev;} + +int Widget_Browser::item_selected(void *l) const {return ((Fl_Type*)l)->new_selected;} + +void Widget_Browser::item_select(void *l,int v) {((Fl_Type*)l)->new_selected = v;} + +int Widget_Browser::item_height(void *l) const { + return ((Fl_Type *)l)->visible ? textsize()+2 : 0; +} + +int Widget_Browser::incr_height() const {return textsize()+2;} + +static Fl_Type* pushedtitle; + +// Generate a descriptive text for this item, to put in browser & window titles +const char* Fl_Type::title() { + const char* c = name(); if (c) return c; + return type_name(); +} + +extern const char* subclassname(Fl_Type*); + +void Widget_Browser::item_draw(void *v, int X, int Y, int, int) const { + Fl_Type *l = (Fl_Type *)v; + X += 3 + 18 + l->level * 12; + if (l->new_selected) fl_color(fl_contrast(FL_FOREGROUND_COLOR,FL_SELECTION_COLOR)); + else fl_color(FL_FOREGROUND_COLOR); + Fl_Pixmap *pm = pixmap[l->pixmapID()]; + if (pm) pm->draw(X-18, Y); + switch (l->is_public()) { + case 0: lock_pixmap.draw(X - 17, Y); break; + case 2: protected_pixmap.draw(X - 17, Y); break; + } + if (l->is_parent()) { + if (!l->next || l->next->level <= l->level) { + if (l->open_!=(l==pushedtitle)) { + fl_loop(X,Y+7,X+5,Y+12,X+10,Y+7); + } else { + fl_loop(X+2,Y+2,X+7,Y+7,X+2,Y+12); + } + } else { + if (l->open_!=(l==pushedtitle)) { + fl_polygon(X,Y+7,X+5,Y+12,X+10,Y+7); + } else { + fl_polygon(X+2,Y+2,X+7,Y+7,X+2,Y+12); + } + } + X += 10; + } + if (l->is_widget() || l->is_class()) { + const char* c = subclassname(l); + if (!strncmp(c,"Fl_",3)) c += 3; + fl_font(textfont(), textsize()); + fl_draw(c, X, Y+13); + X += int(fl_width(c)+fl_width('n')); + c = l->name(); + if (c) { + fl_font(textfont()|FL_BOLD, textsize()); + fl_draw(c, X, Y+13); + } else if ((c=l->label())) { + char buf[50]; char* p = buf; + *p++ = '"'; + for (int i = 20; i--;) { + if (! (*c & -32)) break; + *p++ = *c++; + } + if (*c) {strcpy(p,"..."); p+=3;} + *p++ = '"'; + *p = 0; + fl_draw(buf, X, Y+13); + } + } else { + const char* c = l->title(); + char buf[60]; char* p = buf; + for (int i = 55; i--;) { + if (! (*c & -32)) break; + *p++ = *c++; + } + if (*c) {strcpy(p,"..."); p+=3;} + *p = 0; + fl_font(textfont() | (l->is_code_block() && (l->level==0 || l->parent->is_class())?0:FL_BOLD), textsize()); + fl_draw(buf, X, Y+13); + } +} + +int Widget_Browser::item_width(void *v) const { + Fl_Type *l = (Fl_Type *)v; + + if (!l->visible) return 0; + + int W = 3 + 16 + 18 + l->level*10; + if (l->is_parent()) W += 10; + + if (l->is_widget() || l->is_class()) { + const char* c = l->type_name(); + if (!strncmp(c,"Fl_",3)) c += 3; + fl_font(textfont(), textsize()); + W += int(fl_width(c) + fl_width('n')); + c = l->name(); + if (c) { + fl_font(textfont()|FL_BOLD, textsize()); + W += int(fl_width(c)); + } else if ((c=l->label())) { + char buf[50]; char* p = buf; + *p++ = '"'; + for (int i = 20; i--;) { + if (! (*c & -32)) break; + *p++ = *c++; + } + if (*c) {strcpy(p,"..."); p+=3;} + *p++ = '"'; + *p = 0; + W += int(fl_width(buf)); + } + } else { + const char* c = l->title(); + char buf[60]; char* p = buf; + for (int i = 55; i--;) { + if (! (*c & -32)) break; + *p++ = *c++; + } + if (*c) {strcpy(p,"..."); p+=3;} + *p = 0; + fl_font(textfont() | (l->is_code_block() && (l->level==0 || l->parent->is_class())?0:FL_BOLD), textsize()); + W += int(fl_width(buf)); + } + + return W; +} + +void redraw_browser() { + widget_browser->redraw(); +} + +void Widget_Browser::callback() { + selection_changed((Fl_Type*)selection()); +} + +int Widget_Browser::handle(int e) { + static Fl_Type *title; + Fl_Type *l; + int X,Y,W,H; bbox(X,Y,W,H); + switch (e) { + case FL_PUSH: + if (!Fl::event_inside(X,Y,W,H)) break; + l = (Fl_Type*)find_item(Fl::event_y()); + if (l) { + X += 12*l->level + 18 - hposition(); + if (l->is_parent() && Fl::event_x()>X && Fl::event_x()level + 18 - hposition(); + if (l->is_parent() && Fl::event_x()>X && Fl::event_x()new_selected && (Fl::event_clicks() || Fl::event_state(FL_CTRL))) + l->open(); + break; + } + l = pushedtitle; + title = pushedtitle = 0; + if (l) { + if (l->open_) { + l->open_ = 0; + for (Fl_Type*k = l->next; k&&k->level>l->level; k = k->next) + k->visible = 0; + } else { + l->open_ = 1; + for (Fl_Type*k=l->next; k&&k->level>l->level;) { + k->visible = 1; + if (k->is_parent() && !k->open_) { + Fl_Type *j; + for (j = k->next; j && j->level>k->level; j = j->next); + k = j; + } else + k = k->next; + } + } + redraw(); + } + return 1; + } + return Fl_Browser_::handle(e); +} + +Fl_Type::Fl_Type() { + factory = 0; + parent = 0; + next = prev = 0; + selected = new_selected = 0; + visible = 0; + name_ = 0; + label_ = 0; + user_data_ = 0; + user_data_type_ = 0; + callback_ = 0; + rtti = 0; + level = 0; + code_line = header_line = -1; + code_line_end = header_line_end = -1; +} + +static void fixvisible(Fl_Type *p) { + Fl_Type *t = p; + for (;;) { + if (t->parent) t->visible = t->parent->visible && t->parent->open_; + else t->visible = 1; + t = t->next; + if (!t || t->level <= p->level) break; + } +} + +// turn a click at x,y on this into the actual picked object: +Fl_Type* Fl_Type::click_test(int,int) {return 0;} +void Fl_Type::add_child(Fl_Type*, Fl_Type*) {} +void Fl_Type::move_child(Fl_Type*, Fl_Type*) {} +void Fl_Type::remove_child(Fl_Type*) {} + +// add a list of widgets as a new child of p: +void Fl_Type::add(Fl_Type *p) { + if (p && parent == p) return; + undo_checkpoint(); + parent = p; + Fl_Type *end = this; + while (end->next) end = end->next; + Fl_Type *q; + int newlevel; + if (p) { + for (q = p->next; q && q->level > p->level; q = q->next); + newlevel = p->level+1; + } else { + q = 0; + newlevel = 0; + } + for (Fl_Type *t = this->next; t; t = t->next) t->level += (newlevel-level); + level = newlevel; + if (q) { + prev = q->prev; + prev->next = this; + q->prev = end; + end->next = q; + } else if (first) { + prev = last; + prev->next = this; + end->next = 0; + last = end; + } else { + first = this; + last = end; + prev = end->next = 0; + } + if (p) p->add_child(this,0); + open_ = 1; + fixvisible(this); + set_modflag(1); + widget_browser->redraw(); +} + +// add to a parent before another widget: +void Fl_Type::insert(Fl_Type *g) { + Fl_Type *end = this; + while (end->next) end = end->next; + parent = g->parent; + int newlevel = g->level; + visible = g->visible; + for (Fl_Type *t = this->next; t; t = t->next) t->level += newlevel-level; + level = newlevel; + prev = g->prev; + if (prev) prev->next = this; else first = this; + end->next = g; + g->prev = end; + fixvisible(this); + if (parent) parent->add_child(this, g); + widget_browser->redraw(); +} + +// Return message number for I18N... +int +Fl_Type::msgnum() { + int count; + Fl_Type *p; + + for (count = 0, p = this; p;) { + if (p->label()) count ++; + if (p != this && p->is_widget() && ((Fl_Widget_Type *)p)->tooltip()) count ++; + + if (p->prev) p = p->prev; + else p = p->parent; + } + + return count; +} + + +// delete from parent: +Fl_Type *Fl_Type::remove() { + Fl_Type *end = this; + for (;;) { + if (!end->next || end->next->level <= level) break; + end = end->next; + } + if (prev) prev->next = end->next; + else first = end->next; + if (end->next) end->next->prev = prev; + else last = prev; + Fl_Type *r = end->next; + prev = end->next = 0; + if (parent) parent->remove_child(this); + parent = 0; + widget_browser->redraw(); + selection_changed(0); + return r; +} + +// update a string member: +int storestring(const char *n, const char * & p, int nostrip) { + if (n == p) return 0; + undo_checkpoint(); + int length = 0; + if (n) { // see if blank, strip leading & trailing blanks + if (!nostrip) while (isspace(*n)) n++; + const char *e = n + strlen(n); + if (!nostrip) while (e > n && isspace(*(e-1))) e--; + length = e-n; + if (!length) n = 0; + } + if (n == p) return 0; + if (n && p && !strncmp(n,p,length) && !p[length]) return 0; + if (p) free((void *)p); + if (!n || !*n) { + p = 0; + } else { + char *q = (char *)malloc(length+1); + strlcpy(q,n,length+1); + p = q; + } + set_modflag(1); + return 1; +} + +void Fl_Type::name(const char *n) { + int nostrip = is_comment(); + if (storestring(n,name_,nostrip)) { + if (visible) widget_browser->redraw(); + } +} + +void Fl_Type::label(const char *n) { + if (storestring(n,label_,1)) { + setlabel(label_); + if (visible && !name_) widget_browser->redraw(); + } +} + +void Fl_Type::callback(const char *n) { + storestring(n,callback_); +} + +void Fl_Type::user_data(const char *n) { + storestring(n,user_data_); +} + +void Fl_Type::user_data_type(const char *n) { + storestring(n,user_data_type_); +} + +void Fl_Type::open() { + printf("Open of '%s' is not yet implemented\n",type_name()); +} + +void Fl_Type::setlabel(const char *) {} + +Fl_Type::~Fl_Type() { + // warning: destructor only works for widgets that have been add()ed. + if (widget_browser) widget_browser->deleting(this); + if (prev) prev->next = next; else first = next; + if (next) next->prev = prev; else last = prev; + if (current == this) current = 0; + if (parent) parent->remove_child(this); +} + +int Fl_Type::is_parent() const {return 0;} +int Fl_Type::is_widget() const {return 0;} +int Fl_Type::is_valuator() const {return 0;} +int Fl_Type::is_spinner() const {return 0;} +int Fl_Type::is_button() const {return 0;} +int Fl_Type::is_menu_item() const {return 0;} +int Fl_Type::is_menu_button() const {return 0;} +int Fl_Type::is_group() const {return 0;} +int Fl_Type::is_window() const {return 0;} +int Fl_Type::is_code_block() const {return 0;} +int Fl_Type::is_decl_block() const {return 0;} +int Fl_Type::is_comment() const {return 0;} +int Fl_Type::is_class() const {return 0;} +int Fl_Type::is_public() const {return 1;} + +int Fl_Code_Type::is_public()const { return -1; } +int Fl_CodeBlock_Type::is_public()const { return -1; } + + +//////////////////////////////////////////////////////////////// + +Fl_Type *in_this_only; // set if menu popped-up in window + +void select_all_cb(Fl_Widget *,void *) { + Fl_Type *p = Fl_Type::current ? Fl_Type::current->parent : 0; + if (in_this_only) { + Fl_Type *t = p; + for (; t && t != in_this_only; t = t->parent); + if (t != in_this_only) p = in_this_only; + } + for (;;) { + if (p) { + int foundany = 0; + for (Fl_Type *t = p->next; t && t->level>p->level; t = t->next) { + if (!t->new_selected) {widget_browser->select(t,1,0); foundany = 1;} + } + if (foundany) break; + p = p->parent; + } else { + for (Fl_Type *t = Fl_Type::first; t; t = t->next) + widget_browser->select(t,1,0); + break; + } + } + selection_changed(p); +} + +void select_none_cb(Fl_Widget *,void *) { + Fl_Type *p = Fl_Type::current ? Fl_Type::current->parent : 0; + if (in_this_only) { + Fl_Type *t = p; + for (; t && t != in_this_only; t = t->parent); + if (t != in_this_only) p = in_this_only; + } + for (;;) { + if (p) { + int foundany = 0; + for (Fl_Type *t = p->next; t && t->level>p->level; t = t->next) { + if (t->new_selected) {widget_browser->select(t,0,0); foundany = 1;} + } + if (foundany) break; + p = p->parent; + } else { + for (Fl_Type *t = Fl_Type::first; t; t = t->next) + widget_browser->select(t,0,0); + break; + } + } + selection_changed(p); +} + +static void delete_children(Fl_Type *p) { + Fl_Type *f; + for (f = p; f && f->next && f->next->level > p->level; f = f->next); + for (; f != p; ) { + Fl_Type *g = f->prev; + delete f; + f = g; + } +} + +void delete_all(int selected_only) { + for (Fl_Type *f = Fl_Type::first; f;) { + if (f->selected || !selected_only) { + delete_children(f); + Fl_Type *g = f->next; + delete f; + f = g; + } else f = f->next; + } + if(!selected_only) { + include_H_from_C=1; + use_FL_COMMAND=0; + } + + selection_changed(0); +} + +// move f (and it's children) into list before g: +// returns pointer to whatever is after f & children +void Fl_Type::move_before(Fl_Type* g) { + if (level != g->level) printf("move_before levels don't match! %d %d\n", + level, g->level); + Fl_Type* n; + for (n = next; n && n->level > level; n = n->next); + if (n == g) return; + Fl_Type *l = n ? n->prev : Fl_Type::last; + prev->next = n; + if (n) n->prev = prev; else Fl_Type::last = prev; + prev = g->prev; + l->next = g; + if (prev) prev->next = this; else Fl_Type::first = this; + g->prev = l; + if (parent && is_widget()) parent->move_child(this,g); + widget_browser->redraw(); +} + +// move selected widgets in their parent's list: +void earlier_cb(Fl_Widget*,void*) { + Fl_Type *f; + int mod = 0; + for (f = Fl_Type::first; f; ) { + Fl_Type* nxt = f->next; + if (f->selected) { + Fl_Type* g; + for (g = f->prev; g && g->level > f->level; g = g->prev); + if (g && g->level == f->level && !g->selected) { + f->move_before(g); + mod = 1; + } + } + f = nxt; + } + if (mod) set_modflag(1); +} + +void later_cb(Fl_Widget*,void*) { + Fl_Type *f; + int mod = 0; + for (f = Fl_Type::last; f; ) { + Fl_Type* prv = f->prev; + if (f->selected) { + Fl_Type* g; + for (g = f->next; g && g->level > f->level; g = g->next); + if (g && g->level == f->level && !g->selected) { + g->move_before(f); + mod = 1; + } + } + f = prv; + } + if (mod) set_modflag(1); +} + +//////////////////////////////////////////////////////////////// + +// write a widget and all it's children: +void Fl_Type::write() { + write_indent(level); + write_word(type_name()); + + if (is_class()) { + const char * p = ((Fl_Class_Type*)this)->prefix(); + if (p && strlen(p)) + write_word(p); + } + + write_word(name()); + write_open(level); + write_properties(); + write_close(level); + if (!is_parent()) return; + // now do children: + write_open(level); + Fl_Type *child; + for (child = next; child && child->level > level; child = child->next) + if (child->level == level+1) child->write(); + write_close(level); +} + +void Fl_Type::write_properties() { + // repeat this for each attribute: + if (label()) { + write_indent(level+1); + write_word("label"); + write_word(label()); + } + if (user_data()) { + write_indent(level+1); + write_word("user_data"); + write_word(user_data()); + } + if (user_data_type()) { + write_word("user_data_type"); + write_word(user_data_type()); + } + if (callback()) { + write_indent(level+1); + write_word("callback"); + write_word(callback()); + } + if (is_parent() && open_) write_word("open"); + if (selected) write_word("selected"); +} + +void Fl_Type::read_property(const char *c) { + if (!strcmp(c,"label")) + label(read_word()); + else if (!strcmp(c,"user_data")) + user_data(read_word()); + else if (!strcmp(c,"user_data_type")) + user_data_type(read_word()); + else if (!strcmp(c,"callback")) + callback(read_word()); + else if (!strcmp(c,"open")) + open_ = 1; + else if (!strcmp(c,"selected")) + select(this,1); + else + read_error("Unknown property \"%s\"", c); +} + +int Fl_Type::read_fdesign(const char*, const char*) {return 0;} + +/** + * Return 1 if the list contains a function with the given signature at the top level + */ +int has_toplevel_function(const char *rtype, const char *sig) { + Fl_Type *child; + for (child = Fl_Type::first; child; child = child->next) { + if (!child->is_in_class() && strcmp(child->type_name(), "Function")==0) { + const Fl_Function_Type *fn = (const Fl_Function_Type*)child; + if (fn->has_signature(rtype, sig)) + return 1; + } + } + return 0; +} + +/** + * Make sure that the given item is visible in the browser by opening + * all parent groups and moving the item into the visible space. + */ +void reveal_in_browser(Fl_Type *t) { + Fl_Type *p = t->parent; + if (p) { + for (;;) { + if (!p->open_) + p->open_ = 1; + if (!p->parent) break; + p = p->parent; + } + fixvisible(p); + } + widget_browser->display(t); + redraw_browser(); +} + +/** + * Build widgets and dataset needed in live mode. + * \return a widget pointer that the live mode initiator can 'show()' + * \see leave_live_mode() + */ +Fl_Widget *Fl_Type::enter_live_mode(int) { + return 0L; +} + +/** + * Release all resources created when enetring live mode. + * \see enter_live_mode() + */ +void Fl_Type::leave_live_mode() { +} + +/** + * Copy all needed properties for this tye into the live object. + */ +void Fl_Type::copy_properties() { +} + +// +// End of "$Id: Fl_Type.cxx 6012 2008-01-04 21:45:49Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/Fl_Type.h b/third_party/windows/fltk-1.1.10/fluid/Fl_Type.h new file mode 100644 index 0000000..b428ea0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/Fl_Type.h @@ -0,0 +1,772 @@ +// +// "$Id: Fl_Type.h 6012 2008-01-04 21:45:49Z matt $" +// +// Widget type header file for the Fast Light Tool Kit (FLTK). +// +// Each object described by Fluid is one of these objects. They +// are all stored in a double-linked list. +// +// There is also a single "factory" instance of each type of this. +// The method "make()" is called on this factory to create a new +// instance of this object. It could also have a "copy()" function, +// but it was easier to implement this by using the file read/write +// that is needed to save the setup anyways. +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include "Fluid_Image.h" +#include + +void set_modflag(int mf); + +class Fl_Type { + + friend class Widget_Browser; + friend Fl_Widget *make_type_browser(int,int,int,int,const char *l=0); + friend class Fl_Window_Type; + virtual void setlabel(const char *); // virtual part of label(char*) + +protected: + + Fl_Type(); + + const char *name_; + const char *label_; + const char *callback_; + const char *user_data_; + const char *user_data_type_; + +public: // things that should not be public: + + Fl_Type *parent; // parent, which is previous in list + char new_selected; // browser highlight + char selected; // copied here by selection_changed() + char open_; // state of triangle in browser + char visible; // true if all parents are open + char rtti; // hack because I have no rtti, this is 0 for base class + int level; // number of parents over this + static Fl_Type *first, *last; // linked list of all objects + Fl_Type *next, *prev; // linked list of all objects + + Fl_Type *factory; + const char *callback_name(); + + int code_line, header_line; + int code_line_end, header_line_end; + +public: + + virtual ~Fl_Type(); + virtual Fl_Type *make() = 0; + + void add(Fl_Type *parent); // add as new child + void insert(Fl_Type *n); // insert into list before n + Fl_Type* remove(); // remove from list + void move_before(Fl_Type*); // move before a sibling + + virtual const char *title(); // string for browser + virtual const char *type_name() = 0; // type for code output + + const char *name() const {return name_;} + void name(const char *); + const char *label() const {return label_;} + void label(const char *); + const char *callback() const {return callback_;} + void callback(const char *); + const char *user_data() const {return user_data_;} + void user_data(const char *); + const char *user_data_type() const {return user_data_type_;} + void user_data_type(const char *); + + virtual Fl_Type* click_test(int,int); + virtual void add_child(Fl_Type*, Fl_Type* beforethis); + virtual void move_child(Fl_Type*, Fl_Type* beforethis); + virtual void remove_child(Fl_Type*); + + static Fl_Type *current; // most recently picked object + virtual void open(); // what happens when you double-click + + // read and write data to a saved file: + void write(); + virtual void write_properties(); + virtual void read_property(const char *); + virtual int read_fdesign(const char*, const char*); + + // write code, these are called in order: + virtual void write_static(); // write static stuff to .c file + virtual void write_code1(); // code and .h before children + virtual void write_code2(); // code and .h after children + + // live mode + virtual Fl_Widget *enter_live_mode(int top=0); // build wdgets needed for live mode + virtual void leave_live_mode(); // free allocated resources + virtual void copy_properties(); // copy properties from this type into a potetial live object + + // get message number for I18N + int msgnum(); + + // fake rtti: + virtual int is_parent() const; + virtual int is_widget() const; + virtual int is_button() const; + virtual int is_valuator() const; + virtual int is_spinner() const; + virtual int is_menu_item() const; + virtual int is_menu_button() const; + virtual int is_group() const; + virtual int is_window() const; + virtual int is_code_block() const; + virtual int is_decl_block() const; + virtual int is_comment() const; + virtual int is_class() const; + virtual int is_public() const; + + virtual int pixmapID() { return 0; } + + const char* class_name(const int need_nest) const; + const class Fl_Class_Type* is_in_class() const; +}; + +class Fl_Function_Type : public Fl_Type { + const char* return_type; + char public_, cdecl_, constructor, havewidgets; +public: + Fl_Type *make(); + void write_code1(); + void write_code2(); + void open(); + int ismain() {return name_ == 0;} + virtual const char *type_name() {return "Function";} + virtual const char *title() { + return name() ? name() : "main()"; + } + int is_parent() const {return 1;} + int is_code_block() const {return 1;} + virtual int is_public() const; + int pixmapID() { return 7; } + void write_properties(); + void read_property(const char *); + int has_signature(const char *, const char*) const; +}; + +class Fl_Code_Type : public Fl_Type { +public: + Fl_Type *make(); + void write_code1(); + void write_code2(); + void open(); + virtual const char *type_name() {return "code";} + int is_code_block() const {return 0;} + int pixmapID() { return 8; } + virtual int is_public() const; +}; + +class Fl_CodeBlock_Type : public Fl_Type { + const char* after; +public: + Fl_Type *make(); + void write_code1(); + void write_code2(); + void open(); + virtual const char *type_name() {return "codeblock";} + int is_code_block() const {return 1;} + int is_parent() const {return 1;} + virtual int is_public() const; + int pixmapID() { return 9; } + void write_properties(); + void read_property(const char *); +}; + +class Fl_Decl_Type : public Fl_Type { + char public_; + char static_; +public: + Fl_Type *make(); + void write_code1(); + void write_code2(); + void open(); + virtual const char *type_name() {return "decl";} + void write_properties(); + void read_property(const char *); + virtual int is_public() const; + int pixmapID() { return 10; } +}; + +class Fl_DeclBlock_Type : public Fl_Type { + const char* after; + char public_; +public: + Fl_Type *make(); + void write_code1(); + void write_code2(); + void open(); + virtual const char *type_name() {return "declblock";} + void write_properties(); + void read_property(const char *); + int is_parent() const {return 1;} + int is_decl_block() const {return 1;} + virtual int is_public() const; + int pixmapID() { return 11; } +}; + +class Fl_Comment_Type : public Fl_Type { + char in_c_, in_h_, style_; + char title_buf[64]; +public: + Fl_Type *make(); + void write_code1(); + void write_code2(); + void open(); + virtual const char *type_name() {return "comment";} + virtual const char *title(); // string for browser + void write_properties(); + void read_property(const char *); + virtual int is_public() const { return 1; } + virtual int is_comment() const { return 1; } + int pixmapID() { return 46; } +}; + +class Fl_Class_Type : public Fl_Type { + const char* subclass_of; + char public_; +public: + // state variables for output: + char write_public_state; // true when public: has been printed + Fl_Class_Type* parent_class; // save class if nested +// + Fl_Type *make(); + void write_code1(); + void write_code2(); + void open(); + virtual const char *type_name() {return "class";} + int is_parent() const {return 1;} + int is_decl_block() const {return 1;} + int is_class() const {return 1;} + virtual int is_public() const; + int pixmapID() { return 12; } + void write_properties(); + void read_property(const char *); + + // class prefix attribute access + void prefix(const char* p); + const char* prefix() const {return class_prefix;} + int has_function(const char*, const char*) const; +private: + const char* class_prefix; +}; + +#define NUM_EXTRA_CODE 4 + +class Fl_Widget_Type : public Fl_Type { + virtual Fl_Widget *widget(int,int,int,int) = 0; + virtual Fl_Widget_Type *_make() = 0; // virtual constructor + virtual void setlabel(const char *); + + const char *extra_code_[NUM_EXTRA_CODE]; + const char *subclass_; + const char *tooltip_; + const char *image_name_; + const char *inactive_name_; + uchar hotspot_; + +protected: + + void write_static(); + void write_code1(); + void write_widget_code(); + void write_extra_code(); + void write_block_close(); + void write_code2(); + void write_color(const char*, Fl_Color); + Fl_Widget *live_widget; + +public: + static int default_size; + + const char *xclass; // junk string, used for shortcut + Fl_Widget *o; + int public_; + + Fluid_Image *image; + void setimage(Fluid_Image *); + Fluid_Image *inactive; + void setinactive(Fluid_Image *); + + Fl_Widget_Type(); + Fl_Type *make(); + void open(); + + const char *extra_code(int n) const {return extra_code_[n];} + void extra_code(int n,const char *); + const char *subclass() const {return subclass_;} + void subclass(const char *); + const char *tooltip() const {return tooltip_;} + void tooltip(const char *); + const char *image_name() const {return image_name_;} + void image_name(const char *); + const char *inactive_name() const {return inactive_name_;} + void inactive_name(const char *); + uchar hotspot() const {return hotspot_;} + void hotspot(uchar v) {hotspot_ = v;} + uchar resizable() const; + void resizable(uchar v); + + virtual int textstuff(int what, Fl_Font &, int &, Fl_Color &); + virtual Fl_Menu_Item *subtypes(); + + virtual int is_widget() const; + virtual int is_public() const; + + virtual void write_properties(); + virtual void read_property(const char *); + virtual int read_fdesign(const char*, const char*); + + virtual Fl_Widget *enter_live_mode(int top=0); + virtual void leave_live_mode(); + virtual void copy_properties(); + + virtual void ideal_size(int &w, int &h); + virtual void ideal_spacing(int &x, int &y); + + ~Fl_Widget_Type(); + void redraw(); +}; + +#include +#include +#include + +class igroup : public Fl_Group { +public: + void resize(int,int,int,int); + void full_resize(int X, int Y, int W, int H) { Fl_Group::resize(X, Y, W, H); } + igroup(int X,int Y,int W,int H) : Fl_Group(X,Y,W,H) {Fl_Group::current(0);} +}; + +class itabs : public Fl_Tabs { +public: + void resize(int,int,int,int); + void full_resize(int X, int Y, int W, int H) { Fl_Group::resize(X, Y, W, H); } + itabs(int X,int Y,int W,int H) : Fl_Tabs(X,Y,W,H) {} +}; + +class iwizard : public Fl_Wizard { +public: + void resize(int,int,int,int); + void full_resize(int X, int Y, int W, int H) { Fl_Group::resize(X, Y, W, H); } + iwizard(int X,int Y,int W,int H) : Fl_Wizard(X,Y,W,H) {} +}; + +class Fl_Group_Type : public Fl_Widget_Type { +public: + virtual const char *type_name() {return "Fl_Group";} + Fl_Widget *widget(int X,int Y,int W,int H) { + igroup *g = new igroup(X,Y,W,H); Fl_Group::current(0); return g;} + Fl_Widget_Type *_make() {return new Fl_Group_Type();} + Fl_Type *make(); + void write_code1(); + void write_code2(); + void add_child(Fl_Type*, Fl_Type*); + void move_child(Fl_Type*, Fl_Type*); + void remove_child(Fl_Type*); + int is_parent() const {return 1;} + int is_group() const {return 1;} + int pixmapID() { return 6; } + + virtual Fl_Widget *enter_live_mode(int top=0); + virtual void leave_live_mode(); + virtual void copy_properties(); +}; + +extern const char pack_type_name[]; +extern Fl_Menu_Item pack_type_menu[]; + +class Fl_Pack_Type : public Fl_Group_Type { + Fl_Menu_Item *subtypes() {return pack_type_menu;} +public: + virtual const char *type_name() {return pack_type_name;} + Fl_Widget_Type *_make() {return new Fl_Pack_Type();} + int pixmapID() { return 22; } + void copy_properties(); +}; + +extern const char tabs_type_name[]; + +class Fl_Tabs_Type : public Fl_Group_Type { +public: + virtual void ideal_spacing(int &x, int &y) { + x = 10; + fl_font(o->labelfont(), o->labelsize()); + y = fl_height() + o->labelsize() - 6; + } + virtual const char *type_name() {return tabs_type_name;} + Fl_Widget *widget(int X,int Y,int W,int H) { + itabs *g = new itabs(X,Y,W,H); Fl_Group::current(0); return g;} + Fl_Widget_Type *_make() {return new Fl_Tabs_Type();} + Fl_Type* click_test(int,int); + void add_child(Fl_Type*, Fl_Type*); + void remove_child(Fl_Type*); + int pixmapID() { return 13; } + Fl_Widget *enter_live_mode(int top=0); +}; + +extern const char scroll_type_name[]; +extern Fl_Menu_Item scroll_type_menu[]; + +class Fl_Scroll_Type : public Fl_Group_Type { + Fl_Menu_Item *subtypes() {return scroll_type_menu;} +public: + virtual const char *type_name() {return scroll_type_name;} + Fl_Widget_Type *_make() {return new Fl_Scroll_Type();} + int pixmapID() { return 19; } + Fl_Widget *enter_live_mode(int top=0); + void copy_properties(); +}; + +extern const char tile_type_name[]; + +class Fl_Tile_Type : public Fl_Group_Type { +public: + virtual const char *type_name() {return tile_type_name;} + Fl_Widget_Type *_make() {return new Fl_Tile_Type();} + int pixmapID() { return 20; } + void copy_properties(); +}; + +extern const char wizard_type_name[]; + +class Fl_Wizard_Type : public Fl_Group_Type { +public: + virtual const char *type_name() {return wizard_type_name;} + Fl_Widget *widget(int X,int Y,int W,int H) { + iwizard *g = new iwizard(X,Y,W,H); Fl_Group::current(0); return g;} + Fl_Widget_Type *_make() {return new Fl_Wizard_Type();} + int pixmapID() { return 21; } +}; + +extern Fl_Menu_Item window_type_menu[]; + +class Fl_Window_Type : public Fl_Widget_Type { +protected: + + Fl_Menu_Item* subtypes() {return window_type_menu;} + + friend class Overlay_Window; + int mx,my; // mouse position during dragging + int x1,y1; // initial position of selection box + int bx,by,br,bt; // bounding box of selection before snapping + int sx,sy,sr,st; // bounding box of selection after snapping to guides + int dx,dy; + int drag; // which parts of bbox are being moved + int numselected; // number of children selected + enum {LEFT=1,RIGHT=2,BOTTOM=4,TOP=8,DRAG=16,BOX=32}; + void draw_overlay(); + void newdx(); + void newposition(Fl_Widget_Type *,int &x,int &y,int &w,int &h); + int handle(int); + virtual void setlabel(const char *); + void write_code1(); + void write_code2(); + Fl_Widget_Type *_make() {return 0;} // we don't call this + Fl_Widget *widget(int,int,int,int) {return 0;} + int recalc; // set by fix_overlay() + void moveallchildren(); + int pixmapID() { return 1; } + +public: + + Fl_Window_Type() { drag = dx = dy = 0; sr_min_w = sr_min_h = sr_max_w = sr_max_h = 0; } + uchar modal, non_modal; + + Fl_Type *make(); + virtual const char *type_name() {return "Fl_Window";} + + void open(); + + void fix_overlay(); // Update the bounding box, etc + uchar *read_image(int &ww, int &hh); // Read an image of the window + + virtual void write_properties(); + virtual void read_property(const char *); + virtual int read_fdesign(const char*, const char*); + + void add_child(Fl_Type*, Fl_Type*); + void move_child(Fl_Type*, Fl_Type*); + void remove_child(Fl_Type*); + + int is_parent() const {return 1;} + int is_group() const {return 1;} + int is_window() const {return 1;} + + Fl_Widget *enter_live_mode(int top=0); + void leave_live_mode(); + void copy_properties(); + + int sr_min_w, sr_min_h, sr_max_w, sr_max_h; +}; + +class Fl_Widget_Class_Type : private Fl_Window_Type { +public: + Fl_Widget_Class_Type() { + write_public_state = 0; + wc_relative = 0; + } + // state variables for output: + char write_public_state; // true when public: has been printed + char wc_relative; // if true, reposition all child widgets in an Fl_Group + + virtual void write_properties(); + virtual void read_property(const char *); + + void write_code1(); + void write_code2(); + Fl_Type *make(); + virtual const char *type_name() {return "widget_class";} + int pixmapID() { return 48; } + int is_parent() const {return 1;} + int is_code_block() const {return 1;} + int is_decl_block() const {return 1;} + int is_class() const {return 1;} +}; + + +extern Fl_Menu_Item menu_item_type_menu[]; + +class Fl_Menu_Item_Type : public Fl_Widget_Type { +public: + Fl_Menu_Item* subtypes() {return menu_item_type_menu;} + const char* type_name() {return "MenuItem";} + Fl_Type* make(); + int is_menu_item() const {return 1;} + int is_button() const {return 1;} // this gets shortcut to work + Fl_Widget* widget(int,int,int,int) {return 0;} + Fl_Widget_Type* _make() {return 0;} + const char* menu_name(int& i); + int flags(); + void write_static(); + void write_item(); + void write_code1(); + void write_code2(); + int pixmapID() { return 16; } +}; + +class Fl_Submenu_Type : public Fl_Menu_Item_Type { +public: + Fl_Menu_Item* subtypes() {return 0;} + const char* type_name() {return "Submenu";} + int is_parent() const {return 1;} + int is_button() const {return 0;} // disable shortcut + Fl_Type* make(); + // changes to submenu must propagate up so build_menu is called + // on the parent Fl_Menu_Type: + void add_child(Fl_Type*a, Fl_Type*b) {parent->add_child(a,b);} + void move_child(Fl_Type*a, Fl_Type*b) {parent->move_child(a,b);} + void remove_child(Fl_Type*a) {parent->remove_child(a);} + int pixmapID() { return 18; } +}; + + +#include +class Fl_Menu_Type : public Fl_Widget_Type { + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_Menu_ *myo = (Fl_Menu_*)(w==4 ? ((Fl_Widget_Type*)this->factory)->o : this->o); + switch (w) { + case 4: + case 0: f = myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; + } +public: + int is_menu_button() const {return 1;} + int is_parent() const {return 1;} + int menusize; + virtual void build_menu(); + Fl_Menu_Type() : Fl_Widget_Type() {menusize = 0;} + ~Fl_Menu_Type() { + if (menusize) delete[] (Fl_Menu_Item*)(((Fl_Menu_*)o)->menu()); + } + void add_child(Fl_Type*, Fl_Type*) {build_menu();} + void move_child(Fl_Type*, Fl_Type*) {build_menu();} + void remove_child(Fl_Type*) {build_menu();} + Fl_Type* click_test(int x, int y); + void write_code2(); + void copy_properties(); +}; + +extern Fl_Menu_Item button_type_menu[]; + +#include +class Fl_Menu_Button_Type : public Fl_Menu_Type { + Fl_Menu_Item *subtypes() {return button_type_menu;} +public: + virtual void ideal_size(int &w, int &h) { + Fl_Widget_Type::ideal_size(w, h); + w += 2 * ((o->labelsize() - 3) & ~1) + o->labelsize() - 4; + h = (h / 5) * 5; + if (h < 15) h = 15; + if (w < (15 + h)) w = 15 + h; + } + virtual const char *type_name() {return "Fl_Menu_Button";} + Fl_Widget *widget(int X,int Y,int W,int H) { + return new Fl_Menu_Button(X,Y,W,H,"menu");} + Fl_Widget_Type *_make() {return new Fl_Menu_Button_Type();} + int pixmapID() { return 26; } +}; + +extern Fl_Menu_Item dummymenu[]; + +#include +class Fl_Choice_Type : public Fl_Menu_Type { +public: + virtual void ideal_size(int &w, int &h) { + Fl_Widget_Type::ideal_size(w, h); + int w1 = o->h() - Fl::box_dh(o->box()); + if (w1 > 20) w1 = 20; + w1 = (w1 - 4) / 3; + if (w1 < 1) w1 = 1; + w += 2 * w1 + o->labelsize() - 4; + h = (h / 5) * 5; + if (h < 15) h = 15; + if (w < (15 + h)) w = 15 + h; + } + virtual const char *type_name() {return "Fl_Choice";} + Fl_Widget *widget(int X,int Y,int W,int H) { + Fl_Choice *myo = new Fl_Choice(X,Y,W,H,"choice:"); + myo->menu(dummymenu); + return myo; + } + Fl_Widget_Type *_make() {return new Fl_Choice_Type();} + int pixmapID() { return 15; } +}; + +#include +class Fl_Input_Choice_Type : public Fl_Menu_Type { + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_Input_Choice *myo = (Fl_Input_Choice*)(w==4 ? ((Fl_Widget_Type*)this->factory)->o : this->o); + switch (w) { + case 4: + case 0: f = (Fl_Font)myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; + } +public: + virtual void ideal_size(int &w, int &h) { + Fl_Input_Choice *myo = (Fl_Input_Choice *)o; + fl_font(myo->textfont(), myo->textsize()); + h = fl_height() + myo->textsize() - 6; + w = o->w() - 20 - Fl::box_dw(o->box()); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + 20 + Fl::box_dw(o->box()); + if (h < 15) h = 15; + if (w < (15 + h)) w = 15 + h; + } + virtual const char *type_name() {return "Fl_Input_Choice";} + virtual Fl_Type* click_test(int,int); + Fl_Widget *widget(int X,int Y,int W,int H) { + Fl_Input_Choice *myo = new Fl_Input_Choice(X,Y,W,H,"input choice:"); + myo->menu(dummymenu); + myo->value("input"); + return myo; + } + Fl_Widget_Type *_make() {return new Fl_Input_Choice_Type();} + virtual void build_menu(); + int pixmapID() { return 15; } + void copy_properties(); +}; + +#include +#include +class Fl_Menu_Bar_Type : public Fl_Menu_Type { +public: + virtual void ideal_size(int &w, int &h) { + w = o->window()->w(); + h = ((o->labelsize() + Fl::box_dh(o->box()) + 4) / 5) * 5; + if (h < 15) h = 15; + } + virtual const char *type_name() {return "Fl_Menu_Bar";} + Fl_Widget *widget(int X,int Y,int W,int H) {return new Fl_Menu_Bar(X,Y,W,H);} + Fl_Widget_Type *_make() {return new Fl_Menu_Bar_Type();} + int pixmapID() { return 17; } +}; +// object list operations: +Fl_Widget *make_widget_browser(int X,int Y,int W,int H); +extern int modflag; +void delete_all(int selected_only=0); +void selection_changed(Fl_Type* new_current); +void reveal_in_browser(Fl_Type*); +int has_toplevel_function(const char *rtype, const char *sig); + +// file operations: +# ifdef __GNUC__ +# define __fl_attr(x) __attribute__ (x) +# else +# define __fl_attr(x) +# endif // __GNUC__ + +void write_word(const char *); +void write_string(const char *,...) __fl_attr((__format__ (__printf__, 1, 2))); +int write_file(const char *, int selected_only = 0); +int write_code(const char *cfile, const char *hfile); +int write_strings(const char *sfile); + +int write_declare(const char *, ...) __fl_attr((__format__ (__printf__, 1, 2))); +int is_id(char); +const char* unique_id(void* o, const char*, const char*, const char*); +void write_c(const char*, ...) __fl_attr((__format__ (__printf__, 1, 2))); +void write_h(const char*, ...) __fl_attr((__format__ (__printf__, 1, 2))); +void write_cstring(const char *); +void write_cstring(const char *,int length); +void write_cdata(const char *,int length); +void write_indent(int n); +void write_open(int); +void write_close(int n); +extern int write_number; +extern int write_sourceview; +void write_public(int state); // writes pubic:/private: as needed +extern int indentation; +extern const char* indent(); + +int read_file(const char *, int merge); +const char *read_word(int wantbrace = 0); +void read_error(const char *format, ...); + +// check legality of c code (sort of) and return error: +const char *c_check(const char *c, int type = 0); + +// replace a string pointer with new value, strips leading/trailing blanks: +int storestring(const char *n, const char * & p, int nostrip=0); + +extern int include_H_from_C; +extern int use_FL_COMMAND; + +// +// End of "$Id: Fl_Type.h 6012 2008-01-04 21:45:49Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/Fl_Widget_Type.cxx b/third_party/windows/fltk-1.1.10/fluid/Fl_Widget_Type.cxx new file mode 100644 index 0000000..83172d2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/Fl_Widget_Type.cxx @@ -0,0 +1,2745 @@ +// +// "$Id: Fl_Widget_Type.cxx 6801 2009-06-28 22:09:25Z matt $" +// +// Widget type code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include "Fl_Widget_Type.h" +#include "alignment_panel.h" +#include +#include +#include +#include +#include "../src/flstring.h" +#include +#include + +// Make an Fl_Widget_Type subclass instance. +// It figures out the automatic size and parent of the new widget, +// creates the Fl_Widget (by calling the virtual function _make), +// adds it to the Fl_Widget hierarchy, creates a new Fl_Type +// instance, sets the widget pointers, and makes all the display +// update correctly... + +extern int reading_file; +int force_parent; +extern int gridx; +extern int gridy; +extern int i18n_type; +extern const char* i18n_include; +extern const char* i18n_function; +extern const char* i18n_file; +extern const char* i18n_set; + +int Fl_Widget_Type::default_size = FL_NORMAL_SIZE; + +int Fl_Widget_Type::is_widget() const {return 1;} +int Fl_Widget_Type::is_public() const {return public_;} + +const char* subclassname(Fl_Type* l) { + if (l->is_widget()) { + Fl_Widget_Type* p = (Fl_Widget_Type*)l; + const char* c = p->subclass(); + if (c) return c; + if (l->is_class()) return "Fl_Group"; + if (p->o->type() == FL_WINDOW+1) return "Fl_Double_Window"; + } + return l->type_name(); +} + +// Return the ideal widget size... +void +Fl_Widget_Type::ideal_size(int &w, int &h) { + h = o->labelsize(); + o->measure_label(w, h); + + w += Fl::box_dw(o->box()); + h += Fl::box_dh(o->box()); + + if (w < 15) w = 15; + if (h < 15) h = 15; +} + +// Return the ideal widget spacing... +void +Fl_Widget_Type::ideal_spacing(int &x, int &y) { + if (o->labelsize() < 10) + x = y = 0; + else if (o->labelsize() < 14) + x = y = 5; + else + x = y = 10; +} + +Fl_Type *Fl_Widget_Type::make() { + // Find the current widget, or widget to copy: + Fl_Type *qq = Fl_Type::current; + while (qq && (!qq->is_widget() || qq->is_menu_item())) qq = qq->parent; + if (!qq) { + fl_message("Please select a widget"); + return 0; + } + Fl_Widget_Type* q = (Fl_Widget_Type*)qq; + // find the parent widget: + Fl_Widget_Type* p = q; + if ((force_parent || !p->is_group()) && p->parent->is_widget()) + p = (Fl_Widget_Type*)(p->parent); + force_parent = 0; + + // Figure out a border between widget and window: + int B = p->o->w()/2; if (p->o->h()/2 < B) B = p->o->h()/2; if (B>25) B = 25; + + int ULX,ULY; // parent's origin in window + if (!p->is_window()) { // if it is a group, add corner + ULX = p->o->x(); ULY = p->o->y(); + } else { + ULX = ULY = 0; + } + + // Figure out a position and size for the widget + int X,Y,W,H; + if (is_group()) { // fill the parent with the widget + X = ULX+B; + W = p->o->w()-B; + Y = ULY+B; + H = p->o->h()-B; + } else if (q != p) { // copy position and size of current widget + W = q->o->w(); + H = q->o->h(); + X = q->o->x()+W; + Y = q->o->y(); + if (X+W > ULX+p->o->w()) { + X = q->o->x(); + Y = q->o->y()+H; + if (Y+H > ULY+p->o->h()) Y = ULY+B; + } + } else { // just make it small and square... + X = ULX+B; + Y = ULY+B; + W = H = B; + } + + // satisfy the grid requirements (otherwise it edits really strangely): + if (gridx>1) { + X = (X/gridx)*gridx; + W = ((W-1)/gridx+1)*gridx; + } + if (gridy>1) { + Y = (Y/gridy)*gridy; + H = ((H-1)/gridy+1)*gridy; + } + + // Construct the Fl_Type: + Fl_Widget_Type *t = _make(); + if (!o) o = widget(0,0,100,100); // create template widget + t->factory = this; + // Construct the Fl_Widget: + t->o = widget(X,Y,W,H); + if (reading_file) t->o->label(0); + else if (t->o->label()) t->label(t->o->label()); // allow editing + t->o->user_data((void*)t); + // Put it in the parent: + // ((Fl_Group *)(p->o))->add(t->o); (done by Fl_Type::add()) + // add to browser: + t->add(p); + t->redraw(); + return t; +} + +#include "Fluid_Image.h" + +void Fl_Widget_Type::setimage(Fluid_Image *i) { + if (i == image || is_window()) return; + if (image) image->decrement(); + if (i) i->increment(); + image = i; + if (i) i->image(o); + else o->image(0); + redraw(); +} + +void Fl_Widget_Type::setinactive(Fluid_Image *i) { + if (i == inactive || is_window()) return; + if (inactive) inactive->decrement(); + if (i) i->increment(); + inactive = i; + if (i) i->deimage(o); + else o->deimage(0); + redraw(); +} + +void Fl_Widget_Type::setlabel(const char *n) { + o->label(n); + redraw(); +} + +Fl_Widget_Type::Fl_Widget_Type() { + for (int n=0; nhide(); + if (o->parent()) ((Fl_Group*)o->parent())->remove(*o); + delete o; + } +} + +void Fl_Widget_Type::extra_code(int m,const char *n) { + storestring(n,extra_code_[m]); +} + +extern void redraw_browser(); +void Fl_Widget_Type::subclass(const char *n) { + if (storestring(n,subclass_) && visible) + redraw_browser(); +} + +void Fl_Widget_Type::tooltip(const char *n) { + storestring(n,tooltip_); + o->tooltip(n); +} + +void Fl_Widget_Type::image_name(const char *n) { + setimage(Fluid_Image::find(n)); + storestring(n,image_name_); +} + +void Fl_Widget_Type::inactive_name(const char *n) { + setinactive(Fluid_Image::find(n)); + storestring(n,inactive_name_); +} + +void Fl_Widget_Type::redraw() { + Fl_Type *t = this; + if (is_menu_item()) { + // find the menu button that parents this menu: + do t = t->parent; while (t && t->is_menu_item()); + // kludge to cause build_menu to be called again: + t->add_child(0,0); + } else { + while (t->parent && t->parent->is_widget()) t = t->parent; + ((Fl_Widget_Type*)t)->o->redraw(); + } +} + +// the recursive part sorts all children, returns pointer to next: +Fl_Type *sort(Fl_Type *parent) { + Fl_Type *f,*n=0; + for (f = parent ? parent->next : Fl_Type::first; ; f = n) { + if (!f || parent && f->level <= parent->level) return f; + n = sort(f); + if (!f->selected || (!f->is_widget() || f->is_menu_item())) continue; + Fl_Widget* fw = ((Fl_Widget_Type*)f)->o; + Fl_Type *g; // we will insert before this + for (g = parent->next; g != f; g = g->next) { + if (!g->selected || g->level > f->level) continue; + Fl_Widget* gw = ((Fl_Widget_Type*)g)->o; + if (gw->y() > fw->y()) break; + if (gw->y() == fw->y() && gw->x() > fw->x()) break; + } + if (g != f) f->move_before(g); + } +} + +//////////////////////////////////////////////////////////////// +// The control panels! + +#include "widget_panel.h" +#include + +static Fl_Window *the_panel; + +// All the callbacks use the argument to indicate whether to load or store. +// This avoids the need for pointers to all the widgets, and keeps the +// code localized in the callbacks. +// A value of LOAD means to load. The hope is that this will not collide +// with any actual useful values for the argument. I also use this to +// initialized parts of the widget that are nyi by fluid. + +Fl_Widget_Type *current_widget; // one of the selected ones +static int numselected; // number selected +static int haderror; + +void name_cb(Fl_Input* o, void *v) { + if (v == LOAD) { + static char buf[1024]; + if (numselected != 1) { + snprintf(buf, sizeof(buf), "Widget Properties (%d widgets)", numselected); + o->hide(); + } else { + o->static_value(current_widget->name()); + o->show(); + snprintf(buf, sizeof(buf), "%s Properties", current_widget->title()); + } + + the_panel->label(buf); + } else { + if (numselected == 1) { + current_widget->name(o->value()); + // I don't update window title, as it probably is being closed + // and wm2 (a window manager) barfs if you retitle and then + // hide a window: + // ((Fl_Window*)(o->parent()->parent()->parent()))->label(current_widget->title()); + } + } +} + +void name_public_member_cb(Fl_Choice* i, void* v) { + if (v == LOAD) { + i->value(current_widget->public_); + if (current_widget->is_in_class()) i->show(); else i->hide(); + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type *w = ((Fl_Widget_Type*)o); + if (w->is_in_class()) { + w->public_ = i->value(); + } else { + // if this is not in a class, it can be only private or public + w->public_ = (i->value()>0); + } + mod = 1; + } + } + if (mod) { + set_modflag(1); + redraw_browser(); + } + } +} + +void name_public_cb(Fl_Choice* i, void* v) { + if (v == LOAD) { + i->value(current_widget->public_>0); + if (current_widget->is_in_class()) i->hide(); else i->show(); + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + ((Fl_Widget_Type*)o)->public_ = i->value(); + mod = 1; + } + } + if (mod) { + set_modflag(1); + redraw_browser(); + } + } +} + +static char* oldlabel; +static unsigned oldlabellen; + +void label_cb(Fl_Input* i, void *v) { + if (v == LOAD) { + i->static_value(current_widget->label()); + if (strlen(i->value()) >= oldlabellen) { + oldlabellen = strlen(i->value())+128; + oldlabel = (char*)realloc(oldlabel,oldlabellen); + } + strcpy(oldlabel,i->value()); + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + o->label(i->value()); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +static Fl_Input *image_input; + +void image_cb(Fl_Input* i, void *v) { + if (v == LOAD) { + image_input = i; + if (current_widget->is_widget() && !current_widget->is_window()) { + i->activate(); + i->static_value(((Fl_Widget_Type*)current_widget)->image_name()); + } else i->deactivate(); + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + ((Fl_Widget_Type*)o)->image_name(i->value()); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void image_browse_cb(Fl_Button* b, void *v) { + if (v == LOAD) { + if (current_widget->is_widget() && !current_widget->is_window()) + b->activate(); + else + b->deactivate(); + } else { + int mod = 0; + if (ui_find_image(image_input->value())) { + image_input->value(ui_find_image_name); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + ((Fl_Widget_Type*)o)->image_name(ui_find_image_name); + mod = 1; + } + } + if (mod) set_modflag(1); + } + } +} + +static Fl_Input *inactive_input; + +void inactive_cb(Fl_Input* i, void *v) { + if (v == LOAD) { + inactive_input = i; + if (current_widget->is_widget() && !current_widget->is_window()) { + i->activate(); + i->static_value(((Fl_Widget_Type*)current_widget)->inactive_name()); + } else i->deactivate(); + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + ((Fl_Widget_Type*)o)->inactive_name(i->value()); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void inactive_browse_cb(Fl_Button* b, void *v) { + if (v == LOAD) { + if (current_widget->is_widget() && !current_widget->is_window()) + b->activate(); + else + b->deactivate(); + } else { + int mod = 0; + if (ui_find_image(inactive_input->value())) { + inactive_input->value(ui_find_image_name); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + ((Fl_Widget_Type*)o)->inactive_name(ui_find_image_name); + mod = 1; + } + } + if (mod) set_modflag(1); + } + } +} + +void tooltip_cb(Fl_Input* i, void *v) { + if (v == LOAD) { + if (current_widget->is_widget()) { + i->activate(); + i->static_value(((Fl_Widget_Type*)current_widget)->tooltip()); + } else i->deactivate(); + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + ((Fl_Widget_Type*)o)->tooltip(i->value()); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +Fl_Value_Input *x_input, *y_input, *w_input, *h_input; + +void x_cb(Fl_Value_Input *i, void *v) { + if (v == LOAD) { + x_input = i; + if (current_widget->is_widget()) { + i->value(((Fl_Widget_Type *)current_widget)->o->x()); + x_input->activate(); + } else x_input->deactivate(); + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + w->resize((int)i->value(), w->y(), w->w(), w->h()); + if (w->window()) w->window()->redraw(); + if (o->is_window()) { + ((Fl_Window *)w)->size_range(gridx, gridy, Fl::w(), Fl::h(), + gridx, gridy, 0); + } + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void y_cb(Fl_Value_Input *i, void *v) { + if (v == LOAD) { + y_input = i; + if (current_widget->is_widget()) { + i->value(((Fl_Widget_Type *)current_widget)->o->y()); + y_input->activate(); + } else y_input->deactivate(); + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + w->resize(w->x(), (int)i->value(), w->w(), w->h()); + if (w->window()) w->window()->redraw(); + if (o->is_window()) { + ((Fl_Window *)w)->size_range(gridx, gridy, Fl::w(), Fl::h(), + gridx, gridy, 0); + } + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void w_cb(Fl_Value_Input *i, void *v) { + if (v == LOAD) { + w_input = i; + if (current_widget->is_widget()) { + i->value(((Fl_Widget_Type *)current_widget)->o->w()); + w_input->activate(); + } else w_input->deactivate(); + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + w->resize(w->x(), w->y(), (int)i->value(), w->h()); + if (w->window()) w->window()->redraw(); + if (o->is_window()) { + ((Fl_Window *)w)->size_range(gridx, gridy, Fl::w(), Fl::h(), + gridx, gridy, 0); + } + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void h_cb(Fl_Value_Input *i, void *v) { + if (v == LOAD) { + h_input = i; + if (current_widget->is_widget()) { + i->value(((Fl_Widget_Type *)current_widget)->o->h()); + h_input->activate(); + } else h_input->deactivate(); + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + w->resize(w->x(), w->y(), w->w(), (int)i->value()); + if (w->window()) w->window()->redraw(); + if (o->is_window()) { + ((Fl_Window *)w)->size_range(gridx, gridy, Fl::w(), Fl::h(), + gridx, gridy, 0); + } + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void wc_relative_cb(Fl_Light_Button *i, void *v) { + if (v == LOAD) { + if (!strcmp(current_widget->type_name(), "widget_class")) { + i->show(); + i->value(((Fl_Widget_Class_Type *)current_widget)->wc_relative); + } else { + i->hide(); + } + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && !strcmp(current_widget->type_name(), "widget_class")) { + Fl_Widget_Class_Type *t = (Fl_Widget_Class_Type *)o; + t->wc_relative = i->value(); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +//////////////////////////////////////////////////////////////// + +// turn number to string or string to number for saving to file: +// does not work for hierarchial menus! + +const char *item_name(Fl_Menu_Item* m, int i) { + if (m) { + while (m->label()) { + if (m->argument() == i) return m->label(); + m++; + } + } + static char buffer[20]; + sprintf(buffer, "%d", i); + return buffer; +} +int item_number(Fl_Menu_Item* m, const char* i) { + if (m && i) { + if (i[0]=='F' && i[1]=='L' && i[2]=='_') i += 3; + while (m->label()) { + if (!strcmp(m->label(), i)) return int(m->argument()); + m++; + } + } + return atoi(i); +} + +#define ZERO_ENTRY 1000 + +Fl_Menu_Item boxmenu[] = { +{"NO_BOX",0,0,(void *)ZERO_ENTRY}, +{"boxes",0,0,0,FL_SUBMENU}, +{"UP_BOX",0,0,(void *)FL_UP_BOX}, +{"DOWN_BOX",0,0,(void *)FL_DOWN_BOX}, +{"FLAT_BOX",0,0,(void *)FL_FLAT_BOX}, +{"BORDER_BOX",0,0,(void *)FL_BORDER_BOX}, +{"THIN_UP_BOX",0,0,(void *)FL_THIN_UP_BOX}, +{"THIN_DOWN_BOX",0,0,(void *)FL_THIN_DOWN_BOX}, +{"ENGRAVED_BOX",0,0,(void *)FL_ENGRAVED_BOX}, +{"EMBOSSED_BOX",0,0,(void *)FL_EMBOSSED_BOX}, +{"ROUND_UP_BOX",0,0,(void *)FL_ROUND_UP_BOX}, +{"ROUND_DOWN_BOX",0,0,(void *)FL_ROUND_DOWN_BOX}, +{"DIAMOND_UP_BOX",0,0,(void *)FL_DIAMOND_UP_BOX}, +{"DIAMOND_DOWN_BOX",0,0,(void *)FL_DIAMOND_DOWN_BOX}, +{"SHADOW_BOX",0,0,(void *)FL_SHADOW_BOX}, +{"ROUNDED_BOX",0,0,(void *)FL_ROUNDED_BOX}, +{"RSHADOW_BOX",0,0,(void *)FL_RSHADOW_BOX}, +{"RFLAT_BOX",0,0,(void *)FL_RFLAT_BOX}, +{"OVAL_BOX",0,0,(void *)FL_OVAL_BOX}, +{"OSHADOW_BOX",0,0,(void *)FL_OSHADOW_BOX}, +{"OFLAT_BOX",0,0,(void *)FL_OFLAT_BOX}, +{"PLASTIC_UP_BOX",0,0,(void *)FL_PLASTIC_UP_BOX}, +{"PLASTIC_DOWN_BOX",0,0,(void *)FL_PLASTIC_DOWN_BOX}, +{"PLASTIC_THIN_UP_BOX",0,0,(void *)FL_PLASTIC_THIN_UP_BOX}, +{"PLASTIC_THIN_DOWN_BOX",0,0,(void *)FL_PLASTIC_THIN_DOWN_BOX}, +{"PLASTIC_ROUND_UP_BOX",0,0,(void *)FL_PLASTIC_ROUND_UP_BOX}, +{"PLASTIC_ROUND_DOWN_BOX",0,0,(void *)FL_PLASTIC_ROUND_DOWN_BOX}, +{"GTK_UP_BOX",0,0,(void *)FL_GTK_UP_BOX}, +{"GTK_DOWN_BOX",0,0,(void *)FL_GTK_DOWN_BOX}, +{"GTK_THIN_UP_BOX",0,0,(void *)FL_GTK_THIN_UP_BOX}, +{"GTK_THIN_DOWN_BOX",0,0,(void *)FL_GTK_THIN_DOWN_BOX}, +{"GTK_ROUND_UP_BOX",0,0,(void *)FL_GTK_ROUND_UP_BOX}, +{"GTK_ROUND_DOWN_BOX",0,0,(void *)FL_GTK_ROUND_DOWN_BOX}, +{0}, +{"frames",0,0,0,FL_SUBMENU}, +{"UP_FRAME",0,0,(void *)FL_UP_FRAME}, +{"DOWN_FRAME",0,0,(void *)FL_DOWN_FRAME}, +{"THIN_UP_FRAME",0,0,(void *)FL_THIN_UP_FRAME}, +{"THIN_DOWN_FRAME",0,0,(void *)FL_THIN_DOWN_FRAME}, +{"ENGRAVED_FRAME",0,0,(void *)FL_ENGRAVED_FRAME}, +{"EMBOSSED_FRAME",0,0,(void *)FL_EMBOSSED_FRAME}, +{"BORDER_FRAME",0,0,(void *)FL_BORDER_FRAME}, +{"SHADOW_FRAME",0,0,(void *)FL_SHADOW_FRAME}, +{"ROUNDED_FRAME",0,0,(void *)FL_ROUNDED_FRAME}, +{"OVAL_FRAME",0,0,(void *)FL_OVAL_FRAME}, +{"PLASTIC_UP_FRAME",0,0,(void *)FL_PLASTIC_UP_FRAME}, +{"PLASTIC_DOWN_FRAME",0,0,(void *)FL_PLASTIC_DOWN_FRAME}, +{"GTK_UP_FRAME",0,0,(void *)FL_GTK_UP_FRAME}, +{"GTK_DOWN_FRAME",0,0,(void *)FL_GTK_DOWN_FRAME}, +{"GTK_THIN_UP_FRAME",0,0,(void *)FL_GTK_THIN_UP_FRAME}, +{"GTK_THIN_DOWN_FRAME",0,0,(void *)FL_GTK_THIN_DOWN_FRAME}, +{0}, +{0}}; + +const char *boxname(int i) { + if (!i) i = ZERO_ENTRY; + for (int j = 0; j < int(sizeof(boxmenu)/sizeof(*boxmenu)); j++) + if (boxmenu[j].argument() == i) return boxmenu[j].label(); + return 0; +} + +int boxnumber(const char *i) { + if (i[0]=='F' && i[1]=='L' && i[2]=='_') i += 3; + for (int j = 0; j < int(sizeof(boxmenu)/sizeof(*boxmenu)); j++) + if (boxmenu[j].label() && !strcmp(boxmenu[j].label(), i)) { + return int(boxmenu[j].argument()); + } + return 0; +} + +void box_cb(Fl_Choice* i, void *v) { + if (v == LOAD) { + if (current_widget->is_menu_item()) {i->deactivate(); return;} else i->activate(); + int n = current_widget->o->box(); if (!n) n = ZERO_ENTRY; + for (int j = 0; j < int(sizeof(boxmenu)/sizeof(*boxmenu)); j++) + if (boxmenu[j].argument() == n) {i->value(j); break;} + } else { + int mod = 0; + int m = i->value(); + int n = int(boxmenu[m].argument()); + if (!n) return; // should not happen + if (n == ZERO_ENTRY) n = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + q->o->box((Fl_Boxtype)n); + q->redraw(); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void down_box_cb(Fl_Choice* i, void *v) { + if (v == LOAD) { + int n; + if (current_widget->is_button() && !current_widget->is_menu_item()) + n = ((Fl_Button*)(current_widget->o))->down_box(); + else if (!strcmp(current_widget->type_name(), "Fl_Input_Choice")) + n = ((Fl_Input_Choice*)(current_widget->o))->down_box(); + else if (current_widget->is_menu_button()) + n = ((Fl_Menu_*)(current_widget->o))->down_box(); + else { + i->deactivate(); return; + } + i->activate(); + if (!n) n = ZERO_ENTRY; + for (int j = 0; j < int(sizeof(boxmenu)/sizeof(*boxmenu)); j++) + if (boxmenu[j].argument() == n) {i->value(j); break;} + } else { + int mod = 0; + int m = i->value(); + int n = int(boxmenu[m].argument()); + if (!n) return; // should not happen + if (n == ZERO_ENTRY) n = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected) { + if (o->is_button() && !o->is_menu_item()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + ((Fl_Button*)(q->o))->down_box((Fl_Boxtype)n); + if (((Fl_Button*)(q->o))->value()) q->redraw(); + } else if (!strcmp(o->type_name(), "Fl_Input_Choice")) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + ((Fl_Input_Choice*)(q->o))->down_box((Fl_Boxtype)n); + } else if (o->is_menu_button()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + ((Fl_Menu_*)(q->o))->down_box((Fl_Boxtype)n); + } + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +//////////////////////////////////////////////////////////////// + +Fl_Menu_Item whenmenu[] = { + {"Never",0,0,(void*)ZERO_ENTRY}, + {"Release",0,0,(void*)FL_WHEN_RELEASE}, + {"Changed",0,0,(void*)FL_WHEN_CHANGED}, + {"Enter key",0,0,(void*)FL_WHEN_ENTER_KEY}, + //{"Release or Enter",0,0,(void*)(FL_WHEN_ENTER_KEY|FL_WHEN_RELEASE)}, + {0}}; + +static Fl_Menu_Item whensymbolmenu[] = { + {"FL_WHEN_NEVER",0,0,(void*)(FL_WHEN_NEVER)}, + {"FL_WHEN_CHANGED",0,0,(void*)(FL_WHEN_CHANGED)}, + {"FL_WHEN_RELEASE",0,0,(void*)(FL_WHEN_RELEASE)}, + {"FL_WHEN_RELEASE_ALWAYS",0,0,(void*)(FL_WHEN_RELEASE_ALWAYS)}, + {"FL_WHEN_ENTER_KEY",0,0,(void*)(FL_WHEN_ENTER_KEY)}, + {"FL_WHEN_ENTER_KEY_ALWAYS",0,0,(void*)(FL_WHEN_ENTER_KEY_ALWAYS)}, + {0}}; + +void when_cb(Fl_Choice* i, void *v) { + if (v == LOAD) { + if (current_widget->is_menu_item()) {i->deactivate(); return;} else i->activate(); + int n = current_widget->o->when() & (~FL_WHEN_NOT_CHANGED); + if (!n) n = ZERO_ENTRY; + for (int j = 0; j < int(sizeof(whenmenu)/sizeof(*whenmenu)); j++) + if (whenmenu[j].argument() == n) {i->value(j); break;} + } else { + int mod = 0; + int m = i->value(); + int n = int(whenmenu[m].argument()); + if (!n) return; // should not happen + if (n == ZERO_ENTRY) n = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + q->o->when(n|(q->o->when()&FL_WHEN_NOT_CHANGED)); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void when_button_cb(Fl_Light_Button* i, void *v) { + if (v == LOAD) { + if (current_widget->is_menu_item()) {i->deactivate(); return;} else i->activate(); + i->value(current_widget->o->when()&FL_WHEN_NOT_CHANGED); + } else { + int mod = 0; + int n = i->value() ? FL_WHEN_NOT_CHANGED : 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + q->o->when(n|(q->o->when()&~FL_WHEN_NOT_CHANGED)); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +uchar Fl_Widget_Type::resizable() const { + if (is_window()) return ((Fl_Window*)o)->resizable() != 0; + Fl_Group* p = (Fl_Group*)o->parent(); + if (p) return p->resizable() == o; + else return 0; +} + +void Fl_Widget_Type::resizable(uchar v) { + if (v) { + if (resizable()) return; + if (is_window()) ((Fl_Window*)o)->resizable(o); + else { + Fl_Group* p = (Fl_Group*)o->parent(); + if (p) p->resizable(o); + } + } else { + if (!resizable()) return; + if (is_window()) { + ((Fl_Window*)o)->resizable(0); + } else { + Fl_Group* p = (Fl_Group*)o->parent(); + if (p) p->resizable(0); + } + } +} + +void resizable_cb(Fl_Light_Button* i,void* v) { + if (v == LOAD) { + if (current_widget->is_menu_item()) {i->deactivate(); return;} + if (numselected > 1) {i->deactivate(); return;} + i->activate(); + i->value(current_widget->resizable()); + } else { + current_widget->resizable(i->value()); + set_modflag(1); + } +} + +void hotspot_cb(Fl_Light_Button* i,void* v) { + if (v == LOAD) { + if (numselected > 1) {i->deactivate(); return;} + if (current_widget->is_menu_item()) i->label("divider"); + else i->label("hotspot"); + i->activate(); + i->value(current_widget->hotspot()); + } else { + current_widget->hotspot(i->value()); + if (current_widget->is_menu_item()) {current_widget->redraw(); return;} + if (i->value()) { + Fl_Type *p = current_widget->parent; + if (!p || !p->is_widget()) return; + while (!p->is_window()) p = p->parent; + for (Fl_Type *o = p->next; o && o->level > p->level; o = o->next) { + if (o->is_widget() && o != current_widget) + ((Fl_Widget_Type*)o)->hotspot(0); + } + } + set_modflag(1); + } +} + +void visible_cb(Fl_Light_Button* i, void* v) { + if (v == LOAD) { + i->value(current_widget->o->visible()); + if (current_widget->is_window()) i->deactivate(); + else i->activate(); + } else { + int mod = 0; + int n = i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + n ? q->o->show() : q->o->hide(); + q->redraw(); + mod = 1; + if (n && q->parent && q->parent->type_name()) { + if (!strcmp(q->parent->type_name(), "Fl_Tabs")) { + ((Fl_Tabs *)q->o->parent())->value(q->o); + } else if (!strcmp(q->parent->type_name(), "Fl_Wizard")) { + ((Fl_Wizard *)q->o->parent())->value(q->o); + } + } + } + } + if (mod) set_modflag(1); + } +} + +void active_cb(Fl_Light_Button* i, void* v) { + if (v == LOAD) { + i->value(current_widget->o->active()); + if (current_widget->is_window()) i->deactivate(); + else i->activate(); + } else { + int mod = 0; + int n = i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + n ? q->o->activate() : q->o->deactivate(); + q->redraw(); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +//////////////////////////////////////////////////////////////// + +Fl_Menu_Item fontmenu[] = { +{"Helvetica"}, +{"Helvetica bold"}, +{"Helvetica italic"}, +{"Helvetica bold italic"}, +{"Courier"}, +{"Courier bold"}, +{"Courier italic"}, +{"Courier bold italic"}, +{"Times"}, +{"Times bold"}, +{"Times italic"}, +{"Times bold italic"}, +{"Symbol"}, +{"Terminal"}, +{"Terminal Bold"}, +{"Zapf Dingbats"}, +{0}}; + +void labelfont_cb(Fl_Choice* i, void *v) { + if (v == LOAD) { + int n = current_widget->o->labelfont(); + if (n > 15) n = 0; + i->value(n); + } else { + int mod = 0; + int n = i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + q->o->labelfont(n); + q->redraw(); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void labelsize_cb(Fl_Value_Input* i, void *v) { + int n; + if (v == LOAD) { + n = current_widget->o->labelsize(); + } else { + int mod = 0; + n = int(i->value()); + if (n <= 0) n = Fl_Widget_Type::default_size; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + q->o->labelsize(n); + q->redraw(); + mod = 1; + } + } + if (mod) set_modflag(1); + } + i->value(n); +} + +extern const char *ui_find_image_name; + +Fl_Menu_Item labeltypemenu[] = { + {"NORMAL_LABEL",0,0,(void*)0}, + {"SHADOW_LABEL",0,0,(void*)FL_SHADOW_LABEL}, + {"ENGRAVED_LABEL",0,0,(void*)FL_ENGRAVED_LABEL}, + {"EMBOSSED_LABEL",0,0,(void*)FL_EMBOSSED_LABEL}, + {"NO_LABEL",0,0,(void*)(FL_NO_LABEL)}, +{0}}; + +void labeltype_cb(Fl_Choice* i, void *v) { + if (v == LOAD) { + int n; + n = current_widget->o->labeltype(); + i->when(FL_WHEN_RELEASE); + for (int j = 0; j < int(sizeof(labeltypemenu)/sizeof(*labeltypemenu)); j++) + if (labeltypemenu[j].argument() == n) {i->value(j); break;} + } else { + int mod = 0; + int m = i->value(); + int n = int(labeltypemenu[m].argument()); + if (n<0) return; // should not happen + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* p = (Fl_Widget_Type*)o; + p->o->labeltype((Fl_Labeltype)n); + p->redraw(); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +//////////////////////////////////////////////////////////////// + +void color_cb(Fl_Button* i, void *v) { + Fl_Color c = current_widget->o->color(); + if (v == LOAD) { + if (current_widget->is_menu_item()) {i->deactivate(); return;} else i->activate(); + } else { + int mod = 0; + Fl_Color d = fl_show_colormap(c); + if (d == c) return; + c = d; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + q->o->color(c); q->o->redraw(); + if (q->parent && q->parent->type_name() == tabs_type_name) { + if (q->o->parent()) q->o->parent()->redraw(); + } + mod = 1; + } + } + if (mod) set_modflag(1); + } + i->color(c); i->labelcolor(fl_contrast(FL_BLACK,c)); i->redraw(); +} + +void color2_cb(Fl_Button* i, void *v) { + Fl_Color c = current_widget->o->selection_color(); + if (v == LOAD) { + if (current_widget->is_menu_item()) {i->deactivate(); return;} else i->activate(); + } else { + int mod = 0; + Fl_Color d = fl_show_colormap(c); + if (d == c) return; + c = d; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + q->o->selection_color(c); q->o->redraw(); + mod = 1; + } + } + if (mod) set_modflag(1); + } + i->color(c); i->labelcolor(fl_contrast(FL_BLACK,c)); i->redraw(); +} + +void labelcolor_cb(Fl_Button* i, void *v) { + Fl_Color c = current_widget->o->labelcolor(); + if (v != LOAD) { + int mod = 0; + Fl_Color d = fl_show_colormap(c); + if (d == c) return; + c = d; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + q->o->labelcolor(c); q->redraw(); + mod = 1; + } + } + if (mod) set_modflag(1); + } + i->color(c); i->labelcolor(fl_contrast(FL_BLACK,c)); i->redraw(); +} + +static Fl_Button* relative(Fl_Widget* o, int i) { + Fl_Group* g = (Fl_Group*)(o->parent()); + return (Fl_Button*)(g->child(g->find(*o)+i)); +} + +static Fl_Menu_Item alignmenu[] = { + {"FL_ALIGN_CENTER",0,0,(void*)(FL_ALIGN_CENTER)}, + {"FL_ALIGN_TOP",0,0,(void*)(FL_ALIGN_TOP)}, + {"FL_ALIGN_BOTTOM",0,0,(void*)(FL_ALIGN_BOTTOM)}, + {"FL_ALIGN_LEFT",0,0,(void*)(FL_ALIGN_LEFT)}, + {"FL_ALIGN_RIGHT",0,0,(void*)(FL_ALIGN_RIGHT)}, + {"FL_ALIGN_INSIDE",0,0,(void*)(FL_ALIGN_INSIDE)}, + {"FL_ALIGN_CLIP",0,0,(void*)(FL_ALIGN_CLIP)}, + {"FL_ALIGN_WRAP",0,0,(void*)(FL_ALIGN_WRAP)}, + {"FL_ALIGN_TEXT_OVER_IMAGE",0,0,(void*)(FL_ALIGN_TEXT_OVER_IMAGE)}, + {"FL_ALIGN_TOP_LEFT",0,0,(void*)(FL_ALIGN_TOP_LEFT)}, + {"FL_ALIGN_TOP_RIGHT",0,0,(void*)(FL_ALIGN_TOP_RIGHT)}, + {"FL_ALIGN_BOTTOM_LEFT",0,0,(void*)(FL_ALIGN_BOTTOM_LEFT)}, + {"FL_ALIGN_BOTTOM_RIGHT",0,0,(void*)(FL_ALIGN_BOTTOM_RIGHT)}, + {"FL_ALIGN_LEFT_TOP",0,0,(void*)(FL_ALIGN_LEFT_TOP)}, + {"FL_ALIGN_RIGHT_TOP",0,0,(void*)(FL_ALIGN_RIGHT_TOP)}, + {"FL_ALIGN_LEFT_BOTTOM",0,0,(void*)(FL_ALIGN_LEFT_BOTTOM)}, + {"FL_ALIGN_RIGHT_BOTTOM",0,0,(void*)(FL_ALIGN_RIGHT_BOTTOM)}, +{0}}; + +void align_cb(Fl_Button* i, void *v) { + int b = int(long(i->user_data())); + if (v == LOAD) { + if (current_widget->is_menu_item()) {i->deactivate(); return;} else i->activate(); + i->value(current_widget->o->align() & b); + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + int x = q->o->align(); + int y; + if (i->value()) { + y = x | b; + if (b == FL_ALIGN_LEFT || b == FL_ALIGN_TOP) { + Fl_Button *b1 = relative(i,+1); + b1->clear(); + y = y & ~(b1->argument()); + } + if (b == FL_ALIGN_RIGHT || b == FL_ALIGN_BOTTOM) { + Fl_Button *b1 = relative(i,-1); + b1->clear(); + y = y & ~(b1->argument()); + } + } else { + y = x & ~b; + } + if (x != y) { + q->o->align(y); + q->redraw(); + mod = 1; + } + } + } + if (mod) set_modflag(1); + } +} + +//////////////////////////////////////////////////////////////// + +void callback_cb(CodeEditor* i, void *v) { + if (v == LOAD) { + const char *cbtext = current_widget->callback(); + i->buffer()->text( cbtext ? cbtext : "" ); + } else { + int mod = 0; + char *c = i->buffer()->text(); + const char *d = c_check(c); + if (d) { + fl_message("Error in callback: %s",d); + if (i->window()) i->window()->make_current(); + haderror = 1; + } + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected) { + o->callback(c); + mod = 1; + } + } + if (mod) set_modflag(1); + free(c); + } +} + +void user_data_cb(Fl_Input *i, void *v) { + if (v == LOAD) { + i->static_value(current_widget->user_data()); + } else { + int mod = 0; + const char *c = i->value(); + const char *d = c_check(c); + if (d) {fl_message("Error in user_data: %s",d); haderror = 1; return;} + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected) { + o->user_data(c); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void user_data_type_cb(Fl_Input *i, void *v) { + static const char *dflt = "void*"; + if (v == LOAD) { + const char *c = current_widget->user_data_type(); + if (!c) c = dflt; + i->static_value(c); + } else { + int mod = 0; + const char *c = i->value(); + const char *d = c_check(c); + if (!*c) i->value(dflt); + else if (!strcmp(c,dflt)) c = 0; + if (!d) { + if (c && *c && c[strlen(c)-1] != '*' && strcmp(c,"long")) + d = "must be pointer or long"; + } + if (d) {fl_message("Error in type: %s",d); haderror = 1; return;} + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected) { + o->user_data_type(c); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +// "v_attributes" let user type in random code for attribute settings: + +void v_input_cb(Fl_Input* i, void* v) { + int n = int(long(i->user_data())); + if (v == LOAD) { + i->static_value(current_widget->extra_code(n)); + } else { + int mod = 0; + const char *c = i->value(); + const char *d = c_check(c&&c[0]=='#' ? c+1 : c); + if (d) {fl_message("Error in %s: %s",i->label(),d); haderror = 1; return;} + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type *t = (Fl_Widget_Type*)o; + t->extra_code(n,c); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void subclass_cb(Fl_Input* i, void* v) { + if (v == LOAD) { + if (current_widget->is_menu_item()) {i->deactivate(); return;} else i->activate(); + i->static_value(current_widget->subclass()); + } else { + int mod = 0; + const char *c = i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type *t = (Fl_Widget_Type*)o; + t->subclass(c); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +//////////////////////////////////////////////////////////////// + +// textstuff: set textfont, textsize, textcolor attributes: + +// default widget returns 0 to indicate not-implemented: +int Fl_Widget_Type::textstuff(int, Fl_Font&, int&, Fl_Color&) {return 0;} + +void textfont_cb(Fl_Choice* i, void* v) { + Fl_Font n; int s; Fl_Color c; + if (v == LOAD) { + if (!current_widget->textstuff(0,n,s,c)) {i->deactivate(); return;} + i->activate(); + if (n > 15) n = FL_HELVETICA; + i->value(n); + } else { + int mod = 0; + n = (Fl_Font)i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + q->textstuff(1,n,s,c); + q->o->redraw(); + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void textsize_cb(Fl_Value_Input* i, void* v) { + Fl_Font n; int s; Fl_Color c; + if (v == LOAD) { + if (!current_widget->textstuff(0,n,s,c)) {i->deactivate(); return;} + i->activate(); + } else { + int mod = 0; + s = int(i->value()); + if (s <= 0) s = Fl_Widget_Type::default_size; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + q->textstuff(2,n,s,c); + q->o->redraw(); + mod = 1; + } + } + if (mod) set_modflag(1); + } + i->value(s); +} + +void textcolor_cb(Fl_Button* i, void* v) { + Fl_Font n; int s; Fl_Color c; + if (v == LOAD) { + if (!current_widget->textstuff(0,n,s,c)) {i->deactivate(); return;} + i->activate(); + } else { + int mod = 0; + c = i->color(); + Fl_Color d = fl_show_colormap(c); + if (d == c) return; + c = d; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + q->textstuff(3,n,s,c); q->o->redraw(); + mod = 1; + } + } + if (mod) set_modflag(1); + } + i->color(c); i->labelcolor(fl_contrast(FL_BLACK,c)); i->redraw(); +} + +//////////////////////////////////////////////////////////////// +// Kludges to the panel for subclasses: + +void min_w_cb(Fl_Value_Input* i, void* v) { + if (v == LOAD) { + if (!current_widget->is_window()) {i->parent()->hide(); return;} + i->parent()->show(); + i->value(((Fl_Window_Type*)current_widget)->sr_min_w); + } else { + int mod = 0; + int n = (int)i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_window()) { + ((Fl_Window_Type*)current_widget)->sr_min_w = n; + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void min_h_cb(Fl_Value_Input* i, void* v) { + if (v == LOAD) { + if (!current_widget->is_window()) return; + i->value(((Fl_Window_Type*)current_widget)->sr_min_h); + } else { + int mod = 0; + int n = (int)i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_window()) { + ((Fl_Window_Type*)current_widget)->sr_min_h = n; + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void max_w_cb(Fl_Value_Input* i, void* v) { + if (v == LOAD) { + if (!current_widget->is_window()) return; + i->value(((Fl_Window_Type*)current_widget)->sr_max_w); + } else { + int mod = 0; + int n = (int)i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_window()) { + ((Fl_Window_Type*)current_widget)->sr_max_w = n; + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void max_h_cb(Fl_Value_Input* i, void* v) { + if (v == LOAD) { + if (!current_widget->is_window()) return; + i->value(((Fl_Window_Type*)current_widget)->sr_max_h); + } else { + int mod = 0; + int n = (int)i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_window()) { + ((Fl_Window_Type*)current_widget)->sr_max_h = n; + mod = 1; + } + } + if (mod) set_modflag(1); + } +} + +void set_min_size_cb(Fl_Button*, void* v) { + if (v == LOAD) { + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_window()) { + Fl_Window_Type *win = (Fl_Window_Type*)current_widget; + win->sr_min_w = win->o->w(); + win->sr_min_h = win->o->h(); + mod = 1; + } + } + propagate_load(the_panel, LOAD); + if (mod) set_modflag(1); + } +} + +void set_max_size_cb(Fl_Button*, void* v) { + if (v == LOAD) { + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_window()) { + Fl_Window_Type *win = (Fl_Window_Type*)current_widget; + win->sr_max_w = win->o->w(); + win->sr_max_h = win->o->h(); + mod = 1; + } + } + propagate_load(the_panel, LOAD); + if (mod) set_modflag(1); + } +} + +void slider_size_cb(Fl_Value_Input* i, void* v) { + if (v == LOAD) { + if (current_widget->is_window()) + i->parent()->hide(); + else + i->parent()->show(); + if (current_widget->is_valuator()<2) {i->deactivate(); return;} + i->activate(); + i->value(((Fl_Slider*)(current_widget->o))->slider_size()); + } else { + int mod = 0; + double n = i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + if (q->is_valuator()>=2) { + ((Fl_Slider*)(q->o))->slider_size(n); + q->o->redraw(); + mod = 1; + } + } + } + if (mod) set_modflag(1); + } +} + +void min_cb(Fl_Value_Input* i, void* v) { + if (v == LOAD) { + if (current_widget->is_valuator()) { + i->activate(); + i->value(((Fl_Valuator*)(current_widget->o))->minimum()); + } else if (current_widget->is_spinner()) { + i->activate(); + i->value(((Fl_Spinner*)(current_widget->o))->minimum()); + } else { + i->deactivate(); + return; + } + } else { + int mod = 0; + double n = i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + if (q->is_valuator()) { + ((Fl_Valuator*)(q->o))->minimum(n); + q->o->redraw(); + mod = 1; + } else if (q->is_spinner()) { + ((Fl_Spinner*)(q->o))->minimum(n); + q->o->redraw(); + mod = 1; + } + } + } + if (mod) set_modflag(1); + } +} + +void max_cb(Fl_Value_Input* i, void* v) { + if (v == LOAD) { + if (current_widget->is_valuator()) { + i->activate(); + i->value(((Fl_Valuator*)(current_widget->o))->maximum()); + } else if (current_widget->is_spinner()) { + i->activate(); + i->value(((Fl_Spinner*)(current_widget->o))->maximum()); + } else { + i->deactivate(); + return; + } + } else { + int mod = 0; + double n = i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + if (q->is_valuator()) { + ((Fl_Valuator*)(q->o))->maximum(n); + q->o->redraw(); + mod = 1; + } else if (q->is_spinner()) { + ((Fl_Spinner*)(q->o))->maximum(n); + q->o->redraw(); + mod = 1; + } + } + } + if (mod) set_modflag(1); + } +} + +void step_cb(Fl_Value_Input* i, void* v) { + if (v == LOAD) { + if (current_widget->is_valuator()) { + i->activate(); + i->value(((Fl_Valuator*)(current_widget->o))->step()); + } else if (current_widget->is_spinner()) { + i->activate(); + i->value(((Fl_Spinner*)(current_widget->o))->step()); + } else { + i->deactivate(); + return; + } + } else { + int mod = 0; + double n = i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + if (q->is_valuator()) { + ((Fl_Valuator*)(q->o))->step(n); + q->o->redraw(); + mod = 1; + } else if (q->is_spinner()) { + ((Fl_Spinner*)(q->o))->step(n); + q->o->redraw(); + mod = 1; + } + } + } + if (mod) set_modflag(1); + } +} + +void value_cb(Fl_Value_Input* i, void* v) { + if (v == LOAD) { + if (current_widget->is_valuator()) { + i->activate(); + i->value(((Fl_Valuator*)(current_widget->o))->value()); + } else if (current_widget->is_button()) { + i->activate(); + i->value(((Fl_Button*)(current_widget->o))->value()); + } else if (current_widget->is_spinner()) { + i->activate(); + i->value(((Fl_Spinner*)(current_widget->o))->value()); + } else + i->deactivate(); + } else { + int mod = 0; + double n = i->value(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + if (q->is_valuator()) { + ((Fl_Valuator*)(q->o))->value(n); + mod = 1; + } else if (q->is_button()) { + ((Fl_Button*)(q->o))->value(n != 0); + if (q->is_menu_item()) q->redraw(); + mod = 1; + } else if (q->is_spinner()) { + ((Fl_Spinner*)(q->o))->value(n); + mod = 1; + } + } + } + if (mod) set_modflag(1); + } +} + +//////////////////////////////////////////////////////////////// + +// subtypes: + +Fl_Menu_Item *Fl_Widget_Type::subtypes() {return 0;} + +void subtype_cb(Fl_Choice* i, void* v) { + if (v == LOAD) { + Fl_Menu_Item* m = current_widget->subtypes(); + if (!m) {i->deactivate(); return;} + i->menu(m); + int j; + for (j = 0;; j++) { + if (!m[j].text) {j = 0; break;} + if (current_widget->is_spinner()) { + if (m[j].argument() == ((Fl_Spinner*)current_widget->o)->type()) break; + } else { + if (m[j].argument() == current_widget->o->type()) break; + } + } + i->value(j); + i->activate(); + i->redraw(); + } else { + int mod = 0; + int n = int(i->mvalue()->argument()); + Fl_Menu_Item* m = current_widget->subtypes(); + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + Fl_Widget_Type* q = (Fl_Widget_Type*)o; + if (q->subtypes()==m) { + if (q->is_spinner()) + ((Fl_Spinner*)q->o)->type(n); + else + q->o->type(n); + q->redraw(); + mod = 1; + } + } + } + if (mod) set_modflag(1); + } +} + +//////////////////////////////////////////////////////////////// + +void propagate_load(Fl_Group* g, void* v) { + if (v == LOAD) { + Fl_Widget*const* a = g->array(); + for (int i=g->children(); i--;) { + Fl_Widget* o = *a++; + o->do_callback(o,LOAD); + } + } +} + +void set_cb(Fl_Button*, void*) { + haderror = 0; + Fl_Widget*const* a = the_panel->array(); + for (int i=the_panel->children(); i--;) { + Fl_Widget* o = *a++; + if (o->changed()) { + o->do_callback(); + if (haderror) return; + o->clear_changed(); + } + } +} + +void ok_cb(Fl_Return_Button* o, void* v) { + set_cb(o,v); + if (!haderror) the_panel->hide(); +} + +void revert_cb(Fl_Button*, void*) { + // We have to revert all dynamically changing fields: + // but for now only the first label works... + if (numselected == 1) current_widget->label(oldlabel); + propagate_load(the_panel, LOAD); +} + +void cancel_cb(Fl_Button* o, void* v) { + revert_cb(o,v); + the_panel->hide(); +} + +void toggle_overlays(Fl_Widget *,void *); // in Fl_Window_Type.cxx +void overlay_cb(Fl_Button*o,void *v) { + toggle_overlays(o,v); +} + +void leave_live_mode_cb(Fl_Widget*, void*); + +void live_mode_cb(Fl_Button*o,void *) { + /// \todo live mode should end gracefully when the application quits + /// or when the user closes the live widget + static Fl_Type *live_type = 0L; + static Fl_Widget *live_widget = 0L; + static Fl_Window *live_window = 0L; + // if 'o' is 0, we must quit live mode + if (!o) { + o = wLiveMode; + o->value(0); + } + if (o->value()) { + if (numselected == 1) { + live_widget = current_widget->enter_live_mode(1); + if (live_widget) { + live_type = current_widget; + Fl_Group::current(0); + int w = live_widget->w(); + int h = live_widget->h(); + live_window = new Fl_Double_Window(w+20, h+55, "Fluid Live Mode Widget"); + live_window->box(FL_FLAT_BOX); + live_window->color(FL_GREEN); + Fl_Group *rsz = new Fl_Group(0, h+20, 130, 35); + rsz->box(FL_NO_BOX); + Fl_Box *rsz_dummy = new Fl_Box(110, h+20, 1, 25); + rsz_dummy->box(FL_NO_BOX); + rsz->resizable(rsz_dummy); + Fl_Button *btn = new Fl_Button(10, h+20, 100, 25, "Exit Live Mode"); + btn->labelsize(12); + btn->callback(leave_live_mode_cb); + live_widget->position(10, 10); + live_window->add(live_widget); + live_window->resizable(live_widget); + live_window->set_modal(); // block all other UI + live_window->callback(leave_live_mode_cb); + if (current_widget->is_window()) { + Fl_Window_Type *w = (Fl_Window_Type*)current_widget; + int mw = w->sr_min_w; if (mw>0) mw += 20; + int mh = w->sr_min_h; if (mh>0) mh += 55; + int MW = w->sr_max_w; if (MW>0) MW += 20; + int MH = w->sr_max_h; if (MH>2) MH += 55; + if (mw || mh || MW || MH) + live_window->size_range(mw, mh, MW, MH); + } + live_window->show(); + } else o->value(0); + } else o->value(0); + } else { + if (live_type) + live_type->leave_live_mode(); + if (live_window) { + live_window->hide(); + Fl::delete_widget(live_window); + } + live_type = 0L; + live_widget = 0L; + live_window = 0L; + } +} + +// update the panel according to current widget set: +static void load_panel() { + if (!the_panel) return; + + // find all the Fl_Widget subclasses currently selected: + numselected = 0; + current_widget = 0; + if (Fl_Type::current) { + if (Fl_Type::current->is_widget()) + current_widget=(Fl_Widget_Type*)Fl_Type::current; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->is_widget() && o->selected) { + numselected++; + if (!current_widget) current_widget = (Fl_Widget_Type*)o; + } + } + } + if (numselected) + propagate_load(the_panel, LOAD); + else + the_panel->hide(); +} + +// This is called when user double-clicks an item, open or update the panel: +void Fl_Widget_Type::open() { + if (!the_panel) the_panel = make_widget_panel(); + load_panel(); + if (numselected) the_panel->show(); +} + +Fl_Type *Fl_Type::current; + +extern void redraw_overlays(); +extern void redraw_browser(); +extern void update_sourceview_position(); + +// Called when ui changes what objects are selected: +// p is selected object, null for all deletions (we must throw away +// old panel in that case, as the object may no longer exist) +void selection_changed(Fl_Type *p) { + // store all changes to the current selected objects: + if (p && the_panel && the_panel->visible()) { + set_cb(0,0); + // if there was an error, we try to leave the selected set unchanged: + if (haderror) { + Fl_Type *q = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + o->new_selected = o->selected; + if (!q && o->selected) q = o; + } + if (!p || !p->selected) p = q; + Fl_Type::current = p; + redraw_browser(); + return; + } + } + // update the selected flags to new set: + Fl_Type *q = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + o->selected = o->new_selected; + if (!q && o->selected) q = o; + } + if (!p || !p->selected) p = q; + Fl_Type::current = p; + redraw_overlays(); + // load the panel with the new settings: + load_panel(); + // update the source viewer to show the code for the selected object + update_sourceview_position(); +} + +//////////////////////////////////////////////////////////////// +// Writing the C code: + +// test to see if user named a function, or typed in code: +int is_name(const char *c) { + for (; *c; c++) if (ispunct(*c) && *c!='_' && *c!=':') return 0; + return 1; +} + +// Test to see if name() is an array entry. If so, and this is the +// highest number, return name[num+1]. Return null if not the highest +// number or a field or function. Return name() if not an array entry. +const char *array_name(Fl_Widget_Type *o) { + const char *c = o->name(); + if (!c) return 0; + const char *d; + for (d = c; *d != '['; d++) { + if (!*d) return c; + if (ispunct(*d) && *d!='_') return 0; + } + int num = atoi(d+1); + int sawthis = 0; + Fl_Type *t = o->prev; + Fl_Type *tp = o; + const char *cn = o->class_name(1); + for (; t && t->class_name(1) == cn; tp = t, t = t->prev); + for (t = tp; t && t->class_name(1) == cn; t = t->next) { + if (t == o) {sawthis=1; continue;} + const char *e = t->name(); + if (!e) continue; + if (strncmp(c,e,d-c)) continue; + int n1 = atoi(e+(d-c)+1); + if (n1 > num || n1==num && sawthis) return 0; + } + static char buffer[128]; + // MRS: we want strncpy() here... + strncpy(buffer,c,d-c+1); + snprintf(buffer+(d-c+1),sizeof(buffer) - (d-c+1), "%d]",num+1); + return buffer; +} + +// Test to see if extra code is a declaration: +int isdeclare(const char *c) { + while (isspace(*c)) c++; + if (*c == '#') return 1; + if (!strncmp(c,"extern",6)) return 1; + if (!strncmp(c,"typedef",7)) return 1; + if (!strncmp(c,"using",5)) return 1; + return 0; +} + +void Fl_Widget_Type::write_static() { + const char* t = subclassname(this); + if (!subclass() || (is_class() && !strncmp(t, "Fl_", 3))) { + write_declare("#include ", t); + } + for (int n=0; n < NUM_EXTRA_CODE; n++) { + if (extra_code(n) && isdeclare(extra_code(n))) + write_declare("%s", extra_code(n)); + } + if (callback() && is_name(callback())) { + int write_extern_declaration = 1; + const Fl_Class_Type *cc = is_in_class(); + char buf[1024]; snprintf(buf, 1023, "%s(*)", callback()); + if (cc) { + if (cc->has_function("static void", buf)) + write_extern_declaration = 0; + } else { + if (has_toplevel_function(0L, buf)) + write_extern_declaration = 0; + } + if (write_extern_declaration) + write_declare("extern void %s(%s*, %s);", callback(), t, + user_data_type() ? user_data_type() : "void*"); + } + const char* k = class_name(1); + const char* c = array_name(this); + if (c && !k && !is_class()) { + write_c("\n"); + if (!public_) write_c("static "); + else write_h("extern %s *%s;\n", t, c); + if (strchr(c, '[') == NULL) write_c("%s *%s=(%s *)0;\n", t, c, t); + else write_c("%s *%s={(%s *)0};\n", t, c, t); + } + if (callback() && !is_name(callback())) { + // see if 'o' or 'v' used, to prevent unused argument warnings: + int use_o = 0; + int use_v = 0; + const char *d; + for (d = callback(); *d;) { + if (*d == 'o' && !is_id(d[1])) use_o = 1; + if (*d == 'v' && !is_id(d[1])) use_v = 1; + do d++; while (is_id(*d)); + while (*d && !is_id(*d)) d++; + } + const char* cn = callback_name(); + if (k) { + write_c("\nvoid %s::%s_i(%s*", k, cn, t); + } else { + write_c("\nstatic void %s(%s*", cn, t); + } + if (use_o) write_c(" o"); + const char* ut = user_data_type() ? user_data_type() : "void*"; + write_c(", %s", ut); + if (use_v) write_c(" v"); + write_c(") {\n %s", callback()); + if (*(d-1) != ';') { + const char *p = strrchr(callback(), '\n'); + if (p) p ++; + else p = callback(); + // Only add trailing semicolon if the last line is not a preprocessor + // statement... + if (*p != '#' && *p) write_c(";"); + } + write_c("\n}\n"); + if (k) { + write_c("void %s::%s(%s* o, %s v) {\n", k, cn, t, ut); + write_c(" ((%s*)(o", k); + Fl_Type *q = 0; + for (Fl_Type* p = parent; p && p->is_widget(); q = p, p = p->parent) + write_c("->parent()"); + if (!q || strcmp(q->type_name(), "widget_class")) + write_c("->user_data()"); + write_c("))->%s_i(o,v);\n}\n", cn); + } + } + if (image) { + if (image->written != write_number) { + image->write_static(); + image->written = write_number; + } + } + if (inactive) { + if (inactive->written != write_number) { + inactive->write_static(); + inactive->written = write_number; + } + } +} + +const char *Fl_Type::callback_name() { + if (is_name(callback())) return callback(); + return unique_id(this, "cb", name(), label()); +} + +extern int varused_test, varused; + +void Fl_Widget_Type::write_code1() { + const char* t = subclassname(this); + const char *c = array_name(this); + if (c) { + if (class_name(1)) { + write_public(public_); + write_h(" %s *%s;\n", t, c); + } + } + if (class_name(1) && callback() && !is_name(callback())) { + const char* cn = callback_name(); + const char* ut = user_data_type() ? user_data_type() : "void*"; + write_public(0); + write_h(" void %s_i(%s*, %s);\n", cn, t, ut); + write_h(" static void %s(%s*, %s);\n", cn, t, ut); + } + // figure out if local variable will be used (prevent compiler warnings): + int wused = !name() && is_window(); + const char *ptr; + + varused = wused; + + if (!name() && !varused) { + varused |= is_parent(); + + if (!varused) { + varused_test = 1; + write_widget_code(); + varused_test = 0; + } + } + + if (!varused) { + for (int n=0; n < NUM_EXTRA_CODE; n++) + if (extra_code(n) && !isdeclare(extra_code(n))) + { + int instring = 0; + int inname = 0; + for (ptr = extra_code(n); *ptr; ptr ++) { + if (instring) { + if (*ptr == '\\') ptr++; + else if (*ptr == '\"') instring = 0; + } else if (inname && !isalnum(*ptr & 255)) inname = 0; + else if (*ptr == '\"') instring = 1; + else if (isalnum(*ptr & 255) || *ptr == '_') { + size_t len = strspn(ptr, "0123456789_" + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + + if (!strncmp(ptr, "o", len)) { + varused = 1; + break; + } else ptr += len - 1; + } + } + } + } + + write_c("%s{ ", indent()); + if (varused) write_c("%s* o = ", t); + if (name()) write_c("%s = ", name()); + if (is_window()) { + // Handle special case where user is faking a Fl_Group type as a window, + // there is no 2-argument constructor in that case: + if (!strstr(t, "Window")) + write_c("new %s(0, 0, %d, %d", t, o->w(), o->h()); + else + write_c("new %s(%d, %d", t, o->w(), o->h()); + } else { + write_c("new %s(%d, %d, %d, %d", t, o->x(), o->y(), o->w(), o->h()); + } + if (label() && *label()) { + write_c(", "); + switch (i18n_type) { + case 0 : /* None */ + write_cstring(label()); + break; + case 1 : /* GNU gettext */ + write_c("%s(", i18n_function); + write_cstring(label()); + write_c(")"); + break; + case 2 : /* POSIX catgets */ + write_c("catgets(%s,%s,%d,", i18n_file[0] ? i18n_file : "_catalog", + i18n_set, msgnum()); + write_cstring(label()); + write_c(")"); + break; + } + } + write_c(");\n"); + + indentation += 2; + + if (wused) write_c("%sw = o;\n", indent()); + + write_widget_code(); +} + +void Fl_Widget_Type::write_color(const char* field, Fl_Color color) { + const char* color_name = 0; + switch (color) { + case FL_FOREGROUND_COLOR: color_name = "FL_FOREGROUND_COLOR"; break; + case FL_BACKGROUND2_COLOR: color_name = "FL_BACKGROUND2_COLOR"; break; + case FL_INACTIVE_COLOR: color_name = "FL_INACTIVE_COLOR"; break; + case FL_SELECTION_COLOR: color_name = "FL_SELECTION_COLOR"; break; + case FL_GRAY0: color_name = "FL_GRAY0"; break; + case FL_DARK3: color_name = "FL_DARK3"; break; + case FL_DARK2: color_name = "FL_DARK2"; break; + case FL_DARK1: color_name = "FL_DARK1"; break; + case FL_BACKGROUND_COLOR: color_name = "FL_BACKGROUND_COLOR"; break; + case FL_LIGHT1: color_name = "FL_LIGHT1"; break; + case FL_LIGHT2: color_name = "FL_LIGHT2"; break; + case FL_LIGHT3: color_name = "FL_LIGHT3"; break; + case FL_BLACK: color_name = "FL_BLACK"; break; + case FL_RED: color_name = "FL_RED"; break; + case FL_GREEN: color_name = "FL_GREEN"; break; + case FL_YELLOW: color_name = "FL_YELLOW"; break; + case FL_BLUE: color_name = "FL_BLUE"; break; + case FL_MAGENTA: color_name = "FL_MAGENTA"; break; + case FL_CYAN: color_name = "FL_CYAN"; break; + case FL_DARK_RED: color_name = "FL_DARK_RED"; break; + case FL_DARK_GREEN: color_name = "FL_DARK_GREEN"; break; + case FL_DARK_YELLOW: color_name = "FL_DARK_YELLOW"; break; + case FL_DARK_BLUE: color_name = "FL_DARK_BLUE"; break; + case FL_DARK_MAGENTA: color_name = "FL_DARK_MAGENTA"; break; + case FL_DARK_CYAN: color_name = "FL_DARK_CYAN"; break; + case FL_WHITE: color_name = "FL_WHITE"; break; + } + const char *var = is_class() ? "this" : name() ? name() : "o"; + if (color_name) { + write_c("%s%s->%s((Fl_Color)%s);\n", indent(), var, field, color_name); + // we still must cast ^^^^^ here because a few widgets have the wrong argument type. Ouch! + } else { + write_c("%s%s->%s((Fl_Color)%d);\n", indent(), var, field, color); + } +} + +// this is split from write_code1() for Fl_Window_Type: +void Fl_Widget_Type::write_widget_code() { + Fl_Widget* tplate = ((Fl_Widget_Type*)factory)->o; + const char *var = is_class() ? "this" : name() ? name() : "o"; + + if (tooltip() && *tooltip()) { + write_c("%s%s->tooltip(",indent(), var); + switch (i18n_type) { + case 0 : /* None */ + write_cstring(tooltip()); + break; + case 1 : /* GNU gettext */ + write_c("%s(", i18n_function); + write_cstring(tooltip()); + write_c(")"); + break; + case 2 : /* POSIX catgets */ + write_c("catgets(%s,%s,%d,", i18n_file[0] ? i18n_file : "_catalog", + i18n_set, msgnum() + 1); + write_cstring(tooltip()); + write_c(")"); + break; + } + write_c(");\n"); + } + + if (is_spinner() && ((Fl_Spinner*)o)->type() != ((Fl_Spinner*)tplate)->type()) + write_c("%s%s->type(%d);\n", indent(), var, ((Fl_Spinner*)o)->type()); + else if (o->type() != tplate->type() && !is_window()) + write_c("%s%s->type(%d);\n", indent(), var, o->type()); + if (o->box() != tplate->box() || subclass()) + write_c("%s%s->box(FL_%s);\n", indent(), var, boxname(o->box())); + if (is_button()) { + Fl_Button* b = (Fl_Button*)o; + if (b->down_box()) write_c("%s%s->down_box(FL_%s);\n", indent(), var, + boxname(b->down_box())); + if (b->value()) write_c("%s%s->value(1);\n", indent(), var); + if (b->shortcut()) { + int s = b->shortcut(); + if (use_FL_COMMAND && (s & (FL_CTRL|FL_META))) { + write_c("%s%s->shortcut(FL_COMMAND|0x%x);\n", indent(), var, s & ~(FL_CTRL|FL_META)); + } else { + write_c("%s%s->shortcut(0x%x);\n", indent(), var, s); + } + } + } else if (!strcmp(type_name(), "Fl_Input_Choice")) { + Fl_Input_Choice* b = (Fl_Input_Choice*)o; + if (b->down_box()) write_c("%s%s->down_box(FL_%s);\n", indent(), var, + boxname(b->down_box())); + } else if (is_menu_button()) { + Fl_Menu_* b = (Fl_Menu_*)o; + if (b->down_box()) write_c("%s%s->down_box(FL_%s);\n", indent(), var, + boxname(b->down_box())); + } + if (o->color() != tplate->color() || subclass()) + write_color("color", o->color()); + if (o->selection_color() != tplate->selection_color() || subclass()) + write_color("selection_color", o->selection_color()); + if (image) image->write_code(var); + if (inactive) inactive->write_code(var, 1); + if (o->labeltype() != tplate->labeltype() || subclass()) + write_c("%s%s->labeltype(FL_%s);\n", indent(), var, + item_name(labeltypemenu, o->labeltype())); + if (o->labelfont() != tplate->labelfont() || subclass()) + write_c("%s%s->labelfont(%d);\n", indent(), var, o->labelfont()); + if (o->labelsize() != tplate->labelsize() || subclass()) + write_c("%s%s->labelsize(%d);\n", indent(), var, o->labelsize()); + if (o->labelcolor() != tplate->labelcolor() || subclass()) + write_color("labelcolor", o->labelcolor()); + if (is_valuator()) { + Fl_Valuator* v = (Fl_Valuator*)o; + Fl_Valuator* f = (Fl_Valuator*)(tplate); + if (v->minimum()!=f->minimum()) + write_c("%s%s->minimum(%g);\n", indent(), var, v->minimum()); + if (v->maximum()!=f->maximum()) + write_c("%s%s->maximum(%g);\n", indent(), var, v->maximum()); + if (v->step()!=f->step()) + write_c("%s%s->step(%g);\n", indent(), var, v->step()); + if (v->value()) { + if (is_valuator()==3) { // Fl_Scrollbar::value(double) is nott available + write_c("%s%s->Fl_Slider::value(%g);\n", indent(), var, v->value()); + } else { + write_c("%s%s->value(%g);\n", indent(), var, v->value()); + } + } + if (is_valuator()>=2) { + double x = ((Fl_Slider*)v)->slider_size(); + double y = ((Fl_Slider*)f)->slider_size(); + if (x != y) write_c("%s%s->slider_size(%g);\n", indent(), var, x); + } + } + if (is_spinner()) { + Fl_Spinner* v = (Fl_Spinner*)o; + Fl_Spinner* f = (Fl_Spinner*)(tplate); + if (v->minimum()!=f->minimum()) + write_c("%s%s->minimum(%g);\n", indent(), var, v->minimum()); + if (v->maximum()!=f->maximum()) + write_c("%s%s->maximum(%g);\n", indent(), var, v->maximum()); + if (v->step()!=f->step()) + write_c("%s%s->step(%g);\n", indent(), var, v->step()); + if (v->value()!=1.0f) + write_c("%s%s->value(%g);\n", indent(), var, v->value()); + } + + {Fl_Font ff; int fs; Fl_Color fc; if (textstuff(4,ff,fs,fc)) { + Fl_Font f; int s; Fl_Color c; textstuff(0,f,s,c); + if (f != ff) write_c("%s%s->textfont(%d);\n", indent(), var, f); + if (s != fs) write_c("%s%s->textsize(%d);\n", indent(), var, s); + if (c != fc) write_color("textcolor", c); + }} + const char* ud = user_data(); + if (class_name(1) && !parent->is_widget()) ud = "this"; + if (callback()) { + write_c("%s%s->callback((Fl_Callback*)%s", indent(), var, callback_name()); + if (ud) + write_c(", (void*)(%s));\n", ud); + else + write_c(");\n"); + } else if (ud) { + write_c("%s%s->user_data((void*)(%s));\n", indent(), var, ud); + } + if (o->align() != tplate->align() || subclass()) { + int i = o->align(); + write_c("%s%s->align(%s", indent(), var, + item_name(alignmenu, i & ~FL_ALIGN_INSIDE)); + if (i & FL_ALIGN_INSIDE) write_c("|FL_ALIGN_INSIDE"); + write_c(");\n"); + } + // avoid the unsupported combination of flegs when user sets + // "when" to "FL_WHEN_NEVER", but keeps the "no change" set. + // FIXME: This could be reflected in the GUI by graying out the button. + Fl_When ww = o->when(); + if (ww==FL_WHEN_NOT_CHANGED) + ww = FL_WHEN_NEVER; + if (ww != tplate->when() || subclass()) + write_c("%s%s->when(%s);\n", indent(), var, + item_name(whensymbolmenu, ww)); + if (!o->visible() && o->parent()) + write_c("%s%s->hide();\n", indent(), var); + if (!o->active()) + write_c("%s%s->deactivate();\n", indent(), var); + if (!is_group() && resizable()) + write_c("%sFl_Group::current()->resizable(%s);\n", indent(), var); + if (hotspot()) { + if (is_class()) + write_c("%shotspot(%s);\n", indent(), var); + else if (is_window()) + write_c("%s%s->hotspot(%s);\n", indent(), var, var); + else + write_c("%s%s->window()->hotspot(%s);\n", indent(), var, var); + } +} + +void Fl_Widget_Type::write_extra_code() { + for (int n=0; n < NUM_EXTRA_CODE; n++) + if (extra_code(n) && !isdeclare(extra_code(n))) + write_c("%s%s\n", indent(), extra_code(n)); +} + +void Fl_Widget_Type::write_block_close() { + indentation -= 2; + write_c("%s} // %s* %s\n", indent(), subclassname(this), + name() ? name() : "o"); +} + +void Fl_Widget_Type::write_code2() { + write_extra_code(); + write_block_close(); +} + +//////////////////////////////////////////////////////////////// + +void Fl_Widget_Type::write_properties() { + Fl_Type::write_properties(); + write_indent(level+1); + switch (public_) { + case 0: write_string("private"); break; + case 1: break; + case 2: write_string("protected"); break; + } + if (tooltip() && *tooltip()) { + write_string("tooltip"); + write_word(tooltip()); + } + if (image_name() && *image_name()) { + write_string("image"); + write_word(image_name()); + } + if (inactive_name() && *inactive_name()) { + write_string("deimage"); + write_word(inactive_name()); + } + write_string("xywh {%d %d %d %d}", o->x(), o->y(), o->w(), o->h()); + Fl_Widget* tplate = ((Fl_Widget_Type*)factory)->o; + if (is_spinner() && ((Fl_Spinner*)o)->type() != ((Fl_Spinner*)tplate)->type()) { + write_string("type"); + write_word(item_name(subtypes(), ((Fl_Spinner*)o)->type())); + } else if (o->type() != tplate->type() || is_window()) { + write_string("type"); + write_word(item_name(subtypes(), o->type())); + } + if (o->box() != tplate->box()) { + write_string("box"); write_word(boxname(o->box()));} + if (is_button()) { + Fl_Button* b = (Fl_Button*)o; + if (b->down_box()) { + write_string("down_box"); write_word(boxname(b->down_box()));} + if (b->shortcut()) write_string("shortcut 0x%x", b->shortcut()); + if (b->value()) write_string("value 1"); + } else if (!strcmp(type_name(), "Fl_Input_Choice")) { + Fl_Input_Choice* b = (Fl_Input_Choice*)o; + if (b->down_box()) { + write_string("down_box"); write_word(boxname(b->down_box()));} + } else if (is_menu_button()) { + Fl_Menu_* b = (Fl_Menu_*)o; + if (b->down_box()) { + write_string("down_box"); write_word(boxname(b->down_box()));} + } + if (o->color()!=tplate->color()) + write_string("color %d", o->color()); + if (o->selection_color()!=tplate->selection_color()) + write_string("selection_color %d", o->selection_color()); + if (o->labeltype()!=tplate->labeltype()) { + write_string("labeltype"); + write_word(item_name(labeltypemenu, o->labeltype())); + } + if (o->labelfont()!=tplate->labelfont()) + write_string("labelfont %d", o->labelfont()); + if (o->labelsize()!=tplate->labelsize()) + write_string("labelsize %d", o->labelsize()); + if (o->labelcolor()!=tplate->labelcolor()) + write_string("labelcolor %d", o->labelcolor()); + if (o->align()!=tplate->align()) + write_string("align %d", o->align()); + if (o->when() != tplate->when()) + write_string("when %d", o->when()); + if (is_valuator()) { + Fl_Valuator* v = (Fl_Valuator*)o; + Fl_Valuator* f = (Fl_Valuator*)(tplate); + if (v->minimum()!=f->minimum()) write_string("minimum %g",v->minimum()); + if (v->maximum()!=f->maximum()) write_string("maximum %g",v->maximum()); + if (v->step()!=f->step()) write_string("step %g",v->step()); + if (v->value()!=0.0) write_string("value %g",v->value()); + if (is_valuator()>=2) { + double x = ((Fl_Slider*)v)->slider_size(); + double y = ((Fl_Slider*)f)->slider_size(); + if (x != y) write_string("slider_size %g", x); + } + } + if (is_spinner()) { + Fl_Spinner* v = (Fl_Spinner*)o; + Fl_Spinner* f = (Fl_Spinner*)(tplate); + if (v->minimum()!=f->minimum()) write_string("minimum %g",v->minimum()); + if (v->maximum()!=f->maximum()) write_string("maximum %g",v->maximum()); + if (v->step()!=f->step()) write_string("step %g",v->step()); + if (v->value()!=1.0) write_string("value %g",v->value()); + } + {Fl_Font ff; int fs; Fl_Color fc; if (textstuff(4,ff,fs,fc)) { + Fl_Font f; int s; Fl_Color c; textstuff(0,f,s,c); + if (f != ff) write_string("textfont %d", f); + if (s != fs) write_string("textsize %d", s); + if (c != fc) write_string("textcolor %d", c); + }} + if (!o->visible()) write_string("hide"); + if (!o->active()) write_string("deactivate"); + if (resizable()) write_string("resizable"); + if (hotspot()) write_string(is_menu_item() ? "divider" : "hotspot"); + for (int n=0; n < NUM_EXTRA_CODE; n++) if (extra_code(n)) { + write_indent(level+1); + write_string("code%d",n); + write_word(extra_code(n)); + } + if (subclass()) { + write_indent(level+1); + write_string("class"); + write_word(subclass()); + } +} + +int pasteoffset; + +void Fl_Widget_Type::read_property(const char *c) { + int x,y,w,h; Fl_Font f; int s; Fl_Color cc; + if (!strcmp(c,"private")) { + public_ = 0; + } else if (!strcmp(c,"protected")) { + public_ = 2; + } else if (!strcmp(c,"xywh")) { + if (sscanf(read_word(),"%d %d %d %d",&x,&y,&w,&h) == 4) { + x += pasteoffset; + y += pasteoffset; + o->resize(x,y,w,h); + } + } else if (!strcmp(c,"tooltip")) { + tooltip(read_word()); + } else if (!strcmp(c,"image")) { + image_name(read_word()); + } else if (!strcmp(c,"deimage")) { + inactive_name(read_word()); + } else if (!strcmp(c,"type")) { + if (is_spinner()) + ((Fl_Spinner*)o)->type(item_number(subtypes(), read_word())); + else + o->type(item_number(subtypes(), read_word())); + } else if (!strcmp(c,"box")) { + const char* value = read_word(); + if ((x = boxnumber(value))) { + if (x == ZERO_ENTRY) x = 0; + o->box((Fl_Boxtype)x); + } else if (sscanf(value,"%d",&x) == 1) o->box((Fl_Boxtype)x); + } else if (is_button() && !strcmp(c,"down_box")) { + const char* value = read_word(); + if ((x = boxnumber(value))) { + if (x == ZERO_ENTRY) x = 0; + ((Fl_Button*)o)->down_box((Fl_Boxtype)x); + } + } else if (!strcmp(type_name(), "Fl_Input_Choice") && !strcmp(c,"down_box")) { + const char* value = read_word(); + if ((x = boxnumber(value))) { + if (x == ZERO_ENTRY) x = 0; + ((Fl_Input_Choice*)o)->down_box((Fl_Boxtype)x); + } + } else if (is_menu_button() && !strcmp(c,"down_box")) { + const char* value = read_word(); + if ((x = boxnumber(value))) { + if (x == ZERO_ENTRY) x = 0; + ((Fl_Menu_*)o)->down_box((Fl_Boxtype)x); + } + } else if (is_button() && !strcmp(c,"value")) { + const char* value = read_word(); + ((Fl_Button*)o)->value(atoi(value)); + } else if (!strcmp(c,"color")) { + int n = sscanf(read_word(),"%d %d",&x,&y); + if (n == 2) { // back compatability... + if (x != 47) o->color(x); + o->selection_color(y); + } else { + o->color(x); + } + } else if (!strcmp(c,"selection_color")) { + if (sscanf(read_word(),"%d",&x)) o->selection_color(x); + } else if (!strcmp(c,"labeltype")) { + c = read_word(); + if (!strcmp(c,"image")) { + Fluid_Image *i = Fluid_Image::find(label()); + if (!i) read_error("Image file '%s' not found", label()); + else setimage(i); + image_name(label()); + label(""); + } else { + o->labeltype((Fl_Labeltype)item_number(labeltypemenu,c)); + } + } else if (!strcmp(c,"labelfont")) { + if (sscanf(read_word(),"%d",&x) == 1) o->labelfont(x); + } else if (!strcmp(c,"labelsize")) { + if (sscanf(read_word(),"%d",&x) == 1) o->labelsize(x); + } else if (!strcmp(c,"labelcolor")) { + if (sscanf(read_word(),"%d",&x) == 1) o->labelcolor(x); + } else if (!strcmp(c,"align")) { + if (sscanf(read_word(),"%d",&x) == 1) o->align(x); + } else if (!strcmp(c,"when")) { + if (sscanf(read_word(),"%d",&x) == 1) o->when(x); + } else if (!strcmp(c,"minimum")) { + if (is_valuator()) ((Fl_Valuator*)o)->minimum(strtod(read_word(),0)); + if (is_spinner()) ((Fl_Spinner*)o)->minimum(strtod(read_word(),0)); + } else if (!strcmp(c,"maximum")) { + if (is_valuator()) ((Fl_Valuator*)o)->maximum(strtod(read_word(),0)); + if (is_spinner()) ((Fl_Spinner*)o)->maximum(strtod(read_word(),0)); + } else if (!strcmp(c,"step")) { + if (is_valuator()) ((Fl_Valuator*)o)->step(strtod(read_word(),0)); + if (is_spinner()) ((Fl_Spinner*)o)->step(strtod(read_word(),0)); + } else if (!strcmp(c,"value")) { + if (is_valuator()) ((Fl_Valuator*)o)->value(strtod(read_word(),0)); + if (is_spinner()) ((Fl_Spinner*)o)->value(strtod(read_word(),0)); + } else if ((!strcmp(c,"slider_size")||!strcmp(c,"size"))&&is_valuator()==2) { + ((Fl_Slider*)o)->slider_size(strtod(read_word(),0)); + } else if (!strcmp(c,"textfont")) { + if (sscanf(read_word(),"%d",&x) == 1) {f=(Fl_Font)x; textstuff(1,f,s,cc);} + } else if (!strcmp(c,"textsize")) { + if (sscanf(read_word(),"%d",&x) == 1) {s=x; textstuff(2,f,s,cc);} + } else if (!strcmp(c,"textcolor")) { + if (sscanf(read_word(),"%d",&x) == 1) {cc=(Fl_Color)x;textstuff(3,f,s,cc);} + } else if (!strcmp(c,"hide")) { + o->hide(); + } else if (!strcmp(c,"deactivate")) { + o->deactivate(); + } else if (!strcmp(c,"resizable")) { + resizable(1); + } else if (!strcmp(c,"hotspot") || !strcmp(c, "divider")) { + hotspot(1); + } else if (!strcmp(c,"class")) { + subclass(read_word()); + } else if (is_button() && !strcmp(c,"shortcut")) { + ((Fl_Button*)o)->shortcut(strtol(read_word(),0,0)); + } else { + if (!strncmp(c,"code",4)) { + int n = atoi(c+4); + if (n >= 0 && n <= NUM_EXTRA_CODE) { + extra_code(n,read_word()); + return; + } + } + Fl_Type::read_property(c); + } +} + +Fl_Menu_Item boxmenu1[] = { + // these extra ones are for looking up fdesign saved strings: + {"NO_FRAME", 0,0,(void *)FL_NO_BOX}, + {"ROUNDED3D_UPBOX", 0,0,(void *)_FL_ROUND_UP_BOX}, + {"ROUNDED3D_DOWNBOX", 0,0,(void *)_FL_ROUND_DOWN_BOX}, + {"OVAL3D_UPBOX", 0,0,(void *)_FL_ROUND_UP_BOX}, + {"OVAL3D_DOWNBOX", 0,0,(void *)_FL_ROUND_DOWN_BOX}, + {"0", 0,0,(void *)ZERO_ENTRY}, + {"1", 0,0,(void *)FL_UP_BOX}, + {"2", 0,0,(void *)FL_DOWN_BOX}, + {"3", 0,0,(void *)FL_FLAT_BOX}, + {"4", 0,0,(void *)FL_BORDER_BOX}, + {"5", 0,0,(void *)FL_SHADOW_BOX}, + {"6", 0,0,(void *)FL_FRAME_BOX}, + {"7", 0,0,(void *)FL_ROUNDED_BOX}, + {"8", 0,0,(void *)FL_RFLAT_BOX}, + {"9", 0,0,(void *)FL_RSHADOW_BOX}, + {"10", 0,0,(void *)FL_UP_FRAME}, + {"11", 0,0,(void *)FL_DOWN_FRAME}, +{0}}; + +extern int fdesign_flip; +int lookup_symbol(const char *, int &, int numberok = 0); + +int Fl_Widget_Type::read_fdesign(const char* propname, const char* value) { + int v; + if (!strcmp(propname,"box")) { + float x,y,w,h; + if (sscanf(value,"%f %f %f %f",&x,&y,&w,&h) == 4) { + if (fdesign_flip) { + Fl_Type *p; + for (p = parent; p && !p->is_window(); p = p->parent); + if (p && p->is_widget()) y = ((Fl_Widget_Type*)p)->o->h()-(y+h); + } + x += pasteoffset; + y += pasteoffset; + o->resize(int(x),int(y),int(w),int(h)); + } + } else if (!strcmp(propname,"label")) { + label(value); + } else if (!strcmp(propname,"name")) { + this->name(value); + } else if (!strcmp(propname,"callback")) { + callback(value); user_data_type("long"); + } else if (!strcmp(propname,"argument")) { + user_data(value); + } else if (!strcmp(propname,"shortcut")) { + if (value[0]) { + char buf[128]; sprintf(buf,"o->shortcut(\"%s\");",value); + extra_code(0,buf); + } + } else if (!strcmp(propname,"style")) { + if (!strncmp(value,"FL_NORMAL",9)) return 1; + if (!lookup_symbol(value,v,1)) return 0; + o->labelfont(v); o->labeltype((Fl_Labeltype)(v>>8)); + } else if (!strcmp(propname,"size")) { + if (!lookup_symbol(value,v,1)) return 0; + o->labelsize(v); + } else if (!strcmp(propname,"type")) { + if (!strncmp(value,"NORMAL",6)) return 1; + if (lookup_symbol(value,v,1)) {o->type(v); return 1;} + if (!strcmp(value+strlen(value)-5,"FRAME")) goto TRY_BOXTYPE; + if (!strcmp(value+strlen(value)-3,"BOX")) goto TRY_BOXTYPE; + return 0; + } else if (!strcmp(propname,"lcol")) { + if (!lookup_symbol(value,v,1)) return 0; + o->labelcolor(v); + } else if (!strcmp(propname,"return")) { + if (!lookup_symbol(value,v,0)) return 0; + o->when(v|FL_WHEN_RELEASE); + } else if (!strcmp(propname,"alignment")) { + if (!lookup_symbol(value,v)) { + // convert old numeric values: + int v1 = atoi(value); if (v1 <= 0 && strcmp(value,"0")) return 0; + v = 0; + if (v1 >= 5) {v = FL_ALIGN_INSIDE; v1 -= 5;} + switch (v1) { + case 0: v += FL_ALIGN_TOP; break; + case 1: v += FL_ALIGN_BOTTOM; break; + case 2: v += FL_ALIGN_LEFT; break; + case 3: v += FL_ALIGN_RIGHT; break; + case 4: v += FL_ALIGN_CENTER; break; + default: return 0; + } + } + o->align(v); + } else if (!strcmp(propname,"resizebox")) { + resizable(1); + } else if (!strcmp(propname,"colors")) { + char* p = (char*)value; + while (*p != ' ') {if (!*p) return 0; p++;} + *p = 0; + int v1; + if (!lookup_symbol(value,v,1) || !lookup_symbol(p+1,v1,1)) { + *p=' '; return 0;} + o->color(v,v1); + } else if (!strcmp(propname,"resize")) { + return !strcmp(value,"FL_RESIZE_ALL"); + } else if (!strcmp(propname,"gravity")) { + return !strcmp(value,"FL_NoGravity FL_NoGravity"); + } else if (!strcmp(propname,"boxtype")) { + TRY_BOXTYPE: + int x = boxnumber(value); + if (!x) {x = item_number(boxmenu1, value); if (x < 0) return 0;} + if (x == ZERO_ENTRY) { + x = 0; + if (o->box() != ((Fl_Widget_Type*)factory)->o->box()) return 1; // kludge for frame + } + o->box((Fl_Boxtype)x); + } else { + return 0; + } + return 1; +} + +void leave_live_mode_cb(Fl_Widget*, void*) { + live_mode_cb(0, 0); +} + +Fl_Widget *Fl_Widget_Type::enter_live_mode(int) { + live_widget = widget(o->x(), o->y(), o->w(), o->h()); + if (live_widget) + copy_properties(); + return live_widget; +} + +void Fl_Widget_Type::leave_live_mode() { +} + +/** + * copy all properties from the edit widget to the live widget + */ +void Fl_Widget_Type::copy_properties() { + if (!live_widget) + return; + + // copy all attributes common to all widget types + Fl_Widget *w = live_widget; + w->label(o->label()); + w->tooltip(tooltip()); + w->type(o->type()); + w->box(o->box()); + w->color(o->color()); + w->selection_color(o->selection_color()); + w->labeltype(o->labeltype()); + w->labelfont(o->labelfont()); + w->labelsize(o->labelsize()); + w->labelcolor(o->labelcolor()); + w->align(o->align()); + + // copy all attributes specific to widgets derived from Fl_Button + if (is_button()) { + Fl_Button* d = (Fl_Button*)live_widget, *s = (Fl_Button*)o; + d->down_box(s->down_box()); + d->shortcut(s->shortcut()); + d->value(s->value()); + } + + // copy all attributes specific to Fl_Valuator and derived classes + if (is_valuator()) { + Fl_Valuator* d = (Fl_Valuator*)live_widget, *s = (Fl_Valuator*)o; + d->minimum(s->minimum()); + d->maximum(s->maximum()); + d->step(s->step()); + d->value(s->value()); + if (is_valuator()>=2) { + Fl_Slider *d = (Fl_Slider*)live_widget, *s = (Fl_Slider*)o; + d->slider_size(s->slider_size()); + } + } + + // copy all attributes specific to Fl_Spinner and derived classes + if (is_spinner()) { + Fl_Spinner* d = (Fl_Spinner*)live_widget, *s = (Fl_Spinner*)o; + d->minimum(s->minimum()); + d->maximum(s->maximum()); + d->step(s->step()); + d->value(s->value()); + } + +/* TODO: implement this + {Fl_Font ff; int fs; Fl_Color fc; if (textstuff(4,ff,fs,fc)) { + Fl_Font f; int s; Fl_Color c; textstuff(0,f,s,c); + if (f != ff) write_string("textfont %d", f); + if (s != fs) write_string("textsize %d", s); + if (c != fc) write_string("textcolor %d", c); + }}*/ + + if (!o->visible()) + w->hide(); + if (!o->active()) + w->deactivate(); + if (resizable() && w->parent()) + w->parent()->resizable(o); +} + +void Fl_Pack_Type::copy_properties() +{ + Fl_Group_Type::copy_properties(); + Fl_Pack *d = (Fl_Pack*)live_widget, *s =(Fl_Pack*)o; + d->spacing(s->spacing()); +} + +// +// End of "$Id: Fl_Widget_Type.cxx 6801 2009-06-28 22:09:25Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/Fl_Widget_Type.h b/third_party/windows/fltk-1.1.10/fluid/Fl_Widget_Type.h new file mode 100644 index 0000000..5db1ab2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/Fl_Widget_Type.h @@ -0,0 +1,42 @@ +// +// "$Id: Fl_Widget_Type.h 4288 2005-04-16 00:13:17Z mike $" +// +// Widget type header file for the Fast Light Tool Kit (FLTK). +// +// Type for creating all subclasses of Fl_Widget +// This should have the widget pointer in it, but it is still in the +// Fl_Type base class. +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "Fl_Type.h" + +struct Fl_Menu_Item; +class Fluid_Image; + +void* const LOAD = (void *)9831; +extern Fl_Widget_Type *current_widget; // one of the selected ones + +// +// End of "$Id: Fl_Widget_Type.h 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/Fl_Window_Type.cxx b/third_party/windows/fltk-1.1.10/fluid/Fl_Window_Type.cxx new file mode 100644 index 0000000..cf570f6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/Fl_Window_Type.cxx @@ -0,0 +1,1533 @@ +// +// "$Id: Fl_Window_Type.cxx 6098 2008-04-12 18:04:09Z matt $" +// +// Window type code for the Fast Light Tool Kit (FLTK). +// +// The widget describing an Fl_Window. This is also all the code +// for interacting with the overlay, which allows the user to +// select, move, and resize the children widgets. +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include "Fl_Widget_Type.h" +#include "undo.h" +#include +#include +#include "alignment_panel.h" +#include + +extern int gridx; +extern int gridy; +extern int snap; +extern int show_guides; + +int include_H_from_C = 1; +int use_FL_COMMAND = 0; +extern int i18n_type; +extern const char* i18n_include; +extern const char* i18n_function; +extern const char* i18n_file; +extern const char* i18n_set; + +extern Fl_Preferences fluid_prefs; + +inline int fl_min(int a, int b) { return (a < b ? a : b); } + +#include "widget_panel.h" + +// Update the XYWH values in the widget panel... +static void update_xywh() { + if (current_widget && current_widget->is_widget()) { + widget_x_input->value(((Fl_Widget_Type *)current_widget)->o->x()); + widget_y_input->value(((Fl_Widget_Type *)current_widget)->o->y()); + widget_w_input->value(((Fl_Widget_Type *)current_widget)->o->w()); + widget_h_input->value(((Fl_Widget_Type *)current_widget)->o->h()); + } +} + +void guides_cb(Fl_Check_Button *i, long) { + show_guides = i->value(); + fluid_prefs.set("show_guides", show_guides); + + for (Fl_Type *p = Fl_Type::first; p; p = p->next) { + if (p->is_window()) { + Fl_Window_Type *w = (Fl_Window_Type *)p; + ((Fl_Overlay_Window *)(w->o))->redraw_overlay(); + } + } +} + +void grid_cb(Fl_Input *i, long v) { + int n = atoi(i->value()); + if (n < 0) n = 0; + switch (v) { + case 1: + gridx = n; + fluid_prefs.set("gridx", n); + break; + case 2: + gridy = n; + fluid_prefs.set("gridy", n); + break; + case 3: + snap = n; + fluid_prefs.set("snap", n); + break; + } + + // Next go through all of the windows in the project and set the + // stepping for resizes... + Fl_Type *p; + Fl_Window_Type *w; + + for (p = Fl_Type::first; p; p = p->next) { + if (p->is_window()) { + w = (Fl_Window_Type *)p; + ((Fl_Window *)(w->o))->size_range(gridx, gridy, + Fl::w(), Fl::h(), + gridx, gridy, 0); + } + } +} + +// Set default widget sizes... +void default_widget_size_cb(Fl_Round_Button *b, long size) { + // Update the "normal" text size of new widgets... + b->setonly(); + Fl_Widget_Type::default_size = size; + fluid_prefs.set("widget_size", Fl_Widget_Type::default_size); +} + + +void i18n_type_cb(Fl_Choice *c, void *) { + undo_checkpoint(); + + switch (i18n_type = c->value()) { + case 0 : /* None */ + i18n_include_input->hide(); + i18n_file_input->hide(); + i18n_set_input->hide(); + i18n_function_input->hide(); + break; + case 1 : /* GNU gettext */ + i18n_include_input->value(""); + i18n_include = i18n_include_input->value(); + i18n_function_input->value("gettext"); + i18n_function = i18n_function_input->value(); + i18n_include_input->show(); + i18n_file_input->hide(); + i18n_set_input->hide(); + i18n_function_input->show(); + break; + case 2 : /* POSIX cat */ + i18n_include_input->value(""); + i18n_file_input->value(""); + i18n_file = i18n_file_input->value(); + i18n_set_input->value("1"); + i18n_set = i18n_set_input->value(); + i18n_include_input->show(); + i18n_include = i18n_include_input->value(); + i18n_file_input->show(); + i18n_set_input->show(); + i18n_function_input->hide(); + break; + } + + set_modflag(1); +} + +void i18n_text_cb(Fl_Input *i, void *) { + undo_checkpoint(); + + if (i == i18n_function_input) + i18n_function = i->value(); + else if (i == i18n_file_input) + i18n_file = i->value(); + else if (i == i18n_set_input) + i18n_set = i->value(); + else if (i == i18n_include_input) + i18n_include = i->value(); + + set_modflag(1); +} + +extern const char* header_file_name; +extern const char* code_file_name; + +void show_project_cb(Fl_Widget *, void *) { + if(project_window==0) make_project_window(); + include_H_from_C_button->value(include_H_from_C); + use_FL_COMMAND_button->value(use_FL_COMMAND); + header_file_input->value(header_file_name); + code_file_input->value(code_file_name); + i18n_type_chooser->value(i18n_type); + i18n_function_input->value(i18n_function); + i18n_file_input->value(i18n_file); + i18n_set_input->value(i18n_set); + i18n_include_input->value(i18n_include); + switch (i18n_type) { + case 0 : /* None */ + i18n_include_input->hide(); + i18n_file_input->hide(); + i18n_set_input->hide(); + i18n_function_input->hide(); + break; + case 1 : /* GNU gettext */ + i18n_include_input->show(); + i18n_file_input->hide(); + i18n_set_input->hide(); + i18n_function_input->show(); + break; + case 2 : /* POSIX cat */ + i18n_include_input->show(); + i18n_file_input->show(); + i18n_set_input->show(); + i18n_function_input->hide(); + break; + } + project_window->hotspot(project_window); + project_window->show(); +} + +void show_grid_cb(Fl_Widget *, void *) { + char buf[128]; + sprintf(buf,"%d",gridx); horizontal_input->value(buf); + sprintf(buf,"%d",gridy); vertical_input->value(buf); + sprintf(buf,"%d",snap); snap_input->value(buf); + guides_toggle->value(show_guides); + int s = Fl_Widget_Type::default_size; + if (s<=8) def_widget_size[0]->setonly(); + else if (s<=11) def_widget_size[1]->setonly(); + else if (s<=14) def_widget_size[2]->setonly(); + else if (s<=18) def_widget_size[3]->setonly(); + else if (s<=24) def_widget_size[4]->setonly(); + else if (s<=32) def_widget_size[5]->setonly(); + grid_window->hotspot(grid_window); + grid_window->show(); +} + +void show_settings_cb(Fl_Widget *, void *) { + settings_window->hotspot(settings_window); + settings_window->show(); +} + +void header_input_cb(Fl_Input* i, void*) { + if (header_file_name && strcmp(header_file_name, i->value())) + set_modflag(1); + header_file_name = i->value(); +} +void code_input_cb(Fl_Input* i, void*) { + if (code_file_name && strcmp(code_file_name, i->value())) + set_modflag(1); + code_file_name = i->value(); +} + +void include_H_from_C_button_cb(Fl_Check_Button* b, void*) { + if (include_H_from_C != b->value()) { + set_modflag(1); + include_H_from_C = b->value(); + } +} + +void use_FL_COMMAND_button_cb(Fl_Check_Button* b, void*) { + if (use_FL_COMMAND != b->value()) { + set_modflag(1); + use_FL_COMMAND = b->value(); + } +} + +//////////////////////////////////////////////////////////////// + +Fl_Menu_Item window_type_menu[] = { + {"Single",0,0,(void*)FL_WINDOW}, + {"Double",0,0,(void*)(FL_WINDOW+1)}, + {0}}; + +static int overlays_invisible; + +// The following Fl_Widget is used to simulate the windows. It has +// an overlay for the fluid ui, and special-cases the FL_NO_BOX. + +class Overlay_Window : public Fl_Overlay_Window { + void draw(); + void draw_overlay(); +public: + Fl_Window_Type *window; + int handle(int); + Overlay_Window(int W,int H) : Fl_Overlay_Window(W,H) {Fl_Group::current(0);} + void resize(int,int,int,int); + uchar *read_image(int &ww, int &hh); +}; +void Overlay_Window::draw() { + const int CHECKSIZE = 8; + // see if box is clear or a frame or rounded: + if ((damage()&FL_DAMAGE_ALL) && + (!box() || (box()>=4&&!(box()&2)) || box()>=_FL_ROUNDED_BOX)) { + // if so, draw checkerboard so user can see what areas are clear: + for (int Y = 0; Y < h(); Y += CHECKSIZE) + for (int X = 0; X < w(); X += CHECKSIZE) { + fl_color(((Y/(2*CHECKSIZE))&1) != ((X/(2*CHECKSIZE))&1) ? + FL_WHITE : FL_BLACK); + fl_rectf(X,Y,CHECKSIZE,CHECKSIZE); + } + } + Fl_Overlay_Window::draw(); +} + +extern Fl_Window *main_window; + +// Read an image of the overlay window +uchar *Overlay_Window::read_image(int &ww, int &hh) { + // Create an off-screen buffer for the window... + main_window->make_current(); + + ww = w(); + hh = h(); + + Fl_Offscreen offscreen = fl_create_offscreen(ww, hh); + uchar *pixels; + + // Redraw the window into the offscreen buffer... + fl_begin_offscreen(offscreen); + + if (!shown()) image(Fl::scheme_bg_); + + redraw(); + draw(); + + // Read the screen image... + pixels = fl_read_image(0, 0, 0, ww, hh); + + fl_end_offscreen(); + + // Cleanup and return... + fl_delete_offscreen(offscreen); + + return pixels; +} + +void Overlay_Window::draw_overlay() { + window->draw_overlay(); +} +int Overlay_Window::handle(int e) { + int ret = window->handle(e); + if (ret==0) { + switch (e) { + case FL_SHOW: + case FL_HIDE: + ret = Fl_Overlay_Window::handle(e); + } + } + return ret; +} + +Fl_Type *Fl_Window_Type::make() { + Fl_Type *p = Fl_Type::current; + while (p && !p->is_code_block()) p = p->parent; + if (!p) { + fl_message("Please select a function"); + return 0; + } + Fl_Window_Type *myo = new Fl_Window_Type(); + if (!this->o) {// template widget + this->o = new Fl_Window(100,100); + Fl_Group::current(0); + } + // Set the size ranges for this window; in order to avoid opening the + // X display we use an arbitrary maximum size... + ((Fl_Window *)(this->o))->size_range(gridx, gridy, + 3072, 2048, + gridx, gridy, 0); + myo->factory = this; + myo->drag = 0; + myo->numselected = 0; + Overlay_Window *w = new Overlay_Window(100,100); + w->window = myo; + myo->o = w; + myo->add(p); + myo->modal = 0; + myo->non_modal = 0; + return myo; +} + +void Fl_Window_Type::add_child(Fl_Type* cc, Fl_Type* before) { + if (!cc->is_widget()) return; + Fl_Widget_Type* c = (Fl_Widget_Type*)cc; + Fl_Widget* b = before ? ((Fl_Widget_Type*)before)->o : 0; + ((Fl_Window*)o)->insert(*(c->o), b); + o->redraw(); +} + +void Fl_Window_Type::remove_child(Fl_Type* cc) { + Fl_Widget_Type* c = (Fl_Widget_Type*)cc; + ((Fl_Window*)o)->remove(c->o); + o->redraw(); +} + +void Fl_Window_Type::move_child(Fl_Type* cc, Fl_Type* before) { + Fl_Widget_Type* c = (Fl_Widget_Type*)cc; + ((Fl_Window*)o)->remove(c->o); + Fl_Widget* b = before ? ((Fl_Widget_Type*)before)->o : 0; + ((Fl_Window*)o)->insert(*(c->o), b); + o->redraw(); +} + +//////////////////////////////////////////////////////////////// + +// Double-click on window widget shows the window, or if already shown, +// it shows the control panel. +void Fl_Window_Type::open() { + Overlay_Window *w = (Overlay_Window *)o; + if (w->shown()) { + w->show(); + Fl_Widget_Type::open(); + } else { + Fl_Widget *p = w->resizable(); + if (!p) w->resizable(w); + w->show(); + w->resizable(p); + } + + w->image(Fl::scheme_bg_); + w->size_range(gridx, gridy, Fl::w(), Fl::h(), gridx, gridy, 0); +} + +// Read an image of the window +uchar *Fl_Window_Type::read_image(int &ww, int &hh) { + Overlay_Window *w = (Overlay_Window *)o; + + // Read the screen image... + return (w->read_image(ww, hh)); +} + + +// control panel items: + +void modal_cb(Fl_Light_Button* i, void* v) { + if (v == LOAD) { + if (!current_widget->is_window()) {i->hide(); return;} + i->show(); + i->value(((Fl_Window_Type *)current_widget)->modal); + } else { + ((Fl_Window_Type *)current_widget)->modal = i->value(); + set_modflag(1); + } +} + +void non_modal_cb(Fl_Light_Button* i, void* v) { + if (v == LOAD) { + if (!current_widget->is_window()) {i->hide(); return;} + i->show(); + i->value(((Fl_Window_Type *)current_widget)->non_modal); + } else { + ((Fl_Window_Type *)current_widget)->non_modal = i->value(); + set_modflag(1); + } +} + +void border_cb(Fl_Light_Button* i, void* v) { + if (v == LOAD) { + if (!current_widget->is_window()) {i->hide(); return;} + i->show(); + i->value(((Fl_Window*)(current_widget->o))->border()); + } else { + ((Fl_Window*)(current_widget->o))->border(i->value()); + set_modflag(1); + } +} + +void xclass_cb(Fl_Input* i, void* v) { + if (v == LOAD) { + if (!current_widget->is_window()) { + i->hide(); + i->parent()->hide(); // hides the "X Class:" label as well + return; + } + i->show(); + i->parent()->show(); + i->value(((Fl_Widget_Type *)current_widget)->xclass); + } else { + int mod = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + mod = 1; + Fl_Widget_Type* w = (Fl_Widget_Type*)o; + if (w->is_window() || w->is_button()) + storestring(i->value(),w->xclass); + if (w->is_window()) ((Fl_Window*)(w->o))->xclass(w->xclass); + else if (w->is_menu_item()) w->redraw(); + } + } + if (mod) set_modflag(1); + } +} + +//////////////////////////////////////////////////////////////// + +void Fl_Window_Type::setlabel(const char *n) { + if (o) ((Fl_Window *)o)->label(n); +} + +// make() is called on this widget when user picks window off New menu: +Fl_Window_Type Fl_Window_type; + +// Resize from window manager... +void Overlay_Window::resize(int X,int Y,int W,int H) { + Fl_Widget* t = resizable(); resizable(0); + + // do not set the mod flag if the window was not resized. In FLUID, all + // windows are opened without a given x/y position, so modifying x/y + // should not mark the project as dirty + if (W!=w() || H!=h()) + set_modflag(1); + + Fl_Overlay_Window::resize(X,Y,W,H); + resizable(t); + update_xywh(); +} + +// calculate actual move by moving mouse position (mx,my) to +// nearest multiple of gridsize, and snap to original position +void Fl_Window_Type::newdx() { + int mydx, mydy; + if (Fl::event_state(FL_ALT) || !snap) { + mydx = mx-x1; + mydy = my-y1; + + if (abs(mydx) < 2 && abs(mydy) < 2) mydx = mydy = 0; + } else { + int dx0 = mx-x1; + int ix = (drag&RIGHT) ? br : bx; + mydx = gridx ? ((ix+dx0+gridx/2)/gridx)*gridx - ix : dx0; + if (dx0 > snap) { + if (mydx < 0) mydx = 0; + } else if (dx0 < -snap) { + if (mydx > 0) mydx = 0; + } else + mydx = 0; + int dy0 = my-y1; + int iy = (drag&BOTTOM) ? by : bt; + mydy = gridy ? ((iy+dy0+gridy/2)/gridy)*gridy - iy : dy0; + if (dy0 > snap) { + if (mydy < 0) mydy = 0; + } else if (dy0 < -snap) { + if (mydy > 0) mydy = 0; + } else + mydy = 0; + } + + if (!(drag & (DRAG | BOX | LEFT | RIGHT))) { + mydx = 0; + dx = 0; + } + + if (!(drag & (DRAG | BOX | TOP | BOTTOM))) { + mydy = 0; + dy = 0; + } + + if (dx != mydx || dy != mydy) { + dx = mydx; dy = mydy; + ((Overlay_Window *)o)->redraw_overlay(); + } +} + +// Move a widget according to dx and dy calculated above +void Fl_Window_Type::newposition(Fl_Widget_Type *myo,int &X,int &Y,int &R,int &T) { + X = myo->o->x(); + Y = myo->o->y(); + R = X+myo->o->w(); + T = Y+myo->o->h(); + if (!drag) return; + if (drag&DRAG) { + X += dx; + Y += dy; + R += dx; + T += dy; + } else { + if (drag&LEFT) if (X==bx) X += dx; else if (Xbr+dx) R = br+dx; + if (drag&BOTTOM) if (T==bt) T += dy; else if (T>bt+dx) T = bt+dx; + } + if (Ry2) ? -1 : 1 ; + fl_yxline(x, y1, y2); + fl_xyline(x-4, y2, x+4); + fl_line(x-2, y2-dy*5, x, y2-dy); + fl_line(x+2, y2-dy*5, x, y2-dy); +} + +static void draw_h_arrow(int x1, int y, int x2) { + int dx = (x1>x2) ? -1 : 1 ; + fl_xyline(x1, y, x2); + fl_yxline(x2, y-4, y+4); + fl_line(x2-dx*5, y-2, x2-dx, y); + fl_line(x2-dx*5, y+2, x2-dx, y); +} + +static void draw_top_brace(const Fl_Widget *w) { + fl_yxline(w->x(), w->y()-2, w->y()+6); + fl_yxline(w->x()+w->w()-1, w->y()-2, w->y()+6); + fl_xyline(w->x()-2, w->y(), w->x()+w->w()+1); +} + +static void draw_left_brace(const Fl_Widget *w) { + fl_xyline(w->x()-2, w->y(), w->x()+6); + fl_xyline(w->x()-2, w->y()+w->h()-1, w->x()+6); + fl_yxline(w->x(), w->y()-2, w->y()+w->h()+1); +} + +static void draw_right_brace(const Fl_Widget *w) { + int xx = w->x() + w->w() - 1; + fl_xyline(xx-6, w->y(), xx+2); + fl_xyline(xx-6, w->y()+w->h()-1, xx+2); + fl_yxline(xx, w->y()-2, w->y()+w->h()+1); +} + +static void draw_bottom_brace(const Fl_Widget *w) { + int yy = w->y() + w->h() - 1; + fl_yxline(w->x(), yy-6, yy+2); + fl_yxline(w->x()+w->w()-1, yy-6, yy+2); + fl_xyline(w->x()-2, yy, w->x()+w->w()+1); +} + +static void draw_height(int x, int y, int b, Fl_Align a) { + char buf[16]; + int h = b - y; + sprintf(buf, "%d", h); + fl_font(FL_HELVETICA, 9); + int lw = (int)fl_width(buf); + int lx; + + b --; + if (h < 30) { + // Move height to the side... + if (a == FL_ALIGN_LEFT) lx = x - lw - 2; + else lx = x + 2; + + fl_yxline(x, y, b); + } else { + // Put height inside the arrows... + lx = x - lw / 2; + + fl_yxline(x, y, y + (h - 11) / 2); + fl_yxline(x, y + (h + 11) / 2, b); + } + + // Draw the height... + fl_draw(buf, lx, y + (h + 9) / 2); + + // Draw the arrowheads... + fl_line(x-2, y+5, x, y+1, x+2, y+5); + fl_line(x-2, b-5, x, b-1, x+2, b-5); + + // Draw the end lines... + fl_xyline(x - 4, y, x + 4); + fl_xyline(x - 4, b, x + 4); +} + +static void draw_width(int x, int y, int r, Fl_Align a) { + char buf[16]; + int w = r-x; + sprintf(buf, "%d", w); + fl_font(FL_HELVETICA, 9); + int lw = (int)fl_width(buf); + int ly = y + 4; + + r --; + + if (lw > (w - 20)) { + // Move width above/below the arrows... + if (a == FL_ALIGN_TOP) ly -= 10; + else ly += 10; + + fl_xyline(x, y, r); + } else { + // Put width inside the arrows... + fl_xyline(x, y, x + (w - lw - 2) / 2); + fl_xyline(x + (w + lw + 2) / 2, y, r); + } + + // Draw the width... + fl_draw(buf, x + (w - lw) / 2, ly); + + // Draw the arrowheads... + fl_line(x+5, y-2, x+1, y, x+5, y+2); + fl_line(r-5, y-2, r-1, y, r-5, y+2); + + // Draw the end lines... + fl_yxline(x, y - 4, y + 4); + fl_yxline(r, y - 4, y + 4); +} + +void Fl_Window_Type::draw_overlay() { + if (recalc) { + bx = o->w(); by = o->h(); br = 0; bt = 0; + numselected = 0; + for (Fl_Type *q=next; q && q->level>level; q=q->next) + if (q->selected && q->is_widget() && !q->is_menu_item()) { + numselected++; + Fl_Widget_Type* myo = (Fl_Widget_Type*)q; + if (myo->o->x() < bx) bx = myo->o->x(); + if (myo->o->y() < by) by = myo->o->y(); + if (myo->o->x()+myo->o->w() > br) br = myo->o->x()+myo->o->w(); + if (myo->o->y()+myo->o->h() > bt) bt = myo->o->y()+myo->o->h(); + } + recalc = 0; + sx = bx; sy = by; sr = br; st = bt; + } + fl_color(FL_RED); + if (drag==BOX && (x1 != mx || y1 != my)) { + int x = x1; int r = mx; if (x > r) {x = mx; r = x1;} + int y = y1; int b = my; if (y > b) {y = my; b = y1;} + fl_rect(x,y,r-x,b-y); + } + if (overlays_invisible && !drag) return; + if (selected) fl_rect(0,0,o->w(),o->h()); + if (!numselected) return; + int mybx,myby,mybr,mybt; + int mysx,mysy,mysr,myst; + mybx = mysx = o->w(); myby = mysy = o->h(); mybr = mysr = 0; mybt = myst = 0; + Fl_Type *selection = 0L; // used to store the one selected widget (if n==1) + for (Fl_Type *q=next; q && q->level>level; q = q->next) + if (q->selected && q->is_widget() && !q->is_menu_item()) { + selection = q; + Fl_Widget_Type* myo = (Fl_Widget_Type*)q; + int x,y,r,t; + newposition(myo,x,y,r,t); + if (!show_guides || !drag || numselected != 1) fl_rect(x,y,r-x,t-y); + if (x < mysx) mysx = x; + if (y < mysy) mysy = y; + if (r > mysr) mysr = r; + if (t > myst) myst = t; + if (!(myo->o->align() & FL_ALIGN_INSIDE)) { + // Adjust left/right/top/bottom for top/bottom labels... + int ww, hh; + ww = (myo->o->align() & FL_ALIGN_WRAP) ? myo->o->w() : 0; + hh = myo->o->labelsize(); + myo->o->measure_label(ww, hh); + if (myo->o->align() & FL_ALIGN_TOP) y -= hh; + else if (myo->o->align() & FL_ALIGN_BOTTOM) t += hh; + else if (myo->o->align() & FL_ALIGN_LEFT) x -= ww + 4; + else if (myo->o->align() & FL_ALIGN_RIGHT) r += ww + 4; + } + if (x < mybx) mybx = x; + if (y < myby) myby = y; + if (r > mybr) mybr = r; + if (t > mybt) mybt = t; + } + if (selected) return; + + if (show_guides && drag) { + // draw overlays for UI Guideline distances + // - check for distance to the window edge + // * FLTK suggests 10 pixels from the edge + int d; + int xsp, ysp; + int mybx_bak = mybx, myby_bak = myby, mybr_bak = mybr, mybt_bak = mybt; + Fl_Widget_Type *mysel = (Fl_Widget_Type *)selection; + + + ideal_spacing(xsp, ysp); + + if (drag) { + // Check top spacing... + if (abs(d = myby - ysp) < 3) { + dy -= d; + if (drag & DRAG) mybt -= d; + myby -= d; + draw_v_arrow(mybx+5, myby, 0); + } + + // Check bottom spacing... + if (abs(d = o->h() - mybt - ysp) < 3) { + dy += d; + if (drag & DRAG) myby += d; + mybt += d; + draw_v_arrow(mybx+5, mybt, o->h()); + } + + // Check left spacing... + if (abs(d = mybx - xsp) < 3) { + dx -= d; + if (drag & DRAG) mybr -= d; + mybx -= d; + draw_h_arrow(mybx, myby+5, 0); + } + + // Check right spacing... + if (abs(d = o->w() - mybr - xsp) < 3) { + dx += d; + if (drag & DRAG) mybx += d; + mybr += d; + draw_h_arrow(mybr, myby+5, o->w()); + } + } + + if (numselected==1 && selection && !(drag & DRAG)) { + // Check ideal sizes + int x,y,r,t; + newposition(mysel,x,y,r,t); + int w = r-x; + int h = t-y; + int iw = w, ih = h; + + mysel->ideal_size(iw, ih); + + if (drag & (TOP | BOTTOM)) { + // Check height + if (abs(d = ih - h) < 5) { + // Resize height + if (drag & TOP) { + myby -= d; + y -= d; + dy -= d; + } else { + mybt += d; + t += d; + dy += d; + } + } + + // Draw height guide + draw_height(x < 50 ? x+10 : x-10, y, t, + x < 50 ? FL_ALIGN_RIGHT : FL_ALIGN_LEFT); + } + + if (drag & (LEFT | RIGHT)) { + // Check width + if (abs(d = iw - w) < 5) { + // Resize width + if (drag & LEFT) { + mybx -= d; + x -= d; + dx -= d; + } else { + mybr += d; + r += d; + dx += d; + } + } + + // Draw width guide + draw_width(x, y < 50 ? y+10 : y-10, r, + y < 50 ? FL_ALIGN_BOTTOM : FL_ALIGN_TOP); + } + } + + // Check spacing and alignment between individual widgets + if (drag && selection->is_widget()) { + for (Fl_Type *q=next; q && q->level>level; q = q->next) + if (q != selection && q->is_widget()) { + Fl_Widget_Type *qw = (Fl_Widget_Type*)q; + // Only check visible widgets... + if (!qw->o->visible_r()) continue; + + // Get bounding box of widget... + int qx = qw->o->x(); + int qr = qw->o->x() + qw->o->w(); + int qy = qw->o->y(); + int qt = qw->o->y() + qw->o->h(); + + if (!(qw->o->align() & FL_ALIGN_INSIDE)) { + // Adjust top/bottom for top/bottom labels... + int ww, hh; + ww = qw->o->w(); + hh = qw->o->labelsize(); + qw->o->measure_label(ww, hh); + if (qw->o->align() & FL_ALIGN_TOP) qy -= hh; + if (qw->o->align() & FL_ALIGN_BOTTOM) qt += hh; + } + + // Do horizontal alignment when the widget is within 25 + // pixels vertically... + if (fl_min(abs(qy - mysel->o->y() - mysel->o->h()), + abs(mysel->o->y() - qt)) < 25) { + // Align to left of other widget... + if ((drag & (LEFT | DRAG)) && abs(d = mybx - qx) < 3) { + dx += d; + mybx += d; + if (drag & DRAG) mybr += d; + + draw_left_brace(qw->o); + } + + // Align to right of other widget... + if ((drag & (RIGHT | DRAG)) && + abs(d = qr - mybr) < 3) { + dx += d; + if (drag & DRAG) mybx += d; + mybr += d; + + draw_right_brace(qw->o); + } + } + + // Align to top of other widget... + if ((drag & (TOP | DRAG)) && abs(d = myby - qy) < 3) { + dy += d; + myby += d; + if (drag & DRAG) mybt += d; + + draw_top_brace(qw->o); + } + + // Align to bottom of other widget... + if ((drag & (BOTTOM | DRAG)) && abs(d = qt - mybt) < 3) { + dy += d; + if (drag & DRAG) myby += d; + mybt += d; + + draw_bottom_brace(qw->o); + } + + // Check spacing between widgets + if (mysel->is_group()) mysel->ideal_spacing(xsp, ysp); + else qw->ideal_spacing(xsp, ysp); + + if ((qt)>=myby && qy<=mybt) { + if (drag & (LEFT | DRAG)) { + // Compare left of selected to left of current + if (abs(d = qx - mybx - xsp) >= 3) + d = qx - mybx + xsp; + + if (abs(d) < 3) { + dx += d; + mybx += d; + if (drag & DRAG) mybr += d; + + // Draw left arrow + draw_h_arrow(mybx, (myby+mybt)/2, qx); + } + + // Compare left of selected to right of current + if (abs(d = qr - mybx - xsp) >= 3) + d = qr - mybx + xsp; + + if (abs(d) < 3) { + dx += d; + mybx += d; + if (drag & DRAG) mybr += d; + + // Draw left arrow + draw_h_arrow(mybx, (myby+mybt)/2, qr); + } + } + + if (drag & (RIGHT | DRAG)) { + // Compare right of selected to left of current + if (abs(d = qx - mybr - xsp) >= 3) + d = qx - mybr + xsp; + + if (abs(d) < 3) { + dx += d; + if (drag & DRAG) mybx += d; + mybr += d; + + // Draw right arrow + draw_h_arrow(mybr, (myby+mybt)/2, qx); + } + + // Compare right of selected to right of current + if (abs(d = qr - mybr + xsp) >= 3) + d = qr - mybr - xsp; + + if (abs(d) < 3) { + dx += d; + if (drag & DRAG) mybx += d; + mybr += d; + + // Draw right arrow + draw_h_arrow(mybr, (myby+mybt)/2, qr); + } + } + } + + if (qr>=mybx && qx<=mybr) { + // Compare top of selected to top of current + if (drag & (TOP | DRAG)) { + if (abs(d = qy - myby - ysp) >= 3) + d = qy - myby + ysp; + + if (abs(d) < 3) { + dy += d; + myby += d; + if (drag & DRAG) mybt += d; + + // Draw up arrow... + draw_v_arrow((mybx+mybr)/2, myby, qy); + } + + // Compare top of selected to bottom of current + if (abs(d = qt - myby - ysp) >= 3) + d = qt - myby + ysp; + + if (abs(d) < 3) { + dy += d; + myby += d; + if (drag & DRAG) mybt += d; + + // Draw up arrow... + draw_v_arrow((mybx+mybr)/2, myby, qt); + } + } + + // Compare bottom of selected to top of current + if (drag & (BOTTOM | DRAG)) { + if (abs(d = qy - mybt - ysp) >= 3) + d = qy - mybt + ysp; + + if (abs(d) < 3) { + dy += d; + if (drag & DRAG) myby += d; + mybt += d; + + // Draw down arrow... + draw_v_arrow((mybx+mybr)/2, mybt, qy); + } + + // Compare bottom of selected to bottom of current + if (abs(d = qt - mybt - ysp) >= 3) + d = qt - mybt + ysp; + + if (abs(d) < 3) { + dy += d; + if (drag & DRAG) myby += d; + mybt += d; + + // Draw down arrow... + draw_v_arrow((mybx+mybr)/2, mybt, qt); + } + } + } + } + } + mysx += mybx-mybx_bak; mysr += mybr-mybr_bak; + mysy += myby-myby_bak; myst += mybt-mybt_bak; + } + // align the snapping selection box with the box we draw. + sx = mysx; sy = mysy; sr = mysr; st = myst; + + // Draw selection box + resize handles... + // draw box including all labels + fl_line_style(FL_DOT); + fl_rect(mybx,myby,mybr-mybx,mybt-myby); + fl_line_style(FL_SOLID); + // draw box excluding labels + fl_rect(mysx,mysy,mysr-mysx,myst-mysy); + fl_rectf(mysx,mysy,5,5); + fl_rectf(mysr-5,mysy,5,5); + fl_rectf(mysr-5,myst-5,5,5); + fl_rectf(mysx,myst-5,5,5); +} + +extern Fl_Menu_Item Main_Menu[]; + +// Calculate new bounding box of selected widgets: +void Fl_Window_Type::fix_overlay() { + Main_Menu[40].label("Hide O&verlays"); + overlays_invisible = 0; + recalc = 1; + ((Overlay_Window *)(this->o))->redraw_overlay(); +} + +// do that for every window (when selected set changes): +void redraw_overlays() { + for (Fl_Type *o=Fl_Type::first; o; o=o->next) + if (o->is_window()) ((Fl_Window_Type*)o)->fix_overlay(); +} + +void toggle_overlays(Fl_Widget *,void *) { + overlays_invisible = !overlays_invisible; + + if (overlays_invisible) Main_Menu[40].label("Show O&verlays"); + else Main_Menu[40].label("Hide O&verlays"); + + for (Fl_Type *o=Fl_Type::first; o; o=o->next) + if (o->is_window()) { + Fl_Widget_Type* w = (Fl_Widget_Type*)o; + ((Overlay_Window*)(w->o))->redraw_overlay(); + } +} + +extern void select(Fl_Type *,int); +extern void select_only(Fl_Type *); +extern void deselect(); +extern Fl_Type* in_this_only; +extern void fix_group_size(Fl_Type *t); + +extern Fl_Menu_Item Main_Menu[]; +extern Fl_Menu_Item New_Menu[]; + +// move the selected children according to current dx,dy,drag state: +void Fl_Window_Type::moveallchildren() +{ + undo_checkpoint(); + Fl_Type *i; + for (i=next; i && i->level>level;) { + if (i->selected && i->is_widget() && !i->is_menu_item()) { + Fl_Widget_Type* myo = (Fl_Widget_Type*)i; + int x,y,r,t; + newposition(myo,x,y,r,t); + myo->o->resize(x,y,r-x,t-y); + // move all the children, whether selected or not: + Fl_Type* p; + for (p = myo->next; p && p->level>myo->level; p = p->next) + if (p->is_widget() && !p->is_menu_item()) { + Fl_Widget_Type* myo2 = (Fl_Widget_Type*)p; + int X,Y,R,T; + newposition(myo2,X,Y,R,T); + myo2->o->resize(X,Y,R-X,T-Y); + } + i = p; + } else { + i = i->next; + } + } + for (i=next; i && i->level>level; i=i->next) + fix_group_size(i); + o->redraw(); + recalc = 1; + ((Overlay_Window *)(this->o))->redraw_overlay(); + set_modflag(1); + dx = dy = 0; + + update_xywh(); +} + +int Fl_Window_Type::handle(int event) { + static Fl_Type* selection; + switch (event) { + case FL_PUSH: + x1 = mx = Fl::event_x(); + y1 = my = Fl::event_y(); + drag = dx = dy = 0; + // test for popup menu: + if (Fl::event_button() >= 3) { + in_this_only = this; // modifies how some menu items work. + static const Fl_Menu_Item* myprev; + const Fl_Menu_Item* m = New_Menu->popup(mx,my,"New",myprev); + if (m && m->callback()) {myprev = m; m->do_callback(this->o);} + in_this_only = 0; + return 1; + } + // find the innermost item clicked on: + selection = this; + {for (Fl_Type* i=next; i && i->level>level; i=i->next) + if (i->is_widget() && !i->is_menu_item()) { + Fl_Widget_Type* myo = (Fl_Widget_Type*)i; + for (Fl_Widget *o1 = myo->o; o1; o1 = o1->parent()) + if (!o1->visible()) goto CONTINUE2; + if (Fl::event_inside(myo->o)) { + selection = myo; + if (Fl::event_clicks()==1) + reveal_in_browser(myo); + } + CONTINUE2:; + }} + // see if user grabs edges of selected region: + if (numselected && !(Fl::event_state(FL_SHIFT)) && + mx<=br+snap && mx>=bx-snap && my<=bt+snap && my>=by-snap) { + int snap1 = snap>5 ? snap : 5; + int w1 = (br-bx)/4; if (w1 > snap1) w1 = snap1; + if (mx>=br-w1) drag |= RIGHT; + else if (mx snap1) w1 = snap1; + if (my<=by+w1) drag |= TOP; + else if (my>bt-w1) drag |= BOTTOM; + if (!drag) drag = DRAG; + } + // do object-specific selection of other objects: + {Fl_Type* t = selection->click_test(mx, my); + if (t) { + //if (t == selection) return 1; // indicates mouse eaten w/o change + if (Fl::event_state(FL_SHIFT)) { + Fl::event_is_click(0); + select(t, !t->selected); + } else { + deselect(); + select(t, 1); + if (t->is_menu_item()) t->open(); + } + selection = t; + drag = 0; + } else { + if (!drag) drag = BOX; // if all else fails, start a new selection region + }} + return 1; + + case FL_DRAG: + if (!drag) return 0; + mx = Fl::event_x(); + my = Fl::event_y(); + newdx(); + return 1; + + case FL_RELEASE: + if (!drag) return 0; + mx = Fl::event_x(); + my = Fl::event_y(); + if (drag != BOX && (dx || dy || !Fl::event_is_click())) { + if (dx || dy) moveallchildren(); + } else if ((Fl::event_clicks() || Fl::event_state(FL_CTRL))) { + Fl_Widget_Type::open(); + } else { + if (mxlevel>level; i=i->next) + if (i->is_widget() && !i->is_menu_item()) { + Fl_Widget_Type* myo = (Fl_Widget_Type*)i; + for (Fl_Widget *o1 = myo->o; o1; o1 = o1->parent()) + if (!o1->visible()) goto CONTINUE; + if (Fl::event_inside(myo->o)) selection = myo; + if (myo->o->x()>=x1 && myo->o->y()>y1 && + myo->o->x()+myo->o->w()o->y()+myo->o->h()selected : 1); + } + CONTINUE:; + } + // if nothing in box, select what was clicked on: + if (!n) { + select(selection, toggle ? !selection->selected : 1); + } + } + drag = 0; + ((Overlay_Window *)o)->redraw_overlay(); + return 1; + + case FL_KEYBOARD: { + + int backtab = 0; + switch (Fl::event_key()) { + + case FL_Escape: + ((Fl_Window*)o)->hide(); + return 1; + + case 0xFE20: // backtab + backtab = 1; + case FL_Tab: { + if (Fl::event_state(FL_SHIFT)) backtab = 1; + // find current child: + Fl_Type *i = Fl_Type::current; + while (i && (!i->is_widget() || i->is_menu_item())) i = i->parent; + if (!i) return 0; + Fl_Type *p = i->parent; + while (p && p != this) p = p->parent; + if (!p || !p->is_widget()) { + i = next; if (!i || i->level <= level) return 0; + } + p = i; + for (;;) { + i = backtab ? i->prev : i->next; + if (!i || i->level <= level) {i = p; break;} + if (i->is_widget() && !i->is_menu_item()) break; + } + deselect(); select(i,1); + return 1;} + + case FL_Left: dx = -1; dy = 0; goto ARROW; + case FL_Right: dx = +1; dy = 0; goto ARROW; + case FL_Up: dx = 0; dy = -1; goto ARROW; + case FL_Down: dx = 0; dy = +1; goto ARROW; + ARROW: + // for some reason BOTTOM/TOP are swapped... should be fixed... + drag = (Fl::event_state(FL_SHIFT)) ? (RIGHT|TOP) : DRAG; + if (Fl::event_state(FL_CTRL)) {dx *= gridx; dy *= gridy;} + moveallchildren(); + drag = 0; + return 1; + + case 'o': + toggle_overlays(0, 0); + break; + + default: + return 0; + }} + + case FL_SHORTCUT: { + in_this_only = this; // modifies how some menu items work. + const Fl_Menu_Item* m = Main_Menu->test_shortcut(); + if (m && m->callback()) m->do_callback(this->o); + in_this_only = 0; + return (m != 0);} + + default: + return 0; + } +} + +//////////////////////////////////////////////////////////////// + +#include +#include "../src/flstring.h" + +void Fl_Window_Type::write_code1() { + Fl_Widget_Type::write_code1(); +} + +void Fl_Window_Type::write_code2() { + const char *var = is_class() ? "this" : name() ? name() : "o"; + write_extra_code(); + if (modal) write_c("%s%s->set_modal();\n", indent(), var); + else if (non_modal) write_c("%s%s->set_non_modal();\n", indent(), var); + if (!((Fl_Window*)o)->border()) { + write_c("%s%s->clear_border();\n", indent(), var); + } + if (xclass) { + write_c("%s%s->xclass(", indent(), var); + write_cstring(xclass); + write_c(");\n"); + } + if (sr_max_w || sr_max_h) { + write_c("%s%s->size_range(%d, %d, %d, %d);\n", indent(), var, + sr_min_w, sr_min_h, sr_max_w, sr_max_h); + } else if (sr_min_w || sr_min_h) { + write_c("%s%s->size_range(%d, %d);\n", indent(), var, sr_min_w, sr_min_h); + } + write_c("%s%s->end();\n", indent(), var); + if (((Fl_Window*)o)->resizable() == o) + write_c("%s%s->resizable(%s);\n", indent(), var, var); + write_block_close(); +} + +void Fl_Window_Type::write_properties() { + Fl_Widget_Type::write_properties(); + if (modal) write_string("modal"); + else if (non_modal) write_string("non_modal"); + if (!((Fl_Window*)o)->border()) write_string("noborder"); + if (xclass) {write_string("xclass"); write_word(xclass);} + if (sr_min_w || sr_min_h || sr_max_w || sr_max_h) + write_string("size_range {%d %d %d %d}", sr_min_w, sr_min_h, sr_max_w, sr_max_h); + if (o->visible()) write_string("visible"); +} + +extern int pasteoffset; +void Fl_Window_Type::read_property(const char *c) { + if (!strcmp(c,"modal")) { + modal = 1; + } else if (!strcmp(c,"non_modal")) { + non_modal = 1; + } else if (!strcmp(c, "visible")) { + if (Fl::first_window()) open(); // only if we are using user interface + } else if (!strcmp(c,"noborder")) { + ((Fl_Window*)o)->border(0); + } else if (!strcmp(c,"xclass")) { + storestring(read_word(),xclass); + ((Fl_Window*)o)->xclass(xclass); + } else if (!strcmp(c,"size_range")) { + int mw, mh, MW, MH; + if (sscanf(read_word(),"%d %d %d %d",&mw,&mh,&MW,&MH) == 4) { + sr_min_w = mw; sr_min_h = mh; sr_max_w = MW; sr_max_h = MH; + } + } else if (!strcmp(c,"xywh")) { + Fl_Widget_Type::read_property(c); + pasteoffset = 0; // make it not apply to contents + } else { + Fl_Widget_Type::read_property(c); + } +} + +int Fl_Window_Type::read_fdesign(const char* propname, const char* value) { + int x; + o->box(FL_NO_BOX); // because fdesign always puts an Fl_Box next + if (!strcmp(propname,"Width")) { + if (sscanf(value,"%d",&x) == 1) o->size(x,o->h()); + } else if (!strcmp(propname,"Height")) { + if (sscanf(value,"%d",&x) == 1) o->size(o->w(),x); + } else if (!strcmp(propname,"NumberofWidgets")) { + return 1; // we can figure out count from file + } else if (!strcmp(propname,"border")) { + if (sscanf(value,"%d",&x) == 1) ((Fl_Window*)o)->border(x); + } else if (!strcmp(propname,"title")) { + label(value); + } else { + return Fl_Widget_Type::read_fdesign(propname,value); + } + return 1; +} + +/////////////////////////////////////////////////////////////////////// + +Fl_Widget_Class_Type Fl_Widget_Class_type; +Fl_Widget_Class_Type *current_widget_class = 0; + +Fl_Type *Fl_Widget_Class_Type::make() { + Fl_Type *p = Fl_Type::current; + while (p && (!p->is_decl_block() || (p->is_widget() && p->is_class()))) p = p->parent; + Fl_Widget_Class_Type *myo = new Fl_Widget_Class_Type(); + myo->name("UserInterface"); + + if (!this->o) {// template widget + this->o = new Fl_Window(100,100); + Fl_Group::current(0); + } + // Set the size ranges for this window; in order to avoid opening the + // X display we use an arbitrary maximum size... + ((Fl_Window *)(this->o))->size_range(gridx, gridy, + 3072, 2048, + gridx, gridy, 0); + myo->factory = this; + myo->drag = 0; + myo->numselected = 0; + Overlay_Window *w = new Overlay_Window(100,100); + w->window = myo; + myo->o = w; + myo->add(p); + myo->modal = 0; + myo->non_modal = 0; + myo->wc_relative = 0; + + return myo; +} + +void Fl_Widget_Class_Type::write_properties() { + Fl_Window_Type::write_properties(); + if (wc_relative) write_string("position_relative"); +} + +void Fl_Widget_Class_Type::read_property(const char *c) { + if (!strcmp(c,"position_relative")) { + wc_relative = 1; + } else { + Fl_Window_Type::read_property(c); + } +} + +void Fl_Widget_Class_Type::write_code1() { +#if 0 + Fl_Widget_Type::write_code1(); +#endif // 0 + + current_widget_class = this; + write_public_state = 1; + + const char *c = subclass(); + if (!c) c = "Fl_Group"; + + write_h("\nclass %s : public %s {\n", name(), c); + if (strstr(c, "Window")) { + write_h(" void _%s();\n", name()); + write_h("public:\n"); + write_h(" %s(int X, int Y, int W, int H, const char *L = 0);\n", name()); + write_h(" %s(int W, int H, const char *L = 0);\n", name()); + + write_c("%s::%s(int X, int Y, int W, int H, const char *L)\n", name(), name()); + write_c(" : %s(X, Y, W, H, L) {\n", c); + write_c(" _%s();\n", name()); + write_c("}\n\n"); + + write_c("%s::%s(int W, int H, const char *L)\n", name(), name()); + write_c(" : %s(0, 0, W, H, L) {\n", c); + write_c(" clear_flag(16);\n"); + write_c(" _%s();\n", name()); + write_c("}\n\n"); + + write_c("void %s::_%s() {\n", name(), name()); +// write_c(" %s *w = this;\n", name()); + } else { + write_h("public:\n"); + write_h(" %s(int X, int Y, int W, int H, const char *L = 0);\n", name()); + + write_c("%s::%s(int X, int Y, int W, int H, const char *L)\n", name(), name()); + if (wc_relative) + write_c(" : %s(0, 0, W, H, L) {\n", c); + else + write_c(" : %s(X, Y, W, H, L) {\n", c); + } + +// write_c(" %s *o = this;\n", name()); + + write_widget_code(); +} + +void Fl_Widget_Class_Type::write_code2() { + write_extra_code(); + if (wc_relative) write_c("%sposition(X, Y);\n", indent()); + if (modal) write_c("%sset_modal();\n", indent()); + else if (non_modal) write_c("%sset_non_modal();\n", indent()); + if (!((Fl_Window*)o)->border()) write_c("%sclear_border();\n", indent()); + if (xclass) { + write_c("%sxclass(", indent()); + write_cstring(xclass); + write_c(");\n"); + } + write_c("%send();\n", indent()); + if (((Fl_Window*)o)->resizable() == o) + write_c("%sresizable(this);\n", indent()); + write_c("}\n"); +} + +//////////////////////////////////////////////////////////////// +// live mode support + +Fl_Widget *Fl_Window_Type::enter_live_mode(int) { + Fl_Window *win = new Fl_Window(o->x(), o->y(), o->w(), o->h()); + live_widget = win; + if (live_widget) { + copy_properties(); + Fl_Type *n; + for (n = next; n && n->level > level; n = n->next) { + if (n->level == level+1) + n->enter_live_mode(); + } + win->end(); + } + return live_widget; +} + +void Fl_Window_Type::leave_live_mode() { +} + +/** + * copy all properties from the edit widget to the live widget + */ +void Fl_Window_Type::copy_properties() { + Fl_Widget_Type::copy_properties(); + /// \todo copy resizing constraints over +} + + +// +// End of "$Id: Fl_Window_Type.cxx 6098 2008-04-12 18:04:09Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/Fluid_Image.cxx b/third_party/windows/fltk-1.1.10/fluid/Fluid_Image.cxx new file mode 100644 index 0000000..1b555de --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/Fluid_Image.cxx @@ -0,0 +1,229 @@ +// +// "$Id: Fluid_Image.cxx 5266 2006-07-26 19:52:28Z mike $" +// +// Pixmap label support for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include "Fl_Type.h" +#include "Fluid_Image.h" +#include "../src/flstring.h" +#include +#include +#include +#include + +extern void goto_source_dir(); // in fluid.C +extern void leave_source_dir(); // in fluid.C + +void Fluid_Image::image(Fl_Widget *o) { + if (o->window() != o) o->image(img); +} + +void Fluid_Image::deimage(Fl_Widget *o) { + if (o->window() != o) o->deimage(img); +} + +static int pixmap_header_written = 0; +static int bitmap_header_written = 0; +static int image_header_written = 0; + +void Fluid_Image::write_static() { + if (!img) return; + if (img->count() > 1) { + // Write Pixmap data... + write_c("\n"); + if (pixmap_header_written != write_number) { + write_c("#include \n"); + pixmap_header_written = write_number; + } + write_c("static const char *%s[] = {\n", + unique_id(this, "idata", fl_filename_name(name()), 0)); + write_cstring(img->data()[0], strlen(img->data()[0])); + + int i; + int ncolors, chars_per_color; + sscanf(img->data()[0], "%*d%*d%d%d", &ncolors, &chars_per_color); + + if (ncolors < 0) { + write_c(",\n"); + write_cstring(img->data()[1], ncolors * -4); + i = 2; + } else { + for (i = 1; i <= ncolors; i ++) { + write_c(",\n"); + write_cstring(img->data()[i], strlen(img->data()[i])); + } + } + for (; i < img->count(); i ++) { + write_c(",\n"); + write_cstring(img->data()[i], img->w() * chars_per_color); + } + write_c("\n};\n"); + write_c("static Fl_Pixmap %s(%s);\n", + unique_id(this, "image", fl_filename_name(name()), 0), + unique_id(this, "idata", fl_filename_name(name()), 0)); + } else if (img->d() == 0) { + // Write Bitmap data... + write_c("\n"); + if (bitmap_header_written != write_number) { + write_c("#include \n"); + bitmap_header_written = write_number; + } + write_c("static unsigned char %s[] =\n", + unique_id(this, "idata", fl_filename_name(name()), 0)); + write_cdata(img->data()[0], ((img->w() + 7) / 8) * img->h()); + write_c(";\n"); + write_c("static Fl_Bitmap %s(%s, %d, %d);\n", + unique_id(this, "image", fl_filename_name(name()), 0), + unique_id(this, "idata", fl_filename_name(name()), 0), + img->w(), img->h()); + } else { + // Write image data... + write_c("\n"); + if (image_header_written != write_number) { + write_c("#include \n"); + image_header_written = write_number; + } + write_c("static unsigned char %s[] =\n", + unique_id(this, "idata", fl_filename_name(name()), 0)); + write_cdata(img->data()[0], (img->w() * img->d() + img->ld()) * img->h()); + write_c(";\n"); + write_c("static Fl_RGB_Image %s(%s, %d, %d, %d, %d);\n", + unique_id(this, "image", fl_filename_name(name()), 0), + unique_id(this, "idata", fl_filename_name(name()), 0), + img->w(), img->h(), img->d(), img->ld()); + } +} + +void Fluid_Image::write_code(const char *var, int inactive) { + if (!img) return; + write_c("%s%s->%s(%s);\n", indent(), var, inactive ? "deimage" : "image", + unique_id(this, "image", fl_filename_name(name()), 0)); +} + + +//////////////////////////////////////////////////////////////// + +static Fluid_Image** images = 0; // sorted list +static int numimages = 0; +static int tablesize = 0; + +Fluid_Image* Fluid_Image::find(const char *iname) { + if (!iname || !*iname) return 0; + + // first search to see if it exists already: + int a = 0; + int b = numimages; + while (a < b) { + int c = (a+b)/2; + int i = strcmp(iname,images[c]->name_); + if (i < 0) b = c; + else if (i > 0) a = c+1; + else return images[c]; + } + + // no, so now see if the file exists: + + goto_source_dir(); + FILE *f = fopen(iname,"rb"); + if (!f) { + read_error("%s : %s",iname,strerror(errno)); + leave_source_dir(); + return 0; + } + fclose(f); + + Fluid_Image *ret = new Fluid_Image(iname); + + if (!ret->img || !ret->img->w() || !ret->img->h()) { + delete ret; + ret = 0; + read_error("%s : unrecognized image format", iname); + } + leave_source_dir(); + if (!ret) return 0; + + // make a new entry in the table: + numimages++; + if (numimages > tablesize) { + tablesize = tablesize ? 2*tablesize : 16; + if (images) images = (Fluid_Image**)realloc(images, tablesize*sizeof(Fluid_Image*)); + else images = (Fluid_Image**)malloc(tablesize*sizeof(Fluid_Image*)); + } + for (b = numimages-1; b > a; b--) images[b] = images[b-1]; + images[a] = ret; + + return ret; +} + +Fluid_Image::Fluid_Image(const char *iname) { + name_ = strdup(iname); + written = 0; + refcount = 0; + img = Fl_Shared_Image::get(iname); +} + +void Fluid_Image::increment() { + ++refcount; +} + +void Fluid_Image::decrement() { + --refcount; + if (refcount > 0) return; + delete this; +} + +Fluid_Image::~Fluid_Image() { + int a; + if (images) { + for (a = 0;; a++) if (images[a] == this) break; + numimages--; + for (; a < numimages; a++) images[a] = images[a+1]; + } + if (img) img->release(); + free((void*)name_); +} + +//////////////////////////////////////////////////////////////// + +#include + +const char *ui_find_image_name; +Fluid_Image *ui_find_image(const char *oldname) { + goto_source_dir(); + fl_file_chooser_ok_label("Use Image"); + const char *name = fl_file_chooser("Image?","Image Files (*.{bm,bmp,gif,jpg,pbm,pgm,png,ppm,xbm,xpm})",oldname,1); + fl_file_chooser_ok_label(NULL); + ui_find_image_name = name; + Fluid_Image *ret = (name && *name) ? Fluid_Image::find(name) : 0; + leave_source_dir(); + return ret; +} + + +// +// End of "$Id: Fluid_Image.cxx 5266 2006-07-26 19:52:28Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/Fluid_Image.h b/third_party/windows/fltk-1.1.10/fluid/Fluid_Image.h new file mode 100644 index 0000000..fa74835 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/Fluid_Image.h @@ -0,0 +1,66 @@ +// +// "$Id: Fluid_Image.h 5266 2006-07-26 19:52:28Z mike $" +// +// Image header file for the Fast Light Tool Kit (FLTK). +// +// This class stores the image labels for widgets in fluid. This is +// not a class in FLTK itself, and will produce different types of +// code depending on what the image type is. +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef FLUID_IMAGE_H +# define FLUID_IMAGE_H + +# include + + +class Fluid_Image { + const char *name_; + int refcount; + Fl_Shared_Image *img; +protected: + Fluid_Image(const char *name); // no public constructor + ~Fluid_Image(); // no public destructor +public: + int written; + static Fluid_Image* find(const char *); + void decrement(); // reference counting & automatic free + void increment(); + void image(Fl_Widget *); // set the image of this widget + void deimage(Fl_Widget *); // set the deimage of this widget + void write_static(); + void write_code(const char *var, int inactive = 0); + const char *name() const {return name_;} +}; + +// pop up file chooser and return a legal image selected by user, +// or zero for any errors: +Fluid_Image *ui_find_image(const char *); +extern const char *ui_find_image_name; + +#endif + +// +// End of "$Id: Fluid_Image.h 5266 2006-07-26 19:52:28Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/Makefile b/third_party/windows/fltk-1.1.10/fluid/Makefile new file mode 100644 index 0000000..cc7a662 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/Makefile @@ -0,0 +1,137 @@ +# +# "$Id: Makefile 6612 2008-12-29 20:21:29Z matt $" +# +# FLUID makefile for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2007 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems on the following page: +# +# http://www.fltk.org/str.php +# + +CPPFILES = \ + CodeEditor.cxx \ + Fl_Function_Type.cxx \ + Fl_Group_Type.cxx \ + Fl_Menu_Type.cxx \ + Fl_Type.cxx \ + Fl_Widget_Type.cxx \ + Fl_Window_Type.cxx \ + Fluid_Image.cxx \ + about_panel.cxx \ + align_widget.cxx \ + alignment_panel.cxx \ + code.cxx \ + factory.cxx \ + file.cxx \ + fluid.cxx \ + function_panel.cxx \ + template_panel.cxx \ + undo.cxx \ + widget_panel.cxx + +################################################################ + +OBJECTS = $(CPPFILES:.cxx=.o) + +include ../makeinclude + +all: $(FLUID) fluid$(EXEEXT) + +fluid$(EXEEXT): $(OBJECTS) $(LIBNAME) $(FLLIBNAME) \ + $(IMGLIBNAME) + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ $(OBJECTS) $(LINKFLTKFORMS) $(LINKFLTKIMG) $(LDLIBS) + $(OSX_ONLY) $(INSTALL_BIN) fluid fluid.app/Contents/MacOS + $(POSTBUILD) $@ ../FL/mac.r + +fluid-shared$(EXEEXT): $(OBJECTS) ../src/$(DSONAME) ../src/$(FLDSONAME) \ + ../src/$(IMGDSONAME) + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ $(OBJECTS) $(LINKSHARED) $(LDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +clean: + -$(RM) *.o core.* *~ *.bck *.bck + -$(RM) core fluid$(EXEEXT) fluid-shared$(EXEEXT) + -$(RM) fluid.app/Contents/MacOS/fluid$(EXEEXT) + +depend: $(CPPFILES) + makedepend -Y -I.. -f makedepend $(CPPFILES) + +# Automatically generated dependencies... +include makedepend + +install: all + echo "Installing FLUID in $(DESTDIR)$(bindir)..." + -$(INSTALL_DIR) $(DESTDIR)$(bindir) + $(INSTALL_BIN) $(FLUID) $(DESTDIR)$(bindir)/fluid$(EXEEXT) + +install-linux: + -$(INSTALL_DIR) $(DESTDIR)/usr/share/applications + $(INSTALL_DATA) fluid.desktop $(DESTDIR)/usr/share/applications + for size in 16 32 48 64 128; do \ + if test ! -d $(DESTDIR)/usr/share/icons/hicolor/$${size}x$${size}/apps; then \ + $(INSTALL_DIR) $(DESTDIR)/usr/share/icons/hicolor/$${size}x$${size}/apps; \ + fi; \ + $(INSTALL_DATA) icons/fluid-$$size.png $(DESTDIR)/usr/share/icons/hicolor/$${size}x$${size}/apps/fluid.png; \ + done + -$(INSTALL_DIR) $(DESTDIR)/usr/share/mimelnk/application + $(INSTALL_DATA) x-fluid.desktop $(DESTDIR)/usr/share/mimelnk/application + +install-osx: + echo Installing Fluid in $(DESTDIR)/Applications... + -$(INSTALL_DIR) $(DESTDIR)/Applications/fluid.app + -$(INSTALL_DIR) $(DESTDIR)/Applications/fluid.app/Contents + $(INSTALL_DATA) fluid.app/Contents/Info.plist $(DESTDIR)/Applications/fluid.app/Contents/Info.plist + $(INSTALL_DATA) fluid.app/Contents/PkgInfo $(DESTDIR)/Applications/fluid.app/Contents/PkgInfo + -$(INSTALL_DIR) $(DESTDIR)/Applications/fluid.app/Contents/MacOS + $(RM) $(DESTDIR)/Applications/fluid.app/Contents/MacOS/fluid + $(LN) $(bindir)/fluid $(DESTDIR)/Applications/fluid.app/Contents/MacOS/fluid + -$(INSTALL_DIR) $(DESTDIR)/Applications/fluid.app/Contents/Resources + $(INSTALL_DATA) fluid.app/Contents/Resources/fluid.icns $(DESTDIR)/Applications/fluid.app/Contents/Resources + +uninstall: + $(RM) $(DESTDIR)$(bindir)/fluid$(EXEEXT) + +uninstall-linux: + $(RM) $(DESTDIR)/usr/share/applications/fluid.desktop + $(RM) $(DESTDIR)/usr/share/icons/hicolor/*/fluid.png + $(RM) $(DESTDIR)/usr/share/mimelnk/application/x-fluid.desktop + +uninstall-osx: + $(RM) -r $(DESTDIR)/Applications/fluid.app + + +# +# Note: The rebuild target can only be used if you have the original .fl +# files. This is normally only used by the FLTK maintainers... +# + +rebuild: + ./fluid -c about_panel.fl + ./fluid -c alignment_panel.fl + ./fluid -c function_panel.fl + ./fluid -c print_panel.fl + ./fluid -c template_panel.fl + ./fluid -c widget_panel.fl + +# +# End of "$Id: Makefile 6612 2008-12-29 20:21:29Z matt $". +# diff --git a/third_party/windows/fltk-1.1.10/fluid/Shortcut_Button.h b/third_party/windows/fltk-1.1.10/fluid/Shortcut_Button.h new file mode 100644 index 0000000..7ed8c23 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/Shortcut_Button.h @@ -0,0 +1,41 @@ +// +// "$Id: Shortcut_Button.h 4288 2005-04-16 00:13:17Z mike $" +// +// Shortcut header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include + +class Shortcut_Button : public Fl_Button { +public: + int svalue; + int handle(int); + void draw(); + Shortcut_Button(int X,int Y,int W,int H, const char* l = 0) : + Fl_Button(X,Y,W,H,l) {svalue = 0;} +}; + +// +// End of "$Id: Shortcut_Button.h 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/about_panel.cxx b/third_party/windows/fltk-1.1.10/fluid/about_panel.cxx new file mode 100644 index 0000000..312180f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/about_panel.cxx @@ -0,0 +1,306 @@ +// +// "$Id: about_panel.cxx 6817 2009-07-02 09:42:17Z AlbrechtS $" +// +// About dialog for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2009 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0110 + +#include "about_panel.h" +void show_help(const char *name); + +Fl_Double_Window *about_panel=(Fl_Double_Window *)0; + +#include +static const char *idata_fluid[] = { +"96 96 32 1", +" \tc None", +".\tc #000100", +"+\tc #031F3F", +"@\tc #00366C", +"#\tc #2E302D", +"$\tc #0058AC", +"%\tc #0060BF", +"&\tc #4E504D", +"*\tc #14659F", +"=\tc #006DDC", +"-\tc #2C7087", +";\tc #0080FF", +">\tc #407B74", +",\tc #0F85F9", +"\'\tc #268CCD", +")\tc #7C7E7B", +"!\tc #2D92EC", +"~\tc #4498A9", +"{\tc #2F94FE", +"]\tc #5BA18C", +"^\tc #6BA674", +"/\tc #7DAD62", +"(\tc #93BD53", +"_\tc #A4A6A2", +":\tc #6CB6FF", +"<\tc #ABCC3F", +"[\tc #C4DA2A", +"}\tc #CACCC9", +"|\tc #DCE913", +"1\tc #BBDEFF", +"2\tc #FDFE00", +"3\tc #FDFFFC", +" \ + ", +" \ + ", +" \ + ", +" ........... \ + ", +" ...................... \ + ", +" ........................ \ + ", +" ........#&#&#&#&##...... \ + ", +" ....)__}33333333333}_... \ + ", +" ...&33333333333333333... \ + ", +" ...#33311133333333333... \ + ", +" ...&33!,{,;:333333333... \ + ", +" ...&3:,{{{{,13333333}... \ + ", +" ...&3!{{!{{,13333333}... \ + ", +" ...&3:!{{!{;13333333}... \ + ", +" ...&3{{{{{{;133333333... \ + ", +" ...&31,{{{;,33333333}... \ + ", +" ...&331{{{:133333333}... \ + ", +" ...&3333333333333333_... \ + ", +" ...&3333333333333333}... \ + ", +" ...&3333333333333333_... \ + ", +" ...&3333333333333333}... \ + ", +" ...&3333333333333333_... \ + ", +" ...&3333333333333333}... \ + ", +" ...&3333333333333333_... \ + ", +" ...&3333333331!,,;:3}... \ + ", +" ...&333333333{{{{{;:_... \ + ", +" ...&333333331,{!{!{{}... \ + ", +" ...&333333331{{{{{{,_... \ + ", +" ...)333333331{{!{{{{_... \ + ", +" ...)333333333{{{!{;:_... \ + ", +" ...)3333333331{;;;:3_... \ + ", +" ...)3333333333331333_... \ + ", +" ...)3333333333333333_... \ + ", +" ...)3333333333333333_... \ + ", +" ..._3333333333333333_... \ + ", +" ..._3333333333333333_... \ + ", +" ..._3333333333333333_... \ + ", +" ..._3333333333333333}.... \ + ", +" ...._33333333333333333#... \ + ", +" ....&333333333333333333_.... \ + ", +" ....&33333333333333333333).... \ + ", +" ....333333333333333333333}&.... \ + ", +" ...._33333333333333333333333.... \ + ", +" ....&333333333331:11333333333_.... \ + ", +" ....#33333333333:,,,;:333333333&.... \ + ", +" ....}3333333333:,!{{{;1333333333&.... \ + ", +" ....}33333333333{{{!{{,!3333333333.... \ + ", +" ....)333333333333{{{{!{{{3333333333_.... \ + ", +" ....#3333333333333!{{{{{,:33333333333&.... \ + ", +" ...._33333333333331{{!{,;1333333333333#.... \ + ", +" ...._333333333333333:;,;,13333333333333_.... \ + ", +" ...._333333333333333333113333333333333333_.... \ + ", +" ....&33333333333333333333333333331::1333333&.... \ + ", +" ...._333333333333333333333333333{,{{;{133333#... \ + ", +" ...._3333333333333333333333333331,{!{{,:33333}.... \ + ", +" ....&3333333333133333333333333333:{{{{{{:333333).... \ + ", +" ...#333333331{,,;:333333333333333:{!{!{{:3333333&.... \ + ", +" ....}33333333,{{{{;:333333333333331,{!{{;:33333333#... \ + ", +" ...._333333331,!{!{{,333333333333333{,{{;{1333333333.... \ + ", +" ....&3333333331{{{{{{{3333333333333333::::33333333333)....\ + ", +" ....+!:::::::::{{{{!{{;::::::::::::::::::::::::::!:::::+...\ +. ", +" ...+=;;;;;;;;;;;;{{{{;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=...\ +. ", +" ....%;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%..\ +.. ", +" ....@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;$.\ +... ", +" ...+%;;;;;;!!!;;;;;,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;!=;;;+\ +.... ", +" ....%;;;;;!([<|^~]^([%;;;;;;;;;;;;;;;;;,(<\'=;;;;;;;!^/<[|\'=;\ +;=+... ", +" ....$;;;;;\'|2>]22<|22[%=;;;;;;;;;;;;;;;;^22[%=;;;;;;!][22|%=;;\ +;$.... ", +" ....@;;;;;;[2[%^2|*[22(%=;;;;;;;;;;;;;;;,/22|$=;;;;;;;;<22<%=;;;\ +;$.... ", +" ....+=;;;;;~22^$%]~$|22>%=;;;;;;;;;;;;;;;;\'||^%=;;;;;;;,[22^$=;;\ +;;;+.... ", +" ....%;;;;;,[22-%===\'22|*==;;;;;;;;;;;;;;;;;;=%=;;;;;;;;\'22|*%=;\ +;;;;=+... ", +" ....$;;;;;;!22|$%;,;^22<$=;;;;;;;;;;;;;;;;;;===;;;;;;;;;^22|$==;;;\ +;;;%.... ", +" ....@;;;;;\'](22[^]=;;<22^$==!~]/~=;!]]~;;;;{\'~]==;;;;~<<]<22($=;;\ +;;;;;;@.... ", +" ....@;;;;;;]<|22|[<%;!|22-%\'[2222*=;/22(%;~|222(=;;;!<2|^[222>$=;;;\ +;;;;;;+.... ", +" ....=;;;;;;;,[22>$===~22|$==,[22[%=;[22]%=,!|22]%=;![2|*%]22|*==;;;;\ +;;;;;%+... ", +" ....@;;;;;;;;!|22*$=;;/22($=;,[22/$=\'222*%=;!|22-%;;<22>%=]22[$%;;;;\ +;;;;;;;=.... ", +" ....@;;;;;;;;;~22[*==;;[22>%=;\'22|-%,^22[$=;,~22[$%;]22<$%=(22/$=;;;;\ +;;;;;;;;@.... ", +" ....+;;;;;;;;;;^22<$=;;!222*$=;]22[$==[22/$=;;(22/$=![22]$=;|22-%=;;;;;\ +;;;;;;;;+... ", +" ....;;;;;;;;;;;<22^%=;;]22[$=;;(22/$=~222-%=;;[22>%=]22|$%;~22|$==;;;;;\ +;;;;;;;;;.... ", +" ....%;;;;;;;;;;;|22-%=;;(22/$=;{|22-%=<22|$%;;\'22|*%;<22<$==(22<$=;=;;;\ +;;;;;;;;;;$.... ", +" ....+;;;;;;;;;;;!222$==;,|22>%=;~22|$=]|22($=;;]22[$%,|22^%=!|22^$=;;;;;;\ +;;;;;;;;;;@.... ", +" ....+=;;;;;;;;;;;~22[$%;;\'22|*-/;]22($*[<22^$^=;(22/$(-222>$=(222->~;;;;;\ +;;;;;;;;;;;=+.... ", +" ...+;;;;;;;;;;;;;(22/$=;;]22|*<\'=(22/*[~[22>(]=;|22>//=|22/$^(|2|-[%=;;;;\ +;;;;;;;;;;;;=.... ", +" ....$;;;;;;;;;;;;;<22>%=;;]222|>==(222|^=|22|<%=;|222<%=(222|<-222|-==;;;;;\ +;;;;;;;;;;;;$.... ", +" ....@;;;;;;;;;;;;;!|2|$=;;;\'[2[>%=;\'|2[]%=/2|/$==;^2|(*%=!(2|($%<2[-%=;;;;\ +;;;;;;;;;;;;;;;@.... ", +"....@;;;;;;;;;;;;;;\'22($%;;;;=%%==;;;=%%%==;=%%==;;;=%===;;==%%====%%=,;;;;;\ +;;;;;;;;;;;;;;;+... ", +"...+=;;;;;;;;;;!\'=,]22-%=;;;;;;==;=;;;===;=;;===;;;;;===;;;;=;=,;;,=;=;;;;;;\ +;;;;;;;;;;;;;;;=....", +"...+;;;;;;;;;;;[2^=<2<$==;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\ +;;;;;;;;;;;;;;;+...", +"...+;;;;;;;;;;;22(\'2|*%=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\ +;;;;;;;;;;;;;;;;+...", +"...+;;;;;;;;;;;^|<[[-%=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\ +;;;;;;;;;;;;;;;+...", +"...+;;;;;;;;;;;;*~*%===;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\ +;;;;;;;;;;;;;;;@...", +"...+;;;;;;;;;;;;;====;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\ +;;;;;;;;;;;;;;;+...", +"....$=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\ +;;;;;;;;;;;;;=$....", +" .....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\ ++++++++++++++..... ", +" ............................................................................\ +................. ", +" ...........................................................................\ +................. ", +" ........................................................................\ +.............. " +}; +static Fl_Pixmap image_fluid(idata_fluid); + +static void cb_View(Fl_Button*, void*) { + show_help("license.html"); +} + +static void cb_Close(Fl_Return_Button* o, void*) { + ((Fl_Window*)(o->parent()))->hide(); +} + +Fl_Double_Window* make_about_panel() { + { about_panel = new Fl_Double_Window(315, 175, "About FLUID"); + about_panel->color(FL_LIGHT1); + about_panel->selection_color(FL_DARK1); + about_panel->hotspot(about_panel); + { Fl_Box* o = new Fl_Box(10, 10, 115, 120); + o->image(image_fluid); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(135, 10, 170, 69, "FLTK User\nInterface Designer\nVersion 1.1.10"); + o->color((Fl_Color)12); + o->selection_color(FL_DARK1); + o->labelfont(1); + o->labelsize(18); + o->align(FL_ALIGN_TOP_LEFT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(135, 89, 170, 42, "Copyright 1998-2009 by\nBill Spitzak and others"); + o->align(132|FL_ALIGN_INSIDE); + } // Fl_Box* o + { Fl_Button* o = new Fl_Button(89, 141, 123, 25, "View License..."); + o->labelcolor(FL_DARK_BLUE); + o->callback((Fl_Callback*)cb_View); + } // Fl_Button* o + { Fl_Return_Button* o = new Fl_Return_Button(222, 141, 83, 25, "Close"); + o->callback((Fl_Callback*)cb_Close); + } // Fl_Return_Button* o + about_panel->set_non_modal(); + about_panel->end(); + } // Fl_Double_Window* about_panel + return about_panel; +} + +// +// End of "$Id: about_panel.cxx 6817 2009-07-02 09:42:17Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/about_panel.fl b/third_party/windows/fltk-1.1.10/fluid/about_panel.fl new file mode 100644 index 0000000..f534285 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/about_panel.fl @@ -0,0 +1,74 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0108 +header_name {.h} +code_name {.cxx} +comment {// +// "$Id: about_panel.fl 6817 2009-07-02 09:42:17Z AlbrechtS $" +// +// About dialog for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2009 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +} {in_source in_header +} + +decl {void show_help(const char *name);} {public +} + +Function {make_about_panel()} {open +} { + Fl_Window about_panel { + label {About FLUID} open + xywh {390 162 315 175} type Double color 50 selection_color 47 hotspot non_modal visible + } { + Fl_Box {} { + image {icons/fluid-96.xpm} xywh {10 10 115 120} + } + Fl_Box {} { + label {FLTK User +Interface Designer +Version 1.1.10} + xywh {135 10 170 69} color 12 selection_color 47 labelfont 1 labelsize 18 align 21 + } + Fl_Box {} { + label {Copyright 1998-2009 by +Bill Spitzak and others} selected + xywh {135 89 170 42} align 148 + } + Fl_Button {} { + label {View License...} + callback {show_help("license.html");} + xywh {89 141 123 25} labelcolor 136 + } + Fl_Return_Button {} { + label Close + callback {((Fl_Window*)(o->parent()))->hide();} + xywh {222 141 83 25} + } + } +} + +comment { +// +// End of "$Id: about_panel.fl 6817 2009-07-02 09:42:17Z AlbrechtS $". +//} {in_source in_header +} diff --git a/third_party/windows/fltk-1.1.10/fluid/about_panel.h b/third_party/windows/fltk-1.1.10/fluid/about_panel.h new file mode 100644 index 0000000..35416db --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/about_panel.h @@ -0,0 +1,44 @@ +// +// "$Id: about_panel.h 6817 2009-07-02 09:42:17Z AlbrechtS $" +// +// About dialog for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2009 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0110 + +#ifndef about_panel_h +#define about_panel_h +#include +extern void show_help(const char *name); +#include +extern Fl_Double_Window *about_panel; +#include +#include +#include +Fl_Double_Window* make_about_panel(); +#endif + +// +// End of "$Id: about_panel.h 6817 2009-07-02 09:42:17Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/align_widget.cxx b/third_party/windows/fltk-1.1.10/fluid/align_widget.cxx new file mode 100644 index 0000000..2a95df1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/align_widget.cxx @@ -0,0 +1,541 @@ +// +// "$Id: align_widget.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// Alignment code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include "Fl_Widget_Type.h" +#include "undo.h" + +/** + * the first behaviour always uses the first selected widget as a reference + * the second behaviour uses the largest widget (most extreme positions) as + * a reference. + */ +#define BREAK_ON_FIRST break +//#define BREAK_ON_FIRST + +void align_widget_cb(Fl_Widget*, long how) +{ + const int max = 32768, min = -32768; + int left, right, top, bot, wdt, hgt, n; + Fl_Type *o; + int changed = 0; + switch ( how ) + { + //---- align + case 10: // align left + left = max; + for (o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (w->x()x(); + BREAK_ON_FIRST; + } + if (left!=max) + for (Fl_Type *o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (o->next && o->next->level > o->level && !o->next->selected && + !o->is_menu_button()) { + // When resizing a group, make sure we also move the children... + ((igroup *)w)->full_resize(left, w->y(), w->w(), w->h()); + } else { + // Otherwise, just do the widget... + w->resize(left, w->y(), w->w(), w->h()); + } + w->redraw(); + if (w->window()) w->window()->redraw(); + } + break; + case 11: // align h.center + left = max; right = min; + for (o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (w->x()x(); + if (w->x()+w->w()>right) + right = w->x()+w->w(); + BREAK_ON_FIRST; + } + if (left!=max) + { + int center2 = left+right; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (o->next && o->next->level > o->level && !o->next->selected && + !o->is_menu_button()) { + // When resizing a group, make sure we also move the children... + ((igroup *)w)->full_resize((center2-w->w())/2, w->y(), w->w(), w->h()); + } else { + // Otherwise, just do the widget... + w->resize((center2-w->w())/2, w->y(), w->w(), w->h()); + } + w->redraw(); + if (w->window()) w->window()->redraw(); + } + } + break; + case 12: // align right + right = min; + for (o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (w->x()+w->w()>right) + right = w->x()+w->w(); + BREAK_ON_FIRST; + } + if (right!=min) + for (Fl_Type *o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (o->next && o->next->level > o->level && !o->next->selected && + !o->is_menu_button()) { + // When resizing a group, make sure we also move the children... + ((igroup *)w)->full_resize(right-w->w(), w->y(), w->w(), w->h()); + } else { + // Otherwise, just do the widget... + w->resize(right-w->w(), w->y(), w->w(), w->h()); + } + w->redraw(); + if (w->window()) w->window()->redraw(); + } + break; + case 13: // align top + top = max; + for (o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (w->y()y(); + BREAK_ON_FIRST; + } + if (top!=max) + for (Fl_Type *o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (o->next && o->next->level > o->level && !o->next->selected && + !o->is_menu_button()) { + // When resizing a group, make sure we also move the children... + ((igroup *)w)->full_resize(w->x(), top, w->w(), w->h()); + } else { + // Otherwise, just do the widget... + w->resize(w->x(), top, w->w(), w->h()); + } + w->redraw(); + if (w->window()) w->window()->redraw(); + } + break; + case 14: // align v.center + top = max; bot = min; + for (o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (w->y()y(); + if (w->y()+w->h()>bot) + bot = w->y()+w->h(); + BREAK_ON_FIRST; + } + if (top!=max) + { + int center2 = top+bot; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (o->next && o->next->level > o->level && !o->next->selected && + !o->is_menu_button()) { + // When resizing a group, make sure we also move the children... + ((igroup *)w)->full_resize(w->x(), (center2-w->h())/2, w->w(), w->h()); + } else { + // Otherwise, just do the widget... + w->resize(w->x(), (center2-w->h())/2, w->w(), w->h()); + } + w->redraw(); + if (w->window()) w->window()->redraw(); + } + } + break; + case 15: // align bottom + bot = min; + for (o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (w->y()+w->h()>bot) + bot = w->y()+w->h(); + BREAK_ON_FIRST; + } + if (bot!=min) + for (Fl_Type *o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (o->next && o->next->level > o->level && !o->next->selected && + !o->is_menu_button()) { + // When resizing a group, make sure we also move the children... + ((igroup *)w)->full_resize( w->x(), bot-w->h(), w->w(), w->h()); + } else { + // Otherwise, just do the widget... + w->resize( w->x(), bot-w->h(), w->w(), w->h()); + } + w->redraw(); + if (w->window()) w->window()->redraw(); + } + break; + //---- space evently + case 20: // space evenly across + left = max; right = min; wdt = 0, n = 0; + for (o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (w->x()x(); + if (w->x()+w->w()>right) + right = w->x()+w->w(); + wdt += w->w(); + n++; + } + wdt = (right-left)-wdt; + n--; + if (n>0) + { + int cnt = 0, wsum = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (o->next && o->next->level > o->level && !o->next->selected && + !o->is_menu_button()) { + // When resizing a group, make sure we also move the children... + ((igroup *)w)->full_resize(left+wsum+wdt*cnt/n, w->y(), w->w(), w->h()); + } else { + // Otherwise, just do the widget... + w->resize(left+wsum+wdt*cnt/n, w->y(), w->w(), w->h()); + } + w->redraw(); + if (w->window()) w->window()->redraw(); + cnt++; + wsum += w->w(); + } + } + break; + case 21: // space evenly down + top = max; bot = min; hgt = 0, n = 0; + for (o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (w->y()y(); + if (w->y()+w->h()>bot) + bot = w->y()+w->h(); + hgt += w->h(); + n++; + } + hgt = (bot-top)-hgt; + n--; + if (n>0) + { + int cnt = 0, hsum = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (o->next && o->next->level > o->level && !o->next->selected && + !o->is_menu_button()) { + // When resizing a group, make sure we also move the children... + ((igroup *)w)->full_resize(w->x(), top+hsum+hgt*cnt/n, w->w(), w->h()); + } else { + // Otherwise, just do the widget... + w->resize(w->x(), top+hsum+hgt*cnt/n, w->w(), w->h()); + } + w->redraw(); + if (w->window()) w->window()->redraw(); + cnt++; + hsum += w->h(); + } + } + break; + //---- make same size + case 30: // same width + wdt = min; + for (o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (w->w()>wdt) + wdt = w->w(); + BREAK_ON_FIRST; + } + if (wdt!=min) + for (Fl_Type *o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (o->next && o->next->level > o->level && !o->next->selected && + !o->is_menu_button()) { + // When resizing a group, make sure we also move the children... + ((igroup *)w)->full_resize(w->x(), w->y(), wdt, w->h()); + } else { + // Otherwise, just do the widget... + w->resize(w->x(), w->y(), wdt, w->h()); + } + w->redraw(); + if (w->window()) w->window()->redraw(); + } + break; + case 31: // same height + hgt = min; + for (o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (w->h()>hgt) + hgt = w->h(); + BREAK_ON_FIRST; + } + if (hgt!=min) + for (Fl_Type *o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (o->next && o->next->level > o->level && !o->next->selected && + !o->is_menu_button()) { + // When resizing a group, make sure we also move the children... + ((igroup *)w)->full_resize( w->x(), w->y(), w->w(), hgt); + } else { + // Otherwise, just do the widget... + w->resize( w->x(), w->y(), w->w(), hgt); + } + w->redraw(); + if (w->window()) w->window()->redraw(); + } + break; + case 32: // same size + hgt = min; wdt = min; + for (o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (w->w()>wdt) + wdt = w->w(); + if (w->h()>hgt) + hgt = w->h(); + BREAK_ON_FIRST; + } + if (hgt!=min) + for (Fl_Type *o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget()) + { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + if (o->next && o->next->level > o->level && !o->next->selected && + !o->is_menu_button()) { + // When resizing a group, make sure we also move the children... + ((igroup *)w)->full_resize( w->x(), w->y(), wdt, hgt); + } else { + // Otherwise, just do the widget... + w->resize( w->x(), w->y(), wdt, hgt); + } + w->redraw(); + if (w->window()) w->window()->redraw(); + } + break; + //---- center in group + case 40: // center hor + for (o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget() && o->parent) + { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + Fl_Widget *p = ((Fl_Widget_Type *)o->parent)->o; + int center2; + + if (w->window() == p) center2 = p->w(); + else center2 = 2*p->x()+p->w(); + + if (o->next && o->next->level > o->level && !o->next->selected && + !o->is_menu_button() && !o->is_menu_button()) { + // When resizing a group, make sure we also move the children... + ((igroup *)w)->full_resize((center2-w->w())/2, w->y(), w->w(), w->h()); + } else { + // Otherwise, just do the widget... + w->resize((center2-w->w())/2, w->y(), w->w(), w->h()); + } + w->redraw(); + if (w->window()) w->window()->redraw(); + } + break; + case 41: // center vert + for (o = Fl_Type::first; o; o = o->next) + if (o->selected && o->is_widget() && o->parent) + { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + Fl_Widget *p = ((Fl_Widget_Type *)o->parent)->o; + int center2; + + if (w->window() == p) center2 = p->h(); + else center2 = 2*p->y()+p->h(); + + if (o->next && o->next->level > o->level && !o->next->selected && + !o->is_menu_button()) { + // When resizing a group, make sure we also move the children... + ((igroup *)w)->full_resize(w->x(), (center2-w->h())/2, w->w(), w->h()); + } else { + // Otherwise, just do the widget... + w->resize(w->x(), (center2-w->h())/2, w->w(), w->h()); + } + set_modflag(1); + w->redraw(); + if (w->window()) w->window()->redraw(); + } + break; + } +} + + +// Set sizes of selected widgets... +void widget_size_cb(Fl_Widget *, long size) { + // Update any selected widgets... + int changed = 0; + for (Fl_Type *o = Fl_Type::first; o; o = o->next) { + if (o->selected && o->is_widget()) { + if (!changed) { + changed = 1; + set_modflag(1); + undo_checkpoint(); + } + + Fl_Widget *w = ((Fl_Widget_Type *)o)->o; + w->labelsize((uchar)size); + Fl_Font f; + int s = (int)size; + Fl_Color c; + ((Fl_Widget_Type *)o)->textstuff(2, f, s, c); + + w->redraw(); + // since this may be a major change, the whole window should be redrawn + if (w->window()) w->window()->redraw(); + } + } +} + + +// +// End of "$Id: align_widget.cxx 5845 2007-05-20 00:01:06Z mike $". +// + diff --git a/third_party/windows/fltk-1.1.10/fluid/alignment_panel.cxx b/third_party/windows/fltk-1.1.10/fluid/alignment_panel.cxx new file mode 100644 index 0000000..46623aa --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/alignment_panel.cxx @@ -0,0 +1,506 @@ +// +// "$Id: alignment_panel.cxx 6817 2009-07-02 09:42:17Z AlbrechtS $" +// +// Setting and shell dialogs for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0110 + +#include "alignment_panel.h" + +Fl_Double_Window *project_window=(Fl_Double_Window *)0; + +static void cb_Close(Fl_Button*, void*) { + project_window->hide(); +} + +Fl_Input *header_file_input=(Fl_Input *)0; + +Fl_Input *code_file_input=(Fl_Input *)0; + +Fl_Check_Button *include_H_from_C_button=(Fl_Check_Button *)0; + +Fl_Check_Button *use_FL_COMMAND_button=(Fl_Check_Button *)0; + +Fl_Choice *i18n_type_chooser=(Fl_Choice *)0; + +Fl_Menu_Item menu_i18n_type_chooser[] = { + {"None", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"GNU gettext", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"POSIX catgets", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0}, + {0,0,0,0,0,0,0,0,0} +}; + +Fl_Input *i18n_include_input=(Fl_Input *)0; + +Fl_Input *i18n_file_input=(Fl_Input *)0; + +Fl_Input *i18n_set_input=(Fl_Input *)0; + +Fl_Input *i18n_function_input=(Fl_Input *)0; + +Fl_Double_Window* make_project_window() { + { project_window = new Fl_Double_Window(358, 207, "Project Settings"); + { Fl_Button* o = new Fl_Button(293, 175, 52, 20, "Close"); + o->tooltip("Close this dialog."); + o->labelsize(11); + o->callback((Fl_Callback*)cb_Close); + } // Fl_Button* o + { Fl_Tabs* o = new Fl_Tabs(10, 10, 335, 151); + o->selection_color((Fl_Color)12); + o->labelsize(11); + { Fl_Group* o = new Fl_Group(10, 30, 335, 131, "Output"); + o->labelsize(11); + { Fl_Box* o = new Fl_Box(15, 40, 325, 15, "Use \"name.ext\" to set name or just \".ext\" to set extension."); + o->labelsize(11); + o->align(FL_ALIGN_WRAP|FL_ALIGN_INSIDE); + } // Fl_Box* o + { header_file_input = new Fl_Input(96, 60, 228, 20, "Header File:"); + header_file_input->tooltip("The name of the generated header file."); + header_file_input->box(FL_THIN_DOWN_BOX); + header_file_input->labelfont(1); + header_file_input->labelsize(11); + header_file_input->textfont(4); + header_file_input->textsize(11); + header_file_input->callback((Fl_Callback*)header_input_cb, (void*)(1)); + header_file_input->when(FL_WHEN_CHANGED); + } // Fl_Input* header_file_input + { code_file_input = new Fl_Input(97, 85, 227, 20, "Code File:"); + code_file_input->tooltip("The name of the generated code file."); + code_file_input->box(FL_THIN_DOWN_BOX); + code_file_input->labelfont(1); + code_file_input->labelsize(11); + code_file_input->textfont(4); + code_file_input->textsize(11); + code_file_input->callback((Fl_Callback*)code_input_cb, (void*)(1)); + code_file_input->when(FL_WHEN_CHANGED); + } // Fl_Input* code_file_input + { include_H_from_C_button = new Fl_Check_Button(95, 110, 145, 20, "Include Header from Code"); + include_H_from_C_button->tooltip("Include the header file from the code file."); + include_H_from_C_button->down_box(FL_DOWN_BOX); + include_H_from_C_button->labelsize(11); + include_H_from_C_button->callback((Fl_Callback*)include_H_from_C_button_cb); + } // Fl_Check_Button* include_H_from_C_button + { use_FL_COMMAND_button = new Fl_Check_Button(95, 130, 245, 20, "Generate menu shortcuts using FL_COMMAND"); + use_FL_COMMAND_button->tooltip("Replace FL_CTRL with FL_COMMAND when generating menu shortcut code."); + use_FL_COMMAND_button->down_box(FL_DOWN_BOX); + use_FL_COMMAND_button->labelsize(11); + use_FL_COMMAND_button->callback((Fl_Callback*)use_FL_COMMAND_button_cb); + } // Fl_Check_Button* use_FL_COMMAND_button + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(10, 30, 335, 131, "Internationalization"); + o->labelsize(11); + o->hide(); + { i18n_type_chooser = new Fl_Choice(80, 42, 100, 20, "Use:"); + i18n_type_chooser->tooltip("Type of internationalization to use."); + i18n_type_chooser->box(FL_THIN_UP_BOX); + i18n_type_chooser->down_box(FL_BORDER_BOX); + i18n_type_chooser->labelfont(1); + i18n_type_chooser->labelsize(11); + i18n_type_chooser->textsize(11); + i18n_type_chooser->callback((Fl_Callback*)i18n_type_cb); + i18n_type_chooser->menu(menu_i18n_type_chooser); + } // Fl_Choice* i18n_type_chooser + { i18n_include_input = new Fl_Input(80, 67, 245, 20, "#include:"); + i18n_include_input->tooltip("The include file for internationalization."); + i18n_include_input->box(FL_THIN_DOWN_BOX); + i18n_include_input->labelfont(1); + i18n_include_input->labelsize(11); + i18n_include_input->textfont(4); + i18n_include_input->textsize(11); + i18n_include_input->callback((Fl_Callback*)i18n_text_cb); + } // Fl_Input* i18n_include_input + { i18n_file_input = new Fl_Input(80, 92, 245, 20, "File:"); + i18n_file_input->tooltip("The name of the message catalog."); + i18n_file_input->box(FL_THIN_DOWN_BOX); + i18n_file_input->labelfont(1); + i18n_file_input->labelsize(11); + i18n_file_input->textfont(4); + i18n_file_input->textsize(11); + i18n_file_input->callback((Fl_Callback*)i18n_text_cb); + } // Fl_Input* i18n_file_input + { i18n_set_input = new Fl_Input(80, 117, 245, 20, "Set:"); + i18n_set_input->tooltip("The message set number."); + i18n_set_input->type(2); + i18n_set_input->box(FL_THIN_DOWN_BOX); + i18n_set_input->labelfont(1); + i18n_set_input->labelsize(11); + i18n_set_input->textfont(4); + i18n_set_input->textsize(11); + i18n_set_input->callback((Fl_Callback*)i18n_text_cb); + } // Fl_Input* i18n_set_input + { i18n_function_input = new Fl_Input(80, 92, 245, 20, "Function:"); + i18n_function_input->tooltip("The function to call to internationalize the labels and tooltips."); + i18n_function_input->box(FL_THIN_DOWN_BOX); + i18n_function_input->labelfont(1); + i18n_function_input->labelsize(11); + i18n_function_input->textfont(4); + i18n_function_input->textsize(11); + i18n_function_input->callback((Fl_Callback*)i18n_text_cb); + } // Fl_Input* i18n_function_input + o->end(); + } // Fl_Group* o + o->end(); + } // Fl_Tabs* o + project_window->set_modal(); + project_window->end(); + } // Fl_Double_Window* project_window + return project_window; +} +Fl_Text_Buffer *shell_run_buffer; +void scheme_cb(Fl_Choice *, void *); + +Fl_Double_Window *settings_window=(Fl_Double_Window *)0; + +Fl_Choice *scheme_choice=(Fl_Choice *)0; + +Fl_Menu_Item menu_scheme_choice[] = { + {"Default", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"None", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"Plastic", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"GTK+", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {0,0,0,0,0,0,0,0,0} +}; + +Fl_Check_Button *tooltips_button=(Fl_Check_Button *)0; + +static void cb_tooltips_button(Fl_Check_Button*, void*) { + Fl_Tooltip::enable(tooltips_button->value()); +fluid_prefs.set("show_tooltips", tooltips_button->value()); +} + +Fl_Check_Button *completion_button=(Fl_Check_Button *)0; + +static void cb_completion_button(Fl_Check_Button*, void*) { + fluid_prefs.set("show_completion_dialogs", completion_button->value()); +} + +Fl_Check_Button *openlast_button=(Fl_Check_Button *)0; + +static void cb_openlast_button(Fl_Check_Button*, void*) { + fluid_prefs.set("open_previous_file", openlast_button->value()); +} + +Fl_Check_Button *prevpos_button=(Fl_Check_Button *)0; + +static void cb_prevpos_button(Fl_Check_Button*, void*) { + fluid_prefs.set("prev_window_pos", prevpos_button->value()); +} + +static void cb_Close1(Fl_Button*, void*) { + settings_window->hide(); +} + +Fl_Spinner *recent_spinner=(Fl_Spinner *)0; + +static void cb_recent_spinner(Fl_Spinner*, void*) { + fluid_prefs.set("recent_files", recent_spinner->value()); +load_history(); +} + +Fl_Double_Window* make_settings_window() { + { settings_window = new Fl_Double_Window(340, 225, "GUI Settings"); + { scheme_choice = new Fl_Choice(116, 10, 115, 25, "Scheme:"); + scheme_choice->down_box(FL_BORDER_BOX); + scheme_choice->labelfont(1); + scheme_choice->callback((Fl_Callback*)scheme_cb); + scheme_choice->menu(menu_scheme_choice); + int s; + fluid_prefs.get("scheme", s, 0); + scheme_choice->value(s); + scheme_cb(0, 0); + } // Fl_Choice* scheme_choice + { Fl_Group* o = new Fl_Group(116, 45, 215, 100, "Options:\n\n\n\n\n"); + o->labelfont(1); + o->align(FL_ALIGN_LEFT); + { tooltips_button = new Fl_Check_Button(116, 45, 113, 25, "Show Tooltips"); + tooltips_button->down_box(FL_DOWN_BOX); + tooltips_button->callback((Fl_Callback*)cb_tooltips_button); + int b; + fluid_prefs.get("show_tooltips", b, 1); + tooltips_button->value(b); + Fl_Tooltip::enable(b); + } // Fl_Check_Button* tooltips_button + { completion_button = new Fl_Check_Button(116, 70, 186, 25, "Show Completion Dialogs"); + completion_button->down_box(FL_DOWN_BOX); + completion_button->callback((Fl_Callback*)cb_completion_button); + int b; + fluid_prefs.get("show_completion_dialogs", b, 1); + completion_button->value(b); + } // Fl_Check_Button* completion_button + { openlast_button = new Fl_Check_Button(116, 95, 215, 25, "Open Previous File on Startup"); + openlast_button->down_box(FL_DOWN_BOX); + openlast_button->callback((Fl_Callback*)cb_openlast_button); + int b; + fluid_prefs.get("open_previous_file", b, 0); + openlast_button->value(b); + } // Fl_Check_Button* openlast_button + { prevpos_button = new Fl_Check_Button(116, 120, 210, 25, "Remember Window Positions"); + prevpos_button->down_box(FL_DOWN_BOX); + prevpos_button->callback((Fl_Callback*)cb_prevpos_button); + int b; + fluid_prefs.get("prev_window_pos", b, 1); + prevpos_button->value(b); + } // Fl_Check_Button* prevpos_button + o->end(); + } // Fl_Group* o + { Fl_Button* o = new Fl_Button(266, 190, 64, 25, "Close"); + o->tooltip("Close this dialog."); + o->callback((Fl_Callback*)cb_Close1); + } // Fl_Button* o + { recent_spinner = new Fl_Spinner(116, 155, 40, 25, "# Recent Files:"); + recent_spinner->labelfont(1); + recent_spinner->callback((Fl_Callback*)cb_recent_spinner); + recent_spinner->when(FL_WHEN_CHANGED); + int c; + fluid_prefs.get("recent_files", c, 5); + recent_spinner->maximum(10); + recent_spinner->value(c); + } // Fl_Spinner* recent_spinner + settings_window->set_non_modal(); + settings_window->end(); + } // Fl_Double_Window* settings_window + return settings_window; +} + +Fl_Double_Window *shell_window=(Fl_Double_Window *)0; + +Fl_Input *shell_command_input=(Fl_Input *)0; + +static void cb_shell_command_input(Fl_Input*, void*) { + fluid_prefs.set("shell_command", shell_command_input->value()); +} + +Fl_Check_Button *shell_writecode_button=(Fl_Check_Button *)0; + +static void cb_shell_writecode_button(Fl_Check_Button*, void*) { + fluid_prefs.set("shell_writecode", shell_writecode_button->value()); +} + +Fl_Check_Button *shell_writemsgs_button=(Fl_Check_Button *)0; + +static void cb_shell_writemsgs_button(Fl_Check_Button*, void*) { + fluid_prefs.set("shell_writemsgs", shell_writemsgs_button->value()); +} + +Fl_Check_Button *shell_savefl_button=(Fl_Check_Button *)0; + +static void cb_shell_savefl_button(Fl_Check_Button*, void*) { + fluid_prefs.set("shell_savefl", shell_savefl_button->value()); +} + +static void cb_Cancel(Fl_Button*, void*) { + shell_window->hide(); +} + +Fl_Double_Window *shell_run_window=(Fl_Double_Window *)0; + +Fl_Text_Display *shell_run_display=(Fl_Text_Display *)0; + +Fl_Return_Button *shell_run_button=(Fl_Return_Button *)0; + +static void cb_shell_run_button(Fl_Return_Button*, void*) { + shell_run_window->hide(); +} + +Fl_Double_Window* make_shell_window() { + { shell_window = new Fl_Double_Window(365, 125, "Shell Command"); + { shell_command_input = new Fl_Input(10, 27, 347, 25, "Command:"); + shell_command_input->labelfont(1); + shell_command_input->callback((Fl_Callback*)cb_shell_command_input); + shell_command_input->align(FL_ALIGN_TOP_LEFT); + char buf[1024]; + fluid_prefs.get("shell_command", buf, "", sizeof(buf)); + shell_command_input->value(buf); + } // Fl_Input* shell_command_input + { shell_writecode_button = new Fl_Check_Button(128, 61, 93, 19, "Write Code"); + shell_writecode_button->down_box(FL_DOWN_BOX); + shell_writecode_button->callback((Fl_Callback*)cb_shell_writecode_button); + int b; + fluid_prefs.get("shell_writecode", b, 1); + shell_writecode_button->value(b); + } // Fl_Check_Button* shell_writecode_button + { shell_writemsgs_button = new Fl_Check_Button(231, 61, 126, 19, "Write Messages"); + shell_writemsgs_button->down_box(FL_DOWN_BOX); + shell_writemsgs_button->callback((Fl_Callback*)cb_shell_writemsgs_button); + int b; + fluid_prefs.get("shell_writemsgs", b, 0); + shell_writemsgs_button->value(b); + } // Fl_Check_Button* shell_writemsgs_button + { shell_savefl_button = new Fl_Check_Button(10, 62, 108, 19, "Save .FL File"); + shell_savefl_button->down_box(FL_DOWN_BOX); + shell_savefl_button->callback((Fl_Callback*)cb_shell_savefl_button); + int b; + fluid_prefs.get("shell_savefl", b, 1); + shell_savefl_button->value(b); + } // Fl_Check_Button* shell_savefl_button + { Fl_Return_Button* o = new Fl_Return_Button(132, 90, 143, 25, "Run Command"); + o->callback((Fl_Callback*)do_shell_command); + } // Fl_Return_Button* o + { Fl_Button* o = new Fl_Button(285, 90, 72, 25, "Cancel"); + o->callback((Fl_Callback*)cb_Cancel); + } // Fl_Button* o + shell_window->end(); + } // Fl_Double_Window* shell_window + { shell_run_window = new Fl_Double_Window(555, 430, "Shell Command Output"); + { shell_run_display = new Fl_Text_Display(10, 10, 535, 375); + shell_run_display->box(FL_DOWN_BOX); + shell_run_display->textfont(4); + Fl_Group::current()->resizable(shell_run_display); + shell_run_buffer = new Fl_Text_Buffer(); + shell_run_display->buffer(shell_run_buffer); + } // Fl_Text_Display* shell_run_display + { shell_run_button = new Fl_Return_Button(468, 395, 77, 25, "Close"); + shell_run_button->callback((Fl_Callback*)cb_shell_run_button); + } // Fl_Return_Button* shell_run_button + shell_run_window->end(); + } // Fl_Double_Window* shell_run_window + return shell_run_window; +} + +Fl_Double_Window *grid_window=(Fl_Double_Window *)0; + +Fl_Input *horizontal_input=(Fl_Input *)0; + +Fl_Input *vertical_input=(Fl_Input *)0; + +Fl_Input *snap_input=(Fl_Input *)0; + +Fl_Check_Button *guides_toggle=(Fl_Check_Button *)0; + +static void cb_Close2(Fl_Button*, void*) { + grid_window->hide(); +} + +Fl_Round_Button *def_widget_size[6]={(Fl_Round_Button *)0}; + +Fl_Double_Window* make_layout_window() { + { grid_window = new Fl_Double_Window(285, 245, "Layout Settings"); + { Fl_Input* o = horizontal_input = new Fl_Input(106, 10, 50, 25, "x"); + horizontal_input->tooltip("Horizontal grid spacing."); + horizontal_input->type(2); + horizontal_input->box(FL_THIN_DOWN_BOX); + horizontal_input->callback((Fl_Callback*)grid_cb, (void*)(1)); + horizontal_input->align(FL_ALIGN_RIGHT); + o->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY); + } // Fl_Input* horizontal_input + { Fl_Input* o = vertical_input = new Fl_Input(166, 10, 50, 25, "pixels"); + vertical_input->tooltip("Vertical grid spacing."); + vertical_input->type(2); + vertical_input->box(FL_THIN_DOWN_BOX); + vertical_input->callback((Fl_Callback*)grid_cb, (void*)(2)); + vertical_input->align(FL_ALIGN_RIGHT); + o->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY); + } // Fl_Input* vertical_input + { Fl_Input* o = snap_input = new Fl_Input(106, 45, 50, 25, "pixel snap"); + snap_input->tooltip("Snap to grid within this many pixels."); + snap_input->type(2); + snap_input->box(FL_THIN_DOWN_BOX); + snap_input->callback((Fl_Callback*)grid_cb, (void*)(3)); + snap_input->align(FL_ALIGN_RIGHT); + o->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY); + } // Fl_Input* snap_input + { guides_toggle = new Fl_Check_Button(106, 80, 110, 25, "Show Guides"); + guides_toggle->tooltip("Show distance and alignment guides in overlay"); + guides_toggle->down_box(FL_DOWN_BOX); + guides_toggle->callback((Fl_Callback*)guides_cb, (void*)(4)); + } // Fl_Check_Button* guides_toggle + { Fl_Button* o = new Fl_Button(215, 210, 60, 25, "Close"); + o->tooltip("Close this dialog."); + o->callback((Fl_Callback*)cb_Close2); + } // Fl_Button* o + { Fl_Box* o = new Fl_Box(26, 10, 70, 25, "Grid:"); + o->labelfont(1); + o->align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(-1, 115, 97, 25, "Widget Size:"); + o->labelfont(1); + o->align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { Fl_Group* o = new Fl_Group(105, 115, 170, 75); + { def_widget_size[0] = new Fl_Round_Button(105, 115, 70, 25); + def_widget_size[0]->type(102); + def_widget_size[0]->down_box(FL_ROUND_DOWN_BOX); + def_widget_size[0]->callback((Fl_Callback*)default_widget_size_cb, (void*)(8)); + } // Fl_Round_Button* def_widget_size[0] + { Fl_Box* o = new Fl_Box(120, 115, 50, 25, "tiny"); + o->labelsize(8); + o->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { def_widget_size[1] = new Fl_Round_Button(180, 115, 70, 25); + def_widget_size[1]->type(102); + def_widget_size[1]->down_box(FL_ROUND_DOWN_BOX); + def_widget_size[1]->callback((Fl_Callback*)default_widget_size_cb, (void*)(11)); + } // Fl_Round_Button* def_widget_size[1] + { Fl_Box* o = new Fl_Box(195, 115, 50, 25, "small"); + o->labelsize(11); + o->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { def_widget_size[2] = new Fl_Round_Button(105, 140, 70, 25); + def_widget_size[2]->type(102); + def_widget_size[2]->down_box(FL_ROUND_DOWN_BOX); + def_widget_size[2]->callback((Fl_Callback*)default_widget_size_cb, (void*)(14)); + } // Fl_Round_Button* def_widget_size[2] + { Fl_Box* o = new Fl_Box(120, 140, 50, 25, "normal"); + o->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { def_widget_size[3] = new Fl_Round_Button(180, 140, 90, 25); + def_widget_size[3]->type(102); + def_widget_size[3]->down_box(FL_ROUND_DOWN_BOX); + def_widget_size[3]->callback((Fl_Callback*)default_widget_size_cb, (void*)(18)); + } // Fl_Round_Button* def_widget_size[3] + { Fl_Box* o = new Fl_Box(195, 140, 68, 25, "medium"); + o->labelsize(18); + o->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { def_widget_size[4] = new Fl_Round_Button(105, 165, 75, 25); + def_widget_size[4]->type(102); + def_widget_size[4]->down_box(FL_ROUND_DOWN_BOX); + def_widget_size[4]->callback((Fl_Callback*)default_widget_size_cb, (void*)(24)); + } // Fl_Round_Button* def_widget_size[4] + { Fl_Box* o = new Fl_Box(120, 165, 64, 25, "large"); + o->labelsize(24); + o->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { def_widget_size[5] = new Fl_Round_Button(180, 165, 95, 25); + def_widget_size[5]->type(102); + def_widget_size[5]->down_box(FL_ROUND_DOWN_BOX); + def_widget_size[5]->callback((Fl_Callback*)default_widget_size_cb, (void*)(32)); + } // Fl_Round_Button* def_widget_size[5] + { Fl_Box* o = new Fl_Box(195, 165, 76, 25, "huge"); + o->labelsize(32); + o->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + grid_window->set_non_modal(); + grid_window->end(); + } // Fl_Double_Window* grid_window + return grid_window; +} + +// +// End of "$Id: alignment_panel.cxx 6817 2009-07-02 09:42:17Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/alignment_panel.fl b/third_party/windows/fltk-1.1.10/fluid/alignment_panel.fl new file mode 100644 index 0000000..b0f369f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/alignment_panel.fl @@ -0,0 +1,420 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0108 +header_name {.h} +code_name {.cxx} +comment {// +// "$Id: alignment_panel.fl 5808 2007-05-10 12:06:31Z matt $" +// +// Setting and shell dialogs for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +} {in_source in_header +} + +decl {\#include } {public +} + +decl {\#include } {public +} + +decl {extern void load_history();} {public +} + +Function {make_project_window()} {open +} { + Fl_Window project_window { + label {Project Settings} + xywh {312 395 358 207} type Double + code0 {\#include } + code1 {\#include } modal visible + } { + Fl_Button {} { + label Close + callback {project_window->hide();} + tooltip {Close this dialog.} xywh {293 175 52 20} labelsize 11 + } + Fl_Tabs {} {open + xywh {10 10 335 151} selection_color 12 labelsize 11 + } { + Fl_Group {} { + label Output open + xywh {10 30 335 131} labelsize 11 + } { + Fl_Box {} { + label {Use "name.ext" to set name or just ".ext" to set extension.} + xywh {15 40 325 15} labelsize 11 align 144 + } + Fl_Input header_file_input { + label {Header File:} + user_data 1 user_data_type {void*} + callback header_input_cb + tooltip {The name of the generated header file.} xywh {96 60 228 20} box THIN_DOWN_BOX labelfont 1 labelsize 11 when 1 textfont 4 textsize 11 + } + Fl_Input code_file_input { + label {Code File:} + user_data 1 user_data_type {void*} + callback code_input_cb + tooltip {The name of the generated code file.} xywh {97 85 227 20} box THIN_DOWN_BOX labelfont 1 labelsize 11 when 1 textfont 4 textsize 11 + } + Fl_Check_Button include_H_from_C_button { + label {Include Header from Code} + callback include_H_from_C_button_cb + tooltip {Include the header file from the code file.} xywh {95 110 145 20} down_box DOWN_BOX labelsize 11 + } + Fl_Check_Button use_FL_COMMAND_button { + label {Generate menu shortcuts using FL_COMMAND} + callback use_FL_COMMAND_button_cb selected + tooltip {Replace FL_CTRL with FL_COMMAND when generating menu shortcut code.} xywh {95 130 245 20} down_box DOWN_BOX labelsize 11 + } + } + Fl_Group {} { + label Internationalization open + xywh {10 30 335 131} labelsize 11 hide + } { + Fl_Choice i18n_type_chooser { + label {Use:} + callback i18n_type_cb open + tooltip {Type of internationalization to use.} xywh {80 42 100 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 + } { + MenuItem {} { + label None + xywh {0 0 100 20} labelsize 11 + } + MenuItem {} { + label {GNU gettext} + xywh {0 0 100 20} labelsize 11 + } + MenuItem {} { + label {POSIX catgets} + xywh {0 0 100 20} labelsize 11 + } + } + Fl_Input i18n_include_input { + label {\#include:} + callback i18n_text_cb + tooltip {The include file for internationalization.} xywh {80 67 245 20} box THIN_DOWN_BOX labelfont 1 labelsize 11 textfont 4 textsize 11 + } + Fl_Input i18n_file_input { + label {File:} + callback i18n_text_cb + tooltip {The name of the message catalog.} xywh {80 92 245 20} box THIN_DOWN_BOX labelfont 1 labelsize 11 textfont 4 textsize 11 + } + Fl_Input i18n_set_input { + label {Set:} + callback i18n_text_cb + tooltip {The message set number.} xywh {80 117 245 20} type Int box THIN_DOWN_BOX labelfont 1 labelsize 11 textfont 4 textsize 11 + } + Fl_Input i18n_function_input { + label {Function:} + callback i18n_text_cb + tooltip {The function to call to internationalize the labels and tooltips.} xywh {80 92 245 20} box THIN_DOWN_BOX labelfont 1 labelsize 11 textfont 4 textsize 11 + } + } + } + } +} + +decl {extern void i18n_cb(Fl_Choice *,void *);} {public +} + +decl {extern Fl_Preferences fluid_prefs;} {public +} + +decl {Fl_Text_Buffer *shell_run_buffer;} {public +} + +decl {void scheme_cb(Fl_Choice *, void *);} {public +} + +Function {make_settings_window()} {open +} { + Fl_Window settings_window { + label {GUI Settings} open + xywh {326 145 340 225} type Double non_modal visible + } { + Fl_Choice scheme_choice { + label {Scheme:} + callback scheme_cb open + xywh {116 10 115 25} down_box BORDER_BOX labelfont 1 + code0 {int s;} + code1 {fluid_prefs.get("scheme", s, 0);} + code2 {scheme_choice->value(s);} + code3 {scheme_cb(0, 0);} + } { + MenuItem {} { + label Default + xywh {0 0 35 25} + } + MenuItem {} { + label None + xywh {0 0 35 25} + } + MenuItem {} { + label Plastic + xywh {0 0 35 25} + } + MenuItem {} { + label {GTK+} + xywh {10 10 35 25} + } + } + Fl_Group {} { + label {Options: + + + + +} open + xywh {116 45 215 100} labelfont 1 align 4 + } { + Fl_Check_Button tooltips_button { + label {Show Tooltips} + callback {Fl_Tooltip::enable(tooltips_button->value()); +fluid_prefs.set("show_tooltips", tooltips_button->value());} + xywh {116 45 113 25} down_box DOWN_BOX + code0 {int b;} + code1 {fluid_prefs.get("show_tooltips", b, 1);} + code2 {tooltips_button->value(b);} + code3 {Fl_Tooltip::enable(b);} + } + Fl_Check_Button completion_button { + label {Show Completion Dialogs} + callback {fluid_prefs.set("show_completion_dialogs", completion_button->value());} + xywh {116 70 186 25} down_box DOWN_BOX + code0 {int b;} + code1 {fluid_prefs.get("show_completion_dialogs", b, 1);} + code2 {completion_button->value(b);} + } + Fl_Check_Button openlast_button { + label {Open Previous File on Startup} + callback {fluid_prefs.set("open_previous_file", openlast_button->value());} + xywh {116 95 215 25} down_box DOWN_BOX + code0 {int b;} + code1 {fluid_prefs.get("open_previous_file", b, 0);} + code2 {openlast_button->value(b);} + } + Fl_Check_Button prevpos_button { + label {Remember Window Positions} + callback {fluid_prefs.set("prev_window_pos", prevpos_button->value());} + xywh {116 120 210 25} down_box DOWN_BOX + code0 {int b;} + code1 {fluid_prefs.get("prev_window_pos", b, 1);} + code2 {prevpos_button->value(b);} + } + } + Fl_Button {} { + label Close + callback {settings_window->hide();} + tooltip {Close this dialog.} xywh {266 190 64 25} + } + Fl_Spinner recent_spinner { + label {\# Recent Files:} + callback {fluid_prefs.set("recent_files", recent_spinner->value()); +load_history();} + xywh {116 155 40 25} labelfont 1 when 1 value 1 + code0 {int c;} + code1 {fluid_prefs.get("recent_files", c, 5);} + code2 {recent_spinner->maximum(10);} + code3 {recent_spinner->value(c);} + } + } +} + +Function {make_shell_window()} {open +} { + Fl_Window shell_window { + label {Shell Command} + xywh {682 167 365 125} type Double visible + } { + Fl_Input shell_command_input { + label {Command:} + callback {fluid_prefs.set("shell_command", shell_command_input->value());} + xywh {10 27 347 25} labelfont 1 align 5 + code0 {char buf[1024];} + code1 {fluid_prefs.get("shell_command", buf, "", sizeof(buf));} + code2 {shell_command_input->value(buf);} + } + Fl_Check_Button shell_writecode_button { + label {Write Code} + callback {fluid_prefs.set("shell_writecode", shell_writecode_button->value());} + xywh {128 61 93 19} down_box DOWN_BOX + code0 {int b;} + code1 {fluid_prefs.get("shell_writecode", b, 1);} + code2 {shell_writecode_button->value(b);} + } + Fl_Check_Button shell_writemsgs_button { + label {Write Messages} + callback {fluid_prefs.set("shell_writemsgs", shell_writemsgs_button->value());} + xywh {231 61 126 19} down_box DOWN_BOX + code0 {int b;} + code1 {fluid_prefs.get("shell_writemsgs", b, 0);} + code2 {shell_writemsgs_button->value(b);} + } + Fl_Check_Button shell_savefl_button { + label {Save .FL File} + callback {fluid_prefs.set("shell_savefl", shell_savefl_button->value());} + xywh {10 62 108 19} down_box DOWN_BOX + code0 {int b;} + code1 {fluid_prefs.get("shell_savefl", b, 1);} + code2 {shell_savefl_button->value(b);} + } + Fl_Return_Button {} { + label {Run Command} + callback do_shell_command + xywh {132 90 143 25} + } + Fl_Button {} { + label Cancel + callback {shell_window->hide();} + xywh {285 90 72 25} + } + } + Fl_Window shell_run_window { + label {Shell Command Output} + xywh {592 332 555 430} type Double hide resizable + } { + Fl_Text_Display shell_run_display { + xywh {10 10 535 375} box DOWN_BOX textfont 4 resizable + code0 {shell_run_buffer = new Fl_Text_Buffer();} + code1 {shell_run_display->buffer(shell_run_buffer);} + } + Fl_Return_Button shell_run_button { + label Close + callback {shell_run_window->hide();} + xywh {468 395 77 25} + } + } +} + +Function {make_layout_window()} {open +} { + Fl_Window grid_window { + label {Layout Settings} + xywh {676 337 285 245} type Double non_modal visible + } { + Fl_Input horizontal_input { + label x + user_data 1 user_data_type long + callback grid_cb + tooltip {Horizontal grid spacing.} xywh {106 10 50 25} type Int box THIN_DOWN_BOX align 8 + code0 {o->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY);} + } + Fl_Input vertical_input { + label pixels + user_data 2 user_data_type long + callback grid_cb + tooltip {Vertical grid spacing.} xywh {166 10 50 25} type Int box THIN_DOWN_BOX align 8 + code0 {o->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY);} + } + Fl_Input snap_input { + label {pixel snap} + user_data 3 user_data_type long + callback grid_cb + tooltip {Snap to grid within this many pixels.} xywh {106 45 50 25} type Int box THIN_DOWN_BOX align 8 + code0 {o->when(FL_WHEN_RELEASE|FL_WHEN_ENTER_KEY);} + } + Fl_Check_Button guides_toggle { + label {Show Guides} + user_data 4 user_data_type long + callback guides_cb + tooltip {Show distance and alignment guides in overlay} xywh {106 80 110 25} down_box DOWN_BOX + } + Fl_Button {} { + label Close + callback {grid_window->hide();} + tooltip {Close this dialog.} xywh {215 210 60 25} + } + Fl_Box {} { + label {Grid:} + xywh {26 10 70 25} labelfont 1 align 24 + } + Fl_Box {} { + label {Widget Size:} + xywh {-1 115 97 25} labelfont 1 align 24 + } + Fl_Group {} {open + xywh {105 115 170 75} + } { + Fl_Round_Button {def_widget_size[0]} { + user_data 8 user_data_type long + callback default_widget_size_cb + xywh {105 115 70 25} type Radio down_box ROUND_DOWN_BOX + } + Fl_Box {} { + label tiny + xywh {120 115 50 25} labelsize 8 align 20 + } + Fl_Round_Button {def_widget_size[1]} { + user_data 11 user_data_type long + callback default_widget_size_cb + xywh {180 115 70 25} type Radio down_box ROUND_DOWN_BOX + } + Fl_Box {} { + label small + xywh {195 115 50 25} labelsize 11 align 20 + } + Fl_Round_Button {def_widget_size[2]} { + user_data 14 user_data_type long + callback default_widget_size_cb + xywh {105 140 70 25} type Radio down_box ROUND_DOWN_BOX + } + Fl_Box {} { + label normal + xywh {120 140 50 25} align 20 + } + Fl_Round_Button {def_widget_size[3]} { + user_data 18 user_data_type long + callback default_widget_size_cb + xywh {180 140 90 25} type Radio down_box ROUND_DOWN_BOX + } + Fl_Box {} { + label medium + xywh {195 140 68 25} labelsize 18 align 20 + } + Fl_Round_Button {def_widget_size[4]} { + user_data 24 user_data_type long + callback default_widget_size_cb + xywh {105 165 75 25} type Radio down_box ROUND_DOWN_BOX + } + Fl_Box {} { + label large + xywh {120 165 64 25} labelsize 24 align 20 + } + Fl_Round_Button {def_widget_size[5]} { + user_data 32 user_data_type long + callback default_widget_size_cb + xywh {180 165 95 25} type Radio down_box ROUND_DOWN_BOX + } + Fl_Box {} { + label huge + xywh {195 165 76 25} labelsize 32 align 20 + } + } + } +} + +comment { +// +// End of "$Id: alignment_panel.fl 5808 2007-05-10 12:06:31Z matt $". +//} {in_source in_header +} diff --git a/third_party/windows/fltk-1.1.10/fluid/alignment_panel.h b/third_party/windows/fltk-1.1.10/fluid/alignment_panel.h new file mode 100644 index 0000000..92be789 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/alignment_panel.h @@ -0,0 +1,106 @@ +// +// "$Id: alignment_panel.h 6817 2009-07-02 09:42:17Z AlbrechtS $" +// +// Setting and shell dialogs for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0110 + +#ifndef alignment_panel_h +#define alignment_panel_h +#include +#include +#include +extern void load_history(); +#include +#include +#include +extern Fl_Double_Window *project_window; +#include +#include +#include +#include +#include +extern void header_input_cb(Fl_Input*, void*); +extern Fl_Input *header_file_input; +extern void code_input_cb(Fl_Input*, void*); +extern Fl_Input *code_file_input; +#include +extern void include_H_from_C_button_cb(Fl_Check_Button*, void*); +extern Fl_Check_Button *include_H_from_C_button; +extern void use_FL_COMMAND_button_cb(Fl_Check_Button*, void*); +extern Fl_Check_Button *use_FL_COMMAND_button; +#include +extern void i18n_type_cb(Fl_Choice*, void*); +extern Fl_Choice *i18n_type_chooser; +extern void i18n_text_cb(Fl_Input*, void*); +extern Fl_Input *i18n_include_input; +extern Fl_Input *i18n_file_input; +extern Fl_Input *i18n_set_input; +extern Fl_Input *i18n_function_input; +Fl_Double_Window* make_project_window(); +extern Fl_Menu_Item menu_i18n_type_chooser[]; +extern void i18n_cb(Fl_Choice *,void *); +extern Fl_Preferences fluid_prefs; +extern Fl_Text_Buffer *shell_run_buffer; +extern void scheme_cb(Fl_Choice *, void *); +extern Fl_Double_Window *settings_window; +extern void scheme_cb(Fl_Choice*, void*); +extern Fl_Choice *scheme_choice; +extern Fl_Check_Button *tooltips_button; +extern Fl_Check_Button *completion_button; +extern Fl_Check_Button *openlast_button; +extern Fl_Check_Button *prevpos_button; +#include +extern Fl_Spinner *recent_spinner; +Fl_Double_Window* make_settings_window(); +extern Fl_Menu_Item menu_scheme_choice[]; +extern Fl_Double_Window *shell_window; +extern Fl_Input *shell_command_input; +extern Fl_Check_Button *shell_writecode_button; +extern Fl_Check_Button *shell_writemsgs_button; +extern Fl_Check_Button *shell_savefl_button; +#include +extern void do_shell_command(Fl_Return_Button*, void*); +extern Fl_Double_Window *shell_run_window; +#include +extern Fl_Text_Display *shell_run_display; +extern Fl_Return_Button *shell_run_button; +Fl_Double_Window* make_shell_window(); +extern Fl_Double_Window *grid_window; +extern void grid_cb(Fl_Input*, long); +extern Fl_Input *horizontal_input; +extern Fl_Input *vertical_input; +extern Fl_Input *snap_input; +extern void guides_cb(Fl_Check_Button*, long); +extern Fl_Check_Button *guides_toggle; +#include +extern void default_widget_size_cb(Fl_Round_Button*, long); +extern Fl_Round_Button *def_widget_size[6]; +Fl_Double_Window* make_layout_window(); +#endif + +// +// End of "$Id: alignment_panel.h 6817 2009-07-02 09:42:17Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/code.cxx b/third_party/windows/fltk-1.1.10/fluid/code.cxx new file mode 100644 index 0000000..d781aaf --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/code.cxx @@ -0,0 +1,592 @@ +// +// "$Id: code.cxx 6013 2008-01-04 22:18:40Z matt $" +// +// Code output routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include "../src/flstring.h" +#include + +#include +#include "Fl_Type.h" +#include "alignment_panel.h" + +static FILE *code_file; +static FILE *header_file; + +extern char i18n_program[]; +extern int i18n_type; +extern const char* i18n_include; +extern const char* i18n_function; +extern const char* i18n_file; +extern const char* i18n_set; + +// return true if c can be in a C identifier. I needed this so +// it is not messed up by locale settings: +int is_id(char c) { + return c>='a' && c<='z' || c>='A' && c<='Z' || c>='0' && c<='9' || c=='_'; +} + +//////////////////////////////////////////////////////////////// +// Generate unique but human-readable identifiers: + +struct id { + char* text; + void* object; + id *left, *right; + id (const char* t, void* o) : text(strdup(t)), object(o) {left = right = 0;} + ~id(); +}; + +id::~id() { + delete left; + free((void *)text); + delete right; +} + +static id* id_root; + +const char* unique_id(void* o, const char* type, const char* name, const char* label) { + char buffer[128]; + char* q = buffer; + while (*type) *q++ = *type++; + *q++ = '_'; + const char* n = name; + if (!n || !*n) n = label; + if (n && *n) { + while (*n && !is_id(*n)) n++; + while (is_id(*n)) *q++ = *n++; + } + *q = 0; + // okay, search the tree and see if the name was already used: + id** p = &id_root; + int which = 0; + while (*p) { + int i = strcmp(buffer, (*p)->text); + if (!i) { + if ((*p)->object == o) return (*p)->text; + // already used, we need to pick a new name: + sprintf(q,"%x",++which); + p = &id_root; + continue; + } + else if (i < 0) p = &((*p)->left); + else p = &((*p)->right); + } + *p = new id(buffer, o); + return (*p)->text; +} + +//////////////////////////////////////////////////////////////// +// return current indentation: + +static const char* spaces = " "; +int indentation; +const char* indent() { + int i = indentation; if (i>16) i = 16; + return spaces+16-i; +} + +//////////////////////////////////////////////////////////////// +// declarations/include files: +// Each string generated by write_declare is written only once to +// the header file. This is done by keeping a binary tree of all +// the calls so far and not printing it if it is in the tree. + +struct included { + char *text; + included *left, *right; + included(const char *t) { + text = strdup(t); + left = right = 0; + } + ~included(); +}; + +included::~included() { + delete left; + free((void *)text); + delete right; +} +static included *included_root; + +int write_declare(const char *format, ...) { + va_list args; + char buf[1024]; + va_start(args, format); + vsnprintf(buf, sizeof(buf), format, args); + va_end(args); + included **p = &included_root; + while (*p) { + int i = strcmp(buf,(*p)->text); + if (!i) return 0; + else if (i < 0) p = &((*p)->left); + else p = &((*p)->right); + } + fprintf(header_file,"%s\n",buf); + *p = new included(buf); + return 1; +} + +//////////////////////////////////////////////////////////////// + +// silly thing to prevent declaring unused variables: +// When this symbol is on, all attempts to write code don't write +// anything, but set a variable if it looks like the variable "o" is used: +int varused_test; +int varused; + +// write an array of C characters (adds a null): +void write_cstring(const char *w, int length) { + if (varused_test) { + varused = 1; + return; + } + const char *e = w+length; + int linelength = 1; + putc('\"', code_file); + for (; w < e;) { + int c = *w++; + switch (c) { + case '\b': c = 'b'; goto QUOTED; + case '\t': c = 't'; goto QUOTED; + case '\n': c = 'n'; goto QUOTED; + case '\f': c = 'f'; goto QUOTED; + case '\r': c = 'r'; goto QUOTED; + case '\"': + case '\'': + case '\\': + QUOTED: + if (linelength >= 77) {fputs("\\\n",code_file); linelength = 0;} + putc('\\', code_file); + putc(c, code_file); + linelength += 2; + break; + case '?': // prevent trigraphs by writing ?? as ?\? + if (*(w-2) == '?') goto QUOTED; + // else fall through: + default: + if (c >= ' ' && c < 127) { + // a legal ASCII character + if (linelength >= 78) {fputs("\\\n",code_file); linelength = 0;} + putc(c, code_file); + linelength++; + break; + } + // otherwise we must print it as an octal constant: + c &= 255; + if (c < 8) { + if (linelength >= 76) {fputs("\\\n",code_file); linelength = 0;} + fprintf(code_file, "\\%o",c); + linelength += 2; + } else if (c < 64) { + if (linelength >= 75) {fputs("\\\n",code_file); linelength = 0;} + fprintf(code_file, "\\%o",c); + linelength += 3; + } else { + if (linelength >= 74) {fputs("\\\n",code_file); linelength = 0;} + fprintf(code_file, "\\%o",c); + linelength += 4; + } + // We must not put more numbers after it, because some C compilers + // consume them as part of the quoted sequence. Use string constant + // pasting to avoid this: + c = *w; + if (w < e && (c>='0'&&c<='9' || c>='a'&&c<='f' || c>='A'&&c<='F')) { + putc('\"', code_file); linelength++; + if (linelength >= 79) {fputs("\n",code_file); linelength = 0;} + putc('\"', code_file); linelength++; + } + break; + } + } + putc('\"', code_file); +} + +// write a C string, quoting characters if necessary: +void write_cstring(const char *w) {write_cstring(w,strlen(w));} + +// write an array of C binary data (does not add a null): +void write_cdata(const char *s, int length) { + if (varused_test) { + varused = 1; + return; + } + const unsigned char *w = (const unsigned char *)s; + const unsigned char *e = w+length; + int linelength = 1; + putc('{', code_file); + for (; w < e;) { + unsigned char c = *w++; + if (c>99) linelength += 4; + else if (c>9) linelength += 3; + else linelength += 2; + if (linelength >= 77) {fputs("\n",code_file); linelength = 0;} + fprintf(code_file, "%d", c); + if (w +int write_number; +int write_sourceview; +extern Fl_Widget_Class_Type *current_widget_class; + +// recursively dump code, putting children between the two parts +// of the parent code: +static Fl_Type* write_code(Fl_Type* p) { + if (write_sourceview) { + p->code_line = (int)ftell(code_file); + if (p->header_line_end==-1) + p->header_line = (int)ftell(header_file); + } + // write all code that come before the children code + // (but don't write the last comment until the very end) + if (!(p==Fl_Type::last && p->is_comment())) + p->write_code1(); + // recursively write the code of all children + Fl_Type* q; + if (p->is_widget() && p->is_class()) { + // Handle widget classes specially + for (q = p->next; q && q->level > p->level;) { + if (strcmp(q->type_name(), "Function")) q = write_code(q); + else { + int level = q->level; + do { + q = q->next; + } while (q && q->level > level); + } + } + + // write all code that come after the children + p->write_code2(); + + for (q = p->next; q && q->level > p->level;) { + if (!strcmp(q->type_name(), "Function")) q = write_code(q); + else { + int level = q->level; + do { + q = q->next; + } while (q && q->level > level); + } + } + + write_h("};\n"); + current_widget_class = 0L; + } else { + for (q = p->next; q && q->level > p->level;) q = write_code(q); + // write all code that come after the children + p->write_code2(); + } + if (write_sourceview) { + p->code_line_end = (int)ftell(code_file); + if (p->header_line_end==-1) + p->header_line_end = (int)ftell(header_file); + } + return q; +} + +extern const char* header_file_name; +extern Fl_Class_Type *current_class; + +int write_code(const char *s, const char *t) { + const char *filemode = "w"; + if (write_sourceview) + filemode = "wb"; + write_number++; + delete id_root; id_root = 0; + indentation = 0; + current_class = 0L; + current_widget_class = 0L; + if (!s) code_file = stdout; + else { + FILE *f = fopen(s, filemode); + if (!f) return 0; + code_file = f; + } + if (!t) header_file = stdout; + else { + FILE *f = fopen(t, filemode); + if (!f) {fclose(code_file); return 0;} + header_file = f; + } + // if the first entry in the Type tree is a comment, then it is probably + // a copyright notice. We print that before anything else in the file! + Fl_Type* first_type = Fl_Type::first; + if (first_type && first_type->is_comment()) { + if (write_sourceview) { + first_type->code_line = (int)ftell(code_file); + first_type->header_line = (int)ftell(header_file); + } + // it is ok to write non-recusive code here, because comments have no children or code2 blocks + first_type->write_code1(); + if (write_sourceview) { + first_type->code_line_end = (int)ftell(code_file); + first_type->header_line_end = (int)ftell(header_file); + } + first_type = first_type->next; + } + + const char *hdr = "\ +// generated by Fast Light User Interface Designer (fluid) version %.4f\n\n"; + fprintf(header_file, hdr, FL_VERSION); + fprintf(code_file, hdr, FL_VERSION); + + {char define_name[102]; + const char* a = fl_filename_name(t); + char* b = define_name; + if (!isalpha(*a)) {*b++ = '_';} + while (*a) {*b++ = isalnum(*a) ? *a : '_'; a++;} + *b = 0; + fprintf(header_file, "#ifndef %s\n", define_name); + fprintf(header_file, "#define %s\n", define_name); + } + + write_declare("#include "); + if (i18n_type && i18n_include[0]) { + if (i18n_include[0] != '<' && + i18n_include[0] != '\"') + write_c("#include \"%s\"\n", i18n_include); + else + write_c("#include %s\n", i18n_include); + if (i18n_type == 2) { + if (i18n_file[0]) write_c("extern nl_catd %s;\n", i18n_file); + else { + write_c("// Initialize I18N stuff now for menus...\n"); + write_c("#include \n"); + write_c("static char *_locale = setlocale(LC_MESSAGES, \"\");\n"); + write_c("static nl_catd _catalog = catopen(\"%s\", 0);\n", + i18n_program); + } + } + } + if (t && include_H_from_C) { + if (*header_file_name == '.' && strchr(header_file_name, '/') == NULL) { + write_c("#include \"%s\"\n", fl_filename_name(t)); + } else { + write_c("#include \"%s\"\n", t); + } + } + for (Fl_Type* p = first_type; p;) { + // write all static data for this & all children first + if (write_sourceview) p->header_line = (int)ftell(header_file); + p->write_static(); + if (write_sourceview) { + p->header_line_end = (int)ftell(header_file); + if (p->header_line==p->header_line_end) p->header_line_end = -1; + } + for (Fl_Type* q = p->next; q && q->level > p->level; q = q->next) { + if (write_sourceview) q->header_line = (int)ftell(header_file); + q->write_static(); + if (write_sourceview) { + q->header_line_end = (int)ftell(header_file); + if (q->header_line==q->header_line_end) q->header_line_end = -1; + } + } + // then write the nested code: + p = write_code(p); + } + + delete included_root; included_root = 0; + + if (!s) return 1; + + fprintf(header_file, "#endif\n"); + + Fl_Type* last_type = Fl_Type::last; + if (last_type && last_type->is_comment()) { + if (write_sourceview) { + last_type->code_line = (int)ftell(code_file); + last_type->header_line = (int)ftell(header_file); + } + last_type->write_code1(); + if (write_sourceview) { + last_type->code_line_end = (int)ftell(code_file); + last_type->header_line_end = (int)ftell(header_file); + } + } + + int x = fclose(code_file); + code_file = 0; + int y = fclose(header_file); + header_file = 0; + return x >= 0 && y >= 0; +} + +int write_strings(const char *sfile) { + FILE *fp = fopen(sfile, "w"); + Fl_Type *p; + Fl_Widget_Type *w; + int i; + + if (!fp) return 1; + + switch (i18n_type) { + case 0 : /* None, just put static text out */ + fprintf(fp, "# generated by Fast Light User Interface Designer (fluid) version %.4f\n", + FL_VERSION); + for (p = Fl_Type::first; p; p = p->next) { + if (p->is_widget()) { + w = (Fl_Widget_Type *)p; + + if (w->label()) { + for (const char *s = w->label(); *s; s ++) + if (*s < 32 || *s > 126 || *s == '\"') + fprintf(fp, "\\%03o", *s); + else + putc(*s, fp); + putc('\n', fp); + } + + if (w->tooltip()) { + for (const char *s = w->tooltip(); *s; s ++) + if (*s < 32 || *s > 126 || *s == '\"') + fprintf(fp, "\\%03o", *s); + else + putc(*s, fp); + putc('\n', fp); + } + } + } + break; + case 1 : /* GNU gettext, put a .po file out */ + fprintf(fp, "# generated by Fast Light User Interface Designer (fluid) version %.4f\n", + FL_VERSION); + for (p = Fl_Type::first; p; p = p->next) { + if (p->is_widget()) { + w = (Fl_Widget_Type *)p; + + if (w->label()) { + const char *s; + + fputs("msgid \"", fp); + for (s = w->label(); *s; s ++) + if (*s < 32 || *s > 126 || *s == '\"') + fprintf(fp, "\\%03o", *s); + else + putc(*s, fp); + fputs("\"\n", fp); + + fputs("msgstr \"", fp); + for (s = w->label(); *s; s ++) + if (*s < 32 || *s > 126 || *s == '\"') + fprintf(fp, "\\%03o", *s); + else + putc(*s, fp); + fputs("\"\n", fp); + } + + if (w->tooltip()) { + const char *s; + + fputs("msgid \"", fp); + for (s = w->tooltip(); *s; s ++) + if (*s < 32 || *s > 126 || *s == '\"') + fprintf(fp, "\\%03o", *s); + else + putc(*s, fp); + fputs("\"\n", fp); + + fputs("msgstr \"", fp); + for (s = w->tooltip(); *s; s ++) + if (*s < 32 || *s > 126 || *s == '\"') + fprintf(fp, "\\%03o", *s); + else + putc(*s, fp); + fputs("\"\n", fp); + } + } + } + break; + case 2 : /* POSIX catgets, put a .msg file out */ + fprintf(fp, "$ generated by Fast Light User Interface Designer (fluid) version %.4f\n", + FL_VERSION); + fprintf(fp, "$set %s\n", i18n_set); + fputs("$quote \"\n", fp); + + for (i = 1, p = Fl_Type::first; p; p = p->next) { + if (p->is_widget()) { + w = (Fl_Widget_Type *)p; + + if (w->label()) { + fprintf(fp, "%d \"", i ++); + for (const char *s = w->label(); *s; s ++) + if (*s < 32 || *s > 126 || *s == '\"') + fprintf(fp, "\\%03o", *s); + else + putc(*s, fp); + fputs("\"\n", fp); + } + + if (w->tooltip()) { + fprintf(fp, "%d \"", i ++); + for (const char *s = w->tooltip(); *s; s ++) + if (*s < 32 || *s > 126 || *s == '\"') + fprintf(fp, "\\%03o", *s); + else + putc(*s, fp); + fputs("\"\n", fp); + } + } + } + break; + } + + return fclose(fp); +} + +//////////////////////////////////////////////////////////////// + +void Fl_Type::write_static() {} +void Fl_Type::write_code1() { + write_h("// Header for %s\n", title()); + write_c("// Code for %s\n", title()); +} +void Fl_Type::write_code2() {} + +// +// End of "$Id: code.cxx 6013 2008-01-04 22:18:40Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/comments.h b/third_party/windows/fltk-1.1.10/fluid/comments.h new file mode 100644 index 0000000..f5822b5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/comments.h @@ -0,0 +1,82 @@ + +static const char * const comment_text[] = { + // GNU Public License/GPL Header + "//\n" + "// NameOfProgram, ShortDescription\n" + "// Copyright (C) YYYY NameOfAuthor\n" + "//\n" + "// This program is free software; you can redistribute it and/or\n" + "// modify it under the terms of the GNU General Public License\n" + "// as published by the Free Software Foundation; either version 2\n" + "// of the License, or (at your option) any later version.\n" + "//\n" + "// This program is distributed in the hope that it will be useful,\n" + "// but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "// GNU General Public License for more details.\n" + "//\n" + "// You should have received a copy of the GNU General Public License\n" + "// along with this program; if not, write to the Free Software\n" + "// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n" + "//\n", + // GNU Public License/GPL Footer + "\n//\n" + "// NameOfProgram, ShortDescription\n" + "// Copyright (C) YYYY NameOfAuthor\n" + "//", + // GNU Public License/LGPL Header + "//\n" + "// NameOfLibrary, ShortDescription\n" + "// Copyright (C) YYYY NameOfAuthor\n" + "//\n" + "// This library is free software; you can redistribute it and/or\n" + "// modify it under the terms of the GNU Lesser General Public\n" + "// License as published by the Free Software Foundation; either\n" + "// version 2.1 of the License, or (at your option) any later version.\n" + "//\n" + "// This library is distributed in the hope that it will be useful,\n" + "// but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "// GNU Lesser General Public License for more details.\n" + "//\n" + "// You should have received a copy of the GNU Lesser General Public\n" + "// License along with this program; if not, write to the Free Software\n" + "// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n" + "//\n", + // GNU Public License/LGPL Footer + "\n//\n" + "// NameOfLibrary, ShortDescription\n" + "// Copyright (C) YYYY NameOfAuthor\n" + "//", + // FLTK/Header + "//\n" + "// \"$Id$\"\n" + "//\n" + "// ... for the Fast Light Tool Kit (FLTK).\n" + "//\n" + "// Copyright 1998-2005 by Bill Spitzak and others.\n" + "//\n" + "// This library is free software; you can redistribute it and/or\n" + "// modify it under the terms of the GNU Library General Public\n" + "// License as published by the Free Software Foundation; either\n" + "// version 2 of the License, or (at your option) any later version.\n" + "//\n" + "// This library is distributed in the hope that it will be useful,\n" + "// but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" + "// Library General Public License for more details.\n" + "//\n" + "// You should have received a copy of the GNU Library General Public\n" + "// License along with this library; if not, write to the Free Software\n" + "// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307\n" + "// USA.\n" + "//\n" + "// Please report all bugs and problems on the following page:\n" + "//\n" + "// http://www.fltk.org/str.php\n" + "//\n", + // FLTK/Footer + "\n//\n" + "// End of \"$Id$\".\n" + "//", +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/factory.cxx b/third_party/windows/fltk-1.1.10/fluid/factory.cxx new file mode 100644 index 0000000..1612dd1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/factory.cxx @@ -0,0 +1,1210 @@ +// +// "$Id: factory.cxx 5658 2007-02-02 20:09:53Z mike $" +// +// Widget factory code for the Fast Light Tool Kit (FLTK). +// +// Type classes for most of the fltk widgets. Most of the work +// is done by code in Fl_Widget_Type.C. Also a factory instance +// of each of these type classes. +// +// This file also contains the "new" menu, which has a pointer +// to a factory instance for every class (both the ones defined +// here and ones in other files) +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include "../src/flstring.h" +#include "undo.h" + +#include "Fl_Widget_Type.h" + +extern Fl_Pixmap *pixmap[]; + +#if !HAVE_STRCASECMP +// +// 'strcasecmp()' - Do a case-insensitive compare... +// + +static int +strcasecmp(const char *s, const char *t) { + while (*s != '\0' && *t != '\0') { + if (tolower(*s) < tolower(*t)) + return (-1); + else if (tolower(*s) > tolower(*t)) + return (1); + + s ++; + t ++; + } + + if (*s == '\0' && *t == '\0') + return (0); + else if (*s != '\0') + return (1); + else + return (-1); +} +#endif // !HAVE_STRCASECMP + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Box_Type : public Fl_Widget_Type { +public: + virtual const char *type_name() {return "Fl_Box";} + Fl_Widget *widget(int x,int y,int w, int h) { + return new Fl_Box(x,y,w,h,"label");} + Fl_Widget_Type *_make() {return new Fl_Box_Type();} + int pixmapID() { return 5; } +}; +static Fl_Box_Type Fl_Box_type; + +//////////////////////////////////////////////////////////////// + +#include +static Fl_Menu_Item buttontype_menu[] = { + {"Normal",0,0,(void*)0}, + {"Toggle",0,0,(void*)FL_TOGGLE_BUTTON}, + {"Radio",0,0,(void*)FL_RADIO_BUTTON}, + {0}}; +class Fl_Button_Type : public Fl_Widget_Type { + Fl_Menu_Item *subtypes() {return buttontype_menu;} +public: + virtual void ideal_size(int &w, int &h) { + Fl_Widget_Type::ideal_size(w, h); + w += 2 * (o->labelsize() - 4); + h = (h / 5) * 5; + } + virtual const char *type_name() {return "Fl_Button";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Button(x,y,w,h,"button");} + Fl_Widget_Type *_make() {return new Fl_Button_Type();} + int is_button() const {return 1;} + int pixmapID() { return 2; } +}; +static Fl_Button_Type Fl_Button_type; + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Return_Button_Type : public Fl_Button_Type { +public: + virtual void ideal_size(int &w, int &h) { + Fl_Button_Type::ideal_size(w, h); + int W = o->h(); + if (o->w()/3 < W) W = o->w()/3; + w += W + 8 - o->labelsize(); + } + virtual const char *type_name() {return "Fl_Return_Button";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Return_Button(x,y,w,h,"button");} + Fl_Widget_Type *_make() {return new Fl_Return_Button_Type();} + int pixmapID() { return 23; } +}; +static Fl_Return_Button_Type Fl_Return_Button_type; + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Repeat_Button_Type : public Fl_Widget_Type { +public: + virtual const char *type_name() {return "Fl_Repeat_Button";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Repeat_Button(x,y,w,h,"button");} + Fl_Widget_Type *_make() {return new Fl_Repeat_Button_Type();} + int pixmapID() { return 25; } +}; +static Fl_Repeat_Button_Type Fl_Repeat_Button_type; + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Light_Button_Type : public Fl_Button_Type { +public: + virtual void ideal_size(int &w, int &h) { + Fl_Button_Type::ideal_size(w, h); + w += 4; + } + virtual const char *type_name() {return "Fl_Light_Button";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Light_Button(x,y,w,h,"button");} + Fl_Widget_Type *_make() {return new Fl_Light_Button_Type();} + int pixmapID() { return 24; } +}; +static Fl_Light_Button_Type Fl_Light_Button_type; + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Check_Button_Type : public Fl_Button_Type { +public: + virtual void ideal_size(int &w, int &h) { + Fl_Button_Type::ideal_size(w, h); + w += 4; + } + virtual const char *type_name() {return "Fl_Check_Button";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Check_Button(x,y,w,h,"button");} + Fl_Widget_Type *_make() {return new Fl_Check_Button_Type();} + int pixmapID() { return 3; } +}; +static Fl_Check_Button_Type Fl_Check_Button_type; + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Round_Button_Type : public Fl_Button_Type { +public: + virtual void ideal_size(int &w, int &h) { + Fl_Button_Type::ideal_size(w, h); + w += 4; + } + virtual const char *type_name() {return "Fl_Round_Button";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Round_Button(x,y,w,h,"button");} + Fl_Widget_Type *_make() {return new Fl_Round_Button_Type();} + int pixmapID() { return 4; } +}; +static Fl_Round_Button_Type Fl_Round_Button_type; + +//////////////////////////////////////////////////////////////// + +extern int compile_only; + +#include +#include +#include + +static Fl_Menu_Item browser_type_menu[] = { + {"No Select",0,0,(void*)FL_NORMAL_BROWSER}, + {"Select",0,0,(void*)FL_SELECT_BROWSER}, + {"Hold",0,0,(void*)FL_HOLD_BROWSER}, + {"Multi",0,0,(void*)FL_MULTI_BROWSER}, + {0}}; +class Fl_Browser_Type : public Fl_Widget_Type { + Fl_Menu_Item *subtypes() {return browser_type_menu;} + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c); +public: + virtual void ideal_size(int &w, int &h) { + Fl_Browser *myo = (Fl_Browser *)o; + fl_font(myo->textfont(), myo->textsize()); + h -= Fl::box_dh(o->box()); + w -= Fl::box_dw(o->box()); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + Fl::box_dw(o->box()); + h = ((h + fl_height() - 1) / fl_height()) * fl_height() + + Fl::box_dh(o->box()); + if (h < 30) h = 30; + if (w < 50) w = 50; + } + virtual const char *type_name() {return "Fl_Browser";} + Fl_Widget *widget(int x,int y,int w,int h) { + Fl_Browser* b = new Fl_Browser(x,y,w,h); + // Fl_Browser::add calls fl_height(), which requires the X display open. + // Avoid this when compiling so it works w/o a display: + if (!compile_only) { + char buffer[20]; + for (int i = 1; i <= 20; i++) { + sprintf(buffer,"Browser Line %d",i); + b->add(buffer); + } + } + return b; + } + Fl_Widget_Type *_make() {return new Fl_Browser_Type();} + int pixmapID() { return 31; } +}; +static Fl_Browser_Type Fl_Browser_type; + +int Fl_Browser_Type::textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_Browser *myo = (Fl_Browser*)(w==4 ? ((Fl_Widget_Type*)factory)->o : o); + switch (w) { + case 4: + case 0: f = myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; +} + +class Fl_Check_Browser_Type : public Fl_Widget_Type { + Fl_Menu_Item *subtypes() {return browser_type_menu;} + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c); +public: + virtual void ideal_size(int &w, int &h) { + Fl_Check_Browser *myo = (Fl_Check_Browser *)o; + fl_font(myo->textfont(), myo->textsize()); + h -= Fl::box_dh(o->box()); + w -= Fl::box_dw(o->box()) - fl_height(); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + Fl::box_dw(o->box()); + h = ((h + fl_height() - 1) / fl_height()) * fl_height() + + Fl::box_dh(o->box()); + if (h < 30) h = 30; + if (w < 50) w = 50; + } + virtual const char *type_name() {return "Fl_Check_Browser";} + Fl_Widget *widget(int x,int y,int w,int h) { + Fl_Check_Browser* b = new Fl_Check_Browser(x,y,w,h); + // Fl_Check_Browser::add calls fl_height(), which requires the X display open. + // Avoid this when compiling so it works w/o a display: + if (!compile_only) { + char buffer[20]; + for (int i = 1; i <= 20; i++) { + sprintf(buffer,"Browser Line %d",i); + b->add(buffer); + } + } + return b; + } + Fl_Widget_Type *_make() {return new Fl_Check_Browser_Type();} + int pixmapID() { return 32; } +}; +static Fl_Check_Browser_Type Fl_Check_Browser_type; + +int Fl_Check_Browser_Type::textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_Check_Browser *myo = (Fl_Check_Browser*)(w==4 ? ((Fl_Widget_Type*)factory)->o : o); + switch (w) { + case 4: + case 0: f = myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; +} + +class Fl_File_Browser_Type : public Fl_Widget_Type { + Fl_Menu_Item *subtypes() {return browser_type_menu;} + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c); +public: + virtual void ideal_size(int &w, int &h) { + Fl_File_Browser *myo = (Fl_File_Browser *)o; + fl_font(myo->textfont(), myo->textsize()); + h -= Fl::box_dh(o->box()); + w -= Fl::box_dw(o->box()) + fl_height(); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + Fl::box_dw(o->box()); + h = ((h + fl_height() - 1) / fl_height()) * fl_height() + + Fl::box_dh(o->box()); + if (h < 30) h = 30; + if (w < 50) w = 50; + } + virtual const char *type_name() {return "Fl_File_Browser";} + Fl_Widget *widget(int x,int y,int w,int h) { + Fl_File_Browser* b = new Fl_File_Browser(x,y,w,h); + // Fl_File_Browser::add calls fl_height(), which requires the X display open. + // Avoid this when compiling so it works w/o a display: + if (!compile_only) { + b->load("."); + } + return b; + } + Fl_Widget_Type *_make() {return new Fl_File_Browser_Type();} + int pixmapID() { return 33; } +}; +static Fl_File_Browser_Type Fl_File_Browser_type; + +int Fl_File_Browser_Type::textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_File_Browser *myo = (Fl_File_Browser*)(w==4 ? ((Fl_Widget_Type*)factory)->o : o); + switch (w) { + case 4: + case 0: f = myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; +} + +//////////////////////////////////////////////////////////////// + +#include +static Fl_Menu_Item counter_type_menu[] = { + {"Normal",0,0,(void*)FL_NORMAL_COUNTER}, + {"Simple",0,0,(void*)FL_SIMPLE_COUNTER}, + {0}}; +class Fl_Counter_Type : public Fl_Widget_Type { + Fl_Menu_Item *subtypes() {return counter_type_menu;} + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c); + int is_valuator() const {return 1;} + int pixmapID() { return 41; } +public: + virtual const char *type_name() {return "Fl_Counter";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Counter(x,y,w,h,"counter:");} + Fl_Widget_Type *_make() {return new Fl_Counter_Type();} +}; +static Fl_Counter_Type Fl_Counter_type; + +int Fl_Counter_Type::textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_Counter *myo = (Fl_Counter*)(w==4 ? ((Fl_Widget_Type*)factory)->o : o); + switch (w) { + case 4: + case 0: f = myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; +} + +//////////////////////////////////////////////////////////////// + +#include +static Fl_Menu_Item spinner_type_menu[] = { + {"Integer",0,0,(void*)FL_INT_INPUT}, + {"Float", 0,0,(void*)FL_FLOAT_INPUT}, + {0}}; +class Fl_Spinner_Type : public Fl_Widget_Type { + Fl_Menu_Item *subtypes() {return spinner_type_menu;} + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c); + int pixmapID() { return 47; } +public: + virtual void ideal_size(int &w, int &h) { + Fl_Spinner *myo = (Fl_Spinner *)o; + fl_font(myo->textfont(), myo->textsize()); + h = fl_height() + myo->textsize() - 6; + if (h < 15) h = 15; + w -= Fl::box_dw(o->box()); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + Fl::box_dw(o->box()) + h / 2; + if (w < 40) w = 40 ; + } + virtual const char *type_name() {return "Fl_Spinner";} + int is_spinner() const { return 1; } + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Spinner(x,y,w,h,"spinner:");} + Fl_Widget_Type *_make() {return new Fl_Spinner_Type();} +}; +static Fl_Spinner_Type Fl_Spinner_type; + +int Fl_Spinner_Type::textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_Spinner *myo = (Fl_Spinner*)(w==4 ? ((Fl_Widget_Type*)factory)->o : o); + switch (w) { + case 4: + case 0: f = (Fl_Font)myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; +} + +//////////////////////////////////////////////////////////////// + +#include +static Fl_Menu_Item input_type_menu[] = { + {"Normal",0,0,(void*)FL_NORMAL_INPUT}, + {"Multiline",0,0,(void*)FL_MULTILINE_INPUT}, + {"Secret",0,0,(void*)FL_SECRET_INPUT}, + {"Int",0,0,(void*)FL_INT_INPUT}, + {"Float",0,0,(void*)FL_FLOAT_INPUT}, + {0}}; +class Fl_Input_Type : public Fl_Widget_Type { + Fl_Menu_Item *subtypes() {return input_type_menu;} + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c); +public: + virtual void ideal_size(int &w, int &h) { + Fl_Input *myo = (Fl_Input *)o; + fl_font(myo->textfont(), myo->textsize()); + h = fl_height() + myo->textsize() - 6; + w -= Fl::box_dw(o->box()); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + Fl::box_dw(o->box()); + if (h < 15) h = 15; + if (w < 15) w = 15; + } + virtual const char *type_name() {return "Fl_Input";} + Fl_Widget *widget(int x,int y,int w,int h) { + Fl_Input *myo = new Fl_Input(x,y,w,h,"input:"); + myo->value("Text Input"); + return myo; + } + Fl_Widget_Type *_make() {return new Fl_Input_Type();} + int pixmapID() { return 14; } + virtual void copy_properties() { + Fl_Widget_Type::copy_properties(); + Fl_Input_ *d = (Fl_Input_*)live_widget, *s = (Fl_Input_*)o; + d->textfont(s->textfont()); + d->textsize(s->textsize()); + d->textcolor(s->textcolor()); + } +}; +static Fl_Input_Type Fl_Input_type; + +int Fl_Input_Type::textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_Input_ *myo = (Fl_Input_*)(w==4 ? ((Fl_Widget_Type*)factory)->o : o); + switch (w) { + case 4: + case 0: f = myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; +} + +//////////////////////////////////////////////////////////////// + +#include +class Fl_File_Input_Type : public Fl_Widget_Type { + Fl_Menu_Item *subtypes() {return 0;} + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c); +public: + virtual void ideal_size(int &w, int &h) { + Fl_File_Input *myo = (Fl_File_Input *)o; + fl_font(myo->textfont(), myo->textsize()); + h = fl_height() + myo->textsize() + 4; + w -= Fl::box_dw(o->box()); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + Fl::box_dw(o->box()); + if (h < 20) h = 20; + if (w < 50) w = 50; + } + virtual const char *type_name() {return "Fl_File_Input";} + Fl_Widget *widget(int x,int y,int w,int h) { + Fl_File_Input *myo = new Fl_File_Input(x,y,w,h,"file:"); + myo->value("/now/is/the/time/for/a/filename.ext"); + return myo; + } + Fl_Widget_Type *_make() {return new Fl_File_Input_Type();} + int pixmapID() { return 30; } +}; +static Fl_File_Input_Type Fl_File_Input_type; + +int Fl_File_Input_Type::textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_File_Input *myo = (Fl_File_Input*)(w==4 ? ((Fl_Widget_Type*)factory)->o : o); + switch (w) { + case 4: + case 0: f = myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; +} + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Text_Display_Type : public Fl_Widget_Type { + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c); +public: + virtual void ideal_size(int &w, int &h) { + Fl_Text_Display *myo = (Fl_Text_Display *)o; + fl_font(myo->textfont(), myo->textsize()); + h -= Fl::box_dh(o->box()); + w -= Fl::box_dw(o->box()); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + Fl::box_dw(o->box()); + h = ((h + fl_height() - 1) / fl_height()) * fl_height() + + Fl::box_dh(o->box()); + if (h < 30) h = 30; + if (w < 50) w = 50; + } + virtual const char *type_name() {return "Fl_Text_Display";} + Fl_Widget *widget(int x,int y,int w,int h) { + Fl_Text_Display *myo = new Fl_Text_Display(x,y,w,h); + return myo; + } + Fl_Widget_Type *_make() {return new Fl_Text_Display_Type();} + int pixmapID() { return 28; } +}; +static Fl_Text_Display_Type Fl_Text_Display_type; + +int Fl_Text_Display_Type::textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_Text_Display *myo = (Fl_Text_Display*)(w==4 ? ((Fl_Widget_Type*)factory)->o : o); + switch (w) { + case 4: + case 0: f = myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; +} + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Text_Editor_Type : public Fl_Widget_Type { + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c); +public: + virtual void ideal_size(int &w, int &h) { + Fl_Text_Editor *myo = (Fl_Text_Editor *)o; + fl_font(myo->textfont(), myo->textsize()); + h -= Fl::box_dh(o->box()); + w -= Fl::box_dw(o->box()); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + Fl::box_dw(o->box()); + h = ((h + fl_height() - 1) / fl_height()) * fl_height() + + Fl::box_dh(o->box()); + if (h < 30) h = 30; + if (w < 50) w = 50; + } + virtual const char *type_name() {return "Fl_Text_Editor";} + Fl_Widget *widget(int x,int y,int w,int h) { + Fl_Text_Editor *myo = new Fl_Text_Editor(x,y,w,h); + return myo; + } + Fl_Widget_Type *_make() {return new Fl_Text_Editor_Type();} + int pixmapID() { return 29; } +}; +static Fl_Text_Editor_Type Fl_Text_Editor_type; + +int Fl_Text_Editor_Type::textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_Text_Editor *myo = (Fl_Text_Editor*)(w==4 ? ((Fl_Widget_Type*)factory)->o : o); + switch (w) { + case 4: + case 0: f = myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; +} + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Clock_Type : public Fl_Widget_Type { +public: + virtual const char *type_name() {return "Fl_Clock";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Clock(x,y,w,h);} + Fl_Widget_Type *_make() {return new Fl_Clock_Type();} + int pixmapID() { return 34; } +}; +static Fl_Clock_Type Fl_Clock_type; + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Help_View_Type : public Fl_Widget_Type { +public: + virtual void ideal_size(int &w, int &h) { + Fl_Help_View *myo = (Fl_Help_View *)o; + fl_font(myo->textfont(), myo->textsize()); + h -= Fl::box_dh(o->box()); + w -= Fl::box_dw(o->box()); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + Fl::box_dw(o->box()); + h = ((h + fl_height() - 1) / fl_height()) * fl_height() + + Fl::box_dh(o->box()); + if (h < 30) h = 30; + if (w < 50) w = 50; + } + virtual const char *type_name() {return "Fl_Help_View";} + Fl_Widget *widget(int x,int y,int w,int h) { + Fl_Help_View *myo = new Fl_Help_View(x,y,w,h); + if (!compile_only) { + myo->value("

Fl_Help_View Widget

" + "

This is a Fl_Help_View widget.

"); + } + return myo;} + Fl_Widget_Type *_make() {return new Fl_Help_View_Type();} + int pixmapID() { return 35; } +}; +static Fl_Help_View_Type Fl_Help_View_type; + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Progress_Type : public Fl_Widget_Type { +public: + virtual const char *type_name() {return "Fl_Progress";} + Fl_Widget *widget(int x,int y,int w,int h) { + Fl_Progress *myo = new Fl_Progress(x,y,w,h,"label"); + myo->value(50); + return myo;} + Fl_Widget_Type *_make() {return new Fl_Progress_Type();} + int pixmapID() { return 36; } +}; +static Fl_Progress_Type Fl_Progress_type; + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Adjuster_Type : public Fl_Widget_Type { + int is_valuator() const {return 1;} +public: + virtual const char *type_name() {return "Fl_Adjuster";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Adjuster(x,y,w,h);} + Fl_Widget_Type *_make() {return new Fl_Adjuster_Type();} + int pixmapID() { return 40; } +}; +static Fl_Adjuster_Type Fl_Adjuster_type; + +//////////////////////////////////////////////////////////////// + +#include +static Fl_Menu_Item dial_type_menu[] = { + {"Dot",0,0,(void*)0}, + {"Line",0,0,(void*)FL_LINE_DIAL}, + {"Fill",0,0,(void*)FL_FILL_DIAL}, + {0}}; +class Fl_Dial_Type : public Fl_Widget_Type { + Fl_Menu_Item *subtypes() {return dial_type_menu;} + int is_valuator() const {return 1;} +public: + virtual const char *type_name() {return "Fl_Dial";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Dial(x,y,w,h);} + Fl_Widget_Type *_make() {return new Fl_Dial_Type();} + int pixmapID() { return 42; } +}; +static Fl_Dial_Type Fl_Dial_type; + +//////////////////////////////////////////////////////////////// + +#include +static Fl_Menu_Item roller_type_menu[] = { + {"Vertical",0,0,(void*)0}, + {"Horizontal",0,0,(void*)FL_HORIZONTAL}, + {0}}; +class Fl_Roller_Type : public Fl_Widget_Type { + Fl_Menu_Item *subtypes() {return roller_type_menu;} + int is_valuator() const {return 1;} +public: + virtual const char *type_name() {return "Fl_Roller";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Roller(x,y,w,h);} + Fl_Widget_Type *_make() {return new Fl_Roller_Type();} + int pixmapID() { return 43; } +}; +static Fl_Roller_Type Fl_Roller_type; + +//////////////////////////////////////////////////////////////// + +#include +static Fl_Menu_Item slider_type_menu[] = { + {"Vertical",0,0,(void*)FL_VERT_SLIDER}, + {"Horizontal",0,0,(void*)FL_HOR_SLIDER}, + {"Vert Fill",0,0,(void*)FL_VERT_FILL_SLIDER}, + {"Horz Fill",0,0,(void*)FL_HOR_FILL_SLIDER}, + {"Vert Knob",0,0,(void*)FL_VERT_NICE_SLIDER}, + {"Horz Knob",0,0,(void*)FL_HOR_NICE_SLIDER}, + {0}}; +class Fl_Slider_Type : public Fl_Widget_Type { + Fl_Menu_Item *subtypes() {return slider_type_menu;} + int is_valuator() const {return 2;} +public: + virtual const char *type_name() {return "Fl_Slider";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Slider(x,y,w,h,"slider:");} + Fl_Widget_Type *_make() {return new Fl_Slider_Type();} + int pixmapID() { return 37; } +}; +static Fl_Slider_Type Fl_Slider_type; + +static Fl_Menu_Item scrollbar_type_menu[] = { + {"Vertical",0,0,(void*)FL_VERT_SLIDER}, + {"Horizontal",0,0,(void*)FL_HOR_SLIDER}, + {0}}; +class Fl_Scrollbar_Type : public Fl_Slider_Type { + Fl_Menu_Item *subtypes() {return scrollbar_type_menu;} + int is_valuator() const {return 3;} +public: + virtual const char *type_name() {return "Fl_Scrollbar";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Scrollbar(x,y,w,h);} + Fl_Widget_Type *_make() {return new Fl_Scrollbar_Type();} + int pixmapID() { return 38; } +}; +static Fl_Scrollbar_Type Fl_Scrollbar_type; + +//////////////////////////////////////////////////////////////// + +#include +static Fl_Menu_Item output_type_menu[] = { + {"Normal",0,0,(void*)FL_NORMAL_OUTPUT}, + {"Multiline",0,0,(void*)FL_MULTILINE_OUTPUT}, + {0}}; +class Fl_Output_Type : public Fl_Input_Type { + Fl_Menu_Item *subtypes() {return output_type_menu;} +public: + virtual void ideal_size(int &w, int &h) { + Fl_Output *myo = (Fl_Output *)o; + fl_font(myo->textfont(), myo->textsize()); + h = fl_height() + myo->textsize() - 6; + w -= Fl::box_dw(o->box()); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + Fl::box_dw(o->box()); + if (h < 15) h = 15; + if (w < 15) w = 15; + } + virtual const char *type_name() {return "Fl_Output";} + Fl_Widget *widget(int x,int y,int w,int h) { + Fl_Output *myo = new Fl_Output(x,y,w,h,"output:"); + myo->value("Text Output"); + return myo; + } + Fl_Widget_Type *_make() {return new Fl_Output_Type();} + int pixmapID() { return 27; } +}; +static Fl_Output_Type Fl_Output_type; + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Value_Input_Type : public Fl_Widget_Type { +public: + virtual void ideal_size(int &w, int &h) { + Fl_Value_Input *myo = (Fl_Value_Input *)o; + fl_font(myo->textfont(), myo->textsize()); + h = fl_height() + myo->textsize() - 6; + w -= Fl::box_dw(o->box()); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + Fl::box_dw(o->box()); + if (h < 15) h = 15; + if (w < 15) w = 15; + } + virtual const char *type_name() {return "Fl_Value_Input";} + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c); + int is_valuator() const {return 1;} + Fl_Widget *widget(int x,int y,int w,int h) { + Fl_Value_Input *myo = new Fl_Value_Input(x,y,w,h,"value:"); + return myo; + } + Fl_Widget_Type *_make() {return new Fl_Value_Input_Type();} + int pixmapID() { return 44; } +}; +static Fl_Value_Input_Type Fl_Value_Input_type; + +int Fl_Value_Input_Type::textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_Value_Input *myo = (Fl_Value_Input*)(w==4 ? ((Fl_Widget_Type*)factory)->o : o); + switch (w) { + case 4: + case 0: f = myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; +} + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Value_Output_Type : public Fl_Widget_Type { +public: + virtual void ideal_size(int &w, int &h) { + Fl_Value_Output *myo = (Fl_Value_Output *)o; + fl_font(myo->textfont(), myo->textsize()); + h = fl_height() + myo->textsize() - 6; + w = o->w() - Fl::box_dw(o->box()); + int ww = (int)fl_width('m'); + w = ((w + ww - 1) / ww) * ww + Fl::box_dw(o->box()); + if (h < 15) h = 15; + if (w < 15) w = 15; + } + virtual const char *type_name() {return "Fl_Value_Output";} + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c); + int is_valuator() const {return 1;} + Fl_Widget *widget(int x,int y,int w,int h) { + Fl_Value_Output *myo = new Fl_Value_Output(x,y,w,h,"value:"); + return myo; + } + Fl_Widget_Type *_make() {return new Fl_Value_Output_Type();} + int pixmapID() { return 45; } +}; +static Fl_Value_Output_Type Fl_Value_Output_type; + +int Fl_Value_Output_Type::textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_Value_Output *myo = (Fl_Value_Output*)(w==4 ? ((Fl_Widget_Type*)factory)->o : o); + switch (w) { + case 4: + case 0: f = myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; +} + +//////////////////////////////////////////////////////////////// + +#include +class Fl_Value_Slider_Type : public Fl_Slider_Type { + int textstuff(int w, Fl_Font& f, int& s, Fl_Color& c); +public: + virtual const char *type_name() {return "Fl_Value_Slider";} + Fl_Widget *widget(int x,int y,int w,int h) { + return new Fl_Value_Slider(x,y,w,h,"slider:");} + Fl_Widget_Type *_make() {return new Fl_Value_Slider_Type();} + int pixmapID() { return 39; } +}; +static Fl_Value_Slider_Type Fl_Value_Slider_type; + +int Fl_Value_Slider_Type::textstuff(int w, Fl_Font& f, int& s, Fl_Color& c) { + Fl_Value_Slider *myo = (Fl_Value_Slider*)(w==4 ? ((Fl_Widget_Type*)factory)->o : o); + switch (w) { + case 4: + case 0: f = myo->textfont(); s = myo->textsize(); c = myo->textcolor(); break; + case 1: myo->textfont(f); break; + case 2: myo->textsize(s); break; + case 3: myo->textcolor(c); break; + } + return 1; +} + +//////////////////////////////////////////////////////////////// + +extern class Fl_Function_Type Fl_Function_type; +extern class Fl_Code_Type Fl_Code_type; +extern class Fl_CodeBlock_Type Fl_CodeBlock_type; +extern class Fl_Decl_Type Fl_Decl_type; +extern class Fl_DeclBlock_Type Fl_DeclBlock_type; +extern class Fl_Comment_Type Fl_Comment_type; +extern class Fl_Class_Type Fl_Class_type; +extern class Fl_Window_Type Fl_Window_type; +extern class Fl_Widget_Class_Type Fl_Widget_Class_type; +extern class Fl_Group_Type Fl_Group_type; +extern class Fl_Pack_Type Fl_Pack_type; +extern class Fl_Tabs_Type Fl_Tabs_type; +extern class Fl_Scroll_Type Fl_Scroll_type; +extern class Fl_Tile_Type Fl_Tile_type; +extern class Fl_Input_Choice_Type Fl_Input_Choice_type; +extern class Fl_Choice_Type Fl_Choice_type; +extern class Fl_Menu_Bar_Type Fl_Menu_Bar_type; +extern class Fl_Menu_Button_Type Fl_Menu_Button_type; +extern class Fl_Menu_Item_Type Fl_Menu_Item_type; +extern class Fl_Submenu_Type Fl_Submenu_type; +extern class Fl_Wizard_Type Fl_Wizard_type; + +extern void select(Fl_Type *,int); +extern void select_only(Fl_Type *); + +#include + +static void cb(Fl_Widget *, void *v) { + undo_checkpoint(); + undo_suspend(); + Fl_Type *t = ((Fl_Type*)v)->make(); + if (t) { + if (t->is_widget() && !t->is_window()) { + Fl_Widget_Type *wt = (Fl_Widget_Type *)t; + + // Set font sizes... + wt->o->labelsize(Fl_Widget_Type::default_size); + + Fl_Font f; + int s = Fl_Widget_Type::default_size; + Fl_Color c; + + wt->textstuff(2, f, s, c); + + // Resize and/or reposition new widget... + int w = 0, h = 0; + wt->ideal_size(w, h); + + if (!strcmp(wt->type_name(), "Fl_Menu_Bar")) { + // Move and resize the menubar across the top of the window... + wt->o->resize(0, 0, w, h); + } else { + // Just resize to the ideal size... + wt->o->size(w, h); + } + } + select_only(t); + set_modflag(1); + t->open(); + } else { + undo_current --; + undo_last --; + } + undo_resume(); +} + +Fl_Menu_Item New_Menu[] = { +{"Code",0,0,0,FL_SUBMENU}, + {"Function/Method",0,cb,(void*)&Fl_Function_type}, + {"Code",0,cb,(void*)&Fl_Code_type}, + {"Code Block",0,cb,(void*)&Fl_CodeBlock_type}, + {"Declaration",0,cb,(void*)&Fl_Decl_type}, + {"Declaration Block",0,cb,(void*)&Fl_DeclBlock_type}, + {"Class",0,cb,(void*)&Fl_Class_type}, + {"Widget Class",0,cb,(void*)&Fl_Widget_Class_type}, + {"Comment",0,cb,(void*)&Fl_Comment_type}, +{0}, +{"Group",0,0,0,FL_SUBMENU}, + {0,0,cb,(void*)&Fl_Window_type}, + {0,0,cb,(void*)&Fl_Group_type}, + {0,0,cb,(void*)&Fl_Pack_type}, + {0,0,cb,(void*)&Fl_Tabs_type}, + {0,0,cb,(void*)&Fl_Scroll_type}, + {0,0,cb,(void*)&Fl_Tile_type}, + {0,0,cb,(void*)&Fl_Wizard_type}, +{0}, +{"Buttons",0,0,0,FL_SUBMENU}, + {0,0,cb,(void*)&Fl_Button_type}, + {0,0,cb,(void*)&Fl_Return_Button_type}, + {0,0,cb,(void*)&Fl_Light_Button_type}, + {0,0,cb,(void*)&Fl_Check_Button_type}, + {0,0,cb,(void*)&Fl_Repeat_Button_type}, + {0,0,cb,(void*)&Fl_Round_Button_type}, +{0}, +{"Valuators",0,0,0,FL_SUBMENU}, + {0,0,cb,(void*)&Fl_Slider_type}, + {0,0,cb,(void*)&Fl_Scrollbar_type}, + {0,0,cb,(void*)&Fl_Value_Slider_type}, + {0,0,cb,(void*)&Fl_Adjuster_type}, + {0,0,cb,(void*)&Fl_Counter_type}, + {0,0,cb,(void*)&Fl_Spinner_type}, + {0,0,cb,(void*)&Fl_Dial_type}, + {0,0,cb,(void*)&Fl_Roller_type}, + {0,0,cb,(void*)&Fl_Value_Input_type}, + {0,0,cb,(void*)&Fl_Value_Output_type}, +{0}, +{"Text",0,0,0,FL_SUBMENU}, + {0,0,cb,(void*)&Fl_File_Input_type}, + {0,0,cb,(void*)&Fl_Input_type}, + {0,0,cb,(void*)&Fl_Output_type}, + {0,0,cb,(void*)&Fl_Text_Display_type}, + {0,0,cb,(void*)&Fl_Text_Editor_type}, +{0}, +{"Menus",0,0,0,FL_SUBMENU}, + {0,0,cb,(void*)&Fl_Menu_Bar_type}, + {0,0,cb,(void*)&Fl_Menu_Button_type}, + {0,0,cb,(void*)&Fl_Choice_type}, + {0,0,cb,(void*)&Fl_Input_Choice_type}, + {0,0,cb, (void*)&Fl_Submenu_type}, + {0,0,cb, (void*)&Fl_Menu_Item_type}, +{0}, +{"Browsers",0,0,0,FL_SUBMENU}, + {0,0,cb,(void*)&Fl_Browser_type}, + {0,0,cb,(void*)&Fl_Check_Browser_type}, + {0,0,cb,(void*)&Fl_File_Browser_type}, +{0}, +{"Other",0,0,0,FL_SUBMENU}, + {0,0,cb,(void*)&Fl_Box_type}, + {0,0,cb,(void*)&Fl_Clock_type}, + {0,0,cb,(void*)&Fl_Help_View_type}, + {0,0,cb,(void*)&Fl_Progress_type}, +{0}, +{0}}; + +#include + +// modify a menuitem to display an icon in front of the label +static void make_iconlabel( Fl_Menu_Item *mi, Fl_Image *ic, const char *txt ) +{ + if (ic) { + char *t1 = new char[strlen(txt)+6]; + strcpy( t1, " " ); + strcat(t1, txt); + strcat(t1, "..."); + mi->image( ic ); + Fl_Multi_Label *ml = new Fl_Multi_Label; + ml->labela = (char*)ic; + ml->labelb = t1; + ml->typea = _FL_IMAGE_LABEL; + ml->typeb = FL_NORMAL_LABEL; + ml->label( mi ); + } + else if (txt!=mi->text) + mi->label(txt); +} + +void fill_in_New_Menu() { + for (unsigned i = 0; i < sizeof(New_Menu)/sizeof(*New_Menu); i++) { + Fl_Menu_Item *m = New_Menu+i; + if (m->user_data()) { + Fl_Type *t = (Fl_Type*)m->user_data(); + if (m->text) { + make_iconlabel( m, pixmap[t->pixmapID()], m->label() ); + } + else { + const char *n = t->type_name(); + if (!strncmp(n,"Fl_",3)) n += 3; + make_iconlabel( m, pixmap[t->pixmapID()], n ); + } + } + } +} + +// use keyword to pick the type, this is used to parse files: +int reading_file; +Fl_Type *Fl_Type_make(const char *tn) { + reading_file = 1; // makes labels be null + Fl_Type *r = 0; + for (unsigned i = 0; i < sizeof(New_Menu)/sizeof(*New_Menu); i++) { + Fl_Menu_Item *m = New_Menu+i; + if (!m->user_data()) continue; + Fl_Type *t = (Fl_Type*)(m->user_data()); + if (!strcasecmp(tn,t->type_name())) {r = t->make(); break;} + } + reading_file = 0; + return r; +} + +//////////////////////////////////////////////////////////////// + +// Since I have included all the .H files, do this table here: +// This table is only used to read fdesign files: + +struct symbol {const char *name; int value;}; + +static symbol table[] = { + {"BLACK", FL_BLACK}, + {"RED", FL_RED}, + {"GREEN", FL_GREEN}, + {"YELLOW", FL_YELLOW}, + {"BLUE", FL_BLUE}, + {"MAGENTA", FL_MAGENTA}, + {"CYAN", FL_CYAN}, + {"WHITE", FL_WHITE}, + + {"LCOL", FL_BLACK}, + {"COL1", FL_GRAY}, + {"MCOL", FL_LIGHT1}, + {"LEFT_BCOL", FL_LIGHT3}, + {"TOP_BCOL", FL_LIGHT2}, + {"BOTTOM_BCOL", FL_DARK2}, + {"RIGHT_BCOL", FL_DARK3}, + {"INACTIVE", FL_INACTIVE_COLOR}, + {"INACTIVE_COL", FL_INACTIVE_COLOR}, + {"FREE_COL1", FL_FREE_COLOR}, + {"FREE_COL2", FL_FREE_COLOR+1}, + {"FREE_COL3", FL_FREE_COLOR+2}, + {"FREE_COL4", FL_FREE_COLOR+3}, + {"FREE_COL5", FL_FREE_COLOR+4}, + {"FREE_COL6", FL_FREE_COLOR+5}, + {"FREE_COL7", FL_FREE_COLOR+6}, + {"FREE_COL8", FL_FREE_COLOR+7}, + {"FREE_COL9", FL_FREE_COLOR+8}, + {"FREE_COL10", FL_FREE_COLOR+9}, + {"FREE_COL11", FL_FREE_COLOR+10}, + {"FREE_COL12", FL_FREE_COLOR+11}, + {"FREE_COL13", FL_FREE_COLOR+12}, + {"FREE_COL14", FL_FREE_COLOR+13}, + {"FREE_COL15", FL_FREE_COLOR+14}, + {"FREE_COL16", FL_FREE_COLOR+15}, + {"TOMATO", 131}, + {"INDIANRED", 164}, + {"SLATEBLUE", 195}, + {"DARKGOLD", 84}, + {"PALEGREEN", 157}, + {"ORCHID", 203}, + {"DARKCYAN", 189}, + {"DARKTOMATO", 113}, + {"WHEAT", 174}, + {"ALIGN_CENTER", FL_ALIGN_CENTER}, + {"ALIGN_TOP", FL_ALIGN_TOP}, + {"ALIGN_BOTTOM", FL_ALIGN_BOTTOM}, + {"ALIGN_LEFT", FL_ALIGN_LEFT}, + {"ALIGN_RIGHT", FL_ALIGN_RIGHT}, + {"ALIGN_INSIDE", FL_ALIGN_INSIDE}, + {"ALIGN_TOP_LEFT", FL_ALIGN_TOP | FL_ALIGN_LEFT}, + {"ALIGN_TOP_RIGHT", FL_ALIGN_TOP | FL_ALIGN_RIGHT}, + {"ALIGN_BOTTOM_LEFT", FL_ALIGN_BOTTOM | FL_ALIGN_LEFT}, + {"ALIGN_BOTTOM_RIGHT", FL_ALIGN_BOTTOM | FL_ALIGN_RIGHT}, + {"ALIGN_CENTER|FL_ALIGN_INSIDE", FL_ALIGN_CENTER|FL_ALIGN_INSIDE}, + {"ALIGN_TOP|FL_ALIGN_INSIDE", FL_ALIGN_TOP|FL_ALIGN_INSIDE}, + {"ALIGN_BOTTOM|FL_ALIGN_INSIDE", FL_ALIGN_BOTTOM|FL_ALIGN_INSIDE}, + {"ALIGN_LEFT|FL_ALIGN_INSIDE", FL_ALIGN_LEFT|FL_ALIGN_INSIDE}, + {"ALIGN_RIGHT|FL_ALIGN_INSIDE", FL_ALIGN_RIGHT|FL_ALIGN_INSIDE}, + {"ALIGN_INSIDE|FL_ALIGN_INSIDE", FL_ALIGN_INSIDE|FL_ALIGN_INSIDE}, + {"ALIGN_TOP_LEFT|FL_ALIGN_INSIDE", FL_ALIGN_TOP|FL_ALIGN_LEFT|FL_ALIGN_INSIDE}, + {"ALIGN_TOP_RIGHT|FL_ALIGN_INSIDE", FL_ALIGN_TOP|FL_ALIGN_RIGHT|FL_ALIGN_INSIDE}, + {"ALIGN_BOTTOM_LEFT|FL_ALIGN_INSIDE", FL_ALIGN_BOTTOM|FL_ALIGN_LEFT|FL_ALIGN_INSIDE}, + {"ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE",FL_ALIGN_BOTTOM|FL_ALIGN_RIGHT|FL_ALIGN_INSIDE}, + + {"ALIGN_LEFT_TOP", FL_ALIGN_TOP | FL_ALIGN_LEFT}, + {"ALIGN_RIGHT_TOP", FL_ALIGN_TOP | FL_ALIGN_RIGHT}, + {"ALIGN_LEFT_BOTTOM", FL_ALIGN_BOTTOM | FL_ALIGN_LEFT}, + {"ALIGN_RIGHT_BOTTOM", FL_ALIGN_BOTTOM | FL_ALIGN_RIGHT}, + {"INVALID_STYLE", 255}, + {"NORMAL_STYLE", FL_HELVETICA}, + {"BOLD_STYLE", FL_HELVETICA|FL_BOLD}, + {"ITALIC_STYLE", FL_HELVETICA|FL_ITALIC}, + {"BOLDITALIC_STYLE", FL_HELVETICA|FL_BOLD|FL_ITALIC}, + {"FIXED_STYLE", FL_COURIER}, + {"FIXEDBOLD_STYLE", FL_COURIER|FL_BOLD}, + {"FIXEDITALIC_STYLE", FL_COURIER|FL_ITALIC}, + {"FIXEDBOLDITALIC_STYLE", FL_COURIER|FL_BOLD|FL_ITALIC}, + {"TIMES_STYLE", FL_TIMES}, + {"TIMESBOLD_STYLE", FL_TIMES|FL_BOLD}, + {"TIMESITALIC_STYLE", FL_TIMES|FL_ITALIC}, + {"TIMESBOLDITALIC_STYLE", FL_TIMES|FL_BOLD|FL_ITALIC}, + {"SHADOW_STYLE", (_FL_SHADOW_LABEL<<8)}, + {"ENGRAVED_STYLE", (_FL_ENGRAVED_LABEL<<8)}, + {"EMBOSSED_STYLE", (_FL_EMBOSSED_LABEL<<0)}, + {"TINY_SIZE", 8}, + {"SMALL_SIZE", 11}, + {"NORMAL_SIZE", FL_NORMAL_SIZE}, + {"MEDIUM_SIZE", 18}, + {"LARGE_SIZE", 24}, + {"HUGE_SIZE", 32}, + {"DEFAULT_SIZE", FL_NORMAL_SIZE}, + {"TINY_FONT", 8}, + {"SMALL_FONT", 11}, + {"NORMAL_FONT", FL_NORMAL_SIZE}, + {"MEDIUM_FONT", 18}, + {"LARGE_FONT", 24}, + {"HUGE_FONT", 32}, + {"NORMAL_FONT1", 11}, + {"NORMAL_FONT2", FL_NORMAL_SIZE}, + {"DEFAULT_FONT", 11}, + {"RETURN_END_CHANGED", 0}, + {"RETURN_CHANGED", 1}, + {"RETURN_END", 2}, + {"RETURN_ALWAYS", 3}, + {"PUSH_BUTTON", FL_TOGGLE_BUTTON}, + {"RADIO_BUTTON", FL_RADIO_BUTTON}, + {"HIDDEN_BUTTON", FL_HIDDEN_BUTTON}, + {"SELECT_BROWSER", FL_SELECT_BROWSER}, + {"HOLD_BROWSER", FL_HOLD_BROWSER}, + {"MULTI_BROWSER", FL_MULTI_BROWSER}, + {"SIMPLE_COUNTER", FL_SIMPLE_COUNTER}, + {"LINE_DIAL", FL_LINE_DIAL}, + {"FILL_DIAL", FL_FILL_DIAL}, + {"VERT_SLIDER", FL_VERT_SLIDER}, + {"HOR_SLIDER", FL_HOR_SLIDER}, + {"VERT_FILL_SLIDER", FL_VERT_FILL_SLIDER}, + {"HOR_FILL_SLIDER", FL_HOR_FILL_SLIDER}, + {"VERT_NICE_SLIDER", FL_VERT_NICE_SLIDER}, + {"HOR_NICE_SLIDER", FL_HOR_NICE_SLIDER}, +}; + +#include + +int lookup_symbol(const char *name, int &v, int numberok) { + if (name[0]=='F' && name[1]=='L' && name[2]=='_') name += 3; + for (int i=0; i < int(sizeof(table)/sizeof(*table)); i++) + if (!strcasecmp(name,table[i].name)) {v = table[i].value; return 1;} + if (numberok && ((v = atoi(name)) || !strcmp(name,"0"))) return 1; + return 0; +} + +// +// End of "$Id: factory.cxx 5658 2007-02-02 20:09:53Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/file.cxx b/third_party/windows/fltk-1.1.10/fluid/file.cxx new file mode 100644 index 0000000..af1a5af --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/file.cxx @@ -0,0 +1,650 @@ +// +// "$Id: file.cxx 5808 2007-05-10 12:06:31Z matt $" +// +// Fluid file routines for the Fast Light Tool Kit (FLTK). +// +// You may find the basic read_* and write_* routines to +// be useful for other programs. I have used them many times. +// They are somewhat similar to tcl, using matching { and } +// to quote strings. +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include "../src/flstring.h" +#include +#include "alignment_panel.h" + +//////////////////////////////////////////////////////////////// +// BASIC FILE WRITING: + +static FILE *fout; + +int open_write(const char *s) { + if (!s) {fout = stdout; return 1;} + FILE *f = fopen(s,"w"); + if (!f) return 0; + fout = f; + return 1; +} + +int close_write() { + if (fout != stdout) { + int x = fclose(fout); + fout = stdout; + return x >= 0; + } + return 1; +} + +static int needspace; +int is_id(char); // in code.C + +// write a string, quoting characters if necessary: +void write_word(const char *w) { + if (needspace) putc(' ', fout); + needspace = 1; + if (!w || !*w) {fprintf(fout,"{}"); return;} + const char *p; + // see if it is a single word: + for (p = w; is_id(*p); p++) ; + if (!*p) {fprintf(fout,"%s",w); return;} + // see if there are matching braces: + int n = 0; + for (p = w; *p; p++) { + if (*p == '{') n++; + else if (*p == '}') {n--; if (n<0) break;} + } + int mismatched = (n != 0); + // write out brace-quoted string: + putc('{', fout); + for (; *w; w++) { + switch (*w) { + case '{': + case '}': + if (!mismatched) break; + case '\\': + case '#': + putc('\\',fout); + break; + } + putc(*w,fout); + } + putc('}', fout); +} + +// write an arbitrary formatted word, or a comment, etc: +void write_string(const char *format, ...) { + va_list args; + va_start(args, format); + if (needspace) fputc(' ',fout); + vfprintf(fout, format, args); + va_end(args); + needspace = !isspace(format[strlen(format)-1] & 255); +} + +// start a new line and indent it for a given nesting level: +void write_indent(int n) { + fputc('\n',fout); + while (n--) {fputc(' ',fout); fputc(' ',fout);} + needspace = 0; +} + +// write a '{' at the given indenting level: +void write_open(int) { + if (needspace) fputc(' ',fout); + fputc('{',fout); + needspace = 0; +} + +// write a '}' at the given indenting level: +void write_close(int n) { + if (needspace) write_indent(n); + fputc('}',fout); + needspace = 1; +} + +//////////////////////////////////////////////////////////////// +// BASIC FILE READING: + +static FILE *fin; +static int lineno; +static const char *fname; + +int open_read(const char *s) { + lineno = 1; + if (!s) {fin = stdin; fname = "stdin"; return 1;} + FILE *f = fopen(s,"r"); + if (!f) return 0; + fin = f; + fname = s; + return 1; +} + +int close_read() { + if (fin != stdin) { + int x = fclose(fin); + fin = 0; + return x >= 0; + } + return 1; +} + +#include + +void read_error(const char *format, ...) { + va_list args; + va_start(args, format); + if (!fin) { + char buffer[1024]; + vsnprintf(buffer, sizeof(buffer), format, args); + fl_message(buffer); + } else { + fprintf(stderr, "%s:%d: ", fname, lineno); + vfprintf(stderr, format, args); + fprintf(stderr, "\n"); + } + va_end(args); +} + +static int hexdigit(int x) { + if (isdigit(x)) return x-'0'; + if (isupper(x)) return x-'A'+10; + if (islower(x)) return x-'a'+10; + return 20; +} + + +static int read_quoted() { // read whatever character is after a \ . + int c,d,x; + switch(c = fgetc(fin)) { + case '\n': lineno++; return -1; + case 'a' : return('\a'); + case 'b' : return('\b'); + case 'f' : return('\f'); + case 'n' : return('\n'); + case 'r' : return('\r'); + case 't' : return('\t'); + case 'v' : return('\v'); + case 'x' : /* read hex */ + for (c=x=0; x<3; x++) { + int ch = fgetc(fin); + d = hexdigit(ch); + if (d > 15) {ungetc(ch,fin); break;} + c = (c<<4)+d; + } + break; + default: /* read octal */ + if (c<'0' || c>'7') break; + c -= '0'; + for (x=0; x<2; x++) { + int ch = fgetc(fin); + d = hexdigit(ch); + if (d>7) {ungetc(ch,fin); break;} + c = (c<<3)+d; + } + break; + } + return(c); +} + +// return a word read from the file, or NULL at the EOF: +// This will skip all comments (# to end of line), and evaluate +// all \xxx sequences and use \ at the end of line to remove the newline. +// A word is any one of: +// a continuous string of non-space chars except { and } and # +// everything between matching {...} (unless wantbrace != 0) +// the characters '{' and '}' + +static char *buffer; +static int buflen; +static void expand_buffer(int length) { + if (length >= buflen) { + if (!buflen) { + buflen = length+1; + buffer = (char*)malloc(buflen); + } else { + buflen = 2*buflen; + if (length >= buflen) buflen = length+1; + buffer = (char *)realloc((void *)buffer,buflen); + } + } +} + +const char *read_word(int wantbrace) { + int x; + + // skip all the whitespace before it: + for (;;) { + x = getc(fin); + if (x < 0 && feof(fin)) { // eof + return 0; + } else if (x == '#') { // comment + do x = getc(fin); while (x >= 0 && x != '\n'); + lineno++; + continue; + } else if (x == '\n') { + lineno++; + } else if (!isspace(x & 255)) { + break; + } + } + + expand_buffer(100); + + if (x == '{' && !wantbrace) { + + // read in whatever is between braces + int length = 0; + int nesting = 0; + for (;;) { + x = getc(fin); + if (x<0) {read_error("Missing '}'"); break;} + else if (x == '#') { // embedded comment + do x = getc(fin); while (x >= 0 && x != '\n'); + lineno++; + continue; + } else if (x == '\n') lineno++; + else if (x == '\\') {x = read_quoted(); if (x<0) continue;} + else if (x == '{') nesting++; + else if (x == '}') {if (!nesting--) break;} + buffer[length++] = x; + expand_buffer(length); + } + buffer[length] = 0; + return buffer; + + } else if (x == '{' || x == '}') { + // all the punctuation is a word: + buffer[0] = x; + buffer[1] = 0; + return buffer; + + } else { + + // read in an unquoted word: + int length = 0; + for (;;) { + if (x == '\\') {x = read_quoted(); if (x<0) continue;} + else if (x<0 || isspace(x & 255) || x=='{' || x=='}' || x=='#') break; + buffer[length++] = x; + expand_buffer(length); + x = getc(fin); + } + ungetc(x, fin); + buffer[length] = 0; + return buffer; + + } +} + +//////////////////////////////////////////////////////////////// + +#include +#include "Fl_Widget_Type.h" + +// global int variables: +extern int i18n_type; +extern const char* i18n_include; +extern const char* i18n_function; +extern const char* i18n_file; +extern const char* i18n_set; + + +extern int header_file_set; +extern int code_file_set; +extern const char* header_file_name; +extern const char* code_file_name; + +int write_file(const char *filename, int selected_only) { + if (!open_write(filename)) return 0; + write_string("# data file for the Fltk User Interface Designer (fluid)\n" + "version %.4f",FL_VERSION); + if(!include_H_from_C) + write_string("\ndo_not_include_H_from_C"); + if(use_FL_COMMAND) + write_string("\nuse_FL_COMMAND"); + if (i18n_type) { + write_string("\ni18n_type %d", i18n_type); + write_string("\ni18n_include %s", i18n_include); + switch (i18n_type) { + case 1 : /* GNU gettext */ + write_string("\ni18n_function %s", i18n_function); + break; + case 2 : /* POSIX catgets */ + if (i18n_file[0]) write_string("\ni18n_file %s", i18n_file); + write_string("\ni18n_set %s", i18n_set); + break; + } + } + if (!selected_only) { + write_string("\nheader_name"); write_word(header_file_name); + write_string("\ncode_name"); write_word(code_file_name); + } + for (Fl_Type *p = Fl_Type::first; p;) { + if (!selected_only || p->selected) { + p->write(); + write_string("\n"); + int q = p->level; + for (p = p->next; p && p->level > q; p = p->next); + } else { + p = p->next; + } + } + return close_write(); +} + +//////////////////////////////////////////////////////////////// +// read all the objects out of the input file: + +void read_fdesign(); + +double read_version; + +extern Fl_Type *Fl_Type_make(const char *tn); + +static void read_children(Fl_Type *p, int paste) { + Fl_Type::current = p; + for (;;) { + const char *c = read_word(); + REUSE_C: + if (!c) { + if (p && !paste) read_error("Missing '}'"); + break; + } + + if (!strcmp(c,"}")) { + if (!p) read_error("Unexpected '}'"); + break; + } + + // this is the first word in a .fd file: + if (!strcmp(c,"Magic:")) { + read_fdesign(); + return; + } + + if (!strcmp(c,"version")) { + c = read_word(); + read_version = strtod(c,0); + if (read_version<=0 || read_version>FL_VERSION) + read_error("unknown version '%s'",c); + continue; + } + + // back compatability with Vincent Penne's original class code: + if (!p && !strcmp(c,"define_in_struct")) { + Fl_Type *t = Fl_Type_make("class"); + t->name(read_word()); + Fl_Type::current = p = t; + paste = 1; // stops "missing }" error + continue; + } + + if (!strcmp(c,"do_not_include_H_from_C")) { + include_H_from_C=0; + goto CONTINUE; + } + if (!strcmp(c,"use_FL_COMMAND")) { + use_FL_COMMAND=1; + goto CONTINUE; + } + if (!strcmp(c,"i18n_type")) { + i18n_type = atoi(read_word()); + goto CONTINUE; + } + if (!strcmp(c,"i18n_function")) { + i18n_function = strdup(read_word()); + goto CONTINUE; + } + if (!strcmp(c,"i18n_file")) { + i18n_file = strdup(read_word()); + goto CONTINUE; + } + if (!strcmp(c,"i18n_set")) { + i18n_set = strdup(read_word()); + goto CONTINUE; + } + if (!strcmp(c,"i18n_include")) { + i18n_include = strdup(read_word()); + goto CONTINUE; + } + if (!strcmp(c,"i18n_type")) + { + i18n_type = atoi(read_word()); + goto CONTINUE; + } + if (!strcmp(c,"i18n_type")) + { + i18n_type = atoi(read_word()); + goto CONTINUE; + } + if (!strcmp(c,"header_name")) { + if (!header_file_set) header_file_name = strdup(read_word()); + else read_word(); + goto CONTINUE; + } + + if (!strcmp(c,"code_name")) { + if (!code_file_set) code_file_name = strdup(read_word()); + else read_word(); + goto CONTINUE; + } + + if (!strcmp(c, "snap") || !strcmp(c, "gridx") || !strcmp(c, "gridy")) { + // grid settings are now global + read_word(); + goto CONTINUE; + } + + {Fl_Type *t = Fl_Type_make(c); + if (!t) { + read_error("Unknown word \"%s\"", c); + continue; + } + t->name(read_word()); + + c = read_word(1); + if (strcmp(c,"{") && t->is_class()) { // + ((Fl_Class_Type*)t)->prefix(t->name()); + t->name(c); + c = read_word(1); + } + + if (strcmp(c,"{")) { + read_error("Missing property list for %s\n",t->title()); + goto REUSE_C; + } + + t->open_ = 0; + for (;;) { + const char *cc = read_word(); + if (!cc || !strcmp(cc,"}")) break; + t->read_property(cc); + } + + if (!t->is_parent()) continue; + c = read_word(1); + if (strcmp(c,"{")) { + read_error("Missing child list for %s\n",t->title()); + goto REUSE_C; + } + read_children(t, 0);} + Fl_Type::current = p; + CONTINUE:; + } +} + +extern void deselect(); + +int read_file(const char *filename, int merge) { + Fl_Type *o; + read_version = 0.0; + if (!open_read(filename)) return 0; + if (merge) deselect(); else delete_all(); + read_children(Fl_Type::current, merge); + Fl_Type::current = 0; + // Force menu items to be rebuilt... + for (o = Fl_Type::first; o; o = o->next) + if (o->is_menu_button()) o->add_child(0,0); + for (o = Fl_Type::first; o; o = o->next) + if (o->selected) {Fl_Type::current = o; break;} + selection_changed(Fl_Type::current); + return close_read(); +} + +//////////////////////////////////////////////////////////////// +// Read Forms and XForms fdesign files: + +int read_fdesign_line(const char*& name, const char*& value) { + + int length = 0; + int x; + // find a colon: + for (;;) { + x = getc(fin); + if (x < 0 && feof(fin)) return 0; + if (x == '\n') {length = 0; continue;} // no colon this line... + if (!isspace(x & 255)) { + buffer[length++] = x; + expand_buffer(length); + } + if (x == ':') break; + } + int valueoffset = length; + buffer[length-1] = 0; + + // skip to start of value: + for (;;) { + x = getc(fin); + if ((x < 0 && feof(fin)) || x == '\n' || !isspace(x & 255)) break; + } + + // read the value: + for (;;) { + if (x == '\\') {x = read_quoted(); if (x<0) continue;} + else if (x == '\n') break; + buffer[length++] = x; + expand_buffer(length); + x = getc(fin); + } + buffer[length] = 0; + name = buffer; + value = buffer+valueoffset; + return 1; +} + +int fdesign_flip; +int fdesign_magic; +#include + +static const char *class_matcher[] = { +"FL_CHECKBUTTON", "Fl_Check_Button", +"FL_ROUNDBUTTON", "Fl_Round_Button", +"FL_ROUND3DBUTTON", "Fl_Round_Button", +"FL_LIGHTBUTTON", "Fl_Light_Button", +"FL_FRAME", "Fl_Box", +"FL_LABELFRAME", "Fl_Box", +"FL_TEXT", "Fl_Box", +"FL_VALSLIDER", "Fl_Value_Slider", +"FL_MENU", "Fl_Menu_Button", +"3", "FL_BITMAP", +"1", "FL_BOX", +"71","FL_BROWSER", +"11","FL_BUTTON", +"4", "FL_CHART", +"42","FL_CHOICE", +"61","FL_CLOCK", +"25","FL_COUNTER", +"22","FL_DIAL", +"101","FL_FREE", +"31","FL_INPUT", +"12","Fl_Light_Button", +"41","FL_MENU", +"23","FL_POSITIONER", +"13","Fl_Round_Button", +"21","FL_SLIDER", +"2", "FL_BOX", // was FL_TEXT +"62","FL_TIMER", +"24","Fl_Value_Slider", +0}; + +void read_fdesign() { + fdesign_magic = atoi(read_word()); + fdesign_flip = (fdesign_magic < 13000); + Fl_Widget_Type *window = 0; + Fl_Widget_Type *group = 0; + Fl_Widget_Type *widget = 0; + if (!Fl_Type::current) { + Fl_Type *t = Fl_Type_make("Function"); + t->name("create_the_forms()"); + Fl_Type::current = t; + } + for (;;) { + const char *name; + const char *value; + if (!read_fdesign_line(name, value)) break; + + if (!strcmp(name,"Name")) { + + window = (Fl_Widget_Type*)Fl_Type_make("Fl_Window"); + window->name(value); + window->label(value); + Fl_Type::current = widget = window; + + } else if (!strcmp(name,"class")) { + + if (!strcmp(value,"FL_BEGIN_GROUP")) { + group = widget = (Fl_Widget_Type*)Fl_Type_make("Fl_Group"); + Fl_Type::current = group; + } else if (!strcmp(value,"FL_END_GROUP")) { + if (group) { + Fl_Group* g = (Fl_Group*)(group->o); + g->begin(); + g->forms_end(); + Fl_Group::current(0); + } + group = widget = 0; + Fl_Type::current = window; + } else { + for (int i = 0; class_matcher[i]; i += 2) + if (!strcmp(value,class_matcher[i])) { + value = class_matcher[i+1]; break;} + widget = (Fl_Widget_Type*)Fl_Type_make(value); + if (!widget) { + printf("class %s not found, using Fl_Button\n", value); + widget = (Fl_Widget_Type*)Fl_Type_make("Fl_Button"); + } + } + + } else if (widget) { + if (!widget->read_fdesign(name, value)) + printf("Ignoring \"%s: %s\"\n", name, value); + } + } +} + +// +// End of "$Id: file.cxx 5808 2007-05-10 12:06:31Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/fluid.app/Contents/Info.plist b/third_party/windows/fltk-1.1.10/fluid/fluid.app/Contents/Info.plist new file mode 100644 index 0000000..84b9185 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/fluid.app/Contents/Info.plist @@ -0,0 +1,68 @@ + + + + CFBundleInfoDictionaryVersion + 6.0 + + CFBundleExecutable + fluid + + CFBundleIdentifier + org.fltk.fluid + + CFBundleVersion + 1.1.7 + + CFBundleDevelopmentRegion + English + + NSHumanReadableCopyright + Copyright 1998-2006 by Bill Spitzak and others + + CFAppleHelpAnchor + help + + CFBundleName + FLUID + + CFBundlePackageType + APPL + + CFBundleSignature + FLID + + CFBundleIconFile + fluid.icns + + CFBundleShortVersionString + 1.1.7 + + CFBundleGetInfoString + 1.1.7, Copyright 1998-2006 by Bill Spitzak and others + + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + fl + + + CFBundleTypeIconFile + fluid.icns + + CFBundleTypeName + FLUID Designer File + + CFBundleTypeOSTypes + + Flid + + + CFBundleTypeRole + Editor + + + + + diff --git a/third_party/windows/fltk-1.1.10/fluid/fluid.app/Contents/PkgInfo b/third_party/windows/fltk-1.1.10/fluid/fluid.app/Contents/PkgInfo new file mode 100644 index 0000000..ee8b9a9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/fluid.app/Contents/PkgInfo @@ -0,0 +1 @@ +FLIDFlid diff --git a/third_party/windows/fltk-1.1.10/fluid/fluid.app/Contents/Resources/fluid.icns b/third_party/windows/fltk-1.1.10/fluid/fluid.app/Contents/Resources/fluid.icns new file mode 100644 index 0000000..bb9a233 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/fluid/fluid.app/Contents/Resources/fluid.icns differ diff --git a/third_party/windows/fltk-1.1.10/fluid/fluid.cxx b/third_party/windows/fltk-1.1.10/fluid/fluid.cxx new file mode 100644 index 0000000..11c3ca0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/fluid.cxx @@ -0,0 +1,2253 @@ +// +// "$Id: fluid.cxx 6783 2009-04-27 15:50:29Z AlbrechtS $" +// +// FLUID main entry for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // time(), localtime(), etc. + +#include "../src/flstring.h" +#include "alignment_panel.h" +#include "function_panel.h" +#include "template_panel.h" +#if !defined(WIN32) || defined(__CYGWIN__) +# include "print_panel.cxx" +#endif // !WIN32 || __CYGWIN__ + +#if defined(WIN32) && !defined(__CYGWIN__) +# include +# include +# include +# include +# include +# ifndef __WATCOMC__ +// Visual C++ 2005 incorrectly displays a warning about the use of POSIX APIs +// on Windows, which is supposed to be POSIX compliant... +# define access _access +# define chdir _chdir +# define getcwd _getcwd +# endif // !__WATCOMC__ +#else +# include +#endif +#ifdef __EMX__ +# include +#endif + +#include "about_panel.h" +#include "undo.h" + +#include "Fl_Type.h" + +extern "C" +{ +#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ) +# include +# ifdef HAVE_PNG_H +# include +# else +# include +# endif // HAVE_PNG_H +#endif // HAVE_LIBPNG && HAVE_LIBZ +} + +static Fl_Help_Dialog *help_dialog = 0; + +Fl_Preferences fluid_prefs(Fl_Preferences::USER, "fltk.org", "fluid"); +int gridx = 5; +int gridy = 5; +int snap = 1; +int show_guides = 1; + +// File history info... +char absolute_history[10][1024]; +char relative_history[10][1024]; + +void load_history(); +void update_history(const char *); + +// Shell command support... +void show_shell_window(); + +//////////////////////////////////////////////////////////////// + +static const char *filename; +void set_filename(const char *c); +void set_modflag(int mf); +int modflag; + +static char* pwd; +static char in_source_dir; +void goto_source_dir() { + if (in_source_dir) return; + if (!filename || !*filename) return; + const char *p = fl_filename_name(filename); + if (p <= filename) return; // it is in the current directory + char buffer[1024]; + strlcpy(buffer, filename, sizeof(buffer)); + int n = p-filename; if (n>1) n--; buffer[n] = 0; + if (!pwd) { + pwd = getcwd(0,1024); + if (!pwd) {fprintf(stderr,"getwd : %s\n",strerror(errno)); return;} + } + if (chdir(buffer)<0) {fprintf(stderr, "Can't chdir to %s : %s\n", + buffer, strerror(errno)); return;} + in_source_dir = 1; +} + +void leave_source_dir() { + if (!in_source_dir) return; + if (chdir(pwd)<0) {fprintf(stderr, "Can't chdir to %s : %s\n", + pwd, strerror(errno));} + in_source_dir = 0; +} + +char position_window(Fl_Window *w, const char *prefsName, int Visible, int X, int Y, int W=0, int H=0 ) { + Fl_Preferences pos(fluid_prefs, prefsName); + if (prevpos_button->value()) { + pos.get("x", X, X); + pos.get("y", Y, Y); + if ( W!=0 ) { + pos.get("w", W, W); + pos.get("h", H, H); + w->resize( X, Y, W, H ); + } + else + w->position( X, Y ); + } + pos.get("visible", Visible, Visible); + return Visible; +} + +void save_position(Fl_Window *w, const char *prefsName) { + Fl_Preferences pos(fluid_prefs, prefsName); + pos.set("x", w->x()); + pos.set("y", w->y()); + pos.set("w", w->w()); + pos.set("h", w->h()); + pos.set("visible", (int)(w->shown() && w->visible())); +} + +Fl_Window *main_window; +Fl_Menu_Bar *main_menubar; + +static char* cutfname(int which = 0) { + static char name[2][1024]; + static char beenhere = 0; + + if (!beenhere) { + beenhere = 1; + fluid_prefs.getUserdataPath(name[0], sizeof(name[0])); + strlcat(name[0], "cut_buffer", sizeof(name[0])); + fluid_prefs.getUserdataPath(name[1], sizeof(name[1])); + strlcat(name[1], "dup_buffer", sizeof(name[1])); + } + + return name[which]; +} + +void save_cb(Fl_Widget *, void *v) { + const char *c = filename; + if (v || !c || !*c) { + fl_file_chooser_ok_label("Save"); + c=fl_file_chooser("Save To:", "FLUID Files (*.f[ld])", c); + fl_file_chooser_ok_label(NULL); + if (!c) return; + + if (!access(c, 0)) { + const char *basename; + if ((basename = strrchr(c, '/')) != NULL) + basename ++; +#if defined(WIN32) || defined(__EMX__) + if ((basename = strrchr(c, '\\')) != NULL) + basename ++; +#endif // WIN32 || __EMX__ + else + basename = c; + + if (fl_choice("The file \"%s\" already exists.\n" + "Do you want to replace it?", "Cancel", + "Replace", NULL, basename) == 0) return; + } + + if (v != (void *)2) set_filename(c); + } + if (!write_file(c)) { + fl_alert("Error writing %s: %s", c, strerror(errno)); + return; + } + + if (v != (void *)2) { + set_modflag(0); + undo_save = undo_current; + } +} + +void save_template_cb(Fl_Widget *, void *) { + // Setup the template panel... + if (!template_panel) make_template_panel(); + + template_clear(); + template_browser->add("New Template"); + template_load(); + + template_name->show(); + template_name->value(""); + + template_instance->hide(); + + template_delete->show(); + template_delete->deactivate(); + + template_submit->label("Save"); + template_submit->deactivate(); + + template_panel->label("Save Template"); + + // Show the panel and wait for the user to do something... + template_panel->show(); + while (template_panel->shown()) Fl::wait(); + + // Get the template name, return if it is empty... + const char *c = template_name->value(); + if (!c || !*c) return; + + // Convert template name to filename_with_underscores + char safename[1024], *safeptr; + strlcpy(safename, c, sizeof(safename)); + for (safeptr = safename; *safeptr; safeptr ++) { + if (isspace(*safeptr)) *safeptr = '_'; + } + + // Find the templates directory... + char filename[1024]; + fluid_prefs.getUserdataPath(filename, sizeof(filename)); + + strlcat(filename, "templates", sizeof(filename)); +#if defined(WIN32) && !defined(__CYGWIN__) + if (access(filename, 0)) mkdir(filename); +#else + if (access(filename, 0)) mkdir(filename, 0777); +#endif // WIN32 && !__CYGWIN__ + + strlcat(filename, "/", sizeof(filename)); + strlcat(filename, safename, sizeof(filename)); + + char *ext = filename + strlen(filename); + if (ext >= (filename + sizeof(filename) - 5)) { + fl_alert("The template name \"%s\" is too long!", c); + return; + } + + // Save the .fl file... + strcpy(ext, ".fl"); + + if (!access(filename, 0)) { + if (fl_choice("The template \"%s\" already exists.\n" + "Do you want to replace it?", "Cancel", + "Replace", NULL, c) == 0) return; + } + + if (!write_file(filename)) { + fl_alert("Error writing %s: %s", filename, strerror(errno)); + return; + } + +#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ) + // Get the screenshot, if any... + Fl_Type *t; + + for (t = Fl_Type::first; t; t = t->next) { + // Find the first window... + if (t->is_window()) break; + } + + if (!t) return; + + // Grab a screenshot... + Fl_Window_Type *wt = (Fl_Window_Type *)t; + uchar *pixels; + int w, h; + + if ((pixels = wt->read_image(w, h)) == NULL) return; + + // Save to a PNG file... + strcpy(ext, ".png"); + + FILE *fp; + + if ((fp = fopen(filename, "wb")) == NULL) { + delete[] pixels; + fl_alert("Error writing %s: %s", filename, strerror(errno)); + return; + } + + png_structp pptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0); + png_infop iptr = png_create_info_struct(pptr); + png_bytep ptr = (png_bytep)pixels; + + png_init_io(pptr, fp); + png_set_IHDR(pptr, iptr, w, h, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + png_set_sRGB(pptr, iptr, PNG_sRGB_INTENT_PERCEPTUAL); + + png_write_info(pptr, iptr); + + for (int i = h; i > 0; i --, ptr += w * 3) { + png_write_row(pptr, ptr); + } + + png_write_end(pptr, iptr); + png_destroy_write_struct(&pptr, &iptr); + + fclose(fp); + +# if 0 // The original PPM output code... + strcpy(ext, ".ppm"); + fp = fopen(filename, "wb"); + fprintf(fp, "P6\n%d %d 255\n", w, h); + fwrite(pixels, w * h, 3, fp); + fclose(fp); +# endif // 0 + + delete[] pixels; +#endif // HAVE_LIBPNG && HAVE_LIBZ +} + +void revert_cb(Fl_Widget *,void *) { + if (modflag) { + if (!fl_choice("This user interface has been changed. Really revert?", + "Cancel", "Revert", NULL)) return; + } + undo_suspend(); + if (!read_file(filename, 0)) { + undo_resume(); + fl_message("Can't read %s: %s", filename, strerror(errno)); + return; + } + undo_resume(); + set_modflag(0); + undo_clear(); +} + +void exit_cb(Fl_Widget *,void *) { + if (modflag) + switch (fl_choice("Do you want to save changes to this user\n" + "interface before exiting?", "Cancel", + "Save", "Don't Save")) + { + case 0 : /* Cancel */ + return; + case 1 : /* Save */ + save_cb(NULL, NULL); + if (modflag) return; // Didn't save! + } + + save_position(main_window,"main_window_pos"); + + if (widgetbin_panel) { + save_position(widgetbin_panel,"widgetbin_pos"); + delete widgetbin_panel; + } + if (sourceview_panel) { + Fl_Preferences svp(fluid_prefs, "sourceview"); + svp.set("autorefresh", sv_autorefresh->value()); + svp.set("autoposition", sv_autoposition->value()); + svp.set("tab", sv_tab->find(sv_tab->value())); + save_position(sourceview_panel,"sourceview_pos"); + delete sourceview_panel; + } + if (about_panel) + delete about_panel; + if (help_dialog) + delete help_dialog; + + undo_clear(); + + exit(0); +} + +#ifdef __APPLE__ +# include + +void +apple_open_cb(const char *c) { + if (modflag) { + switch (fl_choice("Do you want to save changes to this user\n" + "interface before opening another one?", "Don't Save", + "Save", "Cancel")) + { + case 0 : /* Cancel */ + return; + case 1 : /* Save */ + save_cb(NULL, NULL); + if (modflag) return; // Didn't save! + } + } + const char *oldfilename; + oldfilename = filename; + filename = NULL; + set_filename(c); + undo_suspend(); + if (!read_file(c, 0)) { + undo_resume(); + fl_message("Can't read %s: %s", c, strerror(errno)); + free((void *)filename); + filename = oldfilename; + if (main_window) main_window->label(filename); + return; + } + + // Loaded a file; free the old filename... + set_modflag(0); + undo_resume(); + undo_clear(); + if (oldfilename) free((void *)oldfilename); +} +#endif // __APPLE__ + +void open_cb(Fl_Widget *, void *v) { + if (!v && modflag) { + switch (fl_choice("Do you want to save changes to this user\n" + "interface before opening another one?", "Cancel", + "Save", "Don't Save")) + { + case 0 : /* Cancel */ + return; + case 1 : /* Save */ + save_cb(NULL, NULL); + if (modflag) return; // Didn't save! + } + } + const char *c; + const char *oldfilename; + fl_file_chooser_ok_label("Open"); + c = fl_file_chooser("Open:", "FLUID Files (*.f[ld])", filename); + fl_file_chooser_ok_label(NULL); + if (!c) return; + oldfilename = filename; + filename = NULL; + set_filename(c); + if (v != 0) undo_checkpoint(); + undo_suspend(); + if (!read_file(c, v!=0)) { + undo_resume(); + fl_message("Can't read %s: %s", c, strerror(errno)); + free((void *)filename); + filename = oldfilename; + if (main_window) set_modflag(modflag); + return; + } + undo_resume(); + if (v) { + // Inserting a file; restore the original filename... + free((void *)filename); + filename = oldfilename; + set_modflag(1); + } else { + // Loaded a file; free the old filename... + set_modflag(0); + undo_clear(); + if (oldfilename) free((void *)oldfilename); + } +} + +void open_history_cb(Fl_Widget *, void *v) { + if (modflag) { + switch (fl_choice("Do you want to save changes to this user\n" + "interface before opening another one?", "Cancel", + "Save", "Don't Save")) + { + case 0 : /* Cancel */ + return; + case 1 : /* Save */ + save_cb(NULL, NULL); + if (modflag) return; // Didn't save! + } + } + const char *oldfilename = filename; + filename = NULL; + set_filename((char *)v); + undo_suspend(); + if (!read_file(filename, 0)) { + undo_resume(); + undo_clear(); + fl_message("Can't read %s: %s", filename, strerror(errno)); + free((void *)filename); + filename = oldfilename; + if (main_window) main_window->label(filename); + return; + } + set_modflag(0); + undo_resume(); + undo_clear(); + if (oldfilename) free((void *)oldfilename); +} + +void new_cb(Fl_Widget *, void *v) { + // Check if the current file has been modified... + if (!v && modflag) { + // Yes, ask the user what to do... + switch (fl_choice("Do you want to save changes to this user\n" + "interface before creating a new one?", "Cancel", + "Save", "Don't Save")) + { + case 0 : /* Cancel */ + return; + case 1 : /* Save */ + save_cb(NULL, NULL); + if (modflag) return; // Didn't save! + } + } + + // Setup the template panel... + if (!template_panel) make_template_panel(); + + template_clear(); + template_browser->add("Blank"); + template_load(); + + template_name->hide(); + template_name->value(""); + + template_instance->show(); + template_instance->deactivate(); + template_instance->value(""); + + template_delete->hide(); + + template_submit->label("New"); + template_submit->deactivate(); + + template_panel->label("New"); + + // Show the panel and wait for the user to do something... + template_panel->show(); + while (template_panel->shown()) Fl::wait(); + + // See if the user chose anything... + int item = template_browser->value(); + if (item < 1) return; + + // Clear the current data... + delete_all(); + set_filename(NULL); + + // Load the template, if any... + const char *tname = (const char *)template_browser->data(item); + + if (tname) { + // Grab the instance name... + const char *iname = template_instance->value(); + + if (iname && *iname) { + // Copy the template to a temp file, then read it in... + char line[1024], *ptr, *next; + FILE *infile, *outfile; + + if ((infile = fopen(tname, "r")) == NULL) { + fl_alert("Error reading template file \"%s\":\n%s", tname, + strerror(errno)); + set_modflag(0); + undo_clear(); + return; + } + + if ((outfile = fopen(cutfname(1), "w")) == NULL) { + fl_alert("Error writing buffer file \"%s\":\n%s", cutfname(1), + strerror(errno)); + fclose(infile); + set_modflag(0); + undo_clear(); + return; + } + + while (fgets(line, sizeof(line), infile)) { + // Replace @INSTANCE@ with the instance name... + for (ptr = line; (next = strstr(ptr, "@INSTANCE@")) != NULL; ptr = next + 10) { + fwrite(ptr, next - ptr, 1, outfile); + fputs(iname, outfile); + } + + fputs(ptr, outfile); + } + + fclose(infile); + fclose(outfile); + + undo_suspend(); + read_file(cutfname(1), 0); + unlink(cutfname(1)); + undo_resume(); + } else { + // No instance name, so read the template without replacements... + undo_suspend(); + read_file(tname, 0); + undo_resume(); + } + } + + set_modflag(0); + undo_clear(); +} + +int compile_only = 0; +int compile_strings = 0; +int header_file_set = 0; +int code_file_set = 0; +const char* header_file_name = ".h"; +const char* code_file_name = ".cxx"; +int i18n_type = 0; +const char* i18n_include = ""; +const char* i18n_function = ""; +const char* i18n_file = ""; +const char* i18n_set = ""; +char i18n_program[1024] = ""; + +void write_cb(Fl_Widget *, void *) { + if (!filename) { + save_cb(0,0); + if (!filename) return; + } + char cname[1024]; + char hname[1024]; + strlcpy(i18n_program, fl_filename_name(filename), sizeof(i18n_program)); + fl_filename_setext(i18n_program, sizeof(i18n_program), ""); + if (*code_file_name == '.' && strchr(code_file_name, '/') == NULL) { + strlcpy(cname, fl_filename_name(filename), sizeof(cname)); + fl_filename_setext(cname, sizeof(cname), code_file_name); + } else { + strlcpy(cname, code_file_name, sizeof(hname)); + } + if (*header_file_name == '.' && strchr(header_file_name, '/') == NULL) { + strlcpy(hname, fl_filename_name(filename), sizeof(hname)); + fl_filename_setext(hname, sizeof(hname), header_file_name); + } else { + strlcpy(hname, header_file_name, sizeof(hname)); + } + if (!compile_only) goto_source_dir(); + int x = write_code(cname,hname); + if (!compile_only) leave_source_dir(); + strlcat(cname, " and ", sizeof(cname)); + strlcat(cname, hname, sizeof(cname)); + if (compile_only) { + if (!x) {fprintf(stderr,"%s : %s\n",cname,strerror(errno)); exit(1);} + } else { + if (!x) { + fl_message("Can't write %s: %s", cname, strerror(errno)); + } else if (completion_button->value()) { + fl_message("Wrote %s", cname); + } + } +} + +void write_strings_cb(Fl_Widget *, void *) { + static const char *exts[] = { ".txt", ".po", ".msg" }; + if (!filename) { + save_cb(0,0); + if (!filename) return; + } + char sname[1024]; + strlcpy(sname, fl_filename_name(filename), sizeof(sname)); + fl_filename_setext(sname, sizeof(sname), exts[i18n_type]); + if (!compile_only) goto_source_dir(); + int x = write_strings(sname); + if (!compile_only) leave_source_dir(); + if (compile_only) { + if (x) {fprintf(stderr,"%s : %s\n",sname,strerror(errno)); exit(1);} + } else { + if (x) { + fl_message("Can't write %s: %s", sname, strerror(errno)); + } else if (completion_button->value()) { + fl_message("Wrote %s", sname); + } + } +} + +void openwidget_cb(Fl_Widget *, void *) { + if (!Fl_Type::current) { + fl_message("Please select a widget"); + return; + } + Fl_Type::current->open(); +} + +void toggle_overlays(Fl_Widget *,void *); + +void select_all_cb(Fl_Widget *,void *); +void select_none_cb(Fl_Widget *,void *); + +void group_cb(Fl_Widget *, void *); + +void ungroup_cb(Fl_Widget *, void *); + +extern int pasteoffset; +static int ipasteoffset; + +void copy_cb(Fl_Widget*, void*) { + if (!Fl_Type::current) { + fl_beep(); + return; + } + ipasteoffset = 10; + if (!write_file(cutfname(),1)) { + fl_message("Can't write %s: %s", cutfname(), strerror(errno)); + return; + } +} + +extern void select_only(Fl_Type *); +void cut_cb(Fl_Widget *, void *) { + if (!Fl_Type::current) { + fl_beep(); + return; + } + if (!write_file(cutfname(),1)) { + fl_message("Can't write %s: %s", cutfname(), strerror(errno)); + return; + } + undo_checkpoint(); + set_modflag(1); + ipasteoffset = 0; + Fl_Type *p = Fl_Type::current->parent; + while (p && p->selected) p = p->parent; + delete_all(1); + if (p) select_only(p); +} + +void delete_cb(Fl_Widget *, void *) { + if (!Fl_Type::current) { + fl_beep(); + return; + } + undo_checkpoint(); + set_modflag(1); + ipasteoffset = 0; + Fl_Type *p = Fl_Type::current->parent; + while (p && p->selected) p = p->parent; + delete_all(1); + if (p) select_only(p); +} + +extern int force_parent; + +void paste_cb(Fl_Widget*, void*) { + //if (ipasteoffset) force_parent = 1; + pasteoffset = ipasteoffset; + if (gridx>1) pasteoffset = ((pasteoffset-1)/gridx+1)*gridx; + if (gridy>1) pasteoffset = ((pasteoffset-1)/gridy+1)*gridy; + undo_checkpoint(); + undo_suspend(); + if (!read_file(cutfname(), 1)) { + fl_message("Can't read %s: %s", cutfname(), strerror(errno)); + } + undo_resume(); + pasteoffset = 0; + ipasteoffset += 10; + force_parent = 0; +} + +// Duplicate the selected widgets... +void duplicate_cb(Fl_Widget*, void*) { + if (!Fl_Type::current) { + fl_beep(); + return; + } + + if (!write_file(cutfname(1),1)) { + fl_message("Can't write %s: %s", cutfname(1), strerror(errno)); + return; + } + + pasteoffset = 0; + force_parent = 1; + + undo_checkpoint(); + undo_suspend(); + if (!read_file(cutfname(1), 1)) { + fl_message("Can't read %s: %s", cutfname(1), strerror(errno)); + } + unlink(cutfname(1)); + undo_resume(); + + force_parent = 0; +} + +void earlier_cb(Fl_Widget*,void*); + +void later_cb(Fl_Widget*,void*); + +Fl_Type *sort(Fl_Type *parent); + +static void sort_cb(Fl_Widget *,void *) { + sort((Fl_Type*)0); +} + +void show_project_cb(Fl_Widget *, void *); +void show_grid_cb(Fl_Widget *, void *); +void show_settings_cb(Fl_Widget *, void *); + +void align_widget_cb(Fl_Widget *, long); +void widget_size_cb(Fl_Widget *, long); + +void about_cb(Fl_Widget *, void *) { + if (!about_panel) make_about_panel(); + about_panel->show(); +} + +void show_help(const char *name) { + const char *docdir; + char helpname[1024]; + + if (!help_dialog) help_dialog = new Fl_Help_Dialog(); + + if ((docdir = getenv("FLTK_DOCDIR")) == NULL) { +#ifdef __EMX__ + // Doesn't make sense to have a hardcoded fallback + static char fltk_docdir[1024]; + + strlcpy(fltk_docdir, __XOS2RedirRoot("/XFree86/lib/X11/fltk/doc"), + sizeof(fltk_docdir)); + + docdir = fltk_docdir; +#else + docdir = FLTK_DOCDIR; +#endif // __EMX__ + } + snprintf(helpname, sizeof(helpname), "%s/%s", docdir, name); + + help_dialog->load(helpname); + help_dialog->show(); +} + +void help_cb(Fl_Widget *, void *) { + show_help("fluid.html"); +} + +void manual_cb(Fl_Widget *, void *) { + show_help("index.html"); +} + + +//////////////////////////////////////////////////////////////// + +#if defined(WIN32) && !defined(__CYGWIN__) +// Draw a shaded box... +static void win_box(int x, int y, int w, int h) { + fl_color(0xc0, 0xc0, 0xc0); + fl_rectf(x, y, w, h); + fl_color(0, 0, 0); + fl_rect(x, y, w, h); + fl_color(0xf0, 0xf0, 0xf0); + fl_rectf(x + 1, y + 1, 4, h - 2); + fl_rectf(x + 1, y + 1, w - 2, 4); + fl_color(0x90, 0x90, 0x90); + fl_rectf(x + w - 5, y + 1, 4, h - 2); + fl_rectf(x + 1, y + h - 5, w - 2, 4); +} + +// Load and show the print dialog... +void print_menu_cb(Fl_Widget *, void *) { + PRINTDLG dialog; // Print dialog + DOCINFO docinfo; // Document info + int first, last; // First and last page + int page; // Current page + int winpage; // Current window page + int num_pages; // Number of pages + Fl_Type *t; // Current widget + int num_windows; // Number of windows + Fl_Window_Type *windows[1000]; // Windows to print + + + // Show print dialog... + for (t = Fl_Type::first, num_pages = 0; t; t = t->next) { + if (t->is_window()) num_pages ++; + } + + memset(&dialog, 0, sizeof(dialog)); + dialog.lStructSize = sizeof(dialog); + dialog.hwndOwner = fl_xid(main_window); + dialog.Flags = PD_ALLPAGES | + PD_RETURNDC; + dialog.nFromPage = 1; + dialog.nToPage = num_pages; + dialog.nMinPage = 1; + dialog.nMaxPage = num_pages; + dialog.nCopies = 1; + + if (!PrintDlg(&dialog)) return; + + // Get the base filename... + const char *basename = strrchr(filename, '/'); + if (basename) basename ++; + else basename = filename; + + // Do the print job... + memset(&docinfo, 0, sizeof(docinfo)); + docinfo.cbSize = sizeof(docinfo); + docinfo.lpszDocName = basename; + + StartDoc(dialog.hDC, &docinfo); + + // Figure out how many pages we'll have to print... + if (dialog.Flags & PD_PAGENUMS) { + // Get from and to page numbers... + first = dialog.nFromPage; + last = dialog.nToPage; + + if (first > last) { + // Swap first/last page + page = first; + first = last; + last = page; + } + } else { + // Print everything... + first = 1; + last = dialog.nMaxPage; + } + + for (t = Fl_Type::first, num_windows = 0, winpage = 0; t; t = t->next) { + if (t->is_window()) { + winpage ++; + windows[num_windows] = (Fl_Window_Type *)t; + num_windows ++; +#if 0 + if (dialog.Flags & PD_ALLPAGES) num_windows ++; + else if ((dialog.Flags & PD_PAGENUMS) && winpage >= first && + winpage <= last) num_windows ++; + else if ((dialog.Flags & PD_SELECTION) && t->selected) num_windows ++; +#endif // 0 + } + } + + num_pages = num_windows; + + // Figure out the page size and margins... + int width, length; // Size of page + int xdpi, ydpi; // Output resolution + char buffer[1024]; + + width = GetDeviceCaps(dialog.hDC, HORZRES); + length = GetDeviceCaps(dialog.hDC, VERTRES); + xdpi = GetDeviceCaps(dialog.hDC, LOGPIXELSX); + ydpi = GetDeviceCaps(dialog.hDC, LOGPIXELSY); + +// fl_message("width=%d, length=%d, xdpi=%d, ydpi=%d, num_windows=%d\n", +// width, length, xdpi, ydpi, num_windows); + + HDC save_dc = fl_gc; + HWND save_win = fl_window; + int fontsize = 14 * ydpi / 72; + + fl_gc = dialog.hDC; + fl_window = (HWND)dialog.hDC; + fl_push_no_clip(); + + // Get the time and date... + time_t curtime = time(NULL); + struct tm *curdate = localtime(&curtime); + char date[1024]; + + strftime(date, sizeof(date), "%c", curdate); + + // Print each of the windows... + for (winpage = 0; winpage < num_windows; winpage ++) { + // Draw header... + StartPage(dialog.hDC); + + fl_font(FL_HELVETICA_BOLD, fontsize); + fl_color(0, 0, 0); + + fl_draw(basename, 0, fontsize); + + fl_draw(date, (width - (int)fl_width(date)) / 2, fontsize); + + sprintf(buffer, "%d/%d", winpage + 1, num_windows); + fl_draw(buffer, width - (int)fl_width(buffer), fontsize); + + // Get window image... + uchar *pixels; // Window image data + int w, h; // Window image dimensions + int ww, hh; // Scaled size + int ulx, uly; // Upper-lefthand corner + Fl_Window *win; // Window widget + BITMAPINFO info; // Bitmap information + + win = (Fl_Window *)(windows[winpage]->o); + pixels = windows[winpage]->read_image(w, h); + + // Swap colors: FLTK uses R-G-B --> Windows GDI uses B-G-R + + { uchar *p = pixels; + for (int i=0; i width) { + ww = width; + hh = h * ww * ydpi / xdpi / w; + } + + if (hh > (length - ydpi / 2)) { + hh = length - ydpi / 2; + ww = w * hh / h; + } + + // Position the window in the center... + ulx = (width - ww) / 2; + uly = (length - hh) / 2; + +// fl_message("winpage=%d, ulx=%d, uly=%d, ww=%d, hh=%d", +// winpage, ulx, uly, ww, hh); + + // Draw a simulated window border... + int xborder = 4 * ww / w; + int yborder = 4 * hh / h; + + win_box(ulx - xborder, uly - 5 * yborder, + ww + 2 * xborder, hh + 6 * yborder); + + fl_color(0, 0, 255); + fl_rectf(ulx, uly - 4 * yborder, ww, 4 * yborder); + + fl_font(FL_HELVETICA_BOLD, 2 * yborder); + fl_color(255, 255, 255); + fl_draw(win->label() ? win->label() : "Window", + ulx + xborder, uly - 3 * yborder); + + int x = ulx + ww - 4 * xborder; + + win_box(x, uly - 4 * yborder, 4 * xborder, 4 * yborder); + fl_color(0, 0, 0); + fl_line(x + xborder, uly - yborder, + x + 3 * xborder, uly - 3 * yborder); + fl_line(x + xborder, uly - 3 * yborder, + x + 3 * xborder, uly - yborder); + x -= 4 * xborder; + + if (win->resizable()) { + win_box(x, uly - 4 * yborder, 4 * xborder, 4 * yborder); + fl_color(0, 0, 0); + fl_rect(x + xborder, uly - 3 * yborder, 2 * xborder, 2 * yborder); + x -= 4 * xborder; + } + + if (!win->modal()) { + win_box(x, uly - 4 * yborder, 4 * xborder, 4 * yborder); + fl_color(0, 0, 0); + fl_line(x + xborder, uly - yborder, x + 3 * xborder, uly - yborder); + x -= 4 * xborder; + } + + // Color image... + memset(&info, 0, sizeof(info)); + info.bmiHeader.biSize = sizeof(info); + info.bmiHeader.biWidth = w; + info.bmiHeader.biHeight = 1; + info.bmiHeader.biPlanes = 1; + info.bmiHeader.biBitCount = 24; + info.bmiHeader.biCompression = BI_RGB; + + for (int y = 0; y < h; y ++) { + StretchDIBits(dialog.hDC, ulx, uly + y * hh / h, ww, (hh + h - 1) / h, 0, 0, w, 1, + pixels + y * w * 3, &info, DIB_RGB_COLORS, SRCCOPY); + } + + delete[] pixels; + + // Show the page... + EndPage(dialog.hDC); + } + + // Finish up... + EndDoc(dialog.hDC); + + fl_gc = save_dc; + fl_window = save_win; + fl_pop_clip(); + + // Free the print DC and return... + DeleteDC(dialog.hDC); +} +#else +// Load and show the print dialog... +void print_menu_cb(Fl_Widget *, void *) { + if (!print_panel) make_print_panel(); + + print_load(); + + print_selection->deactivate(); + + for (Fl_Type *t = Fl_Type::first; t; t = t->next) { + if (t->selected && t->is_window()) { + print_selection->activate(); + break; + } + } + + print_all->setonly(); + print_all->do_callback(); + + print_panel->show(); +} + +// Quote a string for PostScript printing +static const char *ps_string(const char *s) { + char *bufptr; + static char buffer[2048]; + + + if (!s) { + buffer[0] = '\0'; + } else { + for (bufptr = buffer; bufptr < (buffer + sizeof(buffer) - 3) && *s;) { + if (*s == '(' || *s == ')' || *s == '\\') *bufptr++ = '\\'; + *bufptr++ = *s++; + } + + *bufptr = '\0'; + } + + return (buffer); +} + +// Actually print... +void print_cb(Fl_Return_Button *, void *) { + FILE *outfile; // Output file or pipe to print command + char command[1024]; // Print command + int copies; // Collated copies + int first, last; // First and last page + int page; // Current page + int winpage; // Current window page + int num_pages; // Number of pages + Fl_Type *t; // Current widget + int num_windows; // Number of windows + Fl_Window_Type *windows[1000]; // Windows to print + + // Show progress, deactivate controls... + print_panel_controls->deactivate(); + print_progress->show(); + + // Figure out how many pages we'll have to print... + if (print_collate_button->value()) copies = (int)print_copies->value(); + else copies = 1; + + if (print_pages->value()) { + // Get from and to page numbers... + if ((first = atoi(print_from->value())) < 1) first = 1; + if ((last = atoi(print_to->value())) < 1) last = 1000; + + if (first > last) { + // Swap first/last page + page = first; + first = last; + last = page; + } + } else { + // Print everything... + first = 1; + last = 1000; + } + + for (t = Fl_Type::first, num_windows = 0, winpage = 0; t; t = t->next) { + if (t->is_window()) { + winpage ++; + windows[num_windows] = (Fl_Window_Type *)t; + + if (print_all->value()) num_windows ++; + else if (print_pages->value() && winpage >= first && + winpage <= last) num_windows ++; + else if (print_selection->value() && t->selected) num_windows ++; + } + } + + num_pages = num_windows * copies; + + print_progress->minimum(0); + print_progress->maximum(num_pages); + print_progress->value(0); + Fl::check(); + + // Get the base filename... + const char *basename = strrchr(filename, '/'); + if (basename) basename ++; + else basename = filename; + + // Open the print stream... + if (print_choice->value()) { + // Pipe the output into the lp command... + const char *printer = (const char *)print_choice->menu()[print_choice->value()].user_data(); + + snprintf(command, sizeof(command), "lp -s -d %s -n %.0f -t '%s' -o media=%s", + printer, print_collate_button->value() ? 1.0 : print_copies->value(), + basename, print_page_size->text(print_page_size->value())); + outfile = popen(command, "w"); + } else { + // Print to file... + fl_file_chooser_ok_label("Print"); + const char *outname = fl_file_chooser("Print To", "PostScript (*.ps)", NULL, 1); + fl_file_chooser_ok_label(NULL); + + if (outname && !access(outname, 0)) { + if (fl_choice("The file \"%s\" already exists.\n" + "Do you want to replace it?", "Cancel", + "Replace", NULL, outname) == 0) outname = NULL; + } + + if (outname) outfile = fopen(outname, "w"); + else outfile = NULL; + } + + if (outfile) { + // Figure out the page size and margins... + int width, length; // Size of page + int left, bottom, // Bottom lefthand corner + right, top; // Top righthand corner + + if (print_page_size->value()) { + // A4 + width = 595; + length = 842; + } else { + // Letter + width = 612; + length = 792; + } + + int output_mode; + for (output_mode = 0; output_mode < 4; output_mode ++) { + if (print_output_mode[output_mode]->value()) break; + } + + if (output_mode & 1) { + // Landscape + left = 36; + bottom = 18; + right = length - 36; + top = width - 18; + } else { + // Portrait + left = 18; + bottom = 36; + right = width - 18; + top = length - 36; + } + + // Get the time and date... + time_t curtime = time(NULL); + struct tm *curdate = localtime(&curtime); + char date[1024]; + + strftime(date, sizeof(date), "%c", curdate); + + // Write the prolog... + fprintf(outfile, + "%%!PS-Adobe-3.0\n" + "%%%%BoundingBox: 18 36 %d %d\n" + "%%%%Pages: %d\n" + "%%%%LanguageLevel: 1\n" + "%%%%DocumentData: Clean7Bit\n" + "%%%%DocumentNeededResources: font Helvetica-Bold\n" + "%%%%Creator: FLUID %.4f\n" + "%%%%CreationDate: %s\n" + "%%%%Title: (%s)\n" + "%%%%EndComments\n" + "%%%%BeginProlog\n" + "%%languagelevel 1 eq {\n" + " /rectfill {\n" + " newpath 4 2 roll moveto dup 0 exch rlineto exch 0 rlineto\n" + " neg 0 exch rlineto closepath fill\n" + " } bind def\n" + " /rectstroke {\n" + " newpath 4 2 roll moveto dup 0 exch rlineto exch 0 rlineto\n" + " neg 0 exch rlineto closepath stroke\n" + " } bind def\n" + "%%} if\n" + "%%%%EndProlog\n" + "%%%%BeginSetup\n" + "%%%%BeginFeature: *PageSize %s\n" + "languagelevel 1 ne {\n" + " <>setpagedevice\n" + "} {\n" + " %s\n" + "} ifelse\n" + "%%%%EndFeature\n" + "%%%%EndSetup\n", + width - 18, length - 36, + num_pages, + FL_VERSION, + date, + basename, + print_page_size->text(print_page_size->value()), + width, length, + print_page_size->value() ? "a4tray" : "lettertray"); + + // Print each of the windows... + char progress[255]; // Progress text + int copy; // Current copy + + for (copy = 0, page = 0; copy < copies; copy ++) { + for (winpage = 0; winpage < num_pages; winpage ++) { + // Start next page... + page ++; + sprintf(progress, "Printing page %d/%d...", page, num_pages); + print_progress->value(page); + print_progress->label(progress); + Fl::check(); + + // Add common page stuff... + fprintf(outfile, + "%%%%Page: %d %d\n" + "gsave\n", + page, page); + + if (output_mode & 1) { + // Landscape... + fprintf(outfile, "%d 0 translate 90 rotate\n", width); + } + + // Draw header... + fprintf(outfile, + "0 setgray\n" + "/Helvetica-Bold findfont 14 scalefont setfont\n" + "%d %d moveto (%s) show\n" + "%.1f %d moveto (%s) dup stringwidth pop -0.5 mul 0 rmoveto show\n" + "%d %d moveto (%d/%d) dup stringwidth pop neg 0 rmoveto show\n", + left, top - 15, ps_string(basename), + 0.5 * (left + right), top - 15, date, + right, top - 15, winpage + 1, num_windows); + + // Get window image... + uchar *pixels; // Window image data + int w, h; // Window image dimensions + float ww, hh; // Scaled size + float border; // Width of 1 pixel + float llx, lly, // Lower-lefthand corner + urx, ury; // Upper-righthand corner + Fl_Window *win; // Window widget + + win = (Fl_Window *)(windows[winpage]->o); + pixels = windows[winpage]->read_image(w, h); + + // Figure out the window size, first at 100 PPI and then scaled + // down if that is too big... + ww = w * 72.0 / 100.0; + hh = h * 72.0 / 100.0; + + if (ww > (right - left)) { + ww = right - left; + hh = h * ww / w; + } + + if (hh > (top - bottom - 36)) { + hh = top - bottom; + ww = w * hh / h; + } + + border = ww / w; + + // Position the window in the center... + llx = 0.5 * (right - left - ww); + lly = 0.5 * (top - bottom - hh); + urx = 0.5 * (right - left + ww); + ury = 0.5 * (top - bottom + hh); + + // Draw a simulated window border... + fprintf(outfile, + "0.75 setgray\n" // Gray background + "newpath %.2f %.2f %.2f 180 90 arcn\n" // Top left + "%.2f %.2f %.2f 90 0 arcn\n" // Top right + "%.2f %.2f %.2f 0 -90 arcn\n" // Bottom right + "%.2f %.2f %.2f -90 -180 arcn\n" // Bottom left + "closepath gsave fill grestore\n" // Fill + "0 setlinewidth 0 setgray stroke\n", // Outline + llx, ury + 12 * border, 4 * border, + urx, ury + 12 * border, 4 * border, + urx, lly, 4 * border, + llx, lly, 4 * border); + + // Title bar... + if (output_mode & 2) { + fputs("0.25 setgray\n", outfile); + } else { + fputs("0.1 0.2 0.6 setrgbcolor\n", outfile); + } + + fprintf(outfile, "%.2f %.2f %.2f %.2f rectfill\n", + llx + 12 * border, ury, + ww - (24 + 16 * (!win->modal() || win->resizable()) + + 16 * (!win->modal() && win->resizable())) * border, + 16 * border); + + if (win->resizable()) { + fprintf(outfile, + "%.2f %.2f %.2f -90 -180 arcn\n" // Bottom left + "0 %.2f rlineto %.2f 0 rlineto 0 -%.2f rlineto closepath fill\n" + "%.2f %.2f %.2f 0 -90 arcn\n" // Bottom right + "-%.2f 0 rlineto 0 %.2f rlineto %.2f 0 rlineto closepath fill\n", + llx, lly, 4 * border, + 12 * border, 16 * border, 16 * border, + urx, lly, 4 * border, + 12 * border, 16 * border, 16 * border); + } + + // Inside outline and button shading... + fprintf(outfile, + "%.2f setlinewidth 0.5 setgray\n" + "%.2f %.2f %.2f %.2f rectstroke\n" + "%.2f %.2f moveto 0 %.2f rlineto\n" + "%.2f %.2f moveto 0 %.2f rlineto\n", + border, + llx - 0.5 * border, lly - 0.5 * border, ww + border, hh + border, + llx + 12 * border, ury, 16 * border, + urx - 12 * border, ury, 16 * border); + + if (!win->modal() || win->resizable()) { + fprintf(outfile, "%.2f %.2f moveto 0 %.2f rlineto\n", + urx - 28 * border, ury, 16 * border); + } + + if (!win->modal() && win->resizable()) { + fprintf(outfile, "%.2f %.2f moveto 0 %.2f rlineto\n", + urx - 44 * border, ury, 16 * border); + } + + fprintf(outfile, "%.2f %.2f moveto %.2f 0 rlineto stroke\n", + llx - 3.5 * border, ury + 0.5 * border, ww + 7 * border); + + // Button icons... + fprintf(outfile, + "%.2f setlinewidth 0 setgray\n" + "%.2f %.2f moveto %.2f -%.2f rlineto %.2f %.2f rlineto\n" + "%.2f %.2f moveto -%.2f -%.2f rlineto 0 %.2f rmoveto %.2f -%.2f rlineto\n", + 2 * border, + llx, ury + 10 * border, 4 * border, 4 * border, 4 * border, 4 * border, + urx, ury + 12 * border, 8 * border, 8 * border, 8 * border, 8 * border, 8 * border); + + float x = urx - 16 * border; + + if (win->resizable()) { + // Maximize button + fprintf(outfile, + "%.2f %.2f moveto -%.2f 0 rlineto 0 -%.2f rlineto " + "%.2f 0 rlineto 0 %.2f rlineto\n", + x, ury + 12 * border, 8 * border, 8 * border, + 8 * border, 8 * border); + + x -= 16 * border; + } + + if (!win->modal()) { + // Minimize button + fprintf(outfile, + "%.2f %.2f moveto -%.2f 0 rlineto\n", + x, ury + 4 * border, 8 * border); + } + + fputs("stroke\n", outfile); + + if (win->label()) { + // Add window title... + fprintf(outfile, + "1 setgray\n" + "/Helvetica-Bold findfont %.2f scalefont setfont\n" + "(%s) %.2f %.2f moveto show\n", + 12 * border, + ps_string(win->label()), llx + 16 * border, ury + 4 * border); + } + + fprintf(outfile, + "gsave\n" + "%.2f %.2f translate %.2f %.2f scale\n", + llx, ury - border, border, border); + + if (output_mode & 2) { + // Grayscale image... + fprintf(outfile, + "/imgdata %d string def\n" + "%d %d 8[1 0 0 -1 0 1] " + "{currentfile imgdata readhexstring pop} image\n", + w, + w, h); + + uchar *ptr = pixels; + int i, count = w * h; + + for (i = 0; i < count; i ++, ptr += 3) { + fprintf(outfile, "%02X", + (31 * ptr[0] + 61 * ptr[1] + 8 * ptr[2]) / 100); + if (!(i % 40)) putc('\n', outfile); + } + } else { + // Color image... + fprintf(outfile, + "/imgdata %d string def\n" + "%d %d 8[1 0 0 -1 0 1] " + "{currentfile imgdata readhexstring pop} false 3 colorimage\n", + w * 3, + w, h); + + uchar *ptr = pixels; + int i, count = w * h; + + for (i = 0; i < count; i ++, ptr += 3) { + fprintf(outfile, "%02X%02X%02X", ptr[0], ptr[1], ptr[2]); + if (!(i % 13)) putc('\n', outfile); + } + } + + fputs("\ngrestore\n", outfile); + + delete[] pixels; + + // Show the page... + fputs("grestore showpage\n", outfile); + } + } + + // Finish up... + fputs("%%EOF\n", outfile); + + if (print_choice->value()) pclose(outfile); + else fclose(outfile); + } else { + // Unable to print... + fl_alert("Error printing: %s", strerror(errno)); + } + + // Hide progress, activate controls, hide print panel... + print_panel_controls->activate(); + print_progress->hide(); + print_panel->hide(); +} +#endif // WIN32 && !__CYGWIN__ + +//////////////////////////////////////////////////////////////// + +extern Fl_Menu_Item New_Menu[]; + +void toggle_widgetbin_cb(Fl_Widget *, void *); +void toggle_sourceview_cb(Fl_Double_Window *, void *); + +Fl_Menu_Item Main_Menu[] = { +{"&File",0,0,0,FL_SUBMENU}, + {"&New...", FL_COMMAND+'n', new_cb, 0}, + {"&Open...", FL_COMMAND+'o', open_cb, 0}, + {"&Insert...", FL_COMMAND+'i', open_cb, (void*)1, FL_MENU_DIVIDER}, +#define SAVE_ITEM 4 + {"&Save", FL_COMMAND+'s', save_cb, 0}, + {"Save &As...", FL_COMMAND+FL_SHIFT+'s', save_cb, (void*)1}, + {"Sa&ve A Copy...", 0, save_cb, (void*)2}, + {"Save &Template...", 0, save_template_cb}, + {"&Revert...", 0, revert_cb, 0, FL_MENU_DIVIDER}, + {"&Print...", FL_COMMAND+'p', print_menu_cb}, + {"Write &Code...", FL_COMMAND+FL_SHIFT+'c', write_cb, 0}, + {"&Write Strings...", FL_COMMAND+FL_SHIFT+'w', write_strings_cb, 0, FL_MENU_DIVIDER}, +#define HISTORY_ITEM 12 + {relative_history[0], FL_COMMAND+'0', open_history_cb, absolute_history[0]}, + {relative_history[1], FL_COMMAND+'1', open_history_cb, absolute_history[1]}, + {relative_history[2], FL_COMMAND+'2', open_history_cb, absolute_history[2]}, + {relative_history[3], FL_COMMAND+'3', open_history_cb, absolute_history[3]}, + {relative_history[4], FL_COMMAND+'4', open_history_cb, absolute_history[4]}, + {relative_history[5], FL_COMMAND+'5', open_history_cb, absolute_history[5]}, + {relative_history[6], FL_COMMAND+'6', open_history_cb, absolute_history[6]}, + {relative_history[7], FL_COMMAND+'7', open_history_cb, absolute_history[7]}, + {relative_history[8], FL_COMMAND+'8', open_history_cb, absolute_history[8]}, + {relative_history[9], FL_COMMAND+'9', open_history_cb, absolute_history[9], FL_MENU_DIVIDER}, + {"&Quit", FL_COMMAND+'q', exit_cb}, + {0}, +{"&Edit",0,0,0,FL_SUBMENU}, + {"&Undo", FL_COMMAND+'z', undo_cb}, + {"&Redo", FL_COMMAND+FL_SHIFT+'z', redo_cb, 0, FL_MENU_DIVIDER}, + {"C&ut", FL_COMMAND+'x', cut_cb}, + {"&Copy", FL_COMMAND+'c', copy_cb}, + {"&Paste", FL_COMMAND+'v', paste_cb}, + {"Dup&licate", FL_COMMAND+'u', duplicate_cb}, + {"&Delete", FL_Delete, delete_cb, 0, FL_MENU_DIVIDER}, + {"Select &All", FL_COMMAND+'a', select_all_cb}, + {"Select &None", FL_COMMAND+FL_SHIFT+'a', select_none_cb, 0, FL_MENU_DIVIDER}, + {"Pr&operties...", FL_F+1, openwidget_cb}, + {"&Sort",0,sort_cb}, + {"&Earlier", FL_F+2, earlier_cb}, + {"&Later", FL_F+3, later_cb}, + {"&Group", FL_F+7, group_cb}, + {"Ung&roup", FL_F+8, ungroup_cb,0, FL_MENU_DIVIDER}, + {"Hide O&verlays",FL_COMMAND+FL_SHIFT+'o',toggle_overlays}, +#define WIDGETBIN_ITEM 41 + {"Show Widget &Bin...",FL_ALT+'b',toggle_widgetbin_cb}, +#define SOURCEVIEW_ITEM 42 + {"Show Source Code...",FL_ALT+FL_SHIFT+'s', (Fl_Callback*)toggle_sourceview_cb, 0, FL_MENU_DIVIDER}, + {"Pro&ject Settings...",FL_ALT+'p',show_project_cb}, + {"GU&I Settings...",FL_ALT+FL_SHIFT+'p',show_settings_cb}, + {0}, +{"&New", 0, 0, (void *)New_Menu, FL_SUBMENU_POINTER}, +{"&Layout",0,0,0,FL_SUBMENU}, + {"&Align",0,0,0,FL_SUBMENU}, + {"&Left",0,(Fl_Callback *)align_widget_cb,(void*)10}, + {"&Center",0,(Fl_Callback *)align_widget_cb,(void*)11}, + {"&Right",0,(Fl_Callback *)align_widget_cb,(void*)12}, + {"&Top",0,(Fl_Callback *)align_widget_cb,(void*)13}, + {"&Middle",0,(Fl_Callback *)align_widget_cb,(void*)14}, + {"&Bottom",0,(Fl_Callback *)align_widget_cb,(void*)15}, + {0}, + {"&Space Evenly",0,0,0,FL_SUBMENU}, + {"&Across",0,(Fl_Callback *)align_widget_cb,(void*)20}, + {"&Down",0,(Fl_Callback *)align_widget_cb,(void*)21}, + {0}, + {"&Make Same Size",0,0,0,FL_SUBMENU}, + {"&Width",0,(Fl_Callback *)align_widget_cb,(void*)30}, + {"&Height",0,(Fl_Callback *)align_widget_cb,(void*)31}, + {"&Both",0,(Fl_Callback *)align_widget_cb,(void*)32}, + {0}, + {"&Center In Group",0,0,0,FL_SUBMENU}, + {"&Horizontal",0,(Fl_Callback *)align_widget_cb,(void*)40}, + {"&Vertical",0,(Fl_Callback *)align_widget_cb,(void*)41}, + {0}, + {"Set &Widget Size",0,0,0,FL_SUBMENU|FL_MENU_DIVIDER}, + {"&Tiny",FL_ALT+'1',(Fl_Callback *)widget_size_cb,(void*)8,0,FL_NORMAL_LABEL,FL_HELVETICA,8}, + {"&Small",FL_ALT+'2',(Fl_Callback *)widget_size_cb,(void*)11,0,FL_NORMAL_LABEL,FL_HELVETICA,11}, + {"&Normal",FL_ALT+'3',(Fl_Callback *)widget_size_cb,(void*)14,0,FL_NORMAL_LABEL,FL_HELVETICA,14}, + {"&Medium",FL_ALT+'4',(Fl_Callback *)widget_size_cb,(void*)18,0,FL_NORMAL_LABEL,FL_HELVETICA,18}, + {"&Large",FL_ALT+'5',(Fl_Callback *)widget_size_cb,(void*)24,0,FL_NORMAL_LABEL,FL_HELVETICA,24}, + {"&Huge",FL_ALT+'6',(Fl_Callback *)widget_size_cb,(void*)32,0,FL_NORMAL_LABEL,FL_HELVETICA,32}, + {0}, + {"&Grid and Size Settings...",FL_COMMAND+'g',show_grid_cb}, + {0}, +{"&Shell",0,0,0,FL_SUBMENU}, + {"Execute &Command...",FL_ALT+'x',(Fl_Callback *)show_shell_window}, + {"Execute &Again...",FL_ALT+'g',(Fl_Callback *)do_shell_command}, + {0}, +{"&Help",0,0,0,FL_SUBMENU}, + {"&About FLUID...",0,about_cb}, + {"&On FLUID...",0,help_cb}, + {"&Manual...",0,manual_cb}, + {0}, +{0}}; + +#define BROWSERWIDTH 300 +#define BROWSERHEIGHT 500 +#define WINWIDTH 300 +#define MENUHEIGHT 25 +#define WINHEIGHT (BROWSERHEIGHT+MENUHEIGHT) + +extern void fill_in_New_Menu(); + +void scheme_cb(Fl_Choice *, void *) { + if (compile_only) + return; + + switch (scheme_choice->value()) { + case 0 : // Default + Fl::scheme(NULL); + break; + case 1 : // None + Fl::scheme("none"); + break; + case 2 : // Plastic + Fl::scheme("plastic"); + break; + case 3 : // GTK+ + Fl::scheme("gtk+"); + break; + } + + fluid_prefs.set("scheme", scheme_choice->value()); +} + +void toggle_widgetbin_cb(Fl_Widget *, void *) { + if (!widgetbin_panel) { + make_widgetbin(); + widgetbin_panel->callback(toggle_widgetbin_cb); + if (!position_window(widgetbin_panel,"widgetbin_pos", 1, 320, 30)) return; + } + + if (widgetbin_panel->visible()) { + widgetbin_panel->hide(); + Main_Menu[WIDGETBIN_ITEM].label("Show Widget &Bin..."); + } else { + widgetbin_panel->show(); + Main_Menu[WIDGETBIN_ITEM].label("Hide Widget &Bin"); + } +} + + +void toggle_sourceview_cb(Fl_Double_Window *, void *) { + if (!sourceview_panel) { + make_sourceview(); + sourceview_panel->callback((Fl_Callback*)toggle_sourceview_cb); + Fl_Preferences svp(fluid_prefs, "sourceview"); + int autorefresh; + svp.get("autorefresh", autorefresh, 1); + sv_autorefresh->value(autorefresh); + int autoposition; + svp.get("autoposition", autoposition, 1); + sv_autoposition->value(autoposition); + int tab; + svp.get("tab", tab, 0); + if (tab>=0 && tabchildren()) sv_tab->value(sv_tab->child(tab)); + if (!position_window(sourceview_panel,"sourceview_pos", 0, 320, 120, 550, 500)) return; + } + + if (sourceview_panel->visible()) { + sourceview_panel->hide(); + Main_Menu[SOURCEVIEW_ITEM].label("Show Source Code..."); + } else { + sourceview_panel->show(); + Main_Menu[SOURCEVIEW_ITEM].label("Hide Source Code..."); + update_sourceview_cb(0,0); + } +} + +void toggle_sourceview_b_cb(Fl_Button*, void *) { + toggle_sourceview_cb(0,0); +} + +void make_main_window() { + fluid_prefs.get("snap", snap, 1); + fluid_prefs.get("gridx", gridx, 5); + fluid_prefs.get("gridy", gridy, 5); + fluid_prefs.get("show_guides", show_guides, 0); + fluid_prefs.get("widget_size", Fl_Widget_Type::default_size, 14); + + load_history(); + + make_layout_window(); + make_settings_window(); + make_shell_window(); + + if (!main_window) { + Fl_Widget *o; + main_window = new Fl_Double_Window(WINWIDTH,WINHEIGHT,"fluid"); + main_window->box(FL_NO_BOX); + o = make_widget_browser(0,MENUHEIGHT,BROWSERWIDTH,BROWSERHEIGHT); + o->box(FL_FLAT_BOX); + o->tooltip("Double-click to view or change an item."); + main_window->resizable(o); + main_menubar = new Fl_Menu_Bar(0,0,BROWSERWIDTH,MENUHEIGHT); + main_menubar->menu(Main_Menu); + main_menubar->global(); + fill_in_New_Menu(); + main_window->end(); + } +} + +// Load file history from preferences... +void load_history() { + int i; // Looping var + int max_files; + + + fluid_prefs.get("recent_files", max_files, 5); + if (max_files > 10) max_files = 10; + + for (i = 0; i < max_files; i ++) { + fluid_prefs.get( Fl_Preferences::Name("file%d", i), absolute_history[i], "", sizeof(absolute_history[i])); + if (absolute_history[i][0]) { + // Make a relative version of the filename for the menu... + fl_filename_relative(relative_history[i], sizeof(relative_history[i]), + absolute_history[i]); + + if (i == 9) Main_Menu[i + HISTORY_ITEM].flags = FL_MENU_DIVIDER; + else Main_Menu[i + HISTORY_ITEM].flags = 0; + } else break; + } + + for (; i < 10; i ++) { + if (i) Main_Menu[i + HISTORY_ITEM - 1].flags |= FL_MENU_DIVIDER; + Main_Menu[i + HISTORY_ITEM].hide(); + } +} + +// Update file history from preferences... +void update_history(const char *flname) { + int i; // Looping var + char absolute[1024]; + int max_files; + + + fluid_prefs.get("recent_files", max_files, 5); + if (max_files > 10) max_files = 10; + + fl_filename_absolute(absolute, sizeof(absolute), flname); + + for (i = 0; i < max_files; i ++) +#if defined(WIN32) || defined(__APPLE__) + if (!strcasecmp(absolute, absolute_history[i])) break; +#else + if (!strcmp(absolute, absolute_history[i])) break; +#endif // WIN32 || __APPLE__ + + if (i == 0) return; + + if (i >= max_files) i = max_files - 1; + + // Move the other flnames down in the list... + memmove(absolute_history + 1, absolute_history, + i * sizeof(absolute_history[0])); + memmove(relative_history + 1, relative_history, + i * sizeof(relative_history[0])); + + // Put the new file at the top... + strlcpy(absolute_history[0], absolute, sizeof(absolute_history[0])); + + fl_filename_relative(relative_history[0], sizeof(relative_history[0]), + absolute_history[0]); + + // Update the menu items as needed... + for (i = 0; i < max_files; i ++) { + fluid_prefs.set( Fl_Preferences::Name("file%d", i), absolute_history[i]); + if (absolute_history[i][0]) { + if (i == 9) Main_Menu[i + HISTORY_ITEM].flags = FL_MENU_DIVIDER; + else Main_Menu[i + HISTORY_ITEM].flags = 0; + } else break; + } + + for (; i < 10; i ++) { + fluid_prefs.set( Fl_Preferences::Name("file%d", i), ""); + if (i) Main_Menu[i + HISTORY_ITEM - 1].flags |= FL_MENU_DIVIDER; + Main_Menu[i + HISTORY_ITEM].hide(); + } +} + +// Shell command support... +#if (!defined(WIN32) || defined(__CYGWIN__)) && !defined(__MWERKS__) +// Support the full piped shell command... +static FILE *shell_pipe = 0; + +void +shell_pipe_cb(int, void*) { + char line[1024]; // Line from command output... + + if (fgets(line, sizeof(line), shell_pipe) != NULL) { + // Add the line to the output list... + shell_run_buffer->append(line); + } else { + // End of file; tell the parent... + Fl::remove_fd(fileno(shell_pipe)); + + pclose(shell_pipe); + shell_pipe = NULL; + shell_run_buffer->append("... END SHELL COMMAND ...\n"); + } + + shell_run_display->scroll(shell_run_display->count_lines(0, + shell_run_buffer->length(), 1), 0); +} + +void +do_shell_command(Fl_Return_Button*, void*) { + const char *command; // Command to run + + + shell_window->hide(); + + if (shell_pipe) { + fl_alert("Previous shell command still running!"); + return; + } + + if ((command = shell_command_input->value()) == NULL || !*command) { + fl_alert("No shell command entered!"); + return; + } + + if (shell_savefl_button->value()) { + save_cb(0, 0); + } + + if (shell_writecode_button->value()) { + compile_only = 1; + write_cb(0, 0); + compile_only = 0; + } + + if (shell_writemsgs_button->value()) { + compile_only = 1; + write_strings_cb(0, 0); + compile_only = 0; + } + + // Show the output window and clear things... + shell_run_buffer->text(""); + shell_run_buffer->append(command); + shell_run_buffer->append("\n"); + shell_run_window->label("Shell Command Running..."); + + if ((shell_pipe = popen((char *)command, "r")) == NULL) { + fl_alert("Unable to run shell command: %s", strerror(errno)); + return; + } + + shell_run_button->deactivate(); + shell_run_window->hotspot(shell_run_display); + shell_run_window->show(); + + Fl::add_fd(fileno(shell_pipe), shell_pipe_cb); + + while (shell_pipe) Fl::wait(); + + shell_run_button->activate(); + shell_run_window->label("Shell Command Complete"); + fl_beep(); + + while (shell_run_window->shown()) Fl::wait(); +} +#else +// Just do basic shell command stuff, no status window... +void +do_shell_command(Fl_Return_Button*, void*) { + const char *command; // Command to run + int status; // Status from command... + + + shell_window->hide(); + + if ((command = shell_command_input->value()) == NULL || !*command) { + fl_alert("No shell command entered!"); + return; + } + + if (shell_savefl_button->value()) { + save_cb(0, 0); + } + + if (shell_writecode_button->value()) { + compile_only = 1; + write_cb(0, 0); + compile_only = 0; + } + + if (shell_writemsgs_button->value()) { + compile_only = 1; + write_strings_cb(0, 0); + compile_only = 0; + } + + if ((status = system(command)) != 0) { + fl_alert("Shell command returned status %d!", status); + } else if (completion_button->value()) { + fl_message("Shell command completed successfully!"); + } +} +#endif // (!WIN32 || __CYGWIN__) && !__MWERKS__ + + +void +show_shell_window() { + shell_window->hotspot(shell_command_input); + shell_window->show(); +} + +void set_filename(const char *c) { + if (filename) free((void *)filename); + filename = c ? strdup(c) : NULL; + + if (filename) update_history(filename); + + set_modflag(modflag); +} + +// +// The Source View system offers an immediate preview of the code +// files that will be generated by FLUID. It also marks the code +// generated for the last selected item in the header and the source +// file. +// +// Can we patent this? ;-) - Matt, mm@matthiasm.com +// + +// +// Update the header and source code highlighting depending on the +// currently selected object +// +void update_sourceview_position() +{ + if (!sourceview_panel || !sourceview_panel->visible()) + return; + if (sv_autoposition->value()==0) + return; + if (sourceview_panel && sourceview_panel->visible() && Fl_Type::current) { + int pos0, pos1; + if (sv_source->visible_r()) { + pos0 = Fl_Type::current->code_line; + pos1 = Fl_Type::current->code_line_end; + if (pos0>=0) { + if (pos1buffer()->highlight(pos0, pos1); + int line = sv_source->buffer()->count_lines(0, pos0); + sv_source->scroll(line, 0); + } + } + if (sv_header->visible_r()) { + pos0 = Fl_Type::current->header_line; + pos1 = Fl_Type::current->header_line_end; + if (pos0>=0) { + if (pos1buffer()->highlight(pos0, pos1); + int line = sv_header->buffer()->count_lines(0, pos0); + sv_header->scroll(line, 0); + } + } + } +} + +void update_sourceview_position_cb(Fl_Tabs*, void*) +{ + update_sourceview_position(); +} + +static char *sv_source_filename = 0; +static char *sv_header_filename = 0; + +// +// Generate a header and source file in a temporary directory and +// load those into the Code Viewer widgets. +// +void update_sourceview_cb(Fl_Button*, void*) +{ + if (!sourceview_panel || !sourceview_panel->visible()) + return; + // generate space for the source and header file filenames + if (!sv_source_filename) { + sv_source_filename = (char*)malloc(FL_PATH_MAX); + fluid_prefs.getUserdataPath(sv_source_filename, FL_PATH_MAX); + strlcat(sv_source_filename, "source_view_tmp.cxx", FL_PATH_MAX); + } + if (!sv_header_filename) { + sv_header_filename = (char*)malloc(FL_PATH_MAX); + fluid_prefs.getUserdataPath(sv_header_filename, FL_PATH_MAX); + strlcat(sv_header_filename, "source_view_tmp.h", FL_PATH_MAX); + } + + strlcpy(i18n_program, fl_filename_name(sv_source_filename), sizeof(i18n_program)); + fl_filename_setext(i18n_program, sizeof(i18n_program), ""); + const char *code_file_name_bak = code_file_name; + code_file_name = sv_source_filename; + const char *header_file_name_bak = header_file_name; + header_file_name = sv_header_filename; + + // generate the code and load the files + write_sourceview = 1; + // generate files + if (write_code(sv_source_filename, sv_header_filename)) + { + // load file into source editor + int pos = sv_source->top_line(); + sv_source->buffer()->loadfile(sv_source_filename); + sv_source->scroll(pos, 0); + // load file into header editor + pos = sv_header->top_line(); + sv_header->buffer()->loadfile(sv_header_filename); + sv_header->scroll(pos, 0); + // update the source code highlighting + update_sourceview_position(); + } + write_sourceview = 0; + + code_file_name = code_file_name_bak; + header_file_name = header_file_name_bak; +} + +void update_sourceview_timer(void*) +{ + update_sourceview_cb(0,0); +} + +// Set the "modified" flag and update the title of the main window... +void set_modflag(int mf) { + const char *basename; + static char title[1024]; + + modflag = mf; + + if (main_window) { + if (!filename) basename = "Untitled.fl"; + else if ((basename = strrchr(filename, '/')) != NULL) basename ++; +#if defined(WIN32) || defined(__EMX__) + else if ((basename = strrchr(filename, '\\')) != NULL) basename ++; +#endif // WIN32 || __EMX__ + else basename = filename; + + if (modflag) { + snprintf(title, sizeof(title), "%s (modified)", basename); + main_window->label(title); + } else main_window->label(basename); + } + // if the UI was modified in any way, update the Source View panel + if (sourceview_panel && sourceview_panel->visible() && sv_autorefresh->value()) + { + // we will only update ealiest 0.5 seconds after the last change, and only + // if no other change was made, so dragging a widget will not generate any + // CPU load + Fl::remove_timeout(update_sourceview_timer, 0); + Fl::add_timeout(0.5, update_sourceview_timer, 0); + } + + // Enable/disable the Save menu item... + if (modflag) Main_Menu[SAVE_ITEM].activate(); + else Main_Menu[SAVE_ITEM].deactivate(); +} + +//////////////////////////////////////////////////////////////// + +static int arg(int argc, char** argv, int& i) { + if (argv[i][1] == 'c' && !argv[i][2]) {compile_only = 1; i++; return 1;} + if (argv[i][1] == 'c' && argv[i][2] == 's' && !argv[i][3]) {compile_only = 1; compile_strings = 1; i++; return 1;} + if (argv[i][1] == 'o' && !argv[i][2] && i+1 < argc) { + code_file_name = argv[i+1]; + code_file_set = 1; + i += 2; + return 2; + } + if (argv[i][1] == 'h' && !argv[i][2]) { + header_file_name = argv[i+1]; + header_file_set = 1; + i += 2; + return 2; + } + return 0; +} + +#if ! (defined(WIN32) && !defined (__CYGWIN__)) + +int quit_flag = 0; +#include +#ifdef _sigargs +#define SIGARG _sigargs +#else +#ifdef __sigargs +#define SIGARG __sigargs +#else +#define SIGARG int // you may need to fix this for older systems +#endif +#endif + +extern "C" { +static void sigint(SIGARG) { + signal(SIGINT,sigint); + quit_flag = 1; +} +} +#endif + +int main(int argc,char **argv) { + int i = 1; + if (!Fl::args(argc,argv,i,arg) || i < argc-1) { + fprintf(stderr,"usage: %s name.fl\n" +" -c : write .cxx and .h and exit\n" +" -cs : write .cxx and .h and strings and exit\n" +" -o : .cxx output filename, or extension if starts with '.'\n" +" -h : .h output filename, or extension if starts with '.'\n" +"%s\n", argv[0], Fl::help); + return 1; + } + const char *c = argv[i]; + + fl_register_images(); + + make_main_window(); + +#ifdef __APPLE__ + fl_open_callback(apple_open_cb); +#endif // __APPLE__ + + if (c) set_filename(c); + if (!compile_only) { + Fl::visual((Fl_Mode)(FL_DOUBLE|FL_INDEX)); + Fl_File_Icon::load_system_icons(); + main_window->callback(exit_cb); + position_window(main_window,"main_window_pos", 1, 10, 30, WINWIDTH, WINHEIGHT ); + main_window->show(argc,argv); + toggle_widgetbin_cb(0,0); + toggle_sourceview_cb(0,0); + if (!c && openlast_button->value() && absolute_history[0][0]) { + // Open previous file when no file specified... + open_history_cb(0, absolute_history[0]); + } + } + undo_suspend(); + if (c && !read_file(c,0)) { + if (compile_only) { + fprintf(stderr,"%s : %s\n", c, strerror(errno)); + exit(1); + } + fl_message("Can't read %s: %s", c, strerror(errno)); + } + undo_resume(); + if (compile_only) { + if (compile_strings) write_strings_cb(0,0); + write_cb(0,0); + exit(0); + } + set_modflag(0); + undo_clear(); +#ifndef WIN32 + signal(SIGINT,sigint); +#endif + + grid_cb(horizontal_input, 0); // Makes sure that windows get snap params... + +#ifdef WIN32 + Fl::run(); +#else + while (!quit_flag) Fl::wait(); + + if (quit_flag) exit_cb(0,0); +#endif // WIN32 + + undo_clear(); + + return (0); +} + +// +// End of "$Id: fluid.cxx 6783 2009-04-27 15:50:29Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/fluid.desktop b/third_party/windows/fltk-1.1.10/fluid/fluid.desktop new file mode 100644 index 0000000..f8241ce --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/fluid.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=FLUID +Comment=FLTK GUI Designer +TryExec=fluid +Exec=cd %D && fluid %F +Icon=fluid +Terminal=false +Type=Application +MimeType=application/x-fluid +Categories=Development;GUIDesigner; diff --git a/third_party/windows/fltk-1.1.10/fluid/function_panel.cxx b/third_party/windows/fltk-1.1.10/fluid/function_panel.cxx new file mode 100644 index 0000000..5e86872 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/function_panel.cxx @@ -0,0 +1,979 @@ +// +// "$Id: function_panel.cxx 6817 2009-07-02 09:42:17Z AlbrechtS $" +// +// Code dialogs for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0110 + +#include "function_panel.h" +#include +#include "Fl_Type.h" +#include "undo.h" +extern class Fl_Pixmap *pixmap[]; +extern class Fl_Type *Fl_Type_make(const char*); +extern void select_only(Fl_Type*); + +Fl_Double_Window *function_panel=(Fl_Double_Window *)0; + +Fl_Choice *f_public_member_choice=(Fl_Choice *)0; + +Fl_Menu_Item menu_f_public_member_choice[] = { + {"private", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"public", 0, 0, (void*)(1), 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"protected", 0, 0, (void*)(2), 0, FL_NORMAL_LABEL, 0, 11, 0}, + {0,0,0,0,0,0,0,0,0} +}; + +Fl_Choice *f_public_choice=(Fl_Choice *)0; + +Fl_Menu_Item menu_f_public_choice[] = { + {"local", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"global", 0, 0, (void*)(1), 0, FL_NORMAL_LABEL, 0, 11, 0}, + {0,0,0,0,0,0,0,0,0} +}; + +Fl_Light_Button *f_c_button=(Fl_Light_Button *)0; + +Fl_Input *f_name_input=(Fl_Input *)0; + +Fl_Input *f_return_type_input=(Fl_Input *)0; + +Fl_Return_Button *f_panel_ok=(Fl_Return_Button *)0; + +Fl_Button *f_panel_cancel=(Fl_Button *)0; + +Fl_Double_Window* make_function_panel() { + { Fl_Double_Window* o = function_panel = new Fl_Double_Window(290, 150, "Function/Method Properties"); + { Fl_Group* o = new Fl_Group(10, 10, 270, 20); + { f_public_member_choice = new Fl_Choice(10, 10, 75, 20); + f_public_member_choice->tooltip("Change member access attribute."); + f_public_member_choice->down_box(FL_BORDER_BOX); + f_public_member_choice->labelsize(11); + f_public_member_choice->textsize(11); + f_public_member_choice->when(FL_WHEN_CHANGED); + f_public_member_choice->menu(menu_f_public_member_choice); + } // Fl_Choice* f_public_member_choice + { f_public_choice = new Fl_Choice(10, 10, 75, 20); + f_public_choice->tooltip("Change widget accessibility."); + f_public_choice->down_box(FL_BORDER_BOX); + f_public_choice->labelsize(11); + f_public_choice->textsize(11); + f_public_choice->when(FL_WHEN_CHANGED); + f_public_choice->menu(menu_f_public_choice); + } // Fl_Choice* f_public_choice + { f_c_button = new Fl_Light_Button(95, 10, 80, 20, "C declaration"); + f_c_button->tooltip("Declare with a C interface instead of C++."); + f_c_button->labelsize(11); + } // Fl_Light_Button* f_c_button + { Fl_Box* o = new Fl_Box(235, 10, 45, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + { f_name_input = new Fl_Input(10, 50, 270, 20, "Name(args): (blank for main())"); + f_name_input->tooltip("The name of the function or method."); + f_name_input->labelfont(1); + f_name_input->labelsize(11); + f_name_input->textfont(4); + f_name_input->textsize(11); + f_name_input->align(FL_ALIGN_TOP_LEFT); + f_name_input->when(FL_WHEN_NEVER); + Fl_Group::current()->resizable(f_name_input); + } // Fl_Input* f_name_input + { f_return_type_input = new Fl_Input(10, 90, 270, 20, "Return Type: (blank to return outermost widget)"); + f_return_type_input->tooltip("The return type of the function or method."); + f_return_type_input->labelfont(1); + f_return_type_input->labelsize(11); + f_return_type_input->textfont(4); + f_return_type_input->textsize(11); + f_return_type_input->align(FL_ALIGN_TOP_LEFT); + f_return_type_input->when(FL_WHEN_NEVER); + } // Fl_Input* f_return_type_input + { Fl_Group* o = new Fl_Group(10, 120, 270, 20); + { f_panel_ok = new Fl_Return_Button(170, 120, 50, 20, "OK"); + f_panel_ok->tooltip("Apply the changes."); + f_panel_ok->labelsize(11); + f_panel_ok->window()->hotspot(f_panel_ok); + } // Fl_Return_Button* f_panel_ok + { f_panel_cancel = new Fl_Button(230, 120, 50, 20, "Cancel"); + f_panel_cancel->tooltip("Cancel the changes."); + f_panel_cancel->shortcut(0xff1b); + f_panel_cancel->labelsize(11); + } // Fl_Button* f_panel_cancel + { Fl_Box* o = new Fl_Box(10, 120, 150, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + o->size_range(o->w(), o->h(), Fl::w(), o->h()); + function_panel->set_modal(); + function_panel->end(); + } // Fl_Double_Window* function_panel + return function_panel; +} + +Fl_Double_Window *code_panel=(Fl_Double_Window *)0; + +CodeEditor *code_input=(CodeEditor *)0; + +Fl_Return_Button *code_panel_ok=(Fl_Return_Button *)0; + +Fl_Button *code_panel_cancel=(Fl_Button *)0; + +Fl_Double_Window* make_code_panel() { + { Fl_Double_Window* o = code_panel = new Fl_Double_Window(540, 180, "Code Properties"); + code_panel->labelsize(11); + { CodeEditor* o = code_input = new CodeEditor(10, 10, 520, 130); + code_input->box(FL_DOWN_BOX); + code_input->color(FL_BACKGROUND2_COLOR); + code_input->selection_color(FL_SELECTION_COLOR); + code_input->labeltype(FL_NORMAL_LABEL); + code_input->labelfont(0); + code_input->labelsize(11); + code_input->labelcolor(FL_FOREGROUND_COLOR); + code_input->textfont(4); + code_input->textsize(11); + code_input->align(FL_ALIGN_TOP); + code_input->when(FL_WHEN_RELEASE); + Fl_Group::current()->resizable(code_input); + o->when(FL_WHEN_ENTER_KEY_CHANGED|FL_WHEN_RELEASE); + } // CodeEditor* code_input + { Fl_Group* o = new Fl_Group(10, 150, 520, 20); + o->labelsize(11); + { code_panel_ok = new Fl_Return_Button(400, 150, 60, 20, "OK"); + code_panel_ok->labelsize(11); + code_panel_ok->window()->hotspot(code_panel_ok); + } // Fl_Return_Button* code_panel_ok + { code_panel_cancel = new Fl_Button(470, 150, 60, 20, "Cancel"); + code_panel_cancel->shortcut(0xff1b); + code_panel_cancel->labelsize(11); + } // Fl_Button* code_panel_cancel + { Fl_Box* o = new Fl_Box(10, 150, 380, 20); + o->labelsize(11); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + o->size_range(200, 150); + code_panel->set_modal(); + code_panel->end(); + } // Fl_Double_Window* code_panel + return code_panel; +} + +Fl_Double_Window *codeblock_panel=(Fl_Double_Window *)0; + +Fl_Input *code_before_input=(Fl_Input *)0; + +Fl_Input *code_after_input=(Fl_Input *)0; + +Fl_Return_Button *codeblock_panel_ok=(Fl_Return_Button *)0; + +Fl_Button *codeblock_panel_cancel=(Fl_Button *)0; + +Fl_Double_Window* make_codeblock_panel() { + { Fl_Double_Window* o = codeblock_panel = new Fl_Double_Window(300, 115, "Code Block Properties"); + codeblock_panel->labelsize(11); + { code_before_input = new Fl_Input(10, 15, 280, 20, "Conditional code block"); + code_before_input->tooltip("#ifdef or similar conditional code block."); + code_before_input->labelsize(11); + code_before_input->textfont(4); + code_before_input->textsize(11); + code_before_input->align(FL_ALIGN_TOP_LEFT); + code_before_input->when(FL_WHEN_NEVER); + } // Fl_Input* code_before_input + { code_after_input = new Fl_Input(10, 55, 280, 20, "\"{...child code...}\" is inserted here"); + code_after_input->tooltip("#endif or similar conditional code block."); + code_after_input->labelsize(11); + code_after_input->textfont(4); + code_after_input->textsize(11); + code_after_input->align(FL_ALIGN_TOP_LEFT); + code_after_input->when(FL_WHEN_NEVER); + Fl_Group::current()->resizable(code_after_input); + } // Fl_Input* code_after_input + { Fl_Group* o = new Fl_Group(10, 85, 280, 20); + { codeblock_panel_ok = new Fl_Return_Button(160, 85, 60, 20, "OK"); + codeblock_panel_ok->labelsize(11); + codeblock_panel_ok->window()->hotspot(codeblock_panel_ok); + } // Fl_Return_Button* codeblock_panel_ok + { codeblock_panel_cancel = new Fl_Button(230, 85, 60, 20, "Cancel"); + codeblock_panel_cancel->shortcut(0xff1b); + codeblock_panel_cancel->labelsize(11); + } // Fl_Button* codeblock_panel_cancel + { Fl_Box* o = new Fl_Box(10, 85, 140, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + o->size_range(o->w(), o->h(), Fl::w(), o->h()); + codeblock_panel->set_modal(); + codeblock_panel->end(); + } // Fl_Double_Window* codeblock_panel + return codeblock_panel; +} + +Fl_Double_Window *declblock_panel=(Fl_Double_Window *)0; + +Fl_Choice *declblock_public_choice=(Fl_Choice *)0; + +Fl_Menu_Item menu_declblock_public_choice[] = { + {"in source code only", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"in header and source", 0, 0, (void*)(1), 0, FL_NORMAL_LABEL, 0, 11, 0}, + {0,0,0,0,0,0,0,0,0} +}; + +Fl_Light_Button *declblock_public_button_x=(Fl_Light_Button *)0; + +Fl_Input *decl_before_input=(Fl_Input *)0; + +Fl_Input *decl_after_input=(Fl_Input *)0; + +Fl_Return_Button *declblock_panel_ok=(Fl_Return_Button *)0; + +Fl_Button *declblock_panel_cancel=(Fl_Button *)0; + +Fl_Double_Window* make_declblock_panel() { + { Fl_Double_Window* o = declblock_panel = new Fl_Double_Window(300, 135, "Declaration Block Properties"); + declblock_panel->labelsize(11); + { Fl_Group* o = new Fl_Group(10, 10, 280, 20); + { declblock_public_choice = new Fl_Choice(10, 10, 140, 20); + declblock_public_choice->tooltip("Change widget accessibility."); + declblock_public_choice->down_box(FL_BORDER_BOX); + declblock_public_choice->labelsize(11); + declblock_public_choice->textsize(11); + declblock_public_choice->when(FL_WHEN_NEVER); + declblock_public_choice->menu(menu_declblock_public_choice); + } // Fl_Choice* declblock_public_choice + { declblock_public_button_x = new Fl_Light_Button(10, 10, 60, 20, "public"); + declblock_public_button_x->tooltip("Make the declaration publicly accessible."); + declblock_public_button_x->labelsize(11); + declblock_public_button_x->when(FL_WHEN_NEVER); + declblock_public_button_x->hide(); + } // Fl_Light_Button* declblock_public_button_x + { Fl_Box* o = new Fl_Box(155, 10, 135, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + { decl_before_input = new Fl_Input(10, 40, 280, 20); + decl_before_input->tooltip("#ifdef or similar conditional declaration block."); + decl_before_input->labelsize(11); + decl_before_input->textfont(4); + decl_before_input->textsize(11); + decl_before_input->align(FL_ALIGN_TOP_LEFT); + decl_before_input->when(FL_WHEN_NEVER); + Fl_Group::current()->resizable(decl_before_input); + } // Fl_Input* decl_before_input + { decl_after_input = new Fl_Input(10, 75, 280, 20, "\"\\n...child code...\\n\" is inserted here"); + decl_after_input->tooltip("#endif or similar declaration code block."); + decl_after_input->labelsize(11); + decl_after_input->textfont(4); + decl_after_input->textsize(11); + decl_after_input->align(FL_ALIGN_TOP_LEFT); + decl_after_input->when(FL_WHEN_NEVER); + } // Fl_Input* decl_after_input + { Fl_Group* o = new Fl_Group(10, 105, 280, 20); + { declblock_panel_ok = new Fl_Return_Button(160, 105, 60, 20, "OK"); + declblock_panel_ok->labelsize(11); + declblock_panel_ok->window()->hotspot(declblock_panel_ok); + } // Fl_Return_Button* declblock_panel_ok + { declblock_panel_cancel = new Fl_Button(230, 105, 60, 20, "Cancel"); + declblock_panel_cancel->shortcut(0xff1b); + declblock_panel_cancel->labelsize(11); + } // Fl_Button* declblock_panel_cancel + { Fl_Box* o = new Fl_Box(10, 105, 140, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + o->size_range(o->w(), o->h(), Fl::w(), o->h()); + declblock_panel->set_modal(); + declblock_panel->end(); + } // Fl_Double_Window* declblock_panel + return declblock_panel; +} + +Fl_Double_Window *decl_panel=(Fl_Double_Window *)0; + +Fl_Choice *decl_choice=(Fl_Choice *)0; + +Fl_Menu_Item menu_decl_choice[] = { + {"in source file only", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"in header file only", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"\"static\" in source file", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"in source and \"extern\" in header", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0}, + {0,0,0,0,0,0,0,0,0} +}; + +Fl_Choice *decl_class_choice=(Fl_Choice *)0; + +Fl_Menu_Item menu_decl_class_choice[] = { + {"private", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"public", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"protected", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 11, 0}, + {0,0,0,0,0,0,0,0,0} +}; + +Fl_Input *decl_input=(Fl_Input *)0; + +Fl_Return_Button *decl_panel_ok=(Fl_Return_Button *)0; + +Fl_Button *decl_panel_cancel=(Fl_Button *)0; + +Fl_Double_Window* make_decl_panel() { + { Fl_Double_Window* o = decl_panel = new Fl_Double_Window(290, 150, "Declaration Properties"); + decl_panel->align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE); + { Fl_Group* o = new Fl_Group(10, 10, 270, 20); + { Fl_Box* o = new Fl_Box(200, 10, 80, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + { decl_choice = new Fl_Choice(10, 10, 185, 20); + decl_choice->down_box(FL_BORDER_BOX); + decl_choice->labelsize(11); + decl_choice->textsize(11); + decl_choice->menu(menu_decl_choice); + } // Fl_Choice* decl_choice + { decl_class_choice = new Fl_Choice(10, 10, 75, 20); + decl_class_choice->down_box(FL_BORDER_BOX); + decl_class_choice->labelsize(11); + decl_class_choice->textsize(11); + decl_class_choice->menu(menu_decl_class_choice); + } // Fl_Choice* decl_class_choice + o->end(); + } // Fl_Group* o + { decl_input = new Fl_Input(10, 40, 270, 20, "Can be any declaration, like \"int x;\", an external symbol like \"extern int\ + foo();\", a #directive like \"#include \", a comment like \"//foo\" or\ + \"/*foo*/\", or typedef like \"typedef char byte;\" or \"using std::list;\"."); + decl_input->tooltip("Declaration text."); + decl_input->labelsize(11); + decl_input->textfont(4); + decl_input->textsize(11); + decl_input->align(134); + decl_input->when(FL_WHEN_NEVER); + Fl_Group::current()->resizable(decl_input); + } // Fl_Input* decl_input + { Fl_Group* o = new Fl_Group(10, 120, 270, 20); + { decl_panel_ok = new Fl_Return_Button(150, 120, 60, 20, "OK"); + decl_panel_ok->labelsize(11); + decl_panel_ok->window()->hotspot(decl_panel_ok); + } // Fl_Return_Button* decl_panel_ok + { decl_panel_cancel = new Fl_Button(220, 120, 60, 20, "Cancel"); + decl_panel_cancel->shortcut(0xff1b); + decl_panel_cancel->labelsize(11); + } // Fl_Button* decl_panel_cancel + { Fl_Box* o = new Fl_Box(10, 120, 130, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + o->size_range(o->w(), o->h(), Fl::w(), o->h()); + decl_panel->end(); + } // Fl_Double_Window* decl_panel + return decl_panel; +} + +Fl_Double_Window *class_panel=(Fl_Double_Window *)0; + +Fl_Light_Button *c_public_button=(Fl_Light_Button *)0; + +Fl_Input *c_name_input=(Fl_Input *)0; + +Fl_Input *c_subclass_input=(Fl_Input *)0; + +Fl_Return_Button *c_panel_ok=(Fl_Return_Button *)0; + +Fl_Button *c_panel_cancel=(Fl_Button *)0; + +Fl_Double_Window* make_class_panel() { + { Fl_Double_Window* o = class_panel = new Fl_Double_Window(300, 115, "Class Properties"); + class_panel->labelsize(11); + { Fl_Group* o = new Fl_Group(10, 10, 280, 20); + o->hide(); + { c_public_button = new Fl_Light_Button(10, 10, 60, 20, "public"); + c_public_button->tooltip("Make the class publicly accessible."); + c_public_button->labelsize(11); + c_public_button->when(FL_WHEN_NEVER); + c_public_button->hide(); + } // Fl_Light_Button* c_public_button + { Fl_Box* o = new Fl_Box(80, 10, 210, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + { c_name_input = new Fl_Input(10, 20, 280, 20, "Name:"); + c_name_input->tooltip("Name of class."); + c_name_input->labelfont(1); + c_name_input->labelsize(11); + c_name_input->textfont(4); + c_name_input->textsize(11); + c_name_input->align(FL_ALIGN_TOP_LEFT); + c_name_input->when(FL_WHEN_NEVER); + Fl_Group::current()->resizable(c_name_input); + } // Fl_Input* c_name_input + { c_subclass_input = new Fl_Input(10, 55, 280, 20, "Subclass of (text between : and {)"); + c_subclass_input->tooltip("Name of subclass."); + c_subclass_input->labelfont(1); + c_subclass_input->labelsize(11); + c_subclass_input->textfont(4); + c_subclass_input->textsize(11); + c_subclass_input->align(FL_ALIGN_TOP_LEFT); + c_subclass_input->when(FL_WHEN_NEVER); + } // Fl_Input* c_subclass_input + { Fl_Group* o = new Fl_Group(10, 85, 280, 20); + { c_panel_ok = new Fl_Return_Button(160, 85, 60, 20, "OK"); + c_panel_ok->labelsize(11); + c_panel_ok->window()->hotspot(c_panel_ok); + } // Fl_Return_Button* c_panel_ok + { c_panel_cancel = new Fl_Button(230, 85, 60, 20, "Cancel"); + c_panel_cancel->shortcut(0xff1b); + c_panel_cancel->labelsize(11); + } // Fl_Button* c_panel_cancel + { Fl_Box* o = new Fl_Box(10, 85, 140, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + o->size_range(o->w(), o->h(), Fl::w(), o->h()); + class_panel->set_modal(); + class_panel->end(); + } // Fl_Double_Window* class_panel + return class_panel; +} + +Fl_Double_Window *comment_panel=(Fl_Double_Window *)0; + +CodeEditor *comment_input=(CodeEditor *)0; + +Fl_Return_Button *comment_panel_ok=(Fl_Return_Button *)0; + +Fl_Button *comment_panel_cancel=(Fl_Button *)0; + +Fl_Light_Button *comment_in_source=(Fl_Light_Button *)0; + +Fl_Light_Button *comment_in_header=(Fl_Light_Button *)0; + +Fl_Menu_Button *comment_predefined=(Fl_Menu_Button *)0; + +Fl_Button *comment_load=(Fl_Button *)0; + +Fl_Double_Window* make_comment_panel() { + { Fl_Double_Window* o = comment_panel = new Fl_Double_Window(550, 280, "Comment Properties"); + comment_panel->labelsize(11); + { CodeEditor* o = comment_input = new CodeEditor(110, 10, 430, 230); + comment_input->box(FL_DOWN_BOX); + comment_input->color(FL_BACKGROUND2_COLOR); + comment_input->selection_color(FL_SELECTION_COLOR); + comment_input->labeltype(FL_NORMAL_LABEL); + comment_input->labelfont(0); + comment_input->labelsize(11); + comment_input->labelcolor(FL_FOREGROUND_COLOR); + comment_input->textfont(4); + comment_input->textsize(11); + comment_input->align(FL_ALIGN_TOP); + comment_input->when(FL_WHEN_RELEASE); + Fl_Group::current()->resizable(comment_input); + o->when(FL_WHEN_ENTER_KEY_CHANGED|FL_WHEN_RELEASE); + } // CodeEditor* comment_input + { Fl_Group* o = new Fl_Group(110, 250, 430, 20); + o->labelsize(11); + { comment_panel_ok = new Fl_Return_Button(370, 250, 80, 20, "OK"); + comment_panel_ok->labelsize(11); + comment_panel_ok->window()->hotspot(comment_panel_ok); + } // Fl_Return_Button* comment_panel_ok + { comment_panel_cancel = new Fl_Button(460, 250, 80, 20, "Cancel"); + comment_panel_cancel->shortcut(0xff1b); + comment_panel_cancel->labelsize(11); + } // Fl_Button* comment_panel_cancel + { Fl_Box* o = new Fl_Box(110, 250, 250, 20); + o->labelsize(11); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(10, 10, 90, 243); + o->labelsize(11); + { comment_in_source = new Fl_Light_Button(10, 10, 90, 20, "In Source"); + comment_in_source->tooltip("Put the comment into the source (.cxx) file."); + comment_in_source->labelsize(11); + comment_in_source->when(FL_WHEN_NEVER); + } // Fl_Light_Button* comment_in_source + { comment_in_header = new Fl_Light_Button(10, 40, 90, 20, "In Header"); + comment_in_header->tooltip("Put the comment into the header (.h) file."); + comment_in_header->labelsize(11); + comment_in_header->when(FL_WHEN_NEVER); + } // Fl_Light_Button* comment_in_header + { comment_predefined = new Fl_Menu_Button(10, 70, 90, 20, "Predefined"); + comment_predefined->labelsize(11); + comment_predefined->textsize(11); + } // Fl_Menu_Button* comment_predefined + { comment_load = new Fl_Button(10, 100, 90, 20, "Import..."); + comment_load->labelsize(11); + } // Fl_Button* comment_load + { Fl_Box* o = new Fl_Box(10, 132, 90, 121); + o->labelsize(11); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + o->size_range(320, 180); + comment_panel->set_modal(); + comment_panel->end(); + } // Fl_Double_Window* comment_panel + return comment_panel; +} + +void type_make_cb(Fl_Widget*,void*d) { + undo_checkpoint(); + Fl_Type *t = Fl_Type_make((char*)d); + if (t) { + select_only(t); + set_modflag(1); + t->open(); + } else { + undo_current --; + undo_last --; + } +} + +Fl_Window *widgetbin_panel=(Fl_Window *)0; + +Fl_Window* make_widgetbin() { + { widgetbin_panel = new Fl_Window(550, 85, "Widget Bin"); + widgetbin_panel->align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE); + { Fl_Group* o = new Fl_Group(3, 3, 79, 79); + { Fl_Button* o = new Fl_Button(5, 5, 24, 24); + o->tooltip("Function"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Function")); + o->image(pixmap[7]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(30, 5, 24, 24); + o->tooltip("Class"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Class")); + o->image(pixmap[12]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(55, 5, 24, 24); + o->tooltip("Comment"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("comment")); + o->image(pixmap[46]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(5, 30, 24, 24); + o->tooltip("Code"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Code")); + o->image(pixmap[8]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(30, 30, 24, 24); + o->tooltip("Code Block"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("CodeBlock")); + o->image(pixmap[9]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(55, 30, 24, 24); + o->tooltip("Widget Class"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("widget_class")); + o->image(pixmap[48]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(5, 55, 24, 24); + o->tooltip("Declaration"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("decl")); + o->image(pixmap[10]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(30, 55, 24, 24); + o->tooltip("Declaration Block"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("declblock")); + o->image(pixmap[11]); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(87, 3, 79, 79); + { Fl_Button* o = new Fl_Button(89, 5, 24, 24); + o->tooltip("Window"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Window")); + o->image(pixmap[1]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(114, 5, 24, 24); + o->tooltip("Group"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Group")); + o->image(pixmap[6]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(139, 5, 24, 24); + o->tooltip("Pack"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Pack")); + o->image(pixmap[22]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(89, 30, 24, 24); + o->tooltip("Tabs"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Tabs")); + o->image(pixmap[13]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(114, 30, 24, 24); + o->tooltip("Scroll"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Scroll")); + o->image(pixmap[19]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(89, 55, 24, 24); + o->tooltip("Tile"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Tile")); + o->image(pixmap[20]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(114, 55, 24, 24); + o->tooltip("Wizard"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Wizard")); + o->image(pixmap[21]); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(171, 3, 54, 79); + { Fl_Button* o = new Fl_Button(173, 5, 24, 24); + o->tooltip("Button"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Button")); + o->image(pixmap[2]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(198, 5, 24, 24); + o->tooltip("Return Button"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Return_Button")); + o->image(pixmap[23]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(173, 30, 24, 24); + o->tooltip("Light Button"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Light_Button")); + o->image(pixmap[24]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(198, 30, 24, 24); + o->tooltip("Repeat Button"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Repeat_Button")); + o->image(pixmap[25]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(173, 55, 24, 24); + o->tooltip("Check Button"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Check_Button")); + o->image(pixmap[3]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(198, 55, 24, 24); + o->tooltip("Round Button"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Round_Button")); + o->image(pixmap[4]); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(230, 3, 104, 79); + { Fl_Button* o = new Fl_Button(232, 5, 24, 24); + o->tooltip("Slider"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Slider")); + o->image(pixmap[37]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(257, 5, 24, 24); + o->tooltip("Scroll Bar"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Scrollbar")); + o->image(pixmap[38]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(282, 5, 24, 24); + o->tooltip("Value Slider"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Value_Slider")); + o->image(pixmap[39]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(307, 5, 24, 24); + o->tooltip("Value Output"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Value_Output")); + o->image(pixmap[45]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(232, 30, 24, 24); + o->tooltip("Adjuster"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Adjuster")); + o->image(pixmap[40]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(257, 30, 24, 24); + o->tooltip("Counter"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Counter")); + o->image(pixmap[41]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(282, 30, 24, 24); + o->tooltip("Dial"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Dial")); + o->image(pixmap[42]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(232, 55, 24, 24); + o->tooltip("Roller"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Roller")); + o->image(pixmap[43]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(257, 55, 24, 24); + o->tooltip("Spinner"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Spinner")); + o->image(pixmap[47]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(282, 55, 24, 24); + o->tooltip("Value Input"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Value_Input")); + o->image(pixmap[44]); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(339, 3, 54, 79); + { Fl_Button* o = new Fl_Button(341, 5, 24, 24); + o->tooltip("Input"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Input")); + o->image(pixmap[14]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(366, 5, 24, 24); + o->tooltip("Output"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Output")); + o->image(pixmap[27]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(341, 30, 24, 24); + o->tooltip("Text Edit"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Text_Editor")); + o->image(pixmap[29]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(366, 30, 24, 24); + o->tooltip("Text Display"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Text_Display")); + o->image(pixmap[28]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(341, 55, 24, 24); + o->tooltip("File Input"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_File_Input")); + o->image(pixmap[30]); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(398, 3, 54, 79); + { Fl_Button* o = new Fl_Button(400, 5, 24, 24); + o->tooltip("Menu Bar"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Menu_Bar")); + o->image(pixmap[17]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(425, 5, 24, 24); + o->tooltip("Input Choice"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Input_Choice")); + o->image(pixmap[15]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(400, 30, 24, 24); + o->tooltip("Menu Button"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Menu_Button")); + o->image(pixmap[26]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(425, 30, 24, 24); + o->tooltip("Menu Item"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("menuitem")); + o->image(pixmap[16]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(400, 55, 24, 24); + o->tooltip("Choice"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Choice")); + o->image(pixmap[15]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(425, 55, 24, 24); + o->tooltip("Sub Menu"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("submenu")); + o->image(pixmap[18]); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(457, 3, 29, 79); + { Fl_Button* o = new Fl_Button(459, 5, 24, 24); + o->tooltip("Browser"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Browser")); + o->image(pixmap[31]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(459, 30, 24, 24); + o->tooltip("Check Browser"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Check_Browser")); + o->image(pixmap[32]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(459, 55, 24, 24); + o->tooltip("File Browser"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_File_Browser")); + o->image(pixmap[33]); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(491, 3, 55, 79); + { Fl_Button* o = new Fl_Button(493, 5, 24, 24); + o->tooltip("Box"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Box")); + o->image(pixmap[5]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(518, 5, 24, 24); + o->tooltip("Clock"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Clock")); + o->image(pixmap[34]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(493, 30, 24, 24); + o->tooltip("Help Browser"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Help_View")); + o->image(pixmap[35]); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(493, 55, 24, 24); + o->tooltip("Progress"); + o->box(FL_THIN_UP_BOX); + o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Progress")); + o->image(pixmap[36]); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + widgetbin_panel->set_non_modal(); + widgetbin_panel->end(); + } // Fl_Window* widgetbin_panel + return widgetbin_panel; +} + +Fl_Double_Window *sourceview_panel=(Fl_Double_Window *)0; + +Fl_Tabs *sv_tab=(Fl_Tabs *)0; + +CodeViewer *sv_source=(CodeViewer *)0; + +CodeViewer *sv_header=(CodeViewer *)0; + +Fl_Light_Button *sv_autorefresh=(Fl_Light_Button *)0; + +Fl_Light_Button *sv_autoposition=(Fl_Light_Button *)0; + +Fl_Double_Window* make_sourceview() { + { sourceview_panel = new Fl_Double_Window(520, 490, "Code View"); + sourceview_panel->callback((Fl_Callback*)toggle_sourceview_cb); + sourceview_panel->align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE); + { sv_tab = new Fl_Tabs(10, 10, 500, 440); + sv_tab->selection_color((Fl_Color)4); + sv_tab->labelcolor(FL_BACKGROUND2_COLOR); + sv_tab->callback((Fl_Callback*)update_sourceview_position_cb); + { Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Source"); + o->labelsize(13); + o->hide(); + { sv_source = new CodeViewer(20, 50, 480, 390); + sv_source->box(FL_DOWN_FRAME); + sv_source->color(FL_BACKGROUND2_COLOR); + sv_source->selection_color(FL_SELECTION_COLOR); + sv_source->labeltype(FL_NORMAL_LABEL); + sv_source->labelfont(0); + sv_source->labelsize(14); + sv_source->labelcolor(FL_FOREGROUND_COLOR); + sv_source->textfont(4); + sv_source->textsize(11); + sv_source->align(FL_ALIGN_TOP); + sv_source->when(FL_WHEN_RELEASE); + Fl_Group::current()->resizable(sv_source); + } // CodeViewer* sv_source + o->end(); + Fl_Group::current()->resizable(o); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(10, 35, 500, 415, "Header"); + o->labelsize(13); + { sv_header = new CodeViewer(20, 50, 480, 390); + sv_header->box(FL_DOWN_FRAME); + sv_header->color(FL_BACKGROUND2_COLOR); + sv_header->selection_color(FL_SELECTION_COLOR); + sv_header->labeltype(FL_NORMAL_LABEL); + sv_header->labelfont(0); + sv_header->labelsize(14); + sv_header->labelcolor(FL_FOREGROUND_COLOR); + sv_header->textfont(4); + sv_header->textsize(11); + sv_header->align(FL_ALIGN_TOP); + sv_header->when(FL_WHEN_RELEASE); + Fl_Group::current()->resizable(sv_header); + } // CodeViewer* sv_header + o->end(); + } // Fl_Group* o + sv_tab->end(); + Fl_Group::current()->resizable(sv_tab); + } // Fl_Tabs* sv_tab + { Fl_Group* o = new Fl_Group(10, 460, 500, 20); + { Fl_Button* o = new Fl_Button(10, 460, 61, 20, "Refresh"); + o->labelsize(11); + o->callback((Fl_Callback*)update_sourceview_cb); + } // Fl_Button* o + { Fl_Light_Button* o = sv_autorefresh = new Fl_Light_Button(76, 460, 91, 20, "Auto-Refresh"); + sv_autorefresh->labelsize(11); + o->callback((Fl_Callback*)update_sourceview_cb); + } // Fl_Light_Button* sv_autorefresh + { sv_autoposition = new Fl_Light_Button(172, 460, 89, 20, "Auto-Position"); + sv_autoposition->labelsize(11); + } // Fl_Light_Button* sv_autoposition + { Fl_Button* o = new Fl_Button(460, 460, 50, 20, "Close"); + o->labelsize(11); + o->callback((Fl_Callback*)toggle_sourceview_b_cb); + } // Fl_Button* o + { Fl_Box* o = new Fl_Box(265, 460, 190, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + sourceview_panel->size_range(384, 120); + sourceview_panel->end(); + } // Fl_Double_Window* sourceview_panel + return sourceview_panel; +} + +// +// End of "$Id: function_panel.cxx 6817 2009-07-02 09:42:17Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/function_panel.fl b/third_party/windows/fltk-1.1.10/fluid/function_panel.fl new file mode 100644 index 0000000..c9483f3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/function_panel.fl @@ -0,0 +1,819 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0108 +header_name {.h} +code_name {.cxx} +comment {// +// "$Id: function_panel.fl 6012 2008-01-04 21:45:49Z matt $" +// +// Code dialogs for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +} {in_source in_header +} + +decl {\#include } {} + +decl {\#include "Fl_Type.h"} {} + +decl {\#include "undo.h"} {} + +decl {extern class Fl_Pixmap *pixmap[];} {} + +decl {extern class Fl_Type *Fl_Type_make(const char*);} {} + +decl {extern void select_only(Fl_Type*);} {} + +Function {make_function_panel()} {} { + Fl_Window function_panel { + label {Function/Method Properties} open + xywh {412 442 290 150} type Double resizable + code0 {o->size_range(o->w(), o->h(), Fl::w(), o->h());} modal visible + } { + Fl_Group {} {open + xywh {10 10 270 20} + } { + Fl_Choice f_public_member_choice { + tooltip {Change member access attribute.} xywh {10 10 75 20} down_box BORDER_BOX labelsize 11 when 1 textsize 11 + } { + MenuItem {} { + label private + user_data 0 user_data_type long + xywh {5 5 100 20} labelsize 11 + } + MenuItem {} { + label public + user_data 1 user_data_type long + xywh {5 5 100 20} labelsize 11 + } + MenuItem {} { + label protected + user_data 2 user_data_type long + xywh {5 5 100 20} labelsize 11 + } + } + Fl_Choice f_public_choice { + tooltip {Change widget accessibility.} xywh {10 10 75 20} down_box BORDER_BOX labelsize 11 when 1 textsize 11 + } { + MenuItem {} { + label local + user_data 0 user_data_type long + xywh {15 15 100 20} labelsize 11 + } + MenuItem {} { + label global + user_data 1 user_data_type long + xywh {15 15 100 20} labelsize 11 + } + } + Fl_Light_Button f_c_button { + label {C declaration} + tooltip {Declare with a C interface instead of C++.} xywh {95 10 80 20} labelsize 11 + } + Fl_Box {} { + xywh {235 10 45 20} resizable + } + } + Fl_Input f_name_input { + label {Name(args): (blank for main())} + tooltip {The name of the function or method.} xywh {10 50 270 20} labelfont 1 labelsize 11 align 5 when 0 textfont 4 textsize 11 resizable + } + Fl_Input f_return_type_input { + label {Return Type: (blank to return outermost widget)} + tooltip {The return type of the function or method.} xywh {10 90 270 20} labelfont 1 labelsize 11 align 5 when 0 textfont 4 textsize 11 + } + Fl_Group {} { + xywh {10 120 270 20} + } { + Fl_Return_Button f_panel_ok { + label OK + tooltip {Apply the changes.} xywh {170 120 50 20} labelsize 11 hotspot + } + Fl_Button f_panel_cancel { + label Cancel + tooltip {Cancel the changes.} xywh {230 120 50 20} shortcut 0xff1b labelsize 11 + } + Fl_Box {} { + xywh {10 120 150 20} resizable + } + } + } +} + +Function {make_code_panel()} {} { + Fl_Window code_panel { + label {Code Properties} + xywh {353 262 540 180} type Double labelsize 11 resizable + code0 {o->size_range(200, 150);} modal visible + } { + Fl_Text_Editor code_input { + xywh {10 10 520 130} box DOWN_BOX labelsize 11 textfont 4 textsize 11 resizable + code0 {o->when(FL_WHEN_ENTER_KEY_CHANGED|FL_WHEN_RELEASE);} + code1 {\#include "CodeEditor.h"} + class CodeEditor + } + Fl_Group {} {open + xywh {10 150 520 20} labelsize 11 + } { + Fl_Return_Button code_panel_ok { + label OK + xywh {400 150 60 20} labelsize 11 hotspot + } + Fl_Button code_panel_cancel { + label Cancel + xywh {470 150 60 20} shortcut 0xff1b labelsize 11 + } + Fl_Box {} { + xywh {10 150 380 20} labelsize 11 resizable + } + } + } +} + +Function {make_codeblock_panel()} {} { + Fl_Window codeblock_panel { + label {Code Block Properties} + xywh {468 221 300 115} type Double labelsize 11 resizable + code0 {o->size_range(o->w(), o->h(), Fl::w(), o->h());} modal visible + } { + Fl_Input code_before_input { + label {Conditional code block} + tooltip {\#ifdef or similar conditional code block.} xywh {10 15 280 20} labelsize 11 align 5 when 0 textfont 4 textsize 11 + } + Fl_Input code_after_input { + label {"{...child code...}" is inserted here} + tooltip {\#endif or similar conditional code block.} xywh {10 55 280 20} labelsize 11 align 5 when 0 textfont 4 textsize 11 resizable + } + Fl_Group {} {open + xywh {10 85 280 20} + } { + Fl_Return_Button codeblock_panel_ok { + label OK + xywh {160 85 60 20} labelsize 11 hotspot + } + Fl_Button codeblock_panel_cancel { + label Cancel + xywh {230 85 60 20} shortcut 0xff1b labelsize 11 + } + Fl_Box {} { + xywh {10 85 140 20} resizable + } + } + } +} + +Function {make_declblock_panel()} {} { + Fl_Window declblock_panel { + label {Declaration Block Properties} open + xywh {428 215 300 135} type Double labelsize 11 resizable + code0 {o->size_range(o->w(), o->h(), Fl::w(), o->h());} modal visible + } { + Fl_Group {} {open + xywh {10 10 280 20} + } { + Fl_Choice declblock_public_choice {open + tooltip {Change widget accessibility.} xywh {10 10 140 20} down_box BORDER_BOX labelsize 11 when 0 textsize 11 + } { + MenuItem {} { + label {in source code only} + user_data 0 user_data_type long + xywh {25 25 100 20} labelsize 11 + } + MenuItem {} { + label {in header and source} + user_data 1 user_data_type long + xywh {25 25 100 20} labelsize 11 + } + } + Fl_Light_Button declblock_public_button_x { + label public + tooltip {Make the declaration publicly accessible.} xywh {10 10 60 20} labelsize 11 when 0 hide + } + Fl_Box {} { + xywh {155 10 135 20} resizable + } + } + Fl_Input decl_before_input { + tooltip {\#ifdef or similar conditional declaration block.} xywh {10 40 280 20} labelsize 11 align 5 when 0 textfont 4 textsize 11 resizable + } + Fl_Input decl_after_input { + label {"\\n...child code...\\n" is inserted here} + tooltip {\#endif or similar declaration code block.} xywh {10 75 280 20} labelsize 11 align 5 when 0 textfont 4 textsize 11 + } + Fl_Group {} { + xywh {10 105 280 20} + } { + Fl_Return_Button declblock_panel_ok { + label OK + xywh {160 105 60 20} labelsize 11 hotspot + } + Fl_Button declblock_panel_cancel { + label Cancel + xywh {230 105 60 20} shortcut 0xff1b labelsize 11 + } + Fl_Box {} { + xywh {10 105 140 20} resizable + } + } + } +} + +Function {make_decl_panel()} {selected +} { + Fl_Window decl_panel { + label {Declaration Properties} open + xywh {501 185 290 150} type Double align 80 resizable + code0 {o->size_range(o->w(), o->h(), Fl::w(), o->h());} visible + } { + Fl_Group {} {open + xywh {10 10 270 20} + } { + Fl_Box {} { + xywh {200 10 80 20} resizable + } + Fl_Choice decl_choice { + xywh {10 10 185 20} down_box BORDER_BOX labelsize 11 textsize 11 + } { + MenuItem {} { + label {in source file only} + xywh {0 0 100 20} labelsize 11 + } + MenuItem {} { + label {in header file only} + xywh {0 0 100 20} labelsize 11 + } + MenuItem {} { + label {"static" in source file} + xywh {0 0 100 20} labelsize 11 + } + MenuItem {} { + label {in source and "extern" in header} + xywh {0 0 100 20} labelsize 11 + } + } + Fl_Choice decl_class_choice { + xywh {10 10 75 20} down_box BORDER_BOX labelsize 11 textsize 11 + } { + MenuItem {} { + label private + xywh {10 10 100 20} labelsize 11 + } + MenuItem {} { + label public + xywh {10 10 100 20} labelsize 11 + } + MenuItem {} { + label protected + xywh {10 10 100 20} labelsize 11 + } + } + } + Fl_Input decl_input { + label {Can be any declaration, like "int x;", an external symbol like "extern int foo();", a \#directive like "\#include ", a comment like "//foo" or "/*foo*/", or typedef like "typedef char byte;" or "using std::list;".} + tooltip {Declaration text.} xywh {10 40 270 20} labelsize 11 align 134 when 0 textfont 4 textsize 11 resizable + } + Fl_Group {} {open + xywh {10 120 270 20} + } { + Fl_Return_Button decl_panel_ok { + label OK + xywh {150 120 60 20} labelsize 11 hotspot + } + Fl_Button decl_panel_cancel { + label Cancel + xywh {220 120 60 20} shortcut 0xff1b labelsize 11 + } + Fl_Box {} { + xywh {10 120 130 20} resizable + } + } + } +} + +Function {make_class_panel()} {} { + Fl_Window class_panel { + label {Class Properties} open + xywh {449 218 300 115} type Double labelsize 11 resizable + code0 {o->size_range(o->w(), o->h(), Fl::w(), o->h());} modal visible + } { + Fl_Group {} {open + xywh {10 10 280 20} hide + } { + Fl_Light_Button c_public_button { + label public + tooltip {Make the class publicly accessible.} xywh {10 10 60 20} labelsize 11 when 0 hide + } + Fl_Box {} { + xywh {80 10 210 20} resizable + } + } + Fl_Input c_name_input { + label {Name:} + tooltip {Name of class.} xywh {10 20 280 20} labelfont 1 labelsize 11 align 5 when 0 textfont 4 textsize 11 resizable + } + Fl_Input c_subclass_input { + label {Subclass of (text between : and \{)} + tooltip {Name of subclass.} xywh {10 55 280 20} labelfont 1 labelsize 11 align 5 when 0 textfont 4 textsize 11 + } + Fl_Group {} {open + xywh {10 85 280 20} + } { + Fl_Return_Button c_panel_ok { + label OK + xywh {160 85 60 20} labelsize 11 hotspot + } + Fl_Button c_panel_cancel { + label Cancel + xywh {230 85 60 20} shortcut 0xff1b labelsize 11 + } + Fl_Box {} { + xywh {10 85 140 20} resizable + } + } + } +} + +Function {make_comment_panel()} {} { + Fl_Window comment_panel { + label {Comment Properties} + xywh {422 190 550 280} type Double labelsize 11 resizable + code0 {o->size_range(320, 180);} modal visible + } { + Fl_Text_Editor comment_input { + xywh {110 10 430 230} box DOWN_BOX labelsize 11 textfont 4 textsize 11 resizable + code0 {o->when(FL_WHEN_ENTER_KEY_CHANGED|FL_WHEN_RELEASE);} + class CodeEditor + } + Fl_Group {} {open + xywh {110 250 430 20} labelsize 11 + } { + Fl_Return_Button comment_panel_ok { + label OK + xywh {370 250 80 20} labelsize 11 hotspot + } + Fl_Button comment_panel_cancel { + label Cancel + xywh {460 250 80 20} shortcut 0xff1b labelsize 11 + } + Fl_Box {} { + xywh {110 250 250 20} labelsize 11 resizable + } + } + Fl_Group {} {open + xywh {10 10 90 243} labelsize 11 + } { + Fl_Light_Button comment_in_source { + label {In Source} + tooltip {Put the comment into the source (.cxx) file.} xywh {10 10 90 20} labelsize 11 when 0 + } + Fl_Light_Button comment_in_header { + label {In Header} + tooltip {Put the comment into the header (.h) file.} xywh {10 40 90 20} labelsize 11 when 0 + } + Fl_Menu_Button comment_predefined { + label Predefined open + xywh {10 70 90 20} labelsize 11 textsize 11 + } {} + Fl_Button comment_load { + label {Import...} + xywh {10 100 90 20} labelsize 11 + } + Fl_Box {} { + xywh {10 132 90 121} labelsize 11 resizable + } + } + } +} + +Function {type_make_cb(Fl_Widget*,void*d)} {return_type void +} { + code {undo_checkpoint(); + Fl_Type *t = Fl_Type_make((char*)d); + if (t) { + select_only(t); + set_modflag(1); + t->open(); + } else { + undo_current --; + undo_last --; + }} {} +} + +Function {make_widgetbin()} {} { + Fl_Window widgetbin_panel { + label {Widget Bin} + xywh {411 171 550 85} type Single align 80 non_modal visible + } { + Fl_Group {} { + xywh {3 3 79 79} + } { + Fl_Button {} { + user_data {"Function"} + callback type_make_cb + tooltip Function xywh {5 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[7]);} + } + Fl_Button {} { + user_data {"Class"} + callback type_make_cb + tooltip Class xywh {30 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[12]);} + } + Fl_Button {} { + user_data {"comment"} + callback type_make_cb + tooltip Comment xywh {55 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[46]);} + } + Fl_Button {} { + user_data {"Code"} + callback type_make_cb + tooltip Code xywh {5 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[8]);} + } + Fl_Button {} { + user_data {"CodeBlock"} + callback type_make_cb + tooltip {Code Block} xywh {30 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[9]);} + } + Fl_Button {} { + user_data {"widget_class"} + callback type_make_cb + tooltip {Widget Class} xywh {55 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[48]);} + } + Fl_Button {} { + user_data {"decl"} + callback type_make_cb + tooltip Declaration xywh {5 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[10]);} + } + Fl_Button {} { + user_data {"declblock"} + callback type_make_cb + tooltip {Declaration Block} xywh {30 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[11]);} + } + } + Fl_Group {} { + xywh {87 3 79 79} + } { + Fl_Button {} { + user_data {"Fl_Window"} + callback type_make_cb + tooltip Window xywh {89 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[1]);} + } + Fl_Button {} { + user_data {"Fl_Group"} + callback type_make_cb + tooltip Group xywh {114 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[6]);} + } + Fl_Button {} { + user_data {"Fl_Pack"} + callback type_make_cb + tooltip Pack xywh {139 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[22]);} + } + Fl_Button {} { + user_data {"Fl_Tabs"} + callback type_make_cb + tooltip Tabs xywh {89 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[13]);} + } + Fl_Button {} { + user_data {"Fl_Scroll"} + callback type_make_cb + tooltip Scroll xywh {114 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[19]);} + } + Fl_Button {} { + user_data {"Fl_Tile"} + callback type_make_cb + tooltip Tile xywh {89 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[20]);} + } + Fl_Button {} { + user_data {"Fl_Wizard"} + callback type_make_cb + tooltip Wizard xywh {114 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[21]);} + } + } + Fl_Group {} { + xywh {171 3 54 79} + } { + Fl_Button {} { + user_data {"Fl_Button"} + callback type_make_cb + tooltip Button xywh {173 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[2]);} + } + Fl_Button {} { + user_data {"Fl_Return_Button"} + callback type_make_cb + tooltip {Return Button} xywh {198 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[23]);} + } + Fl_Button {} { + user_data {"Fl_Light_Button"} + callback type_make_cb + tooltip {Light Button} xywh {173 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[24]);} + } + Fl_Button {} { + user_data {"Fl_Repeat_Button"} + callback type_make_cb + tooltip {Repeat Button} xywh {198 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[25]);} + } + Fl_Button {} { + user_data {"Fl_Check_Button"} + callback type_make_cb + tooltip {Check Button} xywh {173 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[3]);} + } + Fl_Button {} { + user_data {"Fl_Round_Button"} + callback type_make_cb + tooltip {Round Button} xywh {198 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[4]);} + } + } + Fl_Group {} { + xywh {230 3 104 79} + } { + Fl_Button {} { + user_data {"Fl_Slider"} + callback type_make_cb + tooltip Slider xywh {232 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[37]);} + } + Fl_Button {} { + user_data {"Fl_Scrollbar"} + callback type_make_cb + tooltip {Scroll Bar} xywh {257 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[38]);} + } + Fl_Button {} { + user_data {"Fl_Value_Slider"} + callback type_make_cb + tooltip {Value Slider} xywh {282 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[39]);} + } + Fl_Button {} { + user_data {"Fl_Value_Output"} + callback type_make_cb + tooltip {Value Output} xywh {307 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[45]);} + } + Fl_Button {} { + user_data {"Fl_Adjuster"} + callback type_make_cb + tooltip Adjuster xywh {232 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[40]);} + } + Fl_Button {} { + user_data {"Fl_Counter"} + callback type_make_cb + tooltip Counter xywh {257 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[41]);} + } + Fl_Button {} { + user_data {"Fl_Dial"} + callback type_make_cb + tooltip Dial xywh {282 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[42]);} + } + Fl_Button {} { + user_data {"Fl_Roller"} + callback type_make_cb + tooltip Roller xywh {232 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[43]);} + } + Fl_Button {} { + user_data {"Fl_Spinner"} + callback type_make_cb + tooltip Spinner xywh {257 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[47]);} + } + Fl_Button {} { + user_data {"Fl_Value_Input"} + callback type_make_cb + tooltip {Value Input} xywh {282 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[44]);} + } + } + Fl_Group {} { + xywh {339 3 54 79} + } { + Fl_Button {} { + user_data {"Fl_Input"} + callback type_make_cb + tooltip Input xywh {341 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[14]);} + } + Fl_Button {} { + user_data {"Fl_Output"} + callback type_make_cb + tooltip Output xywh {366 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[27]);} + } + Fl_Button {} { + user_data {"Fl_Text_Editor"} + callback type_make_cb + tooltip {Text Edit} xywh {341 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[29]);} + } + Fl_Button {} { + user_data {"Fl_Text_Display"} + callback type_make_cb + tooltip {Text Display} xywh {366 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[28]);} + } + Fl_Button {} { + user_data {"Fl_File_Input"} + callback type_make_cb + tooltip {File Input} xywh {341 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[30]);} + } + } + Fl_Group {} { + xywh {398 3 54 79} + } { + Fl_Button {} { + user_data {"Fl_Menu_Bar"} + callback type_make_cb + tooltip {Menu Bar} xywh {400 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[17]);} + } + Fl_Button {} { + user_data {"Fl_Input_Choice"} + callback type_make_cb + tooltip {Input Choice} xywh {425 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[15]);} + } + Fl_Button {} { + user_data {"Fl_Menu_Button"} + callback type_make_cb + tooltip {Menu Button} xywh {400 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[26]);} + } + Fl_Button {} { + user_data {"menuitem"} + callback type_make_cb + tooltip {Menu Item} xywh {425 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[16]);} + } + Fl_Button {} { + user_data {"Fl_Choice"} + callback type_make_cb + tooltip Choice xywh {400 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[15]);} + } + Fl_Button {} { + user_data {"submenu"} + callback type_make_cb + tooltip {Sub Menu} xywh {425 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[18]);} + } + } + Fl_Group {} { + xywh {457 3 29 79} + } { + Fl_Button {} { + user_data {"Fl_Browser"} + callback type_make_cb + tooltip Browser xywh {459 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[31]);} + } + Fl_Button {} { + user_data {"Fl_Check_Browser"} + callback type_make_cb + tooltip {Check Browser} xywh {459 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[32]);} + } + Fl_Button {} { + user_data {"Fl_File_Browser"} + callback type_make_cb + tooltip {File Browser} xywh {459 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[33]);} + } + } + Fl_Group {} { + xywh {491 3 55 79} + } { + Fl_Button {} { + user_data {"Fl_Box"} + callback type_make_cb + tooltip Box xywh {493 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[5]);} + } + Fl_Button {} { + user_data {"Fl_Clock"} + callback type_make_cb + tooltip Clock xywh {518 5 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[34]);} + } + Fl_Button {} { + user_data {"Fl_Help_View"} + callback type_make_cb + tooltip {Help Browser} xywh {493 30 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[35]);} + } + Fl_Button {} { + user_data {"Fl_Progress"} + callback type_make_cb + tooltip Progress xywh {493 55 24 24} box THIN_UP_BOX + code0 {o->image(pixmap[36]);} + } + } + } +} + +Function {make_sourceview()} {} { + Fl_Window sourceview_panel { + label {Code View} + callback toggle_sourceview_cb + xywh {430 273 520 490} type Double align 80 resizable size_range {384 120 0 0} visible + } { + Fl_Tabs sv_tab { + callback update_sourceview_position_cb + xywh {10 10 500 440} selection_color 4 labelcolor 7 resizable + } { + Fl_Group {} { + label Source open + xywh {10 35 500 415} labelsize 13 hide resizable + } { + Fl_Text_Editor sv_source { + xywh {20 50 480 390} textfont 4 textsize 11 resizable + code0 {\#include "CodeEditor.h"} + class CodeViewer + } + } + Fl_Group {} { + label Header open + xywh {10 35 500 415} labelsize 13 + } { + Fl_Text_Editor sv_header { + xywh {20 50 480 390} textfont 4 textsize 11 resizable + code0 {\#include "CodeEditor.h"} + class CodeViewer + } + } + } + Fl_Group {} { + xywh {10 460 500 20} + } { + Fl_Button {} { + label Refresh + callback update_sourceview_cb + xywh {10 460 61 20} labelsize 11 + } + Fl_Light_Button sv_autorefresh { + label {Auto-Refresh} + xywh {76 460 91 20} labelsize 11 + code0 {o->callback((Fl_Callback*)update_sourceview_cb);} + } + Fl_Light_Button sv_autoposition { + label {Auto-Position} + xywh {172 460 89 20} labelsize 11 + } + Fl_Button {} { + label Close + callback toggle_sourceview_b_cb + xywh {460 460 50 20} labelsize 11 + } + Fl_Box {} { + xywh {265 460 190 20} resizable + } + } + } +} + +comment { +// +// End of "$Id: function_panel.fl 6012 2008-01-04 21:45:49Z matt $". +//} {in_source in_header +} diff --git a/third_party/windows/fltk-1.1.10/fluid/function_panel.h b/third_party/windows/fltk-1.1.10/fluid/function_panel.h new file mode 100644 index 0000000..f53ae5d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/function_panel.h @@ -0,0 +1,119 @@ +// +// "$Id: function_panel.h 6817 2009-07-02 09:42:17Z AlbrechtS $" +// +// Code dialogs for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0110 + +#ifndef function_panel_h +#define function_panel_h +#include +#include +extern Fl_Double_Window *function_panel; +#include +#include +extern Fl_Choice *f_public_member_choice; +extern Fl_Choice *f_public_choice; +#include +extern Fl_Light_Button *f_c_button; +#include +#include +extern Fl_Input *f_name_input; +extern Fl_Input *f_return_type_input; +#include +extern Fl_Return_Button *f_panel_ok; +#include +extern Fl_Button *f_panel_cancel; +Fl_Double_Window* make_function_panel(); +extern Fl_Menu_Item menu_f_public_member_choice[]; +extern Fl_Menu_Item menu_f_public_choice[]; +extern Fl_Double_Window *code_panel; +#include "CodeEditor.h" +extern CodeEditor *code_input; +extern Fl_Return_Button *code_panel_ok; +extern Fl_Button *code_panel_cancel; +Fl_Double_Window* make_code_panel(); +extern Fl_Double_Window *codeblock_panel; +extern Fl_Input *code_before_input; +extern Fl_Input *code_after_input; +extern Fl_Return_Button *codeblock_panel_ok; +extern Fl_Button *codeblock_panel_cancel; +Fl_Double_Window* make_codeblock_panel(); +extern Fl_Double_Window *declblock_panel; +extern Fl_Choice *declblock_public_choice; +extern Fl_Light_Button *declblock_public_button_x; +extern Fl_Input *decl_before_input; +extern Fl_Input *decl_after_input; +extern Fl_Return_Button *declblock_panel_ok; +extern Fl_Button *declblock_panel_cancel; +Fl_Double_Window* make_declblock_panel(); +extern Fl_Menu_Item menu_declblock_public_choice[]; +extern Fl_Double_Window *decl_panel; +extern Fl_Choice *decl_choice; +extern Fl_Choice *decl_class_choice; +extern Fl_Input *decl_input; +extern Fl_Return_Button *decl_panel_ok; +extern Fl_Button *decl_panel_cancel; +Fl_Double_Window* make_decl_panel(); +extern Fl_Menu_Item menu_decl_choice[]; +extern Fl_Menu_Item menu_decl_class_choice[]; +extern Fl_Double_Window *class_panel; +extern Fl_Light_Button *c_public_button; +extern Fl_Input *c_name_input; +extern Fl_Input *c_subclass_input; +extern Fl_Return_Button *c_panel_ok; +extern Fl_Button *c_panel_cancel; +Fl_Double_Window* make_class_panel(); +extern Fl_Double_Window *comment_panel; +extern CodeEditor *comment_input; +extern Fl_Return_Button *comment_panel_ok; +extern Fl_Button *comment_panel_cancel; +extern Fl_Light_Button *comment_in_source; +extern Fl_Light_Button *comment_in_header; +#include +extern Fl_Menu_Button *comment_predefined; +extern Fl_Button *comment_load; +Fl_Double_Window* make_comment_panel(); +void type_make_cb(Fl_Widget*,void*d); +#include +extern Fl_Window *widgetbin_panel; +Fl_Window* make_widgetbin(); +extern void toggle_sourceview_cb(Fl_Double_Window*, void*); +extern Fl_Double_Window *sourceview_panel; +#include +extern void update_sourceview_position_cb(Fl_Tabs*, void*); +extern Fl_Tabs *sv_tab; +extern CodeViewer *sv_source; +extern CodeViewer *sv_header; +extern void update_sourceview_cb(Fl_Button*, void*); +extern Fl_Light_Button *sv_autorefresh; +extern Fl_Light_Button *sv_autoposition; +extern void toggle_sourceview_b_cb(Fl_Button*, void*); +Fl_Double_Window* make_sourceview(); +#endif + +// +// End of "$Id: function_panel.h 6817 2009-07-02 09:42:17Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/icons/fluid-128.png b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-128.png new file mode 100644 index 0000000..cf9cf40 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-128.png differ diff --git a/third_party/windows/fltk-1.1.10/fluid/icons/fluid-16.png b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-16.png new file mode 100644 index 0000000..5a50222 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-16.png differ diff --git a/third_party/windows/fltk-1.1.10/fluid/icons/fluid-16i.png b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-16i.png new file mode 100644 index 0000000..10e0dfa Binary files /dev/null and b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-16i.png differ diff --git a/third_party/windows/fltk-1.1.10/fluid/icons/fluid-256.png b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-256.png new file mode 100644 index 0000000..33681a7 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-256.png differ diff --git a/third_party/windows/fltk-1.1.10/fluid/icons/fluid-32.png b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-32.png new file mode 100644 index 0000000..38efb2e Binary files /dev/null and b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-32.png differ diff --git a/third_party/windows/fltk-1.1.10/fluid/icons/fluid-32.xpm b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-32.xpm new file mode 100644 index 0000000..0a18a1c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-32.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static char * fluid_32_xpm[] = { +"32 32 32 1", +" c None", +". c #000200", +"+ c #01162D", +"@ c #01356A", +"# c #2F312E", +"$ c #035FB1", +"% c #0061C0", +"& c #0071E1", +"* c #007FFF", +"= c #247ABD", +"- c #626E6F", +"; c #777976", +"> c #2A90E9", +", c #3291D2", +"' c #2690FC", +") c #449EAD", +"! c #5A9D87", +"~ c #70AD78", +"{ c #7EA3C4", +"] c #87B556", +"^ c #6EB8FF", +"/ c #A8ABA9", +"( c #A2C443", +"_ c #8BC3F9", +": c #BED831", +"< c #CDDF1B", +"[ c #CACDCB", +"} c #ACD7FF", +"| c #ECF408", +"1 c #E5E7E4", +"2 c #DDEDFD", +"3 c #FCFFFC", +" ", +" ....... ", +" .-//[//. ", +" ./^^333. ", +" .{''231. ", +" .[^^331. ", +" .[33331. ", +" .[33331. ", +" .[33^'_. ", +" .[33^',. ", +" .[332}2. ", +" .133331. ", +" .133331. ", +" .-333333;. ", +" .#1332_333#. ", +" .[333''^333. ", +" ./3333>'}333/. ", +" .-333333232_}3;. ", +" .#132}23333_'>33#. ", +" .[33^'^33332>^331. ", +" .$'''*'*''''''''''$. ", +" .@*')>{******,***>)&@. ", +" .+&':~(:&*****:)**)|&*+. ", +" .%*!:&~(&,'>'*>**,~(**&. ", +" .$*':]>:!!|&|=~<&]~:!(]!:%*****+. ", +" .&***):&!:=<]((&|!~:]<=*****&. ", +".$&**)~!**&**&&&*&&*&*&*******$.", +".%***]~%*****************'****%.", +".@%%%%%%%%%%%%%%%%%%%%%$%%%$%%@.", +" .............................. "}; diff --git a/third_party/windows/fltk-1.1.10/fluid/icons/fluid-32i.png b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-32i.png new file mode 100644 index 0000000..d7581d8 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-32i.png differ diff --git a/third_party/windows/fltk-1.1.10/fluid/icons/fluid-48.png b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-48.png new file mode 100644 index 0000000..0aab52c Binary files /dev/null and b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-48.png differ diff --git a/third_party/windows/fltk-1.1.10/fluid/icons/fluid-64.png b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-64.png new file mode 100644 index 0000000..9157cca Binary files /dev/null and b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-64.png differ diff --git a/third_party/windows/fltk-1.1.10/fluid/icons/fluid-96.xpm b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-96.xpm new file mode 100644 index 0000000..6eb06cb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/icons/fluid-96.xpm @@ -0,0 +1,131 @@ +/* XPM */ +static char * fluid_96_xpm[] = { +"96 96 32 1", +" c None", +". c #000100", +"+ c #031F3F", +"@ c #00366C", +"# c #2E302D", +"$ c #0058AC", +"% c #0060BF", +"& c #4E504D", +"* c #14659F", +"= c #006DDC", +"- c #2C7087", +"; c #0080FF", +"> c #407B74", +", c #0F85F9", +"' c #268CCD", +") c #7C7E7B", +"! c #2D92EC", +"~ c #4498A9", +"{ c #2F94FE", +"] c #5BA18C", +"^ c #6BA674", +"/ c #7DAD62", +"( c #93BD53", +"_ c #A4A6A2", +": c #6CB6FF", +"< c #ABCC3F", +"[ c #C4DA2A", +"} c #CACCC9", +"| c #DCE913", +"1 c #BBDEFF", +"2 c #FDFE00", +"3 c #FDFFFC", +" ", +" ", +" ", +" ........... ", +" ...................... ", +" ........................ ", +" ........#&#&#&#&##...... ", +" ....)__}33333333333}_... ", +" ...&33333333333333333... ", +" ...#33311133333333333... ", +" ...&33!,{,;:333333333... ", +" ...&3:,{{{{,13333333}... ", +" ...&3!{{!{{,13333333}... ", +" ...&3:!{{!{;13333333}... ", +" ...&3{{{{{{;133333333... ", +" ...&31,{{{;,33333333}... ", +" ...&331{{{:133333333}... ", +" ...&3333333333333333_... ", +" ...&3333333333333333}... ", +" ...&3333333333333333_... ", +" ...&3333333333333333}... ", +" ...&3333333333333333_... ", +" ...&3333333333333333}... ", +" ...&3333333333333333_... ", +" ...&3333333331!,,;:3}... ", +" ...&333333333{{{{{;:_... ", +" ...&333333331,{!{!{{}... ", +" ...&333333331{{{{{{,_... ", +" ...)333333331{{!{{{{_... ", +" ...)333333333{{{!{;:_... ", +" ...)3333333331{;;;:3_... ", +" ...)3333333333331333_... ", +" ...)3333333333333333_... ", +" ...)3333333333333333_... ", +" ..._3333333333333333_... ", +" ..._3333333333333333_... ", +" ..._3333333333333333_... ", +" ..._3333333333333333}.... ", +" ...._33333333333333333#... ", +" ....&333333333333333333_.... ", +" ....&33333333333333333333).... ", +" ....333333333333333333333}&.... ", +" ...._33333333333333333333333.... ", +" ....&333333333331:11333333333_.... ", +" ....#33333333333:,,,;:333333333&.... ", +" ....}3333333333:,!{{{;1333333333&.... ", +" ....}33333333333{{{!{{,!3333333333.... ", +" ....)333333333333{{{{!{{{3333333333_.... ", +" ....#3333333333333!{{{{{,:33333333333&.... ", +" ...._33333333333331{{!{,;1333333333333#.... ", +" ...._333333333333333:;,;,13333333333333_.... ", +" ...._333333333333333333113333333333333333_.... ", +" ....&33333333333333333333333333331::1333333&.... ", +" ...._333333333333333333333333333{,{{;{133333#... ", +" ...._3333333333333333333333333331,{!{{,:33333}.... ", +" ....&3333333333133333333333333333:{{{{{{:333333).... ", +" ...#333333331{,,;:333333333333333:{!{!{{:3333333&.... ", +" ....}33333333,{{{{;:333333333333331,{!{{;:33333333#... ", +" ...._333333331,!{!{{,333333333333333{,{{;{1333333333.... ", +" ....&3333333331{{{{{{{3333333333333333::::33333333333).... ", +" ....+!:::::::::{{{{!{{;::::::::::::::::::::::::::!:::::+.... ", +" ...+=;;;;;;;;;;;;{{{{;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=.... ", +" ....%;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;%.... ", +" ....@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;$.... ", +" ...+%;;;;;;!!!;;;;;,;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;!=;;;+.... ", +" ....%;;;;;!([<|^~]^([%;;;;;;;;;;;;;;;;;,(<'=;;;;;;;!^/<[|'=;;=+... ", +" ....$;;;;;'|2>]22<|22[%=;;;;;;;;;;;;;;;;^22[%=;;;;;;!][22|%=;;;$.... ", +" ....@;;;;;;[2[%^2|*[22(%=;;;;;;;;;;;;;;;,/22|$=;;;;;;;;<22<%=;;;;$.... ", +" ....+=;;;;;~22^$%]~$|22>%=;;;;;;;;;;;;;;;;'||^%=;;;;;;;,[22^$=;;;;;+.... ", +" ....%;;;;;,[22-%==='22|*==;;;;;;;;;;;;;;;;;;=%=;;;;;;;;'22|*%=;;;;;=+... ", +" ....$;;;;;;!22|$%;,;^22<$=;;;;;;;;;;;;;;;;;;===;;;;;;;;;^22|$==;;;;;;%.... ", +" ....@;;;;;'](22[^]=;;<22^$==!~]/~=;!]]~;;;;{'~]==;;;;~<<]<22($=;;;;;;;;@.... ", +" ....@;;;;;;]<|22|[<%;!|22-%'[2222*=;/22(%;~|222(=;;;!<2|^[222>$=;;;;;;;;;+.... ", +" ....=;;;;;;;,[22>$===~22|$==,[22[%=;[22]%=,!|22]%=;![2|*%]22|*==;;;;;;;;;%+... ", +" ....@;;;;;;;;!|22*$=;;/22($=;,[22/$='222*%=;!|22-%;;<22>%=]22[$%;;;;;;;;;;;=.... ", +" ....@;;;;;;;;;~22[*==;;[22>%=;'22|-%,^22[$=;,~22[$%;]22<$%=(22/$=;;;;;;;;;;;;@.... ", +" ....+;;;;;;;;;;^22<$=;;!222*$=;]22[$==[22/$=;;(22/$=![22]$=;|22-%=;;;;;;;;;;;;;+... ", +" ....;;;;;;;;;;;<22^%=;;]22[$=;;(22/$=~222-%=;;[22>%=]22|$%;~22|$==;;;;;;;;;;;;;;.... ", +" ....%;;;;;;;;;;;|22-%=;;(22/$=;{|22-%=<22|$%;;'22|*%;<22<$==(22<$=;=;;;;;;;;;;;;;$.... ", +" ....+;;;;;;;;;;;!222$==;,|22>%=;~22|$=]|22($=;;]22[$%,|22^%=!|22^$=;;;;;;;;;;;;;;;;@.... ", +" ....+=;;;;;;;;;;;~22[$%;;'22|*-/;]22($*[<22^$^=;(22/$(-222>$=(222->~;;;;;;;;;;;;;;;;=+.... ", +" ...+;;;;;;;;;;;;;(22/$=;;]22|*<'=(22/*[~[22>(]=;|22>//=|22/$^(|2|-[%=;;;;;;;;;;;;;;;;=.... ", +" ....$;;;;;;;;;;;;;<22>%=;;]222|>==(222|^=|22|<%=;|222<%=(222|<-222|-==;;;;;;;;;;;;;;;;;$.... ", +" ....@;;;;;;;;;;;;;!|2|$=;;;'[2[>%=;'|2[]%=/2|/$==;^2|(*%=!(2|($%<2[-%=;;;;;;;;;;;;;;;;;;;@.... ", +"....@;;;;;;;;;;;;;;'22($%;;;;=%%==;;;=%%%==;=%%==;;;=%===;;==%%====%%=,;;;;;;;;;;;;;;;;;;;;+... ", +"...+=;;;;;;;;;;!'=,]22-%=;;;;;;==;=;;;===;=;;===;;;;;===;;;;=;=,;;,=;=;;;;;;;;;;;;;;;;;;;;;=....", +"...+;;;;;;;;;;;[2^=<2<$==;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+...", +"...+;;;;;;;;;;;22('2|*%=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+...", +"...+;;;;;;;;;;;^|<[[-%=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+...", +"...+;;;;;;;;;;;;*~*%===;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;@...", +"...+;;;;;;;;;;;;;====;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+...", +"....$=;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=$....", +" .....++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++..... ", +" ............................................................................................. ", +" ............................................................................................ ", +" ...................................................................................... "}; diff --git a/third_party/windows/fltk-1.1.10/fluid/icons/fluid.ico b/third_party/windows/fltk-1.1.10/fluid/icons/fluid.ico new file mode 100644 index 0000000..aee6b18 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/fluid/icons/fluid.ico differ diff --git a/third_party/windows/fltk-1.1.10/fluid/icons/fluid.xcf.gz b/third_party/windows/fltk-1.1.10/fluid/icons/fluid.xcf.gz new file mode 100644 index 0000000..189c0c9 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/fluid/icons/fluid.xcf.gz differ diff --git a/third_party/windows/fltk-1.1.10/fluid/makedepend b/third_party/windows/fltk-1.1.10/fluid/makedepend new file mode 100644 index 0000000..94d312d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/makedepend @@ -0,0 +1,294 @@ +# DO NOT DELETE THIS LINE -- make depend depends on it. +CodeEditor.o: CodeEditor.cxx CodeEditor.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Editor.H \ + ../FL/Fl_Text_Display.H ../FL/fl_draw.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Text_Buffer.H +Fl_Function_Type.o: Fl_Function_Type.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Preferences.H ../FL/Fl_File_Chooser.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Group.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Menu_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H \ + ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_File_Icon.H ../FL/Fl.H \ + ../FL/filename.H ../FL/Fl_Box.H ../FL/Fl_Check_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Button.H ../FL/Fl_File_Input.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H \ + ../FL/fl_ask.H Fl_Type.h ../FL/Fl_Widget.H ../FL/Fl_Menu.H \ + Fluid_Image.h ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/Fl_Tabs.H \ + ../FL/Fl_Pack.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Input_Choice.H ../FL/Fl_Window.H ../FL/Fl_Menu_Bar.H \ + ../FL/fl_show_input.H ../FL/fl_ask.H ../src/flstring.h \ + ../FL/Fl_Export.H ../config.h function_panel.h ../FL/Fl_Light_Button.H \ + CodeEditor.h ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Editor.H \ + ../FL/Fl_Text_Display.H ../FL/fl_draw.H ../FL/Fl_Text_Buffer.H \ + comments.h +Fl_Group_Type.o: Fl_Group_Type.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/fl_message.H \ + ../FL/fl_ask.H Fl_Widget_Type.h Fl_Type.h ../FL/Fl_Widget.H \ + ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H Fluid_Image.h \ + ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/Fl_Tabs.H \ + ../FL/Fl_Group.H ../FL/Fl_Pack.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H \ + ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/Fl_Window.H ../FL/Fl_Menu_Bar.H ../src/flstring.h \ + ../FL/Fl_Export.H ../config.h ../FL/Fl_Scroll.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H +Fl_Menu_Type.o: Fl_Menu_Type.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H Fl_Widget_Type.h Fl_Type.h ../FL/Fl_Widget.H \ + ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H ../FL/Fl_Image.H \ + Fluid_Image.h ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/Fl_Tabs.H \ + ../FL/Fl_Group.H ../FL/Fl_Pack.H ../FL/Fl_Group.H ../FL/Fl_Wizard.H \ + ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Window.H ../FL/Fl_Menu_Bar.H \ + alignment_panel.h ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H \ + ../FL/fl_draw.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Text_Buffer.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Preferences.H ../FL/Fl_Tooltip.H \ + ../FL/Fl_Button.H ../FL/Fl_Box.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Spinner.H ../FL/Enumerations.H ../FL/Fl_Repeat_Button.H \ + ../FL/Fl.H ../FL/Fl_Return_Button.H ../FL/Fl_Round_Button.H \ + ../FL/fl_message.H ../FL/fl_ask.H ../src/flstring.h ../FL/Fl_Export.H \ + ../config.h ../FL/Fl_Output.H ../FL/Fl_Input.H Shortcut_Button.h +Fl_Type.o: Fl_Type.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Browser_.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/fl_draw.H ../src/flstring.h ../FL/Fl_Export.H ../config.h \ + Fl_Type.h ../FL/Fl_Widget.H ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H \ + ../FL/Fl_Image.H Fluid_Image.h ../FL/Fl_Shared_Image.H ../FL/Fl_Tabs.H \ + ../FL/Fl_Pack.H ../FL/Fl_Group.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H \ + ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/Fl_Window.H ../FL/Fl_Menu_Bar.H undo.h ../FL/Fl_Pixmap.H \ + pixmaps/lock.xpm pixmaps/flWindow.xpm pixmaps/flButton.xpm \ + pixmaps/flCheckButton.xpm pixmaps/flRoundButton.xpm pixmaps/flBox.xpm \ + pixmaps/flGroup.xpm pixmaps/flFunction.xpm pixmaps/flCode.xpm \ + pixmaps/flCodeBlock.xpm pixmaps/flComment.xpm pixmaps/flDeclaration.xpm \ + pixmaps/flDeclarationBlock.xpm pixmaps/flClass.xpm pixmaps/flTabs.xpm \ + pixmaps/flInput.xpm pixmaps/flChoice.xpm pixmaps/flMenuitem.xpm \ + pixmaps/flMenubar.xpm pixmaps/flSubmenu.xpm pixmaps/flScroll.xpm \ + pixmaps/flTile.xpm pixmaps/flWizard.xpm pixmaps/flPack.xpm \ + pixmaps/flReturnButton.xpm pixmaps/flLightButton.xpm \ + pixmaps/flRepeatButton.xpm pixmaps/flMenuButton.xpm \ + pixmaps/flOutput.xpm pixmaps/flTextDisplay.xpm pixmaps/flTextEdit.xpm \ + pixmaps/flFileInput.xpm pixmaps/flBrowser.xpm \ + pixmaps/flCheckBrowser.xpm pixmaps/flFileBrowser.xpm \ + pixmaps/flClock.xpm pixmaps/flHelp.xpm pixmaps/flProgress.xpm \ + pixmaps/flSlider.xpm pixmaps/flScrollBar.xpm pixmaps/flValueSlider.xpm \ + pixmaps/flAdjuster.xpm pixmaps/flCounter.xpm pixmaps/flDial.xpm \ + pixmaps/flRoller.xpm pixmaps/flValueInput.xpm pixmaps/flValueOutput.xpm \ + pixmaps/flSpinner.xpm pixmaps/flWidgetClass.xpm +Fl_Widget_Type.o: Fl_Widget_Type.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H Fl_Widget_Type.h Fl_Type.h ../FL/Fl_Widget.H \ + ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H Fluid_Image.h \ + ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/Fl_Tabs.H \ + ../FL/Fl_Group.H ../FL/Fl_Pack.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H \ + ../FL/Fl_Input_Choice.H ../FL/Fl_Window.H ../FL/Fl_Menu_Bar.H \ + alignment_panel.h ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H \ + ../FL/fl_draw.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Text_Buffer.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Preferences.H ../FL/Fl_Tooltip.H \ + ../FL/Fl_Button.H ../FL/Fl_Box.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Spinner.H ../FL/Enumerations.H ../FL/Fl_Repeat_Button.H \ + ../FL/Fl.H ../FL/Fl_Return_Button.H ../FL/Fl_Round_Button.H \ + ../FL/fl_message.H ../FL/fl_ask.H ../FL/Fl_Slider.H ../src/flstring.h \ + ../FL/Fl_Export.H ../config.h widget_panel.h ../FL/Fl_Value_Input.H \ + ../FL/Fl_Input.H Shortcut_Button.h CodeEditor.h ../FL/Fl_Text_Editor.H \ + ../FL/Fl_Text_Display.H ../FL/fl_show_colormap.H +Fl_Window_Type.o: Fl_Window_Type.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Overlay_Window.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/fl_message.H \ + ../FL/fl_ask.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Menu_Item.H \ + ../FL/Fl_Image.H ../FL/Fl_Round_Button.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Button.H Fl_Widget_Type.h Fl_Type.h ../FL/Fl_Widget.H \ + ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H Fluid_Image.h \ + ../FL/Fl_Shared_Image.H ../FL/Fl_Tabs.H ../FL/Fl_Pack.H \ + ../FL/Fl_Group.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H \ + ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/Fl_Window.H ../FL/Fl_Menu_Bar.H undo.h alignment_panel.h \ + ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H ../FL/fl_draw.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Text_Buffer.H ../FL/Fl_Double_Window.H ../FL/Fl_Preferences.H \ + ../FL/Fl_Tooltip.H ../FL/Fl_Button.H ../FL/Fl_Box.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Check_Button.H ../FL/Fl_Spinner.H \ + ../FL/Enumerations.H ../FL/Fl_Repeat_Button.H ../FL/Fl.H \ + ../FL/Fl_Return_Button.H widget_panel.h ../FL/Fl_Value_Input.H \ + ../FL/Fl_Input.H Shortcut_Button.h CodeEditor.h ../FL/Fl_Text_Editor.H \ + ../FL/Fl_Text_Display.H ../src/flstring.h ../FL/Fl_Export.H ../config.h +Fluid_Image.o: Fluid_Image.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Widget.H Fl_Type.h ../FL/Fl_Menu.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Widget.H ../FL/Fl_Image.H Fluid_Image.h \ + ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/Fl_Tabs.H \ + ../FL/Fl_Group.H ../FL/Fl_Pack.H ../FL/Fl_Group.H ../FL/Fl_Wizard.H \ + ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Window.H ../FL/Fl_Menu_Bar.H \ + ../src/flstring.h ../FL/Fl_Export.H ../config.h ../FL/filename.H \ + ../FL/Fl_File_Chooser.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Button.H ../FL/Fl_Preferences.H ../FL/Fl_Tile.H \ + ../FL/Fl_File_Browser.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/filename.H ../FL/Fl_Box.H \ + ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Button.H \ + ../FL/Fl_File_Input.H ../FL/Fl_Return_Button.H ../FL/fl_ask.H +about_panel.o: about_panel.cxx about_panel.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Box.H \ + ../FL/Fl_Button.H ../FL/Fl_Return_Button.H ../FL/Fl_Button.H \ + ../FL/Fl_Pixmap.H ../FL/Fl_Image.H +align_widget.o: align_widget.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + Fl_Widget_Type.h Fl_Type.h ../FL/Fl_Widget.H ../FL/Fl_Menu.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H Fluid_Image.h \ + ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/Fl_Tabs.H ../FL/Fl_Pack.H \ + ../FL/Fl_Group.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H \ + ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/Fl_Menu_Bar.H undo.h +alignment_panel.o: alignment_panel.cxx alignment_panel.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Text_Buffer.H \ + ../FL/Fl_Text_Display.H ../FL/fl_draw.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Text_Buffer.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Preferences.H ../FL/Fl_Tooltip.H \ + ../FL/Fl_Widget.H ../FL/Fl_Button.H ../FL/Fl_Tabs.H ../FL/Fl_Group.H \ + ../FL/Fl_Box.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Button.H ../FL/Fl_Choice.H \ + ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H \ + ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Spinner.H \ + ../FL/Enumerations.H ../FL/Fl_Repeat_Button.H ../FL/Fl.H \ + ../FL/Fl_Return_Button.H ../FL/Fl_Round_Button.H +code.o: code.cxx ../src/flstring.h ../FL/Fl_Export.H ../config.h \ + ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H Fl_Type.h \ + ../FL/Fl_Widget.H ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H \ + ../FL/Fl_Widget.H ../FL/Fl_Image.H Fluid_Image.h \ + ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/Fl_Tabs.H \ + ../FL/Fl_Group.H ../FL/Fl_Pack.H ../FL/Fl_Group.H ../FL/Fl_Wizard.H \ + ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Window.H ../FL/Fl_Menu_Bar.H \ + alignment_panel.h ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H \ + ../FL/fl_draw.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Text_Buffer.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Preferences.H ../FL/Fl_Tooltip.H \ + ../FL/Fl_Button.H ../FL/Fl_Box.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Spinner.H ../FL/Enumerations.H ../FL/Fl_Repeat_Button.H \ + ../FL/Fl.H ../FL/Fl_Return_Button.H ../FL/Fl_Round_Button.H \ + ../FL/filename.H +factory.o: factory.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H \ + ../FL/Fl_Image.H ../FL/Fl_Pixmap.H ../src/flstring.h ../FL/Fl_Export.H \ + ../config.h undo.h Fl_Widget_Type.h Fl_Type.h ../FL/Fl_Widget.H \ + ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H Fluid_Image.h \ + ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/Fl_Tabs.H \ + ../FL/Fl_Group.H ../FL/Fl_Pack.H ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H \ + ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/Fl_Window.H ../FL/Fl_Menu_Bar.H ../FL/Fl_Box.H ../FL/Fl_Button.H \ + ../FL/Fl_Return_Button.H ../FL/Fl_Button.H ../FL/Fl_Repeat_Button.H \ + ../FL/Fl.H ../FL/Fl_Light_Button.H ../FL/Fl_Check_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H ../FL/Fl_Browser.H \ + ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Check_Browser.H ../FL/Fl_File_Browser.H \ + ../FL/Fl_Browser.H ../FL/Fl_File_Icon.H ../FL/filename.H \ + ../FL/Fl_Counter.H ../FL/Fl_Spinner.H ../FL/Enumerations.H \ + ../FL/Fl_File_Input.H ../FL/Fl_Text_Display.H ../FL/fl_draw.H \ + ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Editor.H ../FL/Fl_Text_Display.H \ + ../FL/Fl_Clock.H ../FL/Fl_Help_View.H ../FL/Fl_Shared_Image.H \ + ../FL/Fl_Progress.H ../FL/Fl_Adjuster.H ../FL/Fl_Dial.H \ + ../FL/Fl_Roller.H ../FL/Fl_Scrollbar.H ../FL/Fl_Output.H \ + ../FL/Fl_Input.H ../FL/Fl_Value_Input.H ../FL/Fl_Value_Output.H \ + ../FL/Fl_Value_Slider.H ../FL/Fl_Multi_Label.H +file.o: file.cxx ../src/flstring.h ../FL/Fl_Export.H ../config.h \ + alignment_panel.h ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H ../FL/fl_draw.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Text_Buffer.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Preferences.H \ + ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H ../FL/Fl_Button.H ../FL/Fl_Tabs.H \ + ../FL/Fl_Group.H ../FL/Fl_Box.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Button.H ../FL/Fl_Choice.H \ + ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H \ + ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Spinner.H \ + ../FL/Enumerations.H ../FL/Fl_Repeat_Button.H ../FL/Fl.H \ + ../FL/Fl_Return_Button.H ../FL/Fl_Round_Button.H ../FL/fl_message.H \ + ../FL/fl_ask.H Fl_Widget_Type.h Fl_Type.h ../FL/Fl_Menu.H Fluid_Image.h \ + ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/Fl_Pack.H \ + ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H \ + ../FL/Fl_Input_Choice.H ../FL/Fl_Window.H ../FL/Fl_Menu_Bar.H +fluid.o: fluid.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Box.H ../FL/Fl_Button.H ../FL/Fl_File_Icon.H \ + ../FL/Fl.H ../FL/Fl_Help_Dialog.H ../FL/Fl_Group.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Help_View.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H \ + ../FL/Fl_Shared_Image.H ../FL/Fl_Image.H ../FL/Fl_Hold_Browser.H \ + ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Menu_Bar.H \ + ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/fl_ask.H ../FL/fl_draw.H \ + ../FL/Fl_File_Chooser.H ../FL/Fl_Choice.H ../FL/Fl_Menu_Button.H \ + ../FL/Fl_Preferences.H ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H \ + ../FL/Fl_File_Icon.H ../FL/filename.H ../FL/Fl_Check_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Button.H ../FL/Fl_File_Input.H \ + ../FL/Fl_Return_Button.H ../FL/fl_message.H ../FL/fl_ask.H \ + ../FL/filename.H ../src/flstring.h ../FL/Fl_Export.H ../config.h \ + alignment_panel.h ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H \ + ../FL/Fl_Text_Buffer.H ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H \ + ../FL/Fl_Tabs.H ../FL/Fl_Light_Button.H ../FL/Fl_Spinner.H \ + ../FL/Enumerations.H ../FL/Fl_Repeat_Button.H ../FL/Fl_Round_Button.H \ + function_panel.h CodeEditor.h ../FL/Fl_Text_Editor.H \ + ../FL/Fl_Text_Display.H ../FL/Fl_Window.H template_panel.h \ + ../FL/Fl_Browser.H print_panel.cxx print_panel.h ../FL/Fl_Progress.H \ + ../FL/Fl_Pixmap.H about_panel.h undo.h Fl_Type.h ../FL/Fl_Menu.H \ + Fluid_Image.h ../FL/Fl_Shared_Image.H ../FL/Fl_Pack.H ../FL/Fl_Wizard.H \ + ../FL/Fl_Menu_.H ../FL/Fl_Input_Choice.H +function_panel.o: function_panel.cxx function_panel.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Group.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Button.H ../FL/Fl_Box.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H \ + ../FL/Fl_Button.H CodeEditor.h ../FL/Fl_Text_Buffer.H \ + ../FL/Fl_Text_Editor.H ../FL/Fl_Text_Display.H ../FL/fl_draw.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Text_Buffer.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Window.H ../FL/Fl_Tabs.H \ + ../FL/Fl_Pixmap.H Fl_Type.h ../FL/Fl_Widget.H ../FL/Fl_Menu.H \ + Fluid_Image.h ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/Fl_Pack.H \ + ../FL/Fl_Wizard.H ../FL/Fl_Menu_.H ../FL/Fl_Choice.H \ + ../FL/Fl_Input_Choice.H ../FL/Fl_Menu_Bar.H undo.h +template_panel.o: template_panel.cxx template_panel.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Browser.H \ + ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Box.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/Fl_Group.H ../FL/Fl_Button.H ../FL/Fl_Return_Button.H \ + ../FL/Fl_Button.H ../src/flstring.h ../FL/Fl_Export.H ../config.h \ + ../FL/filename.H ../FL/fl_ask.H ../FL/Fl_Shared_Image.H \ + ../FL/Fl_Image.H ../FL/Fl_Preferences.H +undo.o: undo.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + Fl_Type.h ../FL/Fl_Widget.H ../FL/Fl_Menu.H ../FL/Fl_Menu_Item.H \ + ../FL/Fl_Widget.H ../FL/Fl_Image.H Fluid_Image.h \ + ../FL/Fl_Shared_Image.H ../FL/fl_draw.H ../FL/Fl_Tabs.H \ + ../FL/Fl_Group.H ../FL/Fl_Pack.H ../FL/Fl_Group.H ../FL/Fl_Wizard.H \ + ../FL/Fl_Menu_.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Choice.H ../FL/Fl_Input_Choice.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Window.H ../FL/Fl_Menu_Bar.H undo.h \ + ../FL/Fl_Preferences.H ../src/flstring.h ../FL/Fl_Export.H ../config.h +widget_panel.o: widget_panel.cxx widget_panel.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Tabs.H \ + ../FL/Fl_Group.H ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Choice.H \ + ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H \ + ../FL/Fl_Button.H ../FL/Fl_Box.H ../FL/Fl_Value_Input.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Input.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Button.H Shortcut_Button.h CodeEditor.h ../FL/Fl_Text_Buffer.H \ + ../FL/Fl_Text_Editor.H ../FL/Fl_Text_Display.H ../FL/fl_draw.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Text_Buffer.H \ + ../FL/Fl_Return_Button.H diff --git a/third_party/windows/fltk-1.1.10/fluid/makefile.wat b/third_party/windows/fltk-1.1.10/fluid/makefile.wat new file mode 100644 index 0000000..436038f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/makefile.wat @@ -0,0 +1,79 @@ +# +# "$Id: makefile.wat 5699 2007-02-20 17:02:41Z matt $" +# +# FLUID makefile for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2004 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems to "fltk-bugs@fltk.org". +# + +OBJECTS = & + CodeEditor.obj & + Fl_Function_Type.obj & + Fl_Group_Type.obj & + Fl_Menu_Type.obj & + Fl_Type.obj & + Fl_Widget_Type.obj & + Fl_Window_Type.obj & + Fluid_Image.obj & + about_panel.obj & + align_widget.obj & + alignment_panel.obj & + code.obj & + factory.obj & + file.obj & + function_panel.obj & + template_panel.obj & + undo.obj & + widget_panel.obj + +# fluid.obj should not be in the list, because the watcom.mif file +# assumes an object file with the same name as the target executable + +################################################################ + +!include ../watcom.mif + +all: $(ODIR)/fluid$(EXEEXT) + +$(ODIR)\fluid$(EXEEXT): $(OBJECTS) $(LIBS) + +# +# Clean all directories +# +clean : .SYMBOLIC + @echo Cleaning up. +CLEANEXTS = exe map sym obj lk1 + @for %a in ($(CLEANEXTS)) do -rm -f $(ODIR)\*.%a + -rm -f *.err + +# +# Note: The rebuild target can only be used if you have the original .fl +# files. This is normally only used by the FLTK maintainers... +# + +rebuild: + ./fluid -c about_panel.fl + ./fluid -c alignment_panel.fl + ./fluid -c function_panel.fl + ./fluid -c widget_panel.fl + +# +# End of "$Id: makefile.wat 5699 2007-02-20 17:02:41Z matt $". +# diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flAdjuster.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flAdjuster.xpm new file mode 100644 index 0000000..d235a05 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flAdjuster.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flAdjuster_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #2020ff", +"c c none", +"d c #c0c0c0", +"e c #8080ff", +"f c #e0e0e0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"fffffffffffffffc", +"fdddafdddafdddac", +"fdddafdddafdddac", +"fdddafdddafdddac", +"fdddafdddafdddac", +"fdddafdddafdddac", +"fdddafdddafdddac", +"aaaaaaaaaaaaaaac", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flBox.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flBox.xpm new file mode 100644 index 0000000..3704ed8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flBox.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flBox_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #2020ff", +"c c none", +"d c #c0c0c0", +"e c #909090", +"f c #000000", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"dddddddddddddddc", +"dddddddddddddddc", +"deeeeeeeeeeeeedc", +"deeeeeeeeeeeeedc", +"deeeeeeeeeeeeedc", +"deeeeeeeeeeeeedc", +"deeeeeeeeeeeeedc", +"deeeeeeeeeeeeedc", +"deeeeeeeeeeeeedc", +"deeeeeeeeeeeeedc", +"dddddddddddddddc", +"dddddddddddddddc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flBrowser.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flBrowser.xpm new file mode 100644 index 0000000..06b354e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flBrowser.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flBrowser_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #808080", +"c c none", +"d c #c0c0c0", +"e c #ffffff", +"f c #000000", +/* pixels */ +"cccccccccccccccc", +"dddddddddddddddc", +"dfffffffffffffdc", +"dfeeeeeeeeebbfdc", +"dfeeeeeeeeebdfdc", +"dfeeeeeeeeebdfdc", +"dfeeeeeeeeebffdc", +"dfeeeeeeeeebdfdc", +"dfeeeeeeeeebdfdc", +"dfeeeeeeeeebdfdc", +"dfeeeeeeeeebdfdc", +"dfbbbbbbbbbbbfdc", +"dfbdddfddddbdfdc", +"dfffffffffffffdc", +"dddddddddddddddc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flButton.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flButton.xpm new file mode 100644 index 0000000..b6ffeb4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flButton.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flButton_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #2020ff", +"c c none", +"d c #a0a0a0", +"e c #8080ff", +"f c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffac", +"fdddddddddddddac", +"fdddddddddddddac", +"fdddddddddddddac", +"fdddddddddddddac", +"fdddddddddddddac", +"fdddddddddddddac", +"aaaaaaaaaaaaaaac", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCheckBrowser.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCheckBrowser.xpm new file mode 100644 index 0000000..a61bed9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCheckBrowser.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flCheckBrowser_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #808080", +"c c none", +"d c #c0c0c0", +"e c #ffffff", +"f c #000000", +/* pixels */ +"cccccccccccccccc", +"dddddddddddddddc", +"dfffffffffffffdc", +"dfeeeeeeeeebbfdc", +"dfefffeeeeebdfdc", +"dfefefeeeeebdfdc", +"dfefffeeeeebffdc", +"dfeeeeeeeeebdfdc", +"dfefffeeeeebdfdc", +"dfefefeeeeebdfdc", +"dfefffeeeeebdfdc", +"dfbbbbbbbbbbbfdc", +"dfbdddfddddbdfdc", +"dfffffffffffffdc", +"dddddddddddddddc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCheckButton.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCheckButton.xpm new file mode 100644 index 0000000..7cd73c3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCheckButton.xpm @@ -0,0 +1,30 @@ +/* XPM */ +static const char *flCheckButton_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 7 1", +/* colors */ +"a c #606060", +"b c #2020ff", +"c c none", +"d c #ffffff", +"e c #8080ff", +"f c #d0d0d0", +"' c #000000", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccaaaaaaaaaaccc", +"cccaddddddddfccc", +"cccadddddd''fccc", +"cccaddddd''dfccc", +"cccaddddd''dfccc", +"ccca''dd''ddfccc", +"cccad''''dddfccc", +"cccadd''ddddfccc", +"cccaddddddddfccc", +"cccaaaaaaaaaaccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flChoice.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flChoice.xpm new file mode 100644 index 0000000..244fa96 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flChoice.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flChoice_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +". c #000000", +"c c none", +"d c #b0b0b0", +"e c #ffffff", +"f c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffff", +"feeeeeafddddddda", +"feeeeeafddddddda", +"feeeeeaf.......a", +"feeeeeafd.....da", +"feeeeeafdd...dda", +"feeeeeafddd.ddda", +"feeeeeafddddddda", +"feeeeeafddddddda", +"aaaaaaaaaaaaaaaa", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flClass.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flClass.xpm new file mode 100644 index 0000000..ca7a431 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flClass.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static const char *flClass_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 4 1", +/* colors */ +". c none", +"a c #000000", +"b c #c0e0c0", +"c c #000000", +/* pixels */ +"................", +"................", +"...aaaaaaaaaaaaa", +"..abbbbbbbbbbbc.", +".abbbbbbbbbbbc..", +".abbbbbbbbbbbc..", +"abbbbbbbbbbbc...", +"abbbbbbbbbbbc...", +"abbbbbbbbbbbc...", +"abbbbbbbbbbbc...", +".abbbbbbbbbbbc..", +".abbbbbbbbbbbc..", +"..cbbbbbbbbbbbc.", +"...ccccccccccccc", +"................", +"................", +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flClock.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flClock.xpm new file mode 100644 index 0000000..179af53 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flClock.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *flClock_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 5 1", +/* colors */ +". c none", +"a c #000000", +"b c #c0c0c0", +"c c #000000", +"' c #202080", +/* pixels */ +"................", +"................", +"....aaaaaaa.....", +"..aabbbbbbbcc...", +".abbbbbbbbb'bc..", +".abb'bbbbb'bbc..", +"abbbb'bbb'bbbbc.", +"abbbbb'b'bbbbbc.", +"abbbbbb'bbbbbbc.", +"abbbbbbbbbbbbbc.", +"abbbbbbbbbbbbbc.", +".abbbbbbbbbbbc..", +".abbbbbbbbbbbc..", +"..ccbbbbbbbcc...", +"....ccccccc.....", +"................", +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCode.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCode.xpm new file mode 100644 index 0000000..af35df3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCode.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static const char *flCode_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 4 1", +/* colors */ +". c none", +"a c #000000", +"b c #c0e0c0", +"c c #000000", +/* pixels */ +"................", +"................", +"aaaaaaaaaaaaaaaa", +"abbbbbbbbbbbbbbc", +"abbbbbbbbbbbbbbc", +"abbbbbbbbbbbbbbc", +"abbbbbbbbbbbbbbc", +"abbbbbbbbbbbbbbc", +"abbbbbbbbbbbbbbc", +"abbbbbbbbbbbbbbc", +"abbbbbbbbbbbbbbc", +"abbbbbbbbbbbbbbc", +"abbbbbbbbbbbbbbc", +"accccccccccccccc", +"................", +"................", +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCodeBlock.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCodeBlock.xpm new file mode 100644 index 0000000..59abda7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCodeBlock.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static const char *flCodeBlock_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 4 1", +/* colors */ +". c none", +"a c #000000", +"b c #c0e0c0", +"c c #000000", +/* pixels */ +".......aa.......", +"......abbc......", +".....abbbbc.....", +"....abbbbbbc....", +"...abbbbbbbbc...", +"..abbbbbbbbbbc..", +".abbbbbbbbbbbbc.", +"abbbbbbbbbbbbbbc", +"abbbbbbbbbbbbbbc", +".abbbbbbbbbbbbc.", +"..abbbbbbbbbbc..", +"...abbbbbbbbc...", +"....abbbbbbc....", +".....abbbbc.....", +"......abbc......", +".......ac.......", +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flComment.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flComment.xpm new file mode 100644 index 0000000..ece76c5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flComment.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static const char *flComment_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 4 1", +/* colors */ +". c none", +"a c #000000", +"b c #c0e0c0", +"c c #000000", +/* pixels */ +"................", +"................", +".aaaaaaaaaaaaaa.", +".abbbbbbbbbbbbc.", +".abbbbbccbbccbc.", +".abbbbccbbccbbc.", +".abbbbccbbccbbc.", +".abbbccbbccbbbc.", +".abbbccbbccbbbc.", +".abbccbbccbbbbc.", +".abbccbbccbbbbc.", +".abccbbccbbbbbc.", +".abbbbbbbbbbbbc.", +".accccccccccccc.", +"................", +"................", +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCounter.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCounter.xpm new file mode 100644 index 0000000..8fec9cd --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flCounter.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flCounter_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"' c #000000", +"c c none", +"d c #c0c0c0", +"e c #ffffff", +"f c #e0e0e0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"fffffffffffffffc", +"fdddaeeeeefdddac", +"fd'daee'eefd'dac", +"f''dae''eefd''ac", +"f''daee'eefd''ac", +"fd'dae'''efd'dac", +"fdddaeeeeefdddac", +"aaaaaaaaaaaaaaac", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flDeclaration.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flDeclaration.xpm new file mode 100644 index 0000000..a1a7af4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flDeclaration.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static const char *flDeclaration_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 4 1", +/* colors */ +". c none", +"a c #000000", +"b c #c0e0c0", +"c c #000000", +/* pixels */ +"................", +"................", +"...aaaaaaaaaaaaa", +"...abbbbbbbbbbbc", +"...abbbbbbbbbbbc", +"..abbbbbbbbbbbc.", +"..abbbbbbbbbbbc.", +"..abbbbbbbbbbbc.", +".abbbbbbbbbbbc..", +".abbbbbbbbbbbc..", +".abbbbbbbbbbbc..", +"abbbbbbbbbbbc...", +"abbbbbbbbbbbc...", +"acccccccccccc...", +"................", +"................", +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flDeclarationBlock.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flDeclarationBlock.xpm new file mode 100644 index 0000000..60b2b91 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flDeclarationBlock.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static const char *flDeclarationBlock_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 4 1", +/* colors */ +". c none", +"a c #000000", +"b c #c0e0c0", +"c c #000000", +/* pixels */ +".......aa.......", +"......abbc......", +".....abbbbc.....", +"....abbbbbbc....", +"...abbbbbbbbc...", +"..abbbcbbcbbbc..", +".abbbccccccbbbc.", +"abbbbbcbbcbbbbbc", +"abbbbbcbbcbbbbbc", +".abbbccccccbbbc.", +"..abbbcbbcbbbc..", +"...abbbbbbbbc...", +"....abbbbbbc....", +".....abbbbc.....", +"......abbc......", +".......ac.......", +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flDial.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flDial.xpm new file mode 100644 index 0000000..e45a703 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flDial.xpm @@ -0,0 +1,28 @@ +/* XPM */ +static const char *flDial_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 5 1", +/* colors */ +". c none", +"a c #000000", +"b c #c0c0c0", +"c c #000000", +"' c #202080", +/* pixels */ +"................", +"................", +"....aaaaaaa.....", +"..aabbbbbbbcc...", +".abbbbbbbbbbbc..", +".ab''bbbbbbbbc..", +"ab'bb'bbbbbbbbc.", +"ab'bb'bbbbbbbbc.", +"abb''bbbbbbbbbc.", +"abbbbbbbbbbbbbc.", +"abbbbbbbbbbbbbc.", +".abbbbbbbbbbbc..", +".abbbbbbbbbbbc..", +"..ccbbbbbbbcc...", +"....ccccccc.....", +"................", +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flFileBrowser.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flFileBrowser.xpm new file mode 100644 index 0000000..d13587a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flFileBrowser.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flFileBrowser_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #ffff00", +"b c #808080", +"c c none", +"d c #c0c0c0", +"e c #ffffff", +"f c #000000", +/* pixels */ +"cccccccccccccccc", +"dddddddddddddddc", +"dfffffffffffffdc", +"dfeeeeeeeeebbfdc", +"dfeefffeeeebdfdc", +"dfefaaafffebdfdc", +"dfefaaaaafebffdc", +"dfefaaaaafebdfdc", +"dfefaaaaafebdfdc", +"dfefffffffebdfdc", +"dfeeeeeeeeebdfdc", +"dfbbbbbbbbbbbfdc", +"dfbdddfddddbdfdc", +"dfffffffffffffdc", +"dddddddddddddddc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flFileInput.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flFileInput.xpm new file mode 100644 index 0000000..e8b48a8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flFileInput.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flFileInput_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"f c #606060", +". c #000000", +"c c none", +"d c #ffffff", +"e c #8080ff", +"a c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffff", +"faaaaaaaafaaaaaa", +"ffffffffffffffff", +"fdddddddddddddda", +"fdd...dd..ddddda", +"fd.ddd.d..ddddda", +"fd.ddd.d..ddddda", +"fd.....d..ddddda", +"fd.ddd.d..ddddda", +"fd.ddd.d..ddddda", +"fdddddddddddddda", +"aaaaaaaaaaaaaaaa", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flFunction.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flFunction.xpm new file mode 100644 index 0000000..0746f9b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flFunction.xpm @@ -0,0 +1,27 @@ +/* XPM */ +static const char *flFunction_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 4 1", +/* colors */ +". c none", +"a c #000000", +"b c #c0e0c0", +"c c #000000", +/* pixels */ +"................", +"................", +"....aaaaaaaa....", +"..aabbbbbbbbcc..", +".abbbbbbbbbbbbc.", +".abbbbbbbbbbbbc.", +"abbbbbbbbbbbbbbc", +"abbbbbbbbbbbbbbc", +"abbbbbbbbbbbbbbc", +"abbbbbbbbbbbbbbc", +".abbbbbbbbbbbbc.", +".abbbbbbbbbbbbc.", +"..ccbbbbbbbbcc..", +"....cccccccc....", +"................", +"................", +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flGroup.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flGroup.xpm new file mode 100644 index 0000000..c1c70b5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flGroup.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flGroup_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #2020ff", +"c c none", +"d c #c0c0c0", +"e c #8080ff", +"f c #000000", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"dddddddddddddddc", +"dfffffffffffffdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfffffffffffffdc", +"dddddddddddddddc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flHelp.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flHelp.xpm new file mode 100644 index 0000000..9c7ff38 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flHelp.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flHelp_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #808080", +"c c none", +"d c #c0c0c0", +"e c #ffffff", +"f c #000000", +/* pixels */ +"cccccccccccccccc", +"dddddddddddddddc", +"dfffffffffffffdc", +"dfeeeeeeeeebbfdc", +"dfeeeffeeeebdfdc", +"dfeeffeeeeebdfdc", +"dfeffeeeeeebffdc", +"dfeeffeeeeebdfdc", +"dfeeeffeeeebdfdc", +"dfeeeeeeeeebdfdc", +"dfeeeeeeeeebdfdc", +"dfbbbbbbbbbbbfdc", +"dfbdddfddddbdfdc", +"dfffffffffffffdc", +"dddddddddddddddc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flInput.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flInput.xpm new file mode 100644 index 0000000..77575ee --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flInput.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flInput_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"f c #606060", +". c #000000", +"c c none", +"d c #ffffff", +"e c #8080ff", +"a c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffff", +"fdddddddddddddda", +"fdd...dd..ddddda", +"fd.ddd.d..ddddda", +"fd.ddd.d..ddddda", +"fd.....d..ddddda", +"fd.ddd.d..ddddda", +"fd.ddd.d..ddddda", +"fdddddddddddddda", +"aaaaaaaaaaaaaaaa", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flLightButton.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flLightButton.xpm new file mode 100644 index 0000000..b47d4a1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flLightButton.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flLightButton_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #ffff00", +"c c none", +"d c #a0a0a0", +"e c #8080ff", +"f c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffac", +"fdddddddddddddac", +"fdaaaaddddddddac", +"fdabbfddddddddac", +"fdabbfddddddddac", +"fdafffddddddddac", +"fdddddddddddddac", +"aaaaaaaaaaaaaaac", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flMenuButton.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flMenuButton.xpm new file mode 100644 index 0000000..f0ab6cd --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flMenuButton.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flMenuButton_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +". c #000000", +"c c none", +"d c #b0b0b0", +"e c #ffffff", +"f c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffff", +"fdddddddddddddda", +"fdddddddddddddda", +"fddddddd.......a", +"fdddddddd.ddd.da", +"fddddddddd.d.dda", +"fdddddddddd.ddda", +"fdddddddddddddda", +"fdddddddddddddda", +"aaaaaaaaaaaaaaaa", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flMenubar.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flMenubar.xpm new file mode 100644 index 0000000..e4d129e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flMenubar.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flMenubar_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +". c #2020cf", +"c c none", +"d c #b0b0b0", +"e c #ffffff", +"f c #e0e0e0", +/* pixels */ +"cccccccccccccccc", +"ffffffffffffffff", +"dddddddddddddddd", +"dddddddddddddddd", +"dddddddddddddddd", +"dddffffffffffffd", +"aaafddddddddddaa", +"cccfddddddddddac", +"cccfddddddddddac", +"cccfddddddddddac", +"cccfddddddddddac", +"cccfddddddddddac", +"cccfddddddddddac", +"cccfddddddddddac", +"cccfaaaaaaaaaaac", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flMenuitem.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flMenuitem.xpm new file mode 100644 index 0000000..623e09e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flMenuitem.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flMenuitem_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +". c #000000", +"c c none", +"d c #b0b0b0", +"e c #d0d0d0", +"f c #c0c0c0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccffffccccccccc", +"c.fffffffccccf.c", +"c.ffffffffffff.c", +"c.eeeeeeeeeeee.c", +"c.ee.ee.eeeeee.c", +"c.e.e.e.eee..e.c", +"c.e...e..e.eee.c", +"c.e.e.e..e.eee.c", +"c.e.e.e..ee..e.c", +"c.eeeeeeeeeeee.c", +"c.ffffffffffff.c", +"c.fccccfffffff.c", +"cccccccccffffccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flOutput.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flOutput.xpm new file mode 100644 index 0000000..a7449d4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flOutput.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flOutput_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"f c #606060", +". c #000000", +"c c none", +"d c #d0d0d0", +"e c #8080ff", +"a c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffff", +"fdddddddddddddda", +"fdd...ddddddddda", +"fd.ddd.dddddddda", +"fd.ddd.dddddddda", +"fd.....dddddddda", +"fd.ddd.dddddddda", +"fd.ddd.dddddddda", +"fdddddddddddddda", +"aaaaaaaaaaaaaaaa", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flPack.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flPack.xpm new file mode 100644 index 0000000..f3a2c38 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flPack.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flPack_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #f0f0f0", +"c c none", +"d c #c0c0c0", +"e c #8080ff", +"f c #000000", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"dddddddddddddddc", +"dfffffffffffffdc", +"dfddfddfddfddfdc", +"dfddfddfddfddfdc", +"dfddfddfddfddfdc", +"dfddfddfddfddfdc", +"dfddfddfddfddfdc", +"dfddfddfddfddfdc", +"dfddfddfddfddfdc", +"dfddfddfddfddfdc", +"dfffffffffffffdc", +"dddddddddddddddc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flProgress.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flProgress.xpm new file mode 100644 index 0000000..88af00c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flProgress.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flProgress_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"f c #606060", +". c #f0f000", +"c c none", +"d c #ffffff", +"e c #8080ff", +"a c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffff", +"f.........ddddda", +"f.........ddddda", +"f.........ddddda", +"f.........ddddda", +"f.........ddddda", +"f.........ddddda", +"aaaaaaaaaaaaaaaa", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flRepeatButton.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flRepeatButton.xpm new file mode 100644 index 0000000..f85eb39 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flRepeatButton.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flRepeatButton_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"' c #000000", +"c c none", +"d c #a0a0a0", +"e c #8080ff", +"f c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffac", +"fdddddddddddddac", +"fdddddddddddddac", +"fdddddddddddddac", +"fdddd''d''d''dac", +"fdddd''d''d''dac", +"fdddddddddddddac", +"aaaaaaaaaaaaaaac", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flReturnButton.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flReturnButton.xpm new file mode 100644 index 0000000..6af4e15 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flReturnButton.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flReturnButton_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"' c #000000", +"c c none", +"d c #a0a0a0", +"e c #8080ff", +"f c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffac", +"fdddddddddddddac", +"fddddddd'dd''dac", +"fdddddd''dd''dac", +"fddddd'''''''dac", +"fdddddd''dddddac", +"fddddddd'dddddac", +"aaaaaaaaaaaaaaac", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flRoller.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flRoller.xpm new file mode 100644 index 0000000..15aad3e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flRoller.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flRoller_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #e0e0e0", +"' c #000000", +"c c none", +"d c #c0c0c0", +"e c #ffffff", +"f c #606060", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"aaaaaaaaaaaaaaac", +"a'f'ee'ddd'dd'f'", +"a'f'ee'ddd'dd'f'", +"a'f'ee'ddd'dd'f'", +"a'f'ee'ddd'dd'f'", +"a'f'ee'ddd'dd'f'", +"a'f'ee'ddd'dd'f'", +"''''''''''''''''", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flRoundButton.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flRoundButton.xpm new file mode 100644 index 0000000..6596db5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flRoundButton.xpm @@ -0,0 +1,30 @@ +/* XPM */ +static const char *flRoundButton_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 7 1", +/* colors */ +"a c #606060", +"b c #2020ff", +". c none", +"d c #ffffff", +"e c #8080ff", +"f c #d0d0d0", +"# c #000000", +/* pixels */ +"................", +"................", +"......aaa.......", +"....aadddaa.....", +"...adddddddf....", +"...add###ddf....", +"..add#####ddf...", +"..add#####ddf...", +"..add#####ddf...", +"...add###ddf....", +"...adddddddf....", +"....ffdddff.....", +"......fff.......", +"................", +"................", +"................" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flScroll.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flScroll.xpm new file mode 100644 index 0000000..ced8271 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flScroll.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flScroll_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #f0f0f0", +"c c none", +"d c #c0c0c0", +"e c #8080ff", +"f c #000000", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"dddddddddddddddc", +"dfffffffffffffdc", +"dfddddddddbbbfdc", +"dfddddddddbddfdc", +"dfddddddddbddfdc", +"dfddddddddbfffdc", +"dfddddddddbddfdc", +"dfbbbbbbbbbbbfdc", +"dfbdddfdddbddfdc", +"dfbdddfdddbddfdc", +"dfffffffffffffdc", +"dddddddddddddddc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flScrollBar.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flScrollBar.xpm new file mode 100644 index 0000000..b19a67a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flScrollBar.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flScrollBar_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #2020ff", +"c c none", +"d c #c0c0c0", +"e c #8080ff", +"f c #e0e0e0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"aaaaaaaaaaaaaaaa", +"adddfffffddddddf", +"ad'dfdddadddd'df", +"a''dfdddadddd''f", +"a''dfdddadddd''f", +"ad'dfdddadddd'df", +"adddfaaaaddddddf", +"afffffffffffffff", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flSlider.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flSlider.xpm new file mode 100644 index 0000000..8be2caa --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flSlider.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flSlider_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #2020ff", +"c c none", +"d c #c0c0c0", +"e c #8080ff", +"f c #e0e0e0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"aaaaaaaaaaaaaaaa", +"afffffdddddddddf", +"afdddadddddddddf", +"afdddadddddddddf", +"afdddadddddddddf", +"afdddadddddddddf", +"afaaaadddddddddf", +"afffffffffffffff", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flSpinner.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flSpinner.xpm new file mode 100644 index 0000000..c907446 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flSpinner.xpm @@ -0,0 +1,25 @@ +/* XPM */ +static const char *flSpinner_xpm[]={ +"16 16 6 1", +". c None", +"c c #000000", +"d c #606060", +"b c #c0c0c0", +"# c #e0e0e0", +"a c #ffffff", +"................", +"................", +"................", +"................", +"###############.", +"#aaaaaaaaa#bcbd.", +"#aaaaaacaa#cccd.", +"#aaaaaccaaddddd.", +"#aaaaaacaa####d.", +"#aaaaaccca#cccd.", +"#aaaaaaaaa#bcbd.", +"ddddddddddddddd.", +"................", +"................", +"................", +"................"}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flSubmenu.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flSubmenu.xpm new file mode 100644 index 0000000..9e9a9cd --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flSubmenu.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flSubmenu_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +". c #000000", +"c c none", +"d c #b0b0b0", +"e c #d0d0d0", +"f c #c0c0c0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccffffccccccccc", +"c.fffffffccccf.c", +"c.ffffffffffff.c", +"c.eeeeeeeeeeee.c", +"c.ee.eeeee.eee.c", +"c.e.e.eeee..ee.c", +"c.e...eeee...e.c", +"c.e.e.eeee..ee.c", +"c.e.e.eeee.eee.c", +"c.eeeeeeeee.....", +"c.fffffffff.ffff", +"c.fccccffff.ffff", +"cccccccccff.ffff", +"ccccccccccc.ffff" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flTabs.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flTabs.xpm new file mode 100644 index 0000000..4234d0d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flTabs.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flTabs_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #a0a0a0", +"b c #2020ff", +"c c none", +"d c #c0c0c0", +"e c #8080ff", +"f c #000000", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"dddddddddddddddc", +"ddffffdffffddddc", +"dfddddfaaaafdddc", +"dfddddfaaaafdddc", +"dfddddffffffffdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfffffffffffffdc", +"dddddddddddddddc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flTextDisplay.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flTextDisplay.xpm new file mode 100644 index 0000000..72e1f05 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flTextDisplay.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flTextDisplay_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"f c #606060", +". c #000000", +"c c none", +"d c #d0d0d0", +"e c #8080ff", +"a c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"ffffffffffffffff", +"fdddddddddddddda", +"fdd...ddddddddda", +"fd.ddd.dddddddda", +"fd.ddd.dddddddda", +"fd.....dddddddda", +"fd.ddd.dddddddda", +"fd.ddd.dddddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"aaaaaaaaaaaaaaaa", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flTextEdit.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flTextEdit.xpm new file mode 100644 index 0000000..b3d2d4a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flTextEdit.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flTextEdit_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"f c #606060", +". c #000000", +"c c none", +"d c #ffffff", +"e c #8080ff", +"a c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"ffffffffffffffff", +"fdddddddddddddda", +"fdd...dd..ddddda", +"fd.ddd.d..ddddda", +"fd.ddd.d..ddddda", +"fd.....d..ddddda", +"fd.ddd.d..ddddda", +"fd.ddd.d..ddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"aaaaaaaaaaaaaaaa", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flTile.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flTile.xpm new file mode 100644 index 0000000..73534b2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flTile.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flTile_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #f0f0f0", +"c c none", +"d c #c0c0c0", +"e c #8080ff", +"f c #000000", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"dddddddddddddddd", +"dfffffffffffffbd", +"dfdddddbfdddddbd", +"dfdddddbfdddddbd", +"dfdddddbfdddddbdc", +"dfbbbbbbfbbbbbbd", +"dfffffffffffffbd", +"dfdddddbfdddddbd", +"dfdddddbfdddddbd", +"dfdddddbfdddddbd", +"dfbbbbbbfbbbbbbd", +"dddddddddddddddd", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flValueInput.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flValueInput.xpm new file mode 100644 index 0000000..aa1b475 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flValueInput.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flValueInput_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"f c #606060", +". c #000000", +"c c none", +"d c #ffffff", +"e c #8080ff", +"a c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffff", +"fdddddddddddddda", +"fdd...dd..ddddda", +"fd.dd..d..ddddda", +"fd.d.d.d..ddddda", +"fd..dd.d..ddddda", +"fd.ddd.d..ddddda", +"fdd...dd..ddddda", +"fdddddddddddddda", +"aaaaaaaaaaaaaaaa", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flValueOutput.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flValueOutput.xpm new file mode 100644 index 0000000..856cb97 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flValueOutput.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flValueOutput_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"f c #606060", +". c #000000", +"c c none", +"d c #d0d0d0", +"e c #8080ff", +"a c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffff", +"fdddddddddddddda", +"fdd...ddddddddda", +"fd.dd..dddddddda", +"fd.d.d.dddddddda", +"fd..dd.dddddddda", +"fd.ddd.dddddddda", +"fdd...ddddddddda", +"fdddddddddddddda", +"aaaaaaaaaaaaaaaa", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flValueSlider.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flValueSlider.xpm new file mode 100644 index 0000000..d166b22 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flValueSlider.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flValueSlider_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #2020ff", +"c c none", +"d c #c0c0c0", +"' c #000000", +"f c #e0e0e0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"aaaaaaaaaaaaaaaa", +"adddddfffffddddf", +"add'ddfdddaddddf", +"ad''ddfdddaddddf", +"add'ddfdddaddddf", +"ad'''dfdddaddddf", +"adddddfaaaaddddf", +"afffffffffffffff", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flWidgetClass.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flWidgetClass.xpm new file mode 100644 index 0000000..9a8ecef --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flWidgetClass.xpm @@ -0,0 +1,31 @@ +/* XPM */ +static const char *flWidgetClass_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 8 1", +/* colors */ +"a c #606060", +"b c #2020ff", +"c c none", +"d c #a0a0a0", +"e c #8080ff", +"f c #d0d0d0", +"g c #c0e0c0", +"h c #000000", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffff", +"feebbbbbbbeebeea", +"feebbbbbbbeebeea", +"fdddhhhhhhhhhhda", +"fddhgggggggghdda", +"fdhgggggggghddda", +"fdhgggggggghddda", +"fdhgggggggghddda", +"fdhgggggggghddda", +"fddhgggggggghdda", +"fdddhhhhhhhhhhda", +"faaaaaaaaaaaaaaa", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flWindow.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flWindow.xpm new file mode 100644 index 0000000..e90d840 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flWindow.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flWindow_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #2020ff", +"c c none", +"d c #a0a0a0", +"e c #8080ff", +"f c #d0d0d0", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"ffffffffffffffff", +"feebbbbbbbeebeea", +"feebbbbbbbeebeea", +"fdddddddddddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"fdddddddddddddda", +"faaaaaaaaaaaaaaa", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/flWizard.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flWizard.xpm new file mode 100644 index 0000000..75ef378 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/flWizard.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *flWizard_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"a c #606060", +"b c #f0f0f0", +"c c none", +"d c #c0c0c0", +"e c #8080ff", +"f c #000000", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"dddddddddddddddc", +"dfffffffffffffdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfdddddddddddfdc", +"dfbbbbbbbbbbbfdc", +"dfbddddfbdbddfdc", +"dfbddddfbdbddfdc", +"dfffffffffffffdc", +"dddddddddddddddc", +"cccccccccccccccc", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/lock.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/lock.xpm new file mode 100644 index 0000000..981e693 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/lock.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *lock_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"` c #000000", +"a c #c08080", +"b c #FFc0c0", +"c c none", +"d c #FFc0c0", +"e c #804040", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccc```ccc", +"ccccccccc`daa`cc", +"cccccccc`da`bd`c", +"cccccccc`a`c`d`c", +"ccccccc`````````", +"ccccccc`dddaaae`", +"ccccccc`daa`aae`", +"ccccccc`da`eaae`", +"ccccccc`da`daee`", +"ccccccc`````````", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/print_color.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/print_color.xpm new file mode 100644 index 0000000..6662007 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/print_color.xpm @@ -0,0 +1,44 @@ +/* XPM */ +static char * print_color_xpm[] = { +"24 24 17 1", +" c None", +". c #FFFF00", +"+ c #C8FF00", +"@ c #00FF00", +"# c #FFC800", +"$ c #FF0000", +"% c #00FFFF", +"& c #000000", +"* c #FF00FF", +"= c #00FFC8", +"- c #FF00C8", +"; c #00C800", +"> c #C80000", +", c #0000C8", +"' c #0000FF", +") c #00C8FF", +"! c #C800FF", +" ...... ", +" .......... ", +" ............ ", +" .............. ", +" .............. ", +" ................ ", +" ................ ", +" ................ ", +" +@@@@@@+#$$$$$$# ", +" %@@@@@@@&&$$$$$$$* ", +" %%@@@@@@&&&&$$$$$$** ", +" %%%=@@@@&&&&&&$$$$-*** ", +" %%%%@@@;&&&&&&>$$$**** ", +"%%%%%%@@&&&&&&&&$$******", +"%%%%%%%@&&&&&&&&$*******", +"%%%%%%%%,&&&&&&,********", +"%%%%%%%%''''''''********", +"%%%%%%%%''''''''********", +"%%%%%%%%''''''''********", +" %%%%%%%)''''''!******* ", +" %%%%%%%%''''''******** ", +" %%%%%%%%''''******** ", +" %%%%%%%%''******** ", +" %%%%%% ****** "}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/print_gray.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/print_gray.xpm new file mode 100644 index 0000000..2c292d2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/print_gray.xpm @@ -0,0 +1,44 @@ +/* XPM */ +static char * print_gray_xpm[] = { +"24 24 17 1", +" c None", +". c #E3E3E3", +"+ c #D2D2D2", +"@ c #969696", +"# c #C2C2C2", +"$ c #4C4C4C", +"% c #B2B2B2", +"& c #000000", +"* c #696969", +"= c #ACACAC", +"- c #626262", +"; c #767676", +"> c #3C3C3C", +", c #161616", +"' c #1C1C1C", +") c #929292", +"! c #585858", +" ...... ", +" .......... ", +" ............ ", +" .............. ", +" .............. ", +" ................ ", +" ................ ", +" ................ ", +" +@@@@@@+#$$$$$$# ", +" %@@@@@@@&&$$$$$$$* ", +" %%@@@@@@&&&&$$$$$$** ", +" %%%=@@@@&&&&&&$$$$-*** ", +" %%%%@@@;&&&&&&>$$$**** ", +"%%%%%%@@&&&&&&&&$$******", +"%%%%%%%@&&&&&&&&$*******", +"%%%%%%%%,&&&&&&,********", +"%%%%%%%%''''''''********", +"%%%%%%%%''''''''********", +"%%%%%%%%''''''''********", +" %%%%%%%)''''''!******* ", +" %%%%%%%%''''''******** ", +" %%%%%%%%''''******** ", +" %%%%%%%%''******** ", +" %%%%%% ****** "}; diff --git a/third_party/windows/fltk-1.1.10/fluid/pixmaps/protected.xpm b/third_party/windows/fltk-1.1.10/fluid/pixmaps/protected.xpm new file mode 100644 index 0000000..46baa6d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/pixmaps/protected.xpm @@ -0,0 +1,29 @@ +/* XPM */ +static const char *protected_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 6 1", +/* colors */ +"` c #000000", +"a c #80c080", +"b c #c0ffc0", +"c c none", +"d c #c0ffc0", +"e c #408040", +/* pixels */ +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccccccccc", +"cccccccccc```ccc", +"ccccccccc`daa`cc", +"cccccccc`da`bd`c", +"cccccccc`a`c`d`c", +"ccccccc`````````", +"ccccccc`dddaaae`", +"ccccccc`daa`aae`", +"ccccccc`da`eaae`", +"ccccccc`da`daee`", +"ccccccc`````````", +"cccccccccccccccc" +}; diff --git a/third_party/windows/fltk-1.1.10/fluid/print_panel.cxx b/third_party/windows/fltk-1.1.10/fluid/print_panel.cxx new file mode 100644 index 0000000..19ce32b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/print_panel.cxx @@ -0,0 +1,588 @@ +// +// "$Id$" +// +// FLUID print panel for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0110 + +#include "print_panel.h" +#include +#include +#include "../src/flstring.h" +#include +extern Fl_Preferences fluid_prefs; + +Fl_Double_Window *print_panel=(Fl_Double_Window *)0; + +Fl_Group *print_panel_controls=(Fl_Group *)0; + +Fl_Choice *print_choice=(Fl_Choice *)0; + +static void cb_print_choice(Fl_Choice*, void*) { + print_update_status(); +} + +Fl_Button *print_properties=(Fl_Button *)0; + +static void cb_print_properties(Fl_Button*, void*) { + print_properties_panel->show(); +} + +Fl_Box *print_status=(Fl_Box *)0; + +Fl_Round_Button *print_all=(Fl_Round_Button *)0; + +static void cb_print_all(Fl_Round_Button*, void*) { + print_from->deactivate(); +print_to->deactivate(); +} + +Fl_Round_Button *print_pages=(Fl_Round_Button *)0; + +static void cb_print_pages(Fl_Round_Button*, void*) { + print_from->activate(); +print_to->activate(); +} + +Fl_Round_Button *print_selection=(Fl_Round_Button *)0; + +static void cb_print_selection(Fl_Round_Button*, void*) { + print_from->deactivate(); +print_to->deactivate(); +} + +Fl_Input *print_from=(Fl_Input *)0; + +Fl_Input *print_to=(Fl_Input *)0; + +Fl_Spinner *print_copies=(Fl_Spinner *)0; + +static void cb_print_copies(Fl_Spinner*, void*) { + if (print_copies->value() == 1) { + print_collate_button->deactivate(); + print_collate_group[0]->deactivate(); + print_collate_group[1]->deactivate(); +} else { + print_collate_button->activate(); + print_collate_group[0]->activate(); + print_collate_group[1]->activate(); +}; +} + +Fl_Check_Button *print_collate_button=(Fl_Check_Button *)0; + +static void cb_print_collate_button(Fl_Check_Button*, void*) { + int i = print_collate_button->value() != 0; +print_collate_group[i]->show(); +print_collate_group[1 - i]->hide(); +} + +Fl_Group *print_collate_group[2]={(Fl_Group *)0}; + +static void cb_Cancel(Fl_Button*, void*) { + print_panel->hide(); +} + +Fl_Progress *print_progress=(Fl_Progress *)0; + +Fl_Double_Window *print_properties_panel=(Fl_Double_Window *)0; + +static void cb_print_properties_panel(Fl_Double_Window*, void*) { + print_properties_panel->hide(); +print_update_status(); +} + +Fl_Choice *print_page_size=(Fl_Choice *)0; + +Fl_Menu_Item menu_print_page_size[] = { + {"Letter", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {"A4", 0, 0, 0, 0, FL_NORMAL_LABEL, 0, 14, 0}, + {0,0,0,0,0,0,0,0,0} +}; + +#include +static const char *idata_print_color[] = { +"24 24 17 1", +" \tc None", +".\tc #FFFF00", +"+\tc #C8FF00", +"@\tc #00FF00", +"#\tc #FFC800", +"$\tc #FF0000", +"%\tc #00FFFF", +"&\tc #000000", +"*\tc #FF00FF", +"=\tc #00FFC8", +"-\tc #FF00C8", +";\tc #00C800", +">\tc #C80000", +",\tc #0000C8", +"\'\tc #0000FF", +")\tc #00C8FF", +"!\tc #C800FF", +" ...... ", +" .......... ", +" ............ ", +" .............. ", +" .............. ", +" ................ ", +" ................ ", +" ................ ", +" +@@@@@@+#$$$$$$# ", +" %@@@@@@@&&$$$$$$$* ", +" %%@@@@@@&&&&$$$$$$** ", +" %%%=@@@@&&&&&&$$$$-*** ", +" %%%%@@@;&&&&&&>$$$**** ", +"%%%%%%@@&&&&&&&&$$******", +"%%%%%%%@&&&&&&&&$*******", +"%%%%%%%%,&&&&&&,********", +"%%%%%%%%\'\'\'\'\'\'\'\'********", +"%%%%%%%%\'\'\'\'\'\'\'\'********", +"%%%%%%%%\'\'\'\'\'\'\'\'********", +" %%%%%%%)\'\'\'\'\'\'!******* ", +" %%%%%%%%\'\'\'\'\'\'******** ", +" %%%%%%%%\'\'\'\'******** ", +" %%%%%%%%\'\'******** ", +" %%%%%% ****** " +}; +static Fl_Pixmap image_print_color(idata_print_color); + +static const char *idata_print_gray[] = { +"24 24 17 1", +" \tc None", +".\tc #E3E3E3", +"+\tc #D2D2D2", +"@\tc #969696", +"#\tc #C2C2C2", +"$\tc #4C4C4C", +"%\tc #B2B2B2", +"&\tc #000000", +"*\tc #696969", +"=\tc #ACACAC", +"-\tc #626262", +";\tc #767676", +">\tc #3C3C3C", +",\tc #161616", +"\'\tc #1C1C1C", +")\tc #929292", +"!\tc #585858", +" ...... ", +" .......... ", +" ............ ", +" .............. ", +" .............. ", +" ................ ", +" ................ ", +" ................ ", +" +@@@@@@+#$$$$$$# ", +" %@@@@@@@&&$$$$$$$* ", +" %%@@@@@@&&&&$$$$$$** ", +" %%%=@@@@&&&&&&$$$$-*** ", +" %%%%@@@;&&&&&&>$$$**** ", +"%%%%%%@@&&&&&&&&$$******", +"%%%%%%%@&&&&&&&&$*******", +"%%%%%%%%,&&&&&&,********", +"%%%%%%%%\'\'\'\'\'\'\'\'********", +"%%%%%%%%\'\'\'\'\'\'\'\'********", +"%%%%%%%%\'\'\'\'\'\'\'\'********", +" %%%%%%%)\'\'\'\'\'\'!******* ", +" %%%%%%%%\'\'\'\'\'\'******** ", +" %%%%%%%%\'\'\'\'******** ", +" %%%%%%%%\'\'******** ", +" %%%%%% ****** " +}; +static Fl_Pixmap image_print_gray(idata_print_gray); + +Fl_Button *print_output_mode[4]={(Fl_Button *)0}; + +static void cb_Save(Fl_Return_Button*, void*) { + print_properties_panel->hide(); + +char name[1024]; +int val; +const char *printer = (const char *)print_choice->menu()[print_choice->value()].user_data(); + +snprintf(name, sizeof(name), "%s/page_size", printer); +fluid_prefs.set(name, print_page_size->value()); + +snprintf(name, sizeof(name), "%s/output_mode", printer); +for (val = 0; val < 4; val ++) { + if (print_output_mode[val]->value()) break; +} +fluid_prefs.set(name, val); +} + +static void cb_Cancel1(Fl_Button*, void*) { + print_properties_panel->hide(); +print_update_status(); +} + +static void cb_Use(Fl_Button*, void*) { + print_properties_panel->hide(); +} + +Fl_Double_Window* make_print_panel() { + { print_panel = new Fl_Double_Window(465, 235, "Print"); + { print_panel_controls = new Fl_Group(10, 10, 447, 216); + { print_choice = new Fl_Choice(113, 10, 181, 25, "Printer:"); + print_choice->down_box(FL_BORDER_BOX); + print_choice->labelfont(1); + print_choice->callback((Fl_Callback*)cb_print_choice); + print_choice->when(FL_WHEN_CHANGED); + } // Fl_Choice* print_choice + { print_properties = new Fl_Button(294, 10, 105, 25, "Properties..."); + print_properties->callback((Fl_Callback*)cb_print_properties); + } // Fl_Button* print_properties + { print_status = new Fl_Box(111, 41, 288, 17, "printer/job status"); + print_status->align(68|FL_ALIGN_INSIDE); + } // Fl_Box* print_status + { Fl_Group* o = new Fl_Group(10, 86, 227, 105, "Print Range"); + o->box(FL_THIN_DOWN_BOX); + o->labelfont(1); + o->align(FL_ALIGN_TOP_LEFT); + { print_all = new Fl_Round_Button(20, 96, 38, 25, "All"); + print_all->type(102); + print_all->down_box(FL_ROUND_DOWN_BOX); + print_all->value(1); + print_all->callback((Fl_Callback*)cb_print_all); + } // Fl_Round_Button* print_all + { print_pages = new Fl_Round_Button(20, 126, 64, 25, "Pages"); + print_pages->type(102); + print_pages->down_box(FL_ROUND_DOWN_BOX); + print_pages->callback((Fl_Callback*)cb_print_pages); + } // Fl_Round_Button* print_pages + { print_selection = new Fl_Round_Button(20, 156, 82, 25, "Selection"); + print_selection->type(102); + print_selection->down_box(FL_ROUND_DOWN_BOX); + print_selection->callback((Fl_Callback*)cb_print_selection); + } // Fl_Round_Button* print_selection + { print_from = new Fl_Input(136, 126, 28, 25, "From:"); + print_from->type(2); + print_from->textfont(4); + print_from->deactivate(); + } // Fl_Input* print_from + { print_to = new Fl_Input(199, 126, 28, 25, "To:"); + print_to->type(2); + print_to->textfont(4); + print_to->deactivate(); + } // Fl_Input* print_to + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(247, 86, 210, 105, "Copies"); + o->box(FL_THIN_DOWN_BOX); + o->labelfont(1); + o->align(FL_ALIGN_TOP_LEFT); + { print_copies = new Fl_Spinner(321, 96, 45, 25, "# Copies:"); + print_copies->callback((Fl_Callback*)cb_print_copies); + print_copies->when(FL_WHEN_CHANGED); + } // Fl_Spinner* print_copies + { print_collate_button = new Fl_Check_Button(376, 96, 64, 25, "Collate"); + print_collate_button->down_box(FL_DOWN_BOX); + print_collate_button->callback((Fl_Callback*)cb_print_collate_button); + print_collate_button->when(FL_WHEN_CHANGED); + print_collate_button->deactivate(); + } // Fl_Check_Button* print_collate_button + { print_collate_group[0] = new Fl_Group(257, 131, 191, 50); + print_collate_group[0]->deactivate(); + { Fl_Box* o = new Fl_Box(287, 141, 30, 40, "1"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + o->deactivate(); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(272, 136, 30, 40, "1"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + o->deactivate(); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(257, 131, 30, 40, "1"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + o->deactivate(); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(352, 141, 30, 40, "2"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + o->deactivate(); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(337, 136, 30, 40, "2"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + o->deactivate(); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(322, 131, 30, 40, "2"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + o->deactivate(); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(417, 141, 30, 40, "3"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + o->deactivate(); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(402, 136, 30, 40, "3"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + o->deactivate(); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(387, 131, 30, 40, "3"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + o->deactivate(); + } // Fl_Box* o + print_collate_group[0]->end(); + } // Fl_Group* print_collate_group[0] + { print_collate_group[1] = new Fl_Group(257, 131, 191, 50); + print_collate_group[1]->hide(); + print_collate_group[1]->deactivate(); + { Fl_Box* o = new Fl_Box(287, 141, 30, 40, "3"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(272, 136, 30, 40, "2"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(257, 131, 30, 40, "1"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(352, 141, 30, 40, "3"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(337, 136, 30, 40, "2"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(322, 131, 30, 40, "1"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(417, 141, 30, 40, "3"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(402, 136, 30, 40, "2"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + } // Fl_Box* o + { Fl_Box* o = new Fl_Box(387, 131, 30, 40, "1"); + o->box(FL_BORDER_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->labelsize(11); + o->align(FL_ALIGN_BOTTOM_RIGHT|FL_ALIGN_INSIDE); + } // Fl_Box* o + print_collate_group[1]->end(); + } // Fl_Group* print_collate_group[1] + o->end(); + } // Fl_Group* o + { Fl_Return_Button* o = new Fl_Return_Button(309, 201, 70, 25, "Print"); + o->callback((Fl_Callback*)print_cb); + } // Fl_Return_Button* o + { Fl_Button* o = new Fl_Button(389, 201, 68, 25, "Cancel"); + o->callback((Fl_Callback*)cb_Cancel); + } // Fl_Button* o + print_panel_controls->end(); + } // Fl_Group* print_panel_controls + { print_progress = new Fl_Progress(10, 203, 289, 21); + print_progress->selection_color((Fl_Color)4); + print_progress->hide(); + } // Fl_Progress* print_progress + print_panel->set_modal(); + print_panel->end(); + } // Fl_Double_Window* print_panel + { print_properties_panel = new Fl_Double_Window(290, 130, "Printer Properties"); + print_properties_panel->callback((Fl_Callback*)cb_print_properties_panel); + { print_page_size = new Fl_Choice(110, 10, 80, 25, "Page Size:"); + print_page_size->down_box(FL_BORDER_BOX); + print_page_size->labelfont(1); + print_page_size->menu(menu_print_page_size); + } // Fl_Choice* print_page_size + { Fl_Group* o = new Fl_Group(110, 45, 170, 40, "Output Mode:"); + o->labelfont(1); + o->align(FL_ALIGN_LEFT); + { print_output_mode[0] = new Fl_Button(110, 45, 30, 40); + print_output_mode[0]->type(102); + print_output_mode[0]->box(FL_BORDER_BOX); + print_output_mode[0]->down_box(FL_BORDER_BOX); + print_output_mode[0]->value(1); + print_output_mode[0]->color(FL_BACKGROUND2_COLOR); + print_output_mode[0]->selection_color(FL_FOREGROUND_COLOR); + print_output_mode[0]->image(image_print_color); + } // Fl_Button* print_output_mode[0] + { print_output_mode[1] = new Fl_Button(150, 50, 40, 30); + print_output_mode[1]->type(102); + print_output_mode[1]->box(FL_BORDER_BOX); + print_output_mode[1]->down_box(FL_BORDER_BOX); + print_output_mode[1]->color(FL_BACKGROUND2_COLOR); + print_output_mode[1]->selection_color(FL_FOREGROUND_COLOR); + print_output_mode[1]->image(image_print_color); + } // Fl_Button* print_output_mode[1] + { print_output_mode[2] = new Fl_Button(200, 45, 30, 40); + print_output_mode[2]->type(102); + print_output_mode[2]->box(FL_BORDER_BOX); + print_output_mode[2]->down_box(FL_BORDER_BOX); + print_output_mode[2]->color(FL_BACKGROUND2_COLOR); + print_output_mode[2]->selection_color(FL_FOREGROUND_COLOR); + print_output_mode[2]->image(image_print_gray); + } // Fl_Button* print_output_mode[2] + { print_output_mode[3] = new Fl_Button(240, 50, 40, 30); + print_output_mode[3]->type(102); + print_output_mode[3]->box(FL_BORDER_BOX); + print_output_mode[3]->down_box(FL_BORDER_BOX); + print_output_mode[3]->color(FL_BACKGROUND2_COLOR); + print_output_mode[3]->selection_color(FL_FOREGROUND_COLOR); + print_output_mode[3]->image(image_print_gray); + } // Fl_Button* print_output_mode[3] + o->end(); + } // Fl_Group* o + { Fl_Return_Button* o = new Fl_Return_Button(123, 95, 79, 25, "Save"); + o->callback((Fl_Callback*)cb_Save); + } // Fl_Return_Button* o + { Fl_Button* o = new Fl_Button(212, 95, 68, 25, "Cancel"); + o->callback((Fl_Callback*)cb_Cancel1); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(60, 95, 53, 25, "Use"); + o->callback((Fl_Callback*)cb_Use); + } // Fl_Button* o + print_properties_panel->set_modal(); + print_properties_panel->end(); + } // Fl_Double_Window* print_properties_panel + return print_properties_panel; +} +void print_cb(Fl_Return_Button *, void *); + +void print_load() { + FILE *lpstat; +char line[1024], name[1024], *nptr, qname[2048], *qptr, defname[1024]; +int i; + +if (print_choice->size() > 1) { + for (i = 1; print_choice->text(i); i ++) { + free(print_choice->menu()[i].user_data()); + } +} + +print_choice->clear(); +print_choice->add("Print To File", 0, 0, 0, FL_MENU_DIVIDER); +print_choice->value(0); + +defname[0] = '\0'; + +if ((lpstat = popen("lpstat -p -d", "r")) != NULL) { + while (fgets(line, sizeof(line), lpstat)) { + if (!strncmp(line, "printer ", 8) && + sscanf(line + 8, "%s", name) == 1) { + for (nptr = name, qptr = qname; *nptr; *qptr++ = *nptr++) { + if (*nptr == '/') *qptr++ = '\\'; + } + *qptr = '\0'; + + print_choice->add(qname, 0, 0, (void *)strdup(name), 0); + } else if (!strncmp(line, "system default destination: ", 28)) { + if (sscanf(line + 28, "%s", defname) != 1) defname[0] = '\0'; + } + } + pclose(lpstat); +} + +if (defname[0]) { + for (i = 1; print_choice->text(i); i ++) { + if (!strcmp((char *)print_choice->menu()[i].user_data(), defname)) { + print_choice->value(i); + break; + } + } +} else if (print_choice->size() > 2) print_choice->value(1); + + +print_update_status(); +} + +void print_update_status() { + FILE *lpstat; +char command[1024]; +static char status[1024]; +const char *printer = (const char *)print_choice->menu()[print_choice->value()].user_data(); + +if (print_choice->value()) { + snprintf(command, sizeof(command), "lpstat -p '%s'", printer); + if ((lpstat = popen(command, "r")) != NULL) { + fgets(status, sizeof(status), lpstat); + pclose(lpstat); + } else strcpy(status, "printer status unavailable"); +} else status[0] = '\0'; + +print_status->label(status); + +char name[1024]; +int val; + +snprintf(name, sizeof(name), "%s/page_size", printer); +fluid_prefs.get(name, val, 0); +print_page_size->value(val); + +snprintf(name, sizeof(name), "%s/output_mode", printer); +fluid_prefs.get(name, val, 0); +print_output_mode[val]->setonly(); +} + +// +// End of "$Id$". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/print_panel.fl b/third_party/windows/fltk-1.1.10/fluid/print_panel.fl new file mode 100644 index 0000000..b647fd6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/print_panel.fl @@ -0,0 +1,370 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0107 +header_name {.h} +code_name {.cxx} +comment {// +// "$Id$" +// +// FLUID print panel for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +} {in_source in_header +} + +decl {\#include } {} + +decl {\#include } {} + +decl {\#include "../src/flstring.h"} {} + +decl {\#include } {} + +decl {extern Fl_Preferences fluid_prefs;} {} + +Function {make_print_panel()} {open +} { + Fl_Window print_panel { + label Print open + xywh {342 21 465 235} type Double modal visible + } { + Fl_Group print_panel_controls {open + xywh {10 10 447 216} + } { + Fl_Choice print_choice { + label {Printer:} + callback {print_update_status();} open + xywh {113 10 181 25} down_box BORDER_BOX labelfont 1 when 1 + } {} + Fl_Button print_properties { + label {Properties...} + callback {print_properties_panel->show();} + xywh {294 10 105 25} + } + Fl_Box print_status { + label {printer/job status} + xywh {111 41 288 17} align 84 + } + Fl_Group {} { + label {Print Range} open + xywh {10 86 227 105} box THIN_DOWN_BOX labelfont 1 align 5 + } { + Fl_Round_Button print_all { + label All + callback {print_from->deactivate(); +print_to->deactivate();} + xywh {20 96 38 25} type Radio down_box ROUND_DOWN_BOX value 1 + } + Fl_Round_Button print_pages { + label Pages + callback {print_from->activate(); +print_to->activate();} + xywh {20 126 64 25} type Radio down_box ROUND_DOWN_BOX + } + Fl_Round_Button print_selection { + label Selection + callback {print_from->deactivate(); +print_to->deactivate();} + xywh {20 156 82 25} type Radio down_box ROUND_DOWN_BOX + } + Fl_Input print_from { + label {From:} + xywh {136 126 28 25} type Int textfont 4 deactivate + } + Fl_Input print_to { + label {To:} + xywh {199 126 28 25} type Int textfont 4 deactivate + } + } + Fl_Group {} { + label Copies open + xywh {247 86 210 105} box THIN_DOWN_BOX labelfont 1 align 5 + } { + Fl_Spinner print_copies { + label {\# Copies:} + callback {if (print_copies->value() == 1) { + print_collate_button->deactivate(); + print_collate_group[0]->deactivate(); + print_collate_group[1]->deactivate(); +} else { + print_collate_button->activate(); + print_collate_group[0]->activate(); + print_collate_group[1]->activate(); +}} selected + xywh {321 96 45 25} when 1 + } + Fl_Check_Button print_collate_button { + label Collate + callback {int i = print_collate_button->value() != 0; +print_collate_group[i]->show(); +print_collate_group[1 - i]->hide();} + xywh {376 96 64 25} down_box DOWN_BOX when 1 deactivate + } + Fl_Group {print_collate_group[0]} { + xywh {257 131 191 50} deactivate + } { + Fl_Box {} { + label 1 + xywh {287 141 30 40} box BORDER_BOX color 7 labelsize 11 align 26 deactivate + } + Fl_Box {} { + label 1 + xywh {272 136 30 40} box BORDER_BOX color 7 labelsize 11 align 26 deactivate + } + Fl_Box {} { + label 1 + xywh {257 131 30 40} box BORDER_BOX color 7 labelsize 11 align 26 deactivate + } + Fl_Box {} { + label 2 + xywh {352 141 30 40} box BORDER_BOX color 7 labelsize 11 align 26 deactivate + } + Fl_Box {} { + label 2 + xywh {337 136 30 40} box BORDER_BOX color 7 labelsize 11 align 26 deactivate + } + Fl_Box {} { + label 2 + xywh {322 131 30 40} box BORDER_BOX color 7 labelsize 11 align 26 deactivate + } + Fl_Box {} { + label 3 + xywh {417 141 30 40} box BORDER_BOX color 7 labelsize 11 align 26 deactivate + } + Fl_Box {} { + label 3 + xywh {402 136 30 40} box BORDER_BOX color 7 labelsize 11 align 26 deactivate + } + Fl_Box {} { + label 3 + xywh {387 131 30 40} box BORDER_BOX color 7 labelsize 11 align 26 deactivate + } + } + Fl_Group {print_collate_group[1]} { + xywh {257 131 191 50} hide deactivate + } { + Fl_Box {} { + label 3 + xywh {287 141 30 40} box BORDER_BOX color 7 labelsize 11 align 26 + } + Fl_Box {} { + label 2 + xywh {272 136 30 40} box BORDER_BOX color 7 labelsize 11 align 26 + } + Fl_Box {} { + label 1 + xywh {257 131 30 40} box BORDER_BOX color 7 labelsize 11 align 26 + } + Fl_Box {} { + label 3 + xywh {352 141 30 40} box BORDER_BOX color 7 labelsize 11 align 26 + } + Fl_Box {} { + label 2 + xywh {337 136 30 40} box BORDER_BOX color 7 labelsize 11 align 26 + } + Fl_Box {} { + label 1 + xywh {322 131 30 40} box BORDER_BOX color 7 labelsize 11 align 26 + } + Fl_Box {} { + label 3 + xywh {417 141 30 40} box BORDER_BOX color 7 labelsize 11 align 26 + } + Fl_Box {} { + label 2 + xywh {402 136 30 40} box BORDER_BOX color 7 labelsize 11 align 26 + } + Fl_Box {} { + label 1 + xywh {387 131 30 40} box BORDER_BOX color 7 labelsize 11 align 26 + } + } + } + Fl_Return_Button {} { + label Print + callback print_cb + xywh {309 201 70 25} + } + Fl_Button {} { + label Cancel + callback {print_panel->hide();} + xywh {389 201 68 25} + } + } + Fl_Progress print_progress { + xywh {10 203 289 21} selection_color 4 hide + } + } + Fl_Window print_properties_panel { + label {Printer Properties} + callback {print_properties_panel->hide(); +print_update_status();} open + xywh {340 213 290 130} type Double modal visible + } { + Fl_Choice print_page_size { + label {Page Size:} + xywh {110 10 80 25} down_box BORDER_BOX labelfont 1 + } { + MenuItem {} { + label Letter + xywh {0 0 35 25} + } + MenuItem {} { + label A4 + xywh {0 0 35 25} + } + } + Fl_Group {} { + label {Output Mode:} open + xywh {110 45 170 40} labelfont 1 align 4 + } { + Fl_Button {print_output_mode[0]} { + image {pixmaps/print_color.xpm} xywh {110 45 30 40} type Radio box BORDER_BOX down_box BORDER_BOX value 1 color 7 selection_color 0 + } + Fl_Button {print_output_mode[1]} { + image {pixmaps/print_color.xpm} xywh {150 50 40 30} type Radio box BORDER_BOX down_box BORDER_BOX color 7 selection_color 0 + } + Fl_Button {print_output_mode[2]} { + image {pixmaps/print_gray.xpm} xywh {200 45 30 40} type Radio box BORDER_BOX down_box BORDER_BOX color 7 selection_color 0 + } + Fl_Button {print_output_mode[3]} { + image {pixmaps/print_gray.xpm} xywh {240 50 40 30} type Radio box BORDER_BOX down_box BORDER_BOX color 7 selection_color 0 + } + } + Fl_Return_Button {} { + label Save + callback {print_properties_panel->hide(); + +char name[1024]; +int val; +const char *printer = (const char *)print_choice->menu()[print_choice->value()].user_data(); + +snprintf(name, sizeof(name), "%s/page_size", printer); +fluid_prefs.set(name, print_page_size->value()); + +snprintf(name, sizeof(name), "%s/output_mode", printer); +for (val = 0; val < 4; val ++) { + if (print_output_mode[val]->value()) break; +} +fluid_prefs.set(name, val);} + xywh {123 95 79 25} + } + Fl_Button {} { + label Cancel + callback {print_properties_panel->hide(); +print_update_status();} + xywh {212 95 68 25} + } + Fl_Button {} { + label Use + callback {print_properties_panel->hide();} + xywh {60 95 53 25} + } + } +} + +decl {void print_cb(Fl_Return_Button *, void *);} {public +} + +Function {print_load()} {open return_type void +} { + code {FILE *lpstat; +char line[1024], name[1024], *nptr, qname[2048], *qptr, defname[1024]; +int i; + +if (print_choice->size() > 1) { + for (i = 1; print_choice->text(i); i ++) { + free(print_choice->menu()[i].user_data()); + } +} + +print_choice->clear(); +print_choice->add("Print To File", 0, 0, 0, FL_MENU_DIVIDER); +print_choice->value(0); + +defname[0] = '\\0'; + +if ((lpstat = popen("lpstat -p -d", "r")) != NULL) { + while (fgets(line, sizeof(line), lpstat)) { + if (!strncmp(line, "printer ", 8) && + sscanf(line + 8, "%s", name) == 1) { + for (nptr = name, qptr = qname; *nptr; *qptr++ = *nptr++) { + if (*nptr == '/') *qptr++ = '\\\\'; + } + *qptr = '\\0'; + + print_choice->add(qname, 0, 0, (void *)strdup(name), 0); + } else if (!strncmp(line, "system default destination: ", 28)) { + if (sscanf(line + 28, "%s", defname) != 1) defname[0] = '\\0'; + } + } + pclose(lpstat); +} + +if (defname[0]) { + for (i = 1; print_choice->text(i); i ++) { + if (!strcmp((char *)print_choice->menu()[i].user_data(), defname)) { + print_choice->value(i); + break; + } + } +} else if (print_choice->size() > 2) print_choice->value(1); + + +print_update_status();} {} +} + +Function {print_update_status()} {open return_type void +} { + code {FILE *lpstat; +char command[1024]; +static char status[1024]; +const char *printer = (const char *)print_choice->menu()[print_choice->value()].user_data(); + +if (print_choice->value()) { + snprintf(command, sizeof(command), "lpstat -p '%s'", printer); + if ((lpstat = popen(command, "r")) != NULL) { + fgets(status, sizeof(status), lpstat); + pclose(lpstat); + } else strcpy(status, "printer status unavailable"); +} else status[0] = '\\0'; + +print_status->label(status); + +char name[1024]; +int val; + +snprintf(name, sizeof(name), "%s/page_size", printer); +fluid_prefs.get(name, val, 0); +print_page_size->value(val); + +snprintf(name, sizeof(name), "%s/output_mode", printer); +fluid_prefs.get(name, val, 0); +print_output_mode[val]->setonly();} {} +} + +comment { +// +// End of "$Id$". +//} {in_source in_header +} diff --git a/third_party/windows/fltk-1.1.10/fluid/print_panel.h b/third_party/windows/fltk-1.1.10/fluid/print_panel.h new file mode 100644 index 0000000..dbbbeb7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/print_panel.h @@ -0,0 +1,71 @@ +// +// "$Id$" +// +// FLUID print panel for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0110 + +#ifndef print_panel_h +#define print_panel_h +#include +#include +extern Fl_Double_Window *print_panel; +#include +extern Fl_Group *print_panel_controls; +#include +extern Fl_Choice *print_choice; +#include +extern Fl_Button *print_properties; +#include +extern Fl_Box *print_status; +#include +extern Fl_Round_Button *print_all; +extern Fl_Round_Button *print_pages; +extern Fl_Round_Button *print_selection; +#include +extern Fl_Input *print_from; +extern Fl_Input *print_to; +#include +extern Fl_Spinner *print_copies; +#include +extern Fl_Check_Button *print_collate_button; +extern Fl_Group *print_collate_group[2]; +#include +extern void print_cb(Fl_Return_Button*, void*); +#include +extern Fl_Progress *print_progress; +extern Fl_Double_Window *print_properties_panel; +extern Fl_Choice *print_page_size; +extern Fl_Button *print_output_mode[4]; +Fl_Double_Window* make_print_panel(); +extern Fl_Menu_Item menu_print_page_size[]; +extern void print_cb(Fl_Return_Button *, void *); +void print_load(); +void print_update_status(); +#endif + +// +// End of "$Id$". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/template_panel.cxx b/third_party/windows/fltk-1.1.10/fluid/template_panel.cxx new file mode 100644 index 0000000..52cb8a0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/template_panel.cxx @@ -0,0 +1,258 @@ +// +// "$Id$" +// +// FLUID template support for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0110 + +#include "template_panel.h" +#include +#include +#include "../src/flstring.h" +#include +#include +#include +#include +#include +#if defined(WIN32) && !defined(__CYGWIN__) +#include +#else +#include +#endif // WIN32 && !__CYGWIN__ +extern Fl_Preferences fluid_prefs; + +Fl_Double_Window *template_panel=(Fl_Double_Window *)0; + +static void cb_template_panel(Fl_Double_Window*, void*) { + Fl_Shared_Image *img = (Fl_Shared_Image *)template_preview->image(); +if (img) img->release(); +template_preview->image(0); + +template_browser->deselect(); +template_name->value(""); +template_instance->value(""); +template_panel->hide(); +} + +Fl_Browser *template_browser=(Fl_Browser *)0; + +static void cb_template_browser(Fl_Browser*, void*) { + if (Fl::event_clicks()) { + template_panel->hide(); + return; +} +Fl_Shared_Image *img = (Fl_Shared_Image *)template_preview->image(); +if (img) img->release(); +template_preview->image(0); +template_preview->redraw(); + +int item = template_browser->value(); + +if (item <= 1) template_instance->deactivate(); +else template_instance->activate(); + +if (item < 1) { + template_submit->deactivate(); + template_delete->deactivate(); + return; +} + +template_submit->activate(); + +const char *flfile = (const char *)template_browser->data(item); +if (!flfile) { + template_delete->deactivate(); + return; +} + +template_name->value(template_browser->text(item)); + +template_delete->activate(); + +char pngfile[1024], *ext; + +strlcpy(pngfile, flfile, sizeof(pngfile)); +if ((ext = strrchr(pngfile, '.')) == NULL) return; +strcpy(ext, ".png"); + +img = Fl_Shared_Image::get(pngfile); + +if (img) { + template_preview->image(img); + template_preview->redraw(); +}; +} + +Fl_Box *template_preview=(Fl_Box *)0; + +Fl_Input *template_name=(Fl_Input *)0; + +static void cb_template_name(Fl_Input*, void*) { + if (strlen(template_name->value())) { + template_submit->activate(); + if (Fl::event_key() == FL_Enter) template_panel->hide(); +} else template_submit->deactivate(); +} + +Fl_Input *template_instance=(Fl_Input *)0; + +Fl_Button *template_delete=(Fl_Button *)0; + +static void cb_Cancel(Fl_Button*, void*) { + Fl_Shared_Image *img = (Fl_Shared_Image *)template_preview->image(); +if (img) img->release(); +template_preview->image(0); + +template_browser->deselect(); +template_name->value(""); +template_instance->value(""); +template_panel->hide(); +} + +Fl_Return_Button *template_submit=(Fl_Return_Button *)0; + +static void cb_template_submit(Fl_Return_Button*, void*) { + Fl_Shared_Image *img = (Fl_Shared_Image *)template_preview->image(); +if (img) img->release(); +template_preview->image(0); + +template_panel->hide(); +} + +Fl_Double_Window* make_template_panel() { + { template_panel = new Fl_Double_Window(460, 355, "New/Save Template"); + template_panel->callback((Fl_Callback*)cb_template_panel); + { template_browser = new Fl_Browser(10, 28, 180, 250, "Available Templates:"); + template_browser->type(2); + template_browser->labelfont(1); + template_browser->callback((Fl_Callback*)cb_template_browser); + template_browser->align(FL_ALIGN_TOP_LEFT); + template_browser->when(3); + } // Fl_Browser* template_browser + { template_preview = new Fl_Box(200, 28, 250, 250); + template_preview->box(FL_THIN_DOWN_BOX); + template_preview->align(69|FL_ALIGN_INSIDE); + Fl_Group::current()->resizable(template_preview); + } // Fl_Box* template_preview + { template_name = new Fl_Input(124, 288, 326, 25, "Template Name:"); + template_name->labelfont(1); + template_name->textfont(4); + template_name->callback((Fl_Callback*)cb_template_name); + template_name->when(3); + } // Fl_Input* template_name + { template_instance = new Fl_Input(124, 288, 326, 25, "Instance Name:"); + template_instance->labelfont(1); + template_instance->textfont(4); + template_instance->hide(); + } // Fl_Input* template_instance + { Fl_Group* o = new Fl_Group(10, 323, 440, 25); + { template_delete = new Fl_Button(10, 323, 133, 25, "Delete Template"); + template_delete->callback((Fl_Callback*)template_delete_cb); + } // Fl_Button* template_delete + { Fl_Box* o = new Fl_Box(153, 323, 126, 25); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + { Fl_Button* o = new Fl_Button(289, 323, 72, 25, "Cancel"); + o->callback((Fl_Callback*)cb_Cancel); + } // Fl_Button* o + { template_submit = new Fl_Return_Button(371, 323, 79, 25, "Save"); + template_submit->callback((Fl_Callback*)cb_template_submit); + } // Fl_Return_Button* template_submit + o->end(); + } // Fl_Group* o + template_panel->set_modal(); + template_panel->end(); + } // Fl_Double_Window* template_panel + return template_panel; +} + +void template_clear() { + int i; +void *filename; + +for (i = 1; i <= template_browser->size(); i ++) { + if ((filename = template_browser->data(i)) != NULL) free(filename); +} + +template_browser->deselect(); +template_browser->clear(); +} + +void template_delete_cb(Fl_Button *, void *) { + int item = template_browser->value(); +if (item < 1) return; + +const char *name = template_browser->text(item); +const char *flfile = (const char *)template_browser->data(item); +if (!flfile) return; + +if (!fl_choice("Are you sure you want to delete the template \"%s\"?", + "Cancel", "Delete", 0, name)) return; + +if (unlink(flfile)) { + fl_alert("Unable to delete template \"%s\":\n%s", name, strerror(errno)); + return; +} + +template_browser->remove(item); +template_browser->do_callback(); +} + +void template_load() { + int i; +char name[1024], filename[1024], path[1024], *ptr; +struct dirent **files; +int num_files; + +fluid_prefs.getUserdataPath(path, sizeof(path)); +strlcat(path, "templates", sizeof(path)); + +num_files = fl_filename_list(path, &files); + +for (i = 0; i < num_files; i ++) { + if (fl_filename_match(files[i]->d_name, "*.fl")) { + // Format the name as the filename with "_" replaced with " " + // and without the trailing ".fl"... + strlcpy(name, files[i]->d_name, sizeof(name)); + *strstr(name, ".fl") = '\0'; + + for (ptr = name; *ptr; ptr ++) { + if (*ptr == '_') *ptr = ' '; + } + + // Add the template to the browser... + snprintf(filename, sizeof(filename), "%s/%s", path, files[i]->d_name); + template_browser->add(name, strdup(filename)); + } + + free(files[i]); +} + +if (num_files > 0) free(files); +} + +// +// End of "$Id$". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/template_panel.fl b/third_party/windows/fltk-1.1.10/fluid/template_panel.fl new file mode 100644 index 0000000..ae2e2b7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/template_panel.fl @@ -0,0 +1,244 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0107 +header_name {.h} +code_name {.cxx} +comment {// +// "$Id$" +// +// FLUID template support for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +} {in_source in_header +} + +decl {\#include } {} + +decl {\#include } {} + +decl {\#include "../src/flstring.h"} {} + +decl {\#include } {} + +decl {\#include } {} + +decl {\#include } {} + +decl {\#include } {} + +decl {\#include } {} + +declblock {\#if defined(WIN32) && !defined(__CYGWIN__)} {selected after {\#endif // WIN32 && !__CYGWIN__} +} { + decl {\#include } {} + decl {\#else} {} + decl {\#include } {} +} + +decl {extern Fl_Preferences fluid_prefs;} {} + +Function {make_template_panel()} {open +} { + Fl_Window template_panel { + label {New/Save Template} + callback {Fl_Shared_Image *img = (Fl_Shared_Image *)template_preview->image(); +if (img) img->release(); +template_preview->image(0); + +template_browser->deselect(); +template_name->value(""); +template_instance->value(""); +template_panel->hide();} open + xywh {340 237 460 355} type Double resizable modal visible + } { + Fl_Browser template_browser { + label {Available Templates:} + callback {if (Fl::event_clicks()) { + template_panel->hide(); + return; +} +Fl_Shared_Image *img = (Fl_Shared_Image *)template_preview->image(); +if (img) img->release(); +template_preview->image(0); +template_preview->redraw(); + +int item = template_browser->value(); + +if (item <= 1) template_instance->deactivate(); +else template_instance->activate(); + +if (item < 1) { + template_submit->deactivate(); + template_delete->deactivate(); + return; +} + +template_submit->activate(); + +const char *flfile = (const char *)template_browser->data(item); +if (!flfile) { + template_delete->deactivate(); + return; +} + +template_name->value(template_browser->text(item)); + +template_delete->activate(); + +char pngfile[1024], *ext; + +strlcpy(pngfile, flfile, sizeof(pngfile)); +if ((ext = strrchr(pngfile, '.')) == NULL) return; +strcpy(ext, ".png"); + +img = Fl_Shared_Image::get(pngfile); + +if (img) { + template_preview->image(img); + template_preview->redraw(); +}} + xywh {10 28 180 250} type Hold labelfont 1 align 5 when 3 + } + Fl_Box template_preview { + xywh {200 28 250 250} box THIN_DOWN_BOX align 85 resizable + } + Fl_Input template_name { + label {Template Name:} + callback {if (strlen(template_name->value())) { + template_submit->activate(); + if (Fl::event_key() == FL_Enter) template_panel->hide(); +} else template_submit->deactivate();} + xywh {124 288 326 25} labelfont 1 when 3 textfont 4 + } + Fl_Input template_instance { + label {Instance Name:} + xywh {124 288 326 25} labelfont 1 textfont 4 hide + } + Fl_Group {} { + xywh {10 323 440 25} + } { + Fl_Button template_delete { + label {Delete Template} + callback template_delete_cb + xywh {10 323 133 25} + } + Fl_Box {} { + xywh {153 323 126 25} resizable + } + Fl_Button {} { + label Cancel + callback {Fl_Shared_Image *img = (Fl_Shared_Image *)template_preview->image(); +if (img) img->release(); +template_preview->image(0); + +template_browser->deselect(); +template_name->value(""); +template_instance->value(""); +template_panel->hide();} + xywh {289 323 72 25} + } + Fl_Return_Button template_submit { + label Save + callback {Fl_Shared_Image *img = (Fl_Shared_Image *)template_preview->image(); +if (img) img->release(); +template_preview->image(0); + +template_panel->hide();} + xywh {371 323 79 25} + } + } + } +} + +Function {template_clear()} {return_type void +} { + code {int i; +void *filename; + +for (i = 1; i <= template_browser->size(); i ++) { + if ((filename = template_browser->data(i)) != NULL) free(filename); +} + +template_browser->deselect(); +template_browser->clear();} {} +} + +Function {template_delete_cb(Fl_Button *, void *)} {return_type void +} { + code {int item = template_browser->value(); +if (item < 1) return; + +const char *name = template_browser->text(item); +const char *flfile = (const char *)template_browser->data(item); +if (!flfile) return; + +if (!fl_choice("Are you sure you want to delete the template \\"%s\\"?", + "Cancel", "Delete", 0, name)) return; + +if (unlink(flfile)) { + fl_alert("Unable to delete template \\"%s\\":\\n%s", name, strerror(errno)); + return; +} + +template_browser->remove(item); +template_browser->do_callback();} {} +} + +Function {template_load()} {open return_type void +} { + code {int i; +char name[1024], filename[1024], path[1024], *ptr; +struct dirent **files; +int num_files; + +fluid_prefs.getUserdataPath(path, sizeof(path)); +strlcat(path, "templates", sizeof(path)); + +num_files = fl_filename_list(path, &files); + +for (i = 0; i < num_files; i ++) { + if (fl_filename_match(files[i]->d_name, "*.fl")) { + // Format the name as the filename with "_" replaced with " " + // and without the trailing ".fl"... + strlcpy(name, files[i]->d_name, sizeof(name)); + *strstr(name, ".fl") = '\\0'; + + for (ptr = name; *ptr; ptr ++) { + if (*ptr == '_') *ptr = ' '; + } + + // Add the template to the browser... + snprintf(filename, sizeof(filename), "%s/%s", path, files[i]->d_name); + template_browser->add(name, strdup(filename)); + } + + free(files[i]); +} + +if (num_files > 0) free(files);} {} +} + +comment { +// +// End of "$Id$". +//} {in_source in_header +} diff --git a/third_party/windows/fltk-1.1.10/fluid/template_panel.h b/third_party/windows/fltk-1.1.10/fluid/template_panel.h new file mode 100644 index 0000000..1c7d07d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/template_panel.h @@ -0,0 +1,55 @@ +// +// "$Id$" +// +// FLUID template support for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0110 + +#ifndef template_panel_h +#define template_panel_h +#include +#include +extern Fl_Double_Window *template_panel; +#include +extern Fl_Browser *template_browser; +#include +extern Fl_Box *template_preview; +#include +extern Fl_Input *template_name; +extern Fl_Input *template_instance; +#include +#include +extern Fl_Button *template_delete; +#include +extern Fl_Return_Button *template_submit; +Fl_Double_Window* make_template_panel(); +void template_clear(); +void template_delete_cb(Fl_Button *, void *); +void template_load(); +#endif + +// +// End of "$Id$". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/undo.cxx b/third_party/windows/fltk-1.1.10/fluid/undo.cxx new file mode 100644 index 0000000..0b8a1d8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/undo.cxx @@ -0,0 +1,192 @@ +// +// "$Id$" +// +// FLUID undo support for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include "Fl_Type.h" +#include "undo.h" +#include +#include "../src/flstring.h" +#if defined(WIN32) && !defined(__CYGWIN__) +# include +# include +# define getpid (int)GetCurrentProcessId +# ifndef __WATCOMC__ +// Visual C++ 2005 incorrectly displays a warning about the use of POSIX APIs +// on Windows, which is supposed to be POSIX compliant... +# define unlink _unlink +# endif // !__WATCOMC__ +#else +# include +#endif // WIN32 && !__CYGWIN__ + + +extern Fl_Preferences fluid_prefs; // FLUID preferences +extern Fl_Menu_Item Main_Menu[]; // Main menu + +#define UNDO_ITEM 25 // Undo menu item index +#define REDO_ITEM 26 // Redo menu item index + + +// +// This file implements an undo system using temporary files; ideally +// we'd like to do this in memory, however the current data structures +// and design aren't well-suited... Instead, we save and restore +// checkpoint files. +// + + +int undo_current = 0; // Current undo level in buffer +int undo_last = 0; // Last undo level in buffer +int undo_max = 0; // Maximum undo level used +int undo_save = -1; // Last undo level that was saved +static int undo_paused = 0; // Undo checkpointing paused? + + +// Return the undo filename +static char *undo_filename(int level, char *buf, int bufsize) { + static char undo_path[1024] = ""; // Undo path + + + if (!undo_path[0]) fluid_prefs.getUserdataPath(undo_path, sizeof(undo_path)); + + snprintf(buf, bufsize, "%sundo_%d_%d.fl", undo_path, getpid(), level); + return buf; +} + + +// Redo menu callback +void redo_cb(Fl_Widget *, void *) { + char filename[1024]; // Undo checkpoint file + + if (undo_current >= undo_last) return; + + undo_suspend(); + if (!read_file(undo_filename(undo_current + 1, filename, sizeof(filename)), 0)) { + // Unable to read checkpoint file, don't redo... + undo_resume(); + return; + } + + undo_current ++; + + // Update modified flag... + set_modflag(undo_current != undo_save); + + // Update undo/redo menu items... + if (undo_current >= undo_last) Main_Menu[REDO_ITEM].deactivate(); + Main_Menu[UNDO_ITEM].activate(); +} + +// Undo menu callback +void undo_cb(Fl_Widget *, void *) { + char filename[1024]; // Undo checkpoint file + + if (undo_current <= 0) return; + + if (undo_current == undo_last) { + write_file(undo_filename(undo_current, filename, sizeof(filename))); + } + + undo_suspend(); + if (!read_file(undo_filename(undo_current - 1, filename, sizeof(filename)), 0)) { + // Unable to read checkpoint file, don't undo... + undo_resume(); + return; + } + + undo_current --; + + // Update modified flag... + set_modflag(undo_current != undo_save); + + // Update undo/redo menu items... + if (undo_current <= 0) Main_Menu[UNDO_ITEM].deactivate(); + Main_Menu[REDO_ITEM].activate(); + undo_resume(); +} + +// Save current file to undo buffer +void undo_checkpoint() { + char filename[1024]; // Undo checkpoint filename + +// printf("undo_checkpoint(): undo_current=%d, undo_paused=%d, modflag=%d\n", +// undo_current, undo_paused, modflag); + + // Don't checkpoint if undo_suspend() has been called... + if (undo_paused) return; + + // Save the current UI to a checkpoint file... + if (!write_file(undo_filename(undo_current, filename, sizeof(filename)))) { + // Don't attempt to do undo stuff if we can't write a checkpoint file... + perror(filename); + return; + } + + // Update the saved level... + if (modflag && undo_current <= undo_save) undo_save = -1; + else if (!modflag) undo_save = undo_current; + + // Update the current undo level... + undo_current ++; + undo_last = undo_current; + if (undo_current > undo_max) undo_max = undo_current; + + // Enable the Undo and disable the Redo menu items... + Main_Menu[UNDO_ITEM].activate(); + Main_Menu[REDO_ITEM].deactivate(); +} + +// Clear undo buffer +void undo_clear() { + char filename[1024]; // Undo checkpoint filename + + + // Remove old checkpoint files... + for (int i = 0; i <= undo_max; i ++) { + unlink(undo_filename(i, filename, sizeof(filename))); + } + + // Reset current, last, and save indices... + undo_current = undo_last = undo_max = 0; + if (modflag) undo_save = -1; + else undo_save = 0; +} + +// Resume undo checkpoints +void undo_resume() { + undo_paused = 0; +} + +// Suspend undo checkpoints +void undo_suspend() { + undo_paused = 1; +} + + +// +// End of "$Id$". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/undo.h b/third_party/windows/fltk-1.1.10/fluid/undo.h new file mode 100644 index 0000000..16a4318 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/undo.h @@ -0,0 +1,46 @@ +// +// "$Id$" +// +// FLUID undo definitions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef undo_h +# define undo_h + +extern int undo_current; // Current undo level in buffer +extern int undo_last; // Last undo level in buffer +extern int undo_save; // Last undo level that was saved + +void redo_cb(Fl_Widget *, void *); // Redo menu callback +void undo_cb(Fl_Widget *, void *); // Undo menu callback +void undo_checkpoint(); // Save current file to undo buffer +void undo_clear(); // Clear undo buffer +void undo_resume(); // Resume undo checkpoints +void undo_suspend(); // Suspend undo checkpoints + +#endif // !undo_h + +// +// End of "$Id$". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/widget_panel.cxx b/third_party/windows/fltk-1.1.10/fluid/widget_panel.cxx new file mode 100644 index 0000000..92c80b1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/widget_panel.cxx @@ -0,0 +1,795 @@ +// +// "$Id: widget_panel.cxx 6817 2009-07-02 09:42:17Z AlbrechtS $" +// +// Widget panel for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0110 + +#include "widget_panel.h" + +static void cb_(Fl_Tabs* o, void* v) { + propagate_load((Fl_Group *)o,v); +} + +Fl_Value_Input *widget_x_input=(Fl_Value_Input *)0; + +Fl_Value_Input *widget_y_input=(Fl_Value_Input *)0; + +Fl_Value_Input *widget_w_input=(Fl_Value_Input *)0; + +Fl_Value_Input *widget_h_input=(Fl_Value_Input *)0; + +Fl_Menu_Item menu_[] = { + {"private", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"public", 0, 0, (void*)(1), 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"protected", 0, 0, (void*)(2), 0, FL_NORMAL_LABEL, 0, 11, 0}, + {0,0,0,0,0,0,0,0,0} +}; + +Fl_Menu_Item menu_1[] = { + {"local", 0, 0, (void*)(0), 0, FL_NORMAL_LABEL, 0, 11, 0}, + {"global", 0, 0, (void*)(1), 0, FL_NORMAL_LABEL, 0, 11, 0}, + {0,0,0,0,0,0,0,0,0} +}; + +Fl_Input *v_input[4]={(Fl_Input *)0}; + +Fl_Button *wLiveMode=(Fl_Button *)0; + +Fl_Double_Window* make_widget_panel() { + Fl_Double_Window* w; + { Fl_Double_Window* o = new Fl_Double_Window(420, 360); + w = o; + o->labelsize(11); + o->align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE); + o->hotspot(o); + { Fl_Tabs* o = new Fl_Tabs(10, 10, 400, 310); + o->selection_color((Fl_Color)12); + o->labelsize(11); + o->labelcolor(FL_BACKGROUND2_COLOR); + o->callback((Fl_Callback*)cb_); + o->when(FL_WHEN_NEVER); + { Fl_Group* o = new Fl_Group(10, 30, 400, 290, "GUI"); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->when(FL_WHEN_NEVER); + o->hide(); + { Fl_Group* o = new Fl_Group(95, 40, 309, 20, "Label:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Input* o = new Fl_Input(95, 40, 190, 20); + o->tooltip("The label text for the widget."); + o->labelfont(1); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)label_cb); + o->when(FL_WHEN_CHANGED); + Fl_Group::current()->resizable(o); + } // Fl_Input* o + { Fl_Choice* o = new Fl_Choice(284, 40, 120, 20); + o->tooltip("The label style for the widget."); + o->box(FL_THIN_UP_BOX); + o->down_box(FL_BORDER_BOX); + o->labelfont(1); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)labeltype_cb); + o->menu(labeltypemenu); + } // Fl_Choice* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(95, 65, 309, 20, "Image:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Input* o = new Fl_Input(95, 65, 240, 20); + o->tooltip("The active image for the widget."); + o->labelfont(1); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)image_cb); + Fl_Group::current()->resizable(o); + } // Fl_Input* o + { Fl_Button* o = new Fl_Button(334, 65, 70, 20, "Browse..."); + o->tooltip("Click to choose the active image."); + o->labelsize(11); + o->callback((Fl_Callback*)image_browse_cb); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(95, 90, 309, 20, "Inactive:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Input* o = new Fl_Input(95, 90, 240, 20); + o->tooltip("The inactive image for the widget."); + o->labelfont(1); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)inactive_cb); + Fl_Group::current()->resizable(o); + } // Fl_Input* o + { Fl_Button* o = new Fl_Button(334, 90, 70, 20, "Browse..."); + o->tooltip("Click to choose the inactive image."); + o->labelsize(11); + o->callback((Fl_Callback*)inactive_browse_cb); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(95, 115, 300, 20, "Alignment:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Button* o = new Fl_Button(95, 115, 45, 20, "Clip"); + o->tooltip("Clip the label to the inside of the widget."); + o->type(1); + o->selection_color(FL_INACTIVE_COLOR); + o->labelsize(11); + o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_CLIP)); + o->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(145, 115, 50, 20, "Wrap"); + o->tooltip("Wrap the label text."); + o->type(1); + o->selection_color(FL_INACTIVE_COLOR); + o->labelsize(11); + o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_WRAP)); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(200, 115, 65, 20, "Text/Image"); + o->tooltip("Show the label text over the image."); + o->type(1); + o->selection_color(FL_INACTIVE_COLOR); + o->labelsize(11); + o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_TEXT_OVER_IMAGE)); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(270, 115, 20, 20, "@-1<-"); + o->tooltip("Left-align the label."); + o->type(1); + o->selection_color(FL_INACTIVE_COLOR); + o->labelsize(11); + o->labelcolor(FL_INACTIVE_COLOR); + o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_LEFT)); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(295, 115, 20, 20, "@-1->"); + o->tooltip("Right-align the label."); + o->type(1); + o->selection_color(FL_INACTIVE_COLOR); + o->labelsize(11); + o->labelcolor(FL_INACTIVE_COLOR); + o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_RIGHT)); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(320, 115, 20, 20, "@-18"); + o->tooltip("Top-align the label."); + o->type(1); + o->selection_color(FL_INACTIVE_COLOR); + o->labelsize(11); + o->labelcolor(FL_INACTIVE_COLOR); + o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_TOP)); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(345, 115, 20, 20, "@-12"); + o->tooltip("Bottom-align the label."); + o->type(1); + o->selection_color(FL_INACTIVE_COLOR); + o->labelsize(11); + o->labelcolor(FL_INACTIVE_COLOR); + o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_BOTTOM)); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(370, 115, 20, 20, "@-3square"); + o->tooltip("Show the label inside the widget."); + o->type(1); + o->selection_color(FL_INACTIVE_COLOR); + o->labelsize(11); + o->labelcolor(FL_INACTIVE_COLOR); + o->callback((Fl_Callback*)align_cb, (void*)(FL_ALIGN_INSIDE)); + } // Fl_Button* o + { Fl_Box* o = new Fl_Box(395, 115, 0, 20); + o->labelsize(11); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(95, 150, 300, 20, "Position:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { widget_x_input = new Fl_Value_Input(95, 150, 55, 20, "X:"); + widget_x_input->tooltip("The X position of the widget."); + widget_x_input->labelsize(11); + widget_x_input->maximum(2048); + widget_x_input->step(1); + widget_x_input->textsize(11); + widget_x_input->callback((Fl_Callback*)x_cb); + widget_x_input->align(FL_ALIGN_TOP_LEFT); + } // Fl_Value_Input* widget_x_input + { widget_y_input = new Fl_Value_Input(155, 150, 55, 20, "Y:"); + widget_y_input->tooltip("The Y position of the widget."); + widget_y_input->labelsize(11); + widget_y_input->maximum(2048); + widget_y_input->step(1); + widget_y_input->textsize(11); + widget_y_input->callback((Fl_Callback*)y_cb); + widget_y_input->align(FL_ALIGN_TOP_LEFT); + } // Fl_Value_Input* widget_y_input + { widget_w_input = new Fl_Value_Input(215, 150, 55, 20, "Width:"); + widget_w_input->tooltip("The width of the widget."); + widget_w_input->labelsize(11); + widget_w_input->maximum(2048); + widget_w_input->step(1); + widget_w_input->textsize(11); + widget_w_input->callback((Fl_Callback*)w_cb); + widget_w_input->align(FL_ALIGN_TOP_LEFT); + } // Fl_Value_Input* widget_w_input + { widget_h_input = new Fl_Value_Input(275, 150, 55, 20, "Height:"); + widget_h_input->tooltip("The height of the widget."); + widget_h_input->labelsize(11); + widget_h_input->maximum(2048); + widget_h_input->step(1); + widget_h_input->textsize(11); + widget_h_input->callback((Fl_Callback*)h_cb); + widget_h_input->align(FL_ALIGN_TOP_LEFT); + } // Fl_Value_Input* widget_h_input + { Fl_Light_Button* o = new Fl_Light_Button(335, 150, 55, 20, "Relative"); + o->tooltip("If set, widgets inside a widget class of type Fl_Group are repositioned relat\ +ive to the origin at construction time"); + o->labelsize(11); + o->callback((Fl_Callback*)wc_relative_cb); + } // Fl_Light_Button* o + { Fl_Box* o = new Fl_Box(394, 150, 1, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(95, 185, 300, 20, "Values:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Value_Input* o = new Fl_Value_Input(95, 185, 55, 20, "Size:"); + o->tooltip("The size of the slider."); + o->labelsize(11); + o->step(0.010101); + o->textsize(11); + o->callback((Fl_Callback*)slider_size_cb); + o->align(FL_ALIGN_TOP_LEFT); + } // Fl_Value_Input* o + { Fl_Value_Input* o = new Fl_Value_Input(155, 185, 55, 20, "Minimum:"); + o->tooltip("The minimum value of the widget."); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)min_cb); + o->align(FL_ALIGN_TOP_LEFT); + } // Fl_Value_Input* o + { Fl_Value_Input* o = new Fl_Value_Input(215, 185, 55, 20, "Maximum:"); + o->tooltip("The maximum value of the widget."); + o->labelsize(11); + o->value(1); + o->textsize(11); + o->callback((Fl_Callback*)max_cb); + o->align(FL_ALIGN_TOP_LEFT); + } // Fl_Value_Input* o + { Fl_Value_Input* o = new Fl_Value_Input(275, 185, 55, 20, "Step:"); + o->tooltip("The resolution of the widget value."); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)step_cb); + o->align(FL_ALIGN_TOP_LEFT); + } // Fl_Value_Input* o + { Fl_Value_Input* o = new Fl_Value_Input(335, 185, 55, 20, "Value:"); + o->tooltip("The current widget value."); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)value_cb); + o->align(FL_ALIGN_TOP_LEFT); + } // Fl_Value_Input* o + { Fl_Box* o = new Fl_Box(395, 185, 0, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(95, 185, 300, 20, "Size Range:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + o->hide(); + { Fl_Value_Input* o = new Fl_Value_Input(95, 185, 55, 20, "Minimum Size:"); + o->tooltip("The size of the slider."); + o->labelsize(11); + o->maximum(2048); + o->step(1); + o->textsize(11); + o->callback((Fl_Callback*)min_w_cb); + o->align(FL_ALIGN_TOP_LEFT); + } // Fl_Value_Input* o + { Fl_Value_Input* o = new Fl_Value_Input(155, 185, 55, 20); + o->tooltip("The minimum value of the widget."); + o->labelsize(11); + o->maximum(2048); + o->step(1); + o->textsize(11); + o->callback((Fl_Callback*)min_h_cb); + o->align(FL_ALIGN_TOP_LEFT); + } // Fl_Value_Input* o + { Fl_Button* o = new Fl_Button(215, 185, 25, 20, "set"); + o->labelsize(11); + o->callback((Fl_Callback*)set_min_size_cb); + } // Fl_Button* o + { Fl_Value_Input* o = new Fl_Value_Input(245, 185, 55, 20, "Maximum Size:"); + o->tooltip("The maximum value of the widget."); + o->labelsize(11); + o->maximum(2048); + o->step(1); + o->textsize(11); + o->callback((Fl_Callback*)max_w_cb); + o->align(FL_ALIGN_TOP_LEFT); + } // Fl_Value_Input* o + { Fl_Value_Input* o = new Fl_Value_Input(305, 185, 55, 20); + o->tooltip("The resolution of the widget value."); + o->labelsize(11); + o->maximum(2048); + o->step(1); + o->textsize(11); + o->callback((Fl_Callback*)max_h_cb); + o->align(FL_ALIGN_TOP_LEFT); + } // Fl_Value_Input* o + { Fl_Button* o = new Fl_Button(365, 185, 25, 20, "set"); + o->labelsize(11); + o->callback((Fl_Callback*)set_max_size_cb); + } // Fl_Button* o + { Fl_Box* o = new Fl_Box(395, 185, 0, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + { Shortcut_Button* o = new Shortcut_Button(95, 210, 310, 20, "Shortcut:"); + o->tooltip("The shortcut key for the widget."); + o->box(FL_DOWN_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->selection_color(FL_BACKGROUND2_COLOR); + o->labeltype(FL_NORMAL_LABEL); + o->labelfont(1); + o->labelsize(11); + o->labelcolor(FL_FOREGROUND_COLOR); + o->callback((Fl_Callback*)shortcut_in_cb); + o->align(FL_ALIGN_LEFT); + o->when(FL_WHEN_RELEASE); + } // Shortcut_Button* o + { Fl_Group* o = new Fl_Group(95, 235, 300, 20, "X Class:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Input* o = new Fl_Input(95, 235, 95, 20, ":"); + o->tooltip("The X resource class."); + o->labelfont(1); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)xclass_cb); + Fl_Group::current()->resizable(o); + } // Fl_Input* o + { Fl_Light_Button* o = new Fl_Light_Button(195, 235, 60, 20, "Border"); + o->tooltip("Add a border around the window."); + o->selection_color((Fl_Color)1); + o->labelsize(11); + o->callback((Fl_Callback*)border_cb); + } // Fl_Light_Button* o + { Fl_Light_Button* o = new Fl_Light_Button(260, 235, 55, 20, "Modal"); + o->tooltip("Make the window modal."); + o->selection_color((Fl_Color)1); + o->labelsize(11); + o->callback((Fl_Callback*)modal_cb); + } // Fl_Light_Button* o + { Fl_Light_Button* o = new Fl_Light_Button(320, 235, 75, 20, "Nonmodal"); + o->tooltip("Make the window non-modal."); + o->selection_color((Fl_Color)1); + o->labelsize(11); + o->callback((Fl_Callback*)non_modal_cb); + o->align(132|FL_ALIGN_INSIDE); + } // Fl_Light_Button* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(95, 260, 305, 20, "Attributes:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Light_Button* o = new Fl_Light_Button(95, 260, 60, 20, "Visible"); + o->tooltip("Show the widget."); + o->selection_color((Fl_Color)1); + o->labelsize(11); + o->callback((Fl_Callback*)visible_cb); + } // Fl_Light_Button* o + { Fl_Light_Button* o = new Fl_Light_Button(160, 260, 60, 20, "Active"); + o->tooltip("Activate the widget."); + o->selection_color((Fl_Color)1); + o->labelsize(11); + o->callback((Fl_Callback*)active_cb); + } // Fl_Light_Button* o + { Fl_Light_Button* o = new Fl_Light_Button(225, 260, 75, 20, "Resizable"); + o->tooltip("Make the widget resizable."); + o->selection_color((Fl_Color)1); + o->labelsize(11); + o->callback((Fl_Callback*)resizable_cb); + o->when(FL_WHEN_CHANGED); + } // Fl_Light_Button* o + { Fl_Light_Button* o = new Fl_Light_Button(305, 260, 70, 20, "Hotspot"); + o->tooltip("Center the window under this widget."); + o->selection_color((Fl_Color)1); + o->labelsize(11); + o->callback((Fl_Callback*)hotspot_cb); + o->when(FL_WHEN_CHANGED); + } // Fl_Light_Button* o + { Fl_Box* o = new Fl_Box(395, 260, 0, 20); + o->labelsize(11); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + { Fl_Input* o = new Fl_Input(95, 285, 310, 20, "Tooltip:"); + o->tooltip("The tooltip text for the widget."); + o->labelfont(1); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)tooltip_cb); + } // Fl_Input* o + { Fl_Box* o = new Fl_Box(95, 305, 300, 5); + o->labelsize(11); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + Fl_Group::current()->resizable(o); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(10, 30, 400, 290, "Style"); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->when(FL_WHEN_NEVER); + o->hide(); + { Fl_Group* o = new Fl_Group(95, 40, 309, 20, "Label Font:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Choice* o = new Fl_Choice(95, 40, 170, 20); + o->tooltip("The style of the label text."); + o->box(FL_THIN_UP_BOX); + o->down_box(FL_BORDER_BOX); + o->labelfont(1); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)labelfont_cb); + Fl_Group::current()->resizable(o); + o->menu(fontmenu); + } // Fl_Choice* o + { Fl_Value_Input* o = new Fl_Value_Input(264, 40, 50, 20); + o->tooltip("The size of the label text."); + o->labelsize(11); + o->maximum(100); + o->step(1); + o->value(14); + o->textsize(11); + o->callback((Fl_Callback*)labelsize_cb); + } // Fl_Value_Input* o + { Fl_Button* o = new Fl_Button(314, 40, 90, 20, "Label Color"); + o->tooltip("The color of the label text."); + o->labelsize(11); + o->callback((Fl_Callback*)labelcolor_cb); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(95, 65, 309, 20, "Box:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Choice* o = new Fl_Choice(95, 65, 219, 20); + o->tooltip("The \"up\" box of the widget."); + o->box(FL_THIN_UP_BOX); + o->down_box(FL_BORDER_BOX); + o->labelfont(1); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)box_cb); + Fl_Group::current()->resizable(o); + o->menu(boxmenu); + } // Fl_Choice* o + { Fl_Button* o = new Fl_Button(314, 65, 90, 20, "Color"); + o->tooltip("The background color of the widget."); + o->labelsize(11); + o->callback((Fl_Callback*)color_cb); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(95, 90, 309, 20, "Down Box:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Choice* o = new Fl_Choice(95, 90, 219, 20); + o->tooltip("The \"down\" box of the widget."); + o->box(FL_THIN_UP_BOX); + o->down_box(FL_BORDER_BOX); + o->labelfont(1); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)down_box_cb); + Fl_Group::current()->resizable(o); + o->menu(boxmenu); + } // Fl_Choice* o + { Fl_Button* o = new Fl_Button(314, 90, 90, 20, "Select Color"); + o->tooltip("The selection color of the widget."); + o->labelsize(11); + o->callback((Fl_Callback*)color2_cb); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(95, 115, 309, 20, "Text Font:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Choice* o = new Fl_Choice(95, 115, 170, 20); + o->tooltip("The value text style."); + o->box(FL_DOWN_BOX); + o->down_box(FL_BORDER_BOX); + o->labelfont(1); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)textfont_cb); + Fl_Group::current()->resizable(o); + o->menu(fontmenu); + } // Fl_Choice* o + { Fl_Value_Input* o = new Fl_Value_Input(264, 115, 50, 20); + o->tooltip("The value text size."); + o->labelsize(11); + o->maximum(100); + o->step(1); + o->value(14); + o->textsize(11); + o->callback((Fl_Callback*)textsize_cb); + } // Fl_Value_Input* o + { Fl_Button* o = new Fl_Button(314, 115, 90, 20, "Text Color"); + o->tooltip("The value text color."); + o->labelsize(11); + o->callback((Fl_Callback*)textcolor_cb); + } // Fl_Button* o + o->end(); + } // Fl_Group* o + { Fl_Box* o = new Fl_Box(95, 140, 300, 40); + o->labelsize(11); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(10, 30, 400, 290, "C++"); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->when(FL_WHEN_NEVER); + { Fl_Group* o = new Fl_Group(95, 40, 310, 20, "Class:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Input* o = new Fl_Input(95, 40, 172, 20); + o->tooltip("The widget subclass."); + o->labelfont(1); + o->labelsize(11); + o->textfont(4); + o->textsize(11); + o->callback((Fl_Callback*)subclass_cb, (void*)(4)); + Fl_Group::current()->resizable(o); + } // Fl_Input* o + { Fl_Choice* o = new Fl_Choice(265, 40, 140, 20); + o->tooltip("The widget subtype."); + o->box(FL_THIN_UP_BOX); + o->down_box(FL_BORDER_BOX); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)subtype_cb); + } // Fl_Choice* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(95, 65, 310, 20, "Name:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Input* o = new Fl_Input(95, 65, 235, 20); + o->tooltip("The name of the widget."); + o->labelfont(1); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)name_cb); + Fl_Group::current()->resizable(o); + } // Fl_Input* o + { Fl_Choice* o = new Fl_Choice(330, 65, 75, 20); + o->tooltip("Change member access attribute."); + o->down_box(FL_BORDER_BOX); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)name_public_member_cb); + o->when(FL_WHEN_CHANGED); + o->menu(menu_); + } // Fl_Choice* o + { Fl_Choice* o = new Fl_Choice(330, 65, 75, 20); + o->tooltip("Change widget accessibility."); + o->down_box(FL_BORDER_BOX); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)name_public_cb); + o->when(FL_WHEN_CHANGED); + o->menu(menu_1); + } // Fl_Choice* o + o->end(); + } // Fl_Group* o + { v_input[0] = new Fl_Input(95, 90, 310, 20, "Extra Code:"); + v_input[0]->tooltip("Extra initialization code for the widget."); + v_input[0]->labelfont(1); + v_input[0]->labelsize(11); + v_input[0]->textfont(4); + v_input[0]->textsize(11); + v_input[0]->callback((Fl_Callback*)v_input_cb, (void*)(0)); + } // Fl_Input* v_input[0] + { v_input[1] = new Fl_Input(95, 110, 310, 20); + v_input[1]->tooltip("Extra initialization code for the widget."); + v_input[1]->labelsize(11); + v_input[1]->textfont(4); + v_input[1]->textsize(11); + v_input[1]->callback((Fl_Callback*)v_input_cb, (void*)(1)); + } // Fl_Input* v_input[1] + { v_input[2] = new Fl_Input(95, 130, 310, 20); + v_input[2]->tooltip("Extra initialization code for the widget."); + v_input[2]->labelsize(11); + v_input[2]->textfont(4); + v_input[2]->textsize(11); + v_input[2]->callback((Fl_Callback*)v_input_cb, (void*)(2)); + } // Fl_Input* v_input[2] + { v_input[3] = new Fl_Input(95, 150, 310, 20); + v_input[3]->tooltip("Extra initialization code for the widget."); + v_input[3]->labelsize(11); + v_input[3]->textfont(4); + v_input[3]->textsize(11); + v_input[3]->callback((Fl_Callback*)v_input_cb, (void*)(3)); + } // Fl_Input* v_input[3] + { CodeEditor* o = new CodeEditor(95, 175, 310, 90, "Callback:"); + o->tooltip("The callback function or code for the widget. Use the variable name \'o\' to \ +access the Widget pointer and \'v\' to access the user value."); + o->box(FL_DOWN_BOX); + o->color(FL_BACKGROUND2_COLOR); + o->selection_color(FL_SELECTION_COLOR); + o->labeltype(FL_NORMAL_LABEL); + o->labelfont(1); + o->labelsize(11); + o->labelcolor(FL_FOREGROUND_COLOR); + o->textfont(4); + o->textsize(11); + o->callback((Fl_Callback*)callback_cb); + o->align(FL_ALIGN_LEFT); + o->when(FL_WHEN_RELEASE); + Fl_Group::current()->resizable(o); + } // CodeEditor* o + { Fl_Group* o = new Fl_Group(95, 270, 310, 20, "User Data:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Input* o = new Fl_Input(95, 270, 158, 20); + o->tooltip("The user data to pass into the callback code."); + o->labelfont(1); + o->labelsize(11); + o->textfont(4); + o->textsize(11); + o->callback((Fl_Callback*)user_data_cb); + Fl_Group::current()->resizable(o); + } // Fl_Input* o + { Fl_Choice* o = new Fl_Choice(300, 270, 105, 20, "When:"); + o->tooltip("When to call the callback function."); + o->box(FL_THIN_UP_BOX); + o->down_box(FL_BORDER_BOX); + o->labelfont(1); + o->labelsize(11); + o->textsize(11); + o->callback((Fl_Callback*)when_cb); + o->when(FL_WHEN_CHANGED); + o->menu(whenmenu); + } // Fl_Choice* o + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(95, 295, 310, 20, "Type:"); + o->labelfont(1); + o->labelsize(11); + o->callback((Fl_Callback*)propagate_load); + o->align(FL_ALIGN_LEFT); + { Fl_Input* o = new Fl_Input(95, 295, 158, 20); + o->tooltip("The type of the user data."); + o->labelfont(1); + o->labelsize(11); + o->textfont(4); + o->textsize(11); + o->callback((Fl_Callback*)user_data_type_cb); + Fl_Group::current()->resizable(o); + } // Fl_Input* o + { Fl_Light_Button* o = new Fl_Light_Button(300, 295, 105, 20, "No Change"); + o->tooltip("Call the callback even if the value has not changed."); + o->selection_color((Fl_Color)1); + o->labelsize(11); + o->callback((Fl_Callback*)when_button_cb); + } // Fl_Light_Button* o + o->end(); + } // Fl_Group* o + o->end(); + } // Fl_Group* o + o->end(); + Fl_Group::current()->resizable(o); + } // Fl_Tabs* o + { Fl_Group* o = new Fl_Group(9, 330, 400, 20); + o->labelsize(11); + { Fl_Box* o = new Fl_Box(9, 330, 20, 20); + o->labelsize(11); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + { Fl_Button* o = new Fl_Button(240, 330, 99, 20, "Hide &Overlays"); + o->tooltip("Hide the widget overlay box."); + o->labelsize(11); + o->labelcolor((Fl_Color)1); + o->callback((Fl_Callback*)overlay_cb); + } // Fl_Button* o + { Fl_Button* o = new Fl_Button(66, 330, 80, 20, "Revert"); + o->labelsize(11); + o->callback((Fl_Callback*)revert_cb); + o->hide(); + } // Fl_Button* o + { Fl_Return_Button* o = new Fl_Return_Button(344, 330, 64, 20, "Close"); + o->labelsize(11); + o->callback((Fl_Callback*)ok_cb); + } // Fl_Return_Button* o + { Fl_Button* o = new Fl_Button(339, 330, 70, 20, "Cancel"); + o->labelsize(11); + o->callback((Fl_Callback*)cancel_cb); + o->hide(); + } // Fl_Button* o + { wLiveMode = new Fl_Button(151, 330, 84, 20, "Live &Mode"); + wLiveMode->tooltip("Create a live duplicate of the selected widgets to test resizing and menu beh\ +avior."); + wLiveMode->type(1); + wLiveMode->labelsize(11); + wLiveMode->callback((Fl_Callback*)live_mode_cb); + } // Fl_Button* wLiveMode + o->end(); + } // Fl_Group* o + o->size_range(o->w(), o->h()); + o->end(); + } // Fl_Double_Window* o + return w; +} + +// +// End of "$Id: widget_panel.cxx 6817 2009-07-02 09:42:17Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/widget_panel.fl b/third_party/windows/fltk-1.1.10/fluid/widget_panel.fl new file mode 100644 index 0000000..6ab4e00 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/widget_panel.fl @@ -0,0 +1,579 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0108 +header_name {.h} +code_name {.cxx} +comment {// +// "$Id: widget_panel.fl 6012 2008-01-04 21:45:49Z matt $" +// +// Widget panel for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +} {in_source in_header +} + +Function {make_widget_panel()} {open +} { + Fl_Window {} {open + xywh {383 206 420 360} type Double labelsize 11 align 80 resizable hotspot + code0 {o->size_range(o->w(), o->h());} visible + } { + Fl_Tabs {} { + callback {propagate_load((Fl_Group *)o,v);} open + xywh {10 10 400 310} selection_color 12 labelsize 11 labelcolor 7 when 0 resizable + } { + Fl_Group {} { + label GUI + callback propagate_load + xywh {10 30 400 290} labelsize 11 when 0 hide resizable + } { + Fl_Group {} { + label {Label:} + callback propagate_load + xywh {95 40 309 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Input {} { + callback label_cb + tooltip {The label text for the widget.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 1 textsize 11 resizable + } + Fl_Choice {} { + callback labeltype_cb open + tooltip {The label style for the widget.} xywh {284 40 120 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 + code0 {extern Fl_Menu_Item labeltypemenu[];} + code1 {o->menu(labeltypemenu);} + } {} + } + Fl_Group {} { + label {Image:} + callback propagate_load + xywh {95 65 309 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Input {} { + callback image_cb + tooltip {The active image for the widget.} xywh {95 65 240 20} labelfont 1 labelsize 11 textsize 11 resizable + } + Fl_Button {} { + label {Browse...} + callback image_browse_cb + tooltip {Click to choose the active image.} xywh {334 65 70 20} labelsize 11 + } + } + Fl_Group {} { + label {Inactive:} + callback propagate_load + xywh {95 90 309 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Input {} { + callback inactive_cb + tooltip {The inactive image for the widget.} xywh {95 90 240 20} labelfont 1 labelsize 11 textsize 11 resizable + } + Fl_Button {} { + label {Browse...} + callback inactive_browse_cb + tooltip {Click to choose the inactive image.} xywh {334 90 70 20} labelsize 11 + } + } + Fl_Group {} { + label {Alignment:} + callback propagate_load + xywh {95 115 300 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Button {} { + label Clip + user_data FL_ALIGN_CLIP + callback align_cb + tooltip {Clip the label to the inside of the widget.} xywh {95 115 45 20} type Toggle selection_color 8 labelsize 11 align 16 + } + Fl_Button {} { + label Wrap + user_data FL_ALIGN_WRAP + callback align_cb + tooltip {Wrap the label text.} xywh {145 115 50 20} type Toggle selection_color 8 labelsize 11 + } + Fl_Button {} { + label {Text/Image} + user_data FL_ALIGN_TEXT_OVER_IMAGE + callback align_cb + tooltip {Show the label text over the image.} xywh {200 115 65 20} type Toggle selection_color 8 labelsize 11 + } + Fl_Button {} { + label {@-1<-} + user_data FL_ALIGN_LEFT + callback align_cb + tooltip {Left-align the label.} xywh {270 115 20 20} type Toggle selection_color 8 labelsize 11 labelcolor 8 + } + Fl_Button {} { + label {@-1->} + user_data FL_ALIGN_RIGHT + callback align_cb + tooltip {Right-align the label.} xywh {295 115 20 20} type Toggle selection_color 8 labelsize 11 labelcolor 8 + } + Fl_Button {} { + label {@-18} + user_data FL_ALIGN_TOP + callback align_cb + tooltip {Top-align the label.} xywh {320 115 20 20} type Toggle selection_color 8 labelsize 11 labelcolor 8 + } + Fl_Button {} { + label {@-12} + user_data FL_ALIGN_BOTTOM + callback align_cb + tooltip {Bottom-align the label.} xywh {345 115 20 20} type Toggle selection_color 8 labelsize 11 labelcolor 8 + } + Fl_Button {} { + label {@-3square} + user_data FL_ALIGN_INSIDE + callback align_cb + tooltip {Show the label inside the widget.} xywh {370 115 20 20} type Toggle selection_color 8 labelsize 11 labelcolor 8 + } + Fl_Box {} { + xywh {395 115 0 20} labelsize 11 resizable + } + } + Fl_Group {} { + label {Position:} + callback propagate_load + xywh {95 150 300 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Value_Input widget_x_input { + label {X:} + callback x_cb + tooltip {The X position of the widget.} xywh {95 150 55 20} labelsize 11 align 5 maximum 2048 step 1 textsize 11 + } + Fl_Value_Input widget_y_input { + label {Y:} + callback y_cb + tooltip {The Y position of the widget.} xywh {155 150 55 20} labelsize 11 align 5 maximum 2048 step 1 textsize 11 + } + Fl_Value_Input widget_w_input { + label {Width:} + callback w_cb + tooltip {The width of the widget.} xywh {215 150 55 20} labelsize 11 align 5 maximum 2048 step 1 textsize 11 + } + Fl_Value_Input widget_h_input { + label {Height:} + callback h_cb + tooltip {The height of the widget.} xywh {275 150 55 20} labelsize 11 align 5 maximum 2048 step 1 textsize 11 + } + Fl_Light_Button {} { + label Relative + callback wc_relative_cb + tooltip {If set, widgets inside a widget class of type Fl_Group are repositioned relative to the origin at construction time} xywh {335 150 55 20} labelsize 11 + } + Fl_Box {} { + xywh {394 150 1 20} resizable + } + } + Fl_Group {} { + label {Values:} + callback propagate_load + xywh {95 185 300 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Value_Input {} { + label {Size:} + callback slider_size_cb + tooltip {The size of the slider.} xywh {95 185 55 20} labelsize 11 align 5 step 0.010101 textsize 11 + } + Fl_Value_Input {} { + label {Minimum:} + callback min_cb + tooltip {The minimum value of the widget.} xywh {155 185 55 20} labelsize 11 align 5 textsize 11 + } + Fl_Value_Input {} { + label {Maximum:} + callback max_cb + tooltip {The maximum value of the widget.} xywh {215 185 55 20} labelsize 11 align 5 value 1 textsize 11 + } + Fl_Value_Input {} { + label {Step:} + callback step_cb + tooltip {The resolution of the widget value.} xywh {275 185 55 20} labelsize 11 align 5 textsize 11 + } + Fl_Value_Input {} { + label {Value:} + callback value_cb + tooltip {The current widget value.} xywh {335 185 55 20} labelsize 11 align 5 textsize 11 + } + Fl_Box {} { + xywh {395 185 0 20} resizable + } + } + Fl_Group {} { + label {Size Range:} + callback propagate_load + xywh {95 185 300 20} labelfont 1 labelsize 11 align 4 hide + } { + Fl_Value_Input {} { + label {Minimum Size:} + callback min_w_cb + tooltip {The size of the slider.} xywh {95 185 55 20} labelsize 11 align 5 maximum 2048 step 1 textsize 11 + } + Fl_Value_Input {} { + callback min_h_cb + tooltip {The minimum value of the widget.} xywh {155 185 55 20} labelsize 11 align 5 maximum 2048 step 1 textsize 11 + } + Fl_Button {} { + label set + callback set_min_size_cb + xywh {215 185 25 20} labelsize 11 + } + Fl_Value_Input {} { + label {Maximum Size:} + callback max_w_cb + tooltip {The maximum value of the widget.} xywh {245 185 55 20} labelsize 11 align 5 maximum 2048 step 1 textsize 11 + } + Fl_Value_Input {} { + callback max_h_cb + tooltip {The resolution of the widget value.} xywh {305 185 55 20} labelsize 11 align 5 maximum 2048 step 1 textsize 11 + } + Fl_Button {} { + label set + callback set_max_size_cb + xywh {365 185 25 20} labelsize 11 + } + Fl_Box {} { + xywh {395 185 0 20} resizable + } + } + Fl_Button {} { + label {Shortcut:} + callback shortcut_in_cb + tooltip {The shortcut key for the widget.} xywh {95 210 310 20} box DOWN_BOX color 7 selection_color 7 labelfont 1 labelsize 11 align 4 + code0 {\#include "Shortcut_Button.h"} + class Shortcut_Button + } + Fl_Group {} { + label {X Class:} + callback propagate_load + xywh {95 235 300 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Input {} { + label {:} + callback xclass_cb + tooltip {The X resource class.} xywh {95 235 95 20} labelfont 1 labelsize 11 textsize 11 resizable + } + Fl_Light_Button {} { + label Border + callback border_cb + tooltip {Add a border around the window.} xywh {195 235 60 20} selection_color 1 labelsize 11 + } + Fl_Light_Button {} { + label Modal + callback modal_cb + tooltip {Make the window modal.} xywh {260 235 55 20} selection_color 1 labelsize 11 + } + Fl_Light_Button {} { + label Nonmodal + callback non_modal_cb + tooltip {Make the window non-modal.} xywh {320 235 75 20} selection_color 1 labelsize 11 align 148 + } + } + Fl_Group {} { + label {Attributes:} + callback propagate_load + xywh {95 260 305 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Light_Button {} { + label Visible + callback visible_cb + tooltip {Show the widget.} xywh {95 260 60 20} selection_color 1 labelsize 11 + } + Fl_Light_Button {} { + label Active + callback active_cb + tooltip {Activate the widget.} xywh {160 260 60 20} selection_color 1 labelsize 11 + } + Fl_Light_Button {} { + label Resizable + callback resizable_cb + tooltip {Make the widget resizable.} xywh {225 260 75 20} selection_color 1 labelsize 11 when 1 + } + Fl_Light_Button {} { + label Hotspot + callback hotspot_cb + tooltip {Center the window under this widget.} xywh {305 260 70 20} selection_color 1 labelsize 11 when 1 + } + Fl_Box {} { + xywh {395 260 0 20} labelsize 11 resizable + } + } + Fl_Input {} { + label {Tooltip:} + callback tooltip_cb + tooltip {The tooltip text for the widget.} xywh {95 285 310 20} labelfont 1 labelsize 11 textsize 11 + } + Fl_Box {} { + xywh {95 305 300 5} labelsize 11 resizable + } + } + Fl_Group {} { + label Style + callback propagate_load + xywh {10 30 400 290} labelsize 11 when 0 hide + } { + Fl_Group {} { + label {Label Font:} + callback propagate_load + xywh {95 40 309 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Choice {} { + callback labelfont_cb open + tooltip {The style of the label text.} xywh {95 40 170 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable + code0 {extern Fl_Menu_Item fontmenu[];} + code1 {o->menu(fontmenu);} + } {} + Fl_Value_Input {} { + callback labelsize_cb + tooltip {The size of the label text.} xywh {264 40 50 20} labelsize 11 maximum 100 step 1 value 14 textsize 11 + } + Fl_Button {} { + label {Label Color} + callback labelcolor_cb + tooltip {The color of the label text.} xywh {314 40 90 20} labelsize 11 + } + } + Fl_Group {} { + label {Box:} + callback propagate_load + xywh {95 65 309 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Choice {} { + callback box_cb open + tooltip {The "up" box of the widget.} xywh {95 65 219 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable + code0 {extern Fl_Menu_Item boxmenu[];} + code1 {o->menu(boxmenu);} + } {} + Fl_Button {} { + label Color + callback color_cb + tooltip {The background color of the widget.} xywh {314 65 90 20} labelsize 11 + } + } + Fl_Group {} { + label {Down Box:} + callback propagate_load + xywh {95 90 309 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Choice {} { + callback down_box_cb open + tooltip {The "down" box of the widget.} xywh {95 90 219 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable + code0 {extern Fl_Menu_Item boxmenu[];} + code1 {o->menu(boxmenu);} + } {} + Fl_Button {} { + label {Select Color} + callback color2_cb + tooltip {The selection color of the widget.} xywh {314 90 90 20} labelsize 11 + } + } + Fl_Group {} { + label {Text Font:} + callback propagate_load + xywh {95 115 309 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Choice {} { + callback textfont_cb open + tooltip {The value text style.} xywh {95 115 170 20} box DOWN_BOX down_box BORDER_BOX labelfont 1 labelsize 11 textsize 11 resizable + code0 {extern Fl_Menu_Item fontmenu[];} + code1 {o->menu(fontmenu);} + } {} + Fl_Value_Input {} { + callback textsize_cb + tooltip {The value text size.} xywh {264 115 50 20} labelsize 11 maximum 100 step 1 value 14 textsize 11 + } + Fl_Button {} { + label {Text Color} + callback textcolor_cb + tooltip {The value text color.} xywh {314 115 90 20} labelsize 11 + } + } + Fl_Box {} { + xywh {95 140 300 40} labelsize 11 resizable + } + } + Fl_Group {} { + label {C++} + callback propagate_load open + xywh {10 30 400 290} labelsize 11 when 0 + } { + Fl_Group {} { + label {Class:} + callback propagate_load + xywh {95 40 310 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Input {} { + user_data 4 + callback subclass_cb + tooltip {The widget subclass.} xywh {95 40 172 20} labelfont 1 labelsize 11 textfont 4 textsize 11 resizable + } + Fl_Choice {} { + callback subtype_cb open + tooltip {The widget subtype.} xywh {265 40 140 20} box THIN_UP_BOX down_box BORDER_BOX labelsize 11 textsize 11 + } {} + } + Fl_Group {} { + label {Name:} + callback propagate_load open + xywh {95 65 310 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Input {} { + callback name_cb selected + tooltip {The name of the widget.} xywh {95 65 235 20} labelfont 1 labelsize 11 textsize 11 resizable + } + Fl_Choice {} { + callback name_public_member_cb open + tooltip {Change member access attribute.} xywh {330 65 75 20} down_box BORDER_BOX labelsize 11 when 1 textsize 11 + } { + MenuItem {} { + label private + user_data 0 user_data_type long + xywh {0 0 100 20} labelsize 11 + } + MenuItem {} { + label public + user_data 1 user_data_type long + xywh {0 0 100 20} labelsize 11 + } + MenuItem {} { + label protected + user_data 2 user_data_type long + xywh {0 0 100 20} labelsize 11 + } + } + Fl_Choice {} { + callback name_public_cb open + tooltip {Change widget accessibility.} xywh {330 65 75 20} down_box BORDER_BOX labelsize 11 when 1 textsize 11 + } { + MenuItem {} { + label local + user_data 0 user_data_type long + xywh {10 10 100 20} labelsize 11 + } + MenuItem {} { + label global + user_data 1 user_data_type long + xywh {10 10 100 20} labelsize 11 + } + } + } + Fl_Input {v_input[0]} { + label {Extra Code:} + user_data 0 + callback v_input_cb + tooltip {Extra initialization code for the widget.} xywh {95 90 310 20} labelfont 1 labelsize 11 textfont 4 textsize 11 + } + Fl_Input {v_input[1]} { + user_data 1 + callback v_input_cb + tooltip {Extra initialization code for the widget.} xywh {95 110 310 20} labelsize 11 textfont 4 textsize 11 + } + Fl_Input {v_input[2]} { + user_data 2 + callback v_input_cb + tooltip {Extra initialization code for the widget.} xywh {95 130 310 20} labelsize 11 textfont 4 textsize 11 + } + Fl_Input {v_input[3]} { + user_data 3 + callback v_input_cb + tooltip {Extra initialization code for the widget.} xywh {95 150 310 20} labelsize 11 textfont 4 textsize 11 + } + Fl_Text_Editor {} { + label {Callback:} + callback callback_cb + tooltip {The callback function or code for the widget. Use the variable name 'o' to access the Widget pointer and 'v' to access the user value.} xywh {95 175 310 90} box DOWN_BOX labelfont 1 labelsize 11 align 4 textfont 4 textsize 11 resizable + code0 {\#include "CodeEditor.h"} + class CodeEditor + } + Fl_Group {} { + label {User Data:} + callback propagate_load + xywh {95 270 310 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Input {} { + callback user_data_cb + tooltip {The user data to pass into the callback code.} xywh {95 270 158 20} labelfont 1 labelsize 11 textfont 4 textsize 11 resizable + } + Fl_Choice {} { + label {When:} + callback when_cb open + tooltip {When to call the callback function.} xywh {300 270 105 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 11 when 1 textsize 11 + code0 {extern Fl_Menu_Item whenmenu[];} + code1 {o->menu(whenmenu);} + } {} + } + Fl_Group {} { + label {Type:} + callback propagate_load + xywh {95 295 310 20} labelfont 1 labelsize 11 align 4 + } { + Fl_Input {} { + callback user_data_type_cb + tooltip {The type of the user data.} xywh {95 295 158 20} labelfont 1 labelsize 11 textfont 4 textsize 11 resizable + } + Fl_Light_Button {} { + label {No Change} + callback when_button_cb + tooltip {Call the callback even if the value has not changed.} xywh {300 295 105 20} selection_color 1 labelsize 11 + } + } + } + } + Fl_Group {} {open + xywh {9 330 400 20} labelsize 11 + } { + Fl_Box {} { + xywh {9 330 20 20} labelsize 11 resizable + } + Fl_Button {} { + label {Hide &Overlays} + callback overlay_cb + tooltip {Hide the widget overlay box.} xywh {240 330 99 20} labelsize 11 labelcolor 1 + } + Fl_Button {} { + label Revert + callback revert_cb + xywh {66 330 80 20} labelsize 11 hide + } + Fl_Return_Button {} { + label Close + callback ok_cb + xywh {344 330 64 20} labelsize 11 + } + Fl_Button {} { + label Cancel + callback cancel_cb + xywh {339 330 70 20} labelsize 11 hide + } + Fl_Button wLiveMode { + label {Live &Mode} + callback live_mode_cb + tooltip {Create a live duplicate of the selected widgets to test resizing and menu behavior.} xywh {151 330 84 20} type Toggle labelsize 11 + } + } + } +} + +comment { +// +// End of "$Id: widget_panel.fl 6012 2008-01-04 21:45:49Z matt $". +//} {in_source in_header +} diff --git a/third_party/windows/fltk-1.1.10/fluid/widget_panel.h b/third_party/windows/fltk-1.1.10/fluid/widget_panel.h new file mode 100644 index 0000000..0c78ebf --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/widget_panel.h @@ -0,0 +1,122 @@ +// +// "$Id: widget_panel.h 6817 2009-07-02 09:42:17Z AlbrechtS $" +// +// Widget panel for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0110 + +#ifndef widget_panel_h +#define widget_panel_h +#include +#include +#include +#include +extern void propagate_load(Fl_Group*, void*); +#include +extern void label_cb(Fl_Input*, void*); +#include +extern Fl_Menu_Item labeltypemenu[]; +extern void labeltype_cb(Fl_Choice*, void*); +extern void image_cb(Fl_Input*, void*); +#include +extern void image_browse_cb(Fl_Button*, void*); +extern void inactive_cb(Fl_Input*, void*); +extern void inactive_browse_cb(Fl_Button*, void*); +extern void align_cb(Fl_Button*, void*); +#include +#include +extern void x_cb(Fl_Value_Input*, void*); +extern Fl_Value_Input *widget_x_input; +extern void y_cb(Fl_Value_Input*, void*); +extern Fl_Value_Input *widget_y_input; +extern void w_cb(Fl_Value_Input*, void*); +extern Fl_Value_Input *widget_w_input; +extern void h_cb(Fl_Value_Input*, void*); +extern Fl_Value_Input *widget_h_input; +#include +extern void wc_relative_cb(Fl_Light_Button*, void*); +extern void slider_size_cb(Fl_Value_Input*, void*); +extern void min_cb(Fl_Value_Input*, void*); +extern void max_cb(Fl_Value_Input*, void*); +extern void step_cb(Fl_Value_Input*, void*); +extern void value_cb(Fl_Value_Input*, void*); +extern void min_w_cb(Fl_Value_Input*, void*); +extern void min_h_cb(Fl_Value_Input*, void*); +extern void set_min_size_cb(Fl_Button*, void*); +extern void max_w_cb(Fl_Value_Input*, void*); +extern void max_h_cb(Fl_Value_Input*, void*); +extern void set_max_size_cb(Fl_Button*, void*); +#include "Shortcut_Button.h" +extern void shortcut_in_cb(Shortcut_Button*, void*); +extern void xclass_cb(Fl_Input*, void*); +extern void border_cb(Fl_Light_Button*, void*); +extern void modal_cb(Fl_Light_Button*, void*); +extern void non_modal_cb(Fl_Light_Button*, void*); +extern void visible_cb(Fl_Light_Button*, void*); +extern void active_cb(Fl_Light_Button*, void*); +extern void resizable_cb(Fl_Light_Button*, void*); +extern void hotspot_cb(Fl_Light_Button*, void*); +extern void tooltip_cb(Fl_Input*, void*); +extern Fl_Menu_Item fontmenu[]; +extern void labelfont_cb(Fl_Choice*, void*); +extern void labelsize_cb(Fl_Value_Input*, void*); +extern void labelcolor_cb(Fl_Button*, void*); +extern Fl_Menu_Item boxmenu[]; +extern void box_cb(Fl_Choice*, void*); +extern void color_cb(Fl_Button*, void*); +extern void down_box_cb(Fl_Choice*, void*); +extern void color2_cb(Fl_Button*, void*); +extern void textfont_cb(Fl_Choice*, void*); +extern void textsize_cb(Fl_Value_Input*, void*); +extern void textcolor_cb(Fl_Button*, void*); +extern void subclass_cb(Fl_Input*, void*); +extern void subtype_cb(Fl_Choice*, void*); +extern void name_cb(Fl_Input*, void*); +extern void name_public_member_cb(Fl_Choice*, void*); +extern void name_public_cb(Fl_Choice*, void*); +extern void v_input_cb(Fl_Input*, void*); +extern Fl_Input *v_input[4]; +#include "CodeEditor.h" +extern void callback_cb(CodeEditor*, void*); +extern void user_data_cb(Fl_Input*, void*); +extern Fl_Menu_Item whenmenu[]; +extern void when_cb(Fl_Choice*, void*); +extern void user_data_type_cb(Fl_Input*, void*); +extern void when_button_cb(Fl_Light_Button*, void*); +extern void overlay_cb(Fl_Button*, void*); +extern void revert_cb(Fl_Button*, void*); +#include +extern void ok_cb(Fl_Return_Button*, void*); +extern void cancel_cb(Fl_Button*, void*); +extern void live_mode_cb(Fl_Button*, void*); +extern Fl_Button *wLiveMode; +Fl_Double_Window* make_widget_panel(); +extern Fl_Menu_Item menu_[]; +extern Fl_Menu_Item menu_1[]; +#endif + +// +// End of "$Id: widget_panel.h 6817 2009-07-02 09:42:17Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/fluid/x-fluid.desktop b/third_party/windows/fltk-1.1.10/fluid/x-fluid.desktop new file mode 100644 index 0000000..f31602d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/fluid/x-fluid.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=MimeType +MimeType=application/x-fluid +Icon=fluid.png +Patterns=*.fl +Name=FLUID +Comment=FLUID GUI Design +Encoding=UTF-8 diff --git a/third_party/windows/fltk-1.1.10/forms.h b/third_party/windows/fltk-1.1.10/forms.h new file mode 100644 index 0000000..1f8db4d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/forms.h @@ -0,0 +1,3 @@ +// this file allows some forms programs to be compiled with no change. +// put it in your include path. +#include diff --git a/third_party/windows/fltk-1.1.10/install-sh b/third_party/windows/fltk-1.1.10/install-sh new file mode 100644 index 0000000..bdc9771 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/install-sh @@ -0,0 +1,238 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. +# + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +tranformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/third_party/windows/fltk-1.1.10/jpeg/CMakeLists.txt b/third_party/windows/fltk-1.1.10/jpeg/CMakeLists.txt new file mode 100644 index 0000000..7033f8f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/CMakeLists.txt @@ -0,0 +1,36 @@ +PROJECT(FLTKJPEG) + +INCLUDE_REGULAR_EXPRESSION("^(jchuff|jconfig|jdct|jdhuff|jerror|jinclude|jmemsys|jmorecfg|jpegint|jpeglib|jversion|jpeg).*$") + +INCLUDE_DIRECTORIES(${FLTKJPEG_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${FLTKJPEG_BINARY_DIR}) + +# memmgr back ends: compile only one of these into a working library +# (For now, let's use the mode that requires the image fit into memory. +# This is the recommended mode for Win32 anyway.) +SET(systemdependent_SRCS jmemnobs.c) + +# library object files common to compression and decompression +SET(common_SRCS +jcomapi.c jutils.c jerror.c jmemmgr.c +) + +# compression library object files +SET(compression_SRCS +jcapimin.c jcapistd.c jctrans.c jcparam.c jdatadst.c jcinit.c +jcmaster.c jcmarker.c jcmainct.c jcprepct.c jccoefct.c jccolor.c +jcsample.c jchuff.c jcphuff.c jcdctmgr.c jfdctfst.c jfdctflt.c +jfdctint.c +) + +# decompression library object files +SET(decompression_SRCS +jdapimin.c jdapistd.c jdtrans.c jdatasrc.c jdmaster.c +jdinput.c jdmarker.c jdhuff.c jdphuff.c jdmainct.c jdcoefct.c +jdpostct.c jddctmgr.c jidctfst.c jidctflt.c jidctint.c jidctred.c +jdsample.c jdcolor.c jquant1.c jquant2.c jdmerge.c +) + +ADD_LIBRARY(fltk_jpeg ${systemdependent_SRCS} ${common_SRCS} ${compression_SRCS} ${decompression_SRCS}) +INSTALL_TARGETS(/lib fltk_jpeg) + diff --git a/third_party/windows/fltk-1.1.10/jpeg/Makefile b/third_party/windows/fltk-1.1.10/jpeg/Makefile new file mode 100644 index 0000000..176dc72 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/Makefile @@ -0,0 +1,118 @@ +# +# "$Id: Makefile 5663 2007-02-06 19:35:28Z mike $" +# +# JPEG library makefile for the Fast Light Toolkit (FLTK). +# +# Copyright 1997-2005 by Easy Software Products. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems to "fltk-bugs@fltk.org". +# + +include ../makeinclude + + +# +# Object files... +# + +OBJS = jmemnobs.o \ + jcapimin.o jcapistd.o jccoefct.o jccolor.o jcdctmgr.o \ + jchuff.o jcinit.o jcmainct.o jcmarker.o jcmaster.o jcomapi.o \ + jcparam.o jcphuff.o jcprepct.o jcsample.o jctrans.o \ + jdapimin.o jdapistd.o jdatadst.o jdatasrc.o jdcoefct.o \ + jdcolor.o jddctmgr.o jdhuff.o jdinput.o jdmainct.o jdmarker.o \ + jdmaster.o jdmerge.o jdphuff.o jdpostct.o jdsample.o \ + jdtrans.o jerror.o jfdctflt.o jfdctfst.o jfdctint.o \ + jidctflt.o jidctfst.o jidctint.o jidctred.o jquant1.o \ + jquant2.o jutils.o jmemmgr.o + +LIBJPEG = ../lib/libfltk_jpeg$(LIBEXT) + + +# +# Make all targets... +# + +all: $(LIBJPEG) + + +# +# Clean all targets and object files... +# + +clean: + $(RM) $(OBJS) + $(RM) $(LIBJPEG) + + +# +# Install everything... +# + +install: $(LIBJPEG) + echo "Installing $(LIBJPEG) in $(libdir)..." + -$(INSTALL_DIR) $(DESTDIR)$(libdir) + $(INSTALL_LIB) $(LIBJPEG) $(DESTDIR)$(libdir) + $(RANLIB) $(DESTDIR)$(libdir)/libfltk_jpeg$(LIBEXT) + echo "Installing jpeg headers in $(includedir)/FL/images..." + -$(INSTALL_DIR) $(DESTDIR)$(includedir)/FL/images + $(INSTALL_DATA) jconfig.h $(DESTDIR)$(includedir)/FL/images + $(INSTALL_DATA) jerror.h $(DESTDIR)$(includedir)/FL/images + $(INSTALL_DATA) jmorecfg.h $(DESTDIR)$(includedir)/FL/images + $(INSTALL_DATA) jpeglib.h $(DESTDIR)$(includedir)/FL/images + + +# +# Uninstall everything... +# + +uninstall: + echo "Uninstalling libfltk_jpeg$(LIBEXT) in $(libdir)..." + $(RM) $(libdir)/libfltk_jpeg$(LIBEXT) + echo "Uninstalling jpeg headers in $(includedir)/FL/images..." + $(RM) $(includedir)/FL/images/jconfig.h + $(RM) $(includedir)/FL/images/jerror.h + $(RM) $(includedir)/FL/images/jmorecfg.h + $(RM) $(includedir)/FL/images/jpeglib.h + + +# +# libfltk_jpeg.a +# + +$(LIBJPEG): $(OBJS) + echo Archiving $@... + $(RM) $@ + $(LIBCOMMAND) $@ $(OBJS) + $(RANLIB) $@ + + +# +# Make dependencies... +# + +depend: $(OBJS:.o=.c) + makedepend -Y -I.. -f makedepend $(OBJS:.o=.c) + +include makedepend + +$(OBJS): ../makeinclude + +# +# End of "$Id: Makefile 5663 2007-02-06 19:35:28Z mike $". +# diff --git a/third_party/windows/fltk-1.1.10/jpeg/README b/third_party/windows/fltk-1.1.10/jpeg/README new file mode 100644 index 0000000..911d0e8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/README @@ -0,0 +1,385 @@ +The Independent JPEG Group's JPEG software +========================================== + +README for release 6b of 27-Mar-1998 +==================================== + +This distribution contains the sixth public release of the Independent JPEG +Group's free JPEG software. You are welcome to redistribute this software and +to use it for any purpose, subject to the conditions under LEGAL ISSUES, below. + +Serious users of this software (particularly those incorporating it into +larger programs) should contact IJG at jpeg-info@uunet.uu.net to be added to +our electronic mailing list. Mailing list members are notified of updates +and have a chance to participate in technical discussions, etc. + +This software is the work of Tom Lane, Philip Gladstone, Jim Boucher, +Lee Crocker, Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, +Guido Vollbeding, Ge' Weijers, and other members of the Independent JPEG +Group. + +IJG is not affiliated with the official ISO JPEG standards committee. + + +DOCUMENTATION ROADMAP +===================== + +This file contains the following sections: + +OVERVIEW General description of JPEG and the IJG software. +LEGAL ISSUES Copyright, lack of warranty, terms of distribution. +REFERENCES Where to learn more about JPEG. +ARCHIVE LOCATIONS Where to find newer versions of this software. +RELATED SOFTWARE Other stuff you should get. +FILE FORMAT WARS Software *not* to get. +TO DO Plans for future IJG releases. + +Other documentation files in the distribution are: + +User documentation: + install.doc How to configure and install the IJG software. + usage.doc Usage instructions for cjpeg, djpeg, jpegtran, + rdjpgcom, and wrjpgcom. + *.1 Unix-style man pages for programs (same info as usage.doc). + wizard.doc Advanced usage instructions for JPEG wizards only. + change.log Version-to-version change highlights. +Programmer and internal documentation: + libjpeg.doc How to use the JPEG library in your own programs. + example.c Sample code for calling the JPEG library. + structure.doc Overview of the JPEG library's internal structure. + filelist.doc Road map of IJG files. + coderules.doc Coding style rules --- please read if you contribute code. + +Please read at least the files install.doc and usage.doc. Useful information +can also be found in the JPEG FAQ (Frequently Asked Questions) article. See +ARCHIVE LOCATIONS below to find out where to obtain the FAQ article. + +If you want to understand how the JPEG code works, we suggest reading one or +more of the REFERENCES, then looking at the documentation files (in roughly +the order listed) before diving into the code. + + +OVERVIEW +======== + +This package contains C software to implement JPEG image compression and +decompression. JPEG (pronounced "jay-peg") is a standardized compression +method for full-color and gray-scale images. JPEG is intended for compressing +"real-world" scenes; line drawings, cartoons and other non-realistic images +are not its strong suit. JPEG is lossy, meaning that the output image is not +exactly identical to the input image. Hence you must not use JPEG if you +have to have identical output bits. However, on typical photographic images, +very good compression levels can be obtained with no visible change, and +remarkably high compression levels are possible if you can tolerate a +low-quality image. For more details, see the references, or just experiment +with various compression settings. + +This software implements JPEG baseline, extended-sequential, and progressive +compression processes. Provision is made for supporting all variants of these +processes, although some uncommon parameter settings aren't implemented yet. +For legal reasons, we are not distributing code for the arithmetic-coding +variants of JPEG; see LEGAL ISSUES. We have made no provision for supporting +the hierarchical or lossless processes defined in the standard. + +We provide a set of library routines for reading and writing JPEG image files, +plus two sample applications "cjpeg" and "djpeg", which use the library to +perform conversion between JPEG and some other popular image file formats. +The library is intended to be reused in other applications. + +In order to support file conversion and viewing software, we have included +considerable functionality beyond the bare JPEG coding/decoding capability; +for example, the color quantization modules are not strictly part of JPEG +decoding, but they are essential for output to colormapped file formats or +colormapped displays. These extra functions can be compiled out of the +library if not required for a particular application. We have also included +"jpegtran", a utility for lossless transcoding between different JPEG +processes, and "rdjpgcom" and "wrjpgcom", two simple applications for +inserting and extracting textual comments in JFIF files. + +The emphasis in designing this software has been on achieving portability and +flexibility, while also making it fast enough to be useful. In particular, +the software is not intended to be read as a tutorial on JPEG. (See the +REFERENCES section for introductory material.) Rather, it is intended to +be reliable, portable, industrial-strength code. We do not claim to have +achieved that goal in every aspect of the software, but we strive for it. + +We welcome the use of this software as a component of commercial products. +No royalty is required, but we do ask for an acknowledgement in product +documentation, as described under LEGAL ISSUES. + + +LEGAL ISSUES +============ + +In plain English: + +1. We don't promise that this software works. (But if you find any bugs, + please let us know!) +2. You can use this software for whatever you want. You don't have to pay us. +3. You may not pretend that you wrote this software. If you use it in a + program, you must acknowledge somewhere in your documentation that + you've used the IJG code. + +In legalese: + +The authors make NO WARRANTY or representation, either express or implied, +with respect to this software, its quality, accuracy, merchantability, or +fitness for a particular purpose. This software is provided "AS IS", and you, +its user, assume the entire risk as to its quality and accuracy. + +This software is copyright (C) 1991-1998, Thomas G. Lane. +All Rights Reserved except as specified below. + +Permission is hereby granted to use, copy, modify, and distribute this +software (or portions thereof) for any purpose, without fee, subject to these +conditions: +(1) If any part of the source code for this software is distributed, then this +README file must be included, with this copyright and no-warranty notice +unaltered; and any additions, deletions, or changes to the original files +must be clearly indicated in accompanying documentation. +(2) If only executable code is distributed, then the accompanying +documentation must state that "this software is based in part on the work of +the Independent JPEG Group". +(3) Permission for use of this software is granted only if the user accepts +full responsibility for any undesirable consequences; the authors accept +NO LIABILITY for damages of any kind. + +These conditions apply to any software derived from or based on the IJG code, +not just to the unmodified library. If you use our work, you ought to +acknowledge us. + +Permission is NOT granted for the use of any IJG author's name or company name +in advertising or publicity relating to this software or products derived from +it. This software may be referred to only as "the Independent JPEG Group's +software". + +We specifically permit and encourage the use of this software as the basis of +commercial products, provided that all warranty or liability claims are +assumed by the product vendor. + + +ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, +sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. +ansi2knr.c is NOT covered by the above copyright and conditions, but instead +by the usual distribution terms of the Free Software Foundation; principally, +that you must include source code if you redistribute it. (See the file +ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part +of any program generated from the IJG code, this does not limit you more than +the foregoing paragraphs do. + +The Unix configuration script "configure" was produced with GNU Autoconf. +It is copyright by the Free Software Foundation but is freely distributable. +The same holds for its supporting scripts (config.guess, config.sub, +ltconfig, ltmain.sh). Another support script, install-sh, is copyright +by M.I.T. but is also freely distributable. + +It appears that the arithmetic coding option of the JPEG spec is covered by +patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot +legally be used without obtaining one or more licenses. For this reason, +support for arithmetic coding has been removed from the free JPEG software. +(Since arithmetic coding provides only a marginal gain over the unpatented +Huffman mode, it is unlikely that very many implementations will support it.) +So far as we are aware, there are no patent restrictions on the remaining +code. + +The IJG distribution formerly included code to read and write GIF files. +To avoid entanglement with the Unisys LZW patent, GIF reading support has +been removed altogether, and the GIF writer has been simplified to produce +"uncompressed GIFs". This technique does not use the LZW algorithm; the +resulting GIF files are larger than usual, but are readable by all standard +GIF decoders. + +We are required to state that + "The Graphics Interchange Format(c) is the Copyright property of + CompuServe Incorporated. GIF(sm) is a Service Mark property of + CompuServe Incorporated." + + +REFERENCES +========== + +We highly recommend reading one or more of these references before trying to +understand the innards of the JPEG software. + +The best short technical introduction to the JPEG compression algorithm is + Wallace, Gregory K. "The JPEG Still Picture Compression Standard", + Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44. +(Adjacent articles in that issue discuss MPEG motion picture compression, +applications of JPEG, and related topics.) If you don't have the CACM issue +handy, a PostScript file containing a revised version of Wallace's article is +available at ftp://ftp.uu.net/graphics/jpeg/wallace.ps.gz. The file (actually +a preprint for an article that appeared in IEEE Trans. Consumer Electronics) +omits the sample images that appeared in CACM, but it includes corrections +and some added material. Note: the Wallace article is copyright ACM and IEEE, +and it may not be used for commercial purposes. + +A somewhat less technical, more leisurely introduction to JPEG can be found in +"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by +M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides +good explanations and example C code for a multitude of compression methods +including JPEG. It is an excellent source if you are comfortable reading C +code but don't know much about data compression in general. The book's JPEG +sample code is far from industrial-strength, but when you are ready to look +at a full implementation, you've got one here... + +The best full description of JPEG is the textbook "JPEG Still Image Data +Compression Standard" by William B. Pennebaker and Joan L. Mitchell, published +by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. Price US$59.95, 638 pp. +The book includes the complete text of the ISO JPEG standards (DIS 10918-1 +and draft DIS 10918-2). This is by far the most complete exposition of JPEG +in existence, and we highly recommend it. + +The JPEG standard itself is not available electronically; you must order a +paper copy through ISO or ITU. (Unless you feel a need to own a certified +official copy, we recommend buying the Pennebaker and Mitchell book instead; +it's much cheaper and includes a great deal of useful explanatory material.) +In the USA, copies of the standard may be ordered from ANSI Sales at (212) +642-4900, or from Global Engineering Documents at (800) 854-7179. (ANSI +doesn't take credit card orders, but Global does.) It's not cheap: as of +1992, ANSI was charging $95 for Part 1 and $47 for Part 2, plus 7% +shipping/handling. The standard is divided into two parts, Part 1 being the +actual specification, while Part 2 covers compliance testing methods. Part 1 +is titled "Digital Compression and Coding of Continuous-tone Still Images, +Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS +10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of +Continuous-tone Still Images, Part 2: Compliance testing" and has document +numbers ISO/IEC IS 10918-2, ITU-T T.83. + +Some extensions to the original JPEG standard are defined in JPEG Part 3, +a newer ISO standard numbered ISO/IEC IS 10918-3 and ITU-T T.84. IJG +currently does not support any Part 3 extensions. + +The JPEG standard does not specify all details of an interchangeable file +format. For the omitted details we follow the "JFIF" conventions, revision +1.02. A copy of the JFIF spec is available from: + Literature Department + C-Cube Microsystems, Inc. + 1778 McCarthy Blvd. + Milpitas, CA 95035 + phone (408) 944-6300, fax (408) 944-6314 +A PostScript version of this document is available by FTP at +ftp://ftp.uu.net/graphics/jpeg/jfif.ps.gz. There is also a plain text +version at ftp://ftp.uu.net/graphics/jpeg/jfif.txt.gz, but it is missing +the figures. + +The TIFF 6.0 file format specification can be obtained by FTP from +ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme +found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems. +IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6). +Instead, we recommend the JPEG design proposed by TIFF Technical Note #2 +(Compression tag 7). Copies of this Note can be obtained from ftp.sgi.com or +from ftp://ftp.uu.net/graphics/jpeg/. It is expected that the next revision +of the TIFF spec will replace the 6.0 JPEG design with the Note's design. +Although IJG's own code does not support TIFF/JPEG, the free libtiff library +uses our library to implement TIFF/JPEG per the Note. libtiff is available +from ftp://ftp.sgi.com/graphics/tiff/. + + +ARCHIVE LOCATIONS +================= + +The "official" archive site for this software is ftp.uu.net (Internet +address 192.48.96.9). The most recent released version can always be found +there in directory graphics/jpeg. This particular version will be archived +as ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz. If you don't have +direct Internet access, UUNET's archives are also available via UUCP; contact +help@uunet.uu.net for information on retrieving files that way. + +Numerous Internet sites maintain copies of the UUNET files. However, only +ftp.uu.net is guaranteed to have the latest official version. + +You can also obtain this software in DOS-compatible "zip" archive format from +the SimTel archives (ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/), or +on CompuServe in the Graphics Support forum (GO CIS:GRAPHSUP), library 12 +"JPEG Tools". Again, these versions may sometimes lag behind the ftp.uu.net +release. + +The JPEG FAQ (Frequently Asked Questions) article is a useful source of +general information about JPEG. It is updated constantly and therefore is +not included in this distribution. The FAQ is posted every two weeks to +Usenet newsgroups comp.graphics.misc, news.answers, and other groups. +It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/ +and other news.answers archive sites, including the official news.answers +archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/. +If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu +with body + send usenet/news.answers/jpeg-faq/part1 + send usenet/news.answers/jpeg-faq/part2 + + +RELATED SOFTWARE +================ + +Numerous viewing and image manipulation programs now support JPEG. (Quite a +few of them use this library to do so.) The JPEG FAQ described above lists +some of the more popular free and shareware viewers, and tells where to +obtain them on Internet. + +If you are on a Unix machine, we highly recommend Jef Poskanzer's free +PBMPLUS software, which provides many useful operations on PPM-format image +files. In particular, it can convert PPM images to and from a wide range of +other formats, thus making cjpeg/djpeg considerably more useful. The latest +version is distributed by the NetPBM group, and is available from numerous +sites, notably ftp://wuarchive.wustl.edu/graphics/graphics/packages/NetPBM/. +Unfortunately PBMPLUS/NETPBM is not nearly as portable as the IJG software is; +you are likely to have difficulty making it work on any non-Unix machine. + +A different free JPEG implementation, written by the PVRG group at Stanford, +is available from ftp://havefun.stanford.edu/pub/jpeg/. This program +is designed for research and experimentation rather than production use; +it is slower, harder to use, and less portable than the IJG code, but it +is easier to read and modify. Also, the PVRG code supports lossless JPEG, +which we do not. (On the other hand, it doesn't do progressive JPEG.) + + +FILE FORMAT WARS +================ + +Some JPEG programs produce files that are not compatible with our library. +The root of the problem is that the ISO JPEG committee failed to specify a +concrete file format. Some vendors "filled in the blanks" on their own, +creating proprietary formats that no one else could read. (For example, none +of the early commercial JPEG implementations for the Macintosh were able to +exchange compressed files.) + +The file format we have adopted is called JFIF (see REFERENCES). This format +has been agreed to by a number of major commercial JPEG vendors, and it has +become the de facto standard. JFIF is a minimal or "low end" representation. +We recommend the use of TIFF/JPEG (TIFF revision 6.0 as modified by TIFF +Technical Note #2) for "high end" applications that need to record a lot of +additional data about an image. TIFF/JPEG is fairly new and not yet widely +supported, unfortunately. + +The upcoming JPEG Part 3 standard defines a file format called SPIFF. +SPIFF is interoperable with JFIF, in the sense that most JFIF decoders should +be able to read the most common variant of SPIFF. SPIFF has some technical +advantages over JFIF, but its major claim to fame is simply that it is an +official standard rather than an informal one. At this point it is unclear +whether SPIFF will supersede JFIF or whether JFIF will remain the de-facto +standard. IJG intends to support SPIFF once the standard is frozen, but we +have not decided whether it should become our default output format or not. +(In any case, our decoder will remain capable of reading JFIF indefinitely.) + +Various proprietary file formats incorporating JPEG compression also exist. +We have little or no sympathy for the existence of these formats. Indeed, +one of the original reasons for developing this free software was to help +force convergence on common, open format standards for JPEG files. Don't +use a proprietary file format! + + +TO DO +===== + +The major thrust for v7 will probably be improvement of visual quality. +The current method for scaling the quantization tables is known not to be +very good at low Q values. We also intend to investigate block boundary +smoothing, "poor man's variable quantization", and other means of improving +quality-vs-file-size performance without sacrificing compatibility. + +In future versions, we are considering supporting some of the upcoming JPEG +Part 3 extensions --- principally, variable quantization and the SPIFF file +format. + +As always, speeding things up is of great interest. + +Please send bug reports, offers of help, etc. to jpeg-info@uunet.uu.net. diff --git a/third_party/windows/fltk-1.1.10/jpeg/change.log b/third_party/windows/fltk-1.1.10/jpeg/change.log new file mode 100644 index 0000000..953680c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/change.log @@ -0,0 +1,217 @@ +CHANGE LOG for Independent JPEG Group's JPEG software + + +Version 6b 27-Mar-1998 +----------------------- + +jpegtran has new features for lossless image transformations (rotation +and flipping) as well as "lossless" reduction to grayscale. + +jpegtran now copies comments by default; it has a -copy switch to enable +copying all APPn blocks as well, or to suppress comments. (Formerly it +always suppressed comments and APPn blocks.) jpegtran now also preserves +JFIF version and resolution information. + +New decompressor library feature: COM and APPn markers found in the input +file can be saved in memory for later use by the application. (Before, +you had to code this up yourself with a custom marker processor.) + +There is an unused field "void * client_data" now in compress and decompress +parameter structs; this may be useful in some applications. + +JFIF version number information is now saved by the decoder and accepted by +the encoder. jpegtran uses this to copy the source file's version number, +to ensure "jpegtran -copy all" won't create bogus files that contain JFXX +extensions but claim to be version 1.01. Applications that generate their +own JFXX extension markers also (finally) have a supported way to cause the +encoder to emit JFIF version number 1.02. + +djpeg's trace mode reports JFIF 1.02 thumbnail images as such, rather +than as unknown APP0 markers. + +In -verbose mode, djpeg and rdjpgcom will try to print the contents of +APP12 markers as text. Some digital cameras store useful text information +in APP12 markers. + +Handling of truncated data streams is more robust: blocks beyond the one in +which the error occurs will be output as uniform gray, or left unchanged +if decoding a progressive JPEG. The appearance no longer depends on the +Huffman tables being used. + +Huffman tables are checked for validity much more carefully than before. + +To avoid the Unisys LZW patent, djpeg's GIF output capability has been +changed to produce "uncompressed GIFs", and cjpeg's GIF input capability +has been removed altogether. We're not happy about it either, but there +seems to be no good alternative. + +The configure script now supports building libjpeg as a shared library +on many flavors of Unix (all the ones that GNU libtool knows how to +build shared libraries for). Use "./configure --enable-shared" to +try this out. + +New jconfig file and makefiles for Microsoft Visual C++ and Developer Studio. +Also, a jconfig file and a build script for Metrowerks CodeWarrior +on Apple Macintosh. makefile.dj has been updated for DJGPP v2, and there +are miscellaneous other minor improvements in the makefiles. + +jmemmac.c now knows how to create temporary files following Mac System 7 +conventions. + +djpeg's -map switch is now able to read raw-format PPM files reliably. + +cjpeg -progressive -restart no longer generates any unnecessary DRI markers. + +Multiple calls to jpeg_simple_progression for a single JPEG object +no longer leak memory. + + +Version 6a 7-Feb-96 +-------------------- + +Library initialization sequence modified to detect version mismatches +and struct field packing mismatches between library and calling application. +This change requires applications to be recompiled, but does not require +any application source code change. + +All routine declarations changed to the style "GLOBAL(type) name ...", +that is, GLOBAL, LOCAL, METHODDEF, EXTERN are now macros taking the +routine's return type as an argument. This makes it possible to add +Microsoft-style linkage keywords to all the routines by changing just +these macros. Note that any application code that was using these macros +will have to be changed. + +DCT coefficient quantization tables are now stored in normal array order +rather than zigzag order. Application code that calls jpeg_add_quant_table, +or otherwise manipulates quantization tables directly, will need to be +changed. If you need to make such code work with either older or newer +versions of the library, a test like "#if JPEG_LIB_VERSION >= 61" is +recommended. + +djpeg's trace capability now dumps DQT tables in natural order, not zigzag +order. This allows the trace output to be made into a "-qtables" file +more easily. + +New system-dependent memory manager module for use on Apple Macintosh. + +Fix bug in cjpeg's -smooth option: last one or two scanlines would be +duplicates of the prior line unless the image height mod 16 was 1 or 2. + +Repair minor problems in VMS, BCC, MC6 makefiles. + +New configure script based on latest GNU Autoconf. + +Correct the list of include files needed by MetroWerks C for ccommand(). + +Numerous small documentation updates. + + +Version 6 2-Aug-95 +------------------- + +Progressive JPEG support: library can read and write full progressive JPEG +files. A "buffered image" mode supports incremental decoding for on-the-fly +display of progressive images. Simply recompiling an existing IJG-v5-based +decoder with v6 should allow it to read progressive files, though of course +without any special progressive display. + +New "jpegtran" application performs lossless transcoding between different +JPEG formats; primarily, it can be used to convert baseline to progressive +JPEG and vice versa. In support of jpegtran, the library now allows lossless +reading and writing of JPEG files as DCT coefficient arrays. This ability +may be of use in other applications. + +Notes for programmers: +* We changed jpeg_start_decompress() to be able to suspend; this makes all +decoding modes available to suspending-input applications. However, +existing applications that use suspending input will need to be changed +to check the return value from jpeg_start_decompress(). You don't need to +do anything if you don't use a suspending data source. +* We changed the interface to the virtual array routines: access_virt_array +routines now take a count of the number of rows to access this time. The +last parameter to request_virt_array routines is now interpreted as the +maximum number of rows that may be accessed at once, but not necessarily +the height of every access. + + +Version 5b 15-Mar-95 +--------------------- + +Correct bugs with grayscale images having v_samp_factor > 1. + +jpeg_write_raw_data() now supports output suspension. + +Correct bugs in "configure" script for case of compiling in +a directory other than the one containing the source files. + +Repair bug in jquant1.c: sometimes didn't use as many colors as it could. + +Borland C makefile and jconfig file work under either MS-DOS or OS/2. + +Miscellaneous improvements to documentation. + + +Version 5a 7-Dec-94 +-------------------- + +Changed color conversion roundoff behavior so that grayscale values are +represented exactly. (This causes test image files to change.) + +Make ordered dither use 16x16 instead of 4x4 pattern for a small quality +improvement. + +New configure script based on latest GNU Autoconf. +Fix configure script to handle CFLAGS correctly. +Rename *.auto files to *.cfg, so that configure script still works if +file names have been truncated for DOS. + +Fix bug in rdbmp.c: didn't allow for extra data between header and image. + +Modify rdppm.c/wrppm.c to handle 2-byte raw PPM/PGM formats for 12-bit data. + +Fix several bugs in rdrle.c. + +NEED_SHORT_EXTERNAL_NAMES option was broken. + +Revise jerror.h/jerror.c for more flexibility in message table. + +Repair oversight in jmemname.c NO_MKTEMP case: file could be there +but unreadable. + + +Version 5 24-Sep-94 +-------------------- + +Version 5 represents a nearly complete redesign and rewrite of the IJG +software. Major user-visible changes include: + * Automatic configuration simplifies installation for most Unix systems. + * A range of speed vs. image quality tradeoffs are supported. + This includes resizing of an image during decompression: scaling down + by a factor of 1/2, 1/4, or 1/8 is handled very efficiently. + * New programs rdjpgcom and wrjpgcom allow insertion and extraction + of text comments in a JPEG file. + +The application programmer's interface to the library has changed completely. +Notable improvements include: + * We have eliminated the use of callback routines for handling the + uncompressed image data. The application now sees the library as a + set of routines that it calls to read or write image data on a + scanline-by-scanline basis. + * The application image data is represented in a conventional interleaved- + pixel format, rather than as a separate array for each color channel. + This can save a copying step in many programs. + * The handling of compressed data has been cleaned up: the application can + supply routines to source or sink the compressed data. It is possible to + suspend processing on source/sink buffer overrun, although this is not + supported in all operating modes. + * All static state has been eliminated from the library, so that multiple + instances of compression or decompression can be active concurrently. + * JPEG abbreviated datastream formats are supported, ie, quantization and + Huffman tables can be stored separately from the image data. + * And not only that, but the documentation of the library has improved + considerably! + + +The last widely used release before the version 5 rewrite was version 4A of +18-Feb-93. Change logs before that point have been discarded, since they +are not of much interest after the rewrite. diff --git a/third_party/windows/fltk-1.1.10/jpeg/coderules.doc b/third_party/windows/fltk-1.1.10/jpeg/coderules.doc new file mode 100644 index 0000000..2c56534 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/coderules.doc @@ -0,0 +1,118 @@ +IJG JPEG LIBRARY: CODING RULES + +Copyright (C) 1991-1996, Thomas G. Lane. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +Since numerous people will be contributing code and bug fixes, it's important +to establish a common coding style. The goal of using similar coding styles +is much more important than the details of just what that style is. + +In general we follow the recommendations of "Recommended C Style and Coding +Standards" revision 6.1 (Cannon et al. as modified by Spencer, Keppel and +Brader). This document is available in the IJG FTP archive (see +jpeg/doc/cstyle.ms.tbl.Z, or cstyle.txt.Z for those without nroff/tbl). + +Block comments should be laid out thusly: + +/* + * Block comments in this style. + */ + +We indent statements in K&R style, e.g., + if (test) { + then-part; + } else { + else-part; + } +with two spaces per indentation level. (This indentation convention is +handled automatically by GNU Emacs and many other text editors.) + +Multi-word names should be written in lower case with underscores, e.g., +multi_word_name (not multiWordName). Preprocessor symbols and enum constants +are similar but upper case (MULTI_WORD_NAME). Names should be unique within +the first fifteen characters. (On some older systems, global names must be +unique within six characters. We accommodate this without cluttering the +source code by using macros to substitute shorter names.) + +We use function prototypes everywhere; we rely on automatic source code +transformation to feed prototype-less C compilers. Transformation is done +by the simple and portable tool 'ansi2knr.c' (courtesy of Ghostscript). +ansi2knr is not very bright, so it imposes a format requirement on function +declarations: the function name MUST BEGIN IN COLUMN 1. Thus all functions +should be written in the following style: + +LOCAL(int *) +function_name (int a, char *b) +{ + code... +} + +Note that each function definition must begin with GLOBAL(type), LOCAL(type), +or METHODDEF(type). These macros expand to "static type" or just "type" as +appropriate. They provide a readable indication of the routine's usage and +can readily be changed for special needs. (For instance, special linkage +keywords can be inserted for use in Windows DLLs.) + +ansi2knr does not transform method declarations (function pointers in +structs). We handle these with a macro JMETHOD, defined as + #ifdef HAVE_PROTOTYPES + #define JMETHOD(type,methodname,arglist) type (*methodname) arglist + #else + #define JMETHOD(type,methodname,arglist) type (*methodname) () + #endif +which is used like this: + struct function_pointers { + JMETHOD(void, init_entropy_encoder, (int somearg, jparms *jp)); + JMETHOD(void, term_entropy_encoder, (void)); + }; +Note the set of parentheses surrounding the parameter list. + +A similar solution is used for forward and external function declarations +(see the EXTERN and JPP macros). + +If the code is to work on non-ANSI compilers, we cannot rely on a prototype +declaration to coerce actual parameters into the right types. Therefore, use +explicit casts on actual parameters whenever the actual parameter type is not +identical to the formal parameter. Beware of implicit conversions to "int". + +It seems there are some non-ANSI compilers in which the sizeof() operator +is defined to return int, yet size_t is defined as long. Needless to say, +this is brain-damaged. Always use the SIZEOF() macro in place of sizeof(), +so that the result is guaranteed to be of type size_t. + + +The JPEG library is intended to be used within larger programs. Furthermore, +we want it to be reentrant so that it can be used by applications that process +multiple images concurrently. The following rules support these requirements: + +1. Avoid direct use of file I/O, "malloc", error report printouts, etc; +pass these through the common routines provided. + +2. Minimize global namespace pollution. Functions should be declared static +wherever possible. (Note that our method-based calling conventions help this +a lot: in many modules only the initialization function will ever need to be +called directly, so only that function need be externally visible.) All +global function names should begin with "jpeg_", and should have an +abbreviated name (unique in the first six characters) substituted by macro +when NEED_SHORT_EXTERNAL_NAMES is set. + +3. Don't use global variables; anything that must be used in another module +should be in the common data structures. + +4. Don't use static variables except for read-only constant tables. Variables +that should be private to a module can be placed into private structures (see +the system architecture document, structure.doc). + +5. Source file names should begin with "j" for files that are part of the +library proper; source files that are not part of the library, such as cjpeg.c +and djpeg.c, do not begin with "j". Keep source file names to eight +characters (plus ".c" or ".h", etc) to make life easy for MS-DOSers. Keep +compression and decompression code in separate source files --- some +applications may want only one half of the library. + +Note: these rules (particularly #4) are not followed religiously in the +modules that are used in cjpeg/djpeg but are not part of the JPEG library +proper. Those modules are not really intended to be used in other +applications. diff --git a/third_party/windows/fltk-1.1.10/jpeg/filelist.doc b/third_party/windows/fltk-1.1.10/jpeg/filelist.doc new file mode 100644 index 0000000..ad6a82d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/filelist.doc @@ -0,0 +1,210 @@ +IJG JPEG LIBRARY: FILE LIST + +Copyright (C) 1994-1998, Thomas G. Lane. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +Here is a road map to the files in the IJG JPEG distribution. The +distribution includes the JPEG library proper, plus two application +programs ("cjpeg" and "djpeg") which use the library to convert JPEG +files to and from some other popular image formats. A third application +"jpegtran" uses the library to do lossless conversion between different +variants of JPEG. There are also two stand-alone applications, +"rdjpgcom" and "wrjpgcom". + + +THE JPEG LIBRARY +================ + +Include files: + +jpeglib.h JPEG library's exported data and function declarations. +jconfig.h Configuration declarations. Note: this file is not present + in the distribution; it is generated during installation. +jmorecfg.h Additional configuration declarations; need not be changed + for a standard installation. +jerror.h Declares JPEG library's error and trace message codes. +jinclude.h Central include file used by all IJG .c files to reference + system include files. +jpegint.h JPEG library's internal data structures. +jchuff.h Private declarations for Huffman encoder modules. +jdhuff.h Private declarations for Huffman decoder modules. +jdct.h Private declarations for forward & reverse DCT subsystems. +jmemsys.h Private declarations for memory management subsystem. +jversion.h Version information. + +Applications using the library should include jpeglib.h (which in turn +includes jconfig.h and jmorecfg.h). Optionally, jerror.h may be included +if the application needs to reference individual JPEG error codes. The +other include files are intended for internal use and would not normally +be included by an application program. (cjpeg/djpeg/etc do use jinclude.h, +since its function is to improve portability of the whole IJG distribution. +Most other applications will directly include the system include files they +want, and hence won't need jinclude.h.) + + +C source code files: + +These files contain most of the functions intended to be called directly by +an application program: + +jcapimin.c Application program interface: core routines for compression. +jcapistd.c Application program interface: standard compression. +jdapimin.c Application program interface: core routines for decompression. +jdapistd.c Application program interface: standard decompression. +jcomapi.c Application program interface routines common to compression + and decompression. +jcparam.c Compression parameter setting helper routines. +jctrans.c API and library routines for transcoding compression. +jdtrans.c API and library routines for transcoding decompression. + +Compression side of the library: + +jcinit.c Initialization: determines which other modules to use. +jcmaster.c Master control: setup and inter-pass sequencing logic. +jcmainct.c Main buffer controller (preprocessor => JPEG compressor). +jcprepct.c Preprocessor buffer controller. +jccoefct.c Buffer controller for DCT coefficient buffer. +jccolor.c Color space conversion. +jcsample.c Downsampling. +jcdctmgr.c DCT manager (DCT implementation selection & control). +jfdctint.c Forward DCT using slow-but-accurate integer method. +jfdctfst.c Forward DCT using faster, less accurate integer method. +jfdctflt.c Forward DCT using floating-point arithmetic. +jchuff.c Huffman entropy coding for sequential JPEG. +jcphuff.c Huffman entropy coding for progressive JPEG. +jcmarker.c JPEG marker writing. +jdatadst.c Data destination manager for stdio output. + +Decompression side of the library: + +jdmaster.c Master control: determines which other modules to use. +jdinput.c Input controller: controls input processing modules. +jdmainct.c Main buffer controller (JPEG decompressor => postprocessor). +jdcoefct.c Buffer controller for DCT coefficient buffer. +jdpostct.c Postprocessor buffer controller. +jdmarker.c JPEG marker reading. +jdhuff.c Huffman entropy decoding for sequential JPEG. +jdphuff.c Huffman entropy decoding for progressive JPEG. +jddctmgr.c IDCT manager (IDCT implementation selection & control). +jidctint.c Inverse DCT using slow-but-accurate integer method. +jidctfst.c Inverse DCT using faster, less accurate integer method. +jidctflt.c Inverse DCT using floating-point arithmetic. +jidctred.c Inverse DCTs with reduced-size outputs. +jdsample.c Upsampling. +jdcolor.c Color space conversion. +jdmerge.c Merged upsampling/color conversion (faster, lower quality). +jquant1.c One-pass color quantization using a fixed-spacing colormap. +jquant2.c Two-pass color quantization using a custom-generated colormap. + Also handles one-pass quantization to an externally given map. +jdatasrc.c Data source manager for stdio input. + +Support files for both compression and decompression: + +jerror.c Standard error handling routines (application replaceable). +jmemmgr.c System-independent (more or less) memory management code. +jutils.c Miscellaneous utility routines. + +jmemmgr.c relies on a system-dependent memory management module. The IJG +distribution includes the following implementations of the system-dependent +module: + +jmemnobs.c "No backing store": assumes adequate virtual memory exists. +jmemansi.c Makes temporary files with ANSI-standard routine tmpfile(). +jmemname.c Makes temporary files with program-generated file names. +jmemdos.c Custom implementation for MS-DOS (16-bit environment only): + can use extended and expanded memory as well as temp files. +jmemmac.c Custom implementation for Apple Macintosh. + +Exactly one of the system-dependent modules should be configured into an +installed JPEG library (see install.doc for hints about which one to use). +On unusual systems you may find it worthwhile to make a special +system-dependent memory manager. + + +Non-C source code files: + +jmemdosa.asm 80x86 assembly code support for jmemdos.c; used only in + MS-DOS-specific configurations of the JPEG library. + + +CJPEG/DJPEG/JPEGTRAN +==================== + +Include files: + +cdjpeg.h Declarations shared by cjpeg/djpeg/jpegtran modules. +cderror.h Additional error and trace message codes for cjpeg et al. +transupp.h Declarations for jpegtran support routines in transupp.c. + +C source code files: + +cjpeg.c Main program for cjpeg. +djpeg.c Main program for djpeg. +jpegtran.c Main program for jpegtran. +cdjpeg.c Utility routines used by all three programs. +rdcolmap.c Code to read a colormap file for djpeg's "-map" switch. +rdswitch.c Code to process some of cjpeg's more complex switches. + Also used by jpegtran. +transupp.c Support code for jpegtran: lossless image manipulations. + +Image file reader modules for cjpeg: + +rdbmp.c BMP file input. +rdgif.c GIF file input (now just a stub). +rdppm.c PPM/PGM file input. +rdrle.c Utah RLE file input. +rdtarga.c Targa file input. + +Image file writer modules for djpeg: + +wrbmp.c BMP file output. +wrgif.c GIF file output (a mere shadow of its former self). +wrppm.c PPM/PGM file output. +wrrle.c Utah RLE file output. +wrtarga.c Targa file output. + + +RDJPGCOM/WRJPGCOM +================= + +C source code files: + +rdjpgcom.c Stand-alone rdjpgcom application. +wrjpgcom.c Stand-alone wrjpgcom application. + +These programs do not depend on the IJG library. They do use +jconfig.h and jinclude.h, only to improve portability. + + +ADDITIONAL FILES +================ + +Documentation (see README for a guide to the documentation files): + +README Master documentation file. +*.doc Other documentation files. +*.1 Documentation in Unix man page format. +change.log Version-to-version change highlights. +example.c Sample code for calling JPEG library. + +Configuration/installation files and programs (see install.doc for more info): + +configure Unix shell script to perform automatic configuration. +ltconfig Support scripts for configure (from GNU libtool). +ltmain.sh +config.guess +config.sub +install-sh Install shell script for those Unix systems lacking one. +ckconfig.c Program to generate jconfig.h on non-Unix systems. +jconfig.doc Template for making jconfig.h by hand. +makefile.* Sample makefiles for particular systems. +jconfig.* Sample jconfig.h for particular systems. +ansi2knr.c De-ANSIfier for pre-ANSI C compilers (courtesy of + L. Peter Deutsch and Aladdin Enterprises). + +Test files (see install.doc for test procedure): + +test*.* Source and comparison files for confidence test. + These are binary image files, NOT text files. diff --git a/third_party/windows/fltk-1.1.10/jpeg/jcapimin.c b/third_party/windows/fltk-1.1.10/jpeg/jcapimin.c new file mode 100644 index 0000000..493af5c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jcapimin.c @@ -0,0 +1,280 @@ +/* + * jcapimin.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the compression half + * of the JPEG library. These are the "minimum" API routines that may be + * needed in either the normal full-compression case or the transcoding-only + * case. + * + * Most of the routines intended to be called directly by an application + * are in this file or in jcapistd.c. But also see jcparam.c for + * parameter-setup helper routines, jcomapi.c for routines shared by + * compression and decompression, and jctrans.c for the transcoding case. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Initialization of a JPEG compression object. + * The error manager must already be set up (in case memory manager fails). + */ + +GLOBAL(void) +jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize) +{ + int i; + + /* Guard against version mismatches between library and caller. */ + cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */ + if (version != JPEG_LIB_VERSION) + ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version); + if (structsize != SIZEOF(struct jpeg_compress_struct)) + ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, + (int) SIZEOF(struct jpeg_compress_struct), (int) structsize); + + /* For debugging purposes, we zero the whole master structure. + * But the application has already set the err pointer, and may have set + * client_data, so we have to save and restore those fields. + * Note: if application hasn't set client_data, tools like Purify may + * complain here. + */ + { + struct jpeg_error_mgr * err = cinfo->err; + void * client_data = cinfo->client_data; /* ignore Purify complaint here */ + MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct)); + cinfo->err = err; + cinfo->client_data = client_data; + } + cinfo->is_decompressor = FALSE; + + /* Initialize a memory manager instance for this object */ + jinit_memory_mgr((j_common_ptr) cinfo); + + /* Zero out pointers to permanent structures. */ + cinfo->progress = NULL; + cinfo->dest = NULL; + + cinfo->comp_info = NULL; + + for (i = 0; i < NUM_QUANT_TBLS; i++) + cinfo->quant_tbl_ptrs[i] = NULL; + + for (i = 0; i < NUM_HUFF_TBLS; i++) { + cinfo->dc_huff_tbl_ptrs[i] = NULL; + cinfo->ac_huff_tbl_ptrs[i] = NULL; + } + + cinfo->script_space = NULL; + + cinfo->input_gamma = 1.0; /* in case application forgets */ + + /* OK, I'm ready */ + cinfo->global_state = CSTATE_START; +} + + +/* + * Destruction of a JPEG compression object + */ + +GLOBAL(void) +jpeg_destroy_compress (j_compress_ptr cinfo) +{ + jpeg_destroy((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Abort processing of a JPEG compression operation, + * but don't destroy the object itself. + */ + +GLOBAL(void) +jpeg_abort_compress (j_compress_ptr cinfo) +{ + jpeg_abort((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Forcibly suppress or un-suppress all quantization and Huffman tables. + * Marks all currently defined tables as already written (if suppress) + * or not written (if !suppress). This will control whether they get emitted + * by a subsequent jpeg_start_compress call. + * + * This routine is exported for use by applications that want to produce + * abbreviated JPEG datastreams. It logically belongs in jcparam.c, but + * since it is called by jpeg_start_compress, we put it here --- otherwise + * jcparam.o would be linked whether the application used it or not. + */ + +GLOBAL(void) +jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress) +{ + int i; + JQUANT_TBL * qtbl; + JHUFF_TBL * htbl; + + for (i = 0; i < NUM_QUANT_TBLS; i++) { + if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL) + qtbl->sent_table = suppress; + } + + for (i = 0; i < NUM_HUFF_TBLS; i++) { + if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL) + htbl->sent_table = suppress; + if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL) + htbl->sent_table = suppress; + } +} + + +/* + * Finish JPEG compression. + * + * If a multipass operating mode was selected, this may do a great deal of + * work including most of the actual output. + */ + +GLOBAL(void) +jpeg_finish_compress (j_compress_ptr cinfo) +{ + JDIMENSION iMCU_row; + + if (cinfo->global_state == CSTATE_SCANNING || + cinfo->global_state == CSTATE_RAW_OK) { + /* Terminate first pass */ + if (cinfo->next_scanline < cinfo->image_height) + ERREXIT(cinfo, JERR_TOO_LITTLE_DATA); + (*cinfo->master->finish_pass) (cinfo); + } else if (cinfo->global_state != CSTATE_WRCOEFS) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Perform any remaining passes */ + while (! cinfo->master->is_last_pass) { + (*cinfo->master->prepare_for_pass) (cinfo); + for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) { + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) iMCU_row; + cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + /* We bypass the main controller and invoke coef controller directly; + * all work is being done from the coefficient buffer. + */ + if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + } + (*cinfo->master->finish_pass) (cinfo); + } + /* Write EOI, do final cleanup */ + (*cinfo->marker->write_file_trailer) (cinfo); + (*cinfo->dest->term_destination) (cinfo); + /* We can use jpeg_abort to release memory and reset global_state */ + jpeg_abort((j_common_ptr) cinfo); +} + + +/* + * Write a special marker. + * This is only recommended for writing COM or APPn markers. + * Must be called after jpeg_start_compress() and before + * first call to jpeg_write_scanlines() or jpeg_write_raw_data(). + */ + +GLOBAL(void) +jpeg_write_marker (j_compress_ptr cinfo, int marker, + const JOCTET *dataptr, unsigned int datalen) +{ + JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val)); + + if (cinfo->next_scanline != 0 || + (cinfo->global_state != CSTATE_SCANNING && + cinfo->global_state != CSTATE_RAW_OK && + cinfo->global_state != CSTATE_WRCOEFS)) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + (*cinfo->marker->write_marker_header) (cinfo, marker, datalen); + write_marker_byte = cinfo->marker->write_marker_byte; /* copy for speed */ + while (datalen--) { + (*write_marker_byte) (cinfo, *dataptr); + dataptr++; + } +} + +/* Same, but piecemeal. */ + +GLOBAL(void) +jpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen) +{ + if (cinfo->next_scanline != 0 || + (cinfo->global_state != CSTATE_SCANNING && + cinfo->global_state != CSTATE_RAW_OK && + cinfo->global_state != CSTATE_WRCOEFS)) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + (*cinfo->marker->write_marker_header) (cinfo, marker, datalen); +} + +GLOBAL(void) +jpeg_write_m_byte (j_compress_ptr cinfo, int val) +{ + (*cinfo->marker->write_marker_byte) (cinfo, val); +} + + +/* + * Alternate compression function: just write an abbreviated table file. + * Before calling this, all parameters and a data destination must be set up. + * + * To produce a pair of files containing abbreviated tables and abbreviated + * image data, one would proceed as follows: + * + * initialize JPEG object + * set JPEG parameters + * set destination to table file + * jpeg_write_tables(cinfo); + * set destination to image file + * jpeg_start_compress(cinfo, FALSE); + * write data... + * jpeg_finish_compress(cinfo); + * + * jpeg_write_tables has the side effect of marking all tables written + * (same as jpeg_suppress_tables(..., TRUE)). Thus a subsequent start_compress + * will not re-emit the tables unless it is passed write_all_tables=TRUE. + */ + +GLOBAL(void) +jpeg_write_tables (j_compress_ptr cinfo) +{ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* (Re)initialize error mgr and destination modules */ + (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); + (*cinfo->dest->init_destination) (cinfo); + /* Initialize the marker writer ... bit of a crock to do it here. */ + jinit_marker_writer(cinfo); + /* Write them tables! */ + (*cinfo->marker->write_tables_only) (cinfo); + /* And clean up. */ + (*cinfo->dest->term_destination) (cinfo); + /* + * In library releases up through v6a, we called jpeg_abort() here to free + * any working memory allocated by the destination manager and marker + * writer. Some applications had a problem with that: they allocated space + * of their own from the library memory manager, and didn't want it to go + * away during write_tables. So now we do nothing. This will cause a + * memory leak if an app calls write_tables repeatedly without doing a full + * compression cycle or otherwise resetting the JPEG object. However, that + * seems less bad than unexpectedly freeing memory in the normal case. + * An app that prefers the old behavior can call jpeg_abort for itself after + * each call to jpeg_write_tables(). + */ +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jcapistd.c b/third_party/windows/fltk-1.1.10/jpeg/jcapistd.c new file mode 100644 index 0000000..fed66ca --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jcapistd.c @@ -0,0 +1,161 @@ +/* + * jcapistd.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the compression half + * of the JPEG library. These are the "standard" API routines that are + * used in the normal full-compression case. They are not used by a + * transcoding-only application. Note that if an application links in + * jpeg_start_compress, it will end up linking in the entire compressor. + * We thus must separate this file from jcapimin.c to avoid linking the + * whole compression library into a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Compression initialization. + * Before calling this, all parameters and a data destination must be set up. + * + * We require a write_all_tables parameter as a failsafe check when writing + * multiple datastreams from the same compression object. Since prior runs + * will have left all the tables marked sent_table=TRUE, a subsequent run + * would emit an abbreviated stream (no tables) by default. This may be what + * is wanted, but for safety's sake it should not be the default behavior: + * programmers should have to make a deliberate choice to emit abbreviated + * images. Therefore the documentation and examples should encourage people + * to pass write_all_tables=TRUE; then it will take active thought to do the + * wrong thing. + */ + +GLOBAL(void) +jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables) +{ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + if (write_all_tables) + jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */ + + /* (Re)initialize error mgr and destination modules */ + (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); + (*cinfo->dest->init_destination) (cinfo); + /* Perform master selection of active modules */ + jinit_compress_master(cinfo); + /* Set up for the first pass */ + (*cinfo->master->prepare_for_pass) (cinfo); + /* Ready for application to drive first pass through jpeg_write_scanlines + * or jpeg_write_raw_data. + */ + cinfo->next_scanline = 0; + cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING); +} + + +/* + * Write some scanlines of data to the JPEG compressor. + * + * The return value will be the number of lines actually written. + * This should be less than the supplied num_lines only in case that + * the data destination module has requested suspension of the compressor, + * or if more than image_height scanlines are passed in. + * + * Note: we warn about excess calls to jpeg_write_scanlines() since + * this likely signals an application programmer error. However, + * excess scanlines passed in the last valid call are *silently* ignored, + * so that the application need not adjust num_lines for end-of-image + * when using a multiple-scanline buffer. + */ + +GLOBAL(JDIMENSION) +jpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines, + JDIMENSION num_lines) +{ + JDIMENSION row_ctr, rows_left; + + if (cinfo->global_state != CSTATE_SCANNING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->next_scanline >= cinfo->image_height) + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->next_scanline; + cinfo->progress->pass_limit = (long) cinfo->image_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Give master control module another chance if this is first call to + * jpeg_write_scanlines. This lets output of the frame/scan headers be + * delayed so that application can write COM, etc, markers between + * jpeg_start_compress and jpeg_write_scanlines. + */ + if (cinfo->master->call_pass_startup) + (*cinfo->master->pass_startup) (cinfo); + + /* Ignore any extra scanlines at bottom of image. */ + rows_left = cinfo->image_height - cinfo->next_scanline; + if (num_lines > rows_left) + num_lines = rows_left; + + row_ctr = 0; + (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines); + cinfo->next_scanline += row_ctr; + return row_ctr; +} + + +/* + * Alternate entry point to write raw data. + * Processes exactly one iMCU row per call, unless suspended. + */ + +GLOBAL(JDIMENSION) +jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data, + JDIMENSION num_lines) +{ + JDIMENSION lines_per_iMCU_row; + + if (cinfo->global_state != CSTATE_RAW_OK) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->next_scanline >= cinfo->image_height) { + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + return 0; + } + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->next_scanline; + cinfo->progress->pass_limit = (long) cinfo->image_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Give master control module another chance if this is first call to + * jpeg_write_raw_data. This lets output of the frame/scan headers be + * delayed so that application can write COM, etc, markers between + * jpeg_start_compress and jpeg_write_raw_data. + */ + if (cinfo->master->call_pass_startup) + (*cinfo->master->pass_startup) (cinfo); + + /* Verify that at least one iMCU row has been passed. */ + lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE; + if (num_lines < lines_per_iMCU_row) + ERREXIT(cinfo, JERR_BUFFER_SIZE); + + /* Directly compress the row. */ + if (! (*cinfo->coef->compress_data) (cinfo, data)) { + /* If compressor did not consume the whole row, suspend processing. */ + return 0; + } + + /* OK, we processed one iMCU row. */ + cinfo->next_scanline += lines_per_iMCU_row; + return lines_per_iMCU_row; +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jccoefct.c b/third_party/windows/fltk-1.1.10/jpeg/jccoefct.c new file mode 100644 index 0000000..c713b85 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jccoefct.c @@ -0,0 +1,449 @@ +/* + * jccoefct.c + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the coefficient buffer controller for compression. + * This controller is the top level of the JPEG compressor proper. + * The coefficient buffer lies between forward-DCT and entropy encoding steps. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* We use a full-image coefficient buffer when doing Huffman optimization, + * and also for writing multiple-scan JPEG files. In all cases, the DCT + * step is run during the first pass, and subsequent passes need only read + * the buffered coefficients. + */ +#ifdef ENTROPY_OPT_SUPPORTED +#define FULL_COEF_BUFFER_SUPPORTED +#else +#ifdef C_MULTISCAN_FILES_SUPPORTED +#define FULL_COEF_BUFFER_SUPPORTED +#endif +#endif + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_c_coef_controller pub; /* public fields */ + + JDIMENSION iMCU_row_num; /* iMCU row # within image */ + JDIMENSION mcu_ctr; /* counts MCUs processed in current row */ + int MCU_vert_offset; /* counts MCU rows within iMCU row */ + int MCU_rows_per_iMCU_row; /* number of such rows needed */ + + /* For single-pass compression, it's sufficient to buffer just one MCU + * (although this may prove a bit slow in practice). We allocate a + * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each + * MCU constructed and sent. (On 80x86, the workspace is FAR even though + * it's not really very big; this is to keep the module interfaces unchanged + * when a large coefficient buffer is necessary.) + * In multi-pass modes, this array points to the current MCU's blocks + * within the virtual arrays. + */ + JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU]; + + /* In multi-pass modes, we need a virtual block array for each component. */ + jvirt_barray_ptr whole_image[MAX_COMPONENTS]; +} my_coef_controller; + +typedef my_coef_controller * my_coef_ptr; + + +/* Forward declarations */ +METHODDEF(boolean) compress_data + JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); +#ifdef FULL_COEF_BUFFER_SUPPORTED +METHODDEF(boolean) compress_first_pass + JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); +METHODDEF(boolean) compress_output + JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); +#endif + + +LOCAL(void) +start_iMCU_row (j_compress_ptr cinfo) +/* Reset within-iMCU-row counters for a new row */ +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* In an interleaved scan, an MCU row is the same as an iMCU row. + * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. + * But at the bottom of the image, process only what's left. + */ + if (cinfo->comps_in_scan > 1) { + coef->MCU_rows_per_iMCU_row = 1; + } else { + if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1)) + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; + else + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; + } + + coef->mcu_ctr = 0; + coef->MCU_vert_offset = 0; +} + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + coef->iMCU_row_num = 0; + start_iMCU_row(cinfo); + + switch (pass_mode) { + case JBUF_PASS_THRU: + if (coef->whole_image[0] != NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + coef->pub.compress_data = compress_data; + break; +#ifdef FULL_COEF_BUFFER_SUPPORTED + case JBUF_SAVE_AND_PASS: + if (coef->whole_image[0] == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + coef->pub.compress_data = compress_first_pass; + break; + case JBUF_CRANK_DEST: + if (coef->whole_image[0] == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + coef->pub.compress_data = compress_output; + break; +#endif + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } +} + + +/* + * Process some data in the single-pass case. + * We process the equivalent of one fully interleaved MCU row ("iMCU" row) + * per call, ie, v_samp_factor block rows for each component in the image. + * Returns TRUE if the iMCU row is completed, FALSE if suspended. + * + * NB: input_buf contains a plane for each component in image, + * which we index according to the component's SOF position. + */ + +METHODDEF(boolean) +compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + int blkn, bi, ci, yindex, yoffset, blockcnt; + JDIMENSION ypos, xpos; + jpeg_component_info *compptr; + + /* Loop to write as much as one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col; + MCU_col_num++) { + /* Determine where data comes from in input_buf and do the DCT thing. + * Each call on forward_DCT processes a horizontal row of DCT blocks + * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks + * sequentially. Dummy blocks at the right or bottom edge are filled in + * specially. The data in them does not matter for image reconstruction, + * so we fill them with values that will encode to the smallest amount of + * data, viz: all zeroes in the AC entries, DC entries equal to previous + * block's DC value. (Thanks to Thomas Kinsman for this idea.) + */ + blkn = 0; + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width + : compptr->last_col_width; + xpos = MCU_col_num * compptr->MCU_sample_width; + ypos = yoffset * DCTSIZE; /* ypos == (yoffset+yindex) * DCTSIZE */ + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + if (coef->iMCU_row_num < last_iMCU_row || + yoffset+yindex < compptr->last_row_height) { + (*cinfo->fdct->forward_DCT) (cinfo, compptr, + input_buf[compptr->component_index], + coef->MCU_buffer[blkn], + ypos, xpos, (JDIMENSION) blockcnt); + if (blockcnt < compptr->MCU_width) { + /* Create some dummy blocks at the right edge of the image. */ + jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt], + (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK)); + for (bi = blockcnt; bi < compptr->MCU_width; bi++) { + coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0]; + } + } + } else { + /* Create a row of dummy blocks at the bottom of the image. */ + jzero_far((void FAR *) coef->MCU_buffer[blkn], + compptr->MCU_width * SIZEOF(JBLOCK)); + for (bi = 0; bi < compptr->MCU_width; bi++) { + coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0]; + } + } + blkn += compptr->MCU_width; + ypos += DCTSIZE; + } + } + /* Try to write the MCU. In event of a suspension failure, we will + * re-DCT the MCU on restart (a bit inefficient, could be fixed...) + */ + if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->mcu_ctr = MCU_col_num; + return FALSE; + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->mcu_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + coef->iMCU_row_num++; + start_iMCU_row(cinfo); + return TRUE; +} + + +#ifdef FULL_COEF_BUFFER_SUPPORTED + +/* + * Process some data in the first pass of a multi-pass case. + * We process the equivalent of one fully interleaved MCU row ("iMCU" row) + * per call, ie, v_samp_factor block rows for each component in the image. + * This amount of data is read from the source buffer, DCT'd and quantized, + * and saved into the virtual arrays. We also generate suitable dummy blocks + * as needed at the right and lower edges. (The dummy blocks are constructed + * in the virtual arrays, which have been padded appropriately.) This makes + * it possible for subsequent passes not to worry about real vs. dummy blocks. + * + * We must also emit the data to the entropy encoder. This is conveniently + * done by calling compress_output() after we've loaded the current strip + * of the virtual arrays. + * + * NB: input_buf contains a plane for each component in image. All + * components are DCT'd and loaded into the virtual arrays in this pass. + * However, it may be that only a subset of the components are emitted to + * the entropy encoder during this first pass; be careful about looking + * at the scan-dependent variables (MCU dimensions, etc). + */ + +METHODDEF(boolean) +compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + JDIMENSION blocks_across, MCUs_across, MCUindex; + int bi, ci, h_samp_factor, block_row, block_rows, ndummy; + JCOEF lastDC; + jpeg_component_info *compptr; + JBLOCKARRAY buffer; + JBLOCKROW thisblockrow, lastblockrow; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Align the virtual buffer for this component. */ + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + coef->iMCU_row_num * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, TRUE); + /* Count non-dummy DCT block rows in this iMCU row. */ + if (coef->iMCU_row_num < last_iMCU_row) + block_rows = compptr->v_samp_factor; + else { + /* NB: can't use last_row_height here, since may not be set! */ + block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (block_rows == 0) block_rows = compptr->v_samp_factor; + } + blocks_across = compptr->width_in_blocks; + h_samp_factor = compptr->h_samp_factor; + /* Count number of dummy blocks to be added at the right margin. */ + ndummy = (int) (blocks_across % h_samp_factor); + if (ndummy > 0) + ndummy = h_samp_factor - ndummy; + /* Perform DCT for all non-dummy blocks in this iMCU row. Each call + * on forward_DCT processes a complete horizontal row of DCT blocks. + */ + for (block_row = 0; block_row < block_rows; block_row++) { + thisblockrow = buffer[block_row]; + (*cinfo->fdct->forward_DCT) (cinfo, compptr, + input_buf[ci], thisblockrow, + (JDIMENSION) (block_row * DCTSIZE), + (JDIMENSION) 0, blocks_across); + if (ndummy > 0) { + /* Create dummy blocks at the right edge of the image. */ + thisblockrow += blocks_across; /* => first dummy block */ + jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK)); + lastDC = thisblockrow[-1][0]; + for (bi = 0; bi < ndummy; bi++) { + thisblockrow[bi][0] = lastDC; + } + } + } + /* If at end of image, create dummy block rows as needed. + * The tricky part here is that within each MCU, we want the DC values + * of the dummy blocks to match the last real block's DC value. + * This squeezes a few more bytes out of the resulting file... + */ + if (coef->iMCU_row_num == last_iMCU_row) { + blocks_across += ndummy; /* include lower right corner */ + MCUs_across = blocks_across / h_samp_factor; + for (block_row = block_rows; block_row < compptr->v_samp_factor; + block_row++) { + thisblockrow = buffer[block_row]; + lastblockrow = buffer[block_row-1]; + jzero_far((void FAR *) thisblockrow, + (size_t) (blocks_across * SIZEOF(JBLOCK))); + for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) { + lastDC = lastblockrow[h_samp_factor-1][0]; + for (bi = 0; bi < h_samp_factor; bi++) { + thisblockrow[bi][0] = lastDC; + } + thisblockrow += h_samp_factor; /* advance to next MCU in row */ + lastblockrow += h_samp_factor; + } + } + } + } + /* NB: compress_output will increment iMCU_row_num if successful. + * A suspension return will result in redoing all the work above next time. + */ + + /* Emit data to the entropy encoder, sharing code with subsequent passes */ + return compress_output(cinfo, input_buf); +} + + +/* + * Process some data in subsequent passes of a multi-pass case. + * We process the equivalent of one fully interleaved MCU row ("iMCU" row) + * per call, ie, v_samp_factor block rows for each component in the scan. + * The data is obtained from the virtual arrays and fed to the entropy coder. + * Returns TRUE if the iMCU row is completed, FALSE if suspended. + * + * NB: input_buf is ignored; it is likely to be a NULL pointer. + */ + +METHODDEF(boolean) +compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + int blkn, ci, xindex, yindex, yoffset; + JDIMENSION start_col; + JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; + JBLOCKROW buffer_ptr; + jpeg_component_info *compptr; + + /* Align the virtual buffers for the components used in this scan. + * NB: during first pass, this is safe only because the buffers will + * already be aligned properly, so jmemmgr.c won't need to do any I/O. + */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + buffer[ci] = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], + coef->iMCU_row_num * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, FALSE); + } + + /* Loop to process one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row; + MCU_col_num++) { + /* Construct list of pointers to DCT blocks belonging to this MCU */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + start_col = MCU_col_num * compptr->MCU_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + buffer_ptr = buffer[ci][yindex+yoffset] + start_col; + for (xindex = 0; xindex < compptr->MCU_width; xindex++) { + coef->MCU_buffer[blkn++] = buffer_ptr++; + } + } + } + /* Try to write the MCU. */ + if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->mcu_ctr = MCU_col_num; + return FALSE; + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->mcu_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + coef->iMCU_row_num++; + start_iMCU_row(cinfo); + return TRUE; +} + +#endif /* FULL_COEF_BUFFER_SUPPORTED */ + + +/* + * Initialize coefficient buffer controller. + */ + +GLOBAL(void) +jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer) +{ + my_coef_ptr coef; + + coef = (my_coef_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_coef_controller)); + cinfo->coef = (struct jpeg_c_coef_controller *) coef; + coef->pub.start_pass = start_pass_coef; + + /* Create the coefficient buffer. */ + if (need_full_buffer) { +#ifdef FULL_COEF_BUFFER_SUPPORTED + /* Allocate a full-image virtual array for each component, */ + /* padded to a multiple of samp_factor DCT blocks in each direction. */ + int ci; + jpeg_component_info *compptr; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + (JDIMENSION) jround_up((long) compptr->width_in_blocks, + (long) compptr->h_samp_factor), + (JDIMENSION) jround_up((long) compptr->height_in_blocks, + (long) compptr->v_samp_factor), + (JDIMENSION) compptr->v_samp_factor); + } +#else + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); +#endif + } else { + /* We only need a single-MCU buffer. */ + JBLOCKROW buffer; + int i; + + buffer = (JBLOCKROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { + coef->MCU_buffer[i] = buffer + i; + } + coef->whole_image[0] = NULL; /* flag for no virtual arrays */ + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jccolor.c b/third_party/windows/fltk-1.1.10/jpeg/jccolor.c new file mode 100644 index 0000000..2663724 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jccolor.c @@ -0,0 +1,459 @@ +/* + * jccolor.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains input colorspace conversion routines. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private subobject */ + +typedef struct { + struct jpeg_color_converter pub; /* public fields */ + + /* Private state for RGB->YCC conversion */ + INT32 * rgb_ycc_tab; /* => table for RGB to YCbCr conversion */ +} my_color_converter; + +typedef my_color_converter * my_cconvert_ptr; + + +/**************** RGB -> YCbCr conversion: most common case **************/ + +/* + * YCbCr is defined per CCIR 601-1, except that Cb and Cr are + * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. + * The conversion equations to be implemented are therefore + * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B + * Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE + * Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE + * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) + * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2, + * rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and + * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0) + * were not represented exactly. Now we sacrifice exact representation of + * maximum red and maximum blue in order to get exact grayscales. + * + * To avoid floating-point arithmetic, we represent the fractional constants + * as integers scaled up by 2^16 (about 4 digits precision); we have to divide + * the products by 2^16, with appropriate rounding, to get the correct answer. + * + * For even more speed, we avoid doing any multiplications in the inner loop + * by precalculating the constants times R,G,B for all possible values. + * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table); + * for 12-bit samples it is still acceptable. It's not very reasonable for + * 16-bit samples, but if you want lossless storage you shouldn't be changing + * colorspace anyway. + * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included + * in the tables to save adding them separately in the inner loop. + */ + +#define SCALEBITS 16 /* speediest right-shift on some machines */ +#define CBCR_OFFSET ((INT32) CENTERJSAMPLE << SCALEBITS) +#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) +#define FIX(x) ((INT32) ((x) * (1L< Y section */ +#define G_Y_OFF (1*(MAXJSAMPLE+1)) /* offset to G => Y section */ +#define B_Y_OFF (2*(MAXJSAMPLE+1)) /* etc. */ +#define R_CB_OFF (3*(MAXJSAMPLE+1)) +#define G_CB_OFF (4*(MAXJSAMPLE+1)) +#define B_CB_OFF (5*(MAXJSAMPLE+1)) +#define R_CR_OFF B_CB_OFF /* B=>Cb, R=>Cr are the same */ +#define G_CR_OFF (6*(MAXJSAMPLE+1)) +#define B_CR_OFF (7*(MAXJSAMPLE+1)) +#define TABLE_SIZE (8*(MAXJSAMPLE+1)) + + +/* + * Initialize for RGB->YCC colorspace conversion. + */ + +METHODDEF(void) +rgb_ycc_start (j_compress_ptr cinfo) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + INT32 * rgb_ycc_tab; + INT32 i; + + /* Allocate and fill in the conversion tables. */ + cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (TABLE_SIZE * SIZEOF(INT32))); + + for (i = 0; i <= MAXJSAMPLE; i++) { + rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i; + rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i; + rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF; + rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i; + rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i; + /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr. + * This ensures that the maximum output will round to MAXJSAMPLE + * not MAXJSAMPLE+1, and thus that we don't have to range-limit. + */ + rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1; +/* B=>Cb and R=>Cr tables are the same + rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1; +*/ + rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i; + rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i; + } +} + + +/* + * Convert some rows of samples to the JPEG colorspace. + * + * Note that we change from the application's interleaved-pixel format + * to our internal noninterleaved, one-plane-per-component format. + * The input buffer is therefore three times as wide as the output buffer. + * + * A starting row offset is provided only for the output buffer. The caller + * can easily adjust the passed input_buf value to accommodate any row + * offset required on that side. + */ + +METHODDEF(void) +rgb_ycc_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int r, g, b; + register INT32 * ctab = cconvert->rgb_ycc_tab; + register JSAMPROW inptr; + register JSAMPROW outptr0, outptr1, outptr2; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->image_width; + + while (--num_rows >= 0) { + inptr = *input_buf++; + outptr0 = output_buf[0][output_row]; + outptr1 = output_buf[1][output_row]; + outptr2 = output_buf[2][output_row]; + output_row++; + for (col = 0; col < num_cols; col++) { + r = GETJSAMPLE(inptr[RGB_RED]); + g = GETJSAMPLE(inptr[RGB_GREEN]); + b = GETJSAMPLE(inptr[RGB_BLUE]); + inptr += RGB_PIXELSIZE; + /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations + * must be too; we do not need an explicit range-limiting operation. + * Hence the value being shifted is never negative, and we don't + * need the general RIGHT_SHIFT macro. + */ + /* Y */ + outptr0[col] = (JSAMPLE) + ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) + >> SCALEBITS); + /* Cb */ + outptr1[col] = (JSAMPLE) + ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF]) + >> SCALEBITS); + /* Cr */ + outptr2[col] = (JSAMPLE) + ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF]) + >> SCALEBITS); + } + } +} + + +/**************** Cases other than RGB -> YCbCr **************/ + + +/* + * Convert some rows of samples to the JPEG colorspace. + * This version handles RGB->grayscale conversion, which is the same + * as the RGB->Y portion of RGB->YCbCr. + * We assume rgb_ycc_start has been called (we only use the Y tables). + */ + +METHODDEF(void) +rgb_gray_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int r, g, b; + register INT32 * ctab = cconvert->rgb_ycc_tab; + register JSAMPROW inptr; + register JSAMPROW outptr; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->image_width; + + while (--num_rows >= 0) { + inptr = *input_buf++; + outptr = output_buf[0][output_row]; + output_row++; + for (col = 0; col < num_cols; col++) { + r = GETJSAMPLE(inptr[RGB_RED]); + g = GETJSAMPLE(inptr[RGB_GREEN]); + b = GETJSAMPLE(inptr[RGB_BLUE]); + inptr += RGB_PIXELSIZE; + /* Y */ + outptr[col] = (JSAMPLE) + ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) + >> SCALEBITS); + } + } +} + + +/* + * Convert some rows of samples to the JPEG colorspace. + * This version handles Adobe-style CMYK->YCCK conversion, + * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same + * conversion as above, while passing K (black) unchanged. + * We assume rgb_ycc_start has been called. + */ + +METHODDEF(void) +cmyk_ycck_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int r, g, b; + register INT32 * ctab = cconvert->rgb_ycc_tab; + register JSAMPROW inptr; + register JSAMPROW outptr0, outptr1, outptr2, outptr3; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->image_width; + + while (--num_rows >= 0) { + inptr = *input_buf++; + outptr0 = output_buf[0][output_row]; + outptr1 = output_buf[1][output_row]; + outptr2 = output_buf[2][output_row]; + outptr3 = output_buf[3][output_row]; + output_row++; + for (col = 0; col < num_cols; col++) { + r = MAXJSAMPLE - GETJSAMPLE(inptr[0]); + g = MAXJSAMPLE - GETJSAMPLE(inptr[1]); + b = MAXJSAMPLE - GETJSAMPLE(inptr[2]); + /* K passes through as-is */ + outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */ + inptr += 4; + /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations + * must be too; we do not need an explicit range-limiting operation. + * Hence the value being shifted is never negative, and we don't + * need the general RIGHT_SHIFT macro. + */ + /* Y */ + outptr0[col] = (JSAMPLE) + ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) + >> SCALEBITS); + /* Cb */ + outptr1[col] = (JSAMPLE) + ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF]) + >> SCALEBITS); + /* Cr */ + outptr2[col] = (JSAMPLE) + ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF]) + >> SCALEBITS); + } + } +} + + +/* + * Convert some rows of samples to the JPEG colorspace. + * This version handles grayscale output with no conversion. + * The source can be either plain grayscale or YCbCr (since Y == gray). + */ + +METHODDEF(void) +grayscale_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + register JSAMPROW inptr; + register JSAMPROW outptr; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->image_width; + int instride = cinfo->input_components; + + while (--num_rows >= 0) { + inptr = *input_buf++; + outptr = output_buf[0][output_row]; + output_row++; + for (col = 0; col < num_cols; col++) { + outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */ + inptr += instride; + } + } +} + + +/* + * Convert some rows of samples to the JPEG colorspace. + * This version handles multi-component colorspaces without conversion. + * We assume input_components == num_components. + */ + +METHODDEF(void) +null_convert (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows) +{ + register JSAMPROW inptr; + register JSAMPROW outptr; + register JDIMENSION col; + register int ci; + int nc = cinfo->num_components; + JDIMENSION num_cols = cinfo->image_width; + + while (--num_rows >= 0) { + /* It seems fastest to make a separate pass for each component. */ + for (ci = 0; ci < nc; ci++) { + inptr = *input_buf; + outptr = output_buf[ci][output_row]; + for (col = 0; col < num_cols; col++) { + outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */ + inptr += nc; + } + } + input_buf++; + output_row++; + } +} + + +/* + * Empty method for start_pass. + */ + +METHODDEF(void) +null_method (j_compress_ptr cinfo) +{ + /* no work needed */ +} + + +/* + * Module initialization routine for input colorspace conversion. + */ + +GLOBAL(void) +jinit_color_converter (j_compress_ptr cinfo) +{ + my_cconvert_ptr cconvert; + + cconvert = (my_cconvert_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_color_converter)); + cinfo->cconvert = (struct jpeg_color_converter *) cconvert; + /* set start_pass to null method until we find out differently */ + cconvert->pub.start_pass = null_method; + + /* Make sure input_components agrees with in_color_space */ + switch (cinfo->in_color_space) { + case JCS_GRAYSCALE: + if (cinfo->input_components != 1) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; + + case JCS_RGB: +#if RGB_PIXELSIZE != 3 + if (cinfo->input_components != RGB_PIXELSIZE) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; +#endif /* else share code with YCbCr */ + + case JCS_YCbCr: + if (cinfo->input_components != 3) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; + + case JCS_CMYK: + case JCS_YCCK: + if (cinfo->input_components != 4) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; + + default: /* JCS_UNKNOWN can be anything */ + if (cinfo->input_components < 1) + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + break; + } + + /* Check num_components, set conversion method based on requested space */ + switch (cinfo->jpeg_color_space) { + case JCS_GRAYSCALE: + if (cinfo->num_components != 1) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_GRAYSCALE) + cconvert->pub.color_convert = grayscale_convert; + else if (cinfo->in_color_space == JCS_RGB) { + cconvert->pub.start_pass = rgb_ycc_start; + cconvert->pub.color_convert = rgb_gray_convert; + } else if (cinfo->in_color_space == JCS_YCbCr) + cconvert->pub.color_convert = grayscale_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_RGB: + if (cinfo->num_components != 3) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3) + cconvert->pub.color_convert = null_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_YCbCr: + if (cinfo->num_components != 3) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_RGB) { + cconvert->pub.start_pass = rgb_ycc_start; + cconvert->pub.color_convert = rgb_ycc_convert; + } else if (cinfo->in_color_space == JCS_YCbCr) + cconvert->pub.color_convert = null_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_CMYK: + if (cinfo->num_components != 4) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_CMYK) + cconvert->pub.color_convert = null_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_YCCK: + if (cinfo->num_components != 4) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + if (cinfo->in_color_space == JCS_CMYK) { + cconvert->pub.start_pass = rgb_ycc_start; + cconvert->pub.color_convert = cmyk_ycck_convert; + } else if (cinfo->in_color_space == JCS_YCCK) + cconvert->pub.color_convert = null_convert; + else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + default: /* allow null conversion of JCS_UNKNOWN */ + if (cinfo->jpeg_color_space != cinfo->in_color_space || + cinfo->num_components != cinfo->input_components) + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + cconvert->pub.color_convert = null_convert; + break; + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jcdctmgr.c b/third_party/windows/fltk-1.1.10/jpeg/jcdctmgr.c new file mode 100644 index 0000000..e3f90dc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jcdctmgr.c @@ -0,0 +1,387 @@ +/* + * jcdctmgr.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the forward-DCT management logic. + * This code selects a particular DCT implementation to be used, + * and it performs related housekeeping chores including coefficient + * quantization. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + + +/* Private subobject for this module */ + +typedef struct { + struct jpeg_forward_dct pub; /* public fields */ + + /* Pointer to the DCT routine actually in use */ + forward_DCT_method_ptr do_dct; + + /* The actual post-DCT divisors --- not identical to the quant table + * entries, because of scaling (especially for an unnormalized DCT). + * Each table is given in normal array order. + */ + DCTELEM * divisors[NUM_QUANT_TBLS]; + +#ifdef DCT_FLOAT_SUPPORTED + /* Same as above for the floating-point case. */ + float_DCT_method_ptr do_float_dct; + FAST_FLOAT * float_divisors[NUM_QUANT_TBLS]; +#endif +} my_fdct_controller; + +typedef my_fdct_controller * my_fdct_ptr; + + +/* + * Initialize for a processing pass. + * Verify that all referenced Q-tables are present, and set up + * the divisor table for each one. + * In the current implementation, DCT of all components is done during + * the first pass, even if only some components will be output in the + * first scan. Hence all components should be examined here. + */ + +METHODDEF(void) +start_pass_fdctmgr (j_compress_ptr cinfo) +{ + my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; + int ci, qtblno, i; + jpeg_component_info *compptr; + JQUANT_TBL * qtbl; + DCTELEM * dtbl; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + qtblno = compptr->quant_tbl_no; + /* Make sure specified quantization table is present */ + if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || + cinfo->quant_tbl_ptrs[qtblno] == NULL) + ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); + qtbl = cinfo->quant_tbl_ptrs[qtblno]; + /* Compute divisors for this quant table */ + /* We may do this more than once for same table, but it's not a big deal */ + switch (cinfo->dct_method) { +#ifdef DCT_ISLOW_SUPPORTED + case JDCT_ISLOW: + /* For LL&M IDCT method, divisors are equal to raw quantization + * coefficients multiplied by 8 (to counteract scaling). + */ + if (fdct->divisors[qtblno] == NULL) { + fdct->divisors[qtblno] = (DCTELEM *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + DCTSIZE2 * SIZEOF(DCTELEM)); + } + dtbl = fdct->divisors[qtblno]; + for (i = 0; i < DCTSIZE2; i++) { + dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3; + } + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + { + /* For AA&N IDCT method, divisors are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * We apply a further scale factor of 8. + */ +#define CONST_BITS 14 + static const INT16 aanscales[DCTSIZE2] = { + /* precomputed values scaled up by 14 bits */ + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, + 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, + 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, + 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, + 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 + }; + SHIFT_TEMPS + + if (fdct->divisors[qtblno] == NULL) { + fdct->divisors[qtblno] = (DCTELEM *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + DCTSIZE2 * SIZEOF(DCTELEM)); + } + dtbl = fdct->divisors[qtblno]; + for (i = 0; i < DCTSIZE2; i++) { + dtbl[i] = (DCTELEM) + DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], + (INT32) aanscales[i]), + CONST_BITS-3); + } + } + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + { + /* For float AA&N IDCT method, divisors are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * We apply a further scale factor of 8. + * What's actually stored is 1/divisor so that the inner loop can + * use a multiplication rather than a division. + */ + FAST_FLOAT * fdtbl; + int row, col; + static const double aanscalefactor[DCTSIZE] = { + 1.0, 1.387039845, 1.306562965, 1.175875602, + 1.0, 0.785694958, 0.541196100, 0.275899379 + }; + + if (fdct->float_divisors[qtblno] == NULL) { + fdct->float_divisors[qtblno] = (FAST_FLOAT *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + DCTSIZE2 * SIZEOF(FAST_FLOAT)); + } + fdtbl = fdct->float_divisors[qtblno]; + i = 0; + for (row = 0; row < DCTSIZE; row++) { + for (col = 0; col < DCTSIZE; col++) { + fdtbl[i] = (FAST_FLOAT) + (1.0 / (((double) qtbl->quantval[i] * + aanscalefactor[row] * aanscalefactor[col] * 8.0))); + i++; + } + } + } + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + } +} + + +/* + * Perform forward DCT on one or more blocks of a component. + * + * The input samples are taken from the sample_data[] array starting at + * position start_row/start_col, and moving to the right for any additional + * blocks. The quantized coefficients are returned in coef_blocks[]. + */ + +METHODDEF(void) +forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY sample_data, JBLOCKROW coef_blocks, + JDIMENSION start_row, JDIMENSION start_col, + JDIMENSION num_blocks) +/* This version is used for integer DCT implementations. */ +{ + /* This routine is heavily used, so it's worth coding it tightly. */ + my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; + forward_DCT_method_ptr do_dct = fdct->do_dct; + DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no]; + DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */ + JDIMENSION bi; + + sample_data += start_row; /* fold in the vertical offset once */ + + for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) { + /* Load data into workspace, applying unsigned->signed conversion */ + { register DCTELEM *workspaceptr; + register JSAMPROW elemptr; + register int elemr; + + workspaceptr = workspace; + for (elemr = 0; elemr < DCTSIZE; elemr++) { + elemptr = sample_data[elemr] + start_col; +#if DCTSIZE == 8 /* unroll the inner loop */ + *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; + *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; +#else + { register int elemc; + for (elemc = DCTSIZE; elemc > 0; elemc--) { + *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; + } + } +#endif + } + } + + /* Perform the DCT */ + (*do_dct) (workspace); + + /* Quantize/descale the coefficients, and store into coef_blocks[] */ + { register DCTELEM temp, qval; + register int i; + register JCOEFPTR output_ptr = coef_blocks[bi]; + + for (i = 0; i < DCTSIZE2; i++) { + qval = divisors[i]; + temp = workspace[i]; + /* Divide the coefficient value by qval, ensuring proper rounding. + * Since C does not specify the direction of rounding for negative + * quotients, we have to force the dividend positive for portability. + * + * In most files, at least half of the output values will be zero + * (at default quantization settings, more like three-quarters...) + * so we should ensure that this case is fast. On many machines, + * a comparison is enough cheaper than a divide to make a special test + * a win. Since both inputs will be nonnegative, we need only test + * for a < b to discover whether a/b is 0. + * If your machine's division is fast enough, define FAST_DIVIDE. + */ +#ifdef FAST_DIVIDE +#define DIVIDE_BY(a,b) a /= b +#else +#define DIVIDE_BY(a,b) if (a >= b) a /= b; else a = 0 +#endif + if (temp < 0) { + temp = -temp; + temp += qval>>1; /* for rounding */ + DIVIDE_BY(temp, qval); + temp = -temp; + } else { + temp += qval>>1; /* for rounding */ + DIVIDE_BY(temp, qval); + } + output_ptr[i] = (JCOEF) temp; + } + } + } +} + + +#ifdef DCT_FLOAT_SUPPORTED + +METHODDEF(void) +forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY sample_data, JBLOCKROW coef_blocks, + JDIMENSION start_row, JDIMENSION start_col, + JDIMENSION num_blocks) +/* This version is used for floating-point DCT implementations. */ +{ + /* This routine is heavily used, so it's worth coding it tightly. */ + my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; + float_DCT_method_ptr do_dct = fdct->do_float_dct; + FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no]; + FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */ + JDIMENSION bi; + + sample_data += start_row; /* fold in the vertical offset once */ + + for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) { + /* Load data into workspace, applying unsigned->signed conversion */ + { register FAST_FLOAT *workspaceptr; + register JSAMPROW elemptr; + register int elemr; + + workspaceptr = workspace; + for (elemr = 0; elemr < DCTSIZE; elemr++) { + elemptr = sample_data[elemr] + start_col; +#if DCTSIZE == 8 /* unroll the inner loop */ + *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); +#else + { register int elemc; + for (elemc = DCTSIZE; elemc > 0; elemc--) { + *workspaceptr++ = (FAST_FLOAT) + (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); + } + } +#endif + } + } + + /* Perform the DCT */ + (*do_dct) (workspace); + + /* Quantize/descale the coefficients, and store into coef_blocks[] */ + { register FAST_FLOAT temp; + register int i; + register JCOEFPTR output_ptr = coef_blocks[bi]; + + for (i = 0; i < DCTSIZE2; i++) { + /* Apply the quantization and scaling factor */ + temp = workspace[i] * divisors[i]; + /* Round to nearest integer. + * Since C does not specify the direction of rounding for negative + * quotients, we have to force the dividend positive for portability. + * The maximum coefficient size is +-16K (for 12-bit data), so this + * code should work for either 16-bit or 32-bit ints. + */ + output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384); + } + } + } +} + +#endif /* DCT_FLOAT_SUPPORTED */ + + +/* + * Initialize FDCT manager. + */ + +GLOBAL(void) +jinit_forward_dct (j_compress_ptr cinfo) +{ + my_fdct_ptr fdct; + int i; + + fdct = (my_fdct_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_fdct_controller)); + cinfo->fdct = (struct jpeg_forward_dct *) fdct; + fdct->pub.start_pass = start_pass_fdctmgr; + + switch (cinfo->dct_method) { +#ifdef DCT_ISLOW_SUPPORTED + case JDCT_ISLOW: + fdct->pub.forward_DCT = forward_DCT; + fdct->do_dct = jpeg_fdct_islow; + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + fdct->pub.forward_DCT = forward_DCT; + fdct->do_dct = jpeg_fdct_ifast; + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + fdct->pub.forward_DCT = forward_DCT_float; + fdct->do_float_dct = jpeg_fdct_float; + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + + /* Mark divisor tables unallocated */ + for (i = 0; i < NUM_QUANT_TBLS; i++) { + fdct->divisors[i] = NULL; +#ifdef DCT_FLOAT_SUPPORTED + fdct->float_divisors[i] = NULL; +#endif + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jchuff.c b/third_party/windows/fltk-1.1.10/jpeg/jchuff.c new file mode 100644 index 0000000..16d9366 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jchuff.c @@ -0,0 +1,909 @@ +/* + * jchuff.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains Huffman entropy encoding routines. + * + * Much of the complexity here has to do with supporting output suspension. + * If the data destination module demands suspension, we want to be able to + * back up to the start of the current MCU. To do this, we copy state + * variables into local working storage, and update them back to the + * permanent JPEG objects only upon successful completion of an MCU. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jchuff.h" /* Declarations shared with jcphuff.c */ + + +/* Expanded entropy encoder object for Huffman encoding. + * + * The savable_state subrecord contains fields that change within an MCU, + * but must not be updated permanently until we complete the MCU. + */ + +typedef struct { + INT32 put_buffer; /* current bit-accumulation buffer */ + int put_bits; /* # of bits now in it */ + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ +} savable_state; + +/* This macro is to work around compilers with missing or broken + * structure assignment. You'll need to fix this code if you have + * such a compiler and you change MAX_COMPS_IN_SCAN. + */ + +#ifndef NO_STRUCT_ASSIGN +#define ASSIGN_STATE(dest,src) ((dest) = (src)) +#else +#if MAX_COMPS_IN_SCAN == 4 +#define ASSIGN_STATE(dest,src) \ + ((dest).put_buffer = (src).put_buffer, \ + (dest).put_bits = (src).put_bits, \ + (dest).last_dc_val[0] = (src).last_dc_val[0], \ + (dest).last_dc_val[1] = (src).last_dc_val[1], \ + (dest).last_dc_val[2] = (src).last_dc_val[2], \ + (dest).last_dc_val[3] = (src).last_dc_val[3]) +#endif +#endif + + +typedef struct { + struct jpeg_entropy_encoder pub; /* public fields */ + + savable_state saved; /* Bit buffer & DC state at start of MCU */ + + /* These fields are NOT loaded into local working state. */ + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + int next_restart_num; /* next restart number to write (0-7) */ + + /* Pointers to derived tables (these workspaces have image lifespan) */ + c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; + c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; + +#ifdef ENTROPY_OPT_SUPPORTED /* Statistics tables for optimization */ + long * dc_count_ptrs[NUM_HUFF_TBLS]; + long * ac_count_ptrs[NUM_HUFF_TBLS]; +#endif +} huff_entropy_encoder; + +typedef huff_entropy_encoder * huff_entropy_ptr; + +/* Working state while writing an MCU. + * This struct contains all the fields that are needed by subroutines. + */ + +typedef struct { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + savable_state cur; /* Current bit buffer & DC state */ + j_compress_ptr cinfo; /* dump_buffer needs access to this */ +} working_state; + + +/* Forward declarations */ +METHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo, + JBLOCKROW *MCU_data)); +METHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo)); +#ifdef ENTROPY_OPT_SUPPORTED +METHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo, + JBLOCKROW *MCU_data)); +METHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo)); +#endif + + +/* + * Initialize for a Huffman-compressed scan. + * If gather_statistics is TRUE, we do not output anything during the scan, + * just count the Huffman symbols used and generate Huffman code tables. + */ + +METHODDEF(void) +start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci, dctbl, actbl; + jpeg_component_info * compptr; + + if (gather_statistics) { +#ifdef ENTROPY_OPT_SUPPORTED + entropy->pub.encode_mcu = encode_mcu_gather; + entropy->pub.finish_pass = finish_pass_gather; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + entropy->pub.encode_mcu = encode_mcu_huff; + entropy->pub.finish_pass = finish_pass_huff; + } + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + dctbl = compptr->dc_tbl_no; + actbl = compptr->ac_tbl_no; + if (gather_statistics) { +#ifdef ENTROPY_OPT_SUPPORTED + /* Check for invalid table indexes */ + /* (make_c_derived_tbl does this in the other path) */ + if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl); + if (actbl < 0 || actbl >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl); + /* Allocate and zero the statistics tables */ + /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ + if (entropy->dc_count_ptrs[dctbl] == NULL) + entropy->dc_count_ptrs[dctbl] = (long *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 257 * SIZEOF(long)); + MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long)); + if (entropy->ac_count_ptrs[actbl] == NULL) + entropy->ac_count_ptrs[actbl] = (long *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 257 * SIZEOF(long)); + MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long)); +#endif + } else { + /* Compute derived values for Huffman tables */ + /* We may do this more than once for a table, but it's not expensive */ + jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl, + & entropy->dc_derived_tbls[dctbl]); + jpeg_make_c_derived_tbl(cinfo, FALSE, actbl, + & entropy->ac_derived_tbls[actbl]); + } + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + + /* Initialize bit buffer to empty */ + entropy->saved.put_buffer = 0; + entropy->saved.put_bits = 0; + + /* Initialize restart stuff */ + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num = 0; +} + + +/* + * Compute the derived values for a Huffman table. + * This routine also performs some validation checks on the table. + * + * Note this is also used by jcphuff.c. + */ + +GLOBAL(void) +jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno, + c_derived_tbl ** pdtbl) +{ + JHUFF_TBL *htbl; + c_derived_tbl *dtbl; + int p, i, l, lastp, si, maxsymbol; + char huffsize[257]; + unsigned int huffcode[257]; + unsigned int code; + + /* Note that huffsize[] and huffcode[] are filled in code-length order, + * paralleling the order of the symbols themselves in htbl->huffval[]. + */ + + /* Find the input Huffman table */ + if (tblno < 0 || tblno >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + htbl = + isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno]; + if (htbl == NULL) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + + /* Allocate a workspace if we haven't already done so. */ + if (*pdtbl == NULL) + *pdtbl = (c_derived_tbl *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(c_derived_tbl)); + dtbl = *pdtbl; + + /* Figure C.1: make table of Huffman code length for each symbol */ + + p = 0; + for (l = 1; l <= 16; l++) { + i = (int) htbl->bits[l]; + if (i < 0 || p + i > 256) /* protect against table overrun */ + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + while (i--) + huffsize[p++] = (char) l; + } + huffsize[p] = 0; + lastp = p; + + /* Figure C.2: generate the codes themselves */ + /* We also validate that the counts represent a legal Huffman code tree. */ + + code = 0; + si = huffsize[0]; + p = 0; + while (huffsize[p]) { + while (((int) huffsize[p]) == si) { + huffcode[p++] = code; + code++; + } + /* code is now 1 more than the last code used for codelength si; but + * it must still fit in si bits, since no code is allowed to be all ones. + */ + if (((INT32) code) >= (((INT32) 1) << si)) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + code <<= 1; + si++; + } + + /* Figure C.3: generate encoding tables */ + /* These are code and size indexed by symbol value */ + + /* Set all codeless symbols to have code length 0; + * this lets us detect duplicate VAL entries here, and later + * allows emit_bits to detect any attempt to emit such symbols. + */ + MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi)); + + /* This is also a convenient place to check for out-of-range + * and duplicated VAL entries. We allow 0..255 for AC symbols + * but only 0..15 for DC. (We could constrain them further + * based on data depth and mode, but this seems enough.) + */ + maxsymbol = isDC ? 15 : 255; + + for (p = 0; p < lastp; p++) { + i = htbl->huffval[p]; + if (i < 0 || i > maxsymbol || dtbl->ehufsi[i]) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + dtbl->ehufco[i] = huffcode[p]; + dtbl->ehufsi[i] = huffsize[p]; + } +} + + +/* Outputting bytes to the file */ + +/* Emit a byte, taking 'action' if must suspend. */ +#define emit_byte(state,val,action) \ + { *(state)->next_output_byte++ = (JOCTET) (val); \ + if (--(state)->free_in_buffer == 0) \ + if (! dump_buffer(state)) \ + { action; } } + + +LOCAL(boolean) +dump_buffer (working_state * state) +/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */ +{ + struct jpeg_destination_mgr * dest = state->cinfo->dest; + + if (! (*dest->empty_output_buffer) (state->cinfo)) + return FALSE; + /* After a successful buffer dump, must reset buffer pointers */ + state->next_output_byte = dest->next_output_byte; + state->free_in_buffer = dest->free_in_buffer; + return TRUE; +} + + +/* Outputting bits to the file */ + +/* Only the right 24 bits of put_buffer are used; the valid bits are + * left-justified in this part. At most 16 bits can be passed to emit_bits + * in one call, and we never retain more than 7 bits in put_buffer + * between calls, so 24 bits are sufficient. + */ + +INLINE +LOCAL(boolean) +emit_bits (working_state * state, unsigned int code, int size) +/* Emit some bits; return TRUE if successful, FALSE if must suspend */ +{ + /* This routine is heavily used, so it's worth coding tightly. */ + register INT32 put_buffer = (INT32) code; + register int put_bits = state->cur.put_bits; + + /* if size is 0, caller used an invalid Huffman table entry */ + if (size == 0) + ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE); + + put_buffer &= (((INT32) 1)<cur.put_buffer; /* and merge with old buffer contents */ + + while (put_bits >= 8) { + int c = (int) ((put_buffer >> 16) & 0xFF); + + emit_byte(state, c, return FALSE); + if (c == 0xFF) { /* need to stuff a zero byte? */ + emit_byte(state, 0, return FALSE); + } + put_buffer <<= 8; + put_bits -= 8; + } + + state->cur.put_buffer = put_buffer; /* update state variables */ + state->cur.put_bits = put_bits; + + return TRUE; +} + + +LOCAL(boolean) +flush_bits (working_state * state) +{ + if (! emit_bits(state, 0x7F, 7)) /* fill any partial byte with ones */ + return FALSE; + state->cur.put_buffer = 0; /* and reset bit-buffer to empty */ + state->cur.put_bits = 0; + return TRUE; +} + + +/* Encode a single block's worth of coefficients */ + +LOCAL(boolean) +encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val, + c_derived_tbl *dctbl, c_derived_tbl *actbl) +{ + register int temp, temp2; + register int nbits; + register int k, r, i; + + /* Encode the DC coefficient difference per section F.1.2.1 */ + + temp = temp2 = block[0] - last_dc_val; + + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + /* For a negative input, want temp2 = bitwise complement of abs(input) */ + /* This code assumes we are on a two's complement machine */ + temp2--; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 0; + while (temp) { + nbits++; + temp >>= 1; + } + /* Check for out-of-range coefficient values. + * Since we're encoding a difference, the range limit is twice as much. + */ + if (nbits > MAX_COEF_BITS+1) + ERREXIT(state->cinfo, JERR_BAD_DCT_COEF); + + /* Emit the Huffman-coded symbol for the number of bits */ + if (! emit_bits(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits])) + return FALSE; + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + if (nbits) /* emit_bits rejects calls with size 0 */ + if (! emit_bits(state, (unsigned int) temp2, nbits)) + return FALSE; + + /* Encode the AC coefficients per section F.1.2.2 */ + + r = 0; /* r = run length of zeros */ + + for (k = 1; k < DCTSIZE2; k++) { + if ((temp = block[jpeg_natural_order[k]]) == 0) { + r++; + } else { + /* if run length > 15, must emit special run-length-16 codes (0xF0) */ + while (r > 15) { + if (! emit_bits(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0])) + return FALSE; + r -= 16; + } + + temp2 = temp; + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + /* This code assumes we are on a two's complement machine */ + temp2--; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 1; /* there must be at least one 1 bit */ + while ((temp >>= 1)) + nbits++; + /* Check for out-of-range coefficient values */ + if (nbits > MAX_COEF_BITS) + ERREXIT(state->cinfo, JERR_BAD_DCT_COEF); + + /* Emit Huffman symbol for run length / number of bits */ + i = (r << 4) + nbits; + if (! emit_bits(state, actbl->ehufco[i], actbl->ehufsi[i])) + return FALSE; + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + if (! emit_bits(state, (unsigned int) temp2, nbits)) + return FALSE; + + r = 0; + } + } + + /* If the last coef(s) were zero, emit an end-of-block code */ + if (r > 0) + if (! emit_bits(state, actbl->ehufco[0], actbl->ehufsi[0])) + return FALSE; + + return TRUE; +} + + +/* + * Emit a restart marker & resynchronize predictions. + */ + +LOCAL(boolean) +emit_restart (working_state * state, int restart_num) +{ + int ci; + + if (! flush_bits(state)) + return FALSE; + + emit_byte(state, 0xFF, return FALSE); + emit_byte(state, JPEG_RST0 + restart_num, return FALSE); + + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < state->cinfo->comps_in_scan; ci++) + state->cur.last_dc_val[ci] = 0; + + /* The restart counter is not updated until we successfully write the MCU. */ + + return TRUE; +} + + +/* + * Encode and output one MCU's worth of Huffman-compressed coefficients. + */ + +METHODDEF(boolean) +encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + working_state state; + int blkn, ci; + jpeg_component_info * compptr; + + /* Load up working state */ + state.next_output_byte = cinfo->dest->next_output_byte; + state.free_in_buffer = cinfo->dest->free_in_buffer; + ASSIGN_STATE(state.cur, entropy->saved); + state.cinfo = cinfo; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! emit_restart(&state, entropy->next_restart_num)) + return FALSE; + } + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + if (! encode_one_block(&state, + MCU_data[blkn][0], state.cur.last_dc_val[ci], + entropy->dc_derived_tbls[compptr->dc_tbl_no], + entropy->ac_derived_tbls[compptr->ac_tbl_no])) + return FALSE; + /* Update last_dc_val */ + state.cur.last_dc_val[ci] = MCU_data[blkn][0][0]; + } + + /* Completed MCU, so update state */ + cinfo->dest->next_output_byte = state.next_output_byte; + cinfo->dest->free_in_buffer = state.free_in_buffer; + ASSIGN_STATE(entropy->saved, state.cur); + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * Finish up at the end of a Huffman-compressed scan. + */ + +METHODDEF(void) +finish_pass_huff (j_compress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + working_state state; + + /* Load up working state ... flush_bits needs it */ + state.next_output_byte = cinfo->dest->next_output_byte; + state.free_in_buffer = cinfo->dest->free_in_buffer; + ASSIGN_STATE(state.cur, entropy->saved); + state.cinfo = cinfo; + + /* Flush out the last data */ + if (! flush_bits(&state)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + + /* Update state */ + cinfo->dest->next_output_byte = state.next_output_byte; + cinfo->dest->free_in_buffer = state.free_in_buffer; + ASSIGN_STATE(entropy->saved, state.cur); +} + + +/* + * Huffman coding optimization. + * + * We first scan the supplied data and count the number of uses of each symbol + * that is to be Huffman-coded. (This process MUST agree with the code above.) + * Then we build a Huffman coding tree for the observed counts. + * Symbols which are not needed at all for the particular image are not + * assigned any code, which saves space in the DHT marker as well as in + * the compressed data. + */ + +#ifdef ENTROPY_OPT_SUPPORTED + + +/* Process a single block's worth of coefficients */ + +LOCAL(void) +htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val, + long dc_counts[], long ac_counts[]) +{ + register int temp; + register int nbits; + register int k, r; + + /* Encode the DC coefficient difference per section F.1.2.1 */ + + temp = block[0] - last_dc_val; + if (temp < 0) + temp = -temp; + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 0; + while (temp) { + nbits++; + temp >>= 1; + } + /* Check for out-of-range coefficient values. + * Since we're encoding a difference, the range limit is twice as much. + */ + if (nbits > MAX_COEF_BITS+1) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count the Huffman symbol for the number of bits */ + dc_counts[nbits]++; + + /* Encode the AC coefficients per section F.1.2.2 */ + + r = 0; /* r = run length of zeros */ + + for (k = 1; k < DCTSIZE2; k++) { + if ((temp = block[jpeg_natural_order[k]]) == 0) { + r++; + } else { + /* if run length > 15, must emit special run-length-16 codes (0xF0) */ + while (r > 15) { + ac_counts[0xF0]++; + r -= 16; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + if (temp < 0) + temp = -temp; + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 1; /* there must be at least one 1 bit */ + while ((temp >>= 1)) + nbits++; + /* Check for out-of-range coefficient values */ + if (nbits > MAX_COEF_BITS) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count Huffman symbol for run length / number of bits */ + ac_counts[(r << 4) + nbits]++; + + r = 0; + } + } + + /* If the last coef(s) were zero, emit an end-of-block code */ + if (r > 0) + ac_counts[0]++; +} + + +/* + * Trial-encode one MCU's worth of Huffman-compressed coefficients. + * No data is actually output, so no suspension return is possible. + */ + +METHODDEF(boolean) +encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int blkn, ci; + jpeg_component_info * compptr; + + /* Take care of restart intervals if needed */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + entropy->saved.last_dc_val[ci] = 0; + /* Update restart state */ + entropy->restarts_to_go = cinfo->restart_interval; + } + entropy->restarts_to_go--; + } + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci], + entropy->dc_count_ptrs[compptr->dc_tbl_no], + entropy->ac_count_ptrs[compptr->ac_tbl_no]); + entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0]; + } + + return TRUE; +} + + +/* + * Generate the best Huffman code table for the given counts, fill htbl. + * Note this is also used by jcphuff.c. + * + * The JPEG standard requires that no symbol be assigned a codeword of all + * one bits (so that padding bits added at the end of a compressed segment + * can't look like a valid code). Because of the canonical ordering of + * codewords, this just means that there must be an unused slot in the + * longest codeword length category. Section K.2 of the JPEG spec suggests + * reserving such a slot by pretending that symbol 256 is a valid symbol + * with count 1. In theory that's not optimal; giving it count zero but + * including it in the symbol set anyway should give a better Huffman code. + * But the theoretically better code actually seems to come out worse in + * practice, because it produces more all-ones bytes (which incur stuffed + * zero bytes in the final file). In any case the difference is tiny. + * + * The JPEG standard requires Huffman codes to be no more than 16 bits long. + * If some symbols have a very small but nonzero probability, the Huffman tree + * must be adjusted to meet the code length restriction. We currently use + * the adjustment method suggested in JPEG section K.2. This method is *not* + * optimal; it may not choose the best possible limited-length code. But + * typically only very-low-frequency symbols will be given less-than-optimal + * lengths, so the code is almost optimal. Experimental comparisons against + * an optimal limited-length-code algorithm indicate that the difference is + * microscopic --- usually less than a hundredth of a percent of total size. + * So the extra complexity of an optimal algorithm doesn't seem worthwhile. + */ + +GLOBAL(void) +jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]) +{ +#define MAX_CLEN 32 /* assumed maximum initial code length */ + UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */ + int codesize[257]; /* codesize[k] = code length of symbol k */ + int others[257]; /* next symbol in current branch of tree */ + int c1, c2; + int p, i, j; + long v; + + /* This algorithm is explained in section K.2 of the JPEG standard */ + + MEMZERO(bits, SIZEOF(bits)); + MEMZERO(codesize, SIZEOF(codesize)); + for (i = 0; i < 257; i++) + others[i] = -1; /* init links to empty */ + + freq[256] = 1; /* make sure 256 has a nonzero count */ + /* Including the pseudo-symbol 256 in the Huffman procedure guarantees + * that no real symbol is given code-value of all ones, because 256 + * will be placed last in the largest codeword category. + */ + + /* Huffman's basic algorithm to assign optimal code lengths to symbols */ + + for (;;) { + /* Find the smallest nonzero frequency, set c1 = its symbol */ + /* In case of ties, take the larger symbol number */ + c1 = -1; + v = 1000000000L; + for (i = 0; i <= 256; i++) { + if (freq[i] && freq[i] <= v) { + v = freq[i]; + c1 = i; + } + } + + /* Find the next smallest nonzero frequency, set c2 = its symbol */ + /* In case of ties, take the larger symbol number */ + c2 = -1; + v = 1000000000L; + for (i = 0; i <= 256; i++) { + if (freq[i] && freq[i] <= v && i != c1) { + v = freq[i]; + c2 = i; + } + } + + /* Done if we've merged everything into one frequency */ + if (c2 < 0) + break; + + /* Else merge the two counts/trees */ + freq[c1] += freq[c2]; + freq[c2] = 0; + + /* Increment the codesize of everything in c1's tree branch */ + codesize[c1]++; + while (others[c1] >= 0) { + c1 = others[c1]; + codesize[c1]++; + } + + others[c1] = c2; /* chain c2 onto c1's tree branch */ + + /* Increment the codesize of everything in c2's tree branch */ + codesize[c2]++; + while (others[c2] >= 0) { + c2 = others[c2]; + codesize[c2]++; + } + } + + /* Now count the number of symbols of each code length */ + for (i = 0; i <= 256; i++) { + if (codesize[i]) { + /* The JPEG standard seems to think that this can't happen, */ + /* but I'm paranoid... */ + if (codesize[i] > MAX_CLEN) + ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW); + + bits[codesize[i]]++; + } + } + + /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure + * Huffman procedure assigned any such lengths, we must adjust the coding. + * Here is what the JPEG spec says about how this next bit works: + * Since symbols are paired for the longest Huffman code, the symbols are + * removed from this length category two at a time. The prefix for the pair + * (which is one bit shorter) is allocated to one of the pair; then, + * skipping the BITS entry for that prefix length, a code word from the next + * shortest nonzero BITS entry is converted into a prefix for two code words + * one bit longer. + */ + + for (i = MAX_CLEN; i > 16; i--) { + while (bits[i] > 0) { + j = i - 2; /* find length of new prefix to be used */ + while (bits[j] == 0) + j--; + + bits[i] -= 2; /* remove two symbols */ + bits[i-1]++; /* one goes in this length */ + bits[j+1] += 2; /* two new symbols in this length */ + bits[j]--; /* symbol of this length is now a prefix */ + } + } + + /* Remove the count for the pseudo-symbol 256 from the largest codelength */ + while (bits[i] == 0) /* find largest codelength still in use */ + i--; + bits[i]--; + + /* Return final symbol counts (only for lengths 0..16) */ + MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits)); + + /* Return a list of the symbols sorted by code length */ + /* It's not real clear to me why we don't need to consider the codelength + * changes made above, but the JPEG spec seems to think this works. + */ + p = 0; + for (i = 1; i <= MAX_CLEN; i++) { + for (j = 0; j <= 255; j++) { + if (codesize[j] == i) { + htbl->huffval[p] = (UINT8) j; + p++; + } + } + } + + /* Set sent_table FALSE so updated table will be written to JPEG file. */ + htbl->sent_table = FALSE; +} + + +/* + * Finish up a statistics-gathering pass and create the new Huffman tables. + */ + +METHODDEF(void) +finish_pass_gather (j_compress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci, dctbl, actbl; + jpeg_component_info * compptr; + JHUFF_TBL **htblptr; + boolean did_dc[NUM_HUFF_TBLS]; + boolean did_ac[NUM_HUFF_TBLS]; + + /* It's important not to apply jpeg_gen_optimal_table more than once + * per table, because it clobbers the input frequency counts! + */ + MEMZERO(did_dc, SIZEOF(did_dc)); + MEMZERO(did_ac, SIZEOF(did_ac)); + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + dctbl = compptr->dc_tbl_no; + actbl = compptr->ac_tbl_no; + if (! did_dc[dctbl]) { + htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl]; + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]); + did_dc[dctbl] = TRUE; + } + if (! did_ac[actbl]) { + htblptr = & cinfo->ac_huff_tbl_ptrs[actbl]; + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]); + did_ac[actbl] = TRUE; + } + } +} + + +#endif /* ENTROPY_OPT_SUPPORTED */ + + +/* + * Module initialization routine for Huffman entropy encoding. + */ + +GLOBAL(void) +jinit_huff_encoder (j_compress_ptr cinfo) +{ + huff_entropy_ptr entropy; + int i; + + entropy = (huff_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(huff_entropy_encoder)); + cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; + entropy->pub.start_pass = start_pass_huff; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; +#ifdef ENTROPY_OPT_SUPPORTED + entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL; +#endif + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jchuff.h b/third_party/windows/fltk-1.1.10/jpeg/jchuff.h new file mode 100644 index 0000000..8c02c09 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jchuff.h @@ -0,0 +1,47 @@ +/* + * jchuff.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains declarations for Huffman entropy encoding routines + * that are shared between the sequential encoder (jchuff.c) and the + * progressive encoder (jcphuff.c). No other modules need to see these. + */ + +/* The legal range of a DCT coefficient is + * -1024 .. +1023 for 8-bit data; + * -16384 .. +16383 for 12-bit data. + * Hence the magnitude should always fit in 10 or 14 bits respectively. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MAX_COEF_BITS 10 +#else +#define MAX_COEF_BITS 14 +#endif + +/* Derived data constructed for each Huffman table */ + +typedef struct { + unsigned int ehufco[256]; /* code for each symbol */ + char ehufsi[256]; /* length of code for each symbol */ + /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */ +} c_derived_tbl; + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_make_c_derived_tbl jMkCDerived +#define jpeg_gen_optimal_table jGenOptTbl +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + +/* Expand a Huffman table definition into the derived format */ +EXTERN(void) jpeg_make_c_derived_tbl + JPP((j_compress_ptr cinfo, boolean isDC, int tblno, + c_derived_tbl ** pdtbl)); + +/* Generate an optimal table definition given the specified counts */ +EXTERN(void) jpeg_gen_optimal_table + JPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])); diff --git a/third_party/windows/fltk-1.1.10/jpeg/jcinit.c b/third_party/windows/fltk-1.1.10/jpeg/jcinit.c new file mode 100644 index 0000000..19de8d0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jcinit.c @@ -0,0 +1,72 @@ +/* + * jcinit.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains initialization logic for the JPEG compressor. + * This routine is in charge of selecting the modules to be executed and + * making an initialization call to each one. + * + * Logically, this code belongs in jcmaster.c. It's split out because + * linking this routine implies linking the entire compression library. + * For a transcoding-only application, we want to be able to use jcmaster.c + * without linking in the whole library. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Master selection of compression modules. + * This is done once at the start of processing an image. We determine + * which modules will be used and give them appropriate initialization calls. + */ + +GLOBAL(void) +jinit_compress_master (j_compress_ptr cinfo) +{ + /* Initialize master control (includes parameter checking/processing) */ + jinit_c_master_control(cinfo, FALSE /* full compression */); + + /* Preprocessing */ + if (! cinfo->raw_data_in) { + jinit_color_converter(cinfo); + jinit_downsampler(cinfo); + jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */); + } + /* Forward DCT */ + jinit_forward_dct(cinfo); + /* Entropy encoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) { + ERREXIT(cinfo, JERR_ARITH_NOTIMPL); + } else { + if (cinfo->progressive_mode) { +#ifdef C_PROGRESSIVE_SUPPORTED + jinit_phuff_encoder(cinfo); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else + jinit_huff_encoder(cinfo); + } + + /* Need a full-image coefficient buffer in any multi-pass mode. */ + jinit_c_coef_controller(cinfo, + (boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding)); + jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */); + + jinit_marker_writer(cinfo); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Write the datastream header (SOI) immediately. + * Frame and scan headers are postponed till later. + * This lets application insert special markers after the SOI. + */ + (*cinfo->marker->write_file_header) (cinfo); +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jcmainct.c b/third_party/windows/fltk-1.1.10/jpeg/jcmainct.c new file mode 100644 index 0000000..16aab21 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jcmainct.c @@ -0,0 +1,293 @@ +/* + * jcmainct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the main buffer controller for compression. + * The main buffer lies between the pre-processor and the JPEG + * compressor proper; it holds downsampled data in the JPEG colorspace. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Note: currently, there is no operating mode in which a full-image buffer + * is needed at this step. If there were, that mode could not be used with + * "raw data" input, since this module is bypassed in that case. However, + * we've left the code here for possible use in special applications. + */ +#undef FULL_MAIN_BUFFER_SUPPORTED + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_c_main_controller pub; /* public fields */ + + JDIMENSION cur_iMCU_row; /* number of current iMCU row */ + JDIMENSION rowgroup_ctr; /* counts row groups received in iMCU row */ + boolean suspended; /* remember if we suspended output */ + J_BUF_MODE pass_mode; /* current operating mode */ + + /* If using just a strip buffer, this points to the entire set of buffers + * (we allocate one for each component). In the full-image case, this + * points to the currently accessible strips of the virtual arrays. + */ + JSAMPARRAY buffer[MAX_COMPONENTS]; + +#ifdef FULL_MAIN_BUFFER_SUPPORTED + /* If using full-image storage, this array holds pointers to virtual-array + * control blocks for each component. Unused if not full-image storage. + */ + jvirt_sarray_ptr whole_image[MAX_COMPONENTS]; +#endif +} my_main_controller; + +typedef my_main_controller * my_main_ptr; + + +/* Forward declarations */ +METHODDEF(void) process_data_simple_main + JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, + JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); +#ifdef FULL_MAIN_BUFFER_SUPPORTED +METHODDEF(void) process_data_buffer_main + JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, + JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); +#endif + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_main_ptr jmain = (my_main_ptr) cinfo->main; + + /* Do nothing in raw-data mode. */ + if (cinfo->raw_data_in) + return; + + jmain->cur_iMCU_row = 0; /* initialize counters */ + jmain->rowgroup_ctr = 0; + jmain->suspended = FALSE; + jmain->pass_mode = pass_mode; /* save mode for use by process_data */ + + switch (pass_mode) { + case JBUF_PASS_THRU: +#ifdef FULL_MAIN_BUFFER_SUPPORTED + if (jmain->whole_image[0] != NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); +#endif + jmain->pub.process_data = process_data_simple_main; + break; +#ifdef FULL_MAIN_BUFFER_SUPPORTED + case JBUF_SAVE_SOURCE: + case JBUF_CRANK_DEST: + case JBUF_SAVE_AND_PASS: + if (jmain->whole_image[0] == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + jmain->pub.process_data = process_data_buffer_main; + break; +#endif + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } +} + + +/* + * Process some data. + * This routine handles the simple pass-through mode, + * where we have only a strip buffer. + */ + +METHODDEF(void) +process_data_simple_main (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail) +{ + my_main_ptr jmain = (my_main_ptr) cinfo->main; + + while (jmain->cur_iMCU_row < cinfo->total_iMCU_rows) { + /* Read input data if we haven't filled the main buffer yet */ + if (jmain->rowgroup_ctr < DCTSIZE) + (*cinfo->prep->pre_process_data) (cinfo, + input_buf, in_row_ctr, in_rows_avail, + jmain->buffer, &jmain->rowgroup_ctr, + (JDIMENSION) DCTSIZE); + + /* If we don't have a full iMCU row buffered, return to application for + * more data. Note that preprocessor will always pad to fill the iMCU row + * at the bottom of the image. + */ + if (jmain->rowgroup_ctr != DCTSIZE) + return; + + /* Send the completed row to the compressor */ + if (! (*cinfo->coef->compress_data) (cinfo, jmain->buffer)) { + /* If compressor did not consume the whole row, then we must need to + * suspend processing and return to the application. In this situation + * we pretend we didn't yet consume the last input row; otherwise, if + * it happened to be the last row of the image, the application would + * think we were done. + */ + if (! jmain->suspended) { + (*in_row_ctr)--; + jmain->suspended = TRUE; + } + return; + } + /* We did finish the row. Undo our little suspension hack if a previous + * call suspended; then mark the main buffer empty. + */ + if (jmain->suspended) { + (*in_row_ctr)++; + jmain->suspended = FALSE; + } + jmain->rowgroup_ctr = 0; + jmain->cur_iMCU_row++; + } +} + + +#ifdef FULL_MAIN_BUFFER_SUPPORTED + +/* + * Process some data. + * This routine handles all of the modes that use a full-size buffer. + */ + +METHODDEF(void) +process_data_buffer_main (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail) +{ + my_main_ptr jmain = (my_main_ptr) cinfo->main; + int ci; + jpeg_component_info *compptr; + boolean writing = (jmain->pass_mode != JBUF_CRANK_DEST); + + while (jmain->cur_iMCU_row < cinfo->total_iMCU_rows) { + /* Realign the virtual buffers if at the start of an iMCU row. */ + if (jmain->rowgroup_ctr == 0) { + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + jmain->buffer[ci] = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, jmain->whole_image[ci], + jmain->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE), + (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing); + } + /* In a read pass, pretend we just read some source data. */ + if (! writing) { + *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE; + jmain->rowgroup_ctr = DCTSIZE; + } + } + + /* If a write pass, read input data until the current iMCU row is full. */ + /* Note: preprocessor will pad if necessary to fill the last iMCU row. */ + if (writing) { + (*cinfo->prep->pre_process_data) (cinfo, + input_buf, in_row_ctr, in_rows_avail, + jmain->buffer, &jmain->rowgroup_ctr, + (JDIMENSION) DCTSIZE); + /* Return to application if we need more data to fill the iMCU row. */ + if (jmain->rowgroup_ctr < DCTSIZE) + return; + } + + /* Emit data, unless this is a sink-only pass. */ + if (jmain->pass_mode != JBUF_SAVE_SOURCE) { + if (! (*cinfo->coef->compress_data) (cinfo, jmain->buffer)) { + /* If compressor did not consume the whole row, then we must need to + * suspend processing and return to the application. In this situation + * we pretend we didn't yet consume the last input row; otherwise, if + * it happened to be the last row of the image, the application would + * think we were done. + */ + if (! jmain->suspended) { + (*in_row_ctr)--; + jmain->suspended = TRUE; + } + return; + } + /* We did finish the row. Undo our little suspension hack if a previous + * call suspended; then mark the main buffer empty. + */ + if (jmain->suspended) { + (*in_row_ctr)++; + jmain->suspended = FALSE; + } + } + + /* If get here, we are done with this iMCU row. Mark buffer empty. */ + jmain->rowgroup_ctr = 0; + jmain->cur_iMCU_row++; + } +} + +#endif /* FULL_MAIN_BUFFER_SUPPORTED */ + + +/* + * Initialize main buffer controller. + */ + +GLOBAL(void) +jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer) +{ + my_main_ptr jmain; + int ci; + jpeg_component_info *compptr; + + jmain = (my_main_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_main_controller)); + cinfo->main = (struct jpeg_c_main_controller *) jmain; + jmain->pub.start_pass = start_pass_main; + + /* We don't need to create a buffer in raw-data mode. */ + if (cinfo->raw_data_in) + return; + + /* Create the buffer. It holds downsampled data, so each component + * may be of a different size. + */ + if (need_full_buffer) { +#ifdef FULL_MAIN_BUFFER_SUPPORTED + /* Allocate a full-image virtual array for each component */ + /* Note we pad the bottom to a multiple of the iMCU height */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + jmain->whole_image[ci] = (*cinfo->mem->request_virt_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + compptr->width_in_blocks * DCTSIZE, + (JDIMENSION) jround_up((long) compptr->height_in_blocks, + (long) compptr->v_samp_factor) * DCTSIZE, + (JDIMENSION) (compptr->v_samp_factor * DCTSIZE)); + } +#else + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); +#endif + } else { +#ifdef FULL_MAIN_BUFFER_SUPPORTED + jmain->whole_image[0] = NULL; /* flag for no virtual arrays */ +#endif + /* Allocate a strip buffer for each component */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + jmain->buffer[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + compptr->width_in_blocks * DCTSIZE, + (JDIMENSION) (compptr->v_samp_factor * DCTSIZE)); + } + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jcmarker.c b/third_party/windows/fltk-1.1.10/jpeg/jcmarker.c new file mode 100644 index 0000000..0d3ca5e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jcmarker.c @@ -0,0 +1,664 @@ +/* + * jcmarker.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains routines to write JPEG datastream markers. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +typedef enum { /* JPEG marker codes */ + M_SOF0 = 0xc0, + M_SOF1 = 0xc1, + M_SOF2 = 0xc2, + M_SOF3 = 0xc3, + + M_SOF5 = 0xc5, + M_SOF6 = 0xc6, + M_SOF7 = 0xc7, + + M_JPG = 0xc8, + M_SOF9 = 0xc9, + M_SOF10 = 0xca, + M_SOF11 = 0xcb, + + M_SOF13 = 0xcd, + M_SOF14 = 0xce, + M_SOF15 = 0xcf, + + M_DHT = 0xc4, + + M_DAC = 0xcc, + + M_RST0 = 0xd0, + M_RST1 = 0xd1, + M_RST2 = 0xd2, + M_RST3 = 0xd3, + M_RST4 = 0xd4, + M_RST5 = 0xd5, + M_RST6 = 0xd6, + M_RST7 = 0xd7, + + M_SOI = 0xd8, + M_EOI = 0xd9, + M_SOS = 0xda, + M_DQT = 0xdb, + M_DNL = 0xdc, + M_DRI = 0xdd, + M_DHP = 0xde, + M_EXP = 0xdf, + + M_APP0 = 0xe0, + M_APP1 = 0xe1, + M_APP2 = 0xe2, + M_APP3 = 0xe3, + M_APP4 = 0xe4, + M_APP5 = 0xe5, + M_APP6 = 0xe6, + M_APP7 = 0xe7, + M_APP8 = 0xe8, + M_APP9 = 0xe9, + M_APP10 = 0xea, + M_APP11 = 0xeb, + M_APP12 = 0xec, + M_APP13 = 0xed, + M_APP14 = 0xee, + M_APP15 = 0xef, + + M_JPG0 = 0xf0, + M_JPG13 = 0xfd, + M_COM = 0xfe, + + M_TEM = 0x01, + + M_ERROR = 0x100 +} JPEG_MARKER; + + +/* Private state */ + +typedef struct { + struct jpeg_marker_writer pub; /* public fields */ + + unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */ +} my_marker_writer; + +typedef my_marker_writer * my_marker_ptr; + + +/* + * Basic output routines. + * + * Note that we do not support suspension while writing a marker. + * Therefore, an application using suspension must ensure that there is + * enough buffer space for the initial markers (typ. 600-700 bytes) before + * calling jpeg_start_compress, and enough space to write the trailing EOI + * (a few bytes) before calling jpeg_finish_compress. Multipass compression + * modes are not supported at all with suspension, so those two are the only + * points where markers will be written. + */ + +LOCAL(void) +emit_byte (j_compress_ptr cinfo, int val) +/* Emit a byte */ +{ + struct jpeg_destination_mgr * dest = cinfo->dest; + + *(dest->next_output_byte)++ = (JOCTET) val; + if (--dest->free_in_buffer == 0) { + if (! (*dest->empty_output_buffer) (cinfo)) + ERREXIT(cinfo, JERR_CANT_SUSPEND); + } +} + + +LOCAL(void) +emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark) +/* Emit a marker code */ +{ + emit_byte(cinfo, 0xFF); + emit_byte(cinfo, (int) mark); +} + + +LOCAL(void) +emit_2bytes (j_compress_ptr cinfo, int value) +/* Emit a 2-byte integer; these are always MSB first in JPEG files */ +{ + emit_byte(cinfo, (value >> 8) & 0xFF); + emit_byte(cinfo, value & 0xFF); +} + + +/* + * Routines to write specific marker types. + */ + +LOCAL(int) +emit_dqt (j_compress_ptr cinfo, int index) +/* Emit a DQT marker */ +/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */ +{ + JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index]; + int prec; + int i; + + if (qtbl == NULL) + ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index); + + prec = 0; + for (i = 0; i < DCTSIZE2; i++) { + if (qtbl->quantval[i] > 255) + prec = 1; + } + + if (! qtbl->sent_table) { + emit_marker(cinfo, M_DQT); + + emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2); + + emit_byte(cinfo, index + (prec<<4)); + + for (i = 0; i < DCTSIZE2; i++) { + /* The table entries must be emitted in zigzag order. */ + unsigned int qval = qtbl->quantval[jpeg_natural_order[i]]; + if (prec) + emit_byte(cinfo, (int) (qval >> 8)); + emit_byte(cinfo, (int) (qval & 0xFF)); + } + + qtbl->sent_table = TRUE; + } + + return prec; +} + + +LOCAL(void) +emit_dht (j_compress_ptr cinfo, int index, boolean is_ac) +/* Emit a DHT marker */ +{ + JHUFF_TBL * htbl; + int length, i; + + if (is_ac) { + htbl = cinfo->ac_huff_tbl_ptrs[index]; + index += 0x10; /* output index has AC bit set */ + } else { + htbl = cinfo->dc_huff_tbl_ptrs[index]; + } + + if (htbl == NULL) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index); + + if (! htbl->sent_table) { + emit_marker(cinfo, M_DHT); + + length = 0; + for (i = 1; i <= 16; i++) + length += htbl->bits[i]; + + emit_2bytes(cinfo, length + 2 + 1 + 16); + emit_byte(cinfo, index); + + for (i = 1; i <= 16; i++) + emit_byte(cinfo, htbl->bits[i]); + + for (i = 0; i < length; i++) + emit_byte(cinfo, htbl->huffval[i]); + + htbl->sent_table = TRUE; + } +} + + +LOCAL(void) +emit_dac (j_compress_ptr cinfo) +/* Emit a DAC marker */ +/* Since the useful info is so small, we want to emit all the tables in */ +/* one DAC marker. Therefore this routine does its own scan of the table. */ +{ +#ifdef C_ARITH_CODING_SUPPORTED + char dc_in_use[NUM_ARITH_TBLS]; + char ac_in_use[NUM_ARITH_TBLS]; + int length, i; + jpeg_component_info *compptr; + + for (i = 0; i < NUM_ARITH_TBLS; i++) + dc_in_use[i] = ac_in_use[i] = 0; + + for (i = 0; i < cinfo->comps_in_scan; i++) { + compptr = cinfo->cur_comp_info[i]; + dc_in_use[compptr->dc_tbl_no] = 1; + ac_in_use[compptr->ac_tbl_no] = 1; + } + + length = 0; + for (i = 0; i < NUM_ARITH_TBLS; i++) + length += dc_in_use[i] + ac_in_use[i]; + + emit_marker(cinfo, M_DAC); + + emit_2bytes(cinfo, length*2 + 2); + + for (i = 0; i < NUM_ARITH_TBLS; i++) { + if (dc_in_use[i]) { + emit_byte(cinfo, i); + emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4)); + } + if (ac_in_use[i]) { + emit_byte(cinfo, i + 0x10); + emit_byte(cinfo, cinfo->arith_ac_K[i]); + } + } +#endif /* C_ARITH_CODING_SUPPORTED */ +} + + +LOCAL(void) +emit_dri (j_compress_ptr cinfo) +/* Emit a DRI marker */ +{ + emit_marker(cinfo, M_DRI); + + emit_2bytes(cinfo, 4); /* fixed length */ + + emit_2bytes(cinfo, (int) cinfo->restart_interval); +} + + +LOCAL(void) +emit_sof (j_compress_ptr cinfo, JPEG_MARKER code) +/* Emit a SOF marker */ +{ + int ci; + jpeg_component_info *compptr; + + emit_marker(cinfo, code); + + emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */ + + /* Make sure image isn't bigger than SOF field can handle */ + if ((long) cinfo->image_height > 65535L || + (long) cinfo->image_width > 65535L) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535); + + emit_byte(cinfo, cinfo->data_precision); + emit_2bytes(cinfo, (int) cinfo->image_height); + emit_2bytes(cinfo, (int) cinfo->image_width); + + emit_byte(cinfo, cinfo->num_components); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + emit_byte(cinfo, compptr->component_id); + emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor); + emit_byte(cinfo, compptr->quant_tbl_no); + } +} + + +LOCAL(void) +emit_sos (j_compress_ptr cinfo) +/* Emit a SOS marker */ +{ + int i, td, ta; + jpeg_component_info *compptr; + + emit_marker(cinfo, M_SOS); + + emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */ + + emit_byte(cinfo, cinfo->comps_in_scan); + + for (i = 0; i < cinfo->comps_in_scan; i++) { + compptr = cinfo->cur_comp_info[i]; + emit_byte(cinfo, compptr->component_id); + td = compptr->dc_tbl_no; + ta = compptr->ac_tbl_no; + if (cinfo->progressive_mode) { + /* Progressive mode: only DC or only AC tables are used in one scan; + * furthermore, Huffman coding of DC refinement uses no table at all. + * We emit 0 for unused field(s); this is recommended by the P&M text + * but does not seem to be specified in the standard. + */ + if (cinfo->Ss == 0) { + ta = 0; /* DC scan */ + if (cinfo->Ah != 0 && !cinfo->arith_code) + td = 0; /* no DC table either */ + } else { + td = 0; /* AC scan */ + } + } + emit_byte(cinfo, (td << 4) + ta); + } + + emit_byte(cinfo, cinfo->Ss); + emit_byte(cinfo, cinfo->Se); + emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al); +} + + +LOCAL(void) +emit_jfif_app0 (j_compress_ptr cinfo) +/* Emit a JFIF-compliant APP0 marker */ +{ + /* + * Length of APP0 block (2 bytes) + * Block ID (4 bytes - ASCII "JFIF") + * Zero byte (1 byte to terminate the ID string) + * Version Major, Minor (2 bytes - major first) + * Units (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm) + * Xdpu (2 bytes - dots per unit horizontal) + * Ydpu (2 bytes - dots per unit vertical) + * Thumbnail X size (1 byte) + * Thumbnail Y size (1 byte) + */ + + emit_marker(cinfo, M_APP0); + + emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */ + + emit_byte(cinfo, 0x4A); /* Identifier: ASCII "JFIF" */ + emit_byte(cinfo, 0x46); + emit_byte(cinfo, 0x49); + emit_byte(cinfo, 0x46); + emit_byte(cinfo, 0); + emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */ + emit_byte(cinfo, cinfo->JFIF_minor_version); + emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */ + emit_2bytes(cinfo, (int) cinfo->X_density); + emit_2bytes(cinfo, (int) cinfo->Y_density); + emit_byte(cinfo, 0); /* No thumbnail image */ + emit_byte(cinfo, 0); +} + + +LOCAL(void) +emit_adobe_app14 (j_compress_ptr cinfo) +/* Emit an Adobe APP14 marker */ +{ + /* + * Length of APP14 block (2 bytes) + * Block ID (5 bytes - ASCII "Adobe") + * Version Number (2 bytes - currently 100) + * Flags0 (2 bytes - currently 0) + * Flags1 (2 bytes - currently 0) + * Color transform (1 byte) + * + * Although Adobe TN 5116 mentions Version = 101, all the Adobe files + * now in circulation seem to use Version = 100, so that's what we write. + * + * We write the color transform byte as 1 if the JPEG color space is + * YCbCr, 2 if it's YCCK, 0 otherwise. Adobe's definition has to do with + * whether the encoder performed a transformation, which is pretty useless. + */ + + emit_marker(cinfo, M_APP14); + + emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */ + + emit_byte(cinfo, 0x41); /* Identifier: ASCII "Adobe" */ + emit_byte(cinfo, 0x64); + emit_byte(cinfo, 0x6F); + emit_byte(cinfo, 0x62); + emit_byte(cinfo, 0x65); + emit_2bytes(cinfo, 100); /* Version */ + emit_2bytes(cinfo, 0); /* Flags0 */ + emit_2bytes(cinfo, 0); /* Flags1 */ + switch (cinfo->jpeg_color_space) { + case JCS_YCbCr: + emit_byte(cinfo, 1); /* Color transform = 1 */ + break; + case JCS_YCCK: + emit_byte(cinfo, 2); /* Color transform = 2 */ + break; + default: + emit_byte(cinfo, 0); /* Color transform = 0 */ + break; + } +} + + +/* + * These routines allow writing an arbitrary marker with parameters. + * The only intended use is to emit COM or APPn markers after calling + * write_file_header and before calling write_frame_header. + * Other uses are not guaranteed to produce desirable results. + * Counting the parameter bytes properly is the caller's responsibility. + */ + +METHODDEF(void) +write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen) +/* Emit an arbitrary marker header */ +{ + if (datalen > (unsigned int) 65533) /* safety check */ + ERREXIT(cinfo, JERR_BAD_LENGTH); + + emit_marker(cinfo, (JPEG_MARKER) marker); + + emit_2bytes(cinfo, (int) (datalen + 2)); /* total length */ +} + +METHODDEF(void) +write_marker_byte (j_compress_ptr cinfo, int val) +/* Emit one byte of marker parameters following write_marker_header */ +{ + emit_byte(cinfo, val); +} + + +/* + * Write datastream header. + * This consists of an SOI and optional APPn markers. + * We recommend use of the JFIF marker, but not the Adobe marker, + * when using YCbCr or grayscale data. The JFIF marker should NOT + * be used for any other JPEG colorspace. The Adobe marker is helpful + * to distinguish RGB, CMYK, and YCCK colorspaces. + * Note that an application can write additional header markers after + * jpeg_start_compress returns. + */ + +METHODDEF(void) +write_file_header (j_compress_ptr cinfo) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + + emit_marker(cinfo, M_SOI); /* first the SOI */ + + /* SOI is defined to reset restart interval to 0 */ + marker->last_restart_interval = 0; + + if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */ + emit_jfif_app0(cinfo); + if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */ + emit_adobe_app14(cinfo); +} + + +/* + * Write frame header. + * This consists of DQT and SOFn markers. + * Note that we do not emit the SOF until we have emitted the DQT(s). + * This avoids compatibility problems with incorrect implementations that + * try to error-check the quant table numbers as soon as they see the SOF. + */ + +METHODDEF(void) +write_frame_header (j_compress_ptr cinfo) +{ + int ci, prec; + boolean is_baseline; + jpeg_component_info *compptr; + + /* Emit DQT for each quantization table. + * Note that emit_dqt() suppresses any duplicate tables. + */ + prec = 0; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + prec += emit_dqt(cinfo, compptr->quant_tbl_no); + } + /* now prec is nonzero iff there are any 16-bit quant tables. */ + + /* Check for a non-baseline specification. + * Note we assume that Huffman table numbers won't be changed later. + */ + if (cinfo->arith_code || cinfo->progressive_mode || + cinfo->data_precision != 8) { + is_baseline = FALSE; + } else { + is_baseline = TRUE; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1) + is_baseline = FALSE; + } + if (prec && is_baseline) { + is_baseline = FALSE; + /* If it's baseline except for quantizer size, warn the user */ + TRACEMS(cinfo, 0, JTRC_16BIT_TABLES); + } + } + + /* Emit the proper SOF marker */ + if (cinfo->arith_code) { + emit_sof(cinfo, M_SOF9); /* SOF code for arithmetic coding */ + } else { + if (cinfo->progressive_mode) + emit_sof(cinfo, M_SOF2); /* SOF code for progressive Huffman */ + else if (is_baseline) + emit_sof(cinfo, M_SOF0); /* SOF code for baseline implementation */ + else + emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */ + } +} + + +/* + * Write scan header. + * This consists of DHT or DAC markers, optional DRI, and SOS. + * Compressed data will be written following the SOS. + */ + +METHODDEF(void) +write_scan_header (j_compress_ptr cinfo) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + int i; + jpeg_component_info *compptr; + + if (cinfo->arith_code) { + /* Emit arith conditioning info. We may have some duplication + * if the file has multiple scans, but it's so small it's hardly + * worth worrying about. + */ + emit_dac(cinfo); + } else { + /* Emit Huffman tables. + * Note that emit_dht() suppresses any duplicate tables. + */ + for (i = 0; i < cinfo->comps_in_scan; i++) { + compptr = cinfo->cur_comp_info[i]; + if (cinfo->progressive_mode) { + /* Progressive mode: only DC or only AC tables are used in one scan */ + if (cinfo->Ss == 0) { + if (cinfo->Ah == 0) /* DC needs no table for refinement scan */ + emit_dht(cinfo, compptr->dc_tbl_no, FALSE); + } else { + emit_dht(cinfo, compptr->ac_tbl_no, TRUE); + } + } else { + /* Sequential mode: need both DC and AC tables */ + emit_dht(cinfo, compptr->dc_tbl_no, FALSE); + emit_dht(cinfo, compptr->ac_tbl_no, TRUE); + } + } + } + + /* Emit DRI if required --- note that DRI value could change for each scan. + * We avoid wasting space with unnecessary DRIs, however. + */ + if (cinfo->restart_interval != marker->last_restart_interval) { + emit_dri(cinfo); + marker->last_restart_interval = cinfo->restart_interval; + } + + emit_sos(cinfo); +} + + +/* + * Write datastream trailer. + */ + +METHODDEF(void) +write_file_trailer (j_compress_ptr cinfo) +{ + emit_marker(cinfo, M_EOI); +} + + +/* + * Write an abbreviated table-specification datastream. + * This consists of SOI, DQT and DHT tables, and EOI. + * Any table that is defined and not marked sent_table = TRUE will be + * emitted. Note that all tables will be marked sent_table = TRUE at exit. + */ + +METHODDEF(void) +write_tables_only (j_compress_ptr cinfo) +{ + int i; + + emit_marker(cinfo, M_SOI); + + for (i = 0; i < NUM_QUANT_TBLS; i++) { + if (cinfo->quant_tbl_ptrs[i] != NULL) + (void) emit_dqt(cinfo, i); + } + + if (! cinfo->arith_code) { + for (i = 0; i < NUM_HUFF_TBLS; i++) { + if (cinfo->dc_huff_tbl_ptrs[i] != NULL) + emit_dht(cinfo, i, FALSE); + if (cinfo->ac_huff_tbl_ptrs[i] != NULL) + emit_dht(cinfo, i, TRUE); + } + } + + emit_marker(cinfo, M_EOI); +} + + +/* + * Initialize the marker writer module. + */ + +GLOBAL(void) +jinit_marker_writer (j_compress_ptr cinfo) +{ + my_marker_ptr marker; + + /* Create the subobject */ + marker = (my_marker_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_marker_writer)); + cinfo->marker = (struct jpeg_marker_writer *) marker; + /* Initialize method pointers */ + marker->pub.write_file_header = write_file_header; + marker->pub.write_frame_header = write_frame_header; + marker->pub.write_scan_header = write_scan_header; + marker->pub.write_file_trailer = write_file_trailer; + marker->pub.write_tables_only = write_tables_only; + marker->pub.write_marker_header = write_marker_header; + marker->pub.write_marker_byte = write_marker_byte; + /* Initialize private state */ + marker->last_restart_interval = 0; +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jcmaster.c b/third_party/windows/fltk-1.1.10/jpeg/jcmaster.c new file mode 100644 index 0000000..e61138b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jcmaster.c @@ -0,0 +1,590 @@ +/* + * jcmaster.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains master control logic for the JPEG compressor. + * These routines are concerned with parameter validation, initial setup, + * and inter-pass control (determining the number of passes and the work + * to be done in each pass). + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private state */ + +typedef enum { + main_pass, /* input data, also do first output step */ + huff_opt_pass, /* Huffman code optimization pass */ + output_pass /* data output pass */ +} c_pass_type; + +typedef struct { + struct jpeg_comp_master pub; /* public fields */ + + c_pass_type pass_type; /* the type of the current pass */ + + int pass_number; /* # of passes completed */ + int total_passes; /* total # of passes needed */ + + int scan_number; /* current index in scan_info[] */ +} my_comp_master; + +typedef my_comp_master * my_master_ptr; + + +/* + * Support routines that do various essential calculations. + */ + +LOCAL(void) +initial_setup (j_compress_ptr cinfo) +/* Do computations that are needed before master selection phase */ +{ + int ci; + jpeg_component_info *compptr; + long samplesperrow; + JDIMENSION jd_samplesperrow; + + /* Sanity check on image dimensions */ + if (cinfo->image_height <= 0 || cinfo->image_width <= 0 + || cinfo->num_components <= 0 || cinfo->input_components <= 0) + ERREXIT(cinfo, JERR_EMPTY_IMAGE); + + /* Make sure image isn't bigger than I can handle */ + if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION || + (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); + + /* Width of an input scanline must be representable as JDIMENSION. */ + samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components; + jd_samplesperrow = (JDIMENSION) samplesperrow; + if ((long) jd_samplesperrow != samplesperrow) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + + /* For now, precision must match compiled-in value... */ + if (cinfo->data_precision != BITS_IN_JSAMPLE) + ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); + + /* Check that number of components won't exceed internal array sizes */ + if (cinfo->num_components > MAX_COMPONENTS) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, + MAX_COMPONENTS); + + /* Compute maximum sampling factors; check factor validity */ + cinfo->max_h_samp_factor = 1; + cinfo->max_v_samp_factor = 1; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || + compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) + ERREXIT(cinfo, JERR_BAD_SAMPLING); + cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, + compptr->h_samp_factor); + cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, + compptr->v_samp_factor); + } + + /* Compute dimensions of components */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Fill in the correct component_index value; don't rely on application */ + compptr->component_index = ci; + /* For compression, we never do DCT scaling. */ + compptr->DCT_scaled_size = DCTSIZE; + /* Size in DCT blocks */ + compptr->width_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, + (long) (cinfo->max_h_samp_factor * DCTSIZE)); + compptr->height_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, + (long) (cinfo->max_v_samp_factor * DCTSIZE)); + /* Size in samples */ + compptr->downsampled_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, + (long) cinfo->max_h_samp_factor); + compptr->downsampled_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, + (long) cinfo->max_v_samp_factor); + /* Mark component needed (this flag isn't actually used for compression) */ + compptr->component_needed = TRUE; + } + + /* Compute number of fully interleaved MCU rows (number of times that + * main controller will call coefficient controller). + */ + cinfo->total_iMCU_rows = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, + (long) (cinfo->max_v_samp_factor*DCTSIZE)); +} + + +#ifdef C_MULTISCAN_FILES_SUPPORTED + +LOCAL(void) +validate_script (j_compress_ptr cinfo) +/* Verify that the scan script in cinfo->scan_info[] is valid; also + * determine whether it uses progressive JPEG, and set cinfo->progressive_mode. + */ +{ + const jpeg_scan_info * scanptr; + int scanno, ncomps, ci, coefi, thisi; + int Ss, Se, Ah, Al; + boolean component_sent[MAX_COMPONENTS]; +#ifdef C_PROGRESSIVE_SUPPORTED + int * last_bitpos_ptr; + int last_bitpos[MAX_COMPONENTS][DCTSIZE2]; + /* -1 until that coefficient has been seen; then last Al for it */ +#endif + + if (cinfo->num_scans <= 0) + ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0); + + /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1; + * for progressive JPEG, no scan can have this. + */ + scanptr = cinfo->scan_info; + if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) { +#ifdef C_PROGRESSIVE_SUPPORTED + cinfo->progressive_mode = TRUE; + last_bitpos_ptr = & last_bitpos[0][0]; + for (ci = 0; ci < cinfo->num_components; ci++) + for (coefi = 0; coefi < DCTSIZE2; coefi++) + *last_bitpos_ptr++ = -1; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + cinfo->progressive_mode = FALSE; + for (ci = 0; ci < cinfo->num_components; ci++) + component_sent[ci] = FALSE; + } + + for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) { + /* Validate component indexes */ + ncomps = scanptr->comps_in_scan; + if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN); + for (ci = 0; ci < ncomps; ci++) { + thisi = scanptr->component_index[ci]; + if (thisi < 0 || thisi >= cinfo->num_components) + ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); + /* Components must appear in SOF order within each scan */ + if (ci > 0 && thisi <= scanptr->component_index[ci-1]) + ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); + } + /* Validate progression parameters */ + Ss = scanptr->Ss; + Se = scanptr->Se; + Ah = scanptr->Ah; + Al = scanptr->Al; + if (cinfo->progressive_mode) { +#ifdef C_PROGRESSIVE_SUPPORTED + /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that + * seems wrong: the upper bound ought to depend on data precision. + * Perhaps they really meant 0..N+1 for N-bit precision. + * Here we allow 0..10 for 8-bit data; Al larger than 10 results in + * out-of-range reconstructed DC values during the first DC scan, + * which might cause problems for some decoders. + */ +#if BITS_IN_JSAMPLE == 8 +#define MAX_AH_AL 10 +#else +#define MAX_AH_AL 13 +#endif + if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 || + Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL) + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + if (Ss == 0) { + if (Se != 0) /* DC and AC together not OK */ + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + } else { + if (ncomps != 1) /* AC scans must be for only one component */ + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + } + for (ci = 0; ci < ncomps; ci++) { + last_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0]; + if (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */ + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + for (coefi = Ss; coefi <= Se; coefi++) { + if (last_bitpos_ptr[coefi] < 0) { + /* first scan of this coefficient */ + if (Ah != 0) + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + } else { + /* not first scan */ + if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1) + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + } + last_bitpos_ptr[coefi] = Al; + } + } +#endif + } else { + /* For sequential JPEG, all progression parameters must be these: */ + if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0) + ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); + /* Make sure components are not sent twice */ + for (ci = 0; ci < ncomps; ci++) { + thisi = scanptr->component_index[ci]; + if (component_sent[thisi]) + ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); + component_sent[thisi] = TRUE; + } + } + } + + /* Now verify that everything got sent. */ + if (cinfo->progressive_mode) { +#ifdef C_PROGRESSIVE_SUPPORTED + /* For progressive mode, we only check that at least some DC data + * got sent for each component; the spec does not require that all bits + * of all coefficients be transmitted. Would it be wiser to enforce + * transmission of all coefficient bits?? + */ + for (ci = 0; ci < cinfo->num_components; ci++) { + if (last_bitpos[ci][0] < 0) + ERREXIT(cinfo, JERR_MISSING_DATA); + } +#endif + } else { + for (ci = 0; ci < cinfo->num_components; ci++) { + if (! component_sent[ci]) + ERREXIT(cinfo, JERR_MISSING_DATA); + } + } +} + +#endif /* C_MULTISCAN_FILES_SUPPORTED */ + + +LOCAL(void) +select_scan_parameters (j_compress_ptr cinfo) +/* Set up the scan parameters for the current scan */ +{ + int ci; + +#ifdef C_MULTISCAN_FILES_SUPPORTED + if (cinfo->scan_info != NULL) { + /* Prepare for current scan --- the script is already validated */ + my_master_ptr master = (my_master_ptr) cinfo->master; + const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number; + + cinfo->comps_in_scan = scanptr->comps_in_scan; + for (ci = 0; ci < scanptr->comps_in_scan; ci++) { + cinfo->cur_comp_info[ci] = + &cinfo->comp_info[scanptr->component_index[ci]]; + } + cinfo->Ss = scanptr->Ss; + cinfo->Se = scanptr->Se; + cinfo->Ah = scanptr->Ah; + cinfo->Al = scanptr->Al; + } + else +#endif + { + /* Prepare for single sequential-JPEG scan containing all components */ + if (cinfo->num_components > MAX_COMPS_IN_SCAN) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, + MAX_COMPS_IN_SCAN); + cinfo->comps_in_scan = cinfo->num_components; + for (ci = 0; ci < cinfo->num_components; ci++) { + cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci]; + } + cinfo->Ss = 0; + cinfo->Se = DCTSIZE2-1; + cinfo->Ah = 0; + cinfo->Al = 0; + } +} + + +LOCAL(void) +per_scan_setup (j_compress_ptr cinfo) +/* Do computations that are needed before processing a JPEG scan */ +/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */ +{ + int ci, mcublks, tmp; + jpeg_component_info *compptr; + + if (cinfo->comps_in_scan == 1) { + + /* Noninterleaved (single-component) scan */ + compptr = cinfo->cur_comp_info[0]; + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = compptr->width_in_blocks; + cinfo->MCU_rows_in_scan = compptr->height_in_blocks; + + /* For noninterleaved scan, always one block per MCU */ + compptr->MCU_width = 1; + compptr->MCU_height = 1; + compptr->MCU_blocks = 1; + compptr->MCU_sample_width = DCTSIZE; + compptr->last_col_width = 1; + /* For noninterleaved scans, it is convenient to define last_row_height + * as the number of block rows present in the last iMCU row. + */ + tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (tmp == 0) tmp = compptr->v_samp_factor; + compptr->last_row_height = tmp; + + /* Prepare array describing MCU composition */ + cinfo->blocks_in_MCU = 1; + cinfo->MCU_membership[0] = 0; + + } else { + + /* Interleaved (multi-component) scan */ + if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, + MAX_COMPS_IN_SCAN); + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, + (long) (cinfo->max_h_samp_factor*DCTSIZE)); + cinfo->MCU_rows_in_scan = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, + (long) (cinfo->max_v_samp_factor*DCTSIZE)); + + cinfo->blocks_in_MCU = 0; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Sampling factors give # of blocks of component in each MCU */ + compptr->MCU_width = compptr->h_samp_factor; + compptr->MCU_height = compptr->v_samp_factor; + compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; + compptr->MCU_sample_width = compptr->MCU_width * DCTSIZE; + /* Figure number of non-dummy blocks in last MCU column & row */ + tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); + if (tmp == 0) tmp = compptr->MCU_width; + compptr->last_col_width = tmp; + tmp = (int) (compptr->height_in_blocks % compptr->MCU_height); + if (tmp == 0) tmp = compptr->MCU_height; + compptr->last_row_height = tmp; + /* Prepare array describing MCU composition */ + mcublks = compptr->MCU_blocks; + if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU) + ERREXIT(cinfo, JERR_BAD_MCU_SIZE); + while (mcublks-- > 0) { + cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; + } + } + + } + + /* Convert restart specified in rows to actual MCU count. */ + /* Note that count must fit in 16 bits, so we provide limiting. */ + if (cinfo->restart_in_rows > 0) { + long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row; + cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L); + } +} + + +/* + * Per-pass setup. + * This is called at the beginning of each pass. We determine which modules + * will be active during this pass and give them appropriate start_pass calls. + * We also set is_last_pass to indicate whether any more passes will be + * required. + */ + +METHODDEF(void) +prepare_for_pass (j_compress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + switch (master->pass_type) { + case main_pass: + /* Initial pass: will collect input data, and do either Huffman + * optimization or data output for the first scan. + */ + select_scan_parameters(cinfo); + per_scan_setup(cinfo); + if (! cinfo->raw_data_in) { + (*cinfo->cconvert->start_pass) (cinfo); + (*cinfo->downsample->start_pass) (cinfo); + (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU); + } + (*cinfo->fdct->start_pass) (cinfo); + (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding); + (*cinfo->coef->start_pass) (cinfo, + (master->total_passes > 1 ? + JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); + (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); + if (cinfo->optimize_coding) { + /* No immediate data output; postpone writing frame/scan headers */ + master->pub.call_pass_startup = FALSE; + } else { + /* Will write frame/scan headers at first jpeg_write_scanlines call */ + master->pub.call_pass_startup = TRUE; + } + break; +#ifdef ENTROPY_OPT_SUPPORTED + case huff_opt_pass: + /* Do Huffman optimization for a scan after the first one. */ + select_scan_parameters(cinfo); + per_scan_setup(cinfo); + if (cinfo->Ss != 0 || cinfo->Ah == 0 || cinfo->arith_code) { + (*cinfo->entropy->start_pass) (cinfo, TRUE); + (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST); + master->pub.call_pass_startup = FALSE; + break; + } + /* Special case: Huffman DC refinement scans need no Huffman table + * and therefore we can skip the optimization pass for them. + */ + master->pass_type = output_pass; + master->pass_number++; + /*FALLTHROUGH*/ +#endif + case output_pass: + /* Do a data-output pass. */ + /* We need not repeat per-scan setup if prior optimization pass did it. */ + if (! cinfo->optimize_coding) { + select_scan_parameters(cinfo); + per_scan_setup(cinfo); + } + (*cinfo->entropy->start_pass) (cinfo, FALSE); + (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST); + /* We emit frame/scan headers now */ + if (master->scan_number == 0) + (*cinfo->marker->write_frame_header) (cinfo); + (*cinfo->marker->write_scan_header) (cinfo); + master->pub.call_pass_startup = FALSE; + break; + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + } + + master->pub.is_last_pass = (master->pass_number == master->total_passes-1); + + /* Set up progress monitor's pass info if present */ + if (cinfo->progress != NULL) { + cinfo->progress->completed_passes = master->pass_number; + cinfo->progress->total_passes = master->total_passes; + } +} + + +/* + * Special start-of-pass hook. + * This is called by jpeg_write_scanlines if call_pass_startup is TRUE. + * In single-pass processing, we need this hook because we don't want to + * write frame/scan headers during jpeg_start_compress; we want to let the + * application write COM markers etc. between jpeg_start_compress and the + * jpeg_write_scanlines loop. + * In multi-pass processing, this routine is not used. + */ + +METHODDEF(void) +pass_startup (j_compress_ptr cinfo) +{ + cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */ + + (*cinfo->marker->write_frame_header) (cinfo); + (*cinfo->marker->write_scan_header) (cinfo); +} + + +/* + * Finish up at end of pass. + */ + +METHODDEF(void) +finish_pass_master (j_compress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + /* The entropy coder always needs an end-of-pass call, + * either to analyze statistics or to flush its output buffer. + */ + (*cinfo->entropy->finish_pass) (cinfo); + + /* Update state for next pass */ + switch (master->pass_type) { + case main_pass: + /* next pass is either output of scan 0 (after optimization) + * or output of scan 1 (if no optimization). + */ + master->pass_type = output_pass; + if (! cinfo->optimize_coding) + master->scan_number++; + break; + case huff_opt_pass: + /* next pass is always output of current scan */ + master->pass_type = output_pass; + break; + case output_pass: + /* next pass is either optimization or output of next scan */ + if (cinfo->optimize_coding) + master->pass_type = huff_opt_pass; + master->scan_number++; + break; + } + + master->pass_number++; +} + + +/* + * Initialize master compression control. + */ + +GLOBAL(void) +jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only) +{ + my_master_ptr master; + + master = (my_master_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_comp_master)); + cinfo->master = (struct jpeg_comp_master *) master; + master->pub.prepare_for_pass = prepare_for_pass; + master->pub.pass_startup = pass_startup; + master->pub.finish_pass = finish_pass_master; + master->pub.is_last_pass = FALSE; + + /* Validate parameters, determine derived values */ + initial_setup(cinfo); + + if (cinfo->scan_info != NULL) { +#ifdef C_MULTISCAN_FILES_SUPPORTED + validate_script(cinfo); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + cinfo->progressive_mode = FALSE; + cinfo->num_scans = 1; + } + + if (cinfo->progressive_mode) /* TEMPORARY HACK ??? */ + cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */ + + /* Initialize my private state */ + if (transcode_only) { + /* no main pass in transcoding */ + if (cinfo->optimize_coding) + master->pass_type = huff_opt_pass; + else + master->pass_type = output_pass; + } else { + /* for normal compression, first pass is always this type: */ + master->pass_type = main_pass; + } + master->scan_number = 0; + master->pass_number = 0; + if (cinfo->optimize_coding) + master->total_passes = cinfo->num_scans * 2; + else + master->total_passes = cinfo->num_scans; +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jcomapi.c b/third_party/windows/fltk-1.1.10/jpeg/jcomapi.c new file mode 100644 index 0000000..1b1a340 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jcomapi.c @@ -0,0 +1,106 @@ +/* + * jcomapi.c + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface routines that are used for both + * compression and decompression. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Abort processing of a JPEG compression or decompression operation, + * but don't destroy the object itself. + * + * For this, we merely clean up all the nonpermanent memory pools. + * Note that temp files (virtual arrays) are not allowed to belong to + * the permanent pool, so we will be able to close all temp files here. + * Closing a data source or destination, if necessary, is the application's + * responsibility. + */ + +GLOBAL(void) +jpeg_abort (j_common_ptr cinfo) +{ + int pool; + + /* Do nothing if called on a not-initialized or destroyed JPEG object. */ + if (cinfo->mem == NULL) + return; + + /* Releasing pools in reverse order might help avoid fragmentation + * with some (brain-damaged) malloc libraries. + */ + for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) { + (*cinfo->mem->free_pool) (cinfo, pool); + } + + /* Reset overall state for possible reuse of object */ + if (cinfo->is_decompressor) { + cinfo->global_state = DSTATE_START; + /* Try to keep application from accessing now-deleted marker list. + * A bit kludgy to do it here, but this is the most central place. + */ + ((j_decompress_ptr) cinfo)->marker_list = NULL; + } else { + cinfo->global_state = CSTATE_START; + } +} + + +/* + * Destruction of a JPEG object. + * + * Everything gets deallocated except the master jpeg_compress_struct itself + * and the error manager struct. Both of these are supplied by the application + * and must be freed, if necessary, by the application. (Often they are on + * the stack and so don't need to be freed anyway.) + * Closing a data source or destination, if necessary, is the application's + * responsibility. + */ + +GLOBAL(void) +jpeg_destroy (j_common_ptr cinfo) +{ + /* We need only tell the memory manager to release everything. */ + /* NB: mem pointer is NULL if memory mgr failed to initialize. */ + if (cinfo->mem != NULL) + (*cinfo->mem->self_destruct) (cinfo); + cinfo->mem = NULL; /* be safe if jpeg_destroy is called twice */ + cinfo->global_state = 0; /* mark it destroyed */ +} + + +/* + * Convenience routines for allocating quantization and Huffman tables. + * (Would jutils.c be a more reasonable place to put these?) + */ + +GLOBAL(JQUANT_TBL *) +jpeg_alloc_quant_table (j_common_ptr cinfo) +{ + JQUANT_TBL *tbl; + + tbl = (JQUANT_TBL *) + (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL)); + tbl->sent_table = FALSE; /* make sure this is false in any new table */ + return tbl; +} + + +GLOBAL(JHUFF_TBL *) +jpeg_alloc_huff_table (j_common_ptr cinfo) +{ + JHUFF_TBL *tbl; + + tbl = (JHUFF_TBL *) + (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL)); + tbl->sent_table = FALSE; /* make sure this is false in any new table */ + return tbl; +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jconfig.doc b/third_party/windows/fltk-1.1.10/jpeg/jconfig.doc new file mode 100644 index 0000000..6e2552b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jconfig.doc @@ -0,0 +1,155 @@ +/* + * jconfig.doc + * + * Copyright (C) 1991-1994, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file documents the configuration options that are required to + * customize the JPEG software for a particular system. + * + * The actual configuration options for a particular installation are stored + * in jconfig.h. On many machines, jconfig.h can be generated automatically + * or copied from one of the "canned" jconfig files that we supply. But if + * you need to generate a jconfig.h file by hand, this file tells you how. + * + * DO NOT EDIT THIS FILE --- IT WON'T ACCOMPLISH ANYTHING. + * EDIT A COPY NAMED JCONFIG.H. + */ + + +/* + * These symbols indicate the properties of your machine or compiler. + * #define the symbol if yes, #undef it if no. + */ + +/* Does your compiler support function prototypes? + * (If not, you also need to use ansi2knr, see install.doc) + */ +#define HAVE_PROTOTYPES + +/* Does your compiler support the declaration "unsigned char" ? + * How about "unsigned short" ? + */ +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT + +/* Define "void" as "char" if your compiler doesn't know about type void. + * NOTE: be sure to define void such that "void *" represents the most general + * pointer type, e.g., that returned by malloc(). + */ +/* #define void char */ + +/* Define "const" as empty if your compiler doesn't know the "const" keyword. + */ +/* #define const */ + +/* Define this if an ordinary "char" type is unsigned. + * If you're not sure, leaving it undefined will work at some cost in speed. + * If you defined HAVE_UNSIGNED_CHAR then the speed difference is minimal. + */ +#undef CHAR_IS_UNSIGNED + +/* Define this if your system has an ANSI-conforming file. + */ +#define HAVE_STDDEF_H + +/* Define this if your system has an ANSI-conforming file. + */ +#define HAVE_STDLIB_H + +/* Define this if your system does not have an ANSI/SysV , + * but does have a BSD-style . + */ +#undef NEED_BSD_STRINGS + +/* Define this if your system does not provide typedef size_t in any of the + * ANSI-standard places (stddef.h, stdlib.h, or stdio.h), but places it in + * instead. + */ +#undef NEED_SYS_TYPES_H + +/* For 80x86 machines, you need to define NEED_FAR_POINTERS, + * unless you are using a large-data memory model or 80386 flat-memory mode. + * On less brain-damaged CPUs this symbol must not be defined. + * (Defining this symbol causes large data structures to be referenced through + * "far" pointers and to be allocated with a special version of malloc.) + */ +#undef NEED_FAR_POINTERS + +/* Define this if your linker needs global names to be unique in less + * than the first 15 characters. + */ +#undef NEED_SHORT_EXTERNAL_NAMES + +/* Although a real ANSI C compiler can deal perfectly well with pointers to + * unspecified structures (see "incomplete types" in the spec), a few pre-ANSI + * and pseudo-ANSI compilers get confused. To keep one of these bozos happy, + * define INCOMPLETE_TYPES_BROKEN. This is not recommended unless you + * actually get "missing structure definition" warnings or errors while + * compiling the JPEG code. + */ +#undef INCOMPLETE_TYPES_BROKEN + + +/* + * The following options affect code selection within the JPEG library, + * but they don't need to be visible to applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS has been defined. + */ + +#ifdef JPEG_INTERNALS + +/* Define this if your compiler implements ">>" on signed values as a logical + * (unsigned) shift; leave it undefined if ">>" is a signed (arithmetic) shift, + * which is the normal and rational definition. + */ +#undef RIGHT_SHIFT_IS_UNSIGNED + + +#endif /* JPEG_INTERNALS */ + + +/* + * The remaining options do not affect the JPEG library proper, + * but only the sample applications cjpeg/djpeg (see cjpeg.c, djpeg.c). + * Other applications can ignore these. + */ + +#ifdef JPEG_CJPEG_DJPEG + +/* These defines indicate which image (non-JPEG) file formats are allowed. */ + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +/* Define this if you want to name both input and output files on the command + * line, rather than using stdout and optionally stdin. You MUST do this if + * your system can't cope with binary I/O to stdin/stdout. See comments at + * head of cjpeg.c or djpeg.c. + */ +#undef TWO_FILE_COMMANDLINE + +/* Define this if your system needs explicit cleanup of temporary files. + * This is crucial under MS-DOS, where the temporary "files" may be areas + * of extended memory; on most other systems it's not as important. + */ +#undef NEED_SIGNAL_CATCHER + +/* By default, we open image files with fopen(...,"rb") or fopen(...,"wb"). + * This is necessary on systems that distinguish text files from binary files, + * and is harmless on most systems that don't. If you have one of the rare + * systems that complains about the "b" spec, define this symbol. + */ +#undef DONT_USE_B_MODE + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. + */ +#undef PROGRESS_REPORT + + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jconfig.h b/third_party/windows/fltk-1.1.10/jpeg/jconfig.h new file mode 100644 index 0000000..5703435 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jconfig.h @@ -0,0 +1,50 @@ +/* jconfig.cfg --- source file edited by configure script */ +/* see jconfig.doc for explanations */ + +#define HAVE_PROTOTYPES +#define HAVE_UNSIGNED_CHAR +#define HAVE_UNSIGNED_SHORT +#ifdef __CHAR_UNSIGNED__ +# define CHAR_IS_UNSIGNED +#endif /* __CHAR_UNSIGNED__ */ +/* Define this if you get warnings about undefined structures. */ +#undef INCOMPLETE_TYPES_BROKEN + +#if defined(WIN32) || defined(__EMX__) +/* Define "boolean" as unsigned char, not int, per Windows custom */ +# ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ +typedef unsigned char boolean; +# endif +# define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ +#endif /* WIN32 || __EMX__ */ + +#ifdef JPEG_INTERNALS + +#undef RIGHT_SHIFT_IS_UNSIGNED +#undef INLINE +/* These are for configuring the JPEG memory manager. */ +#undef DEFAULT_MAX_MEM +#undef NO_MKTEMP + +#endif /* JPEG_INTERNALS */ + +#ifdef JPEG_CJPEG_DJPEG + +#define BMP_SUPPORTED /* BMP image file format */ +#define GIF_SUPPORTED /* GIF image file format */ +#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ +#undef RLE_SUPPORTED /* Utah RLE image file format */ +#define TARGA_SUPPORTED /* Targa image file format */ + +#undef TWO_FILE_COMMANDLINE +#undef NEED_SIGNAL_CATCHER +#undef DONT_USE_B_MODE + +#if defined(WIN32) || defined(__EMX__) +# define USE_SETMODE +#endif /* WIN32 || __EMX__ */ + +/* Define this if you want percent-done progress reports from cjpeg/djpeg. */ +#undef PROGRESS_REPORT + +#endif /* JPEG_CJPEG_DJPEG */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jcparam.c b/third_party/windows/fltk-1.1.10/jpeg/jcparam.c new file mode 100644 index 0000000..bbd175c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jcparam.c @@ -0,0 +1,610 @@ +/* + * jcparam.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains optional default-setting code for the JPEG compressor. + * Applications do not have to use this file, but those that don't use it + * must know a lot more about the innards of the JPEG code. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Quantization table setup routines + */ + +GLOBAL(void) +jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, boolean force_baseline) +/* Define a quantization table equal to the basic_table times + * a scale factor (given as a percentage). + * If force_baseline is TRUE, the computed quantization table entries + * are limited to 1..255 for JPEG baseline compatibility. + */ +{ + JQUANT_TBL ** qtblptr; + int i; + long temp; + + /* Safety check to ensure start_compress not called yet. */ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS) + ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl); + + qtblptr = & cinfo->quant_tbl_ptrs[which_tbl]; + + if (*qtblptr == NULL) + *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo); + + for (i = 0; i < DCTSIZE2; i++) { + temp = ((long) basic_table[i] * scale_factor + 50L) / 100L; + /* limit the values to the valid range */ + if (temp <= 0L) temp = 1L; + if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */ + if (force_baseline && temp > 255L) + temp = 255L; /* limit to baseline range if requested */ + (*qtblptr)->quantval[i] = (UINT16) temp; + } + + /* Initialize sent_table FALSE so table will be written to JPEG file. */ + (*qtblptr)->sent_table = FALSE; +} + + +GLOBAL(void) +jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, + boolean force_baseline) +/* Set or change the 'quality' (quantization) setting, using default tables + * and a straight percentage-scaling quality scale. In most cases it's better + * to use jpeg_set_quality (below); this entry point is provided for + * applications that insist on a linear percentage scaling. + */ +{ + /* These are the sample quantization tables given in JPEG spec section K.1. + * The spec says that the values given produce "good" quality, and + * when divided by 2, "very good" quality. + */ + static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { + 16, 11, 10, 16, 24, 40, 51, 61, + 12, 12, 14, 19, 26, 58, 60, 55, + 14, 13, 16, 24, 40, 57, 69, 56, + 14, 17, 22, 29, 51, 87, 80, 62, + 18, 22, 37, 56, 68, 109, 103, 77, + 24, 35, 55, 64, 81, 104, 113, 92, + 49, 64, 78, 87, 103, 121, 120, 101, + 72, 92, 95, 98, 112, 100, 103, 99 + }; + static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = { + 17, 18, 24, 47, 99, 99, 99, 99, + 18, 21, 26, 66, 99, 99, 99, 99, + 24, 26, 56, 99, 99, 99, 99, 99, + 47, 66, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99 + }; + + /* Set up two quantization tables using the specified scaling */ + jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, + scale_factor, force_baseline); + jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, + scale_factor, force_baseline); +} + + +GLOBAL(int) +jpeg_quality_scaling (int quality) +/* Convert a user-specified quality rating to a percentage scaling factor + * for an underlying quantization table, using our recommended scaling curve. + * The input 'quality' factor should be 0 (terrible) to 100 (very good). + */ +{ + /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */ + if (quality <= 0) quality = 1; + if (quality > 100) quality = 100; + + /* The basic table is used as-is (scaling 100) for a quality of 50. + * Qualities 50..100 are converted to scaling percentage 200 - 2*Q; + * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table + * to make all the table entries 1 (hence, minimum quantization loss). + * Qualities 1..50 are converted to scaling percentage 5000/Q. + */ + if (quality < 50) + quality = 5000 / quality; + else + quality = 200 - quality*2; + + return quality; +} + + +GLOBAL(void) +jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline) +/* Set or change the 'quality' (quantization) setting, using default tables. + * This is the standard quality-adjusting entry point for typical user + * interfaces; only those who want detailed control over quantization tables + * would use the preceding three routines directly. + */ +{ + /* Convert user 0-100 rating to percentage scaling */ + quality = jpeg_quality_scaling(quality); + + /* Set up standard quality tables */ + jpeg_set_linear_quality(cinfo, quality, force_baseline); +} + + +/* + * Huffman table setup routines + */ + +LOCAL(void) +add_huff_table (j_compress_ptr cinfo, + JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val) +/* Define a Huffman table */ +{ + int nsymbols, len; + + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + + /* Copy the number-of-symbols-of-each-code-length counts */ + MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); + + /* Validate the counts. We do this here mainly so we can copy the right + * number of symbols from the val[] array, without risking marching off + * the end of memory. jchuff.c will do a more thorough test later. + */ + nsymbols = 0; + for (len = 1; len <= 16; len++) + nsymbols += bits[len]; + if (nsymbols < 1 || nsymbols > 256) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + + MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8)); + + /* Initialize sent_table FALSE so table will be written to JPEG file. */ + (*htblptr)->sent_table = FALSE; +} + + +LOCAL(void) +std_huff_tables (j_compress_ptr cinfo) +/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ +/* IMPORTANT: these are only valid for 8-bit data precision! */ +{ + static const UINT8 bits_dc_luminance[17] = + { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; + static const UINT8 val_dc_luminance[] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + + static const UINT8 bits_dc_chrominance[17] = + { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; + static const UINT8 val_dc_chrominance[] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; + + static const UINT8 bits_ac_luminance[17] = + { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; + static const UINT8 val_ac_luminance[] = + { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, + 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, + 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, + 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, + 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, + 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, + 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, + 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, + 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, + 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, + 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, + 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, + 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa }; + + static const UINT8 bits_ac_chrominance[17] = + { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; + static const UINT8 val_ac_chrominance[] = + { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, + 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, + 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, + 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, + 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, + 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, + 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, + 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, + 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, + 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, + 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, + 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, + 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, + 0xf9, 0xfa }; + + add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0], + bits_dc_luminance, val_dc_luminance); + add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0], + bits_ac_luminance, val_ac_luminance); + add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1], + bits_dc_chrominance, val_dc_chrominance); + add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1], + bits_ac_chrominance, val_ac_chrominance); +} + + +/* + * Default parameter setup for compression. + * + * Applications that don't choose to use this routine must do their + * own setup of all these parameters. Alternately, you can call this + * to establish defaults and then alter parameters selectively. This + * is the recommended approach since, if we add any new parameters, + * your code will still work (they'll be set to reasonable defaults). + */ + +GLOBAL(void) +jpeg_set_defaults (j_compress_ptr cinfo) +{ + int i; + + /* Safety check to ensure start_compress not called yet. */ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* Allocate comp_info array large enough for maximum component count. + * Array is made permanent in case application wants to compress + * multiple images at same param settings. + */ + if (cinfo->comp_info == NULL) + cinfo->comp_info = (jpeg_component_info *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + MAX_COMPONENTS * SIZEOF(jpeg_component_info)); + + /* Initialize everything not dependent on the color space */ + + cinfo->data_precision = BITS_IN_JSAMPLE; + /* Set up two quantization tables using default quality of 75 */ + jpeg_set_quality(cinfo, 75, TRUE); + /* Set up two Huffman tables */ + std_huff_tables(cinfo); + + /* Initialize default arithmetic coding conditioning */ + for (i = 0; i < NUM_ARITH_TBLS; i++) { + cinfo->arith_dc_L[i] = 0; + cinfo->arith_dc_U[i] = 1; + cinfo->arith_ac_K[i] = 5; + } + + /* Default is no multiple-scan output */ + cinfo->scan_info = NULL; + cinfo->num_scans = 0; + + /* Expect normal source image, not raw downsampled data */ + cinfo->raw_data_in = FALSE; + + /* Use Huffman coding, not arithmetic coding, by default */ + cinfo->arith_code = FALSE; + + /* By default, don't do extra passes to optimize entropy coding */ + cinfo->optimize_coding = FALSE; + /* The standard Huffman tables are only valid for 8-bit data precision. + * If the precision is higher, force optimization on so that usable + * tables will be computed. This test can be removed if default tables + * are supplied that are valid for the desired precision. + */ + if (cinfo->data_precision > 8) + cinfo->optimize_coding = TRUE; + + /* By default, use the simpler non-cosited sampling alignment */ + cinfo->CCIR601_sampling = FALSE; + + /* No input smoothing */ + cinfo->smoothing_factor = 0; + + /* DCT algorithm preference */ + cinfo->dct_method = JDCT_DEFAULT; + + /* No restart markers */ + cinfo->restart_interval = 0; + cinfo->restart_in_rows = 0; + + /* Fill in default JFIF marker parameters. Note that whether the marker + * will actually be written is determined by jpeg_set_colorspace. + * + * By default, the library emits JFIF version code 1.01. + * An application that wants to emit JFIF 1.02 extension markers should set + * JFIF_minor_version to 2. We could probably get away with just defaulting + * to 1.02, but there may still be some decoders in use that will complain + * about that; saying 1.01 should minimize compatibility problems. + */ + cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */ + cinfo->JFIF_minor_version = 1; + cinfo->density_unit = 0; /* Pixel size is unknown by default */ + cinfo->X_density = 1; /* Pixel aspect ratio is square by default */ + cinfo->Y_density = 1; + + /* Choose JPEG colorspace based on input space, set defaults accordingly */ + + jpeg_default_colorspace(cinfo); +} + + +/* + * Select an appropriate JPEG colorspace for in_color_space. + */ + +GLOBAL(void) +jpeg_default_colorspace (j_compress_ptr cinfo) +{ + switch (cinfo->in_color_space) { + case JCS_GRAYSCALE: + jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); + break; + case JCS_RGB: + jpeg_set_colorspace(cinfo, JCS_YCbCr); + break; + case JCS_YCbCr: + jpeg_set_colorspace(cinfo, JCS_YCbCr); + break; + case JCS_CMYK: + jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */ + break; + case JCS_YCCK: + jpeg_set_colorspace(cinfo, JCS_YCCK); + break; + case JCS_UNKNOWN: + jpeg_set_colorspace(cinfo, JCS_UNKNOWN); + break; + default: + ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); + } +} + + +/* + * Set the JPEG colorspace, and choose colorspace-dependent default values. + */ + +GLOBAL(void) +jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) +{ + jpeg_component_info * compptr; + int ci; + +#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl) \ + (compptr = &cinfo->comp_info[index], \ + compptr->component_id = (id), \ + compptr->h_samp_factor = (hsamp), \ + compptr->v_samp_factor = (vsamp), \ + compptr->quant_tbl_no = (quant), \ + compptr->dc_tbl_no = (dctbl), \ + compptr->ac_tbl_no = (actbl) ) + + /* Safety check to ensure start_compress not called yet. */ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* For all colorspaces, we use Q and Huff tables 0 for luminance components, + * tables 1 for chrominance components. + */ + + cinfo->jpeg_color_space = colorspace; + + cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */ + cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */ + + switch (colorspace) { + case JCS_GRAYSCALE: + cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ + cinfo->num_components = 1; + /* JFIF specifies component ID 1 */ + SET_COMP(0, 1, 1,1, 0, 0,0); + break; + case JCS_RGB: + cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */ + cinfo->num_components = 3; + SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0); + SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0); + SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0); + break; + case JCS_YCbCr: + cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ + cinfo->num_components = 3; + /* JFIF specifies component IDs 1,2,3 */ + /* We default to 2x2 subsamples of chrominance */ + SET_COMP(0, 1, 2,2, 0, 0,0); + SET_COMP(1, 2, 1,1, 1, 1,1); + SET_COMP(2, 3, 1,1, 1, 1,1); + break; + case JCS_CMYK: + cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */ + cinfo->num_components = 4; + SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0); + SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0); + SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0); + SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0); + break; + case JCS_YCCK: + cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */ + cinfo->num_components = 4; + SET_COMP(0, 1, 2,2, 0, 0,0); + SET_COMP(1, 2, 1,1, 1, 1,1); + SET_COMP(2, 3, 1,1, 1, 1,1); + SET_COMP(3, 4, 2,2, 0, 0,0); + break; + case JCS_UNKNOWN: + cinfo->num_components = cinfo->input_components; + if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, + MAX_COMPONENTS); + for (ci = 0; ci < cinfo->num_components; ci++) { + SET_COMP(ci, ci, 1,1, 0, 0,0); + } + break; + default: + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + } +} + + +#ifdef C_PROGRESSIVE_SUPPORTED + +LOCAL(jpeg_scan_info *) +fill_a_scan (jpeg_scan_info * scanptr, int ci, + int Ss, int Se, int Ah, int Al) +/* Support routine: generate one scan for specified component */ +{ + scanptr->comps_in_scan = 1; + scanptr->component_index[0] = ci; + scanptr->Ss = Ss; + scanptr->Se = Se; + scanptr->Ah = Ah; + scanptr->Al = Al; + scanptr++; + return scanptr; +} + +LOCAL(jpeg_scan_info *) +fill_scans (jpeg_scan_info * scanptr, int ncomps, + int Ss, int Se, int Ah, int Al) +/* Support routine: generate one scan for each component */ +{ + int ci; + + for (ci = 0; ci < ncomps; ci++) { + scanptr->comps_in_scan = 1; + scanptr->component_index[0] = ci; + scanptr->Ss = Ss; + scanptr->Se = Se; + scanptr->Ah = Ah; + scanptr->Al = Al; + scanptr++; + } + return scanptr; +} + +LOCAL(jpeg_scan_info *) +fill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al) +/* Support routine: generate interleaved DC scan if possible, else N scans */ +{ + int ci; + + if (ncomps <= MAX_COMPS_IN_SCAN) { + /* Single interleaved DC scan */ + scanptr->comps_in_scan = ncomps; + for (ci = 0; ci < ncomps; ci++) + scanptr->component_index[ci] = ci; + scanptr->Ss = scanptr->Se = 0; + scanptr->Ah = Ah; + scanptr->Al = Al; + scanptr++; + } else { + /* Noninterleaved DC scan for each component */ + scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al); + } + return scanptr; +} + + +/* + * Create a recommended progressive-JPEG script. + * cinfo->num_components and cinfo->jpeg_color_space must be correct. + */ + +GLOBAL(void) +jpeg_simple_progression (j_compress_ptr cinfo) +{ + int ncomps = cinfo->num_components; + int nscans; + jpeg_scan_info * scanptr; + + /* Safety check to ensure start_compress not called yet. */ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + /* Figure space needed for script. Calculation must match code below! */ + if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { + /* Custom script for YCbCr color images. */ + nscans = 10; + } else { + /* All-purpose script for other color spaces. */ + if (ncomps > MAX_COMPS_IN_SCAN) + nscans = 6 * ncomps; /* 2 DC + 4 AC scans per component */ + else + nscans = 2 + 4 * ncomps; /* 2 DC scans; 4 AC scans per component */ + } + + /* Allocate space for script. + * We need to put it in the permanent pool in case the application performs + * multiple compressions without changing the settings. To avoid a memory + * leak if jpeg_simple_progression is called repeatedly for the same JPEG + * object, we try to re-use previously allocated space, and we allocate + * enough space to handle YCbCr even if initially asked for grayscale. + */ + if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) { + cinfo->script_space_size = MAX(nscans, 10); + cinfo->script_space = (jpeg_scan_info *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + cinfo->script_space_size * SIZEOF(jpeg_scan_info)); + } + scanptr = cinfo->script_space; + cinfo->scan_info = scanptr; + cinfo->num_scans = nscans; + + if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { + /* Custom script for YCbCr color images. */ + /* Initial DC scan */ + scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); + /* Initial AC scan: get some luma data out in a hurry */ + scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2); + /* Chroma data is too small to be worth expending many scans on */ + scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1); + scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1); + /* Complete spectral selection for luma AC */ + scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2); + /* Refine next bit of luma AC */ + scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1); + /* Finish DC successive approximation */ + scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); + /* Finish AC successive approximation */ + scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0); + scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0); + /* Luma bottom bit comes last since it's usually largest scan */ + scanptr = fill_a_scan(scanptr, 0, 1, 63, 1, 0); + } else { + /* All-purpose script for other color spaces. */ + /* Successive approximation first pass */ + scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); + scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2); + scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2); + /* Successive approximation second pass */ + scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1); + /* Successive approximation final pass */ + scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); + scanptr = fill_scans(scanptr, ncomps, 1, 63, 1, 0); + } +} + +#endif /* C_PROGRESSIVE_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jcphuff.c b/third_party/windows/fltk-1.1.10/jpeg/jcphuff.c new file mode 100644 index 0000000..a4ee850 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jcphuff.c @@ -0,0 +1,833 @@ +/* + * jcphuff.c + * + * Copyright (C) 1995-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains Huffman entropy encoding routines for progressive JPEG. + * + * We do not support output suspension in this module, since the library + * currently does not allow multiple-scan files to be written with output + * suspension. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jchuff.h" /* Declarations shared with jchuff.c */ + +#ifdef C_PROGRESSIVE_SUPPORTED + +/* Expanded entropy encoder object for progressive Huffman encoding. */ + +typedef struct { + struct jpeg_entropy_encoder pub; /* public fields */ + + /* Mode flag: TRUE for optimization, FALSE for actual data output */ + boolean gather_statistics; + + /* Bit-level coding status. + * next_output_byte/free_in_buffer are local copies of cinfo->dest fields. + */ + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + INT32 put_buffer; /* current bit-accumulation buffer */ + int put_bits; /* # of bits now in it */ + j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */ + + /* Coding status for DC components */ + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ + + /* Coding status for AC components */ + int ac_tbl_no; /* the table number of the single component */ + unsigned int EOBRUN; /* run length of EOBs */ + unsigned int BE; /* # of buffered correction bits before MCU */ + char * bit_buffer; /* buffer for correction bits (1 per char) */ + /* packing correction bits tightly would save some space but cost time... */ + + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + int next_restart_num; /* next restart number to write (0-7) */ + + /* Pointers to derived tables (these workspaces have image lifespan). + * Since any one scan codes only DC or only AC, we only need one set + * of tables, not one for DC and one for AC. + */ + c_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; + + /* Statistics tables for optimization; again, one set is enough */ + long * count_ptrs[NUM_HUFF_TBLS]; +} phuff_entropy_encoder; + +typedef phuff_entropy_encoder * phuff_entropy_ptr; + +/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit + * buffer can hold. Larger sizes may slightly improve compression, but + * 1000 is already well into the realm of overkill. + * The minimum safe size is 64 bits. + */ + +#define MAX_CORR_BITS 1000 /* Max # of correction bits I can buffer */ + +/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32. + * We assume that int right shift is unsigned if INT32 right shift is, + * which should be safe. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define ISHIFT_TEMPS int ishift_temp; +#define IRIGHT_SHIFT(x,shft) \ + ((ishift_temp = (x)) < 0 ? \ + (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \ + (ishift_temp >> (shft))) +#else +#define ISHIFT_TEMPS +#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + +/* Forward declarations */ +METHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo, + JBLOCKROW *MCU_data)); +METHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo, + JBLOCKROW *MCU_data)); +METHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo, + JBLOCKROW *MCU_data)); +METHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo, + JBLOCKROW *MCU_data)); +METHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo)); +METHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo)); + + +/* + * Initialize for a Huffman-compressed scan using progressive JPEG. + */ + +METHODDEF(void) +start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + boolean is_DC_band; + int ci, tbl; + jpeg_component_info * compptr; + + entropy->cinfo = cinfo; + entropy->gather_statistics = gather_statistics; + + is_DC_band = (cinfo->Ss == 0); + + /* We assume jcmaster.c already validated the scan parameters. */ + + /* Select execution routines */ + if (cinfo->Ah == 0) { + if (is_DC_band) + entropy->pub.encode_mcu = encode_mcu_DC_first; + else + entropy->pub.encode_mcu = encode_mcu_AC_first; + } else { + if (is_DC_band) + entropy->pub.encode_mcu = encode_mcu_DC_refine; + else { + entropy->pub.encode_mcu = encode_mcu_AC_refine; + /* AC refinement needs a correction bit buffer */ + if (entropy->bit_buffer == NULL) + entropy->bit_buffer = (char *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + MAX_CORR_BITS * SIZEOF(char)); + } + } + if (gather_statistics) + entropy->pub.finish_pass = finish_pass_gather_phuff; + else + entropy->pub.finish_pass = finish_pass_phuff; + + /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1 + * for AC coefficients. + */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Initialize DC predictions to 0 */ + entropy->last_dc_val[ci] = 0; + /* Get table index */ + if (is_DC_band) { + if (cinfo->Ah != 0) /* DC refinement needs no table */ + continue; + tbl = compptr->dc_tbl_no; + } else { + entropy->ac_tbl_no = tbl = compptr->ac_tbl_no; + } + if (gather_statistics) { + /* Check for invalid table index */ + /* (make_c_derived_tbl does this in the other path) */ + if (tbl < 0 || tbl >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl); + /* Allocate and zero the statistics tables */ + /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ + if (entropy->count_ptrs[tbl] == NULL) + entropy->count_ptrs[tbl] = (long *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 257 * SIZEOF(long)); + MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long)); + } else { + /* Compute derived values for Huffman table */ + /* We may do this more than once for a table, but it's not expensive */ + jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl, + & entropy->derived_tbls[tbl]); + } + } + + /* Initialize AC stuff */ + entropy->EOBRUN = 0; + entropy->BE = 0; + + /* Initialize bit buffer to empty */ + entropy->put_buffer = 0; + entropy->put_bits = 0; + + /* Initialize restart stuff */ + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num = 0; +} + + +/* Outputting bytes to the file. + * NB: these must be called only when actually outputting, + * that is, entropy->gather_statistics == FALSE. + */ + +/* Emit a byte */ +#define emit_byte(entropy,val) \ + { *(entropy)->next_output_byte++ = (JOCTET) (val); \ + if (--(entropy)->free_in_buffer == 0) \ + dump_buffer(entropy); } + + +LOCAL(void) +dump_buffer (phuff_entropy_ptr entropy) +/* Empty the output buffer; we do not support suspension in this module. */ +{ + struct jpeg_destination_mgr * dest = entropy->cinfo->dest; + + if (! (*dest->empty_output_buffer) (entropy->cinfo)) + ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND); + /* After a successful buffer dump, must reset buffer pointers */ + entropy->next_output_byte = dest->next_output_byte; + entropy->free_in_buffer = dest->free_in_buffer; +} + + +/* Outputting bits to the file */ + +/* Only the right 24 bits of put_buffer are used; the valid bits are + * left-justified in this part. At most 16 bits can be passed to emit_bits + * in one call, and we never retain more than 7 bits in put_buffer + * between calls, so 24 bits are sufficient. + */ + +INLINE +LOCAL(void) +emit_bits (phuff_entropy_ptr entropy, unsigned int code, int size) +/* Emit some bits, unless we are in gather mode */ +{ + /* This routine is heavily used, so it's worth coding tightly. */ + register INT32 put_buffer = (INT32) code; + register int put_bits = entropy->put_bits; + + /* if size is 0, caller used an invalid Huffman table entry */ + if (size == 0) + ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); + + if (entropy->gather_statistics) + return; /* do nothing if we're only getting stats */ + + put_buffer &= (((INT32) 1)<put_buffer; /* and merge with old buffer contents */ + + while (put_bits >= 8) { + int c = (int) ((put_buffer >> 16) & 0xFF); + + emit_byte(entropy, c); + if (c == 0xFF) { /* need to stuff a zero byte? */ + emit_byte(entropy, 0); + } + put_buffer <<= 8; + put_bits -= 8; + } + + entropy->put_buffer = put_buffer; /* update variables */ + entropy->put_bits = put_bits; +} + + +LOCAL(void) +flush_bits (phuff_entropy_ptr entropy) +{ + emit_bits(entropy, 0x7F, 7); /* fill any partial byte with ones */ + entropy->put_buffer = 0; /* and reset bit-buffer to empty */ + entropy->put_bits = 0; +} + + +/* + * Emit (or just count) a Huffman symbol. + */ + +INLINE +LOCAL(void) +emit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol) +{ + if (entropy->gather_statistics) + entropy->count_ptrs[tbl_no][symbol]++; + else { + c_derived_tbl * tbl = entropy->derived_tbls[tbl_no]; + emit_bits(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); + } +} + + +/* + * Emit bits from a correction bit buffer. + */ + +LOCAL(void) +emit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart, + unsigned int nbits) +{ + if (entropy->gather_statistics) + return; /* no real work */ + + while (nbits > 0) { + emit_bits(entropy, (unsigned int) (*bufstart), 1); + bufstart++; + nbits--; + } +} + + +/* + * Emit any pending EOBRUN symbol. + */ + +LOCAL(void) +emit_eobrun (phuff_entropy_ptr entropy) +{ + register int temp, nbits; + + if (entropy->EOBRUN > 0) { /* if there is any pending EOBRUN */ + temp = entropy->EOBRUN; + nbits = 0; + while ((temp >>= 1)) + nbits++; + /* safety check: shouldn't happen given limited correction-bit buffer */ + if (nbits > 14) + ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); + + emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4); + if (nbits) + emit_bits(entropy, entropy->EOBRUN, nbits); + + entropy->EOBRUN = 0; + + /* Emit any buffered correction bits */ + emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE); + entropy->BE = 0; + } +} + + +/* + * Emit a restart marker & resynchronize predictions. + */ + +LOCAL(void) +emit_restart (phuff_entropy_ptr entropy, int restart_num) +{ + int ci; + + emit_eobrun(entropy); + + if (! entropy->gather_statistics) { + flush_bits(entropy); + emit_byte(entropy, 0xFF); + emit_byte(entropy, JPEG_RST0 + restart_num); + } + + if (entropy->cinfo->Ss == 0) { + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++) + entropy->last_dc_val[ci] = 0; + } else { + /* Re-initialize all AC-related fields to 0 */ + entropy->EOBRUN = 0; + entropy->BE = 0; + } +} + + +/* + * MCU encoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + register int temp, temp2; + register int nbits; + int blkn, ci; + int Al = cinfo->Al; + JBLOCKROW block; + jpeg_component_info * compptr; + ISHIFT_TEMPS + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart(entropy, entropy->next_restart_num); + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + + /* Compute the DC value after the required point transform by Al. + * This is simply an arithmetic right shift. + */ + temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al); + + /* DC differences are figured on the point-transformed values. */ + temp = temp2 - entropy->last_dc_val[ci]; + entropy->last_dc_val[ci] = temp2; + + /* Encode the DC coefficient difference per section G.1.2.1 */ + temp2 = temp; + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + /* For a negative input, want temp2 = bitwise complement of abs(input) */ + /* This code assumes we are on a two's complement machine */ + temp2--; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 0; + while (temp) { + nbits++; + temp >>= 1; + } + /* Check for out-of-range coefficient values. + * Since we're encoding a difference, the range limit is twice as much. + */ + if (nbits > MAX_COEF_BITS+1) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count/emit the Huffman-coded symbol for the number of bits */ + emit_symbol(entropy, compptr->dc_tbl_no, nbits); + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + if (nbits) /* emit_bits rejects calls with size 0 */ + emit_bits(entropy, (unsigned int) temp2, nbits); + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * MCU encoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + register int temp, temp2; + register int nbits; + register int r, k; + int Se = cinfo->Se; + int Al = cinfo->Al; + JBLOCKROW block; + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart(entropy, entropy->next_restart_num); + + /* Encode the MCU data block */ + block = MCU_data[0]; + + /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */ + + r = 0; /* r = run length of zeros */ + + for (k = cinfo->Ss; k <= Se; k++) { + if ((temp = (*block)[jpeg_natural_order[k]]) == 0) { + r++; + continue; + } + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value; so the code is + * interwoven with finding the abs value (temp) and output bits (temp2). + */ + if (temp < 0) { + temp = -temp; /* temp is abs value of input */ + temp >>= Al; /* apply the point transform */ + /* For a negative coef, want temp2 = bitwise complement of abs(coef) */ + temp2 = ~temp; + } else { + temp >>= Al; /* apply the point transform */ + temp2 = temp; + } + /* Watch out for case that nonzero coef is zero after point transform */ + if (temp == 0) { + r++; + continue; + } + + /* Emit any pending EOBRUN */ + if (entropy->EOBRUN > 0) + emit_eobrun(entropy); + /* if run length > 15, must emit special run-length-16 codes (0xF0) */ + while (r > 15) { + emit_symbol(entropy, entropy->ac_tbl_no, 0xF0); + r -= 16; + } + + /* Find the number of bits needed for the magnitude of the coefficient */ + nbits = 1; /* there must be at least one 1 bit */ + while ((temp >>= 1)) + nbits++; + /* Check for out-of-range coefficient values */ + if (nbits > MAX_COEF_BITS) + ERREXIT(cinfo, JERR_BAD_DCT_COEF); + + /* Count/emit Huffman symbol for run length / number of bits */ + emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits); + + /* Emit that number of bits of the value, if positive, */ + /* or the complement of its magnitude, if negative. */ + emit_bits(entropy, (unsigned int) temp2, nbits); + + r = 0; /* reset zero run length */ + } + + if (r > 0) { /* If there are trailing zeroes, */ + entropy->EOBRUN++; /* count an EOB */ + if (entropy->EOBRUN == 0x7FFF) + emit_eobrun(entropy); /* force it out to avoid overflow */ + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * MCU encoding for DC successive approximation refinement scan. + * Note: we assume such scans can be multi-component, although the spec + * is not very clear on the point. + */ + +METHODDEF(boolean) +encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + register int temp; + int blkn; + int Al = cinfo->Al; + JBLOCKROW block; + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart(entropy, entropy->next_restart_num); + + /* Encode the MCU data blocks */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + + /* We simply emit the Al'th bit of the DC coefficient value. */ + temp = (*block)[0]; + emit_bits(entropy, (unsigned int) (temp >> Al), 1); + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * MCU encoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + register int temp; + register int r, k; + int EOB; + char *BR_buffer; + unsigned int BR; + int Se = cinfo->Se; + int Al = cinfo->Al; + JBLOCKROW block; + int absvalues[DCTSIZE2]; + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Emit restart marker if needed */ + if (cinfo->restart_interval) + if (entropy->restarts_to_go == 0) + emit_restart(entropy, entropy->next_restart_num); + + /* Encode the MCU data block */ + block = MCU_data[0]; + + /* It is convenient to make a pre-pass to determine the transformed + * coefficients' absolute values and the EOB position. + */ + EOB = 0; + for (k = cinfo->Ss; k <= Se; k++) { + temp = (*block)[jpeg_natural_order[k]]; + /* We must apply the point transform by Al. For AC coefficients this + * is an integer division with rounding towards 0. To do this portably + * in C, we shift after obtaining the absolute value. + */ + if (temp < 0) + temp = -temp; /* temp is abs value of input */ + temp >>= Al; /* apply the point transform */ + absvalues[k] = temp; /* save abs value for main pass */ + if (temp == 1) + EOB = k; /* EOB = index of last newly-nonzero coef */ + } + + /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */ + + r = 0; /* r = run length of zeros */ + BR = 0; /* BR = count of buffered bits added now */ + BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */ + + for (k = cinfo->Ss; k <= Se; k++) { + if ((temp = absvalues[k]) == 0) { + r++; + continue; + } + + /* Emit any required ZRLs, but not if they can be folded into EOB */ + while (r > 15 && k <= EOB) { + /* emit any pending EOBRUN and the BE correction bits */ + emit_eobrun(entropy); + /* Emit ZRL */ + emit_symbol(entropy, entropy->ac_tbl_no, 0xF0); + r -= 16; + /* Emit buffered correction bits that must be associated with ZRL */ + emit_buffered_bits(entropy, BR_buffer, BR); + BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ + BR = 0; + } + + /* If the coef was previously nonzero, it only needs a correction bit. + * NOTE: a straight translation of the spec's figure G.7 would suggest + * that we also need to test r > 15. But if r > 15, we can only get here + * if k > EOB, which implies that this coefficient is not 1. + */ + if (temp > 1) { + /* The correction bit is the next bit of the absolute value. */ + BR_buffer[BR++] = (char) (temp & 1); + continue; + } + + /* Emit any pending EOBRUN and the BE correction bits */ + emit_eobrun(entropy); + + /* Count/emit Huffman symbol for run length / number of bits */ + emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1); + + /* Emit output bit for newly-nonzero coef */ + temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1; + emit_bits(entropy, (unsigned int) temp, 1); + + /* Emit buffered correction bits that must be associated with this code */ + emit_buffered_bits(entropy, BR_buffer, BR); + BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ + BR = 0; + r = 0; /* reset zero run length */ + } + + if (r > 0 || BR > 0) { /* If there are trailing zeroes, */ + entropy->EOBRUN++; /* count an EOB */ + entropy->BE += BR; /* concat my correction bits to older ones */ + /* We force out the EOB if we risk either: + * 1. overflow of the EOB counter; + * 2. overflow of the correction bit buffer during the next MCU. + */ + if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1)) + emit_eobrun(entropy); + } + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; + + /* Update restart-interval state too */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) { + entropy->restarts_to_go = cinfo->restart_interval; + entropy->next_restart_num++; + entropy->next_restart_num &= 7; + } + entropy->restarts_to_go--; + } + + return TRUE; +} + + +/* + * Finish up at the end of a Huffman-compressed progressive scan. + */ + +METHODDEF(void) +finish_pass_phuff (j_compress_ptr cinfo) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + + entropy->next_output_byte = cinfo->dest->next_output_byte; + entropy->free_in_buffer = cinfo->dest->free_in_buffer; + + /* Flush out any buffered data */ + emit_eobrun(entropy); + flush_bits(entropy); + + cinfo->dest->next_output_byte = entropy->next_output_byte; + cinfo->dest->free_in_buffer = entropy->free_in_buffer; +} + + +/* + * Finish up a statistics-gathering pass and create the new Huffman tables. + */ + +METHODDEF(void) +finish_pass_gather_phuff (j_compress_ptr cinfo) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + boolean is_DC_band; + int ci, tbl; + jpeg_component_info * compptr; + JHUFF_TBL **htblptr; + boolean did[NUM_HUFF_TBLS]; + + /* Flush out buffered data (all we care about is counting the EOB symbol) */ + emit_eobrun(entropy); + + is_DC_band = (cinfo->Ss == 0); + + /* It's important not to apply jpeg_gen_optimal_table more than once + * per table, because it clobbers the input frequency counts! + */ + MEMZERO(did, SIZEOF(did)); + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + if (is_DC_band) { + if (cinfo->Ah != 0) /* DC refinement needs no table */ + continue; + tbl = compptr->dc_tbl_no; + } else { + tbl = compptr->ac_tbl_no; + } + if (! did[tbl]) { + if (is_DC_band) + htblptr = & cinfo->dc_huff_tbl_ptrs[tbl]; + else + htblptr = & cinfo->ac_huff_tbl_ptrs[tbl]; + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]); + did[tbl] = TRUE; + } + } +} + + +/* + * Module initialization routine for progressive Huffman entropy encoding. + */ + +GLOBAL(void) +jinit_phuff_encoder (j_compress_ptr cinfo) +{ + phuff_entropy_ptr entropy; + int i; + + entropy = (phuff_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(phuff_entropy_encoder)); + cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; + entropy->pub.start_pass = start_pass_phuff; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->derived_tbls[i] = NULL; + entropy->count_ptrs[i] = NULL; + } + entropy->bit_buffer = NULL; /* needed only in AC refinement scan */ +} + +#endif /* C_PROGRESSIVE_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jcprepct.c b/third_party/windows/fltk-1.1.10/jpeg/jcprepct.c new file mode 100644 index 0000000..fdc4bc2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jcprepct.c @@ -0,0 +1,354 @@ +/* + * jcprepct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the compression preprocessing controller. + * This controller manages the color conversion, downsampling, + * and edge expansion steps. + * + * Most of the complexity here is associated with buffering input rows + * as required by the downsampler. See the comments at the head of + * jcsample.c for the downsampler's needs. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* At present, jcsample.c can request context rows only for smoothing. + * In the future, we might also need context rows for CCIR601 sampling + * or other more-complex downsampling procedures. The code to support + * context rows should be compiled only if needed. + */ +#ifdef INPUT_SMOOTHING_SUPPORTED +#define CONTEXT_ROWS_SUPPORTED +#endif + + +/* + * For the simple (no-context-row) case, we just need to buffer one + * row group's worth of pixels for the downsampling step. At the bottom of + * the image, we pad to a full row group by replicating the last pixel row. + * The downsampler's last output row is then replicated if needed to pad + * out to a full iMCU row. + * + * When providing context rows, we must buffer three row groups' worth of + * pixels. Three row groups are physically allocated, but the row pointer + * arrays are made five row groups high, with the extra pointers above and + * below "wrapping around" to point to the last and first real row groups. + * This allows the downsampler to access the proper context rows. + * At the top and bottom of the image, we create dummy context rows by + * copying the first or last real pixel row. This copying could be avoided + * by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the + * trouble on the compression side. + */ + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_c_prep_controller pub; /* public fields */ + + /* Downsampling input buffer. This buffer holds color-converted data + * until we have enough to do a downsample step. + */ + JSAMPARRAY color_buf[MAX_COMPONENTS]; + + JDIMENSION rows_to_go; /* counts rows remaining in source image */ + int next_buf_row; /* index of next row to store in color_buf */ + +#ifdef CONTEXT_ROWS_SUPPORTED /* only needed for context case */ + int this_row_group; /* starting row index of group to process */ + int next_buf_stop; /* downsample when we reach this index */ +#endif +} my_prep_controller; + +typedef my_prep_controller * my_prep_ptr; + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_prep (j_compress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_prep_ptr prep = (my_prep_ptr) cinfo->prep; + + if (pass_mode != JBUF_PASS_THRU) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + + /* Initialize total-height counter for detecting bottom of image */ + prep->rows_to_go = cinfo->image_height; + /* Mark the conversion buffer empty */ + prep->next_buf_row = 0; +#ifdef CONTEXT_ROWS_SUPPORTED + /* Preset additional state variables for context mode. + * These aren't used in non-context mode, so we needn't test which mode. + */ + prep->this_row_group = 0; + /* Set next_buf_stop to stop after two row groups have been read in. */ + prep->next_buf_stop = 2 * cinfo->max_v_samp_factor; +#endif +} + + +/* + * Expand an image vertically from height input_rows to height output_rows, + * by duplicating the bottom row. + */ + +LOCAL(void) +expand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols, + int input_rows, int output_rows) +{ + register int row; + + for (row = input_rows; row < output_rows; row++) { + jcopy_sample_rows(image_data, input_rows-1, image_data, row, + 1, num_cols); + } +} + + +/* + * Process some data in the simple no-context case. + * + * Preprocessor output data is counted in "row groups". A row group + * is defined to be v_samp_factor sample rows of each component. + * Downsampling will produce this much data from each max_v_samp_factor + * input rows. + */ + +METHODDEF(void) +pre_process_data (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail, + JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr, + JDIMENSION out_row_groups_avail) +{ + my_prep_ptr prep = (my_prep_ptr) cinfo->prep; + int numrows, ci; + JDIMENSION inrows; + jpeg_component_info * compptr; + + while (*in_row_ctr < in_rows_avail && + *out_row_group_ctr < out_row_groups_avail) { + /* Do color conversion to fill the conversion buffer. */ + inrows = in_rows_avail - *in_row_ctr; + numrows = cinfo->max_v_samp_factor - prep->next_buf_row; + numrows = (int) MIN((JDIMENSION) numrows, inrows); + (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr, + prep->color_buf, + (JDIMENSION) prep->next_buf_row, + numrows); + *in_row_ctr += numrows; + prep->next_buf_row += numrows; + prep->rows_to_go -= numrows; + /* If at bottom of image, pad to fill the conversion buffer. */ + if (prep->rows_to_go == 0 && + prep->next_buf_row < cinfo->max_v_samp_factor) { + for (ci = 0; ci < cinfo->num_components; ci++) { + expand_bottom_edge(prep->color_buf[ci], cinfo->image_width, + prep->next_buf_row, cinfo->max_v_samp_factor); + } + prep->next_buf_row = cinfo->max_v_samp_factor; + } + /* If we've filled the conversion buffer, empty it. */ + if (prep->next_buf_row == cinfo->max_v_samp_factor) { + (*cinfo->downsample->downsample) (cinfo, + prep->color_buf, (JDIMENSION) 0, + output_buf, *out_row_group_ctr); + prep->next_buf_row = 0; + (*out_row_group_ctr)++; + } + /* If at bottom of image, pad the output to a full iMCU height. + * Note we assume the caller is providing a one-iMCU-height output buffer! + */ + if (prep->rows_to_go == 0 && + *out_row_group_ctr < out_row_groups_avail) { + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + expand_bottom_edge(output_buf[ci], + compptr->width_in_blocks * DCTSIZE, + (int) (*out_row_group_ctr * compptr->v_samp_factor), + (int) (out_row_groups_avail * compptr->v_samp_factor)); + } + *out_row_group_ctr = out_row_groups_avail; + break; /* can exit outer loop without test */ + } + } +} + + +#ifdef CONTEXT_ROWS_SUPPORTED + +/* + * Process some data in the context case. + */ + +METHODDEF(void) +pre_process_context (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail, + JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr, + JDIMENSION out_row_groups_avail) +{ + my_prep_ptr prep = (my_prep_ptr) cinfo->prep; + int numrows, ci; + int buf_height = cinfo->max_v_samp_factor * 3; + JDIMENSION inrows; + + while (*out_row_group_ctr < out_row_groups_avail) { + if (*in_row_ctr < in_rows_avail) { + /* Do color conversion to fill the conversion buffer. */ + inrows = in_rows_avail - *in_row_ctr; + numrows = prep->next_buf_stop - prep->next_buf_row; + numrows = (int) MIN((JDIMENSION) numrows, inrows); + (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr, + prep->color_buf, + (JDIMENSION) prep->next_buf_row, + numrows); + /* Pad at top of image, if first time through */ + if (prep->rows_to_go == cinfo->image_height) { + for (ci = 0; ci < cinfo->num_components; ci++) { + int row; + for (row = 1; row <= cinfo->max_v_samp_factor; row++) { + jcopy_sample_rows(prep->color_buf[ci], 0, + prep->color_buf[ci], -row, + 1, cinfo->image_width); + } + } + } + *in_row_ctr += numrows; + prep->next_buf_row += numrows; + prep->rows_to_go -= numrows; + } else { + /* Return for more data, unless we are at the bottom of the image. */ + if (prep->rows_to_go != 0) + break; + /* When at bottom of image, pad to fill the conversion buffer. */ + if (prep->next_buf_row < prep->next_buf_stop) { + for (ci = 0; ci < cinfo->num_components; ci++) { + expand_bottom_edge(prep->color_buf[ci], cinfo->image_width, + prep->next_buf_row, prep->next_buf_stop); + } + prep->next_buf_row = prep->next_buf_stop; + } + } + /* If we've gotten enough data, downsample a row group. */ + if (prep->next_buf_row == prep->next_buf_stop) { + (*cinfo->downsample->downsample) (cinfo, + prep->color_buf, + (JDIMENSION) prep->this_row_group, + output_buf, *out_row_group_ctr); + (*out_row_group_ctr)++; + /* Advance pointers with wraparound as necessary. */ + prep->this_row_group += cinfo->max_v_samp_factor; + if (prep->this_row_group >= buf_height) + prep->this_row_group = 0; + if (prep->next_buf_row >= buf_height) + prep->next_buf_row = 0; + prep->next_buf_stop = prep->next_buf_row + cinfo->max_v_samp_factor; + } + } +} + + +/* + * Create the wrapped-around downsampling input buffer needed for context mode. + */ + +LOCAL(void) +create_context_buffer (j_compress_ptr cinfo) +{ + my_prep_ptr prep = (my_prep_ptr) cinfo->prep; + int rgroup_height = cinfo->max_v_samp_factor; + int ci, i; + jpeg_component_info * compptr; + JSAMPARRAY true_buffer, fake_buffer; + + /* Grab enough space for fake row pointers for all the components; + * we need five row groups' worth of pointers for each component. + */ + fake_buffer = (JSAMPARRAY) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (cinfo->num_components * 5 * rgroup_height) * + SIZEOF(JSAMPROW)); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Allocate the actual buffer space (3 row groups) for this component. + * We make the buffer wide enough to allow the downsampler to edge-expand + * horizontally within the buffer, if it so chooses. + */ + true_buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE * + cinfo->max_h_samp_factor) / compptr->h_samp_factor), + (JDIMENSION) (3 * rgroup_height)); + /* Copy true buffer row pointers into the middle of the fake row array */ + MEMCOPY(fake_buffer + rgroup_height, true_buffer, + 3 * rgroup_height * SIZEOF(JSAMPROW)); + /* Fill in the above and below wraparound pointers */ + for (i = 0; i < rgroup_height; i++) { + fake_buffer[i] = true_buffer[2 * rgroup_height + i]; + fake_buffer[4 * rgroup_height + i] = true_buffer[i]; + } + prep->color_buf[ci] = fake_buffer + rgroup_height; + fake_buffer += 5 * rgroup_height; /* point to space for next component */ + } +} + +#endif /* CONTEXT_ROWS_SUPPORTED */ + + +/* + * Initialize preprocessing controller. + */ + +GLOBAL(void) +jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer) +{ + my_prep_ptr prep; + int ci; + jpeg_component_info * compptr; + + if (need_full_buffer) /* safety check */ + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + + prep = (my_prep_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_prep_controller)); + cinfo->prep = (struct jpeg_c_prep_controller *) prep; + prep->pub.start_pass = start_pass_prep; + + /* Allocate the color conversion buffer. + * We make the buffer wide enough to allow the downsampler to edge-expand + * horizontally within the buffer, if it so chooses. + */ + if (cinfo->downsample->need_context_rows) { + /* Set up to provide context rows */ +#ifdef CONTEXT_ROWS_SUPPORTED + prep->pub.pre_process_data = pre_process_context; + create_context_buffer(cinfo); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + /* No context, just make it tall enough for one row group */ + prep->pub.pre_process_data = pre_process_data; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + prep->color_buf[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE * + cinfo->max_h_samp_factor) / compptr->h_samp_factor), + (JDIMENSION) cinfo->max_v_samp_factor); + } + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jcsample.c b/third_party/windows/fltk-1.1.10/jpeg/jcsample.c new file mode 100644 index 0000000..fe29fca --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jcsample.c @@ -0,0 +1,519 @@ +/* + * jcsample.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains downsampling routines. + * + * Downsampling input data is counted in "row groups". A row group + * is defined to be max_v_samp_factor pixel rows of each component, + * from which the downsampler produces v_samp_factor sample rows. + * A single row group is processed in each call to the downsampler module. + * + * The downsampler is responsible for edge-expansion of its output data + * to fill an integral number of DCT blocks horizontally. The source buffer + * may be modified if it is helpful for this purpose (the source buffer is + * allocated wide enough to correspond to the desired output width). + * The caller (the prep controller) is responsible for vertical padding. + * + * The downsampler may request "context rows" by setting need_context_rows + * during startup. In this case, the input arrays will contain at least + * one row group's worth of pixels above and below the passed-in data; + * the caller will create dummy rows at image top and bottom by replicating + * the first or last real pixel row. + * + * An excellent reference for image resampling is + * Digital Image Warping, George Wolberg, 1990. + * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7. + * + * The downsampling algorithm used here is a simple average of the source + * pixels covered by the output pixel. The hi-falutin sampling literature + * refers to this as a "box filter". In general the characteristics of a box + * filter are not very good, but for the specific cases we normally use (1:1 + * and 2:1 ratios) the box is equivalent to a "triangle filter" which is not + * nearly so bad. If you intend to use other sampling ratios, you'd be well + * advised to improve this code. + * + * A simple input-smoothing capability is provided. This is mainly intended + * for cleaning up color-dithered GIF input files (if you find it inadequate, + * we suggest using an external filtering program such as pnmconvol). When + * enabled, each input pixel P is replaced by a weighted sum of itself and its + * eight neighbors. P's weight is 1-8*SF and each neighbor's weight is SF, + * where SF = (smoothing_factor / 1024). + * Currently, smoothing is only supported for 2h2v sampling factors. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Pointer to routine to downsample a single component */ +typedef JMETHOD(void, downsample1_ptr, + (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data)); + +/* Private subobject */ + +typedef struct { + struct jpeg_downsampler pub; /* public fields */ + + /* Downsampling method pointers, one per component */ + downsample1_ptr methods[MAX_COMPONENTS]; +} my_downsampler; + +typedef my_downsampler * my_downsample_ptr; + + +/* + * Initialize for a downsampling pass. + */ + +METHODDEF(void) +start_pass_downsample (j_compress_ptr cinfo) +{ + /* no work for now */ +} + + +/* + * Expand a component horizontally from width input_cols to width output_cols, + * by duplicating the rightmost samples. + */ + +LOCAL(void) +expand_right_edge (JSAMPARRAY image_data, int num_rows, + JDIMENSION input_cols, JDIMENSION output_cols) +{ + register JSAMPROW ptr; + register JSAMPLE pixval; + register int count; + int row; + int numcols = (int) (output_cols - input_cols); + + if (numcols > 0) { + for (row = 0; row < num_rows; row++) { + ptr = image_data[row] + input_cols; + pixval = ptr[-1]; /* don't need GETJSAMPLE() here */ + for (count = numcols; count > 0; count--) + *ptr++ = pixval; + } + } +} + + +/* + * Do downsampling for a whole row group (all components). + * + * In this version we simply downsample each component independently. + */ + +METHODDEF(void) +sep_downsample (j_compress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_index, + JSAMPIMAGE output_buf, JDIMENSION out_row_group_index) +{ + my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample; + int ci; + jpeg_component_info * compptr; + JSAMPARRAY in_ptr, out_ptr; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + in_ptr = input_buf[ci] + in_row_index; + out_ptr = output_buf[ci] + (out_row_group_index * compptr->v_samp_factor); + (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr); + } +} + + +/* + * Downsample pixel values of a single component. + * One row group is processed per call. + * This version handles arbitrary integral sampling ratios, without smoothing. + * Note that this version is not actually used for customary sampling ratios. + */ + +METHODDEF(void) +int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v; + JDIMENSION outcol, outcol_h; /* outcol_h == outcol*h_expand */ + JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; + JSAMPROW inptr, outptr; + INT32 outvalue; + + h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor; + v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor; + numpix = h_expand * v_expand; + numpix2 = numpix/2; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data, cinfo->max_v_samp_factor, + cinfo->image_width, output_cols * h_expand); + + inrow = 0; + for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { + outptr = output_data[outrow]; + for (outcol = 0, outcol_h = 0; outcol < output_cols; + outcol++, outcol_h += h_expand) { + outvalue = 0; + for (v = 0; v < v_expand; v++) { + inptr = input_data[inrow+v] + outcol_h; + for (h = 0; h < h_expand; h++) { + outvalue += (INT32) GETJSAMPLE(*inptr++); + } + } + *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix); + } + inrow += v_expand; + } +} + + +/* + * Downsample pixel values of a single component. + * This version handles the special case of a full-size component, + * without smoothing. + */ + +METHODDEF(void) +fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + /* Copy the data */ + jcopy_sample_rows(input_data, 0, output_data, 0, + cinfo->max_v_samp_factor, cinfo->image_width); + /* Edge-expand */ + expand_right_edge(output_data, cinfo->max_v_samp_factor, + cinfo->image_width, compptr->width_in_blocks * DCTSIZE); +} + + +/* + * Downsample pixel values of a single component. + * This version handles the common case of 2:1 horizontal and 1:1 vertical, + * without smoothing. + * + * A note about the "bias" calculations: when rounding fractional values to + * integer, we do not want to always round 0.5 up to the next integer. + * If we did that, we'd introduce a noticeable bias towards larger values. + * Instead, this code is arranged so that 0.5 will be rounded up or down at + * alternate pixel locations (a simple ordered dither pattern). + */ + +METHODDEF(void) +h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + int outrow; + JDIMENSION outcol; + JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; + register JSAMPROW inptr, outptr; + register int bias; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data, cinfo->max_v_samp_factor, + cinfo->image_width, output_cols * 2); + + for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { + outptr = output_data[outrow]; + inptr = input_data[outrow]; + bias = 0; /* bias = 0,1,0,1,... for successive samples */ + for (outcol = 0; outcol < output_cols; outcol++) { + *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1]) + + bias) >> 1); + bias ^= 1; /* 0=>1, 1=>0 */ + inptr += 2; + } + } +} + + +/* + * Downsample pixel values of a single component. + * This version handles the standard case of 2:1 horizontal and 2:1 vertical, + * without smoothing. + */ + +METHODDEF(void) +h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + int inrow, outrow; + JDIMENSION outcol; + JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; + register JSAMPROW inptr0, inptr1, outptr; + register int bias; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data, cinfo->max_v_samp_factor, + cinfo->image_width, output_cols * 2); + + inrow = 0; + for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { + outptr = output_data[outrow]; + inptr0 = input_data[inrow]; + inptr1 = input_data[inrow+1]; + bias = 1; /* bias = 1,2,1,2,... for successive samples */ + for (outcol = 0; outcol < output_cols; outcol++) { + *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]) + + bias) >> 2); + bias ^= 3; /* 1=>2, 2=>1 */ + inptr0 += 2; inptr1 += 2; + } + inrow += 2; + } +} + + +#ifdef INPUT_SMOOTHING_SUPPORTED + +/* + * Downsample pixel values of a single component. + * This version handles the standard case of 2:1 horizontal and 2:1 vertical, + * with smoothing. One row of context is required. + */ + +METHODDEF(void) +h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + int inrow, outrow; + JDIMENSION colctr; + JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; + register JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr; + INT32 membersum, neighsum, memberscale, neighscale; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2, + cinfo->image_width, output_cols * 2); + + /* We don't bother to form the individual "smoothed" input pixel values; + * we can directly compute the output which is the average of the four + * smoothed values. Each of the four member pixels contributes a fraction + * (1-8*SF) to its own smoothed image and a fraction SF to each of the three + * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final + * output. The four corner-adjacent neighbor pixels contribute a fraction + * SF to just one smoothed pixel, or SF/4 to the final output; while the + * eight edge-adjacent neighbors contribute SF to each of two smoothed + * pixels, or SF/2 overall. In order to use integer arithmetic, these + * factors are scaled by 2^16 = 65536. + * Also recall that SF = smoothing_factor / 1024. + */ + + memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */ + neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */ + + inrow = 0; + for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { + outptr = output_data[outrow]; + inptr0 = input_data[inrow]; + inptr1 = input_data[inrow+1]; + above_ptr = input_data[inrow-1]; + below_ptr = input_data[inrow+2]; + + /* Special case for first column: pretend column -1 is same as column 0 */ + membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); + neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + + GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]); + neighsum += neighsum; + neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]); + membersum = membersum * memberscale + neighsum * neighscale; + *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); + inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2; + + for (colctr = output_cols - 2; colctr > 0; colctr--) { + /* sum of pixels directly mapped to this output element */ + membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); + /* sum of edge-neighbor pixels */ + neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + + GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) + + GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]); + /* The edge-neighbors count twice as much as corner-neighbors */ + neighsum += neighsum; + /* Add in the corner-neighbors */ + neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) + + GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]); + /* form final output scaled up by 2^16 */ + membersum = membersum * memberscale + neighsum * neighscale; + /* round, descale and output it */ + *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); + inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2; + } + + /* Special case for last column */ + membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); + neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + + GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) + + GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]); + neighsum += neighsum; + neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) + + GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]); + membersum = membersum * memberscale + neighsum * neighscale; + *outptr = (JSAMPLE) ((membersum + 32768) >> 16); + + inrow += 2; + } +} + + +/* + * Downsample pixel values of a single component. + * This version handles the special case of a full-size component, + * with smoothing. One row of context is required. + */ + +METHODDEF(void) +fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr, + JSAMPARRAY input_data, JSAMPARRAY output_data) +{ + int outrow; + JDIMENSION colctr; + JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; + register JSAMPROW inptr, above_ptr, below_ptr, outptr; + INT32 membersum, neighsum, memberscale, neighscale; + int colsum, lastcolsum, nextcolsum; + + /* Expand input data enough to let all the output samples be generated + * by the standard loop. Special-casing padded output would be more + * efficient. + */ + expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2, + cinfo->image_width, output_cols); + + /* Each of the eight neighbor pixels contributes a fraction SF to the + * smoothed pixel, while the main pixel contributes (1-8*SF). In order + * to use integer arithmetic, these factors are multiplied by 2^16 = 65536. + * Also recall that SF = smoothing_factor / 1024. + */ + + memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */ + neighscale = cinfo->smoothing_factor * 64; /* scaled SF */ + + for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { + outptr = output_data[outrow]; + inptr = input_data[outrow]; + above_ptr = input_data[outrow-1]; + below_ptr = input_data[outrow+1]; + + /* Special case for first column */ + colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) + + GETJSAMPLE(*inptr); + membersum = GETJSAMPLE(*inptr++); + nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + + GETJSAMPLE(*inptr); + neighsum = colsum + (colsum - membersum) + nextcolsum; + membersum = membersum * memberscale + neighsum * neighscale; + *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); + lastcolsum = colsum; colsum = nextcolsum; + + for (colctr = output_cols - 2; colctr > 0; colctr--) { + membersum = GETJSAMPLE(*inptr++); + above_ptr++; below_ptr++; + nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + + GETJSAMPLE(*inptr); + neighsum = lastcolsum + (colsum - membersum) + nextcolsum; + membersum = membersum * memberscale + neighsum * neighscale; + *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); + lastcolsum = colsum; colsum = nextcolsum; + } + + /* Special case for last column */ + membersum = GETJSAMPLE(*inptr); + neighsum = lastcolsum + (colsum - membersum) + colsum; + membersum = membersum * memberscale + neighsum * neighscale; + *outptr = (JSAMPLE) ((membersum + 32768) >> 16); + + } +} + +#endif /* INPUT_SMOOTHING_SUPPORTED */ + + +/* + * Module initialization routine for downsampling. + * Note that we must select a routine for each component. + */ + +GLOBAL(void) +jinit_downsampler (j_compress_ptr cinfo) +{ + my_downsample_ptr downsample; + int ci; + jpeg_component_info * compptr; + boolean smoothok = TRUE; + + downsample = (my_downsample_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_downsampler)); + cinfo->downsample = (struct jpeg_downsampler *) downsample; + downsample->pub.start_pass = start_pass_downsample; + downsample->pub.downsample = sep_downsample; + downsample->pub.need_context_rows = FALSE; + + if (cinfo->CCIR601_sampling) + ERREXIT(cinfo, JERR_CCIR601_NOTIMPL); + + /* Verify we can handle the sampling factors, and set up method pointers */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (compptr->h_samp_factor == cinfo->max_h_samp_factor && + compptr->v_samp_factor == cinfo->max_v_samp_factor) { +#ifdef INPUT_SMOOTHING_SUPPORTED + if (cinfo->smoothing_factor) { + downsample->methods[ci] = fullsize_smooth_downsample; + downsample->pub.need_context_rows = TRUE; + } else +#endif + downsample->methods[ci] = fullsize_downsample; + } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && + compptr->v_samp_factor == cinfo->max_v_samp_factor) { + smoothok = FALSE; + downsample->methods[ci] = h2v1_downsample; + } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && + compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) { +#ifdef INPUT_SMOOTHING_SUPPORTED + if (cinfo->smoothing_factor) { + downsample->methods[ci] = h2v2_smooth_downsample; + downsample->pub.need_context_rows = TRUE; + } else +#endif + downsample->methods[ci] = h2v2_downsample; + } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 && + (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) { + smoothok = FALSE; + downsample->methods[ci] = int_downsample; + } else + ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL); + } + +#ifdef INPUT_SMOOTHING_SUPPORTED + if (cinfo->smoothing_factor && !smoothok) + TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL); +#endif +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jctrans.c b/third_party/windows/fltk-1.1.10/jpeg/jctrans.c new file mode 100644 index 0000000..8b36e36 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jctrans.c @@ -0,0 +1,388 @@ +/* + * jctrans.c + * + * Copyright (C) 1995-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains library routines for transcoding compression, + * that is, writing raw DCT coefficient arrays to an output JPEG file. + * The routines in jcapimin.c will also be needed by a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Forward declarations */ +LOCAL(void) transencode_master_selection + JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)); +LOCAL(void) transencode_coef_controller + JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)); + + +/* + * Compression initialization for writing raw-coefficient data. + * Before calling this, all parameters and a data destination must be set up. + * Call jpeg_finish_compress() to actually write the data. + * + * The number of passed virtual arrays must match cinfo->num_components. + * Note that the virtual arrays need not be filled or even realized at + * the time write_coefficients is called; indeed, if the virtual arrays + * were requested from this compression object's memory manager, they + * typically will be realized during this routine and filled afterwards. + */ + +GLOBAL(void) +jpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays) +{ + if (cinfo->global_state != CSTATE_START) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Mark all tables to be written */ + jpeg_suppress_tables(cinfo, FALSE); + /* (Re)initialize error mgr and destination modules */ + (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); + (*cinfo->dest->init_destination) (cinfo); + /* Perform master selection of active modules */ + transencode_master_selection(cinfo, coef_arrays); + /* Wait for jpeg_finish_compress() call */ + cinfo->next_scanline = 0; /* so jpeg_write_marker works */ + cinfo->global_state = CSTATE_WRCOEFS; +} + + +/* + * Initialize the compression object with default parameters, + * then copy from the source object all parameters needed for lossless + * transcoding. Parameters that can be varied without loss (such as + * scan script and Huffman optimization) are left in their default states. + */ + +GLOBAL(void) +jpeg_copy_critical_parameters (j_decompress_ptr srcinfo, + j_compress_ptr dstinfo) +{ + JQUANT_TBL ** qtblptr; + jpeg_component_info *incomp, *outcomp; + JQUANT_TBL *c_quant, *slot_quant; + int tblno, ci, coefi; + + /* Safety check to ensure start_compress not called yet. */ + if (dstinfo->global_state != CSTATE_START) + ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state); + /* Copy fundamental image dimensions */ + dstinfo->image_width = srcinfo->image_width; + dstinfo->image_height = srcinfo->image_height; + dstinfo->input_components = srcinfo->num_components; + dstinfo->in_color_space = srcinfo->jpeg_color_space; + /* Initialize all parameters to default values */ + jpeg_set_defaults(dstinfo); + /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB. + * Fix it to get the right header markers for the image colorspace. + */ + jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space); + dstinfo->data_precision = srcinfo->data_precision; + dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling; + /* Copy the source's quantization tables. */ + for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) { + if (srcinfo->quant_tbl_ptrs[tblno] != NULL) { + qtblptr = & dstinfo->quant_tbl_ptrs[tblno]; + if (*qtblptr == NULL) + *qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo); + MEMCOPY((*qtblptr)->quantval, + srcinfo->quant_tbl_ptrs[tblno]->quantval, + SIZEOF((*qtblptr)->quantval)); + (*qtblptr)->sent_table = FALSE; + } + } + /* Copy the source's per-component info. + * Note we assume jpeg_set_defaults has allocated the dest comp_info array. + */ + dstinfo->num_components = srcinfo->num_components; + if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS) + ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components, + MAX_COMPONENTS); + for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info; + ci < dstinfo->num_components; ci++, incomp++, outcomp++) { + outcomp->component_id = incomp->component_id; + outcomp->h_samp_factor = incomp->h_samp_factor; + outcomp->v_samp_factor = incomp->v_samp_factor; + outcomp->quant_tbl_no = incomp->quant_tbl_no; + /* Make sure saved quantization table for component matches the qtable + * slot. If not, the input file re-used this qtable slot. + * IJG encoder currently cannot duplicate this. + */ + tblno = outcomp->quant_tbl_no; + if (tblno < 0 || tblno >= NUM_QUANT_TBLS || + srcinfo->quant_tbl_ptrs[tblno] == NULL) + ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno); + slot_quant = srcinfo->quant_tbl_ptrs[tblno]; + c_quant = incomp->quant_table; + if (c_quant != NULL) { + for (coefi = 0; coefi < DCTSIZE2; coefi++) { + if (c_quant->quantval[coefi] != slot_quant->quantval[coefi]) + ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno); + } + } + /* Note: we do not copy the source's Huffman table assignments; + * instead we rely on jpeg_set_colorspace to have made a suitable choice. + */ + } + /* Also copy JFIF version and resolution information, if available. + * Strictly speaking this isn't "critical" info, but it's nearly + * always appropriate to copy it if available. In particular, + * if the application chooses to copy JFIF 1.02 extension markers from + * the source file, we need to copy the version to make sure we don't + * emit a file that has 1.02 extensions but a claimed version of 1.01. + * We will *not*, however, copy version info from mislabeled "2.01" files. + */ + if (srcinfo->saw_JFIF_marker) { + if (srcinfo->JFIF_major_version == 1) { + dstinfo->JFIF_major_version = srcinfo->JFIF_major_version; + dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version; + } + dstinfo->density_unit = srcinfo->density_unit; + dstinfo->X_density = srcinfo->X_density; + dstinfo->Y_density = srcinfo->Y_density; + } +} + + +/* + * Master selection of compression modules for transcoding. + * This substitutes for jcinit.c's initialization of the full compressor. + */ + +LOCAL(void) +transencode_master_selection (j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays) +{ + /* Although we don't actually use input_components for transcoding, + * jcmaster.c's initial_setup will complain if input_components is 0. + */ + cinfo->input_components = 1; + /* Initialize master control (includes parameter checking/processing) */ + jinit_c_master_control(cinfo, TRUE /* transcode only */); + + /* Entropy encoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) { + ERREXIT(cinfo, JERR_ARITH_NOTIMPL); + } else { + if (cinfo->progressive_mode) { +#ifdef C_PROGRESSIVE_SUPPORTED + jinit_phuff_encoder(cinfo); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else + jinit_huff_encoder(cinfo); + } + + /* We need a special coefficient buffer controller. */ + transencode_coef_controller(cinfo, coef_arrays); + + jinit_marker_writer(cinfo); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Write the datastream header (SOI, JFIF) immediately. + * Frame and scan headers are postponed till later. + * This lets application insert special markers after the SOI. + */ + (*cinfo->marker->write_file_header) (cinfo); +} + + +/* + * The rest of this file is a special implementation of the coefficient + * buffer controller. This is similar to jccoefct.c, but it handles only + * output from presupplied virtual arrays. Furthermore, we generate any + * dummy padding blocks on-the-fly rather than expecting them to be present + * in the arrays. + */ + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_c_coef_controller pub; /* public fields */ + + JDIMENSION iMCU_row_num; /* iMCU row # within image */ + JDIMENSION mcu_ctr; /* counts MCUs processed in current row */ + int MCU_vert_offset; /* counts MCU rows within iMCU row */ + int MCU_rows_per_iMCU_row; /* number of such rows needed */ + + /* Virtual block array for each component. */ + jvirt_barray_ptr * whole_image; + + /* Workspace for constructing dummy blocks at right/bottom edges. */ + JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU]; +} my_coef_controller; + +typedef my_coef_controller * my_coef_ptr; + + +LOCAL(void) +start_iMCU_row (j_compress_ptr cinfo) +/* Reset within-iMCU-row counters for a new row */ +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* In an interleaved scan, an MCU row is the same as an iMCU row. + * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. + * But at the bottom of the image, process only what's left. + */ + if (cinfo->comps_in_scan > 1) { + coef->MCU_rows_per_iMCU_row = 1; + } else { + if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1)) + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; + else + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; + } + + coef->mcu_ctr = 0; + coef->MCU_vert_offset = 0; +} + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + if (pass_mode != JBUF_CRANK_DEST) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + + coef->iMCU_row_num = 0; + start_iMCU_row(cinfo); +} + + +/* + * Process some data. + * We process the equivalent of one fully interleaved MCU row ("iMCU" row) + * per call, ie, v_samp_factor block rows for each component in the scan. + * The data is obtained from the virtual arrays and fed to the entropy coder. + * Returns TRUE if the iMCU row is completed, FALSE if suspended. + * + * NB: input_buf is ignored; it is likely to be a NULL pointer. + */ + +METHODDEF(boolean) +compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + int blkn, ci, xindex, yindex, yoffset, blockcnt; + JDIMENSION start_col; + JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; + JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU]; + JBLOCKROW buffer_ptr; + jpeg_component_info *compptr; + + /* Align the virtual buffers for the components used in this scan. */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + buffer[ci] = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], + coef->iMCU_row_num * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, FALSE); + } + + /* Loop to process one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row; + MCU_col_num++) { + /* Construct list of pointers to DCT blocks belonging to this MCU */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + start_col = MCU_col_num * compptr->MCU_width; + blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width + : compptr->last_col_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + if (coef->iMCU_row_num < last_iMCU_row || + yindex+yoffset < compptr->last_row_height) { + /* Fill in pointers to real blocks in this row */ + buffer_ptr = buffer[ci][yindex+yoffset] + start_col; + for (xindex = 0; xindex < blockcnt; xindex++) + MCU_buffer[blkn++] = buffer_ptr++; + } else { + /* At bottom of image, need a whole row of dummy blocks */ + xindex = 0; + } + /* Fill in any dummy blocks needed in this row. + * Dummy blocks are filled in the same way as in jccoefct.c: + * all zeroes in the AC entries, DC entries equal to previous + * block's DC value. The init routine has already zeroed the + * AC entries, so we need only set the DC entries correctly. + */ + for (; xindex < compptr->MCU_width; xindex++) { + MCU_buffer[blkn] = coef->dummy_buffer[blkn]; + MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0]; + blkn++; + } + } + } + /* Try to write the MCU. */ + if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->mcu_ctr = MCU_col_num; + return FALSE; + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->mcu_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + coef->iMCU_row_num++; + start_iMCU_row(cinfo); + return TRUE; +} + + +/* + * Initialize coefficient buffer controller. + * + * Each passed coefficient array must be the right size for that + * coefficient: width_in_blocks wide and height_in_blocks high, + * with unitheight at least v_samp_factor. + */ + +LOCAL(void) +transencode_coef_controller (j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays) +{ + my_coef_ptr coef; + JBLOCKROW buffer; + int i; + + coef = (my_coef_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_coef_controller)); + cinfo->coef = (struct jpeg_c_coef_controller *) coef; + coef->pub.start_pass = start_pass_coef; + coef->pub.compress_data = compress_output; + + /* Save pointer to virtual arrays */ + coef->whole_image = coef_arrays; + + /* Allocate and pre-zero space for dummy DCT blocks. */ + buffer = (JBLOCKROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { + coef->dummy_buffer[i] = buffer + i; + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdapimin.c b/third_party/windows/fltk-1.1.10/jpeg/jdapimin.c new file mode 100644 index 0000000..bd1df92 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdapimin.c @@ -0,0 +1,395 @@ +/* + * jdapimin.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the decompression half + * of the JPEG library. These are the "minimum" API routines that may be + * needed in either the normal full-decompression case or the + * transcoding-only case. + * + * Most of the routines intended to be called directly by an application + * are in this file or in jdapistd.c. But also see jcomapi.c for routines + * shared by compression and decompression, and jdtrans.c for the transcoding + * case. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * Initialization of a JPEG decompression object. + * The error manager must already be set up (in case memory manager fails). + */ + +GLOBAL(void) +jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize) +{ + int i; + + /* Guard against version mismatches between library and caller. */ + cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */ + if (version != JPEG_LIB_VERSION) + ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version); + if (structsize != SIZEOF(struct jpeg_decompress_struct)) + ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, + (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize); + + /* For debugging purposes, we zero the whole master structure. + * But the application has already set the err pointer, and may have set + * client_data, so we have to save and restore those fields. + * Note: if application hasn't set client_data, tools like Purify may + * complain here. + */ + { + struct jpeg_error_mgr * err = cinfo->err; + void * client_data = cinfo->client_data; /* ignore Purify complaint here */ + MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct)); + cinfo->err = err; + cinfo->client_data = client_data; + } + cinfo->is_decompressor = TRUE; + + /* Initialize a memory manager instance for this object */ + jinit_memory_mgr((j_common_ptr) cinfo); + + /* Zero out pointers to permanent structures. */ + cinfo->progress = NULL; + cinfo->src = NULL; + + for (i = 0; i < NUM_QUANT_TBLS; i++) + cinfo->quant_tbl_ptrs[i] = NULL; + + for (i = 0; i < NUM_HUFF_TBLS; i++) { + cinfo->dc_huff_tbl_ptrs[i] = NULL; + cinfo->ac_huff_tbl_ptrs[i] = NULL; + } + + /* Initialize marker processor so application can override methods + * for COM, APPn markers before calling jpeg_read_header. + */ + cinfo->marker_list = NULL; + jinit_marker_reader(cinfo); + + /* And initialize the overall input controller. */ + jinit_input_controller(cinfo); + + /* OK, I'm ready */ + cinfo->global_state = DSTATE_START; +} + + +/* + * Destruction of a JPEG decompression object + */ + +GLOBAL(void) +jpeg_destroy_decompress (j_decompress_ptr cinfo) +{ + jpeg_destroy((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Abort processing of a JPEG decompression operation, + * but don't destroy the object itself. + */ + +GLOBAL(void) +jpeg_abort_decompress (j_decompress_ptr cinfo) +{ + jpeg_abort((j_common_ptr) cinfo); /* use common routine */ +} + + +/* + * Set default decompression parameters. + */ + +LOCAL(void) +default_decompress_parms (j_decompress_ptr cinfo) +{ + /* Guess the input colorspace, and set output colorspace accordingly. */ + /* (Wish JPEG committee had provided a real way to specify this...) */ + /* Note application may override our guesses. */ + switch (cinfo->num_components) { + case 1: + cinfo->jpeg_color_space = JCS_GRAYSCALE; + cinfo->out_color_space = JCS_GRAYSCALE; + break; + + case 3: + if (cinfo->saw_JFIF_marker) { + cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */ + } else if (cinfo->saw_Adobe_marker) { + switch (cinfo->Adobe_transform) { + case 0: + cinfo->jpeg_color_space = JCS_RGB; + break; + case 1: + cinfo->jpeg_color_space = JCS_YCbCr; + break; + default: + WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); + cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ + break; + } + } else { + /* Saw no special markers, try to guess from the component IDs */ + int cid0 = cinfo->comp_info[0].component_id; + int cid1 = cinfo->comp_info[1].component_id; + int cid2 = cinfo->comp_info[2].component_id; + + if (cid0 == 1 && cid1 == 2 && cid2 == 3) + cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */ + else if (cid0 == 82 && cid1 == 71 && cid2 == 66) + cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */ + else { + TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2); + cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ + } + } + /* Always guess RGB is proper output colorspace. */ + cinfo->out_color_space = JCS_RGB; + break; + + case 4: + if (cinfo->saw_Adobe_marker) { + switch (cinfo->Adobe_transform) { + case 0: + cinfo->jpeg_color_space = JCS_CMYK; + break; + case 2: + cinfo->jpeg_color_space = JCS_YCCK; + break; + default: + WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); + cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */ + break; + } + } else { + /* No special markers, assume straight CMYK. */ + cinfo->jpeg_color_space = JCS_CMYK; + } + cinfo->out_color_space = JCS_CMYK; + break; + + default: + cinfo->jpeg_color_space = JCS_UNKNOWN; + cinfo->out_color_space = JCS_UNKNOWN; + break; + } + + /* Set defaults for other decompression parameters. */ + cinfo->scale_num = 1; /* 1:1 scaling */ + cinfo->scale_denom = 1; + cinfo->output_gamma = 1.0; + cinfo->buffered_image = FALSE; + cinfo->raw_data_out = FALSE; + cinfo->dct_method = JDCT_DEFAULT; + cinfo->do_fancy_upsampling = TRUE; + cinfo->do_block_smoothing = TRUE; + cinfo->quantize_colors = FALSE; + /* We set these in case application only sets quantize_colors. */ + cinfo->dither_mode = JDITHER_FS; +#ifdef QUANT_2PASS_SUPPORTED + cinfo->two_pass_quantize = TRUE; +#else + cinfo->two_pass_quantize = FALSE; +#endif + cinfo->desired_number_of_colors = 256; + cinfo->colormap = NULL; + /* Initialize for no mode change in buffered-image mode. */ + cinfo->enable_1pass_quant = FALSE; + cinfo->enable_external_quant = FALSE; + cinfo->enable_2pass_quant = FALSE; +} + + +/* + * Decompression startup: read start of JPEG datastream to see what's there. + * Need only initialize JPEG object and supply a data source before calling. + * + * This routine will read as far as the first SOS marker (ie, actual start of + * compressed data), and will save all tables and parameters in the JPEG + * object. It will also initialize the decompression parameters to default + * values, and finally return JPEG_HEADER_OK. On return, the application may + * adjust the decompression parameters and then call jpeg_start_decompress. + * (Or, if the application only wanted to determine the image parameters, + * the data need not be decompressed. In that case, call jpeg_abort or + * jpeg_destroy to release any temporary space.) + * If an abbreviated (tables only) datastream is presented, the routine will + * return JPEG_HEADER_TABLES_ONLY upon reaching EOI. The application may then + * re-use the JPEG object to read the abbreviated image datastream(s). + * It is unnecessary (but OK) to call jpeg_abort in this case. + * The JPEG_SUSPENDED return code only occurs if the data source module + * requests suspension of the decompressor. In this case the application + * should load more source data and then re-call jpeg_read_header to resume + * processing. + * If a non-suspending data source is used and require_image is TRUE, then the + * return code need not be inspected since only JPEG_HEADER_OK is possible. + * + * This routine is now just a front end to jpeg_consume_input, with some + * extra error checking. + */ + +GLOBAL(int) +jpeg_read_header (j_decompress_ptr cinfo, boolean require_image) +{ + int retcode; + + if (cinfo->global_state != DSTATE_START && + cinfo->global_state != DSTATE_INHEADER) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + retcode = jpeg_consume_input(cinfo); + + switch (retcode) { + case JPEG_REACHED_SOS: + retcode = JPEG_HEADER_OK; + break; + case JPEG_REACHED_EOI: + if (require_image) /* Complain if application wanted an image */ + ERREXIT(cinfo, JERR_NO_IMAGE); + /* Reset to start state; it would be safer to require the application to + * call jpeg_abort, but we can't change it now for compatibility reasons. + * A side effect is to free any temporary memory (there shouldn't be any). + */ + jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */ + retcode = JPEG_HEADER_TABLES_ONLY; + break; + case JPEG_SUSPENDED: + /* no work */ + break; + } + + return retcode; +} + + +/* + * Consume data in advance of what the decompressor requires. + * This can be called at any time once the decompressor object has + * been created and a data source has been set up. + * + * This routine is essentially a state machine that handles a couple + * of critical state-transition actions, namely initial setup and + * transition from header scanning to ready-for-start_decompress. + * All the actual input is done via the input controller's consume_input + * method. + */ + +GLOBAL(int) +jpeg_consume_input (j_decompress_ptr cinfo) +{ + int retcode = JPEG_SUSPENDED; + + /* NB: every possible DSTATE value should be listed in this switch */ + switch (cinfo->global_state) { + case DSTATE_START: + /* Start-of-datastream actions: reset appropriate modules */ + (*cinfo->inputctl->reset_input_controller) (cinfo); + /* Initialize application's data source module */ + (*cinfo->src->init_source) (cinfo); + cinfo->global_state = DSTATE_INHEADER; + /*FALLTHROUGH*/ + case DSTATE_INHEADER: + retcode = (*cinfo->inputctl->consume_input) (cinfo); + if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */ + /* Set up default parameters based on header data */ + default_decompress_parms(cinfo); + /* Set global state: ready for start_decompress */ + cinfo->global_state = DSTATE_READY; + } + break; + case DSTATE_READY: + /* Can't advance past first SOS until start_decompress is called */ + retcode = JPEG_REACHED_SOS; + break; + case DSTATE_PRELOAD: + case DSTATE_PRESCAN: + case DSTATE_SCANNING: + case DSTATE_RAW_OK: + case DSTATE_BUFIMAGE: + case DSTATE_BUFPOST: + case DSTATE_STOPPING: + retcode = (*cinfo->inputctl->consume_input) (cinfo); + break; + default: + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + } + return retcode; +} + + +/* + * Have we finished reading the input file? + */ + +GLOBAL(boolean) +jpeg_input_complete (j_decompress_ptr cinfo) +{ + /* Check for valid jpeg object */ + if (cinfo->global_state < DSTATE_START || + cinfo->global_state > DSTATE_STOPPING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + return cinfo->inputctl->eoi_reached; +} + + +/* + * Is there more than one scan? + */ + +GLOBAL(boolean) +jpeg_has_multiple_scans (j_decompress_ptr cinfo) +{ + /* Only valid after jpeg_read_header completes */ + if (cinfo->global_state < DSTATE_READY || + cinfo->global_state > DSTATE_STOPPING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + return cinfo->inputctl->has_multiple_scans; +} + + +/* + * Finish JPEG decompression. + * + * This will normally just verify the file trailer and release temp storage. + * + * Returns FALSE if suspended. The return value need be inspected only if + * a suspending data source is used. + */ + +GLOBAL(boolean) +jpeg_finish_decompress (j_decompress_ptr cinfo) +{ + if ((cinfo->global_state == DSTATE_SCANNING || + cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) { + /* Terminate final pass of non-buffered mode */ + if (cinfo->output_scanline < cinfo->output_height) + ERREXIT(cinfo, JERR_TOO_LITTLE_DATA); + (*cinfo->master->finish_output_pass) (cinfo); + cinfo->global_state = DSTATE_STOPPING; + } else if (cinfo->global_state == DSTATE_BUFIMAGE) { + /* Finishing after a buffered-image operation */ + cinfo->global_state = DSTATE_STOPPING; + } else if (cinfo->global_state != DSTATE_STOPPING) { + /* STOPPING = repeat call after a suspension, anything else is error */ + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + } + /* Read until EOI */ + while (! cinfo->inputctl->eoi_reached) { + if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) + return FALSE; /* Suspend, come back later */ + } + /* Do final cleanup */ + (*cinfo->src->term_source) (cinfo); + /* We can use jpeg_abort to release memory and reset global_state */ + jpeg_abort((j_common_ptr) cinfo); + return TRUE; +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdapistd.c b/third_party/windows/fltk-1.1.10/jpeg/jdapistd.c new file mode 100644 index 0000000..f6c7fff --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdapistd.c @@ -0,0 +1,275 @@ +/* + * jdapistd.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains application interface code for the decompression half + * of the JPEG library. These are the "standard" API routines that are + * used in the normal full-decompression case. They are not used by a + * transcoding-only application. Note that if an application links in + * jpeg_start_decompress, it will end up linking in the entire decompressor. + * We thus must separate this file from jdapimin.c to avoid linking the + * whole decompression library into a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Forward declarations */ +LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo)); + + +/* + * Decompression initialization. + * jpeg_read_header must be completed before calling this. + * + * If a multipass operating mode was selected, this will do all but the + * last pass, and thus may take a great deal of time. + * + * Returns FALSE if suspended. The return value need be inspected only if + * a suspending data source is used. + */ + +GLOBAL(boolean) +jpeg_start_decompress (j_decompress_ptr cinfo) +{ + if (cinfo->global_state == DSTATE_READY) { + /* First call: initialize master control, select active modules */ + jinit_master_decompress(cinfo); + if (cinfo->buffered_image) { + /* No more work here; expecting jpeg_start_output next */ + cinfo->global_state = DSTATE_BUFIMAGE; + return TRUE; + } + cinfo->global_state = DSTATE_PRELOAD; + } + if (cinfo->global_state == DSTATE_PRELOAD) { + /* If file has multiple scans, absorb them all into the coef buffer */ + if (cinfo->inputctl->has_multiple_scans) { +#ifdef D_MULTISCAN_FILES_SUPPORTED + for (;;) { + int retcode; + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + /* Absorb some more input */ + retcode = (*cinfo->inputctl->consume_input) (cinfo); + if (retcode == JPEG_SUSPENDED) + return FALSE; + if (retcode == JPEG_REACHED_EOI) + break; + /* Advance progress counter if appropriate */ + if (cinfo->progress != NULL && + (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { + if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { + /* jdmaster underestimated number of scans; ratchet up one scan */ + cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; + } + } + } +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif /* D_MULTISCAN_FILES_SUPPORTED */ + } + cinfo->output_scan_number = cinfo->input_scan_number; + } else if (cinfo->global_state != DSTATE_PRESCAN) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Perform any dummy output passes, and set up for the final pass */ + return output_pass_setup(cinfo); +} + + +/* + * Set up for an output pass, and perform any dummy pass(es) needed. + * Common subroutine for jpeg_start_decompress and jpeg_start_output. + * Entry: global_state = DSTATE_PRESCAN only if previously suspended. + * Exit: If done, returns TRUE and sets global_state for proper output mode. + * If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN. + */ + +LOCAL(boolean) +output_pass_setup (j_decompress_ptr cinfo) +{ + if (cinfo->global_state != DSTATE_PRESCAN) { + /* First call: do pass setup */ + (*cinfo->master->prepare_for_output_pass) (cinfo); + cinfo->output_scanline = 0; + cinfo->global_state = DSTATE_PRESCAN; + } + /* Loop over any required dummy passes */ + while (cinfo->master->is_dummy_pass) { +#ifdef QUANT_2PASS_SUPPORTED + /* Crank through the dummy pass */ + while (cinfo->output_scanline < cinfo->output_height) { + JDIMENSION last_scanline; + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->output_scanline; + cinfo->progress->pass_limit = (long) cinfo->output_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + /* Process some data */ + last_scanline = cinfo->output_scanline; + (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL, + &cinfo->output_scanline, (JDIMENSION) 0); + if (cinfo->output_scanline == last_scanline) + return FALSE; /* No progress made, must suspend */ + } + /* Finish up dummy pass, and set up for another one */ + (*cinfo->master->finish_output_pass) (cinfo); + (*cinfo->master->prepare_for_output_pass) (cinfo); + cinfo->output_scanline = 0; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif /* QUANT_2PASS_SUPPORTED */ + } + /* Ready for application to drive output pass through + * jpeg_read_scanlines or jpeg_read_raw_data. + */ + cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING; + return TRUE; +} + + +/* + * Read some scanlines of data from the JPEG decompressor. + * + * The return value will be the number of lines actually read. + * This may be less than the number requested in several cases, + * including bottom of image, data source suspension, and operating + * modes that emit multiple scanlines at a time. + * + * Note: we warn about excess calls to jpeg_read_scanlines() since + * this likely signals an application programmer error. However, + * an oversize buffer (max_lines > scanlines remaining) is not an error. + */ + +GLOBAL(JDIMENSION) +jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines, + JDIMENSION max_lines) +{ + JDIMENSION row_ctr; + + if (cinfo->global_state != DSTATE_SCANNING) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->output_scanline >= cinfo->output_height) { + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + return 0; + } + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->output_scanline; + cinfo->progress->pass_limit = (long) cinfo->output_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Process some data */ + row_ctr = 0; + (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines); + cinfo->output_scanline += row_ctr; + return row_ctr; +} + + +/* + * Alternate entry point to read raw data. + * Processes exactly one iMCU row per call, unless suspended. + */ + +GLOBAL(JDIMENSION) +jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data, + JDIMENSION max_lines) +{ + JDIMENSION lines_per_iMCU_row; + + if (cinfo->global_state != DSTATE_RAW_OK) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + if (cinfo->output_scanline >= cinfo->output_height) { + WARNMS(cinfo, JWRN_TOO_MUCH_DATA); + return 0; + } + + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) { + cinfo->progress->pass_counter = (long) cinfo->output_scanline; + cinfo->progress->pass_limit = (long) cinfo->output_height; + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + } + + /* Verify that at least one iMCU row can be returned. */ + lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size; + if (max_lines < lines_per_iMCU_row) + ERREXIT(cinfo, JERR_BUFFER_SIZE); + + /* Decompress directly into user's buffer. */ + if (! (*cinfo->coef->decompress_data) (cinfo, data)) + return 0; /* suspension forced, can do nothing more */ + + /* OK, we processed one iMCU row. */ + cinfo->output_scanline += lines_per_iMCU_row; + return lines_per_iMCU_row; +} + + +/* Additional entry points for buffered-image mode. */ + +#ifdef D_MULTISCAN_FILES_SUPPORTED + +/* + * Initialize for an output pass in buffered-image mode. + */ + +GLOBAL(boolean) +jpeg_start_output (j_decompress_ptr cinfo, int scan_number) +{ + if (cinfo->global_state != DSTATE_BUFIMAGE && + cinfo->global_state != DSTATE_PRESCAN) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + /* Limit scan number to valid range */ + if (scan_number <= 0) + scan_number = 1; + if (cinfo->inputctl->eoi_reached && + scan_number > cinfo->input_scan_number) + scan_number = cinfo->input_scan_number; + cinfo->output_scan_number = scan_number; + /* Perform any dummy output passes, and set up for the real pass */ + return output_pass_setup(cinfo); +} + + +/* + * Finish up after an output pass in buffered-image mode. + * + * Returns FALSE if suspended. The return value need be inspected only if + * a suspending data source is used. + */ + +GLOBAL(boolean) +jpeg_finish_output (j_decompress_ptr cinfo) +{ + if ((cinfo->global_state == DSTATE_SCANNING || + cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) { + /* Terminate this pass. */ + /* We do not require the whole pass to have been completed. */ + (*cinfo->master->finish_output_pass) (cinfo); + cinfo->global_state = DSTATE_BUFPOST; + } else if (cinfo->global_state != DSTATE_BUFPOST) { + /* BUFPOST = repeat call after a suspension, anything else is error */ + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + } + /* Read markers looking for SOS or EOI */ + while (cinfo->input_scan_number <= cinfo->output_scan_number && + ! cinfo->inputctl->eoi_reached) { + if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) + return FALSE; /* Suspend, come back later */ + } + cinfo->global_state = DSTATE_BUFIMAGE; + return TRUE; +} + +#endif /* D_MULTISCAN_FILES_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdatadst.c b/third_party/windows/fltk-1.1.10/jpeg/jdatadst.c new file mode 100644 index 0000000..2ece4e9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdatadst.c @@ -0,0 +1,151 @@ +/* + * jdatadst.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains compression data destination routines for the case of + * emitting JPEG data to a file (or any stdio stream). While these routines + * are sufficient for most applications, some will want to use a different + * destination manager. + * IMPORTANT: we assume that fwrite() will correctly transcribe an array of + * JOCTETs into 8-bit-wide elements on external storage. If char is wider + * than 8 bits on your machine, you may need to do some tweaking. + */ + +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jerror.h" + + +/* Expanded data destination object for stdio output */ + +typedef struct { + struct jpeg_destination_mgr pub; /* public fields */ + + FILE * outfile; /* target stream */ + JOCTET * buffer; /* start of buffer */ +} my_destination_mgr; + +typedef my_destination_mgr * my_dest_ptr; + +#define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */ + + +/* + * Initialize destination --- called by jpeg_start_compress + * before any data is actually written. + */ + +METHODDEF(void) +init_destination (j_compress_ptr cinfo) +{ + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; + + /* Allocate the output buffer --- it will be released when done with image */ + dest->buffer = (JOCTET *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + OUTPUT_BUF_SIZE * SIZEOF(JOCTET)); + + dest->pub.next_output_byte = dest->buffer; + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; +} + + +/* + * Empty the output buffer --- called whenever buffer fills up. + * + * In typical applications, this should write the entire output buffer + * (ignoring the current state of next_output_byte & free_in_buffer), + * reset the pointer & count to the start of the buffer, and return TRUE + * indicating that the buffer has been dumped. + * + * In applications that need to be able to suspend compression due to output + * overrun, a FALSE return indicates that the buffer cannot be emptied now. + * In this situation, the compressor will return to its caller (possibly with + * an indication that it has not accepted all the supplied scanlines). The + * application should resume compression after it has made more room in the + * output buffer. Note that there are substantial restrictions on the use of + * suspension --- see the documentation. + * + * When suspending, the compressor will back up to a convenient restart point + * (typically the start of the current MCU). next_output_byte & free_in_buffer + * indicate where the restart point will be if the current call returns FALSE. + * Data beyond this point will be regenerated after resumption, so do not + * write it out when emptying the buffer externally. + */ + +METHODDEF(boolean) +empty_output_buffer (j_compress_ptr cinfo) +{ + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; + + if (JFWRITE(dest->outfile, dest->buffer, OUTPUT_BUF_SIZE) != + (size_t) OUTPUT_BUF_SIZE) + ERREXIT(cinfo, JERR_FILE_WRITE); + + dest->pub.next_output_byte = dest->buffer; + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; + + return TRUE; +} + + +/* + * Terminate destination --- called by jpeg_finish_compress + * after all data has been written. Usually needs to flush buffer. + * + * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding + * application must deal with any cleanup that should happen even + * for error exit. + */ + +METHODDEF(void) +term_destination (j_compress_ptr cinfo) +{ + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; + size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer; + + /* Write any data remaining in the buffer */ + if (datacount > 0) { + if (JFWRITE(dest->outfile, dest->buffer, datacount) != datacount) + ERREXIT(cinfo, JERR_FILE_WRITE); + } + fflush(dest->outfile); + /* Make sure we wrote the output file OK */ + if (ferror(dest->outfile)) + ERREXIT(cinfo, JERR_FILE_WRITE); +} + + +/* + * Prepare for output to a stdio stream. + * The caller must have already opened the stream, and is responsible + * for closing it after finishing compression. + */ + +GLOBAL(void) +jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile) +{ + my_dest_ptr dest; + + /* The destination object is made permanent so that multiple JPEG images + * can be written to the same file without re-executing jpeg_stdio_dest. + * This makes it dangerous to use this manager and a different destination + * manager serially with the same JPEG object, because their private object + * sizes may be different. Caveat programmer. + */ + if (cinfo->dest == NULL) { /* first time for this JPEG object? */ + cinfo->dest = (struct jpeg_destination_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_destination_mgr)); + } + + dest = (my_dest_ptr) cinfo->dest; + dest->pub.init_destination = init_destination; + dest->pub.empty_output_buffer = empty_output_buffer; + dest->pub.term_destination = term_destination; + dest->outfile = outfile; +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdatasrc.c b/third_party/windows/fltk-1.1.10/jpeg/jdatasrc.c new file mode 100644 index 0000000..29b6983 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdatasrc.c @@ -0,0 +1,212 @@ +/* + * jdatasrc.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains decompression data source routines for the case of + * reading JPEG data from a file (or any stdio stream). While these routines + * are sufficient for most applications, some will want to use a different + * source manager. + * IMPORTANT: we assume that fread() will correctly transcribe an array of + * JOCTETs from 8-bit-wide elements on external storage. If char is wider + * than 8 bits on your machine, you may need to do some tweaking. + */ + +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jerror.h" + + +/* Expanded data source object for stdio input */ + +typedef struct { + struct jpeg_source_mgr pub; /* public fields */ + + FILE * infile; /* source stream */ + JOCTET * buffer; /* start of buffer */ + boolean start_of_file; /* have we gotten any data yet? */ +} my_source_mgr; + +typedef my_source_mgr * my_src_ptr; + +#define INPUT_BUF_SIZE 4096 /* choose an efficiently fread'able size */ + + +/* + * Initialize source --- called by jpeg_read_header + * before any data is actually read. + */ + +METHODDEF(void) +init_source (j_decompress_ptr cinfo) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + + /* We reset the empty-input-file flag for each image, + * but we don't clear the input buffer. + * This is correct behavior for reading a series of images from one source. + */ + src->start_of_file = TRUE; +} + + +/* + * Fill the input buffer --- called whenever buffer is emptied. + * + * In typical applications, this should read fresh data into the buffer + * (ignoring the current state of next_input_byte & bytes_in_buffer), + * reset the pointer & count to the start of the buffer, and return TRUE + * indicating that the buffer has been reloaded. It is not necessary to + * fill the buffer entirely, only to obtain at least one more byte. + * + * There is no such thing as an EOF return. If the end of the file has been + * reached, the routine has a choice of ERREXIT() or inserting fake data into + * the buffer. In most cases, generating a warning message and inserting a + * fake EOI marker is the best course of action --- this will allow the + * decompressor to output however much of the image is there. However, + * the resulting error message is misleading if the real problem is an empty + * input file, so we handle that case specially. + * + * In applications that need to be able to suspend compression due to input + * not being available yet, a FALSE return indicates that no more data can be + * obtained right now, but more may be forthcoming later. In this situation, + * the decompressor will return to its caller (with an indication of the + * number of scanlines it has read, if any). The application should resume + * decompression after it has loaded more data into the input buffer. Note + * that there are substantial restrictions on the use of suspension --- see + * the documentation. + * + * When suspending, the decompressor will back up to a convenient restart point + * (typically the start of the current MCU). next_input_byte & bytes_in_buffer + * indicate where the restart point will be if the current call returns FALSE. + * Data beyond this point must be rescanned after resumption, so move it to + * the front of the buffer rather than discarding it. + */ + +METHODDEF(boolean) +fill_input_buffer (j_decompress_ptr cinfo) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + size_t nbytes; + + nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE); + + if (nbytes <= 0) { + if (src->start_of_file) /* Treat empty input file as fatal error */ + ERREXIT(cinfo, JERR_INPUT_EMPTY); + WARNMS(cinfo, JWRN_JPEG_EOF); + /* Insert a fake EOI marker */ + src->buffer[0] = (JOCTET) 0xFF; + src->buffer[1] = (JOCTET) JPEG_EOI; + nbytes = 2; + } + + src->pub.next_input_byte = src->buffer; + src->pub.bytes_in_buffer = nbytes; + src->start_of_file = FALSE; + + return TRUE; +} + + +/* + * Skip data --- used to skip over a potentially large amount of + * uninteresting data (such as an APPn marker). + * + * Writers of suspendable-input applications must note that skip_input_data + * is not granted the right to give a suspension return. If the skip extends + * beyond the data currently in the buffer, the buffer can be marked empty so + * that the next read will cause a fill_input_buffer call that can suspend. + * Arranging for additional bytes to be discarded before reloading the input + * buffer is the application writer's problem. + */ + +METHODDEF(void) +skip_input_data (j_decompress_ptr cinfo, long num_bytes) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + + /* Just a dumb implementation for now. Could use fseek() except + * it doesn't work on pipes. Not clear that being smart is worth + * any trouble anyway --- large skips are infrequent. + */ + if (num_bytes > 0) { + while (num_bytes > (long) src->pub.bytes_in_buffer) { + num_bytes -= (long) src->pub.bytes_in_buffer; + (void) fill_input_buffer(cinfo); + /* note we assume that fill_input_buffer will never return FALSE, + * so suspension need not be handled. + */ + } + src->pub.next_input_byte += (size_t) num_bytes; + src->pub.bytes_in_buffer -= (size_t) num_bytes; + } +} + + +/* + * An additional method that can be provided by data source modules is the + * resync_to_restart method for error recovery in the presence of RST markers. + * For the moment, this source module just uses the default resync method + * provided by the JPEG library. That method assumes that no backtracking + * is possible. + */ + + +/* + * Terminate source --- called by jpeg_finish_decompress + * after all data has been read. Often a no-op. + * + * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding + * application must deal with any cleanup that should happen even + * for error exit. + */ + +METHODDEF(void) +term_source (j_decompress_ptr cinfo) +{ + /* no work necessary here */ +} + + +/* + * Prepare for input from a stdio stream. + * The caller must have already opened the stream, and is responsible + * for closing it after finishing decompression. + */ + +GLOBAL(void) +jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile) +{ + my_src_ptr src; + + /* The source object and input buffer are made permanent so that a series + * of JPEG images can be read from the same file by calling jpeg_stdio_src + * only before the first one. (If we discarded the buffer at the end of + * one image, we'd likely lose the start of the next one.) + * This makes it unsafe to use this manager and a different source + * manager serially with the same JPEG object. Caveat programmer. + */ + if (cinfo->src == NULL) { /* first time for this JPEG object? */ + cinfo->src = (struct jpeg_source_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_source_mgr)); + src = (my_src_ptr) cinfo->src; + src->buffer = (JOCTET *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + INPUT_BUF_SIZE * SIZEOF(JOCTET)); + } + + src = (my_src_ptr) cinfo->src; + src->pub.init_source = init_source; + src->pub.fill_input_buffer = fill_input_buffer; + src->pub.skip_input_data = skip_input_data; + src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ + src->pub.term_source = term_source; + src->infile = infile; + src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ + src->pub.next_input_byte = NULL; /* until buffer loaded */ +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdcoefct.c b/third_party/windows/fltk-1.1.10/jpeg/jdcoefct.c new file mode 100644 index 0000000..992bd10 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdcoefct.c @@ -0,0 +1,736 @@ +/* + * jdcoefct.c + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the coefficient buffer controller for decompression. + * This controller is the top level of the JPEG decompressor proper. + * The coefficient buffer lies between entropy decoding and inverse-DCT steps. + * + * In buffered-image mode, this controller is the interface between + * input-oriented processing and output-oriented processing. + * Also, the input side (only) is used when reading a file for transcoding. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +/* Block smoothing is only applicable for progressive JPEG, so: */ +#ifndef D_PROGRESSIVE_SUPPORTED +#undef BLOCK_SMOOTHING_SUPPORTED +#endif + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_d_coef_controller pub; /* public fields */ + + /* These variables keep track of the current location of the input side. */ + /* cinfo->input_iMCU_row is also used for this. */ + JDIMENSION MCU_ctr; /* counts MCUs processed in current row */ + int MCU_vert_offset; /* counts MCU rows within iMCU row */ + int MCU_rows_per_iMCU_row; /* number of such rows needed */ + + /* The output side's location is represented by cinfo->output_iMCU_row. */ + + /* In single-pass modes, it's sufficient to buffer just one MCU. + * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks, + * and let the entropy decoder write into that workspace each time. + * (On 80x86, the workspace is FAR even though it's not really very big; + * this is to keep the module interfaces unchanged when a large coefficient + * buffer is necessary.) + * In multi-pass modes, this array points to the current MCU's blocks + * within the virtual arrays; it is used only by the input side. + */ + JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU]; + +#ifdef D_MULTISCAN_FILES_SUPPORTED + /* In multi-pass modes, we need a virtual block array for each component. */ + jvirt_barray_ptr whole_image[MAX_COMPONENTS]; +#endif + +#ifdef BLOCK_SMOOTHING_SUPPORTED + /* When doing block smoothing, we latch coefficient Al values here */ + int * coef_bits_latch; +#define SAVED_COEFS 6 /* we save coef_bits[0..5] */ +#endif +} my_coef_controller; + +typedef my_coef_controller * my_coef_ptr; + +/* Forward declarations */ +METHODDEF(int) decompress_onepass + JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); +#ifdef D_MULTISCAN_FILES_SUPPORTED +METHODDEF(int) decompress_data + JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); +#endif +#ifdef BLOCK_SMOOTHING_SUPPORTED +LOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo)); +METHODDEF(int) decompress_smooth_data + JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); +#endif + + +LOCAL(void) +start_iMCU_row (j_decompress_ptr cinfo) +/* Reset within-iMCU-row counters for a new row (input side) */ +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* In an interleaved scan, an MCU row is the same as an iMCU row. + * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. + * But at the bottom of the image, process only what's left. + */ + if (cinfo->comps_in_scan > 1) { + coef->MCU_rows_per_iMCU_row = 1; + } else { + if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1)) + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; + else + coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; + } + + coef->MCU_ctr = 0; + coef->MCU_vert_offset = 0; +} + + +/* + * Initialize for an input processing pass. + */ + +METHODDEF(void) +start_input_pass (j_decompress_ptr cinfo) +{ + cinfo->input_iMCU_row = 0; + start_iMCU_row(cinfo); +} + + +/* + * Initialize for an output processing pass. + */ + +METHODDEF(void) +start_output_pass (j_decompress_ptr cinfo) +{ +#ifdef BLOCK_SMOOTHING_SUPPORTED + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + + /* If multipass, check to see whether to use block smoothing on this pass */ + if (coef->pub.coef_arrays != NULL) { + if (cinfo->do_block_smoothing && smoothing_ok(cinfo)) + coef->pub.decompress_data = decompress_smooth_data; + else + coef->pub.decompress_data = decompress_data; + } +#endif + cinfo->output_iMCU_row = 0; +} + + +/* + * Decompress and return some data in the single-pass case. + * Always attempts to emit one fully interleaved MCU row ("iMCU" row). + * Input and output must run in lockstep since we have only a one-MCU buffer. + * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. + * + * NB: output_buf contains a plane for each component in image, + * which we index according to the component's SOF position. + */ + +METHODDEF(int) +decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + int blkn, ci, xindex, yindex, yoffset, useful_width; + JSAMPARRAY output_ptr; + JDIMENSION start_col, output_col; + jpeg_component_info *compptr; + inverse_DCT_method_ptr inverse_DCT; + + /* Loop to process as much as one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col; + MCU_col_num++) { + /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */ + jzero_far((void FAR *) coef->MCU_buffer[0], + (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK))); + if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->MCU_ctr = MCU_col_num; + return JPEG_SUSPENDED; + } + /* Determine where data should go in output_buf and do the IDCT thing. + * We skip dummy blocks at the right and bottom edges (but blkn gets + * incremented past them!). Note the inner loop relies on having + * allocated the MCU_buffer[] blocks sequentially. + */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Don't bother to IDCT an uninteresting component. */ + if (! compptr->component_needed) { + blkn += compptr->MCU_blocks; + continue; + } + inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index]; + useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width + : compptr->last_col_width; + output_ptr = output_buf[compptr->component_index] + + yoffset * compptr->DCT_scaled_size; + start_col = MCU_col_num * compptr->MCU_sample_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + if (cinfo->input_iMCU_row < last_iMCU_row || + yoffset+yindex < compptr->last_row_height) { + output_col = start_col; + for (xindex = 0; xindex < useful_width; xindex++) { + (*inverse_DCT) (cinfo, compptr, + (JCOEFPTR) coef->MCU_buffer[blkn+xindex], + output_ptr, output_col); + output_col += compptr->DCT_scaled_size; + } + } + blkn += compptr->MCU_width; + output_ptr += compptr->DCT_scaled_size; + } + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->MCU_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + cinfo->output_iMCU_row++; + if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { + start_iMCU_row(cinfo); + return JPEG_ROW_COMPLETED; + } + /* Completed the scan */ + (*cinfo->inputctl->finish_input_pass) (cinfo); + return JPEG_SCAN_COMPLETED; +} + + +/* + * Dummy consume-input routine for single-pass operation. + */ + +METHODDEF(int) +dummy_consume_data (j_decompress_ptr cinfo) +{ + return JPEG_SUSPENDED; /* Always indicate nothing was done */ +} + + +#ifdef D_MULTISCAN_FILES_SUPPORTED + +/* + * Consume input data and store it in the full-image coefficient buffer. + * We read as much as one fully interleaved MCU row ("iMCU" row) per call, + * ie, v_samp_factor block rows for each component in the scan. + * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. + */ + +METHODDEF(int) +consume_data (j_decompress_ptr cinfo) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION MCU_col_num; /* index of current MCU within row */ + int blkn, ci, xindex, yindex, yoffset; + JDIMENSION start_col; + JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; + JBLOCKROW buffer_ptr; + jpeg_component_info *compptr; + + /* Align the virtual buffers for the components used in this scan. */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + buffer[ci] = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], + cinfo->input_iMCU_row * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, TRUE); + /* Note: entropy decoder expects buffer to be zeroed, + * but this is handled automatically by the memory manager + * because we requested a pre-zeroed array. + */ + } + + /* Loop to process one whole iMCU row */ + for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; + yoffset++) { + for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row; + MCU_col_num++) { + /* Construct list of pointers to DCT blocks belonging to this MCU */ + blkn = 0; /* index of current DCT block within MCU */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + start_col = MCU_col_num * compptr->MCU_width; + for (yindex = 0; yindex < compptr->MCU_height; yindex++) { + buffer_ptr = buffer[ci][yindex+yoffset] + start_col; + for (xindex = 0; xindex < compptr->MCU_width; xindex++) { + coef->MCU_buffer[blkn++] = buffer_ptr++; + } + } + } + /* Try to fetch the MCU. */ + if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { + /* Suspension forced; update state counters and exit */ + coef->MCU_vert_offset = yoffset; + coef->MCU_ctr = MCU_col_num; + return JPEG_SUSPENDED; + } + } + /* Completed an MCU row, but perhaps not an iMCU row */ + coef->MCU_ctr = 0; + } + /* Completed the iMCU row, advance counters for next one */ + if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { + start_iMCU_row(cinfo); + return JPEG_ROW_COMPLETED; + } + /* Completed the scan */ + (*cinfo->inputctl->finish_input_pass) (cinfo); + return JPEG_SCAN_COMPLETED; +} + + +/* + * Decompress and return some data in the multi-pass case. + * Always attempts to emit one fully interleaved MCU row ("iMCU" row). + * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. + * + * NB: output_buf contains a plane for each component in image. + */ + +METHODDEF(int) +decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + JDIMENSION block_num; + int ci, block_row, block_rows; + JBLOCKARRAY buffer; + JBLOCKROW buffer_ptr; + JSAMPARRAY output_ptr; + JDIMENSION output_col; + jpeg_component_info *compptr; + inverse_DCT_method_ptr inverse_DCT; + + /* Force some input to be done if we are getting ahead of the input. */ + while (cinfo->input_scan_number < cinfo->output_scan_number || + (cinfo->input_scan_number == cinfo->output_scan_number && + cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) { + if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) + return JPEG_SUSPENDED; + } + + /* OK, output from the virtual arrays. */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Don't bother to IDCT an uninteresting component. */ + if (! compptr->component_needed) + continue; + /* Align the virtual buffer for this component. */ + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + cinfo->output_iMCU_row * compptr->v_samp_factor, + (JDIMENSION) compptr->v_samp_factor, FALSE); + /* Count non-dummy DCT block rows in this iMCU row. */ + if (cinfo->output_iMCU_row < last_iMCU_row) + block_rows = compptr->v_samp_factor; + else { + /* NB: can't use last_row_height here; it is input-side-dependent! */ + block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (block_rows == 0) block_rows = compptr->v_samp_factor; + } + inverse_DCT = cinfo->idct->inverse_DCT[ci]; + output_ptr = output_buf[ci]; + /* Loop over all DCT blocks to be processed. */ + for (block_row = 0; block_row < block_rows; block_row++) { + buffer_ptr = buffer[block_row]; + output_col = 0; + for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) { + (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr, + output_ptr, output_col); + buffer_ptr++; + output_col += compptr->DCT_scaled_size; + } + output_ptr += compptr->DCT_scaled_size; + } + } + + if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) + return JPEG_ROW_COMPLETED; + return JPEG_SCAN_COMPLETED; +} + +#endif /* D_MULTISCAN_FILES_SUPPORTED */ + + +#ifdef BLOCK_SMOOTHING_SUPPORTED + +/* + * This code applies interblock smoothing as described by section K.8 + * of the JPEG standard: the first 5 AC coefficients are estimated from + * the DC values of a DCT block and its 8 neighboring blocks. + * We apply smoothing only for progressive JPEG decoding, and only if + * the coefficients it can estimate are not yet known to full precision. + */ + +/* Natural-order array positions of the first 5 zigzag-order coefficients */ +#define Q01_POS 1 +#define Q10_POS 8 +#define Q20_POS 16 +#define Q11_POS 9 +#define Q02_POS 2 + +/* + * Determine whether block smoothing is applicable and safe. + * We also latch the current states of the coef_bits[] entries for the + * AC coefficients; otherwise, if the input side of the decompressor + * advances into a new scan, we might think the coefficients are known + * more accurately than they really are. + */ + +LOCAL(boolean) +smoothing_ok (j_decompress_ptr cinfo) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + boolean smoothing_useful = FALSE; + int ci, coefi; + jpeg_component_info *compptr; + JQUANT_TBL * qtable; + int * coef_bits; + int * coef_bits_latch; + + if (! cinfo->progressive_mode || cinfo->coef_bits == NULL) + return FALSE; + + /* Allocate latch area if not already done */ + if (coef->coef_bits_latch == NULL) + coef->coef_bits_latch = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * + (SAVED_COEFS * SIZEOF(int))); + coef_bits_latch = coef->coef_bits_latch; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* All components' quantization values must already be latched. */ + if ((qtable = compptr->quant_table) == NULL) + return FALSE; + /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */ + if (qtable->quantval[0] == 0 || + qtable->quantval[Q01_POS] == 0 || + qtable->quantval[Q10_POS] == 0 || + qtable->quantval[Q20_POS] == 0 || + qtable->quantval[Q11_POS] == 0 || + qtable->quantval[Q02_POS] == 0) + return FALSE; + /* DC values must be at least partly known for all components. */ + coef_bits = cinfo->coef_bits[ci]; + if (coef_bits[0] < 0) + return FALSE; + /* Block smoothing is helpful if some AC coefficients remain inaccurate. */ + for (coefi = 1; coefi <= 5; coefi++) { + coef_bits_latch[coefi] = coef_bits[coefi]; + if (coef_bits[coefi] != 0) + smoothing_useful = TRUE; + } + coef_bits_latch += SAVED_COEFS; + } + + return smoothing_useful; +} + + +/* + * Variant of decompress_data for use when doing block smoothing. + */ + +METHODDEF(int) +decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) +{ + my_coef_ptr coef = (my_coef_ptr) cinfo->coef; + JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; + JDIMENSION block_num, last_block_column; + int ci, block_row, block_rows, access_rows; + JBLOCKARRAY buffer; + JBLOCKROW buffer_ptr, prev_block_row, next_block_row; + JSAMPARRAY output_ptr; + JDIMENSION output_col; + jpeg_component_info *compptr; + inverse_DCT_method_ptr inverse_DCT; + boolean first_row, last_row; + JBLOCK workspace; + int *coef_bits; + JQUANT_TBL *quanttbl; + INT32 Q00,Q01,Q02,Q10,Q11,Q20, num; + int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9; + int Al, pred; + + /* Force some input to be done if we are getting ahead of the input. */ + while (cinfo->input_scan_number <= cinfo->output_scan_number && + ! cinfo->inputctl->eoi_reached) { + if (cinfo->input_scan_number == cinfo->output_scan_number) { + /* If input is working on current scan, we ordinarily want it to + * have completed the current row. But if input scan is DC, + * we want it to keep one row ahead so that next block row's DC + * values are up to date. + */ + JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0; + if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta) + break; + } + if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) + return JPEG_SUSPENDED; + } + + /* OK, output from the virtual arrays. */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Don't bother to IDCT an uninteresting component. */ + if (! compptr->component_needed) + continue; + /* Count non-dummy DCT block rows in this iMCU row. */ + if (cinfo->output_iMCU_row < last_iMCU_row) { + block_rows = compptr->v_samp_factor; + access_rows = block_rows * 2; /* this and next iMCU row */ + last_row = FALSE; + } else { + /* NB: can't use last_row_height here; it is input-side-dependent! */ + block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (block_rows == 0) block_rows = compptr->v_samp_factor; + access_rows = block_rows; /* this iMCU row only */ + last_row = TRUE; + } + /* Align the virtual buffer for this component. */ + if (cinfo->output_iMCU_row > 0) { + access_rows += compptr->v_samp_factor; /* prior iMCU row too */ + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor, + (JDIMENSION) access_rows, FALSE); + buffer += compptr->v_samp_factor; /* point to current iMCU row */ + first_row = FALSE; + } else { + buffer = (*cinfo->mem->access_virt_barray) + ((j_common_ptr) cinfo, coef->whole_image[ci], + (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE); + first_row = TRUE; + } + /* Fetch component-dependent info */ + coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS); + quanttbl = compptr->quant_table; + Q00 = quanttbl->quantval[0]; + Q01 = quanttbl->quantval[Q01_POS]; + Q10 = quanttbl->quantval[Q10_POS]; + Q20 = quanttbl->quantval[Q20_POS]; + Q11 = quanttbl->quantval[Q11_POS]; + Q02 = quanttbl->quantval[Q02_POS]; + inverse_DCT = cinfo->idct->inverse_DCT[ci]; + output_ptr = output_buf[ci]; + /* Loop over all DCT blocks to be processed. */ + for (block_row = 0; block_row < block_rows; block_row++) { + buffer_ptr = buffer[block_row]; + if (first_row && block_row == 0) + prev_block_row = buffer_ptr; + else + prev_block_row = buffer[block_row-1]; + if (last_row && block_row == block_rows-1) + next_block_row = buffer_ptr; + else + next_block_row = buffer[block_row+1]; + /* We fetch the surrounding DC values using a sliding-register approach. + * Initialize all nine here so as to do the right thing on narrow pics. + */ + DC1 = DC2 = DC3 = (int) prev_block_row[0][0]; + DC4 = DC5 = DC6 = (int) buffer_ptr[0][0]; + DC7 = DC8 = DC9 = (int) next_block_row[0][0]; + output_col = 0; + last_block_column = compptr->width_in_blocks - 1; + for (block_num = 0; block_num <= last_block_column; block_num++) { + /* Fetch current DCT block into workspace so we can modify it. */ + jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1); + /* Update DC values */ + if (block_num < last_block_column) { + DC3 = (int) prev_block_row[1][0]; + DC6 = (int) buffer_ptr[1][0]; + DC9 = (int) next_block_row[1][0]; + } + /* Compute coefficient estimates per K.8. + * An estimate is applied only if coefficient is still zero, + * and is not known to be fully accurate. + */ + /* AC01 */ + if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) { + num = 36 * Q00 * (DC4 - DC6); + if (num >= 0) { + pred = (int) (((Q01<<7) + num) / (Q01<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q10<<7) + num) / (Q10<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q20<<7) + num) / (Q20<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q11<<7) + num) / (Q11<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { + pred = (int) (((Q02<<7) + num) / (Q02<<8)); + if (Al > 0 && pred >= (1< 0 && pred >= (1<DCT_scaled_size; + } + output_ptr += compptr->DCT_scaled_size; + } + } + + if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) + return JPEG_ROW_COMPLETED; + return JPEG_SCAN_COMPLETED; +} + +#endif /* BLOCK_SMOOTHING_SUPPORTED */ + + +/* + * Initialize coefficient buffer controller. + */ + +GLOBAL(void) +jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer) +{ + my_coef_ptr coef; + + coef = (my_coef_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_coef_controller)); + cinfo->coef = (struct jpeg_d_coef_controller *) coef; + coef->pub.start_input_pass = start_input_pass; + coef->pub.start_output_pass = start_output_pass; +#ifdef BLOCK_SMOOTHING_SUPPORTED + coef->coef_bits_latch = NULL; +#endif + + /* Create the coefficient buffer. */ + if (need_full_buffer) { +#ifdef D_MULTISCAN_FILES_SUPPORTED + /* Allocate a full-image virtual array for each component, */ + /* padded to a multiple of samp_factor DCT blocks in each direction. */ + /* Note we ask for a pre-zeroed array. */ + int ci, access_rows; + jpeg_component_info *compptr; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + access_rows = compptr->v_samp_factor; +#ifdef BLOCK_SMOOTHING_SUPPORTED + /* If block smoothing could be used, need a bigger window */ + if (cinfo->progressive_mode) + access_rows *= 3; +#endif + coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE, + (JDIMENSION) jround_up((long) compptr->width_in_blocks, + (long) compptr->h_samp_factor), + (JDIMENSION) jround_up((long) compptr->height_in_blocks, + (long) compptr->v_samp_factor), + (JDIMENSION) access_rows); + } + coef->pub.consume_data = consume_data; + coef->pub.decompress_data = decompress_data; + coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */ +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + /* We only need a single-MCU buffer. */ + JBLOCKROW buffer; + int i; + + buffer = (JBLOCKROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); + for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) { + coef->MCU_buffer[i] = buffer + i; + } + coef->pub.consume_data = dummy_consume_data; + coef->pub.decompress_data = decompress_onepass; + coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */ + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdcolor.c b/third_party/windows/fltk-1.1.10/jpeg/jdcolor.c new file mode 100644 index 0000000..fd7b138 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdcolor.c @@ -0,0 +1,396 @@ +/* + * jdcolor.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains output colorspace conversion routines. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private subobject */ + +typedef struct { + struct jpeg_color_deconverter pub; /* public fields */ + + /* Private state for YCC->RGB conversion */ + int * Cr_r_tab; /* => table for Cr to R conversion */ + int * Cb_b_tab; /* => table for Cb to B conversion */ + INT32 * Cr_g_tab; /* => table for Cr to G conversion */ + INT32 * Cb_g_tab; /* => table for Cb to G conversion */ +} my_color_deconverter; + +typedef my_color_deconverter * my_cconvert_ptr; + + +/**************** YCbCr -> RGB conversion: most common case **************/ + +/* + * YCbCr is defined per CCIR 601-1, except that Cb and Cr are + * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. + * The conversion equations to be implemented are therefore + * R = Y + 1.40200 * Cr + * G = Y - 0.34414 * Cb - 0.71414 * Cr + * B = Y + 1.77200 * Cb + * where Cb and Cr represent the incoming values less CENTERJSAMPLE. + * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) + * + * To avoid floating-point arithmetic, we represent the fractional constants + * as integers scaled up by 2^16 (about 4 digits precision); we have to divide + * the products by 2^16, with appropriate rounding, to get the correct answer. + * Notice that Y, being an integral input, does not contribute any fraction + * so it need not participate in the rounding. + * + * For even more speed, we avoid doing any multiplications in the inner loop + * by precalculating the constants times Cb and Cr for all possible values. + * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table); + * for 12-bit samples it is still acceptable. It's not very reasonable for + * 16-bit samples, but if you want lossless storage you shouldn't be changing + * colorspace anyway. + * The Cr=>R and Cb=>B values can be rounded to integers in advance; the + * values for the G calculation are left scaled up, since we must add them + * together before rounding. + */ + +#define SCALEBITS 16 /* speediest right-shift on some machines */ +#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) +#define FIX(x) ((INT32) ((x) * (1L<RGB colorspace conversion. + */ + +LOCAL(void) +build_ycc_rgb_table (j_decompress_ptr cinfo) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + int i; + INT32 x; + SHIFT_TEMPS + + cconvert->Cr_r_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + cconvert->Cb_b_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + cconvert->Cr_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + cconvert->Cb_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + + for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { + /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ + /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ + /* Cr=>R value is nearest int to 1.40200 * x */ + cconvert->Cr_r_tab[i] = (int) + RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); + /* Cb=>B value is nearest int to 1.77200 * x */ + cconvert->Cb_b_tab[i] = (int) + RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); + /* Cr=>G value is scaled-up -0.71414 * x */ + cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x; + /* Cb=>G value is scaled-up -0.34414 * x */ + /* We also add in ONE_HALF so that need not do it in inner loop */ + cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; + } +} + + +/* + * Convert some rows of samples to the output colorspace. + * + * Note that we change from noninterleaved, one-plane-per-component format + * to interleaved-pixel format. The output buffer is therefore three times + * as wide as the input buffer. + * A starting row offset is provided only for the input buffer. The caller + * can easily adjust the passed output_buf value to accommodate any row + * offset required on that side. + */ + +METHODDEF(void) +ycc_rgb_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int y, cb, cr; + register JSAMPROW outptr; + register JSAMPROW inptr0, inptr1, inptr2; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + register int * Crrtab = cconvert->Cr_r_tab; + register int * Cbbtab = cconvert->Cb_b_tab; + register INT32 * Crgtab = cconvert->Cr_g_tab; + register INT32 * Cbgtab = cconvert->Cb_g_tab; + SHIFT_TEMPS + + while (--num_rows >= 0) { + inptr0 = input_buf[0][input_row]; + inptr1 = input_buf[1][input_row]; + inptr2 = input_buf[2][input_row]; + input_row++; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + y = GETJSAMPLE(inptr0[col]); + cb = GETJSAMPLE(inptr1[col]); + cr = GETJSAMPLE(inptr2[col]); + /* Range-limiting is essential due to noise introduced by DCT losses. */ + outptr[RGB_RED] = range_limit[y + Crrtab[cr]]; + outptr[RGB_GREEN] = range_limit[y + + ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], + SCALEBITS))]; + outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]]; + outptr += RGB_PIXELSIZE; + } + } +} + + +/**************** Cases other than YCbCr -> RGB **************/ + + +/* + * Color conversion for no colorspace change: just copy the data, + * converting from separate-planes to interleaved representation. + */ + +METHODDEF(void) +null_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + register JSAMPROW inptr, outptr; + register JDIMENSION count; + register int num_components = cinfo->num_components; + JDIMENSION num_cols = cinfo->output_width; + int ci; + + while (--num_rows >= 0) { + for (ci = 0; ci < num_components; ci++) { + inptr = input_buf[ci][input_row]; + outptr = output_buf[0] + ci; + for (count = num_cols; count > 0; count--) { + *outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */ + outptr += num_components; + } + } + input_row++; + output_buf++; + } +} + + +/* + * Color conversion for grayscale: just copy the data. + * This also works for YCbCr -> grayscale conversion, in which + * we just copy the Y (luminance) component and ignore chrominance. + */ + +METHODDEF(void) +grayscale_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0, + num_rows, cinfo->output_width); +} + + +/* + * Convert grayscale to RGB: just duplicate the graylevel three times. + * This is provided to support applications that don't want to cope + * with grayscale as a separate case. + */ + +METHODDEF(void) +gray_rgb_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + register JSAMPROW inptr, outptr; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + + while (--num_rows >= 0) { + inptr = input_buf[0][input_row++]; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + /* We can dispense with GETJSAMPLE() here */ + outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col]; + outptr += RGB_PIXELSIZE; + } + } +} + + +/* + * Adobe-style YCCK->CMYK conversion. + * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same + * conversion as above, while passing K (black) unchanged. + * We assume build_ycc_rgb_table has been called. + */ + +METHODDEF(void) +ycck_cmyk_convert (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows) +{ + my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; + register int y, cb, cr; + register JSAMPROW outptr; + register JSAMPROW inptr0, inptr1, inptr2, inptr3; + register JDIMENSION col; + JDIMENSION num_cols = cinfo->output_width; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + register int * Crrtab = cconvert->Cr_r_tab; + register int * Cbbtab = cconvert->Cb_b_tab; + register INT32 * Crgtab = cconvert->Cr_g_tab; + register INT32 * Cbgtab = cconvert->Cb_g_tab; + SHIFT_TEMPS + + while (--num_rows >= 0) { + inptr0 = input_buf[0][input_row]; + inptr1 = input_buf[1][input_row]; + inptr2 = input_buf[2][input_row]; + inptr3 = input_buf[3][input_row]; + input_row++; + outptr = *output_buf++; + for (col = 0; col < num_cols; col++) { + y = GETJSAMPLE(inptr0[col]); + cb = GETJSAMPLE(inptr1[col]); + cr = GETJSAMPLE(inptr2[col]); + /* Range-limiting is essential due to noise introduced by DCT losses. */ + outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */ + outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */ + ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], + SCALEBITS)))]; + outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])]; /* blue */ + /* K passes through unchanged */ + outptr[3] = inptr3[col]; /* don't need GETJSAMPLE here */ + outptr += 4; + } + } +} + + +/* + * Empty method for start_pass. + */ + +METHODDEF(void) +start_pass_dcolor (j_decompress_ptr cinfo) +{ + /* no work needed */ +} + + +/* + * Module initialization routine for output colorspace conversion. + */ + +GLOBAL(void) +jinit_color_deconverter (j_decompress_ptr cinfo) +{ + my_cconvert_ptr cconvert; + int ci; + + cconvert = (my_cconvert_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_color_deconverter)); + cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert; + cconvert->pub.start_pass = start_pass_dcolor; + + /* Make sure num_components agrees with jpeg_color_space */ + switch (cinfo->jpeg_color_space) { + case JCS_GRAYSCALE: + if (cinfo->num_components != 1) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + + case JCS_RGB: + case JCS_YCbCr: + if (cinfo->num_components != 3) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + + case JCS_CMYK: + case JCS_YCCK: + if (cinfo->num_components != 4) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + + default: /* JCS_UNKNOWN can be anything */ + if (cinfo->num_components < 1) + ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); + break; + } + + /* Set out_color_components and conversion method based on requested space. + * Also clear the component_needed flags for any unused components, + * so that earlier pipeline stages can avoid useless computation. + */ + + switch (cinfo->out_color_space) { + case JCS_GRAYSCALE: + cinfo->out_color_components = 1; + if (cinfo->jpeg_color_space == JCS_GRAYSCALE || + cinfo->jpeg_color_space == JCS_YCbCr) { + cconvert->pub.color_convert = grayscale_convert; + /* For color->grayscale conversion, only the Y (0) component is needed */ + for (ci = 1; ci < cinfo->num_components; ci++) + cinfo->comp_info[ci].component_needed = FALSE; + } else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_RGB: + cinfo->out_color_components = RGB_PIXELSIZE; + if (cinfo->jpeg_color_space == JCS_YCbCr) { + cconvert->pub.color_convert = ycc_rgb_convert; + build_ycc_rgb_table(cinfo); + } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) { + cconvert->pub.color_convert = gray_rgb_convert; + } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) { + cconvert->pub.color_convert = null_convert; + } else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + case JCS_CMYK: + cinfo->out_color_components = 4; + if (cinfo->jpeg_color_space == JCS_YCCK) { + cconvert->pub.color_convert = ycck_cmyk_convert; + build_ycc_rgb_table(cinfo); + } else if (cinfo->jpeg_color_space == JCS_CMYK) { + cconvert->pub.color_convert = null_convert; + } else + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + + default: + /* Permit null conversion to same output space */ + if (cinfo->out_color_space == cinfo->jpeg_color_space) { + cinfo->out_color_components = cinfo->num_components; + cconvert->pub.color_convert = null_convert; + } else /* unsupported non-null conversion */ + ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); + break; + } + + if (cinfo->quantize_colors) + cinfo->output_components = 1; /* single colormapped output component */ + else + cinfo->output_components = cinfo->out_color_components; +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdct.h b/third_party/windows/fltk-1.1.10/jpeg/jdct.h new file mode 100644 index 0000000..b664cab --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdct.h @@ -0,0 +1,176 @@ +/* + * jdct.h + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This include file contains common declarations for the forward and + * inverse DCT modules. These declarations are private to the DCT managers + * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms. + * The individual DCT algorithms are kept in separate files to ease + * machine-dependent tuning (e.g., assembly coding). + */ + + +/* + * A forward DCT routine is given a pointer to a work area of type DCTELEM[]; + * the DCT is to be performed in-place in that buffer. Type DCTELEM is int + * for 8-bit samples, INT32 for 12-bit samples. (NOTE: Floating-point DCT + * implementations use an array of type FAST_FLOAT, instead.) + * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE). + * The DCT outputs are returned scaled up by a factor of 8; they therefore + * have a range of +-8K for 8-bit data, +-128K for 12-bit data. This + * convention improves accuracy in integer implementations and saves some + * work in floating-point ones. + * Quantization of the output coefficients is done by jcdctmgr.c. + */ + +#if BITS_IN_JSAMPLE == 8 +typedef int DCTELEM; /* 16 or 32 bits is fine */ +#else +typedef INT32 DCTELEM; /* must have 32 bits */ +#endif + +typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data)); +typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data)); + + +/* + * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer + * to an output sample array. The routine must dequantize the input data as + * well as perform the IDCT; for dequantization, it uses the multiplier table + * pointed to by compptr->dct_table. The output data is to be placed into the + * sample array starting at a specified column. (Any row offset needed will + * be applied to the array pointer before it is passed to the IDCT code.) + * Note that the number of samples emitted by the IDCT routine is + * DCT_scaled_size * DCT_scaled_size. + */ + +/* typedef inverse_DCT_method_ptr is declared in jpegint.h */ + +/* + * Each IDCT routine has its own ideas about the best dct_table element type. + */ + +typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */ +#if BITS_IN_JSAMPLE == 8 +typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */ +#define IFAST_SCALE_BITS 2 /* fractional bits in scale factors */ +#else +typedef INT32 IFAST_MULT_TYPE; /* need 32 bits for scaled quantizers */ +#define IFAST_SCALE_BITS 13 /* fractional bits in scale factors */ +#endif +typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */ + + +/* + * Each IDCT routine is responsible for range-limiting its results and + * converting them to unsigned form (0..MAXJSAMPLE). The raw outputs could + * be quite far out of range if the input data is corrupt, so a bulletproof + * range-limiting step is required. We use a mask-and-table-lookup method + * to do the combined operations quickly. See the comments with + * prepare_range_limit_table (in jdmaster.c) for more info. + */ + +#define IDCT_range_limit(cinfo) ((cinfo)->sample_range_limit + CENTERJSAMPLE) + +#define RANGE_MASK (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */ + + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_fdct_islow jFDislow +#define jpeg_fdct_ifast jFDifast +#define jpeg_fdct_float jFDfloat +#define jpeg_idct_islow jRDislow +#define jpeg_idct_ifast jRDifast +#define jpeg_idct_float jRDfloat +#define jpeg_idct_4x4 jRD4x4 +#define jpeg_idct_2x2 jRD2x2 +#define jpeg_idct_1x1 jRD1x1 +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + +/* Extern declarations for the forward and inverse DCT routines. */ + +EXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data)); +EXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data)); +EXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data)); + +EXTERN(void) jpeg_idct_islow + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_ifast + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_float + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_4x4 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_2x2 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); +EXTERN(void) jpeg_idct_1x1 + JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); + + +/* + * Macros for handling fixed-point arithmetic; these are used by many + * but not all of the DCT/IDCT modules. + * + * All values are expected to be of type INT32. + * Fractional constants are scaled left by CONST_BITS bits. + * CONST_BITS is defined within each module using these macros, + * and may differ from one module to the next. + */ + +#define ONE ((INT32) 1) +#define CONST_SCALE (ONE << CONST_BITS) + +/* Convert a positive real constant to an integer scaled by CONST_SCALE. + * Caution: some C compilers fail to reduce "FIX(constant)" at compile time, + * thus causing a lot of useless floating-point operations at run time. + */ + +#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5)) + +/* Descale and correctly round an INT32 value that's scaled by N bits. + * We assume RIGHT_SHIFT rounds towards minus infinity, so adding + * the fudge factor is correct for either sign of X. + */ + +#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n) + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * This macro is used only when the two inputs will actually be no more than + * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a + * full 32x32 multiply. This provides a useful speedup on many machines. + * Unfortunately there is no way to specify a 16x16->32 multiply portably + * in C, but some C compilers will do the right thing if you provide the + * correct combination of casts. + */ + +#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ +#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT16) (const))) +#endif +#ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */ +#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT32) (const))) +#endif + +#ifndef MULTIPLY16C16 /* default definition */ +#define MULTIPLY16C16(var,const) ((var) * (const)) +#endif + +/* Same except both inputs are variables. */ + +#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ +#define MULTIPLY16V16(var1,var2) (((INT16) (var1)) * ((INT16) (var2))) +#endif + +#ifndef MULTIPLY16V16 /* default definition */ +#define MULTIPLY16V16(var1,var2) ((var1) * (var2)) +#endif diff --git a/third_party/windows/fltk-1.1.10/jpeg/jddctmgr.c b/third_party/windows/fltk-1.1.10/jpeg/jddctmgr.c new file mode 100644 index 0000000..0e44eb1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jddctmgr.c @@ -0,0 +1,269 @@ +/* + * jddctmgr.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the inverse-DCT management logic. + * This code selects a particular IDCT implementation to be used, + * and it performs related housekeeping chores. No code in this file + * is executed per IDCT step, only during output pass setup. + * + * Note that the IDCT routines are responsible for performing coefficient + * dequantization as well as the IDCT proper. This module sets up the + * dequantization multiplier table needed by the IDCT routine. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + + +/* + * The decompressor input side (jdinput.c) saves away the appropriate + * quantization table for each component at the start of the first scan + * involving that component. (This is necessary in order to correctly + * decode files that reuse Q-table slots.) + * When we are ready to make an output pass, the saved Q-table is converted + * to a multiplier table that will actually be used by the IDCT routine. + * The multiplier table contents are IDCT-method-dependent. To support + * application changes in IDCT method between scans, we can remake the + * multiplier tables if necessary. + * In buffered-image mode, the first output pass may occur before any data + * has been seen for some components, and thus before their Q-tables have + * been saved away. To handle this case, multiplier tables are preset + * to zeroes; the result of the IDCT will be a neutral gray level. + */ + + +/* Private subobject for this module */ + +typedef struct { + struct jpeg_inverse_dct pub; /* public fields */ + + /* This array contains the IDCT method code that each multiplier table + * is currently set up for, or -1 if it's not yet set up. + * The actual multiplier tables are pointed to by dct_table in the + * per-component comp_info structures. + */ + int cur_method[MAX_COMPONENTS]; +} my_idct_controller; + +typedef my_idct_controller * my_idct_ptr; + + +/* Allocated multiplier tables: big enough for any supported variant */ + +typedef union { + ISLOW_MULT_TYPE islow_array[DCTSIZE2]; +#ifdef DCT_IFAST_SUPPORTED + IFAST_MULT_TYPE ifast_array[DCTSIZE2]; +#endif +#ifdef DCT_FLOAT_SUPPORTED + FLOAT_MULT_TYPE float_array[DCTSIZE2]; +#endif +} multiplier_table; + + +/* The current scaled-IDCT routines require ISLOW-style multiplier tables, + * so be sure to compile that code if either ISLOW or SCALING is requested. + */ +#ifdef DCT_ISLOW_SUPPORTED +#define PROVIDE_ISLOW_TABLES +#else +#ifdef IDCT_SCALING_SUPPORTED +#define PROVIDE_ISLOW_TABLES +#endif +#endif + + +/* + * Prepare for an output pass. + * Here we select the proper IDCT routine for each component and build + * a matching multiplier table. + */ + +METHODDEF(void) +start_pass (j_decompress_ptr cinfo) +{ + my_idct_ptr idct = (my_idct_ptr) cinfo->idct; + int ci, i; + jpeg_component_info *compptr; + int method = 0; + inverse_DCT_method_ptr method_ptr = NULL; + JQUANT_TBL * qtbl; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Select the proper IDCT routine for this component's scaling */ + switch (compptr->DCT_scaled_size) { +#ifdef IDCT_SCALING_SUPPORTED + case 1: + method_ptr = jpeg_idct_1x1; + method = JDCT_ISLOW; /* jidctred uses islow-style table */ + break; + case 2: + method_ptr = jpeg_idct_2x2; + method = JDCT_ISLOW; /* jidctred uses islow-style table */ + break; + case 4: + method_ptr = jpeg_idct_4x4; + method = JDCT_ISLOW; /* jidctred uses islow-style table */ + break; +#endif + case DCTSIZE: + switch (cinfo->dct_method) { +#ifdef DCT_ISLOW_SUPPORTED + case JDCT_ISLOW: + method_ptr = jpeg_idct_islow; + method = JDCT_ISLOW; + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + method_ptr = jpeg_idct_ifast; + method = JDCT_IFAST; + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + method_ptr = jpeg_idct_float; + method = JDCT_FLOAT; + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + break; + default: + ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size); + break; + } + idct->pub.inverse_DCT[ci] = method_ptr; + /* Create multiplier table from quant table. + * However, we can skip this if the component is uninteresting + * or if we already built the table. Also, if no quant table + * has yet been saved for the component, we leave the + * multiplier table all-zero; we'll be reading zeroes from the + * coefficient controller's buffer anyway. + */ + if (! compptr->component_needed || idct->cur_method[ci] == method) + continue; + qtbl = compptr->quant_table; + if (qtbl == NULL) /* happens if no data yet for component */ + continue; + idct->cur_method[ci] = method; + switch (method) { +#ifdef PROVIDE_ISLOW_TABLES + case JDCT_ISLOW: + { + /* For LL&M IDCT method, multipliers are equal to raw quantization + * coefficients, but are stored as ints to ensure access efficiency. + */ + ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table; + for (i = 0; i < DCTSIZE2; i++) { + ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i]; + } + } + break; +#endif +#ifdef DCT_IFAST_SUPPORTED + case JDCT_IFAST: + { + /* For AA&N IDCT method, multipliers are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + * For integer operation, the multiplier table is to be scaled by + * IFAST_SCALE_BITS. + */ + IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table; +#define CONST_BITS 14 + static const INT16 aanscales[DCTSIZE2] = { + /* precomputed values scaled up by 14 bits */ + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, + 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, + 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, + 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, + 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, + 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, + 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 + }; + SHIFT_TEMPS + + for (i = 0; i < DCTSIZE2; i++) { + ifmtbl[i] = (IFAST_MULT_TYPE) + DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], + (INT32) aanscales[i]), + CONST_BITS-IFAST_SCALE_BITS); + } + } + break; +#endif +#ifdef DCT_FLOAT_SUPPORTED + case JDCT_FLOAT: + { + /* For float AA&N IDCT method, multipliers are equal to quantization + * coefficients scaled by scalefactor[row]*scalefactor[col], where + * scalefactor[0] = 1 + * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 + */ + FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table; + int row, col; + static const double aanscalefactor[DCTSIZE] = { + 1.0, 1.387039845, 1.306562965, 1.175875602, + 1.0, 0.785694958, 0.541196100, 0.275899379 + }; + + i = 0; + for (row = 0; row < DCTSIZE; row++) { + for (col = 0; col < DCTSIZE; col++) { + fmtbl[i] = (FLOAT_MULT_TYPE) + ((double) qtbl->quantval[i] * + aanscalefactor[row] * aanscalefactor[col]); + i++; + } + } + } + break; +#endif + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } + } +} + + +/* + * Initialize IDCT manager. + */ + +GLOBAL(void) +jinit_inverse_dct (j_decompress_ptr cinfo) +{ + my_idct_ptr idct; + int ci; + jpeg_component_info *compptr; + + idct = (my_idct_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_idct_controller)); + cinfo->idct = (struct jpeg_inverse_dct *) idct; + idct->pub.start_pass = start_pass; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Allocate and pre-zero a multiplier table for each component */ + compptr->dct_table = + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(multiplier_table)); + MEMZERO(compptr->dct_table, SIZEOF(multiplier_table)); + /* Mark multiplier table not yet set up for any method */ + idct->cur_method[ci] = -1; + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdhuff.c b/third_party/windows/fltk-1.1.10/jpeg/jdhuff.c new file mode 100644 index 0000000..b2ad66d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdhuff.c @@ -0,0 +1,651 @@ +/* + * jdhuff.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains Huffman entropy decoding routines. + * + * Much of the complexity here has to do with supporting input suspension. + * If the data source module demands suspension, we want to be able to back + * up to the start of the current MCU. To do this, we copy state variables + * into local working storage, and update them back to the permanent + * storage only upon successful completion of an MCU. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdhuff.h" /* Declarations shared with jdphuff.c */ + + +/* + * Expanded entropy decoder object for Huffman decoding. + * + * The savable_state subrecord contains fields that change within an MCU, + * but must not be updated permanently until we complete the MCU. + */ + +typedef struct { + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ +} savable_state; + +/* This macro is to work around compilers with missing or broken + * structure assignment. You'll need to fix this code if you have + * such a compiler and you change MAX_COMPS_IN_SCAN. + */ + +#ifndef NO_STRUCT_ASSIGN +#define ASSIGN_STATE(dest,src) ((dest) = (src)) +#else +#if MAX_COMPS_IN_SCAN == 4 +#define ASSIGN_STATE(dest,src) \ + ((dest).last_dc_val[0] = (src).last_dc_val[0], \ + (dest).last_dc_val[1] = (src).last_dc_val[1], \ + (dest).last_dc_val[2] = (src).last_dc_val[2], \ + (dest).last_dc_val[3] = (src).last_dc_val[3]) +#endif +#endif + + +typedef struct { + struct jpeg_entropy_decoder pub; /* public fields */ + + /* These fields are loaded into local variables at start of each MCU. + * In case of suspension, we exit WITHOUT updating them. + */ + bitread_perm_state bitstate; /* Bit buffer at start of MCU */ + savable_state saved; /* Other state at start of MCU */ + + /* These fields are NOT loaded into local working state. */ + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + + /* Pointers to derived tables (these workspaces have image lifespan) */ + d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; + d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; + + /* Precalculated info set up by start_pass for use in decode_mcu: */ + + /* Pointers to derived tables to be used for each block within an MCU */ + d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU]; + d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU]; + /* Whether we care about the DC and AC coefficient values for each block */ + boolean dc_needed[D_MAX_BLOCKS_IN_MCU]; + boolean ac_needed[D_MAX_BLOCKS_IN_MCU]; +} huff_entropy_decoder; + +typedef huff_entropy_decoder * huff_entropy_ptr; + + +/* + * Initialize for a Huffman-compressed scan. + */ + +METHODDEF(void) +start_pass_huff_decoder (j_decompress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci, blkn, dctbl, actbl; + jpeg_component_info * compptr; + + /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG. + * This ought to be an error condition, but we make it a warning because + * there are some baseline files out there with all zeroes in these bytes. + */ + if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 || + cinfo->Ah != 0 || cinfo->Al != 0) + WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + dctbl = compptr->dc_tbl_no; + actbl = compptr->ac_tbl_no; + /* Compute derived values for Huffman tables */ + /* We may do this more than once for a table, but it's not expensive */ + jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl, + & entropy->dc_derived_tbls[dctbl]); + jpeg_make_d_derived_tbl(cinfo, FALSE, actbl, + & entropy->ac_derived_tbls[actbl]); + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + + /* Precalculate decoding info for each block in an MCU of this scan */ + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + /* Precalculate which table to use for each block */ + entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no]; + entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no]; + /* Decide whether we really care about the coefficient values */ + if (compptr->component_needed) { + entropy->dc_needed[blkn] = TRUE; + /* we don't need the ACs if producing a 1/8th-size image */ + entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1); + } else { + entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE; + } + } + + /* Initialize bitread state variables */ + entropy->bitstate.bits_left = 0; + entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ + entropy->pub.insufficient_data = FALSE; + + /* Initialize restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Compute the derived values for a Huffman table. + * This routine also performs some validation checks on the table. + * + * Note this is also used by jdphuff.c. + */ + +GLOBAL(void) +jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno, + d_derived_tbl ** pdtbl) +{ + JHUFF_TBL *htbl; + d_derived_tbl *dtbl; + int p, i, l, si, numsymbols; + int lookbits, ctr; + char huffsize[257]; + unsigned int huffcode[257]; + unsigned int code; + + /* Note that huffsize[] and huffcode[] are filled in code-length order, + * paralleling the order of the symbols themselves in htbl->huffval[]. + */ + + /* Find the input Huffman table */ + if (tblno < 0 || tblno >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + htbl = + isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno]; + if (htbl == NULL) + ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); + + /* Allocate a workspace if we haven't already done so. */ + if (*pdtbl == NULL) + *pdtbl = (d_derived_tbl *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(d_derived_tbl)); + dtbl = *pdtbl; + dtbl->pub = htbl; /* fill in back link */ + + /* Figure C.1: make table of Huffman code length for each symbol */ + + p = 0; + for (l = 1; l <= 16; l++) { + i = (int) htbl->bits[l]; + if (i < 0 || p + i > 256) /* protect against table overrun */ + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + while (i--) + huffsize[p++] = (char) l; + } + huffsize[p] = 0; + numsymbols = p; + + /* Figure C.2: generate the codes themselves */ + /* We also validate that the counts represent a legal Huffman code tree. */ + + code = 0; + si = huffsize[0]; + p = 0; + while (huffsize[p]) { + while (((int) huffsize[p]) == si) { + huffcode[p++] = code; + code++; + } + /* code is now 1 more than the last code used for codelength si; but + * it must still fit in si bits, since no code is allowed to be all ones. + */ + if (((INT32) code) >= (((INT32) 1) << si)) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + code <<= 1; + si++; + } + + /* Figure F.15: generate decoding tables for bit-sequential decoding */ + + p = 0; + for (l = 1; l <= 16; l++) { + if (htbl->bits[l]) { + /* valoffset[l] = huffval[] index of 1st symbol of code length l, + * minus the minimum code of length l + */ + dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p]; + p += htbl->bits[l]; + dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */ + } else { + dtbl->maxcode[l] = -1; /* -1 if no codes of this length */ + } + } + dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */ + + /* Compute lookahead tables to speed up decoding. + * First we set all the table entries to 0, indicating "too long"; + * then we iterate through the Huffman codes that are short enough and + * fill in all the entries that correspond to bit sequences starting + * with that code. + */ + + MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits)); + + p = 0; + for (l = 1; l <= HUFF_LOOKAHEAD; l++) { + for (i = 1; i <= (int) htbl->bits[l]; i++, p++) { + /* l = current code's length, p = its index in huffcode[] & huffval[]. */ + /* Generate left-justified code followed by all possible bit sequences */ + lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l); + for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) { + dtbl->look_nbits[lookbits] = l; + dtbl->look_sym[lookbits] = htbl->huffval[p]; + lookbits++; + } + } + } + + /* Validate symbols as being reasonable. + * For AC tables, we make no check, but accept all byte values 0..255. + * For DC tables, we require the symbols to be in range 0..15. + * (Tighter bounds could be applied depending on the data depth and mode, + * but this is sufficient to ensure safe decoding.) + */ + if (isDC) { + for (i = 0; i < numsymbols; i++) { + int sym = htbl->huffval[i]; + if (sym < 0 || sym > 15) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + } + } +} + + +/* + * Out-of-line code for bit fetching (shared with jdphuff.c). + * See jdhuff.h for info about usage. + * Note: current values of get_buffer and bits_left are passed as parameters, + * but are returned in the corresponding fields of the state struct. + * + * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width + * of get_buffer to be used. (On machines with wider words, an even larger + * buffer could be used.) However, on some machines 32-bit shifts are + * quite slow and take time proportional to the number of places shifted. + * (This is true with most PC compilers, for instance.) In this case it may + * be a win to set MIN_GET_BITS to the minimum value of 15. This reduces the + * average shift distance at the cost of more calls to jpeg_fill_bit_buffer. + */ + +#ifdef SLOW_SHIFT_32 +#define MIN_GET_BITS 15 /* minimum allowable value */ +#else +#define MIN_GET_BITS (BIT_BUF_SIZE-7) +#endif + + +GLOBAL(boolean) +jpeg_fill_bit_buffer (bitread_working_state * state, + register bit_buf_type get_buffer, register int bits_left, + int nbits) +/* Load up the bit buffer to a depth of at least nbits */ +{ + /* Copy heavily used state fields into locals (hopefully registers) */ + register const JOCTET * next_input_byte = state->next_input_byte; + register size_t bytes_in_buffer = state->bytes_in_buffer; + j_decompress_ptr cinfo = state->cinfo; + + /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */ + /* (It is assumed that no request will be for more than that many bits.) */ + /* We fail to do so only if we hit a marker or are forced to suspend. */ + + if (cinfo->unread_marker == 0) { /* cannot advance past a marker */ + while (bits_left < MIN_GET_BITS) { + register int c; + + /* Attempt to read a byte */ + if (bytes_in_buffer == 0) { + if (! (*cinfo->src->fill_input_buffer) (cinfo)) + return FALSE; + next_input_byte = cinfo->src->next_input_byte; + bytes_in_buffer = cinfo->src->bytes_in_buffer; + } + bytes_in_buffer--; + c = GETJOCTET(*next_input_byte++); + + /* If it's 0xFF, check and discard stuffed zero byte */ + if (c == 0xFF) { + /* Loop here to discard any padding FF's on terminating marker, + * so that we can save a valid unread_marker value. NOTE: we will + * accept multiple FF's followed by a 0 as meaning a single FF data + * byte. This data pattern is not valid according to the standard. + */ + do { + if (bytes_in_buffer == 0) { + if (! (*cinfo->src->fill_input_buffer) (cinfo)) + return FALSE; + next_input_byte = cinfo->src->next_input_byte; + bytes_in_buffer = cinfo->src->bytes_in_buffer; + } + bytes_in_buffer--; + c = GETJOCTET(*next_input_byte++); + } while (c == 0xFF); + + if (c == 0) { + /* Found FF/00, which represents an FF data byte */ + c = 0xFF; + } else { + /* Oops, it's actually a marker indicating end of compressed data. + * Save the marker code for later use. + * Fine point: it might appear that we should save the marker into + * bitread working state, not straight into permanent state. But + * once we have hit a marker, we cannot need to suspend within the + * current MCU, because we will read no more bytes from the data + * source. So it is OK to update permanent state right away. + */ + cinfo->unread_marker = c; + /* See if we need to insert some fake zero bits. */ + goto no_more_bytes; + } + } + + /* OK, load c into get_buffer */ + get_buffer = (get_buffer << 8) | c; + bits_left += 8; + } /* end while */ + } else { + no_more_bytes: + /* We get here if we've read the marker that terminates the compressed + * data segment. There should be enough bits in the buffer register + * to satisfy the request; if so, no problem. + */ + if (nbits > bits_left) { + /* Uh-oh. Report corrupted data to user and stuff zeroes into + * the data stream, so that we can produce some kind of image. + * We use a nonvolatile flag to ensure that only one warning message + * appears per data segment. + */ + if (! cinfo->entropy->insufficient_data) { + WARNMS(cinfo, JWRN_HIT_MARKER); + cinfo->entropy->insufficient_data = TRUE; + } + /* Fill the buffer with zero bits */ + get_buffer <<= MIN_GET_BITS - bits_left; + bits_left = MIN_GET_BITS; + } + } + + /* Unload the local registers */ + state->next_input_byte = next_input_byte; + state->bytes_in_buffer = bytes_in_buffer; + state->get_buffer = get_buffer; + state->bits_left = bits_left; + + return TRUE; +} + + +/* + * Out-of-line code for Huffman code decoding. + * See jdhuff.h for info about usage. + */ + +GLOBAL(int) +jpeg_huff_decode (bitread_working_state * state, + register bit_buf_type get_buffer, register int bits_left, + d_derived_tbl * htbl, int min_bits) +{ + register int l = min_bits; + register INT32 code; + + /* HUFF_DECODE has determined that the code is at least min_bits */ + /* bits long, so fetch that many bits in one swoop. */ + + CHECK_BIT_BUFFER(*state, l, return -1); + code = GET_BITS(l); + + /* Collect the rest of the Huffman code one bit at a time. */ + /* This is per Figure F.16 in the JPEG spec. */ + + while (code > htbl->maxcode[l]) { + code <<= 1; + CHECK_BIT_BUFFER(*state, 1, return -1); + code |= GET_BITS(1); + l++; + } + + /* Unload the local registers */ + state->get_buffer = get_buffer; + state->bits_left = bits_left; + + /* With garbage input we may reach the sentinel value l = 17. */ + + if (l > 16) { + WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE); + return 0; /* fake a zero as the safest result */ + } + + return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ]; +} + + +/* + * Figure F.12: extend sign bit. + * On some machines, a shift and add will be faster than a table lookup. + */ + +#ifdef AVOID_TABLES + +#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x)) + +#else + +#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x)) + +static const int extend_test[16] = /* entry n is 2**(n-1) */ + { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, + 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; + +static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */ + { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, + ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, + ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, + ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; + +#endif /* AVOID_TABLES */ + + +/* + * Check for a restart marker & resynchronize decoder. + * Returns FALSE if must suspend. + */ + +LOCAL(boolean) +process_restart (j_decompress_ptr cinfo) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int ci; + + /* Throw away any unused bits remaining in bit buffer; */ + /* include any full bytes in next_marker's count of discarded bytes */ + cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8; + entropy->bitstate.bits_left = 0; + + /* Advance past the RSTn marker */ + if (! (*cinfo->marker->read_restart_marker) (cinfo)) + return FALSE; + + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + entropy->saved.last_dc_val[ci] = 0; + + /* Reset restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; + + /* Reset out-of-data flag, unless read_restart_marker left us smack up + * against a marker. In that case we will end up treating the next data + * segment as empty, and we can avoid producing bogus output pixels by + * leaving the flag set. + */ + if (cinfo->unread_marker == 0) + entropy->pub.insufficient_data = FALSE; + + return TRUE; +} + + +/* + * Decode and return one MCU's worth of Huffman-compressed coefficients. + * The coefficients are reordered from zigzag order into natural array order, + * but are not dequantized. + * + * The i'th block of the MCU is stored into the block pointed to by + * MCU_data[i]. WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER. + * (Wholesale zeroing is usually a little faster than retail...) + * + * Returns FALSE if data source requested suspension. In that case no + * changes have been made to permanent state. (Exception: some output + * coefficients may already have been assigned. This is harmless for + * this module, since we'll just re-assign them on the next call.) + */ + +METHODDEF(boolean) +decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; + int blkn; + BITREAD_STATE_VARS; + savable_state state; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->pub.insufficient_data) { + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(state, entropy->saved); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + JBLOCKROW block = MCU_data[blkn]; + d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn]; + d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn]; + register int s, k, r; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + HUFF_DECODE(s, br_state, dctbl, return FALSE, label1); + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + + if (entropy->dc_needed[blkn]) { + /* Convert DC difference to actual value, update last_dc_val */ + int ci = cinfo->MCU_membership[blkn]; + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */ + (*block)[0] = (JCOEF) s; + } + + if (entropy->ac_needed[blkn]) { + + /* Section F.2.2.2: decode the AC coefficients */ + /* Since zeroes are skipped, output area must be cleared beforehand */ + for (k = 1; k < DCTSIZE2; k++) { + HUFF_DECODE(s, br_state, actbl, return FALSE, label2); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + /* Output coefficient in natural (dezigzagged) order. + * Note: the extra entries in jpeg_natural_order[] will save us + * if k >= DCTSIZE2, which could happen if the data is corrupted. + */ + (*block)[jpeg_natural_order[k]] = (JCOEF) s; + } else { + if (r != 15) + break; + k += 15; + } + } + + } else { + + /* Section F.2.2.2: decode the AC coefficients */ + /* In this path we just discard the values */ + for (k = 1; k < DCTSIZE2; k++) { + HUFF_DECODE(s, br_state, actbl, return FALSE, label3); + + r = s >> 4; + s &= 15; + + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + DROP_BITS(s); + } else { + if (r != 15) + break; + k += 15; + } + } + + } + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(entropy->saved, state); + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * Module initialization routine for Huffman entropy decoding. + */ + +GLOBAL(void) +jinit_huff_decoder (j_decompress_ptr cinfo) +{ + huff_entropy_ptr entropy; + int i; + + entropy = (huff_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(huff_entropy_decoder)); + cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; + entropy->pub.start_pass = start_pass_huff_decoder; + entropy->pub.decode_mcu = decode_mcu; + + /* Mark tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdhuff.h b/third_party/windows/fltk-1.1.10/jpeg/jdhuff.h new file mode 100644 index 0000000..12c0747 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdhuff.h @@ -0,0 +1,201 @@ +/* + * jdhuff.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains declarations for Huffman entropy decoding routines + * that are shared between the sequential decoder (jdhuff.c) and the + * progressive decoder (jdphuff.c). No other modules need to see these. + */ + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_make_d_derived_tbl jMkDDerived +#define jpeg_fill_bit_buffer jFilBitBuf +#define jpeg_huff_decode jHufDecode +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Derived data constructed for each Huffman table */ + +#define HUFF_LOOKAHEAD 8 /* # of bits of lookahead */ + +typedef struct { + /* Basic tables: (element [0] of each array is unused) */ + INT32 maxcode[18]; /* largest code of length k (-1 if none) */ + /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */ + INT32 valoffset[17]; /* huffval[] offset for codes of length k */ + /* valoffset[k] = huffval[] index of 1st symbol of code length k, less + * the smallest code of length k; so given a code of length k, the + * corresponding symbol is huffval[code + valoffset[k]] + */ + + /* Link to public Huffman table (needed only in jpeg_huff_decode) */ + JHUFF_TBL *pub; + + /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of + * the input data stream. If the next Huffman code is no more + * than HUFF_LOOKAHEAD bits long, we can obtain its length and + * the corresponding symbol directly from these tables. + */ + int look_nbits[1< 32 bits on your machine, and shifting/masking longs is + * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE + * appropriately should be a win. Unfortunately we can't define the size + * with something like #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8) + * because not all machines measure sizeof in 8-bit bytes. + */ + +typedef struct { /* Bitreading state saved across MCUs */ + bit_buf_type get_buffer; /* current bit-extraction buffer */ + int bits_left; /* # of unused bits in it */ +} bitread_perm_state; + +typedef struct { /* Bitreading working state within an MCU */ + /* Current data source location */ + /* We need a copy, rather than munging the original, in case of suspension */ + const JOCTET * next_input_byte; /* => next byte to read from source */ + size_t bytes_in_buffer; /* # of bytes remaining in source buffer */ + /* Bit input buffer --- note these values are kept in register variables, + * not in this struct, inside the inner loops. + */ + bit_buf_type get_buffer; /* current bit-extraction buffer */ + int bits_left; /* # of unused bits in it */ + /* Pointer needed by jpeg_fill_bit_buffer. */ + j_decompress_ptr cinfo; /* back link to decompress master record */ +} bitread_working_state; + +/* Macros to declare and load/save bitread local variables. */ +#define BITREAD_STATE_VARS \ + register bit_buf_type get_buffer; \ + register int bits_left; \ + bitread_working_state br_state + +#define BITREAD_LOAD_STATE(cinfop,permstate) \ + br_state.cinfo = cinfop; \ + br_state.next_input_byte = cinfop->src->next_input_byte; \ + br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \ + get_buffer = permstate.get_buffer; \ + bits_left = permstate.bits_left; + +#define BITREAD_SAVE_STATE(cinfop,permstate) \ + cinfop->src->next_input_byte = br_state.next_input_byte; \ + cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \ + permstate.get_buffer = get_buffer; \ + permstate.bits_left = bits_left + +/* + * These macros provide the in-line portion of bit fetching. + * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer + * before using GET_BITS, PEEK_BITS, or DROP_BITS. + * The variables get_buffer and bits_left are assumed to be locals, + * but the state struct might not be (jpeg_huff_decode needs this). + * CHECK_BIT_BUFFER(state,n,action); + * Ensure there are N bits in get_buffer; if suspend, take action. + * val = GET_BITS(n); + * Fetch next N bits. + * val = PEEK_BITS(n); + * Fetch next N bits without removing them from the buffer. + * DROP_BITS(n); + * Discard next N bits. + * The value N should be a simple variable, not an expression, because it + * is evaluated multiple times. + */ + +#define CHECK_BIT_BUFFER(state,nbits,action) \ + { if (bits_left < (nbits)) { \ + if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits)) \ + { action; } \ + get_buffer = (state).get_buffer; bits_left = (state).bits_left; } } + +#define GET_BITS(nbits) \ + (((int) (get_buffer >> (bits_left -= (nbits)))) & ((1<<(nbits))-1)) + +#define PEEK_BITS(nbits) \ + (((int) (get_buffer >> (bits_left - (nbits)))) & ((1<<(nbits))-1)) + +#define DROP_BITS(nbits) \ + (bits_left -= (nbits)) + +/* Load up the bit buffer to a depth of at least nbits */ +EXTERN(boolean) jpeg_fill_bit_buffer + JPP((bitread_working_state * state, register bit_buf_type get_buffer, + register int bits_left, int nbits)); + + +/* + * Code for extracting next Huffman-coded symbol from input bit stream. + * Again, this is time-critical and we make the main paths be macros. + * + * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits + * without looping. Usually, more than 95% of the Huffman codes will be 8 + * or fewer bits long. The few overlength codes are handled with a loop, + * which need not be inline code. + * + * Notes about the HUFF_DECODE macro: + * 1. Near the end of the data segment, we may fail to get enough bits + * for a lookahead. In that case, we do it the hard way. + * 2. If the lookahead table contains no entry, the next code must be + * more than HUFF_LOOKAHEAD bits long. + * 3. jpeg_huff_decode returns -1 if forced to suspend. + */ + +#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \ +{ register int nb, look; \ + if (bits_left < HUFF_LOOKAHEAD) { \ + if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \ + get_buffer = state.get_buffer; bits_left = state.bits_left; \ + if (bits_left < HUFF_LOOKAHEAD) { \ + nb = 1; goto slowlabel; \ + } \ + } \ + look = PEEK_BITS(HUFF_LOOKAHEAD); \ + if ((nb = htbl->look_nbits[look]) != 0) { \ + DROP_BITS(nb); \ + result = htbl->look_sym[look]; \ + } else { \ + nb = HUFF_LOOKAHEAD+1; \ +slowlabel: \ + if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \ + { failaction; } \ + get_buffer = state.get_buffer; bits_left = state.bits_left; \ + } \ +} + +/* Out-of-line case for Huffman code fetching */ +EXTERN(int) jpeg_huff_decode + JPP((bitread_working_state * state, register bit_buf_type get_buffer, + register int bits_left, d_derived_tbl * htbl, int min_bits)); diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdinput.c b/third_party/windows/fltk-1.1.10/jpeg/jdinput.c new file mode 100644 index 0000000..2d5c747 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdinput.c @@ -0,0 +1,381 @@ +/* + * jdinput.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains input control logic for the JPEG decompressor. + * These routines are concerned with controlling the decompressor's input + * processing (marker reading and coefficient decoding). The actual input + * reading is done in jdmarker.c, jdhuff.c, and jdphuff.c. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private state */ + +typedef struct { + struct jpeg_input_controller pub; /* public fields */ + + boolean inheaders; /* TRUE until first SOS is reached */ +} my_input_controller; + +typedef my_input_controller * my_inputctl_ptr; + + +/* Forward declarations */ +METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo)); + + +/* + * Routines to calculate various quantities related to the size of the image. + */ + +LOCAL(void) +initial_setup (j_decompress_ptr cinfo) +/* Called once, when first SOS marker is reached */ +{ + int ci; + jpeg_component_info *compptr; + + /* Make sure image isn't bigger than I can handle */ + if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION || + (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION) + ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); + + /* For now, precision must match compiled-in value... */ + if (cinfo->data_precision != BITS_IN_JSAMPLE) + ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); + + /* Check that number of components won't exceed internal array sizes */ + if (cinfo->num_components > MAX_COMPONENTS) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, + MAX_COMPONENTS); + + /* Compute maximum sampling factors; check factor validity */ + cinfo->max_h_samp_factor = 1; + cinfo->max_v_samp_factor = 1; + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || + compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) + ERREXIT(cinfo, JERR_BAD_SAMPLING); + cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, + compptr->h_samp_factor); + cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, + compptr->v_samp_factor); + } + + /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE. + * In the full decompressor, this will be overridden by jdmaster.c; + * but in the transcoder, jdmaster.c is not used, so we must do it here. + */ + cinfo->min_DCT_scaled_size = DCTSIZE; + + /* Compute dimensions of components */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->DCT_scaled_size = DCTSIZE; + /* Size in DCT blocks */ + compptr->width_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, + (long) (cinfo->max_h_samp_factor * DCTSIZE)); + compptr->height_in_blocks = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, + (long) (cinfo->max_v_samp_factor * DCTSIZE)); + /* downsampled_width and downsampled_height will also be overridden by + * jdmaster.c if we are doing full decompression. The transcoder library + * doesn't use these values, but the calling application might. + */ + /* Size in samples */ + compptr->downsampled_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, + (long) cinfo->max_h_samp_factor); + compptr->downsampled_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, + (long) cinfo->max_v_samp_factor); + /* Mark component needed, until color conversion says otherwise */ + compptr->component_needed = TRUE; + /* Mark no quantization table yet saved for component */ + compptr->quant_table = NULL; + } + + /* Compute number of fully interleaved MCU rows. */ + cinfo->total_iMCU_rows = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, + (long) (cinfo->max_v_samp_factor*DCTSIZE)); + + /* Decide whether file contains multiple scans */ + if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode) + cinfo->inputctl->has_multiple_scans = TRUE; + else + cinfo->inputctl->has_multiple_scans = FALSE; +} + + +LOCAL(void) +per_scan_setup (j_decompress_ptr cinfo) +/* Do computations that are needed before processing a JPEG scan */ +/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */ +{ + int ci, mcublks, tmp; + jpeg_component_info *compptr; + + if (cinfo->comps_in_scan == 1) { + + /* Noninterleaved (single-component) scan */ + compptr = cinfo->cur_comp_info[0]; + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = compptr->width_in_blocks; + cinfo->MCU_rows_in_scan = compptr->height_in_blocks; + + /* For noninterleaved scan, always one block per MCU */ + compptr->MCU_width = 1; + compptr->MCU_height = 1; + compptr->MCU_blocks = 1; + compptr->MCU_sample_width = compptr->DCT_scaled_size; + compptr->last_col_width = 1; + /* For noninterleaved scans, it is convenient to define last_row_height + * as the number of block rows present in the last iMCU row. + */ + tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); + if (tmp == 0) tmp = compptr->v_samp_factor; + compptr->last_row_height = tmp; + + /* Prepare array describing MCU composition */ + cinfo->blocks_in_MCU = 1; + cinfo->MCU_membership[0] = 0; + + } else { + + /* Interleaved (multi-component) scan */ + if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) + ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, + MAX_COMPS_IN_SCAN); + + /* Overall image size in MCUs */ + cinfo->MCUs_per_row = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, + (long) (cinfo->max_h_samp_factor*DCTSIZE)); + cinfo->MCU_rows_in_scan = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, + (long) (cinfo->max_v_samp_factor*DCTSIZE)); + + cinfo->blocks_in_MCU = 0; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Sampling factors give # of blocks of component in each MCU */ + compptr->MCU_width = compptr->h_samp_factor; + compptr->MCU_height = compptr->v_samp_factor; + compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; + compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size; + /* Figure number of non-dummy blocks in last MCU column & row */ + tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); + if (tmp == 0) tmp = compptr->MCU_width; + compptr->last_col_width = tmp; + tmp = (int) (compptr->height_in_blocks % compptr->MCU_height); + if (tmp == 0) tmp = compptr->MCU_height; + compptr->last_row_height = tmp; + /* Prepare array describing MCU composition */ + mcublks = compptr->MCU_blocks; + if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU) + ERREXIT(cinfo, JERR_BAD_MCU_SIZE); + while (mcublks-- > 0) { + cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; + } + } + + } +} + + +/* + * Save away a copy of the Q-table referenced by each component present + * in the current scan, unless already saved during a prior scan. + * + * In a multiple-scan JPEG file, the encoder could assign different components + * the same Q-table slot number, but change table definitions between scans + * so that each component uses a different Q-table. (The IJG encoder is not + * currently capable of doing this, but other encoders might.) Since we want + * to be able to dequantize all the components at the end of the file, this + * means that we have to save away the table actually used for each component. + * We do this by copying the table at the start of the first scan containing + * the component. + * The JPEG spec prohibits the encoder from changing the contents of a Q-table + * slot between scans of a component using that slot. If the encoder does so + * anyway, this decoder will simply use the Q-table values that were current + * at the start of the first scan for the component. + * + * The decompressor output side looks only at the saved quant tables, + * not at the current Q-table slots. + */ + +LOCAL(void) +latch_quant_tables (j_decompress_ptr cinfo) +{ + int ci, qtblno; + jpeg_component_info *compptr; + JQUANT_TBL * qtbl; + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* No work if we already saved Q-table for this component */ + if (compptr->quant_table != NULL) + continue; + /* Make sure specified quantization table is present */ + qtblno = compptr->quant_tbl_no; + if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || + cinfo->quant_tbl_ptrs[qtblno] == NULL) + ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); + /* OK, save away the quantization table */ + qtbl = (JQUANT_TBL *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(JQUANT_TBL)); + MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL)); + compptr->quant_table = qtbl; + } +} + + +/* + * Initialize the input modules to read a scan of compressed data. + * The first call to this is done by jdmaster.c after initializing + * the entire decompressor (during jpeg_start_decompress). + * Subsequent calls come from consume_markers, below. + */ + +METHODDEF(void) +start_input_pass (j_decompress_ptr cinfo) +{ + per_scan_setup(cinfo); + latch_quant_tables(cinfo); + (*cinfo->entropy->start_pass) (cinfo); + (*cinfo->coef->start_input_pass) (cinfo); + cinfo->inputctl->consume_input = cinfo->coef->consume_data; +} + + +/* + * Finish up after inputting a compressed-data scan. + * This is called by the coefficient controller after it's read all + * the expected data of the scan. + */ + +METHODDEF(void) +finish_input_pass (j_decompress_ptr cinfo) +{ + cinfo->inputctl->consume_input = consume_markers; +} + + +/* + * Read JPEG markers before, between, or after compressed-data scans. + * Change state as necessary when a new scan is reached. + * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. + * + * The consume_input method pointer points either here or to the + * coefficient controller's consume_data routine, depending on whether + * we are reading a compressed data segment or inter-segment markers. + */ + +METHODDEF(int) +consume_markers (j_decompress_ptr cinfo) +{ + my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; + int val; + + if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */ + return JPEG_REACHED_EOI; + + val = (*cinfo->marker->read_markers) (cinfo); + + switch (val) { + case JPEG_REACHED_SOS: /* Found SOS */ + if (inputctl->inheaders) { /* 1st SOS */ + initial_setup(cinfo); + inputctl->inheaders = FALSE; + /* Note: start_input_pass must be called by jdmaster.c + * before any more input can be consumed. jdapimin.c is + * responsible for enforcing this sequencing. + */ + } else { /* 2nd or later SOS marker */ + if (! inputctl->pub.has_multiple_scans) + ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */ + start_input_pass(cinfo); + } + break; + case JPEG_REACHED_EOI: /* Found EOI */ + inputctl->pub.eoi_reached = TRUE; + if (inputctl->inheaders) { /* Tables-only datastream, apparently */ + if (cinfo->marker->saw_SOF) + ERREXIT(cinfo, JERR_SOF_NO_SOS); + } else { + /* Prevent infinite loop in coef ctlr's decompress_data routine + * if user set output_scan_number larger than number of scans. + */ + if (cinfo->output_scan_number > cinfo->input_scan_number) + cinfo->output_scan_number = cinfo->input_scan_number; + } + break; + case JPEG_SUSPENDED: + break; + } + + return val; +} + + +/* + * Reset state to begin a fresh datastream. + */ + +METHODDEF(void) +reset_input_controller (j_decompress_ptr cinfo) +{ + my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; + + inputctl->pub.consume_input = consume_markers; + inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ + inputctl->pub.eoi_reached = FALSE; + inputctl->inheaders = TRUE; + /* Reset other modules */ + (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); + (*cinfo->marker->reset_marker_reader) (cinfo); + /* Reset progression state -- would be cleaner if entropy decoder did this */ + cinfo->coef_bits = NULL; +} + + +/* + * Initialize the input controller module. + * This is called only once, when the decompression object is created. + */ + +GLOBAL(void) +jinit_input_controller (j_decompress_ptr cinfo) +{ + my_inputctl_ptr inputctl; + + /* Create subobject in permanent pool */ + inputctl = (my_inputctl_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_input_controller)); + cinfo->inputctl = (struct jpeg_input_controller *) inputctl; + /* Initialize method pointers */ + inputctl->pub.consume_input = consume_markers; + inputctl->pub.reset_input_controller = reset_input_controller; + inputctl->pub.start_input_pass = start_input_pass; + inputctl->pub.finish_input_pass = finish_input_pass; + /* Initialize state: can't use reset_input_controller since we don't + * want to try to reset other modules yet. + */ + inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ + inputctl->pub.eoi_reached = FALSE; + inputctl->inheaders = TRUE; +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdmainct.c b/third_party/windows/fltk-1.1.10/jpeg/jdmainct.c new file mode 100644 index 0000000..c19f973 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdmainct.c @@ -0,0 +1,512 @@ +/* + * jdmainct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the main buffer controller for decompression. + * The main buffer lies between the JPEG decompressor proper and the + * post-processor; it holds downsampled data in the JPEG colorspace. + * + * Note that this code is bypassed in raw-data mode, since the application + * supplies the equivalent of the main buffer in that case. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * In the current system design, the main buffer need never be a full-image + * buffer; any full-height buffers will be found inside the coefficient or + * postprocessing controllers. Nonetheless, the main controller is not + * trivial. Its responsibility is to provide context rows for upsampling/ + * rescaling, and doing this in an efficient fashion is a bit tricky. + * + * Postprocessor input data is counted in "row groups". A row group + * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size) + * sample rows of each component. (We require DCT_scaled_size values to be + * chosen such that these numbers are integers. In practice DCT_scaled_size + * values will likely be powers of two, so we actually have the stronger + * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.) + * Upsampling will typically produce max_v_samp_factor pixel rows from each + * row group (times any additional scale factor that the upsampler is + * applying). + * + * The coefficient controller will deliver data to us one iMCU row at a time; + * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or + * exactly min_DCT_scaled_size row groups. (This amount of data corresponds + * to one row of MCUs when the image is fully interleaved.) Note that the + * number of sample rows varies across components, but the number of row + * groups does not. Some garbage sample rows may be included in the last iMCU + * row at the bottom of the image. + * + * Depending on the vertical scaling algorithm used, the upsampler may need + * access to the sample row(s) above and below its current input row group. + * The upsampler is required to set need_context_rows TRUE at global selection + * time if so. When need_context_rows is FALSE, this controller can simply + * obtain one iMCU row at a time from the coefficient controller and dole it + * out as row groups to the postprocessor. + * + * When need_context_rows is TRUE, this controller guarantees that the buffer + * passed to postprocessing contains at least one row group's worth of samples + * above and below the row group(s) being processed. Note that the context + * rows "above" the first passed row group appear at negative row offsets in + * the passed buffer. At the top and bottom of the image, the required + * context rows are manufactured by duplicating the first or last real sample + * row; this avoids having special cases in the upsampling inner loops. + * + * The amount of context is fixed at one row group just because that's a + * convenient number for this controller to work with. The existing + * upsamplers really only need one sample row of context. An upsampler + * supporting arbitrary output rescaling might wish for more than one row + * group of context when shrinking the image; tough, we don't handle that. + * (This is justified by the assumption that downsizing will be handled mostly + * by adjusting the DCT_scaled_size values, so that the actual scale factor at + * the upsample step needn't be much less than one.) + * + * To provide the desired context, we have to retain the last two row groups + * of one iMCU row while reading in the next iMCU row. (The last row group + * can't be processed until we have another row group for its below-context, + * and so we have to save the next-to-last group too for its above-context.) + * We could do this most simply by copying data around in our buffer, but + * that'd be very slow. We can avoid copying any data by creating a rather + * strange pointer structure. Here's how it works. We allocate a workspace + * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number + * of row groups per iMCU row). We create two sets of redundant pointers to + * the workspace. Labeling the physical row groups 0 to M+1, the synthesized + * pointer lists look like this: + * M+1 M-1 + * master pointer --> 0 master pointer --> 0 + * 1 1 + * ... ... + * M-3 M-3 + * M-2 M + * M-1 M+1 + * M M-2 + * M+1 M-1 + * 0 0 + * We read alternate iMCU rows using each master pointer; thus the last two + * row groups of the previous iMCU row remain un-overwritten in the workspace. + * The pointer lists are set up so that the required context rows appear to + * be adjacent to the proper places when we pass the pointer lists to the + * upsampler. + * + * The above pictures describe the normal state of the pointer lists. + * At top and bottom of the image, we diddle the pointer lists to duplicate + * the first or last sample row as necessary (this is cheaper than copying + * sample rows around). + * + * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1. In that + * situation each iMCU row provides only one row group so the buffering logic + * must be different (eg, we must read two iMCU rows before we can emit the + * first row group). For now, we simply do not support providing context + * rows when min_DCT_scaled_size is 1. That combination seems unlikely to + * be worth providing --- if someone wants a 1/8th-size preview, they probably + * want it quick and dirty, so a context-free upsampler is sufficient. + */ + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_d_main_controller pub; /* public fields */ + + /* Pointer to allocated workspace (M or M+2 row groups). */ + JSAMPARRAY buffer[MAX_COMPONENTS]; + + boolean buffer_full; /* Have we gotten an iMCU row from decoder? */ + JDIMENSION rowgroup_ctr; /* counts row groups output to postprocessor */ + + /* Remaining fields are only used in the context case. */ + + /* These are the master pointers to the funny-order pointer lists. */ + JSAMPIMAGE xbuffer[2]; /* pointers to weird pointer lists */ + + int whichptr; /* indicates which pointer set is now in use */ + int context_state; /* process_data state machine status */ + JDIMENSION rowgroups_avail; /* row groups available to postprocessor */ + JDIMENSION iMCU_row_ctr; /* counts iMCU rows to detect image top/bot */ +} my_main_controller; + +typedef my_main_controller * my_main_ptr; + +/* context_state values: */ +#define CTX_PREPARE_FOR_IMCU 0 /* need to prepare for MCU row */ +#define CTX_PROCESS_IMCU 1 /* feeding iMCU to postprocessor */ +#define CTX_POSTPONED_ROW 2 /* feeding postponed row group */ + + +/* Forward declarations */ +METHODDEF(void) process_data_simple_main + JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); +METHODDEF(void) process_data_context_main + JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); +#ifdef QUANT_2PASS_SUPPORTED +METHODDEF(void) process_data_crank_post + JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); +#endif + + +LOCAL(void) +alloc_funny_pointers (j_decompress_ptr cinfo) +/* Allocate space for the funny pointer lists. + * This is done only once, not once per pass. + */ +{ + my_main_ptr jmain = (my_main_ptr) cinfo->main; + int ci, rgroup; + int M = cinfo->min_DCT_scaled_size; + jpeg_component_info *compptr; + JSAMPARRAY xbuf; + + /* Get top-level space for component array pointers. + * We alloc both arrays with one call to save a few cycles. + */ + jmain->xbuffer[0] = (JSAMPIMAGE) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * 2 * SIZEOF(JSAMPARRAY)); + jmain->xbuffer[1] = jmain->xbuffer[0] + cinfo->num_components; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / + cinfo->min_DCT_scaled_size; /* height of a row group of component */ + /* Get space for pointer lists --- M+4 row groups in each list. + * We alloc both pointer lists with one call to save a few cycles. + */ + xbuf = (JSAMPARRAY) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW)); + xbuf += rgroup; /* want one row group at negative offsets */ + jmain->xbuffer[0][ci] = xbuf; + xbuf += rgroup * (M + 4); + jmain->xbuffer[1][ci] = xbuf; + } +} + + +LOCAL(void) +make_funny_pointers (j_decompress_ptr cinfo) +/* Create the funny pointer lists discussed in the comments above. + * The actual workspace is already allocated (in jmain->buffer), + * and the space for the pointer lists is allocated too. + * This routine just fills in the curiously ordered lists. + * This will be repeated at the beginning of each pass. + */ +{ + my_main_ptr jmain = (my_main_ptr) cinfo->main; + int ci, i, rgroup; + int M = cinfo->min_DCT_scaled_size; + jpeg_component_info *compptr; + JSAMPARRAY buf, xbuf0, xbuf1; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / + cinfo->min_DCT_scaled_size; /* height of a row group of component */ + xbuf0 = jmain->xbuffer[0][ci]; + xbuf1 = jmain->xbuffer[1][ci]; + /* First copy the workspace pointers as-is */ + buf = jmain->buffer[ci]; + for (i = 0; i < rgroup * (M + 2); i++) { + xbuf0[i] = xbuf1[i] = buf[i]; + } + /* In the second list, put the last four row groups in swapped order */ + for (i = 0; i < rgroup * 2; i++) { + xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i]; + xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i]; + } + /* The wraparound pointers at top and bottom will be filled later + * (see set_wraparound_pointers, below). Initially we want the "above" + * pointers to duplicate the first actual data line. This only needs + * to happen in xbuffer[0]. + */ + for (i = 0; i < rgroup; i++) { + xbuf0[i - rgroup] = xbuf0[0]; + } + } +} + + +LOCAL(void) +set_wraparound_pointers (j_decompress_ptr cinfo) +/* Set up the "wraparound" pointers at top and bottom of the pointer lists. + * This changes the pointer list state from top-of-image to the normal state. + */ +{ + my_main_ptr jmain = (my_main_ptr) cinfo->main; + int ci, i, rgroup; + int M = cinfo->min_DCT_scaled_size; + jpeg_component_info *compptr; + JSAMPARRAY xbuf0, xbuf1; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / + cinfo->min_DCT_scaled_size; /* height of a row group of component */ + xbuf0 = jmain->xbuffer[0][ci]; + xbuf1 = jmain->xbuffer[1][ci]; + for (i = 0; i < rgroup; i++) { + xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i]; + xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i]; + xbuf0[rgroup*(M+2) + i] = xbuf0[i]; + xbuf1[rgroup*(M+2) + i] = xbuf1[i]; + } + } +} + + +LOCAL(void) +set_bottom_pointers (j_decompress_ptr cinfo) +/* Change the pointer lists to duplicate the last sample row at the bottom + * of the image. whichptr indicates which xbuffer holds the final iMCU row. + * Also sets rowgroups_avail to indicate number of nondummy row groups in row. + */ +{ + my_main_ptr jmain = (my_main_ptr) cinfo->main; + int ci, i, rgroup, iMCUheight, rows_left; + jpeg_component_info *compptr; + JSAMPARRAY xbuf; + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Count sample rows in one iMCU row and in one row group */ + iMCUheight = compptr->v_samp_factor * compptr->DCT_scaled_size; + rgroup = iMCUheight / cinfo->min_DCT_scaled_size; + /* Count nondummy sample rows remaining for this component */ + rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight); + if (rows_left == 0) rows_left = iMCUheight; + /* Count nondummy row groups. Should get same answer for each component, + * so we need only do it once. + */ + if (ci == 0) { + jmain->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1); + } + /* Duplicate the last real sample row rgroup*2 times; this pads out the + * last partial rowgroup and ensures at least one full rowgroup of context. + */ + xbuf = jmain->xbuffer[jmain->whichptr][ci]; + for (i = 0; i < rgroup * 2; i++) { + xbuf[rows_left + i] = xbuf[rows_left-1]; + } + } +} + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_main_ptr jmain = (my_main_ptr) cinfo->main; + + switch (pass_mode) { + case JBUF_PASS_THRU: + if (cinfo->upsample->need_context_rows) { + jmain->pub.process_data = process_data_context_main; + make_funny_pointers(cinfo); /* Create the xbuffer[] lists */ + jmain->whichptr = 0; /* Read first iMCU row into xbuffer[0] */ + jmain->context_state = CTX_PREPARE_FOR_IMCU; + jmain->iMCU_row_ctr = 0; + } else { + /* Simple case with no context needed */ + jmain->pub.process_data = process_data_simple_main; + } + jmain->buffer_full = FALSE; /* Mark buffer empty */ + jmain->rowgroup_ctr = 0; + break; +#ifdef QUANT_2PASS_SUPPORTED + case JBUF_CRANK_DEST: + /* For last pass of 2-pass quantization, just crank the postprocessor */ + jmain->pub.process_data = process_data_crank_post; + break; +#endif + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } +} + + +/* + * Process some data. + * This handles the simple case where no context is required. + */ + +METHODDEF(void) +process_data_simple_main (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_main_ptr jmain = (my_main_ptr) cinfo->main; + JDIMENSION rowgroups_avail; + + /* Read input data if we haven't filled the main buffer yet */ + if (! jmain->buffer_full) { + if (! (*cinfo->coef->decompress_data) (cinfo, jmain->buffer)) + return; /* suspension forced, can do nothing more */ + jmain->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ + } + + /* There are always min_DCT_scaled_size row groups in an iMCU row. */ + rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size; + /* Note: at the bottom of the image, we may pass extra garbage row groups + * to the postprocessor. The postprocessor has to check for bottom + * of image anyway (at row resolution), so no point in us doing it too. + */ + + /* Feed the postprocessor */ + (*cinfo->post->post_process_data) (cinfo, jmain->buffer, + &jmain->rowgroup_ctr, rowgroups_avail, + output_buf, out_row_ctr, out_rows_avail); + + /* Has postprocessor consumed all the data yet? If so, mark buffer empty */ + if (jmain->rowgroup_ctr >= rowgroups_avail) { + jmain->buffer_full = FALSE; + jmain->rowgroup_ctr = 0; + } +} + + +/* + * Process some data. + * This handles the case where context rows must be provided. + */ + +METHODDEF(void) +process_data_context_main (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_main_ptr jmain = (my_main_ptr) cinfo->main; + + /* Read input data if we haven't filled the main buffer yet */ + if (! jmain->buffer_full) { + if (! (*cinfo->coef->decompress_data) (cinfo, + jmain->xbuffer[jmain->whichptr])) + return; /* suspension forced, can do nothing more */ + jmain->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ + jmain->iMCU_row_ctr++; /* count rows received */ + } + + /* Postprocessor typically will not swallow all the input data it is handed + * in one call (due to filling the output buffer first). Must be prepared + * to exit and restart. This switch lets us keep track of how far we got. + * Note that each case falls through to the next on successful completion. + */ + switch (jmain->context_state) { + case CTX_POSTPONED_ROW: + /* Call postprocessor using previously set pointers for postponed row */ + (*cinfo->post->post_process_data) (cinfo, jmain->xbuffer[jmain->whichptr], + &jmain->rowgroup_ctr, jmain->rowgroups_avail, + output_buf, out_row_ctr, out_rows_avail); + if (jmain->rowgroup_ctr < jmain->rowgroups_avail) + return; /* Need to suspend */ + jmain->context_state = CTX_PREPARE_FOR_IMCU; + if (*out_row_ctr >= out_rows_avail) + return; /* Postprocessor exactly filled output buf */ + /*FALLTHROUGH*/ + case CTX_PREPARE_FOR_IMCU: + /* Prepare to process first M-1 row groups of this iMCU row */ + jmain->rowgroup_ctr = 0; + jmain->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1); + /* Check for bottom of image: if so, tweak pointers to "duplicate" + * the last sample row, and adjust rowgroups_avail to ignore padding rows. + */ + if (jmain->iMCU_row_ctr == cinfo->total_iMCU_rows) + set_bottom_pointers(cinfo); + jmain->context_state = CTX_PROCESS_IMCU; + /*FALLTHROUGH*/ + case CTX_PROCESS_IMCU: + /* Call postprocessor using previously set pointers */ + (*cinfo->post->post_process_data) (cinfo, jmain->xbuffer[jmain->whichptr], + &jmain->rowgroup_ctr, jmain->rowgroups_avail, + output_buf, out_row_ctr, out_rows_avail); + if (jmain->rowgroup_ctr < jmain->rowgroups_avail) + return; /* Need to suspend */ + /* After the first iMCU, change wraparound pointers to normal state */ + if (jmain->iMCU_row_ctr == 1) + set_wraparound_pointers(cinfo); + /* Prepare to load new iMCU row using other xbuffer list */ + jmain->whichptr ^= 1; /* 0=>1 or 1=>0 */ + jmain->buffer_full = FALSE; + /* Still need to process last row group of this iMCU row, */ + /* which is saved at index M+1 of the other xbuffer */ + jmain->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1); + jmain->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2); + jmain->context_state = CTX_POSTPONED_ROW; + } +} + + +/* + * Process some data. + * Final pass of two-pass quantization: just call the postprocessor. + * Source data will be the postprocessor controller's internal buffer. + */ + +#ifdef QUANT_2PASS_SUPPORTED + +METHODDEF(void) +process_data_crank_post (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL, + (JDIMENSION *) NULL, (JDIMENSION) 0, + output_buf, out_row_ctr, out_rows_avail); +} + +#endif /* QUANT_2PASS_SUPPORTED */ + + +/* + * Initialize main buffer controller. + */ + +GLOBAL(void) +jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer) +{ + my_main_ptr jmain; + int ci, rgroup, ngroups; + jpeg_component_info *compptr; + + jmain = (my_main_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_main_controller)); + cinfo->main = (struct jpeg_d_main_controller *) jmain; + jmain->pub.start_pass = start_pass_main; + + if (need_full_buffer) /* shouldn't happen */ + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + + /* Allocate the workspace. + * ngroups is the number of row groups we need. + */ + if (cinfo->upsample->need_context_rows) { + if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */ + ERREXIT(cinfo, JERR_NOTIMPL); + alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */ + ngroups = cinfo->min_DCT_scaled_size + 2; + } else { + ngroups = cinfo->min_DCT_scaled_size; + } + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / + cinfo->min_DCT_scaled_size; /* height of a row group of component */ + jmain->buffer[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + compptr->width_in_blocks * compptr->DCT_scaled_size, + (JDIMENSION) (rgroup * ngroups)); + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdmarker.c b/third_party/windows/fltk-1.1.10/jpeg/jdmarker.c new file mode 100644 index 0000000..9811761 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdmarker.c @@ -0,0 +1,1360 @@ +/* + * jdmarker.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains routines to decode JPEG datastream markers. + * Most of the complexity arises from our desire to support input + * suspension: if not all of the data for a marker is available, + * we must exit back to the application. On resumption, we reprocess + * the marker. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +typedef enum { /* JPEG marker codes */ + M_SOF0 = 0xc0, + M_SOF1 = 0xc1, + M_SOF2 = 0xc2, + M_SOF3 = 0xc3, + + M_SOF5 = 0xc5, + M_SOF6 = 0xc6, + M_SOF7 = 0xc7, + + M_JPG = 0xc8, + M_SOF9 = 0xc9, + M_SOF10 = 0xca, + M_SOF11 = 0xcb, + + M_SOF13 = 0xcd, + M_SOF14 = 0xce, + M_SOF15 = 0xcf, + + M_DHT = 0xc4, + + M_DAC = 0xcc, + + M_RST0 = 0xd0, + M_RST1 = 0xd1, + M_RST2 = 0xd2, + M_RST3 = 0xd3, + M_RST4 = 0xd4, + M_RST5 = 0xd5, + M_RST6 = 0xd6, + M_RST7 = 0xd7, + + M_SOI = 0xd8, + M_EOI = 0xd9, + M_SOS = 0xda, + M_DQT = 0xdb, + M_DNL = 0xdc, + M_DRI = 0xdd, + M_DHP = 0xde, + M_EXP = 0xdf, + + M_APP0 = 0xe0, + M_APP1 = 0xe1, + M_APP2 = 0xe2, + M_APP3 = 0xe3, + M_APP4 = 0xe4, + M_APP5 = 0xe5, + M_APP6 = 0xe6, + M_APP7 = 0xe7, + M_APP8 = 0xe8, + M_APP9 = 0xe9, + M_APP10 = 0xea, + M_APP11 = 0xeb, + M_APP12 = 0xec, + M_APP13 = 0xed, + M_APP14 = 0xee, + M_APP15 = 0xef, + + M_JPG0 = 0xf0, + M_JPG13 = 0xfd, + M_COM = 0xfe, + + M_TEM = 0x01, + + M_ERROR = 0x100 +} JPEG_MARKER; + + +/* Private state */ + +typedef struct { + struct jpeg_marker_reader pub; /* public fields */ + + /* Application-overridable marker processing methods */ + jpeg_marker_parser_method process_COM; + jpeg_marker_parser_method process_APPn[16]; + + /* Limit on marker data length to save for each marker type */ + unsigned int length_limit_COM; + unsigned int length_limit_APPn[16]; + + /* Status of COM/APPn marker saving */ + jpeg_saved_marker_ptr cur_marker; /* NULL if not processing a marker */ + unsigned int bytes_read; /* data bytes read so far in marker */ + /* Note: cur_marker is not linked into marker_list until it's all read. */ +} my_marker_reader; + +typedef my_marker_reader * my_marker_ptr; + + +/* + * Macros for fetching data from the data source module. + * + * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect + * the current restart point; we update them only when we have reached a + * suitable place to restart if a suspension occurs. + */ + +/* Declare and initialize local copies of input pointer/count */ +#define INPUT_VARS(cinfo) \ + struct jpeg_source_mgr * datasrc = (cinfo)->src; \ + const JOCTET * next_input_byte = datasrc->next_input_byte; \ + size_t bytes_in_buffer = datasrc->bytes_in_buffer + +/* Unload the local copies --- do this only at a restart boundary */ +#define INPUT_SYNC(cinfo) \ + ( datasrc->next_input_byte = next_input_byte, \ + datasrc->bytes_in_buffer = bytes_in_buffer ) + +/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */ +#define INPUT_RELOAD(cinfo) \ + ( next_input_byte = datasrc->next_input_byte, \ + bytes_in_buffer = datasrc->bytes_in_buffer ) + +/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available. + * Note we do *not* do INPUT_SYNC before calling fill_input_buffer, + * but we must reload the local copies after a successful fill. + */ +#define MAKE_BYTE_AVAIL(cinfo,action) \ + if (bytes_in_buffer == 0) { \ + if (! (*datasrc->fill_input_buffer) (cinfo)) \ + { action; } \ + INPUT_RELOAD(cinfo); \ + } + +/* Read a byte into variable V. + * If must suspend, take the specified action (typically "return FALSE"). + */ +#define INPUT_BYTE(cinfo,V,action) \ + MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ + bytes_in_buffer--; \ + V = GETJOCTET(*next_input_byte++); ) + +/* As above, but read two bytes interpreted as an unsigned 16-bit integer. + * V should be declared unsigned int or perhaps INT32. + */ +#define INPUT_2BYTES(cinfo,V,action) \ + MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ + bytes_in_buffer--; \ + V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \ + MAKE_BYTE_AVAIL(cinfo,action); \ + bytes_in_buffer--; \ + V += GETJOCTET(*next_input_byte++); ) + + +/* + * Routines to process JPEG markers. + * + * Entry condition: JPEG marker itself has been read and its code saved + * in cinfo->unread_marker; input restart point is just after the marker. + * + * Exit: if return TRUE, have read and processed any parameters, and have + * updated the restart point to point after the parameters. + * If return FALSE, was forced to suspend before reaching end of + * marker parameters; restart point has not been moved. Same routine + * will be called again after application supplies more input data. + * + * This approach to suspension assumes that all of a marker's parameters + * can fit into a single input bufferload. This should hold for "normal" + * markers. Some COM/APPn markers might have large parameter segments + * that might not fit. If we are simply dropping such a marker, we use + * skip_input_data to get past it, and thereby put the problem on the + * source manager's shoulders. If we are saving the marker's contents + * into memory, we use a slightly different convention: when forced to + * suspend, the marker processor updates the restart point to the end of + * what it's consumed (ie, the end of the buffer) before returning FALSE. + * On resumption, cinfo->unread_marker still contains the marker code, + * but the data source will point to the next chunk of marker data. + * The marker processor must retain internal state to deal with this. + * + * Note that we don't bother to avoid duplicate trace messages if a + * suspension occurs within marker parameters. Other side effects + * require more care. + */ + + +LOCAL(boolean) +get_soi (j_decompress_ptr cinfo) +/* Process an SOI marker */ +{ + int i; + + TRACEMS(cinfo, 1, JTRC_SOI); + + if (cinfo->marker->saw_SOI) + ERREXIT(cinfo, JERR_SOI_DUPLICATE); + + /* Reset all parameters that are defined to be reset by SOI */ + + for (i = 0; i < NUM_ARITH_TBLS; i++) { + cinfo->arith_dc_L[i] = 0; + cinfo->arith_dc_U[i] = 1; + cinfo->arith_ac_K[i] = 5; + } + cinfo->restart_interval = 0; + + /* Set initial assumptions for colorspace etc */ + + cinfo->jpeg_color_space = JCS_UNKNOWN; + cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */ + + cinfo->saw_JFIF_marker = FALSE; + cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */ + cinfo->JFIF_minor_version = 1; + cinfo->density_unit = 0; + cinfo->X_density = 1; + cinfo->Y_density = 1; + cinfo->saw_Adobe_marker = FALSE; + cinfo->Adobe_transform = 0; + + cinfo->marker->saw_SOI = TRUE; + + return TRUE; +} + + +LOCAL(boolean) +get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith) +/* Process a SOFn marker */ +{ + INT32 length; + int c, ci; + jpeg_component_info * compptr; + INPUT_VARS(cinfo); + + cinfo->progressive_mode = is_prog; + cinfo->arith_code = is_arith; + + INPUT_2BYTES(cinfo, length, return FALSE); + + INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE); + INPUT_2BYTES(cinfo, cinfo->image_height, return FALSE); + INPUT_2BYTES(cinfo, cinfo->image_width, return FALSE); + INPUT_BYTE(cinfo, cinfo->num_components, return FALSE); + + length -= 8; + + TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker, + (int) cinfo->image_width, (int) cinfo->image_height, + cinfo->num_components); + + if (cinfo->marker->saw_SOF) + ERREXIT(cinfo, JERR_SOF_DUPLICATE); + + /* We don't support files in which the image height is initially specified */ + /* as 0 and is later redefined by DNL. As long as we have to check that, */ + /* might as well have a general sanity check. */ + if (cinfo->image_height <= 0 || cinfo->image_width <= 0 + || cinfo->num_components <= 0) + ERREXIT(cinfo, JERR_EMPTY_IMAGE); + + if (length != (cinfo->num_components * 3)) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + if (cinfo->comp_info == NULL) /* do only once, even if suspend */ + cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components * SIZEOF(jpeg_component_info)); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + compptr->component_index = ci; + INPUT_BYTE(cinfo, compptr->component_id, return FALSE); + INPUT_BYTE(cinfo, c, return FALSE); + compptr->h_samp_factor = (c >> 4) & 15; + compptr->v_samp_factor = (c ) & 15; + INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE); + + TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT, + compptr->component_id, compptr->h_samp_factor, + compptr->v_samp_factor, compptr->quant_tbl_no); + } + + cinfo->marker->saw_SOF = TRUE; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +get_sos (j_decompress_ptr cinfo) +/* Process a SOS marker */ +{ + INT32 length; + int i, ci, n, c, cc; + jpeg_component_info * compptr; + INPUT_VARS(cinfo); + + if (! cinfo->marker->saw_SOF) + ERREXIT(cinfo, JERR_SOS_NO_SOF); + + INPUT_2BYTES(cinfo, length, return FALSE); + + INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */ + + TRACEMS1(cinfo, 1, JTRC_SOS, n); + + if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + cinfo->comps_in_scan = n; + + /* Collect the component-spec parameters */ + + for (i = 0; i < n; i++) { + INPUT_BYTE(cinfo, cc, return FALSE); + INPUT_BYTE(cinfo, c, return FALSE); + + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + if (cc == compptr->component_id) + goto id_found; + } + + ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc); + + id_found: + + cinfo->cur_comp_info[i] = compptr; + compptr->dc_tbl_no = (c >> 4) & 15; + compptr->ac_tbl_no = (c ) & 15; + + TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc, + compptr->dc_tbl_no, compptr->ac_tbl_no); + } + + /* Collect the additional scan parameters Ss, Se, Ah/Al. */ + INPUT_BYTE(cinfo, c, return FALSE); + cinfo->Ss = c; + INPUT_BYTE(cinfo, c, return FALSE); + cinfo->Se = c; + INPUT_BYTE(cinfo, c, return FALSE); + cinfo->Ah = (c >> 4) & 15; + cinfo->Al = (c ) & 15; + + TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se, + cinfo->Ah, cinfo->Al); + + /* Prepare to scan data & restart markers */ + cinfo->marker->next_restart_num = 0; + + /* Count another SOS marker */ + cinfo->input_scan_number++; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +#ifdef D_ARITH_CODING_SUPPORTED + +LOCAL(boolean) +get_dac (j_decompress_ptr cinfo) +/* Process a DAC marker */ +{ + INT32 length; + int index, val; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + while (length > 0) { + INPUT_BYTE(cinfo, index, return FALSE); + INPUT_BYTE(cinfo, val, return FALSE); + + length -= 2; + + TRACEMS2(cinfo, 1, JTRC_DAC, index, val); + + if (index < 0 || index >= (2*NUM_ARITH_TBLS)) + ERREXIT1(cinfo, JERR_DAC_INDEX, index); + + if (index >= NUM_ARITH_TBLS) { /* define AC table */ + cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val; + } else { /* define DC table */ + cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F); + cinfo->arith_dc_U[index] = (UINT8) (val >> 4); + if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index]) + ERREXIT1(cinfo, JERR_DAC_VALUE, val); + } + } + + if (length != 0) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_SYNC(cinfo); + return TRUE; +} + +#else /* ! D_ARITH_CODING_SUPPORTED */ + +#define get_dac(cinfo) skip_variable(cinfo) + +#endif /* D_ARITH_CODING_SUPPORTED */ + + +LOCAL(boolean) +get_dht (j_decompress_ptr cinfo) +/* Process a DHT marker */ +{ + INT32 length; + UINT8 bits[17]; + UINT8 huffval[256]; + int i, index, count; + JHUFF_TBL **htblptr; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + while (length > 16) { + INPUT_BYTE(cinfo, index, return FALSE); + + TRACEMS1(cinfo, 1, JTRC_DHT, index); + + bits[0] = 0; + count = 0; + for (i = 1; i <= 16; i++) { + INPUT_BYTE(cinfo, bits[i], return FALSE); + count += bits[i]; + } + + length -= 1 + 16; + + TRACEMS8(cinfo, 2, JTRC_HUFFBITS, + bits[1], bits[2], bits[3], bits[4], + bits[5], bits[6], bits[7], bits[8]); + TRACEMS8(cinfo, 2, JTRC_HUFFBITS, + bits[9], bits[10], bits[11], bits[12], + bits[13], bits[14], bits[15], bits[16]); + + /* Here we just do minimal validation of the counts to avoid walking + * off the end of our table space. jdhuff.c will check more carefully. + */ + if (count > 256 || ((INT32) count) > length) + ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); + + for (i = 0; i < count; i++) + INPUT_BYTE(cinfo, huffval[i], return FALSE); + + length -= count; + + if (index & 0x10) { /* AC table definition */ + index -= 0x10; + htblptr = &cinfo->ac_huff_tbl_ptrs[index]; + } else { /* DC table definition */ + htblptr = &cinfo->dc_huff_tbl_ptrs[index]; + } + + if (index < 0 || index >= NUM_HUFF_TBLS) + ERREXIT1(cinfo, JERR_DHT_INDEX, index); + + if (*htblptr == NULL) + *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); + + MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); + MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval)); + } + + if (length != 0) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +get_dqt (j_decompress_ptr cinfo) +/* Process a DQT marker */ +{ + INT32 length; + int n, i, prec; + unsigned int tmp; + JQUANT_TBL *quant_ptr; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + while (length > 0) { + INPUT_BYTE(cinfo, n, return FALSE); + prec = n >> 4; + n &= 0x0F; + + TRACEMS2(cinfo, 1, JTRC_DQT, n, prec); + + if (n >= NUM_QUANT_TBLS) + ERREXIT1(cinfo, JERR_DQT_INDEX, n); + + if (cinfo->quant_tbl_ptrs[n] == NULL) + cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo); + quant_ptr = cinfo->quant_tbl_ptrs[n]; + + for (i = 0; i < DCTSIZE2; i++) { + if (prec) + INPUT_2BYTES(cinfo, tmp, return FALSE); + else + INPUT_BYTE(cinfo, tmp, return FALSE); + /* We convert the zigzag-order table to natural array order. */ + quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp; + } + + if (cinfo->err->trace_level >= 2) { + for (i = 0; i < DCTSIZE2; i += 8) { + TRACEMS8(cinfo, 2, JTRC_QUANTVALS, + quant_ptr->quantval[i], quant_ptr->quantval[i+1], + quant_ptr->quantval[i+2], quant_ptr->quantval[i+3], + quant_ptr->quantval[i+4], quant_ptr->quantval[i+5], + quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]); + } + } + + length -= DCTSIZE2+1; + if (prec) length -= DCTSIZE2; + } + + if (length != 0) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +get_dri (j_decompress_ptr cinfo) +/* Process a DRI marker */ +{ + INT32 length; + unsigned int tmp; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + + if (length != 4) + ERREXIT(cinfo, JERR_BAD_LENGTH); + + INPUT_2BYTES(cinfo, tmp, return FALSE); + + TRACEMS1(cinfo, 1, JTRC_DRI, tmp); + + cinfo->restart_interval = tmp; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +/* + * Routines for processing APPn and COM markers. + * These are either saved in memory or discarded, per application request. + * APP0 and APP14 are specially checked to see if they are + * JFIF and Adobe markers, respectively. + */ + +#define APP0_DATA_LEN 14 /* Length of interesting data in APP0 */ +#define APP14_DATA_LEN 12 /* Length of interesting data in APP14 */ +#define APPN_DATA_LEN 14 /* Must be the largest of the above!! */ + + +LOCAL(void) +examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data, + unsigned int datalen, INT32 remaining) +/* Examine first few bytes from an APP0. + * Take appropriate action if it is a JFIF marker. + * datalen is # of bytes at data[], remaining is length of rest of marker data. + */ +{ + INT32 totallen = (INT32) datalen + remaining; + + if (datalen >= APP0_DATA_LEN && + GETJOCTET(data[0]) == 0x4A && + GETJOCTET(data[1]) == 0x46 && + GETJOCTET(data[2]) == 0x49 && + GETJOCTET(data[3]) == 0x46 && + GETJOCTET(data[4]) == 0) { + /* Found JFIF APP0 marker: save info */ + cinfo->saw_JFIF_marker = TRUE; + cinfo->JFIF_major_version = GETJOCTET(data[5]); + cinfo->JFIF_minor_version = GETJOCTET(data[6]); + cinfo->density_unit = GETJOCTET(data[7]); + cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]); + cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]); + /* Check version. + * Major version must be 1, anything else signals an incompatible change. + * (We used to treat this as an error, but now it's a nonfatal warning, + * because some bozo at Hijaak couldn't read the spec.) + * Minor version should be 0..2, but process anyway if newer. + */ + if (cinfo->JFIF_major_version != 1) + WARNMS2(cinfo, JWRN_JFIF_MAJOR, + cinfo->JFIF_major_version, cinfo->JFIF_minor_version); + /* Generate trace messages */ + TRACEMS5(cinfo, 1, JTRC_JFIF, + cinfo->JFIF_major_version, cinfo->JFIF_minor_version, + cinfo->X_density, cinfo->Y_density, cinfo->density_unit); + /* Validate thumbnail dimensions and issue appropriate messages */ + if (GETJOCTET(data[12]) | GETJOCTET(data[13])) + TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL, + GETJOCTET(data[12]), GETJOCTET(data[13])); + totallen -= APP0_DATA_LEN; + if (totallen != + ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3)) + TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen); + } else if (datalen >= 6 && + GETJOCTET(data[0]) == 0x4A && + GETJOCTET(data[1]) == 0x46 && + GETJOCTET(data[2]) == 0x58 && + GETJOCTET(data[3]) == 0x58 && + GETJOCTET(data[4]) == 0) { + /* Found JFIF "JFXX" extension APP0 marker */ + /* The library doesn't actually do anything with these, + * but we try to produce a helpful trace message. + */ + switch (GETJOCTET(data[5])) { + case 0x10: + TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen); + break; + case 0x11: + TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen); + break; + case 0x13: + TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen); + break; + default: + TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION, + GETJOCTET(data[5]), (int) totallen); + break; + } + } else { + /* Start of APP0 does not match "JFIF" or "JFXX", or too short */ + TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen); + } +} + + +LOCAL(void) +examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data, + unsigned int datalen, INT32 remaining) +/* Examine first few bytes from an APP14. + * Take appropriate action if it is an Adobe marker. + * datalen is # of bytes at data[], remaining is length of rest of marker data. + */ +{ + unsigned int version, flags0, flags1, transform; + + if (datalen >= APP14_DATA_LEN && + GETJOCTET(data[0]) == 0x41 && + GETJOCTET(data[1]) == 0x64 && + GETJOCTET(data[2]) == 0x6F && + GETJOCTET(data[3]) == 0x62 && + GETJOCTET(data[4]) == 0x65) { + /* Found Adobe APP14 marker */ + version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]); + flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]); + flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]); + transform = GETJOCTET(data[11]); + TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform); + cinfo->saw_Adobe_marker = TRUE; + cinfo->Adobe_transform = (UINT8) transform; + } else { + /* Start of APP14 does not match "Adobe", or too short */ + TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining)); + } +} + + +METHODDEF(boolean) +get_interesting_appn (j_decompress_ptr cinfo) +/* Process an APP0 or APP14 marker without saving it */ +{ + INT32 length; + JOCTET b[APPN_DATA_LEN]; + unsigned int i, numtoread; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + /* get the interesting part of the marker data */ + if (length >= APPN_DATA_LEN) + numtoread = APPN_DATA_LEN; + else if (length > 0) + numtoread = (unsigned int) length; + else + numtoread = 0; + for (i = 0; i < numtoread; i++) + INPUT_BYTE(cinfo, b[i], return FALSE); + length -= numtoread; + + /* process it */ + switch (cinfo->unread_marker) { + case M_APP0: + examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length); + break; + case M_APP14: + examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length); + break; + default: + /* can't get here unless jpeg_save_markers chooses wrong processor */ + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); + break; + } + + /* skip any remaining data -- could be lots */ + INPUT_SYNC(cinfo); + if (length > 0) + (*cinfo->src->skip_input_data) (cinfo, (long) length); + + return TRUE; +} + + +#ifdef SAVE_MARKERS_SUPPORTED + +METHODDEF(boolean) +save_marker (j_decompress_ptr cinfo) +/* Save an APPn or COM marker into the marker list */ +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + jpeg_saved_marker_ptr cur_marker = marker->cur_marker; + unsigned int bytes_read, data_length; + JOCTET FAR * data; + INT32 length = 0; + INPUT_VARS(cinfo); + + if (cur_marker == NULL) { + /* begin reading a marker */ + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + if (length >= 0) { /* watch out for bogus length word */ + /* figure out how much we want to save */ + unsigned int limit; + if (cinfo->unread_marker == (int) M_COM) + limit = marker->length_limit_COM; + else + limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0]; + if ((unsigned int) length < limit) + limit = (unsigned int) length; + /* allocate and initialize the marker item */ + cur_marker = (jpeg_saved_marker_ptr) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(struct jpeg_marker_struct) + limit); + cur_marker->next = NULL; + cur_marker->marker = (UINT8) cinfo->unread_marker; + cur_marker->original_length = (unsigned int) length; + cur_marker->data_length = limit; + /* data area is just beyond the jpeg_marker_struct */ + data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1); + marker->cur_marker = cur_marker; + marker->bytes_read = 0; + bytes_read = 0; + data_length = limit; + } else { + /* deal with bogus length word */ + bytes_read = data_length = 0; + data = NULL; + } + } else { + /* resume reading a marker */ + bytes_read = marker->bytes_read; + data_length = cur_marker->data_length; + data = cur_marker->data + bytes_read; + } + + while (bytes_read < data_length) { + INPUT_SYNC(cinfo); /* move the restart point to here */ + marker->bytes_read = bytes_read; + /* If there's not at least one byte in buffer, suspend */ + MAKE_BYTE_AVAIL(cinfo, return FALSE); + /* Copy bytes with reasonable rapidity */ + while (bytes_read < data_length && bytes_in_buffer > 0) { + *data++ = *next_input_byte++; + bytes_in_buffer--; + bytes_read++; + } + } + + /* Done reading what we want to read */ + if (cur_marker != NULL) { /* will be NULL if bogus length word */ + /* Add new marker to end of list */ + if (cinfo->marker_list == NULL) { + cinfo->marker_list = cur_marker; + } else { + jpeg_saved_marker_ptr prev = cinfo->marker_list; + while (prev->next != NULL) + prev = prev->next; + prev->next = cur_marker; + } + /* Reset pointer & calc remaining data length */ + data = cur_marker->data; + length = cur_marker->original_length - data_length; + } + /* Reset to initial state for next marker */ + marker->cur_marker = NULL; + + /* Process the marker if interesting; else just make a generic trace msg */ + switch (cinfo->unread_marker) { + case M_APP0: + examine_app0(cinfo, data, data_length, length); + break; + case M_APP14: + examine_app14(cinfo, data, data_length, length); + break; + default: + TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, + (int) (data_length + length)); + break; + } + + /* skip any remaining data -- could be lots */ + INPUT_SYNC(cinfo); /* do before skip_input_data */ + if (length > 0) + (*cinfo->src->skip_input_data) (cinfo, (long) length); + + return TRUE; +} + +#endif /* SAVE_MARKERS_SUPPORTED */ + + +METHODDEF(boolean) +skip_variable (j_decompress_ptr cinfo) +/* Skip over an unknown or uninteresting variable-length marker */ +{ + INT32 length; + INPUT_VARS(cinfo); + + INPUT_2BYTES(cinfo, length, return FALSE); + length -= 2; + + TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length); + + INPUT_SYNC(cinfo); /* do before skip_input_data */ + if (length > 0) + (*cinfo->src->skip_input_data) (cinfo, (long) length); + + return TRUE; +} + + +/* + * Find the next JPEG marker, save it in cinfo->unread_marker. + * Returns FALSE if had to suspend before reaching a marker; + * in that case cinfo->unread_marker is unchanged. + * + * Note that the result might not be a valid marker code, + * but it will never be 0 or FF. + */ + +LOCAL(boolean) +next_marker (j_decompress_ptr cinfo) +{ + int c; + INPUT_VARS(cinfo); + + for (;;) { + INPUT_BYTE(cinfo, c, return FALSE); + /* Skip any non-FF bytes. + * This may look a bit inefficient, but it will not occur in a valid file. + * We sync after each discarded byte so that a suspending data source + * can discard the byte from its buffer. + */ + while (c != 0xFF) { + cinfo->marker->discarded_bytes++; + INPUT_SYNC(cinfo); + INPUT_BYTE(cinfo, c, return FALSE); + } + /* This loop swallows any duplicate FF bytes. Extra FFs are legal as + * pad bytes, so don't count them in discarded_bytes. We assume there + * will not be so many consecutive FF bytes as to overflow a suspending + * data source's input buffer. + */ + do { + INPUT_BYTE(cinfo, c, return FALSE); + } while (c == 0xFF); + if (c != 0) + break; /* found a valid marker, exit loop */ + /* Reach here if we found a stuffed-zero data sequence (FF/00). + * Discard it and loop back to try again. + */ + cinfo->marker->discarded_bytes += 2; + INPUT_SYNC(cinfo); + } + + if (cinfo->marker->discarded_bytes != 0) { + WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c); + cinfo->marker->discarded_bytes = 0; + } + + cinfo->unread_marker = c; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +LOCAL(boolean) +first_marker (j_decompress_ptr cinfo) +/* Like next_marker, but used to obtain the initial SOI marker. */ +/* For this marker, we do not allow preceding garbage or fill; otherwise, + * we might well scan an entire input file before realizing it ain't JPEG. + * If an application wants to process non-JFIF files, it must seek to the + * SOI before calling the JPEG library. + */ +{ + int c, c2; + INPUT_VARS(cinfo); + + INPUT_BYTE(cinfo, c, return FALSE); + INPUT_BYTE(cinfo, c2, return FALSE); + if (c != 0xFF || c2 != (int) M_SOI) + ERREXIT2(cinfo, JERR_NO_SOI, c, c2); + + cinfo->unread_marker = c2; + + INPUT_SYNC(cinfo); + return TRUE; +} + + +/* + * Read markers until SOS or EOI. + * + * Returns same codes as are defined for jpeg_consume_input: + * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. + */ + +METHODDEF(int) +read_markers (j_decompress_ptr cinfo) +{ + /* Outer loop repeats once for each marker. */ + for (;;) { + /* Collect the marker proper, unless we already did. */ + /* NB: first_marker() enforces the requirement that SOI appear first. */ + if (cinfo->unread_marker == 0) { + if (! cinfo->marker->saw_SOI) { + if (! first_marker(cinfo)) + return JPEG_SUSPENDED; + } else { + if (! next_marker(cinfo)) + return JPEG_SUSPENDED; + } + } + /* At this point cinfo->unread_marker contains the marker code and the + * input point is just past the marker proper, but before any parameters. + * A suspension will cause us to return with this state still true. + */ + switch (cinfo->unread_marker) { + case M_SOI: + if (! get_soi(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_SOF0: /* Baseline */ + case M_SOF1: /* Extended sequential, Huffman */ + if (! get_sof(cinfo, FALSE, FALSE)) + return JPEG_SUSPENDED; + break; + + case M_SOF2: /* Progressive, Huffman */ + if (! get_sof(cinfo, TRUE, FALSE)) + return JPEG_SUSPENDED; + break; + + case M_SOF9: /* Extended sequential, arithmetic */ + if (! get_sof(cinfo, FALSE, TRUE)) + return JPEG_SUSPENDED; + break; + + case M_SOF10: /* Progressive, arithmetic */ + if (! get_sof(cinfo, TRUE, TRUE)) + return JPEG_SUSPENDED; + break; + + /* Currently unsupported SOFn types */ + case M_SOF3: /* Lossless, Huffman */ + case M_SOF5: /* Differential sequential, Huffman */ + case M_SOF6: /* Differential progressive, Huffman */ + case M_SOF7: /* Differential lossless, Huffman */ + case M_JPG: /* Reserved for JPEG extensions */ + case M_SOF11: /* Lossless, arithmetic */ + case M_SOF13: /* Differential sequential, arithmetic */ + case M_SOF14: /* Differential progressive, arithmetic */ + case M_SOF15: /* Differential lossless, arithmetic */ + ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker); + break; + + case M_SOS: + if (! get_sos(cinfo)) + return JPEG_SUSPENDED; + cinfo->unread_marker = 0; /* processed the marker */ + return JPEG_REACHED_SOS; + + case M_EOI: + TRACEMS(cinfo, 1, JTRC_EOI); + cinfo->unread_marker = 0; /* processed the marker */ + return JPEG_REACHED_EOI; + + case M_DAC: + if (! get_dac(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_DHT: + if (! get_dht(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_DQT: + if (! get_dqt(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_DRI: + if (! get_dri(cinfo)) + return JPEG_SUSPENDED; + break; + + case M_APP0: + case M_APP1: + case M_APP2: + case M_APP3: + case M_APP4: + case M_APP5: + case M_APP6: + case M_APP7: + case M_APP8: + case M_APP9: + case M_APP10: + case M_APP11: + case M_APP12: + case M_APP13: + case M_APP14: + case M_APP15: + if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[ + cinfo->unread_marker - (int) M_APP0]) (cinfo)) + return JPEG_SUSPENDED; + break; + + case M_COM: + if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo)) + return JPEG_SUSPENDED; + break; + + case M_RST0: /* these are all parameterless */ + case M_RST1: + case M_RST2: + case M_RST3: + case M_RST4: + case M_RST5: + case M_RST6: + case M_RST7: + case M_TEM: + TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker); + break; + + case M_DNL: /* Ignore DNL ... perhaps the wrong thing */ + if (! skip_variable(cinfo)) + return JPEG_SUSPENDED; + break; + + default: /* must be DHP, EXP, JPGn, or RESn */ + /* For now, we treat the reserved markers as fatal errors since they are + * likely to be used to signal incompatible JPEG Part 3 extensions. + * Once the JPEG 3 version-number marker is well defined, this code + * ought to change! + */ + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); + break; + } + /* Successfully processed marker, so reset state variable */ + cinfo->unread_marker = 0; + } /* end loop */ +} + + +/* + * Read a restart marker, which is expected to appear next in the datastream; + * if the marker is not there, take appropriate recovery action. + * Returns FALSE if suspension is required. + * + * This is called by the entropy decoder after it has read an appropriate + * number of MCUs. cinfo->unread_marker may be nonzero if the entropy decoder + * has already read a marker from the data source. Under normal conditions + * cinfo->unread_marker will be reset to 0 before returning; if not reset, + * it holds a marker which the decoder will be unable to read past. + */ + +METHODDEF(boolean) +read_restart_marker (j_decompress_ptr cinfo) +{ + /* Obtain a marker unless we already did. */ + /* Note that next_marker will complain if it skips any data. */ + if (cinfo->unread_marker == 0) { + if (! next_marker(cinfo)) + return FALSE; + } + + if (cinfo->unread_marker == + ((int) M_RST0 + cinfo->marker->next_restart_num)) { + /* Normal case --- swallow the marker and let entropy decoder continue */ + TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num); + cinfo->unread_marker = 0; + } else { + /* Uh-oh, the restart markers have been messed up. */ + /* Let the data source manager determine how to resync. */ + if (! (*cinfo->src->resync_to_restart) (cinfo, + cinfo->marker->next_restart_num)) + return FALSE; + } + + /* Update next-restart state */ + cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7; + + return TRUE; +} + + +/* + * This is the default resync_to_restart method for data source managers + * to use if they don't have any better approach. Some data source managers + * may be able to back up, or may have additional knowledge about the data + * which permits a more intelligent recovery strategy; such managers would + * presumably supply their own resync method. + * + * read_restart_marker calls resync_to_restart if it finds a marker other than + * the restart marker it was expecting. (This code is *not* used unless + * a nonzero restart interval has been declared.) cinfo->unread_marker is + * the marker code actually found (might be anything, except 0 or FF). + * The desired restart marker number (0..7) is passed as a parameter. + * This routine is supposed to apply whatever error recovery strategy seems + * appropriate in order to position the input stream to the next data segment. + * Note that cinfo->unread_marker is treated as a marker appearing before + * the current data-source input point; usually it should be reset to zero + * before returning. + * Returns FALSE if suspension is required. + * + * This implementation is substantially constrained by wanting to treat the + * input as a data stream; this means we can't back up. Therefore, we have + * only the following actions to work with: + * 1. Simply discard the marker and let the entropy decoder resume at next + * byte of file. + * 2. Read forward until we find another marker, discarding intervening + * data. (In theory we could look ahead within the current bufferload, + * without having to discard data if we don't find the desired marker. + * This idea is not implemented here, in part because it makes behavior + * dependent on buffer size and chance buffer-boundary positions.) + * 3. Leave the marker unread (by failing to zero cinfo->unread_marker). + * This will cause the entropy decoder to process an empty data segment, + * inserting dummy zeroes, and then we will reprocess the marker. + * + * #2 is appropriate if we think the desired marker lies ahead, while #3 is + * appropriate if the found marker is a future restart marker (indicating + * that we have missed the desired restart marker, probably because it got + * corrupted). + * We apply #2 or #3 if the found marker is a restart marker no more than + * two counts behind or ahead of the expected one. We also apply #2 if the + * found marker is not a legal JPEG marker code (it's certainly bogus data). + * If the found marker is a restart marker more than 2 counts away, we do #1 + * (too much risk that the marker is erroneous; with luck we will be able to + * resync at some future point). + * For any valid non-restart JPEG marker, we apply #3. This keeps us from + * overrunning the end of a scan. An implementation limited to single-scan + * files might find it better to apply #2 for markers other than EOI, since + * any other marker would have to be bogus data in that case. + */ + +GLOBAL(boolean) +jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired) +{ + int marker = cinfo->unread_marker; + int action = 1; + + /* Always put up a warning. */ + WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired); + + /* Outer loop handles repeated decision after scanning forward. */ + for (;;) { + if (marker < (int) M_SOF0) + action = 2; /* invalid marker */ + else if (marker < (int) M_RST0 || marker > (int) M_RST7) + action = 3; /* valid non-restart marker */ + else { + if (marker == ((int) M_RST0 + ((desired+1) & 7)) || + marker == ((int) M_RST0 + ((desired+2) & 7))) + action = 3; /* one of the next two expected restarts */ + else if (marker == ((int) M_RST0 + ((desired-1) & 7)) || + marker == ((int) M_RST0 + ((desired-2) & 7))) + action = 2; /* a prior restart, so advance */ + else + action = 1; /* desired restart or too far away */ + } + TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action); + switch (action) { + case 1: + /* Discard marker and let entropy decoder resume processing. */ + cinfo->unread_marker = 0; + return TRUE; + case 2: + /* Scan to the next marker, and repeat the decision loop. */ + if (! next_marker(cinfo)) + return FALSE; + marker = cinfo->unread_marker; + break; + case 3: + /* Return without advancing past this marker. */ + /* Entropy decoder will be forced to process an empty segment. */ + return TRUE; + } + } /* end loop */ +} + + +/* + * Reset marker processing state to begin a fresh datastream. + */ + +METHODDEF(void) +reset_marker_reader (j_decompress_ptr cinfo) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + + cinfo->comp_info = NULL; /* until allocated by get_sof */ + cinfo->input_scan_number = 0; /* no SOS seen yet */ + cinfo->unread_marker = 0; /* no pending marker */ + marker->pub.saw_SOI = FALSE; /* set internal state too */ + marker->pub.saw_SOF = FALSE; + marker->pub.discarded_bytes = 0; + marker->cur_marker = NULL; +} + + +/* + * Initialize the marker reader module. + * This is called only once, when the decompression object is created. + */ + +GLOBAL(void) +jinit_marker_reader (j_decompress_ptr cinfo) +{ + my_marker_ptr marker; + int i; + + /* Create subobject in permanent pool */ + marker = (my_marker_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + SIZEOF(my_marker_reader)); + cinfo->marker = (struct jpeg_marker_reader *) marker; + /* Initialize public method pointers */ + marker->pub.reset_marker_reader = reset_marker_reader; + marker->pub.read_markers = read_markers; + marker->pub.read_restart_marker = read_restart_marker; + /* Initialize COM/APPn processing. + * By default, we examine and then discard APP0 and APP14, + * but simply discard COM and all other APPn. + */ + marker->process_COM = skip_variable; + marker->length_limit_COM = 0; + for (i = 0; i < 16; i++) { + marker->process_APPn[i] = skip_variable; + marker->length_limit_APPn[i] = 0; + } + marker->process_APPn[0] = get_interesting_appn; + marker->process_APPn[14] = get_interesting_appn; + /* Reset marker processing state */ + reset_marker_reader(cinfo); +} + + +/* + * Control saving of COM and APPn markers into marker_list. + */ + +#ifdef SAVE_MARKERS_SUPPORTED + +GLOBAL(void) +jpeg_save_markers (j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + long maxlength; + jpeg_marker_parser_method processor; + + /* Length limit mustn't be larger than what we can allocate + * (should only be a concern in a 16-bit environment). + */ + maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct); + if (((long) length_limit) > maxlength) + length_limit = (unsigned int) maxlength; + + /* Choose processor routine to use. + * APP0/APP14 have special requirements. + */ + if (length_limit) { + processor = save_marker; + /* If saving APP0/APP14, save at least enough for our internal use. */ + if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN) + length_limit = APP0_DATA_LEN; + else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN) + length_limit = APP14_DATA_LEN; + } else { + processor = skip_variable; + /* If discarding APP0/APP14, use our regular on-the-fly processor. */ + if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14) + processor = get_interesting_appn; + } + + if (marker_code == (int) M_COM) { + marker->process_COM = processor; + marker->length_limit_COM = length_limit; + } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) { + marker->process_APPn[marker_code - (int) M_APP0] = processor; + marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit; + } else + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); +} + +#endif /* SAVE_MARKERS_SUPPORTED */ + + +/* + * Install a special processing method for COM or APPn markers. + */ + +GLOBAL(void) +jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine) +{ + my_marker_ptr marker = (my_marker_ptr) cinfo->marker; + + if (marker_code == (int) M_COM) + marker->process_COM = routine; + else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) + marker->process_APPn[marker_code - (int) M_APP0] = routine; + else + ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdmaster.c b/third_party/windows/fltk-1.1.10/jpeg/jdmaster.c new file mode 100644 index 0000000..eda4b3f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdmaster.c @@ -0,0 +1,557 @@ +/* + * jdmaster.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains master control logic for the JPEG decompressor. + * These routines are concerned with selecting the modules to be executed + * and with determining the number of passes and the work to be done in each + * pass. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private state */ + +typedef struct { + struct jpeg_decomp_master pub; /* public fields */ + + int pass_number; /* # of passes completed */ + + boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */ + + /* Saved references to initialized quantizer modules, + * in case we need to switch modes. + */ + struct jpeg_color_quantizer * quantizer_1pass; + struct jpeg_color_quantizer * quantizer_2pass; +} my_decomp_master; + +typedef my_decomp_master * my_master_ptr; + + +/* + * Determine whether merged upsample/color conversion should be used. + * CRUCIAL: this must match the actual capabilities of jdmerge.c! + */ + +LOCAL(boolean) +use_merged_upsample (j_decompress_ptr cinfo) +{ +#ifdef UPSAMPLE_MERGING_SUPPORTED + /* Merging is the equivalent of plain box-filter upsampling */ + if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling) + return FALSE; + /* jdmerge.c only supports YCC=>RGB color conversion */ + if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 || + cinfo->out_color_space != JCS_RGB || + cinfo->out_color_components != RGB_PIXELSIZE) + return FALSE; + /* and it only handles 2h1v or 2h2v sampling ratios */ + if (cinfo->comp_info[0].h_samp_factor != 2 || + cinfo->comp_info[1].h_samp_factor != 1 || + cinfo->comp_info[2].h_samp_factor != 1 || + cinfo->comp_info[0].v_samp_factor > 2 || + cinfo->comp_info[1].v_samp_factor != 1 || + cinfo->comp_info[2].v_samp_factor != 1) + return FALSE; + /* furthermore, it doesn't work if we've scaled the IDCTs differently */ + if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size || + cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size || + cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size) + return FALSE; + /* ??? also need to test for upsample-time rescaling, when & if supported */ + return TRUE; /* by golly, it'll work... */ +#else + return FALSE; +#endif +} + + +/* + * Compute output image dimensions and related values. + * NOTE: this is exported for possible use by application. + * Hence it mustn't do anything that can't be done twice. + * Also note that it may be called before the master module is initialized! + */ + +GLOBAL(void) +jpeg_calc_output_dimensions (j_decompress_ptr cinfo) +/* Do computations that are needed before master selection phase */ +{ +#ifdef IDCT_SCALING_SUPPORTED + int ci; + jpeg_component_info *compptr; +#endif + + /* Prevent application from calling me at wrong times */ + if (cinfo->global_state != DSTATE_READY) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + +#ifdef IDCT_SCALING_SUPPORTED + + /* Compute actual output image dimensions and DCT scaling choices. */ + if (cinfo->scale_num * 8 <= cinfo->scale_denom) { + /* Provide 1/8 scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, 8L); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, 8L); + cinfo->min_DCT_scaled_size = 1; + } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) { + /* Provide 1/4 scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, 4L); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, 4L); + cinfo->min_DCT_scaled_size = 2; + } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) { + /* Provide 1/2 scaling */ + cinfo->output_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width, 2L); + cinfo->output_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height, 2L); + cinfo->min_DCT_scaled_size = 4; + } else { + /* Provide 1/1 scaling */ + cinfo->output_width = cinfo->image_width; + cinfo->output_height = cinfo->image_height; + cinfo->min_DCT_scaled_size = DCTSIZE; + } + /* In selecting the actual DCT scaling for each component, we try to + * scale up the chroma components via IDCT scaling rather than upsampling. + * This saves time if the upsampler gets to use 1:1 scaling. + * Note this code assumes that the supported DCT scalings are powers of 2. + */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + int ssize = cinfo->min_DCT_scaled_size; + while (ssize < DCTSIZE && + (compptr->h_samp_factor * ssize * 2 <= + cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) && + (compptr->v_samp_factor * ssize * 2 <= + cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) { + ssize = ssize * 2; + } + compptr->DCT_scaled_size = ssize; + } + + /* Recompute downsampled dimensions of components; + * application needs to know these if using raw downsampled data. + */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Size in samples, after IDCT scaling */ + compptr->downsampled_width = (JDIMENSION) + jdiv_round_up((long) cinfo->image_width * + (long) (compptr->h_samp_factor * compptr->DCT_scaled_size), + (long) (cinfo->max_h_samp_factor * DCTSIZE)); + compptr->downsampled_height = (JDIMENSION) + jdiv_round_up((long) cinfo->image_height * + (long) (compptr->v_samp_factor * compptr->DCT_scaled_size), + (long) (cinfo->max_v_samp_factor * DCTSIZE)); + } + +#else /* !IDCT_SCALING_SUPPORTED */ + + /* Hardwire it to "no scaling" */ + cinfo->output_width = cinfo->image_width; + cinfo->output_height = cinfo->image_height; + /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE, + * and has computed unscaled downsampled_width and downsampled_height. + */ + +#endif /* IDCT_SCALING_SUPPORTED */ + + /* Report number of components in selected colorspace. */ + /* Probably this should be in the color conversion module... */ + switch (cinfo->out_color_space) { + case JCS_GRAYSCALE: + cinfo->out_color_components = 1; + break; + case JCS_RGB: +#if RGB_PIXELSIZE != 3 + cinfo->out_color_components = RGB_PIXELSIZE; + break; +#endif /* else share code with YCbCr */ + case JCS_YCbCr: + cinfo->out_color_components = 3; + break; + case JCS_CMYK: + case JCS_YCCK: + cinfo->out_color_components = 4; + break; + default: /* else must be same colorspace as in file */ + cinfo->out_color_components = cinfo->num_components; + break; + } + cinfo->output_components = (cinfo->quantize_colors ? 1 : + cinfo->out_color_components); + + /* See if upsampler will want to emit more than one row at a time */ + if (use_merged_upsample(cinfo)) + cinfo->rec_outbuf_height = cinfo->max_v_samp_factor; + else + cinfo->rec_outbuf_height = 1; +} + + +/* + * Several decompression processes need to range-limit values to the range + * 0..MAXJSAMPLE; the input value may fall somewhat outside this range + * due to noise introduced by quantization, roundoff error, etc. These + * processes are inner loops and need to be as fast as possible. On most + * machines, particularly CPUs with pipelines or instruction prefetch, + * a (subscript-check-less) C table lookup + * x = sample_range_limit[x]; + * is faster than explicit tests + * if (x < 0) x = 0; + * else if (x > MAXJSAMPLE) x = MAXJSAMPLE; + * These processes all use a common table prepared by the routine below. + * + * For most steps we can mathematically guarantee that the initial value + * of x is within MAXJSAMPLE+1 of the legal range, so a table running from + * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient. But for the initial + * limiting step (just after the IDCT), a wildly out-of-range value is + * possible if the input data is corrupt. To avoid any chance of indexing + * off the end of memory and getting a bad-pointer trap, we perform the + * post-IDCT limiting thus: + * x = range_limit[x & MASK]; + * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit + * samples. Under normal circumstances this is more than enough range and + * a correct output will be generated; with bogus input data the mask will + * cause wraparound, and we will safely generate a bogus-but-in-range output. + * For the post-IDCT step, we want to convert the data from signed to unsigned + * representation by adding CENTERJSAMPLE at the same time that we limit it. + * So the post-IDCT limiting table ends up looking like this: + * CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE, + * MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), + * 0 (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), + * 0,1,...,CENTERJSAMPLE-1 + * Negative inputs select values from the upper half of the table after + * masking. + * + * We can save some space by overlapping the start of the post-IDCT table + * with the simpler range limiting table. The post-IDCT table begins at + * sample_range_limit + CENTERJSAMPLE. + * + * Note that the table is allocated in near data space on PCs; it's small + * enough and used often enough to justify this. + */ + +LOCAL(void) +prepare_range_limit_table (j_decompress_ptr cinfo) +/* Allocate and fill in the sample_range_limit table */ +{ + JSAMPLE * table; + int i; + + table = (JSAMPLE *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE)); + table += (MAXJSAMPLE+1); /* allow negative subscripts of simple table */ + cinfo->sample_range_limit = table; + /* First segment of "simple" table: limit[x] = 0 for x < 0 */ + MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE)); + /* Main part of "simple" table: limit[x] = x */ + for (i = 0; i <= MAXJSAMPLE; i++) + table[i] = (JSAMPLE) i; + table += CENTERJSAMPLE; /* Point to where post-IDCT table starts */ + /* End of simple table, rest of first half of post-IDCT table */ + for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++) + table[i] = MAXJSAMPLE; + /* Second half of post-IDCT table */ + MEMZERO(table + (2 * (MAXJSAMPLE+1)), + (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE)); + MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE), + cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE)); +} + + +/* + * Master selection of decompression modules. + * This is done once at jpeg_start_decompress time. We determine + * which modules will be used and give them appropriate initialization calls. + * We also initialize the decompressor input side to begin consuming data. + * + * Since jpeg_read_header has finished, we know what is in the SOF + * and (first) SOS markers. We also have all the application parameter + * settings. + */ + +LOCAL(void) +master_selection (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + boolean use_c_buffer; + long samplesperrow; + JDIMENSION jd_samplesperrow; + + /* Initialize dimensions and other stuff */ + jpeg_calc_output_dimensions(cinfo); + prepare_range_limit_table(cinfo); + + /* Width of an output scanline must be representable as JDIMENSION. */ + samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components; + jd_samplesperrow = (JDIMENSION) samplesperrow; + if ((long) jd_samplesperrow != samplesperrow) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + + /* Initialize my private state */ + master->pass_number = 0; + master->using_merged_upsample = use_merged_upsample(cinfo); + + /* Color quantizer selection */ + master->quantizer_1pass = NULL; + master->quantizer_2pass = NULL; + /* No mode changes if not using buffered-image mode. */ + if (! cinfo->quantize_colors || ! cinfo->buffered_image) { + cinfo->enable_1pass_quant = FALSE; + cinfo->enable_external_quant = FALSE; + cinfo->enable_2pass_quant = FALSE; + } + if (cinfo->quantize_colors) { + if (cinfo->raw_data_out) + ERREXIT(cinfo, JERR_NOTIMPL); + /* 2-pass quantizer only works in 3-component color space. */ + if (cinfo->out_color_components != 3) { + cinfo->enable_1pass_quant = TRUE; + cinfo->enable_external_quant = FALSE; + cinfo->enable_2pass_quant = FALSE; + cinfo->colormap = NULL; + } else if (cinfo->colormap != NULL) { + cinfo->enable_external_quant = TRUE; + } else if (cinfo->two_pass_quantize) { + cinfo->enable_2pass_quant = TRUE; + } else { + cinfo->enable_1pass_quant = TRUE; + } + + if (cinfo->enable_1pass_quant) { +#ifdef QUANT_1PASS_SUPPORTED + jinit_1pass_quantizer(cinfo); + master->quantizer_1pass = cinfo->cquantize; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } + + /* We use the 2-pass code to map to external colormaps. */ + if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) { +#ifdef QUANT_2PASS_SUPPORTED + jinit_2pass_quantizer(cinfo); + master->quantizer_2pass = cinfo->cquantize; +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } + /* If both quantizers are initialized, the 2-pass one is left active; + * this is necessary for starting with quantization to an external map. + */ + } + + /* Post-processing: in particular, color conversion first */ + if (! cinfo->raw_data_out) { + if (master->using_merged_upsample) { +#ifdef UPSAMPLE_MERGING_SUPPORTED + jinit_merged_upsampler(cinfo); /* does color conversion too */ +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else { + jinit_color_deconverter(cinfo); + jinit_upsampler(cinfo); + } + jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant); + } + /* Inverse DCT */ + jinit_inverse_dct(cinfo); + /* Entropy decoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) { + ERREXIT(cinfo, JERR_ARITH_NOTIMPL); + } else { + if (cinfo->progressive_mode) { +#ifdef D_PROGRESSIVE_SUPPORTED + jinit_phuff_decoder(cinfo); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else + jinit_huff_decoder(cinfo); + } + + /* Initialize principal buffer controllers. */ + use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image; + jinit_d_coef_controller(cinfo, use_c_buffer); + + if (! cinfo->raw_data_out) + jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Initialize input side of decompressor to consume first scan. */ + (*cinfo->inputctl->start_input_pass) (cinfo); + +#ifdef D_MULTISCAN_FILES_SUPPORTED + /* If jpeg_start_decompress will read the whole file, initialize + * progress monitoring appropriately. The input step is counted + * as one pass. + */ + if (cinfo->progress != NULL && ! cinfo->buffered_image && + cinfo->inputctl->has_multiple_scans) { + int nscans; + /* Estimate number of scans to set pass_limit. */ + if (cinfo->progressive_mode) { + /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ + nscans = 2 + 3 * cinfo->num_components; + } else { + /* For a nonprogressive multiscan file, estimate 1 scan per component. */ + nscans = cinfo->num_components; + } + cinfo->progress->pass_counter = 0L; + cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; + cinfo->progress->completed_passes = 0; + cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2); + /* Count the input pass as done */ + master->pass_number++; + } +#endif /* D_MULTISCAN_FILES_SUPPORTED */ +} + + +/* + * Per-pass setup. + * This is called at the beginning of each output pass. We determine which + * modules will be active during this pass and give them appropriate + * start_pass calls. We also set is_dummy_pass to indicate whether this + * is a "real" output pass or a dummy pass for color quantization. + * (In the latter case, jdapistd.c will crank the pass to completion.) + */ + +METHODDEF(void) +prepare_for_output_pass (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + if (master->pub.is_dummy_pass) { +#ifdef QUANT_2PASS_SUPPORTED + /* Final pass of 2-pass quantization */ + master->pub.is_dummy_pass = FALSE; + (*cinfo->cquantize->start_pass) (cinfo, FALSE); + (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST); + (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif /* QUANT_2PASS_SUPPORTED */ + } else { + if (cinfo->quantize_colors && cinfo->colormap == NULL) { + /* Select new quantization method */ + if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) { + cinfo->cquantize = master->quantizer_2pass; + master->pub.is_dummy_pass = TRUE; + } else if (cinfo->enable_1pass_quant) { + cinfo->cquantize = master->quantizer_1pass; + } else { + ERREXIT(cinfo, JERR_MODE_CHANGE); + } + } + (*cinfo->idct->start_pass) (cinfo); + (*cinfo->coef->start_output_pass) (cinfo); + if (! cinfo->raw_data_out) { + if (! master->using_merged_upsample) + (*cinfo->cconvert->start_pass) (cinfo); + (*cinfo->upsample->start_pass) (cinfo); + if (cinfo->quantize_colors) + (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass); + (*cinfo->post->start_pass) (cinfo, + (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); + (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); + } + } + + /* Set up progress monitor's pass info if present */ + if (cinfo->progress != NULL) { + cinfo->progress->completed_passes = master->pass_number; + cinfo->progress->total_passes = master->pass_number + + (master->pub.is_dummy_pass ? 2 : 1); + /* In buffered-image mode, we assume one more output pass if EOI not + * yet reached, but no more passes if EOI has been reached. + */ + if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) { + cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1); + } + } +} + + +/* + * Finish up at end of an output pass. + */ + +METHODDEF(void) +finish_output_pass (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + if (cinfo->quantize_colors) + (*cinfo->cquantize->finish_pass) (cinfo); + master->pass_number++; +} + + +#ifdef D_MULTISCAN_FILES_SUPPORTED + +/* + * Switch to a new external colormap between output passes. + */ + +GLOBAL(void) +jpeg_new_colormap (j_decompress_ptr cinfo) +{ + my_master_ptr master = (my_master_ptr) cinfo->master; + + /* Prevent application from calling me at wrong times */ + if (cinfo->global_state != DSTATE_BUFIMAGE) + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + + if (cinfo->quantize_colors && cinfo->enable_external_quant && + cinfo->colormap != NULL) { + /* Select 2-pass quantizer for external colormap use */ + cinfo->cquantize = master->quantizer_2pass; + /* Notify quantizer of colormap change */ + (*cinfo->cquantize->new_color_map) (cinfo); + master->pub.is_dummy_pass = FALSE; /* just in case */ + } else + ERREXIT(cinfo, JERR_MODE_CHANGE); +} + +#endif /* D_MULTISCAN_FILES_SUPPORTED */ + + +/* + * Initialize master decompression control and select active modules. + * This is performed at the start of jpeg_start_decompress. + */ + +GLOBAL(void) +jinit_master_decompress (j_decompress_ptr cinfo) +{ + my_master_ptr master; + + master = (my_master_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_decomp_master)); + cinfo->master = (struct jpeg_decomp_master *) master; + master->pub.prepare_for_output_pass = prepare_for_output_pass; + master->pub.finish_output_pass = finish_output_pass; + + master->pub.is_dummy_pass = FALSE; + + master_selection(cinfo); +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdmerge.c b/third_party/windows/fltk-1.1.10/jpeg/jdmerge.c new file mode 100644 index 0000000..9e3a595 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdmerge.c @@ -0,0 +1,400 @@ +/* + * jdmerge.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains code for merged upsampling/color conversion. + * + * This file combines functions from jdsample.c and jdcolor.c; + * read those files first to understand what's going on. + * + * When the chroma components are to be upsampled by simple replication + * (ie, box filtering), we can save some work in color conversion by + * calculating all the output pixels corresponding to a pair of chroma + * samples at one time. In the conversion equations + * R = Y + K1 * Cr + * G = Y + K2 * Cb + K3 * Cr + * B = Y + K4 * Cb + * only the Y term varies among the group of pixels corresponding to a pair + * of chroma samples, so the rest of the terms can be calculated just once. + * At typical sampling ratios, this eliminates half or three-quarters of the + * multiplications needed for color conversion. + * + * This file currently provides implementations for the following cases: + * YCbCr => RGB color conversion only. + * Sampling ratios of 2h1v or 2h2v. + * No scaling needed at upsample time. + * Corner-aligned (non-CCIR601) sampling alignment. + * Other special cases could be added, but in most applications these are + * the only common cases. (For uncommon cases we fall back on the more + * general code in jdsample.c and jdcolor.c.) + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +#ifdef UPSAMPLE_MERGING_SUPPORTED + + +/* Private subobject */ + +typedef struct { + struct jpeg_upsampler pub; /* public fields */ + + /* Pointer to routine to do actual upsampling/conversion of one row group */ + JMETHOD(void, upmethod, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, + JSAMPARRAY output_buf)); + + /* Private state for YCC->RGB conversion */ + int * Cr_r_tab; /* => table for Cr to R conversion */ + int * Cb_b_tab; /* => table for Cb to B conversion */ + INT32 * Cr_g_tab; /* => table for Cr to G conversion */ + INT32 * Cb_g_tab; /* => table for Cb to G conversion */ + + /* For 2:1 vertical sampling, we produce two output rows at a time. + * We need a "spare" row buffer to hold the second output row if the + * application provides just a one-row buffer; we also use the spare + * to discard the dummy last row if the image height is odd. + */ + JSAMPROW spare_row; + boolean spare_full; /* T if spare buffer is occupied */ + + JDIMENSION out_row_width; /* samples per output row */ + JDIMENSION rows_to_go; /* counts rows remaining in image */ +} my_upsampler; + +typedef my_upsampler * my_upsample_ptr; + +#define SCALEBITS 16 /* speediest right-shift on some machines */ +#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) +#define FIX(x) ((INT32) ((x) * (1L<RGB colorspace conversion. + * This is taken directly from jdcolor.c; see that file for more info. + */ + +LOCAL(void) +build_ycc_rgb_table (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + int i; + INT32 x; + SHIFT_TEMPS + + upsample->Cr_r_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + upsample->Cb_b_tab = (int *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(int)); + upsample->Cr_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + upsample->Cb_g_tab = (INT32 *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (MAXJSAMPLE+1) * SIZEOF(INT32)); + + for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { + /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ + /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ + /* Cr=>R value is nearest int to 1.40200 * x */ + upsample->Cr_r_tab[i] = (int) + RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); + /* Cb=>B value is nearest int to 1.77200 * x */ + upsample->Cb_b_tab[i] = (int) + RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); + /* Cr=>G value is scaled-up -0.71414 * x */ + upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x; + /* Cb=>G value is scaled-up -0.34414 * x */ + /* We also add in ONE_HALF so that need not do it in inner loop */ + upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; + } +} + + +/* + * Initialize for an upsampling pass. + */ + +METHODDEF(void) +start_pass_merged_upsample (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + + /* Mark the spare buffer empty */ + upsample->spare_full = FALSE; + /* Initialize total-height counter for detecting bottom of image */ + upsample->rows_to_go = cinfo->output_height; +} + + +/* + * Control routine to do upsampling (and color conversion). + * + * The control routine just handles the row buffering considerations. + */ + +METHODDEF(void) +merged_2v_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +/* 2:1 vertical sampling case: may need a spare row. */ +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + JSAMPROW work_ptrs[2]; + JDIMENSION num_rows; /* number of rows returned to caller */ + + if (upsample->spare_full) { + /* If we have a spare row saved from a previous cycle, just return it. */ + jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0, + 1, upsample->out_row_width); + num_rows = 1; + upsample->spare_full = FALSE; + } else { + /* Figure number of rows to return to caller. */ + num_rows = 2; + /* Not more than the distance to the end of the image. */ + if (num_rows > upsample->rows_to_go) + num_rows = upsample->rows_to_go; + /* And not more than what the client can accept: */ + out_rows_avail -= *out_row_ctr; + if (num_rows > out_rows_avail) + num_rows = out_rows_avail; + /* Create output pointer array for upsampler. */ + work_ptrs[0] = output_buf[*out_row_ctr]; + if (num_rows > 1) { + work_ptrs[1] = output_buf[*out_row_ctr + 1]; + } else { + work_ptrs[1] = upsample->spare_row; + upsample->spare_full = TRUE; + } + /* Now do the upsampling. */ + (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs); + } + + /* Adjust counts */ + *out_row_ctr += num_rows; + upsample->rows_to_go -= num_rows; + /* When the buffer is emptied, declare this input row group consumed */ + if (! upsample->spare_full) + (*in_row_group_ctr)++; +} + + +METHODDEF(void) +merged_1v_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +/* 1:1 vertical sampling case: much easier, never need a spare row. */ +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + + /* Just do the upsampling. */ + (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, + output_buf + *out_row_ctr); + /* Adjust counts */ + (*out_row_ctr)++; + (*in_row_group_ctr)++; +} + + +/* + * These are the routines invoked by the control routines to do + * the actual upsampling/conversion. One row group is processed per call. + * + * Note: since we may be writing directly into application-supplied buffers, + * we have to be honest about the output width; we can't assume the buffer + * has been rounded up to an even width. + */ + + +/* + * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical. + */ + +METHODDEF(void) +h2v1_merged_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, + JSAMPARRAY output_buf) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + register int y, cred, cgreen, cblue; + int cb, cr; + register JSAMPROW outptr; + JSAMPROW inptr0, inptr1, inptr2; + JDIMENSION col; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + int * Crrtab = upsample->Cr_r_tab; + int * Cbbtab = upsample->Cb_b_tab; + INT32 * Crgtab = upsample->Cr_g_tab; + INT32 * Cbgtab = upsample->Cb_g_tab; + SHIFT_TEMPS + + inptr0 = input_buf[0][in_row_group_ctr]; + inptr1 = input_buf[1][in_row_group_ctr]; + inptr2 = input_buf[2][in_row_group_ctr]; + outptr = output_buf[0]; + /* Loop for each pair of output pixels */ + for (col = cinfo->output_width >> 1; col > 0; col--) { + /* Do the chroma part of the calculation */ + cb = GETJSAMPLE(*inptr1++); + cr = GETJSAMPLE(*inptr2++); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + /* Fetch 2 Y values and emit 2 pixels */ + y = GETJSAMPLE(*inptr0++); + outptr[RGB_RED] = range_limit[y + cred]; + outptr[RGB_GREEN] = range_limit[y + cgreen]; + outptr[RGB_BLUE] = range_limit[y + cblue]; + outptr += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr0++); + outptr[RGB_RED] = range_limit[y + cred]; + outptr[RGB_GREEN] = range_limit[y + cgreen]; + outptr[RGB_BLUE] = range_limit[y + cblue]; + outptr += RGB_PIXELSIZE; + } + /* If image width is odd, do the last output column separately */ + if (cinfo->output_width & 1) { + cb = GETJSAMPLE(*inptr1); + cr = GETJSAMPLE(*inptr2); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + y = GETJSAMPLE(*inptr0); + outptr[RGB_RED] = range_limit[y + cred]; + outptr[RGB_GREEN] = range_limit[y + cgreen]; + outptr[RGB_BLUE] = range_limit[y + cblue]; + } +} + + +/* + * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical. + */ + +METHODDEF(void) +h2v2_merged_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, + JSAMPARRAY output_buf) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + register int y, cred, cgreen, cblue; + int cb, cr; + register JSAMPROW outptr0, outptr1; + JSAMPROW inptr00, inptr01, inptr1, inptr2; + JDIMENSION col; + /* copy these pointers into registers if possible */ + register JSAMPLE * range_limit = cinfo->sample_range_limit; + int * Crrtab = upsample->Cr_r_tab; + int * Cbbtab = upsample->Cb_b_tab; + INT32 * Crgtab = upsample->Cr_g_tab; + INT32 * Cbgtab = upsample->Cb_g_tab; + SHIFT_TEMPS + + inptr00 = input_buf[0][in_row_group_ctr*2]; + inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; + inptr1 = input_buf[1][in_row_group_ctr]; + inptr2 = input_buf[2][in_row_group_ctr]; + outptr0 = output_buf[0]; + outptr1 = output_buf[1]; + /* Loop for each group of output pixels */ + for (col = cinfo->output_width >> 1; col > 0; col--) { + /* Do the chroma part of the calculation */ + cb = GETJSAMPLE(*inptr1++); + cr = GETJSAMPLE(*inptr2++); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + /* Fetch 4 Y values and emit 4 pixels */ + y = GETJSAMPLE(*inptr00++); + outptr0[RGB_RED] = range_limit[y + cred]; + outptr0[RGB_GREEN] = range_limit[y + cgreen]; + outptr0[RGB_BLUE] = range_limit[y + cblue]; + outptr0 += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr00++); + outptr0[RGB_RED] = range_limit[y + cred]; + outptr0[RGB_GREEN] = range_limit[y + cgreen]; + outptr0[RGB_BLUE] = range_limit[y + cblue]; + outptr0 += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr01++); + outptr1[RGB_RED] = range_limit[y + cred]; + outptr1[RGB_GREEN] = range_limit[y + cgreen]; + outptr1[RGB_BLUE] = range_limit[y + cblue]; + outptr1 += RGB_PIXELSIZE; + y = GETJSAMPLE(*inptr01++); + outptr1[RGB_RED] = range_limit[y + cred]; + outptr1[RGB_GREEN] = range_limit[y + cgreen]; + outptr1[RGB_BLUE] = range_limit[y + cblue]; + outptr1 += RGB_PIXELSIZE; + } + /* If image width is odd, do the last output column separately */ + if (cinfo->output_width & 1) { + cb = GETJSAMPLE(*inptr1); + cr = GETJSAMPLE(*inptr2); + cred = Crrtab[cr]; + cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); + cblue = Cbbtab[cb]; + y = GETJSAMPLE(*inptr00); + outptr0[RGB_RED] = range_limit[y + cred]; + outptr0[RGB_GREEN] = range_limit[y + cgreen]; + outptr0[RGB_BLUE] = range_limit[y + cblue]; + y = GETJSAMPLE(*inptr01); + outptr1[RGB_RED] = range_limit[y + cred]; + outptr1[RGB_GREEN] = range_limit[y + cgreen]; + outptr1[RGB_BLUE] = range_limit[y + cblue]; + } +} + + +/* + * Module initialization routine for merged upsampling/color conversion. + * + * NB: this is called under the conditions determined by use_merged_upsample() + * in jdmaster.c. That routine MUST correspond to the actual capabilities + * of this module; no safety checks are made here. + */ + +GLOBAL(void) +jinit_merged_upsampler (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample; + + upsample = (my_upsample_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_upsampler)); + cinfo->upsample = (struct jpeg_upsampler *) upsample; + upsample->pub.start_pass = start_pass_merged_upsample; + upsample->pub.need_context_rows = FALSE; + + upsample->out_row_width = cinfo->output_width * cinfo->out_color_components; + + if (cinfo->max_v_samp_factor == 2) { + upsample->pub.upsample = merged_2v_upsample; + upsample->upmethod = h2v2_merged_upsample; + /* Allocate a spare row buffer */ + upsample->spare_row = (JSAMPROW) + (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, + (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE))); + } else { + upsample->pub.upsample = merged_1v_upsample; + upsample->upmethod = h2v1_merged_upsample; + /* No spare row needed */ + upsample->spare_row = NULL; + } + + build_ycc_rgb_table(cinfo); +} + +#endif /* UPSAMPLE_MERGING_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdphuff.c b/third_party/windows/fltk-1.1.10/jpeg/jdphuff.c new file mode 100644 index 0000000..2404743 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdphuff.c @@ -0,0 +1,668 @@ +/* + * jdphuff.c + * + * Copyright (C) 1995-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains Huffman entropy decoding routines for progressive JPEG. + * + * Much of the complexity here has to do with supporting input suspension. + * If the data source module demands suspension, we want to be able to back + * up to the start of the current MCU. To do this, we copy state variables + * into local working storage, and update them back to the permanent + * storage only upon successful completion of an MCU. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdhuff.h" /* Declarations shared with jdhuff.c */ + + +#ifdef D_PROGRESSIVE_SUPPORTED + +/* + * Expanded entropy decoder object for progressive Huffman decoding. + * + * The savable_state subrecord contains fields that change within an MCU, + * but must not be updated permanently until we complete the MCU. + */ + +typedef struct { + unsigned int EOBRUN; /* remaining EOBs in EOBRUN */ + int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ +} savable_state; + +/* This macro is to work around compilers with missing or broken + * structure assignment. You'll need to fix this code if you have + * such a compiler and you change MAX_COMPS_IN_SCAN. + */ + +#ifndef NO_STRUCT_ASSIGN +#define ASSIGN_STATE(dest,src) ((dest) = (src)) +#else +#if MAX_COMPS_IN_SCAN == 4 +#define ASSIGN_STATE(dest,src) \ + ((dest).EOBRUN = (src).EOBRUN, \ + (dest).last_dc_val[0] = (src).last_dc_val[0], \ + (dest).last_dc_val[1] = (src).last_dc_val[1], \ + (dest).last_dc_val[2] = (src).last_dc_val[2], \ + (dest).last_dc_val[3] = (src).last_dc_val[3]) +#endif +#endif + + +typedef struct { + struct jpeg_entropy_decoder pub; /* public fields */ + + /* These fields are loaded into local variables at start of each MCU. + * In case of suspension, we exit WITHOUT updating them. + */ + bitread_perm_state bitstate; /* Bit buffer at start of MCU */ + savable_state saved; /* Other state at start of MCU */ + + /* These fields are NOT loaded into local working state. */ + unsigned int restarts_to_go; /* MCUs left in this restart interval */ + + /* Pointers to derived tables (these workspaces have image lifespan) */ + d_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; + + d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */ +} phuff_entropy_decoder; + +typedef phuff_entropy_decoder * phuff_entropy_ptr; + +/* Forward declarations */ +METHODDEF(boolean) decode_mcu_DC_first JPP((j_decompress_ptr cinfo, + JBLOCKROW *MCU_data)); +METHODDEF(boolean) decode_mcu_AC_first JPP((j_decompress_ptr cinfo, + JBLOCKROW *MCU_data)); +METHODDEF(boolean) decode_mcu_DC_refine JPP((j_decompress_ptr cinfo, + JBLOCKROW *MCU_data)); +METHODDEF(boolean) decode_mcu_AC_refine JPP((j_decompress_ptr cinfo, + JBLOCKROW *MCU_data)); + + +/* + * Initialize for a Huffman-compressed scan. + */ + +METHODDEF(void) +start_pass_phuff_decoder (j_decompress_ptr cinfo) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + boolean is_DC_band, bad; + int ci, coefi, tbl; + int *coef_bit_ptr; + jpeg_component_info * compptr; + + is_DC_band = (cinfo->Ss == 0); + + /* Validate scan parameters */ + bad = FALSE; + if (is_DC_band) { + if (cinfo->Se != 0) + bad = TRUE; + } else { + /* need not check Ss/Se < 0 since they came from unsigned bytes */ + if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2) + bad = TRUE; + /* AC scans may have only one component */ + if (cinfo->comps_in_scan != 1) + bad = TRUE; + } + if (cinfo->Ah != 0) { + /* Successive approximation refinement scan: must have Al = Ah-1. */ + if (cinfo->Al != cinfo->Ah-1) + bad = TRUE; + } + if (cinfo->Al > 13) /* need not check for < 0 */ + bad = TRUE; + /* Arguably the maximum Al value should be less than 13 for 8-bit precision, + * but the spec doesn't say so, and we try to be liberal about what we + * accept. Note: large Al values could result in out-of-range DC + * coefficients during early scans, leading to bizarre displays due to + * overflows in the IDCT math. But we won't crash. + */ + if (bad) + ERREXIT4(cinfo, JERR_BAD_PROGRESSION, + cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); + /* Update progression status, and verify that scan order is legal. + * Note that inter-scan inconsistencies are treated as warnings + * not fatal errors ... not clear if this is right way to behave. + */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + int cindex = cinfo->cur_comp_info[ci]->component_index; + coef_bit_ptr = & cinfo->coef_bits[cindex][0]; + if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); + for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { + int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; + if (cinfo->Ah != expected) + WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); + coef_bit_ptr[coefi] = cinfo->Al; + } + } + + /* Select MCU decoding routine */ + if (cinfo->Ah == 0) { + if (is_DC_band) + entropy->pub.decode_mcu = decode_mcu_DC_first; + else + entropy->pub.decode_mcu = decode_mcu_AC_first; + } else { + if (is_DC_band) + entropy->pub.decode_mcu = decode_mcu_DC_refine; + else + entropy->pub.decode_mcu = decode_mcu_AC_refine; + } + + for (ci = 0; ci < cinfo->comps_in_scan; ci++) { + compptr = cinfo->cur_comp_info[ci]; + /* Make sure requested tables are present, and compute derived tables. + * We may build same derived table more than once, but it's not expensive. + */ + if (is_DC_band) { + if (cinfo->Ah == 0) { /* DC refinement needs no table */ + tbl = compptr->dc_tbl_no; + jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, + & entropy->derived_tbls[tbl]); + } + } else { + tbl = compptr->ac_tbl_no; + jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, + & entropy->derived_tbls[tbl]); + /* remember the single active table */ + entropy->ac_derived_tbl = entropy->derived_tbls[tbl]; + } + /* Initialize DC predictions to 0 */ + entropy->saved.last_dc_val[ci] = 0; + } + + /* Initialize bitread state variables */ + entropy->bitstate.bits_left = 0; + entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ + entropy->pub.insufficient_data = FALSE; + + /* Initialize private state variables */ + entropy->saved.EOBRUN = 0; + + /* Initialize restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; +} + + +/* + * Figure F.12: extend sign bit. + * On some machines, a shift and add will be faster than a table lookup. + */ + +#ifdef AVOID_TABLES + +#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x)) + +#else + +#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x)) + +static const int extend_test[16] = /* entry n is 2**(n-1) */ + { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, + 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; + +static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */ + { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, + ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, + ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, + ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; + +#endif /* AVOID_TABLES */ + + +/* + * Check for a restart marker & resynchronize decoder. + * Returns FALSE if must suspend. + */ + +LOCAL(boolean) +process_restart (j_decompress_ptr cinfo) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + int ci; + + /* Throw away any unused bits remaining in bit buffer; */ + /* include any full bytes in next_marker's count of discarded bytes */ + cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8; + entropy->bitstate.bits_left = 0; + + /* Advance past the RSTn marker */ + if (! (*cinfo->marker->read_restart_marker) (cinfo)) + return FALSE; + + /* Re-initialize DC predictions to 0 */ + for (ci = 0; ci < cinfo->comps_in_scan; ci++) + entropy->saved.last_dc_val[ci] = 0; + /* Re-init EOB run count, too */ + entropy->saved.EOBRUN = 0; + + /* Reset restart counter */ + entropy->restarts_to_go = cinfo->restart_interval; + + /* Reset out-of-data flag, unless read_restart_marker left us smack up + * against a marker. In that case we will end up treating the next data + * segment as empty, and we can avoid producing bogus output pixels by + * leaving the flag set. + */ + if (cinfo->unread_marker == 0) + entropy->pub.insufficient_data = FALSE; + + return TRUE; +} + + +/* + * Huffman MCU decoding. + * Each of these routines decodes and returns one MCU's worth of + * Huffman-compressed coefficients. + * The coefficients are reordered from zigzag order into natural array order, + * but are not dequantized. + * + * The i'th block of the MCU is stored into the block pointed to by + * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. + * + * We return FALSE if data source requested suspension. In that case no + * changes have been made to permanent state. (Exception: some output + * coefficients may already have been assigned. This is harmless for + * spectral selection, since we'll just re-assign them on the next call. + * Successive approximation AC refinement has to be more careful, however.) + */ + +/* + * MCU decoding for DC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + int Al = cinfo->Al; + register int s, r; + int blkn, ci; + JBLOCKROW block; + BITREAD_STATE_VARS; + savable_state state; + d_derived_tbl * tbl; + jpeg_component_info * compptr; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->pub.insufficient_data) { + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(state, entropy->saved); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + ci = cinfo->MCU_membership[blkn]; + compptr = cinfo->cur_comp_info[ci]; + tbl = entropy->derived_tbls[compptr->dc_tbl_no]; + + /* Decode a single block's worth of coefficients */ + + /* Section F.2.2.1: decode the DC coefficient difference */ + HUFF_DECODE(s, br_state, tbl, return FALSE, label1); + if (s) { + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + } + + /* Convert DC difference to actual value, update last_dc_val */ + s += state.last_dc_val[ci]; + state.last_dc_val[ci] = s; + /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */ + (*block)[0] = (JCOEF) (s << Al); + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + ASSIGN_STATE(entropy->saved, state); + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for AC initial scan (either spectral selection, + * or first pass of successive approximation). + */ + +METHODDEF(boolean) +decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + int Se = cinfo->Se; + int Al = cinfo->Al; + register int s, k, r; + unsigned int EOBRUN; + JBLOCKROW block; + BITREAD_STATE_VARS; + d_derived_tbl * tbl; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, just leave the MCU set to zeroes. + * This way, we return uniform gray for the remainder of the segment. + */ + if (! entropy->pub.insufficient_data) { + + /* Load up working state. + * We can avoid loading/saving bitread state if in an EOB run. + */ + EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ + + /* There is always only one block per MCU */ + + if (EOBRUN > 0) /* if it's a band of zeroes... */ + EOBRUN--; /* ...process it now (we do nothing) */ + else { + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + block = MCU_data[0]; + tbl = entropy->ac_derived_tbl; + + for (k = cinfo->Ss; k <= Se; k++) { + HUFF_DECODE(s, br_state, tbl, return FALSE, label2); + r = s >> 4; + s &= 15; + if (s) { + k += r; + CHECK_BIT_BUFFER(br_state, s, return FALSE); + r = GET_BITS(s); + s = HUFF_EXTEND(r, s); + /* Scale and output coefficient in natural (dezigzagged) order */ + (*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al); + } else { + if (r == 15) { /* ZRL */ + k += 15; /* skip 15 zeroes in band */ + } else { /* EOBr, run length is 2^r + appended bits */ + EOBRUN = 1 << r; + if (r) { /* EOBr, r > 0 */ + CHECK_BIT_BUFFER(br_state, r, return FALSE); + r = GET_BITS(r); + EOBRUN += r; + } + EOBRUN--; /* this band is processed at this moment */ + break; /* force end-of-band */ + } + } + } + + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + } + + /* Completed MCU, so update state */ + entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for DC successive approximation refinement scan. + * Note: we assume such scans can be multi-component, although the spec + * is not very clear on the point. + */ + +METHODDEF(boolean) +decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + int blkn; + JBLOCKROW block; + BITREAD_STATE_VARS; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* Not worth the cycles to check insufficient_data here, + * since we will not change the data anyway if we read zeroes. + */ + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + + /* Outer loop handles each block in the MCU */ + + for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { + block = MCU_data[blkn]; + + /* Encoded data is simply the next bit of the two's-complement DC value */ + CHECK_BIT_BUFFER(br_state, 1, return FALSE); + if (GET_BITS(1)) + (*block)[0] |= p1; + /* Note: since we use |=, repeating the assignment later is safe */ + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; +} + + +/* + * MCU decoding for AC successive approximation refinement scan. + */ + +METHODDEF(boolean) +decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) +{ + phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; + int Se = cinfo->Se; + int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ + int m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ + register int s, k, r; + unsigned int EOBRUN; + JBLOCKROW block; + JCOEFPTR thiscoef; + BITREAD_STATE_VARS; + d_derived_tbl * tbl; + int num_newnz; + int newnz_pos[DCTSIZE2]; + + /* Process restart marker if needed; may have to suspend */ + if (cinfo->restart_interval) { + if (entropy->restarts_to_go == 0) + if (! process_restart(cinfo)) + return FALSE; + } + + /* If we've run out of data, don't modify the MCU. + */ + if (! entropy->pub.insufficient_data) { + + /* Load up working state */ + BITREAD_LOAD_STATE(cinfo,entropy->bitstate); + EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ + + /* There is always only one block per MCU */ + block = MCU_data[0]; + tbl = entropy->ac_derived_tbl; + + /* If we are forced to suspend, we must undo the assignments to any newly + * nonzero coefficients in the block, because otherwise we'd get confused + * next time about which coefficients were already nonzero. + * But we need not undo addition of bits to already-nonzero coefficients; + * instead, we can test the current bit to see if we already did it. + */ + num_newnz = 0; + + /* initialize coefficient loop counter to start of band */ + k = cinfo->Ss; + + if (EOBRUN == 0) { + for (; k <= Se; k++) { + HUFF_DECODE(s, br_state, tbl, goto undoit, label3); + r = s >> 4; + s &= 15; + if (s) { + if (s != 1) /* size of new coef should always be 1 */ + WARNMS(cinfo, JWRN_HUFF_BAD_CODE); + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) + s = p1; /* newly nonzero coef is positive */ + else + s = m1; /* newly nonzero coef is negative */ + } else { + if (r != 15) { + EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */ + if (r) { + CHECK_BIT_BUFFER(br_state, r, goto undoit); + r = GET_BITS(r); + EOBRUN += r; + } + break; /* rest of block is handled by EOB logic */ + } + /* note s = 0 for processing ZRL */ + } + /* Advance over already-nonzero coefs and r still-zero coefs, + * appending correction bits to the nonzeroes. A correction bit is 1 + * if the absolute value of the coefficient must be increased. + */ + do { + thiscoef = *block + jpeg_natural_order[k]; + if (*thiscoef != 0) { + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) { + if ((*thiscoef & p1) == 0) { /* do nothing if already set it */ + if (*thiscoef >= 0) + *thiscoef += p1; + else + *thiscoef += m1; + } + } + } else { + if (--r < 0) + break; /* reached target zero coefficient */ + } + k++; + } while (k <= Se); + if (s) { + int pos = jpeg_natural_order[k]; + /* Output newly nonzero coefficient */ + (*block)[pos] = (JCOEF) s; + /* Remember its position in case we have to suspend */ + newnz_pos[num_newnz++] = pos; + } + } + } + + if (EOBRUN > 0) { + /* Scan any remaining coefficient positions after the end-of-band + * (the last newly nonzero coefficient, if any). Append a correction + * bit to each already-nonzero coefficient. A correction bit is 1 + * if the absolute value of the coefficient must be increased. + */ + for (; k <= Se; k++) { + thiscoef = *block + jpeg_natural_order[k]; + if (*thiscoef != 0) { + CHECK_BIT_BUFFER(br_state, 1, goto undoit); + if (GET_BITS(1)) { + if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */ + if (*thiscoef >= 0) + *thiscoef += p1; + else + *thiscoef += m1; + } + } + } + } + /* Count one block completed in EOB run */ + EOBRUN--; + } + + /* Completed MCU, so update state */ + BITREAD_SAVE_STATE(cinfo,entropy->bitstate); + entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ + } + + /* Account for restart interval (no-op if not using restarts) */ + entropy->restarts_to_go--; + + return TRUE; + +undoit: + /* Re-zero any output coefficients that we made newly nonzero */ + while (num_newnz > 0) + (*block)[newnz_pos[--num_newnz]] = 0; + + return FALSE; +} + + +/* + * Module initialization routine for progressive Huffman entropy decoding. + */ + +GLOBAL(void) +jinit_phuff_decoder (j_decompress_ptr cinfo) +{ + phuff_entropy_ptr entropy; + int *coef_bit_ptr; + int ci, i; + + entropy = (phuff_entropy_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(phuff_entropy_decoder)); + cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; + entropy->pub.start_pass = start_pass_phuff_decoder; + + /* Mark derived tables unallocated */ + for (i = 0; i < NUM_HUFF_TBLS; i++) { + entropy->derived_tbls[i] = NULL; + } + + /* Create progression status table */ + cinfo->coef_bits = (int (*)[DCTSIZE2]) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->num_components*DCTSIZE2*SIZEOF(int)); + coef_bit_ptr = & cinfo->coef_bits[0][0]; + for (ci = 0; ci < cinfo->num_components; ci++) + for (i = 0; i < DCTSIZE2; i++) + *coef_bit_ptr++ = -1; +} + +#endif /* D_PROGRESSIVE_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdpostct.c b/third_party/windows/fltk-1.1.10/jpeg/jdpostct.c new file mode 100644 index 0000000..7ba9eed --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdpostct.c @@ -0,0 +1,290 @@ +/* + * jdpostct.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the decompression postprocessing controller. + * This controller manages the upsampling, color conversion, and color + * quantization/reduction steps; specifically, it controls the buffering + * between upsample/color conversion and color quantization/reduction. + * + * If no color quantization/reduction is required, then this module has no + * work to do, and it just hands off to the upsample/color conversion code. + * An integrated upsample/convert/quantize process would replace this module + * entirely. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Private buffer controller object */ + +typedef struct { + struct jpeg_d_post_controller pub; /* public fields */ + + /* Color quantization source buffer: this holds output data from + * the upsample/color conversion step to be passed to the quantizer. + * For two-pass color quantization, we need a full-image buffer; + * for one-pass operation, a strip buffer is sufficient. + */ + jvirt_sarray_ptr whole_image; /* virtual array, or NULL if one-pass */ + JSAMPARRAY buffer; /* strip buffer, or current strip of virtual */ + JDIMENSION strip_height; /* buffer size in rows */ + /* for two-pass mode only: */ + JDIMENSION starting_row; /* row # of first row in current strip */ + JDIMENSION next_row; /* index of next row to fill/empty in strip */ +} my_post_controller; + +typedef my_post_controller * my_post_ptr; + + +/* Forward declarations */ +METHODDEF(void) post_process_1pass + JPP((j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +#ifdef QUANT_2PASS_SUPPORTED +METHODDEF(void) post_process_prepass + JPP((j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +METHODDEF(void) post_process_2pass + JPP((j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +#endif + + +/* + * Initialize for a processing pass. + */ + +METHODDEF(void) +start_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + + switch (pass_mode) { + case JBUF_PASS_THRU: + if (cinfo->quantize_colors) { + /* Single-pass processing with color quantization. */ + post->pub.post_process_data = post_process_1pass; + /* We could be doing buffered-image output before starting a 2-pass + * color quantization; in that case, jinit_d_post_controller did not + * allocate a strip buffer. Use the virtual-array buffer as workspace. + */ + if (post->buffer == NULL) { + post->buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, post->whole_image, + (JDIMENSION) 0, post->strip_height, TRUE); + } + } else { + /* For single-pass processing without color quantization, + * I have no work to do; just call the upsampler directly. + */ + post->pub.post_process_data = cinfo->upsample->upsample; + } + break; +#ifdef QUANT_2PASS_SUPPORTED + case JBUF_SAVE_AND_PASS: + /* First pass of 2-pass quantization */ + if (post->whole_image == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + post->pub.post_process_data = post_process_prepass; + break; + case JBUF_CRANK_DEST: + /* Second pass of 2-pass quantization */ + if (post->whole_image == NULL) + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + post->pub.post_process_data = post_process_2pass; + break; +#endif /* QUANT_2PASS_SUPPORTED */ + default: + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); + break; + } + post->starting_row = post->next_row = 0; +} + + +/* + * Process some data in the one-pass (strip buffer) case. + * This is used for color precision reduction as well as one-pass quantization. + */ + +METHODDEF(void) +post_process_1pass (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + JDIMENSION num_rows, max_rows; + + /* Fill the buffer, but not more than what we can dump out in one go. */ + /* Note we rely on the upsampler to detect bottom of image. */ + max_rows = out_rows_avail - *out_row_ctr; + if (max_rows > post->strip_height) + max_rows = post->strip_height; + num_rows = 0; + (*cinfo->upsample->upsample) (cinfo, + input_buf, in_row_group_ctr, in_row_groups_avail, + post->buffer, &num_rows, max_rows); + /* Quantize and emit data. */ + (*cinfo->cquantize->color_quantize) (cinfo, + post->buffer, output_buf + *out_row_ctr, (int) num_rows); + *out_row_ctr += num_rows; +} + + +#ifdef QUANT_2PASS_SUPPORTED + +/* + * Process some data in the first pass of 2-pass quantization. + */ + +METHODDEF(void) +post_process_prepass (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + JDIMENSION old_next_row, num_rows; + + /* Reposition virtual buffer if at start of strip. */ + if (post->next_row == 0) { + post->buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, post->whole_image, + post->starting_row, post->strip_height, TRUE); + } + + /* Upsample some data (up to a strip height's worth). */ + old_next_row = post->next_row; + (*cinfo->upsample->upsample) (cinfo, + input_buf, in_row_group_ctr, in_row_groups_avail, + post->buffer, &post->next_row, post->strip_height); + + /* Allow quantizer to scan new data. No data is emitted, */ + /* but we advance out_row_ctr so outer loop can tell when we're done. */ + if (post->next_row > old_next_row) { + num_rows = post->next_row - old_next_row; + (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row, + (JSAMPARRAY) NULL, (int) num_rows); + *out_row_ctr += num_rows; + } + + /* Advance if we filled the strip. */ + if (post->next_row >= post->strip_height) { + post->starting_row += post->strip_height; + post->next_row = 0; + } +} + + +/* + * Process some data in the second pass of 2-pass quantization. + */ + +METHODDEF(void) +post_process_2pass (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_post_ptr post = (my_post_ptr) cinfo->post; + JDIMENSION num_rows, max_rows; + + /* Reposition virtual buffer if at start of strip. */ + if (post->next_row == 0) { + post->buffer = (*cinfo->mem->access_virt_sarray) + ((j_common_ptr) cinfo, post->whole_image, + post->starting_row, post->strip_height, FALSE); + } + + /* Determine number of rows to emit. */ + num_rows = post->strip_height - post->next_row; /* available in strip */ + max_rows = out_rows_avail - *out_row_ctr; /* available in output area */ + if (num_rows > max_rows) + num_rows = max_rows; + /* We have to check bottom of image here, can't depend on upsampler. */ + max_rows = cinfo->output_height - post->starting_row; + if (num_rows > max_rows) + num_rows = max_rows; + + /* Quantize and emit data. */ + (*cinfo->cquantize->color_quantize) (cinfo, + post->buffer + post->next_row, output_buf + *out_row_ctr, + (int) num_rows); + *out_row_ctr += num_rows; + + /* Advance if we filled the strip. */ + post->next_row += num_rows; + if (post->next_row >= post->strip_height) { + post->starting_row += post->strip_height; + post->next_row = 0; + } +} + +#endif /* QUANT_2PASS_SUPPORTED */ + + +/* + * Initialize postprocessing controller. + */ + +GLOBAL(void) +jinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer) +{ + my_post_ptr post; + + post = (my_post_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_post_controller)); + cinfo->post = (struct jpeg_d_post_controller *) post; + post->pub.start_pass = start_pass_dpost; + post->whole_image = NULL; /* flag for no virtual arrays */ + post->buffer = NULL; /* flag for no strip buffer */ + + /* Create the quantization buffer, if needed */ + if (cinfo->quantize_colors) { + /* The buffer strip height is max_v_samp_factor, which is typically + * an efficient number of rows for upsampling to return. + * (In the presence of output rescaling, we might want to be smarter?) + */ + post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor; + if (need_full_buffer) { + /* Two-pass color quantization: need full-image storage. */ + /* We round up the number of rows to a multiple of the strip height. */ +#ifdef QUANT_2PASS_SUPPORTED + post->whole_image = (*cinfo->mem->request_virt_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, + cinfo->output_width * cinfo->out_color_components, + (JDIMENSION) jround_up((long) cinfo->output_height, + (long) post->strip_height), + post->strip_height); +#else + ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); +#endif /* QUANT_2PASS_SUPPORTED */ + } else { + /* One-pass color quantization: just make a strip buffer. */ + post->buffer = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + cinfo->output_width * cinfo->out_color_components, + post->strip_height); + } + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdsample.c b/third_party/windows/fltk-1.1.10/jpeg/jdsample.c new file mode 100644 index 0000000..e0d9040 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdsample.c @@ -0,0 +1,478 @@ +/* + * jdsample.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains upsampling routines. + * + * Upsampling input data is counted in "row groups". A row group + * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size) + * sample rows of each component. Upsampling will normally produce + * max_v_samp_factor pixel rows from each row group (but this could vary + * if the upsampler is applying a scale factor of its own). + * + * An excellent reference for image resampling is + * Digital Image Warping, George Wolberg, 1990. + * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Pointer to routine to upsample a single component */ +typedef JMETHOD(void, upsample1_ptr, + (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)); + +/* Private subobject */ + +typedef struct { + struct jpeg_upsampler pub; /* public fields */ + + /* Color conversion buffer. When using separate upsampling and color + * conversion steps, this buffer holds one upsampled row group until it + * has been color converted and output. + * Note: we do not allocate any storage for component(s) which are full-size, + * ie do not need rescaling. The corresponding entry of color_buf[] is + * simply set to point to the input data array, thereby avoiding copying. + */ + JSAMPARRAY color_buf[MAX_COMPONENTS]; + + /* Per-component upsampling method pointers */ + upsample1_ptr methods[MAX_COMPONENTS]; + + int next_row_out; /* counts rows emitted from color_buf */ + JDIMENSION rows_to_go; /* counts rows remaining in image */ + + /* Height of an input row group for each component. */ + int rowgroup_height[MAX_COMPONENTS]; + + /* These arrays save pixel expansion factors so that int_expand need not + * recompute them each time. They are unused for other upsampling methods. + */ + UINT8 h_expand[MAX_COMPONENTS]; + UINT8 v_expand[MAX_COMPONENTS]; +} my_upsampler; + +typedef my_upsampler * my_upsample_ptr; + + +/* + * Initialize for an upsampling pass. + */ + +METHODDEF(void) +start_pass_upsample (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + + /* Mark the conversion buffer empty */ + upsample->next_row_out = cinfo->max_v_samp_factor; + /* Initialize total-height counter for detecting bottom of image */ + upsample->rows_to_go = cinfo->output_height; +} + + +/* + * Control routine to do upsampling (and color conversion). + * + * In this version we upsample each component independently. + * We upsample one row group into the conversion buffer, then apply + * color conversion a row at a time. + */ + +METHODDEF(void) +sep_upsample (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + int ci; + jpeg_component_info * compptr; + JDIMENSION num_rows; + + /* Fill the conversion buffer, if it's empty */ + if (upsample->next_row_out >= cinfo->max_v_samp_factor) { + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Invoke per-component upsample method. Notice we pass a POINTER + * to color_buf[ci], so that fullsize_upsample can change it. + */ + (*upsample->methods[ci]) (cinfo, compptr, + input_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]), + upsample->color_buf + ci); + } + upsample->next_row_out = 0; + } + + /* Color-convert and emit rows */ + + /* How many we have in the buffer: */ + num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out); + /* Not more than the distance to the end of the image. Need this test + * in case the image height is not a multiple of max_v_samp_factor: + */ + if (num_rows > upsample->rows_to_go) + num_rows = upsample->rows_to_go; + /* And not more than what the client can accept: */ + out_rows_avail -= *out_row_ctr; + if (num_rows > out_rows_avail) + num_rows = out_rows_avail; + + (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf, + (JDIMENSION) upsample->next_row_out, + output_buf + *out_row_ctr, + (int) num_rows); + + /* Adjust counts */ + *out_row_ctr += num_rows; + upsample->rows_to_go -= num_rows; + upsample->next_row_out += num_rows; + /* When the buffer is emptied, declare this input row group consumed */ + if (upsample->next_row_out >= cinfo->max_v_samp_factor) + (*in_row_group_ctr)++; +} + + +/* + * These are the routines invoked by sep_upsample to upsample pixel values + * of a single component. One row group is processed per call. + */ + + +/* + * For full-size components, we just make color_buf[ci] point at the + * input buffer, and thus avoid copying any data. Note that this is + * safe only because sep_upsample doesn't declare the input row group + * "consumed" until we are done color converting and emitting it. + */ + +METHODDEF(void) +fullsize_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + *output_data_ptr = input_data; +} + + +/* + * This is a no-op version used for "uninteresting" components. + * These components will not be referenced by color conversion. + */ + +METHODDEF(void) +noop_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + *output_data_ptr = NULL; /* safety check */ +} + + +/* + * This version handles any integral sampling ratios. + * This is not used for typical JPEG files, so it need not be fast. + * Nor, for that matter, is it particularly accurate: the algorithm is + * simple replication of the input pixel onto the corresponding output + * pixels. The hi-falutin sampling literature refers to this as a + * "box filter". A box filter tends to introduce visible artifacts, + * so if you are actually going to use 3:1 or 4:1 sampling ratios + * you would be well advised to improve this code. + */ + +METHODDEF(void) +int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register JSAMPLE invalue; + register int h; + JSAMPROW outend; + int h_expand, v_expand; + int inrow, outrow; + + h_expand = upsample->h_expand[compptr->component_index]; + v_expand = upsample->v_expand[compptr->component_index]; + + inrow = outrow = 0; + while (outrow < cinfo->max_v_samp_factor) { + /* Generate one output row with proper horizontal expansion */ + inptr = input_data[inrow]; + outptr = output_data[outrow]; + outend = outptr + cinfo->output_width; + while (outptr < outend) { + invalue = *inptr++; /* don't need GETJSAMPLE() here */ + for (h = h_expand; h > 0; h--) { + *outptr++ = invalue; + } + } + /* Generate any additional output rows by duplicating the first one */ + if (v_expand > 1) { + jcopy_sample_rows(output_data, outrow, output_data, outrow+1, + v_expand-1, cinfo->output_width); + } + inrow++; + outrow += v_expand; + } +} + + +/* + * Fast processing for the common case of 2:1 horizontal and 1:1 vertical. + * It's still a box filter. + */ + +METHODDEF(void) +h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register JSAMPLE invalue; + JSAMPROW outend; + int inrow; + + for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { + inptr = input_data[inrow]; + outptr = output_data[inrow]; + outend = outptr + cinfo->output_width; + while (outptr < outend) { + invalue = *inptr++; /* don't need GETJSAMPLE() here */ + *outptr++ = invalue; + *outptr++ = invalue; + } + } +} + + +/* + * Fast processing for the common case of 2:1 horizontal and 2:1 vertical. + * It's still a box filter. + */ + +METHODDEF(void) +h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register JSAMPLE invalue; + JSAMPROW outend; + int inrow, outrow; + + inrow = outrow = 0; + while (outrow < cinfo->max_v_samp_factor) { + inptr = input_data[inrow]; + outptr = output_data[outrow]; + outend = outptr + cinfo->output_width; + while (outptr < outend) { + invalue = *inptr++; /* don't need GETJSAMPLE() here */ + *outptr++ = invalue; + *outptr++ = invalue; + } + jcopy_sample_rows(output_data, outrow, output_data, outrow+1, + 1, cinfo->output_width); + inrow++; + outrow += 2; + } +} + + +/* + * Fancy processing for the common case of 2:1 horizontal and 1:1 vertical. + * + * The upsampling algorithm is linear interpolation between pixel centers, + * also known as a "triangle filter". This is a good compromise between + * speed and visual quality. The centers of the output pixels are 1/4 and 3/4 + * of the way between input pixel centers. + * + * A note about the "bias" calculations: when rounding fractional values to + * integer, we do not want to always round 0.5 up to the next integer. + * If we did that, we'd introduce a noticeable bias towards larger values. + * Instead, this code is arranged so that 0.5 will be rounded up or down at + * alternate pixel locations (a simple ordered dither pattern). + */ + +METHODDEF(void) +h2v1_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr, outptr; + register int invalue; + register JDIMENSION colctr; + int inrow; + + for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { + inptr = input_data[inrow]; + outptr = output_data[inrow]; + /* Special case for first column */ + invalue = GETJSAMPLE(*inptr++); + *outptr++ = (JSAMPLE) invalue; + *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2); + + for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) { + /* General case: 3/4 * nearer pixel + 1/4 * further pixel */ + invalue = GETJSAMPLE(*inptr++) * 3; + *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2); + *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(*inptr) + 2) >> 2); + } + + /* Special case for last column */ + invalue = GETJSAMPLE(*inptr); + *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2); + *outptr++ = (JSAMPLE) invalue; + } +} + + +/* + * Fancy processing for the common case of 2:1 horizontal and 2:1 vertical. + * Again a triangle filter; see comments for h2v1 case, above. + * + * It is OK for us to reference the adjacent input rows because we demanded + * context from the main buffer controller (see initialization code). + */ + +METHODDEF(void) +h2v2_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) +{ + JSAMPARRAY output_data = *output_data_ptr; + register JSAMPROW inptr0, inptr1, outptr; +#if BITS_IN_JSAMPLE == 8 + register int thiscolsum, lastcolsum, nextcolsum; +#else + register INT32 thiscolsum, lastcolsum, nextcolsum; +#endif + register JDIMENSION colctr; + int inrow, outrow, v; + + inrow = outrow = 0; + while (outrow < cinfo->max_v_samp_factor) { + for (v = 0; v < 2; v++) { + /* inptr0 points to nearest input row, inptr1 points to next nearest */ + inptr0 = input_data[inrow]; + if (v == 0) /* next nearest is row above */ + inptr1 = input_data[inrow-1]; + else /* next nearest is row below */ + inptr1 = input_data[inrow+1]; + outptr = output_data[outrow++]; + + /* Special case for first column */ + thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); + nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); + *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4); + *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4); + lastcolsum = thiscolsum; thiscolsum = nextcolsum; + + for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) { + /* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */ + /* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */ + nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); + *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4); + *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4); + lastcolsum = thiscolsum; thiscolsum = nextcolsum; + } + + /* Special case for last column */ + *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4); + *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 7) >> 4); + } + inrow++; + } +} + + +/* + * Module initialization routine for upsampling. + */ + +GLOBAL(void) +jinit_upsampler (j_decompress_ptr cinfo) +{ + my_upsample_ptr upsample; + int ci; + jpeg_component_info * compptr; + boolean need_buffer, do_fancy; + int h_in_group, v_in_group, h_out_group, v_out_group; + + upsample = (my_upsample_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_upsampler)); + cinfo->upsample = (struct jpeg_upsampler *) upsample; + upsample->pub.start_pass = start_pass_upsample; + upsample->pub.upsample = sep_upsample; + upsample->pub.need_context_rows = FALSE; /* until we find out differently */ + + if (cinfo->CCIR601_sampling) /* this isn't supported */ + ERREXIT(cinfo, JERR_CCIR601_NOTIMPL); + + /* jdmainct.c doesn't support context rows when min_DCT_scaled_size = 1, + * so don't ask for it. + */ + do_fancy = cinfo->do_fancy_upsampling && cinfo->min_DCT_scaled_size > 1; + + /* Verify we can handle the sampling factors, select per-component methods, + * and create storage as needed. + */ + for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; + ci++, compptr++) { + /* Compute size of an "input group" after IDCT scaling. This many samples + * are to be converted to max_h_samp_factor * max_v_samp_factor pixels. + */ + h_in_group = (compptr->h_samp_factor * compptr->DCT_scaled_size) / + cinfo->min_DCT_scaled_size; + v_in_group = (compptr->v_samp_factor * compptr->DCT_scaled_size) / + cinfo->min_DCT_scaled_size; + h_out_group = cinfo->max_h_samp_factor; + v_out_group = cinfo->max_v_samp_factor; + upsample->rowgroup_height[ci] = v_in_group; /* save for use later */ + need_buffer = TRUE; + if (! compptr->component_needed) { + /* Don't bother to upsample an uninteresting component. */ + upsample->methods[ci] = noop_upsample; + need_buffer = FALSE; + } else if (h_in_group == h_out_group && v_in_group == v_out_group) { + /* Fullsize components can be processed without any work. */ + upsample->methods[ci] = fullsize_upsample; + need_buffer = FALSE; + } else if (h_in_group * 2 == h_out_group && + v_in_group == v_out_group) { + /* Special cases for 2h1v upsampling */ + if (do_fancy && compptr->downsampled_width > 2) + upsample->methods[ci] = h2v1_fancy_upsample; + else + upsample->methods[ci] = h2v1_upsample; + } else if (h_in_group * 2 == h_out_group && + v_in_group * 2 == v_out_group) { + /* Special cases for 2h2v upsampling */ + if (do_fancy && compptr->downsampled_width > 2) { + upsample->methods[ci] = h2v2_fancy_upsample; + upsample->pub.need_context_rows = TRUE; + } else + upsample->methods[ci] = h2v2_upsample; + } else if ((h_out_group % h_in_group) == 0 && + (v_out_group % v_in_group) == 0) { + /* Generic integral-factors upsampling method */ + upsample->methods[ci] = int_upsample; + upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group); + upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group); + } else + ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL); + if (need_buffer) { + upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) jround_up((long) cinfo->output_width, + (long) cinfo->max_h_samp_factor), + (JDIMENSION) cinfo->max_v_samp_factor); + } + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jdtrans.c b/third_party/windows/fltk-1.1.10/jpeg/jdtrans.c new file mode 100644 index 0000000..12c193c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jdtrans.c @@ -0,0 +1,143 @@ +/* + * jdtrans.c + * + * Copyright (C) 1995-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains library routines for transcoding decompression, + * that is, reading raw DCT coefficient arrays from an input JPEG file. + * The routines in jdapimin.c will also be needed by a transcoder. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* Forward declarations */ +LOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo)); + + +/* + * Read the coefficient arrays from a JPEG file. + * jpeg_read_header must be completed before calling this. + * + * The entire image is read into a set of virtual coefficient-block arrays, + * one per component. The return value is a pointer to the array of + * virtual-array descriptors. These can be manipulated directly via the + * JPEG memory manager, or handed off to jpeg_write_coefficients(). + * To release the memory occupied by the virtual arrays, call + * jpeg_finish_decompress() when done with the data. + * + * An alternative usage is to simply obtain access to the coefficient arrays + * during a buffered-image-mode decompression operation. This is allowed + * after any jpeg_finish_output() call. The arrays can be accessed until + * jpeg_finish_decompress() is called. (Note that any call to the library + * may reposition the arrays, so don't rely on access_virt_barray() results + * to stay valid across library calls.) + * + * Returns NULL if suspended. This case need be checked only if + * a suspending data source is used. + */ + +GLOBAL(jvirt_barray_ptr *) +jpeg_read_coefficients (j_decompress_ptr cinfo) +{ + if (cinfo->global_state == DSTATE_READY) { + /* First call: initialize active modules */ + transdecode_master_selection(cinfo); + cinfo->global_state = DSTATE_RDCOEFS; + } + if (cinfo->global_state == DSTATE_RDCOEFS) { + /* Absorb whole file into the coef buffer */ + for (;;) { + int retcode; + /* Call progress monitor hook if present */ + if (cinfo->progress != NULL) + (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); + /* Absorb some more input */ + retcode = (*cinfo->inputctl->consume_input) (cinfo); + if (retcode == JPEG_SUSPENDED) + return NULL; + if (retcode == JPEG_REACHED_EOI) + break; + /* Advance progress counter if appropriate */ + if (cinfo->progress != NULL && + (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { + if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { + /* startup underestimated number of scans; ratchet up one scan */ + cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; + } + } + } + /* Set state so that jpeg_finish_decompress does the right thing */ + cinfo->global_state = DSTATE_STOPPING; + } + /* At this point we should be in state DSTATE_STOPPING if being used + * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access + * to the coefficients during a full buffered-image-mode decompression. + */ + if ((cinfo->global_state == DSTATE_STOPPING || + cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) { + return cinfo->coef->coef_arrays; + } + /* Oops, improper usage */ + ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); + return NULL; /* keep compiler happy */ +} + + +/* + * Master selection of decompression modules for transcoding. + * This substitutes for jdmaster.c's initialization of the full decompressor. + */ + +LOCAL(void) +transdecode_master_selection (j_decompress_ptr cinfo) +{ + /* This is effectively a buffered-image operation. */ + cinfo->buffered_image = TRUE; + + /* Entropy decoding: either Huffman or arithmetic coding. */ + if (cinfo->arith_code) { + ERREXIT(cinfo, JERR_ARITH_NOTIMPL); + } else { + if (cinfo->progressive_mode) { +#ifdef D_PROGRESSIVE_SUPPORTED + jinit_phuff_decoder(cinfo); +#else + ERREXIT(cinfo, JERR_NOT_COMPILED); +#endif + } else + jinit_huff_decoder(cinfo); + } + + /* Always get a full-image coefficient buffer. */ + jinit_d_coef_controller(cinfo, TRUE); + + /* We can now tell the memory manager to allocate virtual arrays. */ + (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); + + /* Initialize input side of decompressor to consume first scan. */ + (*cinfo->inputctl->start_input_pass) (cinfo); + + /* Initialize progress monitoring. */ + if (cinfo->progress != NULL) { + int nscans; + /* Estimate number of scans to set pass_limit. */ + if (cinfo->progressive_mode) { + /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ + nscans = 2 + 3 * cinfo->num_components; + } else if (cinfo->inputctl->has_multiple_scans) { + /* For a nonprogressive multiscan file, estimate 1 scan per component. */ + nscans = cinfo->num_components; + } else { + nscans = 1; + } + cinfo->progress->pass_counter = 0L; + cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; + cinfo->progress->completed_passes = 0; + cinfo->progress->total_passes = 1; + } +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jerror.c b/third_party/windows/fltk-1.1.10/jpeg/jerror.c new file mode 100644 index 0000000..7f3094b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jerror.c @@ -0,0 +1,253 @@ +/* + * jerror.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains simple error-reporting and trace-message routines. + * These are suitable for Unix-like systems and others where writing to + * stderr is the right thing to do. Many applications will want to replace + * some or all of these routines. + * + * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile, + * you get a Windows-specific hack to display error messages in a dialog box. + * It ain't much, but it beats dropping error messages into the bit bucket, + * which is what happens to output to stderr under most Windows C compilers. + * + * These routines are used by both the compression and decompression code. + */ + +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jversion.h" +#include "jerror.h" +#include + +#ifdef USE_WINDOWS_MESSAGEBOX +#include +#endif + +#ifndef EXIT_FAILURE /* define exit() codes if not provided */ +#define EXIT_FAILURE 1 +#endif + + +/* + * Create the message string table. + * We do this from the master message list in jerror.h by re-reading + * jerror.h with a suitable definition for macro JMESSAGE. + * The message table is made an external symbol just in case any applications + * want to refer to it directly. + */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_std_message_table jMsgTable +#endif + +#define JMESSAGE(code,string) string , + +const char * const jpeg_std_message_table[] = { +#include "jerror.h" + NULL +}; + + +/* + * Error exit handler: must not return to caller. + * + * Applications may override this if they want to get control back after + * an error. Typically one would longjmp somewhere instead of exiting. + * The setjmp buffer can be made a private field within an expanded error + * handler object. Note that the info needed to generate an error message + * is stored in the error object, so you can generate the message now or + * later, at your convenience. + * You should make sure that the JPEG object is cleaned up (with jpeg_abort + * or jpeg_destroy) at some point. + */ + +METHODDEF(void) +error_exit (j_common_ptr cinfo) +{ + /* Always display the message */ + (*cinfo->err->output_message) (cinfo); + + /* Let the memory manager delete any temp files before we die */ + jpeg_destroy(cinfo); + + exit(EXIT_FAILURE); +} + + +/* + * Actual output of an error or trace message. + * Applications may override this method to send JPEG messages somewhere + * other than stderr. + * + * On Windows, printing to stderr is generally completely useless, + * so we provide optional code to produce an error-dialog popup. + * Most Windows applications will still prefer to override this routine, + * but if they don't, it'll do something at least marginally useful. + * + * NOTE: to use the library in an environment that doesn't support the + * C stdio library, you may have to delete the call to fprintf() entirely, + * not just not use this routine. + */ + +METHODDEF(void) +output_message (j_common_ptr cinfo) +{ + char buffer[JMSG_LENGTH_MAX]; + + /* Create the message */ + (*cinfo->err->format_message) (cinfo, buffer); + +#ifdef USE_WINDOWS_MESSAGEBOX + /* Display it in a message dialog box */ + MessageBox(GetActiveWindow(), buffer, "JPEG Library Error", + MB_OK | MB_ICONERROR); +#else + /* Send it to stderr, adding a newline */ + fprintf(stderr, "%s\n", buffer); +#endif +} + + +/* + * Decide whether to emit a trace or warning message. + * msg_level is one of: + * -1: recoverable corrupt-data warning, may want to abort. + * 0: important advisory messages (always display to user). + * 1: first level of tracing detail. + * 2,3,...: successively more detailed tracing messages. + * An application might override this method if it wanted to abort on warnings + * or change the policy about which messages to display. + */ + +METHODDEF(void) +emit_message (j_common_ptr cinfo, int msg_level) +{ + struct jpeg_error_mgr * err = cinfo->err; + + if (msg_level < 0) { + /* It's a warning message. Since corrupt files may generate many warnings, + * the policy implemented here is to show only the first warning, + * unless trace_level >= 3. + */ + if (err->num_warnings == 0 || err->trace_level >= 3) + (*err->output_message) (cinfo); + /* Always count warnings in num_warnings. */ + err->num_warnings++; + } else { + /* It's a trace message. Show it if trace_level >= msg_level. */ + if (err->trace_level >= msg_level) + (*err->output_message) (cinfo); + } +} + + +/* + * Format a message string for the most recent JPEG error or message. + * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX + * characters. Note that no '\n' character is added to the string. + * Few applications should need to override this method. + */ + +METHODDEF(void) +format_message (j_common_ptr cinfo, char * buffer) +{ + struct jpeg_error_mgr * err = cinfo->err; + int msg_code = err->msg_code; + const char * msgtext = NULL; + const char * msgptr; + char ch; + boolean isstring; + + /* Look up message string in proper table */ + if (msg_code > 0 && msg_code <= err->last_jpeg_message) { + msgtext = err->jpeg_message_table[msg_code]; + } else if (err->addon_message_table != NULL && + msg_code >= err->first_addon_message && + msg_code <= err->last_addon_message) { + msgtext = err->addon_message_table[msg_code - err->first_addon_message]; + } + + /* Defend against bogus message number */ + if (msgtext == NULL) { + err->msg_parm.i[0] = msg_code; + msgtext = err->jpeg_message_table[0]; + } + + /* Check for string parameter, as indicated by %s in the message text */ + isstring = FALSE; + msgptr = msgtext; + while ((ch = *msgptr++) != '\0') { + if (ch == '%') { + if (*msgptr == 's') isstring = TRUE; + break; + } + } + + /* Format the message into the passed buffer */ + if (isstring) + sprintf(buffer, msgtext, err->msg_parm.s); + else + sprintf(buffer, msgtext, + err->msg_parm.i[0], err->msg_parm.i[1], + err->msg_parm.i[2], err->msg_parm.i[3], + err->msg_parm.i[4], err->msg_parm.i[5], + err->msg_parm.i[6], err->msg_parm.i[7]); +} + + +/* + * Reset error state variables at start of a new image. + * This is called during compression startup to reset trace/error + * processing to default state, without losing any application-specific + * method pointers. An application might possibly want to override + * this method if it has additional error processing state. + */ + +METHODDEF(void) +reset_error_mgr (j_common_ptr cinfo) +{ + cinfo->err->num_warnings = 0; + /* trace_level is not reset since it is an application-supplied parameter */ + cinfo->err->msg_code = 0; /* may be useful as a flag for "no error" */ +} + + +/* + * Fill in the standard error-handling methods in a jpeg_error_mgr object. + * Typical call is: + * struct jpeg_compress_struct cinfo; + * struct jpeg_error_mgr err; + * + * cinfo.err = jpeg_std_error(&err); + * after which the application may override some of the methods. + */ + +GLOBAL(struct jpeg_error_mgr *) +jpeg_std_error (struct jpeg_error_mgr * err) +{ + err->error_exit = error_exit; + err->emit_message = emit_message; + err->output_message = output_message; + err->format_message = format_message; + err->reset_error_mgr = reset_error_mgr; + + err->trace_level = 0; /* default = no tracing */ + err->num_warnings = 0; /* no warnings emitted yet */ + err->msg_code = 0; /* may be useful as a flag for "no error" */ + + /* Initialize message table pointers */ + err->jpeg_message_table = jpeg_std_message_table; + err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1; + + err->addon_message_table = NULL; + err->first_addon_message = 0; /* for safety */ + err->last_addon_message = 0; + + return err; +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jerror.h b/third_party/windows/fltk-1.1.10/jpeg/jerror.h new file mode 100644 index 0000000..79084f2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jerror.h @@ -0,0 +1,291 @@ +/* + * jerror.h + * + * Copyright (C) 1994-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the error and message codes for the JPEG library. + * Edit this file to add new codes, or to translate the message strings to + * some other language. + * A set of error-reporting macros are defined too. Some applications using + * the JPEG library may wish to include this file to get the error codes + * and/or the macros. + */ + +/* + * To define the enum list of message codes, include this file without + * defining macro JMESSAGE. To create a message string table, include it + * again with a suitable JMESSAGE definition (see jerror.c for an example). + */ +#ifndef JMESSAGE +#ifndef JERROR_H +/* First time through, define the enum list */ +#define JMAKE_ENUM_LIST +#else +/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ +#define JMESSAGE(code,string) +#endif /* JERROR_H */ +#endif /* JMESSAGE */ + +#ifdef JMAKE_ENUM_LIST + +typedef enum { + +#define JMESSAGE(code,string) code , + +#endif /* JMAKE_ENUM_LIST */ + +JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ + +/* For maintenance convenience, list is alphabetical by message code name */ +JMESSAGE(JERR_ARITH_NOTIMPL, + "Sorry, there are legal restrictions on arithmetic coding") +JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") +JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") +JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") +JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") +JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") +JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported") +JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") +JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") +JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") +JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") +JMESSAGE(JERR_BAD_LIB_VERSION, + "Wrong JPEG library version: library is %d, caller expects %d") +JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") +JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") +JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") +JMESSAGE(JERR_BAD_PROGRESSION, + "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") +JMESSAGE(JERR_BAD_PROG_SCRIPT, + "Invalid progressive parameters at scan script entry %d") +JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") +JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") +JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") +JMESSAGE(JERR_BAD_STRUCT_SIZE, + "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") +JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") +JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") +JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") +JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") +JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") +JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") +JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") +JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") +JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") +JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") +JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") +JMESSAGE(JERR_EMS_READ, "Read from EMS failed") +JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") +JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") +JMESSAGE(JERR_FILE_READ, "Input file read error") +JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") +JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") +JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") +JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") +JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") +JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") +JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") +JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, + "Cannot transcode due to multiple use of quantization table %d") +JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") +JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") +JMESSAGE(JERR_NOTIMPL, "Not implemented yet") +JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") +JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") +JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") +JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") +JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") +JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") +JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") +JMESSAGE(JERR_QUANT_COMPONENTS, + "Cannot quantize more than %d color components") +JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") +JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") +JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") +JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") +JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") +JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") +JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF") +JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") +JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") +JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") +JMESSAGE(JERR_TFILE_WRITE, + "Write failed on temporary file --- out of disk space?") +JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") +JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") +JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") +JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") +JMESSAGE(JERR_XMS_READ, "Read from XMS failed") +JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") +JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) +JMESSAGE(JMSG_VERSION, JVERSION) +JMESSAGE(JTRC_16BIT_TABLES, + "Caution: quantization tables are too coarse for baseline JPEG") +JMESSAGE(JTRC_ADOBE, + "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") +JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") +JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") +JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") +JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") +JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") +JMESSAGE(JTRC_DRI, "Define Restart Interval %u") +JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") +JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") +JMESSAGE(JTRC_EOI, "End Of Image") +JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") +JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") +JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, + "Warning: thumbnail image size does not match data length %u") +JMESSAGE(JTRC_JFIF_EXTENSION, + "JFIF extension marker: type 0x%02x, length %u") +JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") +JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") +JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") +JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") +JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") +JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") +JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") +JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") +JMESSAGE(JTRC_RST, "RST%d") +JMESSAGE(JTRC_SMOOTH_NOTIMPL, + "Smoothing not supported with nonstandard sampling ratios") +JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") +JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") +JMESSAGE(JTRC_SOI, "Start of Image") +JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") +JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") +JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") +JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") +JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") +JMESSAGE(JTRC_THUMB_JPEG, + "JFIF extension marker: JPEG-compressed thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_PALETTE, + "JFIF extension marker: palette thumbnail image, length %u") +JMESSAGE(JTRC_THUMB_RGB, + "JFIF extension marker: RGB thumbnail image, length %u") +JMESSAGE(JTRC_UNKNOWN_IDS, + "Unrecognized component IDs %d %d %d, assuming YCbCr") +JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") +JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") +JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") +JMESSAGE(JWRN_BOGUS_PROGRESSION, + "Inconsistent progression sequence for component %d coefficient %d") +JMESSAGE(JWRN_EXTRANEOUS_DATA, + "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") +JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") +JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") +JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") +JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") +JMESSAGE(JWRN_MUST_RESYNC, + "Corrupt JPEG data: found marker 0x%02x instead of RST%d") +JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") +JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") + +#ifdef JMAKE_ENUM_LIST + + JMSG_LASTMSGCODE +} J_MESSAGE_CODE; + +#undef JMAKE_ENUM_LIST +#endif /* JMAKE_ENUM_LIST */ + +/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ +#undef JMESSAGE + + +#ifndef JERROR_H +#define JERROR_H + +/* Macros to simplify using the error and trace message stuff */ +/* The first parameter is either type of cinfo pointer */ + +/* Fatal errors (print message and exit) */ +#define ERREXIT(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT3(cinfo,code,p1,p2,p3) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (cinfo)->err->msg_parm.i[2] = (p3), \ + (cinfo)->err->msg_parm.i[3] = (p4), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) +#define ERREXITS(cinfo,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) + +#define MAKESTMT(stuff) do { stuff } while (0) + +/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ +#define WARNMS(cinfo,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS1(cinfo,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) +#define WARNMS2(cinfo,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) + +/* Informational/debugging messages */ +#define TRACEMS(cinfo,lvl,code) \ + ((cinfo)->err->msg_code = (code), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS1(cinfo,lvl,code,p1) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS2(cinfo,lvl,code,p1,p2) \ + ((cinfo)->err->msg_code = (code), \ + (cinfo)->err->msg_parm.i[0] = (p1), \ + (cinfo)->err->msg_parm.i[1] = (p2), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) +#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ + MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ + _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ + _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ + (cinfo)->err->msg_code = (code); \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) +#define TRACEMSS(cinfo,lvl,code,str) \ + ((cinfo)->err->msg_code = (code), \ + strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ + (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) + +#endif /* JERROR_H */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jfdctflt.c b/third_party/windows/fltk-1.1.10/jpeg/jfdctflt.c new file mode 100644 index 0000000..7ccfb38 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jfdctflt.c @@ -0,0 +1,168 @@ +/* + * jfdctflt.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a floating-point implementation of the + * forward DCT (Discrete Cosine Transform). + * + * This implementation should be more accurate than either of the integer + * DCT implementations. However, it may not give the same results on all + * machines because of differences in roundoff behavior. Speed will depend + * on the hardware's floating point capacity. + * + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with a fixed-point + * implementation, accuracy is lost due to imprecise representation of the + * scaled quantization values. However, that problem does not arise if + * we use floating point arithmetic. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_FLOAT_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL(void) +jpeg_fdct_float (FAST_FLOAT * data) +{ + FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + FAST_FLOAT tmp10, tmp11, tmp12, tmp13; + FAST_FLOAT z1, z2, z3, z4, z5, z11, z13; + FAST_FLOAT *dataptr; + int ctr; + + /* Pass 1: process rows. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[0] + dataptr[7]; + tmp7 = dataptr[0] - dataptr[7]; + tmp1 = dataptr[1] + dataptr[6]; + tmp6 = dataptr[1] - dataptr[6]; + tmp2 = dataptr[2] + dataptr[5]; + tmp5 = dataptr[2] - dataptr[5]; + tmp3 = dataptr[3] + dataptr[4]; + tmp4 = dataptr[3] - dataptr[4]; + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[0] = tmp10 + tmp11; /* phase 3 */ + dataptr[4] = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ + dataptr[2] = tmp13 + z1; /* phase 5 */ + dataptr[6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */ + z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */ + z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */ + z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[5] = z13 + z2; /* phase 6 */ + dataptr[3] = z13 - z2; + dataptr[1] = z11 + z4; + dataptr[7] = z11 - z4; + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ + dataptr[DCTSIZE*4] = tmp10 - tmp11; + + z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ + dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ + dataptr[DCTSIZE*6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */ + z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */ + z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */ + z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */ + dataptr[DCTSIZE*3] = z13 - z2; + dataptr[DCTSIZE*1] = z11 + z4; + dataptr[DCTSIZE*7] = z11 - z4; + + dataptr++; /* advance pointer to next column */ + } +} + +#endif /* DCT_FLOAT_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jfdctfst.c b/third_party/windows/fltk-1.1.10/jpeg/jfdctfst.c new file mode 100644 index 0000000..005a74f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jfdctfst.c @@ -0,0 +1,224 @@ +/* + * jfdctfst.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a fast, not so accurate integer implementation of the + * forward DCT (Discrete Cosine Transform). + * + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with fixed-point math, + * accuracy is lost due to imprecise representation of the scaled + * quantization values. The smaller the quantization table entry, the less + * precise the scaled value, so this implementation does worse with high- + * quality-setting files than with low-quality ones. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_IFAST_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Scaling decisions are generally the same as in the LL&M algorithm; + * see jfdctint.c for more details. However, we choose to descale + * (right shift) multiplication products as soon as they are formed, + * rather than carrying additional fractional bits into subsequent additions. + * This compromises accuracy slightly, but it lets us save a few shifts. + * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) + * everywhere except in the multiplications proper; this saves a good deal + * of work on 16-bit-int machines. + * + * Again to save a few shifts, the intermediate results between pass 1 and + * pass 2 are not upscaled, but are represented only to integral precision. + * + * A final compromise is to represent the multiplicative constants to only + * 8 fractional bits, rather than 13. This saves some shifting work on some + * machines, and may also reduce the cost of multiplication (since there + * are fewer one-bits in the constants). + */ + +#define CONST_BITS 8 + + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 8 +#define FIX_0_382683433 ((INT32) 98) /* FIX(0.382683433) */ +#define FIX_0_541196100 ((INT32) 139) /* FIX(0.541196100) */ +#define FIX_0_707106781 ((INT32) 181) /* FIX(0.707106781) */ +#define FIX_1_306562965 ((INT32) 334) /* FIX(1.306562965) */ +#else +#define FIX_0_382683433 FIX(0.382683433) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_707106781 FIX(0.707106781) +#define FIX_1_306562965 FIX(1.306562965) +#endif + + +/* We can gain a little more speed, with a further compromise in accuracy, + * by omitting the addition in a descaling shift. This yields an incorrectly + * rounded result half the time... + */ + +#ifndef USE_ACCURATE_ROUNDING +#undef DESCALE +#define DESCALE(x,n) RIGHT_SHIFT(x, n) +#endif + + +/* Multiply a DCTELEM variable by an INT32 constant, and immediately + * descale to yield a DCTELEM result. + */ + +#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS)) + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL(void) +jpeg_fdct_ifast (DCTELEM * data) +{ + DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + DCTELEM tmp10, tmp11, tmp12, tmp13; + DCTELEM z1, z2, z3, z4, z5, z11, z13; + DCTELEM *dataptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[0] + dataptr[7]; + tmp7 = dataptr[0] - dataptr[7]; + tmp1 = dataptr[1] + dataptr[6]; + tmp6 = dataptr[1] - dataptr[6]; + tmp2 = dataptr[2] + dataptr[5]; + tmp5 = dataptr[2] - dataptr[5]; + tmp3 = dataptr[3] + dataptr[4]; + tmp4 = dataptr[3] - dataptr[4]; + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[0] = tmp10 + tmp11; /* phase 3 */ + dataptr[4] = tmp10 - tmp11; + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ + dataptr[2] = tmp13 + z1; /* phase 5 */ + dataptr[6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ + z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ + z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ + z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[5] = z13 + z2; /* phase 6 */ + dataptr[3] = z13 - z2; + dataptr[1] = z11 + z4; + dataptr[7] = z11 - z4; + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + /* Even part */ + + tmp10 = tmp0 + tmp3; /* phase 2 */ + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ + dataptr[DCTSIZE*4] = tmp10 - tmp11; + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ + dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ + dataptr[DCTSIZE*6] = tmp13 - z1; + + /* Odd part */ + + tmp10 = tmp4 + tmp5; /* phase 2 */ + tmp11 = tmp5 + tmp6; + tmp12 = tmp6 + tmp7; + + /* The rotator is modified from fig 4-8 to avoid extra negations. */ + z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ + z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ + z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ + z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ + + z11 = tmp7 + z3; /* phase 5 */ + z13 = tmp7 - z3; + + dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */ + dataptr[DCTSIZE*3] = z13 - z2; + dataptr[DCTSIZE*1] = z11 + z4; + dataptr[DCTSIZE*7] = z11 - z4; + + dataptr++; /* advance pointer to next column */ + } +} + +#endif /* DCT_IFAST_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jfdctint.c b/third_party/windows/fltk-1.1.10/jpeg/jfdctint.c new file mode 100644 index 0000000..d626927 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jfdctint.c @@ -0,0 +1,283 @@ +/* + * jfdctint.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a slow-but-accurate integer implementation of the + * forward DCT (Discrete Cosine Transform). + * + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * This implementation is based on an algorithm described in + * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + * The primary algorithm described there uses 11 multiplies and 29 adds. + * We use their alternate method with 12 multiplies and 32 adds. + * The advantage of this method is that no data path contains more than one + * multiplication; this allows a very simple and accurate implementation in + * scaled fixed-point arithmetic, with a minimal number of shifts. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_ISLOW_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* + * The poop on this scaling stuff is as follows: + * + * Each 1-D DCT step produces outputs which are a factor of sqrt(N) + * larger than the true DCT outputs. The final outputs are therefore + * a factor of N larger than desired; since N=8 this can be cured by + * a simple right shift at the end of the algorithm. The advantage of + * this arrangement is that we save two multiplications per 1-D DCT, + * because the y0 and y4 outputs need not be divided by sqrt(N). + * In the IJG code, this factor of 8 is removed by the quantization step + * (in jcdctmgr.c), NOT in this module. + * + * We have to do addition and subtraction of the integer inputs, which + * is no problem, and multiplication by fractional constants, which is + * a problem to do in integer arithmetic. We multiply all the constants + * by CONST_SCALE and convert them to integer constants (thus retaining + * CONST_BITS bits of precision in the constants). After doing a + * multiplication we have to divide the product by CONST_SCALE, with proper + * rounding, to produce the correct output. This division can be done + * cheaply as a right shift of CONST_BITS bits. We postpone shifting + * as long as possible so that partial sums can be added together with + * full fractional precision. + * + * The outputs of the first pass are scaled up by PASS1_BITS bits so that + * they are represented to better-than-integral precision. These outputs + * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word + * with the recommended scaling. (For 12-bit sample data, the intermediate + * array is INT32 anyway.) + * + * To avoid overflow of the 32-bit intermediate results in pass 2, we must + * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis + * shows that the values given below are the most effective. + */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 13 +#define PASS1_BITS 2 +#else +#define CONST_BITS 13 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#else +#define FIX_0_298631336 FIX(0.298631336) +#define FIX_0_390180644 FIX(0.390180644) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_175875602 FIX(1.175875602) +#define FIX_1_501321110 FIX(1.501321110) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_1_961570560 FIX(1.961570560) +#define FIX_2_053119869 FIX(2.053119869) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_072711026 FIX(3.072711026) +#endif + + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * For 8-bit samples with the recommended scaling, all the variable + * and constant values involved are no more than 16 bits wide, so a + * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + * For 12-bit samples, a full 32-bit multiplication will be needed. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MULTIPLY(var,const) MULTIPLY16C16(var,const) +#else +#define MULTIPLY(var,const) ((var) * (const)) +#endif + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL(void) +jpeg_fdct_islow (DCTELEM * data) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3, z4, z5; + DCTELEM *dataptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[0] + dataptr[7]; + tmp7 = dataptr[0] - dataptr[7]; + tmp1 = dataptr[1] + dataptr[6]; + tmp6 = dataptr[1] - dataptr[6]; + tmp2 = dataptr[2] + dataptr[5]; + tmp5 = dataptr[2] - dataptr[5]; + tmp3 = dataptr[3] + dataptr[4]; + tmp4 = dataptr[3] - dataptr[4]; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), + CONST_BITS-PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents cos(K*pi/16). + * i0..i3 in the paper are tmp4..tmp7 here. + */ + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS); + dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), + CONST_BITS+PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents cos(K*pi/16). + * i0..i3 in the paper are tmp4..tmp7 here. + */ + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + +#endif /* DCT_ISLOW_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jidctflt.c b/third_party/windows/fltk-1.1.10/jpeg/jidctflt.c new file mode 100644 index 0000000..5fea54c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jidctflt.c @@ -0,0 +1,242 @@ +/* + * jidctflt.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a floating-point implementation of the + * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine + * must also perform dequantization of the input coefficients. + * + * This implementation should be more accurate than either of the integer + * IDCT implementations. However, it may not give the same results on all + * machines because of differences in roundoff behavior. Speed will depend + * on the hardware's floating point capacity. + * + * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT + * on each row (or vice versa, but it's more convenient to emit a row at + * a time). Direct algorithms are also available, but they are much more + * complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with a fixed-point + * implementation, accuracy is lost due to imprecise representation of the + * scaled quantization values. However, that problem does not arise if + * we use floating point arithmetic. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_FLOAT_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce a float result. + */ + +#define DEQUANTIZE(coef,quantval) (((FAST_FLOAT) (coef)) * (quantval)) + + +/* + * Perform dequantization and inverse DCT on one block of coefficients. + */ + +GLOBAL(void) +jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + FAST_FLOAT tmp10, tmp11, tmp12, tmp13; + FAST_FLOAT z5, z10, z11, z12, z13; + JCOEFPTR inptr; + FLOAT_MULT_TYPE * quantptr; + FAST_FLOAT * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (FLOAT_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + FAST_FLOAT dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = tmp0 + tmp2; /* phase 3 */ + tmp11 = tmp0 - tmp2; + + tmp13 = tmp1 + tmp3; /* phases 5-3 */ + tmp12 = (tmp1 - tmp3) * ((FAST_FLOAT) 1.414213562) - tmp13; /* 2*c4 */ + + tmp0 = tmp10 + tmp13; /* phase 2 */ + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z13 = tmp6 + tmp5; /* phase 6 */ + z10 = tmp6 - tmp5; + z11 = tmp4 + tmp7; + z12 = tmp4 - tmp7; + + tmp7 = z11 + z13; /* phase 5 */ + tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); /* 2*c4 */ + + z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ + tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */ + tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; /* phase 2 */ + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + wsptr[DCTSIZE*0] = tmp0 + tmp7; + wsptr[DCTSIZE*7] = tmp0 - tmp7; + wsptr[DCTSIZE*1] = tmp1 + tmp6; + wsptr[DCTSIZE*6] = tmp1 - tmp6; + wsptr[DCTSIZE*2] = tmp2 + tmp5; + wsptr[DCTSIZE*5] = tmp2 - tmp5; + wsptr[DCTSIZE*4] = tmp3 + tmp4; + wsptr[DCTSIZE*3] = tmp3 - tmp4; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3. */ + + wsptr = workspace; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * And testing floats for zero is relatively expensive, so we don't bother. + */ + + /* Even part */ + + tmp10 = wsptr[0] + wsptr[4]; + tmp11 = wsptr[0] - wsptr[4]; + + tmp13 = wsptr[2] + wsptr[6]; + tmp12 = (wsptr[2] - wsptr[6]) * ((FAST_FLOAT) 1.414213562) - tmp13; + + tmp0 = tmp10 + tmp13; + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + z13 = wsptr[5] + wsptr[3]; + z10 = wsptr[5] - wsptr[3]; + z11 = wsptr[1] + wsptr[7]; + z12 = wsptr[1] - wsptr[7]; + + tmp7 = z11 + z13; + tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); + + z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ + tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */ + tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + /* Final output stage: scale down by a factor of 8 and range-limit */ + + outptr[0] = range_limit[(int) DESCALE((INT32) (tmp0 + tmp7), 3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) DESCALE((INT32) (tmp0 - tmp7), 3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) DESCALE((INT32) (tmp1 + tmp6), 3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) DESCALE((INT32) (tmp1 - tmp6), 3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) DESCALE((INT32) (tmp2 + tmp5), 3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) DESCALE((INT32) (tmp2 - tmp5), 3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) DESCALE((INT32) (tmp3 + tmp4), 3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) DESCALE((INT32) (tmp3 - tmp4), 3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#endif /* DCT_FLOAT_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jidctfst.c b/third_party/windows/fltk-1.1.10/jpeg/jidctfst.c new file mode 100644 index 0000000..078b8c4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jidctfst.c @@ -0,0 +1,368 @@ +/* + * jidctfst.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a fast, not so accurate integer implementation of the + * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine + * must also perform dequantization of the input coefficients. + * + * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT + * on each row (or vice versa, but it's more convenient to emit a row at + * a time). Direct algorithms are also available, but they are much more + * complex and seem not to be any faster when reduced to code. + * + * This implementation is based on Arai, Agui, and Nakajima's algorithm for + * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in + * Japanese, but the algorithm is described in the Pennebaker & Mitchell + * JPEG textbook (see REFERENCES section in file README). The following code + * is based directly on figure 4-8 in P&M. + * While an 8-point DCT cannot be done in less than 11 multiplies, it is + * possible to arrange the computation so that many of the multiplies are + * simple scalings of the final outputs. These multiplies can then be + * folded into the multiplications or divisions by the JPEG quantization + * table entries. The AA&N method leaves only 5 multiplies and 29 adds + * to be done in the DCT itself. + * The primary disadvantage of this method is that with fixed-point math, + * accuracy is lost due to imprecise representation of the scaled + * quantization values. The smaller the quantization table entry, the less + * precise the scaled value, so this implementation does worse with high- + * quality-setting files than with low-quality ones. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_IFAST_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Scaling decisions are generally the same as in the LL&M algorithm; + * see jidctint.c for more details. However, we choose to descale + * (right shift) multiplication products as soon as they are formed, + * rather than carrying additional fractional bits into subsequent additions. + * This compromises accuracy slightly, but it lets us save a few shifts. + * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) + * everywhere except in the multiplications proper; this saves a good deal + * of work on 16-bit-int machines. + * + * The dequantized coefficients are not integers because the AA&N scaling + * factors have been incorporated. We represent them scaled up by PASS1_BITS, + * so that the first and second IDCT rounds have the same input scaling. + * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to + * avoid a descaling shift; this compromises accuracy rather drastically + * for small quantization table entries, but it saves a lot of shifts. + * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway, + * so we use a much larger scaling factor to preserve accuracy. + * + * A final compromise is to represent the multiplicative constants to only + * 8 fractional bits, rather than 13. This saves some shifting work on some + * machines, and may also reduce the cost of multiplication (since there + * are fewer one-bits in the constants). + */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 8 +#define PASS1_BITS 2 +#else +#define CONST_BITS 8 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 8 +#define FIX_1_082392200 ((INT32) 277) /* FIX(1.082392200) */ +#define FIX_1_414213562 ((INT32) 362) /* FIX(1.414213562) */ +#define FIX_1_847759065 ((INT32) 473) /* FIX(1.847759065) */ +#define FIX_2_613125930 ((INT32) 669) /* FIX(2.613125930) */ +#else +#define FIX_1_082392200 FIX(1.082392200) +#define FIX_1_414213562 FIX(1.414213562) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_2_613125930 FIX(2.613125930) +#endif + + +/* We can gain a little more speed, with a further compromise in accuracy, + * by omitting the addition in a descaling shift. This yields an incorrectly + * rounded result half the time... + */ + +#ifndef USE_ACCURATE_ROUNDING +#undef DESCALE +#define DESCALE(x,n) RIGHT_SHIFT(x, n) +#endif + + +/* Multiply a DCTELEM variable by an INT32 constant, and immediately + * descale to yield a DCTELEM result. + */ + +#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS)) + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce a DCTELEM result. For 8-bit data a 16x16->16 + * multiplication will do. For 12-bit data, the multiplier table is + * declared INT32, so a 32-bit multiply will be used. + */ + +#if BITS_IN_JSAMPLE == 8 +#define DEQUANTIZE(coef,quantval) (((IFAST_MULT_TYPE) (coef)) * (quantval)) +#else +#define DEQUANTIZE(coef,quantval) \ + DESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS) +#endif + + +/* Like DESCALE, but applies to a DCTELEM and produces an int. + * We assume that int right shift is unsigned if INT32 right shift is. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define ISHIFT_TEMPS DCTELEM ishift_temp; +#if BITS_IN_JSAMPLE == 8 +#define DCTELEMBITS 16 /* DCTELEM may be 16 or 32 bits */ +#else +#define DCTELEMBITS 32 /* DCTELEM must be 32 bits */ +#endif +#define IRIGHT_SHIFT(x,shft) \ + ((ishift_temp = (x)) < 0 ? \ + (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \ + (ishift_temp >> (shft))) +#else +#define ISHIFT_TEMPS +#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + +#ifdef USE_ACCURATE_ROUNDING +#define IDESCALE(x,n) ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n)) +#else +#define IDESCALE(x,n) ((int) IRIGHT_SHIFT(x, n)) +#endif + + +/* + * Perform dequantization and inverse DCT on one block of coefficients. + */ + +GLOBAL(void) +jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + DCTELEM tmp10, tmp11, tmp12, tmp13; + DCTELEM z5, z10, z11, z12, z13; + JCOEFPTR inptr; + IFAST_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[DCTSIZE2]; /* buffers data between passes */ + SHIFT_TEMPS /* for DESCALE */ + ISHIFT_TEMPS /* for IDESCALE */ + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (IFAST_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp10 = tmp0 + tmp2; /* phase 3 */ + tmp11 = tmp0 - tmp2; + + tmp13 = tmp1 + tmp3; /* phases 5-3 */ + tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */ + + tmp0 = tmp10 + tmp13; /* phase 2 */ + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + + z13 = tmp6 + tmp5; /* phase 6 */ + z10 = tmp6 - tmp5; + z11 = tmp4 + tmp7; + z12 = tmp4 - tmp7; + + tmp7 = z11 + z13; /* phase 5 */ + tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */ + + z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */ + tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */ + tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; /* phase 2 */ + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7); + wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7); + wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6); + wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6); + wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5); + wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5); + wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4); + wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * On machines with very fast multiplication, it's possible that the + * test takes more time than it's worth. In that case this section + * may be commented out. + */ + +#ifndef NO_ZERO_ROW_TEST + if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && + wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { + /* AC terms all zero */ + JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3) + & RANGE_MASK]; + + outptr[0] = dcval; + outptr[1] = dcval; + outptr[2] = dcval; + outptr[3] = dcval; + outptr[4] = dcval; + outptr[5] = dcval; + outptr[6] = dcval; + outptr[7] = dcval; + + wsptr += DCTSIZE; /* advance pointer to next row */ + continue; + } +#endif + + /* Even part */ + + tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]); + tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]); + + tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]); + tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562) + - tmp13; + + tmp0 = tmp10 + tmp13; + tmp3 = tmp10 - tmp13; + tmp1 = tmp11 + tmp12; + tmp2 = tmp11 - tmp12; + + /* Odd part */ + + z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3]; + z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3]; + z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7]; + z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7]; + + tmp7 = z11 + z13; /* phase 5 */ + tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */ + + z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */ + tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */ + tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */ + + tmp6 = tmp12 - tmp7; /* phase 2 */ + tmp5 = tmp11 - tmp6; + tmp4 = tmp10 + tmp5; + + /* Final output stage: scale down by a factor of 8 and range-limit */ + + outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#endif /* DCT_IFAST_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jidctint.c b/third_party/windows/fltk-1.1.10/jpeg/jidctint.c new file mode 100644 index 0000000..4f47fe8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jidctint.c @@ -0,0 +1,389 @@ +/* + * jidctint.c + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a slow-but-accurate integer implementation of the + * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine + * must also perform dequantization of the input coefficients. + * + * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT + * on each row (or vice versa, but it's more convenient to emit a row at + * a time). Direct algorithms are also available, but they are much more + * complex and seem not to be any faster when reduced to code. + * + * This implementation is based on an algorithm described in + * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + * The primary algorithm described there uses 11 multiplies and 29 adds. + * We use their alternate method with 12 multiplies and 32 adds. + * The advantage of this method is that no data path contains more than one + * multiplication; this allows a very simple and accurate implementation in + * scaled fixed-point arithmetic, with a minimal number of shifts. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef DCT_ISLOW_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* + * The poop on this scaling stuff is as follows: + * + * Each 1-D IDCT step produces outputs which are a factor of sqrt(N) + * larger than the true IDCT outputs. The final outputs are therefore + * a factor of N larger than desired; since N=8 this can be cured by + * a simple right shift at the end of the algorithm. The advantage of + * this arrangement is that we save two multiplications per 1-D IDCT, + * because the y0 and y4 inputs need not be divided by sqrt(N). + * + * We have to do addition and subtraction of the integer inputs, which + * is no problem, and multiplication by fractional constants, which is + * a problem to do in integer arithmetic. We multiply all the constants + * by CONST_SCALE and convert them to integer constants (thus retaining + * CONST_BITS bits of precision in the constants). After doing a + * multiplication we have to divide the product by CONST_SCALE, with proper + * rounding, to produce the correct output. This division can be done + * cheaply as a right shift of CONST_BITS bits. We postpone shifting + * as long as possible so that partial sums can be added together with + * full fractional precision. + * + * The outputs of the first pass are scaled up by PASS1_BITS bits so that + * they are represented to better-than-integral precision. These outputs + * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word + * with the recommended scaling. (To scale up 12-bit sample data further, an + * intermediate INT32 array would be needed.) + * + * To avoid overflow of the 32-bit intermediate results in pass 2, we must + * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis + * shows that the values given below are the most effective. + */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 13 +#define PASS1_BITS 2 +#else +#define CONST_BITS 13 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#else +#define FIX_0_298631336 FIX(0.298631336) +#define FIX_0_390180644 FIX(0.390180644) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_175875602 FIX(1.175875602) +#define FIX_1_501321110 FIX(1.501321110) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_1_961570560 FIX(1.961570560) +#define FIX_2_053119869 FIX(2.053119869) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_072711026 FIX(3.072711026) +#endif + + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * For 8-bit samples with the recommended scaling, all the variable + * and constant values involved are no more than 16 bits wide, so a + * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + * For 12-bit samples, a full 32-bit multiplication will be needed. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MULTIPLY(var,const) MULTIPLY16C16(var,const) +#else +#define MULTIPLY(var,const) ((var) * (const)) +#endif + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce an int result. In this module, both inputs and result + * are 16 bits or less, so either int or short multiply will work. + */ + +#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval)) + + +/* + * Perform dequantization and inverse DCT on one block of coefficients. + */ + +GLOBAL(void) +jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp1, tmp2, tmp3; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3, z4, z5; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[DCTSIZE2]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; ctr--) { + /* Due to quantization, we will usually find that many of the input + * coefficients are zero, especially the AC terms. We can exploit this + * by short-circuiting the IDCT calculation for any column in which all + * the AC terms are zero. In that case each output is equal to the + * DC coefficient (with scale factor as needed). + * With typical images and quantization tables, half or more of the + * column DCT calculations can be simplified this way. + */ + + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && + inptr[DCTSIZE*7] == 0) { + /* AC terms all zero */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + wsptr[DCTSIZE*4] = dcval; + wsptr[DCTSIZE*5] = dcval; + wsptr[DCTSIZE*6] = dcval; + wsptr[DCTSIZE*7] = dcval; + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + continue; + } + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); + tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + + z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); + + tmp0 = (z2 + z3) << CONST_BITS; + tmp1 = (z2 - z3) << CONST_BITS; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + z1 = tmp0 + tmp3; + z2 = tmp1 + tmp2; + z3 = tmp0 + tmp2; + z4 = tmp1 + tmp3; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + tmp0 += z1 + z3; + tmp1 += z2 + z4; + tmp2 += z2 + z3; + tmp3 += z1 + z4; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS); + wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS); + + inptr++; /* advance pointers to next column */ + quantptr++; + wsptr++; + } + + /* Pass 2: process rows from work array, store into output array. */ + /* Note that we must descale the results by a factor of 8 == 2**3, */ + /* and also undo the PASS1_BITS scaling. */ + + wsptr = workspace; + for (ctr = 0; ctr < DCTSIZE; ctr++) { + outptr = output_buf[ctr] + output_col; + /* Rows of zeroes can be exploited in the same way as we did with columns. + * However, the column calculation has created many nonzero AC terms, so + * the simplification applies less often (typically 5% to 10% of the time). + * On machines with very fast multiplication, it's possible that the + * test takes more time than it's worth. In that case this section + * may be commented out. + */ + +#ifndef NO_ZERO_ROW_TEST + if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && + wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { + /* AC terms all zero */ + JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) + & RANGE_MASK]; + + outptr[0] = dcval; + outptr[1] = dcval; + outptr[2] = dcval; + outptr[3] = dcval; + outptr[4] = dcval; + outptr[5] = dcval; + outptr[6] = dcval; + outptr[7] = dcval; + + wsptr += DCTSIZE; /* advance pointer to next row */ + continue; + } +#endif + + /* Even part: reverse the even part of the forward DCT. */ + /* The rotator is sqrt(2)*c(-6). */ + + z2 = (INT32) wsptr[2]; + z3 = (INT32) wsptr[6]; + + z1 = MULTIPLY(z2 + z3, FIX_0_541196100); + tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); + tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); + + tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS; + tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS; + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + /* Odd part per figure 8; the matrix is unitary and hence its + * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. + */ + + tmp0 = (INT32) wsptr[7]; + tmp1 = (INT32) wsptr[5]; + tmp2 = (INT32) wsptr[3]; + tmp3 = (INT32) wsptr[1]; + + z1 = tmp0 + tmp3; + z2 = tmp1 + tmp2; + z3 = tmp0 + tmp2; + z4 = tmp1 + tmp3; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + tmp0 += z1 + z3; + tmp1 += z2 + z4; + tmp2 += z2 + z3; + tmp3 += z1 + z4; + + /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ + + outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0, + CONST_BITS+PASS1_BITS+3) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + +#endif /* DCT_ISLOW_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jidctred.c b/third_party/windows/fltk-1.1.10/jpeg/jidctred.c new file mode 100644 index 0000000..911899b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jidctred.c @@ -0,0 +1,398 @@ +/* + * jidctred.c + * + * Copyright (C) 1994-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains inverse-DCT routines that produce reduced-size output: + * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block. + * + * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M) + * algorithm used in jidctint.c. We simply replace each 8-to-8 1-D IDCT step + * with an 8-to-4 step that produces the four averages of two adjacent outputs + * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output). + * These steps were derived by computing the corresponding values at the end + * of the normal LL&M code, then simplifying as much as possible. + * + * 1x1 is trivial: just take the DC coefficient divided by 8. + * + * See jidctint.c for additional comments. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jdct.h" /* Private declarations for DCT subsystem */ + +#ifdef IDCT_SCALING_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 + Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ +#endif + + +/* Scaling is the same as in jidctint.c. */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 13 +#define PASS1_BITS 2 +#else +#define CONST_BITS 13 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_211164243 ((INT32) 1730) /* FIX(0.211164243) */ +#define FIX_0_509795579 ((INT32) 4176) /* FIX(0.509795579) */ +#define FIX_0_601344887 ((INT32) 4926) /* FIX(0.601344887) */ +#define FIX_0_720959822 ((INT32) 5906) /* FIX(0.720959822) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_850430095 ((INT32) 6967) /* FIX(0.850430095) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_061594337 ((INT32) 8697) /* FIX(1.061594337) */ +#define FIX_1_272758580 ((INT32) 10426) /* FIX(1.272758580) */ +#define FIX_1_451774981 ((INT32) 11893) /* FIX(1.451774981) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_2_172734803 ((INT32) 17799) /* FIX(2.172734803) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_624509785 ((INT32) 29692) /* FIX(3.624509785) */ +#else +#define FIX_0_211164243 FIX(0.211164243) +#define FIX_0_509795579 FIX(0.509795579) +#define FIX_0_601344887 FIX(0.601344887) +#define FIX_0_720959822 FIX(0.720959822) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_850430095 FIX(0.850430095) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_061594337 FIX(1.061594337) +#define FIX_1_272758580 FIX(1.272758580) +#define FIX_1_451774981 FIX(1.451774981) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_2_172734803 FIX(2.172734803) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_624509785 FIX(3.624509785) +#endif + + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * For 8-bit samples with the recommended scaling, all the variable + * and constant values involved are no more than 16 bits wide, so a + * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + * For 12-bit samples, a full 32-bit multiplication will be needed. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MULTIPLY(var,const) MULTIPLY16C16(var,const) +#else +#define MULTIPLY(var,const) ((var) * (const)) +#endif + + +/* Dequantize a coefficient by multiplying it by the multiplier-table + * entry; produce an int result. In this module, both inputs and result + * are 16 bits or less, so either int or short multiply will work. + */ + +#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval)) + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 4x4 output block. + */ + +GLOBAL(void) +jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp2, tmp10, tmp12; + INT32 z1, z2, z3, z4; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[DCTSIZE*4]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) { + /* Don't bother to process column 4, because second pass won't use it */ + if (ctr == DCTSIZE-4) + continue; + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && + inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 && + inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) { + /* AC terms all zero; we need not examine term 4 for 4x4 output */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + wsptr[DCTSIZE*2] = dcval; + wsptr[DCTSIZE*3] = dcval; + + continue; + } + + /* Even part */ + + tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp0 <<= (CONST_BITS+1); + + z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); + z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); + + tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + + tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */ + + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */ + + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */ + + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */ + + tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */ + + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */ + + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */ + + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */ + + /* Final output stage */ + + wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1); + wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1); + wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1); + wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1); + } + + /* Pass 2: process 4 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 4; ctr++) { + outptr = output_buf[ctr] + output_col; + /* It's not clear whether a zero row test is worthwhile here ... */ + +#ifndef NO_ZERO_ROW_TEST + if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && + wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { + /* AC terms all zero */ + JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) + & RANGE_MASK]; + + outptr[0] = dcval; + outptr[1] = dcval; + outptr[2] = dcval; + outptr[3] = dcval; + + wsptr += DCTSIZE; /* advance pointer to next row */ + continue; + } +#endif + + /* Even part */ + + tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1); + + tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065) + + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865); + + tmp10 = tmp0 + tmp2; + tmp12 = tmp0 - tmp2; + + /* Odd part */ + + z1 = (INT32) wsptr[7]; + z2 = (INT32) wsptr[5]; + z3 = (INT32) wsptr[3]; + z4 = (INT32) wsptr[1]; + + tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */ + + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */ + + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */ + + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */ + + tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */ + + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */ + + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */ + + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2, + CONST_BITS+PASS1_BITS+3+1) + & RANGE_MASK]; + outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2, + CONST_BITS+PASS1_BITS+3+1) + & RANGE_MASK]; + outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0, + CONST_BITS+PASS1_BITS+3+1) + & RANGE_MASK]; + outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0, + CONST_BITS+PASS1_BITS+3+1) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 2x2 output block. + */ + +GLOBAL(void) +jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + INT32 tmp0, tmp10, z1; + JCOEFPTR inptr; + ISLOW_MULT_TYPE * quantptr; + int * wsptr; + JSAMPROW outptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + int ctr; + int workspace[DCTSIZE*2]; /* buffers data between passes */ + SHIFT_TEMPS + + /* Pass 1: process columns from input, store into work array. */ + + inptr = coef_block; + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + wsptr = workspace; + for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) { + /* Don't bother to process columns 2,4,6 */ + if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6) + continue; + if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 && + inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) { + /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */ + int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; + + wsptr[DCTSIZE*0] = dcval; + wsptr[DCTSIZE*1] = dcval; + + continue; + } + + /* Even part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); + tmp10 = z1 << (CONST_BITS+2); + + /* Odd part */ + + z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); + tmp0 = MULTIPLY(z1, - FIX_0_720959822); /* sqrt(2) * (c7-c5+c3-c1) */ + z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); + tmp0 += MULTIPLY(z1, FIX_0_850430095); /* sqrt(2) * (-c1+c3+c5+c7) */ + z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); + tmp0 += MULTIPLY(z1, - FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */ + z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); + tmp0 += MULTIPLY(z1, FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */ + + /* Final output stage */ + + wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2); + wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2); + } + + /* Pass 2: process 2 rows from work array, store into output array. */ + + wsptr = workspace; + for (ctr = 0; ctr < 2; ctr++) { + outptr = output_buf[ctr] + output_col; + /* It's not clear whether a zero row test is worthwhile here ... */ + +#ifndef NO_ZERO_ROW_TEST + if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) { + /* AC terms all zero */ + JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) + & RANGE_MASK]; + + outptr[0] = dcval; + outptr[1] = dcval; + + wsptr += DCTSIZE; /* advance pointer to next row */ + continue; + } +#endif + + /* Even part */ + + tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2); + + /* Odd part */ + + tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */ + + MULTIPLY((INT32) wsptr[5], FIX_0_850430095) /* sqrt(2) * (-c1+c3+c5+c7) */ + + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */ + + MULTIPLY((INT32) wsptr[1], FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */ + + /* Final output stage */ + + outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0, + CONST_BITS+PASS1_BITS+3+2) + & RANGE_MASK]; + outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0, + CONST_BITS+PASS1_BITS+3+2) + & RANGE_MASK]; + + wsptr += DCTSIZE; /* advance pointer to next row */ + } +} + + +/* + * Perform dequantization and inverse DCT on one block of coefficients, + * producing a reduced-size 1x1 output block. + */ + +GLOBAL(void) +jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col) +{ + int dcval; + ISLOW_MULT_TYPE * quantptr; + JSAMPLE *range_limit = IDCT_range_limit(cinfo); + SHIFT_TEMPS + + /* We hardly need an inverse DCT routine for this: just take the + * average pixel value, which is one-eighth of the DC coefficient. + */ + quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; + dcval = DEQUANTIZE(coef_block[0], quantptr[0]); + dcval = (int) DESCALE((INT32) dcval, 3); + + output_buf[0][output_col] = range_limit[dcval & RANGE_MASK]; +} + +#endif /* IDCT_SCALING_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jinclude.h b/third_party/windows/fltk-1.1.10/jpeg/jinclude.h new file mode 100644 index 0000000..5ff60fe --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jinclude.h @@ -0,0 +1,91 @@ +/* + * jinclude.h + * + * Copyright (C) 1991-1994, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file exists to provide a single place to fix any problems with + * including the wrong system include files. (Common problems are taken + * care of by the standard jconfig symbols, but on really weird systems + * you may have to edit this file.) + * + * NOTE: this file is NOT intended to be included by applications using the + * JPEG library. Most applications need only include jpeglib.h. + */ + + +/* Include auto-config file to find out which system include files we need. */ + +#include "jconfig.h" /* auto configuration options */ +#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */ + +/* + * We need the NULL macro and size_t typedef. + * On an ANSI-conforming system it is sufficient to include . + * Otherwise, we get them from or ; we may have to + * pull in as well. + * Note that the core JPEG library does not require ; + * only the default error handler and data source/destination modules do. + * But we must pull it in because of the references to FILE in jpeglib.h. + * You can remove those references if you want to compile without . + */ + +#ifdef HAVE_STDDEF_H +#include +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif + +#ifdef NEED_SYS_TYPES_H +#include +#endif + +#include + +/* + * We need memory copying and zeroing functions, plus strncpy(). + * ANSI and System V implementations declare these in . + * BSD doesn't have the mem() functions, but it does have bcopy()/bzero(). + * Some systems may declare memset and memcpy in . + * + * NOTE: we assume the size parameters to these functions are of type size_t. + * Change the casts in these macros if not! + */ + +#ifdef NEED_BSD_STRINGS + +#include +#define MEMZERO(target,size) bzero((void *)(target), (size_t)(size)) +#define MEMCOPY(dest,src,size) bcopy((const void *)(src), (void *)(dest), (size_t)(size)) + +#else /* not BSD, assume ANSI/SysV string lib */ + +#include +#define MEMZERO(target,size) memset((void *)(target), 0, (size_t)(size)) +#define MEMCOPY(dest,src,size) memcpy((void *)(dest), (const void *)(src), (size_t)(size)) + +#endif + +/* + * In ANSI C, and indeed any rational implementation, size_t is also the + * type returned by sizeof(). However, it seems there are some irrational + * implementations out there, in which sizeof() returns an int even though + * size_t is defined as long or unsigned long. To ensure consistent results + * we always use this SIZEOF() macro in place of using sizeof() directly. + */ + +#define SIZEOF(object) ((size_t) sizeof(object)) + +/* + * The modules that use fread() and fwrite() always invoke them through + * these macros. On some systems you may need to twiddle the argument casts. + * CAUTION: argument order is different from underlying functions! + */ + +#define JFREAD(file,buf,sizeofbuf) \ + ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) +#define JFWRITE(file,buf,sizeofbuf) \ + ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) diff --git a/third_party/windows/fltk-1.1.10/jpeg/jmemmgr.c b/third_party/windows/fltk-1.1.10/jpeg/jmemmgr.c new file mode 100644 index 0000000..b636f1b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jmemmgr.c @@ -0,0 +1,1118 @@ +/* + * jmemmgr.c + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains the JPEG system-independent memory management + * routines. This code is usable across a wide variety of machines; most + * of the system dependencies have been isolated in a separate file. + * The major functions provided here are: + * * pool-based allocation and freeing of memory; + * * policy decisions about how to divide available memory among the + * virtual arrays; + * * control logic for swapping virtual arrays between main memory and + * backing storage. + * The separate system-dependent file provides the actual backing-storage + * access code, and it contains the policy decision about how much total + * main memory to use. + * This file is system-dependent in the sense that some of its functions + * are unnecessary in some systems. For example, if there is enough virtual + * memory so that backing storage will never be used, much of the virtual + * array control logic could be removed. (Of course, if you have that much + * memory then you shouldn't care about a little bit of unused code...) + */ + +#define JPEG_INTERNALS +#define AM_MEMORY_MANAGER /* we define jvirt_Xarray_control structs */ +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef NO_GETENV +#ifndef HAVE_STDLIB_H /* should declare getenv() */ +extern char * getenv JPP((const char * name)); +#endif +#endif + + +/* + * Some important notes: + * The allocation routines provided here must never return NULL. + * They should exit to error_exit if unsuccessful. + * + * It's not a good idea to try to merge the sarray and barray routines, + * even though they are textually almost the same, because samples are + * usually stored as bytes while coefficients are shorts or ints. Thus, + * in machines where byte pointers have a different representation from + * word pointers, the resulting machine code could not be the same. + */ + + +/* + * Many machines require storage alignment: longs must start on 4-byte + * boundaries, doubles on 8-byte boundaries, etc. On such machines, malloc() + * always returns pointers that are multiples of the worst-case alignment + * requirement, and we had better do so too. + * There isn't any really portable way to determine the worst-case alignment + * requirement. This module assumes that the alignment requirement is + * multiples of sizeof(ALIGN_TYPE). + * By default, we define ALIGN_TYPE as double. This is necessary on some + * workstations (where doubles really do need 8-byte alignment) and will work + * fine on nearly everything. If your machine has lesser alignment needs, + * you can save a few bytes by making ALIGN_TYPE smaller. + * The only place I know of where this will NOT work is certain Macintosh + * 680x0 compilers that define double as a 10-byte IEEE extended float. + * Doing 10-byte alignment is counterproductive because longwords won't be + * aligned well. Put "#define ALIGN_TYPE long" in jconfig.h if you have + * such a compiler. + */ + +#ifndef ALIGN_TYPE /* so can override from jconfig.h */ +#define ALIGN_TYPE double +#endif + + +/* + * We allocate objects from "pools", where each pool is gotten with a single + * request to jpeg_get_small() or jpeg_get_large(). There is no per-object + * overhead within a pool, except for alignment padding. Each pool has a + * header with a link to the next pool of the same class. + * Small and large pool headers are identical except that the latter's + * link pointer must be FAR on 80x86 machines. + * Notice that the "real" header fields are union'ed with a dummy ALIGN_TYPE + * field. This forces the compiler to make SIZEOF(small_pool_hdr) a multiple + * of the alignment requirement of ALIGN_TYPE. + */ + +typedef union small_pool_struct * small_pool_ptr; + +typedef union small_pool_struct { + struct { + small_pool_ptr next; /* next in list of pools */ + size_t bytes_used; /* how many bytes already used within pool */ + size_t bytes_left; /* bytes still available in this pool */ + } hdr; + ALIGN_TYPE dummy; /* included in union to ensure alignment */ +} small_pool_hdr; + +typedef union large_pool_struct FAR * large_pool_ptr; + +typedef union large_pool_struct { + struct { + large_pool_ptr next; /* next in list of pools */ + size_t bytes_used; /* how many bytes already used within pool */ + size_t bytes_left; /* bytes still available in this pool */ + } hdr; + ALIGN_TYPE dummy; /* included in union to ensure alignment */ +} large_pool_hdr; + + +/* + * Here is the full definition of a memory manager object. + */ + +typedef struct { + struct jpeg_memory_mgr pub; /* public fields */ + + /* Each pool identifier (lifetime class) names a linked list of pools. */ + small_pool_ptr small_list[JPOOL_NUMPOOLS]; + large_pool_ptr large_list[JPOOL_NUMPOOLS]; + + /* Since we only have one lifetime class of virtual arrays, only one + * linked list is necessary (for each datatype). Note that the virtual + * array control blocks being linked together are actually stored somewhere + * in the small-pool list. + */ + jvirt_sarray_ptr virt_sarray_list; + jvirt_barray_ptr virt_barray_list; + + /* This counts total space obtained from jpeg_get_small/large */ + long total_space_allocated; + + /* alloc_sarray and alloc_barray set this value for use by virtual + * array routines. + */ + JDIMENSION last_rowsperchunk; /* from most recent alloc_sarray/barray */ +} my_memory_mgr; + +typedef my_memory_mgr * my_mem_ptr; + + +/* + * The control blocks for virtual arrays. + * Note that these blocks are allocated in the "small" pool area. + * System-dependent info for the associated backing store (if any) is hidden + * inside the backing_store_info struct. + */ + +struct jvirt_sarray_control { + JSAMPARRAY mem_buffer; /* => the in-memory buffer */ + JDIMENSION rows_in_array; /* total virtual array height */ + JDIMENSION samplesperrow; /* width of array (and of memory buffer) */ + JDIMENSION maxaccess; /* max rows accessed by access_virt_sarray */ + JDIMENSION rows_in_mem; /* height of memory buffer */ + JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */ + JDIMENSION cur_start_row; /* first logical row # in the buffer */ + JDIMENSION first_undef_row; /* row # of first uninitialized row */ + boolean pre_zero; /* pre-zero mode requested? */ + boolean dirty; /* do current buffer contents need written? */ + boolean b_s_open; /* is backing-store data valid? */ + jvirt_sarray_ptr next; /* link to next virtual sarray control block */ + backing_store_info b_s_info; /* System-dependent control info */ +}; + +struct jvirt_barray_control { + JBLOCKARRAY mem_buffer; /* => the in-memory buffer */ + JDIMENSION rows_in_array; /* total virtual array height */ + JDIMENSION blocksperrow; /* width of array (and of memory buffer) */ + JDIMENSION maxaccess; /* max rows accessed by access_virt_barray */ + JDIMENSION rows_in_mem; /* height of memory buffer */ + JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */ + JDIMENSION cur_start_row; /* first logical row # in the buffer */ + JDIMENSION first_undef_row; /* row # of first uninitialized row */ + boolean pre_zero; /* pre-zero mode requested? */ + boolean dirty; /* do current buffer contents need written? */ + boolean b_s_open; /* is backing-store data valid? */ + jvirt_barray_ptr next; /* link to next virtual barray control block */ + backing_store_info b_s_info; /* System-dependent control info */ +}; + + +#ifdef MEM_STATS /* optional extra stuff for statistics */ + +LOCAL(void) +print_mem_stats (j_common_ptr cinfo, int pool_id) +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + small_pool_ptr shdr_ptr; + large_pool_ptr lhdr_ptr; + + /* Since this is only a debugging stub, we can cheat a little by using + * fprintf directly rather than going through the trace message code. + * This is helpful because message parm array can't handle longs. + */ + fprintf(stderr, "Freeing pool %d, total space = %ld\n", + pool_id, mem->total_space_allocated); + + for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL; + lhdr_ptr = lhdr_ptr->hdr.next) { + fprintf(stderr, " Large chunk used %ld\n", + (long) lhdr_ptr->hdr.bytes_used); + } + + for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL; + shdr_ptr = shdr_ptr->hdr.next) { + fprintf(stderr, " Small chunk used %ld free %ld\n", + (long) shdr_ptr->hdr.bytes_used, + (long) shdr_ptr->hdr.bytes_left); + } +} + +#endif /* MEM_STATS */ + + +LOCAL(void) +out_of_memory (j_common_ptr cinfo, int which) +/* Report an out-of-memory error and stop execution */ +/* If we compiled MEM_STATS support, report alloc requests before dying */ +{ +#ifdef MEM_STATS + cinfo->err->trace_level = 2; /* force self_destruct to report stats */ +#endif + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which); +} + + +/* + * Allocation of "small" objects. + * + * For these, we use pooled storage. When a new pool must be created, + * we try to get enough space for the current request plus a "slop" factor, + * where the slop will be the amount of leftover space in the new pool. + * The speed vs. space tradeoff is largely determined by the slop values. + * A different slop value is provided for each pool class (lifetime), + * and we also distinguish the first pool of a class from later ones. + * NOTE: the values given work fairly well on both 16- and 32-bit-int + * machines, but may be too small if longs are 64 bits or more. + */ + +static const size_t first_pool_slop[JPOOL_NUMPOOLS] = +{ + 1600, /* first PERMANENT pool */ + 16000 /* first IMAGE pool */ +}; + +static const size_t extra_pool_slop[JPOOL_NUMPOOLS] = +{ + 0, /* additional PERMANENT pools */ + 5000 /* additional IMAGE pools */ +}; + +#define MIN_SLOP 50 /* greater than 0 to avoid futile looping */ + + +METHODDEF(void *) +alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject) +/* Allocate a "small" object */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + small_pool_ptr hdr_ptr, prev_hdr_ptr; + char * data_ptr; + size_t odd_bytes, min_request, slop; + + /* Check for unsatisfiable request (do now to ensure no overflow below) */ + if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr))) + out_of_memory(cinfo, 1); /* request exceeds malloc's ability */ + + /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */ + odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE); + if (odd_bytes > 0) + sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes; + + /* See if space is available in any existing pool */ + if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + prev_hdr_ptr = NULL; + hdr_ptr = mem->small_list[pool_id]; + while (hdr_ptr != NULL) { + if (hdr_ptr->hdr.bytes_left >= sizeofobject) + break; /* found pool with enough space */ + prev_hdr_ptr = hdr_ptr; + hdr_ptr = hdr_ptr->hdr.next; + } + + /* Time to make a new pool? */ + if (hdr_ptr == NULL) { + /* min_request is what we need now, slop is what will be leftover */ + min_request = sizeofobject + SIZEOF(small_pool_hdr); + if (prev_hdr_ptr == NULL) /* first pool in class? */ + slop = first_pool_slop[pool_id]; + else + slop = extra_pool_slop[pool_id]; + /* Don't ask for more than MAX_ALLOC_CHUNK */ + if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request)) + slop = (size_t) (MAX_ALLOC_CHUNK-min_request); + /* Try to get space, if fail reduce slop and try again */ + for (;;) { + hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop); + if (hdr_ptr != NULL) + break; + slop /= 2; + if (slop < MIN_SLOP) /* give up when it gets real small */ + out_of_memory(cinfo, 2); /* jpeg_get_small failed */ + } + mem->total_space_allocated += min_request + slop; + /* Success, initialize the new pool header and add to end of list */ + hdr_ptr->hdr.next = NULL; + hdr_ptr->hdr.bytes_used = 0; + hdr_ptr->hdr.bytes_left = sizeofobject + slop; + if (prev_hdr_ptr == NULL) /* first pool in class? */ + mem->small_list[pool_id] = hdr_ptr; + else + prev_hdr_ptr->hdr.next = hdr_ptr; + } + + /* OK, allocate the object from the current pool */ + data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */ + data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */ + hdr_ptr->hdr.bytes_used += sizeofobject; + hdr_ptr->hdr.bytes_left -= sizeofobject; + + return (void *) data_ptr; +} + + +/* + * Allocation of "large" objects. + * + * The external semantics of these are the same as "small" objects, + * except that FAR pointers are used on 80x86. However the pool + * management heuristics are quite different. We assume that each + * request is large enough that it may as well be passed directly to + * jpeg_get_large; the pool management just links everything together + * so that we can free it all on demand. + * Note: the major use of "large" objects is in JSAMPARRAY and JBLOCKARRAY + * structures. The routines that create these structures (see below) + * deliberately bunch rows together to ensure a large request size. + */ + +METHODDEF(void FAR *) +alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject) +/* Allocate a "large" object */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + large_pool_ptr hdr_ptr; + size_t odd_bytes; + + /* Check for unsatisfiable request (do now to ensure no overflow below) */ + if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr))) + out_of_memory(cinfo, 3); /* request exceeds malloc's ability */ + + /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */ + odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE); + if (odd_bytes > 0) + sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes; + + /* Always make a new pool */ + if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + + hdr_ptr = (large_pool_ptr) jpeg_get_large(cinfo, sizeofobject + + SIZEOF(large_pool_hdr)); + if (hdr_ptr == NULL) + out_of_memory(cinfo, 4); /* jpeg_get_large failed */ + mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr); + + /* Success, initialize the new pool header and add to list */ + hdr_ptr->hdr.next = mem->large_list[pool_id]; + /* We maintain space counts in each pool header for statistical purposes, + * even though they are not needed for allocation. + */ + hdr_ptr->hdr.bytes_used = sizeofobject; + hdr_ptr->hdr.bytes_left = 0; + mem->large_list[pool_id] = hdr_ptr; + + return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */ +} + + +/* + * Creation of 2-D sample arrays. + * The pointers are in near heap, the samples themselves in FAR heap. + * + * To minimize allocation overhead and to allow I/O of large contiguous + * blocks, we allocate the sample rows in groups of as many rows as possible + * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request. + * NB: the virtual array control routines, later in this file, know about + * this chunking of rows. The rowsperchunk value is left in the mem manager + * object so that it can be saved away if this sarray is the workspace for + * a virtual array. + */ + +METHODDEF(JSAMPARRAY) +alloc_sarray (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, JDIMENSION numrows) +/* Allocate a 2-D sample array */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + JSAMPARRAY result; + JSAMPROW workspace; + JDIMENSION rowsperchunk, currow, i; + long ltemp; + + /* Calculate max # of rows allowed in one allocation chunk */ + ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) / + ((long) samplesperrow * SIZEOF(JSAMPLE)); + if (ltemp <= 0) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + if (ltemp < (long) numrows) + rowsperchunk = (JDIMENSION) ltemp; + else + rowsperchunk = numrows; + mem->last_rowsperchunk = rowsperchunk; + + /* Get space for row pointers (small object) */ + result = (JSAMPARRAY) alloc_small(cinfo, pool_id, + (size_t) (numrows * SIZEOF(JSAMPROW))); + + /* Get the rows themselves (large objects) */ + currow = 0; + while (currow < numrows) { + rowsperchunk = MIN(rowsperchunk, numrows - currow); + workspace = (JSAMPROW) alloc_large(cinfo, pool_id, + (size_t) ((size_t) rowsperchunk * (size_t) samplesperrow + * SIZEOF(JSAMPLE))); + for (i = rowsperchunk; i > 0; i--) { + result[currow++] = workspace; + workspace += samplesperrow; + } + } + + return result; +} + + +/* + * Creation of 2-D coefficient-block arrays. + * This is essentially the same as the code for sample arrays, above. + */ + +METHODDEF(JBLOCKARRAY) +alloc_barray (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, JDIMENSION numrows) +/* Allocate a 2-D coefficient-block array */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + JBLOCKARRAY result; + JBLOCKROW workspace; + JDIMENSION rowsperchunk, currow, i; + long ltemp; + + /* Calculate max # of rows allowed in one allocation chunk */ + ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) / + ((long) blocksperrow * SIZEOF(JBLOCK)); + if (ltemp <= 0) + ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); + if (ltemp < (long) numrows) + rowsperchunk = (JDIMENSION) ltemp; + else + rowsperchunk = numrows; + mem->last_rowsperchunk = rowsperchunk; + + /* Get space for row pointers (small object) */ + result = (JBLOCKARRAY) alloc_small(cinfo, pool_id, + (size_t) (numrows * SIZEOF(JBLOCKROW))); + + /* Get the rows themselves (large objects) */ + currow = 0; + while (currow < numrows) { + rowsperchunk = MIN(rowsperchunk, numrows - currow); + workspace = (JBLOCKROW) alloc_large(cinfo, pool_id, + (size_t) ((size_t) rowsperchunk * (size_t) blocksperrow + * SIZEOF(JBLOCK))); + for (i = rowsperchunk; i > 0; i--) { + result[currow++] = workspace; + workspace += blocksperrow; + } + } + + return result; +} + + +/* + * About virtual array management: + * + * The above "normal" array routines are only used to allocate strip buffers + * (as wide as the image, but just a few rows high). Full-image-sized buffers + * are handled as "virtual" arrays. The array is still accessed a strip at a + * time, but the memory manager must save the whole array for repeated + * accesses. The intended implementation is that there is a strip buffer in + * memory (as high as is possible given the desired memory limit), plus a + * backing file that holds the rest of the array. + * + * The request_virt_array routines are told the total size of the image and + * the maximum number of rows that will be accessed at once. The in-memory + * buffer must be at least as large as the maxaccess value. + * + * The request routines create control blocks but not the in-memory buffers. + * That is postponed until realize_virt_arrays is called. At that time the + * total amount of space needed is known (approximately, anyway), so free + * memory can be divided up fairly. + * + * The access_virt_array routines are responsible for making a specific strip + * area accessible (after reading or writing the backing file, if necessary). + * Note that the access routines are told whether the caller intends to modify + * the accessed strip; during a read-only pass this saves having to rewrite + * data to disk. The access routines are also responsible for pre-zeroing + * any newly accessed rows, if pre-zeroing was requested. + * + * In current usage, the access requests are usually for nonoverlapping + * strips; that is, successive access start_row numbers differ by exactly + * num_rows = maxaccess. This means we can get good performance with simple + * buffer dump/reload logic, by making the in-memory buffer be a multiple + * of the access height; then there will never be accesses across bufferload + * boundaries. The code will still work with overlapping access requests, + * but it doesn't handle bufferload overlaps very efficiently. + */ + + +METHODDEF(jvirt_sarray_ptr) +request_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero, + JDIMENSION samplesperrow, JDIMENSION numrows, + JDIMENSION maxaccess) +/* Request a virtual 2-D sample array */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + jvirt_sarray_ptr result; + + /* Only IMAGE-lifetime virtual arrays are currently supported */ + if (pool_id != JPOOL_IMAGE) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + + /* get control block */ + result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id, + SIZEOF(struct jvirt_sarray_control)); + + result->mem_buffer = NULL; /* marks array not yet realized */ + result->rows_in_array = numrows; + result->samplesperrow = samplesperrow; + result->maxaccess = maxaccess; + result->pre_zero = pre_zero; + result->b_s_open = FALSE; /* no associated backing-store object */ + result->next = mem->virt_sarray_list; /* add to list of virtual arrays */ + mem->virt_sarray_list = result; + + return result; +} + + +METHODDEF(jvirt_barray_ptr) +request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero, + JDIMENSION blocksperrow, JDIMENSION numrows, + JDIMENSION maxaccess) +/* Request a virtual 2-D coefficient-block array */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + jvirt_barray_ptr result; + + /* Only IMAGE-lifetime virtual arrays are currently supported */ + if (pool_id != JPOOL_IMAGE) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + + /* get control block */ + result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id, + SIZEOF(struct jvirt_barray_control)); + + result->mem_buffer = NULL; /* marks array not yet realized */ + result->rows_in_array = numrows; + result->blocksperrow = blocksperrow; + result->maxaccess = maxaccess; + result->pre_zero = pre_zero; + result->b_s_open = FALSE; /* no associated backing-store object */ + result->next = mem->virt_barray_list; /* add to list of virtual arrays */ + mem->virt_barray_list = result; + + return result; +} + + +METHODDEF(void) +realize_virt_arrays (j_common_ptr cinfo) +/* Allocate the in-memory buffers for any unrealized virtual arrays */ +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + long space_per_minheight, maximum_space, avail_mem; + long minheights, max_minheights; + jvirt_sarray_ptr sptr; + jvirt_barray_ptr bptr; + + /* Compute the minimum space needed (maxaccess rows in each buffer) + * and the maximum space needed (full image height in each buffer). + * These may be of use to the system-dependent jpeg_mem_available routine. + */ + space_per_minheight = 0; + maximum_space = 0; + for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->mem_buffer == NULL) { /* if not realized yet */ + space_per_minheight += (long) sptr->maxaccess * + (long) sptr->samplesperrow * SIZEOF(JSAMPLE); + maximum_space += (long) sptr->rows_in_array * + (long) sptr->samplesperrow * SIZEOF(JSAMPLE); + } + } + for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->mem_buffer == NULL) { /* if not realized yet */ + space_per_minheight += (long) bptr->maxaccess * + (long) bptr->blocksperrow * SIZEOF(JBLOCK); + maximum_space += (long) bptr->rows_in_array * + (long) bptr->blocksperrow * SIZEOF(JBLOCK); + } + } + + if (space_per_minheight <= 0) + return; /* no unrealized arrays, no work */ + + /* Determine amount of memory to actually use; this is system-dependent. */ + avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space, + mem->total_space_allocated); + + /* If the maximum space needed is available, make all the buffers full + * height; otherwise parcel it out with the same number of minheights + * in each buffer. + */ + if (avail_mem >= maximum_space) + max_minheights = 1000000000L; + else { + max_minheights = avail_mem / space_per_minheight; + /* If there doesn't seem to be enough space, try to get the minimum + * anyway. This allows a "stub" implementation of jpeg_mem_available(). + */ + if (max_minheights <= 0) + max_minheights = 1; + } + + /* Allocate the in-memory buffers and initialize backing store as needed. */ + + for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->mem_buffer == NULL) { /* if not realized yet */ + minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L; + if (minheights <= max_minheights) { + /* This buffer fits in memory */ + sptr->rows_in_mem = sptr->rows_in_array; + } else { + /* It doesn't fit in memory, create backing store. */ + sptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess); + jpeg_open_backing_store(cinfo, & sptr->b_s_info, + (long) sptr->rows_in_array * + (long) sptr->samplesperrow * + (long) SIZEOF(JSAMPLE)); + sptr->b_s_open = TRUE; + } + sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE, + sptr->samplesperrow, sptr->rows_in_mem); + sptr->rowsperchunk = mem->last_rowsperchunk; + sptr->cur_start_row = 0; + sptr->first_undef_row = 0; + sptr->dirty = FALSE; + } + } + + for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->mem_buffer == NULL) { /* if not realized yet */ + minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L; + if (minheights <= max_minheights) { + /* This buffer fits in memory */ + bptr->rows_in_mem = bptr->rows_in_array; + } else { + /* It doesn't fit in memory, create backing store. */ + bptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess); + jpeg_open_backing_store(cinfo, & bptr->b_s_info, + (long) bptr->rows_in_array * + (long) bptr->blocksperrow * + (long) SIZEOF(JBLOCK)); + bptr->b_s_open = TRUE; + } + bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE, + bptr->blocksperrow, bptr->rows_in_mem); + bptr->rowsperchunk = mem->last_rowsperchunk; + bptr->cur_start_row = 0; + bptr->first_undef_row = 0; + bptr->dirty = FALSE; + } + } +} + + +LOCAL(void) +do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing) +/* Do backing store read or write of a virtual sample array */ +{ + long bytesperrow, file_offset, byte_count, rows, thisrow, i; + + bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE); + file_offset = ptr->cur_start_row * bytesperrow; + /* Loop to read or write each allocation chunk in mem_buffer */ + for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) { + /* One chunk, but check for short chunk at end of buffer */ + rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i); + /* Transfer no more than is currently defined */ + thisrow = (long) ptr->cur_start_row + i; + rows = MIN(rows, (long) ptr->first_undef_row - thisrow); + /* Transfer no more than fits in file */ + rows = MIN(rows, (long) ptr->rows_in_array - thisrow); + if (rows <= 0) /* this chunk might be past end of file! */ + break; + byte_count = rows * bytesperrow; + if (writing) + (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + else + (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + file_offset += byte_count; + } +} + + +LOCAL(void) +do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing) +/* Do backing store read or write of a virtual coefficient-block array */ +{ + long bytesperrow, file_offset, byte_count, rows, thisrow, i; + + bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK); + file_offset = ptr->cur_start_row * bytesperrow; + /* Loop to read or write each allocation chunk in mem_buffer */ + for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) { + /* One chunk, but check for short chunk at end of buffer */ + rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i); + /* Transfer no more than is currently defined */ + thisrow = (long) ptr->cur_start_row + i; + rows = MIN(rows, (long) ptr->first_undef_row - thisrow); + /* Transfer no more than fits in file */ + rows = MIN(rows, (long) ptr->rows_in_array - thisrow); + if (rows <= 0) /* this chunk might be past end of file! */ + break; + byte_count = rows * bytesperrow; + if (writing) + (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + else + (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info, + (void FAR *) ptr->mem_buffer[i], + file_offset, byte_count); + file_offset += byte_count; + } +} + + +METHODDEF(JSAMPARRAY) +access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr, + JDIMENSION start_row, JDIMENSION num_rows, + boolean writable) +/* Access the part of a virtual sample array starting at start_row */ +/* and extending for num_rows rows. writable is true if */ +/* caller intends to modify the accessed area. */ +{ + JDIMENSION end_row = start_row + num_rows; + JDIMENSION undef_row; + + /* debugging check */ + if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess || + ptr->mem_buffer == NULL) + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + + /* Make the desired part of the virtual array accessible */ + if (start_row < ptr->cur_start_row || + end_row > ptr->cur_start_row+ptr->rows_in_mem) { + if (! ptr->b_s_open) + ERREXIT(cinfo, JERR_VIRTUAL_BUG); + /* Flush old buffer contents if necessary */ + if (ptr->dirty) { + do_sarray_io(cinfo, ptr, TRUE); + ptr->dirty = FALSE; + } + /* Decide what part of virtual array to access. + * Algorithm: if target address > current window, assume forward scan, + * load starting at target address. If target address < current window, + * assume backward scan, load so that target area is top of window. + * Note that when switching from forward write to forward read, will have + * start_row = 0, so the limiting case applies and we load from 0 anyway. + */ + if (start_row > ptr->cur_start_row) { + ptr->cur_start_row = start_row; + } else { + /* use long arithmetic here to avoid overflow & unsigned problems */ + long ltemp; + + ltemp = (long) end_row - (long) ptr->rows_in_mem; + if (ltemp < 0) + ltemp = 0; /* don't fall off front end of file */ + ptr->cur_start_row = (JDIMENSION) ltemp; + } + /* Read in the selected part of the array. + * During the initial write pass, we will do no actual read + * because the selected part is all undefined. + */ + do_sarray_io(cinfo, ptr, FALSE); + } + /* Ensure the accessed part of the array is defined; prezero if needed. + * To improve locality of access, we only prezero the part of the array + * that the caller is about to access, not the entire in-memory array. + */ + if (ptr->first_undef_row < end_row) { + if (ptr->first_undef_row < start_row) { + if (writable) /* writer skipped over a section of array */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + undef_row = start_row; /* but reader is allowed to read ahead */ + } else { + undef_row = ptr->first_undef_row; + } + if (writable) + ptr->first_undef_row = end_row; + if (ptr->pre_zero) { + size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE); + undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ + end_row -= ptr->cur_start_row; + while (undef_row < end_row) { + jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); + undef_row++; + } + } else { + if (! writable) /* reader looking at undefined data */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + } + } + /* Flag the buffer dirty if caller will write in it */ + if (writable) + ptr->dirty = TRUE; + /* Return address of proper part of the buffer */ + return ptr->mem_buffer + (start_row - ptr->cur_start_row); +} + + +METHODDEF(JBLOCKARRAY) +access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr, + JDIMENSION start_row, JDIMENSION num_rows, + boolean writable) +/* Access the part of a virtual block array starting at start_row */ +/* and extending for num_rows rows. writable is true if */ +/* caller intends to modify the accessed area. */ +{ + JDIMENSION end_row = start_row + num_rows; + JDIMENSION undef_row; + + /* debugging check */ + if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess || + ptr->mem_buffer == NULL) + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + + /* Make the desired part of the virtual array accessible */ + if (start_row < ptr->cur_start_row || + end_row > ptr->cur_start_row+ptr->rows_in_mem) { + if (! ptr->b_s_open) + ERREXIT(cinfo, JERR_VIRTUAL_BUG); + /* Flush old buffer contents if necessary */ + if (ptr->dirty) { + do_barray_io(cinfo, ptr, TRUE); + ptr->dirty = FALSE; + } + /* Decide what part of virtual array to access. + * Algorithm: if target address > current window, assume forward scan, + * load starting at target address. If target address < current window, + * assume backward scan, load so that target area is top of window. + * Note that when switching from forward write to forward read, will have + * start_row = 0, so the limiting case applies and we load from 0 anyway. + */ + if (start_row > ptr->cur_start_row) { + ptr->cur_start_row = start_row; + } else { + /* use long arithmetic here to avoid overflow & unsigned problems */ + long ltemp; + + ltemp = (long) end_row - (long) ptr->rows_in_mem; + if (ltemp < 0) + ltemp = 0; /* don't fall off front end of file */ + ptr->cur_start_row = (JDIMENSION) ltemp; + } + /* Read in the selected part of the array. + * During the initial write pass, we will do no actual read + * because the selected part is all undefined. + */ + do_barray_io(cinfo, ptr, FALSE); + } + /* Ensure the accessed part of the array is defined; prezero if needed. + * To improve locality of access, we only prezero the part of the array + * that the caller is about to access, not the entire in-memory array. + */ + if (ptr->first_undef_row < end_row) { + if (ptr->first_undef_row < start_row) { + if (writable) /* writer skipped over a section of array */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + undef_row = start_row; /* but reader is allowed to read ahead */ + } else { + undef_row = ptr->first_undef_row; + } + if (writable) + ptr->first_undef_row = end_row; + if (ptr->pre_zero) { + size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK); + undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ + end_row -= ptr->cur_start_row; + while (undef_row < end_row) { + jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); + undef_row++; + } + } else { + if (! writable) /* reader looking at undefined data */ + ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); + } + } + /* Flag the buffer dirty if caller will write in it */ + if (writable) + ptr->dirty = TRUE; + /* Return address of proper part of the buffer */ + return ptr->mem_buffer + (start_row - ptr->cur_start_row); +} + + +/* + * Release all objects belonging to a specified pool. + */ + +METHODDEF(void) +free_pool (j_common_ptr cinfo, int pool_id) +{ + my_mem_ptr mem = (my_mem_ptr) cinfo->mem; + small_pool_ptr shdr_ptr; + large_pool_ptr lhdr_ptr; + size_t space_freed; + + if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) + ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ + +#ifdef MEM_STATS + if (cinfo->err->trace_level > 1) + print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */ +#endif + + /* If freeing IMAGE pool, close any virtual arrays first */ + if (pool_id == JPOOL_IMAGE) { + jvirt_sarray_ptr sptr; + jvirt_barray_ptr bptr; + + for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { + if (sptr->b_s_open) { /* there may be no backing store */ + sptr->b_s_open = FALSE; /* prevent recursive close if error */ + (*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info); + } + } + mem->virt_sarray_list = NULL; + for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { + if (bptr->b_s_open) { /* there may be no backing store */ + bptr->b_s_open = FALSE; /* prevent recursive close if error */ + (*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info); + } + } + mem->virt_barray_list = NULL; + } + + /* Release large objects */ + lhdr_ptr = mem->large_list[pool_id]; + mem->large_list[pool_id] = NULL; + + while (lhdr_ptr != NULL) { + large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next; + space_freed = lhdr_ptr->hdr.bytes_used + + lhdr_ptr->hdr.bytes_left + + SIZEOF(large_pool_hdr); + jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed); + mem->total_space_allocated -= space_freed; + lhdr_ptr = next_lhdr_ptr; + } + + /* Release small objects */ + shdr_ptr = mem->small_list[pool_id]; + mem->small_list[pool_id] = NULL; + + while (shdr_ptr != NULL) { + small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next; + space_freed = shdr_ptr->hdr.bytes_used + + shdr_ptr->hdr.bytes_left + + SIZEOF(small_pool_hdr); + jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed); + mem->total_space_allocated -= space_freed; + shdr_ptr = next_shdr_ptr; + } +} + + +/* + * Close up shop entirely. + * Note that this cannot be called unless cinfo->mem is non-NULL. + */ + +METHODDEF(void) +self_destruct (j_common_ptr cinfo) +{ + int pool; + + /* Close all backing store, release all memory. + * Releasing pools in reverse order might help avoid fragmentation + * with some (brain-damaged) malloc libraries. + */ + for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) { + free_pool(cinfo, pool); + } + + /* Release the memory manager control block too. */ + jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr)); + cinfo->mem = NULL; /* ensures I will be called only once */ + + jpeg_mem_term(cinfo); /* system-dependent cleanup */ +} + + +/* + * Memory manager initialization. + * When this is called, only the error manager pointer is valid in cinfo! + */ + +GLOBAL(void) +jinit_memory_mgr (j_common_ptr cinfo) +{ + my_mem_ptr mem; + long max_to_use; + int pool; + size_t test_mac; + + cinfo->mem = NULL; /* for safety if init fails */ + + /* Check for configuration errors. + * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably + * doesn't reflect any real hardware alignment requirement. + * The test is a little tricky: for X>0, X and X-1 have no one-bits + * in common if and only if X is a power of 2, ie has only one one-bit. + * Some compilers may give an "unreachable code" warning here; ignore it. + */ + if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0) + ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE); + /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be + * a multiple of SIZEOF(ALIGN_TYPE). + * Again, an "unreachable code" warning may be ignored here. + * But a "constant too large" warning means you need to fix MAX_ALLOC_CHUNK. + */ + test_mac = (size_t) MAX_ALLOC_CHUNK; + if ((long) test_mac != MAX_ALLOC_CHUNK || + (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0) + ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); + + max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */ + + /* Attempt to allocate memory manager's control block */ + mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr)); + + if (mem == NULL) { + jpeg_mem_term(cinfo); /* system-dependent cleanup */ + ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0); + } + + /* OK, fill in the method pointers */ + mem->pub.alloc_small = alloc_small; + mem->pub.alloc_large = alloc_large; + mem->pub.alloc_sarray = alloc_sarray; + mem->pub.alloc_barray = alloc_barray; + mem->pub.request_virt_sarray = request_virt_sarray; + mem->pub.request_virt_barray = request_virt_barray; + mem->pub.realize_virt_arrays = realize_virt_arrays; + mem->pub.access_virt_sarray = access_virt_sarray; + mem->pub.access_virt_barray = access_virt_barray; + mem->pub.free_pool = free_pool; + mem->pub.self_destruct = self_destruct; + + /* Make MAX_ALLOC_CHUNK accessible to other modules */ + mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK; + + /* Initialize working state */ + mem->pub.max_memory_to_use = max_to_use; + + for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) { + mem->small_list[pool] = NULL; + mem->large_list[pool] = NULL; + } + mem->virt_sarray_list = NULL; + mem->virt_barray_list = NULL; + + mem->total_space_allocated = SIZEOF(my_memory_mgr); + + /* Declare ourselves open for business */ + cinfo->mem = & mem->pub; + + /* Check for an environment variable JPEGMEM; if found, override the + * default max_memory setting from jpeg_mem_init. Note that the + * surrounding application may again override this value. + * If your system doesn't support getenv(), define NO_GETENV to disable + * this feature. + */ +#ifndef NO_GETENV + { char * memenv; + + if ((memenv = getenv("JPEGMEM")) != NULL) { + char ch = 'x'; + + if (sscanf(memenv, "%ld%c", &max_to_use, &ch) > 0) { + if (ch == 'm' || ch == 'M') + max_to_use *= 1000L; + mem->pub.max_memory_to_use = max_to_use * 1000L; + } + } + } +#endif + +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jmemnobs.c b/third_party/windows/fltk-1.1.10/jpeg/jmemnobs.c new file mode 100644 index 0000000..6aa1e92 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jmemnobs.c @@ -0,0 +1,109 @@ +/* + * jmemnobs.c + * + * Copyright (C) 1992-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file provides a really simple implementation of the system- + * dependent portion of the JPEG memory manager. This implementation + * assumes that no backing-store files are needed: all required space + * can be obtained from malloc(). + * This is very portable in the sense that it'll compile on almost anything, + * but you'd better have lots of main memory (or virtual memory) if you want + * to process big images. + * Note that the max_memory_to_use option is ignored by this implementation. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" +#include "jmemsys.h" /* import the system-dependent declarations */ + +#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ +extern void * malloc JPP((size_t size)); +extern void free JPP((void *ptr)); +#endif + + +/* + * Memory allocation and freeing are controlled by the regular library + * routines malloc() and free(). + */ + +GLOBAL(void *) +jpeg_get_small (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void *) malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_small (j_common_ptr cinfo, void * object, size_t sizeofobject) +{ + free(object); +} + + +/* + * "Large" objects are treated the same as "small" ones. + * NB: although we include FAR keywords in the routine declarations, + * this file won't actually work in 80x86 small/medium model; at least, + * you probably won't be able to process useful-size images in only 64KB. + */ + +GLOBAL(void FAR *) +jpeg_get_large (j_common_ptr cinfo, size_t sizeofobject) +{ + return (void FAR *) malloc(sizeofobject); +} + +GLOBAL(void) +jpeg_free_large (j_common_ptr cinfo, void FAR * object, size_t sizeofobject) +{ + free(object); +} + + +/* + * This routine computes the total memory space available for allocation. + * Here we always say, "we got all you want bud!" + */ + +GLOBAL(long) +jpeg_mem_available (j_common_ptr cinfo, long min_bytes_needed, + long max_bytes_needed, long already_allocated) +{ + return max_bytes_needed; +} + + +/* + * Backing store (temporary file) management. + * Since jpeg_mem_available always promised the moon, + * this should never be called and we can just error out. + */ + +GLOBAL(void) +jpeg_open_backing_store (j_common_ptr cinfo, backing_store_ptr info, + long total_bytes_needed) +{ + ERREXIT(cinfo, JERR_NO_BACKING_STORE); +} + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. Here, there isn't any. + */ + +GLOBAL(long) +jpeg_mem_init (j_common_ptr cinfo) +{ + return 0; /* just set max_memory_to_use to 0 */ +} + +GLOBAL(void) +jpeg_mem_term (j_common_ptr cinfo) +{ + /* no work */ +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jmemsys.h b/third_party/windows/fltk-1.1.10/jpeg/jmemsys.h new file mode 100644 index 0000000..2a87961 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jmemsys.h @@ -0,0 +1,198 @@ +/* + * jmemsys.h + * + * Copyright (C) 1992-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This include file defines the interface between the system-independent + * and system-dependent portions of the JPEG memory manager. No other + * modules need include it. (The system-independent portion is jmemmgr.c; + * there are several different versions of the system-dependent portion.) + * + * This file works as-is for the system-dependent memory managers supplied + * in the IJG distribution. You may need to modify it if you write a + * custom memory manager. If system-dependent changes are needed in + * this file, the best method is to #ifdef them based on a configuration + * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR + * and USE_MAC_MEMMGR. + */ + + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_get_small jGetSmall +#define jpeg_free_small jFreeSmall +#define jpeg_get_large jGetLarge +#define jpeg_free_large jFreeLarge +#define jpeg_mem_available jMemAvail +#define jpeg_open_backing_store jOpenBackStore +#define jpeg_mem_init jMemInit +#define jpeg_mem_term jMemTerm +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* + * These two functions are used to allocate and release small chunks of + * memory. (Typically the total amount requested through jpeg_get_small is + * no more than 20K or so; this will be requested in chunks of a few K each.) + * Behavior should be the same as for the standard library functions malloc + * and free; in particular, jpeg_get_small must return NULL on failure. + * On most systems, these ARE malloc and free. jpeg_free_small is passed the + * size of the object being freed, just in case it's needed. + * On an 80x86 machine using small-data memory model, these manage near heap. + */ + +EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject)); +EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object, + size_t sizeofobject)); + +/* + * These two functions are used to allocate and release large chunks of + * memory (up to the total free space designated by jpeg_mem_available). + * The interface is the same as above, except that on an 80x86 machine, + * far pointers are used. On most other machines these are identical to + * the jpeg_get/free_small routines; but we keep them separate anyway, + * in case a different allocation strategy is desirable for large chunks. + */ + +EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo, + size_t sizeofobject)); +EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object, + size_t sizeofobject)); + +/* + * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may + * be requested in a single call to jpeg_get_large (and jpeg_get_small for that + * matter, but that case should never come into play). This macro is needed + * to model the 64Kb-segment-size limit of far addressing on 80x86 machines. + * On those machines, we expect that jconfig.h will provide a proper value. + * On machines with 32-bit flat address spaces, any large constant may be used. + * + * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type + * size_t and will be a multiple of sizeof(align_type). + */ + +#ifndef MAX_ALLOC_CHUNK /* may be overridden in jconfig.h */ +#define MAX_ALLOC_CHUNK 1000000000L +#endif + +/* + * This routine computes the total space still available for allocation by + * jpeg_get_large. If more space than this is needed, backing store will be + * used. NOTE: any memory already allocated must not be counted. + * + * There is a minimum space requirement, corresponding to the minimum + * feasible buffer sizes; jmemmgr.c will request that much space even if + * jpeg_mem_available returns zero. The maximum space needed, enough to hold + * all working storage in memory, is also passed in case it is useful. + * Finally, the total space already allocated is passed. If no better + * method is available, cinfo->mem->max_memory_to_use - already_allocated + * is often a suitable calculation. + * + * It is OK for jpeg_mem_available to underestimate the space available + * (that'll just lead to more backing-store access than is really necessary). + * However, an overestimate will lead to failure. Hence it's wise to subtract + * a slop factor from the true available space. 5% should be enough. + * + * On machines with lots of virtual memory, any large constant may be returned. + * Conversely, zero may be returned to always use the minimum amount of memory. + */ + +EXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo, + long min_bytes_needed, + long max_bytes_needed, + long already_allocated)); + + +/* + * This structure holds whatever state is needed to access a single + * backing-store object. The read/write/close method pointers are called + * by jmemmgr.c to manipulate the backing-store object; all other fields + * are private to the system-dependent backing store routines. + */ + +#define TEMP_NAME_LENGTH 64 /* max length of a temporary file's name */ + + +#ifdef USE_MSDOS_MEMMGR /* DOS-specific junk */ + +typedef unsigned short XMSH; /* type of extended-memory handles */ +typedef unsigned short EMSH; /* type of expanded-memory handles */ + +typedef union { + short file_handle; /* DOS file handle if it's a temp file */ + XMSH xms_handle; /* handle if it's a chunk of XMS */ + EMSH ems_handle; /* handle if it's a chunk of EMS */ +} handle_union; + +#endif /* USE_MSDOS_MEMMGR */ + +#ifdef USE_MAC_MEMMGR /* Mac-specific junk */ +#include +#endif /* USE_MAC_MEMMGR */ + + +typedef struct backing_store_struct * backing_store_ptr; + +typedef struct backing_store_struct { + /* Methods for reading/writing/closing this backing-store object */ + JMETHOD(void, read_backing_store, (j_common_ptr cinfo, + backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count)); + JMETHOD(void, write_backing_store, (j_common_ptr cinfo, + backing_store_ptr info, + void FAR * buffer_address, + long file_offset, long byte_count)); + JMETHOD(void, close_backing_store, (j_common_ptr cinfo, + backing_store_ptr info)); + + /* Private fields for system-dependent backing-store management */ +#ifdef USE_MSDOS_MEMMGR + /* For the MS-DOS manager (jmemdos.c), we need: */ + handle_union handle; /* reference to backing-store storage object */ + char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ +#else +#ifdef USE_MAC_MEMMGR + /* For the Mac manager (jmemmac.c), we need: */ + short temp_file; /* file reference number to temp file */ + FSSpec tempSpec; /* the FSSpec for the temp file */ + char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ +#else + /* For a typical implementation with temp files, we need: */ + FILE * temp_file; /* stdio reference to temp file */ + char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */ +#endif +#endif +} backing_store_info; + + +/* + * Initial opening of a backing-store object. This must fill in the + * read/write/close pointers in the object. The read/write routines + * may take an error exit if the specified maximum file size is exceeded. + * (If jpeg_mem_available always returns a large value, this routine can + * just take an error exit.) + */ + +EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo, + backing_store_ptr info, + long total_bytes_needed)); + + +/* + * These routines take care of any system-dependent initialization and + * cleanup required. jpeg_mem_init will be called before anything is + * allocated (and, therefore, nothing in cinfo is of use except the error + * manager pointer). It should return a suitable default value for + * max_memory_to_use; this may subsequently be overridden by the surrounding + * application. (Note that max_memory_to_use is only important if + * jpeg_mem_available chooses to consult it ... no one else will.) + * jpeg_mem_term may assume that all requested memory has been freed and that + * all opened backing-store objects have been closed. + */ + +EXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo)); diff --git a/third_party/windows/fltk-1.1.10/jpeg/jmorecfg.h b/third_party/windows/fltk-1.1.10/jpeg/jmorecfg.h new file mode 100644 index 0000000..1575e4d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jmorecfg.h @@ -0,0 +1,316 @@ +/* + * jmorecfg.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains additional configuration options that customize the + * JPEG software for special applications or support machine-dependent + * optimizations. Most users will not need to touch this file. + */ + + +/* + * Define BITS_IN_JSAMPLE as either + * 8 for 8-bit sample values (the usual setting) + * 12 for 12-bit sample values + * Only 8 and 12 are legal data precisions for lossy JPEG according to the + * JPEG standard, and the IJG code does not support anything else! + * We do not support run-time selection of data precision, sorry. + */ + +#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ + + +/* + * Maximum number of components (color channels) allowed in JPEG image. + * To meet the letter of the JPEG spec, set this to 255. However, darn + * few applications need more than 4 channels (maybe 5 for CMYK + alpha + * mask). We recommend 10 as a reasonable compromise; use 4 if you are + * really short on memory. (Each allowed component costs a hundred or so + * bytes of storage, whether actually used in an image or not.) + */ + +#define MAX_COMPONENTS 10 /* maximum number of image components */ + + +/* + * Basic data types. + * You may need to change these if you have a machine with unusual data + * type sizes; for example, "char" not 8 bits, "short" not 16 bits, + * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, + * but it had better be at least 16. + */ + +/* Representation of a single sample (pixel element value). + * We frequently allocate large arrays of these, so it's important to keep + * them small. But if you have memory to burn and access to char or short + * arrays is very slow on your hardware, you might want to change these. + */ + +#if BITS_IN_JSAMPLE == 8 +/* JSAMPLE should be the smallest type that will hold the values 0..255. + * You can use a signed char by having GETJSAMPLE mask it with 0xFF. + */ + +typedef unsigned char JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#define MAXJSAMPLE 255 +#define CENTERJSAMPLE 128 + +#endif /* BITS_IN_JSAMPLE == 8 */ + + +#if BITS_IN_JSAMPLE == 12 +/* JSAMPLE should be the smallest type that will hold the values 0..4095. + * On nearly all machines "short" will do nicely. + */ + +typedef short JSAMPLE; +#define GETJSAMPLE(value) ((int) (value)) + +#define MAXJSAMPLE 4095 +#define CENTERJSAMPLE 2048 + +#endif /* BITS_IN_JSAMPLE == 12 */ + + +/* Representation of a DCT frequency coefficient. + * This should be a signed value of at least 16 bits; "short" is usually OK. + * Again, we allocate large arrays of these, but you can change to int + * if you have memory to burn and "short" is really slow. + */ + +typedef short JCOEF; + + +/* Compressed datastreams are represented as arrays of JOCTET. + * These must be EXACTLY 8 bits wide, at least once they are written to + * external storage. Note that when using the stdio data source/destination + * managers, this is also the data type passed to fread/fwrite. + */ + +typedef unsigned char JOCTET; +#define GETJOCTET(value) (value) + +/* These typedefs are used for various table entries and so forth. + * They must be at least as wide as specified; but making them too big + * won't cost a huge amount of memory, so we don't provide special + * extraction code like we did for JSAMPLE. (In other words, these + * typedefs live at a different point on the speed/space tradeoff curve.) + */ + +/* UINT8 must hold at least the values 0..255. */ + +typedef unsigned char UINT8; + +/* UINT16 must hold at least the values 0..65535. */ + +typedef unsigned short UINT16; + +/* INT16 must hold at least the values -32768..32767. */ + +#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ +typedef short INT16; +#endif + +/* INT32 must hold at least signed 32-bit values. */ + +#ifndef XMD_H +typedef int INT32; +#endif + +/* Datatype used for image dimensions. The JPEG standard only supports + * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore + * "unsigned int" is sufficient on all machines. However, if you need to + * handle larger images and you don't mind deviating from the spec, you + * can change this datatype. + */ + +typedef unsigned int JDIMENSION; + +#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ + + +/* These macros are used in all function definitions and extern declarations. + * You could modify them if you need to change function linkage conventions; + * in particular, you'll need to do that to make the library a Windows DLL. + * Another application is to make all functions global for use with debuggers + * or code profilers that require it. + */ + +/* a function called through method pointers: */ +#define METHODDEF(type) static type +/* a function used only in its module: */ +#define LOCAL(type) static type +/* a function referenced thru EXTERNs: */ +#define GLOBAL(type) type +/* a reference to a GLOBAL function: */ +#define EXTERN(type) extern type + + +/* This macro is used to declare a "method", that is, a function pointer. + * We want to supply prototype parameters if the compiler can cope. + * Note that the arglist parameter must be parenthesized! + * Again, you can customize this if you need special linkage keywords. + */ + +#define JMETHOD(type,methodname,arglist) type (*methodname) arglist + +/* Here is the pseudo-keyword for declaring pointers that must be "far" + * on 80x86 machines. Most of the specialized coding for 80x86 is handled + * by just saying "FAR *" where such a pointer is needed. In a few places + * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. + */ + +#undef FAR +#define FAR + + +/* + * On a few systems, type boolean and/or its values FALSE, TRUE may appear + * in standard header files. Or you may have conflicts with application- + * specific header files that you want to include together with these files. + * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. + */ + +#ifndef HAVE_BOOLEAN +typedef char boolean; +#endif +#ifndef FALSE /* in case these macros already exist */ +#define FALSE 0 /* values of boolean */ +#endif +#ifndef TRUE +#define TRUE 1 +#endif + + +/* + * The remaining options affect code selection within the JPEG library, + * but they don't need to be visible to most applications using the library. + * To minimize application namespace pollution, the symbols won't be + * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. + */ + +#ifdef JPEG_INTERNALS +#define JPEG_INTERNAL_OPTIONS +#endif + +#ifdef JPEG_INTERNAL_OPTIONS + + +/* + * These defines indicate whether to include various optional functions. + * Undefining some of these symbols will produce a smaller but less capable + * library. Note that you can leave certain source files out of the + * compilation/linking process if you've #undef'd the corresponding symbols. + * (You may HAVE to do that if your compiler doesn't like null source files.) + */ + +/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */ + +/* Capability options common to encoder and decoder: */ + +#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ +#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ +#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ + +/* Encoder capability options: */ + +#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ +/* Note: if you selected 12-bit data precision, it is dangerous to turn off + * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit + * precision, so jchuff.c normally uses entropy optimization to compute + * usable tables for higher precision. If you don't want to do optimization, + * you'll have to supply different default Huffman tables. + * The exact same statements apply for progressive JPEG: the default tables + * don't work for progressive mode. (This may get fixed, however.) + */ +#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ + +/* Decoder capability options: */ + +#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ +#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ +#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ +#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ +#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ +#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ +#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ +#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ +#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ +#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ + +/* more capability options later, no doubt */ + + +/* + * Ordering of RGB data in scanlines passed to or from the application. + * If your application wants to deal with data in the order B,G,R, just + * change these macros. You can also deal with formats such as R,G,B,X + * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing + * the offsets will also change the order in which colormap data is organized. + * RESTRICTIONS: + * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. + * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not + * useful if you are using JPEG color spaces other than YCbCr or grayscale. + * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE + * is not 3 (they don't understand about dummy color components!). So you + * can't use color quantization if you change that value. + */ + +#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ +#define RGB_GREEN 1 /* Offset of Green */ +#define RGB_BLUE 2 /* Offset of Blue */ +#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ + + +/* Definitions for speed-related optimizations. */ + + +/* If your compiler supports inline functions, define INLINE + * as the inline keyword; otherwise define it as empty. + */ + +#ifndef INLINE +#ifdef __GNUC__ /* for instance, GNU C knows about inline */ +#define INLINE __inline__ +#endif +#ifndef INLINE +#define INLINE /* default is to define it as empty */ +#endif +#endif + + +/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying + * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER + * as short on such a machine. MULTIPLIER must be at least 16 bits wide. + */ + +#ifndef MULTIPLIER +#define MULTIPLIER int /* type for fastest integer multiply */ +#endif + + +/* FAST_FLOAT should be either float or double, whichever is done faster + * by your compiler. (Note that this type is only used in the floating point + * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) + * Typically, float is faster in ANSI C compilers, while double is faster in + * pre-ANSI compilers (because they insist on converting to double anyway). + * The code below therefore chooses float if we have ANSI-style prototypes. + */ + +#ifndef FAST_FLOAT +#ifdef HAVE_PROTOTYPES +#define FAST_FLOAT float +#else +#define FAST_FLOAT double +#endif +#endif + +#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jpegint.h b/third_party/windows/fltk-1.1.10/jpeg/jpegint.h new file mode 100644 index 0000000..685a361 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jpegint.h @@ -0,0 +1,392 @@ +/* + * jpegint.h + * + * Copyright (C) 1991-1997, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file provides common declarations for the various JPEG modules. + * These declarations are considered internal to the JPEG library; most + * applications using the library shouldn't need to include this file. + */ + + +/* Declarations for both compression & decompression */ + +typedef enum { /* Operating modes for buffer controllers */ + JBUF_PASS_THRU, /* Plain stripwise operation */ + /* Remaining modes require a full-image buffer to have been created */ + JBUF_SAVE_SOURCE, /* Run source subobject only, save output */ + JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */ + JBUF_SAVE_AND_PASS /* Run both subobjects, save output */ +} J_BUF_MODE; + +/* Values of global_state field (jdapi.c has some dependencies on ordering!) */ +#define CSTATE_START 100 /* after create_compress */ +#define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */ +#define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */ +#define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */ +#define DSTATE_START 200 /* after create_decompress */ +#define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */ +#define DSTATE_READY 202 /* found SOS, ready for start_decompress */ +#define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/ +#define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */ +#define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */ +#define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */ +#define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */ +#define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */ +#define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */ +#define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */ + + +/* Declarations for compression modules */ + +/* Master control module */ +struct jpeg_comp_master { + JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo)); + JMETHOD(void, pass_startup, (j_compress_ptr cinfo)); + JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); + + /* State variables made visible to other modules */ + boolean call_pass_startup; /* True if pass_startup must be called */ + boolean is_last_pass; /* True during last pass */ +}; + +/* Main buffer control (downsampled-data buffer) */ +struct jpeg_c_main_controller { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, process_data, (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail)); +}; + +/* Compression preprocessing (downsampling input buffer control) */ +struct jpeg_c_prep_controller { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, pre_process_data, (j_compress_ptr cinfo, + JSAMPARRAY input_buf, + JDIMENSION *in_row_ctr, + JDIMENSION in_rows_avail, + JSAMPIMAGE output_buf, + JDIMENSION *out_row_group_ctr, + JDIMENSION out_row_groups_avail)); +}; + +/* Coefficient buffer control */ +struct jpeg_c_coef_controller { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(boolean, compress_data, (j_compress_ptr cinfo, + JSAMPIMAGE input_buf)); +}; + +/* Colorspace conversion */ +struct jpeg_color_converter { + JMETHOD(void, start_pass, (j_compress_ptr cinfo)); + JMETHOD(void, color_convert, (j_compress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPIMAGE output_buf, + JDIMENSION output_row, int num_rows)); +}; + +/* Downsampling */ +struct jpeg_downsampler { + JMETHOD(void, start_pass, (j_compress_ptr cinfo)); + JMETHOD(void, downsample, (j_compress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION in_row_index, + JSAMPIMAGE output_buf, + JDIMENSION out_row_group_index)); + + boolean need_context_rows; /* TRUE if need rows above & below */ +}; + +/* Forward DCT (also controls coefficient quantization) */ +struct jpeg_forward_dct { + JMETHOD(void, start_pass, (j_compress_ptr cinfo)); + /* perhaps this should be an array??? */ + JMETHOD(void, forward_DCT, (j_compress_ptr cinfo, + jpeg_component_info * compptr, + JSAMPARRAY sample_data, JBLOCKROW coef_blocks, + JDIMENSION start_row, JDIMENSION start_col, + JDIMENSION num_blocks)); +}; + +/* Entropy encoding */ +struct jpeg_entropy_encoder { + JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics)); + JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data)); + JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); +}; + +/* Marker writing */ +struct jpeg_marker_writer { + JMETHOD(void, write_file_header, (j_compress_ptr cinfo)); + JMETHOD(void, write_frame_header, (j_compress_ptr cinfo)); + JMETHOD(void, write_scan_header, (j_compress_ptr cinfo)); + JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo)); + JMETHOD(void, write_tables_only, (j_compress_ptr cinfo)); + /* These routines are exported to allow insertion of extra markers */ + /* Probably only COM and APPn markers should be written this way */ + JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker, + unsigned int datalen)); + JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val)); +}; + + +/* Declarations for decompression modules */ + +/* Master control module */ +struct jpeg_decomp_master { + JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo)); + + /* State variables made visible to other modules */ + boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */ +}; + +/* Input control module */ +struct jpeg_input_controller { + JMETHOD(int, consume_input, (j_decompress_ptr cinfo)); + JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo)); + JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo)); + + /* State variables made visible to other modules */ + boolean has_multiple_scans; /* True if file has multiple scans */ + boolean eoi_reached; /* True when EOI has been consumed */ +}; + +/* Main buffer control (downsampled-data buffer) */ +struct jpeg_d_main_controller { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, process_data, (j_decompress_ptr cinfo, + JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +}; + +/* Coefficient buffer control */ +struct jpeg_d_coef_controller { + JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); + JMETHOD(int, consume_data, (j_decompress_ptr cinfo)); + JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo)); + JMETHOD(int, decompress_data, (j_decompress_ptr cinfo, + JSAMPIMAGE output_buf)); + /* Pointer to array of coefficient virtual arrays, or NULL if none */ + jvirt_barray_ptr *coef_arrays; +}; + +/* Decompression postprocessing (color quantization buffer control) */ +struct jpeg_d_post_controller { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); + JMETHOD(void, post_process_data, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, + JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); +}; + +/* Marker reading & parsing */ +struct jpeg_marker_reader { + JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo)); + /* Read markers until SOS or EOI. + * Returns same codes as are defined for jpeg_consume_input: + * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. + */ + JMETHOD(int, read_markers, (j_decompress_ptr cinfo)); + /* Read a restart marker --- exported for use by entropy decoder only */ + jpeg_marker_parser_method read_restart_marker; + + /* State of marker reader --- nominally internal, but applications + * supplying COM or APPn handlers might like to know the state. + */ + boolean saw_SOI; /* found SOI? */ + boolean saw_SOF; /* found SOF? */ + int next_restart_num; /* next restart number expected (0-7) */ + unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */ +}; + +/* Entropy decoding */ +struct jpeg_entropy_decoder { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, + JBLOCKROW *MCU_data)); + + /* This is here to share code between baseline and progressive decoders; */ + /* other modules probably should not use it */ + boolean insufficient_data; /* set TRUE after emitting warning */ +}; + +/* Inverse DCT (also performs dequantization) */ +typedef JMETHOD(void, inverse_DCT_method_ptr, + (j_decompress_ptr cinfo, jpeg_component_info * compptr, + JCOEFPTR coef_block, + JSAMPARRAY output_buf, JDIMENSION output_col)); + +struct jpeg_inverse_dct { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + /* It is useful to allow each component to have a separate IDCT method. */ + inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS]; +}; + +/* Upsampling (note that upsampler must also call color converter) */ +struct jpeg_upsampler { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, upsample, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, + JDIMENSION *in_row_group_ctr, + JDIMENSION in_row_groups_avail, + JSAMPARRAY output_buf, + JDIMENSION *out_row_ctr, + JDIMENSION out_rows_avail)); + + boolean need_context_rows; /* TRUE if need rows above & below */ +}; + +/* Colorspace conversion */ +struct jpeg_color_deconverter { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, color_convert, (j_decompress_ptr cinfo, + JSAMPIMAGE input_buf, JDIMENSION input_row, + JSAMPARRAY output_buf, int num_rows)); +}; + +/* Color quantization or color precision reduction */ +struct jpeg_color_quantizer { + JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan)); + JMETHOD(void, color_quantize, (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, + int num_rows)); + JMETHOD(void, finish_pass, (j_decompress_ptr cinfo)); + JMETHOD(void, new_color_map, (j_decompress_ptr cinfo)); +}; + + +/* Miscellaneous useful macros */ + +#undef MAX +#define MAX(a,b) ((a) > (b) ? (a) : (b)) +#undef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + + +/* We assume that right shift corresponds to signed division by 2 with + * rounding towards minus infinity. This is correct for typical "arithmetic + * shift" instructions that shift in copies of the sign bit. But some + * C compilers implement >> with an unsigned shift. For these machines you + * must define RIGHT_SHIFT_IS_UNSIGNED. + * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity. + * It is only applied with constant shift counts. SHIFT_TEMPS must be + * included in the variables of any routine using RIGHT_SHIFT. + */ + +#ifdef RIGHT_SHIFT_IS_UNSIGNED +#define SHIFT_TEMPS INT32 shift_temp; +#define RIGHT_SHIFT(x,shft) \ + ((shift_temp = (x)) < 0 ? \ + (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \ + (shift_temp >> (shft))) +#else +#define SHIFT_TEMPS +#define RIGHT_SHIFT(x,shft) ((x) >> (shft)) +#endif + + +/* Short forms of external names for systems with brain-damaged linkers. */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jinit_compress_master jICompress +#define jinit_c_master_control jICMaster +#define jinit_c_main_controller jICMainC +#define jinit_c_prep_controller jICPrepC +#define jinit_c_coef_controller jICCoefC +#define jinit_color_converter jICColor +#define jinit_downsampler jIDownsampler +#define jinit_forward_dct jIFDCT +#define jinit_huff_encoder jIHEncoder +#define jinit_phuff_encoder jIPHEncoder +#define jinit_marker_writer jIMWriter +#define jinit_master_decompress jIDMaster +#define jinit_d_main_controller jIDMainC +#define jinit_d_coef_controller jIDCoefC +#define jinit_d_post_controller jIDPostC +#define jinit_input_controller jIInCtlr +#define jinit_marker_reader jIMReader +#define jinit_huff_decoder jIHDecoder +#define jinit_phuff_decoder jIPHDecoder +#define jinit_inverse_dct jIIDCT +#define jinit_upsampler jIUpsampler +#define jinit_color_deconverter jIDColor +#define jinit_1pass_quantizer jI1Quant +#define jinit_2pass_quantizer jI2Quant +#define jinit_merged_upsampler jIMUpsampler +#define jinit_memory_mgr jIMemMgr +#define jdiv_round_up jDivRound +#define jround_up jRound +#define jcopy_sample_rows jCopySamples +#define jcopy_block_row jCopyBlocks +#define jzero_far jZeroFar +#define jpeg_zigzag_order jZIGTable +#define jpeg_natural_order jZAGTable +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Compression module initialization routines */ +EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo, + boolean transcode_only)); +EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo)); +EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo)); +/* Decompression module initialization routines */ +EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo, + boolean need_full_buffer)); +EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo)); +EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo)); +/* Memory manager initialization */ +EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo)); + +/* Utility routines in jutils.c */ +EXTERN(long) jdiv_round_up JPP((long a, long b)); +EXTERN(long) jround_up JPP((long a, long b)); +EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row, + JSAMPARRAY output_array, int dest_row, + int num_rows, JDIMENSION num_cols)); +EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, + JDIMENSION num_blocks)); +EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); +/* Constant tables in jutils.c */ +#if 0 /* This table is not actually needed in v6a */ +extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */ +#endif +extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */ + +/* Suppress undefined-structure complaints if necessary. */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +#endif +#endif /* INCOMPLETE_TYPES_BROKEN */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jpeglib.h b/third_party/windows/fltk-1.1.10/jpeg/jpeglib.h new file mode 100644 index 0000000..b9356f3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jpeglib.h @@ -0,0 +1,1096 @@ +/* + * jpeglib.h + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file defines the application interface for the JPEG library. + * Most applications using the library need only include this file, + * and perhaps jerror.h if they want to know the exact error codes. + */ + +#ifndef JPEGLIB_H +#define JPEGLIB_H + +/* + * First we include the configuration files that record how this + * installation of the JPEG library is set up. jconfig.h can be + * generated automatically for many systems. jmorecfg.h contains + * manual configuration options that most people need not worry about. + */ + +#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ +#include "jconfig.h" /* widely used configuration options */ +#endif +#include "jmorecfg.h" /* seldom changed options */ + + +/* Version ID for the JPEG library. + * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60". + */ + +#define JPEG_LIB_VERSION 62 /* Version 6b */ + + +/* Various constants determining the sizes of things. + * All of these are specified by the JPEG standard, so don't change them + * if you want to be compatible. + */ + +#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ +#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ +#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ +#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ +#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ +#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ +#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ +/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; + * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. + * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU + * to handle it. We even let you do this from the jconfig.h file. However, + * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe + * sometimes emits noncompliant files doesn't mean you should too. + */ +#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ +#ifndef D_MAX_BLOCKS_IN_MCU +#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ +#endif + + +/* Data structures for images (arrays of samples and of DCT coefficients). + * On 80x86 machines, the image arrays are too big for near pointers, + * but the pointer arrays can fit in near memory. + */ + +typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ +typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ +typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ + +typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ +typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ +typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ +typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ + +typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ + + +/* Types for JPEG compression parameters and working tables. */ + + +/* DCT coefficient quantization tables. */ + +typedef struct { + /* This array gives the coefficient quantizers in natural array order + * (not the zigzag order in which they are stored in a JPEG DQT marker). + * CAUTION: IJG versions prior to v6a kept this array in zigzag order. + */ + UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JQUANT_TBL; + + +/* Huffman coding tables. */ + +typedef struct { + /* These two fields directly represent the contents of a JPEG DHT marker */ + UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ + /* length k bits; bits[0] is unused */ + UINT8 huffval[256]; /* The symbols, in order of incr code length */ + /* This field is used only during compression. It's initialized FALSE when + * the table is created, and set TRUE when it's been output to the file. + * You could suppress output of a table by setting this to TRUE. + * (See jpeg_suppress_tables for an example.) + */ + boolean sent_table; /* TRUE when table has been output */ +} JHUFF_TBL; + + +/* Basic info about one component (color channel). */ + +typedef struct { + /* These values are fixed over the whole image. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOF marker. */ + int component_id; /* identifier for this component (0..255) */ + int component_index; /* its index in SOF or cinfo->comp_info[] */ + int h_samp_factor; /* horizontal sampling factor (1..4) */ + int v_samp_factor; /* vertical sampling factor (1..4) */ + int quant_tbl_no; /* quantization table selector (0..3) */ + /* These values may vary between scans. */ + /* For compression, they must be supplied by parameter setup; */ + /* for decompression, they are read from the SOS marker. */ + /* The decompressor output side may not use these variables. */ + int dc_tbl_no; /* DC entropy table selector (0..3) */ + int ac_tbl_no; /* AC entropy table selector (0..3) */ + + /* Remaining fields should be treated as private by applications. */ + + /* These values are computed during compression or decompression startup: */ + /* Component's size in DCT blocks. + * Any dummy blocks added to complete an MCU are not counted; therefore + * these values do not depend on whether a scan is interleaved or not. + */ + JDIMENSION width_in_blocks; + JDIMENSION height_in_blocks; + /* Size of a DCT block in samples. Always DCTSIZE for compression. + * For decompression this is the size of the output from one DCT block, + * reflecting any scaling we choose to apply during the IDCT step. + * Values of 1,2,4,8 are likely to be supported. Note that different + * components may receive different IDCT scalings. + */ + int DCT_scaled_size; + /* The downsampled dimensions are the component's actual, unpadded number + * of samples at the main buffer (preprocessing/compression interface), thus + * downsampled_width = ceil(image_width * Hi/Hmax) + * and similarly for height. For decompression, IDCT scaling is included, so + * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE) + */ + JDIMENSION downsampled_width; /* actual width in samples */ + JDIMENSION downsampled_height; /* actual height in samples */ + /* This flag is used only for decompression. In cases where some of the + * components will be ignored (eg grayscale output from YCbCr image), + * we can skip most computations for the unused components. + */ + boolean component_needed; /* do we need the value of this component? */ + + /* These values are computed before starting a scan of the component. */ + /* The decompressor output side may not use these variables. */ + int MCU_width; /* number of blocks per MCU, horizontally */ + int MCU_height; /* number of blocks per MCU, vertically */ + int MCU_blocks; /* MCU_width * MCU_height */ + int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ + int last_col_width; /* # of non-dummy blocks across in last MCU */ + int last_row_height; /* # of non-dummy blocks down in last MCU */ + + /* Saved quantization table for component; NULL if none yet saved. + * See jdinput.c comments about the need for this information. + * This field is currently used only for decompression. + */ + JQUANT_TBL * quant_table; + + /* Private per-component storage for DCT or IDCT subsystem. */ + void * dct_table; +} jpeg_component_info; + + +/* The script for encoding a multiple-scan file is an array of these: */ + +typedef struct { + int comps_in_scan; /* number of components encoded in this scan */ + int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ + int Ss, Se; /* progressive JPEG spectral selection parms */ + int Ah, Al; /* progressive JPEG successive approx. parms */ +} jpeg_scan_info; + +/* The decompressor can save APPn and COM markers in a list of these: */ + +typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; + +struct jpeg_marker_struct { + jpeg_saved_marker_ptr next; /* next in list, or NULL */ + UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ + unsigned int original_length; /* # bytes of data in the file */ + unsigned int data_length; /* # bytes of data saved at data[] */ + JOCTET FAR * data; /* the data contained in the marker */ + /* the marker length word is not counted in data_length or original_length */ +}; + +/* Known color spaces. */ + +typedef enum { + JCS_UNKNOWN, /* error/unspecified */ + JCS_GRAYSCALE, /* monochrome */ + JCS_RGB, /* red/green/blue */ + JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ + JCS_CMYK, /* C/M/Y/K */ + JCS_YCCK /* Y/Cb/Cr/K */ +} J_COLOR_SPACE; + +/* DCT/IDCT algorithm options. */ + +typedef enum { + JDCT_ISLOW, /* slow but accurate integer algorithm */ + JDCT_IFAST, /* faster, less accurate integer method */ + JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ +} J_DCT_METHOD; + +#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ +#define JDCT_DEFAULT JDCT_ISLOW +#endif +#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ +#define JDCT_FASTEST JDCT_IFAST +#endif + +/* Dithering options for decompression. */ + +typedef enum { + JDITHER_NONE, /* no dithering */ + JDITHER_ORDERED, /* simple ordered dither */ + JDITHER_FS /* Floyd-Steinberg error diffusion dither */ +} J_DITHER_MODE; + + +/* Common fields between JPEG compression and decompression master structs. */ + +#define jpeg_common_fields \ + struct jpeg_error_mgr * err; /* Error handler module */\ + struct jpeg_memory_mgr * mem; /* Memory manager module */\ + struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ + void * client_data; /* Available for use by application */\ + boolean is_decompressor; /* So common code can tell which is which */\ + int global_state /* For checking call sequence validity */ + +/* Routines that are to be used by both halves of the library are declared + * to receive a pointer to this structure. There are no actual instances of + * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. + */ +struct jpeg_common_struct { + jpeg_common_fields; /* Fields common to both master struct types */ + /* Additional fields follow in an actual jpeg_compress_struct or + * jpeg_decompress_struct. All three structs must agree on these + * initial fields! (This would be a lot cleaner in C++.) + */ +}; + +typedef struct jpeg_common_struct * j_common_ptr; +typedef struct jpeg_compress_struct * j_compress_ptr; +typedef struct jpeg_decompress_struct * j_decompress_ptr; + + +/* Master record for a compression instance */ + +struct jpeg_compress_struct { + jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ + + /* Destination for compressed data */ + struct jpeg_destination_mgr * dest; + + /* Description of source image --- these fields must be filled in by + * outer application before starting compression. in_color_space must + * be correct before you can even call jpeg_set_defaults(). + */ + + JDIMENSION image_width; /* input image width */ + JDIMENSION image_height; /* input image height */ + int input_components; /* # of color components in input image */ + J_COLOR_SPACE in_color_space; /* colorspace of input image */ + + double input_gamma; /* image gamma of input image */ + + /* Compression parameters --- these fields must be set before calling + * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to + * initialize everything to reasonable defaults, then changing anything + * the application specifically wants to change. That way you won't get + * burnt when new parameters are added. Also note that there are several + * helper routines to simplify changing parameters. + */ + + int data_precision; /* bits of precision in image data */ + + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + int num_scans; /* # of entries in scan_info array */ + const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ + /* The default value of scan_info is NULL, which causes a single-scan + * sequential JPEG file to be emitted. To create a multi-scan file, + * set num_scans and scan_info to point to an array of scan definitions. + */ + + boolean raw_data_in; /* TRUE=caller supplies downsampled data */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + int smoothing_factor; /* 1..100, or 0 for no input smoothing */ + J_DCT_METHOD dct_method; /* DCT algorithm selector */ + + /* The restart interval can be specified in absolute MCUs by setting + * restart_interval, or in MCU rows by setting restart_in_rows + * (in which case the correct restart_interval will be figured + * for each scan). + */ + unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ + int restart_in_rows; /* if > 0, MCU rows per restart interval */ + + /* Parameters controlling emission of special markers. */ + + boolean write_JFIF_header; /* should a JFIF marker be written? */ + UINT8 JFIF_major_version; /* What to write for the JFIF version number */ + UINT8 JFIF_minor_version; + /* These three values are not used by the JPEG code, merely copied */ + /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ + /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ + /* ratio is defined by X_density/Y_density even when density_unit=0. */ + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean write_Adobe_marker; /* should an Adobe marker be written? */ + + /* State variable: index of next scanline to be written to + * jpeg_write_scanlines(). Application may use this to control its + * processing loop, e.g., "while (next_scanline < image_height)". + */ + + JDIMENSION next_scanline; /* 0 .. image_height-1 */ + + /* Remaining fields are known throughout compressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during compression startup + */ + boolean progressive_mode; /* TRUE if scan script uses progressive mode */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ + /* The coefficient controller receives data in units of MCU rows as defined + * for fully interleaved scans (whether the JPEG file is interleaved or not). + * There are v_samp_factor * DCTSIZE sample rows of each component in an + * "iMCU" (interleaved MCU) row. + */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[C_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* + * Links to compression subobjects (methods and private variables of modules) + */ + struct jpeg_comp_master * master; + struct jpeg_c_main_controller * main; + struct jpeg_c_prep_controller * prep; + struct jpeg_c_coef_controller * coef; + struct jpeg_marker_writer * marker; + struct jpeg_color_converter * cconvert; + struct jpeg_downsampler * downsample; + struct jpeg_forward_dct * fdct; + struct jpeg_entropy_encoder * entropy; + jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ + int script_space_size; +}; + + +/* Master record for a decompression instance */ + +struct jpeg_decompress_struct { + jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ + + /* Source of compressed data */ + struct jpeg_source_mgr * src; + + /* Basic description of image --- filled in by jpeg_read_header(). */ + /* Application may inspect these values to decide how to process image. */ + + JDIMENSION image_width; /* nominal image width (from SOF marker) */ + JDIMENSION image_height; /* nominal image height */ + int num_components; /* # of color components in JPEG image */ + J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ + + /* Decompression processing parameters --- these fields must be set before + * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes + * them to default values. + */ + + J_COLOR_SPACE out_color_space; /* colorspace for output */ + + unsigned int scale_num, scale_denom; /* fraction by which to scale image */ + + double output_gamma; /* image gamma wanted in output */ + + boolean buffered_image; /* TRUE=multiple output passes */ + boolean raw_data_out; /* TRUE=downsampled data wanted */ + + J_DCT_METHOD dct_method; /* IDCT algorithm selector */ + boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ + boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ + + boolean quantize_colors; /* TRUE=colormapped output wanted */ + /* the following are ignored if not quantize_colors: */ + J_DITHER_MODE dither_mode; /* type of color dithering to use */ + boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ + int desired_number_of_colors; /* max # colors to use in created colormap */ + /* these are significant only in buffered-image mode: */ + boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ + boolean enable_external_quant;/* enable future use of external colormap */ + boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ + + /* Description of actual output image that will be returned to application. + * These fields are computed by jpeg_start_decompress(). + * You can also use jpeg_calc_output_dimensions() to determine these values + * in advance of calling jpeg_start_decompress(). + */ + + JDIMENSION output_width; /* scaled image width */ + JDIMENSION output_height; /* scaled image height */ + int out_color_components; /* # of color components in out_color_space */ + int output_components; /* # of color components returned */ + /* output_components is 1 (a colormap index) when quantizing colors; + * otherwise it equals out_color_components. + */ + int rec_outbuf_height; /* min recommended height of scanline buffer */ + /* If the buffer passed to jpeg_read_scanlines() is less than this many rows + * high, space and time will be wasted due to unnecessary data copying. + * Usually rec_outbuf_height will be 1 or 2, at most 4. + */ + + /* When quantizing colors, the output colormap is described by these fields. + * The application can supply a colormap by setting colormap non-NULL before + * calling jpeg_start_decompress; otherwise a colormap is created during + * jpeg_start_decompress or jpeg_start_output. + * The map has out_color_components rows and actual_number_of_colors columns. + */ + int actual_number_of_colors; /* number of entries in use */ + JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ + + /* State variables: these variables indicate the progress of decompression. + * The application may examine these but must not modify them. + */ + + /* Row index of next scanline to be read from jpeg_read_scanlines(). + * Application may use this to control its processing loop, e.g., + * "while (output_scanline < output_height)". + */ + JDIMENSION output_scanline; /* 0 .. output_height-1 */ + + /* Current input scan number and number of iMCU rows completed in scan. + * These indicate the progress of the decompressor input side. + */ + int input_scan_number; /* Number of SOS markers seen so far */ + JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ + + /* The "output scan number" is the notional scan being displayed by the + * output side. The decompressor will not allow output scan/row number + * to get ahead of input scan/row, but it can fall arbitrarily far behind. + */ + int output_scan_number; /* Nominal scan number being displayed */ + JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ + + /* Current progression status. coef_bits[c][i] indicates the precision + * with which component c's DCT coefficient i (in zigzag order) is known. + * It is -1 when no data has yet been received, otherwise it is the point + * transform (shift) value for the most recent scan of the coefficient + * (thus, 0 at completion of the progression). + * This pointer is NULL when reading a non-progressive file. + */ + int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ + + /* Internal JPEG parameters --- the application usually need not look at + * these fields. Note that the decompressor output side may not use + * any parameters that can change between scans. + */ + + /* Quantization and Huffman tables are carried forward across input + * datastreams when processing abbreviated JPEG datastreams. + */ + + JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; + /* ptrs to coefficient quantization tables, or NULL if not defined */ + + JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; + JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; + /* ptrs to Huffman coding tables, or NULL if not defined */ + + /* These parameters are never carried across datastreams, since they + * are given in SOF/SOS markers or defined to be reset by SOI. + */ + + int data_precision; /* bits of precision in image data */ + + jpeg_component_info * comp_info; + /* comp_info[i] describes component that appears i'th in SOF */ + + boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ + boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ + + UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ + UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ + UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ + + unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ + + /* These fields record data obtained from optional markers recognized by + * the JPEG library. + */ + boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ + /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ + UINT8 JFIF_major_version; /* JFIF version number */ + UINT8 JFIF_minor_version; + UINT8 density_unit; /* JFIF code for pixel size units */ + UINT16 X_density; /* Horizontal pixel density */ + UINT16 Y_density; /* Vertical pixel density */ + boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ + UINT8 Adobe_transform; /* Color transform code from Adobe marker */ + + boolean CCIR601_sampling; /* TRUE=first samples are cosited */ + + /* Aside from the specific data retained from APPn markers known to the + * library, the uninterpreted contents of any or all APPn and COM markers + * can be saved in a list for examination by the application. + */ + jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ + + /* Remaining fields are known throughout decompressor, but generally + * should not be touched by a surrounding application. + */ + + /* + * These fields are computed during decompression startup + */ + int max_h_samp_factor; /* largest h_samp_factor */ + int max_v_samp_factor; /* largest v_samp_factor */ + + int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */ + + JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ + /* The coefficient controller's input and output progress is measured in + * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows + * in fully interleaved JPEG scans, but are used whether the scan is + * interleaved or not. We define an iMCU row as v_samp_factor DCT block + * rows of each component. Therefore, the IDCT output contains + * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row. + */ + + JSAMPLE * sample_range_limit; /* table for fast range-limiting */ + + /* + * These fields are valid during any one scan. + * They describe the components and MCUs actually appearing in the scan. + * Note that the decompressor output side must not use these fields. + */ + int comps_in_scan; /* # of JPEG components in this scan */ + jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; + /* *cur_comp_info[i] describes component that appears i'th in SOS */ + + JDIMENSION MCUs_per_row; /* # of MCUs across the image */ + JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ + + int blocks_in_MCU; /* # of DCT blocks per MCU */ + int MCU_membership[D_MAX_BLOCKS_IN_MCU]; + /* MCU_membership[i] is index in cur_comp_info of component owning */ + /* i'th block in an MCU */ + + int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ + + /* This field is shared between entropy decoder and marker parser. + * It is either zero or the code of a JPEG marker that has been + * read from the data source, but has not yet been processed. + */ + int unread_marker; + + /* + * Links to decompression subobjects (methods, private variables of modules) + */ + struct jpeg_decomp_master * master; + struct jpeg_d_main_controller * main; + struct jpeg_d_coef_controller * coef; + struct jpeg_d_post_controller * post; + struct jpeg_input_controller * inputctl; + struct jpeg_marker_reader * marker; + struct jpeg_entropy_decoder * entropy; + struct jpeg_inverse_dct * idct; + struct jpeg_upsampler * upsample; + struct jpeg_color_deconverter * cconvert; + struct jpeg_color_quantizer * cquantize; +}; + + +/* "Object" declarations for JPEG modules that may be supplied or called + * directly by the surrounding application. + * As with all objects in the JPEG library, these structs only define the + * publicly visible methods and state variables of a module. Additional + * private fields may exist after the public ones. + */ + + +/* Error handler object */ + +struct jpeg_error_mgr { + /* Error exit handler: does not return to caller */ + JMETHOD(void, error_exit, (j_common_ptr cinfo)); + /* Conditionally emit a trace or warning message */ + JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); + /* Routine that actually outputs a trace or error message */ + JMETHOD(void, output_message, (j_common_ptr cinfo)); + /* Format a message string for the most recent JPEG error or message */ + JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); +#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ + /* Reset error state variables at start of a new image */ + JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); + + /* The message ID code and any parameters are saved here. + * A message can have one string parameter or up to 8 int parameters. + */ + int msg_code; +#define JMSG_STR_PARM_MAX 80 + union { + int i[8]; + char s[JMSG_STR_PARM_MAX]; + } msg_parm; + + /* Standard state variables for error facility */ + + int trace_level; /* max msg_level that will be displayed */ + + /* For recoverable corrupt-data errors, we emit a warning message, + * but keep going unless emit_message chooses to abort. emit_message + * should count warnings in num_warnings. The surrounding application + * can check for bad data by seeing if num_warnings is nonzero at the + * end of processing. + */ + long num_warnings; /* number of corrupt-data warnings */ + + /* These fields point to the table(s) of error message strings. + * An application can change the table pointer to switch to a different + * message list (typically, to change the language in which errors are + * reported). Some applications may wish to add additional error codes + * that will be handled by the JPEG library error mechanism; the second + * table pointer is used for this purpose. + * + * First table includes all errors generated by JPEG library itself. + * Error code 0 is reserved for a "no such error string" message. + */ + const char * const * jpeg_message_table; /* Library errors */ + int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ + /* Second table can be added by application (see cjpeg/djpeg for example). + * It contains strings numbered first_addon_message..last_addon_message. + */ + const char * const * addon_message_table; /* Non-library errors */ + int first_addon_message; /* code for first string in addon table */ + int last_addon_message; /* code for last string in addon table */ +}; + + +/* Progress monitor object */ + +struct jpeg_progress_mgr { + JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); + + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +}; + + +/* Data destination object for compression */ + +struct jpeg_destination_mgr { + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + + JMETHOD(void, init_destination, (j_compress_ptr cinfo)); + JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); + JMETHOD(void, term_destination, (j_compress_ptr cinfo)); +}; + + +/* Data source object for decompression */ + +struct jpeg_source_mgr { + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + + JMETHOD(void, init_source, (j_decompress_ptr cinfo)); + JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); + JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); + JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); + JMETHOD(void, term_source, (j_decompress_ptr cinfo)); +}; + + +/* Memory manager object. + * Allocates "small" objects (a few K total), "large" objects (tens of K), + * and "really big" objects (virtual arrays with backing store if needed). + * The memory manager does not allow individual objects to be freed; rather, + * each created object is assigned to a pool, and whole pools can be freed + * at once. This is faster and more convenient than remembering exactly what + * to free, especially where malloc()/free() are not too speedy. + * NB: alloc routines never return NULL. They exit to error_exit if not + * successful. + */ + +#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ +#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ +#define JPOOL_NUMPOOLS 2 + +typedef struct jvirt_sarray_control * jvirt_sarray_ptr; +typedef struct jvirt_barray_control * jvirt_barray_ptr; + + +struct jpeg_memory_mgr { + /* Method pointers */ + JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, + size_t sizeofobject)); + JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, + JDIMENSION samplesperrow, + JDIMENSION numrows)); + JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, + JDIMENSION blocksperrow, + JDIMENSION numrows)); + JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION samplesperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, + int pool_id, + boolean pre_zero, + JDIMENSION blocksperrow, + JDIMENSION numrows, + JDIMENSION maxaccess)); + JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); + JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, + jvirt_sarray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, + jvirt_barray_ptr ptr, + JDIMENSION start_row, + JDIMENSION num_rows, + boolean writable)); + JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); + JMETHOD(void, self_destruct, (j_common_ptr cinfo)); + + /* Limit on memory allocation for this JPEG object. (Note that this is + * merely advisory, not a guaranteed maximum; it only affects the space + * used for virtual-array buffers.) May be changed by outer application + * after creating the JPEG object. + */ + long max_memory_to_use; + + /* Maximum allocation request accepted by alloc_large. */ + long max_alloc_chunk; +}; + + +/* Routine signature for application-supplied marker processing methods. + * Need not pass marker code since it is stored in cinfo->unread_marker. + */ +typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); + + +/* Declarations for routines called by application. + * The JPP macro hides prototype parameters from compilers that can't cope. + * Note JPP requires double parentheses. + */ + +#ifdef HAVE_PROTOTYPES +#define JPP(arglist) arglist +#else +#define JPP(arglist) () +#endif + + +/* Short forms of external names for systems with brain-damaged linkers. + * We shorten external names to be unique in the first six letters, which + * is good enough for all known systems. + * (If your compiler itself needs names to be unique in less than 15 + * characters, you are out of luck. Get a better compiler.) + */ + +#ifdef NEED_SHORT_EXTERNAL_NAMES +#define jpeg_std_error jStdError +#define jpeg_CreateCompress jCreaCompress +#define jpeg_CreateDecompress jCreaDecompress +#define jpeg_destroy_compress jDestCompress +#define jpeg_destroy_decompress jDestDecompress +#define jpeg_stdio_dest jStdDest +#define jpeg_stdio_src jStdSrc +#define jpeg_set_defaults jSetDefaults +#define jpeg_set_colorspace jSetColorspace +#define jpeg_default_colorspace jDefColorspace +#define jpeg_set_quality jSetQuality +#define jpeg_set_linear_quality jSetLQuality +#define jpeg_add_quant_table jAddQuantTable +#define jpeg_quality_scaling jQualityScaling +#define jpeg_simple_progression jSimProgress +#define jpeg_suppress_tables jSuppressTables +#define jpeg_alloc_quant_table jAlcQTable +#define jpeg_alloc_huff_table jAlcHTable +#define jpeg_start_compress jStrtCompress +#define jpeg_write_scanlines jWrtScanlines +#define jpeg_finish_compress jFinCompress +#define jpeg_write_raw_data jWrtRawData +#define jpeg_write_marker jWrtMarker +#define jpeg_write_m_header jWrtMHeader +#define jpeg_write_m_byte jWrtMByte +#define jpeg_write_tables jWrtTables +#define jpeg_read_header jReadHeader +#define jpeg_start_decompress jStrtDecompress +#define jpeg_read_scanlines jReadScanlines +#define jpeg_finish_decompress jFinDecompress +#define jpeg_read_raw_data jReadRawData +#define jpeg_has_multiple_scans jHasMultScn +#define jpeg_start_output jStrtOutput +#define jpeg_finish_output jFinOutput +#define jpeg_input_complete jInComplete +#define jpeg_new_colormap jNewCMap +#define jpeg_consume_input jConsumeInput +#define jpeg_calc_output_dimensions jCalcDimensions +#define jpeg_save_markers jSaveMarkers +#define jpeg_set_marker_processor jSetMarker +#define jpeg_read_coefficients jReadCoefs +#define jpeg_write_coefficients jWrtCoefs +#define jpeg_copy_critical_parameters jCopyCrit +#define jpeg_abort_compress jAbrtCompress +#define jpeg_abort_decompress jAbrtDecompress +#define jpeg_abort jAbort +#define jpeg_destroy jDestroy +#define jpeg_resync_to_restart jResyncRestart +#endif /* NEED_SHORT_EXTERNAL_NAMES */ + + +/* Default error-management setup */ +EXTERN(struct jpeg_error_mgr *) jpeg_std_error + JPP((struct jpeg_error_mgr * err)); + +/* Initialization of JPEG compression objects. + * jpeg_create_compress() and jpeg_create_decompress() are the exported + * names that applications should call. These expand to calls on + * jpeg_CreateCompress and jpeg_CreateDecompress with additional information + * passed for version mismatch checking. + * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. + */ +#define jpeg_create_compress(cinfo) \ + jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_compress_struct)) +#define jpeg_create_decompress(cinfo) \ + jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ + (size_t) sizeof(struct jpeg_decompress_struct)) +EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, + int version, size_t structsize)); +EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, + int version, size_t structsize)); +/* Destruction of JPEG compression objects */ +EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); + +/* Standard data source and destination managers: stdio streams. */ +/* Caller is responsible for opening the file before and closing after. */ +EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); +EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); + +/* Default parameter setup for compression */ +EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); +/* Compression parameter setup aids */ +EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, + J_COLOR_SPACE colorspace)); +EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, + boolean force_baseline)); +EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, + int scale_factor, + boolean force_baseline)); +EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, + boolean force_baseline)); +EXTERN(int) jpeg_quality_scaling JPP((int quality)); +EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, + boolean suppress)); +EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); +EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); + +/* Main entry points for compression */ +EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, + boolean write_all_tables)); +EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION num_lines)); +EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); + +/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION num_lines)); + +/* Write a special marker. See libjpeg.doc concerning safe usage. */ +EXTERN(void) jpeg_write_marker + JPP((j_compress_ptr cinfo, int marker, + const JOCTET * dataptr, unsigned int datalen)); +/* Same, but piecemeal. */ +EXTERN(void) jpeg_write_m_header + JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); +EXTERN(void) jpeg_write_m_byte + JPP((j_compress_ptr cinfo, int val)); + +/* Alternate compression function: just write an abbreviated table file */ +EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); + +/* Decompression startup: read start of JPEG datastream to see what's there */ +EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, + boolean require_image)); +/* Return value is one of: */ +#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ +#define JPEG_HEADER_OK 1 /* Found valid image datastream */ +#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ +/* If you pass require_image = TRUE (normal case), you need not check for + * a TABLES_ONLY return code; an abbreviated file will cause an error exit. + * JPEG_SUSPENDED is only possible if you use a data source module that can + * give a suspension return (the stdio source module doesn't). + */ + +/* Main entry points for decompression */ +EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); +EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, + JSAMPARRAY scanlines, + JDIMENSION max_lines)); +EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); + +/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ +EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, + JSAMPIMAGE data, + JDIMENSION max_lines)); + +/* Additional entry points for buffered-image mode. */ +EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, + int scan_number)); +EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); +EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); +EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); +/* Return value is one of: */ +/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ +#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ +#define JPEG_REACHED_EOI 2 /* Reached end of image */ +#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ +#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ + +/* Precalculate output dimensions for current decompression parameters. */ +EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); + +/* Control saving of COM and APPn markers into marker_list. */ +EXTERN(void) jpeg_save_markers + JPP((j_decompress_ptr cinfo, int marker_code, + unsigned int length_limit)); + +/* Install a special processing method for COM or APPn markers. */ +EXTERN(void) jpeg_set_marker_processor + JPP((j_decompress_ptr cinfo, int marker_code, + jpeg_marker_parser_method routine)); + +/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ +EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); +EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, + jvirt_barray_ptr * coef_arrays)); +EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, + j_compress_ptr dstinfo)); + +/* If you choose to abort compression or decompression before completing + * jpeg_finish_(de)compress, then you need to clean up to release memory, + * temporary files, etc. You can just call jpeg_destroy_(de)compress + * if you're done with the JPEG object, but if you want to clean it up and + * reuse it, call this: + */ +EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); +EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); + +/* Generic versions of jpeg_abort and jpeg_destroy that work on either + * flavor of JPEG object. These may be more convenient in some places. + */ +EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); +EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); + +/* Default restart-marker-resync procedure for use by data source modules */ +EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, + int desired)); + + +/* These marker codes are exported since applications and data source modules + * are likely to want to use them. + */ + +#define JPEG_RST0 0xD0 /* RST0 marker code */ +#define JPEG_EOI 0xD9 /* EOI marker code */ +#define JPEG_APP0 0xE0 /* APP0 marker code */ +#define JPEG_COM 0xFE /* COM marker code */ + + +/* If we have a brain-damaged compiler that emits warnings (or worse, errors) + * for structure definitions that are never filled in, keep it quiet by + * supplying dummy definitions for the various substructures. + */ + +#ifdef INCOMPLETE_TYPES_BROKEN +#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ +struct jvirt_sarray_control { long dummy; }; +struct jvirt_barray_control { long dummy; }; +struct jpeg_comp_master { long dummy; }; +struct jpeg_c_main_controller { long dummy; }; +struct jpeg_c_prep_controller { long dummy; }; +struct jpeg_c_coef_controller { long dummy; }; +struct jpeg_marker_writer { long dummy; }; +struct jpeg_color_converter { long dummy; }; +struct jpeg_downsampler { long dummy; }; +struct jpeg_forward_dct { long dummy; }; +struct jpeg_entropy_encoder { long dummy; }; +struct jpeg_decomp_master { long dummy; }; +struct jpeg_d_main_controller { long dummy; }; +struct jpeg_d_coef_controller { long dummy; }; +struct jpeg_d_post_controller { long dummy; }; +struct jpeg_input_controller { long dummy; }; +struct jpeg_marker_reader { long dummy; }; +struct jpeg_entropy_decoder { long dummy; }; +struct jpeg_inverse_dct { long dummy; }; +struct jpeg_upsampler { long dummy; }; +struct jpeg_color_deconverter { long dummy; }; +struct jpeg_color_quantizer { long dummy; }; +#endif /* JPEG_INTERNALS */ +#endif /* INCOMPLETE_TYPES_BROKEN */ + + +/* + * The JPEG library modules define JPEG_INTERNALS before including this file. + * The internal structure declarations are read only when that is true. + * Applications using the library should not include jpegint.h, but may wish + * to include jerror.h. + */ + +#ifdef JPEG_INTERNALS +#include "jpegint.h" /* fetch private declarations */ +#include "jerror.h" /* fetch error codes too */ +#endif + +#endif /* JPEGLIB_H */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jquant1.c b/third_party/windows/fltk-1.1.10/jpeg/jquant1.c new file mode 100644 index 0000000..aaa34a1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jquant1.c @@ -0,0 +1,856 @@ +/* + * jquant1.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains 1-pass color quantization (color mapping) routines. + * These routines provide mapping to a fixed color map using equally spaced + * color values. Optional Floyd-Steinberg or ordered dithering is available. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +#ifdef QUANT_1PASS_SUPPORTED + + +/* + * The main purpose of 1-pass quantization is to provide a fast, if not very + * high quality, colormapped output capability. A 2-pass quantizer usually + * gives better visual quality; however, for quantized grayscale output this + * quantizer is perfectly adequate. Dithering is highly recommended with this + * quantizer, though you can turn it off if you really want to. + * + * In 1-pass quantization the colormap must be chosen in advance of seeing the + * image. We use a map consisting of all combinations of Ncolors[i] color + * values for the i'th component. The Ncolors[] values are chosen so that + * their product, the total number of colors, is no more than that requested. + * (In most cases, the product will be somewhat less.) + * + * Since the colormap is orthogonal, the representative value for each color + * component can be determined without considering the other components; + * then these indexes can be combined into a colormap index by a standard + * N-dimensional-array-subscript calculation. Most of the arithmetic involved + * can be precalculated and stored in the lookup table colorindex[]. + * colorindex[i][j] maps pixel value j in component i to the nearest + * representative value (grid plane) for that component; this index is + * multiplied by the array stride for component i, so that the + * index of the colormap entry closest to a given pixel value is just + * sum( colorindex[component-number][pixel-component-value] ) + * Aside from being fast, this scheme allows for variable spacing between + * representative values with no additional lookup cost. + * + * If gamma correction has been applied in color conversion, it might be wise + * to adjust the color grid spacing so that the representative colors are + * equidistant in linear space. At this writing, gamma correction is not + * implemented by jdcolor, so nothing is done here. + */ + + +/* Declarations for ordered dithering. + * + * We use a standard 16x16 ordered dither array. The basic concept of ordered + * dithering is described in many references, for instance Dale Schumacher's + * chapter II.2 of Graphics Gems II (James Arvo, ed. Academic Press, 1991). + * In place of Schumacher's comparisons against a "threshold" value, we add a + * "dither" value to the input pixel and then round the result to the nearest + * output value. The dither value is equivalent to (0.5 - threshold) times + * the distance between output values. For ordered dithering, we assume that + * the output colors are equally spaced; if not, results will probably be + * worse, since the dither may be too much or too little at a given point. + * + * The normal calculation would be to form pixel value + dither, range-limit + * this to 0..MAXJSAMPLE, and then index into the colorindex table as usual. + * We can skip the separate range-limiting step by extending the colorindex + * table in both directions. + */ + +#define ODITHER_SIZE 16 /* dimension of dither matrix */ +/* NB: if ODITHER_SIZE is not a power of 2, ODITHER_MASK uses will break */ +#define ODITHER_CELLS (ODITHER_SIZE*ODITHER_SIZE) /* # cells in matrix */ +#define ODITHER_MASK (ODITHER_SIZE-1) /* mask for wrapping around counters */ + +typedef int ODITHER_MATRIX[ODITHER_SIZE][ODITHER_SIZE]; +typedef int (*ODITHER_MATRIX_PTR)[ODITHER_SIZE]; + +static const UINT8 base_dither_matrix[ODITHER_SIZE][ODITHER_SIZE] = { + /* Bayer's order-4 dither array. Generated by the code given in + * Stephen Hawley's article "Ordered Dithering" in Graphics Gems I. + * The values in this array must range from 0 to ODITHER_CELLS-1. + */ + { 0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255 }, + { 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 }, + { 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 }, + { 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 }, + { 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247 }, + { 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 }, + { 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 }, + { 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 }, + { 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253 }, + { 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 }, + { 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 }, + { 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 }, + { 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245 }, + { 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 }, + { 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 }, + { 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 } +}; + + +/* Declarations for Floyd-Steinberg dithering. + * + * Errors are accumulated into the array fserrors[], at a resolution of + * 1/16th of a pixel count. The error at a given pixel is propagated + * to its not-yet-processed neighbors using the standard F-S fractions, + * ... (here) 7/16 + * 3/16 5/16 1/16 + * We work left-to-right on even rows, right-to-left on odd rows. + * + * We can get away with a single array (holding one row's worth of errors) + * by using it to store the current row's errors at pixel columns not yet + * processed, but the next row's errors at columns already processed. We + * need only a few extra variables to hold the errors immediately around the + * current column. (If we are lucky, those variables are in registers, but + * even if not, they're probably cheaper to access than array elements are.) + * + * The fserrors[] array is indexed [component#][position]. + * We provide (#columns + 2) entries per component; the extra entry at each + * end saves us from special-casing the first and last pixels. + * + * Note: on a wide image, we might not have enough room in a PC's near data + * segment to hold the error array; so it is allocated with alloc_large. + */ + +#if BITS_IN_JSAMPLE == 8 +typedef INT16 FSERROR; /* 16 bits should be enough */ +typedef int LOCFSERROR; /* use 'int' for calculation temps */ +#else +typedef INT32 FSERROR; /* may need more than 16 bits */ +typedef INT32 LOCFSERROR; /* be sure calculation temps are big enough */ +#endif + +typedef FSERROR FAR *FSERRPTR; /* pointer to error array (in FAR storage!) */ + + +/* Private subobject */ + +#define MAX_Q_COMPS 4 /* max components I can handle */ + +typedef struct { + struct jpeg_color_quantizer pub; /* public fields */ + + /* Initially allocated colormap is saved here */ + JSAMPARRAY sv_colormap; /* The color map as a 2-D pixel array */ + int sv_actual; /* number of entries in use */ + + JSAMPARRAY colorindex; /* Precomputed mapping for speed */ + /* colorindex[i][j] = index of color closest to pixel value j in component i, + * premultiplied as described above. Since colormap indexes must fit into + * JSAMPLEs, the entries of this array will too. + */ + boolean is_padded; /* is the colorindex padded for odither? */ + + int Ncolors[MAX_Q_COMPS]; /* # of values alloced to each component */ + + /* Variables for ordered dithering */ + int row_index; /* cur row's vertical index in dither matrix */ + ODITHER_MATRIX_PTR odither[MAX_Q_COMPS]; /* one dither array per component */ + + /* Variables for Floyd-Steinberg dithering */ + FSERRPTR fserrors[MAX_Q_COMPS]; /* accumulated errors */ + boolean on_odd_row; /* flag to remember which row we are on */ +} my_cquantizer; + +typedef my_cquantizer * my_cquantize_ptr; + + +/* + * Policy-making subroutines for create_colormap and create_colorindex. + * These routines determine the colormap to be used. The rest of the module + * only assumes that the colormap is orthogonal. + * + * * select_ncolors decides how to divvy up the available colors + * among the components. + * * output_value defines the set of representative values for a component. + * * largest_input_value defines the mapping from input values to + * representative values for a component. + * Note that the latter two routines may impose different policies for + * different components, though this is not currently done. + */ + + +LOCAL(int) +select_ncolors (j_decompress_ptr cinfo, int Ncolors[]) +/* Determine allocation of desired colors to components, */ +/* and fill in Ncolors[] array to indicate choice. */ +/* Return value is total number of colors (product of Ncolors[] values). */ +{ + int nc = cinfo->out_color_components; /* number of color components */ + int max_colors = cinfo->desired_number_of_colors; + int total_colors, iroot, i, j; + boolean changed; + long temp; + static const int RGB_order[3] = { RGB_GREEN, RGB_RED, RGB_BLUE }; + + /* We can allocate at least the nc'th root of max_colors per component. */ + /* Compute floor(nc'th root of max_colors). */ + iroot = 1; + do { + iroot++; + temp = iroot; /* set temp = iroot ** nc */ + for (i = 1; i < nc; i++) + temp *= iroot; + } while (temp <= (long) max_colors); /* repeat till iroot exceeds root */ + iroot--; /* now iroot = floor(root) */ + + /* Must have at least 2 color values per component */ + if (iroot < 2) + ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, (int) temp); + + /* Initialize to iroot color values for each component */ + total_colors = 1; + for (i = 0; i < nc; i++) { + Ncolors[i] = iroot; + total_colors *= iroot; + } + /* We may be able to increment the count for one or more components without + * exceeding max_colors, though we know not all can be incremented. + * Sometimes, the first component can be incremented more than once! + * (Example: for 16 colors, we start at 2*2*2, go to 3*2*2, then 4*2*2.) + * In RGB colorspace, try to increment G first, then R, then B. + */ + do { + changed = FALSE; + for (i = 0; i < nc; i++) { + j = (cinfo->out_color_space == JCS_RGB ? RGB_order[i] : i); + /* calculate new total_colors if Ncolors[j] is incremented */ + temp = total_colors / Ncolors[j]; + temp *= Ncolors[j]+1; /* done in long arith to avoid oflo */ + if (temp > (long) max_colors) + break; /* won't fit, done with this pass */ + Ncolors[j]++; /* OK, apply the increment */ + total_colors = (int) temp; + changed = TRUE; + } + } while (changed); + + return total_colors; +} + + +LOCAL(int) +output_value (j_decompress_ptr cinfo, int ci, int j, int maxj) +/* Return j'th output value, where j will range from 0 to maxj */ +/* The output values must fall in 0..MAXJSAMPLE in increasing order */ +{ + /* We always provide values 0 and MAXJSAMPLE for each component; + * any additional values are equally spaced between these limits. + * (Forcing the upper and lower values to the limits ensures that + * dithering can't produce a color outside the selected gamut.) + */ + return (int) (((INT32) j * MAXJSAMPLE + maxj/2) / maxj); +} + + +LOCAL(int) +largest_input_value (j_decompress_ptr cinfo, int ci, int j, int maxj) +/* Return largest input value that should map to j'th output value */ +/* Must have largest(j=0) >= 0, and largest(j=maxj) >= MAXJSAMPLE */ +{ + /* Breakpoints are halfway between values returned by output_value */ + return (int) (((INT32) (2*j + 1) * MAXJSAMPLE + maxj) / (2*maxj)); +} + + +/* + * Create the colormap. + */ + +LOCAL(void) +create_colormap (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + JSAMPARRAY colormap; /* Created colormap */ + int total_colors; /* Number of distinct output colors */ + int i,j,k, nci, blksize, blkdist, ptr, val; + + /* Select number of colors for each component */ + total_colors = select_ncolors(cinfo, cquantize->Ncolors); + + /* Report selected color counts */ + if (cinfo->out_color_components == 3) + TRACEMS4(cinfo, 1, JTRC_QUANT_3_NCOLORS, + total_colors, cquantize->Ncolors[0], + cquantize->Ncolors[1], cquantize->Ncolors[2]); + else + TRACEMS1(cinfo, 1, JTRC_QUANT_NCOLORS, total_colors); + + /* Allocate and fill in the colormap. */ + /* The colors are ordered in the map in standard row-major order, */ + /* i.e. rightmost (highest-indexed) color changes most rapidly. */ + + colormap = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) total_colors, (JDIMENSION) cinfo->out_color_components); + + /* blksize is number of adjacent repeated entries for a component */ + /* blkdist is distance between groups of identical entries for a component */ + blkdist = total_colors; + + for (i = 0; i < cinfo->out_color_components; i++) { + /* fill in colormap entries for i'th color component */ + nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ + blksize = blkdist / nci; + for (j = 0; j < nci; j++) { + /* Compute j'th output value (out of nci) for component */ + val = output_value(cinfo, i, j, nci-1); + /* Fill in all colormap entries that have this value of this component */ + for (ptr = j * blksize; ptr < total_colors; ptr += blkdist) { + /* fill in blksize entries beginning at ptr */ + for (k = 0; k < blksize; k++) + colormap[i][ptr+k] = (JSAMPLE) val; + } + } + blkdist = blksize; /* blksize of this color is blkdist of next */ + } + + /* Save the colormap in private storage, + * where it will survive color quantization mode changes. + */ + cquantize->sv_colormap = colormap; + cquantize->sv_actual = total_colors; +} + + +/* + * Create the color index table. + */ + +LOCAL(void) +create_colorindex (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + JSAMPROW indexptr; + int i,j,k, nci, blksize, val, pad; + + /* For ordered dither, we pad the color index tables by MAXJSAMPLE in + * each direction (input index values can be -MAXJSAMPLE .. 2*MAXJSAMPLE). + * This is not necessary in the other dithering modes. However, we + * flag whether it was done in case user changes dithering mode. + */ + if (cinfo->dither_mode == JDITHER_ORDERED) { + pad = MAXJSAMPLE*2; + cquantize->is_padded = TRUE; + } else { + pad = 0; + cquantize->is_padded = FALSE; + } + + cquantize->colorindex = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (JDIMENSION) (MAXJSAMPLE+1 + pad), + (JDIMENSION) cinfo->out_color_components); + + /* blksize is number of adjacent repeated entries for a component */ + blksize = cquantize->sv_actual; + + for (i = 0; i < cinfo->out_color_components; i++) { + /* fill in colorindex entries for i'th color component */ + nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ + blksize = blksize / nci; + + /* adjust colorindex pointers to provide padding at negative indexes. */ + if (pad) + cquantize->colorindex[i] += MAXJSAMPLE; + + /* in loop, val = index of current output value, */ + /* and k = largest j that maps to current val */ + indexptr = cquantize->colorindex[i]; + val = 0; + k = largest_input_value(cinfo, i, 0, nci-1); + for (j = 0; j <= MAXJSAMPLE; j++) { + while (j > k) /* advance val if past boundary */ + k = largest_input_value(cinfo, i, ++val, nci-1); + /* premultiply so that no multiplication needed in main processing */ + indexptr[j] = (JSAMPLE) (val * blksize); + } + /* Pad at both ends if necessary */ + if (pad) + for (j = 1; j <= MAXJSAMPLE; j++) { + indexptr[-j] = indexptr[0]; + indexptr[MAXJSAMPLE+j] = indexptr[MAXJSAMPLE]; + } + } +} + + +/* + * Create an ordered-dither array for a component having ncolors + * distinct output values. + */ + +LOCAL(ODITHER_MATRIX_PTR) +make_odither_array (j_decompress_ptr cinfo, int ncolors) +{ + ODITHER_MATRIX_PTR odither; + int j,k; + INT32 num,den; + + odither = (ODITHER_MATRIX_PTR) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(ODITHER_MATRIX)); + /* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1). + * Hence the dither value for the matrix cell with fill order f + * (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1). + * On 16-bit-int machine, be careful to avoid overflow. + */ + den = 2 * ODITHER_CELLS * ((INT32) (ncolors - 1)); + for (j = 0; j < ODITHER_SIZE; j++) { + for (k = 0; k < ODITHER_SIZE; k++) { + num = ((INT32) (ODITHER_CELLS-1 - 2*((int)base_dither_matrix[j][k]))) + * MAXJSAMPLE; + /* Ensure round towards zero despite C's lack of consistency + * about rounding negative values in integer division... + */ + odither[j][k] = (int) (num<0 ? -((-num)/den) : num/den); + } + } + return odither; +} + + +/* + * Create the ordered-dither tables. + * Components having the same number of representative colors may + * share a dither table. + */ + +LOCAL(void) +create_odither_tables (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + ODITHER_MATRIX_PTR odither; + int i, j, nci; + + for (i = 0; i < cinfo->out_color_components; i++) { + nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ + odither = NULL; /* search for matching prior component */ + for (j = 0; j < i; j++) { + if (nci == cquantize->Ncolors[j]) { + odither = cquantize->odither[j]; + break; + } + } + if (odither == NULL) /* need a new table? */ + odither = make_odither_array(cinfo, nci); + cquantize->odither[i] = odither; + } +} + + +/* + * Map some rows of pixels to the output colormapped representation. + */ + +METHODDEF(void) +color_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* General case, no dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + JSAMPARRAY colorindex = cquantize->colorindex; + register int pixcode, ci; + register JSAMPROW ptrin, ptrout; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + register int nc = cinfo->out_color_components; + + for (row = 0; row < num_rows; row++) { + ptrin = input_buf[row]; + ptrout = output_buf[row]; + for (col = width; col > 0; col--) { + pixcode = 0; + for (ci = 0; ci < nc; ci++) { + pixcode += GETJSAMPLE(colorindex[ci][GETJSAMPLE(*ptrin++)]); + } + *ptrout++ = (JSAMPLE) pixcode; + } + } +} + + +METHODDEF(void) +color_quantize3 (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* Fast path for out_color_components==3, no dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register int pixcode; + register JSAMPROW ptrin, ptrout; + JSAMPROW colorindex0 = cquantize->colorindex[0]; + JSAMPROW colorindex1 = cquantize->colorindex[1]; + JSAMPROW colorindex2 = cquantize->colorindex[2]; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + ptrin = input_buf[row]; + ptrout = output_buf[row]; + for (col = width; col > 0; col--) { + pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*ptrin++)]); + pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*ptrin++)]); + pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*ptrin++)]); + *ptrout++ = (JSAMPLE) pixcode; + } + } +} + + +METHODDEF(void) +quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* General case, with ordered dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register JSAMPROW input_ptr; + register JSAMPROW output_ptr; + JSAMPROW colorindex_ci; + int * dither; /* points to active row of dither matrix */ + int row_index, col_index; /* current indexes into dither matrix */ + int nc = cinfo->out_color_components; + int ci; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + /* Initialize output values to 0 so can process components separately */ + jzero_far((void FAR *) output_buf[row], + (size_t) (width * SIZEOF(JSAMPLE))); + row_index = cquantize->row_index; + for (ci = 0; ci < nc; ci++) { + input_ptr = input_buf[row] + ci; + output_ptr = output_buf[row]; + colorindex_ci = cquantize->colorindex[ci]; + dither = cquantize->odither[ci][row_index]; + col_index = 0; + + for (col = width; col > 0; col--) { + /* Form pixel value + dither, range-limit to 0..MAXJSAMPLE, + * select output value, accumulate into output code for this pixel. + * Range-limiting need not be done explicitly, as we have extended + * the colorindex table to produce the right answers for out-of-range + * inputs. The maximum dither is +- MAXJSAMPLE; this sets the + * required amount of padding. + */ + *output_ptr += colorindex_ci[GETJSAMPLE(*input_ptr)+dither[col_index]]; + input_ptr += nc; + output_ptr++; + col_index = (col_index + 1) & ODITHER_MASK; + } + } + /* Advance row index for next row */ + row_index = (row_index + 1) & ODITHER_MASK; + cquantize->row_index = row_index; + } +} + + +METHODDEF(void) +quantize3_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* Fast path for out_color_components==3, with ordered dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register int pixcode; + register JSAMPROW input_ptr; + register JSAMPROW output_ptr; + JSAMPROW colorindex0 = cquantize->colorindex[0]; + JSAMPROW colorindex1 = cquantize->colorindex[1]; + JSAMPROW colorindex2 = cquantize->colorindex[2]; + int * dither0; /* points to active row of dither matrix */ + int * dither1; + int * dither2; + int row_index, col_index; /* current indexes into dither matrix */ + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + row_index = cquantize->row_index; + input_ptr = input_buf[row]; + output_ptr = output_buf[row]; + dither0 = cquantize->odither[0][row_index]; + dither1 = cquantize->odither[1][row_index]; + dither2 = cquantize->odither[2][row_index]; + col_index = 0; + + for (col = width; col > 0; col--) { + pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*input_ptr++) + + dither0[col_index]]); + pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*input_ptr++) + + dither1[col_index]]); + pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*input_ptr++) + + dither2[col_index]]); + *output_ptr++ = (JSAMPLE) pixcode; + col_index = (col_index + 1) & ODITHER_MASK; + } + row_index = (row_index + 1) & ODITHER_MASK; + cquantize->row_index = row_index; + } +} + + +METHODDEF(void) +quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, + JSAMPARRAY output_buf, int num_rows) +/* General case, with Floyd-Steinberg dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + register LOCFSERROR cur; /* current error or pixel value */ + LOCFSERROR belowerr; /* error for pixel below cur */ + LOCFSERROR bpreverr; /* error for below/prev col */ + LOCFSERROR bnexterr; /* error for below/next col */ + LOCFSERROR delta; + register FSERRPTR errorptr; /* => fserrors[] at column before current */ + register JSAMPROW input_ptr; + register JSAMPROW output_ptr; + JSAMPROW colorindex_ci; + JSAMPROW colormap_ci; + int pixcode; + int nc = cinfo->out_color_components; + int dir; /* 1 for left-to-right, -1 for right-to-left */ + int dirnc; /* dir * nc */ + int ci; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + JSAMPLE *range_limit = cinfo->sample_range_limit; + SHIFT_TEMPS + + for (row = 0; row < num_rows; row++) { + /* Initialize output values to 0 so can process components separately */ + jzero_far((void FAR *) output_buf[row], + (size_t) (width * SIZEOF(JSAMPLE))); + for (ci = 0; ci < nc; ci++) { + input_ptr = input_buf[row] + ci; + output_ptr = output_buf[row]; + if (cquantize->on_odd_row) { + /* work right to left in this row */ + input_ptr += (width-1) * nc; /* so point to rightmost pixel */ + output_ptr += width-1; + dir = -1; + dirnc = -nc; + errorptr = cquantize->fserrors[ci] + (width+1); /* => entry after last column */ + } else { + /* work left to right in this row */ + dir = 1; + dirnc = nc; + errorptr = cquantize->fserrors[ci]; /* => entry before first column */ + } + colorindex_ci = cquantize->colorindex[ci]; + colormap_ci = cquantize->sv_colormap[ci]; + /* Preset error values: no error propagated to first pixel from left */ + cur = 0; + /* and no error propagated to row below yet */ + belowerr = bpreverr = 0; + + for (col = width; col > 0; col--) { + /* cur holds the error propagated from the previous pixel on the + * current line. Add the error propagated from the previous line + * to form the complete error correction term for this pixel, and + * round the error term (which is expressed * 16) to an integer. + * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct + * for either sign of the error value. + * Note: errorptr points to *previous* column's array entry. + */ + cur = RIGHT_SHIFT(cur + errorptr[dir] + 8, 4); + /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE. + * The maximum error is +- MAXJSAMPLE; this sets the required size + * of the range_limit array. + */ + cur += GETJSAMPLE(*input_ptr); + cur = GETJSAMPLE(range_limit[cur]); + /* Select output value, accumulate into output code for this pixel */ + pixcode = GETJSAMPLE(colorindex_ci[cur]); + *output_ptr += (JSAMPLE) pixcode; + /* Compute actual representation error at this pixel */ + /* Note: we can do this even though we don't have the final */ + /* pixel code, because the colormap is orthogonal. */ + cur -= GETJSAMPLE(colormap_ci[pixcode]); + /* Compute error fractions to be propagated to adjacent pixels. + * Add these into the running sums, and simultaneously shift the + * next-line error sums left by 1 column. + */ + bnexterr = cur; + delta = cur * 2; + cur += delta; /* form error * 3 */ + errorptr[0] = (FSERROR) (bpreverr + cur); + cur += delta; /* form error * 5 */ + bpreverr = belowerr + cur; + belowerr = bnexterr; + cur += delta; /* form error * 7 */ + /* At this point cur contains the 7/16 error value to be propagated + * to the next pixel on the current line, and all the errors for the + * next line have been shifted over. We are therefore ready to move on. + */ + input_ptr += dirnc; /* advance input ptr to next column */ + output_ptr += dir; /* advance output ptr to next column */ + errorptr += dir; /* advance errorptr to current column */ + } + /* Post-loop cleanup: we must unload the final error value into the + * final fserrors[] entry. Note we need not unload belowerr because + * it is for the dummy column before or after the actual array. + */ + errorptr[0] = (FSERROR) bpreverr; /* unload prev err into array */ + } + cquantize->on_odd_row = (cquantize->on_odd_row ? FALSE : TRUE); + } +} + + +/* + * Allocate workspace for Floyd-Steinberg errors. + */ + +LOCAL(void) +alloc_fs_workspace (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + size_t arraysize; + int i; + + arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); + for (i = 0; i < cinfo->out_color_components; i++) { + cquantize->fserrors[i] = (FSERRPTR) + (*cinfo->mem->alloc_large)((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); + } +} + + +/* + * Initialize for one-pass color quantization. + */ + +METHODDEF(void) +start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + size_t arraysize; + int i; + + /* Install my colormap. */ + cinfo->colormap = cquantize->sv_colormap; + cinfo->actual_number_of_colors = cquantize->sv_actual; + + /* Initialize for desired dithering mode. */ + switch (cinfo->dither_mode) { + case JDITHER_NONE: + if (cinfo->out_color_components == 3) + cquantize->pub.color_quantize = color_quantize3; + else + cquantize->pub.color_quantize = color_quantize; + break; + case JDITHER_ORDERED: + if (cinfo->out_color_components == 3) + cquantize->pub.color_quantize = quantize3_ord_dither; + else + cquantize->pub.color_quantize = quantize_ord_dither; + cquantize->row_index = 0; /* initialize state for ordered dither */ + /* If user changed to ordered dither from another mode, + * we must recreate the color index table with padding. + * This will cost extra space, but probably isn't very likely. + */ + if (! cquantize->is_padded) + create_colorindex(cinfo); + /* Create ordered-dither tables if we didn't already. */ + if (cquantize->odither[0] == NULL) + create_odither_tables(cinfo); + break; + case JDITHER_FS: + cquantize->pub.color_quantize = quantize_fs_dither; + cquantize->on_odd_row = FALSE; /* initialize state for F-S dither */ + /* Allocate Floyd-Steinberg workspace if didn't already. */ + if (cquantize->fserrors[0] == NULL) + alloc_fs_workspace(cinfo); + /* Initialize the propagated errors to zero. */ + arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); + for (i = 0; i < cinfo->out_color_components; i++) + jzero_far((void FAR *) cquantize->fserrors[i], arraysize); + break; + default: + ERREXIT(cinfo, JERR_NOT_COMPILED); + break; + } +} + + +/* + * Finish up at the end of the pass. + */ + +METHODDEF(void) +finish_pass_1_quant (j_decompress_ptr cinfo) +{ + /* no work in 1-pass case */ +} + + +/* + * Switch to a new external colormap between output passes. + * Shouldn't get to this module! + */ + +METHODDEF(void) +new_color_map_1_quant (j_decompress_ptr cinfo) +{ + ERREXIT(cinfo, JERR_MODE_CHANGE); +} + + +/* + * Module initialization routine for 1-pass color quantization. + */ + +GLOBAL(void) +jinit_1pass_quantizer (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize; + + cquantize = (my_cquantize_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_cquantizer)); + cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; + cquantize->pub.start_pass = start_pass_1_quant; + cquantize->pub.finish_pass = finish_pass_1_quant; + cquantize->pub.new_color_map = new_color_map_1_quant; + cquantize->fserrors[0] = NULL; /* Flag FS workspace not allocated */ + cquantize->odither[0] = NULL; /* Also flag odither arrays not allocated */ + + /* Make sure my internal arrays won't overflow */ + if (cinfo->out_color_components > MAX_Q_COMPS) + ERREXIT1(cinfo, JERR_QUANT_COMPONENTS, MAX_Q_COMPS); + /* Make sure colormap indexes can be represented by JSAMPLEs */ + if (cinfo->desired_number_of_colors > (MAXJSAMPLE+1)) + ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXJSAMPLE+1); + + /* Create the colormap and color index table. */ + create_colormap(cinfo); + create_colorindex(cinfo); + + /* Allocate Floyd-Steinberg workspace now if requested. + * We do this now since it is FAR storage and may affect the memory + * manager's space calculations. If the user changes to FS dither + * mode in a later pass, we will allocate the space then, and will + * possibly overrun the max_memory_to_use setting. + */ + if (cinfo->dither_mode == JDITHER_FS) + alloc_fs_workspace(cinfo); +} + +#endif /* QUANT_1PASS_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jquant2.c b/third_party/windows/fltk-1.1.10/jpeg/jquant2.c new file mode 100644 index 0000000..87a3920 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jquant2.c @@ -0,0 +1,1310 @@ +/* + * jquant2.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains 2-pass color quantization (color mapping) routines. + * These routines provide selection of a custom color map for an image, + * followed by mapping of the image to that color map, with optional + * Floyd-Steinberg dithering. + * It is also possible to use just the second pass to map to an arbitrary + * externally-given color map. + * + * Note: ordered dithering is not supported, since there isn't any fast + * way to compute intercolor distances; it's unclear that ordered dither's + * fundamental assumptions even hold with an irregularly spaced color map. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + +#ifdef QUANT_2PASS_SUPPORTED + + +/* + * This module implements the well-known Heckbert paradigm for color + * quantization. Most of the ideas used here can be traced back to + * Heckbert's seminal paper + * Heckbert, Paul. "Color Image Quantization for Frame Buffer Display", + * Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304. + * + * In the first pass over the image, we accumulate a histogram showing the + * usage count of each possible color. To keep the histogram to a reasonable + * size, we reduce the precision of the input; typical practice is to retain + * 5 or 6 bits per color, so that 8 or 4 different input values are counted + * in the same histogram cell. + * + * Next, the color-selection step begins with a box representing the whole + * color space, and repeatedly splits the "largest" remaining box until we + * have as many boxes as desired colors. Then the mean color in each + * remaining box becomes one of the possible output colors. + * + * The second pass over the image maps each input pixel to the closest output + * color (optionally after applying a Floyd-Steinberg dithering correction). + * This mapping is logically trivial, but making it go fast enough requires + * considerable care. + * + * Heckbert-style quantizers vary a good deal in their policies for choosing + * the "largest" box and deciding where to cut it. The particular policies + * used here have proved out well in experimental comparisons, but better ones + * may yet be found. + * + * In earlier versions of the IJG code, this module quantized in YCbCr color + * space, processing the raw upsampled data without a color conversion step. + * This allowed the color conversion math to be done only once per colormap + * entry, not once per pixel. However, that optimization precluded other + * useful optimizations (such as merging color conversion with upsampling) + * and it also interfered with desired capabilities such as quantizing to an + * externally-supplied colormap. We have therefore abandoned that approach. + * The present code works in the post-conversion color space, typically RGB. + * + * To improve the visual quality of the results, we actually work in scaled + * RGB space, giving G distances more weight than R, and R in turn more than + * B. To do everything in integer math, we must use integer scale factors. + * The 2/3/1 scale factors used here correspond loosely to the relative + * weights of the colors in the NTSC grayscale equation. + * If you want to use this code to quantize a non-RGB color space, you'll + * probably need to change these scale factors. + */ + +#define R_SCALE 2 /* scale R distances by this much */ +#define G_SCALE 3 /* scale G distances by this much */ +#define B_SCALE 1 /* and B by this much */ + +/* Relabel R/G/B as components 0/1/2, respecting the RGB ordering defined + * in jmorecfg.h. As the code stands, it will do the right thing for R,G,B + * and B,G,R orders. If you define some other weird order in jmorecfg.h, + * you'll get compile errors until you extend this logic. In that case + * you'll probably want to tweak the histogram sizes too. + */ + +#if RGB_RED == 0 +#define C0_SCALE R_SCALE +#endif +#if RGB_BLUE == 0 +#define C0_SCALE B_SCALE +#endif +#if RGB_GREEN == 1 +#define C1_SCALE G_SCALE +#endif +#if RGB_RED == 2 +#define C2_SCALE R_SCALE +#endif +#if RGB_BLUE == 2 +#define C2_SCALE B_SCALE +#endif + + +/* + * First we have the histogram data structure and routines for creating it. + * + * The number of bits of precision can be adjusted by changing these symbols. + * We recommend keeping 6 bits for G and 5 each for R and B. + * If you have plenty of memory and cycles, 6 bits all around gives marginally + * better results; if you are short of memory, 5 bits all around will save + * some space but degrade the results. + * To maintain a fully accurate histogram, we'd need to allocate a "long" + * (preferably unsigned long) for each cell. In practice this is overkill; + * we can get by with 16 bits per cell. Few of the cell counts will overflow, + * and clamping those that do overflow to the maximum value will give close- + * enough results. This reduces the recommended histogram size from 256Kb + * to 128Kb, which is a useful savings on PC-class machines. + * (In the second pass the histogram space is re-used for pixel mapping data; + * in that capacity, each cell must be able to store zero to the number of + * desired colors. 16 bits/cell is plenty for that too.) + * Since the JPEG code is intended to run in small memory model on 80x86 + * machines, we can't just allocate the histogram in one chunk. Instead + * of a true 3-D array, we use a row of pointers to 2-D arrays. Each + * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and + * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries. Note that + * on 80x86 machines, the pointer row is in near memory but the actual + * arrays are in far memory (same arrangement as we use for image arrays). + */ + +#define MAXNUMCOLORS (MAXJSAMPLE+1) /* maximum size of colormap */ + +/* These will do the right thing for either R,G,B or B,G,R color order, + * but you may not like the results for other color orders. + */ +#define HIST_C0_BITS 5 /* bits of precision in R/B histogram */ +#define HIST_C1_BITS 6 /* bits of precision in G histogram */ +#define HIST_C2_BITS 5 /* bits of precision in B/R histogram */ + +/* Number of elements along histogram axes. */ +#define HIST_C0_ELEMS (1<cquantize; + register JSAMPROW ptr; + register histptr histp; + register hist3d histogram = cquantize->histogram; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + ptr = input_buf[row]; + for (col = width; col > 0; col--) { + /* get pixel value and index into the histogram */ + histp = & histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT] + [GETJSAMPLE(ptr[1]) >> C1_SHIFT] + [GETJSAMPLE(ptr[2]) >> C2_SHIFT]; + /* increment, check for overflow and undo increment if so. */ + if (++(*histp) <= 0) + (*histp)--; + ptr += 3; + } + } +} + + +/* + * Next we have the really interesting routines: selection of a colormap + * given the completed histogram. + * These routines work with a list of "boxes", each representing a rectangular + * subset of the input color space (to histogram precision). + */ + +typedef struct { + /* The bounds of the box (inclusive); expressed as histogram indexes */ + int c0min, c0max; + int c1min, c1max; + int c2min, c2max; + /* The volume (actually 2-norm) of the box */ + INT32 volume; + /* The number of nonzero histogram cells within this box */ + long colorcount; +} box; + +typedef box * boxptr; + + +LOCAL(boxptr) +find_biggest_color_pop (boxptr boxlist, int numboxes) +/* Find the splittable box with the largest color population */ +/* Returns NULL if no splittable boxes remain */ +{ + register boxptr boxp; + register int i; + register long maxc = 0; + boxptr which = NULL; + + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->colorcount > maxc && boxp->volume > 0) { + which = boxp; + maxc = boxp->colorcount; + } + } + return which; +} + + +LOCAL(boxptr) +find_biggest_volume (boxptr boxlist, int numboxes) +/* Find the splittable box with the largest (scaled) volume */ +/* Returns NULL if no splittable boxes remain */ +{ + register boxptr boxp; + register int i; + register INT32 maxv = 0; + boxptr which = NULL; + + for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { + if (boxp->volume > maxv) { + which = boxp; + maxv = boxp->volume; + } + } + return which; +} + + +LOCAL(void) +update_box (j_decompress_ptr cinfo, boxptr boxp) +/* Shrink the min/max bounds of a box to enclose only nonzero elements, */ +/* and recompute its volume and population */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + histptr histp; + int c0,c1,c2; + int c0min,c0max,c1min,c1max,c2min,c2max; + INT32 dist0,dist1,dist2; + long ccount; + + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; + + if (c0max > c0min) + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c0min = c0min = c0; + goto have_c0min; + } + } + have_c0min: + if (c0max > c0min) + for (c0 = c0max; c0 >= c0min; c0--) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c0max = c0max = c0; + goto have_c0max; + } + } + have_c0max: + if (c1max > c1min) + for (c1 = c1min; c1 <= c1max; c1++) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c1min = c1min = c1; + goto have_c1min; + } + } + have_c1min: + if (c1max > c1min) + for (c1 = c1max; c1 >= c1min; c1--) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) + if (*histp++ != 0) { + boxp->c1max = c1max = c1; + goto have_c1max; + } + } + have_c1max: + if (c2max > c2min) + for (c2 = c2min; c2 <= c2max; c2++) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1min][c2]; + for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) + if (*histp != 0) { + boxp->c2min = c2min = c2; + goto have_c2min; + } + } + have_c2min: + if (c2max > c2min) + for (c2 = c2max; c2 >= c2min; c2--) + for (c0 = c0min; c0 <= c0max; c0++) { + histp = & histogram[c0][c1min][c2]; + for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) + if (*histp != 0) { + boxp->c2max = c2max = c2; + goto have_c2max; + } + } + have_c2max: + + /* Update box volume. + * We use 2-norm rather than real volume here; this biases the method + * against making long narrow boxes, and it has the side benefit that + * a box is splittable iff norm > 0. + * Since the differences are expressed in histogram-cell units, + * we have to shift back to JSAMPLE units to get consistent distances; + * after which, we scale according to the selected distance scale factors. + */ + dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE; + dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE; + dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE; + boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2; + + /* Now scan remaining volume of box and compute population */ + ccount = 0; + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++, histp++) + if (*histp != 0) { + ccount++; + } + } + boxp->colorcount = ccount; +} + + +LOCAL(int) +median_cut (j_decompress_ptr cinfo, boxptr boxlist, int numboxes, + int desired_colors) +/* Repeatedly select and split the largest box until we have enough boxes */ +{ + int n,lb; + int c0,c1,c2,cmax; + register boxptr b1,b2; + + while (numboxes < desired_colors) { + /* Select box to split. + * Current algorithm: by population for first half, then by volume. + */ + if (numboxes*2 <= desired_colors) { + b1 = find_biggest_color_pop(boxlist, numboxes); + } else { + b1 = find_biggest_volume(boxlist, numboxes); + } + if (b1 == NULL) /* no splittable boxes left! */ + break; + b2 = &boxlist[numboxes]; /* where new box will go */ + /* Copy the color bounds to the new box. */ + b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max; + b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min; + /* Choose which axis to split the box on. + * Current algorithm: longest scaled axis. + * See notes in update_box about scaling distances. + */ + c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE; + c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE; + c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE; + /* We want to break any ties in favor of green, then red, blue last. + * This code does the right thing for R,G,B or B,G,R color orders only. + */ +#if RGB_RED == 0 + cmax = c1; n = 1; + if (c0 > cmax) { cmax = c0; n = 0; } + if (c2 > cmax) { n = 2; } +#else + cmax = c1; n = 1; + if (c2 > cmax) { cmax = c2; n = 2; } + if (c0 > cmax) { n = 0; } +#endif + /* Choose split point along selected axis, and update box bounds. + * Current algorithm: split at halfway point. + * (Since the box has been shrunk to minimum volume, + * any split will produce two nonempty subboxes.) + * Note that lb value is max for lower box, so must be < old max. + */ + switch (n) { + case 0: + lb = (b1->c0max + b1->c0min) / 2; + b1->c0max = lb; + b2->c0min = lb+1; + break; + case 1: + lb = (b1->c1max + b1->c1min) / 2; + b1->c1max = lb; + b2->c1min = lb+1; + break; + case 2: + lb = (b1->c2max + b1->c2min) / 2; + b1->c2max = lb; + b2->c2min = lb+1; + break; + } + /* Update stats for boxes */ + update_box(cinfo, b1); + update_box(cinfo, b2); + numboxes++; + } + return numboxes; +} + + +LOCAL(void) +compute_color (j_decompress_ptr cinfo, boxptr boxp, int icolor) +/* Compute representative color for a box, put it in colormap[icolor] */ +{ + /* Current algorithm: mean weighted by pixels (not colors) */ + /* Note it is important to get the rounding correct! */ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + histptr histp; + int c0,c1,c2; + int c0min,c0max,c1min,c1max,c2min,c2max; + long count; + long total = 0; + long c0total = 0; + long c1total = 0; + long c2total = 0; + + c0min = boxp->c0min; c0max = boxp->c0max; + c1min = boxp->c1min; c1max = boxp->c1max; + c2min = boxp->c2min; c2max = boxp->c2max; + + for (c0 = c0min; c0 <= c0max; c0++) + for (c1 = c1min; c1 <= c1max; c1++) { + histp = & histogram[c0][c1][c2min]; + for (c2 = c2min; c2 <= c2max; c2++) { + if ((count = *histp++) != 0) { + total += count; + c0total += ((c0 << C0_SHIFT) + ((1<>1)) * count; + c1total += ((c1 << C1_SHIFT) + ((1<>1)) * count; + c2total += ((c2 << C2_SHIFT) + ((1<>1)) * count; + } + } + } + + cinfo->colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total); + cinfo->colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total); + cinfo->colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total); +} + + +LOCAL(void) +select_colors (j_decompress_ptr cinfo, int desired_colors) +/* Master routine for color selection */ +{ + boxptr boxlist; + int numboxes; + int i; + + /* Allocate workspace for box list */ + boxlist = (boxptr) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, desired_colors * SIZEOF(box)); + /* Initialize one box containing whole space */ + numboxes = 1; + boxlist[0].c0min = 0; + boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT; + boxlist[0].c1min = 0; + boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT; + boxlist[0].c2min = 0; + boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT; + /* Shrink it to actually-used volume and set its statistics */ + update_box(cinfo, & boxlist[0]); + /* Perform median-cut to produce final box list */ + numboxes = median_cut(cinfo, boxlist, numboxes, desired_colors); + /* Compute the representative color for each box, fill colormap */ + for (i = 0; i < numboxes; i++) + compute_color(cinfo, & boxlist[i], i); + cinfo->actual_number_of_colors = numboxes; + TRACEMS1(cinfo, 1, JTRC_QUANT_SELECTED, numboxes); +} + + +/* + * These routines are concerned with the time-critical task of mapping input + * colors to the nearest color in the selected colormap. + * + * We re-use the histogram space as an "inverse color map", essentially a + * cache for the results of nearest-color searches. All colors within a + * histogram cell will be mapped to the same colormap entry, namely the one + * closest to the cell's center. This may not be quite the closest entry to + * the actual input color, but it's almost as good. A zero in the cache + * indicates we haven't found the nearest color for that cell yet; the array + * is cleared to zeroes before starting the mapping pass. When we find the + * nearest color for a cell, its colormap index plus one is recorded in the + * cache for future use. The pass2 scanning routines call fill_inverse_cmap + * when they need to use an unfilled entry in the cache. + * + * Our method of efficiently finding nearest colors is based on the "locally + * sorted search" idea described by Heckbert and on the incremental distance + * calculation described by Spencer W. Thomas in chapter III.1 of Graphics + * Gems II (James Arvo, ed. Academic Press, 1991). Thomas points out that + * the distances from a given colormap entry to each cell of the histogram can + * be computed quickly using an incremental method: the differences between + * distances to adjacent cells themselves differ by a constant. This allows a + * fairly fast implementation of the "brute force" approach of computing the + * distance from every colormap entry to every histogram cell. Unfortunately, + * it needs a work array to hold the best-distance-so-far for each histogram + * cell (because the inner loop has to be over cells, not colormap entries). + * The work array elements have to be INT32s, so the work array would need + * 256Kb at our recommended precision. This is not feasible in DOS machines. + * + * To get around these problems, we apply Thomas' method to compute the + * nearest colors for only the cells within a small subbox of the histogram. + * The work array need be only as big as the subbox, so the memory usage + * problem is solved. Furthermore, we need not fill subboxes that are never + * referenced in pass2; many images use only part of the color gamut, so a + * fair amount of work is saved. An additional advantage of this + * approach is that we can apply Heckbert's locality criterion to quickly + * eliminate colormap entries that are far away from the subbox; typically + * three-fourths of the colormap entries are rejected by Heckbert's criterion, + * and we need not compute their distances to individual cells in the subbox. + * The speed of this approach is heavily influenced by the subbox size: too + * small means too much overhead, too big loses because Heckbert's criterion + * can't eliminate as many colormap entries. Empirically the best subbox + * size seems to be about 1/512th of the histogram (1/8th in each direction). + * + * Thomas' article also describes a refined method which is asymptotically + * faster than the brute-force method, but it is also far more complex and + * cannot efficiently be applied to small subboxes. It is therefore not + * useful for programs intended to be portable to DOS machines. On machines + * with plenty of memory, filling the whole histogram in one shot with Thomas' + * refined method might be faster than the present code --- but then again, + * it might not be any faster, and it's certainly more complicated. + */ + + +/* log2(histogram cells in update box) for each axis; this can be adjusted */ +#define BOX_C0_LOG (HIST_C0_BITS-3) +#define BOX_C1_LOG (HIST_C1_BITS-3) +#define BOX_C2_LOG (HIST_C2_BITS-3) + +#define BOX_C0_ELEMS (1<actual_number_of_colors; + int maxc0, maxc1, maxc2; + int centerc0, centerc1, centerc2; + int i, x, ncolors; + INT32 minmaxdist, min_dist, max_dist, tdist; + INT32 mindist[MAXNUMCOLORS]; /* min distance to colormap entry i */ + + /* Compute true coordinates of update box's upper corner and center. + * Actually we compute the coordinates of the center of the upper-corner + * histogram cell, which are the upper bounds of the volume we care about. + * Note that since ">>" rounds down, the "center" values may be closer to + * min than to max; hence comparisons to them must be "<=", not "<". + */ + maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT)); + centerc0 = (minc0 + maxc0) >> 1; + maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT)); + centerc1 = (minc1 + maxc1) >> 1; + maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT)); + centerc2 = (minc2 + maxc2) >> 1; + + /* For each color in colormap, find: + * 1. its minimum squared-distance to any point in the update box + * (zero if color is within update box); + * 2. its maximum squared-distance to any point in the update box. + * Both of these can be found by considering only the corners of the box. + * We save the minimum distance for each color in mindist[]; + * only the smallest maximum distance is of interest. + */ + minmaxdist = 0x7FFFFFFFL; + + for (i = 0; i < numcolors; i++) { + /* We compute the squared-c0-distance term, then add in the other two. */ + x = GETJSAMPLE(cinfo->colormap[0][i]); + if (x < minc0) { + tdist = (x - minc0) * C0_SCALE; + min_dist = tdist*tdist; + tdist = (x - maxc0) * C0_SCALE; + max_dist = tdist*tdist; + } else if (x > maxc0) { + tdist = (x - maxc0) * C0_SCALE; + min_dist = tdist*tdist; + tdist = (x - minc0) * C0_SCALE; + max_dist = tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + min_dist = 0; + if (x <= centerc0) { + tdist = (x - maxc0) * C0_SCALE; + max_dist = tdist*tdist; + } else { + tdist = (x - minc0) * C0_SCALE; + max_dist = tdist*tdist; + } + } + + x = GETJSAMPLE(cinfo->colormap[1][i]); + if (x < minc1) { + tdist = (x - minc1) * C1_SCALE; + min_dist += tdist*tdist; + tdist = (x - maxc1) * C1_SCALE; + max_dist += tdist*tdist; + } else if (x > maxc1) { + tdist = (x - maxc1) * C1_SCALE; + min_dist += tdist*tdist; + tdist = (x - minc1) * C1_SCALE; + max_dist += tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + if (x <= centerc1) { + tdist = (x - maxc1) * C1_SCALE; + max_dist += tdist*tdist; + } else { + tdist = (x - minc1) * C1_SCALE; + max_dist += tdist*tdist; + } + } + + x = GETJSAMPLE(cinfo->colormap[2][i]); + if (x < minc2) { + tdist = (x - minc2) * C2_SCALE; + min_dist += tdist*tdist; + tdist = (x - maxc2) * C2_SCALE; + max_dist += tdist*tdist; + } else if (x > maxc2) { + tdist = (x - maxc2) * C2_SCALE; + min_dist += tdist*tdist; + tdist = (x - minc2) * C2_SCALE; + max_dist += tdist*tdist; + } else { + /* within cell range so no contribution to min_dist */ + if (x <= centerc2) { + tdist = (x - maxc2) * C2_SCALE; + max_dist += tdist*tdist; + } else { + tdist = (x - minc2) * C2_SCALE; + max_dist += tdist*tdist; + } + } + + mindist[i] = min_dist; /* save away the results */ + if (max_dist < minmaxdist) + minmaxdist = max_dist; + } + + /* Now we know that no cell in the update box is more than minmaxdist + * away from some colormap entry. Therefore, only colors that are + * within minmaxdist of some part of the box need be considered. + */ + ncolors = 0; + for (i = 0; i < numcolors; i++) { + if (mindist[i] <= minmaxdist) + colorlist[ncolors++] = (JSAMPLE) i; + } + return ncolors; +} + + +LOCAL(void) +find_best_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2, + int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[]) +/* Find the closest colormap entry for each cell in the update box, + * given the list of candidate colors prepared by find_nearby_colors. + * Return the indexes of the closest entries in the bestcolor[] array. + * This routine uses Thomas' incremental distance calculation method to + * find the distance from a colormap entry to successive cells in the box. + */ +{ + int ic0, ic1, ic2; + int i, icolor; + register INT32 * bptr; /* pointer into bestdist[] array */ + JSAMPLE * cptr; /* pointer into bestcolor[] array */ + INT32 dist0, dist1; /* initial distance values */ + register INT32 dist2; /* current distance in inner loop */ + INT32 xx0, xx1; /* distance increments */ + register INT32 xx2; + INT32 inc0, inc1, inc2; /* initial values for increments */ + /* This array holds the distance to the nearest-so-far color for each cell */ + INT32 bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; + + /* Initialize best-distance for each cell of the update box */ + bptr = bestdist; + for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--) + *bptr++ = 0x7FFFFFFFL; + + /* For each color selected by find_nearby_colors, + * compute its distance to the center of each cell in the box. + * If that's less than best-so-far, update best distance and color number. + */ + + /* Nominal steps between cell centers ("x" in Thomas article) */ +#define STEP_C0 ((1 << C0_SHIFT) * C0_SCALE) +#define STEP_C1 ((1 << C1_SHIFT) * C1_SCALE) +#define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE) + + for (i = 0; i < numcolors; i++) { + icolor = GETJSAMPLE(colorlist[i]); + /* Compute (square of) distance from minc0/c1/c2 to this color */ + inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE; + dist0 = inc0*inc0; + inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE; + dist0 += inc1*inc1; + inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE; + dist0 += inc2*inc2; + /* Form the initial difference increments */ + inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0; + inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1; + inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2; + /* Now loop over all cells in box, updating distance per Thomas method */ + bptr = bestdist; + cptr = bestcolor; + xx0 = inc0; + for (ic0 = BOX_C0_ELEMS-1; ic0 >= 0; ic0--) { + dist1 = dist0; + xx1 = inc1; + for (ic1 = BOX_C1_ELEMS-1; ic1 >= 0; ic1--) { + dist2 = dist1; + xx2 = inc2; + for (ic2 = BOX_C2_ELEMS-1; ic2 >= 0; ic2--) { + if (dist2 < *bptr) { + *bptr = dist2; + *cptr = (JSAMPLE) icolor; + } + dist2 += xx2; + xx2 += 2 * STEP_C2 * STEP_C2; + bptr++; + cptr++; + } + dist1 += xx1; + xx1 += 2 * STEP_C1 * STEP_C1; + } + dist0 += xx0; + xx0 += 2 * STEP_C0 * STEP_C0; + } + } +} + + +LOCAL(void) +fill_inverse_cmap (j_decompress_ptr cinfo, int c0, int c1, int c2) +/* Fill the inverse-colormap entries in the update box that contains */ +/* histogram cell c0/c1/c2. (Only that one cell MUST be filled, but */ +/* we can fill as many others as we wish.) */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + int minc0, minc1, minc2; /* lower left corner of update box */ + int ic0, ic1, ic2; + register JSAMPLE * cptr; /* pointer into bestcolor[] array */ + register histptr cachep; /* pointer into main cache array */ + /* This array lists the candidate colormap indexes. */ + JSAMPLE colorlist[MAXNUMCOLORS]; + int numcolors; /* number of candidate colors */ + /* This array holds the actually closest colormap index for each cell. */ + JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; + + /* Convert cell coordinates to update box ID */ + c0 >>= BOX_C0_LOG; + c1 >>= BOX_C1_LOG; + c2 >>= BOX_C2_LOG; + + /* Compute true coordinates of update box's origin corner. + * Actually we compute the coordinates of the center of the corner + * histogram cell, which are the lower bounds of the volume we care about. + */ + minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1); + minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1); + minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1); + + /* Determine which colormap entries are close enough to be candidates + * for the nearest entry to some cell in the update box. + */ + numcolors = find_nearby_colors(cinfo, minc0, minc1, minc2, colorlist); + + /* Determine the actually nearest colors. */ + find_best_colors(cinfo, minc0, minc1, minc2, numcolors, colorlist, + bestcolor); + + /* Save the best color numbers (plus 1) in the main cache array */ + c0 <<= BOX_C0_LOG; /* convert ID back to base cell indexes */ + c1 <<= BOX_C1_LOG; + c2 <<= BOX_C2_LOG; + cptr = bestcolor; + for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) { + for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) { + cachep = & histogram[c0+ic0][c1+ic1][c2]; + for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) { + *cachep++ = (histcell) (GETJSAMPLE(*cptr++) + 1); + } + } + } +} + + +/* + * Map some rows of pixels to the output colormapped representation. + */ + +METHODDEF(void) +pass2_no_dither (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) +/* This version performs no dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + register JSAMPROW inptr, outptr; + register histptr cachep; + register int c0, c1, c2; + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + + for (row = 0; row < num_rows; row++) { + inptr = input_buf[row]; + outptr = output_buf[row]; + for (col = width; col > 0; col--) { + /* get pixel value and index into the cache */ + c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT; + c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT; + c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT; + cachep = & histogram[c0][c1][c2]; + /* If we have not seen this color before, find nearest colormap entry */ + /* and update the cache */ + if (*cachep == 0) + fill_inverse_cmap(cinfo, c0,c1,c2); + /* Now emit the colormap index for this cell */ + *outptr++ = (JSAMPLE) (*cachep - 1); + } + } +} + + +METHODDEF(void) +pass2_fs_dither (j_decompress_ptr cinfo, + JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) +/* This version performs Floyd-Steinberg dithering */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + register LOCFSERROR cur0, cur1, cur2; /* current error or pixel value */ + LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */ + LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */ + register FSERRPTR errorptr; /* => fserrors[] at column before current */ + JSAMPROW inptr; /* => current input pixel */ + JSAMPROW outptr; /* => current output pixel */ + histptr cachep; + int dir; /* +1 or -1 depending on direction */ + int dir3; /* 3*dir, for advancing inptr & errorptr */ + int row; + JDIMENSION col; + JDIMENSION width = cinfo->output_width; + JSAMPLE *range_limit = cinfo->sample_range_limit; + int *error_limit = cquantize->error_limiter; + JSAMPROW colormap0 = cinfo->colormap[0]; + JSAMPROW colormap1 = cinfo->colormap[1]; + JSAMPROW colormap2 = cinfo->colormap[2]; + SHIFT_TEMPS + + for (row = 0; row < num_rows; row++) { + inptr = input_buf[row]; + outptr = output_buf[row]; + if (cquantize->on_odd_row) { + /* work right to left in this row */ + inptr += (width-1) * 3; /* so point to rightmost pixel */ + outptr += width-1; + dir = -1; + dir3 = -3; + errorptr = cquantize->fserrors + (width+1)*3; /* => entry after last column */ + cquantize->on_odd_row = FALSE; /* flip for next time */ + } else { + /* work left to right in this row */ + dir = 1; + dir3 = 3; + errorptr = cquantize->fserrors; /* => entry before first real column */ + cquantize->on_odd_row = TRUE; /* flip for next time */ + } + /* Preset error values: no error propagated to first pixel from left */ + cur0 = cur1 = cur2 = 0; + /* and no error propagated to row below yet */ + belowerr0 = belowerr1 = belowerr2 = 0; + bpreverr0 = bpreverr1 = bpreverr2 = 0; + + for (col = width; col > 0; col--) { + /* curN holds the error propagated from the previous pixel on the + * current line. Add the error propagated from the previous line + * to form the complete error correction term for this pixel, and + * round the error term (which is expressed * 16) to an integer. + * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct + * for either sign of the error value. + * Note: errorptr points to *previous* column's array entry. + */ + cur0 = RIGHT_SHIFT(cur0 + errorptr[dir3+0] + 8, 4); + cur1 = RIGHT_SHIFT(cur1 + errorptr[dir3+1] + 8, 4); + cur2 = RIGHT_SHIFT(cur2 + errorptr[dir3+2] + 8, 4); + /* Limit the error using transfer function set by init_error_limit. + * See comments with init_error_limit for rationale. + */ + cur0 = error_limit[cur0]; + cur1 = error_limit[cur1]; + cur2 = error_limit[cur2]; + /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE. + * The maximum error is +- MAXJSAMPLE (or less with error limiting); + * this sets the required size of the range_limit array. + */ + cur0 += GETJSAMPLE(inptr[0]); + cur1 += GETJSAMPLE(inptr[1]); + cur2 += GETJSAMPLE(inptr[2]); + cur0 = GETJSAMPLE(range_limit[cur0]); + cur1 = GETJSAMPLE(range_limit[cur1]); + cur2 = GETJSAMPLE(range_limit[cur2]); + /* Index into the cache with adjusted pixel value */ + cachep = & histogram[cur0>>C0_SHIFT][cur1>>C1_SHIFT][cur2>>C2_SHIFT]; + /* If we have not seen this color before, find nearest colormap */ + /* entry and update the cache */ + if (*cachep == 0) + fill_inverse_cmap(cinfo, cur0>>C0_SHIFT,cur1>>C1_SHIFT,cur2>>C2_SHIFT); + /* Now emit the colormap index for this cell */ + { register int pixcode = *cachep - 1; + *outptr = (JSAMPLE) pixcode; + /* Compute representation error for this pixel */ + cur0 -= GETJSAMPLE(colormap0[pixcode]); + cur1 -= GETJSAMPLE(colormap1[pixcode]); + cur2 -= GETJSAMPLE(colormap2[pixcode]); + } + /* Compute error fractions to be propagated to adjacent pixels. + * Add these into the running sums, and simultaneously shift the + * next-line error sums left by 1 column. + */ + { register LOCFSERROR bnexterr, delta; + + bnexterr = cur0; /* Process component 0 */ + delta = cur0 * 2; + cur0 += delta; /* form error * 3 */ + errorptr[0] = (FSERROR) (bpreverr0 + cur0); + cur0 += delta; /* form error * 5 */ + bpreverr0 = belowerr0 + cur0; + belowerr0 = bnexterr; + cur0 += delta; /* form error * 7 */ + bnexterr = cur1; /* Process component 1 */ + delta = cur1 * 2; + cur1 += delta; /* form error * 3 */ + errorptr[1] = (FSERROR) (bpreverr1 + cur1); + cur1 += delta; /* form error * 5 */ + bpreverr1 = belowerr1 + cur1; + belowerr1 = bnexterr; + cur1 += delta; /* form error * 7 */ + bnexterr = cur2; /* Process component 2 */ + delta = cur2 * 2; + cur2 += delta; /* form error * 3 */ + errorptr[2] = (FSERROR) (bpreverr2 + cur2); + cur2 += delta; /* form error * 5 */ + bpreverr2 = belowerr2 + cur2; + belowerr2 = bnexterr; + cur2 += delta; /* form error * 7 */ + } + /* At this point curN contains the 7/16 error value to be propagated + * to the next pixel on the current line, and all the errors for the + * next line have been shifted over. We are therefore ready to move on. + */ + inptr += dir3; /* Advance pixel pointers to next column */ + outptr += dir; + errorptr += dir3; /* advance errorptr to current column */ + } + /* Post-loop cleanup: we must unload the final error values into the + * final fserrors[] entry. Note we need not unload belowerrN because + * it is for the dummy column before or after the actual array. + */ + errorptr[0] = (FSERROR) bpreverr0; /* unload prev errs into array */ + errorptr[1] = (FSERROR) bpreverr1; + errorptr[2] = (FSERROR) bpreverr2; + } +} + + +/* + * Initialize the error-limiting transfer function (lookup table). + * The raw F-S error computation can potentially compute error values of up to + * +- MAXJSAMPLE. But we want the maximum correction applied to a pixel to be + * much less, otherwise obviously wrong pixels will be created. (Typical + * effects include weird fringes at color-area boundaries, isolated bright + * pixels in a dark area, etc.) The standard advice for avoiding this problem + * is to ensure that the "corners" of the color cube are allocated as output + * colors; then repeated errors in the same direction cannot cause cascading + * error buildup. However, that only prevents the error from getting + * completely out of hand; Aaron Giles reports that error limiting improves + * the results even with corner colors allocated. + * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty + * well, but the smoother transfer function used below is even better. Thanks + * to Aaron Giles for this idea. + */ + +LOCAL(void) +init_error_limit (j_decompress_ptr cinfo) +/* Allocate and fill in the error_limiter table */ +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + int * table; + int in, out; + + table = (int *) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE*2+1) * SIZEOF(int)); + table += MAXJSAMPLE; /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */ + cquantize->error_limiter = table; + +#define STEPSIZE ((MAXJSAMPLE+1)/16) + /* Map errors 1:1 up to +- MAXJSAMPLE/16 */ + out = 0; + for (in = 0; in < STEPSIZE; in++, out++) { + table[in] = out; table[-in] = -out; + } + /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */ + for (; in < STEPSIZE*3; in++, out += (in&1) ? 0 : 1) { + table[in] = out; table[-in] = -out; + } + /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */ + for (; in <= MAXJSAMPLE; in++) { + table[in] = out; table[-in] = -out; + } +#undef STEPSIZE +} + + +/* + * Finish up at the end of each pass. + */ + +METHODDEF(void) +finish_pass1 (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + + /* Select the representative colors and fill in cinfo->colormap */ + cinfo->colormap = cquantize->sv_colormap; + select_colors(cinfo, cquantize->desired); + /* Force next pass to zero the color index table */ + cquantize->needs_zeroed = TRUE; +} + + +METHODDEF(void) +finish_pass2 (j_decompress_ptr cinfo) +{ + /* no work */ +} + + +/* + * Initialize for each processing pass. + */ + +METHODDEF(void) +start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + hist3d histogram = cquantize->histogram; + int i; + + /* Only F-S dithering or no dithering is supported. */ + /* If user asks for ordered dither, give him F-S. */ + if (cinfo->dither_mode != JDITHER_NONE) + cinfo->dither_mode = JDITHER_FS; + + if (is_pre_scan) { + /* Set up method pointers */ + cquantize->pub.color_quantize = prescan_quantize; + cquantize->pub.finish_pass = finish_pass1; + cquantize->needs_zeroed = TRUE; /* Always zero histogram */ + } else { + /* Set up method pointers */ + if (cinfo->dither_mode == JDITHER_FS) + cquantize->pub.color_quantize = pass2_fs_dither; + else + cquantize->pub.color_quantize = pass2_no_dither; + cquantize->pub.finish_pass = finish_pass2; + + /* Make sure color count is acceptable */ + i = cinfo->actual_number_of_colors; + if (i < 1) + ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 1); + if (i > MAXNUMCOLORS) + ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); + + if (cinfo->dither_mode == JDITHER_FS) { + size_t arraysize = (size_t) ((cinfo->output_width + 2) * + (3 * SIZEOF(FSERROR))); + /* Allocate Floyd-Steinberg workspace if we didn't already. */ + if (cquantize->fserrors == NULL) + cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); + /* Initialize the propagated errors to zero. */ + jzero_far((void FAR *) cquantize->fserrors, arraysize); + /* Make the error-limit table if we didn't already. */ + if (cquantize->error_limiter == NULL) + init_error_limit(cinfo); + cquantize->on_odd_row = FALSE; + } + + } + /* Zero the histogram or inverse color map, if necessary */ + if (cquantize->needs_zeroed) { + for (i = 0; i < HIST_C0_ELEMS; i++) { + jzero_far((void FAR *) histogram[i], + HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); + } + cquantize->needs_zeroed = FALSE; + } +} + + +/* + * Switch to a new external colormap between output passes. + */ + +METHODDEF(void) +new_color_map_2_quant (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; + + /* Reset the inverse color map */ + cquantize->needs_zeroed = TRUE; +} + + +/* + * Module initialization routine for 2-pass color quantization. + */ + +GLOBAL(void) +jinit_2pass_quantizer (j_decompress_ptr cinfo) +{ + my_cquantize_ptr cquantize; + int i; + + cquantize = (my_cquantize_ptr) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + SIZEOF(my_cquantizer)); + cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; + cquantize->pub.start_pass = start_pass_2_quant; + cquantize->pub.new_color_map = new_color_map_2_quant; + cquantize->fserrors = NULL; /* flag optional arrays not allocated */ + cquantize->error_limiter = NULL; + + /* Make sure jdmaster didn't give me a case I can't handle */ + if (cinfo->out_color_components != 3) + ERREXIT(cinfo, JERR_NOTIMPL); + + /* Allocate the histogram/inverse colormap storage */ + cquantize->histogram = (hist3d) (*cinfo->mem->alloc_small) + ((j_common_ptr) cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * SIZEOF(hist2d)); + for (i = 0; i < HIST_C0_ELEMS; i++) { + cquantize->histogram[i] = (hist2d) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); + } + cquantize->needs_zeroed = TRUE; /* histogram is garbage now */ + + /* Allocate storage for the completed colormap, if required. + * We do this now since it is FAR storage and may affect + * the memory manager's space calculations. + */ + if (cinfo->enable_2pass_quant) { + /* Make sure color count is acceptable */ + int desired = cinfo->desired_number_of_colors; + /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */ + if (desired < 8) + ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 8); + /* Make sure colormap indexes can be represented by JSAMPLEs */ + if (desired > MAXNUMCOLORS) + ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); + cquantize->sv_colormap = (*cinfo->mem->alloc_sarray) + ((j_common_ptr) cinfo,JPOOL_IMAGE, (JDIMENSION) desired, (JDIMENSION) 3); + cquantize->desired = desired; + } else + cquantize->sv_colormap = NULL; + + /* Only F-S dithering or no dithering is supported. */ + /* If user asks for ordered dither, give him F-S. */ + if (cinfo->dither_mode != JDITHER_NONE) + cinfo->dither_mode = JDITHER_FS; + + /* Allocate Floyd-Steinberg workspace if necessary. + * This isn't really needed until pass 2, but again it is FAR storage. + * Although we will cope with a later change in dither_mode, + * we do not promise to honor max_memory_to_use if dither_mode changes. + */ + if (cinfo->dither_mode == JDITHER_FS) { + cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) + ((j_common_ptr) cinfo, JPOOL_IMAGE, + (size_t) ((cinfo->output_width + 2) * (3 * SIZEOF(FSERROR)))); + /* Might as well create the error-limiting table too. */ + init_error_limit(cinfo); + } +} + +#endif /* QUANT_2PASS_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/jpeg/jutils.c b/third_party/windows/fltk-1.1.10/jpeg/jutils.c new file mode 100644 index 0000000..286cda2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jutils.c @@ -0,0 +1,179 @@ +/* + * jutils.c + * + * Copyright (C) 1991-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains tables and miscellaneous utility routines needed + * for both compression and decompression. + * Note we prefix all global names with "j" to minimize conflicts with + * a surrounding application. + */ + +#define JPEG_INTERNALS +#include "jinclude.h" +#include "jpeglib.h" + + +/* + * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element + * of a DCT block read in natural order (left to right, top to bottom). + */ + +#if 0 /* This table is not actually needed in v6a */ + +const int jpeg_zigzag_order[DCTSIZE2] = { + 0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63 +}; + +#endif + +/* + * jpeg_natural_order[i] is the natural-order position of the i'th element + * of zigzag order. + * + * When reading corrupted data, the Huffman decoders could attempt + * to reference an entry beyond the end of this array (if the decoded + * zero run length reaches past the end of the block). To prevent + * wild stores without adding an inner-loop test, we put some extra + * "63"s after the real entries. This will cause the extra coefficient + * to be stored in location 63 of the block, not somewhere random. + * The worst case would be a run-length of 15, which means we need 16 + * fake entries. + */ + +const int jpeg_natural_order[DCTSIZE2+16] = { + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ + 63, 63, 63, 63, 63, 63, 63, 63 +}; + + +/* + * Arithmetic utilities + */ + +GLOBAL(long) +jdiv_round_up (long a, long b) +/* Compute a/b rounded up to next integer, ie, ceil(a/b) */ +/* Assumes a >= 0, b > 0 */ +{ + return (a + b - 1L) / b; +} + + +GLOBAL(long) +jround_up (long a, long b) +/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */ +/* Assumes a >= 0, b > 0 */ +{ + a += b - 1L; + return a - (a % b); +} + + +/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays + * and coefficient-block arrays. This won't work on 80x86 because the arrays + * are FAR and we're assuming a small-pointer memory model. However, some + * DOS compilers provide far-pointer versions of memcpy() and memset() even + * in the small-model libraries. These will be used if USE_FMEM is defined. + * Otherwise, the routines below do it the hard way. (The performance cost + * is not all that great, because these routines aren't very heavily used.) + */ + +#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */ +#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size) +#define FMEMZERO(target,size) MEMZERO(target,size) +#else /* 80x86 case, define if we can */ +#ifdef USE_FMEM +#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size)) +#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size)) +#endif +#endif + + +GLOBAL(void) +jcopy_sample_rows (JSAMPARRAY input_array, int source_row, + JSAMPARRAY output_array, int dest_row, + int num_rows, JDIMENSION num_cols) +/* Copy some rows of samples from one place to another. + * num_rows rows are copied from input_array[source_row++] + * to output_array[dest_row++]; these areas may overlap for duplication. + * The source and destination arrays must be at least as wide as num_cols. + */ +{ + register JSAMPROW inptr, outptr; +#ifdef FMEMCOPY + register size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE)); +#else + register JDIMENSION count; +#endif + register int row; + + input_array += source_row; + output_array += dest_row; + + for (row = num_rows; row > 0; row--) { + inptr = *input_array++; + outptr = *output_array++; +#ifdef FMEMCOPY + FMEMCOPY(outptr, inptr, count); +#else + for (count = num_cols; count > 0; count--) + *outptr++ = *inptr++; /* needn't bother with GETJSAMPLE() here */ +#endif + } +} + + +GLOBAL(void) +jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row, + JDIMENSION num_blocks) +/* Copy a row of coefficient blocks from one place to another. */ +{ +#ifdef FMEMCOPY + FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF))); +#else + register JCOEFPTR inptr, outptr; + register long count; + + inptr = (JCOEFPTR) input_row; + outptr = (JCOEFPTR) output_row; + for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) { + *outptr++ = *inptr++; + } +#endif +} + + +GLOBAL(void) +jzero_far (void FAR * target, size_t bytestozero) +/* Zero out a chunk of FAR memory. */ +/* This might be sample-array data, block-array data, or alloc_large data. */ +{ +#ifdef FMEMZERO + FMEMZERO(target, bytestozero); +#else + register char FAR * ptr = (char FAR *) target; + register size_t count; + + for (count = bytestozero; count > 0; count--) { + *ptr++ = 0; + } +#endif +} diff --git a/third_party/windows/fltk-1.1.10/jpeg/jversion.h b/third_party/windows/fltk-1.1.10/jpeg/jversion.h new file mode 100644 index 0000000..dadd453 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/jversion.h @@ -0,0 +1,14 @@ +/* + * jversion.h + * + * Copyright (C) 1991-1998, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains software version identification. + */ + + +#define JVERSION "6b 27-Mar-1998" + +#define JCOPYRIGHT "Copyright (C) 1998, Thomas G. Lane" diff --git a/third_party/windows/fltk-1.1.10/jpeg/libjpeg.doc b/third_party/windows/fltk-1.1.10/jpeg/libjpeg.doc new file mode 100644 index 0000000..f741051 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/libjpeg.doc @@ -0,0 +1,3006 @@ +USING THE IJG JPEG LIBRARY + +Copyright (C) 1994-1998, Thomas G. Lane. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +This file describes how to use the IJG JPEG library within an application +program. Read it if you want to write a program that uses the library. + +The file example.c provides heavily commented skeleton code for calling the +JPEG library. Also see jpeglib.h (the include file to be used by application +programs) for full details about data structures and function parameter lists. +The library source code, of course, is the ultimate reference. + +Note that there have been *major* changes from the application interface +presented by IJG version 4 and earlier versions. The old design had several +inherent limitations, and it had accumulated a lot of cruft as we added +features while trying to minimize application-interface changes. We have +sacrificed backward compatibility in the version 5 rewrite, but we think the +improvements justify this. + + +TABLE OF CONTENTS +----------------- + +Overview: + Functions provided by the library + Outline of typical usage +Basic library usage: + Data formats + Compression details + Decompression details + Mechanics of usage: include files, linking, etc +Advanced features: + Compression parameter selection + Decompression parameter selection + Special color spaces + Error handling + Compressed data handling (source and destination managers) + I/O suspension + Progressive JPEG support + Buffered-image mode + Abbreviated datastreams and multiple images + Special markers + Raw (downsampled) image data + Really raw data: DCT coefficients + Progress monitoring + Memory management + Memory usage + Library compile-time options + Portability considerations + Notes for MS-DOS implementors + +You should read at least the overview and basic usage sections before trying +to program with the library. The sections on advanced features can be read +if and when you need them. + + +OVERVIEW +======== + +Functions provided by the library +--------------------------------- + +The IJG JPEG library provides C code to read and write JPEG-compressed image +files. The surrounding application program receives or supplies image data a +scanline at a time, using a straightforward uncompressed image format. All +details of color conversion and other preprocessing/postprocessing can be +handled by the library. + +The library includes a substantial amount of code that is not covered by the +JPEG standard but is necessary for typical applications of JPEG. These +functions preprocess the image before JPEG compression or postprocess it after +decompression. They include colorspace conversion, downsampling/upsampling, +and color quantization. The application indirectly selects use of this code +by specifying the format in which it wishes to supply or receive image data. +For example, if colormapped output is requested, then the decompression +library automatically invokes color quantization. + +A wide range of quality vs. speed tradeoffs are possible in JPEG processing, +and even more so in decompression postprocessing. The decompression library +provides multiple implementations that cover most of the useful tradeoffs, +ranging from very-high-quality down to fast-preview operation. On the +compression side we have generally not provided low-quality choices, since +compression is normally less time-critical. It should be understood that the +low-quality modes may not meet the JPEG standard's accuracy requirements; +nonetheless, they are useful for viewers. + +A word about functions *not* provided by the library. We handle a subset of +the ISO JPEG standard; most baseline, extended-sequential, and progressive +JPEG processes are supported. (Our subset includes all features now in common +use.) Unsupported ISO options include: + * Hierarchical storage + * Lossless JPEG + * Arithmetic entropy coding (unsupported for legal reasons) + * DNL marker + * Nonintegral subsampling ratios +We support both 8- and 12-bit data precision, but this is a compile-time +choice rather than a run-time choice; hence it is difficult to use both +precisions in a single application. + +By itself, the library handles only interchange JPEG datastreams --- in +particular the widely used JFIF file format. The library can be used by +surrounding code to process interchange or abbreviated JPEG datastreams that +are embedded in more complex file formats. (For example, this library is +used by the free LIBTIFF library to support JPEG compression in TIFF.) + + +Outline of typical usage +------------------------ + +The rough outline of a JPEG compression operation is: + + Allocate and initialize a JPEG compression object + Specify the destination for the compressed data (eg, a file) + Set parameters for compression, including image size & colorspace + jpeg_start_compress(...); + while (scan lines remain to be written) + jpeg_write_scanlines(...); + jpeg_finish_compress(...); + Release the JPEG compression object + +A JPEG compression object holds parameters and working state for the JPEG +library. We make creation/destruction of the object separate from starting +or finishing compression of an image; the same object can be re-used for a +series of image compression operations. This makes it easy to re-use the +same parameter settings for a sequence of images. Re-use of a JPEG object +also has important implications for processing abbreviated JPEG datastreams, +as discussed later. + +The image data to be compressed is supplied to jpeg_write_scanlines() from +in-memory buffers. If the application is doing file-to-file compression, +reading image data from the source file is the application's responsibility. +The library emits compressed data by calling a "data destination manager", +which typically will write the data into a file; but the application can +provide its own destination manager to do something else. + +Similarly, the rough outline of a JPEG decompression operation is: + + Allocate and initialize a JPEG decompression object + Specify the source of the compressed data (eg, a file) + Call jpeg_read_header() to obtain image info + Set parameters for decompression + jpeg_start_decompress(...); + while (scan lines remain to be read) + jpeg_read_scanlines(...); + jpeg_finish_decompress(...); + Release the JPEG decompression object + +This is comparable to the compression outline except that reading the +datastream header is a separate step. This is helpful because information +about the image's size, colorspace, etc is available when the application +selects decompression parameters. For example, the application can choose an +output scaling ratio that will fit the image into the available screen size. + +The decompression library obtains compressed data by calling a data source +manager, which typically will read the data from a file; but other behaviors +can be obtained with a custom source manager. Decompressed data is delivered +into in-memory buffers passed to jpeg_read_scanlines(). + +It is possible to abort an incomplete compression or decompression operation +by calling jpeg_abort(); or, if you do not need to retain the JPEG object, +simply release it by calling jpeg_destroy(). + +JPEG compression and decompression objects are two separate struct types. +However, they share some common fields, and certain routines such as +jpeg_destroy() can work on either type of object. + +The JPEG library has no static variables: all state is in the compression +or decompression object. Therefore it is possible to process multiple +compression and decompression operations concurrently, using multiple JPEG +objects. + +Both compression and decompression can be done in an incremental memory-to- +memory fashion, if suitable source/destination managers are used. See the +section on "I/O suspension" for more details. + + +BASIC LIBRARY USAGE +=================== + +Data formats +------------ + +Before diving into procedural details, it is helpful to understand the +image data format that the JPEG library expects or returns. + +The standard input image format is a rectangular array of pixels, with each +pixel having the same number of "component" or "sample" values (color +channels). You must specify how many components there are and the colorspace +interpretation of the components. Most applications will use RGB data +(three components per pixel) or grayscale data (one component per pixel). +PLEASE NOTE THAT RGB DATA IS THREE SAMPLES PER PIXEL, GRAYSCALE ONLY ONE. +A remarkable number of people manage to miss this, only to find that their +programs don't work with grayscale JPEG files. + +There is no provision for colormapped input. JPEG files are always full-color +or full grayscale (or sometimes another colorspace such as CMYK). You can +feed in a colormapped image by expanding it to full-color format. However +JPEG often doesn't work very well with source data that has been colormapped, +because of dithering noise. This is discussed in more detail in the JPEG FAQ +and the other references mentioned in the README file. + +Pixels are stored by scanlines, with each scanline running from left to +right. The component values for each pixel are adjacent in the row; for +example, R,G,B,R,G,B,R,G,B,... for 24-bit RGB color. Each scanline is an +array of data type JSAMPLE --- which is typically "unsigned char", unless +you've changed jmorecfg.h. (You can also change the RGB pixel layout, say +to B,G,R order, by modifying jmorecfg.h. But see the restrictions listed in +that file before doing so.) + +A 2-D array of pixels is formed by making a list of pointers to the starts of +scanlines; so the scanlines need not be physically adjacent in memory. Even +if you process just one scanline at a time, you must make a one-element +pointer array to conform to this structure. Pointers to JSAMPLE rows are of +type JSAMPROW, and the pointer to the pointer array is of type JSAMPARRAY. + +The library accepts or supplies one or more complete scanlines per call. +It is not possible to process part of a row at a time. Scanlines are always +processed top-to-bottom. You can process an entire image in one call if you +have it all in memory, but usually it's simplest to process one scanline at +a time. + +For best results, source data values should have the precision specified by +BITS_IN_JSAMPLE (normally 8 bits). For instance, if you choose to compress +data that's only 6 bits/channel, you should left-justify each value in a +byte before passing it to the compressor. If you need to compress data +that has more than 8 bits/channel, compile with BITS_IN_JSAMPLE = 12. +(See "Library compile-time options", later.) + + +The data format returned by the decompressor is the same in all details, +except that colormapped output is supported. (Again, a JPEG file is never +colormapped. But you can ask the decompressor to perform on-the-fly color +quantization to deliver colormapped output.) If you request colormapped +output then the returned data array contains a single JSAMPLE per pixel; +its value is an index into a color map. The color map is represented as +a 2-D JSAMPARRAY in which each row holds the values of one color component, +that is, colormap[i][j] is the value of the i'th color component for pixel +value (map index) j. Note that since the colormap indexes are stored in +JSAMPLEs, the maximum number of colors is limited by the size of JSAMPLE +(ie, at most 256 colors for an 8-bit JPEG library). + + +Compression details +------------------- + +Here we revisit the JPEG compression outline given in the overview. + +1. Allocate and initialize a JPEG compression object. + +A JPEG compression object is a "struct jpeg_compress_struct". (It also has +a bunch of subsidiary structures which are allocated via malloc(), but the +application doesn't control those directly.) This struct can be just a local +variable in the calling routine, if a single routine is going to execute the +whole JPEG compression sequence. Otherwise it can be static or allocated +from malloc(). + +You will also need a structure representing a JPEG error handler. The part +of this that the library cares about is a "struct jpeg_error_mgr". If you +are providing your own error handler, you'll typically want to embed the +jpeg_error_mgr struct in a larger structure; this is discussed later under +"Error handling". For now we'll assume you are just using the default error +handler. The default error handler will print JPEG error/warning messages +on stderr, and it will call exit() if a fatal error occurs. + +You must initialize the error handler structure, store a pointer to it into +the JPEG object's "err" field, and then call jpeg_create_compress() to +initialize the rest of the JPEG object. + +Typical code for this step, if you are using the default error handler, is + + struct jpeg_compress_struct cinfo; + struct jpeg_error_mgr jerr; + ... + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_compress(&cinfo); + +jpeg_create_compress allocates a small amount of memory, so it could fail +if you are out of memory. In that case it will exit via the error handler; +that's why the error handler must be initialized first. + + +2. Specify the destination for the compressed data (eg, a file). + +As previously mentioned, the JPEG library delivers compressed data to a +"data destination" module. The library includes one data destination +module which knows how to write to a stdio stream. You can use your own +destination module if you want to do something else, as discussed later. + +If you use the standard destination module, you must open the target stdio +stream beforehand. Typical code for this step looks like: + + FILE * outfile; + ... + if ((outfile = fopen(filename, "wb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_dest(&cinfo, outfile); + +where the last line invokes the standard destination module. + +WARNING: it is critical that the binary compressed data be delivered to the +output file unchanged. On non-Unix systems the stdio library may perform +newline translation or otherwise corrupt binary data. To suppress this +behavior, you may need to use a "b" option to fopen (as shown above), or use +setmode() or another routine to put the stdio stream in binary mode. See +cjpeg.c and djpeg.c for code that has been found to work on many systems. + +You can select the data destination after setting other parameters (step 3), +if that's more convenient. You may not change the destination between +calling jpeg_start_compress() and jpeg_finish_compress(). + + +3. Set parameters for compression, including image size & colorspace. + +You must supply information about the source image by setting the following +fields in the JPEG object (cinfo structure): + + image_width Width of image, in pixels + image_height Height of image, in pixels + input_components Number of color channels (samples per pixel) + in_color_space Color space of source image + +The image dimensions are, hopefully, obvious. JPEG supports image dimensions +of 1 to 64K pixels in either direction. The input color space is typically +RGB or grayscale, and input_components is 3 or 1 accordingly. (See "Special +color spaces", later, for more info.) The in_color_space field must be +assigned one of the J_COLOR_SPACE enum constants, typically JCS_RGB or +JCS_GRAYSCALE. + +JPEG has a large number of compression parameters that determine how the +image is encoded. Most applications don't need or want to know about all +these parameters. You can set all the parameters to reasonable defaults by +calling jpeg_set_defaults(); then, if there are particular values you want +to change, you can do so after that. The "Compression parameter selection" +section tells about all the parameters. + +You must set in_color_space correctly before calling jpeg_set_defaults(), +because the defaults depend on the source image colorspace. However the +other three source image parameters need not be valid until you call +jpeg_start_compress(). There's no harm in calling jpeg_set_defaults() more +than once, if that happens to be convenient. + +Typical code for a 24-bit RGB source image is + + cinfo.image_width = Width; /* image width and height, in pixels */ + cinfo.image_height = Height; + cinfo.input_components = 3; /* # of color components per pixel */ + cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ + + jpeg_set_defaults(&cinfo); + /* Make optional parameter settings here */ + + +4. jpeg_start_compress(...); + +After you have established the data destination and set all the necessary +source image info and other parameters, call jpeg_start_compress() to begin +a compression cycle. This will initialize internal state, allocate working +storage, and emit the first few bytes of the JPEG datastream header. + +Typical code: + + jpeg_start_compress(&cinfo, TRUE); + +The "TRUE" parameter ensures that a complete JPEG interchange datastream +will be written. This is appropriate in most cases. If you think you might +want to use an abbreviated datastream, read the section on abbreviated +datastreams, below. + +Once you have called jpeg_start_compress(), you may not alter any JPEG +parameters or other fields of the JPEG object until you have completed +the compression cycle. + + +5. while (scan lines remain to be written) + jpeg_write_scanlines(...); + +Now write all the required image data by calling jpeg_write_scanlines() +one or more times. You can pass one or more scanlines in each call, up +to the total image height. In most applications it is convenient to pass +just one or a few scanlines at a time. The expected format for the passed +data is discussed under "Data formats", above. + +Image data should be written in top-to-bottom scanline order. The JPEG spec +contains some weasel wording about how top and bottom are application-defined +terms (a curious interpretation of the English language...) but if you want +your files to be compatible with everyone else's, you WILL use top-to-bottom +order. If the source data must be read in bottom-to-top order, you can use +the JPEG library's virtual array mechanism to invert the data efficiently. +Examples of this can be found in the sample application cjpeg. + +The library maintains a count of the number of scanlines written so far +in the next_scanline field of the JPEG object. Usually you can just use +this variable as the loop counter, so that the loop test looks like +"while (cinfo.next_scanline < cinfo.image_height)". + +Code for this step depends heavily on the way that you store the source data. +example.c shows the following code for the case of a full-size 2-D source +array containing 3-byte RGB pixels: + + JSAMPROW row_pointer[1]; /* pointer to a single row */ + int row_stride; /* physical row width in buffer */ + + row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */ + + while (cinfo.next_scanline < cinfo.image_height) { + row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride]; + jpeg_write_scanlines(&cinfo, row_pointer, 1); + } + +jpeg_write_scanlines() returns the number of scanlines actually written. +This will normally be equal to the number passed in, so you can usually +ignore the return value. It is different in just two cases: + * If you try to write more scanlines than the declared image height, + the additional scanlines are ignored. + * If you use a suspending data destination manager, output buffer overrun + will cause the compressor to return before accepting all the passed lines. + This feature is discussed under "I/O suspension", below. The normal + stdio destination manager will NOT cause this to happen. +In any case, the return value is the same as the change in the value of +next_scanline. + + +6. jpeg_finish_compress(...); + +After all the image data has been written, call jpeg_finish_compress() to +complete the compression cycle. This step is ESSENTIAL to ensure that the +last bufferload of data is written to the data destination. +jpeg_finish_compress() also releases working memory associated with the JPEG +object. + +Typical code: + + jpeg_finish_compress(&cinfo); + +If using the stdio destination manager, don't forget to close the output +stdio stream (if necessary) afterwards. + +If you have requested a multi-pass operating mode, such as Huffman code +optimization, jpeg_finish_compress() will perform the additional passes using +data buffered by the first pass. In this case jpeg_finish_compress() may take +quite a while to complete. With the default compression parameters, this will +not happen. + +It is an error to call jpeg_finish_compress() before writing the necessary +total number of scanlines. If you wish to abort compression, call +jpeg_abort() as discussed below. + +After completing a compression cycle, you may dispose of the JPEG object +as discussed next, or you may use it to compress another image. In that case +return to step 2, 3, or 4 as appropriate. If you do not change the +destination manager, the new datastream will be written to the same target. +If you do not change any JPEG parameters, the new datastream will be written +with the same parameters as before. Note that you can change the input image +dimensions freely between cycles, but if you change the input colorspace, you +should call jpeg_set_defaults() to adjust for the new colorspace; and then +you'll need to repeat all of step 3. + + +7. Release the JPEG compression object. + +When you are done with a JPEG compression object, destroy it by calling +jpeg_destroy_compress(). This will free all subsidiary memory (regardless of +the previous state of the object). Or you can call jpeg_destroy(), which +works for either compression or decompression objects --- this may be more +convenient if you are sharing code between compression and decompression +cases. (Actually, these routines are equivalent except for the declared type +of the passed pointer. To avoid gripes from ANSI C compilers, jpeg_destroy() +should be passed a j_common_ptr.) + +If you allocated the jpeg_compress_struct structure from malloc(), freeing +it is your responsibility --- jpeg_destroy() won't. Ditto for the error +handler structure. + +Typical code: + + jpeg_destroy_compress(&cinfo); + + +8. Aborting. + +If you decide to abort a compression cycle before finishing, you can clean up +in either of two ways: + +* If you don't need the JPEG object any more, just call + jpeg_destroy_compress() or jpeg_destroy() to release memory. This is + legitimate at any point after calling jpeg_create_compress() --- in fact, + it's safe even if jpeg_create_compress() fails. + +* If you want to re-use the JPEG object, call jpeg_abort_compress(), or call + jpeg_abort() which works on both compression and decompression objects. + This will return the object to an idle state, releasing any working memory. + jpeg_abort() is allowed at any time after successful object creation. + +Note that cleaning up the data destination, if required, is your +responsibility; neither of these routines will call term_destination(). +(See "Compressed data handling", below, for more about that.) + +jpeg_destroy() and jpeg_abort() are the only safe calls to make on a JPEG +object that has reported an error by calling error_exit (see "Error handling" +for more info). The internal state of such an object is likely to be out of +whack. Either of these two routines will return the object to a known state. + + +Decompression details +--------------------- + +Here we revisit the JPEG decompression outline given in the overview. + +1. Allocate and initialize a JPEG decompression object. + +This is just like initialization for compression, as discussed above, +except that the object is a "struct jpeg_decompress_struct" and you +call jpeg_create_decompress(). Error handling is exactly the same. + +Typical code: + + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + ... + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + +(Both here and in the IJG code, we usually use variable name "cinfo" for +both compression and decompression objects.) + + +2. Specify the source of the compressed data (eg, a file). + +As previously mentioned, the JPEG library reads compressed data from a "data +source" module. The library includes one data source module which knows how +to read from a stdio stream. You can use your own source module if you want +to do something else, as discussed later. + +If you use the standard source module, you must open the source stdio stream +beforehand. Typical code for this step looks like: + + FILE * infile; + ... + if ((infile = fopen(filename, "rb")) == NULL) { + fprintf(stderr, "can't open %s\n", filename); + exit(1); + } + jpeg_stdio_src(&cinfo, infile); + +where the last line invokes the standard source module. + +WARNING: it is critical that the binary compressed data be read unchanged. +On non-Unix systems the stdio library may perform newline translation or +otherwise corrupt binary data. To suppress this behavior, you may need to use +a "b" option to fopen (as shown above), or use setmode() or another routine to +put the stdio stream in binary mode. See cjpeg.c and djpeg.c for code that +has been found to work on many systems. + +You may not change the data source between calling jpeg_read_header() and +jpeg_finish_decompress(). If you wish to read a series of JPEG images from +a single source file, you should repeat the jpeg_read_header() to +jpeg_finish_decompress() sequence without reinitializing either the JPEG +object or the data source module; this prevents buffered input data from +being discarded. + + +3. Call jpeg_read_header() to obtain image info. + +Typical code for this step is just + + jpeg_read_header(&cinfo, TRUE); + +This will read the source datastream header markers, up to the beginning +of the compressed data proper. On return, the image dimensions and other +info have been stored in the JPEG object. The application may wish to +consult this information before selecting decompression parameters. + +More complex code is necessary if + * A suspending data source is used --- in that case jpeg_read_header() + may return before it has read all the header data. See "I/O suspension", + below. The normal stdio source manager will NOT cause this to happen. + * Abbreviated JPEG files are to be processed --- see the section on + abbreviated datastreams. Standard applications that deal only in + interchange JPEG files need not be concerned with this case either. + +It is permissible to stop at this point if you just wanted to find out the +image dimensions and other header info for a JPEG file. In that case, +call jpeg_destroy() when you are done with the JPEG object, or call +jpeg_abort() to return it to an idle state before selecting a new data +source and reading another header. + + +4. Set parameters for decompression. + +jpeg_read_header() sets appropriate default decompression parameters based on +the properties of the image (in particular, its colorspace). However, you +may well want to alter these defaults before beginning the decompression. +For example, the default is to produce full color output from a color file. +If you want colormapped output you must ask for it. Other options allow the +returned image to be scaled and allow various speed/quality tradeoffs to be +selected. "Decompression parameter selection", below, gives details. + +If the defaults are appropriate, nothing need be done at this step. + +Note that all default values are set by each call to jpeg_read_header(). +If you reuse a decompression object, you cannot expect your parameter +settings to be preserved across cycles, as you can for compression. +You must set desired parameter values each time. + + +5. jpeg_start_decompress(...); + +Once the parameter values are satisfactory, call jpeg_start_decompress() to +begin decompression. This will initialize internal state, allocate working +memory, and prepare for returning data. + +Typical code is just + + jpeg_start_decompress(&cinfo); + +If you have requested a multi-pass operating mode, such as 2-pass color +quantization, jpeg_start_decompress() will do everything needed before data +output can begin. In this case jpeg_start_decompress() may take quite a while +to complete. With a single-scan (non progressive) JPEG file and default +decompression parameters, this will not happen; jpeg_start_decompress() will +return quickly. + +After this call, the final output image dimensions, including any requested +scaling, are available in the JPEG object; so is the selected colormap, if +colormapped output has been requested. Useful fields include + + output_width image width and height, as scaled + output_height + out_color_components # of color components in out_color_space + output_components # of color components returned per pixel + colormap the selected colormap, if any + actual_number_of_colors number of entries in colormap + +output_components is 1 (a colormap index) when quantizing colors; otherwise it +equals out_color_components. It is the number of JSAMPLE values that will be +emitted per pixel in the output arrays. + +Typically you will need to allocate data buffers to hold the incoming image. +You will need output_width * output_components JSAMPLEs per scanline in your +output buffer, and a total of output_height scanlines will be returned. + +Note: if you are using the JPEG library's internal memory manager to allocate +data buffers (as djpeg does), then the manager's protocol requires that you +request large buffers *before* calling jpeg_start_decompress(). This is a +little tricky since the output_XXX fields are not normally valid then. You +can make them valid by calling jpeg_calc_output_dimensions() after setting the +relevant parameters (scaling, output color space, and quantization flag). + + +6. while (scan lines remain to be read) + jpeg_read_scanlines(...); + +Now you can read the decompressed image data by calling jpeg_read_scanlines() +one or more times. At each call, you pass in the maximum number of scanlines +to be read (ie, the height of your working buffer); jpeg_read_scanlines() +will return up to that many lines. The return value is the number of lines +actually read. The format of the returned data is discussed under "Data +formats", above. Don't forget that grayscale and color JPEGs will return +different data formats! + +Image data is returned in top-to-bottom scanline order. If you must write +out the image in bottom-to-top order, you can use the JPEG library's virtual +array mechanism to invert the data efficiently. Examples of this can be +found in the sample application djpeg. + +The library maintains a count of the number of scanlines returned so far +in the output_scanline field of the JPEG object. Usually you can just use +this variable as the loop counter, so that the loop test looks like +"while (cinfo.output_scanline < cinfo.output_height)". (Note that the test +should NOT be against image_height, unless you never use scaling. The +image_height field is the height of the original unscaled image.) +The return value always equals the change in the value of output_scanline. + +If you don't use a suspending data source, it is safe to assume that +jpeg_read_scanlines() reads at least one scanline per call, until the +bottom of the image has been reached. + +If you use a buffer larger than one scanline, it is NOT safe to assume that +jpeg_read_scanlines() fills it. (The current implementation returns only a +few scanlines per call, no matter how large a buffer you pass.) So you must +always provide a loop that calls jpeg_read_scanlines() repeatedly until the +whole image has been read. + + +7. jpeg_finish_decompress(...); + +After all the image data has been read, call jpeg_finish_decompress() to +complete the decompression cycle. This causes working memory associated +with the JPEG object to be released. + +Typical code: + + jpeg_finish_decompress(&cinfo); + +If using the stdio source manager, don't forget to close the source stdio +stream if necessary. + +It is an error to call jpeg_finish_decompress() before reading the correct +total number of scanlines. If you wish to abort decompression, call +jpeg_abort() as discussed below. + +After completing a decompression cycle, you may dispose of the JPEG object as +discussed next, or you may use it to decompress another image. In that case +return to step 2 or 3 as appropriate. If you do not change the source +manager, the next image will be read from the same source. + + +8. Release the JPEG decompression object. + +When you are done with a JPEG decompression object, destroy it by calling +jpeg_destroy_decompress() or jpeg_destroy(). The previous discussion of +destroying compression objects applies here too. + +Typical code: + + jpeg_destroy_decompress(&cinfo); + + +9. Aborting. + +You can abort a decompression cycle by calling jpeg_destroy_decompress() or +jpeg_destroy() if you don't need the JPEG object any more, or +jpeg_abort_decompress() or jpeg_abort() if you want to reuse the object. +The previous discussion of aborting compression cycles applies here too. + + +Mechanics of usage: include files, linking, etc +----------------------------------------------- + +Applications using the JPEG library should include the header file jpeglib.h +to obtain declarations of data types and routines. Before including +jpeglib.h, include system headers that define at least the typedefs FILE and +size_t. On ANSI-conforming systems, including is sufficient; on +older Unix systems, you may need to define size_t. + +If the application needs to refer to individual JPEG library error codes, also +include jerror.h to define those symbols. + +jpeglib.h indirectly includes the files jconfig.h and jmorecfg.h. If you are +installing the JPEG header files in a system directory, you will want to +install all four files: jpeglib.h, jerror.h, jconfig.h, jmorecfg.h. + +The most convenient way to include the JPEG code into your executable program +is to prepare a library file ("libjpeg.a", or a corresponding name on non-Unix +machines) and reference it at your link step. If you use only half of the +library (only compression or only decompression), only that much code will be +included from the library, unless your linker is hopelessly brain-damaged. +The supplied makefiles build libjpeg.a automatically (see install.doc). + +While you can build the JPEG library as a shared library if the whim strikes +you, we don't really recommend it. The trouble with shared libraries is that +at some point you'll probably try to substitute a new version of the library +without recompiling the calling applications. That generally doesn't work +because the parameter struct declarations usually change with each new +version. In other words, the library's API is *not* guaranteed binary +compatible across versions; we only try to ensure source-code compatibility. +(In hindsight, it might have been smarter to hide the parameter structs from +applications and introduce a ton of access functions instead. Too late now, +however.) + +On some systems your application may need to set up a signal handler to ensure +that temporary files are deleted if the program is interrupted. This is most +critical if you are on MS-DOS and use the jmemdos.c memory manager back end; +it will try to grab extended memory for temp files, and that space will NOT be +freed automatically. See cjpeg.c or djpeg.c for an example signal handler. + +It may be worth pointing out that the core JPEG library does not actually +require the stdio library: only the default source/destination managers and +error handler need it. You can use the library in a stdio-less environment +if you replace those modules and use jmemnobs.c (or another memory manager of +your own devising). More info about the minimum system library requirements +may be found in jinclude.h. + + +ADVANCED FEATURES +================= + +Compression parameter selection +------------------------------- + +This section describes all the optional parameters you can set for JPEG +compression, as well as the "helper" routines provided to assist in this +task. Proper setting of some parameters requires detailed understanding +of the JPEG standard; if you don't know what a parameter is for, it's best +not to mess with it! See REFERENCES in the README file for pointers to +more info about JPEG. + +It's a good idea to call jpeg_set_defaults() first, even if you plan to set +all the parameters; that way your code is more likely to work with future JPEG +libraries that have additional parameters. For the same reason, we recommend +you use a helper routine where one is provided, in preference to twiddling +cinfo fields directly. + +The helper routines are: + +jpeg_set_defaults (j_compress_ptr cinfo) + This routine sets all JPEG parameters to reasonable defaults, using + only the input image's color space (field in_color_space, which must + already be set in cinfo). Many applications will only need to use + this routine and perhaps jpeg_set_quality(). + +jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) + Sets the JPEG file's colorspace (field jpeg_color_space) as specified, + and sets other color-space-dependent parameters appropriately. See + "Special color spaces", below, before using this. A large number of + parameters, including all per-component parameters, are set by this + routine; if you want to twiddle individual parameters you should call + jpeg_set_colorspace() before rather than after. + +jpeg_default_colorspace (j_compress_ptr cinfo) + Selects an appropriate JPEG colorspace based on cinfo->in_color_space, + and calls jpeg_set_colorspace(). This is actually a subroutine of + jpeg_set_defaults(). It's broken out in case you want to change + just the colorspace-dependent JPEG parameters. + +jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline) + Constructs JPEG quantization tables appropriate for the indicated + quality setting. The quality value is expressed on the 0..100 scale + recommended by IJG (cjpeg's "-quality" switch uses this routine). + Note that the exact mapping from quality values to tables may change + in future IJG releases as more is learned about DCT quantization. + If the force_baseline parameter is TRUE, then the quantization table + entries are constrained to the range 1..255 for full JPEG baseline + compatibility. In the current implementation, this only makes a + difference for quality settings below 25, and it effectively prevents + very small/low quality files from being generated. The IJG decoder + is capable of reading the non-baseline files generated at low quality + settings when force_baseline is FALSE, but other decoders may not be. + +jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, + boolean force_baseline) + Same as jpeg_set_quality() except that the generated tables are the + sample tables given in the JPEC spec section K.1, multiplied by the + specified scale factor (which is expressed as a percentage; thus + scale_factor = 100 reproduces the spec's tables). Note that larger + scale factors give lower quality. This entry point is useful for + conforming to the Adobe PostScript DCT conventions, but we do not + recommend linear scaling as a user-visible quality scale otherwise. + force_baseline again constrains the computed table entries to 1..255. + +int jpeg_quality_scaling (int quality) + Converts a value on the IJG-recommended quality scale to a linear + scaling percentage. Note that this routine may change or go away + in future releases --- IJG may choose to adopt a scaling method that + can't be expressed as a simple scalar multiplier, in which case the + premise of this routine collapses. Caveat user. + +jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, + const unsigned int *basic_table, + int scale_factor, boolean force_baseline) + Allows an arbitrary quantization table to be created. which_tbl + indicates which table slot to fill. basic_table points to an array + of 64 unsigned ints given in normal array order. These values are + multiplied by scale_factor/100 and then clamped to the range 1..65535 + (or to 1..255 if force_baseline is TRUE). + CAUTION: prior to library version 6a, jpeg_add_quant_table expected + the basic table to be given in JPEG zigzag order. If you need to + write code that works with either older or newer versions of this + routine, you must check the library version number. Something like + "#if JPEG_LIB_VERSION >= 61" is the right test. + +jpeg_simple_progression (j_compress_ptr cinfo) + Generates a default scan script for writing a progressive-JPEG file. + This is the recommended method of creating a progressive file, + unless you want to make a custom scan sequence. You must ensure that + the JPEG color space is set correctly before calling this routine. + + +Compression parameters (cinfo fields) include: + +J_DCT_METHOD dct_method + Selects the algorithm used for the DCT step. Choices are: + JDCT_ISLOW: slow but accurate integer algorithm + JDCT_IFAST: faster, less accurate integer method + JDCT_FLOAT: floating-point method + JDCT_DEFAULT: default method (normally JDCT_ISLOW) + JDCT_FASTEST: fastest method (normally JDCT_IFAST) + The FLOAT method is very slightly more accurate than the ISLOW method, + but may give different results on different machines due to varying + roundoff behavior. The integer methods should give the same results + on all machines. On machines with sufficiently fast FP hardware, the + floating-point method may also be the fastest. The IFAST method is + considerably less accurate than the other two; its use is not + recommended if high quality is a concern. JDCT_DEFAULT and + JDCT_FASTEST are macros configurable by each installation. + +J_COLOR_SPACE jpeg_color_space +int num_components + The JPEG color space and corresponding number of components; see + "Special color spaces", below, for more info. We recommend using + jpeg_set_color_space() if you want to change these. + +boolean optimize_coding + TRUE causes the compressor to compute optimal Huffman coding tables + for the image. This requires an extra pass over the data and + therefore costs a good deal of space and time. The default is + FALSE, which tells the compressor to use the supplied or default + Huffman tables. In most cases optimal tables save only a few percent + of file size compared to the default tables. Note that when this is + TRUE, you need not supply Huffman tables at all, and any you do + supply will be overwritten. + +unsigned int restart_interval +int restart_in_rows + To emit restart markers in the JPEG file, set one of these nonzero. + Set restart_interval to specify the exact interval in MCU blocks. + Set restart_in_rows to specify the interval in MCU rows. (If + restart_in_rows is not 0, then restart_interval is set after the + image width in MCUs is computed.) Defaults are zero (no restarts). + One restart marker per MCU row is often a good choice. + NOTE: the overhead of restart markers is higher in grayscale JPEG + files than in color files, and MUCH higher in progressive JPEGs. + If you use restarts, you may want to use larger intervals in those + cases. + +const jpeg_scan_info * scan_info +int num_scans + By default, scan_info is NULL; this causes the compressor to write a + single-scan sequential JPEG file. If not NULL, scan_info points to + an array of scan definition records of length num_scans. The + compressor will then write a JPEG file having one scan for each scan + definition record. This is used to generate noninterleaved or + progressive JPEG files. The library checks that the scan array + defines a valid JPEG scan sequence. (jpeg_simple_progression creates + a suitable scan definition array for progressive JPEG.) This is + discussed further under "Progressive JPEG support". + +int smoothing_factor + If non-zero, the input image is smoothed; the value should be 1 for + minimal smoothing to 100 for maximum smoothing. Consult jcsample.c + for details of the smoothing algorithm. The default is zero. + +boolean write_JFIF_header + If TRUE, a JFIF APP0 marker is emitted. jpeg_set_defaults() and + jpeg_set_colorspace() set this TRUE if a JFIF-legal JPEG color space + (ie, YCbCr or grayscale) is selected, otherwise FALSE. + +UINT8 JFIF_major_version +UINT8 JFIF_minor_version + The version number to be written into the JFIF marker. + jpeg_set_defaults() initializes the version to 1.01 (major=minor=1). + You should set it to 1.02 (major=1, minor=2) if you plan to write + any JFIF 1.02 extension markers. + +UINT8 density_unit +UINT16 X_density +UINT16 Y_density + The resolution information to be written into the JFIF marker; + not used otherwise. density_unit may be 0 for unknown, + 1 for dots/inch, or 2 for dots/cm. The default values are 0,1,1 + indicating square pixels of unknown size. + +boolean write_Adobe_marker + If TRUE, an Adobe APP14 marker is emitted. jpeg_set_defaults() and + jpeg_set_colorspace() set this TRUE if JPEG color space RGB, CMYK, + or YCCK is selected, otherwise FALSE. It is generally a bad idea + to set both write_JFIF_header and write_Adobe_marker. In fact, + you probably shouldn't change the default settings at all --- the + default behavior ensures that the JPEG file's color space can be + recognized by the decoder. + +JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS] + Pointers to coefficient quantization tables, one per table slot, + or NULL if no table is defined for a slot. Usually these should + be set via one of the above helper routines; jpeg_add_quant_table() + is general enough to define any quantization table. The other + routines will set up table slot 0 for luminance quality and table + slot 1 for chrominance. + +JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS] +JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS] + Pointers to Huffman coding tables, one per table slot, or NULL if + no table is defined for a slot. Slots 0 and 1 are filled with the + JPEG sample tables by jpeg_set_defaults(). If you need to allocate + more table structures, jpeg_alloc_huff_table() may be used. + Note that optimal Huffman tables can be computed for an image + by setting optimize_coding, as discussed above; there's seldom + any need to mess with providing your own Huffman tables. + +There are some additional cinfo fields which are not documented here +because you currently can't change them; for example, you can't set +arith_code TRUE because arithmetic coding is unsupported. + + +Per-component parameters are stored in the struct cinfo.comp_info[i] for +component number i. Note that components here refer to components of the +JPEG color space, *not* the source image color space. A suitably large +comp_info[] array is allocated by jpeg_set_defaults(); if you choose not +to use that routine, it's up to you to allocate the array. + +int component_id + The one-byte identifier code to be recorded in the JPEG file for + this component. For the standard color spaces, we recommend you + leave the default values alone. + +int h_samp_factor +int v_samp_factor + Horizontal and vertical sampling factors for the component; must + be 1..4 according to the JPEG standard. Note that larger sampling + factors indicate a higher-resolution component; many people find + this behavior quite unintuitive. The default values are 2,2 for + luminance components and 1,1 for chrominance components, except + for grayscale where 1,1 is used. + +int quant_tbl_no + Quantization table number for component. The default value is + 0 for luminance components and 1 for chrominance components. + +int dc_tbl_no +int ac_tbl_no + DC and AC entropy coding table numbers. The default values are + 0 for luminance components and 1 for chrominance components. + +int component_index + Must equal the component's index in comp_info[]. (Beginning in + release v6, the compressor library will fill this in automatically; + you don't have to.) + + +Decompression parameter selection +--------------------------------- + +Decompression parameter selection is somewhat simpler than compression +parameter selection, since all of the JPEG internal parameters are +recorded in the source file and need not be supplied by the application. +(Unless you are working with abbreviated files, in which case see +"Abbreviated datastreams", below.) Decompression parameters control +the postprocessing done on the image to deliver it in a format suitable +for the application's use. Many of the parameters control speed/quality +tradeoffs, in which faster decompression may be obtained at the price of +a poorer-quality image. The defaults select the highest quality (slowest) +processing. + +The following fields in the JPEG object are set by jpeg_read_header() and +may be useful to the application in choosing decompression parameters: + +JDIMENSION image_width Width and height of image +JDIMENSION image_height +int num_components Number of color components +J_COLOR_SPACE jpeg_color_space Colorspace of image +boolean saw_JFIF_marker TRUE if a JFIF APP0 marker was seen + UINT8 JFIF_major_version Version information from JFIF marker + UINT8 JFIF_minor_version + UINT8 density_unit Resolution data from JFIF marker + UINT16 X_density + UINT16 Y_density +boolean saw_Adobe_marker TRUE if an Adobe APP14 marker was seen + UINT8 Adobe_transform Color transform code from Adobe marker + +The JPEG color space, unfortunately, is something of a guess since the JPEG +standard proper does not provide a way to record it. In practice most files +adhere to the JFIF or Adobe conventions, and the decoder will recognize these +correctly. See "Special color spaces", below, for more info. + + +The decompression parameters that determine the basic properties of the +returned image are: + +J_COLOR_SPACE out_color_space + Output color space. jpeg_read_header() sets an appropriate default + based on jpeg_color_space; typically it will be RGB or grayscale. + The application can change this field to request output in a different + colorspace. For example, set it to JCS_GRAYSCALE to get grayscale + output from a color file. (This is useful for previewing: grayscale + output is faster than full color since the color components need not + be processed.) Note that not all possible color space transforms are + currently implemented; you may need to extend jdcolor.c if you want an + unusual conversion. + +unsigned int scale_num, scale_denom + Scale the image by the fraction scale_num/scale_denom. Default is + 1/1, or no scaling. Currently, the only supported scaling ratios + are 1/1, 1/2, 1/4, and 1/8. (The library design allows for arbitrary + scaling ratios but this is not likely to be implemented any time soon.) + Smaller scaling ratios permit significantly faster decoding since + fewer pixels need be processed and a simpler IDCT method can be used. + +boolean quantize_colors + If set TRUE, colormapped output will be delivered. Default is FALSE, + meaning that full-color output will be delivered. + +The next three parameters are relevant only if quantize_colors is TRUE. + +int desired_number_of_colors + Maximum number of colors to use in generating a library-supplied color + map (the actual number of colors is returned in a different field). + Default 256. Ignored when the application supplies its own color map. + +boolean two_pass_quantize + If TRUE, an extra pass over the image is made to select a custom color + map for the image. This usually looks a lot better than the one-size- + fits-all colormap that is used otherwise. Default is TRUE. Ignored + when the application supplies its own color map. + +J_DITHER_MODE dither_mode + Selects color dithering method. Supported values are: + JDITHER_NONE no dithering: fast, very low quality + JDITHER_ORDERED ordered dither: moderate speed and quality + JDITHER_FS Floyd-Steinberg dither: slow, high quality + Default is JDITHER_FS. (At present, ordered dither is implemented + only in the single-pass, standard-colormap case. If you ask for + ordered dither when two_pass_quantize is TRUE or when you supply + an external color map, you'll get F-S dithering.) + +When quantize_colors is TRUE, the target color map is described by the next +two fields. colormap is set to NULL by jpeg_read_header(). The application +can supply a color map by setting colormap non-NULL and setting +actual_number_of_colors to the map size. Otherwise, jpeg_start_decompress() +selects a suitable color map and sets these two fields itself. +[Implementation restriction: at present, an externally supplied colormap is +only accepted for 3-component output color spaces.] + +JSAMPARRAY colormap + The color map, represented as a 2-D pixel array of out_color_components + rows and actual_number_of_colors columns. Ignored if not quantizing. + CAUTION: if the JPEG library creates its own colormap, the storage + pointed to by this field is released by jpeg_finish_decompress(). + Copy the colormap somewhere else first, if you want to save it. + +int actual_number_of_colors + The number of colors in the color map. + +Additional decompression parameters that the application may set include: + +J_DCT_METHOD dct_method + Selects the algorithm used for the DCT step. Choices are the same + as described above for compression. + +boolean do_fancy_upsampling + If TRUE, do careful upsampling of chroma components. If FALSE, + a faster but sloppier method is used. Default is TRUE. The visual + impact of the sloppier method is often very small. + +boolean do_block_smoothing + If TRUE, interblock smoothing is applied in early stages of decoding + progressive JPEG files; if FALSE, not. Default is TRUE. Early + progression stages look "fuzzy" with smoothing, "blocky" without. + In any case, block smoothing ceases to be applied after the first few + AC coefficients are known to full accuracy, so it is relevant only + when using buffered-image mode for progressive images. + +boolean enable_1pass_quant +boolean enable_external_quant +boolean enable_2pass_quant + These are significant only in buffered-image mode, which is + described in its own section below. + + +The output image dimensions are given by the following fields. These are +computed from the source image dimensions and the decompression parameters +by jpeg_start_decompress(). You can also call jpeg_calc_output_dimensions() +to obtain the values that will result from the current parameter settings. +This can be useful if you are trying to pick a scaling ratio that will get +close to a desired target size. It's also important if you are using the +JPEG library's memory manager to allocate output buffer space, because you +are supposed to request such buffers *before* jpeg_start_decompress(). + +JDIMENSION output_width Actual dimensions of output image. +JDIMENSION output_height +int out_color_components Number of color components in out_color_space. +int output_components Number of color components returned. +int rec_outbuf_height Recommended height of scanline buffer. + +When quantizing colors, output_components is 1, indicating a single color map +index per pixel. Otherwise it equals out_color_components. The output arrays +are required to be output_width * output_components JSAMPLEs wide. + +rec_outbuf_height is the recommended minimum height (in scanlines) of the +buffer passed to jpeg_read_scanlines(). If the buffer is smaller, the +library will still work, but time will be wasted due to unnecessary data +copying. In high-quality modes, rec_outbuf_height is always 1, but some +faster, lower-quality modes set it to larger values (typically 2 to 4). +If you are going to ask for a high-speed processing mode, you may as well +go to the trouble of honoring rec_outbuf_height so as to avoid data copying. +(An output buffer larger than rec_outbuf_height lines is OK, but won't +provide any material speed improvement over that height.) + + +Special color spaces +-------------------- + +The JPEG standard itself is "color blind" and doesn't specify any particular +color space. It is customary to convert color data to a luminance/chrominance +color space before compressing, since this permits greater compression. The +existing de-facto JPEG file format standards specify YCbCr or grayscale data +(JFIF), or grayscale, RGB, YCbCr, CMYK, or YCCK (Adobe). For special +applications such as multispectral images, other color spaces can be used, +but it must be understood that such files will be unportable. + +The JPEG library can handle the most common colorspace conversions (namely +RGB <=> YCbCr and CMYK <=> YCCK). It can also deal with data of an unknown +color space, passing it through without conversion. If you deal extensively +with an unusual color space, you can easily extend the library to understand +additional color spaces and perform appropriate conversions. + +For compression, the source data's color space is specified by field +in_color_space. This is transformed to the JPEG file's color space given +by jpeg_color_space. jpeg_set_defaults() chooses a reasonable JPEG color +space depending on in_color_space, but you can override this by calling +jpeg_set_colorspace(). Of course you must select a supported transformation. +jccolor.c currently supports the following transformations: + RGB => YCbCr + RGB => GRAYSCALE + YCbCr => GRAYSCALE + CMYK => YCCK +plus the null transforms: GRAYSCALE => GRAYSCALE, RGB => RGB, +YCbCr => YCbCr, CMYK => CMYK, YCCK => YCCK, and UNKNOWN => UNKNOWN. + +The de-facto file format standards (JFIF and Adobe) specify APPn markers that +indicate the color space of the JPEG file. It is important to ensure that +these are written correctly, or omitted if the JPEG file's color space is not +one of the ones supported by the de-facto standards. jpeg_set_colorspace() +will set the compression parameters to include or omit the APPn markers +properly, so long as it is told the truth about the JPEG color space. +For example, if you are writing some random 3-component color space without +conversion, don't try to fake out the library by setting in_color_space and +jpeg_color_space to JCS_YCbCr; use JCS_UNKNOWN. You may want to write an +APPn marker of your own devising to identify the colorspace --- see "Special +markers", below. + +When told that the color space is UNKNOWN, the library will default to using +luminance-quality compression parameters for all color components. You may +well want to change these parameters. See the source code for +jpeg_set_colorspace(), in jcparam.c, for details. + +For decompression, the JPEG file's color space is given in jpeg_color_space, +and this is transformed to the output color space out_color_space. +jpeg_read_header's setting of jpeg_color_space can be relied on if the file +conforms to JFIF or Adobe conventions, but otherwise it is no better than a +guess. If you know the JPEG file's color space for certain, you can override +jpeg_read_header's guess by setting jpeg_color_space. jpeg_read_header also +selects a default output color space based on (its guess of) jpeg_color_space; +set out_color_space to override this. Again, you must select a supported +transformation. jdcolor.c currently supports + YCbCr => GRAYSCALE + YCbCr => RGB + GRAYSCALE => RGB + YCCK => CMYK +as well as the null transforms. (Since GRAYSCALE=>RGB is provided, an +application can force grayscale JPEGs to look like color JPEGs if it only +wants to handle one case.) + +The two-pass color quantizer, jquant2.c, is specialized to handle RGB data +(it weights distances appropriately for RGB colors). You'll need to modify +the code if you want to use it for non-RGB output color spaces. Note that +jquant2.c is used to map to an application-supplied colormap as well as for +the normal two-pass colormap selection process. + +CAUTION: it appears that Adobe Photoshop writes inverted data in CMYK JPEG +files: 0 represents 100% ink coverage, rather than 0% ink as you'd expect. +This is arguably a bug in Photoshop, but if you need to work with Photoshop +CMYK files, you will have to deal with it in your application. We cannot +"fix" this in the library by inverting the data during the CMYK<=>YCCK +transform, because that would break other applications, notably Ghostscript. +Photoshop versions prior to 3.0 write EPS files containing JPEG-encoded CMYK +data in the same inverted-YCCK representation used in bare JPEG files, but +the surrounding PostScript code performs an inversion using the PS image +operator. I am told that Photoshop 3.0 will write uninverted YCCK in +EPS/JPEG files, and will omit the PS-level inversion. (But the data +polarity used in bare JPEG files will not change in 3.0.) In either case, +the JPEG library must not invert the data itself, or else Ghostscript would +read these EPS files incorrectly. + + +Error handling +-------------- + +When the default error handler is used, any error detected inside the JPEG +routines will cause a message to be printed on stderr, followed by exit(). +You can supply your own error handling routines to override this behavior +and to control the treatment of nonfatal warnings and trace/debug messages. +The file example.c illustrates the most common case, which is to have the +application regain control after an error rather than exiting. + +The JPEG library never writes any message directly; it always goes through +the error handling routines. Three classes of messages are recognized: + * Fatal errors: the library cannot continue. + * Warnings: the library can continue, but the data is corrupt, and a + damaged output image is likely to result. + * Trace/informational messages. These come with a trace level indicating + the importance of the message; you can control the verbosity of the + program by adjusting the maximum trace level that will be displayed. + +You may, if you wish, simply replace the entire JPEG error handling module +(jerror.c) with your own code. However, you can avoid code duplication by +only replacing some of the routines depending on the behavior you need. +This is accomplished by calling jpeg_std_error() as usual, but then overriding +some of the method pointers in the jpeg_error_mgr struct, as illustrated by +example.c. + +All of the error handling routines will receive a pointer to the JPEG object +(a j_common_ptr which points to either a jpeg_compress_struct or a +jpeg_decompress_struct; if you need to tell which, test the is_decompressor +field). This struct includes a pointer to the error manager struct in its +"err" field. Frequently, custom error handler routines will need to access +additional data which is not known to the JPEG library or the standard error +handler. The most convenient way to do this is to embed either the JPEG +object or the jpeg_error_mgr struct in a larger structure that contains +additional fields; then casting the passed pointer provides access to the +additional fields. Again, see example.c for one way to do it. (Beginning +with IJG version 6b, there is also a void pointer "client_data" in each +JPEG object, which the application can also use to find related data. +The library does not touch client_data at all.) + +The individual methods that you might wish to override are: + +error_exit (j_common_ptr cinfo) + Receives control for a fatal error. Information sufficient to + generate the error message has been stored in cinfo->err; call + output_message to display it. Control must NOT return to the caller; + generally this routine will exit() or longjmp() somewhere. + Typically you would override this routine to get rid of the exit() + default behavior. Note that if you continue processing, you should + clean up the JPEG object with jpeg_abort() or jpeg_destroy(). + +output_message (j_common_ptr cinfo) + Actual output of any JPEG message. Override this to send messages + somewhere other than stderr. Note that this method does not know + how to generate a message, only where to send it. + +format_message (j_common_ptr cinfo, char * buffer) + Constructs a readable error message string based on the error info + stored in cinfo->err. This method is called by output_message. Few + applications should need to override this method. One possible + reason for doing so is to implement dynamic switching of error message + language. + +emit_message (j_common_ptr cinfo, int msg_level) + Decide whether or not to emit a warning or trace message; if so, + calls output_message. The main reason for overriding this method + would be to abort on warnings. msg_level is -1 for warnings, + 0 and up for trace messages. + +Only error_exit() and emit_message() are called from the rest of the JPEG +library; the other two are internal to the error handler. + +The actual message texts are stored in an array of strings which is pointed to +by the field err->jpeg_message_table. The messages are numbered from 0 to +err->last_jpeg_message, and it is these code numbers that are used in the +JPEG library code. You could replace the message texts (for instance, with +messages in French or German) by changing the message table pointer. See +jerror.h for the default texts. CAUTION: this table will almost certainly +change or grow from one library version to the next. + +It may be useful for an application to add its own message texts that are +handled by the same mechanism. The error handler supports a second "add-on" +message table for this purpose. To define an addon table, set the pointer +err->addon_message_table and the message numbers err->first_addon_message and +err->last_addon_message. If you number the addon messages beginning at 1000 +or so, you won't have to worry about conflicts with the library's built-in +messages. See the sample applications cjpeg/djpeg for an example of using +addon messages (the addon messages are defined in cderror.h). + +Actual invocation of the error handler is done via macros defined in jerror.h: + ERREXITn(...) for fatal errors + WARNMSn(...) for corrupt-data warnings + TRACEMSn(...) for trace and informational messages. +These macros store the message code and any additional parameters into the +error handler struct, then invoke the error_exit() or emit_message() method. +The variants of each macro are for varying numbers of additional parameters. +The additional parameters are inserted into the generated message using +standard printf() format codes. + +See jerror.h and jerror.c for further details. + + +Compressed data handling (source and destination managers) +---------------------------------------------------------- + +The JPEG compression library sends its compressed data to a "destination +manager" module. The default destination manager just writes the data to a +stdio stream, but you can provide your own manager to do something else. +Similarly, the decompression library calls a "source manager" to obtain the +compressed data; you can provide your own source manager if you want the data +to come from somewhere other than a stdio stream. + +In both cases, compressed data is processed a bufferload at a time: the +destination or source manager provides a work buffer, and the library invokes +the manager only when the buffer is filled or emptied. (You could define a +one-character buffer to force the manager to be invoked for each byte, but +that would be rather inefficient.) The buffer's size and location are +controlled by the manager, not by the library. For example, if you desired to +decompress a JPEG datastream that was all in memory, you could just make the +buffer pointer and length point to the original data in memory. Then the +buffer-reload procedure would be invoked only if the decompressor ran off the +end of the datastream, which would indicate an erroneous datastream. + +The work buffer is defined as an array of datatype JOCTET, which is generally +"char" or "unsigned char". On a machine where char is not exactly 8 bits +wide, you must define JOCTET as a wider data type and then modify the data +source and destination modules to transcribe the work arrays into 8-bit units +on external storage. + +A data destination manager struct contains a pointer and count defining the +next byte to write in the work buffer and the remaining free space: + + JOCTET * next_output_byte; /* => next byte to write in buffer */ + size_t free_in_buffer; /* # of byte spaces remaining in buffer */ + +The library increments the pointer and decrements the count until the buffer +is filled. The manager's empty_output_buffer method must reset the pointer +and count. The manager is expected to remember the buffer's starting address +and total size in private fields not visible to the library. + +A data destination manager provides three methods: + +init_destination (j_compress_ptr cinfo) + Initialize destination. This is called by jpeg_start_compress() + before any data is actually written. It must initialize + next_output_byte and free_in_buffer. free_in_buffer must be + initialized to a positive value. + +empty_output_buffer (j_compress_ptr cinfo) + This is called whenever the buffer has filled (free_in_buffer + reaches zero). In typical applications, it should write out the + *entire* buffer (use the saved start address and buffer length; + ignore the current state of next_output_byte and free_in_buffer). + Then reset the pointer & count to the start of the buffer, and + return TRUE indicating that the buffer has been dumped. + free_in_buffer must be set to a positive value when TRUE is + returned. A FALSE return should only be used when I/O suspension is + desired (this operating mode is discussed in the next section). + +term_destination (j_compress_ptr cinfo) + Terminate destination --- called by jpeg_finish_compress() after all + data has been written. In most applications, this must flush any + data remaining in the buffer. Use either next_output_byte or + free_in_buffer to determine how much data is in the buffer. + +term_destination() is NOT called by jpeg_abort() or jpeg_destroy(). If you +want the destination manager to be cleaned up during an abort, you must do it +yourself. + +You will also need code to create a jpeg_destination_mgr struct, fill in its +method pointers, and insert a pointer to the struct into the "dest" field of +the JPEG compression object. This can be done in-line in your setup code if +you like, but it's probably cleaner to provide a separate routine similar to +the jpeg_stdio_dest() routine of the supplied destination manager. + +Decompression source managers follow a parallel design, but with some +additional frammishes. The source manager struct contains a pointer and count +defining the next byte to read from the work buffer and the number of bytes +remaining: + + const JOCTET * next_input_byte; /* => next byte to read from buffer */ + size_t bytes_in_buffer; /* # of bytes remaining in buffer */ + +The library increments the pointer and decrements the count until the buffer +is emptied. The manager's fill_input_buffer method must reset the pointer and +count. In most applications, the manager must remember the buffer's starting +address and total size in private fields not visible to the library. + +A data source manager provides five methods: + +init_source (j_decompress_ptr cinfo) + Initialize source. This is called by jpeg_read_header() before any + data is actually read. Unlike init_destination(), it may leave + bytes_in_buffer set to 0 (in which case a fill_input_buffer() call + will occur immediately). + +fill_input_buffer (j_decompress_ptr cinfo) + This is called whenever bytes_in_buffer has reached zero and more + data is wanted. In typical applications, it should read fresh data + into the buffer (ignoring the current state of next_input_byte and + bytes_in_buffer), reset the pointer & count to the start of the + buffer, and return TRUE indicating that the buffer has been reloaded. + It is not necessary to fill the buffer entirely, only to obtain at + least one more byte. bytes_in_buffer MUST be set to a positive value + if TRUE is returned. A FALSE return should only be used when I/O + suspension is desired (this mode is discussed in the next section). + +skip_input_data (j_decompress_ptr cinfo, long num_bytes) + Skip num_bytes worth of data. The buffer pointer and count should + be advanced over num_bytes input bytes, refilling the buffer as + needed. This is used to skip over a potentially large amount of + uninteresting data (such as an APPn marker). In some applications + it may be possible to optimize away the reading of the skipped data, + but it's not clear that being smart is worth much trouble; large + skips are uncommon. bytes_in_buffer may be zero on return. + A zero or negative skip count should be treated as a no-op. + +resync_to_restart (j_decompress_ptr cinfo, int desired) + This routine is called only when the decompressor has failed to find + a restart (RSTn) marker where one is expected. Its mission is to + find a suitable point for resuming decompression. For most + applications, we recommend that you just use the default resync + procedure, jpeg_resync_to_restart(). However, if you are able to back + up in the input data stream, or if you have a-priori knowledge about + the likely location of restart markers, you may be able to do better. + Read the read_restart_marker() and jpeg_resync_to_restart() routines + in jdmarker.c if you think you'd like to implement your own resync + procedure. + +term_source (j_decompress_ptr cinfo) + Terminate source --- called by jpeg_finish_decompress() after all + data has been read. Often a no-op. + +For both fill_input_buffer() and skip_input_data(), there is no such thing +as an EOF return. If the end of the file has been reached, the routine has +a choice of exiting via ERREXIT() or inserting fake data into the buffer. +In most cases, generating a warning message and inserting a fake EOI marker +is the best course of action --- this will allow the decompressor to output +however much of the image is there. In pathological cases, the decompressor +may swallow the EOI and again demand data ... just keep feeding it fake EOIs. +jdatasrc.c illustrates the recommended error recovery behavior. + +term_source() is NOT called by jpeg_abort() or jpeg_destroy(). If you want +the source manager to be cleaned up during an abort, you must do it yourself. + +You will also need code to create a jpeg_source_mgr struct, fill in its method +pointers, and insert a pointer to the struct into the "src" field of the JPEG +decompression object. This can be done in-line in your setup code if you +like, but it's probably cleaner to provide a separate routine similar to the +jpeg_stdio_src() routine of the supplied source manager. + +For more information, consult the stdio source and destination managers +in jdatasrc.c and jdatadst.c. + + +I/O suspension +-------------- + +Some applications need to use the JPEG library as an incremental memory-to- +memory filter: when the compressed data buffer is filled or emptied, they want +control to return to the outer loop, rather than expecting that the buffer can +be emptied or reloaded within the data source/destination manager subroutine. +The library supports this need by providing an "I/O suspension" mode, which we +describe in this section. + +The I/O suspension mode is not a panacea: nothing is guaranteed about the +maximum amount of time spent in any one call to the library, so it will not +eliminate response-time problems in single-threaded applications. If you +need guaranteed response time, we suggest you "bite the bullet" and implement +a real multi-tasking capability. + +To use I/O suspension, cooperation is needed between the calling application +and the data source or destination manager; you will always need a custom +source/destination manager. (Please read the previous section if you haven't +already.) The basic idea is that the empty_output_buffer() or +fill_input_buffer() routine is a no-op, merely returning FALSE to indicate +that it has done nothing. Upon seeing this, the JPEG library suspends +operation and returns to its caller. The surrounding application is +responsible for emptying or refilling the work buffer before calling the +JPEG library again. + +Compression suspension: + +For compression suspension, use an empty_output_buffer() routine that returns +FALSE; typically it will not do anything else. This will cause the +compressor to return to the caller of jpeg_write_scanlines(), with the return +value indicating that not all the supplied scanlines have been accepted. +The application must make more room in the output buffer, adjust the output +buffer pointer/count appropriately, and then call jpeg_write_scanlines() +again, pointing to the first unconsumed scanline. + +When forced to suspend, the compressor will backtrack to a convenient stopping +point (usually the start of the current MCU); it will regenerate some output +data when restarted. Therefore, although empty_output_buffer() is only +called when the buffer is filled, you should NOT write out the entire buffer +after a suspension. Write only the data up to the current position of +next_output_byte/free_in_buffer. The data beyond that point will be +regenerated after resumption. + +Because of the backtracking behavior, a good-size output buffer is essential +for efficiency; you don't want the compressor to suspend often. (In fact, an +overly small buffer could lead to infinite looping, if a single MCU required +more data than would fit in the buffer.) We recommend a buffer of at least +several Kbytes. You may want to insert explicit code to ensure that you don't +call jpeg_write_scanlines() unless there is a reasonable amount of space in +the output buffer; in other words, flush the buffer before trying to compress +more data. + +The compressor does not allow suspension while it is trying to write JPEG +markers at the beginning and end of the file. This means that: + * At the beginning of a compression operation, there must be enough free + space in the output buffer to hold the header markers (typically 600 or + so bytes). The recommended buffer size is bigger than this anyway, so + this is not a problem as long as you start with an empty buffer. However, + this restriction might catch you if you insert large special markers, such + as a JFIF thumbnail image, without flushing the buffer afterwards. + * When you call jpeg_finish_compress(), there must be enough space in the + output buffer to emit any buffered data and the final EOI marker. In the + current implementation, half a dozen bytes should suffice for this, but + for safety's sake we recommend ensuring that at least 100 bytes are free + before calling jpeg_finish_compress(). + +A more significant restriction is that jpeg_finish_compress() cannot suspend. +This means you cannot use suspension with multi-pass operating modes, namely +Huffman code optimization and multiple-scan output. Those modes write the +whole file during jpeg_finish_compress(), which will certainly result in +buffer overrun. (Note that this restriction applies only to compression, +not decompression. The decompressor supports input suspension in all of its +operating modes.) + +Decompression suspension: + +For decompression suspension, use a fill_input_buffer() routine that simply +returns FALSE (except perhaps during error recovery, as discussed below). +This will cause the decompressor to return to its caller with an indication +that suspension has occurred. This can happen at four places: + * jpeg_read_header(): will return JPEG_SUSPENDED. + * jpeg_start_decompress(): will return FALSE, rather than its usual TRUE. + * jpeg_read_scanlines(): will return the number of scanlines already + completed (possibly 0). + * jpeg_finish_decompress(): will return FALSE, rather than its usual TRUE. +The surrounding application must recognize these cases, load more data into +the input buffer, and repeat the call. In the case of jpeg_read_scanlines(), +increment the passed pointers past any scanlines successfully read. + +Just as with compression, the decompressor will typically backtrack to a +convenient restart point before suspending. When fill_input_buffer() is +called, next_input_byte/bytes_in_buffer point to the current restart point, +which is where the decompressor will backtrack to if FALSE is returned. +The data beyond that position must NOT be discarded if you suspend; it needs +to be re-read upon resumption. In most implementations, you'll need to shift +this data down to the start of your work buffer and then load more data after +it. Again, this behavior means that a several-Kbyte work buffer is essential +for decent performance; furthermore, you should load a reasonable amount of +new data before resuming decompression. (If you loaded, say, only one new +byte each time around, you could waste a LOT of cycles.) + +The skip_input_data() source manager routine requires special care in a +suspension scenario. This routine is NOT granted the ability to suspend the +decompressor; it can decrement bytes_in_buffer to zero, but no more. If the +requested skip distance exceeds the amount of data currently in the input +buffer, then skip_input_data() must set bytes_in_buffer to zero and record the +additional skip distance somewhere else. The decompressor will immediately +call fill_input_buffer(), which should return FALSE, which will cause a +suspension return. The surrounding application must then arrange to discard +the recorded number of bytes before it resumes loading the input buffer. +(Yes, this design is rather baroque, but it avoids complexity in the far more +common case where a non-suspending source manager is used.) + +If the input data has been exhausted, we recommend that you emit a warning +and insert dummy EOI markers just as a non-suspending data source manager +would do. This can be handled either in the surrounding application logic or +within fill_input_buffer(); the latter is probably more efficient. If +fill_input_buffer() knows that no more data is available, it can set the +pointer/count to point to a dummy EOI marker and then return TRUE just as +though it had read more data in a non-suspending situation. + +The decompressor does not attempt to suspend within standard JPEG markers; +instead it will backtrack to the start of the marker and reprocess the whole +marker next time. Hence the input buffer must be large enough to hold the +longest standard marker in the file. Standard JPEG markers should normally +not exceed a few hundred bytes each (DHT tables are typically the longest). +We recommend at least a 2K buffer for performance reasons, which is much +larger than any correct marker is likely to be. For robustness against +damaged marker length counts, you may wish to insert a test in your +application for the case that the input buffer is completely full and yet +the decoder has suspended without consuming any data --- otherwise, if this +situation did occur, it would lead to an endless loop. (The library can't +provide this test since it has no idea whether "the buffer is full", or +even whether there is a fixed-size input buffer.) + +The input buffer would need to be 64K to allow for arbitrary COM or APPn +markers, but these are handled specially: they are either saved into allocated +memory, or skipped over by calling skip_input_data(). In the former case, +suspension is handled correctly, and in the latter case, the problem of +buffer overrun is placed on skip_input_data's shoulders, as explained above. +Note that if you provide your own marker handling routine for large markers, +you should consider how to deal with buffer overflow. + +Multiple-buffer management: + +In some applications it is desirable to store the compressed data in a linked +list of buffer areas, so as to avoid data copying. This can be handled by +having empty_output_buffer() or fill_input_buffer() set the pointer and count +to reference the next available buffer; FALSE is returned only if no more +buffers are available. Although seemingly straightforward, there is a +pitfall in this approach: the backtrack that occurs when FALSE is returned +could back up into an earlier buffer. For example, when fill_input_buffer() +is called, the current pointer & count indicate the backtrack restart point. +Since fill_input_buffer() will set the pointer and count to refer to a new +buffer, the restart position must be saved somewhere else. Suppose a second +call to fill_input_buffer() occurs in the same library call, and no +additional input data is available, so fill_input_buffer must return FALSE. +If the JPEG library has not moved the pointer/count forward in the current +buffer, then *the correct restart point is the saved position in the prior +buffer*. Prior buffers may be discarded only after the library establishes +a restart point within a later buffer. Similar remarks apply for output into +a chain of buffers. + +The library will never attempt to backtrack over a skip_input_data() call, +so any skipped data can be permanently discarded. You still have to deal +with the case of skipping not-yet-received data, however. + +It's much simpler to use only a single buffer; when fill_input_buffer() is +called, move any unconsumed data (beyond the current pointer/count) down to +the beginning of this buffer and then load new data into the remaining buffer +space. This approach requires a little more data copying but is far easier +to get right. + + +Progressive JPEG support +------------------------ + +Progressive JPEG rearranges the stored data into a series of scans of +increasing quality. In situations where a JPEG file is transmitted across a +slow communications link, a decoder can generate a low-quality image very +quickly from the first scan, then gradually improve the displayed quality as +more scans are received. The final image after all scans are complete is +identical to that of a regular (sequential) JPEG file of the same quality +setting. Progressive JPEG files are often slightly smaller than equivalent +sequential JPEG files, but the possibility of incremental display is the main +reason for using progressive JPEG. + +The IJG encoder library generates progressive JPEG files when given a +suitable "scan script" defining how to divide the data into scans. +Creation of progressive JPEG files is otherwise transparent to the encoder. +Progressive JPEG files can also be read transparently by the decoder library. +If the decoding application simply uses the library as defined above, it +will receive a final decoded image without any indication that the file was +progressive. Of course, this approach does not allow incremental display. +To perform incremental display, an application needs to use the decoder +library's "buffered-image" mode, in which it receives a decoded image +multiple times. + +Each displayed scan requires about as much work to decode as a full JPEG +image of the same size, so the decoder must be fairly fast in relation to the +data transmission rate in order to make incremental display useful. However, +it is possible to skip displaying the image and simply add the incoming bits +to the decoder's coefficient buffer. This is fast because only Huffman +decoding need be done, not IDCT, upsampling, colorspace conversion, etc. +The IJG decoder library allows the application to switch dynamically between +displaying the image and simply absorbing the incoming bits. A properly +coded application can automatically adapt the number of display passes to +suit the time available as the image is received. Also, a final +higher-quality display cycle can be performed from the buffered data after +the end of the file is reached. + +Progressive compression: + +To create a progressive JPEG file (or a multiple-scan sequential JPEG file), +set the scan_info cinfo field to point to an array of scan descriptors, and +perform compression as usual. Instead of constructing your own scan list, +you can call the jpeg_simple_progression() helper routine to create a +recommended progression sequence; this method should be used by all +applications that don't want to get involved in the nitty-gritty of +progressive scan sequence design. (If you want to provide user control of +scan sequences, you may wish to borrow the scan script reading code found +in rdswitch.c, so that you can read scan script files just like cjpeg's.) +When scan_info is not NULL, the compression library will store DCT'd data +into a buffer array as jpeg_write_scanlines() is called, and will emit all +the requested scans during jpeg_finish_compress(). This implies that +multiple-scan output cannot be created with a suspending data destination +manager, since jpeg_finish_compress() does not support suspension. We +should also note that the compressor currently forces Huffman optimization +mode when creating a progressive JPEG file, because the default Huffman +tables are unsuitable for progressive files. + +Progressive decompression: + +When buffered-image mode is not used, the decoder library will read all of +a multi-scan file during jpeg_start_decompress(), so that it can provide a +final decoded image. (Here "multi-scan" means either progressive or +multi-scan sequential.) This makes multi-scan files transparent to the +decoding application. However, existing applications that used suspending +input with version 5 of the IJG library will need to be modified to check +for a suspension return from jpeg_start_decompress(). + +To perform incremental display, an application must use the library's +buffered-image mode. This is described in the next section. + + +Buffered-image mode +------------------- + +In buffered-image mode, the library stores the partially decoded image in a +coefficient buffer, from which it can be read out as many times as desired. +This mode is typically used for incremental display of progressive JPEG files, +but it can be used with any JPEG file. Each scan of a progressive JPEG file +adds more data (more detail) to the buffered image. The application can +display in lockstep with the source file (one display pass per input scan), +or it can allow input processing to outrun display processing. By making +input and display processing run independently, it is possible for the +application to adapt progressive display to a wide range of data transmission +rates. + +The basic control flow for buffered-image decoding is + + jpeg_create_decompress() + set data source + jpeg_read_header() + set overall decompression parameters + cinfo.buffered_image = TRUE; /* select buffered-image mode */ + jpeg_start_decompress() + for (each output pass) { + adjust output decompression parameters if required + jpeg_start_output() /* start a new output pass */ + for (all scanlines in image) { + jpeg_read_scanlines() + display scanlines + } + jpeg_finish_output() /* terminate output pass */ + } + jpeg_finish_decompress() + jpeg_destroy_decompress() + +This differs from ordinary unbuffered decoding in that there is an additional +level of looping. The application can choose how many output passes to make +and how to display each pass. + +The simplest approach to displaying progressive images is to do one display +pass for each scan appearing in the input file. In this case the outer loop +condition is typically + while (! jpeg_input_complete(&cinfo)) +and the start-output call should read + jpeg_start_output(&cinfo, cinfo.input_scan_number); +The second parameter to jpeg_start_output() indicates which scan of the input +file is to be displayed; the scans are numbered starting at 1 for this +purpose. (You can use a loop counter starting at 1 if you like, but using +the library's input scan counter is easier.) The library automatically reads +data as necessary to complete each requested scan, and jpeg_finish_output() +advances to the next scan or end-of-image marker (hence input_scan_number +will be incremented by the time control arrives back at jpeg_start_output()). +With this technique, data is read from the input file only as needed, and +input and output processing run in lockstep. + +After reading the final scan and reaching the end of the input file, the +buffered image remains available; it can be read additional times by +repeating the jpeg_start_output()/jpeg_read_scanlines()/jpeg_finish_output() +sequence. For example, a useful technique is to use fast one-pass color +quantization for display passes made while the image is arriving, followed by +a final display pass using two-pass quantization for highest quality. This +is done by changing the library parameters before the final output pass. +Changing parameters between passes is discussed in detail below. + +In general the last scan of a progressive file cannot be recognized as such +until after it is read, so a post-input display pass is the best approach if +you want special processing in the final pass. + +When done with the image, be sure to call jpeg_finish_decompress() to release +the buffered image (or just use jpeg_destroy_decompress()). + +If input data arrives faster than it can be displayed, the application can +cause the library to decode input data in advance of what's needed to produce +output. This is done by calling the routine jpeg_consume_input(). +The return value is one of the following: + JPEG_REACHED_SOS: reached an SOS marker (the start of a new scan) + JPEG_REACHED_EOI: reached the EOI marker (end of image) + JPEG_ROW_COMPLETED: completed reading one MCU row of compressed data + JPEG_SCAN_COMPLETED: completed reading last MCU row of current scan + JPEG_SUSPENDED: suspended before completing any of the above +(JPEG_SUSPENDED can occur only if a suspending data source is used.) This +routine can be called at any time after initializing the JPEG object. It +reads some additional data and returns when one of the indicated significant +events occurs. (If called after the EOI marker is reached, it will +immediately return JPEG_REACHED_EOI without attempting to read more data.) + +The library's output processing will automatically call jpeg_consume_input() +whenever the output processing overtakes the input; thus, simple lockstep +display requires no direct calls to jpeg_consume_input(). But by adding +calls to jpeg_consume_input(), you can absorb data in advance of what is +being displayed. This has two benefits: + * You can limit buildup of unprocessed data in your input buffer. + * You can eliminate extra display passes by paying attention to the + state of the library's input processing. + +The first of these benefits only requires interspersing calls to +jpeg_consume_input() with your display operations and any other processing +you may be doing. To avoid wasting cycles due to backtracking, it's best to +call jpeg_consume_input() only after a hundred or so new bytes have arrived. +This is discussed further under "I/O suspension", above. (Note: the JPEG +library currently is not thread-safe. You must not call jpeg_consume_input() +from one thread of control if a different library routine is working on the +same JPEG object in another thread.) + +When input arrives fast enough that more than one new scan is available +before you start a new output pass, you may as well skip the output pass +corresponding to the completed scan. This occurs for free if you pass +cinfo.input_scan_number as the target scan number to jpeg_start_output(). +The input_scan_number field is simply the index of the scan currently being +consumed by the input processor. You can ensure that this is up-to-date by +emptying the input buffer just before calling jpeg_start_output(): call +jpeg_consume_input() repeatedly until it returns JPEG_SUSPENDED or +JPEG_REACHED_EOI. + +The target scan number passed to jpeg_start_output() is saved in the +cinfo.output_scan_number field. The library's output processing calls +jpeg_consume_input() whenever the current input scan number and row within +that scan is less than or equal to the current output scan number and row. +Thus, input processing can "get ahead" of the output processing but is not +allowed to "fall behind". You can achieve several different effects by +manipulating this interlock rule. For example, if you pass a target scan +number greater than the current input scan number, the output processor will +wait until that scan starts to arrive before producing any output. (To avoid +an infinite loop, the target scan number is automatically reset to the last +scan number when the end of image is reached. Thus, if you specify a large +target scan number, the library will just absorb the entire input file and +then perform an output pass. This is effectively the same as what +jpeg_start_decompress() does when you don't select buffered-image mode.) +When you pass a target scan number equal to the current input scan number, +the image is displayed no faster than the current input scan arrives. The +final possibility is to pass a target scan number less than the current input +scan number; this disables the input/output interlock and causes the output +processor to simply display whatever it finds in the image buffer, without +waiting for input. (However, the library will not accept a target scan +number less than one, so you can't avoid waiting for the first scan.) + +When data is arriving faster than the output display processing can advance +through the image, jpeg_consume_input() will store data into the buffered +image beyond the point at which the output processing is reading data out +again. If the input arrives fast enough, it may "wrap around" the buffer to +the point where the input is more than one whole scan ahead of the output. +If the output processing simply proceeds through its display pass without +paying attention to the input, the effect seen on-screen is that the lower +part of the image is one or more scans better in quality than the upper part. +Then, when the next output scan is started, you have a choice of what target +scan number to use. The recommended choice is to use the current input scan +number at that time, which implies that you've skipped the output scans +corresponding to the input scans that were completed while you processed the +previous output scan. In this way, the decoder automatically adapts its +speed to the arriving data, by skipping output scans as necessary to keep up +with the arriving data. + +When using this strategy, you'll want to be sure that you perform a final +output pass after receiving all the data; otherwise your last display may not +be full quality across the whole screen. So the right outer loop logic is +something like this: + do { + absorb any waiting input by calling jpeg_consume_input() + final_pass = jpeg_input_complete(&cinfo); + adjust output decompression parameters if required + jpeg_start_output(&cinfo, cinfo.input_scan_number); + ... + jpeg_finish_output() + } while (! final_pass); +rather than quitting as soon as jpeg_input_complete() returns TRUE. This +arrangement makes it simple to use higher-quality decoding parameters +for the final pass. But if you don't want to use special parameters for +the final pass, the right loop logic is like this: + for (;;) { + absorb any waiting input by calling jpeg_consume_input() + jpeg_start_output(&cinfo, cinfo.input_scan_number); + ... + jpeg_finish_output() + if (jpeg_input_complete(&cinfo) && + cinfo.input_scan_number == cinfo.output_scan_number) + break; + } +In this case you don't need to know in advance whether an output pass is to +be the last one, so it's not necessary to have reached EOF before starting +the final output pass; rather, what you want to test is whether the output +pass was performed in sync with the final input scan. This form of the loop +will avoid an extra output pass whenever the decoder is able (or nearly able) +to keep up with the incoming data. + +When the data transmission speed is high, you might begin a display pass, +then find that much or all of the file has arrived before you can complete +the pass. (You can detect this by noting the JPEG_REACHED_EOI return code +from jpeg_consume_input(), or equivalently by testing jpeg_input_complete().) +In this situation you may wish to abort the current display pass and start a +new one using the newly arrived information. To do so, just call +jpeg_finish_output() and then start a new pass with jpeg_start_output(). + +A variant strategy is to abort and restart display if more than one complete +scan arrives during an output pass; this can be detected by noting +JPEG_REACHED_SOS returns and/or examining cinfo.input_scan_number. This +idea should be employed with caution, however, since the display process +might never get to the bottom of the image before being aborted, resulting +in the lower part of the screen being several passes worse than the upper. +In most cases it's probably best to abort an output pass only if the whole +file has arrived and you want to begin the final output pass immediately. + +When receiving data across a communication link, we recommend always using +the current input scan number for the output target scan number; if a +higher-quality final pass is to be done, it should be started (aborting any +incomplete output pass) as soon as the end of file is received. However, +many other strategies are possible. For example, the application can examine +the parameters of the current input scan and decide whether to display it or +not. If the scan contains only chroma data, one might choose not to use it +as the target scan, expecting that the scan will be small and will arrive +quickly. To skip to the next scan, call jpeg_consume_input() until it +returns JPEG_REACHED_SOS or JPEG_REACHED_EOI. Or just use the next higher +number as the target scan for jpeg_start_output(); but that method doesn't +let you inspect the next scan's parameters before deciding to display it. + + +In buffered-image mode, jpeg_start_decompress() never performs input and +thus never suspends. An application that uses input suspension with +buffered-image mode must be prepared for suspension returns from these +routines: +* jpeg_start_output() performs input only if you request 2-pass quantization + and the target scan isn't fully read yet. (This is discussed below.) +* jpeg_read_scanlines(), as always, returns the number of scanlines that it + was able to produce before suspending. +* jpeg_finish_output() will read any markers following the target scan, + up to the end of the file or the SOS marker that begins another scan. + (But it reads no input if jpeg_consume_input() has already reached the + end of the file or a SOS marker beyond the target output scan.) +* jpeg_finish_decompress() will read until the end of file, and thus can + suspend if the end hasn't already been reached (as can be tested by + calling jpeg_input_complete()). +jpeg_start_output(), jpeg_finish_output(), and jpeg_finish_decompress() +all return TRUE if they completed their tasks, FALSE if they had to suspend. +In the event of a FALSE return, the application must load more input data +and repeat the call. Applications that use non-suspending data sources need +not check the return values of these three routines. + + +It is possible to change decoding parameters between output passes in the +buffered-image mode. The decoder library currently supports only very +limited changes of parameters. ONLY THE FOLLOWING parameter changes are +allowed after jpeg_start_decompress() is called: +* dct_method can be changed before each call to jpeg_start_output(). + For example, one could use a fast DCT method for early scans, changing + to a higher quality method for the final scan. +* dither_mode can be changed before each call to jpeg_start_output(); + of course this has no impact if not using color quantization. Typically + one would use ordered dither for initial passes, then switch to + Floyd-Steinberg dither for the final pass. Caution: changing dither mode + can cause more memory to be allocated by the library. Although the amount + of memory involved is not large (a scanline or so), it may cause the + initial max_memory_to_use specification to be exceeded, which in the worst + case would result in an out-of-memory failure. +* do_block_smoothing can be changed before each call to jpeg_start_output(). + This setting is relevant only when decoding a progressive JPEG image. + During the first DC-only scan, block smoothing provides a very "fuzzy" look + instead of the very "blocky" look seen without it; which is better seems a + matter of personal taste. But block smoothing is nearly always a win + during later stages, especially when decoding a successive-approximation + image: smoothing helps to hide the slight blockiness that otherwise shows + up on smooth gradients until the lowest coefficient bits are sent. +* Color quantization mode can be changed under the rules described below. + You *cannot* change between full-color and quantized output (because that + would alter the required I/O buffer sizes), but you can change which + quantization method is used. + +When generating color-quantized output, changing quantization method is a +very useful way of switching between high-speed and high-quality display. +The library allows you to change among its three quantization methods: +1. Single-pass quantization to a fixed color cube. + Selected by cinfo.two_pass_quantize = FALSE and cinfo.colormap = NULL. +2. Single-pass quantization to an application-supplied colormap. + Selected by setting cinfo.colormap to point to the colormap (the value of + two_pass_quantize is ignored); also set cinfo.actual_number_of_colors. +3. Two-pass quantization to a colormap chosen specifically for the image. + Selected by cinfo.two_pass_quantize = TRUE and cinfo.colormap = NULL. + (This is the default setting selected by jpeg_read_header, but it is + probably NOT what you want for the first pass of progressive display!) +These methods offer successively better quality and lesser speed. However, +only the first method is available for quantizing in non-RGB color spaces. + +IMPORTANT: because the different quantizer methods have very different +working-storage requirements, the library requires you to indicate which +one(s) you intend to use before you call jpeg_start_decompress(). (If we did +not require this, the max_memory_to_use setting would be a complete fiction.) +You do this by setting one or more of these three cinfo fields to TRUE: + enable_1pass_quant Fixed color cube colormap + enable_external_quant Externally-supplied colormap + enable_2pass_quant Two-pass custom colormap +All three are initialized FALSE by jpeg_read_header(). But +jpeg_start_decompress() automatically sets TRUE the one selected by the +current two_pass_quantize and colormap settings, so you only need to set the +enable flags for any other quantization methods you plan to change to later. + +After setting the enable flags correctly at jpeg_start_decompress() time, you +can change to any enabled quantization method by setting two_pass_quantize +and colormap properly just before calling jpeg_start_output(). The following +special rules apply: +1. You must explicitly set cinfo.colormap to NULL when switching to 1-pass + or 2-pass mode from a different mode, or when you want the 2-pass + quantizer to be re-run to generate a new colormap. +2. To switch to an external colormap, or to change to a different external + colormap than was used on the prior pass, you must call + jpeg_new_colormap() after setting cinfo.colormap. +NOTE: if you want to use the same colormap as was used in the prior pass, +you should not do either of these things. This will save some nontrivial +switchover costs. +(These requirements exist because cinfo.colormap will always be non-NULL +after completing a prior output pass, since both the 1-pass and 2-pass +quantizers set it to point to their output colormaps. Thus you have to +do one of these two things to notify the library that something has changed. +Yup, it's a bit klugy, but it's necessary to do it this way for backwards +compatibility.) + +Note that in buffered-image mode, the library generates any requested colormap +during jpeg_start_output(), not during jpeg_start_decompress(). + +When using two-pass quantization, jpeg_start_output() makes a pass over the +buffered image to determine the optimum color map; it therefore may take a +significant amount of time, whereas ordinarily it does little work. The +progress monitor hook is called during this pass, if defined. It is also +important to realize that if the specified target scan number is greater than +or equal to the current input scan number, jpeg_start_output() will attempt +to consume input as it makes this pass. If you use a suspending data source, +you need to check for a FALSE return from jpeg_start_output() under these +conditions. The combination of 2-pass quantization and a not-yet-fully-read +target scan is the only case in which jpeg_start_output() will consume input. + + +Application authors who support buffered-image mode may be tempted to use it +for all JPEG images, even single-scan ones. This will work, but it is +inefficient: there is no need to create an image-sized coefficient buffer for +single-scan images. Requesting buffered-image mode for such an image wastes +memory. Worse, it can cost time on large images, since the buffered data has +to be swapped out or written to a temporary file. If you are concerned about +maximum performance on baseline JPEG files, you should use buffered-image +mode only when the incoming file actually has multiple scans. This can be +tested by calling jpeg_has_multiple_scans(), which will return a correct +result at any time after jpeg_read_header() completes. + +It is also worth noting that when you use jpeg_consume_input() to let input +processing get ahead of output processing, the resulting pattern of access to +the coefficient buffer is quite nonsequential. It's best to use the memory +manager jmemnobs.c if you can (ie, if you have enough real or virtual main +memory). If not, at least make sure that max_memory_to_use is set as high as +possible. If the JPEG memory manager has to use a temporary file, you will +probably see a lot of disk traffic and poor performance. (This could be +improved with additional work on the memory manager, but we haven't gotten +around to it yet.) + +In some applications it may be convenient to use jpeg_consume_input() for all +input processing, including reading the initial markers; that is, you may +wish to call jpeg_consume_input() instead of jpeg_read_header() during +startup. This works, but note that you must check for JPEG_REACHED_SOS and +JPEG_REACHED_EOI return codes as the equivalent of jpeg_read_header's codes. +Once the first SOS marker has been reached, you must call +jpeg_start_decompress() before jpeg_consume_input() will consume more input; +it'll just keep returning JPEG_REACHED_SOS until you do. If you read a +tables-only file this way, jpeg_consume_input() will return JPEG_REACHED_EOI +without ever returning JPEG_REACHED_SOS; be sure to check for this case. +If this happens, the decompressor will not read any more input until you call +jpeg_abort() to reset it. It is OK to call jpeg_consume_input() even when not +using buffered-image mode, but in that case it's basically a no-op after the +initial markers have been read: it will just return JPEG_SUSPENDED. + + +Abbreviated datastreams and multiple images +------------------------------------------- + +A JPEG compression or decompression object can be reused to process multiple +images. This saves a small amount of time per image by eliminating the +"create" and "destroy" operations, but that isn't the real purpose of the +feature. Rather, reuse of an object provides support for abbreviated JPEG +datastreams. Object reuse can also simplify processing a series of images in +a single input or output file. This section explains these features. + +A JPEG file normally contains several hundred bytes worth of quantization +and Huffman tables. In a situation where many images will be stored or +transmitted with identical tables, this may represent an annoying overhead. +The JPEG standard therefore permits tables to be omitted. The standard +defines three classes of JPEG datastreams: + * "Interchange" datastreams contain an image and all tables needed to decode + the image. These are the usual kind of JPEG file. + * "Abbreviated image" datastreams contain an image, but are missing some or + all of the tables needed to decode that image. + * "Abbreviated table specification" (henceforth "tables-only") datastreams + contain only table specifications. +To decode an abbreviated image, it is necessary to load the missing table(s) +into the decoder beforehand. This can be accomplished by reading a separate +tables-only file. A variant scheme uses a series of images in which the first +image is an interchange (complete) datastream, while subsequent ones are +abbreviated and rely on the tables loaded by the first image. It is assumed +that once the decoder has read a table, it will remember that table until a +new definition for the same table number is encountered. + +It is the application designer's responsibility to figure out how to associate +the correct tables with an abbreviated image. While abbreviated datastreams +can be useful in a closed environment, their use is strongly discouraged in +any situation where data exchange with other applications might be needed. +Caveat designer. + +The JPEG library provides support for reading and writing any combination of +tables-only datastreams and abbreviated images. In both compression and +decompression objects, a quantization or Huffman table will be retained for +the lifetime of the object, unless it is overwritten by a new table definition. + + +To create abbreviated image datastreams, it is only necessary to tell the +compressor not to emit some or all of the tables it is using. Each +quantization and Huffman table struct contains a boolean field "sent_table", +which normally is initialized to FALSE. For each table used by the image, the +header-writing process emits the table and sets sent_table = TRUE unless it is +already TRUE. (In normal usage, this prevents outputting the same table +definition multiple times, as would otherwise occur because the chroma +components typically share tables.) Thus, setting this field to TRUE before +calling jpeg_start_compress() will prevent the table from being written at +all. + +If you want to create a "pure" abbreviated image file containing no tables, +just call "jpeg_suppress_tables(&cinfo, TRUE)" after constructing all the +tables. If you want to emit some but not all tables, you'll need to set the +individual sent_table fields directly. + +To create an abbreviated image, you must also call jpeg_start_compress() +with a second parameter of FALSE, not TRUE. Otherwise jpeg_start_compress() +will force all the sent_table fields to FALSE. (This is a safety feature to +prevent abbreviated images from being created accidentally.) + +To create a tables-only file, perform the same parameter setup that you +normally would, but instead of calling jpeg_start_compress() and so on, call +jpeg_write_tables(&cinfo). This will write an abbreviated datastream +containing only SOI, DQT and/or DHT markers, and EOI. All the quantization +and Huffman tables that are currently defined in the compression object will +be emitted unless their sent_tables flag is already TRUE, and then all the +sent_tables flags will be set TRUE. + +A sure-fire way to create matching tables-only and abbreviated image files +is to proceed as follows: + + create JPEG compression object + set JPEG parameters + set destination to tables-only file + jpeg_write_tables(&cinfo); + set destination to image file + jpeg_start_compress(&cinfo, FALSE); + write data... + jpeg_finish_compress(&cinfo); + +Since the JPEG parameters are not altered between writing the table file and +the abbreviated image file, the same tables are sure to be used. Of course, +you can repeat the jpeg_start_compress() ... jpeg_finish_compress() sequence +many times to produce many abbreviated image files matching the table file. + +You cannot suppress output of the computed Huffman tables when Huffman +optimization is selected. (If you could, there'd be no way to decode the +image...) Generally, you don't want to set optimize_coding = TRUE when +you are trying to produce abbreviated files. + +In some cases you might want to compress an image using tables which are +not stored in the application, but are defined in an interchange or +tables-only file readable by the application. This can be done by setting up +a JPEG decompression object to read the specification file, then copying the +tables into your compression object. See jpeg_copy_critical_parameters() +for an example of copying quantization tables. + + +To read abbreviated image files, you simply need to load the proper tables +into the decompression object before trying to read the abbreviated image. +If the proper tables are stored in the application program, you can just +allocate the table structs and fill in their contents directly. For example, +to load a fixed quantization table into table slot "n": + + if (cinfo.quant_tbl_ptrs[n] == NULL) + cinfo.quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) &cinfo); + quant_ptr = cinfo.quant_tbl_ptrs[n]; /* quant_ptr is JQUANT_TBL* */ + for (i = 0; i < 64; i++) { + /* Qtable[] is desired quantization table, in natural array order */ + quant_ptr->quantval[i] = Qtable[i]; + } + +Code to load a fixed Huffman table is typically (for AC table "n"): + + if (cinfo.ac_huff_tbl_ptrs[n] == NULL) + cinfo.ac_huff_tbl_ptrs[n] = jpeg_alloc_huff_table((j_common_ptr) &cinfo); + huff_ptr = cinfo.ac_huff_tbl_ptrs[n]; /* huff_ptr is JHUFF_TBL* */ + for (i = 1; i <= 16; i++) { + /* counts[i] is number of Huffman codes of length i bits, i=1..16 */ + huff_ptr->bits[i] = counts[i]; + } + for (i = 0; i < 256; i++) { + /* symbols[] is the list of Huffman symbols, in code-length order */ + huff_ptr->huffval[i] = symbols[i]; + } + +(Note that trying to set cinfo.quant_tbl_ptrs[n] to point directly at a +constant JQUANT_TBL object is not safe. If the incoming file happened to +contain a quantization table definition, your master table would get +overwritten! Instead allocate a working table copy and copy the master table +into it, as illustrated above. Ditto for Huffman tables, of course.) + +You might want to read the tables from a tables-only file, rather than +hard-wiring them into your application. The jpeg_read_header() call is +sufficient to read a tables-only file. You must pass a second parameter of +FALSE to indicate that you do not require an image to be present. Thus, the +typical scenario is + + create JPEG decompression object + set source to tables-only file + jpeg_read_header(&cinfo, FALSE); + set source to abbreviated image file + jpeg_read_header(&cinfo, TRUE); + set decompression parameters + jpeg_start_decompress(&cinfo); + read data... + jpeg_finish_decompress(&cinfo); + +In some cases, you may want to read a file without knowing whether it contains +an image or just tables. In that case, pass FALSE and check the return value +from jpeg_read_header(): it will be JPEG_HEADER_OK if an image was found, +JPEG_HEADER_TABLES_ONLY if only tables were found. (A third return value, +JPEG_SUSPENDED, is possible when using a suspending data source manager.) +Note that jpeg_read_header() will not complain if you read an abbreviated +image for which you haven't loaded the missing tables; the missing-table check +occurs later, in jpeg_start_decompress(). + + +It is possible to read a series of images from a single source file by +repeating the jpeg_read_header() ... jpeg_finish_decompress() sequence, +without releasing/recreating the JPEG object or the data source module. +(If you did reinitialize, any partial bufferload left in the data source +buffer at the end of one image would be discarded, causing you to lose the +start of the next image.) When you use this method, stored tables are +automatically carried forward, so some of the images can be abbreviated images +that depend on tables from earlier images. + +If you intend to write a series of images into a single destination file, +you might want to make a specialized data destination module that doesn't +flush the output buffer at term_destination() time. This would speed things +up by some trifling amount. Of course, you'd need to remember to flush the +buffer after the last image. You can make the later images be abbreviated +ones by passing FALSE to jpeg_start_compress(). + + +Special markers +--------------- + +Some applications may need to insert or extract special data in the JPEG +datastream. The JPEG standard provides marker types "COM" (comment) and +"APP0" through "APP15" (application) to hold application-specific data. +Unfortunately, the use of these markers is not specified by the standard. +COM markers are fairly widely used to hold user-supplied text. The JFIF file +format spec uses APP0 markers with specified initial strings to hold certain +data. Adobe applications use APP14 markers beginning with the string "Adobe" +for miscellaneous data. Other APPn markers are rarely seen, but might +contain almost anything. + +If you wish to store user-supplied text, we recommend you use COM markers +and place readable 7-bit ASCII text in them. Newline conventions are not +standardized --- expect to find LF (Unix style), CR/LF (DOS style), or CR +(Mac style). A robust COM reader should be able to cope with random binary +garbage, including nulls, since some applications generate COM markers +containing non-ASCII junk. (But yours should not be one of them.) + +For program-supplied data, use an APPn marker, and be sure to begin it with an +identifying string so that you can tell whether the marker is actually yours. +It's probably best to avoid using APP0 or APP14 for any private markers. +(NOTE: the upcoming SPIFF standard will use APP8 markers; we recommend you +not use APP8 markers for any private purposes, either.) + +Keep in mind that at most 65533 bytes can be put into one marker, but you +can have as many markers as you like. + +By default, the IJG compression library will write a JFIF APP0 marker if the +selected JPEG colorspace is grayscale or YCbCr, or an Adobe APP14 marker if +the selected colorspace is RGB, CMYK, or YCCK. You can disable this, but +we don't recommend it. The decompression library will recognize JFIF and +Adobe markers and will set the JPEG colorspace properly when one is found. + + +You can write special markers immediately following the datastream header by +calling jpeg_write_marker() after jpeg_start_compress() and before the first +call to jpeg_write_scanlines(). When you do this, the markers appear after +the SOI and the JFIF APP0 and Adobe APP14 markers (if written), but before +all else. Specify the marker type parameter as "JPEG_COM" for COM or +"JPEG_APP0 + n" for APPn. (Actually, jpeg_write_marker will let you write +any marker type, but we don't recommend writing any other kinds of marker.) +For example, to write a user comment string pointed to by comment_text: + jpeg_write_marker(cinfo, JPEG_COM, comment_text, strlen(comment_text)); + +If it's not convenient to store all the marker data in memory at once, +you can instead call jpeg_write_m_header() followed by multiple calls to +jpeg_write_m_byte(). If you do it this way, it's your responsibility to +call jpeg_write_m_byte() exactly the number of times given in the length +parameter to jpeg_write_m_header(). (This method lets you empty the +output buffer partway through a marker, which might be important when +using a suspending data destination module. In any case, if you are using +a suspending destination, you should flush its buffer after inserting +any special markers. See "I/O suspension".) + +Or, if you prefer to synthesize the marker byte sequence yourself, +you can just cram it straight into the data destination module. + +If you are writing JFIF 1.02 extension markers (thumbnail images), don't +forget to set cinfo.JFIF_minor_version = 2 so that the encoder will write the +correct JFIF version number in the JFIF header marker. The library's default +is to write version 1.01, but that's wrong if you insert any 1.02 extension +markers. (We could probably get away with just defaulting to 1.02, but there +used to be broken decoders that would complain about unknown minor version +numbers. To reduce compatibility risks it's safest not to write 1.02 unless +you are actually using 1.02 extensions.) + + +When reading, two methods of handling special markers are available: +1. You can ask the library to save the contents of COM and/or APPn markers +into memory, and then examine them at your leisure afterwards. +2. You can supply your own routine to process COM and/or APPn markers +on-the-fly as they are read. +The first method is simpler to use, especially if you are using a suspending +data source; writing a marker processor that copes with input suspension is +not easy (consider what happens if the marker is longer than your available +input buffer). However, the second method conserves memory since the marker +data need not be kept around after it's been processed. + +For either method, you'd normally set up marker handling after creating a +decompression object and before calling jpeg_read_header(), because the +markers of interest will typically be near the head of the file and so will +be scanned by jpeg_read_header. Once you've established a marker handling +method, it will be used for the life of that decompression object +(potentially many datastreams), unless you change it. Marker handling is +determined separately for COM markers and for each APPn marker code. + + +To save the contents of special markers in memory, call + jpeg_save_markers(cinfo, marker_code, length_limit) +where marker_code is the marker type to save, JPEG_COM or JPEG_APP0+n. +(To arrange to save all the special marker types, you need to call this +routine 17 times, for COM and APP0-APP15.) If the incoming marker is longer +than length_limit data bytes, only length_limit bytes will be saved; this +parameter allows you to avoid chewing up memory when you only need to see the +first few bytes of a potentially large marker. If you want to save all the +data, set length_limit to 0xFFFF; that is enough since marker lengths are only +16 bits. As a special case, setting length_limit to 0 prevents that marker +type from being saved at all. (That is the default behavior, in fact.) + +After jpeg_read_header() completes, you can examine the special markers by +following the cinfo->marker_list pointer chain. All the special markers in +the file appear in this list, in order of their occurrence in the file (but +omitting any markers of types you didn't ask for). Both the original data +length and the saved data length are recorded for each list entry; the latter +will not exceed length_limit for the particular marker type. Note that these +lengths exclude the marker length word, whereas the stored representation +within the JPEG file includes it. (Hence the maximum data length is really +only 65533.) + +It is possible that additional special markers appear in the file beyond the +SOS marker at which jpeg_read_header stops; if so, the marker list will be +extended during reading of the rest of the file. This is not expected to be +common, however. If you are short on memory you may want to reset the length +limit to zero for all marker types after finishing jpeg_read_header, to +ensure that the max_memory_to_use setting cannot be exceeded due to addition +of later markers. + +The marker list remains stored until you call jpeg_finish_decompress or +jpeg_abort, at which point the memory is freed and the list is set to empty. +(jpeg_destroy also releases the storage, of course.) + +Note that the library is internally interested in APP0 and APP14 markers; +if you try to set a small nonzero length limit on these types, the library +will silently force the length up to the minimum it wants. (But you can set +a zero length limit to prevent them from being saved at all.) Also, in a +16-bit environment, the maximum length limit may be constrained to less than +65533 by malloc() limitations. It is therefore best not to assume that the +effective length limit is exactly what you set it to be. + + +If you want to supply your own marker-reading routine, you do it by calling +jpeg_set_marker_processor(). A marker processor routine must have the +signature + boolean jpeg_marker_parser_method (j_decompress_ptr cinfo) +Although the marker code is not explicitly passed, the routine can find it +in cinfo->unread_marker. At the time of call, the marker proper has been +read from the data source module. The processor routine is responsible for +reading the marker length word and the remaining parameter bytes, if any. +Return TRUE to indicate success. (FALSE should be returned only if you are +using a suspending data source and it tells you to suspend. See the standard +marker processors in jdmarker.c for appropriate coding methods if you need to +use a suspending data source.) + +If you override the default APP0 or APP14 processors, it is up to you to +recognize JFIF and Adobe markers if you want colorspace recognition to occur +properly. We recommend copying and extending the default processors if you +want to do that. (A better idea is to save these marker types for later +examination by calling jpeg_save_markers(); that method doesn't interfere +with the library's own processing of these markers.) + +jpeg_set_marker_processor() and jpeg_save_markers() are mutually exclusive +--- if you call one it overrides any previous call to the other, for the +particular marker type specified. + +A simple example of an external COM processor can be found in djpeg.c. +Also, see jpegtran.c for an example of using jpeg_save_markers. + + +Raw (downsampled) image data +---------------------------- + +Some applications need to supply already-downsampled image data to the JPEG +compressor, or to receive raw downsampled data from the decompressor. The +library supports this requirement by allowing the application to write or +read raw data, bypassing the normal preprocessing or postprocessing steps. +The interface is different from the standard one and is somewhat harder to +use. If your interest is merely in bypassing color conversion, we recommend +that you use the standard interface and simply set jpeg_color_space = +in_color_space (or jpeg_color_space = out_color_space for decompression). +The mechanism described in this section is necessary only to supply or +receive downsampled image data, in which not all components have the same +dimensions. + + +To compress raw data, you must supply the data in the colorspace to be used +in the JPEG file (please read the earlier section on Special color spaces) +and downsampled to the sampling factors specified in the JPEG parameters. +You must supply the data in the format used internally by the JPEG library, +namely a JSAMPIMAGE array. This is an array of pointers to two-dimensional +arrays, each of type JSAMPARRAY. Each 2-D array holds the values for one +color component. This structure is necessary since the components are of +different sizes. If the image dimensions are not a multiple of the MCU size, +you must also pad the data correctly (usually, this is done by replicating +the last column and/or row). The data must be padded to a multiple of a DCT +block in each component: that is, each downsampled row must contain a +multiple of 8 valid samples, and there must be a multiple of 8 sample rows +for each component. (For applications such as conversion of digital TV +images, the standard image size is usually a multiple of the DCT block size, +so that no padding need actually be done.) + +The procedure for compression of raw data is basically the same as normal +compression, except that you call jpeg_write_raw_data() in place of +jpeg_write_scanlines(). Before calling jpeg_start_compress(), you must do +the following: + * Set cinfo->raw_data_in to TRUE. (It is set FALSE by jpeg_set_defaults().) + This notifies the library that you will be supplying raw data. + * Ensure jpeg_color_space is correct --- an explicit jpeg_set_colorspace() + call is a good idea. Note that since color conversion is bypassed, + in_color_space is ignored, except that jpeg_set_defaults() uses it to + choose the default jpeg_color_space setting. + * Ensure the sampling factors, cinfo->comp_info[i].h_samp_factor and + cinfo->comp_info[i].v_samp_factor, are correct. Since these indicate the + dimensions of the data you are supplying, it's wise to set them + explicitly, rather than assuming the library's defaults are what you want. + +To pass raw data to the library, call jpeg_write_raw_data() in place of +jpeg_write_scanlines(). The two routines work similarly except that +jpeg_write_raw_data takes a JSAMPIMAGE data array rather than JSAMPARRAY. +The scanlines count passed to and returned from jpeg_write_raw_data is +measured in terms of the component with the largest v_samp_factor. + +jpeg_write_raw_data() processes one MCU row per call, which is to say +v_samp_factor*DCTSIZE sample rows of each component. The passed num_lines +value must be at least max_v_samp_factor*DCTSIZE, and the return value will +be exactly that amount (or possibly some multiple of that amount, in future +library versions). This is true even on the last call at the bottom of the +image; don't forget to pad your data as necessary. + +The required dimensions of the supplied data can be computed for each +component as + cinfo->comp_info[i].width_in_blocks*DCTSIZE samples per row + cinfo->comp_info[i].height_in_blocks*DCTSIZE rows in image +after jpeg_start_compress() has initialized those fields. If the valid data +is smaller than this, it must be padded appropriately. For some sampling +factors and image sizes, additional dummy DCT blocks are inserted to make +the image a multiple of the MCU dimensions. The library creates such dummy +blocks itself; it does not read them from your supplied data. Therefore you +need never pad by more than DCTSIZE samples. An example may help here. +Assume 2h2v downsampling of YCbCr data, that is + cinfo->comp_info[0].h_samp_factor = 2 for Y + cinfo->comp_info[0].v_samp_factor = 2 + cinfo->comp_info[1].h_samp_factor = 1 for Cb + cinfo->comp_info[1].v_samp_factor = 1 + cinfo->comp_info[2].h_samp_factor = 1 for Cr + cinfo->comp_info[2].v_samp_factor = 1 +and suppose that the nominal image dimensions (cinfo->image_width and +cinfo->image_height) are 101x101 pixels. Then jpeg_start_compress() will +compute downsampled_width = 101 and width_in_blocks = 13 for Y, +downsampled_width = 51 and width_in_blocks = 7 for Cb and Cr (and the same +for the height fields). You must pad the Y data to at least 13*8 = 104 +columns and rows, the Cb/Cr data to at least 7*8 = 56 columns and rows. The +MCU height is max_v_samp_factor = 2 DCT rows so you must pass at least 16 +scanlines on each call to jpeg_write_raw_data(), which is to say 16 actual +sample rows of Y and 8 each of Cb and Cr. A total of 7 MCU rows are needed, +so you must pass a total of 7*16 = 112 "scanlines". The last DCT block row +of Y data is dummy, so it doesn't matter what you pass for it in the data +arrays, but the scanlines count must total up to 112 so that all of the Cb +and Cr data gets passed. + +Output suspension is supported with raw-data compression: if the data +destination module suspends, jpeg_write_raw_data() will return 0. +In this case the same data rows must be passed again on the next call. + + +Decompression with raw data output implies bypassing all postprocessing: +you cannot ask for rescaling or color quantization, for instance. More +seriously, you must deal with the color space and sampling factors present in +the incoming file. If your application only handles, say, 2h1v YCbCr data, +you must check for and fail on other color spaces or other sampling factors. +The library will not convert to a different color space for you. + +To obtain raw data output, set cinfo->raw_data_out = TRUE before +jpeg_start_decompress() (it is set FALSE by jpeg_read_header()). Be sure to +verify that the color space and sampling factors are ones you can handle. +Then call jpeg_read_raw_data() in place of jpeg_read_scanlines(). The +decompression process is otherwise the same as usual. + +jpeg_read_raw_data() returns one MCU row per call, and thus you must pass a +buffer of at least max_v_samp_factor*DCTSIZE scanlines (scanline counting is +the same as for raw-data compression). The buffer you pass must be large +enough to hold the actual data plus padding to DCT-block boundaries. As with +compression, any entirely dummy DCT blocks are not processed so you need not +allocate space for them, but the total scanline count includes them. The +above example of computing buffer dimensions for raw-data compression is +equally valid for decompression. + +Input suspension is supported with raw-data decompression: if the data source +module suspends, jpeg_read_raw_data() will return 0. You can also use +buffered-image mode to read raw data in multiple passes. + + +Really raw data: DCT coefficients +--------------------------------- + +It is possible to read or write the contents of a JPEG file as raw DCT +coefficients. This facility is mainly intended for use in lossless +transcoding between different JPEG file formats. Other possible applications +include lossless cropping of a JPEG image, lossless reassembly of a +multi-strip or multi-tile TIFF/JPEG file into a single JPEG datastream, etc. + +To read the contents of a JPEG file as DCT coefficients, open the file and do +jpeg_read_header() as usual. But instead of calling jpeg_start_decompress() +and jpeg_read_scanlines(), call jpeg_read_coefficients(). This will read the +entire image into a set of virtual coefficient-block arrays, one array per +component. The return value is a pointer to an array of virtual-array +descriptors. Each virtual array can be accessed directly using the JPEG +memory manager's access_virt_barray method (see Memory management, below, +and also read structure.doc's discussion of virtual array handling). Or, +for simple transcoding to a different JPEG file format, the array list can +just be handed directly to jpeg_write_coefficients(). + +Each block in the block arrays contains quantized coefficient values in +normal array order (not JPEG zigzag order). The block arrays contain only +DCT blocks containing real data; any entirely-dummy blocks added to fill out +interleaved MCUs at the right or bottom edges of the image are discarded +during reading and are not stored in the block arrays. (The size of each +block array can be determined from the width_in_blocks and height_in_blocks +fields of the component's comp_info entry.) This is also the data format +expected by jpeg_write_coefficients(). + +When you are done using the virtual arrays, call jpeg_finish_decompress() +to release the array storage and return the decompression object to an idle +state; or just call jpeg_destroy() if you don't need to reuse the object. + +If you use a suspending data source, jpeg_read_coefficients() will return +NULL if it is forced to suspend; a non-NULL return value indicates successful +completion. You need not test for a NULL return value when using a +non-suspending data source. + +It is also possible to call jpeg_read_coefficients() to obtain access to the +decoder's coefficient arrays during a normal decode cycle in buffered-image +mode. This frammish might be useful for progressively displaying an incoming +image and then re-encoding it without loss. To do this, decode in buffered- +image mode as discussed previously, then call jpeg_read_coefficients() after +the last jpeg_finish_output() call. The arrays will be available for your use +until you call jpeg_finish_decompress(). + + +To write the contents of a JPEG file as DCT coefficients, you must provide +the DCT coefficients stored in virtual block arrays. You can either pass +block arrays read from an input JPEG file by jpeg_read_coefficients(), or +allocate virtual arrays from the JPEG compression object and fill them +yourself. In either case, jpeg_write_coefficients() is substituted for +jpeg_start_compress() and jpeg_write_scanlines(). Thus the sequence is + * Create compression object + * Set all compression parameters as necessary + * Request virtual arrays if needed + * jpeg_write_coefficients() + * jpeg_finish_compress() + * Destroy or re-use compression object +jpeg_write_coefficients() is passed a pointer to an array of virtual block +array descriptors; the number of arrays is equal to cinfo.num_components. + +The virtual arrays need only have been requested, not realized, before +jpeg_write_coefficients() is called. A side-effect of +jpeg_write_coefficients() is to realize any virtual arrays that have been +requested from the compression object's memory manager. Thus, when obtaining +the virtual arrays from the compression object, you should fill the arrays +after calling jpeg_write_coefficients(). The data is actually written out +when you call jpeg_finish_compress(); jpeg_write_coefficients() only writes +the file header. + +When writing raw DCT coefficients, it is crucial that the JPEG quantization +tables and sampling factors match the way the data was encoded, or the +resulting file will be invalid. For transcoding from an existing JPEG file, +we recommend using jpeg_copy_critical_parameters(). This routine initializes +all the compression parameters to default values (like jpeg_set_defaults()), +then copies the critical information from a source decompression object. +The decompression object should have just been used to read the entire +JPEG input file --- that is, it should be awaiting jpeg_finish_decompress(). + +jpeg_write_coefficients() marks all tables stored in the compression object +as needing to be written to the output file (thus, it acts like +jpeg_start_compress(cinfo, TRUE)). This is for safety's sake, to avoid +emitting abbreviated JPEG files by accident. If you really want to emit an +abbreviated JPEG file, call jpeg_suppress_tables(), or set the tables' +individual sent_table flags, between calling jpeg_write_coefficients() and +jpeg_finish_compress(). + + +Progress monitoring +------------------- + +Some applications may need to regain control from the JPEG library every so +often. The typical use of this feature is to produce a percent-done bar or +other progress display. (For a simple example, see cjpeg.c or djpeg.c.) +Although you do get control back frequently during the data-transferring pass +(the jpeg_read_scanlines or jpeg_write_scanlines loop), any additional passes +will occur inside jpeg_finish_compress or jpeg_start_decompress; those +routines may take a long time to execute, and you don't get control back +until they are done. + +You can define a progress-monitor routine which will be called periodically +by the library. No guarantees are made about how often this call will occur, +so we don't recommend you use it for mouse tracking or anything like that. +At present, a call will occur once per MCU row, scanline, or sample row +group, whichever unit is convenient for the current processing mode; so the +wider the image, the longer the time between calls. During the data +transferring pass, only one call occurs per call of jpeg_read_scanlines or +jpeg_write_scanlines, so don't pass a large number of scanlines at once if +you want fine resolution in the progress count. (If you really need to use +the callback mechanism for time-critical tasks like mouse tracking, you could +insert additional calls inside some of the library's inner loops.) + +To establish a progress-monitor callback, create a struct jpeg_progress_mgr, +fill in its progress_monitor field with a pointer to your callback routine, +and set cinfo->progress to point to the struct. The callback will be called +whenever cinfo->progress is non-NULL. (This pointer is set to NULL by +jpeg_create_compress or jpeg_create_decompress; the library will not change +it thereafter. So if you allocate dynamic storage for the progress struct, +make sure it will live as long as the JPEG object does. Allocating from the +JPEG memory manager with lifetime JPOOL_PERMANENT will work nicely.) You +can use the same callback routine for both compression and decompression. + +The jpeg_progress_mgr struct contains four fields which are set by the library: + long pass_counter; /* work units completed in this pass */ + long pass_limit; /* total number of work units in this pass */ + int completed_passes; /* passes completed so far */ + int total_passes; /* total number of passes expected */ +During any one pass, pass_counter increases from 0 up to (not including) +pass_limit; the step size is usually but not necessarily 1. The pass_limit +value may change from one pass to another. The expected total number of +passes is in total_passes, and the number of passes already completed is in +completed_passes. Thus the fraction of work completed may be estimated as + completed_passes + (pass_counter/pass_limit) + -------------------------------------------- + total_passes +ignoring the fact that the passes may not be equal amounts of work. + +When decompressing, pass_limit can even change within a pass, because it +depends on the number of scans in the JPEG file, which isn't always known in +advance. The computed fraction-of-work-done may jump suddenly (if the library +discovers it has overestimated the number of scans) or even decrease (in the +opposite case). It is not wise to put great faith in the work estimate. + +When using the decompressor's buffered-image mode, the progress monitor work +estimate is likely to be completely unhelpful, because the library has no way +to know how many output passes will be demanded of it. Currently, the library +sets total_passes based on the assumption that there will be one more output +pass if the input file end hasn't yet been read (jpeg_input_complete() isn't +TRUE), but no more output passes if the file end has been reached when the +output pass is started. This means that total_passes will rise as additional +output passes are requested. If you have a way of determining the input file +size, estimating progress based on the fraction of the file that's been read +will probably be more useful than using the library's value. + + +Memory management +----------------- + +This section covers some key facts about the JPEG library's built-in memory +manager. For more info, please read structure.doc's section about the memory +manager, and consult the source code if necessary. + +All memory and temporary file allocation within the library is done via the +memory manager. If necessary, you can replace the "back end" of the memory +manager to control allocation yourself (for example, if you don't want the +library to use malloc() and free() for some reason). + +Some data is allocated "permanently" and will not be freed until the JPEG +object is destroyed. Most data is allocated "per image" and is freed by +jpeg_finish_compress, jpeg_finish_decompress, or jpeg_abort. You can call the +memory manager yourself to allocate structures that will automatically be +freed at these times. Typical code for this is + ptr = (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, size); +Use JPOOL_PERMANENT to get storage that lasts as long as the JPEG object. +Use alloc_large instead of alloc_small for anything bigger than a few Kbytes. +There are also alloc_sarray and alloc_barray routines that automatically +build 2-D sample or block arrays. + +The library's minimum space requirements to process an image depend on the +image's width, but not on its height, because the library ordinarily works +with "strip" buffers that are as wide as the image but just a few rows high. +Some operating modes (eg, two-pass color quantization) require full-image +buffers. Such buffers are treated as "virtual arrays": only the current strip +need be in memory, and the rest can be swapped out to a temporary file. + +If you use the simplest memory manager back end (jmemnobs.c), then no +temporary files are used; virtual arrays are simply malloc()'d. Images bigger +than memory can be processed only if your system supports virtual memory. +The other memory manager back ends support temporary files of various flavors +and thus work in machines without virtual memory. They may also be useful on +Unix machines if you need to process images that exceed available swap space. + +When using temporary files, the library will make the in-memory buffers for +its virtual arrays just big enough to stay within a "maximum memory" setting. +Your application can set this limit by setting cinfo->mem->max_memory_to_use +after creating the JPEG object. (Of course, there is still a minimum size for +the buffers, so the max-memory setting is effective only if it is bigger than +the minimum space needed.) If you allocate any large structures yourself, you +must allocate them before jpeg_start_compress() or jpeg_start_decompress() in +order to have them counted against the max memory limit. Also keep in mind +that space allocated with alloc_small() is ignored, on the assumption that +it's too small to be worth worrying about; so a reasonable safety margin +should be left when setting max_memory_to_use. + +If you use the jmemname.c or jmemdos.c memory manager back end, it is +important to clean up the JPEG object properly to ensure that the temporary +files get deleted. (This is especially crucial with jmemdos.c, where the +"temporary files" may be extended-memory segments; if they are not freed, +DOS will require a reboot to recover the memory.) Thus, with these memory +managers, it's a good idea to provide a signal handler that will trap any +early exit from your program. The handler should call either jpeg_abort() +or jpeg_destroy() for any active JPEG objects. A handler is not needed with +jmemnobs.c, and shouldn't be necessary with jmemansi.c or jmemmac.c either, +since the C library is supposed to take care of deleting files made with +tmpfile(). + + +Memory usage +------------ + +Working memory requirements while performing compression or decompression +depend on image dimensions, image characteristics (such as colorspace and +JPEG process), and operating mode (application-selected options). + +As of v6b, the decompressor requires: + 1. About 24K in more-or-less-fixed-size data. This varies a bit depending + on operating mode and image characteristics (particularly color vs. + grayscale), but it doesn't depend on image dimensions. + 2. Strip buffers (of size proportional to the image width) for IDCT and + upsampling results. The worst case for commonly used sampling factors + is about 34 bytes * width in pixels for a color image. A grayscale image + only needs about 8 bytes per pixel column. + 3. A full-image DCT coefficient buffer is needed to decode a multi-scan JPEG + file (including progressive JPEGs), or whenever you select buffered-image + mode. This takes 2 bytes/coefficient. At typical 2x2 sampling, that's + 3 bytes per pixel for a color image. Worst case (1x1 sampling) requires + 6 bytes/pixel. For grayscale, figure 2 bytes/pixel. + 4. To perform 2-pass color quantization, the decompressor also needs a + 128K color lookup table and a full-image pixel buffer (3 bytes/pixel). +This does not count any memory allocated by the application, such as a +buffer to hold the final output image. + +The above figures are valid for 8-bit JPEG data precision and a machine with +32-bit ints. For 12-bit JPEG data, double the size of the strip buffers and +quantization pixel buffer. The "fixed-size" data will be somewhat smaller +with 16-bit ints, larger with 64-bit ints. Also, CMYK or other unusual +color spaces will require different amounts of space. + +The full-image coefficient and pixel buffers, if needed at all, do not +have to be fully RAM resident; you can have the library use temporary +files instead when the total memory usage would exceed a limit you set. +(But if your OS supports virtual memory, it's probably better to just use +jmemnobs and let the OS do the swapping.) + +The compressor's memory requirements are similar, except that it has no need +for color quantization. Also, it needs a full-image DCT coefficient buffer +if Huffman-table optimization is asked for, even if progressive mode is not +requested. + +If you need more detailed information about memory usage in a particular +situation, you can enable the MEM_STATS code in jmemmgr.c. + + +Library compile-time options +---------------------------- + +A number of compile-time options are available by modifying jmorecfg.h. + +The JPEG standard provides for both the baseline 8-bit DCT process and +a 12-bit DCT process. The IJG code supports 12-bit lossy JPEG if you define +BITS_IN_JSAMPLE as 12 rather than 8. Note that this causes JSAMPLE to be +larger than a char, so it affects the surrounding application's image data. +The sample applications cjpeg and djpeg can support 12-bit mode only for PPM +and GIF file formats; you must disable the other file formats to compile a +12-bit cjpeg or djpeg. (install.doc has more information about that.) +At present, a 12-bit library can handle *only* 12-bit images, not both +precisions. (If you need to include both 8- and 12-bit libraries in a single +application, you could probably do it by defining NEED_SHORT_EXTERNAL_NAMES +for just one of the copies. You'd have to access the 8-bit and 12-bit copies +from separate application source files. This is untested ... if you try it, +we'd like to hear whether it works!) + +Note that a 12-bit library always compresses in Huffman optimization mode, +in order to generate valid Huffman tables. This is necessary because our +default Huffman tables only cover 8-bit data. If you need to output 12-bit +files in one pass, you'll have to supply suitable default Huffman tables. +You may also want to supply your own DCT quantization tables; the existing +quality-scaling code has been developed for 8-bit use, and probably doesn't +generate especially good tables for 12-bit. + +The maximum number of components (color channels) in the image is determined +by MAX_COMPONENTS. The JPEG standard allows up to 255 components, but we +expect that few applications will need more than four or so. + +On machines with unusual data type sizes, you may be able to improve +performance or reduce memory space by tweaking the various typedefs in +jmorecfg.h. In particular, on some RISC CPUs, access to arrays of "short"s +is quite slow; consider trading memory for speed by making JCOEF, INT16, and +UINT16 be "int" or "unsigned int". UINT8 is also a candidate to become int. +You probably don't want to make JSAMPLE be int unless you have lots of memory +to burn. + +You can reduce the size of the library by compiling out various optional +functions. To do this, undefine xxx_SUPPORTED symbols as necessary. + +You can also save a few K by not having text error messages in the library; +the standard error message table occupies about 5Kb. This is particularly +reasonable for embedded applications where there's no good way to display +a message anyway. To do this, remove the creation of the message table +(jpeg_std_message_table[]) from jerror.c, and alter format_message to do +something reasonable without it. You could output the numeric value of the +message code number, for example. If you do this, you can also save a couple +more K by modifying the TRACEMSn() macros in jerror.h to expand to nothing; +you don't need trace capability anyway, right? + + +Portability considerations +-------------------------- + +The JPEG library has been written to be extremely portable; the sample +applications cjpeg and djpeg are slightly less so. This section summarizes +the design goals in this area. (If you encounter any bugs that cause the +library to be less portable than is claimed here, we'd appreciate hearing +about them.) + +The code works fine on ANSI C, C++, and pre-ANSI C compilers, using any of +the popular system include file setups, and some not-so-popular ones too. +See install.doc for configuration procedures. + +The code is not dependent on the exact sizes of the C data types. As +distributed, we make the assumptions that + char is at least 8 bits wide + short is at least 16 bits wide + int is at least 16 bits wide + long is at least 32 bits wide +(These are the minimum requirements of the ANSI C standard.) Wider types will +work fine, although memory may be used inefficiently if char is much larger +than 8 bits or short is much bigger than 16 bits. The code should work +equally well with 16- or 32-bit ints. + +In a system where these assumptions are not met, you may be able to make the +code work by modifying the typedefs in jmorecfg.h. However, you will probably +have difficulty if int is less than 16 bits wide, since references to plain +int abound in the code. + +char can be either signed or unsigned, although the code runs faster if an +unsigned char type is available. If char is wider than 8 bits, you will need +to redefine JOCTET and/or provide custom data source/destination managers so +that JOCTET represents exactly 8 bits of data on external storage. + +The JPEG library proper does not assume ASCII representation of characters. +But some of the image file I/O modules in cjpeg/djpeg do have ASCII +dependencies in file-header manipulation; so does cjpeg's select_file_type() +routine. + +The JPEG library does not rely heavily on the C library. In particular, C +stdio is used only by the data source/destination modules and the error +handler, all of which are application-replaceable. (cjpeg/djpeg are more +heavily dependent on stdio.) malloc and free are called only from the memory +manager "back end" module, so you can use a different memory allocator by +replacing that one file. + +The code generally assumes that C names must be unique in the first 15 +characters. However, global function names can be made unique in the +first 6 characters by defining NEED_SHORT_EXTERNAL_NAMES. + +More info about porting the code may be gleaned by reading jconfig.doc, +jmorecfg.h, and jinclude.h. + + +Notes for MS-DOS implementors +----------------------------- + +The IJG code is designed to work efficiently in 80x86 "small" or "medium" +memory models (i.e., data pointers are 16 bits unless explicitly declared +"far"; code pointers can be either size). You may be able to use small +model to compile cjpeg or djpeg by itself, but you will probably have to use +medium model for any larger application. This won't make much difference in +performance. You *will* take a noticeable performance hit if you use a +large-data memory model (perhaps 10%-25%), and you should avoid "huge" model +if at all possible. + +The JPEG library typically needs 2Kb-3Kb of stack space. It will also +malloc about 20K-30K of near heap space while executing (and lots of far +heap, but that doesn't count in this calculation). This figure will vary +depending on selected operating mode, and to a lesser extent on image size. +There is also about 5Kb-6Kb of constant data which will be allocated in the +near data segment (about 4Kb of this is the error message table). +Thus you have perhaps 20K available for other modules' static data and near +heap space before you need to go to a larger memory model. The C library's +static data will account for several K of this, but that still leaves a good +deal for your needs. (If you are tight on space, you could reduce the sizes +of the I/O buffers allocated by jdatasrc.c and jdatadst.c, say from 4K to +1K. Another possibility is to move the error message table to far memory; +this should be doable with only localized hacking on jerror.c.) + +About 2K of the near heap space is "permanent" memory that will not be +released until you destroy the JPEG object. This is only an issue if you +save a JPEG object between compression or decompression operations. + +Far data space may also be a tight resource when you are dealing with large +images. The most memory-intensive case is decompression with two-pass color +quantization, or single-pass quantization to an externally supplied color +map. This requires a 128Kb color lookup table plus strip buffers amounting +to about 40 bytes per column for typical sampling ratios (eg, about 25600 +bytes for a 640-pixel-wide image). You may not be able to process wide +images if you have large data structures of your own. + +Of course, all of these concerns vanish if you use a 32-bit flat-memory-model +compiler, such as DJGPP or Watcom C. We highly recommend flat model if you +can use it; the JPEG library is significantly faster in flat model. diff --git a/third_party/windows/fltk-1.1.10/jpeg/makedepend b/third_party/windows/fltk-1.1.10/jpeg/makedepend new file mode 100644 index 0000000..c5f4bed --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/makedepend @@ -0,0 +1,94 @@ +# DO NOT DELETE + +jmemnobs.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jmemnobs.o: jerror.h jmemsys.h +jcapimin.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jcapimin.o: jerror.h +jcapistd.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jcapistd.o: jerror.h +jccoefct.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jccoefct.o: jerror.h +jccolor.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jccolor.o: jerror.h +jcdctmgr.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jcdctmgr.o: jerror.h jdct.h +jchuff.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jchuff.o: jerror.h jchuff.h +jcinit.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jcinit.o: jerror.h +jcmainct.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jcmainct.o: jerror.h +jcmarker.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jcmarker.o: jerror.h +jcmaster.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jcmaster.o: jerror.h +jcomapi.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jcomapi.o: jerror.h +jcparam.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jcparam.o: jerror.h +jcphuff.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jcphuff.o: jerror.h jchuff.h +jcprepct.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jcprepct.o: jerror.h +jcsample.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jcsample.o: jerror.h +jctrans.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jctrans.o: jerror.h +jdapimin.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdapimin.o: jerror.h +jdapistd.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdapistd.o: jerror.h +jdatadst.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdatadst.o: jerror.h +jdatasrc.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdatasrc.o: jerror.h +jdcoefct.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdcoefct.o: jerror.h +jdcolor.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdcolor.o: jerror.h +jddctmgr.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jddctmgr.o: jerror.h jdct.h +jdhuff.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdhuff.o: jerror.h jdhuff.h +jdinput.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdinput.o: jerror.h +jdmainct.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdmainct.o: jerror.h +jdmarker.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdmarker.o: jerror.h +jdmaster.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdmaster.o: jerror.h +jdmerge.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdmerge.o: jerror.h +jdphuff.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdphuff.o: jerror.h jdhuff.h +jdpostct.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdpostct.o: jerror.h +jdsample.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdsample.o: jerror.h +jdtrans.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jdtrans.o: jerror.h +jerror.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jerror.o: jerror.h jversion.h +jfdctflt.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jfdctflt.o: jerror.h jdct.h +jfdctfst.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jfdctfst.o: jerror.h jdct.h +jfdctint.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jfdctint.o: jerror.h jdct.h +jidctflt.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jidctflt.o: jerror.h jdct.h +jidctfst.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jidctfst.o: jerror.h jdct.h +jidctint.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jidctint.o: jerror.h jdct.h +jidctred.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jidctred.o: jerror.h jdct.h +jquant1.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jquant1.o: jerror.h +jquant2.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jquant2.o: jerror.h +jutils.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jutils.o: jerror.h +jmemmgr.o: jinclude.h jconfig.h ../config.h jpeglib.h jmorecfg.h jpegint.h +jmemmgr.o: jerror.h jmemsys.h diff --git a/third_party/windows/fltk-1.1.10/jpeg/makefile.wat b/third_party/windows/fltk-1.1.10/jpeg/makefile.wat new file mode 100644 index 0000000..0f8b9f4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/makefile.wat @@ -0,0 +1,67 @@ +# +# "$Id: makefile.wat 4359 2005-05-19 16:07:13Z mike $" +# +# JPEG library makefile for the Fast Light Toolkit (FLTK). +# +# Copyright 1997-2004 by Easy Software Products. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems to "fltk-bugs@fltk.org". +# + +LIBNAMEROOT=ftlk_jpeg + +!include ../watcom.mif + + +# +# Object files... +# + +LIBOBJS = jmemnobs.obj & + jcapimin.obj jcapistd.obj jccoefct.obj jccolor.obj jcdctmgr.obj & + jchuff.obj jcinit.obj jcmainct.obj jcmarker.obj jcmaster.obj jcomapi.obj & + jcparam.obj jcphuff.obj jcprepct.obj jcsample.obj jctrans.obj & + jdapimin.obj jdapistd.obj jdatadst.obj jdatasrc.obj jdcoefct.obj & + jdcolor.obj jddctmgr.obj jdhuff.obj jdinput.obj jdmainct.obj jdmarker.obj & + jdmaster.obj jdmerge.obj jdphuff.obj jdpostct.obj jdsample.obj & + jdtrans.obj jerror.obj jfdctflt.obj jfdctfst.obj jfdctint.obj & + jidctflt.obj jidctfst.obj jidctint.obj jidctred.obj jquant1.obj & + jquant2.obj jutils.obj jmemmgr.obj + +# +# Make all targets... +# + +all: $(LIBNAME) + +$(LIBNAME): $(LIBOBJS) + $(LIB) $(LIBOPTS) $@ $< + +# +# Clean all directories +# +clean : .SYMBOLIC + @echo Cleaning up. +CLEANEXTS = obj + @for %a in ($(CLEANEXTS)) do -rm -f $(ODIR)\*.%a + -rm -f *.err + -rm -f $(LIBNAME) + +# +# End of "$Id: makefile.wat 4359 2005-05-19 16:07:13Z mike $". +# diff --git a/third_party/windows/fltk-1.1.10/jpeg/structure.doc b/third_party/windows/fltk-1.1.10/jpeg/structure.doc new file mode 100644 index 0000000..4179e48 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/structure.doc @@ -0,0 +1,948 @@ +IJG JPEG LIBRARY: SYSTEM ARCHITECTURE + +Copyright (C) 1991-1995, Thomas G. Lane. +This file is part of the Independent JPEG Group's software. +For conditions of distribution and use, see the accompanying README file. + + +This file provides an overview of the architecture of the IJG JPEG software; +that is, the functions of the various modules in the system and the interfaces +between modules. For more precise details about any data structure or calling +convention, see the include files and comments in the source code. + +We assume that the reader is already somewhat familiar with the JPEG standard. +The README file includes references for learning about JPEG. The file +libjpeg.doc describes the library from the viewpoint of an application +programmer using the library; it's best to read that file before this one. +Also, the file coderules.doc describes the coding style conventions we use. + +In this document, JPEG-specific terminology follows the JPEG standard: + A "component" means a color channel, e.g., Red or Luminance. + A "sample" is a single component value (i.e., one number in the image data). + A "coefficient" is a frequency coefficient (a DCT transform output number). + A "block" is an 8x8 group of samples or coefficients. + An "MCU" (minimum coded unit) is an interleaved set of blocks of size + determined by the sampling factors, or a single block in a + noninterleaved scan. +We do not use the terms "pixel" and "sample" interchangeably. When we say +pixel, we mean an element of the full-size image, while a sample is an element +of the downsampled image. Thus the number of samples may vary across +components while the number of pixels does not. (This terminology is not used +rigorously throughout the code, but it is used in places where confusion would +otherwise result.) + + +*** System features *** + +The IJG distribution contains two parts: + * A subroutine library for JPEG compression and decompression. + * cjpeg/djpeg, two sample applications that use the library to transform + JFIF JPEG files to and from several other image formats. +cjpeg/djpeg are of no great intellectual complexity: they merely add a simple +command-line user interface and I/O routines for several uncompressed image +formats. This document concentrates on the library itself. + +We desire the library to be capable of supporting all JPEG baseline, extended +sequential, and progressive DCT processes. Hierarchical processes are not +supported. + +The library does not support the lossless (spatial) JPEG process. Lossless +JPEG shares little or no code with lossy JPEG, and would normally be used +without the extensive pre- and post-processing provided by this library. +We feel that lossless JPEG is better handled by a separate library. + +Within these limits, any set of compression parameters allowed by the JPEG +spec should be readable for decompression. (We can be more restrictive about +what formats we can generate.) Although the system design allows for all +parameter values, some uncommon settings are not yet implemented and may +never be; nonintegral sampling ratios are the prime example. Furthermore, +we treat 8-bit vs. 12-bit data precision as a compile-time switch, not a +run-time option, because most machines can store 8-bit pixels much more +compactly than 12-bit. + +For legal reasons, JPEG arithmetic coding is not currently supported, but +extending the library to include it would be straightforward. + +By itself, the library handles only interchange JPEG datastreams --- in +particular the widely used JFIF file format. The library can be used by +surrounding code to process interchange or abbreviated JPEG datastreams that +are embedded in more complex file formats. (For example, libtiff uses this +library to implement JPEG compression within the TIFF file format.) + +The library includes a substantial amount of code that is not covered by the +JPEG standard but is necessary for typical applications of JPEG. These +functions preprocess the image before JPEG compression or postprocess it after +decompression. They include colorspace conversion, downsampling/upsampling, +and color quantization. This code can be omitted if not needed. + +A wide range of quality vs. speed tradeoffs are possible in JPEG processing, +and even more so in decompression postprocessing. The decompression library +provides multiple implementations that cover most of the useful tradeoffs, +ranging from very-high-quality down to fast-preview operation. On the +compression side we have generally not provided low-quality choices, since +compression is normally less time-critical. It should be understood that the +low-quality modes may not meet the JPEG standard's accuracy requirements; +nonetheless, they are useful for viewers. + + +*** Portability issues *** + +Portability is an essential requirement for the library. The key portability +issues that show up at the level of system architecture are: + +1. Memory usage. We want the code to be able to run on PC-class machines +with limited memory. Images should therefore be processed sequentially (in +strips), to avoid holding the whole image in memory at once. Where a +full-image buffer is necessary, we should be able to use either virtual memory +or temporary files. + +2. Near/far pointer distinction. To run efficiently on 80x86 machines, the +code should distinguish "small" objects (kept in near data space) from +"large" ones (kept in far data space). This is an annoying restriction, but +fortunately it does not impact code quality for less brain-damaged machines, +and the source code clutter turns out to be minimal with sufficient use of +pointer typedefs. + +3. Data precision. We assume that "char" is at least 8 bits, "short" and +"int" at least 16, "long" at least 32. The code will work fine with larger +data sizes, although memory may be used inefficiently in some cases. However, +the JPEG compressed datastream must ultimately appear on external storage as a +sequence of 8-bit bytes if it is to conform to the standard. This may pose a +problem on machines where char is wider than 8 bits. The library represents +compressed data as an array of values of typedef JOCTET. If no data type +exactly 8 bits wide is available, custom data source and data destination +modules must be written to unpack and pack the chosen JOCTET datatype into +8-bit external representation. + + +*** System overview *** + +The compressor and decompressor are each divided into two main sections: +the JPEG compressor or decompressor proper, and the preprocessing or +postprocessing functions. The interface between these two sections is the +image data that the official JPEG spec regards as its input or output: this +data is in the colorspace to be used for compression, and it is downsampled +to the sampling factors to be used. The preprocessing and postprocessing +steps are responsible for converting a normal image representation to or from +this form. (Those few applications that want to deal with YCbCr downsampled +data can skip the preprocessing or postprocessing step.) + +Looking more closely, the compressor library contains the following main +elements: + + Preprocessing: + * Color space conversion (e.g., RGB to YCbCr). + * Edge expansion and downsampling. Optionally, this step can do simple + smoothing --- this is often helpful for low-quality source data. + JPEG proper: + * MCU assembly, DCT, quantization. + * Entropy coding (sequential or progressive, Huffman or arithmetic). + +In addition to these modules we need overall control, marker generation, +and support code (memory management & error handling). There is also a +module responsible for physically writing the output data --- typically +this is just an interface to fwrite(), but some applications may need to +do something else with the data. + +The decompressor library contains the following main elements: + + JPEG proper: + * Entropy decoding (sequential or progressive, Huffman or arithmetic). + * Dequantization, inverse DCT, MCU disassembly. + Postprocessing: + * Upsampling. Optionally, this step may be able to do more general + rescaling of the image. + * Color space conversion (e.g., YCbCr to RGB). This step may also + provide gamma adjustment [ currently it does not ]. + * Optional color quantization (e.g., reduction to 256 colors). + * Optional color precision reduction (e.g., 24-bit to 15-bit color). + [This feature is not currently implemented.] + +We also need overall control, marker parsing, and a data source module. +The support code (memory management & error handling) can be shared with +the compression half of the library. + +There may be several implementations of each of these elements, particularly +in the decompressor, where a wide range of speed/quality tradeoffs is very +useful. It must be understood that some of the best speedups involve +merging adjacent steps in the pipeline. For example, upsampling, color space +conversion, and color quantization might all be done at once when using a +low-quality ordered-dither technique. The system architecture is designed to +allow such merging where appropriate. + + +Note: it is convenient to regard edge expansion (padding to block boundaries) +as a preprocessing/postprocessing function, even though the JPEG spec includes +it in compression/decompression. We do this because downsampling/upsampling +can be simplified a little if they work on padded data: it's not necessary to +have special cases at the right and bottom edges. Therefore the interface +buffer is always an integral number of blocks wide and high, and we expect +compression preprocessing to pad the source data properly. Padding will occur +only to the next block (8-sample) boundary. In an interleaved-scan situation, +additional dummy blocks may be used to fill out MCUs, but the MCU assembly and +disassembly logic will create or discard these blocks internally. (This is +advantageous for speed reasons, since we avoid DCTing the dummy blocks. +It also permits a small reduction in file size, because the compressor can +choose dummy block contents so as to minimize their size in compressed form. +Finally, it makes the interface buffer specification independent of whether +the file is actually interleaved or not.) Applications that wish to deal +directly with the downsampled data must provide similar buffering and padding +for odd-sized images. + + +*** Poor man's object-oriented programming *** + +It should be clear by now that we have a lot of quasi-independent processing +steps, many of which have several possible behaviors. To avoid cluttering the +code with lots of switch statements, we use a simple form of object-style +programming to separate out the different possibilities. + +For example, two different color quantization algorithms could be implemented +as two separate modules that present the same external interface; at runtime, +the calling code will access the proper module indirectly through an "object". + +We can get the limited features we need while staying within portable C. +The basic tool is a function pointer. An "object" is just a struct +containing one or more function pointer fields, each of which corresponds to +a method name in real object-oriented languages. During initialization we +fill in the function pointers with references to whichever module we have +determined we need to use in this run. Then invocation of the module is done +by indirecting through a function pointer; on most machines this is no more +expensive than a switch statement, which would be the only other way of +making the required run-time choice. The really significant benefit, of +course, is keeping the source code clean and well structured. + +We can also arrange to have private storage that varies between different +implementations of the same kind of object. We do this by making all the +module-specific object structs be separately allocated entities, which will +be accessed via pointers in the master compression or decompression struct. +The "public" fields or methods for a given kind of object are specified by +a commonly known struct. But a module's initialization code can allocate +a larger struct that contains the common struct as its first member, plus +additional private fields. With appropriate pointer casting, the module's +internal functions can access these private fields. (For a simple example, +see jdatadst.c, which implements the external interface specified by struct +jpeg_destination_mgr, but adds extra fields.) + +(Of course this would all be a lot easier if we were using C++, but we are +not yet prepared to assume that everyone has a C++ compiler.) + +An important benefit of this scheme is that it is easy to provide multiple +versions of any method, each tuned to a particular case. While a lot of +precalculation might be done to select an optimal implementation of a method, +the cost per invocation is constant. For example, the upsampling step might +have a "generic" method, plus one or more "hardwired" methods for the most +popular sampling factors; the hardwired methods would be faster because they'd +use straight-line code instead of for-loops. The cost to determine which +method to use is paid only once, at startup, and the selection criteria are +hidden from the callers of the method. + +This plan differs a little bit from usual object-oriented structures, in that +only one instance of each object class will exist during execution. The +reason for having the class structure is that on different runs we may create +different instances (choose to execute different modules). You can think of +the term "method" as denoting the common interface presented by a particular +set of interchangeable functions, and "object" as denoting a group of related +methods, or the total shared interface behavior of a group of modules. + + +*** Overall control structure *** + +We previously mentioned the need for overall control logic in the compression +and decompression libraries. In IJG implementations prior to v5, overall +control was mostly provided by "pipeline control" modules, which proved to be +large, unwieldy, and hard to understand. To improve the situation, the +control logic has been subdivided into multiple modules. The control modules +consist of: + +1. Master control for module selection and initialization. This has two +responsibilities: + + 1A. Startup initialization at the beginning of image processing. + The individual processing modules to be used in this run are selected + and given initialization calls. + + 1B. Per-pass control. This determines how many passes will be performed + and calls each active processing module to configure itself + appropriately at the beginning of each pass. End-of-pass processing, + where necessary, is also invoked from the master control module. + + Method selection is partially distributed, in that a particular processing + module may contain several possible implementations of a particular method, + which it will select among when given its initialization call. The master + control code need only be concerned with decisions that affect more than + one module. + +2. Data buffering control. A separate control module exists for each + inter-processing-step data buffer. This module is responsible for + invoking the processing steps that write or read that data buffer. + +Each buffer controller sees the world as follows: + +input data => processing step A => buffer => processing step B => output data + | | | + ------------------ controller ------------------ + +The controller knows the dataflow requirements of steps A and B: how much data +they want to accept in one chunk and how much they output in one chunk. Its +function is to manage its buffer and call A and B at the proper times. + +A data buffer control module may itself be viewed as a processing step by a +higher-level control module; thus the control modules form a binary tree with +elementary processing steps at the leaves of the tree. + +The control modules are objects. A considerable amount of flexibility can +be had by replacing implementations of a control module. For example: +* Merging of adjacent steps in the pipeline is done by replacing a control + module and its pair of processing-step modules with a single processing- + step module. (Hence the possible merges are determined by the tree of + control modules.) +* In some processing modes, a given interstep buffer need only be a "strip" + buffer large enough to accommodate the desired data chunk sizes. In other + modes, a full-image buffer is needed and several passes are required. + The control module determines which kind of buffer is used and manipulates + virtual array buffers as needed. One or both processing steps may be + unaware of the multi-pass behavior. + +In theory, we might be able to make all of the data buffer controllers +interchangeable and provide just one set of implementations for all. In +practice, each one contains considerable special-case processing for its +particular job. The buffer controller concept should be regarded as an +overall system structuring principle, not as a complete description of the +task performed by any one controller. + + +*** Compression object structure *** + +Here is a sketch of the logical structure of the JPEG compression library: + + |-- Colorspace conversion + |-- Preprocessing controller --| + | |-- Downsampling +Main controller --| + | |-- Forward DCT, quantize + |-- Coefficient controller --| + |-- Entropy encoding + +This sketch also describes the flow of control (subroutine calls) during +typical image data processing. Each of the components shown in the diagram is +an "object" which may have several different implementations available. One +or more source code files contain the actual implementation(s) of each object. + +The objects shown above are: + +* Main controller: buffer controller for the subsampled-data buffer, which + holds the preprocessed input data. This controller invokes preprocessing to + fill the subsampled-data buffer, and JPEG compression to empty it. There is + usually no need for a full-image buffer here; a strip buffer is adequate. + +* Preprocessing controller: buffer controller for the downsampling input data + buffer, which lies between colorspace conversion and downsampling. Note + that a unified conversion/downsampling module would probably replace this + controller entirely. + +* Colorspace conversion: converts application image data into the desired + JPEG color space; also changes the data from pixel-interleaved layout to + separate component planes. Processes one pixel row at a time. + +* Downsampling: performs reduction of chroma components as required. + Optionally may perform pixel-level smoothing as well. Processes a "row + group" at a time, where a row group is defined as Vmax pixel rows of each + component before downsampling, and Vk sample rows afterwards (remember Vk + differs across components). Some downsampling or smoothing algorithms may + require context rows above and below the current row group; the + preprocessing controller is responsible for supplying these rows via proper + buffering. The downsampler is responsible for edge expansion at the right + edge (i.e., extending each sample row to a multiple of 8 samples); but the + preprocessing controller is responsible for vertical edge expansion (i.e., + duplicating the bottom sample row as needed to make a multiple of 8 rows). + +* Coefficient controller: buffer controller for the DCT-coefficient data. + This controller handles MCU assembly, including insertion of dummy DCT + blocks when needed at the right or bottom edge. When performing + Huffman-code optimization or emitting a multiscan JPEG file, this + controller is responsible for buffering the full image. The equivalent of + one fully interleaved MCU row of subsampled data is processed per call, + even when the JPEG file is noninterleaved. + +* Forward DCT and quantization: Perform DCT, quantize, and emit coefficients. + Works on one or more DCT blocks at a time. (Note: the coefficients are now + emitted in normal array order, which the entropy encoder is expected to + convert to zigzag order as necessary. Prior versions of the IJG code did + the conversion to zigzag order within the quantization step.) + +* Entropy encoding: Perform Huffman or arithmetic entropy coding and emit the + coded data to the data destination module. Works on one MCU per call. + For progressive JPEG, the same DCT blocks are fed to the entropy coder + during each pass, and the coder must emit the appropriate subset of + coefficients. + +In addition to the above objects, the compression library includes these +objects: + +* Master control: determines the number of passes required, controls overall + and per-pass initialization of the other modules. + +* Marker writing: generates JPEG markers (except for RSTn, which is emitted + by the entropy encoder when needed). + +* Data destination manager: writes the output JPEG datastream to its final + destination (e.g., a file). The destination manager supplied with the + library knows how to write to a stdio stream; for other behaviors, the + surrounding application may provide its own destination manager. + +* Memory manager: allocates and releases memory, controls virtual arrays + (with backing store management, where required). + +* Error handler: performs formatting and output of error and trace messages; + determines handling of nonfatal errors. The surrounding application may + override some or all of this object's methods to change error handling. + +* Progress monitor: supports output of "percent-done" progress reports. + This object represents an optional callback to the surrounding application: + if wanted, it must be supplied by the application. + +The error handler, destination manager, and progress monitor objects are +defined as separate objects in order to simplify application-specific +customization of the JPEG library. A surrounding application may override +individual methods or supply its own all-new implementation of one of these +objects. The object interfaces for these objects are therefore treated as +part of the application interface of the library, whereas the other objects +are internal to the library. + +The error handler and memory manager are shared by JPEG compression and +decompression; the progress monitor, if used, may be shared as well. + + +*** Decompression object structure *** + +Here is a sketch of the logical structure of the JPEG decompression library: + + |-- Entropy decoding + |-- Coefficient controller --| + | |-- Dequantize, Inverse DCT +Main controller --| + | |-- Upsampling + |-- Postprocessing controller --| |-- Colorspace conversion + |-- Color quantization + |-- Color precision reduction + +As before, this diagram also represents typical control flow. The objects +shown are: + +* Main controller: buffer controller for the subsampled-data buffer, which + holds the output of JPEG decompression proper. This controller's primary + task is to feed the postprocessing procedure. Some upsampling algorithms + may require context rows above and below the current row group; when this + is true, the main controller is responsible for managing its buffer so as + to make context rows available. In the current design, the main buffer is + always a strip buffer; a full-image buffer is never required. + +* Coefficient controller: buffer controller for the DCT-coefficient data. + This controller handles MCU disassembly, including deletion of any dummy + DCT blocks at the right or bottom edge. When reading a multiscan JPEG + file, this controller is responsible for buffering the full image. + (Buffering DCT coefficients, rather than samples, is necessary to support + progressive JPEG.) The equivalent of one fully interleaved MCU row of + subsampled data is processed per call, even when the source JPEG file is + noninterleaved. + +* Entropy decoding: Read coded data from the data source module and perform + Huffman or arithmetic entropy decoding. Works on one MCU per call. + For progressive JPEG decoding, the coefficient controller supplies the prior + coefficients of each MCU (initially all zeroes), which the entropy decoder + modifies in each scan. + +* Dequantization and inverse DCT: like it says. Note that the coefficients + buffered by the coefficient controller have NOT been dequantized; we + merge dequantization and inverse DCT into a single step for speed reasons. + When scaled-down output is asked for, simplified DCT algorithms may be used + that emit only 1x1, 2x2, or 4x4 samples per DCT block, not the full 8x8. + Works on one DCT block at a time. + +* Postprocessing controller: buffer controller for the color quantization + input buffer, when quantization is in use. (Without quantization, this + controller just calls the upsampler.) For two-pass quantization, this + controller is responsible for buffering the full-image data. + +* Upsampling: restores chroma components to full size. (May support more + general output rescaling, too. Note that if undersized DCT outputs have + been emitted by the DCT module, this module must adjust so that properly + sized outputs are created.) Works on one row group at a time. This module + also calls the color conversion module, so its top level is effectively a + buffer controller for the upsampling->color conversion buffer. However, in + all but the highest-quality operating modes, upsampling and color + conversion are likely to be merged into a single step. + +* Colorspace conversion: convert from JPEG color space to output color space, + and change data layout from separate component planes to pixel-interleaved. + Works on one pixel row at a time. + +* Color quantization: reduce the data to colormapped form, using either an + externally specified colormap or an internally generated one. This module + is not used for full-color output. Works on one pixel row at a time; may + require two passes to generate a color map. Note that the output will + always be a single component representing colormap indexes. In the current + design, the output values are JSAMPLEs, so an 8-bit compilation cannot + quantize to more than 256 colors. This is unlikely to be a problem in + practice. + +* Color reduction: this module handles color precision reduction, e.g., + generating 15-bit color (5 bits/primary) from JPEG's 24-bit output. + Not quite clear yet how this should be handled... should we merge it with + colorspace conversion??? + +Note that some high-speed operating modes might condense the entire +postprocessing sequence to a single module (upsample, color convert, and +quantize in one step). + +In addition to the above objects, the decompression library includes these +objects: + +* Master control: determines the number of passes required, controls overall + and per-pass initialization of the other modules. This is subdivided into + input and output control: jdinput.c controls only input-side processing, + while jdmaster.c handles overall initialization and output-side control. + +* Marker reading: decodes JPEG markers (except for RSTn). + +* Data source manager: supplies the input JPEG datastream. The source + manager supplied with the library knows how to read from a stdio stream; + for other behaviors, the surrounding application may provide its own source + manager. + +* Memory manager: same as for compression library. + +* Error handler: same as for compression library. + +* Progress monitor: same as for compression library. + +As with compression, the data source manager, error handler, and progress +monitor are candidates for replacement by a surrounding application. + + +*** Decompression input and output separation *** + +To support efficient incremental display of progressive JPEG files, the +decompressor is divided into two sections that can run independently: + +1. Data input includes marker parsing, entropy decoding, and input into the + coefficient controller's DCT coefficient buffer. Note that this + processing is relatively cheap and fast. + +2. Data output reads from the DCT coefficient buffer and performs the IDCT + and all postprocessing steps. + +For a progressive JPEG file, the data input processing is allowed to get +arbitrarily far ahead of the data output processing. (This occurs only +if the application calls jpeg_consume_input(); otherwise input and output +run in lockstep, since the input section is called only when the output +section needs more data.) In this way the application can avoid making +extra display passes when data is arriving faster than the display pass +can run. Furthermore, it is possible to abort an output pass without +losing anything, since the coefficient buffer is read-only as far as the +output section is concerned. See libjpeg.doc for more detail. + +A full-image coefficient array is only created if the JPEG file has multiple +scans (or if the application specifies buffered-image mode anyway). When +reading a single-scan file, the coefficient controller normally creates only +a one-MCU buffer, so input and output processing must run in lockstep in this +case. jpeg_consume_input() is effectively a no-op in this situation. + +The main impact of dividing the decompressor in this fashion is that we must +be very careful with shared variables in the cinfo data structure. Each +variable that can change during the course of decompression must be +classified as belonging to data input or data output, and each section must +look only at its own variables. For example, the data output section may not +depend on any of the variables that describe the current scan in the JPEG +file, because these may change as the data input section advances into a new +scan. + +The progress monitor is (somewhat arbitrarily) defined to treat input of the +file as one pass when buffered-image mode is not used, and to ignore data +input work completely when buffered-image mode is used. Note that the +library has no reliable way to predict the number of passes when dealing +with a progressive JPEG file, nor can it predict the number of output passes +in buffered-image mode. So the work estimate is inherently bogus anyway. + +No comparable division is currently made in the compression library, because +there isn't any real need for it. + + +*** Data formats *** + +Arrays of pixel sample values use the following data structure: + + typedef something JSAMPLE; a pixel component value, 0..MAXJSAMPLE + typedef JSAMPLE *JSAMPROW; ptr to a row of samples + typedef JSAMPROW *JSAMPARRAY; ptr to a list of rows + typedef JSAMPARRAY *JSAMPIMAGE; ptr to a list of color-component arrays + +The basic element type JSAMPLE will typically be one of unsigned char, +(signed) char, or short. Short will be used if samples wider than 8 bits are +to be supported (this is a compile-time option). Otherwise, unsigned char is +used if possible. If the compiler only supports signed chars, then it is +necessary to mask off the value when reading. Thus, all reads of JSAMPLE +values must be coded as "GETJSAMPLE(value)", where the macro will be defined +as "((value) & 0xFF)" on signed-char machines and "((int) (value))" elsewhere. + +With these conventions, JSAMPLE values can be assumed to be >= 0. This helps +simplify correct rounding during downsampling, etc. The JPEG standard's +specification that sample values run from -128..127 is accommodated by +subtracting 128 just as the sample value is copied into the source array for +the DCT step (this will be an array of signed ints). Similarly, during +decompression the output of the IDCT step will be immediately shifted back to +0..255. (NB: different values are required when 12-bit samples are in use. +The code is written in terms of MAXJSAMPLE and CENTERJSAMPLE, which will be +defined as 255 and 128 respectively in an 8-bit implementation, and as 4095 +and 2048 in a 12-bit implementation.) + +We use a pointer per row, rather than a two-dimensional JSAMPLE array. This +choice costs only a small amount of memory and has several benefits: +* Code using the data structure doesn't need to know the allocated width of + the rows. This simplifies edge expansion/compression, since we can work + in an array that's wider than the logical picture width. +* Indexing doesn't require multiplication; this is a performance win on many + machines. +* Arrays with more than 64K total elements can be supported even on machines + where malloc() cannot allocate chunks larger than 64K. +* The rows forming a component array may be allocated at different times + without extra copying. This trick allows some speedups in smoothing steps + that need access to the previous and next rows. + +Note that each color component is stored in a separate array; we don't use the +traditional layout in which the components of a pixel are stored together. +This simplifies coding of modules that work on each component independently, +because they don't need to know how many components there are. Furthermore, +we can read or write each component to a temporary file independently, which +is helpful when dealing with noninterleaved JPEG files. + +In general, a specific sample value is accessed by code such as + GETJSAMPLE(image[colorcomponent][row][col]) +where col is measured from the image left edge, but row is measured from the +first sample row currently in memory. Either of the first two indexings can +be precomputed by copying the relevant pointer. + + +Since most image-processing applications prefer to work on images in which +the components of a pixel are stored together, the data passed to or from the +surrounding application uses the traditional convention: a single pixel is +represented by N consecutive JSAMPLE values, and an image row is an array of +(# of color components)*(image width) JSAMPLEs. One or more rows of data can +be represented by a pointer of type JSAMPARRAY in this scheme. This scheme is +converted to component-wise storage inside the JPEG library. (Applications +that want to skip JPEG preprocessing or postprocessing will have to contend +with component-wise storage.) + + +Arrays of DCT-coefficient values use the following data structure: + + typedef short JCOEF; a 16-bit signed integer + typedef JCOEF JBLOCK[DCTSIZE2]; an 8x8 block of coefficients + typedef JBLOCK *JBLOCKROW; ptr to one horizontal row of 8x8 blocks + typedef JBLOCKROW *JBLOCKARRAY; ptr to a list of such rows + typedef JBLOCKARRAY *JBLOCKIMAGE; ptr to a list of color component arrays + +The underlying type is at least a 16-bit signed integer; while "short" is big +enough on all machines of interest, on some machines it is preferable to use +"int" for speed reasons, despite the storage cost. Coefficients are grouped +into 8x8 blocks (but we always use #defines DCTSIZE and DCTSIZE2 rather than +"8" and "64"). + +The contents of a coefficient block may be in either "natural" or zigzagged +order, and may be true values or divided by the quantization coefficients, +depending on where the block is in the processing pipeline. In the current +library, coefficient blocks are kept in natural order everywhere; the entropy +codecs zigzag or dezigzag the data as it is written or read. The blocks +contain quantized coefficients everywhere outside the DCT/IDCT subsystems. +(This latter decision may need to be revisited to support variable +quantization a la JPEG Part 3.) + +Notice that the allocation unit is now a row of 8x8 blocks, corresponding to +eight rows of samples. Otherwise the structure is much the same as for +samples, and for the same reasons. + +On machines where malloc() can't handle a request bigger than 64Kb, this data +structure limits us to rows of less than 512 JBLOCKs, or a picture width of +4000+ pixels. This seems an acceptable restriction. + + +On 80x86 machines, the bottom-level pointer types (JSAMPROW and JBLOCKROW) +must be declared as "far" pointers, but the upper levels can be "near" +(implying that the pointer lists are allocated in the DS segment). +We use a #define symbol FAR, which expands to the "far" keyword when +compiling on 80x86 machines and to nothing elsewhere. + + +*** Suspendable processing *** + +In some applications it is desirable to use the JPEG library as an +incremental, memory-to-memory filter. In this situation the data source or +destination may be a limited-size buffer, and we can't rely on being able to +empty or refill the buffer at arbitrary times. Instead the application would +like to have control return from the library at buffer overflow/underrun, and +then resume compression or decompression at a later time. + +This scenario is supported for simple cases. (For anything more complex, we +recommend that the application "bite the bullet" and develop real multitasking +capability.) The libjpeg.doc file goes into more detail about the usage and +limitations of this capability; here we address the implications for library +structure. + +The essence of the problem is that the entropy codec (coder or decoder) must +be prepared to stop at arbitrary times. In turn, the controllers that call +the entropy codec must be able to stop before having produced or consumed all +the data that they normally would handle in one call. That part is reasonably +straightforward: we make the controller call interfaces include "progress +counters" which indicate the number of data chunks successfully processed, and +we require callers to test the counter rather than just assume all of the data +was processed. + +Rather than trying to restart at an arbitrary point, the current Huffman +codecs are designed to restart at the beginning of the current MCU after a +suspension due to buffer overflow/underrun. At the start of each call, the +codec's internal state is loaded from permanent storage (in the JPEG object +structures) into local variables. On successful completion of the MCU, the +permanent state is updated. (This copying is not very expensive, and may even +lead to *improved* performance if the local variables can be registerized.) +If a suspension occurs, the codec simply returns without updating the state, +thus effectively reverting to the start of the MCU. Note that this implies +leaving some data unprocessed in the source/destination buffer (ie, the +compressed partial MCU). The data source/destination module interfaces are +specified so as to make this possible. This also implies that the data buffer +must be large enough to hold a worst-case compressed MCU; a couple thousand +bytes should be enough. + +In a successive-approximation AC refinement scan, the progressive Huffman +decoder has to be able to undo assignments of newly nonzero coefficients if it +suspends before the MCU is complete, since decoding requires distinguishing +previously-zero and previously-nonzero coefficients. This is a bit tedious +but probably won't have much effect on performance. Other variants of Huffman +decoding need not worry about this, since they will just store the same values +again if forced to repeat the MCU. + +This approach would probably not work for an arithmetic codec, since its +modifiable state is quite large and couldn't be copied cheaply. Instead it +would have to suspend and resume exactly at the point of the buffer end. + +The JPEG marker reader is designed to cope with suspension at an arbitrary +point. It does so by backing up to the start of the marker parameter segment, +so the data buffer must be big enough to hold the largest marker of interest. +Again, a couple KB should be adequate. (A special "skip" convention is used +to bypass COM and APPn markers, so these can be larger than the buffer size +without causing problems; otherwise a 64K buffer would be needed in the worst +case.) + +The JPEG marker writer currently does *not* cope with suspension. I feel that +this is not necessary; it is much easier simply to require the application to +ensure there is enough buffer space before starting. (An empty 2K buffer is +more than sufficient for the header markers; and ensuring there are a dozen or +two bytes available before calling jpeg_finish_compress() will suffice for the +trailer.) This would not work for writing multi-scan JPEG files, but +we simply do not intend to support that capability with suspension. + + +*** Memory manager services *** + +The JPEG library's memory manager controls allocation and deallocation of +memory, and it manages large "virtual" data arrays on machines where the +operating system does not provide virtual memory. Note that the same +memory manager serves both compression and decompression operations. + +In all cases, allocated objects are tied to a particular compression or +decompression master record, and they will be released when that master +record is destroyed. + +The memory manager does not provide explicit deallocation of objects. +Instead, objects are created in "pools" of free storage, and a whole pool +can be freed at once. This approach helps prevent storage-leak bugs, and +it speeds up operations whenever malloc/free are slow (as they often are). +The pools can be regarded as lifetime identifiers for objects. Two +pools/lifetimes are defined: + * JPOOL_PERMANENT lasts until master record is destroyed + * JPOOL_IMAGE lasts until done with image (JPEG datastream) +Permanent lifetime is used for parameters and tables that should be carried +across from one datastream to another; this includes all application-visible +parameters. Image lifetime is used for everything else. (A third lifetime, +JPOOL_PASS = one processing pass, was originally planned. However it was +dropped as not being worthwhile. The actual usage patterns are such that the +peak memory usage would be about the same anyway; and having per-pass storage +substantially complicates the virtual memory allocation rules --- see below.) + +The memory manager deals with three kinds of object: +1. "Small" objects. Typically these require no more than 10K-20K total. +2. "Large" objects. These may require tens to hundreds of K depending on + image size. Semantically they behave the same as small objects, but we + distinguish them for two reasons: + * On MS-DOS machines, large objects are referenced by FAR pointers, + small objects by NEAR pointers. + * Pool allocation heuristics may differ for large and small objects. + Note that individual "large" objects cannot exceed the size allowed by + type size_t, which may be 64K or less on some machines. +3. "Virtual" objects. These are large 2-D arrays of JSAMPLEs or JBLOCKs + (typically large enough for the entire image being processed). The + memory manager provides stripwise access to these arrays. On machines + without virtual memory, the rest of the array may be swapped out to a + temporary file. + +(Note: JSAMPARRAY and JBLOCKARRAY data structures are a combination of large +objects for the data proper and small objects for the row pointers. For +convenience and speed, the memory manager provides single routines to create +these structures. Similarly, virtual arrays include a small control block +and a JSAMPARRAY or JBLOCKARRAY working buffer, all created with one call.) + +In the present implementation, virtual arrays are only permitted to have image +lifespan. (Permanent lifespan would not be reasonable, and pass lifespan is +not very useful since a virtual array's raison d'etre is to store data for +multiple passes through the image.) We also expect that only "small" objects +will be given permanent lifespan, though this restriction is not required by +the memory manager. + +In a non-virtual-memory machine, some performance benefit can be gained by +making the in-memory buffers for virtual arrays be as large as possible. +(For small images, the buffers might fit entirely in memory, so blind +swapping would be very wasteful.) The memory manager will adjust the height +of the buffers to fit within a prespecified maximum memory usage. In order +to do this in a reasonably optimal fashion, the manager needs to allocate all +of the virtual arrays at once. Therefore, there isn't a one-step allocation +routine for virtual arrays; instead, there is a "request" routine that simply +allocates the control block, and a "realize" routine (called just once) that +determines space allocation and creates all of the actual buffers. The +realize routine must allow for space occupied by non-virtual large objects. +(We don't bother to factor in the space needed for small objects, on the +grounds that it isn't worth the trouble.) + +To support all this, we establish the following protocol for doing business +with the memory manager: + 1. Modules must request virtual arrays (which may have only image lifespan) + during the initial setup phase, i.e., in their jinit_xxx routines. + 2. All "large" objects (including JSAMPARRAYs and JBLOCKARRAYs) must also be + allocated during initial setup. + 3. realize_virt_arrays will be called at the completion of initial setup. + The above conventions ensure that sufficient information is available + for it to choose a good size for virtual array buffers. +Small objects of any lifespan may be allocated at any time. We expect that +the total space used for small objects will be small enough to be negligible +in the realize_virt_arrays computation. + +In a virtual-memory machine, we simply pretend that the available space is +infinite, thus causing realize_virt_arrays to decide that it can allocate all +the virtual arrays as full-size in-memory buffers. The overhead of the +virtual-array access protocol is very small when no swapping occurs. + +A virtual array can be specified to be "pre-zeroed"; when this flag is set, +never-yet-written sections of the array are set to zero before being made +available to the caller. If this flag is not set, never-written sections +of the array contain garbage. (This feature exists primarily because the +equivalent logic would otherwise be needed in jdcoefct.c for progressive +JPEG mode; we may as well make it available for possible other uses.) + +The first write pass on a virtual array is required to occur in top-to-bottom +order; read passes, as well as any write passes after the first one, may +access the array in any order. This restriction exists partly to simplify +the virtual array control logic, and partly because some file systems may not +support seeking beyond the current end-of-file in a temporary file. The main +implication of this restriction is that rearrangement of rows (such as +converting top-to-bottom data order to bottom-to-top) must be handled while +reading data out of the virtual array, not while putting it in. + + +*** Memory manager internal structure *** + +To isolate system dependencies as much as possible, we have broken the +memory manager into two parts. There is a reasonably system-independent +"front end" (jmemmgr.c) and a "back end" that contains only the code +likely to change across systems. All of the memory management methods +outlined above are implemented by the front end. The back end provides +the following routines for use by the front end (none of these routines +are known to the rest of the JPEG code): + +jpeg_mem_init, jpeg_mem_term system-dependent initialization/shutdown + +jpeg_get_small, jpeg_free_small interface to malloc and free library routines + (or their equivalents) + +jpeg_get_large, jpeg_free_large interface to FAR malloc/free in MSDOS machines; + else usually the same as + jpeg_get_small/jpeg_free_small + +jpeg_mem_available estimate available memory + +jpeg_open_backing_store create a backing-store object + +read_backing_store, manipulate a backing-store object +write_backing_store, +close_backing_store + +On some systems there will be more than one type of backing-store object +(specifically, in MS-DOS a backing store file might be an area of extended +memory as well as a disk file). jpeg_open_backing_store is responsible for +choosing how to implement a given object. The read/write/close routines +are method pointers in the structure that describes a given object; this +lets them be different for different object types. + +It may be necessary to ensure that backing store objects are explicitly +released upon abnormal program termination. For example, MS-DOS won't free +extended memory by itself. To support this, we will expect the main program +or surrounding application to arrange to call self_destruct (typically via +jpeg_destroy) upon abnormal termination. This may require a SIGINT signal +handler or equivalent. We don't want to have the back end module install its +own signal handler, because that would pre-empt the surrounding application's +ability to control signal handling. + +The IJG distribution includes several memory manager back end implementations. +Usually the same back end should be suitable for all applications on a given +system, but it is possible for an application to supply its own back end at +need. + + +*** Implications of DNL marker *** + +Some JPEG files may use a DNL marker to postpone definition of the image +height (this would be useful for a fax-like scanner's output, for instance). +In these files the SOF marker claims the image height is 0, and you only +find out the true image height at the end of the first scan. + +We could read these files as follows: +1. Upon seeing zero image height, replace it by 65535 (the maximum allowed). +2. When the DNL is found, update the image height in the global image + descriptor. +This implies that control modules must avoid making copies of the image +height, and must re-test for termination after each MCU row. This would +be easy enough to do. + +In cases where image-size data structures are allocated, this approach will +result in very inefficient use of virtual memory or much-larger-than-necessary +temporary files. This seems acceptable for something that probably won't be a +mainstream usage. People might have to forgo use of memory-hogging options +(such as two-pass color quantization or noninterleaved JPEG files) if they +want efficient conversion of such files. (One could improve efficiency by +demanding a user-supplied upper bound for the height, less than 65536; in most +cases it could be much less.) + +The standard also permits the SOF marker to overestimate the image height, +with a DNL to give the true, smaller height at the end of the first scan. +This would solve the space problems if the overestimate wasn't too great. +However, it implies that you don't even know whether DNL will be used. + +This leads to a couple of very serious objections: +1. Testing for a DNL marker must occur in the inner loop of the decompressor's + Huffman decoder; this implies a speed penalty whether the feature is used + or not. +2. There is no way to hide the last-minute change in image height from an + application using the decoder. Thus *every* application using the IJG + library would suffer a complexity penalty whether it cared about DNL or + not. +We currently do not support DNL because of these problems. + +A different approach is to insist that DNL-using files be preprocessed by a +separate program that reads ahead to the DNL, then goes back and fixes the SOF +marker. This is a much simpler solution and is probably far more efficient. +Even if one wants piped input, buffering the first scan of the JPEG file needs +a lot smaller temp file than is implied by the maximum-height method. For +this approach we'd simply treat DNL as a no-op in the decompressor (at most, +check that it matches the SOF image height). + +We will not worry about making the compressor capable of outputting DNL. +Something similar to the first scheme above could be applied if anyone ever +wants to make that work. diff --git a/third_party/windows/fltk-1.1.10/jpeg/usage.doc b/third_party/windows/fltk-1.1.10/jpeg/usage.doc new file mode 100644 index 0000000..4c1a1c2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/usage.doc @@ -0,0 +1,562 @@ +USAGE instructions for the Independent JPEG Group's JPEG software +================================================================= + +This file describes usage of the JPEG conversion programs cjpeg and djpeg, +as well as the utility programs jpegtran, rdjpgcom and wrjpgcom. (See +the other documentation files if you wish to use the JPEG library within +your own programs.) + +If you are on a Unix machine you may prefer to read the Unix-style manual +pages in files cjpeg.1, djpeg.1, jpegtran.1, rdjpgcom.1, wrjpgcom.1. + + +INTRODUCTION + +These programs implement JPEG image compression and decompression. JPEG +(pronounced "jay-peg") is a standardized compression method for full-color +and gray-scale images. JPEG is designed to handle "real-world" scenes, +for example scanned photographs. Cartoons, line drawings, and other +non-realistic images are not JPEG's strong suit; on that sort of material +you may get poor image quality and/or little compression. + +JPEG is lossy, meaning that the output image is not necessarily identical to +the input image. Hence you should not use JPEG if you have to have identical +output bits. However, on typical real-world images, very good compression +levels can be obtained with no visible change, and amazingly high compression +is possible if you can tolerate a low-quality image. You can trade off image +quality against file size by adjusting the compressor's "quality" setting. + + +GENERAL USAGE + +We provide two programs, cjpeg to compress an image file into JPEG format, +and djpeg to decompress a JPEG file back into a conventional image format. + +On Unix-like systems, you say: + cjpeg [switches] [imagefile] >jpegfile +or + djpeg [switches] [jpegfile] >imagefile +The programs read the specified input file, or standard input if none is +named. They always write to standard output (with trace/error messages to +standard error). These conventions are handy for piping images between +programs. + +On most non-Unix systems, you say: + cjpeg [switches] imagefile jpegfile +or + djpeg [switches] jpegfile imagefile +i.e., both the input and output files are named on the command line. This +style is a little more foolproof, and it loses no functionality if you don't +have pipes. (You can get this style on Unix too, if you prefer, by defining +TWO_FILE_COMMANDLINE when you compile the programs; see install.doc.) + +You can also say: + cjpeg [switches] -outfile jpegfile imagefile +or + djpeg [switches] -outfile imagefile jpegfile +This syntax works on all systems, so it is useful for scripts. + +The currently supported image file formats are: PPM (PBMPLUS color format), +PGM (PBMPLUS gray-scale format), BMP, Targa, and RLE (Utah Raster Toolkit +format). (RLE is supported only if the URT library is available.) +cjpeg recognizes the input image format automatically, with the exception +of some Targa-format files. You have to tell djpeg which format to generate. + +JPEG files are in the defacto standard JFIF file format. There are other, +less widely used JPEG-based file formats, but we don't support them. + +All switch names may be abbreviated; for example, -grayscale may be written +-gray or -gr. Most of the "basic" switches can be abbreviated to as little as +one letter. Upper and lower case are equivalent (-BMP is the same as -bmp). +British spellings are also accepted (e.g., -greyscale), though for brevity +these are not mentioned below. + + +CJPEG DETAILS + +The basic command line switches for cjpeg are: + + -quality N Scale quantization tables to adjust image quality. + Quality is 0 (worst) to 100 (best); default is 75. + (See below for more info.) + + -grayscale Create monochrome JPEG file from color input. + Be sure to use this switch when compressing a grayscale + BMP file, because cjpeg isn't bright enough to notice + whether a BMP file uses only shades of gray. By + saying -grayscale, you'll get a smaller JPEG file that + takes less time to process. + + -optimize Perform optimization of entropy encoding parameters. + Without this, default encoding parameters are used. + -optimize usually makes the JPEG file a little smaller, + but cjpeg runs somewhat slower and needs much more + memory. Image quality and speed of decompression are + unaffected by -optimize. + + -progressive Create progressive JPEG file (see below). + + -targa Input file is Targa format. Targa files that contain + an "identification" field will not be automatically + recognized by cjpeg; for such files you must specify + -targa to make cjpeg treat the input as Targa format. + For most Targa files, you won't need this switch. + +The -quality switch lets you trade off compressed file size against quality of +the reconstructed image: the higher the quality setting, the larger the JPEG +file, and the closer the output image will be to the original input. Normally +you want to use the lowest quality setting (smallest file) that decompresses +into something visually indistinguishable from the original image. For this +purpose the quality setting should be between 50 and 95; the default of 75 is +often about right. If you see defects at -quality 75, then go up 5 or 10 +counts at a time until you are happy with the output image. (The optimal +setting will vary from one image to another.) + +-quality 100 will generate a quantization table of all 1's, minimizing loss +in the quantization step (but there is still information loss in subsampling, +as well as roundoff error). This setting is mainly of interest for +experimental purposes. Quality values above about 95 are NOT recommended for +normal use; the compressed file size goes up dramatically for hardly any gain +in output image quality. + +In the other direction, quality values below 50 will produce very small files +of low image quality. Settings around 5 to 10 might be useful in preparing an +index of a large image library, for example. Try -quality 2 (or so) for some +amusing Cubist effects. (Note: quality values below about 25 generate 2-byte +quantization tables, which are considered optional in the JPEG standard. +cjpeg emits a warning message when you give such a quality value, because some +other JPEG programs may be unable to decode the resulting file. Use -baseline +if you need to ensure compatibility at low quality values.) + +The -progressive switch creates a "progressive JPEG" file. In this type of +JPEG file, the data is stored in multiple scans of increasing quality. If the +file is being transmitted over a slow communications link, the decoder can use +the first scan to display a low-quality image very quickly, and can then +improve the display with each subsequent scan. The final image is exactly +equivalent to a standard JPEG file of the same quality setting, and the total +file size is about the same --- often a little smaller. CAUTION: progressive +JPEG is not yet widely implemented, so many decoders will be unable to view a +progressive JPEG file at all. + +Switches for advanced users: + + -dct int Use integer DCT method (default). + -dct fast Use fast integer DCT (less accurate). + -dct float Use floating-point DCT method. + The float method is very slightly more accurate than + the int method, but is much slower unless your machine + has very fast floating-point hardware. Also note that + results of the floating-point method may vary slightly + across machines, while the integer methods should give + the same results everywhere. The fast integer method + is much less accurate than the other two. + + -restart N Emit a JPEG restart marker every N MCU rows, or every + N MCU blocks if "B" is attached to the number. + -restart 0 (the default) means no restart markers. + + -smooth N Smooth the input image to eliminate dithering noise. + N, ranging from 1 to 100, indicates the strength of + smoothing. 0 (the default) means no smoothing. + + -maxmemory N Set limit for amount of memory to use in processing + large images. Value is in thousands of bytes, or + millions of bytes if "M" is attached to the number. + For example, -max 4m selects 4000000 bytes. If more + space is needed, temporary files will be used. + + -verbose Enable debug printout. More -v's give more printout. + or -debug Also, version information is printed at startup. + +The -restart option inserts extra markers that allow a JPEG decoder to +resynchronize after a transmission error. Without restart markers, any damage +to a compressed file will usually ruin the image from the point of the error +to the end of the image; with restart markers, the damage is usually confined +to the portion of the image up to the next restart marker. Of course, the +restart markers occupy extra space. We recommend -restart 1 for images that +will be transmitted across unreliable networks such as Usenet. + +The -smooth option filters the input to eliminate fine-scale noise. This is +often useful when converting dithered images to JPEG: a moderate smoothing +factor of 10 to 50 gets rid of dithering patterns in the input file, resulting +in a smaller JPEG file and a better-looking image. Too large a smoothing +factor will visibly blur the image, however. + +Switches for wizards: + + -baseline Force baseline-compatible quantization tables to be + generated. This clamps quantization values to 8 bits + even at low quality settings. (This switch is poorly + named, since it does not ensure that the output is + actually baseline JPEG. For example, you can use + -baseline and -progressive together.) + + -qtables file Use the quantization tables given in the specified + text file. + + -qslots N[,...] Select which quantization table to use for each color + component. + + -sample HxV[,...] Set JPEG sampling factors for each color component. + + -scans file Use the scan script given in the specified text file. + +The "wizard" switches are intended for experimentation with JPEG. If you +don't know what you are doing, DON'T USE THEM. These switches are documented +further in the file wizard.doc. + + +DJPEG DETAILS + +The basic command line switches for djpeg are: + + -colors N Reduce image to at most N colors. This reduces the + or -quantize N number of colors used in the output image, so that it + can be displayed on a colormapped display or stored in + a colormapped file format. For example, if you have + an 8-bit display, you'd need to reduce to 256 or fewer + colors. (-colors is the recommended name, -quantize + is provided only for backwards compatibility.) + + -fast Select recommended processing options for fast, low + quality output. (The default options are chosen for + highest quality output.) Currently, this is equivalent + to "-dct fast -nosmooth -onepass -dither ordered". + + -grayscale Force gray-scale output even if JPEG file is color. + Useful for viewing on monochrome displays; also, + djpeg runs noticeably faster in this mode. + + -scale M/N Scale the output image by a factor M/N. Currently + the scale factor must be 1/1, 1/2, 1/4, or 1/8. + Scaling is handy if the image is larger than your + screen; also, djpeg runs much faster when scaling + down the output. + + -bmp Select BMP output format (Windows flavor). 8-bit + colormapped format is emitted if -colors or -grayscale + is specified, or if the JPEG file is gray-scale; + otherwise, 24-bit full-color format is emitted. + + -gif Select GIF output format. Since GIF does not support + more than 256 colors, -colors 256 is assumed (unless + you specify a smaller number of colors). If you + specify -fast, the default number of colors is 216. + + -os2 Select BMP output format (OS/2 1.x flavor). 8-bit + colormapped format is emitted if -colors or -grayscale + is specified, or if the JPEG file is gray-scale; + otherwise, 24-bit full-color format is emitted. + + -pnm Select PBMPLUS (PPM/PGM) output format (this is the + default format). PGM is emitted if the JPEG file is + gray-scale or if -grayscale is specified; otherwise + PPM is emitted. + + -rle Select RLE output format. (Requires URT library.) + + -targa Select Targa output format. Gray-scale format is + emitted if the JPEG file is gray-scale or if + -grayscale is specified; otherwise, colormapped format + is emitted if -colors is specified; otherwise, 24-bit + full-color format is emitted. + +Switches for advanced users: + + -dct int Use integer DCT method (default). + -dct fast Use fast integer DCT (less accurate). + -dct float Use floating-point DCT method. + The float method is very slightly more accurate than + the int method, but is much slower unless your machine + has very fast floating-point hardware. Also note that + results of the floating-point method may vary slightly + across machines, while the integer methods should give + the same results everywhere. The fast integer method + is much less accurate than the other two. + + -dither fs Use Floyd-Steinberg dithering in color quantization. + -dither ordered Use ordered dithering in color quantization. + -dither none Do not use dithering in color quantization. + By default, Floyd-Steinberg dithering is applied when + quantizing colors; this is slow but usually produces + the best results. Ordered dither is a compromise + between speed and quality; no dithering is fast but + usually looks awful. Note that these switches have + no effect unless color quantization is being done. + Ordered dither is only available in -onepass mode. + + -map FILE Quantize to the colors used in the specified image + file. This is useful for producing multiple files + with identical color maps, or for forcing a predefined + set of colors to be used. The FILE must be a GIF + or PPM file. This option overrides -colors and + -onepass. + + -nosmooth Use a faster, lower-quality upsampling routine. + + -onepass Use one-pass instead of two-pass color quantization. + The one-pass method is faster and needs less memory, + but it produces a lower-quality image. -onepass is + ignored unless you also say -colors N. Also, + the one-pass method is always used for gray-scale + output (the two-pass method is no improvement then). + + -maxmemory N Set limit for amount of memory to use in processing + large images. Value is in thousands of bytes, or + millions of bytes if "M" is attached to the number. + For example, -max 4m selects 4000000 bytes. If more + space is needed, temporary files will be used. + + -verbose Enable debug printout. More -v's give more printout. + or -debug Also, version information is printed at startup. + + +HINTS FOR CJPEG + +Color GIF files are not the ideal input for JPEG; JPEG is really intended for +compressing full-color (24-bit) images. In particular, don't try to convert +cartoons, line drawings, and other images that have only a few distinct +colors. GIF works great on these, JPEG does not. If you want to convert a +GIF to JPEG, you should experiment with cjpeg's -quality and -smooth options +to get a satisfactory conversion. -smooth 10 or so is often helpful. + +Avoid running an image through a series of JPEG compression/decompression +cycles. Image quality loss will accumulate; after ten or so cycles the image +may be noticeably worse than it was after one cycle. It's best to use a +lossless format while manipulating an image, then convert to JPEG format when +you are ready to file the image away. + +The -optimize option to cjpeg is worth using when you are making a "final" +version for posting or archiving. It's also a win when you are using low +quality settings to make very small JPEG files; the percentage improvement +is often a lot more than it is on larger files. (At present, -optimize +mode is always selected when generating progressive JPEG files.) + +GIF input files are no longer supported, to avoid the Unisys LZW patent. +Use a Unisys-licensed program if you need to read a GIF file. (Conversion +of GIF files to JPEG is usually a bad idea anyway.) + + +HINTS FOR DJPEG + +To get a quick preview of an image, use the -grayscale and/or -scale switches. +"-grayscale -scale 1/8" is the fastest case. + +Several options are available that trade off image quality to gain speed. +"-fast" turns on the recommended settings. + +"-dct fast" and/or "-nosmooth" gain speed at a small sacrifice in quality. +When producing a color-quantized image, "-onepass -dither ordered" is fast but +much lower quality than the default behavior. "-dither none" may give +acceptable results in two-pass mode, but is seldom tolerable in one-pass mode. + +If you are fortunate enough to have very fast floating point hardware, +"-dct float" may be even faster than "-dct fast". But on most machines +"-dct float" is slower than "-dct int"; in this case it is not worth using, +because its theoretical accuracy advantage is too small to be significant +in practice. + +Two-pass color quantization requires a good deal of memory; on MS-DOS machines +it may run out of memory even with -maxmemory 0. In that case you can still +decompress, with some loss of image quality, by specifying -onepass for +one-pass quantization. + +To avoid the Unisys LZW patent, djpeg produces uncompressed GIF files. These +are larger than they should be, but are readable by standard GIF decoders. + + +HINTS FOR BOTH PROGRAMS + +If more space is needed than will fit in the available main memory (as +determined by -maxmemory), temporary files will be used. (MS-DOS versions +will try to get extended or expanded memory first.) The temporary files are +often rather large: in typical cases they occupy three bytes per pixel, for +example 3*800*600 = 1.44Mb for an 800x600 image. If you don't have enough +free disk space, leave out -progressive and -optimize (for cjpeg) or specify +-onepass (for djpeg). + +On MS-DOS, the temporary files are created in the directory named by the TMP +or TEMP environment variable, or in the current directory if neither of those +exist. Amiga implementations put the temp files in the directory named by +JPEGTMP:, so be sure to assign JPEGTMP: to a disk partition with adequate free +space. + +The default memory usage limit (-maxmemory) is set when the software is +compiled. If you get an "insufficient memory" error, try specifying a smaller +-maxmemory value, even -maxmemory 0 to use the absolute minimum space. You +may want to recompile with a smaller default value if this happens often. + +On machines that have "environment" variables, you can define the environment +variable JPEGMEM to set the default memory limit. The value is specified as +described for the -maxmemory switch. JPEGMEM overrides the default value +specified when the program was compiled, and itself is overridden by an +explicit -maxmemory switch. + +On MS-DOS machines, -maxmemory is the amount of main (conventional) memory to +use. (Extended or expanded memory is also used if available.) Most +DOS-specific versions of this software do their own memory space estimation +and do not need you to specify -maxmemory. + + +JPEGTRAN + +jpegtran performs various useful transformations of JPEG files. +It can translate the coded representation from one variant of JPEG to another, +for example from baseline JPEG to progressive JPEG or vice versa. It can also +perform some rearrangements of the image data, for example turning an image +from landscape to portrait format by rotation. + +jpegtran works by rearranging the compressed data (DCT coefficients), without +ever fully decoding the image. Therefore, its transformations are lossless: +there is no image degradation at all, which would not be true if you used +djpeg followed by cjpeg to accomplish the same conversion. But by the same +token, jpegtran cannot perform lossy operations such as changing the image +quality. + +jpegtran uses a command line syntax similar to cjpeg or djpeg. +On Unix-like systems, you say: + jpegtran [switches] [inputfile] >outputfile +On most non-Unix systems, you say: + jpegtran [switches] inputfile outputfile +where both the input and output files are JPEG files. + +To specify the coded JPEG representation used in the output file, +jpegtran accepts a subset of the switches recognized by cjpeg: + -optimize Perform optimization of entropy encoding parameters. + -progressive Create progressive JPEG file. + -restart N Emit a JPEG restart marker every N MCU rows, or every + N MCU blocks if "B" is attached to the number. + -scans file Use the scan script given in the specified text file. +See the previous discussion of cjpeg for more details about these switches. +If you specify none of these switches, you get a plain baseline-JPEG output +file. The quality setting and so forth are determined by the input file. + +The image can be losslessly transformed by giving one of these switches: + -flip horizontal Mirror image horizontally (left-right). + -flip vertical Mirror image vertically (top-bottom). + -rotate 90 Rotate image 90 degrees clockwise. + -rotate 180 Rotate image 180 degrees. + -rotate 270 Rotate image 270 degrees clockwise (or 90 ccw). + -transpose Transpose image (across UL-to-LR axis). + -transverse Transverse transpose (across UR-to-LL axis). + +The transpose transformation has no restrictions regarding image dimensions. +The other transformations operate rather oddly if the image dimensions are not +a multiple of the iMCU size (usually 8 or 16 pixels), because they can only +transform complete blocks of DCT coefficient data in the desired way. + +jpegtran's default behavior when transforming an odd-size image is designed +to preserve exact reversibility and mathematical consistency of the +transformation set. As stated, transpose is able to flip the entire image +area. Horizontal mirroring leaves any partial iMCU column at the right edge +untouched, but is able to flip all rows of the image. Similarly, vertical +mirroring leaves any partial iMCU row at the bottom edge untouched, but is +able to flip all columns. The other transforms can be built up as sequences +of transpose and flip operations; for consistency, their actions on edge +pixels are defined to be the same as the end result of the corresponding +transpose-and-flip sequence. + +For practical use, you may prefer to discard any untransformable edge pixels +rather than having a strange-looking strip along the right and/or bottom edges +of a transformed image. To do this, add the -trim switch: + -trim Drop non-transformable edge blocks. +Obviously, a transformation with -trim is not reversible, so strictly speaking +jpegtran with this switch is not lossless. Also, the expected mathematical +equivalences between the transformations no longer hold. For example, +"-rot 270 -trim" trims only the bottom edge, but "-rot 90 -trim" followed by +"-rot 180 -trim" trims both edges. + +Another not-strictly-lossless transformation switch is: + -grayscale Force grayscale output. +This option discards the chrominance channels if the input image is YCbCr +(ie, a standard color JPEG), resulting in a grayscale JPEG file. The +luminance channel is preserved exactly, so this is a better method of reducing +to grayscale than decompression, conversion, and recompression. This switch +is particularly handy for fixing a monochrome picture that was mistakenly +encoded as a color JPEG. (In such a case, the space savings from getting rid +of the near-empty chroma channels won't be large; but the decoding time for +a grayscale JPEG is substantially less than that for a color JPEG.) + +jpegtran also recognizes these switches that control what to do with "extra" +markers, such as comment blocks: + -copy none Copy no extra markers from source file. This setting + suppresses all comments and other excess baggage + present in the source file. + -copy comments Copy only comment markers. This setting copies + comments from the source file, but discards + any other inessential data. + -copy all Copy all extra markers. This setting preserves + miscellaneous markers found in the source file, such + as JFIF thumbnails and Photoshop settings. In some + files these extra markers can be sizable. +The default behavior is -copy comments. (Note: in IJG releases v6 and v6a, +jpegtran always did the equivalent of -copy none.) + +Additional switches recognized by jpegtran are: + -outfile filename + -maxmemory N + -verbose + -debug +These work the same as in cjpeg or djpeg. + + +THE COMMENT UTILITIES + +The JPEG standard allows "comment" (COM) blocks to occur within a JPEG file. +Although the standard doesn't actually define what COM blocks are for, they +are widely used to hold user-supplied text strings. This lets you add +annotations, titles, index terms, etc to your JPEG files, and later retrieve +them as text. COM blocks do not interfere with the image stored in the JPEG +file. The maximum size of a COM block is 64K, but you can have as many of +them as you like in one JPEG file. + +We provide two utility programs to display COM block contents and add COM +blocks to a JPEG file. + +rdjpgcom searches a JPEG file and prints the contents of any COM blocks on +standard output. The command line syntax is + rdjpgcom [-verbose] [inputfilename] +The switch "-verbose" (or just "-v") causes rdjpgcom to also display the JPEG +image dimensions. If you omit the input file name from the command line, +the JPEG file is read from standard input. (This may not work on some +operating systems, if binary data can't be read from stdin.) + +wrjpgcom adds a COM block, containing text you provide, to a JPEG file. +Ordinarily, the COM block is added after any existing COM blocks, but you +can delete the old COM blocks if you wish. wrjpgcom produces a new JPEG +file; it does not modify the input file. DO NOT try to overwrite the input +file by directing wrjpgcom's output back into it; on most systems this will +just destroy your file. + +The command line syntax for wrjpgcom is similar to cjpeg's. On Unix-like +systems, it is + wrjpgcom [switches] [inputfilename] +The output file is written to standard output. The input file comes from +the named file, or from standard input if no input file is named. + +On most non-Unix systems, the syntax is + wrjpgcom [switches] inputfilename outputfilename +where both input and output file names must be given explicitly. + +wrjpgcom understands three switches: + -replace Delete any existing COM blocks from the file. + -comment "Comment text" Supply new COM text on command line. + -cfile name Read text for new COM block from named file. +(Switch names can be abbreviated.) If you have only one line of comment text +to add, you can provide it on the command line with -comment. The comment +text must be surrounded with quotes so that it is treated as a single +argument. Longer comments can be read from a text file. + +If you give neither -comment nor -cfile, then wrjpgcom will read the comment +text from standard input. (In this case an input image file name MUST be +supplied, so that the source JPEG file comes from somewhere else.) You can +enter multiple lines, up to 64KB worth. Type an end-of-file indicator +(usually control-D or control-Z) to terminate the comment text entry. + +wrjpgcom will not add a COM block if the provided comment string is empty. +Therefore -replace -comment "" can be used to delete all COM blocks from a +file. + +These utility programs do not depend on the IJG JPEG library. In +particular, the source code for rdjpgcom is intended as an illustration of +the minimum amount of code required to parse a JPEG file header correctly. diff --git a/third_party/windows/fltk-1.1.10/jpeg/wizard.doc b/third_party/windows/fltk-1.1.10/jpeg/wizard.doc new file mode 100644 index 0000000..02418ba --- /dev/null +++ b/third_party/windows/fltk-1.1.10/jpeg/wizard.doc @@ -0,0 +1,211 @@ +Advanced usage instructions for the Independent JPEG Group's JPEG software +========================================================================== + +This file describes cjpeg's "switches for wizards". + +The "wizard" switches are intended for experimentation with JPEG by persons +who are reasonably knowledgeable about the JPEG standard. If you don't know +what you are doing, DON'T USE THESE SWITCHES. You'll likely produce files +with worse image quality and/or poorer compression than you'd get from the +default settings. Furthermore, these switches must be used with caution +when making files intended for general use, because not all JPEG decoders +will support unusual JPEG parameter settings. + + +Quantization Table Adjustment +----------------------------- + +Ordinarily, cjpeg starts with a default set of tables (the same ones given +as examples in the JPEG standard) and scales them up or down according to +the -quality setting. The details of the scaling algorithm can be found in +jcparam.c. At very low quality settings, some quantization table entries +can get scaled up to values exceeding 255. Although 2-byte quantization +values are supported by the IJG software, this feature is not in baseline +JPEG and is not supported by all implementations. If you need to ensure +wide compatibility of low-quality files, you can constrain the scaled +quantization values to no more than 255 by giving the -baseline switch. +Note that use of -baseline will result in poorer quality for the same file +size, since more bits than necessary are expended on higher AC coefficients. + +You can substitute a different set of quantization values by using the +-qtables switch: + + -qtables file Use the quantization tables given in the named file. + +The specified file should be a text file containing decimal quantization +values. The file should contain one to four tables, each of 64 elements. +The tables are implicitly numbered 0,1,etc. in order of appearance. Table +entries appear in normal array order (NOT in the zigzag order in which they +will be stored in the JPEG file). + +Quantization table files are free format, in that arbitrary whitespace can +appear between numbers. Also, comments can be included: a comment starts +with '#' and extends to the end of the line. Here is an example file that +duplicates the default quantization tables: + + # Quantization tables given in JPEG spec, section K.1 + + # This is table 0 (the luminance table): + 16 11 10 16 24 40 51 61 + 12 12 14 19 26 58 60 55 + 14 13 16 24 40 57 69 56 + 14 17 22 29 51 87 80 62 + 18 22 37 56 68 109 103 77 + 24 35 55 64 81 104 113 92 + 49 64 78 87 103 121 120 101 + 72 92 95 98 112 100 103 99 + + # This is table 1 (the chrominance table): + 17 18 24 47 99 99 99 99 + 18 21 26 66 99 99 99 99 + 24 26 56 99 99 99 99 99 + 47 66 99 99 99 99 99 99 + 99 99 99 99 99 99 99 99 + 99 99 99 99 99 99 99 99 + 99 99 99 99 99 99 99 99 + 99 99 99 99 99 99 99 99 + +If the -qtables switch is used without -quality, then the specified tables +are used exactly as-is. If both -qtables and -quality are used, then the +tables taken from the file are scaled in the same fashion that the default +tables would be scaled for that quality setting. If -baseline appears, then +the quantization values are constrained to the range 1-255. + +By default, cjpeg will use quantization table 0 for luminance components and +table 1 for chrominance components. To override this choice, use the -qslots +switch: + + -qslots N[,...] Select which quantization table to use for + each color component. + +The -qslots switch specifies a quantization table number for each color +component, in the order in which the components appear in the JPEG SOF marker. +For example, to create a separate table for each of Y,Cb,Cr, you could +provide a -qtables file that defines three quantization tables and say +"-qslots 0,1,2". If -qslots gives fewer table numbers than there are color +components, then the last table number is repeated as necessary. + + +Sampling Factor Adjustment +-------------------------- + +By default, cjpeg uses 2:1 horizontal and vertical downsampling when +compressing YCbCr data, and no downsampling for all other color spaces. +You can override this default with the -sample switch: + + -sample HxV[,...] Set JPEG sampling factors for each color + component. + +The -sample switch specifies the JPEG sampling factors for each color +component, in the order in which they appear in the JPEG SOF marker. +If you specify fewer HxV pairs than there are components, the remaining +components are set to 1x1 sampling. For example, the default YCbCr setting +is equivalent to "-sample 2x2,1x1,1x1", which can be abbreviated to +"-sample 2x2". + +There are still some JPEG decoders in existence that support only 2x1 +sampling (also called 4:2:2 sampling). Compatibility with such decoders can +be achieved by specifying "-sample 2x1". This is not recommended unless +really necessary, since it increases file size and encoding/decoding time +with very little quality gain. + + +Multiple Scan / Progression Control +----------------------------------- + +By default, cjpeg emits a single-scan sequential JPEG file. The +-progressive switch generates a progressive JPEG file using a default series +of progression parameters. You can create multiple-scan sequential JPEG +files or progressive JPEG files with custom progression parameters by using +the -scans switch: + + -scans file Use the scan sequence given in the named file. + +The specified file should be a text file containing a "scan script". +The script specifies the contents and ordering of the scans to be emitted. +Each entry in the script defines one scan. A scan definition specifies +the components to be included in the scan, and for progressive JPEG it also +specifies the progression parameters Ss,Se,Ah,Al for the scan. Scan +definitions are separated by semicolons (';'). A semicolon after the last +scan definition is optional. + +Each scan definition contains one to four component indexes, optionally +followed by a colon (':') and the four progressive-JPEG parameters. The +component indexes denote which color component(s) are to be transmitted in +the scan. Components are numbered in the order in which they appear in the +JPEG SOF marker, with the first component being numbered 0. (Note that these +indexes are not the "component ID" codes assigned to the components, just +positional indexes.) + +The progression parameters for each scan are: + Ss Zigzag index of first coefficient included in scan + Se Zigzag index of last coefficient included in scan + Ah Zero for first scan of a coefficient, else Al of prior scan + Al Successive approximation low bit position for scan +If the progression parameters are omitted, the values 0,63,0,0 are used, +producing a sequential JPEG file. cjpeg automatically determines whether +the script represents a progressive or sequential file, by observing whether +Ss and Se values other than 0 and 63 appear. (The -progressive switch is +not needed to specify this; in fact, it is ignored when -scans appears.) +The scan script must meet the JPEG restrictions on progression sequences. +(cjpeg checks that the spec's requirements are obeyed.) + +Scan script files are free format, in that arbitrary whitespace can appear +between numbers and around punctuation. Also, comments can be included: a +comment starts with '#' and extends to the end of the line. For additional +legibility, commas or dashes can be placed between values. (Actually, any +single punctuation character other than ':' or ';' can be inserted.) For +example, the following two scan definitions are equivalent: + 0 1 2: 0 63 0 0; + 0,1,2 : 0-63, 0,0 ; + +Here is an example of a scan script that generates a partially interleaved +sequential JPEG file: + + 0; # Y only in first scan + 1 2; # Cb and Cr in second scan + +Here is an example of a progressive scan script using only spectral selection +(no successive approximation): + + # Interleaved DC scan for Y,Cb,Cr: + 0,1,2: 0-0, 0, 0 ; + # AC scans: + 0: 1-2, 0, 0 ; # First two Y AC coefficients + 0: 3-5, 0, 0 ; # Three more + 1: 1-63, 0, 0 ; # All AC coefficients for Cb + 2: 1-63, 0, 0 ; # All AC coefficients for Cr + 0: 6-9, 0, 0 ; # More Y coefficients + 0: 10-63, 0, 0 ; # Remaining Y coefficients + +Here is an example of a successive-approximation script. This is equivalent +to the default script used by "cjpeg -progressive" for YCbCr images: + + # Initial DC scan for Y,Cb,Cr (lowest bit not sent) + 0,1,2: 0-0, 0, 1 ; + # First AC scan: send first 5 Y AC coefficients, minus 2 lowest bits: + 0: 1-5, 0, 2 ; + # Send all Cr,Cb AC coefficients, minus lowest bit: + # (chroma data is usually too small to be worth subdividing further; + # but note we send Cr first since eye is least sensitive to Cb) + 2: 1-63, 0, 1 ; + 1: 1-63, 0, 1 ; + # Send remaining Y AC coefficients, minus 2 lowest bits: + 0: 6-63, 0, 2 ; + # Send next-to-lowest bit of all Y AC coefficients: + 0: 1-63, 2, 1 ; + # At this point we've sent all but the lowest bit of all coefficients. + # Send lowest bit of DC coefficients + 0,1,2: 0-0, 1, 0 ; + # Send lowest bit of AC coefficients + 2: 1-63, 1, 0 ; + 1: 1-63, 1, 0 ; + # Y AC lowest bit scan is last; it's usually the largest scan + 0: 1-63, 1, 0 ; + +It may be worth pointing out that this script is tuned for quality settings +of around 50 to 75. For lower quality settings, you'd probably want to use +a script with fewer stages of successive approximation (otherwise the +initial scans will be really bad). For higher quality settings, you might +want to use more stages of successive approximation (so that the initial +scans are not too large). diff --git a/third_party/windows/fltk-1.1.10/lib/README.lib b/third_party/windows/fltk-1.1.10/lib/README.lib new file mode 100644 index 0000000..6177984 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/lib/README.lib @@ -0,0 +1,16 @@ +README.lib +---------- + +This README file is a placeholder for library files on your +system. + +Under Microsoft Windows a successful build of all projects and +configurations will contain debug and release libraries for you +to link to - all are built using the multi-threaded DLL +settings. The DLL files (fltkdll.dll and fltkdlld.dll) required +for a complete DLL-based binary distribution are located in the +"visualc" directory. + +Under UNIX a single set of library files will be built, with or +without debug information depending on the options you provided +to the configure script. diff --git a/third_party/windows/fltk-1.1.10/makefiles/Makefile.mingw b/third_party/windows/fltk-1.1.10/makefiles/Makefile.mingw new file mode 100644 index 0000000..d4d7981 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/makefiles/Makefile.mingw @@ -0,0 +1,118 @@ +# +# "$Id: Makefile.mingw 5844 2007-05-18 19:04:14Z matt $" +# +# Top-level makefile for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2006 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems on the following page: +# +# http://www.fltk.org/str.php +# + +include makeinclude + +DIRS = $(IMAGEDIRS) src fluid test documentation + +all: makeinclude + for dir in $(DIRS); do\ + echo "=== making $$dir ===";\ + (cd $$dir; $(MAKE) $(MFLAGS)) || exit 1;\ + done + +install: makeinclude + -mkdir -p $(DESTDIR)$(bindir) + $(RM) $(DESTDIR)$(bindir)/fltk-config + $(INSTALL_SCRIPT) fltk-config $(DESTDIR)$(bindir) + for dir in FL $(DIRS); do\ + echo "=== installing $$dir ===";\ + (cd $$dir; $(MAKE) $(MFLAGS) install) || exit 1;\ + done + +install-desktop: makeinclude + cd documentation; $(MAKE) $(MFLAGS) $(INSTALL_DESKTOP) + cd fluid; $(MAKE) $(MFLAGS) $(INSTALL_DESKTOP) + cd test; $(MAKE) $(MFLAGS) $(INSTALL_DESKTOP) + +uninstall: makeinclude + $(RM) $(DESTDIR)$(bindir)/fltk-config + for dir in FL $(DIRS); do\ + echo "=== uninstalling $$dir ===";\ + (cd $$dir; $(MAKE) $(MFLAGS) uninstall) || exit 1;\ + done + +uninstall-desktop: makeinclude + cd documentation; $(MAKE) $(MFLAGS) $(UNINSTALL_DESKTOP) + cd fluid; $(MAKE) $(MFLAGS) $(UNINSTALL_DESKTOP) + cd test; $(MAKE) $(MFLAGS) $(UNINSTALL_DESKTOP) + +depend: makeinclude + for dir in $(DIRS); do\ + echo "=== making dependencies in $$dir ===";\ + (cd $$dir; $(MAKE) $(MFLAGS) depend) || exit 1;\ + done + +clean: + -$(RM) core *.o + for dir in $(DIRS); do\ + echo "=== cleaning $$dir ===";\ + (cd $$dir; $(MAKE) $(MFLAGS) clean) || exit 1;\ + done + +distclean: clean + $(RM) config.* + $(RM) fltk-config fltk.list makeinclude + $(RM) fltk.spec + $(RM) FL/Makefile + $(RM) documentation/*.$(CAT1EXT) + $(RM) documentation/*.$(CAT3EXT) + $(RM) documentation/*.$(CAT6EXT) + $(RM) documentation/fltk.pdf + $(RM) documentation/fltk.ps + $(RM) -r documentation/fltk.d + for file in test/*.fl; do\ + $(RM) test/`basename $$file .fl`.cxx; \ + $(RM) test/`basename $$file .fl`.h; \ + done + +makeinclude: configure configh.in makeinclude.in + if test -f config.status; then \ + ./config.status --recheck; \ + ./config.status; \ + else \ + ./configure; \ + fi + touch config.h + chmod +x fltk-config + +configure: configure.in + autoconf + +portable-dist: + epm -v -s fltk.xpm fltk + +native-dist: + epm -v -f native fltk + +etags: + etags FL/*.H FL/*.h src/*.cxx src/*.c src/*.h fluid/*.h fluid/*.cxx test/*.h test/*.cxx + +# +# End of "$Id: Makefile.mingw 5844 2007-05-18 19:04:14Z matt $". +# + diff --git a/third_party/windows/fltk-1.1.10/makefiles/Makefile.os2x b/third_party/windows/fltk-1.1.10/makefiles/Makefile.os2x new file mode 100644 index 0000000..eb9bcf6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/makefiles/Makefile.os2x @@ -0,0 +1,78 @@ +# +# "$Id: Makefile.os2x 4052 2005-02-24 21:55:12Z mike $" +# +# Top-level makefile for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2000 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems to "fltk-bugs@fltk.org". +# + +# SHELL=cmd.exe + +all: makeinclude config.h + echo "=== making src ===" + touch src/makedepend + cd src & $(MAKE) + echo "=== making fluid ===" + touch fluid/makedepend + cd fluid & $(MAKE) + echo "=== making test ===" + touch test/makedepend + cd test & $(MAKE) + +install: + echo "=== installing src ===" + touch src/makedepend + cd src & $(MAKE) install + echo "=== installing fluid ===" + touch fluid/makedepend + cd fluid & $(MAKE) install + +depend: + echo "=== making src dependencies ===" + touch src/makedepend + cd src & $(MAKE) depend + echo "=== making fluid dependencies ===" + touch fluid/makedepend + cd fluid & $(MAKE) depend + echo "=== making test dependencies ===" + touch test/makedepend + cd test & $(MAKE) depend + +clean: + -@ rm -f core config.cache *.o *.bck + echo "=== cleaning src ===" + touch src/makedepend + cd src & $(MAKE) clean + echo "=== cleaning fluid ===" + touch fluid/makedepend + cd fluid & $(MAKE) clean + echo "=== cleaning test ===" + touch test/makedepend + cd test & $(MAKE) clean + +config.h: makefiles/config.os2x + cp $< $@ + +makeinclude: makefiles/makeinclude.os2x + cp $< $@ + +# +# End of "$Id: Makefile.os2x 4052 2005-02-24 21:55:12Z mike $". +# diff --git a/third_party/windows/fltk-1.1.10/makefiles/config.mingw b/third_party/windows/fltk-1.1.10/makefiles/config.mingw new file mode 100644 index 0000000..5a61513 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/makefiles/config.mingw @@ -0,0 +1,302 @@ +/* + * "$Id: config.mingw 5844 2007-05-18 19:04:14Z matt $" + * + * Configuration file for the Fast Light Tool Kit (FLTK). + * @configure_input@ + * + * Copyright 1998-2007 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems on the following page: + * + * http://www.fltk.org/str.php + */ + +/* config.h. Generated by configure. */ + +/* + * Where to find files... + */ + +#define FLTK_DATADIR "/usr/local/share/fltk" +#define FLTK_DOCDIR "/usr/local/share/doc/fltk" + +/* + * BORDER_WIDTH: + * + * Thickness of FL_UP_BOX and FL_DOWN_BOX. Current 1,2, and 3 are + * supported. + * + * 3 is the historic FLTK look. + * 2 is the default and looks like Microsoft Windows, KDE, and Qt. + * 1 is a plausible future evolution... + * + * Note that this may be simulated at runtime by redefining the boxtypes + * using Fl::set_boxtype(). + */ + +#define BORDER_WIDTH 2 + +/* + * HAVE_GL: + * + * Do you have OpenGL? Set this to 0 if you don't have or plan to use + * OpenGL, and FLTK will be smaller. + */ + +#define HAVE_GL 1 + +/* + * HAVE_GL_GLU_H: + * + * Do you have the OpenGL Utility Library header file? + * (many broken Mesa RPMs do not...) + */ + +#define HAVE_GL_GLU_H 1 + +/* + * HAVE_GLXGETPROCADDRESSARB: + * + * Do you have the OpenGL glXGetProcAddressARB() function? + */ + +/* #undef HAVE_GLXGETPROCADDRESSARB */ + +/* + * USE_COLORMAP: + * + * Setting this to zero will save a good deal of code (especially for + * fl_draw_image), but FLTK will only work on TrueColor visuals. + */ + +#define USE_COLORMAP 1 + +/* + * HAVE_XINERAMA + * + * Do we have the Xinerama library to support multi-head displays? + */ + +#define HAVE_XINERAMA 0 + +/* + * USE_XFT + * + * Use the new Xft library to draw anti-aliased text. + */ + +#define USE_XFT 0 + +/* + * HAVE_XDBE: + * + * Do we have the X double-buffer extension? + */ + +#define HAVE_XDBE 0 + +/* + * USE_XDBE: + * + * Actually try to use the double-buffer extension? + */ + +#define USE_XDBE HAVE_XDBE + +/* + * USE_QUARTZ: + * + * Use Quartz instead of Quickdraw on Apple Mac OS X machines. + * FLTK was originally ported to Quickdraw which is no longer + * supported by Apple. If USE_QUARTZ is defined, FLTK will be + * compiled using Quartz instead. This flag has no meaning on + * other operating systems. + */ + +#define USE_QUARTZ 0 +/* #undef __APPLE_QUARTZ__ */ +/* #undef __APPLE_QD__ */ + +/* + * HAVE_OVERLAY: + * + * Use the X overlay extension? FLTK will try to use an overlay + * visual for Fl_Overlay_Window, the Gl_Window overlay, and for the + * menus. Setting this to zero will remove a substantial amount of + * code from FLTK. Overlays have only been tested on SGI servers! + */ + +#define HAVE_OVERLAY 0 + +/* + * HAVE_GL_OVERLAY: + * + * It is possible your GL has an overlay even if X does not. If so, + * set this to 1. + */ + +#define HAVE_GL_OVERLAY HAVE_OVERLAY + +/* + * WORDS_BIGENDIAN: + * + * Byte order of your machine: 1 = big-endian, 0 = little-endian. + */ + +#define WORDS_BIGENDIAN 0 + +/* + * U16, U32, U64: + * + * Types used by fl_draw_image. One of U32 or U64 must be defined. + * U16 is optional but FLTK will work better with it! + */ + +#define U16 unsigned short +#define U32 unsigned +/* #undef U64 */ + +/* + * HAVE_DIRENT_H, HAVE_SYS_NDIR_H, HAVE_SYS_DIR_H, HAVE_NDIR_H, HAVE_SCANDIR: + * + * Where is (used only by fl_file_chooser and scandir). + */ + +#define HAVE_DIRENT_H 1 +/* #undef HAVE_SYS_NDIR_H */ +/* #undef HAVE_SYS_DIR_H */ +/* #undef HAVE_NDIR_H */ +/* #undef HAVE_SCANDIR */ + +/* + * Possibly missing sprintf-style functions: + */ + +#define HAVE_VSNPRINTF 1 +#define HAVE_SNPRINTF 1 + +/* + * String functions and headers... + */ + +#define HAVE_STRINGS_H 1 +#define HAVE_STRCASECMP 1 +/* #undef HAVE_STRLCAT */ +/* #undef HAVE_STRLCPY */ + +/* + * Do we have POSIX locale support? + */ + +#define HAVE_LOCALE_H 1 +#define HAVE_LOCALECONV 1 + +/* + * HAVE_SYS_SELECT_H: + * + * Whether or not select() call has its own header file. + */ + +/* #undef HAVE_SYS_SELECT_H */ + +/* + * HAVE_SYS_STDTYPES_H: + * + * Whether or not we have the header file. + */ + +/* #undef HAVE_SYS_STDTYPES_H */ + +/* + * USE_POLL: + * + * Use the poll() call provided on Linux and Irix instead of select() + */ + +#define USE_POLL 0 + +/* + * Do we have various image libraries? + */ + +#define HAVE_LIBPNG 1 +#define HAVE_LIBZ 1 +#define HAVE_LIBJPEG 1 + +/* + * Which header file do we include for libpng? + */ + +#define HAVE_PNG_H 1 +/* #undef HAVE_LIBPNG_PNG_H */ + +/* + * Do we have the png_xyz() functions? + */ + +/* #undef HAVE_PNG_GET_VALID */ +/* #undef HAVE_PNG_SET_TRNS_TO_ALPHA */ + +/* + * Do we have POSIX threading? + */ + +/* #undef HAVE_PTHREAD */ +/* #undef HAVE_PTHREAD_H */ + +/* + * Do we have the ALSA library? + */ + +/* #undef HAVE_ALSA_ASOUNDLIB_H */ + +/* + * Do we have the long long type? + */ + +#define HAVE_LONG_LONG 1 + +#ifdef HAVE_LONG_LONG +# define FLTK_LLFMT "%lld" +# define FLTK_LLCAST (long long) +#else +# define FLTK_LLFMT "%ld" +# define FLTK_LLCAST (long) +#endif /* HAVE_LONG_LONG */ + +/* + * Do we have the strtoll() function? + */ + +#define HAVE_STRTOLL 1 + +#ifndef HAVE_STRTOLL +# define strtoll(nptr,endptr,base) strtol((nptr), (endptr), (base)) +#endif /* !HAVE_STRTOLL */ + +/* + * Do we have the dlsym() function and header? + */ + +/* #undef HAVE_DLFCN_H */ +/* #undef HAVE_DLSYM */ + +/* + * End of "$Id: config.mingw 5844 2007-05-18 19:04:14Z matt $". + */ + diff --git a/third_party/windows/fltk-1.1.10/makefiles/config.os2x b/third_party/windows/fltk-1.1.10/makefiles/config.os2x new file mode 100644 index 0000000..2951d21 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/makefiles/config.os2x @@ -0,0 +1,231 @@ +/* config.h. Generated automatically by configure. */ +/* + * "$Id: config.os2x 4454 2005-07-24 18:41:30Z matt $" + * + * Configuration file for the Fast Light Tool Kit (FLTK). + * + * Copyright 1998-2003 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems to "fltk-bugs@fltk.org". + */ + +/* + * Where to find files... + */ + +#define FLTK_DATADIR "/usr/local/share/fltk" +#define FLTK_DOCDIR "/usr/local/share/doc/fltk" + +/* + * BORDER_WIDTH: + * + * Thickness of FL_UP_BOX and FL_DOWN_BOX. Current 1,2, and 3 are + * supported. + * + * 3 is the historic FLTK look. + * 2 is the default and looks like Microsoft Windows, KDE, and Qt. + * 1 is a plausible future evolution... + * + * Note that this may be simulated at runtime by redefining the boxtypes + * using Fl::set_boxtype(). + */ + +#define BORDER_WIDTH 2 + +/* + * HAVE_GL: + * + * Do you have OpenGL? Set this to 0 if you don't have or plan to use + * OpenGL, and FLTK will be smaller. + */ + +#define HAVE_GL 0 + +/* + * HAVE_GL_GLU_H: + * + * Do you have the OpenGL Utility Library header file? + * (many broken Mesa RPMs do not...) + */ + +#define HAVE_GL_GLU_H 1 + +/* + * USE_COLORMAP: + * + * Setting this to zero will save a good deal of code (especially for + * fl_draw_image), but FLTK will only work on TrueColor visuals. + */ + +#define USE_COLORMAP 1 + +/* + * USE_XFT + * + * Use the new Xft library to draw anti-aliased text. + */ + +#define USE_XFT 0 + +/* + * HAVE_XDBE: + * + * Do we have the X double-buffer extension? + */ + +#define HAVE_XDBE 1 + +/* + * USE_XDBE: + * + * Actually try to use the double-buffer extension? + */ + +#define USE_XDBE HAVE_XDBE + +/* + * HAVE_OVERLAY: + * + * Use the X overlay extension? FLTK will try to use an overlay + * visual for Fl_Overlay_Window, the Gl_Window overlay, and for the + * menus. Setting this to zero will remove a substantial amount of + * code from FLTK. Overlays have only been tested on SGI servers! + */ + +#define HAVE_OVERLAY 0 + +/* + * HAVE_GL_OVERLAY: + * + * It is possible your GL has an overlay even if X does not. If so, + * set this to 1. + */ + +#define HAVE_GL_OVERLAY HAVE_OVERLAY + +/* + * WORDS_BIGENDIAN: + * + * Byte order of your machine: 1 = big-endian, 0 = little-endian. + */ + +#define WORDS_BIGENDIAN 0 + +/* + * U16, U32, U64: + * + * Types used by fl_draw_image. One of U32 or U64 must be defined. + * U16 is optional but FLTK will work better with it! + */ + +#define U16 unsigned short +#define U32 unsigned +/* #undef U64 */ + +/* + * HAVE_DIRENT_H, HAVE_SYS_NDIR_H, HAVE_SYS_DIR_H, HAVE_NDIR_H, HAVE_SCANDIR: + * + * Where is (used only by fl_file_chooser and scandir). + */ + +#define HAVE_DIRENT_H 1 +/* #undef HAVE_SYS_NDIR_H */ +/* #undef HAVE_SYS_DIR_H */ +/* #undef HAVE_NDIR_H */ +/* #undef HAVE_SCANDIR */ + +/* + * Possibly missing sprintf-style functions: + */ + +#define HAVE_VSNPRINTF 1 +#define HAVE_SNPRINTF 1 + +/* + * String functions and headers... + */ + +#define HAVE_STRINGS_H 1 +#define HAVE_STRCASECMP 1 +/* #undef HAVE_STRLCAT*/ +/* #undef HAVE_STRLCPY*/ + +/* + * Do we have POSIX locale support? + */ + +#define HAVE_LOCALE_H 1 +#define HAVE_LOCALECONV 1 + +/* + * HAVE_SYS_SELECT_H: + * + * Whether or not select() call has its own header file. + */ + +#define HAVE_SYS_SELECT_H 1 + +/* + * HAVE_SYS_STDTYPES_H: + * + * Whether or not we have the header file. + */ + +/* #undef HAVE_SYS_STDTYPES_H */ + +/* + * USE_POLL: + * + * Use the poll() call provided on Linux and Irix instead of select() + */ + +#define USE_POLL 0 + +/* + * Do we have various image libraries? + */ + +#define HAVE_LIBPNG 1 +#define HAVE_LIBZ 1 +#define HAVE_LIBJPEG 1 + +/* + * Which header file do we include for libpng? + */ + +#define HAVE_PNG_H 1 +/* #undef HAVE_LIBPNG_PNG_H */ + +/* + * Do we have the png_xyz() functions? + */ + +#define HAVE_PNG_GET_VALID 1 +/* #undef HAVE_PNG_SET_TRNS_TO_ALPHA */ + +/* + * Do we have POSIX threading? + */ + +/* #undef HAVE_PTHREAD */ +/* #undef HAVE_PTHREAD_H */ + + +/* + * End of "$Id: config.os2x 4454 2005-07-24 18:41:30Z matt $". + */ diff --git a/third_party/windows/fltk-1.1.10/makefiles/makeinclude.mingw b/third_party/windows/fltk-1.1.10/makefiles/makeinclude.mingw new file mode 100644 index 0000000..65ea73b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/makefiles/makeinclude.mingw @@ -0,0 +1,160 @@ +# +# "$Id: makeinclude.mingw 5844 2007-05-18 19:04:14Z matt $" +# +# Make include file for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2007 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems on the following page: +# +# http://www.fltk.org/str.php +# + +prefix = /usr/local +exec_prefix = ${prefix} +bindir = ${exec_prefix}/bin +datadir = ${prefix}/share +datarootdir = @datarootdir@ +includedir = ${prefix}/include +libdir = ${exec_prefix}/lib +mandir = ${prefix}/man +srcdir = . +docdir = $(datadir)/doc/fltk + + +# programs we use... +HTMLDOC = +INSTALL = /bin/install -c +LN = ln -s +NROFF = +RM = rm -f +RMDIR = rm -rf +SHELL = /bin/sh +STRIP = strip + +# compiler names: +CXX = g++ +CC = gcc +MAKEDEPEND = $(CXX) -M + +# flags for C++ compiler: +ARCHFLAGS = +OPTIM = -O3 -Wall -Wunused -Wno-format-y2k -fno-exceptions -fno-strict-aliasing +CFLAGS = $(OPTIM) -mno-cygwin -mwindows -DWIN32 -mno-cygwin +CXXFLAGS = $(OPTIM) -mno-cygwin -mwindows -DWIN32 -mno-cygwin + +# program to make the archive: +LIBNAME = ../lib/libfltk.a +FLLIBNAME = ../lib/libfltk_forms.a +GLLIBNAME = ../lib/libfltk_gl.a +IMGLIBNAME = ../lib/libfltk_images.a +LIBCOMMAND = /mingw/bin/ar cr +LIBEXT = .a +RANLIB = ranlib +DSONAME = mgwfltknox-1.1.dll +FLDSONAME = mgwfltknox_forms-1.1.dll +GLDSONAME = mgwfltknox_gl-1.1.dll +IMGDSONAME = mgwfltknox_images-1.1.dll +DSOCOMMAND = $(CXX) $(DSOFLAGS) -shared -Wl,--whole-archive -Wl,--export-all-symbols -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-import -Wl,--enable-auto-image-base -o $@ + +# libraries to link with: +AUDIOLIBS = -lwinmm +DSOFLAGS = -mwindows -mno-cygwin +LDFLAGS = $(OPTIM) -mwindows -mno-cygwin -Wl,--enable-auto-import -Wl,--enable-runtime-pseudo-reloc +LDLIBS = -lole32 -luuid -lcomctl32 -lwsock32 +GLDLIBS = -lglu32 -lopengl32 -lole32 -luuid -lcomctl32 -lwsock32 +LINKFLTK = ../lib/libfltk.a +LINKFLTKGL = ../lib/libfltk_gl.a +LINKFLTKFORMS = ../lib/libfltk_forms.a ../lib/libfltk.a +LINKFLTKIMG = ../lib/libfltk_images.a ../lib/libfltk.a $(IMAGELIBS) +LINKSHARED = -L../src -lfltk_images -lfltk_forms -lfltk $(IMAGELIBS) +IMAGELIBS = -L../lib -lfltk_png -lfltk_z -lfltk_jpeg + +# image libraries to build... +IMAGEDIRS = jpeg zlib png + +# The extension to use for executables... +EXEEXT = .exe + +# Do we build the OpenGL demos? +GLDEMOS = gldemos + +# Do we build the threads demo? +THREADS = threads.exe + +# Name of FLUID executable we install +FLUID = fluid-shared$(EXEEXT) + +# Possible steps after linking... +POSTBUILD = : + +# Man page extensions... +CAT1EXT = 1 +CAT3EXT = 3 +CAT6EXT = 6 + +# +# Installation programs... +# + +INSTALL_BIN = $(INSTALL) -m 755 +INSTALL_DATA = $(INSTALL) -m 644 +INSTALL_DIR = $(INSTALL) -d +INSTALL_LIB = $(INSTALL) -m 755 +INSTALL_MAN = $(INSTALL) -m 644 +INSTALL_SCRIPT = $(INSTALL) -m 755 + +# Additional GUI install/uninstall targets... +INSTALL_DESKTOP = +UNINSTALL_DESKTOP = + +# Be quiet when building... +.SILENT: + +# Build commands and filename extensions... +.SUFFIXES: .0 .1 .3 .6 .c .cxx .h .fl .man .o .z $(EXEEXT) + +.o$(EXEEXT): + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) $< $(LINKFLTK) $(LDLIBS) -o $@ + $(POSTBUILD) $@ ../FL/mac.r + +.c.o: + echo Compiling $<... + $(CC) -I.. $(ARCHFLAGS) -I../png -I../jpeg -I../zlib $(CFLAGS) -c $< + +.cxx.o: + echo Compiling $<... + $(CXX) -I.. $(ARCHFLAGS) -I../png -I../jpeg -I../zlib $(CXXFLAGS) -c $< + +.man.0 .man.1 .man.3 .man.6: + echo Formatting $<... + rm -f $@ + $(NROFF) -man $< >$@ + +.man.z: + echo Formatting $<... + rm -f $@ t.z + $(NROFF) -man $< >t + pack -f t + mv t.z $@ + +# +# End of "$Id: makeinclude.mingw 5844 2007-05-18 19:04:14Z matt $". +# + diff --git a/third_party/windows/fltk-1.1.10/makefiles/makeinclude.mingw31 b/third_party/windows/fltk-1.1.10/makefiles/makeinclude.mingw31 new file mode 100644 index 0000000..b77b727 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/makefiles/makeinclude.mingw31 @@ -0,0 +1,127 @@ +# +# "$Id: makeinclude.mingw31 4052 2005-02-24 21:55:12Z mike $" +# +# Make include file for the Fast Light Tool Kit (FLTK). +# (this file for MingW using GCC 3.1.x) +# +# Copyright 1998-2003 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems to "fltk-bugs@fltk.org". +# + +# Notes: +# +# 1) Console windows appearing +# +# Consoles will not appear when run from a command line prompt +# but will cause an 'unnecessary' console to appear when run directly from +# windows (say explorer). It provides i/o for stdin/stdout for debugging +# +# To avoid this add "-mwindows" to LDLIBS and GLDLIBS below +# +# 2) Stripping the executable to reduce size +# +# An external program may be run to strip out any debug symbols: +# strip filename.exe +# +# Alternatively add -s option to LDLIBS and GLDLIBS below to strip all +# symbols. (or -S for stripping of debug symbols only). See 'ld' man page +# for other useful link-time options. +# +# The default is to leave -mwindows and the stripping off, so as to facilitate +# debugging. For release it may be appropriate to add these additional switches + + +prefix = /usr/local +exec_prefix = ${prefix} +bindir = ${exec_prefix}/bin +includedir = ${prefix}/include +libdir = ${exec_prefix}/lib +srcdir = . + +# programs we use... +CHMOD = : +CP = copy +HTMLDOC = htmldoc.exe +LN = : +MKDIR = md +NROFF = nroff +RM = del +RMDIR = rd +STRIP = : + +# compiler names: +CXX = g++ +CC = gcc +MAKEDEPEND = $(CXX) -M +POSTBUILD = : + +# flags for C++ compiler: +CFLAGS = -Wall -O2 -DWIN32 +CXXFLAGS = -Wall -O2 -DWIN32 + +# program to make the archive: +LIBNAME = ../lib/libfltk.a +FLLIBNAME = ../lib/libfltk_forms.a +GLLIBNAME = ../lib/libfltk_gl.a +IMGLIBNAME = ../lib/libfltk_images.a +LIBCOMMAND = ar -ruv +LIBEXT = .a +RANLIB = ranlib +DSONAME = +FLDSONAME = +GLDSONAME = +IMGDSONAME = +DSOCOMMAND = echo + +# libraries to link with (in addition to default libs): +LDLIBS =-mwindows -lole32 -luuid -lgdi32 -lcomctl32 -lwsock32 -lsupc++ +GLDLIBS =-mwindows -lole32 -luuid -lglu32 -lopengl32 -lgdi32 -lcomctl32 -lwsock32 -lsupc++ +LINKFLTK =-L../lib -lfltk +LINKFLTKGL =-L../lib -lfltk_gl +LINKFLTKFORMS =-L../lib -lfltk_forms -lfltk +LINKFLTKIMG =-L../lib -lfltk_images -lfltk +IMAGELIBS = + +# Do we build the OpenGL demos? +GLDEMOS =gldemos + +# Do we build the threads demo? +THREADS =threads + +# Be quiet when building... +.SILENT: + +# Build commands and filename extensions... +.SUFFIXES: .c .cxx .h .fl .o + +.cxx: + echo Compiling and linking $@... + $(CXX) -I.. $(CXXFLAGS) $< $(LINKFLTK) $(LDLIBS) -o $@ + +.c.o: + echo Compiling $@... + $(CC) -I.. $(CXXFLAGS) $< -c + +.cxx.o: + echo Compiling $@... + $(CXX) -I.. $(CXXFLAGS) $< -c + +# +# End of "$Id: makeinclude.mingw31 4052 2005-02-24 21:55:12Z mike $". +# diff --git a/third_party/windows/fltk-1.1.10/makefiles/makeinclude.os2x b/third_party/windows/fltk-1.1.10/makefiles/makeinclude.os2x new file mode 100644 index 0000000..3f85831 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/makefiles/makeinclude.os2x @@ -0,0 +1,129 @@ +# +# "$Id: makeinclude.os2x 4052 2005-02-24 21:55:12Z mike $" +# +# Make include file for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2003 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems to "fltk-bugs@fltk.org". +# + +prefix = /usr/local +exec_prefix = ${prefix} +bindir = ${exec_prefix}/bin +datadir = ${prefix}/share +includedir = ${prefix}/include +libdir = ${exec_prefix}/lib +mandir = ${prefix}/man +srcdir = ./. +VPATH = ./. + +# programs we use... +CHMOD = : +CP = copy +HTMLDOC = htmldoc.exe +LN = : +MKDIR = md +NROFF = nroff +RM = if exist %1 del %1 +RMDIR = rd +STRIP = : + +# compiler names: +CXX = gcc.exe +CC = gcc.exe +MAKEDEPEND = $(CXX) -M + +# flags for C++ compiler: +OPTIM = -O2 -Wall -fno-exceptions +CFLAGS = $(OPTIM) -O4 -mpentium -Zmt +CXXFLAGS = $(OPTIM) -O4 -mpentium -Zmt + +# program to make the archive: +LIBNAME = ../lib/libfltk.a +FLLIBNAME = ../lib/libfltk_forms.a +GLLIBNAME = +IMGLIBNAME = ../lib/libfltk_images.a +LIBCOMMAND = ar.exe cr +LIBEXT = .a +RANLIB = ar.exe s +DSONAME = +FLDSONAME = +GLDSONAME = +IMGDSONAME = +DSOCOMMAND =echo + +# libraries to link with: +LDLIBS = -s -Zmt -Zcrtdll -Zbsd-signals -lXext -lX11 -lsocket +GLDLIBS = -s -Zmt -Zcrtdll -Zbsd-signals -lXext -lX11 -lsocket -lshm +LINKFLTK = ../lib/libfltk.a +LINKFLTKGL = -L../lib +LINKFLTKFORMS = ../lib/libfltk_forms.a ../lib/libfltk.a +IMAGELIBS = -lpng -ljpeg -lz +LINKFLTKIMG = ../lib/libfltk_images.a $(IMAGELIBS) ../lib/libfltk.a + +# Do we build the OpenGL demos? +GLDEMOS = + +# Do we build the threads demo? +THREADS = + +# The extension to use for executables... +EXEEXT =.exe + +# Possible steps after linking... +POSTBUILD = touch + +# Man page extensions... +CAT1EXT =1 +CAT3EXT =3 + +# Be quiet when building... +.SILENT: + +# Build commands and filename extensions... +.SUFFIXES: .0 .1 .3 .c .cxx .h .fl .man .o .z $(EXEEXT) + +.o$(EXEEXT): + echo Linking $@... + $(CXX) -I.. $(CXXFLAGS) $< $(LINKFLTK) $(LDLIBS) -o $@ + $(POSTBUILD) $@ ../FL/mac.r + +.c.o: + echo Compiling $<... + $(CC) -I.. $(CFLAGS) -c $< + +.cxx.o: + echo Compiling $<... + $(CXX) -I.. $(CXXFLAGS) -c $< + +.man.0 .man.1 .man.3: + echo Formatting $<... + rm -f $@ + $(NROFF) -man $< >$@ + +.man.z: + echo Formatting $<... + rm -f $@ t.z + $(NROFF) -man $< >t + pack -f t + mv t.z $@ + +# +# End of "$Id: makeinclude.os2x 4052 2005-02-24 21:55:12Z mike $". +# diff --git a/third_party/windows/fltk-1.1.10/makeinclude.in b/third_party/windows/fltk-1.1.10/makeinclude.in new file mode 100644 index 0000000..6149581 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/makeinclude.in @@ -0,0 +1,167 @@ +# +# "$Id: makeinclude.in 6612 2008-12-29 20:21:29Z matt $" +# +# Make include file for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2007 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems on the following page: +# +# http://www.fltk.org/str.php +# + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +includedir = @includedir@ +libdir = @libdir@ +mandir = @mandir@ +srcdir = @srcdir@ +docdir = $(datadir)/doc/fltk +VPATH = @srcdir@ + +# programs we use... +HTMLDOC = @HTMLDOC@ +INSTALL = @INSTALL@ +LN = ln -s +NROFF = @NROFF@ +RM = rm -f +RMDIR = rm -rf +SHELL = /bin/sh +STRIP = strip + +# compiler names: +CXX = @CXX@ +CC = @CC@ +MAKEDEPEND = @MAKEDEPEND@ + +# flags for C++ compiler: +ARCHFLAGS = @ARCHFLAGS@ +OPTIM = @OPTIM@ +CFLAGS = $(OPTIM) @LARGEFILE@ @PTHREAD_FLAGS@ @CPPFLAGS@ @CFLAGS@ +CXXFLAGS = $(OPTIM) @LARGEFILE@ @PTHREAD_FLAGS@ @CPPFLAGS@ @CXXFLAGS@ + +# program to make the archive: +LIBNAME = @LIBNAME@ +FLLIBNAME = @FLLIBNAME@ +GLLIBNAME = @GLLIBNAME@ +IMGLIBNAME = @IMGLIBNAME@ +LIBCOMMAND = @LIBCOMMAND@ +LIBEXT = @LIBEXT@ +RANLIB = @RANLIB@ +DSONAME = @DSONAME@ +FLDSONAME = @FLDSONAME@ +GLDSONAME = @GLDSONAME@ +IMGDSONAME = @IMGDSONAME@ +DSOCOMMAND = @DSOCOMMAND@ + +LIBBASENAME = @LIBBASENAME@ +FLLIBBASENAME = @FLLIBBASENAME@ +GLLIBBASENAME = @GLLIBBASENAME@ +IMGLIBBASENAME = @IMGLIBBASENAME@ + +# libraries to link with: +AUDIOLIBS = @AUDIOLIBS@ +DSOFLAGS = -L. @DSOFLAGS@ +LDFLAGS = $(OPTIM) @LDFLAGS@ +LDLIBS = @LIBS@ +GLDLIBS = @GLLIB@ @LIBS@ +LINKFLTK = @LINKFLTK@ +LINKFLTKGL = @LINKFLTKGL@ +LINKFLTKFORMS = @LINKFLTKFORMS@ @LINKFLTK@ +LINKFLTKIMG = @LINKFLTKIMG@ @LINKFLTK@ $(IMAGELIBS) +LINKSHARED = @DSOLINK@ @LINKSHARED@ $(IMAGELIBS) +IMAGELIBS = -L../lib @IMAGELIBS@ + +# image libraries to build... +IMAGEDIRS = @JPEG@ @ZLIB@ @PNG@ + +# The extension to use for executables... +EXEEXT = @EXEEXT@ + +# Do we build the OpenGL demos? +GLDEMOS = @GLDEMOS@ + +# Do we build the threads demo? +THREADS = @THREADS@ + +# Name of FLUID executable we install +FLUID = @FLUID@$(EXEEXT) + +# Possible steps for OS X build only +OSX_ONLY = @OSX_ONLY@ + +# Possible steps after linking... +POSTBUILD = @POSTBUILD@ + +# Man page extensions... +CAT1EXT = @CAT1EXT@ +CAT3EXT = @CAT3EXT@ +CAT6EXT = @CAT6EXT@ + +# +# Installation programs... +# + +INSTALL_BIN = $(INSTALL) -m 755 +INSTALL_DATA = $(INSTALL) -m 644 +INSTALL_DIR = $(INSTALL) -d +INSTALL_LIB = $(INSTALL) -m 755 +INSTALL_MAN = $(INSTALL) -m 644 +INSTALL_SCRIPT = $(INSTALL) -m 755 + +# Additional GUI install/uninstall targets... +INSTALL_DESKTOP = @INSTALL_DESKTOP@ +UNINSTALL_DESKTOP = @UNINSTALL_DESKTOP@ + +# Be quiet when building... +.SILENT: + +# Build commands and filename extensions... +.SUFFIXES: .0 .1 .3 .6 .c .cxx .h .fl .man .o .z $(EXEEXT) + +.o$(EXEEXT): + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) $< $(LINKFLTK) $(LDLIBS) -o $@ + $(POSTBUILD) $@ ../FL/mac.r + +.c.o: + echo Compiling $<... + $(CC) -I.. $(ARCHFLAGS) @PNGINC@ @JPEGINC@ @ZLIBINC@ $(CFLAGS) -c $< + +.cxx.o: + echo Compiling $<... + $(CXX) -I.. $(ARCHFLAGS) @PNGINC@ @JPEGINC@ @ZLIBINC@ $(CXXFLAGS) -c $< + +.man.0 .man.1 .man.3 .man.6: + echo Formatting $<... + rm -f $@ + $(NROFF) -man $< >$@ + +.man.z: + echo Formatting $<... + rm -f $@ t.z + $(NROFF) -man $< >t + pack -f t + mv t.z $@ + +# +# End of "$Id: makeinclude.in 6612 2008-12-29 20:21:29Z matt $". +# diff --git a/third_party/windows/fltk-1.1.10/png/ANNOUNCE b/third_party/windows/fltk-1.1.10/png/ANNOUNCE new file mode 100644 index 0000000..0c7f37d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/ANNOUNCE @@ -0,0 +1,57 @@ + +Libpng 1.2.40 - September 10, 2009 + +This is a public release of libpng, intended for use in production codes. + +Files available for download: + +Source files with LF line endings (for Unix/Linux) and with a +"configure" script + + libpng-1.2.40.tar.xz (LZMA-compressed, recommended) + libpng-1.2.40.tar.gz + libpng-1.2.40.tar.bz2 + +Source files with LF line endings (for Unix/Linux) without the +"configure" script + + libpng-1.2.40-no-config.tar.xz (LZMA-compressed, recommended) + libpng-1.2.40-no-config.tar.gz + libpng-1.2.40-no-config.tar.bz2 + +Source files with CRLF line endings (for Windows), without the +"configure" script + + lpng1240.zip + lpng1240.7z + lpng1240.tar.bz2 + +Project files + + libpng-1.2.40-project-netware.zip + libpng-1.2.40-project-wince.zip + +Other information: + + libpng-1.2.40-README.txt + libpng-1.2.40-KNOWNBUGS.txt + libpng-1.2.40-LICENSE.txt + libpng-1.2.40-Y2K-compliance.txt + libpng-1.2.40-[previous version]-diff.txt + +Changes since the last public release (1.2.39): + +version 1.2.40 [September 10, 2009] + + Removed an extra png_debug() recently added to png_write_find_filter(). + Fixed incorrect #ifdef in pngset.c regarding unknown chunk support. + Various bugfixes and improvements to CMakeLists.txt (Philip Lowman) + +Send comments/corrections/commendations to png-mng-implement at lists.sf.net + +Send comments/corrections/commendations to png-mng-implement at lists.sf.net +(subscription required; visit +https://lists.sourceforge.net/lists/listinfo/png-mng-implement +to subscribe) or to glennrp at users.sourceforge.net + +Glenn R-P diff --git a/third_party/windows/fltk-1.1.10/png/CHANGES b/third_party/windows/fltk-1.1.10/png/CHANGES new file mode 100644 index 0000000..b7ad6ea --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/CHANGES @@ -0,0 +1,2479 @@ +/* +CHANGES - changes for libpng + +version 0.2 + added reader into png.h + fixed small problems in stub file + +version 0.3 + added pull reader + split up pngwrite.c to several files + added pnglib.txt + added example.c + cleaned up writer, adding a few new transformations + fixed some bugs in writer + interfaced with zlib 0.5 + added K&R support + added check for 64 KB blocks for 16 bit machines + +version 0.4 + cleaned up code and commented code + simplified time handling into png_time + created png_color_16 and png_color_8 to handle color needs + cleaned up color type defines + fixed various bugs + made various names more consistent + interfaced with zlib 0.71 + cleaned up zTXt reader and writer (using zlib's Reset functions) + split transformations into pngrtran.c and pngwtran.c + +version 0.5 + interfaced with zlib 0.8 + fixed many reading and writing bugs + saved using 3 spaces instead of tabs + +version 0.6 + added png_large_malloc() and png_large_free() + added png_size_t + cleaned up some compiler warnings + added png_start_read_image() + +version 0.7 + cleaned up lots of bugs + finished dithering and other stuff + added test program + changed name from pnglib to libpng + +version 0.71 [June, 1995] + changed pngtest.png for zlib 0.93 + fixed error in libpng.txt and example.c + +version 0.8 + cleaned up some bugs + added png_set_filler() + split up pngstub.c into pngmem.c, pngio.c, and pngerror.c + added #define's to remove unwanted code + moved png_info_init() to png.c + added old_size into png_realloc() + added functions to manually set filtering and compression info + changed compression parameters based on image type + optimized filter selection code + added version info + changed external functions passing floats to doubles (k&r problems?) + put all the configurable stuff in pngconf.h + enabled png_set_shift to work with paletted images on read + added png_read_update_info() - updates info structure with + transformations + +version 0.81 [August, 1995] + incorporated Tim Wegner's medium model code (thanks, Tim) + +version 0.82 [September, 1995] + [unspecified changes] + +version 0.85 [December, 1995] + added more medium model code (almost everything's a far) + added i/o, error, and memory callback functions + fixed some bugs (16 bit, 4 bit interlaced, etc.) + added first run progressive reader (barely tested) + +version 0.86 [January, 1996] + fixed bugs + improved documentation + +version 0.87 [January, 1996] + fixed medium model bugs + fixed other bugs introduced in 0.85 and 0.86 + added some minor documentation + +version 0.88 [January, 1996] + fixed progressive bugs + replaced tabs with spaces + cleaned up documentation + added callbacks for read/write and warning/error functions + +version 0.89 [July, 1996] + added new initialization API to make libpng work better with shared libs + we now have png_create_read_struct(), png_create_write_struct(), + png_create_info_struct(), png_destroy_read_struct(), and + png_destroy_write_struct() instead of the separate calls to + malloc and png_read_init(), png_info_init(), and png_write_init() + changed warning/error callback functions to fix bug - this means you + should use the new initialization API if you were using the old + png_set_message_fn() calls, and that the old API no longer exists + so that people are aware that they need to change their code + changed filter selection API to allow selection of multiple filters + since it didn't work in previous versions of libpng anyways + optimized filter selection code + fixed png_set_background() to allow using an arbitrary RGB color for + paletted images + fixed gamma and background correction for paletted images, so + png_correct_palette is not needed unless you are correcting an + external palette (you will need to #define PNG_CORRECT_PALETTE_SUPPORTED + in pngconf.h) - if nobody uses this, it may disappear in the future. + fixed bug with Borland 64K memory allocation (Alexander Lehmann) + fixed bug in interlace handling (Smarasderagd, I think) + added more error checking for writing and image to reduce invalid files + separated read and write functions so that they won't both be linked + into a binary when only reading or writing functionality is used + new pngtest image also has interlacing and zTXt + updated documentation to reflect new API + +version 0.90 [January, 1997] + made CRC errors/warnings on critical and ancillary chunks configurable + libpng will use the zlib CRC routines by (compile-time) default + changed DOS small/medium model memory support - needs zlib 1.04 (Tim Wegner) + added external C++ wrapper statements to png.h (Gilles Dauphin) + allow PNG file to be read when some or all of file signature has already + been read from the beginning of the stream. ****This affects the size + of info_struct and invalidates all programs that use a shared libpng**** + fixed png_filler() declarations + fixed? background color conversions + fixed order of error function pointers to match documentation + current chunk name is now available in png_struct to reduce the number + of nearly identical error messages (will simplify multi-lingual + support when available) + try to get ready for unknown-chunk callback functions: + - previously read critical chunks are flagged, so the chunk handling + routines can determine if the chunk is in the right place + - all chunk handling routines have the same prototypes, so we will + be able to handle all chunks via a callback mechanism + try to fix Linux "setjmp" buffer size problems + removed png_large_malloc, png_large_free, and png_realloc functions. + +version 0.95 [March, 1997] + fixed bug in pngwutil.c allocating "up_row" twice and "avg_row" never + fixed bug in PNG file signature compares when start != 0 + changed parameter type of png_set_filler(...filler...) from png_byte + to png_uint_32 + added test for MACOS to ensure that both math.h and fp.h are not #included + added macros for libpng to be compiled as a Windows DLL (Andreas Kupries) + added "packswap" transformation, which changes the endianness of + packed-pixel bytes (Kevin Bracey) + added "strip_alpha" transformation, which removes the alpha channel of + input images without using it (not necessarily a good idea) + added "swap_alpha" transformation, which puts the alpha channel in front + of the color bytes instead of after + removed all implicit variable tests which assume NULL == 0 (I think) + changed several variables to "png_size_t" to show 16/32-bit limitations + added new pCAL chunk read/write support + added experimental filter selection weighting (Greg Roelofs) + removed old png_set_rgbx() and png_set_xrgb() functions that have been + obsolete for about 2 years now (use png_set_filler() instead) + added macros to read 16- and 32-bit ints directly from buffer, to be + used only on those systems that support it (namely PowerPC and 680x0) + With some testing, this may become the default for MACOS/PPC systems. + only calculate CRC on data if we are going to use it + added macros for zTXt compression type PNG_zTXt_COMPRESSION_??? + added macros for simple libpng debugging output selectable at compile time + removed PNG_READ_END_MODE in progressive reader (Smarasderagd) + more description of info_struct in libpng.txt and png.h + more instructions in example.c + more chunk types tested in pngtest.c + renamed pngrcb.c to pngset.c, and all png_read_ functions to be + png_set_. We now have corresponding png_get_ + functions in pngget.c to get information in info_ptr. This isolates + the application from the internal organization of png_info_struct + (good for shared library implementations). + +version 0.96 [May, 1997] + fixed serious bug with < 8bpp images introduced in 0.95 + fixed 256-color transparency bug (Greg Roelofs) + fixed up documentation (Greg Roelofs, Laszlo Nyul) + fixed "error" in pngconf.h for Linux setjmp() behaviour + fixed DOS medium model support (Tim Wegner) + fixed png_check_keyword() for case with error in static string text + added read of CRC after IEND chunk for embedded PNGs (Laszlo Nyul) + added typecasts to quiet compiler errors + added more debugging info + +version 0.97 [January, 1998] + removed PNG_USE_OWN_CRC capability + relocated png_set_crc_action from pngrutil.c to pngrtran.c + fixed typecasts of "new_key", etc. (Andreas Dilger) + added RFC 1152 [sic] date support + fixed bug in gamma handling of 4-bit grayscale + added 2-bit grayscale gamma handling (Glenn R-P) + added more typecasts. 65536L becomes (png_uint_32)65536L, etc. (Glenn R-P) + minor corrections in libpng.txt + added simple sRGB support (Glenn R-P) + easier conditional compiling, e.g. define PNG_READ/WRITE_NOT_FULLY_SUPPORTED; + all configurable options can be selected from command-line instead + of having to edit pngconf.h (Glenn R-P) + fixed memory leak in pngwrite.c (free info_ptr->text) (Glenn R-P) + added more conditions for png_do_background, to avoid changing + black pixels to background when a background is supplied and + no pixels are transparent + repaired PNG_NO_STDIO behaviour + tested NODIV support and made it default behaviour (Greg Roelofs) + added "-m" option and PNGTEST_DEBUG_MEMORY to pngtest (John Bowler) + regularized version numbering scheme and bumped shared-library major + version number to 2 to avoid problems with libpng 0.89 apps (Greg Roelofs) + +version 0.98 [January, 1998] + cleaned up some typos in libpng.txt and in code documentation + fixed memory leaks in pCAL chunk processing (Glenn R-P and John Bowler) + cosmetic change "display_gamma" to "screen_gamma" in pngrtran.c + changed recommendation about file_gamma for PC images to .51 from .45, + in example.c and libpng.txt, added comments to distinguish between + screen_gamma, viewing_gamma, and display_gamma. + changed all references to RFC1152 to read RFC1123 and changed the + PNG_TIME_RFC1152_SUPPORTED macro to PNG_TIME_RFC1123_SUPPORTED + added png_invert_alpha capability (Glenn R-P -- suggestion by Jon Vincent) + changed srgb_intent from png_byte to int to avoid compiler bugs + +version 0.99 [January 30, 1998] + free info_ptr->text instead of end_info_ptr->text in pngread.c (John Bowler) + fixed a longstanding "packswap" bug in pngtrans.c + fixed some inconsistencies in pngconf.h that prevented compiling with + PNG_READ_GAMMA_SUPPORTED and PNG_READ_hIST_SUPPORTED undefined + fixed some typos and made other minor rearrangement of libpng.txt (Andreas) + changed recommendation about file_gamma for PC images to .50 from .51 in + example.c and libpng.txt, and changed file_gamma for sRGB images to .45 + added a number of functions to access information from the png structure + png_get_image_height(), etc. (Glenn R-P, suggestion by Brad Pettit) + added TARGET_MACOS similar to zlib-1.0.8 + define PNG_ALWAYS_EXTERN when __MWERKS__ && WIN32 are defined + added type casting to all png_malloc() function calls +version 0.99a [January 31, 1998] + Added type casts and parentheses to all returns that return a value.(Tim W.) +version 0.99b [February 4, 1998] + Added type cast png_uint_32 on malloc function calls where needed. + Changed type of num_hist from png_uint_32 to int (same as num_palette). + Added checks for rowbytes overflow, in case png_size_t is less than 32 bits. + Renamed makefile.elf to makefile.lnx. +version 0.99c [February 7, 1998] + More type casting. Removed erroneous overflow test in pngmem.c. + Added png_buffered_memcpy() and png_buffered_memset(), apply them to rowbytes. + Added UNIX manual pages libpng.3 (incorporating libpng.txt) and png.5. +version 0.99d [February 11, 1998] + Renamed "far_to_near()" "png_far_to_near()" + Revised libpng.3 + Version 99c "buffered" operations didn't work as intended. Replaced them + with png_memcpy_check() and png_memset_check(). + Added many "if (png_ptr == NULL) return" to quell compiler warnings about + unused png_ptr, mostly in pngget.c and pngset.c. + Check for overlength tRNS chunk present when indexed-color PLTE is read. + Cleaned up spelling errors in libpng.3/libpng.txt + Corrected a problem with png_get_tRNS() which returned undefined trans array +version 0.99e [February 28, 1998] + Corrected png_get_tRNS() again. + Add parentheses for easier reading of pngget.c, fixed "||" should be "&&". + Touched up example.c to make more of it compileable, although the entire + file still can't be compiled (Willem van Schaik) + Fixed a bug in png_do_shift() (Bryan Tsai) + Added a space in png.h prototype for png_write_chunk_start() + Replaced pngtest.png with one created with zlib 1.1.1 + Changed pngtest to report PASS even when file size is different (Jean-loup G.) + Corrected some logic errors in png_do_invert_alpha() (Chris Patterson) +version 0.99f [March 5, 1998] + Corrected a bug in pngpread() introduced in version 99c (Kevin Bracey) + Moved makefiles into a "scripts" directory, and added INSTALL instruction file + Added makefile.os2 and pngos2.def (A. Zabolotny) and makefile.s2x (W. Sebok) + Added pointers to "note on libpng versions" in makefile.lnx and README + Added row callback feature when reading and writing nonprogressive rows + and added a test of this feature in pngtest.c + Added user transform callbacks, with test of the feature in pngtest.c +version 0.99g [March 6, 1998, morning] + Minor changes to pngtest.c to suppress compiler warnings. + Removed "beta" language from documentation. +version 0.99h [March 6, 1998, evening] + Minor changes to previous minor changes to pngtest.c + Changed PNG_READ_NOT_FULLY_SUPPORTED to PNG_READ_TRANSFORMS_NOT_SUPPORTED + and added PNG_PROGRESSIVE_READ_NOT_SUPPORTED macro + Added user transform capability + +version 1.00 [March 7, 1998] + Changed several typedefs in pngrutil.c + Added makefile.wat (Pawel Mrochen), updated makefile.tc3 (Willem van Schaik) + replaced "while(1)" with "for(;;)" + added PNGARG() to prototypes in pngtest.c and removed some prototypes + updated some of the makefiles (Tom Lane) + changed some typedefs (s_start, etc.) in pngrutil.c + fixed dimensions of "short_months" array in pngwrite.c + Replaced ansi2knr.c with the one from jpeg-v6 + +version 1.0.0 [March 8, 1998] + Changed name from 1.00 to 1.0.0 (Adam Costello) + Added smakefile.ppc (with SCOPTIONS.ppc) for Amiga PPC (Andreas Kleinert) +version 1.0.0a [March 9, 1998] + Fixed three bugs in pngrtran.c to make gamma+background handling consistent + (Greg Roelofs) + Changed format of the PNG_LIBPNG_VER integer to xyyzz instead of xyz + for major, minor, and bugfix releases. This is 10001. (Adam Costello, + Tom Lane) + Make months range from 1-12 in png_convert_to_rfc1123 +version 1.0.0b [March 13, 1998] + Quieted compiler complaints about two empty "for" loops in pngrutil.c + Minor changes to makefile.s2x + Removed #ifdef/#endif around a png_free() in pngread.c + +version 1.0.1 [March 14, 1998] + Changed makefile.s2x to reduce security risk of using a relative pathname + Fixed some typos in the documentation (Greg). + Fixed a problem with value of "channels" returned by png_read_update_info() +version 1.0.1a [April 21, 1998] + Optimized Paeth calculations by replacing abs() function calls with intrinsics + plus other loop optimizations. Improves avg decoding speed by about 20%. + Commented out i386istic "align" compiler flags in makefile.lnx. + Reduced the default warning level in some makefiles, to make them consistent. + Removed references to IJG and JPEG in the ansi2knr.c copyright statement. + Fixed a bug in png_do_strip_filler with XXRRGGBB => RRGGBB transformation. + Added grayscale and 16-bit capability to png_do_read_filler(). + Fixed a bug in pngset.c, introduced in version 0.99c, that sets rowbytes + too large when writing an image with bit_depth < 8 (Bob Dellaca). + Corrected some bugs in the experimental weighted filtering heuristics. + Moved a misplaced pngrutil code block that truncates tRNS if it has more + than num_palette entries -- test was done before num_palette was defined. + Fixed a png_convert_to_rfc1123() bug that converts day 31 to 0 (Steve Eddins). + Changed compiler flags in makefile.wat for better optimization (Pawel Mrochen). +version 1.0.1b [May 2, 1998] + Relocated png_do_gray_to_rgb() within png_do_read_transformations() (Greg). + Relocated the png_composite macros from pngrtran.c to png.h (Greg). + Added makefile.sco (contributed by Mike Hopkirk). + Fixed two bugs (missing definitions of "istop") introduced in libpng-1.0.1a. + Fixed a bug in pngrtran.c that would set channels=5 under some circumstances. + More work on the Paeth-filtering, achieving imperceptible speedup (A Kleinert). + More work on loop optimization which may help when compiled with C++ compilers. + Added warnings when people try to use transforms they've defined out. + Collapsed 4 "i" and "c" loops into single "i" loops in pngrtran and pngwtran. + Revised paragraph about png_set_expand() in libpng.txt and libpng.3 (Greg) +version 1.0.1c [May 11, 1998] + Fixed a bug in pngrtran.c (introduced in libpng-1.0.1a) where the masks for + filler bytes should have been 0xff instead of 0xf. + Added max_pixel_depth=32 in pngrutil.c when using FILLER with palette images. + Moved PNG_WRITE_WEIGHTED_FILTER_SUPPORTED and PNG_WRITE_FLUSH_SUPPORTED + out of the PNG_WRITE_TRANSFORMS_NOT_SUPPORTED block of pngconf.h + Added "PNG_NO_WRITE_TRANSFORMS" etc., as alternatives for *_NOT_SUPPORTED, + for consistency, in pngconf.h + Added individual "ifndef PNG_NO_[CAPABILITY]" in pngconf.h to make it easier + to remove unwanted capabilities via the compile line + Made some corrections to grammar (which, it's) in documentation (Greg). + Corrected example.c, use of row_pointers in png_write_image(). +version 1.0.1d [May 24, 1998] + Corrected several statements that used side effects illegally in pngrutil.c + and pngtrans.c, that were introduced in version 1.0.1b + Revised png_read_rows() to avoid repeated if-testing for NULL (A Kleinert) + More corrections to example.c, use of row_pointers in png_write_image() + and png_read_rows(). + Added pngdll.mak and pngdef.pas to scripts directory, contributed by + Bob Dellaca, to make a png32bd.dll with Borland C++ 4.5 + Fixed error in example.c with png_set_text: num_text is 3, not 2 (Guido V.) + Changed several loops from count-down to count-up, for consistency. +version 1.0.1e [June 6, 1998] + Revised libpng.txt and libpng.3 description of png_set_read|write_fn(), and + added warnings when people try to set png_read_fn and png_write_fn in + the same structure. + Added a test such that png_do_gamma will be done when num_trans==0 + for truecolor images that have defined a background. This corrects an + error that was introduced in libpng-0.90 that can cause gamma processing + to be skipped. + Added tests in png.h to include "trans" and "trans_values" in structures + when PNG_READ_BACKGROUND_SUPPORTED or PNG_READ_EXPAND_SUPPORTED is defined. + Add png_free(png_ptr->time_buffer) in png_destroy_read_struct() + Moved png_convert_to_rfc_1123() from pngwrite.c to png.c + Added capability for user-provided malloc_fn() and free_fn() functions, + and revised pngtest.c to demonstrate their use, replacing the + PNGTEST_DEBUG_MEM feature. + Added makefile.w32, for Microsoft C++ 4.0 and later (Tim Wegner). + +version 1.0.2 [June 14, 1998] + Fixed two bugs in makefile.bor . +version 1.0.2a [December 30, 1998] + Replaced and extended code that was removed from png_set_filler() in 1.0.1a. + Fixed a bug in png_do_filler() that made it fail to write filler bytes in + the left-most pixel of each row (Kevin Bracey). + Changed "static pngcharp tIME_string" to "static char tIME_string[30]" + in pngtest.c (Duncan Simpson). + Fixed a bug in pngtest.c that caused pngtest to try to write a tIME chunk + even when no tIME chunk was present in the source file. + Fixed a problem in pngrutil.c: gray_to_rgb didn't always work with 16-bit. + Fixed a problem in png_read_push_finish_row(), which would not skip some + passes that it should skip, for images that are less than 3 pixels high. + Interchanged the order of calls to png_do_swap() and png_do_shift() + in pngwtran.c (John Cromer). + Added #ifdef PNG_DEBUG/#endif surrounding use of PNG_DEBUG in png.h . + Changed "bad adaptive filter type" from error to warning in pngrutil.c . + Fixed a documentation error about default filtering with 8-bit indexed-color. + Separated the PNG_NO_STDIO macro into PNG_NO_STDIO and PNG_NO_CONSOLE_IO + (L. Peter Deutsch). + Added png_set_rgb_to_gray() and png_get_rgb_to_gray_status() functions. + Added png_get_copyright() and png_get_header_version() functions. + Revised comments on png_set_progressive_read_fn() in libpng.txt and example.c + Added information about debugging in libpng.txt and libpng.3 . + Changed "ln -sf" to "ln -s -f" in makefile.s2x, makefile.lnx, and makefile.sco. + Removed lines after Dynamic Dependencies" in makefile.aco . + Revised makefile.dec to make a shared library (Jeremie Petit). + Removed trailing blanks from all files. +version 1.0.2a [January 6, 1999] + Removed misplaced #endif and #ifdef PNG_NO_EXTERN near the end of png.h + Added "if" tests to silence complaints about unused png_ptr in png.h and png.c + Changed "check_if_png" function in example.c to return true (nonzero) if PNG. + Changed libpng.txt to demonstrate png_sig_cmp() instead of png_check_sig() + which is obsolete. + +version 1.0.3 [January 14, 1999] + Added makefile.hux, for Hewlett Packard HPUX 10.20 and 11.00 (Jim Rice) + Added a statement of Y2K compliance in png.h, libpng.3, and Y2KINFO. +version 1.0.3a [August 12, 1999] + Added check for PNG_READ_INTERLACE_SUPPORTED in pngread.c; issue a warning + if an attempt is made to read an interlaced image when it's not supported. + Added check if png_ptr->trans is defined before freeing it in pngread.c + Modified the Y2K statement to include versions back to version 0.71 + Fixed a bug in the check for valid IHDR bit_depth/color_types in pngrutil.c + Modified makefile.wat (added -zp8 flag, ".symbolic", changed some comments) + Replaced leading blanks with tab characters in makefile.hux + Changed "dworkin.wustl.edu" to "ccrc.wustl.edu" in various documents. + Changed (float)red and (float)green to (double)red, (double)green + in png_set_rgb_to_gray() to avoid "promotion" problems in AIX. + Fixed a bug in pngconf.h that omitted when PNG_DEBUG==0 (K Bracey). + Reformatted libpng.3 and libpngpf.3 with proper fonts (script by J. vanZandt). + Updated documentation to refer to the PNG-1.2 specification. + Removed ansi2knr.c and left pointers to the latest source for ansi2knr.c + in makefile.knr, INSTALL, and README (L. Peter Deutsch) + Fixed bugs in calculation of the length of rowbytes when adding alpha + channels to 16-bit images, in pngrtran.c (Chris Nokleberg) + Added function png_set_user_transform_info() to store user_transform_ptr, + user_depth, and user_channels into the png_struct, and a function + png_get_user_transform_ptr() to retrieve the pointer (Chris Nokleberg) + Added function png_set_empty_plte_permitted() to make libpng useable + in MNG applications. + Corrected the typedef for png_free_ptr in png.h (Jesse Jones). + Correct gamma with srgb is 45455 instead of 45000 in pngrutil.c, to be + consistent with PNG-1.2, and allow variance of 500 before complaining. + Added assembler code contributed by Intel in file pngvcrd.c and modified + makefile.w32 to use it (Nirav Chhatrapati, INTEL Corporation, Gilles Vollant) + Changed "ln -s -f" to "ln -f -s" in the makefiles to make Solaris happy. + Added some aliases for png_set_expand() in pngrtran.c, namely + png_set_expand_PLTE(), png_set_expand_depth(), and png_set_expand_tRNS() + (Greg Roelofs, in "PNG: The Definitive Guide"). + Added makefile.beo for BEOS on X86, contributed by Sander Stok. +version 1.0.3b [August 26, 1999] + Replaced 2147483647L several places with PNG_MAX_UINT macro, defined in png.h + Changed leading blanks to tabs in all makefiles. + Define PNG_USE_PNGVCRD in makefile.w32, to get MMX assembler code. + Made alternate versions of png_set_expand() in pngrtran.c, namely + png_set_gray_1_2_4_to_8, png_set_palette_to_rgb, and png_set_tRNS_to_alpha + (Greg Roelofs, in "PNG: The Definitive Guide"). Deleted the 1.0.3a aliases. + Relocated start of 'extern "C"' block in png.h so it doesn't include pngconf.h + Revised calculation of num_blocks in pngmem.c to avoid a potentially + negative shift distance, whose results are undefined in the C language. + Added a check in pngset.c to prevent writing multiple tIME chunks. + Added a check in pngwrite.c to detect invalid small window_bits sizes. +version 1.0.3d [September 4, 1999] + Fixed type casting of igamma in pngrutil.c + Added new png_expand functions to scripts/pngdef.pas and pngos2.def + Added a demo read_user_transform_fn that examines the row filters in pngtest.c + +version 1.0.4 [September 24, 1999] + Define PNG_ALWAYS_EXTERN in pngconf.h if __STDC__ is defined + Delete #define PNG_INTERNAL and include "png.h" from pngasmrd.h + Made several minor corrections to pngtest.c + Renamed the makefiles with longer but more user friendly extensions. + Copied the PNG copyright and license to a separate LICENSE file. + Revised documentation, png.h, and example.c to remove reference to + "viewing_gamma" which no longer appears in the PNG specification. + Revised pngvcrd.c to use MMX code for interlacing only on the final pass. + Updated pngvcrd.c to use the faster C filter algorithms from libpng-1.0.1a + Split makefile.win32vc into two versions, makefile.vcawin32 (uses MMX + assembler code) and makefile.vcwin32 (doesn't). + Added a CPU timing report to pngtest.c (enabled by defining PNGTEST_TIMING) + Added a copy of pngnow.png to the distribution. +version 1.0.4a [September 25, 1999] + Increase max_pixel_depth in pngrutil.c if a user transform needs it. + Changed several division operations to right-shifts in pngvcrd.c +version 1.0.4b [September 30, 1999] + Added parentheses in line 3732 of pngvcrd.c + Added a comment in makefile.linux warning about buggy -O3 in pgcc 2.95.1 +version 1.0.4c [October 1, 1999] + Added a "png_check_version" function in png.c and pngtest.c that will generate + a helpful compiler error if an old png.h is found in the search path. + Changed type of png_user_transform_depth|channels from int to png_byte. +version 1.0.4d [October 6, 1999] + Changed 0.45 to 0.45455 in png_set_sRGB() + Removed unused PLTE entries from pngnow.png + Re-enabled some parts of pngvcrd.c (png_combine_row) that work properly. +version 1.0.4e [October 10, 1999] + Fixed sign error in pngvcrd.c (Greg Roelofs) + Replaced some instances of memcpy with simple assignments in pngvcrd (GR-P) +version 1.0.4f [October 15, 1999] + Surrounded example.c code with #if 0 .. #endif to prevent people from + inadvertently trying to compile it. + Changed png_get_header_version() from a function to a macro in png.h + Added type casting mostly in pngrtran.c and pngwtran.c + Removed some pointless "ptr = NULL" in pngmem.c + Added a "contrib" directory containing the source code from Greg's book. + +version 1.0.5 [October 15, 1999] + Minor editing of the INSTALL and README files. +version 1.0.5a [October 23, 1999] + Added contrib/pngsuite and contrib/pngminus (Willem van Schaik) + Fixed a typo in the png_set_sRGB() function call in example.c (Jan Nijtmans) + Further optimization and bugfix of pngvcrd.c + Revised pngset.c so that it does not allocate or free memory in the user's + text_ptr structure. Instead, it makes its own copy. + Created separate write_end_info_struct in pngtest.c for a more severe test. + Added code in pngwrite.c to free info_ptr->text[i].key to stop a memory leak. +version 1.0.5b [November 23, 1999] + Moved PNG_FLAG_HAVE_CHUNK_HEADER, PNG_FLAG_BACKGROUND_IS_GRAY and + PNG_FLAG_WROTE_tIME from flags to mode. + Added png_write_info_before_PLTE() function. + Fixed some typecasting in contrib/gregbook/*.c + Updated scripts/makevms.com and added makevms.com to contrib/gregbook + and contrib/pngminus (Martin Zinser) +version 1.0.5c [November 26, 1999] + Moved png_get_header_version from png.h to png.c, to accommodate ansi2knr. + Removed all global arrays (according to PNG_NO_GLOBAL_ARRAYS macro), to + accommodate making DLL's: Moved usr_png_ver from global variable to function + png_get_header_ver() in png.c. Moved png_sig to png_sig_bytes in png.c and + eliminated use of png_sig in pngwutil.c. Moved the various png_CHNK arrays + into pngtypes.h. Eliminated use of global png_pass arrays. Declared the + png_CHNK and png_pass arrays to be "const". Made the global arrays + available to applications (although none are used in libpng itself) when + PNG_NO_GLOBAL_ARRAYS is not defined or when PNG_GLOBAL_ARRAYS is defined. + Removed some extraneous "-I" from contrib/pngminus/makefile.std + Changed the PNG_sRGB_INTENT macros in png.h to be consistent with PNG-1.2. + Change PNG_SRGB_INTENT to PNG_sRGB_INTENT in libpng.txt and libpng.3 +version 1.0.5d [November 29, 1999] + Add type cast (png_const_charp) two places in png.c + Eliminated pngtypes.h; use macros instead to declare PNG_CHNK arrays. + Renamed "PNG_GLOBAL_ARRAYS" to "PNG_USE_GLOBAL_ARRAYS" and made available + to applications a macro "PNG_USE_LOCAL_ARRAYS". + Remove all the new declarations with #ifdef/#endif when + PNG_USE_GLOBAL_ARRAYS is defined. + Added PNG_EXPORT_VAR macro to accommodate making DLL's. +version 1.0.5e [November 30, 1999] + Added iCCP, iTXt, and sPLT support; added "lang" member to the png_text + structure; refactored the inflate/deflate support to make adding new chunks + with trailing compressed parts easier in the future, and added new functions + png_free_iCCP, png_free_pCAL, png_free_sPLT, png_free_text, png_get_iCCP, + png_get_spalettes, png_set_iCCP, png_set_spalettes (Eric S. Raymond). + NOTE: Applications that write text chunks MUST define png_text->lang + before calling png_set_text(). It must be set to NULL if you want to + write tEXt or zTXt chunks. If you want your application to be able to + run with older versions of libpng, use + + #ifdef PNG_iTXt_SUPPORTED + png_text[i].lang = NULL; + #endif + + Changed png_get_oFFs() and png_set_oFFs() to use signed rather than unsigned + offsets (Eric S. Raymond). + Combined PNG_READ_cHNK_SUPPORTED and PNG_WRITE_cHNK_SUPPORTED macros into + PNG_cHNK_SUPPORTED and combined the three types of PNG_text_SUPPORTED + macros, leaving the separate macros also available. + Removed comments on #endifs at the end of many short, non-nested #if-blocks. +version 1.0.5f [December 6, 1999] + Changed makefile.solaris to issue a warning about potential problems when + the ucb "ld" is in the path ahead of the ccs "ld". + Removed "- [date]" from the "synopsis" line in libpng.3 and libpngpf.3. + Added sCAL chunk support (Eric S. Raymond). +version 1.0.5g [December 7, 1999] + Fixed "png_free_spallettes" typo in png.h + Added code to handle new chunks in pngpread.c + Moved PNG_CHNK string macro definitions outside of PNG_NO_EXTERN block + Added "translated_key" to png_text structure and png_write_iTXt(). + Added code in pngwrite.c to work around a newly discovered zlib bug. +version 1.0.5h [December 10, 1999] + NOTE: regarding the note for version 1.0.5e, the following must also + be included in your code: + png_text[i].translated_key = NULL; + Unknown chunk handling is now supported. + Option to eliminate all floating point support was added. Some new + fixed-point functions such as png_set_gAMA_fixed() were added. + Expanded tabs and removed trailing blanks in source files. +version 1.0.5i [December 13, 1999] + Added some type casts to silence compiler warnings. + Renamed "png_free_spalette" to "png_free_spalettes" for consistency. + Removed leading blanks from a #define in pngvcrd.c + Added some parameters to the new png_set_keep_unknown_chunks() function. + Added a test for up->location != 0 in the first instance of writing + unknown chunks in pngwrite.c + Changed "num" to "i" in png_free_spalettes() and png_free_unknowns() to + prevent recursion. + Added png_free_hIST() function. + Various patches to fix bugs in the sCAL and integer cHRM processing, + and to add some convenience macros for use with sCAL. +version 1.0.5j [December 21, 1999] + Changed "unit" parameter of png_write_sCAL from png_byte to int, to work + around buggy compilers. + Added new type "png_fixed_point" for integers that hold float*100000 values + Restored backward compatibility of tEXt/zTXt chunk processing: + Restored the first four members of png_text to the same order as v.1.0.5d. + Added members "lang_key" and "itxt_length" to png_text struct. Set + text_length=0 when "text" contains iTXt data. Use the "compression" + member to distinguish among tEXt/zTXt/iTXt types. Added + PNG_ITXT_COMPRESSION_NONE (1) and PNG_ITXT_COMPRESSION_zTXt(2) macros. + The "Note" above, about backward incompatibility of libpng-1.0.5e, no + longer applies. + Fixed png_read|write_iTXt() to read|write parameters in the right order, + and to write the iTXt chunk after IDAT if it appears in the end_ptr. + Added pnggccrd.c, version of pngvcrd.c Intel assembler for gcc (Greg Roelofs) + Reversed the order of trying to write floating-point and fixed-point gAMA. +version 1.0.5k [December 27, 1999] + Added many parentheses, e.g., "if (a && b & c)" becomes "if (a && (b & c))" + Added png_handle_as_unknown() function (Glenn) + Added png_free_chunk_list() function and chunk_list and num_chunk_list members + of png_ptr. + Eliminated erroneous warnings about multiple sPLT chunks and sPLT-after-PLTE. + Fixed a libpng-1.0.5h bug in pngrutil.c that was issuing erroneous warnings + about ignoring incorrect gAMA with sRGB (gAMA was in fact not ignored) + Added png_free_tRNS(); png_set_tRNS() now malloc's its own trans array (ESR). + Define png_get_int_32 when oFFs chunk is supported as well as when pCAL is. + Changed type of proflen from png_int_32 to png_uint_32 in png_get_iCCP(). +version 1.0.5l [January 1, 2000] + Added functions png_set_read_user_chunk_fn() and png_get_user_chunk_ptr() + for setting a callback function to handle unknown chunks and for + retrieving the associated user pointer (Glenn). +version 1.0.5m [January 7, 2000] + Added high-level functions png_read_png(), png_write_png(), png_free_pixels(). +version 1.0.5n [January 9, 2000] + Added png_free_PLTE() function, and modified png_set_PLTE() to malloc its + own memory for info_ptr->palette. This makes it safe for the calling + application to free its copy of the palette any time after it calls + png_set_PLTE(). +version 1.0.5o [January 20, 2000] + Cosmetic changes only (removed some trailing blanks and TABs) +version 1.0.5p [January 31, 2000] + Renamed pngdll.mak to makefile.bd32 + Cosmetic changes in pngtest.c +version 1.0.5q [February 5, 2000] + Relocated the makefile.solaris warning about PATH problems. + Fixed pngvcrd.c bug by pushing/popping registers in mmxsupport (Bruce Oberg) + Revised makefile.gcmmx + Added PNG_SETJMP_SUPPORTED, PNG_SETJMP_NOT_SUPPORTED, and PNG_ABORT() macros +version 1.0.5r [February 7, 2000] + Removed superfluous prototype for png_get_itxt from png.h + Fixed a bug in pngrtran.c that improperly expanded the background color. + Return *num_text=0 from png_get_text() when appropriate, and fix documentation + of png_get_text() in libpng.txt/libpng.3. +version 1.0.5s [February 18, 2000] + Added "png_jmp_env()" macro to pngconf.h, to help people migrate to the + new error handler that's planned for the next libpng release, and changed + example.c, pngtest.c, and contrib programs to use this macro. + Revised some of the DLL-export macros in pngconf.h (Greg Roelofs) + Fixed a bug in png_read_png() that caused it to fail to expand some images + that it should have expanded. + Fixed some mistakes in the unused and undocumented INCH_CONVERSIONS functions + in pngget.c + Changed the allocation of palette, history, and trans arrays back to + the version 1.0.5 method (linking instead of copying) which restores + backward compatibility with version 1.0.5. Added some remarks about + that in example.c. Added "free_me" member to info_ptr and png_ptr + and added png_free_data() function. + Updated makefile.linux and makefile.gccmmx to make directories conditionally. + Made cosmetic changes to pngasmrd.h + Added png_set_rows() and png_get_rows(), for use with png_read|write_png(). + Modified png_read_png() to allocate info_ptr->row_pointers only if it + hasn't already been allocated. +version 1.0.5t [March 4, 2000] + Changed png_jmp_env() migration aiding macro to png_jmpbuf(). + Fixed "interlace" typo (should be "interlaced") in contrib/gregbook/read2-x.c + Fixed bug with use of PNG_BEFORE_IHDR bit in png_ptr->mode, introduced when + PNG_FLAG_HAVE_CHUNK_HEADER was moved into png_ptr->mode in version 1.0.5b + Files in contrib/gregbook were revised to use png_jmpbuf() and to select + a 24-bit visual if one is available, and to allow abbreviated options. + Files in contrib/pngminus were revised to use the png_jmpbuf() macro. + Removed spaces in makefile.linux and makefile.gcmmx, introduced in 1.0.5s +version 1.0.5u [March 5, 2000] + Simplified the code that detects old png.h in png.c and pngtest.c + Renamed png_spalette (_p, _pp) to png_sPLT_t (_tp, _tpp) + Increased precision of rgb_to_gray calculations from 8 to 15 bits and + added png_set_rgb_to_gray_fixed() function. + Added makefile.bc32 (32-bit Borland C++, C mode) +version 1.0.5v [March 11, 2000] + Added some parentheses to the png_jmpbuf macro definition. + Updated references to the zlib home page, which has moved to freesoftware.com. + Corrected bugs in documentation regarding png_read_row() and png_write_row(). + Updated documentation of png_rgb_to_gray calculations in libpng.3/libpng.txt. + Renamed makefile.borland,turboc3 back to makefile.bor,tc3 as in version 1.0.3, + revised borland makefiles; added makefile.ibmvac3 and makefile.gcc (Cosmin) + +version 1.0.6 [March 20, 2000] + Minor revisions of makefile.bor, libpng.txt, and gregbook/rpng2-win.c + Added makefile.sggcc (SGI IRIX with gcc) +version 1.0.6d [April 7, 2000] + Changed sprintf() to strcpy() in png_write_sCAL_s() to work without STDIO + Added data_length parameter to png_decompress_chunk() function + Revised documentation to remove reference to abandoned png_free_chnk functions + Fixed an error in png_rgb_to_gray_fixed() + Revised example.c, usage of png_destroy_write_struct(). + Renamed makefile.ibmvac3 to makefile.ibmc, added libpng.icc IBM project file + Added a check for info_ptr->free_me&PNG_FREE_TEXT when freeing text in png.c + Simplify png_sig_bytes() function to remove use of non-ISO-C strdup(). +version 1.0.6e [April 9, 2000] + Added png_data_freer() function. + In the code that checks for over-length tRNS chunks, added check of + info_ptr->num_trans as well as png_ptr->num_trans (Matthias Benckmann) + Minor revisions of libpng.txt/libpng.3. + Check for existing data and free it if the free_me flag is set, in png_set_*() + and png_handle_*(). + Only define PNG_WEIGHTED_FILTERS_SUPPORTED when PNG_FLOATING_POINT_SUPPORTED + is defined. + Changed several instances of PNG_NO_CONSOLE_ID to PNG_NO_STDIO in pngrutil.c + and mentioned the purposes of the two macros in libpng.txt/libpng.3. +version 1.0.6f [April 14, 2000] + Revised png_set_iCCP() and png_set_rows() to avoid prematurely freeing data. + Add checks in png_set_text() for NULL members of the input text structure. + Revised libpng.txt/libpng.3. + Removed superfluous prototype for png_set_itxt from png.h + Removed "else" from pngread.c, after png_error(), and changed "0" to "length". + Changed several png_errors about malformed ancillary chunks to png_warnings. +version 1.0.6g [April 24, 2000] + Added png_pass-* arrays to pnggccrd.c when PNG_USE_LOCAL_ARRAYS is defined. + Relocated paragraph about png_set_background() in libpng.3/libpng.txt + and other revisions (Matthias Benckmann) + Relocated info_ptr->free_me, png_ptr->free_me, and other info_ptr and + png_ptr members to restore binary compatibility with libpng-1.0.5 + (breaks compatibility with libpng-1.0.6). +version 1.0.6h [April 24, 2000] + Changed shared library so-number pattern from 2.x.y.z to xy.z (this builds + libpng.so.10 & libpng.so.10.6h instead of libpng.so.2 & libpng.so.2.1.0.6h) + This is a temporary change for test purposes. +version 1.0.6i [May 2, 2000] + Rearranged some members at the end of png_info and png_struct, to put + unknown_chunks_num and free_me within the original size of the png_structs + and free_me, png_read_user_fn, and png_free_fn within the original png_info, + because some old applications allocate the structs directly instead of + using png_create_*(). + Added documentation of user memory functions in libpng.txt/libpng.3 + Modified png_read_png so that it will use user_allocated row_pointers + if present, unless free_me directs that it be freed, and added description + of the use of png_set_rows() and png_get_rows() in libpng.txt/libpng.3. + Added PNG_LEGACY_SUPPORTED macro, and #ifdef out all new (since version + 1.00) members of png_struct and png_info, to regain binary compatibility + when you define this macro. Capabilities lost in this event + are user transforms (new in version 1.0.0),the user transform pointer + (new in version 1.0.2), rgb_to_gray (new in 1.0.5), iCCP, sCAL, sPLT, + the high-level interface, and unknown chunks support (all new in 1.0.6). + This was necessary because of old applications that allocate the structs + directly as authors were instructed to do in libpng-0.88 and earlier, + instead of using png_create_*(). + Added modes PNG_CREATED_READ_STRUCT and PNG_CREATED_WRITE_STRUCT which + can be used to detect codes that directly allocate the structs, and + code to check these modes in png_read_init() and png_write_init() and + generate a libpng error if the modes aren't set and PNG_LEGACY_SUPPORTED + was not defined. + Added makefile.intel and updated makefile.watcom (Pawel Mrochen) +version 1.0.6j [May 3, 2000] + Overloaded png_read_init() and png_write_init() with macros that convert + calls to png_read_init_2() or png_write_init_2() that check the version + and structure sizes. +version 1.0.7beta11 [May 7, 2000] + Removed the new PNG_CREATED_READ_STRUCT and PNG_CREATED_WRITE_STRUCT modes + which are no longer used. + Eliminated the three new members of png_text when PNG_LEGACY_SUPPORTED is + defined or when neither PNG_READ_iTXt_SUPPORTED nor PNG_WRITE_iTXT_SUPPORTED + is defined. + Made PNG_NO_READ|WRITE_iTXt the default setting, to avoid memory + overrun when old applications fill the info_ptr->text structure directly. + Added PNGAPI macro, and added it to the definitions of all exported functions. + Relocated version macro definitions ahead of the includes of zlib.h and + pngconf.h in png.h. +version 1.0.7beta12 [May 12, 2000] + Revised pngset.c to avoid a problem with expanding the png_debug macro. + Deleted some extraneous defines from pngconf.h + Made PNG_NO_CONSOLE_IO the default condition when PNG_BUILD_DLL is defined. + Use MSC _RPTn debugging instead of fprintf if _MSC_VER is defined. + Added png_access_version_number() function. + Check for mask&PNG_FREE_CHNK (for TEXT, SCAL, PCAL) in png_free_data(). + Expanded libpng.3/libpng.txt information about png_data_freer(). +version 1.0.7beta14 [May 17, 2000] (beta13 was not published) + Changed pnggccrd.c and pngvcrd.c to handle bad adaptive filter types as + warnings instead of errors, as pngrutil.c does. + Set the PNG_INFO_IDAT valid flag in png_set_rows() so png_write_png() + will actually write IDATs. + Made the default PNG_USE_LOCAL_ARRAYS depend on PNG_DLL instead of WIN32. + Make png_free_data() ignore its final parameter except when freeing data + that can have multiple instances (text, sPLT, unknowns). + Fixed a new bug in png_set_rows(). + Removed info_ptr->valid tests from png_free_data(), as in version 1.0.5. + Added png_set_invalid() function. + Fixed incorrect illustrations of png_destroy_write_struct() in example.c. +version 1.0.7beta15 [May 30, 2000] + Revised the deliberately erroneous Linux setjmp code in pngconf.h to produce + fewer error messages. + Rearranged checks for Z_OK to check the most likely path first in pngpread.c + and pngwutil.c. + Added checks in pngtest.c for png_create_*() returning NULL, and mentioned + in libpng.txt/libpng.3 the need for applications to check this. + Changed names of png_default_*() functions in pngtest to pngtest_*(). + Changed return type of png_get_x|y_offset_*() from png_uint_32 to png_int_32. + Fixed some bugs in the unused PNG_INCH_CONVERSIONS functions in pngget.c + Set each pointer to NULL after freeing it in png_free_data(). + Worked around a problem in pngconf.h; AIX's strings.h defines an "index" + macro that conflicts with libpng's png_color_16.index. (Dimitri Papadapoulos) + Added "msvc" directory with MSVC++ project files (Simon-Pierre Cadieux). +version 1.0.7beta16 [June 4, 2000] + Revised the workaround of AIX string.h "index" bug. + Added a check for overlength PLTE chunk in pngrutil.c. + Added PNG_NO_POINTER_INDEXING macro to use array-indexing instead of pointer + indexing in pngrutil.c and pngwutil.c to accommodate a buggy compiler. + Added a warning in png_decompress_chunk() when it runs out of data, e.g. + when it tries to read an erroneous PhotoShop iCCP chunk. + Added PNG_USE_DLL macro. + Revised the copyright/disclaimer/license notice. + Added contrib/msvctest directory +version 1.0.7rc1 [June 9, 2000] + Corrected the definition of PNG_TRANSFORM_INVERT_ALPHA (0x0400 not 0x0200) + Added contrib/visupng directory (Willem van Schaik) +version 1.0.7beta18 [June 23, 2000] + Revised PNGAPI definition, and pngvcrd.c to work with __GCC__ + and do not redefine PNGAPI if it is passed in via a compiler directive. + Revised visupng/PngFile.c to remove returns from within the Try block. + Removed leading underscores from "_PNG_H" and "_PNG_SAVE_BSD_SOURCE" macros. + Updated contrib/visupng/cexcept.h to version 1.0.0. + Fixed bugs in pngwrite.c and pngwutil.c that prevented writing iCCP chunks. +version 1.0.7rc2 [June 28, 2000] + Updated license to include disclaimers required by UCITA. + Fixed "DJBPP" typo in pnggccrd.c introduced in beta18. + +version 1.0.7 [July 1, 2000] + Revised the definition of "trans_values" in libpng.3/libpng.txt +version 1.0.8beta1 [July 8, 2000] + Added png_free(png_ptr, key) two places in pngpread.c to stop memory leaks. + Changed PNG_NO_STDIO to PNG_NO_CONSOLE_IO, several places in pngrutil.c and + pngwutil.c. + Changed PNG_EXPORT_VAR to use PNG_IMPEXP, in pngconf.h. + Removed unused "#include " from png.c + Added WindowsCE support. + Revised pnggccrd.c to work with gcc-2.95.2 and in the Cygwin environment. +version 1.0.8beta2 [July 10, 2000] + Added project files to the wince directory and made further revisions + of pngtest.c, pngrio.c, and pngwio.c in support of WindowsCE. +version 1.0.8beta3 [July 11, 2000] + Only set the PNG_FLAG_FREE_TRNS or PNG_FREE_TRNS flag in png_handle_tRNS() + for indexed-color input files to avoid potential double-freeing trans array + under some unusual conditions; problem was introduced in version 1.0.6f. + Further revisions to pngtest.c and files in the wince subdirectory. +version 1.0.8beta4 [July 14, 2000] + Added the files pngbar.png and pngbar.jpg to the distribution. + Added makefile.cygwin, and cygwin support in pngconf.h + Added PNG_NO_ZALLOC_ZERO macro (makes png_zalloc skip zeroing memory) +version 1.0.8rc1 [July 16, 2000] + Revised png_debug() macros and statements to eliminate compiler warnings. + +version 1.0.8 [July 24, 2000] + Added png_flush() in pngwrite.c, after png_write_IEND(). + Updated makefile.hpux to build a shared library. +version 1.0.9beta1 [November 10, 2000] + Fixed typo in scripts/makefile.hpux + Updated makevms.com in scripts and contrib/* and contrib/* (Martin Zinser) + Fixed seqence-point bug in contrib/pngminus/png2pnm (Martin Zinser) + Changed "cdrom.com" in documentation to "libpng.org" + Revised pnggccrd.c to get it all working, and updated makefile.gcmmx (Greg). + Changed type of "params" from voidp to png_voidp in png_read|write_png(). + Make sure PNGAPI and PNG_IMPEXP are defined in pngconf.h. + Revised the 3 instances of WRITEFILE in pngtest.c. + Relocated "msvc" and "wince" project subdirectories into "dll" subdirectory. + Updated png.rc in dll/msvc project + Revised makefile.dec to define and use LIBPATH and INCPATH + Increased size of global png_libpng_ver[] array from 12 to 18 chars. + Made global png_libpng_ver[], png_sig[] and png_pass_*[] arrays const. + Removed duplicate png_crc_finish() from png_handle_bKGD() function. + Added a warning when application calls png_read_update_info() multiple times. + Revised makefile.cygwin + Fixed bugs in iCCP support in pngrutil.c and pngwutil.c. + Replaced png_set_empty_plte_permitted() with png_permit_mng_features(). +version 1.0.9beta2 [November 19, 2000] + Renamed the "dll" subdirectory "projects". + Added borland project files to "projects" subdirectory. + Set VS_FF_PRERELEASE and VS_FF_PATCHED flags in msvc/png.rc when appropriate. + Add error message in png_set_compression_buffer_size() when malloc fails. +version 1.0.9beta3 [November 23, 2000] + Revised PNG_LIBPNG_BUILD_TYPE macro in png.h, used in the msvc project. + Removed the png_flush() in pngwrite.c that crashes some applications + that don't set png_output_flush_fn. + Added makefile.macosx and makefile.aix to scripts directory. +version 1.0.9beta4 [December 1, 2000] + Change png_chunk_warning to png_warning in png_check_keyword(). + Increased the first part of msg buffer from 16 to 18 in png_chunk_error(). +version 1.0.9beta5 [December 15, 2000] + Added support for filter method 64 (for PNG datastreams embedded in MNG). +version 1.0.9beta6 [December 18, 2000] + Revised png_set_filter() to accept filter method 64 when appropriate. + Added new PNG_HAVE_PNG_SIGNATURE bit to png_ptr->mode and use it to + help prevent applications from using MNG features in PNG datastreams. + Added png_permit_mng_features() function. + Revised libpng.3/libpng.txt. Changed "filter type" to "filter method". +version 1.0.9rc1 [December 23, 2000] + Revised test for PNG_HAVE_PNG_SIGNATURE in pngrutil.c + Fixed error handling of unknown compression type in png_decompress_chunk(). + In pngconf.h, define __cdecl when _MSC_VER is defined. +version 1.0.9beta7 [December 28, 2000] + Changed PNG_TEXT_COMPRESSION_zTXt to PNG_COMPRESSION_TYPE_BASE several places. + Revised memory management in png_set_hIST and png_handle_hIST in a backward + compatible manner. PLTE and tRNS were revised similarly. + Revised the iCCP chunk reader to ignore trailing garbage. +version 1.0.9beta8 [January 12, 2001] + Moved pngasmrd.h into pngconf.h. + Improved handling of out-of-spec garbage iCCP chunks generated by PhotoShop. +version 1.0.9beta9 [January 15, 2001] + Added png_set_invalid, png_permit_mng_features, and png_mmx_supported to + wince and msvc project module definition files. + Minor revision of makefile.cygwin. + Fixed bug with progressive reading of narrow interlaced images in pngpread.c +version 1.0.9beta10 [January 16, 2001] + Do not typedef png_FILE_p in pngconf.h when PNG_NO_STDIO is defined. + Fixed "png_mmx_supported" typo in project definition files. +version 1.0.9beta11 [January 19, 2001] + Updated makefile.sgi to make shared library. + Removed png_mmx_support() function and disabled PNG_MNG_FEATURES_SUPPORTED + by default, for the benefit of DLL forward compatibility. These will + be re-enabled in version 1.2.0. +version 1.0.9rc2 [January 22, 2001] + Revised cygwin support. + +version 1.0.9 [January 31, 2001] + Added check of cygwin's ALL_STATIC in pngconf.h + Added "-nommx" parameter to contrib/gregbook/rpng2-win and rpng2-x demos. +version 1.0.10beta1 [March 14, 2001] + Revised makefile.dec, makefile.sgi, and makefile.sggcc; added makefile.hpgcc. + Reformatted libpng.3 to eliminate bad line breaks. + Added checks for _mmx_supported in the read_filter_row function of pnggccrd.c + Added prototype for png_mmx_support() near the top of pnggccrd.c + Moved some error checking from png_handle_IHDR to png_set_IHDR. + Added PNG_NO_READ_SUPPORTED and PNG_NO_WRITE_SUPPORTED macros. + Revised png_mmx_support() function in pnggccrd.c + Restored version 1.0.8 PNG_WRITE_EMPTY_PLTE_SUPPORTED behavior in pngwutil.c + Fixed memory leak in contrib/visupng/PngFile.c + Fixed bugs in png_combine_row() in pnggccrd.c and pngvcrd.c (C version) + Added warnings when retrieving or setting gamma=0. + Increased the first part of msg buffer from 16 to 18 in png_chunk_warning(). +version 1.0.10rc1 [March 23, 2001] + Changed all instances of memcpy, strcpy, and strlen to png_memcpy, png_strcpy, + and png_strlen. + Revised png_mmx_supported() function in pnggccrd.c to return proper value. + Fixed bug in progressive reading (pngpread.c) with small images (height < 8). + +version 1.0.10 [March 30, 2001] + Deleted extraneous space (introduced in 1.0.9) from line 42 of makefile.cygwin + Added beos project files (Chris Herborth) +version 1.0.11beta1 [April 3, 2001] + Added type casts on several png_malloc() calls (Dimitri Papadapoulos). + Removed a no-longer needed AIX work-around from pngconf.h + Changed several "//" single-line comments to C-style in pnggccrd.c +version 1.0.11beta2 [April 11, 2001] + Removed PNGAPI from several functions whose prototypes did not have PNGAPI. + Updated scripts/pngos2.def +version 1.0.11beta3 [April 14, 2001] + Added checking the results of many instances of png_malloc() for NULL +version 1.0.11beta4 [April 20, 2001] + Undid the changes from version 1.0.11beta3. Added a check for NULL return + from user's malloc_fn(). + Removed some useless type casts of the NULL pointer. + Added makefile.netbsd + +version 1.0.11 [April 27, 2001] + Revised makefile.netbsd +version 1.0.12beta1 [May 14, 2001] + Test for Windows platform in pngconf.h when including malloc.h (Emmanuel Blot) + Updated makefile.cygwin and handling of Cygwin's ALL_STATIC in pngconf.h + Added some never-to-be-executed code in pnggccrd.c to quiet compiler warnings. + Eliminated the png_error about apps using png_read|write_init(). Instead, + libpng will reallocate the png_struct and info_struct if they are too small. + This retains future binary compatibility for old applications written for + libpng-0.88 and earlier. +version 1.2.0beta1 [May 6, 2001] + Bumped DLLNUM to 2. + Re-enabled PNG_MNG_FEATURES_SUPPORTED and enabled PNG_ASSEMBLER_CODE_SUPPORTED + by default. + Added runtime selection of MMX features. + Added png_set_strip_error_numbers function and related macros. +version 1.2.0beta2 [May 7, 2001] + Finished merging 1.2.0beta1 with version 1.0.11 + Added a check for attempts to read or write PLTE in grayscale PNG datastreams. +version 1.2.0beta3 [May 17, 2001] + Enabled user memory function by default. + Modified png_create_struct so it passes user mem_ptr to user memory allocator. + Increased png_mng_features flag from png_byte to png_uint_32. + Bumped shared-library (so-number) and dll-number to 3. +version 1.2.0beta4 [June 23, 2001] + Check for missing profile length field in iCCP chunk and free chunk_data + in case of truncated iCCP chunk. + Bumped shared-library number to 3 in makefile.sgi and makefile.sggcc + Bumped dll-number from 2 to 3 in makefile.cygwin + Revised contrib/gregbook/rpng*-x.c to avoid a memory leak and to exit cleanly + if user attempts to run it on an 8-bit display. + Updated contrib/gregbook + Use png_malloc instead of png_zalloc to allocate palette in pngset.c + Updated makefile.ibmc + Added some typecasts to eliminate gcc 3.0 warnings. Changed prototypes + of png_write_oFFS width and height from png_uint_32 to png_int_32. + Updated example.c + Revised prototypes for png_debug_malloc and png_debug_free in pngtest.c +version 1.2.0beta5 [August 8, 2001] + Revised contrib/gregbook + Revised makefile.gcmmx + Revised pnggccrd.c to conditionally compile some thread-unsafe code only + when PNG_THREAD_UNSAFE_OK is defined. + Added tests to prevent pngwutil.c from writing a bKGD or tRNS chunk with + value exceeding 2^bit_depth-1 + Revised makefile.sgi and makefile.sggcc + Replaced calls to fprintf(stderr,...) with png_warning() in pnggccrd.c + Removed restriction that do_invert_mono only operate on 1-bit opaque files + +version 1.2.0 [September 1, 2001] + Changed a png_warning() to png_debug() in pnggccrd.c + Fixed contrib/gregbook/rpng-x.c, rpng2-x.c to avoid crash with XFreeGC(). +version 1.2.1beta1 [October 19, 2001] + Revised makefile.std in contrib/pngminus + Include background_1 in png_struct regardless of gamma support. + Revised makefile.netbsd and makefile.macosx, added makefile.darwin. + Revised example.c to provide more details about using row_callback(). +version 1.2.1beta2 [October 25, 2001] + Added type cast to each NULL appearing in a function call, except for + WINCE functions. + Added makefile.so9. +version 1.2.1beta3 [October 27, 2001] + Removed type casts from all NULLs. + Simplified png_create_struct_2(). +version 1.2.1beta4 [November 7, 2001] + Revised png_create_info_struct() and png_creat_struct_2(). + Added error message if png_write_info() was omitted. + Type cast NULLs appearing in function calls when _NO_PROTO or + PNG_TYPECAST_NULL is defined. +version 1.2.1rc1 [November 24, 2001] + Type cast NULLs appearing in function calls except when PNG_NO_TYPECAST_NULL + is defined. + Changed typecast of "size" argument to png_size_t in pngmem.c calls to + the user malloc_fn, to agree with the prototype in png.h + Added a pop/push operation to pnggccrd.c, to preserve Eflag (Maxim Sobolev) + Updated makefile.sgi to recognize LIBPATH and INCPATH. + Updated various makefiles so "make clean" does not remove previous major + version of the shared library. +version 1.2.1rc2 [December 4, 2001] + Always allocate 256-entry internal palette, hist, and trans arrays, to + avoid out-of-bounds memory reference caused by invalid PNG datastreams. + Added a check for prefix_length > data_length in iCCP chunk handler. + +version 1.2.1 [December 7, 2001] + None. +version 1.2.2beta1 [February 22, 2002] + Fixed a bug with reading the length of iCCP profiles (Larry Reeves). + Revised makefile.linux, makefile.gcmmx, and makefile.sgi to generate + libpng.a, libpng12.so (not libpng.so.3), and libpng12/png.h + Revised makefile.darwin to remove "-undefined suppress" option. + Added checks for gamma and chromaticity values over 21474.83, which exceed + the limit for PNG unsigned 32-bit integers when encoded. + Revised calls to png_create_read_struct() and png_create_write_struct() + for simpler debugging. + Revised png_zalloc() so zlib handles errors (uses PNG_FLAG_MALLOC_NULL_MEM_OK) +version 1.2.2beta2 [February 23, 2002] + Check chunk_length and idat_size for invalid (over PNG_MAX_UINT) lengths. + Check for invalid image dimensions in png_get_IHDR. + Added missing "fi;" in the install target of the SGI makefiles. + Added install-static to all makefiles that make shared libraries. + Always do gamma compensation when image is partially transparent. +version 1.2.2beta3 [March 7, 2002] + Compute background.gray and background_1.gray even when color_type is RGB + in case image gets reduced to gray later. + Modified shared-library makefiles to install pkgconfig/libpngNN.pc. + Export (with PNGAPI) png_zalloc, png_zfree, and png_handle_as_unknown + Removed unused png_write_destroy_info prototype from png.h + Eliminated incorrect use of width_mmx from pnggccrd.c in pixel_bytes == 8 case + Added install-shared target to all makefiles that make shared libraries. + Stopped a double free of palette, hist, and trans when not using free_me. + Added makefile.32sunu for Sun Ultra 32 and makefile.64sunu for Sun Ultra 64. +version 1.2.2beta4 [March 8, 2002] + Compute background.gray and background_1.gray even when color_type is RGB + in case image gets reduced to gray later (Jason Summers). + Relocated a misplaced /bin/rm in the "install-shared" makefile targets + Added PNG_1_0_X macro which can be used to build a 1.0.x-compatible library. +version 1.2.2beta5 [March 26, 2002] + Added missing PNGAPI to several function definitions. + Check for invalid bit_depth or color_type in png_get_IHDR(), and + check for missing PLTE or IHDR in png_push_read_chunk() (Matthias Clasen). + Revised iTXt support to accept NULL for lang and lang_key. + Compute gamma for color components of background even when color_type is gray. + Changed "()" to "{}" in scripts/libpng.pc.in. + Revised makefiles to put png.h and pngconf.h only in $prefix/include/libpngNN + Revised makefiles to make symlink to libpng.so.NN in addition to libpngNN.so +version 1.2.2beta6 [March 31, 2002] +version 1.0.13beta1 [March 31, 2002] + Prevent png_zalloc() from trying to memset memory that it failed to acquire. + Add typecasts of PNG_MAX_UINT in pngset_cHRM_fixed() (Matt Holgate). + Ensure that the right function (user or default) is used to free the + png_struct after an error in png_create_read_struct_2(). +version 1.2.2rc1 [April 7, 2002] +version 1.0.13rc1 [April 7, 2002] + Save the ebx register in pnggccrd.c (Sami Farin) + Add "mem_ptr = png_ptr->mem_ptr" in png_destroy_write_struct() (Paul Gardner). + Updated makefiles to put headers in include/libpng and remove old include/*.h. + +version 1.2.2 [April 15, 2002] +version 1.0.13 [April 15, 2002] + Revised description of png_set_filter() in libpng.3/libpng.txt. + Revised makefile.netbsd and added makefile.neNNbsd and makefile.freebsd +version 1.0.13patch01 [April 17, 2002] +version 1.2.2patch01 [April 17, 2002] + Changed ${PNGMAJ}.${PNGVER} bug to ${PNGVER} in makefile.sgi and makefile.sggcc + Fixed VER -> PNGVER typo in makefile.macosx and added install-static to install + Added install: target to makefile.32sunu and makefile.64sunu +version 1.0.13patch03 [April 18, 2002] +version 1.2.2patch03 [April 18, 2002] + Revised 15 makefiles to link libpng.a to libpngNN.a and the include libpng + subdirectory to libpngNN subdirectory without the full pathname. + Moved generation of libpng.pc from "install" to "all" in 15 makefiles. +version 1.2.3rc1 [April 28, 2002] + Added install-man target to 15 makefiles (Dimitri Papadopolous-Orfanos). + Added $(DESTDIR) feature to 24 makefiles (Tim Mooney) + Fixed bug with $prefix, should be $(prefix) in makefile.hpux. + Updated cygwin-specific portion of pngconf.h and revised makefile.cygwin + Added a link from libpngNN.pc to libpng.pc in 15 makefiles. + Added links from include/libpngNN/*.h to include/*.h in 24 makefiles. + Revised makefile.darwin to make relative links without full pathname. + Added setjmp() at the end of png_create_*_struct_2() in case user forgets + to put one in their application. + Restored png_zalloc() and png_zfree() prototypes to version 1.2.1 and + removed them from module definition files. +version 1.2.3rc2 [May 1, 2002] + Fixed bug in reporting number of channels in pngget.c and pngset.c, + that was introduced in version 1.2.2beta5. + Exported png_zalloc(), png_zfree(), png_default_read(), png_default_write(), + png_default_flush(), and png_push_fill_buffer() and included them in + module definition files. + Added "libpng.pc" dependency to the "install-shared" target in 15 makefiles. +version 1.2.3rc3 [May 1, 2002] + Revised prototype for png_default_flush() + Remove old libpng.pc and libpngNN.pc before installing new ones. +version 1.2.3rc4 [May 2, 2002] + Typos in *.def files (png_default_read|write -> png_default_read|write_data) + In makefiles, changed rm libpng.NN.pc to rm libpngNN.pc + Added libpng-config and libpngNN-config and modified makefiles to install them. + Changed $(MANPATH) to $(DESTDIR)$(MANPATH) in makefiles + Added "Win32 DLL VB" configuration to projects/msvc/libpng.dsp +version 1.2.3rc5 [May 11, 2002] + Changed "error" and "message" in prototypes to "error_message" and + "warning_message" to avoid namespace conflict. + Revised 15 makefiles to build libpng-config from libpng-config-*.in + Once more restored png_zalloc and png_zfree to regular nonexported form. + Restored png_default_read|write_data, png_default_flush, png_read_fill_buffer + to nonexported form, but with PNGAPI, and removed them from module def files. +version 1.2.3rc6 [May 14, 2002] + Removed "PNGAPI" from png_zalloc() and png_zfree() in png.c + Changed "Gz" to "Gd" in projects/msvc/libpng.dsp and zlib.dsp. + Removed leftover libpng-config "sed" script from four makefiles. + Revised libpng-config creating script in 16 makefiles. + +version 1.2.3 [May 22, 2002] + Revised libpng-config target in makefile.cygwin. + Removed description of png_set_mem_fn() from documentation. + Revised makefile.freebsd. + Minor cosmetic changes to 15 makefiles, e.g., $(DI) = $(DESTDIR)/$(INCDIR). + Revised projects/msvc/README.txt + Changed -lpng to -lpngNN in LDFLAGS in several makefiles. +version 1.2.4beta1 [May 24, 2002] + Added libpng.pc and libpng-config to "all:" target in 16 makefiles. + Fixed bug in 16 makefiles: $(DESTDIR)/$(LIBPATH) to $(DESTDIR)$(LIBPATH) + Added missing "\" before closing double quote in makefile.gcmmx. + Plugged various memory leaks; added png_malloc_warn() and png_set_text_2() + functions. +version 1.2.4beta2 [June 25, 2002] + Plugged memory leak of png_ptr->current_text (Matt Holgate). + Check for buffer overflow before reading CRC in pngpread.c (Warwick Allison) + Added -soname to the loader flags in makefile.dec, makefile.sgi, and + makefile.sggcc. + Added "test-installed" target to makefile.linux, makefile.gcmmx, + makefile.sgi, and makefile.sggcc. +version 1.2.4beta3 [June 28, 2002] + Plugged memory leak of row_buf in pngtest.c when there is a png_error(). + Detect buffer overflow in pngpread.c when IDAT is corrupted with extra data. + Added "test-installed" target to makefile.32sunu, makefile.64sunu, + makefile.beos, makefile.darwin, makefile.dec, makefile.macosx, + makefile.solaris, makefile.hpux, makefile.hpgcc, and makefile.so9. +version 1.2.4rc1 and 1.0.14rc1 [July 2, 2002] + Added "test-installed" target to makefile.cygwin and makefile.sco. + Revised pnggccrd.c to be able to back out version 1.0.x via PNG_1_0_X macro. + +version 1.2.4 and 1.0.14 [July 8, 2002] + Changed png_warning() to png_error() when width is too large to process. +version 1.2.4patch01 [July 20, 2002] + Revised makefile.cygwin to use DLL number 12 instead of 13. +version 1.2.5beta1 [August 6, 2002] + Added code to contrib/gregbook/readpng2.c to ignore unused chunks. + Replaced toucan.png in contrib/gregbook (it has been corrupt since 1.0.11) + Removed some stray *.o files from contrib/gregbook. + Changed png_error() to png_warning() about "Too much data" in pngpread.c + and about "Extra compressed data" in pngrutil.c. + Prevent png_ptr->pass from exceeding 7 in png_push_finish_row(). + Updated makefile.hpgcc + Updated png.c and pnggccrd.c handling of return from png_mmx_support() +version 1.2.5beta2 [August 15, 2002] + Only issue png_warning() about "Too much data" in pngpread.c when avail_in + is nonzero. + Updated makefiles to install a separate libpng.so.3 with its own rpath. +version 1.2.5rc1 and 1.0.15rc1 [August 24, 2002] + Revised makefiles to not remove previous minor versions of shared libraries. +version 1.2.5rc2 and 1.0.15rc2 [September 16, 2002] + Revised 13 makefiles to remove "-lz" and "-L$(ZLIBLIB)", etc., from shared + library loader directive. + Added missing "$OBJSDLL" line to makefile.gcmmx. + Added missing "; fi" to makefile.32sunu. +version 1.2.5rc3 and 1.0.15rc3 [September 18, 2002] + Revised libpng-config script. + +version 1.2.5 and 1.0.15 [October 3, 2002] + Revised makefile.macosx, makefile.darwin, makefile.hpgcc, and makefile.hpux, + and makefile.aix. + Relocated two misplaced PNGAPI lines in pngtest.c +version 1.2.6beta1 [October 22, 2002] + Commented out warning about uninitialized mmx_support in pnggccrd.c. + Changed "IBMCPP__" flag to "__IBMCPP__" in pngconf.h. + Relocated two more misplaced PNGAPI lines in pngtest.c + Fixed memory overrun bug in png_do_read_filler() with 16-bit datastreams, + introduced in version 1.0.2. + Revised makefile.macosx, makefile.dec, makefile.aix, and makefile.32sunu. +version 1.2.6beta2 [November 1, 2002] + Added libpng-config "--ldopts" output. + Added "AR=ar" and "ARFLAGS=rc" and changed "ar rc" to "$(AR) $(ARFLAGS)" + in makefiles. +version 1.2.6beta3 [July 18, 2004] + Reverted makefile changes from version 1.2.6beta2 and some of the changes + from version 1.2.6beta1; these will be postponed until version 1.2.7. + Version 1.2.6 is going to be a simple bugfix release. + Changed the one instance of "ln -sf" to "ln -f -s" in each Sun makefile. + Fixed potential overrun in pngerror.c by using strncpy instead of memcpy. + Added "#!/bin/sh" at the top of configure, for recognition of the + 'x' flag under Cygwin (Cosmin). + Optimized vacuous tests that silence compiler warnings, in png.c (Cosmin). + Added support for PNG_USER_CONFIG, in pngconf.h (Cosmin). + Fixed the special memory handler for Borland C under DOS, in pngmem.c + (Cosmin). + Removed some spurious assignments in pngrutil.c (Cosmin). + Replaced 65536 with 65536L, and 0xffff with 0xffffL, to silence warnings + on 16-bit platforms (Cosmin). + Enclosed shift op expressions in parentheses, to silence warnings (Cosmin). + Used proper type png_fixed_point, to avoid problems on 16-bit platforms, + in png_handle_sRGB() (Cosmin). + Added compression_type to png_struct, and optimized the window size + inside the deflate stream (Cosmin). + Fixed definition of isnonalpha(), in pngerror.c and pngrutil.c (Cosmin). + Fixed handling of unknown chunks that come after IDAT (Cosmin). + Allowed png_error() and png_warning() to work even if png_ptr == NULL + (Cosmin). + Replaced row_info->rowbytes with row_bytes in png_write_find_filter() + (Cosmin). + Fixed definition of PNG_LIBPNG_VER_DLLNUM (Simon-Pierre). + Used PNG_LIBPNG_VER and PNG_LIBPNG_VER_STRING instead of the hardcoded + values in png.c (Simon-Pierre, Cosmin). + Initialized png_libpng_ver[] with PNG_LIBPNG_VER_STRING (Simon-Pierre). + Replaced PNG_LIBPNG_VER_MAJOR with PNG_LIBPNG_VER_DLLNUM in png.rc + (Simon-Pierre). + Moved the definition of PNG_HEADER_VERSION_STRING near the definitions + of the other PNG_LIBPNG_VER_... symbols in png.h (Cosmin). + Relocated #ifndef PNGAPI guards in pngconf.h (Simon-Pierre, Cosmin). + Updated scripts/makefile.vc(a)win32 (Cosmin). + Updated the MSVC project (Simon-Pierre, Cosmin). + Updated the Borland C++ Builder project (Cosmin). + Avoided access to asm_flags in pngvcrd.c, if PNG_1_0_X is defined (Cosmin). + Commented out warning about uninitialized mmx_support in pngvcrd.c (Cosmin). + Removed scripts/makefile.bd32 and scripts/pngdef.pas (Cosmin). + Added extra guard around inclusion of Turbo C memory headers, in pngconf.h + (Cosmin). + Renamed projects/msvc/ to projects/visualc6/, and projects/borland/ to + projects/cbuilder5/ (Cosmin). + Moved projects/visualc6/png32ms.def to scripts/pngw32.def, + and projects/visualc6/png.rc to scripts/pngw32.rc (Cosmin). + Added projects/visualc6/pngtest.dsp; removed contrib/msvctest/ (Cosmin). + Changed line endings to DOS style in cbuilder5 and visualc6 files, even + in the tar.* distributions (Cosmin). + Updated contrib/visupng/VisualPng.dsp (Cosmin). + Updated contrib/visupng/cexcept.h to version 2.0.0 (Cosmin). + Added a separate distribution with "configure" and supporting files (Junichi). +version 1.2.6beta4 [July 28, 2004] + Added user ability to change png_size_t via a PNG_SIZE_T macro. + Added png_sizeof() and png_convert_size() functions. + Added PNG_SIZE_MAX (maximum value of a png_size_t variable. + Added check in png_malloc_default() for (size_t)size != (png_uint_32)size + which would indicate an overflow. + Changed sPLT failure action from png_error to png_warning and abandon chunk. + Changed sCAL and iCCP failures from png_error to png_warning and abandon. + Added png_get_uint_31(png_ptr, buf) function. + Added PNG_UINT_32_MAX macro. + Renamed PNG_MAX_UINT to PNG_UINT_31_MAX. + Made png_zalloc() issue a png_warning and return NULL on potential + overflow. + Turn on PNG_NO_ZALLOC_ZERO by default in version 1.2.x + Revised "clobber list" in pnggccrd.c so it will compile under gcc-3.4. + Revised Borland portion of png_malloc() to return NULL or issue + png_error() according to setting of PNG_FLAG_MALLOC_NULL_MEM_OK. + Added PNG_NO_SEQUENTIAL_READ_SUPPORTED macro to conditionally remove + sequential read support. + Added some "#if PNG_WRITE_SUPPORTED" blocks. + Removed some redundancy with #ifdef/#endif in png_malloc_default(). + Use png_malloc instead of png_zalloc to allocate the pallete. +version 1.0.16rc1 and 1.2.6rc1 [August 4, 2004] + Fixed buffer overflow vulnerability in png_handle_tRNS() + Fixed integer arithmetic overflow vulnerability in png_read_png(). + Fixed some harmless bugs in png_handle_sBIT, etc, that would cause + duplicate chunk types to go undetected. + Fixed some timestamps in the -config version + Rearranged order of processing of color types in png_handle_tRNS(). + Added ROWBYTES macro to calculate rowbytes without integer overflow. + Updated makefile.darwin and removed makefile.macosx from scripts directory. + Imposed default one million column, one-million row limits on the image + dimensions, and added png_set_user_limits() function to override them. + Revised use of PNG_SET_USER_LIMITS_SUPPORTED macro. + Fixed wrong cast of returns from png_get_user_width|height_max(). + Changed some "keep the compiler happy" from empty statements to returns, + Revised libpng.txt to remove 1.2.x stuff from the 1.0.x distribution +version 1.0.16rc2 and 1.2.6rc2 [August 7, 2004] + Revised makefile.darwin and makefile.solaris. Removed makefile.macosx. + Revised pngtest's png_debug_malloc() to use png_malloc() instead of + png_malloc_default() which is not supposed to be exported. + Fixed off-by-one error in one of the conversions to PNG_ROWBYTES() in + pngpread.c. Bug was introduced in 1.2.6rc1. + Fixed bug in RGB to RGBX transformation introduced in 1.2.6rc1. + Fixed old bug in RGB to Gray transformation. + Fixed problem with 64-bit compilers by casting arguments to abs() + to png_int_32. + Changed "ln -sf" to "ln -f -s" in three makefiles (solaris, sco, so9). + Changed "HANDLE_CHUNK_*" to "PNG_HANDLE_CHUNK_*" (Cosmin) + Added "-@/bin/rm -f $(DL)/$(LIBNAME).so.$(PNGMAJ)" to 15 *NIX makefiles. + Added code to update the row_info->colortype in png_do_read_filler() (MSB). +version 1.0.16rc3 and 1.2.6rc3 [August 9, 2004] + Eliminated use of "abs()" in testing cHRM and gAMA values, to avoid + trouble with some 64-bit compilers. Created PNG_OUT_OF_RANGE() macro. + Revised documentation of png_set_keep_unknown_chunks(). + Check handle_as_unknown status in pngpread.c, as in pngread.c previously. + Moved "PNG_HANDLE_CHUNK_*" macros out of PNG_INTERNAL section of png.h + Added "rim" definitions for CONST4 and CONST6 in pnggccrd.c +version 1.0.16rc4 and 1.2.6rc4 [August 10, 2004] + Fixed mistake in pngtest.c introduced in 1.2.6rc2 (declaration of + "pinfo" was out of place). +version 1.0.16rc5 and 1.2.6rc5 [August 10, 2004] + Moved "PNG_HANDLE_CHUNK_*" macros out of PNG_ASSEMBLER_CODE_SUPPORTED + section of png.h where they were inadvertently placed in version rc3. + +version 1.2.6 and 1.0.16 [August 15, 2004] + Revised pngtest so memory allocation testing is only done when PNG_DEBUG==1. +version 1.2.7beta1 [August 26, 2004] + Removed unused pngasmrd.h file. + Removed references to uu.net for archived files. Added references to + PNG Spec (second edition) and the PNG ISO/IEC Standard. + Added "test-dd" target in 15 makefiles, to run pngtest in DESTDIR. + Fixed bug with "optimized window size" in the IDAT datastream, that + causes libpng to write PNG files with incorrect zlib header bytes. +version 1.2.7beta2 [August 28, 2004] + Fixed bug with sCAL chunk and big-endian machines (David Munro). + Undid new code added in 1.2.6rc2 to update the color_type in + png_set_filler(). + Added png_set_add_alpha() that updates color type. +version 1.0.17rc1 and 1.2.7rc1 [September 4, 2004] + Revised png_set_strip_filler() to not remove alpha if color_type has alpha. + +version 1.2.7 and 1.0.17 [September 12, 2004] + Added makefile.hp64 + Changed projects/msvc/png32ms.def to scripts/png32ms.def in makefile.cygwin +version 1.2.8beta1 [November 1, 2004] + Fixed bug in png_text_compress() that would fail to complete a large block. + Fixed bug, introduced in libpng-1.2.7, that overruns a buffer during + strip alpha operation in png_do_strip_filler(). + Added PNG_1_2_X definition in pngconf.h + Comment out with #ifdef/#endif png_info_init in png.c and png_read_init + in pngread.c (as of 1.3.0) +version 1.2.8beta2 [November 2, 2004] + Reduce color_type to a nonalpha type after strip alpha operation in + png_do_strip_filler(). +version 1.2.8beta3 [November 3, 2004] + Revised definitions of PNG_MAX_UINT_32, PNG_MAX_SIZE, and PNG_MAXSUM +version 1.2.8beta4 [November 12, 2004] + Fixed (again) definition of PNG_LIBPNG_VER_DLLNUM in png.h (Cosmin). + Added PNG_LIBPNG_BUILD_PRIVATE in png.h (Cosmin). + Set png_ptr->zstream.data_type to Z_BINARY, to avoid unnecessary detection + of data type in deflate (Cosmin). + Deprecated but continue to support SPECIALBUILD and PRIVATEBUILD in favor of + PNG_LIBPNG_BUILD_SPECIAL_STRING and PNG_LIBPNG_BUILD_PRIVATE_STRING. +version 1.2.8beta5 [November 20, 2004] + Use png_ptr->flags instead of png_ptr->transformations to pass + PNG_STRIP_ALPHA info to png_do_strip_filler(), to preserve ABI + compatibility. + Revised handling of SPECIALBUILD, PRIVATEBUILD, + PNG_LIBPNG_BUILD_SPECIAL_STRING and PNG_LIBPNG_BUILD_PRIVATE_STRING. +version 1.2.8rc1 [November 24, 2004] + Moved handling of BUILD macros from pngconf.h to png.h + Added definition of PNG_LIBPNG_BASE_TYPE in png.h, inadvertently + omitted from beta5. + Revised scripts/pngw32.rc + Despammed mailing addresses by masking "@" with "at". + Inadvertently installed a supposedly faster test version of pngrutil.c +version 1.2.8rc2 [November 26, 2004] + Added two missing "\" in png.h + Change tests in pngread.c and pngpread.c to + if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) + png_do_read_transformations(png_ptr); +version 1.2.8rc3 [November 28, 2004] + Reverted pngrutil.c to version libpng-1.2.8beta5. + Added scripts/makefile.elf with supporting code in pngconf.h for symbol + versioning (John Bowler). +version 1.2.8rc4 [November 29, 2004] + Added projects/visualc7 (Simon-pierre). +version 1.2.8rc5 [November 29, 2004] + Fixed new typo in scripts/pngw32.rc + +version 1.2.8 [December 3, 2004] + Removed projects/visualc7, added projects/visualc71. + +version 1.2.9beta1 [February 21, 2006] + + Initialized some structure members in pngwutil.c to avoid gcc-4.0.0 complaints + Revised man page and libpng.txt to make it clear that one should not call + png_read_end or png_write_end after png_read_png or png_write_png. + Updated references to png-mng-implement mailing list. + Fixed an incorrect typecast in pngrutil.c + Added PNG_NO_READ_SUPPORTED conditional for making a write-only library. + Added PNG_NO_WRITE_INTERLACING_SUPPORTED conditional. + Optimized alpha-inversion loops in pngwtran.c + Moved test for nonzero gamma outside of png_build_gamma_table() in pngrtran.c + Make sure num_trans is <= 256 before copying data in png_set_tRNS(). + Make sure num_palette is <= 256 before copying data in png_set_PLTE(). + Interchanged order of write_swap_alpha and write_invert_alpha transforms. + Added parentheses in the definition of PNG_LIBPNG_BUILD_TYPE (Cosmin). + Optimized zlib window flag (CINFO) in contrib/pngsuite/*.png (Cosmin). + Updated scripts/makefile.bc32 for Borland C++ 5.6 (Cosmin). + Exported png_get_uint_32, png_save_uint_32, png_get_uint_16, png_save_uint_16, + png_get_int_32, png_save_int_32, png_get_uint_31 (Cosmin). + Added type cast (png_byte) in png_write_sCAL() (Cosmin). + Fixed scripts/makefile.cygwin (Christian Biesinger, Cosmin). + Default iTXt support was inadvertently enabled. + +version 1.2.9beta2 [February 21, 2006] + + Check for png_rgb_to_gray and png_gray_to_rgb read transformations before + checking for png_read_dither in pngrtran.c + Revised checking of chromaticity limits to accommodate extended RGB + colorspace (John Denker). + Changed line endings in some of the project files to CRLF, even in the + "Unix" tar distributions (Cosmin). + Made png_get_int_32 and png_save_int_32 always available (Cosmin). + Updated scripts/pngos2.def, scripts/pngw32.def and projects/wince/png32ce.def + with the newly exported functions. + Eliminated distributions without the "configure" script. + Updated INSTALL instructions. + +version 1.2.9beta3 [February 24, 2006] + + Fixed CRCRLF line endings in contrib/visupng/VisualPng.dsp + Made libpng.pc respect EXEC_PREFIX (D. P. Kreil, J. Bowler) + Removed reference to pngasmrd.h from Makefile.am + Renamed CHANGES to ChangeLog. + Renamed LICENSE to COPYING. + Renamed ANNOUNCE to NEWS. + Created AUTHORS file. + +version 1.2.9beta4 [March 3, 2006] + + Changed definition of PKGCONFIG from $prefix/lib to $libdir in configure.ac + Reverted to filenames LICENSE and ANNOUNCE; removed AUTHORS and COPYING. + Removed newline from the end of some error and warning messages. + Removed test for sqrt() from configure.ac and configure. + Made swap tables in pngtrans.c PNG_CONST (Carlo Bramix). + Disabled default iTXt support that was inadvertently enabled in + libpng-1.2.9beta1. + Added "OS2" to list of systems that don't need underscores, in pnggccrd.c + Removed libpng version and date from *.c files. + +version 1.2.9beta5 [March 4, 2006] + Removed trailing blanks from source files. + Put version and date of latest change in each source file, and changed + copyright year accordingly. + More cleanup of configure.ac, Makefile.ac, and associated scripts. + Restored scripts/makefile.elf which was inadvertently deleted. + +version 1.2.9beta6 [March 6, 2006] + Fixed typo (RELEASE) in configuration files. + +version 1.2.9beta7 [March 7, 2006] + Removed libpng.vers and libpng.sym from libpng12_la_SOURCES in Makefile.am + Fixed inconsistent #ifdef's around png_sig_bytes() and png_set_sCAL_s() + in png.h. + Updated makefile.elf as suggested by debian. + Made cosmetic changes to some makefiles, adding LN_SF and other macros. + Made some makefiles accept "exec_prefix". + +version 1.2.9beta8 [March 9, 2006] + Fixed some "#if defined (..." which should be "#if defined(..." + Bug introduced in libpng-1.2.8. + Fixed inconsistency in definition of png_default_read_data() + Restored blank that was lost from makefile.sggcc "clean" target in beta7. + Revised calculation of "current" and "major" for irix in ltmain.sh + Changed "mkdir" to "MKDIR_P" in some makefiles. + Separated PNG_EXPAND and PNG_EXPAND_tRNS. + Added png_set_expand_gray_1_2_4_to_8() and deprecated + png_set_gray_1_2_4_to_8() which also expands tRNS to alpha. + +version 1.2.9beta9 [March 10, 2006] + Include "config.h" in pngconf.h when available. + Added some checks for NULL png_ptr or NULL info_ptr (timeless) + +version 1.2.9beta10 [March 20, 2006] + Removed extra CR from contrib/visualpng/VisualPng.dsw (Cosmin) + Made pnggccrd.c PIC-compliant (Christian Aichinger). + Added makefile.mingw (Wolfgang Glas). + Revised pngconf.h MMX checking. + +version 1.2.9beta11 [March 22, 2006] + Fixed out-of-order declaration in pngwrite.c that was introduced in beta9 + Simplified some makefiles by using LIBSO, LIBSOMAJ, and LIBSOVER macros. + +version 1.2.9rc1 [March 31, 2006] + Defined PNG_USER_PRIVATEBUILD when including "pngusr.h" (Cosmin). + Removed nonsensical assertion check from pngtest.c (Cosmin). + +version 1.2.9 [April 14, 2006] + Revised makefile.beos and added "none" selector in ltmain.sh + +version 1.2.10beta1 [April 15, 2006] + Renamed "config.h" to "png_conf.h" and revised Makefile.am to add + -DPNG_BUILDING_LIBPNG to compile directive, and modified pngconf.h + to include png_conf.h only when PNG_BUILDING_LIBPNG is defined. + +version 1.2.10beta2 [April 15, 2006] + Manually updated Makefile.in and configure. Changed png_conf.h.in + back to config.h. + +version 1.2.10beta3 [April 15, 2006] + Change png_conf.h back to config.h in pngconf.h. + +version 1.2.10beta4 [April 16, 2006] + Change PNG_BUILDING_LIBPNG to PNG_CONFIGURE_LIBPNG in config/Makefile*. + +version 1.2.10beta5 [April 16, 2006] + Added a configure check for compiling assembler code in pnggccrd.c + +version 1.2.10beta6 [April 17, 2006] + Revised the configure check for pnggccrd.c + Moved -DPNG_CONFIGURE_LIBPNG into @LIBPNG_DEFINES@ + Added @LIBPNG_DEFINES@ to arguments when building libpng.sym + +version 1.2.10beta7 [April 18, 2006] + Change "exec_prefix=$prefix" to "exec_prefix=$(prefix)" in makefiles. + +version 1.2.10rc1 [April 19, 2006] + Ensure pngconf.h doesn't define both PNG_USE_PNGGCCRD and PNG_USE_PNGVCRD + Fixed "LN_FS" typo in makefile.sco and makefile.solaris. + +version 1.2.10rc2 [April 20, 2006] + Added a backslash between -DPNG_CONFIGURE_LIBPNG and -DPNG_NO_ASSEMBLER_CODE + in configure.ac and configure + Made the configure warning about versioned symbols less arrogant. + +version 1.2.10rc3 [April 21, 2006] + Added a note in libpng.txt that png_set_sig_bytes(8) can be used when + writing an embedded PNG without the 8-byte signature. + Revised makefiles and configure to avoid making links to libpng.so.* + +version 1.2.10 [April 23, 2006] + Reverted configure to "rc2" state. + +version 1.2.11beta1 [May 31, 2006] + scripts/libpng.pc.in contained "configure" style version info and would + not work with makefiles. + The shared-library makefiles were linking to libpng.so.0 instead of + libpng.so.3 compatibility as the library. + +version 1.2.11beta2 [June 2, 2006] + Increased sprintf buffer from 50 to 52 chars in pngrutil.c to avoid + buffer overflow. + Fixed bug in example.c (png_set_palette_rgb -> png_set_palette_to_rgb) + +version 1.2.11beta3 [June 5, 2006] + Prepended "#! /bin/sh" to ltmail.sh and contrib/pngminus/*.sh (Cosmin). + Removed the accidental leftover Makefile.in~ (Cosmin). + Avoided potential buffer overflow and optimized buffer in + png_write_sCAL(), png_write_sCAL_s() (Cosmin). + Removed the include directories and libraries from CFLAGS and LDFLAGS + in scripts/makefile.gcc (Nelson A. de Oliveira, Cosmin). + +version 1.2.11beta4 [June 6, 2006] + Allow zero-length IDAT chunks after the entire zlib datastream, but not + after another intervening chunk type. + +version 1.0.19rc1, 1.2.11rc1 [June 13, 2006] + Deleted extraneous square brackets from [config.h] in configure.ac + +version 1.0.19rc2, 1.2.11rc2 [June 14, 2006] + Added prototypes for PNG_INCH_CONVERSIONS functions to png.h + Revised INSTALL and autogen.sh + Fixed typo in several makefiles (-W1 should be -Wl) + Added typedef for png_int_32 and png_uint_32 on 64-bit systems. + +version 1.0.19rc3, 1.2.11rc3 [June 15, 2006] + Removed the new typedefs for 64-bit systems (delay until version 1.4.0) + Added one zero element to png_gamma_shift[] array in pngrtran.c to avoid + reading out of bounds. + +version 1.0.19rc4, 1.2.11rc4 [June 15, 2006] + Really removed the new typedefs for 64-bit systems. + +version 1.0.19rc5, 1.2.11rc5 [June 22, 2006] + Removed png_sig_bytes entry from scripts/pngw32.def + +version 1.0.19, 1.2.11 [June 26, 2006] + None. + +version 1.0.20, 1.2.12 [June 27, 2006] + Really increased sprintf buffer from 50 to 52 chars in pngrutil.c to avoid + buffer overflow. + +version 1.2.13beta1 [October 2, 2006] + Removed AC_FUNC_MALLOC from configure.ac + Work around Intel-Mac compiler bug by setting PNG_NO_MMX_CODE in pngconf.h + Change "logical" to "bitwise" throughout documentation. + Detect and fix attempt to write wrong iCCP profile length. + +version 1.0.21, 1.2.13 [November 14, 2006] + Fix potential buffer overflow in sPLT chunk handler. + Fix Makefile.am to not try to link to noexistent files. + Check all exported functions for NULL png_ptr. + +version 1.2.14beta1 [November 17, 2006] + Relocated three misplaced tests for NULL png_ptr. + Built Makefile.in with automake-1.9.6 instead of 1.9.2. + Build configure with autoconf-2.60 instead of 2.59 + +version 1.2.14beta2 [November 17, 2006] + Added some typecasts in png_zalloc(). + +version 1.2.14rc1 [November 20, 2006] + Changed "strtod" to "png_strtod" in pngrutil.c + +version 1.0.22, 1.2.14 [November 27, 2006] + Added missing "$(srcdir)" in Makefile.am and Makefile.in + +version 1.2.15beta1 [December 3, 2006] + Generated configure with autoconf-2.61 instead of 2.60 + Revised configure.ac to update libpng.pc and libpng-config. + +version 1.2.15beta2 [December 3, 2006] + Always export MMX asm functions, just stubs if not building pnggccrd.c + +version 1.2.15beta3 [December 4, 2006] + Add "png_bytep" typecast to profile while calculating length in pngwutil.c + +version 1.2.15beta4 [December 7, 2006] + Added scripts/CMakeLists.txt + Changed PNG_NO_ASSEMBLER_CODE to PNG_NO_MMX_CODE in scripts, like 1.4.0beta + +version 1.2.15beta5 [December 7, 2006] + Changed some instances of PNG_ASSEMBLER_* to PNG_MMX_* in pnggccrd.c + Revised scripts/CMakeLists.txt + +version 1.2.15beta6 [December 13, 2006] + Revised scripts/CMakeLists.txt and configure.ac + +version 1.2.15rc1 [December 18, 2006] + Revised scripts/CMakeLists.txt + +version 1.2.15rc2 [December 21, 2006] + Added conditional #undef jmpbuf in pngtest.c to undo #define in AIX headers. + Added scripts/makefile.nommx + +version 1.2.15rc3 [December 25, 2006] + Fixed shared library numbering error that was introduced in 1.2.15beta6. + +version 1.2.15rc4 [December 27, 2006] + Fixed handling of rgb_to_gray when png_ptr->color.gray isn't set. + +version 1.2.15rc5 [December 31, 2006] + Revised handling of rgb_to_gray. + +version 1.0.23, 1.2.15 [January 5, 2007] + Added some (unsigned long) typecasts in pngtest.c to avoid printing errors. + +version 1.2.16beta1 [January 6, 2007] + Fix bugs in makefile.nommx + +version 1.2.16beta2 [January 16, 2007] + Revised scripts/CMakeLists.txt + +version 1.0.24, 1.2.16 [January 31, 2007] + No changes. + +version 1.2.17beta1 [March 6, 2007] + Revised scripts/CMakeLists.txt to install both shared and static libraries. + Deleted a redundant line from pngset.c. + +version 1.2.17beta2 [April 26, 2007] + Relocated misplaced test for png_ptr == NULL in pngpread.c + Change "==" to "&" for testing PNG_RGB_TO_GRAY_ERR & PNG_RGB_TO_GRAY_WARN + flags. + Changed remaining instances of PNG_ASSEMBLER_* to PNG_MMX_* + Added pngerror() when write_IHDR fails in deflateInit2(). + Added "const" to some array declarations. + Mention examples of libpng usage in the libpng*.txt and libpng.3 documents. + +version 1.2.17rc1 [May 4, 2007] + No changes. + +version 1.2.17rc2 [May 8, 2007] + Moved several PNG_HAVE_* macros out of PNG_INTERNAL because applications + calling set_unknown_chunk_location() need them. + Changed transformation flag from PNG_EXPAND_tRNS to PNG_EXPAND in + png_set_expand_gray_1_2_4_to_8(). + Added png_ptr->unknown_chunk to hold working unknown chunk data, so it + can be free'ed in case of error. Revised unknown chunk handling in + pngrutil.c and pngpread.c to use this structure. + +version 1.2.17rc3 [May 8, 2007] + Revised symbol-handling in configure script. + +version 1.2.17rc4 [May 10, 2007] + Revised unknown chunk handling to avoid storing unknown critical chunks. + +version 1.0.25 [May 15, 2007] +version 1.2.17 [May 15, 2007] + Added "png_ptr->num_trans=0" before error return in png_handle_tRNS, + to eliminate a vulnerability (CVE-2007-2445, CERT VU#684664) + +version 1.0.26 [May 15, 2007] +version 1.2.18 [May 15, 2007] + Reverted the libpng-1.2.17rc3 change to symbol-handling in configure script + +version 1.2.19beta1 [May 18, 2007] + Changed "const static" to "static PNG_CONST" everywhere, mostly undoing + change of libpng-1.2.17beta2. Changed other "const" to "PNG_CONST" + Changed some handling of unused parameters, to avoid compiler warnings. + "if (unused == NULL) return;" becomes "unused = unused". + +version 1.2.19beta2 [May 18, 2007] + Only use the valid bits of tRNS value in png_do_expand() (Brian Cartier) + +version 1.2.19beta3 [May 19, 2007] + Add some "png_byte" typecasts in png_check_keyword() and write new_key + instead of key in zTXt chunk (Kevin Ryde). + +version 1.2.19beta4 [May 21, 2007] + Add png_snprintf() function and use it in place of sprint() for improved + defense against buffer overflows. + +version 1.2.19beta5 [May 21, 2007] + Fixed png_handle_tRNS() to only use the valid bits of tRNS value. + Changed handling of more unused parameters, to avoid compiler warnings. + Removed some PNG_CONST in pngwutil.c to avoid compiler warnings. + +version 1.2.19beta6 [May 22, 2007] + Added some #ifdef PNG_MMX_CODE_SUPPORTED where needed in pngvcrd.c + Added a special "_MSC_VER" case that defines png_snprintf to _snprintf + +version 1.2.19beta7 [May 22, 2007] + Squelched png_squelch_warnings() in pnggccrd.c and added + an #ifdef PNG_MMX_CODE_SUPPORTED/#endif block around the declarations + that caused the warnings that png_squelch_warnings was squelching. + +version 1.2.19beta8 [May 22, 2007] + Removed __MMX__ from test in pngconf.h. + +version 1.2.19beta9 [May 23, 2007] + Made png_squelch_warnings() available via PNG_SQUELCH_WARNINGS macro. + Revised png_squelch_warnings() so it might work. + Updated makefile.sgcc and makefile.solaris; added makefile.solaris-x86. + +version 1.2.19beta10 [May 24, 2007] + Resquelched png_squelch_warnings(), use "__attribute__((used))" instead. + +version 1.2.19beta11 [May 28, 2007] + Return 0 from png_get_sPLT() and png_get_unknown_chunks() if png_ptr is NULL; + changed three remaining instances of png_strcpy() to png_strncpy() (David + Hill). + Make test for NULL row_buf at the beginning of png_do_read_transformations + unconditional. + +version 1.2.19beta12 [May 28, 2007] + Revised pnggccrd.c. + +version 1.2.19beta13 [June 14, 2007] + Prefer PNG_USE_PNGVCRD when _MSC_VER is defined in pngconf.h + +version 1.2.19beta14 [June 16, 2007] + Fix bug with handling of 16-bit transparency, introduced in 1.2.19beta2 + +version 1.2.19beta15 [June 17, 2007] + Revised pnggccrd.c. + +version 1.2.19beta16 [June 18, 2007] + Revised pnggccrd.c again. + Updated contrib/gregbook. + Changed '#include "pnggccrd.c"' to 'include "$srcdir/pnggccrd.c"' + in configure.ac + +version 1.2.19beta17 [June 19, 2007] + Revised many of the makefiles, to set -DPNG_NO_MMX_CODE where needed + and to not use -O3 unless -DPNG_NO_MMX_CODE is also set. + +version 1.2.19beta18 [June 23, 2007] + Replaced some C++ style comments with C style comments in pnggccrd.c. + Copied optimized C code from pnggccrd.c to pngrutil.c, removed dependency + on pnggccrd.o from many makefiles. + Added sl and dylib to list of extensions be installed by Makefile.am + +version 1.2.19beta19 [June 28, 2007] + Fixed testing PNG_RGB_TO_GRAY_ERR & PNG_RGB_TO_GRAY_WARN in pngrtran.c + More cleanup of pnggccrd.c and pngvcrd.c + +version 1.2.19beta20 [June 29, 2007] + Rebuilt Makefile.in and configure using libtool-1.5.24. + Fixed typo in pnggccrd.c + +version 1.2.19beta21 [June 30, 2007] + More revision of pnggccrd.c + Added "test" target to Makefile.in and Makefile.am + +version 1.2.19beta22 [July 3, 2007] + Added info about pngrutil/pnggccrd/pngvcrd to png_get_header_version() + Fix type definition of dummy_value_a, b in pnggccrd.c + +version 1.2.19beta23 [July 10, 2007] + Revert change to type definition of dummy_value_a, b in pnggccrd.c + Make sure __PIC__ is defined in pnggccrd.c when PIC is defined. + Require gcc-4.1 or better to use PNG_HAVE_MMX_FILTER_ROW on x86_64 platforms + +version 1.2.19beta24 [July 14, 2007] + Added PNG_NO_READ_FILTER, PNG_NO_WRITE_FILTER, PNG_NO_WARNING macros. + Added contrib/pngminim to demonstrate building minimal encoder and decoder + +version 1.2.19beta25 [July 15, 2007] + Removed the new PNG_NO_READ_FILTER macro since it would make the library + unable to read valid PNG files, and filtering is at the heart of the + PNG format. + +version 1.2.19beta26 [July 16, 2007] + Changed "png_free(str)" to "png_free(png_ptr,str)" in pngrutil.c WinCE + code (Yves Piguet). This bug was introduced in libpng-1.2.14. + Updated scripts/CMakeLists.txt + Relocated a misplaced #endif in pnggccrd.c + +version 1.2.19beta27 [July 17, 2007] + Fixed incorrect stride and number of bytes copied (was 4 instead of + 6 bytes) in the cleanup loop of pnggccrd.c and pngvcrd.c for handling + the end of 48-bit interlaced rows (Glenn R-P). + +version 1.2.19beta28 [July 19, 2007] + Removed requirement for gcc-4.1 or better to use PNG_HAVE_MMX_FILTER_ROW + on x86_64 platforms + Added png_warning() in pngrutil.c for short iCCP, iTXt, sPLT, or zTXT chunks. + Revised pngtest.c so warnings are displayed regardless of PNG_NO_STDIO. + +version 1.2.19beta29 [July 20, 2007] + Fix typo in pnggccrd.c (%%eax should be %%ax in secondloop48) + +version 1.2.19beta30 [July 26, 2007] + Revised pnggccrd.c + +version 1.2.19beta31 [July 27, 2007] + Fix typos in pnggccrd.c + +version 1.0.27rc1 and 1.2.19rc1 [July 31, 2007] + Disable PNG_MMX_CODE_SUPPORTED when PNG_ASSEMBLER_CODE_SUPPORTED is off. + Enable PNG_MMX_READ_FILTER_* by default, except when gcc-3.x is being + used (they were inadvertently disabled in libpng-1.2.19beta23). + Fix some debugging statements in pnggccrd.c and pngrutil.c + Added information about disabling the MMX code in libpng documentation. + +version 1.0.27rc2 and 1.2.19rc2 [August 4, 2007] + Removed some "#if 0" blocks. + Made a global struct local in pngvcrd.c to make it thread safe. + Issue a png_error() if application attempts to transform a row tht + has not been initialized. + +version 1.0.27rc3 and 1.2.19rc3 [August 9, 2007] + Slightly revised pngvcrd.c + +version 1.0.27rc4 and 1.2.19rc4 [August 9, 2007] + Revised pnggccrd.c debugging change of rc1, which was broken. + Revised scripts/CMakeLists.txt + Change default to PNG_NO_GLOBAL_ARRAYS for MSVC. + Turn off PNG_FLAG_ROW_INIT flag when setting transforms that expand pixels. + +version 1.0.27rc5 and 1.2.19rc5 [August 10, 2007] + Fix typo (missing '"') in pnggccrd.c + Revise handling of png_strtod in recent versions of WINCE + +version 1.0.27rc6 and 1.2.19rc6 [August 15, 2007] + Fix typo (missing ',') in contrib/gregbook/readpng2.c + Undid row initialization error exit added to rc2 and rc4. + +version 1.0.27 and 1.2.19 [August 18, 2007] + Conditionally restored row initialization error exit. + +version 1.2.20beta01 [August 19, 2007] + Fixed problem with compiling pnggccrd.c on Intel-Apple platforms. + Changed png_malloc() to png_malloc_warn() in png_set_sPLT(). + Added PNG_NO_ERROR_TEXT feature, with demo in contrib/pngminim + Removed define PNG_WARN_UNINITIALIZED_ROW 1 /* 0: warning; 1: error */ + because it caused some trouble. + +version 1.2.20beta02 [August 20, 2007] + Avoid compiling pnggccrd.c on Intel-Apple platforms. + +version 1.2.20beta03 [August 20, 2007] + Added "/D PNG_NO_MMX_CODE" to the non-mmx builds of projects/visualc6 + and visualc71. + +version 1.2.20beta04 [August 21, 2007] + Revised pngvcrd.c for improved efficiency (Steve Snyder). + +version 1.2.20rc1 [August 23, 2007] + Revised pngconf.h to set PNG_NO_MMX_CODE for gcc-3.x compilers. + +version 1.2.20rc2 [August 27, 2007] + Revised scripts/CMakeLists.txt + Revised #ifdefs to ensure one and only one of pnggccrd.c, pngvcrd.c, + or part of pngrutil.c is selected. + +version 1.2.20rc3 [August 30, 2007] + Remove a little more code in pngwutil.c when PNG_NO_WRITE_FILTER is selected. + Added /D _CRT_SECURE_NO_WARNINGS to visual6c and visualc71 projects. + Compile png_mmx_support() in png.c even when PNG_NO_MMX_CODE is defined. + Restored a "superfluous" #ifdef that was removed from 1.2.20rc2 pnggccrd.c, + breaking the png_mmx_support() function. + +version 1.2.20rc4 [September 1, 2007] + Removed Intel contributions (MMX, Optimized C). + +version 1.2.20rc5 [September 2, 2007] + Restored configure and Makefile.in to rc3 and put a snippet of code in + pnggccrd.c, to ensure configure makes the same PNG_NO_MMX_CODE selection + +version 1.2.20rc6 [September 2, 2007] + Fixed bugs in scripts/CMakeLists.txt + Removed pngvcrd.c references from msvc projects. + +version 1.0.28 and 1.2.20 [September 8, 2007] + Removed "(NO READ SUPPORT)" from png_get_header_version() string. + +version 1.2.21beta1 [September 14, 2007] + Fixed various mistakes reported by George Cook and Jeff Phillips: + logical vs bitwise NOT in pngrtran.c, bug introduced in 1.2.19rc2 + 16-bit cheap transparency expansion, bug introduced in 1.2.19beta2 + errors with sizeof(unknown_chunk.name), bugs introduced in 1.2.19beta11 + <= compare with unsigned var in pngset.c, should be ==. + +version 1.2.21beta2 [September 18, 2007] + Removed some extraneous typecasts. + +version 1.2.21rc1 [September 25, 2007] + Fixed potential out-of-bounds reads in png_handle_pCAL() and + png_handle_ztXt() ("flayer" results reported by Tavis Ormandy). + +version 1.2.21rc2 [September 26, 2007] + Fixed potential out-of-bounds reads in png_handle_sCAL(), + png_handle_iTXt(), and png_push_read_tEXt(). + Remove some PNG_CONST declarations from pngwutil.c to avoid compiler warnings + Revised makefiles to update paths in libpng.pc properly. + +version 1.2.21rc3 [September 27, 2007] + Revised makefiles to update "Libs" in libpng.pc properly. + +version 1.0.29 and 1.2.21rc3 [October 4, 2007] + No changes. + +version 1.2.22beta1 [October 4, 2007] + Again, fixed logical vs bitwise NOT in pngrtran.c, bug introduced + in 1.2.19rc2 + +version 1.2.22beta2 [October 5, 2007] + Fixed string length error in pngset.c (caused crashes while decoding iCCP) + Add terminating NULL after each instance of png_strncpy(). + +version 1.2.22beta3 [October 6, 2007] + Fix two off-by-one terminating NULL after png_strncpy(). + +version 1.2.22beta4 [October 7, 2007] + Changed some 0 to '\0'. + +version 1.0.30rc1 and 1.2.22rc1 [October 8, 2007] + No changes. + +version 1.0.30 and 1.2.22 [October 13, 2007] + No changes. + +version 1.2.23beta01 [October 15, 2007] + Reduced number of invocations of png_strlen() in pngset.c. + Changed [azAZ09_] to [_abcde...89] in Makefile.am for better localization. + +version 1.2.23beta02 [October 16, 2007] + Eliminated png_strncpy() and png_strcpy() (Pierre Poissinger) + Changed $AN to $(AN) in Makefile.am. + +version 1.2.23beta03 [October 16, 2007] + Fixed off-by-one error in pngset.c + Restore statement to set last character of buffer to \0 in pngerror.c + +version 1.2.23beta04 [October 23, 2007] + Reject attempt to set all-zero cHRM values. + +version 1.2.23beta05 [October 26, 2007] + Add missing quotes in projects/visualc6, lost in version 1.2.20rc3 + +version 1.2.23rc01 [November 2, 2007] + No changes. + +version 1.2.23 [November 6, 2007] + No changes. + +version 1.2.24beta01 [November 19, 2007] + Moved misplaced test for malloc failure in png_set_sPLT(). This bug was + introduced in libpng-1.2.20beta01. + Ifdef out avg_row etc from png.h and pngwrite.c when PNG_NO_WRITE_FILTER + Do not use png_ptr->free_fn and png_ptr->mem_fn in png_destroy_read_struct() + when png_ptr is NULL (Marshall Clow). + Updated handling of symbol prefixes in Makefile.am and configure.ac (Mike + Frysinger). + +version 1.2.24beta02 [November 30, 2007] + Removed a useless test and fixed incorrect test in png_set_cHRM_fixed() + (David Hill). + +version 1.2.24rc01 [December 7, 2007] + No changes. + +version 1.2.24 [December 14, 2007] + Make sure not to redefine _BSD_SOURCE in pngconf.h + Revised gather.sh and makefile.std in contrib/pngminim to avoid compiling + unused files. + +version 1.2.25beta01 [January 7, 2008] + Fixed bug with unknown chunk handling, introduced in version 1.2.17rc2 + +version 1.2.25beta02 [January 10, 2008] + Prevent gamma from being applied twice. + +version 1.2.25rc01 [January 17, 2008] + No changes. + +version 1.2.25beta03 [January 22, 2008] + Fixed some continue-after-malloc-failure errors in pngset.c (David Hill) + Check for info_ptr == NULL in png_read_info() and png_process_data(). + Check for possible use of NULL user_png_ver[] in png_create_read_struct(). + Change "if (swidth == NULL)" to "if (sheight == NULL)" in png_handle_sCAL + (bug introduced in libpng-1.2.4/1.0.13). + Return from png_destroy_read_struct() if png_ptr_ptr is NULL. + Fix overflow of "msg" in png_decompress_chunk(). + +version 1.2.25beta04 [January 26, 2008] + Work around Coverity bug report by slightly refactoring + png_read_push_finish_row() + +version 1.2.25beta05 [January 31, 2008] + Added libpng-1.2.25beta05.tar.lzma to distribution. Get the lzma codec + from . + Added lp1225b05.7z to distribution. Get the 7-zip decoder from + from . + Fixed some broken links in the README file. + +version 1.2.25beta06 [February 6, 2008] + Refactored png_read_push_finish_row() again, trying to satisfy Coverity. + Fixed potential NULL dereference of png_ptr in png_destroy_write_struct(); + clarified potential NULL dereference of png_ptr in png_destroy_read_struct(); + fixed potential NULL dereference of info_ptr in png_handle_bKGD(); + fixed potential NULL dereference of user_png_ver[] in + png_create_write_struct_2(). (Coverity) + +version 1.2.25rc02 [February 10, 2008] + Reset png_ptr->pass in png_read_push_finish_row() before break. + Changed "pass" from png_byte to int. + +version 1.2.25 and 1.0.31 [February 18, 2008] + No changes. + +version 1.2.26beta01 [February 21, 2008] + Added missing "(" in pngmem.c. Bug introduced in libpng-1.2.2/1.0.13 + +version 1.2.26beta02 [March 12, 2008] + Refined error message returned from deflateInit2 in pngwutil.c + Check IHDR length in png_push_read_chunk() before saving it. + +version 1.2.26beta03 [March 16, 2008] + Revised contrib/gregbook to handle premature end-of-file and file + read errors correctly. + +version 1.2.26beta04 [March 18, 2008] + Free png_ptr->big_row_buf and png_ptr->prev_row before allocating + new copies in png_read_start_row(). Bug introduced in libpng-1.2.22. + +version 1.2.26beta05 [March 19, 2008] + Removed extra png_free() added in libpng-1.2.26beta04. + +version 1.2.26beta06 [March 19, 2008] + Avoid reallocating big_row_buf and prev_row when the size does not increase. + +version 1.2.26rc01 [March 26, 2008] + Ifdef out some code that is unused when interlacing is not supported. + +versions 1.0.32 and 1.2.26 [April 2, 2008] + No changes. + +version 1.2.27beta01 [April 12, 2008] + Fixed bug (introduced in libpng-1.0.5h) with handling zero-length + unknown chunks. + Added more information about png_set_keep_unknown_chunks() to the + documentation. + Reject tRNS chunk with out-of-range samples instead of masking off + the invalid high bits as done in since libpng-1.2.19beta5. + +version 1.2.27beta02 [April 13, 2008] + Revised documentation about unknown chunk and user chunk handling. + Keep tRNS chunk with out-of-range samples and issue a png_warning(). + +version 1.2.27beta03 [April 14, 2008] + Added check for NULL ptr in TURBOC version of png_free_default(). + Removed several unnecessary checks for NULL before calling png_free(). + Revised png_set_tRNS() so that calling it twice removes and invalidates + the previous call. + Revised pngtest to check for out-of-range tRNS samples. + +version 1.2.27beta04 [April 18, 2008] + Added AC_LIBTOOL_WIN32_DLL to configure.ac + Rebuilt Makefile.in, aclocal.m4, and configure with autoconf-2.62 + +version 1.2.27beta05 [April 19, 2008] + Added MAINTAINERCLEANFILES variable to Makefile.am + +version 1.2.27beta06 [April 21, 2008] + Avoid changing color_type from GRAY to RGB by + png_set_expand_gray_1_2_4_to_8(). + +version 1.2.27rc01 [April 23, 2008] + Fix broken URL for rfc2083 in png.5 and libpng-*.txt + +version 1.0.33 and 1.2.27 [April 30, 2008] + No changes. + +version 1.0.34 and 1.2.28 [April 30, 2008] + Rebuilt Makefile.in, aclocal.m4, and configure with autoconf-2.61 + due to backward incompatibilities. + Removed a stray object file from contrib/gregbook + +version 1.2.29beta01 [May 1, 2008] + Removed some stray *.diff and *.orig files + +version 1.2.29beta02 [May 1, 2008] + Reverted Makefile.in, aclocal.m4, and configure to the libpng-1.2.26 + versions. + +version 1.2.29beta03 [May 2, 2008] + Added --force to autogen libtoolize options and --force-missing to + automake options. + Changed $(ECHO) to echo in Makefile.am and Makefile.in + Updated all configure files to autoconf-2.62 + Comment out pnggcrd.c code with #ifdef/#endif if using MSC_VER + +version 1.2.29rc01 [May 4, 2008] + No changes. + +version 1.0.35 and 1.2.29 [May 8, 2008] + No changes. + +version 1.0.37 [May 9, 2008] + Updated Makefile.in and configure (omitted version 1.0.36). + +version 1.2.30beta01 [May 29, 2008] + Updated libpng.pc-configure.in and libpng-config.in per debian bug reports. + +version 1.2.30beta02 [June 25, 2008] + Restored png_flush(png_ptr) at the end of png_write_end(), that was + removed from libpng-1.0.9beta03. + +version 1.2.30beta03 [July 6, 2008] + Merged some cosmetic whitespace changes from libpng-1.4.0beta19. + Inline call of png_get_uint_32() in png_get_uint_31(), as in 1.4.0beta19. + Added demo of decoding vpAg and sTER chunks to pngtest.c, from 1.4.0beta19. + Changed PNGMAJ from 0 to 12 in makefile.darwin, which does not like 0. + Added new private function png_read_chunk_header() from 1.4.0beta19. + Merge reading of chunk length and chunk type into a single 8-byte read. + Merge writing of chunk length and chunk type into a single 8-byte write. + +version 1.2.30beta04 [July 10, 2008] + Merged more cosmetic whitespace changes from libpng-1.4.0beta19. + +version 1.0.38rc01, 1.2.30rc01 [July 18, 2008] + No changes. + +version 1.0.38rc02, 1.2.30rc02 [July 21, 2008] + Moved local array "chunkdata" from pngrutil.c to the png_struct, so + it will be freed by png_read_destroy() in case of a read error (Kurt + Christensen). + +version 1.0.38rc03, 1.2.30rc03 [July 21, 2008] + Changed "purpose" and "buffer" to png_ptr->chunkdata to avoid memory leaking. + +version 1.0.38rc04, 1.2.30rc04 [July 22, 2008] + Changed "chunkdata = NULL" to "png_ptr->chunkdata = NULL" several places in + png_decompress_chunk(). + +version 1.0.38rc05, 1.2.30rc05 [July 25, 2008] + Changed all remaining "chunkdata" to "png_ptr->chunkdata" in + png_decompress_chunk() and remove chunkdata from parameter list. + Put a call to png_check_chunk_name() in png_read_chunk_header(). + Revised png_check_chunk_name() to reject a name with a lowercase 3rd byte. + Removed two calls to png_check_chunk_name() occuring later in the process. + +version 1.0.38rc06, 1.2.30rc06 [July 29, 2008] + Added a call to png_check_chunk_name() in pngpread.c + Reverted png_check_chunk_name() to accept a name with a lowercase 3rd byte. + +version 1.0.38r07, 1.2.30r07 [August 2, 2008] + Changed "-Wall" to "-W -Wall" in the CFLAGS in all makefiles (Cosmin Truta) + Declared png_ptr "volatile" in pngread.c and pngwrite.c to avoid warnings. + Added code in pngset.c to quiet compiler warnings. + Updated contrib/visupng/cexcept.h to version 2.0.1 + Relocated a misplaced "#endif /* PNG_NO_WRITE_FILTER */" in pngwutil.c + +version 1.0.38r08, 1.2.30r08 [August 2, 2008] + Enclose "volatile" declarations in #ifdef PNG_SETJMP_SUPPORTED (Cosmin). + +version 1.0.38, 1.2.30 [August 14, 2008] + No changes. + +version 1.2.31rc01 [August 19, 2008] + Removed extra crc check at the end of png_handle_cHRM(). Bug introduced + in libpng-1.2.30beta03 (Heiko Nitzsche). + +version 1.2.31rc02 [August 19, 2008] + Added PNG_WRITE_FLUSH_SUPPORTED block around new png_flush() call. + +version 1.2.31rc03 [August 19, 2008] + Added PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED block, off by default, around + new png_flush(). + +version 1.0.39, 1.2.31 [August 21, 2008] + No changes. + +version 1.2.32beta01 [September 6, 2008] + Shortened tIME_string to 29 bytes in pngtest.c (bug introduced in + libpng-1.2.22). + Fixed off-by-one error introduced in png_push_read_zTXt() function in + libpng-1.2.30beta04/pngpread.c (Harald van Dijk) + These bugs have been given the vulnerability id CVE-2008-3964. + +version 1.0.40, 1.2.32 [September 18, 2008] + No changes. + +version 1.2.33beta01 [October 6, 2008] + Revised makefile.darwin to fix shared library numbering. + Change png_set_gray_1_2_4_to_8() to png_set_expand_gray_1_2_4_to_8() + in example.c (debian bug report) + +version 1.2.33rc01 [October 15, 2008] + No changes. + +version 1.0.41rc01, version 1.2.33rc02 [October 23, 2008] + Changed remaining "key" to "png_ptr->chunkdata" in png_handle_tEXt() + to avoid memory leak after memory failure while reading tEXt chunk.` + +version 1.2.33 [October 31, 2008] + No changes. + +version 1.2.34beta01 [November 27, 2008] + Revised png_warning() to write its message on standard output by default + when warning_fn is NULL. This was the behavior prior to libpng-1.2.9beta9. + Fixed string vs pointer-to-string error in png_check_keyword(). + Added png_check_cHRM_fixed() in png.c and moved checking from pngget.c, + pngrutil.c, and pngwrite.c, and eliminated floating point cHRM checking. + Added check for zero-area RGB cHRM triangle in png_check_cHRM_fixed(). + In png_check_cHRM_fixed(), ensure white_y is > 0, and removed redundant + check for all-zero coordinates that is detected by the triangle check. + Revised png_warning() to write its message on standard output by default + when warning_fn is NULL. + +version 1.2.34beta02 [November 28, 2008] + Corrected off-by-one error in bKGD validity check in png_write_bKGD() + and in png_handle_bKGD(). + +version 1.2.34beta03 [December 1, 2008] + Revised bKGD validity check to use >= x instead of > x + 1 + Merged with png_debug from libpng-1.4.0 to remove newlines. + +version 1.2.34beta04 [December 2, 2008] + More merging with png_debug from libpng-1.4.0 to remove newlines. + +version 1.2.34beta05 [December 5, 2008] + Removed redundant check for key==NULL before calling png_check_keyword() + to ensure that new_key gets initialized and removed extra warning + (Arvan Pritchard). + +version 1.2.34beta06 [December 9, 2008] + In png_write_png(), respect the placement of the filler bytes in an earlier + call to png_set_filler() (Jim Barry). + +version 1.2.34beta07 [December 9, 2008] + Undid previous change and added PNG_TRANSFORM_STRIP_FILLER_BEFORE and + PNG_TRANSFORM_STRIP_FILLER_AFTER conditionals and deprecated + PNG_TRANSFORM_STRIP_FILLER (Jim Barry). + +version 1.0.42rc01, 1.2.34rc01 [December 11, 2008] + No changes. + +version 1.0.42, 1.2.34 [December 18, 2008] + No changes. + +version 1.2.35beta01 [February 4, 2009] + Zero out some arrays of pointers after png_malloc(). (Tavis Ormandy) + +version 1.2.35beta02 [February 4, 2009] + Zero out more arrays of pointers after png_malloc(). + +version 1.2.35beta03 [February 5, 2009] + Use png_memset() instead of a loop to intialize pointers. We realize + this will not work on platforms where the NULL pointer is not all zeroes. + +version 1.2.35rc01 [February 11, 2009] + No changes. + +version 1.2.35rc02 [February 12, 2009] + Fix typo in new png_memset call in pngset.c (png_color should be png_charp) + +version 1.0.43 and 1.2.35 [February 14, 2009] + No changes. + +version 1.2.36beta01 [February 28, 2009] + Revised comments in png_set_read_fn() and png_set_write_fn(). + Revised order of #ifdef's and indentation in png_debug definitions of png.h + bug introduced in libpng-1.2.34. + +version 1.2.36beta02 [March 21, 2009] + Use png_memset() after png_malloc() of big_row_buf when reading an + interlaced file, to avoid a possible UMR. + Undid recent revision of PNG_NO_STDIO version of png_write_flush(). Users + having trouble with fflush() can build with PNG_NO_WRITE_FLUSH defined. + Revised libpng*.txt documentation about use of png_write_flush(). + Removed fflush() from pngtest.c. + Added "#define PNG_NO_WRITE_FLUSH" to contrib/pngminim/encoder/pngusr.h + +version 1.2.36beta03 [March 27, 2009] + Relocated misplaced PNG_1_0_X define in png.h that caused the prototype + for png_set_strip_error_numbers() to be omitted from PNG_NO_ASSEMBLER_CODE + builds. This bug was introduced in libpng-1.2.15beta4. + Added a section on differences between 1.0.x and 1.2.x to libpng.3/libpng.txt + +version 1.2.36beta04 [April 5, 2009] + Fixed potential memory leak of "new_name" in png_write_iCCP() (Ralph Giles) + +version 1.2.36beta05 [April 24, 2009] + Added "ifndef PNG_SKIP_SETJMP_CHECK" block in pngconf.h to allow + application code writers to bypass the check for multiple inclusion + of setjmp.h when they know that it is safe to ignore the situation. + Made some cosmetic changes to whitespace in pngtest output. + Renamed "user_chunk_data" to "my_user_chunk_data" in pngtest.c to suppress + "shadowed declaration" warning from gcc-4.3.3. + Renamed "gamma" to "png_gamma" in pngset.c to avoid "shadowed declaration" + warning about a global "gamma" variable in math.h on some platforms. + +version 1.2.36rc01 [April 30, 2009] + No changes. + +version 1.0.44 and 1.2.36 [May 7, 2009] + No changes. + +version 1.2.37beta01 [May 14, 2009] + Fixed inconsistency in pngrutil.c, introduced in libpng-1.2.36. The + memset() was using "png_ptr->rowbytes" instead of "row_bytes", which + the corresponding png_malloc() uses (Joe Drew). + Clarified usage of sig_bit versus sig_bit_p in example.c (Vincent Torri) + Updated some of the makefiles in the scripts directory (merged with + those in libpng-1.4.0beta57). + +version 1.2.37beta02 [May 19, 2009] + Fixed typo in libpng documentation (FILTER_AVE should be FILTER_AVG) + Relocated misplaced #endif in pngwrite.c, sCAL chunk handler. + Conditionally compile png_read_finish_row() which is not used by + progressive readers. + Added contrib/pngminim/preader to demonstrate building minimal progressive + decoder, based on contrib/gregbook with embedded libpng and zlib. + +version 1.2.37beta03 [May 20, 2009] + In contrib/pngminim/*, renamed "makefile.std" to "makefile", since there + is only one makefile in those directories, and revised the README files + accordingly. + Reformated sources in libpng style (3-space indentation, comment format) + +version 1.2.37rc01 [May 27, 2009] + No changes. + +versions 1.2.37 and 1.0.45 [June 4, 2009] + Reformatted several remaining "else statement;" and "if () statement;" into + two lines. + Added "#define PNG_NO_WRITE_SWAP" to contrib/pngminim/encoder/pngusr.h + and "define PNG_NO_READ_SWAP" to decoder/pngusr.h and preader/pngusr.h + Added sections about the git repository and our coding style to the + documentation (merged from libpng-1.4.0beta62) + Added a section to the libpng documentation about using png_get_io_ptr() + in configure scripts to detect the presence of libpng. + +version 1.2.38beta01 [June 17, 2009] + Revised libpng*.txt and libpng.3 to mention calling png_set_IHDR() + multiple times and to specify the sample order in the tRNS chunk, + because the ISO PNG specification has a typo in the tRNS table. + Changed several PNG_UNKNOWN_CHUNK_SUPPORTED to + PNG_HANDLE_AS_UNKNOWN_SUPPORTED, to make the png_set_keep mechanism + available for ignoring known chunks even when not saving unknown chunks. + Adopted preference for consistent use of "#ifdef" and "#ifndef" versus + "#if defined()" and "if !defined()" where possible. + Added PNG_NO_HANDLE_AS_UNKNOWN in the PNG_LEGACY_SUPPORTED block of + pngconf.h, and moved the various unknown chunk macro definitions + outside of the PNG_READ|WRITE_ANCILLARY_CHUNK_SUPPORTED blocks. + +version 1.0.46 [June 18, 2009] + Removed some editing cruft from scripts/libpng.pc.in and some makefiles. + +version 1.2.38rc01 [June 24, 2009] + No changes. + +version 1.2.38rc02 [June 29, 2009] + Added a reference to the libpng license in each source file. + +version 1.2.38rc03 [July 11, 2009] + Revised references to the libpng license in pngconf.h and contrib/visupng + source files. + Rebuilt configure scripts with autoconf-2.63. + +version 1.0.47 and 1.2.38 [July 16, 2009] + No changes. + +version 1.2.39beta01 [July 25, 2009] + Added a prototype for png_64bit_product() in png.c + +version 1.2.39beta02 [July 27, 2009] + Avoid a possible NULL dereference in debug build, in png_set_text_2(). + (bug introduced in libpng-0.95, discovered by Evan Rouault) + +version 1.2.39beta03 [July 29, 2009] + Relocated new png_64_bit_product() prototype into png.h + Expanded the information about prototypes in the libpng style section of + the documentation. + Rebuilt configure scripts with autoconf-2.64. + +version 1.2.39beta04 [August 1, 2009] + Replaced *.tar.lzma with *.txz in distribution. Get the xz codec + from . + +version 1.2.39beta05 [August 1, 2009] + Reject attempt to write iCCP chunk with negative embedded profile length + (JD Chen) + +version 1.2.39c01 [August 6, 2009] + No changes. + +version 1.2.39 and 1.0.48 [August 13, 2009] + No changes. + +version 1.2.40beta01 [August 20, 2009] + Removed an extra png_debug() recently added to png_write_find_filter(). + Fixed incorrect #ifdef in pngset.c regarding unknown chunk support. + +version 1.2.40rc01 [September 2, 2009] + Various bugfixes and improvements to CMakeLists.txt (Philip Lowman) + +version 1.2.40 and 1.0.49 [September 10, 2009] + No changes. + +Send comments/corrections/commendations to png-mng-implement at lists.sf.net +(subscription required; visit +https://lists.sourceforge.net/lists/listinfo/png-mng-implement +to subscribe) +or to glennrp at users.sourceforge.net + +Glenn R-P +*/ diff --git a/third_party/windows/fltk-1.1.10/png/CMakeLists.txt b/third_party/windows/fltk-1.1.10/png/CMakeLists.txt new file mode 100644 index 0000000..8f06f84 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/CMakeLists.txt @@ -0,0 +1,30 @@ +PROJECT(FLTKPNG) +INCLUDE_REGULAR_EXPRESSION("^png.*$") + +INCLUDE_DIRECTORIES(${FLTKZLIB_SOURCE_DIR}) + +IF(ZLIB_INCLUDE_DIR) + INCLUDE_DIRECTORIES(${ZLIB_INCLUDE_DIR}) +ENDIF(ZLIB_INCLUDE_DIR) + +INCLUDE_DIRECTORIES(${FLTKPNG_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${FLTKPNG_BINARY_DIR}) + +# source files for png +SET(PNG_SRCS + pngget.c pngrio.c pngwrite.c + png.c pngmem.c pngrtran.c pngtrans.c pngwtran.c + pngerror.c pngpread.c pngrutil.c pngwutil.c + pngread.c pngset.c pngwio.c + ) + +ADD_LIBRARY(fltk_png ${PNG_SRCS}) +INSTALL_TARGETS(/lib fltk_png) + + +IF(UNIX) + TARGET_LINK_LIBRARIES(fltk_png ${FLTK_ZLIB_LIBRARIES} -lm) +ELSE(UNIX) + TARGET_LINK_LIBRARIES(fltk_png ${FLTK_ZLIB_LIBRARIES}) +ENDIF(UNIX) + diff --git a/third_party/windows/fltk-1.1.10/png/INSTALL b/third_party/windows/fltk-1.1.10/png/INSTALL new file mode 100644 index 0000000..f1948ab --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/INSTALL @@ -0,0 +1,199 @@ + +Installing libpng version 1.2.40 - September 10, 2009 + +On Unix/Linux and similar systems, you can simply type + + ./configure [--prefix=/path] + make check + make install + +and ignore the rest of this document. + +If configure does not work on your system and you have a reasonably +up-to-date set of tools, running ./autogen.sh before running ./configure +may fix the problem. You can also run the individual commands in +autogen.sh with the --force option, if supported by your version of +the tools. If you run 'libtoolize --force', though, this will replace +the distributed, patched, version of ltmain.sh with an unpatched version +and your shared library builds may fail to produce libraries with the +correct version numbers. + +Instead, you can use one of the custom-built makefiles in the +"scripts" directory + + cp scripts/makefile.system makefile + make test + make install + +Or you can use one of the "projects" in the "projects" directory. + +If you want to use "cmake" (see www.cmake.org), copy CMakeLists.txt +from the "scripts" directory to this directory and type + + cmake . [-DPNG_MMX=YES] -DCMAKE_INSTALL_PREFIX=/path + make + make install + +Before installing libpng, you must first install zlib, if it +is not already on your system. zlib can usually be found +wherever you got libpng. zlib can be placed in another directory, +at the same level as libpng. + +If your system already has a preinstalled zlib you will still need +to have access to the zlib.h and zconf.h include files that +correspond to the version of zlib that's installed. + +You can rename the directories that you downloaded (they +might be called "libpng-1.2.40" or "lpng109" and "zlib-1.2.1" +or "zlib121") so that you have directories called "zlib" and "libpng". + +Your directory structure should look like this: + + .. (the parent directory) + libpng (this directory) + INSTALL (this file) + README + *.h + *.c + contrib + gregbook + pngminus + pngsuite + visupng + projects + beos + c5builder (Borland) + visualc6 (msvc) + netware.txt + wince.txt + scripts + makefile.* + pngtest.png + etc. + zlib + README + *.h + *.c + contrib + etc. + +If the line endings in the files look funny, you may wish to get the other +distribution of libpng. It is available in both tar.gz (UNIX style line +endings) and zip (DOS style line endings) formats. + +If you are building libpng with MSVC, you can enter the +libpng projects\visualc6 directory and follow the instructions in +projects\visualc6\README.txt. + +You can build libpng for WindowsCE by downloading and installing +the projects\wince directory as instructed in the projects\wince.txt file, and +then following the instructions in the README* files. Similarly, you can +build libpng for Netware or Beos as instructed in projects\netware.txt +or projects\beos. + +Else enter the zlib directory and follow the instructions in zlib/README, +then come back here and run "configure" or choose the appropriate +makefile.sys in the scripts directory. + +The files that are presently available in the scripts directory +include + + CMakeLists.txt => "cmake" script + makefile.std => Generic UNIX makefile (cc, creates static libpng.a) + makefile.elf => Linux/ELF makefile symbol versioning, + gcc, creates libpng12.so.0.1.2.40) + makefile.linux => Linux/ELF makefile + (gcc, creates libpng12.so.0.1.2.40) + makefile.gcc => Generic makefile (gcc, creates static libpng.a) + makefile.knr => Archaic UNIX Makefile that converts files with + ansi2knr (Requires ansi2knr.c from + ftp://ftp.cs.wisc.edu/ghost) + makefile.aix => AIX/gcc makefile + makefile.cygwin => Cygwin/gcc makefile + makefile.darwin => Darwin makefile, can use on MacosX + makefile.dec => DEC Alpha UNIX makefile + makefile.freebsd => FreeBSD makefile + makefile.hpgcc => HPUX makefile using gcc + makefile.hpux => HPUX (10.20 and 11.00) makefile + makefile.hp64 => HPUX (10.20 and 11.00) makefile, 64-bit + makefile.ibmc => IBM C/C++ version 3.x for Win32 and OS/2 (static) + makefile.intel => Intel C/C++ version 4.0 and later + libpng.icc => Project file for IBM VisualAge/C++ version 4.0 or later + makefile.netbsd => NetBSD/cc makefile, uses PNGGCCRD, makes libpng.so. + makefile.ne12bsd => NetBSD/cc makefile, uses PNGGCCRD, + makes libpng12.so + makefile.openbsd => OpenBSD makefile + makefile.sgi => Silicon Graphics IRIX makefile (cc, creates static lib) + makefile.sggcc => Silicon Graphics (gcc, + creates libpng12.so.0.1.2.40) + makefile.sunos => Sun makefile + makefile.solaris => Solaris 2.X makefile (gcc, + creates libpng12.so.0.1.2.40) + makefile.solaris-x86 => Solaris/intelMMX 2.X makefile (gcc, + creates libpng12.so.0.1.2.40) + makefile.so9 => Solaris 9 makefile (gcc, + creates libpng12.so.0.1.2.40) + makefile.32sunu => Sun Ultra 32-bit makefile + makefile.64sunu => Sun Ultra 64-bit makefile + makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc + makefile.mips => MIPS makefile + makefile.acorn => Acorn makefile + makefile.amiga => Amiga makefile + smakefile.ppc => AMIGA smakefile for SAS C V6.58/7.00 PPC compiler + (Requires SCOPTIONS, copied from scripts/SCOPTIONS.ppc) + makefile.atari => Atari makefile + makefile.beos => BEOS makefile for X86 + makefile.bor => Borland makefile (uses bcc) + makefile.bc32 => 32-bit Borland C++ (all modules compiled in C mode) + makefile.tc3 => Turbo C 3.0 makefile + makefile.dj2 => DJGPP 2 makefile + makefile.msc => Microsoft C makefile + makefile.vcwin32 => makefile for Microsoft Visual C++ 4.0 and later + makefile.os2 => OS/2 Makefile (gcc and emx, requires pngos2.def) + pngos2.def => OS/2 module definition file used by makefile.os2 + makefile.watcom => Watcom 10a+ Makefile, 32-bit flat memory model + makevms.com => VMS build script + descrip.mms => VMS makefile for MMS or MMK + SCOPTIONS.ppc => Used with smakefile.ppc + +Copy the file (or files) that you need from the +scripts directory into this directory, for example + + MSDOS example: copy scripts\makefile.msc makefile + UNIX example: cp scripts/makefile.std makefile + +Read the makefile to see if you need to change any source or +target directories to match your preferences. + +Then read pngconf.h to see if you want to make any configuration +changes. + +Then just run "make" which will create the libpng library in +this directory and "make test" which will run a quick test that reads +the "pngtest.png" file and writes a "pngout.png" file that should be +identical to it. Look for "9782 zero samples" in the output of the +test. For more confidence, you can run another test by typing +"pngtest pngnow.png" and looking for "289 zero samples" in the output. +Also, you can run "pngtest -m contrib/pngsuite/*.png" and compare +your output with the result shown in contrib/pngsuite/README. + +Most of the makefiles will allow you to run "make install" to +put the library in its final resting place (if you want to +do that, run "make install" in the zlib directory first if necessary). +Some also allow you to run "make test-installed" after you have +run "make install". + +If you encounter a compiler error message complaining about the +lines + __png.h__ already includes setjmp.h; + __dont__ include it again.; +This means you have compiled another module that includes setjmp.h, +which is hazardous because the two modules might not include exactly +the same setjmp.h. If you are sure that you know what you are doing +and that they are exactly the same, then you can comment out or +delete the two lines. Better yet, use the cexcept interface +instead, as demonstrated in contrib/visupng of the libpng distribution. + +Further information can be found in the README and libpng.txt +files, in the individual makefiles, in png.h, and the manual pages +libpng.3 and png.5. diff --git a/third_party/windows/fltk-1.1.10/png/KNOWNBUG b/third_party/windows/fltk-1.1.10/png/KNOWNBUG new file mode 100644 index 0000000..4078d2d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/KNOWNBUG @@ -0,0 +1,22 @@ + +Known bugs in libpng version 1.2.40 + +1. February 23, 2006: The custom makefiles don't build libpng with -lz. + + STATUS: This is a subject of debate. The change will probably be made + as a part of a major overhaul of the makefiles in libpng version 1.4.0. + +2. February 24, 2006: The Makefile generated by the "configure" script + fails to install symbolic links + libpng12.so => libpng12.so.0.1.2.9betaN + that are generated by the custom makefiles. + +3. September 4, 2007: There is a report that pngtest crashes on MacOS 10. + + STATUS: workarounds are + 1) Compile without optimization (crashes are observed with + -arch i386 and -O2 or -O3, using gcc-4.0.1). + 2) Compile pngtest.c with PNG_DEBUG defined (the bug goes away if + you try to look at it). + 3) Ignore the crash. The library itself seems to be OK. + diff --git a/third_party/windows/fltk-1.1.10/png/LICENSE b/third_party/windows/fltk-1.1.10/png/LICENSE new file mode 100644 index 0000000..3e832a8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/LICENSE @@ -0,0 +1,111 @@ + +This copy of the libpng notices is provided for your convenience. In case of +any discrepancy between this copy and the notices in the file png.h that is +included in the libpng distribution, the latter shall prevail. + +COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: + +If you modify libpng you may insert additional notices immediately following +this sentence. + +This code is released under the libpng license. + +libpng versions 1.2.6, August 15, 2004, through 1.2.40, September 10, 2009, are +Copyright (c) 2004, 2006-2009 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.2.5 +with the following individual added to the list of Contributing Authors + + Cosmin Truta + +libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are +Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.0.6 +with the following individuals added to the list of Contributing Authors + + Simon-Pierre Cadieux + Eric S. Raymond + Gilles Vollant + +and with the following additions to the disclaimer: + + There is no warranty against interference with your enjoyment of the + library or against infringement. There is no warranty that our + efforts or the library will fulfill any of your particular purposes + or needs. This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and effort is with + the user. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-0.96, +with the following individuals added to the list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996, 1997 Andreas Dilger +Distributed according to the same disclaimer and license as libpng-0.88, +with the following individuals added to the list of Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing Authors +and Group 42, Inc. disclaim all warranties, expressed or implied, +including, without limitation, the warranties of merchantability and of +fitness for any purpose. The Contributing Authors and Group 42, Inc. +assume no liability for direct, indirect, incidental, special, exemplary, +or consequential damages, which may result from the use of the PNG +Reference Library, even if advised of the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + +1. The origin of this source code must not be misrepresented. + +2. Altered versions must be plainly marked as such and must not + be misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from any + source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, without +fee, and encourage the use of this source code as a component to +supporting the PNG file format in commercial products. If you use this +source code in a product, acknowledgment is not required but would be +appreciated. + + +A "png_get_copyright" function is available, for convenient use in "about" +boxes and the like: + + printf("%s",png_get_copyright(NULL)); + +Also, the PNG logo (in PNG format, of course) is supplied in the +files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). + +Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a +certification mark of the Open Source Initiative. + +Glenn Randers-Pehrson +glennrp at users.sourceforge.net +September 10, 2009 diff --git a/third_party/windows/fltk-1.1.10/png/Makefile b/third_party/windows/fltk-1.1.10/png/Makefile new file mode 100644 index 0000000..579eb99 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/Makefile @@ -0,0 +1,107 @@ +# +# "$Id: Makefile 6638 2009-01-18 19:33:16Z AlbrechtS $" +# +# PNG library makefile for the Fast Light Toolkit (FLTK). +# +# Copyright 1997-2009 by Easy Software Products. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems to "fltk-bugs@fltk.org". +# + +include ../makeinclude + +# +# Object files... +# + +OBJS = png.o pngset.o pngget.o pngrutil.o pngtrans.o pngwutil.o \ + pngread.o pngrio.o pngwio.o pngwrite.o pngrtran.o \ + pngwtran.o pngmem.o pngerror.o pngpread.o + +LIBPNG = ../lib/libfltk_png$(LIBEXT) + + +# +# Make all of the targets... +# + +all: $(LIBPNG) + + +# +# Clean all of the targets and object files... +# + +clean: + $(RM) $(OBJS) + $(RM) $(LIBPNG) + + +# +# Install everything... +# + +install: $(LIBPNG) + echo "Installing libfltk_png$(LIBEXT) in $(libdir)..." + -$(INSTALL_DIR) $(DESTDIR)$(libdir) + $(INSTALL_LIB) $(LIBPNG) $(DESTDIR)$(libdir) + $(RANLIB) $(DESTDIR)$(libdir)/libfltk_png$(LIBEXT) + echo "Installing png headers in $(includedir)/FL/images..." + -$(INSTALL_DIR) $(DESTDIR)$(includedir)/FL/images + $(INSTALL_DATA) png.h $(DESTDIR)$(includedir)/FL/images + $(INSTALL_DATA) pngconf.h $(DESTDIR)$(includedir)/FL/images + + +# +# Uninstall everything... +# + +uninstall: + echo "Uninstalling libfltk_png$(LIBEXT) in $(libdir)..." + $(RM) $(DESTDIR)$(libdir)/libfltk_png$(LIBEXT) + echo "Uninstalling png headers in $(includedir)/FL/images..." + $(RM) $(DESTDIR)$(includedir)/FL/images/png.h + $(RM) $(DESTDIR)$(includedir)/FL/images/pngconf.h + + +# +# libfltk_png.a +# + +$(LIBPNG): $(OBJS) + echo Archiving $@... + $(RM) $@ + $(LIBCOMMAND) $@ $(OBJS) + $(RANLIB) $@ + + +# +# Make dependencies... +# + +depend: $(OBJS:.o=.c) + makedepend -Y -I.. -f makedepend $(OBJS:.o=.c) + +include makedepend + +$(OBJS): ../makeinclude + + +# +# End of "$Id: Makefile 6638 2009-01-18 19:33:16Z AlbrechtS $". +# diff --git a/third_party/windows/fltk-1.1.10/png/README b/third_party/windows/fltk-1.1.10/png/README new file mode 100644 index 0000000..6666b31 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/README @@ -0,0 +1,267 @@ +README for libpng version 1.2.40 - September 10, 2009 (shared library 12.0) +See the note about version numbers near the top of png.h + +See INSTALL for instructions on how to install libpng. + +Libpng comes in several distribution formats. Get libpng-*.tar.gz, +libpng-*.tar.lzma, or libpng-*.tar.bz2 if you want UNIX-style line +endings in the text files, or lpng*.7z or lpng*.zip if you want DOS-style +line endings. You can get UNIX-style line endings from the *.zip file +by using "unzip -a" but there seems to be no simple way to recover +UNIX-style line endings from the *.7z file. The *.tar.lzma file is +recommended for *NIX users instead. + +Version 0.89 was the first official release of libpng. Don't let the +fact that it's the first release fool you. The libpng library has been in +extensive use and testing since mid-1995. By late 1997 it had +finally gotten to the stage where there hadn't been significant +changes to the API in some time, and people have a bad feeling about +libraries with versions < 1.0. Version 1.0.0 was released in +March 1998. + +**** +Note that some of the changes to the png_info structure render this +version of the library binary incompatible with libpng-0.89 or +earlier versions if you are using a shared library. The type of the +"filler" parameter for png_set_filler() has changed from png_byte to +png_uint_32, which will affect shared-library applications that use +this function. + +To avoid problems with changes to the internals of png_info_struct, +new APIs have been made available in 0.95 to avoid direct application +access to info_ptr. These functions are the png_set_ and +png_get_ functions. These functions should be used when +accessing/storing the info_struct data, rather than manipulating it +directly, to avoid such problems in the future. + +It is important to note that the APIs do not make current programs +that access the info struct directly incompatible with the new +library. However, it is strongly suggested that new programs use +the new APIs (as shown in example.c and pngtest.c), and older programs +be converted to the new format, to facilitate upgrades in the future. +**** + +Additions since 0.90 include the ability to compile libpng as a +Windows DLL, and new APIs for accessing data in the info struct. +Experimental functions include the ability to set weighting and cost +factors for row filter selection, direct reads of integers from buffers +on big-endian processors that support misaligned data access, faster +methods of doing alpha composition, and more accurate 16->8 bit color +conversion. + +The additions since 0.89 include the ability to read from a PNG stream +which has had some (or all) of the signature bytes read by the calling +application. This also allows the reading of embedded PNG streams that +do not have the PNG file signature. As well, it is now possible to set +the library action on the detection of chunk CRC errors. It is possible +to set different actions based on whether the CRC error occurred in a +critical or an ancillary chunk. + +The changes made to the library, and bugs fixed are based on discussions +on the png-mng-implement mailing list +and not on material submitted privately to Guy, Andreas, or Glenn. They will +forward any good suggestions to the list. + +For a detailed description on using libpng, read libpng.txt. For +examples of libpng in a program, see example.c and pngtest.c. For usage +information and restrictions (what little they are) on libpng, see +png.h. For a description on using zlib (the compression library used by +libpng) and zlib's restrictions, see zlib.h + +I have included a general makefile, as well as several machine and +compiler specific ones, but you may have to modify one for your own needs. + +You should use zlib 1.0.4 or later to run this, but it MAY work with +versions as old as zlib 0.95. Even so, there are bugs in older zlib +versions which can cause the output of invalid compression streams for +some images. You will definitely need zlib 1.0.4 or later if you are +taking advantage of the MS-DOS "far" structure allocation for the small +and medium memory models. You should also note that zlib is a +compression library that is useful for more things than just PNG files. +You can use zlib as a drop-in replacement for fread() and fwrite() if +you are so inclined. + +zlib should be available at the same place that libpng is, or at +ftp://ftp.simplesystems.org/pub/png/src/ + +You may also want a copy of the PNG specification. It is available +as an RFC, a W3C Recommendation, and an ISO/IEC Standard. You can find +these at http://www.libpng.org/pub/png/pngdocs.html + +This code is currently being archived at libpng.sf.net in the +[DOWNLOAD] area, and on CompuServe, Lib 20 (PNG SUPPORT) +at GO GRAPHSUP. If you can't find it in any of those places, +e-mail me, and I'll help you find it. + +If you have any code changes, requests, problems, etc., please e-mail +them to me. Also, I'd appreciate any make files or project files, +and any modifications you needed to make to get libpng to compile, +along with a #define variable to tell what compiler/system you are on. +If you needed to add transformations to libpng, or wish libpng would +provide the image in a different way, drop me a note (and code, if +possible), so I can consider supporting the transformation. +Finally, if you get any warning messages when compiling libpng +(note: not zlib), and they are easy to fix, I'd appreciate the +fix. Please mention "libpng" somewhere in the subject line. Thanks. + +This release was created and will be supported by myself (of course +based in a large way on Guy's and Andreas' earlier work), and the PNG group. + +Send comments/corrections/commendations to png-mng-implement at lists.sf.net +(subscription required; visit +https://lists.sourceforge.net/lists/listinfo/png-mng-implement +to subscribe) or to glennrp at users.sourceforge.net + +You can't reach Guy, the original libpng author, at the addresses +given in previous versions of this document. He and Andreas will read mail +addressed to the png-mng-implement list, however. + +Please do not send general questions about PNG. Send them to +the (png-mng-misc at lists.sourceforge.net, subscription required, visit +https://lists.sourceforge.net/lists/listinfo/png-mng-implement to subscribe) +On the other hand, +please do not send libpng questions to that address, send them to me +or to the png-mng-implement list. I'll +get them in the end anyway. If you have a question about something +in the PNG specification that is related to using libpng, send it +to me. Send me any questions that start with "I was using libpng, +and ...". If in doubt, send questions to me. I'll bounce them +to others, if necessary. + +Please do not send suggestions on how to change PNG. We have +been discussing PNG for twelve years now, and it is official and +finished. If you have suggestions for libpng, however, I'll +gladly listen. Even if your suggestion is not used immediately, +it may be used later. + +Files in this distribution: + + ANNOUNCE => Announcement of this version, with recent changes + CHANGES => Description of changes between libpng versions + KNOWNBUG => List of known bugs and deficiencies + LICENSE => License to use and redistribute libpng + README => This file + TODO => Things not implemented in the current library + Y2KINFO => Statement of Y2K compliance + example.c => Example code for using libpng functions + libpng-*-*-diff.txt => Diff from previous release + libpng.3 => manual page for libpng (includes libpng.txt) + libpng.txt => Description of libpng and its functions + libpngpf.3 => manual page for libpng's private functions + png.5 => manual page for the PNG format + png.c => Basic interface functions common to library + png.h => Library function and interface declarations + pngconf.h => System specific library configuration + pngerror.c => Error/warning message I/O functions + pngget.c => Functions for retrieving info from struct + pngmem.c => Memory handling functions + pngbar.png => PNG logo, 88x31 + pngnow.png => PNG logo, 98x31 + pngpread.c => Progressive reading functions + pngread.c => Read data/helper high-level functions + pngrio.c => Lowest-level data read I/O functions + pngrtran.c => Read data transformation functions + pngrutil.c => Read data utility functions + pngset.c => Functions for storing data into the info_struct + pngtest.c => Library test program + pngtest.png => Library test sample image + pngtrans.c => Common data transformation functions + pngwio.c => Lowest-level write I/O functions + pngwrite.c => High-level write functions + pngwtran.c => Write data transformations + pngwutil.c => Write utility functions + contrib => Contributions + gregbook => source code for PNG reading and writing, from + Greg Roelofs' "PNG: The Definitive Guide", + O'Reilly, 1999 + msvctest => Builds and runs pngtest using a MSVC workspace + pngminus => Simple pnm2png and png2pnm programs + pngsuite => Test images + visupng => Contains a MSVC workspace for VisualPng + projects => Contains project files and workspaces for building DLL + beos => Contains a Beos workspace for building libpng + c5builder => Contains a Borland workspace for building libpng + and zlib + visualc6 => Contains a Microsoft Visual C++ (MSVC) workspace + for building libpng and zlib + netware.txt => Contains instructions for downloading a set of + project files for building libpng and zlib on + Netware. + wince.txt => Contains instructions for downloading a Microsoft + Visual C++ (Windows CD Toolkit) workspace for + building libpng and zlib on WindowsCE + scripts => Directory containing scripts for building libpng: + descrip.mms => VMS makefile for MMS or MMK + makefile.std => Generic UNIX makefile (cc, creates static libpng.a) + makefile.elf => Linux/ELF makefile symbol versioning, + gcc, creates libpng12.so.0.1.2.40) + makefile.linux => Linux/ELF makefile + (gcc, creates libpng12.so.0.1.2.40) + makefile.gcmmx => Linux/ELF makefile + (gcc, creates libpng12.so.0.1.2.40, + uses assembler code tuned for Intel MMX platform) + makefile.gcc => Generic makefile (gcc, creates static libpng.a) + makefile.knr => Archaic UNIX Makefile that converts files with + ansi2knr (Requires ansi2knr.c from + ftp://ftp.cs.wisc.edu/ghost) + makefile.aix => AIX makefile + makefile.cygwin => Cygwin/gcc makefile + makefile.darwin => Darwin makefile + makefile.dec => DEC Alpha UNIX makefile + makefile.freebsd => FreeBSD makefile + makefile.hpgcc => HPUX makefile using gcc + makefile.hpux => HPUX (10.20 and 11.00) makefile + makefile.hp64 => HPUX (10.20 and 11.00) makefile, 64 bit + makefile.ibmc => IBM C/C++ version 3.x for Win32 and OS/2 (static) + makefile.intel => Intel C/C++ version 4.0 and later + libpng.icc => Project file, IBM VisualAge/C++ 4.0 or later + makefile.netbsd => NetBSD/cc makefile, PNGGCCRD, makes libpng.so. + makefile.ne12bsd => NetBSD/cc makefile, PNGGCCRD, makes libpng12.so + makefile.openbsd => OpenBSD makefile + makefile.sgi => Silicon Graphics IRIX (cc, creates static lib) + makefile.sggcc => Silicon Graphics + (gcc, creates libpng12.so.0.1.2.40) + makefile.sunos => Sun makefile + makefile.solaris => Solaris 2.X makefile + (gcc, creates libpng12.so.0.1.2.40) + makefile.so9 => Solaris 9 makefile + (gcc, creates libpng12.so.0.1.2.40) + makefile.32sunu => Sun Ultra 32-bit makefile + makefile.64sunu => Sun Ultra 64-bit makefile + makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc + makefile.mips => MIPS makefile + makefile.acorn => Acorn makefile + makefile.amiga => Amiga makefile + smakefile.ppc => AMIGA smakefile for SAS C V6.58/7.00 PPC + compiler (Requires SCOPTIONS, copied from + scripts/SCOPTIONS.ppc) + makefile.atari => Atari makefile + makefile.beos => BEOS makefile for X86 + makefile.bor => Borland makefile (uses bcc) + makefile.bc32 => 32-bit Borland C++ (all modules compiled in C mode) + makefile.tc3 => Turbo C 3.0 makefile + makefile.dj2 => DJGPP 2 makefile + makefile.msc => Microsoft C makefile + makefile.vcawin32=> makefile for Microsoft Visual C++ 5.0 and + later (uses assembler code tuned for Intel MMX + platform) + makefile.vcwin32 => makefile for Microsoft Visual C++ 4.0 and + later (does not use assembler code) + makefile.os2 => OS/2 Makefile (gcc and emx, requires pngos2.def) + pngos2.def => OS/2 module definition file used by makefile.os2 + makefile.watcom => Watcom 10a+ Makefile, 32-bit flat memory model + makevms.com => VMS build script + SCOPTIONS.ppc => Used with smakefile.ppc + +Good luck, and happy coding. + +-Glenn Randers-Pehrson (current maintainer) + Internet: glennrp at users.sourceforge.net + +-Andreas Eric Dilger (former maintainer, 1996-1997) + Internet: adilger at enel.ucalgary.ca + Web: http://members.shaw.ca/adilger/ + +-Guy Eric Schalnat (original author and former maintainer, 1995-1996) + (formerly of Group 42, Inc) + Internet: gschal at infinet.com diff --git a/third_party/windows/fltk-1.1.10/png/TODO b/third_party/windows/fltk-1.1.10/png/TODO new file mode 100644 index 0000000..e2cdcaf --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/TODO @@ -0,0 +1,25 @@ +TODO - list of things to do for libpng: + +Final bug fixes. +Improve API by hiding the png_struct and png_info structs. +Finish work on the no-floating-point version (including gamma compensation) +Better C++ wrapper/full C++ implementation? +Fix problem with C++ and EXTERN "C". +cHRM transformation. +Improve setjmp/longjmp usage or remove it in favor of returning error codes. +Add "grayscale->palette" transformation and "palette->grayscale" detection. +Improved dithering. +Multi-lingual error and warning message support. +Complete sRGB transformation (presently it simply uses gamma=0.45455). +Man pages for function calls. +Better documentation. +Better filter selection + (counting huffman bits/precompression? filter inertia? filter costs?). +Histogram creation. +Text conversion between different code pages (Latin-1 -> Mac and DOS). +Should we always malloc 2^bit_depth PLTE/tRNS/hIST entries for safety? +Build gamma tables using fixed point (and do away with floating point entirely). +Use greater precision when changing to linear gamma for compositing against + background and doing rgb-to-gray transformation. +Investigate pre-incremented loop counters and other loop constructions. +Add interpolated method of handling interlacing. diff --git a/third_party/windows/fltk-1.1.10/png/Y2KINFO b/third_party/windows/fltk-1.1.10/png/Y2KINFO new file mode 100644 index 0000000..c210389 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/Y2KINFO @@ -0,0 +1,55 @@ + Y2K compliance in libpng: + ========================= + + September 10, 2009 + + Since the PNG Development group is an ad-hoc body, we can't make + an official declaration. + + This is your unofficial assurance that libpng from version 0.71 and + upward through 1.2.40 are Y2K compliant. It is my belief that earlier + versions were also Y2K compliant. + + Libpng only has three year fields. One is a 2-byte unsigned integer + that will hold years up to 65535. The other two hold the date in text + format, and will hold years up to 9999. + + The integer is + "png_uint_16 year" in png_time_struct. + + The strings are + "png_charp time_buffer" in png_struct and + "near_time_buffer", which is a local character string in png.c. + + There are seven time-related functions: + + png_convert_to_rfc_1123() in png.c + (formerly png_convert_to_rfc_1152() in error) + png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c + png_convert_from_time_t() in pngwrite.c + png_get_tIME() in pngget.c + png_handle_tIME() in pngrutil.c, called in pngread.c + png_set_tIME() in pngset.c + png_write_tIME() in pngwutil.c, called in pngwrite.c + + All appear to handle dates properly in a Y2K environment. The + png_convert_from_time_t() function calls gmtime() to convert from system + clock time, which returns (year - 1900), which we properly convert to + the full 4-digit year. There is a possibility that applications using + libpng are not passing 4-digit years into the png_convert_to_rfc_1123() + function, or that they are incorrectly passing only a 2-digit year + instead of "year - 1900" into the png_convert_from_struct_tm() function, + but this is not under our control. The libpng documentation has always + stated that it works with 4-digit years, and the APIs have been + documented as such. + + The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned + integer to hold the year, and can hold years as large as 65535. + + zlib, upon which libpng depends, is also Y2K compliant. It contains + no date-related code. + + + Glenn Randers-Pehrson + libpng maintainer + PNG Development Group diff --git a/third_party/windows/fltk-1.1.10/png/libpng.3 b/third_party/windows/fltk-1.1.10/png/libpng.3 new file mode 100644 index 0000000..3518440 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/libpng.3 @@ -0,0 +1,4349 @@ +.TH LIBPNG 3 "September 10, 2009" +.SH NAME +libpng \- Portable Network Graphics (PNG) Reference Library 1.2.40 +.SH SYNOPSIS +\fI\fB + +\fB#include \fP + +\fI\fB + +\fBpng_uint_32 png_access_version_number \fI(void\fP\fB);\fP + +\fI\fB + +\fBint png_check_sig (png_bytep \fP\fIsig\fP\fB, int \fInum\fP\fB);\fP + +\fI\fB + +\fBvoid png_chunk_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP + +\fI\fB + +\fBvoid png_chunk_warning (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fImessage\fP\fB);\fP + +\fI\fB + +\fBvoid png_convert_from_struct_tm (png_timep \fP\fIptime\fP\fB, struct tm FAR * \fIttime\fP\fB);\fP + +\fI\fB + +\fBvoid png_convert_from_time_t (png_timep \fP\fIptime\fP\fB, time_t \fIttime\fP\fB);\fP + +\fI\fB + +\fBpng_charp png_convert_to_rfc1123 (png_structp \fP\fIpng_ptr\fP\fB, png_timep \fIptime\fP\fB);\fP + +\fI\fB + +\fBpng_infop png_create_info_struct (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_structp png_create_read_struct (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarn_fn\fP\fB);\fP + +\fI\fB + +\fBpng_structp png_create_read_struct_2(png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fP\fIwarn_fn\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP + +\fI\fB + +\fBpng_structp png_create_write_struct (png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarn_fn\fP\fB);\fP + +\fI\fB + +\fBpng_structp png_create_write_struct_2(png_const_charp \fP\fIuser_png_ver\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fP\fIwarn_fn\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP + +\fI\fB + +\fBint png_debug(int \fP\fIlevel\fP\fB, png_const_charp \fImessage\fP\fB);\fP + +\fI\fB + +\fBint png_debug1(int \fP\fIlevel\fP\fB, png_const_charp \fP\fImessage\fP\fB, \fIp1\fP\fB);\fP + +\fI\fB + +\fBint png_debug2(int \fP\fIlevel\fP\fB, png_const_charp \fP\fImessage\fP\fB, \fP\fIp1\fP\fB, \fIp2\fP\fB);\fP + +\fI\fB + +\fBvoid png_destroy_info_struct (png_structp \fP\fIpng_ptr\fP\fB, png_infopp \fIinfo_ptr_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_destroy_read_struct (png_structpp \fP\fIpng_ptr_ptr\fP\fB, png_infopp \fP\fIinfo_ptr_ptr\fP\fB, png_infopp \fIend_info_ptr_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_destroy_write_struct (png_structpp \fP\fIpng_ptr_ptr\fP\fB, png_infopp \fIinfo_ptr_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_error (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fIerror\fP\fB);\fP + +\fI\fB + +\fBvoid png_free (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fIptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_free_chunk_list (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_free_default(png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fIptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_free_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fInum\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_bit_depth (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_bKGD (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_16p \fI*background\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_channels (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fP\fI*white_x\fP\fB, double \fP\fI*white_y\fP\fB, double \fP\fI*red_x\fP\fB, double \fP\fI*red_y\fP\fB, double \fP\fI*green_x\fP\fB, double \fP\fI*green_y\fP\fB, double \fP\fI*blue_x\fP\fB, double \fI*blue_y\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_cHRM_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*white_x\fP\fB, png_uint_32 \fP\fI*white_y\fP\fB, png_uint_32 \fP\fI*red_x\fP\fB, png_uint_32 \fP\fI*red_y\fP\fB, png_uint_32 \fP\fI*green_x\fP\fB, png_uint_32 \fP\fI*green_y\fP\fB, png_uint_32 \fP\fI*blue_x\fP\fB, png_uint_32 \fI*blue_y\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_color_type (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_compression_type (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_copyright (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_get_error_ptr (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_filter_type (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_gAMA (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fI*file_gamma\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_gAMA_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fI*int_file_gamma\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_header_ver (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_header_version (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_16p \fI*hist\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charpp \fP\fIname\fP\fB, int \fP\fI*compression_type\fP\fB, png_charpp \fP\fIprofile\fP\fB, png_uint_32 \fI*proflen\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*width\fP\fB, png_uint_32 \fP\fI*height\fP\fB, int \fP\fI*bit_depth\fP\fB, int \fP\fI*color_type\fP\fB, int \fP\fI*interlace_type\fP\fB, int \fP\fI*compression_type\fP\fB, int \fI*filter_type\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_image_height (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_image_width (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fB#if \fI!defined(PNG_1_0_X) + +\fBpng_int_32 png_get_int_32 (png_bytep \fIbuf\fP\fB);\fP + +\fI\fB#endif + +\fI\fB + +\fBpng_byte png_get_interlace_type (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_get_io_ptr (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_libpng_ver (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_get_mem_ptr(png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*offset_x\fP\fB, png_uint_32 \fP\fI*offset_y\fP\fB, int \fI*unit_type\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fI*purpose\fP\fB, png_int_32 \fP\fI*X0\fP\fB, png_int_32 \fP\fI*X1\fP\fB, int \fP\fI*type\fP\fB, int \fP\fI*nparams\fP\fB, png_charp \fP\fI*units\fP\fB, png_charpp \fI*params\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fI*res_x\fP\fB, png_uint_32 \fP\fI*res_y\fP\fB, int \fI*unit_type\fP\fB);\fP + +\fI\fB + +\fBfloat png_get_pixel_aspect_ratio (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_pixels_per_meter (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_get_progressive_ptr (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_colorp \fP\fI*palette\fP\fB, int \fI*num_palette\fP\fB);\fP + +\fI\fB + +\fBpng_byte png_get_rgb_to_gray_status (png_structp \fIpng_ptr) + +\fBpng_uint_32 png_get_rowbytes (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_bytepp png_get_rows (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_8p \fI*sig_bit\fP\fB);\fP + +\fI\fB + +\fBpng_bytep png_get_signature (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_spalette_p \fI*splt_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_sRGB (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fI*intent\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_text (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fI*text_ptr\fP\fB, int \fI*num_text\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_timep \fI*mod_time\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fI*trans\fP\fB, int \fP\fI*num_trans\fP\fB, png_color_16p \fI*trans_values\fP\fB);\fP + +\fI\fB + +\fB#if \fI!defined(PNG_1_0_X) + +\fBpng_uint_16 png_get_uint_16 (png_bytep \fIbuf\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_uint_31 (png_bytep \fIbuf\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_uint_32 (png_bytep \fIbuf\fP\fB);\fP + +\fI\fB#endif + +\fI\fB + +\fBpng_uint_32 png_get_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_unknown_chunkpp \fIunknowns\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_get_user_chunk_ptr (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_user_height_max( png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_get_user_transform_ptr (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_user_width_max (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_valid (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIflag\fP\fB);\fP + +\fI\fB + +\fBpng_int_32 png_get_x_offset_microns (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_int_32 png_get_x_offset_pixels (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_x_pixels_per_meter (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_int_32 png_get_y_offset_microns (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_int_32 png_get_y_offset_pixels (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_y_pixels_per_meter (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_get_compression_buffer_size (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBint png_handle_as_unknown (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIchunk_name\fP\fB);\fP + +\fI\fB + +\fBvoid png_init_io (png_structp \fP\fIpng_ptr\fP\fB, FILE \fI*fp\fP\fB);\fP + +\fI\fB + +\fBDEPRECATED: void png_info_init (png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBDEPRECATED: void png_info_init_2 (png_infopp \fP\fIptr_ptr\fP\fB, png_size_t \fIpng_info_struct_size\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_malloc (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIsize\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_malloc_default(png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIsize\fP\fB);\fP + +\fI\fB + +\fBvoidp png_memcpy (png_voidp \fP\fIs1\fP\fB, png_voidp \fP\fIs2\fP\fB, png_size_t \fIsize\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_memcpy_check (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIs1\fP\fB, png_voidp \fP\fIs2\fP\fB, png_uint_32 \fIsize\fP\fB);\fP + +\fI\fB + +\fBvoidp png_memset (png_voidp \fP\fIs1\fP\fB, int \fP\fIvalue\fP\fB, png_size_t \fIsize\fP\fB);\fP + +\fI\fB + +\fBpng_voidp png_memset_check (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIs1\fP\fB, int \fP\fIvalue\fP\fB, png_uint_32 \fIsize\fP\fB);\fP + +\fI\fB + +\fBDEPRECATED: void png_permit_empty_plte (png_structp \fP\fIpng_ptr\fP\fB, int \fIempty_plte_permitted\fP\fB);\fP + +\fI\fB + +\fBvoid png_process_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIbuffer_size\fP\fB);\fP + +\fI\fB + +\fBvoid png_progressive_combine_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIold_row\fP\fB, png_bytep \fInew_row\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_destroy (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_infop \fIend_info_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_image (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fIimage\fP\fB);\fP + +\fI\fB + +\fBDEPRECATED: void png_read_init (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBDEPRECATED: void png_read_init_2 (png_structpp \fP\fIptr_ptr\fP\fB, png_const_charp \fP\fIuser_png_ver\fP\fB, png_size_t \fP\fIpng_struct_size\fP\fB, png_size_t \fIpng_info_size\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_png (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fItransforms\fP\fB, png_voidp \fIparams\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fIdisplay_row\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_rows (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fP\fIrow\fP\fB, png_bytepp \fP\fIdisplay_row\fP\fB, png_uint_32 \fInum_rows\fP\fB);\fP + +\fI\fB + +\fBvoid png_read_update_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fB#if \fI!defined(PNG_1_0_X) + +\fBpng_save_int_32 (png_bytep \fP\fIbuf\fP\fB, png_int_32 \fIi\fP\fB);\fP + +\fI\fB + +\fBvoid png_save_uint_16 (png_bytep \fP\fIbuf\fP\fB, unsigned int \fIi\fP\fB);\fP + +\fI\fB + +\fBvoid png_save_uint_32 (png_bytep \fP\fIbuf\fP\fB, png_uint_32 \fIi\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_add_alpha (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, int \fIflags\fP\fB);\fP + +\fI\fB#endif + +\fI\fB + +\fBvoid png_set_background (png_structp \fP\fIpng_ptr\fP\fB, png_color_16p \fP\fIbackground_color\fP\fB, int \fP\fIbackground_gamma_code\fP\fB, int \fP\fIneed_expand\fP\fB, double \fIbackground_gamma\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_bgr (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_bKGD (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_16p \fIbackground\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fP\fIwhite_x\fP\fB, double \fP\fIwhite_y\fP\fB, double \fP\fIred_x\fP\fB, double \fP\fIred_y\fP\fB, double \fP\fIgreen_x\fP\fB, double \fP\fIgreen_y\fP\fB, double \fP\fIblue_x\fP\fB, double \fIblue_y\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_cHRM_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIwhite_x\fP\fB, png_uint_32 \fP\fIwhite_y\fP\fB, png_uint_32 \fP\fIred_x\fP\fB, png_uint_32 \fP\fIred_y\fP\fB, png_uint_32 \fP\fIgreen_x\fP\fB, png_uint_32 \fP\fIgreen_y\fP\fB, png_uint_32 \fP\fIblue_x\fP\fB, png_uint_32 \fIblue_y\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_compression_level (png_structp \fP\fIpng_ptr\fP\fB, int \fIlevel\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_compression_mem_level (png_structp \fP\fIpng_ptr\fP\fB, int \fImem_level\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_compression_method (png_structp \fP\fIpng_ptr\fP\fB, int \fImethod\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_compression_strategy (png_structp \fP\fIpng_ptr\fP\fB, int \fIstrategy\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_compression_window_bits (png_structp \fP\fIpng_ptr\fP\fB, int \fIwindow_bits\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_crc_action (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIcrit_action\fP\fB, int \fIancil_action\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_dither (png_structp \fP\fIpng_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fP\fInum_palette\fP\fB, int \fP\fImaximum_colors\fP\fB, png_uint_16p \fP\fIhistogram\fP\fB, int \fIfull_dither\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_error_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIerror_ptr\fP\fB, png_error_ptr \fP\fIerror_fn\fP\fB, png_error_ptr \fIwarning_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_expand (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_expand_gray_1_2_4_to_8(png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_filler (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, int \fIflags\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_filter (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fImethod\fP\fB, int \fIfilters\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_filter_heuristics (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIheuristic_method\fP\fB, int \fP\fInum_weights\fP\fB, png_doublep \fP\fIfilter_weights\fP\fB, png_doublep \fIfilter_costs\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_flush (png_structp \fP\fIpng_ptr\fP\fB, int \fInrows\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_gamma (png_structp \fP\fIpng_ptr\fP\fB, double \fP\fIscreen_gamma\fP\fB, double \fIdefault_file_gamma\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_gAMA (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, double \fIfile_gamma\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_gAMA_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIfile_gamma\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_gray_1_2_4_to_8(png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_gray_to_rgb (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_16p \fIhist\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fIname\fP\fB, int \fP\fIcompression_type\fP\fB, png_charp \fP\fIprofile\fP\fB, png_uint_32 \fIproflen\fP\fB);\fP + +\fI\fB + +\fBint png_set_interlace_handling (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_invalid (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fImask\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_invert_alpha (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_invert_mono (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIwidth\fP\fB, png_uint_32 \fP\fIheight\fP\fB, int \fP\fIbit_depth\fP\fB, int \fP\fIcolor_type\fP\fB, int \fP\fIinterlace_type\fP\fB, int \fP\fIcompression_type\fP\fB, int \fIfilter_type\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_keep_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIkeep\fP\fB, png_bytep \fP\fIchunk_list\fP\fB, int \fInum_chunks\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_mem_fn(png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fImem_ptr\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_free_ptr \fIfree_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIoffset_x\fP\fB, png_uint_32 \fP\fIoffset_y\fP\fB, int \fIunit_type\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_packing (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_packswap (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_palette_to_rgb(png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fIpurpose\fP\fB, png_int_32 \fP\fIX0\fP\fB, png_int_32 \fP\fIX1\fP\fB, int \fP\fItype\fP\fB, int \fP\fInparams\fP\fB, png_charp \fP\fIunits\fP\fB, png_charpp \fIparams\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fP\fIres_x\fP\fB, png_uint_32 \fP\fIres_y\fP\fB, int \fIunit_type\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_progressive_read_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIprogressive_ptr\fP\fB, png_progressive_info_ptr \fP\fIinfo_fn\fP\fB, png_progressive_row_ptr \fP\fIrow_fn\fP\fB, png_progressive_end_ptr \fIend_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fInum_palette\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_read_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIio_ptr\fP\fB, png_rw_ptr \fIread_data_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_read_status_fn (png_structp \fP\fIpng_ptr\fP\fB, png_read_status_ptr \fIread_row_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_read_user_transform_fn (png_structp \fP\fIpng_ptr\fP\fB, png_user_transform_ptr \fIread_user_transform_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_rgb_to_gray (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIerror_action\fP\fB, double \fP\fIred\fP\fB, double \fIgreen\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_rgb_to_gray_fixed (png_structp \fP\fIpng_ptr\fP\fB, int error_action png_fixed_point \fP\fIred\fP\fB, png_fixed_point \fIgreen\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_rows (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytepp \fIrow_pointers\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_color_8p \fIsig_bit\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_charp \fP\fIunit\fP\fB, double \fP\fIwidth\fP\fB, double \fIheight\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_shift (png_structp \fP\fIpng_ptr\fP\fB, png_color_8p \fItrue_bits\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sig_bytes (png_structp \fP\fIpng_ptr\fP\fB, int \fInum_bytes\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_spalette_p \fP\fIsplt_ptr\fP\fB, int \fInum_spalettes\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sRGB (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fIintent\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_sRGB_gAMA_and_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fIintent\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_strip_16 (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_strip_alpha (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_swap (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_swap_alpha (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_text (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fItext_ptr\fP\fB, int \fInum_text\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_timep \fImod_time\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_bytep \fP\fItrans\fP\fB, int \fP\fInum_trans\fP\fB, png_color_16p \fItrans_values\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_tRNS_to_alpha(png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBpng_uint_32 png_set_unknown_chunks (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_unknown_chunkp \fP\fIunknowns\fP\fB, int \fP\fInum\fP\fB, int \fIlocation\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_unknown_chunk_location(png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fIchunk\fP\fB, int \fIlocation\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_read_user_chunk_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIuser_chunk_ptr\fP\fB, png_user_chunk_ptr \fIread_user_chunk_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_user_limits (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIuser_width_max\fP\fB, png_uint_32 \fIuser_height_max\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_user_transform_info (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIuser_transform_ptr\fP\fB, int \fP\fIuser_transform_depth\fP\fB, int \fIuser_transform_channels\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_write_fn (png_structp \fP\fIpng_ptr\fP\fB, png_voidp \fP\fIio_ptr\fP\fB, png_rw_ptr \fP\fIwrite_data_fn\fP\fB, png_flush_ptr \fIoutput_flush_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_write_status_fn (png_structp \fP\fIpng_ptr\fP\fB, png_write_status_ptr \fIwrite_row_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_write_user_transform_fn (png_structp \fP\fIpng_ptr\fP\fB, png_user_transform_ptr \fIwrite_user_transform_fn\fP\fB);\fP + +\fI\fB + +\fBvoid png_set_compression_buffer_size(png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIsize\fP\fB);\fP + +\fI\fB + +\fBint png_sig_cmp (png_bytep \fP\fIsig\fP\fB, png_size_t \fP\fIstart\fP\fB, png_size_t \fInum_to_check\fP\fB);\fP + +\fI\fB + +\fBvoid png_start_read_image (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_warning (png_structp \fP\fIpng_ptr\fP\fB, png_const_charp \fImessage\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_chunk (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIchunk_name\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_chunk_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_chunk_end (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_chunk_start (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIchunk_name\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_destroy (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_flush (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_image (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fIimage\fP\fB);\fP + +\fI\fB + +\fBDEPRECATED: void png_write_init (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fBDEPRECATED: void png_write_init_2 (png_structpp \fP\fIptr_ptr\fP\fB, png_const_charp \fP\fIuser_png_ver\fP\fB, png_size_t \fP\fIpng_struct_size\fP\fB, png_size_t \fIpng_info_size\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_info_before_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_png (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, int \fP\fItransforms\fP\fB, png_voidp \fIparams\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fBvoid png_write_rows (png_structp \fP\fIpng_ptr\fP\fB, png_bytepp \fP\fIrow\fP\fB, png_uint_32 \fInum_rows\fP\fB);\fP + +\fI\fB + +\fBvoidpf png_zalloc (voidpf \fP\fIpng_ptr\fP\fB, uInt \fP\fIitems\fP\fB, uInt \fIsize\fP\fB);\fP + +\fI\fB + +\fBvoid png_zfree (voidpf \fP\fIpng_ptr\fP\fB, voidpf \fIptr\fP\fB);\fP + +\fI\fB + +.SH DESCRIPTION +The +.I libpng +library supports encoding, decoding, and various manipulations of +the Portable Network Graphics (PNG) format image files. It uses the +.IR zlib(3) +compression library. +Following is a copy of the libpng.txt file that accompanies libpng. +.SH LIBPNG.TXT +libpng.txt - A description on how to use and modify libpng + + libpng version 1.2.40 - September 10, 2009 + Updated and distributed by Glenn Randers-Pehrson + + Copyright (c) 1998-2009 Glenn Randers-Pehrson + + This document is released under the libpng license. + For conditions of distribution and use, see the disclaimer + and license in png.h + + Based on: + + libpng versions 0.97, January 1998, through 1.2.40 - September 10, 2009 + Updated and distributed by Glenn Randers-Pehrson + Copyright (c) 1998-2009 Glenn Randers-Pehrson + + libpng 1.0 beta 6 version 0.96 May 28, 1997 + Updated and distributed by Andreas Dilger + Copyright (c) 1996, 1997 Andreas Dilger + + libpng 1.0 beta 2 - version 0.88 January 26, 1996 + For conditions of distribution and use, see copyright + notice in png.h. Copyright (c) 1995, 1996 Guy Eric + Schalnat, Group 42, Inc. + + Updated/rewritten per request in the libpng FAQ + Copyright (c) 1995, 1996 Frank J. T. Wojcik + December 18, 1995 & January 20, 1996 + +.SH I. Introduction + +This file describes how to use and modify the PNG reference library +(known as libpng) for your own use. There are five sections to this +file: introduction, structures, reading, writing, and modification and +configuration notes for various special platforms. In addition to this +file, example.c is a good starting point for using the library, as +it is heavily commented and should include everything most people +will need. We assume that libpng is already installed; see the +INSTALL file for instructions on how to install libpng. + +For examples of libpng usage, see the files "example.c", "pngtest.c", +and the files in the "contrib" directory, all of which are included in the +libpng distribution. + +Libpng was written as a companion to the PNG specification, as a way +of reducing the amount of time and effort it takes to support the PNG +file format in application programs. + +The PNG specification (second edition), November 2003, is available as +a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2003 (E)) at +. It is technically equivalent +to the PNG specification (second edition) but has some additional material. + +The PNG-1.0 specification is available +as RFC 2083 and as a +W3C Recommendation . + +Some additional chunks are described in the special-purpose public chunks +documents at . + +Other information +about PNG, and the latest version of libpng, can be found at the PNG home +page, . + +Most users will not have to modify the library significantly; advanced +users may want to modify it more. All attempts were made to make it as +complete as possible, while keeping the code easy to understand. +Currently, this library only supports C. Support for other languages +is being considered. + +Libpng has been designed to handle multiple sessions at one time, +to be easily modifiable, to be portable to the vast majority of +machines (ANSI, K&R, 16-, 32-, and 64-bit) available, and to be easy +to use. The ultimate goal of libpng is to promote the acceptance of +the PNG file format in whatever way possible. While there is still +work to be done (see the TODO file), libpng should cover the +majority of the needs of its users. + +Libpng uses zlib for its compression and decompression of PNG files. +Further information about zlib, and the latest version of zlib, can +be found at the zlib home page, . +The zlib compression utility is a general purpose utility that is +useful for more than PNG files, and can be used without libpng. +See the documentation delivered with zlib for more details. +You can usually find the source files for the zlib utility wherever you +find the libpng source files. + +Libpng is thread safe, provided the threads are using different +instances of the structures. Each thread should have its own +png_struct and png_info instances, and thus its own image. +Libpng does not protect itself against two threads using the +same instance of a structure. + +.SH II. Structures + +There are two main structures that are important to libpng, png_struct +and png_info. The first, png_struct, is an internal structure that +will not, for the most part, be used by a user except as the first +variable passed to every libpng function call. + +The png_info structure is designed to provide information about the +PNG file. At one time, the fields of png_info were intended to be +directly accessible to the user. However, this tended to cause problems +with applications using dynamically loaded libraries, and as a result +a set of interface functions for png_info (the png_get_*() and png_set_*() +functions) was developed. The fields of png_info are still available for +older applications, but it is suggested that applications use the new +interfaces if at all possible. + +Applications that do make direct access to the members of png_struct (except +for png_ptr->jmpbuf) must be recompiled whenever the library is updated, +and applications that make direct access to the members of png_info must +be recompiled if they were compiled or loaded with libpng version 1.0.6, +in which the members were in a different order. In version 1.0.7, the +members of the png_info structure reverted to the old order, as they were +in versions 0.97c through 1.0.5. Starting with version 2.0.0, both +structures are going to be hidden, and the contents of the structures will +only be accessible through the png_get/png_set functions. + +The png.h header file is an invaluable reference for programming with libpng. +And while I'm on the topic, make sure you include the libpng header file: + +#include + +.SH III. Reading + +We'll now walk you through the possible functions to call when reading +in a PNG file sequentially, briefly explaining the syntax and purpose +of each one. See example.c and png.h for more detail. While +progressive reading is covered in the next section, you will still +need some of the functions discussed in this section to read a PNG +file. + +.SS Setup + +You will want to do the I/O initialization(*) before you get into libpng, +so if it doesn't work, you don't have much to undo. Of course, you +will also want to insure that you are, in fact, dealing with a PNG +file. Libpng provides a simple check to see if a file is a PNG file. +To use it, pass in the first 1 to 8 bytes of the file to the function +png_sig_cmp(), and it will return 0 (false) if the bytes match the +corresponding bytes of the PNG signature, or nonzero (true) otherwise. +Of course, the more bytes you pass in, the greater the accuracy of the +prediction. + +If you are intending to keep the file pointer open for use in libpng, +you must ensure you don't read more than 8 bytes from the beginning +of the file, and you also have to make a call to png_set_sig_bytes_read() +with the number of bytes you read from the beginning. Libpng will +then only check the bytes (if any) that your program didn't read. + +(*): If you are not using the standard I/O functions, you will need +to replace them with custom functions. See the discussion under +Customizing libpng. + + + FILE *fp = fopen(file_name, "rb"); + if (!fp) + { + return (ERROR); + } + fread(header, 1, number, fp); + is_png = !png_sig_cmp(header, 0, number); + if (!is_png) + { + return (NOT_PNG); + } + + +Next, png_struct and png_info need to be allocated and initialized. In +order to ensure that the size of these structures is correct even with a +dynamically linked libpng, there are functions to initialize and +allocate the structures. We also pass the library version, optional +pointers to error handling functions, and a pointer to a data struct for +use by the error functions, if necessary (the pointer and functions can +be NULL if the default error handlers are to be used). See the section +on Changes to Libpng below regarding the old initialization functions. +The structure allocation functions quietly return NULL if they fail to +create the structure, so your application should check for that. + + png_structp png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + if (!png_ptr) + return (ERROR); + + png_infop info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, + (png_infopp)NULL, (png_infopp)NULL); + return (ERROR); + } + + png_infop end_info = png_create_info_struct(png_ptr); + if (!end_info) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + +If you want to use your own memory allocation routines, +define PNG_USER_MEM_SUPPORTED and use +png_create_read_struct_2() instead of png_create_read_struct(): + + png_structp png_ptr = png_create_read_struct_2 + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn, (png_voidp) + user_mem_ptr, user_malloc_fn, user_free_fn); + +The error handling routines passed to png_create_read_struct() +and the memory alloc/free routines passed to png_create_struct_2() +are only necessary if you are not using the libpng supplied error +handling and memory alloc/free functions. + +When libpng encounters an error, it expects to longjmp back +to your routine. Therefore, you will need to call setjmp and pass +your png_jmpbuf(png_ptr). If you read the file from different +routines, you will need to update the jmpbuf field every time you enter +a new routine that will call a png_*() function. + +See your documentation of setjmp/longjmp for your compiler for more +information on setjmp/longjmp. See the discussion on libpng error +handling in the Customizing Libpng section below for more information +on the libpng error handling. If an error occurs, and libpng longjmp's +back to your setjmp, you will want to call png_destroy_read_struct() to +free any memory. + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + &end_info); + fclose(fp); + return (ERROR); + } + +If you would rather avoid the complexity of setjmp/longjmp issues, +you can compile libpng with PNG_SETJMP_NOT_SUPPORTED, in which case +errors will result in a call to PNG_ABORT() which defaults to abort(). + +Now you need to set up the input code. The default for libpng is to +use the C function fread(). If you use this, you will need to pass a +valid FILE * in the function png_init_io(). Be sure that the file is +opened in binary mode. If you wish to handle reading data in another +way, you need not call the png_init_io() function, but you must then +implement the libpng I/O methods discussed in the Customizing Libpng +section below. + + png_init_io(png_ptr, fp); + +If you had previously opened the file and read any of the signature from +the beginning in order to see if this was a PNG file, you need to let +libpng know that there are some bytes missing from the start of the file. + + png_set_sig_bytes(png_ptr, number); + +.SS Setting up callback code + +You can set up a callback function to handle any unknown chunks in the +input stream. You must supply the function + + read_chunk_callback(png_ptr ptr, + png_unknown_chunkp chunk); + { + /* The unknown chunk structure contains your + chunk data, along with similar data for any other + unknown chunks: */ + + png_byte name[5]; + png_byte *data; + png_size_t size; + + /* Note that libpng has already taken care of + the CRC handling */ + + /* put your code here. Search for your chunk in the + unknown chunk structure, process it, and return one + of the following: */ + + return (-n); /* chunk had an error */ + return (0); /* did not recognize */ + return (n); /* success */ + } + +(You can give your function another name that you like instead of +"read_chunk_callback") + +To inform libpng about your function, use + + png_set_read_user_chunk_fn(png_ptr, user_chunk_ptr, + read_chunk_callback); + +This names not only the callback function, but also a user pointer that +you can retrieve with + + png_get_user_chunk_ptr(png_ptr); + +If you call the png_set_read_user_chunk_fn() function, then all unknown +chunks will be saved when read, in case your callback function will need +one or more of them. This behavior can be changed with the +png_set_keep_unknown_chunks() function, described below. + +At this point, you can set up a callback function that will be +called after each row has been read, which you can use to control +a progress meter or the like. It's demonstrated in pngtest.c. +You must supply a function + + void read_row_callback(png_ptr ptr, png_uint_32 row, + int pass); + { + /* put your code here */ + } + +(You can give it another name that you like instead of "read_row_callback") + +To inform libpng about your function, use + + png_set_read_status_fn(png_ptr, read_row_callback); + +.SS Unknown-chunk handling + +Now you get to set the way the library processes unknown chunks in the +input PNG stream. Both known and unknown chunks will be read. Normal +behavior is that known chunks will be parsed into information in +various info_ptr members while unknown chunks will be discarded. This +behavior can be wasteful if your application will never use some known +chunk types. To change this, you can call: + + png_set_keep_unknown_chunks(png_ptr, keep, + chunk_list, num_chunks); + keep - 0: default unknown chunk handling + 1: ignore; do not keep + 2: keep only if safe-to-copy + 3: keep even if unsafe-to-copy + You can use these definitions: + PNG_HANDLE_CHUNK_AS_DEFAULT 0 + PNG_HANDLE_CHUNK_NEVER 1 + PNG_HANDLE_CHUNK_IF_SAFE 2 + PNG_HANDLE_CHUNK_ALWAYS 3 + chunk_list - list of chunks affected (a byte string, + five bytes per chunk, NULL or '\0' if + num_chunks is 0) + num_chunks - number of chunks affected; if 0, all + unknown chunks are affected. If nonzero, + only the chunks in the list are affected + +Unknown chunks declared in this way will be saved as raw data onto a +list of png_unknown_chunk structures. If a chunk that is normally +known to libpng is named in the list, it will be handled as unknown, +according to the "keep" directive. If a chunk is named in successive +instances of png_set_keep_unknown_chunks(), the final instance will +take precedence. The IHDR and IEND chunks should not be named in +chunk_list; if they are, libpng will process them normally anyway. + +Here is an example of the usage of png_set_keep_unknown_chunks(), +where the private "vpAg" chunk will later be processed by a user chunk +callback function: + + png_byte vpAg[5]={118, 112, 65, 103, (png_byte) '\0'}; + + #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + png_byte unused_chunks[]= + { + 104, 73, 83, 84, (png_byte) '\0', /* hIST */ + 105, 84, 88, 116, (png_byte) '\0', /* iTXt */ + 112, 67, 65, 76, (png_byte) '\0', /* pCAL */ + 115, 67, 65, 76, (png_byte) '\0', /* sCAL */ + 115, 80, 76, 84, (png_byte) '\0', /* sPLT */ + 116, 73, 77, 69, (png_byte) '\0', /* tIME */ + }; + #endif + + ... + + #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + /* ignore all unknown chunks: */ + png_set_keep_unknown_chunks(read_ptr, 1, NULL, 0); + /* except for vpAg: */ + png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1); + /* also ignore unused known chunks: */ + png_set_keep_unknown_chunks(read_ptr, 1, unused_chunks, + (int)sizeof(unused_chunks)/5); + #endif + +.SS User limits + +The PNG specification allows the width and height of an image to be as +large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns. +Since very few applications really need to process such large images, +we have imposed an arbitrary 1-million limit on rows and columns. +Larger images will be rejected immediately with a png_error() call. If +you wish to override this limit, you can use + + png_set_user_limits(png_ptr, width_max, height_max); + +to set your own limits, or use width_max = height_max = 0x7fffffffL +to allow all valid dimensions (libpng may reject some very large images +anyway because of potential buffer overflow conditions). + +You should put this statement after you create the PNG structure and +before calling png_read_info(), png_read_png(), or png_process_data(). +If you need to retrieve the limits that are being applied, use + + width_max = png_get_user_width_max(png_ptr); + height_max = png_get_user_height_max(png_ptr); + +.SS The high-level read interface + +At this point there are two ways to proceed; through the high-level +read interface, or through a sequence of low-level read operations. +You can use the high-level interface if (a) you are willing to read +the entire image into memory, and (b) the input transformations +you want to do are limited to the following set: + + PNG_TRANSFORM_IDENTITY No transformation + PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to + 8 bits + PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel + PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit + samples to bytes + PNG_TRANSFORM_PACKSWAP Change order of packed + pixels to LSB first + PNG_TRANSFORM_EXPAND Perform set_expand() + PNG_TRANSFORM_INVERT_MONO Invert monochrome images + PNG_TRANSFORM_SHIFT Normalize pixels to the + sBIT depth + PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA + to BGRA + PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA + to AG + PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity + to transparency + PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples + +(This excludes setting a background color, doing gamma transformation, +dithering, and setting filler.) If this is the case, simply do this: + + png_read_png(png_ptr, info_ptr, png_transforms, NULL) + +where png_transforms is an integer containing the bitwise OR of +some set of transformation flags. This call is equivalent to png_read_info(), +followed the set of transformations indicated by the transform mask, +then png_read_image(), and finally png_read_end(). + +(The final parameter of this call is not yet used. Someday it might point +to transformation parameters required by some future input transform.) + +You must use png_transforms and not call any png_set_transform() functions +when you use png_read_png(). + +After you have called png_read_png(), you can retrieve the image data +with + + row_pointers = png_get_rows(png_ptr, info_ptr); + +where row_pointers is an array of pointers to the pixel data for each row: + + png_bytep row_pointers[height]; + +If you know your image size and pixel size ahead of time, you can allocate +row_pointers prior to calling png_read_png() with + + if (height > PNG_UINT_32_MAX/png_sizeof(png_byte)) + png_error (png_ptr, + "Image is too tall to process in memory"); + if (width > PNG_UINT_32_MAX/pixel_size) + png_error (png_ptr, + "Image is too wide to process in memory"); + row_pointers = png_malloc(png_ptr, + height*png_sizeof(png_bytep)); + for (int i=0; i) and +png_get_(png_ptr, info_ptr, ...) functions return non-zero if the +data has been read, or zero if it is missing. The parameters to the +png_get_ are set directly if they are simple data types, or a pointer +into the info_ptr is returned for any complex types. + + png_get_PLTE(png_ptr, info_ptr, &palette, + &num_palette); + palette - the palette for the file + (array of png_color) + num_palette - number of entries in the palette + + png_get_gAMA(png_ptr, info_ptr, &gamma); + gamma - the gamma the file is written + at (PNG_INFO_gAMA) + + png_get_sRGB(png_ptr, info_ptr, &srgb_intent); + srgb_intent - the rendering intent (PNG_INFO_sRGB) + The presence of the sRGB chunk + means that the pixel data is in the + sRGB color space. This chunk also + implies specific values of gAMA and + cHRM. + + png_get_iCCP(png_ptr, info_ptr, &name, + &compression_type, &profile, &proflen); + name - The profile name. + compression - The compression type; always + PNG_COMPRESSION_TYPE_BASE for PNG 1.0. + You may give NULL to this argument to + ignore it. + profile - International Color Consortium color + profile data. May contain NULs. + proflen - length of profile data in bytes. + + png_get_sBIT(png_ptr, info_ptr, &sig_bit); + sig_bit - the number of significant bits for + (PNG_INFO_sBIT) each of the gray, + red, green, and blue channels, + whichever are appropriate for the + given color type (png_color_16) + + png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, + &trans_values); + trans - array of transparent entries for + palette (PNG_INFO_tRNS) + trans_values - graylevel or color sample values of + the single transparent color for + non-paletted images (PNG_INFO_tRNS) + num_trans - number of transparent entries + (PNG_INFO_tRNS) + + png_get_hIST(png_ptr, info_ptr, &hist); + (PNG_INFO_hIST) + hist - histogram of palette (array of + png_uint_16) + + png_get_tIME(png_ptr, info_ptr, &mod_time); + mod_time - time image was last modified + (PNG_VALID_tIME) + + png_get_bKGD(png_ptr, info_ptr, &background); + background - background color (PNG_VALID_bKGD) + valid 16-bit red, green and blue + values, regardless of color_type + + num_comments = png_get_text(png_ptr, info_ptr, + &text_ptr, &num_text); + num_comments - number of comments + text_ptr - array of png_text holding image + comments + text_ptr[i].compression - type of compression used + on "text" PNG_TEXT_COMPRESSION_NONE + PNG_TEXT_COMPRESSION_zTXt + PNG_ITXT_COMPRESSION_NONE + PNG_ITXT_COMPRESSION_zTXt + text_ptr[i].key - keyword for comment. Must contain + 1-79 characters. + text_ptr[i].text - text comments for current + keyword. Can be empty. + text_ptr[i].text_length - length of text string, + after decompression, 0 for iTXt + text_ptr[i].itxt_length - length of itxt string, + after decompression, 0 for tEXt/zTXt + text_ptr[i].lang - language of comment (empty + string for unknown). + text_ptr[i].lang_key - keyword in UTF-8 + (empty string for unknown). + num_text - number of comments (same as + num_comments; you can put NULL here + to avoid the duplication) + Note while png_set_text() will accept text, language, + and translated keywords that can be NULL pointers, the + structure returned by png_get_text will always contain + regular zero-terminated C strings. They might be + empty strings but they will never be NULL pointers. + + num_spalettes = png_get_sPLT(png_ptr, info_ptr, + &palette_ptr); + palette_ptr - array of palette structures holding + contents of one or more sPLT chunks + read. + num_spalettes - number of sPLT chunks read. + + png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y, + &unit_type); + offset_x - positive offset from the left edge + of the screen + offset_y - positive offset from the top edge + of the screen + unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER + + png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, + &unit_type); + res_x - pixels/unit physical resolution in + x direction + res_y - pixels/unit physical resolution in + x direction + unit_type - PNG_RESOLUTION_UNKNOWN, + PNG_RESOLUTION_METER + + png_get_sCAL(png_ptr, info_ptr, &unit, &width, + &height) + unit - physical scale units (an integer) + width - width of a pixel in physical scale units + height - height of a pixel in physical scale units + (width and height are doubles) + + png_get_sCAL_s(png_ptr, info_ptr, &unit, &width, + &height) + unit - physical scale units (an integer) + width - width of a pixel in physical scale units + height - height of a pixel in physical scale units + (width and height are strings like "2.54") + + num_unknown_chunks = png_get_unknown_chunks(png_ptr, + info_ptr, &unknowns) + unknowns - array of png_unknown_chunk + structures holding unknown chunks + unknowns[i].name - name of unknown chunk + unknowns[i].data - data of unknown chunk + unknowns[i].size - size of unknown chunk's data + unknowns[i].location - position of chunk in file + + The value of "i" corresponds to the order in which the + chunks were read from the PNG file or inserted with the + png_set_unknown_chunks() function. + +The data from the pHYs chunk can be retrieved in several convenient +forms: + + res_x = png_get_x_pixels_per_meter(png_ptr, + info_ptr) + res_y = png_get_y_pixels_per_meter(png_ptr, + info_ptr) + res_x_and_y = png_get_pixels_per_meter(png_ptr, + info_ptr) + res_x = png_get_x_pixels_per_inch(png_ptr, + info_ptr) + res_y = png_get_y_pixels_per_inch(png_ptr, + info_ptr) + res_x_and_y = png_get_pixels_per_inch(png_ptr, + info_ptr) + aspect_ratio = png_get_pixel_aspect_ratio(png_ptr, + info_ptr) + + (Each of these returns 0 [signifying "unknown"] if + the data is not present or if res_x is 0; + res_x_and_y is 0 if res_x != res_y) + +The data from the oFFs chunk can be retrieved in several convenient +forms: + + x_offset = png_get_x_offset_microns(png_ptr, info_ptr); + y_offset = png_get_y_offset_microns(png_ptr, info_ptr); + x_offset = png_get_x_offset_inches(png_ptr, info_ptr); + y_offset = png_get_y_offset_inches(png_ptr, info_ptr); + + (Each of these returns 0 [signifying "unknown" if both + x and y are 0] if the data is not present or if the + chunk is present but the unit is the pixel) + +For more information, see the png_info definition in png.h and the +PNG specification for chunk contents. Be careful with trusting +rowbytes, as some of the transformations could increase the space +needed to hold a row (expand, filler, gray_to_rgb, etc.). +See png_read_update_info(), below. + +A quick word about text_ptr and num_text. PNG stores comments in +keyword/text pairs, one pair per chunk, with no limit on the number +of text chunks, and a 2^31 byte limit on their size. While there are +suggested keywords, there is no requirement to restrict the use to these +strings. It is strongly suggested that keywords and text be sensible +to humans (that's the point), so don't use abbreviations. Non-printing +symbols are not allowed. See the PNG specification for more details. +There is also no requirement to have text after the keyword. + +Keywords should be limited to 79 Latin-1 characters without leading or +trailing spaces, but non-consecutive spaces are allowed within the +keyword. It is possible to have the same keyword any number of times. +The text_ptr is an array of png_text structures, each holding a +pointer to a language string, a pointer to a keyword and a pointer to +a text string. The text string, language code, and translated +keyword may be empty or NULL pointers. The keyword/text +pairs are put into the array in the order that they are received. +However, some or all of the text chunks may be after the image, so, to +make sure you have read all the text chunks, don't mess with these +until after you read the stuff after the image. This will be +mentioned again below in the discussion that goes with png_read_end(). + +.SS Input transformations + +After you've read the header information, you can set up the library +to handle any special transformations of the image data. The various +ways to transform the data will be described in the order that they +should occur. This is important, as some of these change the color +type and/or bit depth of the data, and some others only work on +certain color types and bit depths. Even though each transformation +checks to see if it has data that it can do something with, you should +make sure to only enable a transformation if it will be valid for the +data. For example, don't swap red and blue on grayscale data. + +The colors used for the background and transparency values should be +supplied in the same format/depth as the current image data. They +are stored in the same format/depth as the image data in a bKGD or tRNS +chunk, so this is what libpng expects for this data. The colors are +transformed to keep in sync with the image data when an application +calls the png_read_update_info() routine (see below). + +Data will be decoded into the supplied row buffers packed into bytes +unless the library has been told to transform it into another format. +For example, 4 bit/pixel paletted or grayscale data will be returned +2 pixels/byte with the leftmost pixel in the high-order bits of the +byte, unless png_set_packing() is called. 8-bit RGB data will be stored +in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha() +is called to insert filler bytes, either before or after each RGB triplet. +16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant +byte of the color value first, unless png_set_strip_16() is called to +transform it to regular RGB RGB triplets, or png_set_filler() or +png_set_add alpha() is called to insert filler bytes, either before or +after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can +be modified with +png_set_filler(), png_set_add_alpha(), or png_set_strip_16(). + +The following code transforms grayscale images of less than 8 to 8 bits, +changes paletted images to RGB, and adds a full alpha channel if there is +transparency information in a tRNS chunk. This is most useful on +grayscale images with bit depths of 2 or 4 or if there is a multiple-image +viewing application that wishes to treat all images in the same way. + + if (color_type == PNG_COLOR_TYPE_PALETTE) + png_set_palette_to_rgb(png_ptr); + + if (color_type == PNG_COLOR_TYPE_GRAY && + bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr); + + if (png_get_valid(png_ptr, info_ptr, + PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr); + +These three functions are actually aliases for png_set_expand(), added +in libpng version 1.0.4, with the function names expanded to improve code +readability. In some future version they may actually do different +things. + +As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was +added. It expands the sample depth without changing tRNS to alpha. + +PNG can have files with 16 bits per channel. If you only can handle +8 bits per channel, this will strip the pixels down to 8 bit. + + if (bit_depth == 16) + png_set_strip_16(png_ptr); + +If, for some reason, you don't need the alpha channel on an image, +and you want to remove it rather than combining it with the background +(but the image author certainly had in mind that you *would* combine +it with the background, so that's what you should probably do): + + if (color_type & PNG_COLOR_MASK_ALPHA) + png_set_strip_alpha(png_ptr); + +In PNG files, the alpha channel in an image +is the level of opacity. If you need the alpha channel in an image to +be the level of transparency instead of opacity, you can invert the +alpha channel (or the tRNS chunk data) after it's read, so that 0 is +fully opaque and 255 (in 8-bit or paletted images) or 65535 (in 16-bit +images) is fully transparent, with + + png_set_invert_alpha(png_ptr); + +PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as +they can, resulting in, for example, 8 pixels per byte for 1 bit +files. This code expands to 1 pixel per byte without changing the +values of the pixels: + + if (bit_depth < 8) + png_set_packing(png_ptr); + +PNG files have possible bit depths of 1, 2, 4, 8, and 16. All pixels +stored in a PNG image have been "scaled" or "shifted" up to the next +higher possible bit depth (e.g. from 5 bits/sample in the range [0,31] to +8 bits/sample in the range [0, 255]). However, it is also possible to +convert the PNG pixel data back to the original bit depth of the image. +This call reduces the pixels back down to the original bit depth: + + png_color_8p sig_bit; + + if (png_get_sBIT(png_ptr, info_ptr, &sig_bit)) + png_set_shift(png_ptr, sig_bit); + +PNG files store 3-color pixels in red, green, blue order. This code +changes the storage of the pixels to blue, green, red: + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_bgr(png_ptr); + +PNG files store RGB pixels packed into 3 or 6 bytes. This code expands them +into 4 or 8 bytes for windowing systems that need them in this format: + + if (color_type == PNG_COLOR_TYPE_RGB) + png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE); + +where "filler" is the 8 or 16-bit number to fill with, and the location is +either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether +you want the filler before the RGB or after. This transformation +does not affect images that already have full alpha channels. To add an +opaque alpha channel, use filler=0xff or 0xffff and PNG_FILLER_AFTER which +will generate RGBA pixels. + +Note that png_set_filler() does not change the color type. If you want +to do that, you can add a true alpha channel with + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_GRAY) + png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER); + +where "filler" contains the alpha value to assign to each pixel. +This function was added in libpng-1.2.7. + +If you are reading an image with an alpha channel, and you need the +data as ARGB instead of the normal PNG format RGBA: + + if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_swap_alpha(png_ptr); + +For some uses, you may want a grayscale image to be represented as +RGB. This code will do that conversion: + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb(png_ptr); + +Conversely, you can convert an RGB or RGBA image to grayscale or grayscale +with alpha. + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_rgb_to_gray_fixed(png_ptr, error_action, + int red_weight, int green_weight); + + error_action = 1: silently do the conversion + error_action = 2: issue a warning if the original + image has any pixel where + red != green or red != blue + error_action = 3: issue an error and abort the + conversion if the original + image has any pixel where + red != green or red != blue + + red_weight: weight of red component times 100000 + green_weight: weight of green component times 100000 + If either weight is negative, default + weights (21268, 71514) are used. + +If you have set error_action = 1 or 2, you can +later check whether the image really was gray, after processing +the image rows, with the png_get_rgb_to_gray_status(png_ptr) function. +It will return a png_byte that is zero if the image was gray or +1 if there were any non-gray pixels. bKGD and sBIT data +will be silently converted to grayscale, using the green channel +data, regardless of the error_action setting. + +With red_weight+green_weight<=100000, +the normalized graylevel is computed: + + int rw = red_weight * 65536; + int gw = green_weight * 65536; + int bw = 65536 - (rw + gw); + gray = (rw*red + gw*green + bw*blue)/65536; + +The default values approximate those recommended in the Charles +Poynton's Color FAQ, +Copyright (c) 1998-01-04 Charles Poynton + + Y = 0.212671 * R + 0.715160 * G + 0.072169 * B + +Libpng approximates this with + + Y = 0.21268 * R + 0.7151 * G + 0.07217 * B + +which can be expressed with integers as + + Y = (6969 * R + 23434 * G + 2365 * B)/32768 + +The calculation is done in a linear colorspace, if the image gamma +is known. + +If you have a grayscale and you are using png_set_expand_depth(), +png_set_expand(), or png_set_gray_to_rgb to change to truecolor or to +a higher bit-depth, you must either supply the background color as a gray +value at the original file bit-depth (need_expand = 1) or else supply the +background color as an RGB triplet at the final, expanded bit depth +(need_expand = 0). Similarly, if you are reading a paletted image, you +must either supply the background color as a palette index (need_expand = 1) +or as an RGB triplet that may or may not be in the palette (need_expand = 0). + + png_color_16 my_background; + png_color_16p image_background; + + if (png_get_bKGD(png_ptr, info_ptr, &image_background)) + png_set_background(png_ptr, image_background, + PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); + else + png_set_background(png_ptr, &my_background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + +The png_set_background() function tells libpng to composite images +with alpha or simple transparency against the supplied background +color. If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid), +you may use this color, or supply another color more suitable for +the current display (e.g., the background color from a web page). You +need to tell libpng whether the color is in the gamma space of the +display (PNG_BACKGROUND_GAMMA_SCREEN for colors you supply), the file +(PNG_BACKGROUND_GAMMA_FILE for colors from the bKGD chunk), or one +that is neither of these gammas (PNG_BACKGROUND_GAMMA_UNIQUE - I don't +know why anyone would use this, but it's here). + +To properly display PNG images on any kind of system, the application needs +to know what the display gamma is. Ideally, the user will know this, and +the application will allow them to set it. One method of allowing the user +to set the display gamma separately for each system is to check for a +SCREEN_GAMMA or DISPLAY_GAMMA environment variable, which will hopefully be +correctly set. + +Note that display_gamma is the overall gamma correction required to produce +pleasing results, which depends on the lighting conditions in the surrounding +environment. In a dim or brightly lit room, no compensation other than +the physical gamma exponent of the monitor is needed, while in a dark room +a slightly smaller exponent is better. + + double gamma, screen_gamma; + + if (/* We have a user-defined screen + gamma value */) + { + screen_gamma = user_defined_screen_gamma; + } + /* One way that applications can share the same + screen gamma value */ + else if ((gamma_str = getenv("SCREEN_GAMMA")) + != NULL) + { + screen_gamma = (double)atof(gamma_str); + } + /* If we don't have another value */ + else + { + screen_gamma = 2.2; /* A good guess for a + PC monitor in a bright office or a dim room */ + screen_gamma = 2.0; /* A good guess for a + PC monitor in a dark room */ + screen_gamma = 1.7 or 1.0; /* A good + guess for Mac systems */ + } + +The png_set_gamma() function handles gamma transformations of the data. +Pass both the file gamma and the current screen_gamma. If the file does +not have a gamma value, you can pass one anyway if you have an idea what +it is (usually 0.45455 is a good guess for GIF images on PCs). Note +that file gammas are inverted from screen gammas. See the discussions +on gamma in the PNG specification for an excellent description of what +gamma is, and why all applications should support it. It is strongly +recommended that PNG viewers support gamma correction. + + if (png_get_gAMA(png_ptr, info_ptr, &gamma)) + png_set_gamma(png_ptr, screen_gamma, gamma); + else + png_set_gamma(png_ptr, screen_gamma, 0.45455); + +If you need to reduce an RGB file to a paletted file, or if a paletted +file has more entries then will fit on your screen, png_set_dither() +will do that. Note that this is a simple match dither that merely +finds the closest color available. This should work fairly well with +optimized palettes, and fairly badly with linear color cubes. If you +pass a palette that is larger then maximum_colors, the file will +reduce the number of colors in the palette so it will fit into +maximum_colors. If there is a histogram, it will use it to make +more intelligent choices when reducing the palette. If there is no +histogram, it may not do as good a job. + + if (color_type & PNG_COLOR_MASK_COLOR) + { + if (png_get_valid(png_ptr, info_ptr, + PNG_INFO_PLTE)) + { + png_uint_16p histogram = NULL; + + png_get_hIST(png_ptr, info_ptr, + &histogram); + png_set_dither(png_ptr, palette, num_palette, + max_screen_colors, histogram, 1); + } + else + { + png_color std_color_cube[MAX_SCREEN_COLORS] = + { ... colors ... }; + + png_set_dither(png_ptr, std_color_cube, + MAX_SCREEN_COLORS, MAX_SCREEN_COLORS, + NULL,0); + } + } + +PNG files describe monochrome as black being zero and white being one. +The following code will reverse this (make black be one and white be +zero): + + if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY) + png_set_invert_mono(png_ptr); + +This function can also be used to invert grayscale and gray-alpha images: + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_invert_mono(png_ptr); + +PNG files store 16 bit pixels in network byte order (big-endian, +ie. most significant bits first). This code changes the storage to the +other way (little-endian, i.e. least significant bits first, the +way PCs store them): + + if (bit_depth == 16) + png_set_swap(png_ptr); + +If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you +need to change the order the pixels are packed into bytes, you can use: + + if (bit_depth < 8) + png_set_packswap(png_ptr); + +Finally, you can write your own transformation function if none of +the existing ones meets your needs. This is done by setting a callback +with + + png_set_read_user_transform_fn(png_ptr, + read_transform_fn); + +You must supply the function + + void read_transform_fn(png_ptr ptr, row_info_ptr + row_info, png_bytep data) + +See pngtest.c for a working example. Your function will be called +after all of the other transformations have been processed. + +You can also set up a pointer to a user structure for use by your +callback function, and you can inform libpng that your transform +function will change the number of channels or bit depth with the +function + + png_set_user_transform_info(png_ptr, user_ptr, + user_depth, user_channels); + +The user's application, not libpng, is responsible for allocating and +freeing any memory required for the user structure. + +You can retrieve the pointer via the function +png_get_user_transform_ptr(). For example: + + voidp read_user_transform_ptr = + png_get_user_transform_ptr(png_ptr); + +The last thing to handle is interlacing; this is covered in detail below, +but you must call the function here if you want libpng to handle expansion +of the interlaced image. + + number_of_passes = png_set_interlace_handling(png_ptr); + +After setting the transformations, libpng can update your png_info +structure to reflect any transformations you've requested with this +call. This is most useful to update the info structure's rowbytes +field so you can use it to allocate your image memory. This function +will also update your palette with the correct screen_gamma and +background if these have been given with the calls above. + + png_read_update_info(png_ptr, info_ptr); + +After you call png_read_update_info(), you can allocate any +memory you need to hold the image. The row data is simply +raw byte data for all forms of images. As the actual allocation +varies among applications, no example will be given. If you +are allocating one large chunk, you will need to build an +array of pointers to each row, as it will be needed for some +of the functions below. + +.SS Reading image data + +After you've allocated memory, you can read the image data. +The simplest way to do this is in one function call. If you are +allocating enough memory to hold the whole image, you can just +call png_read_image() and libpng will read in all the image data +and put it in the memory area supplied. You will need to pass in +an array of pointers to each row. + +This function automatically handles interlacing, so you don't need +to call png_set_interlace_handling() or call this function multiple +times, or any of that other stuff necessary with png_read_rows(). + + png_read_image(png_ptr, row_pointers); + +where row_pointers is: + + png_bytep row_pointers[height]; + +You can point to void or char or whatever you use for pixels. + +If you don't want to read in the whole image at once, you can +use png_read_rows() instead. If there is no interlacing (check +interlace_type == PNG_INTERLACE_NONE), this is simple: + + png_read_rows(png_ptr, row_pointers, NULL, + number_of_rows); + +where row_pointers is the same as in the png_read_image() call. + +If you are doing this just one row at a time, you can do this with +a single row_pointer instead of an array of row_pointers: + + png_bytep row_pointer = row; + png_read_row(png_ptr, row_pointer, NULL); + +If the file is interlaced (interlace_type != 0 in the IHDR chunk), things +get somewhat harder. The only current (PNG Specification version 1.2) +interlacing type for PNG is (interlace_type == PNG_INTERLACE_ADAM7) +is a somewhat complicated 2D interlace scheme, known as Adam7, that +breaks down an image into seven smaller images of varying size, based +on an 8x8 grid. + +libpng can fill out those images or it can give them to you "as is". +If you want them filled out, there are two ways to do that. The one +mentioned in the PNG specification is to expand each pixel to cover +those pixels that have not been read yet (the "rectangle" method). +This results in a blocky image for the first pass, which gradually +smooths out as more pixels are read. The other method is the "sparkle" +method, where pixels are drawn only in their final locations, with the +rest of the image remaining whatever colors they were initialized to +before the start of the read. The first method usually looks better, +but tends to be slower, as there are more pixels to put in the rows. + +If you don't want libpng to handle the interlacing details, just call +png_read_rows() seven times to read in all seven images. Each of the +images is a valid image by itself, or they can all be combined on an +8x8 grid to form a single image (although if you intend to combine them +you would be far better off using the libpng interlace handling). + +The first pass will return an image 1/8 as wide as the entire image +(every 8th column starting in column 0) and 1/8 as high as the original +(every 8th row starting in row 0), the second will be 1/8 as wide +(starting in column 4) and 1/8 as high (also starting in row 0). The +third pass will be 1/4 as wide (every 4th pixel starting in column 0) and +1/8 as high (every 8th row starting in row 4), and the fourth pass will +be 1/4 as wide and 1/4 as high (every 4th column starting in column 2, +and every 4th row starting in row 0). The fifth pass will return an +image 1/2 as wide, and 1/4 as high (starting at column 0 and row 2), +while the sixth pass will be 1/2 as wide and 1/2 as high as the original +(starting in column 1 and row 0). The seventh and final pass will be as +wide as the original, and 1/2 as high, containing all of the odd +numbered scanlines. Phew! + +If you want libpng to expand the images, call this before calling +png_start_read_image() or png_read_update_info(): + + if (interlace_type == PNG_INTERLACE_ADAM7) + number_of_passes + = png_set_interlace_handling(png_ptr); + +This will return the number of passes needed. Currently, this +is seven, but may change if another interlace type is added. +This function can be called even if the file is not interlaced, +where it will return one pass. + +If you are not going to display the image after each pass, but are +going to wait until the entire image is read in, use the sparkle +effect. This effect is faster and the end result of either method +is exactly the same. If you are planning on displaying the image +after each pass, the "rectangle" effect is generally considered the +better looking one. + +If you only want the "sparkle" effect, just call png_read_rows() as +normal, with the third parameter NULL. Make sure you make pass over +the image number_of_passes times, and you don't change the data in the +rows between calls. You can change the locations of the data, just +not the data. Each pass only writes the pixels appropriate for that +pass, and assumes the data from previous passes is still valid. + + png_read_rows(png_ptr, row_pointers, NULL, + number_of_rows); + +If you only want the first effect (the rectangles), do the same as +before except pass the row buffer in the third parameter, and leave +the second parameter NULL. + + png_read_rows(png_ptr, NULL, row_pointers, + number_of_rows); + +.SS Finishing a sequential read + +After you are finished reading the image through the +low-level interface, you can finish reading the file. If you are +interested in comments or time, which may be stored either before or +after the image data, you should pass the separate png_info struct if +you want to keep the comments from before and after the image +separate. If you are not interested, you can pass NULL. + + png_read_end(png_ptr, end_info); + +When you are done, you can free all memory allocated by libpng like this: + + png_destroy_read_struct(&png_ptr, &info_ptr, + &end_info); + +It is also possible to individually free the info_ptr members that +point to libpng-allocated storage with the following function: + + png_free_data(png_ptr, info_ptr, mask, seq) + mask - identifies data to be freed, a mask + containing the bitwise OR of one or + more of + PNG_FREE_PLTE, PNG_FREE_TRNS, + PNG_FREE_HIST, PNG_FREE_ICCP, + PNG_FREE_PCAL, PNG_FREE_ROWS, + PNG_FREE_SCAL, PNG_FREE_SPLT, + PNG_FREE_TEXT, PNG_FREE_UNKN, + or simply PNG_FREE_ALL + seq - sequence number of item to be freed + (-1 for all items) + +This function may be safely called when the relevant storage has +already been freed, or has not yet been allocated, or was allocated +by the user and not by libpng, and will in those +cases do nothing. The "seq" parameter is ignored if only one item +of the selected data type, such as PLTE, is allowed. If "seq" is not +-1, and multiple items are allowed for the data type identified in +the mask, such as text or sPLT, only the n'th item in the structure +is freed, where n is "seq". + +The default behavior is only to free data that was allocated internally +by libpng. This can be changed, so that libpng will not free the data, +or so that it will free data that was allocated by the user with png_malloc() +or png_zalloc() and passed in via a png_set_*() function, with + + png_data_freer(png_ptr, info_ptr, freer, mask) + mask - which data elements are affected + same choices as in png_free_data() + freer - one of + PNG_DESTROY_WILL_FREE_DATA + PNG_SET_WILL_FREE_DATA + PNG_USER_WILL_FREE_DATA + +This function only affects data that has already been allocated. +You can call this function after reading the PNG data but before calling +any png_set_*() functions, to control whether the user or the png_set_*() +function is responsible for freeing any existing data that might be present, +and again after the png_set_*() functions to control whether the user +or png_destroy_*() is supposed to free the data. When the user assumes +responsibility for libpng-allocated data, the application must use +png_free() to free it, and when the user transfers responsibility to libpng +for data that the user has allocated, the user must have used png_malloc() +or png_zalloc() to allocate it. + +If you allocated your row_pointers in a single block, as suggested above in +the description of the high level read interface, you must not transfer +responsibility for freeing it to the png_set_rows or png_read_destroy function, +because they would also try to free the individual row_pointers[i]. + +If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword +separately, do not transfer responsibility for freeing text_ptr to libpng, +because when libpng fills a png_text structure it combines these members with +the key member, and png_free_data() will free only text_ptr.key. Similarly, +if you transfer responsibility for free'ing text_ptr from libpng to your +application, your application must not separately free those members. + +The png_free_data() function will turn off the "valid" flag for anything +it frees. If you need to turn the flag off for a chunk that was freed by your +application instead of by libpng, you can use + + png_set_invalid(png_ptr, info_ptr, mask); + mask - identifies the chunks to be made invalid, + containing the bitwise OR of one or + more of + PNG_INFO_gAMA, PNG_INFO_sBIT, + PNG_INFO_cHRM, PNG_INFO_PLTE, + PNG_INFO_tRNS, PNG_INFO_bKGD, + PNG_INFO_hIST, PNG_INFO_pHYs, + PNG_INFO_oFFs, PNG_INFO_tIME, + PNG_INFO_pCAL, PNG_INFO_sRGB, + PNG_INFO_iCCP, PNG_INFO_sPLT, + PNG_INFO_sCAL, PNG_INFO_IDAT + +For a more compact example of reading a PNG image, see the file example.c. + +.SS Reading PNG files progressively + +The progressive reader is slightly different then the non-progressive +reader. Instead of calling png_read_info(), png_read_rows(), and +png_read_end(), you make one call to png_process_data(), which calls +callbacks when it has the info, a row, or the end of the image. You +set up these callbacks with png_set_progressive_read_fn(). You don't +have to worry about the input/output functions of libpng, as you are +giving the library the data directly in png_process_data(). I will +assume that you have read the section on reading PNG files above, +so I will only highlight the differences (although I will show +all of the code). + +png_structp png_ptr; +png_infop info_ptr; + + /* An example code fragment of how you would + initialize the progressive reader in your + application. */ + int + initialize_png_reader() + { + png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + if (!png_ptr) + return (ERROR); + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, (png_infopp)NULL, + (png_infopp)NULL); + return (ERROR); + } + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + + /* This one's new. You can provide functions + to be called when the header info is valid, + when each row is completed, and when the image + is finished. If you aren't using all functions, + you can specify NULL parameters. Even when all + three functions are NULL, you need to call + png_set_progressive_read_fn(). You can use + any struct as the user_ptr (cast to a void pointer + for the function call), and retrieve the pointer + from inside the callbacks using the function + + png_get_progressive_ptr(png_ptr); + + which will return a void pointer, which you have + to cast appropriately. + */ + png_set_progressive_read_fn(png_ptr, (void *)user_ptr, + info_callback, row_callback, end_callback); + + return 0; + } + + /* A code fragment that you call as you receive blocks + of data */ + int + process_data(png_bytep buffer, png_uint_32 length) + { + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + + /* This one's new also. Simply give it a chunk + of data from the file stream (in order, of + course). On machines with segmented memory + models machines, don't give it any more than + 64K. The library seems to run fine with sizes + of 4K. Although you can give it much less if + necessary (I assume you can give it chunks of + 1 byte, I haven't tried less then 256 bytes + yet). When this function returns, you may + want to display any rows that were generated + in the row callback if you don't already do + so there. + */ + png_process_data(png_ptr, info_ptr, buffer, length); + return 0; + } + + /* This function is called (as set by + png_set_progressive_read_fn() above) when enough data + has been supplied so all of the header has been + read. + */ + void + info_callback(png_structp png_ptr, png_infop info) + { + /* Do any setup here, including setting any of + the transformations mentioned in the Reading + PNG files section. For now, you _must_ call + either png_start_read_image() or + png_read_update_info() after all the + transformations are set (even if you don't set + any). You may start getting rows before + png_process_data() returns, so this is your + last chance to prepare for that. + */ + } + + /* This function is called when each row of image + data is complete */ + void + row_callback(png_structp png_ptr, png_bytep new_row, + png_uint_32 row_num, int pass) + { + /* If the image is interlaced, and you turned + on the interlace handler, this function will + be called for every row in every pass. Some + of these rows will not be changed from the + previous pass. When the row is not changed, + the new_row variable will be NULL. The rows + and passes are called in order, so you don't + really need the row_num and pass, but I'm + supplying them because it may make your life + easier. + + For the non-NULL rows of interlaced images, + you must call png_progressive_combine_row() + passing in the row and the old row. You can + call this function for NULL rows (it will just + return) and for non-interlaced images (it just + does the memcpy for you) if it will make the + code easier. Thus, you can just do this for + all cases: + */ + + png_progressive_combine_row(png_ptr, old_row, + new_row); + + /* where old_row is what was displayed for + previously for the row. Note that the first + pass (pass == 0, really) will completely cover + the old row, so the rows do not have to be + initialized. After the first pass (and only + for interlaced images), you will have to pass + the current row, and the function will combine + the old row and the new row. + */ + } + + void + end_callback(png_structp png_ptr, png_infop info) + { + /* This function is called after the whole image + has been read, including any chunks after the + image (up to and including the IEND). You + will usually have the same info chunk as you + had in the header, although some data may have + been added to the comments and time fields. + + Most people won't do much here, perhaps setting + a flag that marks the image as finished. + */ + } + + + +.SH IV. Writing + +Much of this is very similar to reading. However, everything of +importance is repeated here, so you won't have to constantly look +back up in the reading section to understand writing. + +.SS Setup + +You will want to do the I/O initialization before you get into libpng, +so if it doesn't work, you don't have anything to undo. If you are not +using the standard I/O functions, you will need to replace them with +custom writing functions. See the discussion under Customizing libpng. + + FILE *fp = fopen(file_name, "wb"); + if (!fp) + { + return (ERROR); + } + +Next, png_struct and png_info need to be allocated and initialized. +As these can be both relatively large, you may not want to store these +on the stack, unless you have stack space to spare. Of course, you +will want to check if they return NULL. If you are also reading, +you won't want to name your read structure and your write structure +both "png_ptr"; you can call them anything you like, such as +"read_ptr" and "write_ptr". Look at pngtest.c, for example. + + png_structp png_ptr = png_create_write_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + if (!png_ptr) + return (ERROR); + + png_infop info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_write_struct(&png_ptr, + (png_infopp)NULL); + return (ERROR); + } + +If you want to use your own memory allocation routines, +define PNG_USER_MEM_SUPPORTED and use +png_create_write_struct_2() instead of png_create_write_struct(): + + png_structp png_ptr = png_create_write_struct_2 + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn, (png_voidp) + user_mem_ptr, user_malloc_fn, user_free_fn); + +After you have these structures, you will need to set up the +error handling. When libpng encounters an error, it expects to +longjmp() back to your routine. Therefore, you will need to call +setjmp() and pass the png_jmpbuf(png_ptr). If you +write the file from different routines, you will need to update +the png_jmpbuf(png_ptr) every time you enter a new routine that will +call a png_*() function. See your documentation of setjmp/longjmp +for your compiler for more information on setjmp/longjmp. See +the discussion on libpng error handling in the Customizing Libpng +section below for more information on the libpng error handling. + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_write_struct(&png_ptr, &info_ptr); + fclose(fp); + return (ERROR); + } + ... + return; + +If you would rather avoid the complexity of setjmp/longjmp issues, +you can compile libpng with PNG_SETJMP_NOT_SUPPORTED, in which case +errors will result in a call to PNG_ABORT() which defaults to abort(). + +Now you need to set up the output code. The default for libpng is to +use the C function fwrite(). If you use this, you will need to pass a +valid FILE * in the function png_init_io(). Be sure that the file is +opened in binary mode. Again, if you wish to handle writing data in +another way, see the discussion on libpng I/O handling in the Customizing +Libpng section below. + + png_init_io(png_ptr, fp); + +If you are embedding your PNG into a datastream such as MNG, and don't +want libpng to write the 8-byte signature, or if you have already +written the signature in your application, use + + png_set_sig_bytes(png_ptr, 8); + +to inform libpng that it should not write a signature. + +.SS Write callbacks + +At this point, you can set up a callback function that will be +called after each row has been written, which you can use to control +a progress meter or the like. It's demonstrated in pngtest.c. +You must supply a function + + void write_row_callback(png_ptr, png_uint_32 row, + int pass); + { + /* put your code here */ + } + +(You can give it another name that you like instead of "write_row_callback") + +To inform libpng about your function, use + + png_set_write_status_fn(png_ptr, write_row_callback); + +You now have the option of modifying how the compression library will +run. The following functions are mainly for testing, but may be useful +in some cases, like if you need to write PNG files extremely fast and +are willing to give up some compression, or if you want to get the +maximum possible compression at the expense of slower writing. If you +have no special needs in this area, let the library do what it wants by +not calling this function at all, as it has been tuned to deliver a good +speed/compression ratio. The second parameter to png_set_filter() is +the filter method, for which the only valid values are 0 (as of the +July 1999 PNG specification, version 1.2) or 64 (if you are writing +a PNG datastream that is to be embedded in a MNG datastream). The third +parameter is a flag that indicates which filter type(s) are to be tested +for each scanline. See the PNG specification for details on the specific filter +types. + + + /* turn on or off filtering, and/or choose + specific filters. You can use either a single + PNG_FILTER_VALUE_NAME or the bitwise OR of one + or more PNG_FILTER_NAME masks. */ + png_set_filter(png_ptr, 0, + PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE | + PNG_FILTER_SUB | PNG_FILTER_VALUE_SUB | + PNG_FILTER_UP | PNG_FILTER_VALUE_UP | + PNG_FILTER_AVG | PNG_FILTER_VALUE_AVG | + PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH| + PNG_ALL_FILTERS); + +If an application +wants to start and stop using particular filters during compression, +it should start out with all of the filters (to ensure that the previous +row of pixels will be stored in case it's needed later), and then add +and remove them after the start of compression. + +If you are writing a PNG datastream that is to be embedded in a MNG +datastream, the second parameter can be either 0 or 64. + +The png_set_compression_*() functions interface to the zlib compression +library, and should mostly be ignored unless you really know what you are +doing. The only generally useful call is png_set_compression_level() +which changes how much time zlib spends on trying to compress the image +data. See the Compression Library (zlib.h and algorithm.txt, distributed +with zlib) for details on the compression levels. + + /* set the zlib compression level */ + png_set_compression_level(png_ptr, + Z_BEST_COMPRESSION); + + /* set other zlib parameters */ + png_set_compression_mem_level(png_ptr, 8); + png_set_compression_strategy(png_ptr, + Z_DEFAULT_STRATEGY); + png_set_compression_window_bits(png_ptr, 15); + png_set_compression_method(png_ptr, 8); + png_set_compression_buffer_size(png_ptr, 8192) + +extern PNG_EXPORT(void,png_set_zbuf_size) + +.SS Setting the contents of info for output + +You now need to fill in the png_info structure with all the data you +wish to write before the actual image. Note that the only thing you +are allowed to write after the image is the text chunks and the time +chunk (as of PNG Specification 1.2, anyway). See png_write_end() and +the latest PNG specification for more information on that. If you +wish to write them before the image, fill them in now, and flag that +data as being valid. If you want to wait until after the data, don't +fill them until png_write_end(). For all the fields in png_info and +their data types, see png.h. For explanations of what the fields +contain, see the PNG specification. + +Some of the more important parts of the png_info are: + + png_set_IHDR(png_ptr, info_ptr, width, height, + bit_depth, color_type, interlace_type, + compression_type, filter_method) + width - holds the width of the image + in pixels (up to 2^31). + height - holds the height of the image + in pixels (up to 2^31). + bit_depth - holds the bit depth of one of the + image channels. + (valid values are 1, 2, 4, 8, 16 + and depend also on the + color_type. See also significant + bits (sBIT) below). + color_type - describes which color/alpha + channels are present. + PNG_COLOR_TYPE_GRAY + (bit depths 1, 2, 4, 8, 16) + PNG_COLOR_TYPE_GRAY_ALPHA + (bit depths 8, 16) + PNG_COLOR_TYPE_PALETTE + (bit depths 1, 2, 4, 8) + PNG_COLOR_TYPE_RGB + (bit_depths 8, 16) + PNG_COLOR_TYPE_RGB_ALPHA + (bit_depths 8, 16) + + PNG_COLOR_MASK_PALETTE + PNG_COLOR_MASK_COLOR + PNG_COLOR_MASK_ALPHA + + interlace_type - PNG_INTERLACE_NONE or + PNG_INTERLACE_ADAM7 + compression_type - (must be + PNG_COMPRESSION_TYPE_DEFAULT) + filter_method - (must be PNG_FILTER_TYPE_DEFAULT + or, if you are writing a PNG to + be embedded in a MNG datastream, + can also be + PNG_INTRAPIXEL_DIFFERENCING) + +If you call png_set_IHDR(), the call must appear before any of the +other png_set_*() functions, because they might require access to some of +the IHDR settings. The remaining png_set_*() functions can be called +in any order. + +If you wish, you can reset the compression_type, interlace_type, or +filter_method later by calling png_set_IHDR() again; if you do this, the +width, height, bit_depth, and color_type must be the same in each call. + + png_set_PLTE(png_ptr, info_ptr, palette, + num_palette); + palette - the palette for the file + (array of png_color) + num_palette - number of entries in the palette + + png_set_gAMA(png_ptr, info_ptr, gamma); + gamma - the gamma the image was created + at (PNG_INFO_gAMA) + + png_set_sRGB(png_ptr, info_ptr, srgb_intent); + srgb_intent - the rendering intent + (PNG_INFO_sRGB) The presence of + the sRGB chunk means that the pixel + data is in the sRGB color space. + This chunk also implies specific + values of gAMA and cHRM. Rendering + intent is the CSS-1 property that + has been defined by the International + Color Consortium + (http://www.color.org). + It can be one of + PNG_sRGB_INTENT_SATURATION, + PNG_sRGB_INTENT_PERCEPTUAL, + PNG_sRGB_INTENT_ABSOLUTE, or + PNG_sRGB_INTENT_RELATIVE. + + + png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, + srgb_intent); + srgb_intent - the rendering intent + (PNG_INFO_sRGB) The presence of the + sRGB chunk means that the pixel + data is in the sRGB color space. + This function also causes gAMA and + cHRM chunks with the specific values + that are consistent with sRGB to be + written. + + png_set_iCCP(png_ptr, info_ptr, name, compression_type, + profile, proflen); + name - The profile name. + compression - The compression type; always + PNG_COMPRESSION_TYPE_BASE for PNG 1.0. + You may give NULL to this argument to + ignore it. + profile - International Color Consortium color + profile data. May contain NULs. + proflen - length of profile data in bytes. + + png_set_sBIT(png_ptr, info_ptr, sig_bit); + sig_bit - the number of significant bits for + (PNG_INFO_sBIT) each of the gray, red, + green, and blue channels, whichever are + appropriate for the given color type + (png_color_16) + + png_set_tRNS(png_ptr, info_ptr, trans, num_trans, + trans_values); + trans - array of transparent entries for + palette (PNG_INFO_tRNS) + trans_values - graylevel or color sample values + (in order red, green, blue) of the + single transparent color for + non-paletted images (PNG_INFO_tRNS) + num_trans - number of transparent entries + (PNG_INFO_tRNS) + + png_set_hIST(png_ptr, info_ptr, hist); + (PNG_INFO_hIST) + hist - histogram of palette (array of + png_uint_16) + + png_set_tIME(png_ptr, info_ptr, mod_time); + mod_time - time image was last modified + (PNG_VALID_tIME) + + png_set_bKGD(png_ptr, info_ptr, background); + background - background color (PNG_VALID_bKGD) + + png_set_text(png_ptr, info_ptr, text_ptr, num_text); + text_ptr - array of png_text holding image + comments + text_ptr[i].compression - type of compression used + on "text" PNG_TEXT_COMPRESSION_NONE + PNG_TEXT_COMPRESSION_zTXt + PNG_ITXT_COMPRESSION_NONE + PNG_ITXT_COMPRESSION_zTXt + text_ptr[i].key - keyword for comment. Must contain + 1-79 characters. + text_ptr[i].text - text comments for current + keyword. Can be NULL or empty. + text_ptr[i].text_length - length of text string, + after decompression, 0 for iTXt + text_ptr[i].itxt_length - length of itxt string, + after decompression, 0 for tEXt/zTXt + text_ptr[i].lang - language of comment (NULL or + empty for unknown). + text_ptr[i].translated_keyword - keyword in UTF-8 (NULL + or empty for unknown). + num_text - number of comments + + png_set_sPLT(png_ptr, info_ptr, &palette_ptr, + num_spalettes); + palette_ptr - array of png_sPLT_struct structures + to be added to the list of palettes + in the info structure. + num_spalettes - number of palette structures to be + added. + + png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, + unit_type); + offset_x - positive offset from the left + edge of the screen + offset_y - positive offset from the top + edge of the screen + unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER + + png_set_pHYs(png_ptr, info_ptr, res_x, res_y, + unit_type); + res_x - pixels/unit physical resolution + in x direction + res_y - pixels/unit physical resolution + in y direction + unit_type - PNG_RESOLUTION_UNKNOWN, + PNG_RESOLUTION_METER + + png_set_sCAL(png_ptr, info_ptr, unit, width, height) + unit - physical scale units (an integer) + width - width of a pixel in physical scale units + height - height of a pixel in physical scale units + (width and height are doubles) + + png_set_sCAL_s(png_ptr, info_ptr, unit, width, height) + unit - physical scale units (an integer) + width - width of a pixel in physical scale units + height - height of a pixel in physical scale units + (width and height are strings like "2.54") + + png_set_unknown_chunks(png_ptr, info_ptr, &unknowns, + num_unknowns) + unknowns - array of png_unknown_chunk + structures holding unknown chunks + unknowns[i].name - name of unknown chunk + unknowns[i].data - data of unknown chunk + unknowns[i].size - size of unknown chunk's data + unknowns[i].location - position to write chunk in file + 0: do not write chunk + PNG_HAVE_IHDR: before PLTE + PNG_HAVE_PLTE: before IDAT + PNG_AFTER_IDAT: after IDAT + +The "location" member is set automatically according to +what part of the output file has already been written. +You can change its value after calling png_set_unknown_chunks() +as demonstrated in pngtest.c. Within each of the "locations", +the chunks are sequenced according to their position in the +structure (that is, the value of "i", which is the order in which +the chunk was either read from the input file or defined with +png_set_unknown_chunks). + +A quick word about text and num_text. text is an array of png_text +structures. num_text is the number of valid structures in the array. +Each png_text structure holds a language code, a keyword, a text value, +and a compression type. + +The compression types have the same valid numbers as the compression +types of the image data. Currently, the only valid number is zero. +However, you can store text either compressed or uncompressed, unlike +images, which always have to be compressed. So if you don't want the +text compressed, set the compression type to PNG_TEXT_COMPRESSION_NONE. +Because tEXt and zTXt chunks don't have a language field, if you +specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt +any language code or translated keyword will not be written out. + +Until text gets around 1000 bytes, it is not worth compressing it. +After the text has been written out to the file, the compression type +is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR, +so that it isn't written out again at the end (in case you are calling +png_write_end() with the same struct. + +The keywords that are given in the PNG Specification are: + + Title Short (one line) title or + caption for image + Author Name of image's creator + Description Description of image (possibly long) + Copyright Copyright notice + Creation Time Time of original image creation + (usually RFC 1123 format, see below) + Software Software used to create the image + Disclaimer Legal disclaimer + Warning Warning of nature of content + Source Device used to create the image + Comment Miscellaneous comment; conversion + from other image format + +The keyword-text pairs work like this. Keywords should be short +simple descriptions of what the comment is about. Some typical +keywords are found in the PNG specification, as is some recommendations +on keywords. You can repeat keywords in a file. You can even write +some text before the image and some after. For example, you may want +to put a description of the image before the image, but leave the +disclaimer until after, so viewers working over modem connections +don't have to wait for the disclaimer to go over the modem before +they start seeing the image. Finally, keywords should be full +words, not abbreviations. Keywords and text are in the ISO 8859-1 +(Latin-1) character set (a superset of regular ASCII) and can not +contain NUL characters, and should not contain control or other +unprintable characters. To make the comments widely readable, stick +with basic ASCII, and avoid machine specific character set extensions +like the IBM-PC character set. The keyword must be present, but +you can leave off the text string on non-compressed pairs. +Compressed pairs must have a text string, as only the text string +is compressed anyway, so the compression would be meaningless. + +PNG supports modification time via the png_time structure. Two +conversion routines are provided, png_convert_from_time_t() for +time_t and png_convert_from_struct_tm() for struct tm. The +time_t routine uses gmtime(). You don't have to use either of +these, but if you wish to fill in the png_time structure directly, +you should provide the time in universal time (GMT) if possible +instead of your local time. Note that the year number is the full +year (e.g. 1998, rather than 98 - PNG is year 2000 compliant!), and +that months start with 1. + +If you want to store the time of the original image creation, you should +use a plain tEXt chunk with the "Creation Time" keyword. This is +necessary because the "creation time" of a PNG image is somewhat vague, +depending on whether you mean the PNG file, the time the image was +created in a non-PNG format, a still photo from which the image was +scanned, or possibly the subject matter itself. In order to facilitate +machine-readable dates, it is recommended that the "Creation Time" +tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"), +although this isn't a requirement. Unlike the tIME chunk, the +"Creation Time" tEXt chunk is not expected to be automatically changed +by the software. To facilitate the use of RFC 1123 dates, a function +png_convert_to_rfc1123(png_timep) is provided to convert from PNG +time to an RFC 1123 format string. + +.SS Writing unknown chunks + +You can use the png_set_unknown_chunks function to queue up chunks +for writing. You give it a chunk name, raw data, and a size; that's +all there is to it. The chunks will be written by the next following +png_write_info_before_PLTE, png_write_info, or png_write_end function. +Any chunks previously read into the info structure's unknown-chunk +list will also be written out in a sequence that satisfies the PNG +specification's ordering rules. + +.SS The high-level write interface + +At this point there are two ways to proceed; through the high-level +write interface, or through a sequence of low-level write operations. +You can use the high-level interface if your image data is present +in the info structure. All defined output +transformations are permitted, enabled by the following masks. + + PNG_TRANSFORM_IDENTITY No transformation + PNG_TRANSFORM_PACKING Pack 1, 2 and 4-bit samples + PNG_TRANSFORM_PACKSWAP Change order of packed + pixels to LSB first + PNG_TRANSFORM_INVERT_MONO Invert monochrome images + PNG_TRANSFORM_SHIFT Normalize pixels to the + sBIT depth + PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA + to BGRA + PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA + to AG + PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity + to transparency + PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples + PNG_TRANSFORM_STRIP_FILLER Strip out filler + bytes (deprecated). + PNG_TRANSFORM_STRIP_FILLER_BEFORE Strip out leading + filler bytes + PNG_TRANSFORM_STRIP_FILLER_AFTER Strip out trailing + filler bytes + +If you have valid image data in the info structure (you can use +png_set_rows() to put image data in the info structure), simply do this: + + png_write_png(png_ptr, info_ptr, png_transforms, NULL) + +where png_transforms is an integer containing the bitwise OR of some set of +transformation flags. This call is equivalent to png_write_info(), +followed the set of transformations indicated by the transform mask, +then png_write_image(), and finally png_write_end(). + +(The final parameter of this call is not yet used. Someday it might point +to transformation parameters required by some future output transform.) + +You must use png_transforms and not call any png_set_transform() functions +when you use png_write_png(). + +.SS The low-level write interface + +If you are going the low-level route instead, you are now ready to +write all the file information up to the actual image data. You do +this with a call to png_write_info(). + + png_write_info(png_ptr, info_ptr); + +Note that there is one transformation you may need to do before +png_write_info(). In PNG files, the alpha channel in an image is the +level of opacity. If your data is supplied as a level of +transparency, you can invert the alpha channel before you write it, so +that 0 is fully transparent and 255 (in 8-bit or paletted images) or +65535 (in 16-bit images) is fully opaque, with + + png_set_invert_alpha(png_ptr); + +This must appear before png_write_info() instead of later with the +other transformations because in the case of paletted images the tRNS +chunk data has to be inverted before the tRNS chunk is written. If +your image is not a paletted image, the tRNS data (which in such cases +represents a single color to be rendered as transparent) won't need to +be changed, and you can safely do this transformation after your +png_write_info() call. + +If you need to write a private chunk that you want to appear before +the PLTE chunk when PLTE is present, you can write the PNG info in +two steps, and insert code to write your own chunk between them: + + png_write_info_before_PLTE(png_ptr, info_ptr); + png_set_unknown_chunks(png_ptr, info_ptr, ...); + png_write_info(png_ptr, info_ptr); + +After you've written the file information, you can set up the library +to handle any special transformations of the image data. The various +ways to transform the data will be described in the order that they +should occur. This is important, as some of these change the color +type and/or bit depth of the data, and some others only work on +certain color types and bit depths. Even though each transformation +checks to see if it has data that it can do something with, you should +make sure to only enable a transformation if it will be valid for the +data. For example, don't swap red and blue on grayscale data. + +PNG files store RGB pixels packed into 3 or 6 bytes. This code tells +the library to strip input data that has 4 or 8 bytes per pixel down +to 3 or 6 bytes (or strip 2 or 4-byte grayscale+filler data to 1 or 2 +bytes per pixel). + + png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); + +where the 0 is unused, and the location is either PNG_FILLER_BEFORE or +PNG_FILLER_AFTER, depending upon whether the filler byte in the pixel +is stored XRGB or RGBX. + +PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as +they can, resulting in, for example, 8 pixels per byte for 1 bit files. +If the data is supplied at 1 pixel per byte, use this code, which will +correctly pack the pixels into a single byte: + + png_set_packing(png_ptr); + +PNG files reduce possible bit depths to 1, 2, 4, 8, and 16. If your +data is of another bit depth, you can write an sBIT chunk into the +file so that decoders can recover the original data if desired. + + /* Set the true bit depth of the image data */ + if (color_type & PNG_COLOR_MASK_COLOR) + { + sig_bit.red = true_bit_depth; + sig_bit.green = true_bit_depth; + sig_bit.blue = true_bit_depth; + } + else + { + sig_bit.gray = true_bit_depth; + } + if (color_type & PNG_COLOR_MASK_ALPHA) + { + sig_bit.alpha = true_bit_depth; + } + + png_set_sBIT(png_ptr, info_ptr, &sig_bit); + +If the data is stored in the row buffer in a bit depth other than +one supported by PNG (e.g. 3 bit data in the range 0-7 for a 4-bit PNG), +this will scale the values to appear to be the correct bit depth as +is required by PNG. + + png_set_shift(png_ptr, &sig_bit); + +PNG files store 16 bit pixels in network byte order (big-endian, +ie. most significant bits first). This code would be used if they are +supplied the other way (little-endian, i.e. least significant bits +first, the way PCs store them): + + if (bit_depth > 8) + png_set_swap(png_ptr); + +If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you +need to change the order the pixels are packed into bytes, you can use: + + if (bit_depth < 8) + png_set_packswap(png_ptr); + +PNG files store 3 color pixels in red, green, blue order. This code +would be used if they are supplied as blue, green, red: + + png_set_bgr(png_ptr); + +PNG files describe monochrome as black being zero and white being +one. This code would be used if the pixels are supplied with this reversed +(black being one and white being zero): + + png_set_invert_mono(png_ptr); + +Finally, you can write your own transformation function if none of +the existing ones meets your needs. This is done by setting a callback +with + + png_set_write_user_transform_fn(png_ptr, + write_transform_fn); + +You must supply the function + + void write_transform_fn(png_ptr ptr, row_info_ptr + row_info, png_bytep data) + +See pngtest.c for a working example. Your function will be called +before any of the other transformations are processed. + +You can also set up a pointer to a user structure for use by your +callback function. + + png_set_user_transform_info(png_ptr, user_ptr, 0, 0); + +The user_channels and user_depth parameters of this function are ignored +when writing; you can set them to zero as shown. + +You can retrieve the pointer via the function png_get_user_transform_ptr(). +For example: + + voidp write_user_transform_ptr = + png_get_user_transform_ptr(png_ptr); + +It is possible to have libpng flush any pending output, either manually, +or automatically after a certain number of lines have been written. To +flush the output stream a single time call: + + png_write_flush(png_ptr); + +and to have libpng flush the output stream periodically after a certain +number of scanlines have been written, call: + + png_set_flush(png_ptr, nrows); + +Note that the distance between rows is from the last time png_write_flush() +was called, or the first row of the image if it has never been called. +So if you write 50 lines, and then png_set_flush 25, it will flush the +output on the next scanline, and every 25 lines thereafter, unless +png_write_flush() is called before 25 more lines have been written. +If nrows is too small (less than about 10 lines for a 640 pixel wide +RGB image) the image compression may decrease noticeably (although this +may be acceptable for real-time applications). Infrequent flushing will +only degrade the compression performance by a few percent over images +that do not use flushing. + +.SS Writing the image data + +That's it for the transformations. Now you can write the image data. +The simplest way to do this is in one function call. If you have the +whole image in memory, you can just call png_write_image() and libpng +will write the image. You will need to pass in an array of pointers to +each row. This function automatically handles interlacing, so you don't +need to call png_set_interlace_handling() or call this function multiple +times, or any of that other stuff necessary with png_write_rows(). + + png_write_image(png_ptr, row_pointers); + +where row_pointers is: + + png_byte *row_pointers[height]; + +You can point to void or char or whatever you use for pixels. + +If you don't want to write the whole image at once, you can +use png_write_rows() instead. If the file is not interlaced, +this is simple: + + png_write_rows(png_ptr, row_pointers, + number_of_rows); + +row_pointers is the same as in the png_write_image() call. + +If you are just writing one row at a time, you can do this with +a single row_pointer instead of an array of row_pointers: + + png_bytep row_pointer = row; + + png_write_row(png_ptr, row_pointer); + +When the file is interlaced, things can get a good deal more +complicated. The only currently (as of the PNG Specification +version 1.2, dated July 1999) defined interlacing scheme for PNG files +is the "Adam7" interlace scheme, that breaks down an +image into seven smaller images of varying size. libpng will build +these images for you, or you can do them yourself. If you want to +build them yourself, see the PNG specification for details of which +pixels to write when. + +If you don't want libpng to handle the interlacing details, just +use png_set_interlace_handling() and call png_write_rows() the +correct number of times to write all seven sub-images. + +If you want libpng to build the sub-images, call this before you start +writing any rows: + + number_of_passes = + png_set_interlace_handling(png_ptr); + +This will return the number of passes needed. Currently, this +is seven, but may change if another interlace type is added. + +Then write the complete image number_of_passes times. + + png_write_rows(png_ptr, row_pointers, + number_of_rows); + +As some of these rows are not used, and thus return immediately, +you may want to read about interlacing in the PNG specification, +and only update the rows that are actually used. + +.SS Finishing a sequential write + +After you are finished writing the image, you should finish writing +the file. If you are interested in writing comments or time, you should +pass an appropriately filled png_info pointer. If you are not interested, +you can pass NULL. + + png_write_end(png_ptr, info_ptr); + +When you are done, you can free all memory used by libpng like this: + + png_destroy_write_struct(&png_ptr, &info_ptr); + +It is also possible to individually free the info_ptr members that +point to libpng-allocated storage with the following function: + + png_free_data(png_ptr, info_ptr, mask, seq) + mask - identifies data to be freed, a mask + containing the bitwise OR of one or + more of + PNG_FREE_PLTE, PNG_FREE_TRNS, + PNG_FREE_HIST, PNG_FREE_ICCP, + PNG_FREE_PCAL, PNG_FREE_ROWS, + PNG_FREE_SCAL, PNG_FREE_SPLT, + PNG_FREE_TEXT, PNG_FREE_UNKN, + or simply PNG_FREE_ALL + seq - sequence number of item to be freed + (-1 for all items) + +This function may be safely called when the relevant storage has +already been freed, or has not yet been allocated, or was allocated +by the user and not by libpng, and will in those +cases do nothing. The "seq" parameter is ignored if only one item +of the selected data type, such as PLTE, is allowed. If "seq" is not +-1, and multiple items are allowed for the data type identified in +the mask, such as text or sPLT, only the n'th item in the structure +is freed, where n is "seq". + +If you allocated data such as a palette that you passed +in to libpng with png_set_*, you must not free it until just before the call to +png_destroy_write_struct(). + +The default behavior is only to free data that was allocated internally +by libpng. This can be changed, so that libpng will not free the data, +or so that it will free data that was allocated by the user with png_malloc() +or png_zalloc() and passed in via a png_set_*() function, with + + png_data_freer(png_ptr, info_ptr, freer, mask) + mask - which data elements are affected + same choices as in png_free_data() + freer - one of + PNG_DESTROY_WILL_FREE_DATA + PNG_SET_WILL_FREE_DATA + PNG_USER_WILL_FREE_DATA + +For example, to transfer responsibility for some data from a read structure +to a write structure, you could use + + png_data_freer(read_ptr, read_info_ptr, + PNG_USER_WILL_FREE_DATA, + PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) + png_data_freer(write_ptr, write_info_ptr, + PNG_DESTROY_WILL_FREE_DATA, + PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) + +thereby briefly reassigning responsibility for freeing to the user but +immediately afterwards reassigning it once more to the write_destroy +function. Having done this, it would then be safe to destroy the read +structure and continue to use the PLTE, tRNS, and hIST data in the write +structure. + +This function only affects data that has already been allocated. +You can call this function before calling after the png_set_*() functions +to control whether the user or png_destroy_*() is supposed to free the data. +When the user assumes responsibility for libpng-allocated data, the +application must use +png_free() to free it, and when the user transfers responsibility to libpng +for data that the user has allocated, the user must have used png_malloc() +or png_zalloc() to allocate it. + +If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword +separately, do not transfer responsibility for freeing text_ptr to libpng, +because when libpng fills a png_text structure it combines these members with +the key member, and png_free_data() will free only text_ptr.key. Similarly, +if you transfer responsibility for free'ing text_ptr from libpng to your +application, your application must not separately free those members. +For a more compact example of writing a PNG image, see the file example.c. + +.SH V. Modifying/Customizing libpng: + +There are two issues here. The first is changing how libpng does +standard things like memory allocation, input/output, and error handling. +The second deals with more complicated things like adding new chunks, +adding new transformations, and generally changing how libpng works. +Both of those are compile-time issues; that is, they are generally +determined at the time the code is written, and there is rarely a need +to provide the user with a means of changing them. + +Memory allocation, input/output, and error handling + +All of the memory allocation, input/output, and error handling in libpng +goes through callbacks that are user-settable. The default routines are +in pngmem.c, pngrio.c, pngwio.c, and pngerror.c, respectively. To change +these functions, call the appropriate png_set_*_fn() function. + +Memory allocation is done through the functions png_malloc() +and png_free(). These currently just call the standard C functions. If +your pointers can't access more then 64K at a time, you will want to set +MAXSEG_64K in zlib.h. Since it is unlikely that the method of handling +memory allocation on a platform will change between applications, these +functions must be modified in the library at compile time. If you prefer +to use a different method of allocating and freeing data, you can use +png_create_read_struct_2() or png_create_write_struct_2() to register +your own functions as described above. +These functions also provide a void pointer that can be retrieved via + + mem_ptr=png_get_mem_ptr(png_ptr); + +Your replacement memory functions must have prototypes as follows: + + png_voidp malloc_fn(png_structp png_ptr, + png_size_t size); + void free_fn(png_structp png_ptr, png_voidp ptr); + +Your malloc_fn() must return NULL in case of failure. The png_malloc() +function will normally call png_error() if it receives a NULL from the +system memory allocator or from your replacement malloc_fn(). + +Your free_fn() will never be called with a NULL ptr, since libpng's +png_free() checks for NULL before calling free_fn(). + +Input/Output in libpng is done through png_read() and png_write(), +which currently just call fread() and fwrite(). The FILE * is stored in +png_struct and is initialized via png_init_io(). If you wish to change +the method of I/O, the library supplies callbacks that you can set +through the function png_set_read_fn() and png_set_write_fn() at run +time, instead of calling the png_init_io() function. These functions +also provide a void pointer that can be retrieved via the function +png_get_io_ptr(). For example: + + png_set_read_fn(png_structp read_ptr, + voidp read_io_ptr, png_rw_ptr read_data_fn) + + png_set_write_fn(png_structp write_ptr, + voidp write_io_ptr, png_rw_ptr write_data_fn, + png_flush_ptr output_flush_fn); + + voidp read_io_ptr = png_get_io_ptr(read_ptr); + voidp write_io_ptr = png_get_io_ptr(write_ptr); + +The replacement I/O functions must have prototypes as follows: + + void user_read_data(png_structp png_ptr, + png_bytep data, png_size_t length); + void user_write_data(png_structp png_ptr, + png_bytep data, png_size_t length); + void user_flush_data(png_structp png_ptr); + +The user_read_data() function is responsible for detecting and +handling end-of-data errors. + +Supplying NULL for the read, write, or flush functions sets them back +to using the default C stream functions, which expect the io_ptr to +point to a standard *FILE structure. It is probably a mistake +to use NULL for one of write_data_fn and output_flush_fn but not both +of them, unless you have built libpng with PNG_NO_WRITE_FLUSH defined. +It is an error to read from a write stream, and vice versa. + +Error handling in libpng is done through png_error() and png_warning(). +Errors handled through png_error() are fatal, meaning that png_error() +should never return to its caller. Currently, this is handled via +setjmp() and longjmp() (unless you have compiled libpng with +PNG_SETJMP_NOT_SUPPORTED, in which case it is handled via PNG_ABORT()), +but you could change this to do things like exit() if you should wish. + +On non-fatal errors, png_warning() is called +to print a warning message, and then control returns to the calling code. +By default png_error() and png_warning() print a message on stderr via +fprintf() unless the library is compiled with PNG_NO_CONSOLE_IO defined +(because you don't want the messages) or PNG_NO_STDIO defined (because +fprintf() isn't available). If you wish to change the behavior of the error +functions, you will need to set up your own message callbacks. These +functions are normally supplied at the time that the png_struct is created. +It is also possible to redirect errors and warnings to your own replacement +functions after png_create_*_struct() has been called by calling: + + png_set_error_fn(png_structp png_ptr, + png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warning_fn); + + png_voidp error_ptr = png_get_error_ptr(png_ptr); + +If NULL is supplied for either error_fn or warning_fn, then the libpng +default function will be used, calling fprintf() and/or longjmp() if a +problem is encountered. The replacement error functions should have +parameters as follows: + + void user_error_fn(png_structp png_ptr, + png_const_charp error_msg); + void user_warning_fn(png_structp png_ptr, + png_const_charp warning_msg); + +The motivation behind using setjmp() and longjmp() is the C++ throw and +catch exception handling methods. This makes the code much easier to write, +as there is no need to check every return code of every function call. +However, there are some uncertainties about the status of local variables +after a longjmp, so the user may want to be careful about doing anything after +setjmp returns non-zero besides returning itself. Consult your compiler +documentation for more details. For an alternative approach, you may wish +to use the "cexcept" facility (see http://cexcept.sourceforge.net). + +.SS Custom chunks + +If you need to read or write custom chunks, you may need to get deeper +into the libpng code. The library now has mechanisms for storing +and writing chunks of unknown type; you can even declare callbacks +for custom chunks. However, this may not be good enough if the +library code itself needs to know about interactions between your +chunk and existing `intrinsic' chunks. + +If you need to write a new intrinsic chunk, first read the PNG +specification. Acquire a first level of +understanding of how it works. Pay particular attention to the +sections that describe chunk names, and look at how other chunks were +designed, so you can do things similarly. Second, check out the +sections of libpng that read and write chunks. Try to find a chunk +that is similar to yours and use it as a template. More details can +be found in the comments inside the code. It is best to handle unknown +chunks in a generic method, via callback functions, instead of by +modifying libpng functions. + +If you wish to write your own transformation for the data, look through +the part of the code that does the transformations, and check out some of +the simpler ones to get an idea of how they work. Try to find a similar +transformation to the one you want to add and copy off of it. More details +can be found in the comments inside the code itself. + +.SS Configuring for 16 bit platforms + +You will want to look into zconf.h to tell zlib (and thus libpng) that +it cannot allocate more then 64K at a time. Even if you can, the memory +won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K. + +.SS Configuring for DOS + +For DOS users who only have access to the lower 640K, you will +have to limit zlib's memory usage via a png_set_compression_mem_level() +call. See zlib.h or zconf.h in the zlib library for more information. + +.SS Configuring for Medium Model + +Libpng's support for medium model has been tested on most of the popular +compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets +defined, and FAR gets defined to far in pngconf.h, and you should be +all set. Everything in the library (except for zlib's structure) is +expecting far data. You must use the typedefs with the p or pp on +the end for pointers (or at least look at them and be careful). Make +note that the rows of data are defined as png_bytepp, which is an +unsigned char far * far *. + +.SS Configuring for gui/windowing platforms: + +You will need to write new error and warning functions that use the GUI +interface, as described previously, and set them to be the error and +warning functions at the time that png_create_*_struct() is called, +in order to have them available during the structure initialization. +They can be changed later via png_set_error_fn(). On some compilers, +you may also have to change the memory allocators (png_malloc, etc.). + +.SS Configuring for compiler xxx: + +All includes for libpng are in pngconf.h. If you need to add, change +or delete an include, this is the place to do it. +The includes that are not needed outside libpng are protected by the +PNG_INTERNAL definition, which is only defined for those routines inside +libpng itself. The files in libpng proper only include png.h, which +includes pngconf.h. + +.SS Configuring zlib: + +There are special functions to configure the compression. Perhaps the +most useful one changes the compression level, which currently uses +input compression values in the range 0 - 9. The library normally +uses the default compression level (Z_DEFAULT_COMPRESSION = 6). Tests +have shown that for a large majority of images, compression values in +the range 3-6 compress nearly as well as higher levels, and do so much +faster. For online applications it may be desirable to have maximum speed +(Z_BEST_SPEED = 1). With versions of zlib after v0.99, you can also +specify no compression (Z_NO_COMPRESSION = 0), but this would create +files larger than just storing the raw bitmap. You can specify the +compression level by calling: + + png_set_compression_level(png_ptr, level); + +Another useful one is to reduce the memory level used by the library. +The memory level defaults to 8, but it can be lowered if you are +short on memory (running DOS, for example, where you only have 640K). +Note that the memory level does have an effect on compression; among +other things, lower levels will result in sections of incompressible +data being emitted in smaller stored blocks, with a correspondingly +larger relative overhead of up to 15% in the worst case. + + png_set_compression_mem_level(png_ptr, level); + +The other functions are for configuring zlib. They are not recommended +for normal use and may result in writing an invalid PNG file. See +zlib.h for more information on what these mean. + + png_set_compression_strategy(png_ptr, + strategy); + png_set_compression_window_bits(png_ptr, + window_bits); + png_set_compression_method(png_ptr, method); + png_set_compression_buffer_size(png_ptr, size); + +.SS Controlling row filtering + +If you want to control whether libpng uses filtering or not, which +filters are used, and how it goes about picking row filters, you +can call one of these functions. The selection and configuration +of row filters can have a significant impact on the size and +encoding speed and a somewhat lesser impact on the decoding speed +of an image. Filtering is enabled by default for RGB and grayscale +images (with and without alpha), but not for paletted images nor +for any images with bit depths less than 8 bits/pixel. + +The 'method' parameter sets the main filtering method, which is +currently only '0' in the PNG 1.2 specification. The 'filters' +parameter sets which filter(s), if any, should be used for each +scanline. Possible values are PNG_ALL_FILTERS and PNG_NO_FILTERS +to turn filtering on and off, respectively. + +Individual filter types are PNG_FILTER_NONE, PNG_FILTER_SUB, +PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH, which can be bitwise +ORed together with '|' to specify one or more filters to use. +These filters are described in more detail in the PNG specification. +If you intend to change the filter type during the course of writing +the image, you should start with flags set for all of the filters +you intend to use so that libpng can initialize its internal +structures appropriately for all of the filter types. (Note that this +means the first row must always be adaptively filtered, because libpng +currently does not allocate the filter buffers until png_write_row() +is called for the first time.) + + filters = PNG_FILTER_NONE | PNG_FILTER_SUB + PNG_FILTER_UP | PNG_FILTER_AVG | + PNG_FILTER_PAETH | PNG_ALL_FILTERS; + + png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, + filters); + The second parameter can also be + PNG_INTRAPIXEL_DIFFERENCING if you are + writing a PNG to be embedded in a MNG + datastream. This parameter must be the + same as the value of filter_method used + in png_set_IHDR(). + +It is also possible to influence how libpng chooses from among the +available filters. This is done in one or both of two ways - by +telling it how important it is to keep the same filter for successive +rows, and by telling it the relative computational costs of the filters. + + double weights[3] = {1.5, 1.3, 1.1}, + costs[PNG_FILTER_VALUE_LAST] = + {1.0, 1.3, 1.3, 1.5, 1.7}; + + png_set_filter_heuristics(png_ptr, + PNG_FILTER_HEURISTIC_WEIGHTED, 3, + weights, costs); + +The weights are multiplying factors that indicate to libpng that the +row filter should be the same for successive rows unless another row filter +is that many times better than the previous filter. In the above example, +if the previous 3 filters were SUB, SUB, NONE, the SUB filter could have a +"sum of absolute differences" 1.5 x 1.3 times higher than other filters +and still be chosen, while the NONE filter could have a sum 1.1 times +higher than other filters and still be chosen. Unspecified weights are +taken to be 1.0, and the specified weights should probably be declining +like those above in order to emphasize recent filters over older filters. + +The filter costs specify for each filter type a relative decoding cost +to be considered when selecting row filters. This means that filters +with higher costs are less likely to be chosen over filters with lower +costs, unless their "sum of absolute differences" is that much smaller. +The costs do not necessarily reflect the exact computational speeds of +the various filters, since this would unduly influence the final image +size. + +Note that the numbers above were invented purely for this example and +are given only to help explain the function usage. Little testing has +been done to find optimum values for either the costs or the weights. + +.SS Removing unwanted object code + +There are a bunch of #define's in pngconf.h that control what parts of +libpng are compiled. All the defines end in _SUPPORTED. If you are +never going to use a capability, you can change the #define to #undef +before recompiling libpng and save yourself code and data space, or +you can turn off individual capabilities with defines that begin with +PNG_NO_. + +You can also turn all of the transforms and ancillary chunk capabilities +off en masse with compiler directives that define +PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS, +or all four, +along with directives to turn on any of the capabilities that you do +want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable +the extra transformations but still leave the library fully capable of reading +and writing PNG files with all known public chunks +Use of the PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive +produces a library that is incapable of reading or writing ancillary chunks. +If you are not using the progressive reading capability, you can +turn that off with PNG_NO_PROGRESSIVE_READ (don't confuse +this with the INTERLACING capability, which you'll still have). + +All the reading and writing specific code are in separate files, so the +linker should only grab the files it needs. However, if you want to +make sure, or if you are building a stand alone library, all the +reading files start with pngr and all the writing files start with +pngw. The files that don't match either (like png.c, pngtrans.c, etc.) +are used for both reading and writing, and always need to be included. +The progressive reader is in pngpread.c + +If you are creating or distributing a dynamically linked library (a .so +or DLL file), you should not remove or disable any parts of the library, +as this will cause applications linked with different versions of the +library to fail if they call functions not available in your library. +The size of the library itself should not be an issue, because only +those sections that are actually used will be loaded into memory. + +.SS Requesting debug printout + +The macro definition PNG_DEBUG can be used to request debugging +printout. Set it to an integer value in the range 0 to 3. Higher +numbers result in increasing amounts of debugging information. The +information is printed to the "stderr" file, unless another file +name is specified in the PNG_DEBUG_FILE macro definition. + +When PNG_DEBUG > 0, the following functions (macros) become available: + + png_debug(level, message) + png_debug1(level, message, p1) + png_debug2(level, message, p1, p2) + +in which "level" is compared to PNG_DEBUG to decide whether to print +the message, "message" is the formatted string to be printed, +and p1 and p2 are parameters that are to be embedded in the string +according to printf-style formatting directives. For example, + + png_debug1(2, "foo=%d\n", foo); + +is expanded to + + if(PNG_DEBUG > 2) + fprintf(PNG_DEBUG_FILE, "foo=%d\n", foo); + +When PNG_DEBUG is defined but is zero, the macros aren't defined, but you +can still use PNG_DEBUG to control your own debugging: + + #ifdef PNG_DEBUG + fprintf(stderr, ... + #endif + +When PNG_DEBUG = 1, the macros are defined, but only png_debug statements +having level = 0 will be printed. There aren't any such statements in +this version of libpng, but if you insert some they will be printed. + +.SH VI. MNG support + +The MNG specification (available at http://www.libpng.org/pub/mng) allows +certain extensions to PNG for PNG images that are embedded in MNG datastreams. +Libpng can support some of these extensions. To enable them, use the +png_permit_mng_features() function: + + feature_set = png_permit_mng_features(png_ptr, mask) + mask is a png_uint_32 containing the bitwise OR of the + features you want to enable. These include + PNG_FLAG_MNG_EMPTY_PLTE + PNG_FLAG_MNG_FILTER_64 + PNG_ALL_MNG_FEATURES + feature_set is a png_uint_32 that is the bitwise AND of + your mask with the set of MNG features that is + supported by the version of libpng that you are using. + +It is an error to use this function when reading or writing a standalone +PNG file with the PNG 8-byte signature. The PNG datastream must be wrapped +in a MNG datastream. As a minimum, it must have the MNG 8-byte signature +and the MHDR and MEND chunks. Libpng does not provide support for these +or any other MNG chunks; your application must provide its own support for +them. You may wish to consider using libmng (available at +http://www.libmng.com) instead. + +.SH VII. Changes to Libpng from version 0.88 + +It should be noted that versions of libpng later than 0.96 are not +distributed by the original libpng author, Guy Schalnat, nor by +Andreas Dilger, who had taken over from Guy during 1996 and 1997, and +distributed versions 0.89 through 0.96, but rather by another member +of the original PNG Group, Glenn Randers-Pehrson. Guy and Andreas are +still alive and well, but they have moved on to other things. + +The old libpng functions png_read_init(), png_write_init(), +png_info_init(), png_read_destroy(), and png_write_destroy() have been +moved to PNG_INTERNAL in version 0.95 to discourage their use. These +functions will be removed from libpng version 2.0.0. + +The preferred method of creating and initializing the libpng structures is +via the png_create_read_struct(), png_create_write_struct(), and +png_create_info_struct() because they isolate the size of the structures +from the application, allow version error checking, and also allow the +use of custom error handling routines during the initialization, which +the old functions do not. The functions png_read_destroy() and +png_write_destroy() do not actually free the memory that libpng +allocated for these structs, but just reset the data structures, so they +can be used instead of png_destroy_read_struct() and +png_destroy_write_struct() if you feel there is too much system overhead +allocating and freeing the png_struct for each image read. + +Setting the error callbacks via png_set_message_fn() before +png_read_init() as was suggested in libpng-0.88 is no longer supported +because this caused applications that do not use custom error functions +to fail if the png_ptr was not initialized to zero. It is still possible +to set the error callbacks AFTER png_read_init(), or to change them with +png_set_error_fn(), which is essentially the same function, but with a new +name to force compilation errors with applications that try to use the old +method. + +Starting with version 1.0.7, you can find out which version of the library +you are using at run-time: + + png_uint_32 libpng_vn = png_access_version_number(); + +The number libpng_vn is constructed from the major version, minor +version with leading zero, and release number with leading zero, +(e.g., libpng_vn for version 1.0.7 is 10007). + +You can also check which version of png.h you used when compiling your +application: + + png_uint_32 application_vn = PNG_LIBPNG_VER; + +.SH VIII. Changes to Libpng from version 1.0.x to 1.2.x + +Support for user memory management was enabled by default. To +accomplish this, the functions png_create_read_struct_2(), +png_create_write_struct_2(), png_set_mem_fn(), png_get_mem_ptr(), +png_malloc_default(), and png_free_default() were added. + +Support for certain MNG features was enabled. + +Support for numbered error messages was added. However, we never got +around to actually numbering the error messages. The function +png_set_strip_error_numbers() was added (Note: the prototype for this +function was inadvertently removed from png.h in PNG_NO_ASSEMBLER_CODE +builds of libpng-1.2.15. It was restored in libpng-1.2.36). + +The png_malloc_warn() function was added at libpng-1.2.3. This issues +a png_warning and returns NULL instead of aborting when it fails to +acquire the requested memory allocation. + +Support for setting user limits on image width and height was enabled +by default. The functions png_set_user_limits(), png_get_user_width_max(), +and png_get_user_height_max() were added at libpng-1.2.6. + +The png_set_add_alpha() function was added at libpng-1.2.7. + +The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9. +Unlike png_set_gray_1_2_4_to_8(), the new function does not expand the +tRNS chunk to alpha. The png_set_gray_1_2_4_to_8() function is +deprecated. + +A number of macro definitions in support of runtime selection of +assembler code features (especially Intel MMX code support) were +added at libpng-1.2.0: + + PNG_ASM_FLAG_MMX_SUPPORT_COMPILED + PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU + PNG_ASM_FLAG_MMX_READ_COMBINE_ROW + PNG_ASM_FLAG_MMX_READ_INTERLACE + PNG_ASM_FLAG_MMX_READ_FILTER_SUB + PNG_ASM_FLAG_MMX_READ_FILTER_UP + PNG_ASM_FLAG_MMX_READ_FILTER_AVG + PNG_ASM_FLAG_MMX_READ_FILTER_PAETH + PNG_ASM_FLAGS_INITIALIZED + PNG_MMX_READ_FLAGS + PNG_MMX_FLAGS + PNG_MMX_WRITE_FLAGS + PNG_MMX_FLAGS + +We added the following functions in support of runtime +selection of assembler code features: + + png_get_mmx_flagmask() + png_set_mmx_thresholds() + png_get_asm_flags() + png_get_mmx_bitdepth_threshold() + png_get_mmx_rowbytes_threshold() + png_set_asm_flags() + +We replaced all of these functions with simple stubs in libpng-1.2.20, +when the Intel assembler code was removed due to a licensing issue. + +.SH IX. (Omitted) + +.SH X. Detecting libpng + +The png_get_io_ptr() function has been present since libpng-0.88, has never +changed, and is unaffected by conditional compilation macros. It is the +best choice for use in configure scripts for detecting the presence of any +libpng version since 0.88. In an autoconf "configure.in" you could use + + AC_CHECK_LIB(png, png_get_io_ptr, ... + +.SH XI. Source code repository + +Since about February 2009, version 1.2.34, libpng has been under "git" source +control. The git repository was built from old libpng-x.y.z.tar.gz files +going back to version 0.70. You can access the git repository (read only) +at + + git://libpng.git.sourceforge.net/gitroot/libpng + +or you can browse it via "gitweb" at + + http://libpng.git.sourceforge.net/git/gitweb.cgi?p=libpng + +Patches can be sent to glennrp at users.sourceforge.net or to +png-mng-implement at lists.sourceforge.net or you can upload them to +the libpng bug tracker at + + http://libpng.sourceforge.net + +.SH XII. Coding style + +Our coding style is similar to the "Allman" style, with curly +braces on separate lines: + + if (condition) + { + action; + } + + else if (another condition) + { + another action; + } + +The braces can be omitted from simple one-line actions: + + if (condition) + return (0); + +We use 3-space indentation, except for continued statements which +are usually indented the same as the first line of the statement +plus four more spaces. + +Comments appear with the leading "/*" at the same indentation as +the statement that follows the comment: + + /* Single-line comment */ + statement; + + /* Multiple-line + * comment + */ + statement; + +Very short comments can be placed at the end of the statement +to which they pertain: + + statement; /* comment */ + +We don't use C++ style ("//") comments. We have, however, +used them in the past in some now-abandoned MMX assembler +code. + +Functions and their curly braces are not indented, and +exported functions are marked with PNGAPI: + + /* This is a public function that is visible to + * application programers. It does thus-and-so. + */ + void PNGAPI + png_exported_function(png_ptr, png_info, foo) + { + body; + } + +The prototypes for all exported functions appear in png.h, +above the comment that says + + /* Maintainer: Put new public prototypes here ... */ + +We mark all non-exported functions with "/* PRIVATE */"": + + void /* PRIVATE */ + png_non_exported_function(png_ptr, png_info, foo) + { + body; + } + +The prototypes for non-exported functions (except for those in +pngtest) appear in +the PNG_INTERNAL section of png.h +above the comment that says + + /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ + +The names of all exported functions and variables begin +with "png_", and all publicly visible C preprocessor +macros begin with "PNG_". + +We put a space after each comma and after each semicolon +in "for" statments, and we put spaces before and after each +C binary operator and after "for" or "while". We don't +put a space between a typecast and the expression being +cast, nor do we put one between a function name and the +left parenthesis that follows it: + + for (i = 2; i > 0; --i) + x[i] = a(x) + (int)b; + +We prefer #ifdef and #ifndef to #if defined() and if !defined() +when there is only one macro being tested. + +Other rules can be inferred by inspecting the libpng +source. + +.SH XIII. Y2K Compliance in libpng + +September 10, 2009 + +Since the PNG Development group is an ad-hoc body, we can't make +an official declaration. + +This is your unofficial assurance that libpng from version 0.71 and +upward through 1.2.40 are Y2K compliant. It is my belief that earlier +versions were also Y2K compliant. + +Libpng only has three year fields. One is a 2-byte unsigned integer that +will hold years up to 65535. The other two hold the date in text +format, and will hold years up to 9999. + +The integer is + "png_uint_16 year" in png_time_struct. + +The strings are + "png_charp time_buffer" in png_struct and + "near_time_buffer", which is a local character string in png.c. + +There are seven time-related functions: + + png_convert_to_rfc_1123() in png.c + (formerly png_convert_to_rfc_1152() in error) + png_convert_from_struct_tm() in pngwrite.c, called + in pngwrite.c + png_convert_from_time_t() in pngwrite.c + png_get_tIME() in pngget.c + png_handle_tIME() in pngrutil.c, called in pngread.c + png_set_tIME() in pngset.c + png_write_tIME() in pngwutil.c, called in pngwrite.c + +All appear to handle dates properly in a Y2K environment. The +png_convert_from_time_t() function calls gmtime() to convert from system +clock time, which returns (year - 1900), which we properly convert to +the full 4-digit year. There is a possibility that applications using +libpng are not passing 4-digit years into the png_convert_to_rfc_1123() +function, or that they are incorrectly passing only a 2-digit year +instead of "year - 1900" into the png_convert_from_struct_tm() function, +but this is not under our control. The libpng documentation has always +stated that it works with 4-digit years, and the APIs have been +documented as such. + +The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned +integer to hold the year, and can hold years as large as 65535. + +zlib, upon which libpng depends, is also Y2K compliant. It contains +no date-related code. + + + Glenn Randers-Pehrson + libpng maintainer + PNG Development Group + +.SH NOTE + +Note about libpng version numbers: + +Due to various miscommunications, unforeseen code incompatibilities +and occasional factors outside the authors' control, version numbering +on the library has not always been consistent and straightforward. +The following table summarizes matters since version 0.89c, which was +the first widely used release: + + source png.h png.h shared-lib + version string int version + ------- ------ ----- ---------- + 0.89c ("beta 3") 0.89 89 1.0.89 + 0.90 ("beta 4") 0.90 90 0.90 + 0.95 ("beta 5") 0.95 95 0.95 + 0.96 ("beta 6") 0.96 96 0.96 + 0.97b ("beta 7") 1.00.97 97 1.0.1 + 0.97c 0.97 97 2.0.97 + 0.98 0.98 98 2.0.98 + 0.99 0.99 98 2.0.99 + 0.99a-m 0.99 99 2.0.99 + 1.00 1.00 100 2.1.0 + 1.0.0 1.0.0 100 2.1.0 + 1.0.0 (from here on, the 100 2.1.0 + 1.0.1 png.h string is 10001 2.1.0 + 1.0.1a-e identical to the 10002 from here on, the + 1.0.2 source version) 10002 shared library is 2.V + 1.0.2a-b 10003 where V is the source + 1.0.1 10001 code version except as + 1.0.1a-e 10002 2.1.0.1a-e noted. + 1.0.2 10002 2.1.0.2 + 1.0.2a-b 10003 2.1.0.2a-b + 1.0.3 10003 2.1.0.3 + 1.0.3a-d 10004 2.1.0.3a-d + 1.0.4 10004 2.1.0.4 + 1.0.4a-f 10005 2.1.0.4a-f + 1.0.5 (+ 2 patches) 10005 2.1.0.5 + 1.0.5a-d 10006 2.1.0.5a-d + 1.0.5e-r 10100 2.1.0.5e-r + 1.0.5s-v 10006 2.1.0.5s-v + 1.0.6 (+ 3 patches) 10006 2.1.0.6 + 1.0.6d-g 10007 2.1.0.6d-g + 1.0.6h 10007 10.6h + 1.0.6i 10007 10.6i + 1.0.6j 10007 2.1.0.6j + 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 + 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 + 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 + 1.0.7 1 10007 2.1.0.7 + 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 + 1.0.8rc1 1 10008 2.1.0.8rc1 + 1.0.8 1 10008 2.1.0.8 + 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 + 1.0.9rc1 1 10009 2.1.0.9rc1 + 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 + 1.0.9rc2 1 10009 2.1.0.9rc2 + 1.0.9 1 10009 2.1.0.9 + 1.0.10beta1 1 10010 2.1.0.10beta1 + 1.0.10rc1 1 10010 2.1.0.10rc1 + 1.0.10 1 10010 2.1.0.10 + 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 + 1.0.11rc1 1 10011 2.1.0.11rc1 + 1.0.11 1 10011 2.1.0.11 + 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 + 1.0.12rc1 2 10012 2.1.0.12rc1 + 1.0.12 2 10012 2.1.0.12 + 1.1.0a-f - 10100 2.1.1.0a-f abandoned + 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 + 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 + 1.2.0rc1 3 10200 3.1.2.0rc1 + 1.2.0 3 10200 3.1.2.0 + 1.2.1beta-4 3 10201 3.1.2.1beta1-4 + 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 + 1.2.1 3 10201 3.1.2.1 + 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 + 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 + 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 + 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 + 1.0.13 10 10013 10.so.0.1.0.13 + 1.2.2 12 10202 12.so.0.1.2.2 + 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 + 1.2.3 12 10203 12.so.0.1.2.3 + 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 + 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 + 1.0.14 10 10014 10.so.0.1.0.14 + 1.2.4 13 10204 12.so.0.1.2.4 + 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 + 1.0.15rc1 10 10015 10.so.0.1.0.15rc1 + 1.0.15 10 10015 10.so.0.1.0.15 + 1.2.5 13 10205 12.so.0.1.2.5 + 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 + 1.2.6rc1-5 13 10206 12.so.0.1.2.6rc1-5 + 1.0.16 10 10016 10.so.0.1.0.16 + 1.2.6 13 10206 12.so.0.1.2.6 + 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 + 1.0.17rc1 10 10017 10.so.0.1.0.17rc1 + 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 + 1.0.17 10 10017 10.so.0.1.0.17 + 1.2.7 13 10207 12.so.0.1.2.7 + 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 + 1.0.18rc1-5 10 10018 10.so.0.1.0.18rc1-5 + 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 + 1.0.18 10 10018 10.so.0.1.0.18 + 1.2.8 13 10208 12.so.0.1.2.8 + 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 + 1.2.9beta4-11 13 10209 12.so.0.9[.0] + 1.2.9rc1 13 10209 12.so.0.9[.0] + 1.2.9 13 10209 12.so.0.9[.0] + 1.2.10beta1-8 13 10210 12.so.0.10[.0] + 1.2.10rc1-3 13 10210 12.so.0.10[.0] + 1.2.10 13 10210 12.so.0.10[.0] + 1.2.11beta1-4 13 10211 12.so.0.11[.0] + 1.0.19rc1-5 10 10019 10.so.0.19[.0] + 1.2.11rc1-5 13 10211 12.so.0.11[.0] + 1.0.19 10 10019 10.so.0.19[.0] + 1.2.11 13 10211 12.so.0.11[.0] + 1.0.20 10 10020 10.so.0.20[.0] + 1.2.12 13 10212 12.so.0.12[.0] + 1.2.13beta1 13 10213 12.so.0.13[.0] + 1.0.21 10 10021 10.so.0.21[.0] + 1.2.13 13 10213 12.so.0.13[.0] + 1.2.14beta1-2 13 10214 12.so.0.14[.0] + 1.0.22rc1 10 10022 10.so.0.22[.0] + 1.2.14rc1 13 10214 12.so.0.14[.0] + 1.2.15beta1-6 13 10215 12.so.0.15[.0] + 1.0.23rc1-5 10 10023 10.so.0.23[.0] + 1.2.15rc1-5 13 10215 12.so.0.15[.0] + 1.0.23 10 10023 10.so.0.23[.0] + 1.2.15 13 10215 12.so.0.15[.0] + 1.2.16beta1-2 13 10216 12.so.0.16[.0] + 1.2.16rc1 13 10216 12.so.0.16[.0] + 1.0.24 10 10024 10.so.0.24[.0] + 1.2.16 13 10216 12.so.0.16[.0] + 1.2.17beta1-2 13 10217 12.so.0.17[.0] + 1.0.25rc1 10 10025 10.so.0.25[.0] + 1.2.17rc1-3 13 10217 12.so.0.17[.0] + 1.0.25 10 10025 10.so.0.25[.0] + 1.2.17 13 10217 12.so.0.17[.0] + 1.0.26 10 10026 10.so.0.26[.0] + 1.2.18 13 10218 12.so.0.18[.0] + 1.2.19beta1-31 13 10219 12.so.0.19[.0] + 1.0.27rc1-6 10 10027 10.so.0.27[.0] + 1.2.19rc1-6 13 10219 12.so.0.19[.0] + 1.0.27 10 10027 10.so.0.27[.0] + 1.2.19 13 10219 12.so.0.19[.0] + 1.2.20beta01-04 13 10220 12.so.0.20[.0] + 1.0.28rc1-6 10 10028 10.so.0.28[.0] + 1.2.20rc1-6 13 10220 12.so.0.20[.0] + 1.0.28 10 10028 10.so.0.28[.0] + 1.2.20 13 10220 12.so.0.20[.0] + 1.2.21beta1-2 13 10221 12.so.0.21[.0] + 1.2.21rc1-3 13 10221 12.so.0.21[.0] + 1.0.29 10 10029 10.so.0.29[.0] + 1.2.21 13 10221 12.so.0.21[.0] + 1.2.22beta1-4 13 10222 12.so.0.22[.0] + 1.0.30rc1 13 10030 10.so.0.30[.0] + 1.2.22rc1 13 10222 12.so.0.22[.0] + 1.0.30 10 10030 10.so.0.30[.0] + 1.2.22 13 10222 12.so.0.22[.0] + 1.2.23beta01-05 13 10223 12.so.0.23[.0] + 1.2.23rc01 13 10223 12.so.0.23[.0] + 1.2.23 13 10223 12.so.0.23[.0] + 1.2.24beta01-02 13 10224 12.so.0.24[.0] + 1.2.24rc01 13 10224 12.so.0.24[.0] + 1.2.24 13 10224 12.so.0.24[.0] + 1.2.25beta01-06 13 10225 12.so.0.25[.0] + 1.2.25rc01-02 13 10225 12.so.0.25[.0] + 1.0.31 10 10031 10.so.0.31[.0] + 1.2.25 13 10225 12.so.0.25[.0] + 1.2.26beta01-06 13 10226 12.so.0.26[.0] + 1.2.26rc01 13 10226 12.so.0.26[.0] + 1.2.26 13 10226 12.so.0.26[.0] + 1.0.32 10 10032 10.so.0.32[.0] + 1.2.27beta01-06 13 10227 12.so.0.27[.0] + 1.2.27rc01 13 10227 12.so.0.27[.0] + 1.0.33 10 10033 10.so.0.33[.0] + 1.2.27 13 10227 12.so.0.27[.0] + 1.0.34 10 10034 10.so.0.34[.0] + 1.2.28 13 10228 12.so.0.28[.0] + 1.2.29beta01-03 13 10229 12.so.0.29[.0] + 1.2.29rc01 13 10229 12.so.0.29[.0] + 1.0.35 10 10035 10.so.0.35[.0] + 1.2.29 13 10229 12.so.0.29[.0] + 1.0.37 10 10037 10.so.0.37[.0] + 1.2.30beta01-04 13 10230 12.so.0.30[.0] + 1.0.38rc01-08 10 10038 10.so.0.38[.0] + 1.2.30rc01-08 13 10230 12.so.0.30[.0] + 1.0.38 10 10038 10.so.0.38[.0] + 1.2.30 13 10230 12.so.0.30[.0] + 1.0.39rc01-03 10 10039 10.so.0.39[.0] + 1.2.31rc01-03 13 10231 12.so.0.31[.0] + 1.0.39 10 10039 10.so.0.39[.0] + 1.2.31 13 10231 12.so.0.31[.0] + 1.2.32beta01-02 13 10232 12.so.0.32[.0] + 1.0.40rc01 10 10040 10.so.0.40[.0] + 1.2.32rc01 13 10232 12.so.0.32[.0] + 1.0.40 10 10040 10.so.0.40[.0] + 1.2.32 13 10232 12.so.0.32[.0] + 1.2.33beta01-02 13 10233 12.so.0.33[.0] + 1.2.33rc01-02 13 10233 12.so.0.33[.0] + 1.0.41rc01 10 10041 10.so.0.41[.0] + 1.2.33 13 10233 12.so.0.33[.0] + 1.0.41 10 10041 10.so.0.41[.0] + 1.2.34beta01-07 13 10234 12.so.0.34[.0] + 1.0.42rc01 10 10042 10.so.0.42[.0] + 1.2.34rc01 13 10234 12.so.0.34[.0] + 1.0.42 10 10042 10.so.0.42[.0] + 1.2.34 13 10234 12.so.0.34[.0] + 1.2.35beta01-03 13 10235 12.so.0.35[.0] + 1.0.43rc01-02 10 10043 10.so.0.43[.0] + 1.2.35rc01-02 13 10235 12.so.0.35[.0] + 1.0.43 10 10043 10.so.0.43[.0] + 1.2.35 13 10235 12.so.0.35[.0] + 1.2.36beta01-05 13 10236 12.so.0.36[.0] + 1.2.36rc01 13 10236 12.so.0.36[.0] + 1.0.44 10 10044 10.so.0.44[.0] + 1.2.36 13 10236 12.so.0.36[.0] + 1.2.37beta01-03 13 10237 12.so.0.37[.0] + 1.2.37rc01 13 10237 12.so.0.37[.0] + 1.2.37 13 10237 12.so.0.37[.0] + 1.2.45 10 10045 12.so.0.45[.0] + 1.0.46 10 10046 10.so.0.46[.0] + 1.2.38beta01 13 10238 12.so.0.38[.0] + 1.2.38rc01-03 13 10238 12.so.0.38[.0] + 1.0.47 10 10047 10.so.0.47[.0] + 1.2.38 13 10238 12.so.0.38[.0] + 1.2.39beta01-05 13 10239 12.so.0.39[.0] + 1.2.39rc01 13 10239 12.so.0.39[.0] + 1.0.48 10 10048 10.so.0.48[.0] + 1.2.39 13 10239 12.so.0.39[.0] + 1.2.40rc01 13 10240 12.so.0.40[.0] + 1.0.49 10 10049 10.so.0.49[.0] + 1.2.40 13 10240 12.so.0.40[.0] + +Henceforth the source version will match the shared-library minor +and patch numbers; the shared-library major version number will be +used for changes in backward compatibility, as it is intended. The +PNG_PNGLIB_VER macro, which is not used within libpng but is available +for applications, is an unsigned integer of the form xyyzz corresponding +to the source version x.y.z (leading zeros in y and z). Beta versions +were given the previous public release number plus a letter, until +version 1.0.6j; from then on they were given the upcoming public +release number plus "betaNN" or "rcN". + +.SH "SEE ALSO" +.IR libpngpf(3) ", " png(5) +.LP +.IR libpng : +.IP +http://libpng.sourceforge.net (follow the [DOWNLOAD] link) +http://www.libpng.org/pub/png + +.LP +.IR zlib : +.IP +(generally) at the same location as +.I libpng +or at +.br +ftp://ftp.info-zip.org/pub/infozip/zlib + +.LP +.IR PNG specification: RFC 2083 +.IP +(generally) at the same location as +.I libpng +or at +.br +ftp://ftp.rfc-editor.org:/in-notes/rfc2083.txt +.br +or (as a W3C Recommendation) at +.br +http://www.w3.org/TR/REC-png.html + +.LP +In the case of any inconsistency between the PNG specification +and this library, the specification takes precedence. + +.SH AUTHORS +This man page: Glenn Randers-Pehrson + + +The contributing authors would like to thank all those who helped +with testing, bug fixes, and patience. This wouldn't have been +possible without all of you. + +Thanks to Frank J. T. Wojcik for helping with the documentation. + +Libpng version 1.2.40 - September 10, 2009: +Initially created in 1995 by Guy Eric Schalnat, then of Group 42, Inc. +Currently maintained by Glenn Randers-Pehrson (glennrp at users.sourceforge.net). + +Supported by the PNG development group +.br +png-mng-implement at lists.sf.net +(subscription required; visit +png-mng-implement at lists.sourceforge.net (subscription required; visit +https://lists.sourceforge.net/lists/listinfo/png-mng-implement +to subscribe). + +.SH COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: + +(This copy of the libpng notices is provided for your convenience. In case of +any discrepancy between this copy and the notices in the file png.h that is +included in the libpng distribution, the latter shall prevail.) + +If you modify libpng you may insert additional notices immediately following +this sentence. + +This code is released under the libpng license. + +libpng versions 1.2.6, August 15, 2004, through 1.2.40, September 10, 2009, are +Copyright (c) 2004,2006-2008 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.2.5 +with the following individual added to the list of Contributing Authors + + Cosmin Truta + +libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are +Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are +distributed according to the same disclaimer and license as libpng-1.0.6 +with the following individuals added to the list of Contributing Authors + + Simon-Pierre Cadieux + Eric S. Raymond + Gilles Vollant + +and with the following additions to the disclaimer: + + There is no warranty against interference with your + enjoyment of the library or against infringement. + There is no warranty that our efforts or the library + will fulfill any of your particular purposes or needs. + This library is provided with all faults, and the entire + risk of satisfactory quality, performance, accuracy, and + effort is with the user. + +libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are +Copyright (c) 1998, 1999 Glenn Randers-Pehrson +Distributed according to the same disclaimer and license as libpng-0.96, +with the following individuals added to the list of Contributing Authors: + + Tom Lane + Glenn Randers-Pehrson + Willem van Schaik + +libpng versions 0.89, June 1996, through 0.96, May 1997, are +Copyright (c) 1996, 1997 Andreas Dilger +Distributed according to the same disclaimer and license as libpng-0.88, +with the following individuals added to the list of Contributing Authors: + + John Bowler + Kevin Bracey + Sam Bushell + Magnus Holmgren + Greg Roelofs + Tom Tanner + +libpng versions 0.5, May 1995, through 0.88, January 1996, are +Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. + +For the purposes of this copyright and license, "Contributing Authors" +is defined as the following set of individuals: + + Andreas Dilger + Dave Martindale + Guy Eric Schalnat + Paul Schmidt + Tim Wegner + +The PNG Reference Library is supplied "AS IS". The Contributing Authors +and Group 42, Inc. disclaim all warranties, expressed or implied, +including, without limitation, the warranties of merchantability and of +fitness for any purpose. The Contributing Authors and Group 42, Inc. +assume no liability for direct, indirect, incidental, special, exemplary, +or consequential damages, which may result from the use of the PNG +Reference Library, even if advised of the possibility of such damage. + +Permission is hereby granted to use, copy, modify, and distribute this +source code, or portions hereof, for any purpose, without fee, subject +to the following restrictions: + +1. The origin of this source code must not be misrepresented. + +2. Altered versions must be plainly marked as such and + must not be misrepresented as being the original source. + +3. This Copyright notice may not be removed or altered from + any source or altered source distribution. + +The Contributing Authors and Group 42, Inc. specifically permit, without +fee, and encourage the use of this source code as a component to +supporting the PNG file format in commercial products. If you use this +source code in a product, acknowledgment is not required but would be +appreciated. + + +A "png_get_copyright" function is available, for convenient use in "about" +boxes and the like: + + printf("%s",png_get_copyright(NULL)); + +Also, the PNG logo (in PNG format, of course) is supplied in the +files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). + +Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a +certification mark of the Open Source Initiative. + +Glenn Randers-Pehrson +glennrp at users.sourceforge.net +September 10, 2009 + +.\" end of man page + diff --git a/third_party/windows/fltk-1.1.10/png/libpng.txt b/third_party/windows/fltk-1.1.10/png/libpng.txt new file mode 100644 index 0000000..3ab8899 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/libpng.txt @@ -0,0 +1,3112 @@ +libpng.txt - A description on how to use and modify libpng + + libpng version 1.2.40 - September 10, 2009 + Updated and distributed by Glenn Randers-Pehrson + + Copyright (c) 1998-2009 Glenn Randers-Pehrson + + This document is released under the libpng license. + For conditions of distribution and use, see the disclaimer + and license in png.h + + Based on: + + libpng versions 0.97, January 1998, through 1.2.40 - September 10, 2009 + Updated and distributed by Glenn Randers-Pehrson + Copyright (c) 1998-2009 Glenn Randers-Pehrson + + libpng 1.0 beta 6 version 0.96 May 28, 1997 + Updated and distributed by Andreas Dilger + Copyright (c) 1996, 1997 Andreas Dilger + + libpng 1.0 beta 2 - version 0.88 January 26, 1996 + For conditions of distribution and use, see copyright + notice in png.h. Copyright (c) 1995, 1996 Guy Eric + Schalnat, Group 42, Inc. + + Updated/rewritten per request in the libpng FAQ + Copyright (c) 1995, 1996 Frank J. T. Wojcik + December 18, 1995 & January 20, 1996 + +I. Introduction + +This file describes how to use and modify the PNG reference library +(known as libpng) for your own use. There are five sections to this +file: introduction, structures, reading, writing, and modification and +configuration notes for various special platforms. In addition to this +file, example.c is a good starting point for using the library, as +it is heavily commented and should include everything most people +will need. We assume that libpng is already installed; see the +INSTALL file for instructions on how to install libpng. + +For examples of libpng usage, see the files "example.c", "pngtest.c", +and the files in the "contrib" directory, all of which are included in the +libpng distribution. + +Libpng was written as a companion to the PNG specification, as a way +of reducing the amount of time and effort it takes to support the PNG +file format in application programs. + +The PNG specification (second edition), November 2003, is available as +a W3C Recommendation and as an ISO Standard (ISO/IEC 15948:2003 (E)) at +. It is technically equivalent +to the PNG specification (second edition) but has some additional material. + +The PNG-1.0 specification is available +as RFC 2083 and as a +W3C Recommendation . + +Some additional chunks are described in the special-purpose public chunks +documents at . + +Other information +about PNG, and the latest version of libpng, can be found at the PNG home +page, . + +Most users will not have to modify the library significantly; advanced +users may want to modify it more. All attempts were made to make it as +complete as possible, while keeping the code easy to understand. +Currently, this library only supports C. Support for other languages +is being considered. + +Libpng has been designed to handle multiple sessions at one time, +to be easily modifiable, to be portable to the vast majority of +machines (ANSI, K&R, 16-, 32-, and 64-bit) available, and to be easy +to use. The ultimate goal of libpng is to promote the acceptance of +the PNG file format in whatever way possible. While there is still +work to be done (see the TODO file), libpng should cover the +majority of the needs of its users. + +Libpng uses zlib for its compression and decompression of PNG files. +Further information about zlib, and the latest version of zlib, can +be found at the zlib home page, . +The zlib compression utility is a general purpose utility that is +useful for more than PNG files, and can be used without libpng. +See the documentation delivered with zlib for more details. +You can usually find the source files for the zlib utility wherever you +find the libpng source files. + +Libpng is thread safe, provided the threads are using different +instances of the structures. Each thread should have its own +png_struct and png_info instances, and thus its own image. +Libpng does not protect itself against two threads using the +same instance of a structure. + +II. Structures + +There are two main structures that are important to libpng, png_struct +and png_info. The first, png_struct, is an internal structure that +will not, for the most part, be used by a user except as the first +variable passed to every libpng function call. + +The png_info structure is designed to provide information about the +PNG file. At one time, the fields of png_info were intended to be +directly accessible to the user. However, this tended to cause problems +with applications using dynamically loaded libraries, and as a result +a set of interface functions for png_info (the png_get_*() and png_set_*() +functions) was developed. The fields of png_info are still available for +older applications, but it is suggested that applications use the new +interfaces if at all possible. + +Applications that do make direct access to the members of png_struct (except +for png_ptr->jmpbuf) must be recompiled whenever the library is updated, +and applications that make direct access to the members of png_info must +be recompiled if they were compiled or loaded with libpng version 1.0.6, +in which the members were in a different order. In version 1.0.7, the +members of the png_info structure reverted to the old order, as they were +in versions 0.97c through 1.0.5. Starting with version 2.0.0, both +structures are going to be hidden, and the contents of the structures will +only be accessible through the png_get/png_set functions. + +The png.h header file is an invaluable reference for programming with libpng. +And while I'm on the topic, make sure you include the libpng header file: + +#include + +III. Reading + +We'll now walk you through the possible functions to call when reading +in a PNG file sequentially, briefly explaining the syntax and purpose +of each one. See example.c and png.h for more detail. While +progressive reading is covered in the next section, you will still +need some of the functions discussed in this section to read a PNG +file. + +Setup + +You will want to do the I/O initialization(*) before you get into libpng, +so if it doesn't work, you don't have much to undo. Of course, you +will also want to insure that you are, in fact, dealing with a PNG +file. Libpng provides a simple check to see if a file is a PNG file. +To use it, pass in the first 1 to 8 bytes of the file to the function +png_sig_cmp(), and it will return 0 (false) if the bytes match the +corresponding bytes of the PNG signature, or nonzero (true) otherwise. +Of course, the more bytes you pass in, the greater the accuracy of the +prediction. + +If you are intending to keep the file pointer open for use in libpng, +you must ensure you don't read more than 8 bytes from the beginning +of the file, and you also have to make a call to png_set_sig_bytes_read() +with the number of bytes you read from the beginning. Libpng will +then only check the bytes (if any) that your program didn't read. + +(*): If you are not using the standard I/O functions, you will need +to replace them with custom functions. See the discussion under +Customizing libpng. + + + FILE *fp = fopen(file_name, "rb"); + if (!fp) + { + return (ERROR); + } + fread(header, 1, number, fp); + is_png = !png_sig_cmp(header, 0, number); + if (!is_png) + { + return (NOT_PNG); + } + + +Next, png_struct and png_info need to be allocated and initialized. In +order to ensure that the size of these structures is correct even with a +dynamically linked libpng, there are functions to initialize and +allocate the structures. We also pass the library version, optional +pointers to error handling functions, and a pointer to a data struct for +use by the error functions, if necessary (the pointer and functions can +be NULL if the default error handlers are to be used). See the section +on Changes to Libpng below regarding the old initialization functions. +The structure allocation functions quietly return NULL if they fail to +create the structure, so your application should check for that. + + png_structp png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + if (!png_ptr) + return (ERROR); + + png_infop info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, + (png_infopp)NULL, (png_infopp)NULL); + return (ERROR); + } + + png_infop end_info = png_create_info_struct(png_ptr); + if (!end_info) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + +If you want to use your own memory allocation routines, +define PNG_USER_MEM_SUPPORTED and use +png_create_read_struct_2() instead of png_create_read_struct(): + + png_structp png_ptr = png_create_read_struct_2 + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn, (png_voidp) + user_mem_ptr, user_malloc_fn, user_free_fn); + +The error handling routines passed to png_create_read_struct() +and the memory alloc/free routines passed to png_create_struct_2() +are only necessary if you are not using the libpng supplied error +handling and memory alloc/free functions. + +When libpng encounters an error, it expects to longjmp back +to your routine. Therefore, you will need to call setjmp and pass +your png_jmpbuf(png_ptr). If you read the file from different +routines, you will need to update the jmpbuf field every time you enter +a new routine that will call a png_*() function. + +See your documentation of setjmp/longjmp for your compiler for more +information on setjmp/longjmp. See the discussion on libpng error +handling in the Customizing Libpng section below for more information +on the libpng error handling. If an error occurs, and libpng longjmp's +back to your setjmp, you will want to call png_destroy_read_struct() to +free any memory. + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + &end_info); + fclose(fp); + return (ERROR); + } + +If you would rather avoid the complexity of setjmp/longjmp issues, +you can compile libpng with PNG_SETJMP_NOT_SUPPORTED, in which case +errors will result in a call to PNG_ABORT() which defaults to abort(). + +Now you need to set up the input code. The default for libpng is to +use the C function fread(). If you use this, you will need to pass a +valid FILE * in the function png_init_io(). Be sure that the file is +opened in binary mode. If you wish to handle reading data in another +way, you need not call the png_init_io() function, but you must then +implement the libpng I/O methods discussed in the Customizing Libpng +section below. + + png_init_io(png_ptr, fp); + +If you had previously opened the file and read any of the signature from +the beginning in order to see if this was a PNG file, you need to let +libpng know that there are some bytes missing from the start of the file. + + png_set_sig_bytes(png_ptr, number); + +Setting up callback code + +You can set up a callback function to handle any unknown chunks in the +input stream. You must supply the function + + read_chunk_callback(png_ptr ptr, + png_unknown_chunkp chunk); + { + /* The unknown chunk structure contains your + chunk data, along with similar data for any other + unknown chunks: */ + + png_byte name[5]; + png_byte *data; + png_size_t size; + + /* Note that libpng has already taken care of + the CRC handling */ + + /* put your code here. Search for your chunk in the + unknown chunk structure, process it, and return one + of the following: */ + + return (-n); /* chunk had an error */ + return (0); /* did not recognize */ + return (n); /* success */ + } + +(You can give your function another name that you like instead of +"read_chunk_callback") + +To inform libpng about your function, use + + png_set_read_user_chunk_fn(png_ptr, user_chunk_ptr, + read_chunk_callback); + +This names not only the callback function, but also a user pointer that +you can retrieve with + + png_get_user_chunk_ptr(png_ptr); + +If you call the png_set_read_user_chunk_fn() function, then all unknown +chunks will be saved when read, in case your callback function will need +one or more of them. This behavior can be changed with the +png_set_keep_unknown_chunks() function, described below. + +At this point, you can set up a callback function that will be +called after each row has been read, which you can use to control +a progress meter or the like. It's demonstrated in pngtest.c. +You must supply a function + + void read_row_callback(png_ptr ptr, png_uint_32 row, + int pass); + { + /* put your code here */ + } + +(You can give it another name that you like instead of "read_row_callback") + +To inform libpng about your function, use + + png_set_read_status_fn(png_ptr, read_row_callback); + +Unknown-chunk handling + +Now you get to set the way the library processes unknown chunks in the +input PNG stream. Both known and unknown chunks will be read. Normal +behavior is that known chunks will be parsed into information in +various info_ptr members while unknown chunks will be discarded. This +behavior can be wasteful if your application will never use some known +chunk types. To change this, you can call: + + png_set_keep_unknown_chunks(png_ptr, keep, + chunk_list, num_chunks); + keep - 0: default unknown chunk handling + 1: ignore; do not keep + 2: keep only if safe-to-copy + 3: keep even if unsafe-to-copy + You can use these definitions: + PNG_HANDLE_CHUNK_AS_DEFAULT 0 + PNG_HANDLE_CHUNK_NEVER 1 + PNG_HANDLE_CHUNK_IF_SAFE 2 + PNG_HANDLE_CHUNK_ALWAYS 3 + chunk_list - list of chunks affected (a byte string, + five bytes per chunk, NULL or '\0' if + num_chunks is 0) + num_chunks - number of chunks affected; if 0, all + unknown chunks are affected. If nonzero, + only the chunks in the list are affected + +Unknown chunks declared in this way will be saved as raw data onto a +list of png_unknown_chunk structures. If a chunk that is normally +known to libpng is named in the list, it will be handled as unknown, +according to the "keep" directive. If a chunk is named in successive +instances of png_set_keep_unknown_chunks(), the final instance will +take precedence. The IHDR and IEND chunks should not be named in +chunk_list; if they are, libpng will process them normally anyway. + +Here is an example of the usage of png_set_keep_unknown_chunks(), +where the private "vpAg" chunk will later be processed by a user chunk +callback function: + + png_byte vpAg[5]={118, 112, 65, 103, (png_byte) '\0'}; + + #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + png_byte unused_chunks[]= + { + 104, 73, 83, 84, (png_byte) '\0', /* hIST */ + 105, 84, 88, 116, (png_byte) '\0', /* iTXt */ + 112, 67, 65, 76, (png_byte) '\0', /* pCAL */ + 115, 67, 65, 76, (png_byte) '\0', /* sCAL */ + 115, 80, 76, 84, (png_byte) '\0', /* sPLT */ + 116, 73, 77, 69, (png_byte) '\0', /* tIME */ + }; + #endif + + ... + + #if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + /* ignore all unknown chunks: */ + png_set_keep_unknown_chunks(read_ptr, 1, NULL, 0); + /* except for vpAg: */ + png_set_keep_unknown_chunks(read_ptr, 2, vpAg, 1); + /* also ignore unused known chunks: */ + png_set_keep_unknown_chunks(read_ptr, 1, unused_chunks, + (int)sizeof(unused_chunks)/5); + #endif + +User limits + +The PNG specification allows the width and height of an image to be as +large as 2^31-1 (0x7fffffff), or about 2.147 billion rows and columns. +Since very few applications really need to process such large images, +we have imposed an arbitrary 1-million limit on rows and columns. +Larger images will be rejected immediately with a png_error() call. If +you wish to override this limit, you can use + + png_set_user_limits(png_ptr, width_max, height_max); + +to set your own limits, or use width_max = height_max = 0x7fffffffL +to allow all valid dimensions (libpng may reject some very large images +anyway because of potential buffer overflow conditions). + +You should put this statement after you create the PNG structure and +before calling png_read_info(), png_read_png(), or png_process_data(). +If you need to retrieve the limits that are being applied, use + + width_max = png_get_user_width_max(png_ptr); + height_max = png_get_user_height_max(png_ptr); + +The high-level read interface + +At this point there are two ways to proceed; through the high-level +read interface, or through a sequence of low-level read operations. +You can use the high-level interface if (a) you are willing to read +the entire image into memory, and (b) the input transformations +you want to do are limited to the following set: + + PNG_TRANSFORM_IDENTITY No transformation + PNG_TRANSFORM_STRIP_16 Strip 16-bit samples to + 8 bits + PNG_TRANSFORM_STRIP_ALPHA Discard the alpha channel + PNG_TRANSFORM_PACKING Expand 1, 2 and 4-bit + samples to bytes + PNG_TRANSFORM_PACKSWAP Change order of packed + pixels to LSB first + PNG_TRANSFORM_EXPAND Perform set_expand() + PNG_TRANSFORM_INVERT_MONO Invert monochrome images + PNG_TRANSFORM_SHIFT Normalize pixels to the + sBIT depth + PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA + to BGRA + PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA + to AG + PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity + to transparency + PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples + +(This excludes setting a background color, doing gamma transformation, +dithering, and setting filler.) If this is the case, simply do this: + + png_read_png(png_ptr, info_ptr, png_transforms, NULL) + +where png_transforms is an integer containing the bitwise OR of +some set of transformation flags. This call is equivalent to png_read_info(), +followed the set of transformations indicated by the transform mask, +then png_read_image(), and finally png_read_end(). + +(The final parameter of this call is not yet used. Someday it might point +to transformation parameters required by some future input transform.) + +You must use png_transforms and not call any png_set_transform() functions +when you use png_read_png(). + +After you have called png_read_png(), you can retrieve the image data +with + + row_pointers = png_get_rows(png_ptr, info_ptr); + +where row_pointers is an array of pointers to the pixel data for each row: + + png_bytep row_pointers[height]; + +If you know your image size and pixel size ahead of time, you can allocate +row_pointers prior to calling png_read_png() with + + if (height > PNG_UINT_32_MAX/png_sizeof(png_byte)) + png_error (png_ptr, + "Image is too tall to process in memory"); + if (width > PNG_UINT_32_MAX/pixel_size) + png_error (png_ptr, + "Image is too wide to process in memory"); + row_pointers = png_malloc(png_ptr, + height*png_sizeof(png_bytep)); + for (int i=0; i) and +png_get_(png_ptr, info_ptr, ...) functions return non-zero if the +data has been read, or zero if it is missing. The parameters to the +png_get_ are set directly if they are simple data types, or a pointer +into the info_ptr is returned for any complex types. + + png_get_PLTE(png_ptr, info_ptr, &palette, + &num_palette); + palette - the palette for the file + (array of png_color) + num_palette - number of entries in the palette + + png_get_gAMA(png_ptr, info_ptr, &gamma); + gamma - the gamma the file is written + at (PNG_INFO_gAMA) + + png_get_sRGB(png_ptr, info_ptr, &srgb_intent); + srgb_intent - the rendering intent (PNG_INFO_sRGB) + The presence of the sRGB chunk + means that the pixel data is in the + sRGB color space. This chunk also + implies specific values of gAMA and + cHRM. + + png_get_iCCP(png_ptr, info_ptr, &name, + &compression_type, &profile, &proflen); + name - The profile name. + compression - The compression type; always + PNG_COMPRESSION_TYPE_BASE for PNG 1.0. + You may give NULL to this argument to + ignore it. + profile - International Color Consortium color + profile data. May contain NULs. + proflen - length of profile data in bytes. + + png_get_sBIT(png_ptr, info_ptr, &sig_bit); + sig_bit - the number of significant bits for + (PNG_INFO_sBIT) each of the gray, + red, green, and blue channels, + whichever are appropriate for the + given color type (png_color_16) + + png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, + &trans_values); + trans - array of transparent entries for + palette (PNG_INFO_tRNS) + trans_values - graylevel or color sample values of + the single transparent color for + non-paletted images (PNG_INFO_tRNS) + num_trans - number of transparent entries + (PNG_INFO_tRNS) + + png_get_hIST(png_ptr, info_ptr, &hist); + (PNG_INFO_hIST) + hist - histogram of palette (array of + png_uint_16) + + png_get_tIME(png_ptr, info_ptr, &mod_time); + mod_time - time image was last modified + (PNG_VALID_tIME) + + png_get_bKGD(png_ptr, info_ptr, &background); + background - background color (PNG_VALID_bKGD) + valid 16-bit red, green and blue + values, regardless of color_type + + num_comments = png_get_text(png_ptr, info_ptr, + &text_ptr, &num_text); + num_comments - number of comments + text_ptr - array of png_text holding image + comments + text_ptr[i].compression - type of compression used + on "text" PNG_TEXT_COMPRESSION_NONE + PNG_TEXT_COMPRESSION_zTXt + PNG_ITXT_COMPRESSION_NONE + PNG_ITXT_COMPRESSION_zTXt + text_ptr[i].key - keyword for comment. Must contain + 1-79 characters. + text_ptr[i].text - text comments for current + keyword. Can be empty. + text_ptr[i].text_length - length of text string, + after decompression, 0 for iTXt + text_ptr[i].itxt_length - length of itxt string, + after decompression, 0 for tEXt/zTXt + text_ptr[i].lang - language of comment (empty + string for unknown). + text_ptr[i].lang_key - keyword in UTF-8 + (empty string for unknown). + num_text - number of comments (same as + num_comments; you can put NULL here + to avoid the duplication) + Note while png_set_text() will accept text, language, + and translated keywords that can be NULL pointers, the + structure returned by png_get_text will always contain + regular zero-terminated C strings. They might be + empty strings but they will never be NULL pointers. + + num_spalettes = png_get_sPLT(png_ptr, info_ptr, + &palette_ptr); + palette_ptr - array of palette structures holding + contents of one or more sPLT chunks + read. + num_spalettes - number of sPLT chunks read. + + png_get_oFFs(png_ptr, info_ptr, &offset_x, &offset_y, + &unit_type); + offset_x - positive offset from the left edge + of the screen + offset_y - positive offset from the top edge + of the screen + unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER + + png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, + &unit_type); + res_x - pixels/unit physical resolution in + x direction + res_y - pixels/unit physical resolution in + x direction + unit_type - PNG_RESOLUTION_UNKNOWN, + PNG_RESOLUTION_METER + + png_get_sCAL(png_ptr, info_ptr, &unit, &width, + &height) + unit - physical scale units (an integer) + width - width of a pixel in physical scale units + height - height of a pixel in physical scale units + (width and height are doubles) + + png_get_sCAL_s(png_ptr, info_ptr, &unit, &width, + &height) + unit - physical scale units (an integer) + width - width of a pixel in physical scale units + height - height of a pixel in physical scale units + (width and height are strings like "2.54") + + num_unknown_chunks = png_get_unknown_chunks(png_ptr, + info_ptr, &unknowns) + unknowns - array of png_unknown_chunk + structures holding unknown chunks + unknowns[i].name - name of unknown chunk + unknowns[i].data - data of unknown chunk + unknowns[i].size - size of unknown chunk's data + unknowns[i].location - position of chunk in file + + The value of "i" corresponds to the order in which the + chunks were read from the PNG file or inserted with the + png_set_unknown_chunks() function. + +The data from the pHYs chunk can be retrieved in several convenient +forms: + + res_x = png_get_x_pixels_per_meter(png_ptr, + info_ptr) + res_y = png_get_y_pixels_per_meter(png_ptr, + info_ptr) + res_x_and_y = png_get_pixels_per_meter(png_ptr, + info_ptr) + res_x = png_get_x_pixels_per_inch(png_ptr, + info_ptr) + res_y = png_get_y_pixels_per_inch(png_ptr, + info_ptr) + res_x_and_y = png_get_pixels_per_inch(png_ptr, + info_ptr) + aspect_ratio = png_get_pixel_aspect_ratio(png_ptr, + info_ptr) + + (Each of these returns 0 [signifying "unknown"] if + the data is not present or if res_x is 0; + res_x_and_y is 0 if res_x != res_y) + +The data from the oFFs chunk can be retrieved in several convenient +forms: + + x_offset = png_get_x_offset_microns(png_ptr, info_ptr); + y_offset = png_get_y_offset_microns(png_ptr, info_ptr); + x_offset = png_get_x_offset_inches(png_ptr, info_ptr); + y_offset = png_get_y_offset_inches(png_ptr, info_ptr); + + (Each of these returns 0 [signifying "unknown" if both + x and y are 0] if the data is not present or if the + chunk is present but the unit is the pixel) + +For more information, see the png_info definition in png.h and the +PNG specification for chunk contents. Be careful with trusting +rowbytes, as some of the transformations could increase the space +needed to hold a row (expand, filler, gray_to_rgb, etc.). +See png_read_update_info(), below. + +A quick word about text_ptr and num_text. PNG stores comments in +keyword/text pairs, one pair per chunk, with no limit on the number +of text chunks, and a 2^31 byte limit on their size. While there are +suggested keywords, there is no requirement to restrict the use to these +strings. It is strongly suggested that keywords and text be sensible +to humans (that's the point), so don't use abbreviations. Non-printing +symbols are not allowed. See the PNG specification for more details. +There is also no requirement to have text after the keyword. + +Keywords should be limited to 79 Latin-1 characters without leading or +trailing spaces, but non-consecutive spaces are allowed within the +keyword. It is possible to have the same keyword any number of times. +The text_ptr is an array of png_text structures, each holding a +pointer to a language string, a pointer to a keyword and a pointer to +a text string. The text string, language code, and translated +keyword may be empty or NULL pointers. The keyword/text +pairs are put into the array in the order that they are received. +However, some or all of the text chunks may be after the image, so, to +make sure you have read all the text chunks, don't mess with these +until after you read the stuff after the image. This will be +mentioned again below in the discussion that goes with png_read_end(). + +Input transformations + +After you've read the header information, you can set up the library +to handle any special transformations of the image data. The various +ways to transform the data will be described in the order that they +should occur. This is important, as some of these change the color +type and/or bit depth of the data, and some others only work on +certain color types and bit depths. Even though each transformation +checks to see if it has data that it can do something with, you should +make sure to only enable a transformation if it will be valid for the +data. For example, don't swap red and blue on grayscale data. + +The colors used for the background and transparency values should be +supplied in the same format/depth as the current image data. They +are stored in the same format/depth as the image data in a bKGD or tRNS +chunk, so this is what libpng expects for this data. The colors are +transformed to keep in sync with the image data when an application +calls the png_read_update_info() routine (see below). + +Data will be decoded into the supplied row buffers packed into bytes +unless the library has been told to transform it into another format. +For example, 4 bit/pixel paletted or grayscale data will be returned +2 pixels/byte with the leftmost pixel in the high-order bits of the +byte, unless png_set_packing() is called. 8-bit RGB data will be stored +in RGB RGB RGB format unless png_set_filler() or png_set_add_alpha() +is called to insert filler bytes, either before or after each RGB triplet. +16-bit RGB data will be returned RRGGBB RRGGBB, with the most significant +byte of the color value first, unless png_set_strip_16() is called to +transform it to regular RGB RGB triplets, or png_set_filler() or +png_set_add alpha() is called to insert filler bytes, either before or +after each RRGGBB triplet. Similarly, 8-bit or 16-bit grayscale data can +be modified with +png_set_filler(), png_set_add_alpha(), or png_set_strip_16(). + +The following code transforms grayscale images of less than 8 to 8 bits, +changes paletted images to RGB, and adds a full alpha channel if there is +transparency information in a tRNS chunk. This is most useful on +grayscale images with bit depths of 2 or 4 or if there is a multiple-image +viewing application that wishes to treat all images in the same way. + + if (color_type == PNG_COLOR_TYPE_PALETTE) + png_set_palette_to_rgb(png_ptr); + + if (color_type == PNG_COLOR_TYPE_GRAY && + bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr); + + if (png_get_valid(png_ptr, info_ptr, + PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr); + +These three functions are actually aliases for png_set_expand(), added +in libpng version 1.0.4, with the function names expanded to improve code +readability. In some future version they may actually do different +things. + +As of libpng version 1.2.9, png_set_expand_gray_1_2_4_to_8() was +added. It expands the sample depth without changing tRNS to alpha. + +PNG can have files with 16 bits per channel. If you only can handle +8 bits per channel, this will strip the pixels down to 8 bit. + + if (bit_depth == 16) + png_set_strip_16(png_ptr); + +If, for some reason, you don't need the alpha channel on an image, +and you want to remove it rather than combining it with the background +(but the image author certainly had in mind that you *would* combine +it with the background, so that's what you should probably do): + + if (color_type & PNG_COLOR_MASK_ALPHA) + png_set_strip_alpha(png_ptr); + +In PNG files, the alpha channel in an image +is the level of opacity. If you need the alpha channel in an image to +be the level of transparency instead of opacity, you can invert the +alpha channel (or the tRNS chunk data) after it's read, so that 0 is +fully opaque and 255 (in 8-bit or paletted images) or 65535 (in 16-bit +images) is fully transparent, with + + png_set_invert_alpha(png_ptr); + +PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as +they can, resulting in, for example, 8 pixels per byte for 1 bit +files. This code expands to 1 pixel per byte without changing the +values of the pixels: + + if (bit_depth < 8) + png_set_packing(png_ptr); + +PNG files have possible bit depths of 1, 2, 4, 8, and 16. All pixels +stored in a PNG image have been "scaled" or "shifted" up to the next +higher possible bit depth (e.g. from 5 bits/sample in the range [0,31] to +8 bits/sample in the range [0, 255]). However, it is also possible to +convert the PNG pixel data back to the original bit depth of the image. +This call reduces the pixels back down to the original bit depth: + + png_color_8p sig_bit; + + if (png_get_sBIT(png_ptr, info_ptr, &sig_bit)) + png_set_shift(png_ptr, sig_bit); + +PNG files store 3-color pixels in red, green, blue order. This code +changes the storage of the pixels to blue, green, red: + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_bgr(png_ptr); + +PNG files store RGB pixels packed into 3 or 6 bytes. This code expands them +into 4 or 8 bytes for windowing systems that need them in this format: + + if (color_type == PNG_COLOR_TYPE_RGB) + png_set_filler(png_ptr, filler, PNG_FILLER_BEFORE); + +where "filler" is the 8 or 16-bit number to fill with, and the location is +either PNG_FILLER_BEFORE or PNG_FILLER_AFTER, depending upon whether +you want the filler before the RGB or after. This transformation +does not affect images that already have full alpha channels. To add an +opaque alpha channel, use filler=0xff or 0xffff and PNG_FILLER_AFTER which +will generate RGBA pixels. + +Note that png_set_filler() does not change the color type. If you want +to do that, you can add a true alpha channel with + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_GRAY) + png_set_add_alpha(png_ptr, filler, PNG_FILLER_AFTER); + +where "filler" contains the alpha value to assign to each pixel. +This function was added in libpng-1.2.7. + +If you are reading an image with an alpha channel, and you need the +data as ARGB instead of the normal PNG format RGBA: + + if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_swap_alpha(png_ptr); + +For some uses, you may want a grayscale image to be represented as +RGB. This code will do that conversion: + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb(png_ptr); + +Conversely, you can convert an RGB or RGBA image to grayscale or grayscale +with alpha. + + if (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) + png_set_rgb_to_gray_fixed(png_ptr, error_action, + int red_weight, int green_weight); + + error_action = 1: silently do the conversion + error_action = 2: issue a warning if the original + image has any pixel where + red != green or red != blue + error_action = 3: issue an error and abort the + conversion if the original + image has any pixel where + red != green or red != blue + + red_weight: weight of red component times 100000 + green_weight: weight of green component times 100000 + If either weight is negative, default + weights (21268, 71514) are used. + +If you have set error_action = 1 or 2, you can +later check whether the image really was gray, after processing +the image rows, with the png_get_rgb_to_gray_status(png_ptr) function. +It will return a png_byte that is zero if the image was gray or +1 if there were any non-gray pixels. bKGD and sBIT data +will be silently converted to grayscale, using the green channel +data, regardless of the error_action setting. + +With red_weight+green_weight<=100000, +the normalized graylevel is computed: + + int rw = red_weight * 65536; + int gw = green_weight * 65536; + int bw = 65536 - (rw + gw); + gray = (rw*red + gw*green + bw*blue)/65536; + +The default values approximate those recommended in the Charles +Poynton's Color FAQ, +Copyright (c) 1998-01-04 Charles Poynton + + Y = 0.212671 * R + 0.715160 * G + 0.072169 * B + +Libpng approximates this with + + Y = 0.21268 * R + 0.7151 * G + 0.07217 * B + +which can be expressed with integers as + + Y = (6969 * R + 23434 * G + 2365 * B)/32768 + +The calculation is done in a linear colorspace, if the image gamma +is known. + +If you have a grayscale and you are using png_set_expand_depth(), +png_set_expand(), or png_set_gray_to_rgb to change to truecolor or to +a higher bit-depth, you must either supply the background color as a gray +value at the original file bit-depth (need_expand = 1) or else supply the +background color as an RGB triplet at the final, expanded bit depth +(need_expand = 0). Similarly, if you are reading a paletted image, you +must either supply the background color as a palette index (need_expand = 1) +or as an RGB triplet that may or may not be in the palette (need_expand = 0). + + png_color_16 my_background; + png_color_16p image_background; + + if (png_get_bKGD(png_ptr, info_ptr, &image_background)) + png_set_background(png_ptr, image_background, + PNG_BACKGROUND_GAMMA_FILE, 1, 1.0); + else + png_set_background(png_ptr, &my_background, + PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0); + +The png_set_background() function tells libpng to composite images +with alpha or simple transparency against the supplied background +color. If the PNG file contains a bKGD chunk (PNG_INFO_bKGD valid), +you may use this color, or supply another color more suitable for +the current display (e.g., the background color from a web page). You +need to tell libpng whether the color is in the gamma space of the +display (PNG_BACKGROUND_GAMMA_SCREEN for colors you supply), the file +(PNG_BACKGROUND_GAMMA_FILE for colors from the bKGD chunk), or one +that is neither of these gammas (PNG_BACKGROUND_GAMMA_UNIQUE - I don't +know why anyone would use this, but it's here). + +To properly display PNG images on any kind of system, the application needs +to know what the display gamma is. Ideally, the user will know this, and +the application will allow them to set it. One method of allowing the user +to set the display gamma separately for each system is to check for a +SCREEN_GAMMA or DISPLAY_GAMMA environment variable, which will hopefully be +correctly set. + +Note that display_gamma is the overall gamma correction required to produce +pleasing results, which depends on the lighting conditions in the surrounding +environment. In a dim or brightly lit room, no compensation other than +the physical gamma exponent of the monitor is needed, while in a dark room +a slightly smaller exponent is better. + + double gamma, screen_gamma; + + if (/* We have a user-defined screen + gamma value */) + { + screen_gamma = user_defined_screen_gamma; + } + /* One way that applications can share the same + screen gamma value */ + else if ((gamma_str = getenv("SCREEN_GAMMA")) + != NULL) + { + screen_gamma = (double)atof(gamma_str); + } + /* If we don't have another value */ + else + { + screen_gamma = 2.2; /* A good guess for a + PC monitor in a bright office or a dim room */ + screen_gamma = 2.0; /* A good guess for a + PC monitor in a dark room */ + screen_gamma = 1.7 or 1.0; /* A good + guess for Mac systems */ + } + +The png_set_gamma() function handles gamma transformations of the data. +Pass both the file gamma and the current screen_gamma. If the file does +not have a gamma value, you can pass one anyway if you have an idea what +it is (usually 0.45455 is a good guess for GIF images on PCs). Note +that file gammas are inverted from screen gammas. See the discussions +on gamma in the PNG specification for an excellent description of what +gamma is, and why all applications should support it. It is strongly +recommended that PNG viewers support gamma correction. + + if (png_get_gAMA(png_ptr, info_ptr, &gamma)) + png_set_gamma(png_ptr, screen_gamma, gamma); + else + png_set_gamma(png_ptr, screen_gamma, 0.45455); + +If you need to reduce an RGB file to a paletted file, or if a paletted +file has more entries then will fit on your screen, png_set_dither() +will do that. Note that this is a simple match dither that merely +finds the closest color available. This should work fairly well with +optimized palettes, and fairly badly with linear color cubes. If you +pass a palette that is larger then maximum_colors, the file will +reduce the number of colors in the palette so it will fit into +maximum_colors. If there is a histogram, it will use it to make +more intelligent choices when reducing the palette. If there is no +histogram, it may not do as good a job. + + if (color_type & PNG_COLOR_MASK_COLOR) + { + if (png_get_valid(png_ptr, info_ptr, + PNG_INFO_PLTE)) + { + png_uint_16p histogram = NULL; + + png_get_hIST(png_ptr, info_ptr, + &histogram); + png_set_dither(png_ptr, palette, num_palette, + max_screen_colors, histogram, 1); + } + else + { + png_color std_color_cube[MAX_SCREEN_COLORS] = + { ... colors ... }; + + png_set_dither(png_ptr, std_color_cube, + MAX_SCREEN_COLORS, MAX_SCREEN_COLORS, + NULL,0); + } + } + +PNG files describe monochrome as black being zero and white being one. +The following code will reverse this (make black be one and white be +zero): + + if (bit_depth == 1 && color_type == PNG_COLOR_TYPE_GRAY) + png_set_invert_mono(png_ptr); + +This function can also be used to invert grayscale and gray-alpha images: + + if (color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_invert_mono(png_ptr); + +PNG files store 16 bit pixels in network byte order (big-endian, +ie. most significant bits first). This code changes the storage to the +other way (little-endian, i.e. least significant bits first, the +way PCs store them): + + if (bit_depth == 16) + png_set_swap(png_ptr); + +If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you +need to change the order the pixels are packed into bytes, you can use: + + if (bit_depth < 8) + png_set_packswap(png_ptr); + +Finally, you can write your own transformation function if none of +the existing ones meets your needs. This is done by setting a callback +with + + png_set_read_user_transform_fn(png_ptr, + read_transform_fn); + +You must supply the function + + void read_transform_fn(png_ptr ptr, row_info_ptr + row_info, png_bytep data) + +See pngtest.c for a working example. Your function will be called +after all of the other transformations have been processed. + +You can also set up a pointer to a user structure for use by your +callback function, and you can inform libpng that your transform +function will change the number of channels or bit depth with the +function + + png_set_user_transform_info(png_ptr, user_ptr, + user_depth, user_channels); + +The user's application, not libpng, is responsible for allocating and +freeing any memory required for the user structure. + +You can retrieve the pointer via the function +png_get_user_transform_ptr(). For example: + + voidp read_user_transform_ptr = + png_get_user_transform_ptr(png_ptr); + +The last thing to handle is interlacing; this is covered in detail below, +but you must call the function here if you want libpng to handle expansion +of the interlaced image. + + number_of_passes = png_set_interlace_handling(png_ptr); + +After setting the transformations, libpng can update your png_info +structure to reflect any transformations you've requested with this +call. This is most useful to update the info structure's rowbytes +field so you can use it to allocate your image memory. This function +will also update your palette with the correct screen_gamma and +background if these have been given with the calls above. + + png_read_update_info(png_ptr, info_ptr); + +After you call png_read_update_info(), you can allocate any +memory you need to hold the image. The row data is simply +raw byte data for all forms of images. As the actual allocation +varies among applications, no example will be given. If you +are allocating one large chunk, you will need to build an +array of pointers to each row, as it will be needed for some +of the functions below. + +Reading image data + +After you've allocated memory, you can read the image data. +The simplest way to do this is in one function call. If you are +allocating enough memory to hold the whole image, you can just +call png_read_image() and libpng will read in all the image data +and put it in the memory area supplied. You will need to pass in +an array of pointers to each row. + +This function automatically handles interlacing, so you don't need +to call png_set_interlace_handling() or call this function multiple +times, or any of that other stuff necessary with png_read_rows(). + + png_read_image(png_ptr, row_pointers); + +where row_pointers is: + + png_bytep row_pointers[height]; + +You can point to void or char or whatever you use for pixels. + +If you don't want to read in the whole image at once, you can +use png_read_rows() instead. If there is no interlacing (check +interlace_type == PNG_INTERLACE_NONE), this is simple: + + png_read_rows(png_ptr, row_pointers, NULL, + number_of_rows); + +where row_pointers is the same as in the png_read_image() call. + +If you are doing this just one row at a time, you can do this with +a single row_pointer instead of an array of row_pointers: + + png_bytep row_pointer = row; + png_read_row(png_ptr, row_pointer, NULL); + +If the file is interlaced (interlace_type != 0 in the IHDR chunk), things +get somewhat harder. The only current (PNG Specification version 1.2) +interlacing type for PNG is (interlace_type == PNG_INTERLACE_ADAM7) +is a somewhat complicated 2D interlace scheme, known as Adam7, that +breaks down an image into seven smaller images of varying size, based +on an 8x8 grid. + +libpng can fill out those images or it can give them to you "as is". +If you want them filled out, there are two ways to do that. The one +mentioned in the PNG specification is to expand each pixel to cover +those pixels that have not been read yet (the "rectangle" method). +This results in a blocky image for the first pass, which gradually +smooths out as more pixels are read. The other method is the "sparkle" +method, where pixels are drawn only in their final locations, with the +rest of the image remaining whatever colors they were initialized to +before the start of the read. The first method usually looks better, +but tends to be slower, as there are more pixels to put in the rows. + +If you don't want libpng to handle the interlacing details, just call +png_read_rows() seven times to read in all seven images. Each of the +images is a valid image by itself, or they can all be combined on an +8x8 grid to form a single image (although if you intend to combine them +you would be far better off using the libpng interlace handling). + +The first pass will return an image 1/8 as wide as the entire image +(every 8th column starting in column 0) and 1/8 as high as the original +(every 8th row starting in row 0), the second will be 1/8 as wide +(starting in column 4) and 1/8 as high (also starting in row 0). The +third pass will be 1/4 as wide (every 4th pixel starting in column 0) and +1/8 as high (every 8th row starting in row 4), and the fourth pass will +be 1/4 as wide and 1/4 as high (every 4th column starting in column 2, +and every 4th row starting in row 0). The fifth pass will return an +image 1/2 as wide, and 1/4 as high (starting at column 0 and row 2), +while the sixth pass will be 1/2 as wide and 1/2 as high as the original +(starting in column 1 and row 0). The seventh and final pass will be as +wide as the original, and 1/2 as high, containing all of the odd +numbered scanlines. Phew! + +If you want libpng to expand the images, call this before calling +png_start_read_image() or png_read_update_info(): + + if (interlace_type == PNG_INTERLACE_ADAM7) + number_of_passes + = png_set_interlace_handling(png_ptr); + +This will return the number of passes needed. Currently, this +is seven, but may change if another interlace type is added. +This function can be called even if the file is not interlaced, +where it will return one pass. + +If you are not going to display the image after each pass, but are +going to wait until the entire image is read in, use the sparkle +effect. This effect is faster and the end result of either method +is exactly the same. If you are planning on displaying the image +after each pass, the "rectangle" effect is generally considered the +better looking one. + +If you only want the "sparkle" effect, just call png_read_rows() as +normal, with the third parameter NULL. Make sure you make pass over +the image number_of_passes times, and you don't change the data in the +rows between calls. You can change the locations of the data, just +not the data. Each pass only writes the pixels appropriate for that +pass, and assumes the data from previous passes is still valid. + + png_read_rows(png_ptr, row_pointers, NULL, + number_of_rows); + +If you only want the first effect (the rectangles), do the same as +before except pass the row buffer in the third parameter, and leave +the second parameter NULL. + + png_read_rows(png_ptr, NULL, row_pointers, + number_of_rows); + +Finishing a sequential read + +After you are finished reading the image through the +low-level interface, you can finish reading the file. If you are +interested in comments or time, which may be stored either before or +after the image data, you should pass the separate png_info struct if +you want to keep the comments from before and after the image +separate. If you are not interested, you can pass NULL. + + png_read_end(png_ptr, end_info); + +When you are done, you can free all memory allocated by libpng like this: + + png_destroy_read_struct(&png_ptr, &info_ptr, + &end_info); + +It is also possible to individually free the info_ptr members that +point to libpng-allocated storage with the following function: + + png_free_data(png_ptr, info_ptr, mask, seq) + mask - identifies data to be freed, a mask + containing the bitwise OR of one or + more of + PNG_FREE_PLTE, PNG_FREE_TRNS, + PNG_FREE_HIST, PNG_FREE_ICCP, + PNG_FREE_PCAL, PNG_FREE_ROWS, + PNG_FREE_SCAL, PNG_FREE_SPLT, + PNG_FREE_TEXT, PNG_FREE_UNKN, + or simply PNG_FREE_ALL + seq - sequence number of item to be freed + (-1 for all items) + +This function may be safely called when the relevant storage has +already been freed, or has not yet been allocated, or was allocated +by the user and not by libpng, and will in those +cases do nothing. The "seq" parameter is ignored if only one item +of the selected data type, such as PLTE, is allowed. If "seq" is not +-1, and multiple items are allowed for the data type identified in +the mask, such as text or sPLT, only the n'th item in the structure +is freed, where n is "seq". + +The default behavior is only to free data that was allocated internally +by libpng. This can be changed, so that libpng will not free the data, +or so that it will free data that was allocated by the user with png_malloc() +or png_zalloc() and passed in via a png_set_*() function, with + + png_data_freer(png_ptr, info_ptr, freer, mask) + mask - which data elements are affected + same choices as in png_free_data() + freer - one of + PNG_DESTROY_WILL_FREE_DATA + PNG_SET_WILL_FREE_DATA + PNG_USER_WILL_FREE_DATA + +This function only affects data that has already been allocated. +You can call this function after reading the PNG data but before calling +any png_set_*() functions, to control whether the user or the png_set_*() +function is responsible for freeing any existing data that might be present, +and again after the png_set_*() functions to control whether the user +or png_destroy_*() is supposed to free the data. When the user assumes +responsibility for libpng-allocated data, the application must use +png_free() to free it, and when the user transfers responsibility to libpng +for data that the user has allocated, the user must have used png_malloc() +or png_zalloc() to allocate it. + +If you allocated your row_pointers in a single block, as suggested above in +the description of the high level read interface, you must not transfer +responsibility for freeing it to the png_set_rows or png_read_destroy function, +because they would also try to free the individual row_pointers[i]. + +If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword +separately, do not transfer responsibility for freeing text_ptr to libpng, +because when libpng fills a png_text structure it combines these members with +the key member, and png_free_data() will free only text_ptr.key. Similarly, +if you transfer responsibility for free'ing text_ptr from libpng to your +application, your application must not separately free those members. + +The png_free_data() function will turn off the "valid" flag for anything +it frees. If you need to turn the flag off for a chunk that was freed by your +application instead of by libpng, you can use + + png_set_invalid(png_ptr, info_ptr, mask); + mask - identifies the chunks to be made invalid, + containing the bitwise OR of one or + more of + PNG_INFO_gAMA, PNG_INFO_sBIT, + PNG_INFO_cHRM, PNG_INFO_PLTE, + PNG_INFO_tRNS, PNG_INFO_bKGD, + PNG_INFO_hIST, PNG_INFO_pHYs, + PNG_INFO_oFFs, PNG_INFO_tIME, + PNG_INFO_pCAL, PNG_INFO_sRGB, + PNG_INFO_iCCP, PNG_INFO_sPLT, + PNG_INFO_sCAL, PNG_INFO_IDAT + +For a more compact example of reading a PNG image, see the file example.c. + +Reading PNG files progressively + +The progressive reader is slightly different then the non-progressive +reader. Instead of calling png_read_info(), png_read_rows(), and +png_read_end(), you make one call to png_process_data(), which calls +callbacks when it has the info, a row, or the end of the image. You +set up these callbacks with png_set_progressive_read_fn(). You don't +have to worry about the input/output functions of libpng, as you are +giving the library the data directly in png_process_data(). I will +assume that you have read the section on reading PNG files above, +so I will only highlight the differences (although I will show +all of the code). + +png_structp png_ptr; +png_infop info_ptr; + + /* An example code fragment of how you would + initialize the progressive reader in your + application. */ + int + initialize_png_reader() + { + png_ptr = png_create_read_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + if (!png_ptr) + return (ERROR); + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, (png_infopp)NULL, + (png_infopp)NULL); + return (ERROR); + } + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + + /* This one's new. You can provide functions + to be called when the header info is valid, + when each row is completed, and when the image + is finished. If you aren't using all functions, + you can specify NULL parameters. Even when all + three functions are NULL, you need to call + png_set_progressive_read_fn(). You can use + any struct as the user_ptr (cast to a void pointer + for the function call), and retrieve the pointer + from inside the callbacks using the function + + png_get_progressive_ptr(png_ptr); + + which will return a void pointer, which you have + to cast appropriately. + */ + png_set_progressive_read_fn(png_ptr, (void *)user_ptr, + info_callback, row_callback, end_callback); + + return 0; + } + + /* A code fragment that you call as you receive blocks + of data */ + int + process_data(png_bytep buffer, png_uint_32 length) + { + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_read_struct(&png_ptr, &info_ptr, + (png_infopp)NULL); + return (ERROR); + } + + /* This one's new also. Simply give it a chunk + of data from the file stream (in order, of + course). On machines with segmented memory + models machines, don't give it any more than + 64K. The library seems to run fine with sizes + of 4K. Although you can give it much less if + necessary (I assume you can give it chunks of + 1 byte, I haven't tried less then 256 bytes + yet). When this function returns, you may + want to display any rows that were generated + in the row callback if you don't already do + so there. + */ + png_process_data(png_ptr, info_ptr, buffer, length); + return 0; + } + + /* This function is called (as set by + png_set_progressive_read_fn() above) when enough data + has been supplied so all of the header has been + read. + */ + void + info_callback(png_structp png_ptr, png_infop info) + { + /* Do any setup here, including setting any of + the transformations mentioned in the Reading + PNG files section. For now, you _must_ call + either png_start_read_image() or + png_read_update_info() after all the + transformations are set (even if you don't set + any). You may start getting rows before + png_process_data() returns, so this is your + last chance to prepare for that. + */ + } + + /* This function is called when each row of image + data is complete */ + void + row_callback(png_structp png_ptr, png_bytep new_row, + png_uint_32 row_num, int pass) + { + /* If the image is interlaced, and you turned + on the interlace handler, this function will + be called for every row in every pass. Some + of these rows will not be changed from the + previous pass. When the row is not changed, + the new_row variable will be NULL. The rows + and passes are called in order, so you don't + really need the row_num and pass, but I'm + supplying them because it may make your life + easier. + + For the non-NULL rows of interlaced images, + you must call png_progressive_combine_row() + passing in the row and the old row. You can + call this function for NULL rows (it will just + return) and for non-interlaced images (it just + does the memcpy for you) if it will make the + code easier. Thus, you can just do this for + all cases: + */ + + png_progressive_combine_row(png_ptr, old_row, + new_row); + + /* where old_row is what was displayed for + previously for the row. Note that the first + pass (pass == 0, really) will completely cover + the old row, so the rows do not have to be + initialized. After the first pass (and only + for interlaced images), you will have to pass + the current row, and the function will combine + the old row and the new row. + */ + } + + void + end_callback(png_structp png_ptr, png_infop info) + { + /* This function is called after the whole image + has been read, including any chunks after the + image (up to and including the IEND). You + will usually have the same info chunk as you + had in the header, although some data may have + been added to the comments and time fields. + + Most people won't do much here, perhaps setting + a flag that marks the image as finished. + */ + } + + + +IV. Writing + +Much of this is very similar to reading. However, everything of +importance is repeated here, so you won't have to constantly look +back up in the reading section to understand writing. + +Setup + +You will want to do the I/O initialization before you get into libpng, +so if it doesn't work, you don't have anything to undo. If you are not +using the standard I/O functions, you will need to replace them with +custom writing functions. See the discussion under Customizing libpng. + + FILE *fp = fopen(file_name, "wb"); + if (!fp) + { + return (ERROR); + } + +Next, png_struct and png_info need to be allocated and initialized. +As these can be both relatively large, you may not want to store these +on the stack, unless you have stack space to spare. Of course, you +will want to check if they return NULL. If you are also reading, +you won't want to name your read structure and your write structure +both "png_ptr"; you can call them anything you like, such as +"read_ptr" and "write_ptr". Look at pngtest.c, for example. + + png_structp png_ptr = png_create_write_struct + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn); + if (!png_ptr) + return (ERROR); + + png_infop info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_write_struct(&png_ptr, + (png_infopp)NULL); + return (ERROR); + } + +If you want to use your own memory allocation routines, +define PNG_USER_MEM_SUPPORTED and use +png_create_write_struct_2() instead of png_create_write_struct(): + + png_structp png_ptr = png_create_write_struct_2 + (PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr, + user_error_fn, user_warning_fn, (png_voidp) + user_mem_ptr, user_malloc_fn, user_free_fn); + +After you have these structures, you will need to set up the +error handling. When libpng encounters an error, it expects to +longjmp() back to your routine. Therefore, you will need to call +setjmp() and pass the png_jmpbuf(png_ptr). If you +write the file from different routines, you will need to update +the png_jmpbuf(png_ptr) every time you enter a new routine that will +call a png_*() function. See your documentation of setjmp/longjmp +for your compiler for more information on setjmp/longjmp. See +the discussion on libpng error handling in the Customizing Libpng +section below for more information on the libpng error handling. + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_write_struct(&png_ptr, &info_ptr); + fclose(fp); + return (ERROR); + } + ... + return; + +If you would rather avoid the complexity of setjmp/longjmp issues, +you can compile libpng with PNG_SETJMP_NOT_SUPPORTED, in which case +errors will result in a call to PNG_ABORT() which defaults to abort(). + +Now you need to set up the output code. The default for libpng is to +use the C function fwrite(). If you use this, you will need to pass a +valid FILE * in the function png_init_io(). Be sure that the file is +opened in binary mode. Again, if you wish to handle writing data in +another way, see the discussion on libpng I/O handling in the Customizing +Libpng section below. + + png_init_io(png_ptr, fp); + +If you are embedding your PNG into a datastream such as MNG, and don't +want libpng to write the 8-byte signature, or if you have already +written the signature in your application, use + + png_set_sig_bytes(png_ptr, 8); + +to inform libpng that it should not write a signature. + +Write callbacks + +At this point, you can set up a callback function that will be +called after each row has been written, which you can use to control +a progress meter or the like. It's demonstrated in pngtest.c. +You must supply a function + + void write_row_callback(png_ptr, png_uint_32 row, + int pass); + { + /* put your code here */ + } + +(You can give it another name that you like instead of "write_row_callback") + +To inform libpng about your function, use + + png_set_write_status_fn(png_ptr, write_row_callback); + +You now have the option of modifying how the compression library will +run. The following functions are mainly for testing, but may be useful +in some cases, like if you need to write PNG files extremely fast and +are willing to give up some compression, or if you want to get the +maximum possible compression at the expense of slower writing. If you +have no special needs in this area, let the library do what it wants by +not calling this function at all, as it has been tuned to deliver a good +speed/compression ratio. The second parameter to png_set_filter() is +the filter method, for which the only valid values are 0 (as of the +July 1999 PNG specification, version 1.2) or 64 (if you are writing +a PNG datastream that is to be embedded in a MNG datastream). The third +parameter is a flag that indicates which filter type(s) are to be tested +for each scanline. See the PNG specification for details on the specific filter +types. + + + /* turn on or off filtering, and/or choose + specific filters. You can use either a single + PNG_FILTER_VALUE_NAME or the bitwise OR of one + or more PNG_FILTER_NAME masks. */ + png_set_filter(png_ptr, 0, + PNG_FILTER_NONE | PNG_FILTER_VALUE_NONE | + PNG_FILTER_SUB | PNG_FILTER_VALUE_SUB | + PNG_FILTER_UP | PNG_FILTER_VALUE_UP | + PNG_FILTER_AVG | PNG_FILTER_VALUE_AVG | + PNG_FILTER_PAETH | PNG_FILTER_VALUE_PAETH| + PNG_ALL_FILTERS); + +If an application +wants to start and stop using particular filters during compression, +it should start out with all of the filters (to ensure that the previous +row of pixels will be stored in case it's needed later), and then add +and remove them after the start of compression. + +If you are writing a PNG datastream that is to be embedded in a MNG +datastream, the second parameter can be either 0 or 64. + +The png_set_compression_*() functions interface to the zlib compression +library, and should mostly be ignored unless you really know what you are +doing. The only generally useful call is png_set_compression_level() +which changes how much time zlib spends on trying to compress the image +data. See the Compression Library (zlib.h and algorithm.txt, distributed +with zlib) for details on the compression levels. + + /* set the zlib compression level */ + png_set_compression_level(png_ptr, + Z_BEST_COMPRESSION); + + /* set other zlib parameters */ + png_set_compression_mem_level(png_ptr, 8); + png_set_compression_strategy(png_ptr, + Z_DEFAULT_STRATEGY); + png_set_compression_window_bits(png_ptr, 15); + png_set_compression_method(png_ptr, 8); + png_set_compression_buffer_size(png_ptr, 8192) + +extern PNG_EXPORT(void,png_set_zbuf_size) + +Setting the contents of info for output + +You now need to fill in the png_info structure with all the data you +wish to write before the actual image. Note that the only thing you +are allowed to write after the image is the text chunks and the time +chunk (as of PNG Specification 1.2, anyway). See png_write_end() and +the latest PNG specification for more information on that. If you +wish to write them before the image, fill them in now, and flag that +data as being valid. If you want to wait until after the data, don't +fill them until png_write_end(). For all the fields in png_info and +their data types, see png.h. For explanations of what the fields +contain, see the PNG specification. + +Some of the more important parts of the png_info are: + + png_set_IHDR(png_ptr, info_ptr, width, height, + bit_depth, color_type, interlace_type, + compression_type, filter_method) + width - holds the width of the image + in pixels (up to 2^31). + height - holds the height of the image + in pixels (up to 2^31). + bit_depth - holds the bit depth of one of the + image channels. + (valid values are 1, 2, 4, 8, 16 + and depend also on the + color_type. See also significant + bits (sBIT) below). + color_type - describes which color/alpha + channels are present. + PNG_COLOR_TYPE_GRAY + (bit depths 1, 2, 4, 8, 16) + PNG_COLOR_TYPE_GRAY_ALPHA + (bit depths 8, 16) + PNG_COLOR_TYPE_PALETTE + (bit depths 1, 2, 4, 8) + PNG_COLOR_TYPE_RGB + (bit_depths 8, 16) + PNG_COLOR_TYPE_RGB_ALPHA + (bit_depths 8, 16) + + PNG_COLOR_MASK_PALETTE + PNG_COLOR_MASK_COLOR + PNG_COLOR_MASK_ALPHA + + interlace_type - PNG_INTERLACE_NONE or + PNG_INTERLACE_ADAM7 + compression_type - (must be + PNG_COMPRESSION_TYPE_DEFAULT) + filter_method - (must be PNG_FILTER_TYPE_DEFAULT + or, if you are writing a PNG to + be embedded in a MNG datastream, + can also be + PNG_INTRAPIXEL_DIFFERENCING) + +If you call png_set_IHDR(), the call must appear before any of the +other png_set_*() functions, because they might require access to some of +the IHDR settings. The remaining png_set_*() functions can be called +in any order. + +If you wish, you can reset the compression_type, interlace_type, or +filter_method later by calling png_set_IHDR() again; if you do this, the +width, height, bit_depth, and color_type must be the same in each call. + + png_set_PLTE(png_ptr, info_ptr, palette, + num_palette); + palette - the palette for the file + (array of png_color) + num_palette - number of entries in the palette + + png_set_gAMA(png_ptr, info_ptr, gamma); + gamma - the gamma the image was created + at (PNG_INFO_gAMA) + + png_set_sRGB(png_ptr, info_ptr, srgb_intent); + srgb_intent - the rendering intent + (PNG_INFO_sRGB) The presence of + the sRGB chunk means that the pixel + data is in the sRGB color space. + This chunk also implies specific + values of gAMA and cHRM. Rendering + intent is the CSS-1 property that + has been defined by the International + Color Consortium + (http://www.color.org). + It can be one of + PNG_sRGB_INTENT_SATURATION, + PNG_sRGB_INTENT_PERCEPTUAL, + PNG_sRGB_INTENT_ABSOLUTE, or + PNG_sRGB_INTENT_RELATIVE. + + + png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, + srgb_intent); + srgb_intent - the rendering intent + (PNG_INFO_sRGB) The presence of the + sRGB chunk means that the pixel + data is in the sRGB color space. + This function also causes gAMA and + cHRM chunks with the specific values + that are consistent with sRGB to be + written. + + png_set_iCCP(png_ptr, info_ptr, name, compression_type, + profile, proflen); + name - The profile name. + compression - The compression type; always + PNG_COMPRESSION_TYPE_BASE for PNG 1.0. + You may give NULL to this argument to + ignore it. + profile - International Color Consortium color + profile data. May contain NULs. + proflen - length of profile data in bytes. + + png_set_sBIT(png_ptr, info_ptr, sig_bit); + sig_bit - the number of significant bits for + (PNG_INFO_sBIT) each of the gray, red, + green, and blue channels, whichever are + appropriate for the given color type + (png_color_16) + + png_set_tRNS(png_ptr, info_ptr, trans, num_trans, + trans_values); + trans - array of transparent entries for + palette (PNG_INFO_tRNS) + trans_values - graylevel or color sample values + (in order red, green, blue) of the + single transparent color for + non-paletted images (PNG_INFO_tRNS) + num_trans - number of transparent entries + (PNG_INFO_tRNS) + + png_set_hIST(png_ptr, info_ptr, hist); + (PNG_INFO_hIST) + hist - histogram of palette (array of + png_uint_16) + + png_set_tIME(png_ptr, info_ptr, mod_time); + mod_time - time image was last modified + (PNG_VALID_tIME) + + png_set_bKGD(png_ptr, info_ptr, background); + background - background color (PNG_VALID_bKGD) + + png_set_text(png_ptr, info_ptr, text_ptr, num_text); + text_ptr - array of png_text holding image + comments + text_ptr[i].compression - type of compression used + on "text" PNG_TEXT_COMPRESSION_NONE + PNG_TEXT_COMPRESSION_zTXt + PNG_ITXT_COMPRESSION_NONE + PNG_ITXT_COMPRESSION_zTXt + text_ptr[i].key - keyword for comment. Must contain + 1-79 characters. + text_ptr[i].text - text comments for current + keyword. Can be NULL or empty. + text_ptr[i].text_length - length of text string, + after decompression, 0 for iTXt + text_ptr[i].itxt_length - length of itxt string, + after decompression, 0 for tEXt/zTXt + text_ptr[i].lang - language of comment (NULL or + empty for unknown). + text_ptr[i].translated_keyword - keyword in UTF-8 (NULL + or empty for unknown). + num_text - number of comments + + png_set_sPLT(png_ptr, info_ptr, &palette_ptr, + num_spalettes); + palette_ptr - array of png_sPLT_struct structures + to be added to the list of palettes + in the info structure. + num_spalettes - number of palette structures to be + added. + + png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, + unit_type); + offset_x - positive offset from the left + edge of the screen + offset_y - positive offset from the top + edge of the screen + unit_type - PNG_OFFSET_PIXEL, PNG_OFFSET_MICROMETER + + png_set_pHYs(png_ptr, info_ptr, res_x, res_y, + unit_type); + res_x - pixels/unit physical resolution + in x direction + res_y - pixels/unit physical resolution + in y direction + unit_type - PNG_RESOLUTION_UNKNOWN, + PNG_RESOLUTION_METER + + png_set_sCAL(png_ptr, info_ptr, unit, width, height) + unit - physical scale units (an integer) + width - width of a pixel in physical scale units + height - height of a pixel in physical scale units + (width and height are doubles) + + png_set_sCAL_s(png_ptr, info_ptr, unit, width, height) + unit - physical scale units (an integer) + width - width of a pixel in physical scale units + height - height of a pixel in physical scale units + (width and height are strings like "2.54") + + png_set_unknown_chunks(png_ptr, info_ptr, &unknowns, + num_unknowns) + unknowns - array of png_unknown_chunk + structures holding unknown chunks + unknowns[i].name - name of unknown chunk + unknowns[i].data - data of unknown chunk + unknowns[i].size - size of unknown chunk's data + unknowns[i].location - position to write chunk in file + 0: do not write chunk + PNG_HAVE_IHDR: before PLTE + PNG_HAVE_PLTE: before IDAT + PNG_AFTER_IDAT: after IDAT + +The "location" member is set automatically according to +what part of the output file has already been written. +You can change its value after calling png_set_unknown_chunks() +as demonstrated in pngtest.c. Within each of the "locations", +the chunks are sequenced according to their position in the +structure (that is, the value of "i", which is the order in which +the chunk was either read from the input file or defined with +png_set_unknown_chunks). + +A quick word about text and num_text. text is an array of png_text +structures. num_text is the number of valid structures in the array. +Each png_text structure holds a language code, a keyword, a text value, +and a compression type. + +The compression types have the same valid numbers as the compression +types of the image data. Currently, the only valid number is zero. +However, you can store text either compressed or uncompressed, unlike +images, which always have to be compressed. So if you don't want the +text compressed, set the compression type to PNG_TEXT_COMPRESSION_NONE. +Because tEXt and zTXt chunks don't have a language field, if you +specify PNG_TEXT_COMPRESSION_NONE or PNG_TEXT_COMPRESSION_zTXt +any language code or translated keyword will not be written out. + +Until text gets around 1000 bytes, it is not worth compressing it. +After the text has been written out to the file, the compression type +is set to PNG_TEXT_COMPRESSION_NONE_WR or PNG_TEXT_COMPRESSION_zTXt_WR, +so that it isn't written out again at the end (in case you are calling +png_write_end() with the same struct. + +The keywords that are given in the PNG Specification are: + + Title Short (one line) title or + caption for image + Author Name of image's creator + Description Description of image (possibly long) + Copyright Copyright notice + Creation Time Time of original image creation + (usually RFC 1123 format, see below) + Software Software used to create the image + Disclaimer Legal disclaimer + Warning Warning of nature of content + Source Device used to create the image + Comment Miscellaneous comment; conversion + from other image format + +The keyword-text pairs work like this. Keywords should be short +simple descriptions of what the comment is about. Some typical +keywords are found in the PNG specification, as is some recommendations +on keywords. You can repeat keywords in a file. You can even write +some text before the image and some after. For example, you may want +to put a description of the image before the image, but leave the +disclaimer until after, so viewers working over modem connections +don't have to wait for the disclaimer to go over the modem before +they start seeing the image. Finally, keywords should be full +words, not abbreviations. Keywords and text are in the ISO 8859-1 +(Latin-1) character set (a superset of regular ASCII) and can not +contain NUL characters, and should not contain control or other +unprintable characters. To make the comments widely readable, stick +with basic ASCII, and avoid machine specific character set extensions +like the IBM-PC character set. The keyword must be present, but +you can leave off the text string on non-compressed pairs. +Compressed pairs must have a text string, as only the text string +is compressed anyway, so the compression would be meaningless. + +PNG supports modification time via the png_time structure. Two +conversion routines are provided, png_convert_from_time_t() for +time_t and png_convert_from_struct_tm() for struct tm. The +time_t routine uses gmtime(). You don't have to use either of +these, but if you wish to fill in the png_time structure directly, +you should provide the time in universal time (GMT) if possible +instead of your local time. Note that the year number is the full +year (e.g. 1998, rather than 98 - PNG is year 2000 compliant!), and +that months start with 1. + +If you want to store the time of the original image creation, you should +use a plain tEXt chunk with the "Creation Time" keyword. This is +necessary because the "creation time" of a PNG image is somewhat vague, +depending on whether you mean the PNG file, the time the image was +created in a non-PNG format, a still photo from which the image was +scanned, or possibly the subject matter itself. In order to facilitate +machine-readable dates, it is recommended that the "Creation Time" +tEXt chunk use RFC 1123 format dates (e.g. "22 May 1997 18:07:10 GMT"), +although this isn't a requirement. Unlike the tIME chunk, the +"Creation Time" tEXt chunk is not expected to be automatically changed +by the software. To facilitate the use of RFC 1123 dates, a function +png_convert_to_rfc1123(png_timep) is provided to convert from PNG +time to an RFC 1123 format string. + +Writing unknown chunks + +You can use the png_set_unknown_chunks function to queue up chunks +for writing. You give it a chunk name, raw data, and a size; that's +all there is to it. The chunks will be written by the next following +png_write_info_before_PLTE, png_write_info, or png_write_end function. +Any chunks previously read into the info structure's unknown-chunk +list will also be written out in a sequence that satisfies the PNG +specification's ordering rules. + +The high-level write interface + +At this point there are two ways to proceed; through the high-level +write interface, or through a sequence of low-level write operations. +You can use the high-level interface if your image data is present +in the info structure. All defined output +transformations are permitted, enabled by the following masks. + + PNG_TRANSFORM_IDENTITY No transformation + PNG_TRANSFORM_PACKING Pack 1, 2 and 4-bit samples + PNG_TRANSFORM_PACKSWAP Change order of packed + pixels to LSB first + PNG_TRANSFORM_INVERT_MONO Invert monochrome images + PNG_TRANSFORM_SHIFT Normalize pixels to the + sBIT depth + PNG_TRANSFORM_BGR Flip RGB to BGR, RGBA + to BGRA + PNG_TRANSFORM_SWAP_ALPHA Flip RGBA to ARGB or GA + to AG + PNG_TRANSFORM_INVERT_ALPHA Change alpha from opacity + to transparency + PNG_TRANSFORM_SWAP_ENDIAN Byte-swap 16-bit samples + PNG_TRANSFORM_STRIP_FILLER Strip out filler + bytes (deprecated). + PNG_TRANSFORM_STRIP_FILLER_BEFORE Strip out leading + filler bytes + PNG_TRANSFORM_STRIP_FILLER_AFTER Strip out trailing + filler bytes + +If you have valid image data in the info structure (you can use +png_set_rows() to put image data in the info structure), simply do this: + + png_write_png(png_ptr, info_ptr, png_transforms, NULL) + +where png_transforms is an integer containing the bitwise OR of some set of +transformation flags. This call is equivalent to png_write_info(), +followed the set of transformations indicated by the transform mask, +then png_write_image(), and finally png_write_end(). + +(The final parameter of this call is not yet used. Someday it might point +to transformation parameters required by some future output transform.) + +You must use png_transforms and not call any png_set_transform() functions +when you use png_write_png(). + +The low-level write interface + +If you are going the low-level route instead, you are now ready to +write all the file information up to the actual image data. You do +this with a call to png_write_info(). + + png_write_info(png_ptr, info_ptr); + +Note that there is one transformation you may need to do before +png_write_info(). In PNG files, the alpha channel in an image is the +level of opacity. If your data is supplied as a level of +transparency, you can invert the alpha channel before you write it, so +that 0 is fully transparent and 255 (in 8-bit or paletted images) or +65535 (in 16-bit images) is fully opaque, with + + png_set_invert_alpha(png_ptr); + +This must appear before png_write_info() instead of later with the +other transformations because in the case of paletted images the tRNS +chunk data has to be inverted before the tRNS chunk is written. If +your image is not a paletted image, the tRNS data (which in such cases +represents a single color to be rendered as transparent) won't need to +be changed, and you can safely do this transformation after your +png_write_info() call. + +If you need to write a private chunk that you want to appear before +the PLTE chunk when PLTE is present, you can write the PNG info in +two steps, and insert code to write your own chunk between them: + + png_write_info_before_PLTE(png_ptr, info_ptr); + png_set_unknown_chunks(png_ptr, info_ptr, ...); + png_write_info(png_ptr, info_ptr); + +After you've written the file information, you can set up the library +to handle any special transformations of the image data. The various +ways to transform the data will be described in the order that they +should occur. This is important, as some of these change the color +type and/or bit depth of the data, and some others only work on +certain color types and bit depths. Even though each transformation +checks to see if it has data that it can do something with, you should +make sure to only enable a transformation if it will be valid for the +data. For example, don't swap red and blue on grayscale data. + +PNG files store RGB pixels packed into 3 or 6 bytes. This code tells +the library to strip input data that has 4 or 8 bytes per pixel down +to 3 or 6 bytes (or strip 2 or 4-byte grayscale+filler data to 1 or 2 +bytes per pixel). + + png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); + +where the 0 is unused, and the location is either PNG_FILLER_BEFORE or +PNG_FILLER_AFTER, depending upon whether the filler byte in the pixel +is stored XRGB or RGBX. + +PNG files pack pixels of bit depths 1, 2, and 4 into bytes as small as +they can, resulting in, for example, 8 pixels per byte for 1 bit files. +If the data is supplied at 1 pixel per byte, use this code, which will +correctly pack the pixels into a single byte: + + png_set_packing(png_ptr); + +PNG files reduce possible bit depths to 1, 2, 4, 8, and 16. If your +data is of another bit depth, you can write an sBIT chunk into the +file so that decoders can recover the original data if desired. + + /* Set the true bit depth of the image data */ + if (color_type & PNG_COLOR_MASK_COLOR) + { + sig_bit.red = true_bit_depth; + sig_bit.green = true_bit_depth; + sig_bit.blue = true_bit_depth; + } + else + { + sig_bit.gray = true_bit_depth; + } + if (color_type & PNG_COLOR_MASK_ALPHA) + { + sig_bit.alpha = true_bit_depth; + } + + png_set_sBIT(png_ptr, info_ptr, &sig_bit); + +If the data is stored in the row buffer in a bit depth other than +one supported by PNG (e.g. 3 bit data in the range 0-7 for a 4-bit PNG), +this will scale the values to appear to be the correct bit depth as +is required by PNG. + + png_set_shift(png_ptr, &sig_bit); + +PNG files store 16 bit pixels in network byte order (big-endian, +ie. most significant bits first). This code would be used if they are +supplied the other way (little-endian, i.e. least significant bits +first, the way PCs store them): + + if (bit_depth > 8) + png_set_swap(png_ptr); + +If you are using packed-pixel images (1, 2, or 4 bits/pixel), and you +need to change the order the pixels are packed into bytes, you can use: + + if (bit_depth < 8) + png_set_packswap(png_ptr); + +PNG files store 3 color pixels in red, green, blue order. This code +would be used if they are supplied as blue, green, red: + + png_set_bgr(png_ptr); + +PNG files describe monochrome as black being zero and white being +one. This code would be used if the pixels are supplied with this reversed +(black being one and white being zero): + + png_set_invert_mono(png_ptr); + +Finally, you can write your own transformation function if none of +the existing ones meets your needs. This is done by setting a callback +with + + png_set_write_user_transform_fn(png_ptr, + write_transform_fn); + +You must supply the function + + void write_transform_fn(png_ptr ptr, row_info_ptr + row_info, png_bytep data) + +See pngtest.c for a working example. Your function will be called +before any of the other transformations are processed. + +You can also set up a pointer to a user structure for use by your +callback function. + + png_set_user_transform_info(png_ptr, user_ptr, 0, 0); + +The user_channels and user_depth parameters of this function are ignored +when writing; you can set them to zero as shown. + +You can retrieve the pointer via the function png_get_user_transform_ptr(). +For example: + + voidp write_user_transform_ptr = + png_get_user_transform_ptr(png_ptr); + +It is possible to have libpng flush any pending output, either manually, +or automatically after a certain number of lines have been written. To +flush the output stream a single time call: + + png_write_flush(png_ptr); + +and to have libpng flush the output stream periodically after a certain +number of scanlines have been written, call: + + png_set_flush(png_ptr, nrows); + +Note that the distance between rows is from the last time png_write_flush() +was called, or the first row of the image if it has never been called. +So if you write 50 lines, and then png_set_flush 25, it will flush the +output on the next scanline, and every 25 lines thereafter, unless +png_write_flush() is called before 25 more lines have been written. +If nrows is too small (less than about 10 lines for a 640 pixel wide +RGB image) the image compression may decrease noticeably (although this +may be acceptable for real-time applications). Infrequent flushing will +only degrade the compression performance by a few percent over images +that do not use flushing. + +Writing the image data + +That's it for the transformations. Now you can write the image data. +The simplest way to do this is in one function call. If you have the +whole image in memory, you can just call png_write_image() and libpng +will write the image. You will need to pass in an array of pointers to +each row. This function automatically handles interlacing, so you don't +need to call png_set_interlace_handling() or call this function multiple +times, or any of that other stuff necessary with png_write_rows(). + + png_write_image(png_ptr, row_pointers); + +where row_pointers is: + + png_byte *row_pointers[height]; + +You can point to void or char or whatever you use for pixels. + +If you don't want to write the whole image at once, you can +use png_write_rows() instead. If the file is not interlaced, +this is simple: + + png_write_rows(png_ptr, row_pointers, + number_of_rows); + +row_pointers is the same as in the png_write_image() call. + +If you are just writing one row at a time, you can do this with +a single row_pointer instead of an array of row_pointers: + + png_bytep row_pointer = row; + + png_write_row(png_ptr, row_pointer); + +When the file is interlaced, things can get a good deal more +complicated. The only currently (as of the PNG Specification +version 1.2, dated July 1999) defined interlacing scheme for PNG files +is the "Adam7" interlace scheme, that breaks down an +image into seven smaller images of varying size. libpng will build +these images for you, or you can do them yourself. If you want to +build them yourself, see the PNG specification for details of which +pixels to write when. + +If you don't want libpng to handle the interlacing details, just +use png_set_interlace_handling() and call png_write_rows() the +correct number of times to write all seven sub-images. + +If you want libpng to build the sub-images, call this before you start +writing any rows: + + number_of_passes = + png_set_interlace_handling(png_ptr); + +This will return the number of passes needed. Currently, this +is seven, but may change if another interlace type is added. + +Then write the complete image number_of_passes times. + + png_write_rows(png_ptr, row_pointers, + number_of_rows); + +As some of these rows are not used, and thus return immediately, +you may want to read about interlacing in the PNG specification, +and only update the rows that are actually used. + +Finishing a sequential write + +After you are finished writing the image, you should finish writing +the file. If you are interested in writing comments or time, you should +pass an appropriately filled png_info pointer. If you are not interested, +you can pass NULL. + + png_write_end(png_ptr, info_ptr); + +When you are done, you can free all memory used by libpng like this: + + png_destroy_write_struct(&png_ptr, &info_ptr); + +It is also possible to individually free the info_ptr members that +point to libpng-allocated storage with the following function: + + png_free_data(png_ptr, info_ptr, mask, seq) + mask - identifies data to be freed, a mask + containing the bitwise OR of one or + more of + PNG_FREE_PLTE, PNG_FREE_TRNS, + PNG_FREE_HIST, PNG_FREE_ICCP, + PNG_FREE_PCAL, PNG_FREE_ROWS, + PNG_FREE_SCAL, PNG_FREE_SPLT, + PNG_FREE_TEXT, PNG_FREE_UNKN, + or simply PNG_FREE_ALL + seq - sequence number of item to be freed + (-1 for all items) + +This function may be safely called when the relevant storage has +already been freed, or has not yet been allocated, or was allocated +by the user and not by libpng, and will in those +cases do nothing. The "seq" parameter is ignored if only one item +of the selected data type, such as PLTE, is allowed. If "seq" is not +-1, and multiple items are allowed for the data type identified in +the mask, such as text or sPLT, only the n'th item in the structure +is freed, where n is "seq". + +If you allocated data such as a palette that you passed +in to libpng with png_set_*, you must not free it until just before the call to +png_destroy_write_struct(). + +The default behavior is only to free data that was allocated internally +by libpng. This can be changed, so that libpng will not free the data, +or so that it will free data that was allocated by the user with png_malloc() +or png_zalloc() and passed in via a png_set_*() function, with + + png_data_freer(png_ptr, info_ptr, freer, mask) + mask - which data elements are affected + same choices as in png_free_data() + freer - one of + PNG_DESTROY_WILL_FREE_DATA + PNG_SET_WILL_FREE_DATA + PNG_USER_WILL_FREE_DATA + +For example, to transfer responsibility for some data from a read structure +to a write structure, you could use + + png_data_freer(read_ptr, read_info_ptr, + PNG_USER_WILL_FREE_DATA, + PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) + png_data_freer(write_ptr, write_info_ptr, + PNG_DESTROY_WILL_FREE_DATA, + PNG_FREE_PLTE|PNG_FREE_tRNS|PNG_FREE_hIST) + +thereby briefly reassigning responsibility for freeing to the user but +immediately afterwards reassigning it once more to the write_destroy +function. Having done this, it would then be safe to destroy the read +structure and continue to use the PLTE, tRNS, and hIST data in the write +structure. + +This function only affects data that has already been allocated. +You can call this function before calling after the png_set_*() functions +to control whether the user or png_destroy_*() is supposed to free the data. +When the user assumes responsibility for libpng-allocated data, the +application must use +png_free() to free it, and when the user transfers responsibility to libpng +for data that the user has allocated, the user must have used png_malloc() +or png_zalloc() to allocate it. + +If you allocated text_ptr.text, text_ptr.lang, and text_ptr.translated_keyword +separately, do not transfer responsibility for freeing text_ptr to libpng, +because when libpng fills a png_text structure it combines these members with +the key member, and png_free_data() will free only text_ptr.key. Similarly, +if you transfer responsibility for free'ing text_ptr from libpng to your +application, your application must not separately free those members. +For a more compact example of writing a PNG image, see the file example.c. + +V. Modifying/Customizing libpng: + +There are two issues here. The first is changing how libpng does +standard things like memory allocation, input/output, and error handling. +The second deals with more complicated things like adding new chunks, +adding new transformations, and generally changing how libpng works. +Both of those are compile-time issues; that is, they are generally +determined at the time the code is written, and there is rarely a need +to provide the user with a means of changing them. + +Memory allocation, input/output, and error handling + +All of the memory allocation, input/output, and error handling in libpng +goes through callbacks that are user-settable. The default routines are +in pngmem.c, pngrio.c, pngwio.c, and pngerror.c, respectively. To change +these functions, call the appropriate png_set_*_fn() function. + +Memory allocation is done through the functions png_malloc() +and png_free(). These currently just call the standard C functions. If +your pointers can't access more then 64K at a time, you will want to set +MAXSEG_64K in zlib.h. Since it is unlikely that the method of handling +memory allocation on a platform will change between applications, these +functions must be modified in the library at compile time. If you prefer +to use a different method of allocating and freeing data, you can use +png_create_read_struct_2() or png_create_write_struct_2() to register +your own functions as described above. +These functions also provide a void pointer that can be retrieved via + + mem_ptr=png_get_mem_ptr(png_ptr); + +Your replacement memory functions must have prototypes as follows: + + png_voidp malloc_fn(png_structp png_ptr, + png_size_t size); + void free_fn(png_structp png_ptr, png_voidp ptr); + +Your malloc_fn() must return NULL in case of failure. The png_malloc() +function will normally call png_error() if it receives a NULL from the +system memory allocator or from your replacement malloc_fn(). + +Your free_fn() will never be called with a NULL ptr, since libpng's +png_free() checks for NULL before calling free_fn(). + +Input/Output in libpng is done through png_read() and png_write(), +which currently just call fread() and fwrite(). The FILE * is stored in +png_struct and is initialized via png_init_io(). If you wish to change +the method of I/O, the library supplies callbacks that you can set +through the function png_set_read_fn() and png_set_write_fn() at run +time, instead of calling the png_init_io() function. These functions +also provide a void pointer that can be retrieved via the function +png_get_io_ptr(). For example: + + png_set_read_fn(png_structp read_ptr, + voidp read_io_ptr, png_rw_ptr read_data_fn) + + png_set_write_fn(png_structp write_ptr, + voidp write_io_ptr, png_rw_ptr write_data_fn, + png_flush_ptr output_flush_fn); + + voidp read_io_ptr = png_get_io_ptr(read_ptr); + voidp write_io_ptr = png_get_io_ptr(write_ptr); + +The replacement I/O functions must have prototypes as follows: + + void user_read_data(png_structp png_ptr, + png_bytep data, png_size_t length); + void user_write_data(png_structp png_ptr, + png_bytep data, png_size_t length); + void user_flush_data(png_structp png_ptr); + +The user_read_data() function is responsible for detecting and +handling end-of-data errors. + +Supplying NULL for the read, write, or flush functions sets them back +to using the default C stream functions, which expect the io_ptr to +point to a standard *FILE structure. It is probably a mistake +to use NULL for one of write_data_fn and output_flush_fn but not both +of them, unless you have built libpng with PNG_NO_WRITE_FLUSH defined. +It is an error to read from a write stream, and vice versa. + +Error handling in libpng is done through png_error() and png_warning(). +Errors handled through png_error() are fatal, meaning that png_error() +should never return to its caller. Currently, this is handled via +setjmp() and longjmp() (unless you have compiled libpng with +PNG_SETJMP_NOT_SUPPORTED, in which case it is handled via PNG_ABORT()), +but you could change this to do things like exit() if you should wish. + +On non-fatal errors, png_warning() is called +to print a warning message, and then control returns to the calling code. +By default png_error() and png_warning() print a message on stderr via +fprintf() unless the library is compiled with PNG_NO_CONSOLE_IO defined +(because you don't want the messages) or PNG_NO_STDIO defined (because +fprintf() isn't available). If you wish to change the behavior of the error +functions, you will need to set up your own message callbacks. These +functions are normally supplied at the time that the png_struct is created. +It is also possible to redirect errors and warnings to your own replacement +functions after png_create_*_struct() has been called by calling: + + png_set_error_fn(png_structp png_ptr, + png_voidp error_ptr, png_error_ptr error_fn, + png_error_ptr warning_fn); + + png_voidp error_ptr = png_get_error_ptr(png_ptr); + +If NULL is supplied for either error_fn or warning_fn, then the libpng +default function will be used, calling fprintf() and/or longjmp() if a +problem is encountered. The replacement error functions should have +parameters as follows: + + void user_error_fn(png_structp png_ptr, + png_const_charp error_msg); + void user_warning_fn(png_structp png_ptr, + png_const_charp warning_msg); + +The motivation behind using setjmp() and longjmp() is the C++ throw and +catch exception handling methods. This makes the code much easier to write, +as there is no need to check every return code of every function call. +However, there are some uncertainties about the status of local variables +after a longjmp, so the user may want to be careful about doing anything after +setjmp returns non-zero besides returning itself. Consult your compiler +documentation for more details. For an alternative approach, you may wish +to use the "cexcept" facility (see http://cexcept.sourceforge.net). + +Custom chunks + +If you need to read or write custom chunks, you may need to get deeper +into the libpng code. The library now has mechanisms for storing +and writing chunks of unknown type; you can even declare callbacks +for custom chunks. However, this may not be good enough if the +library code itself needs to know about interactions between your +chunk and existing `intrinsic' chunks. + +If you need to write a new intrinsic chunk, first read the PNG +specification. Acquire a first level of +understanding of how it works. Pay particular attention to the +sections that describe chunk names, and look at how other chunks were +designed, so you can do things similarly. Second, check out the +sections of libpng that read and write chunks. Try to find a chunk +that is similar to yours and use it as a template. More details can +be found in the comments inside the code. It is best to handle unknown +chunks in a generic method, via callback functions, instead of by +modifying libpng functions. + +If you wish to write your own transformation for the data, look through +the part of the code that does the transformations, and check out some of +the simpler ones to get an idea of how they work. Try to find a similar +transformation to the one you want to add and copy off of it. More details +can be found in the comments inside the code itself. + +Configuring for 16 bit platforms + +You will want to look into zconf.h to tell zlib (and thus libpng) that +it cannot allocate more then 64K at a time. Even if you can, the memory +won't be accessible. So limit zlib and libpng to 64K by defining MAXSEG_64K. + +Configuring for DOS + +For DOS users who only have access to the lower 640K, you will +have to limit zlib's memory usage via a png_set_compression_mem_level() +call. See zlib.h or zconf.h in the zlib library for more information. + +Configuring for Medium Model + +Libpng's support for medium model has been tested on most of the popular +compilers. Make sure MAXSEG_64K gets defined, USE_FAR_KEYWORD gets +defined, and FAR gets defined to far in pngconf.h, and you should be +all set. Everything in the library (except for zlib's structure) is +expecting far data. You must use the typedefs with the p or pp on +the end for pointers (or at least look at them and be careful). Make +note that the rows of data are defined as png_bytepp, which is an +unsigned char far * far *. + +Configuring for gui/windowing platforms: + +You will need to write new error and warning functions that use the GUI +interface, as described previously, and set them to be the error and +warning functions at the time that png_create_*_struct() is called, +in order to have them available during the structure initialization. +They can be changed later via png_set_error_fn(). On some compilers, +you may also have to change the memory allocators (png_malloc, etc.). + +Configuring for compiler xxx: + +All includes for libpng are in pngconf.h. If you need to add, change +or delete an include, this is the place to do it. +The includes that are not needed outside libpng are protected by the +PNG_INTERNAL definition, which is only defined for those routines inside +libpng itself. The files in libpng proper only include png.h, which +includes pngconf.h. + +Configuring zlib: + +There are special functions to configure the compression. Perhaps the +most useful one changes the compression level, which currently uses +input compression values in the range 0 - 9. The library normally +uses the default compression level (Z_DEFAULT_COMPRESSION = 6). Tests +have shown that for a large majority of images, compression values in +the range 3-6 compress nearly as well as higher levels, and do so much +faster. For online applications it may be desirable to have maximum speed +(Z_BEST_SPEED = 1). With versions of zlib after v0.99, you can also +specify no compression (Z_NO_COMPRESSION = 0), but this would create +files larger than just storing the raw bitmap. You can specify the +compression level by calling: + + png_set_compression_level(png_ptr, level); + +Another useful one is to reduce the memory level used by the library. +The memory level defaults to 8, but it can be lowered if you are +short on memory (running DOS, for example, where you only have 640K). +Note that the memory level does have an effect on compression; among +other things, lower levels will result in sections of incompressible +data being emitted in smaller stored blocks, with a correspondingly +larger relative overhead of up to 15% in the worst case. + + png_set_compression_mem_level(png_ptr, level); + +The other functions are for configuring zlib. They are not recommended +for normal use and may result in writing an invalid PNG file. See +zlib.h for more information on what these mean. + + png_set_compression_strategy(png_ptr, + strategy); + png_set_compression_window_bits(png_ptr, + window_bits); + png_set_compression_method(png_ptr, method); + png_set_compression_buffer_size(png_ptr, size); + +Controlling row filtering + +If you want to control whether libpng uses filtering or not, which +filters are used, and how it goes about picking row filters, you +can call one of these functions. The selection and configuration +of row filters can have a significant impact on the size and +encoding speed and a somewhat lesser impact on the decoding speed +of an image. Filtering is enabled by default for RGB and grayscale +images (with and without alpha), but not for paletted images nor +for any images with bit depths less than 8 bits/pixel. + +The 'method' parameter sets the main filtering method, which is +currently only '0' in the PNG 1.2 specification. The 'filters' +parameter sets which filter(s), if any, should be used for each +scanline. Possible values are PNG_ALL_FILTERS and PNG_NO_FILTERS +to turn filtering on and off, respectively. + +Individual filter types are PNG_FILTER_NONE, PNG_FILTER_SUB, +PNG_FILTER_UP, PNG_FILTER_AVG, PNG_FILTER_PAETH, which can be bitwise +ORed together with '|' to specify one or more filters to use. +These filters are described in more detail in the PNG specification. +If you intend to change the filter type during the course of writing +the image, you should start with flags set for all of the filters +you intend to use so that libpng can initialize its internal +structures appropriately for all of the filter types. (Note that this +means the first row must always be adaptively filtered, because libpng +currently does not allocate the filter buffers until png_write_row() +is called for the first time.) + + filters = PNG_FILTER_NONE | PNG_FILTER_SUB + PNG_FILTER_UP | PNG_FILTER_AVG | + PNG_FILTER_PAETH | PNG_ALL_FILTERS; + + png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, + filters); + The second parameter can also be + PNG_INTRAPIXEL_DIFFERENCING if you are + writing a PNG to be embedded in a MNG + datastream. This parameter must be the + same as the value of filter_method used + in png_set_IHDR(). + +It is also possible to influence how libpng chooses from among the +available filters. This is done in one or both of two ways - by +telling it how important it is to keep the same filter for successive +rows, and by telling it the relative computational costs of the filters. + + double weights[3] = {1.5, 1.3, 1.1}, + costs[PNG_FILTER_VALUE_LAST] = + {1.0, 1.3, 1.3, 1.5, 1.7}; + + png_set_filter_heuristics(png_ptr, + PNG_FILTER_HEURISTIC_WEIGHTED, 3, + weights, costs); + +The weights are multiplying factors that indicate to libpng that the +row filter should be the same for successive rows unless another row filter +is that many times better than the previous filter. In the above example, +if the previous 3 filters were SUB, SUB, NONE, the SUB filter could have a +"sum of absolute differences" 1.5 x 1.3 times higher than other filters +and still be chosen, while the NONE filter could have a sum 1.1 times +higher than other filters and still be chosen. Unspecified weights are +taken to be 1.0, and the specified weights should probably be declining +like those above in order to emphasize recent filters over older filters. + +The filter costs specify for each filter type a relative decoding cost +to be considered when selecting row filters. This means that filters +with higher costs are less likely to be chosen over filters with lower +costs, unless their "sum of absolute differences" is that much smaller. +The costs do not necessarily reflect the exact computational speeds of +the various filters, since this would unduly influence the final image +size. + +Note that the numbers above were invented purely for this example and +are given only to help explain the function usage. Little testing has +been done to find optimum values for either the costs or the weights. + +Removing unwanted object code + +There are a bunch of #define's in pngconf.h that control what parts of +libpng are compiled. All the defines end in _SUPPORTED. If you are +never going to use a capability, you can change the #define to #undef +before recompiling libpng and save yourself code and data space, or +you can turn off individual capabilities with defines that begin with +PNG_NO_. + +You can also turn all of the transforms and ancillary chunk capabilities +off en masse with compiler directives that define +PNG_NO_READ[or WRITE]_TRANSFORMS, or PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS, +or all four, +along with directives to turn on any of the capabilities that you do +want. The PNG_NO_READ[or WRITE]_TRANSFORMS directives disable +the extra transformations but still leave the library fully capable of reading +and writing PNG files with all known public chunks +Use of the PNG_NO_READ[or WRITE]_ANCILLARY_CHUNKS directive +produces a library that is incapable of reading or writing ancillary chunks. +If you are not using the progressive reading capability, you can +turn that off with PNG_NO_PROGRESSIVE_READ (don't confuse +this with the INTERLACING capability, which you'll still have). + +All the reading and writing specific code are in separate files, so the +linker should only grab the files it needs. However, if you want to +make sure, or if you are building a stand alone library, all the +reading files start with pngr and all the writing files start with +pngw. The files that don't match either (like png.c, pngtrans.c, etc.) +are used for both reading and writing, and always need to be included. +The progressive reader is in pngpread.c + +If you are creating or distributing a dynamically linked library (a .so +or DLL file), you should not remove or disable any parts of the library, +as this will cause applications linked with different versions of the +library to fail if they call functions not available in your library. +The size of the library itself should not be an issue, because only +those sections that are actually used will be loaded into memory. + +Requesting debug printout + +The macro definition PNG_DEBUG can be used to request debugging +printout. Set it to an integer value in the range 0 to 3. Higher +numbers result in increasing amounts of debugging information. The +information is printed to the "stderr" file, unless another file +name is specified in the PNG_DEBUG_FILE macro definition. + +When PNG_DEBUG > 0, the following functions (macros) become available: + + png_debug(level, message) + png_debug1(level, message, p1) + png_debug2(level, message, p1, p2) + +in which "level" is compared to PNG_DEBUG to decide whether to print +the message, "message" is the formatted string to be printed, +and p1 and p2 are parameters that are to be embedded in the string +according to printf-style formatting directives. For example, + + png_debug1(2, "foo=%d\n", foo); + +is expanded to + + if(PNG_DEBUG > 2) + fprintf(PNG_DEBUG_FILE, "foo=%d\n", foo); + +When PNG_DEBUG is defined but is zero, the macros aren't defined, but you +can still use PNG_DEBUG to control your own debugging: + + #ifdef PNG_DEBUG + fprintf(stderr, ... + #endif + +When PNG_DEBUG = 1, the macros are defined, but only png_debug statements +having level = 0 will be printed. There aren't any such statements in +this version of libpng, but if you insert some they will be printed. + +VI. MNG support + +The MNG specification (available at http://www.libpng.org/pub/mng) allows +certain extensions to PNG for PNG images that are embedded in MNG datastreams. +Libpng can support some of these extensions. To enable them, use the +png_permit_mng_features() function: + + feature_set = png_permit_mng_features(png_ptr, mask) + mask is a png_uint_32 containing the bitwise OR of the + features you want to enable. These include + PNG_FLAG_MNG_EMPTY_PLTE + PNG_FLAG_MNG_FILTER_64 + PNG_ALL_MNG_FEATURES + feature_set is a png_uint_32 that is the bitwise AND of + your mask with the set of MNG features that is + supported by the version of libpng that you are using. + +It is an error to use this function when reading or writing a standalone +PNG file with the PNG 8-byte signature. The PNG datastream must be wrapped +in a MNG datastream. As a minimum, it must have the MNG 8-byte signature +and the MHDR and MEND chunks. Libpng does not provide support for these +or any other MNG chunks; your application must provide its own support for +them. You may wish to consider using libmng (available at +http://www.libmng.com) instead. + +VII. Changes to Libpng from version 0.88 + +It should be noted that versions of libpng later than 0.96 are not +distributed by the original libpng author, Guy Schalnat, nor by +Andreas Dilger, who had taken over from Guy during 1996 and 1997, and +distributed versions 0.89 through 0.96, but rather by another member +of the original PNG Group, Glenn Randers-Pehrson. Guy and Andreas are +still alive and well, but they have moved on to other things. + +The old libpng functions png_read_init(), png_write_init(), +png_info_init(), png_read_destroy(), and png_write_destroy() have been +moved to PNG_INTERNAL in version 0.95 to discourage their use. These +functions will be removed from libpng version 2.0.0. + +The preferred method of creating and initializing the libpng structures is +via the png_create_read_struct(), png_create_write_struct(), and +png_create_info_struct() because they isolate the size of the structures +from the application, allow version error checking, and also allow the +use of custom error handling routines during the initialization, which +the old functions do not. The functions png_read_destroy() and +png_write_destroy() do not actually free the memory that libpng +allocated for these structs, but just reset the data structures, so they +can be used instead of png_destroy_read_struct() and +png_destroy_write_struct() if you feel there is too much system overhead +allocating and freeing the png_struct for each image read. + +Setting the error callbacks via png_set_message_fn() before +png_read_init() as was suggested in libpng-0.88 is no longer supported +because this caused applications that do not use custom error functions +to fail if the png_ptr was not initialized to zero. It is still possible +to set the error callbacks AFTER png_read_init(), or to change them with +png_set_error_fn(), which is essentially the same function, but with a new +name to force compilation errors with applications that try to use the old +method. + +Starting with version 1.0.7, you can find out which version of the library +you are using at run-time: + + png_uint_32 libpng_vn = png_access_version_number(); + +The number libpng_vn is constructed from the major version, minor +version with leading zero, and release number with leading zero, +(e.g., libpng_vn for version 1.0.7 is 10007). + +You can also check which version of png.h you used when compiling your +application: + + png_uint_32 application_vn = PNG_LIBPNG_VER; + +VIII. Changes to Libpng from version 1.0.x to 1.2.x + +Support for user memory management was enabled by default. To +accomplish this, the functions png_create_read_struct_2(), +png_create_write_struct_2(), png_set_mem_fn(), png_get_mem_ptr(), +png_malloc_default(), and png_free_default() were added. + +Support for certain MNG features was enabled. + +Support for numbered error messages was added. However, we never got +around to actually numbering the error messages. The function +png_set_strip_error_numbers() was added (Note: the prototype for this +function was inadvertently removed from png.h in PNG_NO_ASSEMBLER_CODE +builds of libpng-1.2.15. It was restored in libpng-1.2.36). + +The png_malloc_warn() function was added at libpng-1.2.3. This issues +a png_warning and returns NULL instead of aborting when it fails to +acquire the requested memory allocation. + +Support for setting user limits on image width and height was enabled +by default. The functions png_set_user_limits(), png_get_user_width_max(), +and png_get_user_height_max() were added at libpng-1.2.6. + +The png_set_add_alpha() function was added at libpng-1.2.7. + +The function png_set_expand_gray_1_2_4_to_8() was added at libpng-1.2.9. +Unlike png_set_gray_1_2_4_to_8(), the new function does not expand the +tRNS chunk to alpha. The png_set_gray_1_2_4_to_8() function is +deprecated. + +A number of macro definitions in support of runtime selection of +assembler code features (especially Intel MMX code support) were +added at libpng-1.2.0: + + PNG_ASM_FLAG_MMX_SUPPORT_COMPILED + PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU + PNG_ASM_FLAG_MMX_READ_COMBINE_ROW + PNG_ASM_FLAG_MMX_READ_INTERLACE + PNG_ASM_FLAG_MMX_READ_FILTER_SUB + PNG_ASM_FLAG_MMX_READ_FILTER_UP + PNG_ASM_FLAG_MMX_READ_FILTER_AVG + PNG_ASM_FLAG_MMX_READ_FILTER_PAETH + PNG_ASM_FLAGS_INITIALIZED + PNG_MMX_READ_FLAGS + PNG_MMX_FLAGS + PNG_MMX_WRITE_FLAGS + PNG_MMX_FLAGS + +We added the following functions in support of runtime +selection of assembler code features: + + png_get_mmx_flagmask() + png_set_mmx_thresholds() + png_get_asm_flags() + png_get_mmx_bitdepth_threshold() + png_get_mmx_rowbytes_threshold() + png_set_asm_flags() + +We replaced all of these functions with simple stubs in libpng-1.2.20, +when the Intel assembler code was removed due to a licensing issue. + +IX. (Omitted) + +X. Detecting libpng + +The png_get_io_ptr() function has been present since libpng-0.88, has never +changed, and is unaffected by conditional compilation macros. It is the +best choice for use in configure scripts for detecting the presence of any +libpng version since 0.88. In an autoconf "configure.in" you could use + + AC_CHECK_LIB(png, png_get_io_ptr, ... + +XI. Source code repository + +Since about February 2009, version 1.2.34, libpng has been under "git" source +control. The git repository was built from old libpng-x.y.z.tar.gz files +going back to version 0.70. You can access the git repository (read only) +at + + git://libpng.git.sourceforge.net/gitroot/libpng + +or you can browse it via "gitweb" at + + http://libpng.git.sourceforge.net/git/gitweb.cgi?p=libpng + +Patches can be sent to glennrp at users.sourceforge.net or to +png-mng-implement at lists.sourceforge.net or you can upload them to +the libpng bug tracker at + + http://libpng.sourceforge.net + +XII. Coding style + +Our coding style is similar to the "Allman" style, with curly +braces on separate lines: + + if (condition) + { + action; + } + + else if (another condition) + { + another action; + } + +The braces can be omitted from simple one-line actions: + + if (condition) + return (0); + +We use 3-space indentation, except for continued statements which +are usually indented the same as the first line of the statement +plus four more spaces. + +Comments appear with the leading "/*" at the same indentation as +the statement that follows the comment: + + /* Single-line comment */ + statement; + + /* Multiple-line + * comment + */ + statement; + +Very short comments can be placed at the end of the statement +to which they pertain: + + statement; /* comment */ + +We don't use C++ style ("//") comments. We have, however, +used them in the past in some now-abandoned MMX assembler +code. + +Functions and their curly braces are not indented, and +exported functions are marked with PNGAPI: + + /* This is a public function that is visible to + * application programers. It does thus-and-so. + */ + void PNGAPI + png_exported_function(png_ptr, png_info, foo) + { + body; + } + +The prototypes for all exported functions appear in png.h, +above the comment that says + + /* Maintainer: Put new public prototypes here ... */ + +We mark all non-exported functions with "/* PRIVATE */"": + + void /* PRIVATE */ + png_non_exported_function(png_ptr, png_info, foo) + { + body; + } + +The prototypes for non-exported functions (except for those in +pngtest) appear in +the PNG_INTERNAL section of png.h +above the comment that says + + /* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ + +The names of all exported functions and variables begin +with "png_", and all publicly visible C preprocessor +macros begin with "PNG_". + +We put a space after each comma and after each semicolon +in "for" statments, and we put spaces before and after each +C binary operator and after "for" or "while". We don't +put a space between a typecast and the expression being +cast, nor do we put one between a function name and the +left parenthesis that follows it: + + for (i = 2; i > 0; --i) + x[i] = a(x) + (int)b; + +We prefer #ifdef and #ifndef to #if defined() and if !defined() +when there is only one macro being tested. + +Other rules can be inferred by inspecting the libpng +source. + +XIII. Y2K Compliance in libpng + +September 10, 2009 + +Since the PNG Development group is an ad-hoc body, we can't make +an official declaration. + +This is your unofficial assurance that libpng from version 0.71 and +upward through 1.2.40 are Y2K compliant. It is my belief that earlier +versions were also Y2K compliant. + +Libpng only has three year fields. One is a 2-byte unsigned integer that +will hold years up to 65535. The other two hold the date in text +format, and will hold years up to 9999. + +The integer is + "png_uint_16 year" in png_time_struct. + +The strings are + "png_charp time_buffer" in png_struct and + "near_time_buffer", which is a local character string in png.c. + +There are seven time-related functions: + + png_convert_to_rfc_1123() in png.c + (formerly png_convert_to_rfc_1152() in error) + png_convert_from_struct_tm() in pngwrite.c, called + in pngwrite.c + png_convert_from_time_t() in pngwrite.c + png_get_tIME() in pngget.c + png_handle_tIME() in pngrutil.c, called in pngread.c + png_set_tIME() in pngset.c + png_write_tIME() in pngwutil.c, called in pngwrite.c + +All appear to handle dates properly in a Y2K environment. The +png_convert_from_time_t() function calls gmtime() to convert from system +clock time, which returns (year - 1900), which we properly convert to +the full 4-digit year. There is a possibility that applications using +libpng are not passing 4-digit years into the png_convert_to_rfc_1123() +function, or that they are incorrectly passing only a 2-digit year +instead of "year - 1900" into the png_convert_from_struct_tm() function, +but this is not under our control. The libpng documentation has always +stated that it works with 4-digit years, and the APIs have been +documented as such. + +The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned +integer to hold the year, and can hold years as large as 65535. + +zlib, upon which libpng depends, is also Y2K compliant. It contains +no date-related code. + + + Glenn Randers-Pehrson + libpng maintainer + PNG Development Group diff --git a/third_party/windows/fltk-1.1.10/png/libpngpf.3 b/third_party/windows/fltk-1.1.10/png/libpngpf.3 new file mode 100644 index 0000000..4fefc27 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/libpngpf.3 @@ -0,0 +1,790 @@ +.TH LIBPNGPF 3 "September 10, 2009" +.SH NAME +libpng \- Portable Network Graphics (PNG) Reference Library 1.2.40 +(private functions) +.SH SYNOPSIS +\fB#include \fP + +\fI\fB + +\fI\fB + +\fBvoid png_build_gamma_table (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_build_grayscale_palette (int \fP\fIbit_depth\fP\fB, png_colorp \fIpalette\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_calculate_crc (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIptr\fP\fB, png_size_t \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_check_chunk_name (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIchunk_name\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBpng_size_t png_check_keyword (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIkey\fP\fB, png_charpp \fInew_key\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_combine_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIrow\fP\fB, int \fImask\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_correct_palette (png_structp \fP\fIpng_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, int \fInum_palette\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBint png_crc_error (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBint png_crc_finish (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIskip\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_crc_read (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIbuf\fP\fB, png_size_t \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBpng_voidp png_create_struct (int \fItype\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBpng_voidp png_create_struct_2 (int \fP\fItype\fP\fB, png_malloc_ptr \fP\fImalloc_fn\fP\fB, png_voidp \fImem_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_decompress_chunk (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIcomp_type\fP\fB, png_charp \fP\fIchunkdata\fP\fB, png_size_t \fP\fIchunklength\fP\fB, png_size_t \fP\fIprefix_length\fP\fB, png_size_t \fI*data_length\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_destroy_struct (png_voidp \fIstruct_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_destroy_struct_2 (png_voidp \fP\fIstruct_ptr\fP\fB, png_free_ptr \fP\fIfree_fn\fP\fB, png_voidp \fImem_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_background (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_color_16p \fP\fItrans_values\fP\fB, png_color_16p \fP\fIbackground\fP\fB, png_color_16p \fP\fIbackground_1\fP\fB, png_bytep \fP\fIgamma_table\fP\fB, png_bytep \fP\fIgamma_from_1\fP\fB, png_bytep \fP\fIgamma_to_1\fP\fB, png_uint_16pp \fP\fIgamma_16\fP\fB, png_uint_16pp \fP\fIgamma_16_from_1\fP\fB, png_uint_16pp \fP\fIgamma_16_to_1\fP\fB, int \fIgamma_shift\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_bgr (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_chop (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_dither (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fP\fIpalette_lookup\fP\fB, png_bytep \fIdither_lookup\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_expand (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_color_16p \fItrans_value\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_expand_palette (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_colorp \fP\fIpalette\fP\fB, png_bytep \fP\fItrans\fP\fB, int \fInum_trans\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_gamma (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fP\fIgamma_table\fP\fB, png_uint_16pp \fP\fIgamma_16_table\fP\fB, int \fIgamma_shift\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_gray_to_rgb (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_invert (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_pack (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_uint_32 \fIbit_depth\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_packswap (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_read_filler (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_uint_32 \fP\fIfiller\fP\fB, png_uint_32 \fIflags\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_read_interlace (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, int \fP\fIpass\fP\fB, png_uint_32 \fItransformations\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_read_invert_alpha (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_read_swap_alpha (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_read_transformations (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBint png_do_rgb_to_gray (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_shift (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_color_8p \fIbit_depth\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_strip_filler (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_uint_32 \fIflags\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_swap (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_unpack (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_unshift (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_color_8p \fIsig_bits\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_write_interlace (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, int \fIpass\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_write_invert_alpha (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_write_swap_alpha (png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_do_write_transformations (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid *png_far_to_near (png_structp png_ptr,png_voidp \fP\fIptr\fP\fB, int \fIcheck\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_flush (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_bKGD (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_cHRM (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_gAMA (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_IEND (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_iTXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_sCAL (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_sRGB (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_tEXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_unknown (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_handle_zTXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_info_destroy (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_init_mmx_flags (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_init_read_transformations (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_process_IDAT_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIbuffer_length\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_process_some_data (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_check_crc (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_crc_finish (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_crc_skip (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_fill_buffer (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_handle_tEXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_handle_unknown (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_handle_zTXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_uint_32 \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_have_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_have_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_have_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIrow\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_process_row (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_read_chunk (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_read_end (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_read_IDAT (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_read_sig (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_read_tEXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_read_zTXt (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_restore_buffer (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIbuffer\fP\fB, png_size_t \fIbuffer_length\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_push_save_buffer (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBpng_uint_32 png_read_chunk_header (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_read_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_read_filter_row (png_structp \fP\fIpng_ptr\fP\fB, png_row_infop \fP\fIrow_info\fP\fB, png_bytep \fP\fIrow\fP\fB, png_bytep \fP\fIprev_row\fP\fB, int \fIfilter\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_read_finish_row (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_read_push_finish_row (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_read_start_row (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_read_transform_info (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fIinfo_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_reset_crc (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBint png_set_text_2 (png_structp \fP\fIpng_ptr\fP\fB, png_infop \fP\fIinfo_ptr\fP\fB, png_textp \fP\fItext_ptr\fP\fB, int \fInum_text\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_cHRM (png_structp \fP\fIpng_ptr\fP\fB, double \fP\fIwhite_x\fP\fB, double \fP\fIwhite_y\fP\fB, double \fP\fIred_x\fP\fB, double \fP\fIred_y\fP\fB, double \fP\fIgreen_x\fP\fB, double \fP\fIgreen_y\fP\fB, double \fP\fIblue_x\fP\fB, double \fIblue_y\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_cHRM_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIwhite_x\fP\fB, png_uint_32 \fP\fIwhite_y\fP\fB, png_uint_32 \fP\fIred_x\fP\fB, png_uint_32 \fP\fIred_y\fP\fB, png_uint_32 \fP\fIgreen_x\fP\fB, png_uint_32 \fP\fIgreen_y\fP\fB, png_uint_32 \fP\fIblue_x\fP\fB, png_uint_32 \fIblue_y\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_data (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_filtered_row (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fIfiltered_row\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_find_filter (png_structp \fP\fIpng_ptr\fP\fB, png_row_infop \fIrow_info\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_finish_row (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_gAMA (png_structp \fP\fIpng_ptr\fP\fB, double \fIfile_gamma\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_gAMA_fixed (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fIint_file_gamma\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_hIST (png_structp \fP\fIpng_ptr\fP\fB, png_uint_16p \fP\fIhist\fP\fB, int \fInum_hist\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_iCCP (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIname\fP\fB, int \fP\fIcompression_type\fP\fB, png_charp \fP\fIprofile\fP\fB, int \fIproflen\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_IDAT (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fIdata\fP\fB, png_size_t \fIlength\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_IEND (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_IHDR (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIwidth\fP\fB, png_uint_32 \fP\fIheight\fP\fB, int \fP\fIbit_depth\fP\fB, int \fP\fIcolor_type\fP\fB, int \fP\fIcompression_type\fP\fB, int \fP\fIfilter_type\fP\fB, int \fIinterlace_type\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_iTXt (png_structp \fP\fIpng_ptr\fP\fB, int \fP\fIcompression\fP\fB, png_charp \fP\fIkey\fP\fB, png_charp \fP\fIlang\fP\fB, png_charp \fP\fItranslated_key\fP\fB, png_charp \fItext\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_oFFs (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIx_offset\fP\fB, png_uint_32 \fP\fIy_offset\fP\fB, int \fIunit_type\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_pCAL (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIpurpose\fP\fB, png_int_32 \fP\fIX0\fP\fB, png_int_32 \fP\fIX1\fP\fB, int \fP\fItype\fP\fB, int \fP\fInparams\fP\fB, png_charp \fP\fIunits\fP\fB, png_charpp \fIparams\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_pHYs (png_structp \fP\fIpng_ptr\fP\fB, png_uint_32 \fP\fIx_pixels_per_unit\fP\fB, png_uint_32 \fP\fIy_pixels_per_unit\fP\fB, int \fIunit_type\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_PLTE (png_structp \fP\fIpng_ptr\fP\fB, png_colorp \fP\fIpalette\fP\fB, png_uint_32 \fInum_pal\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_sBIT (png_structp \fP\fIpng_ptr\fP\fB, png_color_8p \fP\fIsbit\fP\fB, int \fIcolor_type\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_sCAL (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIunit\fP\fB, double \fP\fIwidth\fP\fB, double \fIheight\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_sCAL_s (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIunit\fP\fB, png_charp \fP\fIwidth\fP\fB, png_charp \fIheight\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_sig (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_sRGB (png_structp \fP\fIpng_ptr\fP\fB, int \fIintent\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_sPLT (png_structp \fP\fIpng_ptr\fP\fB, png_spalette_p \fIpalette\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_start_row (png_structp \fIpng_ptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_tEXt (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIkey\fP\fB, png_charp \fP\fItext\fP\fB, png_size_t \fItext_len\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_tIME (png_structp \fP\fIpng_ptr\fP\fB, png_timep \fImod_time\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_tRNS (png_structp \fP\fIpng_ptr\fP\fB, png_bytep \fP\fItrans\fP\fB, png_color_16p \fP\fIvalues\fP\fB, int \fP\fInumber\fP\fB, int \fIcolor_type\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_write_zTXt (png_structp \fP\fIpng_ptr\fP\fB, png_charp \fP\fIkey\fP\fB, png_charp \fP\fItext\fP\fB, png_size_t \fP\fItext_len\fP\fB, int \fIcompression\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoidpf png_zalloc (voidpf \fP\fIpng_ptr\fP\fB, uInt \fP\fIitems\fP\fB, uInt \fIsize\fP\fB);\fP + +\fI\fB + +\fI\fB + +\fBvoid png_zfree (voidpf \fP\fIpng_ptr\fP\fB, voidpf \fIptr\fP\fB);\fP + +\fI\fB + +\fI\fB + +.SH DESCRIPTION +The functions listed above are used privately by libpng +and are not recommended for use by applications. They are +not "exported" to applications using shared libraries. They +are listed alphabetically here as an aid to libpng maintainers. +See png.h for more information on these functions. + +.SH SEE ALSO +.IR libpng(3) ", " png(5) +.SH AUTHOR +Glenn Randers-Pehrson diff --git a/third_party/windows/fltk-1.1.10/png/makedepend b/third_party/windows/fltk-1.1.10/png/makedepend new file mode 100644 index 0000000..e3af5b9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/makedepend @@ -0,0 +1,17 @@ +# DO NOT DELETE + +png.o: png.h pngconf.h +pngset.o: png.h pngconf.h +pngget.o: png.h pngconf.h +pngrutil.o: png.h pngconf.h +pngtrans.o: png.h pngconf.h +pngwutil.o: png.h pngconf.h +pngread.o: png.h pngconf.h +pngrio.o: png.h pngconf.h +pngwio.o: png.h pngconf.h +pngwrite.o: png.h pngconf.h +pngrtran.o: png.h pngconf.h +pngwtran.o: png.h pngconf.h +pngmem.o: png.h pngconf.h +pngerror.o: png.h pngconf.h +pngpread.o: png.h pngconf.h diff --git a/third_party/windows/fltk-1.1.10/png/makefile.wat b/third_party/windows/fltk-1.1.10/png/makefile.wat new file mode 100644 index 0000000..b1b9e33 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/makefile.wat @@ -0,0 +1,64 @@ +# +# "$Id: makefile.wat 4359 2005-05-19 16:07:13Z mike $" +# +# PNG library makefile for the Fast Light Toolkit (FLTK). +# +# Copyright 1997-2004 by Easy Software Products. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems to "fltk-bugs@fltk.org". +# + +LIBNAMEROOT=ftlk_png +# I ought to be able to do "EXTRA_INCLUDE_DIRS += ;../zlib" but it doesn't work for me (OW1.3) +!undef EXTRA_INCLUDE_DIRS +EXTRA_INCLUDE_DIRS=$(ROOT);../zlib + +!include ../watcom.mif + + +# +# Object files... +# + +LIBOBJS = png.obj pngset.obj pngget.obj pngrutil.obj pngtrans.obj pngwutil.obj & + pngread.obj pngrio.obj pngwio.obj pngwrite.obj pngrtran.obj & + pngwtran.obj pngmem.obj pngerror.obj pngpread.obj + + +# +# Make all targets... +# + +all: $(LIBNAME) + +$(LIBNAME): $(LIBOBJS) + $(LIB) $(LIBOPTS) $@ $< + +# +# Clean all directories +# +clean : .SYMBOLIC + @echo Cleaning up. +CLEANEXTS = obj + @for %a in ($(CLEANEXTS)) do -rm -f $(ODIR)\*.%a + -rm -f *.err + -rm -f $(LIBNAME) + +# +# End of "$Id: makefile.wat 4359 2005-05-19 16:07:13Z mike $". +# diff --git a/third_party/windows/fltk-1.1.10/png/png.5 b/third_party/windows/fltk-1.1.10/png/png.5 new file mode 100644 index 0000000..234e147 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/png.5 @@ -0,0 +1,74 @@ +.TH PNG 5 "September 10, 2009" +.SH NAME +png \- Portable Network Graphics (PNG) format +.SH DESCRIPTION +PNG (Portable Network Graphics) is an extensible file format for the +lossless, portable, well-compressed storage of raster images. PNG provides +a patent-free replacement for GIF and can also replace many +common uses of TIFF. Indexed-color, grayscale, and truecolor images are +supported, plus an optional alpha channel. Sample depths range from +1 to 16 bits. +.br + +PNG is designed to work well in online viewing applications, such as the +World Wide Web, so it is fully streamable with a progressive display +option. PNG is robust, providing both full file integrity checking and +fast, simple detection of common transmission errors. Also, PNG can store +gamma and chromaticity data for improved color matching on heterogeneous +platforms. + +.SH "SEE ALSO" +.IR libpng(3) ", " zlib(3) ", " deflate(5) ", and " zlib(5) +.LP +PNG specification (second edition), November 2003: +.IP +.br + 8) + png_error(png_ptr, "Too many bytes for PNG signature."); + + png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes); +} + +/* Checks whether the supplied bytes match the PNG signature. We allow + * checking less than the full 8-byte signature so that those apps that + * already read the first few bytes of a file to determine the file type + * can simply check the remaining bytes for extra assurance. Returns + * an integer less than, equal to, or greater than zero if sig is found, + * respectively, to be less than, to match, or be greater than the correct + * PNG signature (this is the same behaviour as strcmp, memcmp, etc). + */ +int PNGAPI +png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check) +{ + png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; + if (num_to_check > 8) + num_to_check = 8; + else if (num_to_check < 1) + return (-1); + + if (start > 7) + return (-1); + + if (start + num_to_check > 8) + num_to_check = 8 - start; + + return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check))); +} + +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +/* (Obsolete) function to check signature bytes. It does not allow one + * to check a partial signature. This function might be removed in the + * future - use png_sig_cmp(). Returns true (nonzero) if the file is PNG. + */ +int PNGAPI +png_check_sig(png_bytep sig, int num) +{ + return ((int)!png_sig_cmp(sig, (png_size_t)0, (png_size_t)num)); +} +#endif +#endif /* PNG_READ_SUPPORTED */ + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +/* Function to allocate memory for zlib and clear it to 0. */ +#ifdef PNG_1_0_X +voidpf PNGAPI +#else +voidpf /* PRIVATE */ +#endif +png_zalloc(voidpf png_ptr, uInt items, uInt size) +{ + png_voidp ptr; + png_structp p=(png_structp)png_ptr; + png_uint_32 save_flags=p->flags; + png_uint_32 num_bytes; + + if (png_ptr == NULL) + return (NULL); + if (items > PNG_UINT_32_MAX/size) + { + png_warning (p, "Potential overflow in png_zalloc()"); + return (NULL); + } + num_bytes = (png_uint_32)items * size; + + p->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; + ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes); + p->flags=save_flags; + +#if defined(PNG_1_0_X) && !defined(PNG_NO_ZALLOC_ZERO) + if (ptr == NULL) + return ((voidpf)ptr); + + if (num_bytes > (png_uint_32)0x8000L) + { + png_memset(ptr, 0, (png_size_t)0x8000L); + png_memset((png_bytep)ptr + (png_size_t)0x8000L, 0, + (png_size_t)(num_bytes - (png_uint_32)0x8000L)); + } + else + { + png_memset(ptr, 0, (png_size_t)num_bytes); + } +#endif + return ((voidpf)ptr); +} + +/* Function to free memory for zlib */ +#ifdef PNG_1_0_X +void PNGAPI +#else +void /* PRIVATE */ +#endif +png_zfree(voidpf png_ptr, voidpf ptr) +{ + png_free((png_structp)png_ptr, (png_voidp)ptr); +} + +/* Reset the CRC variable to 32 bits of 1's. Care must be taken + * in case CRC is > 32 bits to leave the top bits 0. + */ +void /* PRIVATE */ +png_reset_crc(png_structp png_ptr) +{ + png_ptr->crc = crc32(0, Z_NULL, 0); +} + +/* Calculate the CRC over a section of data. We can only pass as + * much data to this routine as the largest single buffer size. We + * also check that this data will actually be used before going to the + * trouble of calculating it. + */ +void /* PRIVATE */ +png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length) +{ + int need_crc = 1; + + if (png_ptr->chunk_name[0] & 0x20) /* ancillary */ + { + if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == + (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) + need_crc = 0; + } + else /* critical */ + { + if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) + need_crc = 0; + } + + if (need_crc) + png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length); +} + +/* Allocate the memory for an info_struct for the application. We don't + * really need the png_ptr, but it could potentially be useful in the + * future. This should be used in favour of malloc(png_sizeof(png_info)) + * and png_info_init() so that applications that want to use a shared + * libpng don't have to be recompiled if png_info changes size. + */ +png_infop PNGAPI +png_create_info_struct(png_structp png_ptr) +{ + png_infop info_ptr; + + png_debug(1, "in png_create_info_struct"); + if (png_ptr == NULL) + return (NULL); +#ifdef PNG_USER_MEM_SUPPORTED + info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO, + png_ptr->malloc_fn, png_ptr->mem_ptr); +#else + info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); +#endif + if (info_ptr != NULL) + png_info_init_3(&info_ptr, png_sizeof(png_info)); + + return (info_ptr); +} + +/* This function frees the memory associated with a single info struct. + * Normally, one would use either png_destroy_read_struct() or + * png_destroy_write_struct() to free an info struct, but this may be + * useful for some applications. + */ +void PNGAPI +png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr) +{ + png_infop info_ptr = NULL; + if (png_ptr == NULL) + return; + + png_debug(1, "in png_destroy_info_struct"); + if (info_ptr_ptr != NULL) + info_ptr = *info_ptr_ptr; + + if (info_ptr != NULL) + { + png_info_destroy(png_ptr, info_ptr); + +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn, + png_ptr->mem_ptr); +#else + png_destroy_struct((png_voidp)info_ptr); +#endif + *info_ptr_ptr = NULL; + } +} + +/* Initialize the info structure. This is now an internal function (0.89) + * and applications using it are urged to use png_create_info_struct() + * instead. + */ +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +#undef png_info_init +void PNGAPI +png_info_init(png_infop info_ptr) +{ + /* We only come here via pre-1.0.12-compiled applications */ + png_info_init_3(&info_ptr, 0); +} +#endif + +void PNGAPI +png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size) +{ + png_infop info_ptr = *ptr_ptr; + + if (info_ptr == NULL) + return; + + png_debug(1, "in png_info_init_3"); + + if (png_sizeof(png_info) > png_info_struct_size) + { + png_destroy_struct(info_ptr); + info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO); + *ptr_ptr = info_ptr; + } + + /* Set everything to 0 */ + png_memset(info_ptr, 0, png_sizeof(png_info)); +} + +#ifdef PNG_FREE_ME_SUPPORTED +void PNGAPI +png_data_freer(png_structp png_ptr, png_infop info_ptr, + int freer, png_uint_32 mask) +{ + png_debug(1, "in png_data_freer"); + if (png_ptr == NULL || info_ptr == NULL) + return; + if (freer == PNG_DESTROY_WILL_FREE_DATA) + info_ptr->free_me |= mask; + else if (freer == PNG_USER_WILL_FREE_DATA) + info_ptr->free_me &= ~mask; + else + png_warning(png_ptr, + "Unknown freer parameter in png_data_freer."); +} +#endif + +void PNGAPI +png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask, + int num) +{ + png_debug(1, "in png_free_data"); + if (png_ptr == NULL || info_ptr == NULL) + return; + +#if defined(PNG_TEXT_SUPPORTED) + /* Free text item num or (if num == -1) all text items */ +#ifdef PNG_FREE_ME_SUPPORTED + if ((mask & PNG_FREE_TEXT) & info_ptr->free_me) +#else + if (mask & PNG_FREE_TEXT) +#endif + { + if (num != -1) + { + if (info_ptr->text && info_ptr->text[num].key) + { + png_free(png_ptr, info_ptr->text[num].key); + info_ptr->text[num].key = NULL; + } + } + else + { + int i; + for (i = 0; i < info_ptr->num_text; i++) + png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i); + png_free(png_ptr, info_ptr->text); + info_ptr->text = NULL; + info_ptr->num_text=0; + } + } +#endif + +#if defined(PNG_tRNS_SUPPORTED) + /* Free any tRNS entry */ +#ifdef PNG_FREE_ME_SUPPORTED + if ((mask & PNG_FREE_TRNS) & info_ptr->free_me) +#else + if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS)) +#endif + { + png_free(png_ptr, info_ptr->trans); + info_ptr->trans = NULL; + info_ptr->valid &= ~PNG_INFO_tRNS; +#ifndef PNG_FREE_ME_SUPPORTED + png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; +#endif + } +#endif + +#if defined(PNG_sCAL_SUPPORTED) + /* Free any sCAL entry */ +#ifdef PNG_FREE_ME_SUPPORTED + if ((mask & PNG_FREE_SCAL) & info_ptr->free_me) +#else + if (mask & PNG_FREE_SCAL) +#endif + { +#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) + png_free(png_ptr, info_ptr->scal_s_width); + png_free(png_ptr, info_ptr->scal_s_height); + info_ptr->scal_s_width = NULL; + info_ptr->scal_s_height = NULL; +#endif + info_ptr->valid &= ~PNG_INFO_sCAL; + } +#endif + +#if defined(PNG_pCAL_SUPPORTED) + /* Free any pCAL entry */ +#ifdef PNG_FREE_ME_SUPPORTED + if ((mask & PNG_FREE_PCAL) & info_ptr->free_me) +#else + if (mask & PNG_FREE_PCAL) +#endif + { + png_free(png_ptr, info_ptr->pcal_purpose); + png_free(png_ptr, info_ptr->pcal_units); + info_ptr->pcal_purpose = NULL; + info_ptr->pcal_units = NULL; + if (info_ptr->pcal_params != NULL) + { + int i; + for (i = 0; i < (int)info_ptr->pcal_nparams; i++) + { + png_free(png_ptr, info_ptr->pcal_params[i]); + info_ptr->pcal_params[i]=NULL; + } + png_free(png_ptr, info_ptr->pcal_params); + info_ptr->pcal_params = NULL; + } + info_ptr->valid &= ~PNG_INFO_pCAL; + } +#endif + +#if defined(PNG_iCCP_SUPPORTED) + /* Free any iCCP entry */ +#ifdef PNG_FREE_ME_SUPPORTED + if ((mask & PNG_FREE_ICCP) & info_ptr->free_me) +#else + if (mask & PNG_FREE_ICCP) +#endif + { + png_free(png_ptr, info_ptr->iccp_name); + png_free(png_ptr, info_ptr->iccp_profile); + info_ptr->iccp_name = NULL; + info_ptr->iccp_profile = NULL; + info_ptr->valid &= ~PNG_INFO_iCCP; + } +#endif + +#if defined(PNG_sPLT_SUPPORTED) + /* Free a given sPLT entry, or (if num == -1) all sPLT entries */ +#ifdef PNG_FREE_ME_SUPPORTED + if ((mask & PNG_FREE_SPLT) & info_ptr->free_me) +#else + if (mask & PNG_FREE_SPLT) +#endif + { + if (num != -1) + { + if (info_ptr->splt_palettes) + { + png_free(png_ptr, info_ptr->splt_palettes[num].name); + png_free(png_ptr, info_ptr->splt_palettes[num].entries); + info_ptr->splt_palettes[num].name = NULL; + info_ptr->splt_palettes[num].entries = NULL; + } + } + else + { + if (info_ptr->splt_palettes_num) + { + int i; + for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) + png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i); + + png_free(png_ptr, info_ptr->splt_palettes); + info_ptr->splt_palettes = NULL; + info_ptr->splt_palettes_num = 0; + } + info_ptr->valid &= ~PNG_INFO_sPLT; + } + } +#endif + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + if (png_ptr->unknown_chunk.data) + { + png_free(png_ptr, png_ptr->unknown_chunk.data); + png_ptr->unknown_chunk.data = NULL; + } + +#ifdef PNG_FREE_ME_SUPPORTED + if ((mask & PNG_FREE_UNKN) & info_ptr->free_me) +#else + if (mask & PNG_FREE_UNKN) +#endif + { + if (num != -1) + { + if (info_ptr->unknown_chunks) + { + png_free(png_ptr, info_ptr->unknown_chunks[num].data); + info_ptr->unknown_chunks[num].data = NULL; + } + } + else + { + int i; + + if (info_ptr->unknown_chunks_num) + { + for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++) + png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i); + + png_free(png_ptr, info_ptr->unknown_chunks); + info_ptr->unknown_chunks = NULL; + info_ptr->unknown_chunks_num = 0; + } + } + } +#endif + +#if defined(PNG_hIST_SUPPORTED) + /* Free any hIST entry */ +#ifdef PNG_FREE_ME_SUPPORTED + if ((mask & PNG_FREE_HIST) & info_ptr->free_me) +#else + if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST)) +#endif + { + png_free(png_ptr, info_ptr->hist); + info_ptr->hist = NULL; + info_ptr->valid &= ~PNG_INFO_hIST; +#ifndef PNG_FREE_ME_SUPPORTED + png_ptr->flags &= ~PNG_FLAG_FREE_HIST; +#endif + } +#endif + + /* Free any PLTE entry that was internally allocated */ +#ifdef PNG_FREE_ME_SUPPORTED + if ((mask & PNG_FREE_PLTE) & info_ptr->free_me) +#else + if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE)) +#endif + { + png_zfree(png_ptr, info_ptr->palette); + info_ptr->palette = NULL; + info_ptr->valid &= ~PNG_INFO_PLTE; +#ifndef PNG_FREE_ME_SUPPORTED + png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; +#endif + info_ptr->num_palette = 0; + } + +#if defined(PNG_INFO_IMAGE_SUPPORTED) + /* Free any image bits attached to the info structure */ +#ifdef PNG_FREE_ME_SUPPORTED + if ((mask & PNG_FREE_ROWS) & info_ptr->free_me) +#else + if (mask & PNG_FREE_ROWS) +#endif + { + if (info_ptr->row_pointers) + { + int row; + for (row = 0; row < (int)info_ptr->height; row++) + { + png_free(png_ptr, info_ptr->row_pointers[row]); + info_ptr->row_pointers[row]=NULL; + } + png_free(png_ptr, info_ptr->row_pointers); + info_ptr->row_pointers=NULL; + } + info_ptr->valid &= ~PNG_INFO_IDAT; + } +#endif + +#ifdef PNG_FREE_ME_SUPPORTED + if (num == -1) + info_ptr->free_me &= ~mask; + else + info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL); +#endif +} + +/* This is an internal routine to free any memory that the info struct is + * pointing to before re-using it or freeing the struct itself. Recall + * that png_free() checks for NULL pointers for us. + */ +void /* PRIVATE */ +png_info_destroy(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_info_destroy"); + + png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); + +#if defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) + if (png_ptr->num_chunk_list) + { + png_free(png_ptr, png_ptr->chunk_list); + png_ptr->chunk_list=NULL; + png_ptr->num_chunk_list = 0; + } +#endif + + png_info_init_3(&info_ptr, png_sizeof(png_info)); +} +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ + +/* This function returns a pointer to the io_ptr associated with the user + * functions. The application should free any memory associated with this + * pointer before png_write_destroy() or png_read_destroy() are called. + */ +png_voidp PNGAPI +png_get_io_ptr(png_structp png_ptr) +{ + if (png_ptr == NULL) + return (NULL); + return (png_ptr->io_ptr); +} + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +#if !defined(PNG_NO_STDIO) +/* Initialize the default input/output functions for the PNG file. If you + * use your own read or write routines, you can call either png_set_read_fn() + * or png_set_write_fn() instead of png_init_io(). If you have defined + * PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't + * necessarily available. + */ +void PNGAPI +png_init_io(png_structp png_ptr, png_FILE_p fp) +{ + png_debug(1, "in png_init_io"); + if (png_ptr == NULL) + return; + png_ptr->io_ptr = (png_voidp)fp; +} +#endif + +#if defined(PNG_TIME_RFC1123_SUPPORTED) +/* Convert the supplied time into an RFC 1123 string suitable for use in + * a "Creation Time" or other text-based time string. + */ +png_charp PNGAPI +png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime) +{ + static PNG_CONST char short_months[12][4] = + {"Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + + if (png_ptr == NULL) + return (NULL); + if (png_ptr->time_buffer == NULL) + { + png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29* + png_sizeof(char))); + } + +#if defined(_WIN32_WCE) + { + wchar_t time_buf[29]; + wsprintf(time_buf, TEXT("%d %S %d %02d:%02d:%02d +0000"), + ptime->day % 32, short_months[(ptime->month - 1) % 12], + ptime->year, ptime->hour % 24, ptime->minute % 60, + ptime->second % 61); + WideCharToMultiByte(CP_ACP, 0, time_buf, -1, png_ptr->time_buffer, 29, + NULL, NULL); + } +#else +#ifdef USE_FAR_KEYWORD + { + char near_time_buf[29]; + png_snprintf6(near_time_buf, 29, "%d %s %d %02d:%02d:%02d +0000", + ptime->day % 32, short_months[(ptime->month - 1) % 12], + ptime->year, ptime->hour % 24, ptime->minute % 60, + ptime->second % 61); + png_memcpy(png_ptr->time_buffer, near_time_buf, + 29*png_sizeof(char)); + } +#else + png_snprintf6(png_ptr->time_buffer, 29, "%d %s %d %02d:%02d:%02d +0000", + ptime->day % 32, short_months[(ptime->month - 1) % 12], + ptime->year, ptime->hour % 24, ptime->minute % 60, + ptime->second % 61); +#endif +#endif /* _WIN32_WCE */ + return ((png_charp)png_ptr->time_buffer); +} +#endif /* PNG_TIME_RFC1123_SUPPORTED */ + +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ + +png_charp PNGAPI +png_get_copyright(png_structp png_ptr) +{ + png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */ + return ((png_charp) "\n libpng version 1.2.40 - September 10, 2009\n\ + Copyright (c) 1998-2009 Glenn Randers-Pehrson\n\ + Copyright (c) 1996-1997 Andreas Dilger\n\ + Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n"); +} + +/* The following return the library version as a short string in the + * format 1.0.0 through 99.99.99zz. To get the version of *.h files + * used with your application, print out PNG_LIBPNG_VER_STRING, which + * is defined in png.h. + * Note: now there is no difference between png_get_libpng_ver() and + * png_get_header_ver(). Due to the version_nn_nn_nn typedef guard, + * it is guaranteed that png.c uses the correct version of png.h. + */ +png_charp PNGAPI +png_get_libpng_ver(png_structp png_ptr) +{ + /* Version of *.c files used when building libpng */ + png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */ + return ((png_charp) PNG_LIBPNG_VER_STRING); +} + +png_charp PNGAPI +png_get_header_ver(png_structp png_ptr) +{ + /* Version of *.h files used when building libpng */ + png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */ + return ((png_charp) PNG_LIBPNG_VER_STRING); +} + +png_charp PNGAPI +png_get_header_version(png_structp png_ptr) +{ + /* Returns longer string containing both version and date */ + png_ptr = png_ptr; /* Silence compiler warning about unused png_ptr */ + return ((png_charp) PNG_HEADER_VERSION_STRING +#ifndef PNG_READ_SUPPORTED + " (NO READ SUPPORT)" +#endif + "\n"); +} + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +int PNGAPI +png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name) +{ + /* Check chunk_name and return "keep" value if it's on the list, else 0 */ + int i; + png_bytep p; + if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list<=0) + return 0; + p = png_ptr->chunk_list + png_ptr->num_chunk_list*5 - 5; + for (i = png_ptr->num_chunk_list; i; i--, p -= 5) + if (!png_memcmp(chunk_name, p, 4)) + return ((int)*(p + 4)); + return 0; +} +#endif + +/* This function, added to libpng-1.0.6g, is untested. */ +int PNGAPI +png_reset_zstream(png_structp png_ptr) +{ + if (png_ptr == NULL) + return Z_STREAM_ERROR; + return (inflateReset(&png_ptr->zstream)); +} +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ + +/* This function was added to libpng-1.0.7 */ +png_uint_32 PNGAPI +png_access_version_number(void) +{ + /* Version of *.c files used when building libpng */ + return((png_uint_32) PNG_LIBPNG_VER); +} + + +#if defined(PNG_READ_SUPPORTED) && defined(PNG_ASSEMBLER_CODE_SUPPORTED) +#if !defined(PNG_1_0_X) +/* This function was added to libpng 1.2.0 */ +int PNGAPI +png_mmx_support(void) +{ + /* Obsolete, to be removed from libpng-1.4.0 */ + return -1; +} +#endif /* PNG_1_0_X */ +#endif /* PNG_READ_SUPPORTED && PNG_ASSEMBLER_CODE_SUPPORTED */ + +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) +#ifdef PNG_SIZE_T +/* Added at libpng version 1.2.6 */ + PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); +png_size_t PNGAPI +png_convert_size(size_t size) +{ + if (size > (png_size_t)-1) + PNG_ABORT(); /* We haven't got access to png_ptr, so no png_error() */ + return ((png_size_t)size); +} +#endif /* PNG_SIZE_T */ + +/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */ +#if defined(PNG_cHRM_SUPPORTED) +#if !defined(PNG_NO_CHECK_cHRM) + +/* + * Multiply two 32-bit numbers, V1 and V2, using 32-bit + * arithmetic, to produce a 64 bit result in the HI/LO words. + * + * A B + * x C D + * ------ + * AD || BD + * AC || CB || 0 + * + * where A and B are the high and low 16-bit words of V1, + * C and D are the 16-bit words of V2, AD is the product of + * A and D, and X || Y is (X << 16) + Y. +*/ + +void /* PRIVATE */ +png_64bit_product (long v1, long v2, unsigned long *hi_product, + unsigned long *lo_product) +{ + int a, b, c, d; + long lo, hi, x, y; + + a = (v1 >> 16) & 0xffff; + b = v1 & 0xffff; + c = (v2 >> 16) & 0xffff; + d = v2 & 0xffff; + + lo = b * d; /* BD */ + x = a * d + c * b; /* AD + CB */ + y = ((lo >> 16) & 0xffff) + x; + + lo = (lo & 0xffff) | ((y & 0xffff) << 16); + hi = (y >> 16) & 0xffff; + + hi += a * c; /* AC */ + + *hi_product = (unsigned long)hi; + *lo_product = (unsigned long)lo; +} + +int /* PRIVATE */ +png_check_cHRM_fixed(png_structp png_ptr, + png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, + png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, + png_fixed_point blue_x, png_fixed_point blue_y) +{ + int ret = 1; + unsigned long xy_hi,xy_lo,yx_hi,yx_lo; + + png_debug(1, "in function png_check_cHRM_fixed"); + if (png_ptr == NULL) + return 0; + + if (white_x < 0 || white_y <= 0 || + red_x < 0 || red_y < 0 || + green_x < 0 || green_y < 0 || + blue_x < 0 || blue_y < 0) + { + png_warning(png_ptr, + "Ignoring attempt to set negative chromaticity value"); + ret = 0; + } + if (white_x > (png_fixed_point) PNG_UINT_31_MAX || + white_y > (png_fixed_point) PNG_UINT_31_MAX || + red_x > (png_fixed_point) PNG_UINT_31_MAX || + red_y > (png_fixed_point) PNG_UINT_31_MAX || + green_x > (png_fixed_point) PNG_UINT_31_MAX || + green_y > (png_fixed_point) PNG_UINT_31_MAX || + blue_x > (png_fixed_point) PNG_UINT_31_MAX || + blue_y > (png_fixed_point) PNG_UINT_31_MAX ) + { + png_warning(png_ptr, + "Ignoring attempt to set chromaticity value exceeding 21474.83"); + ret = 0; + } + if (white_x > 100000L - white_y) + { + png_warning(png_ptr, "Invalid cHRM white point"); + ret = 0; + } + if (red_x > 100000L - red_y) + { + png_warning(png_ptr, "Invalid cHRM red point"); + ret = 0; + } + if (green_x > 100000L - green_y) + { + png_warning(png_ptr, "Invalid cHRM green point"); + ret = 0; + } + if (blue_x > 100000L - blue_y) + { + png_warning(png_ptr, "Invalid cHRM blue point"); + ret = 0; + } + + png_64bit_product(green_x - red_x, blue_y - red_y, &xy_hi, &xy_lo); + png_64bit_product(green_y - red_y, blue_x - red_x, &yx_hi, &yx_lo); + + if (xy_hi == yx_hi && xy_lo == yx_lo) + { + png_warning(png_ptr, + "Ignoring attempt to set cHRM RGB triangle with zero area"); + ret = 0; + } + + return ret; +} +#endif /* NO_PNG_CHECK_cHRM */ +#endif /* PNG_cHRM_SUPPORTED */ +#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ diff --git a/third_party/windows/fltk-1.1.10/png/png.h b/third_party/windows/fltk-1.1.10/png/png.h new file mode 100644 index 0000000..9ac5a70 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/png.h @@ -0,0 +1,3726 @@ +/* png.h - header file for PNG reference library + * + * libpng version 1.2.40 - September 10, 2009 + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license (See LICENSE, below) + * + * Authors and maintainers: + * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat + * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger + * libpng versions 0.97, January 1998, through 1.2.40 - September 10, 2009: Glenn + * See also "Contributing Authors", below. + * + * Note about libpng version numbers: + * + * Due to various miscommunications, unforeseen code incompatibilities + * and occasional factors outside the authors' control, version numbering + * on the library has not always been consistent and straightforward. + * The following table summarizes matters since version 0.89c, which was + * the first widely used release: + * + * source png.h png.h shared-lib + * version string int version + * ------- ------ ----- ---------- + * 0.89c "1.0 beta 3" 0.89 89 1.0.89 + * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] + * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] + * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] + * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] + * 0.97c 0.97 97 2.0.97 + * 0.98 0.98 98 2.0.98 + * 0.99 0.99 98 2.0.99 + * 0.99a-m 0.99 99 2.0.99 + * 1.00 1.00 100 2.1.0 [100 should be 10000] + * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] + * 1.0.1 png.h string is 10001 2.1.0 + * 1.0.1a-e identical to the 10002 from here on, the shared library + * 1.0.2 source version) 10002 is 2.V where V is the source code + * 1.0.2a-b 10003 version, except as noted. + * 1.0.3 10003 + * 1.0.3a-d 10004 + * 1.0.4 10004 + * 1.0.4a-f 10005 + * 1.0.5 (+ 2 patches) 10005 + * 1.0.5a-d 10006 + * 1.0.5e-r 10100 (not source compatible) + * 1.0.5s-v 10006 (not binary compatible) + * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) + * 1.0.6d-f 10007 (still binary incompatible) + * 1.0.6g 10007 + * 1.0.6h 10007 10.6h (testing xy.z so-numbering) + * 1.0.6i 10007 10.6i + * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) + * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) + * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) + * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) + * 1.0.7 1 10007 (still compatible) + * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 + * 1.0.8rc1 1 10008 2.1.0.8rc1 + * 1.0.8 1 10008 2.1.0.8 + * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 + * 1.0.9rc1 1 10009 2.1.0.9rc1 + * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 + * 1.0.9rc2 1 10009 2.1.0.9rc2 + * 1.0.9 1 10009 2.1.0.9 + * 1.0.10beta1 1 10010 2.1.0.10beta1 + * 1.0.10rc1 1 10010 2.1.0.10rc1 + * 1.0.10 1 10010 2.1.0.10 + * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 + * 1.0.11rc1 1 10011 2.1.0.11rc1 + * 1.0.11 1 10011 2.1.0.11 + * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 + * 1.0.12rc1 2 10012 2.1.0.12rc1 + * 1.0.12 2 10012 2.1.0.12 + * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) + * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 + * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 + * 1.2.0rc1 3 10200 3.1.2.0rc1 + * 1.2.0 3 10200 3.1.2.0 + * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 + * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 + * 1.2.1 3 10201 3.1.2.1 + * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 + * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 + * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 + * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 + * 1.0.13 10 10013 10.so.0.1.0.13 + * 1.2.2 12 10202 12.so.0.1.2.2 + * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 + * 1.2.3 12 10203 12.so.0.1.2.3 + * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 + * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 + * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 + * 1.0.14 10 10014 10.so.0.1.0.14 + * 1.2.4 13 10204 12.so.0.1.2.4 + * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 + * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 + * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 + * 1.0.15 10 10015 10.so.0.1.0.15 + * 1.2.5 13 10205 12.so.0.1.2.5 + * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 + * 1.0.16 10 10016 10.so.0.1.0.16 + * 1.2.6 13 10206 12.so.0.1.2.6 + * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 + * 1.0.17rc1 10 10017 10.so.0.1.0.17rc1 + * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 + * 1.0.17 10 10017 10.so.0.1.0.17 + * 1.2.7 13 10207 12.so.0.1.2.7 + * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 + * 1.0.18rc1-5 10 10018 10.so.0.1.0.18rc1-5 + * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 + * 1.0.18 10 10018 10.so.0.1.0.18 + * 1.2.8 13 10208 12.so.0.1.2.8 + * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 + * 1.2.9beta4-11 13 10209 12.so.0.9[.0] + * 1.2.9rc1 13 10209 12.so.0.9[.0] + * 1.2.9 13 10209 12.so.0.9[.0] + * 1.2.10beta1-8 13 10210 12.so.0.10[.0] + * 1.2.10rc1-3 13 10210 12.so.0.10[.0] + * 1.2.10 13 10210 12.so.0.10[.0] + * 1.2.11beta1-4 13 10211 12.so.0.11[.0] + * 1.0.19rc1-5 10 10019 10.so.0.19[.0] + * 1.2.11rc1-5 13 10211 12.so.0.11[.0] + * 1.0.19 10 10019 10.so.0.19[.0] + * 1.2.11 13 10211 12.so.0.11[.0] + * 1.0.20 10 10020 10.so.0.20[.0] + * 1.2.12 13 10212 12.so.0.12[.0] + * 1.2.13beta1 13 10213 12.so.0.13[.0] + * 1.0.21 10 10021 10.so.0.21[.0] + * 1.2.13 13 10213 12.so.0.13[.0] + * 1.2.14beta1-2 13 10214 12.so.0.14[.0] + * 1.0.22rc1 10 10022 10.so.0.22[.0] + * 1.2.14rc1 13 10214 12.so.0.14[.0] + * 1.0.22 10 10022 10.so.0.22[.0] + * 1.2.14 13 10214 12.so.0.14[.0] + * 1.2.15beta1-6 13 10215 12.so.0.15[.0] + * 1.0.23rc1-5 10 10023 10.so.0.23[.0] + * 1.2.15rc1-5 13 10215 12.so.0.15[.0] + * 1.0.23 10 10023 10.so.0.23[.0] + * 1.2.15 13 10215 12.so.0.15[.0] + * 1.2.16beta1-2 13 10216 12.so.0.16[.0] + * 1.2.16rc1 13 10216 12.so.0.16[.0] + * 1.0.24 10 10024 10.so.0.24[.0] + * 1.2.16 13 10216 12.so.0.16[.0] + * 1.2.17beta1-2 13 10217 12.so.0.17[.0] + * 1.0.25rc1 10 10025 10.so.0.25[.0] + * 1.2.17rc1-3 13 10217 12.so.0.17[.0] + * 1.0.25 10 10025 10.so.0.25[.0] + * 1.2.17 13 10217 12.so.0.17[.0] + * 1.0.26 10 10026 10.so.0.26[.0] + * 1.2.18 13 10218 12.so.0.18[.0] + * 1.2.19beta1-31 13 10219 12.so.0.19[.0] + * 1.0.27rc1-6 10 10027 10.so.0.27[.0] + * 1.2.19rc1-6 13 10219 12.so.0.19[.0] + * 1.0.27 10 10027 10.so.0.27[.0] + * 1.2.19 13 10219 12.so.0.19[.0] + * 1.2.20beta01-04 13 10220 12.so.0.20[.0] + * 1.0.28rc1-6 10 10028 10.so.0.28[.0] + * 1.2.20rc1-6 13 10220 12.so.0.20[.0] + * 1.0.28 10 10028 10.so.0.28[.0] + * 1.2.20 13 10220 12.so.0.20[.0] + * 1.2.21beta1-2 13 10221 12.so.0.21[.0] + * 1.2.21rc1-3 13 10221 12.so.0.21[.0] + * 1.0.29 10 10029 10.so.0.29[.0] + * 1.2.21 13 10221 12.so.0.21[.0] + * 1.2.22beta1-4 13 10222 12.so.0.22[.0] + * 1.0.30rc1 10 10030 10.so.0.30[.0] + * 1.2.22rc1 13 10222 12.so.0.22[.0] + * 1.0.30 10 10030 10.so.0.30[.0] + * 1.2.22 13 10222 12.so.0.22[.0] + * 1.2.23beta01-05 13 10223 12.so.0.23[.0] + * 1.2.23rc01 13 10223 12.so.0.23[.0] + * 1.2.23 13 10223 12.so.0.23[.0] + * 1.2.24beta01-02 13 10224 12.so.0.24[.0] + * 1.2.24rc01 13 10224 12.so.0.24[.0] + * 1.2.24 13 10224 12.so.0.24[.0] + * 1.2.25beta01-06 13 10225 12.so.0.25[.0] + * 1.2.25rc01-02 13 10225 12.so.0.25[.0] + * 1.0.31 10 10031 10.so.0.31[.0] + * 1.2.25 13 10225 12.so.0.25[.0] + * 1.2.26beta01-06 13 10226 12.so.0.26[.0] + * 1.2.26rc01 13 10226 12.so.0.26[.0] + * 1.2.26 13 10226 12.so.0.26[.0] + * 1.0.32 10 10032 10.so.0.32[.0] + * 1.2.27beta01-06 13 10227 12.so.0.27[.0] + * 1.2.27rc01 13 10227 12.so.0.27[.0] + * 1.0.33 10 10033 10.so.0.33[.0] + * 1.2.27 13 10227 12.so.0.27[.0] + * 1.0.34 10 10034 10.so.0.34[.0] + * 1.2.28 13 10228 12.so.0.28[.0] + * 1.2.29beta01-03 13 10229 12.so.0.29[.0] + * 1.2.29rc01 13 10229 12.so.0.29[.0] + * 1.0.35 10 10035 10.so.0.35[.0] + * 1.2.29 13 10229 12.so.0.29[.0] + * 1.0.37 10 10037 10.so.0.37[.0] + * 1.2.30beta01-04 13 10230 12.so.0.30[.0] + * 1.0.38rc01-08 10 10038 10.so.0.38[.0] + * 1.2.30rc01-08 13 10230 12.so.0.30[.0] + * 1.0.38 10 10038 10.so.0.38[.0] + * 1.2.30 13 10230 12.so.0.30[.0] + * 1.0.39rc01-03 10 10039 10.so.0.39[.0] + * 1.2.31rc01-03 13 10231 12.so.0.31[.0] + * 1.0.39 10 10039 10.so.0.39[.0] + * 1.2.31 13 10231 12.so.0.31[.0] + * 1.2.32beta01-02 13 10232 12.so.0.32[.0] + * 1.0.40rc01 10 10040 10.so.0.40[.0] + * 1.2.32rc01 13 10232 12.so.0.32[.0] + * 1.0.40 10 10040 10.so.0.40[.0] + * 1.2.32 13 10232 12.so.0.32[.0] + * 1.2.33beta01-02 13 10233 12.so.0.33[.0] + * 1.2.33rc01-02 13 10233 12.so.0.33[.0] + * 1.0.41rc01 10 10041 10.so.0.41[.0] + * 1.2.33 13 10233 12.so.0.33[.0] + * 1.0.41 10 10041 10.so.0.41[.0] + * 1.2.34beta01-07 13 10234 12.so.0.34[.0] + * 1.0.42rc01 10 10042 10.so.0.42[.0] + * 1.2.34rc01 13 10234 12.so.0.34[.0] + * 1.0.42 10 10042 10.so.0.42[.0] + * 1.2.34 13 10234 12.so.0.34[.0] + * 1.2.35beta01-03 13 10235 12.so.0.35[.0] + * 1.0.43rc01-02 10 10043 10.so.0.43[.0] + * 1.2.35rc01-02 13 10235 12.so.0.35[.0] + * 1.0.43 10 10043 10.so.0.43[.0] + * 1.2.35 13 10235 12.so.0.35[.0] + * 1.2.36beta01-05 13 10236 12.so.0.36[.0] + * 1.2.36rc01 13 10236 12.so.0.36[.0] + * 1.0.44 10 10044 10.so.0.44[.0] + * 1.2.36 13 10236 12.so.0.36[.0] + * 1.2.37beta01-03 13 10237 12.so.0.37[.0] + * 1.2.37rc01 13 10237 12.so.0.37[.0] + * 1.2.37 13 10237 12.so.0.37[.0] + * 1.2.45 10 10045 12.so.0.45[.0] + * 1.0.46 10 10046 10.so.0.46[.0] + * 1.2.38beta01 13 10238 12.so.0.38[.0] + * 1.2.38rc01-03 13 10238 12.so.0.38[.0] + * 1.0.47 10 10047 10.so.0.47[.0] + * 1.2.38 13 10238 12.so.0.38[.0] + * 1.2.39beta01-05 13 10239 12.so.0.39[.0] + * 1.2.39rc01 13 10239 12.so.0.39[.0] + * 1.0.48 10 10048 10.so.0.48[.0] + * 1.2.39 13 10239 12.so.0.39[.0] + * 1.2.40beta01 13 10240 12.so.0.40[.0] + * 1.2.40rc01 13 10240 12.so.0.40[.0] + * 1.0.49 10 10049 10.so.0.49[.0] + * 1.2.40 13 10240 12.so.0.40[.0] + * + * Henceforth the source version will match the shared-library major + * and minor numbers; the shared-library major version number will be + * used for changes in backward compatibility, as it is intended. The + * PNG_LIBPNG_VER macro, which is not used within libpng but is available + * for applications, is an unsigned integer of the form xyyzz corresponding + * to the source version x.y.z (leading zeros in y and z). Beta versions + * were given the previous public release number plus a letter, until + * version 1.0.6j; from then on they were given the upcoming public + * release number plus "betaNN" or "rcNN". + * + * Binary incompatibility exists only when applications make direct access + * to the info_ptr or png_ptr members through png.h, and the compiled + * application is loaded with a different version of the library. + * + * DLLNUM will change each time there are forward or backward changes + * in binary compatibility (e.g., when a new feature is added). + * + * See libpng.txt or libpng.3 for more information. The PNG specification + * is available as a W3C Recommendation and as an ISO Specification, + * defines should NOT be changed. + */ +#define PNG_INFO_gAMA 0x0001 +#define PNG_INFO_sBIT 0x0002 +#define PNG_INFO_cHRM 0x0004 +#define PNG_INFO_PLTE 0x0008 +#define PNG_INFO_tRNS 0x0010 +#define PNG_INFO_bKGD 0x0020 +#define PNG_INFO_hIST 0x0040 +#define PNG_INFO_pHYs 0x0080 +#define PNG_INFO_oFFs 0x0100 +#define PNG_INFO_tIME 0x0200 +#define PNG_INFO_pCAL 0x0400 +#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ +#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ +#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ +#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ +#define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */ + +/* This is used for the transformation routines, as some of them + * change these values for the row. It also should enable using + * the routines for other purposes. + */ +typedef struct png_row_info_struct +{ + png_uint_32 width; /* width of row */ + png_uint_32 rowbytes; /* number of bytes in row */ + png_byte color_type; /* color type of row */ + png_byte bit_depth; /* bit depth of row */ + png_byte channels; /* number of channels (1, 2, 3, or 4) */ + png_byte pixel_depth; /* bits per pixel (depth * channels) */ +} png_row_info; + +typedef png_row_info FAR * png_row_infop; +typedef png_row_info FAR * FAR * png_row_infopp; + +/* These are the function types for the I/O functions and for the functions + * that allow the user to override the default I/O functions with his or her + * own. The png_error_ptr type should match that of user-supplied warning + * and error functions, while the png_rw_ptr type should match that of the + * user read/write data functions. + */ +typedef struct png_struct_def png_struct; +typedef png_struct FAR * png_structp; + +typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp)); +typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t)); +typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp)); +typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32, + int)); +typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32, + int)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop)); +typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop)); +typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep, + png_uint_32, int)); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp, + png_row_infop, png_bytep)); +#endif + +#if defined(PNG_USER_CHUNKS_SUPPORTED) +typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp)); +#endif +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) +typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp)); +#endif + +/* Transform masks for the high-level interface */ +#define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ +#define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ +#define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ +#define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ +#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ +#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ +#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ +#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ +#define PNG_TRANSFORM_BGR 0x0080 /* read and write */ +#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ +#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ +#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ +#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* write only, deprecated */ +/* Added to libpng-1.2.34 */ +#define PNG_TRANSFORM_STRIP_FILLER_BEFORE 0x0800 /* write only */ +#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* write only */ + +/* Flags for MNG supported features */ +#define PNG_FLAG_MNG_EMPTY_PLTE 0x01 +#define PNG_FLAG_MNG_FILTER_64 0x04 +#define PNG_ALL_MNG_FEATURES 0x05 + +typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t)); +typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp)); + +/* The structure that holds the information to read and write PNG files. + * The only people who need to care about what is inside of this are the + * people who will be modifying the library for their own special needs. + * It should NOT be accessed directly by an application, except to store + * the jmp_buf. + */ + +struct png_struct_def +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf jmpbuf; /* used in png_error */ +#endif + png_error_ptr error_fn; /* function for printing errors and aborting */ + png_error_ptr warning_fn; /* function for printing warnings */ + png_voidp error_ptr; /* user supplied struct for error functions */ + png_rw_ptr write_data_fn; /* function for writing output data */ + png_rw_ptr read_data_fn; /* function for reading input data */ + png_voidp io_ptr; /* ptr to application struct for I/O functions */ + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) + png_user_transform_ptr read_user_transform_fn; /* user read transform */ +#endif + +#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) + png_user_transform_ptr write_user_transform_fn; /* user write transform */ +#endif + +/* These were added in libpng-1.0.2 */ +#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) + png_voidp user_transform_ptr; /* user supplied struct for user transform */ + png_byte user_transform_depth; /* bit depth of user transformed pixels */ + png_byte user_transform_channels; /* channels in user transformed pixels */ +#endif +#endif + + png_uint_32 mode; /* tells us where we are in the PNG file */ + png_uint_32 flags; /* flags indicating various things to libpng */ + png_uint_32 transformations; /* which transformations to perform */ + + z_stream zstream; /* pointer to decompression structure (below) */ + png_bytep zbuf; /* buffer for zlib */ + png_size_t zbuf_size; /* size of zbuf */ + int zlib_level; /* holds zlib compression level */ + int zlib_method; /* holds zlib compression method */ + int zlib_window_bits; /* holds zlib compression window bits */ + int zlib_mem_level; /* holds zlib compression memory level */ + int zlib_strategy; /* holds zlib compression strategy */ + + png_uint_32 width; /* width of image in pixels */ + png_uint_32 height; /* height of image in pixels */ + png_uint_32 num_rows; /* number of rows in current pass */ + png_uint_32 usr_width; /* width of row at start of write */ + png_uint_32 rowbytes; /* size of row in bytes */ + png_uint_32 irowbytes; /* size of current interlaced row in bytes */ + png_uint_32 iwidth; /* width of current interlaced row in pixels */ + png_uint_32 row_number; /* current row in interlace pass */ + png_bytep prev_row; /* buffer to save previous (unfiltered) row */ + png_bytep row_buf; /* buffer to save current (unfiltered) row */ +#ifndef PNG_NO_WRITE_FILTER + png_bytep sub_row; /* buffer to save "sub" row when filtering */ + png_bytep up_row; /* buffer to save "up" row when filtering */ + png_bytep avg_row; /* buffer to save "avg" row when filtering */ + png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ +#endif + png_row_info row_info; /* used for transformation routines */ + + png_uint_32 idat_size; /* current IDAT size for read */ + png_uint_32 crc; /* current chunk CRC value */ + png_colorp palette; /* palette from the input file */ + png_uint_16 num_palette; /* number of color entries in palette */ + png_uint_16 num_trans; /* number of transparency values */ + png_byte chunk_name[5]; /* null-terminated name of current chunk */ + png_byte compression; /* file compression type (always 0) */ + png_byte filter; /* file filter type (always 0) */ + png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ + png_byte pass; /* current interlace pass (0 - 6) */ + png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ + png_byte color_type; /* color type of file */ + png_byte bit_depth; /* bit depth of file */ + png_byte usr_bit_depth; /* bit depth of users row */ + png_byte pixel_depth; /* number of bits per pixel */ + png_byte channels; /* number of channels in file */ + png_byte usr_channels; /* channels at start of write */ + png_byte sig_bytes; /* magic bytes read/written from start of file */ + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +#ifdef PNG_LEGACY_SUPPORTED + png_byte filler; /* filler byte for pixel expansion */ +#else + png_uint_16 filler; /* filler bytes for pixel expansion */ +#endif +#endif + +#if defined(PNG_bKGD_SUPPORTED) + png_byte background_gamma_type; +# ifdef PNG_FLOATING_POINT_SUPPORTED + float background_gamma; +# endif + png_color_16 background; /* background color in screen gamma space */ +#if defined(PNG_READ_GAMMA_SUPPORTED) + png_color_16 background_1; /* background normalized to gamma 1.0 */ +#endif +#endif /* PNG_bKGD_SUPPORTED */ + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) + png_flush_ptr output_flush_fn; /* Function for flushing output */ + png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ + png_uint_32 flush_rows; /* number of rows written since last flush */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + int gamma_shift; /* number of "insignificant" bits 16-bit gamma */ +#ifdef PNG_FLOATING_POINT_SUPPORTED + float gamma; /* file gamma value */ + float screen_gamma; /* screen gamma value (display_exponent) */ +#endif +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep gamma_table; /* gamma table for 8-bit depth files */ + png_bytep gamma_from_1; /* converts from 1.0 to screen */ + png_bytep gamma_to_1; /* converts from file to 1.0 */ + png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ + png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ + png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) + png_color_8 sig_bit; /* significant bits in each available channel */ +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) + png_color_8 shift; /* shift for significant bit tranformation */ +#endif + +#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ + || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep trans; /* transparency values for paletted files */ + png_color_16 trans_values; /* transparency values for non-paletted files */ +#endif + + png_read_status_ptr read_row_fn; /* called after each row is decoded */ + png_write_status_ptr write_row_fn; /* called after each row is encoded */ +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + png_progressive_info_ptr info_fn; /* called after header data fully read */ + png_progressive_row_ptr row_fn; /* called after each prog. row is decoded */ + png_progressive_end_ptr end_fn; /* called after image is complete */ + png_bytep save_buffer_ptr; /* current location in save_buffer */ + png_bytep save_buffer; /* buffer for previously read data */ + png_bytep current_buffer_ptr; /* current location in current_buffer */ + png_bytep current_buffer; /* buffer for recently used data */ + png_uint_32 push_length; /* size of current input chunk */ + png_uint_32 skip_length; /* bytes to skip in input data */ + png_size_t save_buffer_size; /* amount of data now in save_buffer */ + png_size_t save_buffer_max; /* total size of save_buffer */ + png_size_t buffer_size; /* total amount of available input data */ + png_size_t current_buffer_size; /* amount of data now in current_buffer */ + int process_mode; /* what push library is currently doing */ + int cur_palette; /* current push library palette index */ + +# if defined(PNG_TEXT_SUPPORTED) + png_size_t current_text_size; /* current size of text input data */ + png_size_t current_text_left; /* how much text left to read in input */ + png_charp current_text; /* current text chunk buffer */ + png_charp current_text_ptr; /* current location in current_text */ +# endif /* PNG_TEXT_SUPPORTED */ +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) +/* for the Borland special 64K segment handler */ + png_bytepp offset_table_ptr; + png_bytep offset_table; + png_uint_16 offset_table_number; + png_uint_16 offset_table_count; + png_uint_16 offset_table_count_free; +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) + png_bytep palette_lookup; /* lookup table for dithering */ + png_bytep dither_index; /* index translation for palette files */ +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED) + png_uint_16p hist; /* histogram */ +#endif + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + png_byte heuristic_method; /* heuristic for row filter selection */ + png_byte num_prev_filters; /* number of weights for previous rows */ + png_bytep prev_filters; /* filter type(s) of previous row(s) */ + png_uint_16p filter_weights; /* weight(s) for previous line(s) */ + png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ + png_uint_16p filter_costs; /* relative filter calculation cost */ + png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ +#endif + +#if defined(PNG_TIME_RFC1123_SUPPORTED) + png_charp time_buffer; /* String to hold RFC 1123 time text */ +#endif + +/* New members added in libpng-1.0.6 */ + +#ifdef PNG_FREE_ME_SUPPORTED + png_uint_32 free_me; /* flags items libpng is responsible for freeing */ +#endif + +#if defined(PNG_USER_CHUNKS_SUPPORTED) + png_voidp user_chunk_ptr; + png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ +#endif + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + int num_chunk_list; + png_bytep chunk_list; +#endif + +/* New members added in libpng-1.0.3 */ +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + png_byte rgb_to_gray_status; + /* These were changed from png_byte in libpng-1.0.6 */ + png_uint_16 rgb_to_gray_red_coeff; + png_uint_16 rgb_to_gray_green_coeff; + png_uint_16 rgb_to_gray_blue_coeff; +#endif + +/* New member added in libpng-1.0.4 (renamed in 1.0.9) */ +#if defined(PNG_MNG_FEATURES_SUPPORTED) || \ + defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) +/* Changed from png_byte to png_uint_32 at version 1.2.0 */ +#ifdef PNG_1_0_X + png_byte mng_features_permitted; +#else + png_uint_32 mng_features_permitted; +#endif /* PNG_1_0_X */ +#endif + +/* New member added in libpng-1.0.7 */ +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_fixed_point int_gamma; +#endif + +/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ +#if defined(PNG_MNG_FEATURES_SUPPORTED) + png_byte filter_type; +#endif + +#if defined(PNG_1_0_X) +/* New member added in libpng-1.0.10, ifdef'ed out in 1.2.0 */ + png_uint_32 row_buf_size; +#endif + +/* New members added in libpng-1.2.0 */ +#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) +# if !defined(PNG_1_0_X) +# if defined(PNG_MMX_CODE_SUPPORTED) + png_byte mmx_bitdepth_threshold; + png_uint_32 mmx_rowbytes_threshold; +# endif + png_uint_32 asm_flags; +# endif +#endif + +/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ +#ifdef PNG_USER_MEM_SUPPORTED + png_voidp mem_ptr; /* user supplied struct for mem functions */ + png_malloc_ptr malloc_fn; /* function for allocating memory */ + png_free_ptr free_fn; /* function for freeing memory */ +#endif + +/* New member added in libpng-1.0.13 and 1.2.0 */ + png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ + +#if defined(PNG_READ_DITHER_SUPPORTED) +/* The following three members were added at version 1.0.14 and 1.2.4 */ + png_bytep dither_sort; /* working sort array */ + png_bytep index_to_palette; /* where the original index currently is */ + /* in the palette */ + png_bytep palette_to_index; /* which original index points to this */ + /* palette color */ +#endif + +/* New members added in libpng-1.0.16 and 1.2.6 */ + png_byte compression_type; + +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + png_uint_32 user_width_max; + png_uint_32 user_height_max; +#endif + +/* New member added in libpng-1.0.25 and 1.2.17 */ +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + /* Storage for unknown chunk that the library doesn't recognize. */ + png_unknown_chunk unknown_chunk; +#endif + +/* New members added in libpng-1.2.26 */ + png_uint_32 old_big_row_buf_size, old_prev_row_size; + +/* New member added in libpng-1.2.30 */ + png_charp chunkdata; /* buffer for reading chunk data */ + +}; + + +/* This triggers a compiler error in png.c, if png.c and png.h + * do not agree upon the version number. + */ +typedef png_structp version_1_2_40; + +typedef png_struct FAR * FAR * png_structpp; + +/* Here are the function definitions most commonly used. This is not + * the place to find out how to use libpng. See libpng.txt for the + * full explanation, see example.c for the summary. This just provides + * a simple one line description of the use of each function. + */ + +/* Returns the version number of the library */ +extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void)); + +/* Tell lib we have already handled the first magic bytes. + * Handling more than 8 bytes from the beginning of the file is an error. + */ +extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr, + int num_bytes)); + +/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a + * PNG file. Returns zero if the supplied bytes match the 8-byte PNG + * signature, and non-zero otherwise. Having num_to_check == 0 or + * start > 7 will always fail (ie return non-zero). + */ +extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start, + png_size_t num_to_check)); + +/* Simple signature checking function. This is the same as calling + * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). + */ +extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num)); + +/* Allocate and initialize png_ptr struct for reading, and any other memory. */ +extern PNG_EXPORT(png_structp,png_create_read_struct) + PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn)); + +/* Allocate and initialize png_ptr struct for writing, and any other memory */ +extern PNG_EXPORT(png_structp,png_create_write_struct) + PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn)); + +#ifdef PNG_WRITE_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size) + PNGARG((png_structp png_ptr)); +#endif + +#ifdef PNG_WRITE_SUPPORTED +extern PNG_EXPORT(void,png_set_compression_buffer_size) + PNGARG((png_structp png_ptr, png_uint_32 size)); +#endif + +/* Reset the compression stream */ +extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr)); + +/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ +#ifdef PNG_USER_MEM_SUPPORTED +extern PNG_EXPORT(png_structp,png_create_read_struct_2) + PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +extern PNG_EXPORT(png_structp,png_create_write_struct_2) + PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +#endif + +/* Write a PNG chunk - size, type, (optional) data, CRC. */ +extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr, + png_bytep chunk_name, png_bytep data, png_size_t length)); + +/* Write the start of a PNG chunk - length and chunk name. */ +extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr, + png_bytep chunk_name, png_uint_32 length)); + +/* Write the data of a PNG chunk started with png_write_chunk_start(). */ +extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr, + png_bytep data, png_size_t length)); + +/* Finish a chunk started with png_write_chunk_start() (includes CRC). */ +extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr)); + +/* Allocate and initialize the info structure */ +extern PNG_EXPORT(png_infop,png_create_info_struct) + PNGARG((png_structp png_ptr)); + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Initialize the info structure (old interface - DEPRECATED) */ +extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr)); +#undef png_info_init +#define png_info_init(info_ptr) png_info_init_3(&info_ptr,\ + png_sizeof(png_info)); +#endif + +extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr, + png_size_t png_info_struct_size)); + +/* Writes all the PNG information before the image. */ +extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr, + png_infop info_ptr)); +extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Read the information before the actual image data. */ +extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif + +#if defined(PNG_TIME_RFC1123_SUPPORTED) +extern PNG_EXPORT(png_charp,png_convert_to_rfc1123) + PNGARG((png_structp png_ptr, png_timep ptime)); +#endif + +#if !defined(_WIN32_WCE) +/* "time.h" functions are not supported on WindowsCE */ +#if defined(PNG_WRITE_tIME_SUPPORTED) +/* Convert from a struct tm to png_time */ +extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime, + struct tm FAR * ttime)); + +/* Convert from time_t to png_time. Uses gmtime() */ +extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime, + time_t ttime)); +#endif /* PNG_WRITE_tIME_SUPPORTED */ +#endif /* _WIN32_WCE */ + +#if defined(PNG_READ_EXPAND_SUPPORTED) +/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ +extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr)); +#if !defined(PNG_1_0_X) +extern PNG_EXPORT(void,png_set_expand_gray_1_2_4_to_8) PNGARG((png_structp + png_ptr)); +#endif +extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr)); +extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr)); +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Deprecated */ +extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); +#endif +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* Use blue, green, red order for pixels. */ +extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) +/* Expand the grayscale to 24-bit RGB if necessary. */ +extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) +/* Reduce RGB to grayscale. */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr, + int error_action, double red, double green )); +#endif +extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr, + int error_action, png_fixed_point red, png_fixed_point green )); +extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp + png_ptr)); +#endif + +extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth, + png_colorp palette)); + +#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) +extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ +extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr, + png_uint_32 filler, int flags)); +/* The values of the PNG_FILLER_ defines should NOT be changed */ +#define PNG_FILLER_BEFORE 0 +#define PNG_FILLER_AFTER 1 +/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ +#if !defined(PNG_1_0_X) +extern PNG_EXPORT(void,png_set_add_alpha) PNGARG((png_structp png_ptr, + png_uint_32 filler, int flags)); +#endif +#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* Swap bytes in 16-bit depth files. */ +extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) +/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ +extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) +/* Swap packing order of pixels in bytes. */ +extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) +/* Converts files to legal bit depths. */ +extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr, + png_color_8p true_bits)); +#endif + +#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ + defined(PNG_WRITE_INTERLACING_SUPPORTED) +/* Have the code handle the interlacing. Returns the number of passes. */ +extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +/* Invert monochrome files */ +extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) +/* Handle alpha and tRNS by replacing with a background color. */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr, + png_color_16p background_color, int background_gamma_code, + int need_expand, double background_gamma)); +#endif +#define PNG_BACKGROUND_GAMMA_UNKNOWN 0 +#define PNG_BACKGROUND_GAMMA_SCREEN 1 +#define PNG_BACKGROUND_GAMMA_FILE 2 +#define PNG_BACKGROUND_GAMMA_UNIQUE 3 +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) +/* Strip the second byte of information from a 16-bit depth file. */ +extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) +/* Turn on dithering, and reduce the palette to the number of colors available. */ +extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr, + png_colorp palette, int num_palette, int maximum_colors, + png_uint_16p histogram, int full_dither)); +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) +/* Handle gamma correction. Screen_gamma=(display_exponent) */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr, + double screen_gamma, double default_file_gamma)); +#endif +#endif + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) +/* Permit or disallow empty PLTE (0: not permitted, 1: permitted) */ +/* Deprecated and will be removed. Use png_permit_mng_features() instead. */ +extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr, + int empty_plte_permitted)); +#endif +#endif + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) +/* Set how many lines between output flushes - 0 for no flushing */ +extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows)); +/* Flush the current PNG output buffer */ +extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr)); +#endif + +/* Optional update palette with requested transformations */ +extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr)); + +/* Optional call to update the users info structure */ +extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Read one or more rows of image data. */ +extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr, + png_bytepp row, png_bytepp display_row, png_uint_32 num_rows)); +#endif + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Read a row of data. */ +extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr, + png_bytep row, + png_bytep display_row)); +#endif + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Read the whole image into memory at once. */ +extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr, + png_bytepp image)); +#endif + +/* Write a row of image data */ +extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr, + png_bytep row)); + +/* Write a few rows of image data */ +extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr, + png_bytepp row, png_uint_32 num_rows)); + +/* Write the image data */ +extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr, + png_bytepp image)); + +/* Writes the end of the PNG file. */ +extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Read the end of the PNG file. */ +extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif + +/* Free any memory associated with the png_info_struct */ +extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr, + png_infopp info_ptr_ptr)); + +/* Free any memory associated with the png_struct and the png_info_structs */ +extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp + png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); + +/* Free all memory used by the read (old method - NOT DLL EXPORTED) */ +extern void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr, + png_infop end_info_ptr)); + +/* Free any memory associated with the png_struct and the png_info_structs */ +extern PNG_EXPORT(void,png_destroy_write_struct) + PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)); + +/* Free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */ +extern void png_write_destroy PNGARG((png_structp png_ptr)); + +/* Set the libpng method of handling chunk CRC errors */ +extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr, + int crit_action, int ancil_action)); + +/* Values for png_set_crc_action() to say how to handle CRC errors in + * ancillary and critical chunks, and whether to use the data contained + * therein. Note that it is impossible to "discard" data in a critical + * chunk. For versions prior to 0.90, the action was always error/quit, + * whereas in version 0.90 and later, the action for CRC errors in ancillary + * chunks is warn/discard. These values should NOT be changed. + * + * value action:critical action:ancillary + */ +#define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ +#define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ +#define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ +#define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ +#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ +#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ + +/* These functions give the user control over the scan-line filtering in + * libpng and the compression methods used by zlib. These functions are + * mainly useful for testing, as the defaults should work with most users. + * Those users who are tight on memory or want faster performance at the + * expense of compression can modify them. See the compression library + * header file (zlib.h) for an explination of the compression functions. + */ + +/* Set the filtering method(s) used by libpng. Currently, the only valid + * value for "method" is 0. + */ +extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method, + int filters)); + +/* Flags for png_set_filter() to say which filters to use. The flags + * are chosen so that they don't conflict with real filter types + * below, in case they are supplied instead of the #defined constants. + * These values should NOT be changed. + */ +#define PNG_NO_FILTERS 0x00 +#define PNG_FILTER_NONE 0x08 +#define PNG_FILTER_SUB 0x10 +#define PNG_FILTER_UP 0x20 +#define PNG_FILTER_AVG 0x40 +#define PNG_FILTER_PAETH 0x80 +#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ + PNG_FILTER_AVG | PNG_FILTER_PAETH) + +/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. + * These defines should NOT be changed. + */ +#define PNG_FILTER_VALUE_NONE 0 +#define PNG_FILTER_VALUE_SUB 1 +#define PNG_FILTER_VALUE_UP 2 +#define PNG_FILTER_VALUE_AVG 3 +#define PNG_FILTER_VALUE_PAETH 4 +#define PNG_FILTER_VALUE_LAST 5 + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* EXPERIMENTAL */ +/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ + * defines, either the default (minimum-sum-of-absolute-differences), or + * the experimental method (weighted-minimum-sum-of-absolute-differences). + * + * Weights are factors >= 1.0, indicating how important it is to keep the + * filter type consistent between rows. Larger numbers mean the current + * filter is that many times as likely to be the same as the "num_weights" + * previous filters. This is cumulative for each previous row with a weight. + * There needs to be "num_weights" values in "filter_weights", or it can be + * NULL if the weights aren't being specified. Weights have no influence on + * the selection of the first row filter. Well chosen weights can (in theory) + * improve the compression for a given image. + * + * Costs are factors >= 1.0 indicating the relative decoding costs of a + * filter type. Higher costs indicate more decoding expense, and are + * therefore less likely to be selected over a filter with lower computational + * costs. There needs to be a value in "filter_costs" for each valid filter + * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't + * setting the costs. Costs try to improve the speed of decompression without + * unduly increasing the compressed image size. + * + * A negative weight or cost indicates the default value is to be used, and + * values in the range [0.0, 1.0) indicate the value is to remain unchanged. + * The default values for both weights and costs are currently 1.0, but may + * change if good general weighting/cost heuristics can be found. If both + * the weights and costs are set to 1.0, this degenerates the WEIGHTED method + * to the UNWEIGHTED method, but with added encoding time/computation. + */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr, + int heuristic_method, int num_weights, png_doublep filter_weights, + png_doublep filter_costs)); +#endif +#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ + +/* Heuristic used for row filter selection. These defines should NOT be + * changed. + */ +#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ +#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ +#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ +#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ + +/* Set the library compression level. Currently, valid values range from + * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 + * (0 - no compression, 9 - "maximal" compression). Note that tests have + * shown that zlib compression levels 3-6 usually perform as well as level 9 + * for PNG images, and do considerably fewer caclulations. In the future, + * these values may not correspond directly to the zlib compression levels. + */ +extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr, + int level)); + +extern PNG_EXPORT(void,png_set_compression_mem_level) + PNGARG((png_structp png_ptr, int mem_level)); + +extern PNG_EXPORT(void,png_set_compression_strategy) + PNGARG((png_structp png_ptr, int strategy)); + +extern PNG_EXPORT(void,png_set_compression_window_bits) + PNGARG((png_structp png_ptr, int window_bits)); + +extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr, + int method)); + +/* These next functions are called for input/output, memory, and error + * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, + * and call standard C I/O routines such as fread(), fwrite(), and + * fprintf(). These functions can be made to use other I/O routines + * at run time for those applications that need to handle I/O in a + * different manner by calling png_set_???_fn(). See libpng.txt for + * more information. + */ + +#if !defined(PNG_NO_STDIO) +/* Initialize the input/output for the PNG file to the default functions. */ +extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, png_FILE_p fp)); +#endif + +/* Replace the (error and abort), and warning functions with user + * supplied functions. If no messages are to be printed you must still + * write and use replacement functions. The replacement error_fn should + * still do a longjmp to the last setjmp location if you are using this + * method of error handling. If error_fn or warning_fn is NULL, the + * default function will be used. + */ + +extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr, + png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); + +/* Return the user pointer associated with the error functions */ +extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr)); + +/* Replace the default data output functions with a user supplied one(s). + * If buffered output is not used, then output_flush_fn can be set to NULL. + * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time + * output_flush_fn will be ignored (and thus can be NULL). + * It is probably a mistake to use NULL for output_flush_fn if + * write_data_fn is not also NULL unless you have built libpng with + * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's + * default flush function, which uses the standard *FILE structure, will + * be used. + */ +extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr, + png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); + +/* Replace the default data input function with a user supplied one. */ +extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr, + png_voidp io_ptr, png_rw_ptr read_data_fn)); + +/* Return the user pointer associated with the I/O functions */ +extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr)); + +extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr, + png_read_status_ptr read_row_fn)); + +extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr, + png_write_status_ptr write_row_fn)); + +#ifdef PNG_USER_MEM_SUPPORTED +/* Replace the default memory allocation functions with user supplied one(s). */ +extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +/* Return the user pointer associated with the memory functions */ +extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp + png_ptr, png_user_transform_ptr read_user_transform_fn)); +#endif + +#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp + png_ptr, png_user_transform_ptr write_user_transform_fn)); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp + png_ptr, png_voidp user_transform_ptr, int user_transform_depth, + int user_transform_channels)); +/* Return the user pointer associated with the user transform functions */ +extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr) + PNGARG((png_structp png_ptr)); +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr, + png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); +extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp + png_ptr)); +#endif + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +/* Sets the function callbacks for the push reader, and a pointer to a + * user-defined structure available to the callback functions. + */ +extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr, + png_voidp progressive_ptr, + png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, + png_progressive_end_ptr end_fn)); + +/* Returns the user pointer associated with the push read functions */ +extern PNG_EXPORT(png_voidp,png_get_progressive_ptr) + PNGARG((png_structp png_ptr)); + +/* Function to be called when data becomes available */ +extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_bytep buffer, png_size_t buffer_size)); + +/* Function that combines rows. Not very much different than the + * png_combine_row() call. Is this even used????? + */ +extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr, + png_bytep old_row, png_bytep new_row)); +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr, + png_uint_32 size)); + +#if defined(PNG_1_0_X) +# define png_malloc_warn png_malloc +#else +/* Added at libpng version 1.2.4 */ +extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr, + png_uint_32 size)); +#endif + +/* Frees a pointer allocated by png_malloc() */ +extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr)); + +#if defined(PNG_1_0_X) +/* Function to allocate memory for zlib. */ +extern PNG_EXPORT(voidpf,png_zalloc) PNGARG((voidpf png_ptr, uInt items, + uInt size)); + +/* Function to free memory for zlib */ +extern PNG_EXPORT(void,png_zfree) PNGARG((voidpf png_ptr, voidpf ptr)); +#endif + +/* Free data that was allocated internally */ +extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 free_me, int num)); +#ifdef PNG_FREE_ME_SUPPORTED +/* Reassign responsibility for freeing existing data, whether allocated + * by libpng or by the application + */ +extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr, + png_infop info_ptr, int freer, png_uint_32 mask)); +#endif +/* Assignments for png_data_freer */ +#define PNG_DESTROY_WILL_FREE_DATA 1 +#define PNG_SET_WILL_FREE_DATA 1 +#define PNG_USER_WILL_FREE_DATA 2 +/* Flags for png_ptr->free_me and info_ptr->free_me */ +#define PNG_FREE_HIST 0x0008 +#define PNG_FREE_ICCP 0x0010 +#define PNG_FREE_SPLT 0x0020 +#define PNG_FREE_ROWS 0x0040 +#define PNG_FREE_PCAL 0x0080 +#define PNG_FREE_SCAL 0x0100 +#define PNG_FREE_UNKN 0x0200 +#define PNG_FREE_LIST 0x0400 +#define PNG_FREE_PLTE 0x1000 +#define PNG_FREE_TRNS 0x2000 +#define PNG_FREE_TEXT 0x4000 +#define PNG_FREE_ALL 0x7fff +#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ + +#ifdef PNG_USER_MEM_SUPPORTED +extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr, + png_uint_32 size)); +extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr, + png_voidp ptr)); +#endif + +extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr, + png_voidp s1, png_voidp s2, png_uint_32 size)); + +extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr, + png_voidp s1, int value, png_uint_32 size)); + +#if defined(USE_FAR_KEYWORD) /* memory model conversion function */ +extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr, + int check)); +#endif /* USE_FAR_KEYWORD */ + +#ifndef PNG_NO_ERROR_TEXT +/* Fatal error in PNG image of libpng - can't continue */ +extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr, + png_const_charp error_message)); + +/* The same, but the chunk name is prepended to the error string. */ +extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr, + png_const_charp error_message)); +#else +/* Fatal error in PNG image of libpng - can't continue */ +extern PNG_EXPORT(void,png_err) PNGARG((png_structp png_ptr)); +#endif + +#ifndef PNG_NO_WARNINGS +/* Non-fatal error in libpng. Can continue, but may have a problem. */ +extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr, + png_const_charp warning_message)); + +#ifdef PNG_READ_SUPPORTED +/* Non-fatal error in libpng, chunk name is prepended to message. */ +extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr, + png_const_charp warning_message)); +#endif /* PNG_READ_SUPPORTED */ +#endif /* PNG_NO_WARNINGS */ + +/* The png_set_ functions are for storing values in the png_info_struct. + * Similarly, the png_get_ calls are used to read values from the + * png_info_struct, either storing the parameters in the passed variables, or + * setting pointers into the png_info_struct where the data is stored. The + * png_get_ functions return a non-zero value if the data was available + * in info_ptr, or return zero and do not change any of the parameters if the + * data was not available. + * + * These functions should be used instead of directly accessing png_info + * to avoid problems with future changes in the size and internal layout of + * png_info_struct. + */ +/* Returns "flag" if chunk data is valid in info_ptr. */ +extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr, +png_infop info_ptr, png_uint_32 flag)); + +/* Returns number of bytes needed to hold a transformed row. */ +extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +#if defined(PNG_INFO_IMAGE_SUPPORTED) +/* Returns row_pointers, which is an array of pointers to scanlines that was + * returned from png_read_png(). + */ +extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr, +png_infop info_ptr)); +/* Set row_pointers, which is an array of pointers to scanlines for use + * by png_write_png(). + */ +extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_bytepp row_pointers)); +#endif + +/* Returns number of color channels in image. */ +extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +#ifdef PNG_EASY_ACCESS_SUPPORTED +/* Returns image width in pixels. */ +extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image height in pixels. */ +extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image bit_depth. */ +extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image color_type. */ +extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image filter_type. */ +extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image interlace_type. */ +extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image compression_type. */ +extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image resolution in pixels per meter, from pHYs chunk data. */ +extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns pixel aspect ratio, computed from pHYs chunk data. */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +#endif + +/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ +extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +#endif /* PNG_EASY_ACCESS_SUPPORTED */ + +/* Returns pointer to signature string read from PNG header */ +extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +#if defined(PNG_bKGD_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_color_16p *background)); +#endif + +#if defined(PNG_bKGD_SUPPORTED) +extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_color_16p background)); +#endif + +#if defined(PNG_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr, + png_infop info_ptr, double *white_x, double *white_y, double *red_x, + double *red_y, double *green_x, double *green_y, double *blue_x, + double *blue_y)); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point + *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y, + png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point + *int_blue_x, png_fixed_point *int_blue_y)); +#endif +#endif + +#if defined(PNG_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr, + png_infop info_ptr, double white_x, double white_y, double red_x, + double red_y, double green_x, double green_y, double blue_x, double blue_y)); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, + png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point + int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); +#endif +#endif + +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr, + png_infop info_ptr, double *file_gamma)); +#endif +extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point *int_file_gamma)); +#endif + +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr, + png_infop info_ptr, double file_gamma)); +#endif +extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_file_gamma)); +#endif + +#if defined(PNG_hIST_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_16p *hist)); +#endif + +#if defined(PNG_hIST_SUPPORTED) +extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_16p hist)); +#endif + +extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, + int *bit_depth, int *color_type, int *interlace_method, + int *compression_method, int *filter_method)); + +extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, + int color_type, int interlace_method, int compression_method, + int filter_method)); + +#if defined(PNG_oFFs_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, + int *unit_type)); +#endif + +#if defined(PNG_oFFs_SUPPORTED) +extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y, + int unit_type)); +#endif + +#if defined(PNG_pCAL_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1, + int *type, int *nparams, png_charp *units, png_charpp *params)); +#endif + +#if defined(PNG_pCAL_SUPPORTED) +extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, + int type, int nparams, png_charp units, png_charpp params)); +#endif + +#if defined(PNG_pHYs_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); +#endif + +#if defined(PNG_pHYs_SUPPORTED) +extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); +#endif + +extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_colorp *palette, int *num_palette)); + +extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_colorp palette, int num_palette)); + +#if defined(PNG_sBIT_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_color_8p *sig_bit)); +#endif + +#if defined(PNG_sBIT_SUPPORTED) +extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_color_8p sig_bit)); +#endif + +#if defined(PNG_sRGB_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr, + png_infop info_ptr, int *intent)); +#endif + +#if defined(PNG_sRGB_SUPPORTED) +extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr, + png_infop info_ptr, int intent)); +extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr, + png_infop info_ptr, int intent)); +#endif + +#if defined(PNG_iCCP_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_charpp name, int *compression_type, + png_charpp profile, png_uint_32 *proflen)); + /* Note to maintainer: profile should be png_bytepp */ +#endif + +#if defined(PNG_iCCP_SUPPORTED) +extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_charp name, int compression_type, + png_charp profile, png_uint_32 proflen)); + /* Note to maintainer: profile should be png_bytep */ +#endif + +#if defined(PNG_sPLT_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_sPLT_tpp entries)); +#endif + +#if defined(PNG_sPLT_SUPPORTED) +extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_sPLT_tp entries, int nentries)); +#endif + +#if defined(PNG_TEXT_SUPPORTED) +/* png_get_text also returns the number of text chunks in *num_text */ +extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_textp *text_ptr, int *num_text)); +#endif + +/* + * Note while png_set_text() will accept a structure whose text, + * language, and translated keywords are NULL pointers, the structure + * returned by png_get_text will always contain regular + * zero-terminated C strings. They might be empty strings but + * they will never be NULL pointers. + */ + +#if defined(PNG_TEXT_SUPPORTED) +extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_textp text_ptr, int num_text)); +#endif + +#if defined(PNG_tIME_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_timep *mod_time)); +#endif + +#if defined(PNG_tIME_SUPPORTED) +extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_timep mod_time)); +#endif + +#if defined(PNG_tRNS_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_bytep *trans, int *num_trans, + png_color_16p *trans_values)); +#endif + +#if defined(PNG_tRNS_SUPPORTED) +extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_bytep trans, int num_trans, + png_color_16p trans_values)); +#endif + +#if defined(PNG_tRNS_SUPPORTED) +#endif + +#if defined(PNG_sCAL_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr, + png_infop info_ptr, int *unit, double *width, double *height)); +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr, + png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight)); +#endif +#endif +#endif /* PNG_sCAL_SUPPORTED */ + +#if defined(PNG_sCAL_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr, + png_infop info_ptr, int unit, double width, double height)); +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr, + png_infop info_ptr, int unit, png_charp swidth, png_charp sheight)); +#endif +#endif +#endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */ + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +/* Provide a list of chunks and how they are to be handled, if the built-in + handling or default unknown chunk handling is not desired. Any chunks not + listed will be handled in the default manner. The IHDR and IEND chunks + must not be listed. + keep = 0: follow default behaviour + = 1: do not keep + = 2: keep only if safe-to-copy + = 3: keep even if unsafe-to-copy +*/ +extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp + png_ptr, int keep, png_bytep chunk_list, int num_chunks)); +PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep + chunk_name)); +#endif +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) +extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)); +extern PNG_EXPORT(void, png_set_unknown_chunk_location) + PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location)); +extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp + png_ptr, png_infop info_ptr, png_unknown_chunkpp entries)); +#endif + +/* Png_free_data() will turn off the "valid" flag for anything it frees. + * If you need to turn it off for a chunk that your application has freed, + * you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); + */ +extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr, + png_infop info_ptr, int mask)); + +#if defined(PNG_INFO_IMAGE_SUPPORTED) +/* The "params" pointer is currently not used and is for future expansion. */ +extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr, + png_infop info_ptr, + int transforms, + png_voidp params)); +extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr, + png_infop info_ptr, + int transforms, + png_voidp params)); +#endif + +/* Define PNG_DEBUG at compile time for debugging information. Higher + * numbers for PNG_DEBUG mean more debugging information. This has + * only been added since version 0.95 so it is not implemented throughout + * libpng yet, but more support will be added as needed. + */ +#ifdef PNG_DEBUG +#if (PNG_DEBUG > 0) +#if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) +#include +#if (PNG_DEBUG > 1) +#ifndef _DEBUG +# define _DEBUG +#endif +#ifndef png_debug +#define png_debug(l,m) _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE) +#endif +#ifndef png_debug1 +#define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1) +#endif +#ifndef png_debug2 +#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2) +#endif +#endif +#else /* PNG_DEBUG_FILE || !_MSC_VER */ +#ifndef PNG_DEBUG_FILE +#define PNG_DEBUG_FILE stderr +#endif /* PNG_DEBUG_FILE */ + +#if (PNG_DEBUG > 1) +/* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on non-ISO + * compilers. + */ +# ifdef __STDC__ +# ifndef png_debug +# define png_debug(l,m) \ + { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ + } +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) \ + { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ + } +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + { \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ + } +# endif +# else /* __STDC __ */ +# ifndef png_debug +# define png_debug(l,m) \ + { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format); \ + } +# endif +# ifndef png_debug1 +# define png_debug1(l,m,p1) \ + { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format,p1); \ + } +# endif +# ifndef png_debug2 +# define png_debug2(l,m,p1,p2) \ + { \ + int num_tabs=l; \ + char format[256]; \ + snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \ + m,PNG_STRING_NEWLINE); \ + fprintf(PNG_DEBUG_FILE,format,p1,p2); \ + } +# endif +# endif /* __STDC __ */ +#endif /* (PNG_DEBUG > 1) */ + +#endif /* _MSC_VER */ +#endif /* (PNG_DEBUG > 0) */ +#endif /* PNG_DEBUG */ +#ifndef png_debug +#define png_debug(l, m) +#endif +#ifndef png_debug1 +#define png_debug1(l, m, p1) +#endif +#ifndef png_debug2 +#define png_debug2(l, m, p1, p2) +#endif + +extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr)); +extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr)); +extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr)); +extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr)); + +#ifdef PNG_MNG_FEATURES_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp + png_ptr, png_uint_32 mng_features_permitted)); +#endif + +/* For use in png_set_keep_unknown, added to version 1.2.6 */ +#define PNG_HANDLE_CHUNK_AS_DEFAULT 0 +#define PNG_HANDLE_CHUNK_NEVER 1 +#define PNG_HANDLE_CHUNK_IF_SAFE 2 +#define PNG_HANDLE_CHUNK_ALWAYS 3 + +/* Added to version 1.2.0 */ +#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) +#if defined(PNG_MMX_CODE_SUPPORTED) +#define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED 0x01 /* not user-settable */ +#define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU 0x02 /* not user-settable */ +#define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW 0x04 +#define PNG_ASM_FLAG_MMX_READ_INTERLACE 0x08 +#define PNG_ASM_FLAG_MMX_READ_FILTER_SUB 0x10 +#define PNG_ASM_FLAG_MMX_READ_FILTER_UP 0x20 +#define PNG_ASM_FLAG_MMX_READ_FILTER_AVG 0x40 +#define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80 +#define PNG_ASM_FLAGS_INITIALIZED 0x80000000 /* not user-settable */ + +#define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ + | PNG_ASM_FLAG_MMX_READ_INTERLACE \ + | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ + | PNG_ASM_FLAG_MMX_READ_FILTER_UP \ + | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ + | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ) +#define PNG_MMX_WRITE_FLAGS ( 0 ) + +#define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \ + | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU \ + | PNG_MMX_READ_FLAGS \ + | PNG_MMX_WRITE_FLAGS ) + +#define PNG_SELECT_READ 1 +#define PNG_SELECT_WRITE 2 +#endif /* PNG_MMX_CODE_SUPPORTED */ + +#if !defined(PNG_1_0_X) +/* pngget.c */ +extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask) + PNGARG((int flag_select, int *compilerID)); + +/* pngget.c */ +extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask) + PNGARG((int flag_select)); + +/* pngget.c */ +extern PNG_EXPORT(png_uint_32,png_get_asm_flags) + PNGARG((png_structp png_ptr)); + +/* pngget.c */ +extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold) + PNGARG((png_structp png_ptr)); + +/* pngget.c */ +extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold) + PNGARG((png_structp png_ptr)); + +/* pngset.c */ +extern PNG_EXPORT(void,png_set_asm_flags) + PNGARG((png_structp png_ptr, png_uint_32 asm_flags)); + +/* pngset.c */ +extern PNG_EXPORT(void,png_set_mmx_thresholds) + PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold, + png_uint_32 mmx_rowbytes_threshold)); + +#endif /* PNG_1_0_X */ + +#if !defined(PNG_1_0_X) +/* png.c, pnggccrd.c, or pngvcrd.c */ +extern PNG_EXPORT(int,png_mmx_support) PNGARG((void)); +#endif /* PNG_1_0_X */ +#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ + +/* Strip the prepended error numbers ("#nnn ") from error and warning + * messages before passing them to the error or warning handler. + */ +#ifdef PNG_ERROR_NUMBERS_SUPPORTED +extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp + png_ptr, png_uint_32 strip_mode)); +#endif + +/* Added at libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp + png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max)); +extern PNG_EXPORT(png_uint_32,png_get_user_width_max) PNGARG((png_structp + png_ptr)); +extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp + png_ptr)); +#endif + + +/* Maintainer: Put new public prototypes here ^, in libpng.3, and in + * project defs + */ + +#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED +/* With these routines we avoid an integer divide, which will be slower on + * most machines. However, it does take more operations than the corresponding + * divide method, so it may be slower on a few RISC systems. There are two + * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. + * + * Note that the rounding factors are NOT supposed to be the same! 128 and + * 32768 are correct for the NODIV code; 127 and 32767 are correct for the + * standard method. + * + * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] + */ + + /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ + +# define png_composite(composite, fg, alpha, bg) \ + { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) * (png_uint_16)(alpha) \ + + (png_uint_16)(bg)*(png_uint_16)(255 - \ + (png_uint_16)(alpha)) + (png_uint_16)128); \ + (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } + +# define png_composite_16(composite, fg, alpha, bg) \ + { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) * (png_uint_32)(alpha) \ + + (png_uint_32)(bg)*(png_uint_32)(65535L - \ + (png_uint_32)(alpha)) + (png_uint_32)32768L); \ + (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } + +#else /* Standard method using integer division */ + +# define png_composite(composite, fg, alpha, bg) \ + (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ + (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ + (png_uint_16)127) / 255) + +# define png_composite_16(composite, fg, alpha, bg) \ + (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ + (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \ + (png_uint_32)32767) / (png_uint_32)65535L) + +#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ + +/* Inline macros to do direct reads of bytes from the input buffer. These + * require that you are using an architecture that uses PNG byte ordering + * (MSB first) and supports unaligned data storage. I think that PowerPC + * in big-endian mode and 680x0 are the only ones that will support this. + * The x86 line of processors definitely do not. The png_get_int_32() + * routine also assumes we are using two's complement format for negative + * values, which is almost certainly true. + */ +#if defined(PNG_READ_BIG_ENDIAN_SUPPORTED) +# define png_get_uint_32(buf) ( *((png_uint_32p) (buf))) +# define png_get_uint_16(buf) ( *((png_uint_16p) (buf))) +# define png_get_int_32(buf) ( *((png_int_32p) (buf))) +#else +extern PNG_EXPORT(png_uint_32,png_get_uint_32) PNGARG((png_bytep buf)); +extern PNG_EXPORT(png_uint_16,png_get_uint_16) PNGARG((png_bytep buf)); +extern PNG_EXPORT(png_int_32,png_get_int_32) PNGARG((png_bytep buf)); +#endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */ +extern PNG_EXPORT(png_uint_32,png_get_uint_31) + PNGARG((png_structp png_ptr, png_bytep buf)); +/* No png_get_int_16 -- may be added if there's a real need for it. */ + +/* Place a 32-bit number into a buffer in PNG byte order (big-endian). + */ +extern PNG_EXPORT(void,png_save_uint_32) + PNGARG((png_bytep buf, png_uint_32 i)); +extern PNG_EXPORT(void,png_save_int_32) + PNGARG((png_bytep buf, png_int_32 i)); + +/* Place a 16-bit number into a buffer in PNG byte order. + * The parameter is declared unsigned int, not png_uint_16, + * just to avoid potential problems on pre-ANSI C compilers. + */ +extern PNG_EXPORT(void,png_save_uint_16) + PNGARG((png_bytep buf, unsigned int i)); +/* No png_save_int_16 -- may be added if there's a real need for it. */ + +/* ************************************************************************* */ + +/* These next functions are used internally in the code. They generally + * shouldn't be used unless you are writing code to add or replace some + * functionality in libpng. More information about most functions can + * be found in the files where the functions are located. + */ + + +/* Various modes of operation, that are visible to applications because + * they are used for unknown chunk location. + */ +#define PNG_HAVE_IHDR 0x01 +#define PNG_HAVE_PLTE 0x02 +#define PNG_HAVE_IDAT 0x04 +#define PNG_AFTER_IDAT 0x08 /* Have complete zlib datastream */ +#define PNG_HAVE_IEND 0x10 + +#if defined(PNG_INTERNAL) + +/* More modes of operation. Note that after an init, mode is set to + * zero automatically when the structure is created. + */ +#define PNG_HAVE_gAMA 0x20 +#define PNG_HAVE_cHRM 0x40 +#define PNG_HAVE_sRGB 0x80 +#define PNG_HAVE_CHUNK_HEADER 0x100 +#define PNG_WROTE_tIME 0x200 +#define PNG_WROTE_INFO_BEFORE_PLTE 0x400 +#define PNG_BACKGROUND_IS_GRAY 0x800 +#define PNG_HAVE_PNG_SIGNATURE 0x1000 +#define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ + +/* Flags for the transformations the PNG library does on the image data */ +#define PNG_BGR 0x0001 +#define PNG_INTERLACE 0x0002 +#define PNG_PACK 0x0004 +#define PNG_SHIFT 0x0008 +#define PNG_SWAP_BYTES 0x0010 +#define PNG_INVERT_MONO 0x0020 +#define PNG_DITHER 0x0040 +#define PNG_BACKGROUND 0x0080 +#define PNG_BACKGROUND_EXPAND 0x0100 + /* 0x0200 unused */ +#define PNG_16_TO_8 0x0400 +#define PNG_RGBA 0x0800 +#define PNG_EXPAND 0x1000 +#define PNG_GAMMA 0x2000 +#define PNG_GRAY_TO_RGB 0x4000 +#define PNG_FILLER 0x8000L +#define PNG_PACKSWAP 0x10000L +#define PNG_SWAP_ALPHA 0x20000L +#define PNG_STRIP_ALPHA 0x40000L +#define PNG_INVERT_ALPHA 0x80000L +#define PNG_USER_TRANSFORM 0x100000L +#define PNG_RGB_TO_GRAY_ERR 0x200000L +#define PNG_RGB_TO_GRAY_WARN 0x400000L +#define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */ + /* 0x800000L Unused */ +#define PNG_ADD_ALPHA 0x1000000L /* Added to libpng-1.2.7 */ +#define PNG_EXPAND_tRNS 0x2000000L /* Added to libpng-1.2.9 */ + /* 0x4000000L unused */ + /* 0x8000000L unused */ + /* 0x10000000L unused */ + /* 0x20000000L unused */ + /* 0x40000000L unused */ + +/* Flags for png_create_struct */ +#define PNG_STRUCT_PNG 0x0001 +#define PNG_STRUCT_INFO 0x0002 + +/* Scaling factor for filter heuristic weighting calculations */ +#define PNG_WEIGHT_SHIFT 8 +#define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) +#define PNG_COST_SHIFT 3 +#define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) + +/* Flags for the png_ptr->flags rather than declaring a byte for each one */ +#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001 +#define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002 +#define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004 +#define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008 +#define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010 +#define PNG_FLAG_ZLIB_FINISHED 0x0020 +#define PNG_FLAG_ROW_INIT 0x0040 +#define PNG_FLAG_FILLER_AFTER 0x0080 +#define PNG_FLAG_CRC_ANCILLARY_USE 0x0100 +#define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200 +#define PNG_FLAG_CRC_CRITICAL_USE 0x0400 +#define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800 +#define PNG_FLAG_FREE_PLTE 0x1000 +#define PNG_FLAG_FREE_TRNS 0x2000 +#define PNG_FLAG_FREE_HIST 0x4000 +#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L +#define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L +#define PNG_FLAG_LIBRARY_MISMATCH 0x20000L +#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L +#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L +#define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L +#define PNG_FLAG_ADD_ALPHA 0x200000L /* Added to libpng-1.2.8 */ +#define PNG_FLAG_STRIP_ALPHA 0x400000L /* Added to libpng-1.2.8 */ + /* 0x800000L unused */ + /* 0x1000000L unused */ + /* 0x2000000L unused */ + /* 0x4000000L unused */ + /* 0x8000000L unused */ + /* 0x10000000L unused */ + /* 0x20000000L unused */ + /* 0x40000000L unused */ + +#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \ + PNG_FLAG_CRC_ANCILLARY_NOWARN) + +#define PNG_FLAG_CRC_CRITICAL_MASK (PNG_FLAG_CRC_CRITICAL_USE | \ + PNG_FLAG_CRC_CRITICAL_IGNORE) + +#define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \ + PNG_FLAG_CRC_CRITICAL_MASK) + +/* Save typing and make code easier to understand */ + +#define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \ + abs((int)((c1).green) - (int)((c2).green)) + \ + abs((int)((c1).blue) - (int)((c2).blue))) + +/* Added to libpng-1.2.6 JB */ +#define PNG_ROWBYTES(pixel_bits, width) \ + ((pixel_bits) >= 8 ? \ + ((width) * (((png_uint_32)(pixel_bits)) >> 3)) : \ + (( ((width) * ((png_uint_32)(pixel_bits))) + 7) >> 3) ) + +/* PNG_OUT_OF_RANGE returns true if value is outside the range + * ideal-delta..ideal+delta. Each argument is evaluated twice. + * "ideal" and "delta" should be constants, normally simple + * integers, "value" a variable. Added to libpng-1.2.6 JB + */ +#define PNG_OUT_OF_RANGE(value, ideal, delta) \ + ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) ) + +/* Variables declared in png.c - only it needs to define PNG_NO_EXTERN */ +#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) +/* Place to hold the signature string for a PNG file. */ +#ifdef PNG_USE_GLOBAL_ARRAYS + PNG_EXPORT_VAR (PNG_CONST png_byte FARDATA) png_sig[8]; +#else +#endif +#endif /* PNG_NO_EXTERN */ + +/* Constant strings for known chunk types. If you need to add a chunk, + * define the name here, and add an invocation of the macro in png.c and + * wherever it's needed. + */ +#define PNG_IHDR png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'} +#define PNG_IDAT png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'} +#define PNG_IEND png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'} +#define PNG_PLTE png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'} +#define PNG_bKGD png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'} +#define PNG_cHRM png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'} +#define PNG_gAMA png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'} +#define PNG_hIST png_byte png_hIST[5] = {104, 73, 83, 84, '\0'} +#define PNG_iCCP png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'} +#define PNG_iTXt png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'} +#define PNG_oFFs png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'} +#define PNG_pCAL png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'} +#define PNG_sCAL png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'} +#define PNG_pHYs png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'} +#define PNG_sBIT png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'} +#define PNG_sPLT png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'} +#define PNG_sRGB png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'} +#define PNG_tEXt png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'} +#define PNG_tIME png_byte png_tIME[5] = {116, 73, 77, 69, '\0'} +#define PNG_tRNS png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'} +#define PNG_zTXt png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'} + +#ifdef PNG_USE_GLOBAL_ARRAYS +PNG_EXPORT_VAR (png_byte FARDATA) png_IHDR[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_IDAT[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_IEND[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_PLTE[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_bKGD[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_cHRM[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_gAMA[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_hIST[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_iCCP[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_iTXt[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_oFFs[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_pCAL[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_sCAL[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_pHYs[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_sBIT[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_sPLT[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_sRGB[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_tEXt[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_tIME[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_tRNS[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_zTXt[5]; +#endif /* PNG_USE_GLOBAL_ARRAYS */ + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Initialize png_ptr struct for reading, and allocate any other memory. + * (old interface - DEPRECATED - use png_create_read_struct instead). + */ +extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr)); +#undef png_read_init +#define png_read_init(png_ptr) png_read_init_3(&png_ptr, \ + PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); +#endif + +extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr, + png_const_charp user_png_ver, png_size_t png_struct_size)); +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr, + png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t + png_info_size)); +#endif + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Initialize png_ptr struct for writing, and allocate any other memory. + * (old interface - DEPRECATED - use png_create_write_struct instead). + */ +extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr)); +#undef png_write_init +#define png_write_init(png_ptr) png_write_init_3(&png_ptr, \ + PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); +#endif + +extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr, + png_const_charp user_png_ver, png_size_t png_struct_size)); +extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr, + png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t + png_info_size)); + +/* Allocate memory for an internal libpng struct */ +PNG_EXTERN png_voidp png_create_struct PNGARG((int type)); + +/* Free memory from internal libpng struct */ +PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr)); + +PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr + malloc_fn, png_voidp mem_ptr)); +PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr, + png_free_ptr free_fn, png_voidp mem_ptr)); + +/* Free any memory that info_ptr points to and reset struct. */ +PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +#ifndef PNG_1_0_X +/* Function to allocate memory for zlib. */ +PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size)); + +/* Function to free memory for zlib */ +PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr)); + +#ifdef PNG_SIZE_T +/* Function to convert a sizeof an item to png_sizeof item */ + PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); +#endif + +/* Next four functions are used internally as callbacks. PNGAPI is required + * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3. + */ + +PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr, + png_bytep data, png_size_t length)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +PNG_EXTERN void PNGAPI png_push_fill_buffer PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t length)); +#endif + +PNG_EXTERN void PNGAPI png_default_write_data PNGARG((png_structp png_ptr, + png_bytep data, png_size_t length)); + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) +#if !defined(PNG_NO_STDIO) +PNG_EXTERN void PNGAPI png_default_flush PNGARG((png_structp png_ptr)); +#endif +#endif +#else /* PNG_1_0_X */ +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t length)); +#endif +#endif /* PNG_1_0_X */ + +/* Reset the CRC variable */ +PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr)); + +/* Write the "data" buffer to whatever output you are using. */ +PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data, + png_size_t length)); + +/* Read data from whatever input you are using into the "data" buffer */ +PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data, + png_size_t length)); + +/* Read bytes into buf, and update png_ptr->crc */ +PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf, + png_size_t length)); + +/* Decompress data in a chunk that uses compression */ +#if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \ + defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) +PNG_EXTERN void png_decompress_chunk PNGARG((png_structp png_ptr, + int comp_type, png_size_t chunklength, + png_size_t prefix_length, png_size_t *data_length)); +#endif + +/* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */ +PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip)); + +/* Read the CRC from the file and compare it to the libpng calculated CRC */ +PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr)); + +/* Calculate the CRC over a section of data. Note that we are only + * passing a maximum of 64K on systems that have this as a memory limit, + * since this is the maximum buffer size we can specify. + */ +PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr, + png_size_t length)); + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) +PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); +#endif + +/* Simple function to write the signature */ +PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr)); + +/* Write various chunks */ + +/* Write the IHDR chunk, and update the png_struct with the necessary + * information. + */ +PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width, + png_uint_32 height, + int bit_depth, int color_type, int compression_method, int filter_method, + int interlace_method)); + +PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette, + png_uint_32 num_pal)); + +PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data, + png_size_t length)); + +PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); + +#if defined(PNG_WRITE_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma)); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point + file_gamma)); +#endif +#endif + +#if defined(PNG_WRITE_sBIT_SUPPORTED) +PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit, + int color_type)); +#endif + +#if defined(PNG_WRITE_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr, + double white_x, double white_y, + double red_x, double red_y, double green_x, double green_y, + double blue_x, double blue_y)); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr, + png_fixed_point int_white_x, png_fixed_point int_white_y, + png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point + int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); +#endif +#endif + +#if defined(PNG_WRITE_sRGB_SUPPORTED) +PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr, + int intent)); +#endif + +#if defined(PNG_WRITE_iCCP_SUPPORTED) +PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr, + png_charp name, int compression_type, + png_charp profile, int proflen)); + /* Note to maintainer: profile should be png_bytep */ +#endif + +#if defined(PNG_WRITE_sPLT_SUPPORTED) +PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr, + png_sPLT_tp palette)); +#endif + +#if defined(PNG_WRITE_tRNS_SUPPORTED) +PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans, + png_color_16p values, int number, int color_type)); +#endif + +#if defined(PNG_WRITE_bKGD_SUPPORTED) +PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr, + png_color_16p values, int color_type)); +#endif + +#if defined(PNG_WRITE_hIST_SUPPORTED) +PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist, + int num_hist)); +#endif + +#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ + defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) +PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr, + png_charp key, png_charpp new_key)); +#endif + +#if defined(PNG_WRITE_tEXt_SUPPORTED) +PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key, + png_charp text, png_size_t text_len)); +#endif + +#if defined(PNG_WRITE_zTXt_SUPPORTED) +PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key, + png_charp text, png_size_t text_len, int compression)); +#endif + +#if defined(PNG_WRITE_iTXt_SUPPORTED) +PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr, + int compression, png_charp key, png_charp lang, png_charp lang_key, + png_charp text)); +#endif + +#if defined(PNG_TEXT_SUPPORTED) /* Added at version 1.0.14 and 1.2.4 */ +PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr, + png_infop info_ptr, png_textp text_ptr, int num_text)); +#endif + +#if defined(PNG_WRITE_oFFs_SUPPORTED) +PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr, + png_int_32 x_offset, png_int_32 y_offset, int unit_type)); +#endif + +#if defined(PNG_WRITE_pCAL_SUPPORTED) +PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose, + png_int_32 X0, png_int_32 X1, int type, int nparams, + png_charp units, png_charpp params)); +#endif + +#if defined(PNG_WRITE_pHYs_SUPPORTED) +PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr, + png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, + int unit_type)); +#endif + +#if defined(PNG_WRITE_tIME_SUPPORTED) +PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr, + png_timep mod_time)); +#endif + +#if defined(PNG_WRITE_sCAL_SUPPORTED) +#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) +PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr, + int unit, double width, double height)); +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr, + int unit, png_charp width, png_charp height)); +#endif +#endif +#endif + +/* Called when finished processing a row of data */ +PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); + +/* Internal use only. Called before first row of data */ +PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr)); + +#if defined(PNG_READ_GAMMA_SUPPORTED) +PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr)); +#endif + +/* Combine a row of data, dealing with alpha, etc. if requested */ +PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row, + int mask)); + +#if defined(PNG_READ_INTERLACING_SUPPORTED) +/* Expand an interlaced row */ +/* OLD pre-1.0.9 interface: +PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info, + png_bytep row, int pass, png_uint_32 transformations)); + */ +PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr)); +#endif + +/* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */ + +#if defined(PNG_WRITE_INTERLACING_SUPPORTED) +/* Grab pixels out of a row for an interlaced pass */ +PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info, + png_bytep row, int pass)); +#endif + +/* Unfilter a row */ +PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr, + png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter)); + +/* Choose the best filter to use and filter the row data */ +PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr, + png_row_infop row_info)); + +/* Write out the filtered row. */ +PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr, + png_bytep filtered_row)); +/* Finish a row while reading, dealing with interlacing passes, etc. */ +PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr)); + +/* Initialize the row buffers, etc. */ +PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr)); +/* Optional call to update the users info structure */ +PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +/* These are the functions that do the transformations */ +#if defined(PNG_READ_FILLER_SUPPORTED) +PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, + png_bytep row, png_uint_32 filler, png_uint_32 flags)); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ + defined(PNG_READ_STRIP_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info, + png_bytep row, png_uint_32 flags)); +#endif + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) +PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) +PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop + row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) +PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) +PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) +PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row, + png_color_8p sig_bits)); +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) +PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) +PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info, + png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup)); + +# if defined(PNG_CORRECT_PALETTE_SUPPORTED) +PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr, + png_colorp palette, int num_palette)); +# endif +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_WRITE_PACK_SUPPORTED) +PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info, + png_bytep row, png_uint_32 bit_depth)); +#endif + +#if defined(PNG_WRITE_SHIFT_SUPPORTED) +PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row, + png_color_8p bit_depth)); +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) +#if defined(PNG_READ_GAMMA_SUPPORTED) +PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, + png_color_16p trans_values, png_color_16p background, + png_color_16p background_1, + png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, + png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, + png_uint_16pp gamma_16_to_1, int gamma_shift)); +#else +PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, + png_color_16p trans_values, png_color_16p background)); +#endif +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) +PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row, + png_bytep gamma_table, png_uint_16pp gamma_16_table, + int gamma_shift)); +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) +PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info, + png_bytep row, png_colorp palette, png_bytep trans, int num_trans)); +PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info, + png_bytep row, png_color_16p trans_value)); +#endif + +/* The following decodes the appropriate chunks, and does error correction, + * then calls the appropriate callback for the chunk if it is valid. + */ + +/* Decode the IHDR chunk */ +PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); + +#if defined(PNG_READ_bKGD_SUPPORTED) +PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_cHRM_SUPPORTED) +PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_gAMA_SUPPORTED) +PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_hIST_SUPPORTED) +PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_iCCP_SUPPORTED) +extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif /* PNG_READ_iCCP_SUPPORTED */ + +#if defined(PNG_READ_iTXt_SUPPORTED) +PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_oFFs_SUPPORTED) +PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_pCAL_SUPPORTED) +PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_pHYs_SUPPORTED) +PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_sBIT_SUPPORTED) +PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_sCAL_SUPPORTED) +PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_sPLT_SUPPORTED) +extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif /* PNG_READ_sPLT_SUPPORTED */ + +#if defined(PNG_READ_sRGB_SUPPORTED) +PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_tEXt_SUPPORTED) +PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_tIME_SUPPORTED) +PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_tRNS_SUPPORTED) +PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_zTXt_SUPPORTED) +PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); + +PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, + png_bytep chunk_name)); + +/* Handle the transformations for reading and writing */ +PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr)); + +PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr, + png_uint_32 length)); +PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t buffer_length)); +PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t buffer_length)); +PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row)); +PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr)); +#if defined(PNG_READ_tEXt_SUPPORTED) +PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) +PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) +PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif + +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +#ifdef PNG_MNG_FEATURES_SUPPORTED +PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info, + png_bytep row)); +PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) +#if defined(PNG_MMX_CODE_SUPPORTED) +/* png.c */ /* PRIVATE */ +PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr)); +#endif +#endif + +#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) +PNG_EXTERN png_uint_32 png_get_pixels_per_inch PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +PNG_EXTERN png_uint_32 png_get_x_pixels_per_inch PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +PNG_EXTERN png_uint_32 png_get_y_pixels_per_inch PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +PNG_EXTERN float png_get_x_offset_inches PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +PNG_EXTERN float png_get_y_offset_inches PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +#if defined(PNG_pHYs_SUPPORTED) +PNG_EXTERN png_uint_32 png_get_pHYs_dpi PNGARG((png_structp png_ptr, +png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); +#endif /* PNG_pHYs_SUPPORTED */ +#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ + +/* Read the chunk header (length + type name) */ +PNG_EXTERN png_uint_32 png_read_chunk_header PNGARG((png_structp png_ptr)); + +/* Added at libpng version 1.2.34 */ +#if defined(PNG_cHRM_SUPPORTED) +PNG_EXTERN int png_check_cHRM_fixed PNGARG((png_structp png_ptr, + png_fixed_point int_white_x, png_fixed_point int_white_y, + png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point + int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); +#endif + +#if defined(PNG_cHRM_SUPPORTED) +#if !defined(PNG_NO_CHECK_cHRM) +/* Added at libpng version 1.2.34 */ +PNG_EXTERN void png_64bit_product (long v1, long v2, unsigned long *hi_product, + unsigned long *lo_product); +#endif +#endif + +/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ + +#endif /* PNG_INTERNAL */ + +#ifdef __cplusplus +} +#endif + +#endif /* PNG_VERSION_INFO_ONLY */ +/* Do not put anything past this line */ +#endif /* PNG_H */ diff --git a/third_party/windows/fltk-1.1.10/png/pngconf.h b/third_party/windows/fltk-1.1.10/png/pngconf.h new file mode 100644 index 0000000..6a74003 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngconf.h @@ -0,0 +1,1508 @@ + +/* pngconf.h - machine configurable file for libpng + * + * libpng version 1.2.40 - September 10, 2009 + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +/* Any machine specific code is near the front of this file, so if you + * are configuring libpng for a machine, you may want to read the section + * starting here down to where it starts to typedef png_color, png_text, + * and png_info. + */ + +#ifndef PNGCONF_H +#define PNGCONF_H + +#define PNG_1_2_X + +/* + * PNG_USER_CONFIG has to be defined on the compiler command line. This + * includes the resource compiler for Windows DLL configurations. + */ +#ifdef PNG_USER_CONFIG +# ifndef PNG_USER_PRIVATEBUILD +# define PNG_USER_PRIVATEBUILD +# endif +#include "pngusr.h" +#endif + +/* PNG_CONFIGURE_LIBPNG is set by the "configure" script. */ +#ifdef PNG_CONFIGURE_LIBPNG +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#endif + +/* + * Added at libpng-1.2.8 + * + * If you create a private DLL you need to define in "pngusr.h" the followings: + * #define PNG_USER_PRIVATEBUILD + * e.g. #define PNG_USER_PRIVATEBUILD "Build by MyCompany for xyz reasons." + * #define PNG_USER_DLLFNAME_POSTFIX + * e.g. // private DLL "libpng13gx.dll" + * #define PNG_USER_DLLFNAME_POSTFIX "gx" + * + * The following macros are also at your disposal if you want to complete the + * DLL VERSIONINFO structure. + * - PNG_USER_VERSIONINFO_COMMENTS + * - PNG_USER_VERSIONINFO_COMPANYNAME + * - PNG_USER_VERSIONINFO_LEGALTRADEMARKS + */ + +#ifdef __STDC__ +#ifdef SPECIALBUILD +# pragma message("PNG_LIBPNG_SPECIALBUILD (and deprecated SPECIALBUILD)\ + are now LIBPNG reserved macros. Use PNG_USER_PRIVATEBUILD instead.") +#endif + +#ifdef PRIVATEBUILD +# pragma message("PRIVATEBUILD is deprecated.\ + Use PNG_USER_PRIVATEBUILD instead.") +# define PNG_USER_PRIVATEBUILD PRIVATEBUILD +#endif +#endif /* __STDC__ */ + +#ifndef PNG_VERSION_INFO_ONLY + +/* End of material added to libpng-1.2.8 */ + +/* Added at libpng-1.2.19, removed at libpng-1.2.20 because it caused trouble + Restored at libpng-1.2.21 */ +#if !defined(PNG_NO_WARN_UNINITIALIZED_ROW) && \ + !defined(PNG_WARN_UNINITIALIZED_ROW) +# define PNG_WARN_UNINITIALIZED_ROW 1 +#endif +/* End of material added at libpng-1.2.19/1.2.21 */ + +/* This is the size of the compression buffer, and thus the size of + * an IDAT chunk. Make this whatever size you feel is best for your + * machine. One of these will be allocated per png_struct. When this + * is full, it writes the data to the disk, and does some other + * calculations. Making this an extremely small size will slow + * the library down, but you may want to experiment to determine + * where it becomes significant, if you are concerned with memory + * usage. Note that zlib allocates at least 32Kb also. For readers, + * this describes the size of the buffer available to read the data in. + * Unless this gets smaller than the size of a row (compressed), + * it should not make much difference how big this is. + */ + +#ifndef PNG_ZBUF_SIZE +# define PNG_ZBUF_SIZE 8192 +#endif + +/* Enable if you want a write-only libpng */ + +#ifndef PNG_NO_READ_SUPPORTED +# define PNG_READ_SUPPORTED +#endif + +/* Enable if you want a read-only libpng */ + +#ifndef PNG_NO_WRITE_SUPPORTED +# define PNG_WRITE_SUPPORTED +#endif + +/* Enabled by default in 1.2.0. You can disable this if you don't need to + support PNGs that are embedded in MNG datastreams */ +#if !defined(PNG_1_0_X) && !defined(PNG_NO_MNG_FEATURES) +# ifndef PNG_MNG_FEATURES_SUPPORTED +# define PNG_MNG_FEATURES_SUPPORTED +# endif +#endif + +#ifndef PNG_NO_FLOATING_POINT_SUPPORTED +# ifndef PNG_FLOATING_POINT_SUPPORTED +# define PNG_FLOATING_POINT_SUPPORTED +# endif +#endif + +/* If you are running on a machine where you cannot allocate more + * than 64K of memory at once, uncomment this. While libpng will not + * normally need that much memory in a chunk (unless you load up a very + * large file), zlib needs to know how big of a chunk it can use, and + * libpng thus makes sure to check any memory allocation to verify it + * will fit into memory. +#define PNG_MAX_MALLOC_64K + */ +#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) +# define PNG_MAX_MALLOC_64K +#endif + +/* Special munging to support doing things the 'cygwin' way: + * 'Normal' png-on-win32 defines/defaults: + * PNG_BUILD_DLL -- building dll + * PNG_USE_DLL -- building an application, linking to dll + * (no define) -- building static library, or building an + * application and linking to the static lib + * 'Cygwin' defines/defaults: + * PNG_BUILD_DLL -- (ignored) building the dll + * (no define) -- (ignored) building an application, linking to the dll + * PNG_STATIC -- (ignored) building the static lib, or building an + * application that links to the static lib. + * ALL_STATIC -- (ignored) building various static libs, or building an + * application that links to the static libs. + * Thus, + * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and + * this bit of #ifdefs will define the 'correct' config variables based on + * that. If a cygwin user *wants* to define 'PNG_USE_DLL' that's okay, but + * unnecessary. + * + * Also, the precedence order is: + * ALL_STATIC (since we can't #undef something outside our namespace) + * PNG_BUILD_DLL + * PNG_STATIC + * (nothing) == PNG_USE_DLL + * + * CYGWIN (2002-01-20): The preceding is now obsolete. With the advent + * of auto-import in binutils, we no longer need to worry about + * __declspec(dllexport) / __declspec(dllimport) and friends. Therefore, + * we don't need to worry about PNG_STATIC or ALL_STATIC when it comes + * to __declspec() stuff. However, we DO need to worry about + * PNG_BUILD_DLL and PNG_STATIC because those change some defaults + * such as CONSOLE_IO and whether GLOBAL_ARRAYS are allowed. + */ +#if defined(__CYGWIN__) +# if defined(ALL_STATIC) +# if defined(PNG_BUILD_DLL) +# undef PNG_BUILD_DLL +# endif +# if defined(PNG_USE_DLL) +# undef PNG_USE_DLL +# endif +# if defined(PNG_DLL) +# undef PNG_DLL +# endif +# if !defined(PNG_STATIC) +# define PNG_STATIC +# endif +# else +# if defined (PNG_BUILD_DLL) +# if defined(PNG_STATIC) +# undef PNG_STATIC +# endif +# if defined(PNG_USE_DLL) +# undef PNG_USE_DLL +# endif +# if !defined(PNG_DLL) +# define PNG_DLL +# endif +# else +# if defined(PNG_STATIC) +# if defined(PNG_USE_DLL) +# undef PNG_USE_DLL +# endif +# if defined(PNG_DLL) +# undef PNG_DLL +# endif +# else +# if !defined(PNG_USE_DLL) +# define PNG_USE_DLL +# endif +# if !defined(PNG_DLL) +# define PNG_DLL +# endif +# endif +# endif +# endif +#endif + +/* This protects us against compilers that run on a windowing system + * and thus don't have or would rather us not use the stdio types: + * stdin, stdout, and stderr. The only one currently used is stderr + * in png_error() and png_warning(). #defining PNG_NO_CONSOLE_IO will + * prevent these from being compiled and used. #defining PNG_NO_STDIO + * will also prevent these, plus will prevent the entire set of stdio + * macros and functions (FILE *, printf, etc.) from being compiled and used, + * unless (PNG_DEBUG > 0) has been #defined. + * + * #define PNG_NO_CONSOLE_IO + * #define PNG_NO_STDIO + */ + +#if defined(_WIN32_WCE) +# include + /* Console I/O functions are not supported on WindowsCE */ +# define PNG_NO_CONSOLE_IO + /* abort() may not be supported on some/all Windows CE platforms */ +# define PNG_ABORT() exit(-1) +# ifdef PNG_DEBUG +# undef PNG_DEBUG +# endif +#endif + +#ifdef PNG_BUILD_DLL +# ifndef PNG_CONSOLE_IO_SUPPORTED +# ifndef PNG_NO_CONSOLE_IO +# define PNG_NO_CONSOLE_IO +# endif +# endif +#endif + +# ifdef PNG_NO_STDIO +# ifndef PNG_NO_CONSOLE_IO +# define PNG_NO_CONSOLE_IO +# endif +# ifdef PNG_DEBUG +# if (PNG_DEBUG > 0) +# include +# endif +# endif +# else +# if !defined(_WIN32_WCE) +/* "stdio.h" functions are not supported on WindowsCE */ +# include +# endif +# endif + +/* This macro protects us against machines that don't have function + * prototypes (ie K&R style headers). If your compiler does not handle + * function prototypes, define this macro and use the included ansi2knr. + * I've always been able to use _NO_PROTO as the indicator, but you may + * need to drag the empty declaration out in front of here, or change the + * ifdef to suit your own needs. + */ +#ifndef PNGARG + +#ifdef OF /* zlib prototype munger */ +# define PNGARG(arglist) OF(arglist) +#else + +#ifdef _NO_PROTO +# define PNGARG(arglist) () +# ifndef PNG_TYPECAST_NULL +# define PNG_TYPECAST_NULL +# endif +#else +# define PNGARG(arglist) arglist +#endif /* _NO_PROTO */ + + +#endif /* OF */ + +#endif /* PNGARG */ + +/* Try to determine if we are compiling on a Mac. Note that testing for + * just __MWERKS__ is not good enough, because the Codewarrior is now used + * on non-Mac platforms. + */ +#ifndef MACOS +# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ + defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) +# define MACOS +# endif +#endif + +/* enough people need this for various reasons to include it here */ +#if !defined(MACOS) && !defined(RISCOS) && !defined(_WIN32_WCE) +# include +#endif + +#if !defined(PNG_SETJMP_NOT_SUPPORTED) && !defined(PNG_NO_SETJMP_SUPPORTED) +# define PNG_SETJMP_SUPPORTED +#endif + +#ifdef PNG_SETJMP_SUPPORTED +/* This is an attempt to force a single setjmp behaviour on Linux. If + * the X config stuff didn't define _BSD_SOURCE we wouldn't need this. + * + * You can bypass this test if you know that your application uses exactly + * the same setjmp.h that was included when libpng was built. Only define + * PNG_SKIP_SETJMP_CHECK while building your application, prior to the + * application's '#include "png.h"'. Don't define PNG_SKIP_SETJMP_CHECK + * while building a separate libpng library for general use. + */ + +# ifndef PNG_SKIP_SETJMP_CHECK +# ifdef __linux__ +# ifdef _BSD_SOURCE +# define PNG_SAVE_BSD_SOURCE +# undef _BSD_SOURCE +# endif +# ifdef _SETJMP_H + /* If you encounter a compiler error here, see the explanation + * near the end of INSTALL. + */ + __pngconf.h__ in libpng already includes setjmp.h; + __dont__ include it again.; +# endif +# endif /* __linux__ */ +# endif /* PNG_SKIP_SETJMP_CHECK */ + + /* include setjmp.h for error handling */ +# include + +# ifdef __linux__ +# ifdef PNG_SAVE_BSD_SOURCE +# ifndef _BSD_SOURCE +# define _BSD_SOURCE +# endif +# undef PNG_SAVE_BSD_SOURCE +# endif +# endif /* __linux__ */ +#endif /* PNG_SETJMP_SUPPORTED */ + +#ifdef BSD +# include +#else +# include +#endif + +/* Other defines for things like memory and the like can go here. */ +#ifdef PNG_INTERNAL + +#include + +/* The functions exported by PNG_EXTERN are PNG_INTERNAL functions, which + * aren't usually used outside the library (as far as I know), so it is + * debatable if they should be exported at all. In the future, when it is + * possible to have run-time registry of chunk-handling functions, some of + * these will be made available again. +#define PNG_EXTERN extern + */ +#define PNG_EXTERN + +/* Other defines specific to compilers can go here. Try to keep + * them inside an appropriate ifdef/endif pair for portability. + */ + +#if defined(PNG_FLOATING_POINT_SUPPORTED) +# if defined(MACOS) + /* We need to check that hasn't already been included earlier + * as it seems it doesn't agree with , yet we should really use + * if possible. + */ +# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) +# include +# endif +# else +# include +# endif +# if defined(_AMIGA) && defined(__SASC) && defined(_M68881) + /* Amiga SAS/C: We must include builtin FPU functions when compiling using + * MATH=68881 + */ +# include +# endif +#endif + +/* Codewarrior on NT has linking problems without this. */ +#if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__) +# define PNG_ALWAYS_EXTERN +#endif + +/* This provides the non-ANSI (far) memory allocation routines. */ +#if defined(__TURBOC__) && defined(__MSDOS__) +# include +# include +#endif + +/* I have no idea why is this necessary... */ +#if defined(_MSC_VER) && (defined(WIN32) || defined(_Windows) || \ + defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__)) +# include +#endif + +/* This controls how fine the dithering gets. As this allocates + * a largish chunk of memory (32K), those who are not as concerned + * with dithering quality can decrease some or all of these. + */ +#ifndef PNG_DITHER_RED_BITS +# define PNG_DITHER_RED_BITS 5 +#endif +#ifndef PNG_DITHER_GREEN_BITS +# define PNG_DITHER_GREEN_BITS 5 +#endif +#ifndef PNG_DITHER_BLUE_BITS +# define PNG_DITHER_BLUE_BITS 5 +#endif + +/* This controls how fine the gamma correction becomes when you + * are only interested in 8 bits anyway. Increasing this value + * results in more memory being used, and more pow() functions + * being called to fill in the gamma tables. Don't set this value + * less then 8, and even that may not work (I haven't tested it). + */ + +#ifndef PNG_MAX_GAMMA_8 +# define PNG_MAX_GAMMA_8 11 +#endif + +/* This controls how much a difference in gamma we can tolerate before + * we actually start doing gamma conversion. + */ +#ifndef PNG_GAMMA_THRESHOLD +# define PNG_GAMMA_THRESHOLD 0.05 +#endif + +#endif /* PNG_INTERNAL */ + +/* The following uses const char * instead of char * for error + * and warning message functions, so some compilers won't complain. + * If you do not want to use const, define PNG_NO_CONST here. + */ + +#ifndef PNG_NO_CONST +# define PNG_CONST const +#else +# define PNG_CONST +#endif + +/* The following defines give you the ability to remove code from the + * library that you will not be using. I wish I could figure out how to + * automate this, but I can't do that without making it seriously hard + * on the users. So if you are not using an ability, change the #define + * to and #undef, and that part of the library will not be compiled. If + * your linker can't find a function, you may want to make sure the + * ability is defined here. Some of these depend upon some others being + * defined. I haven't figured out all the interactions here, so you may + * have to experiment awhile to get everything to compile. If you are + * creating or using a shared library, you probably shouldn't touch this, + * as it will affect the size of the structures, and this will cause bad + * things to happen if the library and/or application ever change. + */ + +/* Any features you will not be using can be undef'ed here */ + +/* GR-P, 0.96a: Set "*TRANSFORMS_SUPPORTED as default but allow user + * to turn it off with "*TRANSFORMS_NOT_SUPPORTED" or *PNG_NO_*_TRANSFORMS + * on the compile line, then pick and choose which ones to define without + * having to edit this file. It is safe to use the *TRANSFORMS_NOT_SUPPORTED + * if you only want to have a png-compliant reader/writer but don't need + * any of the extra transformations. This saves about 80 kbytes in a + * typical installation of the library. (PNG_NO_* form added in version + * 1.0.1c, for consistency) + */ + +/* The size of the png_text structure changed in libpng-1.0.6 when + * iTXt support was added. iTXt support was turned off by default through + * libpng-1.2.x, to support old apps that malloc the png_text structure + * instead of calling png_set_text() and letting libpng malloc it. It + * will be turned on by default in libpng-1.4.0. + */ + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +# ifndef PNG_NO_iTXt_SUPPORTED +# define PNG_NO_iTXt_SUPPORTED +# endif +# ifndef PNG_NO_READ_iTXt +# define PNG_NO_READ_iTXt +# endif +# ifndef PNG_NO_WRITE_iTXt +# define PNG_NO_WRITE_iTXt +# endif +#endif + +#if !defined(PNG_NO_iTXt_SUPPORTED) +# if !defined(PNG_READ_iTXt_SUPPORTED) && !defined(PNG_NO_READ_iTXt) +# define PNG_READ_iTXt +# endif +# if !defined(PNG_WRITE_iTXt_SUPPORTED) && !defined(PNG_NO_WRITE_iTXt) +# define PNG_WRITE_iTXt +# endif +#endif + +/* The following support, added after version 1.0.0, can be turned off here en + * masse by defining PNG_LEGACY_SUPPORTED in case you need binary compatibility + * with old applications that require the length of png_struct and png_info + * to remain unchanged. + */ + +#ifdef PNG_LEGACY_SUPPORTED +# define PNG_NO_FREE_ME +# define PNG_NO_READ_UNKNOWN_CHUNKS +# define PNG_NO_WRITE_UNKNOWN_CHUNKS +# define PNG_NO_HANDLE_AS_UNKNOWN +# define PNG_NO_READ_USER_CHUNKS +# define PNG_NO_READ_iCCP +# define PNG_NO_WRITE_iCCP +# define PNG_NO_READ_iTXt +# define PNG_NO_WRITE_iTXt +# define PNG_NO_READ_sCAL +# define PNG_NO_WRITE_sCAL +# define PNG_NO_READ_sPLT +# define PNG_NO_WRITE_sPLT +# define PNG_NO_INFO_IMAGE +# define PNG_NO_READ_RGB_TO_GRAY +# define PNG_NO_READ_USER_TRANSFORM +# define PNG_NO_WRITE_USER_TRANSFORM +# define PNG_NO_USER_MEM +# define PNG_NO_READ_EMPTY_PLTE +# define PNG_NO_MNG_FEATURES +# define PNG_NO_FIXED_POINT_SUPPORTED +#endif + +/* Ignore attempt to turn off both floating and fixed point support */ +#if !defined(PNG_FLOATING_POINT_SUPPORTED) || \ + !defined(PNG_NO_FIXED_POINT_SUPPORTED) +# define PNG_FIXED_POINT_SUPPORTED +#endif + +#ifndef PNG_NO_FREE_ME +# define PNG_FREE_ME_SUPPORTED +#endif + +#ifdef PNG_READ_SUPPORTED + +#if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \ + !defined(PNG_NO_READ_TRANSFORMS) +# define PNG_READ_TRANSFORMS_SUPPORTED +#endif + +#ifdef PNG_READ_TRANSFORMS_SUPPORTED +# ifndef PNG_NO_READ_EXPAND +# define PNG_READ_EXPAND_SUPPORTED +# endif +# ifndef PNG_NO_READ_SHIFT +# define PNG_READ_SHIFT_SUPPORTED +# endif +# ifndef PNG_NO_READ_PACK +# define PNG_READ_PACK_SUPPORTED +# endif +# ifndef PNG_NO_READ_BGR +# define PNG_READ_BGR_SUPPORTED +# endif +# ifndef PNG_NO_READ_SWAP +# define PNG_READ_SWAP_SUPPORTED +# endif +# ifndef PNG_NO_READ_PACKSWAP +# define PNG_READ_PACKSWAP_SUPPORTED +# endif +# ifndef PNG_NO_READ_INVERT +# define PNG_READ_INVERT_SUPPORTED +# endif +# ifndef PNG_NO_READ_DITHER +# define PNG_READ_DITHER_SUPPORTED +# endif +# ifndef PNG_NO_READ_BACKGROUND +# define PNG_READ_BACKGROUND_SUPPORTED +# endif +# ifndef PNG_NO_READ_16_TO_8 +# define PNG_READ_16_TO_8_SUPPORTED +# endif +# ifndef PNG_NO_READ_FILLER +# define PNG_READ_FILLER_SUPPORTED +# endif +# ifndef PNG_NO_READ_GAMMA +# define PNG_READ_GAMMA_SUPPORTED +# endif +# ifndef PNG_NO_READ_GRAY_TO_RGB +# define PNG_READ_GRAY_TO_RGB_SUPPORTED +# endif +# ifndef PNG_NO_READ_SWAP_ALPHA +# define PNG_READ_SWAP_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_READ_INVERT_ALPHA +# define PNG_READ_INVERT_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_READ_STRIP_ALPHA +# define PNG_READ_STRIP_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_READ_USER_TRANSFORM +# define PNG_READ_USER_TRANSFORM_SUPPORTED +# endif +# ifndef PNG_NO_READ_RGB_TO_GRAY +# define PNG_READ_RGB_TO_GRAY_SUPPORTED +# endif +#endif /* PNG_READ_TRANSFORMS_SUPPORTED */ + +#if !defined(PNG_NO_PROGRESSIVE_READ) && \ + !defined(PNG_PROGRESSIVE_READ_SUPPORTED) /* if you don't do progressive */ +# define PNG_PROGRESSIVE_READ_SUPPORTED /* reading. This is not talking */ +#endif /* about interlacing capability! You'll */ + /* still have interlacing unless you change the following line: */ + +#define PNG_READ_INTERLACING_SUPPORTED /* required in PNG-compliant decoders */ + +#ifndef PNG_NO_READ_COMPOSITE_NODIV +# ifndef PNG_NO_READ_COMPOSITED_NODIV /* libpng-1.0.x misspelling */ +# define PNG_READ_COMPOSITE_NODIV_SUPPORTED /* well tested on Intel, SGI */ +# endif +#endif + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Deprecated, will be removed from version 2.0.0. + Use PNG_MNG_FEATURES_SUPPORTED instead. */ +#ifndef PNG_NO_READ_EMPTY_PLTE +# define PNG_READ_EMPTY_PLTE_SUPPORTED +#endif +#endif + +#endif /* PNG_READ_SUPPORTED */ + +#ifdef PNG_WRITE_SUPPORTED + +# if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \ + !defined(PNG_NO_WRITE_TRANSFORMS) +# define PNG_WRITE_TRANSFORMS_SUPPORTED +#endif + +#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED +# ifndef PNG_NO_WRITE_SHIFT +# define PNG_WRITE_SHIFT_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_PACK +# define PNG_WRITE_PACK_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_BGR +# define PNG_WRITE_BGR_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_SWAP +# define PNG_WRITE_SWAP_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_PACKSWAP +# define PNG_WRITE_PACKSWAP_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_INVERT +# define PNG_WRITE_INVERT_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_FILLER +# define PNG_WRITE_FILLER_SUPPORTED /* same as WRITE_STRIP_ALPHA */ +# endif +# ifndef PNG_NO_WRITE_SWAP_ALPHA +# define PNG_WRITE_SWAP_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_INVERT_ALPHA +# define PNG_WRITE_INVERT_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_USER_TRANSFORM +# define PNG_WRITE_USER_TRANSFORM_SUPPORTED +# endif +#endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */ + +#if !defined(PNG_NO_WRITE_INTERLACING_SUPPORTED) && \ + !defined(PNG_WRITE_INTERLACING_SUPPORTED) +#define PNG_WRITE_INTERLACING_SUPPORTED /* not required for PNG-compliant + encoders, but can cause trouble + if left undefined */ +#endif + +#if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \ + !defined(PNG_WRITE_WEIGHTED_FILTER) && \ + defined(PNG_FLOATING_POINT_SUPPORTED) +# define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED +#endif + +#ifndef PNG_NO_WRITE_FLUSH +# define PNG_WRITE_FLUSH_SUPPORTED +#endif + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Deprecated, see PNG_MNG_FEATURES_SUPPORTED, above */ +#ifndef PNG_NO_WRITE_EMPTY_PLTE +# define PNG_WRITE_EMPTY_PLTE_SUPPORTED +#endif +#endif + +#endif /* PNG_WRITE_SUPPORTED */ + +#ifndef PNG_1_0_X +# ifndef PNG_NO_ERROR_NUMBERS +# define PNG_ERROR_NUMBERS_SUPPORTED +# endif +#endif /* PNG_1_0_X */ + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +# ifndef PNG_NO_USER_TRANSFORM_PTR +# define PNG_USER_TRANSFORM_PTR_SUPPORTED +# endif +#endif + +#ifndef PNG_NO_STDIO +# define PNG_TIME_RFC1123_SUPPORTED +#endif + +/* This adds extra functions in pngget.c for accessing data from the + * info pointer (added in version 0.99) + * png_get_image_width() + * png_get_image_height() + * png_get_bit_depth() + * png_get_color_type() + * png_get_compression_type() + * png_get_filter_type() + * png_get_interlace_type() + * png_get_pixel_aspect_ratio() + * png_get_pixels_per_meter() + * png_get_x_offset_pixels() + * png_get_y_offset_pixels() + * png_get_x_offset_microns() + * png_get_y_offset_microns() + */ +#if !defined(PNG_NO_EASY_ACCESS) && !defined(PNG_EASY_ACCESS_SUPPORTED) +# define PNG_EASY_ACCESS_SUPPORTED +#endif + +/* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0 + * and removed from version 1.2.20. The following will be removed + * from libpng-1.4.0 +*/ + +#if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_OPTIMIZED_CODE) +# ifndef PNG_OPTIMIZED_CODE_SUPPORTED +# define PNG_OPTIMIZED_CODE_SUPPORTED +# endif +#endif + +#if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_ASSEMBLER_CODE) +# ifndef PNG_ASSEMBLER_CODE_SUPPORTED +# define PNG_ASSEMBLER_CODE_SUPPORTED +# endif + +# if defined(__GNUC__) && defined(__x86_64__) && (__GNUC__ < 4) + /* work around 64-bit gcc compiler bugs in gcc-3.x */ +# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) +# define PNG_NO_MMX_CODE +# endif +# endif + +# if defined(__APPLE__) +# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) +# define PNG_NO_MMX_CODE +# endif +# endif + +# if (defined(__MWERKS__) && ((__MWERKS__ < 0x0900) || macintosh)) +# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) +# define PNG_NO_MMX_CODE +# endif +# endif + +# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) +# define PNG_MMX_CODE_SUPPORTED +# endif + +#endif +/* end of obsolete code to be removed from libpng-1.4.0 */ + +#if !defined(PNG_1_0_X) +#if !defined(PNG_NO_USER_MEM) && !defined(PNG_USER_MEM_SUPPORTED) +# define PNG_USER_MEM_SUPPORTED +#endif +#endif /* PNG_1_0_X */ + +/* Added at libpng-1.2.6 */ +#if !defined(PNG_1_0_X) +#ifndef PNG_SET_USER_LIMITS_SUPPORTED +#if !defined(PNG_NO_SET_USER_LIMITS) && !defined(PNG_SET_USER_LIMITS_SUPPORTED) +# define PNG_SET_USER_LIMITS_SUPPORTED +#endif +#endif +#endif /* PNG_1_0_X */ + +/* Added at libpng-1.0.16 and 1.2.6. To accept all valid PNGS no matter + * how large, set these limits to 0x7fffffffL + */ +#ifndef PNG_USER_WIDTH_MAX +# define PNG_USER_WIDTH_MAX 1000000L +#endif +#ifndef PNG_USER_HEIGHT_MAX +# define PNG_USER_HEIGHT_MAX 1000000L +#endif + +/* Added at libpng-1.2.34 and 1.4.0 */ +#ifndef PNG_STRING_NEWLINE +#define PNG_STRING_NEWLINE "\n" +#endif + +/* These are currently experimental features, define them if you want */ + +/* very little testing */ +/* +#ifdef PNG_READ_SUPPORTED +# ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED +# define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED +# endif +#endif +*/ + +/* This is only for PowerPC big-endian and 680x0 systems */ +/* some testing */ +/* +#ifndef PNG_READ_BIG_ENDIAN_SUPPORTED +# define PNG_READ_BIG_ENDIAN_SUPPORTED +#endif +*/ + +/* Buggy compilers (e.g., gcc 2.7.2.2) need this */ +/* +#define PNG_NO_POINTER_INDEXING +*/ + +/* These functions are turned off by default, as they will be phased out. */ +/* +#define PNG_USELESS_TESTS_SUPPORTED +#define PNG_CORRECT_PALETTE_SUPPORTED +*/ + +/* Any chunks you are not interested in, you can undef here. The + * ones that allocate memory may be expecially important (hIST, + * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info + * a bit smaller. + */ + +#if defined(PNG_READ_SUPPORTED) && \ + !defined(PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ + !defined(PNG_NO_READ_ANCILLARY_CHUNKS) +# define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED +#endif + +#if defined(PNG_WRITE_SUPPORTED) && \ + !defined(PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ + !defined(PNG_NO_WRITE_ANCILLARY_CHUNKS) +# define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED +#endif + +#ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED + +#ifdef PNG_NO_READ_TEXT +# define PNG_NO_READ_iTXt +# define PNG_NO_READ_tEXt +# define PNG_NO_READ_zTXt +#endif +#ifndef PNG_NO_READ_bKGD +# define PNG_READ_bKGD_SUPPORTED +# define PNG_bKGD_SUPPORTED +#endif +#ifndef PNG_NO_READ_cHRM +# define PNG_READ_cHRM_SUPPORTED +# define PNG_cHRM_SUPPORTED +#endif +#ifndef PNG_NO_READ_gAMA +# define PNG_READ_gAMA_SUPPORTED +# define PNG_gAMA_SUPPORTED +#endif +#ifndef PNG_NO_READ_hIST +# define PNG_READ_hIST_SUPPORTED +# define PNG_hIST_SUPPORTED +#endif +#ifndef PNG_NO_READ_iCCP +# define PNG_READ_iCCP_SUPPORTED +# define PNG_iCCP_SUPPORTED +#endif +#ifndef PNG_NO_READ_iTXt +# ifndef PNG_READ_iTXt_SUPPORTED +# define PNG_READ_iTXt_SUPPORTED +# endif +# ifndef PNG_iTXt_SUPPORTED +# define PNG_iTXt_SUPPORTED +# endif +#endif +#ifndef PNG_NO_READ_oFFs +# define PNG_READ_oFFs_SUPPORTED +# define PNG_oFFs_SUPPORTED +#endif +#ifndef PNG_NO_READ_pCAL +# define PNG_READ_pCAL_SUPPORTED +# define PNG_pCAL_SUPPORTED +#endif +#ifndef PNG_NO_READ_sCAL +# define PNG_READ_sCAL_SUPPORTED +# define PNG_sCAL_SUPPORTED +#endif +#ifndef PNG_NO_READ_pHYs +# define PNG_READ_pHYs_SUPPORTED +# define PNG_pHYs_SUPPORTED +#endif +#ifndef PNG_NO_READ_sBIT +# define PNG_READ_sBIT_SUPPORTED +# define PNG_sBIT_SUPPORTED +#endif +#ifndef PNG_NO_READ_sPLT +# define PNG_READ_sPLT_SUPPORTED +# define PNG_sPLT_SUPPORTED +#endif +#ifndef PNG_NO_READ_sRGB +# define PNG_READ_sRGB_SUPPORTED +# define PNG_sRGB_SUPPORTED +#endif +#ifndef PNG_NO_READ_tEXt +# define PNG_READ_tEXt_SUPPORTED +# define PNG_tEXt_SUPPORTED +#endif +#ifndef PNG_NO_READ_tIME +# define PNG_READ_tIME_SUPPORTED +# define PNG_tIME_SUPPORTED +#endif +#ifndef PNG_NO_READ_tRNS +# define PNG_READ_tRNS_SUPPORTED +# define PNG_tRNS_SUPPORTED +#endif +#ifndef PNG_NO_READ_zTXt +# define PNG_READ_zTXt_SUPPORTED +# define PNG_zTXt_SUPPORTED +#endif +#ifndef PNG_NO_READ_OPT_PLTE +# define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */ +#endif /* optional PLTE chunk in RGB and RGBA images */ +#if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \ + defined(PNG_READ_zTXt_SUPPORTED) +# define PNG_READ_TEXT_SUPPORTED +# define PNG_TEXT_SUPPORTED +#endif + +#endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */ + +#ifndef PNG_NO_READ_UNKNOWN_CHUNKS +# define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED +# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED +# define PNG_UNKNOWN_CHUNKS_SUPPORTED +# endif +#endif +#if !defined(PNG_NO_READ_USER_CHUNKS) && \ + defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) +# define PNG_READ_USER_CHUNKS_SUPPORTED +# define PNG_USER_CHUNKS_SUPPORTED +# ifdef PNG_NO_READ_UNKNOWN_CHUNKS +# undef PNG_NO_READ_UNKNOWN_CHUNKS +# endif +# ifdef PNG_NO_HANDLE_AS_UNKNOWN +# undef PNG_NO_HANDLE_AS_UNKNOWN +# endif +#endif + +#ifndef PNG_NO_HANDLE_AS_UNKNOWN +# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +# endif +#endif + +#ifdef PNG_WRITE_SUPPORTED +#ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED + +#ifdef PNG_NO_WRITE_TEXT +# define PNG_NO_WRITE_iTXt +# define PNG_NO_WRITE_tEXt +# define PNG_NO_WRITE_zTXt +#endif +#ifndef PNG_NO_WRITE_bKGD +# define PNG_WRITE_bKGD_SUPPORTED +# ifndef PNG_bKGD_SUPPORTED +# define PNG_bKGD_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_cHRM +# define PNG_WRITE_cHRM_SUPPORTED +# ifndef PNG_cHRM_SUPPORTED +# define PNG_cHRM_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_gAMA +# define PNG_WRITE_gAMA_SUPPORTED +# ifndef PNG_gAMA_SUPPORTED +# define PNG_gAMA_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_hIST +# define PNG_WRITE_hIST_SUPPORTED +# ifndef PNG_hIST_SUPPORTED +# define PNG_hIST_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_iCCP +# define PNG_WRITE_iCCP_SUPPORTED +# ifndef PNG_iCCP_SUPPORTED +# define PNG_iCCP_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_iTXt +# ifndef PNG_WRITE_iTXt_SUPPORTED +# define PNG_WRITE_iTXt_SUPPORTED +# endif +# ifndef PNG_iTXt_SUPPORTED +# define PNG_iTXt_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_oFFs +# define PNG_WRITE_oFFs_SUPPORTED +# ifndef PNG_oFFs_SUPPORTED +# define PNG_oFFs_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_pCAL +# define PNG_WRITE_pCAL_SUPPORTED +# ifndef PNG_pCAL_SUPPORTED +# define PNG_pCAL_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_sCAL +# define PNG_WRITE_sCAL_SUPPORTED +# ifndef PNG_sCAL_SUPPORTED +# define PNG_sCAL_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_pHYs +# define PNG_WRITE_pHYs_SUPPORTED +# ifndef PNG_pHYs_SUPPORTED +# define PNG_pHYs_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_sBIT +# define PNG_WRITE_sBIT_SUPPORTED +# ifndef PNG_sBIT_SUPPORTED +# define PNG_sBIT_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_sPLT +# define PNG_WRITE_sPLT_SUPPORTED +# ifndef PNG_sPLT_SUPPORTED +# define PNG_sPLT_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_sRGB +# define PNG_WRITE_sRGB_SUPPORTED +# ifndef PNG_sRGB_SUPPORTED +# define PNG_sRGB_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_tEXt +# define PNG_WRITE_tEXt_SUPPORTED +# ifndef PNG_tEXt_SUPPORTED +# define PNG_tEXt_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_tIME +# define PNG_WRITE_tIME_SUPPORTED +# ifndef PNG_tIME_SUPPORTED +# define PNG_tIME_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_tRNS +# define PNG_WRITE_tRNS_SUPPORTED +# ifndef PNG_tRNS_SUPPORTED +# define PNG_tRNS_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_zTXt +# define PNG_WRITE_zTXt_SUPPORTED +# ifndef PNG_zTXt_SUPPORTED +# define PNG_zTXt_SUPPORTED +# endif +#endif +#if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \ + defined(PNG_WRITE_zTXt_SUPPORTED) +# define PNG_WRITE_TEXT_SUPPORTED +# ifndef PNG_TEXT_SUPPORTED +# define PNG_TEXT_SUPPORTED +# endif +#endif + +#endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */ + +#ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS +# define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED +# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED +# define PNG_UNKNOWN_CHUNKS_SUPPORTED +# endif +#endif + +#ifndef PNG_NO_HANDLE_AS_UNKNOWN +# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +# endif +#endif +#endif /* PNG_WRITE_SUPPORTED */ + +/* Turn this off to disable png_read_png() and + * png_write_png() and leave the row_pointers member + * out of the info structure. + */ +#ifndef PNG_NO_INFO_IMAGE +# define PNG_INFO_IMAGE_SUPPORTED +#endif + +/* need the time information for reading tIME chunks */ +#if defined(PNG_tIME_SUPPORTED) +# if !defined(_WIN32_WCE) + /* "time.h" functions are not supported on WindowsCE */ +# include +# endif +#endif + +/* Some typedefs to get us started. These should be safe on most of the + * common platforms. The typedefs should be at least as large as the + * numbers suggest (a png_uint_32 must be at least 32 bits long), but they + * don't have to be exactly that size. Some compilers dislike passing + * unsigned shorts as function parameters, so you may be better off using + * unsigned int for png_uint_16. Likewise, for 64-bit systems, you may + * want to have unsigned int for png_uint_32 instead of unsigned long. + */ + +typedef unsigned long png_uint_32; +typedef long png_int_32; +typedef unsigned short png_uint_16; +typedef short png_int_16; +typedef unsigned char png_byte; + +/* This is usually size_t. It is typedef'ed just in case you need it to + change (I'm not sure if you will or not, so I thought I'd be safe) */ +#ifdef PNG_SIZE_T + typedef PNG_SIZE_T png_size_t; +# define png_sizeof(x) png_convert_size(sizeof(x)) +#else + typedef size_t png_size_t; +# define png_sizeof(x) sizeof(x) +#endif + +/* The following is needed for medium model support. It cannot be in the + * PNG_INTERNAL section. Needs modification for other compilers besides + * MSC. Model independent support declares all arrays and pointers to be + * large using the far keyword. The zlib version used must also support + * model independent data. As of version zlib 1.0.4, the necessary changes + * have been made in zlib. The USE_FAR_KEYWORD define triggers other + * changes that are needed. (Tim Wegner) + */ + +/* Separate compiler dependencies (problem here is that zlib.h always + defines FAR. (SJT) */ +#ifdef __BORLANDC__ +# if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) +# define LDATA 1 +# else +# define LDATA 0 +# endif + /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ +# if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) +# define PNG_MAX_MALLOC_64K +# if (LDATA != 1) +# ifndef FAR +# define FAR __far +# endif +# define USE_FAR_KEYWORD +# endif /* LDATA != 1 */ + /* Possibly useful for moving data out of default segment. + * Uncomment it if you want. Could also define FARDATA as + * const if your compiler supports it. (SJT) +# define FARDATA FAR + */ +# endif /* __WIN32__, __FLAT__, __CYGWIN__ */ +#endif /* __BORLANDC__ */ + + +/* Suggest testing for specific compiler first before testing for + * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM, + * making reliance oncertain keywords suspect. (SJT) + */ + +/* MSC Medium model */ +#if defined(FAR) +# if defined(M_I86MM) +# define USE_FAR_KEYWORD +# define FARDATA FAR +# include +# endif +#endif + +/* SJT: default case */ +#ifndef FAR +# define FAR +#endif + +/* At this point FAR is always defined */ +#ifndef FARDATA +# define FARDATA +#endif + +/* Typedef for floating-point numbers that are converted + to fixed-point with a multiple of 100,000, e.g., int_gamma */ +typedef png_int_32 png_fixed_point; + +/* Add typedefs for pointers */ +typedef void FAR * png_voidp; +typedef png_byte FAR * png_bytep; +typedef png_uint_32 FAR * png_uint_32p; +typedef png_int_32 FAR * png_int_32p; +typedef png_uint_16 FAR * png_uint_16p; +typedef png_int_16 FAR * png_int_16p; +typedef PNG_CONST char FAR * png_const_charp; +typedef char FAR * png_charp; +typedef png_fixed_point FAR * png_fixed_point_p; + +#ifndef PNG_NO_STDIO +#if defined(_WIN32_WCE) +typedef HANDLE png_FILE_p; +#else +typedef FILE * png_FILE_p; +#endif +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double FAR * png_doublep; +#endif + +/* Pointers to pointers; i.e. arrays */ +typedef png_byte FAR * FAR * png_bytepp; +typedef png_uint_32 FAR * FAR * png_uint_32pp; +typedef png_int_32 FAR * FAR * png_int_32pp; +typedef png_uint_16 FAR * FAR * png_uint_16pp; +typedef png_int_16 FAR * FAR * png_int_16pp; +typedef PNG_CONST char FAR * FAR * png_const_charpp; +typedef char FAR * FAR * png_charpp; +typedef png_fixed_point FAR * FAR * png_fixed_point_pp; +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double FAR * FAR * png_doublepp; +#endif + +/* Pointers to pointers to pointers; i.e., pointer to array */ +typedef char FAR * FAR * FAR * png_charppp; + +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +/* SPC - Is this stuff deprecated? */ +/* It'll be removed as of libpng-1.4.0 - GR-P */ +/* libpng typedefs for types in zlib. If zlib changes + * or another compression library is used, then change these. + * Eliminates need to change all the source files. + */ +typedef charf * png_zcharp; +typedef charf * FAR * png_zcharpp; +typedef z_stream FAR * png_zstreamp; +#endif /* (PNG_1_0_X) || defined(PNG_1_2_X) */ + +/* + * Define PNG_BUILD_DLL if the module being built is a Windows + * LIBPNG DLL. + * + * Define PNG_USE_DLL if you want to *link* to the Windows LIBPNG DLL. + * It is equivalent to Microsoft predefined macro _DLL that is + * automatically defined when you compile using the share + * version of the CRT (C Run-Time library) + * + * The cygwin mods make this behavior a little different: + * Define PNG_BUILD_DLL if you are building a dll for use with cygwin + * Define PNG_STATIC if you are building a static library for use with cygwin, + * -or- if you are building an application that you want to link to the + * static library. + * PNG_USE_DLL is defined by default (no user action needed) unless one of + * the other flags is defined. + */ + +#if !defined(PNG_DLL) && (defined(PNG_BUILD_DLL) || defined(PNG_USE_DLL)) +# define PNG_DLL +#endif +/* If CYGWIN, then disallow GLOBAL ARRAYS unless building a static lib. + * When building a static lib, default to no GLOBAL ARRAYS, but allow + * command-line override + */ +#if defined(__CYGWIN__) +# if !defined(PNG_STATIC) +# if defined(PNG_USE_GLOBAL_ARRAYS) +# undef PNG_USE_GLOBAL_ARRAYS +# endif +# if !defined(PNG_USE_LOCAL_ARRAYS) +# define PNG_USE_LOCAL_ARRAYS +# endif +# else +# if defined(PNG_USE_LOCAL_ARRAYS) || defined(PNG_NO_GLOBAL_ARRAYS) +# if defined(PNG_USE_GLOBAL_ARRAYS) +# undef PNG_USE_GLOBAL_ARRAYS +# endif +# endif +# endif +# if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) +# define PNG_USE_LOCAL_ARRAYS +# endif +#endif + +/* Do not use global arrays (helps with building DLL's) + * They are no longer used in libpng itself, since version 1.0.5c, + * but might be required for some pre-1.0.5c applications. + */ +#if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) +# if defined(PNG_NO_GLOBAL_ARRAYS) || \ + (defined(__GNUC__) && defined(PNG_DLL)) || defined(_MSC_VER) +# define PNG_USE_LOCAL_ARRAYS +# else +# define PNG_USE_GLOBAL_ARRAYS +# endif +#endif + +#if defined(__CYGWIN__) +# undef PNGAPI +# define PNGAPI __cdecl +# undef PNG_IMPEXP +# define PNG_IMPEXP +#endif + +/* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall", + * you may get warnings regarding the linkage of png_zalloc and png_zfree. + * Don't ignore those warnings; you must also reset the default calling + * convention in your compiler to match your PNGAPI, and you must build + * zlib and your applications the same way you build libpng. + */ + +#if defined(__MINGW32__) && !defined(PNG_MODULEDEF) +# ifndef PNG_NO_MODULEDEF +# define PNG_NO_MODULEDEF +# endif +#endif + +#if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF) +# define PNG_IMPEXP +#endif + +#if defined(PNG_DLL) || defined(_DLL) || defined(__DLL__ ) || \ + (( defined(_Windows) || defined(_WINDOWS) || \ + defined(WIN32) || defined(_WIN32) || defined(__WIN32__) )) + +# ifndef PNGAPI +# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) +# define PNGAPI __cdecl +# else +# define PNGAPI _cdecl +# endif +# endif + +# if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \ + 0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */) +# define PNG_IMPEXP +# endif + +# if !defined(PNG_IMPEXP) + +# define PNG_EXPORT_TYPE1(type,symbol) PNG_IMPEXP type PNGAPI symbol +# define PNG_EXPORT_TYPE2(type,symbol) type PNG_IMPEXP PNGAPI symbol + + /* Borland/Microsoft */ +# if defined(_MSC_VER) || defined(__BORLANDC__) +# if (_MSC_VER >= 800) || (__BORLANDC__ >= 0x500) +# define PNG_EXPORT PNG_EXPORT_TYPE1 +# else +# define PNG_EXPORT PNG_EXPORT_TYPE2 +# if defined(PNG_BUILD_DLL) +# define PNG_IMPEXP __export +# else +# define PNG_IMPEXP /*__import */ /* doesn't exist AFAIK in + VC++ */ +# endif /* Exists in Borland C++ for + C++ classes (== huge) */ +# endif +# endif + +# if !defined(PNG_IMPEXP) +# if defined(PNG_BUILD_DLL) +# define PNG_IMPEXP __declspec(dllexport) +# else +# define PNG_IMPEXP __declspec(dllimport) +# endif +# endif +# endif /* PNG_IMPEXP */ +#else /* !(DLL || non-cygwin WINDOWS) */ +# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) +# ifndef PNGAPI +# define PNGAPI _System +# endif +# else +# if 0 /* ... other platforms, with other meanings */ +# endif +# endif +#endif + +#ifndef PNGAPI +# define PNGAPI +#endif +#ifndef PNG_IMPEXP +# define PNG_IMPEXP +#endif + +#ifdef PNG_BUILDSYMS +# ifndef PNG_EXPORT +# define PNG_EXPORT(type,symbol) PNG_FUNCTION_EXPORT symbol END +# endif +# ifdef PNG_USE_GLOBAL_ARRAYS +# ifndef PNG_EXPORT_VAR +# define PNG_EXPORT_VAR(type) PNG_DATA_EXPORT +# endif +# endif +#endif + +#ifndef PNG_EXPORT +# define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol +#endif + +#ifdef PNG_USE_GLOBAL_ARRAYS +# ifndef PNG_EXPORT_VAR +# define PNG_EXPORT_VAR(type) extern PNG_IMPEXP type +# endif +#endif + +/* User may want to use these so they are not in PNG_INTERNAL. Any library + * functions that are passed far data must be model independent. + */ + +#ifndef PNG_ABORT +# define PNG_ABORT() abort() +#endif + +#ifdef PNG_SETJMP_SUPPORTED +# define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) +#else +# define png_jmpbuf(png_ptr) \ + (LIBPNG_WAS_COMPILED_WITH__PNG_SETJMP_NOT_SUPPORTED) +#endif + +#if defined(USE_FAR_KEYWORD) /* memory model independent fns */ +/* use this to make far-to-near assignments */ +# define CHECK 1 +# define NOCHECK 0 +# define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) +# define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) +# define png_snprintf _fsnprintf /* Added to v 1.2.19 */ +# define png_strlen _fstrlen +# define png_memcmp _fmemcmp /* SJT: added */ +# define png_memcpy _fmemcpy +# define png_memset _fmemset +#else /* use the usual functions */ +# define CVT_PTR(ptr) (ptr) +# define CVT_PTR_NOCHECK(ptr) (ptr) +# ifndef PNG_NO_SNPRINTF +# ifdef _MSC_VER +# define png_snprintf _snprintf /* Added to v 1.2.19 */ +# define png_snprintf2 _snprintf +# define png_snprintf6 _snprintf +# else +# define png_snprintf snprintf /* Added to v 1.2.19 */ +# define png_snprintf2 snprintf +# define png_snprintf6 snprintf +# endif +# else + /* You don't have or don't want to use snprintf(). Caution: Using + * sprintf instead of snprintf exposes your application to accidental + * or malevolent buffer overflows. If you don't have snprintf() + * as a general rule you should provide one (you can get one from + * Portable OpenSSH). */ +# define png_snprintf(s1,n,fmt,x1) sprintf(s1,fmt,x1) +# define png_snprintf2(s1,n,fmt,x1,x2) sprintf(s1,fmt,x1,x2) +# define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \ + sprintf(s1,fmt,x1,x2,x3,x4,x5,x6) +# endif +# define png_strlen strlen +# define png_memcmp memcmp /* SJT: added */ +# define png_memcpy memcpy +# define png_memset memset +#endif +/* End of memory model independent support */ + +/* Just a little check that someone hasn't tried to define something + * contradictory. + */ +#if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K) +# undef PNG_ZBUF_SIZE +# define PNG_ZBUF_SIZE 65536L +#endif + +/* Added at libpng-1.2.8 */ +#endif /* PNG_VERSION_INFO_ONLY */ + +#endif /* PNGCONF_H */ diff --git a/third_party/windows/fltk-1.1.10/png/pngerror.c b/third_party/windows/fltk-1.1.10/png/pngerror.c new file mode 100644 index 0000000..15d7910 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngerror.c @@ -0,0 +1,364 @@ + +/* pngerror.c - stub functions for i/o and memory allocation + * + * Last changed in libpng 1.2.37 [June 4, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file provides a location for all error handling. Users who + * need special error handling are expected to write replacement functions + * and use png_set_error_fn() to use those functions. See the instructions + * at each function. + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +static void /* PRIVATE */ +png_default_error PNGARG((png_structp png_ptr, + png_const_charp error_message)); +#ifndef PNG_NO_WARNINGS +static void /* PRIVATE */ +png_default_warning PNGARG((png_structp png_ptr, + png_const_charp warning_message)); +#endif /* PNG_NO_WARNINGS */ + +/* This function is called whenever there is a fatal error. This function + * should not be changed. If there is a need to handle errors differently, + * you should supply a replacement error function and use png_set_error_fn() + * to replace the error function at run-time. + */ +#ifndef PNG_NO_ERROR_TEXT +void PNGAPI +png_error(png_structp png_ptr, png_const_charp error_message) +{ +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + char msg[16]; + if (png_ptr != NULL) + { + if (png_ptr->flags& + (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) + { + if (*error_message == '#') + { + /* Strip "#nnnn " from beginning of error message. */ + int offset; + for (offset = 1; offset<15; offset++) + if (error_message[offset] == ' ') + break; + if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) + { + int i; + for (i = 0; i < offset - 1; i++) + msg[i] = error_message[i + 1]; + msg[i - 1] = '\0'; + error_message = msg; + } + else + error_message += offset; + } + else + { + if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) + { + msg[0] = '0'; + msg[1] = '\0'; + error_message = msg; + } + } + } + } +#endif + if (png_ptr != NULL && png_ptr->error_fn != NULL) + (*(png_ptr->error_fn))(png_ptr, error_message); + + /* If the custom handler doesn't exist, or if it returns, + use the default handler, which will not return. */ + png_default_error(png_ptr, error_message); +} +#else +void PNGAPI +png_err(png_structp png_ptr) +{ + if (png_ptr != NULL && png_ptr->error_fn != NULL) + (*(png_ptr->error_fn))(png_ptr, '\0'); + + /* If the custom handler doesn't exist, or if it returns, + use the default handler, which will not return. */ + png_default_error(png_ptr, '\0'); +} +#endif /* PNG_NO_ERROR_TEXT */ + +#ifndef PNG_NO_WARNINGS +/* This function is called whenever there is a non-fatal error. This function + * should not be changed. If there is a need to handle warnings differently, + * you should supply a replacement warning function and use + * png_set_error_fn() to replace the warning function at run-time. + */ +void PNGAPI +png_warning(png_structp png_ptr, png_const_charp warning_message) +{ + int offset = 0; + if (png_ptr != NULL) + { +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + if (png_ptr->flags& + (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) +#endif + { + if (*warning_message == '#') + { + for (offset = 1; offset < 15; offset++) + if (warning_message[offset] == ' ') + break; + } + } + } + if (png_ptr != NULL && png_ptr->warning_fn != NULL) + (*(png_ptr->warning_fn))(png_ptr, warning_message + offset); + else + png_default_warning(png_ptr, warning_message + offset); +} +#endif /* PNG_NO_WARNINGS */ + + +/* These utilities are used internally to build an error message that relates + * to the current chunk. The chunk name comes from png_ptr->chunk_name, + * this is used to prefix the message. The message is limited in length + * to 63 bytes, the name characters are output as hex digits wrapped in [] + * if the character is invalid. + */ +#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) +static PNG_CONST char png_digit[16] = { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F' +}; + +#define PNG_MAX_ERROR_TEXT 64 + +#if !defined(PNG_NO_WARNINGS) || !defined(PNG_NO_ERROR_TEXT) +static void /* PRIVATE */ +png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp + error_message) +{ + int iout = 0, iin = 0; + + while (iin < 4) + { + int c = png_ptr->chunk_name[iin++]; + if (isnonalpha(c)) + { + buffer[iout++] = '['; + buffer[iout++] = png_digit[(c & 0xf0) >> 4]; + buffer[iout++] = png_digit[c & 0x0f]; + buffer[iout++] = ']'; + } + else + { + buffer[iout++] = (png_byte)c; + } + } + + if (error_message == NULL) + buffer[iout] = '\0'; + else + { + buffer[iout++] = ':'; + buffer[iout++] = ' '; + png_memcpy(buffer + iout, error_message, PNG_MAX_ERROR_TEXT); + buffer[iout + PNG_MAX_ERROR_TEXT - 1] = '\0'; + } +} + +#ifdef PNG_READ_SUPPORTED +void PNGAPI +png_chunk_error(png_structp png_ptr, png_const_charp error_message) +{ + char msg[18+PNG_MAX_ERROR_TEXT]; + if (png_ptr == NULL) + png_error(png_ptr, error_message); + else + { + png_format_buffer(png_ptr, msg, error_message); + png_error(png_ptr, msg); + } +} +#endif /* PNG_READ_SUPPORTED */ +#endif /* !defined(PNG_NO_WARNINGS) || !defined(PNG_NO_ERROR_TEXT) */ + +#ifndef PNG_NO_WARNINGS +void PNGAPI +png_chunk_warning(png_structp png_ptr, png_const_charp warning_message) +{ + char msg[18+PNG_MAX_ERROR_TEXT]; + if (png_ptr == NULL) + png_warning(png_ptr, warning_message); + else + { + png_format_buffer(png_ptr, msg, warning_message); + png_warning(png_ptr, msg); + } +} +#endif /* PNG_NO_WARNINGS */ + + +/* This is the default error handling function. Note that replacements for + * this function MUST NOT RETURN, or the program will likely crash. This + * function is used by default, or if the program supplies NULL for the + * error function pointer in png_set_error_fn(). + */ +static void /* PRIVATE */ +png_default_error(png_structp png_ptr, png_const_charp error_message) +{ +#ifndef PNG_NO_CONSOLE_IO +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + if (*error_message == '#') + { + /* Strip "#nnnn " from beginning of error message. */ + int offset; + char error_number[16]; + for (offset = 0; offset<15; offset++) + { + error_number[offset] = error_message[offset + 1]; + if (error_message[offset] == ' ') + break; + } + if ((offset > 1) && (offset < 15)) + { + error_number[offset - 1] = '\0'; + fprintf(stderr, "libpng error no. %s: %s", + error_number, error_message + offset + 1); + fprintf(stderr, PNG_STRING_NEWLINE); + } + else + { + fprintf(stderr, "libpng error: %s, offset=%d", + error_message, offset); + fprintf(stderr, PNG_STRING_NEWLINE); + } + } + else +#endif + { + fprintf(stderr, "libpng error: %s", error_message); + fprintf(stderr, PNG_STRING_NEWLINE); + } +#endif + +#ifdef PNG_SETJMP_SUPPORTED + if (png_ptr) + { +# ifdef USE_FAR_KEYWORD + { + jmp_buf jmpbuf; + png_memcpy(jmpbuf, png_ptr->jmpbuf, png_sizeof(jmp_buf)); + longjmp(jmpbuf, 1); + } +# else + longjmp(png_ptr->jmpbuf, 1); +# endif + } +#else + PNG_ABORT(); +#endif +#ifdef PNG_NO_CONSOLE_IO + error_message = error_message; /* Make compiler happy */ +#endif +} + +#ifndef PNG_NO_WARNINGS +/* This function is called when there is a warning, but the library thinks + * it can continue anyway. Replacement functions don't have to do anything + * here if you don't want them to. In the default configuration, png_ptr is + * not used, but it is passed in case it may be useful. + */ +static void /* PRIVATE */ +png_default_warning(png_structp png_ptr, png_const_charp warning_message) +{ +#ifndef PNG_NO_CONSOLE_IO +# ifdef PNG_ERROR_NUMBERS_SUPPORTED + if (*warning_message == '#') + { + int offset; + char warning_number[16]; + for (offset = 0; offset < 15; offset++) + { + warning_number[offset] = warning_message[offset + 1]; + if (warning_message[offset] == ' ') + break; + } + if ((offset > 1) && (offset < 15)) + { + warning_number[offset + 1] = '\0'; + fprintf(stderr, "libpng warning no. %s: %s", + warning_number, warning_message + offset); + fprintf(stderr, PNG_STRING_NEWLINE); + } + else + { + fprintf(stderr, "libpng warning: %s", + warning_message); + fprintf(stderr, PNG_STRING_NEWLINE); + } + } + else +# endif + { + fprintf(stderr, "libpng warning: %s", warning_message); + fprintf(stderr, PNG_STRING_NEWLINE); + } +#else + warning_message = warning_message; /* Make compiler happy */ +#endif + png_ptr = png_ptr; /* Make compiler happy */ +} +#endif /* PNG_NO_WARNINGS */ + +/* This function is called when the application wants to use another method + * of handling errors and warnings. Note that the error function MUST NOT + * return to the calling routine or serious problems will occur. The return + * method used in the default routine calls longjmp(png_ptr->jmpbuf, 1) + */ +void PNGAPI +png_set_error_fn(png_structp png_ptr, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warning_fn) +{ + if (png_ptr == NULL) + return; + png_ptr->error_ptr = error_ptr; + png_ptr->error_fn = error_fn; + png_ptr->warning_fn = warning_fn; +} + + +/* This function returns a pointer to the error_ptr associated with the user + * functions. The application should free any memory associated with this + * pointer before png_write_destroy and png_read_destroy are called. + */ +png_voidp PNGAPI +png_get_error_ptr(png_structp png_ptr) +{ + if (png_ptr == NULL) + return NULL; + return ((png_voidp)png_ptr->error_ptr); +} + + +#ifdef PNG_ERROR_NUMBERS_SUPPORTED +void PNGAPI +png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode) +{ + if (png_ptr != NULL) + { + png_ptr->flags &= + ((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode); + } +} +#endif +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/png/pngget.c b/third_party/windows/fltk-1.1.10/png/pngget.c new file mode 100644 index 0000000..a2da699 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngget.c @@ -0,0 +1,943 @@ + +/* pngget.c - retrieval of values from info struct + * + * Last changed in libpng 1.2.37 [June 4, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +png_uint_32 PNGAPI +png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->valid & flag); + + else + return(0); +} + +png_uint_32 PNGAPI +png_get_rowbytes(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->rowbytes); + + else + return(0); +} + +#if defined(PNG_INFO_IMAGE_SUPPORTED) +png_bytepp PNGAPI +png_get_rows(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->row_pointers); + + else + return(0); +} +#endif + +#ifdef PNG_EASY_ACCESS_SUPPORTED +/* Easy access to info, added in libpng-0.99 */ +png_uint_32 PNGAPI +png_get_image_width(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->width; + + return (0); +} + +png_uint_32 PNGAPI +png_get_image_height(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->height; + + return (0); +} + +png_byte PNGAPI +png_get_bit_depth(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->bit_depth; + + return (0); +} + +png_byte PNGAPI +png_get_color_type(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->color_type; + + return (0); +} + +png_byte PNGAPI +png_get_filter_type(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->filter_type; + + return (0); +} + +png_byte PNGAPI +png_get_interlace_type(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->interlace_type; + + return (0); +} + +png_byte PNGAPI +png_get_compression_type(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return info_ptr->compression_type; + + return (0); +} + +png_uint_32 PNGAPI +png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) +#if defined(PNG_pHYs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_pHYs) + { + png_debug1(1, "in %s retrieval function", "png_get_x_pixels_per_meter"); + + if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER) + return (0); + + else + return (info_ptr->x_pixels_per_unit); + } +#else + return (0); +#endif + return (0); +} + +png_uint_32 PNGAPI +png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) +#if defined(PNG_pHYs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_pHYs) + { + png_debug1(1, "in %s retrieval function", "png_get_y_pixels_per_meter"); + + if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER) + return (0); + + else + return (info_ptr->y_pixels_per_unit); + } +#else + return (0); +#endif + return (0); +} + +png_uint_32 PNGAPI +png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) +#if defined(PNG_pHYs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_pHYs) + { + png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter"); + + if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER || + info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit) + return (0); + + else + return (info_ptr->x_pixels_per_unit); + } +#else + return (0); +#endif + return (0); +} + +#ifdef PNG_FLOATING_POINT_SUPPORTED +float PNGAPI +png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr) + { + if (png_ptr != NULL && info_ptr != NULL) +#if defined(PNG_pHYs_SUPPORTED) + + if (info_ptr->valid & PNG_INFO_pHYs) + { + png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio"); + if (info_ptr->x_pixels_per_unit == 0) + return ((float)0.0); + else + return ((float)((float)info_ptr->y_pixels_per_unit + /(float)info_ptr->x_pixels_per_unit)); + } +#else + return (0.0); +#endif + return ((float)0.0); +} +#endif + +png_int_32 PNGAPI +png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) +#if defined(PNG_oFFs_SUPPORTED) + + if (info_ptr->valid & PNG_INFO_oFFs) + { + png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns"); + + if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) + return (0); + + else + return (info_ptr->x_offset); + } +#else + return (0); +#endif + return (0); +} + +png_int_32 PNGAPI +png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + +#if defined(PNG_oFFs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_oFFs) + { + png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns"); + + if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER) + return (0); + + else + return (info_ptr->y_offset); + } +#else + return (0); +#endif + return (0); +} + +png_int_32 PNGAPI +png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + +#if defined(PNG_oFFs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_oFFs) + { + png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns"); + + if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) + return (0); + + else + return (info_ptr->x_offset); + } +#else + return (0); +#endif + return (0); +} + +png_int_32 PNGAPI +png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + +#if defined(PNG_oFFs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_oFFs) + { + png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns"); + + if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL) + return (0); + + else + return (info_ptr->y_offset); + } +#else + return (0); +#endif + return (0); +} + +#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) +png_uint_32 PNGAPI +png_get_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) +{ + return ((png_uint_32)((float)png_get_pixels_per_meter(png_ptr, info_ptr) + *.0254 +.5)); +} + +png_uint_32 PNGAPI +png_get_x_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) +{ + return ((png_uint_32)((float)png_get_x_pixels_per_meter(png_ptr, info_ptr) + *.0254 +.5)); +} + +png_uint_32 PNGAPI +png_get_y_pixels_per_inch(png_structp png_ptr, png_infop info_ptr) +{ + return ((png_uint_32)((float)png_get_y_pixels_per_meter(png_ptr, info_ptr) + *.0254 +.5)); +} + +float PNGAPI +png_get_x_offset_inches(png_structp png_ptr, png_infop info_ptr) +{ + return ((float)png_get_x_offset_microns(png_ptr, info_ptr) + *.00003937); +} + +float PNGAPI +png_get_y_offset_inches(png_structp png_ptr, png_infop info_ptr) +{ + return ((float)png_get_y_offset_microns(png_ptr, info_ptr) + *.00003937); +} + +#if defined(PNG_pHYs_SUPPORTED) +png_uint_32 PNGAPI +png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr, + png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) +{ + png_uint_32 retval = 0; + + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + { + png_debug1(1, "in %s retrieval function", "pHYs"); + if (res_x != NULL) + { + *res_x = info_ptr->x_pixels_per_unit; + retval |= PNG_INFO_pHYs; + } + if (res_y != NULL) + { + *res_y = info_ptr->y_pixels_per_unit; + retval |= PNG_INFO_pHYs; + } + if (unit_type != NULL) + { + *unit_type = (int)info_ptr->phys_unit_type; + retval |= PNG_INFO_pHYs; + if (*unit_type == 1) + { + if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50); + if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50); + } + } + } + return (retval); +} +#endif /* PNG_pHYs_SUPPORTED */ +#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ + +/* png_get_channels really belongs in here, too, but it's been around longer */ + +#endif /* PNG_EASY_ACCESS_SUPPORTED */ + +png_byte PNGAPI +png_get_channels(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->channels); + else + return (0); +} + +png_bytep PNGAPI +png_get_signature(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr != NULL && info_ptr != NULL) + return(info_ptr->signature); + else + return (NULL); +} + +#if defined(PNG_bKGD_SUPPORTED) +png_uint_32 PNGAPI +png_get_bKGD(png_structp png_ptr, png_infop info_ptr, + png_color_16p *background) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) + && background != NULL) + { + png_debug1(1, "in %s retrieval function", "bKGD"); + *background = &(info_ptr->background); + return (PNG_INFO_bKGD); + } + return (0); +} +#endif + +#if defined(PNG_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_cHRM(png_structp png_ptr, png_infop info_ptr, + double *white_x, double *white_y, double *red_x, double *red_y, + double *green_x, double *green_y, double *blue_x, double *blue_y) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) + { + png_debug1(1, "in %s retrieval function", "cHRM"); + if (white_x != NULL) + *white_x = (double)info_ptr->x_white; + if (white_y != NULL) + *white_y = (double)info_ptr->y_white; + if (red_x != NULL) + *red_x = (double)info_ptr->x_red; + if (red_y != NULL) + *red_y = (double)info_ptr->y_red; + if (green_x != NULL) + *green_x = (double)info_ptr->x_green; + if (green_y != NULL) + *green_y = (double)info_ptr->y_green; + if (blue_x != NULL) + *blue_x = (double)info_ptr->x_blue; + if (blue_y != NULL) + *blue_y = (double)info_ptr->y_blue; + return (PNG_INFO_cHRM); + } + return (0); +} +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, + png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x, + png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y, + png_fixed_point *blue_x, png_fixed_point *blue_y) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) + { + png_debug1(1, "in %s retrieval function", "cHRM"); + if (white_x != NULL) + *white_x = info_ptr->int_x_white; + if (white_y != NULL) + *white_y = info_ptr->int_y_white; + if (red_x != NULL) + *red_x = info_ptr->int_x_red; + if (red_y != NULL) + *red_y = info_ptr->int_y_red; + if (green_x != NULL) + *green_x = info_ptr->int_x_green; + if (green_y != NULL) + *green_y = info_ptr->int_y_green; + if (blue_x != NULL) + *blue_x = info_ptr->int_x_blue; + if (blue_y != NULL) + *blue_y = info_ptr->int_y_blue; + return (PNG_INFO_cHRM); + } + return (0); +} +#endif +#endif + +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) + && file_gamma != NULL) + { + png_debug1(1, "in %s retrieval function", "gAMA"); + *file_gamma = (double)info_ptr->gamma; + return (PNG_INFO_gAMA); + } + return (0); +} +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, + png_fixed_point *int_file_gamma) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) + && int_file_gamma != NULL) + { + png_debug1(1, "in %s retrieval function", "gAMA"); + *int_file_gamma = info_ptr->int_gamma; + return (PNG_INFO_gAMA); + } + return (0); +} +#endif +#endif + +#if defined(PNG_sRGB_SUPPORTED) +png_uint_32 PNGAPI +png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB) + && file_srgb_intent != NULL) + { + png_debug1(1, "in %s retrieval function", "sRGB"); + *file_srgb_intent = (int)info_ptr->srgb_intent; + return (PNG_INFO_sRGB); + } + return (0); +} +#endif + +#if defined(PNG_iCCP_SUPPORTED) +png_uint_32 PNGAPI +png_get_iCCP(png_structp png_ptr, png_infop info_ptr, + png_charpp name, int *compression_type, + png_charpp profile, png_uint_32 *proflen) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP) + && name != NULL && profile != NULL && proflen != NULL) + { + png_debug1(1, "in %s retrieval function", "iCCP"); + *name = info_ptr->iccp_name; + *profile = info_ptr->iccp_profile; + /* Compression_type is a dummy so the API won't have to change + * if we introduce multiple compression types later. + */ + *proflen = (int)info_ptr->iccp_proflen; + *compression_type = (int)info_ptr->iccp_compression; + return (PNG_INFO_iCCP); + } + return (0); +} +#endif + +#if defined(PNG_sPLT_SUPPORTED) +png_uint_32 PNGAPI +png_get_sPLT(png_structp png_ptr, png_infop info_ptr, + png_sPLT_tpp spalettes) +{ + if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL) + { + *spalettes = info_ptr->splt_palettes; + return ((png_uint_32)info_ptr->splt_palettes_num); + } + return (0); +} +#endif + +#if defined(PNG_hIST_SUPPORTED) +png_uint_32 PNGAPI +png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) + && hist != NULL) + { + png_debug1(1, "in %s retrieval function", "hIST"); + *hist = info_ptr->hist; + return (PNG_INFO_hIST); + } + return (0); +} +#endif + +png_uint_32 PNGAPI +png_get_IHDR(png_structp png_ptr, png_infop info_ptr, + png_uint_32 *width, png_uint_32 *height, int *bit_depth, + int *color_type, int *interlace_type, int *compression_type, + int *filter_type) + +{ + if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL && + bit_depth != NULL && color_type != NULL) + { + png_debug1(1, "in %s retrieval function", "IHDR"); + *width = info_ptr->width; + *height = info_ptr->height; + *bit_depth = info_ptr->bit_depth; + if (info_ptr->bit_depth < 1 || info_ptr->bit_depth > 16) + png_error(png_ptr, "Invalid bit depth"); + + *color_type = info_ptr->color_type; + + if (info_ptr->color_type > 6) + png_error(png_ptr, "Invalid color type"); + + if (compression_type != NULL) + *compression_type = info_ptr->compression_type; + + if (filter_type != NULL) + *filter_type = info_ptr->filter_type; + + if (interlace_type != NULL) + *interlace_type = info_ptr->interlace_type; + + /* Check for potential overflow of rowbytes */ + if (*width == 0 || *width > PNG_UINT_31_MAX) + png_error(png_ptr, "Invalid image width"); + + if (*height == 0 || *height > PNG_UINT_31_MAX) + png_error(png_ptr, "Invalid image height"); + + if (info_ptr->width > (PNG_UINT_32_MAX + >> 3) /* 8-byte RGBA pixels */ + - 64 /* bigrowbuf hack */ + - 1 /* filter byte */ + - 7*8 /* rounding of width to multiple of 8 pixels */ + - 8) /* extra max_pixel_depth pad */ + { + png_warning(png_ptr, + "Width too large for libpng to process image data."); + } + + return (1); + } + return (0); +} + +#if defined(PNG_oFFs_SUPPORTED) +png_uint_32 PNGAPI +png_get_oFFs(png_structp png_ptr, png_infop info_ptr, + png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) + && offset_x != NULL && offset_y != NULL && unit_type != NULL) + { + png_debug1(1, "in %s retrieval function", "oFFs"); + *offset_x = info_ptr->x_offset; + *offset_y = info_ptr->y_offset; + *unit_type = (int)info_ptr->offset_unit_type; + return (PNG_INFO_oFFs); + } + return (0); +} +#endif + +#if defined(PNG_pCAL_SUPPORTED) +png_uint_32 PNGAPI +png_get_pCAL(png_structp png_ptr, png_infop info_ptr, + png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, + png_charp *units, png_charpp *params) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) + && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL && + nparams != NULL && units != NULL && params != NULL) + { + png_debug1(1, "in %s retrieval function", "pCAL"); + *purpose = info_ptr->pcal_purpose; + *X0 = info_ptr->pcal_X0; + *X1 = info_ptr->pcal_X1; + *type = (int)info_ptr->pcal_type; + *nparams = (int)info_ptr->pcal_nparams; + *units = info_ptr->pcal_units; + *params = info_ptr->pcal_params; + return (PNG_INFO_pCAL); + } + return (0); +} +#endif + +#if defined(PNG_sCAL_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_sCAL(png_structp png_ptr, png_infop info_ptr, + int *unit, double *width, double *height) +{ + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_sCAL)) + { + *unit = info_ptr->scal_unit; + *width = info_ptr->scal_pixel_width; + *height = info_ptr->scal_pixel_height; + return (PNG_INFO_sCAL); + } + return(0); +} +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +png_uint_32 PNGAPI +png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr, + int *unit, png_charpp width, png_charpp height) +{ + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_sCAL)) + { + *unit = info_ptr->scal_unit; + *width = info_ptr->scal_s_width; + *height = info_ptr->scal_s_height; + return (PNG_INFO_sCAL); + } + return(0); +} +#endif +#endif +#endif + +#if defined(PNG_pHYs_SUPPORTED) +png_uint_32 PNGAPI +png_get_pHYs(png_structp png_ptr, png_infop info_ptr, + png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) +{ + png_uint_32 retval = 0; + + if (png_ptr != NULL && info_ptr != NULL && + (info_ptr->valid & PNG_INFO_pHYs)) + { + png_debug1(1, "in %s retrieval function", "pHYs"); + + if (res_x != NULL) + { + *res_x = info_ptr->x_pixels_per_unit; + retval |= PNG_INFO_pHYs; + } + + if (res_y != NULL) + { + *res_y = info_ptr->y_pixels_per_unit; + retval |= PNG_INFO_pHYs; + } + + if (unit_type != NULL) + { + *unit_type = (int)info_ptr->phys_unit_type; + retval |= PNG_INFO_pHYs; + } + } + return (retval); +} +#endif + +png_uint_32 PNGAPI +png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette, + int *num_palette) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE) + && palette != NULL) + { + png_debug1(1, "in %s retrieval function", "PLTE"); + *palette = info_ptr->palette; + *num_palette = info_ptr->num_palette; + png_debug1(3, "num_palette = %d", *num_palette); + return (PNG_INFO_PLTE); + } + return (0); +} + +#if defined(PNG_sBIT_SUPPORTED) +png_uint_32 PNGAPI +png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) + && sig_bit != NULL) + { + png_debug1(1, "in %s retrieval function", "sBIT"); + *sig_bit = &(info_ptr->sig_bit); + return (PNG_INFO_sBIT); + } + return (0); +} +#endif + +#if defined(PNG_TEXT_SUPPORTED) +png_uint_32 PNGAPI +png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr, + int *num_text) +{ + if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0) + { + png_debug1(1, "in %s retrieval function", + (png_ptr->chunk_name[0] == '\0' ? "text" + : (png_const_charp)png_ptr->chunk_name)); + + if (text_ptr != NULL) + *text_ptr = info_ptr->text; + + if (num_text != NULL) + *num_text = info_ptr->num_text; + + return ((png_uint_32)info_ptr->num_text); + } + if (num_text != NULL) + *num_text = 0; + return(0); +} +#endif + +#if defined(PNG_tIME_SUPPORTED) +png_uint_32 PNGAPI +png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time) +{ + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) + && mod_time != NULL) + { + png_debug1(1, "in %s retrieval function", "tIME"); + *mod_time = &(info_ptr->mod_time); + return (PNG_INFO_tIME); + } + return (0); +} +#endif + +#if defined(PNG_tRNS_SUPPORTED) +png_uint_32 PNGAPI +png_get_tRNS(png_structp png_ptr, png_infop info_ptr, + png_bytep *trans, int *num_trans, png_color_16p *trans_values) +{ + png_uint_32 retval = 0; + if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) + { + png_debug1(1, "in %s retrieval function", "tRNS"); + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (trans != NULL) + { + *trans = info_ptr->trans; + retval |= PNG_INFO_tRNS; + } + + if (trans_values != NULL) + *trans_values = &(info_ptr->trans_values); + } + else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */ + { + if (trans_values != NULL) + { + *trans_values = &(info_ptr->trans_values); + retval |= PNG_INFO_tRNS; + } + + if (trans != NULL) + *trans = NULL; + } + if (num_trans != NULL) + { + *num_trans = info_ptr->num_trans; + retval |= PNG_INFO_tRNS; + } + } + return (retval); +} +#endif + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) +png_uint_32 PNGAPI +png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr, + png_unknown_chunkpp unknowns) +{ + if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL) + { + *unknowns = info_ptr->unknown_chunks; + return ((png_uint_32)info_ptr->unknown_chunks_num); + } + return (0); +} +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) +png_byte PNGAPI +png_get_rgb_to_gray_status (png_structp png_ptr) +{ + return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0); +} +#endif + +#if defined(PNG_USER_CHUNKS_SUPPORTED) +png_voidp PNGAPI +png_get_user_chunk_ptr(png_structp png_ptr) +{ + return (png_ptr? png_ptr->user_chunk_ptr : NULL); +} +#endif + +#ifdef PNG_WRITE_SUPPORTED +png_uint_32 PNGAPI +png_get_compression_buffer_size(png_structp png_ptr) +{ + return (png_uint_32)(png_ptr? png_ptr->zbuf_size : 0L); +} +#endif + +#ifdef PNG_ASSEMBLER_CODE_SUPPORTED +#ifndef PNG_1_0_X +/* This function was added to libpng 1.2.0 and should exist by default */ +png_uint_32 PNGAPI +png_get_asm_flags (png_structp png_ptr) +{ + /* Obsolete, to be removed from libpng-1.4.0 */ + return (png_ptr? 0L: 0L); +} + +/* This function was added to libpng 1.2.0 and should exist by default */ +png_uint_32 PNGAPI +png_get_asm_flagmask (int flag_select) +{ + /* Obsolete, to be removed from libpng-1.4.0 */ + flag_select=flag_select; + return 0L; +} + + /* GRR: could add this: && defined(PNG_MMX_CODE_SUPPORTED) */ +/* This function was added to libpng 1.2.0 */ +png_uint_32 PNGAPI +png_get_mmx_flagmask (int flag_select, int *compilerID) +{ + /* Obsolete, to be removed from libpng-1.4.0 */ + flag_select=flag_select; + *compilerID = -1; /* unknown (i.e., no asm/MMX code compiled) */ + return 0L; +} + +/* This function was added to libpng 1.2.0 */ +png_byte PNGAPI +png_get_mmx_bitdepth_threshold (png_structp png_ptr) +{ + /* Obsolete, to be removed from libpng-1.4.0 */ + return (png_ptr? 0: 0); +} + +/* This function was added to libpng 1.2.0 */ +png_uint_32 PNGAPI +png_get_mmx_rowbytes_threshold (png_structp png_ptr) +{ + /* Obsolete, to be removed from libpng-1.4.0 */ + return (png_ptr? 0L: 0L); +} +#endif /* ?PNG_1_0_X */ +#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */ + +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +/* These functions were added to libpng 1.2.6 */ +png_uint_32 PNGAPI +png_get_user_width_max (png_structp png_ptr) +{ + return (png_ptr? png_ptr->user_width_max : 0); +} +png_uint_32 PNGAPI +png_get_user_height_max (png_structp png_ptr) +{ + return (png_ptr? png_ptr->user_height_max : 0); +} +#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ + + +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/png/pngmem.c b/third_party/windows/fltk-1.1.10/png/pngmem.c new file mode 100644 index 0000000..401b0bc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngmem.c @@ -0,0 +1,620 @@ + +/* pngmem.c - stub functions for memory allocation + * + * Last changed in libpng 1.2.37 [June 4, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file provides a location for all memory allocation. Users who + * need special memory handling are expected to supply replacement + * functions for png_malloc() and png_free(), and to use + * png_create_read_struct_2() and png_create_write_struct_2() to + * identify the replacement functions. + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +/* Borland DOS special memory handler */ +#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) +/* If you change this, be sure to change the one in png.h also */ + +/* Allocate memory for a png_struct. The malloc and memset can be replaced + by a single call to calloc() if this is thought to improve performance. */ +png_voidp /* PRIVATE */ +png_create_struct(int type) +{ +#ifdef PNG_USER_MEM_SUPPORTED + return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); +} + +/* Alternate version of png_create_struct, for use with user-defined malloc. */ +png_voidp /* PRIVATE */ +png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) +{ +#endif /* PNG_USER_MEM_SUPPORTED */ + png_size_t size; + png_voidp struct_ptr; + + if (type == PNG_STRUCT_INFO) + size = png_sizeof(png_info); + else if (type == PNG_STRUCT_PNG) + size = png_sizeof(png_struct); + else + return (png_get_copyright(NULL)); + +#ifdef PNG_USER_MEM_SUPPORTED + if (malloc_fn != NULL) + { + png_struct dummy_struct; + png_structp png_ptr = &dummy_struct; + png_ptr->mem_ptr=mem_ptr; + struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size); + } + else +#endif /* PNG_USER_MEM_SUPPORTED */ + struct_ptr = (png_voidp)farmalloc(size); + if (struct_ptr != NULL) + png_memset(struct_ptr, 0, size); + return (struct_ptr); +} + +/* Free memory allocated by a png_create_struct() call */ +void /* PRIVATE */ +png_destroy_struct(png_voidp struct_ptr) +{ +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); +} + +/* Free memory allocated by a png_create_struct() call */ +void /* PRIVATE */ +png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, + png_voidp mem_ptr) +{ +#endif + if (struct_ptr != NULL) + { +#ifdef PNG_USER_MEM_SUPPORTED + if (free_fn != NULL) + { + png_struct dummy_struct; + png_structp png_ptr = &dummy_struct; + png_ptr->mem_ptr=mem_ptr; + (*(free_fn))(png_ptr, struct_ptr); + return; + } +#endif /* PNG_USER_MEM_SUPPORTED */ + farfree (struct_ptr); + } +} + +/* Allocate memory. For reasonable files, size should never exceed + * 64K. However, zlib may allocate more then 64K if you don't tell + * it not to. See zconf.h and png.h for more information. zlib does + * need to allocate exactly 64K, so whatever you call here must + * have the ability to do that. + * + * Borland seems to have a problem in DOS mode for exactly 64K. + * It gives you a segment with an offset of 8 (perhaps to store its + * memory stuff). zlib doesn't like this at all, so we have to + * detect and deal with it. This code should not be needed in + * Windows or OS/2 modes, and only in 16 bit mode. This code has + * been updated by Alexander Lehmann for version 0.89 to waste less + * memory. + * + * Note that we can't use png_size_t for the "size" declaration, + * since on some systems a png_size_t is a 16-bit quantity, and as a + * result, we would be truncating potentially larger memory requests + * (which should cause a fatal error) and introducing major problems. + */ + +png_voidp PNGAPI +png_malloc(png_structp png_ptr, png_uint_32 size) +{ + png_voidp ret; + + if (png_ptr == NULL || size == 0) + return (NULL); + +#ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr->malloc_fn != NULL) + ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); + else + ret = (png_malloc_default(png_ptr, size)); + if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of memory!"); + return (ret); +} + +png_voidp PNGAPI +png_malloc_default(png_structp png_ptr, png_uint_32 size) +{ + png_voidp ret; +#endif /* PNG_USER_MEM_SUPPORTED */ + + if (png_ptr == NULL || size == 0) + return (NULL); + +#ifdef PNG_MAX_MALLOC_64K + if (size > (png_uint_32)65536L) + { + png_warning(png_ptr, "Cannot Allocate > 64K"); + ret = NULL; + } + else +#endif + + if (size != (size_t)size) + ret = NULL; + else if (size == (png_uint_32)65536L) + { + if (png_ptr->offset_table == NULL) + { + /* Try to see if we need to do any of this fancy stuff */ + ret = farmalloc(size); + if (ret == NULL || ((png_size_t)ret & 0xffff)) + { + int num_blocks; + png_uint_32 total_size; + png_bytep table; + int i; + png_byte huge * hptr; + + if (ret != NULL) + { + farfree(ret); + ret = NULL; + } + + if (png_ptr->zlib_window_bits > 14) + num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14)); + else + num_blocks = 1; + if (png_ptr->zlib_mem_level >= 7) + num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7)); + else + num_blocks++; + + total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16; + + table = farmalloc(total_size); + + if (table == NULL) + { +#ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out Of Memory."); /* Note "O" and "M" */ + else + png_warning(png_ptr, "Out Of Memory."); +#endif + return (NULL); + } + + if ((png_size_t)table & 0xfff0) + { +#ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, + "Farmalloc didn't return normalized pointer"); + else + png_warning(png_ptr, + "Farmalloc didn't return normalized pointer"); +#endif + return (NULL); + } + + png_ptr->offset_table = table; + png_ptr->offset_table_ptr = farmalloc(num_blocks * + png_sizeof(png_bytep)); + + if (png_ptr->offset_table_ptr == NULL) + { +#ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out Of memory."); /* Note "O" and "M" */ + else + png_warning(png_ptr, "Out Of memory."); +#endif + return (NULL); + } + + hptr = (png_byte huge *)table; + if ((png_size_t)hptr & 0xf) + { + hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L); + hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */ + } + for (i = 0; i < num_blocks; i++) + { + png_ptr->offset_table_ptr[i] = (png_bytep)hptr; + hptr = hptr + (png_uint_32)65536L; /* "+=" fails on TC++3.0 */ + } + + png_ptr->offset_table_number = num_blocks; + png_ptr->offset_table_count = 0; + png_ptr->offset_table_count_free = 0; + } + } + + if (png_ptr->offset_table_count >= png_ptr->offset_table_number) + { +#ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of Memory."); /* Note "o" and "M" */ + else + png_warning(png_ptr, "Out of Memory."); +#endif + return (NULL); + } + + ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++]; + } + else + ret = farmalloc(size); + +#ifndef PNG_USER_MEM_SUPPORTED + if (ret == NULL) + { + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */ + else + png_warning(png_ptr, "Out of memory."); /* Note "o" and "m" */ + } +#endif + + return (ret); +} + +/* Free a pointer allocated by png_malloc(). In the default + * configuration, png_ptr is not used, but is passed in case it + * is needed. If ptr is NULL, return without taking any action. + */ +void PNGAPI +png_free(png_structp png_ptr, png_voidp ptr) +{ + if (png_ptr == NULL || ptr == NULL) + return; + +#ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr->free_fn != NULL) + { + (*(png_ptr->free_fn))(png_ptr, ptr); + return; + } + else + png_free_default(png_ptr, ptr); +} + +void PNGAPI +png_free_default(png_structp png_ptr, png_voidp ptr) +{ +#endif /* PNG_USER_MEM_SUPPORTED */ + + if (png_ptr == NULL || ptr == NULL) + return; + + if (png_ptr->offset_table != NULL) + { + int i; + + for (i = 0; i < png_ptr->offset_table_count; i++) + { + if (ptr == png_ptr->offset_table_ptr[i]) + { + ptr = NULL; + png_ptr->offset_table_count_free++; + break; + } + } + if (png_ptr->offset_table_count_free == png_ptr->offset_table_count) + { + farfree(png_ptr->offset_table); + farfree(png_ptr->offset_table_ptr); + png_ptr->offset_table = NULL; + png_ptr->offset_table_ptr = NULL; + } + } + + if (ptr != NULL) + { + farfree(ptr); + } +} + +#else /* Not the Borland DOS special memory handler */ + +/* Allocate memory for a png_struct or a png_info. The malloc and + memset can be replaced by a single call to calloc() if this is thought + to improve performance noticably. */ +png_voidp /* PRIVATE */ +png_create_struct(int type) +{ +#ifdef PNG_USER_MEM_SUPPORTED + return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL)); +} + +/* Allocate memory for a png_struct or a png_info. The malloc and + memset can be replaced by a single call to calloc() if this is thought + to improve performance noticably. */ +png_voidp /* PRIVATE */ +png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) +{ +#endif /* PNG_USER_MEM_SUPPORTED */ + png_size_t size; + png_voidp struct_ptr; + + if (type == PNG_STRUCT_INFO) + size = png_sizeof(png_info); + else if (type == PNG_STRUCT_PNG) + size = png_sizeof(png_struct); + else + return (NULL); + +#ifdef PNG_USER_MEM_SUPPORTED + if (malloc_fn != NULL) + { + png_struct dummy_struct; + png_structp png_ptr = &dummy_struct; + png_ptr->mem_ptr=mem_ptr; + struct_ptr = (*(malloc_fn))(png_ptr, size); + if (struct_ptr != NULL) + png_memset(struct_ptr, 0, size); + return (struct_ptr); + } +#endif /* PNG_USER_MEM_SUPPORTED */ + +#if defined(__TURBOC__) && !defined(__FLAT__) + struct_ptr = (png_voidp)farmalloc(size); +#else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + struct_ptr = (png_voidp)halloc(size, 1); +# else + struct_ptr = (png_voidp)malloc(size); +# endif +#endif + if (struct_ptr != NULL) + png_memset(struct_ptr, 0, size); + + return (struct_ptr); +} + + +/* Free memory allocated by a png_create_struct() call */ +void /* PRIVATE */ +png_destroy_struct(png_voidp struct_ptr) +{ +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL); +} + +/* Free memory allocated by a png_create_struct() call */ +void /* PRIVATE */ +png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn, + png_voidp mem_ptr) +{ +#endif /* PNG_USER_MEM_SUPPORTED */ + if (struct_ptr != NULL) + { +#ifdef PNG_USER_MEM_SUPPORTED + if (free_fn != NULL) + { + png_struct dummy_struct; + png_structp png_ptr = &dummy_struct; + png_ptr->mem_ptr=mem_ptr; + (*(free_fn))(png_ptr, struct_ptr); + return; + } +#endif /* PNG_USER_MEM_SUPPORTED */ +#if defined(__TURBOC__) && !defined(__FLAT__) + farfree(struct_ptr); +#else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + hfree(struct_ptr); +# else + free(struct_ptr); +# endif +#endif + } +} + +/* Allocate memory. For reasonable files, size should never exceed + * 64K. However, zlib may allocate more then 64K if you don't tell + * it not to. See zconf.h and png.h for more information. zlib does + * need to allocate exactly 64K, so whatever you call here must + * have the ability to do that. + */ + + +png_voidp PNGAPI +png_malloc(png_structp png_ptr, png_uint_32 size) +{ + png_voidp ret; + +#ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr == NULL || size == 0) + return (NULL); + + if (png_ptr->malloc_fn != NULL) + ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size)); + else + ret = (png_malloc_default(png_ptr, size)); + if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of Memory!"); + return (ret); +} + +png_voidp PNGAPI +png_malloc_default(png_structp png_ptr, png_uint_32 size) +{ + png_voidp ret; +#endif /* PNG_USER_MEM_SUPPORTED */ + + if (png_ptr == NULL || size == 0) + return (NULL); + +#ifdef PNG_MAX_MALLOC_64K + if (size > (png_uint_32)65536L) + { +#ifndef PNG_USER_MEM_SUPPORTED + if ((png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Cannot Allocate > 64K"); + else +#endif + return NULL; + } +#endif + + /* Check for overflow */ +#if defined(__TURBOC__) && !defined(__FLAT__) + if (size != (unsigned long)size) + ret = NULL; + else + ret = farmalloc(size); +#else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + if (size != (unsigned long)size) + ret = NULL; + else + ret = halloc(size, 1); +# else + if (size != (size_t)size) + ret = NULL; + else + ret = malloc((size_t)size); +# endif +#endif + +#ifndef PNG_USER_MEM_SUPPORTED + if (ret == NULL && (png_ptr->flags&PNG_FLAG_MALLOC_NULL_MEM_OK) == 0) + png_error(png_ptr, "Out of Memory"); +#endif + + return (ret); +} + +/* Free a pointer allocated by png_malloc(). If ptr is NULL, return + * without taking any action. + */ +void PNGAPI +png_free(png_structp png_ptr, png_voidp ptr) +{ + if (png_ptr == NULL || ptr == NULL) + return; + +#ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr->free_fn != NULL) + { + (*(png_ptr->free_fn))(png_ptr, ptr); + return; + } + else + png_free_default(png_ptr, ptr); +} +void PNGAPI +png_free_default(png_structp png_ptr, png_voidp ptr) +{ + if (png_ptr == NULL || ptr == NULL) + return; + +#endif /* PNG_USER_MEM_SUPPORTED */ + +#if defined(__TURBOC__) && !defined(__FLAT__) + farfree(ptr); +#else +# if defined(_MSC_VER) && defined(MAXSEG_64K) + hfree(ptr); +# else + free(ptr); +# endif +#endif +} + +#endif /* Not Borland DOS special memory handler */ + +#if defined(PNG_1_0_X) +# define png_malloc_warn png_malloc +#else +/* This function was added at libpng version 1.2.3. The png_malloc_warn() + * function will set up png_malloc() to issue a png_warning and return NULL + * instead of issuing a png_error, if it fails to allocate the requested + * memory. + */ +png_voidp PNGAPI +png_malloc_warn(png_structp png_ptr, png_uint_32 size) +{ + png_voidp ptr; + png_uint_32 save_flags; + if (png_ptr == NULL) + return (NULL); + + save_flags = png_ptr->flags; + png_ptr->flags|=PNG_FLAG_MALLOC_NULL_MEM_OK; + ptr = (png_voidp)png_malloc((png_structp)png_ptr, size); + png_ptr->flags=save_flags; + return(ptr); +} +#endif + +png_voidp PNGAPI +png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2, + png_uint_32 length) +{ + png_size_t size; + + size = (png_size_t)length; + if ((png_uint_32)size != length) + png_error(png_ptr, "Overflow in png_memcpy_check."); + + return(png_memcpy (s1, s2, size)); +} + +png_voidp PNGAPI +png_memset_check (png_structp png_ptr, png_voidp s1, int value, + png_uint_32 length) +{ + png_size_t size; + + size = (png_size_t)length; + if ((png_uint_32)size != length) + png_error(png_ptr, "Overflow in png_memset_check."); + + return (png_memset (s1, value, size)); + +} + +#ifdef PNG_USER_MEM_SUPPORTED +/* This function is called when the application wants to use another method + * of allocating and freeing memory. + */ +void PNGAPI +png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr + malloc_fn, png_free_ptr free_fn) +{ + if (png_ptr != NULL) + { + png_ptr->mem_ptr = mem_ptr; + png_ptr->malloc_fn = malloc_fn; + png_ptr->free_fn = free_fn; + } +} + +/* This function returns a pointer to the mem_ptr associated with the user + * functions. The application should free any memory associated with this + * pointer before png_write_destroy and png_read_destroy are called. + */ +png_voidp PNGAPI +png_get_mem_ptr(png_structp png_ptr) +{ + if (png_ptr == NULL) + return (NULL); + return ((png_voidp)png_ptr->mem_ptr); +} +#endif /* PNG_USER_MEM_SUPPORTED */ +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/png/pngpread.c b/third_party/windows/fltk-1.1.10/png/pngpread.c new file mode 100644 index 0000000..3db60f6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngpread.c @@ -0,0 +1,1727 @@ + +/* pngpread.c - read a png file in push mode + * + * Last changed in libpng 1.2.38 [July 16, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +#define PNG_INTERNAL +#include "png.h" +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + +/* Push model modes */ +#define PNG_READ_SIG_MODE 0 +#define PNG_READ_CHUNK_MODE 1 +#define PNG_READ_IDAT_MODE 2 +#define PNG_SKIP_MODE 3 +#define PNG_READ_tEXt_MODE 4 +#define PNG_READ_zTXt_MODE 5 +#define PNG_READ_DONE_MODE 6 +#define PNG_READ_iTXt_MODE 7 +#define PNG_ERROR_MODE 8 + +void PNGAPI +png_process_data(png_structp png_ptr, png_infop info_ptr, + png_bytep buffer, png_size_t buffer_size) +{ + if (png_ptr == NULL || info_ptr == NULL) + return; + + png_push_restore_buffer(png_ptr, buffer, buffer_size); + + while (png_ptr->buffer_size) + { + png_process_some_data(png_ptr, info_ptr); + } +} + +/* What we do with the incoming data depends on what we were previously + * doing before we ran out of data... + */ +void /* PRIVATE */ +png_process_some_data(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr == NULL) + return; + + switch (png_ptr->process_mode) + { + case PNG_READ_SIG_MODE: + { + png_push_read_sig(png_ptr, info_ptr); + break; + } + + case PNG_READ_CHUNK_MODE: + { + png_push_read_chunk(png_ptr, info_ptr); + break; + } + + case PNG_READ_IDAT_MODE: + { + png_push_read_IDAT(png_ptr); + break; + } + +#if defined(PNG_READ_tEXt_SUPPORTED) + case PNG_READ_tEXt_MODE: + { + png_push_read_tEXt(png_ptr, info_ptr); + break; + } + +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) + case PNG_READ_zTXt_MODE: + { + png_push_read_zTXt(png_ptr, info_ptr); + break; + } + +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) + case PNG_READ_iTXt_MODE: + { + png_push_read_iTXt(png_ptr, info_ptr); + break; + } + +#endif + case PNG_SKIP_MODE: + { + png_push_crc_finish(png_ptr); + break; + } + + default: + { + png_ptr->buffer_size = 0; + break; + } + } +} + +/* Read any remaining signature bytes from the stream and compare them with + * the correct PNG signature. It is possible that this routine is called + * with bytes already read from the signature, either because they have been + * checked by the calling application, or because of multiple calls to this + * routine. + */ +void /* PRIVATE */ +png_push_read_sig(png_structp png_ptr, png_infop info_ptr) +{ + png_size_t num_checked = png_ptr->sig_bytes, + num_to_check = 8 - num_checked; + + if (png_ptr->buffer_size < num_to_check) + { + num_to_check = png_ptr->buffer_size; + } + + png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), + num_to_check); + png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check); + + if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) + { + if (num_checked < 4 && + png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) + png_error(png_ptr, "Not a PNG file"); + else + png_error(png_ptr, "PNG file corrupted by ASCII conversion"); + } + else + { + if (png_ptr->sig_bytes >= 8) + { + png_ptr->process_mode = PNG_READ_CHUNK_MODE; + } + } +} + +void /* PRIVATE */ +png_push_read_chunk(png_structp png_ptr, png_infop info_ptr) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_CONST PNG_IHDR; + PNG_CONST PNG_IDAT; + PNG_CONST PNG_IEND; + PNG_CONST PNG_PLTE; +#if defined(PNG_READ_bKGD_SUPPORTED) + PNG_CONST PNG_bKGD; +#endif +#if defined(PNG_READ_cHRM_SUPPORTED) + PNG_CONST PNG_cHRM; +#endif +#if defined(PNG_READ_gAMA_SUPPORTED) + PNG_CONST PNG_gAMA; +#endif +#if defined(PNG_READ_hIST_SUPPORTED) + PNG_CONST PNG_hIST; +#endif +#if defined(PNG_READ_iCCP_SUPPORTED) + PNG_CONST PNG_iCCP; +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) + PNG_CONST PNG_iTXt; +#endif +#if defined(PNG_READ_oFFs_SUPPORTED) + PNG_CONST PNG_oFFs; +#endif +#if defined(PNG_READ_pCAL_SUPPORTED) + PNG_CONST PNG_pCAL; +#endif +#if defined(PNG_READ_pHYs_SUPPORTED) + PNG_CONST PNG_pHYs; +#endif +#if defined(PNG_READ_sBIT_SUPPORTED) + PNG_CONST PNG_sBIT; +#endif +#if defined(PNG_READ_sCAL_SUPPORTED) + PNG_CONST PNG_sCAL; +#endif +#if defined(PNG_READ_sRGB_SUPPORTED) + PNG_CONST PNG_sRGB; +#endif +#if defined(PNG_READ_sPLT_SUPPORTED) + PNG_CONST PNG_sPLT; +#endif +#if defined(PNG_READ_tEXt_SUPPORTED) + PNG_CONST PNG_tEXt; +#endif +#if defined(PNG_READ_tIME_SUPPORTED) + PNG_CONST PNG_tIME; +#endif +#if defined(PNG_READ_tRNS_SUPPORTED) + PNG_CONST PNG_tRNS; +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) + PNG_CONST PNG_zTXt; +#endif +#endif /* PNG_USE_LOCAL_ARRAYS */ + /* First we make sure we have enough data for the 4 byte chunk name + * and the 4 byte chunk length before proceeding with decoding the + * chunk data. To fully decode each of these chunks, we also make + * sure we have enough data in the buffer for the 4 byte CRC at the + * end of every chunk (except IDAT, which is handled separately). + */ + if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) + { + png_byte chunk_length[4]; + + if (png_ptr->buffer_size < 8) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_fill_buffer(png_ptr, chunk_length, 4); + png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); + png_reset_crc(png_ptr); + png_crc_read(png_ptr, png_ptr->chunk_name, 4); + png_check_chunk_name(png_ptr, png_ptr->chunk_name); + png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; + } + + if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + if (png_ptr->mode & PNG_AFTER_IDAT) + png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; + + if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4)) + { + if (png_ptr->push_length != 13) + png_error(png_ptr, "Invalid IHDR length"); + + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); + } + + else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); + + png_ptr->process_mode = PNG_READ_DONE_MODE; + png_push_have_end(png_ptr, info_ptr); + } + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + png_ptr->mode |= PNG_HAVE_IDAT; + + png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); + + if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) + png_ptr->mode |= PNG_HAVE_PLTE; + + else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + { + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before IDAT"); + + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + !(png_ptr->mode & PNG_HAVE_PLTE)) + png_error(png_ptr, "Missing PLTE before IDAT"); + } + } + +#endif + else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); + } + + else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + { + /* If we reach an IDAT chunk, this means we have read all of the + * header chunks, and we can start reading the image (or if this + * is called after the image has been read - we have an error). + */ + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before IDAT"); + + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + !(png_ptr->mode & PNG_HAVE_PLTE)) + png_error(png_ptr, "Missing PLTE before IDAT"); + + if (png_ptr->mode & PNG_HAVE_IDAT) + { + if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) + if (png_ptr->push_length == 0) + return; + + if (png_ptr->mode & PNG_AFTER_IDAT) + png_error(png_ptr, "Too many IDAT's found"); + } + + png_ptr->idat_size = png_ptr->push_length; + png_ptr->mode |= PNG_HAVE_IDAT; + png_ptr->process_mode = PNG_READ_IDAT_MODE; + png_push_have_info(png_ptr, info_ptr); + png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; + png_ptr->zstream.next_out = png_ptr->row_buf; + return; + } + +#if defined(PNG_READ_gAMA_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_sBIT_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_cHRM_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_sRGB_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_iCCP_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_sPLT_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_tRNS_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_bKGD_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_hIST_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_pHYs_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_oFFs_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); + } +#endif + +#if defined(PNG_READ_pCAL_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_sCAL_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_tIME_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_tEXt_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) + else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4)) + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); + } + +#endif + else + { + if (png_ptr->push_length + 4 > png_ptr->buffer_size) + { + png_push_save_buffer(png_ptr); + return; + } + png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length); + } + + png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; +} + +void /* PRIVATE */ +png_push_crc_skip(png_structp png_ptr, png_uint_32 skip) +{ + png_ptr->process_mode = PNG_SKIP_MODE; + png_ptr->skip_length = skip; +} + +void /* PRIVATE */ +png_push_crc_finish(png_structp png_ptr) +{ + if (png_ptr->skip_length && png_ptr->save_buffer_size) + { + png_size_t save_size; + + if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size) + save_size = (png_size_t)png_ptr->skip_length; + else + save_size = png_ptr->save_buffer_size; + + png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); + + png_ptr->skip_length -= save_size; + png_ptr->buffer_size -= save_size; + png_ptr->save_buffer_size -= save_size; + png_ptr->save_buffer_ptr += save_size; + } + if (png_ptr->skip_length && png_ptr->current_buffer_size) + { + png_size_t save_size; + + if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size) + save_size = (png_size_t)png_ptr->skip_length; + else + save_size = png_ptr->current_buffer_size; + + png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); + + png_ptr->skip_length -= save_size; + png_ptr->buffer_size -= save_size; + png_ptr->current_buffer_size -= save_size; + png_ptr->current_buffer_ptr += save_size; + } + if (!png_ptr->skip_length) + { + if (png_ptr->buffer_size < 4) + { + png_push_save_buffer(png_ptr); + return; + } + + png_crc_finish(png_ptr, 0); + png_ptr->process_mode = PNG_READ_CHUNK_MODE; + } +} + +void PNGAPI +png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) +{ + png_bytep ptr; + + if (png_ptr == NULL) + return; + + ptr = buffer; + if (png_ptr->save_buffer_size) + { + png_size_t save_size; + + if (length < png_ptr->save_buffer_size) + save_size = length; + else + save_size = png_ptr->save_buffer_size; + + png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size); + length -= save_size; + ptr += save_size; + png_ptr->buffer_size -= save_size; + png_ptr->save_buffer_size -= save_size; + png_ptr->save_buffer_ptr += save_size; + } + if (length && png_ptr->current_buffer_size) + { + png_size_t save_size; + + if (length < png_ptr->current_buffer_size) + save_size = length; + + else + save_size = png_ptr->current_buffer_size; + + png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size); + png_ptr->buffer_size -= save_size; + png_ptr->current_buffer_size -= save_size; + png_ptr->current_buffer_ptr += save_size; + } +} + +void /* PRIVATE */ +png_push_save_buffer(png_structp png_ptr) +{ + if (png_ptr->save_buffer_size) + { + if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) + { + png_size_t i, istop; + png_bytep sp; + png_bytep dp; + + istop = png_ptr->save_buffer_size; + for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; + i < istop; i++, sp++, dp++) + { + *dp = *sp; + } + } + } + if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > + png_ptr->save_buffer_max) + { + png_size_t new_max; + png_bytep old_buffer; + + if (png_ptr->save_buffer_size > PNG_SIZE_MAX - + (png_ptr->current_buffer_size + 256)) + { + png_error(png_ptr, "Potential overflow of save_buffer"); + } + + new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; + old_buffer = png_ptr->save_buffer; + png_ptr->save_buffer = (png_bytep)png_malloc(png_ptr, + (png_uint_32)new_max); + png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); + png_free(png_ptr, old_buffer); + png_ptr->save_buffer_max = new_max; + } + if (png_ptr->current_buffer_size) + { + png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, + png_ptr->current_buffer_ptr, png_ptr->current_buffer_size); + png_ptr->save_buffer_size += png_ptr->current_buffer_size; + png_ptr->current_buffer_size = 0; + } + png_ptr->save_buffer_ptr = png_ptr->save_buffer; + png_ptr->buffer_size = 0; +} + +void /* PRIVATE */ +png_push_restore_buffer(png_structp png_ptr, png_bytep buffer, + png_size_t buffer_length) +{ + png_ptr->current_buffer = buffer; + png_ptr->current_buffer_size = buffer_length; + png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size; + png_ptr->current_buffer_ptr = png_ptr->current_buffer; +} + +void /* PRIVATE */ +png_push_read_IDAT(png_structp png_ptr) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_CONST PNG_IDAT; +#endif + if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) + { + png_byte chunk_length[4]; + + if (png_ptr->buffer_size < 8) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_fill_buffer(png_ptr, chunk_length, 4); + png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); + png_reset_crc(png_ptr); + png_crc_read(png_ptr, png_ptr->chunk_name, 4); + png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; + + if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + { + png_ptr->process_mode = PNG_READ_CHUNK_MODE; + if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) + png_error(png_ptr, "Not enough compressed data"); + return; + } + + png_ptr->idat_size = png_ptr->push_length; + } + if (png_ptr->idat_size && png_ptr->save_buffer_size) + { + png_size_t save_size; + + if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size) + { + save_size = (png_size_t)png_ptr->idat_size; + + /* Check for overflow */ + if ((png_uint_32)save_size != png_ptr->idat_size) + png_error(png_ptr, "save_size overflowed in pngpread"); + } + else + save_size = png_ptr->save_buffer_size; + + png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); + + if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) + png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); + + png_ptr->idat_size -= save_size; + png_ptr->buffer_size -= save_size; + png_ptr->save_buffer_size -= save_size; + png_ptr->save_buffer_ptr += save_size; + } + if (png_ptr->idat_size && png_ptr->current_buffer_size) + { + png_size_t save_size; + + if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size) + { + save_size = (png_size_t)png_ptr->idat_size; + + /* Check for overflow */ + if ((png_uint_32)save_size != png_ptr->idat_size) + png_error(png_ptr, "save_size overflowed in pngpread"); + } + else + save_size = png_ptr->current_buffer_size; + + png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); + if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) + png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); + + png_ptr->idat_size -= save_size; + png_ptr->buffer_size -= save_size; + png_ptr->current_buffer_size -= save_size; + png_ptr->current_buffer_ptr += save_size; + } + if (!png_ptr->idat_size) + { + if (png_ptr->buffer_size < 4) + { + png_push_save_buffer(png_ptr); + return; + } + + png_crc_finish(png_ptr, 0); + png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; + png_ptr->mode |= PNG_AFTER_IDAT; + } +} + +void /* PRIVATE */ +png_process_IDAT_data(png_structp png_ptr, png_bytep buffer, + png_size_t buffer_length) +{ + int ret; + + if ((png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) && buffer_length) + png_error(png_ptr, "Extra compression data"); + + png_ptr->zstream.next_in = buffer; + png_ptr->zstream.avail_in = (uInt)buffer_length; + for (;;) + { + ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); + if (ret != Z_OK) + { + if (ret == Z_STREAM_END) + { + if (png_ptr->zstream.avail_in) + png_error(png_ptr, "Extra compressed data"); + + if (!(png_ptr->zstream.avail_out)) + { + png_push_process_row(png_ptr); + } + + png_ptr->mode |= PNG_AFTER_IDAT; + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + break; + } + else if (ret == Z_BUF_ERROR) + break; + + else + png_error(png_ptr, "Decompression Error"); + } + if (!(png_ptr->zstream.avail_out)) + { + if (( +#if defined(PNG_READ_INTERLACING_SUPPORTED) + png_ptr->interlaced && png_ptr->pass > 6) || + (!png_ptr->interlaced && +#endif + png_ptr->row_number == png_ptr->num_rows)) + { + if (png_ptr->zstream.avail_in) + png_warning(png_ptr, "Too much data in IDAT chunks"); + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + break; + } + png_push_process_row(png_ptr); + png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; + png_ptr->zstream.next_out = png_ptr->row_buf; + } + + else + break; + } +} + +void /* PRIVATE */ +png_push_process_row(png_structp png_ptr) +{ + png_ptr->row_info.color_type = png_ptr->color_type; + png_ptr->row_info.width = png_ptr->iwidth; + png_ptr->row_info.channels = png_ptr->channels; + png_ptr->row_info.bit_depth = png_ptr->bit_depth; + png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; + + png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, + png_ptr->row_info.width); + + png_read_filter_row(png_ptr, &(png_ptr->row_info), + png_ptr->row_buf + 1, png_ptr->prev_row + 1, + (int)(png_ptr->row_buf[0])); + + png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, + png_ptr->rowbytes + 1); + + if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) + png_do_read_transformations(png_ptr); + +#if defined(PNG_READ_INTERLACING_SUPPORTED) + /* Blow up interlaced rows to full size */ + if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) + { + if (png_ptr->pass < 6) +/* old interface (pre-1.0.9): + png_do_read_interlace(&(png_ptr->row_info), + png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); + */ + png_do_read_interlace(png_ptr); + + switch (png_ptr->pass) + { + case 0: + { + int i; + for (i = 0; i < 8 && png_ptr->pass == 0; i++) + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */ + } + + if (png_ptr->pass == 2) /* Pass 1 might be empty */ + { + for (i = 0; i < 4 && png_ptr->pass == 2; i++) + { + png_push_have_row(png_ptr, png_bytep_NULL); + png_read_push_finish_row(png_ptr); + } + } + + if (png_ptr->pass == 4 && png_ptr->height <= 4) + { + for (i = 0; i < 2 && png_ptr->pass == 4; i++) + { + png_push_have_row(png_ptr, png_bytep_NULL); + png_read_push_finish_row(png_ptr); + } + } + + if (png_ptr->pass == 6 && png_ptr->height <= 4) + { + png_push_have_row(png_ptr, png_bytep_NULL); + png_read_push_finish_row(png_ptr); + } + + break; + } + + case 1: + { + int i; + for (i = 0; i < 8 && png_ptr->pass == 1; i++) + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + } + + if (png_ptr->pass == 2) /* Skip top 4 generated rows */ + { + for (i = 0; i < 4 && png_ptr->pass == 2; i++) + { + png_push_have_row(png_ptr, png_bytep_NULL); + png_read_push_finish_row(png_ptr); + } + } + + break; + } + + case 2: + { + int i; + + for (i = 0; i < 4 && png_ptr->pass == 2; i++) + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + } + + for (i = 0; i < 4 && png_ptr->pass == 2; i++) + { + png_push_have_row(png_ptr, png_bytep_NULL); + png_read_push_finish_row(png_ptr); + } + + if (png_ptr->pass == 4) /* Pass 3 might be empty */ + { + for (i = 0; i < 2 && png_ptr->pass == 4; i++) + { + png_push_have_row(png_ptr, png_bytep_NULL); + png_read_push_finish_row(png_ptr); + } + } + + break; + } + + case 3: + { + int i; + + for (i = 0; i < 4 && png_ptr->pass == 3; i++) + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + } + + if (png_ptr->pass == 4) /* Skip top two generated rows */ + { + for (i = 0; i < 2 && png_ptr->pass == 4; i++) + { + png_push_have_row(png_ptr, png_bytep_NULL); + png_read_push_finish_row(png_ptr); + } + } + + break; + } + + case 4: + { + int i; + + for (i = 0; i < 2 && png_ptr->pass == 4; i++) + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + } + + for (i = 0; i < 2 && png_ptr->pass == 4; i++) + { + png_push_have_row(png_ptr, png_bytep_NULL); + png_read_push_finish_row(png_ptr); + } + + if (png_ptr->pass == 6) /* Pass 5 might be empty */ + { + png_push_have_row(png_ptr, png_bytep_NULL); + png_read_push_finish_row(png_ptr); + } + + break; + } + + case 5: + { + int i; + + for (i = 0; i < 2 && png_ptr->pass == 5; i++) + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + } + + if (png_ptr->pass == 6) /* Skip top generated row */ + { + png_push_have_row(png_ptr, png_bytep_NULL); + png_read_push_finish_row(png_ptr); + } + + break; + } + case 6: + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + + if (png_ptr->pass != 6) + break; + + png_push_have_row(png_ptr, png_bytep_NULL); + png_read_push_finish_row(png_ptr); + } + } + } + else +#endif + { + png_push_have_row(png_ptr, png_ptr->row_buf + 1); + png_read_push_finish_row(png_ptr); + } +} + +void /* PRIVATE */ +png_read_push_finish_row(png_structp png_ptr) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* Start of interlace block */ + PNG_CONST int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; + + /* Offset to next interlace block */ + PNG_CONST int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; + + /* Start of interlace block in the y direction */ + PNG_CONST int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; + + /* Offset to next interlace block in the y direction */ + PNG_CONST int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; + + /* Height of interlace block. This is not currently used - if you need + * it, uncomment it here and in png.h + PNG_CONST int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; + */ +#endif + + png_ptr->row_number++; + if (png_ptr->row_number < png_ptr->num_rows) + return; + +#if defined(PNG_READ_INTERLACING_SUPPORTED) + if (png_ptr->interlaced) + { + png_ptr->row_number = 0; + png_memset_check(png_ptr, png_ptr->prev_row, 0, + png_ptr->rowbytes + 1); + do + { + png_ptr->pass++; + if ((png_ptr->pass == 1 && png_ptr->width < 5) || + (png_ptr->pass == 3 && png_ptr->width < 3) || + (png_ptr->pass == 5 && png_ptr->width < 2)) + png_ptr->pass++; + + if (png_ptr->pass > 7) + png_ptr->pass--; + + if (png_ptr->pass >= 7) + break; + + png_ptr->iwidth = (png_ptr->width + + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; + + png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, + png_ptr->iwidth) + 1; + + if (png_ptr->transformations & PNG_INTERLACE) + break; + + png_ptr->num_rows = (png_ptr->height + + png_pass_yinc[png_ptr->pass] - 1 - + png_pass_ystart[png_ptr->pass]) / + png_pass_yinc[png_ptr->pass]; + + } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); + } +#endif /* PNG_READ_INTERLACING_SUPPORTED */ +} + +#if defined(PNG_READ_tEXt_SUPPORTED) +void /* PRIVATE */ +png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 + length) +{ + if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) + { + png_error(png_ptr, "Out of place tEXt"); + info_ptr = info_ptr; /* To quiet some compiler warnings */ + } + +#ifdef PNG_MAX_MALLOC_64K + png_ptr->skip_length = 0; /* This may not be necessary */ + + if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ + { + png_warning(png_ptr, "tEXt chunk too large to fit in memory"); + png_ptr->skip_length = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_ptr->current_text = (png_charp)png_malloc(png_ptr, + (png_uint_32)(length + 1)); + png_ptr->current_text[length] = '\0'; + png_ptr->current_text_ptr = png_ptr->current_text; + png_ptr->current_text_size = (png_size_t)length; + png_ptr->current_text_left = (png_size_t)length; + png_ptr->process_mode = PNG_READ_tEXt_MODE; +} + +void /* PRIVATE */ +png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr->buffer_size && png_ptr->current_text_left) + { + png_size_t text_size; + + if (png_ptr->buffer_size < png_ptr->current_text_left) + text_size = png_ptr->buffer_size; + + else + text_size = png_ptr->current_text_left; + + png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); + png_ptr->current_text_left -= text_size; + png_ptr->current_text_ptr += text_size; + } + if (!(png_ptr->current_text_left)) + { + png_textp text_ptr; + png_charp text; + png_charp key; + int ret; + + if (png_ptr->buffer_size < 4) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_crc_finish(png_ptr); + +#if defined(PNG_MAX_MALLOC_64K) + if (png_ptr->skip_length) + return; +#endif + + key = png_ptr->current_text; + + for (text = key; *text; text++) + /* Empty loop */ ; + + if (text < key + png_ptr->current_text_size) + text++; + + text_ptr = (png_textp)png_malloc(png_ptr, + (png_uint_32)png_sizeof(png_text)); + text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; + text_ptr->key = key; +#ifdef PNG_iTXt_SUPPORTED + text_ptr->lang = NULL; + text_ptr->lang_key = NULL; +#endif + text_ptr->text = text; + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_free(png_ptr, key); + png_free(png_ptr, text_ptr); + png_ptr->current_text = NULL; + + if (ret) + png_warning(png_ptr, "Insufficient memory to store text chunk."); + } +} +#endif + +#if defined(PNG_READ_zTXt_SUPPORTED) +void /* PRIVATE */ +png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 + length) +{ + if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) + { + png_error(png_ptr, "Out of place zTXt"); + info_ptr = info_ptr; /* To quiet some compiler warnings */ + } + +#ifdef PNG_MAX_MALLOC_64K + /* We can't handle zTXt chunks > 64K, since we don't have enough space + * to be able to store the uncompressed data. Actually, the threshold + * is probably around 32K, but it isn't as definite as 64K is. + */ + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "zTXt chunk too large to fit in memory"); + png_push_crc_skip(png_ptr, length); + return; + } +#endif + + png_ptr->current_text = (png_charp)png_malloc(png_ptr, + (png_uint_32)(length + 1)); + png_ptr->current_text[length] = '\0'; + png_ptr->current_text_ptr = png_ptr->current_text; + png_ptr->current_text_size = (png_size_t)length; + png_ptr->current_text_left = (png_size_t)length; + png_ptr->process_mode = PNG_READ_zTXt_MODE; +} + +void /* PRIVATE */ +png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr->buffer_size && png_ptr->current_text_left) + { + png_size_t text_size; + + if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left) + text_size = png_ptr->buffer_size; + + else + text_size = png_ptr->current_text_left; + + png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); + png_ptr->current_text_left -= text_size; + png_ptr->current_text_ptr += text_size; + } + if (!(png_ptr->current_text_left)) + { + png_textp text_ptr; + png_charp text; + png_charp key; + int ret; + png_size_t text_size, key_size; + + if (png_ptr->buffer_size < 4) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_crc_finish(png_ptr); + + key = png_ptr->current_text; + + for (text = key; *text; text++) + /* Empty loop */ ; + + /* zTXt can't have zero text */ + if (text >= key + png_ptr->current_text_size) + { + png_ptr->current_text = NULL; + png_free(png_ptr, key); + return; + } + + text++; + + if (*text != PNG_TEXT_COMPRESSION_zTXt) /* Check compression byte */ + { + png_ptr->current_text = NULL; + png_free(png_ptr, key); + return; + } + + text++; + + png_ptr->zstream.next_in = (png_bytep )text; + png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size - + (text - key)); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + + key_size = text - key; + text_size = 0; + text = NULL; + ret = Z_STREAM_END; + + while (png_ptr->zstream.avail_in) + { + ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); + if (ret != Z_OK && ret != Z_STREAM_END) + { + inflateReset(&png_ptr->zstream); + png_ptr->zstream.avail_in = 0; + png_ptr->current_text = NULL; + png_free(png_ptr, key); + png_free(png_ptr, text); + return; + } + if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END) + { + if (text == NULL) + { + text = (png_charp)png_malloc(png_ptr, + (png_uint_32)(png_ptr->zbuf_size + - png_ptr->zstream.avail_out + key_size + 1)); + + png_memcpy(text + key_size, png_ptr->zbuf, + png_ptr->zbuf_size - png_ptr->zstream.avail_out); + + png_memcpy(text, key, key_size); + + text_size = key_size + png_ptr->zbuf_size - + png_ptr->zstream.avail_out; + + *(text + text_size) = '\0'; + } + else + { + png_charp tmp; + + tmp = text; + text = (png_charp)png_malloc(png_ptr, text_size + + (png_uint_32)(png_ptr->zbuf_size + - png_ptr->zstream.avail_out + 1)); + + png_memcpy(text, tmp, text_size); + png_free(png_ptr, tmp); + + png_memcpy(text + text_size, png_ptr->zbuf, + png_ptr->zbuf_size - png_ptr->zstream.avail_out); + + text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; + *(text + text_size) = '\0'; + } + if (ret != Z_STREAM_END) + { + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + } + } + else + { + break; + } + + if (ret == Z_STREAM_END) + break; + } + + inflateReset(&png_ptr->zstream); + png_ptr->zstream.avail_in = 0; + + if (ret != Z_STREAM_END) + { + png_ptr->current_text = NULL; + png_free(png_ptr, key); + png_free(png_ptr, text); + return; + } + + png_ptr->current_text = NULL; + png_free(png_ptr, key); + key = text; + text += key_size; + + text_ptr = (png_textp)png_malloc(png_ptr, + (png_uint_32)png_sizeof(png_text)); + text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt; + text_ptr->key = key; +#ifdef PNG_iTXt_SUPPORTED + text_ptr->lang = NULL; + text_ptr->lang_key = NULL; +#endif + text_ptr->text = text; + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_free(png_ptr, key); + png_free(png_ptr, text_ptr); + + if (ret) + png_warning(png_ptr, "Insufficient memory to store text chunk."); + } +} +#endif + +#if defined(PNG_READ_iTXt_SUPPORTED) +void /* PRIVATE */ +png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 + length) +{ + if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND)) + { + png_error(png_ptr, "Out of place iTXt"); + info_ptr = info_ptr; /* To quiet some compiler warnings */ + } + +#ifdef PNG_MAX_MALLOC_64K + png_ptr->skip_length = 0; /* This may not be necessary */ + + if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */ + { + png_warning(png_ptr, "iTXt chunk too large to fit in memory"); + png_ptr->skip_length = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_ptr->current_text = (png_charp)png_malloc(png_ptr, + (png_uint_32)(length + 1)); + png_ptr->current_text[length] = '\0'; + png_ptr->current_text_ptr = png_ptr->current_text; + png_ptr->current_text_size = (png_size_t)length; + png_ptr->current_text_left = (png_size_t)length; + png_ptr->process_mode = PNG_READ_iTXt_MODE; +} + +void /* PRIVATE */ +png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr) +{ + + if (png_ptr->buffer_size && png_ptr->current_text_left) + { + png_size_t text_size; + + if (png_ptr->buffer_size < png_ptr->current_text_left) + text_size = png_ptr->buffer_size; + + else + text_size = png_ptr->current_text_left; + + png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size); + png_ptr->current_text_left -= text_size; + png_ptr->current_text_ptr += text_size; + } + if (!(png_ptr->current_text_left)) + { + png_textp text_ptr; + png_charp key; + int comp_flag; + png_charp lang; + png_charp lang_key; + png_charp text; + int ret; + + if (png_ptr->buffer_size < 4) + { + png_push_save_buffer(png_ptr); + return; + } + + png_push_crc_finish(png_ptr); + +#if defined(PNG_MAX_MALLOC_64K) + if (png_ptr->skip_length) + return; +#endif + + key = png_ptr->current_text; + + for (lang = key; *lang; lang++) + /* Empty loop */ ; + + if (lang < key + png_ptr->current_text_size - 3) + lang++; + + comp_flag = *lang++; + lang++; /* Skip comp_type, always zero */ + + for (lang_key = lang; *lang_key; lang_key++) + /* Empty loop */ ; + + lang_key++; /* Skip NUL separator */ + + text=lang_key; + + if (lang_key < key + png_ptr->current_text_size - 1) + { + for (; *text; text++) + /* Empty loop */ ; + } + + if (text < key + png_ptr->current_text_size) + text++; + + text_ptr = (png_textp)png_malloc(png_ptr, + (png_uint_32)png_sizeof(png_text)); + + text_ptr->compression = comp_flag + 2; + text_ptr->key = key; + text_ptr->lang = lang; + text_ptr->lang_key = lang_key; + text_ptr->text = text; + text_ptr->text_length = 0; + text_ptr->itxt_length = png_strlen(text); + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_ptr->current_text = NULL; + + png_free(png_ptr, text_ptr); + if (ret) + png_warning(png_ptr, "Insufficient memory to store iTXt chunk."); + } +} +#endif + +/* This function is called when we haven't found a handler for this + * chunk. If there isn't a problem with the chunk itself (ie a bad chunk + * name or a critical chunk), the chunk is (currently) silently ignored. + */ +void /* PRIVATE */ +png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 + length) +{ + png_uint_32 skip = 0; + + if (!(png_ptr->chunk_name[0] & 0x20)) + { +#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) + if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != + PNG_HANDLE_CHUNK_ALWAYS +#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) + && png_ptr->read_user_chunk_fn == NULL +#endif + ) +#endif + png_chunk_error(png_ptr, "unknown critical chunk"); + + info_ptr = info_ptr; /* To quiet some compiler warnings */ + } + +#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) + if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) + { +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "unknown chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + png_memcpy((png_charp)png_ptr->unknown_chunk.name, + (png_charp)png_ptr->chunk_name, + png_sizeof(png_ptr->unknown_chunk.name)); + png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name) - 1] + = '\0'; + + png_ptr->unknown_chunk.size = (png_size_t)length; + + if (length == 0) + png_ptr->unknown_chunk.data = NULL; + + else + { + png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, + (png_uint_32)length); + png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); + } + +#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) + if (png_ptr->read_user_chunk_fn != NULL) + { + /* Callback to user unknown chunk handler */ + int ret; + ret = (*(png_ptr->read_user_chunk_fn)) + (png_ptr, &png_ptr->unknown_chunk); + + if (ret < 0) + png_chunk_error(png_ptr, "error in user chunk"); + + if (ret == 0) + { + if (!(png_ptr->chunk_name[0] & 0x20)) + if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != + PNG_HANDLE_CHUNK_ALWAYS) + png_chunk_error(png_ptr, "unknown critical chunk"); + png_set_unknown_chunks(png_ptr, info_ptr, + &png_ptr->unknown_chunk, 1); + } + } + + else +#endif + png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); + png_free(png_ptr, png_ptr->unknown_chunk.data); + png_ptr->unknown_chunk.data = NULL; + } + + else +#endif + skip=length; + png_push_crc_skip(png_ptr, skip); +} + +void /* PRIVATE */ +png_push_have_info(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr->info_fn != NULL) + (*(png_ptr->info_fn))(png_ptr, info_ptr); +} + +void /* PRIVATE */ +png_push_have_end(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr->end_fn != NULL) + (*(png_ptr->end_fn))(png_ptr, info_ptr); +} + +void /* PRIVATE */ +png_push_have_row(png_structp png_ptr, png_bytep row) +{ + if (png_ptr->row_fn != NULL) + (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number, + (int)png_ptr->pass); +} + +void PNGAPI +png_progressive_combine_row (png_structp png_ptr, + png_bytep old_row, png_bytep new_row) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_CONST int FARDATA png_pass_dsp_mask[7] = + {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff}; +#endif + if (png_ptr == NULL) + return; + + if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */ + png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]); +} + +void PNGAPI +png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr, + png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, + png_progressive_end_ptr end_fn) +{ + if (png_ptr == NULL) + return; + + png_ptr->info_fn = info_fn; + png_ptr->row_fn = row_fn; + png_ptr->end_fn = end_fn; + + png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); +} + +png_voidp PNGAPI +png_get_progressive_ptr(png_structp png_ptr) +{ + if (png_ptr == NULL) + return (NULL); + + return png_ptr->io_ptr; +} +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/png/pngread.c b/third_party/windows/fltk-1.1.10/png/pngread.c new file mode 100644 index 0000000..ce3245c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngread.c @@ -0,0 +1,1473 @@ + +/* pngread.c - read a PNG file + * + * Last changed in libpng 1.2.37 [June 4, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file contains routines that an application calls directly to + * read a PNG file or stream. + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) + +/* Create a PNG structure for reading, and allocate any memory needed. */ +png_structp PNGAPI +png_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn) +{ + +#ifdef PNG_USER_MEM_SUPPORTED + return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn, + warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); +} + +/* Alternate create PNG structure for reading, and allocate any memory needed. */ +png_structp PNGAPI +png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn) +{ +#endif /* PNG_USER_MEM_SUPPORTED */ + +#ifdef PNG_SETJMP_SUPPORTED + volatile +#endif + png_structp png_ptr; + +#ifdef PNG_SETJMP_SUPPORTED +#ifdef USE_FAR_KEYWORD + jmp_buf jmpbuf; +#endif +#endif + + int i; + + png_debug(1, "in png_create_read_struct"); +#ifdef PNG_USER_MEM_SUPPORTED + png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, + (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); +#else + png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); +#endif + if (png_ptr == NULL) + return (NULL); + + /* Added at libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + png_ptr->user_width_max=PNG_USER_WIDTH_MAX; + png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; +#endif + +#ifdef PNG_SETJMP_SUPPORTED +#ifdef USE_FAR_KEYWORD + if (setjmp(jmpbuf)) +#else + if (setjmp(png_ptr->jmpbuf)) +#endif + { + png_free(png_ptr, png_ptr->zbuf); + png_ptr->zbuf = NULL; +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)png_ptr, + (png_free_ptr)free_fn, (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)png_ptr); +#endif + return (NULL); + } +#ifdef USE_FAR_KEYWORD + png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf)); +#endif +#endif + +#ifdef PNG_USER_MEM_SUPPORTED + png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); +#endif + + png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); + + if (user_png_ver) + { + i = 0; + do + { + if (user_png_ver[i] != png_libpng_ver[i]) + png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; + } while (png_libpng_ver[i++]); + } + else + png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; + + + if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) + { + /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so + * we must recompile any applications that use any older library version. + * For versions after libpng 1.0, we will be compatible, so we need + * only check the first digit. + */ + if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || + (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || + (user_png_ver[0] == '0' && user_png_ver[2] < '9')) + { +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + char msg[80]; + if (user_png_ver) + { + png_snprintf(msg, 80, + "Application was compiled with png.h from libpng-%.20s", + user_png_ver); + png_warning(png_ptr, msg); + } + png_snprintf(msg, 80, + "Application is running with png.c from libpng-%.20s", + png_libpng_ver); + png_warning(png_ptr, msg); +#endif +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + png_ptr->flags = 0; +#endif + png_error(png_ptr, + "Incompatible libpng version in application and library"); + } + } + + /* Initialize zbuf - compression buffer */ + png_ptr->zbuf_size = PNG_ZBUF_SIZE; + png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, + (png_uint_32)png_ptr->zbuf_size); + png_ptr->zstream.zalloc = png_zalloc; + png_ptr->zstream.zfree = png_zfree; + png_ptr->zstream.opaque = (voidpf)png_ptr; + + switch (inflateInit(&png_ptr->zstream)) + { + case Z_OK: /* Do nothing */ break; + case Z_MEM_ERROR: + case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break; + case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error"); break; + default: png_error(png_ptr, "Unknown zlib error"); + } + + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + + png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); + +#ifdef PNG_SETJMP_SUPPORTED +/* Applications that neglect to set up their own setjmp() and then encounter + a png_error() will longjmp here. Since the jmpbuf is then meaningless we + abort instead of returning. */ +#ifdef USE_FAR_KEYWORD + if (setjmp(jmpbuf)) + PNG_ABORT(); + png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf)); +#else + if (setjmp(png_ptr->jmpbuf)) + PNG_ABORT(); +#endif +#endif + return (png_ptr); +} + +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +/* Initialize PNG structure for reading, and allocate any memory needed. + This interface is deprecated in favour of the png_create_read_struct(), + and it will disappear as of libpng-1.3.0. */ +#undef png_read_init +void PNGAPI +png_read_init(png_structp png_ptr) +{ + /* We only come here via pre-1.0.7-compiled applications */ + png_read_init_2(png_ptr, "1.0.6 or earlier", 0, 0); +} + +void PNGAPI +png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver, + png_size_t png_struct_size, png_size_t png_info_size) +{ + /* We only come here via pre-1.0.12-compiled applications */ + if (png_ptr == NULL) + return; +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + if (png_sizeof(png_struct) > png_struct_size || + png_sizeof(png_info) > png_info_size) + { + char msg[80]; + png_ptr->warning_fn = NULL; + if (user_png_ver) + { + png_snprintf(msg, 80, + "Application was compiled with png.h from libpng-%.20s", + user_png_ver); + png_warning(png_ptr, msg); + } + png_snprintf(msg, 80, + "Application is running with png.c from libpng-%.20s", + png_libpng_ver); + png_warning(png_ptr, msg); + } +#endif + if (png_sizeof(png_struct) > png_struct_size) + { + png_ptr->error_fn = NULL; +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + png_ptr->flags = 0; +#endif + png_error(png_ptr, + "The png struct allocated by the application for reading is too small."); + } + if (png_sizeof(png_info) > png_info_size) + { + png_ptr->error_fn = NULL; +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + png_ptr->flags = 0; +#endif + png_error(png_ptr, + "The info struct allocated by application for reading is too small."); + } + png_read_init_3(&png_ptr, user_png_ver, png_struct_size); +} +#endif /* PNG_1_0_X || PNG_1_2_X */ + +void PNGAPI +png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, + png_size_t png_struct_size) +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf tmp_jmp; /* to save current jump buffer */ +#endif + + int i = 0; + + png_structp png_ptr=*ptr_ptr; + + if (png_ptr == NULL) + return; + + do + { + if (user_png_ver[i] != png_libpng_ver[i]) + { +#ifdef PNG_LEGACY_SUPPORTED + png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; +#else + png_ptr->warning_fn = NULL; + png_warning(png_ptr, + "Application uses deprecated png_read_init() and should be recompiled."); + break; +#endif + } + } while (png_libpng_ver[i++]); + + png_debug(1, "in png_read_init_3"); + +#ifdef PNG_SETJMP_SUPPORTED + /* Save jump buffer and error functions */ + png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); +#endif + + if (png_sizeof(png_struct) > png_struct_size) + { + png_destroy_struct(png_ptr); + *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); + png_ptr = *ptr_ptr; + } + + /* Reset all variables to 0 */ + png_memset(png_ptr, 0, png_sizeof(png_struct)); + +#ifdef PNG_SETJMP_SUPPORTED + /* Restore jump buffer */ + png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); +#endif + + /* Added at libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + png_ptr->user_width_max=PNG_USER_WIDTH_MAX; + png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; +#endif + + /* Initialize zbuf - compression buffer */ + png_ptr->zbuf_size = PNG_ZBUF_SIZE; + png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, + (png_uint_32)png_ptr->zbuf_size); + png_ptr->zstream.zalloc = png_zalloc; + png_ptr->zstream.zfree = png_zfree; + png_ptr->zstream.opaque = (voidpf)png_ptr; + + switch (inflateInit(&png_ptr->zstream)) + { + case Z_OK: /* Do nothing */ break; + case Z_MEM_ERROR: + case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory"); break; + case Z_VERSION_ERROR: png_error(png_ptr, "zlib version"); break; + default: png_error(png_ptr, "Unknown zlib error"); + } + + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + + png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL); +} + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Read the information before the actual image data. This has been + * changed in v0.90 to allow reading a file that already has the magic + * bytes read from the stream. You can tell libpng how many bytes have + * been read from the beginning of the stream (up to the maximum of 8) + * via png_set_sig_bytes(), and we will only check the remaining bytes + * here. The application can then have access to the signature bytes we + * read if it is determined that this isn't a valid PNG file. + */ +void PNGAPI +png_read_info(png_structp png_ptr, png_infop info_ptr) +{ + if (png_ptr == NULL || info_ptr == NULL) + return; + png_debug(1, "in png_read_info"); + /* If we haven't checked all of the PNG signature bytes, do so now. */ + if (png_ptr->sig_bytes < 8) + { + png_size_t num_checked = png_ptr->sig_bytes, + num_to_check = 8 - num_checked; + + png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check); + png_ptr->sig_bytes = 8; + + if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) + { + if (num_checked < 4 && + png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) + png_error(png_ptr, "Not a PNG file"); + else + png_error(png_ptr, "PNG file corrupted by ASCII conversion"); + } + if (num_checked < 3) + png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; + } + + for (;;) + { +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_CONST PNG_IHDR; + PNG_CONST PNG_IDAT; + PNG_CONST PNG_IEND; + PNG_CONST PNG_PLTE; +#if defined(PNG_READ_bKGD_SUPPORTED) + PNG_CONST PNG_bKGD; +#endif +#if defined(PNG_READ_cHRM_SUPPORTED) + PNG_CONST PNG_cHRM; +#endif +#if defined(PNG_READ_gAMA_SUPPORTED) + PNG_CONST PNG_gAMA; +#endif +#if defined(PNG_READ_hIST_SUPPORTED) + PNG_CONST PNG_hIST; +#endif +#if defined(PNG_READ_iCCP_SUPPORTED) + PNG_CONST PNG_iCCP; +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) + PNG_CONST PNG_iTXt; +#endif +#if defined(PNG_READ_oFFs_SUPPORTED) + PNG_CONST PNG_oFFs; +#endif +#if defined(PNG_READ_pCAL_SUPPORTED) + PNG_CONST PNG_pCAL; +#endif +#if defined(PNG_READ_pHYs_SUPPORTED) + PNG_CONST PNG_pHYs; +#endif +#if defined(PNG_READ_sBIT_SUPPORTED) + PNG_CONST PNG_sBIT; +#endif +#if defined(PNG_READ_sCAL_SUPPORTED) + PNG_CONST PNG_sCAL; +#endif +#if defined(PNG_READ_sPLT_SUPPORTED) + PNG_CONST PNG_sPLT; +#endif +#if defined(PNG_READ_sRGB_SUPPORTED) + PNG_CONST PNG_sRGB; +#endif +#if defined(PNG_READ_tEXt_SUPPORTED) + PNG_CONST PNG_tEXt; +#endif +#if defined(PNG_READ_tIME_SUPPORTED) + PNG_CONST PNG_tIME; +#endif +#if defined(PNG_READ_tRNS_SUPPORTED) + PNG_CONST PNG_tRNS; +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) + PNG_CONST PNG_zTXt; +#endif +#endif /* PNG_USE_LOCAL_ARRAYS */ + png_uint_32 length = png_read_chunk_header(png_ptr); + PNG_CONST png_bytep chunk_name = png_ptr->chunk_name; + + /* This should be a binary subdivision search or a hash for + * matching the chunk name rather than a linear search. + */ + if (!png_memcmp(chunk_name, png_IDAT, 4)) + if (png_ptr->mode & PNG_AFTER_IDAT) + png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; + + if (!png_memcmp(chunk_name, png_IHDR, 4)) + png_handle_IHDR(png_ptr, info_ptr, length); + else if (!png_memcmp(chunk_name, png_IEND, 4)) + png_handle_IEND(png_ptr, info_ptr, length); +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + else if (png_handle_as_unknown(png_ptr, chunk_name)) + { + if (!png_memcmp(chunk_name, png_IDAT, 4)) + png_ptr->mode |= PNG_HAVE_IDAT; + png_handle_unknown(png_ptr, info_ptr, length); + if (!png_memcmp(chunk_name, png_PLTE, 4)) + png_ptr->mode |= PNG_HAVE_PLTE; + else if (!png_memcmp(chunk_name, png_IDAT, 4)) + { + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before IDAT"); + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + !(png_ptr->mode & PNG_HAVE_PLTE)) + png_error(png_ptr, "Missing PLTE before IDAT"); + break; + } + } +#endif + else if (!png_memcmp(chunk_name, png_PLTE, 4)) + png_handle_PLTE(png_ptr, info_ptr, length); + else if (!png_memcmp(chunk_name, png_IDAT, 4)) + { + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before IDAT"); + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + !(png_ptr->mode & PNG_HAVE_PLTE)) + png_error(png_ptr, "Missing PLTE before IDAT"); + + png_ptr->idat_size = length; + png_ptr->mode |= PNG_HAVE_IDAT; + break; + } +#if defined(PNG_READ_bKGD_SUPPORTED) + else if (!png_memcmp(chunk_name, png_bKGD, 4)) + png_handle_bKGD(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_cHRM_SUPPORTED) + else if (!png_memcmp(chunk_name, png_cHRM, 4)) + png_handle_cHRM(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_gAMA_SUPPORTED) + else if (!png_memcmp(chunk_name, png_gAMA, 4)) + png_handle_gAMA(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_hIST_SUPPORTED) + else if (!png_memcmp(chunk_name, png_hIST, 4)) + png_handle_hIST(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_oFFs_SUPPORTED) + else if (!png_memcmp(chunk_name, png_oFFs, 4)) + png_handle_oFFs(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_pCAL_SUPPORTED) + else if (!png_memcmp(chunk_name, png_pCAL, 4)) + png_handle_pCAL(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sCAL_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sCAL, 4)) + png_handle_sCAL(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_pHYs_SUPPORTED) + else if (!png_memcmp(chunk_name, png_pHYs, 4)) + png_handle_pHYs(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sBIT_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sBIT, 4)) + png_handle_sBIT(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sRGB_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sRGB, 4)) + png_handle_sRGB(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_iCCP_SUPPORTED) + else if (!png_memcmp(chunk_name, png_iCCP, 4)) + png_handle_iCCP(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sPLT_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sPLT, 4)) + png_handle_sPLT(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_tEXt_SUPPORTED) + else if (!png_memcmp(chunk_name, png_tEXt, 4)) + png_handle_tEXt(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_tIME_SUPPORTED) + else if (!png_memcmp(chunk_name, png_tIME, 4)) + png_handle_tIME(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_tRNS_SUPPORTED) + else if (!png_memcmp(chunk_name, png_tRNS, 4)) + png_handle_tRNS(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) + else if (!png_memcmp(chunk_name, png_zTXt, 4)) + png_handle_zTXt(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) + else if (!png_memcmp(chunk_name, png_iTXt, 4)) + png_handle_iTXt(png_ptr, info_ptr, length); +#endif + else + png_handle_unknown(png_ptr, info_ptr, length); + } +} +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ + +/* Optional call to update the users info_ptr structure */ +void PNGAPI +png_read_update_info(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_read_update_info"); + if (png_ptr == NULL) + return; + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + png_read_start_row(png_ptr); + else + png_warning(png_ptr, + "Ignoring extra png_read_update_info() call; row buffer not reallocated"); + png_read_transform_info(png_ptr, info_ptr); +} + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Initialize palette, background, etc, after transformations + * are set, but before any reading takes place. This allows + * the user to obtain a gamma-corrected palette, for example. + * If the user doesn't call this, we will do it ourselves. + */ +void PNGAPI +png_start_read_image(png_structp png_ptr) +{ + png_debug(1, "in png_start_read_image"); + if (png_ptr == NULL) + return; + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + png_read_start_row(png_ptr); +} +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +void PNGAPI +png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_CONST PNG_IDAT; + PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, + 0xff}; + PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff}; +#endif + int ret; + if (png_ptr == NULL) + return; + png_debug2(1, "in png_read_row (row %lu, pass %d)", + png_ptr->row_number, png_ptr->pass); + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + png_read_start_row(png_ptr); + if (png_ptr->row_number == 0 && png_ptr->pass == 0) + { + /* Check for transforms that have been set but were defined out */ +#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED) + if (png_ptr->transformations & PNG_INVERT_MONO) + png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined."); +#endif +#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED) + if (png_ptr->transformations & PNG_FILLER) + png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined."); +#endif +#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && !defined(PNG_READ_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined."); +#endif +#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED) + if (png_ptr->transformations & PNG_PACK) + png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined."); +#endif +#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) + if (png_ptr->transformations & PNG_SHIFT) + png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined."); +#endif +#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED) + if (png_ptr->transformations & PNG_BGR) + png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined."); +#endif +#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED) + if (png_ptr->transformations & PNG_SWAP_BYTES) + png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined."); +#endif + } + +#if defined(PNG_READ_INTERLACING_SUPPORTED) + /* If interlaced and we do not need a new row, combine row and return */ + if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) + { + switch (png_ptr->pass) + { + case 0: + if (png_ptr->row_number & 0x07) + { + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); + return; + } + break; + case 1: + if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) + { + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); + return; + } + break; + case 2: + if ((png_ptr->row_number & 0x07) != 4) + { + if (dsp_row != NULL && (png_ptr->row_number & 4)) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); + return; + } + break; + case 3: + if ((png_ptr->row_number & 3) || png_ptr->width < 3) + { + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); + return; + } + break; + case 4: + if ((png_ptr->row_number & 3) != 2) + { + if (dsp_row != NULL && (png_ptr->row_number & 2)) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); + return; + } + break; + case 5: + if ((png_ptr->row_number & 1) || png_ptr->width < 2) + { + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + png_read_finish_row(png_ptr); + return; + } + break; + case 6: + if (!(png_ptr->row_number & 1)) + { + png_read_finish_row(png_ptr); + return; + } + break; + } + } +#endif + + if (!(png_ptr->mode & PNG_HAVE_IDAT)) + png_error(png_ptr, "Invalid attempt to read row data"); + + png_ptr->zstream.next_out = png_ptr->row_buf; + png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes; + do + { + if (!(png_ptr->zstream.avail_in)) + { + while (!png_ptr->idat_size) + { + png_crc_finish(png_ptr, 0); + + png_ptr->idat_size = png_read_chunk_header(png_ptr); + if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + png_error(png_ptr, "Not enough image data"); + } + png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.next_in = png_ptr->zbuf; + if (png_ptr->zbuf_size > png_ptr->idat_size) + png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; + png_crc_read(png_ptr, png_ptr->zbuf, + (png_size_t)png_ptr->zstream.avail_in); + png_ptr->idat_size -= png_ptr->zstream.avail_in; + } + ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); + if (ret == Z_STREAM_END) + { + if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in || + png_ptr->idat_size) + png_error(png_ptr, "Extra compressed data"); + png_ptr->mode |= PNG_AFTER_IDAT; + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + break; + } + if (ret != Z_OK) + png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : + "Decompression error"); + + } while (png_ptr->zstream.avail_out); + + png_ptr->row_info.color_type = png_ptr->color_type; + png_ptr->row_info.width = png_ptr->iwidth; + png_ptr->row_info.channels = png_ptr->channels; + png_ptr->row_info.bit_depth = png_ptr->bit_depth; + png_ptr->row_info.pixel_depth = png_ptr->pixel_depth; + png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, + png_ptr->row_info.width); + + if (png_ptr->row_buf[0]) + png_read_filter_row(png_ptr, &(png_ptr->row_info), + png_ptr->row_buf + 1, png_ptr->prev_row + 1, + (int)(png_ptr->row_buf[0])); + + png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf, + png_ptr->rowbytes + 1); + +#if defined(PNG_MNG_FEATURES_SUPPORTED) + if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) + { + /* Intrapixel differencing */ + png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); + } +#endif + + + if (png_ptr->transformations || (png_ptr->flags&PNG_FLAG_STRIP_ALPHA)) + png_do_read_transformations(png_ptr); + +#if defined(PNG_READ_INTERLACING_SUPPORTED) + /* Blow up interlaced rows to full size */ + if (png_ptr->interlaced && + (png_ptr->transformations & PNG_INTERLACE)) + { + if (png_ptr->pass < 6) + /* Old interface (pre-1.0.9): + * png_do_read_interlace(&(png_ptr->row_info), + * png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations); + */ + png_do_read_interlace(png_ptr); + + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, + png_pass_dsp_mask[png_ptr->pass]); + if (row != NULL) + png_combine_row(png_ptr, row, + png_pass_mask[png_ptr->pass]); + } + else +#endif + { + if (row != NULL) + png_combine_row(png_ptr, row, 0xff); + if (dsp_row != NULL) + png_combine_row(png_ptr, dsp_row, 0xff); + } + png_read_finish_row(png_ptr); + + if (png_ptr->read_row_fn != NULL) + (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); +} +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Read one or more rows of image data. If the image is interlaced, + * and png_set_interlace_handling() has been called, the rows need to + * contain the contents of the rows from the previous pass. If the + * image has alpha or transparency, and png_handle_alpha()[*] has been + * called, the rows contents must be initialized to the contents of the + * screen. + * + * "row" holds the actual image, and pixels are placed in it + * as they arrive. If the image is displayed after each pass, it will + * appear to "sparkle" in. "display_row" can be used to display a + * "chunky" progressive image, with finer detail added as it becomes + * available. If you do not want this "chunky" display, you may pass + * NULL for display_row. If you do not want the sparkle display, and + * you have not called png_handle_alpha(), you may pass NULL for rows. + * If you have called png_handle_alpha(), and the image has either an + * alpha channel or a transparency chunk, you must provide a buffer for + * rows. In this case, you do not have to provide a display_row buffer + * also, but you may. If the image is not interlaced, or if you have + * not called png_set_interlace_handling(), the display_row buffer will + * be ignored, so pass NULL to it. + * + * [*] png_handle_alpha() does not exist yet, as of this version of libpng + */ + +void PNGAPI +png_read_rows(png_structp png_ptr, png_bytepp row, + png_bytepp display_row, png_uint_32 num_rows) +{ + png_uint_32 i; + png_bytepp rp; + png_bytepp dp; + + png_debug(1, "in png_read_rows"); + if (png_ptr == NULL) + return; + rp = row; + dp = display_row; + if (rp != NULL && dp != NULL) + for (i = 0; i < num_rows; i++) + { + png_bytep rptr = *rp++; + png_bytep dptr = *dp++; + + png_read_row(png_ptr, rptr, dptr); + } + else if (rp != NULL) + for (i = 0; i < num_rows; i++) + { + png_bytep rptr = *rp; + png_read_row(png_ptr, rptr, png_bytep_NULL); + rp++; + } + else if (dp != NULL) + for (i = 0; i < num_rows; i++) + { + png_bytep dptr = *dp; + png_read_row(png_ptr, png_bytep_NULL, dptr); + dp++; + } +} +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Read the entire image. If the image has an alpha channel or a tRNS + * chunk, and you have called png_handle_alpha()[*], you will need to + * initialize the image to the current image that PNG will be overlaying. + * We set the num_rows again here, in case it was incorrectly set in + * png_read_start_row() by a call to png_read_update_info() or + * png_start_read_image() if png_set_interlace_handling() wasn't called + * prior to either of these functions like it should have been. You can + * only call this function once. If you desire to have an image for + * each pass of a interlaced image, use png_read_rows() instead. + * + * [*] png_handle_alpha() does not exist yet, as of this version of libpng + */ +void PNGAPI +png_read_image(png_structp png_ptr, png_bytepp image) +{ + png_uint_32 i, image_height; + int pass, j; + png_bytepp rp; + + png_debug(1, "in png_read_image"); + if (png_ptr == NULL) + return; + +#ifdef PNG_READ_INTERLACING_SUPPORTED + pass = png_set_interlace_handling(png_ptr); +#else + if (png_ptr->interlaced) + png_error(png_ptr, + "Cannot read interlaced image -- interlace handler disabled."); + pass = 1; +#endif + + + image_height=png_ptr->height; + png_ptr->num_rows = image_height; /* Make sure this is set correctly */ + + for (j = 0; j < pass; j++) + { + rp = image; + for (i = 0; i < image_height; i++) + { + png_read_row(png_ptr, *rp, png_bytep_NULL); + rp++; + } + } +} +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* Read the end of the PNG file. Will not read past the end of the + * file, will verify the end is accurate, and will read any comments + * or time information at the end of the file, if info is not NULL. + */ +void PNGAPI +png_read_end(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_read_end"); + if (png_ptr == NULL) + return; + png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */ + + do + { +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_CONST PNG_IHDR; + PNG_CONST PNG_IDAT; + PNG_CONST PNG_IEND; + PNG_CONST PNG_PLTE; +#if defined(PNG_READ_bKGD_SUPPORTED) + PNG_CONST PNG_bKGD; +#endif +#if defined(PNG_READ_cHRM_SUPPORTED) + PNG_CONST PNG_cHRM; +#endif +#if defined(PNG_READ_gAMA_SUPPORTED) + PNG_CONST PNG_gAMA; +#endif +#if defined(PNG_READ_hIST_SUPPORTED) + PNG_CONST PNG_hIST; +#endif +#if defined(PNG_READ_iCCP_SUPPORTED) + PNG_CONST PNG_iCCP; +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) + PNG_CONST PNG_iTXt; +#endif +#if defined(PNG_READ_oFFs_SUPPORTED) + PNG_CONST PNG_oFFs; +#endif +#if defined(PNG_READ_pCAL_SUPPORTED) + PNG_CONST PNG_pCAL; +#endif +#if defined(PNG_READ_pHYs_SUPPORTED) + PNG_CONST PNG_pHYs; +#endif +#if defined(PNG_READ_sBIT_SUPPORTED) + PNG_CONST PNG_sBIT; +#endif +#if defined(PNG_READ_sCAL_SUPPORTED) + PNG_CONST PNG_sCAL; +#endif +#if defined(PNG_READ_sPLT_SUPPORTED) + PNG_CONST PNG_sPLT; +#endif +#if defined(PNG_READ_sRGB_SUPPORTED) + PNG_CONST PNG_sRGB; +#endif +#if defined(PNG_READ_tEXt_SUPPORTED) + PNG_CONST PNG_tEXt; +#endif +#if defined(PNG_READ_tIME_SUPPORTED) + PNG_CONST PNG_tIME; +#endif +#if defined(PNG_READ_tRNS_SUPPORTED) + PNG_CONST PNG_tRNS; +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) + PNG_CONST PNG_zTXt; +#endif +#endif /* PNG_USE_LOCAL_ARRAYS */ + png_uint_32 length = png_read_chunk_header(png_ptr); + PNG_CONST png_bytep chunk_name = png_ptr->chunk_name; + + if (!png_memcmp(chunk_name, png_IHDR, 4)) + png_handle_IHDR(png_ptr, info_ptr, length); + else if (!png_memcmp(chunk_name, png_IEND, 4)) + png_handle_IEND(png_ptr, info_ptr, length); +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED + else if (png_handle_as_unknown(png_ptr, chunk_name)) + { + if (!png_memcmp(chunk_name, png_IDAT, 4)) + { + if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) + png_error(png_ptr, "Too many IDAT's found"); + } + png_handle_unknown(png_ptr, info_ptr, length); + if (!png_memcmp(chunk_name, png_PLTE, 4)) + png_ptr->mode |= PNG_HAVE_PLTE; + } +#endif + else if (!png_memcmp(chunk_name, png_IDAT, 4)) + { + /* Zero length IDATs are legal after the last IDAT has been + * read, but not after other chunks have been read. + */ + if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) + png_error(png_ptr, "Too many IDAT's found"); + png_crc_finish(png_ptr, length); + } + else if (!png_memcmp(chunk_name, png_PLTE, 4)) + png_handle_PLTE(png_ptr, info_ptr, length); +#if defined(PNG_READ_bKGD_SUPPORTED) + else if (!png_memcmp(chunk_name, png_bKGD, 4)) + png_handle_bKGD(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_cHRM_SUPPORTED) + else if (!png_memcmp(chunk_name, png_cHRM, 4)) + png_handle_cHRM(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_gAMA_SUPPORTED) + else if (!png_memcmp(chunk_name, png_gAMA, 4)) + png_handle_gAMA(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_hIST_SUPPORTED) + else if (!png_memcmp(chunk_name, png_hIST, 4)) + png_handle_hIST(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_oFFs_SUPPORTED) + else if (!png_memcmp(chunk_name, png_oFFs, 4)) + png_handle_oFFs(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_pCAL_SUPPORTED) + else if (!png_memcmp(chunk_name, png_pCAL, 4)) + png_handle_pCAL(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sCAL_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sCAL, 4)) + png_handle_sCAL(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_pHYs_SUPPORTED) + else if (!png_memcmp(chunk_name, png_pHYs, 4)) + png_handle_pHYs(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sBIT_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sBIT, 4)) + png_handle_sBIT(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sRGB_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sRGB, 4)) + png_handle_sRGB(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_iCCP_SUPPORTED) + else if (!png_memcmp(chunk_name, png_iCCP, 4)) + png_handle_iCCP(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_sPLT_SUPPORTED) + else if (!png_memcmp(chunk_name, png_sPLT, 4)) + png_handle_sPLT(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_tEXt_SUPPORTED) + else if (!png_memcmp(chunk_name, png_tEXt, 4)) + png_handle_tEXt(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_tIME_SUPPORTED) + else if (!png_memcmp(chunk_name, png_tIME, 4)) + png_handle_tIME(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_tRNS_SUPPORTED) + else if (!png_memcmp(chunk_name, png_tRNS, 4)) + png_handle_tRNS(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) + else if (!png_memcmp(chunk_name, png_zTXt, 4)) + png_handle_zTXt(png_ptr, info_ptr, length); +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) + else if (!png_memcmp(chunk_name, png_iTXt, 4)) + png_handle_iTXt(png_ptr, info_ptr, length); +#endif + else + png_handle_unknown(png_ptr, info_ptr, length); + } while (!(png_ptr->mode & PNG_HAVE_IEND)); +} +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ + +/* Free all memory used by the read */ +void PNGAPI +png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, + png_infopp end_info_ptr_ptr) +{ + png_structp png_ptr = NULL; + png_infop info_ptr = NULL, end_info_ptr = NULL; +#ifdef PNG_USER_MEM_SUPPORTED + png_free_ptr free_fn = NULL; + png_voidp mem_ptr = NULL; +#endif + + png_debug(1, "in png_destroy_read_struct"); + if (png_ptr_ptr != NULL) + png_ptr = *png_ptr_ptr; + if (png_ptr == NULL) + return; + +#ifdef PNG_USER_MEM_SUPPORTED + free_fn = png_ptr->free_fn; + mem_ptr = png_ptr->mem_ptr; +#endif + + if (info_ptr_ptr != NULL) + info_ptr = *info_ptr_ptr; + + if (end_info_ptr_ptr != NULL) + end_info_ptr = *end_info_ptr_ptr; + + png_read_destroy(png_ptr, info_ptr, end_info_ptr); + + if (info_ptr != NULL) + { +#if defined(PNG_TEXT_SUPPORTED) + png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1); +#endif + +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, + (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)info_ptr); +#endif + *info_ptr_ptr = NULL; + } + + if (end_info_ptr != NULL) + { +#if defined(PNG_READ_TEXT_SUPPORTED) + png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1); +#endif +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn, + (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)end_info_ptr); +#endif + *end_info_ptr_ptr = NULL; + } + + if (png_ptr != NULL) + { +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, + (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)png_ptr); +#endif + *png_ptr_ptr = NULL; + } +} + +/* Free all memory used by the read (old method) */ +void /* PRIVATE */ +png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr) +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf tmp_jmp; +#endif + png_error_ptr error_fn; + png_error_ptr warning_fn; + png_voidp error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + png_free_ptr free_fn; +#endif + + png_debug(1, "in png_read_destroy"); + if (info_ptr != NULL) + png_info_destroy(png_ptr, info_ptr); + + if (end_info_ptr != NULL) + png_info_destroy(png_ptr, end_info_ptr); + + png_free(png_ptr, png_ptr->zbuf); + png_free(png_ptr, png_ptr->big_row_buf); + png_free(png_ptr, png_ptr->prev_row); + png_free(png_ptr, png_ptr->chunkdata); +#if defined(PNG_READ_DITHER_SUPPORTED) + png_free(png_ptr, png_ptr->palette_lookup); + png_free(png_ptr, png_ptr->dither_index); +#endif +#if defined(PNG_READ_GAMMA_SUPPORTED) + png_free(png_ptr, png_ptr->gamma_table); +#endif +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + png_free(png_ptr, png_ptr->gamma_from_1); + png_free(png_ptr, png_ptr->gamma_to_1); +#endif +#ifdef PNG_FREE_ME_SUPPORTED + if (png_ptr->free_me & PNG_FREE_PLTE) + png_zfree(png_ptr, png_ptr->palette); + png_ptr->free_me &= ~PNG_FREE_PLTE; +#else + if (png_ptr->flags & PNG_FLAG_FREE_PLTE) + png_zfree(png_ptr, png_ptr->palette); + png_ptr->flags &= ~PNG_FLAG_FREE_PLTE; +#endif +#if defined(PNG_tRNS_SUPPORTED) || \ + defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) +#ifdef PNG_FREE_ME_SUPPORTED + if (png_ptr->free_me & PNG_FREE_TRNS) + png_free(png_ptr, png_ptr->trans); + png_ptr->free_me &= ~PNG_FREE_TRNS; +#else + if (png_ptr->flags & PNG_FLAG_FREE_TRNS) + png_free(png_ptr, png_ptr->trans); + png_ptr->flags &= ~PNG_FLAG_FREE_TRNS; +#endif +#endif +#if defined(PNG_READ_hIST_SUPPORTED) +#ifdef PNG_FREE_ME_SUPPORTED + if (png_ptr->free_me & PNG_FREE_HIST) + png_free(png_ptr, png_ptr->hist); + png_ptr->free_me &= ~PNG_FREE_HIST; +#else + if (png_ptr->flags & PNG_FLAG_FREE_HIST) + png_free(png_ptr, png_ptr->hist); + png_ptr->flags &= ~PNG_FLAG_FREE_HIST; +#endif +#endif +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (png_ptr->gamma_16_table != NULL) + { + int i; + int istop = (1 << (8 - png_ptr->gamma_shift)); + for (i = 0; i < istop; i++) + { + png_free(png_ptr, png_ptr->gamma_16_table[i]); + } + png_free(png_ptr, png_ptr->gamma_16_table); + } +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_16_from_1 != NULL) + { + int i; + int istop = (1 << (8 - png_ptr->gamma_shift)); + for (i = 0; i < istop; i++) + { + png_free(png_ptr, png_ptr->gamma_16_from_1[i]); + } + png_free(png_ptr, png_ptr->gamma_16_from_1); + } + if (png_ptr->gamma_16_to_1 != NULL) + { + int i; + int istop = (1 << (8 - png_ptr->gamma_shift)); + for (i = 0; i < istop; i++) + { + png_free(png_ptr, png_ptr->gamma_16_to_1[i]); + } + png_free(png_ptr, png_ptr->gamma_16_to_1); + } +#endif +#endif +#if defined(PNG_TIME_RFC1123_SUPPORTED) + png_free(png_ptr, png_ptr->time_buffer); +#endif + + inflateEnd(&png_ptr->zstream); +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + png_free(png_ptr, png_ptr->save_buffer); +#endif + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +#ifdef PNG_TEXT_SUPPORTED + png_free(png_ptr, png_ptr->current_text); +#endif /* PNG_TEXT_SUPPORTED */ +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + + /* Save the important info out of the png_struct, in case it is + * being used again. + */ +#ifdef PNG_SETJMP_SUPPORTED + png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); +#endif + + error_fn = png_ptr->error_fn; + warning_fn = png_ptr->warning_fn; + error_ptr = png_ptr->error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + free_fn = png_ptr->free_fn; +#endif + + png_memset(png_ptr, 0, png_sizeof(png_struct)); + + png_ptr->error_fn = error_fn; + png_ptr->warning_fn = warning_fn; + png_ptr->error_ptr = error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + png_ptr->free_fn = free_fn; +#endif + +#ifdef PNG_SETJMP_SUPPORTED + png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); +#endif + +} + +void PNGAPI +png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn) +{ + if (png_ptr == NULL) + return; + png_ptr->read_row_fn = read_row_fn; +} + + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +#if defined(PNG_INFO_IMAGE_SUPPORTED) +void PNGAPI +png_read_png(png_structp png_ptr, png_infop info_ptr, + int transforms, + voidp params) +{ + int row; + + if (png_ptr == NULL) + return; +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) + /* Invert the alpha channel from opacity to transparency + */ + if (transforms & PNG_TRANSFORM_INVERT_ALPHA) + png_set_invert_alpha(png_ptr); +#endif + + /* png_read_info() gives us all of the information from the + * PNG file before the first IDAT (image data chunk). + */ + png_read_info(png_ptr, info_ptr); + if (info_ptr->height > PNG_UINT_32_MAX/png_sizeof(png_bytep)) + png_error(png_ptr, "Image is too high to process with png_read_png()"); + + /* -------------- image transformations start here ------------------- */ + +#if defined(PNG_READ_16_TO_8_SUPPORTED) + /* Tell libpng to strip 16 bit/color files down to 8 bits per color. + */ + if (transforms & PNG_TRANSFORM_STRIP_16) + png_set_strip_16(png_ptr); +#endif + +#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) + /* Strip alpha bytes from the input data without combining with + * the background (not recommended). + */ + if (transforms & PNG_TRANSFORM_STRIP_ALPHA) + png_set_strip_alpha(png_ptr); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED) + /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single + * byte into separate bytes (useful for paletted and grayscale images). + */ + if (transforms & PNG_TRANSFORM_PACKING) + png_set_packing(png_ptr); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + /* Change the order of packed pixels to least significant bit first + * (not useful if you are using png_set_packing). + */ + if (transforms & PNG_TRANSFORM_PACKSWAP) + png_set_packswap(png_ptr); +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) + /* Expand paletted colors into true RGB triplets + * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel + * Expand paletted or RGB images with transparency to full alpha + * channels so the data will be available as RGBA quartets. + */ + if (transforms & PNG_TRANSFORM_EXPAND) + if ((png_ptr->bit_depth < 8) || + (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) || + (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) + png_set_expand(png_ptr); +#endif + + /* We don't handle background color or gamma transformation or dithering. + */ + +#if defined(PNG_READ_INVERT_SUPPORTED) + /* Invert monochrome files to have 0 as white and 1 as black + */ + if (transforms & PNG_TRANSFORM_INVERT_MONO) + png_set_invert_mono(png_ptr); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) + /* If you want to shift the pixel values from the range [0,255] or + * [0,65535] to the original [0,7] or [0,31], or whatever range the + * colors were originally in: + */ + if ((transforms & PNG_TRANSFORM_SHIFT) + && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) + { + png_color_8p sig_bit; + + png_get_sBIT(png_ptr, info_ptr, &sig_bit); + png_set_shift(png_ptr, sig_bit); + } +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) + /* Flip the RGB pixels to BGR (or RGBA to BGRA) + */ + if (transforms & PNG_TRANSFORM_BGR) + png_set_bgr(png_ptr); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) + /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) + */ + if (transforms & PNG_TRANSFORM_SWAP_ALPHA) + png_set_swap_alpha(png_ptr); +#endif + +#if defined(PNG_READ_SWAP_SUPPORTED) + /* Swap bytes of 16 bit files to least significant byte first + */ + if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) + png_set_swap(png_ptr); +#endif + + /* We don't handle adding filler bytes */ + + /* Optional call to gamma correct and add the background to the palette + * and update info structure. REQUIRED if you are expecting libpng to + * update the palette for you (i.e., you selected such a transform above). + */ + png_read_update_info(png_ptr, info_ptr); + + /* -------------- image transformations end here ------------------- */ + +#ifdef PNG_FREE_ME_SUPPORTED + png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); +#endif + if (info_ptr->row_pointers == NULL) + { + info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr, + info_ptr->height * png_sizeof(png_bytep)); + png_memset(info_ptr->row_pointers, 0, info_ptr->height + * png_sizeof(png_bytep)); +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_ROWS; +#endif + for (row = 0; row < (int)info_ptr->height; row++) + info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr, + png_get_rowbytes(png_ptr, info_ptr)); + } + + png_read_image(png_ptr, info_ptr->row_pointers); + info_ptr->valid |= PNG_INFO_IDAT; + + /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */ + png_read_end(png_ptr, info_ptr); + + transforms = transforms; /* Quiet compiler warnings */ + params = params; + +} +#endif /* PNG_INFO_IMAGE_SUPPORTED */ +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ +#endif /* PNG_READ_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/png/pngrio.c b/third_party/windows/fltk-1.1.10/png/pngrio.c new file mode 100644 index 0000000..65fb529 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngrio.c @@ -0,0 +1,177 @@ + +/* pngrio.c - functions for data input + * + * Last changed in libpng 1.2.37 [June 4, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file provides a location for all input. Users who need + * special handling are expected to write a function that has the same + * arguments as this and performs a similar function, but that possibly + * has a different input method. Note that you shouldn't change this + * function, but rather write a replacement function and then make + * libpng use it at run time with png_set_read_fn(...). + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) + +/* Read the data from whatever input you are using. The default routine + * reads from a file pointer. Note that this routine sometimes gets called + * with very small lengths, so you should implement some kind of simple + * buffering if you are using unbuffered reads. This should never be asked + * to read more then 64K on a 16 bit machine. + */ +void /* PRIVATE */ +png_read_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_debug1(4, "reading %d bytes", (int)length); + if (png_ptr->read_data_fn != NULL) + (*(png_ptr->read_data_fn))(png_ptr, data, length); + else + png_error(png_ptr, "Call to NULL read function"); +} + +#if !defined(PNG_NO_STDIO) +/* This is the function that does the actual reading of data. If you are + * not reading from a standard C stream, you should create a replacement + * read_data function and use it at run time with png_set_read_fn(), rather + * than changing the library. + */ +#ifndef USE_FAR_KEYWORD +void PNGAPI +png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_size_t check; + + if (png_ptr == NULL) + return; + /* fread() returns 0 on error, so it is OK to store this in a png_size_t + * instead of an int, which is what fread() actually returns. + */ +#if defined(_WIN32_WCE) + if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) + check = 0; +#else + check = (png_size_t)fread(data, (png_size_t)1, length, + (png_FILE_p)png_ptr->io_ptr); +#endif + + if (check != length) + png_error(png_ptr, "Read Error"); +} +#else +/* This is the model-independent version. Since the standard I/O library + can't handle far buffers in the medium and small models, we have to copy + the data. +*/ + +#define NEAR_BUF_SIZE 1024 +#define MIN(a,b) (a <= b ? a : b) + +static void PNGAPI +png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + int check; + png_byte *n_data; + png_FILE_p io_ptr; + + if (png_ptr == NULL) + return; + /* Check if data really is near. If so, use usual code. */ + n_data = (png_byte *)CVT_PTR_NOCHECK(data); + io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); + if ((png_bytep)n_data == data) + { +#if defined(_WIN32_WCE) + if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) + check = 0; +#else + check = fread(n_data, 1, length, io_ptr); +#endif + } + else + { + png_byte buf[NEAR_BUF_SIZE]; + png_size_t read, remaining, err; + check = 0; + remaining = length; + do + { + read = MIN(NEAR_BUF_SIZE, remaining); +#if defined(_WIN32_WCE) + if ( !ReadFile((HANDLE)(io_ptr), buf, read, &err, NULL) ) + err = 0; +#else + err = fread(buf, (png_size_t)1, read, io_ptr); +#endif + png_memcpy(data, buf, read); /* copy far buffer to near buffer */ + if (err != read) + break; + else + check += err; + data += read; + remaining -= read; + } + while (remaining != 0); + } + if ((png_uint_32)check != (png_uint_32)length) + png_error(png_ptr, "read Error"); +} +#endif +#endif + +/* This function allows the application to supply a new input function + * for libpng if standard C streams aren't being used. + * + * This function takes as its arguments: + * png_ptr - pointer to a png input data structure + * io_ptr - pointer to user supplied structure containing info about + * the input functions. May be NULL. + * read_data_fn - pointer to a new input function that takes as its + * arguments a pointer to a png_struct, a pointer to + * a location where input data can be stored, and a 32-bit + * unsigned int that is the number of bytes to be read. + * To exit and output any fatal error messages the new write + * function should call png_error(png_ptr, "Error msg"). + * May be NULL, in which case libpng's default function will + * be used. + */ +void PNGAPI +png_set_read_fn(png_structp png_ptr, png_voidp io_ptr, + png_rw_ptr read_data_fn) +{ + if (png_ptr == NULL) + return; + png_ptr->io_ptr = io_ptr; + +#if !defined(PNG_NO_STDIO) + if (read_data_fn != NULL) + png_ptr->read_data_fn = read_data_fn; + else + png_ptr->read_data_fn = png_default_read_data; +#else + png_ptr->read_data_fn = read_data_fn; +#endif + + /* It is an error to write to a read device */ + if (png_ptr->write_data_fn != NULL) + { + png_ptr->write_data_fn = NULL; + png_warning(png_ptr, + "It's an error to set both read_data_fn and write_data_fn in the "); + png_warning(png_ptr, + "same structure. Resetting write_data_fn to NULL."); + } + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) + png_ptr->output_flush_fn = NULL; +#endif +} +#endif /* PNG_READ_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/png/pngrtran.c b/third_party/windows/fltk-1.1.10/png/pngrtran.c new file mode 100644 index 0000000..4dae5ad --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngrtran.c @@ -0,0 +1,4381 @@ + +/* pngrtran.c - transforms the data in a row for PNG readers + * + * Last changed in libpng 1.2.38 [July 16, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file contains functions optionally called by an application + * in order to tell libpng how to handle data when reading a PNG. + * Transformations that are used in both reading and writing are + * in pngtrans.c. + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) + +/* Set the action on getting a CRC error for an ancillary or critical chunk. */ +void PNGAPI +png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action) +{ + png_debug(1, "in png_set_crc_action"); + /* Tell libpng how we react to CRC errors in critical chunks */ + if (png_ptr == NULL) + return; + switch (crit_action) + { + case PNG_CRC_NO_CHANGE: /* Leave setting as is */ + break; + + case PNG_CRC_WARN_USE: /* Warn/use data */ + png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; + png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE; + break; + + case PNG_CRC_QUIET_USE: /* Quiet/use data */ + png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; + png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE | + PNG_FLAG_CRC_CRITICAL_IGNORE; + break; + + case PNG_CRC_WARN_DISCARD: /* Not a valid action for critical data */ + png_warning(png_ptr, + "Can't discard critical data on CRC error."); + case PNG_CRC_ERROR_QUIT: /* Error/quit */ + + case PNG_CRC_DEFAULT: + default: + png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; + break; + } + + switch (ancil_action) + { + case PNG_CRC_NO_CHANGE: /* Leave setting as is */ + break; + + case PNG_CRC_WARN_USE: /* Warn/use data */ + png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; + png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE; + break; + + case PNG_CRC_QUIET_USE: /* Quiet/use data */ + png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; + png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE | + PNG_FLAG_CRC_ANCILLARY_NOWARN; + break; + + case PNG_CRC_ERROR_QUIT: /* Error/quit */ + png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; + png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_NOWARN; + break; + + case PNG_CRC_WARN_DISCARD: /* Warn/discard data */ + + case PNG_CRC_DEFAULT: + default: + png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; + break; + } +} + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ + defined(PNG_FLOATING_POINT_SUPPORTED) +/* Handle alpha and tRNS via a background color */ +void PNGAPI +png_set_background(png_structp png_ptr, + png_color_16p background_color, int background_gamma_code, + int need_expand, double background_gamma) +{ + png_debug(1, "in png_set_background"); + if (png_ptr == NULL) + return; + if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN) + { + png_warning(png_ptr, "Application must supply a known background gamma"); + return; + } + + png_ptr->transformations |= PNG_BACKGROUND; + png_memcpy(&(png_ptr->background), background_color, + png_sizeof(png_color_16)); + png_ptr->background_gamma = (float)background_gamma; + png_ptr->background_gamma_type = (png_byte)(background_gamma_code); + png_ptr->transformations |= (need_expand ? PNG_BACKGROUND_EXPAND : 0); +} +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) +/* Strip 16 bit depth files to 8 bit depth */ +void PNGAPI +png_set_strip_16(png_structp png_ptr) +{ + png_debug(1, "in png_set_strip_16"); + if (png_ptr == NULL) + return; + png_ptr->transformations |= PNG_16_TO_8; +} +#endif + +#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) +void PNGAPI +png_set_strip_alpha(png_structp png_ptr) +{ + png_debug(1, "in png_set_strip_alpha"); + if (png_ptr == NULL) + return; + png_ptr->flags |= PNG_FLAG_STRIP_ALPHA; +} +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) +/* Dither file to 8 bit. Supply a palette, the current number + * of elements in the palette, the maximum number of elements + * allowed, and a histogram if possible. If the current number + * of colors is greater then the maximum number, the palette will be + * modified to fit in the maximum number. "full_dither" indicates + * whether we need a dithering cube set up for RGB images, or if we + * simply are reducing the number of colors in a paletted image. + */ + +typedef struct png_dsort_struct +{ + struct png_dsort_struct FAR * next; + png_byte left; + png_byte right; +} png_dsort; +typedef png_dsort FAR * png_dsortp; +typedef png_dsort FAR * FAR * png_dsortpp; + +void PNGAPI +png_set_dither(png_structp png_ptr, png_colorp palette, + int num_palette, int maximum_colors, png_uint_16p histogram, + int full_dither) +{ + png_debug(1, "in png_set_dither"); + if (png_ptr == NULL) + return; + png_ptr->transformations |= PNG_DITHER; + + if (!full_dither) + { + int i; + + png_ptr->dither_index = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(num_palette * png_sizeof(png_byte))); + for (i = 0; i < num_palette; i++) + png_ptr->dither_index[i] = (png_byte)i; + } + + if (num_palette > maximum_colors) + { + if (histogram != NULL) + { + /* This is easy enough, just throw out the least used colors. + * Perhaps not the best solution, but good enough. + */ + + int i; + + /* Initialize an array to sort colors */ + png_ptr->dither_sort = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(num_palette * png_sizeof(png_byte))); + + /* Initialize the dither_sort array */ + for (i = 0; i < num_palette; i++) + png_ptr->dither_sort[i] = (png_byte)i; + + /* Find the least used palette entries by starting a + * bubble sort, and running it until we have sorted + * out enough colors. Note that we don't care about + * sorting all the colors, just finding which are + * least used. + */ + + for (i = num_palette - 1; i >= maximum_colors; i--) + { + int done; /* To stop early if the list is pre-sorted */ + int j; + + done = 1; + for (j = 0; j < i; j++) + { + if (histogram[png_ptr->dither_sort[j]] + < histogram[png_ptr->dither_sort[j + 1]]) + { + png_byte t; + + t = png_ptr->dither_sort[j]; + png_ptr->dither_sort[j] = png_ptr->dither_sort[j + 1]; + png_ptr->dither_sort[j + 1] = t; + done = 0; + } + } + if (done) + break; + } + + /* Swap the palette around, and set up a table, if necessary */ + if (full_dither) + { + int j = num_palette; + + /* Put all the useful colors within the max, but don't + * move the others. + */ + for (i = 0; i < maximum_colors; i++) + { + if ((int)png_ptr->dither_sort[i] >= maximum_colors) + { + do + j--; + while ((int)png_ptr->dither_sort[j] >= maximum_colors); + palette[i] = palette[j]; + } + } + } + else + { + int j = num_palette; + + /* Move all the used colors inside the max limit, and + * develop a translation table. + */ + for (i = 0; i < maximum_colors; i++) + { + /* Only move the colors we need to */ + if ((int)png_ptr->dither_sort[i] >= maximum_colors) + { + png_color tmp_color; + + do + j--; + while ((int)png_ptr->dither_sort[j] >= maximum_colors); + + tmp_color = palette[j]; + palette[j] = palette[i]; + palette[i] = tmp_color; + /* Indicate where the color went */ + png_ptr->dither_index[j] = (png_byte)i; + png_ptr->dither_index[i] = (png_byte)j; + } + } + + /* Find closest color for those colors we are not using */ + for (i = 0; i < num_palette; i++) + { + if ((int)png_ptr->dither_index[i] >= maximum_colors) + { + int min_d, k, min_k, d_index; + + /* Find the closest color to one we threw out */ + d_index = png_ptr->dither_index[i]; + min_d = PNG_COLOR_DIST(palette[d_index], palette[0]); + for (k = 1, min_k = 0; k < maximum_colors; k++) + { + int d; + + d = PNG_COLOR_DIST(palette[d_index], palette[k]); + + if (d < min_d) + { + min_d = d; + min_k = k; + } + } + /* Point to closest color */ + png_ptr->dither_index[i] = (png_byte)min_k; + } + } + } + png_free(png_ptr, png_ptr->dither_sort); + png_ptr->dither_sort = NULL; + } + else + { + /* This is much harder to do simply (and quickly). Perhaps + * we need to go through a median cut routine, but those + * don't always behave themselves with only a few colors + * as input. So we will just find the closest two colors, + * and throw out one of them (chosen somewhat randomly). + * [We don't understand this at all, so if someone wants to + * work on improving it, be our guest - AED, GRP] + */ + int i; + int max_d; + int num_new_palette; + png_dsortp t; + png_dsortpp hash; + + t = NULL; + + /* Initialize palette index arrays */ + png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(num_palette * png_sizeof(png_byte))); + png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(num_palette * png_sizeof(png_byte))); + + /* Initialize the sort array */ + for (i = 0; i < num_palette; i++) + { + png_ptr->index_to_palette[i] = (png_byte)i; + png_ptr->palette_to_index[i] = (png_byte)i; + } + + hash = (png_dsortpp)png_malloc(png_ptr, (png_uint_32)(769 * + png_sizeof(png_dsortp))); + png_memset(hash, 0, 769 * png_sizeof(png_dsortp)); + + num_new_palette = num_palette; + + /* Initial wild guess at how far apart the farthest pixel + * pair we will be eliminating will be. Larger + * numbers mean more areas will be allocated, Smaller + * numbers run the risk of not saving enough data, and + * having to do this all over again. + * + * I have not done extensive checking on this number. + */ + max_d = 96; + + while (num_new_palette > maximum_colors) + { + for (i = 0; i < num_new_palette - 1; i++) + { + int j; + + for (j = i + 1; j < num_new_palette; j++) + { + int d; + + d = PNG_COLOR_DIST(palette[i], palette[j]); + + if (d <= max_d) + { + + t = (png_dsortp)png_malloc_warn(png_ptr, + (png_uint_32)(png_sizeof(png_dsort))); + if (t == NULL) + break; + t->next = hash[d]; + t->left = (png_byte)i; + t->right = (png_byte)j; + hash[d] = t; + } + } + if (t == NULL) + break; + } + + if (t != NULL) + for (i = 0; i <= max_d; i++) + { + if (hash[i] != NULL) + { + png_dsortp p; + + for (p = hash[i]; p; p = p->next) + { + if ((int)png_ptr->index_to_palette[p->left] + < num_new_palette && + (int)png_ptr->index_to_palette[p->right] + < num_new_palette) + { + int j, next_j; + + if (num_new_palette & 0x01) + { + j = p->left; + next_j = p->right; + } + else + { + j = p->right; + next_j = p->left; + } + + num_new_palette--; + palette[png_ptr->index_to_palette[j]] + = palette[num_new_palette]; + if (!full_dither) + { + int k; + + for (k = 0; k < num_palette; k++) + { + if (png_ptr->dither_index[k] == + png_ptr->index_to_palette[j]) + png_ptr->dither_index[k] = + png_ptr->index_to_palette[next_j]; + if ((int)png_ptr->dither_index[k] == + num_new_palette) + png_ptr->dither_index[k] = + png_ptr->index_to_palette[j]; + } + } + + png_ptr->index_to_palette[png_ptr->palette_to_index + [num_new_palette]] = png_ptr->index_to_palette[j]; + png_ptr->palette_to_index[png_ptr->index_to_palette[j]] + = png_ptr->palette_to_index[num_new_palette]; + + png_ptr->index_to_palette[j] = (png_byte)num_new_palette; + png_ptr->palette_to_index[num_new_palette] = (png_byte)j; + } + if (num_new_palette <= maximum_colors) + break; + } + if (num_new_palette <= maximum_colors) + break; + } + } + + for (i = 0; i < 769; i++) + { + if (hash[i] != NULL) + { + png_dsortp p = hash[i]; + while (p) + { + t = p->next; + png_free(png_ptr, p); + p = t; + } + } + hash[i] = 0; + } + max_d += 96; + } + png_free(png_ptr, hash); + png_free(png_ptr, png_ptr->palette_to_index); + png_free(png_ptr, png_ptr->index_to_palette); + png_ptr->palette_to_index = NULL; + png_ptr->index_to_palette = NULL; + } + num_palette = maximum_colors; + } + if (png_ptr->palette == NULL) + { + png_ptr->palette = palette; + } + png_ptr->num_palette = (png_uint_16)num_palette; + + if (full_dither) + { + int i; + png_bytep distance; + int total_bits = PNG_DITHER_RED_BITS + PNG_DITHER_GREEN_BITS + + PNG_DITHER_BLUE_BITS; + int num_red = (1 << PNG_DITHER_RED_BITS); + int num_green = (1 << PNG_DITHER_GREEN_BITS); + int num_blue = (1 << PNG_DITHER_BLUE_BITS); + png_size_t num_entries = ((png_size_t)1 << total_bits); + png_ptr->palette_lookup = (png_bytep )png_malloc(png_ptr, + (png_uint_32)(num_entries * png_sizeof(png_byte))); + png_memset(png_ptr->palette_lookup, 0, num_entries * + png_sizeof(png_byte)); + + distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries * + png_sizeof(png_byte))); + + png_memset(distance, 0xff, num_entries * png_sizeof(png_byte)); + + for (i = 0; i < num_palette; i++) + { + int ir, ig, ib; + int r = (palette[i].red >> (8 - PNG_DITHER_RED_BITS)); + int g = (palette[i].green >> (8 - PNG_DITHER_GREEN_BITS)); + int b = (palette[i].blue >> (8 - PNG_DITHER_BLUE_BITS)); + + for (ir = 0; ir < num_red; ir++) + { + /* int dr = abs(ir - r); */ + int dr = ((ir > r) ? ir - r : r - ir); + int index_r = (ir << (PNG_DITHER_BLUE_BITS + PNG_DITHER_GREEN_BITS)); + + for (ig = 0; ig < num_green; ig++) + { + /* int dg = abs(ig - g); */ + int dg = ((ig > g) ? ig - g : g - ig); + int dt = dr + dg; + int dm = ((dr > dg) ? dr : dg); + int index_g = index_r | (ig << PNG_DITHER_BLUE_BITS); + + for (ib = 0; ib < num_blue; ib++) + { + int d_index = index_g | ib; + /* int db = abs(ib - b); */ + int db = ((ib > b) ? ib - b : b - ib); + int dmax = ((dm > db) ? dm : db); + int d = dmax + dt + db; + + if (d < (int)distance[d_index]) + { + distance[d_index] = (png_byte)d; + png_ptr->palette_lookup[d_index] = (png_byte)i; + } + } + } + } + } + + png_free(png_ptr, distance); + } +} +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) +/* Transform the image from the file_gamma to the screen_gamma. We + * only do transformations on images where the file_gamma and screen_gamma + * are not close reciprocals, otherwise it slows things down slightly, and + * also needlessly introduces small errors. + * + * We will turn off gamma transformation later if no semitransparent entries + * are present in the tRNS array for palette images. We can't do it here + * because we don't necessarily have the tRNS chunk yet. + */ +void PNGAPI +png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma) +{ + png_debug(1, "in png_set_gamma"); + if (png_ptr == NULL) + return; + if ((fabs(scrn_gamma * file_gamma - 1.0) > PNG_GAMMA_THRESHOLD) || + (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) || + (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) + png_ptr->transformations |= PNG_GAMMA; + png_ptr->gamma = (float)file_gamma; + png_ptr->screen_gamma = (float)scrn_gamma; +} +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) +/* Expand paletted images to RGB, expand grayscale images of + * less than 8-bit depth to 8-bit depth, and expand tRNS chunks + * to alpha channels. + */ +void PNGAPI +png_set_expand(png_structp png_ptr) +{ + png_debug(1, "in png_set_expand"); + if (png_ptr == NULL) + return; + png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} + +/* GRR 19990627: the following three functions currently are identical + * to png_set_expand(). However, it is entirely reasonable that someone + * might wish to expand an indexed image to RGB but *not* expand a single, + * fully transparent palette entry to a full alpha channel--perhaps instead + * convert tRNS to the grayscale/RGB format (16-bit RGB value), or replace + * the transparent color with a particular RGB value, or drop tRNS entirely. + * IOW, a future version of the library may make the transformations flag + * a bit more fine-grained, with separate bits for each of these three + * functions. + * + * More to the point, these functions make it obvious what libpng will be + * doing, whereas "expand" can (and does) mean any number of things. + * + * GRP 20060307: In libpng-1.4.0, png_set_gray_1_2_4_to_8() was modified + * to expand only the sample depth but not to expand the tRNS to alpha. + */ + +/* Expand paletted images to RGB. */ +void PNGAPI +png_set_palette_to_rgb(png_structp png_ptr) +{ + png_debug(1, "in png_set_palette_to_rgb"); + if (png_ptr == NULL) + return; + png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} + +#if !defined(PNG_1_0_X) +/* Expand grayscale images of less than 8-bit depth to 8 bits. */ +void PNGAPI +png_set_expand_gray_1_2_4_to_8(png_structp png_ptr) +{ + png_debug(1, "in png_set_expand_gray_1_2_4_to_8"); + if (png_ptr == NULL) + return; + png_ptr->transformations |= PNG_EXPAND; + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} +#endif + +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +/* Expand grayscale images of less than 8-bit depth to 8 bits. */ +/* Deprecated as of libpng-1.2.9 */ +void PNGAPI +png_set_gray_1_2_4_to_8(png_structp png_ptr) +{ + png_debug(1, "in png_set_gray_1_2_4_to_8"); + if (png_ptr == NULL) + return; + png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); +} +#endif + + +/* Expand tRNS chunks to alpha channels. */ +void PNGAPI +png_set_tRNS_to_alpha(png_structp png_ptr) +{ + png_debug(1, "in png_set_tRNS_to_alpha"); + png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} +#endif /* defined(PNG_READ_EXPAND_SUPPORTED) */ + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) +void PNGAPI +png_set_gray_to_rgb(png_structp png_ptr) +{ + png_debug(1, "in png_set_gray_to_rgb"); + png_ptr->transformations |= PNG_GRAY_TO_RGB; + png_ptr->flags &= ~PNG_FLAG_ROW_INIT; +} +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) +#if defined(PNG_FLOATING_POINT_SUPPORTED) +/* Convert a RGB image to a grayscale of the same width. This allows us, + * for example, to convert a 24 bpp RGB image into an 8 bpp grayscale image. + */ + +void PNGAPI +png_set_rgb_to_gray(png_structp png_ptr, int error_action, double red, + double green) +{ + int red_fixed = (int)((float)red*100000.0 + 0.5); + int green_fixed = (int)((float)green*100000.0 + 0.5); + if (png_ptr == NULL) + return; + png_set_rgb_to_gray_fixed(png_ptr, error_action, red_fixed, green_fixed); +} +#endif + +void PNGAPI +png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action, + png_fixed_point red, png_fixed_point green) +{ + png_debug(1, "in png_set_rgb_to_gray"); + if (png_ptr == NULL) + return; + switch(error_action) + { + case 1: png_ptr->transformations |= PNG_RGB_TO_GRAY; + break; + + case 2: png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN; + break; + + case 3: png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR; + } + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) +#if defined(PNG_READ_EXPAND_SUPPORTED) + png_ptr->transformations |= PNG_EXPAND; +#else + { + png_warning(png_ptr, + "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED."); + png_ptr->transformations &= ~PNG_RGB_TO_GRAY; + } +#endif + { + png_uint_16 red_int, green_int; + if (red < 0 || green < 0) + { + red_int = 6968; /* .212671 * 32768 + .5 */ + green_int = 23434; /* .715160 * 32768 + .5 */ + } + else if (red + green < 100000L) + { + red_int = (png_uint_16)(((png_uint_32)red*32768L)/100000L); + green_int = (png_uint_16)(((png_uint_32)green*32768L)/100000L); + } + else + { + png_warning(png_ptr, "ignoring out of range rgb_to_gray coefficients"); + red_int = 6968; + green_int = 23434; + } + png_ptr->rgb_to_gray_red_coeff = red_int; + png_ptr->rgb_to_gray_green_coeff = green_int; + png_ptr->rgb_to_gray_blue_coeff = + (png_uint_16)(32768 - red_int - green_int); + } +} +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +void PNGAPI +png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr + read_user_transform_fn) +{ + png_debug(1, "in png_set_read_user_transform_fn"); + if (png_ptr == NULL) + return; +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) + png_ptr->transformations |= PNG_USER_TRANSFORM; + png_ptr->read_user_transform_fn = read_user_transform_fn; +#endif +#ifdef PNG_LEGACY_SUPPORTED + if (read_user_transform_fn) + png_warning(png_ptr, + "This version of libpng does not support user transforms"); +#endif +} +#endif + +/* Initialize everything needed for the read. This includes modifying + * the palette. + */ +void /* PRIVATE */ +png_init_read_transformations(png_structp png_ptr) +{ + png_debug(1, "in png_init_read_transformations"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (png_ptr != NULL) +#endif + { +#if defined(PNG_READ_BACKGROUND_SUPPORTED) || defined(PNG_READ_SHIFT_SUPPORTED) \ + || defined(PNG_READ_GAMMA_SUPPORTED) + int color_type = png_ptr->color_type; +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED) + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) + /* Detect gray background and attempt to enable optimization + * for gray --> RGB case + * + * Note: if PNG_BACKGROUND_EXPAND is set and color_type is either RGB or + * RGB_ALPHA (in which case need_expand is superfluous anyway), the + * background color might actually be gray yet not be flagged as such. + * This is not a problem for the current code, which uses + * PNG_BACKGROUND_IS_GRAY only to decide when to do the + * png_do_gray_to_rgb() transformation. + */ + if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && + !(color_type & PNG_COLOR_MASK_COLOR)) + { + png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; + } else if ((png_ptr->transformations & PNG_BACKGROUND) && + !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) && + (png_ptr->transformations & PNG_GRAY_TO_RGB) && + png_ptr->background.red == png_ptr->background.green && + png_ptr->background.red == png_ptr->background.blue) + { + png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; + png_ptr->background.gray = png_ptr->background.red; + } +#endif + + if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && + (png_ptr->transformations & PNG_EXPAND)) + { + if (!(color_type & PNG_COLOR_MASK_COLOR)) /* i.e., GRAY or GRAY_ALPHA */ + { + /* Expand background and tRNS chunks */ + switch (png_ptr->bit_depth) + { + case 1: + png_ptr->background.gray *= (png_uint_16)0xff; + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) + { + png_ptr->trans_values.gray *= (png_uint_16)0xff; + png_ptr->trans_values.red = png_ptr->trans_values.green + = png_ptr->trans_values.blue = png_ptr->trans_values.gray; + } + break; + + case 2: + png_ptr->background.gray *= (png_uint_16)0x55; + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) + { + png_ptr->trans_values.gray *= (png_uint_16)0x55; + png_ptr->trans_values.red = png_ptr->trans_values.green + = png_ptr->trans_values.blue = png_ptr->trans_values.gray; + } + break; + + case 4: + png_ptr->background.gray *= (png_uint_16)0x11; + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) + { + png_ptr->trans_values.gray *= (png_uint_16)0x11; + png_ptr->trans_values.red = png_ptr->trans_values.green + = png_ptr->trans_values.blue = png_ptr->trans_values.gray; + } + break; + + case 8: + + case 16: + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + break; + } + } + else if (color_type == PNG_COLOR_TYPE_PALETTE) + { + png_ptr->background.red = + png_ptr->palette[png_ptr->background.index].red; + png_ptr->background.green = + png_ptr->palette[png_ptr->background.index].green; + png_ptr->background.blue = + png_ptr->palette[png_ptr->background.index].blue; + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) + if (png_ptr->transformations & PNG_INVERT_ALPHA) + { +#if defined(PNG_READ_EXPAND_SUPPORTED) + if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) +#endif + { + /* Invert the alpha channel (in tRNS) unless the pixels are + * going to be expanded, in which case leave it for later + */ + int i, istop; + istop=(int)png_ptr->num_trans; + for (i=0; itrans[i] = (png_byte)(255 - png_ptr->trans[i]); + } + } +#endif + + } + } +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) + png_ptr->background_1 = png_ptr->background; +#endif +#if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) + + if ((color_type == PNG_COLOR_TYPE_PALETTE && png_ptr->num_trans != 0) + && (fabs(png_ptr->screen_gamma * png_ptr->gamma - 1.0) + < PNG_GAMMA_THRESHOLD)) + { + int i, k; + k=0; + for (i=0; inum_trans; i++) + { + if (png_ptr->trans[i] != 0 && png_ptr->trans[i] != 0xff) + k=1; /* Partial transparency is present */ + } + if (k == 0) + png_ptr->transformations &= ~PNG_GAMMA; + } + + if ((png_ptr->transformations & (PNG_GAMMA | PNG_RGB_TO_GRAY)) && + png_ptr->gamma != 0.0) + { + png_build_gamma_table(png_ptr); +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->transformations & PNG_BACKGROUND) + { + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + /* Could skip if no transparency */ + png_color back, back_1; + png_colorp palette = png_ptr->palette; + int num_palette = png_ptr->num_palette; + int i; + if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE) + { + back.red = png_ptr->gamma_table[png_ptr->background.red]; + back.green = png_ptr->gamma_table[png_ptr->background.green]; + back.blue = png_ptr->gamma_table[png_ptr->background.blue]; + + back_1.red = png_ptr->gamma_to_1[png_ptr->background.red]; + back_1.green = png_ptr->gamma_to_1[png_ptr->background.green]; + back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue]; + } + else + { + double g, gs; + + switch (png_ptr->background_gamma_type) + { + case PNG_BACKGROUND_GAMMA_SCREEN: + g = (png_ptr->screen_gamma); + gs = 1.0; + break; + + case PNG_BACKGROUND_GAMMA_FILE: + g = 1.0 / (png_ptr->gamma); + gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); + break; + + case PNG_BACKGROUND_GAMMA_UNIQUE: + g = 1.0 / (png_ptr->background_gamma); + gs = 1.0 / (png_ptr->background_gamma * + png_ptr->screen_gamma); + break; + default: + g = 1.0; /* back_1 */ + gs = 1.0; /* back */ + } + + if ( fabs(gs - 1.0) < PNG_GAMMA_THRESHOLD) + { + back.red = (png_byte)png_ptr->background.red; + back.green = (png_byte)png_ptr->background.green; + back.blue = (png_byte)png_ptr->background.blue; + } + else + { + back.red = (png_byte)(pow( + (double)png_ptr->background.red/255, gs) * 255.0 + .5); + back.green = (png_byte)(pow( + (double)png_ptr->background.green/255, gs) * 255.0 + .5); + back.blue = (png_byte)(pow( + (double)png_ptr->background.blue/255, gs) * 255.0 + .5); + } + + back_1.red = (png_byte)(pow( + (double)png_ptr->background.red/255, g) * 255.0 + .5); + back_1.green = (png_byte)(pow( + (double)png_ptr->background.green/255, g) * 255.0 + .5); + back_1.blue = (png_byte)(pow( + (double)png_ptr->background.blue/255, g) * 255.0 + .5); + } + for (i = 0; i < num_palette; i++) + { + if (i < (int)png_ptr->num_trans && png_ptr->trans[i] != 0xff) + { + if (png_ptr->trans[i] == 0) + { + palette[i] = back; + } + else /* if (png_ptr->trans[i] != 0xff) */ + { + png_byte v, w; + + v = png_ptr->gamma_to_1[palette[i].red]; + png_composite(w, v, png_ptr->trans[i], back_1.red); + palette[i].red = png_ptr->gamma_from_1[w]; + + v = png_ptr->gamma_to_1[palette[i].green]; + png_composite(w, v, png_ptr->trans[i], back_1.green); + palette[i].green = png_ptr->gamma_from_1[w]; + + v = png_ptr->gamma_to_1[palette[i].blue]; + png_composite(w, v, png_ptr->trans[i], back_1.blue); + palette[i].blue = png_ptr->gamma_from_1[w]; + } + } + else + { + palette[i].red = png_ptr->gamma_table[palette[i].red]; + palette[i].green = png_ptr->gamma_table[palette[i].green]; + palette[i].blue = png_ptr->gamma_table[palette[i].blue]; + } + } + /* Prevent the transformations being done again, and make sure + * that the now spurious alpha channel is stripped - the code + * has just reduced background composition and gamma correction + * to a simple alpha channel strip. + */ + png_ptr->transformations &= ~PNG_BACKGROUND; + png_ptr->transformations &= ~PNG_GAMMA; + png_ptr->transformations |= PNG_STRIP_ALPHA; + } + /* if (png_ptr->background_gamma_type!=PNG_BACKGROUND_GAMMA_UNKNOWN) */ + else + /* color_type != PNG_COLOR_TYPE_PALETTE */ + { + double m = (double)(((png_uint_32)1 << png_ptr->bit_depth) - 1); + double g = 1.0; + double gs = 1.0; + + switch (png_ptr->background_gamma_type) + { + case PNG_BACKGROUND_GAMMA_SCREEN: + g = (png_ptr->screen_gamma); + gs = 1.0; + break; + + case PNG_BACKGROUND_GAMMA_FILE: + g = 1.0 / (png_ptr->gamma); + gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); + break; + + case PNG_BACKGROUND_GAMMA_UNIQUE: + g = 1.0 / (png_ptr->background_gamma); + gs = 1.0 / (png_ptr->background_gamma * + png_ptr->screen_gamma); + break; + } + + png_ptr->background_1.gray = (png_uint_16)(pow( + (double)png_ptr->background.gray / m, g) * m + .5); + png_ptr->background.gray = (png_uint_16)(pow( + (double)png_ptr->background.gray / m, gs) * m + .5); + + if ((png_ptr->background.red != png_ptr->background.green) || + (png_ptr->background.red != png_ptr->background.blue) || + (png_ptr->background.red != png_ptr->background.gray)) + { + /* RGB or RGBA with color background */ + png_ptr->background_1.red = (png_uint_16)(pow( + (double)png_ptr->background.red / m, g) * m + .5); + png_ptr->background_1.green = (png_uint_16)(pow( + (double)png_ptr->background.green / m, g) * m + .5); + png_ptr->background_1.blue = (png_uint_16)(pow( + (double)png_ptr->background.blue / m, g) * m + .5); + png_ptr->background.red = (png_uint_16)(pow( + (double)png_ptr->background.red / m, gs) * m + .5); + png_ptr->background.green = (png_uint_16)(pow( + (double)png_ptr->background.green / m, gs) * m + .5); + png_ptr->background.blue = (png_uint_16)(pow( + (double)png_ptr->background.blue / m, gs) * m + .5); + } + else + { + /* GRAY, GRAY ALPHA, RGB, or RGBA with gray background */ + png_ptr->background_1.red = png_ptr->background_1.green + = png_ptr->background_1.blue = png_ptr->background_1.gray; + png_ptr->background.red = png_ptr->background.green + = png_ptr->background.blue = png_ptr->background.gray; + } + } + } + else + /* Transformation does not include PNG_BACKGROUND */ +#endif /* PNG_READ_BACKGROUND_SUPPORTED */ + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + png_colorp palette = png_ptr->palette; + int num_palette = png_ptr->num_palette; + int i; + + for (i = 0; i < num_palette; i++) + { + palette[i].red = png_ptr->gamma_table[palette[i].red]; + palette[i].green = png_ptr->gamma_table[palette[i].green]; + palette[i].blue = png_ptr->gamma_table[palette[i].blue]; + } + + /* Done the gamma correction. */ + png_ptr->transformations &= ~PNG_GAMMA; + } + } +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + else +#endif +#endif /* PNG_READ_GAMMA_SUPPORTED && PNG_FLOATING_POINT_SUPPORTED */ +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + /* No GAMMA transformation */ + if ((png_ptr->transformations & PNG_BACKGROUND) && + (color_type == PNG_COLOR_TYPE_PALETTE)) + { + int i; + int istop = (int)png_ptr->num_trans; + png_color back; + png_colorp palette = png_ptr->palette; + + back.red = (png_byte)png_ptr->background.red; + back.green = (png_byte)png_ptr->background.green; + back.blue = (png_byte)png_ptr->background.blue; + + for (i = 0; i < istop; i++) + { + if (png_ptr->trans[i] == 0) + { + palette[i] = back; + } + else if (png_ptr->trans[i] != 0xff) + { + /* The png_composite() macro is defined in png.h */ + png_composite(palette[i].red, palette[i].red, + png_ptr->trans[i], back.red); + png_composite(palette[i].green, palette[i].green, + png_ptr->trans[i], back.green); + png_composite(palette[i].blue, palette[i].blue, + png_ptr->trans[i], back.blue); + } + } + + /* Handled alpha, still need to strip the channel. */ + png_ptr->transformations &= ~PNG_BACKGROUND; + png_ptr->transformations |= PNG_STRIP_ALPHA; + } +#endif /* PNG_READ_BACKGROUND_SUPPORTED */ + +#if defined(PNG_READ_SHIFT_SUPPORTED) + if ((png_ptr->transformations & PNG_SHIFT) && + (color_type == PNG_COLOR_TYPE_PALETTE)) + { + png_uint_16 i; + png_uint_16 istop = png_ptr->num_palette; + int sr = 8 - png_ptr->sig_bit.red; + int sg = 8 - png_ptr->sig_bit.green; + int sb = 8 - png_ptr->sig_bit.blue; + + if (sr < 0 || sr > 8) + sr = 0; + if (sg < 0 || sg > 8) + sg = 0; + if (sb < 0 || sb > 8) + sb = 0; + for (i = 0; i < istop; i++) + { + png_ptr->palette[i].red >>= sr; + png_ptr->palette[i].green >>= sg; + png_ptr->palette[i].blue >>= sb; + } + } +#endif /* PNG_READ_SHIFT_SUPPORTED */ + } +#if !defined(PNG_READ_GAMMA_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) \ + && !defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr) + return; +#endif +} + +/* Modify the info structure to reflect the transformations. The + * info should be updated so a PNG file could be written with it, + * assuming the transformations result in valid PNG data. + */ +void /* PRIVATE */ +png_read_transform_info(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_read_transform_info"); +#if defined(PNG_READ_EXPAND_SUPPORTED) + if (png_ptr->transformations & PNG_EXPAND) + { + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (png_ptr->num_trans && + (png_ptr->transformations & PNG_EXPAND_tRNS)) + info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA; + else + info_ptr->color_type = PNG_COLOR_TYPE_RGB; + info_ptr->bit_depth = 8; + info_ptr->num_trans = 0; + } + else + { + if (png_ptr->num_trans) + { + if (png_ptr->transformations & PNG_EXPAND_tRNS) + info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; + } + if (info_ptr->bit_depth < 8) + info_ptr->bit_depth = 8; + info_ptr->num_trans = 0; + } + } +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->transformations & PNG_BACKGROUND) + { + info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA; + info_ptr->num_trans = 0; + info_ptr->background = png_ptr->background; + } +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (png_ptr->transformations & PNG_GAMMA) + { +#ifdef PNG_FLOATING_POINT_SUPPORTED + info_ptr->gamma = png_ptr->gamma; +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED + info_ptr->int_gamma = png_ptr->int_gamma; +#endif + } +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) + if ((png_ptr->transformations & PNG_16_TO_8) && (info_ptr->bit_depth == 16)) + info_ptr->bit_depth = 8; +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) + if (png_ptr->transformations & PNG_GRAY_TO_RGB) + info_ptr->color_type |= PNG_COLOR_MASK_COLOR; +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + if (png_ptr->transformations & PNG_RGB_TO_GRAY) + info_ptr->color_type &= ~PNG_COLOR_MASK_COLOR; +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) + if (png_ptr->transformations & PNG_DITHER) + { + if (((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || + (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) && + png_ptr->palette_lookup && info_ptr->bit_depth == 8) + { + info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; + } + } +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) + if ((png_ptr->transformations & PNG_PACK) && (info_ptr->bit_depth < 8)) + info_ptr->bit_depth = 8; +#endif + + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + info_ptr->channels = 1; + else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) + info_ptr->channels = 3; + else + info_ptr->channels = 1; + +#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) + if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA) + info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA; +#endif + + if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) + info_ptr->channels++; + +#if defined(PNG_READ_FILLER_SUPPORTED) + /* STRIP_ALPHA and FILLER allowed: MASK_ALPHA bit stripped above */ + if ((png_ptr->transformations & PNG_FILLER) && + ((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || + (info_ptr->color_type == PNG_COLOR_TYPE_GRAY))) + { + info_ptr->channels++; + /* If adding a true alpha channel not just filler */ +#if !defined(PNG_1_0_X) + if (png_ptr->transformations & PNG_ADD_ALPHA) + info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; +#endif + } +#endif + +#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \ +defined(PNG_READ_USER_TRANSFORM_SUPPORTED) + if (png_ptr->transformations & PNG_USER_TRANSFORM) + { + if (info_ptr->bit_depth < png_ptr->user_transform_depth) + info_ptr->bit_depth = png_ptr->user_transform_depth; + if (info_ptr->channels < png_ptr->user_transform_channels) + info_ptr->channels = png_ptr->user_transform_channels; + } +#endif + + info_ptr->pixel_depth = (png_byte)(info_ptr->channels * + info_ptr->bit_depth); + + info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, info_ptr->width); + +#if !defined(PNG_READ_EXPAND_SUPPORTED) + if (png_ptr) + return; +#endif +} + +/* Transform the row. The order of transformations is significant, + * and is very touchy. If you add a transformation, take care to + * decide how it fits in with the other transformations here. + */ +void /* PRIVATE */ +png_do_read_transformations(png_structp png_ptr) +{ + png_debug(1, "in png_do_read_transformations"); + if (png_ptr->row_buf == NULL) + { +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + char msg[50]; + + png_snprintf2(msg, 50, + "NULL row buffer for row %ld, pass %d", (long)png_ptr->row_number, + png_ptr->pass); + png_error(png_ptr, msg); +#else + png_error(png_ptr, "NULL row buffer"); +#endif + } +#ifdef PNG_WARN_UNINITIALIZED_ROW + if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) + /* Application has failed to call either png_read_start_image() + * or png_read_update_info() after setting transforms that expand + * pixels. This check added to libpng-1.2.19 + */ +#if (PNG_WARN_UNINITIALIZED_ROW==1) + png_error(png_ptr, "Uninitialized row"); +#else + png_warning(png_ptr, "Uninitialized row"); +#endif +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) + if (png_ptr->transformations & PNG_EXPAND) + { + if (png_ptr->row_info.color_type == PNG_COLOR_TYPE_PALETTE) + { + png_do_expand_palette(&(png_ptr->row_info), png_ptr->row_buf + 1, + png_ptr->palette, png_ptr->trans, png_ptr->num_trans); + } + else + { + if (png_ptr->num_trans && + (png_ptr->transformations & PNG_EXPAND_tRNS)) + png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, + &(png_ptr->trans_values)); + else + png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1, + NULL); + } + } +#endif + +#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) + if (png_ptr->flags & PNG_FLAG_STRIP_ALPHA) + png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, + PNG_FLAG_FILLER_AFTER | (png_ptr->flags & PNG_FLAG_STRIP_ALPHA)); +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + if (png_ptr->transformations & PNG_RGB_TO_GRAY) + { + int rgb_error = + png_do_rgb_to_gray(png_ptr, &(png_ptr->row_info), png_ptr->row_buf + 1); + if (rgb_error) + { + png_ptr->rgb_to_gray_status=1; + if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == + PNG_RGB_TO_GRAY_WARN) + png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel"); + if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == + PNG_RGB_TO_GRAY_ERR) + png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel"); + } + } +#endif + +/* From Andreas Dilger e-mail to png-implement, 26 March 1998: + * + * In most cases, the "simple transparency" should be done prior to doing + * gray-to-RGB, or you will have to test 3x as many bytes to check if a + * pixel is transparent. You would also need to make sure that the + * transparency information is upgraded to RGB. + * + * To summarize, the current flow is: + * - Gray + simple transparency -> compare 1 or 2 gray bytes and composite + * with background "in place" if transparent, + * convert to RGB if necessary + * - Gray + alpha -> composite with gray background and remove alpha bytes, + * convert to RGB if necessary + * + * To support RGB backgrounds for gray images we need: + * - Gray + simple transparency -> convert to RGB + simple transparency, + * compare 3 or 6 bytes and composite with + * background "in place" if transparent + * (3x compare/pixel compared to doing + * composite with gray bkgrnd) + * - Gray + alpha -> convert to RGB + alpha, composite with background and + * remove alpha bytes (3x float + * operations/pixel compared with composite + * on gray background) + * + * Greg's change will do this. The reason it wasn't done before is for + * performance, as this increases the per-pixel operations. If we would check + * in advance if the background was gray or RGB, and position the gray-to-RGB + * transform appropriately, then it would save a lot of work/time. + */ + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) + /* If gray -> RGB, do so now only if background is non-gray; else do later + * for performance reasons + */ + if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && + !(png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) + png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + if ((png_ptr->transformations & PNG_BACKGROUND) && + ((png_ptr->num_trans != 0 ) || + (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) + png_do_background(&(png_ptr->row_info), png_ptr->row_buf + 1, + &(png_ptr->trans_values), &(png_ptr->background) +#if defined(PNG_READ_GAMMA_SUPPORTED) + , &(png_ptr->background_1), + png_ptr->gamma_table, png_ptr->gamma_from_1, + png_ptr->gamma_to_1, png_ptr->gamma_16_table, + png_ptr->gamma_16_from_1, png_ptr->gamma_16_to_1, + png_ptr->gamma_shift +#endif +); +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) + if ((png_ptr->transformations & PNG_GAMMA) && +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + !((png_ptr->transformations & PNG_BACKGROUND) && + ((png_ptr->num_trans != 0) || + (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) && +#endif + (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)) + png_do_gamma(&(png_ptr->row_info), png_ptr->row_buf + 1, + png_ptr->gamma_table, png_ptr->gamma_16_table, + png_ptr->gamma_shift); +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) + if (png_ptr->transformations & PNG_16_TO_8) + png_do_chop(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) + if (png_ptr->transformations & PNG_DITHER) + { + png_do_dither((png_row_infop)&(png_ptr->row_info), png_ptr->row_buf + 1, + png_ptr->palette_lookup, png_ptr->dither_index); + if (png_ptr->row_info.rowbytes == (png_uint_32)0) + png_error(png_ptr, "png_do_dither returned rowbytes=0"); + } +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) + if (png_ptr->transformations & PNG_INVERT_MONO) + png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) + if (png_ptr->transformations & PNG_SHIFT) + png_do_unshift(&(png_ptr->row_info), png_ptr->row_buf + 1, + &(png_ptr->shift)); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) + if (png_ptr->transformations & PNG_PACK) + png_do_unpack(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) + if (png_ptr->transformations & PNG_BGR) + png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) + /* If gray -> RGB, do so now only if we did not do so above */ + if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && + (png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) + png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) + if (png_ptr->transformations & PNG_FILLER) + png_do_read_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, + (png_uint_32)png_ptr->filler, png_ptr->flags); +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) + if (png_ptr->transformations & PNG_INVERT_ALPHA) + png_do_read_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) + if (png_ptr->transformations & PNG_SWAP_ALPHA) + png_do_read_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_SWAP_SUPPORTED) + if (png_ptr->transformations & PNG_SWAP_BYTES) + png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) + if (png_ptr->transformations & PNG_USER_TRANSFORM) + { + if (png_ptr->read_user_transform_fn != NULL) + (*(png_ptr->read_user_transform_fn)) /* User read transform function */ + (png_ptr, /* png_ptr */ + &(png_ptr->row_info), /* row_info: */ + /* png_uint_32 width; width of row */ + /* png_uint_32 rowbytes; number of bytes in row */ + /* png_byte color_type; color type of pixels */ + /* png_byte bit_depth; bit depth of samples */ + /* png_byte channels; number of channels (1-4) */ + /* png_byte pixel_depth; bits per pixel (depth*channels) */ + png_ptr->row_buf + 1); /* start of pixel data for row */ +#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) + if (png_ptr->user_transform_depth) + png_ptr->row_info.bit_depth = png_ptr->user_transform_depth; + if (png_ptr->user_transform_channels) + png_ptr->row_info.channels = png_ptr->user_transform_channels; +#endif + png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * + png_ptr->row_info.channels); + png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, + png_ptr->row_info.width); + } +#endif + +} + +#if defined(PNG_READ_PACK_SUPPORTED) +/* Unpack pixels of 1, 2, or 4 bits per pixel into 1 byte per pixel, + * without changing the actual values. Thus, if you had a row with + * a bit depth of 1, you would end up with bytes that only contained + * the numbers 0 or 1. If you would rather they contain 0 and 255, use + * png_do_shift() after this. + */ +void /* PRIVATE */ +png_do_unpack(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_unpack"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL && row_info->bit_depth < 8) +#else + if (row_info->bit_depth < 8) +#endif + { + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + switch (row_info->bit_depth) + { + case 1: + { + png_bytep sp = row + (png_size_t)((row_width - 1) >> 3); + png_bytep dp = row + (png_size_t)row_width - 1; + png_uint_32 shift = 7 - (int)((row_width + 7) & 0x07); + for (i = 0; i < row_width; i++) + { + *dp = (png_byte)((*sp >> shift) & 0x01); + if (shift == 7) + { + shift = 0; + sp--; + } + else + shift++; + + dp--; + } + break; + } + + case 2: + { + + png_bytep sp = row + (png_size_t)((row_width - 1) >> 2); + png_bytep dp = row + (png_size_t)row_width - 1; + png_uint_32 shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); + for (i = 0; i < row_width; i++) + { + *dp = (png_byte)((*sp >> shift) & 0x03); + if (shift == 6) + { + shift = 0; + sp--; + } + else + shift += 2; + + dp--; + } + break; + } + + case 4: + { + png_bytep sp = row + (png_size_t)((row_width - 1) >> 1); + png_bytep dp = row + (png_size_t)row_width - 1; + png_uint_32 shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); + for (i = 0; i < row_width; i++) + { + *dp = (png_byte)((*sp >> shift) & 0x0f); + if (shift == 4) + { + shift = 0; + sp--; + } + else + shift = 4; + + dp--; + } + break; + } + } + row_info->bit_depth = 8; + row_info->pixel_depth = (png_byte)(8 * row_info->channels); + row_info->rowbytes = row_width * row_info->channels; + } +} +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) +/* Reverse the effects of png_do_shift. This routine merely shifts the + * pixels back to their significant bits values. Thus, if you have + * a row of bit depth 8, but only 5 are significant, this will shift + * the values back to 0 through 31. + */ +void /* PRIVATE */ +png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits) +{ + png_debug(1, "in png_do_unshift"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && sig_bits != NULL && +#endif + row_info->color_type != PNG_COLOR_TYPE_PALETTE) + { + int shift[4]; + int channels = 0; + int c; + png_uint_16 value = 0; + png_uint_32 row_width = row_info->width; + + if (row_info->color_type & PNG_COLOR_MASK_COLOR) + { + shift[channels++] = row_info->bit_depth - sig_bits->red; + shift[channels++] = row_info->bit_depth - sig_bits->green; + shift[channels++] = row_info->bit_depth - sig_bits->blue; + } + else + { + shift[channels++] = row_info->bit_depth - sig_bits->gray; + } + if (row_info->color_type & PNG_COLOR_MASK_ALPHA) + { + shift[channels++] = row_info->bit_depth - sig_bits->alpha; + } + + for (c = 0; c < channels; c++) + { + if (shift[c] <= 0) + shift[c] = 0; + else + value = 1; + } + + if (!value) + return; + + switch (row_info->bit_depth) + { + case 2: + { + png_bytep bp; + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + + for (bp = row, i = 0; i < istop; i++) + { + *bp >>= 1; + *bp++ &= 0x55; + } + break; + } + + case 4: + { + png_bytep bp = row; + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + png_byte mask = (png_byte)((((int)0xf0 >> shift[0]) & (int)0xf0) | + (png_byte)((int)0xf >> shift[0])); + + for (i = 0; i < istop; i++) + { + *bp >>= shift[0]; + *bp++ &= mask; + } + break; + } + + case 8: + { + png_bytep bp = row; + png_uint_32 i; + png_uint_32 istop = row_width * channels; + + for (i = 0; i < istop; i++) + { + *bp++ >>= shift[i%channels]; + } + break; + } + + case 16: + { + png_bytep bp = row; + png_uint_32 i; + png_uint_32 istop = channels * row_width; + + for (i = 0; i < istop; i++) + { + value = (png_uint_16)((*bp << 8) + *(bp + 1)); + value >>= shift[i%channels]; + *bp++ = (png_byte)(value >> 8); + *bp++ = (png_byte)(value & 0xff); + } + break; + } + } + } +} +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) +/* Chop rows of bit depth 16 down to 8 */ +void /* PRIVATE */ +png_do_chop(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_chop"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL && row_info->bit_depth == 16) +#else + if (row_info->bit_depth == 16) +#endif + { + png_bytep sp = row; + png_bytep dp = row; + png_uint_32 i; + png_uint_32 istop = row_info->width * row_info->channels; + + for (i = 0; i> 8)) >> 8; + * + * Approximate calculation with shift/add instead of multiply/divide: + * *dp = ((((png_uint_32)(*sp) << 8) | + * (png_uint_32)((int)(*(sp + 1)) - *sp)) + 128) >> 8; + * + * What we actually do to avoid extra shifting and conversion: + */ + + *dp = *sp + ((((int)(*(sp + 1)) - *sp) > 128) ? 1 : 0); +#else + /* Simply discard the low order byte */ + *dp = *sp; +#endif + } + row_info->bit_depth = 8; + row_info->pixel_depth = (png_byte)(8 * row_info->channels); + row_info->rowbytes = row_info->width * row_info->channels; + } +} +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) +void /* PRIVATE */ +png_do_read_swap_alpha(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_read_swap_alpha"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL) +#endif + { + png_uint_32 row_width = row_info->width; + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + /* This converts from RGBA to ARGB */ + if (row_info->bit_depth == 8) + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_byte save; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + save = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = save; + } + } + /* This converts from RRGGBBAA to AARRGGBB */ + else + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_byte save[2]; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + save[0] = *(--sp); + save[1] = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = save[0]; + *(--dp) = save[1]; + } + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + /* This converts from GA to AG */ + if (row_info->bit_depth == 8) + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_byte save; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + save = *(--sp); + *(--dp) = *(--sp); + *(--dp) = save; + } + } + /* This converts from GGAA to AAGG */ + else + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_byte save[2]; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + save[0] = *(--sp); + save[1] = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = save[0]; + *(--dp) = save[1]; + } + } + } + } +} +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) +void /* PRIVATE */ +png_do_read_invert_alpha(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_read_invert_alpha"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL) +#endif + { + png_uint_32 row_width = row_info->width; + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + /* This inverts the alpha channel in RGBA */ + if (row_info->bit_depth == 8) + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + +/* This does nothing: + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + We can replace it with: +*/ + sp-=3; + dp=sp; + } + } + /* This inverts the alpha channel in RRGGBBAA */ + else + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + *(--dp) = (png_byte)(255 - *(--sp)); + +/* This does nothing: + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + We can replace it with: +*/ + sp-=6; + dp=sp; + } + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + /* This inverts the alpha channel in GA */ + if (row_info->bit_depth == 8) + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + *(--dp) = *(--sp); + } + } + /* This inverts the alpha channel in GGAA */ + else + { + png_bytep sp = row + row_info->rowbytes; + png_bytep dp = sp; + png_uint_32 i; + + for (i = 0; i < row_width; i++) + { + *(--dp) = (png_byte)(255 - *(--sp)); + *(--dp) = (png_byte)(255 - *(--sp)); +/* + *(--dp) = *(--sp); + *(--dp) = *(--sp); +*/ + sp-=2; + dp=sp; + } + } + } + } +} +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) +/* Add filler channel if we have RGB color */ +void /* PRIVATE */ +png_do_read_filler(png_row_infop row_info, png_bytep row, + png_uint_32 filler, png_uint_32 flags) +{ + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + png_byte hi_filler = (png_byte)((filler>>8) & 0xff); + png_byte lo_filler = (png_byte)(filler & 0xff); + + png_debug(1, "in png_do_read_filler"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + row_info->color_type == PNG_COLOR_TYPE_GRAY) + { + if (row_info->bit_depth == 8) + { + /* This changes the data from G to GX */ + if (flags & PNG_FLAG_FILLER_AFTER) + { + png_bytep sp = row + (png_size_t)row_width; + png_bytep dp = sp + (png_size_t)row_width; + for (i = 1; i < row_width; i++) + { + *(--dp) = lo_filler; + *(--dp) = *(--sp); + } + *(--dp) = lo_filler; + row_info->channels = 2; + row_info->pixel_depth = 16; + row_info->rowbytes = row_width * 2; + } + /* This changes the data from G to XG */ + else + { + png_bytep sp = row + (png_size_t)row_width; + png_bytep dp = sp + (png_size_t)row_width; + for (i = 0; i < row_width; i++) + { + *(--dp) = *(--sp); + *(--dp) = lo_filler; + } + row_info->channels = 2; + row_info->pixel_depth = 16; + row_info->rowbytes = row_width * 2; + } + } + else if (row_info->bit_depth == 16) + { + /* This changes the data from GG to GGXX */ + if (flags & PNG_FLAG_FILLER_AFTER) + { + png_bytep sp = row + (png_size_t)row_width * 2; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 1; i < row_width; i++) + { + *(--dp) = hi_filler; + *(--dp) = lo_filler; + *(--dp) = *(--sp); + *(--dp) = *(--sp); + } + *(--dp) = hi_filler; + *(--dp) = lo_filler; + row_info->channels = 2; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + } + /* This changes the data from GG to XXGG */ + else + { + png_bytep sp = row + (png_size_t)row_width * 2; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 0; i < row_width; i++) + { + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = hi_filler; + *(--dp) = lo_filler; + } + row_info->channels = 2; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + } + } + } /* COLOR_TYPE == GRAY */ + else if (row_info->color_type == PNG_COLOR_TYPE_RGB) + { + if (row_info->bit_depth == 8) + { + /* This changes the data from RGB to RGBX */ + if (flags & PNG_FLAG_FILLER_AFTER) + { + png_bytep sp = row + (png_size_t)row_width * 3; + png_bytep dp = sp + (png_size_t)row_width; + for (i = 1; i < row_width; i++) + { + *(--dp) = lo_filler; + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + } + *(--dp) = lo_filler; + row_info->channels = 4; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + } + /* This changes the data from RGB to XRGB */ + else + { + png_bytep sp = row + (png_size_t)row_width * 3; + png_bytep dp = sp + (png_size_t)row_width; + for (i = 0; i < row_width; i++) + { + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = lo_filler; + } + row_info->channels = 4; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + } + } + else if (row_info->bit_depth == 16) + { + /* This changes the data from RRGGBB to RRGGBBXX */ + if (flags & PNG_FLAG_FILLER_AFTER) + { + png_bytep sp = row + (png_size_t)row_width * 6; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 1; i < row_width; i++) + { + *(--dp) = hi_filler; + *(--dp) = lo_filler; + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + } + *(--dp) = hi_filler; + *(--dp) = lo_filler; + row_info->channels = 4; + row_info->pixel_depth = 64; + row_info->rowbytes = row_width * 8; + } + /* This changes the data from RRGGBB to XXRRGGBB */ + else + { + png_bytep sp = row + (png_size_t)row_width * 6; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 0; i < row_width; i++) + { + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = *(--sp); + *(--dp) = hi_filler; + *(--dp) = lo_filler; + } + row_info->channels = 4; + row_info->pixel_depth = 64; + row_info->rowbytes = row_width * 8; + } + } + } /* COLOR_TYPE == RGB */ +} +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) +/* Expand grayscale files to RGB, with or without alpha */ +void /* PRIVATE */ +png_do_gray_to_rgb(png_row_infop row_info, png_bytep row) +{ + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + png_debug(1, "in png_do_gray_to_rgb"); + if (row_info->bit_depth >= 8 && +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + !(row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + if (row_info->color_type == PNG_COLOR_TYPE_GRAY) + { + if (row_info->bit_depth == 8) + { + png_bytep sp = row + (png_size_t)row_width - 1; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 0; i < row_width; i++) + { + *(dp--) = *sp; + *(dp--) = *sp; + *(dp--) = *(sp--); + } + } + else + { + png_bytep sp = row + (png_size_t)row_width * 2 - 1; + png_bytep dp = sp + (png_size_t)row_width * 4; + for (i = 0; i < row_width; i++) + { + *(dp--) = *sp; + *(dp--) = *(sp - 1); + *(dp--) = *sp; + *(dp--) = *(sp - 1); + *(dp--) = *(sp--); + *(dp--) = *(sp--); + } + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + if (row_info->bit_depth == 8) + { + png_bytep sp = row + (png_size_t)row_width * 2 - 1; + png_bytep dp = sp + (png_size_t)row_width * 2; + for (i = 0; i < row_width; i++) + { + *(dp--) = *(sp--); + *(dp--) = *sp; + *(dp--) = *sp; + *(dp--) = *(sp--); + } + } + else + { + png_bytep sp = row + (png_size_t)row_width * 4 - 1; + png_bytep dp = sp + (png_size_t)row_width * 4; + for (i = 0; i < row_width; i++) + { + *(dp--) = *(sp--); + *(dp--) = *(sp--); + *(dp--) = *sp; + *(dp--) = *(sp - 1); + *(dp--) = *sp; + *(dp--) = *(sp - 1); + *(dp--) = *(sp--); + *(dp--) = *(sp--); + } + } + } + row_info->channels += (png_byte)2; + row_info->color_type |= PNG_COLOR_MASK_COLOR; + row_info->pixel_depth = (png_byte)(row_info->channels * + row_info->bit_depth); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } +} +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) +/* Reduce RGB files to grayscale, with or without alpha + * using the equation given in Poynton's ColorFAQ at + * (THIS LINK IS DEAD June 2008) + * New link: + * + * Charles Poynton poynton at poynton.com + * + * Y = 0.212671 * R + 0.715160 * G + 0.072169 * B + * + * We approximate this with + * + * Y = 0.21268 * R + 0.7151 * G + 0.07217 * B + * + * which can be expressed with integers as + * + * Y = (6969 * R + 23434 * G + 2365 * B)/32768 + * + * The calculation is to be done in a linear colorspace. + * + * Other integer coefficents can be used via png_set_rgb_to_gray(). + */ +int /* PRIVATE */ +png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row) + +{ + png_uint_32 i; + + png_uint_32 row_width = row_info->width; + int rgb_error = 0; + + png_debug(1, "in png_do_rgb_to_gray"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + (row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff; + png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff; + png_uint_32 bc = png_ptr->rgb_to_gray_blue_coeff; + + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + { + if (row_info->bit_depth == 8) + { +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL) + { + png_bytep sp = row; + png_bytep dp = row; + + for (i = 0; i < row_width; i++) + { + png_byte red = png_ptr->gamma_to_1[*(sp++)]; + png_byte green = png_ptr->gamma_to_1[*(sp++)]; + png_byte blue = png_ptr->gamma_to_1[*(sp++)]; + if (red != green || red != blue) + { + rgb_error |= 1; + *(dp++) = png_ptr->gamma_from_1[ + (rc*red + gc*green + bc*blue)>>15]; + } + else + *(dp++) = *(sp - 1); + } + } + else +#endif + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_byte red = *(sp++); + png_byte green = *(sp++); + png_byte blue = *(sp++); + if (red != green || red != blue) + { + rgb_error |= 1; + *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15); + } + else + *(dp++) = *(sp - 1); + } + } + } + + else /* RGB bit_depth == 16 */ + { +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_16_to_1 != NULL && + png_ptr->gamma_16_from_1 != NULL) + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 red, green, blue, w; + + red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + + if (red == green && red == blue) + w = red; + else + { + png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >> + png_ptr->gamma_shift][red>>8]; + png_uint_16 green_1 = png_ptr->gamma_16_to_1[(green&0xff) >> + png_ptr->gamma_shift][green>>8]; + png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >> + png_ptr->gamma_shift][blue>>8]; + png_uint_16 gray16 = (png_uint_16)((rc*red_1 + gc*green_1 + + bc*blue_1)>>15); + w = png_ptr->gamma_16_from_1[(gray16&0xff) >> + png_ptr->gamma_shift][gray16 >> 8]; + rgb_error |= 1; + } + + *(dp++) = (png_byte)((w>>8) & 0xff); + *(dp++) = (png_byte)(w & 0xff); + } + } + else +#endif + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 red, green, blue, gray16; + + red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + + if (red != green || red != blue) + rgb_error |= 1; + gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); + *(dp++) = (png_byte)((gray16>>8) & 0xff); + *(dp++) = (png_byte)(gray16 & 0xff); + } + } + } + } + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + if (row_info->bit_depth == 8) + { +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL) + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_byte red = png_ptr->gamma_to_1[*(sp++)]; + png_byte green = png_ptr->gamma_to_1[*(sp++)]; + png_byte blue = png_ptr->gamma_to_1[*(sp++)]; + if (red != green || red != blue) + rgb_error |= 1; + *(dp++) = png_ptr->gamma_from_1 + [(rc*red + gc*green + bc*blue)>>15]; + *(dp++) = *(sp++); /* alpha */ + } + } + else +#endif + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_byte red = *(sp++); + png_byte green = *(sp++); + png_byte blue = *(sp++); + if (red != green || red != blue) + rgb_error |= 1; + *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15); + *(dp++) = *(sp++); /* alpha */ + } + } + } + else /* RGBA bit_depth == 16 */ + { +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->gamma_16_to_1 != NULL && + png_ptr->gamma_16_from_1 != NULL) + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 red, green, blue, w; + + red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2; + + if (red == green && red == blue) + w = red; + else + { + png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >> + png_ptr->gamma_shift][red>>8]; + png_uint_16 green_1 = png_ptr->gamma_16_to_1[(green&0xff) >> + png_ptr->gamma_shift][green>>8]; + png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >> + png_ptr->gamma_shift][blue>>8]; + png_uint_16 gray16 = (png_uint_16)((rc * red_1 + + gc * green_1 + bc * blue_1)>>15); + w = png_ptr->gamma_16_from_1[(gray16&0xff) >> + png_ptr->gamma_shift][gray16 >> 8]; + rgb_error |= 1; + } + + *(dp++) = (png_byte)((w>>8) & 0xff); + *(dp++) = (png_byte)(w & 0xff); + *(dp++) = *(sp++); /* alpha */ + *(dp++) = *(sp++); + } + } + else +#endif + { + png_bytep sp = row; + png_bytep dp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 red, green, blue, gray16; + red = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; + green = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; + blue = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2; + if (red != green || red != blue) + rgb_error |= 1; + gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15); + *(dp++) = (png_byte)((gray16>>8) & 0xff); + *(dp++) = (png_byte)(gray16 & 0xff); + *(dp++) = *(sp++); /* alpha */ + *(dp++) = *(sp++); + } + } + } + } + row_info->channels -= (png_byte)2; + row_info->color_type &= ~PNG_COLOR_MASK_COLOR; + row_info->pixel_depth = (png_byte)(row_info->channels * + row_info->bit_depth); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + return rgb_error; +} +#endif + +/* Build a grayscale palette. Palette is assumed to be 1 << bit_depth + * large of png_color. This lets grayscale images be treated as + * paletted. Most useful for gamma correction and simplification + * of code. + */ +void PNGAPI +png_build_grayscale_palette(int bit_depth, png_colorp palette) +{ + int num_palette; + int color_inc; + int i; + int v; + + png_debug(1, "in png_do_build_grayscale_palette"); + if (palette == NULL) + return; + + switch (bit_depth) + { + case 1: + num_palette = 2; + color_inc = 0xff; + break; + + case 2: + num_palette = 4; + color_inc = 0x55; + break; + + case 4: + num_palette = 16; + color_inc = 0x11; + break; + + case 8: + num_palette = 256; + color_inc = 1; + break; + + default: + num_palette = 0; + color_inc = 0; + break; + } + + for (i = 0, v = 0; i < num_palette; i++, v += color_inc) + { + palette[i].red = (png_byte)v; + palette[i].green = (png_byte)v; + palette[i].blue = (png_byte)v; + } +} + +/* This function is currently unused. Do we really need it? */ +#if defined(PNG_READ_DITHER_SUPPORTED) && defined(PNG_CORRECT_PALETTE_SUPPORTED) +void /* PRIVATE */ +png_correct_palette(png_structp png_ptr, png_colorp palette, + int num_palette) +{ + png_debug(1, "in png_correct_palette"); +#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ + defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED) + if (png_ptr->transformations & (PNG_GAMMA | PNG_BACKGROUND)) + { + png_color back, back_1; + + if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE) + { + back.red = png_ptr->gamma_table[png_ptr->background.red]; + back.green = png_ptr->gamma_table[png_ptr->background.green]; + back.blue = png_ptr->gamma_table[png_ptr->background.blue]; + + back_1.red = png_ptr->gamma_to_1[png_ptr->background.red]; + back_1.green = png_ptr->gamma_to_1[png_ptr->background.green]; + back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue]; + } + else + { + double g; + + g = 1.0 / (png_ptr->background_gamma * png_ptr->screen_gamma); + + if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_SCREEN || + fabs(g - 1.0) < PNG_GAMMA_THRESHOLD) + { + back.red = png_ptr->background.red; + back.green = png_ptr->background.green; + back.blue = png_ptr->background.blue; + } + else + { + back.red = + (png_byte)(pow((double)png_ptr->background.red/255, g) * + 255.0 + 0.5); + back.green = + (png_byte)(pow((double)png_ptr->background.green/255, g) * + 255.0 + 0.5); + back.blue = + (png_byte)(pow((double)png_ptr->background.blue/255, g) * + 255.0 + 0.5); + } + + g = 1.0 / png_ptr->background_gamma; + + back_1.red = + (png_byte)(pow((double)png_ptr->background.red/255, g) * + 255.0 + 0.5); + back_1.green = + (png_byte)(pow((double)png_ptr->background.green/255, g) * + 255.0 + 0.5); + back_1.blue = + (png_byte)(pow((double)png_ptr->background.blue/255, g) * + 255.0 + 0.5); + } + + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + png_uint_32 i; + + for (i = 0; i < (png_uint_32)num_palette; i++) + { + if (i < png_ptr->num_trans && png_ptr->trans[i] == 0) + { + palette[i] = back; + } + else if (i < png_ptr->num_trans && png_ptr->trans[i] != 0xff) + { + png_byte v, w; + + v = png_ptr->gamma_to_1[png_ptr->palette[i].red]; + png_composite(w, v, png_ptr->trans[i], back_1.red); + palette[i].red = png_ptr->gamma_from_1[w]; + + v = png_ptr->gamma_to_1[png_ptr->palette[i].green]; + png_composite(w, v, png_ptr->trans[i], back_1.green); + palette[i].green = png_ptr->gamma_from_1[w]; + + v = png_ptr->gamma_to_1[png_ptr->palette[i].blue]; + png_composite(w, v, png_ptr->trans[i], back_1.blue); + palette[i].blue = png_ptr->gamma_from_1[w]; + } + else + { + palette[i].red = png_ptr->gamma_table[palette[i].red]; + palette[i].green = png_ptr->gamma_table[palette[i].green]; + palette[i].blue = png_ptr->gamma_table[palette[i].blue]; + } + } + } + else + { + int i; + + for (i = 0; i < num_palette; i++) + { + if (palette[i].red == (png_byte)png_ptr->trans_values.gray) + { + palette[i] = back; + } + else + { + palette[i].red = png_ptr->gamma_table[palette[i].red]; + palette[i].green = png_ptr->gamma_table[palette[i].green]; + palette[i].blue = png_ptr->gamma_table[palette[i].blue]; + } + } + } + } + else +#endif +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (png_ptr->transformations & PNG_GAMMA) + { + int i; + + for (i = 0; i < num_palette; i++) + { + palette[i].red = png_ptr->gamma_table[palette[i].red]; + palette[i].green = png_ptr->gamma_table[palette[i].green]; + palette[i].blue = png_ptr->gamma_table[palette[i].blue]; + } + } +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + else +#endif +#endif +#if defined(PNG_READ_BACKGROUND_SUPPORTED) + if (png_ptr->transformations & PNG_BACKGROUND) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + png_color back; + + back.red = (png_byte)png_ptr->background.red; + back.green = (png_byte)png_ptr->background.green; + back.blue = (png_byte)png_ptr->background.blue; + + for (i = 0; i < (int)png_ptr->num_trans; i++) + { + if (png_ptr->trans[i] == 0) + { + palette[i].red = back.red; + palette[i].green = back.green; + palette[i].blue = back.blue; + } + else if (png_ptr->trans[i] != 0xff) + { + png_composite(palette[i].red, png_ptr->palette[i].red, + png_ptr->trans[i], back.red); + png_composite(palette[i].green, png_ptr->palette[i].green, + png_ptr->trans[i], back.green); + png_composite(palette[i].blue, png_ptr->palette[i].blue, + png_ptr->trans[i], back.blue); + } + } + } + else /* Assume grayscale palette (what else could it be?) */ + { + int i; + + for (i = 0; i < num_palette; i++) + { + if (i == (png_byte)png_ptr->trans_values.gray) + { + palette[i].red = (png_byte)png_ptr->background.red; + palette[i].green = (png_byte)png_ptr->background.green; + palette[i].blue = (png_byte)png_ptr->background.blue; + } + } + } + } +#endif +} +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) +/* Replace any alpha or transparency with the supplied background color. + * "background" is already in the screen gamma, while "background_1" is + * at a gamma of 1.0. Paletted files have already been taken care of. + */ +void /* PRIVATE */ +png_do_background(png_row_infop row_info, png_bytep row, + png_color_16p trans_values, png_color_16p background +#if defined(PNG_READ_GAMMA_SUPPORTED) + , png_color_16p background_1, + png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, + png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, + png_uint_16pp gamma_16_to_1, int gamma_shift +#endif + ) +{ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + int shift; + + png_debug(1, "in png_do_background"); + if (background != NULL && +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + (!(row_info->color_type & PNG_COLOR_MASK_ALPHA) || + (row_info->color_type != PNG_COLOR_TYPE_PALETTE && trans_values))) + { + switch (row_info->color_type) + { + case PNG_COLOR_TYPE_GRAY: + { + switch (row_info->bit_depth) + { + case 1: + { + sp = row; + shift = 7; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x01) + == trans_values->gray) + { + *sp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + if (!shift) + { + shift = 7; + sp++; + } + else + shift--; + } + break; + } + + case 2: + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_table != NULL) + { + sp = row; + shift = 6; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x03) + == trans_values->gray) + { + *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + else + { + png_byte p = (png_byte)((*sp >> shift) & 0x03); + png_byte g = (png_byte)((gamma_table [p | (p << 2) | + (p << 4) | (p << 6)] >> 6) & 0x03); + *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); + *sp |= (png_byte)(g << shift); + } + if (!shift) + { + shift = 6; + sp++; + } + else + shift -= 2; + } + } + else +#endif + { + sp = row; + shift = 6; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x03) + == trans_values->gray) + { + *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + if (!shift) + { + shift = 6; + sp++; + } + else + shift -= 2; + } + } + break; + } + + case 4: + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_table != NULL) + { + sp = row; + shift = 4; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x0f) + == trans_values->gray) + { + *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + else + { + png_byte p = (png_byte)((*sp >> shift) & 0x0f); + png_byte g = (png_byte)((gamma_table[p | + (p << 4)] >> 4) & 0x0f); + *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); + *sp |= (png_byte)(g << shift); + } + if (!shift) + { + shift = 4; + sp++; + } + else + shift -= 4; + } + } + else +#endif + { + sp = row; + shift = 4; + for (i = 0; i < row_width; i++) + { + if ((png_uint_16)((*sp >> shift) & 0x0f) + == trans_values->gray) + { + *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); + *sp |= (png_byte)(background->gray << shift); + } + if (!shift) + { + shift = 4; + sp++; + } + else + shift -= 4; + } + } + break; + } + + case 8: + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_table != NULL) + { + sp = row; + for (i = 0; i < row_width; i++, sp++) + { + if (*sp == trans_values->gray) + { + *sp = (png_byte)background->gray; + } + else + { + *sp = gamma_table[*sp]; + } + } + } + else +#endif + { + sp = row; + for (i = 0; i < row_width; i++, sp++) + { + if (*sp == trans_values->gray) + { + *sp = (png_byte)background->gray; + } + } + } + break; + } + + case 16: + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_16 != NULL) + { + sp = row; + for (i = 0; i < row_width; i++, sp += 2) + { + png_uint_16 v; + + v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + if (v == trans_values->gray) + { + /* Background is already in screen gamma */ + *sp = (png_byte)((background->gray >> 8) & 0xff); + *(sp + 1) = (png_byte)(background->gray & 0xff); + } + else + { + v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + } + } + } + else +#endif + { + sp = row; + for (i = 0; i < row_width; i++, sp += 2) + { + png_uint_16 v; + + v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + if (v == trans_values->gray) + { + *sp = (png_byte)((background->gray >> 8) & 0xff); + *(sp + 1) = (png_byte)(background->gray & 0xff); + } + } + } + break; + } + } + break; + } + + case PNG_COLOR_TYPE_RGB: + { + if (row_info->bit_depth == 8) + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_table != NULL) + { + sp = row; + for (i = 0; i < row_width; i++, sp += 3) + { + if (*sp == trans_values->red && + *(sp + 1) == trans_values->green && + *(sp + 2) == trans_values->blue) + { + *sp = (png_byte)background->red; + *(sp + 1) = (png_byte)background->green; + *(sp + 2) = (png_byte)background->blue; + } + else + { + *sp = gamma_table[*sp]; + *(sp + 1) = gamma_table[*(sp + 1)]; + *(sp + 2) = gamma_table[*(sp + 2)]; + } + } + } + else +#endif + { + sp = row; + for (i = 0; i < row_width; i++, sp += 3) + { + if (*sp == trans_values->red && + *(sp + 1) == trans_values->green && + *(sp + 2) == trans_values->blue) + { + *sp = (png_byte)background->red; + *(sp + 1) = (png_byte)background->green; + *(sp + 2) = (png_byte)background->blue; + } + } + } + } + else /* if (row_info->bit_depth == 16) */ + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_16 != NULL) + { + sp = row; + for (i = 0; i < row_width; i++, sp += 6) + { + png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + png_uint_16 g = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); + png_uint_16 b = (png_uint_16)(((*(sp+4)) << 8) + *(sp+5)); + if (r == trans_values->red && g == trans_values->green && + b == trans_values->blue) + { + /* Background is already in screen gamma */ + *sp = (png_byte)((background->red >> 8) & 0xff); + *(sp + 1) = (png_byte)(background->red & 0xff); + *(sp + 2) = (png_byte)((background->green >> 8) & 0xff); + *(sp + 3) = (png_byte)(background->green & 0xff); + *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff); + *(sp + 5) = (png_byte)(background->blue & 0xff); + } + else + { + png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; + *(sp + 2) = (png_byte)((v >> 8) & 0xff); + *(sp + 3) = (png_byte)(v & 0xff); + v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; + *(sp + 4) = (png_byte)((v >> 8) & 0xff); + *(sp + 5) = (png_byte)(v & 0xff); + } + } + } + else +#endif + { + sp = row; + for (i = 0; i < row_width; i++, sp += 6) + { + png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp+1)); + png_uint_16 g = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); + png_uint_16 b = (png_uint_16)(((*(sp+4)) << 8) + *(sp+5)); + + if (r == trans_values->red && g == trans_values->green && + b == trans_values->blue) + { + *sp = (png_byte)((background->red >> 8) & 0xff); + *(sp + 1) = (png_byte)(background->red & 0xff); + *(sp + 2) = (png_byte)((background->green >> 8) & 0xff); + *(sp + 3) = (png_byte)(background->green & 0xff); + *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff); + *(sp + 5) = (png_byte)(background->blue & 0xff); + } + } + } + } + break; + } + + case PNG_COLOR_TYPE_GRAY_ALPHA: + { + if (row_info->bit_depth == 8) + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_to_1 != NULL && gamma_from_1 != NULL && + gamma_table != NULL) + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 2, dp++) + { + png_uint_16 a = *(sp + 1); + + if (a == 0xff) + { + *dp = gamma_table[*sp]; + } + else if (a == 0) + { + /* Background is already in screen gamma */ + *dp = (png_byte)background->gray; + } + else + { + png_byte v, w; + + v = gamma_to_1[*sp]; + png_composite(w, v, a, background_1->gray); + *dp = gamma_from_1[w]; + } + } + } + else +#endif + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 2, dp++) + { + png_byte a = *(sp + 1); + + if (a == 0xff) + { + *dp = *sp; + } +#if defined(PNG_READ_GAMMA_SUPPORTED) + else if (a == 0) + { + *dp = (png_byte)background->gray; + } + else + { + png_composite(*dp, *sp, a, background_1->gray); + } +#else + *dp = (png_byte)background->gray; +#endif + } + } + } + else /* if (png_ptr->bit_depth == 16) */ + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_16 != NULL && gamma_16_from_1 != NULL && + gamma_16_to_1 != NULL) + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 4, dp += 2) + { + png_uint_16 a = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); + + if (a == (png_uint_16)0xffff) + { + png_uint_16 v; + + v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; + *dp = (png_byte)((v >> 8) & 0xff); + *(dp + 1) = (png_byte)(v & 0xff); + } +#if defined(PNG_READ_GAMMA_SUPPORTED) + else if (a == 0) +#else + else +#endif + { + /* Background is already in screen gamma */ + *dp = (png_byte)((background->gray >> 8) & 0xff); + *(dp + 1) = (png_byte)(background->gray & 0xff); + } +#if defined(PNG_READ_GAMMA_SUPPORTED) + else + { + png_uint_16 g, v, w; + + g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; + png_composite_16(v, g, a, background_1->gray); + w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8]; + *dp = (png_byte)((w >> 8) & 0xff); + *(dp + 1) = (png_byte)(w & 0xff); + } +#endif + } + } + else +#endif + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 4, dp += 2) + { + png_uint_16 a = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3)); + if (a == (png_uint_16)0xffff) + { + png_memcpy(dp, sp, 2); + } +#if defined(PNG_READ_GAMMA_SUPPORTED) + else if (a == 0) +#else + else +#endif + { + *dp = (png_byte)((background->gray >> 8) & 0xff); + *(dp + 1) = (png_byte)(background->gray & 0xff); + } +#if defined(PNG_READ_GAMMA_SUPPORTED) + else + { + png_uint_16 g, v; + + g = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + png_composite_16(v, g, a, background_1->gray); + *dp = (png_byte)((v >> 8) & 0xff); + *(dp + 1) = (png_byte)(v & 0xff); + } +#endif + } + } + } + break; + } + + case PNG_COLOR_TYPE_RGB_ALPHA: + { + if (row_info->bit_depth == 8) + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_to_1 != NULL && gamma_from_1 != NULL && + gamma_table != NULL) + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 4, dp += 3) + { + png_byte a = *(sp + 3); + + if (a == 0xff) + { + *dp = gamma_table[*sp]; + *(dp + 1) = gamma_table[*(sp + 1)]; + *(dp + 2) = gamma_table[*(sp + 2)]; + } + else if (a == 0) + { + /* Background is already in screen gamma */ + *dp = (png_byte)background->red; + *(dp + 1) = (png_byte)background->green; + *(dp + 2) = (png_byte)background->blue; + } + else + { + png_byte v, w; + + v = gamma_to_1[*sp]; + png_composite(w, v, a, background_1->red); + *dp = gamma_from_1[w]; + v = gamma_to_1[*(sp + 1)]; + png_composite(w, v, a, background_1->green); + *(dp + 1) = gamma_from_1[w]; + v = gamma_to_1[*(sp + 2)]; + png_composite(w, v, a, background_1->blue); + *(dp + 2) = gamma_from_1[w]; + } + } + } + else +#endif + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 4, dp += 3) + { + png_byte a = *(sp + 3); + + if (a == 0xff) + { + *dp = *sp; + *(dp + 1) = *(sp + 1); + *(dp + 2) = *(sp + 2); + } + else if (a == 0) + { + *dp = (png_byte)background->red; + *(dp + 1) = (png_byte)background->green; + *(dp + 2) = (png_byte)background->blue; + } + else + { + png_composite(*dp, *sp, a, background->red); + png_composite(*(dp + 1), *(sp + 1), a, + background->green); + png_composite(*(dp + 2), *(sp + 2), a, + background->blue); + } + } + } + } + else /* if (row_info->bit_depth == 16) */ + { +#if defined(PNG_READ_GAMMA_SUPPORTED) + if (gamma_16 != NULL && gamma_16_from_1 != NULL && + gamma_16_to_1 != NULL) + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 8, dp += 6) + { + png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) + << 8) + (png_uint_16)(*(sp + 7))); + if (a == (png_uint_16)0xffff) + { + png_uint_16 v; + + v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; + *dp = (png_byte)((v >> 8) & 0xff); + *(dp + 1) = (png_byte)(v & 0xff); + v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; + *(dp + 2) = (png_byte)((v >> 8) & 0xff); + *(dp + 3) = (png_byte)(v & 0xff); + v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; + *(dp + 4) = (png_byte)((v >> 8) & 0xff); + *(dp + 5) = (png_byte)(v & 0xff); + } + else if (a == 0) + { + /* Background is already in screen gamma */ + *dp = (png_byte)((background->red >> 8) & 0xff); + *(dp + 1) = (png_byte)(background->red & 0xff); + *(dp + 2) = (png_byte)((background->green >> 8) & 0xff); + *(dp + 3) = (png_byte)(background->green & 0xff); + *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); + *(dp + 5) = (png_byte)(background->blue & 0xff); + } + else + { + png_uint_16 v, w, x; + + v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; + png_composite_16(w, v, a, background_1->red); + x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; + *dp = (png_byte)((x >> 8) & 0xff); + *(dp + 1) = (png_byte)(x & 0xff); + v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)]; + png_composite_16(w, v, a, background_1->green); + x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8]; + *(dp + 2) = (png_byte)((x >> 8) & 0xff); + *(dp + 3) = (png_byte)(x & 0xff); + v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)]; + png_composite_16(w, v, a, background_1->blue); + x = gamma_16_from_1[(w & 0xff) >> gamma_shift][w >> 8]; + *(dp + 4) = (png_byte)((x >> 8) & 0xff); + *(dp + 5) = (png_byte)(x & 0xff); + } + } + } + else +#endif + { + sp = row; + dp = row; + for (i = 0; i < row_width; i++, sp += 8, dp += 6) + { + png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) + << 8) + (png_uint_16)(*(sp + 7))); + if (a == (png_uint_16)0xffff) + { + png_memcpy(dp, sp, 6); + } + else if (a == 0) + { + *dp = (png_byte)((background->red >> 8) & 0xff); + *(dp + 1) = (png_byte)(background->red & 0xff); + *(dp + 2) = (png_byte)((background->green >> 8) & 0xff); + *(dp + 3) = (png_byte)(background->green & 0xff); + *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff); + *(dp + 5) = (png_byte)(background->blue & 0xff); + } + else + { + png_uint_16 v; + + png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); + png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) + + *(sp + 3)); + png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) + + *(sp + 5)); + + png_composite_16(v, r, a, background->red); + *dp = (png_byte)((v >> 8) & 0xff); + *(dp + 1) = (png_byte)(v & 0xff); + png_composite_16(v, g, a, background->green); + *(dp + 2) = (png_byte)((v >> 8) & 0xff); + *(dp + 3) = (png_byte)(v & 0xff); + png_composite_16(v, b, a, background->blue); + *(dp + 4) = (png_byte)((v >> 8) & 0xff); + *(dp + 5) = (png_byte)(v & 0xff); + } + } + } + } + break; + } + } + + if (row_info->color_type & PNG_COLOR_MASK_ALPHA) + { + row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; + row_info->channels--; + row_info->pixel_depth = (png_byte)(row_info->channels * + row_info->bit_depth); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + } +} +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) +/* Gamma correct the image, avoiding the alpha channel. Make sure + * you do this after you deal with the transparency issue on grayscale + * or RGB images. If your bit depth is 8, use gamma_table, if it + * is 16, use gamma_16_table and gamma_shift. Build these with + * build_gamma_table(). + */ +void /* PRIVATE */ +png_do_gamma(png_row_infop row_info, png_bytep row, + png_bytep gamma_table, png_uint_16pp gamma_16_table, + int gamma_shift) +{ + png_bytep sp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + png_debug(1, "in png_do_gamma"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + ((row_info->bit_depth <= 8 && gamma_table != NULL) || + (row_info->bit_depth == 16 && gamma_16_table != NULL))) + { + switch (row_info->color_type) + { + case PNG_COLOR_TYPE_RGB: + { + if (row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++) + { + *sp = gamma_table[*sp]; + sp++; + *sp = gamma_table[*sp]; + sp++; + *sp = gamma_table[*sp]; + sp++; + } + } + else /* if (row_info->bit_depth == 16) */ + { + sp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 v; + + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + } + } + break; + } + + case PNG_COLOR_TYPE_RGB_ALPHA: + { + if (row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++) + { + *sp = gamma_table[*sp]; + sp++; + *sp = gamma_table[*sp]; + sp++; + *sp = gamma_table[*sp]; + sp++; + sp++; + } + } + else /* if (row_info->bit_depth == 16) */ + { + sp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 4; + } + } + break; + } + + case PNG_COLOR_TYPE_GRAY_ALPHA: + { + if (row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++) + { + *sp = gamma_table[*sp]; + sp += 2; + } + } + else /* if (row_info->bit_depth == 16) */ + { + sp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 4; + } + } + break; + } + + case PNG_COLOR_TYPE_GRAY: + { + if (row_info->bit_depth == 2) + { + sp = row; + for (i = 0; i < row_width; i += 4) + { + int a = *sp & 0xc0; + int b = *sp & 0x30; + int c = *sp & 0x0c; + int d = *sp & 0x03; + + *sp = (png_byte)( + ((((int)gamma_table[a|(a>>2)|(a>>4)|(a>>6)]) ) & 0xc0)| + ((((int)gamma_table[(b<<2)|b|(b>>2)|(b>>4)])>>2) & 0x30)| + ((((int)gamma_table[(c<<4)|(c<<2)|c|(c>>2)])>>4) & 0x0c)| + ((((int)gamma_table[(d<<6)|(d<<4)|(d<<2)|d])>>6) )); + sp++; + } + } + + if (row_info->bit_depth == 4) + { + sp = row; + for (i = 0; i < row_width; i += 2) + { + int msb = *sp & 0xf0; + int lsb = *sp & 0x0f; + + *sp = (png_byte)((((int)gamma_table[msb | (msb >> 4)]) & 0xf0) + | (((int)gamma_table[(lsb << 4) | lsb]) >> 4)); + sp++; + } + } + + else if (row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++) + { + *sp = gamma_table[*sp]; + sp++; + } + } + + else if (row_info->bit_depth == 16) + { + sp = row; + for (i = 0; i < row_width; i++) + { + png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; + *sp = (png_byte)((v >> 8) & 0xff); + *(sp + 1) = (png_byte)(v & 0xff); + sp += 2; + } + } + break; + } + } + } +} +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) +/* Expands a palette row to an RGB or RGBA row depending + * upon whether you supply trans and num_trans. + */ +void /* PRIVATE */ +png_do_expand_palette(png_row_infop row_info, png_bytep row, + png_colorp palette, png_bytep trans, int num_trans) +{ + int shift, value; + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + png_debug(1, "in png_do_expand_palette"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + row_info->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (row_info->bit_depth < 8) + { + switch (row_info->bit_depth) + { + case 1: + { + sp = row + (png_size_t)((row_width - 1) >> 3); + dp = row + (png_size_t)row_width - 1; + shift = 7 - (int)((row_width + 7) & 0x07); + for (i = 0; i < row_width; i++) + { + if ((*sp >> shift) & 0x01) + *dp = 1; + else + *dp = 0; + if (shift == 7) + { + shift = 0; + sp--; + } + else + shift++; + + dp--; + } + break; + } + + case 2: + { + sp = row + (png_size_t)((row_width - 1) >> 2); + dp = row + (png_size_t)row_width - 1; + shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); + for (i = 0; i < row_width; i++) + { + value = (*sp >> shift) & 0x03; + *dp = (png_byte)value; + if (shift == 6) + { + shift = 0; + sp--; + } + else + shift += 2; + + dp--; + } + break; + } + + case 4: + { + sp = row + (png_size_t)((row_width - 1) >> 1); + dp = row + (png_size_t)row_width - 1; + shift = (int)((row_width & 0x01) << 2); + for (i = 0; i < row_width; i++) + { + value = (*sp >> shift) & 0x0f; + *dp = (png_byte)value; + if (shift == 4) + { + shift = 0; + sp--; + } + else + shift += 4; + + dp--; + } + break; + } + } + row_info->bit_depth = 8; + row_info->pixel_depth = 8; + row_info->rowbytes = row_width; + } + switch (row_info->bit_depth) + { + case 8: + { + if (trans != NULL) + { + sp = row + (png_size_t)row_width - 1; + dp = row + (png_size_t)(row_width << 2) - 1; + + for (i = 0; i < row_width; i++) + { + if ((int)(*sp) >= num_trans) + *dp-- = 0xff; + else + *dp-- = trans[*sp]; + *dp-- = palette[*sp].blue; + *dp-- = palette[*sp].green; + *dp-- = palette[*sp].red; + sp--; + } + row_info->bit_depth = 8; + row_info->pixel_depth = 32; + row_info->rowbytes = row_width * 4; + row_info->color_type = 6; + row_info->channels = 4; + } + else + { + sp = row + (png_size_t)row_width - 1; + dp = row + (png_size_t)(row_width * 3) - 1; + + for (i = 0; i < row_width; i++) + { + *dp-- = palette[*sp].blue; + *dp-- = palette[*sp].green; + *dp-- = palette[*sp].red; + sp--; + } + + row_info->bit_depth = 8; + row_info->pixel_depth = 24; + row_info->rowbytes = row_width * 3; + row_info->color_type = 2; + row_info->channels = 3; + } + break; + } + } + } +} + +/* If the bit depth < 8, it is expanded to 8. Also, if the already + * expanded transparency value is supplied, an alpha channel is built. + */ +void /* PRIVATE */ +png_do_expand(png_row_infop row_info, png_bytep row, + png_color_16p trans_value) +{ + int shift, value; + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + png_debug(1, "in png_do_expand"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL) +#endif + { + if (row_info->color_type == PNG_COLOR_TYPE_GRAY) + { + png_uint_16 gray = (png_uint_16)(trans_value ? trans_value->gray : 0); + + if (row_info->bit_depth < 8) + { + switch (row_info->bit_depth) + { + case 1: + { + gray = (png_uint_16)((gray&0x01)*0xff); + sp = row + (png_size_t)((row_width - 1) >> 3); + dp = row + (png_size_t)row_width - 1; + shift = 7 - (int)((row_width + 7) & 0x07); + for (i = 0; i < row_width; i++) + { + if ((*sp >> shift) & 0x01) + *dp = 0xff; + else + *dp = 0; + if (shift == 7) + { + shift = 0; + sp--; + } + else + shift++; + + dp--; + } + break; + } + + case 2: + { + gray = (png_uint_16)((gray&0x03)*0x55); + sp = row + (png_size_t)((row_width - 1) >> 2); + dp = row + (png_size_t)row_width - 1; + shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); + for (i = 0; i < row_width; i++) + { + value = (*sp >> shift) & 0x03; + *dp = (png_byte)(value | (value << 2) | (value << 4) | + (value << 6)); + if (shift == 6) + { + shift = 0; + sp--; + } + else + shift += 2; + + dp--; + } + break; + } + + case 4: + { + gray = (png_uint_16)((gray&0x0f)*0x11); + sp = row + (png_size_t)((row_width - 1) >> 1); + dp = row + (png_size_t)row_width - 1; + shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); + for (i = 0; i < row_width; i++) + { + value = (*sp >> shift) & 0x0f; + *dp = (png_byte)(value | (value << 4)); + if (shift == 4) + { + shift = 0; + sp--; + } + else + shift = 4; + + dp--; + } + break; + } + } + + row_info->bit_depth = 8; + row_info->pixel_depth = 8; + row_info->rowbytes = row_width; + } + + if (trans_value != NULL) + { + if (row_info->bit_depth == 8) + { + gray = gray & 0xff; + sp = row + (png_size_t)row_width - 1; + dp = row + (png_size_t)(row_width << 1) - 1; + for (i = 0; i < row_width; i++) + { + if (*sp == gray) + *dp-- = 0; + else + *dp-- = 0xff; + *dp-- = *sp--; + } + } + + else if (row_info->bit_depth == 16) + { + png_byte gray_high = (gray >> 8) & 0xff; + png_byte gray_low = gray & 0xff; + sp = row + row_info->rowbytes - 1; + dp = row + (row_info->rowbytes << 1) - 1; + for (i = 0; i < row_width; i++) + { + if (*(sp - 1) == gray_high && *(sp) == gray_low) + { + *dp-- = 0; + *dp-- = 0; + } + else + { + *dp-- = 0xff; + *dp-- = 0xff; + } + *dp-- = *sp--; + *dp-- = *sp--; + } + } + + row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA; + row_info->channels = 2; + row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, + row_width); + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_RGB && trans_value) + { + if (row_info->bit_depth == 8) + { + png_byte red = trans_value->red & 0xff; + png_byte green = trans_value->green & 0xff; + png_byte blue = trans_value->blue & 0xff; + sp = row + (png_size_t)row_info->rowbytes - 1; + dp = row + (png_size_t)(row_width << 2) - 1; + for (i = 0; i < row_width; i++) + { + if (*(sp - 2) == red && *(sp - 1) == green && *(sp) == blue) + *dp-- = 0; + else + *dp-- = 0xff; + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + } + } + else if (row_info->bit_depth == 16) + { + png_byte red_high = (trans_value->red >> 8) & 0xff; + png_byte green_high = (trans_value->green >> 8) & 0xff; + png_byte blue_high = (trans_value->blue >> 8) & 0xff; + png_byte red_low = trans_value->red & 0xff; + png_byte green_low = trans_value->green & 0xff; + png_byte blue_low = trans_value->blue & 0xff; + sp = row + row_info->rowbytes - 1; + dp = row + (png_size_t)(row_width << 3) - 1; + for (i = 0; i < row_width; i++) + { + if (*(sp - 5) == red_high && + *(sp - 4) == red_low && + *(sp - 3) == green_high && + *(sp - 2) == green_low && + *(sp - 1) == blue_high && + *(sp ) == blue_low) + { + *dp-- = 0; + *dp-- = 0; + } + else + { + *dp-- = 0xff; + *dp-- = 0xff; + } + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + *dp-- = *sp--; + } + } + row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA; + row_info->channels = 4; + row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + } +} +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) +void /* PRIVATE */ +png_do_dither(png_row_infop row_info, png_bytep row, + png_bytep palette_lookup, png_bytep dither_lookup) +{ + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width=row_info->width; + + png_debug(1, "in png_do_dither"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL) +#endif + { + if (row_info->color_type == PNG_COLOR_TYPE_RGB && + palette_lookup && row_info->bit_depth == 8) + { + int r, g, b, p; + sp = row; + dp = row; + for (i = 0; i < row_width; i++) + { + r = *sp++; + g = *sp++; + b = *sp++; + + /* This looks real messy, but the compiler will reduce + * it down to a reasonable formula. For example, with + * 5 bits per color, we get: + * p = (((r >> 3) & 0x1f) << 10) | + * (((g >> 3) & 0x1f) << 5) | + * ((b >> 3) & 0x1f); + */ + p = (((r >> (8 - PNG_DITHER_RED_BITS)) & + ((1 << PNG_DITHER_RED_BITS) - 1)) << + (PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) | + (((g >> (8 - PNG_DITHER_GREEN_BITS)) & + ((1 << PNG_DITHER_GREEN_BITS) - 1)) << + (PNG_DITHER_BLUE_BITS)) | + ((b >> (8 - PNG_DITHER_BLUE_BITS)) & + ((1 << PNG_DITHER_BLUE_BITS) - 1)); + + *dp++ = palette_lookup[p]; + } + row_info->color_type = PNG_COLOR_TYPE_PALETTE; + row_info->channels = 1; + row_info->pixel_depth = row_info->bit_depth; + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && + palette_lookup != NULL && row_info->bit_depth == 8) + { + int r, g, b, p; + sp = row; + dp = row; + for (i = 0; i < row_width; i++) + { + r = *sp++; + g = *sp++; + b = *sp++; + sp++; + + p = (((r >> (8 - PNG_DITHER_RED_BITS)) & + ((1 << PNG_DITHER_RED_BITS) - 1)) << + (PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) | + (((g >> (8 - PNG_DITHER_GREEN_BITS)) & + ((1 << PNG_DITHER_GREEN_BITS) - 1)) << + (PNG_DITHER_BLUE_BITS)) | + ((b >> (8 - PNG_DITHER_BLUE_BITS)) & + ((1 << PNG_DITHER_BLUE_BITS) - 1)); + + *dp++ = palette_lookup[p]; + } + row_info->color_type = PNG_COLOR_TYPE_PALETTE; + row_info->channels = 1; + row_info->pixel_depth = row_info->bit_depth; + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); + } + else if (row_info->color_type == PNG_COLOR_TYPE_PALETTE && + dither_lookup && row_info->bit_depth == 8) + { + sp = row; + for (i = 0; i < row_width; i++, sp++) + { + *sp = dither_lookup[*sp]; + } + } + } +} +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +#if defined(PNG_READ_GAMMA_SUPPORTED) +static PNG_CONST int png_gamma_shift[] = + {0x10, 0x21, 0x42, 0x84, 0x110, 0x248, 0x550, 0xff0, 0x00}; + +/* We build the 8- or 16-bit gamma tables here. Note that for 16-bit + * tables, we don't make a full table if we are reducing to 8-bit in + * the future. Note also how the gamma_16 tables are segmented so that + * we don't need to allocate > 64K chunks for a full 16-bit table. + */ +void /* PRIVATE */ +png_build_gamma_table(png_structp png_ptr) +{ + png_debug(1, "in png_build_gamma_table"); + + if (png_ptr->bit_depth <= 8) + { + int i; + double g; + + if (png_ptr->screen_gamma > .000001) + g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); + + else + g = 1.0; + + png_ptr->gamma_table = (png_bytep)png_malloc(png_ptr, + (png_uint_32)256); + + for (i = 0; i < 256; i++) + { + png_ptr->gamma_table[i] = (png_byte)(pow((double)i / 255.0, + g) * 255.0 + .5); + } + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ + defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + if (png_ptr->transformations & ((PNG_BACKGROUND) | PNG_RGB_TO_GRAY)) + { + + g = 1.0 / (png_ptr->gamma); + + png_ptr->gamma_to_1 = (png_bytep)png_malloc(png_ptr, + (png_uint_32)256); + + for (i = 0; i < 256; i++) + { + png_ptr->gamma_to_1[i] = (png_byte)(pow((double)i / 255.0, + g) * 255.0 + .5); + } + + + png_ptr->gamma_from_1 = (png_bytep)png_malloc(png_ptr, + (png_uint_32)256); + + if (png_ptr->screen_gamma > 0.000001) + g = 1.0 / png_ptr->screen_gamma; + + else + g = png_ptr->gamma; /* Probably doing rgb_to_gray */ + + for (i = 0; i < 256; i++) + { + png_ptr->gamma_from_1[i] = (png_byte)(pow((double)i / 255.0, + g) * 255.0 + .5); + + } + } +#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ + } + else + { + double g; + int i, j, shift, num; + int sig_bit; + png_uint_32 ig; + + if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) + { + sig_bit = (int)png_ptr->sig_bit.red; + + if ((int)png_ptr->sig_bit.green > sig_bit) + sig_bit = png_ptr->sig_bit.green; + + if ((int)png_ptr->sig_bit.blue > sig_bit) + sig_bit = png_ptr->sig_bit.blue; + } + else + { + sig_bit = (int)png_ptr->sig_bit.gray; + } + + if (sig_bit > 0) + shift = 16 - sig_bit; + + else + shift = 0; + + if (png_ptr->transformations & PNG_16_TO_8) + { + if (shift < (16 - PNG_MAX_GAMMA_8)) + shift = (16 - PNG_MAX_GAMMA_8); + } + + if (shift > 8) + shift = 8; + + if (shift < 0) + shift = 0; + + png_ptr->gamma_shift = (png_byte)shift; + + num = (1 << (8 - shift)); + + if (png_ptr->screen_gamma > .000001) + g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma); + else + g = 1.0; + + png_ptr->gamma_16_table = (png_uint_16pp)png_malloc(png_ptr, + (png_uint_32)(num * png_sizeof(png_uint_16p))); + png_memset(png_ptr->gamma_16_table, 0, num * png_sizeof(png_uint_16p)); + + if (png_ptr->transformations & (PNG_16_TO_8 | PNG_BACKGROUND)) + { + double fin, fout; + png_uint_32 last, max; + + for (i = 0; i < num; i++) + { + png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(256 * png_sizeof(png_uint_16))); + } + + g = 1.0 / g; + last = 0; + for (i = 0; i < 256; i++) + { + fout = ((double)i + 0.5) / 256.0; + fin = pow(fout, g); + max = (png_uint_32)(fin * (double)((png_uint_32)num << 8)); + while (last <= max) + { + png_ptr->gamma_16_table[(int)(last & (0xff >> shift))] + [(int)(last >> (8 - shift))] = (png_uint_16)( + (png_uint_16)i | ((png_uint_16)i << 8)); + last++; + } + } + while (last < ((png_uint_32)num << 8)) + { + png_ptr->gamma_16_table[(int)(last & (0xff >> shift))] + [(int)(last >> (8 - shift))] = (png_uint_16)65535L; + last++; + } + } + else + { + for (i = 0; i < num; i++) + { + png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(256 * png_sizeof(png_uint_16))); + + ig = (((png_uint_32)i * (png_uint_32)png_gamma_shift[shift]) >> 4); + + for (j = 0; j < 256; j++) + { + png_ptr->gamma_16_table[i][j] = + (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / + 65535.0, g) * 65535.0 + .5); + } + } + } + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ + defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + if (png_ptr->transformations & (PNG_BACKGROUND | PNG_RGB_TO_GRAY)) + { + + g = 1.0 / (png_ptr->gamma); + + png_ptr->gamma_16_to_1 = (png_uint_16pp)png_malloc(png_ptr, + (png_uint_32)(num * png_sizeof(png_uint_16p ))); + png_memset(png_ptr->gamma_16_to_1, 0, num * png_sizeof(png_uint_16p)); + + for (i = 0; i < num; i++) + { + png_ptr->gamma_16_to_1[i] = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(256 * png_sizeof(png_uint_16))); + + ig = (((png_uint_32)i * + (png_uint_32)png_gamma_shift[shift]) >> 4); + for (j = 0; j < 256; j++) + { + png_ptr->gamma_16_to_1[i][j] = + (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / + 65535.0, g) * 65535.0 + .5); + } + } + + if (png_ptr->screen_gamma > 0.000001) + g = 1.0 / png_ptr->screen_gamma; + + else + g = png_ptr->gamma; /* Probably doing rgb_to_gray */ + + png_ptr->gamma_16_from_1 = (png_uint_16pp)png_malloc(png_ptr, + (png_uint_32)(num * png_sizeof(png_uint_16p))); + png_memset(png_ptr->gamma_16_from_1, 0, + num * png_sizeof(png_uint_16p)); + + for (i = 0; i < num; i++) + { + png_ptr->gamma_16_from_1[i] = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(256 * png_sizeof(png_uint_16))); + + ig = (((png_uint_32)i * + (png_uint_32)png_gamma_shift[shift]) >> 4); + + for (j = 0; j < 256; j++) + { + png_ptr->gamma_16_from_1[i][j] = + (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) / + 65535.0, g) * 65535.0 + .5); + } + } + } +#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */ + } +} +#endif +/* To do: install integer version of png_build_gamma_table here */ +#endif + +#if defined(PNG_MNG_FEATURES_SUPPORTED) +/* Undoes intrapixel differencing */ +void /* PRIVATE */ +png_do_read_intrapixel(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_read_intrapixel"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + (row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + int bytes_per_pixel; + png_uint_32 row_width = row_info->width; + if (row_info->bit_depth == 8) + { + png_bytep rp; + png_uint_32 i; + + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + bytes_per_pixel = 3; + + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + bytes_per_pixel = 4; + + else + return; + + for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) + { + *(rp) = (png_byte)((256 + *rp + *(rp+1))&0xff); + *(rp+2) = (png_byte)((256 + *(rp+2) + *(rp+1))&0xff); + } + } + else if (row_info->bit_depth == 16) + { + png_bytep rp; + png_uint_32 i; + + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + bytes_per_pixel = 6; + + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + bytes_per_pixel = 8; + + else + return; + + for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) + { + png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1); + png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3); + png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5); + png_uint_32 red = (png_uint_32)((s0 + s1 + 65536L) & 0xffffL); + png_uint_32 blue = (png_uint_32)((s2 + s1 + 65536L) & 0xffffL); + *(rp ) = (png_byte)((red >> 8) & 0xff); + *(rp+1) = (png_byte)(red & 0xff); + *(rp+4) = (png_byte)((blue >> 8) & 0xff); + *(rp+5) = (png_byte)(blue & 0xff); + } + } + } +} +#endif /* PNG_MNG_FEATURES_SUPPORTED */ +#endif /* PNG_READ_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/png/pngrutil.c b/third_party/windows/fltk-1.1.10/png/pngrutil.c new file mode 100644 index 0000000..981218d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngrutil.c @@ -0,0 +1,3252 @@ + +/* pngrutil.c - utilities to read a PNG file + * + * Last changed in libpng 1.2.38 [July 16, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file contains routines that are only called from within + * libpng itself during the course of reading an image. + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) + +#if defined(_WIN32_WCE) && (_WIN32_WCE<0x500) +# define WIN32_WCE_OLD +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +# if defined(WIN32_WCE_OLD) +/* The strtod() function is not supported on WindowsCE */ +__inline double png_strtod(png_structp png_ptr, PNG_CONST char *nptr, char **endptr) +{ + double result = 0; + int len; + wchar_t *str, *end; + + len = MultiByteToWideChar(CP_ACP, 0, nptr, -1, NULL, 0); + str = (wchar_t *)png_malloc(png_ptr, len * png_sizeof(wchar_t)); + if ( NULL != str ) + { + MultiByteToWideChar(CP_ACP, 0, nptr, -1, str, len); + result = wcstod(str, &end); + len = WideCharToMultiByte(CP_ACP, 0, end, -1, NULL, 0, NULL, NULL); + *endptr = (char *)nptr + (png_strlen(nptr) - len + 1); + png_free(png_ptr, str); + } + return result; +} +# else +# define png_strtod(p,a,b) strtod(a,b) +# endif +#endif + +png_uint_32 PNGAPI +png_get_uint_31(png_structp png_ptr, png_bytep buf) +{ +#ifdef PNG_READ_BIG_ENDIAN_SUPPORTED + png_uint_32 i = png_get_uint_32(buf); +#else + /* Avoid an extra function call by inlining the result. */ + png_uint_32 i = ((png_uint_32)(*buf) << 24) + + ((png_uint_32)(*(buf + 1)) << 16) + + ((png_uint_32)(*(buf + 2)) << 8) + + (png_uint_32)(*(buf + 3)); +#endif + if (i > PNG_UINT_31_MAX) + png_error(png_ptr, "PNG unsigned integer out of range."); + return (i); +} +#ifndef PNG_READ_BIG_ENDIAN_SUPPORTED +/* Grab an unsigned 32-bit integer from a buffer in big-endian format. */ +png_uint_32 PNGAPI +png_get_uint_32(png_bytep buf) +{ + png_uint_32 i = ((png_uint_32)(*buf) << 24) + + ((png_uint_32)(*(buf + 1)) << 16) + + ((png_uint_32)(*(buf + 2)) << 8) + + (png_uint_32)(*(buf + 3)); + + return (i); +} + +/* Grab a signed 32-bit integer from a buffer in big-endian format. The + * data is stored in the PNG file in two's complement format, and it is + * assumed that the machine format for signed integers is the same. + */ +png_int_32 PNGAPI +png_get_int_32(png_bytep buf) +{ + png_int_32 i = ((png_int_32)(*buf) << 24) + + ((png_int_32)(*(buf + 1)) << 16) + + ((png_int_32)(*(buf + 2)) << 8) + + (png_int_32)(*(buf + 3)); + + return (i); +} + +/* Grab an unsigned 16-bit integer from a buffer in big-endian format. */ +png_uint_16 PNGAPI +png_get_uint_16(png_bytep buf) +{ + png_uint_16 i = (png_uint_16)(((png_uint_16)(*buf) << 8) + + (png_uint_16)(*(buf + 1))); + + return (i); +} +#endif /* PNG_READ_BIG_ENDIAN_SUPPORTED */ + +/* Read the chunk header (length + type name). + * Put the type name into png_ptr->chunk_name, and return the length. + */ +png_uint_32 /* PRIVATE */ +png_read_chunk_header(png_structp png_ptr) +{ + png_byte buf[8]; + png_uint_32 length; + + /* Read the length and the chunk name */ + png_read_data(png_ptr, buf, 8); + length = png_get_uint_31(png_ptr, buf); + + /* Put the chunk name into png_ptr->chunk_name */ + png_memcpy(png_ptr->chunk_name, buf + 4, 4); + + png_debug2(0, "Reading %s chunk, length = %lu", + png_ptr->chunk_name, length); + + /* Reset the crc and run it over the chunk name */ + png_reset_crc(png_ptr); + png_calculate_crc(png_ptr, png_ptr->chunk_name, 4); + + /* Check to see if chunk name is valid */ + png_check_chunk_name(png_ptr, png_ptr->chunk_name); + + return length; +} + +/* Read data, and (optionally) run it through the CRC. */ +void /* PRIVATE */ +png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t length) +{ + if (png_ptr == NULL) + return; + png_read_data(png_ptr, buf, length); + png_calculate_crc(png_ptr, buf, length); +} + +/* Optionally skip data and then check the CRC. Depending on whether we + * are reading a ancillary or critical chunk, and how the program has set + * things up, we may calculate the CRC on the data and print a message. + * Returns '1' if there was a CRC error, '0' otherwise. + */ +int /* PRIVATE */ +png_crc_finish(png_structp png_ptr, png_uint_32 skip) +{ + png_size_t i; + png_size_t istop = png_ptr->zbuf_size; + + for (i = (png_size_t)skip; i > istop; i -= istop) + { + png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); + } + if (i) + { + png_crc_read(png_ptr, png_ptr->zbuf, i); + } + + if (png_crc_error(png_ptr)) + { + if (((png_ptr->chunk_name[0] & 0x20) && /* Ancillary */ + !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) || + (!(png_ptr->chunk_name[0] & 0x20) && /* Critical */ + (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE))) + { + png_chunk_warning(png_ptr, "CRC error"); + } + else + { + png_chunk_error(png_ptr, "CRC error"); + } + return (1); + } + + return (0); +} + +/* Compare the CRC stored in the PNG file with that calculated by libpng from + * the data it has read thus far. + */ +int /* PRIVATE */ +png_crc_error(png_structp png_ptr) +{ + png_byte crc_bytes[4]; + png_uint_32 crc; + int need_crc = 1; + + if (png_ptr->chunk_name[0] & 0x20) /* ancillary */ + { + if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == + (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) + need_crc = 0; + } + else /* critical */ + { + if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) + need_crc = 0; + } + + png_read_data(png_ptr, crc_bytes, 4); + + if (need_crc) + { + crc = png_get_uint_32(crc_bytes); + return ((int)(crc != png_ptr->crc)); + } + else + return (0); +} + +#if defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) || \ + defined(PNG_READ_iCCP_SUPPORTED) +/* + * Decompress trailing data in a chunk. The assumption is that chunkdata + * points at an allocated area holding the contents of a chunk with a + * trailing compressed part. What we get back is an allocated area + * holding the original prefix part and an uncompressed version of the + * trailing part (the malloc area passed in is freed). + */ +void /* PRIVATE */ +png_decompress_chunk(png_structp png_ptr, int comp_type, + png_size_t chunklength, + png_size_t prefix_size, png_size_t *newlength) +{ + static PNG_CONST char msg[] = "Error decoding compressed text"; + png_charp text; + png_size_t text_size; + + if (comp_type == PNG_COMPRESSION_TYPE_BASE) + { + int ret = Z_OK; + png_ptr->zstream.next_in = (png_bytep)(png_ptr->chunkdata + prefix_size); + png_ptr->zstream.avail_in = (uInt)(chunklength - prefix_size); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + + text_size = 0; + text = NULL; + + while (png_ptr->zstream.avail_in) + { + ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); + if (ret != Z_OK && ret != Z_STREAM_END) + { + if (png_ptr->zstream.msg != NULL) + png_warning(png_ptr, png_ptr->zstream.msg); + else + png_warning(png_ptr, msg); + inflateReset(&png_ptr->zstream); + png_ptr->zstream.avail_in = 0; + + if (text == NULL) + { + text_size = prefix_size + png_sizeof(msg) + 1; + text = (png_charp)png_malloc_warn(png_ptr, text_size); + if (text == NULL) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_error(png_ptr, "Not enough memory to decompress chunk"); + } + png_memcpy(text, png_ptr->chunkdata, prefix_size); + } + + text[text_size - 1] = 0x00; + + /* Copy what we can of the error message into the text chunk */ + text_size = (png_size_t)(chunklength - + (text - png_ptr->chunkdata) - 1); + if (text_size > png_sizeof(msg)) + text_size = png_sizeof(msg); + png_memcpy(text + prefix_size, msg, text_size); + break; + } + if (!png_ptr->zstream.avail_out || ret == Z_STREAM_END) + { + if (text == NULL) + { + text_size = prefix_size + + png_ptr->zbuf_size - png_ptr->zstream.avail_out; + text = (png_charp)png_malloc_warn(png_ptr, text_size + 1); + if (text == NULL) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_error(png_ptr, + "Not enough memory to decompress chunk."); + } + png_memcpy(text + prefix_size, png_ptr->zbuf, + text_size - prefix_size); + png_memcpy(text, png_ptr->chunkdata, prefix_size); + *(text + text_size) = 0x00; + } + else + { + png_charp tmp; + + tmp = text; + text = (png_charp)png_malloc_warn(png_ptr, + (png_uint_32)(text_size + + png_ptr->zbuf_size - png_ptr->zstream.avail_out + 1)); + if (text == NULL) + { + png_free(png_ptr, tmp); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_error(png_ptr, + "Not enough memory to decompress chunk.."); + } + png_memcpy(text, tmp, text_size); + png_free(png_ptr, tmp); + png_memcpy(text + text_size, png_ptr->zbuf, + (png_ptr->zbuf_size - png_ptr->zstream.avail_out)); + text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out; + *(text + text_size) = 0x00; + } + if (ret == Z_STREAM_END) + break; + else + { + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + } + } + } + if (ret != Z_STREAM_END) + { +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + char umsg[52]; + + if (ret == Z_BUF_ERROR) + png_snprintf(umsg, 52, + "Buffer error in compressed datastream in %s chunk", + png_ptr->chunk_name); + + else if (ret == Z_DATA_ERROR) + png_snprintf(umsg, 52, + "Data error in compressed datastream in %s chunk", + png_ptr->chunk_name); + + else + png_snprintf(umsg, 52, + "Incomplete compressed datastream in %s chunk", + png_ptr->chunk_name); + + png_warning(png_ptr, umsg); +#else + png_warning(png_ptr, + "Incomplete compressed datastream in chunk other than IDAT"); +#endif + text_size = prefix_size; + if (text == NULL) + { + text = (png_charp)png_malloc_warn(png_ptr, text_size+1); + if (text == NULL) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_error(png_ptr, "Not enough memory for text."); + } + png_memcpy(text, png_ptr->chunkdata, prefix_size); + } + *(text + text_size) = 0x00; + } + + inflateReset(&png_ptr->zstream); + png_ptr->zstream.avail_in = 0; + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = text; + *newlength=text_size; + } + else /* if (comp_type != PNG_COMPRESSION_TYPE_BASE) */ + { +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + char umsg[50]; + + png_snprintf(umsg, 50, "Unknown zTXt compression type %d", comp_type); + png_warning(png_ptr, umsg); +#else + png_warning(png_ptr, "Unknown zTXt compression type"); +#endif + + *(png_ptr->chunkdata + prefix_size) = 0x00; + *newlength = prefix_size; + } +} +#endif + +/* Read and check the IDHR chunk */ +void /* PRIVATE */ +png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[13]; + png_uint_32 width, height; + int bit_depth, color_type, compression_type, filter_type; + int interlace_type; + + png_debug(1, "in png_handle_IHDR"); + + if (png_ptr->mode & PNG_HAVE_IHDR) + png_error(png_ptr, "Out of place IHDR"); + + /* Check the length */ + if (length != 13) + png_error(png_ptr, "Invalid IHDR chunk"); + + png_ptr->mode |= PNG_HAVE_IHDR; + + png_crc_read(png_ptr, buf, 13); + png_crc_finish(png_ptr, 0); + + width = png_get_uint_31(png_ptr, buf); + height = png_get_uint_31(png_ptr, buf + 4); + bit_depth = buf[8]; + color_type = buf[9]; + compression_type = buf[10]; + filter_type = buf[11]; + interlace_type = buf[12]; + + /* Set internal variables */ + png_ptr->width = width; + png_ptr->height = height; + png_ptr->bit_depth = (png_byte)bit_depth; + png_ptr->interlaced = (png_byte)interlace_type; + png_ptr->color_type = (png_byte)color_type; +#if defined(PNG_MNG_FEATURES_SUPPORTED) + png_ptr->filter_type = (png_byte)filter_type; +#endif + png_ptr->compression_type = (png_byte)compression_type; + + /* Find number of channels */ + switch (png_ptr->color_type) + { + case PNG_COLOR_TYPE_GRAY: + case PNG_COLOR_TYPE_PALETTE: + png_ptr->channels = 1; + break; + + case PNG_COLOR_TYPE_RGB: + png_ptr->channels = 3; + break; + + case PNG_COLOR_TYPE_GRAY_ALPHA: + png_ptr->channels = 2; + break; + + case PNG_COLOR_TYPE_RGB_ALPHA: + png_ptr->channels = 4; + break; + } + + /* Set up other useful info */ + png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth * + png_ptr->channels); + png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->width); + png_debug1(3, "bit_depth = %d", png_ptr->bit_depth); + png_debug1(3, "channels = %d", png_ptr->channels); + png_debug1(3, "rowbytes = %lu", png_ptr->rowbytes); + png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, + color_type, interlace_type, compression_type, filter_type); +} + +/* Read and check the palette */ +void /* PRIVATE */ +png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_color palette[PNG_MAX_PALETTE_LENGTH]; + int num, i; +#ifndef PNG_NO_POINTER_INDEXING + png_colorp pal_ptr; +#endif + + png_debug(1, "in png_handle_PLTE"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before PLTE"); + + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid PLTE after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + + else if (png_ptr->mode & PNG_HAVE_PLTE) + png_error(png_ptr, "Duplicate PLTE chunk"); + + png_ptr->mode |= PNG_HAVE_PLTE; + + if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) + { + png_warning(png_ptr, + "Ignoring PLTE chunk in grayscale PNG"); + png_crc_finish(png_ptr, length); + return; + } +#if !defined(PNG_READ_OPT_PLTE_SUPPORTED) + if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) + { + png_crc_finish(png_ptr, length); + return; + } +#endif + + if (length > 3*PNG_MAX_PALETTE_LENGTH || length % 3) + { + if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) + { + png_warning(png_ptr, "Invalid palette chunk"); + png_crc_finish(png_ptr, length); + return; + } + + else + { + png_error(png_ptr, "Invalid palette chunk"); + } + } + + num = (int)length / 3; + +#ifndef PNG_NO_POINTER_INDEXING + for (i = 0, pal_ptr = palette; i < num; i++, pal_ptr++) + { + png_byte buf[3]; + + png_crc_read(png_ptr, buf, 3); + pal_ptr->red = buf[0]; + pal_ptr->green = buf[1]; + pal_ptr->blue = buf[2]; + } +#else + for (i = 0; i < num; i++) + { + png_byte buf[3]; + + png_crc_read(png_ptr, buf, 3); + /* Don't depend upon png_color being any order */ + palette[i].red = buf[0]; + palette[i].green = buf[1]; + palette[i].blue = buf[2]; + } +#endif + + /* If we actually NEED the PLTE chunk (ie for a paletted image), we do + * whatever the normal CRC configuration tells us. However, if we + * have an RGB image, the PLTE can be considered ancillary, so + * we will act as though it is. + */ +#if !defined(PNG_READ_OPT_PLTE_SUPPORTED) + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) +#endif + { + png_crc_finish(png_ptr, 0); + } +#if !defined(PNG_READ_OPT_PLTE_SUPPORTED) + else if (png_crc_error(png_ptr)) /* Only if we have a CRC error */ + { + /* If we don't want to use the data from an ancillary chunk, + we have two options: an error abort, or a warning and we + ignore the data in this chunk (which should be OK, since + it's considered ancillary for a RGB or RGBA image). */ + if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE)) + { + if (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) + { + png_chunk_error(png_ptr, "CRC error"); + } + else + { + png_chunk_warning(png_ptr, "CRC error"); + return; + } + } + /* Otherwise, we (optionally) emit a warning and use the chunk. */ + else if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) + { + png_chunk_warning(png_ptr, "CRC error"); + } + } +#endif + + png_set_PLTE(png_ptr, info_ptr, palette, num); + +#if defined(PNG_READ_tRNS_SUPPORTED) + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) + { + if (png_ptr->num_trans > (png_uint_16)num) + { + png_warning(png_ptr, "Truncating incorrect tRNS chunk length"); + png_ptr->num_trans = (png_uint_16)num; + } + if (info_ptr->num_trans > (png_uint_16)num) + { + png_warning(png_ptr, "Truncating incorrect info tRNS chunk length"); + info_ptr->num_trans = (png_uint_16)num; + } + } + } +#endif + +} + +void /* PRIVATE */ +png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_debug(1, "in png_handle_IEND"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR) || !(png_ptr->mode & PNG_HAVE_IDAT)) + { + png_error(png_ptr, "No image in file"); + } + + png_ptr->mode |= (PNG_AFTER_IDAT | PNG_HAVE_IEND); + + if (length != 0) + { + png_warning(png_ptr, "Incorrect IEND chunk length"); + } + png_crc_finish(png_ptr, length); + + info_ptr = info_ptr; /* Quiet compiler warnings about unused info_ptr */ +} + +#if defined(PNG_READ_gAMA_SUPPORTED) +void /* PRIVATE */ +png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_fixed_point igamma; +#ifdef PNG_FLOATING_POINT_SUPPORTED + float file_gamma; +#endif + png_byte buf[4]; + + png_debug(1, "in png_handle_gAMA"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before gAMA"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid gAMA after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->mode & PNG_HAVE_PLTE) + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Out of place gAMA chunk"); + + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA) +#if defined(PNG_READ_sRGB_SUPPORTED) + && !(info_ptr->valid & PNG_INFO_sRGB) +#endif + ) + { + png_warning(png_ptr, "Duplicate gAMA chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 4) + { + png_warning(png_ptr, "Incorrect gAMA chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 4); + if (png_crc_finish(png_ptr, 0)) + return; + + igamma = (png_fixed_point)png_get_uint_32(buf); + /* Check for zero gamma */ + if (igamma == 0) + { + png_warning(png_ptr, + "Ignoring gAMA chunk with gamma=0"); + return; + } + +#if defined(PNG_READ_sRGB_SUPPORTED) + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)) + if (PNG_OUT_OF_RANGE(igamma, 45500L, 500)) + { + png_warning(png_ptr, + "Ignoring incorrect gAMA value when sRGB is also present"); +#ifndef PNG_NO_CONSOLE_IO + fprintf(stderr, "gamma = (%d/100000)", (int)igamma); +#endif + return; + } +#endif /* PNG_READ_sRGB_SUPPORTED */ + +#ifdef PNG_FLOATING_POINT_SUPPORTED + file_gamma = (float)igamma / (float)100000.0; +# ifdef PNG_READ_GAMMA_SUPPORTED + png_ptr->gamma = file_gamma; +# endif + png_set_gAMA(png_ptr, info_ptr, file_gamma); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED + png_set_gAMA_fixed(png_ptr, info_ptr, igamma); +#endif +} +#endif + +#if defined(PNG_READ_sBIT_SUPPORTED) +void /* PRIVATE */ +png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_size_t truelen; + png_byte buf[4]; + + png_debug(1, "in png_handle_sBIT"); + + buf[0] = buf[1] = buf[2] = buf[3] = 0; + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before sBIT"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid sBIT after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->mode & PNG_HAVE_PLTE) + { + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Out of place sBIT chunk"); + } + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)) + { + png_warning(png_ptr, "Duplicate sBIT chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + truelen = 3; + else + truelen = (png_size_t)png_ptr->channels; + + if (length != truelen || length > 4) + { + png_warning(png_ptr, "Incorrect sBIT chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, truelen); + if (png_crc_finish(png_ptr, 0)) + return; + + if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) + { + png_ptr->sig_bit.red = buf[0]; + png_ptr->sig_bit.green = buf[1]; + png_ptr->sig_bit.blue = buf[2]; + png_ptr->sig_bit.alpha = buf[3]; + } + else + { + png_ptr->sig_bit.gray = buf[0]; + png_ptr->sig_bit.red = buf[0]; + png_ptr->sig_bit.green = buf[0]; + png_ptr->sig_bit.blue = buf[0]; + png_ptr->sig_bit.alpha = buf[1]; + } + png_set_sBIT(png_ptr, info_ptr, &(png_ptr->sig_bit)); +} +#endif + +#if defined(PNG_READ_cHRM_SUPPORTED) +void /* PRIVATE */ +png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[32]; +#ifdef PNG_FLOATING_POINT_SUPPORTED + float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; +#endif + png_fixed_point int_x_white, int_y_white, int_x_red, int_y_red, int_x_green, + int_y_green, int_x_blue, int_y_blue; + + png_uint_32 uint_x, uint_y; + + png_debug(1, "in png_handle_cHRM"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before cHRM"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid cHRM after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->mode & PNG_HAVE_PLTE) + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Missing PLTE before cHRM"); + + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM) +#if defined(PNG_READ_sRGB_SUPPORTED) + && !(info_ptr->valid & PNG_INFO_sRGB) +#endif + ) + { + png_warning(png_ptr, "Duplicate cHRM chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 32) + { + png_warning(png_ptr, "Incorrect cHRM chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 32); + if (png_crc_finish(png_ptr, 0)) + return; + + uint_x = png_get_uint_32(buf); + uint_y = png_get_uint_32(buf + 4); + int_x_white = (png_fixed_point)uint_x; + int_y_white = (png_fixed_point)uint_y; + + uint_x = png_get_uint_32(buf + 8); + uint_y = png_get_uint_32(buf + 12); + int_x_red = (png_fixed_point)uint_x; + int_y_red = (png_fixed_point)uint_y; + + uint_x = png_get_uint_32(buf + 16); + uint_y = png_get_uint_32(buf + 20); + int_x_green = (png_fixed_point)uint_x; + int_y_green = (png_fixed_point)uint_y; + + uint_x = png_get_uint_32(buf + 24); + uint_y = png_get_uint_32(buf + 28); + int_x_blue = (png_fixed_point)uint_x; + int_y_blue = (png_fixed_point)uint_y; + +#ifdef PNG_FLOATING_POINT_SUPPORTED + white_x = (float)int_x_white / (float)100000.0; + white_y = (float)int_y_white / (float)100000.0; + red_x = (float)int_x_red / (float)100000.0; + red_y = (float)int_y_red / (float)100000.0; + green_x = (float)int_x_green / (float)100000.0; + green_y = (float)int_y_green / (float)100000.0; + blue_x = (float)int_x_blue / (float)100000.0; + blue_y = (float)int_y_blue / (float)100000.0; +#endif + +#if defined(PNG_READ_sRGB_SUPPORTED) + if ((info_ptr != NULL) && (info_ptr->valid & PNG_INFO_sRGB)) + { + if (PNG_OUT_OF_RANGE(int_x_white, 31270, 1000) || + PNG_OUT_OF_RANGE(int_y_white, 32900, 1000) || + PNG_OUT_OF_RANGE(int_x_red, 64000L, 1000) || + PNG_OUT_OF_RANGE(int_y_red, 33000, 1000) || + PNG_OUT_OF_RANGE(int_x_green, 30000, 1000) || + PNG_OUT_OF_RANGE(int_y_green, 60000L, 1000) || + PNG_OUT_OF_RANGE(int_x_blue, 15000, 1000) || + PNG_OUT_OF_RANGE(int_y_blue, 6000, 1000)) + { + png_warning(png_ptr, + "Ignoring incorrect cHRM value when sRGB is also present"); +#ifndef PNG_NO_CONSOLE_IO +#ifdef PNG_FLOATING_POINT_SUPPORTED + fprintf(stderr, "wx=%f, wy=%f, rx=%f, ry=%f\n", + white_x, white_y, red_x, red_y); + fprintf(stderr, "gx=%f, gy=%f, bx=%f, by=%f\n", + green_x, green_y, blue_x, blue_y); +#else + fprintf(stderr, "wx=%ld, wy=%ld, rx=%ld, ry=%ld\n", + int_x_white, int_y_white, int_x_red, int_y_red); + fprintf(stderr, "gx=%ld, gy=%ld, bx=%ld, by=%ld\n", + int_x_green, int_y_green, int_x_blue, int_y_blue); +#endif +#endif /* PNG_NO_CONSOLE_IO */ + } + return; + } +#endif /* PNG_READ_sRGB_SUPPORTED */ + +#ifdef PNG_FLOATING_POINT_SUPPORTED + png_set_cHRM(png_ptr, info_ptr, + white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED + png_set_cHRM_fixed(png_ptr, info_ptr, + int_x_white, int_y_white, int_x_red, int_y_red, int_x_green, + int_y_green, int_x_blue, int_y_blue); +#endif +} +#endif + +#if defined(PNG_READ_sRGB_SUPPORTED) +void /* PRIVATE */ +png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + int intent; + png_byte buf[1]; + + png_debug(1, "in png_handle_sRGB"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before sRGB"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid sRGB after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->mode & PNG_HAVE_PLTE) + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Out of place sRGB chunk"); + + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)) + { + png_warning(png_ptr, "Duplicate sRGB chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 1) + { + png_warning(png_ptr, "Incorrect sRGB chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 1); + if (png_crc_finish(png_ptr, 0)) + return; + + intent = buf[0]; + /* Check for bad intent */ + if (intent >= PNG_sRGB_INTENT_LAST) + { + png_warning(png_ptr, "Unknown sRGB intent"); + return; + } + +#if defined(PNG_READ_gAMA_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED) + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)) + { + png_fixed_point igamma; +#ifdef PNG_FIXED_POINT_SUPPORTED + igamma=info_ptr->int_gamma; +#else +# ifdef PNG_FLOATING_POINT_SUPPORTED + igamma=(png_fixed_point)(info_ptr->gamma * 100000.); +# endif +#endif + if (PNG_OUT_OF_RANGE(igamma, 45500L, 500)) + { + png_warning(png_ptr, + "Ignoring incorrect gAMA value when sRGB is also present"); +#ifndef PNG_NO_CONSOLE_IO +# ifdef PNG_FIXED_POINT_SUPPORTED + fprintf(stderr, "incorrect gamma=(%d/100000)\n", + (int)png_ptr->int_gamma); +# else +# ifdef PNG_FLOATING_POINT_SUPPORTED + fprintf(stderr, "incorrect gamma=%f\n", png_ptr->gamma); +# endif +# endif +#endif + } + } +#endif /* PNG_READ_gAMA_SUPPORTED */ + +#ifdef PNG_READ_cHRM_SUPPORTED +#ifdef PNG_FIXED_POINT_SUPPORTED + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)) + if (PNG_OUT_OF_RANGE(info_ptr->int_x_white, 31270, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_y_white, 32900, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_x_red, 64000L, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_y_red, 33000, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_x_green, 30000, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_y_green, 60000L, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_x_blue, 15000, 1000) || + PNG_OUT_OF_RANGE(info_ptr->int_y_blue, 6000, 1000)) + { + png_warning(png_ptr, + "Ignoring incorrect cHRM value when sRGB is also present"); + } +#endif /* PNG_FIXED_POINT_SUPPORTED */ +#endif /* PNG_READ_cHRM_SUPPORTED */ + + png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, intent); +} +#endif /* PNG_READ_sRGB_SUPPORTED */ + +#if defined(PNG_READ_iCCP_SUPPORTED) +void /* PRIVATE */ +png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +/* Note: this does not properly handle chunks that are > 64K under DOS */ +{ + png_byte compression_type; + png_bytep pC; + png_charp profile; + png_uint_32 skip = 0; + png_uint_32 profile_size, profile_length; + png_size_t slength, prefix_length, data_length; + + png_debug(1, "in png_handle_iCCP"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before iCCP"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid iCCP after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->mode & PNG_HAVE_PLTE) + /* Should be an error, but we can cope with it */ + png_warning(png_ptr, "Out of place iCCP chunk"); + + if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)) + { + png_warning(png_ptr, "Duplicate iCCP chunk"); + png_crc_finish(png_ptr, length); + return; + } + +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "iCCP chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1); + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, skip)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; + + for (profile = png_ptr->chunkdata; *profile; profile++) + /* Empty loop to find end of name */ ; + + ++profile; + + /* There should be at least one zero (the compression type byte) + * following the separator, and we should be on it + */ + if ( profile >= png_ptr->chunkdata + slength - 1) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "Malformed iCCP chunk"); + return; + } + + /* Compression_type should always be zero */ + compression_type = *profile++; + if (compression_type) + { + png_warning(png_ptr, "Ignoring nonzero compression type in iCCP chunk"); + compression_type = 0x00; /* Reset it to zero (libpng-1.0.6 through 1.0.8 + wrote nonzero) */ + } + + prefix_length = profile - png_ptr->chunkdata; + png_decompress_chunk(png_ptr, compression_type, + slength, prefix_length, &data_length); + + profile_length = data_length - prefix_length; + + if ( prefix_length > data_length || profile_length < 4) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "Profile size field missing from iCCP chunk"); + return; + } + + /* Check the profile_size recorded in the first 32 bits of the ICC profile */ + pC = (png_bytep)(png_ptr->chunkdata + prefix_length); + profile_size = ((*(pC ))<<24) | + ((*(pC + 1))<<16) | + ((*(pC + 2))<< 8) | + ((*(pC + 3)) ); + + if (profile_size < profile_length) + profile_length = profile_size; + + if (profile_size > profile_length) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "Ignoring truncated iCCP profile."); + return; + } + + png_set_iCCP(png_ptr, info_ptr, png_ptr->chunkdata, + compression_type, png_ptr->chunkdata + prefix_length, profile_length); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; +} +#endif /* PNG_READ_iCCP_SUPPORTED */ + +#if defined(PNG_READ_sPLT_SUPPORTED) +void /* PRIVATE */ +png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +/* Note: this does not properly handle chunks that are > 64K under DOS */ +{ + png_bytep entry_start; + png_sPLT_t new_palette; +#ifdef PNG_NO_POINTER_INDEXING + png_sPLT_entryp pp; +#endif + int data_length, entry_size, i; + png_uint_32 skip = 0; + png_size_t slength; + + png_debug(1, "in png_handle_sPLT"); + + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before sPLT"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid sPLT after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "sPLT chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc(png_ptr, length + 1); + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, skip)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; + + for (entry_start = (png_bytep)png_ptr->chunkdata; *entry_start; entry_start++) + /* Empty loop to find end of name */ ; + ++entry_start; + + /* A sample depth should follow the separator, and we should be on it */ + if (entry_start > (png_bytep)png_ptr->chunkdata + slength - 2) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "malformed sPLT chunk"); + return; + } + + new_palette.depth = *entry_start++; + entry_size = (new_palette.depth == 8 ? 6 : 10); + data_length = (slength - (entry_start - (png_bytep)png_ptr->chunkdata)); + + /* Integrity-check the data length */ + if (data_length % entry_size) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "sPLT chunk has bad length"); + return; + } + + new_palette.nentries = (png_int_32) ( data_length / entry_size); + if ((png_uint_32) new_palette.nentries > + (png_uint_32) (PNG_SIZE_MAX / png_sizeof(png_sPLT_entry))) + { + png_warning(png_ptr, "sPLT chunk too long"); + return; + } + new_palette.entries = (png_sPLT_entryp)png_malloc_warn( + png_ptr, new_palette.nentries * png_sizeof(png_sPLT_entry)); + if (new_palette.entries == NULL) + { + png_warning(png_ptr, "sPLT chunk requires too much memory"); + return; + } + +#ifndef PNG_NO_POINTER_INDEXING + for (i = 0; i < new_palette.nentries; i++) + { + png_sPLT_entryp pp = new_palette.entries + i; + + if (new_palette.depth == 8) + { + pp->red = *entry_start++; + pp->green = *entry_start++; + pp->blue = *entry_start++; + pp->alpha = *entry_start++; + } + else + { + pp->red = png_get_uint_16(entry_start); entry_start += 2; + pp->green = png_get_uint_16(entry_start); entry_start += 2; + pp->blue = png_get_uint_16(entry_start); entry_start += 2; + pp->alpha = png_get_uint_16(entry_start); entry_start += 2; + } + pp->frequency = png_get_uint_16(entry_start); entry_start += 2; + } +#else + pp = new_palette.entries; + for (i = 0; i < new_palette.nentries; i++) + { + + if (new_palette.depth == 8) + { + pp[i].red = *entry_start++; + pp[i].green = *entry_start++; + pp[i].blue = *entry_start++; + pp[i].alpha = *entry_start++; + } + else + { + pp[i].red = png_get_uint_16(entry_start); entry_start += 2; + pp[i].green = png_get_uint_16(entry_start); entry_start += 2; + pp[i].blue = png_get_uint_16(entry_start); entry_start += 2; + pp[i].alpha = png_get_uint_16(entry_start); entry_start += 2; + } + pp->frequency = png_get_uint_16(entry_start); entry_start += 2; + } +#endif + + /* Discard all chunk data except the name and stash that */ + new_palette.name = png_ptr->chunkdata; + + png_set_sPLT(png_ptr, info_ptr, &new_palette, 1); + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_free(png_ptr, new_palette.entries); +} +#endif /* PNG_READ_sPLT_SUPPORTED */ + +#if defined(PNG_READ_tRNS_SUPPORTED) +void /* PRIVATE */ +png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte readbuf[PNG_MAX_PALETTE_LENGTH]; + + png_debug(1, "in png_handle_tRNS"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before tRNS"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid tRNS after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) + { + png_warning(png_ptr, "Duplicate tRNS chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) + { + png_byte buf[2]; + + if (length != 2) + { + png_warning(png_ptr, "Incorrect tRNS chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 2); + png_ptr->num_trans = 1; + png_ptr->trans_values.gray = png_get_uint_16(buf); + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) + { + png_byte buf[6]; + + if (length != 6) + { + png_warning(png_ptr, "Incorrect tRNS chunk length"); + png_crc_finish(png_ptr, length); + return; + } + png_crc_read(png_ptr, buf, (png_size_t)length); + png_ptr->num_trans = 1; + png_ptr->trans_values.red = png_get_uint_16(buf); + png_ptr->trans_values.green = png_get_uint_16(buf + 2); + png_ptr->trans_values.blue = png_get_uint_16(buf + 4); + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (!(png_ptr->mode & PNG_HAVE_PLTE)) + { + /* Should be an error, but we can cope with it. */ + png_warning(png_ptr, "Missing PLTE before tRNS"); + } + if (length > (png_uint_32)png_ptr->num_palette || + length > PNG_MAX_PALETTE_LENGTH) + { + png_warning(png_ptr, "Incorrect tRNS chunk length"); + png_crc_finish(png_ptr, length); + return; + } + if (length == 0) + { + png_warning(png_ptr, "Zero length tRNS chunk"); + png_crc_finish(png_ptr, length); + return; + } + png_crc_read(png_ptr, readbuf, (png_size_t)length); + png_ptr->num_trans = (png_uint_16)length; + } + else + { + png_warning(png_ptr, "tRNS chunk not allowed with alpha channel"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_crc_finish(png_ptr, 0)) + { + png_ptr->num_trans = 0; + return; + } + + png_set_tRNS(png_ptr, info_ptr, readbuf, png_ptr->num_trans, + &(png_ptr->trans_values)); +} +#endif + +#if defined(PNG_READ_bKGD_SUPPORTED) +void /* PRIVATE */ +png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_size_t truelen; + png_byte buf[6]; + + png_debug(1, "in png_handle_bKGD"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before bKGD"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid bKGD after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && + !(png_ptr->mode & PNG_HAVE_PLTE)) + { + png_warning(png_ptr, "Missing PLTE before bKGD"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)) + { + png_warning(png_ptr, "Duplicate bKGD chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + truelen = 1; + else if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) + truelen = 6; + else + truelen = 2; + + if (length != truelen) + { + png_warning(png_ptr, "Incorrect bKGD chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, truelen); + if (png_crc_finish(png_ptr, 0)) + return; + + /* We convert the index value into RGB components so that we can allow + * arbitrary RGB values for background when we have transparency, and + * so it is easy to determine the RGB values of the background color + * from the info_ptr struct. */ + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + png_ptr->background.index = buf[0]; + if (info_ptr && info_ptr->num_palette) + { + if (buf[0] >= info_ptr->num_palette) + { + png_warning(png_ptr, "Incorrect bKGD chunk index value"); + return; + } + png_ptr->background.red = + (png_uint_16)png_ptr->palette[buf[0]].red; + png_ptr->background.green = + (png_uint_16)png_ptr->palette[buf[0]].green; + png_ptr->background.blue = + (png_uint_16)png_ptr->palette[buf[0]].blue; + } + } + else if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) /* GRAY */ + { + png_ptr->background.red = + png_ptr->background.green = + png_ptr->background.blue = + png_ptr->background.gray = png_get_uint_16(buf); + } + else + { + png_ptr->background.red = png_get_uint_16(buf); + png_ptr->background.green = png_get_uint_16(buf + 2); + png_ptr->background.blue = png_get_uint_16(buf + 4); + } + + png_set_bKGD(png_ptr, info_ptr, &(png_ptr->background)); +} +#endif + +#if defined(PNG_READ_hIST_SUPPORTED) +void /* PRIVATE */ +png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + unsigned int num, i; + png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH]; + + png_debug(1, "in png_handle_hIST"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before hIST"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid hIST after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (!(png_ptr->mode & PNG_HAVE_PLTE)) + { + png_warning(png_ptr, "Missing PLTE before hIST"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)) + { + png_warning(png_ptr, "Duplicate hIST chunk"); + png_crc_finish(png_ptr, length); + return; + } + + num = length / 2 ; + if (num != (unsigned int) png_ptr->num_palette || num > + (unsigned int) PNG_MAX_PALETTE_LENGTH) + { + png_warning(png_ptr, "Incorrect hIST chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + for (i = 0; i < num; i++) + { + png_byte buf[2]; + + png_crc_read(png_ptr, buf, 2); + readbuf[i] = png_get_uint_16(buf); + } + + if (png_crc_finish(png_ptr, 0)) + return; + + png_set_hIST(png_ptr, info_ptr, readbuf); +} +#endif + +#if defined(PNG_READ_pHYs_SUPPORTED) +void /* PRIVATE */ +png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[9]; + png_uint_32 res_x, res_y; + int unit_type; + + png_debug(1, "in png_handle_pHYs"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before pHYs"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid pHYs after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) + { + png_warning(png_ptr, "Duplicate pHYs chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 9) + { + png_warning(png_ptr, "Incorrect pHYs chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 9); + if (png_crc_finish(png_ptr, 0)) + return; + + res_x = png_get_uint_32(buf); + res_y = png_get_uint_32(buf + 4); + unit_type = buf[8]; + png_set_pHYs(png_ptr, info_ptr, res_x, res_y, unit_type); +} +#endif + +#if defined(PNG_READ_oFFs_SUPPORTED) +void /* PRIVATE */ +png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[9]; + png_int_32 offset_x, offset_y; + int unit_type; + + png_debug(1, "in png_handle_oFFs"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before oFFs"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid oFFs after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) + { + png_warning(png_ptr, "Duplicate oFFs chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (length != 9) + { + png_warning(png_ptr, "Incorrect oFFs chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 9); + if (png_crc_finish(png_ptr, 0)) + return; + + offset_x = png_get_int_32(buf); + offset_y = png_get_int_32(buf + 4); + unit_type = buf[8]; + png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, unit_type); +} +#endif + +#if defined(PNG_READ_pCAL_SUPPORTED) +/* Read the pCAL chunk (described in the PNG Extensions document) */ +void /* PRIVATE */ +png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_int_32 X0, X1; + png_byte type, nparams; + png_charp buf, units, endptr; + png_charpp params; + png_size_t slength; + int i; + + png_debug(1, "in png_handle_pCAL"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before pCAL"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid pCAL after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)) + { + png_warning(png_ptr, "Duplicate pCAL chunk"); + png_crc_finish(png_ptr, length); + return; + } + + png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)", + length + 1); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "No memory for pCAL purpose."); + return; + } + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, 0)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */ + + png_debug(3, "Finding end of pCAL purpose string"); + for (buf = png_ptr->chunkdata; *buf; buf++) + /* Empty loop */ ; + + endptr = png_ptr->chunkdata + slength; + + /* We need to have at least 12 bytes after the purpose string + in order to get the parameter information. */ + if (endptr <= buf + 12) + { + png_warning(png_ptr, "Invalid pCAL data"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_debug(3, "Reading pCAL X0, X1, type, nparams, and units"); + X0 = png_get_int_32((png_bytep)buf+1); + X1 = png_get_int_32((png_bytep)buf+5); + type = buf[9]; + nparams = buf[10]; + units = buf + 11; + + png_debug(3, "Checking pCAL equation type and number of parameters"); + /* Check that we have the right number of parameters for known + equation types. */ + if ((type == PNG_EQUATION_LINEAR && nparams != 2) || + (type == PNG_EQUATION_BASE_E && nparams != 3) || + (type == PNG_EQUATION_ARBITRARY && nparams != 3) || + (type == PNG_EQUATION_HYPERBOLIC && nparams != 4)) + { + png_warning(png_ptr, "Invalid pCAL parameters for equation type"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + else if (type >= PNG_EQUATION_LAST) + { + png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); + } + + for (buf = units; *buf; buf++) + /* Empty loop to move past the units string. */ ; + + png_debug(3, "Allocating pCAL parameters array"); + params = (png_charpp)png_malloc_warn(png_ptr, + (png_uint_32)(nparams * png_sizeof(png_charp))) ; + if (params == NULL) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_warning(png_ptr, "No memory for pCAL params."); + return; + } + + /* Get pointers to the start of each parameter string. */ + for (i = 0; i < (int)nparams; i++) + { + buf++; /* Skip the null string terminator from previous parameter. */ + + png_debug1(3, "Reading pCAL parameter %d", i); + for (params[i] = buf; buf <= endptr && *buf != 0x00; buf++) + /* Empty loop to move past each parameter string */ ; + + /* Make sure we haven't run out of data yet */ + if (buf > endptr) + { + png_warning(png_ptr, "Invalid pCAL data"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_free(png_ptr, params); + return; + } + } + + png_set_pCAL(png_ptr, info_ptr, png_ptr->chunkdata, X0, X1, type, nparams, + units, params); + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_free(png_ptr, params); +} +#endif + +#if defined(PNG_READ_sCAL_SUPPORTED) +/* Read the sCAL chunk */ +void /* PRIVATE */ +png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_charp ep; +#ifdef PNG_FLOATING_POINT_SUPPORTED + double width, height; + png_charp vp; +#else +#ifdef PNG_FIXED_POINT_SUPPORTED + png_charp swidth, sheight; +#endif +#endif + png_size_t slength; + + png_debug(1, "in png_handle_sCAL"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before sCAL"); + else if (png_ptr->mode & PNG_HAVE_IDAT) + { + png_warning(png_ptr, "Invalid sCAL after IDAT"); + png_crc_finish(png_ptr, length); + return; + } + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL)) + { + png_warning(png_ptr, "Duplicate sCAL chunk"); + png_crc_finish(png_ptr, length); + return; + } + + png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)", + length + 1); + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "Out of memory while processing sCAL chunk"); + return; + } + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, 0)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; /* Null terminate the last string */ + + ep = png_ptr->chunkdata + 1; /* Skip unit byte */ + +#ifdef PNG_FLOATING_POINT_SUPPORTED + width = png_strtod(png_ptr, ep, &vp); + if (*vp) + { + png_warning(png_ptr, "malformed width string in sCAL chunk"); + return; + } +#else +#ifdef PNG_FIXED_POINT_SUPPORTED + swidth = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1); + if (swidth == NULL) + { + png_warning(png_ptr, "Out of memory while processing sCAL chunk width"); + return; + } + png_memcpy(swidth, ep, (png_size_t)png_strlen(ep)); +#endif +#endif + + for (ep = png_ptr->chunkdata; *ep; ep++) + /* Empty loop */ ; + ep++; + + if (png_ptr->chunkdata + slength < ep) + { + png_warning(png_ptr, "Truncated sCAL chunk"); +#if defined(PNG_FIXED_POINT_SUPPORTED) && \ + !defined(PNG_FLOATING_POINT_SUPPORTED) + png_free(png_ptr, swidth); +#endif + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + +#ifdef PNG_FLOATING_POINT_SUPPORTED + height = png_strtod(png_ptr, ep, &vp); + if (*vp) + { + png_warning(png_ptr, "malformed height string in sCAL chunk"); + return; + } +#else +#ifdef PNG_FIXED_POINT_SUPPORTED + sheight = (png_charp)png_malloc_warn(png_ptr, png_strlen(ep) + 1); + if (sheight == NULL) + { + png_warning(png_ptr, "Out of memory while processing sCAL chunk height"); + return; + } + png_memcpy(sheight, ep, (png_size_t)png_strlen(ep)); +#endif +#endif + + if (png_ptr->chunkdata + slength < ep +#ifdef PNG_FLOATING_POINT_SUPPORTED + || width <= 0. || height <= 0. +#endif + ) + { + png_warning(png_ptr, "Invalid sCAL data"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; +#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) + png_free(png_ptr, swidth); + png_free(png_ptr, sheight); +#endif + return; + } + + +#ifdef PNG_FLOATING_POINT_SUPPORTED + png_set_sCAL(png_ptr, info_ptr, png_ptr->chunkdata[0], width, height); +#else +#ifdef PNG_FIXED_POINT_SUPPORTED + png_set_sCAL_s(png_ptr, info_ptr, png_ptr->chunkdata[0], swidth, sheight); +#endif +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; +#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED) + png_free(png_ptr, swidth); + png_free(png_ptr, sheight); +#endif +} +#endif + +#if defined(PNG_READ_tIME_SUPPORTED) +void /* PRIVATE */ +png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_byte buf[7]; + png_time mod_time; + + png_debug(1, "in png_handle_tIME"); + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Out of place tIME chunk"); + else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)) + { + png_warning(png_ptr, "Duplicate tIME chunk"); + png_crc_finish(png_ptr, length); + return; + } + + if (png_ptr->mode & PNG_HAVE_IDAT) + png_ptr->mode |= PNG_AFTER_IDAT; + + if (length != 7) + { + png_warning(png_ptr, "Incorrect tIME chunk length"); + png_crc_finish(png_ptr, length); + return; + } + + png_crc_read(png_ptr, buf, 7); + if (png_crc_finish(png_ptr, 0)) + return; + + mod_time.second = buf[6]; + mod_time.minute = buf[5]; + mod_time.hour = buf[4]; + mod_time.day = buf[3]; + mod_time.month = buf[2]; + mod_time.year = png_get_uint_16(buf); + + png_set_tIME(png_ptr, info_ptr, &mod_time); +} +#endif + +#if defined(PNG_READ_tEXt_SUPPORTED) +/* Note: this does not properly handle chunks that are > 64K under DOS */ +void /* PRIVATE */ +png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_textp text_ptr; + png_charp key; + png_charp text; + png_uint_32 skip = 0; + png_size_t slength; + int ret; + + png_debug(1, "in png_handle_tEXt"); + + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before tEXt"); + + if (png_ptr->mode & PNG_HAVE_IDAT) + png_ptr->mode |= PNG_AFTER_IDAT; + +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "tEXt chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "No memory to process text chunk."); + return; + } + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + + if (png_crc_finish(png_ptr, skip)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + key = png_ptr->chunkdata; + + key[slength] = 0x00; + + for (text = key; *text; text++) + /* Empty loop to find end of key */ ; + + if (text != key + slength) + text++; + + text_ptr = (png_textp)png_malloc_warn(png_ptr, + (png_uint_32)png_sizeof(png_text)); + if (text_ptr == NULL) + { + png_warning(png_ptr, "Not enough memory to process text chunk."); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + text_ptr->compression = PNG_TEXT_COMPRESSION_NONE; + text_ptr->key = key; +#ifdef PNG_iTXt_SUPPORTED + text_ptr->lang = NULL; + text_ptr->lang_key = NULL; + text_ptr->itxt_length = 0; +#endif + text_ptr->text = text; + text_ptr->text_length = png_strlen(text); + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + png_free(png_ptr, text_ptr); + if (ret) + png_warning(png_ptr, "Insufficient memory to process text chunk."); +} +#endif + +#if defined(PNG_READ_zTXt_SUPPORTED) +/* Note: this does not correctly handle chunks that are > 64K under DOS */ +void /* PRIVATE */ +png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_textp text_ptr; + png_charp text; + int comp_type; + int ret; + png_size_t slength, prefix_len, data_len; + + png_debug(1, "in png_handle_zTXt"); + + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before zTXt"); + + if (png_ptr->mode & PNG_HAVE_IDAT) + png_ptr->mode |= PNG_AFTER_IDAT; + +#ifdef PNG_MAX_MALLOC_64K + /* We will no doubt have problems with chunks even half this size, but + there is no hard and fast rule to tell us where to stop. */ + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "zTXt chunk too large to fit in memory"); + png_crc_finish(png_ptr, length); + return; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "Out of memory processing zTXt chunk."); + return; + } + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + if (png_crc_finish(png_ptr, 0)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; + + for (text = png_ptr->chunkdata; *text; text++) + /* Empty loop */ ; + + /* zTXt must have some text after the chunkdataword */ + if (text >= png_ptr->chunkdata + slength - 2) + { + png_warning(png_ptr, "Truncated zTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + else + { + comp_type = *(++text); + if (comp_type != PNG_TEXT_COMPRESSION_zTXt) + { + png_warning(png_ptr, "Unknown compression type in zTXt chunk"); + comp_type = PNG_TEXT_COMPRESSION_zTXt; + } + text++; /* Skip the compression_method byte */ + } + prefix_len = text - png_ptr->chunkdata; + + png_decompress_chunk(png_ptr, comp_type, + (png_size_t)length, prefix_len, &data_len); + + text_ptr = (png_textp)png_malloc_warn(png_ptr, + (png_uint_32)png_sizeof(png_text)); + if (text_ptr == NULL) + { + png_warning(png_ptr, "Not enough memory to process zTXt chunk."); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + text_ptr->compression = comp_type; + text_ptr->key = png_ptr->chunkdata; +#ifdef PNG_iTXt_SUPPORTED + text_ptr->lang = NULL; + text_ptr->lang_key = NULL; + text_ptr->itxt_length = 0; +#endif + text_ptr->text = png_ptr->chunkdata + prefix_len; + text_ptr->text_length = data_len; + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_free(png_ptr, text_ptr); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + if (ret) + png_error(png_ptr, "Insufficient memory to store zTXt chunk."); +} +#endif + +#if defined(PNG_READ_iTXt_SUPPORTED) +/* Note: this does not correctly handle chunks that are > 64K under DOS */ +void /* PRIVATE */ +png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_textp text_ptr; + png_charp key, lang, text, lang_key; + int comp_flag; + int comp_type = 0; + int ret; + png_size_t slength, prefix_len, data_len; + + png_debug(1, "in png_handle_iTXt"); + + + if (!(png_ptr->mode & PNG_HAVE_IHDR)) + png_error(png_ptr, "Missing IHDR before iTXt"); + + if (png_ptr->mode & PNG_HAVE_IDAT) + png_ptr->mode |= PNG_AFTER_IDAT; + +#ifdef PNG_MAX_MALLOC_64K + /* We will no doubt have problems with chunks even half this size, but + there is no hard and fast rule to tell us where to stop. */ + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "iTXt chunk too large to fit in memory"); + png_crc_finish(png_ptr, length); + return; + } +#endif + + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1); + if (png_ptr->chunkdata == NULL) + { + png_warning(png_ptr, "No memory to process iTXt chunk."); + return; + } + slength = (png_size_t)length; + png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength); + if (png_crc_finish(png_ptr, 0)) + { + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + png_ptr->chunkdata[slength] = 0x00; + + for (lang = png_ptr->chunkdata; *lang; lang++) + /* Empty loop */ ; + lang++; /* Skip NUL separator */ + + /* iTXt must have a language tag (possibly empty), two compression bytes, + * translated keyword (possibly empty), and possibly some text after the + * keyword + */ + + if (lang >= png_ptr->chunkdata + slength - 3) + { + png_warning(png_ptr, "Truncated iTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + else + { + comp_flag = *lang++; + comp_type = *lang++; + } + + for (lang_key = lang; *lang_key; lang_key++) + /* Empty loop */ ; + lang_key++; /* Skip NUL separator */ + + if (lang_key >= png_ptr->chunkdata + slength) + { + png_warning(png_ptr, "Truncated iTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + for (text = lang_key; *text; text++) + /* Empty loop */ ; + text++; /* Skip NUL separator */ + if (text >= png_ptr->chunkdata + slength) + { + png_warning(png_ptr, "Malformed iTXt chunk"); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + + prefix_len = text - png_ptr->chunkdata; + + key=png_ptr->chunkdata; + if (comp_flag) + png_decompress_chunk(png_ptr, comp_type, + (size_t)length, prefix_len, &data_len); + else + data_len = png_strlen(png_ptr->chunkdata + prefix_len); + text_ptr = (png_textp)png_malloc_warn(png_ptr, + (png_uint_32)png_sizeof(png_text)); + if (text_ptr == NULL) + { + png_warning(png_ptr, "Not enough memory to process iTXt chunk."); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + return; + } + text_ptr->compression = (int)comp_flag + 1; + text_ptr->lang_key = png_ptr->chunkdata + (lang_key - key); + text_ptr->lang = png_ptr->chunkdata + (lang - key); + text_ptr->itxt_length = data_len; + text_ptr->text_length = 0; + text_ptr->key = png_ptr->chunkdata; + text_ptr->text = png_ptr->chunkdata + prefix_len; + + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1); + + png_free(png_ptr, text_ptr); + png_free(png_ptr, png_ptr->chunkdata); + png_ptr->chunkdata = NULL; + if (ret) + png_error(png_ptr, "Insufficient memory to store iTXt chunk."); +} +#endif + +/* This function is called when we haven't found a handler for a + chunk. If there isn't a problem with the chunk itself (ie bad + chunk name, CRC, or a critical chunk), the chunk is silently ignored + -- unless the PNG_FLAG_UNKNOWN_CHUNKS_SUPPORTED flag is on in which + case it will be saved away to be written out later. */ +void /* PRIVATE */ +png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) +{ + png_uint_32 skip = 0; + + png_debug(1, "in png_handle_unknown"); + + + if (png_ptr->mode & PNG_HAVE_IDAT) + { +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_CONST PNG_IDAT; +#endif + if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) /* Not an IDAT */ + png_ptr->mode |= PNG_AFTER_IDAT; + } + + if (!(png_ptr->chunk_name[0] & 0x20)) + { +#if defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) + if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != + PNG_HANDLE_CHUNK_ALWAYS +#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) + && png_ptr->read_user_chunk_fn == NULL +#endif + ) +#endif + png_chunk_error(png_ptr, "unknown critical chunk"); + } + +#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) + if ((png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS) +#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) + || (png_ptr->read_user_chunk_fn != NULL) +#endif + ) + { +#ifdef PNG_MAX_MALLOC_64K + if (length > (png_uint_32)65535L) + { + png_warning(png_ptr, "unknown chunk too large to fit in memory"); + skip = length - (png_uint_32)65535L; + length = (png_uint_32)65535L; + } +#endif + png_memcpy((png_charp)png_ptr->unknown_chunk.name, + (png_charp)png_ptr->chunk_name, + png_sizeof(png_ptr->unknown_chunk.name)); + png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name)-1] = '\0'; + png_ptr->unknown_chunk.size = (png_size_t)length; + if (length == 0) + png_ptr->unknown_chunk.data = NULL; + else + { + png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length); + png_crc_read(png_ptr, (png_bytep)png_ptr->unknown_chunk.data, length); + } +#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) + if (png_ptr->read_user_chunk_fn != NULL) + { + /* Callback to user unknown chunk handler */ + int ret; + ret = (*(png_ptr->read_user_chunk_fn)) + (png_ptr, &png_ptr->unknown_chunk); + if (ret < 0) + png_chunk_error(png_ptr, "error in user chunk"); + if (ret == 0) + { + if (!(png_ptr->chunk_name[0] & 0x20)) +#if defined(PNG_HANDLE_AS_UNKNOWN_SUPPORTED) + if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name) != + PNG_HANDLE_CHUNK_ALWAYS) +#endif + png_chunk_error(png_ptr, "unknown critical chunk"); + png_set_unknown_chunks(png_ptr, info_ptr, + &png_ptr->unknown_chunk, 1); + } + } + else +#endif + png_set_unknown_chunks(png_ptr, info_ptr, &png_ptr->unknown_chunk, 1); + png_free(png_ptr, png_ptr->unknown_chunk.data); + png_ptr->unknown_chunk.data = NULL; + } + else +#endif + skip = length; + + png_crc_finish(png_ptr, skip); + +#if !defined(PNG_READ_USER_CHUNKS_SUPPORTED) + info_ptr = info_ptr; /* Quiet compiler warnings about unused info_ptr */ +#endif +} + +/* This function is called to verify that a chunk name is valid. + This function can't have the "critical chunk check" incorporated + into it, since in the future we will need to be able to call user + functions to handle unknown critical chunks after we check that + the chunk name itself is valid. */ + +#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) + +void /* PRIVATE */ +png_check_chunk_name(png_structp png_ptr, png_bytep chunk_name) +{ + png_debug(1, "in png_check_chunk_name"); + if (isnonalpha(chunk_name[0]) || isnonalpha(chunk_name[1]) || + isnonalpha(chunk_name[2]) || isnonalpha(chunk_name[3])) + { + png_chunk_error(png_ptr, "invalid chunk type"); + } +} + +/* Combines the row recently read in with the existing pixels in the + row. This routine takes care of alpha and transparency if requested. + This routine also handles the two methods of progressive display + of interlaced images, depending on the mask value. + The mask value describes which pixels are to be combined with + the row. The pattern always repeats every 8 pixels, so just 8 + bits are needed. A one indicates the pixel is to be combined, + a zero indicates the pixel is to be skipped. This is in addition + to any alpha or transparency value associated with the pixel. If + you want all pixels to be combined, pass 0xff (255) in mask. */ + +void /* PRIVATE */ +png_combine_row(png_structp png_ptr, png_bytep row, int mask) +{ + png_debug(1, "in png_combine_row"); + if (mask == 0xff) + { + png_memcpy(row, png_ptr->row_buf + 1, + PNG_ROWBYTES(png_ptr->row_info.pixel_depth, png_ptr->width)); + } + else + { + switch (png_ptr->row_info.pixel_depth) + { + case 1: + { + png_bytep sp = png_ptr->row_buf + 1; + png_bytep dp = row; + int s_inc, s_start, s_end; + int m = 0x80; + int shift; + png_uint_32 i; + png_uint_32 row_width = png_ptr->width; + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + { + s_start = 0; + s_end = 7; + s_inc = 1; + } + else +#endif + { + s_start = 7; + s_end = 0; + s_inc = -1; + } + + shift = s_start; + + for (i = 0; i < row_width; i++) + { + if (m & mask) + { + int value; + + value = (*sp >> shift) & 0x01; + *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff); + *dp |= (png_byte)(value << shift); + } + + if (shift == s_end) + { + shift = s_start; + sp++; + dp++; + } + else + shift += s_inc; + + if (m == 1) + m = 0x80; + else + m >>= 1; + } + break; + } + case 2: + { + png_bytep sp = png_ptr->row_buf + 1; + png_bytep dp = row; + int s_start, s_end, s_inc; + int m = 0x80; + int shift; + png_uint_32 i; + png_uint_32 row_width = png_ptr->width; + int value; + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + { + s_start = 0; + s_end = 6; + s_inc = 2; + } + else +#endif + { + s_start = 6; + s_end = 0; + s_inc = -2; + } + + shift = s_start; + + for (i = 0; i < row_width; i++) + { + if (m & mask) + { + value = (*sp >> shift) & 0x03; + *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff); + *dp |= (png_byte)(value << shift); + } + + if (shift == s_end) + { + shift = s_start; + sp++; + dp++; + } + else + shift += s_inc; + if (m == 1) + m = 0x80; + else + m >>= 1; + } + break; + } + case 4: + { + png_bytep sp = png_ptr->row_buf + 1; + png_bytep dp = row; + int s_start, s_end, s_inc; + int m = 0x80; + int shift; + png_uint_32 i; + png_uint_32 row_width = png_ptr->width; + int value; + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + { + s_start = 0; + s_end = 4; + s_inc = 4; + } + else +#endif + { + s_start = 4; + s_end = 0; + s_inc = -4; + } + shift = s_start; + + for (i = 0; i < row_width; i++) + { + if (m & mask) + { + value = (*sp >> shift) & 0xf; + *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff); + *dp |= (png_byte)(value << shift); + } + + if (shift == s_end) + { + shift = s_start; + sp++; + dp++; + } + else + shift += s_inc; + if (m == 1) + m = 0x80; + else + m >>= 1; + } + break; + } + default: + { + png_bytep sp = png_ptr->row_buf + 1; + png_bytep dp = row; + png_size_t pixel_bytes = (png_ptr->row_info.pixel_depth >> 3); + png_uint_32 i; + png_uint_32 row_width = png_ptr->width; + png_byte m = 0x80; + + + for (i = 0; i < row_width; i++) + { + if (m & mask) + { + png_memcpy(dp, sp, pixel_bytes); + } + + sp += pixel_bytes; + dp += pixel_bytes; + + if (m == 1) + m = 0x80; + else + m >>= 1; + } + break; + } + } + } +} + +#ifdef PNG_READ_INTERLACING_SUPPORTED +/* OLD pre-1.0.9 interface: +void png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass, + png_uint_32 transformations) + */ +void /* PRIVATE */ +png_do_read_interlace(png_structp png_ptr) +{ + png_row_infop row_info = &(png_ptr->row_info); + png_bytep row = png_ptr->row_buf + 1; + int pass = png_ptr->pass; + png_uint_32 transformations = png_ptr->transformations; +#ifdef PNG_USE_LOCAL_ARRAYS + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + /* Offset to next interlace block */ + PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; +#endif + + png_debug(1, "in png_do_read_interlace"); + if (row != NULL && row_info != NULL) + { + png_uint_32 final_width; + + final_width = row_info->width * png_pass_inc[pass]; + + switch (row_info->pixel_depth) + { + case 1: + { + png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 3); + png_bytep dp = row + (png_size_t)((final_width - 1) >> 3); + int sshift, dshift; + int s_start, s_end, s_inc; + int jstop = png_pass_inc[pass]; + png_byte v; + png_uint_32 i; + int j; + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (transformations & PNG_PACKSWAP) + { + sshift = (int)((row_info->width + 7) & 0x07); + dshift = (int)((final_width + 7) & 0x07); + s_start = 7; + s_end = 0; + s_inc = -1; + } + else +#endif + { + sshift = 7 - (int)((row_info->width + 7) & 0x07); + dshift = 7 - (int)((final_width + 7) & 0x07); + s_start = 0; + s_end = 7; + s_inc = 1; + } + + for (i = 0; i < row_info->width; i++) + { + v = (png_byte)((*sp >> sshift) & 0x01); + for (j = 0; j < jstop; j++) + { + *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff); + *dp |= (png_byte)(v << dshift); + if (dshift == s_end) + { + dshift = s_start; + dp--; + } + else + dshift += s_inc; + } + if (sshift == s_end) + { + sshift = s_start; + sp--; + } + else + sshift += s_inc; + } + break; + } + case 2: + { + png_bytep sp = row + (png_uint_32)((row_info->width - 1) >> 2); + png_bytep dp = row + (png_uint_32)((final_width - 1) >> 2); + int sshift, dshift; + int s_start, s_end, s_inc; + int jstop = png_pass_inc[pass]; + png_uint_32 i; + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (transformations & PNG_PACKSWAP) + { + sshift = (int)(((row_info->width + 3) & 0x03) << 1); + dshift = (int)(((final_width + 3) & 0x03) << 1); + s_start = 6; + s_end = 0; + s_inc = -2; + } + else +#endif + { + sshift = (int)((3 - ((row_info->width + 3) & 0x03)) << 1); + dshift = (int)((3 - ((final_width + 3) & 0x03)) << 1); + s_start = 0; + s_end = 6; + s_inc = 2; + } + + for (i = 0; i < row_info->width; i++) + { + png_byte v; + int j; + + v = (png_byte)((*sp >> sshift) & 0x03); + for (j = 0; j < jstop; j++) + { + *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff); + *dp |= (png_byte)(v << dshift); + if (dshift == s_end) + { + dshift = s_start; + dp--; + } + else + dshift += s_inc; + } + if (sshift == s_end) + { + sshift = s_start; + sp--; + } + else + sshift += s_inc; + } + break; + } + case 4: + { + png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 1); + png_bytep dp = row + (png_size_t)((final_width - 1) >> 1); + int sshift, dshift; + int s_start, s_end, s_inc; + png_uint_32 i; + int jstop = png_pass_inc[pass]; + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) + if (transformations & PNG_PACKSWAP) + { + sshift = (int)(((row_info->width + 1) & 0x01) << 2); + dshift = (int)(((final_width + 1) & 0x01) << 2); + s_start = 4; + s_end = 0; + s_inc = -4; + } + else +#endif + { + sshift = (int)((1 - ((row_info->width + 1) & 0x01)) << 2); + dshift = (int)((1 - ((final_width + 1) & 0x01)) << 2); + s_start = 0; + s_end = 4; + s_inc = 4; + } + + for (i = 0; i < row_info->width; i++) + { + png_byte v = (png_byte)((*sp >> sshift) & 0xf); + int j; + + for (j = 0; j < jstop; j++) + { + *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff); + *dp |= (png_byte)(v << dshift); + if (dshift == s_end) + { + dshift = s_start; + dp--; + } + else + dshift += s_inc; + } + if (sshift == s_end) + { + sshift = s_start; + sp--; + } + else + sshift += s_inc; + } + break; + } + default: + { + png_size_t pixel_bytes = (row_info->pixel_depth >> 3); + png_bytep sp = row + (png_size_t)(row_info->width - 1) * pixel_bytes; + png_bytep dp = row + (png_size_t)(final_width - 1) * pixel_bytes; + + int jstop = png_pass_inc[pass]; + png_uint_32 i; + + for (i = 0; i < row_info->width; i++) + { + png_byte v[8]; + int j; + + png_memcpy(v, sp, pixel_bytes); + for (j = 0; j < jstop; j++) + { + png_memcpy(dp, v, pixel_bytes); + dp -= pixel_bytes; + } + sp -= pixel_bytes; + } + break; + } + } + row_info->width = final_width; + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, final_width); + } +#if !defined(PNG_READ_PACKSWAP_SUPPORTED) + transformations = transformations; /* Silence compiler warning */ +#endif +} +#endif /* PNG_READ_INTERLACING_SUPPORTED */ + +void /* PRIVATE */ +png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row, + png_bytep prev_row, int filter) +{ + png_debug(1, "in png_read_filter_row"); + png_debug2(2, "row = %lu, filter = %d", png_ptr->row_number, filter); + switch (filter) + { + case PNG_FILTER_VALUE_NONE: + break; + case PNG_FILTER_VALUE_SUB: + { + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; + png_bytep rp = row + bpp; + png_bytep lp = row; + + for (i = bpp; i < istop; i++) + { + *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff); + rp++; + } + break; + } + case PNG_FILTER_VALUE_UP: + { + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + png_bytep rp = row; + png_bytep pp = prev_row; + + for (i = 0; i < istop; i++) + { + *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); + rp++; + } + break; + } + case PNG_FILTER_VALUE_AVG: + { + png_uint_32 i; + png_bytep rp = row; + png_bytep pp = prev_row; + png_bytep lp = row; + png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; + png_uint_32 istop = row_info->rowbytes - bpp; + + for (i = 0; i < bpp; i++) + { + *rp = (png_byte)(((int)(*rp) + + ((int)(*pp++) / 2 )) & 0xff); + rp++; + } + + for (i = 0; i < istop; i++) + { + *rp = (png_byte)(((int)(*rp) + + (int)(*pp++ + *lp++) / 2 ) & 0xff); + rp++; + } + break; + } + case PNG_FILTER_VALUE_PAETH: + { + png_uint_32 i; + png_bytep rp = row; + png_bytep pp = prev_row; + png_bytep lp = row; + png_bytep cp = prev_row; + png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3; + png_uint_32 istop=row_info->rowbytes - bpp; + + for (i = 0; i < bpp; i++) + { + *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); + rp++; + } + + for (i = 0; i < istop; i++) /* Use leftover rp,pp */ + { + int a, b, c, pa, pb, pc, p; + + a = *lp++; + b = *pp++; + c = *cp++; + + p = b - c; + pc = a - c; + +#ifdef PNG_USE_ABS + pa = abs(p); + pb = abs(pc); + pc = abs(p + pc); +#else + pa = p < 0 ? -p : p; + pb = pc < 0 ? -pc : pc; + pc = (p + pc) < 0 ? -(p + pc) : p + pc; +#endif + + /* + if (pa <= pb && pa <= pc) + p = a; + else if (pb <= pc) + p = b; + else + p = c; + */ + + p = (pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c; + + *rp = (png_byte)(((int)(*rp) + p) & 0xff); + rp++; + } + break; + } + default: + png_warning(png_ptr, "Ignoring bad adaptive filter type"); + *row = 0; + break; + } +} + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +void /* PRIVATE */ +png_read_finish_row(png_structp png_ptr) +{ +#ifdef PNG_USE_LOCAL_ARRAYS +#ifdef PNG_READ_INTERLACING_SUPPORTED + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* Start of interlace block */ + PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; + + /* Offset to next interlace block */ + PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; + + /* Start of interlace block in the y direction */ + PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; + + /* Offset to next interlace block in the y direction */ + PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; +#endif /* PNG_READ_INTERLACING_SUPPORTED */ +#endif + + png_debug(1, "in png_read_finish_row"); + png_ptr->row_number++; + if (png_ptr->row_number < png_ptr->num_rows) + return; + +#ifdef PNG_READ_INTERLACING_SUPPORTED + if (png_ptr->interlaced) + { + png_ptr->row_number = 0; + png_memset_check(png_ptr, png_ptr->prev_row, 0, + png_ptr->rowbytes + 1); + do + { + png_ptr->pass++; + if (png_ptr->pass >= 7) + break; + png_ptr->iwidth = (png_ptr->width + + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; + + png_ptr->irowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, + png_ptr->iwidth) + 1; + + if (!(png_ptr->transformations & PNG_INTERLACE)) + { + png_ptr->num_rows = (png_ptr->height + + png_pass_yinc[png_ptr->pass] - 1 - + png_pass_ystart[png_ptr->pass]) / + png_pass_yinc[png_ptr->pass]; + if (!(png_ptr->num_rows)) + continue; + } + else /* if (png_ptr->transformations & PNG_INTERLACE) */ + break; + } while (png_ptr->iwidth == 0); + + if (png_ptr->pass < 7) + return; + } +#endif /* PNG_READ_INTERLACING_SUPPORTED */ + + if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED)) + { +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_CONST PNG_IDAT; +#endif + char extra; + int ret; + + png_ptr->zstream.next_out = (Byte *)&extra; + png_ptr->zstream.avail_out = (uInt)1; + for (;;) + { + if (!(png_ptr->zstream.avail_in)) + { + while (!png_ptr->idat_size) + { + png_byte chunk_length[4]; + + png_crc_finish(png_ptr, 0); + + png_read_data(png_ptr, chunk_length, 4); + png_ptr->idat_size = png_get_uint_31(png_ptr, chunk_length); + png_reset_crc(png_ptr); + png_crc_read(png_ptr, png_ptr->chunk_name, 4); + if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) + png_error(png_ptr, "Not enough image data"); + + } + png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.next_in = png_ptr->zbuf; + if (png_ptr->zbuf_size > png_ptr->idat_size) + png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size; + png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zstream.avail_in); + png_ptr->idat_size -= png_ptr->zstream.avail_in; + } + ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH); + if (ret == Z_STREAM_END) + { + if (!(png_ptr->zstream.avail_out) || png_ptr->zstream.avail_in || + png_ptr->idat_size) + png_warning(png_ptr, "Extra compressed data"); + png_ptr->mode |= PNG_AFTER_IDAT; + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + break; + } + if (ret != Z_OK) + png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg : + "Decompression Error"); + + if (!(png_ptr->zstream.avail_out)) + { + png_warning(png_ptr, "Extra compressed data."); + png_ptr->mode |= PNG_AFTER_IDAT; + png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED; + break; + } + + } + png_ptr->zstream.avail_out = 0; + } + + if (png_ptr->idat_size || png_ptr->zstream.avail_in) + png_warning(png_ptr, "Extra compression data"); + + inflateReset(&png_ptr->zstream); + + png_ptr->mode |= PNG_AFTER_IDAT; +} +#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */ + +void /* PRIVATE */ +png_read_start_row(png_structp png_ptr) +{ +#ifdef PNG_USE_LOCAL_ARRAYS +#ifdef PNG_READ_INTERLACING_SUPPORTED + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* Start of interlace block */ + PNG_CONST int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; + + /* Offset to next interlace block */ + PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; + + /* Start of interlace block in the y direction */ + PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; + + /* Offset to next interlace block in the y direction */ + PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; +#endif +#endif + + int max_pixel_depth; + png_size_t row_bytes; + + png_debug(1, "in png_read_start_row"); + png_ptr->zstream.avail_in = 0; + png_init_read_transformations(png_ptr); +#ifdef PNG_READ_INTERLACING_SUPPORTED + if (png_ptr->interlaced) + { + if (!(png_ptr->transformations & PNG_INTERLACE)) + png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - + png_pass_ystart[0]) / png_pass_yinc[0]; + else + png_ptr->num_rows = png_ptr->height; + + png_ptr->iwidth = (png_ptr->width + + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; + + png_ptr->irowbytes = + PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1; + } + else +#endif /* PNG_READ_INTERLACING_SUPPORTED */ + { + png_ptr->num_rows = png_ptr->height; + png_ptr->iwidth = png_ptr->width; + png_ptr->irowbytes = png_ptr->rowbytes + 1; + } + max_pixel_depth = png_ptr->pixel_depth; + +#if defined(PNG_READ_PACK_SUPPORTED) + if ((png_ptr->transformations & PNG_PACK) && png_ptr->bit_depth < 8) + max_pixel_depth = 8; +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) + if (png_ptr->transformations & PNG_EXPAND) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + if (png_ptr->num_trans) + max_pixel_depth = 32; + else + max_pixel_depth = 24; + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) + { + if (max_pixel_depth < 8) + max_pixel_depth = 8; + if (png_ptr->num_trans) + max_pixel_depth *= 2; + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) + { + if (png_ptr->num_trans) + { + max_pixel_depth *= 4; + max_pixel_depth /= 3; + } + } + } +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) + if (png_ptr->transformations & (PNG_FILLER)) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + max_pixel_depth = 32; + else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) + { + if (max_pixel_depth <= 8) + max_pixel_depth = 16; + else + max_pixel_depth = 32; + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) + { + if (max_pixel_depth <= 32) + max_pixel_depth = 32; + else + max_pixel_depth = 64; + } + } +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) + if (png_ptr->transformations & PNG_GRAY_TO_RGB) + { + if ( +#if defined(PNG_READ_EXPAND_SUPPORTED) + (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND)) || +#endif +#if defined(PNG_READ_FILLER_SUPPORTED) + (png_ptr->transformations & (PNG_FILLER)) || +#endif + png_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + if (max_pixel_depth <= 16) + max_pixel_depth = 32; + else + max_pixel_depth = 64; + } + else + { + if (max_pixel_depth <= 8) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + max_pixel_depth = 32; + else + max_pixel_depth = 24; + } + else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + max_pixel_depth = 64; + else + max_pixel_depth = 48; + } + } +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \ +defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) + if (png_ptr->transformations & PNG_USER_TRANSFORM) + { + int user_pixel_depth = png_ptr->user_transform_depth* + png_ptr->user_transform_channels; + if (user_pixel_depth > max_pixel_depth) + max_pixel_depth=user_pixel_depth; + } +#endif + + /* Align the width on the next larger 8 pixels. Mainly used + * for interlacing + */ + row_bytes = ((png_ptr->width + 7) & ~((png_uint_32)7)); + /* Calculate the maximum bytes needed, adding a byte and a pixel + * for safety's sake + */ + row_bytes = PNG_ROWBYTES(max_pixel_depth, row_bytes) + + 1 + ((max_pixel_depth + 7) >> 3); +#ifdef PNG_MAX_MALLOC_64K + if (row_bytes > (png_uint_32)65536L) + png_error(png_ptr, "This image requires a row greater than 64KB"); +#endif + + if (row_bytes + 64 > png_ptr->old_big_row_buf_size) + { + png_free(png_ptr, png_ptr->big_row_buf); + png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes + 64); + if (png_ptr->interlaced) + png_memset(png_ptr->big_row_buf, 0, row_bytes + 64); + png_ptr->row_buf = png_ptr->big_row_buf + 32; + png_ptr->old_big_row_buf_size = row_bytes + 64; + } + +#ifdef PNG_MAX_MALLOC_64K + if ((png_uint_32)row_bytes + 1 > (png_uint_32)65536L) + png_error(png_ptr, "This image requires a row greater than 64KB"); +#endif + if ((png_uint_32)row_bytes > (png_uint_32)(PNG_SIZE_MAX - 1)) + png_error(png_ptr, "Row has too many bytes to allocate in memory."); + + if (row_bytes + 1 > png_ptr->old_prev_row_size) + { + png_free(png_ptr, png_ptr->prev_row); + png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)( + row_bytes + 1)); + png_memset_check(png_ptr, png_ptr->prev_row, 0, row_bytes + 1); + png_ptr->old_prev_row_size = row_bytes + 1; + } + + png_ptr->rowbytes = row_bytes; + + png_debug1(3, "width = %lu,", png_ptr->width); + png_debug1(3, "height = %lu,", png_ptr->height); + png_debug1(3, "iwidth = %lu,", png_ptr->iwidth); + png_debug1(3, "num_rows = %lu,", png_ptr->num_rows); + png_debug1(3, "rowbytes = %lu,", png_ptr->rowbytes); + png_debug1(3, "irowbytes = %lu", png_ptr->irowbytes); + + png_ptr->flags |= PNG_FLAG_ROW_INIT; +} +#endif /* PNG_READ_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/png/pngset.c b/third_party/windows/fltk-1.1.10/png/pngset.c new file mode 100644 index 0000000..e36b7e6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngset.c @@ -0,0 +1,1285 @@ + +/* pngset.c - storage of image information into info struct + * + * Last changed in libpng 1.2.40 [September 10, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * The functions here are used during reads to store data from the file + * into the info struct, and during writes to store application data + * into the info struct for writing into the file. This abstracts the + * info struct and allows us to change the structure in the future. + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +#if defined(PNG_bKGD_SUPPORTED) +void PNGAPI +png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background) +{ + png_debug1(1, "in %s storage function", "bKGD"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + png_memcpy(&(info_ptr->background), background, png_sizeof(png_color_16)); + info_ptr->valid |= PNG_INFO_bKGD; +} +#endif + +#if defined(PNG_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_cHRM(png_structp png_ptr, png_infop info_ptr, + double white_x, double white_y, double red_x, double red_y, + double green_x, double green_y, double blue_x, double blue_y) +{ + png_debug1(1, "in %s storage function", "cHRM"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->x_white = (float)white_x; + info_ptr->y_white = (float)white_y; + info_ptr->x_red = (float)red_x; + info_ptr->y_red = (float)red_y; + info_ptr->x_green = (float)green_x; + info_ptr->y_green = (float)green_y; + info_ptr->x_blue = (float)blue_x; + info_ptr->y_blue = (float)blue_y; +#ifdef PNG_FIXED_POINT_SUPPORTED + info_ptr->int_x_white = (png_fixed_point)(white_x*100000.+0.5); + info_ptr->int_y_white = (png_fixed_point)(white_y*100000.+0.5); + info_ptr->int_x_red = (png_fixed_point)( red_x*100000.+0.5); + info_ptr->int_y_red = (png_fixed_point)( red_y*100000.+0.5); + info_ptr->int_x_green = (png_fixed_point)(green_x*100000.+0.5); + info_ptr->int_y_green = (png_fixed_point)(green_y*100000.+0.5); + info_ptr->int_x_blue = (png_fixed_point)( blue_x*100000.+0.5); + info_ptr->int_y_blue = (png_fixed_point)( blue_y*100000.+0.5); +#endif + info_ptr->valid |= PNG_INFO_cHRM; +} +#endif /* PNG_FLOATING_POINT_SUPPORTED */ + +#ifdef PNG_FIXED_POINT_SUPPORTED +void PNGAPI +png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr, + png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, + png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, + png_fixed_point blue_x, png_fixed_point blue_y) +{ + png_debug1(1, "in %s storage function", "cHRM fixed"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + +#if !defined(PNG_NO_CHECK_cHRM) + if (png_check_cHRM_fixed(png_ptr, + white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y)) +#endif + { + info_ptr->int_x_white = white_x; + info_ptr->int_y_white = white_y; + info_ptr->int_x_red = red_x; + info_ptr->int_y_red = red_y; + info_ptr->int_x_green = green_x; + info_ptr->int_y_green = green_y; + info_ptr->int_x_blue = blue_x; + info_ptr->int_y_blue = blue_y; +#ifdef PNG_FLOATING_POINT_SUPPORTED + info_ptr->x_white = (float)(white_x/100000.); + info_ptr->y_white = (float)(white_y/100000.); + info_ptr->x_red = (float)( red_x/100000.); + info_ptr->y_red = (float)( red_y/100000.); + info_ptr->x_green = (float)(green_x/100000.); + info_ptr->y_green = (float)(green_y/100000.); + info_ptr->x_blue = (float)( blue_x/100000.); + info_ptr->y_blue = (float)( blue_y/100000.); +#endif + info_ptr->valid |= PNG_INFO_cHRM; + } +} +#endif /* PNG_FIXED_POINT_SUPPORTED */ +#endif /* PNG_cHRM_SUPPORTED */ + +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma) +{ + double png_gamma; + + png_debug1(1, "in %s storage function", "gAMA"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + /* Check for overflow */ + if (file_gamma > 21474.83) + { + png_warning(png_ptr, "Limiting gamma to 21474.83"); + png_gamma=21474.83; + } + else + png_gamma = file_gamma; + info_ptr->gamma = (float)png_gamma; +#ifdef PNG_FIXED_POINT_SUPPORTED + info_ptr->int_gamma = (int)(png_gamma*100000.+.5); +#endif + info_ptr->valid |= PNG_INFO_gAMA; + if (png_gamma == 0.0) + png_warning(png_ptr, "Setting gamma=0"); +} +#endif +void PNGAPI +png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point + int_gamma) +{ + png_fixed_point png_gamma; + + png_debug1(1, "in %s storage function", "gAMA"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (int_gamma > (png_fixed_point)PNG_UINT_31_MAX) + { + png_warning(png_ptr, "Limiting gamma to 21474.83"); + png_gamma=PNG_UINT_31_MAX; + } + else + { + if (int_gamma < 0) + { + png_warning(png_ptr, "Setting negative gamma to zero"); + png_gamma = 0; + } + else + png_gamma = int_gamma; + } +#ifdef PNG_FLOATING_POINT_SUPPORTED + info_ptr->gamma = (float)(png_gamma/100000.); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED + info_ptr->int_gamma = png_gamma; +#endif + info_ptr->valid |= PNG_INFO_gAMA; + if (png_gamma == 0) + png_warning(png_ptr, "Setting gamma=0"); +} +#endif + +#if defined(PNG_hIST_SUPPORTED) +void PNGAPI +png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist) +{ + int i; + + png_debug1(1, "in %s storage function", "hIST"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (info_ptr->num_palette == 0 || info_ptr->num_palette + > PNG_MAX_PALETTE_LENGTH) + { + png_warning(png_ptr, + "Invalid palette size, hIST allocation skipped."); + return; + } + +#ifdef PNG_FREE_ME_SUPPORTED + png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0); +#endif + /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in + * version 1.2.1 + */ + png_ptr->hist = (png_uint_16p)png_malloc_warn(png_ptr, + (png_uint_32)(PNG_MAX_PALETTE_LENGTH * png_sizeof(png_uint_16))); + if (png_ptr->hist == NULL) + { + png_warning(png_ptr, "Insufficient memory for hIST chunk data."); + return; + } + + for (i = 0; i < info_ptr->num_palette; i++) + png_ptr->hist[i] = hist[i]; + info_ptr->hist = png_ptr->hist; + info_ptr->valid |= PNG_INFO_hIST; + +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_HIST; +#else + png_ptr->flags |= PNG_FLAG_FREE_HIST; +#endif +} +#endif + +void PNGAPI +png_set_IHDR(png_structp png_ptr, png_infop info_ptr, + png_uint_32 width, png_uint_32 height, int bit_depth, + int color_type, int interlace_type, int compression_type, + int filter_type) +{ + png_debug1(1, "in %s storage function", "IHDR"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + /* Check for width and height valid values */ + if (width == 0 || height == 0) + png_error(png_ptr, "Image width or height is zero in IHDR"); +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + if (width > png_ptr->user_width_max || height > png_ptr->user_height_max) + png_error(png_ptr, "image size exceeds user limits in IHDR"); +#else + if (width > PNG_USER_WIDTH_MAX || height > PNG_USER_HEIGHT_MAX) + png_error(png_ptr, "image size exceeds user limits in IHDR"); +#endif + if (width > PNG_UINT_31_MAX || height > PNG_UINT_31_MAX) + png_error(png_ptr, "Invalid image size in IHDR"); + if ( width > (PNG_UINT_32_MAX + >> 3) /* 8-byte RGBA pixels */ + - 64 /* bigrowbuf hack */ + - 1 /* filter byte */ + - 7*8 /* rounding of width to multiple of 8 pixels */ + - 8) /* extra max_pixel_depth pad */ + png_warning(png_ptr, "Width is too large for libpng to process pixels"); + + /* Check other values */ + if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 && + bit_depth != 8 && bit_depth != 16) + png_error(png_ptr, "Invalid bit depth in IHDR"); + + if (color_type < 0 || color_type == 1 || + color_type == 5 || color_type > 6) + png_error(png_ptr, "Invalid color type in IHDR"); + + if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) || + ((color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8)) + png_error(png_ptr, "Invalid color type/bit depth combination in IHDR"); + + if (interlace_type >= PNG_INTERLACE_LAST) + png_error(png_ptr, "Unknown interlace method in IHDR"); + + if (compression_type != PNG_COMPRESSION_TYPE_BASE) + png_error(png_ptr, "Unknown compression method in IHDR"); + +#if defined(PNG_MNG_FEATURES_SUPPORTED) + /* Accept filter_method 64 (intrapixel differencing) only if + * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and + * 2. Libpng did not read a PNG signature (this filter_method is only + * used in PNG datastreams that are embedded in MNG datastreams) and + * 3. The application called png_permit_mng_features with a mask that + * included PNG_FLAG_MNG_FILTER_64 and + * 4. The filter_method is 64 and + * 5. The color_type is RGB or RGBA + */ + if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&png_ptr->mng_features_permitted) + png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); + if (filter_type != PNG_FILTER_TYPE_BASE) + { + if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + (filter_type == PNG_INTRAPIXEL_DIFFERENCING) && + ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && + (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA))) + png_error(png_ptr, "Unknown filter method in IHDR"); + if (png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) + png_warning(png_ptr, "Invalid filter method in IHDR"); + } +#else + if (filter_type != PNG_FILTER_TYPE_BASE) + png_error(png_ptr, "Unknown filter method in IHDR"); +#endif + + info_ptr->width = width; + info_ptr->height = height; + info_ptr->bit_depth = (png_byte)bit_depth; + info_ptr->color_type =(png_byte) color_type; + info_ptr->compression_type = (png_byte)compression_type; + info_ptr->filter_type = (png_byte)filter_type; + info_ptr->interlace_type = (png_byte)interlace_type; + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + info_ptr->channels = 1; + else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) + info_ptr->channels = 3; + else + info_ptr->channels = 1; + if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) + info_ptr->channels++; + info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); + + /* Check for potential overflow */ + if (width > (PNG_UINT_32_MAX + >> 3) /* 8-byte RGBA pixels */ + - 64 /* bigrowbuf hack */ + - 1 /* filter byte */ + - 7*8 /* rounding of width to multiple of 8 pixels */ + - 8) /* extra max_pixel_depth pad */ + info_ptr->rowbytes = (png_size_t)0; + else + info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width); +} + +#if defined(PNG_oFFs_SUPPORTED) +void PNGAPI +png_set_oFFs(png_structp png_ptr, png_infop info_ptr, + png_int_32 offset_x, png_int_32 offset_y, int unit_type) +{ + png_debug1(1, "in %s storage function", "oFFs"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->x_offset = offset_x; + info_ptr->y_offset = offset_y; + info_ptr->offset_unit_type = (png_byte)unit_type; + info_ptr->valid |= PNG_INFO_oFFs; +} +#endif + +#if defined(PNG_pCAL_SUPPORTED) +void PNGAPI +png_set_pCAL(png_structp png_ptr, png_infop info_ptr, + png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, + png_charp units, png_charpp params) +{ + png_uint_32 length; + int i; + + png_debug1(1, "in %s storage function", "pCAL"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + length = png_strlen(purpose) + 1; + png_debug1(3, "allocating purpose for info (%lu bytes)", + (unsigned long)length); + info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length); + if (info_ptr->pcal_purpose == NULL) + { + png_warning(png_ptr, "Insufficient memory for pCAL purpose."); + return; + } + png_memcpy(info_ptr->pcal_purpose, purpose, (png_size_t)length); + + png_debug(3, "storing X0, X1, type, and nparams in info"); + info_ptr->pcal_X0 = X0; + info_ptr->pcal_X1 = X1; + info_ptr->pcal_type = (png_byte)type; + info_ptr->pcal_nparams = (png_byte)nparams; + + length = png_strlen(units) + 1; + png_debug1(3, "allocating units for info (%lu bytes)", + (unsigned long)length); + info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length); + if (info_ptr->pcal_units == NULL) + { + png_warning(png_ptr, "Insufficient memory for pCAL units."); + return; + } + png_memcpy(info_ptr->pcal_units, units, (png_size_t)length); + + info_ptr->pcal_params = (png_charpp)png_malloc_warn(png_ptr, + (png_uint_32)((nparams + 1) * png_sizeof(png_charp))); + if (info_ptr->pcal_params == NULL) + { + png_warning(png_ptr, "Insufficient memory for pCAL params."); + return; + } + + png_memset(info_ptr->pcal_params, 0, (nparams + 1) * png_sizeof(png_charp)); + + for (i = 0; i < nparams; i++) + { + length = png_strlen(params[i]) + 1; + png_debug2(3, "allocating parameter %d for info (%lu bytes)", i, + (unsigned long)length); + info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length); + if (info_ptr->pcal_params[i] == NULL) + { + png_warning(png_ptr, "Insufficient memory for pCAL parameter."); + return; + } + png_memcpy(info_ptr->pcal_params[i], params[i], (png_size_t)length); + } + + info_ptr->valid |= PNG_INFO_pCAL; +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_PCAL; +#endif +} +#endif + +#if defined(PNG_READ_sCAL_SUPPORTED) || defined(PNG_WRITE_sCAL_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +void PNGAPI +png_set_sCAL(png_structp png_ptr, png_infop info_ptr, + int unit, double width, double height) +{ + png_debug1(1, "in %s storage function", "sCAL"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->scal_unit = (png_byte)unit; + info_ptr->scal_pixel_width = width; + info_ptr->scal_pixel_height = height; + + info_ptr->valid |= PNG_INFO_sCAL; +} +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +void PNGAPI +png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr, + int unit, png_charp swidth, png_charp sheight) +{ + png_uint_32 length; + + png_debug1(1, "in %s storage function", "sCAL"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->scal_unit = (png_byte)unit; + + length = png_strlen(swidth) + 1; + png_debug1(3, "allocating unit for info (%u bytes)", + (unsigned int)length); + info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, length); + if (info_ptr->scal_s_width == NULL) + { + png_warning(png_ptr, + "Memory allocation failed while processing sCAL."); + return; + } + png_memcpy(info_ptr->scal_s_width, swidth, (png_size_t)length); + + length = png_strlen(sheight) + 1; + png_debug1(3, "allocating unit for info (%u bytes)", + (unsigned int)length); + info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, length); + if (info_ptr->scal_s_height == NULL) + { + png_free (png_ptr, info_ptr->scal_s_width); + info_ptr->scal_s_width = NULL; + png_warning(png_ptr, + "Memory allocation failed while processing sCAL."); + return; + } + png_memcpy(info_ptr->scal_s_height, sheight, (png_size_t)length); + info_ptr->valid |= PNG_INFO_sCAL; +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_SCAL; +#endif +} +#endif +#endif +#endif + +#if defined(PNG_pHYs_SUPPORTED) +void PNGAPI +png_set_pHYs(png_structp png_ptr, png_infop info_ptr, + png_uint_32 res_x, png_uint_32 res_y, int unit_type) +{ + png_debug1(1, "in %s storage function", "pHYs"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->x_pixels_per_unit = res_x; + info_ptr->y_pixels_per_unit = res_y; + info_ptr->phys_unit_type = (png_byte)unit_type; + info_ptr->valid |= PNG_INFO_pHYs; +} +#endif + +void PNGAPI +png_set_PLTE(png_structp png_ptr, png_infop info_ptr, + png_colorp palette, int num_palette) +{ + + png_debug1(1, "in %s storage function", "PLTE"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH) + { + if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + png_error(png_ptr, "Invalid palette length"); + else + { + png_warning(png_ptr, "Invalid palette length"); + return; + } + } + + /* + * It may not actually be necessary to set png_ptr->palette here; + * we do it for backward compatibility with the way the png_handle_tRNS + * function used to do the allocation. + */ +#ifdef PNG_FREE_ME_SUPPORTED + png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0); +#endif + + /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead + * of num_palette entries, in case of an invalid PNG file that has + * too-large sample values. + */ + png_ptr->palette = (png_colorp)png_malloc(png_ptr, + PNG_MAX_PALETTE_LENGTH * png_sizeof(png_color)); + png_memset(png_ptr->palette, 0, PNG_MAX_PALETTE_LENGTH * + png_sizeof(png_color)); + png_memcpy(png_ptr->palette, palette, num_palette * png_sizeof(png_color)); + info_ptr->palette = png_ptr->palette; + info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette; + +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_PLTE; +#else + png_ptr->flags |= PNG_FLAG_FREE_PLTE; +#endif + + info_ptr->valid |= PNG_INFO_PLTE; +} + +#if defined(PNG_sBIT_SUPPORTED) +void PNGAPI +png_set_sBIT(png_structp png_ptr, png_infop info_ptr, + png_color_8p sig_bit) +{ + png_debug1(1, "in %s storage function", "sBIT"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof(png_color_8)); + info_ptr->valid |= PNG_INFO_sBIT; +} +#endif + +#if defined(PNG_sRGB_SUPPORTED) +void PNGAPI +png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent) +{ + png_debug1(1, "in %s storage function", "sRGB"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + info_ptr->srgb_intent = (png_byte)intent; + info_ptr->valid |= PNG_INFO_sRGB; +} + +void PNGAPI +png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr, + int intent) +{ +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED + float file_gamma; +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED + png_fixed_point int_file_gamma; +#endif +#endif +#if defined(PNG_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED + float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y; +#endif + png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, + int_green_y, int_blue_x, int_blue_y; +#endif + png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + png_set_sRGB(png_ptr, info_ptr, intent); + +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED + file_gamma = (float).45455; + png_set_gAMA(png_ptr, info_ptr, file_gamma); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED + int_file_gamma = 45455L; + png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma); +#endif +#endif + +#if defined(PNG_cHRM_SUPPORTED) + int_white_x = 31270L; + int_white_y = 32900L; + int_red_x = 64000L; + int_red_y = 33000L; + int_green_x = 30000L; + int_green_y = 60000L; + int_blue_x = 15000L; + int_blue_y = 6000L; + +#ifdef PNG_FLOATING_POINT_SUPPORTED + white_x = (float).3127; + white_y = (float).3290; + red_x = (float).64; + red_y = (float).33; + green_x = (float).30; + green_y = (float).60; + blue_x = (float).15; + blue_y = (float).06; +#endif + +#if !defined(PNG_NO_CHECK_cHRM) + if (png_check_cHRM_fixed(png_ptr, + int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, + int_green_y, int_blue_x, int_blue_y)) +#endif + { +#ifdef PNG_FIXED_POINT_SUPPORTED + png_set_cHRM_fixed(png_ptr, info_ptr, + int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, + int_green_y, int_blue_x, int_blue_y); +#endif +#ifdef PNG_FLOATING_POINT_SUPPORTED + png_set_cHRM(png_ptr, info_ptr, + white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y); +#endif + } +#endif /* cHRM */ +} +#endif /* sRGB */ + + +#if defined(PNG_iCCP_SUPPORTED) +void PNGAPI +png_set_iCCP(png_structp png_ptr, png_infop info_ptr, + png_charp name, int compression_type, + png_charp profile, png_uint_32 proflen) +{ + png_charp new_iccp_name; + png_charp new_iccp_profile; + png_uint_32 length; + + png_debug1(1, "in %s storage function", "iCCP"); + + if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL) + return; + + length = png_strlen(name)+1; + new_iccp_name = (png_charp)png_malloc_warn(png_ptr, length); + if (new_iccp_name == NULL) + { + png_warning(png_ptr, "Insufficient memory to process iCCP chunk."); + return; + } + png_memcpy(new_iccp_name, name, length); + new_iccp_profile = (png_charp)png_malloc_warn(png_ptr, proflen); + if (new_iccp_profile == NULL) + { + png_free (png_ptr, new_iccp_name); + png_warning(png_ptr, + "Insufficient memory to process iCCP profile."); + return; + } + png_memcpy(new_iccp_profile, profile, (png_size_t)proflen); + + png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0); + + info_ptr->iccp_proflen = proflen; + info_ptr->iccp_name = new_iccp_name; + info_ptr->iccp_profile = new_iccp_profile; + /* Compression is always zero but is here so the API and info structure + * does not have to change if we introduce multiple compression types */ + info_ptr->iccp_compression = (png_byte)compression_type; +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_ICCP; +#endif + info_ptr->valid |= PNG_INFO_iCCP; +} +#endif + +#if defined(PNG_TEXT_SUPPORTED) +void PNGAPI +png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, + int num_text) +{ + int ret; + ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text); + if (ret) + png_error(png_ptr, "Insufficient memory to store text"); +} + +int /* PRIVATE */ +png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr, + int num_text) +{ + int i; + + png_debug1(1, "in %s storage function", ((png_ptr == NULL || + png_ptr->chunk_name[0] == '\0') ? + "text" : (png_const_charp)png_ptr->chunk_name)); + + if (png_ptr == NULL || info_ptr == NULL || num_text == 0) + return(0); + + /* Make sure we have enough space in the "text" array in info_struct + * to hold all of the incoming text_ptr objects. + */ + if (info_ptr->num_text + num_text > info_ptr->max_text) + { + if (info_ptr->text != NULL) + { + png_textp old_text; + int old_max; + + old_max = info_ptr->max_text; + info_ptr->max_text = info_ptr->num_text + num_text + 8; + old_text = info_ptr->text; + info_ptr->text = (png_textp)png_malloc_warn(png_ptr, + (png_uint_32)(info_ptr->max_text * png_sizeof(png_text))); + if (info_ptr->text == NULL) + { + png_free(png_ptr, old_text); + return(1); + } + png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max * + png_sizeof(png_text))); + png_free(png_ptr, old_text); + } + else + { + info_ptr->max_text = num_text + 8; + info_ptr->num_text = 0; + info_ptr->text = (png_textp)png_malloc_warn(png_ptr, + (png_uint_32)(info_ptr->max_text * png_sizeof(png_text))); + if (info_ptr->text == NULL) + return(1); +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_TEXT; +#endif + } + png_debug1(3, "allocated %d entries for info_ptr->text", + info_ptr->max_text); + } + for (i = 0; i < num_text; i++) + { + png_size_t text_length, key_len; + png_size_t lang_len, lang_key_len; + png_textp textp = &(info_ptr->text[info_ptr->num_text]); + + if (text_ptr[i].key == NULL) + continue; + + key_len = png_strlen(text_ptr[i].key); + + if (text_ptr[i].compression <= 0) + { + lang_len = 0; + lang_key_len = 0; + } + else +#ifdef PNG_iTXt_SUPPORTED + { + /* Set iTXt data */ + if (text_ptr[i].lang != NULL) + lang_len = png_strlen(text_ptr[i].lang); + else + lang_len = 0; + if (text_ptr[i].lang_key != NULL) + lang_key_len = png_strlen(text_ptr[i].lang_key); + else + lang_key_len = 0; + } +#else + { + png_warning(png_ptr, "iTXt chunk not supported."); + continue; + } +#endif + + if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0') + { + text_length = 0; +#ifdef PNG_iTXt_SUPPORTED + if (text_ptr[i].compression > 0) + textp->compression = PNG_ITXT_COMPRESSION_NONE; + else +#endif + textp->compression = PNG_TEXT_COMPRESSION_NONE; + } + else + { + text_length = png_strlen(text_ptr[i].text); + textp->compression = text_ptr[i].compression; + } + + textp->key = (png_charp)png_malloc_warn(png_ptr, + (png_uint_32) + (key_len + text_length + lang_len + lang_key_len + 4)); + if (textp->key == NULL) + return(1); + png_debug2(2, "Allocated %lu bytes at %x in png_set_text", + (png_uint_32) + (key_len + lang_len + lang_key_len + text_length + 4), + (int)textp->key); + + png_memcpy(textp->key, text_ptr[i].key,(png_size_t)(key_len)); + *(textp->key + key_len) = '\0'; +#ifdef PNG_iTXt_SUPPORTED + if (text_ptr[i].compression > 0) + { + textp->lang = textp->key + key_len + 1; + png_memcpy(textp->lang, text_ptr[i].lang, lang_len); + *(textp->lang + lang_len) = '\0'; + textp->lang_key = textp->lang + lang_len + 1; + png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len); + *(textp->lang_key + lang_key_len) = '\0'; + textp->text = textp->lang_key + lang_key_len + 1; + } + else +#endif + { +#ifdef PNG_iTXt_SUPPORTED + textp->lang=NULL; + textp->lang_key=NULL; +#endif + textp->text = textp->key + key_len + 1; + } + if (text_length) + png_memcpy(textp->text, text_ptr[i].text, + (png_size_t)(text_length)); + *(textp->text + text_length) = '\0'; + +#ifdef PNG_iTXt_SUPPORTED + if (textp->compression > 0) + { + textp->text_length = 0; + textp->itxt_length = text_length; + } + else +#endif + { + textp->text_length = text_length; +#ifdef PNG_iTXt_SUPPORTED + textp->itxt_length = 0; +#endif + } + info_ptr->num_text++; + png_debug1(3, "transferred text chunk %d", info_ptr->num_text); + } + return(0); +} +#endif + +#if defined(PNG_tIME_SUPPORTED) +void PNGAPI +png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time) +{ + png_debug1(1, "in %s storage function", "tIME"); + + if (png_ptr == NULL || info_ptr == NULL || + (png_ptr->mode & PNG_WROTE_tIME)) + return; + + png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time)); + info_ptr->valid |= PNG_INFO_tIME; +} +#endif + +#if defined(PNG_tRNS_SUPPORTED) +void PNGAPI +png_set_tRNS(png_structp png_ptr, png_infop info_ptr, + png_bytep trans, int num_trans, png_color_16p trans_values) +{ + png_debug1(1, "in %s storage function", "tRNS"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (trans != NULL) + { + /* + * It may not actually be necessary to set png_ptr->trans here; + * we do it for backward compatibility with the way the png_handle_tRNS + * function used to do the allocation. + */ + +#ifdef PNG_FREE_ME_SUPPORTED + png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0); +#endif + + /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */ + png_ptr->trans = info_ptr->trans = (png_bytep)png_malloc(png_ptr, + (png_uint_32)PNG_MAX_PALETTE_LENGTH); + if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH) + png_memcpy(info_ptr->trans, trans, (png_size_t)num_trans); + } + + if (trans_values != NULL) + { + int sample_max = (1 << info_ptr->bit_depth); + if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY && + (int)trans_values->gray > sample_max) || + (info_ptr->color_type == PNG_COLOR_TYPE_RGB && + ((int)trans_values->red > sample_max || + (int)trans_values->green > sample_max || + (int)trans_values->blue > sample_max))) + png_warning(png_ptr, + "tRNS chunk has out-of-range samples for bit_depth"); + png_memcpy(&(info_ptr->trans_values), trans_values, + png_sizeof(png_color_16)); + if (num_trans == 0) + num_trans = 1; + } + + info_ptr->num_trans = (png_uint_16)num_trans; + if (num_trans != 0) + { + info_ptr->valid |= PNG_INFO_tRNS; +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_TRNS; +#else + png_ptr->flags |= PNG_FLAG_FREE_TRNS; +#endif + } +} +#endif + +#if defined(PNG_sPLT_SUPPORTED) +void PNGAPI +png_set_sPLT(png_structp png_ptr, + png_infop info_ptr, png_sPLT_tp entries, int nentries) +/* + * entries - array of png_sPLT_t structures + * to be added to the list of palettes + * in the info structure. + * nentries - number of palette structures to be + * added. + */ +{ + png_sPLT_tp np; + int i; + + if (png_ptr == NULL || info_ptr == NULL) + return; + + np = (png_sPLT_tp)png_malloc_warn(png_ptr, + (info_ptr->splt_palettes_num + nentries) * + (png_uint_32)png_sizeof(png_sPLT_t)); + if (np == NULL) + { + png_warning(png_ptr, "No memory for sPLT palettes."); + return; + } + + png_memcpy(np, info_ptr->splt_palettes, + info_ptr->splt_palettes_num * png_sizeof(png_sPLT_t)); + png_free(png_ptr, info_ptr->splt_palettes); + info_ptr->splt_palettes=NULL; + + for (i = 0; i < nentries; i++) + { + png_sPLT_tp to = np + info_ptr->splt_palettes_num + i; + png_sPLT_tp from = entries + i; + png_uint_32 length; + + length = png_strlen(from->name) + 1; + to->name = (png_charp)png_malloc_warn(png_ptr, length); + if (to->name == NULL) + { + png_warning(png_ptr, + "Out of memory while processing sPLT chunk"); + continue; + } + png_memcpy(to->name, from->name, length); + to->entries = (png_sPLT_entryp)png_malloc_warn(png_ptr, + (png_uint_32)(from->nentries * png_sizeof(png_sPLT_entry))); + if (to->entries == NULL) + { + png_warning(png_ptr, + "Out of memory while processing sPLT chunk"); + png_free(png_ptr, to->name); + to->name = NULL; + continue; + } + png_memcpy(to->entries, from->entries, + from->nentries * png_sizeof(png_sPLT_entry)); + to->nentries = from->nentries; + to->depth = from->depth; + } + + info_ptr->splt_palettes = np; + info_ptr->splt_palettes_num += nentries; + info_ptr->valid |= PNG_INFO_sPLT; +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_SPLT; +#endif +} +#endif /* PNG_sPLT_SUPPORTED */ + +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +void PNGAPI +png_set_unknown_chunks(png_structp png_ptr, + png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns) +{ + png_unknown_chunkp np; + int i; + + if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0) + return; + + np = (png_unknown_chunkp)png_malloc_warn(png_ptr, + (png_uint_32)((info_ptr->unknown_chunks_num + num_unknowns) * + png_sizeof(png_unknown_chunk))); + if (np == NULL) + { + png_warning(png_ptr, + "Out of memory while processing unknown chunk."); + return; + } + + png_memcpy(np, info_ptr->unknown_chunks, + info_ptr->unknown_chunks_num * png_sizeof(png_unknown_chunk)); + png_free(png_ptr, info_ptr->unknown_chunks); + info_ptr->unknown_chunks=NULL; + + for (i = 0; i < num_unknowns; i++) + { + png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i; + png_unknown_chunkp from = unknowns + i; + + png_memcpy((png_charp)to->name, + (png_charp)from->name, + png_sizeof(from->name)); + to->name[png_sizeof(to->name)-1] = '\0'; + to->size = from->size; + /* Note our location in the read or write sequence */ + to->location = (png_byte)(png_ptr->mode & 0xff); + + if (from->size == 0) + to->data=NULL; + else + { + to->data = (png_bytep)png_malloc_warn(png_ptr, + (png_uint_32)from->size); + if (to->data == NULL) + { + png_warning(png_ptr, + "Out of memory while processing unknown chunk."); + to->size = 0; + } + else + png_memcpy(to->data, from->data, from->size); + } + } + + info_ptr->unknown_chunks = np; + info_ptr->unknown_chunks_num += num_unknowns; +#ifdef PNG_FREE_ME_SUPPORTED + info_ptr->free_me |= PNG_FREE_UNKN; +#endif +} +void PNGAPI +png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr, + int chunk, int location) +{ + if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk < + (int)info_ptr->unknown_chunks_num) + info_ptr->unknown_chunks[chunk].location = (png_byte)location; +} +#endif + +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) +void PNGAPI +png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted) +{ + /* This function is deprecated in favor of png_permit_mng_features() + and will be removed from libpng-1.3.0 */ + + png_debug(1, "in png_permit_empty_plte, DEPRECATED."); + + if (png_ptr == NULL) + return; + png_ptr->mng_features_permitted = (png_byte) + ((png_ptr->mng_features_permitted & (~PNG_FLAG_MNG_EMPTY_PLTE)) | + ((empty_plte_permitted & PNG_FLAG_MNG_EMPTY_PLTE))); +} +#endif +#endif + +#if defined(PNG_MNG_FEATURES_SUPPORTED) +png_uint_32 PNGAPI +png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features) +{ + png_debug(1, "in png_permit_mng_features"); + + if (png_ptr == NULL) + return (png_uint_32)0; + png_ptr->mng_features_permitted = + (png_byte)(mng_features & PNG_ALL_MNG_FEATURES); + return (png_uint_32)png_ptr->mng_features_permitted; +} +#endif + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) +void PNGAPI +png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_bytep + chunk_list, int num_chunks) +{ + png_bytep new_list, p; + int i, old_num_chunks; + if (png_ptr == NULL) + return; + if (num_chunks == 0) + { + if (keep == PNG_HANDLE_CHUNK_ALWAYS || keep == PNG_HANDLE_CHUNK_IF_SAFE) + png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS; + else + png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS; + + if (keep == PNG_HANDLE_CHUNK_ALWAYS) + png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS; + else + png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS; + return; + } + if (chunk_list == NULL) + return; + old_num_chunks = png_ptr->num_chunk_list; + new_list=(png_bytep)png_malloc(png_ptr, + (png_uint_32) + (5*(num_chunks + old_num_chunks))); + if (png_ptr->chunk_list != NULL) + { + png_memcpy(new_list, png_ptr->chunk_list, + (png_size_t)(5*old_num_chunks)); + png_free(png_ptr, png_ptr->chunk_list); + png_ptr->chunk_list=NULL; + } + png_memcpy(new_list + 5*old_num_chunks, chunk_list, + (png_size_t)(5*num_chunks)); + for (p = new_list + 5*old_num_chunks + 4, i = 0; inum_chunk_list = old_num_chunks + num_chunks; + png_ptr->chunk_list = new_list; +#ifdef PNG_FREE_ME_SUPPORTED + png_ptr->free_me |= PNG_FREE_LIST; +#endif +} +#endif + +#if defined(PNG_READ_USER_CHUNKS_SUPPORTED) +void PNGAPI +png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr, + png_user_chunk_ptr read_user_chunk_fn) +{ + png_debug(1, "in png_set_read_user_chunk_fn"); + + if (png_ptr == NULL) + return; + + png_ptr->read_user_chunk_fn = read_user_chunk_fn; + png_ptr->user_chunk_ptr = user_chunk_ptr; +} +#endif + +#if defined(PNG_INFO_IMAGE_SUPPORTED) +void PNGAPI +png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers) +{ + png_debug1(1, "in %s storage function", "rows"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers)) + png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); + info_ptr->row_pointers = row_pointers; + if (row_pointers) + info_ptr->valid |= PNG_INFO_IDAT; +} +#endif + +#ifdef PNG_WRITE_SUPPORTED +void PNGAPI +png_set_compression_buffer_size(png_structp png_ptr, + png_uint_32 size) +{ + if (png_ptr == NULL) + return; + png_free(png_ptr, png_ptr->zbuf); + png_ptr->zbuf_size = (png_size_t)size; + png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; +} +#endif + +void PNGAPI +png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask) +{ + if (png_ptr && info_ptr) + info_ptr->valid &= ~mask; +} + + +#ifndef PNG_1_0_X +#ifdef PNG_ASSEMBLER_CODE_SUPPORTED +/* Function was added to libpng 1.2.0 and should always exist by default */ +void PNGAPI +png_set_asm_flags (png_structp png_ptr, png_uint_32 asm_flags) +{ +/* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */ + if (png_ptr != NULL) + png_ptr->asm_flags = 0; + asm_flags = asm_flags; /* Quiet the compiler */ +} + +/* This function was added to libpng 1.2.0 */ +void PNGAPI +png_set_mmx_thresholds (png_structp png_ptr, + png_byte mmx_bitdepth_threshold, + png_uint_32 mmx_rowbytes_threshold) +{ +/* Obsolete as of libpng-1.2.20 and will be removed from libpng-1.4.0 */ + if (png_ptr == NULL) + return; + /* Quiet the compiler */ + mmx_bitdepth_threshold = mmx_bitdepth_threshold; + mmx_rowbytes_threshold = mmx_rowbytes_threshold; +} +#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */ + +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +/* This function was added to libpng 1.2.6 */ +void PNGAPI +png_set_user_limits (png_structp png_ptr, png_uint_32 user_width_max, + png_uint_32 user_height_max) +{ + /* Images with dimensions larger than these limits will be + * rejected by png_set_IHDR(). To accept any PNG datastream + * regardless of dimensions, set both limits to 0x7ffffffL. + */ + if (png_ptr == NULL) + return; + png_ptr->user_width_max = user_width_max; + png_ptr->user_height_max = user_height_max; +} +#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ + +#endif /* ?PNG_1_0_X */ +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/png/pngtrans.c b/third_party/windows/fltk-1.1.10/png/pngtrans.c new file mode 100644 index 0000000..10d871c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngtrans.c @@ -0,0 +1,677 @@ + +/* pngtrans.c - transforms the data in a row (used by both readers and writers) + * + * Last changed in libpng 1.2.36 [May 14, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +#define PNG_INTERNAL +#include "png.h" +#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* Turn on BGR-to-RGB mapping */ +void PNGAPI +png_set_bgr(png_structp png_ptr) +{ + png_debug(1, "in png_set_bgr"); + if (png_ptr == NULL) + return; + png_ptr->transformations |= PNG_BGR; +} +#endif + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* Turn on 16 bit byte swapping */ +void PNGAPI +png_set_swap(png_structp png_ptr) +{ + png_debug(1, "in png_set_swap"); + if (png_ptr == NULL) + return; + if (png_ptr->bit_depth == 16) + png_ptr->transformations |= PNG_SWAP_BYTES; +} +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) +/* Turn on pixel packing */ +void PNGAPI +png_set_packing(png_structp png_ptr) +{ + png_debug(1, "in png_set_packing"); + if (png_ptr == NULL) + return; + if (png_ptr->bit_depth < 8) + { + png_ptr->transformations |= PNG_PACK; + png_ptr->usr_bit_depth = 8; + } +} +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) +/* Turn on packed pixel swapping */ +void PNGAPI +png_set_packswap(png_structp png_ptr) +{ + png_debug(1, "in png_set_packswap"); + if (png_ptr == NULL) + return; + if (png_ptr->bit_depth < 8) + png_ptr->transformations |= PNG_PACKSWAP; +} +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) +void PNGAPI +png_set_shift(png_structp png_ptr, png_color_8p true_bits) +{ + png_debug(1, "in png_set_shift"); + if (png_ptr == NULL) + return; + png_ptr->transformations |= PNG_SHIFT; + png_ptr->shift = *true_bits; +} +#endif + +#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ + defined(PNG_WRITE_INTERLACING_SUPPORTED) +int PNGAPI +png_set_interlace_handling(png_structp png_ptr) +{ + png_debug(1, "in png_set_interlace handling"); + if (png_ptr && png_ptr->interlaced) + { + png_ptr->transformations |= PNG_INTERLACE; + return (7); + } + + return (1); +} +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +/* Add a filler byte on read, or remove a filler or alpha byte on write. + * The filler type has changed in v0.95 to allow future 2-byte fillers + * for 48-bit input data, as well as to avoid problems with some compilers + * that don't like bytes as parameters. + */ +void PNGAPI +png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc) +{ + png_debug(1, "in png_set_filler"); + if (png_ptr == NULL) + return; + png_ptr->transformations |= PNG_FILLER; + png_ptr->filler = (png_byte)filler; + if (filler_loc == PNG_FILLER_AFTER) + png_ptr->flags |= PNG_FLAG_FILLER_AFTER; + else + png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; + + /* This should probably go in the "do_read_filler" routine. + * I attempted to do that in libpng-1.0.1a but that caused problems + * so I restored it in libpng-1.0.2a + */ + + if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) + { + png_ptr->usr_channels = 4; + } + + /* Also I added this in libpng-1.0.2a (what happens when we expand + * a less-than-8-bit grayscale to GA? */ + + if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8) + { + png_ptr->usr_channels = 2; + } +} + +#if !defined(PNG_1_0_X) +/* Added to libpng-1.2.7 */ +void PNGAPI +png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc) +{ + png_debug(1, "in png_set_add_alpha"); + if (png_ptr == NULL) + return; + png_set_filler(png_ptr, filler, filler_loc); + png_ptr->transformations |= PNG_ADD_ALPHA; +} +#endif + +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +void PNGAPI +png_set_swap_alpha(png_structp png_ptr) +{ + png_debug(1, "in png_set_swap_alpha"); + if (png_ptr == NULL) + return; + png_ptr->transformations |= PNG_SWAP_ALPHA; +} +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +void PNGAPI +png_set_invert_alpha(png_structp png_ptr) +{ + png_debug(1, "in png_set_invert_alpha"); + if (png_ptr == NULL) + return; + png_ptr->transformations |= PNG_INVERT_ALPHA; +} +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +void PNGAPI +png_set_invert_mono(png_structp png_ptr) +{ + png_debug(1, "in png_set_invert_mono"); + if (png_ptr == NULL) + return; + png_ptr->transformations |= PNG_INVERT_MONO; +} + +/* Invert monochrome grayscale data */ +void /* PRIVATE */ +png_do_invert(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_invert"); + /* This test removed from libpng version 1.0.13 and 1.2.0: + * if (row_info->bit_depth == 1 && + */ +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row == NULL || row_info == NULL) + return; +#endif + if (row_info->color_type == PNG_COLOR_TYPE_GRAY) + { + png_bytep rp = row; + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + + for (i = 0; i < istop; i++) + { + *rp = (png_byte)(~(*rp)); + rp++; + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && + row_info->bit_depth == 8) + { + png_bytep rp = row; + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + + for (i = 0; i < istop; i+=2) + { + *rp = (png_byte)(~(*rp)); + rp+=2; + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && + row_info->bit_depth == 16) + { + png_bytep rp = row; + png_uint_32 i; + png_uint_32 istop = row_info->rowbytes; + + for (i = 0; i < istop; i+=4) + { + *rp = (png_byte)(~(*rp)); + *(rp+1) = (png_byte)(~(*(rp+1))); + rp+=4; + } + } +} +#endif + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* Swaps byte order on 16 bit depth images */ +void /* PRIVATE */ +png_do_swap(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_swap"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + row_info->bit_depth == 16) + { + png_bytep rp = row; + png_uint_32 i; + png_uint_32 istop= row_info->width * row_info->channels; + + for (i = 0; i < istop; i++, rp += 2) + { + png_byte t = *rp; + *rp = *(rp + 1); + *(rp + 1) = t; + } + } +} +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) +static PNG_CONST png_byte onebppswaptable[256] = { + 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, + 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, + 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, + 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, + 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, + 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, + 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, + 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, + 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, + 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, + 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, + 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, + 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, + 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, + 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, + 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, + 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, + 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, + 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, + 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, + 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, + 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, + 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, + 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, + 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, + 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, + 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, + 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, + 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, + 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, + 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, + 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF +}; + +static PNG_CONST png_byte twobppswaptable[256] = { + 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0, + 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0, + 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4, + 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4, + 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8, + 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8, + 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC, + 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC, + 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1, + 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1, + 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5, + 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5, + 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9, + 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9, + 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD, + 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD, + 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2, + 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2, + 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6, + 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6, + 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA, + 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA, + 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE, + 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE, + 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3, + 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3, + 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7, + 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7, + 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB, + 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB, + 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF, + 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF +}; + +static PNG_CONST png_byte fourbppswaptable[256] = { + 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, + 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, + 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, + 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, + 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, + 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, + 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, + 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, + 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, + 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, + 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, + 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, + 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, + 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, + 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, + 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, + 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, + 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, + 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, + 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, + 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, + 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, + 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, + 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, + 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, + 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, + 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, + 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, + 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, + 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, + 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, + 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF +}; + +/* Swaps pixel packing order within bytes */ +void /* PRIVATE */ +png_do_packswap(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_packswap"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + row_info->bit_depth < 8) + { + png_bytep rp, end, table; + + end = row + row_info->rowbytes; + + if (row_info->bit_depth == 1) + table = (png_bytep)onebppswaptable; + else if (row_info->bit_depth == 2) + table = (png_bytep)twobppswaptable; + else if (row_info->bit_depth == 4) + table = (png_bytep)fourbppswaptable; + else + return; + + for (rp = row; rp < end; rp++) + *rp = table[*rp]; + } +} +#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ + +#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ + defined(PNG_READ_STRIP_ALPHA_SUPPORTED) +/* Remove filler or alpha byte(s) */ +void /* PRIVATE */ +png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags) +{ + png_debug(1, "in png_do_strip_filler"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL) +#endif + { + png_bytep sp=row; + png_bytep dp=row; + png_uint_32 row_width=row_info->width; + png_uint_32 i; + + if ((row_info->color_type == PNG_COLOR_TYPE_RGB || + (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && + (flags & PNG_FLAG_STRIP_ALPHA))) && + row_info->channels == 4) + { + if (row_info->bit_depth == 8) + { + /* This converts from RGBX or RGBA to RGB */ + if (flags & PNG_FLAG_FILLER_AFTER) + { + dp+=3; sp+=4; + for (i = 1; i < row_width; i++) + { + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + sp++; + } + } + /* This converts from XRGB or ARGB to RGB */ + else + { + for (i = 0; i < row_width; i++) + { + sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + } + } + row_info->pixel_depth = 24; + row_info->rowbytes = row_width * 3; + } + else /* if (row_info->bit_depth == 16) */ + { + if (flags & PNG_FLAG_FILLER_AFTER) + { + /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */ + sp += 8; dp += 6; + for (i = 1; i < row_width; i++) + { + /* This could be (although png_memcpy is probably slower): + png_memcpy(dp, sp, 6); + sp += 8; + dp += 6; + */ + + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + sp += 2; + } + } + else + { + /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */ + for (i = 0; i < row_width; i++) + { + /* This could be (although png_memcpy is probably slower): + png_memcpy(dp, sp, 6); + sp += 8; + dp += 6; + */ + + sp+=2; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + *dp++ = *sp++; + } + } + row_info->pixel_depth = 48; + row_info->rowbytes = row_width * 6; + } + row_info->channels = 3; + } + else if ((row_info->color_type == PNG_COLOR_TYPE_GRAY || + (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && + (flags & PNG_FLAG_STRIP_ALPHA))) && + row_info->channels == 2) + { + if (row_info->bit_depth == 8) + { + /* This converts from GX or GA to G */ + if (flags & PNG_FLAG_FILLER_AFTER) + { + for (i = 0; i < row_width; i++) + { + *dp++ = *sp++; + sp++; + } + } + /* This converts from XG or AG to G */ + else + { + for (i = 0; i < row_width; i++) + { + sp++; + *dp++ = *sp++; + } + } + row_info->pixel_depth = 8; + row_info->rowbytes = row_width; + } + else /* if (row_info->bit_depth == 16) */ + { + if (flags & PNG_FLAG_FILLER_AFTER) + { + /* This converts from GGXX or GGAA to GG */ + sp += 4; dp += 2; + for (i = 1; i < row_width; i++) + { + *dp++ = *sp++; + *dp++ = *sp++; + sp += 2; + } + } + else + { + /* This converts from XXGG or AAGG to GG */ + for (i = 0; i < row_width; i++) + { + sp += 2; + *dp++ = *sp++; + *dp++ = *sp++; + } + } + row_info->pixel_depth = 16; + row_info->rowbytes = row_width * 2; + } + row_info->channels = 1; + } + if (flags & PNG_FLAG_STRIP_ALPHA) + row_info->color_type &= ~PNG_COLOR_MASK_ALPHA; + } +} +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* Swaps red and blue bytes within a pixel */ +void /* PRIVATE */ +png_do_bgr(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_bgr"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + (row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + png_uint_32 row_width = row_info->width; + if (row_info->bit_depth == 8) + { + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + { + png_bytep rp; + png_uint_32 i; + + for (i = 0, rp = row; i < row_width; i++, rp += 3) + { + png_byte save = *rp; + *rp = *(rp + 2); + *(rp + 2) = save; + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + png_bytep rp; + png_uint_32 i; + + for (i = 0, rp = row; i < row_width; i++, rp += 4) + { + png_byte save = *rp; + *rp = *(rp + 2); + *(rp + 2) = save; + } + } + } + else if (row_info->bit_depth == 16) + { + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + { + png_bytep rp; + png_uint_32 i; + + for (i = 0, rp = row; i < row_width; i++, rp += 6) + { + png_byte save = *rp; + *rp = *(rp + 4); + *(rp + 4) = save; + save = *(rp + 1); + *(rp + 1) = *(rp + 5); + *(rp + 5) = save; + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + png_bytep rp; + png_uint_32 i; + + for (i = 0, rp = row; i < row_width; i++, rp += 8) + { + png_byte save = *rp; + *rp = *(rp + 4); + *(rp + 4) = save; + save = *(rp + 1); + *(rp + 1) = *(rp + 5); + *(rp + 5) = save; + } + } + } + } +} +#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +void PNGAPI +png_set_user_transform_info(png_structp png_ptr, png_voidp + user_transform_ptr, int user_transform_depth, int user_transform_channels) +{ + png_debug(1, "in png_set_user_transform_info"); + if (png_ptr == NULL) + return; +#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) + png_ptr->user_transform_ptr = user_transform_ptr; + png_ptr->user_transform_depth = (png_byte)user_transform_depth; + png_ptr->user_transform_channels = (png_byte)user_transform_channels; +#else + if (user_transform_ptr || user_transform_depth || user_transform_channels) + png_warning(png_ptr, + "This version of libpng does not support user transform info"); +#endif +} +#endif + +/* This function returns a pointer to the user_transform_ptr associated with + * the user transform functions. The application should free any memory + * associated with this pointer before png_write_destroy and png_read_destroy + * are called. + */ +png_voidp PNGAPI +png_get_user_transform_ptr(png_structp png_ptr) +{ + if (png_ptr == NULL) + return (NULL); +#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) + return ((png_voidp)png_ptr->user_transform_ptr); +#else + return (NULL); +#endif +} +#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/png/pngwio.c b/third_party/windows/fltk-1.1.10/png/pngwio.c new file mode 100644 index 0000000..7e868d8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngwio.c @@ -0,0 +1,259 @@ + +/* pngwio.c - functions for data output + * + * Last changed in libpng 1.2.37 [June 4, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + * + * This file provides a location for all output. Users who need + * special handling are expected to write functions that have the same + * arguments as these and perform similar functions, but that possibly + * use different output methods. Note that you shouldn't change these + * functions, but rather write replacement functions and then change + * them at run time with png_set_write_fn(...). + */ + +#define PNG_INTERNAL +#include "png.h" +#ifdef PNG_WRITE_SUPPORTED + +/* Write the data to whatever output you are using. The default routine + * writes to a file pointer. Note that this routine sometimes gets called + * with very small lengths, so you should implement some kind of simple + * buffering if you are using unbuffered writes. This should never be asked + * to write more than 64K on a 16 bit machine. + */ + +void /* PRIVATE */ +png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + if (png_ptr->write_data_fn != NULL ) + (*(png_ptr->write_data_fn))(png_ptr, data, length); + else + png_error(png_ptr, "Call to NULL write function"); +} + +#if !defined(PNG_NO_STDIO) +/* This is the function that does the actual writing of data. If you are + * not writing to a standard C stream, you should create a replacement + * write_data function and use it at run time with png_set_write_fn(), rather + * than changing the library. + */ +#ifndef USE_FAR_KEYWORD +void PNGAPI +png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_uint_32 check; + + if (png_ptr == NULL) + return; +#if defined(_WIN32_WCE) + if ( !WriteFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) ) + check = 0; +#else + check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr)); +#endif + if (check != length) + png_error(png_ptr, "Write Error"); +} +#else +/* This is the model-independent version. Since the standard I/O library + * can't handle far buffers in the medium and small models, we have to copy + * the data. + */ + +#define NEAR_BUF_SIZE 1024 +#define MIN(a,b) (a <= b ? a : b) + +void PNGAPI +png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + png_uint_32 check; + png_byte *near_data; /* Needs to be "png_byte *" instead of "png_bytep" */ + png_FILE_p io_ptr; + + if (png_ptr == NULL) + return; + /* Check if data really is near. If so, use usual code. */ + near_data = (png_byte *)CVT_PTR_NOCHECK(data); + io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr); + if ((png_bytep)near_data == data) + { +#if defined(_WIN32_WCE) + if ( !WriteFile(io_ptr, near_data, length, &check, NULL) ) + check = 0; +#else + check = fwrite(near_data, 1, length, io_ptr); +#endif + } + else + { + png_byte buf[NEAR_BUF_SIZE]; + png_size_t written, remaining, err; + check = 0; + remaining = length; + do + { + written = MIN(NEAR_BUF_SIZE, remaining); + png_memcpy(buf, data, written); /* Copy far buffer to near buffer */ +#if defined(_WIN32_WCE) + if ( !WriteFile(io_ptr, buf, written, &err, NULL) ) + err = 0; +#else + err = fwrite(buf, 1, written, io_ptr); +#endif + if (err != written) + break; + + else + check += err; + + data += written; + remaining -= written; + } + while (remaining != 0); + } + if (check != length) + png_error(png_ptr, "Write Error"); +} + +#endif +#endif + +/* This function is called to output any data pending writing (normally + * to disk). After png_flush is called, there should be no data pending + * writing in any buffers. + */ +#if defined(PNG_WRITE_FLUSH_SUPPORTED) +void /* PRIVATE */ +png_flush(png_structp png_ptr) +{ + if (png_ptr->output_flush_fn != NULL) + (*(png_ptr->output_flush_fn))(png_ptr); +} + +#if !defined(PNG_NO_STDIO) +void PNGAPI +png_default_flush(png_structp png_ptr) +{ +#if !defined(_WIN32_WCE) + png_FILE_p io_ptr; +#endif + if (png_ptr == NULL) + return; +#if !defined(_WIN32_WCE) + io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr)); + fflush(io_ptr); +#endif +} +#endif +#endif + +/* This function allows the application to supply new output functions for + * libpng if standard C streams aren't being used. + * + * This function takes as its arguments: + * png_ptr - pointer to a png output data structure + * io_ptr - pointer to user supplied structure containing info about + * the output functions. May be NULL. + * write_data_fn - pointer to a new output function that takes as its + * arguments a pointer to a png_struct, a pointer to + * data to be written, and a 32-bit unsigned int that is + * the number of bytes to be written. The new write + * function should call png_error(png_ptr, "Error msg") + * to exit and output any fatal error messages. May be + * NULL, in which case libpng's default function will + * be used. + * flush_data_fn - pointer to a new flush function that takes as its + * arguments a pointer to a png_struct. After a call to + * the flush function, there should be no data in any buffers + * or pending transmission. If the output method doesn't do + * any buffering of ouput, a function prototype must still be + * supplied although it doesn't have to do anything. If + * PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile + * time, output_flush_fn will be ignored, although it must be + * supplied for compatibility. May be NULL, in which case + * libpng's default function will be used, if + * PNG_WRITE_FLUSH_SUPPORTED is defined. This is not + * a good idea if io_ptr does not point to a standard + * *FILE structure. + */ +void PNGAPI +png_set_write_fn(png_structp png_ptr, png_voidp io_ptr, + png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn) +{ + if (png_ptr == NULL) + return; + + png_ptr->io_ptr = io_ptr; + +#if !defined(PNG_NO_STDIO) + if (write_data_fn != NULL) + png_ptr->write_data_fn = write_data_fn; + + else + png_ptr->write_data_fn = png_default_write_data; +#else + png_ptr->write_data_fn = write_data_fn; +#endif + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) +#if !defined(PNG_NO_STDIO) + if (output_flush_fn != NULL) + png_ptr->output_flush_fn = output_flush_fn; + + else + png_ptr->output_flush_fn = png_default_flush; +#else + png_ptr->output_flush_fn = output_flush_fn; +#endif +#endif /* PNG_WRITE_FLUSH_SUPPORTED */ + + /* It is an error to read while writing a png file */ + if (png_ptr->read_data_fn != NULL) + { + png_ptr->read_data_fn = NULL; + png_warning(png_ptr, + "Attempted to set both read_data_fn and write_data_fn in"); + png_warning(png_ptr, + "the same structure. Resetting read_data_fn to NULL."); + } +} + +#if defined(USE_FAR_KEYWORD) +#if defined(_MSC_VER) +void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check) +{ + void *near_ptr; + void FAR *far_ptr; + FP_OFF(near_ptr) = FP_OFF(ptr); + far_ptr = (void FAR *)near_ptr; + + if (check != 0) + if (FP_SEG(ptr) != FP_SEG(far_ptr)) + png_error(png_ptr, "segment lost in conversion"); + + return(near_ptr); +} +# else +void *png_far_to_near(png_structp png_ptr, png_voidp ptr, int check) +{ + void *near_ptr; + void FAR *far_ptr; + near_ptr = (void FAR *)ptr; + far_ptr = (void FAR *)near_ptr; + + if (check != 0) + if (far_ptr != ptr) + png_error(png_ptr, "segment lost in conversion"); + + return(near_ptr); +} +# endif +# endif +#endif /* PNG_WRITE_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/png/pngwrite.c b/third_party/windows/fltk-1.1.10/png/pngwrite.c new file mode 100644 index 0000000..50cb197 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngwrite.c @@ -0,0 +1,1561 @@ + +/* pngwrite.c - general routines to write a PNG file + * + * Last changed in libpng 1.2.37 [June 4, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +/* Get internal access to png.h */ +#define PNG_INTERNAL +#include "png.h" +#ifdef PNG_WRITE_SUPPORTED + +/* Writes all the PNG information. This is the suggested way to use the + * library. If you have a new chunk to add, make a function to write it, + * and put it in the correct location here. If you want the chunk written + * after the image data, put it in png_write_end(). I strongly encourage + * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing + * the chunk, as that will keep the code from breaking if you want to just + * write a plain PNG file. If you have long comments, I suggest writing + * them in png_write_end(), and compressing them. + */ +void PNGAPI +png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_write_info_before_PLTE"); + if (png_ptr == NULL || info_ptr == NULL) + return; + if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) + { + png_write_sig(png_ptr); /* Write PNG signature */ +#if defined(PNG_MNG_FEATURES_SUPPORTED) + if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted)) + { + png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); + png_ptr->mng_features_permitted=0; + } +#endif + /* Write IHDR information. */ + png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, + info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, + info_ptr->filter_type, +#if defined(PNG_WRITE_INTERLACING_SUPPORTED) + info_ptr->interlace_type); +#else + 0); +#endif + /* The rest of these check to see if the valid field has the appropriate + * flag set, and if it does, writes the chunk. + */ +#if defined(PNG_WRITE_gAMA_SUPPORTED) + if (info_ptr->valid & PNG_INFO_gAMA) + { +# ifdef PNG_FLOATING_POINT_SUPPORTED + png_write_gAMA(png_ptr, info_ptr->gamma); +#else +#ifdef PNG_FIXED_POINT_SUPPORTED + png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma); +# endif +#endif + } +#endif +#if defined(PNG_WRITE_sRGB_SUPPORTED) + if (info_ptr->valid & PNG_INFO_sRGB) + png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent); +#endif +#if defined(PNG_WRITE_iCCP_SUPPORTED) + if (info_ptr->valid & PNG_INFO_iCCP) + png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE, + info_ptr->iccp_profile, (int)info_ptr->iccp_proflen); +#endif +#if defined(PNG_WRITE_sBIT_SUPPORTED) + if (info_ptr->valid & PNG_INFO_sBIT) + png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type); +#endif +#if defined(PNG_WRITE_cHRM_SUPPORTED) + if (info_ptr->valid & PNG_INFO_cHRM) + { +#ifdef PNG_FLOATING_POINT_SUPPORTED + png_write_cHRM(png_ptr, + info_ptr->x_white, info_ptr->y_white, + info_ptr->x_red, info_ptr->y_red, + info_ptr->x_green, info_ptr->y_green, + info_ptr->x_blue, info_ptr->y_blue); +#else +# ifdef PNG_FIXED_POINT_SUPPORTED + png_write_cHRM_fixed(png_ptr, + info_ptr->int_x_white, info_ptr->int_y_white, + info_ptr->int_x_red, info_ptr->int_y_red, + info_ptr->int_x_green, info_ptr->int_y_green, + info_ptr->int_x_blue, info_ptr->int_y_blue); +# endif +#endif + } +#endif +#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) + if (info_ptr->unknown_chunks_num) + { + png_unknown_chunk *up; + + png_debug(5, "writing extra chunks"); + + for (up = info_ptr->unknown_chunks; + up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; + up++) + { + int keep=png_handle_as_unknown(png_ptr, up->name); + if (keep != PNG_HANDLE_CHUNK_NEVER && + up->location && !(up->location & PNG_HAVE_PLTE) && + !(up->location & PNG_HAVE_IDAT) && + ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || + (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) + { + if (up->size == 0) + png_warning(png_ptr, "Writing zero-length unknown chunk"); + png_write_chunk(png_ptr, up->name, up->data, up->size); + } + } + } +#endif + png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; + } +} + +void PNGAPI +png_write_info(png_structp png_ptr, png_infop info_ptr) +{ +#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) + int i; +#endif + + png_debug(1, "in png_write_info"); + + if (png_ptr == NULL || info_ptr == NULL) + return; + + png_write_info_before_PLTE(png_ptr, info_ptr); + + if (info_ptr->valid & PNG_INFO_PLTE) + png_write_PLTE(png_ptr, info_ptr->palette, + (png_uint_32)info_ptr->num_palette); + else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + png_error(png_ptr, "Valid palette required for paletted images"); + +#if defined(PNG_WRITE_tRNS_SUPPORTED) + if (info_ptr->valid & PNG_INFO_tRNS) + { +#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) + /* Invert the alpha channel (in tRNS) */ + if ((png_ptr->transformations & PNG_INVERT_ALPHA) && + info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + int j; + for (j=0; j<(int)info_ptr->num_trans; j++) + info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]); + } +#endif + png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values), + info_ptr->num_trans, info_ptr->color_type); + } +#endif +#if defined(PNG_WRITE_bKGD_SUPPORTED) + if (info_ptr->valid & PNG_INFO_bKGD) + png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); +#endif +#if defined(PNG_WRITE_hIST_SUPPORTED) + if (info_ptr->valid & PNG_INFO_hIST) + png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); +#endif +#if defined(PNG_WRITE_oFFs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_oFFs) + png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset, + info_ptr->offset_unit_type); +#endif +#if defined(PNG_WRITE_pCAL_SUPPORTED) + if (info_ptr->valid & PNG_INFO_pCAL) + png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0, + info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, + info_ptr->pcal_units, info_ptr->pcal_params); +#endif + +#if defined(PNG_sCAL_SUPPORTED) + if (info_ptr->valid & PNG_INFO_sCAL) +#if defined(PNG_WRITE_sCAL_SUPPORTED) +#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) + png_write_sCAL(png_ptr, (int)info_ptr->scal_unit, + info_ptr->scal_pixel_width, info_ptr->scal_pixel_height); +#else /* !FLOATING_POINT */ +#ifdef PNG_FIXED_POINT_SUPPORTED + png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, + info_ptr->scal_s_width, info_ptr->scal_s_height); +#endif /* FIXED_POINT */ +#endif /* FLOATING_POINT */ +#else /* !WRITE_sCAL */ + png_warning(png_ptr, + "png_write_sCAL not supported; sCAL chunk not written."); +#endif /* WRITE_sCAL */ +#endif /* sCAL */ + +#if defined(PNG_WRITE_pHYs_SUPPORTED) + if (info_ptr->valid & PNG_INFO_pHYs) + png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit, + info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); +#endif /* pHYs */ + +#if defined(PNG_WRITE_tIME_SUPPORTED) + if (info_ptr->valid & PNG_INFO_tIME) + { + png_write_tIME(png_ptr, &(info_ptr->mod_time)); + png_ptr->mode |= PNG_WROTE_tIME; + } +#endif /* tIME */ + +#if defined(PNG_WRITE_sPLT_SUPPORTED) + if (info_ptr->valid & PNG_INFO_sPLT) + for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) + png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); +#endif /* sPLT */ + +#if defined(PNG_WRITE_TEXT_SUPPORTED) + /* Check to see if we need to write text chunks */ + for (i = 0; i < info_ptr->num_text; i++) + { + png_debug2(2, "Writing header text chunk %d, type %d", i, + info_ptr->text[i].compression); + /* An internationalized chunk? */ + if (info_ptr->text[i].compression > 0) + { +#if defined(PNG_WRITE_iTXt_SUPPORTED) + /* Write international chunk */ + png_write_iTXt(png_ptr, + info_ptr->text[i].compression, + info_ptr->text[i].key, + info_ptr->text[i].lang, + info_ptr->text[i].lang_key, + info_ptr->text[i].text); +#else + png_warning(png_ptr, "Unable to write international text"); +#endif + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; + } + /* If we want a compressed text chunk */ + else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt) + { +#if defined(PNG_WRITE_zTXt_SUPPORTED) + /* Write compressed chunk */ + png_write_zTXt(png_ptr, info_ptr->text[i].key, + info_ptr->text[i].text, 0, + info_ptr->text[i].compression); +#else + png_warning(png_ptr, "Unable to write compressed text"); +#endif + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; + } + else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) + { +#if defined(PNG_WRITE_tEXt_SUPPORTED) + /* Write uncompressed chunk */ + png_write_tEXt(png_ptr, info_ptr->text[i].key, + info_ptr->text[i].text, + 0); + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; +#else + /* Can't get here */ + png_warning(png_ptr, "Unable to write uncompressed text"); +#endif + } + } +#endif /* tEXt */ + +#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) + if (info_ptr->unknown_chunks_num) + { + png_unknown_chunk *up; + + png_debug(5, "writing extra chunks"); + + for (up = info_ptr->unknown_chunks; + up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; + up++) + { + int keep=png_handle_as_unknown(png_ptr, up->name); + if (keep != PNG_HANDLE_CHUNK_NEVER && + up->location && (up->location & PNG_HAVE_PLTE) && + !(up->location & PNG_HAVE_IDAT) && + ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || + (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) + { + png_write_chunk(png_ptr, up->name, up->data, up->size); + } + } + } +#endif +} + +/* Writes the end of the PNG file. If you don't want to write comments or + * time information, you can pass NULL for info. If you already wrote these + * in png_write_info(), do not write them again here. If you have long + * comments, I suggest writing them here, and compressing them. + */ +void PNGAPI +png_write_end(png_structp png_ptr, png_infop info_ptr) +{ + png_debug(1, "in png_write_end"); + if (png_ptr == NULL) + return; + if (!(png_ptr->mode & PNG_HAVE_IDAT)) + png_error(png_ptr, "No IDATs written into file"); + + /* See if user wants us to write information chunks */ + if (info_ptr != NULL) + { +#if defined(PNG_WRITE_TEXT_SUPPORTED) + int i; /* Local index variable */ +#endif +#if defined(PNG_WRITE_tIME_SUPPORTED) + /* Check to see if user has supplied a time chunk */ + if ((info_ptr->valid & PNG_INFO_tIME) && + !(png_ptr->mode & PNG_WROTE_tIME)) + png_write_tIME(png_ptr, &(info_ptr->mod_time)); +#endif +#if defined(PNG_WRITE_TEXT_SUPPORTED) + /* Loop through comment chunks */ + for (i = 0; i < info_ptr->num_text; i++) + { + png_debug2(2, "Writing trailer text chunk %d, type %d", i, + info_ptr->text[i].compression); + /* An internationalized chunk? */ + if (info_ptr->text[i].compression > 0) + { +#if defined(PNG_WRITE_iTXt_SUPPORTED) + /* Write international chunk */ + png_write_iTXt(png_ptr, + info_ptr->text[i].compression, + info_ptr->text[i].key, + info_ptr->text[i].lang, + info_ptr->text[i].lang_key, + info_ptr->text[i].text); +#else + png_warning(png_ptr, "Unable to write international text"); +#endif + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; + } + else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) + { +#if defined(PNG_WRITE_zTXt_SUPPORTED) + /* Write compressed chunk */ + png_write_zTXt(png_ptr, info_ptr->text[i].key, + info_ptr->text[i].text, 0, + info_ptr->text[i].compression); +#else + png_warning(png_ptr, "Unable to write compressed text"); +#endif + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; + } + else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) + { +#if defined(PNG_WRITE_tEXt_SUPPORTED) + /* Write uncompressed chunk */ + png_write_tEXt(png_ptr, info_ptr->text[i].key, + info_ptr->text[i].text, 0); +#else + png_warning(png_ptr, "Unable to write uncompressed text"); +#endif + + /* Mark this chunk as written */ + info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; + } + } +#endif +#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) + if (info_ptr->unknown_chunks_num) + { + png_unknown_chunk *up; + + png_debug(5, "writing extra chunks"); + + for (up = info_ptr->unknown_chunks; + up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; + up++) + { + int keep=png_handle_as_unknown(png_ptr, up->name); + if (keep != PNG_HANDLE_CHUNK_NEVER && + up->location && (up->location & PNG_AFTER_IDAT) && + ((up->name[3] & 0x20) || keep == PNG_HANDLE_CHUNK_ALWAYS || + (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS))) + { + png_write_chunk(png_ptr, up->name, up->data, up->size); + } + } + } +#endif + } + + png_ptr->mode |= PNG_AFTER_IDAT; + + /* Write end of PNG file */ + png_write_IEND(png_ptr); + /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03, + * and restored again in libpng-1.2.30, may cause some applications that + * do not set png_ptr->output_flush_fn to crash. If your application + * experiences a problem, please try building libpng with + * PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED defined, and report the event to + * png-mng-implement at lists.sf.net . This kludge will be removed + * from libpng-1.4.0. + */ +#if defined(PNG_WRITE_FLUSH_SUPPORTED) && \ + defined(PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED) + png_flush(png_ptr); +#endif +} + +#if defined(PNG_WRITE_tIME_SUPPORTED) +#if !defined(_WIN32_WCE) +/* "time.h" functions are not supported on WindowsCE */ +void PNGAPI +png_convert_from_struct_tm(png_timep ptime, struct tm FAR * ttime) +{ + png_debug(1, "in png_convert_from_struct_tm"); + ptime->year = (png_uint_16)(1900 + ttime->tm_year); + ptime->month = (png_byte)(ttime->tm_mon + 1); + ptime->day = (png_byte)ttime->tm_mday; + ptime->hour = (png_byte)ttime->tm_hour; + ptime->minute = (png_byte)ttime->tm_min; + ptime->second = (png_byte)ttime->tm_sec; +} + +void PNGAPI +png_convert_from_time_t(png_timep ptime, time_t ttime) +{ + struct tm *tbuf; + + png_debug(1, "in png_convert_from_time_t"); + tbuf = gmtime(&ttime); + png_convert_from_struct_tm(ptime, tbuf); +} +#endif +#endif + +/* Initialize png_ptr structure, and allocate any memory needed */ +png_structp PNGAPI +png_create_write_struct(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn) +{ +#ifdef PNG_USER_MEM_SUPPORTED + return (png_create_write_struct_2(user_png_ver, error_ptr, error_fn, + warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL)); +} + +/* Alternate initialize png_ptr structure, and allocate any memory needed */ +png_structp PNGAPI +png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn) +{ +#endif /* PNG_USER_MEM_SUPPORTED */ +#ifdef PNG_SETJMP_SUPPORTED + volatile +#endif + png_structp png_ptr; +#ifdef PNG_SETJMP_SUPPORTED +#ifdef USE_FAR_KEYWORD + jmp_buf jmpbuf; +#endif +#endif + int i; + png_debug(1, "in png_create_write_struct"); +#ifdef PNG_USER_MEM_SUPPORTED + png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG, + (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr); +#else + png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); +#endif /* PNG_USER_MEM_SUPPORTED */ + if (png_ptr == NULL) + return (NULL); + + /* Added at libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + png_ptr->user_width_max=PNG_USER_WIDTH_MAX; + png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; +#endif + +#ifdef PNG_SETJMP_SUPPORTED +#ifdef USE_FAR_KEYWORD + if (setjmp(jmpbuf)) +#else + if (setjmp(png_ptr->jmpbuf)) +#endif + { + png_free(png_ptr, png_ptr->zbuf); + png_ptr->zbuf=NULL; + png_destroy_struct(png_ptr); + return (NULL); + } +#ifdef USE_FAR_KEYWORD + png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf)); +#endif +#endif + +#ifdef PNG_USER_MEM_SUPPORTED + png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn); +#endif /* PNG_USER_MEM_SUPPORTED */ + png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn); + + if (user_png_ver) + { + i=0; + do + { + if (user_png_ver[i] != png_libpng_ver[i]) + png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; + } while (png_libpng_ver[i++]); + } + + if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) + { + /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so + * we must recompile any applications that use any older library version. + * For versions after libpng 1.0, we will be compatible, so we need + * only check the first digit. + */ + if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || + (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) || + (user_png_ver[0] == '0' && user_png_ver[2] < '9')) + { +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + char msg[80]; + if (user_png_ver) + { + png_snprintf(msg, 80, + "Application was compiled with png.h from libpng-%.20s", + user_png_ver); + png_warning(png_ptr, msg); + } + png_snprintf(msg, 80, + "Application is running with png.c from libpng-%.20s", + png_libpng_ver); + png_warning(png_ptr, msg); +#endif +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + png_ptr->flags=0; +#endif + png_error(png_ptr, + "Incompatible libpng version in application and library"); + } + } + + /* Initialize zbuf - compression buffer */ + png_ptr->zbuf_size = PNG_ZBUF_SIZE; + png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, + (png_uint_32)png_ptr->zbuf_size); + + png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, + png_flush_ptr_NULL); + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, + 1, png_doublep_NULL, png_doublep_NULL); +#endif + +#ifdef PNG_SETJMP_SUPPORTED +/* Applications that neglect to set up their own setjmp() and then encounter + a png_error() will longjmp here. Since the jmpbuf is then meaningless we + abort instead of returning. */ +#ifdef USE_FAR_KEYWORD + if (setjmp(jmpbuf)) + PNG_ABORT(); + png_memcpy(png_ptr->jmpbuf, jmpbuf, png_sizeof(jmp_buf)); +#else + if (setjmp(png_ptr->jmpbuf)) + PNG_ABORT(); +#endif +#endif + return (png_ptr); +} + +/* Initialize png_ptr structure, and allocate any memory needed */ +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +/* Deprecated. */ +#undef png_write_init +void PNGAPI +png_write_init(png_structp png_ptr) +{ + /* We only come here via pre-1.0.7-compiled applications */ + png_write_init_2(png_ptr, "1.0.6 or earlier", 0, 0); +} + +void PNGAPI +png_write_init_2(png_structp png_ptr, png_const_charp user_png_ver, + png_size_t png_struct_size, png_size_t png_info_size) +{ + /* We only come here via pre-1.0.12-compiled applications */ + if (png_ptr == NULL) return; +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + if (png_sizeof(png_struct) > png_struct_size || + png_sizeof(png_info) > png_info_size) + { + char msg[80]; + png_ptr->warning_fn=NULL; + if (user_png_ver) + { + png_snprintf(msg, 80, + "Application was compiled with png.h from libpng-%.20s", + user_png_ver); + png_warning(png_ptr, msg); + } + png_snprintf(msg, 80, + "Application is running with png.c from libpng-%.20s", + png_libpng_ver); + png_warning(png_ptr, msg); + } +#endif + if (png_sizeof(png_struct) > png_struct_size) + { + png_ptr->error_fn=NULL; +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + png_ptr->flags=0; +#endif + png_error(png_ptr, + "The png struct allocated by the application for writing is too small."); + } + if (png_sizeof(png_info) > png_info_size) + { + png_ptr->error_fn=NULL; +#ifdef PNG_ERROR_NUMBERS_SUPPORTED + png_ptr->flags=0; +#endif + png_error(png_ptr, + "The info struct allocated by the application for writing is too small."); + } + png_write_init_3(&png_ptr, user_png_ver, png_struct_size); +} +#endif /* PNG_1_0_X || PNG_1_2_X */ + + +void PNGAPI +png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver, + png_size_t png_struct_size) +{ + png_structp png_ptr=*ptr_ptr; +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf tmp_jmp; /* To save current jump buffer */ +#endif + + int i = 0; + + if (png_ptr == NULL) + return; + + do + { + if (user_png_ver[i] != png_libpng_ver[i]) + { +#ifdef PNG_LEGACY_SUPPORTED + png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; +#else + png_ptr->warning_fn=NULL; + png_warning(png_ptr, + "Application uses deprecated png_write_init() and should be recompiled."); + break; +#endif + } + } while (png_libpng_ver[i++]); + + png_debug(1, "in png_write_init_3"); + +#ifdef PNG_SETJMP_SUPPORTED + /* Save jump buffer and error functions */ + png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); +#endif + + if (png_sizeof(png_struct) > png_struct_size) + { + png_destroy_struct(png_ptr); + png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG); + *ptr_ptr = png_ptr; + } + + /* Reset all variables to 0 */ + png_memset(png_ptr, 0, png_sizeof(png_struct)); + + /* Added at libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + png_ptr->user_width_max=PNG_USER_WIDTH_MAX; + png_ptr->user_height_max=PNG_USER_HEIGHT_MAX; +#endif + +#ifdef PNG_SETJMP_SUPPORTED + /* Restore jump buffer */ + png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); +#endif + + png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL, + png_flush_ptr_NULL); + + /* Initialize zbuf - compression buffer */ + png_ptr->zbuf_size = PNG_ZBUF_SIZE; + png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, + (png_uint_32)png_ptr->zbuf_size); + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT, + 1, png_doublep_NULL, png_doublep_NULL); +#endif +} + +/* Write a few rows of image data. If the image is interlaced, + * either you will have to write the 7 sub images, or, if you + * have called png_set_interlace_handling(), you will have to + * "write" the image seven times. + */ +void PNGAPI +png_write_rows(png_structp png_ptr, png_bytepp row, + png_uint_32 num_rows) +{ + png_uint_32 i; /* Row counter */ + png_bytepp rp; /* Row pointer */ + + png_debug(1, "in png_write_rows"); + + if (png_ptr == NULL) + return; + + /* Loop through the rows */ + for (i = 0, rp = row; i < num_rows; i++, rp++) + { + png_write_row(png_ptr, *rp); + } +} + +/* Write the image. You only need to call this function once, even + * if you are writing an interlaced image. + */ +void PNGAPI +png_write_image(png_structp png_ptr, png_bytepp image) +{ + png_uint_32 i; /* Row index */ + int pass, num_pass; /* Pass variables */ + png_bytepp rp; /* Points to current row */ + + if (png_ptr == NULL) + return; + + png_debug(1, "in png_write_image"); +#if defined(PNG_WRITE_INTERLACING_SUPPORTED) + /* Initialize interlace handling. If image is not interlaced, + * this will set pass to 1 + */ + num_pass = png_set_interlace_handling(png_ptr); +#else + num_pass = 1; +#endif + /* Loop through passes */ + for (pass = 0; pass < num_pass; pass++) + { + /* Loop through image */ + for (i = 0, rp = image; i < png_ptr->height; i++, rp++) + { + png_write_row(png_ptr, *rp); + } + } +} + +/* Called by user to write a row of image data */ +void PNGAPI +png_write_row(png_structp png_ptr, png_bytep row) +{ + if (png_ptr == NULL) + return; + png_debug2(1, "in png_write_row (row %ld, pass %d)", + png_ptr->row_number, png_ptr->pass); + + /* Initialize transformations and other stuff if first time */ + if (png_ptr->row_number == 0 && png_ptr->pass == 0) + { + /* Make sure we wrote the header info */ + if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) + png_error(png_ptr, + "png_write_info was never called before png_write_row."); + + /* Check for transforms that have been set but were defined out */ +#if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) + if (png_ptr->transformations & PNG_INVERT_MONO) + png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined."); +#endif +#if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) + if (png_ptr->transformations & PNG_FILLER) + png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined."); +#endif +#if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && defined(PNG_READ_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined."); +#endif +#if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) + if (png_ptr->transformations & PNG_PACK) + png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined."); +#endif +#if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) + if (png_ptr->transformations & PNG_SHIFT) + png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined."); +#endif +#if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) + if (png_ptr->transformations & PNG_BGR) + png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined."); +#endif +#if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) + if (png_ptr->transformations & PNG_SWAP_BYTES) + png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined."); +#endif + + png_write_start_row(png_ptr); + } + +#if defined(PNG_WRITE_INTERLACING_SUPPORTED) + /* If interlaced and not interested in row, return */ + if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) + { + switch (png_ptr->pass) + { + case 0: + if (png_ptr->row_number & 0x07) + { + png_write_finish_row(png_ptr); + return; + } + break; + case 1: + if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) + { + png_write_finish_row(png_ptr); + return; + } + break; + case 2: + if ((png_ptr->row_number & 0x07) != 4) + { + png_write_finish_row(png_ptr); + return; + } + break; + case 3: + if ((png_ptr->row_number & 0x03) || png_ptr->width < 3) + { + png_write_finish_row(png_ptr); + return; + } + break; + case 4: + if ((png_ptr->row_number & 0x03) != 2) + { + png_write_finish_row(png_ptr); + return; + } + break; + case 5: + if ((png_ptr->row_number & 0x01) || png_ptr->width < 2) + { + png_write_finish_row(png_ptr); + return; + } + break; + case 6: + if (!(png_ptr->row_number & 0x01)) + { + png_write_finish_row(png_ptr); + return; + } + break; + } + } +#endif + + /* Set up row info for transformations */ + png_ptr->row_info.color_type = png_ptr->color_type; + png_ptr->row_info.width = png_ptr->usr_width; + png_ptr->row_info.channels = png_ptr->usr_channels; + png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth; + png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth * + png_ptr->row_info.channels); + + png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth, + png_ptr->row_info.width); + + png_debug1(3, "row_info->color_type = %d", png_ptr->row_info.color_type); + png_debug1(3, "row_info->width = %lu", png_ptr->row_info.width); + png_debug1(3, "row_info->channels = %d", png_ptr->row_info.channels); + png_debug1(3, "row_info->bit_depth = %d", png_ptr->row_info.bit_depth); + png_debug1(3, "row_info->pixel_depth = %d", png_ptr->row_info.pixel_depth); + png_debug1(3, "row_info->rowbytes = %lu", png_ptr->row_info.rowbytes); + + /* Copy user's row into buffer, leaving room for filter byte. */ + png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row, + png_ptr->row_info.rowbytes); + +#if defined(PNG_WRITE_INTERLACING_SUPPORTED) + /* Handle interlacing */ + if (png_ptr->interlaced && png_ptr->pass < 6 && + (png_ptr->transformations & PNG_INTERLACE)) + { + png_do_write_interlace(&(png_ptr->row_info), + png_ptr->row_buf + 1, png_ptr->pass); + /* This should always get caught above, but still ... */ + if (!(png_ptr->row_info.width)) + { + png_write_finish_row(png_ptr); + return; + } + } +#endif + + /* Handle other transformations */ + if (png_ptr->transformations) + png_do_write_transformations(png_ptr); + +#if defined(PNG_MNG_FEATURES_SUPPORTED) + /* Write filter_method 64 (intrapixel differencing) only if + * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and + * 2. Libpng did not write a PNG signature (this filter_method is only + * used in PNG datastreams that are embedded in MNG datastreams) and + * 3. The application called png_permit_mng_features with a mask that + * included PNG_FLAG_MNG_FILTER_64 and + * 4. The filter_method is 64 and + * 5. The color_type is RGB or RGBA + */ + if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) + { + /* Intrapixel differencing */ + png_do_write_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1); + } +#endif + + /* Find a filter if necessary, filter the row and write it out. */ + png_write_find_filter(png_ptr, &(png_ptr->row_info)); + + if (png_ptr->write_row_fn != NULL) + (*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); +} + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) +/* Set the automatic flush interval or 0 to turn flushing off */ +void PNGAPI +png_set_flush(png_structp png_ptr, int nrows) +{ + png_debug(1, "in png_set_flush"); + if (png_ptr == NULL) + return; + png_ptr->flush_dist = (nrows < 0 ? 0 : nrows); +} + +/* Flush the current output buffers now */ +void PNGAPI +png_write_flush(png_structp png_ptr) +{ + int wrote_IDAT; + + png_debug(1, "in png_write_flush"); + if (png_ptr == NULL) + return; + /* We have already written out all of the data */ + if (png_ptr->row_number >= png_ptr->num_rows) + return; + + do + { + int ret; + + /* Compress the data */ + ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH); + wrote_IDAT = 0; + + /* Check for compression errors */ + if (ret != Z_OK) + { + if (png_ptr->zstream.msg != NULL) + png_error(png_ptr, png_ptr->zstream.msg); + else + png_error(png_ptr, "zlib error"); + } + + if (!(png_ptr->zstream.avail_out)) + { + /* Write the IDAT and reset the zlib output buffer */ + png_write_IDAT(png_ptr, png_ptr->zbuf, + png_ptr->zbuf_size); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + wrote_IDAT = 1; + } + } while(wrote_IDAT == 1); + + /* If there is any data left to be output, write it into a new IDAT */ + if (png_ptr->zbuf_size != png_ptr->zstream.avail_out) + { + /* Write the IDAT and reset the zlib output buffer */ + png_write_IDAT(png_ptr, png_ptr->zbuf, + png_ptr->zbuf_size - png_ptr->zstream.avail_out); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + } + png_ptr->flush_rows = 0; + png_flush(png_ptr); +} +#endif /* PNG_WRITE_FLUSH_SUPPORTED */ + +/* Free all memory used by the write */ +void PNGAPI +png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) +{ + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; +#ifdef PNG_USER_MEM_SUPPORTED + png_free_ptr free_fn = NULL; + png_voidp mem_ptr = NULL; +#endif + + png_debug(1, "in png_destroy_write_struct"); + if (png_ptr_ptr != NULL) + { + png_ptr = *png_ptr_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + free_fn = png_ptr->free_fn; + mem_ptr = png_ptr->mem_ptr; +#endif + } + +#ifdef PNG_USER_MEM_SUPPORTED + if (png_ptr != NULL) + { + free_fn = png_ptr->free_fn; + mem_ptr = png_ptr->mem_ptr; + } +#endif + + if (info_ptr_ptr != NULL) + info_ptr = *info_ptr_ptr; + + if (info_ptr != NULL) + { + if (png_ptr != NULL) + { + png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + if (png_ptr->num_chunk_list) + { + png_free(png_ptr, png_ptr->chunk_list); + png_ptr->chunk_list=NULL; + png_ptr->num_chunk_list = 0; + } +#endif + } + +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn, + (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)info_ptr); +#endif + *info_ptr_ptr = NULL; + } + + if (png_ptr != NULL) + { + png_write_destroy(png_ptr); +#ifdef PNG_USER_MEM_SUPPORTED + png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn, + (png_voidp)mem_ptr); +#else + png_destroy_struct((png_voidp)png_ptr); +#endif + *png_ptr_ptr = NULL; + } +} + + +/* Free any memory used in png_ptr struct (old method) */ +void /* PRIVATE */ +png_write_destroy(png_structp png_ptr) +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf tmp_jmp; /* Save jump buffer */ +#endif + png_error_ptr error_fn; + png_error_ptr warning_fn; + png_voidp error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + png_free_ptr free_fn; +#endif + + png_debug(1, "in png_write_destroy"); + /* Free any memory zlib uses */ + deflateEnd(&png_ptr->zstream); + + /* Free our memory. png_free checks NULL for us. */ + png_free(png_ptr, png_ptr->zbuf); + png_free(png_ptr, png_ptr->row_buf); +#ifndef PNG_NO_WRITE_FILTER + png_free(png_ptr, png_ptr->prev_row); + png_free(png_ptr, png_ptr->sub_row); + png_free(png_ptr, png_ptr->up_row); + png_free(png_ptr, png_ptr->avg_row); + png_free(png_ptr, png_ptr->paeth_row); +#endif + +#if defined(PNG_TIME_RFC1123_SUPPORTED) + png_free(png_ptr, png_ptr->time_buffer); +#endif + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + png_free(png_ptr, png_ptr->prev_filters); + png_free(png_ptr, png_ptr->filter_weights); + png_free(png_ptr, png_ptr->inv_filter_weights); + png_free(png_ptr, png_ptr->filter_costs); + png_free(png_ptr, png_ptr->inv_filter_costs); +#endif + +#ifdef PNG_SETJMP_SUPPORTED + /* Reset structure */ + png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf)); +#endif + + error_fn = png_ptr->error_fn; + warning_fn = png_ptr->warning_fn; + error_ptr = png_ptr->error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + free_fn = png_ptr->free_fn; +#endif + + png_memset(png_ptr, 0, png_sizeof(png_struct)); + + png_ptr->error_fn = error_fn; + png_ptr->warning_fn = warning_fn; + png_ptr->error_ptr = error_ptr; +#ifdef PNG_USER_MEM_SUPPORTED + png_ptr->free_fn = free_fn; +#endif + +#ifdef PNG_SETJMP_SUPPORTED + png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf)); +#endif +} + +/* Allow the application to select one or more row filters to use. */ +void PNGAPI +png_set_filter(png_structp png_ptr, int method, int filters) +{ + png_debug(1, "in png_set_filter"); + if (png_ptr == NULL) + return; +#if defined(PNG_MNG_FEATURES_SUPPORTED) + if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + (method == PNG_INTRAPIXEL_DIFFERENCING)) + method = PNG_FILTER_TYPE_BASE; +#endif + if (method == PNG_FILTER_TYPE_BASE) + { + switch (filters & (PNG_ALL_FILTERS | 0x07)) + { +#ifndef PNG_NO_WRITE_FILTER + case 5: + case 6: + case 7: png_warning(png_ptr, "Unknown row filter for method 0"); +#endif /* PNG_NO_WRITE_FILTER */ + case PNG_FILTER_VALUE_NONE: + png_ptr->do_filter=PNG_FILTER_NONE; break; +#ifndef PNG_NO_WRITE_FILTER + case PNG_FILTER_VALUE_SUB: + png_ptr->do_filter=PNG_FILTER_SUB; break; + case PNG_FILTER_VALUE_UP: + png_ptr->do_filter=PNG_FILTER_UP; break; + case PNG_FILTER_VALUE_AVG: + png_ptr->do_filter=PNG_FILTER_AVG; break; + case PNG_FILTER_VALUE_PAETH: + png_ptr->do_filter=PNG_FILTER_PAETH; break; + default: png_ptr->do_filter = (png_byte)filters; break; +#else + default: png_warning(png_ptr, "Unknown row filter for method 0"); +#endif /* PNG_NO_WRITE_FILTER */ + } + + /* If we have allocated the row_buf, this means we have already started + * with the image and we should have allocated all of the filter buffers + * that have been selected. If prev_row isn't already allocated, then + * it is too late to start using the filters that need it, since we + * will be missing the data in the previous row. If an application + * wants to start and stop using particular filters during compression, + * it should start out with all of the filters, and then add and + * remove them after the start of compression. + */ + if (png_ptr->row_buf != NULL) + { +#ifndef PNG_NO_WRITE_FILTER + if ((png_ptr->do_filter & PNG_FILTER_SUB) && png_ptr->sub_row == NULL) + { + png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, + (png_ptr->rowbytes + 1)); + png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; + } + + if ((png_ptr->do_filter & PNG_FILTER_UP) && png_ptr->up_row == NULL) + { + if (png_ptr->prev_row == NULL) + { + png_warning(png_ptr, "Can't add Up filter after starting"); + png_ptr->do_filter &= ~PNG_FILTER_UP; + } + else + { + png_ptr->up_row = (png_bytep)png_malloc(png_ptr, + (png_ptr->rowbytes + 1)); + png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; + } + } + + if ((png_ptr->do_filter & PNG_FILTER_AVG) && png_ptr->avg_row == NULL) + { + if (png_ptr->prev_row == NULL) + { + png_warning(png_ptr, "Can't add Average filter after starting"); + png_ptr->do_filter &= ~PNG_FILTER_AVG; + } + else + { + png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, + (png_ptr->rowbytes + 1)); + png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; + } + } + + if ((png_ptr->do_filter & PNG_FILTER_PAETH) && + png_ptr->paeth_row == NULL) + { + if (png_ptr->prev_row == NULL) + { + png_warning(png_ptr, "Can't add Paeth filter after starting"); + png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH); + } + else + { + png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, + (png_ptr->rowbytes + 1)); + png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; + } + } + + if (png_ptr->do_filter == PNG_NO_FILTERS) +#endif /* PNG_NO_WRITE_FILTER */ + png_ptr->do_filter = PNG_FILTER_NONE; + } + } + else + png_error(png_ptr, "Unknown custom filter method"); +} + +/* This allows us to influence the way in which libpng chooses the "best" + * filter for the current scanline. While the "minimum-sum-of-absolute- + * differences metric is relatively fast and effective, there is some + * question as to whether it can be improved upon by trying to keep the + * filtered data going to zlib more consistent, hopefully resulting in + * better compression. + */ +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* GRR 970116 */ +void PNGAPI +png_set_filter_heuristics(png_structp png_ptr, int heuristic_method, + int num_weights, png_doublep filter_weights, + png_doublep filter_costs) +{ + int i; + + png_debug(1, "in png_set_filter_heuristics"); + if (png_ptr == NULL) + return; + if (heuristic_method >= PNG_FILTER_HEURISTIC_LAST) + { + png_warning(png_ptr, "Unknown filter heuristic method"); + return; + } + + if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT) + { + heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED; + } + + if (num_weights < 0 || filter_weights == NULL || + heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED) + { + num_weights = 0; + } + + png_ptr->num_prev_filters = (png_byte)num_weights; + png_ptr->heuristic_method = (png_byte)heuristic_method; + + if (num_weights > 0) + { + if (png_ptr->prev_filters == NULL) + { + png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(png_sizeof(png_byte) * num_weights)); + + /* To make sure that the weighting starts out fairly */ + for (i = 0; i < num_weights; i++) + { + png_ptr->prev_filters[i] = 255; + } + } + + if (png_ptr->filter_weights == NULL) + { + png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); + + png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(png_sizeof(png_uint_16) * num_weights)); + for (i = 0; i < num_weights; i++) + { + png_ptr->inv_filter_weights[i] = + png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; + } + } + + for (i = 0; i < num_weights; i++) + { + if (filter_weights[i] < 0.0) + { + png_ptr->inv_filter_weights[i] = + png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; + } + else + { + png_ptr->inv_filter_weights[i] = + (png_uint_16)((double)PNG_WEIGHT_FACTOR*filter_weights[i]+0.5); + png_ptr->filter_weights[i] = + (png_uint_16)((double)PNG_WEIGHT_FACTOR/filter_weights[i]+0.5); + } + } + } + + /* If, in the future, there are other filter methods, this would + * need to be based on png_ptr->filter. + */ + if (png_ptr->filter_costs == NULL) + { + png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); + + png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr, + (png_uint_32)(png_sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST)); + + for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) + { + png_ptr->inv_filter_costs[i] = + png_ptr->filter_costs[i] = PNG_COST_FACTOR; + } + } + + /* Here is where we set the relative costs of the different filters. We + * should take the desired compression level into account when setting + * the costs, so that Paeth, for instance, has a high relative cost at low + * compression levels, while it has a lower relative cost at higher + * compression settings. The filter types are in order of increasing + * relative cost, so it would be possible to do this with an algorithm. + */ + for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) + { + if (filter_costs == NULL || filter_costs[i] < 0.0) + { + png_ptr->inv_filter_costs[i] = + png_ptr->filter_costs[i] = PNG_COST_FACTOR; + } + else if (filter_costs[i] >= 1.0) + { + png_ptr->inv_filter_costs[i] = + (png_uint_16)((double)PNG_COST_FACTOR / filter_costs[i] + 0.5); + png_ptr->filter_costs[i] = + (png_uint_16)((double)PNG_COST_FACTOR * filter_costs[i] + 0.5); + } + } +} +#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ + +void PNGAPI +png_set_compression_level(png_structp png_ptr, int level) +{ + png_debug(1, "in png_set_compression_level"); + if (png_ptr == NULL) + return; + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL; + png_ptr->zlib_level = level; +} + +void PNGAPI +png_set_compression_mem_level(png_structp png_ptr, int mem_level) +{ + png_debug(1, "in png_set_compression_mem_level"); + if (png_ptr == NULL) + return; + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL; + png_ptr->zlib_mem_level = mem_level; +} + +void PNGAPI +png_set_compression_strategy(png_structp png_ptr, int strategy) +{ + png_debug(1, "in png_set_compression_strategy"); + if (png_ptr == NULL) + return; + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY; + png_ptr->zlib_strategy = strategy; +} + +void PNGAPI +png_set_compression_window_bits(png_structp png_ptr, int window_bits) +{ + if (png_ptr == NULL) + return; + if (window_bits > 15) + png_warning(png_ptr, "Only compression windows <= 32k supported by PNG"); + else if (window_bits < 8) + png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); +#ifndef WBITS_8_OK + /* Avoid libpng bug with 256-byte windows */ + if (window_bits == 8) + { + png_warning(png_ptr, "Compression window is being reset to 512"); + window_bits=9; + } +#endif + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS; + png_ptr->zlib_window_bits = window_bits; +} + +void PNGAPI +png_set_compression_method(png_structp png_ptr, int method) +{ + png_debug(1, "in png_set_compression_method"); + if (png_ptr == NULL) + return; + if (method != 8) + png_warning(png_ptr, "Only compression method 8 is supported by PNG"); + png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_METHOD; + png_ptr->zlib_method = method; +} + +void PNGAPI +png_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn) +{ + if (png_ptr == NULL) + return; + png_ptr->write_row_fn = write_row_fn; +} + +#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +void PNGAPI +png_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr + write_user_transform_fn) +{ + png_debug(1, "in png_set_write_user_transform_fn"); + if (png_ptr == NULL) + return; + png_ptr->transformations |= PNG_USER_TRANSFORM; + png_ptr->write_user_transform_fn = write_user_transform_fn; +} +#endif + + +#if defined(PNG_INFO_IMAGE_SUPPORTED) +void PNGAPI +png_write_png(png_structp png_ptr, png_infop info_ptr, + int transforms, voidp params) +{ + if (png_ptr == NULL || info_ptr == NULL) + return; +#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) + /* Invert the alpha channel from opacity to transparency */ + if (transforms & PNG_TRANSFORM_INVERT_ALPHA) + png_set_invert_alpha(png_ptr); +#endif + + /* Write the file header information. */ + png_write_info(png_ptr, info_ptr); + + /* ------ these transformations don't touch the info structure ------- */ + +#if defined(PNG_WRITE_INVERT_SUPPORTED) + /* Invert monochrome pixels */ + if (transforms & PNG_TRANSFORM_INVERT_MONO) + png_set_invert_mono(png_ptr); +#endif + +#if defined(PNG_WRITE_SHIFT_SUPPORTED) + /* Shift the pixels up to a legal bit depth and fill in + * as appropriate to correctly scale the image. + */ + if ((transforms & PNG_TRANSFORM_SHIFT) + && (info_ptr->valid & PNG_INFO_sBIT)) + png_set_shift(png_ptr, &info_ptr->sig_bit); +#endif + +#if defined(PNG_WRITE_PACK_SUPPORTED) + /* Pack pixels into bytes */ + if (transforms & PNG_TRANSFORM_PACKING) + png_set_packing(png_ptr); +#endif + +#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) + /* Swap location of alpha bytes from ARGB to RGBA */ + if (transforms & PNG_TRANSFORM_SWAP_ALPHA) + png_set_swap_alpha(png_ptr); +#endif + +#if defined(PNG_WRITE_FILLER_SUPPORTED) + /* Pack XRGB/RGBX/ARGB/RGBA into * RGB (4 channels -> 3 channels) */ + if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) + png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); + else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) + png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); +#endif + +#if defined(PNG_WRITE_BGR_SUPPORTED) + /* Flip BGR pixels to RGB */ + if (transforms & PNG_TRANSFORM_BGR) + png_set_bgr(png_ptr); +#endif + +#if defined(PNG_WRITE_SWAP_SUPPORTED) + /* Swap bytes of 16-bit files to most significant byte first */ + if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) + png_set_swap(png_ptr); +#endif + +#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) + /* Swap bits of 1, 2, 4 bit packed pixel formats */ + if (transforms & PNG_TRANSFORM_PACKSWAP) + png_set_packswap(png_ptr); +#endif + + /* ----------------------- end of transformations ------------------- */ + + /* Write the bits */ + if (info_ptr->valid & PNG_INFO_IDAT) + png_write_image(png_ptr, info_ptr->row_pointers); + + /* It is REQUIRED to call this to finish writing the rest of the file */ + png_write_end(png_ptr, info_ptr); + + transforms = transforms; /* Quiet compiler warnings */ + params = params; +} +#endif +#endif /* PNG_WRITE_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/png/pngwtran.c b/third_party/windows/fltk-1.1.10/png/pngwtran.c new file mode 100644 index 0000000..a8043f3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngwtran.c @@ -0,0 +1,575 @@ + +/* pngwtran.c - transforms the data in a row for PNG writers + * + * Last changed in libpng 1.2.37 [June 4, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +#define PNG_INTERNAL +#include "png.h" +#ifdef PNG_WRITE_SUPPORTED + +/* Transform the data according to the user's wishes. The order of + * transformations is significant. + */ +void /* PRIVATE */ +png_do_write_transformations(png_structp png_ptr) +{ + png_debug(1, "in png_do_write_transformations"); + + if (png_ptr == NULL) + return; + +#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) + if (png_ptr->transformations & PNG_USER_TRANSFORM) + if (png_ptr->write_user_transform_fn != NULL) + (*(png_ptr->write_user_transform_fn)) /* User write transform function */ + (png_ptr, /* png_ptr */ + &(png_ptr->row_info), /* row_info: */ + /* png_uint_32 width; width of row */ + /* png_uint_32 rowbytes; number of bytes in row */ + /* png_byte color_type; color type of pixels */ + /* png_byte bit_depth; bit depth of samples */ + /* png_byte channels; number of channels (1-4) */ + /* png_byte pixel_depth; bits per pixel (depth*channels) */ + png_ptr->row_buf + 1); /* start of pixel data for row */ +#endif +#if defined(PNG_WRITE_FILLER_SUPPORTED) + if (png_ptr->transformations & PNG_FILLER) + png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1, + png_ptr->flags); +#endif +#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) + if (png_ptr->transformations & PNG_PACKSWAP) + png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif +#if defined(PNG_WRITE_PACK_SUPPORTED) + if (png_ptr->transformations & PNG_PACK) + png_do_pack(&(png_ptr->row_info), png_ptr->row_buf + 1, + (png_uint_32)png_ptr->bit_depth); +#endif +#if defined(PNG_WRITE_SWAP_SUPPORTED) + if (png_ptr->transformations & PNG_SWAP_BYTES) + png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif +#if defined(PNG_WRITE_SHIFT_SUPPORTED) + if (png_ptr->transformations & PNG_SHIFT) + png_do_shift(&(png_ptr->row_info), png_ptr->row_buf + 1, + &(png_ptr->shift)); +#endif +#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) + if (png_ptr->transformations & PNG_SWAP_ALPHA) + png_do_write_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif +#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) + if (png_ptr->transformations & PNG_INVERT_ALPHA) + png_do_write_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif +#if defined(PNG_WRITE_BGR_SUPPORTED) + if (png_ptr->transformations & PNG_BGR) + png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif +#if defined(PNG_WRITE_INVERT_SUPPORTED) + if (png_ptr->transformations & PNG_INVERT_MONO) + png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1); +#endif +} + +#if defined(PNG_WRITE_PACK_SUPPORTED) +/* Pack pixels into bytes. Pass the true bit depth in bit_depth. The + * row_info bit depth should be 8 (one pixel per byte). The channels + * should be 1 (this only happens on grayscale and paletted images). + */ +void /* PRIVATE */ +png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) +{ + png_debug(1, "in png_do_pack"); + if (row_info->bit_depth == 8 && +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + row_info->channels == 1) + { + switch ((int)bit_depth) + { + case 1: + { + png_bytep sp, dp; + int mask, v; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + sp = row; + dp = row; + mask = 0x80; + v = 0; + + for (i = 0; i < row_width; i++) + { + if (*sp != 0) + v |= mask; + sp++; + if (mask > 1) + mask >>= 1; + else + { + mask = 0x80; + *dp = (png_byte)v; + dp++; + v = 0; + } + } + if (mask != 0x80) + *dp = (png_byte)v; + break; + } + case 2: + { + png_bytep sp, dp; + int shift, v; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + sp = row; + dp = row; + shift = 6; + v = 0; + for (i = 0; i < row_width; i++) + { + png_byte value; + + value = (png_byte)(*sp & 0x03); + v |= (value << shift); + if (shift == 0) + { + shift = 6; + *dp = (png_byte)v; + dp++; + v = 0; + } + else + shift -= 2; + sp++; + } + if (shift != 6) + *dp = (png_byte)v; + break; + } + case 4: + { + png_bytep sp, dp; + int shift, v; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + sp = row; + dp = row; + shift = 4; + v = 0; + for (i = 0; i < row_width; i++) + { + png_byte value; + + value = (png_byte)(*sp & 0x0f); + v |= (value << shift); + + if (shift == 0) + { + shift = 4; + *dp = (png_byte)v; + dp++; + v = 0; + } + else + shift -= 4; + + sp++; + } + if (shift != 4) + *dp = (png_byte)v; + break; + } + } + row_info->bit_depth = (png_byte)bit_depth; + row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels); + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, + row_info->width); + } +} +#endif + +#if defined(PNG_WRITE_SHIFT_SUPPORTED) +/* Shift pixel values to take advantage of whole range. Pass the + * true number of bits in bit_depth. The row should be packed + * according to row_info->bit_depth. Thus, if you had a row of + * bit depth 4, but the pixels only had values from 0 to 7, you + * would pass 3 as bit_depth, and this routine would translate the + * data to 0 to 15. + */ +void /* PRIVATE */ +png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth) +{ + png_debug(1, "in png_do_shift"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL && +#else + if ( +#endif + row_info->color_type != PNG_COLOR_TYPE_PALETTE) + { + int shift_start[4], shift_dec[4]; + int channels = 0; + + if (row_info->color_type & PNG_COLOR_MASK_COLOR) + { + shift_start[channels] = row_info->bit_depth - bit_depth->red; + shift_dec[channels] = bit_depth->red; + channels++; + shift_start[channels] = row_info->bit_depth - bit_depth->green; + shift_dec[channels] = bit_depth->green; + channels++; + shift_start[channels] = row_info->bit_depth - bit_depth->blue; + shift_dec[channels] = bit_depth->blue; + channels++; + } + else + { + shift_start[channels] = row_info->bit_depth - bit_depth->gray; + shift_dec[channels] = bit_depth->gray; + channels++; + } + if (row_info->color_type & PNG_COLOR_MASK_ALPHA) + { + shift_start[channels] = row_info->bit_depth - bit_depth->alpha; + shift_dec[channels] = bit_depth->alpha; + channels++; + } + + /* With low row depths, could only be grayscale, so one channel */ + if (row_info->bit_depth < 8) + { + png_bytep bp = row; + png_uint_32 i; + png_byte mask; + png_uint_32 row_bytes = row_info->rowbytes; + + if (bit_depth->gray == 1 && row_info->bit_depth == 2) + mask = 0x55; + else if (row_info->bit_depth == 4 && bit_depth->gray == 3) + mask = 0x11; + else + mask = 0xff; + + for (i = 0; i < row_bytes; i++, bp++) + { + png_uint_16 v; + int j; + + v = *bp; + *bp = 0; + for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0]) + { + if (j > 0) + *bp |= (png_byte)((v << j) & 0xff); + else + *bp |= (png_byte)((v >> (-j)) & mask); + } + } + } + else if (row_info->bit_depth == 8) + { + png_bytep bp = row; + png_uint_32 i; + png_uint_32 istop = channels * row_info->width; + + for (i = 0; i < istop; i++, bp++) + { + + png_uint_16 v; + int j; + int c = (int)(i%channels); + + v = *bp; + *bp = 0; + for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) + { + if (j > 0) + *bp |= (png_byte)((v << j) & 0xff); + else + *bp |= (png_byte)((v >> (-j)) & 0xff); + } + } + } + else + { + png_bytep bp; + png_uint_32 i; + png_uint_32 istop = channels * row_info->width; + + for (bp = row, i = 0; i < istop; i++) + { + int c = (int)(i%channels); + png_uint_16 value, v; + int j; + + v = (png_uint_16)(((png_uint_16)(*bp) << 8) + *(bp + 1)); + value = 0; + for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) + { + if (j > 0) + value |= (png_uint_16)((v << j) & (png_uint_16)0xffff); + else + value |= (png_uint_16)((v >> (-j)) & (png_uint_16)0xffff); + } + *bp++ = (png_byte)(value >> 8); + *bp++ = (png_byte)(value & 0xff); + } + } + } +} +#endif + +#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +void /* PRIVATE */ +png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_write_swap_alpha"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL) +#endif + { + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + /* This converts from ARGB to RGBA */ + if (row_info->bit_depth == 8) + { + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + for (i = 0, sp = dp = row; i < row_width; i++) + { + png_byte save = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = save; + } + } + /* This converts from AARRGGBB to RRGGBBAA */ + else + { + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + png_byte save[2]; + save[0] = *(sp++); + save[1] = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = save[0]; + *(dp++) = save[1]; + } + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + /* This converts from AG to GA */ + if (row_info->bit_depth == 8) + { + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + png_byte save = *(sp++); + *(dp++) = *(sp++); + *(dp++) = save; + } + } + /* This converts from AAGG to GGAA */ + else + { + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + png_byte save[2]; + save[0] = *(sp++); + save[1] = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = save[0]; + *(dp++) = save[1]; + } + } + } + } +} +#endif + +#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +void /* PRIVATE */ +png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_write_invert_alpha"); +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL) +#endif + { + if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + { + /* This inverts the alpha channel in RGBA */ + if (row_info->bit_depth == 8) + { + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + for (i = 0, sp = dp = row; i < row_width; i++) + { + /* Does nothing + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + */ + sp+=3; dp = sp; + *(dp++) = (png_byte)(255 - *(sp++)); + } + } + /* This inverts the alpha channel in RRGGBBAA */ + else + { + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + /* Does nothing + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + *(dp++) = *(sp++); + */ + sp+=6; dp = sp; + *(dp++) = (png_byte)(255 - *(sp++)); + *(dp++) = (png_byte)(255 - *(sp++)); + } + } + } + else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + { + /* This inverts the alpha channel in GA */ + if (row_info->bit_depth == 8) + { + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + *(dp++) = *(sp++); + *(dp++) = (png_byte)(255 - *(sp++)); + } + } + /* This inverts the alpha channel in GGAA */ + else + { + png_bytep sp, dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + for (i = 0, sp = dp = row; i < row_width; i++) + { + /* Does nothing + *(dp++) = *(sp++); + *(dp++) = *(sp++); + */ + sp+=2; dp = sp; + *(dp++) = (png_byte)(255 - *(sp++)); + *(dp++) = (png_byte)(255 - *(sp++)); + } + } + } + } +} +#endif + +#if defined(PNG_MNG_FEATURES_SUPPORTED) +/* Undoes intrapixel differencing */ +void /* PRIVATE */ +png_do_write_intrapixel(png_row_infop row_info, png_bytep row) +{ + png_debug(1, "in png_do_write_intrapixel"); + if ( +#if defined(PNG_USELESS_TESTS_SUPPORTED) + row != NULL && row_info != NULL && +#endif + (row_info->color_type & PNG_COLOR_MASK_COLOR)) + { + int bytes_per_pixel; + png_uint_32 row_width = row_info->width; + if (row_info->bit_depth == 8) + { + png_bytep rp; + png_uint_32 i; + + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + bytes_per_pixel = 3; + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + bytes_per_pixel = 4; + else + return; + + for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) + { + *(rp) = (png_byte)((*rp - *(rp+1))&0xff); + *(rp+2) = (png_byte)((*(rp+2) - *(rp+1))&0xff); + } + } + else if (row_info->bit_depth == 16) + { + png_bytep rp; + png_uint_32 i; + + if (row_info->color_type == PNG_COLOR_TYPE_RGB) + bytes_per_pixel = 6; + else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) + bytes_per_pixel = 8; + else + return; + + for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) + { + png_uint_32 s0 = (*(rp ) << 8) | *(rp+1); + png_uint_32 s1 = (*(rp+2) << 8) | *(rp+3); + png_uint_32 s2 = (*(rp+4) << 8) | *(rp+5); + png_uint_32 red = (png_uint_32)((s0 - s1) & 0xffffL); + png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL); + *(rp ) = (png_byte)((red >> 8) & 0xff); + *(rp+1) = (png_byte)(red & 0xff); + *(rp+4) = (png_byte)((blue >> 8) & 0xff); + *(rp+5) = (png_byte)(blue & 0xff); + } + } + } +} +#endif /* PNG_MNG_FEATURES_SUPPORTED */ +#endif /* PNG_WRITE_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/png/pngwutil.c b/third_party/windows/fltk-1.1.10/png/pngwutil.c new file mode 100644 index 0000000..1afaaf8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/png/pngwutil.c @@ -0,0 +1,2825 @@ + +/* pngwutil.c - utilities to write a PNG file + * + * Last changed in libpng 1.2.40 [September 10, 2009] + * Copyright (c) 1998-2009 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * This code is released under the libpng license. + * For conditions of distribution and use, see the disclaimer + * and license in png.h + */ + +#define PNG_INTERNAL +#include "png.h" +#ifdef PNG_WRITE_SUPPORTED + +/* Place a 32-bit number into a buffer in PNG byte order. We work + * with unsigned numbers for convenience, although one supported + * ancillary chunk uses signed (two's complement) numbers. + */ +void PNGAPI +png_save_uint_32(png_bytep buf, png_uint_32 i) +{ + buf[0] = (png_byte)((i >> 24) & 0xff); + buf[1] = (png_byte)((i >> 16) & 0xff); + buf[2] = (png_byte)((i >> 8) & 0xff); + buf[3] = (png_byte)(i & 0xff); +} + +/* The png_save_int_32 function assumes integers are stored in two's + * complement format. If this isn't the case, then this routine needs to + * be modified to write data in two's complement format. + */ +void PNGAPI +png_save_int_32(png_bytep buf, png_int_32 i) +{ + buf[0] = (png_byte)((i >> 24) & 0xff); + buf[1] = (png_byte)((i >> 16) & 0xff); + buf[2] = (png_byte)((i >> 8) & 0xff); + buf[3] = (png_byte)(i & 0xff); +} + +/* Place a 16-bit number into a buffer in PNG byte order. + * The parameter is declared unsigned int, not png_uint_16, + * just to avoid potential problems on pre-ANSI C compilers. + */ +void PNGAPI +png_save_uint_16(png_bytep buf, unsigned int i) +{ + buf[0] = (png_byte)((i >> 8) & 0xff); + buf[1] = (png_byte)(i & 0xff); +} + +/* Simple function to write the signature. If we have already written + * the magic bytes of the signature, or more likely, the PNG stream is + * being embedded into another stream and doesn't need its own signature, + * we should call png_set_sig_bytes() to tell libpng how many of the + * bytes have already been written. + */ +void /* PRIVATE */ +png_write_sig(png_structp png_ptr) +{ + png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; + + /* Write the rest of the 8 byte signature */ + png_write_data(png_ptr, &png_signature[png_ptr->sig_bytes], + (png_size_t)(8 - png_ptr->sig_bytes)); + if (png_ptr->sig_bytes < 3) + png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; +} + +/* Write a PNG chunk all at once. The type is an array of ASCII characters + * representing the chunk name. The array must be at least 4 bytes in + * length, and does not need to be null terminated. To be safe, pass the + * pre-defined chunk names here, and if you need a new one, define it + * where the others are defined. The length is the length of the data. + * All the data must be present. If that is not possible, use the + * png_write_chunk_start(), png_write_chunk_data(), and png_write_chunk_end() + * functions instead. + */ +void PNGAPI +png_write_chunk(png_structp png_ptr, png_bytep chunk_name, + png_bytep data, png_size_t length) +{ + if (png_ptr == NULL) + return; + png_write_chunk_start(png_ptr, chunk_name, (png_uint_32)length); + png_write_chunk_data(png_ptr, data, (png_size_t)length); + png_write_chunk_end(png_ptr); +} + +/* Write the start of a PNG chunk. The type is the chunk type. + * The total_length is the sum of the lengths of all the data you will be + * passing in png_write_chunk_data(). + */ +void PNGAPI +png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name, + png_uint_32 length) +{ + png_byte buf[8]; + + png_debug2(0, "Writing %s chunk, length = %lu", chunk_name, + (unsigned long)length); + + if (png_ptr == NULL) + return; + + /* Write the length and the chunk name */ + png_save_uint_32(buf, length); + png_memcpy(buf + 4, chunk_name, 4); + png_write_data(png_ptr, buf, (png_size_t)8); + /* Put the chunk name into png_ptr->chunk_name */ + png_memcpy(png_ptr->chunk_name, chunk_name, 4); + /* Reset the crc and run it over the chunk name */ + png_reset_crc(png_ptr); + png_calculate_crc(png_ptr, chunk_name, (png_size_t)4); +} + +/* Write the data of a PNG chunk started with png_write_chunk_start(). + * Note that multiple calls to this function are allowed, and that the + * sum of the lengths from these calls *must* add up to the total_length + * given to png_write_chunk_start(). + */ +void PNGAPI +png_write_chunk_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + /* Write the data, and run the CRC over it */ + if (png_ptr == NULL) + return; + if (data != NULL && length > 0) + { + png_write_data(png_ptr, data, length); + /* Update the CRC after writing the data, + * in case that the user I/O routine alters it. + */ + png_calculate_crc(png_ptr, data, length); + } +} + +/* Finish a chunk started with png_write_chunk_start(). */ +void PNGAPI +png_write_chunk_end(png_structp png_ptr) +{ + png_byte buf[4]; + + if (png_ptr == NULL) return; + + /* Write the crc in a single operation */ + png_save_uint_32(buf, png_ptr->crc); + + png_write_data(png_ptr, buf, (png_size_t)4); +} + +#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_iCCP_SUPPORTED) +/* This pair of functions encapsulates the operation of (a) compressing a + * text string, and (b) issuing it later as a series of chunk data writes. + * The compression_state structure is shared context for these functions + * set up by the caller in order to make the whole mess thread-safe. + */ + +typedef struct +{ + char *input; /* The uncompressed input data */ + int input_len; /* Its length */ + int num_output_ptr; /* Number of output pointers used */ + int max_output_ptr; /* Size of output_ptr */ + png_charpp output_ptr; /* Array of pointers to output */ +} compression_state; + +/* Compress given text into storage in the png_ptr structure */ +static int /* PRIVATE */ +png_text_compress(png_structp png_ptr, + png_charp text, png_size_t text_len, int compression, + compression_state *comp) +{ + int ret; + + comp->num_output_ptr = 0; + comp->max_output_ptr = 0; + comp->output_ptr = NULL; + comp->input = NULL; + comp->input_len = 0; + + /* We may just want to pass the text right through */ + if (compression == PNG_TEXT_COMPRESSION_NONE) + { + comp->input = text; + comp->input_len = text_len; + return((int)text_len); + } + + if (compression >= PNG_TEXT_COMPRESSION_LAST) + { +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + char msg[50]; + png_snprintf(msg, 50, "Unknown compression type %d", compression); + png_warning(png_ptr, msg); +#else + png_warning(png_ptr, "Unknown compression type"); +#endif + } + + /* We can't write the chunk until we find out how much data we have, + * which means we need to run the compressor first and save the + * output. This shouldn't be a problem, as the vast majority of + * comments should be reasonable, but we will set up an array of + * malloc'd pointers to be sure. + * + * If we knew the application was well behaved, we could simplify this + * greatly by assuming we can always malloc an output buffer large + * enough to hold the compressed text ((1001 * text_len / 1000) + 12) + * and malloc this directly. The only time this would be a bad idea is + * if we can't malloc more than 64K and we have 64K of random input + * data, or if the input string is incredibly large (although this + * wouldn't cause a failure, just a slowdown due to swapping). + */ + + /* Set up the compression buffers */ + png_ptr->zstream.avail_in = (uInt)text_len; + png_ptr->zstream.next_in = (Bytef *)text; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.next_out = (Bytef *)png_ptr->zbuf; + + /* This is the same compression loop as in png_write_row() */ + do + { + /* Compress the data */ + ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); + if (ret != Z_OK) + { + /* Error */ + if (png_ptr->zstream.msg != NULL) + png_error(png_ptr, png_ptr->zstream.msg); + else + png_error(png_ptr, "zlib error"); + } + /* Check to see if we need more room */ + if (!(png_ptr->zstream.avail_out)) + { + /* Make sure the output array has room */ + if (comp->num_output_ptr >= comp->max_output_ptr) + { + int old_max; + + old_max = comp->max_output_ptr; + comp->max_output_ptr = comp->num_output_ptr + 4; + if (comp->output_ptr != NULL) + { + png_charpp old_ptr; + + old_ptr = comp->output_ptr; + comp->output_ptr = (png_charpp)png_malloc(png_ptr, + (png_uint_32) + (comp->max_output_ptr * png_sizeof(png_charpp))); + png_memcpy(comp->output_ptr, old_ptr, old_max + * png_sizeof(png_charp)); + png_free(png_ptr, old_ptr); + } + else + comp->output_ptr = (png_charpp)png_malloc(png_ptr, + (png_uint_32) + (comp->max_output_ptr * png_sizeof(png_charp))); + } + + /* Save the data */ + comp->output_ptr[comp->num_output_ptr] = + (png_charp)png_malloc(png_ptr, + (png_uint_32)png_ptr->zbuf_size); + png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf, + png_ptr->zbuf_size); + comp->num_output_ptr++; + + /* and reset the buffer */ + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.next_out = png_ptr->zbuf; + } + /* Continue until we don't have any more to compress */ + } while (png_ptr->zstream.avail_in); + + /* Finish the compression */ + do + { + /* Tell zlib we are finished */ + ret = deflate(&png_ptr->zstream, Z_FINISH); + + if (ret == Z_OK) + { + /* Check to see if we need more room */ + if (!(png_ptr->zstream.avail_out)) + { + /* Check to make sure our output array has room */ + if (comp->num_output_ptr >= comp->max_output_ptr) + { + int old_max; + + old_max = comp->max_output_ptr; + comp->max_output_ptr = comp->num_output_ptr + 4; + if (comp->output_ptr != NULL) + { + png_charpp old_ptr; + + old_ptr = comp->output_ptr; + /* This could be optimized to realloc() */ + comp->output_ptr = (png_charpp)png_malloc(png_ptr, + (png_uint_32)(comp->max_output_ptr * + png_sizeof(png_charp))); + png_memcpy(comp->output_ptr, old_ptr, + old_max * png_sizeof(png_charp)); + png_free(png_ptr, old_ptr); + } + else + comp->output_ptr = (png_charpp)png_malloc(png_ptr, + (png_uint_32)(comp->max_output_ptr * + png_sizeof(png_charp))); + } + + /* Save the data */ + comp->output_ptr[comp->num_output_ptr] = + (png_charp)png_malloc(png_ptr, + (png_uint_32)png_ptr->zbuf_size); + png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf, + png_ptr->zbuf_size); + comp->num_output_ptr++; + + /* and reset the buffer pointers */ + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.next_out = png_ptr->zbuf; + } + } + else if (ret != Z_STREAM_END) + { + /* We got an error */ + if (png_ptr->zstream.msg != NULL) + png_error(png_ptr, png_ptr->zstream.msg); + else + png_error(png_ptr, "zlib error"); + } + } while (ret != Z_STREAM_END); + + /* Text length is number of buffers plus last buffer */ + text_len = png_ptr->zbuf_size * comp->num_output_ptr; + if (png_ptr->zstream.avail_out < png_ptr->zbuf_size) + text_len += png_ptr->zbuf_size - (png_size_t)png_ptr->zstream.avail_out; + + return((int)text_len); +} + +/* Ship the compressed text out via chunk writes */ +static void /* PRIVATE */ +png_write_compressed_data_out(png_structp png_ptr, compression_state *comp) +{ + int i; + + /* Handle the no-compression case */ + if (comp->input) + { + png_write_chunk_data(png_ptr, (png_bytep)comp->input, + (png_size_t)comp->input_len); + return; + } + + /* Write saved output buffers, if any */ + for (i = 0; i < comp->num_output_ptr; i++) + { + png_write_chunk_data(png_ptr, (png_bytep)comp->output_ptr[i], + (png_size_t)png_ptr->zbuf_size); + png_free(png_ptr, comp->output_ptr[i]); + comp->output_ptr[i]=NULL; + } + if (comp->max_output_ptr != 0) + png_free(png_ptr, comp->output_ptr); + comp->output_ptr=NULL; + /* Write anything left in zbuf */ + if (png_ptr->zstream.avail_out < (png_uint_32)png_ptr->zbuf_size) + png_write_chunk_data(png_ptr, png_ptr->zbuf, + (png_size_t)(png_ptr->zbuf_size - png_ptr->zstream.avail_out)); + + /* Reset zlib for another zTXt/iTXt or image data */ + deflateReset(&png_ptr->zstream); + png_ptr->zstream.data_type = Z_BINARY; +} +#endif + +/* Write the IHDR chunk, and update the png_struct with the necessary + * information. Note that the rest of this code depends upon this + * information being correct. + */ +void /* PRIVATE */ +png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, + int bit_depth, int color_type, int compression_type, int filter_type, + int interlace_type) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_IHDR; +#endif + int ret; + + png_byte buf[13]; /* Buffer to store the IHDR info */ + + png_debug(1, "in png_write_IHDR"); + + /* Check that we have valid input data from the application info */ + switch (color_type) + { + case PNG_COLOR_TYPE_GRAY: + switch (bit_depth) + { + case 1: + case 2: + case 4: + case 8: + case 16: png_ptr->channels = 1; break; + default: png_error(png_ptr, "Invalid bit depth for grayscale image"); + } + break; + case PNG_COLOR_TYPE_RGB: + if (bit_depth != 8 && bit_depth != 16) + png_error(png_ptr, "Invalid bit depth for RGB image"); + png_ptr->channels = 3; + break; + case PNG_COLOR_TYPE_PALETTE: + switch (bit_depth) + { + case 1: + case 2: + case 4: + case 8: png_ptr->channels = 1; break; + default: png_error(png_ptr, "Invalid bit depth for paletted image"); + } + break; + case PNG_COLOR_TYPE_GRAY_ALPHA: + if (bit_depth != 8 && bit_depth != 16) + png_error(png_ptr, "Invalid bit depth for grayscale+alpha image"); + png_ptr->channels = 2; + break; + case PNG_COLOR_TYPE_RGB_ALPHA: + if (bit_depth != 8 && bit_depth != 16) + png_error(png_ptr, "Invalid bit depth for RGBA image"); + png_ptr->channels = 4; + break; + default: + png_error(png_ptr, "Invalid image color type specified"); + } + + if (compression_type != PNG_COMPRESSION_TYPE_BASE) + { + png_warning(png_ptr, "Invalid compression type specified"); + compression_type = PNG_COMPRESSION_TYPE_BASE; + } + + /* Write filter_method 64 (intrapixel differencing) only if + * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and + * 2. Libpng did not write a PNG signature (this filter_method is only + * used in PNG datastreams that are embedded in MNG datastreams) and + * 3. The application called png_permit_mng_features with a mask that + * included PNG_FLAG_MNG_FILTER_64 and + * 4. The filter_method is 64 and + * 5. The color_type is RGB or RGBA + */ + if ( +#if defined(PNG_MNG_FEATURES_SUPPORTED) + !((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && + ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && + (color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA) && + (filter_type == PNG_INTRAPIXEL_DIFFERENCING)) && +#endif + filter_type != PNG_FILTER_TYPE_BASE) + { + png_warning(png_ptr, "Invalid filter type specified"); + filter_type = PNG_FILTER_TYPE_BASE; + } + +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + if (interlace_type != PNG_INTERLACE_NONE && + interlace_type != PNG_INTERLACE_ADAM7) + { + png_warning(png_ptr, "Invalid interlace type specified"); + interlace_type = PNG_INTERLACE_ADAM7; + } +#else + interlace_type=PNG_INTERLACE_NONE; +#endif + + /* Save the relevent information */ + png_ptr->bit_depth = (png_byte)bit_depth; + png_ptr->color_type = (png_byte)color_type; + png_ptr->interlaced = (png_byte)interlace_type; +#if defined(PNG_MNG_FEATURES_SUPPORTED) + png_ptr->filter_type = (png_byte)filter_type; +#endif + png_ptr->compression_type = (png_byte)compression_type; + png_ptr->width = width; + png_ptr->height = height; + + png_ptr->pixel_depth = (png_byte)(bit_depth * png_ptr->channels); + png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width); + /* Set the usr info, so any transformations can modify it */ + png_ptr->usr_width = png_ptr->width; + png_ptr->usr_bit_depth = png_ptr->bit_depth; + png_ptr->usr_channels = png_ptr->channels; + + /* Pack the header information into the buffer */ + png_save_uint_32(buf, width); + png_save_uint_32(buf + 4, height); + buf[8] = (png_byte)bit_depth; + buf[9] = (png_byte)color_type; + buf[10] = (png_byte)compression_type; + buf[11] = (png_byte)filter_type; + buf[12] = (png_byte)interlace_type; + + /* Write the chunk */ + png_write_chunk(png_ptr, (png_bytep)png_IHDR, buf, (png_size_t)13); + + /* Initialize zlib with PNG info */ + png_ptr->zstream.zalloc = png_zalloc; + png_ptr->zstream.zfree = png_zfree; + png_ptr->zstream.opaque = (voidpf)png_ptr; + if (!(png_ptr->do_filter)) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE || + png_ptr->bit_depth < 8) + png_ptr->do_filter = PNG_FILTER_NONE; + else + png_ptr->do_filter = PNG_ALL_FILTERS; + } + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY)) + { + if (png_ptr->do_filter != PNG_FILTER_NONE) + png_ptr->zlib_strategy = Z_FILTERED; + else + png_ptr->zlib_strategy = Z_DEFAULT_STRATEGY; + } + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_LEVEL)) + png_ptr->zlib_level = Z_DEFAULT_COMPRESSION; + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL)) + png_ptr->zlib_mem_level = 8; + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS)) + png_ptr->zlib_window_bits = 15; + if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_METHOD)) + png_ptr->zlib_method = 8; + ret = deflateInit2(&png_ptr->zstream, png_ptr->zlib_level, + png_ptr->zlib_method, png_ptr->zlib_window_bits, + png_ptr->zlib_mem_level, png_ptr->zlib_strategy); + if (ret != Z_OK) + { + if (ret == Z_VERSION_ERROR) png_error(png_ptr, + "zlib failed to initialize compressor -- version error"); + if (ret == Z_STREAM_ERROR) png_error(png_ptr, + "zlib failed to initialize compressor -- stream error"); + if (ret == Z_MEM_ERROR) png_error(png_ptr, + "zlib failed to initialize compressor -- mem error"); + png_error(png_ptr, "zlib failed to initialize compressor"); + } + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + /* libpng is not interested in zstream.data_type */ + /* Set it to a predefined value, to avoid its evaluation inside zlib */ + png_ptr->zstream.data_type = Z_BINARY; + + png_ptr->mode = PNG_HAVE_IHDR; +} + +/* Write the palette. We are careful not to trust png_color to be in the + * correct order for PNG, so people can redefine it to any convenient + * structure. + */ +void /* PRIVATE */ +png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_PLTE; +#endif + png_uint_32 i; + png_colorp pal_ptr; + png_byte buf[3]; + + png_debug(1, "in png_write_PLTE"); + + if (( +#if defined(PNG_MNG_FEATURES_SUPPORTED) + !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) && +#endif + num_pal == 0) || num_pal > 256) + { + if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) + { + png_error(png_ptr, "Invalid number of colors in palette"); + } + else + { + png_warning(png_ptr, "Invalid number of colors in palette"); + return; + } + } + + if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) + { + png_warning(png_ptr, + "Ignoring request to write a PLTE chunk in grayscale PNG"); + return; + } + + png_ptr->num_palette = (png_uint_16)num_pal; + png_debug1(3, "num_palette = %d", png_ptr->num_palette); + + png_write_chunk_start(png_ptr, (png_bytep)png_PLTE, + (png_uint_32)(num_pal * 3)); +#ifndef PNG_NO_POINTER_INDEXING + for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++) + { + buf[0] = pal_ptr->red; + buf[1] = pal_ptr->green; + buf[2] = pal_ptr->blue; + png_write_chunk_data(png_ptr, buf, (png_size_t)3); + } +#else + /* This is a little slower but some buggy compilers need to do this instead */ + pal_ptr=palette; + for (i = 0; i < num_pal; i++) + { + buf[0] = pal_ptr[i].red; + buf[1] = pal_ptr[i].green; + buf[2] = pal_ptr[i].blue; + png_write_chunk_data(png_ptr, buf, (png_size_t)3); + } +#endif + png_write_chunk_end(png_ptr); + png_ptr->mode |= PNG_HAVE_PLTE; +} + +/* Write an IDAT chunk */ +void /* PRIVATE */ +png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_IDAT; +#endif + + png_debug(1, "in png_write_IDAT"); + + /* Optimize the CMF field in the zlib stream. */ + /* This hack of the zlib stream is compliant to the stream specification. */ + if (!(png_ptr->mode & PNG_HAVE_IDAT) && + png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE) + { + unsigned int z_cmf = data[0]; /* zlib compression method and flags */ + if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70) + { + /* Avoid memory underflows and multiplication overflows. + * + * The conditions below are practically always satisfied; + * however, they still must be checked. + */ + if (length >= 2 && + png_ptr->height < 16384 && png_ptr->width < 16384) + { + png_uint_32 uncompressed_idat_size = png_ptr->height * + ((png_ptr->width * + png_ptr->channels * png_ptr->bit_depth + 15) >> 3); + unsigned int z_cinfo = z_cmf >> 4; + unsigned int half_z_window_size = 1 << (z_cinfo + 7); + while (uncompressed_idat_size <= half_z_window_size && + half_z_window_size >= 256) + { + z_cinfo--; + half_z_window_size >>= 1; + } + z_cmf = (z_cmf & 0x0f) | (z_cinfo << 4); + if (data[0] != (png_byte)z_cmf) + { + data[0] = (png_byte)z_cmf; + data[1] &= 0xe0; + data[1] += (png_byte)(0x1f - ((z_cmf << 8) + data[1]) % 0x1f); + } + } + } + else + png_error(png_ptr, + "Invalid zlib compression method or flags in IDAT"); + } + + png_write_chunk(png_ptr, (png_bytep)png_IDAT, data, length); + png_ptr->mode |= PNG_HAVE_IDAT; +} + +/* Write an IEND chunk */ +void /* PRIVATE */ +png_write_IEND(png_structp png_ptr) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_IEND; +#endif + + png_debug(1, "in png_write_IEND"); + + png_write_chunk(png_ptr, (png_bytep)png_IEND, png_bytep_NULL, + (png_size_t)0); + png_ptr->mode |= PNG_HAVE_IEND; +} + +#if defined(PNG_WRITE_gAMA_SUPPORTED) +/* Write a gAMA chunk */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +void /* PRIVATE */ +png_write_gAMA(png_structp png_ptr, double file_gamma) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_gAMA; +#endif + png_uint_32 igamma; + png_byte buf[4]; + + png_debug(1, "in png_write_gAMA"); + + /* file_gamma is saved in 1/100,000ths */ + igamma = (png_uint_32)(file_gamma * 100000.0 + 0.5); + png_save_uint_32(buf, igamma); + png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4); +} +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +void /* PRIVATE */ +png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_gAMA; +#endif + png_byte buf[4]; + + png_debug(1, "in png_write_gAMA"); + + /* file_gamma is saved in 1/100,000ths */ + png_save_uint_32(buf, (png_uint_32)file_gamma); + png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4); +} +#endif +#endif + +#if defined(PNG_WRITE_sRGB_SUPPORTED) +/* Write a sRGB chunk */ +void /* PRIVATE */ +png_write_sRGB(png_structp png_ptr, int srgb_intent) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_sRGB; +#endif + png_byte buf[1]; + + png_debug(1, "in png_write_sRGB"); + + if (srgb_intent >= PNG_sRGB_INTENT_LAST) + png_warning(png_ptr, + "Invalid sRGB rendering intent specified"); + buf[0]=(png_byte)srgb_intent; + png_write_chunk(png_ptr, (png_bytep)png_sRGB, buf, (png_size_t)1); +} +#endif + +#if defined(PNG_WRITE_iCCP_SUPPORTED) +/* Write an iCCP chunk */ +void /* PRIVATE */ +png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type, + png_charp profile, int profile_len) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_iCCP; +#endif + png_size_t name_len; + png_charp new_name; + compression_state comp; + int embedded_profile_len = 0; + + png_debug(1, "in png_write_iCCP"); + + comp.num_output_ptr = 0; + comp.max_output_ptr = 0; + comp.output_ptr = NULL; + comp.input = NULL; + comp.input_len = 0; + + if ((name_len = png_check_keyword(png_ptr, name, + &new_name)) == 0) + return; + + if (compression_type != PNG_COMPRESSION_TYPE_BASE) + png_warning(png_ptr, "Unknown compression type in iCCP chunk"); + + if (profile == NULL) + profile_len = 0; + + if (profile_len > 3) + embedded_profile_len = + ((*( (png_bytep)profile ))<<24) | + ((*( (png_bytep)profile + 1))<<16) | + ((*( (png_bytep)profile + 2))<< 8) | + ((*( (png_bytep)profile + 3)) ); + + if (embedded_profile_len < 0) + { + png_warning(png_ptr, + "Embedded profile length in iCCP chunk is negative"); + png_free(png_ptr, new_name); + return; + } + + if (profile_len < embedded_profile_len) + { + png_warning(png_ptr, + "Embedded profile length too large in iCCP chunk"); + png_free(png_ptr, new_name); + return; + } + + if (profile_len > embedded_profile_len) + { + png_warning(png_ptr, + "Truncating profile to actual length in iCCP chunk"); + profile_len = embedded_profile_len; + } + + if (profile_len) + profile_len = png_text_compress(png_ptr, profile, + (png_size_t)profile_len, PNG_COMPRESSION_TYPE_BASE, &comp); + + /* Make sure we include the NULL after the name and the compression type */ + png_write_chunk_start(png_ptr, (png_bytep)png_iCCP, + (png_uint_32)(name_len + profile_len + 2)); + new_name[name_len + 1] = 0x00; + png_write_chunk_data(png_ptr, (png_bytep)new_name, + (png_size_t)(name_len + 2)); + + if (profile_len) + png_write_compressed_data_out(png_ptr, &comp); + + png_write_chunk_end(png_ptr); + png_free(png_ptr, new_name); +} +#endif + +#if defined(PNG_WRITE_sPLT_SUPPORTED) +/* Write a sPLT chunk */ +void /* PRIVATE */ +png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_sPLT; +#endif + png_size_t name_len; + png_charp new_name; + png_byte entrybuf[10]; + int entry_size = (spalette->depth == 8 ? 6 : 10); + int palette_size = entry_size * spalette->nentries; + png_sPLT_entryp ep; +#ifdef PNG_NO_POINTER_INDEXING + int i; +#endif + + png_debug(1, "in png_write_sPLT"); + + if ((name_len = png_check_keyword(png_ptr,spalette->name, &new_name))==0) + return; + + /* Make sure we include the NULL after the name */ + png_write_chunk_start(png_ptr, (png_bytep)png_sPLT, + (png_uint_32)(name_len + 2 + palette_size)); + png_write_chunk_data(png_ptr, (png_bytep)new_name, + (png_size_t)(name_len + 1)); + png_write_chunk_data(png_ptr, (png_bytep)&spalette->depth, (png_size_t)1); + + /* Loop through each palette entry, writing appropriately */ +#ifndef PNG_NO_POINTER_INDEXING + for (ep = spalette->entries; epentries + spalette->nentries; ep++) + { + if (spalette->depth == 8) + { + entrybuf[0] = (png_byte)ep->red; + entrybuf[1] = (png_byte)ep->green; + entrybuf[2] = (png_byte)ep->blue; + entrybuf[3] = (png_byte)ep->alpha; + png_save_uint_16(entrybuf + 4, ep->frequency); + } + else + { + png_save_uint_16(entrybuf + 0, ep->red); + png_save_uint_16(entrybuf + 2, ep->green); + png_save_uint_16(entrybuf + 4, ep->blue); + png_save_uint_16(entrybuf + 6, ep->alpha); + png_save_uint_16(entrybuf + 8, ep->frequency); + } + png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size); + } +#else + ep=spalette->entries; + for (i=0; i>spalette->nentries; i++) + { + if (spalette->depth == 8) + { + entrybuf[0] = (png_byte)ep[i].red; + entrybuf[1] = (png_byte)ep[i].green; + entrybuf[2] = (png_byte)ep[i].blue; + entrybuf[3] = (png_byte)ep[i].alpha; + png_save_uint_16(entrybuf + 4, ep[i].frequency); + } + else + { + png_save_uint_16(entrybuf + 0, ep[i].red); + png_save_uint_16(entrybuf + 2, ep[i].green); + png_save_uint_16(entrybuf + 4, ep[i].blue); + png_save_uint_16(entrybuf + 6, ep[i].alpha); + png_save_uint_16(entrybuf + 8, ep[i].frequency); + } + png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size); + } +#endif + + png_write_chunk_end(png_ptr); + png_free(png_ptr, new_name); +} +#endif + +#if defined(PNG_WRITE_sBIT_SUPPORTED) +/* Write the sBIT chunk */ +void /* PRIVATE */ +png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_sBIT; +#endif + png_byte buf[4]; + png_size_t size; + + png_debug(1, "in png_write_sBIT"); + + /* Make sure we don't depend upon the order of PNG_COLOR_8 */ + if (color_type & PNG_COLOR_MASK_COLOR) + { + png_byte maxbits; + + maxbits = (png_byte)(color_type==PNG_COLOR_TYPE_PALETTE ? 8 : + png_ptr->usr_bit_depth); + if (sbit->red == 0 || sbit->red > maxbits || + sbit->green == 0 || sbit->green > maxbits || + sbit->blue == 0 || sbit->blue > maxbits) + { + png_warning(png_ptr, "Invalid sBIT depth specified"); + return; + } + buf[0] = sbit->red; + buf[1] = sbit->green; + buf[2] = sbit->blue; + size = 3; + } + else + { + if (sbit->gray == 0 || sbit->gray > png_ptr->usr_bit_depth) + { + png_warning(png_ptr, "Invalid sBIT depth specified"); + return; + } + buf[0] = sbit->gray; + size = 1; + } + + if (color_type & PNG_COLOR_MASK_ALPHA) + { + if (sbit->alpha == 0 || sbit->alpha > png_ptr->usr_bit_depth) + { + png_warning(png_ptr, "Invalid sBIT depth specified"); + return; + } + buf[size++] = sbit->alpha; + } + + png_write_chunk(png_ptr, (png_bytep)png_sBIT, buf, size); +} +#endif + +#if defined(PNG_WRITE_cHRM_SUPPORTED) +/* Write the cHRM chunk */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +void /* PRIVATE */ +png_write_cHRM(png_structp png_ptr, double white_x, double white_y, + double red_x, double red_y, double green_x, double green_y, + double blue_x, double blue_y) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_cHRM; +#endif + png_byte buf[32]; + + png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, + int_green_x, int_green_y, int_blue_x, int_blue_y; + + png_debug(1, "in png_write_cHRM"); + + int_white_x = (png_uint_32)(white_x * 100000.0 + 0.5); + int_white_y = (png_uint_32)(white_y * 100000.0 + 0.5); + int_red_x = (png_uint_32)(red_x * 100000.0 + 0.5); + int_red_y = (png_uint_32)(red_y * 100000.0 + 0.5); + int_green_x = (png_uint_32)(green_x * 100000.0 + 0.5); + int_green_y = (png_uint_32)(green_y * 100000.0 + 0.5); + int_blue_x = (png_uint_32)(blue_x * 100000.0 + 0.5); + int_blue_y = (png_uint_32)(blue_y * 100000.0 + 0.5); + +#if !defined(PNG_NO_CHECK_cHRM) + if (png_check_cHRM_fixed(png_ptr, int_white_x, int_white_y, + int_red_x, int_red_y, int_green_x, int_green_y, int_blue_x, int_blue_y)) +#endif + { + /* Each value is saved in 1/100,000ths */ + + png_save_uint_32(buf, int_white_x); + png_save_uint_32(buf + 4, int_white_y); + + png_save_uint_32(buf + 8, int_red_x); + png_save_uint_32(buf + 12, int_red_y); + + png_save_uint_32(buf + 16, int_green_x); + png_save_uint_32(buf + 20, int_green_y); + + png_save_uint_32(buf + 24, int_blue_x); + png_save_uint_32(buf + 28, int_blue_y); + + png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32); + } +} +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +void /* PRIVATE */ +png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x, + png_fixed_point white_y, png_fixed_point red_x, png_fixed_point red_y, + png_fixed_point green_x, png_fixed_point green_y, png_fixed_point blue_x, + png_fixed_point blue_y) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_cHRM; +#endif + png_byte buf[32]; + + png_debug(1, "in png_write_cHRM"); + + /* Each value is saved in 1/100,000ths */ +#if !defined(PNG_NO_CHECK_cHRM) + if (png_check_cHRM_fixed(png_ptr, white_x, white_y, red_x, red_y, + green_x, green_y, blue_x, blue_y)) +#endif + { + png_save_uint_32(buf, (png_uint_32)white_x); + png_save_uint_32(buf + 4, (png_uint_32)white_y); + + png_save_uint_32(buf + 8, (png_uint_32)red_x); + png_save_uint_32(buf + 12, (png_uint_32)red_y); + + png_save_uint_32(buf + 16, (png_uint_32)green_x); + png_save_uint_32(buf + 20, (png_uint_32)green_y); + + png_save_uint_32(buf + 24, (png_uint_32)blue_x); + png_save_uint_32(buf + 28, (png_uint_32)blue_y); + + png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32); + } +} +#endif +#endif + +#if defined(PNG_WRITE_tRNS_SUPPORTED) +/* Write the tRNS chunk */ +void /* PRIVATE */ +png_write_tRNS(png_structp png_ptr, png_bytep trans, png_color_16p tran, + int num_trans, int color_type) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_tRNS; +#endif + png_byte buf[6]; + + png_debug(1, "in png_write_tRNS"); + + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + if (num_trans <= 0 || num_trans > (int)png_ptr->num_palette) + { + png_warning(png_ptr, "Invalid number of transparent colors specified"); + return; + } + /* Write the chunk out as it is */ + png_write_chunk(png_ptr, (png_bytep)png_tRNS, trans, + (png_size_t)num_trans); + } + else if (color_type == PNG_COLOR_TYPE_GRAY) + { + /* One 16 bit value */ + if (tran->gray >= (1 << png_ptr->bit_depth)) + { + png_warning(png_ptr, + "Ignoring attempt to write tRNS chunk out-of-range for bit_depth"); + return; + } + png_save_uint_16(buf, tran->gray); + png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)2); + } + else if (color_type == PNG_COLOR_TYPE_RGB) + { + /* Three 16 bit values */ + png_save_uint_16(buf, tran->red); + png_save_uint_16(buf + 2, tran->green); + png_save_uint_16(buf + 4, tran->blue); + if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) + { + png_warning(png_ptr, + "Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8"); + return; + } + png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)6); + } + else + { + png_warning(png_ptr, "Can't write tRNS with an alpha channel"); + } +} +#endif + +#if defined(PNG_WRITE_bKGD_SUPPORTED) +/* Write the background chunk */ +void /* PRIVATE */ +png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_bKGD; +#endif + png_byte buf[6]; + + png_debug(1, "in png_write_bKGD"); + + if (color_type == PNG_COLOR_TYPE_PALETTE) + { + if ( +#if defined(PNG_MNG_FEATURES_SUPPORTED) + (png_ptr->num_palette || + (!(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE))) && +#endif + back->index >= png_ptr->num_palette) + { + png_warning(png_ptr, "Invalid background palette index"); + return; + } + buf[0] = back->index; + png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)1); + } + else if (color_type & PNG_COLOR_MASK_COLOR) + { + png_save_uint_16(buf, back->red); + png_save_uint_16(buf + 2, back->green); + png_save_uint_16(buf + 4, back->blue); + if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) + { + png_warning(png_ptr, + "Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8"); + return; + } + png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)6); + } + else + { + if (back->gray >= (1 << png_ptr->bit_depth)) + { + png_warning(png_ptr, + "Ignoring attempt to write bKGD chunk out-of-range for bit_depth"); + return; + } + png_save_uint_16(buf, back->gray); + png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)2); + } +} +#endif + +#if defined(PNG_WRITE_hIST_SUPPORTED) +/* Write the histogram */ +void /* PRIVATE */ +png_write_hIST(png_structp png_ptr, png_uint_16p hist, int num_hist) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_hIST; +#endif + int i; + png_byte buf[3]; + + png_debug(1, "in png_write_hIST"); + + if (num_hist > (int)png_ptr->num_palette) + { + png_debug2(3, "num_hist = %d, num_palette = %d", num_hist, + png_ptr->num_palette); + png_warning(png_ptr, "Invalid number of histogram entries specified"); + return; + } + + png_write_chunk_start(png_ptr, (png_bytep)png_hIST, + (png_uint_32)(num_hist * 2)); + for (i = 0; i < num_hist; i++) + { + png_save_uint_16(buf, hist[i]); + png_write_chunk_data(png_ptr, buf, (png_size_t)2); + } + png_write_chunk_end(png_ptr); +} +#endif + +#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ + defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) +/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification, + * and if invalid, correct the keyword rather than discarding the entire + * chunk. The PNG 1.0 specification requires keywords 1-79 characters in + * length, forbids leading or trailing whitespace, multiple internal spaces, + * and the non-break space (0x80) from ISO 8859-1. Returns keyword length. + * + * The new_key is allocated to hold the corrected keyword and must be freed + * by the calling routine. This avoids problems with trying to write to + * static keywords without having to have duplicate copies of the strings. + */ +png_size_t /* PRIVATE */ +png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key) +{ + png_size_t key_len; + png_charp kp, dp; + int kflag; + int kwarn=0; + + png_debug(1, "in png_check_keyword"); + + *new_key = NULL; + + if (key == NULL || (key_len = png_strlen(key)) == 0) + { + png_warning(png_ptr, "zero length keyword"); + return ((png_size_t)0); + } + + png_debug1(2, "Keyword to be checked is '%s'", key); + + *new_key = (png_charp)png_malloc_warn(png_ptr, (png_uint_32)(key_len + 2)); + if (*new_key == NULL) + { + png_warning(png_ptr, "Out of memory while procesing keyword"); + return ((png_size_t)0); + } + + /* Replace non-printing characters with a blank and print a warning */ + for (kp = key, dp = *new_key; *kp != '\0'; kp++, dp++) + { + if ((png_byte)*kp < 0x20 || + ((png_byte)*kp > 0x7E && (png_byte)*kp < 0xA1)) + { +#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE) + char msg[40]; + + png_snprintf(msg, 40, + "invalid keyword character 0x%02X", (png_byte)*kp); + png_warning(png_ptr, msg); +#else + png_warning(png_ptr, "invalid character in keyword"); +#endif + *dp = ' '; + } + else + { + *dp = *kp; + } + } + *dp = '\0'; + + /* Remove any trailing white space. */ + kp = *new_key + key_len - 1; + if (*kp == ' ') + { + png_warning(png_ptr, "trailing spaces removed from keyword"); + + while (*kp == ' ') + { + *(kp--) = '\0'; + key_len--; + } + } + + /* Remove any leading white space. */ + kp = *new_key; + if (*kp == ' ') + { + png_warning(png_ptr, "leading spaces removed from keyword"); + + while (*kp == ' ') + { + kp++; + key_len--; + } + } + + png_debug1(2, "Checking for multiple internal spaces in '%s'", kp); + + /* Remove multiple internal spaces. */ + for (kflag = 0, dp = *new_key; *kp != '\0'; kp++) + { + if (*kp == ' ' && kflag == 0) + { + *(dp++) = *kp; + kflag = 1; + } + else if (*kp == ' ') + { + key_len--; + kwarn=1; + } + else + { + *(dp++) = *kp; + kflag = 0; + } + } + *dp = '\0'; + if (kwarn) + png_warning(png_ptr, "extra interior spaces removed from keyword"); + + if (key_len == 0) + { + png_free(png_ptr, *new_key); + *new_key=NULL; + png_warning(png_ptr, "Zero length keyword"); + } + + if (key_len > 79) + { + png_warning(png_ptr, "keyword length must be 1 - 79 characters"); + (*new_key)[79] = '\0'; + key_len = 79; + } + + return (key_len); +} +#endif + +#if defined(PNG_WRITE_tEXt_SUPPORTED) +/* Write a tEXt chunk */ +void /* PRIVATE */ +png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text, + png_size_t text_len) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_tEXt; +#endif + png_size_t key_len; + png_charp new_key; + + png_debug(1, "in png_write_tEXt"); + + if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0) + return; + + if (text == NULL || *text == '\0') + text_len = 0; + else + text_len = png_strlen(text); + + /* Make sure we include the 0 after the key */ + png_write_chunk_start(png_ptr, (png_bytep)png_tEXt, + (png_uint_32)(key_len + text_len + 1)); + /* + * We leave it to the application to meet PNG-1.0 requirements on the + * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of + * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them. + * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. + */ + png_write_chunk_data(png_ptr, (png_bytep)new_key, + (png_size_t)(key_len + 1)); + if (text_len) + png_write_chunk_data(png_ptr, (png_bytep)text, (png_size_t)text_len); + + png_write_chunk_end(png_ptr); + png_free(png_ptr, new_key); +} +#endif + +#if defined(PNG_WRITE_zTXt_SUPPORTED) +/* Write a compressed text chunk */ +void /* PRIVATE */ +png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text, + png_size_t text_len, int compression) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_zTXt; +#endif + png_size_t key_len; + char buf[1]; + png_charp new_key; + compression_state comp; + + png_debug(1, "in png_write_zTXt"); + + comp.num_output_ptr = 0; + comp.max_output_ptr = 0; + comp.output_ptr = NULL; + comp.input = NULL; + comp.input_len = 0; + + if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0) + { + png_free(png_ptr, new_key); + return; + } + + if (text == NULL || *text == '\0' || compression==PNG_TEXT_COMPRESSION_NONE) + { + png_write_tEXt(png_ptr, new_key, text, (png_size_t)0); + png_free(png_ptr, new_key); + return; + } + + text_len = png_strlen(text); + + /* Compute the compressed data; do it now for the length */ + text_len = png_text_compress(png_ptr, text, text_len, compression, + &comp); + + /* Write start of chunk */ + png_write_chunk_start(png_ptr, (png_bytep)png_zTXt, + (png_uint_32)(key_len+text_len + 2)); + /* Write key */ + png_write_chunk_data(png_ptr, (png_bytep)new_key, + (png_size_t)(key_len + 1)); + png_free(png_ptr, new_key); + + buf[0] = (png_byte)compression; + /* Write compression */ + png_write_chunk_data(png_ptr, (png_bytep)buf, (png_size_t)1); + /* Write the compressed data */ + png_write_compressed_data_out(png_ptr, &comp); + + /* Close the chunk */ + png_write_chunk_end(png_ptr); +} +#endif + +#if defined(PNG_WRITE_iTXt_SUPPORTED) +/* Write an iTXt chunk */ +void /* PRIVATE */ +png_write_iTXt(png_structp png_ptr, int compression, png_charp key, + png_charp lang, png_charp lang_key, png_charp text) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_iTXt; +#endif + png_size_t lang_len, key_len, lang_key_len, text_len; + png_charp new_lang; + png_charp new_key = NULL; + png_byte cbuf[2]; + compression_state comp; + + png_debug(1, "in png_write_iTXt"); + + comp.num_output_ptr = 0; + comp.max_output_ptr = 0; + comp.output_ptr = NULL; + comp.input = NULL; + + if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0) + return; + + if ((lang_len = png_check_keyword(png_ptr, lang, &new_lang))==0) + { + png_warning(png_ptr, "Empty language field in iTXt chunk"); + new_lang = NULL; + lang_len = 0; + } + + if (lang_key == NULL) + lang_key_len = 0; + else + lang_key_len = png_strlen(lang_key); + + if (text == NULL) + text_len = 0; + else + text_len = png_strlen(text); + + /* Compute the compressed data; do it now for the length */ + text_len = png_text_compress(png_ptr, text, text_len, compression-2, + &comp); + + + /* Make sure we include the compression flag, the compression byte, + * and the NULs after the key, lang, and lang_key parts */ + + png_write_chunk_start(png_ptr, (png_bytep)png_iTXt, + (png_uint_32)( + 5 /* comp byte, comp flag, terminators for key, lang and lang_key */ + + key_len + + lang_len + + lang_key_len + + text_len)); + + /* We leave it to the application to meet PNG-1.0 requirements on the + * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of + * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them. + * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. + */ + png_write_chunk_data(png_ptr, (png_bytep)new_key, + (png_size_t)(key_len + 1)); + + /* Set the compression flag */ + if (compression == PNG_ITXT_COMPRESSION_NONE || \ + compression == PNG_TEXT_COMPRESSION_NONE) + cbuf[0] = 0; + else /* compression == PNG_ITXT_COMPRESSION_zTXt */ + cbuf[0] = 1; + /* Set the compression method */ + cbuf[1] = 0; + png_write_chunk_data(png_ptr, cbuf, (png_size_t)2); + + cbuf[0] = 0; + png_write_chunk_data(png_ptr, (new_lang ? (png_bytep)new_lang : cbuf), + (png_size_t)(lang_len + 1)); + png_write_chunk_data(png_ptr, (lang_key ? (png_bytep)lang_key : cbuf), + (png_size_t)(lang_key_len + 1)); + png_write_compressed_data_out(png_ptr, &comp); + + png_write_chunk_end(png_ptr); + png_free(png_ptr, new_key); + png_free(png_ptr, new_lang); +} +#endif + +#if defined(PNG_WRITE_oFFs_SUPPORTED) +/* Write the oFFs chunk */ +void /* PRIVATE */ +png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset, + int unit_type) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_oFFs; +#endif + png_byte buf[9]; + + png_debug(1, "in png_write_oFFs"); + + if (unit_type >= PNG_OFFSET_LAST) + png_warning(png_ptr, "Unrecognized unit type for oFFs chunk"); + + png_save_int_32(buf, x_offset); + png_save_int_32(buf + 4, y_offset); + buf[8] = (png_byte)unit_type; + + png_write_chunk(png_ptr, (png_bytep)png_oFFs, buf, (png_size_t)9); +} +#endif +#if defined(PNG_WRITE_pCAL_SUPPORTED) +/* Write the pCAL chunk (described in the PNG extensions document) */ +void /* PRIVATE */ +png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0, + png_int_32 X1, int type, int nparams, png_charp units, png_charpp params) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_pCAL; +#endif + png_size_t purpose_len, units_len, total_len; + png_uint_32p params_len; + png_byte buf[10]; + png_charp new_purpose; + int i; + + png_debug1(1, "in png_write_pCAL (%d parameters)", nparams); + + if (type >= PNG_EQUATION_LAST) + png_warning(png_ptr, "Unrecognized equation type for pCAL chunk"); + + purpose_len = png_check_keyword(png_ptr, purpose, &new_purpose) + 1; + png_debug1(3, "pCAL purpose length = %d", (int)purpose_len); + units_len = png_strlen(units) + (nparams == 0 ? 0 : 1); + png_debug1(3, "pCAL units length = %d", (int)units_len); + total_len = purpose_len + units_len + 10; + + params_len = (png_uint_32p)png_malloc(png_ptr, + (png_uint_32)(nparams * png_sizeof(png_uint_32))); + + /* Find the length of each parameter, making sure we don't count the + null terminator for the last parameter. */ + for (i = 0; i < nparams; i++) + { + params_len[i] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1); + png_debug2(3, "pCAL parameter %d length = %lu", i, + (unsigned long) params_len[i]); + total_len += (png_size_t)params_len[i]; + } + + png_debug1(3, "pCAL total length = %d", (int)total_len); + png_write_chunk_start(png_ptr, (png_bytep)png_pCAL, (png_uint_32)total_len); + png_write_chunk_data(png_ptr, (png_bytep)new_purpose, + (png_size_t)purpose_len); + png_save_int_32(buf, X0); + png_save_int_32(buf + 4, X1); + buf[8] = (png_byte)type; + buf[9] = (png_byte)nparams; + png_write_chunk_data(png_ptr, buf, (png_size_t)10); + png_write_chunk_data(png_ptr, (png_bytep)units, (png_size_t)units_len); + + png_free(png_ptr, new_purpose); + + for (i = 0; i < nparams; i++) + { + png_write_chunk_data(png_ptr, (png_bytep)params[i], + (png_size_t)params_len[i]); + } + + png_free(png_ptr, params_len); + png_write_chunk_end(png_ptr); +} +#endif + +#if defined(PNG_WRITE_sCAL_SUPPORTED) +/* Write the sCAL chunk */ +#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) +void /* PRIVATE */ +png_write_sCAL(png_structp png_ptr, int unit, double width, double height) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_sCAL; +#endif + char buf[64]; + png_size_t total_len; + + png_debug(1, "in png_write_sCAL"); + + buf[0] = (char)unit; +#if defined(_WIN32_WCE) +/* sprintf() function is not supported on WindowsCE */ + { + wchar_t wc_buf[32]; + size_t wc_len; + swprintf(wc_buf, TEXT("%12.12e"), width); + wc_len = wcslen(wc_buf); + WideCharToMultiByte(CP_ACP, 0, wc_buf, -1, buf + 1, wc_len, NULL, NULL); + total_len = wc_len + 2; + swprintf(wc_buf, TEXT("%12.12e"), height); + wc_len = wcslen(wc_buf); + WideCharToMultiByte(CP_ACP, 0, wc_buf, -1, buf + total_len, wc_len, + NULL, NULL); + total_len += wc_len; + } +#else + png_snprintf(buf + 1, 63, "%12.12e", width); + total_len = 1 + png_strlen(buf + 1) + 1; + png_snprintf(buf + total_len, 64-total_len, "%12.12e", height); + total_len += png_strlen(buf + total_len); +#endif + + png_debug1(3, "sCAL total length = %u", (unsigned int)total_len); + png_write_chunk(png_ptr, (png_bytep)png_sCAL, (png_bytep)buf, total_len); +} +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +void /* PRIVATE */ +png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width, + png_charp height) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_sCAL; +#endif + png_byte buf[64]; + png_size_t wlen, hlen, total_len; + + png_debug(1, "in png_write_sCAL_s"); + + wlen = png_strlen(width); + hlen = png_strlen(height); + total_len = wlen + hlen + 2; + if (total_len > 64) + { + png_warning(png_ptr, "Can't write sCAL (buffer too small)"); + return; + } + + buf[0] = (png_byte)unit; + png_memcpy(buf + 1, width, wlen + 1); /* Append the '\0' here */ + png_memcpy(buf + wlen + 2, height, hlen); /* Do NOT append the '\0' here */ + + png_debug1(3, "sCAL total length = %u", (unsigned int)total_len); + png_write_chunk(png_ptr, (png_bytep)png_sCAL, buf, total_len); +} +#endif +#endif +#endif + +#if defined(PNG_WRITE_pHYs_SUPPORTED) +/* Write the pHYs chunk */ +void /* PRIVATE */ +png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit, + png_uint_32 y_pixels_per_unit, + int unit_type) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_pHYs; +#endif + png_byte buf[9]; + + png_debug(1, "in png_write_pHYs"); + + if (unit_type >= PNG_RESOLUTION_LAST) + png_warning(png_ptr, "Unrecognized unit type for pHYs chunk"); + + png_save_uint_32(buf, x_pixels_per_unit); + png_save_uint_32(buf + 4, y_pixels_per_unit); + buf[8] = (png_byte)unit_type; + + png_write_chunk(png_ptr, (png_bytep)png_pHYs, buf, (png_size_t)9); +} +#endif + +#if defined(PNG_WRITE_tIME_SUPPORTED) +/* Write the tIME chunk. Use either png_convert_from_struct_tm() + * or png_convert_from_time_t(), or fill in the structure yourself. + */ +void /* PRIVATE */ +png_write_tIME(png_structp png_ptr, png_timep mod_time) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + PNG_tIME; +#endif + png_byte buf[7]; + + png_debug(1, "in png_write_tIME"); + + if (mod_time->month > 12 || mod_time->month < 1 || + mod_time->day > 31 || mod_time->day < 1 || + mod_time->hour > 23 || mod_time->second > 60) + { + png_warning(png_ptr, "Invalid time specified for tIME chunk"); + return; + } + + png_save_uint_16(buf, mod_time->year); + buf[2] = mod_time->month; + buf[3] = mod_time->day; + buf[4] = mod_time->hour; + buf[5] = mod_time->minute; + buf[6] = mod_time->second; + + png_write_chunk(png_ptr, (png_bytep)png_tIME, buf, (png_size_t)7); +} +#endif + +/* Initializes the row writing capability of libpng */ +void /* PRIVATE */ +png_write_start_row(png_structp png_ptr) +{ +#ifdef PNG_WRITE_INTERLACING_SUPPORTED +#ifdef PNG_USE_LOCAL_ARRAYS + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* Start of interlace block */ + int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; + + /* Offset to next interlace block */ + int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; + + /* Start of interlace block in the y direction */ + int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; + + /* Offset to next interlace block in the y direction */ + int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; +#endif +#endif + + png_size_t buf_size; + + png_debug(1, "in png_write_start_row"); + + buf_size = (png_size_t)(PNG_ROWBYTES( + png_ptr->usr_channels*png_ptr->usr_bit_depth, png_ptr->width) + 1); + + /* Set up row buffer */ + png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, + (png_uint_32)buf_size); + png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE; + +#ifndef PNG_NO_WRITE_FILTER + /* Set up filtering buffer, if using this filter */ + if (png_ptr->do_filter & PNG_FILTER_SUB) + { + png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(png_ptr->rowbytes + 1)); + png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; + } + + /* We only need to keep the previous row if we are using one of these. */ + if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH)) + { + /* Set up previous row buffer */ + png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, + (png_uint_32)buf_size); + png_memset(png_ptr->prev_row, 0, buf_size); + + if (png_ptr->do_filter & PNG_FILTER_UP) + { + png_ptr->up_row = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(png_ptr->rowbytes + 1)); + png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; + } + + if (png_ptr->do_filter & PNG_FILTER_AVG) + { + png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(png_ptr->rowbytes + 1)); + png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; + } + + if (png_ptr->do_filter & PNG_FILTER_PAETH) + { + png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, + (png_uint_32)(png_ptr->rowbytes + 1)); + png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; + } + } +#endif /* PNG_NO_WRITE_FILTER */ + +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + /* If interlaced, we need to set up width and height of pass */ + if (png_ptr->interlaced) + { + if (!(png_ptr->transformations & PNG_INTERLACE)) + { + png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - + png_pass_ystart[0]) / png_pass_yinc[0]; + png_ptr->usr_width = (png_ptr->width + png_pass_inc[0] - 1 - + png_pass_start[0]) / png_pass_inc[0]; + } + else + { + png_ptr->num_rows = png_ptr->height; + png_ptr->usr_width = png_ptr->width; + } + } + else +#endif + { + png_ptr->num_rows = png_ptr->height; + png_ptr->usr_width = png_ptr->width; + } + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + png_ptr->zstream.next_out = png_ptr->zbuf; +} + +/* Internal use only. Called when finished processing a row of data. */ +void /* PRIVATE */ +png_write_finish_row(png_structp png_ptr) +{ +#ifdef PNG_WRITE_INTERLACING_SUPPORTED +#ifdef PNG_USE_LOCAL_ARRAYS + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* Start of interlace block */ + int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; + + /* Offset to next interlace block */ + int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; + + /* Start of interlace block in the y direction */ + int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; + + /* Offset to next interlace block in the y direction */ + int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; +#endif +#endif + + int ret; + + png_debug(1, "in png_write_finish_row"); + + /* Next row */ + png_ptr->row_number++; + + /* See if we are done */ + if (png_ptr->row_number < png_ptr->num_rows) + return; + +#ifdef PNG_WRITE_INTERLACING_SUPPORTED + /* If interlaced, go to next pass */ + if (png_ptr->interlaced) + { + png_ptr->row_number = 0; + if (png_ptr->transformations & PNG_INTERLACE) + { + png_ptr->pass++; + } + else + { + /* Loop until we find a non-zero width or height pass */ + do + { + png_ptr->pass++; + if (png_ptr->pass >= 7) + break; + png_ptr->usr_width = (png_ptr->width + + png_pass_inc[png_ptr->pass] - 1 - + png_pass_start[png_ptr->pass]) / + png_pass_inc[png_ptr->pass]; + png_ptr->num_rows = (png_ptr->height + + png_pass_yinc[png_ptr->pass] - 1 - + png_pass_ystart[png_ptr->pass]) / + png_pass_yinc[png_ptr->pass]; + if (png_ptr->transformations & PNG_INTERLACE) + break; + } while (png_ptr->usr_width == 0 || png_ptr->num_rows == 0); + + } + + /* Reset the row above the image for the next pass */ + if (png_ptr->pass < 7) + { + if (png_ptr->prev_row != NULL) + png_memset(png_ptr->prev_row, 0, + (png_size_t)(PNG_ROWBYTES(png_ptr->usr_channels* + png_ptr->usr_bit_depth, png_ptr->width)) + 1); + return; + } + } +#endif + + /* If we get here, we've just written the last row, so we need + to flush the compressor */ + do + { + /* Tell the compressor we are done */ + ret = deflate(&png_ptr->zstream, Z_FINISH); + /* Check for an error */ + if (ret == Z_OK) + { + /* Check to see if we need more room */ + if (!(png_ptr->zstream.avail_out)) + { + png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + } + } + else if (ret != Z_STREAM_END) + { + if (png_ptr->zstream.msg != NULL) + png_error(png_ptr, png_ptr->zstream.msg); + else + png_error(png_ptr, "zlib error"); + } + } while (ret != Z_STREAM_END); + + /* Write any extra space */ + if (png_ptr->zstream.avail_out < png_ptr->zbuf_size) + { + png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size - + png_ptr->zstream.avail_out); + } + + deflateReset(&png_ptr->zstream); + png_ptr->zstream.data_type = Z_BINARY; +} + +#if defined(PNG_WRITE_INTERLACING_SUPPORTED) +/* Pick out the correct pixels for the interlace pass. + * The basic idea here is to go through the row with a source + * pointer and a destination pointer (sp and dp), and copy the + * correct pixels for the pass. As the row gets compacted, + * sp will always be >= dp, so we should never overwrite anything. + * See the default: case for the easiest code to understand. + */ +void /* PRIVATE */ +png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) +{ +#ifdef PNG_USE_LOCAL_ARRAYS + /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ + + /* Start of interlace block */ + int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; + + /* Offset to next interlace block */ + int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; +#endif + + png_debug(1, "in png_do_write_interlace"); + + /* We don't have to do anything on the last pass (6) */ +#if defined(PNG_USELESS_TESTS_SUPPORTED) + if (row != NULL && row_info != NULL && pass < 6) +#else + if (pass < 6) +#endif + { + /* Each pixel depth is handled separately */ + switch (row_info->pixel_depth) + { + case 1: + { + png_bytep sp; + png_bytep dp; + int shift; + int d; + int value; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + dp = row; + d = 0; + shift = 7; + for (i = png_pass_start[pass]; i < row_width; + i += png_pass_inc[pass]) + { + sp = row + (png_size_t)(i >> 3); + value = (int)(*sp >> (7 - (int)(i & 0x07))) & 0x01; + d |= (value << shift); + + if (shift == 0) + { + shift = 7; + *dp++ = (png_byte)d; + d = 0; + } + else + shift--; + + } + if (shift != 7) + *dp = (png_byte)d; + break; + } + case 2: + { + png_bytep sp; + png_bytep dp; + int shift; + int d; + int value; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + dp = row; + shift = 6; + d = 0; + for (i = png_pass_start[pass]; i < row_width; + i += png_pass_inc[pass]) + { + sp = row + (png_size_t)(i >> 2); + value = (*sp >> ((3 - (int)(i & 0x03)) << 1)) & 0x03; + d |= (value << shift); + + if (shift == 0) + { + shift = 6; + *dp++ = (png_byte)d; + d = 0; + } + else + shift -= 2; + } + if (shift != 6) + *dp = (png_byte)d; + break; + } + case 4: + { + png_bytep sp; + png_bytep dp; + int shift; + int d; + int value; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + + dp = row; + shift = 4; + d = 0; + for (i = png_pass_start[pass]; i < row_width; + i += png_pass_inc[pass]) + { + sp = row + (png_size_t)(i >> 1); + value = (*sp >> ((1 - (int)(i & 0x01)) << 2)) & 0x0f; + d |= (value << shift); + + if (shift == 0) + { + shift = 4; + *dp++ = (png_byte)d; + d = 0; + } + else + shift -= 4; + } + if (shift != 4) + *dp = (png_byte)d; + break; + } + default: + { + png_bytep sp; + png_bytep dp; + png_uint_32 i; + png_uint_32 row_width = row_info->width; + png_size_t pixel_bytes; + + /* Start at the beginning */ + dp = row; + /* Find out how many bytes each pixel takes up */ + pixel_bytes = (row_info->pixel_depth >> 3); + /* Loop through the row, only looking at the pixels that + matter */ + for (i = png_pass_start[pass]; i < row_width; + i += png_pass_inc[pass]) + { + /* Find out where the original pixel is */ + sp = row + (png_size_t)i * pixel_bytes; + /* Move the pixel */ + if (dp != sp) + png_memcpy(dp, sp, pixel_bytes); + /* Next pixel */ + dp += pixel_bytes; + } + break; + } + } + /* Set new row width */ + row_info->width = (row_info->width + + png_pass_inc[pass] - 1 - + png_pass_start[pass]) / + png_pass_inc[pass]; + row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, + row_info->width); + } +} +#endif + +/* This filters the row, chooses which filter to use, if it has not already + * been specified by the application, and then writes the row out with the + * chosen filter. + */ +#define PNG_MAXSUM (((png_uint_32)(-1)) >> 1) +#define PNG_HISHIFT 10 +#define PNG_LOMASK ((png_uint_32)0xffffL) +#define PNG_HIMASK ((png_uint_32)(~PNG_LOMASK >> PNG_HISHIFT)) +void /* PRIVATE */ +png_write_find_filter(png_structp png_ptr, png_row_infop row_info) +{ + png_bytep best_row; +#ifndef PNG_NO_WRITE_FILTER + png_bytep prev_row, row_buf; + png_uint_32 mins, bpp; + png_byte filter_to_do = png_ptr->do_filter; + png_uint_32 row_bytes = row_info->rowbytes; +#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED + int num_p_filters = (int)png_ptr->num_prev_filters; +#endif + + png_debug(1, "in png_write_find_filter"); + + /* Find out how many bytes offset each pixel is */ + bpp = (row_info->pixel_depth + 7) >> 3; + + prev_row = png_ptr->prev_row; +#endif + best_row = png_ptr->row_buf; +#ifndef PNG_NO_WRITE_FILTER + row_buf = best_row; + mins = PNG_MAXSUM; + + /* The prediction method we use is to find which method provides the + * smallest value when summing the absolute values of the distances + * from zero, using anything >= 128 as negative numbers. This is known + * as the "minimum sum of absolute differences" heuristic. Other + * heuristics are the "weighted minimum sum of absolute differences" + * (experimental and can in theory improve compression), and the "zlib + * predictive" method (not implemented yet), which does test compressions + * of lines using different filter methods, and then chooses the + * (series of) filter(s) that give minimum compressed data size (VERY + * computationally expensive). + * + * GRR 980525: consider also + * (1) minimum sum of absolute differences from running average (i.e., + * keep running sum of non-absolute differences & count of bytes) + * [track dispersion, too? restart average if dispersion too large?] + * (1b) minimum sum of absolute differences from sliding average, probably + * with window size <= deflate window (usually 32K) + * (2) minimum sum of squared differences from zero or running average + * (i.e., ~ root-mean-square approach) + */ + + + /* We don't need to test the 'no filter' case if this is the only filter + * that has been chosen, as it doesn't actually do anything to the data. + */ + if ((filter_to_do & PNG_FILTER_NONE) && + filter_to_do != PNG_FILTER_NONE) + { + png_bytep rp; + png_uint_32 sum = 0; + png_uint_32 i; + int v; + + for (i = 0, rp = row_buf + 1; i < row_bytes; i++, rp++) + { + v = *rp; + sum += (v < 128) ? v : 256 - v; + } + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + png_uint_32 sumhi, sumlo; + int j; + sumlo = sum & PNG_LOMASK; + sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; /* Gives us some footroom */ + + /* Reduce the sum if we match any of the previous rows */ + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) + { + sumlo = (sumlo * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + sumhi = (sumhi * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + /* Factor in the cost of this filter (this is here for completeness, + * but it makes no sense to have a "cost" for the NONE filter, as + * it has the minimum possible computational cost - none). + */ + sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> + PNG_COST_SHIFT; + sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> + PNG_COST_SHIFT; + + if (sumhi > PNG_HIMASK) + sum = PNG_MAXSUM; + else + sum = (sumhi << PNG_HISHIFT) + sumlo; + } +#endif + mins = sum; + } + + /* Sub filter */ + if (filter_to_do == PNG_FILTER_SUB) + /* It's the only filter so no testing is needed */ + { + png_bytep rp, lp, dp; + png_uint_32 i; + for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; + i++, rp++, dp++) + { + *dp = *rp; + } + for (lp = row_buf + 1; i < row_bytes; + i++, rp++, lp++, dp++) + { + *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); + } + best_row = png_ptr->sub_row; + } + + else if (filter_to_do & PNG_FILTER_SUB) + { + png_bytep rp, dp, lp; + png_uint_32 sum = 0, lmins = mins; + png_uint_32 i; + int v; + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + /* We temporarily increase the "minimum sum" by the factor we + * would reduce the sum of this filter, so that we can do the + * early exit comparison without scaling the sum each time. + */ + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 lmhi, lmlo; + lmlo = lmins & PNG_LOMASK; + lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) + { + lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> + PNG_COST_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> + PNG_COST_SHIFT; + + if (lmhi > PNG_HIMASK) + lmins = PNG_MAXSUM; + else + lmins = (lmhi << PNG_HISHIFT) + lmlo; + } +#endif + + for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; + i++, rp++, dp++) + { + v = *dp = *rp; + + sum += (v < 128) ? v : 256 - v; + } + for (lp = row_buf + 1; i < row_bytes; + i++, rp++, lp++, dp++) + { + v = *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); + + sum += (v < 128) ? v : 256 - v; + + if (sum > lmins) /* We are already worse, don't continue. */ + break; + } + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 sumhi, sumlo; + sumlo = sum & PNG_LOMASK; + sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) + { + sumlo = (sumlo * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + sumhi = (sumhi * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + sumlo = (sumlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> + PNG_COST_SHIFT; + sumhi = (sumhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> + PNG_COST_SHIFT; + + if (sumhi > PNG_HIMASK) + sum = PNG_MAXSUM; + else + sum = (sumhi << PNG_HISHIFT) + sumlo; + } +#endif + + if (sum < mins) + { + mins = sum; + best_row = png_ptr->sub_row; + } + } + + /* Up filter */ + if (filter_to_do == PNG_FILTER_UP) + { + png_bytep rp, dp, pp; + png_uint_32 i; + + for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, + pp = prev_row + 1; i < row_bytes; + i++, rp++, pp++, dp++) + { + *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff); + } + best_row = png_ptr->up_row; + } + + else if (filter_to_do & PNG_FILTER_UP) + { + png_bytep rp, dp, pp; + png_uint_32 sum = 0, lmins = mins; + png_uint_32 i; + int v; + + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 lmhi, lmlo; + lmlo = lmins & PNG_LOMASK; + lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) + { + lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> + PNG_COST_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> + PNG_COST_SHIFT; + + if (lmhi > PNG_HIMASK) + lmins = PNG_MAXSUM; + else + lmins = (lmhi << PNG_HISHIFT) + lmlo; + } +#endif + + for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, + pp = prev_row + 1; i < row_bytes; i++) + { + v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); + + sum += (v < 128) ? v : 256 - v; + + if (sum > lmins) /* We are already worse, don't continue. */ + break; + } + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 sumhi, sumlo; + sumlo = sum & PNG_LOMASK; + sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) + { + sumlo = (sumlo * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + sumhi = (sumhi * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> + PNG_COST_SHIFT; + sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> + PNG_COST_SHIFT; + + if (sumhi > PNG_HIMASK) + sum = PNG_MAXSUM; + else + sum = (sumhi << PNG_HISHIFT) + sumlo; + } +#endif + + if (sum < mins) + { + mins = sum; + best_row = png_ptr->up_row; + } + } + + /* Avg filter */ + if (filter_to_do == PNG_FILTER_AVG) + { + png_bytep rp, dp, pp, lp; + png_uint_32 i; + for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, + pp = prev_row + 1; i < bpp; i++) + { + *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); + } + for (lp = row_buf + 1; i < row_bytes; i++) + { + *dp++ = (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) + & 0xff); + } + best_row = png_ptr->avg_row; + } + + else if (filter_to_do & PNG_FILTER_AVG) + { + png_bytep rp, dp, pp, lp; + png_uint_32 sum = 0, lmins = mins; + png_uint_32 i; + int v; + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 lmhi, lmlo; + lmlo = lmins & PNG_LOMASK; + lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_AVG) + { + lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> + PNG_COST_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> + PNG_COST_SHIFT; + + if (lmhi > PNG_HIMASK) + lmins = PNG_MAXSUM; + else + lmins = (lmhi << PNG_HISHIFT) + lmlo; + } +#endif + + for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, + pp = prev_row + 1; i < bpp; i++) + { + v = *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); + + sum += (v < 128) ? v : 256 - v; + } + for (lp = row_buf + 1; i < row_bytes; i++) + { + v = *dp++ = + (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) & 0xff); + + sum += (v < 128) ? v : 256 - v; + + if (sum > lmins) /* We are already worse, don't continue. */ + break; + } + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 sumhi, sumlo; + sumlo = sum & PNG_LOMASK; + sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) + { + sumlo = (sumlo * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + sumhi = (sumhi * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> + PNG_COST_SHIFT; + sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> + PNG_COST_SHIFT; + + if (sumhi > PNG_HIMASK) + sum = PNG_MAXSUM; + else + sum = (sumhi << PNG_HISHIFT) + sumlo; + } +#endif + + if (sum < mins) + { + mins = sum; + best_row = png_ptr->avg_row; + } + } + + /* Paeth filter */ + if (filter_to_do == PNG_FILTER_PAETH) + { + png_bytep rp, dp, pp, cp, lp; + png_uint_32 i; + for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, + pp = prev_row + 1; i < bpp; i++) + { + *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); + } + + for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++) + { + int a, b, c, pa, pb, pc, p; + + b = *pp++; + c = *cp++; + a = *lp++; + + p = b - c; + pc = a - c; + +#ifdef PNG_USE_ABS + pa = abs(p); + pb = abs(pc); + pc = abs(p + pc); +#else + pa = p < 0 ? -p : p; + pb = pc < 0 ? -pc : pc; + pc = (p + pc) < 0 ? -(p + pc) : p + pc; +#endif + + p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; + + *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); + } + best_row = png_ptr->paeth_row; + } + + else if (filter_to_do & PNG_FILTER_PAETH) + { + png_bytep rp, dp, pp, cp, lp; + png_uint_32 sum = 0, lmins = mins; + png_uint_32 i; + int v; + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 lmhi, lmlo; + lmlo = lmins & PNG_LOMASK; + lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) + { + lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> + PNG_COST_SHIFT; + lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> + PNG_COST_SHIFT; + + if (lmhi > PNG_HIMASK) + lmins = PNG_MAXSUM; + else + lmins = (lmhi << PNG_HISHIFT) + lmlo; + } +#endif + + for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, + pp = prev_row + 1; i < bpp; i++) + { + v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); + + sum += (v < 128) ? v : 256 - v; + } + + for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++) + { + int a, b, c, pa, pb, pc, p; + + b = *pp++; + c = *cp++; + a = *lp++; + +#ifndef PNG_SLOW_PAETH + p = b - c; + pc = a - c; +#ifdef PNG_USE_ABS + pa = abs(p); + pb = abs(pc); + pc = abs(p + pc); +#else + pa = p < 0 ? -p : p; + pb = pc < 0 ? -pc : pc; + pc = (p + pc) < 0 ? -(p + pc) : p + pc; +#endif + p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; +#else /* PNG_SLOW_PAETH */ + p = a + b - c; + pa = abs(p - a); + pb = abs(p - b); + pc = abs(p - c); + if (pa <= pb && pa <= pc) + p = a; + else if (pb <= pc) + p = b; + else + p = c; +#endif /* PNG_SLOW_PAETH */ + + v = *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); + + sum += (v < 128) ? v : 256 - v; + + if (sum > lmins) /* We are already worse, don't continue. */ + break; + } + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) + { + int j; + png_uint_32 sumhi, sumlo; + sumlo = sum & PNG_LOMASK; + sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; + + for (j = 0; j < num_p_filters; j++) + { + if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) + { + sumlo = (sumlo * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + sumhi = (sumhi * png_ptr->filter_weights[j]) >> + PNG_WEIGHT_SHIFT; + } + } + + sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> + PNG_COST_SHIFT; + sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> + PNG_COST_SHIFT; + + if (sumhi > PNG_HIMASK) + sum = PNG_MAXSUM; + else + sum = (sumhi << PNG_HISHIFT) + sumlo; + } +#endif + + if (sum < mins) + { + best_row = png_ptr->paeth_row; + } + } +#endif /* PNG_NO_WRITE_FILTER */ + /* Do the actual writing of the filtered row data from the chosen filter. */ + + png_write_filtered_row(png_ptr, best_row); + +#ifndef PNG_NO_WRITE_FILTER +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + /* Save the type of filter we picked this time for future calculations */ + if (png_ptr->num_prev_filters > 0) + { + int j; + for (j = 1; j < num_p_filters; j++) + { + png_ptr->prev_filters[j] = png_ptr->prev_filters[j - 1]; + } + png_ptr->prev_filters[j] = best_row[0]; + } +#endif +#endif /* PNG_NO_WRITE_FILTER */ +} + + +/* Do the actual writing of a previously filtered row. */ +void /* PRIVATE */ +png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row) +{ + png_debug(1, "in png_write_filtered_row"); + + png_debug1(2, "filter = %d", filtered_row[0]); + /* Set up the zlib input buffer */ + + png_ptr->zstream.next_in = filtered_row; + png_ptr->zstream.avail_in = (uInt)png_ptr->row_info.rowbytes + 1; + /* Repeat until we have compressed all the data */ + do + { + int ret; /* Return of zlib */ + + /* Compress the data */ + ret = deflate(&png_ptr->zstream, Z_NO_FLUSH); + /* Check for compression errors */ + if (ret != Z_OK) + { + if (png_ptr->zstream.msg != NULL) + png_error(png_ptr, png_ptr->zstream.msg); + else + png_error(png_ptr, "zlib error"); + } + + /* See if it is time to write another IDAT */ + if (!(png_ptr->zstream.avail_out)) + { + /* Write the IDAT and reset the zlib output buffer */ + png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size); + png_ptr->zstream.next_out = png_ptr->zbuf; + png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size; + } + /* Repeat until all data has been compressed */ + } while (png_ptr->zstream.avail_in); + + /* Swap the current and previous rows */ + if (png_ptr->prev_row != NULL) + { + png_bytep tptr; + + tptr = png_ptr->prev_row; + png_ptr->prev_row = png_ptr->row_buf; + png_ptr->row_buf = tptr; + } + + /* Finish row - updates counters and flushes zlib if last row */ + png_write_finish_row(png_ptr); + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) + png_ptr->flush_rows++; + + if (png_ptr->flush_dist > 0 && + png_ptr->flush_rows >= png_ptr->flush_dist) + { + png_write_flush(png_ptr); + } +#endif +} +#endif /* PNG_WRITE_SUPPORTED */ diff --git a/third_party/windows/fltk-1.1.10/src/CMakeLists.txt b/third_party/windows/fltk-1.1.10/src/CMakeLists.txt new file mode 100644 index 0000000..95cae3b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/CMakeLists.txt @@ -0,0 +1,208 @@ +SET(CPPFILES + Fl.cxx + Fl_Adjuster.cxx + Fl_Bitmap.cxx + Fl_Browser.cxx + Fl_Browser_.cxx + Fl_Browser_load.cxx + Fl_Box.cxx + Fl_Button.cxx + Fl_Chart.cxx + Fl_Check_Browser.cxx + Fl_Check_Button.cxx + Fl_Choice.cxx + Fl_Clock.cxx + Fl_Color_Chooser.cxx + Fl_Counter.cxx + Fl_Dial.cxx + Fl_Double_Window.cxx + Fl_File_Browser.cxx + Fl_File_Chooser.cxx + Fl_File_Chooser2.cxx + Fl_File_Icon.cxx + Fl_File_Input.cxx + Fl_Group.cxx + Fl_Help_View.cxx + Fl_Image.cxx + Fl_Input.cxx + Fl_Input_.cxx + Fl_Light_Button.cxx + Fl_Menu.cxx + Fl_Menu_.cxx + Fl_Menu_Bar.cxx + Fl_Sys_Menu_Bar.cxx + Fl_Menu_Button.cxx + Fl_Menu_Window.cxx + Fl_Menu_add.cxx + Fl_Menu_global.cxx + Fl_Multi_Label.cxx + Fl_Overlay_Window.cxx + Fl_Pack.cxx + Fl_Pixmap.cxx + Fl_Positioner.cxx + Fl_Preferences.cxx + Fl_Progress.cxx + Fl_Repeat_Button.cxx + Fl_Return_Button.cxx + Fl_Roller.cxx + Fl_Round_Button.cxx + Fl_Scroll.cxx + Fl_Scrollbar.cxx + Fl_Shared_Image.cxx + Fl_Single_Window.cxx + Fl_Slider.cxx + Fl_Tabs.cxx + Fl_Text_Buffer.cxx + Fl_Text_Display.cxx + Fl_Text_Editor.cxx + Fl_Tile.cxx + Fl_Tiled_Image.cxx + Fl_Tooltip.cxx + Fl_Valuator.cxx + Fl_Value_Input.cxx + Fl_Value_Output.cxx + Fl_Value_Slider.cxx + Fl_Widget.cxx + Fl_Window.cxx + Fl_Window_fullscreen.cxx + Fl_Window_hotspot.cxx + Fl_Window_iconize.cxx + Fl_Wizard.cxx + Fl_XBM_Image.cxx + Fl_XPM_Image.cxx + Fl_abort.cxx + Fl_add_idle.cxx + Fl_arg.cxx + Fl_compose.cxx + Fl_display.cxx + Fl_get_key.cxx + Fl_get_system_colors.cxx + Fl_grab.cxx + Fl_lock.cxx + Fl_own_colormap.cxx + Fl_visual.cxx + Fl_x.cxx + filename_absolute.cxx + filename_expand.cxx + filename_ext.cxx + filename_isdir.cxx + filename_list.cxx + filename_match.cxx + filename_setext.cxx + fl_arc.cxx + fl_arci.cxx + fl_ask.cxx + fl_boxtype.cxx + fl_color.cxx + fl_cursor.cxx + fl_curve.cxx + fl_diamond_box.cxx + fl_dnd.cxx + fl_draw.cxx + fl_draw_image.cxx + fl_draw_pixmap.cxx + fl_engraved_label.cxx + fl_file_dir.cxx + fl_font.cxx + fl_gtk.cxx + fl_labeltype.cxx + fl_line_style.cxx + fl_open_uri.cxx + fl_oval_box.cxx + fl_overlay.cxx + fl_overlay_visual.cxx + fl_plastic.cxx + fl_read_image.cxx + fl_rect.cxx + fl_round_box.cxx + fl_rounded_box.cxx + fl_set_font.cxx + fl_set_fonts.cxx + fl_scroll_area.cxx + fl_shadow_box.cxx + fl_shortcut.cxx + fl_show_colormap.cxx + fl_symbols.cxx + fl_vertex.cxx + screen_xywh.cxx + ) +SET(FLCPPFILES + forms_compatability.cxx + forms_bitmap.cxx + forms_free.cxx + forms_fselect.cxx + forms_pixmap.cxx + forms_timer.cxx + ) +SET(GLCPPFILES + Fl_Gl_Choice.cxx + Fl_Gl_Overlay.cxx + Fl_Gl_Window.cxx + freeglut_geometry.cxx + freeglut_stroke_mono_roman.cxx + freeglut_stroke_roman.cxx + freeglut_teapot.cxx + gl_draw.cxx + gl_start.cxx + glut_compatability.cxx + glut_font.cxx + ) +SET(IMGCPPFILES + fl_images_core.cxx + Fl_BMP_Image.cxx + Fl_File_Icon2.cxx + Fl_GIF_Image.cxx + Fl_Help_Dialog.cxx + Fl_JPEG_Image.cxx + Fl_PNG_Image.cxx + Fl_PNM_Image.cxx + ) + +SET(CFILES + fl_call_main.c + flstring.c + scandir.c + numericsort.c + vsnprintf.c + ) + +ADD_LIBRARY(fltk ${CPPFILES} ${CFILES}) +INSTALL_TARGETS(/lib fltk) +SET_TARGET_PROPERTIES(fltk + PROPERTIES + VERSION ${FLTK_VERSION_MAJOR}.${FLTK_VERSION_MINOR} + SOVERSION ${FLTK_VERSION_PATCH}) + +TARGET_LINK_LIBRARIES(fltk ${FLTK_PLATFORM_DEPENDENT_LIBS} ${CMAKE_THREAD_LIBS_INIT}) + +IF(X11_FOUND) + TARGET_LINK_LIBRARIES(fltk ${X11_LIBRARIES}) +ENDIF(X11_FOUND) + +IF(OPENGL_FOUND) + ADD_LIBRARY(fltk_gl ${GLCPPFILES}) + INSTALL_TARGETS(/lib fltk_gl) + TARGET_LINK_LIBRARIES(fltk_gl fltk ${OPENGL_LIBRARIES}) + SET_TARGET_PROPERTIES(fltk_gl + PROPERTIES + VERSION ${FLTK_VERSION_MAJOR}.${FLTK_VERSION_MINOR} + SOVERSION ${FLTK_VERSION_PATCH}) +ENDIF(OPENGL_FOUND) + +ADD_LIBRARY(fltk_forms ${FLCPPFILES}) +INSTALL_TARGETS(/lib fltk_forms) +TARGET_LINK_LIBRARIES(fltk_forms fltk) +SET_TARGET_PROPERTIES(fltk_forms + PROPERTIES + VERSION ${FLTK_VERSION_MAJOR}.${FLTK_VERSION_MINOR} + SOVERSION ${FLTK_VERSION_PATCH}) + +ADD_LIBRARY(fltk_images ${IMGCPPFILES}) +INSTALL_TARGETS(/lib fltk_images) +TARGET_LINK_LIBRARIES(fltk_images fltk ${FLTK_PNG_LIBRARIES} + ${FLTK_JPEG_LIBRARIES} ${FLTK_ZLIB_LIBRARIES}) +SET_TARGET_PROPERTIES(fltk_images + PROPERTIES + VERSION ${FLTK_VERSION_MAJOR}.${FLTK_VERSION_MINOR} + SOVERSION ${FLTK_VERSION_PATCH}) + diff --git a/third_party/windows/fltk-1.1.10/src/Fl.cxx b/third_party/windows/fltk-1.1.10/src/Fl.cxx new file mode 100644 index 0000000..63a9d8c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl.cxx @@ -0,0 +1,1311 @@ +// +// "$Id: Fl.cxx 6474 2008-10-19 20:15:48Z matt $" +// +// Main event handling code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// warning: the Apple Quartz version still uses some Quickdraw calls, +// mostly to get around the single active context in QD and +// to implement clipping. This should be changed into pure +// Quartz calls in the near future. + +#include +#include +#include +#include +#include +#include +#include +#include "flstring.h" + +#ifdef DEBUG +# include +#endif // DEBUG + +#ifdef WIN32 +# include +void fl_free_fonts(void); +HBRUSH fl_brush_action(int action); +void fl_cleanup_pens(void); +void fl_release_dc(HWND,HDC); +void fl_cleanup_dc_list(void); +#endif // WIN32 + +// +// Globals... +// + +Fl_Widget *Fl::belowmouse_, + *Fl::pushed_, + *Fl::focus_, + *Fl::selection_owner_; +int Fl::damage_, + Fl::e_number, + Fl::e_x, + Fl::e_y, + Fl::e_x_root, + Fl::e_y_root, + Fl::e_dx, + Fl::e_dy, + Fl::e_state, + Fl::e_clicks, + Fl::e_is_click, + Fl::e_keysym, + Fl::e_original_keysym; +char *Fl::e_text = (char *)""; +int Fl::e_length; +int Fl::visible_focus_ = 1, + Fl::dnd_text_ops_ = 1; + + +Fl_Window *fl_xfocus; // which window X thinks has focus +Fl_Window *fl_xmousewin;// which window X thinks has FL_ENTER +Fl_Window *Fl::grab_; // most recent Fl::grab() +Fl_Window *Fl::modal_; // topmost modal() window + +// +// 'Fl::version()' - Return the API version number... +// + +double +Fl::version() { + return FL_VERSION; +} + + +// +// 'Fl:event_inside()' - Return whether or not the mouse event is inside +// the given rectangle. +// + +int Fl::event_inside(int xx,int yy,int ww,int hh) /*const*/ { + int mx = e_x - xx; + int my = e_y - yy; + return (mx >= 0 && mx < ww && my >= 0 && my < hh); +} + +int Fl::event_inside(const Fl_Widget *o) /*const*/ { + int mx = e_x - o->x(); + int my = e_y - o->y(); + return (mx >= 0 && mx < o->w() && my >= 0 && my < o->h()); +} + +// +// +// timer support +// + +#ifdef WIN32 + +/// implementation in Fl_win32.cxx + +#elif defined(__APPLE__) + +/// implementation in Fl_mac.cxx + +#else + +// +// X11 timers +// + + +//////////////////////////////////////////////////////////////// +// Timeouts are stored in a sorted list, so only the first one needs +// to be checked to see if any should be called. + +struct Timeout { + double time; + void (*cb)(void*); + void* arg; + Timeout* next; +}; +static Timeout* first_timeout, *free_timeout; +static int first_timeout_count, free_timeout_count; + +#include + +// I avoid the overhead of getting the current time when we have no +// timeouts by setting this flag instead of getting the time. +// In this case calling elapse_timeouts() does nothing, but records +// the current time, and the next call will actualy elapse time. +static char reset_clock = 1; + +static void elapse_timeouts() { + static struct timeval prevclock; + struct timeval newclock; + gettimeofday(&newclock, NULL); + double elapsed = newclock.tv_sec - prevclock.tv_sec + + (newclock.tv_usec - prevclock.tv_usec)/1000000.0; + prevclock.tv_sec = newclock.tv_sec; + prevclock.tv_usec = newclock.tv_usec; + if (reset_clock) { + reset_clock = 0; + } else if (elapsed > 0) { + for (Timeout* t = first_timeout; t; t = t->next) t->time -= elapsed; + } +} + +// Continuously-adjusted error value, this is a number <= 0 for how late +// we were at calling the last timeout. This appears to make repeat_timeout +// very accurate even when processing takes a significant portion of the +// time interval: +static double missed_timeout_by; + +void Fl::add_timeout(double time, Fl_Timeout_Handler cb, void *argp) { + elapse_timeouts(); + repeat_timeout(time, cb, argp); +} + +void Fl::repeat_timeout(double time, Fl_Timeout_Handler cb, void *argp) { + time += missed_timeout_by; if (time < -.05) time = 0; + Timeout* t = free_timeout; + if (t) { + free_timeout = t->next; + --free_timeout_count; + } else { + t = new Timeout; + } + t->time = time; + t->cb = cb; + t->arg = argp; + // insert-sort the new timeout: + Timeout** p = &first_timeout; + while (*p && (*p)->time <= time) p = &((*p)->next); + t->next = *p; + *p = t; +} + +int Fl::has_timeout(Fl_Timeout_Handler cb, void *argp) { + for (Timeout* t = first_timeout; t; t = t->next) + if (t->cb == cb && t->arg == argp) return 1; + return 0; +} + +void Fl::remove_timeout(Fl_Timeout_Handler cb, void *argp) { + // This version removes all matching timeouts, not just the first one. + // This may change in the future. + for (Timeout** p = &first_timeout; *p;) { + Timeout* t = *p; + if (t->cb == cb && (t->arg == argp || !argp)) { + *p = t->next; + t->next = free_timeout; + free_timeout = t; + } else { + p = &(t->next); + } + } +} + +#endif + +//////////////////////////////////////////////////////////////// +// Checks are just stored in a list. They are called in the reverse +// order that they were added (this may change in the future). +// This is a bit messy because I want to allow checks to be added, +// removed, and have wait() called from inside them, to do this +// next_check points at the next unprocessed one for the outermost +// call to Fl::wait(). + +struct Check { + void (*cb)(void*); + void* arg; + Check* next; +}; +static Check *first_check, *next_check, *free_check; + +void Fl::add_check(Fl_Timeout_Handler cb, void *argp) { + Check* t = free_check; + if (t) free_check = t->next; + else t = new Check; + t->cb = cb; + t->arg = argp; + t->next = first_check; + if (next_check == first_check) next_check = t; + first_check = t; +} + +void Fl::remove_check(Fl_Timeout_Handler cb, void *argp) { + for (Check** p = &first_check; *p;) { + Check* t = *p; + if (t->cb == cb && t->arg == argp) { + if (next_check == t) next_check = t->next; + *p = t->next; + t->next = free_check; + free_check = t; + } else { + p = &(t->next); + } + } +} + +/** + * Return 1, if a check with the same handler and data pointer + * is pending, 0 otherwise. + */ +int Fl::has_check(Fl_Timeout_Handler cb, void *argp) { + for (Check** p = &first_check; *p;) { + Check* t = *p; + if (t->cb == cb && t->arg == argp) { + return 1; + } else { + p = &(t->next); + } + } + return 0; +} + +static void run_checks() +{ + // checks are a bit messy so that add/remove and wait may be called + // from inside them without causing an infinite loop: + if (next_check == first_check) { + while (next_check) { + Check* checkp = next_check; + next_check = checkp->next; + (checkp->cb)(checkp->arg); + } + next_check = first_check; + } +} + +#ifndef WIN32 +static char in_idle; +#endif + +//////////////////////////////////////////////////////////////// +// wait/run/check/ready: + +void (*Fl::idle)(); // see Fl_add_idle.cxx for the add/remove functions + +extern int fl_ready(); // in Fl_.cxx +extern int fl_wait(double time); // in Fl_.cxx + +double Fl::wait(double time_to_wait) { + // delete all widgets that were listed during callbacks + do_widget_deletion(); + +#ifdef WIN32 + + return fl_wait(time_to_wait); + +#elif defined(__APPLE__) + + run_checks(); + if (idle) { + if (!in_idle) { + in_idle = 1; + idle(); + in_idle = 0; + } + // the idle function may turn off idle, we can then wait: + if (idle) time_to_wait = 0.0; + } + flush(); + if (idle && !in_idle) // 'idle' may have been set within flush() + time_to_wait = 0.0; + return fl_wait(time_to_wait); + +#else + + if (first_timeout) { + elapse_timeouts(); + Timeout *t; + while ((t = first_timeout)) { + if (t->time > 0) break; + // The first timeout in the array has expired. + missed_timeout_by = t->time; + // We must remove timeout from array before doing the callback: + void (*cb)(void*) = t->cb; + void *argp = t->arg; + first_timeout = t->next; + t->next = free_timeout; + free_timeout = t; + ++free_timeout_count; + --first_timeout_count; + // Now it is safe for the callback to do add_timeout: + cb(argp); + } + } else { + reset_clock = 1; // we are not going to check the clock + } + run_checks(); +// if (idle && !fl_ready()) { + if (idle) { + if (!in_idle) { + in_idle = 1; + idle(); + in_idle = 0; + } + // the idle function may turn off idle, we can then wait: + if (idle) time_to_wait = 0.0; + } + if (first_timeout && first_timeout->time < time_to_wait) + time_to_wait = first_timeout->time; + if (time_to_wait <= 0.0) { + // do flush second so that the results of events are visible: + int ret = fl_wait(0.0); + flush(); + return ret; + } else { + // do flush first so that user sees the display: + flush(); + if (idle && !in_idle) // 'idle' may have been set within flush() + time_to_wait = 0.0; + return fl_wait(time_to_wait); + } +#endif +} + +#define FOREVER 1e20 + +int Fl::run() { + while (Fl_X::first) wait(FOREVER); + return 0; +} + +#ifdef WIN32 +class Fl_Win32_At_Exit { +public: + Fl_Win32_At_Exit() { } + ~Fl_Win32_At_Exit() { + fl_free_fonts(); // do some WIN32 cleanup + fl_cleanup_pens(); + OleUninitialize(); + fl_brush_action(1); + fl_cleanup_dc_list(); + } +}; +static Fl_Win32_At_Exit win32_at_exit; +#endif + + + +int Fl::wait() { + if (!Fl_X::first) return 0; + wait(FOREVER); + return Fl_X::first != 0; // return true if there is a window +} + +int Fl::check() { + wait(0.0); + return Fl_X::first != 0; // return true if there is a window +} + +int Fl::ready() { +#if ! defined( WIN32 ) && ! defined(__APPLE__) + if (first_timeout) { + elapse_timeouts(); + if (first_timeout->time <= 0) return 1; + } else { + reset_clock = 1; + } +#endif + return fl_ready(); +} + +//////////////////////////////////////////////////////////////// +// Window list management: + +Fl_X* Fl_X::first; + +Fl_Window* fl_find(Window xid) { + Fl_X *window; + for (Fl_X **pp = &Fl_X::first; (window = *pp); pp = &window->next) +#ifdef __APPLE_QD__ + if (window->xid == xid && !window->w->window()) { +#elif defined(__APPLE_QUARTZ__) + if (window->xid == xid && !window->w->window()) { +#else + if (window->xid == xid) { +#endif // __APPLE__ + if (window != Fl_X::first && !Fl::modal()) { + // make this window be first to speed up searches + // this is not done if modal is true to avoid messing up modal stack + *pp = window->next; + window->next = Fl_X::first; + Fl_X::first = window; + } + return window->w; + } + return 0; +} + +Fl_Window* Fl::first_window() { + Fl_X* i = Fl_X::first; + return i ? i->w : 0; +} + +Fl_Window* Fl::next_window(const Fl_Window* window) { + Fl_X* i = Fl_X::i(window)->next; + return i ? i->w : 0; +} + +void Fl::first_window(Fl_Window* window) { + if (!window || !window->shown()) return; + fl_find(fl_xid(window)); +} + +void Fl::redraw() { + for (Fl_X* i = Fl_X::first; i; i = i->next) i->w->redraw(); +} + +void Fl::flush() { + if (damage()) { + damage_ = 0; + for (Fl_X* i = Fl_X::first; i; i = i->next) { + if (i->wait_for_expose) {damage_ = 1; continue;} + Fl_Window* wi = i->w; + if (!wi->visible_r()) continue; + if (wi->damage()) {i->flush(); wi->clear_damage();} + // destroy damage regions for windows that don't use them: + if (i->region) {XDestroyRegion(i->region); i->region = 0;} + } + } + +#ifdef WIN32 + GdiFlush(); +#elif defined(__APPLE_QD__) + GrafPtr port; + GetPort( &port ); + if ( port ) + QDFlushPortBuffer( port, 0 ); +#elif defined (__APPLE_QUARTZ__) + if (fl_gc) + CGContextFlush(fl_gc); +#else + if (fl_display) XFlush(fl_display); +#endif +} + +//////////////////////////////////////////////////////////////// +// Event handlers: + +struct handler_link { + int (*handle)(int); + handler_link *next; +}; + +static handler_link *handlers = 0; + +void Fl::add_handler(int (*ha)(int)) { + handler_link *l = new handler_link; + l->handle = ha; + l->next = handlers; + handlers = l; +} + +void Fl::remove_handler(int (*ha)(int)) { + handler_link *l, *p; + + // Search for the handler in the list... + for (l = handlers, p = 0; l && l->handle != ha; p = l, l = l->next); + + if (l) { + // Found it, so remove it from the list... + if (p) p->next = l->next; + else handlers = l->next; + + // And free the record... + delete l; + } +} + +int (*fl_local_grab)(int); // used by fl_dnd.cxx + +static int send_handlers(int e) { + for (const handler_link *hl = handlers; hl; hl = hl->next) + if (hl->handle(e)) return 1; + return 0; +} + +//////////////////////////////////////////////////////////////// + +Fl_Widget* fl_oldfocus; // kludge for Fl_Group... + +void Fl::focus(Fl_Widget *o) { + if (o && !o->visible_focus()) return; + if (grab()) return; // don't do anything while grab is on + Fl_Widget *p = focus_; + if (o != p) { + Fl::compose_reset(); + focus_ = o; + // make sure that fl_xfocus is set to the top level window + // of this widget, or fl_fix_focus will clear our focus again + if (o) { + Fl_Window *win = 0, *w1 = o->window(); + while (w1) { win=w1; w1=win->window(); } + if (win) fl_xfocus = win; + } + // take focus from the old focused window + fl_oldfocus = 0; + int old_event = e_number; + e_number = FL_UNFOCUS; + for (; p; p = p->parent()) { + p->handle(FL_UNFOCUS); + fl_oldfocus = p; + } + e_number = old_event; + } +} + +static char dnd_flag = 0; // make 'belowmouse' send DND_LEAVE instead of LEAVE + +void Fl::belowmouse(Fl_Widget *o) { + if (grab()) return; // don't do anything while grab is on + Fl_Widget *p = belowmouse_; + if (o != p) { + belowmouse_ = o; + int old_event = e_number; + e_number = dnd_flag ? FL_DND_LEAVE : FL_LEAVE; + for (; p && !p->contains(o); p = p->parent()) { + p->handle(e_number); + } + e_number = old_event; + } +} + +void Fl::pushed(Fl_Widget *o) { + pushed_ = o; +} + +static void nothing(Fl_Widget *) {} +void (*Fl_Tooltip::enter)(Fl_Widget *) = nothing; +void (*Fl_Tooltip::exit)(Fl_Widget *) = nothing; + +// Update modal(), focus() and other state according to system state, +// and send FL_ENTER, FL_LEAVE, FL_FOCUS, and/or FL_UNFOCUS events. +// This is the only function that produces these events in response +// to system activity. +// This is called whenever a window is added or hidden, and whenever +// X says the focus or mouse window have changed. + +void fl_fix_focus() { +#ifdef DEBUG + puts("fl_fix_focus();"); +#endif // DEBUG + + if (Fl::grab()) return; // don't do anything while grab is on. + + // set focus based on Fl::modal() and fl_xfocus + Fl_Widget* w = fl_xfocus; + if (w) { + int saved = Fl::e_keysym; + if (Fl::e_keysym < (FL_Button + FL_LEFT_MOUSE) || + Fl::e_keysym > (FL_Button + FL_RIGHT_MOUSE)) + Fl::e_keysym = 0; // make sure widgets don't think a keystroke moved focus + while (w->parent()) w = w->parent(); + if (Fl::modal()) w = Fl::modal(); + if (!w->contains(Fl::focus())) + if (!w->take_focus()) Fl::focus(w); + Fl::e_keysym = saved; + } else + Fl::focus(0); + +// MRS: Originally we checked the button state, but a user reported that it +// broke click-to-focus in FLWM?!? +// if (!(Fl::event_state() & 0x7f00000 /*FL_BUTTONS*/)) { + if (!Fl::pushed()) { + // set belowmouse based on Fl::modal() and fl_xmousewin: + w = fl_xmousewin; + if (w) { + if (Fl::modal()) w = Fl::modal(); + if (!w->contains(Fl::belowmouse())) { + int old_event = Fl::e_number; + w->handle(Fl::e_number = FL_ENTER); + Fl::e_number = old_event; + if (!w->contains(Fl::belowmouse())) Fl::belowmouse(w); + } else { + // send a FL_MOVE event so the enter/leave state is up to date + Fl::e_x = Fl::e_x_root-fl_xmousewin->x(); + Fl::e_y = Fl::e_y_root-fl_xmousewin->y(); + int old_event = Fl::e_number; + w->handle(Fl::e_number = FL_MOVE); + Fl::e_number = old_event; + } + } else { + Fl::belowmouse(0); + Fl_Tooltip::enter(0); + } + } +} + +#ifndef WIN32 +extern Fl_Widget *fl_selection_requestor; // from Fl_x.cxx +#endif + +// This function is called by ~Fl_Widget() and by Fl_Widget::deactivate +// and by Fl_Widget::hide(). It indicates that the widget does not want +// to receive any more events, and also removes all global variables that +// point at the widget. +// I changed this from the 1.0.1 behavior, the older version could send +// FL_LEAVE or FL_UNFOCUS events to the widget. This appears to not be +// desirable behavior and caused flwm to crash. + +void fl_throw_focus(Fl_Widget *o) { +#ifdef DEBUG + printf("fl_throw_focus(o=%p)\n", o); +#endif // DEBUG + + if (o->contains(Fl::pushed())) Fl::pushed_ = 0; +#ifndef WIN32 + if (o->contains(fl_selection_requestor)) fl_selection_requestor = 0; +#endif + if (o->contains(Fl::belowmouse())) Fl::belowmouse_ = 0; + if (o->contains(Fl::focus())) Fl::focus_ = 0; + if (o == fl_xfocus) fl_xfocus = 0; + if (o == Fl_Tooltip::current()) Fl_Tooltip::current(0); + if (o == fl_xmousewin) fl_xmousewin = 0; + Fl_Tooltip::exit(o); + fl_fix_focus(); +} + +//////////////////////////////////////////////////////////////// + +// Call to->handle but first replace the mouse x/y with the correct +// values to account for nested X windows. 'window' is the outermost +// window the event was posted to by X: +static int send(int event, Fl_Widget* to, Fl_Window* window) { + int dx, dy; + int old_event = Fl::e_number; + if (window) { + dx = window->x(); + dy = window->y(); + } else { + dx = dy = 0; + } + for (const Fl_Widget* w = to; w; w = w->parent()) + if (w->type()>=FL_WINDOW) {dx -= w->x(); dy -= w->y();} + int save_x = Fl::e_x; Fl::e_x += dx; + int save_y = Fl::e_y; Fl::e_y += dy; + int ret = to->handle(Fl::e_number = event); + Fl::e_number = old_event; + Fl::e_y = save_y; + Fl::e_x = save_x; + return ret; +} + +int Fl::handle(int e, Fl_Window* window) +{ + e_number = e; + if (fl_local_grab) return fl_local_grab(e); + + Fl_Widget* wi = window; + + switch (e) { + + case FL_CLOSE: + if (grab() || modal() && window != modal()) return 0; + wi->do_callback(); + return 1; + + case FL_SHOW: + wi->show(); // this calls Fl_Widget::show(), not Fl_Window::show() + return 1; + + case FL_HIDE: + wi->hide(); // this calls Fl_Widget::hide(), not Fl_Window::hide() + return 1; + + case FL_PUSH: +#ifdef DEBUG + printf("Fl::handle(e=%d, window=%p);\n", e, window); +#endif // DEBUG + + if (grab()) wi = grab(); + else if (modal() && wi != modal()) return 0; + pushed_ = wi; + Fl_Tooltip::current(wi); + if (send(e, wi, window)) return 1; + // raise windows that are clicked on: + window->show(); + return 1; + + case FL_DND_ENTER: + case FL_DND_DRAG: + dnd_flag = 1; + break; + + case FL_DND_LEAVE: + dnd_flag = 1; + belowmouse(0); + dnd_flag = 0; + return 1; + + case FL_DND_RELEASE: + wi = belowmouse(); + break; + + case FL_MOVE: + case FL_DRAG: + fl_xmousewin = window; // this should already be set, but just in case. + if (pushed()) { + wi = pushed(); + if (grab()) wi = grab(); + e_number = e = FL_DRAG; + break; + } + if (modal() && wi != modal()) wi = 0; + if (grab()) wi = grab(); + {Fl_Widget* pbm = belowmouse(); + int ret = (wi && send(e, wi, window)); + if (pbm != belowmouse()) { +#ifdef DEBUG + printf("Fl::handle(e=%d, window=%p);\n", e, window); +#endif // DEBUG + Fl_Tooltip::enter(belowmouse()); + } + return ret;} + + case FL_RELEASE: { +// printf("FL_RELEASE: window=%p, pushed() = %p, grab() = %p, modal() = %p\n", +// window, pushed(), grab(), modal()); + + if (grab()) { + wi = grab(); + pushed_ = 0; // must be zero before callback is done! + } else if (pushed()) { + wi = pushed(); + pushed_ = 0; // must be zero before callback is done! + } else if (modal() && wi != modal()) return 0; + int r = send(e, wi, window); + fl_fix_focus(); + return r;} + + case FL_UNFOCUS: + window = 0; + case FL_FOCUS: + fl_xfocus = window; + fl_fix_focus(); + return 1; + + case FL_KEYUP: + // Send the key-up to the current focus. This is not + // always the same widget that received the corresponding + // FL_KEYBOARD event because focus may have changed. + // Sending the KEYUP to the right KEYDOWN is possible, but + // would require that we track the KEYDOWN for every possible + // key stroke (users may hold down multiple keys!) and then + // make sure that the widget still exists before sending + // a KEYUP there. I believe that the current solution is + // "close enough". + for (wi = grab() ? grab() : focus(); wi; wi = wi->parent()) + if (send(FL_KEYUP, wi, window)) return 1; + return 0; + + case FL_KEYBOARD: +#ifdef DEBUG + printf("Fl::handle(e=%d, window=%p);\n", e, window); +#endif // DEBUG + + Fl_Tooltip::enter((Fl_Widget*)0); + + fl_xfocus = window; // this should not happen! But maybe it does: + + // Try it as keystroke, sending it to focus and all parents: + for (wi = grab() ? grab() : focus(); wi; wi = wi->parent()) + if (send(FL_KEYBOARD, wi, window)) return 1; + + // recursive call to try shortcut: + if (handle(FL_SHORTCUT, window)) return 1; + + // and then try a shortcut with the case of the text swapped, by + // changing the text and falling through to FL_SHORTCUT case: + {unsigned char* c = (unsigned char*)event_text(); // cast away const + if (!isalpha(*c)) return 0; + *c = isupper(*c) ? tolower(*c) : toupper(*c);} + e_number = e = FL_SHORTCUT; + + case FL_SHORTCUT: + if (grab()) {wi = grab(); break;} // send it to grab window + + // Try it as shortcut, sending to mouse widget and all parents: + wi = belowmouse(); + if (!wi) { + wi = modal(); + if (!wi) wi = window; + } else if (wi->window() != first_window()) { + if (send(FL_SHORTCUT, first_window(), first_window())) return 1; + } + + for (; wi; wi = wi->parent()) { + if (send(FL_SHORTCUT, wi, wi->window())) return 1; + } + + // try using add_handle() functions: + if (send_handlers(FL_SHORTCUT)) return 1; + + // make Escape key close windows: + if (event_key()==FL_Escape) { + wi = modal(); if (!wi) wi = window; + wi->do_callback(); + return 1; + } + + return 0; + + case FL_ENTER: +#ifdef DEBUG + printf("Fl::handle(e=%d, window=%p);\n", e, window); +#endif // DEBUG + + fl_xmousewin = window; + fl_fix_focus(); + Fl_Tooltip::enter(belowmouse()); + return 1; + + case FL_LEAVE: +#ifdef DEBUG + printf("Fl::handle(e=%d, window=%p);\n", e, window); +#endif // DEBUG + + if (!pushed_) { + belowmouse(0); + Fl_Tooltip::enter(0); + } + if (window == fl_xmousewin) {fl_xmousewin = 0; fl_fix_focus();} + return 1; + + case FL_MOUSEWHEEL: + fl_xfocus = window; // this should not happen! But maybe it does: + + // Try sending it to the "grab" first + if (grab() && grab()!=modal() && grab()!=window) { + if (send(FL_MOUSEWHEEL, grab(), window)) return 1; + } + // Now try sending it to the "modal" window + if (modal()) { + send(FL_MOUSEWHEEL, modal(), window); + return 1; + } + // Finally try sending it to the window, the event occured in + if (send(FL_MOUSEWHEEL, window, window)) return 1; + default: + break; + } + if (wi && send(e, wi, window)) { + dnd_flag = 0; + return 1; + } + dnd_flag = 0; + return send_handlers(e); +} + +//////////////////////////////////////////////////////////////// +// hide() destroys the X window, it does not do unmap! + +#if !defined(WIN32) && USE_XFT +extern void fl_destroy_xft_draw(Window); +#endif + +void Fl_Window::hide() { + clear_visible(); + + if (!shown()) return; + + // remove from the list of windows: + Fl_X* ip = i; + Fl_X** pp = &Fl_X::first; + for (; *pp != ip; pp = &(*pp)->next) if (!*pp) return; + *pp = ip->next; +#ifdef __APPLE__ + MacUnlinkWindow(ip); + // MacOS X manages a single pointer per application. Make sure that hiding + // a toplevel window will not leave us with some random pointer shape, or + // worst case, an invisible pointer + if (!parent()) cursor(FL_CURSOR_DEFAULT); +#endif + i = 0; + + // recursively remove any subwindows: + for (Fl_X *wi = Fl_X::first; wi;) { + Fl_Window* W = wi->w; + if (W->window() == this) { + W->hide(); + W->set_visible(); + wi = Fl_X::first; + } else wi = wi->next; + } + + if (this == Fl::modal_) { // we are closing the modal window, find next one: + Fl_Window* W; + for (W = Fl::first_window(); W; W = Fl::next_window(W)) + if (W->modal()) break; + Fl::modal_ = W; + } + + // Make sure no events are sent to this window: + fl_throw_focus(this); + handle(FL_HIDE); + +#ifdef WIN32 + // this little trick keeps the current clipboard alive, even if we are about + // to destroy the window that owns the selection. + if (GetClipboardOwner()==ip->xid) { + Fl_Window *w1 = Fl::first_window(); + if (w1 && OpenClipboard(fl_xid(w1))) { + EmptyClipboard(); + SetClipboardData(CF_TEXT, NULL); + CloseClipboard(); + } + } + // Send a message to myself so that I'll get out of the event loop... + PostMessage(ip->xid, WM_APP, 0, 0); + if (ip->private_dc) fl_release_dc(ip->xid, ip->private_dc); + if (ip->xid == fl_window && fl_gc) { + fl_release_dc(fl_window, fl_gc); + fl_window = (HWND)-1; + fl_gc = 0; + } +#elif defined(__APPLE_QD__) + if ( ip->xid == fl_window && !parent() ) + fl_window = 0; +#elif defined(__APPLE_QUARTZ__) + Fl_X::q_release_context(ip); + if ( ip->xid == fl_window && !parent() ) + fl_window = 0; +#endif + + if (ip->region) XDestroyRegion(ip->region); + +#ifdef WIN32 + // this little trickery seems to avoid the popup window stacking problem + HWND p = GetForegroundWindow(); + if (p==GetParent(ip->xid)) { + ShowWindow(ip->xid, SW_HIDE); + ShowWindow(p, SW_SHOWNA); + } + XDestroyWindow(fl_display, ip->xid); +#elif defined(__APPLE_QD__) + MacDestroyWindow(this, ip->xid); +#elif defined(__APPLE_QUARTZ__) + MacDestroyWindow(this, ip->xid); +#else +# if USE_XFT + fl_destroy_xft_draw(ip->xid); +# endif + XDestroyWindow(fl_display, ip->xid); +#endif + +#ifdef WIN32 + // Try to stop the annoying "raise another program" behavior + if (non_modal() && Fl::first_window() && Fl::first_window()->shown()) + Fl::first_window()->show(); +#endif + delete ip; +} + +Fl_Window::~Fl_Window() { + hide(); +} + +// FL_SHOW and FL_HIDE are called whenever the visibility of this widget +// or any parent changes. We must correctly map/unmap the system's window. + +// For top-level windows it is assummed the window has already been +// mapped or unmapped!!! This is because this should only happen when +// Fl_Window::show() or Fl_Window::hide() is called, or in response to +// iconize/deiconize events from the system. + +int Fl_Window::handle(int ev) +{ + if (parent()) { + switch (ev) { + case FL_SHOW: + if (!shown()) show(); + else { +#ifdef __APPLE_QD__ + MacMapWindow(this, fl_xid(this)); +#elif defined(__APPLE_QUARTZ__) + MacMapWindow(this, fl_xid(this)); +#else + XMapWindow(fl_display, fl_xid(this)); // extra map calls are harmless +#endif // __APPLE__ + } + break; + case FL_HIDE: + if (shown()) { + // Find what really turned invisible, if is was a parent window + // we do nothing. We need to avoid unnecessary unmap calls + // because they cause the display to blink when the parent is + // remapped. However if this or any intermediate non-window + // widget has really had hide() called directly on it, we must + // unmap because when the parent window is remapped we don't + // want to reappear. + if (visible()) { + Fl_Widget* p = parent(); for (;p->visible();p = p->parent()) {} + if (p->type() >= FL_WINDOW) break; // don't do the unmap + } +#ifdef __APPLE_QD__ + MacUnmapWindow(this, fl_xid(this)); +#elif defined(__APPLE_QUARTZ__) + MacUnmapWindow(this, fl_xid(this)); +#else + XUnmapWindow(fl_display, fl_xid(this)); +#endif // __APPLE__ + } + break; + } +// } else if (ev == FL_FOCUS || ev == FL_UNFOCUS) { +// Fl_Tooltip::exit(Fl_Tooltip::current()); + } + + return Fl_Group::handle(ev); +} + +//////////////////////////////////////////////////////////////// +// Back compatability cut & paste functions for fltk 1.1 only: + +void Fl::selection_owner(Fl_Widget *owner) {selection_owner_ = owner;} + +void Fl::selection(Fl_Widget &owner, const char* text, int len) { + selection_owner_ = &owner; + Fl::copy(text, len, 0); +} + +void Fl::paste(Fl_Widget &receiver) { + Fl::paste(receiver, 0); +} + +//////////////////////////////////////////////////////////////// + +#include + +void Fl_Widget::redraw() { + damage(FL_DAMAGE_ALL); +} + +void Fl_Widget::redraw_label() { + if (window()) { + if (box() == FL_NO_BOX) { + // Widgets with the FL_NO_BOX boxtype need a parent to + // redraw, since it is responsible for redrawing the + // background... + int X = x() > 0 ? x() - 1 : 0; + int Y = y() > 0 ? y() - 1 : 0; + window()->damage(FL_DAMAGE_ALL, X, Y, w() + 2, h() + 2); + } + + if (align() && !(align() & FL_ALIGN_INSIDE) && window()->shown()) { + // If the label is not inside the widget, compute the location of + // the label and redraw the window within that bounding box... + int W = 0, H = 0; + label_.measure(W, H); + W += 5; // Add a little to the size of the label to cover overflow + H += 5; + + if (align() & FL_ALIGN_BOTTOM) { + window()->damage(FL_DAMAGE_EXPOSE, x(), y() + h(), w(), H); + } else if (align() & FL_ALIGN_TOP) { + window()->damage(FL_DAMAGE_EXPOSE, x(), y() - H, w(), H); + } else if (align() & FL_ALIGN_LEFT) { + window()->damage(FL_DAMAGE_EXPOSE, x() - W, y(), W, h()); + } else if (align() & FL_ALIGN_RIGHT) { + window()->damage(FL_DAMAGE_EXPOSE, x() + w(), y(), W, h()); + } else { + window()->damage(FL_DAMAGE_ALL); + } + } else { + // The label is inside the widget, so just redraw the widget itself... + damage(FL_DAMAGE_ALL); + } + } +} + +void Fl_Widget::damage(uchar fl) { + if (type() < FL_WINDOW) { + // damage only the rectangle covered by a child widget: + damage(fl, x(), y(), w(), h()); + } else { + // damage entire window by deleting the region: + Fl_X* i = Fl_X::i((Fl_Window*)this); + if (!i) return; // window not mapped, so ignore it + if (i->region) {XDestroyRegion(i->region); i->region = 0;} + damage_ |= fl; + Fl::damage(FL_DAMAGE_CHILD); + } +} + +void Fl_Widget::damage(uchar fl, int X, int Y, int W, int H) { + Fl_Widget* wi = this; + // mark all parent widgets between this and window with FL_DAMAGE_CHILD: + while (wi->type() < FL_WINDOW) { + wi->damage_ |= fl; + wi = wi->parent(); + if (!wi) return; + fl = FL_DAMAGE_CHILD; + } + Fl_X* i = Fl_X::i((Fl_Window*)wi); + if (!i) return; // window not mapped, so ignore it + + // clip the damage to the window and quit if none: + if (X < 0) {W += X; X = 0;} + if (Y < 0) {H += Y; Y = 0;} + if (W > wi->w()-X) W = wi->w()-X; + if (H > wi->h()-Y) H = wi->h()-Y; + if (W <= 0 || H <= 0) return; + + if (!X && !Y && W==wi->w() && H==wi->h()) { + // if damage covers entire window delete region: + wi->damage(fl); + return; + } + + if (wi->damage()) { + // if we already have damage we must merge with existing region: + if (i->region) { +#ifdef WIN32 + Fl_Region R = XRectangleRegion(X, Y, W, H); + CombineRgn(i->region, i->region, R, RGN_OR); + XDestroyRegion(R); +#elif defined(__APPLE_QD__) + Fl_Region R = NewRgn(); + SetRectRgn(R, X, Y, X+W, Y+H); + UnionRgn(R, i->region, i->region); + DisposeRgn(R); +#elif defined(__APPLE_QUARTZ__) + Fl_Region R = NewRgn(); + SetRectRgn(R, X, Y, X+W, Y+H); + UnionRgn(R, i->region, i->region); + DisposeRgn(R); +#else + XRectangle R; + R.x = X; R.y = Y; R.width = W; R.height = H; + XUnionRectWithRegion(&R, i->region, i->region); +#endif + } + wi->damage_ |= fl; + } else { + // create a new region: + if (i->region) XDestroyRegion(i->region); + i->region = XRectangleRegion(X,Y,W,H); + wi->damage_ = fl; + } + Fl::damage(FL_DAMAGE_CHILD); +} + +void Fl_Window::flush() { + make_current(); +//if (damage() == FL_DAMAGE_EXPOSE && can_boxcheat(box())) fl_boxcheat = this; + fl_clip_region(i->region); i->region = 0; + draw(); +} + +#ifdef WIN32 +# include "Fl_win32.cxx" +#elif defined(__APPLE__) +# include "Fl_mac.cxx" +#endif + +// +// The following methods allow callbacks to schedule the deletion of +// widgets at "safe" times. +// + +static int num_dwidgets = 0, alloc_dwidgets = 0; +static Fl_Widget **dwidgets = 0; + +void +Fl::delete_widget(Fl_Widget *wi) { + if (!wi) return; + + if (num_dwidgets >= alloc_dwidgets) { + Fl_Widget **temp; + + temp = new Fl_Widget *[alloc_dwidgets + 10]; + if (alloc_dwidgets) { + memcpy(temp, dwidgets, alloc_dwidgets * sizeof(Fl_Widget *)); + delete[] dwidgets; + } + + dwidgets = temp; + alloc_dwidgets += 10; + } + + dwidgets[num_dwidgets] = wi; + num_dwidgets ++; +} + + +void +Fl::do_widget_deletion() { + if (!num_dwidgets) return; + + for (int i = 0; i < num_dwidgets; i ++) + delete dwidgets[i]; + + num_dwidgets = 0; +} + +static Fl_Widget ***widget_watch = 0; +static int num_widget_watch = 0; +static int max_widget_watch = 0; + +void Fl::watch_widget_pointer(Fl_Widget *&w) +{ + Fl_Widget **wp = &w; + int i; + for (i=0; i +#include +#include +#include + +#include "fastarrow.h" +static Fl_Bitmap fastarrow(fastarrow_bits, fastarrow_width, fastarrow_height); +#include "mediumarrow.h" +static Fl_Bitmap mediumarrow(mediumarrow_bits, mediumarrow_width, mediumarrow_height); +#include "slowarrow.h" +static Fl_Bitmap slowarrow(slowarrow_bits, slowarrow_width, slowarrow_height); + +// changing the value does not change the appearance: +void Fl_Adjuster::value_damage() {} + +void Fl_Adjuster::draw() { + int dx, dy, W, H; + if (w()>=h()) { + dx = W = w()/3; + dy = 0; H = h(); + } else { + dx = 0; W = w(); + dy = H = h()/3; + } + draw_box(drag==1?FL_DOWN_BOX:box(), x(), y()+2*dy, W, H, color()); + draw_box(drag==2?FL_DOWN_BOX:box(), x()+dx, y()+dy, W, H, color()); + draw_box(drag==3?FL_DOWN_BOX:box(), x()+2*dx, y(), W, H, color()); + if (active_r()) + fl_color(selection_color()); + else + fl_color(fl_inactive(selection_color())); + fastarrow.draw(x()+(W-fastarrow_width)/2, + y()+2*dy+(H-fastarrow_height)/2, W, H); + mediumarrow.draw(x()+dx+(W-mediumarrow_width)/2, + y()+dy+(H-mediumarrow_height)/2, W, H); + slowarrow.draw(x()+2*dx+(W-slowarrow_width)/2, + y()+(H-slowarrow_width)/2, W, H); + if (Fl::focus() == this) draw_focus(); +} + +int Fl_Adjuster::handle(int event) { + double v; + int delta; + int mx = Fl::event_x(); + switch (event) { + case FL_PUSH: + if (Fl::visible_focus()) Fl::focus(this); + ix = mx; + if (w()>=h()) + drag = 3*(mx-x())/w() + 1; + else + drag = 3-3*(Fl::event_y()-y()-1)/h(); + handle_push(); + redraw(); + return 1; + case FL_DRAG: + if (w() >= h()) { + delta = x()+(drag-1)*w()/3; // left edge of button + if (mx < delta) + delta = mx-delta; + else if (mx > (delta+w()/3)) // right edge of button + delta = mx-delta-w()/3; + else + delta = 0; + } else { + if (mx < x()) + delta = mx-x(); + else if (mx > (x()+w())) + delta = mx-x()-w(); + else + delta = 0; + } + switch (drag) { + case 3: v = increment(previous_value(), delta); break; + case 2: v = increment(previous_value(), delta*10); break; + default:v = increment(previous_value(), delta*100); break; + } + handle_drag(soft() ? softclamp(v) : clamp(v)); + return 1; + case FL_RELEASE: + if (Fl::event_is_click()) { // detect click but no drag + if (Fl::event_state()&0xF0000) delta = -10; + else delta = 10; + switch (drag) { + case 3: v = increment(previous_value(), delta); break; + case 2: v = increment(previous_value(), delta*10); break; + default:v = increment(previous_value(), delta*100); break; + } + handle_drag(soft() ? softclamp(v) : clamp(v)); + } + drag = 0; + redraw(); + handle_release(); + return 1; + case FL_KEYBOARD : + switch (Fl::event_key()) { + case FL_Up: + if (w() > h()) return 0; + handle_drag(clamp(increment(value(),-1))); + return 1; + case FL_Down: + if (w() > h()) return 0; + handle_drag(clamp(increment(value(),1))); + return 1; + case FL_Left: + if (w() < h()) return 0; + handle_drag(clamp(increment(value(),-1))); + return 1; + case FL_Right: + if (w() < h()) return 0; + handle_drag(clamp(increment(value(),1))); + return 1; + default: + return 0; + } + // break not required because of switch... + + case FL_FOCUS: + case FL_UNFOCUS: + if (Fl::visible_focus()) { + redraw(); + return 1; + } else return 0; + + case FL_ENTER : + case FL_LEAVE : + return 1; + } + return 0; +} + +Fl_Adjuster::Fl_Adjuster(int X, int Y, int W, int H, const char* l) + : Fl_Valuator(X, Y, W, H, l) { + box(FL_UP_BOX); + step(1, 10000); + selection_color(FL_SELECTION_COLOR); + drag = 0; + soft_ = 1; +} + +// +// End of "$Id: Fl_Adjuster.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_BMP_Image.cxx b/third_party/windows/fltk-1.1.10/src/Fl_BMP_Image.cxx new file mode 100644 index 0000000..13537d3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_BMP_Image.cxx @@ -0,0 +1,493 @@ +// +// "$Id: Fl_BMP_Image.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Fl_BMP_Image routines. +// +// Copyright 1997-2005 by Easy Software Products. +// Image support donated by Matthias Melcher, Copyright 2000. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// Fl_BMP_Image::Fl_BMP_Image() - Load a BMP image file. +// + +// +// Include necessary header files... +// + +#include +#include +#include +#include + + +// +// BMP definitions... +// + +#ifndef BI_RGB +# define BI_RGB 0 // No compression - straight BGR data +# define BI_RLE8 1 // 8-bit run-length compression +# define BI_RLE4 2 // 4-bit run-length compression +# define BI_BITFIELDS 3 // RGB bitmap with RGB masks +#endif // !BI_RGB + + +// +// Local functions... +// + +static int read_long(FILE *fp); +static unsigned short read_word(FILE *fp); +static unsigned int read_dword(FILE *fp); + + +// +// 'Fl_BMP_Image::Fl_BMP_Image()' - Load a BMP image file. +// + +Fl_BMP_Image::Fl_BMP_Image(const char *bmp) // I - File to read + : Fl_RGB_Image(0,0,0) { + FILE *fp; // File pointer + int info_size, // Size of info header + depth, // Depth of image (bits) + bDepth = 3, // Depth of image (bytes) + compression, // Type of compression + colors_used, // Number of colors used + x, y, // Looping vars + color, // Color of RLE pixel + repcount, // Number of times to repeat + temp, // Temporary color + align, // Alignment bytes + dataSize, // number of bytes in image data set + row_order, // 1 = normal; -1 = flipped row order + start_y, // Beginning Y + end_y; // Ending Y + long offbits; // Offset to image data + uchar bit, // Bit in image + byte; // Byte in image + uchar *ptr; // Pointer into pixels + uchar colormap[256][3];// Colormap + uchar havemask; // Single bit mask follows image data + int use_5_6_5; // Use 5:6:5 for R:G:B channels in 16 bit images + + + // Open the file... + if ((fp = fopen(bmp, "rb")) == NULL) return; + + // Get the header... + byte = (uchar)getc(fp); // Check "BM" sync chars + bit = (uchar)getc(fp); + if (byte != 'B' || bit != 'M') { + fclose(fp); + return; + } + + read_dword(fp); // Skip size + read_word(fp); // Skip reserved stuff + read_word(fp); + offbits = (long)read_dword(fp);// Read offset to image data + + // Then the bitmap information... + info_size = read_dword(fp); + +// printf("offbits = %ld, info_size = %d\n", offbits, info_size); + + havemask = 0; + row_order = -1; + use_5_6_5 = 0; + + if (info_size < 40) { + // Old Windows/OS2 BMP header... + w(read_word(fp)); + h(read_word(fp)); + read_word(fp); + depth = read_word(fp); + compression = BI_RGB; + colors_used = 0; + + repcount = info_size - 12; + } else { + // New BMP header... + w(read_long(fp)); + // If the height is negative, the row order is flipped + temp = read_long(fp); + if (temp < 0) row_order = 1; + h(abs(temp)); + read_word(fp); + depth = read_word(fp); + compression = read_dword(fp); + dataSize = read_dword(fp); + read_long(fp); + read_long(fp); + colors_used = read_dword(fp); + read_dword(fp); + + repcount = info_size - 40; + + if (!compression && depth>=8 && w()>32/depth) { + int Bpp = depth/8; + int maskSize = (((w()*Bpp+3)&~3)*h()) + (((((w()+7)/8)+3)&~3)*h()); + if (maskSize==2*dataSize) { + havemask = 1; + h(h()/2); + bDepth = 4; + } + } + } + +// printf("w() = %d, h() = %d, depth = %d, compression = %d, colors_used = %d, repcount = %d\n", +// w(), h(), depth, compression, colors_used, repcount); + + // Skip remaining header bytes... + while (repcount > 0) { + getc(fp); + repcount --; + } + + // Check header data... + if (!w() || !h() || !depth) { + fclose(fp); + return; + } + + // Get colormap... + if (colors_used == 0 && depth <= 8) + colors_used = 1 << depth; + + for (repcount = 0; repcount < colors_used; repcount ++) { + // Read BGR color... + fread(colormap[repcount], 1, 3, fp); + + // Skip pad byte for new BMP files... + if (info_size > 12) getc(fp); + } + + // Read first dword of colormap. It tells us if 5:5:5 or 5:6:5 for 16 bit + if (depth == 16) + use_5_6_5 = (read_dword(fp) == 0xf800); + + // Set byte depth for RGBA images + if (depth == 32) + bDepth=4; + + // Setup image and buffers... + d(bDepth); + if (offbits) fseek(fp, offbits, SEEK_SET); + + array = new uchar[w() * h() * d()]; + alloc_array = 1; + + // Read the image data... + color = 0; + repcount = 0; + align = 0; + byte = 0; + temp = 0; + + if (row_order < 0) { + start_y = h() - 1; + end_y = -1; + } else { + start_y = 0; + end_y = h(); + } + + for (y = start_y; y != end_y; y += row_order) { + ptr = (uchar *)array + y * w() * d(); + + switch (depth) + { + case 1 : // Bitmap + for (x = w(), bit = 128; x > 0; x --) { + if (bit == 128) byte = (uchar)getc(fp); + + if (byte & bit) { + *ptr++ = colormap[1][2]; + *ptr++ = colormap[1][1]; + *ptr++ = colormap[1][0]; + } else { + *ptr++ = colormap[0][2]; + *ptr++ = colormap[0][1]; + *ptr++ = colormap[0][0]; + } + + if (bit > 1) + bit >>= 1; + else + bit = 128; + } + + // Read remaining bytes to align to 32 bits... + for (temp = (w() + 7) / 8; temp & 3; temp ++) { + getc(fp); + } + break; + + case 4 : // 16-color + for (x = w(), bit = 0xf0; x > 0; x --) { + // Get a new repcount as needed... + if (repcount == 0) { + if (compression != BI_RLE4) { + repcount = 2; + color = -1; + } else { + while (align > 0) { + align --; + getc(fp); + } + + if ((repcount = getc(fp)) == 0) { + if ((repcount = getc(fp)) == 0) { + // End of line... + x ++; + continue; + } else if (repcount == 1) { + // End of image... + break; + } else if (repcount == 2) { + // Delta... + repcount = getc(fp) * getc(fp) * w(); + color = 0; + } else { + // Absolute... + color = -1; + align = ((4 - (repcount & 3)) / 2) & 1; + } + } else { + color = getc(fp); + } + } + } + + // Get a new color as needed... + repcount --; + + // Extract the next pixel... + if (bit == 0xf0) { + // Get the next color byte as needed... + if (color < 0) temp = getc(fp); + else temp = color; + + // Copy the color value... + *ptr++ = colormap[(temp >> 4) & 15][2]; + *ptr++ = colormap[(temp >> 4) & 15][1]; + *ptr++ = colormap[(temp >> 4) & 15][0]; + + bit = 0x0f; + } else { + bit = 0xf0; + + // Copy the color value... + *ptr++ = colormap[temp & 15][2]; + *ptr++ = colormap[temp & 15][1]; + *ptr++ = colormap[temp & 15][0]; + } + + } + + if (!compression) { + // Read remaining bytes to align to 32 bits... + for (temp = (w() + 1) / 2; temp & 3; temp ++) { + getc(fp); + } + } + break; + + case 8 : // 256-color + for (x = w(); x > 0; x --) { + // Get a new repcount as needed... + if (compression != BI_RLE8) { + repcount = 1; + color = -1; + } + + if (repcount == 0) { + while (align > 0) { + align --; + getc(fp); + } + + if ((repcount = getc(fp)) == 0) { + if ((repcount = getc(fp)) == 0) { + // End of line... + x ++; + continue; + } else if (repcount == 1) { + // End of image... + break; + } else if (repcount == 2) { + // Delta... + repcount = getc(fp) * getc(fp) * w(); + color = 0; + } else { + // Absolute... + color = -1; + align = (2 - (repcount & 1)) & 1; + } + } else { + color = getc(fp); + } + } + + // Get a new color as needed... + if (color < 0) temp = getc(fp); + else temp = color; + + repcount --; + + // Copy the color value... + *ptr++ = colormap[temp][2]; + *ptr++ = colormap[temp][1]; + *ptr++ = colormap[temp][0]; + if (havemask) ptr++; + } + + if (!compression) { + // Read remaining bytes to align to 32 bits... + for (temp = w(); temp & 3; temp ++) { + getc(fp); + } + } + break; + + case 16 : // 16-bit 5:5:5 or 5:6:5 RGB + for (x = w(); x > 0; x --, ptr += bDepth) { + uchar b = getc(fp), a = getc(fp) ; + if (use_5_6_5) { + ptr[2] = (uchar)(( b << 3 ) & 0xf8); + ptr[1] = (uchar)(((a << 5) & 0xe0) | ((b >> 3) & 0x1c)); + ptr[0] = (uchar)(a & 0xf8); + } else { + ptr[2] = (uchar)((b << 3) & 0xf8); + ptr[1] = (uchar)(((a << 6) & 0xc0) | ((b >> 2) & 0x38)); + ptr[0] = (uchar)((a<<1) & 0xf8); + } + } + + // Read remaining bytes to align to 32 bits... + for (temp = w() * 2; temp & 3; temp ++) { + getc(fp); + } + break; + + case 24 : // 24-bit RGB + for (x = w(); x > 0; x --, ptr += bDepth) { + ptr[2] = (uchar)getc(fp); + ptr[1] = (uchar)getc(fp); + ptr[0] = (uchar)getc(fp); + } + + // Read remaining bytes to align to 32 bits... + for (temp = w() * 3; temp & 3; temp ++) { + getc(fp); + } + break; + + case 32 : // 32-bit RGBA + for (x = w(); x > 0; x --, ptr += bDepth) { + ptr[2] = (uchar)getc(fp); + ptr[1] = (uchar)getc(fp); + ptr[0] = (uchar)getc(fp); + ptr[3] = (uchar)getc(fp); + } + break; + } + } + + if (havemask) { + for (y = h() - 1; y >= 0; y --) { + ptr = (uchar *)array + y * w() * d() + 3; + for (x = w(), bit = 128; x > 0; x --, ptr+=bDepth) { + if (bit == 128) byte = (uchar)getc(fp); + if (byte & bit) + *ptr = 0; + else + *ptr = 255; + if (bit > 1) + bit >>= 1; + else + bit = 128; + } + // Read remaining bytes to align to 32 bits... + for (temp = (w() + 7) / 8; temp & 3; temp ++) + getc(fp); + } + } + + // Close the file and return... + fclose(fp); +} + + +// +// 'read_word()' - Read a 16-bit unsigned integer. +// + +static unsigned short // O - 16-bit unsigned integer +read_word(FILE *fp) { // I - File to read from + unsigned char b0, b1; // Bytes from file + + b0 = (uchar)getc(fp); + b1 = (uchar)getc(fp); + + return ((b1 << 8) | b0); +} + + +// +// 'read_dword()' - Read a 32-bit unsigned integer. +// + +static unsigned int // O - 32-bit unsigned integer +read_dword(FILE *fp) { // I - File to read from + unsigned char b0, b1, b2, b3; // Bytes from file + + b0 = (uchar)getc(fp); + b1 = (uchar)getc(fp); + b2 = (uchar)getc(fp); + b3 = (uchar)getc(fp); + + return ((((((b3 << 8) | b2) << 8) | b1) << 8) | b0); +} + + +// +// 'read_long()' - Read a 32-bit signed integer. +// + +static int // O - 32-bit signed integer +read_long(FILE *fp) { // I - File to read from + unsigned char b0, b1, b2, b3; // Bytes from file + + b0 = (uchar)getc(fp); + b1 = (uchar)getc(fp); + b2 = (uchar)getc(fp); + b3 = (uchar)getc(fp); + + return ((int)(((((b3 << 8) | b2) << 8) | b1) << 8) | b0); +} + + +// +// End of "$Id: Fl_BMP_Image.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Bitmap.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Bitmap.cxx new file mode 100644 index 0000000..09a67cb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Bitmap.cxx @@ -0,0 +1,518 @@ +// +// "$Id: Fl_Bitmap.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Bitmap drawing routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include "flstring.h" + +#ifdef __APPLE_QD__ // MacOS bitmask functions +Fl_Bitmask fl_create_bitmask(int w, int h, const uchar *array) { + Rect srcRect; + srcRect.left = 0; srcRect.right = w; + srcRect.top = 0; srcRect.bottom = h; + GrafPtr savePort; + + GetPort(&savePort); // remember the current port + + Fl_Bitmask gw; + NewGWorld( &gw, 1, &srcRect, 0L, 0L, 0 ); + PixMapHandle pm = GetGWorldPixMap( gw ); + if ( pm ) + { + LockPixels( pm ); + if ( *pm ) + { + uchar *base = (uchar*)GetPixBaseAddr( pm ); + if ( base ) + { + PixMapPtr pmp = *pm; + // verify the parameters for direct memory write + if ( pmp->pixelType == 0 || pmp->pixelSize == 1 || pmp->cmpCount == 1 || pmp->cmpSize == 1 ) + { + static uchar reverse[16] = /* Bit reversal lookup table */ + { 0x00, 0x88, 0x44, 0xcc, 0x22, 0xaa, 0x66, 0xee, 0x11, 0x99, 0x55, 0xdd, 0x33, 0xbb, 0x77, 0xff }; + uchar *dst = base; + const uchar *src = array; + int rowBytesSrc = (w+7)>>3 ; + int rowPatch = (pmp->rowBytes&0x3fff) - rowBytesSrc; + for ( int j=0; j> 4) & 0x0f] & 0x0f); + } + } + UnlockPixels( pm ); + } + } + + SetPort(savePort); + return gw; /* tell caller we succeeded! */ +} + +void fl_delete_bitmask(Fl_Bitmask id) { + if (id) DisposeGWorld(id); +} +#elif defined(__APPLE_QUARTZ__) +Fl_Bitmask fl_create_bitmask(int w, int h, const uchar *array) { + static uchar reverse[16] = /* Bit reversal lookup table */ + { 0x00, 0x88, 0x44, 0xcc, 0x22, 0xaa, 0x66, 0xee, + 0x11, 0x99, 0x55, 0xdd, 0x33, 0xbb, 0x77, 0xff }; + int rowBytes = (w+7)>>3 ; + uchar *bmask = (uchar*)malloc(rowBytes*h), *dst = bmask; + const uchar *src = array; + for ( int i=rowBytes*h; i>0; i--,src++ ) { + *dst++ = ((reverse[*src & 0x0f] & 0xf0) | (reverse[(*src >> 4) & 0x0f] & 0x0f))^0xff; + } + CGDataProviderRef srcp = CGDataProviderCreateWithData( 0L, bmask, rowBytes*h, 0L); + CGImageRef id = CGImageMaskCreate( w, h, 1, 1, rowBytes, srcp, 0L, false); + CGDataProviderRelease(srcp); + return (Fl_Bitmask)id; +} +void fl_delete_bitmask(Fl_Bitmask id) { + if (id) CGImageRelease((CGImageRef)id); +} +#elif defined(WIN32) // Windows bitmask functions... +// 'fl_create_bitmap()' - Create a 1-bit bitmap for drawing... +static Fl_Bitmask fl_create_bitmap(int w, int h, const uchar *data) { + // we need to pad the lines out to words & swap the bits + // in each byte. + int w1 = (w+7)/8; + int w2 = ((w+15)/16)*2; + uchar* newarray = new uchar[w2*h]; + const uchar* src = data; + uchar* dest = newarray; + Fl_Bitmask id; + static uchar reverse[16] = /* Bit reversal lookup table */ + { 0x00, 0x88, 0x44, 0xcc, 0x22, 0xaa, 0x66, 0xee, + 0x11, 0x99, 0x55, 0xdd, 0x33, 0xbb, 0x77, 0xff }; + + for (int y=0; y < h; y++) { + for (int n = 0; n < w1; n++, src++) + *dest++ = (uchar)((reverse[*src & 0x0f] & 0xf0) | + (reverse[(*src >> 4) & 0x0f] & 0x0f)); + dest += w2-w1; + } + + id = CreateBitmap(w, h, 1, 1, newarray); + + delete[] newarray; + + return id; +} + +// 'fl_create_bitmask()' - Create an N-bit bitmap for masking... +Fl_Bitmask fl_create_bitmask(int w, int h, const uchar *data) { + // this won't work when the user changes display mode during run or + // has two screens with differnet depths + Fl_Bitmask id; + static uchar hiNibble[16] = + { 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, + 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0 }; + static uchar loNibble[16] = + { 0x00, 0x08, 0x04, 0x0c, 0x02, 0x0a, 0x06, 0x0e, + 0x01, 0x09, 0x05, 0x0d, 0x03, 0x0b, 0x07, 0x0f }; + int np = GetDeviceCaps(fl_gc, PLANES); //: was always one on sample machines + int bpp = GetDeviceCaps(fl_gc, BITSPIXEL);//: 1,4,8,16,24,32 and more odd stuff? + int Bpr = (bpp*w+7)/8; //: bytes per row + int pad = Bpr&1, w1 = (w+7)/8, shr = ((w-1)&7)+1; + if (bpp==4) shr = (shr+1)/2; + uchar *newarray = new uchar[(Bpr+pad)*h]; + uchar *dst = newarray; + const uchar *src = data; + + for (int i=0; i0; j--) { + uchar b = *src++; + if (bpp==1) { + *dst++ = (uchar)( hiNibble[b&15] ) | ( loNibble[(b>>4)&15] ); + } else if (bpp==4) { + for (int k=(j==1)?shr:4; k>0; k--) { + *dst++ = (uchar)("\377\360\017\000"[b&3]); + b = b >> 2; + } + } else { + for (int k=(j==1)?shr:8; k>0; k--) { + if (b&1) { + *dst++=0; + if (bpp>8) *dst++=0; + if (bpp>16) *dst++=0; + if (bpp>24) *dst++=0; + } else { + *dst++=0xff; + if (bpp>8) *dst++=0xff; + if (bpp>16) *dst++=0xff; + if (bpp>24) *dst++=0xff; + } + + b = b >> 1; + } + } + } + + dst += pad; + } + + id = CreateBitmap(w, h, np, bpp, newarray); + delete[] newarray; + + return id; +} + +#if 0 // This doesn't appear to be used anywhere... +Fl_Bitmask fl_create_bitmask(int w, int h, const uchar *data, int for_mask) { + // we need to pad the lines out to words & swap the bits + // in each byte. + int w1 = (w+7)/8; + int w2 = ((w+15)/16)*2; + uchar* newarray = new uchar[w2*h]; + const uchar* src = data; + uchar* dest = newarray; + Fl_Bitmask id; + static uchar reverse[16] = /* Bit reversal lookup table */ + { 0x00, 0x88, 0x44, 0xcc, 0x22, 0xaa, 0x66, 0xee, + 0x11, 0x99, 0x55, 0xdd, 0x33, 0xbb, 0x77, 0xff }; + + for (int y=0; y < h; y++) { + for (int n = 0; n < w1; n++, src++) + *dest++ = (reverse[*src & 0x0f] & 0xf0) | + (reverse[(*src >> 4) & 0x0f] & 0x0f); + dest += w2-w1; + } + + id = CreateBitmap(w, h, 1, 1, newarray); + + delete[] newarray; + + return (id); +} +# endif // 0 + +void fl_delete_bitmask(Fl_Bitmask bm) { + DeleteObject((HGDIOBJ)bm); +} +#else // X11 bitmask functions +Fl_Bitmask fl_create_bitmask(int w, int h, const uchar *data) { + return XCreateBitmapFromData(fl_display, fl_window, (const char *)data, + (w+7)&-8, h); +} + +void fl_delete_bitmask(Fl_Bitmask bm) { + fl_delete_offscreen((Fl_Offscreen)bm); +} +#endif // __APPLE__ + + +// MRS: Currently it appears that CopyDeepMask() does not work with an 8-bit alpha mask. +// If you want to test/fix this, uncomment the "#ifdef __APPLE__" and comment out +// the "#if 0" here. Also see Fl_Image.cxx for a similar check... + +//#ifdef __APPLE_QD__ +#if 0 +// Create an 8-bit mask used for alpha blending +Fl_Bitmask fl_create_alphamask(int w, int h, int d, int ld, const uchar *array) { + Rect srcRect; + srcRect.left = 0; srcRect.right = w; + srcRect.top = 0; srcRect.bottom = h; + GrafPtr savePort; + + GetPort(&savePort); // remember the current port + + Fl_Bitmask gw; + NewGWorld( &gw, 8, &srcRect, 0L, 0L, 0 ); + PixMapHandle pm = GetGWorldPixMap( gw ); + if ( pm ) + { + LockPixels( pm ); + if ( *pm ) + { + uchar *base = (uchar*)GetPixBaseAddr( pm ); + if ( base ) + { + PixMapPtr pmp = *pm; + // verify the parameters for direct memory write + if ( pmp->pixelType == 0 || pmp->pixelSize == 8 || pmp->cmpCount == 1 || pmp->cmpSize == 8 ) + { + // Copy alpha values from the source array to the pixmap... + array += d - 1; + int rowoffset = (pmp->rowBytes & 0x3fff) - w; + for (int y = h; y > 0; y --, array += ld, base += rowoffset) { + for (int x = w; x > 0; x --, array += d) { + *base++ = 255 /*255 - *array*/; + } + } + } + } + UnlockPixels( pm ); + } + } + + SetPort(savePort); + return gw; /* tell caller we succeeded! */ +} +#else +// Create a 1-bit mask used for alpha blending +Fl_Bitmask fl_create_alphamask(int w, int h, int d, int ld, const uchar *array) { + Fl_Bitmask mask; + int bmw = (w + 7) / 8; + uchar *bitmap = new uchar[bmw * h]; + uchar *bitptr, bit; + const uchar *dataptr; + int x, y; + static uchar dither[16][16] = { // Simple 16x16 Floyd dither + { 0, 128, 32, 160, 8, 136, 40, 168, + 2, 130, 34, 162, 10, 138, 42, 170 }, + { 192, 64, 224, 96, 200, 72, 232, 104, + 194, 66, 226, 98, 202, 74, 234, 106 }, + { 48, 176, 16, 144, 56, 184, 24, 152, + 50, 178, 18, 146, 58, 186, 26, 154 }, + { 240, 112, 208, 80, 248, 120, 216, 88, + 242, 114, 210, 82, 250, 122, 218, 90 }, + { 12, 140, 44, 172, 4, 132, 36, 164, + 14, 142, 46, 174, 6, 134, 38, 166 }, + { 204, 76, 236, 108, 196, 68, 228, 100, + 206, 78, 238, 110, 198, 70, 230, 102 }, + { 60, 188, 28, 156, 52, 180, 20, 148, + 62, 190, 30, 158, 54, 182, 22, 150 }, + { 252, 124, 220, 92, 244, 116, 212, 84, + 254, 126, 222, 94, 246, 118, 214, 86 }, + { 3, 131, 35, 163, 11, 139, 43, 171, + 1, 129, 33, 161, 9, 137, 41, 169 }, + { 195, 67, 227, 99, 203, 75, 235, 107, + 193, 65, 225, 97, 201, 73, 233, 105 }, + { 51, 179, 19, 147, 59, 187, 27, 155, + 49, 177, 17, 145, 57, 185, 25, 153 }, + { 243, 115, 211, 83, 251, 123, 219, 91, + 241, 113, 209, 81, 249, 121, 217, 89 }, + { 15, 143, 47, 175, 7, 135, 39, 167, + 13, 141, 45, 173, 5, 133, 37, 165 }, + { 207, 79, 239, 111, 199, 71, 231, 103, + 205, 77, 237, 109, 197, 69, 229, 101 }, + { 63, 191, 31, 159, 55, 183, 23, 151, + 61, 189, 29, 157, 53, 181, 21, 149 }, + { 254, 127, 223, 95, 247, 119, 215, 87, + 253, 125, 221, 93, 245, 117, 213, 85 } + }; + + // Generate a 1-bit "screen door" alpha mask; not always pretty, but + // definitely fast... In the future we may be able to support things + // like the RENDER extension in XFree86, when available, to provide + // true RGBA-blended rendering. See: + // + // http://www.xfree86.org/~keithp/render/protocol.html + // + // for more info on XRender... + // + // MacOS already provides alpha blending support and has its own + // fl_create_alphamask() function... + memset(bitmap, 0, bmw * h); + + for (dataptr = array + d - 1, y = 0; y < h; y ++, dataptr += ld) + for (bitptr = bitmap + y * bmw, bit = 1, x = 0; x < w; x ++, dataptr += d) { + if (*dataptr > dither[x & 15][y & 15]) + *bitptr |= bit; + if (bit < 128) bit <<= 1; + else { + bit = 1; + bitptr ++; + } + } + + mask = fl_create_bitmask(w, h, bitmap); + delete[] bitmap; + + return (mask); +} +#endif // __APPLE__ + +void Fl_Bitmap::draw(int XP, int YP, int WP, int HP, int cx, int cy) { + if (!array) { + draw_empty(XP, YP); + return; + } + + // account for current clip region (faster on Irix): + int X,Y,W,H; fl_clip_box(XP,YP,WP,HP,X,Y,W,H); + cx += X-XP; cy += Y-YP; + // clip the box down to the size of image, quit if empty: + if (cx < 0) {W += cx; X -= cx; cx = 0;} + if ((cx+W) > w()) W = w()-cx; + if (W <= 0) return; + if (cy < 0) {H += cy; Y -= cy; cy = 0;} + if ((cy+H) > h()) H = h()-cy; + if (H <= 0) return; +#ifdef WIN32 + if (!id) id = fl_create_bitmap(w(), h(), array); + + HDC tempdc = CreateCompatibleDC(fl_gc); + int save = SaveDC(tempdc); + SelectObject(tempdc, (HGDIOBJ)id); + SelectObject(fl_gc, fl_brush()); + // secret bitblt code found in old MSWindows reference manual: + BitBlt(fl_gc, X, Y, W, H, tempdc, cx, cy, 0xE20746L); + RestoreDC(tempdc, save); + DeleteDC(tempdc); +#elif defined(__APPLE_QD__) + if (!id) id = fl_create_bitmask(w(), h(), array); + GrafPtr dstPort; + GetPort( &dstPort ); + Rect src, dst; + GetPortBounds( (Fl_Offscreen)id, &src ); + SetRect( &src, cx, cy, cx+W, cy+H ); + SetRect( &dst, X, Y, X+W, Y+H ); + CopyBits(GetPortBitMapForCopyBits((Fl_Offscreen)id), // srcBits + GetPortBitMapForCopyBits(dstPort), // dstBits + &src, // src bounds + &dst, // dst bounds + srcOr, // mode + 0L); // mask region +#elif defined(__APPLE_QUARTZ__) + if (!id) id = fl_create_bitmask(w(), h(), array); + if (id && fl_gc) { + CGRect rect = { { X, Y }, { W, H } }; + Fl_X::q_begin_image(rect, cx, cy, w(), h()); + CGContextDrawImage(fl_gc, rect, (CGImageRef)id); + Fl_X::q_end_image(); + } +#else + if (!id) id = fl_create_bitmask(w(), h(), array); + + XSetStipple(fl_display, fl_gc, id); + int ox = X-cx; if (ox < 0) ox += w(); + int oy = Y-cy; if (oy < 0) oy += h(); + XSetTSOrigin(fl_display, fl_gc, ox, oy); + XSetFillStyle(fl_display, fl_gc, FillStippled); + XFillRectangle(fl_display, fl_window, fl_gc, X, Y, W, H); + XSetFillStyle(fl_display, fl_gc, FillSolid); +#endif +} + +Fl_Bitmap::~Fl_Bitmap() { + uncache(); + if (alloc_array) delete[] (uchar *)array; +} + +void Fl_Bitmap::uncache() { + if (id) { + fl_delete_bitmask((Fl_Offscreen)id); + id = 0; + } +} + +void Fl_Bitmap::label(Fl_Widget* widget) { + widget->image(this); +} + +void Fl_Bitmap::label(Fl_Menu_Item* m) { + Fl::set_labeltype(_FL_IMAGE_LABEL, labeltype, measure); + m->label(_FL_IMAGE_LABEL, (const char*)this); +} + +Fl_Image *Fl_Bitmap::copy(int W, int H) { + Fl_Bitmap *new_image; // New RGB image + uchar *new_array; // New array for image data + + // Optimize the simple copy where the width and height are the same... + if (W == w() && H == h()) { + new_array = new uchar [H * ((W + 7) / 8)]; + memcpy(new_array, array, H * ((W + 7) / 8)); + + new_image = new Fl_Bitmap(new_array, W, H); + new_image->alloc_array = 1; + + return new_image; + } + if (W <= 0 || H <= 0) return 0; + + // OK, need to resize the image data; allocate memory and + uchar *new_ptr, // Pointer into new array + new_bit, // Bit for new array + old_bit; // Bit for old array + const uchar *old_ptr; // Pointer into old array + int sx, sy, // Source coordinates + dx, dy, // Destination coordinates + xerr, yerr, // X & Y errors + xmod, ymod, // X & Y moduli + xstep, ystep; // X & Y step increments + + + // Figure out Bresenheim step/modulus values... + xmod = w() % W; + xstep = w() / W; + ymod = h() % H; + ystep = h() / H; + + // Allocate memory for the new image... + new_array = new uchar [H * ((W + 7) / 8)]; + new_image = new Fl_Bitmap(new_array, W, H); + new_image->alloc_array = 1; + + memset(new_array, 0, H * ((W + 7) / 8)); + + // Scale the image using a nearest-neighbor algorithm... + for (dy = H, sy = 0, yerr = H, new_ptr = new_array; dy > 0; dy --) { + for (dx = W, xerr = W, old_ptr = array + sy * ((w() + 7) / 8), sx = 0, new_bit = 1; + dx > 0; + dx --) { + old_bit = (uchar)(1 << (sx & 7)); + if (old_ptr[sx / 8] & old_bit) *new_ptr |= new_bit; + + if (new_bit < 128) new_bit <<= 1; + else { + new_bit = 1; + new_ptr ++; + } + + sx += xstep; + xerr -= xmod; + + if (xerr <= 0) { + xerr += W; + sx ++; + } + } + + if (new_bit > 1) new_ptr ++; + + sy += ystep; + yerr -= ymod; + if (yerr <= 0) { + yerr += H; + sy ++; + } + } + + return new_image; +} + + +// +// End of "$Id: Fl_Bitmap.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Box.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Box.cxx new file mode 100644 index 0000000..bc44d08 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Box.cxx @@ -0,0 +1,44 @@ +// +// "$Id: Fl_Box.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Box widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include + +void Fl_Box::draw() { + draw_box(); + draw_label(); +} + +int Fl_Box::handle(int event) { + if (event == FL_ENTER || event == FL_LEAVE) return 1; + else return 0; +} + + +// +// End of "$Id: Fl_Box.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Browser.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Browser.cxx new file mode 100644 index 0000000..e31c6e0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Browser.cxx @@ -0,0 +1,551 @@ +// +// "$Id: Fl_Browser.cxx 5987 2007-11-20 21:57:17Z mike $" +// +// Browser widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include "flstring.h" +#include +#include + +// I modified this from the original Forms data to use a linked list +// so that the number of items in the browser and size of those items +// is unlimited. The only problem is that the old browser used an +// index number to identify a line, and it is slow to convert from/to +// a pointer. I use a cache of the last match to try to speed this +// up. + +// Also added the ability to "hide" a line. This set's it's height to +// zero, so the Fl_Browser_ cannot pick it. + +#define SELECTED 1 +#define NOTDISPLAYED 2 + +struct FL_BLINE { // data is in a linked list of these + FL_BLINE* prev; + FL_BLINE* next; + void* data; + short length; // sizeof(txt)-1, may be longer than string + char flags; // selected, displayed + char txt[1]; // start of allocated array +}; + +void* Fl_Browser::item_first() const {return first;} + +void* Fl_Browser::item_next(void* l) const {return ((FL_BLINE*)l)->next;} + +void* Fl_Browser::item_prev(void* l) const {return ((FL_BLINE*)l)->prev;} + +int Fl_Browser::item_selected(void* l) const { + return ((FL_BLINE*)l)->flags&SELECTED;} + +void Fl_Browser::item_select(void* l, int v) { + if (v) ((FL_BLINE*)l)->flags |= SELECTED; + else ((FL_BLINE*)l)->flags &= ~SELECTED; +} + +FL_BLINE* Fl_Browser::find_line(int line) const { + int n; FL_BLINE* l; + if (line == cacheline) return cache; + if (cacheline && line > (cacheline/2) && line < ((cacheline+lines)/2)) { + n = cacheline; l = cache; + } else if (line <= (lines/2)) { + n = 1; l = first; + } else { + n = lines; l = last; + } + for (; n < line && l; n++) l = l->next; + for (; n > line && l; n--) l = l->prev; + ((Fl_Browser*)this)->cacheline = line; + ((Fl_Browser*)this)->cache = l; + return l; +} + +int Fl_Browser::lineno(void* v) const { + FL_BLINE* l = (FL_BLINE*)v; + if (!l) return 0; + if (l == cache) return cacheline; + if (l == first) return 1; + if (l == last) return lines; + if (!cache) { + ((Fl_Browser*)this)->cache = first; + ((Fl_Browser*)this)->cacheline = 1; + } + // assumme it is near cache, search both directions: + FL_BLINE* b = cache->prev; + int bnum = cacheline-1; + FL_BLINE* f = cache->next; + int fnum = cacheline+1; + int n = 0; + for (;;) { + if (b == l) {n = bnum; break;} + if (f == l) {n = fnum; break;} + if (b) {b = b->prev; bnum--;} + if (f) {f = f->next; fnum++;} + } + ((Fl_Browser*)this)->cache = l; + ((Fl_Browser*)this)->cacheline = n; + return n; +} + +FL_BLINE* Fl_Browser::_remove(int line) { + FL_BLINE* ttt = find_line(line); + deleting(ttt); + + cacheline = line-1; + cache = ttt->prev; + lines--; + full_height_ -= item_height(ttt); + if (ttt->prev) ttt->prev->next = ttt->next; + else first = ttt->next; + if (ttt->next) ttt->next->prev = ttt->prev; + else last = ttt->prev; + + return(ttt); +} + +void Fl_Browser::remove(int line) { + if (line < 1 || line > lines) return; + free(_remove(line)); +} + +void Fl_Browser::insert(int line, FL_BLINE* t) { + if (!first) { + t->prev = t->next = 0; + first = last = t; + } else if (line <= 1) { + inserting(first, t); + t->prev = 0; + t->next = first; + t->next->prev = t; + first = t; + } else if (line > lines) { + t->prev = last; + t->prev->next = t; + t->next = 0; + last = t; + } else { + FL_BLINE* n = find_line(line); + inserting(n, t); + t->next = n; + t->prev = n->prev; + t->prev->next = t; + n->prev = t; + } + cacheline = line; + cache = t; + lines++; + full_height_ += item_height(t); + redraw_line(t); +} + +void Fl_Browser::insert(int line, const char* newtext, void* d) { + int l = strlen(newtext); + FL_BLINE* t = (FL_BLINE*)malloc(sizeof(FL_BLINE)+l); + t->length = (short)l; + t->flags = 0; + strcpy(t->txt, newtext); + t->data = d; + insert(line, t); +} + +void Fl_Browser::move(int to, int from) { + if (from < 1 || from > lines) return; + insert(to, _remove(from)); +} + +void Fl_Browser::text(int line, const char* newtext) { + if (line < 1 || line > lines) return; + FL_BLINE* t = find_line(line); + int l = strlen(newtext); + if (l > t->length) { + FL_BLINE* n = (FL_BLINE*)malloc(sizeof(FL_BLINE)+l); + replacing(t, n); + cache = n; + n->data = t->data; + n->length = (short)l; + n->flags = t->flags; + n->prev = t->prev; + if (n->prev) n->prev->next = n; else first = n; + n->next = t->next; + if (n->next) n->next->prev = n; else last = n; + free(t); + t = n; + } + strcpy(t->txt, newtext); + redraw_line(t); +} + +void Fl_Browser::data(int line, void* d) { + if (line < 1 || line > lines) return; + find_line(line)->data = d; +} + +int Fl_Browser::item_height(void* lv) const { + FL_BLINE* l = (FL_BLINE*)lv; + if (l->flags & NOTDISPLAYED) return 0; + + int hmax = 2; // use 2 to insure we don't return a zero! + + if (!l->txt[0]) { + // For blank lines set the height to exactly 1 line! + fl_font(textfont(), textsize()); + int hh = fl_height(); + if (hh > hmax) hmax = hh; + } + else { + const int* i = column_widths(); + // do each column separately as they may all set different fonts: + for (char* str = l->txt; str && *str; str++) { + Fl_Font font = textfont(); // default font + int tsize = textsize(); // default size + while (*str==format_char()) { + str++; + switch (*str++) { + case 'l': case 'L': tsize = 24; break; + case 'm': case 'M': tsize = 18; break; + case 's': tsize = 11; break; + case 'b': font = (Fl_Font)(font|FL_BOLD); break; + case 'i': font = (Fl_Font)(font|FL_ITALIC); break; + case 'f': case 't': font = FL_COURIER; break; + case 'B': + case 'C': strtol(str, &str, 10); break;// skip a color number + case 'F': font = (Fl_Font)strtol(str,&str,10); break; + case 'S': tsize = strtol(str,&str,10); break; + case 0: case '@': str--; + case '.': goto END_FORMAT; + } + } + END_FORMAT: + char* ptr = str; + if (ptr && *i++) str = strchr(str, column_char()); + else str = NULL; + if((!str && *ptr) || (str && ptr < str)) { + fl_font(font, tsize); int hh = fl_height(); + if (hh > hmax) hmax = hh; + } + if (!str || !*str) break; + } + } + + return hmax; // previous version returned hmax+2! +} + +int Fl_Browser::item_width(void* v) const { + char* str = ((FL_BLINE*)v)->txt; + const int* i = column_widths(); + int ww = 0; + + while (*i) { // add up all tab-seperated fields + char* e; + e = strchr(str, column_char()); + if (!e) break; // last one occupied by text + str = e+1; + ww += *i++; + } + + // OK, we gotta parse the string and find the string width... + int tsize = textsize(); + Fl_Font font = textfont(); + int done = 0; + + while (*str == format_char_ && str[1] && str[1] != format_char_) { + str ++; + switch (*str++) { + case 'l': case 'L': tsize = 24; break; + case 'm': case 'M': tsize = 18; break; + case 's': tsize = 11; break; + case 'b': font = (Fl_Font)(font|FL_BOLD); break; + case 'i': font = (Fl_Font)(font|FL_ITALIC); break; + case 'f': case 't': font = FL_COURIER; break; + case 'B': + case 'C': strtol(str, &str, 10); break;// skip a color number + case 'F': font = (Fl_Font)strtol(str, &str, 10); break; + case 'S': tsize = strtol(str, &str, 10); break; + case '.': + done = 1; + break; + case '@': + str--; + done = 1; + } + + if (done) + break; + } + + if (*str == format_char_ && str[1]) + str ++; + + fl_font(font, tsize); + return ww + int(fl_width(str)) + 6; +} + +int Fl_Browser::full_height() const { + return full_height_; +} + +int Fl_Browser::incr_height() const { + return textsize()+2; +} + +void Fl_Browser::item_draw(void* v, int X, int Y, int W, int H) const { + char* str = ((FL_BLINE*)v)->txt; + const int* i = column_widths(); + + while (W > 6) { // do each tab-seperated field + int w1 = W; // width for this field + char* e = 0; // pointer to end of field or null if none + if (*i) { // find end of field and temporarily replace with 0 + e = strchr(str, column_char()); + if (e) {*e = 0; w1 = *i++;} + } + int tsize = textsize(); + Fl_Font font = textfont(); + Fl_Color lcol = textcolor(); + Fl_Align talign = FL_ALIGN_LEFT; + // check for all the @-lines recognized by XForms: + while (*str == format_char() && *++str && *str != format_char()) { + switch (*str++) { + case 'l': case 'L': tsize = 24; break; + case 'm': case 'M': tsize = 18; break; + case 's': tsize = 11; break; + case 'b': font = (Fl_Font)(font|FL_BOLD); break; + case 'i': font = (Fl_Font)(font|FL_ITALIC); break; + case 'f': case 't': font = FL_COURIER; break; + case 'c': talign = FL_ALIGN_CENTER; break; + case 'r': talign = FL_ALIGN_RIGHT; break; + case 'B': + if (!(((FL_BLINE*)v)->flags & SELECTED)) { + fl_color((Fl_Color)strtol(str, &str, 10)); + fl_rectf(X, Y, w1, H); + } else strtol(str, &str, 10); + break; + case 'C': + lcol = (Fl_Color)strtol(str, &str, 10); + break; + case 'F': + font = (Fl_Font)strtol(str, &str, 10); + break; + case 'N': + lcol = FL_INACTIVE_COLOR; + break; + case 'S': + tsize = strtol(str, &str, 10); + break; + case '-': + fl_color(FL_DARK3); + fl_line(X+3, Y+H/2, X+w1-3, Y+H/2); + fl_color(FL_LIGHT3); + fl_line(X+3, Y+H/2+1, X+w1-3, Y+H/2+1); + break; + case 'u': + case '_': + fl_color(lcol); + fl_line(X+3, Y+H-1, X+w1-3, Y+H-1); + break; + case '.': + goto BREAK; + case '@': + str--; goto BREAK; + } + } + BREAK: + fl_font(font, tsize); + if (((FL_BLINE*)v)->flags & SELECTED) + lcol = fl_contrast(lcol, selection_color()); + if (!active_r()) lcol = fl_inactive(lcol); + fl_color(lcol); + fl_draw(str, X+3, Y, w1-6, H, e ? Fl_Align(talign|FL_ALIGN_CLIP) : talign, 0, 0); + if (!e) break; // no more fields... + *e = column_char(); // put the seperator back + X += w1; + W -= w1; + str = e+1; + } +} + +static const int no_columns[1] = {0}; + +Fl_Browser::Fl_Browser(int X, int Y, int W, int H, const char*l) + : Fl_Browser_(X, Y, W, H, l) { + column_widths_ = no_columns; + lines = 0; + full_height_ = 0; + cacheline = 0; + format_char_ = '@'; + column_char_ = '\t'; + first = last = cache = 0; +} + +void Fl_Browser::lineposition(int line, Fl_Line_Position pos) { + if (line<1) line = 1; + if (line>lines) line = lines; + int p = 0; + + FL_BLINE* l; + for (l=first; l && line>1; l = l->next) { + line--; p += item_height(l); + } + if (l && (pos == BOTTOM)) p += item_height (l); + + int final = p, X, Y, W, H; + bbox(X, Y, W, H); + + switch(pos) { + case TOP: break; + case BOTTOM: final -= H; break; + case MIDDLE: final -= H/2; break; + } + + if (final > (full_height() - H)) final = full_height() -H; + position(final); +} + +int Fl_Browser::topline() const { + return lineno(top()); +} + +void Fl_Browser::clear() { + for (FL_BLINE* l = first; l;) { + FL_BLINE* n = l->next; + free(l); + l = n; + } + full_height_ = 0; + first = 0; + lines = 0; + new_list(); +} + +void Fl_Browser::add(const char* newtext, void* d) { + insert(lines+1, newtext, d); + //Fl_Browser_::display(last); +} + +const char* Fl_Browser::text(int line) const { + if (line < 1 || line > lines) return 0; + return find_line(line)->txt; +} + +void* Fl_Browser::data(int line) const { + if (line < 1 || line > lines) return 0; + return find_line(line)->data; +} + +int Fl_Browser::select(int line, int v) { + if (line < 1 || line > lines) return 0; + return Fl_Browser_::select(find_line(line), v); +} + +int Fl_Browser::selected(int line) const { + if (line < 1 || line > lines) return 0; + return find_line(line)->flags & SELECTED; +} + +void Fl_Browser::show(int line) { + FL_BLINE* t = find_line(line); + if (t->flags & NOTDISPLAYED) { + t->flags &= ~NOTDISPLAYED; + full_height_ += item_height(t); + if (Fl_Browser_::displayed(t)) redraw(); + } +} + +void Fl_Browser::hide(int line) { + FL_BLINE* t = find_line(line); + if (!(t->flags & NOTDISPLAYED)) { + full_height_ -= item_height(t); + t->flags |= NOTDISPLAYED; + if (Fl_Browser_::displayed(t)) redraw(); + } +} + +void Fl_Browser::display(int line, int v) { + if (line < 1 || line > lines) return; + if (v) show(line); else hide(line); +} + +int Fl_Browser::visible(int line) const { + if (line < 1 || line > lines) return 0; + return !(find_line(line)->flags&NOTDISPLAYED); +} + +int Fl_Browser::value() const { + return lineno(selection()); +} + +// SWAP TWO LINES +void Fl_Browser::swap(FL_BLINE *a, FL_BLINE *b) { + + if ( a == b || !a || !b) return; // nothing to do + swapping(a, b); + FL_BLINE *aprev = a->prev; + FL_BLINE *anext = a->next; + FL_BLINE *bprev = b->prev; + FL_BLINE *bnext = b->next; + if ( b->prev == a ) { // A ADJACENT TO B + if ( aprev ) aprev->next = b; else first = b; + b->next = a; + a->next = bnext; + b->prev = aprev; + a->prev = b; + if ( bnext ) bnext->prev = a; else last = a; + } else if ( a->prev == b ) { // B ADJACENT TO A + if ( bprev ) bprev->next = a; else first = a; + a->next = b; + b->next = anext; + a->prev = bprev; + b->prev = a; + if ( anext ) anext->prev = b; else last = b; + } else { // A AND B NOT ADJACENT + // handle prev's + b->prev = aprev; + if ( anext ) anext->prev = b; else last = b; + a->prev = bprev; + if ( bnext ) bnext->prev = a; else last = a; + // handle next's + if ( aprev ) aprev->next = b; else first = b; + b->next = anext; + if ( bprev ) bprev->next = a; else first = a; + a->next = bnext; + } + // Disable cache -- we played around with positions + cacheline = 0; + cache = 0; +} + +void Fl_Browser::swap(int ai, int bi) { + if (ai < 1 || ai > lines || bi < 1 || bi > lines) return; + FL_BLINE* a = find_line(ai); + FL_BLINE* b = find_line(bi); + swap(a,b); +} + +// +// End of "$Id: Fl_Browser.cxx 5987 2007-11-20 21:57:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Browser_.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Browser_.cxx new file mode 100644 index 0000000..ae97f2d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Browser_.cxx @@ -0,0 +1,842 @@ +// +// "$Id: Fl_Browser_.cxx 5992 2007-12-15 16:20:16Z mike $" +// +// Base Browser widget class for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#define DISPLAY_SEARCH_BOTH_WAYS_AT_ONCE + +#include +#include +#include +#include +#include + + +// This is the base class for browsers. To be useful it must be +// subclassed and several virtual functions defined. The +// Forms-compatable browser and the file chooser's browser are +// subclassed off of this. + +// Yes, I know this should be a template... + +// This has been designed so that the subclass has complete control +// over the storage of the data, although because next() and prev() +// functions are used to index, it works best as a linked list or as a +// large block of characters in which the line breaks must be searched +// for. + +// A great deal of work has been done so that the "height" of a data +// object does not need to be determined until it is drawn. This was +// done for the file chooser, because the height requires doing stat() +// to see if the file is a directory, which can be annoyingly slow +// over the network. + +/* redraw bits: + 1 = redraw children (the scrollbar) + 2 = redraw one or two items + 4 = redraw all items +*/ + +static void scrollbar_callback(Fl_Widget* s, void*) { + ((Fl_Browser_*)(s->parent()))->position(int(((Fl_Scrollbar*)s)->value())); +} + +static void hscrollbar_callback(Fl_Widget* s, void*) { + ((Fl_Browser_*)(s->parent()))->hposition(int(((Fl_Scrollbar*)s)->value())); +} + +// Scrollbar size should be part of the Fl class, but is left here for +// binary compatibility in 1.1.x - M. Sweet +int Fl_Browser_::scrollbar_width_ = 16; + +// Get the standard scrollbar size +int Fl::scrollbar_size() { + return Fl_Browser_::scrollbar_width(); +} + +// Set the standard scrollbar size +void Fl::scrollbar_size(int W) { + Fl_Browser_::scrollbar_width(W); +} + +// return where to draw the actual box: +void Fl_Browser_::bbox(int& X, int& Y, int& W, int& H) const { + Fl_Boxtype b = box() ? box() : FL_DOWN_BOX; + X = x()+Fl::box_dx(b); + Y = y()+Fl::box_dy(b); + W = w()-Fl::box_dw(b); + H = h()-Fl::box_dh(b); + if (scrollbar.visible()) { + W -= scrollbar_width_; + if (scrollbar.align() & FL_ALIGN_LEFT) X += scrollbar_width_; + } + if (W < 0) W = 0; + if (hscrollbar.visible()) { + H -= scrollbar_width_; + if (scrollbar.align() & FL_ALIGN_TOP) Y += scrollbar_width_; + } + if (H < 0) H = 0; +} + +int Fl_Browser_::leftedge() const { + int X, Y, W, H; bbox(X, Y, W, H); + return X; +} + +// The scrollbars may be moved again by draw(), since each one's size +// depends on whether the other is visible or not. This skips over +// Fl_Group::resize since it moves the scrollbars uselessly. +void Fl_Browser_::resize(int X, int Y, int W, int H) { + Fl_Widget::resize(X, Y, W, H); + // move the scrollbars so they can respond to events: + bbox(X,Y,W,H); + scrollbar.resize( + scrollbar.align()&FL_ALIGN_LEFT ? X-scrollbar_width_ : X+W, + Y, scrollbar_width_, H); + hscrollbar.resize( + X, scrollbar.align()&FL_ALIGN_TOP ? Y-scrollbar_width_ : Y+H, + W, scrollbar_width_); +} + +// Cause minimal update to redraw the given item: +void Fl_Browser_::redraw_line(void* l) { + if (!redraw1 || redraw1 == l) {redraw1 = l; damage(FL_DAMAGE_EXPOSE);} + else if (!redraw2 || redraw2 == l) {redraw2 = l; damage(FL_DAMAGE_EXPOSE);} + else damage(FL_DAMAGE_SCROLL); +} + +// Figure out top() based on position(): +void Fl_Browser_::update_top() { + if (!top_) top_ = item_first(); + if (position_ != real_position_) { + void* l; + int ly; + int yy = position_; + // start from either head or current position, whichever is closer: + if (!top_ || yy <= (real_position_/2)) { + l = item_first(); + ly = 0; + } else { + l = top_; + ly = real_position_-offset_; + } + if (!l) { + top_ = 0; + offset_ = 0; + real_position_ = 0; + } else { + int hh = item_quick_height(l); + // step through list until we find line containing this point: + while (ly > yy) { + void* l1 = item_prev(l); + if (!l1) {ly = 0; break;} // hit the top + l = l1; + hh = item_quick_height(l); + ly -= hh; + } + while ((ly+hh) <= yy) { + void* l1 = item_next(l); + if (!l1) {yy = ly+hh-1; break;} + l = l1; + ly += hh; + hh = item_quick_height(l); + } + // top item must *really* be visible, use slow height: + for (;;) { + hh = item_height(l); + if ((ly+hh) > yy) break; // it is big enough to see + // go up to top of previous item: + void* l1 = item_prev(l); + if (!l1) {ly = yy = 0; break;} // hit the top + l = l1; yy = position_ = ly = ly-item_quick_height(l); + } + // use it: + top_ = l; + offset_ = yy-ly; + real_position_ = yy; + } + damage(FL_DAMAGE_SCROLL); + } +} + +// Change position(), top() will update when update_top() is called +// (probably by draw() or handle()): +void Fl_Browser_::position(int yy) { + if (yy < 0) yy = 0; + if (yy == position_) return; + position_ = yy; + if (yy != real_position_) redraw_lines(); +} + +void Fl_Browser_::hposition(int xx) { + if (xx < 0) xx = 0; + if (xx == hposition_) return; + hposition_ = xx; + if (xx != real_hposition_) redraw_lines(); +} + +// Tell whether item is currently displayed: +int Fl_Browser_::displayed(void* p) const { + int X, Y, W, H; bbox(X, Y, W, H); + int yy = H+offset_; + for (void* l = top_; l && yy > 0; l = item_next(l)) { + if (l == p) return 1; + yy -= item_height(l); + } + return 0; +} + +// Ensure this item is displayed: +// Messy because we have no idea if it is before top or after bottom: +void Fl_Browser_::display(void* p) { + + // First special case - want to display first item in the list? + update_top(); + if (p == item_first()) {position(0); return;} + + int X, Y, W, H, Yp; bbox(X, Y, W, H); + void* l = top_; + Y = Yp = -offset_; + int h1; + + // 2nd special case - want to display item already displayed at top of browser? + if (l == p) {position(real_position_+Y); return;} // scroll up a bit + + // 3rd special case - want to display item just above top of browser? + void* lp = item_prev(l); + if (lp == p) {position(real_position_+Y-item_quick_height(lp)); return;} + +#ifdef DISPLAY_SEARCH_BOTH_WAYS_AT_ONCE + // search for item. We search both up and down the list at the same time, + // this evens up the execution time for the two cases - the old way was + // much slower for going up than for going down. + while (l || lp) { + if (l) { + h1 = item_quick_height(l); + if (l == p) { + if (Y <= H) { // it is visible or right at bottom + Y = Y+h1-H; // find where bottom edge is + if (Y > 0) position(real_position_+Y); // scroll down a bit + } else { + position(real_position_+Y-(H-h1)/2); // center it + } + return; + } + Y += h1; + l = item_next(l); + } + if (lp) { + h1 = item_quick_height(lp); + Yp -= h1; + if (lp == p) { + if ((Yp + h1) >= 0) position(real_position_+Yp); + else position(real_position_+Yp-(H-h1)/2); + return; + } + lp = item_prev(lp); + } + } +#else + // Old version went forwards and then backwards: + // search forward for it: + l = top_; + for (; l; l = item_next(l)) { + h1 = item_quick_height(l); + if (l == p) { + if (Y <= H) { // it is visible or right at bottom + Y = Y+h1-H; // find where bottom edge is + if (Y > 0) position(real_position_+Y); // scroll down a bit + } else { + position(real_position_+Y-(H-h1)/2); // center it + } + return; + } + Y += h1; + } + // search backward for it, if found center it: + l = lp; + Y = -offset_; + for (; l; l = item_prev(l)) { + h1 = item_quick_height(l); + Y -= h1; + if (l == p) { + if ((Y + h1) >= 0) position(real_position_+Y); + else position(real_position_+Y-(H-h1)/2); + return; + } + } +#endif +} + +// redraw, has side effect of updating top and setting scrollbar: + +void Fl_Browser_::draw() { + int drawsquare = 0; + update_top(); + int full_width_ = full_width(); + int full_height_ = full_height(); + int X, Y, W, H; bbox(X, Y, W, H); + int dont_repeat = 0; +J1: + if (damage() & FL_DAMAGE_ALL) { // redraw the box if full redraw + Fl_Boxtype b = box() ? box() : FL_DOWN_BOX; + draw_box(b, x(), y(), w(), h(), color()); + drawsquare = 1; + } + // see if scrollbar needs to be switched on/off: + if ((has_scrollbar_ & VERTICAL) && ( + (has_scrollbar_ & ALWAYS_ON) || position_ || full_height_ > H)) { + if (!scrollbar.visible()) { + scrollbar.set_visible(); + drawsquare = 1; + bbox(X, Y, W, H); + } + } else { + top_ = item_first(); real_position_ = offset_ = 0; + if (scrollbar.visible()) { + scrollbar.clear_visible(); + clear_damage((uchar)(damage()|FL_DAMAGE_SCROLL)); + } + } + + if ((has_scrollbar_ & HORIZONTAL) && ( + (has_scrollbar_ & ALWAYS_ON) || hposition_ || full_width_ > W)) { + if (!hscrollbar.visible()) { + hscrollbar.set_visible(); + drawsquare = 1; + bbox(X, Y, W, H); + } + } else { + real_hposition_ = 0; + if (hscrollbar.visible()) { + hscrollbar.clear_visible(); + clear_damage((uchar)(damage()|FL_DAMAGE_SCROLL)); + } + } + + // Check the vertical scrollbar again, just in case it needs to be drawn + // because the horizontal one is drawn. There should be a cleaner way + // to do this besides copying the same code... + if ((has_scrollbar_ & VERTICAL) && ( + (has_scrollbar_ & ALWAYS_ON) || position_ || full_height_ > H)) { + if (!scrollbar.visible()) { + scrollbar.set_visible(); + drawsquare = 1; + bbox(X, Y, W, H); + } + } else { + top_ = item_first(); real_position_ = offset_ = 0; + if (scrollbar.visible()) { + scrollbar.clear_visible(); + clear_damage((uchar)(damage()|FL_DAMAGE_SCROLL)); + } + } + + bbox(X, Y, W, H); + + fl_clip(X, Y, W, H); + // for each line, draw it if full redraw or scrolled. Erase background + // if not a full redraw or if it is selected: + void* l = top(); + int yy = -offset_; + for (; l && yy < H; l = item_next(l)) { + int hh = item_height(l); + if (hh <= 0) continue; + if ((damage()&(FL_DAMAGE_SCROLL|FL_DAMAGE_ALL)) || l == redraw1 || l == redraw2) { + if (item_selected(l)) { + fl_color(active_r() ? selection_color() : fl_inactive(selection_color())); + fl_rectf(X, yy+Y, W, hh); + } else if (!(damage()&FL_DAMAGE_ALL)) { + fl_push_clip(X, yy+Y, W, hh); + draw_box(box() ? box() : FL_DOWN_BOX, x(), y(), w(), h(), color()); + fl_pop_clip(); + } + item_draw(l, X-hposition_, yy+Y, W+hposition_, hh); + if (l == selection_ && Fl::focus() == this) { + draw_box(FL_BORDER_FRAME, X, yy+Y, W, hh, color()); + draw_focus(FL_NO_BOX, X, yy+Y, W+1, hh+1); + } + int ww = item_width(l); + if (ww > max_width) {max_width = ww; max_width_item = l;} + } + yy += hh; + } + // erase the area below last line: + if (!(damage()&FL_DAMAGE_ALL) && yy < H) { + fl_push_clip(X, yy+Y, W, H-yy); + draw_box(box() ? box() : FL_DOWN_BOX, x(), y(), w(), h(), color()); + fl_pop_clip(); + } + fl_pop_clip(); + redraw1 = redraw2 = 0; + + if (!dont_repeat) { + dont_repeat = 1; + // see if changes to full_height caused by calls to slow_height + // caused scrollbar state to change, in which case we have to redraw: + full_height_ = full_height(); + full_width_ = full_width(); + if ((has_scrollbar_ & VERTICAL) && + ((has_scrollbar_ & ALWAYS_ON) || position_ || full_height_>H)) { + if (!scrollbar.visible()) { damage(FL_DAMAGE_ALL); goto J1; } + } else { + if (scrollbar.visible()) { damage(FL_DAMAGE_ALL); goto J1; } + } + if ((has_scrollbar_ & HORIZONTAL) && + ((has_scrollbar_ & ALWAYS_ON) || hposition_ || full_width_>W)) { + if (!hscrollbar.visible()) { damage(FL_DAMAGE_ALL); goto J1; } + } else { + if (hscrollbar.visible()) { damage(FL_DAMAGE_ALL); goto J1; } + } + } + + // update the scrollbars and redraw them: + int dy = top_ ? item_quick_height(top_) : 0; if (dy < 10) dy = 10; + if (scrollbar.visible()) { + scrollbar.damage_resize( + scrollbar.align()&FL_ALIGN_LEFT ? X-scrollbar_width_ : X+W, + Y, scrollbar_width_, H); + scrollbar.value(position_, H, 0, full_height_); + scrollbar.linesize(dy); + if (drawsquare) draw_child(scrollbar); + else update_child(scrollbar); + } + if (hscrollbar.visible()) { + hscrollbar.damage_resize( + X, scrollbar.align()&FL_ALIGN_TOP ? Y-scrollbar_width_ : Y+H, + W, scrollbar_width_); + hscrollbar.value(hposition_, W, 0, full_width_); + hscrollbar.linesize(dy); + if (drawsquare) draw_child(hscrollbar); + else update_child(hscrollbar); + } + + // draw that little square between the scrollbars: + if (drawsquare && scrollbar.visible() && hscrollbar.visible()) { + fl_color(parent()->color()); + fl_rectf(scrollbar.x(), hscrollbar.y(), scrollbar_width_,scrollbar_width_); + } + + real_hposition_ = hposition_; +} + +// Quick way to delete and reset everything: +void Fl_Browser_::new_list() { + top_ = 0; + position_ = real_position_ = 0; + hposition_ = real_hposition_ = 0; + selection_ = 0; + offset_ = 0; + max_width = 0; + max_width_item = 0; + redraw_lines(); +} + +// Tell it that this item is going away, and that this must remove +// all pointers to it: +void Fl_Browser_::deleting(void* l) { + if (displayed(l)) { + redraw_lines(); + if (l == top_) { + real_position_ -= offset_; + offset_ = 0; + top_ = item_next(l); + if (!top_) top_ = item_prev(l); + } + } else { + // we don't know where this item is, recalculate top... + real_position_ = 0; + offset_ = 0; + top_ = 0; + } + if (l == selection_) selection_ = 0; + if (l == max_width_item) {max_width_item = 0; max_width = 0;} +} + +void Fl_Browser_::replacing(void* a, void* b) { + redraw_line(a); + if (a == selection_) selection_ = b; + if (a == top_) top_ = b; + if (a == max_width_item) {max_width_item = 0; max_width = 0;} +} + +void Fl_Browser_::swapping(void* a, void* b) { + redraw_line(a); + redraw_line(b); + if (a == selection_) selection_ = b; + else if (b == selection_) selection_ = a; + if (a == top_) top_ = b; + else if (b == top_) top_ = a; +} + +void Fl_Browser_::inserting(void* a, void* b) { + if (displayed(a)) redraw_lines(); + if (a == top_) top_ = b; +} + +void* Fl_Browser_::find_item(int my) { + update_top(); + int X, Y, W, H; bbox(X, Y, W, H); + void* l; + int yy = Y-offset_; + for (l = top_; l; l = item_next(l)) { + int hh = item_height(l); if (hh <= 0) continue; + yy += hh; + if (my <= yy || yy>=(Y+H)) return l; + } + return 0; +} + +int Fl_Browser_::select(void* l, int i, int docallbacks) { + if (type() == FL_MULTI_BROWSER) { + if (selection_ != l) { + if (selection_) redraw_line(selection_); + selection_ = l; + redraw_line(l); + } + if ((!i)==(!item_selected(l))) return 0; + item_select(l, i); + redraw_line(l); + } else { + if (i && selection_ == l) return 0; + if (!i && selection_ != l) return 0; + if (selection_) { + item_select(selection_, 0); + redraw_line(selection_); + selection_ = 0; + } + if (i) { + item_select(l, 1); + selection_ = l; + redraw_line(l); + display(l); + } + } + if (docallbacks) { + set_changed(); + do_callback(); + } + return 1; +} + +int Fl_Browser_::deselect(int docallbacks) { + if (type() == FL_MULTI_BROWSER) { + int change = 0; + for (void* p = item_first(); p; p = item_next(p)) + change |= select(p, 0, docallbacks); + return change; + } else { + if (!selection_) return 0; + item_select(selection_, 0); + redraw_line(selection_); + selection_ = 0; + return 1; + } +} + +int Fl_Browser_::select_only(void* l, int docallbacks) { + if (!l) return deselect(docallbacks); + int change = 0; + if (type() == FL_MULTI_BROWSER) { + for (void* p = item_first(); p; p = item_next(p)) + if (p != l) change |= select(p, 0, docallbacks); + } + change |= select(l, 1, docallbacks); + display(l); + return change; +} + +int Fl_Browser_::handle(int event) { + // must do shortcuts first or the scrollbar will get them... + if (event == FL_ENTER || event == FL_LEAVE) return 1; + if (event == FL_KEYBOARD && type() >= FL_HOLD_BROWSER) { + void* l1 = selection_; + void* l = l1; if (!l) l = top_; if (!l) l = item_first(); + if (l) { + if (type()==FL_HOLD_BROWSER) { + switch (Fl::event_key()) { + case FL_Down: + while ((l = item_next(l))) + if (item_height(l)>0) {select_only(l, when()); break;} + return 1; + case FL_Up: + while ((l = item_prev(l))) if (item_height(l)>0) { + select_only(l, when()); break;} + return 1; + } + } else { + switch (Fl::event_key()) { + case FL_Enter: + case FL_KP_Enter: + select_only(l, when() & ~FL_WHEN_ENTER_KEY); + if (when() & FL_WHEN_ENTER_KEY) { + set_changed(); + do_callback(); + } + return 1; + case ' ': + selection_ = l; + select(l, !item_selected(l), when() & ~FL_WHEN_ENTER_KEY); + return 1; + case FL_Down: + while ((l = item_next(l))) { + if (Fl::event_state(FL_SHIFT|FL_CTRL)) + select(l, l1 ? item_selected(l1) : 1, when()); + if (item_height(l)>0) goto J1; + } + return 1; + case FL_Up: + while ((l = item_prev(l))) { + if (Fl::event_state(FL_SHIFT|FL_CTRL)) + select(l, l1 ? item_selected(l1) : 1, when()); + if (item_height(l)>0) goto J1; + } + return 1; +J1: + if (selection_) redraw_line(selection_); + selection_ = l; redraw_line(l); + display(l); + return 1; + } + } + } + } + + if (Fl_Group::handle(event)) return 1; + int X, Y, W, H; bbox(X, Y, W, H); + int my; +// NOTE: +// instead of: +// change = select_only(find_item(my), when() & FL_WHEN_CHANGED) +// we use the construct: +// change = select_only(find_item(my), 0); +// if (change && (when() & FL_WHEN_CHANGED)) { +// set_changed(); +// do_callback(); +// } +// See str #834 +// The first form calls the callback *before* setting change. +// The callback may execute an Fl::wait(), resulting in another +// call of Fl_Browser_::handle() for the same widget. The sequence +// of events can be an FL_PUSH followed by an FL_RELEASE. +// This second call of Fl_Browser_::handle() may result in a - +// somewhat unexpected - second concurrent invocation of the callback. + + static char change; + static char whichway; + static int py; + switch (event) { + case FL_PUSH: + if (!Fl::event_inside(X, Y, W, H)) return 0; + if (Fl::visible_focus()) { + Fl::focus(this); + redraw(); + } + my = py = Fl::event_y(); + change = 0; + if (type() == FL_NORMAL_BROWSER || !top_) + ; + else if (type() != FL_MULTI_BROWSER) { + change = select_only(find_item(my), 0); + if (change && (when() & FL_WHEN_CHANGED)) { + set_changed(); + do_callback(); + } + } else { + void* l = find_item(my); + whichway = 1; + if (Fl::event_state(FL_CTRL)) { // toggle selection: + TOGGLE: + if (l) { + whichway = !item_selected(l); + change = select(l, whichway, 0); + if (change && (when() & FL_WHEN_CHANGED)) { + set_changed(); + do_callback(); + } + } + } else if (Fl::event_state(FL_SHIFT)) { // extend selection: + if (l == selection_) goto TOGGLE; + // state of previous selection determines new value: + whichway = l ? !item_selected(l) : 1; + // see which of the new item or previous selection is earlier, + // by searching from the previous forward for this one: + int down; + if (!l) down = 1; + else {for (void* m = selection_; ; m = item_next(m)) { + if (m == l) {down = 1; break;} + if (!m) {down = 0; break;} + }} + if (down) { + for (void* m = selection_; m != l; m = item_next(m)) + select(m, whichway, when() & FL_WHEN_CHANGED); + } else { + void* e = selection_; + for (void* m = item_next(l); m; m = item_next(m)) { + select(m, whichway, when() & FL_WHEN_CHANGED); + if (m == e) break; + } + } + // do the clicked item last so the select box is around it: + change = 1; + if (l) select(l, whichway, when() & FL_WHEN_CHANGED); + } else { // select only this item + change = select_only(l, 0); + if (change && (when() & FL_WHEN_CHANGED)) { + set_changed(); + do_callback(); + } + } + } + return 1; + case FL_DRAG: + // do the scrolling first: + my = Fl::event_y(); + if (my < Y && my < py) { + int p = real_position_+my-Y; + if (p<0) p = 0; + position(p); + } else if (my > (Y+H) && my > py) { + int p = real_position_+my-(Y+H); + int hh = full_height()-H; if (p > hh) p = hh; + if (p<0) p = 0; + position(p); + } + if (type() == FL_NORMAL_BROWSER || !top_) + ; + else if (type() == FL_MULTI_BROWSER) { + void* l = find_item(my); + void* t; void* b; // this will be the range to change + if (my > py) { // go down + t = selection_ ? item_next(selection_) : 0; + b = l ? item_next(l) : 0; + } else { // go up + t = l; + b = selection_; + } + for (; t && t != b; t = item_next(t)) { + char change_t; + change_t = select(t, whichway, 0); + change |= change_t; + if (change_t && (when() & FL_WHEN_CHANGED)) { + set_changed(); + do_callback(); + } + } + if (l) selection_ = l; + } else { + void* l1 = selection_; + void* l = + (Fl::event_x()x()+w()) ? selection_ : + find_item(my); + change = (l != l1); + select_only(l, when() & FL_WHEN_CHANGED); + } + py = my; + return 1; + case FL_RELEASE: + if (type() == FL_SELECT_BROWSER) { + void* t = selection_; deselect(); selection_ = t; + } + if (change) { + set_changed(); + if (when() & FL_WHEN_RELEASE) do_callback(); + } else { + if (when() & FL_WHEN_NOT_CHANGED) do_callback(); + } + + // double click calls the callback: (like Enter Key) + if (Fl::event_clicks() && (when() & FL_WHEN_ENTER_KEY)) { + set_changed(); + do_callback(); + } + return 1; + case FL_FOCUS: + case FL_UNFOCUS: + if (type() >= FL_HOLD_BROWSER && Fl::visible_focus()) { + redraw(); + return 1; + } else return 0; + } + + return 0; +} + +Fl_Browser_::Fl_Browser_(int X, int Y, int W, int H, const char* l) + : Fl_Group(X, Y, W, H, l), + scrollbar(0, 0, 0, 0, 0), // they will be resized by draw() + hscrollbar(0, 0, 0, 0, 0) +{ + box(FL_NO_BOX); + align(FL_ALIGN_BOTTOM); + position_ = real_position_ = 0; + hposition_ = real_hposition_ = 0; + offset_ = 0; + top_ = 0; + when(FL_WHEN_RELEASE_ALWAYS); + selection_ = 0; + color(FL_BACKGROUND2_COLOR, FL_SELECTION_COLOR); + scrollbar.callback(scrollbar_callback); +//scrollbar.align(FL_ALIGN_LEFT|FL_ALIGN_BOTTOM); // back compatability? + hscrollbar.callback(hscrollbar_callback); + hscrollbar.type(FL_HORIZONTAL); + textfont_ = FL_HELVETICA; + textsize_ = (uchar)FL_NORMAL_SIZE; + textcolor_ = FL_FOREGROUND_COLOR; + has_scrollbar_ = BOTH; + max_width = 0; + max_width_item = 0; + redraw1 = redraw2 = 0; + end(); +} + +// Default versions of some of the virtual functions: + +int Fl_Browser_::item_quick_height(void* l) const { + return item_height(l); +} + +int Fl_Browser_::incr_height() const { + return item_quick_height(item_first()); +} + +int Fl_Browser_::full_height() const { + int t = 0; + for (void* p = item_first(); p; p = item_next(p)) + t += item_quick_height(p); + return t; +} + +int Fl_Browser_::full_width() const { + return max_width; +} + +void Fl_Browser_::item_select(void*, int) {} + +int Fl_Browser_::item_selected(void* l) const {return l==selection_;} + +// +// End of "$Id: Fl_Browser_.cxx 5992 2007-12-15 16:20:16Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Browser_load.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Browser_load.cxx new file mode 100644 index 0000000..f0ee771 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Browser_load.cxx @@ -0,0 +1,57 @@ +// +// "$Id: Fl_Browser_load.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// File loading routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include + +int Fl_Browser::load(const char *filename) { +#define MAXFL_BLINE 1024 + char newtext[MAXFL_BLINE]; + int c; + int i; + clear(); + if (!filename || !(filename[0])) return 1; + FILE *fl = fopen(filename,"r"); + if (!fl) return 0; + i = 0; + do { + c = getc(fl); + if (c == '\n' || c <= 0 || i>=(MAXFL_BLINE-1)) { + newtext[i] = 0; + add(newtext); + i = 0; + } else + newtext[i++] = c; + } while (c >= 0); + fclose(fl); + return 1; +} + +// +// End of "$Id: Fl_Browser_load.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Button.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Button.cxx new file mode 100644 index 0000000..3f480d1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Button.cxx @@ -0,0 +1,175 @@ +// +// "$Id: Fl_Button.cxx 6589 2008-12-17 10:47:09Z fabien $" +// +// Button widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include + +// There are a lot of subclasses, named Fl_*_Button. Some of +// them are implemented by setting the type() value and testing it +// here. This includes Fl_Radio_Button and Fl_Toggle_Button + +int Fl_Button::value(int v) { + v = v ? 1 : 0; + oldval = v; + clear_changed(); + if (value_ != v) { + value_ = v; + if (box()) redraw(); + else redraw_label(); + return 1; + } else { + return 0; + } +} + +void Fl_Button::setonly() { // set this radio button on, turn others off + value(1); + Fl_Group* g = (Fl_Group*)parent(); + Fl_Widget*const* a = g->array(); + for (int i = g->children(); i--;) { + Fl_Widget* o = *a++; + if (o != this && o->type()==FL_RADIO_BUTTON) ((Fl_Button*)o)->value(0); + } +} + +void Fl_Button::draw() { + if (type() == FL_HIDDEN_BUTTON) return; + Fl_Color col = value() ? selection_color() : color(); + draw_box(value() ? (down_box()?down_box():fl_down(box())) : box(), col); + if (labeltype() == FL_NORMAL_LABEL && value()) { + Fl_Color c = labelcolor(); + labelcolor(fl_contrast(c, col)); + draw_label(); + labelcolor(c); + } else draw_label(); + if (Fl::focus() == this) draw_focus(); +} + +int Fl_Button::handle(int event) { + int newval; + switch (event) { + case FL_ENTER: + case FL_LEAVE: +// if ((value_?selection_color():color())==FL_GRAY) redraw(); + return 1; + case FL_PUSH: + if (Fl::visible_focus() && handle(FL_FOCUS)) Fl::focus(this); + case FL_DRAG: + if (Fl::event_inside(this)) { + if (type() == FL_RADIO_BUTTON) newval = 1; + else newval = !oldval; + } else + { + clear_changed(); + newval = oldval; + } + if (newval != value_) { + value_ = newval; + set_changed(); + redraw(); + if (when() & FL_WHEN_CHANGED) do_callback(); + } + return 1; + case FL_RELEASE: + if (value_ == oldval) { + if (when() & FL_WHEN_NOT_CHANGED) do_callback(); + return 1; + } + set_changed(); + if (type() == FL_RADIO_BUTTON) setonly(); + else if (type() == FL_TOGGLE_BUTTON) oldval = value_; + else { + value(oldval); + set_changed(); + if (when() & FL_WHEN_CHANGED) do_callback(); + } + if (when() & FL_WHEN_RELEASE) do_callback(); + return 1; + case FL_SHORTCUT: + if (!(shortcut() ? + Fl::test_shortcut(shortcut()) : test_shortcut())) return 0; + + if (Fl::visible_focus() && handle(FL_FOCUS)) Fl::focus(this); + + if (type() == FL_RADIO_BUTTON && !value_) { + setonly(); + set_changed(); + if (when() & (FL_WHEN_CHANGED|FL_WHEN_RELEASE)) + do_callback(); + } else if (type() == FL_TOGGLE_BUTTON) { + value(!value()); + set_changed(); + if (when() & (FL_WHEN_CHANGED|FL_WHEN_RELEASE)) + do_callback(); + } else if (when() & FL_WHEN_RELEASE) do_callback(); + return 1; + case FL_FOCUS : + case FL_UNFOCUS : + if (Fl::visible_focus()) { + if (box() == FL_NO_BOX) { + // Widgets with the FL_NO_BOX boxtype need a parent to + // redraw, since it is responsible for redrawing the + // background... + int X = x() > 0 ? x() - 1 : 0; + int Y = y() > 0 ? y() - 1 : 0; + if (window()) window()->damage(FL_DAMAGE_ALL, X, Y, w() + 2, h() + 2); + } else redraw(); + return 1; + } else return 0; + case FL_KEYBOARD : + if (Fl::focus() == this && Fl::event_key() == ' ' && + !(Fl::event_state() & (FL_SHIFT | FL_CTRL | FL_ALT | FL_META))) { + set_changed(); + if (type() == FL_RADIO_BUTTON && !value_) { + setonly(); + if (when() & FL_WHEN_CHANGED) do_callback(); + } else if (type() == FL_TOGGLE_BUTTON) { + value(!value()); + if (when() & FL_WHEN_CHANGED) do_callback(); + } + if (when() & FL_WHEN_RELEASE) do_callback(); + return 1; + } + default: + return 0; + } +} + +Fl_Button::Fl_Button(int X, int Y, int W, int H, const char *l) +: Fl_Widget(X,Y,W,H,l) { + box(FL_UP_BOX); + down_box(FL_NO_BOX); + value_ = oldval = 0; + shortcut_ = 0; + set_flag(SHORTCUT_LABEL); +} + +// +// End of "$Id: Fl_Button.cxx 6589 2008-12-17 10:47:09Z fabien $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Chart.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Chart.cxx new file mode 100644 index 0000000..003a892 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Chart.cxx @@ -0,0 +1,390 @@ +// +// "$Id: Fl_Chart.cxx 5942 2007-10-06 17:33:17Z matt $" +// +// Forms-compatible chart widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include "flstring.h" +#include + +#define ARCINC (2.0*M_PI/360.0) + +// this function is in fl_boxtype.cxx: +void fl_rectbound(int x,int y,int w,int h, Fl_Color color); + +/* Widget specific information */ + +static void draw_barchart(int x,int y,int w,int h, + int numb, FL_CHART_ENTRY entries[], + double min, double max, int autosize, int maxnumb, + Fl_Color textcolor) +/* Draws a bar chart. x,y,w,h is the bounding box, entries the array of + numb entries and min and max the boundaries. */ +{ + double incr; + int zeroh; + double lh = fl_height(); + if (max == min) incr = h; + else incr = h/(max-min); + if ( (-min*incr) < lh) { + incr = (h - lh + min*incr)/(max-min); + zeroh = int(y+h-lh); + } else { + zeroh = (int)rint(y+h+min * incr); + } + int bwidth = (int)rint(w/double(autosize?numb:maxnumb)); + /* Draw base line */ + fl_color(textcolor); + fl_line(x, zeroh, x+w, zeroh); + if (min == 0.0 && max == 0.0) return; /* Nothing else to draw */ + int i; + /* Draw the bars */ + for (i=0; i 0) + fl_rectbound(x+i*bwidth,zeroh-hh,bwidth+1,hh+1,(Fl_Color)entries[i].col); + } + /* Draw the labels */ + fl_color(textcolor); + for (i=0; i lw) lw = w1; + } + if (lw > 0.0) lw += 4.0; + double incr; + int zeroh; + if (max == min) incr = w; + else incr = w/(max-min); + if ( (-min*incr) < lw) { + incr = (w - lw + min*incr)/(max-min); + zeroh = x+(int)rint(lw); + } else { + zeroh = (int)rint(x-min * incr); + } + int bwidth = (int)rint(h/double(autosize?numb:maxnumb)); + /* Draw base line */ + fl_color(textcolor); + fl_line(zeroh, y, zeroh, y+h); + if (min == 0.0 && max == 0.0) return; /* Nothing else to draw */ + /* Draw the bars */ + for (i=0; i 0) + fl_rectbound(zeroh,y+i*bwidth,ww+1,bwidth+1, (Fl_Color)entries[i].col); + else if (ww < 0) + fl_rectbound(zeroh+ww,y+i*bwidth,-ww+1,bwidth+1,(Fl_Color)entries[i].col); + } + /* Draw the labels */ + fl_color(textcolor); + for (i=0; i0.0)!=(entries[i].val>0.0)) { + double ttt = entries[i-1].val/(entries[i-1].val-entries[i].val); + int xt = x + (int)rint((i-.5+ttt)*bwidth); + fl_polygon(x0,zeroh, x0,yy0, xt,zeroh); + fl_polygon(xt,zeroh, x1,yy1, x1,zeroh); + } else { + fl_polygon(x0,zeroh, x0,yy0, x1,yy1, x1,zeroh); + } + fl_color(textcolor); + fl_line(x0,yy0,x1,yy1); + } + } + /* Draw base line */ + fl_color(textcolor); + fl_line(x,zeroh,x+w,zeroh); + /* Draw the labels */ + for (i=0; i=0 ? FL_ALIGN_BOTTOM : FL_ALIGN_TOP); +} + +static void draw_piechart(int x,int y,int w,int h, + int numb, FL_CHART_ENTRY entries[], int special, + Fl_Color textcolor) +/* Draws a pie chart. x,y,w,h is the bounding box, entries the array of + numb entries */ +{ + int i; + double xc,yc,rad; /* center and radius */ + double tot; /* sum of values */ + double incr; /* increment in angle */ + double curang; /* current angle we are drawing */ + double txc,tyc; /* temporary center */ + double lh = fl_height(); + /* compute center and radius */ + double h_denom = (special ? 2.3 : 2.0); + rad = (h - 2*lh)/h_denom/1.1; + xc = x+w/2.0; yc = y+h-1.1*rad-lh; + /* compute sum of values */ + tot = 0.0; + for (i=0; i 0.0) tot += entries[i].val; + if (tot == 0.0) return; + incr = 360.0/tot; + /* Draw the pie */ + curang = 0.0; + for (i=0; i 0.0) + { + txc = xc; tyc = yc; + /* Correct for special pies */ + if (special && i==0) + { + txc += 0.3*rad*cos(ARCINC*(curang+0.5*incr*entries[i].val)); + tyc -= 0.3*rad*sin(ARCINC*(curang+0.5*incr*entries[i].val)); + } + fl_color((Fl_Color)entries[i].col); + fl_begin_polygon(); fl_vertex(txc,tyc); + fl_arc(txc,tyc,rad,curang, curang+incr*entries[i].val); + fl_end_polygon(); + fl_color(textcolor); + fl_begin_loop(); fl_vertex(txc,tyc); + fl_arc(txc,tyc,rad,curang, curang+incr*entries[i].val); + fl_end_loop(); + curang += 0.5 * incr * entries[i].val; + /* draw the label */ + double xl = txc + 1.1*rad*cos(ARCINC*curang); + fl_draw(entries[i].str, + (int)rint(xl), + (int)rint(tyc - 1.1*rad*sin(ARCINC*curang)), + 0, 0, + xl= max) { + min = max = 0.0; + for (int i=0; i max) max = entries[i].val; + } + } + + fl_font(textfont(),textsize()); + + switch (type()) { + case FL_BAR_CHART: + ww++; // makes the bars fill box correctly + draw_barchart(xx,yy,ww,hh, numb, entries, min, max, + autosize(), maxnumb, textcolor()); + break; + case FL_HORBAR_CHART: + hh++; // makes the bars fill box correctly + draw_horbarchart(xx,yy,ww,hh, numb, entries, min, max, + autosize(), maxnumb, textcolor()); + break; + case FL_PIE_CHART: + draw_piechart(xx,yy,ww,hh,numb,entries,0, textcolor()); + break; + case FL_SPECIALPIE_CHART: + draw_piechart(xx,yy,ww,hh,numb,entries,1,textcolor()); + break; + default: + draw_linechart(type(),xx,yy,ww,hh, numb, entries, min, max, + autosize(), maxnumb, textcolor()); + break; + } + draw_label(); + fl_pop_clip(); +} + +/*------------------------------*/ + +#define FL_CHART_BOXTYPE FL_BORDER_BOX +#define FL_CHART_COL1 FL_COL1 +#define FL_CHART_LCOL FL_LCOL +#define FL_CHART_ALIGN FL_ALIGN_BOTTOM + +Fl_Chart::Fl_Chart(int X, int Y, int W, int H,const char *l) : +Fl_Widget(X,Y,W,H,l) { + box(FL_BORDER_BOX); + align(FL_ALIGN_BOTTOM); + numb = 0; + maxnumb = 0; + sizenumb = FL_CHART_MAX; + autosize_ = 1; + min = max = 0; + textfont_ = FL_HELVETICA; + textsize_ = 10; + textcolor_ = FL_FOREGROUND_COLOR; + entries = (FL_CHART_ENTRY *)calloc(sizeof(FL_CHART_ENTRY), FL_CHART_MAX + 1); +} + +Fl_Chart::~Fl_Chart() { + free(entries); +} + +void Fl_Chart::clear() { + numb = 0; + redraw(); +} + +void Fl_Chart::add(double val, const char *str, unsigned col) { + /* Allocate more entries if required */ + if (numb >= sizenumb) { + sizenumb += FL_CHART_MAX; + entries = (FL_CHART_ENTRY *)realloc(entries, sizeof(FL_CHART_ENTRY) * (sizenumb + 1)); + } + // Shift entries as needed + if (numb >= maxnumb && maxnumb > 0) { + memmove(entries, entries + 1, sizeof(FL_CHART_ENTRY) * (numb - 1)); + numb --; + } + entries[numb].val = float(val); + entries[numb].col = col; + if (str) { + strlcpy(entries[numb].str,str,FL_CHART_LABEL_MAX + 1); + } else { + entries[numb].str[0] = 0; + } + numb++; + redraw(); +} + +void Fl_Chart::insert(int ind, double val, const char *str, unsigned col) { + int i; + if (ind < 1 || ind > numb+1) return; + /* Allocate more entries if required */ + if (numb >= sizenumb) { + sizenumb += FL_CHART_MAX; + entries = (FL_CHART_ENTRY *)realloc(entries, sizeof(FL_CHART_ENTRY) * (sizenumb + 1)); + } + // Shift entries as needed + for (i=numb; i >= ind; i--) entries[i] = entries[i-1]; + if (numb < maxnumb || maxnumb == 0) numb++; + /* Fill in the new entry */ + entries[ind-1].val = float(val); + entries[ind-1].col = col; + if (str) { + strlcpy(entries[ind-1].str,str,FL_CHART_LABEL_MAX+1); + } else { + entries[ind-1].str[0] = 0; + } + redraw(); +} + +void Fl_Chart::replace(int ind,double val, const char *str, unsigned col) { + if (ind < 1 || ind > numb) return; + entries[ind-1].val = float(val); + entries[ind-1].col = col; + if (str) { + strlcpy(entries[ind-1].str,str,FL_CHART_LABEL_MAX+1); + } else { + entries[ind-1].str[0] = 0; + } + redraw(); +} + +void Fl_Chart::bounds(double mymin, double mymax) { + this->min = mymin; + this->max = mymax; + redraw(); +} + +void Fl_Chart::maxsize(int m) { + int i; + /* Fill in the new number */ + if (m < 0) return; + maxnumb = m; + /* Shift entries if required */ + if (numb > maxnumb) { + for (i = 0; i +#include +#include "flstring.h" +#include +#include + +/* This uses a cache for faster access when you're scanning the list +either forwards or backwards. */ + +Fl_Check_Browser::cb_item *Fl_Check_Browser::find_item(int n) const { + int i = n; + cb_item *p = first; + + if (n <= 0 || n > nitems_ || p == 0) { + return 0; + } + + if (n == cached_item) { + p = cache; + n = 1; + } else if (n == cached_item + 1) { + p = cache->next; + n = 1; + } else if (n == cached_item - 1) { + p = cache->prev; + n = 1; + } + + while (--n) { + p = p->next; + } + + /* Cast to not const and cache it. */ + + ((Fl_Check_Browser *)this)->cache = p; + ((Fl_Check_Browser *)this)->cached_item = i; + + return p; +} + +int Fl_Check_Browser::lineno(cb_item *p0) const { + cb_item *p = first; + + if (p == 0) { + return 0; + } + + int i = 1; + while (p) { + if (p == p0) { + return i; + } + i++; + p = p->next; + } + + return 0; +} + +Fl_Check_Browser::Fl_Check_Browser(int X, int Y, int W, int H, const char *l) + : Fl_Browser_(X, Y, W, H, l) { + type(FL_SELECT_BROWSER); + when(FL_WHEN_NEVER); + first = last = 0; + nitems_ = nchecked_ = 0; + cached_item = -1; +} + +void *Fl_Check_Browser::item_first() const { + return first; +} + +void *Fl_Check_Browser::item_next(void *l) const { + return ((cb_item *)l)->next; +} + +void *Fl_Check_Browser::item_prev(void *l) const { + return ((cb_item *)l)->prev; +} + +int Fl_Check_Browser::item_height(void *) const { + return textsize() + 2; +} + +#define CHECK_SIZE (textsize()-2) + +int Fl_Check_Browser::item_width(void *v) const { + fl_font(textfont(), textsize()); + return int(fl_width(((cb_item *)v)->text)) + CHECK_SIZE + 8; +} + +void Fl_Check_Browser::item_draw(void *v, int X, int Y, int, int) const { + cb_item *i = (cb_item *)v; + char *s = i->text; + int tsize = textsize(); + Fl_Color col = active_r() ? textcolor() : fl_inactive(textcolor()); + int cy = Y + (tsize + 1 - CHECK_SIZE) / 2; + X += 2; + + fl_color(active_r() ? FL_FOREGROUND_COLOR : fl_inactive(FL_FOREGROUND_COLOR)); + fl_loop(X, cy, X, cy + CHECK_SIZE, + X + CHECK_SIZE, cy + CHECK_SIZE, X + CHECK_SIZE, cy); + if (i->checked) { + int tx = X + 3; + int tw = CHECK_SIZE - 4; + int d1 = tw/3; + int d2 = tw-d1; + int ty = cy + (CHECK_SIZE+d2)/2-d1-2; + for (int n = 0; n < 3; n++, ty++) { + fl_line(tx, ty, tx+d1, ty+d1); + fl_line(tx+d1, ty+d1, tx+tw-1, ty+d1-d2+1); + } + } + fl_font(textfont(), tsize); + if (i->selected) { + col = fl_contrast(col, selection_color()); + } + fl_color(col); + fl_draw(s, X + CHECK_SIZE + 8, Y + tsize - 1); +} + +void Fl_Check_Browser::item_select(void *v, int state) { + cb_item *i = (cb_item *)v; + + if (state) { + if (i->checked) { + i->checked = 0; + nchecked_--; + } else { + i->checked = 1; + nchecked_++; + } + } +} + +int Fl_Check_Browser::item_selected(void *v) const { + cb_item *i = (cb_item *)v; + return i->selected; +} + +int Fl_Check_Browser::add(char *s) { + return (add(s, 0)); +} + +int Fl_Check_Browser::add(char *s, int b) { + cb_item *p = (cb_item *)malloc(sizeof(cb_item)); + p->next = 0; + p->prev = 0; + p->checked = b; + p->selected = 0; + p->text = strdup(s); + + if (b) { + nchecked_++; + } + + if (last == 0) { + first = last = p; + } else { + last->next = p; + p->prev = last; + last = p; + } + nitems_++; + + return (nitems_); +} + +int Fl_Check_Browser::remove(int item) { + cb_item *p = find_item(item); + + // line at item exists + if(p) { + // tell the Browser_ what we will do + deleting(p); + + // fix checked count + if(p->checked) + --nchecked_; + + // remove the node + if (p->prev) + p->prev->next = p->next; + else + first = p->next; + if (p->next) + p->next->prev = p->prev; + else + last = p->prev; + + free(p->text); + free(p); + + --nitems_; + cached_item = -1; + } + + return (nitems_); +} + +void Fl_Check_Browser::clear() { + cb_item *p = first; + cb_item *next; + + if (p == 0) { + return; + } + + new_list(); + do { + next = p->next; + free(p->text); + free(p); + p = next; + } while (p); + + first = last = 0; + nitems_ = nchecked_ = 0; + cached_item = -1; +} + +int Fl_Check_Browser::checked(int i) const { + cb_item *p = find_item(i); + + if (p) return p->checked; + return 0; +} + +void Fl_Check_Browser::checked(int i, int b) { + cb_item *p = find_item(i); + + if (p && (p->checked ^ b)) { + p->checked = b; + if (b) { + nchecked_++; + } else { + nchecked_--; + } + redraw(); + } +} + +int Fl_Check_Browser::value() const { + return lineno((cb_item *)selection()); +} + +char *Fl_Check_Browser::text(int i) const { + cb_item *p = find_item(i); + + if (p) return p->text; + return 0; +} + +void Fl_Check_Browser::check_all() { + cb_item *p; + + nchecked_ = nitems_; + for (p = first; p; p = p->next) { + p->checked = 1; + } + redraw(); +} + +void Fl_Check_Browser::check_none() { + cb_item *p; + + nchecked_ = 0; + for (p = first; p; p = p->next) { + p->checked = 0; + } + redraw(); +} + +int Fl_Check_Browser::handle(int event) { + if (event==FL_PUSH) + deselect(); + return Fl_Browser_::handle(event); +} + +// +// End of "$Id: Fl_Check_Browser.cxx 5985 2007-11-20 21:15:08Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Check_Button.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Check_Button.cxx new file mode 100644 index 0000000..3c2643d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Check_Button.cxx @@ -0,0 +1,40 @@ +// +// "$Id: Fl_Check_Button.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Check button widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include + +// A subclass of Fl_Button that always draws as a diamond box. This +// diamond is smaller than the widget size and can be surchecked by +// another box type, for compatability with Forms. + +Fl_Check_Button::Fl_Check_Button(int X, int Y, int W, int H, const char *l) +: Fl_Light_Button(X, Y, W, H, l) { + box(FL_NO_BOX); + down_box(FL_DOWN_BOX); + selection_color(FL_FOREGROUND_COLOR); +} diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Choice.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Choice.cxx new file mode 100644 index 0000000..e742a10 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Choice.cxx @@ -0,0 +1,191 @@ +// +// "$Id: Fl_Choice.cxx 6872 2009-09-16 07:04:37Z AlbrechtS $" +// +// Choice widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include "flstring.h" + +// Emulates the Forms choice widget. This is almost exactly the same +// as an Fl_Menu_Button. The only difference is the appearance of the +// button: it draws the text of the current pick and a down-arrow. + +void Fl_Choice::draw() { + int dx = Fl::box_dx(FL_DOWN_BOX); + int dy = Fl::box_dy(FL_DOWN_BOX); + int H = h() - 2 * dy; + int W = (H > 20) ? 20 : H; + int X = x() + w() - W - dx; + int Y = y() + dy; + int w1 = (W - 4) / 3; if (w1 < 1) w1 = 1; + int x1 = X + (W - 2 * w1 - 1) / 2; + int y1 = Y + (H - w1 - 1) / 2; + + if (Fl::scheme()) { + draw_box(FL_UP_BOX, color()); + + fl_color(active_r() ? labelcolor() : fl_inactive(labelcolor())); + if (!strcmp(Fl::scheme(), "plastic")) { + // Show larger up/down arrows... + fl_polygon(x1, y1 + 3, x1 + w1, y1 + w1 + 3, x1 + 2 * w1, y1 + 3); + fl_polygon(x1, y1 + 1, x1 + w1, y1 - w1 + 1, x1 + 2 * w1, y1 + 1); + } else { + // Show smaller up/down arrows with a divider... + x1 = x() + w() - 13 - dx; + y1 = y() + h() / 2; + fl_polygon(x1, y1 - 2, x1 + 3, y1 - 5, x1 + 6, y1 - 2); + fl_polygon(x1, y1 + 2, x1 + 3, y1 + 5, x1 + 6, y1 + 2); + + fl_color(fl_darker(color())); + fl_yxline(x1 - 7, y1 - 8, y1 + 8); + + fl_color(fl_lighter(color())); + fl_yxline(x1 - 6, y1 - 8, y1 + 8); + } + } else { + if (fl_contrast(textcolor(), FL_BACKGROUND2_COLOR) == textcolor()) { + draw_box(FL_DOWN_BOX, FL_BACKGROUND2_COLOR); + } else { + draw_box(FL_DOWN_BOX, fl_lighter(color())); + } + draw_box(FL_UP_BOX,X,Y,W,H,color()); + + fl_color(active_r() ? labelcolor() : fl_inactive(labelcolor())); + fl_polygon(x1, y1, x1 + w1, y1 + w1, x1 + 2 * w1, y1); + } + + W += 2 * dx; + + if (mvalue()) { + Fl_Menu_Item m = *mvalue(); + if (active_r()) m.activate(); else m.deactivate(); + + // ERCO + int xx = x() + dx, yy = y() + dy + 1, ww = w() - W, hh = H - 2; + + fl_clip(xx, yy, ww, hh); + + if ( Fl::scheme()) { + Fl_Label l; + l.value = m.text; + l.image = 0; + l.deimage = 0; + l.type = m.labeltype_; + l.font = m.labelsize_ || m.labelfont_ ? m.labelfont_ : uchar(textfont()); + l.size = m.labelsize_ ? m.labelsize_ : textsize(); + l.color= m.labelcolor_ ? m.labelcolor_ : textcolor(); + if (!m.active()) l.color = fl_inactive((Fl_Color)l.color); + fl_draw_shortcut = 2; // hack value to make '&' disappear + l.draw(xx+3, yy, ww>6 ? ww-6 : 0, hh, FL_ALIGN_LEFT); + fl_draw_shortcut = 0; + if ( Fl::focus() == this ) draw_focus(box(), xx, yy, ww, hh); + } + else { + fl_draw_shortcut = 2; // hack value to make '&' disappear + m.draw(xx, yy, ww, hh, this, Fl::focus() == this); + fl_draw_shortcut = 0; + } + + fl_pop_clip(); + } + + draw_label(); +} + +Fl_Choice::Fl_Choice(int X, int Y, int W, int H, const char *l) +: Fl_Menu_(X,Y,W,H,l) { + align(FL_ALIGN_LEFT); + when(FL_WHEN_RELEASE); + textfont(FL_HELVETICA); + box(FL_FLAT_BOX); + down_box(FL_BORDER_BOX); +} + +int Fl_Choice::value(const Fl_Menu_Item *v) { + if (!Fl_Menu_::value(v)) return 0; + redraw(); + return 1; +} + +int Fl_Choice::value(int v) { + if (v == -1) return value((const Fl_Menu_Item *)0); + if (v < 0 || v >= (size() - 1)) return 0; + if (!Fl_Menu_::value(v)) return 0; + redraw(); + return 1; +} + +int Fl_Choice::handle(int e) { + if (!menu() || !menu()->text) return 0; + const Fl_Menu_Item* v; + switch (e) { + case FL_ENTER: + case FL_LEAVE: + return 1; + + case FL_KEYBOARD: + if (Fl::event_key() != ' ' || + (Fl::event_state() & (FL_SHIFT | FL_CTRL | FL_ALT | FL_META))) return 0; + case FL_PUSH: + if (Fl::visible_focus()) Fl::focus(this); + J1: + if (Fl::scheme() + || fl_contrast(textcolor(), FL_BACKGROUND2_COLOR) != textcolor()) { + v = menu()->pulldown(x(), y(), w(), h(), mvalue(), this); + } else { + // In order to preserve the old look-n-feel of "white" menus, + // temporarily override the color() of this widget... + Fl_Color c = color(); + color(FL_BACKGROUND2_COLOR); + v = menu()->pulldown(x(), y(), w(), h(), mvalue(), this); + color(c); + } + if (!v || v->submenu()) return 1; + if (v != mvalue()) redraw(); + picked(v); + return 1; + case FL_SHORTCUT: + if (Fl_Widget::test_shortcut()) goto J1; + v = menu()->test_shortcut(); + if (!v) return 0; + if (v != mvalue()) redraw(); + picked(v); + return 1; + case FL_FOCUS: + case FL_UNFOCUS: + if (Fl::visible_focus()) { + redraw(); + return 1; + } else return 0; + default: + return 0; + } +} + +// +// End of "$Id: Fl_Choice.cxx 6872 2009-09-16 07:04:37Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Clock.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Clock.cxx new file mode 100644 index 0000000..fb46384 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Clock.cxx @@ -0,0 +1,177 @@ +// +// "$Id: Fl_Clock.cxx 5472 2006-09-20 03:03:14Z mike $" +// +// Clock widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#ifndef WIN32 +# include +#endif /* !WIN32 */ + +// Original clock display written by Paul Haeberli at SGI. +// Modifications by Mark Overmars for Forms +// Further changes by Bill Spitzak for fltk + +const float hourhand[4][2] = {{-0.5f, 0}, {0, 1.5f}, {0.5f, 0}, {0, -7.0f}}; +const float minhand[4][2] = {{-0.5f, 0}, {0, 1.5f}, {0.5f, 0}, {0, -11.5f}}; +const float sechand[4][2] = {{-0.1f, 0}, {0, 2.0f}, {0.1f, 0}, {0, -11.5f}}; + +static void drawhand(double ang,const float v[][2],Fl_Color fill,Fl_Color line) +{ + fl_push_matrix(); + fl_rotate(ang); + fl_color(fill); fl_begin_polygon(); + int i; for (i=0; i<4; i++) fl_vertex(v[i][0],v[i][1]); fl_end_polygon(); + fl_color(line); fl_begin_loop(); + for (i=0; i<4; i++) fl_vertex(v[i][0],v[i][1]); fl_end_loop(); + fl_pop_matrix(); +} + +void Fl_Clock_Output::drawhands(Fl_Color fill, Fl_Color line) { + if (!active_r()) { + fill = fl_inactive(fill); + line = fl_inactive(line); + } + drawhand(-360*(hour()+minute()/60.0)/12, hourhand, fill, line); + drawhand(-360*(minute()+second()/60.0)/60, minhand, fill, line); + drawhand(-360*(second()/60.0), sechand, fill, line); +} + +static void rect(double x, double y, double w, double h) { + double r = x+w; + double t = y+h; + fl_begin_polygon(); + fl_vertex(x, y); + fl_vertex(r, y); + fl_vertex(r, t); + fl_vertex(x, t); + fl_end_polygon(); +} + +void Fl_Clock_Output::draw(int X, int Y, int W, int H) { + Fl_Color box_color = type()==FL_ROUND_CLOCK ? FL_GRAY : color(); + Fl_Color shadow_color = fl_color_average(box_color, FL_BLACK, 0.5); + draw_box(box(), X, Y, W, H, box_color); + fl_push_matrix(); + fl_translate(X+W/2.0-.5, Y+H/2.0-.5); + fl_scale((W-1)/28.0, (H-1)/28.0); + if (type() == FL_ROUND_CLOCK) { + fl_color(active_r() ? color() : fl_inactive(color())); + fl_begin_polygon(); fl_circle(0,0,14); fl_end_polygon(); + fl_color(active_r() ? FL_FOREGROUND_COLOR : fl_inactive(FL_FOREGROUND_COLOR)); + fl_begin_loop(); fl_circle(0,0,14); fl_end_loop(); + } + // draw the shadows: + fl_push_matrix(); + fl_translate(0.60, 0.60); + drawhands(shadow_color, shadow_color); + fl_pop_matrix(); + // draw the tick marks: + fl_push_matrix(); + fl_color(active_r() ? FL_FOREGROUND_COLOR : fl_inactive(FL_FOREGROUND_COLOR)); + for (int i=0; i<12; i++) { + if (i==6) rect(-0.5, 9, 1, 2); + else if (i==3 || i==0 || i== 9) rect(-0.5, 9.5, 1, 1); + else rect(-0.25, 9.5, .5, 1); + fl_rotate(-30); + } + fl_pop_matrix(); + // draw the hands: + drawhands(selection_color(), FL_FOREGROUND_COLOR); // color was 54 + fl_pop_matrix(); +} + +void Fl_Clock_Output::draw() { + draw(x(), y(), w(), h()); + draw_label(); +} + +void Fl_Clock_Output::value(int H, int m, int s) { + if (H!=hour_ || m!=minute_ || s!=second_) { + hour_ = H; minute_ = m; second_ = s; + value_ = (H * 60 + m) * 60 + s; + damage(FL_DAMAGE_CHILD); + } +} + +void Fl_Clock_Output::value(ulong v) { + value_ = v; + struct tm *timeofday; + // Some platforms, notably Windows, now use a 64-bit time_t value... + time_t vv = (time_t)v; + timeofday = localtime(&vv); + value(timeofday->tm_hour, timeofday->tm_min, timeofday->tm_sec); +} + +Fl_Clock_Output::Fl_Clock_Output(int X, int Y, int W, int H, const char *l) +: Fl_Widget(X, Y, W, H, l) { + box(FL_UP_BOX); + selection_color(fl_gray_ramp(5)); + align(FL_ALIGN_BOTTOM); + hour_ = 0; + minute_ = 0; + second_ = 0; + value_ = 0; +} + +//////////////////////////////////////////////////////////////// + +Fl_Clock::Fl_Clock(int X, int Y, int W, int H, const char *l) + : Fl_Clock_Output(X, Y, W, H, l) {} + +Fl_Clock::Fl_Clock(uchar t, int X, int Y, int W, int H, const char *l) + : Fl_Clock_Output(X, Y, W, H, l) { + type(t); + box(t==FL_ROUND_CLOCK ? FL_NO_BOX : FL_UP_BOX); +} + +static void tick(void *v) { + ((Fl_Clock*)v)->value(time(0)); + Fl::add_timeout(1.0, tick, v); +} + +int Fl_Clock::handle(int event) { + switch (event) { + case FL_SHOW: + tick(this); + break; + case FL_HIDE: + Fl::remove_timeout(tick, this); + break; + } + return Fl_Clock_Output::handle(event); +} + +Fl_Clock::~Fl_Clock() { + Fl::remove_timeout(tick, this); +} + +// +// End of "$Id: Fl_Clock.cxx 5472 2006-09-20 03:03:14Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Color_Chooser.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Color_Chooser.cxx new file mode 100644 index 0000000..212a8bd --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Color_Chooser.cxx @@ -0,0 +1,529 @@ +// +// "$Id: Fl_Color_Chooser.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Color chooser for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +// Besides being a useful object on it's own, the Fl_Color_Chooser was +// an attempt to make a complex composite object that could be easily +// imbedded into a user interface. If you wish to make complex objects +// of your own, be sure to read this code. + +// The function fl_color_chooser() creates a window containing a color +// chooser and a few buttons and current-color indicators. It is an +// easier interface for simple programs that just need a color. + +// The "hue box" can be a circle or rectilinear. +// You get a circle by defining this: +#define CIRCLE 1 +// And the "hue box" can auto-update when the value changes +// you get this by defining this: +#define UPDATE_HUE_BOX 1 + +void Fl_Color_Chooser::hsv2rgb( + double H, double S, double V, double& R, double& G, double& B) { + if (S < 5.0e-6) { + R = G = B = V; + } else { + int i = (int)H; + double f = H - (float)i; + double p1 = V*(1.0-S); + double p2 = V*(1.0-S*f); + double p3 = V*(1.0-S*(1.0-f)); + switch (i) { + case 0: R = V; G = p3; B = p1; break; + case 1: R = p2; G = V; B = p1; break; + case 2: R = p1; G = V; B = p3; break; + case 3: R = p1; G = p2; B = V; break; + case 4: R = p3; G = p1; B = V; break; + case 5: R = V; G = p1; B = p2; break; + } + } +} + +void Fl_Color_Chooser::rgb2hsv( + double R, double G, double B, double& H, double& S, double& V) { + double maxv = R > G ? R : G; if (B > maxv) maxv = B; + V = maxv; + if (maxv>0) { + double minv = R < G ? R : G; if (B < minv) minv = B; + S = 1.0 - double(minv)/maxv; + if (maxv > minv) { + if (maxv == R) {H = (G-B)/double(maxv-minv); if (H<0) H += 6.0;} + else if (maxv == G) H = 2.0+(B-R)/double(maxv-minv); + else H = 4.0+(R-G)/double(maxv-minv); + } + } +} + +enum {M_RGB, M_BYTE, M_HEX, M_HSV}; // modes +static Fl_Menu_Item mode_menu[] = { + {"rgb"}, + {"byte"}, + {"hex"}, + {"hsv"}, + {0} +}; + +int Flcc_Value_Input::format(char* buf) { + Fl_Color_Chooser* c = (Fl_Color_Chooser*)parent(); + if (c->mode() == M_HEX) return sprintf(buf,"0x%02X", int(value())); + else return Fl_Valuator::format(buf); +} + +void Fl_Color_Chooser::set_valuators() { + switch (mode()) { + case M_RGB: + rvalue.range(0,1); rvalue.step(1,1000); rvalue.value(r_); + gvalue.range(0,1); gvalue.step(1,1000); gvalue.value(g_); + bvalue.range(0,1); bvalue.step(1,1000); bvalue.value(b_); + break; + case M_BYTE: + case M_HEX: + rvalue.range(0,255); rvalue.step(1); rvalue.value(int(255*r_+.5)); + gvalue.range(0,255); gvalue.step(1); gvalue.value(int(255*g_+.5)); + bvalue.range(0,255); bvalue.step(1); bvalue.value(int(255*b_+.5)); + break; + case M_HSV: + rvalue.range(0,6); rvalue.step(1,1000); rvalue.value(hue_); + gvalue.range(0,1); gvalue.step(1,1000); gvalue.value(saturation_); + bvalue.range(0,1); bvalue.step(1,1000); bvalue.value(value_); + break; + } +} + +int Fl_Color_Chooser::rgb(double R, double G, double B) { + if (R == r_ && G == g_ && B == b_) return 0; + r_ = R; g_ = G; b_ = B; + double ph = hue_; + double ps = saturation_; + double pv = value_; + rgb2hsv(R,G,B,hue_,saturation_,value_); + set_valuators(); + set_changed(); + if (value_ != pv) { +#ifdef UPDATE_HUE_BOX + huebox.damage(FL_DAMAGE_SCROLL); +#endif + valuebox.damage(FL_DAMAGE_EXPOSE);} + if (hue_ != ph || saturation_ != ps) { + huebox.damage(FL_DAMAGE_EXPOSE); + valuebox.damage(FL_DAMAGE_SCROLL); + } + return 1; +} + +int Fl_Color_Chooser::hsv(double H, double S, double V) { + H = fmod(H,6.0); if (H < 0.0) H += 6.0; + if (S < 0.0) S = 0.0; else if (S > 1.0) S = 1.0; + if (V < 0.0) V = 0.0; else if (V > 1.0) V = 1.0; + if (H == hue_ && S == saturation_ && V == value_) return 0; + double ph = hue_; + double ps = saturation_; + double pv = value_; + hue_ = H; saturation_ = S; value_ = V; + if (value_ != pv) { +#ifdef UPDATE_HUE_BOX + huebox.damage(FL_DAMAGE_SCROLL); +#endif + valuebox.damage(FL_DAMAGE_EXPOSE);} + if (hue_ != ph || saturation_ != ps) { + huebox.damage(FL_DAMAGE_EXPOSE); + valuebox.damage(FL_DAMAGE_SCROLL); + } + hsv2rgb(H,S,V,r_,g_,b_); + set_valuators(); + set_changed(); + return 1; +} + +//////////////////////////////////////////////////////////////// + +static void tohs(double x, double y, double& h, double& s) { +#ifdef CIRCLE + x = 2*x-1; + y = 1-2*y; + s = sqrt(x*x+y*y); if (s > 1.0) s = 1.0; + h = (3.0/M_PI)*atan2(y,x); + if (h<0) h += 6.0; +#else + h = fmod(6.0*x,6.0); if (h < 0.0) h += 6.0; + s = 1.0-y; if (s < 0.0) s = 0.0; else if (s > 1.0) s = 1.0; +#endif +} + +int Flcc_HueBox::handle(int e) { + static double ih, is; + Fl_Color_Chooser* c = (Fl_Color_Chooser*)parent(); + switch (e) { + case FL_PUSH: + if (Fl::visible_focus()) { + Fl::focus(this); + redraw(); + } + ih = c->hue(); + is = c->saturation(); + case FL_DRAG: { + double Xf, Yf, H, S; + Xf = (Fl::event_x()-x()-Fl::box_dx(box()))/double(w()-Fl::box_dw(box())); + Yf = (Fl::event_y()-y()-Fl::box_dy(box()))/double(h()-Fl::box_dh(box())); + tohs(Xf, Yf, H, S); + if (fabs(H-ih) < 3*6.0/w()) H = ih; + if (fabs(S-is) < 3*1.0/h()) S = is; + if (Fl::event_state(FL_CTRL)) H = ih; + if (c->hsv(H, S, c->value())) c->do_callback(); + } return 1; + case FL_FOCUS : + case FL_UNFOCUS : + if (Fl::visible_focus()) { + redraw(); + return 1; + } + else return 1; + case FL_KEYBOARD : + return handle_key(Fl::event_key()); + default: + return 0; + } +} + +static void generate_image(void* vv, int X, int Y, int W, uchar* buf) { + Flcc_HueBox* v = (Flcc_HueBox*)vv; + int iw = v->w()-Fl::box_dw(v->box()); + double Yf = double(Y)/(v->h()-Fl::box_dh(v->box())); +#ifdef UPDATE_HUE_BOX + const double V = ((Fl_Color_Chooser*)(v->parent()))->value(); +#else + const double V = 1.0; +#endif + for (int x = X; x < X+W; x++) { + double Xf = double(x)/iw; + double H,S; tohs(Xf,Yf,H,S); + double r,g,b; + Fl_Color_Chooser::hsv2rgb(H,S,V,r,g,b); + *buf++ = uchar(255*r+.5); + *buf++ = uchar(255*g+.5); + *buf++ = uchar(255*b+.5); + } +} + +int Flcc_HueBox::handle_key(int key) { + int w1 = w()-Fl::box_dw(box())-6; + int h1 = h()-Fl::box_dh(box())-6; + Fl_Color_Chooser* c = (Fl_Color_Chooser*)parent(); + +#ifdef CIRCLE + int X = int(.5*(cos(c->hue()*(M_PI/3.0))*c->saturation()+1) * w1); + int Y = int(.5*(1-sin(c->hue()*(M_PI/3.0))*c->saturation()) * h1); +#else + int X = int(c->hue()/6.0*w1); + int Y = int((1-c->saturation())*h1); +#endif + + switch (key) { + case FL_Up : + Y -= 3; + break; + case FL_Down : + Y += 3; + break; + case FL_Left : + X -= 3; + break; + case FL_Right : + X += 3; + break; + default : + return 0; + } + + double Xf, Yf, H, S; + Xf = (double)X/(double)w1; + Yf = (double)Y/(double)h1; + tohs(Xf, Yf, H, S); + if (c->hsv(H, S, c->value())) c->do_callback(); + + return 1; +} + +void Flcc_HueBox::draw() { + if (damage()&FL_DAMAGE_ALL) draw_box(); + int x1 = x()+Fl::box_dx(box()); + int yy1 = y()+Fl::box_dy(box()); + int w1 = w()-Fl::box_dw(box()); + int h1 = h()-Fl::box_dh(box()); + if (damage() == FL_DAMAGE_EXPOSE) fl_clip(x1+px,yy1+py,6,6); + fl_draw_image(generate_image, this, x1, yy1, w1, h1); + if (damage() == FL_DAMAGE_EXPOSE) fl_pop_clip(); + Fl_Color_Chooser* c = (Fl_Color_Chooser*)parent(); +#ifdef CIRCLE + int X = int(.5*(cos(c->hue()*(M_PI/3.0))*c->saturation()+1) * (w1-6)); + int Y = int(.5*(1-sin(c->hue()*(M_PI/3.0))*c->saturation()) * (h1-6)); +#else + int X = int(c->hue()/6.0*(w1-6)); + int Y = int((1-c->saturation())*(h1-6)); +#endif + if (X < 0) X = 0; else if (X > w1-6) X = w1-6; + if (Y < 0) Y = 0; else if (Y > h1-6) Y = h1-6; + // fl_color(c->value()>.75 ? FL_BLACK : FL_WHITE); + draw_box(FL_UP_BOX,x1+X,yy1+Y,6,6,Fl::focus() == this ? FL_FOREGROUND_COLOR : FL_GRAY); + px = X; py = Y; +} + +//////////////////////////////////////////////////////////////// + +int Flcc_ValueBox::handle(int e) { + static double iv; + Fl_Color_Chooser* c = (Fl_Color_Chooser*)parent(); + switch (e) { + case FL_PUSH: + if (Fl::visible_focus()) { + Fl::focus(this); + redraw(); + } + iv = c->value(); + case FL_DRAG: { + double Yf; + Yf = 1-(Fl::event_y()-y()-Fl::box_dy(box()))/double(h()-Fl::box_dh(box())); + if (fabs(Yf-iv)<(3*1.0/h())) Yf = iv; + if (c->hsv(c->hue(),c->saturation(),Yf)) c->do_callback(); + } return 1; + case FL_FOCUS : + case FL_UNFOCUS : + if (Fl::visible_focus()) { + redraw(); + return 1; + } + else return 1; + case FL_KEYBOARD : + return handle_key(Fl::event_key()); + default: + return 0; + } +} + +static double tr, tg, tb; +static void generate_vimage(void* vv, int X, int Y, int W, uchar* buf) { + Flcc_ValueBox* v = (Flcc_ValueBox*)vv; + double Yf = 255*(1.0-double(Y)/(v->h()-Fl::box_dh(v->box()))); + uchar r = uchar(tr*Yf+.5); + uchar g = uchar(tg*Yf+.5); + uchar b = uchar(tb*Yf+.5); + for (int x = X; x < X+W; x++) { + *buf++ = r; *buf++ = g; *buf++ = b; + } +} + +void Flcc_ValueBox::draw() { + if (damage()&FL_DAMAGE_ALL) draw_box(); + Fl_Color_Chooser* c = (Fl_Color_Chooser*)parent(); + c->hsv2rgb(c->hue(),c->saturation(),1.0,tr,tg,tb); + int x1 = x()+Fl::box_dx(box()); + int yy1 = y()+Fl::box_dy(box()); + int w1 = w()-Fl::box_dw(box()); + int h1 = h()-Fl::box_dh(box()); + if (damage() == FL_DAMAGE_EXPOSE) fl_clip(x1,yy1+py,w1,6); + fl_draw_image(generate_vimage, this, x1, yy1, w1, h1); + if (damage() == FL_DAMAGE_EXPOSE) fl_pop_clip(); + int Y = int((1-c->value()) * (h1-6)); + if (Y < 0) Y = 0; else if (Y > h1-6) Y = h1-6; + draw_box(FL_UP_BOX,x1,yy1+Y,w1,6,Fl::focus() == this ? FL_FOREGROUND_COLOR : FL_GRAY); + py = Y; +} + +int Flcc_ValueBox::handle_key(int key) { + int h1 = h()-Fl::box_dh(box())-6; + Fl_Color_Chooser* c = (Fl_Color_Chooser*)parent(); + + int Y = int((1-c->value()) * h1); + if (Y < 0) Y = 0; else if (Y > h1) Y = h1; + + switch (key) { + case FL_Up : + Y -= 3; + break; + case FL_Down : + Y += 3; + break; + default : + return 0; + } + + double Yf; + Yf = 1-((double)Y/(double)h1); + if (c->hsv(c->hue(),c->saturation(),Yf)) c->do_callback(); + + return 1; +} + +//////////////////////////////////////////////////////////////// + +void Fl_Color_Chooser::rgb_cb(Fl_Widget* o, void*) { + Fl_Color_Chooser* c = (Fl_Color_Chooser*)(o->parent()); + double R = c->rvalue.value(); + double G = c->gvalue.value(); + double B = c->bvalue.value(); + if (c->mode() == M_HSV) { + if (c->hsv(R,G,B)) c->do_callback(); + return; + } + if (c->mode() != M_RGB) { + R = R/255; + G = G/255; + B = B/255; + } + if (c->rgb(R,G,B)) c->do_callback(); +} + +void Fl_Color_Chooser::mode_cb(Fl_Widget* o, void*) { + Fl_Color_Chooser* c = (Fl_Color_Chooser*)(o->parent()); + // force them to redraw even if value is the same: + c->rvalue.value(-1); + c->gvalue.value(-1); + c->bvalue.value(-1); + c->set_valuators(); +} + +//////////////////////////////////////////////////////////////// + +Fl_Color_Chooser::Fl_Color_Chooser(int X, int Y, int W, int H, const char* L) + : Fl_Group(0,0,195,115,L), + huebox(0,0,115,115), + valuebox(115,0,20,115), + choice(140,0,55,25), + rvalue(140,30,55,25), + gvalue(140,60,55,25), + bvalue(140,90,55,25), + resize_box(0,0,115,115) +{ + end(); + resizable(resize_box); + resize(X,Y,W,H); + r_ = g_ = b_ = 0; + hue_ = 0.0; + saturation_ = 0.0; + value_ = 0.0; + huebox.box(FL_DOWN_FRAME); + valuebox.box(FL_DOWN_FRAME); + choice.menu(mode_menu); + set_valuators(); + rvalue.callback(rgb_cb); + gvalue.callback(rgb_cb); + bvalue.callback(rgb_cb); + choice.callback(mode_cb); + choice.box(FL_THIN_UP_BOX); + choice.textfont(FL_HELVETICA_BOLD_ITALIC); +} + +//////////////////////////////////////////////////////////////// +// fl_color_chooser(): + +#include +#include +#include + +class ColorChip : public Fl_Widget { + void draw(); +public: + uchar r,g,b; + ColorChip(int X, int Y, int W, int H) : Fl_Widget(X,Y,W,H) { + box(FL_ENGRAVED_FRAME);} +}; + +void ColorChip::draw() { + if (damage()&FL_DAMAGE_ALL) draw_box(); + fl_rectf(x()+Fl::box_dx(box()), + y()+Fl::box_dy(box()), + w()-Fl::box_dw(box()), + h()-Fl::box_dh(box()),r,g,b); +} + +static void chooser_cb(Fl_Object* o, void* vv) { + Fl_Color_Chooser* c = (Fl_Color_Chooser*)o; + ColorChip* v = (ColorChip*)vv; + v->r = uchar(255*c->r()+.5); + v->g = uchar(255*c->g()+.5); + v->b = uchar(255*c->b()+.5); + v->damage(FL_DAMAGE_EXPOSE); +} + +extern const char* fl_ok; +extern const char* fl_cancel; + +int fl_color_chooser(const char* name, double& r, double& g, double& b) { + Fl_Window window(215,200,name); + Fl_Color_Chooser chooser(10, 10, 195, 115); + ColorChip ok_color(10, 130, 95, 25); + Fl_Return_Button ok_button(10, 165, 95, 25, fl_ok); + ColorChip cancel_color(110, 130, 95, 25); + cancel_color.r = uchar(255*r+.5); ok_color.r = cancel_color.r; + ok_color.g = cancel_color.g = uchar(255*g+.5); + ok_color.b = cancel_color.b = uchar(255*b+.5); + Fl_Button cancel_button(110, 165, 95, 25, fl_cancel); + window.resizable(chooser); + chooser.rgb(r,g,b); + chooser.callback(chooser_cb, &ok_color); + window.end(); + window.set_modal(); + window.hotspot(window); + window.show(); + while (window.shown()) { + Fl::wait(); + for (;;) { + Fl_Widget* o = Fl::readqueue(); + if (!o) break; + if (o == &ok_button) { + r = chooser.r(); + g = chooser.g(); + b = chooser.b(); + return 1; + } + if (o == &window || o == &cancel_button) return 0; + } + } + return 0; +} + +int fl_color_chooser(const char* name, uchar& r, uchar& g, uchar& b) { + double dr = r/255.0; + double dg = g/255.0; + double db = b/255.0; + if (fl_color_chooser(name,dr,dg,db)) { + r = uchar(255*dr+.5); + g = uchar(255*dg+.5); + b = uchar(255*db+.5); + return 1; + } + return 0; +} + +// +// End of "$Id: Fl_Color_Chooser.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Counter.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Counter.cxx new file mode 100644 index 0000000..3bc6363 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Counter.cxx @@ -0,0 +1,197 @@ +// +// "$Id: Fl_Counter.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Counter widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include + +void Fl_Counter::draw() { + int i; Fl_Boxtype boxtype[5]; + Fl_Color selcolor; + + boxtype[0] = box(); + if (boxtype[0] == FL_UP_BOX) boxtype[0] = FL_DOWN_BOX; + if (boxtype[0] == FL_THIN_UP_BOX) boxtype[0] = FL_THIN_DOWN_BOX; + for (i=1; i<5; i++) + if (mouseobj == i) + boxtype[i] = fl_down(box()); + else + boxtype[i] = box(); + + int xx[5], ww[5]; + if (type() == FL_NORMAL_COUNTER) { + int W = w()*15/100; + xx[1] = x(); ww[1] = W; + xx[2] = x()+1*W; ww[2] = W; + xx[0] = x()+2*W; ww[0] = w()-4*W; + xx[3] = x()+w()-2*W; ww[3] = W; + xx[4] = x()+w()-1*W; ww[4] = W; + } else { + int W = w()*20/100; + xx[1] = 0; ww[1] = 0; + xx[2] = x(); ww[2] = W; + xx[0] = x()+W; ww[0] = w()-2*W; + xx[3] = x()+w()-1*W; ww[3] = W; + xx[4] = 0; ww[4] = 0; + } + + draw_box(boxtype[0], xx[0], y(), ww[0], h(), FL_BACKGROUND2_COLOR); + fl_font(textfont(), textsize()); + fl_color(active_r() ? textcolor() : fl_inactive(textcolor())); + char str[128]; format(str); + fl_draw(str, xx[0], y(), ww[0], h(), FL_ALIGN_CENTER); + if (Fl::focus() == this) draw_focus(boxtype[0], xx[0], y(), ww[0], h()); + if (!(damage()&FL_DAMAGE_ALL)) return; // only need to redraw text + + if (active_r()) + selcolor = labelcolor(); + else + selcolor = fl_inactive(labelcolor()); + + if (type() == FL_NORMAL_COUNTER) { + draw_box(boxtype[1], xx[1], y(), ww[1], h(), color()); + fl_draw_symbol("@-4<<", xx[1], y(), ww[1], h(), selcolor); + } + draw_box(boxtype[2], xx[2], y(), ww[2], h(), color()); + fl_draw_symbol("@-4<", xx[2], y(), ww[2], h(), selcolor); + draw_box(boxtype[3], xx[3], y(), ww[3], h(), color()); + fl_draw_symbol("@-4>", xx[3], y(), ww[3], h(), selcolor); + if (type() == FL_NORMAL_COUNTER) { + draw_box(boxtype[4], xx[4], y(), ww[4], h(), color()); + fl_draw_symbol("@-4>>", xx[4], y(), ww[4], h(), selcolor); + } +} + +void Fl_Counter::increment_cb() { + if (!mouseobj) return; + double v = value(); + switch (mouseobj) { + case 1: v -= lstep_; break; + case 2: v = increment(v, -1); break; + case 3: v = increment(v, 1); break; + case 4: v += lstep_; break; + } + handle_drag(clamp(round(v))); +} + +#define INITIALREPEAT .5 +#define REPEAT .1 + +void Fl_Counter::repeat_callback(void* v) { + Fl_Counter* b = (Fl_Counter*)v; + if (b->mouseobj) { + Fl::add_timeout(REPEAT, repeat_callback, b); + b->increment_cb(); + } +} + +int Fl_Counter::calc_mouseobj() { + if (type() == FL_NORMAL_COUNTER) { + int W = w()*15/100; + if (Fl::event_inside(x(), y(), W, h())) return 1; + if (Fl::event_inside(x()+W, y(), W, h())) return 2; + if (Fl::event_inside(x()+w()-2*W, y(), W, h())) return 3; + if (Fl::event_inside(x()+w()-W, y(), W, h())) return 4; + } else { + int W = w()*20/100; + if (Fl::event_inside(x(), y(), W, h())) return 2; + if (Fl::event_inside(x()+w()-W, y(), W, h())) return 3; + } + return -1; +} + +int Fl_Counter::handle(int event) { + int i; + switch (event) { + case FL_RELEASE: + if (mouseobj) { + Fl::remove_timeout(repeat_callback, this); + mouseobj = 0; + redraw(); + } + handle_release(); + return 1; + case FL_PUSH: + if (Fl::visible_focus()) Fl::focus(this); + handle_push(); + case FL_DRAG: + i = calc_mouseobj(); + if (i != mouseobj) { + Fl::remove_timeout(repeat_callback, this); + mouseobj = (uchar)i; + if (i) Fl::add_timeout(INITIALREPEAT, repeat_callback, this); + increment_cb(); + redraw(); + } + return 1; + case FL_KEYBOARD : + switch (Fl::event_key()) { + case FL_Left: + handle_drag(clamp(increment(value(),-1))); + return 1; + case FL_Right: + handle_drag(clamp(increment(value(),1))); + return 1; + default: + return 0; + } + // break not required because of switch... + case FL_FOCUS : + case FL_UNFOCUS : + if (Fl::visible_focus()) { + redraw(); + return 1; + } else return 0; + case FL_ENTER : + case FL_LEAVE : + return 1; + default: + return 0; + } +} + +Fl_Counter::~Fl_Counter() { + Fl::remove_timeout(repeat_callback, this); +} + +Fl_Counter::Fl_Counter(int X, int Y, int W, int H, const char* l) + : Fl_Valuator(X, Y, W, H, l) { + box(FL_UP_BOX); + selection_color(FL_INACTIVE_COLOR); // was FL_BLUE + align(FL_ALIGN_BOTTOM); + bounds(-1000000.0, 1000000.0); + Fl_Valuator::step(1, 10); + lstep_ = 1.0; + mouseobj = 0; + textfont_ = FL_HELVETICA; + textsize_ = (uchar)FL_NORMAL_SIZE; + textcolor_ = FL_FOREGROUND_COLOR; +} + +// +// End of "$Id: Fl_Counter.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Dial.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Dial.cxx new file mode 100644 index 0000000..3f8a32d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Dial.cxx @@ -0,0 +1,147 @@ +// +// "$Id: Fl_Dial.cxx 5472 2006-09-20 03:03:14Z mike $" +// +// Circular dial widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +// All angles are measured with 0 to the right and counter-clockwise + +void Fl_Dial::draw(int X, int Y, int W, int H) { + if (damage()&FL_DAMAGE_ALL) draw_box(box(), X, Y, W, H, color()); + X += Fl::box_dx(box()); + Y += Fl::box_dy(box()); + W -= Fl::box_dw(box()); + H -= Fl::box_dh(box()); + double angle = (a2-a1)*(value()-minimum())/(maximum()-minimum()) + a1; + if (type() == FL_FILL_DIAL) { + // foo: draw this nicely in certain round box types + int foo = (box() > _FL_ROUND_UP_BOX && Fl::box_dx(box())); + if (foo) {X--; Y--; W+=2; H+=2;} + if (active_r()) fl_color(color()); + else fl_color(fl_inactive(color())); + fl_pie(X, Y, W, H, 270-a1, angle > a1 ? 360+270-angle : 270-360-angle); + if (active_r()) fl_color(selection_color()); + else fl_color(fl_inactive(selection_color())); + fl_pie(X, Y, W, H, 270-angle, 270-a1); + if (foo) { + if (active_r()) fl_color(FL_FOREGROUND_COLOR); + else fl_color(fl_inactive(FL_FOREGROUND_COLOR)); + fl_arc(X, Y, W, H, 0, 360); + } + return; + } + if (!(damage()&FL_DAMAGE_ALL)) { + if (active_r()) fl_color(color()); + else fl_color(fl_inactive(color())); + fl_pie(X+1, Y+1, W-2, H-2, 0, 360); + } + fl_push_matrix(); + fl_translate(X+W/2-.5, Y+H/2-.5); + fl_scale(W-1, H-1); + fl_rotate(45-angle); + if (active_r()) fl_color(selection_color()); + else fl_color(fl_inactive(selection_color())); + if (type()) { // FL_LINE_DIAL + fl_begin_polygon(); + fl_vertex(0.0, 0.0); + fl_vertex(-0.04, 0.0); + fl_vertex(-0.25, 0.25); + fl_vertex(0.0, 0.04); + fl_end_polygon(); + if (active_r()) fl_color(FL_FOREGROUND_COLOR); + else fl_color(fl_inactive(FL_FOREGROUND_COLOR)); + fl_begin_loop(); + fl_vertex(0.0, 0.0); + fl_vertex(-0.04, 0.0); + fl_vertex(-0.25, 0.25); + fl_vertex(0.0, 0.04); + fl_end_loop(); + } else { + fl_begin_polygon(); fl_circle(-0.20, 0.20, 0.07); fl_end_polygon(); + if (active_r()) fl_color(FL_FOREGROUND_COLOR); + else fl_color(fl_inactive(FL_FOREGROUND_COLOR)); + fl_begin_loop(); fl_circle(-0.20, 0.20, 0.07); fl_end_loop(); + } + fl_pop_matrix(); +} + +void Fl_Dial::draw() { + draw(x(), y(), w(), h()); + draw_label(); +} + +int Fl_Dial::handle(int event, int X, int Y, int W, int H) { + switch (event) { + case FL_PUSH: + handle_push(); + case FL_DRAG: { + int mx = (Fl::event_x()-X-W/2)*H; + int my = (Fl::event_y()-Y-H/2)*W; + if (!mx && !my) return 1; + double angle = 270-atan2((float)-my, (float)mx)*180/M_PI; + double oldangle = (a2-a1)*(value()-minimum())/(maximum()-minimum()) + a1; + while (angle < oldangle-180) angle += 360; + while (angle > oldangle+180) angle -= 360; + double val; + if ((a1= a1)) { + val = minimum(); + } else if ((a1= a2) : (angle <= a2)) { + val = maximum(); + } else { + val = minimum() + (maximum()-minimum())*(angle-a1)/(a2-a1); + } + handle_drag(clamp(round(val))); + } return 1; + case FL_RELEASE: + handle_release(); + return 1; + case FL_ENTER : + case FL_LEAVE : + return 1; + default: + return 0; + } +} + +int Fl_Dial::handle(int e) { + return handle(e, x(), y(), w(), h()); +} + +Fl_Dial::Fl_Dial(int X, int Y, int W, int H, const char* l) + : Fl_Valuator(X, Y, W, H, l) { + box(FL_OVAL_BOX); + selection_color(FL_INACTIVE_COLOR); // was 37 + a1 = 45; + a2 = 315; +} + +// +// End of "$Id: Fl_Dial.cxx 5472 2006-09-20 03:03:14Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Double_Window.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Double_Window.cxx new file mode 100644 index 0000000..eaaacfb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Double_Window.cxx @@ -0,0 +1,452 @@ +// +// "$Id: Fl_Double_Window.cxx 5829 2007-05-14 15:51:00Z matt $" +// +// Double-buffered window code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +// On systems that support double buffering "naturally" the base +// Fl_Window class will probably do double-buffer and this subclass +// does nothing. + +#if USE_XDBE + +#include + +static int use_xdbe; + +static int can_xdbe() { + static int tried; + if (!tried) { + tried = 1; + int event_base, error_base; + if (!XdbeQueryExtension(fl_display, &event_base, &error_base)) return 0; + Drawable root = RootWindow(fl_display,fl_screen); + int numscreens = 1; + XdbeScreenVisualInfo *a = XdbeGetVisualInfo(fl_display,&root,&numscreens); + if (!a) return 0; + for (int j = 0; j < a->count; j++) + if (a->visinfo[j].visual == fl_visual->visualid + /*&& a->visinfo[j].perflevel > 0*/) {use_xdbe = 1; break;} + XdbeFreeVisualInfo(a); + } + return use_xdbe; +} +#endif + +void Fl_Double_Window::show() { + Fl_Window::show(); +} + +#ifdef WIN32 + +// Code used to switch output to an off-screen window. See macros in +// win32.H which save the old state in local variables. + +typedef struct { BYTE a; BYTE b; BYTE c; BYTE d; } FL_BLENDFUNCTION; +typedef BOOL (WINAPI* fl_alpha_blend_func) + (HDC,int,int,int,int,HDC,int,int,int,int,FL_BLENDFUNCTION); +static fl_alpha_blend_func fl_alpha_blend = NULL; +static FL_BLENDFUNCTION blendfunc = { 0, 0, 255, 1}; + +/* + * This function checks if the version of MSWindows that we + * curently run on supports alpha blending for bitmap transfers + * and finds the required function if so. + */ +char fl_can_do_alpha_blending() { + static char been_here = 0; + static char can_do = 0; + // do this test only once + if (been_here) return can_do; + been_here = 1; + // load the library that implements alpha blending + HMODULE hMod = LoadLibrary("MSIMG32.DLL"); + // give up if that doesn't exist (Win95?) + if (!hMod) return 0; + // now find the blending function inside that dll + fl_alpha_blend = (fl_alpha_blend_func)GetProcAddress(hMod, "AlphaBlend"); + // give up if we can't find it (Win95) + if (!fl_alpha_blend) return 0; + // we have the call, but does our display support alpha blending? + HDC dc = 0L;//fl_gc; + // get the current or the desktop's device context + if (!dc) dc = GetDC(0L); + if (!dc) return 0; + // check the device capabilities flags. However GetDeviceCaps + // does not return anything useful, so we have to do it manually: + + HBITMAP bm = CreateCompatibleBitmap(dc, 1, 1); + HDC new_gc = CreateCompatibleDC(dc); + int save = SaveDC(new_gc); + SelectObject(new_gc, bm); + /*COLORREF set = */ SetPixel(new_gc, 0, 0, 0x01010101); + BOOL alpha_ok = fl_alpha_blend(dc, 0, 0, 1, 1, new_gc, 0, 0, 1, 1, blendfunc); + RestoreDC(new_gc, save); + DeleteDC(new_gc); + DeleteObject(bm); + + if (!fl_gc) ReleaseDC(0L, dc); + if (alpha_ok) can_do = 1; + return can_do; +} + +HDC fl_makeDC(HBITMAP bitmap) { + HDC new_gc = CreateCompatibleDC(fl_gc); + SetTextAlign(new_gc, TA_BASELINE|TA_LEFT); + SetBkMode(new_gc, TRANSPARENT); +#if USE_COLORMAP + if (fl_palette) SelectPalette(new_gc, fl_palette, FALSE); +#endif + SelectObject(new_gc, bitmap); + return new_gc; +} + +void fl_copy_offscreen(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy) { + HDC new_gc = CreateCompatibleDC(fl_gc); + int save = SaveDC(new_gc); + SelectObject(new_gc, bitmap); + BitBlt(fl_gc, x, y, w, h, new_gc, srcx, srcy, SRCCOPY); + RestoreDC(new_gc, save); + DeleteDC(new_gc); +} + +void fl_copy_offscreen_with_alpha(int x,int y,int w,int h,HBITMAP bitmap,int srcx,int srcy) { + HDC new_gc = CreateCompatibleDC(fl_gc); + int save = SaveDC(new_gc); + SelectObject(new_gc, bitmap); + BOOL alpha_ok = 0; + // first try to alpha blend + if (fl_can_do_alpha_blending()) + alpha_ok = fl_alpha_blend(fl_gc, x, y, w, h, new_gc, srcx, srcy, w, h, blendfunc); + // if that failed (it shouldn,t), still copy the bitmap over, but now alpha is 1 + if (!alpha_ok) + BitBlt(fl_gc, x, y, w, h, new_gc, srcx, srcy, SRCCOPY); + RestoreDC(new_gc, save); + DeleteDC(new_gc); +} + +extern void fl_restore_clip(); + +#elif defined(__APPLE_QD__) + +char fl_can_do_alpha_blending() { + return 0; +} + +GWorldPtr fl_create_offscreen(int w, int h) { + GWorldPtr gw; + Rect bounds; + bounds.left=0; bounds.right=w; bounds.top=0; bounds.bottom=h; + QDErr err = NewGWorld(&gw, 0, &bounds, 0L, 0L, 0); // 'useTempMem' should not be used (says the Carbon port manual) + if ( err == -108 ) + { } +// fl_message( "The application memory is low. Please increase the initial memory assignment.\n" ); + if (err!=noErr || gw==0L) return 0L; + return gw; +} + +void fl_copy_offscreen(int x,int y,int w,int h,GWorldPtr gWorld,int srcx,int srcy) { + Rect src; + if ( !gWorld ) return; + src.top = srcy; src.left = srcx; src.bottom = srcy+h; src.right = srcx+w; + Rect dst; + GrafPtr dstPort; GetPort(&dstPort); + dst.top = y; dst.left = x; dst.bottom = y+h; dst.right = x+w; + RGBColor rgb, oldbg, oldfg; + GetForeColor(&oldfg); + GetBackColor(&oldbg); + rgb.red = 0xffff; rgb.green = 0xffff; rgb.blue = 0xffff; + RGBBackColor( &rgb ); + rgb.red = 0x0000; rgb.green = 0x0000; rgb.blue = 0x0000; + RGBForeColor( &rgb ); + CopyBits(GetPortBitMapForCopyBits(gWorld), GetPortBitMapForCopyBits(dstPort), &src, &dst, srcCopy, 0L); + RGBBackColor(&oldbg); + RGBForeColor(&oldfg); +} + +void fl_delete_offscreen(GWorldPtr gWorld) { + DisposeGWorld(gWorld); +} + +static GrafPtr prevPort; +static GDHandle prevGD; + +void fl_begin_offscreen(GWorldPtr gWorld) { + GetGWorld( &prevPort, &prevGD ); + if ( gWorld ) + { + SetGWorld( gWorld, 0 ); // sets the correct port + PixMapHandle pm = GetGWorldPixMap(gWorld); + Boolean ret = LockPixels(pm); + if ( ret == false ) + { + Rect rect; + GetPortBounds( gWorld, &rect ); + UpdateGWorld( &gWorld, 0, &rect, 0, 0, 0 ); + pm = GetGWorldPixMap( gWorld ); + LockPixels( pm ); + } + fl_window = 0; + } + fl_push_no_clip(); +} + +void fl_end_offscreen() { + GWorldPtr currPort; + GDHandle currGD; + GetGWorld( &currPort, &currGD ); + fl_pop_clip(); + PixMapHandle pm = GetGWorldPixMap(currPort); + UnlockPixels(pm); + SetGWorld( prevPort, prevGD ); + fl_window = GetWindowFromPort( prevPort ); +} + +extern void fl_restore_clip(); + +#elif defined(__APPLE_QUARTZ__) + +char fl_can_do_alpha_blending() { + return 1; +} + +Fl_Offscreen fl_create_offscreen(int w, int h) { + void *data = calloc(w*h,4); + CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB(); + CGContextRef ctx = CGBitmapContextCreate( + data, w, h, 8, w*4, lut, kCGImageAlphaNoneSkipLast); + CGColorSpaceRelease(lut); + return (Fl_Offscreen)ctx; +} + +Fl_Offscreen fl_create_offscreen_with_alpha(int w, int h) { + void *data = calloc(w*h,4); + CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB(); + CGContextRef ctx = CGBitmapContextCreate( + data, w, h, 8, w*4, lut, kCGImageAlphaPremultipliedLast); + CGColorSpaceRelease(lut); + return (Fl_Offscreen)ctx; +} + +void fl_copy_offscreen(int x,int y,int w,int h,Fl_Offscreen osrc,int srcx,int srcy) { + CGContextRef src = (CGContextRef)osrc; + void *data = CGBitmapContextGetData(src); + int sw = CGBitmapContextGetWidth(src); + int sh = CGBitmapContextGetHeight(src); + CGImageAlphaInfo alpha = CGBitmapContextGetAlphaInfo(src); + CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB(); + CGDataProviderRef src_bytes = CGDataProviderCreateWithData( 0L, data, sw*sh*4, 0L); + CGImageRef img = CGImageCreate( sw, sh, 8, 4*8, 4*sw, lut, alpha, + src_bytes, 0L, false, kCGRenderingIntentDefault); + // fl_push_clip(); + CGRect rect = { { x, y }, { w, h } }; + Fl_X::q_begin_image(rect, srcx, srcy, sw, sh); + CGContextDrawImage(fl_gc, rect, img); + Fl_X::q_end_image(); + CGImageRelease(img); + CGColorSpaceRelease(lut); + CGDataProviderRelease(src_bytes); +} + +void fl_delete_offscreen(Fl_Offscreen ctx) { + if (!ctx) return; + void *data = CGBitmapContextGetData((CGContextRef)ctx); + CGContextRelease((CGContextRef)ctx); + if (!data) return; + free(data); +} + +const int stack_max = 16; +static int stack_ix = 0; +static CGContextRef stack_gc[stack_max]; +static Window stack_window[stack_max]; + +void fl_begin_offscreen(Fl_Offscreen ctx) { + if (stack_ix0) + stack_ix--; + else + fprintf(stderr, "FLTK CGContext Stack underflow error\n"); + if (stack_ixother_xid) { +#if USE_XDBE + if (can_xdbe()) { + myi->other_xid = + XdbeAllocateBackBufferName(fl_display, fl_xid(this), XdbeCopied); + myi->backbuffer_bad = 1; + } else +#endif +#ifdef __APPLE_QD__ + if ( ( !QDIsPortBuffered( GetWindowPort(myi->xid) ) ) + || force_doublebuffering_ ) { + myi->other_xid = fl_create_offscreen(w(), h()); + clear_damage(FL_DAMAGE_ALL); + } +#elif defined(__APPLE_QUARTZ__) + if (force_doublebuffering_) { + myi->other_xid = fl_create_offscreen(w(), h()); + clear_damage(FL_DAMAGE_ALL); + } +#else + myi->other_xid = fl_create_offscreen(w(), h()); + clear_damage(FL_DAMAGE_ALL); +#endif + } +#if USE_XDBE + if (use_xdbe) { + if (myi->backbuffer_bad) { + // Make sure we do a complete redraw... + if (myi->region) {XDestroyRegion(myi->region); myi->region = 0;} + clear_damage(FL_DAMAGE_ALL); + myi->backbuffer_bad = 0; + } + + // Redraw as needed... + if (damage()) { + fl_clip_region(myi->region); myi->region = 0; + fl_window = myi->other_xid; + draw(); + fl_window = myi->xid; + } + + // Copy contents of back buffer to window... + XdbeSwapInfo s; + s.swap_window = fl_xid(this); + s.swap_action = XdbeCopied; + XdbeSwapBuffers(fl_display, &s, 1); + return; + } else +#endif + if (damage() & ~FL_DAMAGE_EXPOSE) { + fl_clip_region(myi->region); myi->region = 0; +#ifdef WIN32 + HDC _sgc = fl_gc; + fl_gc = fl_makeDC(myi->other_xid); + int save = SaveDC(fl_gc); + fl_restore_clip(); // duplicate region into new gc + draw(); + RestoreDC(fl_gc, save); + DeleteDC(fl_gc); + fl_gc = _sgc; +#elif defined(__APPLE__) + if ( myi->other_xid ) { + fl_begin_offscreen( myi->other_xid ); + fl_clip_region( 0 ); + draw(); + fl_end_offscreen(); + } else { + draw(); + } +#else // X: + fl_window = myi->other_xid; + draw(); + fl_window = myi->xid; +#endif + } + if (eraseoverlay) fl_clip_region(0); + // on Irix (at least) it is faster to reduce the area copied to + // the current clip region: + int X,Y,W,H; fl_clip_box(0,0,w(),h(),X,Y,W,H); + if (myi->other_xid) fl_copy_offscreen(X, Y, W, H, myi->other_xid, X, Y); +} + +void Fl_Double_Window::resize(int X,int Y,int W,int H) { + int ow = w(); + int oh = h(); + Fl_Window::resize(X,Y,W,H); +#if USE_XDBE + if (use_xdbe) return; +#endif + Fl_X* myi = Fl_X::i(this); + if (myi && myi->other_xid && (ow != w() || oh != h())) { + fl_delete_offscreen(myi->other_xid); + myi->other_xid = 0; + } +} + +void Fl_Double_Window::hide() { + Fl_X* myi = Fl_X::i(this); + if (myi && myi->other_xid) { +#if USE_XDBE + if (!use_xdbe) +#endif + fl_delete_offscreen(myi->other_xid); + } + Fl_Window::hide(); +} + +Fl_Double_Window::~Fl_Double_Window() { + hide(); +} + +// +// End of "$Id: Fl_Double_Window.cxx 5829 2007-05-14 15:51:00Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_File_Browser.cxx b/third_party/windows/fltk-1.1.10/src/Fl_File_Browser.cxx new file mode 100644 index 0000000..aa37a76 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_File_Browser.cxx @@ -0,0 +1,639 @@ +// +// "$Id: Fl_File_Browser.cxx 5635 2007-01-23 15:02:00Z mike $" +// +// Fl_File_Browser routines. +// +// Copyright 1999-2006 by Michael Sweet. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// Fl_File_Browser::full_height() - Return the height of the list. +// Fl_File_Browser::item_height() - Return the height of a list item. +// Fl_File_Browser::item_width() - Return the width of a list item. +// Fl_File_Browser::item_draw() - Draw a list item. +// Fl_File_Browser::Fl_File_Browser() - Create a Fl_File_Browser widget. +// Fl_File_Browser::load() - Load a directory into the browser. +// Fl_File_Browser::filter() - Set the filename filter. +// + +// +// Include necessary header files... +// + +#include +#include +#include +#include +#include +#include "flstring.h" + +#ifdef __CYGWIN__ +# include +#elif defined(WIN32) +# include +# include +// Apparently Borland C++ defines DIRECTORY in , which +// interfers with the Fl_File_Icon enumeration of the same name. +# ifdef DIRECTORY +# undef DIRECTORY +# endif // DIRECTORY +#endif // __CYGWIN__ + +#ifdef __EMX__ +# define INCL_DOS +# define INCL_DOSMISC +# include +#endif // __EMX__ + +// CodeWarrior (__MWERKS__) gets its include paths confused, so we +// temporarily disable this... +#if defined(__APPLE__) && !defined(__MWERKS__) +# include +# include +# include +#endif // __APPLE__ && !__MWERKS__ + + +// +// FL_BLINE definition from "Fl_Browser.cxx"... +// + +#define SELECTED 1 +#define NOTDISPLAYED 2 + +struct FL_BLINE // data is in a linked list of these +{ + FL_BLINE *prev; // Previous item in list + FL_BLINE *next; // Next item in list + void *data; // Pointer to data (function) + short length; // sizeof(txt)-1, may be longer than string + char flags; // selected, displayed + char txt[1]; // start of allocated array +}; + + +// +// 'Fl_File_Browser::full_height()' - Return the height of the list. +// + +int // O - Height in pixels +Fl_File_Browser::full_height() const +{ + int i, // Looping var + th; // Total height of list. + + + for (i = 0, th = 0; i < size(); i ++) + th += item_height(find_line(i)); + + return (th); +} + + +// +// 'Fl_File_Browser::item_height()' - Return the height of a list item. +// + +int // O - Height in pixels +Fl_File_Browser::item_height(void *p) const // I - List item data +{ + FL_BLINE *line; // Pointer to line + char *t; // Pointer into text + int height; // Width of line + int textheight; // Height of text + + + // Figure out the standard text height... + fl_font(textfont(), textsize()); + textheight = fl_height(); + + // We always have at least 1 line... + height = textheight; + + // Scan for newlines... + line = (FL_BLINE *)p; + + if (line != NULL) + for (t = line->txt; *t != '\0'; t ++) + if (*t == '\n') + height += textheight; + + // If we have enabled icons then add space for them... + if (Fl_File_Icon::first() != NULL && height < iconsize_) + height = iconsize_; + + // Add space for the selection border.. + height += 2; + + // Return the height + return (height); +} + + +// +// 'Fl_File_Browser::item_width()' - Return the width of a list item. +// + +int // O - Width in pixels +Fl_File_Browser::item_width(void *p) const // I - List item data +{ + int i; // Looping var + FL_BLINE *line; // Pointer to line + char *t, // Pointer into text + *ptr, // Pointer into fragment + fragment[10240]; // Fragment of text + int width, // Width of line + tempwidth; // Width of fragment + int column; // Current column + const int *columns; // Columns + + + // Scan for newlines... + line = (FL_BLINE *)p; + columns = column_widths(); + + // Set the font and size... + if (line->txt[strlen(line->txt) - 1] == '/') + fl_font(textfont() | FL_BOLD, textsize()); + else + fl_font(textfont(), textsize()); + + if (strchr(line->txt, '\n') == NULL && + strchr(line->txt, column_char()) == NULL) + { + // Do a fast width calculation... + width = (int)fl_width(line->txt); + } + else + { + // More than 1 line or have columns; find the maximum width... + width = 0; + tempwidth = 0; + column = 0; + + for (t = line->txt, ptr = fragment; *t != '\0'; t ++) + if (*t == '\n') + { + // Newline - nul terminate this fragment and get the width... + *ptr = '\0'; + + tempwidth += (int)fl_width(fragment); + + // Update the max width as needed... + if (tempwidth > width) + width = tempwidth; + + // Point back to the start of the fragment... + ptr = fragment; + tempwidth = 0; + column = 0; + } + else if (*t == column_char()) + { + // Advance to the next column... + column ++; + if (columns) + { + for (i = 0, tempwidth = 0; i < column && columns[i]; i ++) + tempwidth += columns[i]; + } + else + tempwidth = column * (int)(fl_height() * 0.6 * 8.0); + + if (tempwidth > width) + width = tempwidth; + + ptr = fragment; + } + else + *ptr++ = *t; + + if (ptr > fragment) + { + // Nul terminate this fragment and get the width... + *ptr = '\0'; + + tempwidth += (int)fl_width(fragment); + + // Update the max width as needed... + if (tempwidth > width) + width = tempwidth; + } + } + + // If we have enabled icons then add space for them... + if (Fl_File_Icon::first() != NULL) + width += iconsize_ + 8; + + // Add space for the selection border.. + width += 2; + + // Return the width + return (width); +} + + +// +// 'Fl_File_Browser::item_draw()' - Draw a list item. +// + +void +Fl_File_Browser::item_draw(void *p, // I - List item data + int X, // I - Upper-lefthand X coordinate + int Y, // I - Upper-lefthand Y coordinate + int W, // I - Width of item + int) const // I - Height of item +{ + int i; // Looping var + FL_BLINE *line; // Pointer to line + Fl_Color c; // Text color + char *t, // Pointer into text + *ptr, // Pointer into fragment + fragment[10240]; // Fragment of text + int width, // Width of line + height; // Height of line + int column; // Current column + const int *columns; // Columns + + + // Draw the list item text... + line = (FL_BLINE *)p; + + if (line->txt[strlen(line->txt) - 1] == '/') + fl_font(textfont() | FL_BOLD, textsize()); + else + fl_font(textfont(), textsize()); + + if (line->flags & SELECTED) + c = fl_contrast(textcolor(), selection_color()); + else + c = textcolor(); + + if (Fl_File_Icon::first() == NULL) + { + // No icons, just draw the text... + X ++; + W -= 2; + } + else + { + // Draw the icon if it is set... + if (line->data) + ((Fl_File_Icon *)line->data)->draw(X, Y, iconsize_, iconsize_, + (line->flags & SELECTED) ? FL_YELLOW : + FL_LIGHT2, + active_r()); + + // Draw the text offset to the right... + X += iconsize_ + 9; + W -= iconsize_ - 10; + + // Center the text vertically... + height = fl_height(); + + for (t = line->txt; *t != '\0'; t ++) + if (*t == '\n') + height += fl_height(); + + if (height < iconsize_) + Y += (iconsize_ - height) / 2; + } + + // Draw the text... + line = (FL_BLINE *)p; + columns = column_widths(); + width = 0; + column = 0; + + if (active_r()) + fl_color(c); + else + fl_color(fl_inactive(c)); + + for (t = line->txt, ptr = fragment; *t != '\0'; t ++) + if (*t == '\n') + { + // Newline - nul terminate this fragment and draw it... + *ptr = '\0'; + + fl_draw(fragment, X + width, Y, W - width, fl_height(), + (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP), 0, 0); + + // Point back to the start of the fragment... + ptr = fragment; + width = 0; + Y += fl_height(); + column = 0; + } + else if (*t == column_char()) + { + // Tab - nul terminate this fragment and draw it... + *ptr = '\0'; + + int cW = W - width; // Clip width... + + if (columns) + { + // Try clipping inside this column... + for (i = 0; i < column && columns[i]; i ++); + + if (columns[i]) + cW = columns[i]; + } + + fl_draw(fragment, X + width, Y, cW, fl_height(), + (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP), 0, 0); + + // Advance to the next column... + column ++; + if (columns) + { + for (i = 0, width = 0; i < column && columns[i]; i ++) + width += columns[i]; + } + else + width = column * (int)(fl_height() * 0.6 * 8.0); + + ptr = fragment; + } + else + *ptr++ = *t; + + if (ptr > fragment) + { + // Nul terminate this fragment and draw it... + *ptr = '\0'; + + fl_draw(fragment, X + width, Y, W - width, fl_height(), + (Fl_Align)(FL_ALIGN_LEFT | FL_ALIGN_CLIP), 0, 0); + } +} + + +// +// 'Fl_File_Browser::Fl_File_Browser()' - Create a Fl_File_Browser widget. +// + +Fl_File_Browser::Fl_File_Browser(int X, // I - Upper-lefthand X coordinate + int Y, // I - Upper-lefthand Y coordinate + int W, // I - Width in pixels + int H, // I - Height in pixels + const char *l) // I - Label text + : Fl_Browser(X, Y, W, H, l) +{ + // Initialize the filter pattern, current directory, and icon size... + pattern_ = "*"; + directory_ = ""; + iconsize_ = (uchar)(3 * textsize() / 2); + filetype_ = FILES; +} + + +// +// 'Fl_File_Browser::load()' - Load a directory into the browser. +// + +int // O - Number of files loaded +Fl_File_Browser::load(const char *directory,// I - Directory to load + Fl_File_Sort_F *sort) // I - Sort function to use +{ + int i; // Looping var + int num_files; // Number of files in directory + int num_dirs; // Number of directories in list + char filename[4096]; // Current file + Fl_File_Icon *icon; // Icon to use + + +// printf("Fl_File_Browser::load(\"%s\")\n", directory); + + clear(); + + directory_ = directory; + + if (!directory) + return (0); + + if (directory_[0] == '\0') + { + // + // No directory specified; for UNIX list all mount points. For DOS + // list all valid drive letters... + // + + num_files = 0; + if ((icon = Fl_File_Icon::find("any", Fl_File_Icon::DEVICE)) == NULL) + icon = Fl_File_Icon::find("any", Fl_File_Icon::DIRECTORY); + +#ifdef WIN32 +# ifdef __CYGWIN__ + // + // Cygwin provides an implementation of setmntent() to get the list + // of available drives... + // + FILE *m = setmntent("/-not-used-", "r"); + struct mntent *p; + + while ((p = getmntent (m)) != NULL) { + add(p->mnt_dir, icon); + num_files ++; + } + + endmntent(m); +# else + // + // Normal WIN32 code uses drive bits... + // + DWORD drives; // Drive available bits + + drives = GetLogicalDrives(); + for (i = 'A'; i <= 'Z'; i ++, drives >>= 1) + if (drives & 1) + { + sprintf(filename, "%c:/", i); + + if (i < 'C') // see also: GetDriveType and GetVolumeInformation in WIN32 + add(filename, icon); + else + add(filename, icon); + + num_files ++; + } +# endif // __CYGWIN__ +#elif defined(__EMX__) + // + // OS/2 code uses drive bits... + // + ULONG curdrive; // Current drive + ULONG drives; // Drive available bits + int start = 3; // 'C' (MRS - dunno if this is correct!) + + + DosQueryCurrentDisk(&curdrive, &drives); + drives >>= start - 1; + for (i = 'A'; i <= 'Z'; i ++, drives >>= 1) + if (drives & 1) + { + sprintf(filename, "%c:/", i); + add(filename, icon); + + num_files ++; + } +#elif defined(__APPLE__) && !defined(__MWERKS__) + // MacOS X and Darwin use getfsstat() system call... + int numfs; // Number of file systems + struct statfs *fs; // Buffer for file system info + + + // We always have the root filesystem. + add("/", icon); + + // Get the mounted filesystems... + numfs = getfsstat(NULL, 0, MNT_NOWAIT); + if (numfs > 0) { + // We have file systems, get them... + fs = new struct statfs[numfs]; + getfsstat(fs, sizeof(struct statfs) * numfs, MNT_NOWAIT); + + // Add filesystems to the list... + for (i = 0; i < numfs; i ++) { + // Ignore "/", "/dev", and "/.vol"... + if (fs[i].f_mntonname[1] && strcmp(fs[i].f_mntonname, "/dev") && + strcmp(fs[i].f_mntonname, "/.vol")) { + snprintf(filename, sizeof(filename), "%s/", fs[i].f_mntonname); + add(filename, icon); + } + num_files ++; + } + + // Free the memory used for the file system info array... + delete[] fs; + } +#else + // + // UNIX code uses /etc/fstab or similar... + // + FILE *mtab; // /etc/mtab or /etc/mnttab file + char line[1024]; // Input line + + // + // Open the file that contains a list of mounted filesystems... + // + + mtab = fopen("/etc/mnttab", "r"); // Fairly standard + if (mtab == NULL) + mtab = fopen("/etc/mtab", "r"); // More standard + if (mtab == NULL) + mtab = fopen("/etc/fstab", "r"); // Otherwise fallback to full list + if (mtab == NULL) + mtab = fopen("/etc/vfstab", "r"); // Alternate full list file + + if (mtab != NULL) + { + while (fgets(line, sizeof(line), mtab) != NULL) + { + if (line[0] == '#' || line[0] == '\n') + continue; + if (sscanf(line, "%*s%4095s", filename) != 1) + continue; + + strlcat(filename, "/", sizeof(filename)); + +// printf("Fl_File_Browser::load() - adding \"%s\" to list...\n", filename); + add(filename, icon); + num_files ++; + } + + fclose(mtab); + } +#endif // WIN32 || __EMX__ + } + else + { + dirent **files; // Files in in directory + + + // + // Build the file list... + // + +#if (defined(WIN32) && !defined(__CYGWIN__)) || defined(__EMX__) + strlcpy(filename, directory_, sizeof(filename)); + i = strlen(filename) - 1; + + if (i == 2 && filename[1] == ':' && + (filename[2] == '/' || filename[2] == '\\')) + filename[2] = '/'; + else if (filename[i] != '/' && filename[i] != '\\') + strlcat(filename, "/", sizeof(filename)); + + num_files = fl_filename_list(filename, &files, sort); +#else + num_files = fl_filename_list(directory_, &files, sort); +#endif /* WIN32 || __EMX__ */ + + if (num_files <= 0) + return (0); + + for (i = 0, num_dirs = 0; i < num_files; i ++) { + if (strcmp(files[i]->d_name, "./")) { + snprintf(filename, sizeof(filename), "%s/%s", directory_, + files[i]->d_name); + + icon = Fl_File_Icon::find(filename); + if ((icon && icon->type() == Fl_File_Icon::DIRECTORY) || + _fl_filename_isdir_quick(filename)) { + num_dirs ++; + insert(num_dirs, files[i]->d_name, icon); + } else if (filetype_ == FILES && + fl_filename_match(files[i]->d_name, pattern_)) { + add(files[i]->d_name, icon); + } + } + + free(files[i]); + } + + free(files); + } + + return (num_files); +} + + +// +// 'Fl_File_Browser::filter()' - Set the filename filter. +// + +void +Fl_File_Browser::filter(const char *pattern) // I - Pattern string +{ + // If pattern is NULL set the pattern to "*"... + if (pattern) + pattern_ = pattern; + else + pattern_ = "*"; +} + + +// +// End of "$Id: Fl_File_Browser.cxx 5635 2007-01-23 15:02:00Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_File_Chooser.cxx b/third_party/windows/fltk-1.1.10/src/Fl_File_Chooser.cxx new file mode 100644 index 0000000..ca1a7cb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_File_Chooser.cxx @@ -0,0 +1,444 @@ +// +// "$Id: Fl_File_Chooser.cxx 6092 2008-04-11 12:57:37Z matt $" +// +// Fl_File_Chooser dialog for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0108 + +#include "../FL/Fl_File_Chooser.H" +#include + +void Fl_File_Chooser::cb_window_i(Fl_Double_Window*, void*) { + fileName->value(""); +fileList->deselect(); +Fl::remove_timeout((Fl_Timeout_Handler)previewCB, this); +window->hide(); +} +void Fl_File_Chooser::cb_window(Fl_Double_Window* o, void* v) { + ((Fl_File_Chooser*)(o->user_data()))->cb_window_i(o,v); +} + +void Fl_File_Chooser::cb_showChoice_i(Fl_Choice*, void*) { + showChoiceCB(); +} +void Fl_File_Chooser::cb_showChoice(Fl_Choice* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_showChoice_i(o,v); +} + +void Fl_File_Chooser::cb_favoritesButton_i(Fl_Menu_Button*, void*) { + favoritesButtonCB(); +} +void Fl_File_Chooser::cb_favoritesButton(Fl_Menu_Button* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_favoritesButton_i(o,v); +} + +void Fl_File_Chooser::cb_newButton_i(Fl_Button*, void*) { + newdir(); +} +void Fl_File_Chooser::cb_newButton(Fl_Button* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_newButton_i(o,v); +} + +#include +static unsigned char idata_new[] = +{0,0,120,0,132,0,2,1,1,254,1,128,49,128,49,128,253,128,253,128,49,128,49, +128,1,128,1,128,255,255,0,0}; +static Fl_Bitmap image_new(idata_new, 16, 16); + +void Fl_File_Chooser::cb__i(Fl_Tile*, void*) { + update_preview(); +} +void Fl_File_Chooser::cb_(Fl_Tile* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->user_data()))->cb__i(o,v); +} + +void Fl_File_Chooser::cb_fileList_i(Fl_File_Browser*, void*) { + fileListCB(); +} +void Fl_File_Chooser::cb_fileList(Fl_File_Browser* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_fileList_i(o,v); +} + +void Fl_File_Chooser::cb_previewButton_i(Fl_Check_Button*, void*) { + preview(previewButton->value()); +} +void Fl_File_Chooser::cb_previewButton(Fl_Check_Button* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->parent()->parent()->user_data()))->cb_previewButton_i(o,v); +} + +void Fl_File_Chooser::cb_fileName_i(Fl_File_Input*, void*) { + fileNameCB(); +} +void Fl_File_Chooser::cb_fileName(Fl_File_Input* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_fileName_i(o,v); +} + +void Fl_File_Chooser::cb_okButton_i(Fl_Return_Button*, void*) { + window->hide(); + +// Do any callback that is registered... +if (callback_) + (*callback_)(this, data_); +} +void Fl_File_Chooser::cb_okButton(Fl_Return_Button* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->parent()->parent()->user_data()))->cb_okButton_i(o,v); +} + +void Fl_File_Chooser::cb_cancelButton_i(Fl_Button*, void*) { + fileName->value(""); +fileList->deselect(); +Fl::remove_timeout((Fl_Timeout_Handler)previewCB, this); +window->hide(); +} +void Fl_File_Chooser::cb_cancelButton(Fl_Button* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->parent()->parent()->user_data()))->cb_cancelButton_i(o,v); +} + +void Fl_File_Chooser::cb_favList_i(Fl_File_Browser*, void*) { + favoritesCB(favList); +} +void Fl_File_Chooser::cb_favList(Fl_File_Browser* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->user_data()))->cb_favList_i(o,v); +} + +void Fl_File_Chooser::cb_favUpButton_i(Fl_Button*, void*) { + favoritesCB(favUpButton); +} +void Fl_File_Chooser::cb_favUpButton(Fl_Button* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_favUpButton_i(o,v); +} + +void Fl_File_Chooser::cb_favDeleteButton_i(Fl_Button*, void*) { + favoritesCB(favDeleteButton); +} +void Fl_File_Chooser::cb_favDeleteButton(Fl_Button* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_favDeleteButton_i(o,v); +} + +void Fl_File_Chooser::cb_favDownButton_i(Fl_Button*, void*) { + favoritesCB(favDownButton); +} +void Fl_File_Chooser::cb_favDownButton(Fl_Button* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_favDownButton_i(o,v); +} + +void Fl_File_Chooser::cb_favCancelButton_i(Fl_Button*, void*) { + favWindow->hide(); +} +void Fl_File_Chooser::cb_favCancelButton(Fl_Button* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_favCancelButton_i(o,v); +} + +void Fl_File_Chooser::cb_favOkButton_i(Fl_Return_Button*, void*) { + favoritesCB(favOkButton); +} +void Fl_File_Chooser::cb_favOkButton(Fl_Return_Button* o, void* v) { + ((Fl_File_Chooser*)(o->parent()->parent()->user_data()))->cb_favOkButton_i(o,v); +} + +Fl_File_Chooser::Fl_File_Chooser(const char *d, const char *p, int t, const char *title) { + Fl_Group *prev_current = Fl_Group::current(); + { window = new Fl_Double_Window(490, 380, "Choose File"); + window->callback((Fl_Callback*)cb_window, (void*)(this)); + { Fl_Group* o = new Fl_Group(10, 10, 470, 25); + { showChoice = new Fl_Choice(65, 10, 215, 25, "Show:"); + showChoice->down_box(FL_BORDER_BOX); + showChoice->labelfont(1); + showChoice->callback((Fl_Callback*)cb_showChoice); + Fl_Group::current()->resizable(showChoice); + showChoice->label(show_label); + } // Fl_Choice* showChoice + { favoritesButton = new Fl_Menu_Button(290, 10, 155, 25, "Favorites"); + favoritesButton->down_box(FL_BORDER_BOX); + favoritesButton->callback((Fl_Callback*)cb_favoritesButton); + favoritesButton->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); + favoritesButton->label(favorites_label); + } // Fl_Menu_Button* favoritesButton + { Fl_Button* o = newButton = new Fl_Button(455, 10, 25, 25); + newButton->image(image_new); + newButton->labelsize(8); + newButton->callback((Fl_Callback*)cb_newButton); + o->tooltip(new_directory_tooltip); + } // Fl_Button* newButton + o->end(); + } // Fl_Group* o + { Fl_Tile* o = new Fl_Tile(10, 45, 470, 225); + o->callback((Fl_Callback*)cb_); + { fileList = new Fl_File_Browser(10, 45, 295, 225); + fileList->type(2); + fileList->callback((Fl_Callback*)cb_fileList); + fileList->window()->hotspot(fileList); + } // Fl_File_Browser* fileList + { previewBox = new Fl_Box(305, 45, 175, 225, "?"); + previewBox->box(FL_DOWN_BOX); + previewBox->labelsize(100); + previewBox->align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE); + } // Fl_Box* previewBox + o->end(); + Fl_Group::current()->resizable(o); + } // Fl_Tile* o + { Fl_Group* o = new Fl_Group(10, 275, 470, 95); + { Fl_Group* o = new Fl_Group(10, 275, 470, 20); + { previewButton = new Fl_Check_Button(10, 275, 73, 20, "Preview"); + previewButton->down_box(FL_DOWN_BOX); + previewButton->value(1); + previewButton->shortcut(0x80070); + previewButton->callback((Fl_Callback*)cb_previewButton); + previewButton->label(preview_label); + } // Fl_Check_Button* previewButton + { Fl_Box* o = new Fl_Box(115, 275, 365, 20); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + { fileName = new Fl_File_Input(115, 300, 365, 35); + fileName->labelfont(1); + fileName->callback((Fl_Callback*)cb_fileName); + fileName->when(FL_WHEN_ENTER_KEY); + Fl_Group::current()->resizable(fileName); + fileName->when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY); + } // Fl_File_Input* fileName + { Fl_Box* o = new Fl_Box(10, 310, 105, 25, "Filename:"); + o->labelfont(1); + o->align(FL_ALIGN_RIGHT|FL_ALIGN_INSIDE); + o->label(filename_label); + } // Fl_Box* o + { Fl_Group* o = new Fl_Group(10, 345, 470, 25); + { okButton = new Fl_Return_Button(313, 345, 85, 25, "OK"); + okButton->callback((Fl_Callback*)cb_okButton); + okButton->label(fl_ok); + } // Fl_Return_Button* okButton + { Fl_Button* o = cancelButton = new Fl_Button(408, 345, 72, 25, "Cancel"); + cancelButton->callback((Fl_Callback*)cb_cancelButton); + o->label(fl_cancel); + } // Fl_Button* cancelButton + { Fl_Box* o = new Fl_Box(10, 345, 30, 25); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + o->end(); + } // Fl_Group* o + if (title) window->label(title); + window->set_modal(); + window->end(); + } // Fl_Double_Window* window + { favWindow = new Fl_Double_Window(355, 150, "Manage Favorites"); + favWindow->user_data((void*)(this)); + { favList = new Fl_File_Browser(10, 10, 300, 95); + favList->type(2); + favList->callback((Fl_Callback*)cb_favList); + Fl_Group::current()->resizable(favList); + } // Fl_File_Browser* favList + { Fl_Group* o = new Fl_Group(320, 10, 25, 95); + { favUpButton = new Fl_Button(320, 10, 25, 25, "@8>"); + favUpButton->callback((Fl_Callback*)cb_favUpButton); + } // Fl_Button* favUpButton + { favDeleteButton = new Fl_Button(320, 45, 25, 25, "X"); + favDeleteButton->labelfont(1); + favDeleteButton->callback((Fl_Callback*)cb_favDeleteButton); + Fl_Group::current()->resizable(favDeleteButton); + } // Fl_Button* favDeleteButton + { favDownButton = new Fl_Button(320, 80, 25, 25, "@2>"); + favDownButton->callback((Fl_Callback*)cb_favDownButton); + } // Fl_Button* favDownButton + o->end(); + } // Fl_Group* o + { Fl_Group* o = new Fl_Group(10, 113, 335, 29); + { favCancelButton = new Fl_Button(273, 115, 72, 25, "Cancel"); + favCancelButton->callback((Fl_Callback*)cb_favCancelButton); + favCancelButton->label(fl_cancel); + } // Fl_Button* favCancelButton + { favOkButton = new Fl_Return_Button(181, 115, 79, 25, "Save"); + favOkButton->callback((Fl_Callback*)cb_favOkButton); + favOkButton->label(save_label); + } // Fl_Return_Button* favOkButton + { Fl_Box* o = new Fl_Box(10, 115, 161, 25); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + favWindow->label(manage_favorites_label); + favWindow->set_modal(); + favWindow->size_range(181, 150); + favWindow->end(); + } // Fl_Double_Window* favWindow + callback_ = 0; +data_ = 0; +directory_[0] = 0; +window->size_range(window->w(), window->h(), Fl::w(), Fl::h()); +type(t); +filter(p); +update_favorites(); +value(d); +type(t); +int e; +prefs_.get("preview", e, 1); +preview(e); +Fl_Group::current(prev_current); +} + +Fl_File_Chooser::~Fl_File_Chooser() { + Fl::remove_timeout((Fl_Timeout_Handler)previewCB, this); +delete window; +delete favWindow; +} + +void Fl_File_Chooser::callback(void (*cb)(Fl_File_Chooser *, void *), void *d ) { + callback_ = cb; +data_ = d; +} + +void Fl_File_Chooser::color(Fl_Color c) { + fileList->color(c); +} + +Fl_Color Fl_File_Chooser::color() { + return (fileList->color()); +} + +char * Fl_File_Chooser::directory() { + return directory_; +} + +const char * Fl_File_Chooser::filter() { + return (fileList->filter()); +} + +int Fl_File_Chooser::filter_value() { + return showChoice->value(); +} + +void Fl_File_Chooser::filter_value(int f) { + showChoice->value(f); +showChoiceCB(); +} + +void Fl_File_Chooser::hide() { + window->hide(); +} + +void Fl_File_Chooser::iconsize(uchar s) { + fileList->iconsize(s); +} + +uchar Fl_File_Chooser::iconsize() { + return (fileList->iconsize()); +} + +void Fl_File_Chooser::label(const char *l) { + window->label(l); +} + +const char * Fl_File_Chooser::label() { + return (window->label()); +} + +void Fl_File_Chooser::ok_label(const char *l) { + okButton->label(l); +int w=0, h=0; +okButton->measure_label(w, h); +okButton->resize(cancelButton->x() - 50 - w, cancelButton->y(), + w + 40, 25); +okButton->parent()->init_sizes(); +} + +const char * Fl_File_Chooser::ok_label() { + return (okButton->label()); +} + +void Fl_File_Chooser::show() { + window->hotspot(fileList); +window->show(); +Fl::flush(); +fl_cursor(FL_CURSOR_WAIT); +rescan_keep_filename(); +fl_cursor(FL_CURSOR_DEFAULT); +fileName->take_focus(); +} + +int Fl_File_Chooser::shown() { + return window->shown(); +} + +void Fl_File_Chooser::textcolor(Fl_Color c) { + fileList->textcolor(c); +} + +Fl_Color Fl_File_Chooser::textcolor() { + return (fileList->textcolor()); +} + +void Fl_File_Chooser::textfont(uchar f) { + fileList->textfont(f); +} + +uchar Fl_File_Chooser::textfont() { + return (fileList->textfont()); +} + +void Fl_File_Chooser::textsize(uchar s) { + fileList->textsize(s); +} + +uchar Fl_File_Chooser::textsize() { + return (fileList->textsize()); +} + +void Fl_File_Chooser::type(int t) { + type_ = t; +if (t & MULTI) + fileList->type(FL_MULTI_BROWSER); +else + fileList->type(FL_HOLD_BROWSER); +if (t & CREATE) + newButton->activate(); +else + newButton->deactivate(); +if (t & DIRECTORY) + fileList->filetype(Fl_File_Browser::DIRECTORIES); +else + fileList->filetype(Fl_File_Browser::FILES); +} + +int Fl_File_Chooser::type() { + return (type_); +} + +void * Fl_File_Chooser::user_data() const { + return (data_); +} + +void Fl_File_Chooser::user_data(void *d) { + data_ = d; +} + +int Fl_File_Chooser::visible() { + return window->visible(); +} + +// +// End of "$Id: Fl_File_Chooser.cxx 6092 2008-04-11 12:57:37Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_File_Chooser.fl b/third_party/windows/fltk-1.1.10/src/Fl_File_Chooser.fl new file mode 100644 index 0000000..934e4d4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_File_Chooser.fl @@ -0,0 +1,426 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0108 +header_name {../FL/Fl_File_Chooser.H} +code_name {.cxx} +comment {// +// "$Id: Fl_File_Chooser.fl 6092 2008-04-11 12:57:37Z matt $" +// +// Fl_File_Chooser dialog for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +} {in_source in_header +} + +decl {\#include } {} + +class FL_EXPORT Fl_File_Chooser {open +} { + decl {enum { SINGLE = 0, MULTI = 1, CREATE = 2, DIRECTORY = 4 };} {public + } + decl {static Fl_Preferences prefs_;} {} + decl {void (*callback_)(Fl_File_Chooser*, void *);} {} + decl {void *data_;} {} + decl {char directory_[1024];} {} + decl {char pattern_[1024];} {} + decl {char preview_text_[2048];} {} + decl {int type_;} {} + decl {void favoritesButtonCB();} {} + decl {void favoritesCB(Fl_Widget *w);} {} + decl {void fileListCB();} {} + decl {void fileNameCB();} {} + decl {void newdir();} {} + decl {static void previewCB(Fl_File_Chooser *fc);} {} + decl {void showChoiceCB();} {} + decl {void update_favorites();} {} + decl {void update_preview();} {} + Function {Fl_File_Chooser(const char *d, const char *p, int t, const char *title)} {open + } { + code {Fl_Group *prev_current = Fl_Group::current();} {} + Fl_Window window { + label {Choose File} + callback {fileName->value(""); +fileList->deselect(); +Fl::remove_timeout((Fl_Timeout_Handler)previewCB, this); +window->hide();} open + private xywh {388 284 490 380} type Double resizable + code0 {if (title) window->label(title);} + code1 {\#include } + code2 {\#include } + code3 {\#include } modal visible + } { + Fl_Group {} { + private xywh {10 10 470 25} + } { + Fl_Choice showChoice { + label {Show:} + callback {showChoiceCB();} open + private xywh {65 10 215 25} down_box BORDER_BOX labelfont 1 resizable + code0 {showChoice->label(show_label);} + } {} + Fl_Menu_Button favoritesButton { + label Favorites + callback {favoritesButtonCB();} open + private xywh {290 10 155 25} down_box BORDER_BOX align 20 + code0 {favoritesButton->label(favorites_label);} + } {} + Fl_Button newButton { + callback {newdir();} + image {new.xbm} xywh {455 10 25 25} labelsize 8 + code0 {\#include } + code1 {o->tooltip(new_directory_tooltip);} + } + } + Fl_Tile {} { + callback {update_preview();} + private xywh {10 45 470 225} resizable + } { + Fl_File_Browser fileList { + callback {fileListCB();} + private xywh {10 45 295 225} type Hold hotspot + code0 {\#include } + } + Fl_Box previewBox { + label {?} selected + private xywh {305 45 175 225} box DOWN_BOX labelsize 100 align 80 + } + } + Fl_Group {} {open + private xywh {10 275 470 95} + } { + Fl_Group {} {open + private xywh {10 275 470 20} + } { + Fl_Check_Button previewButton { + label Preview + callback {preview(previewButton->value());} + xywh {10 275 73 20} down_box DOWN_BOX shortcut 0x80070 value 1 + code0 {previewButton->label(preview_label);} + } + Fl_Box {} { + private xywh {115 275 365 20} resizable + } + } + Fl_File_Input fileName { + callback {fileNameCB();} + private xywh {115 300 365 35} labelfont 1 when 8 resizable + code0 {fileName->when(FL_WHEN_CHANGED | FL_WHEN_ENTER_KEY);} + } + Fl_Box {} { + label {Filename:} + private xywh {10 310 105 25} labelfont 1 align 24 + code0 {o->label(filename_label);} + } + Fl_Group {} {open + private xywh {10 345 470 25} + } { + Fl_Return_Button okButton { + label OK + callback {window->hide(); + +// Do any callback that is registered... +if (callback_) + (*callback_)(this, data_);} + private xywh {313 345 85 25} + code0 {\#include } + code1 {okButton->label(fl_ok);} + } + Fl_Button cancelButton { + label Cancel + callback {fileName->value(""); +fileList->deselect(); +Fl::remove_timeout((Fl_Timeout_Handler)previewCB, this); +window->hide();} + private xywh {408 345 72 25} + code0 {o->label(fl_cancel);} + } + Fl_Box {} { + private xywh {10 345 30 25} resizable + } + } + } + } + Fl_Window favWindow { + label {Manage Favorites} + private xywh {413 100 355 150} type Double resizable + code0 {favWindow->label(manage_favorites_label);} modal size_range {181 150 0 0} visible + } { + Fl_File_Browser favList { + callback {favoritesCB(favList);} + private xywh {10 10 300 95} type Hold resizable + } + Fl_Group {} {open + xywh {320 10 25 95} + } { + Fl_Button favUpButton { + label {@8>} + callback {favoritesCB(favUpButton);} + private xywh {320 10 25 25} + } + Fl_Button favDeleteButton { + label X + callback {favoritesCB(favDeleteButton);} + private xywh {320 45 25 25} labelfont 1 resizable + } + Fl_Button favDownButton { + label {@2>} + callback {favoritesCB(favDownButton);} + private xywh {320 80 25 25} + } + } + Fl_Group {} {open + xywh {10 113 335 29} + } { + Fl_Button favCancelButton { + label Cancel + callback {favWindow->hide();} + private xywh {273 115 72 25} + code0 {favCancelButton->label(fl_cancel);} + } + Fl_Return_Button favOkButton { + label Save + callback {favoritesCB(favOkButton);} + private xywh {181 115 79 25} + code0 {\#include } + code1 {favOkButton->label(save_label);} + } + Fl_Box {} { + xywh {10 115 161 25} resizable + } + } + } + code {callback_ = 0; +data_ = 0; +directory_[0] = 0; +window->size_range(window->w(), window->h(), Fl::w(), Fl::h()); +type(t); +filter(p); +update_favorites(); +value(d); +type(t); +int e; +prefs_.get("preview", e, 1); +preview(e); +Fl_Group::current(prev_current);} {} + } + Function {~Fl_File_Chooser()} {} { + code {Fl::remove_timeout((Fl_Timeout_Handler)previewCB, this); +delete window; +delete favWindow;} {} + } + Function {callback(void (*cb)(Fl_File_Chooser *, void *), void *d = 0)} {return_type void + } { + code {callback_ = cb; +data_ = d;} {} + } + Function {color(Fl_Color c)} {} { + code {fileList->color(c);} {} + } + Function {color()} {return_type Fl_Color + } { + code {return (fileList->color());} {} + } + decl {int count();} {public + } + decl {void directory(const char *d);} {public + } + Function {directory()} {return_type {char *} + } { + code {return directory_;} {} + } + decl {void filter(const char *p);} {public + } + Function {filter()} {return_type {const char *} + } { + code {return (fileList->filter());} {} + } + Function {filter_value()} {return_type int + } { + code {return showChoice->value();} {} + } + Function {filter_value(int f)} {return_type void + } { + code {showChoice->value(f); +showChoiceCB();} {} + } + Function {hide()} {return_type void + } { + code {window->hide();} {} + } + Function {iconsize(uchar s)} {return_type void + } { + code {fileList->iconsize(s);} {} + } + Function {iconsize()} {return_type uchar + } { + code {return (fileList->iconsize());} {} + } + Function {label(const char *l)} {return_type void + } { + code {window->label(l);} {} + } + Function {label()} {return_type {const char *} + } { + code {return (window->label());} {} + } + Function {ok_label(const char *l)} {return_type void + } { + code {okButton->label(l); +int w=0, h=0; +okButton->measure_label(w, h); +okButton->resize(cancelButton->x() - 50 - w, cancelButton->y(), + w + 40, 25); +okButton->parent()->init_sizes();} {} + } + Function {ok_label()} {return_type {const char *} + } { + code {return (okButton->label());} {} + } + decl {void preview(int e);} {public + } + decl {int preview() const { return previewButton->value(); }} {public + } + decl {void rescan();} {public + } + decl {void rescan_keep_filename();} {public + } + Function {show()} {open return_type void + } { + code {window->hotspot(fileList); +window->show(); +Fl::flush(); +fl_cursor(FL_CURSOR_WAIT); +rescan_keep_filename(); +fl_cursor(FL_CURSOR_DEFAULT); +fileName->take_focus();} {} + } + Function {shown()} {return_type int + } { + code {return window->shown();} {} + } + Function {textcolor(Fl_Color c)} {return_type void + } { + code {fileList->textcolor(c);} {} + } + Function {textcolor()} {return_type Fl_Color + } { + code {return (fileList->textcolor());} {} + } + Function {textfont(uchar f)} {return_type void + } { + code {fileList->textfont(f);} {} + } + Function {textfont()} {return_type uchar + } { + code {return (fileList->textfont());} {} + } + Function {textsize(uchar s)} {return_type void + } { + code {fileList->textsize(s);} {} + } + Function {textsize()} {return_type uchar + } { + code {return (fileList->textsize());} {} + } + Function {type(int t)} {return_type void + } { + code {type_ = t; +if (t & MULTI) + fileList->type(FL_MULTI_BROWSER); +else + fileList->type(FL_HOLD_BROWSER); +if (t & CREATE) + newButton->activate(); +else + newButton->deactivate(); +if (t & DIRECTORY) + fileList->filetype(Fl_File_Browser::DIRECTORIES); +else + fileList->filetype(Fl_File_Browser::FILES);} {} + } + Function {type()} {return_type int + } { + code {return (type_);} {} + } + Function {user_data() const} {return_type {void *} + } { + code {return (data_);} {} + } + Function {user_data(void *d)} {return_type void + } { + code {data_ = d;} {} + } + decl {const char *value(int f = 1);} {public + } + decl {void value(const char *filename);} {public + } + Function {visible()} {return_type int + } { + code {return window->visible();} {} + } + decl {static const char *add_favorites_label;} {public + } + decl {static const char *all_files_label;} {public + } + decl {static const char *custom_filter_label;} {public + } + decl {static const char *existing_file_label;} {public + } + decl {static const char *favorites_label;} {public + } + decl {static const char *filename_label;} {public + } + decl {static const char *filesystems_label;} {public + } + decl {static const char *manage_favorites_label;} {public + } + decl {static const char *new_directory_label;} {public + } + decl {static const char *new_directory_tooltip;} {public + } + decl {static const char *preview_label;} {public + } + decl {static const char *save_label;} {public + } + decl {static const char *show_label;} {public + } + decl {static Fl_File_Sort_F *sort;} {public + } +} + +decl {FL_EXPORT char *fl_dir_chooser(const char *message,const char *fname,int relative=0);} {public +} + +decl {FL_EXPORT char *fl_file_chooser(const char *message,const char *pat,const char *fname,int relative=0);} {public +} + +decl {FL_EXPORT void fl_file_chooser_callback(void (*cb)(const char*));} {public +} + +decl {FL_EXPORT void fl_file_chooser_ok_label(const char*l);} {public +} + +comment { +// +// End of "$Id: Fl_File_Chooser.fl 6092 2008-04-11 12:57:37Z matt $". +//} {in_source in_header +} diff --git a/third_party/windows/fltk-1.1.10/src/Fl_File_Chooser2.cxx b/third_party/windows/fltk-1.1.10/src/Fl_File_Chooser2.cxx new file mode 100644 index 0000000..b147546 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_File_Chooser2.cxx @@ -0,0 +1,1308 @@ +// +// "$Id: Fl_File_Chooser2.cxx 6092 2008-04-11 12:57:37Z matt $" +// +// More Fl_File_Chooser routines. +// +// Copyright 1999-2005 by Michael Sweet. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// Fl_File_Chooser::count() - Return the number of selected files. +// Fl_File_Chooser::directory() - Set the directory in the file chooser. +// Fl_File_Chooser::filter() - Set the filter(s) for the chooser. +// Fl_File_Chooser::newdir() - Make a new directory. +// Fl_File_Chooser::value() - Return a selected filename. +// Fl_File_Chooser::rescan() - Rescan the current directory. +// Fl_File_Chooser::favoritesButtonCB() - Handle favorites selections. +// Fl_File_Chooser::fileListCB() - Handle clicks (and double-clicks) +// in the Fl_File_Browser. +// Fl_File_Chooser::fileNameCB() - Handle text entry in the FileBrowser. +// Fl_File_Chooser::showChoiceCB() - Handle show selections. +// compare_dirnames() - Compare two directory names. +// quote_pathname() - Quote a pathname for a menu. +// unquote_pathname() - Unquote a pathname from a menu. +// + +// +// Include necessary headers. +// + +#include +#include +#include +#include +#include + +#include +#include +#include "flstring.h" +#include +#include +#include + +#if defined(WIN32) && ! defined (__CYGWIN__) +# include +# include +// Visual C++ 2005 incorrectly displays a warning about the use of POSIX APIs +// on Windows, which is supposed to be POSIX compliant... +# define access _access +# define mkdir _mkdir +// Apparently Borland C++ defines DIRECTORY in , which +// interfers with the Fl_File_Icon enumeration of the same name. +# ifdef DIRECTORY +# undef DIRECTORY +# endif // DIRECTORY +#else +# include +# include +#endif /* WIN32 */ + + +// +// File chooser label strings and sort function... +// + +Fl_Preferences Fl_File_Chooser::prefs_(Fl_Preferences::USER, "fltk.org", "filechooser"); + +const char *Fl_File_Chooser::add_favorites_label = "Add to Favorites"; +const char *Fl_File_Chooser::all_files_label = "All Files (*)"; +const char *Fl_File_Chooser::custom_filter_label = "Custom Filter"; +const char *Fl_File_Chooser::existing_file_label = "Please choose an existing file!"; +const char *Fl_File_Chooser::favorites_label = "Favorites"; +const char *Fl_File_Chooser::filename_label = "Filename:"; +#ifdef WIN32 +const char *Fl_File_Chooser::filesystems_label = "My Computer"; +#else +const char *Fl_File_Chooser::filesystems_label = "File Systems"; +#endif // WIN32 +const char *Fl_File_Chooser::manage_favorites_label = "Manage Favorites"; +const char *Fl_File_Chooser::new_directory_label = "New Directory?"; +const char *Fl_File_Chooser::new_directory_tooltip = "Create a new directory."; +const char *Fl_File_Chooser::preview_label = "Preview"; +const char *Fl_File_Chooser::save_label = "Save"; +const char *Fl_File_Chooser::show_label = "Show:"; +Fl_File_Sort_F *Fl_File_Chooser::sort = fl_numericsort; + + +// +// Local functions... +// + +static int compare_dirnames(const char *a, const char *b); +static void quote_pathname(char *, const char *, int); +static void unquote_pathname(char *, const char *, int); + + +// +// 'Fl_File_Chooser::count()' - Return the number of selected files. +// + +int // O - Number of selected files +Fl_File_Chooser::count() { + int i; // Looping var + int fcount; // Number of selected files + const char *filename; // Filename in input field or list + + + filename = fileName->value(); + + if (!(type_ & MULTI)) { + // Check to see if the file name input field is blank... + if (!filename || !filename[0]) return 0; + else return 1; + } + + for (i = 1, fcount = 0; i <= fileList->size(); i ++) + if (fileList->selected(i)) { + // See if this file is a directory... + // matt: why would we do that? It is perfectly legal to select multiple + // directories in a DIR chooser. They are visually selected and value(i) + // returns all of them as expected + //filename = (char *)fileList->text(i); + + //if (filename[strlen(filename) - 1] != '/') + fcount ++; + } + + if (fcount) return fcount; + else if (!filename || !filename[0]) return 0; + else return 1; +} + + +// +// 'Fl_File_Chooser::directory()' - Set the directory in the file chooser. +// + +void +Fl_File_Chooser::directory(const char *d)// I - Directory to change to +{ + char *dirptr; // Pointer into directory + + +// printf("Fl_File_Chooser::directory(\"%s\")\n", d == NULL ? "(null)" : d); + + // NULL == current directory + if (d == NULL) + d = "."; + +#ifdef WIN32 + // See if the filename contains backslashes... + char *slash; // Pointer to slashes + char fixpath[1024]; // Path with slashes converted + if (strchr(d, '\\')) { + // Convert backslashes to slashes... + strlcpy(fixpath, d, sizeof(fixpath)); + + for (slash = strchr(fixpath, '\\'); slash; slash = strchr(slash + 1, '\\')) + *slash = '/'; + + d = fixpath; + } +#endif // WIN32 + + if (d[0] != '\0') + { + // Make the directory absolute... +#if (defined(WIN32) && ! defined(__CYGWIN__))|| defined(__EMX__) + if (d[0] != '/' && d[0] != '\\' && d[1] != ':') +#else + if (d[0] != '/' && d[0] != '\\') +#endif /* WIN32 || __EMX__ */ + fl_filename_absolute(directory_, d); + else + strlcpy(directory_, d, sizeof(directory_)); + + // Strip any trailing slash... + dirptr = directory_ + strlen(directory_) - 1; + if ((*dirptr == '/' || *dirptr == '\\') && dirptr > directory_) + *dirptr = '\0'; + + // See if we have a trailing .. or . in the filename... + dirptr = directory_ + strlen(directory_) - 3; + if (dirptr >= directory_ && strcmp(dirptr, "/..") == 0) { + // Yes, we have "..", so strip the trailing path... + *dirptr = '\0'; + while (dirptr > directory_) { + if (*dirptr == '/') break; + dirptr --; + } + + if (dirptr >= directory_ && *dirptr == '/') + *dirptr = '\0'; + } else if ((dirptr + 1) >= directory_ && strcmp(dirptr + 1, "/.") == 0) { + // Strip trailing "."... + dirptr[1] = '\0'; + } + } + else + directory_[0] = '\0'; + + if (shown()) { + // Rescan the directory... + rescan(); + } +} + + +// +// 'Fl_File_Chooser::favoritesButtonCB()' - Handle favorites selections. +// + +void +Fl_File_Chooser::favoritesButtonCB() +{ + int v; // Current selection + char pathname[1024], // Pathname + menuname[2048]; // Menu name + + + v = favoritesButton->value(); + + if (!v) { + // Add current directory to favorites... + if (getenv("HOME")) v = favoritesButton->size() - 5; + else v = favoritesButton->size() - 4; + + sprintf(menuname, "favorite%02d", v); + + prefs_.set(menuname, directory_); + prefs_.flush(); + + quote_pathname(menuname, directory_, sizeof(menuname)); + favoritesButton->add(menuname); + + if (favoritesButton->size() > 104) { + ((Fl_Menu_Item *)favoritesButton->menu())[0].deactivate(); + } + } else if (v == 1) { + // Manage favorites... + favoritesCB(0); + } else if (v == 2) { + // Filesystems/My Computer + directory(""); + } else { + unquote_pathname(pathname, favoritesButton->text(v), sizeof(pathname)); + directory(pathname); + } +} + + +// +// 'Fl_File_Chooser::favoritesCB()' - Handle favorites dialog. +// + +void +Fl_File_Chooser::favoritesCB(Fl_Widget *w) + // I - Widget +{ + int i; // Looping var + char name[32], // Preference name + pathname[1024]; // Directory in list + + + if (!w) { + // Load the favorites list... + favList->clear(); + favList->deselect(); + + for (i = 0; i < 100; i ++) { + // Get favorite directory 0 to 99... + sprintf(name, "favorite%02d", i); + + prefs_.get(name, pathname, "", sizeof(pathname)); + + // Stop on the first empty favorite... + if (!pathname[0]) break; + + // Add the favorite to the list... + favList->add(pathname, + Fl_File_Icon::find(pathname, Fl_File_Icon::DIRECTORY)); + } + + favUpButton->deactivate(); + favDeleteButton->deactivate(); + favDownButton->deactivate(); + favOkButton->deactivate(); + + favWindow->hotspot(favList); + favWindow->show(); + } else if (w == favList) { + i = favList->value(); + if (i) { + if (i > 1) favUpButton->activate(); + else favUpButton->deactivate(); + + favDeleteButton->activate(); + + if (i < favList->size()) favDownButton->activate(); + else favDownButton->deactivate(); + } else { + favUpButton->deactivate(); + favDeleteButton->deactivate(); + favDownButton->deactivate(); + } + } else if (w == favUpButton) { + i = favList->value(); + + favList->insert(i - 1, favList->text(i), favList->data(i)); + favList->remove(i + 1); + favList->select(i - 1); + + if (i == 2) favUpButton->deactivate(); + + favDownButton->activate(); + + favOkButton->activate(); + } else if (w == favDeleteButton) { + i = favList->value(); + + favList->remove(i); + + if (i > favList->size()) i --; + favList->select(i); + + if (i < favList->size()) favDownButton->activate(); + else favDownButton->deactivate(); + + if (i > 1) favUpButton->activate(); + else favUpButton->deactivate(); + + if (!i) favDeleteButton->deactivate(); + + favOkButton->activate(); + } else if (w == favDownButton) { + i = favList->value(); + + favList->insert(i + 2, favList->text(i), favList->data(i)); + favList->remove(i); + favList->select(i + 1); + + if ((i + 1) == favList->size()) favDownButton->deactivate(); + + favUpButton->activate(); + + favOkButton->activate(); + } else if (w == favOkButton) { + // Copy the new list over... + for (i = 0; i < favList->size(); i ++) { + // Set favorite directory 0 to 99... + sprintf(name, "favorite%02d", i); + + prefs_.set(name, favList->text(i + 1)); + } + + // Clear old entries as necessary... + for (; i < 100; i ++) { + // Clear favorite directory 0 to 99... + sprintf(name, "favorite%02d", i); + + prefs_.get(name, pathname, "", sizeof(pathname)); + + if (pathname[0]) prefs_.set(name, ""); + else break; + } + + update_favorites(); + prefs_.flush(); + + favWindow->hide(); + } +} + + +// +// 'Fl_File_Chooser::fileListCB()' - Handle clicks (and double-clicks) in the +// Fl_File_Browser. +// + +void +Fl_File_Chooser::fileListCB() +{ + char *filename, // New filename + pathname[1024]; // Full pathname to file + + + filename = (char *)fileList->text(fileList->value()); + if (!filename) + return; + + if (!directory_[0]) { + strlcpy(pathname, filename, sizeof(pathname)); + } else if (strcmp(directory_, "/") == 0) { + snprintf(pathname, sizeof(pathname), "/%s", filename); + } else { + snprintf(pathname, sizeof(pathname), "%s/%s", directory_, filename); + } + + if (Fl::event_clicks()) { +#if (defined(WIN32) && ! defined(__CYGWIN__)) || defined(__EMX__) + if ((strlen(pathname) == 2 && pathname[1] == ':') || + _fl_filename_isdir_quick(pathname)) +#else + if (_fl_filename_isdir_quick(pathname)) +#endif /* WIN32 || __EMX__ */ + { + // Change directories... + directory(pathname); + + // Reset the click count so that a click in the same spot won't + // be treated as a triple-click. We use a value of -1 because + // the next click will increment click count to 0, which is what + // we really want... + Fl::event_clicks(-1); + } + else + { + // Hide the window - picked the file... + window->hide(); + } + } + else + { + // Check if the user clicks on a directory when picking files; + // if so, make sure only that item is selected... + filename = pathname + strlen(pathname) - 1; + + if ((type_ & MULTI) && !(type_ & DIRECTORY)) { + if (*filename == '/') { + // Clicked on a directory, deselect everything else... + int i = fileList->value(); + fileList->deselect(); + fileList->select(i); + } else { + // Clicked on a file - see if there are other directories selected... + int i; + const char *temp; + for (i = 1; i <= fileList->size(); i ++) { + if (i != fileList->value() && fileList->selected(i)) { + temp = fileList->text(i); + temp += strlen(temp) - 1; + if (*temp == '/') break; // Yes, selected directory + } + } + + if (i <= fileList->size()) { + i = fileList->value(); + fileList->deselect(); + fileList->select(i); + } + } + } + // Strip any trailing slash from the directory name... + if (*filename == '/') *filename = '\0'; + +// puts("Setting fileName from fileListCB..."); + fileName->value(pathname); + + // Update the preview box... + Fl::remove_timeout((Fl_Timeout_Handler)previewCB, this); + Fl::add_timeout(1.0, (Fl_Timeout_Handler)previewCB, this); + + // Do any callback that is registered... + if (callback_) (*callback_)(this, data_); + + // Activate the OK button as needed... + if (!_fl_filename_isdir_quick(pathname) || (type_ & DIRECTORY)) + okButton->activate(); + else + okButton->deactivate(); + } +} + + +// +// 'Fl_File_Chooser::fileNameCB()' - Handle text entry in the FileBrowser. +// + +void +Fl_File_Chooser::fileNameCB() +{ + char *filename, // New filename + *slash, // Pointer to trailing slash + pathname[1024], // Full pathname to file + matchname[256]; // Matching filename + int i, // Looping var + min_match, // Minimum number of matching chars + max_match, // Maximum number of matching chars + num_files, // Number of files in directory + first_line; // First matching line + const char *file; // File from directory + +// puts("fileNameCB()"); +// printf("Event: %s\n", fl_eventnames[Fl::event()]); + + // Get the filename from the text field... + filename = (char *)fileName->value(); + + if (!filename || !filename[0]) { + okButton->deactivate(); + return; + } + + // Expand ~ and $ variables as needed... + if (strchr(filename, '~') || strchr(filename, '$')) { + fl_filename_expand(pathname, sizeof(pathname), filename); + filename = pathname; + value(pathname); + } + + // Make sure we have an absolute path... +#if (defined(WIN32) && !defined(__CYGWIN__)) || defined(__EMX__) + if (directory_[0] != '\0' && filename[0] != '/' && + filename[0] != '\\' && + !(isalpha(filename[0] & 255) && (!filename[1] || filename[1] == ':'))) { +#else + if (directory_[0] != '\0' && filename[0] != '/') { +#endif /* WIN32 || __EMX__ */ + fl_filename_absolute(pathname, sizeof(pathname), filename); + value(pathname); + fileName->mark(fileName->position()); // no selection after expansion + } else if (filename != pathname) { + // Finally, make sure that we have a writable copy... + strlcpy(pathname, filename, sizeof(pathname)); + } + + filename = pathname; + + // Now process things according to the key pressed... + if (Fl::event_key() == FL_Enter || Fl::event_key() == FL_KP_Enter) { + // Enter pressed - select or change directory... +#if (defined(WIN32) && ! defined(__CYGWIN__)) || defined(__EMX__) + if ((isalpha(pathname[0] & 255) && pathname[1] == ':' && !pathname[2]) || + _fl_filename_isdir_quick(pathname) && + compare_dirnames(pathname, directory_)) { +#else + if (_fl_filename_isdir_quick(pathname) && + compare_dirnames(pathname, directory_)) { +#endif /* WIN32 || __EMX__ */ + directory(pathname); + } else if ((type_ & CREATE) || access(pathname, 0) == 0) { + if (!_fl_filename_isdir_quick(pathname) || (type_ & DIRECTORY)) { + // Update the preview box... + update_preview(); + + // Do any callback that is registered... + if (callback_) (*callback_)(this, data_); + + // Hide the window to signal things are done... + window->hide(); + } + } else { + // File doesn't exist, so beep at and alert the user... + fl_alert(existing_file_label); + } + } + else if (Fl::event_key() != FL_Delete && + Fl::event_key() != FL_BackSpace) { + // Check to see if the user has entered a directory... + if ((slash = strrchr(pathname, '/')) == NULL) + slash = strrchr(pathname, '\\'); + + if (!slash) return; + + // Yes, change directories if necessary... + *slash++ = '\0'; + filename = slash; + +#if defined(WIN32) || defined(__EMX__) + if (strcasecmp(pathname, directory_) && + (pathname[0] || strcasecmp("/", directory_))) { +#else + if (strcmp(pathname, directory_) && + (pathname[0] || strcasecmp("/", directory_))) { +#endif // WIN32 || __EMX__ + int p = fileName->position(); + int m = fileName->mark(); + + directory(pathname); + + if (filename[0]) { + char tempname[1024]; + + snprintf(tempname, sizeof(tempname), "%s/%s", directory_, filename); + fileName->value(tempname); + strlcpy(pathname, tempname, sizeof(pathname)); + } + + fileName->position(p, m); + } + + // Other key pressed - do filename completion as possible... + num_files = fileList->size(); + min_match = strlen(filename); + max_match = min_match + 1; + first_line = 0; + + for (i = 1; i <= num_files && max_match > min_match; i ++) { + file = fileList->text(i); + +#if (defined(WIN32) && ! defined(__CYGWIN__)) || defined(__EMX__) + if (strncasecmp(filename, file, min_match) == 0) { +#else + if (strncmp(filename, file, min_match) == 0) { +#endif // WIN32 || __EMX__ + // OK, this one matches; check against the previous match + if (!first_line) { + // First match; copy stuff over... + strlcpy(matchname, file, sizeof(matchname)); + max_match = strlen(matchname); + + // Strip trailing /, if any... + if (matchname[max_match - 1] == '/') { + max_match --; + matchname[max_match] = '\0'; + } + + // And then make sure that the item is visible + fileList->topline(i); + first_line = i; + } else { + // Succeeding match; compare to find maximum string match... + while (max_match > min_match) +#if (defined(WIN32) && ! defined(__CYGWIN__)) || defined(__EMX__) + if (strncasecmp(file, matchname, max_match) == 0) +#else + if (strncmp(file, matchname, max_match) == 0) +#endif // WIN32 || __EMX__ + break; + else + max_match --; + + // Truncate the string as needed... + matchname[max_match] = '\0'; + } + } + } + + // If we have any matches, add them to the input field... + if (first_line > 0 && min_match == max_match && + max_match == (int)strlen(fileList->text(first_line))) { + // This is the only possible match... + fileList->deselect(0); + fileList->select(first_line); + fileList->redraw(); + } else if (max_match > min_match && first_line) { + // Add the matching portion... + fileName->replace(filename - pathname, filename - pathname + min_match, + matchname); + + // Highlight it with the cursor at the end of the selection so + // s/he can press the right arrow to accept the selection + // (Tab and End also do this for both cases.) + fileName->position(filename - pathname + max_match, + filename - pathname + min_match); + } else if (max_match == 0) { + fileList->deselect(0); + fileList->redraw(); + } + + // See if we need to enable the OK button... + if (((type_ & CREATE) || !access(fileName->value(), 0)) && + (!fl_filename_isdir(fileName->value()) || (type_ & DIRECTORY))) { + okButton->activate(); + } else { + okButton->deactivate(); + } + } else { + // FL_Delete or FL_BackSpace + fileList->deselect(0); + fileList->redraw(); + if (((type_ & CREATE) || !access(fileName->value(), 0)) && + (!fl_filename_isdir(fileName->value()) || (type_ & DIRECTORY))) { + okButton->activate(); + } else { + okButton->deactivate(); + } + } +} + + +// +// 'Fl_File_Chooser::filter()' - Set the filter(s) for the chooser. +// + +void +Fl_File_Chooser::filter(const char *p) // I - Pattern(s) +{ + char *copyp, // Copy of pattern + *start, // Start of pattern + *end; // End of pattern + int allfiles; // Do we have a "*" pattern? + char temp[1024]; // Temporary pattern string + + + // Make sure we have a pattern... + if (!p || !*p) p = "*"; + + // Copy the pattern string... + copyp = strdup(p); + + // Separate the pattern string as necessary... + showChoice->clear(); + + for (start = copyp, allfiles = 0; start && *start; start = end) { + end = strchr(start, '\t'); + if (end) *end++ = '\0'; + + if (strcmp(start, "*") == 0) { + showChoice->add(all_files_label); + allfiles = 1; + } else { + quote_pathname(temp, start, sizeof(temp)); + showChoice->add(temp); + if (strstr(start, "(*)") != NULL) allfiles = 1; + } + } + + free(copyp); + + if (!allfiles) showChoice->add(all_files_label); + + showChoice->add(custom_filter_label); + + showChoice->value(0); + showChoiceCB(); +} + + +// +// 'Fl_File_Chooser::newdir()' - Make a new directory. +// + +void +Fl_File_Chooser::newdir() +{ + const char *dir; // New directory name + char pathname[1024]; // Full path of directory + + + // Get a directory name from the user + if ((dir = fl_input(new_directory_label, NULL)) == NULL) + return; + + // Make it relative to the current directory as needed... +#if (defined(WIN32) && ! defined (__CYGWIN__)) || defined(__EMX__) + if (dir[0] != '/' && dir[0] != '\\' && dir[1] != ':') +#else + if (dir[0] != '/' && dir[0] != '\\') +#endif /* WIN32 || __EMX__ */ + snprintf(pathname, sizeof(pathname), "%s/%s", directory_, dir); + else + strlcpy(pathname, dir, sizeof(pathname)); + + // Create the directory; ignore EEXIST errors... +#if defined(WIN32) && ! defined (__CYGWIN__) + if (mkdir(pathname)) +#else + if (mkdir(pathname, 0777)) +#endif /* WIN32 */ + if (errno != EEXIST) + { + fl_alert("%s", strerror(errno)); + return; + } + + // Show the new directory... + directory(pathname); +} + + +// +// 'Fl_File_Chooser::preview()' - Enable or disable the preview tile. +// + +void +Fl_File_Chooser::preview(int e)// I - 1 = enable preview, 0 = disable preview +{ + previewButton->value(e); + prefs_.set("preview", e); + prefs_.flush(); + + Fl_Group *p = previewBox->parent(); + if (e) { + int w = p->w() * 2 / 3; + fileList->resize(fileList->x(), fileList->y(), + w, fileList->h()); + previewBox->resize(fileList->x()+w, previewBox->y(), + p->w()-w, previewBox->h()); + previewBox->show(); + update_preview(); + } else { + fileList->resize(fileList->x(), fileList->y(), + p->w(), fileList->h()); + previewBox->resize(p->x()+p->w(), previewBox->y(), + 0, previewBox->h()); + previewBox->hide(); + } + p->init_sizes(); + + fileList->parent()->redraw(); +} + + +// +// 'Fl_File_Chooser::previewCB()' - Timeout handler for the preview box. +// + +void +Fl_File_Chooser::previewCB(Fl_File_Chooser *fc) { // I - File chooser + fc->update_preview(); +} + + +// +// 'Fl_File_Chooser::rescan()' - Rescan the current directory. +// + +void +Fl_File_Chooser::rescan() +{ + char pathname[1024]; // New pathname for filename field + + + // Clear the current filename + strlcpy(pathname, directory_, sizeof(pathname)); + if (pathname[0] && pathname[strlen(pathname) - 1] != '/') { + strlcat(pathname, "/", sizeof(pathname)); + } +// puts("Setting fileName in rescan()"); + fileName->value(pathname); + + if (type_ & DIRECTORY) + okButton->activate(); + else + okButton->deactivate(); + + // Build the file list... + fileList->load(directory_, sort); + + // Update the preview box... + update_preview(); +} + +// +// 'Fl_File_Chooser::rescan_keep_filename()' - Rescan the current directory +// without clearing the filename, then select the file if it is in the list +// + +void +Fl_File_Chooser::rescan_keep_filename() +{ + // if no filename was set, this is likely a diretory browser + const char *fn = fileName->value(); + if (!fn || !*fn || fn[strlen(fn) - 1]=='/') { + rescan(); + return; + } + + int i; + char pathname[1024]; // New pathname for filename field + strlcpy(pathname, fn, sizeof(pathname)); + + // Build the file list... + fileList->load(directory_, sort); + + // Update the preview box... + update_preview(); + + // and select the chosen file + char found = 0; + char *slash = strrchr(pathname, '/'); + if (slash) + slash++; + else + slash = pathname; + for (i = 1; i <= fileList->size(); i ++) +#if defined(WIN32) || defined(__EMX__) + if (strcasecmp(fileList->text(i), slash) == 0) { +#else + if (strcmp(fileList->text(i), slash) == 0) { +#endif // WIN32 || __EMX__ + fileList->topline(i); + fileList->select(i); + found = 1; + break; + } + + // update OK button activity + if (found || type_ & CREATE) + okButton->activate(); + else + okButton->deactivate(); +} + + +// +// 'Fl_File_Chooser::showChoiceCB()' - Handle show selections. +// + +void +Fl_File_Chooser::showChoiceCB() +{ + const char *item, // Selected item + *patstart; // Start of pattern + char *patend; // End of pattern + char temp[1024]; // Temporary string for pattern + + + item = showChoice->text(showChoice->value()); + + if (strcmp(item, custom_filter_label) == 0) { + if ((item = fl_input(custom_filter_label, pattern_)) != NULL) { + strlcpy(pattern_, item, sizeof(pattern_)); + + quote_pathname(temp, item, sizeof(temp)); + showChoice->add(temp); + showChoice->value(showChoice->size() - 2); + } + } else if ((patstart = strchr(item, '(')) == NULL) { + strlcpy(pattern_, item, sizeof(pattern_)); + } else { + strlcpy(pattern_, patstart + 1, sizeof(pattern_)); + if ((patend = strrchr(pattern_, ')')) != NULL) *patend = '\0'; + } + + fileList->filter(pattern_); + + if (shown()) { + // Rescan the directory... + rescan_keep_filename(); + } +} + + +// +// 'Fl_File_Chooser::update_favorites()' - Update the favorites menu. +// + +void +Fl_File_Chooser::update_favorites() +{ + int i; // Looping var + char pathname[1024], // Pathname + menuname[2048]; // Menu name + const char *home; // Home directory + + + favoritesButton->clear(); + favoritesButton->add("bla"); + favoritesButton->clear(); + favoritesButton->add(add_favorites_label, FL_ALT + 'a', 0); + favoritesButton->add(manage_favorites_label, FL_ALT + 'm', 0, 0, FL_MENU_DIVIDER); + favoritesButton->add(filesystems_label, FL_ALT + 'f', 0); + + if ((home = getenv("HOME")) != NULL) { + quote_pathname(menuname, home, sizeof(menuname)); + favoritesButton->add(menuname, FL_ALT + 'h', 0); + } + + for (i = 0; i < 100; i ++) { + sprintf(menuname, "favorite%02d", i); + prefs_.get(menuname, pathname, "", sizeof(pathname)); + if (!pathname[0]) break; + + quote_pathname(menuname, pathname, sizeof(menuname)); + + if (i < 10) favoritesButton->add(menuname, FL_ALT + '0' + i, 0); + else favoritesButton->add(menuname); + } + + if (i == 100) ((Fl_Menu_Item *)favoritesButton->menu())[0].deactivate(); +} + + +// +// 'Fl_File_Chooser::update_preview()' - Update the preview box... +// + +void +Fl_File_Chooser::update_preview() +{ + const char *filename; // Current filename + Fl_Shared_Image *image, // New image + *oldimage; // Old image + int pbw, pbh; // Width and height of preview box + int w, h; // Width and height of preview image + + + if (!previewButton->value()) return; + + if ((filename = value()) == NULL || fl_filename_isdir(filename)) image = NULL; + else { + window->cursor(FL_CURSOR_WAIT); + Fl::check(); + + image = Fl_Shared_Image::get(filename); + + if (image) { + window->cursor(FL_CURSOR_DEFAULT); + Fl::check(); + } + } + + oldimage = (Fl_Shared_Image *)previewBox->image(); + + if (oldimage) oldimage->release(); + + previewBox->image(0); + + if (!image) { + FILE *fp; + int bytes; + char *ptr; + + if (filename) fp = fopen(filename, "rb"); + else fp = NULL; + + if (fp != NULL) { + // Try reading the first 1k of data for a label... + bytes = fread(preview_text_, 1, sizeof(preview_text_) - 1, fp); + preview_text_[bytes] = '\0'; + fclose(fp); + } else { + // Assume we can't read any data... + preview_text_[0] = '\0'; + } + + window->cursor(FL_CURSOR_DEFAULT); + Fl::check(); + + // Scan the buffer for printable chars... + for (ptr = preview_text_; + *ptr && (isprint(*ptr & 255) || isspace(*ptr & 255)); + ptr ++); + + if (*ptr || ptr == preview_text_) { + // Non-printable file, just show a big ?... + previewBox->label(filename ? "?" : 0); + previewBox->align(FL_ALIGN_CLIP); + previewBox->labelsize(100); + previewBox->labelfont(FL_HELVETICA); + } else { + // Show the first 1k of text... + int size = previewBox->h() / 20; + if (size < 6) size = 6; + else if (size > 14) size = 14; + + previewBox->label(preview_text_); + previewBox->align((Fl_Align)(FL_ALIGN_CLIP | FL_ALIGN_INSIDE | + FL_ALIGN_LEFT | FL_ALIGN_TOP)); + previewBox->labelsize((uchar)size); + previewBox->labelfont(FL_COURIER); + } + } else { + pbw = previewBox->w() - 20; + pbh = previewBox->h() - 20; + + if (image->w() > pbw || image->h() > pbh) { + w = pbw; + h = w * image->h() / image->w(); + + if (h > pbh) { + h = pbh; + w = h * image->w() / image->h(); + } + + oldimage = (Fl_Shared_Image *)image->copy(w, h); + previewBox->image((Fl_Image *)oldimage); + + image->release(); + } else { + previewBox->image((Fl_Image *)image); + } + + previewBox->align(FL_ALIGN_CLIP); + previewBox->label(0); + } + + previewBox->redraw(); +} + + +// +// 'Fl_File_Chooser::value()' - Return a selected filename. +// + +const char * // O - Filename or NULL +Fl_File_Chooser::value(int f) // I - File number +{ + int i; // Looping var + int fcount; // Number of selected files + const char *name; // Current filename + static char pathname[1024]; // Filename + directory + + + name = fileName->value(); + + if (!(type_ & MULTI)) { + // Return the filename in the filename field... + if (!name || !name[0]) return NULL; + else return name; + } + + // Return a filename from the list... + for (i = 1, fcount = 0; i <= fileList->size(); i ++) + if (fileList->selected(i)) { + // See if this file is a selected file/directory... + name = fileList->text(i); + + fcount ++; + + if (fcount == f) { + if (directory_[0]) { + snprintf(pathname, sizeof(pathname), "%s/%s", directory_, name); + } else { + strlcpy(pathname, name, sizeof(pathname)); + } + + return pathname; + } + } + + // If nothing is selected, use the filename field... + if (!name || !name[0]) return NULL; + else return name; +} + + +// +// 'Fl_File_Chooser::value()' - Set the current filename. +// + +void +Fl_File_Chooser::value(const char *filename) + // I - Filename + directory +{ + int i, // Looping var + fcount; // Number of items in list + char *slash; // Directory separator + char pathname[1024]; // Local copy of filename + + +// printf("Fl_File_Chooser::value(\"%s\")\n", filename == NULL ? "(null)" : filename); + + // See if the filename is the "My System" directory... + if (filename == NULL || !filename[0]) { + // Yes, just change the current directory... + directory(filename); + fileName->value(""); + okButton->deactivate(); + return; + } + +#ifdef WIN32 + // See if the filename contains backslashes... + char fixpath[1024]; // Path with slashes converted + if (strchr(filename, '\\')) { + // Convert backslashes to slashes... + strlcpy(fixpath, filename, sizeof(fixpath)); + + for (slash = strchr(fixpath, '\\'); slash; slash = strchr(slash + 1, '\\')) + *slash = '/'; + + filename = fixpath; + } +#endif // WIN32 + + // See if there is a directory in there... + fl_filename_absolute(pathname, sizeof(pathname), filename); + + if ((slash = strrchr(pathname, '/')) != NULL) { + // Yes, change the display to the directory... + if (!fl_filename_isdir(pathname)) *slash++ = '\0'; + + directory(pathname); + if (*slash == '/') slash = pathname; + } else { + directory("."); + slash = pathname; + } + + // Set the input field to the absolute path... + if (slash > pathname) slash[-1] = '/'; + + fileName->value(pathname); + fileName->position(0, strlen(pathname)); + okButton->activate(); + + // Then find the file in the file list and select it... + fcount = fileList->size(); + + fileList->deselect(0); + fileList->redraw(); + + for (i = 1; i <= fcount; i ++) +#if defined(WIN32) || defined(__EMX__) + if (strcasecmp(fileList->text(i), slash) == 0) { +#else + if (strcmp(fileList->text(i), slash) == 0) { +#endif // WIN32 || __EMX__ +// printf("Selecting line %d...\n", i); + fileList->topline(i); + fileList->select(i); + break; + } +} + + +// +// 'compare_dirnames()' - Compare two directory names. +// + +static int +compare_dirnames(const char *a, const char *b) { + int alen, blen; + + // Get length of each string... + alen = strlen(a) - 1; + blen = strlen(b) - 1; + + if (alen < 0 || blen < 0) return alen - blen; + + // Check for trailing slashes... + if (a[alen] != '/') alen ++; + if (b[blen] != '/') blen ++; + + // If the lengths aren't the same, then return the difference... + if (alen != blen) return alen - blen; + + // Do a comparison of the first N chars (alen == blen at this point)... +#ifdef WIN32 + return strncasecmp(a, b, alen); +#else + return strncmp(a, b, alen); +#endif // WIN32 +} + + +// +// 'quote_pathname()' - Quote a pathname for a menu. +// + +static void +quote_pathname(char *dst, // O - Destination string + const char *src, // I - Source string + int dstsize) // I - Size of destination string +{ + dstsize --; + + while (*src && dstsize > 1) { + if (*src == '\\') { + // Convert backslash to forward slash... + *dst++ = '\\'; + *dst++ = '/'; + src ++; + } else { + if (*src == '/') *dst++ = '\\'; + + *dst++ = *src++; + } + } + + *dst = '\0'; +} + + +// +// 'unquote_pathname()' - Unquote a pathname from a menu. +// + +static void +unquote_pathname(char *dst, // O - Destination string + const char *src, // I - Source string + int dstsize) // I - Size of destination string +{ + dstsize --; + + while (*src && dstsize > 1) { + if (*src == '\\') src ++; + *dst++ = *src++; + } + + *dst = '\0'; +} + + +// +// End of "$Id: Fl_File_Chooser2.cxx 6092 2008-04-11 12:57:37Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_File_Icon.cxx b/third_party/windows/fltk-1.1.10/src/Fl_File_Icon.cxx new file mode 100644 index 0000000..853b22e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_File_Icon.cxx @@ -0,0 +1,485 @@ +// +// "$Id: Fl_File_Icon.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Fl_File_Icon routines. +// +// KDE icon code donated by Maarten De Boer. +// +// Copyright 1999-2005 by Michael Sweet. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// Fl_File_Icon::Fl_File_Icon() - Create a new file icon. +// Fl_File_Icon::~Fl_File_Icon() - Remove a file icon. +// Fl_File_Icon::add() - Add data to an icon. +// Fl_File_Icon::find() - Find an icon based upon a given file. +// Fl_File_Icon::draw() - Draw an icon. +// Fl_File_Icon::label() - Set the widgets label to an icon. +// Fl_File_Icon::labeltype() - Draw the icon label. +// + +// +// Include necessary header files... +// + +#include +#include +#include "flstring.h" +#include +#include +#include +#if (defined(WIN32) && ! defined(__CYGWIN__)) || defined(__EMX__) +# include +# define F_OK 0 +#else +# include +#endif /* WIN32 || __EMX__ */ + +#include +#include +#include +#include + + +// +// Define missing POSIX/XPG4 macros as needed... +// + +#ifndef S_ISDIR +# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) +# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) +# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) +# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) +#endif /* !S_ISDIR */ + + +// +// Icon cache... +// + +Fl_File_Icon *Fl_File_Icon::first_ = (Fl_File_Icon *)0; + + +// +// 'Fl_File_Icon::Fl_File_Icon()' - Create a new file icon. +// + +Fl_File_Icon::Fl_File_Icon(const char *p, /* I - Filename pattern */ + int t, /* I - File type */ + int nd, /* I - Number of data values */ + short *d) /* I - Data values */ +{ + // Initialize the pattern and type... + pattern_ = p; + type_ = t; + + // Copy icon data as needed... + if (nd) + { + num_data_ = nd; + alloc_data_ = nd + 1; + data_ = (short *)calloc(sizeof(short), nd + 1); + memcpy(data_, d, nd * sizeof(short)); + } + else + { + num_data_ = 0; + alloc_data_ = 0; + } + + // And add the icon to the list of icons... + next_ = first_; + first_ = this; +} + + +// +// 'Fl_File_Icon::~Fl_File_Icon()' - Remove a file icon. +// + +Fl_File_Icon::~Fl_File_Icon() +{ + Fl_File_Icon *current, // Current icon in list + *prev; // Previous icon in list + + + // Find the icon in the list... + for (current = first_, prev = (Fl_File_Icon *)0; + current != this && current != (Fl_File_Icon *)0; + prev = current, current = current->next_); + + // Remove the icon from the list as needed... + if (current) + { + if (prev) + prev->next_ = current->next_; + else + first_ = current->next_; + } + + // Free any memory used... + if (alloc_data_) + free(data_); +} + + +// +// 'Fl_File_Icon::add()' - Add data to an icon. +// + +short * // O - Pointer to new data value +Fl_File_Icon::add(short d) // I - Data to add +{ + short *dptr; // Pointer to new data value + + + // Allocate/reallocate memory as needed + if ((num_data_ + 1) >= alloc_data_) + { + alloc_data_ += 128; + + if (alloc_data_ == 128) + dptr = (short *)malloc(sizeof(short) * alloc_data_); + else + dptr = (short *)realloc(data_, sizeof(short) * alloc_data_); + + if (dptr == NULL) + return (NULL); + + data_ = dptr; + } + + // Store the new data value and return + data_[num_data_++] = d; + data_[num_data_] = END; + + return (data_ + num_data_ - 1); +} + + +// +// 'Fl_File_Icon::find()' - Find an icon based upon a given file. +// + +Fl_File_Icon * // O - Matching file icon or NULL +Fl_File_Icon::find(const char *filename,// I - Name of file */ + int filetype) // I - Enumerated file type +{ + Fl_File_Icon *current; // Current file in list +#ifndef WIN32 + struct stat fileinfo; // Information on file +#endif // !WIN32 + const char *name; // Base name of filename + + + // Get file information if needed... + if (filetype == ANY) + { +#ifdef WIN32 + if (filename[strlen(filename) - 1] == '/') + filetype = DIRECTORY; + else if (fl_filename_isdir(filename)) + filetype = DIRECTORY; + else + filetype = PLAIN; +#else + if (!stat(filename, &fileinfo)) + { + if (S_ISDIR(fileinfo.st_mode)) + filetype = DIRECTORY; +# ifdef S_IFIFO + else if (S_ISFIFO(fileinfo.st_mode)) + filetype = FIFO; +# endif // S_IFIFO +# if defined(S_ICHR) && defined(S_IBLK) + else if (S_ISCHR(fileinfo.st_mode) || S_ISBLK(fileinfo.st_mode)) + filetype = DEVICE; +# endif // S_ICHR && S_IBLK +# ifdef S_ILNK + else if (S_ISLNK(fileinfo.st_mode)) + filetype = LINK; +# endif // S_ILNK + else + filetype = PLAIN; + } + else + filetype = PLAIN; +#endif // WIN32 + } + + // Look at the base name in the filename + name = fl_filename_name(filename); + + // Loop through the available file types and return any match that + // is found... + for (current = first_; current != (Fl_File_Icon *)0; current = current->next_) + if ((current->type_ == filetype || current->type_ == ANY) && + (fl_filename_match(filename, current->pattern_) || + fl_filename_match(name, current->pattern_))) + break; + + // Return the match (if any)... + return (current); +} + + +// +// 'Fl_File_Icon::draw()' - Draw an icon. +// + +void +Fl_File_Icon::draw(int x, // I - Upper-lefthand X + int y, // I - Upper-lefthand Y + int w, // I - Width of bounding box + int h, // I - Height of bounding box + Fl_Color ic, // I - Icon color... + int active) // I - Active or inactive? +{ + Fl_Color c, // Current color + oc; // Outline color + short *d, // Pointer to data + *dend; // End of data... + short *prim; // Pointer to start of primitive... + double scale; // Scale of icon + + + // Don't try to draw a NULL array! + if (num_data_ == 0) + return; + + // Setup the transform matrix as needed... + scale = w < h ? w : h; + + fl_push_matrix(); + fl_translate((float)x + 0.5 * ((float)w - scale), + (float)y + 0.5 * ((float)h + scale)); + fl_scale(scale, -scale); + + // Loop through the array until we see an unmatched END... + d = data_; + dend = data_ + num_data_; + prim = NULL; + c = ic; + + if (active) + fl_color(c); + else + fl_color(fl_inactive(c)); + + while (d < dend) + switch (*d) + { + case END : + if (prim) + switch (*prim) + { + case LINE : + fl_end_line(); + break; + + case CLOSEDLINE : + fl_end_loop(); + break; + + case POLYGON : + fl_end_complex_polygon(); + break; + + case OUTLINEPOLYGON : + fl_end_complex_polygon(); + + oc = (Fl_Color)((((unsigned short *)prim)[1] << 16) | + ((unsigned short *)prim)[2]); + if (active) + { + if (oc == FL_ICON_COLOR) + fl_color(ic); + else + fl_color(oc); + } + else + { + if (oc == FL_ICON_COLOR) + fl_color(fl_inactive(ic)); + else + fl_color(fl_inactive(oc)); + } + + fl_begin_loop(); + + prim += 3; + while (*prim == VERTEX) + { + fl_vertex(prim[1] * 0.0001, prim[2] * 0.0001); + prim += 3; + } + + fl_end_loop(); + fl_color(c); + break; + } + + prim = NULL; + d ++; + break; + + case COLOR : + c = (Fl_Color)((((unsigned short *)d)[1] << 16) | + ((unsigned short *)d)[2]); + + if (c == FL_ICON_COLOR) + c = ic; + + if (!active) + c = fl_inactive(c); + + fl_color(c); + d += 3; + break; + + case LINE : + prim = d; + d ++; + fl_begin_line(); + break; + + case CLOSEDLINE : + prim = d; + d ++; + fl_begin_loop(); + break; + + case POLYGON : + prim = d; + d ++; + fl_begin_complex_polygon(); + break; + + case OUTLINEPOLYGON : + prim = d; + d += 3; + fl_begin_complex_polygon(); + break; + + case VERTEX : + if (prim) + fl_vertex(d[1] * 0.0001, d[2] * 0.0001); + d += 3; + break; + + default : // Ignore invalid data... + d ++; + } + + // If we still have an open primitive, close it... + if (prim) + switch (*prim) + { + case LINE : + fl_end_line(); + break; + + case CLOSEDLINE : + fl_end_loop(); + break; + + case POLYGON : + fl_end_polygon(); + break; + + case OUTLINEPOLYGON : + fl_end_polygon(); + + oc = (Fl_Color)((((unsigned short *)prim)[1] << 16) | + ((unsigned short *)prim)[2]); + if (active) + { + if (oc == FL_ICON_COLOR) + fl_color(ic); + else + fl_color(oc); + } + else + { + if (oc == FL_ICON_COLOR) + fl_color(fl_inactive(ic)); + else + fl_color(fl_inactive(oc)); + } + + fl_begin_loop(); + + prim += 3; + while (*prim == VERTEX) + { + fl_vertex(prim[1] * 0.0001, prim[2] * 0.0001); + prim += 3; + } + + fl_end_loop(); + fl_color(c); + break; + } + + // Restore the transform matrix + fl_pop_matrix(); +} + + +// +// 'Fl_File_Icon::label()' - Set the widget's label to an icon. +// + +void +Fl_File_Icon::label(Fl_Widget *w) // I - Widget to label +{ + Fl::set_labeltype(_FL_ICON_LABEL, labeltype, 0); + w->label(_FL_ICON_LABEL, (const char*)this); +} + + +// +// 'Fl_File_Icon::labeltype()' - Draw the icon label. +// + +void +Fl_File_Icon::labeltype(const Fl_Label *o, // I - Label data + int x, // I - X position of label + int y, // I - Y position of label + int w, // I - Width of label + int h, // I - Height of label + Fl_Align a) // I - Label alignment (not used) +{ + Fl_File_Icon *icon; // Pointer to icon data + + + (void)a; + + icon = (Fl_File_Icon *)(o->value); + if (icon) icon->draw(x, y, w, h, (Fl_Color)(o->color)); +} + + +// +// End of "$Id: Fl_File_Icon.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_File_Icon2.cxx b/third_party/windows/fltk-1.1.10/src/Fl_File_Icon2.cxx new file mode 100644 index 0000000..d7b6eaf --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_File_Icon2.cxx @@ -0,0 +1,1015 @@ +// +// "$Id: Fl_File_Icon2.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Fl_File_Icon system icon routines. +// +// KDE icon code donated by Maarten De Boer. +// +// Copyright 1999-2005 by Michael Sweet. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// Fl_File_Icon::load() - Load an icon file... +// Fl_File_Icon::load_fti() - Load an SGI-format FTI file... +// Fl_File_Icon::load_image() - Load an image icon file... +// Fl_File_Icon::load_system_icons() - Load the standard system icons/filetypes. +// load_kde_icons() - Load KDE icon files. +// load_kde_mimelnk() - Load a KDE "mimelnk" file. +// kde_to_fltk_pattern() - Convert a KDE pattern to a FLTK pattern. +// get_kde_val() - Get a KDE value. +// + +// +// Include necessary header files... +// + +#include +#include +#include "flstring.h" +#include +#include +#include +#include +#include +#if defined(WIN32) && !defined(__CYGWIN__) +# include +# define F_OK 0 +// Visual C++ 2005 incorrectly displays a warning about the use of POSIX APIs +// on Windows, which is supposed to be POSIX compliant... +# define access _access +#else +# include +#endif // WIN32 + +#include +#include +#include +#include +#include + + +// +// Define missing POSIX/XPG4 macros as needed... +// + +#ifndef S_ISDIR +# define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) +# define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) +# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +# define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) +# define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) +#endif /* !S_ISDIR */ + + +// +// Local functions... +// + +static void load_kde_icons(const char *directory, const char *icondir); +static void load_kde_mimelnk(const char *filename, const char *icondir); +static char *kde_to_fltk_pattern(const char *kdepattern); +static char *get_kde_val(char *str, const char *key); + + +// +// Local globals... +// + +static const char *kdedir = NULL; + + +// +// 'Fl_File_Icon::load()' - Load an icon file... +// + +void +Fl_File_Icon::load(const char *f) // I - File to read from +{ + int i; // Load status... + const char *ext; // File extension + + + ext = fl_filename_ext(f); + + if (ext && strcmp(ext, ".fti") == 0) + i = load_fti(f); + else + i = load_image(f); + + if (i) + { + Fl::warning("Fl_File_Icon::load(): Unable to load icon file \"%s\".", f); + return; + } +} + + +// +// 'Fl_File_Icon::load_fti()' - Load an SGI-format FTI file... +// + +int // O - 0 on success, non-zero on error +Fl_File_Icon::load_fti(const char *fti) // I - File to read from +{ + FILE *fp; // File pointer + int ch; // Current character + char command[255], // Command string ("vertex", etc.) + params[255], // Parameter string ("10.0,20.0", etc.) + *ptr; // Pointer into strings + int outline; // Outline polygon + + + // Try to open the file... + if ((fp = fopen(fti, "rb")) == NULL) + { + Fl::error("Fl_File_Icon::load_fti(): Unable to open \"%s\" - %s", + fti, strerror(errno)); + return -1; + } + + // Read the entire file, adding data as needed... + outline = 0; + + while ((ch = getc(fp)) != EOF) + { + // Skip whitespace + if (isspace(ch)) + continue; + + // Skip comments starting with "#"... + if (ch == '#') + { + while ((ch = getc(fp)) != EOF) + if (ch == '\n') + break; + + if (ch == EOF) + break; + else + continue; + } + + // OK, this character better be a letter... + if (!isalpha(ch)) + { + Fl::error("Fl_File_Icon::load_fti(): Expected a letter at file position %ld (saw '%c')", + ftell(fp) - 1, ch); + break; + } + + // Scan the command name... + ptr = command; + *ptr++ = ch; + + while ((ch = getc(fp)) != EOF) + { + if (ch == '(') + break; + else if (ptr < (command + sizeof(command) - 1)) + *ptr++ = ch; + } + + *ptr++ = '\0'; + + // Make sure we stopped on a parenthesis... + if (ch != '(') + { + Fl::error("Fl_File_Icon::load_fti(): Expected a ( at file position %ld (saw '%c')", + ftell(fp) - 1, ch); + break; + } + + // Scan the parameters... + ptr = params; + + while ((ch = getc(fp)) != EOF) + { + if (ch == ')') + break; + else if (ptr < (params + sizeof(params) - 1)) + *ptr++ = ch; + } + + *ptr++ = '\0'; + + // Make sure we stopped on a parenthesis... + if (ch != ')') + { + Fl::error("Fl_File_Icon::load_fti(): Expected a ) at file position %ld (saw '%c')", + ftell(fp) - 1, ch); + break; + } + + // Make sure the next character is a semicolon... + if ((ch = getc(fp)) != ';') + { + Fl::error("Fl_File_Icon::load_fti(): Expected a ; at file position %ld (saw '%c')", + ftell(fp) - 1, ch); + break; + } + + // Now process the command... + if (strcmp(command, "color") == 0) + { + // Set the color; for negative colors blend the two primaries to + // produce a composite color. Also, the following symbolic color + // names are understood: + // + // name FLTK color + // ------------- ---------- + // iconcolor FL_ICON_COLOR; mapped to the icon color in + // Fl_File_Icon::draw() + // shadowcolor FL_DARK3 + // outlinecolor FL_BLACK + if (strcmp(params, "iconcolor") == 0) + add_color(FL_ICON_COLOR); + else if (strcmp(params, "shadowcolor") == 0) + add_color(FL_DARK3); + else if (strcmp(params, "outlinecolor") == 0) + add_color(FL_BLACK); + else + { + int c = atoi(params); // Color value + + + if (c < 0) + { + // Composite color; compute average... + c = -c; + add_color(fl_color_average((Fl_Color)(c >> 4), + (Fl_Color)(c & 15), 0.5f)); + } + else + add_color((Fl_Color)c); + } + } + else if (strcmp(command, "bgnline") == 0) + add(LINE); + else if (strcmp(command, "bgnclosedline") == 0) + add(CLOSEDLINE); + else if (strcmp(command, "bgnpolygon") == 0) + add(POLYGON); + else if (strcmp(command, "bgnoutlinepolygon") == 0) + { + add(OUTLINEPOLYGON); + outline = add(0) - data_; + add(0); + } + else if (strcmp(command, "endoutlinepolygon") == 0 && outline) + { + unsigned cval; // Color value + + // Set the outline color; see above for valid values... + if (strcmp(params, "iconcolor") == 0) + cval = FL_ICON_COLOR; + else if (strcmp(params, "shadowcolor") == 0) + cval = FL_DARK3; + else if (strcmp(params, "outlinecolor") == 0) + cval = FL_BLACK; + else + { + int c = atoi(params); // Color value + + + if (c < 0) + { + // Composite color; compute average... + c = -c; + cval = fl_color_average((Fl_Color)(c >> 4), (Fl_Color)(c & 15), 0.5f); + } + else + cval = c; + } + + // Store outline color... + data_[outline] = cval >> 16; + data_[outline + 1] = cval; + + outline = 0; + add(END); + } + else if (strncmp(command, "end", 3) == 0) + add(END); + else if (strcmp(command, "vertex") == 0) + { + float x, y; // Coordinates of vertex + + + if (sscanf(params, "%f,%f", &x, &y) != 2) + break; + + add_vertex((short)(int)rint(x * 100.0), (short)(int)rint(y * 100.0)); + } + else + { + Fl::error("Fl_File_Icon::load_fti(): Unknown command \"%s\" at file position %ld.", + command, ftell(fp) - 1); + break; + } + } + + // Close the file and return... + fclose(fp); + +#ifdef DEBUG + printf("Icon File \"%s\":\n", fti); + for (int i = 0; i < num_data_; i ++) + printf(" %d,\n", data_[i]); +#endif /* DEBUG */ + + return 0; +} + + +// +// 'Fl_File_Icon::load_image()' - Load an image icon file... +// + +int // O - 0 on success, non-0 on error +Fl_File_Icon::load_image(const char *ifile) // I - File to read from +{ + Fl_Shared_Image *img; // Image file + + + img = Fl_Shared_Image::get(ifile); + if (!img || !img->count() || !img->w() || !img->h()) return -1; + + if (img->count() == 1) { + int x, y; // X & Y in image + int startx; // Starting X coord + Fl_Color c, // Current color + temp; // Temporary color + const uchar *row; // Pointer into image + + + // Loop through grayscale or RGB image... + for (y = 0, row = (const uchar *)(*(img->data())); y < img->h(); y ++, row += img->ld()) + { + for (x = 0, startx = 0, c = (Fl_Color)-1; + x < img->w(); + x ++, row += img->d()) + { + switch (img->d()) + { + case 1 : + temp = fl_rgb_color(row[0], row[0], row[0]); + break; + case 2 : + if (row[1] > 127) + temp = fl_rgb_color(row[0], row[0], row[0]); + else + temp = (Fl_Color)-1; + break; + case 3 : + temp = fl_rgb_color(row[0], row[1], row[2]); + break; + default : + if (row[3] > 127) + temp = fl_rgb_color(row[0], row[1], row[2]); + else + temp = (Fl_Color)-1; + break; + } + + if (temp != c) + { + if (x > startx && c != (Fl_Color)-1) + { + add_color(c); + add(POLYGON); + add_vertex(startx * 9000 / img->w() + 1000, 9500 - y * 9000 / img->h()); + add_vertex(x * 9000 / img->w() + 1000, 9500 - y * 9000 / img->h()); + add_vertex(x * 9000 / img->w() + 1000, 9500 - (y + 1) * 9000 / img->h()); + add_vertex(startx * 9000 / img->w() + 1000, 9500 - (y + 1) * 9000 / img->h()); + add(END); + } + + c = temp; + startx = x; + } + } + + if (x > startx && c != (Fl_Color)-1) + { + add_color(c); + add(POLYGON); + add_vertex(startx * 9000 / img->w() + 1000, 9500 - y * 9000 / img->h()); + add_vertex(x * 9000 / img->w() + 1000, 9500 - y * 9000 / img->h()); + add_vertex(x * 9000 / img->w() + 1000, 9500 - (y + 1) * 9000 / img->h()); + add_vertex(startx * 9000 / img->w() + 1000, 9500 - (y + 1) * 9000 / img->h()); + add(END); + } + } + } else { + int i, j; // Looping vars + int ch; // Current character + int newch; // New character + int bg; // Background color + char val[16]; // Color value + const char *lineptr, // Pointer into line + *const*ptr; // Pointer into data array + int ncolors, // Number of colors + chars_per_color; // Characters per color + Fl_Color *colors; // Colors + int red, green, blue; // Red, green, and blue values + int x, y; // X & Y in image + int startx; // Starting X coord + + + // Get the pixmap data... + ptr = img->data(); + sscanf(*ptr, "%*d%*d%d%d", &ncolors, &chars_per_color); + + colors = new Fl_Color[1 << (chars_per_color * 8)]; + + // Read the colormap... + memset(colors, 0, sizeof(Fl_Color) << (chars_per_color * 8)); + bg = ' '; + + ptr ++; + + if (ncolors < 0) { + // Read compressed colormap... + const uchar *cmapptr; + + ncolors = -ncolors; + + for (i = 0, cmapptr = (const uchar *)*ptr; i < ncolors; i ++, cmapptr += 4) + colors[cmapptr[0]] = fl_rgb_color(cmapptr[1], cmapptr[2], cmapptr[3]); + + ptr ++; + } else { + for (i = 0; i < ncolors; i ++, ptr ++) { + // Get the color's character + lineptr = *ptr; + ch = *lineptr++; + + if (chars_per_color > 1) ch = (ch << 8) | *lineptr++; + + // Get the color value... + if ((lineptr = strstr(lineptr, "c ")) == NULL) { + // No color; make this black... + colors[ch] = FL_BLACK; + } else if (lineptr[2] == '#') { + // Read the RGB triplet... + lineptr += 3; + for (j = 0; j < 12; j ++) + if (!isxdigit(lineptr[j])) + break; + + switch (j) { + case 0 : + bg = ch; + default : + red = green = blue = 0; + break; + + case 3 : + val[0] = lineptr[0]; + val[1] = '\0'; + red = 255 * strtol(val, NULL, 16) / 15; + + val[0] = lineptr[1]; + val[1] = '\0'; + green = 255 * strtol(val, NULL, 16) / 15; + + val[0] = lineptr[2]; + val[1] = '\0'; + blue = 255 * strtol(val, NULL, 16) / 15; + break; + + case 6 : + case 9 : + case 12 : + j /= 3; + + val[0] = lineptr[0]; + val[1] = lineptr[1]; + val[2] = '\0'; + red = strtol(val, NULL, 16); + + val[0] = lineptr[j + 0]; + val[1] = lineptr[j + 1]; + val[2] = '\0'; + green = strtol(val, NULL, 16); + + val[0] = lineptr[2 * j + 0]; + val[1] = lineptr[2 * j + 1]; + val[2] = '\0'; + blue = strtol(val, NULL, 16); + break; + } + + colors[ch] = fl_rgb_color((uchar)red, (uchar)green, (uchar)blue); + } else { + // Read a color name... + if (strncasecmp(lineptr + 2, "white", 5) == 0) colors[ch] = FL_WHITE; + else if (strncasecmp(lineptr + 2, "black", 5) == 0) colors[ch] = FL_BLACK; + else if (strncasecmp(lineptr + 2, "none", 4) == 0) { + colors[ch] = FL_BLACK; + bg = ch; + } else colors[ch] = FL_GRAY; + } + } + } + + // Read the image data... + for (y = 0; y < img->h(); y ++, ptr ++) { + lineptr = *ptr; + startx = 0; + ch = bg; + + for (x = 0; x < img->w(); x ++) { + newch = *lineptr++; + + if (chars_per_color > 1) newch = (newch << 8) | *lineptr++; + + if (newch != ch) { + if (ch != bg) { + add_color(colors[ch]); + add(POLYGON); + add_vertex(startx * 9000 / img->w() + 1000, 9500 - y * 9000 / img->h()); + add_vertex(x * 9000 / img->w() + 1000, 9500 - y * 9000 / img->h()); + add_vertex(x * 9000 / img->w() + 1000, 9500 - (y + 1) * 9000 / img->h()); + add_vertex(startx * 9000 / img->w() + 1000, 9500 - (y + 1) * 9000 / img->h()); + add(END); + } + + ch = newch; + startx = x; + } + } + + if (ch != bg) { + add_color(colors[ch]); + add(POLYGON); + add_vertex(startx * 9000 / img->w() + 1000, 9500 - y * 9000 / img->h()); + add_vertex(x * 9000 / img->w() + 1000, 9500 - y * 9000 / img->h()); + add_vertex(x * 9000 / img->w() + 1000, 9500 - (y + 1) * 9000 / img->h()); + add_vertex(startx * 9000 / img->w() + 1000, 9500 - (y + 1) * 9000 / img->h()); + add(END); + } + } + + // Free the colormap... + delete[] colors; + } + + img->release(); + +#ifdef DEBUG + printf("Icon File \"%s\":\n", xpm); + for (i = 0; i < num_data_; i ++) + printf(" %d,\n", data_[i]); +#endif // DEBUG + + return 0; +} + + +// +// 'Fl_File_Icon::load_system_icons()' - Load the standard system icons/filetypes. + +void +Fl_File_Icon::load_system_icons(void) { + int i; // Looping var + Fl_File_Icon *icon; // New icons + char filename[1024]; // Filename + char icondir[1024]; // Icon directory + static int init = 0; // Have the icons been initialized? + const char * const icondirs[] = { + "Bluecurve", // Icon directories to look for, in order + "crystalsvg", + "default.kde", + "hicolor", + NULL + }; + static short plain[] = { // Plain file icon + COLOR, -1, -1, OUTLINEPOLYGON, 0, FL_GRAY, + VERTEX, 2000, 1000, VERTEX, 2000, 9000, + VERTEX, 6000, 9000, VERTEX, 8000, 7000, + VERTEX, 8000, 1000, END, OUTLINEPOLYGON, 0, FL_GRAY, + VERTEX, 6000, 9000, VERTEX, 6000, 7000, + VERTEX, 8000, 7000, END, + COLOR, 0, FL_BLACK, LINE, VERTEX, 6000, 7000, + VERTEX, 8000, 7000, VERTEX, 8000, 1000, + VERTEX, 2000, 1000, END, LINE, VERTEX, 3000, 7000, + VERTEX, 5000, 7000, END, LINE, VERTEX, 3000, 6000, + VERTEX, 5000, 6000, END, LINE, VERTEX, 3000, 5000, + VERTEX, 7000, 5000, END, LINE, VERTEX, 3000, 4000, + VERTEX, 7000, 4000, END, LINE, VERTEX, 3000, 3000, + VERTEX, 7000, 3000, END, LINE, VERTEX, 3000, 2000, + VERTEX, 7000, 2000, END, + END + }; + static short image[] = { // Image file icon + COLOR, -1, -1, OUTLINEPOLYGON, 0, FL_GRAY, + VERTEX, 2000, 1000, VERTEX, 2000, 9000, + VERTEX, 6000, 9000, VERTEX, 8000, 7000, + VERTEX, 8000, 1000, END, OUTLINEPOLYGON, 0, FL_GRAY, + VERTEX, 6000, 9000, VERTEX, 6000, 7000, + VERTEX, 8000, 7000, END, + COLOR, 0, FL_BLACK, LINE, VERTEX, 6000, 7000, + VERTEX, 8000, 7000, VERTEX, 8000, 1000, + VERTEX, 2000, 1000, END, + COLOR, 0, FL_RED, POLYGON, VERTEX, 3500, 2500, + VERTEX, 3000, 3000, VERTEX, 3000, 4000, + VERTEX, 3500, 4500, VERTEX, 4500, 4500, + VERTEX, 5000, 4000, VERTEX, 5000, 3000, + VERTEX, 4500, 2500, END, + COLOR, 0, FL_GREEN, POLYGON, VERTEX, 5500, 2500, + VERTEX, 5000, 3000, VERTEX, 5000, 4000, + VERTEX, 5500, 4500, VERTEX, 6500, 4500, + VERTEX, 7000, 4000, VERTEX, 7000, 3000, + VERTEX, 6500, 2500, END, + COLOR, 0, FL_BLUE, POLYGON, VERTEX, 4500, 3500, + VERTEX, 4000, 4000, VERTEX, 4000, 5000, + VERTEX, 4500, 5500, VERTEX, 5500, 5500, + VERTEX, 6000, 5000, VERTEX, 6000, 4000, + VERTEX, 5500, 3500, END, + END + }; + static short dir[] = { // Directory icon + COLOR, -1, -1, POLYGON, VERTEX, 1000, 1000, + VERTEX, 1000, 7500, VERTEX, 9000, 7500, + VERTEX, 9000, 1000, END, + POLYGON, VERTEX, 1000, 7500, VERTEX, 2500, 9000, + VERTEX, 5000, 9000, VERTEX, 6500, 7500, END, + COLOR, 0, FL_WHITE, LINE, VERTEX, 1500, 1500, + VERTEX, 1500, 7000, VERTEX, 9000, 7000, END, + COLOR, 0, FL_BLACK, LINE, VERTEX, 9000, 7500, + VERTEX, 9000, 1000, VERTEX, 1000, 1000, END, + COLOR, 0, FL_GRAY, LINE, VERTEX, 1000, 1000, + VERTEX, 1000, 7500, VERTEX, 2500, 9000, + VERTEX, 5000, 9000, VERTEX, 6500, 7500, + VERTEX, 9000, 7500, END, + END + }; + + + // Add symbols if they haven't been added already... + if (!init) { + // This method requires the images library... + fl_register_images(); + + if (!kdedir) { + // Figure out where KDE is installed... + if ((kdedir = getenv("KDEDIR")) == NULL) { + if (!access("/opt/kde", F_OK)) kdedir = "/opt/kde"; + else if (!access("/usr/local/share/mimelnk", F_OK)) kdedir = "/usr/local"; + else kdedir = "/usr"; + } + } + + snprintf(filename, sizeof(filename), "%s/share/mimelnk", kdedir); + + if (!access(filename, F_OK)) { + // Load KDE icons... + icon = new Fl_File_Icon("*", Fl_File_Icon::PLAIN); + + for (i = 0; icondirs[i]; i ++) { + snprintf(icondir, sizeof(icondir), "%s/share/icons/%s", kdedir, + icondirs[i]); + + if (!access(icondir, F_OK)) break; + } + + if (icondirs[i]) { + snprintf(filename, sizeof(filename), "%s/16x16/mimetypes/unknown.png", + icondir); + } else { + snprintf(filename, sizeof(filename), "%s/share/icons/unknown.xpm", + kdedir); + } + + if (!access(filename, F_OK)) icon->load_image(filename); + + icon = new Fl_File_Icon("*", Fl_File_Icon::LINK); + + snprintf(filename, sizeof(filename), "%s/16x16/filesystems/link.png", + icondir); + + if (!access(filename, F_OK)) icon->load_image(filename); + + snprintf(filename, sizeof(filename), "%s/share/mimelnk", kdedir); + load_kde_icons(filename, icondir); + } else if (!access("/usr/share/icons/folder.xpm", F_OK)) { + // Load GNOME icons... + icon = new Fl_File_Icon("*", Fl_File_Icon::PLAIN); + icon->load_image("/usr/share/icons/page.xpm"); + + icon = new Fl_File_Icon("*", Fl_File_Icon::DIRECTORY); + icon->load_image("/usr/share/icons/folder.xpm"); + } else if (!access("/usr/dt/appconfig/icons", F_OK)) { + // Load CDE icons... + icon = new Fl_File_Icon("*", Fl_File_Icon::PLAIN); + icon->load_image("/usr/dt/appconfig/icons/C/Dtdata.m.pm"); + + icon = new Fl_File_Icon("*", Fl_File_Icon::DIRECTORY); + icon->load_image("/usr/dt/appconfig/icons/C/DtdirB.m.pm"); + + icon = new Fl_File_Icon("core", Fl_File_Icon::PLAIN); + icon->load_image("/usr/dt/appconfig/icons/C/Dtcore.m.pm"); + + icon = new Fl_File_Icon("*.{bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", Fl_File_Icon::PLAIN); + icon->load_image("/usr/dt/appconfig/icons/C/Dtimage.m.pm"); + + icon = new Fl_File_Icon("*.{eps|pdf|ps}", Fl_File_Icon::PLAIN); + icon->load_image("/usr/dt/appconfig/icons/C/Dtps.m.pm"); + + icon = new Fl_File_Icon("*.ppd", Fl_File_Icon::PLAIN); + icon->load_image("/usr/dt/appconfig/icons/C/DtPrtpr.m.pm"); + } else if (!access("/usr/lib/filetype", F_OK)) { + // Load SGI icons... + icon = new Fl_File_Icon("*", Fl_File_Icon::PLAIN); + icon->load_fti("/usr/lib/filetype/iconlib/generic.doc.fti"); + + icon = new Fl_File_Icon("*", Fl_File_Icon::DIRECTORY); + icon->load_fti("/usr/lib/filetype/iconlib/generic.folder.closed.fti"); + + icon = new Fl_File_Icon("core", Fl_File_Icon::PLAIN); + icon->load_fti("/usr/lib/filetype/default/iconlib/CoreFile.fti"); + + icon = new Fl_File_Icon("*.{bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", Fl_File_Icon::PLAIN); + icon->load_fti("/usr/lib/filetype/system/iconlib/ImageFile.fti"); + + if (!access("/usr/lib/filetype/install/iconlib/acroread.doc.fti", F_OK)) { + icon = new Fl_File_Icon("*.{eps|ps}", Fl_File_Icon::PLAIN); + icon->load_fti("/usr/lib/filetype/system/iconlib/PostScriptFile.closed.fti"); + + icon = new Fl_File_Icon("*.pdf", Fl_File_Icon::PLAIN); + icon->load_fti("/usr/lib/filetype/install/iconlib/acroread.doc.fti"); + } else { + icon = new Fl_File_Icon("*.{eps|pdf|ps}", Fl_File_Icon::PLAIN); + icon->load_fti("/usr/lib/filetype/system/iconlib/PostScriptFile.closed.fti"); + } + + if (!access("/usr/lib/filetype/install/iconlib/html.fti", F_OK)) { + icon = new Fl_File_Icon("*.{htm|html|shtml}", Fl_File_Icon::PLAIN); + icon->load_fti("/usr/lib/filetype/iconlib/generic.doc.fti"); + icon->load_fti("/usr/lib/filetype/install/iconlib/html.fti"); + } + + if (!access("/usr/lib/filetype/install/iconlib/color.ps.idle.fti", F_OK)) { + icon = new Fl_File_Icon("*.ppd", Fl_File_Icon::PLAIN); + icon->load_fti("/usr/lib/filetype/install/iconlib/color.ps.idle.fti"); + } + } else { + // Create the default icons... + new Fl_File_Icon("*", Fl_File_Icon::PLAIN, sizeof(plain) / sizeof(plain[0]), plain); + new Fl_File_Icon("*.{bm|bmp|bw|gif|jpg|pbm|pcd|pgm|ppm|png|ras|rgb|tif|xbm|xpm}", Fl_File_Icon::PLAIN, + sizeof(image) / sizeof(image[0]), image); + new Fl_File_Icon("*", Fl_File_Icon::DIRECTORY, sizeof(dir) / sizeof(dir[0]), dir); + } + + // Mark things as initialized... + init = 1; + +#ifdef DEBUG + int count; + Fl_File_Icon *temp; + for (count = 0, temp = first_; temp; temp = temp->next_, count ++); + printf("count of Fl_File_Icon's is %d...\n", count); +#endif // DEBUG + } +} + + +// +// 'load_kde_icons()' - Load KDE icon files. +// + +static void +load_kde_icons(const char *directory, // I - Directory to load + const char *icondir) { // I - Location of icons + int i; // Looping var + int n; // Number of entries in directory + dirent **entries; // Entries in directory + char full[1024]; // Full name of file + + + entries = (dirent **)0; + n = fl_filename_list(directory, &entries); + + for (i = 0; i < n; i ++) { + if (entries[i]->d_name[0] != '.') { + snprintf(full, sizeof(full), "%s/%s", directory, entries[i]->d_name); + + if (fl_filename_isdir(full)) load_kde_icons(full, icondir); + else load_kde_mimelnk(full, icondir); + } + + free((void *)entries[i]); + } + + free((void*)entries); +} + + +// +// 'load_kde_mimelnk()' - Load a KDE "mimelnk" file. +// + +static void +load_kde_mimelnk(const char *filename, // I - mimelnk filename + const char *icondir) { // I - Location of icons + FILE *fp; + char tmp[1024]; + char iconfilename[1024]; + char pattern[1024]; + char mimetype[1024]; + char *val; + char full_iconfilename[1024]; + Fl_File_Icon *icon; + + + mimetype[0] = '\0'; + pattern[0] = '\0'; + iconfilename[0] = '\0'; + + if ((fp = fopen(filename, "rb")) != NULL) { + while (fgets(tmp, sizeof(tmp), fp)) { + if ((val = get_kde_val(tmp, "Icon")) != NULL) + strlcpy(iconfilename, val, sizeof(iconfilename)); + else if ((val = get_kde_val(tmp, "MimeType")) != NULL) + strlcpy(mimetype, val, sizeof(mimetype)); + else if ((val = get_kde_val(tmp, "Patterns")) != NULL) + strlcpy(pattern, val, sizeof(pattern)); + } + + fclose(fp); + +#ifdef DEBUG + printf("%s: Icon=\"%s\", MimeType=\"%s\", Patterns=\"%s\"\n", filename, + iconfilename, mimetype, pattern); +#endif // DEBUG + + if (!pattern[0] && strncmp(mimetype, "inode/", 6)) return; + + if (iconfilename[0]) { + if (iconfilename[0] == '/') { + strlcpy(full_iconfilename, iconfilename, sizeof(full_iconfilename)); + } else if (!access(icondir, F_OK)) { + // KDE 3.x and 2.x icons + int i; // Looping var + static const char *paths[] = { // Subdirs to look in... + "16x16/actions", + "16x16/apps", + "16x16/devices", + "16x16/filesystems", + "16x16/mimetypes", +/* + "20x20/actions", + "20x20/apps", + "20x20/devices", + "20x20/filesystems", + "20x20/mimetypes", + + "22x22/actions", + "22x22/apps", + "22x22/devices", + "22x22/filesystems", + "22x22/mimetypes", + + "24x24/actions", + "24x24/apps", + "24x24/devices", + "24x24/filesystems", + "24x24/mimetypes", +*/ + "32x32/actions", + "32x32/apps", + "32x32/devices", + "32x32/filesystems", + "32x32/mimetypes", +/* + "36x36/actions", + "36x36/apps", + "36x36/devices", + "36x36/filesystems", + "36x36/mimetypes", + + "48x48/actions", + "48x48/apps", + "48x48/devices", + "48x48/filesystems", + "48x48/mimetypes", + + "64x64/actions", + "64x64/apps", + "64x64/devices", + "64x64/filesystems", + "64x64/mimetypes", + + "96x96/actions", + "96x96/apps", + "96x96/devices", + "96x96/filesystems", + "96x96/mimetypes" +*/ }; + + for (i = 0; i < (int)(sizeof(paths) / sizeof(paths[0])); i ++) { + snprintf(full_iconfilename, sizeof(full_iconfilename), + "%s/%s/%s.png", icondir, paths[i], iconfilename); + + if (!access(full_iconfilename, F_OK)) break; + } + + if (i >= (int)(sizeof(paths) / sizeof(paths[0]))) return; + } else { + // KDE 1.x icons + snprintf(full_iconfilename, sizeof(full_iconfilename), + "%s/%s", tmp, iconfilename); + + if (access(full_iconfilename, F_OK)) return; + } + + if (strncmp(mimetype, "inode/", 6) == 0) { + if (!strcmp(mimetype + 6, "directory")) + icon = new Fl_File_Icon("*", Fl_File_Icon::DIRECTORY); + else if (!strcmp(mimetype + 6, "blockdevice")) + icon = new Fl_File_Icon("*", Fl_File_Icon::DEVICE); + else if (!strcmp(mimetype + 6, "fifo")) + icon = new Fl_File_Icon("*", Fl_File_Icon::FIFO); + else return; + } else { + icon = new Fl_File_Icon(kde_to_fltk_pattern(pattern), + Fl_File_Icon::PLAIN); + } + + icon->load(full_iconfilename); + } + } +} + + +// +// 'kde_to_fltk_pattern()' - Convert a KDE pattern to a FLTK pattern. +// + +static char * +kde_to_fltk_pattern(const char *kdepattern) { + char *pattern, + *patptr; + + + pattern = (char *)malloc(strlen(kdepattern) + 3); + strcpy(pattern, "{"); + strcpy(pattern + 1, kdepattern); + + if (pattern[strlen(pattern) - 1] == ';') pattern[strlen(pattern) - 1] = '\0'; + + strcat(pattern, "}"); + + for (patptr = pattern; *patptr; patptr ++) { + if (*patptr == ';') *patptr = '|'; + } + + return (pattern); +} + + +// +// 'get_kde_val()' - Get a KDE value. +// + +static char * +get_kde_val(char *str, + const char *key) { + while (*str == *key) { + str ++; + key ++; + } + + if (*key == '\0' && *str == '=') { + if (str[strlen(str) - 1] == '\n') str[strlen(str) - 1] = '\0'; + + return (str + 1); + } + + return ((char *)0); +} + + +// +// End of "$Id: Fl_File_Icon2.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_File_Input.cxx b/third_party/windows/fltk-1.1.10/src/Fl_File_Input.cxx new file mode 100644 index 0000000..bfcc794 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_File_Input.cxx @@ -0,0 +1,288 @@ +// +// "$Id: Fl_File_Input.cxx 6759 2009-04-13 07:32:03Z matt $" +// +// File_Input header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// Original version Copyright 1998 by Curtis Edwards. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include "flstring.h" + + +// +// Height of directory buttons... +// + +#define DIR_HEIGHT 10 + + +// +// Redraw bit for directory bar... +// + +#define FL_DAMAGE_BAR 0x10 + + +// +// 'Fl_File_Input::Fl_File_Input()' - Create a Fl_File_Input widget. +// + +Fl_File_Input::Fl_File_Input(int X, int Y, int W, int H, const char *l) + : Fl_Input(X, Y, W, H, l) { + buttons_[0] = 0; + errorcolor_ = FL_RED; + ok_entry_ = 1; + pressed_ = -1; + + down_box(FL_UP_BOX); +} + +// +// 'Fl_File_Input::draw_buttons()' - Draw directory buttons. +// + +void +Fl_File_Input::draw_buttons() { + int i, // Looping var + X; // Current X position + + + if (damage() & (FL_DAMAGE_BAR | FL_DAMAGE_ALL)) { + update_buttons(); + } + + for (X = 0, i = 0; buttons_[i]; i ++) + { + if ((X + buttons_[i]) > xscroll()) { + if (X < xscroll()) { + draw_box(pressed_ == i ? fl_down(down_box()) : down_box(), + x(), y(), X + buttons_[i] - xscroll(), DIR_HEIGHT, FL_GRAY); + } else if ((X + buttons_[i] - xscroll()) > w()) { + draw_box(pressed_ == i ? fl_down(down_box()) : down_box(), + x() + X - xscroll(), y(), w() - X + xscroll(), DIR_HEIGHT, + FL_GRAY); + } else { + draw_box(pressed_ == i ? fl_down(down_box()) : down_box(), + x() + X - xscroll(), y(), buttons_[i], DIR_HEIGHT, FL_GRAY); + } + } + + X += buttons_[i]; + } + + if (X < w()) { + draw_box(pressed_ == i ? fl_down(down_box()) : down_box(), + x() + X - xscroll(), y(), w() - X + xscroll(), DIR_HEIGHT, FL_GRAY); + } +} + +// +// 'Fl_File_Input::update_buttons()' - Update the sizes of the directory buttons. +// + +void +Fl_File_Input::update_buttons() { + int i; // Looping var + const char *start, // Start of path component + *end; // End of path component + + +// puts("update_buttons()"); + + // Set the current font & size... + fl_font(textfont(), textsize()); + + // Loop through the value string, setting widths... + for (i = 0, start = value(); + start && i < (int)(sizeof(buttons_) / sizeof(buttons_[0]) - 1); + start = end, i ++) { +// printf(" start = \"%s\"\n", start); + if ((end = strchr(start, '/')) == NULL) +#if defined(WIN32) || defined(__EMX__) + if ((end = strchr(start, '\\')) == NULL) +#endif // WIN32 || __EMX__ + break; + + end ++; + + buttons_[i] = (short)fl_width(start, end - start); + if (!i) buttons_[i] += Fl::box_dx(box()) + 6; + } + +// printf(" found %d components/buttons...\n", i); + + buttons_[i] = 0; +} + + +// +// 'Fl_File_Input::value()' - Set the value of the widget... +// + +int // O - TRUE on success +Fl_File_Input::value(const char *str, // I - New string value + int len) { // I - Length of value + damage(FL_DAMAGE_BAR); + return Fl_Input::value(str,len); +} + + +int // O - TRUE on success +Fl_File_Input::value(const char *str) { // I - New string value + damage(FL_DAMAGE_BAR); + return Fl_Input::value(str); +} + + +// +// 'Fl_File_Input::draw()' - Draw the file input widget... +// + +void +Fl_File_Input::draw() { + Fl_Boxtype b = box(); + if (damage() & (FL_DAMAGE_BAR | FL_DAMAGE_ALL)) draw_buttons(); + // this flag keeps Fl_Input_::drawtext from drawing a bogus box! + char must_trick_fl_input_ = + Fl::focus()!=this && !size() && !(damage()&FL_DAMAGE_ALL); + if ((damage() & FL_DAMAGE_ALL) || must_trick_fl_input_) + draw_box(b,x(),y()+DIR_HEIGHT,w(),h()-DIR_HEIGHT,color()); + if (!must_trick_fl_input_) + Fl_Input_::drawtext(x()+Fl::box_dx(b)+3, y()+Fl::box_dy(b)+DIR_HEIGHT, + w()-Fl::box_dw(b)-6, h()-Fl::box_dh(b)-DIR_HEIGHT); +} + + +// +// 'Fl_File_Input::handle()' - Handle events in the widget... +// + +int // O - TRUE if we handled event +Fl_File_Input::handle(int event) // I - Event +{ +// printf("handle(event = %d)\n", event); + static char inButtonBar = 0; + + switch (event) { + case FL_MOVE : + case FL_ENTER : + if (active_r()) { + if (Fl::event_y() < (y() + DIR_HEIGHT)) + window()->cursor(FL_CURSOR_DEFAULT); + else + window()->cursor(FL_CURSOR_INSERT); + } + + return 1; + + case FL_PUSH : + inButtonBar = (Fl::event_y() < (y() + DIR_HEIGHT)); + case FL_RELEASE : + case FL_DRAG : + if (inButtonBar) + return handle_button(event); + else + return Fl_Input::handle(event); + + default : + if (Fl_Input::handle(event)) { + damage(FL_DAMAGE_BAR); + return 1; + } + + return 0; + } +} + + +// +// 'Fl_File_Input::handle_button()' - Handle button events in the widget... +// + +int // O - TRUE if we handled event +Fl_File_Input::handle_button(int event) // I - Event +{ + int i, // Looping var + X; // Current X position + char *start, // Start of path component + *end; // End of path component + char newvalue[1024]; // New value + + + // Figure out which button is being pressed... + for (X = 0, i = 0; buttons_[i]; i ++) + { + X += buttons_[i]; + + if (X > xscroll() && Fl::event_x() < (x() + X - xscroll())) break; + } + +// printf("handle_button(event = %d), button = %d\n", event, i); + + // Redraw the directory bar... + if (event == FL_RELEASE) pressed_ = -1; + else pressed_ = (short)i; + + window()->make_current(); + draw_buttons(); + + // Return immediately if the user is clicking on the last button or + // has not released the mouse button... + if (!buttons_[i] || event != FL_RELEASE) return 1; + + // Figure out where to truncate the path... + strlcpy(newvalue, value(), sizeof(newvalue)); + + for (start = newvalue, end = start; start && i >= 0; start = end, i --) { +// printf(" start = \"%s\"\n", start); + if ((end = strchr(start, '/')) == NULL) +#if defined(WIN32) || defined(__EMX__) + if ((end = strchr(start, '\\')) == NULL) +#endif // WIN32 || __EMX__ + break; + + end ++; + } + + if (i < 0) { + // Found the end; truncate the value and update the buttons... + *start = '\0'; + value(newvalue, start - newvalue); + + // Then do the callbacks, if necessary... + set_changed(); + if (when() & FL_WHEN_CHANGED) do_callback(); + } + + return 1; +} + + +// +// End of "$Id: Fl_File_Input.cxx 6759 2009-04-13 07:32:03Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Font.H b/third_party/windows/fltk-1.1.10/src/Fl_Font.H new file mode 100644 index 0000000..f28e0a6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Font.H @@ -0,0 +1,111 @@ +// +// "$Id: Fl_Font.H 5334 2006-08-19 15:24:55Z matt $" +// +// Font definitions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Two internal fltk data structures: +// +// Fl_Fontdesc: an entry into the fl_font() table. There is one of these +// for each fltk font number. +// +// Fl_FontSize: a structure for an actual system font, with junk to +// help choose it and info on character sizes. Each Fl_Fontdesc has a +// linked list of these. These are created the first time each system +// font/size combination is used. + +#ifndef FL_FONT_ +#define FL_FONT_ + +#include + +# if USE_XFT +typedef struct _XftFont XftFont; +# endif // USE_XFT + +class Fl_FontSize { +public: + Fl_FontSize *next; // linked list for this Fl_Fontdesc +# ifdef WIN32 + HFONT fid; + int width[256]; + TEXTMETRIC metr; + FL_EXPORT Fl_FontSize(const char* fontname, int size); +# elif defined(__APPLE_QD__) + FL_EXPORT Fl_FontSize(const char* fontname, int size); + short font, face, size; + short ascent, descent; + short width[256]; + bool knowMetrics; +# elif defined(__APPLE_QUARTZ__) + FL_EXPORT Fl_FontSize(const char* fontname, int size); + ATSUTextLayout layout; + ATSUStyle style; + short ascent, descent, q_width; + short width[256]; + bool knowWidths; + char *q_name; + int size; +# elif USE_XFT + XftFont* font; + const char* encoding; + int size; + FL_EXPORT Fl_FontSize(const char* xfontname); +# else + XFontStruct* font; // X font information + FL_EXPORT Fl_FontSize(const char* xfontname); +# endif + int minsize; // smallest point size that should use this + int maxsize; // largest point size that should use this +# if HAVE_GL + unsigned int listbase;// base of display list, 0 = none +# endif + FL_EXPORT ~Fl_FontSize(); +}; + +extern FL_EXPORT Fl_FontSize *fl_fontsize; // the currently selected one + +struct Fl_Fontdesc { + const char *name; + char fontname[128]; // "Pretty" font name + Fl_FontSize *first; // linked list of sizes of this style +# ifndef WIN32 + char **xlist; // matched X font names + int n; // size of xlist, negative = don't free xlist! +# endif +}; + +extern FL_EXPORT Fl_Fontdesc *fl_fonts; // the table + +# ifndef WIN32 +// functions for parsing X font names: +FL_EXPORT const char* fl_font_word(const char *p, int n); +FL_EXPORT char *fl_find_fontsize(char *name); +# endif + +#endif + +// +// End of "$Id: Fl_Font.H 5334 2006-08-19 15:24:55Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_GIF_Image.cxx b/third_party/windows/fltk-1.1.10/src/Fl_GIF_Image.cxx new file mode 100644 index 0000000..21ea9fd --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_GIF_Image.cxx @@ -0,0 +1,384 @@ +// +// "$Id: Fl_GIF_Image.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// Fl_GIF_Image routines. +// +// Copyright 1997-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// + +// +// Include necessary header files... +// + +#include +#include +#include +#include +#include "flstring.h" + +// Read a .gif file and convert it to a "xpm" format (actually my +// modified one with compressed colormaps). + +// Extensively modified from original code for gif2ras by +// Patrick J. Naughton of Sun Microsystems. The original +// copyright notice follows: + +/* gif2ras.c - Converts from a Compuserve GIF (tm) image to a Sun Raster image. + * + * Copyright (c) 1988 by Patrick J. Naughton + * + * Author: Patrick J. Naughton + * naughton@wind.sun.com + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation. + * + * This file is provided AS IS with no warranties of any kind. The author + * shall have no liability with respect to the infringement of copyrights, + * trade secrets or any patents by this file or any part thereof. In no + * event will the author be liable for any lost revenue or profits or + * other special, indirect and consequential damages. + * + * Comments and additions should be sent to the author: + * + * Patrick J. Naughton + * Sun Microsystems, Inc. + * 2550 Garcia Ave, MS 14-40 + * Mountain View, CA 94043 + * (415) 336-1080 + */ + +typedef unsigned char uchar; + +#define NEXTBYTE (uchar)getc(GifFile) +#define GETSHORT(var) var = NEXTBYTE; var += NEXTBYTE << 8 + +Fl_GIF_Image::Fl_GIF_Image(const char *infname) : Fl_Pixmap((char *const*)0) { + FILE *GifFile; // File to read + char **new_data; // Data array + + if ((GifFile = fopen(infname, "rb")) == NULL) { + Fl::error("Fl_GIF_Image: Unable to open %s!", infname); + return; + } + + {char b[6]; + if (fread(b,1,6,GifFile)<6) { + fclose(GifFile); + return; /* quit on eof */ + } + if (b[0]!='G' || b[1]!='I' || b[2] != 'F') { + fclose(GifFile); + Fl::error("Fl_GIF_Image: %s is not a GIF file.\n", infname); + return; + } + if (b[3]!='8' || b[4]>'9' || b[5]!= 'a') + Fl::warning("%s is version %c%c%c.",infname,b[3],b[4],b[5]); + } + + int Width; GETSHORT(Width); + int Height; GETSHORT(Height); + + uchar ch = NEXTBYTE; + char HasColormap = ((ch & 0x80) != 0); + int BitsPerPixel = (ch & 7) + 1; + int ColorMapSize = 1 << BitsPerPixel; + // int OriginalResolution = ((ch>>4)&7)+1; + // int SortedTable = (ch&8)!=0; + ch = NEXTBYTE; // Background Color index + ch = NEXTBYTE; // Aspect ratio is N/64 + + // Read in global colormap: + uchar transparent_pixel = 0; + char has_transparent = 0; + uchar Red[256], Green[256], Blue[256]; /* color map */ + if (HasColormap) { + for (int i=0; i < ColorMapSize; i++) { + Red[i] = NEXTBYTE; + Green[i] = NEXTBYTE; + Blue[i] = NEXTBYTE; + } + } else { + Fl::warning("%s does not have a colormap.", infname); + for (int i = 0; i < ColorMapSize; i++) + Red[i] = Green[i] = Blue[i] = (uchar)(255 * i / (ColorMapSize-1)); + } + + int CodeSize; /* Code size, init from GIF header, increases... */ + char Interlace; + + for (;;) { + + int i = NEXTBYTE; + if (i<0) { + fclose(GifFile); + Fl::error("Fl_GIF_Image: %s - unexpected EOF",infname); + return; + } + int blocklen; + + // if (i == 0x3B) return 0; eof code + + if (i == 0x21) { // a "gif extension" + + ch = NEXTBYTE; + blocklen = NEXTBYTE; + + if (ch==0xF9 && blocklen==4) { // Netscape animation extension + + char bits; + bits = NEXTBYTE; + getc(GifFile); getc(GifFile); // GETSHORT(delay); + transparent_pixel = NEXTBYTE; + if (bits & 1) has_transparent = 1; + blocklen = NEXTBYTE; + + } else if (ch == 0xFF) { // Netscape repeat count + ; + + } else if (ch != 0xFE) { //Gif Comment + Fl::warning("%s: unknown gif extension 0x%02x.", infname, ch); + } + } else if (i == 0x2c) { // an image + + ch = NEXTBYTE; ch = NEXTBYTE; // GETSHORT(x_position); + ch = NEXTBYTE; ch = NEXTBYTE; // GETSHORT(y_position); + GETSHORT(Width); + GETSHORT(Height); + ch = NEXTBYTE; + Interlace = ((ch & 0x40) != 0); + if (ch&0x80) { + // read local color map + int n = 2<<(ch&7); + for (i=0; i < n; i++) { + Red[i] = NEXTBYTE; + Green[i] = NEXTBYTE; + Blue[i] = NEXTBYTE; + } + } + CodeSize = NEXTBYTE+1; + break; // okay, this is the image we want + } else { + Fl::warning("%s: unknown gif code 0x%02x", infname, i); + blocklen = 0; + } + + // skip the data: + while (blocklen>0) {while (blocklen--) {ch = NEXTBYTE;} blocklen=NEXTBYTE;} + } + + if (BitsPerPixel >= CodeSize) + { + // Workaround for broken GIF files... + BitsPerPixel = CodeSize - 1; + ColorMapSize = 1 << BitsPerPixel; + } + + uchar *Image = new uchar[Width*Height]; + + int YC = 0, Pass = 0; /* Used to de-interlace the picture */ + uchar *p = Image; + uchar *eol = p+Width; + + int InitCodeSize = CodeSize; + int ClearCode = (1 << (CodeSize-1)); + int EOFCode = ClearCode + 1; + int FirstFree = ClearCode + 2; + int FinChar = 0; + int ReadMask = (1< 7) { + if (blocklen <= 0) { + blocklen = NEXTBYTE; + if (blocklen <= 0) break; + } + thisbyte = NEXTBYTE; blocklen--; + CurCode |= thisbyte<<8; + } + if (frombit+CodeSize > 15) { + if (blocklen <= 0) { + blocklen = NEXTBYTE; + if (blocklen <= 0) break; + } + thisbyte = NEXTBYTE; blocklen--; + CurCode |= thisbyte<<16; + } + CurCode = (CurCode>>frombit)&ReadMask; + frombit = (frombit+CodeSize)%8; + + if (CurCode == ClearCode) { + CodeSize = InitCodeSize; + ReadMask = (1<= ColorMapSize) {*tp++ = Suffix[i]; i = Prefix[i];} + *tp++ = FinChar = i; + do { + *p++ = *--tp; + if (p >= eol) { + if (!Interlace) YC++; + else switch (Pass) { + case 0: YC += 8; if (YC >= Height) {Pass++; YC = 4;} break; + case 1: YC += 8; if (YC >= Height) {Pass++; YC = 2;} break; + case 2: YC += 4; if (YC >= Height) {Pass++; YC = 1;} break; + case 3: YC += 2; break; + } + if (YC>=Height) YC=0; /* cheap bug fix when excess data */ + p = Image + YC*Width; + eol = p+Width; + } + } while (tp > OutCode); + + if (OldCode != ClearCode) { + Prefix[FreeCode] = (short)OldCode; + Suffix[FreeCode] = FinChar; + FreeCode++; + if (FreeCode > ReadMask) { + if (CodeSize < 12) { + CodeSize++; + ReadMask = (1 << CodeSize) - 1; + } + else FreeCode--; + } + } + OldCode = CurCode; + } + + // We are done reading the file, now convert to xpm: + + // allocate line pointer arrays: + w(Width); + h(Height); + d(1); + new_data = new char*[Height+2]; + + // transparent pixel must be zero, swap if it isn't: + if (has_transparent && transparent_pixel != 0) { + // swap transparent pixel with zero + p = Image+Width*Height; + while (p-- > Image) { + if (*p==transparent_pixel) *p = 0; + else if (!*p) *p = transparent_pixel; + } + uchar t; + t = Red[0]; + Red[0] = Red[transparent_pixel]; + Red[transparent_pixel] = t; + + t = Green[0]; + Green[0] = Green[transparent_pixel]; + Green[transparent_pixel] = t; + + t = Blue[0]; + Blue[0] = Blue[transparent_pixel]; + Blue[transparent_pixel] = t; + } + + // find out what colors are actually used: + uchar used[256]; uchar remap[256]; + int i; + for (i = 0; i < ColorMapSize; i++) used[i] = 0; + p = Image+Width*Height; + while (p-- > Image) used[*p] = 1; + + // remap them to start with printing characters: + int base = has_transparent && used[0] ? ' ' : ' '+1; + int numcolors = 0; + for (i = 0; i < ColorMapSize; i++) if (used[i]) { + remap[i] = (uchar)(base++); + numcolors++; + } + + // write the first line of xpm data (use suffix as temp array): + int length = sprintf((char*)(Suffix), + "%d %d %d %d",Width,Height,-numcolors,1); + new_data[0] = new char[length+1]; + strcpy(new_data[0], (char*)Suffix); + + // write the colormap + new_data[1] = (char*)(p = new uchar[4*numcolors]); + for (i = 0; i < ColorMapSize; i++) if (used[i]) { + *p++ = remap[i]; + *p++ = Red[i]; + *p++ = Green[i]; + *p++ = Blue[i]; + } + + // remap the image data: + p = Image+Width*Height; + while (p-- > Image) *p = remap[*p]; + + // split the image data into lines: + for (i=0; i +# define GLContext HGLRC +#elif defined(__APPLE_QD__) +# include +# include +# define GLContext AGLContext +#elif defined(__APPLE_QUARTZ__) +// warning: the Quartz version should probably use Core GL (CGL) instead of AGL +# include +# include +# define GLContext AGLContext +#else +# include +# define GLContext GLXContext +#endif + +// Describes crap needed to create a GLContext. +class Fl_Gl_Choice { + int mode; + const int *alist; + Fl_Gl_Choice *next; +public: +#ifdef WIN32 + int pixelformat; // the visual to use + PIXELFORMATDESCRIPTOR pfd; // some wgl calls need this thing +#elif defined(__APPLE_QD__) + AGLPixelFormat pixelformat; +#elif defined(__APPLE_QUARTZ__) + // warning: the Quartz version should probably use Core GL (CGL) instead of AGL + AGLPixelFormat pixelformat; +#else + XVisualInfo *vis; // the visual to use + Colormap colormap; // a colormap for that visual +#endif + // Return one of these structures for a given gl mode. + // The second argument is a glX attribute list, and is used if mode is + // zero. This is not supported on Win32: + static Fl_Gl_Choice *find(int mode, const int *); +}; + +class Fl_Window; + +#ifdef WIN32 + +GLContext fl_create_gl_context(Fl_Window*, const Fl_Gl_Choice*, int layer=0); + +#elif defined(__APPLE_QD__) + +GLContext fl_create_gl_context(Fl_Window*, const Fl_Gl_Choice*, int layer=0); + +#elif defined(__APPLE_QUARTZ__) +// warning: the Quartz version should probably use Core GL (CGL) instead of AGL + +GLContext fl_create_gl_context(Fl_Window*, const Fl_Gl_Choice*, int layer=0); + +#else + +GLContext fl_create_gl_context(XVisualInfo* vis); + +static inline +GLContext fl_create_gl_context(Fl_Window*, const Fl_Gl_Choice* g) { + return fl_create_gl_context(g->vis); +} + +#endif + +void fl_set_gl_context(Fl_Window*, GLContext); +void fl_no_gl_context(); +void fl_delete_gl_context(GLContext); + +#endif + +// +// End of "$Id: Fl_Gl_Choice.H 4052 2005-02-24 21:55:12Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Gl_Choice.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Gl_Choice.cxx new file mode 100644 index 0000000..124f1a0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Gl_Choice.cxx @@ -0,0 +1,453 @@ +// +// "$Id: Fl_Gl_Choice.cxx 6811 2009-06-30 19:05:09Z matt $" +// +// OpenGL visual selection code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#if HAVE_GL + +# include +# include +# include +# include "Fl_Gl_Choice.H" +# include +# include "flstring.h" + +# ifdef __APPLE__ +# include +# endif + +# ifdef WIN32 +void fl_save_dc(HWND, HDC); +# endif + +static Fl_Gl_Choice *first; + +// this assummes one of the two arguments is zero: +// We keep the list system in Win32 to stay compatible and interpret +// the list later... +Fl_Gl_Choice *Fl_Gl_Choice::find(int m, const int *alistp) { + Fl_Gl_Choice *g; + + for (g = first; g; g = g->next) + if (g->mode == m && g->alist == alistp) + return g; + +# ifdef __APPLE_QD__ + const int *blist; + int list[32]; + + if (alistp) + blist = alistp; + else { + int n = 0; + if (m & FL_INDEX) { + list[n++] = AGL_BUFFER_SIZE; + list[n++] = 8; // glut tries many sizes, but this should work... + } else { + list[n++] = AGL_RGBA; + list[n++] = AGL_GREEN_SIZE; + list[n++] = (m & FL_RGB8) ? 8 : 1; + if (m & FL_ALPHA) { + list[n++] = AGL_ALPHA_SIZE; + list[n++] = (m & FL_RGB8) ? 8 : 1; + } + if (m & FL_ACCUM) { + list[n++] = AGL_ACCUM_GREEN_SIZE; + list[n++] = 1; + if (m & FL_ALPHA) { + list[n++] = AGL_ACCUM_ALPHA_SIZE; + list[n++] = 1; + } + } + } + if (m & FL_DOUBLE) { + list[n++] = AGL_DOUBLEBUFFER; + } + if (m & FL_DEPTH) { + list[n++] = AGL_DEPTH_SIZE; list[n++] = 24; + } + if (m & FL_STENCIL) { + list[n++] = AGL_STENCIL_SIZE; list[n++] = 1; + } +# ifdef AGL_STEREO + if (m & FL_STEREO) { + list[n++] = AGL_STEREO; + } +# endif + list[n] = AGL_NONE; + blist = list; + } + fl_open_display(); + AGLPixelFormat fmt = aglChoosePixelFormat(NULL, 0, (GLint*)blist); + if (!fmt) return 0; + +#elif defined(__APPLE_QUARTZ__) + // warning: the Quartz version should probably use Core GL (CGL) instead of AGL + const int *blist; + int list[32]; + + if (alistp) + blist = alistp; + else { + int n = 0; + if (m & FL_INDEX) { + list[n++] = AGL_BUFFER_SIZE; + list[n++] = 8; // glut tries many sizes, but this should work... + } else { + list[n++] = AGL_RGBA; + list[n++] = AGL_GREEN_SIZE; + list[n++] = (m & FL_RGB8) ? 8 : 1; + if (m & FL_ALPHA) { + list[n++] = AGL_ALPHA_SIZE; + list[n++] = (m & FL_RGB8) ? 8 : 1; + } + if (m & FL_ACCUM) { + list[n++] = AGL_ACCUM_GREEN_SIZE; + list[n++] = 1; + if (m & FL_ALPHA) { + list[n++] = AGL_ACCUM_ALPHA_SIZE; + list[n++] = 1; + } + } + } + if (m & FL_DOUBLE) { + list[n++] = AGL_DOUBLEBUFFER; + } + if (m & FL_DEPTH) { + list[n++] = AGL_DEPTH_SIZE; list[n++] = 24; + } + if (m & FL_STENCIL) { + list[n++] = AGL_STENCIL_SIZE; list[n++] = 1; + } +# ifdef AGL_STEREO + if (m & FL_STEREO) { + list[n++] = AGL_STEREO; + } +# endif + list[n] = AGL_NONE; + blist = list; + } + fl_open_display(); + AGLPixelFormat fmt = aglChoosePixelFormat(NULL, 0, (GLint*)blist); + if (!fmt) return 0; + +# elif !defined(WIN32) + + const int *blist; + int list[32]; + + if (alistp) + blist = alistp; + else { + int n = 0; + if (m & FL_INDEX) { + list[n++] = GLX_BUFFER_SIZE; + list[n++] = 8; // glut tries many sizes, but this should work... + } else { + list[n++] = GLX_RGBA; + list[n++] = GLX_GREEN_SIZE; + list[n++] = (m & FL_RGB8) ? 8 : 1; + if (m & FL_ALPHA) { + list[n++] = GLX_ALPHA_SIZE; + list[n++] = (m & FL_RGB8) ? 8 : 1; + } + if (m & FL_ACCUM) { + list[n++] = GLX_ACCUM_GREEN_SIZE; + list[n++] = 1; + if (m & FL_ALPHA) { + list[n++] = GLX_ACCUM_ALPHA_SIZE; + list[n++] = 1; + } + } + } + if (m & FL_DOUBLE) { + list[n++] = GLX_DOUBLEBUFFER; + } + if (m & FL_DEPTH) { + list[n++] = GLX_DEPTH_SIZE; list[n++] = 1; + } + if (m & FL_STENCIL) { + list[n++] = GLX_STENCIL_SIZE; list[n++] = 1; + } + if (m & FL_STEREO) { + list[n++] = GLX_STEREO; + } +# if defined(GLX_VERSION_1_1) && defined(GLX_SGIS_multisample) + if (m & FL_MULTISAMPLE) { + list[n++] = GLX_SAMPLES_SGIS; + list[n++] = 4; // value Glut uses + } +# endif + list[n] = 0; + blist = list; + } + + fl_open_display(); + XVisualInfo *visp = glXChooseVisual(fl_display, fl_screen, (int *)blist); + if (!visp) { +# if defined(GLX_VERSION_1_1) && defined(GLX_SGIS_multisample) + if (m&FL_MULTISAMPLE) return find(m&~FL_MULTISAMPLE,0); +# endif + return 0; + } + +# else + + // Replacement for ChoosePixelFormat() that finds one with an overlay + // if possible: + if (!fl_gc) fl_GetDC(0); + int pixelformat = 0; + PIXELFORMATDESCRIPTOR chosen_pfd; + for (int i = 1; ; i++) { + PIXELFORMATDESCRIPTOR pfd; + if (!DescribePixelFormat(fl_gc, i, sizeof(pfd), &pfd)) break; + // continue if it does not satisfy our requirements: + if (~pfd.dwFlags & (PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL)) continue; + if (pfd.iPixelType != ((m&FL_INDEX)?PFD_TYPE_COLORINDEX:PFD_TYPE_RGBA)) continue; + if ((m & FL_ALPHA) && !pfd.cAlphaBits) continue; + if ((m & FL_ACCUM) && !pfd.cAccumBits) continue; + if ((!(m & FL_DOUBLE)) != (!(pfd.dwFlags & PFD_DOUBLEBUFFER))) continue; + if ((!(m & FL_STEREO)) != (!(pfd.dwFlags & PFD_STEREO))) continue; + if ((m & FL_DEPTH) && !pfd.cDepthBits) continue; + if ((m & FL_STENCIL) && !pfd.cStencilBits) continue; + // see if better than the one we have already: + if (pixelformat) { + // offering non-generic rendering is better (read: hardware accelleration) + if (!(chosen_pfd.dwFlags & PFD_GENERIC_FORMAT) && + (pfd.dwFlags & PFD_GENERIC_FORMAT)) continue; + // offering overlay is better: + else if (!(chosen_pfd.bReserved & 15) && (pfd.bReserved & 15)) {} + // otherwise more bit planes is better: + else if (chosen_pfd.cColorBits > pfd.cColorBits) continue; + else if (chosen_pfd.cDepthBits > pfd.cDepthBits) continue; + } + pixelformat = i; + chosen_pfd = pfd; + } + //printf("Chosen pixel format is %d\n", pixelformat); + if (!pixelformat) return 0; + +# endif + + g = new Fl_Gl_Choice; + g->mode = m; + g->alist = alistp; + g->next = first; + first = g; + +# ifdef WIN32 + g->pixelformat = pixelformat; + g->pfd = chosen_pfd; +# elif defined(__APPLE_QD__) + g->pixelformat = fmt; +# elif defined(__APPLE_QUARTZ__) + // warning: the Quartz version should probably use Core GL (CGL) instead of AGL + g->pixelformat = fmt; +# else + g->vis = visp; + + if (/*MaxCmapsOfScreen(ScreenOfDisplay(fl_display,fl_screen))==1 && */ + visp->visualid == fl_visual->visualid && + !getenv("MESA_PRIVATE_CMAP")) + g->colormap = fl_colormap; + else + g->colormap = XCreateColormap(fl_display, RootWindow(fl_display,fl_screen), + visp->visual, AllocNone); +# endif + + return g; +} + +static GLContext *context_list = 0; +static int nContext = 0, NContext = 0; + +static void add_context(GLContext ctx) { + if (!ctx) return; + if (nContext==NContext) { + if (!NContext) NContext = 8; + NContext *= 2; + context_list = (GLContext*)realloc( + context_list, NContext*sizeof(GLContext)); + } + context_list[nContext++] = ctx; +} + +static void del_context(GLContext ctx) { + int i; + for (i=0; iprivate_dc; + if (!hdc) { + hdc = i->private_dc = GetDCEx(i->xid, 0, DCX_CACHE); + fl_save_dc(i->xid, hdc); + SetPixelFormat(hdc, g->pixelformat, (PIXELFORMATDESCRIPTOR*)(&g->pfd)); +# if USE_COLORMAP + if (fl_palette) SelectPalette(hdc, fl_palette, FALSE); +# endif + } + GLContext context = + layer ? wglCreateLayerContext(hdc, layer) : wglCreateContext(hdc); + if (context) { + if (context_list && nContext) + wglShareLists(context_list[0], context); + add_context(context); + } + return context; +} + +# elif defined(__APPLE_QD__) +GLContext fl_create_gl_context(Fl_Window* window, const Fl_Gl_Choice* g, int layer) { + GLContext context, shared_ctx = 0; + if (context_list && nContext) shared_ctx = context_list[0]; + context = aglCreateContext( g->pixelformat, shared_ctx); + if (!context) return 0; + add_context((GLContext)context); + if ( window->parent() ) { + Rect wrect; GetWindowPortBounds( fl_xid(window), &wrect ); + GLint rect[] = { window->x(), wrect.bottom-window->h()-window->y(), window->w(), window->h() }; + aglSetInteger( (GLContext)context, AGL_BUFFER_RECT, rect ); + aglEnable( (GLContext)context, AGL_BUFFER_RECT ); + } + aglSetDrawable( context, GetWindowPort( fl_xid(window) ) ); + return (context); +} +# elif defined(__APPLE_QUARTZ__) + // warning: the Quartz version should probably use Core GL (CGL) instead of AGL + GLContext fl_create_gl_context(Fl_Window* window, const Fl_Gl_Choice* g, int layer) { + GLContext context, shared_ctx = 0; + if (context_list && nContext) shared_ctx = context_list[0]; + context = aglCreateContext( g->pixelformat, shared_ctx); + if (!context) return 0; + add_context((GLContext)context); + if ( window->parent() ) { + Rect wrect; GetWindowPortBounds( fl_xid(window), &wrect ); + GLint rect[] = { window->x(), wrect.bottom-window->h()-window->y(), window->w(), window->h() }; + aglSetInteger( (GLContext)context, AGL_BUFFER_RECT, rect ); + aglEnable( (GLContext)context, AGL_BUFFER_RECT ); + } + aglSetDrawable( context, GetWindowPort( fl_xid(window) ) ); + return (context); +} +# else + +GLContext fl_create_gl_context(XVisualInfo* vis) { + GLContext shared_ctx = 0; + if (context_list && nContext) shared_ctx = context_list[0]; + GLContext context = glXCreateContext(fl_display, vis, shared_ctx, 1); + if (context) + add_context(context); + return context; +} + +# endif + +static GLContext cached_context; +static Fl_Window* cached_window; + +void fl_set_gl_context(Fl_Window* w, GLContext context) { + if (context != cached_context || w != cached_window) { + cached_context = context; + cached_window = w; +# ifdef WIN32 + wglMakeCurrent(Fl_X::i(w)->private_dc, context); +# elif defined(__APPLE_QD__) + if ( w->parent() ) { //: resize our GL buffer rectangle + Rect wrect; GetWindowPortBounds( fl_xid(w), &wrect ); + GLint rect[] = { w->x(), wrect.bottom-w->h()-w->y(), w->w(), w->h() }; + aglSetInteger( context, AGL_BUFFER_RECT, rect ); + aglEnable( context, AGL_BUFFER_RECT ); + } + aglSetDrawable(context, GetWindowPort( fl_xid(w) ) ); + aglSetCurrentContext(context); +# elif defined(__APPLE_QUARTZ__) + // warning: the Quartz version should probably use Core GL (CGL) instead of AGL + if ( w->parent() ) { //: resize our GL buffer rectangle + Rect wrect; GetWindowPortBounds( fl_xid(w), &wrect ); + GLint rect[] = { w->x(), wrect.bottom-w->h()-w->y(), w->w(), w->h() }; + aglSetInteger( context, AGL_BUFFER_RECT, rect ); + aglEnable( context, AGL_BUFFER_RECT ); + } + aglSetDrawable(context, GetWindowPort( fl_xid(w) ) ); + aglSetCurrentContext(context); +# else + glXMakeCurrent(fl_display, fl_xid(w), context); +# endif + } +} + +void fl_no_gl_context() { + cached_context = 0; + cached_window = 0; +# ifdef WIN32 + wglMakeCurrent(0, 0); +# elif defined(__APPLE_QD__) + AGLContext ctx = aglGetCurrentContext(); + if (ctx) aglSetDrawable(ctx, NULL); + aglSetCurrentContext(0); +# elif defined(__APPLE_QUARTZ__) + // warning: the Quartz version should probably use Core GL (CGL) instead of AGL + AGLContext ctx = aglGetCurrentContext(); + if (ctx) aglSetDrawable(ctx, NULL); + aglSetCurrentContext(0); +# else + glXMakeCurrent(fl_display, 0, 0); +# endif +} + +void fl_delete_gl_context(GLContext context) { + if (cached_context == context) fl_no_gl_context(); +# ifdef WIN32 + wglDeleteContext(context); +# elif defined(__APPLE_QD__) + aglDestroyContext( context ); +# elif defined(__APPLE_QUARTZ__) + // warning: the Quartz version should probably use Core GL (CGL) instead of AGL + aglDestroyContext( context ); +# else + glXDestroyContext(fl_display, context); +# endif + del_context(context); +} + +#endif // HAVE_GL + + +// +// End of "$Id: Fl_Gl_Choice.cxx 6811 2009-06-30 19:05:09Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Gl_Overlay.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Gl_Overlay.cxx new file mode 100644 index 0000000..db95ab9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Gl_Overlay.cxx @@ -0,0 +1,248 @@ +// +// "$Id: Fl_Gl_Overlay.cxx 5350 2006-08-23 17:40:54Z mike $" +// +// OpenGL overlay code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#if HAVE_GL + +#include +#include +#include "Fl_Gl_Choice.H" +#include +#include + +#if !HAVE_GL_OVERLAY + +int Fl_Gl_Window::can_do_overlay() {return 0;} + +void Fl_Gl_Window::make_overlay() {overlay = this;} + +#else + +// Methods on Fl_Gl_Window that create an overlay window. Because +// many programs don't need the overlay, this is seperated into this +// source file so it is not linked in if not used. + +// Under X this is done by creating another window, of class _Fl_Gl_Overlay +// which is a subclass of Fl_Gl_Window except it uses the overlay planes. +// A pointer to this is stored in the "overlay" pointer of the Fl_Gl_Window. + +// Under win32 another GLX context is created to draw into the overlay +// and it is stored in into the "overlay" pointer. + +// In both cases if overlay hardware is unavailable, the overlay is +// "faked" by drawing into the main layers. This is indicated by +// setting overlay == this. + +#ifndef WIN32 +//////////////////////////////////////////////////////////////// +// X version + +extern XVisualInfo *fl_find_overlay_visual(); +extern XVisualInfo *fl_overlay_visual; +extern Colormap fl_overlay_colormap; +extern unsigned long fl_transparent_pixel; +extern uchar fl_overlay; + +class _Fl_Gl_Overlay : public Fl_Gl_Window { + void flush(); + void draw(); +public: + void show(); + _Fl_Gl_Overlay(int x, int y, int w, int h) : + Fl_Gl_Window(x,y,w,h) { + set_flag(INACTIVE); + } +}; + +void _Fl_Gl_Overlay::flush() { + make_current(); +#ifdef BOXX_BUGS + // The BoXX overlay is broken and you must not call swap-buffers. This + // code will make it work, but we lose because machines that do support + // double-buffered overlays will blink when they don't have to + glDrawBuffer(GL_FRONT); + draw(); +#else + draw(); + swap_buffers(); +#endif + glFlush(); + valid(1); +} + +void _Fl_Gl_Overlay::draw() { + if (!valid()) glClearIndex((GLfloat)fl_transparent_pixel); + if (damage() != FL_DAMAGE_EXPOSE) glClear(GL_COLOR_BUFFER_BIT); + Fl_Gl_Window *w = (Fl_Gl_Window *)parent(); + uchar save_valid = w->valid(); + w->valid(valid()); + fl_overlay = 1; + w->draw_overlay(); + fl_overlay = 0; + valid(w->valid()); + w->valid(save_valid); +} + +void _Fl_Gl_Overlay::show() { + if (!shown()) { + fl_background_pixel = int(fl_transparent_pixel); + Fl_X::make_xid(this, fl_overlay_visual, fl_overlay_colormap); + fl_background_pixel = -1; + // find the outermost window to tell wm about the colormap: + Fl_Window *w = window(); + for (;;) {Fl_Window *w1 = w->window(); if (!w1) break; w = w1;} + XSetWMColormapWindows(fl_display, fl_xid(w), &(Fl_X::i(this)->xid), 1); + context(fl_create_gl_context(fl_overlay_visual), 1); + valid(0); + } + Fl_Gl_Window::show(); +} + +int Fl_Gl_Window::can_do_overlay() { + return fl_find_overlay_visual() != 0; +} + +void Fl_Gl_Window::make_overlay() { + if (overlay) return; + if (can_do_overlay()) { + _Fl_Gl_Overlay* o = new _Fl_Gl_Overlay(0,0,w(),h()); + overlay = o; + add(*o); + o->show(); + } else { + overlay = this; // fake the overlay + } +} + +#else +//////////////////////////////////////////////////////////////// +// WIN32 version: + +//static COLORREF *palette; +extern int fl_overlay_depth; + +void Fl_Gl_Window::make_overlay() { + if (overlay) return; + + GLContext context = fl_create_gl_context(this, g, 1); + if (!context) {overlay = this; return;} // fake the overlay + + HDC hdc = Fl_X::i(this)->private_dc; + overlay = context; + LAYERPLANEDESCRIPTOR pfd; + wglDescribeLayerPlane(hdc, g->pixelformat, 1, sizeof(pfd), &pfd); + if (!pfd.iPixelType) { + ; // full-color overlay + } else { + fl_overlay_depth = pfd.cColorBits; // used by gl_color() + if (fl_overlay_depth > 8) fl_overlay_depth = 8; + COLORREF palette[256]; + int n = (1<pfd.bReserved & 15) != 0; +} + +//////////////////////////////////////////////////////////////// +#endif + +#endif + +void Fl_Gl_Window::redraw_overlay() { + if (!shown()) return; + make_overlay(); +#ifdef __APPLE__ + redraw(); +#else +#ifndef WIN32 + if (overlay != this) + ((Fl_Gl_Window*)overlay)->redraw(); + else +#endif + damage(FL_DAMAGE_OVERLAY); +#endif +} + +void Fl_Gl_Window::make_overlay_current() { + make_overlay(); +#ifdef __APPLE__ + // this is not very useful, but unfortunatly, Apple decided + // that front buffer drawing can no longer (OS X 10.4) be + // supported on their platforms. + make_current(); +#else +#if HAVE_GL_OVERLAY + if (overlay != this) { +#ifdef WIN32 + fl_set_gl_context(this, (GLContext)overlay); +// if (fl_overlay_depth) +// wglRealizeLayerPalette(Fl_X::i(this)->private_dc, 1, TRUE); +#else + ((Fl_Gl_Window*)overlay)->make_current(); +#endif + } else +#endif + glDrawBuffer(GL_FRONT); +#endif +} + +void Fl_Gl_Window::hide_overlay() { +#if HAVE_GL_OVERLAY +#ifdef WIN32 + // nothing needs to be done? Or should it be erased? +#else + if (overlay && overlay!=this) ((Fl_Gl_Window*)overlay)->hide(); +#endif +#endif +} + +#endif + +// +// End of "$Id: Fl_Gl_Overlay.cxx 5350 2006-08-23 17:40:54Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Gl_Window.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Gl_Window.cxx new file mode 100644 index 0000000..0deecca --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Gl_Window.cxx @@ -0,0 +1,440 @@ +// +// "$Id: Fl_Gl_Window.cxx 6807 2009-06-30 13:38:52Z matt $" +// +// OpenGL window code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "flstring.h" +#if HAVE_GL + +#include +#include +#include "Fl_Gl_Choice.H" +#include +#include + +//////////////////////////////////////////////////////////////// + +// The symbol SWAP_TYPE defines what is in the back buffer after doing +// a glXSwapBuffers(). + +// The OpenGl documentation says that the contents of the backbuffer +// are "undefined" after glXSwapBuffers(). However, if we know what +// is in the backbuffers then we can save a good deal of time. For +// this reason you can define some symbols to describe what is left in +// the back buffer. + +// Having not found any way to determine this from glx (or wgl) I have +// resorted to letting the user specify it with an environment variable, +// GL_SWAP_TYPE, it should be equal to one of these symbols: + +// contents of back buffer after glXSwapBuffers(): +#define UNDEFINED 1 // anything +#define SWAP 2 // former front buffer (same as unknown) +#define COPY 3 // unchanged +#define NODAMAGE 4 // unchanged even by X expose() events + +static char SWAP_TYPE = 0 ; // 0 = determine it from environment variable + +//////////////////////////////////////////////////////////////// + +int Fl_Gl_Window::can_do(int a, const int *b) { + return Fl_Gl_Choice::find(a,b) != 0; +} + +void Fl_Gl_Window::show() { + if (!shown()) { + if (!g) { + g = Fl_Gl_Choice::find(mode_,alist); + + if (!g && (mode_ & FL_DOUBLE) == FL_SINGLE) { + g = Fl_Gl_Choice::find(mode_ | FL_DOUBLE,alist); + if (g) mode_ |= FL_FAKE_SINGLE; + } + + if (!g) { + Fl::error("Insufficient GL support"); + return; + } + } +#if !defined(WIN32) && !defined(__APPLE__) + Fl_X::make_xid(this, g->vis, g->colormap); + if (overlay && overlay != this) ((Fl_Gl_Window*)overlay)->show(); +#endif + } + Fl_Window::show(); + +#ifdef __APPLE__ + set_visible(); +#endif /* __APPLE__ */ +} + +void Fl_Gl_Window::invalidate() { + valid(0); + context_valid(0); +#ifndef WIN32 + if (overlay) { + ((Fl_Gl_Window*)overlay)->valid(0); + ((Fl_Gl_Window*)overlay)->context_valid(0); + } +#endif +} + +int Fl_Gl_Window::mode(int m, const int *a) { + if (m == mode_ && a == alist) return 0; +#ifndef __APPLE__ + int oldmode = mode_; +#endif // !__APPLE__ +#if !defined(WIN32) && !defined(__APPLE__) + Fl_Gl_Choice* oldg = g; +#endif // !WIN32 && !__APPLE__ + context(0); + mode_ = m; alist = a; + if (shown()) { + g = Fl_Gl_Choice::find(m, a); +#if defined(WIN32) + if (!g || (oldmode^m)&(FL_DOUBLE|FL_STEREO)) { + hide(); + show(); + } +#elif defined(__APPLE_QD__) + redraw(); +#elif defined(__APPLE_QUARTZ__) + // warning: the Quartz version should probably use Core GL (CGL) instead of AGL + redraw(); +#else + // under X, if the visual changes we must make a new X window (yuck!): + if (!g || g->vis->visualid!=oldg->vis->visualid || (oldmode^m)&FL_DOUBLE) { + hide(); + show(); + } +#endif + } else { + g = 0; + } + return 1; +} + +#define NON_LOCAL_CONTEXT 0x80000000 + +void Fl_Gl_Window::make_current() { +// puts("Fl_Gl_Window::make_current()"); +// printf("make_current: context_=%p\n", context_); + if (!context_) { + mode_ &= ~NON_LOCAL_CONTEXT; + context_ = fl_create_gl_context(this, g); + valid(0); + context_valid(0); + } + fl_set_gl_context(this, context_); + +#ifdef __APPLE__ + // Set the buffer rectangle here, since in resize() we won't have the + // correct parent window size to work with... + GLint xywh[4]; + + if (window()) { + xywh[0] = x(); + xywh[1] = window()->h() - y() - h(); + } else { + xywh[0] = 0; + xywh[1] = 0; + } + + xywh[2] = w(); + xywh[3] = h(); + + aglSetInteger(context_, AGL_BUFFER_RECT, xywh); + aglEnable(context_, AGL_BUFFER_RECT); +// printf("make_current: xywh=[%d %d %d %d]\n", xywh[0], xywh[1], xywh[2], xywh[3]); +#endif // __APPLE__ + +#if defined(WIN32) && USE_COLORMAP + if (fl_palette) { + fl_GetDC(fl_xid(this)); + SelectPalette(fl_gc, fl_palette, FALSE); + RealizePalette(fl_gc); + } +#endif // USE_COLORMAP + if (mode_ & FL_FAKE_SINGLE) { + glDrawBuffer(GL_FRONT); + glReadBuffer(GL_FRONT); + } + current_ = this; +} + +void Fl_Gl_Window::ortho() { +// Alpha NT seems to have a broken OpenGL that does not like negative coords: +#ifdef _M_ALPHA + glLoadIdentity(); + glViewport(0, 0, w(), h()); + glOrtho(0, w(), 0, h(), -1, 1); +#else + GLint v[2]; + glGetIntegerv(GL_MAX_VIEWPORT_DIMS, v); + glLoadIdentity(); + glViewport(w()-v[0], h()-v[1], v[0], v[1]); + glOrtho(w()-v[0], w(), h()-v[1], h(), -1, 1); +#endif +} + +void Fl_Gl_Window::swap_buffers() { +#ifdef WIN32 +# if HAVE_GL_OVERLAY + // Do not swap the overlay, to match GLX: + BOOL ret = wglSwapLayerBuffers(Fl_X::i(this)->private_dc, WGL_SWAP_MAIN_PLANE); + DWORD err = GetLastError();; +# else + SwapBuffers(Fl_X::i(this)->private_dc); +# endif +#elif defined(__APPLE_QD__) + aglSwapBuffers((AGLContext)context_); +#elif defined(__APPLE_QUARTZ__) + // warning: the Quartz version should probably use Core GL (CGL) instead of AGL + aglSwapBuffers((AGLContext)context_); +#else + glXSwapBuffers(fl_display, fl_xid(this)); +#endif +} + +#if HAVE_GL_OVERLAY && defined(WIN32) +uchar fl_overlay; // changes how fl_color() works +int fl_overlay_depth = 0; +#endif + +void Fl_Gl_Window::flush() { + uchar save_valid = valid_f_ & 1; +#if HAVE_GL_OVERLAY && defined(WIN32) + uchar save_valid_f = valid_f_; +#endif + +#ifdef __APPLE_QD__ + //: clear previous clipping in this shared port + GrafPtr port = GetWindowPort( fl_xid(this) ); + Rect rect; SetRect( &rect, 0, 0, 0x7fff, 0x7fff ); + GrafPtr old; GetPort( &old ); + SetPort( port ); + ClipRect( &rect ); + SetPort( old ); +#elif defined(__APPLE_QUARTZ__) + // warning: the Quartz version should probably use Core GL (CGL) instead of AGL + //: clear previous clipping in this shared port + GrafPtr port = GetWindowPort( fl_xid(this) ); + Rect rect; SetRect( &rect, 0, 0, 0x7fff, 0x7fff ); + GrafPtr old; GetPort( &old ); + SetPort( port ); + ClipRect( &rect ); + SetPort( old ); +#endif + +#if HAVE_GL_OVERLAY && defined(WIN32) + + bool fixcursor = false; // for fixing the SGI 320 bug + + // Draw into hardware overlay planes if they are damaged: + if (overlay && overlay != this + && (damage()&(FL_DAMAGE_OVERLAY|FL_DAMAGE_EXPOSE) || !save_valid)) { + // SGI 320 messes up overlay with user-defined cursors: + if (Fl_X::i(this)->cursor && Fl_X::i(this)->cursor != fl_default_cursor) { + fixcursor = true; // make it restore cursor later + SetCursor(0); + } + fl_set_gl_context(this, (GLContext)overlay); + if (fl_overlay_depth) + wglRealizeLayerPalette(Fl_X::i(this)->private_dc, 1, TRUE); + glDisable(GL_SCISSOR_TEST); + glClear(GL_COLOR_BUFFER_BIT); + fl_overlay = 1; + draw_overlay(); + fl_overlay = 0; + valid_f_ = save_valid_f; + wglSwapLayerBuffers(Fl_X::i(this)->private_dc, WGL_SWAP_OVERLAY1); + // if only the overlay was damaged we are done, leave main layer alone: + if (damage() == FL_DAMAGE_OVERLAY) { + if (fixcursor) SetCursor(Fl_X::i(this)->cursor); + return; + } + } +#endif + + make_current(); + + if (mode_ & FL_DOUBLE) { + + glDrawBuffer(GL_BACK); + + if (!SWAP_TYPE) { +#ifdef __APPLE_QD__ + SWAP_TYPE = COPY; +#elif defined __APPLE_QUARTZ__ + // warning: the Quartz version should probably use Core GL (CGL) instead of AGL + SWAP_TYPE = COPY; +#else + SWAP_TYPE = UNDEFINED; +#endif + const char* c = getenv("GL_SWAP_TYPE"); + if (c) { + if (!strcmp(c,"COPY")) SWAP_TYPE = COPY; + else if (!strcmp(c, "NODAMAGE")) SWAP_TYPE = NODAMAGE; + else if (!strcmp(c, "SWAP")) SWAP_TYPE = SWAP; + } + } + + if (SWAP_TYPE == NODAMAGE) { + + // don't draw if only overlay damage or expose events: + if ((damage()&~(FL_DAMAGE_OVERLAY|FL_DAMAGE_EXPOSE)) || !save_valid) + draw(); + swap_buffers(); + + } else if (SWAP_TYPE == COPY) { + + // don't draw if only the overlay is damaged: + if (damage() != FL_DAMAGE_OVERLAY || !save_valid) draw(); + swap_buffers(); + + } else { // SWAP_TYPE == UNDEFINED + + // If we are faking the overlay, use CopyPixels to act like + // SWAP_TYPE == COPY. Otherwise overlay redraw is way too slow. + if (overlay == this) { + // don't draw if only the overlay is damaged: + if (damage1_ || damage() != FL_DAMAGE_OVERLAY || !save_valid) draw(); + // we use a seperate context for the copy because rasterpos must be 0 + // and depth test needs to be off: + static GLContext ortho_context = 0; + static Fl_Gl_Window* ortho_window = 0; + int orthoinit = !ortho_context; + if (orthoinit) ortho_context = fl_create_gl_context(this, g); + fl_set_gl_context(this, ortho_context); + if (orthoinit || !save_valid || ortho_window != this) { + glDisable(GL_DEPTH_TEST); + glReadBuffer(GL_BACK); + glDrawBuffer(GL_FRONT); + glLoadIdentity(); + glViewport(0, 0, w(), h()); + glOrtho(0, w(), 0, h(), -1, 1); + glRasterPos2i(0,0); + ortho_window = this; + } + glCopyPixels(0,0,w(),h(),GL_COLOR); + make_current(); // set current context back to draw overlay + damage1_ = 0; + + } else { + damage1_ = damage(); + clear_damage(0xff); draw(); + swap_buffers(); + } + + } + + if (overlay==this) { // fake overlay in front buffer + glDrawBuffer(GL_FRONT); + draw_overlay(); + glDrawBuffer(GL_BACK); + glFlush(); + } + + } else { // single-buffered context is simpler: + + draw(); + if (overlay == this) draw_overlay(); + glFlush(); + + } + +#if HAVE_GL_OVERLAY && defined(WIN32) + if (fixcursor) SetCursor(Fl_X::i(this)->cursor); +#endif + valid(1); + context_valid(1); +} + +void Fl_Gl_Window::resize(int X,int Y,int W,int H) { +// printf("Fl_Gl_Window::resize(X=%d, Y=%d, W=%d, H=%d)\n", X, Y, W, H); +// printf("current: x()=%d, y()=%d, w()=%d, h()=%d\n", x(), y(), w(), h()); + + if (W != w() || H != h()) valid(0); + +#ifdef __APPLE__ + if (X != x() || Y != y() || W != w() || H != h()) aglUpdateContext(context_); +#elif !defined(WIN32) + if ((W != w() || H != h()) && !resizable() && overlay && overlay != this) { + ((Fl_Gl_Window*)overlay)->resize(0,0,W,H); + } +#endif + + Fl_Window::resize(X,Y,W,H); +} + +void Fl_Gl_Window::context(void* v, int destroy_flag) { + if (context_ && !(mode_&NON_LOCAL_CONTEXT)) fl_delete_gl_context(context_); + context_ = (GLContext)v; + if (destroy_flag) mode_ &= ~NON_LOCAL_CONTEXT; + else mode_ |= NON_LOCAL_CONTEXT; +} + +void Fl_Gl_Window::hide() { + context(0); +#if HAVE_GL_OVERLAY && defined(WIN32) + if (overlay && overlay != this) { + fl_delete_gl_context((GLContext)overlay); + overlay = 0; + } +#endif + Fl_Window::hide(); +} + +Fl_Gl_Window::~Fl_Gl_Window() { + hide(); +// delete overlay; this is done by ~Fl_Group +} + +void Fl_Gl_Window::init() { + end(); // we probably don't want any children + box(FL_NO_BOX); + + mode_ = FL_RGB | FL_DEPTH | FL_DOUBLE; + alist = 0; + context_ = 0; + g = 0; + overlay = 0; + valid_f_ = 0; + damage1_ = 0; + +#if 0 // This breaks resizing on Linux/X11 + int H = h(); + h(1); // Make sure we actually do something in resize()... + resize(x(), y(), w(), H); +#endif // 0 +} + +void Fl_Gl_Window::draw_overlay() {} + +#endif + +// +// End of "$Id: Fl_Gl_Window.cxx 6807 2009-06-30 13:38:52Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Group.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Group.cxx new file mode 100644 index 0000000..b3ab928 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Group.cxx @@ -0,0 +1,623 @@ +// +// "$Id: Fl_Group.cxx 6463 2008-10-19 06:40:02Z AlbrechtS $" +// +// Group widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// The Fl_Group is the only defined container type in FLTK. + +// Fl_Window itself is a subclass of this, and most of the event +// handling is designed so windows themselves work correctly. + +#include +#include +#include +#include +#include +#include + +Fl_Group* Fl_Group::current_; + +// Hack: A single child is stored in the pointer to the array, while +// multiple children are stored in an allocated array: +Fl_Widget*const* Fl_Group::array() const { + return children_ <= 1 ? (Fl_Widget**)(&array_) : array_; +} + +int Fl_Group::find(const Fl_Widget* o) const { + Fl_Widget*const* a = array(); + int i; for (i=0; i < children_; i++) if (*a++ == o) break; + return i; +} + +// Metrowerks CodeWarrior and others can't export the static +// class member: current_, so these methods can't be inlined... +void Fl_Group::begin() {current_ = this;} +void Fl_Group::end() {current_ = (Fl_Group*)parent();} +Fl_Group *Fl_Group::current() {return current_;} +void Fl_Group::current(Fl_Group *g) {current_ = g;} + +extern Fl_Widget* fl_oldfocus; // set by Fl::focus + +// For back-compatability, we must adjust all events sent to child +// windows so they are relative to that window. + +static int send(Fl_Widget* o, int event) { + if (o->type() < FL_WINDOW) return o->handle(event); + switch ( event ) + { + case FL_DND_ENTER: + case FL_DND_DRAG: + // figure out correct type of event: + event = (o->contains(Fl::belowmouse())) ? FL_DND_DRAG : FL_DND_ENTER; + } + int save_x = Fl::e_x; Fl::e_x -= o->x(); + int save_y = Fl::e_y; Fl::e_y -= o->y(); + int ret = o->handle(event); + Fl::e_y = save_y; + Fl::e_x = save_x; + switch ( event ) + { + case FL_ENTER: + case FL_DND_ENTER: + // Successful completion of FL_ENTER means the widget is now the + // belowmouse widget, but only call Fl::belowmouse if the child + // widget did not do so: + if (!o->contains(Fl::belowmouse())) Fl::belowmouse(o); + break; + } + return ret; +} + +// translate the current keystroke into up/down/left/right for navigation: +#define ctrl(x) (x^0x40) +static int navkey() { + switch (Fl::event_key()) { + case 0: // not an FL_KEYBOARD/FL_SHORTCUT event + break; + case FL_Tab: + if (!Fl::event_state(FL_SHIFT)) return FL_Right; + case 0xfe20: // XK_ISO_Left_Tab + return FL_Left; + case FL_Right: + return FL_Right; + case FL_Left: + return FL_Left; + case FL_Up: + return FL_Up; + case FL_Down: + return FL_Down; + } + return 0; +} + +int Fl_Group::handle(int event) { + + Fl_Widget*const* a = array(); + int i; + Fl_Widget* o; + + switch (event) { + + case FL_FOCUS: + switch (navkey()) { + default: + if (savedfocus_ && savedfocus_->take_focus()) return 1; + case FL_Right: + case FL_Down: + for (i = children(); i--;) if ((*a++)->take_focus()) return 1; + break; + case FL_Left: + case FL_Up: + for (i = children(); i--;) if (a[i]->take_focus()) return 1; + break; + } + return 0; + + case FL_UNFOCUS: + savedfocus_ = fl_oldfocus; + return 0; + + case FL_KEYBOARD: + return navigation(navkey()); + + case FL_SHORTCUT: + for (i = children(); i--;) { + o = a[i]; + if (o->takesevents() && Fl::event_inside(o) && send(o,FL_SHORTCUT)) + return 1; + } + for (i = children(); i--;) { + o = a[i]; + if (o->takesevents() && !Fl::event_inside(o) && send(o,FL_SHORTCUT)) + return 1; + } + if ((Fl::event_key() == FL_Enter || Fl::event_key() == FL_KP_Enter)) return navigation(FL_Down); + return 0; + + case FL_ENTER: + case FL_MOVE: + for (i = children(); i--;) { + o = a[i]; + if (o->visible() && Fl::event_inside(o)) { + if (o->contains(Fl::belowmouse())) { + return send(o,FL_MOVE); + } else { + Fl::belowmouse(o); + if (send(o,FL_ENTER)) return 1; + } + } + } + Fl::belowmouse(this); + return 1; + + case FL_DND_ENTER: + case FL_DND_DRAG: + for (i = children(); i--;) { + o = a[i]; + if (o->takesevents() && Fl::event_inside(o)) { + if (o->contains(Fl::belowmouse())) { + return send(o,FL_DND_DRAG); + } else if (send(o,FL_DND_ENTER)) { + if (!o->contains(Fl::belowmouse())) Fl::belowmouse(o); + return 1; + } + } + } + Fl::belowmouse(this); + return 0; + + case FL_PUSH: + for (i = children(); i--;) { + o = a[i]; + if (o->takesevents() && Fl::event_inside(o)) { + if (send(o,FL_PUSH)) { + if (Fl::pushed() && !o->contains(Fl::pushed())) Fl::pushed(o); + return 1; + } + } + } + return 0; + + case FL_RELEASE: + case FL_DRAG: + o = Fl::pushed(); + if (o == this) return 0; + else if (o) send(o,event); + else { + for (i = children(); i--;) { + o = a[i]; + if (o->takesevents() && Fl::event_inside(o)) { + if (send(o,event)) return 1; + } + } + } + return 0; + + case FL_MOUSEWHEEL: + for (i = children(); i--;) { + o = a[i]; + if (o->takesevents() && Fl::event_inside(o) && send(o,FL_MOUSEWHEEL)) + return 1; + } + for (i = children(); i--;) { + o = a[i]; + if (o->takesevents() && !Fl::event_inside(o) && send(o,FL_MOUSEWHEEL)) + return 1; + } + return 0; + + case FL_DEACTIVATE: + case FL_ACTIVATE: + for (i = children(); i--;) { + o = *a++; + if (o->active()) o->handle(event); + } + return 1; + + case FL_SHOW: + case FL_HIDE: + for (i = children(); i--;) { + o = *a++; + if (event == FL_HIDE && o == Fl::focus()) { + // Give up input focus... + int old_event = Fl::e_number; + o->handle(Fl::e_number = FL_UNFOCUS); + Fl::e_number = old_event; + Fl::focus(0); + } + if (o->visible()) o->handle(event); + } + return 1; + + default: + // For all other events, try to give to each child, starting at focus: + for (i = 0; i < children(); i ++) + if (Fl::focus_ == a[i]) break; + + if (i >= children()) i = 0; + + if (children()) { + for (int j = i;;) { + if (a[j]->takesevents()) if (send(a[j], event)) return 1; + j++; + if (j >= children()) j = 0; + if (j == i) break; + } + } + + return 0; + } +} + +//void Fl_Group::focus(Fl_Widget *o) {Fl::focus(o); o->handle(FL_FOCUS);} + +#if 0 +const char *nameof(Fl_Widget *o) { + if (!o) return "NULL"; + if (!o->label()) return ""; + return o->label(); +} +#endif + +// try to move the focus in response to a keystroke: +int Fl_Group::navigation(int key) { + if (children() <= 1) return 0; + int i; + for (i = 0; ; i++) { + if (i >= children_) return 0; + if (array_[i]->contains(Fl::focus())) break; + } + Fl_Widget *previous = array_[i]; + + for (;;) { + switch (key) { + case FL_Right: + case FL_Down: + i++; + if (i >= children_) { + if (parent()) return 0; + i = 0; + } + break; + case FL_Left: + case FL_Up: + if (i) i--; + else { + if (parent()) return 0; + i = children_-1; + } + break; + default: + return 0; + } + Fl_Widget* o = array_[i]; + if (o == previous) return 0; + switch (key) { + case FL_Down: + case FL_Up: + // for up/down, the widgets have to overlap horizontally: + if (o->x() >= previous->x()+previous->w() || + o->x()+o->w() <= previous->x()) continue; + } + if (o->take_focus()) return 1; + } +} + +//////////////////////////////////////////////////////////////// + +Fl_Group::Fl_Group(int X,int Y,int W,int H,const char *l) +: Fl_Widget(X,Y,W,H,l) { + align(FL_ALIGN_TOP); + children_ = 0; + array_ = 0; + savedfocus_ = 0; + resizable_ = this; + sizes_ = 0; // this is allocated when first resize() is done + // Subclasses may want to construct child objects as part of their + // constructor, so make sure they are add()'d to this object. + // But you must end() the object! + begin(); +} + +void Fl_Group::clear() { + Fl_Widget*const* old_array = array(); + int old_children = children(); + // clear everything now, in case fl_fix_focus recursively calls us: + children_ = 0; + //array_ = 0; //dont do this, it will clobber old_array if only one child + savedfocus_ = 0; + resizable_ = this; + init_sizes(); + // okay, now it is safe to destroy the children: + Fl_Widget*const* a = old_array; + for (int i=old_children; i--;) { + Fl_Widget* o = *a++; + if (o->parent() == this) delete o; + } + if (old_children > 1) free((void*)old_array); +} + +Fl_Group::~Fl_Group() { + clear(); +} + +void Fl_Group::insert(Fl_Widget &o, int index) { + if (o.parent()) { + Fl_Group* g = (Fl_Group*)(o.parent()); + int n = g->find(o); + if (g == this) { + if (index > n) index--; + if (index == n) return; + } + g->remove(o); + } + o.parent_ = this; + if (children_ == 0) { // use array pointer to point at single child + array_ = (Fl_Widget**)&o; + } else if (children_ == 1) { // go from 1 to 2 children + Fl_Widget* t = (Fl_Widget*)array_; + array_ = (Fl_Widget**)malloc(2*sizeof(Fl_Widget*)); + if (index) {array_[0] = t; array_[1] = &o;} + else {array_[0] = &o; array_[1] = t;} + } else { + if (!(children_ & (children_-1))) // double number of children + array_ = (Fl_Widget**)realloc((void*)array_, + 2*children_*sizeof(Fl_Widget*)); + int j; for (j = children_; j > index; j--) array_[j] = array_[j-1]; + array_[j] = &o; + } + children_++; + init_sizes(); +} + +void Fl_Group::add(Fl_Widget &o) {insert(o, children_);} + +void Fl_Group::remove(Fl_Widget &o) { + if (!children_) return; + int i = find(o); + if (i >= children_) return; + if (&o == savedfocus_) savedfocus_ = 0; + o.parent_ = 0; + children_--; + if (children_ == 1) { // go from 2 to 1 child + Fl_Widget *t = array_[!i]; + free((void*)array_); + array_ = (Fl_Widget**)t; + } else if (children_ > 1) { // delete from array + for (; i < children_; i++) array_[i] = array_[i+1]; + } + init_sizes(); +} + +//////////////////////////////////////////////////////////////// + +// Rather lame kludge here, I need to detect windows and ignore the +// changes to X,Y, since all children are relative to X,Y. That +// is why I check type(): + +// sizes array stores the initial positions of widgets as +// left,right,top,bottom quads. The first quad is the group, the +// second is the resizable (clipped to the group), and the +// rest are the children. This is a convienent order for the +// algorithim. If you change this be sure to fix Fl_Tile which +// also uses this array! + +void Fl_Group::init_sizes() { + delete[] sizes_; sizes_ = 0; +} + +short* Fl_Group::sizes() { + if (!sizes_) { + short* p = sizes_ = new short[4*(children_+2)]; + // first thing in sizes array is the group's size: + if (type() < FL_WINDOW) {p[0] = x(); p[2] = y();} else {p[0] = p[2] = 0;} + p[1] = p[0]+w(); p[3] = p[2]+h(); + // next is the resizable's size: + p[4] = p[0]; // init to the group's size + p[5] = p[1]; + p[6] = p[2]; + p[7] = p[3]; + Fl_Widget* r = resizable(); + if (r && r != this) { // then clip the resizable to it + int t; + t = r->x(); if (t > p[0]) p[4] = t; + t +=r->w(); if (t < p[1]) p[5] = t; + t = r->y(); if (t > p[2]) p[6] = t; + t +=r->h(); if (t < p[3]) p[7] = t; + } + // next is all the children's sizes: + p += 8; + Fl_Widget*const* a = array(); + for (int i=children_; i--;) { + Fl_Widget* o = *a++; + *p++ = o->x(); + *p++ = o->x()+o->w(); + *p++ = o->y(); + *p++ = o->y()+o->h(); + } + } + return sizes_; +} + +void Fl_Group::resize(int X, int Y, int W, int H) { + + int dx = X-x(); + int dy = Y-y(); + int dw = W-w(); + int dh = H-h(); + + short *p = sizes(); // save initial sizes and positions + + Fl_Widget::resize(X,Y,W,H); // make new xywh values visible for children + + if (!resizable() || dw==0 && dh==0 ) { + + if (type() < FL_WINDOW) { + Fl_Widget*const* a = array(); + for (int i=children_; i--;) { + Fl_Widget* o = *a++; + o->resize(o->x()+dx, o->y()+dy, o->w(), o->h()); + } + } + + } else if (children_) { + + // get changes in size/position from the initial size: + dx = X - p[0]; + dw = W - (p[1]-p[0]); + dy = Y - p[2]; + dh = H - (p[3]-p[2]); + if (type() >= FL_WINDOW) dx = dy = 0; + p += 4; + + // get initial size of resizable(): + int IX = *p++; + int IR = *p++; + int IY = *p++; + int IB = *p++; + + Fl_Widget*const* a = array(); + for (int i=children_; i--;) { + Fl_Widget* o = *a++; +#if 1 + int XX = *p++; + if (XX >= IR) XX += dw; + else if (XX > IX) XX = IX+((XX-IX)*(IR+dw-IX)+(IR-IX)/2)/(IR-IX); + int R = *p++; + if (R >= IR) R += dw; + else if (R > IX) R = IX+((R-IX)*(IR+dw-IX)+(IR-IX)/2)/(IR-IX); + + int YY = *p++; + if (YY >= IB) YY += dh; + else if (YY > IY) YY = IY+((YY-IY)*(IB+dh-IY)+(IB-IY)/2)/(IB-IY); + int B = *p++; + if (B >= IB) B += dh; + else if (B > IY) B = IY+((B-IY)*(IB+dh-IY)+(IB-IY)/2)/(IB-IY); +#else // much simpler code from Francois Ostiguy: + int XX = *p++; + if (XX >= IR) XX += dw; + else if (XX > IX) XX += dw * (XX-IX)/(IR-IX); + int R = *p++; + if (R >= IR) R += dw; + else if (R > IX) R = R + dw * (R-IX)/(IR-IX); + + int YY = *p++; + if (YY >= IB) YY += dh; + else if (YY > IY) YY = YY + dh*(YY-IY)/(IB-IY); + int B = *p++; + if (B >= IB) B += dh; + else if (B > IY) B = B + dh*(B-IY)/(IB-IY); +#endif + o->resize(XX+dx, YY+dy, R-XX, B-YY); + } + } +} + +void Fl_Group::draw_children() { + Fl_Widget*const* a = array(); + + if (clip_children()) { + fl_push_clip(x() + Fl::box_dx(box()), + y() + Fl::box_dy(box()), + w() - Fl::box_dw(box()), + h() - Fl::box_dh(box())); + } + + if (damage() & ~FL_DAMAGE_CHILD) { // redraw the entire thing: + for (int i=children_; i--;) { + Fl_Widget& o = **a++; + draw_child(o); + draw_outside_label(o); + } + } else { // only redraw the children that need it: + for (int i=children_; i--;) update_child(**a++); + } + + if (clip_children()) fl_pop_clip(); +} + +void Fl_Group::draw() { + if (damage() & ~FL_DAMAGE_CHILD) { // redraw the entire thing: + draw_box(); + draw_label(); + } + draw_children(); +} + +// Draw a child only if it needs it: +void Fl_Group::update_child(Fl_Widget& widget) const { + if (widget.damage() && widget.visible() && widget.type() < FL_WINDOW && + fl_not_clipped(widget.x(), widget.y(), widget.w(), widget.h())) { + widget.draw(); + widget.clear_damage(); + } +} + +// Force a child to redraw: +void Fl_Group::draw_child(Fl_Widget& widget) const { + if (widget.visible() && widget.type() < FL_WINDOW && + fl_not_clipped(widget.x(), widget.y(), widget.w(), widget.h())) { + widget.clear_damage(FL_DAMAGE_ALL); + widget.draw(); + widget.clear_damage(); + } +} + +extern char fl_draw_shortcut; + +// Parents normally call this to draw outside labels: +void Fl_Group::draw_outside_label(const Fl_Widget& widget) const { + if (!widget.visible()) return; + // skip any labels that are inside the widget: + if (!(widget.align()&15) || (widget.align() & FL_ALIGN_INSIDE)) return; + // invent a box that is outside the widget: + int a = widget.align(); + int X = widget.x(); + int Y = widget.y(); + int W = widget.w(); + int H = widget.h(); + if (a & FL_ALIGN_TOP) { + a ^= (FL_ALIGN_BOTTOM|FL_ALIGN_TOP); + Y = y(); + H = widget.y()-Y; + } else if (a & FL_ALIGN_BOTTOM) { + a ^= (FL_ALIGN_BOTTOM|FL_ALIGN_TOP); + Y = Y+H; + H = y()+h()-Y; + } else if (a & FL_ALIGN_LEFT) { + a ^= (FL_ALIGN_LEFT|FL_ALIGN_RIGHT); + X = x(); + W = widget.x()-X-3; + } else if (a & FL_ALIGN_RIGHT) { + a ^= (FL_ALIGN_LEFT|FL_ALIGN_RIGHT); + X = X+W+3; + W = x()+this->w()-X; + } + widget.draw_label(X,Y,W,H,(Fl_Align)a); +} + +// +// End of "$Id: Fl_Group.cxx 6463 2008-10-19 06:40:02Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Help_Dialog.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Help_Dialog.cxx new file mode 100644 index 0000000..0488f91 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Help_Dialog.cxx @@ -0,0 +1,301 @@ +// +// "$Id: Fl_Help_Dialog.cxx 5643 2007-01-28 19:36:51Z mike $" +// +// Fl_Help_Dialog dialog for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// generated by Fast Light User Interface Designer (fluid) version 1.0108 + +#include "../FL/Fl_Help_Dialog.H" +#include "flstring.h" +#include + +void Fl_Help_Dialog::cb_back__i(Fl_Button*, void*) { + if (index_ > 0) + index_ --; + +if (index_ == 0) + back_->deactivate(); + +forward_->activate(); + +int l = line_[index_]; + +if (strcmp(view_->filename(), file_[index_]) != 0) + view_->load(file_[index_]); + +view_->topline(l); +} +void Fl_Help_Dialog::cb_back_(Fl_Button* o, void* v) { + ((Fl_Help_Dialog*)(o->parent()->parent()->user_data()))->cb_back__i(o,v); +} + +void Fl_Help_Dialog::cb_forward__i(Fl_Button*, void*) { + if (index_ < max_) + index_ ++; + +if (index_ >= max_) + forward_->deactivate(); + +back_->activate(); + +int l = view_->topline(); + +if (strcmp(view_->filename(), file_[index_]) != 0) + view_->load(file_[index_]); + +view_->topline(l); +} +void Fl_Help_Dialog::cb_forward_(Fl_Button* o, void* v) { + ((Fl_Help_Dialog*)(o->parent()->parent()->user_data()))->cb_forward__i(o,v); +} + +void Fl_Help_Dialog::cb_smaller__i(Fl_Button*, void*) { + if (view_->textsize() > 8) + view_->textsize(view_->textsize() - 2); + +if (view_->textsize() <= 8) + smaller_->deactivate(); +larger_->activate(); +} +void Fl_Help_Dialog::cb_smaller_(Fl_Button* o, void* v) { + ((Fl_Help_Dialog*)(o->parent()->parent()->user_data()))->cb_smaller__i(o,v); +} + +void Fl_Help_Dialog::cb_larger__i(Fl_Button*, void*) { + if (view_->textsize() < 18) + view_->textsize(view_->textsize() + 2); + +if (view_->textsize() >= 18) + larger_->deactivate(); +smaller_->activate(); +} +void Fl_Help_Dialog::cb_larger_(Fl_Button* o, void* v) { + ((Fl_Help_Dialog*)(o->parent()->parent()->user_data()))->cb_larger__i(o,v); +} + +void Fl_Help_Dialog::cb_find__i(Fl_Input*, void*) { + find_pos_ = view_->find(find_->value(), find_pos_); +} +void Fl_Help_Dialog::cb_find_(Fl_Input* o, void* v) { + ((Fl_Help_Dialog*)(o->parent()->parent()->parent()->user_data()))->cb_find__i(o,v); +} + +void Fl_Help_Dialog::cb_view__i(Fl_Help_View*, void*) { + if (view_->filename()) +{ + if (view_->changed()) + { + index_ ++; + + if (index_ >= 100) + { + memmove(line_, line_ + 10, sizeof(line_[0]) * 90); + memmove(file_, file_ + 10, sizeof(file_[0]) * 90); + index_ -= 10; + } + + max_ = index_; + + strlcpy(file_[index_], view_->filename(),sizeof(file_[0])); + line_[index_] = view_->topline(); + + if (index_ > 0) + back_->activate(); + else + back_->deactivate(); + + forward_->deactivate(); + window_->label(view_->title()); + } + else // if ! view_->changed() + { + strlcpy(file_[index_], view_->filename(), sizeof(file_[0])); + line_[index_] = view_->topline(); + } +} else { // if ! view_->filename() + index_ = 0; // hitting an internal page will disable the back/fwd buffer + file_[index_][0] = 0; // unnamed internal page + line_[index_] = view_->topline(); + back_->deactivate(); + forward_->deactivate(); +}; +} +void Fl_Help_Dialog::cb_view_(Fl_Help_View* o, void* v) { + ((Fl_Help_Dialog*)(o->parent()->user_data()))->cb_view__i(o,v); +} + +Fl_Help_Dialog::Fl_Help_Dialog() { + { window_ = new Fl_Double_Window(530, 385, "Help Dialog"); + window_->user_data((void*)(this)); + { Fl_Group* o = new Fl_Group(10, 10, 511, 25); + { back_ = new Fl_Button(10, 10, 25, 25, "@<-"); + back_->tooltip("Show the previous help page."); + back_->shortcut(0xff51); + back_->labelcolor((Fl_Color)2); + back_->callback((Fl_Callback*)cb_back_); + } // Fl_Button* back_ + { forward_ = new Fl_Button(45, 10, 25, 25, "@->"); + forward_->tooltip("Show the next help page."); + forward_->shortcut(0xff53); + forward_->labelcolor((Fl_Color)2); + forward_->callback((Fl_Callback*)cb_forward_); + } // Fl_Button* forward_ + { smaller_ = new Fl_Button(80, 10, 25, 25, "F"); + smaller_->tooltip("Make the help text smaller."); + smaller_->labelfont(1); + smaller_->labelsize(10); + smaller_->callback((Fl_Callback*)cb_smaller_); + } // Fl_Button* smaller_ + { larger_ = new Fl_Button(115, 10, 25, 25, "F"); + larger_->tooltip("Make the help text larger."); + larger_->labelfont(1); + larger_->labelsize(16); + larger_->callback((Fl_Callback*)cb_larger_); + } // Fl_Button* larger_ + { Fl_Group* o = new Fl_Group(350, 10, 171, 25); + o->box(FL_DOWN_BOX); + o->color(FL_BACKGROUND2_COLOR); + { find_ = new Fl_Input(375, 12, 143, 21, "@search"); + find_->tooltip("find text in document"); + find_->box(FL_FLAT_BOX); + find_->labelsize(13); + find_->textfont(4); + find_->callback((Fl_Callback*)cb_find_); + find_->when(FL_WHEN_ENTER_KEY_ALWAYS); + } // Fl_Input* find_ + o->end(); + } // Fl_Group* o + { Fl_Box* o = new Fl_Box(150, 10, 190, 25); + Fl_Group::current()->resizable(o); + } // Fl_Box* o + o->end(); + } // Fl_Group* o + { view_ = new Fl_Help_View(10, 45, 510, 330); + view_->box(FL_DOWN_BOX); + view_->callback((Fl_Callback*)cb_view_); + Fl_Group::current()->resizable(view_); + } // Fl_Help_View* view_ + window_->size_range(260, 150); + window_->end(); + } // Fl_Double_Window* window_ + back_->deactivate(); +forward_->deactivate(); + +index_ = -1; +max_ = 0; +find_pos_ = 0; + +fl_register_images(); +} + +Fl_Help_Dialog::~Fl_Help_Dialog() { + delete window_; +} + +int Fl_Help_Dialog::h() { + return (window_->h()); +} + +void Fl_Help_Dialog::hide() { + window_->hide(); +} + +void Fl_Help_Dialog::load(const char *f) { + view_->set_changed(); +view_->load(f); +window_->label(view_->title()); +} + +void Fl_Help_Dialog::position(int xx, int yy) { + window_->position(xx, yy); +} + +void Fl_Help_Dialog::resize(int xx, int yy, int ww, int hh) { + window_->resize(xx, yy, ww, hh); +} + +void Fl_Help_Dialog::show() { + window_->show(); +} + +void Fl_Help_Dialog::show(int argc, char **argv) { + window_->show(argc, argv); +} + +void Fl_Help_Dialog::textsize(uchar s) { + view_->textsize(s); + +if (s <= 8) + smaller_->deactivate(); +else + smaller_->activate(); + +if (s >= 18) + larger_->deactivate(); +else + larger_->activate(); +} + +uchar Fl_Help_Dialog::textsize() { + return (view_->textsize()); +} + +void Fl_Help_Dialog::topline(const char *n) { + view_->topline(n); +} + +void Fl_Help_Dialog::topline(int n) { + view_->topline(n); +} + +void Fl_Help_Dialog::value(const char *f) { + view_->set_changed(); +view_->value(f); +window_->label(view_->title()); +} + +const char * Fl_Help_Dialog::value() const { + return view_->value(); +} + +int Fl_Help_Dialog::visible() { + return (window_->visible()); +} + +int Fl_Help_Dialog::w() { + return (window_->w()); +} + +int Fl_Help_Dialog::x() { + return (window_->x()); +} + +int Fl_Help_Dialog::y() { + return (window_->y()); +} + +// +// End of "$Id: Fl_Help_Dialog.cxx 5643 2007-01-28 19:36:51Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Help_Dialog.fl b/third_party/windows/fltk-1.1.10/src/Fl_Help_Dialog.fl new file mode 100644 index 0000000..78f23a5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Help_Dialog.fl @@ -0,0 +1,265 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0108 +header_name {../FL/Fl_Help_Dialog.H} +code_name {.cxx} +comment {// +// "$Id: Fl_Help_Dialog.fl 5643 2007-01-28 19:36:51Z mike $" +// +// Fl_Help_Dialog dialog for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +} {in_source in_header +} + +decl {\#include "flstring.h"} {} + +decl {\#include } {} + +class FL_EXPORT Fl_Help_Dialog {open +} { + decl {int index_;} {} + decl {int max_;} {} + decl {int line_[100];} {} + decl {char file_[100][256];} {} + decl {int find_pos_;} {} + Function {Fl_Help_Dialog()} {open + } { + Fl_Window window_ { + label {Help Dialog} open + private xywh {398 64 530 385} type Double resizable size_range {260 150 0 0} visible + } { + Fl_Group {} {open selected + xywh {10 10 511 25} + } { + Fl_Button back_ { + label {@<-} + callback {if (index_ > 0) + index_ --; + +if (index_ == 0) + back_->deactivate(); + +forward_->activate(); + +int l = line_[index_]; + +if (strcmp(view_->filename(), file_[index_]) != 0) + view_->load(file_[index_]); + +view_->topline(l);} + private tooltip {Show the previous help page.} xywh {10 10 25 25} shortcut 0xff51 labelcolor 2 + } + Fl_Button forward_ { + label {@->} + callback {if (index_ < max_) + index_ ++; + +if (index_ >= max_) + forward_->deactivate(); + +back_->activate(); + +int l = view_->topline(); + +if (strcmp(view_->filename(), file_[index_]) != 0) + view_->load(file_[index_]); + +view_->topline(l);} + private tooltip {Show the next help page.} xywh {45 10 25 25} shortcut 0xff53 labelcolor 2 + } + Fl_Button smaller_ { + label F + callback {if (view_->textsize() > 8) + view_->textsize(view_->textsize() - 2); + +if (view_->textsize() <= 8) + smaller_->deactivate(); +larger_->activate();} + private tooltip {Make the help text smaller.} xywh {80 10 25 25} labelfont 1 labelsize 10 + } + Fl_Button larger_ { + label F + callback {if (view_->textsize() < 18) + view_->textsize(view_->textsize() + 2); + +if (view_->textsize() >= 18) + larger_->deactivate(); +smaller_->activate();} + private tooltip {Make the help text larger.} xywh {115 10 25 25} labelfont 1 labelsize 16 + } + Fl_Group {} {open + xywh {350 10 171 25} box DOWN_BOX color 7 + } { + Fl_Input find_ { + label {@search} + callback {find_pos_ = view_->find(find_->value(), find_pos_);} + private tooltip {find text in document} xywh {375 12 143 21} box FLAT_BOX labelsize 13 when 10 textfont 4 + } + } + Fl_Box {} { + xywh {150 10 190 25} resizable + } + } + Fl_Help_View view_ { + callback {if (view_->filename()) +{ + if (view_->changed()) + { + index_ ++; + + if (index_ >= 100) + { + memmove(line_, line_ + 10, sizeof(line_[0]) * 90); + memmove(file_, file_ + 10, sizeof(file_[0]) * 90); + index_ -= 10; + } + + max_ = index_; + + strlcpy(file_[index_], view_->filename(),sizeof(file_[0])); + line_[index_] = view_->topline(); + + if (index_ > 0) + back_->activate(); + else + back_->deactivate(); + + forward_->deactivate(); + window_->label(view_->title()); + } + else // if ! view_->changed() + { + strlcpy(file_[index_], view_->filename(), sizeof(file_[0])); + line_[index_] = view_->topline(); + } +} else { // if ! view_->filename() + index_ = 0; // hitting an internal page will disable the back/fwd buffer + file_[index_][0] = 0; // unnamed internal page + line_[index_] = view_->topline(); + back_->deactivate(); + forward_->deactivate(); +}} + private xywh {10 45 510 330} box DOWN_BOX resizable + } + } + code {back_->deactivate(); +forward_->deactivate(); + +index_ = -1; +max_ = 0; +find_pos_ = 0; + +fl_register_images();} {} + } + Function {~Fl_Help_Dialog()} {} { + code {delete window_;} {} + } + Function {h()} {return_type int + } { + code {return (window_->h());} {} + } + Function {hide()} {return_type void + } { + code {window_->hide();} {} + } + Function {load(const char *f)} {return_type void + } { + code {view_->set_changed(); +view_->load(f); +window_->label(view_->title());} {} + } + Function {position(int xx, int yy)} {return_type void + } { + code {window_->position(xx, yy);} {} + } + Function {resize(int xx, int yy, int ww, int hh)} {return_type void + } { + code {window_->resize(xx, yy, ww, hh);} {} + } + Function {show()} {return_type void + } { + code {window_->show();} {} + } + Function {show(int argc, char **argv)} {return_type void + } { + code {window_->show(argc, argv);} {} + } + Function {textsize(uchar s)} {return_type void + } { + code {view_->textsize(s); + +if (s <= 8) + smaller_->deactivate(); +else + smaller_->activate(); + +if (s >= 18) + larger_->deactivate(); +else + larger_->activate();} {} + } + Function {textsize()} {return_type uchar + } { + code {return (view_->textsize());} {} + } + Function {topline(const char *n)} {return_type void + } { + code {view_->topline(n);} {} + } + Function {topline(int n)} {return_type void + } { + code {view_->topline(n);} {} + } + Function {value(const char *f)} {return_type void + } { + code {view_->set_changed(); +view_->value(f); +window_->label(view_->title());} {} + } + Function {value() const} {return_type {const char *} + } { + code {return view_->value();} {} + } + Function {visible()} {return_type int + } { + code {return (window_->visible());} {} + } + Function {w()} {return_type int + } { + code {return (window_->w());} {} + } + Function {x()} {return_type int + } { + code {return (window_->x());} {} + } + Function {y()} {return_type int + } { + code {return (window_->y());} {} + } +} + +comment { +// +// End of "$Id: Fl_Help_Dialog.fl 5643 2007-01-28 19:36:51Z mike $". +//} {in_source in_header +} diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Help_View.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Help_View.cxx new file mode 100644 index 0000000..c7bd073 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Help_View.cxx @@ -0,0 +1,3507 @@ +// +// "$Id: Fl_Help_View.cxx 6745 2009-04-07 18:37:25Z AlbrechtS $" +// +// Fl_Help_View widget routines. +// +// Copyright 1997-2007 by Easy Software Products. +// Image support donated by Matthias Melcher, Copyright 2000. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// Fl_Help_View::add_block() - Add a text block to the list. +// Fl_Help_View::add_link() - Add a new link to the list. +// Fl_Help_View::add_target() - Add a new target to the list. +// Fl_Help_View::compare_targets() - Compare two targets. +// Fl_Help_View::do_align() - Compute the alignment for a line in +// a block. +// Fl_Help_View::draw() - Draw the Fl_Help_View widget. +// Fl_Help_View::format() - Format the help text. +// Fl_Help_View::format_table() - Format a table... +// Fl_Help_View::free_data() - Free memory used for the document. +// Fl_Help_View::get_align() - Get an alignment attribute. +// Fl_Help_View::get_attr() - Get an attribute value from the string. +// Fl_Help_View::get_color() - Get an alignment attribute. +// Fl_Help_View::handle() - Handle events in the widget. +// Fl_Help_View::Fl_Help_View() - Build a Fl_Help_View widget. +// Fl_Help_View::~Fl_Help_View() - Destroy a Fl_Help_View widget. +// Fl_Help_View::load() - Load the specified file. +// Fl_Help_View::resize() - Resize the help widget. +// Fl_Help_View::topline() - Set the top line to the named target. +// Fl_Help_View::topline() - Set the top line by number. +// Fl_Help_View::value() - Set the help text directly. +// scrollbar_callback() - A callback for the scrollbar. +// + +// +// Include necessary header files... +// + +#include +#include +#include +#include +#include +#include +#include "flstring.h" +#include +#include +#include + +#if defined(WIN32) && ! defined(__CYGWIN__) +# include +# include +// Visual C++ 2005 incorrectly displays a warning about the use of POSIX APIs +// on Windows, which is supposed to be POSIX compliant... +# define getcwd _getcwd +#else +# include +#endif // WIN32 + +#define MAX_COLUMNS 200 + + +// +// Typedef the C API sort function type the only way I know how... +// + +extern "C" +{ + typedef int (*compare_func_t)(const void *, const void *); +} + + +// +// Local functions... +// + +static int quote_char(const char *); +static void scrollbar_callback(Fl_Widget *s, void *); +static void hscrollbar_callback(Fl_Widget *s, void *); + +// +// global flag for image loading (see get_image). +// + +static char initial_load = 0; + +// +// Broken image... +// + +static const char *broken_xpm[] = + { + "16 24 4 1", + "@ c #000000", + " c #ffffff", + "+ c none", + "x c #ff0000", + // pixels + "@@@@@@@+++++++++", + "@ @++++++++++", + "@ @+++++++++++", + "@ @++@++++++++", + "@ @@+++++++++", + "@ @+++@+++++", + "@ @++@@++++@", + "@ xxx @@ @++@@", + "@ xxx xx@@ @", + "@ xxx xxx @", + "@ xxxxxx @", + "@ xxxx @", + "@ xxxxxx @", + "@ xxx xxx @", + "@ xxx xxx @", + "@ xxx xxx @", + "@ @", + "@ @", + "@ @", + "@ @", + "@ @", + "@ @", + "@ @", + "@@@@@@@@@@@@@@@@", + NULL + }; + +static Fl_Pixmap broken_image(broken_xpm); + +// +// Simple margin stack for Fl_Help_View::format()... +// + +struct fl_margins { + int depth_; + int margins_[100]; + + fl_margins() { clear(); } + + int clear() { +// puts("fl_margins::clear()"); + + depth_ = 0; + return margins_[0] = 4; + } + + int current() { return margins_[depth_]; } + + int pop() { +// printf("fl_margins::pop(): depth_=%d, xx=%d\n", depth_, +// depth_ > 0 ? margins_[depth_ - 1] : 4); + + if (depth_ > 0) { + depth_ --; + return margins_[depth_]; + } else return 4; + } + + int push(int indent) { + int xx; + + xx = margins_[depth_] + indent; + +// printf("fl_margins::push(indent=%d): depth_=%d, xx=%d\n", indent, +// depth_ + 1, xx); + + if (depth_ < 99) { + depth_ ++; + margins_[depth_] = xx; + } + + return xx; + } +}; + +// +// All the stuff needed to implement text selection in Fl_Help_View +// + +/* matt: + * We are trying to keep binary compatibility with previous versions + * of FLTK. This means that we are limited to adding static variables + * only to not enlarge the Fl_Help_View class. Lucky for us, only one + * text can be selected system wide, so we can remember the selection + * in a single set of variables. + * + * Still to do: + * - &word; style characters mess up our count inside a word boundary + * - we can only select words, no individual characters + * - no dragging of the selection into another widget + * - selection must be cleared if another widget get focus! + * - write a comment for every new function + */ + +/* +The following functions are also used to draw stuff and should be replaced with +local copies that are much faster when merely counting: + +fl_color(Fl_Color); +fl_rectf(int, int, int, int); +fl_push_clip(int, int, int, int); +fl_xyline(int, int, int); +fl_rect() +fl_line() +img->draw() +*/ + +// We don't put the offscreen buffer in the help view class because +// we'd need to include x.H in the header... +static Fl_Offscreen fl_help_view_buffer; +int Fl_Help_View::selection_first = 0; +int Fl_Help_View::selection_last = 0; +int Fl_Help_View::selection_push_first = 0; +int Fl_Help_View::selection_push_last = 0; +int Fl_Help_View::selection_drag_first = 0; +int Fl_Help_View::selection_drag_last = 0; +int Fl_Help_View::selected = 0; +int Fl_Help_View::draw_mode = 0; +int Fl_Help_View::mouse_x = 0; +int Fl_Help_View::mouse_y = 0; +int Fl_Help_View::current_pos = 0; +Fl_Help_View *Fl_Help_View::current_view = 0L; +Fl_Color Fl_Help_View::hv_selection_color; +Fl_Color Fl_Help_View::hv_selection_text_color; + +/* + * Limitation: if a word contains &code; notations, we will calculate a wrong length. + * + * This function must be optimized for speed! + */ +void Fl_Help_View::hv_draw(const char *t, int x, int y) +{ + if (selected && current_view==this && current_pos=selection_first) { + Fl_Color c = fl_color(); + fl_color(hv_selection_color); + int w = (int)fl_width(t); + if (current_pos+(int)strlen(t)=x && mouse_x=y-fl_height()+fl_descent()&&mouse_y<=y+fl_descent()) { + int f = current_pos; + int l = f+strlen(t); // use 'quote_char' to calculate the true length of the HTML string + if (draw_mode==1) { + selection_push_first = f; + selection_push_last = l; + } else { + selection_drag_first = f; + selection_drag_last = l; + } + } + } + } +} + + +// +// 'Fl_Help_View::add_block()' - Add a text block to the list. +// + +Fl_Help_Block * // O - Pointer to new block +Fl_Help_View::add_block(const char *s, // I - Pointer to start of block text + int xx, // I - X position of block + int yy, // I - Y position of block + int ww, // I - Right margin of block + int hh, // I - Height of block + unsigned char border) // I - Draw border? +{ + Fl_Help_Block *temp; // New block + + +// printf("add_block(s = %p, xx = %d, yy = %d, ww = %d, hh = %d, border = %d)\n", +// s, xx, yy, ww, hh, border); + + if (nblocks_ >= ablocks_) + { + ablocks_ += 16; + + if (ablocks_ == 16) + blocks_ = (Fl_Help_Block *)malloc(sizeof(Fl_Help_Block) * ablocks_); + else + blocks_ = (Fl_Help_Block *)realloc(blocks_, sizeof(Fl_Help_Block) * ablocks_); + } + + temp = blocks_ + nblocks_; + memset(temp, 0, sizeof(Fl_Help_Block)); + temp->start = s; + temp->end = s; + temp->x = xx; + temp->y = yy; + temp->w = ww; + temp->h = hh; + temp->border = border; + temp->bgcolor = bgcolor_; + nblocks_ ++; + + return (temp); +} + + +// +// 'Fl_Help_View::add_link()' - Add a new link to the list. +// + +void +Fl_Help_View::add_link(const char *n, // I - Name of link + int xx, // I - X position of link + int yy, // I - Y position of link + int ww, // I - Width of link text + int hh) // I - Height of link text +{ + Fl_Help_Link *temp; // New link + char *target; // Pointer to target name + + + if (nlinks_ >= alinks_) + { + alinks_ += 16; + + if (alinks_ == 16) + links_ = (Fl_Help_Link *)malloc(sizeof(Fl_Help_Link) * alinks_); + else + links_ = (Fl_Help_Link *)realloc(links_, sizeof(Fl_Help_Link) * alinks_); + } + + temp = links_ + nlinks_; + + temp->x = xx; + temp->y = yy; + temp->w = xx + ww; + temp->h = yy + hh; + + strlcpy(temp->filename, n, sizeof(temp->filename)); + + if ((target = strrchr(temp->filename, '#')) != NULL) + { + *target++ = '\0'; + strlcpy(temp->name, target, sizeof(temp->name)); + } + else + temp->name[0] = '\0'; + + nlinks_ ++; +} + + +// +// 'Fl_Help_View::add_target()' - Add a new target to the list. +// + +void +Fl_Help_View::add_target(const char *n, // I - Name of target + int yy) // I - Y position of target +{ + Fl_Help_Target *temp; // New target + + + if (ntargets_ >= atargets_) + { + atargets_ += 16; + + if (atargets_ == 16) + targets_ = (Fl_Help_Target *)malloc(sizeof(Fl_Help_Target) * atargets_); + else + targets_ = (Fl_Help_Target *)realloc(targets_, sizeof(Fl_Help_Target) * atargets_); + } + + temp = targets_ + ntargets_; + + temp->y = yy; + strlcpy(temp->name, n, sizeof(temp->name)); + + ntargets_ ++; +} + + +// +// 'Fl_Help_View::compare_targets()' - Compare two targets. +// + +int // O - Result of comparison +Fl_Help_View::compare_targets(const Fl_Help_Target *t0, // I - First target + const Fl_Help_Target *t1) // I - Second target +{ + return (strcasecmp(t0->name, t1->name)); +} + + +// +// 'Fl_Help_View::do_align()' - Compute the alignment for a line in a block. +// + +int // O - New line +Fl_Help_View::do_align(Fl_Help_Block *block, // I - Block to add to + int line, // I - Current line + int xx, // I - Current X position + int a, // I - Current alignment + int &l) // IO - Starting link +{ + int offset; // Alignment offset + + + switch (a) + { + case RIGHT : // Right align + offset = block->w - xx; + break; + case CENTER : // Center + offset = (block->w - xx) / 2; + break; + default : // Left align + offset = 0; + break; + } + + block->line[line] = block->x + offset; + + if (line < 31) + line ++; + + while (l < nlinks_) + { + links_[l].x += offset; + links_[l].w += offset; + l ++; + } + + return (line); +} + + +// +// 'Fl_Help_View::draw()' - Draw the Fl_Help_View widget. +// + +void +Fl_Help_View::draw() +{ + int i; // Looping var + const Fl_Help_Block *block; // Pointer to current block + const char *ptr, // Pointer to text in block + *attrs; // Pointer to start of element attributes + char *s, // Pointer into buffer + buf[1024], // Text buffer + attr[1024]; // Attribute buffer + int xx, yy, ww, hh; // Current positions and sizes + int line; // Current line + unsigned char font, fsize; // Current font and size + int head, pre, // Flags for text + needspace; // Do we need whitespace? + Fl_Boxtype b = box() ? box() : FL_DOWN_BOX; + // Box to draw... + int underline, // Underline text? + xtra_ww; // Extra width for underlined space between words + + + // Draw the scrollbar(s) and box first... + ww = w() ; + hh = h(); + i = 0; + + draw_box(b, x(), y(), ww, hh, bgcolor_); + + int ss = Fl::scrollbar_size(); + if (hscrollbar_.visible()) { + draw_child(hscrollbar_); + hh -= ss; + i ++; + } + if (scrollbar_.visible()) { + draw_child(scrollbar_); + ww -= ss; + i ++; + } + if (i == 2) { + fl_color(FL_GRAY); + fl_rectf(x() + ww - Fl::box_dw(b) + Fl::box_dx(b), + y() + hh - Fl::box_dh(b) + Fl::box_dy(b), ss, ss); + } + + if (!value_) + return; + + if (current_view == this && selected) { + hv_selection_color = FL_SELECTION_COLOR; + hv_selection_text_color = fl_contrast(textcolor_, FL_SELECTION_COLOR); + } + current_pos = 0; + + // Clip the drawing to the inside of the box... + fl_push_clip(x() + Fl::box_dx(b), y() + Fl::box_dy(b), + ww - Fl::box_dw(b), hh - Fl::box_dh(b)); + fl_color(textcolor_); + + // Draw all visible blocks... + for (i = 0, block = blocks_; i < nblocks_; i ++, block ++) + if ((block->y + block->h) >= topline_ && block->y < (topline_ + h())) + { + line = 0; + xx = block->line[line]; + yy = block->y - topline_; + hh = 0; + pre = 0; + head = 0; + needspace = 0; + underline = 0; + + initfont(font, fsize); + + for (ptr = block->start, s = buf; ptr < block->end;) + { + if ((*ptr == '<' || isspace((*ptr)&255)) && s > buf) + { + if (!head && !pre) + { + // Check width... + *s = '\0'; + s = buf; + ww = (int)fl_width(buf); + + if (needspace && xx > block->x) + xx += (int)fl_width(' '); + + if ((xx + ww) > block->w) + { + if (line < 31) + line ++; + xx = block->line[line]; + yy += hh; + hh = 0; + } + + hv_draw(buf, xx + x() - leftline_, yy + y()); + if (underline) { + xtra_ww = isspace((*ptr)&255)?(int)fl_width(' '):0; + fl_xyline(xx + x() - leftline_, yy + y() + 1, + xx + x() - leftline_ + ww + xtra_ww); + } + current_pos = ptr-value_; + + xx += ww; + if ((fsize + 2) > hh) + hh = fsize + 2; + + needspace = 0; + } + else if (pre) + { + while (isspace((*ptr)&255)) + { + if (*ptr == '\n') + { + *s = '\0'; + s = buf; + + hv_draw(buf, xx + x() - leftline_, yy + y()); + if (underline) fl_xyline(xx + x() - leftline_, yy + y() + 1, + xx + x() - leftline_ + + (int)fl_width(buf)); + + current_pos = ptr-value_; + if (line < 31) + line ++; + xx = block->line[line]; + yy += hh; + hh = fsize + 2; + } + else if (*ptr == '\t') + { + // Do tabs every 8 columns... + while (((s - buf) & 7)) + *s++ = ' '; + } + else + *s++ = ' '; + + if ((fsize + 2) > hh) + hh = fsize + 2; + + ptr ++; + } + + if (s > buf) + { + *s = '\0'; + s = buf; + + hv_draw(buf, xx + x() - leftline_, yy + y()); + ww = (int)fl_width(buf); + if (underline) fl_xyline(xx + x() - leftline_, yy + y() + 1, + xx + x() - leftline_ + ww); + xx += ww; + current_pos = ptr-value_; + } + + needspace = 0; + } + else + { + s = buf; + + while (isspace((*ptr)&255)) + ptr ++; + current_pos = ptr-value_; + } + } + + if (*ptr == '<') + { + ptr ++; + + if (strncmp(ptr, "!--", 3) == 0) + { + // Comment... + ptr += 3; + if ((ptr = strstr(ptr, "-->")) != NULL) + { + ptr += 3; + continue; + } + else + break; + } + + while (*ptr && *ptr != '>' && !isspace((*ptr)&255)) + if (s < (buf + sizeof(buf) - 1)) + *s++ = *ptr++; + else + ptr ++; + + *s = '\0'; + s = buf; + + attrs = ptr; + while (*ptr && *ptr != '>') + ptr ++; + + if (*ptr == '>') + ptr ++; + + // end of command reached, set the supposed start of printed eord here + current_pos = ptr-value_; + if (strcasecmp(buf, "HEAD") == 0) + head = 1; + else if (strcasecmp(buf, "BR") == 0) + { + if (line < 31) + line ++; + xx = block->line[line]; + yy += hh; + hh = 0; + } + else if (strcasecmp(buf, "HR") == 0) + { + fl_line(block->x + x(), yy + y(), block->w + x(), + yy + y()); + + if (line < 31) + line ++; + xx = block->line[line]; + yy += 2 * hh; + hh = 0; + } + else if (strcasecmp(buf, "CENTER") == 0 || + strcasecmp(buf, "P") == 0 || + strcasecmp(buf, "H1") == 0 || + strcasecmp(buf, "H2") == 0 || + strcasecmp(buf, "H3") == 0 || + strcasecmp(buf, "H4") == 0 || + strcasecmp(buf, "H5") == 0 || + strcasecmp(buf, "H6") == 0 || + strcasecmp(buf, "UL") == 0 || + strcasecmp(buf, "OL") == 0 || + strcasecmp(buf, "DL") == 0 || + strcasecmp(buf, "LI") == 0 || + strcasecmp(buf, "DD") == 0 || + strcasecmp(buf, "DT") == 0 || + strcasecmp(buf, "PRE") == 0) + { + if (tolower(buf[0]) == 'h') + { + font = FL_HELVETICA_BOLD; + fsize = (uchar)(textsize_ + '7' - buf[1]); + } + else if (strcasecmp(buf, "DT") == 0) + { + font = (uchar)(textfont_ | FL_ITALIC); + fsize = textsize_; + } + else if (strcasecmp(buf, "PRE") == 0) + { + font = FL_COURIER; + fsize = textsize_; + pre = 1; + } + + if (strcasecmp(buf, "LI") == 0) + { +#ifdef __APPLE_QUARTZ__ + fl_font(FL_SYMBOL, fsize); + hv_draw("\245", xx - fsize + x() - leftline_, yy + y()); +#else + fl_font(FL_SYMBOL, fsize); + hv_draw("\267", xx - fsize + x() - leftline_, yy + y()); +#endif + } + + pushfont(font, fsize); + } + else if (strcasecmp(buf, "A") == 0 && + get_attr(attrs, "HREF", attr, sizeof(attr)) != NULL) + { + fl_color(linkcolor_); + underline = 1; + } + else if (strcasecmp(buf, "/A") == 0) + { + fl_color(textcolor_); + underline = 0; + } + else if (strcasecmp(buf, "FONT") == 0) + { + if (get_attr(attrs, "COLOR", attr, sizeof(attr)) != NULL) { + fl_color(get_color(attr, textcolor_)); + } + + if (get_attr(attrs, "FACE", attr, sizeof(attr)) != NULL) { + if (!strncasecmp(attr, "helvetica", 9) || + !strncasecmp(attr, "arial", 5) || + !strncasecmp(attr, "sans", 4)) font = FL_HELVETICA; + else if (!strncasecmp(attr, "times", 5) || + !strncasecmp(attr, "serif", 5)) font = FL_TIMES; + else if (!strncasecmp(attr, "symbol", 6)) font = FL_SYMBOL; + else font = FL_COURIER; + } + + if (get_attr(attrs, "SIZE", attr, sizeof(attr)) != NULL) { + if (isdigit(attr[0] & 255)) { + // Absolute size + fsize = (int)(textsize_ * pow(1.2, atof(attr) - 3.0)); + } else { + // Relative size + fsize = (int)(fsize * pow(1.2, atof(attr) - 3.0)); + } + } + + pushfont(font, fsize); + } + else if (strcasecmp(buf, "/FONT") == 0) + { + fl_color(textcolor_); + popfont(font, fsize); + } + else if (strcasecmp(buf, "U") == 0) + underline = 1; + else if (strcasecmp(buf, "/U") == 0) + underline = 0; + else if (strcasecmp(buf, "B") == 0 || + strcasecmp(buf, "STRONG") == 0) + pushfont(font |= FL_BOLD, fsize); + else if (strcasecmp(buf, "TD") == 0 || + strcasecmp(buf, "TH") == 0) + { + int tx, ty, tw, th; + + if (tolower(buf[1]) == 'h') + pushfont(font |= FL_BOLD, fsize); + else + pushfont(font = textfont_, fsize); + + tx = block->x - 4 - leftline_; + ty = block->y - topline_ - fsize - 3; + tw = block->w - block->x + 7; + th = block->h + fsize - 5; + + if (tx < 0) + { + tw += tx; + tx = 0; + } + + if (ty < 0) + { + th += ty; + ty = 0; + } + + tx += x(); + ty += y(); + + if (block->bgcolor != bgcolor_) + { + fl_color(block->bgcolor); + fl_rectf(tx, ty, tw, th); + fl_color(textcolor_); + } + + if (block->border) + fl_rect(tx, ty, tw, th); + } + else if (strcasecmp(buf, "I") == 0 || + strcasecmp(buf, "EM") == 0) + pushfont(font |= FL_ITALIC, fsize); + else if (strcasecmp(buf, "CODE") == 0 || + strcasecmp(buf, "TT") == 0) + pushfont(font = FL_COURIER, fsize); + else if (strcasecmp(buf, "KBD") == 0) + pushfont(font = FL_COURIER_BOLD, fsize); + else if (strcasecmp(buf, "VAR") == 0) + pushfont(font = FL_COURIER_ITALIC, fsize); + else if (strcasecmp(buf, "/HEAD") == 0) + head = 0; + else if (strcasecmp(buf, "/H1") == 0 || + strcasecmp(buf, "/H2") == 0 || + strcasecmp(buf, "/H3") == 0 || + strcasecmp(buf, "/H4") == 0 || + strcasecmp(buf, "/H5") == 0 || + strcasecmp(buf, "/H6") == 0 || + strcasecmp(buf, "/B") == 0 || + strcasecmp(buf, "/STRONG") == 0 || + strcasecmp(buf, "/I") == 0 || + strcasecmp(buf, "/EM") == 0 || + strcasecmp(buf, "/CODE") == 0 || + strcasecmp(buf, "/TT") == 0 || + strcasecmp(buf, "/KBD") == 0 || + strcasecmp(buf, "/VAR") == 0) + popfont(font, fsize); + else if (strcasecmp(buf, "/PRE") == 0) + { + popfont(font, fsize); + pre = 0; + } + else if (strcasecmp(buf, "IMG") == 0) + { + Fl_Shared_Image *img = 0; + int width, height; + char wattr[8], hattr[8]; + + + get_attr(attrs, "WIDTH", wattr, sizeof(wattr)); + get_attr(attrs, "HEIGHT", hattr, sizeof(hattr)); + width = get_length(wattr); + height = get_length(hattr); + + if (get_attr(attrs, "SRC", attr, sizeof(attr))) { + img = get_image(attr, width, height); + if (!width) width = img->w(); + if (!height) height = img->h(); + } + + if (!width || !height) { + if (get_attr(attrs, "ALT", attr, sizeof(attr)) == NULL) { + strcpy(attr, "IMG"); + } + } + + ww = width; + + if (needspace && xx > block->x) + xx += (int)fl_width(' '); + + if ((xx + ww) > block->w) + { + if (line < 31) + line ++; + + xx = block->line[line]; + yy += hh; + hh = 0; + } + + if (img) { + img->draw(xx + x() - leftline_, + yy + y() - fl_height() + fl_descent() + 2); + } + + xx += ww; + if ((height + 2) > hh) + hh = height + 2; + + needspace = 0; + } + } + else if (*ptr == '\n' && pre) + { + *s = '\0'; + s = buf; + + hv_draw(buf, xx + x() - leftline_, yy + y()); + + if (line < 31) + line ++; + xx = block->line[line]; + yy += hh; + hh = fsize + 2; + needspace = 0; + + ptr ++; + current_pos = ptr-value_; + } + else if (isspace((*ptr)&255)) + { + if (pre) + { + if (*ptr == ' ') + *s++ = ' '; + else + { + // Do tabs every 8 columns... + while (((s - buf) & 7)) + *s++ = ' '; + } + } + + ptr ++; + if (!pre) current_pos = ptr-value_; + needspace = 1; + } + else if (*ptr == '&') + { + ptr ++; + + int qch = quote_char(ptr); + + if (qch < 0) + *s++ = '&'; + else { + *s++ = qch; + ptr = strchr(ptr, ';') + 1; + } + + if ((fsize + 2) > hh) + hh = fsize + 2; + } + else + { + *s++ = *ptr++; + + if ((fsize + 2) > hh) + hh = fsize + 2; + } + } + + *s = '\0'; + + if (s > buf && !pre && !head) + { + ww = (int)fl_width(buf); + + if (needspace && xx > block->x) + xx += (int)fl_width(' '); + + if ((xx + ww) > block->w) + { + if (line < 31) + line ++; + xx = block->line[line]; + yy += hh; + hh = 0; + } + } + + if (s > buf && !head) + { + hv_draw(buf, xx + x() - leftline_, yy + y()); + if (underline) fl_xyline(xx + x() - leftline_, yy + y() + 1, + xx + x() - leftline_ + ww); + current_pos = ptr-value_; + } + } + + fl_pop_clip(); +} + + +// +// 'Fl_Help_View::find()' - Find the specified string... +// + +int // O - Matching position or -1 if not found +Fl_Help_View::find(const char *s, // I - String to find + int p) // I - Starting position +{ + int i, // Looping var + c; // Current character + Fl_Help_Block *b; // Current block + const char *bp, // Block matching pointer + *bs, // Start of current comparison + *sp; // Search string pointer + + + // Range check input and value... + if (!s || !value_) return -1; + + if (p < 0 || p >= (int)strlen(value_)) p = 0; + else if (p > 0) p ++; + + // Look for the string... + for (i = nblocks_, b = blocks_; i > 0; i --, b ++) { + if (b->end < (value_ + p)) + continue; + + if (b->start < (value_ + p)) bp = value_ + p; + else bp = b->start; + + for (sp = s, bs = bp; *sp && *bp && bp < b->end; bp ++) { + if (*bp == '<') { + // skip to end of element... + while (*bp && bp < b->end && *bp != '>') bp ++; + continue; + } else if (*bp == '&') { + // decode HTML entity... + if ((c = quote_char(bp + 1)) < 0) c = '&'; + else bp = strchr(bp + 1, ';') + 1; + } else c = *bp; + + if (tolower(*sp) == tolower(c)) sp ++; + else { + // No match, so reset to start of search... + sp = s; + bs ++; + bp = bs; + } + } + + if (!*sp) { + // Found a match! + topline(b->y - b->h); + return (b->end - value_); + } + } + + // No match! + return (-1); +} + + +// +// 'Fl_Help_View::format()' - Format the help text. +// + +void +Fl_Help_View::format() +{ + int i; // Looping var + int done; // Are we done yet? + Fl_Help_Block *block, // Current block + *cell; // Current table cell + int cells[MAX_COLUMNS], + // Cells in the current row... + row; // Current table row (block number) + const char *ptr, // Pointer into block + *start, // Pointer to start of element + *attrs; // Pointer to start of element attributes + char *s, // Pointer into buffer + buf[1024], // Text buffer + attr[1024], // Attribute buffer + wattr[1024], // Width attribute buffer + hattr[1024], // Height attribute buffer + linkdest[1024]; // Link destination + int xx, yy, ww, hh; // Size of current text fragment + int line; // Current line in block + int links; // Links for current line + unsigned char font, fsize; // Current font and size + unsigned char border; // Draw border? + int talign, // Current alignment + newalign, // New alignment + head, // In the section? + pre, //
 text?
+		needspace;	// Do we need whitespace?
+  int		table_width,	// Width of table
+		table_offset;	// Offset of table
+  int		column,		// Current table column number
+		columns[MAX_COLUMNS];
+				// Column widths
+  Fl_Color	tc, rc;		// Table/row background color
+  Fl_Boxtype	b = box() ? box() : FL_DOWN_BOX;
+				// Box to draw...
+  fl_margins	margins;	// Left margin stack...
+
+
+  // Reset document width...
+  hsize_ = w() - Fl::scrollbar_size() - Fl::box_dw(b);
+
+  done = 0;
+  while (!done)
+  {
+    // Reset state variables...
+    done       = 1;
+    nblocks_   = 0;
+    nlinks_    = 0;
+    ntargets_  = 0;
+    size_      = 0;
+    bgcolor_   = color();
+    textcolor_ = textcolor();
+    linkcolor_ = fl_contrast(FL_BLUE, color());
+
+    tc = rc = bgcolor_;
+
+    strcpy(title_, "Untitled");
+
+    if (!value_)
+      return;
+
+    // Setup for formatting...
+    initfont(font, fsize);
+
+    line         = 0;
+    links        = 0;
+    xx           = margins.clear();
+    yy           = fsize + 2;
+    ww           = 0;
+    column       = 0;
+    border       = 0;
+    hh           = 0;
+    block        = add_block(value_, xx, yy, hsize_, 0);
+    row          = 0;
+    head         = 0;
+    pre          = 0;
+    talign       = LEFT;
+    newalign     = LEFT;
+    needspace    = 0;
+    linkdest[0]  = '\0';
+    table_offset = 0;
+
+    for (ptr = value_, s = buf; *ptr;)
+    {
+      if ((*ptr == '<' || isspace((*ptr)&255)) && s > buf)
+      {
+        // Get width...
+        *s = '\0';
+        ww = (int)fl_width(buf);
+
+	if (!head && !pre)
+	{
+          // Check width...
+          if (ww > hsize_) {
+	    hsize_ = ww;
+	    done   = 0;
+	    break;
+	  }
+
+          if (needspace && xx > block->x)
+	    ww += (int)fl_width(' ');
+
+  //        printf("line = %d, xx = %d, ww = %d, block->x = %d, block->w = %d\n",
+  //	       line, xx, ww, block->x, block->w);
+
+          if ((xx + ww) > block->w)
+	  {
+            line     = do_align(block, line, xx, newalign, links);
+	    xx       = block->x;
+	    yy       += hh;
+	    block->h += hh;
+	    hh       = 0;
+	  }
+
+          if (linkdest[0])
+	    add_link(linkdest, xx, yy - fsize, ww, fsize);
+
+	  xx += ww;
+	  if ((fsize + 2) > hh)
+	    hh = fsize + 2;
+
+	  needspace = 0;
+	}
+	else if (pre)
+	{
+          // Add a link as needed...
+          if (linkdest[0])
+	    add_link(linkdest, xx, yy - hh, ww, hh);
+
+	  xx += ww;
+	  if ((fsize + 2) > hh)
+	    hh = fsize + 2;
+
+          // Handle preformatted text...
+	  while (isspace((*ptr)&255))
+	  {
+	    if (*ptr == '\n')
+	    {
+              if (xx > hsize_) break;
+
+              line     = do_align(block, line, xx, newalign, links);
+              xx       = block->x;
+	      yy       += hh;
+	      block->h += hh;
+	      hh       = fsize + 2;
+	    }
+	    else
+              xx += (int)fl_width(' ');
+
+            if ((fsize + 2) > hh)
+	      hh = fsize + 2;
+
+            ptr ++;
+	  }
+
+          if (xx > hsize_) {
+	    hsize_ = xx;
+	    done   = 0;
+	    break;
+	  }
+
+	  needspace = 0;
+	}
+	else
+	{
+          // Handle normal text or stuff in the  section...
+	  while (isspace((*ptr)&255))
+            ptr ++;
+	}
+
+	s = buf;
+      }
+
+      if (*ptr == '<')
+      {
+	start = ptr;
+	ptr ++;
+
+        if (strncmp(ptr, "!--", 3) == 0)
+	{
+	  // Comment...
+	  ptr += 3;
+	  if ((ptr = strstr(ptr, "-->")) != NULL)
+	  {
+	    ptr += 3;
+	    continue;
+	  }
+	  else
+	    break;
+	}
+
+	while (*ptr && *ptr != '>' && !isspace((*ptr)&255))
+          if (s < (buf + sizeof(buf) - 1))
+            *s++ = *ptr++;
+	  else
+	    ptr ++;
+
+	*s = '\0';
+	s = buf;
+
+//        puts(buf);
+
+	attrs = ptr;
+	while (*ptr && *ptr != '>')
+          ptr ++;
+
+	if (*ptr == '>')
+          ptr ++;
+
+	if (strcasecmp(buf, "HEAD") == 0)
+          head = 1;
+	else if (strcasecmp(buf, "/HEAD") == 0)
+          head = 0;
+	else if (strcasecmp(buf, "TITLE") == 0)
+	{
+          // Copy the title in the document...
+          for (s = title_;
+	       *ptr != '<' && *ptr && s < (title_ + sizeof(title_) - 1);
+	       *s++ = *ptr++);
+
+	  *s = '\0';
+	  s = buf;
+	}
+	else if (strcasecmp(buf, "A") == 0)
+	{
+          if (get_attr(attrs, "NAME", attr, sizeof(attr)) != NULL)
+	    add_target(attr, yy - fsize - 2);
+
+	  if (get_attr(attrs, "HREF", attr, sizeof(attr)) != NULL)
+	    strlcpy(linkdest, attr, sizeof(linkdest));
+	}
+	else if (strcasecmp(buf, "/A") == 0)
+          linkdest[0] = '\0';
+	else if (strcasecmp(buf, "BODY") == 0)
+	{
+          bgcolor_   = get_color(get_attr(attrs, "BGCOLOR", attr, sizeof(attr)),
+	                	 color());
+          textcolor_ = get_color(get_attr(attrs, "TEXT", attr, sizeof(attr)),
+	                	 textcolor());
+          linkcolor_ = get_color(get_attr(attrs, "LINK", attr, sizeof(attr)),
+	                	 fl_contrast(FL_BLUE, color()));
+	}
+	else if (strcasecmp(buf, "BR") == 0)
+	{
+          line     = do_align(block, line, xx, newalign, links);
+          xx       = block->x;
+	  block->h += hh;
+          yy       += hh;
+	  hh       = 0;
+	}
+	else if (strcasecmp(buf, "CENTER") == 0 ||
+        	 strcasecmp(buf, "P") == 0 ||
+        	 strcasecmp(buf, "H1") == 0 ||
+		 strcasecmp(buf, "H2") == 0 ||
+		 strcasecmp(buf, "H3") == 0 ||
+		 strcasecmp(buf, "H4") == 0 ||
+		 strcasecmp(buf, "H5") == 0 ||
+		 strcasecmp(buf, "H6") == 0 ||
+		 strcasecmp(buf, "UL") == 0 ||
+		 strcasecmp(buf, "OL") == 0 ||
+		 strcasecmp(buf, "DL") == 0 ||
+		 strcasecmp(buf, "LI") == 0 ||
+		 strcasecmp(buf, "DD") == 0 ||
+		 strcasecmp(buf, "DT") == 0 ||
+		 strcasecmp(buf, "HR") == 0 ||
+		 strcasecmp(buf, "PRE") == 0 ||
+		 strcasecmp(buf, "TABLE") == 0)
+	{
+          block->end = start;
+          line       = do_align(block, line, xx, newalign, links);
+	  newalign   = strcasecmp(buf, "CENTER") ? LEFT : CENTER;
+          xx         = block->x;
+          block->h   += hh;
+
+          if (strcasecmp(buf, "UL") == 0 ||
+	      strcasecmp(buf, "OL") == 0 ||
+	      strcasecmp(buf, "DL") == 0)
+          {
+	    block->h += fsize + 2;
+	    xx       = margins.push(4 * fsize);
+	  }
+          else if (strcasecmp(buf, "TABLE") == 0)
+	  {
+	    if (get_attr(attrs, "BORDER", attr, sizeof(attr)))
+	      border = (uchar)atoi(attr);
+	    else
+	      border = 0;
+
+            tc = rc = get_color(get_attr(attrs, "BGCOLOR", attr, sizeof(attr)), bgcolor_);
+
+	    block->h += fsize + 2;
+
+            format_table(&table_width, columns, start);
+
+            if ((xx + table_width) > hsize_) {
+#ifdef DEBUG
+              printf("xx=%d, table_width=%d, hsize_=%d\n", xx, table_width,
+	             hsize_);
+#endif // DEBUG
+	      hsize_ = xx + table_width;
+	      done   = 0;
+	      break;
+	    }
+
+            switch (get_align(attrs, talign))
+	    {
+	      default :
+	          table_offset = 0;
+	          break;
+
+	      case CENTER :
+	          table_offset = (hsize_ - table_width) / 2 - textsize_;
+	          break;
+
+	      case RIGHT :
+	          table_offset = hsize_ - table_width - textsize_;
+	          break;
+	    }
+
+	    column = 0;
+	  }
+
+          if (tolower(buf[0]) == 'h' && isdigit(buf[1]))
+	  {
+	    font  = FL_HELVETICA_BOLD;
+	    fsize = (uchar)(textsize_ + '7' - buf[1]);
+	  }
+	  else if (strcasecmp(buf, "DT") == 0)
+	  {
+	    font  = (uchar)(textfont_ | FL_ITALIC);
+	    fsize = textsize_;
+	  }
+	  else if (strcasecmp(buf, "PRE") == 0)
+	  {
+	    font  = FL_COURIER;
+	    fsize = textsize_;
+	    pre   = 1;
+	  }
+	  else
+	  {
+	    font  = textfont_;
+	    fsize = textsize_;
+	  }
+
+	  pushfont(font, fsize);
+
+          yy = block->y + block->h;
+          hh = 0;
+
+          if ((tolower(buf[0]) == 'h' && isdigit(buf[1])) ||
+	      strcasecmp(buf, "DD") == 0 ||
+	      strcasecmp(buf, "DT") == 0 ||
+	      strcasecmp(buf, "P") == 0)
+            yy += fsize + 2;
+	  else if (strcasecmp(buf, "HR") == 0)
+	  {
+	    hh += 2 * fsize;
+	    yy += fsize;
+	  }
+
+          if (row)
+	    block = add_block(start, xx, yy, block->w, 0);
+	  else
+	    block = add_block(start, xx, yy, hsize_, 0);
+
+	  needspace = 0;
+	  line      = 0;
+
+	  if (strcasecmp(buf, "CENTER") == 0)
+	    newalign = talign = CENTER;
+	  else
+	    newalign = get_align(attrs, talign);
+	}
+	else if (strcasecmp(buf, "/CENTER") == 0 ||
+		 strcasecmp(buf, "/P") == 0 ||
+		 strcasecmp(buf, "/H1") == 0 ||
+		 strcasecmp(buf, "/H2") == 0 ||
+		 strcasecmp(buf, "/H3") == 0 ||
+		 strcasecmp(buf, "/H4") == 0 ||
+		 strcasecmp(buf, "/H5") == 0 ||
+		 strcasecmp(buf, "/H6") == 0 ||
+		 strcasecmp(buf, "/PRE") == 0 ||
+		 strcasecmp(buf, "/UL") == 0 ||
+		 strcasecmp(buf, "/OL") == 0 ||
+		 strcasecmp(buf, "/DL") == 0 ||
+		 strcasecmp(buf, "/TABLE") == 0)
+	{
+          line       = do_align(block, line, xx, newalign, links);
+          xx         = block->x;
+          block->end = ptr;
+
+          if (strcasecmp(buf, "/UL") == 0 ||
+	      strcasecmp(buf, "/OL") == 0 ||
+	      strcasecmp(buf, "/DL") == 0)
+	  {
+	    xx       = margins.pop();
+	    block->h += fsize + 2;
+	  }
+          else if (strcasecmp(buf, "/TABLE") == 0) 
+          {
+	    block->h += fsize + 2;
+            xx       = margins.current();
+          }
+	  else if (strcasecmp(buf, "/PRE") == 0)
+	  {
+	    pre = 0;
+	    hh  = 0;
+	  }
+	  else if (strcasecmp(buf, "/CENTER") == 0)
+	    talign = LEFT;
+
+          popfont(font, fsize);
+
+          while (isspace((*ptr)&255))
+	    ptr ++;
+
+          block->h += hh;
+          yy       += hh;
+
+          if (tolower(buf[2]) == 'l')
+            yy += fsize + 2;
+
+          if (row)
+	    block = add_block(ptr, xx, yy, block->w, 0);
+	  else
+	    block = add_block(ptr, xx, yy, hsize_, 0);
+
+	  needspace = 0;
+	  hh        = 0;
+	  line      = 0;
+	  newalign  = talign;
+	}
+	else if (strcasecmp(buf, "TR") == 0)
+	{
+          block->end = start;
+          line       = do_align(block, line, xx, newalign, links);
+          xx         = block->x;
+          block->h   += hh;
+
+          if (row)
+	  {
+            yy = blocks_[row].y + blocks_[row].h;
+
+	    for (cell = blocks_ + row + 1; cell <= block; cell ++)
+	      if ((cell->y + cell->h) > yy)
+		yy = cell->y + cell->h;
+
+            block = blocks_ + row;
+
+            block->h = yy - block->y + 2;
+
+	    for (i = 0; i < column; i ++)
+	      if (cells[i])
+	      {
+		cell = blocks_ + cells[i];
+		cell->h = block->h;
+	      }
+	  }
+
+          memset(cells, 0, sizeof(cells));
+
+	  yy        = block->y + block->h - 4;
+	  hh        = 0;
+          block     = add_block(start, xx, yy, hsize_, 0);
+	  row       = block - blocks_;
+	  needspace = 0;
+	  column    = 0;
+	  line      = 0;
+
+          rc = get_color(get_attr(attrs, "BGCOLOR", attr, sizeof(attr)), tc);
+	}
+	else if (strcasecmp(buf, "/TR") == 0 && row)
+	{
+          line       = do_align(block, line, xx, newalign, links);
+          block->end = start;
+	  block->h   += hh;
+	  talign     = LEFT;
+
+          xx = blocks_[row].x;
+          yy = blocks_[row].y + blocks_[row].h;
+
+	  for (cell = blocks_ + row + 1; cell <= block; cell ++)
+	    if ((cell->y + cell->h) > yy)
+	      yy = cell->y + cell->h;
+
+          block = blocks_ + row;
+
+          block->h = yy - block->y + 2;
+
+	  for (i = 0; i < column; i ++)
+	    if (cells[i])
+	    {
+	      cell = blocks_ + cells[i];
+	      cell->h = block->h;
+	    }
+
+	  yy        = block->y + block->h /*- 4*/;
+          block     = add_block(start, xx, yy, hsize_, 0);
+	  needspace = 0;
+	  row       = 0;
+	  line      = 0;
+	}
+	else if ((strcasecmp(buf, "TD") == 0 ||
+                  strcasecmp(buf, "TH") == 0) && row)
+	{
+          int	colspan;		// COLSPAN attribute
+
+
+          line       = do_align(block, line, xx, newalign, links);
+          block->end = start;
+	  block->h   += hh;
+
+          if (strcasecmp(buf, "TH") == 0)
+	    font = (uchar)(textfont_ | FL_BOLD);
+	  else
+	    font = textfont_;
+
+          fsize = textsize_;
+
+          xx = blocks_[row].x + fsize + 3 + table_offset;
+	  for (i = 0; i < column; i ++)
+	    xx += columns[i] + 6;
+
+          margins.push(xx - margins.current());
+
+          if (get_attr(attrs, "COLSPAN", attr, sizeof(attr)) != NULL)
+	    colspan = atoi(attr);
+	  else
+	    colspan = 1;
+
+          for (i = 0, ww = -6; i < colspan; i ++)
+	    ww += columns[column + i] + 6;
+
+          if (block->end == block->start && nblocks_ > 1)
+	  {
+	    nblocks_ --;
+	    block --;
+	  }
+
+	  pushfont(font, fsize);
+
+	  yy        = blocks_[row].y;
+	  hh        = 0;
+          block     = add_block(start, xx, yy, xx + ww, 0, border);
+	  needspace = 0;
+	  line      = 0;
+	  newalign  = get_align(attrs, tolower(buf[1]) == 'h' ? CENTER : LEFT);
+	  talign    = newalign;
+
+          cells[column] = block - blocks_;
+
+	  column += colspan;
+
+          block->bgcolor = get_color(get_attr(attrs, "BGCOLOR", attr,
+	                                      sizeof(attr)), rc);
+	}
+	else if ((strcasecmp(buf, "/TD") == 0 ||
+                  strcasecmp(buf, "/TH") == 0) && row)
+	{
+          line = do_align(block, line, xx, newalign, links);
+          popfont(font, fsize);
+	  xx = margins.pop();
+	  talign = LEFT;
+	}
+	else if (strcasecmp(buf, "FONT") == 0)
+	{
+          if (get_attr(attrs, "FACE", attr, sizeof(attr)) != NULL) {
+	    if (!strncasecmp(attr, "helvetica", 9) ||
+	        !strncasecmp(attr, "arial", 5) ||
+		!strncasecmp(attr, "sans", 4)) font = FL_HELVETICA;
+            else if (!strncasecmp(attr, "times", 5) ||
+	             !strncasecmp(attr, "serif", 5)) font = FL_TIMES;
+            else if (!strncasecmp(attr, "symbol", 6)) font = FL_SYMBOL;
+	    else font = FL_COURIER;
+          }
+
+          if (get_attr(attrs, "SIZE", attr, sizeof(attr)) != NULL) {
+            if (isdigit(attr[0] & 255)) {
+	      // Absolute size
+	      fsize = (int)(textsize_ * pow(1.2, atoi(attr) - 3.0));
+	    } else {
+	      // Relative size
+	      fsize = (int)(fsize * pow(1.2, atoi(attr)));
+	    }
+	  }
+
+          pushfont(font, fsize);
+	}
+	else if (strcasecmp(buf, "/FONT") == 0)
+	  popfont(font, fsize);
+	else if (strcasecmp(buf, "B") == 0 ||
+        	 strcasecmp(buf, "STRONG") == 0)
+	  pushfont(font |= FL_BOLD, fsize);
+	else if (strcasecmp(buf, "I") == 0 ||
+        	 strcasecmp(buf, "EM") == 0)
+	  pushfont(font |= FL_ITALIC, fsize);
+	else if (strcasecmp(buf, "CODE") == 0 ||
+	         strcasecmp(buf, "TT") == 0)
+	  pushfont(font = FL_COURIER, fsize);
+	else if (strcasecmp(buf, "KBD") == 0)
+	  pushfont(font = FL_COURIER_BOLD, fsize);
+	else if (strcasecmp(buf, "VAR") == 0)
+	  pushfont(font = FL_COURIER_ITALIC, fsize);
+	else if (strcasecmp(buf, "/B") == 0 ||
+		 strcasecmp(buf, "/STRONG") == 0 ||
+		 strcasecmp(buf, "/I") == 0 ||
+		 strcasecmp(buf, "/EM") == 0 ||
+		 strcasecmp(buf, "/CODE") == 0 ||
+		 strcasecmp(buf, "/TT") == 0 ||
+		 strcasecmp(buf, "/KBD") == 0 ||
+		 strcasecmp(buf, "/VAR") == 0)
+	  popfont(font, fsize);
+	else if (strcasecmp(buf, "IMG") == 0)
+	{
+	  Fl_Shared_Image	*img = 0;
+	  int		width;
+	  int		height;
+
+
+          get_attr(attrs, "WIDTH", wattr, sizeof(wattr));
+          get_attr(attrs, "HEIGHT", hattr, sizeof(hattr));
+	  width  = get_length(wattr);
+	  height = get_length(hattr);
+
+	  if (get_attr(attrs, "SRC", attr, sizeof(attr))) {
+	    img    = get_image(attr, width, height);
+	    width  = img->w();
+	    height = img->h();
+	  }
+
+	  ww = width;
+
+          if (ww > hsize_) {
+	    hsize_ = ww;
+	    done   = 0;
+	    break;
+	  }
+
+	  if (needspace && xx > block->x)
+	    ww += (int)fl_width(' ');
+
+	  if ((xx + ww) > block->w)
+	  {
+	    line     = do_align(block, line, xx, newalign, links);
+	    xx       = block->x;
+	    yy       += hh;
+	    block->h += hh;
+	    hh       = 0;
+	  }
+
+	  if (linkdest[0])
+	    add_link(linkdest, xx, yy - height, ww, height);
+
+	  xx += ww;
+	  if ((height + 2) > hh)
+	    hh = height + 2;
+
+	  needspace = 0;
+	}
+      }
+      else if (*ptr == '\n' && pre)
+      {
+	if (linkdest[0])
+	  add_link(linkdest, xx, yy - hh, ww, hh);
+
+        if (xx > hsize_) {
+	  hsize_ = xx;
+          done   = 0;
+	  break;
+	}
+
+	line      = do_align(block, line, xx, newalign, links);
+	xx        = block->x;
+	yy        += hh;
+	block->h  += hh;
+	needspace = 0;
+	ptr ++;
+      }
+      else if (isspace((*ptr)&255))
+      {
+	needspace = 1;
+
+	ptr ++;
+      }
+      else if (*ptr == '&' && s < (buf + sizeof(buf) - 1))
+      {
+	ptr ++;
+
+        int qch = quote_char(ptr);
+
+	if (qch < 0)
+	  *s++ = '&';
+	else {
+	  *s++ = qch;
+	  ptr = strchr(ptr, ';') + 1;
+	}
+
+	if ((fsize + 2) > hh)
+          hh = fsize + 2;
+      }
+      else
+      {
+	if (s < (buf + sizeof(buf) - 1))
+          *s++ = *ptr++;
+	else
+          ptr ++;
+
+	if ((fsize + 2) > hh)
+          hh = fsize + 2;
+      }
+    }
+
+    if (s > buf && !head)
+    {
+      *s = '\0';
+      ww = (int)fl_width(buf);
+
+  //    printf("line = %d, xx = %d, ww = %d, block->x = %d, block->w = %d\n",
+  //	   line, xx, ww, block->x, block->w);
+
+      if (ww > hsize_) {
+	hsize_ = ww;
+	done   = 0;
+	break;
+      }
+
+      if (needspace && xx > block->x)
+	ww += (int)fl_width(' ');
+
+      if ((xx + ww) > block->w)
+      {
+	line     = do_align(block, line, xx, newalign, links);
+	xx       = block->x;
+	yy       += hh;
+	block->h += hh;
+	hh       = 0;
+      }
+
+      if (linkdest[0])
+	add_link(linkdest, xx, yy - fsize, ww, fsize);
+
+      xx += ww;
+    }
+
+    do_align(block, line, xx, newalign, links);
+
+    block->end = ptr;
+    size_      = yy + hh;
+  }
+
+//  printf("margins.depth_=%d\n", margins.depth_);
+
+  if (ntargets_ > 1)
+    qsort(targets_, ntargets_, sizeof(Fl_Help_Target),
+          (compare_func_t)compare_targets);
+
+  int dx = Fl::box_dw(b) - Fl::box_dx(b);
+  int dy = Fl::box_dh(b) - Fl::box_dy(b);
+  int ss = Fl::scrollbar_size();
+  int dw = Fl::box_dw(b) + ss;
+  int dh = Fl::box_dh(b);
+
+  if (hsize_ > (w() - dw)) {
+    hscrollbar_.show();
+
+    dh += ss;
+
+    if (size_ < (h() - dh)) {
+      scrollbar_.hide();
+      hscrollbar_.resize(x() + Fl::box_dx(b), y() + h() - ss - dy,
+                         w() - Fl::box_dw(b), ss);
+    } else {
+      scrollbar_.show();
+      scrollbar_.resize(x() + w() - ss - dx, y() + Fl::box_dy(b),
+                        ss, h() - ss - Fl::box_dh(b));
+      hscrollbar_.resize(x() + Fl::box_dx(b), y() + h() - ss - dy,
+                         w() - ss - Fl::box_dw(b), ss);
+    }
+  } else {
+    hscrollbar_.hide();
+
+    if (size_ < (h() - dh)) scrollbar_.hide();
+    else {
+      scrollbar_.resize(x() + w() - ss - dx, y() + Fl::box_dy(b),
+                        ss, h() - Fl::box_dh(b));
+      scrollbar_.show();
+    }
+  }
+
+  // Reset scrolling if it needs to be...
+  if (scrollbar_.visible()) {
+    int temph = h() - Fl::box_dh(b);
+    if (hscrollbar_.visible()) temph -= ss;
+    if ((topline_ + temph) > size_) topline(size_ - temph);
+    else topline(topline_);
+  } else topline(0);
+
+  if (hscrollbar_.visible()) {
+    int tempw = w() - ss - Fl::box_dw(b);
+    if ((leftline_ + tempw) > hsize_) leftline(hsize_ - tempw);
+    else leftline(leftline_);
+  } else leftline(0);
+}
+
+
+//
+// 'Fl_Help_View::format_table()' - Format a table...
+//
+
+void
+Fl_Help_View::format_table(int        *table_width,	// O - Total table width
+                           int        *columns,		// O - Column widths
+	                   const char *table)		// I - Pointer to start of table
+{
+  int		column,					// Current column
+		num_columns,				// Number of columns
+		colspan,				// COLSPAN attribute
+		width,					// Current width
+		temp_width,				// Temporary width
+		max_width,				// Maximum width
+		incell,					// In a table cell?
+		pre,					// 
 text?
+		needspace;				// Need whitespace?
+  char		*s,					// Pointer into buffer
+		buf[1024],				// Text buffer
+		attr[1024],				// Other attribute
+		wattr[1024],				// WIDTH attribute
+		hattr[1024];				// HEIGHT attribute
+  const char	*ptr,					// Pointer into table
+		*attrs,					// Pointer to attributes
+		*start;					// Start of element
+  int		minwidths[MAX_COLUMNS];			// Minimum widths for each column
+  unsigned char	font, fsize;				// Current font and size
+
+
+  // Clear widths...
+  *table_width = 0;
+  for (column = 0; column < MAX_COLUMNS; column ++)
+  {
+    columns[column]   = 0;
+    minwidths[column] = 0;
+  }
+
+  num_columns = 0;
+  colspan     = 0;
+  max_width   = 0;
+  pre         = 0;
+  needspace   = 0;
+  font        = fonts_[nfonts_][0];
+  fsize       = fonts_[nfonts_][1];
+
+  // Scan the table...
+  for (ptr = table, column = -1, width = 0, s = buf, incell = 0; *ptr;)
+  {
+    if ((*ptr == '<' || isspace((*ptr)&255)) && s > buf && incell)
+    {
+      // Check width...
+      if (needspace)
+      {
+        *s++      = ' ';
+	needspace = 0;
+      }
+
+      *s         = '\0';
+      temp_width = (int)fl_width(buf);
+      s          = buf;
+
+      if (temp_width > minwidths[column])
+        minwidths[column] = temp_width;
+
+      width += temp_width;
+
+      if (width > max_width)
+        max_width = width;
+    }
+
+    if (*ptr == '<')
+    {
+      start = ptr;
+
+      for (s = buf, ptr ++; *ptr && *ptr != '>' && !isspace((*ptr)&255);)
+        if (s < (buf + sizeof(buf) - 1))
+          *s++ = *ptr++;
+	else
+	  ptr ++;
+
+      *s = '\0';
+      s = buf;
+
+      attrs = ptr;
+      while (*ptr && *ptr != '>')
+        ptr ++;
+
+      if (*ptr == '>')
+        ptr ++;
+
+      if (strcasecmp(buf, "BR") == 0 ||
+	  strcasecmp(buf, "HR") == 0)
+      {
+        width     = 0;
+	needspace = 0;
+      }
+      else if (strcasecmp(buf, "TABLE") == 0 && start > table)
+        break;
+      else if (strcasecmp(buf, "CENTER") == 0 ||
+               strcasecmp(buf, "P") == 0 ||
+               strcasecmp(buf, "H1") == 0 ||
+	       strcasecmp(buf, "H2") == 0 ||
+	       strcasecmp(buf, "H3") == 0 ||
+	       strcasecmp(buf, "H4") == 0 ||
+	       strcasecmp(buf, "H5") == 0 ||
+	       strcasecmp(buf, "H6") == 0 ||
+	       strcasecmp(buf, "UL") == 0 ||
+	       strcasecmp(buf, "OL") == 0 ||
+	       strcasecmp(buf, "DL") == 0 ||
+	       strcasecmp(buf, "LI") == 0 ||
+	       strcasecmp(buf, "DD") == 0 ||
+	       strcasecmp(buf, "DT") == 0 ||
+	       strcasecmp(buf, "PRE") == 0)
+      {
+        width     = 0;
+	needspace = 0;
+
+        if (tolower(buf[0]) == 'h' && isdigit(buf[1]))
+	{
+	  font  = FL_HELVETICA_BOLD;
+	  fsize = (uchar)(textsize_ + '7' - buf[1]);
+	}
+	else if (strcasecmp(buf, "DT") == 0)
+	{
+	  font  = (uchar)(textfont_ | FL_ITALIC);
+	  fsize = textsize_;
+	}
+	else if (strcasecmp(buf, "PRE") == 0)
+	{
+	  font  = FL_COURIER;
+	  fsize = textsize_;
+	  pre   = 1;
+	}
+	else if (strcasecmp(buf, "LI") == 0)
+	{
+	  width  += 4 * fsize;
+	  font   = textfont_;
+	  fsize  = textsize_;
+	}
+	else
+	{
+	  font  = textfont_;
+	  fsize = textsize_;
+	}
+
+	pushfont(font, fsize);
+      }
+      else if (strcasecmp(buf, "/CENTER") == 0 ||
+	       strcasecmp(buf, "/P") == 0 ||
+	       strcasecmp(buf, "/H1") == 0 ||
+	       strcasecmp(buf, "/H2") == 0 ||
+	       strcasecmp(buf, "/H3") == 0 ||
+	       strcasecmp(buf, "/H4") == 0 ||
+	       strcasecmp(buf, "/H5") == 0 ||
+	       strcasecmp(buf, "/H6") == 0 ||
+	       strcasecmp(buf, "/PRE") == 0 ||
+	       strcasecmp(buf, "/UL") == 0 ||
+	       strcasecmp(buf, "/OL") == 0 ||
+	       strcasecmp(buf, "/DL") == 0)
+      {
+        width     = 0;
+	needspace = 0;
+
+        popfont(font, fsize);
+      }
+      else if (strcasecmp(buf, "TR") == 0 || strcasecmp(buf, "/TR") == 0 ||
+               strcasecmp(buf, "/TABLE") == 0)
+      {
+//        printf("%s column = %d, colspan = %d, num_columns = %d\n",
+//	       buf, column, colspan, num_columns);
+
+        if (column >= 0)
+	{
+	  // This is a hack to support COLSPAN...
+	  max_width /= colspan;
+
+	  while (colspan > 0)
+	  {
+	    if (max_width > columns[column])
+	      columns[column] = max_width;
+
+	    column ++;
+	    colspan --;
+	  }
+	}
+
+	if (strcasecmp(buf, "/TABLE") == 0)
+	  break;
+
+	needspace = 0;
+	column    = -1;
+	width     = 0;
+	max_width = 0;
+	incell    = 0;
+      }
+      else if (strcasecmp(buf, "TD") == 0 ||
+               strcasecmp(buf, "TH") == 0)
+      {
+//        printf("BEFORE column = %d, colspan = %d, num_columns = %d\n",
+//	       column, colspan, num_columns);
+
+        if (column >= 0)
+	{
+	  // This is a hack to support COLSPAN...
+	  max_width /= colspan;
+
+	  while (colspan > 0)
+	  {
+	    if (max_width > columns[column])
+	      columns[column] = max_width;
+
+	    column ++;
+	    colspan --;
+	  }
+	}
+	else
+	  column ++;
+
+        if (get_attr(attrs, "COLSPAN", attr, sizeof(attr)) != NULL)
+	  colspan = atoi(attr);
+	else
+	  colspan = 1;
+
+//        printf("AFTER column = %d, colspan = %d, num_columns = %d\n",
+//	       column, colspan, num_columns);
+
+        if ((column + colspan) >= num_columns)
+	  num_columns = column + colspan;
+
+	needspace = 0;
+	width     = 0;
+	incell    = 1;
+
+        if (strcasecmp(buf, "TH") == 0)
+	  font = (uchar)(textfont_ | FL_BOLD);
+	else
+	  font = textfont_;
+
+        fsize = textsize_;
+
+	pushfont(font, fsize);
+
+        if (get_attr(attrs, "WIDTH", attr, sizeof(attr)) != NULL)
+	  max_width = get_length(attr);
+	else
+	  max_width = 0;
+
+//        printf("max_width = %d\n", max_width);
+      }
+      else if (strcasecmp(buf, "/TD") == 0 ||
+               strcasecmp(buf, "/TH") == 0)
+      {
+	incell = 0;
+        popfont(font, fsize);
+      }
+      else if (strcasecmp(buf, "B") == 0 ||
+               strcasecmp(buf, "STRONG") == 0)
+	pushfont(font |= FL_BOLD, fsize);
+      else if (strcasecmp(buf, "I") == 0 ||
+               strcasecmp(buf, "EM") == 0)
+	pushfont(font |= FL_ITALIC, fsize);
+      else if (strcasecmp(buf, "CODE") == 0 ||
+               strcasecmp(buf, "TT") == 0)
+	pushfont(font = FL_COURIER, fsize);
+      else if (strcasecmp(buf, "KBD") == 0)
+	pushfont(font = FL_COURIER_BOLD, fsize);
+      else if (strcasecmp(buf, "VAR") == 0)
+	pushfont(font = FL_COURIER_ITALIC, fsize);
+      else if (strcasecmp(buf, "/B") == 0 ||
+	       strcasecmp(buf, "/STRONG") == 0 ||
+	       strcasecmp(buf, "/I") == 0 ||
+	       strcasecmp(buf, "/EM") == 0 ||
+	       strcasecmp(buf, "/CODE") == 0 ||
+	       strcasecmp(buf, "/TT") == 0 ||
+	       strcasecmp(buf, "/KBD") == 0 ||
+	       strcasecmp(buf, "/VAR") == 0)
+	popfont(font, fsize);
+      else if (strcasecmp(buf, "IMG") == 0 && incell)
+      {
+	Fl_Shared_Image	*img = 0;
+	int		iwidth, iheight;
+
+
+        get_attr(attrs, "WIDTH", wattr, sizeof(wattr));
+        get_attr(attrs, "HEIGHT", hattr, sizeof(hattr));
+	iwidth  = get_length(wattr);
+	iheight = get_length(hattr);
+
+        if (get_attr(attrs, "SRC", attr, sizeof(attr))) {
+	  img     = get_image(attr, iwidth, iheight);
+	  iwidth  = img->w();
+	  iheight = img->h();
+	}
+
+	if (iwidth > minwidths[column])
+          minwidths[column] = iwidth;
+
+        width += iwidth;
+	if (needspace)
+	  width += (int)fl_width(' ');
+
+	if (width > max_width)
+          max_width = width;
+
+	needspace = 0;
+      }
+    }
+    else if (*ptr == '\n' && pre)
+    {
+      width     = 0;
+      needspace = 0;
+      ptr ++;
+    }
+    else if (isspace((*ptr)&255))
+    {
+      needspace = 1;
+
+      ptr ++;
+    }
+    else if (*ptr == '&' && s < (buf + sizeof(buf) - 1))
+    {
+      ptr ++;
+
+      int qch = quote_char(ptr);
+
+      if (qch < 0)
+	*s++ = '&';
+      else {
+	*s++ = qch;
+	ptr = strchr(ptr, ';') + 1;
+      }
+    }
+    else
+    {
+      if (s < (buf + sizeof(buf) - 1))
+        *s++ = *ptr++;
+      else
+        ptr ++;
+    }
+  }
+
+  // Now that we have scanned the entire table, adjust the table and
+  // cell widths to fit on the screen...
+  if (get_attr(table + 6, "WIDTH", attr, sizeof(attr)))
+    *table_width = get_length(attr);
+  else
+    *table_width = 0;
+
+#ifdef DEBUG
+  printf("num_columns = %d, table_width = %d\n", num_columns, *table_width);
+#endif // DEBUG
+
+  if (num_columns == 0)
+    return;
+
+  // Add up the widths...
+  for (column = 0, width = 0; column < num_columns; column ++)
+    width += columns[column];
+
+#ifdef DEBUG
+  printf("width = %d, w() = %d\n", width, w());
+  for (column = 0; column < num_columns; column ++)
+    printf("    columns[%d] = %d, minwidths[%d] = %d\n", column, columns[column],
+           column, minwidths[column]);
+#endif // DEBUG
+
+  // Adjust the width if needed...
+  int scale_width = *table_width;
+
+  if (scale_width == 0) {
+    if (width > (hsize_ - Fl::scrollbar_size())) scale_width = hsize_ - Fl::scrollbar_size();
+    else scale_width = width;
+  }
+
+  if (width < scale_width) {
+#ifdef DEBUG
+    printf("Scaling table up to %d from %d...\n", scale_width, width);
+#endif // DEBUG
+
+    *table_width = 0;
+
+    scale_width = (scale_width - width) / num_columns;
+
+#ifdef DEBUG
+    printf("adjusted scale_width = %d\n", scale_width);
+#endif // DEBUG
+
+    for (column = 0; column < num_columns; column ++) {
+      columns[column] += scale_width;
+
+      (*table_width) += columns[column];
+    }
+  }
+  else if (width > scale_width) {
+#ifdef DEBUG
+    printf("Scaling table down to %d from %d...\n", scale_width, width);
+#endif // DEBUG
+
+    for (column = 0; column < num_columns; column ++) {
+      width       -= minwidths[column];
+      scale_width -= minwidths[column];
+    }
+
+#ifdef DEBUG
+    printf("adjusted width = %d, scale_width = %d\n", width, scale_width);
+#endif // DEBUG
+
+    if (width > 0) {
+      for (column = 0; column < num_columns; column ++) {
+	columns[column] -= minwidths[column];
+	columns[column] = scale_width * columns[column] / width;
+	columns[column] += minwidths[column];
+      }
+    }
+
+    *table_width = 0;
+    for (column = 0; column < num_columns; column ++) {
+      (*table_width) += columns[column];
+    }
+  }
+  else if (*table_width == 0)
+    *table_width = width;
+
+#ifdef DEBUG
+  printf("FINAL table_width = %d\n", *table_width);
+  for (column = 0; column < num_columns; column ++)
+    printf("    columns[%d] = %d\n", column, columns[column]);
+#endif // DEBUG
+}
+
+
+//
+// 'Fl_Help_View::free_data()' - Free memory used for the document.
+//
+
+void
+Fl_Help_View::free_data() {
+  // Release all images...
+  if (value_) {
+    const char	*ptr,		// Pointer into block
+		*attrs;		// Pointer to start of element attributes
+    char	*s,		// Pointer into buffer
+		buf[1024],	// Text buffer
+		attr[1024],	// Attribute buffer
+		wattr[1024],	// Width attribute buffer
+		hattr[1024];	// Height attribute buffer
+
+    for (ptr = value_; *ptr;)
+    {
+      if (*ptr == '<')
+      {
+	ptr ++;
+
+        if (strncmp(ptr, "!--", 3) == 0)
+	{
+	  // Comment...
+	  ptr += 3;
+	  if ((ptr = strstr(ptr, "-->")) != NULL)
+	  {
+	    ptr += 3;
+	    continue;
+	  }
+	  else
+	    break;
+	}
+
+        s = buf;
+
+	while (*ptr && *ptr != '>' && !isspace((*ptr)&255))
+          if (s < (buf + sizeof(buf) - 1))
+            *s++ = *ptr++;
+	  else
+	    ptr ++;
+
+	*s = '\0';
+
+	attrs = ptr;
+	while (*ptr && *ptr != '>')
+          ptr ++;
+
+	if (*ptr == '>')
+          ptr ++;
+
+	if (strcasecmp(buf, "IMG") == 0)
+	{
+	  Fl_Shared_Image	*img;
+	  int		width;
+	  int		height;
+
+          get_attr(attrs, "WIDTH", wattr, sizeof(wattr));
+          get_attr(attrs, "HEIGHT", hattr, sizeof(hattr));
+	  width  = get_length(wattr);
+	  height = get_length(hattr);
+
+	  if (get_attr(attrs, "SRC", attr, sizeof(attr))) {
+	    // Get and release the image to free it from memory...
+	    img = get_image(attr, width, height);
+	    if ((void*)img != &broken_image) {
+	      img->release();
+	    }
+	  }
+	}
+      }
+      else
+        ptr ++;
+    }
+
+    free((void *)value_);
+    value_ = 0;
+  }
+
+  // Free all of the arrays...
+  if (nblocks_) {
+    free(blocks_);
+
+    ablocks_ = 0;
+    nblocks_ = 0;
+    blocks_  = 0;
+  }
+
+  if (nlinks_) {
+    free(links_);
+
+    alinks_ = 0;
+    nlinks_ = 0;
+    links_  = 0;
+  }
+
+  if (ntargets_) {
+    free(targets_);
+
+    atargets_ = 0;
+    ntargets_ = 0;
+    targets_  = 0;
+  }
+}
+
+//
+// 'Fl_Help_View::get_align()' - Get an alignment attribute.
+//
+
+int					// O - Alignment
+Fl_Help_View::get_align(const char *p,	// I - Pointer to start of attrs
+                        int        a)	// I - Default alignment
+{
+  char	buf[255];			// Alignment value
+
+
+  if (get_attr(p, "ALIGN", buf, sizeof(buf)) == NULL)
+    return (a);
+
+  if (strcasecmp(buf, "CENTER") == 0)
+    return (CENTER);
+  else if (strcasecmp(buf, "RIGHT") == 0)
+    return (RIGHT);
+  else
+    return (LEFT);
+}
+
+
+//
+// 'Fl_Help_View::get_attr()' - Get an attribute value from the string.
+//
+
+const char *					// O - Pointer to buf or NULL
+Fl_Help_View::get_attr(const char *p,		// I - Pointer to start of attributes
+                      const char *n,		// I - Name of attribute
+		      char       *buf,		// O - Buffer for attribute value
+		      int        bufsize)	// I - Size of buffer
+{
+  char	name[255],				// Name from string
+	*ptr,					// Pointer into name or value
+	quote;					// Quote
+
+
+  buf[0] = '\0';
+
+  while (*p && *p != '>')
+  {
+    while (isspace((*p)&255))
+      p ++;
+
+    if (*p == '>' || !*p)
+      return (NULL);
+
+    for (ptr = name; *p && !isspace((*p)&255) && *p != '=' && *p != '>';)
+      if (ptr < (name + sizeof(name) - 1))
+        *ptr++ = *p++;
+      else
+        p ++;
+
+    *ptr = '\0';
+
+    if (isspace((*p)&255) || !*p || *p == '>')
+      buf[0] = '\0';
+    else
+    {
+      if (*p == '=')
+        p ++;
+
+      for (ptr = buf; *p && !isspace((*p)&255) && *p != '>';)
+        if (*p == '\'' || *p == '\"')
+	{
+	  quote = *p++;
+
+	  while (*p && *p != quote)
+	    if ((ptr - buf + 1) < bufsize)
+	      *ptr++ = *p++;
+	    else
+	      p ++;
+
+          if (*p == quote)
+	    p ++;
+	}
+	else if ((ptr - buf + 1) < bufsize)
+	  *ptr++ = *p++;
+	else
+	  p ++;
+
+      *ptr = '\0';
+    }
+
+    if (strcasecmp(n, name) == 0)
+      return (buf);
+    else
+      buf[0] = '\0';
+
+    if (*p == '>')
+      return (NULL);
+  }
+
+  return (NULL);
+}
+
+
+//
+// 'Fl_Help_View::get_color()' - Get a color attribute.
+//
+
+Fl_Color				// O - Color value
+Fl_Help_View::get_color(const char *n,	// I - Color name
+                        Fl_Color   c)	// I - Default color value
+{
+  int	i;				// Looping var
+  int	rgb, r, g, b;			// RGB values
+  static const struct {			// Color name table
+    const char *name;
+    int r, g, b;
+  }	colors[] = {
+    { "black",		0x00, 0x00, 0x00 },
+    { "red",		0xff, 0x00, 0x00 },
+    { "green",		0x00, 0x80, 0x00 },
+    { "yellow",		0xff, 0xff, 0x00 },
+    { "blue",		0x00, 0x00, 0xff },
+    { "magenta",	0xff, 0x00, 0xff },
+    { "fuchsia",	0xff, 0x00, 0xff },
+    { "cyan",		0x00, 0xff, 0xff },
+    { "aqua",		0x00, 0xff, 0xff },
+    { "white",		0xff, 0xff, 0xff },
+    { "gray",		0x80, 0x80, 0x80 },
+    { "grey",		0x80, 0x80, 0x80 },
+    { "lime",		0x00, 0xff, 0x00 },
+    { "maroon",		0x80, 0x00, 0x00 },
+    { "navy",		0x00, 0x00, 0x80 },
+    { "olive",		0x80, 0x80, 0x00 },
+    { "purple",		0x80, 0x00, 0x80 },
+    { "silver",		0xc0, 0xc0, 0xc0 },
+    { "teal",		0x00, 0x80, 0x80 }
+  };
+
+
+  if (!n || !n[0]) return c;
+
+  if (n[0] == '#') {
+    // Do hex color lookup
+    rgb = strtol(n + 1, NULL, 16);
+
+    if (strlen(n) > 4) {
+      r = rgb >> 16;
+      g = (rgb >> 8) & 255;
+      b = rgb & 255;
+    } else {
+      r = (rgb >> 8) * 17;
+      g = ((rgb >> 4) & 15) * 17;
+      b = (rgb & 15) * 17;
+    }
+    return (fl_rgb_color((uchar)r, (uchar)g, (uchar)b));
+  } else {
+    for (i = 0; i < (int)(sizeof(colors) / sizeof(colors[0])); i ++)
+      if (!strcasecmp(n, colors[i].name)) {
+        return fl_rgb_color(colors[i].r, colors[i].g, colors[i].b);
+      }
+    return c;
+  }
+}
+
+
+//
+// 'Fl_Help_View::get_image()' - Get an inline image.
+//
+
+/** Gets an inline image.
+
+  The image reference count is maintained accordingly, such that
+  the image can be released exactly once when the document is closed.
+
+  \return a pointer to a cached Fl_Shared_Image, if the image can be loaded,
+  	  otherwise a pointer to an internal Fl_Pixmap (broken_image).
+
+  \todo Fl_Help_View::get_image() returns a pointer to the internal
+  Fl_Pixmap broken_image, but this is _not_ compatible with the
+  return type Fl_Shared_Image (release() must not be called).
+*/
+
+/* Implementation note: (A.S. Apr 05, 2009)
+
+  Fl_Help_View::get_image() uses a static global flag (initial_load)
+  to determine, if it is called from the initial loading of a document
+  (load() or value()), or from resize() or draw().
+
+  A better solution would be to manage all loaded images in an own
+  structure like Fl_Help_Target (Fl_Help_Image ?) to avoid using this
+  global flag, but this would break the ABI !
+
+  This should be fixed in FLTK 1.3 !
+
+
+  If initial_load is true, then Fl_Shared_Image::get() is called to
+  load the image, and the reference count of the shared image is
+  increased by one.
+
+  If initial_load is false, then Fl_Shared_Image::find() is called to
+  load the image, and the image is released immediately. This avoids
+  increasing the reference count when calling get_image() from draw()
+  or resize().
+
+  Calling Fl_Shared_Image::find() instead of Fl_Shared_Image::get() avoids
+  doing unnecessary i/o for "broken images" within each resize/redraw.
+
+  Each image must be released exactly once in the destructor or before
+  a new document is loaded: see free_data().
+*/
+
+Fl_Shared_Image *
+Fl_Help_View::get_image(const char *name, int W, int H) {
+  const char	*localname;		// Local filename
+  char		dir[1024];		// Current directory
+  char		temp[1024],		// Temporary filename
+		*tempptr;		// Pointer into temporary name
+  Fl_Shared_Image *ip;			// Image pointer...
+
+  // See if the image can be found...
+  if (strchr(directory_, ':') != NULL && strchr(name, ':') == NULL) {
+    if (name[0] == '/') {
+      strlcpy(temp, directory_, sizeof(temp));
+
+      if ((tempptr = strrchr(strchr(directory_, ':') + 3, '/')) != NULL) {
+        strlcpy(tempptr, name, sizeof(temp) - (tempptr - temp));
+      } else {
+        strlcat(temp, name, sizeof(temp));
+      }
+    } else {
+      snprintf(temp, sizeof(temp), "%s/%s", directory_, name);
+    }
+
+    if (link_) localname = (*link_)(this, temp);
+    else localname = temp;
+  } else if (name[0] != '/' && strchr(name, ':') == NULL) {
+    if (directory_[0]) snprintf(temp, sizeof(temp), "%s/%s", directory_, name);
+    else {
+      getcwd(dir, sizeof(dir));
+      snprintf(temp, sizeof(temp), "file:%s/%s", dir, name);
+    }
+
+    if (link_) localname = (*link_)(this, temp);
+    else localname = temp;
+  } else if (link_) localname = (*link_)(this, name);
+  else localname = name;
+
+  if (!localname) return 0;
+
+  if (strncmp(localname, "file:", 5) == 0) localname += 5;
+
+  if (initial_load) {
+    if ((ip = Fl_Shared_Image::get(localname, W, H)) == NULL) {
+      ip = (Fl_Shared_Image *)&broken_image;
+    }
+  } else { // draw or resize
+    if ((ip = Fl_Shared_Image::find(localname, W, H)) == NULL) {
+      ip = (Fl_Shared_Image *)&broken_image;
+    } else {
+      ip->release();
+    }
+  }
+
+  return ip;
+}
+
+
+//
+// 'Fl_Help_View::get_length()' - Get a length value, either absolute or %.
+//
+
+int
+Fl_Help_View::get_length(const char *l) {	// I - Value
+  int	val;					// Integer value
+
+  if (!l[0]) return 0;
+
+  val = atoi(l);
+  if (l[strlen(l) - 1] == '%') {
+    if (val > 100) val = 100;
+    else if (val < 0) val = 0;
+
+    val = val * (hsize_ - Fl::scrollbar_size()) / 100;
+  }
+
+  return val;
+}
+
+
+Fl_Help_Link *Fl_Help_View::find_link(int xx, int yy)
+{
+  int		i;
+  Fl_Help_Link	*linkp;
+  for (i = nlinks_, linkp = links_; i > 0; i --, linkp ++) {
+    if (xx >= linkp->x && xx < linkp->w &&
+        yy >= linkp->y && yy < linkp->h)
+      break;
+  }
+  return i ? linkp : 0L;
+}
+
+void Fl_Help_View::follow_link(Fl_Help_Link *linkp)
+{
+  char		target[32];	// Current target
+
+  clear_selection();
+
+  strlcpy(target, linkp->name, sizeof(target));
+
+  set_changed();
+
+  if (strcmp(linkp->filename, filename_) != 0 && linkp->filename[0])
+  {
+    char	dir[1024];	// Current directory
+    char	temp[1024],	// Temporary filename
+	      *tempptr;	// Pointer into temporary filename
+
+
+    if (strchr(directory_, ':') != NULL &&
+        strchr(linkp->filename, ':') == NULL)
+    {
+      if (linkp->filename[0] == '/')
+      {
+        strlcpy(temp, directory_, sizeof(temp));
+        if ((tempptr = strrchr(strchr(directory_, ':') + 3, '/')) != NULL)
+	  strlcpy(tempptr, linkp->filename, sizeof(temp));
+	else
+	  strlcat(temp, linkp->filename, sizeof(temp));
+      }
+      else
+	snprintf(temp, sizeof(temp), "%s/%s", directory_, linkp->filename);
+    }
+    else if (linkp->filename[0] != '/' && strchr(linkp->filename, ':') == NULL)
+    {
+      if (directory_[0])
+	snprintf(temp, sizeof(temp), "%s/%s", directory_, linkp->filename);
+      else
+      {
+	getcwd(dir, sizeof(dir));
+	snprintf(temp, sizeof(temp), "file:%s/%s", dir, linkp->filename);
+      }
+    }
+    else
+      strlcpy(temp, linkp->filename, sizeof(temp));
+
+    if (linkp->name[0])
+      snprintf(temp + strlen(temp), sizeof(temp) - strlen(temp), "#%s",
+	       linkp->name);
+
+    load(temp);
+  }
+  else if (target[0])
+    topline(target);
+  else
+    topline(0);
+
+  leftline(0);
+}
+
+void Fl_Help_View::clear_selection()
+{
+  if (current_view==this)
+    clear_global_selection();
+}
+
+void Fl_Help_View::select_all()
+{
+  clear_global_selection();
+  if (!value_) return;
+  current_view = this;
+  selection_drag_last = selection_last = strlen(value_);
+  selected = 1;
+}
+
+void Fl_Help_View::clear_global_selection()
+{
+  if (selected) redraw();
+  selection_push_first = selection_push_last = 0;
+  selection_drag_first = selection_drag_last = 0;
+  selection_first = selection_last = 0;
+  selected = 0;
+}
+
+char Fl_Help_View::begin_selection()
+{
+  clear_global_selection();
+
+  if (!fl_help_view_buffer) fl_help_view_buffer = fl_create_offscreen(1, 1);
+
+  mouse_x = Fl::event_x();
+  mouse_y = Fl::event_y();
+  draw_mode = 1;
+
+    current_view = this;
+    fl_begin_offscreen(fl_help_view_buffer);
+    draw();
+    fl_end_offscreen();
+
+  draw_mode = 0;
+
+  if (selection_push_last) return 1;
+  else return 0;
+}
+
+char Fl_Help_View::extend_selection()
+{
+  if (Fl::event_is_click())
+    return 0;
+
+//  printf("old selection_first=%d, selection_last=%d\n",
+//         selection_first, selection_last);
+
+  int sf = selection_first, sl = selection_last;
+
+  selected = 1;
+  mouse_x = Fl::event_x();
+  mouse_y = Fl::event_y();
+  draw_mode = 2;
+
+    fl_begin_offscreen(fl_help_view_buffer);
+    draw();
+    fl_end_offscreen();
+
+  draw_mode = 0;
+
+  if (selection_push_first < selection_drag_first) {
+    selection_first = selection_push_first;
+  } else {
+    selection_first = selection_drag_first;
+  }
+
+  if (selection_push_last > selection_drag_last) {
+    selection_last = selection_push_last;
+  } else {
+    selection_last = selection_drag_last;
+  }
+
+//  printf("new selection_first=%d, selection_last=%d\n",
+//         selection_first, selection_last);
+
+  if (sf!=selection_first || sl!=selection_last) {
+//    puts("REDRAW!!!\n");
+    return 1;
+  } else {
+//    puts("");
+    return 0;
+  }
+}
+
+// convert a command with up to four letters into an unsigned int
+static unsigned int command(const char *cmd)
+{
+  unsigned int ret = (tolower(cmd[0])<<24);
+  char c = cmd[1];
+  if (c=='>' || c==' ' || c==0) return ret;
+  ret |= (tolower(c)<<16);
+  c = cmd[2];
+  if (c=='>' || c==' ' || c==0) return ret;
+  ret |= (tolower(c)<<8);
+  c = cmd[3];
+  if (c=='>' || c==' ' || c==0) return ret;
+  ret |= tolower(c);
+  c = cmd[4];
+  if (c=='>' || c==' ' || c==0) return ret;
+  return 0;
+}
+
+#define CMD(a, b, c, d) ((a<<24)|(b<<16)|(c<<8)|d)
+
+void Fl_Help_View::end_selection(int clipboard) 
+{
+  if (!selected || current_view!=this) 
+    return;
+  // convert the select part of our html text into some kind of somewhat readable ASCII
+  // and store it in the selection buffer
+  char p = 0, pre = 0;;
+  int len = strlen(value_);
+  char *txt = (char*)malloc(len+1), *d = txt;
+  const char *s = value_, *cmd, *src;
+  for (;;) {
+    char c = *s++;
+    if (c==0) break;
+    if (c=='<') { // begin of some html command. Skip until we find a '>'
+      cmd = s;
+      for (;;) {
+        c = *s++;
+        if (c==0 || c=='>') break;
+      }
+      if (c==0) break;
+      // do something with this command... .
+      // the replacement string must not be longer that the command itself plus '<' and '>'
+      src = 0;
+      switch (command(cmd)) {
+        case CMD('p','r','e', 0 ): pre = 1; break;
+        case CMD('/','p','r','e'): pre = 0; break;
+        case CMD('t','d', 0 , 0 ):
+        case CMD('p', 0 , 0 , 0 ):
+        case CMD('/','p', 0 , 0 ):
+        case CMD('b','r', 0 , 0 ): src = "\n"; break;
+        case CMD('l','i', 0 , 0 ): src = "\n * "; break;
+        case CMD('/','h','1', 0 ):
+        case CMD('/','h','2', 0 ):
+        case CMD('/','h','3', 0 ):
+        case CMD('/','h','4', 0 ):
+        case CMD('/','h','5', 0 ):
+        case CMD('/','h','6', 0 ): src = "\n\n"; break;
+        case CMD('t','r', 0 , 0 ):
+        case CMD('h','1', 0 , 0 ):
+        case CMD('h','2', 0 , 0 ):
+        case CMD('h','3', 0 , 0 ):
+        case CMD('h','4', 0 , 0 ):
+        case CMD('h','5', 0 , 0 ):
+        case CMD('h','6', 0 , 0 ): src = "\n\n"; break;
+        case CMD('d','t', 0 , 0 ): src = "\n "; break;
+        case CMD('d','d', 0 , 0 ): src = "\n - "; break;
+      }
+      int n = s-value_;
+      if (src && n>selection_first && n<=selection_last) {
+        while (*src) {
+          *d++ = *src++;
+        }
+        c = src[-1];
+        p = isspace(c&255) ? ' ' : c;
+      }
+      continue;
+    }
+    if (c=='&') { // special characters
+      int xx = quote_char(s);
+      if (xx>=0) {
+        c = (char)xx;
+        for (;;) {
+          char cc = *s++;
+          if (!cc || cc==';') break;
+        }
+      }
+    }
+    int n = s-value_;
+    if (n>selection_first && n<=selection_last) {
+      if (!pre && isspace(c&255)) c = ' ';
+      if (p!=' '||c!=' ')
+        *d++ = c;
+      p = c;
+    }
+  }
+  *d = 0;
+  Fl::copy(txt, strlen(txt), clipboard);
+  free(txt);
+}
+
+#define ctrl(x) ((x)&0x1f)
+
+//
+// 'Fl_Help_View::handle()' - Handle events in the widget.
+//
+
+int				// O - 1 if we handled it, 0 otherwise
+Fl_Help_View::handle(int event)	// I - Event to handle
+{
+  static Fl_Help_Link *linkp;   // currently clicked link
+
+  int xx = Fl::event_x() - x() + leftline_;
+  int yy = Fl::event_y() - y() + topline_;
+
+  switch (event)
+  {
+    case FL_FOCUS:
+      redraw();
+      return 1;
+    case FL_UNFOCUS:
+      clear_selection();
+      redraw();
+      return 1;
+    case FL_ENTER :
+      Fl_Group::handle(event);
+      return 1;
+    case FL_LEAVE :
+      fl_cursor(FL_CURSOR_DEFAULT);
+      break;
+    case FL_MOVE:
+      if (find_link(xx, yy)) fl_cursor(FL_CURSOR_HAND);
+      else fl_cursor(FL_CURSOR_DEFAULT);
+      return 1;
+    case FL_PUSH:
+      if (Fl_Group::handle(event)) return 1;
+      linkp = find_link(xx, yy);
+      if (linkp) {
+        fl_cursor(FL_CURSOR_HAND);
+        return 1;
+      }
+      if (begin_selection()) {
+        fl_cursor(FL_CURSOR_INSERT);
+        return 1;
+      }
+      fl_cursor(FL_CURSOR_DEFAULT);
+      return 1;
+    case FL_DRAG:
+      if (linkp) {
+        if (Fl::event_is_click()) {
+          fl_cursor(FL_CURSOR_HAND);
+        } else {
+          fl_cursor(FL_CURSOR_DEFAULT); // should be "FL_CURSOR_CANCEL" if we had it
+        }
+        return 1;
+      }
+      if (current_view==this && selection_push_last) {
+        if (extend_selection()) redraw();
+        fl_cursor(FL_CURSOR_INSERT);
+        return 1;
+      }
+      fl_cursor(FL_CURSOR_DEFAULT);
+      return 1;
+    case FL_RELEASE:
+      if (linkp) {
+        if (Fl::event_is_click()) {
+          follow_link(linkp);
+        }
+        fl_cursor(FL_CURSOR_DEFAULT);
+        linkp = 0;
+        return 1;
+      }
+      if (current_view==this && selection_push_last) {
+        end_selection();
+        return 1;
+      }
+      return 1;
+    case FL_SHORTCUT: {
+      char ascii = Fl::event_text()[0];
+      switch (ascii) {
+        case ctrl('A'): select_all(); redraw(); return 1;
+        case ctrl('C'):
+        case ctrl('X'): end_selection(1); return 1;
+      }
+      break; }
+  }
+  return (Fl_Group::handle(event));
+}
+
+//
+// 'Fl_Help_View::Fl_Help_View()' - Build a Fl_Help_View widget.
+//
+
+Fl_Help_View::Fl_Help_View(int        xx,	// I - Left position
+                	   int        yy,	// I - Top position
+			   int        ww,	// I - Width in pixels
+			   int        hh,	// I - Height in pixels
+			   const char *l)
+    : Fl_Group(xx, yy, ww, hh, l),
+      scrollbar_(xx + ww - Fl::scrollbar_size(), yy,
+                 Fl::scrollbar_size(), hh - Fl::scrollbar_size()),
+      hscrollbar_(xx, yy + hh - Fl::scrollbar_size(),
+                  ww - Fl::scrollbar_size(), Fl::scrollbar_size())
+{
+  color(FL_BACKGROUND2_COLOR, FL_SELECTION_COLOR);
+
+  title_[0]     = '\0';
+  defcolor_     = FL_FOREGROUND_COLOR;
+  bgcolor_      = FL_BACKGROUND_COLOR;
+  textcolor_    = FL_FOREGROUND_COLOR;
+  linkcolor_    = FL_SELECTION_COLOR;
+  textfont_     = FL_TIMES;
+  textsize_     = 12;
+  value_        = NULL;
+
+  ablocks_      = 0;
+  nblocks_      = 0;
+  blocks_       = (Fl_Help_Block *)0;
+
+  nfonts_       = 0;
+
+  link_         = (Fl_Help_Func *)0;
+
+  alinks_       = 0;
+  nlinks_       = 0;
+  links_        = (Fl_Help_Link *)0;
+
+  atargets_     = 0;
+  ntargets_     = 0;
+  targets_      = (Fl_Help_Target *)0;
+
+  directory_[0] = '\0';
+  filename_[0]  = '\0';
+
+  topline_      = 0;
+  leftline_     = 0;
+  size_         = 0;
+  hsize_        = 0;
+
+  scrollbar_.value(0, hh, 0, 1);
+  scrollbar_.step(8.0);
+  scrollbar_.show();
+  scrollbar_.callback(scrollbar_callback);
+
+  hscrollbar_.value(0, ww, 0, 1);
+  hscrollbar_.step(8.0);
+  hscrollbar_.show();
+  hscrollbar_.callback(hscrollbar_callback);
+  hscrollbar_.type(FL_HORIZONTAL);
+  end();
+
+  resize(xx, yy, ww, hh);
+}
+
+
+//
+// 'Fl_Help_View::~Fl_Help_View()' - Destroy a Fl_Help_View widget.
+//
+
+Fl_Help_View::~Fl_Help_View()
+{
+  clear_selection();
+  free_data();
+}
+
+
+//
+// 'Fl_Help_View::load()' - Load the specified file.
+//
+
+int				// O - 0 on success, -1 on error
+Fl_Help_View::load(const char *f)// I - Filename to load (may also have target)
+{
+  FILE		*fp;		// File to read from
+  long		len;		// Length of file
+  char		*target;	// Target in file
+  char		*slash;		// Directory separator
+  const char	*localname;	// Local filename
+  char		error[1024];	// Error buffer
+  char		newname[1024];	// New filename buffer
+
+  clear_selection();
+
+  strlcpy(newname, f, sizeof(newname));
+  if ((target = strrchr(newname, '#')) != NULL)
+    *target++ = '\0';
+
+  if (link_)
+    localname = (*link_)(this, newname);
+  else
+    localname = filename_;
+
+  if (!localname)
+    return (0);
+
+  free_data();
+
+  strlcpy(filename_, newname, sizeof(filename_));
+  strlcpy(directory_, newname, sizeof(directory_));
+
+  // Note: We do not support Windows backslashes, since they are illegal
+  //       in URLs...
+  if ((slash = strrchr(directory_, '/')) == NULL)
+    directory_[0] = '\0';
+  else if (slash > directory_ && slash[-1] != '/')
+    *slash = '\0';
+
+  if (strncmp(localname, "ftp:", 4) == 0 ||
+      strncmp(localname, "http:", 5) == 0 ||
+      strncmp(localname, "https:", 6) == 0 ||
+      strncmp(localname, "ipp:", 4) == 0 ||
+      strncmp(localname, "mailto:", 7) == 0 ||
+      strncmp(localname, "news:", 5) == 0)
+  {
+    // Remote link wasn't resolved...
+    snprintf(error, sizeof(error),
+             "Error"
+             "

Error

" + "

Unable to follow the link \"%s\" - " + "no handler exists for this URI scheme.

", + localname); + value_ = strdup(error); + } + else + { + if (strncmp(localname, "file:", 5) == 0) + localname += 5; // Adjust for local filename... + + if ((fp = fopen(localname, "rb")) != NULL) + { + fseek(fp, 0, SEEK_END); + len = ftell(fp); + rewind(fp); + + value_ = (const char *)calloc(len + 1, 1); + fread((void *)value_, 1, len, fp); + fclose(fp); + } + else + { + snprintf(error, sizeof(error), + "Error" + "

Error

" + "

Unable to follow the link \"%s\" - " + "%s.

", + localname, strerror(errno)); + value_ = strdup(error); + } + } + + initial_load = 1; + format(); + initial_load = 0; + + if (target) + topline(target); + else + topline(0); + + return (0); +} + + +// +// 'Fl_Help_View::resize()' - Resize the help widget. +// + +void +Fl_Help_View::resize(int xx, // I - New left position + int yy, // I - New top position + int ww, // I - New width + int hh) // I - New height +{ + Fl_Boxtype b = box() ? box() : FL_DOWN_BOX; + // Box to draw... + + + Fl_Widget::resize(xx, yy, ww, hh); + + int ss = Fl::scrollbar_size(); + scrollbar_.resize(x() + w() - ss - Fl::box_dw(b) + Fl::box_dx(b), + y() + Fl::box_dy(b), ss, h() - ss - Fl::box_dh(b)); + hscrollbar_.resize(x() + Fl::box_dx(b), + y() + h() - ss - Fl::box_dh(b) + Fl::box_dy(b), + w() - ss - Fl::box_dw(b), ss); + + format(); +} + + +// +// 'Fl_Help_View::topline()' - Set the top line to the named target. +// + +void +Fl_Help_View::topline(const char *n) // I - Target name +{ + Fl_Help_Target key, // Target name key + *target; // Pointer to matching target + + + if (ntargets_ == 0) + return; + + strlcpy(key.name, n, sizeof(key.name)); + + target = (Fl_Help_Target *)bsearch(&key, targets_, ntargets_, sizeof(Fl_Help_Target), + (compare_func_t)compare_targets); + + if (target != NULL) + topline(target->y); +} + + +// +// 'Fl_Help_View::topline()' - Set the top line by number. +// + +void +Fl_Help_View::topline(int t) // I - Top line number +{ + if (!value_) + return; + + if (size_ < (h() - Fl::scrollbar_size()) || t < 0) + t = 0; + else if (t > size_) + t = size_; + + topline_ = t; + + scrollbar_.value(topline_, h() - Fl::scrollbar_size(), 0, size_); + + do_callback(); + + redraw(); +} + + +// +// 'Fl_Help_View::leftline()' - Set the left position. +// + +void +Fl_Help_View::leftline(int l) // I - Left position +{ + if (!value_) + return; + + if (hsize_ < (w() - Fl::scrollbar_size()) || l < 0) + l = 0; + else if (l > hsize_) + l = hsize_; + + leftline_ = l; + + hscrollbar_.value(leftline_, w() - Fl::scrollbar_size(), 0, hsize_); + + redraw(); +} + + +// +// 'Fl_Help_View::value()' - Set the help text directly. +// + +void +Fl_Help_View::value(const char *v) // I - Text to view +{ + clear_selection(); + free_data(); + set_changed(); + + if (!v) + return; + + value_ = strdup(v); + + initial_load = 1; + format(); + initial_load = 0; + + topline(0); + leftline(0); +} + +#ifdef ENC +# undef ENC +#endif +#ifdef __APPLE__ +# define ENC(a, b) b +#else +# define ENC(a, b) a +#endif + +// +// 'quote_char()' - Return the character code associated with a quoted char. +// + +static int // O - Code or -1 on error +quote_char(const char *p) { // I - Quoted string + int i; // Looping var + static struct { + const char *name; + int namelen; + int code; + } *nameptr, // Pointer into name array + names[] = { // Quoting names + { "Aacute;", 7, ENC(193,231) }, + { "aacute;", 7, ENC(225,135) }, + { "Acirc;", 6, ENC(194,229) }, + { "acirc;", 6, ENC(226,137) }, + { "acute;", 6, ENC(180,171) }, + { "AElig;", 6, ENC(198,174) }, + { "aelig;", 6, ENC(230,190) }, + { "Agrave;", 7, ENC(192,203) }, + { "agrave;", 7, ENC(224,136) }, + { "amp;", 4, ENC('&','&') }, + { "Aring;", 6, ENC(197,129) }, + { "aring;", 6, ENC(229,140) }, + { "Atilde;", 7, ENC(195,204) }, + { "atilde;", 7, ENC(227,139) }, + { "Auml;", 5, ENC(196,128) }, + { "auml;", 5, ENC(228,138) }, + { "brvbar;", 7, ENC(166, -1) }, + { "bull;", 5, ENC(149,165) }, + { "Ccedil;", 7, ENC(199,199) }, + { "ccedil;", 7, ENC(231,141) }, + { "cedil;", 6, ENC(184,252) }, + { "cent;", 5, ENC(162,162) }, + { "copy;", 5, ENC(169,169) }, + { "curren;", 7, ENC(164, -1) }, + { "deg;", 4, ENC(176,161) }, + { "divide;", 7, ENC(247,214) }, + { "Eacute;", 7, ENC(201,131) }, + { "eacute;", 7, ENC(233,142) }, + { "Ecirc;", 6, ENC(202,230) }, + { "ecirc;", 6, ENC(234,144) }, + { "Egrave;", 7, ENC(200,233) }, + { "egrave;", 7, ENC(232,143) }, + { "ETH;", 4, ENC(208, -1) }, + { "eth;", 4, ENC(240, -1) }, + { "Euml;", 5, ENC(203,232) }, + { "euml;", 5, ENC(235,145) }, + { "euro;", 5, ENC(128,219) }, + { "frac12;", 7, ENC(189, -1) }, + { "frac14;", 7, ENC(188, -1) }, + { "frac34;", 7, ENC(190, -1) }, + { "gt;", 3, ENC('>','>') }, + { "Iacute;", 7, ENC(205,234) }, + { "iacute;", 7, ENC(237,146) }, + { "Icirc;", 6, ENC(206,235) }, + { "icirc;", 6, ENC(238,148) }, + { "iexcl;", 6, ENC(161,193) }, + { "Igrave;", 7, ENC(204,237) }, + { "igrave;", 7, ENC(236,147) }, + { "iquest;", 7, ENC(191,192) }, + { "Iuml;", 5, ENC(207,236) }, + { "iuml;", 5, ENC(239,149) }, + { "laquo;", 6, ENC(171,199) }, + { "lt;", 3, ENC('<','<') }, + { "macr;", 5, ENC(175,248) }, + { "micro;", 6, ENC(181,181) }, + { "middot;", 7, ENC(183,225) }, + { "nbsp;", 5, ENC(' ',' ') }, + { "not;", 4, ENC(172,194) }, + { "Ntilde;", 7, ENC(209,132) }, + { "ntilde;", 7, ENC(241,150) }, + { "Oacute;", 7, ENC(211,238) }, + { "oacute;", 7, ENC(243,151) }, + { "Ocirc;", 6, ENC(212,239) }, + { "ocirc;", 6, ENC(244,153) }, + { "Ograve;", 7, ENC(210,241) }, + { "ograve;", 7, ENC(242,152) }, + { "ordf;", 5, ENC(170,187) }, + { "ordm;", 5, ENC(186,188) }, + { "Oslash;", 7, ENC(216,175) }, + { "oslash;", 7, ENC(248,191) }, + { "Otilde;", 7, ENC(213,205) }, + { "otilde;", 7, ENC(245,155) }, + { "Ouml;", 5, ENC(214,133) }, + { "ouml;", 5, ENC(246,154) }, + { "para;", 5, ENC(182,166) }, + { "premil;", 7, ENC(137,228) }, + { "plusmn;", 7, ENC(177,177) }, + { "pound;", 6, ENC(163,163) }, + { "quot;", 5, ENC('\"','\"') }, + { "raquo;", 6, ENC(187,200) }, + { "reg;", 4, ENC(174,168) }, + { "sect;", 5, ENC(167,164) }, + { "shy;", 4, ENC(173,'-') }, + { "sup1;", 5, ENC(185, -1) }, + { "sup2;", 5, ENC(178, -1) }, + { "sup3;", 5, ENC(179, -1) }, + { "szlig;", 6, ENC(223,167) }, + { "THORN;", 6, ENC(222, -1) }, + { "thorn;", 6, ENC(254, -1) }, + { "times;", 6, ENC(215,'x') }, + { "trade;", 6, ENC(153,170) }, + { "Uacute;", 7, ENC(218,242) }, + { "uacute;", 7, ENC(250,156) }, + { "Ucirc;", 6, ENC(219,243) }, + { "ucirc;", 6, ENC(251,158) }, + { "Ugrave;", 7, ENC(217,244) }, + { "ugrave;", 7, ENC(249,157) }, + { "uml;", 4, ENC(168,172) }, + { "Uuml;", 5, ENC(220,134) }, + { "uuml;", 5, ENC(252,159) }, + { "Yacute;", 7, ENC(221, -1) }, + { "yacute;", 7, ENC(253, -1) }, + { "yen;", 4, ENC(165,180) }, + { "Yuml;", 5, ENC(159,217) }, + { "yuml;", 5, ENC(255,216) } + }; + + if (!strchr(p, ';')) return -1; + if (*p == '#') { + if (*(p+1) == 'x' || *(p+1) == 'X') return strtol(p+2, NULL, 16); + else return atoi(p+1); + } + for (i = (int)(sizeof(names) / sizeof(names[0])), nameptr = names; i > 0; i --, nameptr ++) + if (strncmp(p, nameptr->name, nameptr->namelen) == 0) + return nameptr->code; + + return -1; +} + + +// +// 'scrollbar_callback()' - A callback for the scrollbar. +// + +static void +scrollbar_callback(Fl_Widget *s, void *) +{ + ((Fl_Help_View *)(s->parent()))->topline(int(((Fl_Scrollbar*)s)->value())); +} + + +// +// 'hscrollbar_callback()' - A callback for the horizontal scrollbar. +// + +static void +hscrollbar_callback(Fl_Widget *s, void *) +{ + ((Fl_Help_View *)(s->parent()))->leftline(int(((Fl_Scrollbar*)s)->value())); +} + + +// +// End of "$Id: Fl_Help_View.cxx 6745 2009-04-07 18:37:25Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Image.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Image.cxx new file mode 100644 index 0000000..56cf83d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Image.cxx @@ -0,0 +1,525 @@ +// +// "$Id: Fl_Image.cxx 6805 2009-06-29 07:45:48Z AlbrechtS $" +// +// Image drawing code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include "flstring.h" + +#ifdef WIN32 +void fl_release_dc(HWND, HDC); // from Fl_win32.cxx +#endif + +void fl_restore_clip(); // from fl_rect.cxx + +// +// Base image class... +// + +Fl_Image::~Fl_Image() { +} + +void Fl_Image::uncache() { +} + +void Fl_Image::draw(int XP, int YP, int, int, int, int) { + draw_empty(XP, YP); +} + +void Fl_Image::draw_empty(int X, int Y) { + if (w() > 0 && h() > 0) { + fl_color(FL_FOREGROUND_COLOR); + fl_rect(X, Y, w(), h()); + fl_line(X, Y, X + w() - 1, Y + h() - 1); + fl_line(X, Y + h() - 1, X + w() - 1, Y); + } +} + +Fl_Image *Fl_Image::copy(int W, int H) { + return new Fl_Image(W, H, d()); +} + +void Fl_Image::color_average(Fl_Color, float) { +} + +void Fl_Image::desaturate() { +} + +void Fl_Image::label(Fl_Widget* widget) { + widget->image(this); +} + +void Fl_Image::label(Fl_Menu_Item* m) { + Fl::set_labeltype(_FL_IMAGE_LABEL, labeltype, measure); + m->label(_FL_IMAGE_LABEL, (const char*)this); +} + +void +Fl_Image::labeltype(const Fl_Label *lo, // I - Label + int lx, // I - X position + int ly, // I - Y position + int lw, // I - Width of label + int lh, // I - Height of label + Fl_Align la) { // I - Alignment + Fl_Image *img; // Image pointer + int cx, cy; // Image position + + img = (Fl_Image *)(lo->value); + + if (la & FL_ALIGN_LEFT) cx = 0; + else if (la & FL_ALIGN_RIGHT) cx = img->w() - lw; + else cx = (img->w() - lw) / 2; + + if (la & FL_ALIGN_TOP) cy = 0; + else if (la & FL_ALIGN_BOTTOM) cy = img->h() - lh; + else cy = (img->h() - lh) / 2; + + fl_color((Fl_Color)lo->color); + + img->draw(lx, ly, lw, lh, cx, cy); +} + +void +Fl_Image::measure(const Fl_Label *lo, // I - Label + int &lw, // O - Width of image + int &lh) { // O - Height of image + Fl_Image *img; // Image pointer + + img = (Fl_Image *)(lo->value); + + lw = img->w(); + lh = img->h(); +} + + +// +// RGB image class... +// + +Fl_RGB_Image::~Fl_RGB_Image() { + uncache(); + if (alloc_array) delete[] (uchar *)array; +} + +void Fl_RGB_Image::uncache() { +#ifdef __APPLE_QUARTZ__ + if (id) { + CGImageRelease((CGImageRef)id); + id = 0; + } +#else + if (id) { + fl_delete_offscreen((Fl_Offscreen)id); + id = 0; + } + + if (mask) { + fl_delete_bitmask((Fl_Bitmask)mask); + mask = 0; + } +#endif +} + +Fl_Image *Fl_RGB_Image::copy(int W, int H) { + Fl_RGB_Image *new_image; // New RGB image + uchar *new_array; // New array for image data + + // Optimize the simple copy where the width and height are the same, + // or when we are copying an empty image... + if ((W == w() && H == h()) || + !w() || !h() || !d() || !array) { + if (array) { + // Make a copy of the image data and return a new Fl_RGB_Image... + new_array = new uchar[w() * h() * d()]; + if (ld() && ld()!=w()*d()) { + const uchar *src = array; + uchar *dst = new_array; + int dy, dh = h(), wd = w()*d(), wld = ld(); + for (dy=0; dyalloc_array = 1; + + return new_image; + } else return new Fl_RGB_Image(array, w(), h(), d(), ld()); + } + if (W <= 0 || H <= 0) return 0; + + // OK, need to resize the image data; allocate memory and + uchar *new_ptr; // Pointer into new array + const uchar *old_ptr; // Pointer into old array + int c, // Channel number + sy, // Source coordinate + dx, dy, // Destination coordinates + xerr, yerr, // X & Y errors + xmod, ymod, // X & Y moduli + xstep, ystep, // X & Y step increments + line_d; // stride from line to line + + + // Figure out Bresenheim step/modulus values... + xmod = w() % W; + xstep = (w() / W) * d(); + ymod = h() % H; + ystep = h() / H; + line_d = ld() ? ld() : w() * d(); + + // Allocate memory for the new image... + new_array = new uchar [W * H * d()]; + new_image = new Fl_RGB_Image(new_array, W, H, d()); + new_image->alloc_array = 1; + + // Scale the image using a nearest-neighbor algorithm... + for (dy = H, sy = 0, yerr = H, new_ptr = new_array; dy > 0; dy --) { + for (dx = W, xerr = W, old_ptr = array + sy * line_d; dx > 0; dx --) { + for (c = 0; c < d(); c ++) *new_ptr++ = old_ptr[c]; + + old_ptr += xstep; + xerr -= xmod; + + if (xerr <= 0) { + xerr += W; + old_ptr += d(); + } + } + + sy += ystep; + yerr -= ymod; + if (yerr <= 0) { + yerr += H; + sy ++; + } + } + + return new_image; +} + +void Fl_RGB_Image::color_average(Fl_Color c, float i) { + // Don't average an empty image... + if (!w() || !h() || !d() || !array) return; + + // Delete any existing pixmap/mask objects... + uncache(); + + // Allocate memory as needed... + uchar *new_array, + *new_ptr; + + if (!alloc_array) new_array = new uchar[h() * w() * d()]; + else new_array = (uchar *)array; + + // Get the color to blend with... + uchar r, g, b; + unsigned ia, ir, ig, ib; + + Fl::get_color(c, r, g, b); + if (i < 0.0f) i = 0.0f; + else if (i > 1.0f) i = 1.0f; + + ia = (unsigned)(256 * i); + ir = r * (256 - ia); + ig = g * (256 - ia); + ib = b * (256 - ia); + + // Update the image data to do the blend... + const uchar *old_ptr; + int x, y; + int line_i = ld() ? ld() - (w()*d()) : 0; // increment from line end to beginning of next line + + if (d() < 3) { + ig = (r * 31 + g * 61 + b * 8) / 100 * (256 - ia); + + for (new_ptr = new_array, old_ptr = array, y = 0; y < h(); y ++, old_ptr += line_i) + for (x = 0; x < w(); x ++) { + *new_ptr++ = (*old_ptr++ * ia + ig) >> 8; + if (d() > 1) *new_ptr++ = *old_ptr++; + } + } else { + for (new_ptr = new_array, old_ptr = array, y = 0; y < h(); y ++, old_ptr += line_i) + for (x = 0; x < w(); x ++) { + *new_ptr++ = (*old_ptr++ * ia + ir) >> 8; + *new_ptr++ = (*old_ptr++ * ia + ig) >> 8; + *new_ptr++ = (*old_ptr++ * ia + ib) >> 8; + if (d() > 3) *new_ptr++ = *old_ptr++; + } + } + + // Set the new pointers/values as needed... + if (!alloc_array) { + array = new_array; + alloc_array = 1; + + ld(0); + } +} + +void Fl_RGB_Image::desaturate() { + // Don't desaturate an empty image... + if (!w() || !h() || !d() || !array) return; + + // Can only desaturate color images... + if (d() < 3) return; + + // Delete any existing pixmap/mask objects... + uncache(); + + // Allocate memory for a grayscale image... + uchar *new_array, + *new_ptr; + int new_d; + + new_d = d() - 2; + new_array = new uchar[h() * w() * new_d]; + + // Copy the image data, converting to grayscale... + const uchar *old_ptr; + int x, y; + int line_i = ld() ? ld() - (w()*d()) : 0; // increment from line end to beginning of next line + + for (new_ptr = new_array, old_ptr = array, y = 0; y < h(); y ++, old_ptr += line_i) + for (x = 0; x < w(); x ++, old_ptr += d()) { + *new_ptr++ = (uchar)((31 * old_ptr[0] + 61 * old_ptr[1] + 8 * old_ptr[2]) / 100); + if (d() > 3) *new_ptr++ = old_ptr[3]; + } + + // Free the old array as needed, and then set the new pointers/values... + if (alloc_array) delete[] (uchar *)array; + + array = new_array; + alloc_array = 1; + + ld(0); + d(new_d); +} + +#if !defined(WIN32) && !USE_QUARTZ +// Composite an image with alpha on systems that don't have accelerated +// alpha compositing... +static void alpha_blend(Fl_RGB_Image *img, int X, int Y, int W, int H, int cx, int cy) { + uchar *srcptr = (uchar*)img->array + img->d() * (img->w() * cy + cx); + int srcskip = img->d() * (img->w() - W); + + uchar *dst = new uchar[W * H * 3]; + uchar *dstptr = dst; + + fl_read_image(dst, X, Y, W, H, 0); + + uchar srcr, srcg, srcb, srca; + uchar dstr, dstg, dstb, dsta; + + if (img->d() == 2) { + // Composite grayscale + alpha over RGB... + // Composite RGBA over RGB... + for (int y = H; y > 0; y--, srcptr+=srcskip) + for (int x = W; x > 0; x--) { + srcg = *srcptr++; + srca = *srcptr++; + + dstr = dstptr[0]; + dstg = dstptr[1]; + dstb = dstptr[2]; + dsta = 255 - srca; + + *dstptr++ = (srcg * srca + dstr * dsta) >> 8; + *dstptr++ = (srcg * srca + dstg * dsta) >> 8; + *dstptr++ = (srcg * srca + dstb * dsta) >> 8; + } + } else { + // Composite RGBA over RGB... + for (int y = H; y > 0; y--, srcptr+=srcskip) + for (int x = W; x > 0; x--) { + srcr = *srcptr++; + srcg = *srcptr++; + srcb = *srcptr++; + srca = *srcptr++; + + dstr = dstptr[0]; + dstg = dstptr[1]; + dstb = dstptr[2]; + dsta = 255 - srca; + + *dstptr++ = (srcr * srca + dstr * dsta) >> 8; + *dstptr++ = (srcg * srca + dstg * dsta) >> 8; + *dstptr++ = (srcb * srca + dstb * dsta) >> 8; + } + } + + fl_draw_image(dst, X, Y, W, H, 3, 0); + + delete[] dst; +} +#endif // !WIN32 && !USE_QUARTZ + +void Fl_RGB_Image::draw(int XP, int YP, int WP, int HP, int cx, int cy) { + // Don't draw an empty image... + if (!d() || !array) { + draw_empty(XP, YP); + return; + } + + // account for current clip region (faster on Irix): + int X,Y,W,H; fl_clip_box(XP,YP,WP,HP,X,Y,W,H); + cx += X-XP; cy += Y-YP; + // clip the box down to the size of image, quit if empty: + if (cx < 0) {W += cx; X -= cx; cx = 0;} + if (cx+W > w()) W = w()-cx; + if (W <= 0) return; + if (cy < 0) {H += cy; Y -= cy; cy = 0;} + if (cy+H > h()) H = h()-cy; + if (H <= 0) return; + if (!id) { +#ifdef __APPLE_QUARTZ__ + CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB(); + CGDataProviderRef src = CGDataProviderCreateWithData( 0L, array, w()*h()*d(), 0L); + id = CGImageCreate( w(), h(), 8, d()*8, ld()?ld():w()*d(), + lut, (d()&1)?kCGImageAlphaNone:kCGImageAlphaLast, + src, 0L, false, kCGRenderingIntentDefault); + CGColorSpaceRelease(lut); + CGDataProviderRelease(src); +#elif defined(WIN32) + id = fl_create_offscreen(w(), h()); + if ((d() == 2 || d() == 4) && fl_can_do_alpha_blending()) { + fl_begin_offscreen((Fl_Offscreen)id); + fl_draw_image(array, 0, 0, w(), h(), d()|FL_IMAGE_WITH_ALPHA, ld()); + fl_end_offscreen(); + } else { + fl_begin_offscreen((Fl_Offscreen)id); + fl_draw_image(array, 0, 0, w(), h(), d(), ld()); + fl_end_offscreen(); + if (d() == 2 || d() == 4) { + mask = fl_create_alphamask(w(), h(), d(), ld(), array); + } + } +#else + if (d() == 1 || d() == 3) { + id = fl_create_offscreen(w(), h()); + fl_begin_offscreen((Fl_Offscreen)id); + fl_draw_image(array, 0, 0, w(), h(), d(), ld()); + fl_end_offscreen(); + } +#endif + } +#ifdef WIN32 + if (mask) { + HDC new_gc = CreateCompatibleDC(fl_gc); + int save = SaveDC(new_gc); + SelectObject(new_gc, (void*)mask); + BitBlt(fl_gc, X, Y, W, H, new_gc, cx, cy, SRCAND); + SelectObject(new_gc, (void*)id); + BitBlt(fl_gc, X, Y, W, H, new_gc, cx, cy, SRCPAINT); + RestoreDC(new_gc,save); + DeleteDC(new_gc); + } else if (d()==2 || d()==4) { + fl_copy_offscreen_with_alpha(X, Y, W, H, (Fl_Offscreen)id, cx, cy); + } else { + fl_copy_offscreen(X, Y, W, H, (Fl_Offscreen)id, cx, cy); + } +#elif defined(__APPLE_QD__) + if (mask) { + Rect src, dst; + // MRS: STR #114 says we should be using cx, cy, W, and H... +// src.left = 0; src.right = w(); +// src.top = 0; src.bottom = h(); +// dst.left = X; dst.right = X+w(); +// dst.top = Y; dst.bottom = Y+h(); + src.left = cx; src.right = cx+W; + src.top = cy; src.bottom = cy+H; + dst.left = X; dst.right = X+W; + dst.top = Y; dst.bottom = Y+H; + RGBColor rgb; + rgb.red = 0xffff; rgb.green = 0xffff; rgb.blue = 0xffff; + RGBBackColor(&rgb); + rgb.red = 0x0000; rgb.green = 0x0000; rgb.blue = 0x0000; + RGBForeColor(&rgb); + + CopyMask(GetPortBitMapForCopyBits((GrafPtr)id), + GetPortBitMapForCopyBits((GrafPtr)mask), + GetPortBitMapForCopyBits(GetWindowPort(fl_window)), + &src, &src, &dst); + } else if (id) fl_copy_offscreen(X, Y, W, H, (Fl_Offscreen)id, cx, cy); + else { + // Composite image with alpha manually each time... + alpha_blend(this, X, Y, W, H, cx, cy); + } +#elif defined(__APPLE_QUARTZ__) + if (id && fl_gc) { + CGRect rect = { { X, Y }, { W, H } }; + Fl_X::q_begin_image(rect, cx, cy, w(), h()); + CGContextDrawImage(fl_gc, rect, (CGImageRef)id); + Fl_X::q_end_image(); + } +#else + if (id) { + if (mask) { + // I can't figure out how to combine a mask with existing region, + // so cut the image down to a clipped rectangle: + int nx, ny; fl_clip_box(X,Y,W,H,nx,ny,W,H); + cx += nx-X; X = nx; + cy += ny-Y; Y = ny; + // make X use the bitmap as a mask: + XSetClipMask(fl_display, fl_gc, mask); + int ox = X-cx; if (ox < 0) ox += w(); + int oy = Y-cy; if (oy < 0) oy += h(); + XSetClipOrigin(fl_display, fl_gc, X-cx, Y-cy); + } + + fl_copy_offscreen(X, Y, W, H, id, cx, cy); + + if (mask) { + // put the old clip region back + XSetClipOrigin(fl_display, fl_gc, 0, 0); + fl_restore_clip(); + } + } else { + // Composite image with alpha manually each time... + alpha_blend(this, X, Y, W, H, cx, cy); + } +#endif +} + +void Fl_RGB_Image::label(Fl_Widget* widget) { + widget->image(this); +} + +void Fl_RGB_Image::label(Fl_Menu_Item* m) { + Fl::set_labeltype(_FL_IMAGE_LABEL, labeltype, measure); + m->label(_FL_IMAGE_LABEL, (const char*)this); +} + + +// +// End of "$Id: Fl_Image.cxx 6805 2009-06-29 07:45:48Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Input.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Input.cxx new file mode 100644 index 0000000..c32da2c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Input.cxx @@ -0,0 +1,477 @@ +// +// "$Id: Fl_Input.cxx 6940 2009-11-17 19:39:01Z matt $" +// +// Input widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// This is the "user interface", it decodes user actions into what to +// do to the text. See also Fl_Input_.cxx, where the text is actually +// manipulated (and some ui, in particular the mouse, is done...). +// In theory you can replace this code with another subclass to change +// the keybindings. + +#include +#include +#include +#include +#include +#include +#include +#include "flstring.h" + +#ifdef HAVE_LOCALE_H +# include +#endif + + +void Fl_Input::draw() { + if (input_type() == FL_HIDDEN_INPUT) return; + Fl_Boxtype b = box(); + if (damage() & FL_DAMAGE_ALL) draw_box(b, color()); + Fl_Input_::drawtext(x()+Fl::box_dx(b), y()+Fl::box_dy(b), + w()-Fl::box_dw(b), h()-Fl::box_dh(b)); +} + +// kludge so shift causes selection to extend: +int Fl_Input::shift_position(int p) { + return position(p, Fl::event_state(FL_SHIFT) ? mark() : p); +} +int Fl_Input::shift_up_down_position(int p) { + return up_down_position(p, Fl::event_state(FL_SHIFT)); +} + +// If you define this symbol as zero you will get the peculiar fltk +// behavior where moving off the end of an input field will move the +// cursor into the next field: +// define it as 1 to prevent cursor movement from going to next field: +#define NORMAL_INPUT_MOVE 0 + +#define ctrl(x) ((x)^0x40) + +// List of characters that are legal in a floating point input field. +// This text string is created at run-time to take the current locale +// into account (for example, continental Europe uses a comma instead +// of a decimal point). For back compatibility reasons, we always +// allow the decimal point. +#ifdef HAVE_LOCALECONV +static const char *standard_fp_chars = ".eE+-"; +static const char *legal_fp_chars = 0L; +#else +static const char *legal_fp_chars = ".eE+-"; +#endif + +int Fl_Input::handle_key() { + + char ascii = Fl::event_text()[0]; + + int repeat_num=1; + + int del; + if (Fl::compose(del)) { + + // Insert characters into numeric fields after checking for legality: + if (input_type() == FL_FLOAT_INPUT || input_type() == FL_INT_INPUT) { + Fl::compose_reset(); // ignore any foreign letters... + + // initialize the list of legal characters inside a floating point number +#ifdef HAVE_LOCALECONV + if (!legal_fp_chars) { + int len = strlen(standard_fp_chars); + struct lconv *lc = localeconv(); + if (lc) { + if (lc->decimal_point) len += strlen(lc->decimal_point); + if (lc->mon_decimal_point) len += strlen(lc->mon_decimal_point); + if (lc->positive_sign) len += strlen(lc->positive_sign); + if (lc->negative_sign) len += strlen(lc->negative_sign); + } + // the following line is not a true memory leak because the array is only + // allocated once if required, and automatically freed when the program quits + char *chars = (char*)malloc(len+1); + legal_fp_chars = chars; + strcpy(chars, standard_fp_chars); + if (lc) { + if (lc->decimal_point) strcat(chars, lc->decimal_point); + if (lc->mon_decimal_point) strcat(chars, lc->mon_decimal_point); + if (lc->positive_sign) strcat(chars, lc->positive_sign); + if (lc->negative_sign) strcat(chars, lc->negative_sign); + } + } +#endif // HAVE_LOCALECONV + + // find the insert position + int ip = position()= '0' && ascii <= '9') + || (ip==1 && index(0)=='0' && (ascii=='x' || ascii == 'X')) + || (ip>1 && index(0)=='0' && (index(1)=='x'||index(1)=='X') + && (ascii>='A'&& ascii<='F' || ascii>='a'&& ascii<='f')) + || input_type()==FL_FLOAT_INPUT && ascii && strchr(legal_fp_chars, ascii)) + { + if (readonly()) fl_beep(); + else replace(position(), mark(), &ascii, 1); + } + return 1; + } + + if (del || Fl::event_length()) { + if (readonly()) fl_beep(); + else replace(position(), del ? position()-del : mark(), + Fl::event_text(), Fl::event_length()); + } + return 1; + } + + switch (Fl::event_key()) { + case FL_Insert: + if (Fl::event_state() & FL_CTRL) ascii = ctrl('C'); + else if (Fl::event_state() & FL_SHIFT) ascii = ctrl('V'); + break; + case FL_Delete: + if (Fl::event_state() & FL_SHIFT) ascii = ctrl('X'); + else ascii = ctrl('D'); + break; + case FL_Left: + ascii = ctrl('B'); break; + case FL_Right: + ascii = ctrl('F'); break; + case FL_Page_Up: + fl_font(textfont(),textsize()); //ensure current font is set to ours + repeat_num=h()/fl_height(); // number of lines to scroll + if (!repeat_num) repeat_num=1; + case FL_Up: + ascii = ctrl('P'); break; + case FL_Page_Down: + fl_font(textfont(),textsize()); + repeat_num=h()/fl_height(); + if (!repeat_num) repeat_num=1; + case FL_Down: + ascii = ctrl('N'); break; + case FL_Home: + if (Fl::event_state() & FL_CTRL) { + shift_position(0); + return 1; + } + ascii = ctrl('A'); + break; + case FL_End: + if (Fl::event_state() & FL_CTRL) { + shift_position(size()); + return 1; + } + ascii = ctrl('E'); break; + + case FL_BackSpace: + ascii = ctrl('H'); break; + case FL_Enter: + case FL_KP_Enter: + if (when() & FL_WHEN_ENTER_KEY) { + position(size(), 0); + maybe_do_callback(); + return 1; + } else if (input_type() == FL_MULTILINE_INPUT && !readonly()) + return replace(position(), mark(), "\n", 1); + else + return 0; // reserved for shortcuts + case FL_Tab: + if (Fl::event_state(FL_CTRL|FL_SHIFT) || input_type()!=FL_MULTILINE_INPUT || readonly()) return 0; + return replace(position(), mark(), &ascii, 1); +#ifdef __APPLE__ + case 'c' : + case 'v' : + case 'x' : + case 'z' : +// printf("'%c' (0x%02x) pressed with%s%s%s%s\n", ascii, ascii, +// Fl::event_state(FL_SHIFT) ? " FL_SHIFT" : "", +// Fl::event_state(FL_CTRL) ? " FL_CTRL" : "", +// Fl::event_state(FL_ALT) ? " FL_ALT" : "", +// Fl::event_state(FL_META) ? " FL_META" : ""); + if (Fl::event_state(FL_META)) ascii -= 0x60; +// printf("using '%c' (0x%02x)...\n", ascii, ascii); + break; +#endif // __APPLE__ + } + + int i; + switch (ascii) { + case ctrl('A'): + return shift_position(line_start(position())) + NORMAL_INPUT_MOVE; + case ctrl('B'): + return shift_position(position()-1) + NORMAL_INPUT_MOVE; + case ctrl('C'): // copy + return copy(1); + case ctrl('D'): + case ctrl('?'): + if (readonly()) { + fl_beep(); + return 1; + } + if (mark() != position()) return cut(); + else return cut(1); + case ctrl('E'): + return shift_position(line_end(position())) + NORMAL_INPUT_MOVE; + case ctrl('F'): + return shift_position(position()+1) + NORMAL_INPUT_MOVE; + case ctrl('H'): + if (readonly()) { + fl_beep(); + return 1; + } + if (mark() != position()) cut(); + else cut(-1); + return 1; + case ctrl('K'): + if (readonly()) { + fl_beep(); + return 1; + } + if (position()>=size()) return 0; + i = line_end(position()); + if (i == position() && i < size()) i++; + cut(position(), i); + return copy_cuts(); + case ctrl('N'): + i = position(); + if (line_end(i) >= size()) return NORMAL_INPUT_MOVE; + while (repeat_num--) { + i = line_end(i); + if (i >= size()) break; + i++; + } + shift_up_down_position(i); + return 1; + case ctrl('P'): + i = position(); + if (!line_start(i)) return NORMAL_INPUT_MOVE; + while(repeat_num--) { + i = line_start(i); + if (!i) break; + i--; + } + shift_up_down_position(line_start(i)); + return 1; + case ctrl('U'): + if (readonly()) { + fl_beep(); + return 1; + } + return cut(0, size()); + case ctrl('V'): + case ctrl('Y'): + if (readonly()) { + fl_beep(); + return 1; + } + Fl::paste(*this, 1); + return 1; + case ctrl('X'): + case ctrl('W'): + if (readonly()) { + fl_beep(); + return 1; + } + copy(1); + return cut(); + case ctrl('Z'): + case ctrl('_'): + if (readonly()) { + fl_beep(); + return 1; + } + return undo(); + case ctrl('I'): + case ctrl('J'): + case ctrl('L'): + case ctrl('M'): + if (readonly()) { + fl_beep(); + return 1; + } + // insert a few selected control characters literally: + if (input_type() != FL_FLOAT_INPUT && input_type() != FL_INT_INPUT) + return replace(position(), mark(), &ascii, 1); + } + + return 0; +} + +int Fl_Input::handle(int event) { + static int dnd_save_position, dnd_save_mark, drag_start = -1, newpos; + static Fl_Widget *dnd_save_focus; + switch (event) { + case FL_FOCUS: + switch (Fl::event_key()) { + case FL_Right: + position(0); + break; + case FL_Left: + position(size()); + break; + case FL_Down: + up_down_position(0); + break; + case FL_Up: + up_down_position(line_start(size())); + break; + case FL_Tab: + case 0xfe20: // XK_ISO_Left_Tab + position(size(),0); + break; + default: + position(position(),mark());// turns off the saved up/down arrow position + break; + } + break; + + case FL_KEYBOARD: + if (Fl::event_key() == FL_Tab && mark() != position()) { + // Set the current cursor position to the end of the selection... + if (mark() > position()) + position(mark()); + else + position(position()); + return (1); + } else { + if (active_r() && window() && this == Fl::belowmouse()) + window()->cursor(FL_CURSOR_NONE); + return handle_key(); + } + + case FL_PUSH: + if (Fl::dnd_text_ops()) { + int oldpos = position(), oldmark = mark(); + Fl_Boxtype b = box(); + Fl_Input_::handle_mouse( + x()+Fl::box_dx(b), y()+Fl::box_dy(b), + w()-Fl::box_dw(b), h()-Fl::box_dh(b), 0); + newpos = position(); + position( oldpos, oldmark ); + if (Fl::focus()==this && !Fl::event_state(FL_SHIFT) && input_type()!=FL_SECRET_INPUT && + (newpos >= mark() && newpos < position() || + newpos >= position() && newpos < mark())) { + // user clicked in the selection, may be trying to drag + drag_start = newpos; + return 1; + } + drag_start = -1; + } + + if (Fl::focus() != this) { + Fl::focus(this); + handle(FL_FOCUS); + } + break; + + case FL_DRAG: + if (Fl::dnd_text_ops()) { + if (drag_start >= 0) { + if (Fl::event_is_click()) return 1; // debounce the mouse + // save the position because sometimes we don't get DND_ENTER: + dnd_save_position = position(); + dnd_save_mark = mark(); + // drag the data: + copy(0); Fl::dnd(); + return 1; + } + } + break; + + case FL_RELEASE: + if (Fl::event_button() == 2) { + Fl::event_is_click(0); // stop double click from picking a word + Fl::paste(*this, 0); + } else if (!Fl::event_is_click()) { + // copy drag-selected text to the clipboard. + copy(0); + } else if (Fl::event_is_click() && drag_start >= 0) { + // user clicked in the field and wants to reset the cursor position... + position(drag_start, drag_start); + drag_start = -1; + } else if (Fl::event_clicks()) { + // user double or triple clicked to select word or whole text + copy(0); + } + + // For output widgets, do the callback so the app knows the user + // did something with the mouse... + if (readonly()) do_callback(); + + return 1; + + case FL_DND_ENTER: + Fl::belowmouse(this); // send the leave events first + dnd_save_position = position(); + dnd_save_mark = mark(); + dnd_save_focus = Fl::focus(); + if (dnd_save_focus != this) { + Fl::focus(this); + handle(FL_FOCUS); + } + // fall through: + case FL_DND_DRAG: + //int p = mouse_position(X, Y, W, H); +#if DND_OUT_XXXX + if (Fl::focus()==this && (p>=dnd_save_position && p<=dnd_save_mark || + p>=dnd_save_mark && p<=dnd_save_position)) { + position(dnd_save_position, dnd_save_mark); + return 0; + } +#endif + { + Fl_Boxtype b = box(); + Fl_Input_::handle_mouse( + x()+Fl::box_dx(b), y()+Fl::box_dy(b), + w()-Fl::box_dw(b), h()-Fl::box_dh(b), 0); + } + return 1; + + case FL_DND_LEAVE: + position(dnd_save_position, dnd_save_mark); +#if DND_OUT_XXXX + if (!focused()) +#endif + if (dnd_save_focus != this) { + Fl::focus(dnd_save_focus); + handle(FL_UNFOCUS); + } + return 1; + + case FL_DND_RELEASE: + take_focus(); + return 1; + + } + Fl_Boxtype b = box(); + return Fl_Input_::handletext(event, + x()+Fl::box_dx(b), y()+Fl::box_dy(b), + w()-Fl::box_dw(b), h()-Fl::box_dh(b)); +} + +Fl_Input::Fl_Input(int X, int Y, int W, int H, const char *l) +: Fl_Input_(X, Y, W, H, l) { +} + +// +// End of "$Id: Fl_Input.cxx 6940 2009-11-17 19:39:01Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Input_.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Input_.cxx new file mode 100644 index 0000000..7642653 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Input_.cxx @@ -0,0 +1,907 @@ +// +// "$Id: Fl_Input_.cxx 6104 2008-04-21 20:54:37Z matt $" +// +// Common input widget routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// This is the base class for Fl_Input. You can use it directly +// if you are one of those people who like to define their own +// set of editing keys. It may also be useful for adding scrollbars +// to the input field. + +#include +#include +#include +#include +#include +#include +#include "flstring.h" +#include +#include + +#define MAXBUF 1024 + +extern void fl_draw(const char*, int, float, float); + +//////////////////////////////////////////////////////////////// + +// Copy string p..e to the buffer, replacing characters with ^X and \nnn +// as necessary. Truncate if necessary so the resulting string and +// null terminator fits in a buffer of size n. Return new end pointer. +const char* Fl_Input_::expand(const char* p, char* buf) const { + char* o = buf; + char* e = buf+(MAXBUF-4); + const char* lastspace = p; + char* lastspace_out = o; + int width_to_lastspace = 0; + int word_count = 0; + int word_wrap; + + if (input_type()==FL_SECRET_INPUT) { + while (o= value_+size_ || isspace(*p & 255))) { + word_wrap = w() - Fl::box_dw(box()) - 2; + width_to_lastspace += (int)fl_width(lastspace_out, o-lastspace_out); + if (p > lastspace+1) { + if (word_count && width_to_lastspace > word_wrap) { + p = lastspace; o = lastspace_out; break; + } + word_count++; + } + lastspace = p; + lastspace_out = o; + } + + if (p >= value_+size_) break; + int c = *p++ & 255; + if (c < ' ' || c == 127) { + if (c=='\n' && input_type()==FL_MULTILINE_INPUT) {p--; break;} + if (c == '\t' && input_type()==FL_MULTILINE_INPUT) { + for (c = (o-buf)%8; c<8 && o= 128 && c < 0xA0) { + // these codes are not defined in ISO code, so we output the octal code instead + // *o++ = '\\'; + // *o++ = ((c>>6)&0x03) + '0'; + // *o++ = ((c>>3)&0x07) + '0'; + // *o++ = (c&0x07) + '0'; + } else if (c == 0xA0) { // nbsp + *o++ = ' '; +#endif + } else { + *o++ = c; + } + } + *o = 0; + return p; +} + +// After filling in such a buffer, find the width to e +double Fl_Input_::expandpos( + const char* p, // real string + const char* e, // pointer into real string + const char* buf, // conversion of real string by expand() + int* returnn // return offset into buf here +) const { + int n = 0; + if (input_type()==FL_SECRET_INPUT) n = e-p; + else while (p= 128 && c < 0xA0) { + // these codes are not defined in ISO code, so we output the octal code instead + // n += 4; +#endif + } else { + n++; + } + } + if (returnn) *returnn = n; + return fl_width(buf, n); +} + +//////////////////////////////////////////////////////////////// + +// minimal update: +// Characters from mu_p to end of widget are redrawn. +// If erase_cursor_only, small part at mu_p is redrawn. +// Right now minimal update just keeps unchanged characters from +// being erased, so they don't blink. + +void Fl_Input_::minimal_update(int p) { + if (damage() & FL_DAMAGE_ALL) return; // don't waste time if it won't be done + if (damage() & FL_DAMAGE_EXPOSE) { + if (p < mu_p) mu_p = p; + } else { + mu_p = p; + } + + damage(FL_DAMAGE_EXPOSE); + erase_cursor_only = 0; +} + +void Fl_Input_::minimal_update(int p, int q) { + if (q < p) p = q; + minimal_update(p); +} + +//////////////////////////////////////////////////////////////// + +static double up_down_pos; +static int was_up_down; + +void Fl_Input_::setfont() const { + fl_font(textfont(), textsize()); +} + +void Fl_Input_::drawtext(int X, int Y, int W, int H) { + int do_mu = !(damage()&FL_DAMAGE_ALL); + + if (Fl::focus()!=this && !size()) { + if (do_mu) { // we have to erase it if cursor was there + draw_box(box(), X-Fl::box_dx(box()), Y-Fl::box_dy(box()), + W+Fl::box_dw(box()), H+Fl::box_dh(box()), color()); + } + return; + } + + int selstart, selend; + if (Fl::focus()!=this && /*Fl::selection_owner()!=this &&*/ Fl::pushed()!=this) + selstart = selend = 0; + else if (position() <= mark()) { + selstart = position(); selend = mark(); + } else { + selend = position(); selstart = mark(); + } + + setfont(); + const char *p, *e; + char buf[MAXBUF]; + + // count how many lines and put the last one into the buffer: + // And figure out where the cursor is: + int height = fl_height(); + int lines; + int curx, cury; + for (p=value(), curx=cury=lines=0; ;) { + e = expand(p, buf); + if (position() >= p-value() && position() <= e-value()) { + curx = int(expandpos(p, value()+position(), buf, 0)+.5); + if (Fl::focus()==this && !was_up_down) up_down_pos = curx; + cury = lines*height; + int newscroll = xscroll_; + if (curx > newscroll+W-20) { + // figure out scrolling so there is space after the cursor: + newscroll = curx+20-W; + // figure out the furthest left we ever want to scroll: + int ex = int(expandpos(p, e, buf, 0))+2-W; + // use minimum of both amounts: + if (ex < newscroll) newscroll = ex; + } else if (curx < newscroll+20) { + newscroll = curx-20; + } + if (newscroll < 0) newscroll = 0; + if (newscroll != xscroll_) { + xscroll_ = newscroll; + mu_p = 0; erase_cursor_only = 0; + } + } + lines++; + if (e >= value_+size_) break; + p = e+1; + } + + // adjust the scrolling: + if (input_type()==FL_MULTILINE_INPUT) { + int newy = yscroll_; + if (cury < newy) newy = cury; + if (cury > newy+H-height) newy = cury-H+height; + if (newy < -1) newy = -1; + if (newy != yscroll_) {yscroll_ = newy; mu_p = 0; erase_cursor_only = 0;} + } else { + yscroll_ = -(H-height)/2; + } + + fl_clip(X, Y, W, H); + Fl_Color tc = active_r() ? textcolor() : fl_inactive(textcolor()); + + p = value(); + // visit each line and draw it: + int desc = height-fl_descent(); + float xpos = (float)(X - xscroll_ + 1); + int ypos = -yscroll_; + for (; ypos < H;) { + + // re-expand line unless it is the last one calculated above: + if (lines>1) e = expand(p, buf); + + if (ypos <= -height) goto CONTINUE; // clipped off top + + if (do_mu) { // for minimal update: + const char* pp = value()+mu_p; // pointer to where minimal update starts + if (e < pp) goto CONTINUE2; // this line is before the changes + if (readonly()) erase_cursor_only = 0; // this isn't the most efficient way + if (erase_cursor_only && p > pp) goto CONTINUE2; // this line is after + // calculate area to erase: + float r = (float)(X+W); + float xx; + if (p >= pp) { + xx = (float)X; + if (erase_cursor_only) r = xpos+2; + else if (readonly()) xx -= 3; + } else { + xx = xpos + (float)expandpos(p, pp, buf, 0); + if (erase_cursor_only) r = xx+2; + else if (readonly()) xx -= 3; + } + // clip to and erase it: + fl_push_clip((int)xx-1-height/8, Y+ypos, (int)(r-xx+2+height/4), height); + draw_box(box(), X-Fl::box_dx(box()), Y-Fl::box_dy(box()), + W+Fl::box_dw(box()), H+Fl::box_dh(box()), color()); + // it now draws entire line over it + // this should not draw letters to left of erased area, but + // that is nyi. + } + + // Draw selection area if required: + if (selstart < selend && selstart <= e-value() && selend > p-value()) { + const char* pp = value()+selstart; + float x1 = xpos; + int offset1 = 0; + if (pp > p) { + fl_color(tc); + x1 += (float)expandpos(p, pp, buf, &offset1); + fl_draw(buf, offset1, xpos, (float)(Y+ypos+desc)); + } + pp = value()+selend; + float x2 = (float)(X+W); + int offset2; + if (pp <= e) x2 = xpos + (float)expandpos(p, pp, buf, &offset2); + else offset2 = strlen(buf); + fl_color(selection_color()); + fl_rectf((int)(x1+0.5), Y+ypos, (int)(x2-x1+0.5), height); + fl_color(fl_contrast(textcolor(), selection_color())); + fl_draw(buf+offset1, offset2-offset1, x1, (float)(Y+ypos+desc)); + if (pp < e) { + fl_color(tc); + fl_draw(buf+offset2, strlen(buf+offset2), x2, (float)(Y+ypos+desc)); + } + } else { + // draw unselected text + fl_color(tc); + fl_draw(buf, strlen(buf), xpos, (float)(Y+ypos+desc)); + } + + if (do_mu) fl_pop_clip(); + + CONTINUE2: + // draw the cursor: + if (Fl::focus() == this && selstart == selend && + position() >= p-value() && position() <= e-value()) { + fl_color(cursor_color()); + if (readonly()) { + fl_line((int)(xpos+curx-2.5f), Y+ypos+height-1, + (int)(xpos+curx+0.5f), Y+ypos+height-4, + (int)(xpos+curx+3.5f), Y+ypos+height-1); + } else { + fl_rectf((int)(xpos+curx+0.5), Y+ypos, 2, height); + } + } + + CONTINUE: + ypos += height; + if (e >= value_+size_) break; + if (*e == '\n' || *e == ' ') e++; + p = e; + } + + // for minimal update, erase all lines below last one if necessary: + if (input_type()==FL_MULTILINE_INPUT && do_mu && ypos= size() || !isword(index(i))) +// while (i > 0 && !isword(index(i-1))) i--; + while (i > 0 && isword(index(i-1))) i--; + return i; +} + +int Fl_Input_::line_end(int i) const { + if (input_type() != FL_MULTILINE_INPUT) return size(); + + if (wrap()) { + // go to the start of the paragraph: + int j = i; + while (j > 0 && index(j-1) != '\n') j--; + // now measure lines until we get past i, end of that line is real eol: + setfont(); + for (const char* p=value()+j; ;) { + char buf[MAXBUF]; + p = expand(p, buf); + if (p-value() >= i) return p-value(); + p++; + } + } else { + while (i < size() && index(i) != '\n') i++; + return i; + } +} + +int Fl_Input_::line_start(int i) const { + if (input_type() != FL_MULTILINE_INPUT) return 0; + int j = i; + while (j > 0 && index(j-1) != '\n') j--; + if (wrap()) { + // now measure lines until we get past i, start of that line is real eol: + setfont(); + for (const char* p=value()+j; ;) { + char buf[MAXBUF]; + const char* e = expand(p, buf); + if (e-value() >= i) return p-value(); + p = e+1; + } + } else return j; +} + +void Fl_Input_::handle_mouse(int X, int Y, int /*W*/, int /*H*/, int drag) { + was_up_down = 0; + if (!size()) return; + setfont(); + + const char *p, *e; + char buf[MAXBUF]; + + int theline = (input_type()==FL_MULTILINE_INPUT) ? + (Fl::event_y()-Y+yscroll_)/fl_height() : 0; + + int newpos = 0; + for (p=value();; ) { + e = expand(p, buf); + theline--; if (theline < 0) break; + if (e >= value_+size_) break; + p = e+1; + } + const char *l, *r, *t; double f0 = Fl::event_x()-X+xscroll_; + for (l = p, r = e; l= newmark) { + if (newpos == newmark) { + if (newpos < size()) newpos++; + else newmark--; + } + if (Fl::event_clicks() > 1) { + newpos = line_end(newpos); + newmark = line_start(newmark); + } else { + newpos = word_end(newpos); + newmark = word_start(newmark); + } + } else { + if (Fl::event_clicks() > 1) { + newpos = line_start(newpos); + newmark = line_end(newmark); + } else { + newpos = word_start(newpos); + newmark = word_end(newmark); + } + } + // if the multiple click does not increase the selection, revert + // to single-click behavior: + if (!drag && (mark() > position() ? + (newmark >= position() && newpos <= mark()) : + (newmark >= mark() && newpos <= position()))) { + Fl::event_clicks(0); + newmark = newpos = l-value(); + } + } + position(newpos, newmark); +} + +int Fl_Input_::position(int p, int m) { + was_up_down = 0; + if (p<0) p = 0; + if (p>size()) p = size(); + if (m<0) m = 0; + if (m>size()) m = size(); + if (p == position_ && m == mark_) return 0; + //if (Fl::selection_owner() == this) Fl::selection_owner(0); + if (p != m) { + if (p != position_) minimal_update(position_, p); + if (m != mark_) minimal_update(mark_, m); + } else { + // new position is a cursor + if (position_ == mark_) { + // old position was just a cursor + if (Fl::focus() == this && !(damage()&FL_DAMAGE_EXPOSE)) { + minimal_update(position_); erase_cursor_only = 1; + } + } else { // old position was a selection + minimal_update(position_, mark_); + } + } + position_ = p; + mark_ = m; + return 1; +} + +int Fl_Input_::up_down_position(int i, int keepmark) { + // unlike before, i must be at the start of the line already! + + setfont(); + char buf[MAXBUF]; + const char* p = value()+i; + const char* e = expand(p, buf); + const char *l, *r, *t; + for (l = p, r = e; l e) {b = mark(); e = position();} + if (input_type() == FL_SECRET_INPUT) e = b; + Fl::copy(value()+b, e-b, clipboard); + return 1; + } + return 0; +} + +#define MAXFLOATSIZE 40 + +static char* undobuffer; +static int undobufferlength; +static Fl_Input_* undowidget; +static int undoat; // points after insertion +static int undocut; // number of characters deleted there +static int undoinsert; // number of characters inserted +static int yankcut; // length of valid contents of buffer, even if undocut=0 + +static void undobuffersize(int n) { + if (n > undobufferlength) { + if (undobuffer) { + do {undobufferlength *= 2;} while (undobufferlength < n); + undobuffer = (char*)realloc(undobuffer, undobufferlength); + } else { + undobufferlength = n+9; + undobuffer = (char*)malloc(undobufferlength); + } + } +} + +// all changes go through here, delete characters b-e and insert text: +int Fl_Input_::replace(int b, int e, const char* text, int ilen) { + + was_up_down = 0; + + if (b<0) b = 0; + if (e<0) e = 0; + if (b>size_) b = size_; + if (e>size_) e = size_; + if (e maximum_size_) { + ilen = maximum_size_-size_+(e-b); + if (ilen < 0) ilen = 0; + } + + put_in_buffer(size_+ilen); + + if (e>b) { + if (undowidget == this && b == undoat) { + undobuffersize(undocut+(e-b)); + memcpy(undobuffer+undocut, value_+b, e-b); + undocut += e-b; + } else if (undowidget == this && e == undoat && !undoinsert) { + undobuffersize(undocut+(e-b)); + memmove(undobuffer+(e-b), undobuffer, undocut); + memcpy(undobuffer, value_+b, e-b); + undocut += e-b; + } else if (undowidget == this && e == undoat && (e-b) 0 && !isspace(index(b) & 255) && index(b)!='\n') b--; + else + while (b > 0 && index(b)!='\n') b--; + } + + // make sure we redraw the old selection or cursor: + if (mark_ < b) b = mark_; + if (position_ < b) b = position_; + + minimal_update(b); + + mark_ = position_ = undoat; + + set_changed(); + if (when()&FL_WHEN_CHANGED) do_callback(); + return 1; +} + +int Fl_Input_::undo() { + was_up_down = 0; + if (undowidget != this || !undocut && !undoinsert) return 0; + + int ilen = undocut; + int xlen = undoinsert; + int b = undoat-xlen; + int b1 = b; + + put_in_buffer(size_+ilen); + + if (ilen) { + memmove(buffer+b+ilen, buffer+b, size_-b+1); + memcpy(buffer+b, undobuffer, ilen); + size_ += ilen; + b += ilen; + } + + if (xlen) { + undobuffersize(xlen); + memcpy(undobuffer, buffer+b, xlen); + memmove(buffer+b, buffer+b+xlen, size_-xlen-b+1); + size_ -= xlen; + } + + undocut = xlen; + if (xlen) yankcut = xlen; + undoinsert = ilen; + undoat = b; + mark_ = b /* -ilen */; + position_ = b; + + if (wrap()) + while (b1 > 0 && index(b1)!='\n') b1--; + minimal_update(b1); + set_changed(); + if (when()&FL_WHEN_CHANGED) do_callback(); + return 1; +} + +int Fl_Input_::copy_cuts() { + // put the yank buffer into the X clipboard + if (!yankcut || input_type()==FL_SECRET_INPUT) return 0; + Fl::copy(undobuffer, yankcut, 1); + return 1; +} + +void Fl_Input_::maybe_do_callback() { + if (changed() || (when()&FL_WHEN_NOT_CHANGED)) { + do_callback(); + } +} + +int Fl_Input_::handletext(int event, int X, int Y, int W, int H) { + switch (event) { + + case FL_ENTER: + case FL_MOVE: + if (active_r() && window()) window()->cursor(FL_CURSOR_INSERT); + return 1; + + case FL_LEAVE: + if (active_r() && window()) window()->cursor(FL_CURSOR_DEFAULT); + return 1; + + case FL_FOCUS: + if (mark_ == position_) { + minimal_update(size()+1); + } else //if (Fl::selection_owner() != this) + minimal_update(mark_, position_); + return 1; + + case FL_UNFOCUS: + if (active_r() && window()) window()->cursor(FL_CURSOR_DEFAULT); + if (mark_ == position_) { + if (!(damage()&FL_DAMAGE_EXPOSE)) {minimal_update(position_); erase_cursor_only = 1;} + } else //if (Fl::selection_owner() != this) + minimal_update(mark_, position_); + case FL_HIDE: + if (!readonly() && (when() & FL_WHEN_RELEASE)) + maybe_do_callback(); + return 1; + + case FL_PUSH: + if (active_r() && window()) window()->cursor(FL_CURSOR_INSERT); + + handle_mouse(X, Y, W, H, Fl::event_state(FL_SHIFT)); + + if (Fl::focus() != this) { + Fl::focus(this); + handle(FL_FOCUS); + } + return 1; + + case FL_DRAG: + handle_mouse(X, Y, W, H, 1); + return 1; + + case FL_RELEASE: + copy(0); + return 1; + + case FL_PASTE: { + // Don't allow pastes into readonly widgets... + if (readonly()) { + fl_beep(FL_BEEP_ERROR); + return 1; + } + + // See if we have anything to paste... + if (!Fl::event_text() || !Fl::event_length()) return 1; + + // strip trailing control characters and spaces before pasting: + const char* t = Fl::event_text(); + const char* e = t+Fl::event_length(); + if (input_type() != FL_MULTILINE_INPUT) while (e > t && isspace(*(e-1) & 255)) e--; + if (!t || e <= t) return 1; // Int/float stuff will crash without this test + if (input_type() == FL_INT_INPUT) { + while (isspace(*t & 255) && t < e) t ++; + const char *p = t; + if (*p == '+' || *p == '-') p ++; + if (strncmp(p, "0x", 2) == 0) { + p += 2; + while (isxdigit(*p & 255) && p < e) p ++; + } else { + while (isdigit(*p & 255) && p < e) p ++; + } + if (p < e) { + fl_beep(FL_BEEP_ERROR); + return 1; + } else return replace(0, size(), t, e - t); + } else if (input_type() == FL_FLOAT_INPUT) { + while (isspace(*t & 255) && t < e) t ++; + const char *p = t; + if (*p == '+' || *p == '-') p ++; + while (isdigit(*p & 255) && p < e) p ++; + if (*p == '.') { + p ++; + while (isdigit(*p & 255) && p < e) p ++; + if (*p == 'e' || *p == 'E') { + p ++; + if (*p == '+' || *p == '-') p ++; + while (isdigit(*p & 255) && p < e) p ++; + } + } + if (p < e) { + fl_beep(FL_BEEP_ERROR); + return 1; + } else return replace(0, size(), t, e - t); + } + return replace(position(), mark(), t, e-t);} + + default: + return 0; + } +} + +/*------------------------------*/ + +Fl_Input_::Fl_Input_(int X, int Y, int W, int H, const char* l) +: Fl_Widget(X, Y, W, H, l) { + box(FL_DOWN_BOX); + color(FL_BACKGROUND2_COLOR, FL_SELECTION_COLOR); + align(FL_ALIGN_LEFT); + textsize_ = (uchar)FL_NORMAL_SIZE; + textfont_ = FL_HELVETICA; + textcolor_ = FL_FOREGROUND_COLOR; + cursor_color_ = FL_FOREGROUND_COLOR; // was FL_BLUE + mark_ = position_ = size_ = 0; + bufsize = 0; + buffer = 0; + value_ = ""; + xscroll_ = yscroll_ = 0; + maximum_size_ = 32767; +} + +void Fl_Input_::put_in_buffer(int len) { + if (value_ == buffer && bufsize > len) { + buffer[size_] = 0; + return; + } + if (!bufsize) { + if (len > size_) len += 9; // let a few characters insert before realloc + bufsize = len+1; + buffer = (char*)malloc(bufsize); + } else if (bufsize <= len) { + // we may need to move old value in case it points into buffer: + int moveit = (value_ >= buffer && value_ < buffer+bufsize); + // enlarge current buffer + if (len > size_) { + do {bufsize *= 2;} while (bufsize <= len); + } else { + bufsize = len+1; + } + // Note: the following code is equivalent to: + // + // if (moveit) value_ = value_ - buffer; + // char* nbuffer = (char*)realloc(buffer, bufsize); + // if (moveit) value_ = value_ + nbuffer; + // buffer = nbuffer; + // + // We just optimized the pointer arithmetic for value_... + // + char* nbuffer = (char*)realloc(buffer, bufsize); + if (moveit) value_ += (nbuffer-buffer); + buffer = nbuffer; + } + memmove(buffer, value_, size_); buffer[size_] = 0; + value_ = buffer; +} + +int Fl_Input_::static_value(const char* str, int len) { + clear_changed(); + if (undowidget == this) undowidget = 0; + if (str == value_ && len == size_) return 0; + if (len) { // non-empty new value: + if (xscroll_ || yscroll_) { + xscroll_ = yscroll_ = 0; + minimal_update(0); + } else { + int i = 0; + // find first different character: + if (value_) { + for (; i +#include +#include +#include +#include + + +// Some releases of the Cygwin JPEG libraries don't have a correctly +// updated header file for the INT32 data type; the following define +// from Shane Hill seems to be a usable workaround... + +#if defined(WIN32) && defined(__CYGWIN__) +# define XMD_H +#endif // WIN32 && __CYGWIN__ + + +extern "C" +{ +#ifdef HAVE_LIBJPEG +# include +#endif // HAVE_LIBJPEG +} + + +// +// Custom JPEG error handling structure... +// + +#ifdef HAVE_LIBJPEG +struct fl_jpeg_error_mgr { + jpeg_error_mgr pub_; // Destination manager... + jmp_buf errhand_; // Error handler +}; +#endif // HAVE_LIBJPEG + + +// +// Error handler for JPEG files... +// + +#ifdef HAVE_LIBJPEG +extern "C" { + static void + fl_jpeg_error_handler(j_common_ptr dinfo) { // I - Decompressor info + longjmp(((fl_jpeg_error_mgr *)(dinfo->err))->errhand_, 1); + } + + static void + fl_jpeg_output_handler(j_common_ptr) { // I - Decompressor info (not used) + } +} +#endif // HAVE_LIBJPEG + + +// +// 'Fl_JPEG_Image::Fl_JPEG_Image()' - Load a JPEG image file. +// + +Fl_JPEG_Image::Fl_JPEG_Image(const char *jpeg) // I - File to load + : Fl_RGB_Image(0,0,0) { +#ifdef HAVE_LIBJPEG + FILE *fp; // File pointer + jpeg_decompress_struct dinfo; // Decompressor info + fl_jpeg_error_mgr jerr; // Error handler info + JSAMPROW row; // Sample row pointer + + // the following variables are pointers allocating some private space that + // is not reset by 'setjmp()' + char* max_finish_decompress_err; // count errors and give up afer a while + char* max_destroy_decompress_err; // to avoid recusion and deadlock + + // Clear data... + alloc_array = 0; + array = (uchar *)0; + + // Open the image file... + if ((fp = fopen(jpeg, "rb")) == NULL) return; + + // Setup the decompressor info and read the header... + dinfo.err = jpeg_std_error((jpeg_error_mgr *)&jerr); + jerr.pub_.error_exit = fl_jpeg_error_handler; + jerr.pub_.output_message = fl_jpeg_output_handler; + + // Setup error loop variables + max_finish_decompress_err = (char*)malloc(1); // allocate space on the frame for error counters + max_destroy_decompress_err = (char*)malloc(1); // otherwise, the variables are reset on the longjmp + *max_finish_decompress_err=10; + *max_destroy_decompress_err=10; + + if (setjmp(jerr.errhand_)) + { + // JPEG error handling... + // if any of the cleanup routines hits another error, we would end up + // in a loop. So instead, we decrement max_err for some upper cleanup limit. + if ( ((*max_finish_decompress_err)-- > 0) && array) + jpeg_finish_decompress(&dinfo); + if ( (*max_destroy_decompress_err)-- > 0) + jpeg_destroy_decompress(&dinfo); + + fclose(fp); + + w(0); + h(0); + d(0); + + if (array) { + delete[] (uchar *)array; + array = 0; + alloc_array = 0; + } + + free(max_destroy_decompress_err); + free(max_finish_decompress_err); + + return; + } + + jpeg_create_decompress(&dinfo); + jpeg_stdio_src(&dinfo, fp); + jpeg_read_header(&dinfo, 1); + + dinfo.quantize_colors = (boolean)FALSE; + dinfo.out_color_space = JCS_RGB; + dinfo.out_color_components = 3; + dinfo.output_components = 3; + + jpeg_calc_output_dimensions(&dinfo); + + w(dinfo.output_width); + h(dinfo.output_height); + d(dinfo.output_components); + + array = new uchar[w() * h() * d()]; + alloc_array = 1; + + jpeg_start_decompress(&dinfo); + + while (dinfo.output_scanline < dinfo.output_height) { + row = (JSAMPROW)(array + + dinfo.output_scanline * dinfo.output_width * + dinfo.output_components); + jpeg_read_scanlines(&dinfo, &row, (JDIMENSION)1); + } + + jpeg_finish_decompress(&dinfo); + jpeg_destroy_decompress(&dinfo); + + free(max_destroy_decompress_err); + free(max_finish_decompress_err); + + fclose(fp); +#endif // HAVE_LIBJPEG +} + +// +// End of "$Id: Fl_JPEG_Image.cxx 5845 2007-05-20 00:01:06Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Light_Button.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Light_Button.cxx new file mode 100644 index 0000000..76d865a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Light_Button.cxx @@ -0,0 +1,169 @@ +// +// "$Id: Fl_Light_Button.cxx 5721 2007-02-27 19:23:24Z matt $" +// +// Lighted button widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Subclass of Fl_Button where the "box" indicates whether it is +// pushed or not, and the "down box" is drawn small and square on +// the left to indicate the current state. + +// The default down_box of zero draws a rectangle designed to look +// just like Flame's buttons. + +#include +#include +#include +#include "flstring.h" + +void Fl_Light_Button::draw() { + if (box()) draw_box(this==Fl::pushed() ? fl_down(box()) : box(), color()); + Fl_Color col = value() ? (active_r() ? selection_color() : + fl_inactive(selection_color())) : color(); + int W; + int dx, dy; + + W = labelsize(); + dx = Fl::box_dx(box()) + 2; + dy = (h() - W) / 2; + // if (dy < 0) dy = 0; // neg. offset o.k. for vertical centering + + if (down_box()) { + // draw other down_box() styles: + switch (down_box()) { + case FL_DOWN_BOX : + case FL_UP_BOX : + case _FL_PLASTIC_DOWN_BOX : + case _FL_PLASTIC_UP_BOX : + // Check box... + draw_box(down_box(), x()+dx, y()+dy, W, W, FL_BACKGROUND2_COLOR); + if (value()) { + if (Fl::scheme() && !strcmp(Fl::scheme(), "gtk+")) { + fl_color(FL_SELECTION_COLOR); + } else { + fl_color(col); + } + int tx = x() + dx + 3; + int tw = W - 6; + int d1 = tw/3; + int d2 = tw-d1; + int ty = y() + dy + (W+d2)/2-d1-2; + for (int n = 0; n < 3; n++, ty++) { + fl_line(tx, ty, tx+d1, ty+d1); + fl_line(tx+d1, ty+d1, tx+tw-1, ty+d1-d2+1); + } + } + break; + case _FL_ROUND_DOWN_BOX : + case _FL_ROUND_UP_BOX : + // Radio button... + draw_box(down_box(), x()+dx, y()+dy, W, W, FL_BACKGROUND2_COLOR); + if (value()) { + int tW = (W - Fl::box_dw(down_box())) / 2 + 1; + if ((W - tW) & 1) tW++; // Make sure difference is even to center + int tdx = dx + (W - tW) / 2; + int tdy = dy + (W - tW) / 2; + + if (Fl::scheme() && !strcmp(Fl::scheme(), "gtk+")) { + fl_color(FL_SELECTION_COLOR); + tW --; + fl_pie(x() + tdx - 1, y() + tdy - 1, tW + 3, tW + 3, 0.0, 360.0); + fl_arc(x() + tdx - 1, y() + tdy - 1, tW + 3, tW + 3, 0.0, 360.0); + fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.2f)); + } else fl_color(col); + + switch (tW) { + // Larger circles draw fine... + default : + fl_pie(x() + tdx, y() + tdy, tW, tW, 0.0, 360.0); + break; + + // Small circles don't draw well on many systems... + case 6 : + fl_rectf(x() + tdx + 2, y() + tdy, tW - 4, tW); + fl_rectf(x() + tdx + 1, y() + tdy + 1, tW - 2, tW - 2); + fl_rectf(x() + tdx, y() + tdy + 2, tW, tW - 4); + break; + + case 5 : + case 4 : + case 3 : + fl_rectf(x() + tdx + 1, y() + tdy, tW - 2, tW); + fl_rectf(x() + tdx, y() + tdy + 1, tW, tW - 2); + break; + + case 2 : + case 1 : + fl_rectf(x() + tdx, y() + tdy, tW, tW); + break; + } + + if (Fl::scheme() && !strcmp(Fl::scheme(), "gtk+")) { + fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.5)); + fl_arc(x() + tdx, y() + tdy, tW + 1, tW + 1, 60.0, 180.0); + } + } + break; + default : + draw_box(down_box(), x()+dx, y()+dy, W, W, col); + break; + } + } else { + // if down_box() is zero, draw light button style: + int hh = h()-2*dy - 2; + int ww = W/2+1; + int xx = dx; + if (w() +#include +#include +#include +#include +#include "flstring.h" + +#ifdef __APPLE__ +# include +#endif + +int Fl_Menu_Item::size() const { + const Fl_Menu_Item* m = this; + int nest = 0; + for (;;) { + if (!m->text) { + if (!nest) return (m-this+1); + nest--; + } else if (m->flags & FL_SUBMENU) { + nest++; + } + m++; + } +} + +const Fl_Menu_Item* Fl_Menu_Item::next(int n) const { + if (n < 0) return 0; // this is so selected==-1 returns NULL + const Fl_Menu_Item* m = this; + int nest = 0; + if (!m->visible()) n++; + while (n>0) { + if (!m->text) { + if (!nest) return m; + nest--; + } else if (m->flags&FL_SUBMENU) { + nest++; + } + m++; + if (!nest && m->visible()) n--; + } + return m; +} + +// appearance of current menus are pulled from this parent widget: +static const Fl_Menu_* button; + +//////////////////////////////////////////////////////////////// + +// tiny window for title of menu: +class menutitle : public Fl_Menu_Window { + void draw(); +public: + const Fl_Menu_Item* menu; + menutitle(int X, int Y, int W, int H, const Fl_Menu_Item*); +}; + +// each vertical menu has one of these: +class menuwindow : public Fl_Menu_Window { + void draw(); + void drawentry(const Fl_Menu_Item*, int i, int erase); +public: + menutitle* title; + int handle(int); +#ifdef __APPLE__ + int early_hide_handle(int); +#endif + int itemheight; // zero == menubar + int numitems; + int selected; + int drawn_selected; // last redraw has this selected + const Fl_Menu_Item* menu; + menuwindow(const Fl_Menu_Item* m, int X, int Y, int W, int H, + const Fl_Menu_Item* picked, const Fl_Menu_Item* title, + int menubar = 0, int menubar_title = 0, int right_edge = 0); + ~menuwindow(); + void set_selected(int); + int find_selected(int mx, int my); + int titlex(int); + void autoscroll(int); + void position(int x, int y); + int is_inside(int x, int y); +}; + +#define LEADING 4 // extra vertical leading + +extern char fl_draw_shortcut; + +// width of label, including effect of & characters: +int Fl_Menu_Item::measure(int* hp, const Fl_Menu_* m) const { + Fl_Label l; + l.value = text; + l.image = 0; + l.deimage = 0; + l.type = labeltype_; + l.font = labelsize_ || labelfont_ ? labelfont_ : uchar(m ? m->textfont() : FL_HELVETICA); + l.size = labelsize_ ? labelsize_ : m ? m->textsize() : (uchar)FL_NORMAL_SIZE; + l.color = FL_FOREGROUND_COLOR; // this makes no difference? + fl_draw_shortcut = 1; + int w = 0; int h = 0; + l.measure(w, hp ? *hp : h); + fl_draw_shortcut = 0; + if (flags & (FL_MENU_TOGGLE|FL_MENU_RADIO)) w += 14; + return w; +} + +void Fl_Menu_Item::draw(int x, int y, int w, int h, const Fl_Menu_* m, + int selected) const { + Fl_Label l; + l.value = text; + l.image = 0; + l.deimage = 0; + l.type = labeltype_; + l.font = labelsize_ || labelfont_ ? labelfont_ : uchar(m ? m->textfont() : FL_HELVETICA); + l.size = labelsize_ ? labelsize_ : m ? m->textsize() : (uchar)FL_NORMAL_SIZE; + l.color = labelcolor_ ? labelcolor_ : m ? m->textcolor() : int(FL_FOREGROUND_COLOR); + if (!active()) l.color = fl_inactive((Fl_Color)l.color); + Fl_Color color = m ? m->color() : FL_GRAY; + if (selected) { + Fl_Color r = m ? m->selection_color() : FL_SELECTION_COLOR; + Fl_Boxtype b = m && m->down_box() ? m->down_box() : FL_FLAT_BOX; + if (fl_contrast(r,color)!=r) { // back compatability boxtypes + if (selected == 2) { // menu title + r = color; + b = m ? m->box() : FL_UP_BOX; + } else { + r = (Fl_Color)(FL_COLOR_CUBE-1); // white + l.color = fl_contrast((Fl_Color)labelcolor_, r); + } + } else { + l.color = fl_contrast((Fl_Color)labelcolor_, r); + } + if (selected == 2) { // menu title + fl_draw_box(b, x, y, w, h, r); + x += 3; + w -= 8; + } else { + fl_draw_box(b, x+1, y-(LEADING-2)/2, w-2, h+(LEADING-2), r); + } + } + + if (flags & (FL_MENU_TOGGLE|FL_MENU_RADIO)) { + int d = (h - FL_NORMAL_SIZE + 1) / 2; + int W = h - 2 * d; + + if (flags & FL_MENU_RADIO) { + fl_draw_box(FL_ROUND_DOWN_BOX, x+2, y+d, W, W, FL_BACKGROUND2_COLOR); + if (value()) { + int tW = (W - Fl::box_dw(FL_ROUND_DOWN_BOX)) / 2 + 1; + if ((W - tW) & 1) tW++; // Make sure difference is even to center + int td = Fl::box_dx(FL_ROUND_DOWN_BOX) + 1; + if (Fl::scheme()) { + // Offset the radio circle... + td ++; + + if (!strcmp(Fl::scheme(), "gtk+")) { + fl_color(FL_SELECTION_COLOR); + tW --; + fl_pie(x + td + 1, y + d + td - 1, tW + 3, tW + 3, 0.0, 360.0); + fl_arc(x + td + 1, y + d + td - 1, tW + 3, tW + 3, 0.0, 360.0); + fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.2f)); + } else fl_color(labelcolor_); + } else fl_color(labelcolor_); + + switch (tW) { + // Larger circles draw fine... + default : + fl_pie(x + td + 2, y + d + td, tW, tW, 0.0, 360.0); + break; + + // Small circles don't draw well on many systems... + case 6 : + fl_rectf(x + td + 4, y + d + td, tW - 4, tW); + fl_rectf(x + td + 3, y + d + td + 1, tW - 2, tW - 2); + fl_rectf(x + td + 2, y + d + td + 2, tW, tW - 4); + break; + + case 5 : + case 4 : + case 3 : + fl_rectf(x + td + 3, y + d + td, tW - 2, tW); + fl_rectf(x + td + 2, y + d + td + 1, tW, tW - 2); + break; + + case 2 : + case 1 : + fl_rectf(x + td + 2, y + d + td, tW, tW); + break; + } + + if (Fl::scheme() && !strcmp(Fl::scheme(), "gtk+")) { + fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.5)); + fl_arc(x + td + 2, y + d + td, tW + 1, tW + 1, 60.0, 180.0); + } + } + } else { + fl_draw_box(FL_DOWN_BOX, x+2, y+d, W, W, FL_BACKGROUND2_COLOR); + if (value()) { + if (Fl::scheme() && !strcmp(Fl::scheme(), "gtk+")) { + fl_color(FL_SELECTION_COLOR); + } else { + fl_color(labelcolor_); + } + int tx = x + 5; + int tw = W - 6; + int d1 = tw/3; + int d2 = tw-d1; + int ty = y + d + (W+d2)/2-d1-2; + for (int n = 0; n < 3; n++, ty++) { + fl_line(tx, ty, tx+d1, ty+d1); + fl_line(tx+d1, ty+d1, tx+tw-1, ty+d1-d2+1); + } + } + } + x += W + 3; + w -= W + 3; + } + + if (!fl_draw_shortcut) fl_draw_shortcut = 1; + l.draw(x+3, y, w>6 ? w-6 : 0, h, FL_ALIGN_LEFT); + fl_draw_shortcut = 0; +} + +menutitle::menutitle(int X, int Y, int W, int H, const Fl_Menu_Item* L) : + Fl_Menu_Window(X, Y, W, H, 0) { + end(); + set_modal(); + clear_border(); + menu = L; + if (L->labelcolor_ || Fl::scheme() || L->labeltype_ > FL_NO_LABEL) clear_overlay(); +} + +menuwindow::menuwindow(const Fl_Menu_Item* m, int X, int Y, int Wp, int Hp, + const Fl_Menu_Item* picked, const Fl_Menu_Item* t, + int menubar, int menubar_title, int right_edge) + : Fl_Menu_Window(X, Y, Wp, Hp, 0) +{ + int scr_x, scr_y, scr_w, scr_h; + int tx = X, ty = Y; + + Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h); + if (!right_edge || right_edge > scr_x+scr_w) right_edge = scr_x+scr_w; + + end(); + set_modal(); + clear_border(); + menu = m; + if (m) m = m->first(); // find the first item that needs to be rendered + drawn_selected = -1; + if (button) { + box(button->box()); + if (box() == FL_NO_BOX || box() == FL_FLAT_BOX) box(FL_UP_BOX); + } else { + box(FL_UP_BOX); + } + color(button && !Fl::scheme() ? button->color() : FL_GRAY); + selected = -1; + {int j = 0; + if (m) for (const Fl_Menu_Item* m1=m; ; m1 = m1->next(), j++) { + if (picked) { + if (m1 == picked) {selected = j; picked = 0;} + else if (m1 > picked) {selected = j-1; picked = 0; Wp = Hp = 0;} + } + if (!m1->text) break; + } + numitems = j;} + + if (menubar) { + itemheight = 0; + title = 0; + return; + } + + itemheight = 1; + + int hotKeysw = 0; + int Wtitle = 0; + int Htitle = 0; + if (t) Wtitle = t->measure(&Htitle, button) + 12; + int W = 0; + if (m) for (; m->text; m = m->next()) { + int hh; int w1 = m->measure(&hh, button); + if (hh+LEADING>itemheight) itemheight = hh+LEADING; + if (m->flags&(FL_SUBMENU|FL_SUBMENU_POINTER)) w1 += 14; + if (w1 > W) W = w1; + if (m->shortcut_) { + w1 = int(fl_width(fl_shortcut_label(m->shortcut_))) + 8; + if (w1 > hotKeysw) hotKeysw = w1; + } + if (m->labelcolor_ || Fl::scheme() || m->labeltype_ > FL_NO_LABEL) clear_overlay(); + } + if (selected >= 0 && !Wp) X -= W/2; + int BW = Fl::box_dx(box()); + W += hotKeysw+2*BW+7; + if (Wp > W) W = Wp; + if (Wtitle > W) W = Wtitle; + + if (X < scr_x) X = scr_x; if (X > scr_x+scr_w-W) X = right_edge-W; // X= scr_x+scr_w-W; + x(X); w(W); + h((numitems ? itemheight*numitems-LEADING : 0)+2*BW+3); + if (selected >= 0) + Y = Y+(Hp-itemheight)/2-selected*itemheight-BW; + else { + Y = Y+Hp; + // if the menu hits the bottom of the screen, we try to draw + // it above the menubar instead. We will not adjust any menu + // that has a selected item. + if (Y+h()>scr_y+scr_h && Y-h()>=scr_y) { + if (Hp>1) + // if we know the height of the Fl_Menu_, use it + Y = Y-Hp-h(); + else if (t) + // assume that the menubar item height relates to the first + // menuitem as well + Y = Y-itemheight-h()-Fl::box_dh(box()); + else + // draw the menu to the right + Y = Y-h()+itemheight+Fl::box_dy(box()); + } + } + if (m) y(Y); else {y(Y-2); w(1); h(1);} + + if (t) { + if (menubar_title) { + int dy = Fl::box_dy(button->box())+1; + int ht = button->h()-dy*2; + title = new menutitle(tx, ty-ht-dy, Wtitle, ht, t); + } else { + int dy = 2; + int ht = Htitle+2*BW+3; + title = new menutitle(X, Y-ht-dy, Wtitle, ht, t); + } + } else + title = 0; +} + +menuwindow::~menuwindow() { + hide(); + delete title; +} + +void menuwindow::position(int X, int Y) { + if (title) {title->position(X, title->y()+Y-y());} + Fl_Menu_Window::position(X, Y); + // x(X); y(Y); // don't wait for response from X +} + +// scroll so item i is visible on screen +void menuwindow::autoscroll(int n) { + int scr_x, scr_y, scr_w, scr_h; + int Y = y()+Fl::box_dx(box())+2+n*itemheight; + + Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h); + if (Y <= scr_y) Y = scr_y-Y+10; + else { + Y = Y+itemheight-scr_h-scr_y; + if (Y < 0) return; + Y = -Y-10; + } + Fl_Menu_Window::position(x(), y()+Y); + // y(y()+Y); // don't wait for response from X +} + +//////////////////////////////////////////////////////////////// + +void menuwindow::drawentry(const Fl_Menu_Item* m, int n, int eraseit) { + if (!m) return; // this happens if -1 is selected item and redrawn + + int BW = Fl::box_dx(box()); + int xx = BW; + int W = w(); + int ww = W-2*BW-1; + int yy = BW+1+n*itemheight; + int hh = itemheight - LEADING; + + if (eraseit && n != selected) { + fl_push_clip(xx+1, yy-(LEADING-2)/2, ww-2, hh+(LEADING-2)); + draw_box(box(), 0, 0, w(), h(), button ? button->color() : color()); + fl_pop_clip(); + } + + m->draw(xx, yy, ww, hh, button, n==selected); + + // the shortcuts and arrows assumme fl_color() was left set by draw(): + if (m->submenu()) { + int sz = (hh-7)&-2; + int y1 = yy+(hh-sz)/2; + int x1 = xx+ww-sz-3; + fl_polygon(x1+2, y1, x1+2, y1+sz, x1+sz/2+2, y1+sz/2); + } else if (m->shortcut_) { + Fl_Font f = m->labelsize_ || m->labelfont_ ? (Fl_Font)m->labelfont_ : + button ? button->textfont() : FL_HELVETICA; + fl_font(f, m->labelsize_ ? m->labelsize_ : + button ? button->textsize() : FL_NORMAL_SIZE); + fl_draw(fl_shortcut_label(m->shortcut_), xx, yy, ww-3, hh, FL_ALIGN_RIGHT); + } + + if (m->flags & FL_MENU_DIVIDER) { + fl_color(FL_DARK3); + fl_xyline(BW-1, yy+hh+(LEADING-2)/2, W-2*BW+2); + fl_color(FL_LIGHT3); + fl_xyline(BW-1, yy+hh+((LEADING-2)/2+1), W-2*BW+2); + } +} + +void menutitle::draw() { + menu->draw(0, 0, w(), h(), button, 2); +} + +void menuwindow::draw() { + if (damage() != FL_DAMAGE_CHILD) { // complete redraw + fl_draw_box(box(), 0, 0, w(), h(), button ? button->color() : color()); + if (menu) { + const Fl_Menu_Item* m; int j; + for (m=menu->first(), j=0; m->text; j++, m = m->next()) drawentry(m, j, 0); + } + } else { + if (damage() & FL_DAMAGE_CHILD && selected!=drawn_selected) { // change selection + drawentry(menu->next(drawn_selected), drawn_selected, 1); + drawentry(menu->next(selected), selected, 1); + } + } + drawn_selected = selected; +} + +void menuwindow::set_selected(int n) { + if (n != selected) {selected = n; damage(FL_DAMAGE_CHILD);} +} + +//////////////////////////////////////////////////////////////// + +int menuwindow::find_selected(int mx, int my) { + if (!menu || !menu->text) return -1; + mx -= x(); + my -= y(); + if (my < 0 || my >= h()) return -1; + if (!itemheight) { // menubar + int xx = 3; int n = 0; + const Fl_Menu_Item* m = menu ? menu->first() : 0; + for (; ; m = m->next(), n++) { + if (!m->text) return -1; + xx += m->measure(0, button) + 16; + if (xx > mx) break; + } + return n; + } + if (mx < Fl::box_dx(box()) || mx >= w()) return -1; + int n = (my-Fl::box_dx(box())-1)/itemheight; + if (n < 0 || n>=numitems) return -1; + return n; +} + +// return horizontal position for item n in a menubar: +int menuwindow::titlex(int n) { + const Fl_Menu_Item* m; + int xx = 3; + for (m=menu->first(); n--; m = m->next()) xx += m->measure(0, button) + 16; + return xx; +} + +// return 1, if the given root coordinates are inside the window +int menuwindow::is_inside(int mx, int my) { + if ( mx < x_root() || mx >= x_root() + w() || + my < y_root() || my >= y_root() + h()) { + return 0; + } + return 1; +} + +//////////////////////////////////////////////////////////////// +// Fl_Menu_Item::popup(...) + +// Because Fl::grab() is done, all events go to one of the menu windows. +// But the handle method needs to look at all of them to find out +// what item the user is pointing at. And it needs a whole lot +// of other state variables to determine what is going on with +// the currently displayed menus. +// So the main loop (handlemenu()) puts all the state in a structure +// and puts a pointer to it in a static location, so the handle() +// on menus can refer to it and alter it. The handle() method +// changes variables in this state to indicate what item is +// picked, but does not actually alter the display, instead the +// main loop does that. This is because the X mapping and unmapping +// of windows is slow, and we don't want to fall behind the events. + +// values for menustate.state: +#define INITIAL_STATE 0 // no mouse up or down since popup() called +#define PUSH_STATE 1 // mouse has been pushed on a normal item +#define DONE_STATE 2 // exit the popup, the current item was picked +#define MENU_PUSH_STATE 3 // mouse has been pushed on a menu title + +struct menustate { + const Fl_Menu_Item* current_item; // what mouse is pointing at + int menu_number; // which menu it is in + int item_number; // which item in that menu, -1 if none + menuwindow* p[20]; // pointers to menus + int nummenus; + int menubar; // if true p[0] is a menubar + int state; + menuwindow* fakemenu; // kludge for buttons in menubar + int is_inside(int mx, int my); +}; +static menustate* p; + +// return 1 if the coordinates are inside any of the menuwindows +int menustate::is_inside(int mx, int my) { + int i; + for (i=nummenus-1; i>=0; i--) { + if (p[i]->is_inside(mx, my)) + return 1; + } + return 0; +} + +static inline void setitem(const Fl_Menu_Item* i, int m, int n) { + p->current_item = i; + p->menu_number = m; + p->item_number = n; +} + +static void setitem(int m, int n) { + menustate &pp = *p; + pp.current_item = (n >= 0) ? pp.p[m]->menu->next(n) : 0; + pp.menu_number = m; + pp.item_number = n; +} + +static int forward(int menu) { // go to next item in menu menu if possible + menustate &pp = *p; + // Fl_Menu_Button can geberate menu=-1. This line fixes it and selectes the first item. + if (menu==-1) + menu = 0; + menuwindow &m = *(pp.p[menu]); + int item = (menu == pp.menu_number) ? pp.item_number : m.selected; + while (++item < m.numitems) { + const Fl_Menu_Item* m1 = m.menu->next(item); + if (m1->activevisible()) {setitem(m1, menu, item); return 1;} + } + return 0; +} + +static int backward(int menu) { // previous item in menu menu if possible + menustate &pp = *p; + menuwindow &m = *(pp.p[menu]); + int item = (menu == pp.menu_number) ? pp.item_number : m.selected; + if (item < 0) item = m.numitems; + while (--item >= 0) { + const Fl_Menu_Item* m1 = m.menu->next(item); + if (m1->activevisible()) {setitem(m1, menu, item); return 1;} + } + return 0; +} + +int menuwindow::handle(int e) { +#ifdef __APPLE__ + // This off-route takes care of the "detached menu" bug on OS X. + // Apple event handler requires that we hide all menu windows right + // now, so that Carbon can continue undisturbed with handling window + // manager events, like dragging the application window. + int ret = early_hide_handle(e); + menustate &pp = *p; + if (pp.state == DONE_STATE) { + hide(); + if (pp.fakemenu) { + pp.fakemenu->hide(); + if (pp.fakemenu->title) + pp.fakemenu->title->hide(); + } + int i = pp.nummenus; + while (i>0) { + menuwindow *mw = pp.p[--i]; + if (mw) { + mw->hide(); + if (mw->title) + mw->title->hide(); + } + } + } + return ret; +} + +int menuwindow::early_hide_handle(int e) { +#endif + menustate &pp = *p; + switch (e) { + case FL_KEYBOARD: + switch (Fl::event_key()) { + case FL_BackSpace: + case 0xFE20: // backtab + BACKTAB: + if (!backward(pp.menu_number)) {pp.item_number = -1;backward(pp.menu_number);} + return 1; + case FL_Up: + if (pp.menubar && pp.menu_number == 0) { + // Do nothing... + } else if (backward(pp.menu_number)) { + // Do nothing... + } else if (pp.menubar && pp.menu_number==1) { + setitem(0, pp.p[0]->selected); + } + return 1; + case FL_Tab: + if (Fl::event_shift()) goto BACKTAB; + case FL_Down: + if (pp.menu_number || !pp.menubar) { + if (!forward(pp.menu_number) && Fl::event_key()==FL_Tab) { + pp.item_number = -1; + forward(pp.menu_number); + } + } else if (pp.menu_number < pp.nummenus-1) { + forward(pp.menu_number+1); + } + return 1; + case FL_Right: + if (pp.menubar && (pp.menu_number<=0 || pp.menu_number==1 && pp.nummenus==2)) + forward(0); + else if (pp.menu_number < pp.nummenus-1) forward(pp.menu_number+1); + return 1; + case FL_Left: + if (pp.menubar && pp.menu_number<=1) backward(0); + else if (pp.menu_number>0) + setitem(pp.menu_number-1, pp.p[pp.menu_number-1]->selected); + return 1; + case FL_Enter: + case FL_KP_Enter: + case ' ': + pp.state = DONE_STATE; + return 1; + case FL_Escape: + setitem(0, -1, 0); + pp.state = DONE_STATE; + return 1; + } + break; + case FL_SHORTCUT: { + for (int mymenu = pp.nummenus; mymenu--;) { + menuwindow &mw = *(pp.p[mymenu]); + int item; const Fl_Menu_Item* m = mw.menu->find_shortcut(&item); + if (m) { + setitem(m, mymenu, item); + if (!m->submenu()) pp.state = DONE_STATE; + return 1; + } + }} break; + case FL_ENTER: + case FL_MOVE: + case FL_PUSH: + case FL_DRAG: { +#ifdef __QNX__ + // STR 704: workaround QNX X11 bug - in QNX a FL_MOVE event is sent + // right after FL_RELEASE... + if (pp.state == DONE_STATE) return 1; +#endif // __QNX__ + int mx = Fl::event_x_root(); + int my = Fl::event_y_root(); + int item=0; int mymenu = pp.nummenus-1; + // Clicking or dragging outside menu cancels it... + if ((!pp.menubar || mymenu) && !pp.is_inside(mx, my)) { + setitem(0, -1, 0); + if (e==FL_PUSH) + pp.state = DONE_STATE; + return 1; + } + for (mymenu = pp.nummenus-1; ; mymenu--) { + item = pp.p[mymenu]->find_selected(mx, my); + if (item >= 0) + break; + if (mymenu <= 0) { + // buttons in menubars must be deselected if we move outside of them! + if (pp.menu_number==-1 && e==FL_PUSH) { + pp.state = DONE_STATE; + return 1; + } + if (pp.current_item && pp.menu_number==0 && !pp.current_item->submenu()) { + if (e==FL_PUSH) + pp.state = DONE_STATE; + setitem(0, -1, 0); + return 1; + } + // all others can stay selected + return 0; + } + } + if (my == 0 && item > 0) setitem(mymenu, item - 1); + else setitem(mymenu, item); + if (e == FL_PUSH) { + if (pp.current_item && pp.current_item->submenu() // this is a menu title + && item != pp.p[mymenu]->selected // and it is not already on + && !pp.current_item->callback_) // and it does not have a callback + pp.state = MENU_PUSH_STATE; + else + pp.state = PUSH_STATE; + }} return 1; + case FL_RELEASE: + // Mouse must either be held down/dragged some, or this must be + // the second click (not the one that popped up the menu): + if (!Fl::event_is_click() || pp.state == PUSH_STATE || + pp.menubar && pp.current_item && !pp.current_item->submenu() // button + ) { +#if 0 // makes the check/radio items leave the menu up + const Fl_Menu_Item* m = pp.current_item; + if (m && button && (m->flags & (FL_MENU_TOGGLE|FL_MENU_RADIO))) { + ((Fl_Menu_*)button)->picked(m); + pp.p[pp.menu_number]->redraw(); + } else +#endif + // do nothing if they try to pick inactive items + if (!pp.current_item || pp.current_item->activevisible()) + pp.state = DONE_STATE; + } + return 1; + } + return Fl_Window::handle(e); +} + +const Fl_Menu_Item* Fl_Menu_Item::pulldown( + int X, int Y, int W, int H, + const Fl_Menu_Item* initial_item, + const Fl_Menu_* pbutton, + const Fl_Menu_Item* t, + int menubar) const +{ + Fl_Group::current(0); // fix possible user error... + + button = pbutton; + if (pbutton) { + for (Fl_Window* w = pbutton->window(); w; w = w->window()) { + X += w->x(); + Y += w->y(); + } + } else { + X += Fl::event_x_root()-Fl::event_x(); + Y += Fl::event_y_root()-Fl::event_y(); + } + menuwindow mw(this, X, Y, W, H, initial_item, t, menubar); + Fl::grab(mw); + menustate pp; p = &pp; + pp.p[0] = &mw; + pp.nummenus = 1; + pp.menubar = menubar; + pp.state = INITIAL_STATE; + pp.fakemenu = 0; // kludge for buttons in menubar + + // preselected item, pop up submenus if necessary: + if (initial_item && mw.selected >= 0) { + setitem(0, mw.selected); + goto STARTUP; + } + + pp.current_item = 0; pp.menu_number = 0; pp.item_number = -1; + if (menubar) { + // find the initial menu + if (!mw.handle(FL_DRAG)) { + Fl::release(); + return 0; + } + } + initial_item = pp.current_item; + if (initial_item) goto STARTUP; + + // the main loop, runs until p.state goes to DONE_STATE: + for (;;) { + + // make sure all the menus are shown: + {for (int k = menubar; k < pp.nummenus; k++) + if (!pp.p[k]->shown()) { + if (pp.p[k]->title) pp.p[k]->title->show(); + pp.p[k]->show(); + } + } + + // get events: + {const Fl_Menu_Item* oldi = pp.current_item; + Fl::wait(); + if (pp.state == DONE_STATE) break; // done. + if (pp.current_item == oldi) continue;} + // only do rest if item changes: + + delete pp.fakemenu; pp.fakemenu = 0; // turn off "menubar button" + + if (!pp.current_item) { // pointing at nothing + // turn off selection in deepest menu, but don't erase other menus: + pp.p[pp.nummenus-1]->set_selected(-1); + continue; + } + + delete pp.fakemenu; pp.fakemenu = 0; + initial_item = 0; // stop the startup code + pp.p[pp.menu_number]->autoscroll(pp.item_number); + + STARTUP: + menuwindow& cw = *pp.p[pp.menu_number]; + const Fl_Menu_Item* m = pp.current_item; + if (!m->activevisible()) { // pointing at inactive item + cw.set_selected(-1); + initial_item = 0; // turn off startup code + continue; + } + cw.set_selected(pp.item_number); + + if (m==initial_item) initial_item=0; // stop the startup code if item found + if (m->submenu()) { + const Fl_Menu_Item* title = m; + const Fl_Menu_Item* menutable; + if (m->flags&FL_SUBMENU) menutable = m+1; + else menutable = (Fl_Menu_Item*)(m)->user_data_; + // figure out where new menu goes: + int nX, nY; + if (!pp.menu_number && pp.menubar) { // menu off a menubar: + nX = cw.x() + cw.titlex(pp.item_number); + nY = cw.y() + cw.h(); + initial_item = 0; + } else { + nX = cw.x() + cw.w(); + nY = cw.y() + pp.item_number * cw.itemheight; + title = 0; + } + if (initial_item) { // bring up submenu containing initial item: + menuwindow* n = new menuwindow(menutable,X,Y,W,H,initial_item,title,0,0,cw.x()); + pp.p[pp.nummenus++] = n; + // move all earlier menus to line up with this new one: + if (n->selected>=0) { + int dy = n->y()-nY; + int dx = n->x()-nX; + for (int menu = 0; menu <= pp.menu_number; menu++) { + menuwindow* tt = pp.p[menu]; + int nx = tt->x()+dx; if (nx < 0) {nx = 0; dx = -tt->x();} + int ny = tt->y()+dy; if (ny < 0) {ny = 0; dy = -tt->y();} + tt->position(nx, ny); + } + setitem(pp.nummenus-1, n->selected); + goto STARTUP; + } + } else if (pp.nummenus > pp.menu_number+1 && + pp.p[pp.menu_number+1]->menu == menutable) { + // the menu is already up: + while (pp.nummenus > pp.menu_number+2) delete pp.p[--pp.nummenus]; + pp.p[pp.nummenus-1]->set_selected(-1); + } else { + // delete all the old menus and create new one: + while (pp.nummenus > pp.menu_number+1) delete pp.p[--pp.nummenus]; + pp.p[pp.nummenus++]= new menuwindow(menutable, nX, nY, + title?1:0, 0, 0, title, 0, menubar, cw.x()); + } + } else { // !m->submenu(): + while (pp.nummenus > pp.menu_number+1) delete pp.p[--pp.nummenus]; + if (!pp.menu_number && pp.menubar) { + // kludge so "menubar buttons" turn "on" by using menu title: + pp.fakemenu = new menuwindow(0, + cw.x()+cw.titlex(pp.item_number), + cw.y()+cw.h(), 0, 0, + 0, m, 0, 1); + pp.fakemenu->title->show(); + } + } + } + const Fl_Menu_Item* m = pp.current_item; + Fl::release(); + delete pp.fakemenu; + while (pp.nummenus>1) delete pp.p[--pp.nummenus]; + mw.hide(); + return m; +} + +const Fl_Menu_Item* +Fl_Menu_Item::popup( + int X, int Y, + const char* title, + const Fl_Menu_Item* picked, + const Fl_Menu_* but + ) const +{ + static Fl_Menu_Item dummy; // static so it is all zeros + dummy.text = title; + return pulldown(X, Y, 0, 0, picked, but, title ? &dummy : 0); +} + +// Search only the top level menu for a shortcut. Either &x in the +// label or the shortcut fields are used: +const Fl_Menu_Item* Fl_Menu_Item::find_shortcut(int* ip) const { + const Fl_Menu_Item* m = first(); + if (m) for (int ii = 0; m->text; m = m->next(), ii++) { + if (m->activevisible()) { + if (Fl::test_shortcut(m->shortcut_) + || Fl_Widget::test_shortcut(m->text)) { + if (ip) *ip=ii; + return m; + } + } + } + return 0; +} + +// Recursive search of all submenus for anything with this key as a +// shortcut. Only uses the shortcut field, ignores &x in the labels: +const Fl_Menu_Item* Fl_Menu_Item::test_shortcut() const { + const Fl_Menu_Item* m = first(); + const Fl_Menu_Item* ret = 0; + if (m) for (; m->text; m = m->next()) { + if (m->activevisible()) { + // return immediately any match of an item in top level menu: + if (Fl::test_shortcut(m->shortcut_)) return m; + // if (Fl_Widget::test_shortcut(m->text)) return m; + // only return matches from lower menu if nothing found in top menu: + if (!ret && m->submenu()) { + const Fl_Menu_Item* s = + (m->flags&FL_SUBMENU) ? m+1:(const Fl_Menu_Item*)m->user_data_; + ret = s->test_shortcut(); + } + } + } + return ret; +} + +// +// End of "$Id: Fl_Menu.cxx 6478 2008-10-19 21:28:06Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Menu_.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Menu_.cxx new file mode 100644 index 0000000..f8a8f59 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Menu_.cxx @@ -0,0 +1,232 @@ +// +// "$Id: Fl_Menu_.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Common menu code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// This is a base class for all items that have a menu: +// Fl_Menu_Bar, Fl_Menu_Button, Fl_Choice +// This provides storage for a menu item, functions to add/modify/delete +// items, and a call for when the user picks a menu item. + +// More code in Fl_Menu_add.cxx + +#include +#include +#include "flstring.h" +#include +#include + +// Set 'pathname' of specified menuitem +// If finditem==NULL, mvalue() is used (the most recently picked menuitem) +// Returns: +// 0 : OK +// -1 : item not found (name="") +// -2 : 'name' not large enough (name="") +// +#define SAFE_STRCAT(s) \ + { len += strlen(s); if ( len >= namelen ) { *name='\0'; return(-2); } else strcat(name,(s)); } +int Fl_Menu_::item_pathname(char *name, int namelen, const Fl_Menu_Item *finditem) const { + int len = 0; + finditem = finditem ? finditem : mvalue(); + name[0] = '\0'; + for ( int t=0; tsubmenu() ) { // submenu? descend + if (*name) SAFE_STRCAT("/"); + if (m->label()) SAFE_STRCAT(m->label()); + } else { + if (m->label()) { // menu item? + if ( m == finditem ) { // found? tack on itemname, done. + SAFE_STRCAT("/"); + SAFE_STRCAT(m->label()); + return(0); + } + } else { // end of submenu? pop + char *ss = strrchr(name, '/'); + if ( ss ) { *ss = 0; len = strlen(name); } // "File/Edit" -> "File" + else { name[0] = '\0'; len = 0; } // "File" -> "" + continue; + } + } + } + *name = '\0'; + return(-1); // item not found +} + +// FIND MENU ITEM INDEX, GIVEN MENU PATHNAME +// eg. "Edit/Copy" +// Will also return submenus, eg. "Edit" +// Returns NULL if not found. +// +const Fl_Menu_Item * +Fl_Menu_::find_item(const char *name) +{ + char menupath[1024] = ""; // File/Export + + for ( int t=0; t < size(); t++ ) { + Fl_Menu_Item *m = menu_ + t; + + if (m->flags&FL_SUBMENU) { + // IT'S A SUBMENU + // we do not support searches through FL_SUBMENU_POINTER links + if (menupath[0]) strlcat(menupath, "/", sizeof(menupath)); + strlcat(menupath, m->label(), sizeof(menupath)); + if (!strcmp(menupath, name)) return m; + } else { + if (!m->label()) { + // END OF SUBMENU? Pop back one level. + char *ss = strrchr(menupath, '/'); + if ( ss ) *ss = 0; + else menupath[0] = '\0'; + continue; + } + + // IT'S A MENU ITEM + char itempath[1024]; // eg. Edit/Copy + strcpy(itempath, menupath); + if (itempath[0]) strlcat(itempath, "/", sizeof(itempath)); + strlcat(itempath, m->label(), sizeof(itempath)); + if (!strcmp(itempath, name)) return m; + } + } + + return (const Fl_Menu_Item *)0; +} + +int Fl_Menu_::value(const Fl_Menu_Item* m) { + clear_changed(); + if (value_ != m) {value_ = m; return 1;} + return 0; +} + +// When user picks a menu item, call this. It will do the callback. +// Unfortunatly this also casts away const for the checkboxes, but this +// was necessary so non-checkbox menus can really be declared const... +const Fl_Menu_Item* Fl_Menu_::picked(const Fl_Menu_Item* v) { + if (v) { + if (v->radio()) { + if (!v->value()) { // they are turning on a radio item + set_changed(); + ((Fl_Menu_Item*)v)->setonly(); + } + redraw(); + } else if (v->flags & FL_MENU_TOGGLE) { + set_changed(); + ((Fl_Menu_Item*)v)->flags ^= FL_MENU_VALUE; + redraw(); + } else if (v != value_) { // normal item + set_changed(); + } + value_ = v; + if (when()&(FL_WHEN_CHANGED|FL_WHEN_RELEASE)) { + if (changed() || when()&FL_WHEN_NOT_CHANGED) { + if (value_ && value_->callback_) value_->do_callback((Fl_Widget*)this); + else do_callback(); + } + } + } + return v; +} + +// turn on one of a set of radio buttons +void Fl_Menu_Item::setonly() { + flags |= FL_MENU_RADIO | FL_MENU_VALUE; + Fl_Menu_Item* j; + for (j = this; ; ) { // go down + if (j->flags & FL_MENU_DIVIDER) break; // stop on divider lines + j++; + if (!j->text || !j->radio()) break; // stop after group + j->clear(); + } + for (j = this-1; ; j--) { // go up + if (!j->text || (j->flags&FL_MENU_DIVIDER) || !j->radio()) break; + j->clear(); + } +} + +Fl_Menu_::Fl_Menu_(int X,int Y,int W,int H,const char* l) +: Fl_Widget(X,Y,W,H,l) { + set_flag(SHORTCUT_LABEL); + box(FL_UP_BOX); + when(FL_WHEN_RELEASE_ALWAYS); + value_ = menu_ = 0; + alloc = 0; + selection_color(FL_SELECTION_COLOR); + textfont(FL_HELVETICA); + textsize((uchar)FL_NORMAL_SIZE); + textcolor(FL_FOREGROUND_COLOR); + down_box(FL_NO_BOX); +} + +int Fl_Menu_::size() const { + if (!menu_) return 0; + return menu_->size(); +} + +void Fl_Menu_::menu(const Fl_Menu_Item* m) { + clear(); + value_ = menu_ = (Fl_Menu_Item*)m; +} + +// this version is ok with new Fl_Menu_add code with fl_menu_array_owner: + +void Fl_Menu_::copy(const Fl_Menu_Item* m, void* ud) { + int n = m->size(); + Fl_Menu_Item* newMenu = new Fl_Menu_Item[n]; + memcpy(newMenu, m, n*sizeof(Fl_Menu_Item)); + menu(newMenu); + alloc = 1; // make destructor free array, but not strings + // for convienence, provide way to change all the user data pointers: + if (ud) for (; n--;) { + if (newMenu->callback_) newMenu->user_data_ = ud; + newMenu++; + } +} + +Fl_Menu_::~Fl_Menu_() { + clear(); +} + +// Fl_Menu::add() uses this to indicate the owner of the dynamically- +// expanding array. We must not free this array: +Fl_Menu_* fl_menu_array_owner = 0; + +void Fl_Menu_::clear() { + if (alloc) { + if (alloc>1) for (int i = size(); i--;) + if (menu_[i].text) free((void*)menu_[i].text); + if (this == fl_menu_array_owner) + fl_menu_array_owner = 0; + else + delete[] menu_; + menu_ = 0; + value_ = 0; + alloc = 0; + } +} + +// +// End of "$Id: Fl_Menu_.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Menu_Bar.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Menu_Bar.cxx new file mode 100644 index 0000000..d8bba77 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Menu_Bar.cxx @@ -0,0 +1,78 @@ +// +// "$Id: Fl_Menu_Bar.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Menu bar widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include + +void Fl_Menu_Bar::draw() { + draw_box(); + if (!menu() || !menu()->text) return; + const Fl_Menu_Item* m; + int X = x()+6; + for (m=menu()->first(); m->text; m = m->next()) { + int W = m->measure(0,this) + 16; + m->draw(X, y(), W, h(), this); + X += W; + if (m->flags & FL_MENU_DIVIDER) { + int y1 = y() + Fl::box_dy(box()); + int y2 = y1 + h() - Fl::box_dh(box()) - 1; + + // Draw a vertical divider between menus... + fl_color(FL_DARK3); + fl_yxline(X - 6, y1, y2); + fl_color(FL_LIGHT3); + fl_yxline(X - 5, y1, y2); + } + } +} + +int Fl_Menu_Bar::handle(int event) { + const Fl_Menu_Item* v; + if (menu() && menu()->text) switch (event) { + case FL_ENTER: + case FL_LEAVE: + return 1; + case FL_PUSH: + v = 0; + J1: + v = menu()->pulldown(x(), y(), w(), h(), v, this, 0, 1); + picked(v); + return 1; + case FL_SHORTCUT: + if (visible_r()) { + v = menu()->find_shortcut(); + if (v && v->submenu()) goto J1; + } + return test_shortcut() != 0; + } + return 0; +} + +// +// End of "$Id: Fl_Menu_Bar.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Menu_Button.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Menu_Button.cxx new file mode 100644 index 0000000..3097434 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Menu_Button.cxx @@ -0,0 +1,111 @@ +// +// "$Id: Fl_Menu_Button.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Menu button widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include + + +static Fl_Menu_Button *pressed_menu_button_ = 0; + +void Fl_Menu_Button::draw() { + if (!box() || type()) return; + draw_box(pressed_menu_button_ == this ? fl_down(box()) : box(), color()); + draw_label(); + if (Fl::focus() == this) draw_focus(); + if (box() == FL_FLAT_BOX) return; // for XForms compatability + int H = (labelsize()-3)&-2; + int X = x()+w()-H*2; + int Y = y()+(h()-H)/2; + fl_color(active_r() ? FL_DARK3 : fl_inactive(FL_DARK3)); + fl_line(X+H/2, Y+H, X, Y, X+H, Y); + fl_color(active_r() ? FL_LIGHT3 : fl_inactive(FL_LIGHT3)); + fl_line(X+H, Y, X+H/2, Y+H); +} + +const Fl_Menu_Item* Fl_Menu_Button::popup() { + const Fl_Menu_Item* m; + pressed_menu_button_ = this; + redraw(); + Fl_Widget *mb = this; + Fl::watch_widget_pointer(mb); + if (!box() || type()) { + m = menu()->popup(Fl::event_x(), Fl::event_y(), label(), mvalue(), this); + } else { + m = menu()->pulldown(x(), y(), w(), h(), 0, this); + } + picked(m); + pressed_menu_button_ = 0; + if (mb) mb->redraw(); + Fl::release_widget_pointer(mb); + return m; +} + +int Fl_Menu_Button::handle(int e) { + if (!menu() || !menu()->text) return 0; + switch (e) { + case FL_ENTER: + case FL_LEAVE: + return (box() && !type()) ? 1 : 0; + case FL_PUSH: + if (!box()) { + if (Fl::event_button() != 3) return 0; + } else if (type()) { + if (!(type() & (1 << (Fl::event_button()-1)))) return 0; + } + if (Fl::visible_focus()) Fl::focus(this); + popup(); + return 1; + case FL_KEYBOARD: + if (!box()) return 0; + if (Fl::event_key() == ' ' && + !(Fl::event_state() & (FL_SHIFT | FL_CTRL | FL_ALT | FL_META))) { + popup(); + return 1; + } else return 0; + case FL_SHORTCUT: + if (Fl_Widget::test_shortcut()) {popup(); return 1;} + return test_shortcut() != 0; + case FL_FOCUS: + case FL_UNFOCUS: + if (box() && Fl::visible_focus()) { + redraw(); + return 1; + } + default: + return 0; + } +} + +Fl_Menu_Button::Fl_Menu_Button(int X,int Y,int W,int H,const char *l) +: Fl_Menu_(X,Y,W,H,l) { + down_box(FL_NO_BOX); +} + +// +// End of "$Id: Fl_Menu_Button.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Menu_Window.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Menu_Window.cxx new file mode 100644 index 0000000..e89ae28 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Menu_Window.cxx @@ -0,0 +1,103 @@ +// +// "$Id: Fl_Menu_Window.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Menu window code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// This is the window type used by Fl_Menu to make the pop-ups. +// It draws in the overlay planes if possible. + +// Also here is the implementation of the mouse & keyboard grab, +// which are used so that clicks outside the program's windows +// can be used to dismiss the menus. + +#include +#include +#include +#include +#include + +// WIN32 note: HAVE_OVERLAY is false +#if HAVE_OVERLAY +extern XVisualInfo *fl_find_overlay_visual(); +extern XVisualInfo *fl_overlay_visual; +extern Colormap fl_overlay_colormap; +extern unsigned long fl_transparent_pixel; +static GC gc; // the GC used by all X windows +extern uchar fl_overlay; // changes how fl_color(x) works +#endif + +#include + +void Fl_Menu_Window::show() { +#if HAVE_OVERLAY + if (!shown() && overlay() && fl_find_overlay_visual()) { + XInstallColormap(fl_display, fl_overlay_colormap); + fl_background_pixel = int(fl_transparent_pixel); + Fl_X::make_xid(this, fl_overlay_visual, fl_overlay_colormap); + fl_background_pixel = -1; + } else +#endif + Fl_Single_Window::show(); +} + +void Fl_Menu_Window::flush() { +#if HAVE_OVERLAY + if (!fl_overlay_visual || !overlay()) {Fl_Single_Window::flush(); return;} + Fl_X *myi = Fl_X::i(this); + fl_window = myi->xid; + if (!gc) gc = XCreateGC(fl_display, myi->xid, 0, 0); + fl_gc = gc; + fl_overlay = 1; + fl_clip_region(myi->region); myi->region = 0; current_ = this; + draw(); + fl_overlay = 0; +#else + Fl_Single_Window::flush(); +#endif +} + +void Fl_Menu_Window::erase() { +#if HAVE_OVERLAY + if (!gc || !shown()) return; +//XSetForeground(fl_display, gc, 0); +//XFillRectangle(fl_display, fl_xid(this), gc, 0, 0, w(), h()); + XClearWindow(fl_display, fl_xid(this)); +#endif +} + +// Fix the colormap flashing on Maximum Impact Graphics by erasing the +// menu before unmapping it: +void Fl_Menu_Window::hide() { + erase(); + Fl_Single_Window::hide(); +} + +Fl_Menu_Window::~Fl_Menu_Window() { + hide(); +} + +// +// End of "$Id: Fl_Menu_Window.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Menu_add.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Menu_add.cxx new file mode 100644 index 0000000..2b046e6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Menu_add.cxx @@ -0,0 +1,268 @@ +// +// "$Id: Fl_Menu_add.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Menu utilities for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Methods to alter the menu in an Fl_Menu_ widget. + +// These are for Forms emulation and for dynamically changing the +// menus. They are in this source file so they are not linked in if +// not used, which is what will happen if the the program only uses +// constant menu tables. + +// Not at all guaranteed to be Forms compatable, especially with any +// string with a % sign in it! + +#include +#include "flstring.h" +#include +#include + +// If the array is this, we will double-reallocate as necessary: +static Fl_Menu_Item* local_array = 0; +static int local_array_alloc = 0; // number allocated +static int local_array_size = 0; // == size(local_array) +extern Fl_Menu_* fl_menu_array_owner; // in Fl_Menu_.cxx + +// For historical reasons there are matching methods that work on a +// user-allocated array of Fl_Menu_Item. These methods are quite +// depreciated and should not be used. These old methods use the +// above pointers to detect if the array belongs to an Fl_Menu_ +// widget, and if so it reallocates as necessary. + +// Insert a single Fl_Menu_Item into an array of size at offset n, +// if this is local_array it will be reallocated if needed. +static Fl_Menu_Item* insert( + Fl_Menu_Item* array, int size, + int n, + const char *text, + int flags +) { + if (array == local_array && size >= local_array_alloc) { + local_array_alloc = 2*size; + Fl_Menu_Item* newarray = new Fl_Menu_Item[local_array_alloc]; + memmove(newarray, array, size*sizeof(Fl_Menu_Item)); + delete[] local_array; + local_array = array = newarray; + } + // move all the later items: + memmove(array+n+1, array+n, sizeof(Fl_Menu_Item)*(size-n)); + // create the new item: + Fl_Menu_Item* m = array+n; + m->text = text ? strdup(text) : 0; + m->shortcut_ = 0; + m->callback_ = 0; + m->user_data_ = 0; + m->flags = flags; + m->labeltype_ = m->labelfont_ = m->labelsize_ = m->labelcolor_ = 0; + return array; +} + +// Comparison that does not care about deleted '&' signs: +static int compare(const char* a, const char* b) { + for (;;) { + int n = *a-*b; + if (n) { + if (*a == '&') a++; + else if (*b == '&') b++; + else return n; + } else if (*a) { + a++; b++; + } else { + return 0; + } + } +} + +// Add an item. The text is split at '/' characters to automatically +// produce submenus (actually a totally unnecessary feature as you can +// now add submenu titles directly by setting SUBMENU in the flags): +int Fl_Menu_Item::add( + const char *mytext, + int sc, + Fl_Callback *cb, + void *data, + int myflags +) { + Fl_Menu_Item *array = this; + Fl_Menu_Item *m = this; + const char *p; + char *q; + char buf[1024]; + + int msize = array==local_array ? local_array_size : array->size(); + int flags1 = 0; + const char* item; + + // split at slashes to make submenus: + for (;;) { + + // leading slash makes us assumme it is a filename: + if (*mytext == '/') {item = mytext; break;} + + // leading underscore causes divider line: + if (*mytext == '_') {mytext++; flags1 = FL_MENU_DIVIDER;} + + // copy to buf, changing \x to x: + q = buf; + for (p=mytext; *p && *p != '/'; *q++ = *p++) if (*p=='\\' && p[1]) p++; + *q = 0; + + item = buf; + if (*p != '/') break; /* not a menu title */ + mytext = p+1; /* point at item title */ + + /* find a matching menu title: */ + for (; m->text; m = m->next()) + if (m->flags&FL_SUBMENU && !compare(item, m->text)) break; + + if (!m->text) { /* create a new menu */ + int n = m-array; + array = insert(array, msize, n, item, FL_SUBMENU|flags1); + msize++; + array = insert(array, msize, n+1, 0, 0); + msize++; + m = array+n; + } + m++; /* go into the submenu */ + flags1 = 0; + } + + /* find a matching menu item: */ + for (; m->text; m = m->next()) + if (!(m->flags&FL_SUBMENU) && !compare(m->text,item)) break; + + if (!m->text) { /* add a new menu item */ + int n = m-array; + array = insert(array, msize, n, item, myflags|flags1); + msize++; + if (myflags & FL_SUBMENU) { // add submenu delimiter + array = insert(array, msize, n+1, 0, 0); + msize++; + } + m = array+n; + } + + /* fill it in */ + m->shortcut_ = sc; + m->callback_ = cb; + m->user_data_ = data; + m->flags = myflags|flags1; + + if (array == local_array) local_array_size = msize; + return m-array; +} + +int Fl_Menu_::add(const char *t, int s, Fl_Callback *c,void *v,int f) { + // make this widget own the local array: + if (this != fl_menu_array_owner) { + if (fl_menu_array_owner) { + Fl_Menu_* o = fl_menu_array_owner; + // the previous owner get's its own correctly-sized array: + int value_offset = o->value_-local_array; + int n = local_array_size; + Fl_Menu_Item* newMenu = o->menu_ = new Fl_Menu_Item[n]; + memcpy(newMenu, local_array, n*sizeof(Fl_Menu_Item)); + if (o->value_) o->value_ = newMenu+value_offset; + } + if (menu_) { + // this already has a menu array, use it as the local one: + delete[] local_array; + if (!alloc) copy(menu_); // duplicate a user-provided static array + // add to the menu's current array: + local_array_alloc = local_array_size = size(); + local_array = menu_; + } else { + // start with a blank array: + alloc = 2; // indicates that the strings can be freed + if (local_array) { + menu_ = local_array; + } else { + local_array_alloc = 15; + local_array = menu_ = new Fl_Menu_Item[local_array_alloc]; + memset(local_array, 0, sizeof(Fl_Menu_Item) * local_array_alloc); + } + memset(menu_, 0, sizeof(Fl_Menu_Item)); + local_array_size = 1; + } + fl_menu_array_owner = this; + } + int r = menu_->add(t,s,c,v,f); + // if it rellocated array we must fix the pointer: + int value_offset = value_-menu_; + menu_ = local_array; // in case it reallocated it + if (value_) value_ = menu_+value_offset; + return r; +} + +// This is a Forms (and SGI GL library) compatable add function, it +// adds many menu items, with '|' seperating the menu items, and tab +// seperating the menu item names from an optional shortcut string. +int Fl_Menu_::add(const char *str) { + char buf[1024]; + int r = 0; + while (*str) { + int sc = 0; + char *c; + for (c = buf; c < (buf + sizeof(buf) - 2) && *str && *str != '|'; str++) { + if (*str == '\t') {*c++ = 0; sc = fl_old_shortcut(str);} + else *c++ = *str; + } + *c = 0; + r = add(buf, sc, 0, 0, 0); + if (*str) str++; + } + return r; +} + +void Fl_Menu_::replace(int i, const char *str) { + if (i<0 || i>=size()) return; + if (!alloc) copy(menu_); + if (alloc > 1) { + free((void *)menu_[i].text); + str = strdup(str); + } + menu_[i].text = str; +} + +void Fl_Menu_::remove(int i) { + int n = size(); + if (i<0 || i>=n) return; + if (!alloc) copy(menu_); + // find the next item, skipping submenus: + Fl_Menu_Item* item = menu_+i; + const Fl_Menu_Item* next_item = item->next(); + // delete the text only if all items were created with add(): + if (alloc > 1) { + for (Fl_Menu_Item* m = item; m < next_item; m++) + if (m->text) free((void*)(m->text)); + } + // MRS: "n" is the menu size(), which includes the trailing NULL entry... + memmove(item, next_item, (menu_+n-next_item)*sizeof(Fl_Menu_Item)); +} + +// +// End of "$Id: Fl_Menu_add.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Menu_global.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Menu_global.cxx new file mode 100644 index 0000000..3238fad --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Menu_global.cxx @@ -0,0 +1,50 @@ +// +// "$Id: Fl_Menu_global.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Global menu shortcut code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Make all the shortcuts in this menu global. +// Currently only one menu at a time and you cannot destruct the menu, +// is this sufficient? + +#include +#include + +static Fl_Menu_* the_widget; + +static int handler(int e) { + if (e != FL_SHORTCUT || Fl::modal()) return 0; + Fl::first_window(the_widget->window()); + return the_widget->handle(e); +} + +void Fl_Menu_::global() { + if (!the_widget) Fl::add_handler(handler); + the_widget = this; +} + +// +// End of "$Id: Fl_Menu_global.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Multi_Label.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Multi_Label.cxx new file mode 100644 index 0000000..eafe3c8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Multi_Label.cxx @@ -0,0 +1,80 @@ +// +// "$Id: Fl_Multi_Label.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Multi-label widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Allows two labels to be used on a widget (by having one of them +// be one of these it allows an infinte number!) + +#include +#include +#include +#include + +static void multi_labeltype( + const Fl_Label* o, int x, int y, int w, int h, Fl_Align a) +{ + Fl_Multi_Label* b = (Fl_Multi_Label*)(o->value); + Fl_Label local = *o; + local.value = b->labela; + local.type = b->typea; + int W = w; int H = h; local.measure(W, H); + local.draw(x,y,w,h,a); + if (a & FL_ALIGN_BOTTOM) h -= H; + else if (a & FL_ALIGN_TOP) {y += H; h -= H;} + else if (a & FL_ALIGN_RIGHT) w -= W; + else if (a & FL_ALIGN_LEFT) {x += W; w -= W;} + else {int d = (h+H)/2; y += d; h -= d;} + local.value = b->labelb; + local.type = b->typeb; + local.draw(x,y,w,h,a); +} + +// measurement is only correct for left-to-right appending... +static void multi_measure(const Fl_Label* o, int& w, int& h) { + Fl_Multi_Label* b = (Fl_Multi_Label*)(o->value); + Fl_Label local = *o; + local.value = b->labela; + local.type = b->typea; + local.measure(w,h); + local.value = b->labelb; + local.type = b->typeb; + int W = 0; int H = 0; local.measure(W,H); + w += W; if (H>h) h = H; +} + +void Fl_Multi_Label::label(Fl_Widget* o) { + Fl::set_labeltype(_FL_MULTI_LABEL, multi_labeltype, multi_measure); + o->label(_FL_MULTI_LABEL, (const char*)this); +} + +void Fl_Multi_Label::label(Fl_Menu_Item* o) { + Fl::set_labeltype(_FL_MULTI_LABEL, multi_labeltype, multi_measure); + o->label(_FL_MULTI_LABEL, (const char*)this); +} + +// +// End of "$Id: Fl_Multi_Label.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Overlay_Window.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Overlay_Window.cxx new file mode 100644 index 0000000..8d31a5d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Overlay_Window.cxx @@ -0,0 +1,155 @@ +// +// "$Id: Fl_Overlay_Window.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Overlay window code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// A window using double-buffering and able to draw an overlay +// on top of that. Uses the hardware to draw the overlay if +// possible, otherwise it just draws in the front buffer. + +#include +#include +#include +#include +#include + +void Fl_Overlay_Window::show() { + Fl_Double_Window::show(); + if (overlay_ && overlay_ != this) overlay_->show(); +} + +void Fl_Overlay_Window::hide() { + Fl_Double_Window::hide(); +} + +void Fl_Overlay_Window::flush() { +#ifdef BOXX_BUGS + if (overlay_ && overlay_ != this && overlay_->shown()) { + // all drawing to windows hidden by overlay windows is ignored, fix this + XUnmapWindow(fl_display, fl_xid(overlay_)); + Fl_Double_Window::flush(0); + XMapWindow(fl_display, fl_xid(overlay_)); + return; + } +#endif + int erase_overlay = (damage()&FL_DAMAGE_OVERLAY); + clear_damage((uchar)(damage()&~FL_DAMAGE_OVERLAY)); + Fl_Double_Window::flush(erase_overlay); + if (overlay_ == this) draw_overlay(); +} + +void Fl_Overlay_Window::resize(int X, int Y, int W, int H) { + Fl_Double_Window::resize(X,Y,W,H); + if (overlay_ && overlay_!=this) overlay_->resize(0,0,w(),h()); +} + +Fl_Overlay_Window::~Fl_Overlay_Window() { + hide(); +// delete overlay; this is done by ~Fl_Group +} + +#if !HAVE_OVERLAY + +int Fl_Overlay_Window::can_do_overlay() {return 0;} + +void Fl_Overlay_Window::redraw_overlay() { + overlay_ = this; + clear_damage((uchar)(damage()|FL_DAMAGE_OVERLAY)); + Fl::damage(FL_DAMAGE_CHILD); +} + +#else + +extern XVisualInfo *fl_find_overlay_visual(); +extern XVisualInfo *fl_overlay_visual; +extern Colormap fl_overlay_colormap; +extern unsigned long fl_transparent_pixel; +static GC gc; // the GC used by all X windows +extern uchar fl_overlay; // changes how fl_color(x) works + +class _Fl_Overlay : public Fl_Window { + friend class Fl_Overlay_Window; + void flush(); + void show(); +public: + _Fl_Overlay(int x, int y, int w, int h) : + Fl_Window(x,y,w,h) {set_flag(INACTIVE);} +}; + +int Fl_Overlay_Window::can_do_overlay() { + return fl_find_overlay_visual() != 0; +} + +void _Fl_Overlay::show() { + if (shown()) {Fl_Window::show(); return;} + fl_background_pixel = int(fl_transparent_pixel); + Fl_X::make_xid(this, fl_overlay_visual, fl_overlay_colormap); + fl_background_pixel = -1; + // find the outermost window to tell wm about the colormap: + Fl_Window *w = window(); + for (;;) {Fl_Window *w1 = w->window(); if (!w1) break; w = w1;} + XSetWMColormapWindows(fl_display, fl_xid(w), &(Fl_X::i(this)->xid), 1); +} + +void _Fl_Overlay::flush() { + fl_window = fl_xid(this); + if (!gc) gc = XCreateGC(fl_display, fl_xid(this), 0, 0); + fl_gc = gc; + fl_overlay = 1; + Fl_Overlay_Window *w = (Fl_Overlay_Window *)parent(); + Fl_X *myi = Fl_X::i(this); + if (damage() != FL_DAMAGE_EXPOSE) XClearWindow(fl_display, fl_xid(this)); + fl_clip_region(myi->region); myi->region = 0; + w->draw_overlay(); + fl_overlay = 0; +} + +void Fl_Overlay_Window::redraw_overlay() { + if (!fl_display) return; // this prevents fluid -c from opening display + if (!overlay_) { + if (can_do_overlay()) { + Fl_Group::current(this); + overlay_ = new _Fl_Overlay(0,0,w(),h()); + Fl_Group::current(0); + } else { + overlay_ = this; // fake the overlay + } + } + if (shown()) { + if (overlay_ == this) { + clear_damage(damage()|FL_DAMAGE_OVERLAY); + Fl::damage(FL_DAMAGE_CHILD); + } else if (!overlay_->shown()) + overlay_->show(); + else + overlay_->redraw(); + } +} + +#endif + +// +// End of "$Id: Fl_Overlay_Window.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_PNG_Image.cxx b/third_party/windows/fltk-1.1.10/src/Fl_PNG_Image.cxx new file mode 100644 index 0000000..fa1deb4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_PNG_Image.cxx @@ -0,0 +1,155 @@ +// +// "$Id: Fl_PNG_Image.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Fl_PNG_Image routines. +// +// Copyright 1997-2005 by Easy Software Products. +// Image support donated by Matthias Melcher, Copyright 2000. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// Fl_PNG_Image::Fl_PNG_Image() - Load a PNG image file. +// + +// +// Include necessary header files... +// + +#include +#include +#include +#include +#include + +extern "C" +{ +#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ) +# include +# ifdef HAVE_PNG_H +# include +# else +# include +# endif // HAVE_PNG_H +#endif // HAVE_LIBPNG && HAVE_LIBZ +} + + +// +// 'Fl_PNG_Image::Fl_PNG_Image()' - Load a PNG image file. +// + +Fl_PNG_Image::Fl_PNG_Image(const char *png) // I - File to read + : Fl_RGB_Image(0,0,0) { +#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ) + int i; // Looping var + FILE *fp; // File pointer + int channels; // Number of color channels + png_structp pp; // PNG read pointer + png_infop info; // PNG info pointers + png_bytep *rows; // PNG row pointers + + + // Open the PNG file... + if ((fp = fopen(png, "rb")) == NULL) return; + + // Setup the PNG data structures... + pp = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + info = png_create_info_struct(pp); + + if (setjmp(pp->jmpbuf)) + { + Fl::warning("PNG file \"%s\" contains errors!\n", png); + return; + } + + // Initialize the PNG read "engine"... + png_init_io(pp, fp); + + // Get the image dimensions and convert to grayscale or RGB... + png_read_info(pp, info); + + if (info->color_type == PNG_COLOR_TYPE_PALETTE) + png_set_expand(pp); + + if (info->color_type & PNG_COLOR_MASK_COLOR) + channels = 3; + else + channels = 1; + + if ((info->color_type & PNG_COLOR_MASK_ALPHA) || info->num_trans) + channels ++; + + w((int)(info->width)); + h((int)(info->height)); + d(channels); + + if (info->bit_depth < 8) + { + png_set_packing(pp); + png_set_expand(pp); + } + else if (info->bit_depth == 16) + png_set_strip_16(pp); + +# if defined(HAVE_PNG_GET_VALID) && defined(HAVE_PNG_SET_TRNS_TO_ALPHA) + // Handle transparency... + if (png_get_valid(pp, info, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha(pp); +# endif // HAVE_PNG_GET_VALID && HAVE_PNG_SET_TRNS_TO_ALPHA + + array = new uchar[w() * h() * d()]; + alloc_array = 1; + + // Allocate pointers... + rows = new png_bytep[h()]; + + for (i = 0; i < h(); i ++) + rows[i] = (png_bytep)(array + i * w() * d()); + + // Read the image, handling interlacing as needed... + for (i = png_set_interlace_handling(pp); i > 0; i --) + png_read_rows(pp, rows, NULL, h()); + +#ifdef WIN32 + // Some Windows graphics drivers don't honor transparency when RGB == white + if (channels == 4) { + // Convert RGB to 0 when alpha == 0... + uchar *ptr = (uchar *)array; + for (i = w() * h(); i > 0; i --, ptr += 4) + if (!ptr[3]) ptr[0] = ptr[1] = ptr[2] = 0; + } +#endif // WIN32 + + // Free memory and return... + delete[] rows; + + png_read_end(pp, info); + png_destroy_read_struct(&pp, &info, NULL); + + fclose(fp); +#endif // HAVE_LIBPNG && HAVE_LIBZ +} + + +// +// End of "$Id: Fl_PNG_Image.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_PNM_Image.cxx b/third_party/windows/fltk-1.1.10/src/Fl_PNM_Image.cxx new file mode 100644 index 0000000..59bf866 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_PNM_Image.cxx @@ -0,0 +1,190 @@ +// +// "$Id: Fl_PNM_Image.cxx 6006 2007-12-20 16:32:56Z matt $" +// +// Fl_PNM_Image routines. +// +// Copyright 1997-2005 by Easy Software Products. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// Fl_PNM_Image::Fl_PNM_Image() - Load a PNM image... +// + +// +// Include necessary header files... +// + +#include +#include +#include +#include +#include "flstring.h" + + +// +// 'Fl_PNM_Image::Fl_PNM_Image()' - Load a PNM image... +// + +Fl_PNM_Image::Fl_PNM_Image(const char *name) // I - File to read + : Fl_RGB_Image(0,0,0) { + FILE *fp; // File pointer + int x, y; // Looping vars + char line[1024], // Input line + *lineptr; // Pointer in line + uchar *ptr, // Pointer to pixel values + byte, // Byte from file + bit; // Bit in pixel + int format, // Format of PNM file + val, // Pixel value + maxval; // Maximum pixel value + + + if ((fp = fopen(name, "rb")) == NULL) return; + + // + // Read the file header in the format: + // + // Pformat + // # comment1 + // # comment2 + // ... + // # commentN + // width + // height + // max sample + // + + lineptr = fgets(line, sizeof(line), fp); + if (!lineptr) { + fclose(fp); + Fl::error("Early end-of-file in PNM file \"%s\"!", name); + return; + } + + lineptr ++; + + format = atoi(lineptr); + while (isdigit(*lineptr)) lineptr ++; + + if (format == 7) lineptr = (char *)""; + + while (lineptr != NULL && w() == 0) { + if (*lineptr == '\0' || *lineptr == '#') { + lineptr = fgets(line, sizeof(line), fp); + } else if (isdigit(*lineptr)) { + w(strtol(lineptr, &lineptr, 10)); + } else lineptr ++; + } + + while (lineptr != NULL && h() == 0) { + if (*lineptr == '\0' || *lineptr == '#') { + lineptr = fgets(line, sizeof(line), fp); + } else if (isdigit(*lineptr)) { + h(strtol(lineptr, &lineptr, 10)); + } else lineptr ++; + } + + if (format != 1 && format != 4) { + maxval = 0; + + while (lineptr != NULL && maxval == 0) { + if (*lineptr == '\0' || *lineptr == '#') { + lineptr = fgets(line, sizeof(line), fp); + } else if (isdigit(*lineptr)) { + maxval = strtol(lineptr, &lineptr, 10); + } else lineptr ++; + } + } else maxval = 1; + + // Allocate memory... + if (format == 1 || format == 2 || format == 4 || format == 5) d(1); + else d(3); + +// printf("%s = %dx%dx%d\n", name, w(), h(), d()); + + array = new uchar[w() * h() * d()]; + alloc_array = 1; + + // Read the image file... + for (y = 0; y < h(); y ++) { + ptr = (uchar *)array + y * w() * d(); + + switch (format) { + case 1 : + case 2 : + for (x = w(); x > 0; x --) + if (fscanf(fp, "%d", &val) == 1) *ptr++ = (uchar)(255 * val / maxval); + break; + + case 3 : + for (x = w(); x > 0; x --) { + if (fscanf(fp, "%d", &val) == 1) *ptr++ = (uchar)(255 * val / maxval); + if (fscanf(fp, "%d", &val) == 1) *ptr++ = (uchar)(255 * val / maxval); + if (fscanf(fp, "%d", &val) == 1) *ptr++ = (uchar)(255 * val / maxval); + } + break; + + case 4 : + for (x = w(), byte = (uchar)getc(fp), bit = 128; x > 0; x --) { + if (byte & bit) *ptr++ = 255; + else *ptr++ = 0; + + if (bit > 1) bit >>= 1; + else { + bit = 128; + byte = (uchar)getc(fp); + } + } + break; + + case 5 : + case 6 : + if (maxval < 256) { + fread(ptr, w(), d(), fp); + } else { + for (x = d() * w(); x > 0; x --) { + val = (uchar)getc(fp); + val = (val<<8)|(uchar)getc(fp); + *ptr++ = (255*val)/maxval; + } + } + break; + + case 7 : /* XV 3:3:2 thumbnail format */ + for (x = w(); x > 0; x --) { + byte = (uchar)getc(fp); + + *ptr++ = (uchar)(255 * ((byte >> 5) & 7) / 7); + *ptr++ = (uchar)(255 * ((byte >> 2) & 7) / 7); + *ptr++ = (uchar)(255 * (byte & 3) / 3); + } + break; + } + } + + fclose(fp); +} + + +// +// End of "$Id: Fl_PNM_Image.cxx 6006 2007-12-20 16:32:56Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Pack.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Pack.cxx new file mode 100644 index 0000000..7738172 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Pack.cxx @@ -0,0 +1,147 @@ +// +// "$Id: Fl_Pack.cxx 6868 2009-09-13 12:10:56Z AlbrechtS $" +// +// Packing widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Based on code by Curtis Edwards +// Group that compresses all it's children together and resizes to surround +// them on each redraw (only if box() is zero) +// Bugs: ? + +#include +#include +#include + +Fl_Pack::Fl_Pack(int X, int Y, int W, int H,const char *l) +: Fl_Group(X, Y, W, H, l) { + resizable(0); + spacing_ = 0; + // type(VERTICAL); // already set like this +} + +void Fl_Pack::draw() { + int tx = x()+Fl::box_dx(box()); + int ty = y()+Fl::box_dy(box()); + int tw = w()-Fl::box_dw(box()); + int th = h()-Fl::box_dh(box()); + int rw, rh; + int current_position = horizontal() ? tx : ty; + int maximum_position = current_position; + uchar d = damage(); + Fl_Widget*const* a = array(); + if (horizontal()) { + rw = -spacing_; + rh = th; + + for (int i = children(); i--;) + if (child(i)->visible()) { + if (child(i) != this->resizable()) rw += child(i)->w(); + rw += spacing_; + } + } else { + rw = tw; + rh = -spacing_; + + for (int i = children(); i--;) + if (child(i)->visible()) { + if (child(i) != this->resizable()) rh += child(i)->h(); + rh += spacing_; + } + } + for (int i = children(); i--;) { + Fl_Widget* o = *a++; + if (o->visible()) { + int X,Y,W,H; + if (horizontal()) { + X = current_position; + W = o->w(); + Y = ty; + H = th; + } else { + X = tx; + W = tw; + Y = current_position; + H = o->h(); + } + // Last child, if resizable, takes all remaining room + if(i == 0 && o == this->resizable()) { + if(horizontal()) + W = tw - rw; + else + H = th - rh; + } + if (spacing_ && current_position>maximum_position && box() && + (X != o->x() || Y != o->y() || d&FL_DAMAGE_ALL)) { + fl_color(color()); + if (horizontal()) + fl_rectf(maximum_position, ty, spacing_, th); + else + fl_rectf(tx, maximum_position, tw, spacing_); + } + if (X != o->x() || Y != o->y() || W != o->w() || H != o->h()) { + o->resize(X,Y,W,H); + o->clear_damage(FL_DAMAGE_ALL); + } + if (d&FL_DAMAGE_ALL) { + draw_child(*o); + draw_outside_label(*o); + } else update_child(*o); + // child's draw() can change it's size, so use new size: + current_position += (horizontal() ? o->w() : o->h()); + if (current_position > maximum_position) + maximum_position = current_position; + current_position += spacing_; + } + } + + if (horizontal()) { + if (maximum_position < tx+tw && box()) { + fl_color(color()); + fl_rectf(maximum_position, ty, tx+tw-maximum_position, th); + } + tw = maximum_position-tx; + } else { + if (maximum_position < ty+th && box()) { + fl_color(color()); + fl_rectf(tx, maximum_position, tw, ty+th-maximum_position); + } + th = maximum_position-ty; + } + + tw += Fl::box_dw(box()); if (tw <= 0) tw = 1; + th += Fl::box_dh(box()); if (th <= 0) th = 1; + if (tw != w() || th != h()) { + Fl_Widget::resize(x(),y(),tw,th); + d = FL_DAMAGE_ALL; + } + if (d&FL_DAMAGE_ALL) { + draw_box(); + draw_label(); + } +} + +// +// End of "$Id: Fl_Pack.cxx 6868 2009-09-13 12:10:56Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Pixmap.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Pixmap.cxx new file mode 100644 index 0000000..86e86fa --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Pixmap.cxx @@ -0,0 +1,495 @@ +// +// "$Id: Fl_Pixmap.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Pixmap drawing code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Draws X pixmap data, keeping it stashed in a server pixmap so it +// redraws fast. + +// See fl_draw_pixmap.cxx for code used to get the actual data into pixmap. +// Implemented without using the xpm library (which I can't use because +// it interferes with the color cube used by fl_draw_image). + +#include +#include +#include +#include +#include +#include + +#include +#include "flstring.h" +#include + +#ifdef WIN32 +extern void fl_release_dc(HWND, HDC); // located in Fl_win32.cxx +#endif + +#ifdef __APPLE_QUARTZ__ +extern Fl_Offscreen fl_create_offscreen_with_alpha(int w, int h); +#endif + +extern uchar **fl_mask_bitmap; // used by fl_draw_pixmap.cxx to store mask +void fl_restore_clip(); // in fl_rect.cxx + +void Fl_Pixmap::measure() { + int W, H; + + // ignore empty or bad pixmap data: + if (w()<0 && data()) { + fl_measure_pixmap(data(), W, H); + w(W); h(H); + } +} + +void Fl_Pixmap::draw(int XP, int YP, int WP, int HP, int cx, int cy) { + // ignore empty or bad pixmap data: + if (!data()) { + draw_empty(XP, YP); + return; + } + if (w()<0) measure(); + if (WP==-1) { + WP = w(); + HP = h(); + } + if (!w()) { + draw_empty(XP, YP); + return; + } + // account for current clip region (faster on Irix): + int X,Y,W,H; fl_clip_box(XP,YP,WP,HP,X,Y,W,H); + cx += X-XP; cy += Y-YP; + // clip the box down to the size of image, quit if empty: + if (cx < 0) {W += cx; X -= cx; cx = 0;} + if (cx+W > w()) W = w()-cx; + if (W <= 0) return; + if (cy < 0) {H += cy; Y -= cy; cy = 0;} + if (cy+H > h()) H = h()-cy; + if (H <= 0) return; + if (!id) { +#ifdef __APPLE_QUARTZ__ + id = fl_create_offscreen_with_alpha(w(), h()); + fl_begin_offscreen((Fl_Offscreen)id); + fl_draw_pixmap(data(), 0, 0, FL_GREEN); + fl_end_offscreen(); +#else + id = fl_create_offscreen(w(), h()); + fl_begin_offscreen((Fl_Offscreen)id); + uchar *bitmap = 0; + fl_mask_bitmap = &bitmap; + fl_draw_pixmap(data(), 0, 0, FL_BLACK); + fl_mask_bitmap = 0; + if (bitmap) { + mask = fl_create_bitmask(w(), h(), bitmap); + delete[] bitmap; + } + fl_end_offscreen(); +#endif + } +#ifdef WIN32 + if (mask) { + HDC new_gc = CreateCompatibleDC(fl_gc); + int save = SaveDC(new_gc); + SelectObject(new_gc, (void*)mask); + BitBlt(fl_gc, X, Y, W, H, new_gc, cx, cy, SRCAND); + SelectObject(new_gc, (void*)id); + BitBlt(fl_gc, X, Y, W, H, new_gc, cx, cy, SRCPAINT); + RestoreDC(new_gc,save); + DeleteDC(new_gc); + } else { + fl_copy_offscreen(X, Y, W, H, (Fl_Offscreen)id, cx, cy); + } +#elif defined(__APPLE_QD__) + if (mask) { + Rect src, dst; + src.left = cx; src.right = cx+W; + src.top = cy; src.bottom = cy+H; + dst.left = X; dst.right = X+W; + dst.top = Y; dst.bottom = Y+H; + RGBColor rgb, oldfg, oldbg; + GetForeColor(&oldfg); + GetBackColor(&oldbg); + rgb.red = 0xffff; rgb.green = 0xffff; rgb.blue = 0xffff; + RGBBackColor(&rgb); + rgb.red = 0x0000; rgb.green = 0x0000; rgb.blue = 0x0000; + RGBForeColor(&rgb); + CopyMask(GetPortBitMapForCopyBits((GrafPtr)id), + GetPortBitMapForCopyBits((GrafPtr)mask), + GetPortBitMapForCopyBits(GetWindowPort(fl_window)), + &src, &src, &dst); + RGBBackColor(&oldbg); + RGBForeColor(&oldfg); + } else { + fl_copy_offscreen(X, Y, W, H, (Fl_Offscreen)id, cx, cy); + } +#elif defined(__APPLE_QUARTZ__) + fl_copy_offscreen(X, Y, W, H, (Fl_Offscreen)id, cx, cy); +#else + if (mask) { + // I can't figure out how to combine a mask with existing region, + // so cut the image down to a clipped rectangle: + int nx, ny; fl_clip_box(X,Y,W,H,nx,ny,W,H); + cx += nx-X; X = nx; + cy += ny-Y; Y = ny; + // make X use the bitmap as a mask: + XSetClipMask(fl_display, fl_gc, mask); + int ox = X-cx; if (ox < 0) ox += w(); + int oy = Y-cy; if (oy < 0) oy += h(); + XSetClipOrigin(fl_display, fl_gc, X-cx, Y-cy); + } + fl_copy_offscreen(X, Y, W, H, id, cx, cy); + if (mask) { + // put the old clip region back + XSetClipOrigin(fl_display, fl_gc, 0, 0); + fl_restore_clip(); + } +#endif +} + +Fl_Pixmap::~Fl_Pixmap() { + uncache(); + delete_data(); +} + +void Fl_Pixmap::uncache() { + if (id) { + fl_delete_offscreen((Fl_Offscreen)id); + id = 0; + } + + if (mask) { + fl_delete_bitmask((Fl_Bitmask)mask); + mask = 0; + } +} + +void Fl_Pixmap::label(Fl_Widget* widget) { + widget->image(this); +} + +void Fl_Pixmap::label(Fl_Menu_Item* m) { + Fl::set_labeltype(_FL_IMAGE_LABEL, labeltype, Fl_Image::measure); + m->label(_FL_IMAGE_LABEL, (const char*)this); +} + +void Fl_Pixmap::copy_data() { + if (alloc_data) return; + + char **new_data, // New data array + **new_row; // Current row in image + int i, // Looping var + ncolors, // Number of colors in image + chars_per_pixel,// Characters per color + chars_per_line; // Characters per line + + // Figure out how many colors there are, and how big they are... + sscanf(data()[0],"%*d%*d%d%d", &ncolors, &chars_per_pixel); + chars_per_line = chars_per_pixel * w() + 1; + + // Allocate memory for the new array... + if (ncolors < 0) new_data = new char *[h() + 2]; + else new_data = new char *[h() + ncolors + 1]; + + new_data[0] = new char[strlen(data()[0]) + 1]; + strcpy(new_data[0], data()[0]); + + // Copy colors... + if (ncolors < 0) { + // Copy FLTK colormap values... + ncolors = -ncolors; + new_row = new_data + 1; + *new_row = new char[ncolors * 4]; + memcpy(*new_row, data()[1], ncolors * 4); + ncolors = 1; + new_row ++; + } else { + // Copy standard XPM colormap values... + for (i = 0, new_row = new_data + 1; i < ncolors; i ++, new_row ++) { + *new_row = new char[strlen(data()[i + 1]) + 1]; + strcpy(*new_row, data()[i + 1]); + } + } + + // Copy image data... + for (i = 0; i < h(); i ++, new_row ++) { + *new_row = new char[chars_per_line]; + memcpy(*new_row, data()[i + ncolors + 1], chars_per_line); + } + + // Update pointers... + data((const char **)new_data, h() + ncolors + 1); + alloc_data = 1; +} + +Fl_Image *Fl_Pixmap::copy(int W, int H) { + Fl_Pixmap *new_image; // New pixmap + + // Optimize the simple copy where the width and height are the same... + if (W == w() && H == h()) { + // Make an exact copy of the image and return it... + new_image = new Fl_Pixmap(data()); + new_image->copy_data(); + return new_image; + } + if (W <= 0 || H <= 0) return 0; + + // OK, need to resize the image data; allocate memory and + char **new_data, // New array for image data + **new_row, // Pointer to row in image data + *new_ptr, // Pointer into new array + new_info[255]; // New information line + const char *old_ptr; // Pointer into old array + int i, // Looping var + c, // Channel number + sy, // Source coordinate + dx, dy, // Destination coordinates + xerr, yerr, // X & Y errors + xmod, ymod, // X & Y moduli + xstep, ystep; // X & Y step increments + int ncolors, // Number of colors in image + chars_per_pixel,// Characters per color + chars_per_line; // Characters per line + + // Figure out how many colors there are, and how big they are... + sscanf(data()[0],"%*d%*d%d%d", &ncolors, &chars_per_pixel); + chars_per_line = chars_per_pixel * W + 1; + + sprintf(new_info, "%d %d %d %d", W, H, ncolors, chars_per_pixel); + + // Figure out Bresenheim step/modulus values... + xmod = w() % W; + xstep = (w() / W) * chars_per_pixel; + ymod = h() % H; + ystep = h() / H; + + // Allocate memory for the new array... + if (ncolors < 0) new_data = new char *[H + 2]; + else new_data = new char *[H + ncolors + 1]; + new_data[0] = new char[strlen(new_info) + 1]; + strcpy(new_data[0], new_info); + + // Copy colors... + if (ncolors < 0) { + // Copy FLTK colormap values... + ncolors = -ncolors; + new_row = new_data + 1; + *new_row = new char[ncolors * 4]; + memcpy(*new_row, data()[1], ncolors * 4); + ncolors = 1; + new_row ++; + } else { + // Copy standard XPM colormap values... + for (i = 0, new_row = new_data + 1; i < ncolors; i ++, new_row ++) { + *new_row = new char[strlen(data()[i + 1]) + 1]; + strcpy(*new_row, data()[i + 1]); + } + } + + // Scale the image using a nearest-neighbor algorithm... + for (dy = H, sy = 0, yerr = H; dy > 0; dy --, new_row ++) { + *new_row = new char[chars_per_line]; + new_ptr = *new_row; + + for (dx = W, xerr = W, old_ptr = data()[sy + ncolors + 1]; + dx > 0; + dx --) { + for (c = 0; c < chars_per_pixel; c ++) *new_ptr++ = old_ptr[c]; + + old_ptr += xstep; + xerr -= xmod; + + if (xerr <= 0) { + xerr += W; + old_ptr += chars_per_pixel; + } + } + + *new_ptr = '\0'; + sy += ystep; + yerr -= ymod; + if (yerr <= 0) { + yerr += H; + sy ++; + } + } + + new_image = new Fl_Pixmap((char*const*)new_data); + new_image->alloc_data = 1; + + return new_image; +} + +void Fl_Pixmap::color_average(Fl_Color c, float i) { + // Delete any existing pixmap/mask objects... + uncache(); + + // Allocate memory as needed... + copy_data(); + + // Get the color to blend with... + uchar r, g, b; + unsigned ia, ir, ig, ib; + + Fl::get_color(c, r, g, b); + if (i < 0.0f) i = 0.0f; + else if (i > 1.0f) i = 1.0f; + + ia = (unsigned)(256 * i); + ir = r * (256 - ia); + ig = g * (256 - ia); + ib = b * (256 - ia); + + // Update the colormap to do the blend... + char line[255]; // New colormap line + int color, // Looping var + ncolors, // Number of colors in image + chars_per_pixel;// Characters per color + + + sscanf(data()[0],"%*d%*d%d%d", &ncolors, &chars_per_pixel); + + if (ncolors < 0) { + // Update FLTK colormap... + ncolors = -ncolors; + uchar *cmap = (uchar *)(data()[1]); + for (color = 0; color < ncolors; color ++, cmap += 4) { + cmap[1] = (ia * cmap[1] + ir) >> 8; + cmap[2] = (ia * cmap[2] + ig) >> 8; + cmap[3] = (ia * cmap[3] + ib) >> 8; + } + } else { + // Update standard XPM colormap... + for (color = 0; color < ncolors; color ++) { + // look for "c word", or last word if none: + const char *p = data()[color + 1] + chars_per_pixel + 1; + const char *previous_word = p; + for (;;) { + while (*p && isspace(*p)) p++; + char what = *p++; + while (*p && !isspace(*p)) p++; + while (*p && isspace(*p)) p++; + if (!*p) {p = previous_word; break;} + if (what == 'c') break; + previous_word = p; + while (*p && !isspace(*p)) p++; + } + + if (fl_parse_color(p, r, g, b)) { + r = (ia * r + ir) >> 8; + g = (ia * g + ig) >> 8; + b = (ia * b + ib) >> 8; + + if (chars_per_pixel > 1) sprintf(line, "%c%c c #%02X%02X%02X", + data()[color + 1][0], + data()[color + 1][1], r, g, b); + else sprintf(line, "%c c #%02X%02X%02X", data()[color + 1][0], r, g, b); + + delete[] (char *)data()[color + 1]; + ((char **)data())[color + 1] = new char[strlen(line) + 1]; + strcpy((char *)data()[color + 1], line); + } + } + } +} + +void Fl_Pixmap::delete_data() { + if (alloc_data) { + for (int i = 0; i < count(); i ++) delete[] (char *)data()[i]; + delete[] (char **)data(); + } +} + +void Fl_Pixmap::set_data(const char * const * p) { + int height, // Number of lines in image + ncolors; // Number of colors in image + + if (p) { + sscanf(p[0],"%*d%d%d", &height, &ncolors); + if (ncolors < 0) data(p, height + 2); + else data(p, height + ncolors + 1); + } +} + + +void Fl_Pixmap::desaturate() { + // Delete any existing pixmap/mask objects... + uncache(); + + // Allocate memory as needed... + copy_data(); + + // Update the colormap to grayscale... + char line[255]; // New colormap line + int i, // Looping var + ncolors, // Number of colors in image + chars_per_pixel;// Characters per color + uchar r, g, b; + + sscanf(data()[0],"%*d%*d%d%d", &ncolors, &chars_per_pixel); + + if (ncolors < 0) { + // Update FLTK colormap... + ncolors = -ncolors; + uchar *cmap = (uchar *)(data()[1]); + for (i = 0; i < ncolors; i ++, cmap += 4) { + g = (uchar)((cmap[1] * 31 + cmap[2] * 61 + cmap[3] * 8) / 100); + cmap[1] = cmap[2] = cmap[3] = g; + } + } else { + // Update standard XPM colormap... + for (i = 0; i < ncolors; i ++) { + // look for "c word", or last word if none: + const char *p = data()[i + 1] + chars_per_pixel + 1; + const char *previous_word = p; + for (;;) { + while (*p && isspace(*p)) p++; + char what = *p++; + while (*p && !isspace(*p)) p++; + while (*p && isspace(*p)) p++; + if (!*p) {p = previous_word; break;} + if (what == 'c') break; + previous_word = p; + while (*p && !isspace(*p)) p++; + } + + if (fl_parse_color(p, r, g, b)) { + g = (uchar)((r * 31 + g * 61 + b * 8) / 100); + + if (chars_per_pixel > 1) sprintf(line, "%c%c c #%02X%02X%02X", data()[i + 1][0], + data()[i + 1][1], g, g, g); + else sprintf(line, "%c c #%02X%02X%02X", data()[i + 1][0], g, g, g); + + delete[] (char *)data()[i + 1]; + ((char **)data())[i + 1] = new char[strlen(line) + 1]; + strcpy((char *)data()[i + 1], line); + } + } + } +} + +// +// End of "$Id: Fl_Pixmap.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Positioner.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Positioner.cxx new file mode 100644 index 0000000..f0c6bd8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Positioner.cxx @@ -0,0 +1,151 @@ +// +// "$Id: Fl_Positioner.cxx 5347 2006-08-23 12:57:42Z matt $" +// +// Positioner widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// The positioner widget from Forms, gives 2D input +// Written by: Mark Overmars + +#include +#include +#include + +static double flinear(double val, double smin, double smax, double gmin, double gmax) +{ + if (smin == smax) return gmax; + else return gmin + (gmax - gmin) * (val - smin) / (smax - smin); +} + +void Fl_Positioner::draw(int X, int Y, int W, int H) { + int x1 = X + 4; + int y1 = Y + 4; + int w1 = W - 2 * 4; + int h1 = H - 2 * 4; + int xx = int(flinear(xvalue(), xmin, xmax, x1, x1+w1-1)+.5); + int yy = int(flinear(yvalue(), ymin, ymax, y1, y1+h1-1)+.5); + draw_box(box(), X, Y, W, H, color()); + fl_color(selection_color()); + fl_xyline(x1, yy, x1+w1); + fl_yxline(xx, y1, y1+h1); +} + +void Fl_Positioner::draw() { + draw(x(), y(), w(), h()); + draw_label(); +} + +int Fl_Positioner::value(double X, double Y) { + clear_changed(); + if (X == xvalue_ && Y == yvalue_) return 0; + xvalue_ = X; yvalue_ = Y; + redraw(); + return 1; +} + +int Fl_Positioner::xvalue(double X) { + return(value(X, yvalue_)); +} + +int Fl_Positioner::yvalue(double Y) { + return(value(xvalue_, Y)); +} + +int Fl_Positioner::handle(int event, int X, int Y, int W, int H) { + switch (event) { + case FL_PUSH: + case FL_DRAG: + case FL_RELEASE: { + double x1 = X + 4; + double y1 = Y + 4; + double w1 = W - 2 * 4; + double h1 = H - 2 * 4; + double xx = flinear(Fl::event_x(), x1, x1+w1-1.0, xmin, xmax); + if (xstep_) xx = int(xx/xstep_+0.5) * xstep_; + if (xmin < xmax) { + if (xx < xmin) xx = xmin; + if (xx > xmax) xx = xmax; + } else { + if (xx > xmin) xx = xmin; + if (xx < xmax) xx = xmax; + } + double yy = flinear(Fl::event_y(), y1, y1+h1-1.0, ymin, ymax); + if (ystep_) yy = int(yy/ystep_+0.5) * ystep_; + if (ymin < ymax) { + if (yy < ymin) yy = ymin; + if (yy > ymax) yy = ymax; + } else { + if (yy > ymin) yy = ymin; + if (yy < ymax) yy = ymax; + } + if (xx != xvalue_ || yy != yvalue_) { + xvalue_ = xx; yvalue_ = yy; + set_changed(); + redraw(); + } } + if (!(when() & FL_WHEN_CHANGED || + (when() & FL_WHEN_RELEASE && event == FL_RELEASE))) return 1; + if (changed() || when()&FL_WHEN_NOT_CHANGED) { + if (event == FL_RELEASE) clear_changed(); + do_callback(); + } + return 1; + default: + return 0; + } +} + +int Fl_Positioner::handle(int e) { + return handle(e, x(), y(), w(), h()); +} + +Fl_Positioner::Fl_Positioner(int X, int Y, int W, int H, const char* l) +: Fl_Widget(X, Y, W, H, l) { + box(FL_DOWN_BOX); + selection_color(FL_RED); + align(FL_ALIGN_BOTTOM); + when(FL_WHEN_CHANGED); + xmin = ymin = 0; + xmax = ymax = 1; + xvalue_ = yvalue_ = .5; + xstep_ = ystep_ = 0; +} + +void Fl_Positioner::xbounds(double a, double b) { + if (a != xmin || b != xmax) { + xmin = a; xmax = b; + redraw(); + } +} + +void Fl_Positioner::ybounds(double a, double b) { + if (a != ymin || b != ymax) { + ymin = a; ymax = b; + redraw(); + } +} + +// +// End of "$Id: Fl_Positioner.cxx 5347 2006-08-23 12:57:42Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Preferences.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Preferences.cxx new file mode 100644 index 0000000..9693720 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Preferences.cxx @@ -0,0 +1,1182 @@ +// +// "$Id: Fl_Preferences.cxx 6015 2008-01-09 21:23:51Z matt $" +// +// Preferences methods for the Fast Light Tool Kit (FLTK). +// +// Copyright 2002-2005 by Matthias Melcher. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + + +#include +#include +#include + +#include +#include +#include +#include "flstring.h" +#include + +#if defined(WIN32) && !defined(__CYGWIN__) +# include +# include +// Visual C++ 2005 incorrectly displays a warning about the use of POSIX APIs +// on Windows, which is supposed to be POSIX compliant... +# define access _access +# define mkdir _mkdir +#elif defined (__APPLE__) +# include +# include +#else +# include +#endif + + +char Fl_Preferences::nameBuffer[128]; + + +/** + * create the initial preferences base + * - root: machine or user preferences + * - vendor: unique identification of author or vendor of application + * Must be a valid directory name. + * - application: vendor unique application name, i.e. "PreferencesTest" + * multiple preferences files can be created per application. + * Must be a valid file name. + * example: Fl_Preferences base( Fl_Preferences::USER, "fltk.org", "test01"); + */ +Fl_Preferences::Fl_Preferences( Root root, const char *vendor, const char *application ) +{ + node = new Node( "." ); + rootNode = new RootNode( this, root, vendor, application ); +} + + +/** + * create the initial preferences base + * - path: an application-supplied path + * example: Fl_Preferences base( "/usr/foo" ); + */ +Fl_Preferences::Fl_Preferences( const char *path, const char *vendor, const char *application ) +{ + node = new Node( "." ); + rootNode = new RootNode( this, path, vendor, application ); +} + + +/** + * create a Preferences node in relation to a parent node for reading and writing + * - parent: base name for group + * - group: group name (can contain '/' seperated group names) + * example: Fl_Preferences colors( base, "setup/colors" ); + */ +Fl_Preferences::Fl_Preferences( Fl_Preferences &parent, const char *key ) +{ + rootNode = parent.rootNode; + node = parent.node->addChild( key ); +} + + +/** + * create a Preferences node in relation to a parent node for reading and writing + * - parent: base name for group + * - group: group name (can contain '/' seperated group names) + * example: Fl_Preferences colors( base, "setup/colors" ); + */ +Fl_Preferences::Fl_Preferences( Fl_Preferences *parent, const char *key ) +{ + rootNode = parent->rootNode; + node = parent->node->addChild( key ); +} + + +/** + * destroy individual keys + * - destroying the base preferences will flush changes to the prefs file + * - after destroying the base, none of the depending preferences must be read or written + */ +Fl_Preferences::~Fl_Preferences() +{ + if (node && !node->parent()) delete rootNode; + // DO NOT delete nodes! The root node will do that after writing the preferences + // zero all pointer to avoid memory errors, event though + // Valgrind does not complain (Cygwind does though) + node = 0L; + rootNode = 0L; +} + + +/** + * return the number of groups that are contained within a group + * example: int n = base.groups(); + */ +int Fl_Preferences::groups() +{ + return node->nChildren(); +} + + +/** + * return the group name of the n'th group + * - there is no guaranteed order of group names + * - the index must be within the range given by groups() + * example: printf( "Group(%d)='%s'\n", ix, base.group(ix) ); + */ +const char *Fl_Preferences::group( int ix ) +{ + return node->child( ix ); +} + + +/** + * return 1, if a group with this name exists + * example: if ( base.groupExists( "setup/colors" ) ) ... + */ +char Fl_Preferences::groupExists( const char *key ) +{ + return node->search( key ) ? 1 : 0 ; +} + + +/** + * delete a group + * example: setup.deleteGroup( "colors/buttons" ); + */ +char Fl_Preferences::deleteGroup( const char *key ) +{ + Node *nd = node->search( key ); + if ( nd ) return nd->remove(); + return 0; +} + + +/** + * return the number of entries (name/value) pairs for a group + * example: int n = buttonColor.entries(); + */ +int Fl_Preferences::entries() +{ + return node->nEntry; +} + + +/** + * return the name of an entry + * - there is no guaranteed order of entry names + * - the index must be within the range given by entries() + * example: printf( "Entry(%d)='%s'\n", ix, buttonColor.entry(ix) ); + */ +const char *Fl_Preferences::entry( int ix ) +{ + return node->entry[ix].name; +} + + +/** + * return 1, if an entry with this name exists + * example: if ( buttonColor.entryExists( "red" ) ) ... + */ +char Fl_Preferences::entryExists( const char *key ) +{ + return node->getEntry( key )>=0 ? 1 : 0 ; +} + + +/** + * remove a single entry (name/value pair) + * example: buttonColor.deleteEntry( "red" ); + */ +char Fl_Preferences::deleteEntry( const char *key ) +{ + return node->deleteEntry( key ); +} + + +/** + * read an entry from the group + */ +char Fl_Preferences::get( const char *key, int &value, int defaultValue ) +{ + const char *v = node->get( key ); + value = v ? atoi( v ) : defaultValue; + return ( v != 0 ); +} + + +/** + * set an entry (name/value pair) + */ +char Fl_Preferences::set( const char *key, int value ) +{ + sprintf( nameBuffer, "%d", value ); + node->set( key, nameBuffer ); + return 1; +} + + +/** + * read an entry from the group + */ +char Fl_Preferences::get( const char *key, float &value, float defaultValue ) +{ + const char *v = node->get( key ); + value = v ? (float)atof( v ) : defaultValue; + return ( v != 0 ); +} + + +/** + * set an entry (name/value pair) + */ +char Fl_Preferences::set( const char *key, float value ) +{ + sprintf( nameBuffer, "%g", value ); + node->set( key, nameBuffer ); + return 1; +} + + +/** + * set an entry (name/value pair) + */ +char Fl_Preferences::set( const char *key, float value, int precision ) +{ + sprintf( nameBuffer, "%.*g", precision, value ); + node->set( key, nameBuffer ); + return 1; +} + + +/** + * read an entry from the group + */ +char Fl_Preferences::get( const char *key, double &value, double defaultValue ) +{ + const char *v = node->get( key ); + value = v ? atof( v ) : defaultValue; + return ( v != 0 ); +} + + +/** + * set an entry (name/value pair) + */ +char Fl_Preferences::set( const char *key, double value ) +{ + sprintf( nameBuffer, "%g", value ); + node->set( key, nameBuffer ); + return 1; +} + + +/** + * set an entry (name/value pair) + */ +char Fl_Preferences::set( const char *key, double value, int precision ) +{ + sprintf( nameBuffer, "%.*g", precision, value ); + node->set( key, nameBuffer ); + return 1; +} + + +// remove control sequences from a string +static char *decodeText( const char *src ) +{ + int len = 0; + const char *s = src; + for ( ; *s; s++, len++ ) + { + if ( *s == '\\' ) + if ( isdigit( s[1] ) ) s+=3; else s+=1; + } + char *dst = (char*)malloc( len+1 ), *d = dst; + for ( s = src; *s; s++ ) + { + char c = *s; + if ( c == '\\' ) + { + if ( s[1] == '\\' ) { *d++ = c; s++; } + else if ( s[1] == 'n' ) { *d++ = '\n'; s++; } + else if ( s[1] == 'r' ) { *d++ = '\r'; s++; } + else if ( isdigit( s[1] ) ) { *d++ = ((s[1]-'0')<<6) + ((s[2]-'0')<<3) + (s[3]-'0'); s+=3; } + else s++; // error + } + else + *d++ = c; + } + *d = 0; + return dst; +} + + +/** + * read a text entry from the group + * the text will be moved into the given text buffer + * text will be clipped to the buffer size + */ +char Fl_Preferences::get( const char *key, char *text, const char *defaultValue, int maxSize ) +{ + const char *v = node->get( key ); + if ( v && strchr( v, '\\' ) ) { + char *w = decodeText( v ); + strlcpy(text, w, maxSize); + free( w ); + return 1; + } + if ( !v ) v = defaultValue; + if ( v ) strlcpy(text, v, maxSize); + else text = 0; + return ( v != defaultValue ); +} + + +/** + * read a text entry from the group + * 'text' will be changed to point to a new text buffer + * the text buffer must be deleted with 'free(text)' by the user. + */ +char Fl_Preferences::get( const char *key, char *&text, const char *defaultValue ) +{ + const char *v = node->get( key ); + if ( v && strchr( v, '\\' ) ) + { + text = decodeText( v ); + return 1; + } + if ( !v ) v = defaultValue; + if ( v ) + text = strdup( v ); + else + text = 0; + return ( v != defaultValue ); +} + + +/** + * set an entry (name/value pair) + */ +char Fl_Preferences::set( const char *key, const char *text ) +{ + const char *s = text ? text : ""; + int n=0, ns=0; + for ( ; *s; s++ ) { n++; if ( *s<32 || *s=='\\' || *s==0x7f ) ns+=4; } + if ( ns ) + { + char *buffer = (char*)malloc( n+ns+1 ), *d = buffer; + for ( s=text; *s; ) + { + char c = *s; + if ( c=='\\' ) { *d++ = '\\'; *d++ = '\\'; s++; } + else if ( c=='\n' ) { *d++ = '\\'; *d++ = 'n'; s++; } + else if ( c=='\r' ) { *d++ = '\\'; *d++ = 'r'; s++; } + else if ( c<32 || c==0x7f ) + { *d++ = '\\'; *d++ = '0'+((c>>6)&3); *d++ = '0'+((c>>3)&7); *d++ = '0'+(c&7); s++; } + else *d++ = *s++; + } + *d = 0; + node->set( key, buffer ); + free( buffer ); + } + else + node->set( key, text ); + return 1; +} + + +// convert a hex string to binary data +static void *decodeHex( const char *src, int &size ) +{ + size = strlen( src )/2; + unsigned char *data = (unsigned char*)malloc( size ), *d = data; + const char *s = src; + int i; + + for ( i=size; i>0; i-- ) + { + int v; + char x = tolower(*s++); + if ( x >= 'a' ) v = x-'a'+10; else v = x-'0'; + v = v<<4; + x = tolower(*s++); + if ( x >= 'a' ) v += x-'a'+10; else v += x-'0'; + *d++ = (uchar)v; + } + + return (void*)data; +} + + +/** + * read a binary entry from the group + * the data will be moved into the given destination buffer + * data will be clipped to the buffer size + */ +char Fl_Preferences::get( const char *key, void *data, const void *defaultValue, int defaultSize, int maxSize ) +{ + const char *v = node->get( key ); + if ( v ) + { + int dsize; + void *w = decodeHex( v, dsize ); + memmove( data, w, dsize>maxSize?maxSize:dsize ); + free( w ); + return 1; + } + if ( defaultValue ) + memmove( data, defaultValue, defaultSize>maxSize?maxSize:defaultSize ); + return 0; +} + + +/** + * read a binary entry from the group + * 'data' will be changed to point to a new data buffer + * the data buffer must be deleted with 'free(data)' by the user. + */ +char Fl_Preferences::get( const char *key, void *&data, const void *defaultValue, int defaultSize ) +{ + const char *v = node->get( key ); + if ( v ) + { + int dsize; + data = decodeHex( v, dsize ); + return 1; + } + if ( defaultValue ) + { + data = (void*)malloc( defaultSize ); + memmove( data, defaultValue, defaultSize ); + } + else + data = 0; + return 0; +} + + +/** + * set an entry (name/value pair) + */ +char Fl_Preferences::set( const char *key, const void *data, int dsize ) +{ + char *buffer = (char*)malloc( dsize*2+1 ), *d = buffer;; + unsigned char *s = (unsigned char*)data; + for ( ; dsize>0; dsize-- ) + { + static char lu[] = "0123456789abcdef"; + unsigned char v = *s++; + *d++ = lu[v>>4]; + *d++ = lu[v&0xf]; + } + *d = 0; + node->set( key, buffer ); + free( buffer ); + return 1; +} + + +/** + * return the size of the value part of an entry + */ +int Fl_Preferences::size( const char *key ) +{ + const char *v = node->get( key ); + return v ? strlen( v ) : 0 ; +} + +/** + * creates a path that is related to the preferences file + * and that is usable for application data beyond what is covered + * by Fl_Preferences. + * - 'getUserdataPath' actually creates the directory + * - 'path' must be large enough to receive a complete file path + * example: + * Fl_Preferences prefs( USER, "matthiasm.com", "test" ); + * char path[FL_PATH_MAX]; + * prefs.getUserdataPath( path ); + * sample returns: + * Win32: c:/Documents and Settings/matt/Application Data/matthiasm.com/test/ + * prefs: c:/Documents and Settings/matt/Application Data/matthiasm.com/test.prefs + */ +char Fl_Preferences::getUserdataPath( char *path, int pathlen ) +{ + if ( rootNode ) + return rootNode->getPath( path, pathlen ); + return 0; +} + +/** + * write all preferences to disk + * - this function works only with the base preference group + * - this function is rarely used as deleting the base preferences flushes automatically + */ +void Fl_Preferences::flush() +{ + if ( rootNode && node->dirty() ) + rootNode->write(); +} + +//----------------------------------------------------------------------------- +// helper class to create dynamic group and entry names on the fly +// + +/** + * create a group name or entry name on the fly + * - this version creates a simple unsigned integer as an entry name + * example: + * int n, i; + * Fl_Preferences prev( appPrefs, "PreviousFiles" ); + * prev.get( "n", 0 ); + * for ( i=0; inode->dirty() ) + write(); + if ( filename_ ) { + free( filename_ ); + filename_ = 0L; + } + if ( vendor_ ) { + free( vendor_ ); + vendor_ = 0L; + } + if ( application_ ) { + free( application_ ); + application_ = 0L; + } + delete prefs_->node; + prefs_->node = 0L; +} + +// read a preferences file and construct the group tree and with all entry leafs +int Fl_Preferences::RootNode::read() +{ + char buf[1024]; + FILE *f = fopen( filename_, "rb" ); + if ( !f ) return 0; + fgets( buf, 1024, f ); + fgets( buf, 1024, f ); + fgets( buf, 1024, f ); + Node *nd = prefs_->node; + for (;;) + { + if ( !fgets( buf, 1024, f ) ) break; // EOF or Error + if ( buf[0]=='[' ) // read a new group + { + int end = strcspn( buf+1, "]\n\r" ); + buf[ end+1 ] = 0; + nd = prefs_->node->find( buf+1 ); + } + else if ( buf[0]=='+' ) // + { // value of previous name/value pair spans multiple lines + int end = strcspn( buf+1, "\n\r" ); + if ( end != 0 ) // if entry is not empty + { + buf[ end+1 ] = 0; + nd->add( buf+1 ); + } + } + else // read a name/value pair + { + int end = strcspn( buf, "\n\r" ); + if ( end != 0 ) // if entry is not empty + { + buf[ end ] = 0; + nd->set( buf ); + } + } + } + fclose( f ); + return 0; +} + +// write the group tree and all entry leafs +int Fl_Preferences::RootNode::write() +{ + makePathForFile(filename_); + FILE *f = fopen( filename_, "wb" ); + if ( !f ) return 1; + fprintf( f, "; FLTK preferences file format 1.0\n" ); + fprintf( f, "; vendor: %s\n", vendor_ ); + fprintf( f, "; application: %s\n", application_ ); + prefs_->node->write( f ); + fclose( f ); + return 0; +} + +// get the path to the preferences directory +char Fl_Preferences::RootNode::getPath( char *path, int pathlen ) +{ + strlcpy( path, filename_, pathlen); + + char *s; + for ( s = path; *s; s++ ) if ( *s == '\\' ) *s = '/'; + s = strrchr( path, '.' ); + if ( !s ) return 0; + *s = 0; + char ret = makePath( path ); + strcpy( s, "/" ); + return ret; +} + +// create a node that represents a group +// - path must be a single word, prferable alnum(), dot and underscore only. Space is ok. +Fl_Preferences::Node::Node( const char *path ) +{ + if ( path ) path_ = strdup( path ); else path_ = 0; + child_ = 0; next_ = 0; parent_ = 0; + entry = 0; + nEntry = NEntry = 0; + dirty_ = 0; +} + +// delete this and all depending nodes +Fl_Preferences::Node::~Node() +{ + Node *nx; + for ( Node *nd = child_; nd; nd = nx ) + { + nx = nd->next_; + delete nd; + } + child_ = 0L; + if ( entry ) + { + for ( int i = 0; i < nEntry; i++ ) + { + if ( entry[i].name ) { + free( entry[i].name ); + entry[i].name = 0L; + } + if ( entry[i].value ) { + free( entry[i].value ); + entry[i].value = 0L; + } + } + free( entry ); + entry = 0L; + nEntry = 0; + } + if ( path_ ) { + free( path_ ); + path_ = 0L; + } + next_ = 0L; + parent_ = 0L; +} + +// recursively check if any entry is dirty (was changed after loading a fresh prefs file) +char Fl_Preferences::Node::dirty() +{ + if ( dirty_ ) return 1; + if ( next_ && next_->dirty() ) return 1; + if ( child_ && child_->dirty() ) return 1; + return 0; +} + +// write this node (recursively from the last neighbor back to this) +// write all entries +// write all children +int Fl_Preferences::Node::write( FILE *f ) +{ + if ( next_ ) next_->write( f ); + fprintf( f, "\n[%s]\n\n", path_ ); + for ( int i = 0; i < nEntry; i++ ) + { + char *src = entry[i].value; + if ( src ) + { // hack it into smaller pieces if needed + fprintf( f, "%s:", entry[i].name ); + int cnt; + for ( cnt = 0; cnt < 60; cnt++ ) + if ( src[cnt]==0 ) break; + fwrite( src, cnt, 1, f ); + fprintf( f, "\n" ); + src += cnt; + for (;*src;) + { + for ( cnt = 0; cnt < 80; cnt++ ) + if ( src[cnt]==0 ) break; + fputc( '+', f ); + fwrite( src, cnt, 1, f ); + fputc( '\n', f ); + src += cnt; + } + } + else + fprintf( f, "%s\n", entry[i].name ); + } + if ( child_ ) child_->write( f ); + dirty_ = 0; + return 0; +} + +// set the parent node and create the full path +void Fl_Preferences::Node::setParent( Node *pn ) +{ + parent_ = pn; + next_ = pn->child_; + pn->child_ = this; + sprintf( nameBuffer, "%s/%s", pn->path_, path_ ); + free( path_ ); + path_ = strdup( nameBuffer ); +} + +// add a child to this node and set its path (try to find it first...) +Fl_Preferences::Node *Fl_Preferences::Node::addChild( const char *path ) +{ + sprintf( nameBuffer, "%s/%s", path_, path ); + char *name = strdup( nameBuffer ); + Node *nd = find( name ); + free( name ); + dirty_ = 1; + return nd; +} + +// create and set, or change an entry within this node +void Fl_Preferences::Node::set( const char *name, const char *value ) +{ + for ( int i=0; i= sizeof( nameBuffer ) ) + len = sizeof( nameBuffer ); + strlcpy( nameBuffer, line, len ); + set( nameBuffer, c+1 ); + } + else + set( line, "" ); + } + dirty_ = dirt; +} + +// add more data to an existing entry +void Fl_Preferences::Node::add( const char *line ) +{ + if ( lastEntrySet<0 || lastEntrySet>=nEntry ) return; + char *&dst = entry[ lastEntrySet ].value; + int a = strlen( dst ); + int b = strlen( line ); + dst = (char*)realloc( dst, a+b+1 ); + memcpy( dst+a, line, b+1 ); + dirty_ = 1; +} + +// get the value for a name, returns 0 if no such name +const char *Fl_Preferences::Node::get( const char *name ) +{ + int i = getEntry( name ); + return i>=0 ? entry[i].value : 0 ; +} + +// find the index of an entry, returns -1 if no such entry +int Fl_Preferences::Node::getEntry( const char *name ) +{ + for ( int i=0; inext_ ) + { + Node *nn = nd->find( path ); + if ( nn ) return nn; + } + const char *s = path+len+1; + const char *e = strchr( s, '/' ); + if (e) strlcpy( nameBuffer, s, e-s+1 ); + else strlcpy( nameBuffer, s, sizeof(nameBuffer)); + nd = new Node( nameBuffer ); + nd->setParent( this ); + return nd->find( path ); + } + } + return 0; +} + +// find a group somewhere in the tree starting here +// caller must not set 'offset' argument +// - if the node does not exist, 'search' returns NULL +// - if the pathname is "." (current node) return this node +// - if the pathname is "./" (root node) return the topmost node +// - if the pathname starts with "./", start the search at the root node instead +Fl_Preferences::Node *Fl_Preferences::Node::search( const char *path, int offset ) +{ + + if ( offset == 0 ) + { + if ( path[0] == '.' ) + { + if ( path[1] == 0 ) + { + return this; // user was searching for current node + } + else if ( path[1] == '/' ) + { + Node *nn = this; + while ( nn->parent_ ) nn = nn->parent_; + if ( path[2]==0 ) + { // user is searching for root ( "./" ) + return nn; + } + return nn->search( path+2, 2 ); // do a relative search on the root node + } + } + offset = strlen( path_ ) + 1; + } + + int len = strlen( path_ ); + if ( len < offset-1 ) return 0; + len -= offset; + if ( ( len <= 0 ) || ( strncmp( path, path_+offset, len ) == 0 ) ) + { + if ( len > 0 && path[ len ] == 0 ) + return this; + if ( len <= 0 || path[ len ] == '/' ) + { + for ( Node *nd = child_; nd; nd = nd->next_ ) + { + Node *nn = nd->search( path, offset ); + if ( nn ) return nn; + } + return 0; + } + } + return 0; +} + +// return the number of child nodes (groups) +int Fl_Preferences::Node::nChildren() +{ + int cnt = 0; + for ( Node *nd = child_; nd; nd = nd->next_ ) + cnt++; + return cnt; +} + +// return the n'th child node +const char *Fl_Preferences::Node::child( int ix ) +{ + Node *nd; + for ( nd = child_; nd; nd = nd->next_ ) + { + if ( !ix-- ) break; + } + if ( nd && nd->path_ ) + { + char *r = strrchr( nd->path_, '/' ); + return r ? r+1 : nd->path_ ; + } + return 0L ; +} + +// remove myself from the list and delete me (and all children) +char Fl_Preferences::Node::remove() +{ + Node *nd = 0, *np; + if ( parent_ ) + { + nd = parent_->child_; np = 0L; + for ( ; nd; np = nd, nd = nd->next_ ) + { + if ( nd == this ) + { + if ( np ) + np->next_ = nd->next_; + else + parent_->child_ = nd->next_; + break; + } + } + parent_->dirty_ = 1; + } + delete this; + return ( nd != 0 ); +} + + +// +// End of "$Id: Fl_Preferences.cxx 6015 2008-01-09 21:23:51Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Progress.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Progress.cxx new file mode 100644 index 0000000..5613449 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Progress.cxx @@ -0,0 +1,117 @@ +// +// "$Id: Fl_Progress.cxx 5540 2006-11-12 20:44:12Z matt $" +// +// Progress bar widget routines. +// +// Copyright 2000-2005 by Michael Sweet. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// Fl_Progress::draw() - Draw the check button. +// Fl_Progress::Fl_Progress() - Construct a Fl_Progress widget. +// + +// +// Include necessary header files... +// + +#include +#include +#include + + +// +// Fl_Progress is a progress bar widget based off Fl_Widget that shows a +// standard progress bar... +// + + +// +// 'Fl_Progress::draw()' - Draw the check button. +// + +void Fl_Progress::draw() +{ + int progress; // Size of progress bar... + int bx, by, bw, bh; // Box areas... + int tx, tw; // Temporary X + width + + + // Get the box borders... + bx = Fl::box_dx(box()); + by = Fl::box_dy(box()); + bw = Fl::box_dw(box()); + bh = Fl::box_dh(box()); + + tx = x() + bx; + tw = w() - bw; + + // Draw the progress bar... + if (maximum_ > minimum_) + progress = (int)(w() * (value_ - minimum_) / (maximum_ - minimum_) + 0.5f); + else + progress = 0; + + // Draw the box and label... + if (progress > 0) { + Fl_Color c = labelcolor(); + labelcolor(fl_contrast(labelcolor(), color2())); + + fl_clip(x(), y(), progress + bx, h()); + draw_box(box(), x(), y(), w(), h(), active_r() ? color2() : fl_inactive(color2())); + draw_label(tx, y() + by, tw, h() - bh); + fl_pop_clip(); + + labelcolor(c); + + if (progress +#include + +#define INITIALREPEAT .5 +#define REPEAT .1 + +void Fl_Repeat_Button::repeat_callback(void *v) { + Fl_Button *b = (Fl_Button*)v; + Fl::add_timeout(REPEAT,repeat_callback,b); + b->do_callback(); +} + +int Fl_Repeat_Button::handle(int event) { + int newval; + switch (event) { + case FL_HIDE: + case FL_DEACTIVATE: + case FL_RELEASE: + newval = 0; goto J1; + case FL_PUSH: + case FL_DRAG: + if (Fl::visible_focus()) Fl::focus(this); + newval = Fl::event_inside(this); + J1: + if (!active()) + newval = 0; + if (value(newval)) { + if (newval) { + Fl::add_timeout(INITIALREPEAT,repeat_callback,this); + do_callback(); + } else { + Fl::remove_timeout(repeat_callback,this); + } + } + return 1; + default: + return Fl_Button::handle(event); + } +} + +// +// End of "$Id: Fl_Repeat_Button.cxx 5219 2006-06-21 06:52:10Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Return_Button.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Return_Button.cxx new file mode 100644 index 0000000..57e1979 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Return_Button.cxx @@ -0,0 +1,72 @@ +// +// "$Id: Fl_Return_Button.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Return button widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include + +int fl_return_arrow(int x, int y, int w, int h) { + int size = w; if (h +#include +#include +#include + +int Fl_Roller::handle(int event) { + static int ipos; + int newpos = horizontal() ? Fl::event_x() : Fl::event_y(); + switch (event) { + case FL_PUSH: + if (Fl::visible_focus()) { + Fl::focus(this); + redraw(); + } + handle_push(); + ipos = newpos; + return 1; + case FL_DRAG: + handle_drag(clamp(round(increment(previous_value(),newpos-ipos)))); + return 1; + case FL_RELEASE: + handle_release(); + return 1; + case FL_KEYBOARD : + switch (Fl::event_key()) { + case FL_Up: + if (horizontal()) return 0; + handle_drag(clamp(increment(value(),-1))); + return 1; + case FL_Down: + if (horizontal()) return 0; + handle_drag(clamp(increment(value(),1))); + return 1; + case FL_Left: + if (!horizontal()) return 0; + handle_drag(clamp(increment(value(),-1))); + return 1; + case FL_Right: + if (!horizontal()) return 0; + handle_drag(clamp(increment(value(),1))); + return 1; + default: + return 0; + } + // break not required because of switch... + case FL_FOCUS : + case FL_UNFOCUS : + if (Fl::visible_focus()) { + redraw(); + return 1; + } else return 0; + case FL_ENTER : + case FL_LEAVE : + return 1; + default: + return 0; + } +} + +void Fl_Roller::draw() { + if (damage()&FL_DAMAGE_ALL) draw_box(); + int X = x()+Fl::box_dx(box()); + int Y = y()+Fl::box_dy(box()); + int W = w()-Fl::box_dw(box())-1; + int H = h()-Fl::box_dh(box())-1; + if (W<=0 || H <=0) return; + int offset = step() ? int(value()/step()) : 0; + const double ARC = 1.5; // 1/2 the number of radians visible + const double delta = .2; // radians per knurl + if (horizontal()) { // horizontal one + // draw shaded ends of wheel: + int h1 = W/4+1; // distance from end that shading starts + fl_color(color()); fl_rectf(X+h1,Y,W-2*h1,H); + for (int i=0; h1; i++) { + fl_color((Fl_Color)(FL_GRAY-i-1)); + int h2 = FL_GRAY-i-1 > FL_DARK3 ? 2*h1/3+1 : 0; + fl_rectf(X+h2,Y,h1-h2,H); + fl_rectf(X+W-h1,Y,h1-h2,H); + h1 = h2; + } + if (active_r()) { + // draw ridges: + double junk; + for (double yy = -ARC+modf(offset*sin(ARC)/(W/2)/delta,&junk)*delta;; + yy += delta) { + int yy1 = int((sin(yy)/sin(ARC)+1)*W/2); + if (yy1 <= 0) continue; else if (yy1 >= W-1) break; + fl_color(FL_DARK3); fl_yxline(X+yy1,Y+1,Y+H-1); + if (yy < 0) yy1--; else yy1++; + fl_color(FL_LIGHT1);fl_yxline(X+yy1,Y+1,Y+H-1); + } + // draw edges: + h1 = W/8+1; // distance from end the color inverts + fl_color(FL_DARK2); + fl_xyline(X+h1,Y+H-1,X+W-h1); + fl_color(FL_DARK3); + fl_yxline(X,Y+H,Y,X+h1); + fl_xyline(X+W-h1,Y,X+W); + fl_color(FL_LIGHT2); + fl_xyline(X+h1,Y-1,X+W-h1); + fl_yxline(X+W,Y,Y+H,X+W-h1); + fl_xyline(X+h1,Y+H,X); + } + } else { // vertical one + // draw shaded ends of wheel: + int h1 = H/4+1; // distance from end that shading starts + fl_color(color()); fl_rectf(X,Y+h1,W,H-2*h1); + for (int i=0; h1; i++) { + fl_color((Fl_Color)(FL_GRAY-i-1)); + int h2 = FL_GRAY-i-1 > FL_DARK3 ? 2*h1/3+1 : 0; + fl_rectf(X,Y+h2,W,h1-h2); + fl_rectf(X,Y+H-h1,W,h1-h2); + h1 = h2; + } + if (active_r()) { + // draw ridges: + double junk; + for (double yy = -ARC+modf(offset*sin(ARC)/(H/2)/delta,&junk)*delta; + ; yy += delta) { + int yy1 = int((sin(yy)/sin(ARC)+1)*H/2); + if (yy1 <= 0) continue; else if (yy1 >= H-1) break; + fl_color(FL_DARK3); fl_xyline(X+1,Y+yy1,X+W-1); + if (yy < 0) yy1--; else yy1++; + fl_color(FL_LIGHT1);fl_xyline(X+1,Y+yy1,X+W-1); + } + // draw edges: + h1 = H/8+1; // distance from end the color inverts + fl_color(FL_DARK2); + fl_yxline(X+W-1,Y+h1,Y+H-h1); + fl_color(FL_DARK3); + fl_xyline(X+W,Y,X,Y+h1); + fl_yxline(X,Y+H-h1,Y+H); + fl_color(FL_LIGHT2); + fl_yxline(X,Y+h1,Y+H-h1); + fl_xyline(X,Y+H,X+W,Y+H-h1); + fl_yxline(X+W,Y+h1,Y); + } + } + + if (Fl::focus() == this) draw_focus(FL_THIN_UP_FRAME, x(), y(), w(), h()); +} + +Fl_Roller::Fl_Roller(int X,int Y,int W,int H,const char* L) + : Fl_Valuator(X,Y,W,H,L) { + box(FL_UP_BOX); + step(1,1000); +} + +// +// End of "$Id: Fl_Roller.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Round_Button.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Round_Button.cxx new file mode 100644 index 0000000..2a91862 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Round_Button.cxx @@ -0,0 +1,44 @@ +// +// "$Id: Fl_Round_Button.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Round button for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// A subclass of Fl_Button that always draws as a round circle. This +// circle is smaller than the widget size and can be surrounded by +// another box type, for compatability with Forms. + +#include +#include + +Fl_Round_Button::Fl_Round_Button(int X,int Y,int W,int H, const char *l) +: Fl_Light_Button(X,Y,W,H,l) { + box(FL_NO_BOX); + down_box(FL_ROUND_DOWN_BOX); + selection_color(FL_FOREGROUND_COLOR); +} + +// +// End of "$Id: Fl_Round_Button.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Scroll.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Scroll.cxx new file mode 100644 index 0000000..5b07ad3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Scroll.cxx @@ -0,0 +1,298 @@ +// +// "$Id: Fl_Scroll.cxx 6927 2009-11-07 21:02:52Z matt $" +// +// Scroll widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include + +// Clear all but the scrollbars... +void Fl_Scroll::clear() { + for (int i=children() - 1; i >= 0; i --) { + Fl_Widget* o = child(i); + if (o != &hscrollbar && o != &scrollbar) { + remove(o); + delete o; + } + } +} + +// Insure the scrollbars are the last children: +void Fl_Scroll::fix_scrollbar_order() { + Fl_Widget** a = (Fl_Widget**)array(); + if (a[children()-1] != &scrollbar) { + int i,j; for (i = j = 0; j < children(); j++) + if (a[j] != &hscrollbar && a[j] != &scrollbar) a[i++] = a[j]; + a[i++] = &hscrollbar; + a[i++] = &scrollbar; + } +} + +void Fl_Scroll::draw_clip(void* v,int X, int Y, int W, int H) { + fl_clip(X,Y,W,H); + Fl_Scroll* s = (Fl_Scroll*)v; + // erase background as needed... + switch (s->box()) { + case FL_NO_BOX : + case FL_UP_FRAME : + case FL_DOWN_FRAME : + case FL_THIN_UP_FRAME : + case FL_THIN_DOWN_FRAME : + case FL_ENGRAVED_FRAME : + case FL_EMBOSSED_FRAME : + case FL_BORDER_FRAME : + case _FL_SHADOW_FRAME : + case _FL_ROUNDED_FRAME : + case _FL_OVAL_FRAME : + case _FL_PLASTIC_UP_FRAME : + case _FL_PLASTIC_DOWN_FRAME : + if (s->parent() == (Fl_Group *)s->window() && Fl::scheme_bg_) { + Fl::scheme_bg_->draw(X-(X%((Fl_Tiled_Image *)Fl::scheme_bg_)->image()->w()), + Y-(Y%((Fl_Tiled_Image *)Fl::scheme_bg_)->image()->h()), + W+((Fl_Tiled_Image *)Fl::scheme_bg_)->image()->w(), + H+((Fl_Tiled_Image *)Fl::scheme_bg_)->image()->h()); + break; + } + + default : + fl_color(s->color()); + fl_rectf(X,Y,W,H); + break; + } + Fl_Widget*const* a = s->array(); + for (int i=s->children()-2; i--;) { + Fl_Widget& o = **a++; + s->draw_child(o); + s->draw_outside_label(o); + } + fl_pop_clip(); +} + +void Fl_Scroll::bbox(int& X, int& Y, int& W, int& H) { + X = x()+Fl::box_dx(box()); + Y = y()+Fl::box_dy(box()); + W = w()-Fl::box_dw(box()); + H = h()-Fl::box_dh(box()); + if (scrollbar.visible()) { + W -= scrollbar.w(); + if (scrollbar.align() & FL_ALIGN_LEFT) X += scrollbar.w(); + } + if (hscrollbar.visible()) { + H -= hscrollbar.h(); + if (scrollbar.align() & FL_ALIGN_TOP) Y += hscrollbar.h(); + } +} + +void Fl_Scroll::draw() { + fix_scrollbar_order(); + int X,Y,W,H; bbox(X,Y,W,H); + + uchar d = damage(); + + if (d & FL_DAMAGE_ALL) { // full redraw + draw_box(box(),x(),y(),w(),h(),color()); + draw_clip(this, X, Y, W, H); + } else { + if (d & FL_DAMAGE_SCROLL) { + // scroll the contents: + fl_scroll(X, Y, W, H, oldx-xposition_, oldy-yposition_, draw_clip, this); + + // Erase the background as needed... + Fl_Widget*const* a = array(); + int L, R, T, B; + L = 999999; + R = 0; + T = 999999; + B = 0; + for (int i=children()-2; i--; a++) { + if ((*a)->x() < L) L = (*a)->x(); + if (((*a)->x() + (*a)->w()) > R) R = (*a)->x() + (*a)->w(); + if ((*a)->y() < T) T = (*a)->y(); + if (((*a)->y() + (*a)->h()) > B) B = (*a)->y() + (*a)->h(); + } + if (L > X) draw_clip(this, X, Y, L - X, H); + if (R < (X + W)) draw_clip(this, R, Y, X + W - R, H); + if (T > Y) draw_clip(this, X, Y, W, T - Y); + if (B < (Y + H)) draw_clip(this, X, B, W, Y + H - B); + } + if (d & FL_DAMAGE_CHILD) { // draw damaged children + fl_clip(X, Y, W, H); + Fl_Widget*const* a = array(); + for (int i=children()-2; i--;) update_child(**a++); + fl_pop_clip(); + } + } + + // accumulate bounding box of children: + int l = X; int r = X; int t = Y; int b = Y; + Fl_Widget*const* a = array(); + for (int i=children()-2; i--;) { + Fl_Object* o = *a++; + if (o->x() < l) l = o->x(); + if (o->y() < t) t = o->y(); + if (o->x()+o->w() > r) r = o->x()+o->w(); + if (o->y()+o->h() > b) b = o->y()+o->h(); + } + + // turn the scrollbars on and off as necessary: + // See if children would fit if we had no scrollbars... + X = x()+Fl::box_dx(box()); + Y = y()+Fl::box_dy(box()); + W = w()-Fl::box_dw(box()); + H = h()-Fl::box_dh(box()); + int vneeded = 0; + int hneeded = 0; + if (type() & VERTICAL) { + if ((type() & ALWAYS_ON) || t < Y || b > Y+H) { + vneeded = 1; + W -= scrollbar.w(); + if (scrollbar.align() & FL_ALIGN_LEFT) X += scrollbar.w(); + } + } + if (type() & HORIZONTAL) { + if ((type() & ALWAYS_ON) || l < X || r > X+W) { + hneeded = 1; + H -= hscrollbar.h(); + if (scrollbar.align() & FL_ALIGN_TOP) Y += hscrollbar.h(); + // recheck vertical since we added a horizontal scrollbar + if (!vneeded && (type() & VERTICAL)) { + if ((type() & ALWAYS_ON) || t < Y || b > Y+H) { + vneeded = 1; + W -= scrollbar.w(); + if (scrollbar.align() & FL_ALIGN_LEFT) X += scrollbar.w(); + } + } + } + } + // Now that we know what's needed, make it so. + if (vneeded && !scrollbar.visible()) { + scrollbar.set_visible(); + d = FL_DAMAGE_ALL; + } + else if (!vneeded && scrollbar.visible()) { + scrollbar.clear_visible(); + draw_clip(this, + scrollbar.align()&FL_ALIGN_LEFT ? X : X+W-scrollbar.w(), + Y, scrollbar.w(), H); + d = FL_DAMAGE_ALL; + } + if (hneeded && !hscrollbar.visible()) { + hscrollbar.set_visible(); + d = FL_DAMAGE_ALL; + } + else if (!hneeded && hscrollbar.visible()) { + hscrollbar.clear_visible(); + draw_clip(this, + X, scrollbar.align()&FL_ALIGN_TOP ? Y : Y+H-hscrollbar.h(), + W, hscrollbar.h()); + d = FL_DAMAGE_ALL; + } + + scrollbar.resize(scrollbar.align()&FL_ALIGN_LEFT ? X-scrollbar.w() : X+W, + Y, scrollbar.w(), H); + scrollbar.value(oldy = yposition_ = (Y-t), H, 0, b-t); + + hscrollbar.resize(X, + scrollbar.align()&FL_ALIGN_TOP ? Y-hscrollbar.h() : Y+H, + W, hscrollbar.h()); + hscrollbar.value(oldx = xposition_ = (X-l), W, 0, r-l); + + // draw the scrollbars: + if (d & FL_DAMAGE_ALL) { + draw_child(scrollbar); + draw_child(hscrollbar); + if (scrollbar.visible() && hscrollbar.visible()) { + // fill in the little box in the corner + fl_color(color()); + fl_rectf(scrollbar.x(), hscrollbar.y(), scrollbar.w(), hscrollbar.h()); + } + } else { + update_child(scrollbar); + update_child(hscrollbar); + } +} + +void Fl_Scroll::resize(int X, int Y, int W, int H) { + int dx = X-x(), dy = Y-y(); + Fl_Widget::resize(X,Y,W,H); // resize _before_ moving children around + fix_scrollbar_order(); + // move all the children: + Fl_Widget*const* a = array(); + for (int i=children()-2; i--;) { + Fl_Object* o = *a++; + o->position(o->x()+dx, o->y()+dy); + } +} + +void Fl_Scroll::position(int X, int Y) { + int dx = xposition_-X; + int dy = yposition_-Y; + if (!dx && !dy) return; + xposition_ = X; + yposition_ = Y; + Fl_Widget*const* a = array(); + for (int i=children(); i--;) { + Fl_Widget* o = *a++; + if (o == &hscrollbar || o == &scrollbar) continue; + o->position(o->x()+dx, o->y()+dy); + } + if (parent() == (Fl_Group *)window() && Fl::scheme_bg_) damage(FL_DAMAGE_ALL); + else damage(FL_DAMAGE_SCROLL); +} + +void Fl_Scroll::hscrollbar_cb(Fl_Widget* o, void*) { + Fl_Scroll* s = (Fl_Scroll*)(o->parent()); + s->position(int(((Fl_Scrollbar*)o)->value()), s->yposition()); +} + +void Fl_Scroll::scrollbar_cb(Fl_Widget* o, void*) { + Fl_Scroll* s = (Fl_Scroll*)(o->parent()); + s->position(s->xposition(), int(((Fl_Scrollbar*)o)->value())); +} + +Fl_Scroll::Fl_Scroll(int X,int Y,int W,int H,const char* L) + : Fl_Group(X,Y,W,H,L), + scrollbar(X+W-Fl::scrollbar_size(),Y, + Fl::scrollbar_size(),H-Fl::scrollbar_size()), + hscrollbar(X,Y+H-Fl::scrollbar_size(), + W-Fl::scrollbar_size(),Fl::scrollbar_size()) { + type(BOTH); + xposition_ = oldx = 0; + yposition_ = oldy = 0; + hscrollbar.type(FL_HORIZONTAL); + hscrollbar.callback(hscrollbar_cb); + scrollbar.callback(scrollbar_cb); +} + +int Fl_Scroll::handle(int event) { + fix_scrollbar_order(); + return Fl_Group::handle(event); +} + +// +// End of "$Id: Fl_Scroll.cxx 6927 2009-11-07 21:02:52Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Scrollbar.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Scrollbar.cxx new file mode 100644 index 0000000..f3a43c7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Scrollbar.cxx @@ -0,0 +1,277 @@ +// +// "$Id: Fl_Scrollbar.cxx 6042 2008-02-25 13:00:53Z matt $" +// +// Scroll bar widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include "flstring.h" + +#define INITIALREPEAT .5 +#define REPEAT .05 + +void Fl_Scrollbar::increment_cb() { + int ls = maximum()>=minimum() ? linesize_ : -linesize_; + int i; + switch (pushed_) { + case 1: + i = -ls; + break; + default: + i = ls; + break; + case 5: + i = -int((maximum()-minimum())*slider_size()/(1.0-slider_size())) + ls; + if (i > -ls) i = -ls; + break; + case 6: + i = int((maximum()-minimum())*slider_size()/(1.0-slider_size())) - ls; + if (i < ls) i = ls; + break; + } + handle_drag(clamp(value() + i)); +} + +void Fl_Scrollbar::timeout_cb(void* v) { + Fl_Scrollbar* s = (Fl_Scrollbar*)v; + s->increment_cb(); + Fl::add_timeout(REPEAT, timeout_cb, s); +} + +int Fl_Scrollbar::handle(int event) { + // area of scrollbar: + int area; + int X=x(); int Y=y(); int W=w(); int H=h(); + + // adjust slider area to be inside the arrow buttons: + if (horizontal()) { + if (W >= 3*H) {X += H; W -= 2*H;} + } else { + if (H >= 3*W) {Y += W; H -= 2*W;} + } + + // which widget part is highlighted? + int relx; + int ww; + if (horizontal()) { + relx = Fl::event_x()-X; + ww = W; + } else { + relx = Fl::event_y()-Y; + ww = H; + } + if (relx < 0) area = 1; + else if (relx >= ww) area = 2; + else { + int S = int(slider_size()*ww+.5); + int T = (horizontal() ? H : W)/2+1; + if (type()==FL_VERT_NICE_SLIDER || type()==FL_HOR_NICE_SLIDER) T += 4; + if (S < T) S = T; + double val = + (maximum()-minimum()) ? (value()-minimum())/(maximum()-minimum()) : 0.5; + int sliderx; + if (val >= 1.0) sliderx = ww-S; + else if (val <= 0.0) sliderx = 0; + else sliderx = int(val*(ww-S)+.5); + if (Fl::event_button() == FL_MIDDLE_MOUSE) area = 8; + else if (relx < sliderx) area = 5; + else if (relx >= sliderx+S) area = 6; + else area = 8; + } + + switch (event) { + case FL_ENTER: + case FL_LEAVE: + return 1; + case FL_RELEASE: + damage(FL_DAMAGE_ALL); + if (pushed_) { + Fl::remove_timeout(timeout_cb, this); + pushed_ = 0; + } + handle_release(); + return 1; + case FL_PUSH: + if (pushed_) return 1; + if (area != 8) pushed_ = area; + if (pushed_) { + handle_push(); + Fl::add_timeout(INITIALREPEAT, timeout_cb, this); + increment_cb(); + damage(FL_DAMAGE_ALL); + return 1; + } + return Fl_Slider::handle(event, X,Y,W,H); + case FL_DRAG: + if (pushed_) return 1; + return Fl_Slider::handle(event, X,Y,W,H); + case FL_MOUSEWHEEL : + if (horizontal()) { + if (Fl::e_dx==0) return 0; + handle_drag(clamp(value() + linesize_ * Fl::e_dx)); + return 1; + } else { + if (Fl::e_dy==0) return 0; + handle_drag(clamp(value() + linesize_ * Fl::e_dy)); + return 1; + } + case FL_SHORTCUT: + case FL_KEYBOARD: { + int v = value(); + int ls = maximum()>=minimum() ? linesize_ : -linesize_; + if (horizontal()) { + switch (Fl::event_key()) { + case FL_Left: + v -= ls; + break; + case FL_Right: + v += ls; + break; + default: + return 0; + } + } else { // vertical + switch (Fl::event_key()) { + case FL_Up: + v -= ls; + break; + case FL_Down: + v += ls; + break; + case FL_Page_Up: + if (slider_size() >= 1.0) return 0; + v -= int((maximum()-minimum())*slider_size()/(1.0-slider_size())); + v += ls; + break; + case FL_Page_Down: + if (slider_size() >= 1.0) return 0; + v += int((maximum()-minimum())*slider_size()/(1.0-slider_size())); + v -= ls; + break; + case FL_Home: + v = int(minimum()); + break; + case FL_End: + v = int(maximum()); + break; + default: + return 0; + } + } + v = int(clamp(v)); + if (v != value()) { + Fl_Slider::value(v); + value_damage(); + set_changed(); + do_callback(); + } + return 1;} + } + return 0; +} + +void Fl_Scrollbar::draw() { + if (damage()&FL_DAMAGE_ALL) draw_box(); + int X = x()+Fl::box_dx(box()); + int Y = y()+Fl::box_dy(box()); + int W = w()-Fl::box_dw(box()); + int H = h()-Fl::box_dh(box()); + if (horizontal()) { + if (W < 3*H) {Fl_Slider::draw(X,Y,W,H); return;} + Fl_Slider::draw(X+H,Y,W-2*H,H); + if (damage()&FL_DAMAGE_ALL) { + draw_box((pushed_==1) ? fl_down(slider()) : slider(), + X, Y, H, H, selection_color()); + draw_box((pushed_==2) ? fl_down(slider()) : slider(), + X+W-H, Y, H, H, selection_color()); + if (active_r()) + fl_color(labelcolor()); + else + fl_color(fl_inactive(labelcolor())); + int w1 = (H-4)/3; if (w1 < 1) w1 = 1; + int x1 = X+(H-w1-1)/2; + int yy1 = Y+(H-2*w1-1)/2; + if (Fl::scheme_ && !strcmp(Fl::scheme_, "gtk+")) { + fl_polygon(x1, yy1+w1, x1+w1, yy1+2*w1, x1+w1-1, yy1+w1, x1+w1, yy1); + x1 += (W-H); + fl_polygon(x1, yy1, x1+1, yy1+w1, x1, yy1+2*w1, x1+w1, yy1+w1); + } else { + fl_polygon(x1, yy1+w1, x1+w1, yy1+2*w1, x1+w1, yy1); + x1 += (W-H); + fl_polygon(x1, yy1, x1, yy1+2*w1, x1+w1, yy1+w1); + } + } + } else { // vertical + if (H < 3*W) {Fl_Slider::draw(X,Y,W,H); return;} + Fl_Slider::draw(X,Y+W,W,H-2*W); + if (damage()&FL_DAMAGE_ALL) { + draw_box((pushed_==1) ? fl_down(slider()) : slider(), + X, Y, W, W, selection_color()); + draw_box((pushed_==2) ? fl_down(slider()) : slider(), + X, Y+H-W, W, W, selection_color()); + if (active_r()) + fl_color(labelcolor()); + else + fl_color(fl_inactive(labelcolor())); + int w1 = (W-4)/3; if (w1 < 1) w1 = 1; + int x1 = X+(W-2*w1-1)/2; + int yy1 = Y+(W-w1-1)/2; + if (Fl::scheme_ && !strcmp(Fl::scheme_, "gtk+")) { + fl_polygon(x1, yy1+w1, x1+w1, yy1+w1-1, x1+2*w1, yy1+w1, x1+w1, yy1); + yy1 += H-W; + fl_polygon(x1, yy1, x1+w1, yy1+1, x1+w1, yy1+w1); + fl_polygon(x1+w1, yy1+1, x1+2*w1, yy1, x1+w1, yy1+w1); + } else { + fl_polygon(x1, yy1+w1, x1+2*w1, yy1+w1, x1+w1, yy1); + yy1 += H-W; + fl_polygon(x1, yy1, x1+w1, yy1+w1, x1+2*w1, yy1); + } + } + } +} + +Fl_Scrollbar::Fl_Scrollbar(int X, int Y, int W, int H, const char* L) + : Fl_Slider(X, Y, W, H, L) +{ + box(FL_FLAT_BOX); + color(FL_DARK2); + slider(FL_UP_BOX); + linesize_ = 16; + pushed_ = 0; + step(1); +} + +Fl_Scrollbar::~Fl_Scrollbar() +{ + if (pushed_) + Fl::remove_timeout(timeout_cb, this); +} + + +// +// End of "$Id: Fl_Scrollbar.cxx 6042 2008-02-25 13:00:53Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Shared_Image.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Shared_Image.cxx new file mode 100644 index 0000000..365e904 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Shared_Image.cxx @@ -0,0 +1,467 @@ +// +// "$Id: Fl_Shared_Image.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Shared image code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include "flstring.h" + +#include +#include +#include +#include + + +// +// Global class vars... +// + +Fl_Shared_Image **Fl_Shared_Image::images_ = 0; // Shared images +int Fl_Shared_Image::num_images_ = 0; // Number of shared images +int Fl_Shared_Image::alloc_images_ = 0; // Allocated shared images + +Fl_Shared_Handler *Fl_Shared_Image::handlers_ = 0;// Additional format handlers +int Fl_Shared_Image::num_handlers_ = 0; // Number of format handlers +int Fl_Shared_Image::alloc_handlers_ = 0; // Allocated format handlers + + +// +// Typedef the C API sort function type the only way I know how... +// + +extern "C" { + typedef int (*compare_func_t)(const void *, const void *); +} + + +// Static methods that really should be inline, but some WIN32 compilers +// can't handle it... +Fl_Shared_Image **Fl_Shared_Image::images() { + return images_; +} + +int Fl_Shared_Image::num_images() { + return num_images_; +} + + +// +// 'Fl_Shared_Image::compare()' - Compare two shared images... +// + +int +Fl_Shared_Image::compare(Fl_Shared_Image **i0, // I - First image + Fl_Shared_Image **i1) { // I - Second image + int i = strcmp((*i0)->name(), (*i1)->name()); + + if (i) return i; + else if (((*i0)->w() == 0 && (*i1)->original_) || + ((*i1)->w() == 0 && (*i0)->original_)) return 0; + else if ((*i0)->w() != (*i1)->w()) return (*i0)->w() - (*i1)->w(); + else return (*i0)->h() - (*i1)->h(); +} + + +// +// 'Fl_Shared_Image::Fl_Shared_Image()' - Basic constructor. +// + +Fl_Shared_Image::Fl_Shared_Image() : Fl_Image(0,0,0) { + name_ = 0; + refcount_ = 1; + original_ = 0; + image_ = 0; + alloc_image_ = 0; +} + + +// +// 'Fl_Shared_Image::Fl_Shared_Image()' - Add an image to the image cache. +// + +Fl_Shared_Image::Fl_Shared_Image(const char *n, // I - Filename + Fl_Image *img) // I - Image + : Fl_Image(0,0,0) { + name_ = new char[strlen(n) + 1]; + strcpy((char *)name_, n); + + refcount_ = 1; + image_ = img; + alloc_image_ = !img; + original_ = 1; + + if (!img) reload(); + else update(); +} + + +// +// 'Fl_Shared_Image::add()' - Add a shared image to the array. +// + +void +Fl_Shared_Image::add() { + Fl_Shared_Image **temp; // New image pointer array... + + if (num_images_ >= alloc_images_) { + // Allocate more memory... + temp = new Fl_Shared_Image *[alloc_images_ + 32]; + + if (alloc_images_) { + memcpy(temp, images_, alloc_images_ * sizeof(Fl_Shared_Image *)); + + delete[] images_; + } + + images_ = temp; + alloc_images_ += 32; + } + + images_[num_images_] = this; + num_images_ ++; + + if (num_images_ > 1) { + qsort(images_, num_images_, sizeof(Fl_Shared_Image *), + (compare_func_t)compare); + } +} + + +// +// 'Fl_Shared_Image::update()' - Update the dimensions of the shared images. +// + +void +Fl_Shared_Image::update() { + if (image_) { + w(image_->w()); + h(image_->h()); + d(image_->d()); + data(image_->data(), image_->count()); + } +} + + +// +// 'Fl_Shared_Image::~Fl_Shared_Image()' - Destroy a shared image... +// + +Fl_Shared_Image::~Fl_Shared_Image() { + if (name_) delete[] (char *)name_; + if (alloc_image_) delete image_; +} + + +// +// 'Fl_Shared_Image::release()' - Release and possibly destroy a shared image. +// + +void +Fl_Shared_Image::release() { + int i; // Looping var... + + refcount_ --; + if (refcount_ > 0) return; + + for (i = 0; i < num_images_; i ++) + if (images_[i] == this) { + num_images_ --; + + if (i < num_images_) { + memmove(images_ + i, images_ + i + 1, + (num_images_ - i) * sizeof(Fl_Shared_Image *)); + } + + break; + } + + delete this; + + if (num_images_ == 0 && images_) { + delete[] images_; + + images_ = 0; + alloc_images_ = 0; + } +} + + +// +// 'Fl_Shared_Image::reload()' - Reload the shared image... +// + +void +Fl_Shared_Image::reload() { + // Load image from disk... + int i; // Looping var + FILE *fp; // File pointer + uchar header[64]; // Buffer for auto-detecting files + Fl_Image *img; // New image + + if (!name_) return; + + if ((fp = fopen(name_, "rb")) != NULL) { + fread(header, 1, sizeof(header), fp); + fclose(fp); + } else { + return; + } + + // Load the image as appropriate... + if (memcmp(header, "#define", 7) == 0) // XBM file + img = new Fl_XBM_Image(name_); + else if (memcmp(header, "/* XPM */", 9) == 0) // XPM file + img = new Fl_XPM_Image(name_); + else { + // Not a standard format; try an image handler... + for (i = 0, img = 0; i < num_handlers_; i ++) { + img = (handlers_[i])(name_, header, sizeof(header)); + + if (img) break; + } + } + + if (img) { + if (alloc_image_) delete image_; + + alloc_image_ = 1; + + if ((img->w() != w() && w()) || (img->h() != h() && h())) { + // Make sure the reloaded image is the same size as the existing one. + Fl_Image *temp = img->copy(w(), h()); + delete img; + image_ = temp; + } else { + image_ = img; + } + + update(); + } +} + + +// +// 'Fl_Shared_Image::copy()' - Copy and resize a shared image... +// + +Fl_Image * +Fl_Shared_Image::copy(int W, int H) { + Fl_Image *temp_image; // New image file + Fl_Shared_Image *temp_shared; // New shared image + + // Make a copy of the image we're sharing... + if (!image_) temp_image = 0; + else temp_image = image_->copy(W, H); + + // Then make a new shared image... + temp_shared = new Fl_Shared_Image(); + + temp_shared->name_ = new char[strlen(name_) + 1]; + strcpy((char *)temp_shared->name_, name_); + + temp_shared->refcount_ = 1; + temp_shared->image_ = temp_image; + temp_shared->alloc_image_ = 1; + + temp_shared->update(); + + return temp_shared; +} + + +// +// 'Fl_Shared_Image::color_average()' - Blend colors... +// + +void +Fl_Shared_Image::color_average(Fl_Color c, // I - Color to blend with + float i) { // I - Blend fraction + if (!image_) return; + + image_->color_average(c, i); + update(); +} + + +// +// 'Fl_Shared_Image::desaturate()' - Convert the image to grayscale... +// + +void +Fl_Shared_Image::desaturate() { + if (!image_) return; + + image_->desaturate(); + update(); +} + + +// +// 'Fl_Shared_Image::draw()' - Draw a shared image... +// + +void +Fl_Shared_Image::draw(int X, int Y, int W, int H, int cx, int cy) { + if (image_) image_->draw(X, Y, W, H, cx, cy); + else Fl_Image::draw(X, Y, W, H, cx, cy); +} + + +// +// 'Fl_Shared_Image::uncache()' - Uncache the shared image... +// + +void +Fl_Shared_Image::uncache() +{ + if (image_) image_->uncache(); +} + + +// +// 'Fl_Shared_Image::find()' - Find a shared image... +// + +Fl_Shared_Image * +Fl_Shared_Image::find(const char *n, int W, int H) { + Fl_Shared_Image *key, // Image key + **match; // Matching image + + if (num_images_) { + key = new Fl_Shared_Image(); + key->name_ = new char[strlen(n) + 1]; + strcpy((char *)key->name_, n); + key->w(W); + key->h(H); + + match = (Fl_Shared_Image **)bsearch(&key, images_, num_images_, + sizeof(Fl_Shared_Image *), + (compare_func_t)compare); + + delete key; + + if (match) { + (*match)->refcount_ ++; + return *match; + } + } + + return 0; +} + + +// +// 'Fl_Shared_Image::get()' - Get a shared image... +// + +Fl_Shared_Image * +Fl_Shared_Image::get(const char *n, int W, int H) { + Fl_Shared_Image *temp; // Image + + if ((temp = find(n, W, H)) != NULL) return temp; + + if ((temp = find(n)) == NULL) { + temp = new Fl_Shared_Image(n); + + if (!temp->image_) { + delete temp; + return NULL; + } + + temp->add(); + } + + if ((temp->w() != W || temp->h() != H) && W && H) { + temp = (Fl_Shared_Image *)temp->copy(W, H); + temp->add(); + } + + return temp; +} + + +// +// 'Fl_Shared_Image::add_handler()' - Add a shared image handler. +// + +void +Fl_Shared_Image::add_handler(Fl_Shared_Handler f) { + int i; // Looping var... + Fl_Shared_Handler *temp; // New image handler array... + + // First see if we have already added the handler... + for (i = 0; i < num_handlers_; i ++) { + if (handlers_[i] == f) return; + } + + if (num_handlers_ >= alloc_handlers_) { + // Allocate more memory... + temp = new Fl_Shared_Handler [alloc_handlers_ + 32]; + + if (alloc_handlers_) { + memcpy(temp, handlers_, alloc_handlers_ * sizeof(Fl_Shared_Handler)); + + delete[] handlers_; + } + + handlers_ = temp; + alloc_handlers_ += 32; + } + + handlers_[num_handlers_] = f; + num_handlers_ ++; +} + + +// +// 'Fl_Shared_Image::remove_handler()' - Remove a shared image handler. +// + +void +Fl_Shared_Image::remove_handler(Fl_Shared_Handler f) { + int i; // Looping var... + + // First see if the handler has been added... + for (i = 0; i < num_handlers_; i ++) { + if (handlers_[i] == f) break; + } + + if (i >= num_handlers_) return; + + // OK, remove the handler from the array... + num_handlers_ --; + + if (i < num_handlers_) { + // Shift later handlers down 1... + memmove(handlers_ + i, handlers_ + i + 1, + (num_handlers_ - i) * sizeof(Fl_Shared_Handler )); + } +} + + +// +// End of "$Id: Fl_Shared_Image.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Single_Window.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Single_Window.cxx new file mode 100644 index 0000000..380ae94 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Single_Window.cxx @@ -0,0 +1,41 @@ +// +// "$Id: Fl_Single_Window.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Single-buffered window for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// A window with a single-buffered context +// +// This is provided for systems where the base class is double +// buffered. You can turn it off using this subclass in case +// your display looks better without it. + +#include + +void Fl_Single_Window::show() {Fl_Window::show();} +void Fl_Single_Window::flush() {Fl_Window::flush();} + +// +// End of "$Id: Fl_Single_Window.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Slider.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Slider.cxx new file mode 100644 index 0000000..5776ef6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Slider.cxx @@ -0,0 +1,339 @@ +// +// "$Id: Fl_Slider.cxx 5438 2006-09-17 14:58:25Z mike $" +// +// Slider widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include "flstring.h" + +void Fl_Slider::_Fl_Slider() { + slider_size_ = 0; + slider_ = 0; // FL_UP_BOX; +} + +Fl_Slider::Fl_Slider(int X, int Y, int W, int H, const char* l) +: Fl_Valuator(X, Y, W, H, l) { + box(FL_DOWN_BOX); + _Fl_Slider(); +} + +Fl_Slider::Fl_Slider(uchar t, int X, int Y, int W, int H, const char* l) + : Fl_Valuator(X, Y, W, H, l) { + type(t); + box(t==FL_HOR_NICE_SLIDER || t==FL_VERT_NICE_SLIDER ? + FL_FLAT_BOX : FL_DOWN_BOX); + _Fl_Slider(); +} + +void Fl_Slider::slider_size(double v) { + if (v < 0) v = 0; + if (v > 1) v = 1; + if (slider_size_ != float(v)) { + slider_size_ = float(v); + damage(FL_DAMAGE_EXPOSE); + } +} + +void Fl_Slider::bounds(double a, double b) { + if (minimum() != a || maximum() != b) { + Fl_Valuator::bounds(a, b); + damage(FL_DAMAGE_EXPOSE); + } +} + +int Fl_Slider::scrollvalue(int p, int W, int t, int l) { +// p = position, first line displayed +// w = window, number of lines displayed +// t = top, number of first line +// l = length, total number of lines + step(1, 1); + if (p+W > t+l) l = p+W-t; + slider_size(W >= l ? 1.0 : double(W)/double(l)); + bounds(t, l-W+t); + return value(p); +} + +// All slider interaction is done as though the slider ranges from +// zero to one, and the left (bottom) edge of the slider is at the +// given position. Since when the slider is all the way to the +// right (top) the left (bottom) edge is not all the way over, a +// position on the widget itself covers a wider range than 0-1, +// actually it ranges from 0 to 1/(1-size). + +void Fl_Slider::draw_bg(int X, int Y, int W, int H) { + fl_push_clip(X, Y, W, H); + draw_box(); + fl_pop_clip(); + + Fl_Color black = active_r() ? FL_FOREGROUND_COLOR : FL_INACTIVE_COLOR; + if (type() == FL_VERT_NICE_SLIDER) { + draw_box(FL_THIN_DOWN_BOX, X+W/2-2, Y, 4, H, black); + } else if (type() == FL_HOR_NICE_SLIDER) { + draw_box(FL_THIN_DOWN_BOX, X, Y+H/2-2, W, 4, black); + } +} + +void Fl_Slider::draw(int X, int Y, int W, int H) { + + double val; + if (minimum() == maximum()) + val = 0.5; + else { + val = (value()-minimum())/(maximum()-minimum()); + if (val > 1.0) val = 1.0; + else if (val < 0.0) val = 0.0; + } + + int ww = (horizontal() ? W : H); + int xx, S; + if (type()==FL_HOR_FILL_SLIDER || type() == FL_VERT_FILL_SLIDER) { + S = int(val*ww+.5); + if (minimum()>maximum()) {S = ww-S; xx = ww-S;} + else xx = 0; + } else { + S = int(slider_size_*ww+.5); + int T = (horizontal() ? H : W)/2+1; + if (type()==FL_VERT_NICE_SLIDER || type()==FL_HOR_NICE_SLIDER) T += 4; + if (S < T) S = T; + xx = int(val*(ww-S)+.5); + } + int xsl, ysl, wsl, hsl; + if (horizontal()) { + xsl = X+xx; + wsl = S; + ysl = Y; + hsl = H; + } else { + ysl = Y+xx; + hsl = S; + xsl = X; + wsl = W; + } + + draw_bg(X, Y, W, H); + + Fl_Boxtype box1 = slider(); + if (!box1) {box1 = (Fl_Boxtype)(box()&-2); if (!box1) box1 = FL_UP_BOX;} + if (type() == FL_VERT_NICE_SLIDER) { + draw_box(box1, xsl, ysl, wsl, hsl, FL_GRAY); + int d = (hsl-4)/2; + draw_box(FL_THIN_DOWN_BOX, xsl+2, ysl+d, wsl-4, hsl-2*d,selection_color()); + } else if (type() == FL_HOR_NICE_SLIDER) { + draw_box(box1, xsl, ysl, wsl, hsl, FL_GRAY); + int d = (wsl-4)/2; + draw_box(FL_THIN_DOWN_BOX, xsl+d, ysl+2, wsl-2*d, hsl-4,selection_color()); + } else { + if (wsl>0 && hsl>0) draw_box(box1, xsl, ysl, wsl, hsl, selection_color()); + + if (type()!=FL_HOR_FILL_SLIDER && type() != FL_VERT_FILL_SLIDER && + Fl::scheme_ && !strcmp(Fl::scheme_, "gtk+")) { + if (W>H && wsl>(hsl+8)) { + // Draw horizontal grippers + int yy, hh; + hh = hsl-8; + xx = xsl+(wsl-hsl-4)/2; + yy = ysl+3; + + fl_color(fl_darker(selection_color())); + fl_line(xx, yy+hh, xx+hh, yy); + fl_line(xx+6, yy+hh, xx+hh+6, yy); + fl_line(xx+12, yy+hh, xx+hh+12, yy); + + xx++; + fl_color(fl_lighter(selection_color())); + fl_line(xx, yy+hh, xx+hh, yy); + fl_line(xx+6, yy+hh, xx+hh+6, yy); + fl_line(xx+12, yy+hh, xx+hh+12, yy); + } else if (H>W && hsl>(wsl+8)) { + // Draw vertical grippers + int yy; + xx = xsl+4; + ww = wsl-8; + yy = ysl+(hsl-wsl-4)/2; + + fl_color(fl_darker(selection_color())); + fl_line(xx, yy+ww, xx+ww, yy); + fl_line(xx, yy+ww+6, xx+ww, yy+6); + fl_line(xx, yy+ww+12, xx+ww, yy+12); + + yy++; + fl_color(fl_lighter(selection_color())); + fl_line(xx, yy+ww, xx+ww, yy); + fl_line(xx, yy+ww+6, xx+ww, yy+6); + fl_line(xx, yy+ww+12, xx+ww, yy+12); + } + } + } + + draw_label(xsl, ysl, wsl, hsl); + if (Fl::focus() == this) { + if (type() == FL_HOR_FILL_SLIDER || type() == FL_VERT_FILL_SLIDER) draw_focus(); + else draw_focus(box1, xsl, ysl, wsl, hsl); + } +} + +void Fl_Slider::draw() { + if (damage()&FL_DAMAGE_ALL) draw_box(); + draw(x()+Fl::box_dx(box()), + y()+Fl::box_dy(box()), + w()-Fl::box_dw(box()), + h()-Fl::box_dh(box())); +} + +int Fl_Slider::handle(int event, int X, int Y, int W, int H) { + switch (event) { + case FL_PUSH: + if (!Fl::event_inside(X, Y, W, H)) return 0; + handle_push(); + case FL_DRAG: { + + double val; + if (minimum() == maximum()) + val = 0.5; + else { + val = (value()-minimum())/(maximum()-minimum()); + if (val > 1.0) val = 1.0; + else if (val < 0.0) val = 0.0; + } + + int ww = (horizontal() ? W : H); + int mx = (horizontal() ? Fl::event_x()-X : Fl::event_y()-Y); + int S; + static int offcenter; + + if (type() == FL_HOR_FILL_SLIDER || type() == FL_VERT_FILL_SLIDER) { + + S = 0; + if (event == FL_PUSH) { + int xx = int(val*ww+.5); + offcenter = mx-xx; + if (offcenter < -10 || offcenter > 10) offcenter = 0; + else return 1; + } + + } else { + + S = int(slider_size_*ww+.5); if (S >= ww) return 0; + int T = (horizontal() ? H : W)/2+1; + if (type()==FL_VERT_NICE_SLIDER || type()==FL_HOR_NICE_SLIDER) T += 4; + if (S < T) S = T; + if (event == FL_PUSH) { + int xx = int(val*(ww-S)+.5); + offcenter = mx-xx; + if (offcenter < 0) offcenter = 0; + else if (offcenter > S) offcenter = S; + else return 1; + } + } + + int xx = mx-offcenter; + double v; + char tryAgain = 1; + while (tryAgain) + { + tryAgain = 0; + if (xx < 0) { + xx = 0; + offcenter = mx; if (offcenter < 0) offcenter = 0; + } else if (xx > (ww-S)) { + xx = ww-S; + offcenter = mx-xx; if (offcenter > S) offcenter = S; + } + v = round(xx*(maximum()-minimum())/(ww-S) + minimum()); + // make sure a click outside the sliderbar moves it: + if (event == FL_PUSH && v == value()) { + offcenter = S/2; + event = FL_DRAG; + tryAgain = 1; + } + } + handle_drag(clamp(v)); + } return 1; + case FL_RELEASE: + handle_release(); + return 1; + case FL_KEYBOARD : + switch (Fl::event_key()) { + case FL_Up: + if (horizontal()) return 0; + handle_push(); + handle_drag(clamp(increment(value(),-1))); + handle_release(); + return 1; + case FL_Down: + if (horizontal()) return 0; + handle_push(); + handle_drag(clamp(increment(value(),1))); + handle_release(); + return 1; + case FL_Left: + if (!horizontal()) return 0; + handle_push(); + handle_drag(clamp(increment(value(),-1))); + handle_release(); + return 1; + case FL_Right: + if (!horizontal()) return 0; + handle_push(); + handle_drag(clamp(increment(value(),1))); + handle_release(); + return 1; + default: + return 0; + } + // break not required because of switch... + case FL_FOCUS : + case FL_UNFOCUS : + if (Fl::visible_focus()) { + redraw(); + return 1; + } else return 0; + case FL_ENTER : + case FL_LEAVE : + return 1; + default: + return 0; + } +} + +int Fl_Slider::handle(int event) { + if (event == FL_PUSH && Fl::visible_focus()) { + Fl::focus(this); + redraw(); + } + + return handle(event, + x()+Fl::box_dx(box()), + y()+Fl::box_dy(box()), + w()-Fl::box_dw(box()), + h()-Fl::box_dh(box())); +} + +// +// End of "$Id: Fl_Slider.cxx 5438 2006-09-17 14:58:25Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Sys_Menu_Bar.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Sys_Menu_Bar.cxx new file mode 100644 index 0000000..a8800ea --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Sys_Menu_Bar.cxx @@ -0,0 +1,334 @@ +// +// "$Id: Fl_Sys_Menu_Bar.cxx 6016 2008-01-09 21:32:40Z matt $" +// +// MacOS system menu bar widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +/** + * This code is a quick hack! It was written as a proof of concept. + * It has been tested on the "menubar" sample program and provides + * basic functionality. + * + * To use the System Menu Bar, simply replace the main Fl_Menu_Bar + * in an application with Fl_Sys_Menu_Bar. + * + * FLTK features not supported by the Mac System menu + * + * - no invisible menu items + * - no sybolic labels + * - embossed labels will be underlined instead + * - no font sizes + * - Shortcut Characters should be English alphanumeric only, no modifiers yet + * - no disable main menus + * - changes to menubar in run-time don't update! + * (disable, etc. - toggle and readio button do!) + * + * No care was taken to clean up the menu bar after destruction! + * ::menu(bar) should only be called once! + * Many other calls of the parent class don't work. + * Changing the menu items has no effect on the menu bar. + * Starting with OS X 10.5, FLTK applications must be created as + * a bundle for the System Menu Bar (and maybe other features) to work! + */ + +#if defined(__APPLE__) + +#include +#include +#include + +#include "flstring.h" +#include +#include + +typedef const Fl_Menu_Item *pFl_Menu_Item; + +/** + * copy the text of a menuitem into a buffer. + * Skip all '&' which would mark the shortcut in FLTK + * Skip all Mac control characters ('(', '<', ';', '^', '!' ) + */ +static void catMenuText( const char *src, char *dst ) +{ + char c; + while ( *dst ) + dst++; + if ( *src == '-' ) + src++; + while ( ( c = *src++ ) ) + { + if ( !strchr( "&(<;^!", c ) ) + *dst++ = c; + } + *dst = 0; +} + +/** + * append a marker to identify the menu font style + * labeltype_ && !m->labelfont_ ) + return; + while ( *dst ) + dst++; + + if ( m->labelfont_ & FL_BOLD ) + strcat( dst, "labelfont_ & FL_ITALIC ) + strcat( dst, "labelfont_ & FL_UNDERLINE ) + // strcat( dst, "labeltype_ == FL_EMBOSSED_LABEL ) + strcat( dst, "labeltype_ == FL_ENGRAVED_LABEL ) + strcat( dst, "labeltype_ == FL_SHADOW_LABEL ) + strcat( dst, "labeltype_ == FL_SYMBOL_LABEL ) + ; // not supported +} + +/** + * append a marker to identify the menu shortcut + * shortcut_ ) + return; + if ( m->flags & FL_SUBMENU ) + return; + if ( m->flags & FL_SUBMENU_POINTER ) + return; + char key = m->shortcut_ & 0xff; + if ( !isalnum( key ) ) + return; + + long macMod = kMenuNoCommandModifier; + if ( m->shortcut_ & FL_META ) macMod = kMenuNoModifiers; + if ( m->shortcut_ & FL_SHIFT || isupper(key) ) macMod |= kMenuShiftModifier; + if ( m->shortcut_ & FL_ALT ) macMod |= kMenuOptionModifier; + if ( m->shortcut_ & FL_CTRL ) macMod |= kMenuControlModifier; + + //SetMenuItemKeyGlyph( mh, miCnt, key ); + SetItemCmd( mh, miCnt, toupper(key) ); + SetMenuItemModifiers( mh, miCnt, macMod ); +} + +#if 0 +// this function needs to be verified before we compile it back in. +static void catMenuShortcut( const Fl_Menu_Item *m, char *dst ) +{ + if ( !m->shortcut_ ) + return; + char c = m->shortcut_ & 0xff; + if ( !isalnum( c & 0xff ) ) + return; + while ( *dst ) + dst++; + if ( m->shortcut_ & FL_CTRL ) + { + sprintf( dst, "/%c", toupper( c ) ); + } + //if ( isalnum( mm->shortcut_ ) && !( mm->flags & FL_SUBMENU ) ) + //sprintf( buf+strlen(buf), "/%c", mm->shortcut_ ); +} +#endif + +static void setMenuFlags( MenuHandle mh, int miCnt, const Fl_Menu_Item *m ) +{ + if ( m->flags & FL_MENU_TOGGLE ) + { + SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x12 : 0 ); + } + else if ( m->flags & FL_MENU_RADIO ) + SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x13 : 0 ); +} + +static void catMenuFlags( const Fl_Menu_Item *m, char *dst ) +{ + if ( !m->flags ) + return; + if ( m->flags & FL_MENU_INACTIVE ) + strcat( dst, "(" ); +} + +/** + * create a sub menu for a specific menu handle + */ +static void createSubMenu( MenuHandle mh, int &cnt, pFl_Menu_Item &mm ) +{ + char buf[255]; + int miCnt = 1; + while ( mm->text ) + { + MenuHandle smh = 0; + buf[1] = 0; + catMenuFont( mm, buf+1 ); + //catMenuShortcut( mm, buf+1 ); + catMenuText( mm->text, buf+1 ); + catMenuFlags( mm, buf+1 ); + if ( mm->flags & (FL_SUBMENU | FL_SUBMENU_POINTER) ) + { + cnt++; + smh = NewMenu( cnt, (unsigned char*)"\001 " ); + sprintf( buf+1+strlen(buf+1), "/\033!%c", cnt ); + } + if ( mm->flags & FL_MENU_DIVIDER ) + strcat( buf+1, ";-" ); + buf[0] = strlen( buf+1 ); + AppendMenu( mh, (unsigned char*)buf ); + // insert Appearanc manager functions here! + setMenuFlags( mh, miCnt, mm ); + setMenuShortcut( mh, miCnt, mm ); + SetMenuItemRefCon( mh, miCnt, (UInt32)mm ); + miCnt++; + if ( mm->flags & FL_MENU_DIVIDER ) + miCnt++; + if ( mm->flags & FL_SUBMENU ) + { + createSubMenu( smh, cnt, ++mm ); + } + else if ( mm->flags & FL_SUBMENU_POINTER ) + { + const Fl_Menu_Item *smm = (Fl_Menu_Item*)mm->user_data_; + createSubMenu( mh, cnt, smm ); + } + mm++; + } + InsertMenu( mh, -1 ); +} + + +/** + * create a system menu bar using the given list of menu structs + * + * \author Matthias Melcher + * + * @param m list of Fl_Menu_Item + */ +void Fl_Sys_Menu_Bar::menu(const Fl_Menu_Item *m) +{ + fl_open_display(); + Fl_Menu_Bar::menu( m ); + fl_sys_menu_bar = this; + + char buf[255]; + + int cnt = 1; // first menu is no 2. no 1 is the Apple Menu + const Fl_Menu_Item *mm = m; + for (;;) + { + if ( !mm || !mm->text ) + break; + char visible = mm->visible() ? 1 : 0; + buf[1] = 0; + catMenuText( mm->text, buf+1 ); + buf[0] = strlen( buf+1 ); + MenuHandle mh = NewMenu( ++cnt, (unsigned char*)buf ); + if ( mm->flags & FL_MENU_INACTIVE ) { + ChangeMenuAttributes(mh, kMenuAttrAutoDisable, 0); + DisableAllMenuItems(mh); + DisableMenuItem(mh, 0); + } + if ( mm->flags & FL_SUBMENU ) + createSubMenu( mh, cnt, ++mm ); + else if ( mm->flags & FL_SUBMENU_POINTER ) { + const Fl_Menu_Item *smm = (Fl_Menu_Item*)mm->user_data_; + createSubMenu( mh, cnt, smm ); + } + if ( visible ) { + InsertMenu( mh, 0 ); + } + mm++; + } + DrawMenuBar(); +} + +/* +const Fl_Menu_Item* Fl_Sys_Menu_Bar::picked(const Fl_Menu_Item* v) { + Fl_menu_Item *ret = Fl_Menu_Bar::picked( v ); + + if ( m->flags & FL_MENU_TOGGLE ) + { + SetItemMark( mh, miCnt, ( m->flags & FL_MENU_VALUE ) ? 0x12 : 0 ); + } + + return ret; +} +*/ + +void Fl_Sys_Menu_Bar::draw() { +/* -- nothing to do, system should take care of this + draw_box(); + if (!menu() || !menu()->text) return; + const Fl_Menu_Item* m; + int X = x()+6; + for (m=menu(); m->text; m = m->next()) { + int W = m->measure(0,this) + 16; + m->draw(X, y(), W, h(), this); + X += W; + } + */ +} + +/* +int Fl_Menu_Bar::handle(int event) { + const Fl_Menu_Item* v; + if (menu() && menu()->text) switch (event) { + case FL_ENTER: + case FL_LEAVE: + return 1; + case FL_PUSH: + v = 0; + J1: + v = menu()->pulldown(x(), y(), w(), h(), v, this, 0, 1); + picked(v); + return 1; + case FL_SHORTCUT: + if (visible_r()) { + v = menu()->find_shortcut(); + if (v && v->submenu()) goto J1; + } + return test_shortcut() != 0; + } + return 0; +} +*/ + +#endif /* __APPLE__ */ + +// +// End of "$Id: Fl_Sys_Menu_Bar.cxx 6016 2008-01-09 21:32:40Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Tabs.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Tabs.cxx new file mode 100644 index 0000000..fd83a58 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Tabs.cxx @@ -0,0 +1,403 @@ +// +// "$Id: Fl_Tabs.cxx 5791 2007-05-01 20:20:21Z matt $" +// +// Tab widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// This is the "file card tabs" interface to allow you to put lots and lots +// of buttons and switches in a panel, as popularized by many toolkits. + +// Each child widget is a card, and it's label() is printed on the card tab. +// Clicking the tab makes that card visible. + +#include +#include +#include +#include +#include + +#define BORDER 2 +#define EXTRASPACE 10 + +// return the left edges of each tab (plus a fake left edge for a tab +// past the right-hand one). These position are actually of the left +// edge of the slope. They are either seperated by the correct distance +// or by EXTRASPACE or by zero. +// Return value is the index of the selected item. + +int Fl_Tabs::tab_positions(int* p, int* wp) { + int selected = 0; + Fl_Widget*const* a = array(); + int i; + char prev_draw_shortcut = fl_draw_shortcut; + fl_draw_shortcut = 1; + + p[0] = Fl::box_dx(box()); + for (i=0; ivisible()) selected = i; + + int wt = 0; int ht = 0; + o->measure_label(wt,ht); + + wp[i] = wt+EXTRASPACE; + p[i+1] = p[i]+wp[i]+BORDER; + } + fl_draw_shortcut = prev_draw_shortcut; + + int r = w(); + if (p[i] <= r) return selected; + // uh oh, they are too big: + // pack them against right edge: + p[i] = r; + for (i = children(); i--;) { + int l = r-wp[i]; + if (p[i+1] < l) l = p[i+1]; + if (p[i] <= l) break; + p[i] = l; + r -= EXTRASPACE; + } + // pack them against left edge and truncate width if they still don't fit: + for (i = 0; i= i*EXTRASPACE) break; + p[i] = i*EXTRASPACE; + int W = w()-1-EXTRASPACE*(children()-i) - p[i]; + if (wp[i] > W) wp[i] = W; + } + // adjust edges according to visiblity: + for (i = children(); i > selected; i--) { + p[i] = p[i-1]+wp[i-1]; + } + return selected; +} + +// return space needed for tabs. Negative to put them on the bottom: +int Fl_Tabs::tab_height() { + int H = h(); + int H2 = y(); + Fl_Widget*const* a = array(); + for (int i=children(); i--;) { + Fl_Widget* o = *a++; + if (o->y() < y()+H) H = o->y()-y(); + if (o->y()+o->h() > H2) H2 = o->y()+o->h(); + } + H2 = y()+h()-H2; + if (H2 > H) return (H2 <= 0) ? 0 : -H2; + else return (H <= 0) ? 0 : H; +} + +// this is used by fluid to pick tabs: +Fl_Widget *Fl_Tabs::which(int event_x, int event_y) { + int H = tab_height(); + if (H < 0) { + if (event_y > y()+h() || event_y < y()+h()+H) return 0; + } else { + if (event_y > y()+H || event_y < y()) return 0; + } + if (event_x < x()) return 0; + int p[128], wp[128]; + tab_positions(p, wp); + for (int i=0; i= 0) { + H += Fl::box_dy(box()); + damage(FL_DAMAGE_SCROLL, x(), y(), w(), H); + } else { + H = Fl::box_dy(box()) - H; + damage(FL_DAMAGE_SCROLL, x(), y() + h() - H, w(), H); + } +} + +int Fl_Tabs::handle(int event) { + + Fl_Widget *o; + int i; + + switch (event) { + + case FL_PUSH: { + int H = tab_height(); + if (H >= 0) { + if (Fl::event_y() > y()+H) return Fl_Group::handle(event); + } else { + if (Fl::event_y() < y()+h()+H) return Fl_Group::handle(event); + }} + case FL_DRAG: + case FL_RELEASE: + o = which(Fl::event_x(), Fl::event_y()); + if (event == FL_RELEASE) { + push(0); + if (o && Fl::visible_focus() && Fl::focus()!=this) { + Fl::focus(this); + redraw_tabs(); + } + if (o && value(o)) { + set_changed(); + do_callback(); + } + Fl_Tooltip::current(o); + } else { + push(o); + } + return 1; + case FL_MOVE: { + int ret = Fl_Group::handle(event); + Fl_Widget *o = Fl_Tooltip::current(), *n = o; + int H = tab_height(); + if ( (H>=0) && (Fl::event_y()>y()+H) ) + return ret; + else if ( (H<0) && (Fl::event_y() < y()+h()+H) ) + return ret; + else { + n = which(Fl::event_x(), Fl::event_y()); + if (!n) n = this; + } + if (n!=o) + Fl_Tooltip::enter(n); + return ret; } + case FL_FOCUS: + case FL_UNFOCUS: + if (!Fl::visible_focus()) return Fl_Group::handle(event); + if (Fl::event() == FL_RELEASE || + Fl::event() == FL_SHORTCUT || + Fl::event() == FL_KEYBOARD || + Fl::event() == FL_FOCUS || + Fl::event() == FL_UNFOCUS) { + redraw_tabs(); + if (Fl::event() == FL_FOCUS || Fl::event() == FL_UNFOCUS) return 0; + else return 1; + } else return Fl_Group::handle(event); + case FL_KEYBOARD: + switch (Fl::event_key()) { + case FL_Left: + if (child(0)->visible()) return 0; + for (i = 1; i < children(); i ++) + if (child(i)->visible()) break; + value(child(i - 1)); + set_changed(); + do_callback(); + return 1; + case FL_Right: + if (child(children() - 1)->visible()) return 0; + for (i = 0; i < children(); i ++) + if (child(i)->visible()) break; + value(child(i + 1)); + set_changed(); + do_callback(); + return 1; + case FL_Down: + redraw(); + return Fl_Group::handle(FL_FOCUS); + default: + break; + } + return Fl_Group::handle(event); + case FL_SHORTCUT: + for (i = 0; i < children(); ++i) { + Fl_Widget *c = child(i); + if (c->test_shortcut(c->label())) { + char sc = !c->visible(); + value(c); + if (sc) set_changed(); + do_callback(); + return 1; + } + } + return Fl_Group::handle(event); + case FL_SHOW: + value(); // update visibilities and fall through + default: + return Fl_Group::handle(event); + + } +} + +int Fl_Tabs::push(Fl_Widget *o) { + if (push_ == o) return 0; + if (push_ && !push_->visible() || o && !o->visible()) + redraw_tabs(); + push_ = o; + return 1; +} + +// The value() is the first visible child (or the last child if none +// are visible) and this also hides any other children. +// This allows the tabs to be deleted, moved to other groups, and +// show()/hide() called without it screwing up. +Fl_Widget* Fl_Tabs::value() { + Fl_Widget* v = 0; + Fl_Widget*const* a = array(); + for (int i=children(); i--;) { + Fl_Widget* o = *a++; + if (v) o->hide(); + else if (o->visible()) v = o; + else if (!i) {o->show(); v = o;} + } + return v; +} + +// Setting the value hides all other children, and makes this one +// visible, iff it is really a child: +int Fl_Tabs::value(Fl_Widget *newvalue) { + Fl_Widget*const* a = array(); + int ret = 0; + for (int i=children(); i--;) { + Fl_Widget* o = *a++; + if (o == newvalue) { + if (!o->visible()) ret = 1; + o->show(); + } else { + o->hide(); + } + } + return ret; +} + +enum {LEFT, RIGHT, SELECTED}; + +void Fl_Tabs::draw() { + Fl_Widget *v = value(); + int H = tab_height(); + + if (damage() & FL_DAMAGE_ALL) { // redraw the entire thing: + Fl_Color c = v ? v->color() : color(); + + draw_box(box(), x(), y()+(H>=0?H:0), w(), h()-(H>=0?H:-H), c); + + if (selection_color() != c) { + // Draw the top 5 lines of the tab pane in the selection color so + // that the user knows which tab is selected... + if (H >= 0) fl_push_clip(x(), y() + H, w(), 5); + else fl_push_clip(x(), y() + h() - H - 4, w(), 5); + + draw_box(box(), x(), y()+(H>=0?H:0), w(), h()-(H>=0?H:-H), + selection_color()); + + fl_pop_clip(); + } + if (v) draw_child(*v); + } else { // redraw the child + if (v) update_child(*v); + } + if (damage() & (FL_DAMAGE_SCROLL|FL_DAMAGE_ALL)) { + int p[128]; int wp[128]; + int selected = tab_positions(p,wp); + int i; + Fl_Widget*const* a = array(); + for (i=0; i selected; i--) + draw_tab(x()+p[i], x()+p[i+1], wp[i], H, a[i], RIGHT); + if (v) { + i = selected; + draw_tab(x()+p[i], x()+p[i+1], wp[i], H, a[i], SELECTED); + } + } +} + +void Fl_Tabs::draw_tab(int x1, int x2, int W, int H, Fl_Widget* o, int what) { + int sel = (what == SELECTED); + int dh = Fl::box_dh(box()); + int dy = Fl::box_dy(box()); + char prev_draw_shortcut = fl_draw_shortcut; + fl_draw_shortcut = 1; + + Fl_Boxtype bt = (o==push_ &&!sel) ? fl_down(box()) : box(); + + // compute offsets to make selected tab look bigger + int yofs = sel ? 0 : BORDER; + + if ((x2 < x1+W) && what == RIGHT) x1 = x2 - W; + + if (H >= 0) { + if (sel) fl_clip(x1, y(), x2 - x1, H + dh - dy); + else fl_clip(x1, y(), x2 - x1, H); + + H += dh; + + Fl_Color c = sel ? selection_color() : o->selection_color(); + + draw_box(bt, x1, y() + yofs, W, H + 10 - yofs, c); + + // Save the previous label color + Fl_Color oc = o->labelcolor(); + + // Draw the label using the current color... + o->labelcolor(sel ? labelcolor() : o->labelcolor()); + o->draw_label(x1, y() + yofs, W, H - yofs, FL_ALIGN_CENTER); + + // Restore the original label color... + o->labelcolor(oc); + + if (Fl::focus() == this && o->visible()) + draw_focus(box(), x1, y(), W, H); + + fl_pop_clip(); + } else { + H = -H; + + if (sel) fl_clip(x1, y() + h() - H - dy, x2 - x1, H + dy); + else fl_clip(x1, y() + h() - H, x2 - x1, H); + + H += dh; + + Fl_Color c = sel ? selection_color() : o->selection_color(); + + draw_box(bt, x1, y() + h() - H - 10, W, H + 10 - yofs, c); + + // Save the previous label color + Fl_Color oc = o->labelcolor(); + + // Draw the label using the current color... + o->labelcolor(sel ? labelcolor() : o->labelcolor()); + o->draw_label(x1, y() + h() - H, W, H - yofs, FL_ALIGN_CENTER); + + // Restore the original label color... + o->labelcolor(oc); + + if (Fl::focus() == this && o->visible()) + draw_focus(box(), x1, y() + h() - H, W, H); + + fl_pop_clip(); + } + fl_draw_shortcut = prev_draw_shortcut; +} + +Fl_Tabs::Fl_Tabs(int X,int Y,int W, int H, const char *l) : + Fl_Group(X,Y,W,H,l) +{ + box(FL_THIN_UP_BOX); + push_ = 0; +} + +// +// End of "$Id: Fl_Tabs.cxx 5791 2007-05-01 20:20:21Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Text_Buffer.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Text_Buffer.cxx new file mode 100644 index 0000000..64ee22f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Text_Buffer.cxx @@ -0,0 +1,2534 @@ +// +// "$Id: Fl_Text_Buffer.cxx 6011 2008-01-04 20:32:37Z matt $" +// +// Copyright 2001-2005 by Bill Spitzak and others. +// Original code Copyright Mark Edel. Permission to distribute under +// the LGPL for the FLTK library granted by Mark Edel. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include "flstring.h" +#include +#include +#include + + +#define PREFERRED_GAP_SIZE 1024 +/* Initial size for the buffer gap (empty space +in the buffer where text might be inserted +if the user is typing sequential chars ) */ + +static void histogramCharacters( const char *string, int length, char hist[ 256 ], + int init ); +static void subsChars( char *string, int length, char fromChar, char toChar ); +static char chooseNullSubsChar( char hist[ 256 ] ); +static void insertColInLine( const char *line, char *insLine, int column, int insWidth, + int tabDist, int useTabs, char nullSubsChar, char *outStr, int *outLen, + int *endOffset ); +static void deleteRectFromLine( const char *line, int rectStart, int rectEnd, + int tabDist, int useTabs, char nullSubsChar, char *outStr, int *outLen, + int *endOffset ); +static void overlayRectInLine( const char *line, char *insLine, int rectStart, + int rectEnd, int tabDist, int useTabs, char nullSubsChar, char *outStr, + int *outLen, int *endOffset ); + +static void addPadding( char *string, int startIndent, int toIndent, + int tabDist, int useTabs, char nullSubsChar, int *charsAdded ); +static char *copyLine( const char* text, int *lineLen ); +static int countLines( const char *string ); +static int textWidth( const char *text, int tabDist, char nullSubsChar ); +static char *realignTabs( const char *text, int origIndent, int newIndent, + int tabDist, int useTabs, char nullSubsChar, int *newLength ); +static char *expandTabs( const char *text, int startIndent, int tabDist, + char nullSubsChar, int *newLen ); +static char *unexpandTabs( char *text, int startIndent, int tabDist, + char nullSubsChar, int *newLen ); +static int max( int i1, int i2 ); +static int min( int i1, int i2 ); + +static const char *ControlCodeTable[ 32 ] = { + "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel", + "bs", "ht", "nl", "vt", "np", "cr", "so", "si", + "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb", + "can", "em", "sub", "esc", "fs", "gs", "rs", "us"}; + +static char* undobuffer; +static int undobufferlength; +static Fl_Text_Buffer* undowidget; +static int undoat; // points after insertion +static int undocut; // number of characters deleted there +static int undoinsert; // number of characters inserted +static int undoyankcut; // length of valid contents of buffer, even if undocut=0 + +static void undobuffersize(int n) { + if (n > undobufferlength) { + if (undobuffer) { + do {undobufferlength *= 2;} while (undobufferlength < n); + undobuffer = (char*)realloc(undobuffer, undobufferlength); + } else { + undobufferlength = n+9; + undobuffer = (char*)malloc(undobufferlength); + } + } +} + +/* +** Create an empty text buffer of a pre-determined size (use this to +** avoid unnecessary re-allocation if you know exactly how much the buffer +** will need to hold +*/ +Fl_Text_Buffer::Fl_Text_Buffer( int requestedSize ) { + mLength = 0; + mBuf = (char *)malloc( requestedSize + PREFERRED_GAP_SIZE ); + mGapStart = 0; + mGapEnd = PREFERRED_GAP_SIZE; + mTabDist = 8; + mUseTabs = 1; + mPrimary.mSelected = 0; + mPrimary.mRectangular = 0; + mPrimary.mStart = mPrimary.mEnd = 0; + mSecondary.mSelected = 0; + mSecondary.mStart = mSecondary.mEnd = 0; + mSecondary.mRectangular = 0; + mHighlight.mSelected = 0; + mHighlight.mStart = mHighlight.mEnd = 0; + mHighlight.mRectangular = 0; + mNodifyProcs = NULL; + mCbArgs = NULL; + mNModifyProcs = 0; + mNPredeleteProcs = 0; + mPredeleteProcs = NULL; + mPredeleteCbArgs = NULL; + mCursorPosHint = 0; + mNullSubsChar = '\0'; + mCanUndo = 1; +#ifdef PURIFY +{ int i; for (i = mGapStart; i < mGapEnd; i++) mBuf[ i ] = '.'; } +#endif +} + +/* +** Free a text buffer +*/ +Fl_Text_Buffer::~Fl_Text_Buffer() { + free( mBuf ); + if ( mNModifyProcs != 0 ) { + delete[] mNodifyProcs; + delete[] mCbArgs; + } + if ( mNPredeleteProcs != 0 ) { + delete[] mPredeleteProcs; + delete[] mPredeleteCbArgs; + } +} + +/* +** Get the entire contents of a text buffer. Memory is allocated to contain +** the returned string, which the caller must free. +*/ +char * Fl_Text_Buffer::text() { + char *t; + + t = (char *)malloc( mLength + 1 ); + memcpy( t, mBuf, mGapStart ); + memcpy( &t[ mGapStart ], &mBuf[ mGapEnd ], + mLength - mGapStart ); + t[ mLength ] = '\0'; + return t; +} + +/* +** Replace the entire contents of the text buffer +*/ +void Fl_Text_Buffer::text( const char *t ) { + int insertedLength, deletedLength; + const char *deletedText; + + call_predelete_callbacks(0, length()); + + /* Save information for redisplay, and get rid of the old buffer */ + deletedText = text(); + deletedLength = mLength; + free( (void *)mBuf ); + + /* Start a new buffer with a gap of PREFERRED_GAP_SIZE in the center */ + insertedLength = strlen( t ); + mBuf = (char *)malloc( insertedLength + PREFERRED_GAP_SIZE ); + mLength = insertedLength; + mGapStart = insertedLength / 2; + mGapEnd = mGapStart + PREFERRED_GAP_SIZE; + memcpy( mBuf, t, mGapStart ); + memcpy( &mBuf[ mGapEnd ], &t[ mGapStart ], insertedLength - mGapStart ); +#ifdef PURIFY +{ int i; for ( i = mGapStart; i < mGapEnd; i++ ) mBuf[ i ] = '.'; } +#endif + + /* Zero all of the existing selections */ + update_selections( 0, deletedLength, 0 ); + + /* Call the saved display routine(s) to update the screen */ + call_modify_callbacks( 0, deletedLength, insertedLength, 0, deletedText ); + free( (void *)deletedText ); +} + +/* +** Return a copy of the text between "start" and "end" character positions +** from text buffer "buf". Positions start at 0, and the range does not +** include the character pointed to by "end" +*/ +char * Fl_Text_Buffer::text_range( int start, int end ) { + char * s; + int copiedLength, part1Length; + + /* Make sure start and end are ok, and allocate memory for returned string. + If start is bad, return "", if end is bad, adjust it. */ + if ( start < 0 || start > mLength ) { + s = (char *)malloc( 1 ); + s[ 0 ] = '\0'; + return s; + } + if ( end < start ) { + int temp = start; + start = end; + end = temp; + } + if ( end > mLength ) + end = mLength; + copiedLength = end - start; + s = (char *)malloc( copiedLength + 1 ); + + /* Copy the text from the buffer to the returned string */ + if ( end <= mGapStart ) { + memcpy( s, &mBuf[ start ], copiedLength ); + } else if ( start >= mGapStart ) { + memcpy( s, &mBuf[ start + ( mGapEnd - mGapStart ) ], copiedLength ); + } else { + part1Length = mGapStart - start; + memcpy( s, &mBuf[ start ], part1Length ); + memcpy( &s[ part1Length ], &mBuf[ mGapEnd ], copiedLength - part1Length ); + } + s[ copiedLength ] = '\0'; + return s; +} + +/* +** Return the character at buffer position "pos". Positions start at 0. +*/ +char Fl_Text_Buffer::character( int pos ) { + if ( pos < 0 || pos >= mLength ) + return '\0'; + if ( pos < mGapStart ) + return mBuf[ pos ]; + else + return mBuf[ pos + mGapEnd - mGapStart ]; +} + +/* +** Insert null-terminated string "text" at position "pos" in "buf" +*/ +void Fl_Text_Buffer::insert( int pos, const char *s ) { + int nInserted; + + /* if pos is not contiguous to existing text, make it */ + if ( pos > mLength ) pos = mLength; + if ( pos < 0 ) pos = 0; + + /* Even if nothing is deleted, we must call these callbacks */ + call_predelete_callbacks( pos, 0 ); + + /* insert and redisplay */ + nInserted = insert_( pos, s ); + mCursorPosHint = pos + nInserted; + call_modify_callbacks( pos, 0, nInserted, 0, NULL ); +} + +/* +** Delete the characters between "start" and "end", and insert the +** null-terminated string "text" in their place in in "buf" +*/ +void Fl_Text_Buffer::replace( int start, int end, const char *s ) { + const char * deletedText; + int nInserted; + + // Range check... + if (!s) return; + if (start < 0) start = 0; + if (end > mLength) end = mLength; + + call_predelete_callbacks( start, end-start ); + deletedText = text_range( start, end ); + remove_( start, end ); + //undoyankcut = undocut; + nInserted = insert_( start, s ); + mCursorPosHint = start + nInserted; + call_modify_callbacks( start, end - start, nInserted, 0, deletedText ); + free( (void *)deletedText ); +} + +void Fl_Text_Buffer::remove( int start, int end ) { + const char * deletedText; + + /* Make sure the arguments make sense */ + if ( start > end ) { + int temp = start; + start = end; + end = temp; + } + if ( start > mLength ) start = mLength; + if ( start < 0 ) start = 0; + if ( end > mLength ) end = mLength; + if ( end < 0 ) end = 0; + + if (start == end) return; + + call_predelete_callbacks( start, end-start ); + /* Remove and redisplay */ + deletedText = text_range( start, end ); + remove_( start, end ); + mCursorPosHint = start; + call_modify_callbacks( start, end - start, 0, 0, deletedText ); + free( (void *)deletedText ); +} + +void Fl_Text_Buffer::copy( Fl_Text_Buffer *fromBuf, int fromStart, + int fromEnd, int toPos ) { + int copiedLength = fromEnd - fromStart; + int part1Length; + + /* Prepare the buffer to receive the new text. If the new text fits in + the current buffer, just move the gap (if necessary) to where + the text should be inserted. If the new text is too large, reallocate + the buffer with a gap large enough to accomodate the new text and a + gap of PREFERRED_GAP_SIZE */ + if ( copiedLength > mGapEnd - mGapStart ) + reallocate_with_gap( toPos, copiedLength + PREFERRED_GAP_SIZE ); + else if ( toPos != mGapStart ) + move_gap( toPos ); + + /* Insert the new text (toPos now corresponds to the start of the gap) */ + if ( fromEnd <= fromBuf->mGapStart ) { + memcpy( &mBuf[ toPos ], &fromBuf->mBuf[ fromStart ], copiedLength ); + } else if ( fromStart >= fromBuf->mGapStart ) { + memcpy( &mBuf[ toPos ], + &fromBuf->mBuf[ fromStart + ( fromBuf->mGapEnd - fromBuf->mGapStart ) ], + copiedLength ); + } else { + part1Length = fromBuf->mGapStart - fromStart; + memcpy( &mBuf[ toPos ], &fromBuf->mBuf[ fromStart ], part1Length ); + memcpy( &mBuf[ toPos + part1Length ], &fromBuf->mBuf[ fromBuf->mGapEnd ], + copiedLength - part1Length ); + } + mGapStart += copiedLength; + mLength += copiedLength; + update_selections( toPos, 0, copiedLength ); +} + +/* +** remove text according to the undo variables or insert text +** from the undo buffer +*/ +int Fl_Text_Buffer::undo(int *cursorPos) { + if (undowidget != this || !undocut && !undoinsert &&!mCanUndo) return 0; + + int ilen = undocut; + int xlen = undoinsert; + int b = undoat-xlen; + + if (xlen && undoyankcut && !ilen) { + ilen = undoyankcut; + } + + if (xlen && ilen) { + undobuffersize(ilen+1); + undobuffer[ilen] = 0; + char *tmp = strdup(undobuffer); + replace(b, undoat, tmp); + if (cursorPos) *cursorPos = mCursorPosHint; + free(tmp); + } + else if (xlen) { + remove(b, undoat); + if (cursorPos) *cursorPos = mCursorPosHint; + } + else if (ilen) { + undobuffersize(ilen+1); + undobuffer[ilen] = 0; + insert(undoat, undobuffer); + if (cursorPos) *cursorPos = mCursorPosHint; + undoyankcut = 0; + } + + return 1; +} + +/* +** let the undo system know if we can undo changes +*/ +void Fl_Text_Buffer::canUndo(char flag) { + mCanUndo = flag; +} + +/* +** Insert "text" columnwise into buffer starting at displayed character +** position "column" on the line beginning at "startPos". Opens a rectangular +** space the width and height of "text", by moving all text to the right of +** "column" right. If charsInserted and charsDeleted are not NULL, the +** number of characters inserted and deleted in the operation (beginning +** at startPos) are returned in these arguments +*/ +void Fl_Text_Buffer::insert_column( int column, int startPos, const char *s, + int *charsInserted, int *charsDeleted ) { + int nLines, lineStartPos, nDeleted, insertDeleted, nInserted; + const char *deletedText; + + nLines = countLines( s ); + lineStartPos = line_start( startPos ); + nDeleted = line_end( skip_lines( startPos, nLines ) ) - + lineStartPos; + call_predelete_callbacks( lineStartPos, nDeleted ); + deletedText = text_range( lineStartPos, lineStartPos + nDeleted ); + insert_column_( column, lineStartPos, s, &insertDeleted, &nInserted, + &mCursorPosHint ); + if ( nDeleted != insertDeleted ) + Fl::error("Fl_Text_Buffer::insert_column(): internal consistency check ins1 failed"); + call_modify_callbacks( lineStartPos, nDeleted, nInserted, 0, deletedText ); + free( (void *) deletedText ); + if ( charsInserted != NULL ) + * charsInserted = nInserted; + if ( charsDeleted != NULL ) + * charsDeleted = nDeleted; +} + +/* +** Overlay "text" between displayed character positions "rectStart" and +** "rectEnd" on the line beginning at "startPos". If charsInserted and +** charsDeleted are not NULL, the number of characters inserted and deleted +** in the operation (beginning at startPos) are returned in these arguments. +*/ +void Fl_Text_Buffer::overlay_rectangular( int startPos, int rectStart, + int rectEnd, const char *s, int *charsInserted, int *charsDeleted ) { + int nLines, lineStartPos, nDeleted, insertDeleted, nInserted; + const char *deletedText; + + nLines = countLines( s ); + lineStartPos = line_start( startPos ); + nDeleted = line_end( skip_lines( startPos, nLines ) ) - + lineStartPos; + call_predelete_callbacks( lineStartPos, nDeleted ); + deletedText = text_range( lineStartPos, lineStartPos + nDeleted ); + overlay_rectangular_( lineStartPos, rectStart, rectEnd, s, &insertDeleted, + &nInserted, &mCursorPosHint ); + if ( nDeleted != insertDeleted ) + Fl::error("Fl_Text_Buffer::overlay_rectangle(): internal consistency check ovly1 failed"); + call_modify_callbacks( lineStartPos, nDeleted, nInserted, 0, deletedText ); + free( (void *) deletedText ); + if ( charsInserted != NULL ) + * charsInserted = nInserted; + if ( charsDeleted != NULL ) + * charsDeleted = nDeleted; +} + +/* +** Replace a rectangular area in buf, given by "start", "end", "rectStart", +** and "rectEnd", with "text". If "text" is vertically longer than the +** rectangle, add extra lines to make room for it. +*/ +void Fl_Text_Buffer::replace_rectangular( int start, int end, int rectStart, + int rectEnd, const char *s ) { + char *insPtr; + const char *deletedText; + char *insText = (char *)""; + int i, nInsertedLines, nDeletedLines, insLen, hint; + int insertDeleted, insertInserted, deleteInserted; + int linesPadded = 0; + + /* Make sure start and end refer to complete lines, since the + columnar delete and insert operations will replace whole lines */ + start = line_start( start ); + end = line_end( end ); + + call_predelete_callbacks( start, end-start ); + + /* If more lines will be deleted than inserted, pad the inserted text + with newlines to make it as long as the number of deleted lines. This + will indent all of the text to the right of the rectangle to the same + column. If more lines will be inserted than deleted, insert extra + lines in the buffer at the end of the rectangle to make room for the + additional lines in "text" */ + nInsertedLines = countLines( s ); + nDeletedLines = count_lines( start, end ); + if ( nInsertedLines < nDeletedLines ) { + insLen = strlen( s ); + insText = (char *)malloc( insLen + nDeletedLines - nInsertedLines + 1 ); + strcpy( insText, s ); + insPtr = insText + insLen; + for ( i = 0; i < nDeletedLines - nInsertedLines; i++ ) + *insPtr++ = '\n'; + *insPtr = '\0'; + } else if ( nDeletedLines < nInsertedLines ) { + linesPadded = nInsertedLines - nDeletedLines; + for ( i = 0; i < linesPadded; i++ ) + insert_( end, "\n" ); + } /* else nDeletedLines == nInsertedLines; */ + + /* Save a copy of the text which will be modified for the modify CBs */ + deletedText = text_range( start, end ); + + /* Delete then insert */ + remove_rectangular_( start, end, rectStart, rectEnd, &deleteInserted, &hint ); + insert_column_( rectStart, start, insText, &insertDeleted, &insertInserted, + &mCursorPosHint ); + + /* Figure out how many chars were inserted and call modify callbacks */ + if ( insertDeleted != deleteInserted + linesPadded ) + Fl::error("Fl_Text_Buffer::replace_rectangular(): internal consistency check repl1 failed"); + call_modify_callbacks( start, end - start, insertInserted, 0, deletedText ); + free( (void *) deletedText ); + if ( nInsertedLines < nDeletedLines ) + free( (void *) insText ); +} + +/* +** Remove a rectangular swath of characters between character positions start +** and end and horizontal displayed-character offsets rectStart and rectEnd. +*/ +void Fl_Text_Buffer::remove_rectangular( int start, int end, int rectStart, + int rectEnd ) { + const char * deletedText; + int nInserted; + + start = line_start( start ); + end = line_end( end ); + call_predelete_callbacks( start, end-start ); + deletedText = text_range( start, end ); + remove_rectangular_( start, end, rectStart, rectEnd, &nInserted, + &mCursorPosHint ); + call_modify_callbacks( start, end - start, nInserted, 0, deletedText ); + free( (void *) deletedText ); +} + +/* +** Clear a rectangular "hole" out of the buffer between character positions +** start and end and horizontal displayed-character offsets rectStart and +** rectEnd. +*/ +void Fl_Text_Buffer::clear_rectangular( int start, int end, int rectStart, + int rectEnd ) { + int i, nLines; + char *newlineString; + + nLines = count_lines( start, end ); + newlineString = (char *)malloc( nLines + 1 ); + for ( i = 0; i < nLines; i++ ) + newlineString[ i ] = '\n'; + newlineString[ i ] = '\0'; + overlay_rectangular( start, rectStart, rectEnd, newlineString, + NULL, NULL ); + free( (void *) newlineString ); +} + +char * Fl_Text_Buffer::text_in_rectangle( int start, int end, + int rectStart, int rectEnd ) { + int lineStart, selLeft, selRight, len; + char *textOut, *outPtr, *retabbedStr; + const char *textIn; + + start = line_start( start ); + end = line_end( end ); + textOut = (char *)malloc( ( end - start ) + 1 ); + lineStart = start; + outPtr = textOut; + while ( lineStart <= end ) { + rectangular_selection_boundaries( lineStart, rectStart, rectEnd, + &selLeft, &selRight ); + textIn = text_range( selLeft, selRight ); + len = selRight - selLeft; + memcpy( outPtr, textIn, len ); + free( (void *) textIn ); + outPtr += len; + lineStart = line_end( selRight ) + 1; + *outPtr++ = '\n'; + } + if ( outPtr != textOut ) + outPtr--; /* don't leave trailing newline */ + *outPtr = '\0'; + + /* If necessary, realign the tabs in the selection as if the text were + positioned at the left margin */ + retabbedStr = realignTabs( textOut, rectStart, 0, mTabDist, + mUseTabs, mNullSubsChar, &len ); + free( (void *) textOut ); + return retabbedStr; +} + +/* +** Set the hardware tab distance used by all displays for this buffer, +** and used in computing offsets for rectangular selection operations. +*/ +void Fl_Text_Buffer::tab_distance( int tabDist ) { + const char * deletedText; + + /* First call the pre-delete callbacks with the previous tab setting + still active. */ + call_predelete_callbacks( 0, mLength ); + + /* Change the tab setting */ + mTabDist = tabDist; + + /* Force any display routines to redisplay everything (unfortunately, + this means copying the whole buffer contents to provide "deletedText" */ + deletedText = text(); + call_modify_callbacks( 0, mLength, mLength, 0, deletedText ); + free( (void *) deletedText ); +} + +void Fl_Text_Buffer::select( int start, int end ) { + Fl_Text_Selection oldSelection = mPrimary; + + mPrimary.set( start, end ); + redisplay_selection( &oldSelection, &mPrimary ); +} + +void Fl_Text_Buffer::unselect() { + Fl_Text_Selection oldSelection = mPrimary; + + mPrimary.mSelected = 0; + redisplay_selection( &oldSelection, &mPrimary ); +} + +void Fl_Text_Buffer::select_rectangular( int start, int end, int rectStart, + int rectEnd ) { + Fl_Text_Selection oldSelection = mPrimary; + + mPrimary.set_rectangular( start, end, rectStart, rectEnd ); + redisplay_selection( &oldSelection, &mPrimary ); +} + +int Fl_Text_Buffer::selection_position( int *start, int *end + ) { + return mPrimary.position( start, end ); +} + +int Fl_Text_Buffer::selection_position( int *start, int *end, + int *isRect, int *rectStart, int *rectEnd ) { + return mPrimary.position( start, end, isRect, rectStart, + rectEnd ); +} + +char * Fl_Text_Buffer::selection_text() { + return selection_text_( &mPrimary ); +} + +void Fl_Text_Buffer::remove_selection() { + remove_selection_( &mPrimary ); +} + +void Fl_Text_Buffer::replace_selection( const char *s ) { + replace_selection_( &mPrimary, s ); +} + +void Fl_Text_Buffer::secondary_select( int start, int end ) { + Fl_Text_Selection oldSelection = mSecondary; + + mSecondary.set( start, end ); + redisplay_selection( &oldSelection, &mSecondary ); +} + +void Fl_Text_Buffer::secondary_unselect() { + Fl_Text_Selection oldSelection = mSecondary; + + mSecondary.mSelected = 0; + redisplay_selection( &oldSelection, &mSecondary ); +} + +void Fl_Text_Buffer::secondary_select_rectangular( int start, int end, + int rectStart, int rectEnd ) { + Fl_Text_Selection oldSelection = mSecondary; + + mSecondary.set_rectangular( start, end, rectStart, rectEnd ); + redisplay_selection( &oldSelection, &mSecondary ); +} + +int Fl_Text_Buffer::secondary_selection_position( int *start, int *end + ) { + return mSecondary.position( start, end ); +} + +int Fl_Text_Buffer::secondary_selection_position( int *start, int *end, + int *isRect, int *rectStart, int *rectEnd ) { + return mSecondary.position( start, end, isRect, rectStart, + rectEnd ); +} + +char * Fl_Text_Buffer::secondary_selection_text() { + return selection_text_( &mSecondary ); +} + +void Fl_Text_Buffer::remove_secondary_selection() { + remove_selection_( &mSecondary ); +} + +void Fl_Text_Buffer::replace_secondary_selection( const char *s ) { + replace_selection_( &mSecondary, s ); +} + +void Fl_Text_Buffer::highlight( int start, int end ) { + Fl_Text_Selection oldSelection = mHighlight; + + mHighlight.set( start, end ); + redisplay_selection( &oldSelection, &mHighlight ); +} + +void Fl_Text_Buffer::unhighlight() { + Fl_Text_Selection oldSelection = mHighlight; + + mHighlight.mSelected = 0; + redisplay_selection( &oldSelection, &mHighlight ); +} + +void Fl_Text_Buffer::highlight_rectangular( int start, int end, + int rectStart, int rectEnd ) { + Fl_Text_Selection oldSelection = mHighlight; + + mHighlight.set_rectangular( start, end, rectStart, rectEnd ); + redisplay_selection( &oldSelection, &mHighlight ); +} + +int Fl_Text_Buffer::highlight_position( int *start, int *end + ) { + return mHighlight.position( start, end ); +} + +int Fl_Text_Buffer::highlight_position( int *start, int *end, + int *isRect, int *rectStart, int *rectEnd ) { + return mHighlight.position( start, end, isRect, rectStart, + rectEnd ); +} + +char * Fl_Text_Buffer::highlight_text() { + return selection_text_( &mHighlight ); +} + +/* +** Add a callback routine to be called when the buffer is modified +*/ +void Fl_Text_Buffer::add_modify_callback( Fl_Text_Modify_Cb bufModifiedCB, + void *cbArg ) { + Fl_Text_Modify_Cb * newModifyProcs; + void **newCBArgs; + int i; + + newModifyProcs = new Fl_Text_Modify_Cb [ mNModifyProcs + 1 ]; + newCBArgs = new void * [ mNModifyProcs + 1 ]; + for ( i = 0; i < mNModifyProcs; i++ ) { + newModifyProcs[ i + 1 ] = mNodifyProcs[ i ]; + newCBArgs[ i + 1 ] = mCbArgs[ i ]; + } + if ( mNModifyProcs != 0 ) { + delete [] mNodifyProcs; + delete [] mCbArgs; + } + newModifyProcs[ 0 ] = bufModifiedCB; + newCBArgs[ 0 ] = cbArg; + mNModifyProcs++; + mNodifyProcs = newModifyProcs; + mCbArgs = newCBArgs; +} + +void Fl_Text_Buffer::remove_modify_callback( Fl_Text_Modify_Cb bufModifiedCB, + void *cbArg ) { + int i, toRemove = -1; + Fl_Text_Modify_Cb *newModifyProcs; + void **newCBArgs; + + /* find the matching callback to remove */ + for ( i = 0; i < mNModifyProcs; i++ ) { + if ( mNodifyProcs[ i ] == bufModifiedCB && mCbArgs[ i ] == cbArg ) { + toRemove = i; + break; + } + } + if ( toRemove == -1 ) { + Fl::error("Fl_Text_Buffer::remove_modify_callback(): Can't find modify CB to remove"); + return; + } + + /* Allocate new lists for remaining callback procs and args (if + any are left) */ + mNModifyProcs--; + if ( mNModifyProcs == 0 ) { + mNModifyProcs = 0; + delete[] mNodifyProcs; + mNodifyProcs = NULL; + delete[] mCbArgs; + mCbArgs = NULL; + return; + } + newModifyProcs = new Fl_Text_Modify_Cb [ mNModifyProcs ]; + newCBArgs = new void * [ mNModifyProcs ]; + + /* copy out the remaining members and free the old lists */ + for ( i = 0; i < toRemove; i++ ) { + newModifyProcs[ i ] = mNodifyProcs[ i ]; + newCBArgs[ i ] = mCbArgs[ i ]; + } + for ( ; i < mNModifyProcs; i++ ) { + newModifyProcs[ i ] = mNodifyProcs[ i + 1 ]; + newCBArgs[ i ] = mCbArgs[ i + 1 ]; + } + delete[] mNodifyProcs; + delete[] mCbArgs; + mNodifyProcs = newModifyProcs; + mCbArgs = newCBArgs; +} + +/* +** Add a callback routine to be called before text is deleted from the buffer. +*/ +void Fl_Text_Buffer::add_predelete_callback(Fl_Text_Predelete_Cb bufPreDeleteCB, + void *cbArg) { + Fl_Text_Predelete_Cb *newPreDeleteProcs; + void **newCBArgs; + int i; + + newPreDeleteProcs = new Fl_Text_Predelete_Cb[ mNPredeleteProcs + 1 ]; + newCBArgs = new void * [ mNPredeleteProcs + 1 ]; + for ( i = 0; i < mNPredeleteProcs; i++ ) { + newPreDeleteProcs[i + 1] = mPredeleteProcs[i]; + newCBArgs[i + 1] = mPredeleteCbArgs[i]; + } + if (! mNPredeleteProcs != 0) { + delete [] mPredeleteProcs; + delete [] mPredeleteCbArgs; + } + newPreDeleteProcs[0] = bufPreDeleteCB; + newCBArgs[0] = cbArg; + mNPredeleteProcs++; + mPredeleteProcs = newPreDeleteProcs; + mPredeleteCbArgs = newCBArgs; +} + +void Fl_Text_Buffer::remove_predelete_callback( + Fl_Text_Predelete_Cb bufPreDeleteCB, void *cbArg) { + int i, toRemove = -1; + Fl_Text_Predelete_Cb *newPreDeleteProcs; + void **newCBArgs; + + /* find the matching callback to remove */ + for ( i = 0; i < mNPredeleteProcs; i++) { + if (mPredeleteProcs[i] == bufPreDeleteCB && + mPredeleteCbArgs[i] == cbArg) { + toRemove = i; + break; + } + } + if (toRemove == -1) { + Fl::error("Fl_Text_Buffer::remove_predelete_callback(): Can't find pre-delete CB to remove"); + return; + } + + /* Allocate new lists for remaining callback procs and args (if + any are left) */ + mNPredeleteProcs--; + if (mNPredeleteProcs == 0) { + mNPredeleteProcs = 0; + delete[] mPredeleteProcs; + mPredeleteProcs = NULL; + delete[] mPredeleteCbArgs; + mPredeleteCbArgs = NULL; + return; + } + newPreDeleteProcs = new Fl_Text_Predelete_Cb [ mNPredeleteProcs ]; + newCBArgs = new void * [ mNPredeleteProcs ]; + + /* copy out the remaining members and free the old lists */ + for ( i = 0; i < toRemove; i++) { + newPreDeleteProcs[i] = mPredeleteProcs[i]; + newCBArgs[i] = mPredeleteCbArgs[i]; + } + for ( ; i < mNPredeleteProcs; i++) { + newPreDeleteProcs[i] = mPredeleteProcs[i+1]; + newCBArgs[i] = mPredeleteCbArgs[i+1]; + } + delete[] mPredeleteProcs; + delete[] mPredeleteCbArgs; + mPredeleteProcs = newPreDeleteProcs; + mPredeleteCbArgs = newCBArgs; +} + +/* +** Return the text from the entire line containing position "pos" +*/ +char * Fl_Text_Buffer::line_text( int pos ) { + return text_range( line_start( pos ), line_end( pos ) ); +} + +/* +** Find the position of the start of the line containing position "pos" +*/ +int Fl_Text_Buffer::line_start( int pos ) { + if ( !findchar_backward( pos, '\n', &pos ) ) + return 0; + return pos + 1; +} + +/* +** Find the position of the end of the line containing position "pos" +** (which is either a pointer to the newline character ending the line, +** or a pointer to one character beyond the end of the buffer) +*/ +int Fl_Text_Buffer::line_end( int pos ) { + if ( !findchar_forward( pos, '\n', &pos ) ) + pos = mLength; + return pos; +} + +int Fl_Text_Buffer::word_start( int pos ) { + while ( pos && ( isalnum( character( pos ) ) || character( pos ) == '_' ) ) { + pos--; + } + if ( !( isalnum( character( pos ) ) || character( pos ) == '_' ) ) pos++; + return pos; +} + +int Fl_Text_Buffer::word_end( int pos ) { + while (pos < length() && (isalnum(character(pos)) || character(pos) == '_' )) { + pos++; + } + return pos; +} + +/* +** Get a character from the text buffer expanded into it's screen +** representation (which may be several characters for a tab or a +** control code). Returns the number of characters written to "outStr". +** "indent" is the number of characters from the start of the line +** for figuring tabs. Output string is guranteed to be shorter or +** equal in length to FL_TEXT_MAX_EXP_CHAR_LEN +*/ +int Fl_Text_Buffer::expand_character( int pos, int indent, char *outStr ) { + return expand_character( character( pos ), indent, outStr, + mTabDist, mNullSubsChar ); +} + +/* +** Expand a single character from the text buffer into it's screen +** representation (which may be several characters for a tab or a +** control code). Returns the number of characters added to "outStr". +** "indent" is the number of characters from the start of the line +** for figuring tabs. Output string is guranteed to be shorter or +** equal in length to FL_TEXT_MAX_EXP_CHAR_LEN +*/ +int Fl_Text_Buffer::expand_character( char c, int indent, char *outStr, int tabDist, + char nullSubsChar ) { + int i, nSpaces; + + /* Convert tabs to spaces */ + if ( c == '\t' ) { + nSpaces = tabDist - ( indent % tabDist ); + for ( i = 0; i < nSpaces; i++ ) + outStr[ i ] = ' '; + return nSpaces; + } + + /* Convert control codes to readable character sequences */ + /*... is this safe with international character sets? */ + if ( ( ( unsigned char ) c ) <= 31 ) { + sprintf( outStr, "<%s>", ControlCodeTable[ ( unsigned char ) c ] ); + return strlen( outStr ); + } else if ( c == 127 ) { + sprintf( outStr, "" ); + return 5; + } else if ( c == nullSubsChar ) { + sprintf( outStr, "" ); + return 5; + } + + /* Otherwise, just return the character */ + *outStr = c; + return 1; +} + +/* +** Return the length in displayed characters of character "c" expanded +** for display (as discussed above in BufGetExpandedChar). If the +** buffer for which the character width is being measured is doing null +** substitution, nullSubsChar should be passed as that character (or nul +** to ignore). +*/ +int Fl_Text_Buffer::character_width( char c, int indent, int tabDist, char nullSubsChar ) { + /* Note, this code must parallel that in Fl_Text_Buffer::ExpandCharacter */ + if ( c == '\t' ) + return tabDist - ( indent % tabDist ); + else if ( ( ( unsigned char ) c ) <= 31 ) + return strlen( ControlCodeTable[ ( unsigned char ) c ] ) + 2; + else if ( c == 127 ) + return 5; + else if ( c == nullSubsChar ) + return 5; + return 1; +} + +/* +** Count the number of displayed characters between buffer position +** "lineStartPos" and "targetPos". (displayed characters are the characters +** shown on the screen to represent characters in the buffer, where tabs and +** control characters are expanded) +*/ +int Fl_Text_Buffer::count_displayed_characters( int lineStartPos, int targetPos ) { + int pos, charCount = 0; + char expandedChar[ FL_TEXT_MAX_EXP_CHAR_LEN ]; + + pos = lineStartPos; + while ( pos < targetPos ) + charCount += expand_character( pos++, charCount, expandedChar ); + return charCount; +} + +/* +** Count forward from buffer position "startPos" in displayed characters +** (displayed characters are the characters shown on the screen to represent +** characters in the buffer, where tabs and control characters are expanded) +*/ +int Fl_Text_Buffer::skip_displayed_characters( int lineStartPos, int nChars ) { + int pos, charCount = 0; + char c; + + pos = lineStartPos; + while ( charCount < nChars && pos < mLength ) { + c = character( pos ); + if ( c == '\n' ) + return pos; + charCount += character_width( c, charCount, mTabDist, mNullSubsChar ); + pos++; + } + return pos; +} + +/* +** Count the number of newlines between startPos and endPos in buffer "buf". +** The character at position "endPos" is not counted. +*/ +int Fl_Text_Buffer::count_lines( int startPos, int endPos ) { + int pos, gapLen = mGapEnd - mGapStart; + int lineCount = 0; + + pos = startPos; + while ( pos < mGapStart ) { + if ( pos == endPos ) + return lineCount; + if ( mBuf[ pos++ ] == '\n' ) + lineCount++; + } + while ( pos < mLength ) { + if ( pos == endPos ) + return lineCount; + if ( mBuf[ pos++ + gapLen ] == '\n' ) + lineCount++; + } + return lineCount; +} + +/* +** Find the first character of the line "nLines" forward from "startPos" +** in "buf" and return its position +*/ +int Fl_Text_Buffer::skip_lines( int startPos, int nLines ) { + int pos, gapLen = mGapEnd - mGapStart; + int lineCount = 0; + + if ( nLines == 0 ) + return startPos; + + pos = startPos; + while ( pos < mGapStart ) { + if ( mBuf[ pos++ ] == '\n' ) { + lineCount++; + if ( lineCount == nLines ) + return pos; + } + } + while ( pos < mLength ) { + if ( mBuf[ pos++ + gapLen ] == '\n' ) { + lineCount++; + if ( lineCount >= nLines ) + return pos; + } + } + return pos; +} + +/* +** Find the position of the first character of the line "nLines" backwards +** from "startPos" (not counting the character pointed to by "startpos" if +** that is a newline) in "buf". nLines == 0 means find the beginning of +** the line +*/ +int Fl_Text_Buffer::rewind_lines( int startPos, int nLines ) { + int pos, gapLen = mGapEnd - mGapStart; + int lineCount = -1; + + pos = startPos - 1; + if ( pos <= 0 ) + return 0; + + while ( pos >= mGapStart ) { + if ( mBuf[ pos + gapLen ] == '\n' ) { + if ( ++lineCount >= nLines ) + return pos + 1; + } + pos--; + } + while ( pos >= 0 ) { + if ( mBuf[ pos ] == '\n' ) { + if ( ++lineCount >= nLines ) + return pos + 1; + } + pos--; + } + return 0; +} + +/* +** Search forwards in buffer for string "searchString", starting with the +** character "startPos", and returning the result in "foundPos" +** returns 1 if found, 0 if not. +*/ +int Fl_Text_Buffer::search_forward( int startPos, const char *searchString, + int *foundPos, int matchCase ) +{ + if (!searchString) return 0; + int bp; + const char* sp; + while (startPos < length()) { + bp = startPos; + sp = searchString; + do { + if (!*sp) { *foundPos = startPos; return 1; } + } while ((matchCase ? character(bp++) == *sp++ : + toupper(character(bp++)) == toupper(*sp++)) + && bp < length()); + startPos++; + } + return 0; +} + +/* +** Search backwards in buffer for string "searchString", starting with the +** character BEFORE "startPos", returning the result in "foundPos" +** returns 1 if found, 0 if not. +*/ +int Fl_Text_Buffer::search_backward( int startPos, const char *searchString, + int *foundPos, int matchCase ) +{ + if (!searchString) return 0; + int bp; + const char* sp; + while (startPos > 0) { + bp = startPos-1; + sp = searchString+strlen(searchString)-1; + do { + if (sp < searchString) { *foundPos = bp+1; return 1; } + } while ((matchCase ? character(bp--) == *sp-- : + toupper(character(bp--)) == toupper(*sp--)) + && bp >= 0); + startPos--; + } + return 0; +} + +/* +** Search forwards in buffer for characters in "searchChars", starting +** with the character "startPos", and returning the result in "foundPos" +** returns 1 if found, 0 if not. +*/ +int Fl_Text_Buffer::findchars_forward( int startPos, const char *searchChars, + int *foundPos ) { + int pos, gapLen = mGapEnd - mGapStart; + const char *c; + + pos = startPos; + while ( pos < mGapStart ) { + for ( c = searchChars; *c != '\0'; c++ ) { + if ( mBuf[ pos ] == *c ) { + *foundPos = pos; + return 1; + } + } + pos++; + } + while ( pos < mLength ) { + for ( c = searchChars; *c != '\0'; c++ ) { + if ( mBuf[ pos + gapLen ] == *c ) { + *foundPos = pos; + return 1; + } + } + pos++; + } + *foundPos = mLength; + return 0; +} + +/* +** Search backwards in buffer for characters in "searchChars", starting +** with the character BEFORE "startPos", returning the result in "foundPos" +** returns 1 if found, 0 if not. +*/ +int Fl_Text_Buffer::findchars_backward( int startPos, const char *searchChars, + int *foundPos ) { + int pos, gapLen = mGapEnd - mGapStart; + const char *c; + + if ( startPos == 0 ) { + *foundPos = 0; + return 0; + } + pos = startPos == 0 ? 0 : startPos - 1; + while ( pos >= mGapStart ) { + for ( c = searchChars; *c != '\0'; c++ ) { + if ( mBuf[ pos + gapLen ] == *c ) { + *foundPos = pos; + return 1; + } + } + pos--; + } + while ( pos >= 0 ) { + for ( c = searchChars; *c != '\0'; c++ ) { + if ( mBuf[ pos ] == *c ) { + *foundPos = pos; + return 1; + } + } + pos--; + } + *foundPos = 0; + return 0; +} + +/* +** A horrible design flaw in NEdit (from the very start, before we knew that +** NEdit would become so popular), is that it uses C NULL terminated strings +** to hold text. This means editing text containing NUL characters is not +** possible without special consideration. Here is the special consideration. +** The routines below maintain a special substitution-character which stands +** in for a null, and translates strings an buffers back and forth from/to +** the substituted form, figure out what to substitute, and figure out +** when we're in over our heads and no translation is possible. +*/ + +/* +** The primary routine for integrating new text into a text buffer with +** substitution of another character for ascii nuls. This substitutes null +** characters in the string in preparation for being copied or replaced +** into the buffer, and if neccessary, adjusts the buffer as well, in the +** event that the string contains the character it is currently using for +** substitution. Returns 0, if substitution is no longer possible +** because all non-printable characters are already in use. +*/ +int Fl_Text_Buffer::substitute_null_characters( char *string, int len ) { + char histogram[ 256 ]; + + /* Find out what characters the string contains */ + histogramCharacters( string, len, histogram, 1 ); + + /* Does the string contain the null-substitute character? If so, re- + histogram the buffer text to find a character which is ok in both the + string and the buffer, and change the buffer's null-substitution + character. If none can be found, give up and return 0 */ + if ( histogram[ ( unsigned char ) mNullSubsChar ] != 0 ) { + char * bufString; + char newSubsChar; + bufString = (char*)text(); + histogramCharacters( bufString, mLength, histogram, 0 ); + newSubsChar = chooseNullSubsChar( histogram ); + if ( newSubsChar == '\0' ) + return 0; + subsChars( bufString, mLength, mNullSubsChar, newSubsChar ); + remove_( 0, mLength ); + insert_( 0, bufString ); + free( (void *) bufString ); + mNullSubsChar = newSubsChar; + } + + /* If the string contains null characters, substitute them with the + buffer's null substitution character */ + if ( histogram[ 0 ] != 0 ) + subsChars( string, len, '\0', mNullSubsChar ); + return 1; +} + +/* +** Convert strings obtained from buffers which contain null characters, which +** have been substituted for by a special substitution character, back to +** a null-containing string. There is no time penalty for calling this +** routine if no substitution has been done. +*/ +void Fl_Text_Buffer::unsubstitute_null_characters( char *string ) { + register char * c, subsChar = mNullSubsChar; + + if ( subsChar == '\0' ) + return; + for ( c = string; *c != '\0'; c++ ) + if ( *c == subsChar ) + * c = '\0'; +} + +/* +** Create a pseudo-histogram of the characters in a string (don't actually +** count, because we don't want overflow, just mark the character's presence +** with a 1). If init is true, initialize the histogram before acumulating. +** if not, add the new data to an existing histogram. +*/ +static void histogramCharacters( const char *string, int length, char hist[ 256 ], + int init ) { + int i; + const char *c; + + if ( init ) + for ( i = 0; i < 256; i++ ) + hist[ i ] = 0; + for ( c = string; c < &string[ length ]; c++ ) + hist[ *( ( unsigned char * ) c ) ] |= 1; +} + +/* +** Substitute fromChar with toChar in string. +*/ +static void subsChars( char *string, int length, char fromChar, char toChar ) { + char * c; + + for ( c = string; c < &string[ length ]; c++ ) + if ( *c == fromChar ) * c = toChar; +} + +/* +** Search through ascii control characters in histogram in order of least +** likelihood of use, find an unused character to use as a stand-in for a +** null. If the character set is full (no available characters outside of +** the printable set, return the null character. +*/ +static char chooseNullSubsChar( char hist[ 256 ] ) { +#define N_REPLACEMENTS 25 + static char replacements[ N_REPLACEMENTS ] = {1, 2, 3, 4, 5, 6, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 28, 29, 30, 31, 11, 7}; + int i; + for ( i = 0; i < N_REPLACEMENTS; i++ ) + if ( hist[ replacements[ i ] ] == 0 ) + return replacements[ i ]; + return '\0'; +} + +/* +** Internal (non-redisplaying) version of BufInsert. Returns the length of +** text inserted (this is just strlen(text), however this calculation can be +** expensive and the length will be required by any caller who will continue +** on to call redisplay). pos must be contiguous with the existing text in +** the buffer (i.e. not past the end). +*/ +int Fl_Text_Buffer::insert_( int pos, const char *s ) { + int insertedLength = strlen( s ); + + /* Prepare the buffer to receive the new text. If the new text fits in + the current buffer, just move the gap (if necessary) to where + the text should be inserted. If the new text is too large, reallocate + the buffer with a gap large enough to accomodate the new text and a + gap of PREFERRED_GAP_SIZE */ + if ( insertedLength > mGapEnd - mGapStart ) + reallocate_with_gap( pos, insertedLength + PREFERRED_GAP_SIZE ); + else if ( pos != mGapStart ) + move_gap( pos ); + + /* Insert the new text (pos now corresponds to the start of the gap) */ + memcpy( &mBuf[ pos ], s, insertedLength ); + mGapStart += insertedLength; + mLength += insertedLength; + update_selections( pos, 0, insertedLength ); + + if (mCanUndo) { + if ( undowidget==this && undoat==pos && undoinsert ) { + undoinsert += insertedLength; + } + else { + undoinsert = insertedLength; + undoyankcut = (undoat==pos) ? undocut : 0 ; + } + undoat = pos+insertedLength; + undocut = 0; + undowidget = this; + } + + return insertedLength; +} + +/* +** Internal (non-redisplaying) version of BufRemove. Removes the contents +** of the buffer between start and end (and moves the gap to the site of +** the delete). +*/ +void Fl_Text_Buffer::remove_( int start, int end ) { + /* if the gap is not contiguous to the area to remove, move it there */ + + if (mCanUndo) { + if ( undowidget==this && undoat==end && undocut ) { + undobuffersize( undocut+end-start+1 ); + memmove( undobuffer+end-start, undobuffer, undocut ); + undocut += end-start; + } + else { + undocut = end-start; + undobuffersize(undocut); + } + undoat = start; + undoinsert = 0; + undoyankcut = 0; + undowidget = this; + } + + if ( start > mGapStart ) { + if (mCanUndo) + memcpy( undobuffer, mBuf+(mGapEnd-mGapStart)+start, end-start ); + move_gap( start ); + } + else if ( end < mGapStart ) { + if (mCanUndo) + memcpy( undobuffer, mBuf+start, end-start ); + move_gap( end ); + } + else { + int prelen = mGapStart - start; + if (mCanUndo) { + memcpy( undobuffer, mBuf+start, prelen ); + memcpy( undobuffer+prelen, mBuf+mGapEnd, end-start-prelen); + } + } + + /* expand the gap to encompass the deleted characters */ + mGapEnd += end - mGapStart; + mGapStart -= mGapStart - start; + + /* update the length */ + mLength -= end - start; + + /* fix up any selections which might be affected by the change */ + update_selections( start, end - start, 0 ); +} + +/* +** Insert a column of text without calling the modify callbacks. Note that +** in some pathological cases, inserting can actually decrease the size of +** the buffer because of spaces being coalesced into tabs. "nDeleted" and +** "nInserted" return the number of characters deleted and inserted beginning +** at the start of the line containing "startPos". "endPos" returns buffer +** position of the lower left edge of the inserted column (as a hint for +** routines which need to set a cursor position). +*/ +void Fl_Text_Buffer::insert_column_( int column, int startPos, const char *insText, + int *nDeleted, int *nInserted, int *endPos ) { + int nLines, start, end, insWidth, lineStart, lineEnd; + int expReplLen, expInsLen, len, endOffset; + char *c, *outStr, *outPtr, *expText, *insLine; + const char *line; + const char *replText; + const char *insPtr; + + if ( column < 0 ) + column = 0; + + /* Allocate a buffer for the replacement string large enough to hold + possibly expanded tabs in both the inserted text and the replaced + area, as well as per line: 1) an additional 2*FL_TEXT_MAX_EXP_CHAR_LEN + characters for padding where tabs and control characters cross the + column of the selection, 2) up to "column" additional spaces per + line for padding out to the position of "column", 3) padding up + to the width of the inserted text if that must be padded to align + the text beyond the inserted column. (Space for additional + newlines if the inserted text extends beyond the end of the buffer + is counted with the length of insText) */ + start = line_start( startPos ); + nLines = countLines( insText ) + 1; + insWidth = textWidth( insText, mTabDist, mNullSubsChar ); + end = line_end( skip_lines( start, nLines - 1 ) ); + replText = text_range( start, end ); + expText = expandTabs( replText, 0, mTabDist, mNullSubsChar, + &expReplLen ); + free( (void *) replText ); + free( (void *) expText ); + expText = expandTabs( insText, 0, mTabDist, mNullSubsChar, + &expInsLen ); + free( (void *) expText ); + outStr = (char *)malloc( expReplLen + expInsLen + + nLines * ( column + insWidth + FL_TEXT_MAX_EXP_CHAR_LEN ) + 1 ); + + /* Loop over all lines in the buffer between start and end removing the + text between rectStart and rectEnd and padding appropriately. Trim + trailing space from line (whitespace at the ends of lines otherwise + tends to multiply, since additional padding is added to maintain it */ + outPtr = outStr; + lineStart = start; + insPtr = insText; + for (;;) { + lineEnd = line_end( lineStart ); + line = text_range( lineStart, lineEnd ); + insLine = copyLine( insPtr, &len ); + insPtr += len; + insertColInLine( line, insLine, column, insWidth, mTabDist, + mUseTabs, mNullSubsChar, outPtr, &len, &endOffset ); + free( (void *) line ); + free( (void *) insLine ); + for ( c = outPtr + len - 1; c > outPtr && isspace( *c ); c-- ) + len--; + outPtr += len; + *outPtr++ = '\n'; + lineStart = lineEnd < mLength ? lineEnd + 1 : mLength; + if ( *insPtr == '\0' ) + break; + insPtr++; + } + if ( outPtr != outStr ) + outPtr--; /* trim back off extra newline */ + *outPtr = '\0'; + + /* replace the text between start and end with the new stuff */ + remove_( start, end ); + insert_( start, outStr ); + *nInserted = outPtr - outStr; + *nDeleted = end - start; + *endPos = start + ( outPtr - outStr ) - len + endOffset; + free( (void *) outStr ); +} + +/* +** Delete a rectangle of text without calling the modify callbacks. Returns +** the number of characters replacing those between start and end. Note that +** in some pathological cases, deleting can actually increase the size of +** the buffer because of tab expansions. "endPos" returns the buffer position +** of the point in the last line where the text was removed (as a hint for +** routines which need to position the cursor after a delete operation) +*/ +void Fl_Text_Buffer::remove_rectangular_( int start, int end, int rectStart, + int rectEnd, int *replaceLen, int *endPos ) { + int nLines, lineStart, lineEnd, len, endOffset; + char *outStr, *outPtr, *expText; + const char *s, *line; + + /* allocate a buffer for the replacement string large enough to hold + possibly expanded tabs as well as an additional FL_TEXT_MAX_EXP_CHAR_LEN * 2 + characters per line for padding where tabs and control characters cross + the edges of the selection */ + start = line_start( start ); + end = line_end( end ); + nLines = count_lines( start, end ) + 1; + s = text_range( start, end ); + expText = expandTabs( s, 0, mTabDist, mNullSubsChar, &len ); + free( (void *) s ); + free( (void *) expText ); + outStr = (char *)malloc( len + nLines * FL_TEXT_MAX_EXP_CHAR_LEN * 2 + 1 ); + + /* loop over all lines in the buffer between start and end removing + the text between rectStart and rectEnd and padding appropriately */ + lineStart = start; + outPtr = outStr; + endOffset = 0; + while ( lineStart <= mLength && lineStart <= end ) { + lineEnd = line_end( lineStart ); + line = text_range( lineStart, lineEnd ); + deleteRectFromLine( line, rectStart, rectEnd, mTabDist, + mUseTabs, mNullSubsChar, outPtr, &len, &endOffset ); + free( (void *) line ); + outPtr += len; + *outPtr++ = '\n'; + lineStart = lineEnd + 1; + } + if ( outPtr != outStr ) + outPtr--; /* trim back off extra newline */ + *outPtr = '\0'; + + /* replace the text between start and end with the newly created string */ + remove_( start, end ); + insert_( start, outStr ); + *replaceLen = outPtr - outStr; + *endPos = start + ( outPtr - outStr ) - len + endOffset; + free( (void *) outStr ); +} + +/* +** Overlay a rectangular area of text without calling the modify callbacks. +** "nDeleted" and "nInserted" return the number of characters deleted and +** inserted beginning at the start of the line containing "startPos". +** "endPos" returns buffer position of the lower left edge of the inserted +** column (as a hint for routines which need to set a cursor position). +*/ +void Fl_Text_Buffer::overlay_rectangular_(int startPos, int rectStart, + int rectEnd, const char *insText, + int *nDeleted, int *nInserted, + int *endPos ) { + int nLines, start, end, lineStart, lineEnd; + int expInsLen, len, endOffset; + char *c, *outStr, *outPtr, *expText, *insLine; + const char *line; + const char *insPtr; + + /* Allocate a buffer for the replacement string large enough to hold + possibly expanded tabs in the inserted text, as well as per line: 1) + an additional 2*FL_TEXT_MAX_EXP_CHAR_LEN characters for padding where tabs + and control characters cross the column of the selection, 2) up to + "column" additional spaces per line for padding out to the position + of "column", 3) padding up to the width of the inserted text if that + must be padded to align the text beyond the inserted column. (Space + for additional newlines if the inserted text extends beyond the end + of the buffer is counted with the length of insText) */ + start = line_start( startPos ); + nLines = countLines( insText ) + 1; + end = line_end( skip_lines( start, nLines - 1 ) ); + expText = expandTabs( insText, 0, mTabDist, mNullSubsChar, + &expInsLen ); + free( (void *) expText ); + outStr = (char *)malloc( end - start + expInsLen + + nLines * ( rectEnd + FL_TEXT_MAX_EXP_CHAR_LEN ) + 1 ); + + /* Loop over all lines in the buffer between start and end overlaying the + text between rectStart and rectEnd and padding appropriately. Trim + trailing space from line (whitespace at the ends of lines otherwise + tends to multiply, since additional padding is added to maintain it */ + outPtr = outStr; + lineStart = start; + insPtr = insText; + for (;;) { + lineEnd = line_end( lineStart ); + line = text_range( lineStart, lineEnd ); + insLine = copyLine( insPtr, &len ); + insPtr += len; + overlayRectInLine( line, insLine, rectStart, rectEnd, mTabDist, + mUseTabs, mNullSubsChar, outPtr, &len, &endOffset ); + free( (void *) line ); + free( (void *) insLine ); + for ( c = outPtr + len - 1; c > outPtr && isspace( *c ); c-- ) + len--; + outPtr += len; + *outPtr++ = '\n'; + lineStart = lineEnd < mLength ? lineEnd + 1 : mLength; + if ( *insPtr == '\0' ) + break; + insPtr++; + } + if ( outPtr != outStr ) + outPtr--; /* trim back off extra newline */ + *outPtr = '\0'; + + /* replace the text between start and end with the new stuff */ + remove_( start, end ); + insert_( start, outStr ); + *nInserted = outPtr - outStr; + *nDeleted = end - start; + *endPos = start + ( outPtr - outStr ) - len + endOffset; + free( (void *) outStr ); +} + +/* +** Insert characters from single-line string "insLine" in single-line string +** "line" at "column", leaving "insWidth" space before continuing line. +** "outLen" returns the number of characters written to "outStr", "endOffset" +** returns the number of characters from the beginning of the string to +** the right edge of the inserted text (as a hint for routines which need +** to position the cursor). +*/ +static void insertColInLine( const char *line, char *insLine, int column, int insWidth, + int tabDist, int useTabs, char nullSubsChar, char *outStr, int *outLen, + int *endOffset ) { + char * c, *outPtr, *retabbedStr; + const char *linePtr; + int indent, toIndent, len, postColIndent; + + /* copy the line up to "column" */ + outPtr = outStr; + indent = 0; + for ( linePtr = line; *linePtr != '\0'; linePtr++ ) { + len = Fl_Text_Buffer::character_width( *linePtr, indent, tabDist, nullSubsChar ); + if ( indent + len > column ) + break; + indent += len; + *outPtr++ = *linePtr; + } + + /* If "column" falls in the middle of a character, and the character is a + tab, leave it off and leave the indent short and it will get padded + later. If it's a control character, insert it and adjust indent + accordingly. */ + if ( indent < column && *linePtr != '\0' ) { + postColIndent = indent + len; + if ( *linePtr == '\t' ) + linePtr++; + else { + *outPtr++ = *linePtr++; + indent += len; + } + } else + postColIndent = indent; + + /* If there's no text after the column and no text to insert, that's all */ + if ( *insLine == '\0' && *linePtr == '\0' ) { + *outLen = *endOffset = outPtr - outStr; + return; + } + + /* pad out to column if text is too short */ + if ( indent < column ) { + addPadding( outPtr, indent, column, tabDist, useTabs, nullSubsChar, &len ); + outPtr += len; + indent = column; + } + + /* Copy the text from "insLine" (if any), recalculating the tabs as if + the inserted string began at column 0 to its new column destination */ + if ( *insLine != '\0' ) { + retabbedStr = realignTabs( insLine, 0, indent, tabDist, useTabs, + nullSubsChar, &len ); + for ( c = retabbedStr; *c != '\0'; c++ ) { + *outPtr++ = *c; + len = Fl_Text_Buffer::character_width( *c, indent, tabDist, nullSubsChar ); + indent += len; + } + free( (void *) retabbedStr ); + } + + /* If the original line did not extend past "column", that's all */ + if ( *linePtr == '\0' ) { + *outLen = *endOffset = outPtr - outStr; + return; + } + + /* Pad out to column + width of inserted text + (additional original + offset due to non-breaking character at column) */ + toIndent = column + insWidth + postColIndent - column; + addPadding( outPtr, indent, toIndent, tabDist, useTabs, nullSubsChar, &len ); + outPtr += len; + indent = toIndent; + + /* realign tabs for text beyond "column" and write it out */ + retabbedStr = realignTabs( linePtr, postColIndent, indent, tabDist, + useTabs, nullSubsChar, &len ); + strcpy( outPtr, retabbedStr ); + free( (void *) retabbedStr ); + *endOffset = outPtr - outStr; + *outLen = ( outPtr - outStr ) + len; +} + +/* +** Remove characters in single-line string "line" between displayed positions +** "rectStart" and "rectEnd", and write the result to "outStr", which is +** assumed to be large enough to hold the returned string. Note that in +** certain cases, it is possible for the string to get longer due to +** expansion of tabs. "endOffset" returns the number of characters from +** the beginning of the string to the point where the characters were +** deleted (as a hint for routines which need to position the cursor). +*/ +static void deleteRectFromLine( const char *line, int rectStart, int rectEnd, + int tabDist, int useTabs, char nullSubsChar, char *outStr, int *outLen, + int *endOffset ) { + int indent, preRectIndent, postRectIndent, len; + const char *c; + char *retabbedStr, *outPtr; + + /* copy the line up to rectStart */ + outPtr = outStr; + indent = 0; + for ( c = line; *c != '\0'; c++ ) { + if ( indent > rectStart ) + break; + len = Fl_Text_Buffer::character_width( *c, indent, tabDist, nullSubsChar ); + if ( indent + len > rectStart && ( indent == rectStart || *c == '\t' ) ) + break; + indent += len; + *outPtr++ = *c; + } + preRectIndent = indent; + + /* skip the characters between rectStart and rectEnd */ + for ( ; *c != '\0' && indent < rectEnd; c++ ) + indent += Fl_Text_Buffer::character_width( *c, indent, tabDist, nullSubsChar ); + postRectIndent = indent; + + /* If the line ended before rectEnd, there's nothing more to do */ + if ( *c == '\0' ) { + *outPtr = '\0'; + *outLen = *endOffset = outPtr - outStr; + return; + } + + /* fill in any space left by removed tabs or control characters + which straddled the boundaries */ + indent = max( rectStart + postRectIndent - rectEnd, preRectIndent ); + addPadding( outPtr, preRectIndent, indent, tabDist, useTabs, nullSubsChar, + &len ); + outPtr += len; + + /* Copy the rest of the line. If the indentation has changed, preserve + the position of non-whitespace characters by converting tabs to + spaces, then back to tabs with the correct offset */ + retabbedStr = realignTabs( c, postRectIndent, indent, tabDist, useTabs, + nullSubsChar, &len ); + strcpy( outPtr, retabbedStr ); + free( (void *) retabbedStr ); + *endOffset = outPtr - outStr; + *outLen = ( outPtr - outStr ) + len; +} + +/* +** Overlay characters from single-line string "insLine" on single-line string +** "line" between displayed character offsets "rectStart" and "rectEnd". +** "outLen" returns the number of characters written to "outStr", "endOffset" +** returns the number of characters from the beginning of the string to +** the right edge of the inserted text (as a hint for routines which need +** to position the cursor). +*/ +static void overlayRectInLine( const char *line, char *insLine, int rectStart, + int rectEnd, int tabDist, int useTabs, char nullSubsChar, char *outStr, + int *outLen, int *endOffset ) { + char * c, *outPtr, *retabbedStr; + int inIndent, outIndent, len, postRectIndent; + const char *linePtr; + + /* copy the line up to "rectStart" */ + outPtr = outStr; + inIndent = outIndent = 0; + for ( linePtr = line; *linePtr != '\0'; linePtr++ ) { + len = Fl_Text_Buffer::character_width( *linePtr, inIndent, tabDist, nullSubsChar ); + if ( inIndent + len > rectStart ) + break; + inIndent += len; + outIndent += len; + *outPtr++ = *linePtr; + } + + /* If "rectStart" falls in the middle of a character, and the character + is a tab, leave it off and leave the outIndent short and it will get + padded later. If it's a control character, insert it and adjust + outIndent accordingly. */ + if ( inIndent < rectStart && *linePtr != '\0' ) { + if ( *linePtr == '\t' ) { + linePtr++; + inIndent += len; + } else { + *outPtr++ = *linePtr++; + outIndent += len; + inIndent += len; + } + } + + /* skip the characters between rectStart and rectEnd */ + postRectIndent = rectEnd; + for ( ; *linePtr != '\0'; linePtr++ ) { + inIndent += Fl_Text_Buffer::character_width( *linePtr, inIndent, tabDist, nullSubsChar ); + if ( inIndent >= rectEnd ) { + linePtr++; + postRectIndent = inIndent; + break; + } + } + + /* If there's no text after rectStart and no text to insert, that's all */ + if ( *insLine == '\0' && *linePtr == '\0' ) { + *outLen = *endOffset = outPtr - outStr; + return; + } + + /* pad out to rectStart if text is too short */ + if ( outIndent < rectStart ) { + addPadding( outPtr, outIndent, rectStart, tabDist, useTabs, nullSubsChar, + &len ); + outPtr += len; + } + outIndent = rectStart; + + /* Copy the text from "insLine" (if any), recalculating the tabs as if + the inserted string began at column 0 to its new column destination */ + if ( *insLine != '\0' ) { + retabbedStr = realignTabs( insLine, 0, rectStart, tabDist, useTabs, + nullSubsChar, &len ); + for ( c = retabbedStr; *c != '\0'; c++ ) { + *outPtr++ = *c; + len = Fl_Text_Buffer::character_width( *c, outIndent, tabDist, nullSubsChar ); + outIndent += len; + } + free( (void *) retabbedStr ); + } + + /* If the original line did not extend past "rectStart", that's all */ + if ( *linePtr == '\0' ) { + *outLen = *endOffset = outPtr - outStr; + return; + } + + /* Pad out to rectEnd + (additional original offset + due to non-breaking character at right boundary) */ + addPadding( outPtr, outIndent, postRectIndent, tabDist, useTabs, + nullSubsChar, &len ); + outPtr += len; + outIndent = postRectIndent; + + /* copy the text beyond "rectEnd" */ + strcpy( outPtr, linePtr ); + *endOffset = outPtr - outStr; + *outLen = ( outPtr - outStr ) + strlen( linePtr ); +} + +void Fl_Text_Selection::set( int startpos, int endpos ) { + mSelected = startpos != endpos; + mRectangular = 0; + mStart = min( startpos, endpos ); + mEnd = max( startpos, endpos ); +} + +void Fl_Text_Selection::set_rectangular( int startpos, int endpos, + int rectStart, int rectEnd ) { + mSelected = rectStart < rectEnd; + mRectangular = 1; + mStart = startpos; + mEnd = endpos; + mRectStart = rectStart; + mRectEnd = rectEnd; +} + +int Fl_Text_Selection::position( int *startpos, int *endpos ) { + if ( !mSelected ) + return 0; + *startpos = mStart; + *endpos = mEnd; + + return 1; +} + +int Fl_Text_Selection::position( int *startpos, int *endpos, + int *isRect, int *rectStart, int *rectEnd ) { + if ( !mSelected ) + return 0; + *isRect = mRectangular; + *startpos = mStart; + *endpos = mEnd; + if ( mRectangular ) { + *rectStart = mRectStart; + *rectEnd = mRectEnd; + } + return 1; +} + +/* +** Return true if position "pos" with indentation "dispIndex" is in +** the Fl_Text_Selection. +*/ +int Fl_Text_Selection::includes(int pos, int lineStartPos, int dispIndex) { + return selected() && + ( (!rectangular() && pos >= start() && pos < end()) || + (rectangular() && pos >= start() && lineStartPos <= end() && + dispIndex >= rect_start() && dispIndex < rect_end()) + ); +} + + + +char * Fl_Text_Buffer::selection_text_( Fl_Text_Selection *sel ) { + int start, end, isRect, rectStart, rectEnd; + char *s; + + /* If there's no selection, return an allocated empty string */ + if ( !sel->position( &start, &end, &isRect, &rectStart, &rectEnd ) ) { + s = (char *)malloc( 1 ); + *s = '\0'; + return s; + } + + /* If the selection is not rectangular, return the selected range */ + if ( isRect ) + return text_in_rectangle( start, end, rectStart, rectEnd ); + else + return text_range( start, end ); +} + +void Fl_Text_Buffer::remove_selection_( Fl_Text_Selection *sel ) { + int start, end; + int isRect, rectStart, rectEnd; + + if ( !sel->position( &start, &end, &isRect, &rectStart, &rectEnd ) ) + return; + if ( isRect ) + remove_rectangular( start, end, rectStart, rectEnd ); + else { + remove( start, end ); + //undoyankcut = undocut; + } +} + +void Fl_Text_Buffer::replace_selection_( Fl_Text_Selection *sel, const char *s ) { + int start, end, isRect, rectStart, rectEnd; + Fl_Text_Selection oldSelection = *sel; + + /* If there's no selection, return */ + if ( !sel->position( &start, &end, &isRect, &rectStart, &rectEnd ) ) + return; + + /* Do the appropriate type of replace */ + if ( isRect ) + replace_rectangular( start, end, rectStart, rectEnd, s ); + else + replace( start, end, s ); + + /* Unselect (happens automatically in BufReplace, but BufReplaceRect + can't detect when the contents of a selection goes away) */ + sel->mSelected = 0; + redisplay_selection( &oldSelection, sel ); +} + +static void addPadding( char *string, int startIndent, int toIndent, + int tabDist, int useTabs, char nullSubsChar, int *charsAdded ) { + char * outPtr; + int len, indent; + + indent = startIndent; + outPtr = string; + if ( useTabs ) { + while ( indent < toIndent ) { + len = Fl_Text_Buffer::character_width( '\t', indent, tabDist, nullSubsChar ); + if ( len > 1 && indent + len <= toIndent ) { + *outPtr++ = '\t'; + indent += len; + } else { + *outPtr++ = ' '; + indent++; + } + } + } else { + while ( indent < toIndent ) { + *outPtr++ = ' '; + indent++; + } + } + *charsAdded = outPtr - string; +} + +/* +** Call the stored modify callback procedure(s) for this buffer to update the +** changed area(s) on the screen and any other listeners. +*/ +void Fl_Text_Buffer::call_modify_callbacks( int pos, int nDeleted, + int nInserted, int nRestyled, const char *deletedText ) { + int i; + + for ( i = 0; i < mNModifyProcs; i++ ) + ( *mNodifyProcs[ i ] ) ( pos, nInserted, nDeleted, nRestyled, + deletedText, mCbArgs[ i ] ); +} + +/* +** Call the stored pre-delete callback procedure(s) for this buffer to update +** the changed area(s) on the screen and any other listeners. +*/ +void Fl_Text_Buffer::call_predelete_callbacks(int pos, int nDeleted) { + int i; + + for (i=0; imStart; + newStart = newSelection->mStart; + oldEnd = oldSelection->mEnd; + newEnd = newSelection->mEnd; + if ( oldSelection->mRectangular ) + oldEnd++; + if ( newSelection->mRectangular ) + newEnd++; + + /* If the old or new selection is unselected, just redisplay the + single area that is (was) selected and return */ + if ( !oldSelection->mSelected && !newSelection->mSelected ) + return; + if ( !oldSelection->mSelected ) { + call_modify_callbacks( newStart, 0, 0, newEnd - newStart, NULL ); + return; + } + if ( !newSelection->mSelected ) { + call_modify_callbacks( oldStart, 0, 0, oldEnd - oldStart, NULL ); + return; + } + + /* If the selection changed from normal to rectangular or visa versa, or + if a rectangular selection changed boundaries, redisplay everything */ + if ( ( oldSelection->mRectangular && !newSelection->mRectangular ) || + ( !oldSelection->mRectangular && newSelection->mRectangular ) || + ( oldSelection->mRectangular && ( + ( oldSelection->mRectStart != newSelection->mRectStart ) || + ( oldSelection->mRectEnd != newSelection->mRectEnd ) ) ) ) { + call_modify_callbacks( min( oldStart, newStart ), 0, 0, + max( oldEnd, newEnd ) - min( oldStart, newStart ), NULL ); + return; + } + + /* If the selections are non-contiguous, do two separate updates + and return */ + if ( oldEnd < newStart || newEnd < oldStart ) { + call_modify_callbacks( oldStart, 0, 0, oldEnd - oldStart, NULL ); + call_modify_callbacks( newStart, 0, 0, newEnd - newStart, NULL ); + return; + } + + /* Otherwise, separate into 3 separate regions: ch1, and ch2 (the two + changed areas), and the unchanged area of their intersection, + and update only the changed area(s) */ + ch1Start = min( oldStart, newStart ); + ch2End = max( oldEnd, newEnd ); + ch1End = max( oldStart, newStart ); + ch2Start = min( oldEnd, newEnd ); + if ( ch1Start != ch1End ) + call_modify_callbacks( ch1Start, 0, 0, ch1End - ch1Start, NULL ); + if ( ch2Start != ch2End ) + call_modify_callbacks( ch2Start, 0, 0, ch2End - ch2Start, NULL ); +} + +void Fl_Text_Buffer::move_gap( int pos ) { + int gapLen = mGapEnd - mGapStart; + + if ( pos > mGapStart ) + memmove( &mBuf[ mGapStart ], &mBuf[ mGapEnd ], + pos - mGapStart ); + else + memmove( &mBuf[ pos + gapLen ], &mBuf[ pos ], mGapStart - pos ); + mGapEnd += pos - mGapStart; + mGapStart += pos - mGapStart; +} + +/* +** reallocate the text storage in "buf" to have a gap starting at "newGapStart" +** and a gap size of "newGapLen", preserving the buffer's current contents. +*/ +void Fl_Text_Buffer::reallocate_with_gap( int newGapStart, int newGapLen ) { + char * newBuf; + int newGapEnd; + + newBuf = (char *)malloc( mLength + newGapLen ); + newGapEnd = newGapStart + newGapLen; + if ( newGapStart <= mGapStart ) { + memcpy( newBuf, mBuf, newGapStart ); + memcpy( &newBuf[ newGapEnd ], &mBuf[ newGapStart ], + mGapStart - newGapStart ); + memcpy( &newBuf[ newGapEnd + mGapStart - newGapStart ], + &mBuf[ mGapEnd ], mLength - mGapStart ); + } else { /* newGapStart > mGapStart */ + memcpy( newBuf, mBuf, mGapStart ); + memcpy( &newBuf[ mGapStart ], &mBuf[ mGapEnd ], + newGapStart - mGapStart ); + memcpy( &newBuf[ newGapEnd ], + &mBuf[ mGapEnd + newGapStart - mGapStart ], + mLength - newGapStart ); + } + free( (void *) mBuf ); + mBuf = newBuf; + mGapStart = newGapStart; + mGapEnd = newGapEnd; +#ifdef PURIFY +{int i; for ( i = mGapStart; i < mGapEnd; i++ ) mBuf[ i ] = '.'; } +#endif +} + +/* +** Update all of the selections in "buf" for changes in the buffer's text +*/ +void Fl_Text_Buffer::update_selections( int pos, int nDeleted, + int nInserted ) { + mPrimary.update( pos, nDeleted, nInserted ); + mSecondary.update( pos, nDeleted, nInserted ); + mHighlight.update( pos, nDeleted, nInserted ); +} + +/* +** Update an individual selection for changes in the corresponding text +*/ +void Fl_Text_Selection::update( int pos, int nDeleted, + int nInserted ) { + if ( !mSelected || pos > mEnd ) + return; + if ( pos + nDeleted <= mStart ) { + mStart += nInserted - nDeleted; + mEnd += nInserted - nDeleted; + } else if ( pos <= mStart && pos + nDeleted >= mEnd ) { + mStart = pos; + mEnd = pos; + mSelected = 0; + } else if ( pos <= mStart && pos + nDeleted < mEnd ) { + mStart = pos; + mEnd = nInserted + mEnd - nDeleted; + } else if ( pos < mEnd ) { + mEnd += nInserted - nDeleted; + if ( mEnd <= mStart ) + mSelected = 0; + } +} + +/* +** Search forwards in buffer "buf" for character "searchChar", starting +** with the character "startPos", and returning the result in "foundPos" +** returns 1 if found, 0 if not. (The difference between this and +** BufSearchForward is that it's optimized for single characters. The +** overall performance of the text widget is dependent on its ability to +** count lines quickly, hence searching for a single character: newline) +*/ +int Fl_Text_Buffer::findchar_forward( int startPos, char searchChar, + int *foundPos ) { + int pos, gapLen = mGapEnd - mGapStart; + + if (startPos < 0 || startPos >= mLength) { + *foundPos = mLength; + return 0; + } + + pos = startPos; + while ( pos < mGapStart ) { + if ( mBuf[ pos ] == searchChar ) { + *foundPos = pos; + return 1; + } + pos++; + } + while ( pos < mLength ) { + if ( mBuf[ pos + gapLen ] == searchChar ) { + *foundPos = pos; + return 1; + } + pos++; + } + *foundPos = mLength; + return 0; +} + +/* +** Search backwards in buffer "buf" for character "searchChar", starting +** with the character BEFORE "startPos", returning the result in "foundPos" +** returns 1 if found, 0 if not. (The difference between this and +** BufSearchBackward is that it's optimized for single characters. The +** overall performance of the text widget is dependent on its ability to +** count lines quickly, hence searching for a single character: newline) +*/ +int Fl_Text_Buffer::findchar_backward( int startPos, char searchChar, + int *foundPos ) { + int pos, gapLen = mGapEnd - mGapStart; + + if ( startPos <= 0 || startPos > mLength ) { + *foundPos = 0; + return 0; + } + pos = startPos - 1; + while ( pos >= mGapStart ) { + if ( mBuf[ pos + gapLen ] == searchChar ) { + *foundPos = pos; + return 1; + } + pos--; + } + while ( pos >= 0 ) { + if ( mBuf[ pos ] == searchChar ) { + *foundPos = pos; + return 1; + } + pos--; + } + *foundPos = 0; + return 0; +} + +/* +** Copy from "text" to end up to but not including newline (or end of "text") +** and return the copy as the function value, and the length of the line in +** "lineLen" +*/ +static char *copyLine( const char *text, int *lineLen ) { + int len = 0; + const char *c; + char *outStr; + + for ( c = text; *c != '\0' && *c != '\n'; c++ ) + len++; + outStr = (char *)malloc( len + 1 ); + strlcpy( outStr, text, len + 1); + *lineLen = len; + return outStr; +} + +/* +** Count the number of newlines in a null-terminated text string; +*/ +static int countLines( const char *string ) { + const char * c; + int lineCount = 0; + + for ( c = string; *c != '\0'; c++ ) + if ( *c == '\n' ) lineCount++; + return lineCount; +} + +/* +** Measure the width in displayed characters of string "text" +*/ +static int textWidth( const char *text, int tabDist, char nullSubsChar ) { + int width = 0, maxWidth = 0; + const char *c; + + for ( c = text; *c != '\0'; c++ ) { + if ( *c == '\n' ) { + if ( width > maxWidth ) + maxWidth = width; + width = 0; + } else + width += Fl_Text_Buffer::character_width( *c, width, tabDist, nullSubsChar ); + } + if ( width > maxWidth ) + return width; + return maxWidth; +} + +/* +** Find the first and last character position in a line within a rectangular +** selection (for copying). Includes tabs which cross rectStart, but not +** control characters which do so. Leaves off tabs which cross rectEnd. +** +** Technically, the calling routine should convert tab characters which +** cross the right boundary of the selection to spaces which line up with +** the edge of the selection. Unfortunately, the additional memory +** management required in the parent routine to allow for the changes +** in string size is not worth all the extra work just for a couple of +** shifted characters, so if a tab protrudes, just lop it off and hope +** that there are other characters in the selection to establish the right +** margin for subsequent columnar pastes of this data. +*/ +void Fl_Text_Buffer::rectangular_selection_boundaries( int lineStartPos, + int rectStart, int rectEnd, int *selStart, int *selEnd ) { + int pos, width, indent = 0; + char c; + + /* find the start of the selection */ + for ( pos = lineStartPos; pos < mLength; pos++ ) { + c = character( pos ); + if ( c == '\n' ) + break; + width = Fl_Text_Buffer::character_width( c, indent, mTabDist, mNullSubsChar ); + if ( indent + width > rectStart ) { + if ( indent != rectStart && c != '\t' ) { + pos++; + indent += width; + } + break; + } + indent += width; + } + *selStart = pos; + + /* find the end */ + for ( ; pos < mLength; pos++ ) { + c = character( pos ); + if ( c == '\n' ) + break; + width = Fl_Text_Buffer::character_width( c, indent, mTabDist, mNullSubsChar ); + indent += width; + if ( indent > rectEnd ) { + if ( indent - width != rectEnd && c != '\t' ) + pos++; + break; + } + } + *selEnd = pos; +} + +/* +** Adjust the space and tab characters from string "text" so that non-white +** characters remain stationary when the text is shifted from starting at +** "origIndent" to starting at "newIndent". Returns an allocated string +** which must be freed by the caller with XtFree. +*/ +static char *realignTabs( const char *text, int origIndent, int newIndent, + int tabDist, int useTabs, char nullSubsChar, int *newLength ) { + char * expStr, *outStr; + int len; + + /* If the tabs settings are the same, retain original tabs */ + if ( origIndent % tabDist == newIndent % tabDist ) { + len = strlen( text ); + outStr = (char *)malloc( len + 1 ); + strcpy( outStr, text ); + *newLength = len; + return outStr; + } + + /* If the tab settings are not the same, brutally convert tabs to + spaces, then back to tabs in the new position */ + expStr = expandTabs( text, origIndent, tabDist, nullSubsChar, &len ); + if ( !useTabs ) { + *newLength = len; + return expStr; + } + outStr = unexpandTabs( expStr, newIndent, tabDist, nullSubsChar, newLength ); + free( (void *) expStr ); + return outStr; +} + +/* +** Expand tabs to spaces for a block of text. The additional parameter +** "startIndent" if nonzero, indicates that the text is a rectangular selection +** beginning at column "startIndent" +*/ +static char *expandTabs( const char *text, int startIndent, int tabDist, + char nullSubsChar, int *newLen ) { + char * outStr, *outPtr; + const char *c; + int indent, len, outLen = 0; + + /* rehearse the expansion to figure out length for output string */ + indent = startIndent; + for ( c = text; *c != '\0'; c++ ) { + if ( *c == '\t' ) { + len = Fl_Text_Buffer::character_width( *c, indent, tabDist, nullSubsChar ); + outLen += len; + indent += len; + } else if ( *c == '\n' ) { + indent = startIndent; + outLen++; + } else { + indent += Fl_Text_Buffer::character_width( *c, indent, tabDist, nullSubsChar ); + outLen++; + } + } + + /* do the expansion */ + outStr = (char *)malloc( outLen + 1 ); + outPtr = outStr; + indent = startIndent; + for ( c = text; *c != '\0'; c++ ) { + if ( *c == '\t' ) { + len = Fl_Text_Buffer::expand_character( *c, indent, outPtr, tabDist, nullSubsChar ); + outPtr += len; + indent += len; + } else if ( *c == '\n' ) { + indent = startIndent; + *outPtr++ = *c; + } else { + indent += Fl_Text_Buffer::character_width( *c, indent, tabDist, nullSubsChar ); + *outPtr++ = *c; + } + } + outStr[ outLen ] = '\0'; + *newLen = outLen; + return outStr; +} + +/* +** Convert sequences of spaces into tabs. The threshold for conversion is +** when 3 or more spaces can be converted into a single tab, this avoids +** converting double spaces after a period withing a block of text. +*/ +static char *unexpandTabs( char *text, int startIndent, int tabDist, + char nullSubsChar, int *newLen ) { + char * outStr, *outPtr, *c, expandedChar[ FL_TEXT_MAX_EXP_CHAR_LEN ]; + int indent, len; + + outStr = (char *)malloc( strlen( text ) + 1 ); + outPtr = outStr; + indent = startIndent; + for ( c = text; *c != '\0'; ) { + if ( *c == ' ' ) { + len = Fl_Text_Buffer::expand_character( '\t', indent, expandedChar, tabDist, + nullSubsChar ); + if ( len >= 3 && !strncmp( c, expandedChar, len ) ) { + c += len; + *outPtr++ = '\t'; + indent += len; + } else { + *outPtr++ = *c++; + indent++; + } + } else if ( *c == '\n' ) { + indent = startIndent; + *outPtr++ = *c++; + } else { + *outPtr++ = *c++; + indent++; + } + } + *outPtr = '\0'; + *newLen = outPtr - outStr; + return outStr; +} + +static int max( int i1, int i2 ) { + return i1 >= i2 ? i1 : i2; +} + +static int min( int i1, int i2 ) { + return i1 <= i2 ? i1 : i2; +} + +int +Fl_Text_Buffer::insertfile(const char *file, int pos, int buflen) { + FILE *fp; int r; + if (!(fp = fopen(file, "r"))) return 1; + char *buffer = new char[buflen]; + for (; (r = fread(buffer, 1, buflen - 1, fp)) > 0; pos += r) { + buffer[r] = (char)0; + insert(pos, buffer); + } + + int e = ferror(fp) ? 2 : 0; + fclose(fp); + delete[] buffer; + return e; +} + +int +Fl_Text_Buffer::outputfile(const char *file, int start, int end, int buflen) { + FILE *fp; + if (!(fp = fopen(file, "w"))) return 1; + for (int n; (n = min(end - start, buflen)); start += n) { + const char *p = text_range(start, start + n); + int r = fwrite(p, 1, n, fp); + free((void *)p); + if (r != n) break; + } + + int e = ferror(fp) ? 2 : 0; + fclose(fp); + return e; +} + + +// +// End of "$Id: Fl_Text_Buffer.cxx 6011 2008-01-04 20:32:37Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Text_Display.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Text_Display.cxx new file mode 100644 index 0000000..4f0f1c1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Text_Display.cxx @@ -0,0 +1,3272 @@ +// +// "$Id: Fl_Text_Display.cxx 6105 2008-04-21 21:03:22Z matt $" +// +// Copyright 2001-2006 by Bill Spitzak and others. +// Original code Copyright Mark Edel. Permission to distribute under +// the LGPL for the FLTK library granted by Mark Edel. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include "flstring.h" +#include +#include +#include +#include +#include +#include + +#undef min +#undef max + +// Text area margins. Left & right margins should be at least 3 so that +// there is some room for the overhanging parts of the cursor! +#define TOP_MARGIN 1 +#define BOTTOM_MARGIN 1 +#define LEFT_MARGIN 3 +#define RIGHT_MARGIN 3 + +#define NO_HINT -1 + +/* Masks for text drawing methods. These are or'd together to form an + integer which describes what drawing calls to use to draw a string */ +#define FILL_MASK 0x0100 +#define SECONDARY_MASK 0x0200 +#define PRIMARY_MASK 0x0400 +#define HIGHLIGHT_MASK 0x0800 +#define BG_ONLY_MASK 0x1000 +#define TEXT_ONLY_MASK 0x2000 +#define STYLE_LOOKUP_MASK 0xff + +/* Maximum displayable line length (how many characters will fit across the + widest window). This amount of memory is temporarily allocated from the + stack in the draw_vline() method for drawing strings */ +#define MAX_DISP_LINE_LEN 1000 + +static int max( int i1, int i2 ); +static int min( int i1, int i2 ); +static int countlines( const char *string ); + +/* The variables below are used in a timer event to allow smooth + scrolling of the text area when the pointer has left the area. */ +static int scroll_direction = 0; +static int scroll_amount = 0; +static int scroll_y = 0; +static int scroll_x = 0; + +// CET - FIXME +#define TMPFONTWIDTH 6 + +Fl_Text_Display::Fl_Text_Display(int X, int Y, int W, int H, const char* l) + : Fl_Group(X, Y, W, H, l) { + int i; + + mMaxsize = 0; + damage_range1_start = damage_range1_end = -1; + damage_range2_start = damage_range2_end = -1; + dragPos = dragType = dragging = 0; + display_insert_position_hint = 0; + + color(FL_BACKGROUND2_COLOR, FL_SELECTION_COLOR); + box(FL_DOWN_FRAME); + textsize((uchar)FL_NORMAL_SIZE); + textcolor(FL_FOREGROUND_COLOR); + textfont(FL_HELVETICA); + + text_area.x = 0; + text_area.y = 0; + text_area.w = 0; + text_area.h = 0; + + mVScrollBar = new Fl_Scrollbar(0,0,1,1); + mVScrollBar->callback((Fl_Callback*)v_scrollbar_cb, this); + mHScrollBar = new Fl_Scrollbar(0,0,1,1); + mHScrollBar->callback((Fl_Callback*)h_scrollbar_cb, this); + mHScrollBar->type(FL_HORIZONTAL); + + end(); + + scrollbar_width(Fl::scrollbar_size()); + scrollbar_align(FL_ALIGN_BOTTOM_RIGHT); + + mCursorOn = 0; + mCursorPos = 0; + mCursorOldY = -100; + mCursorToHint = NO_HINT; + mCursorStyle = NORMAL_CURSOR; + mCursorPreferredCol = -1; + mBuffer = 0; + mFirstChar = 0; + mLastChar = 0; + mNBufferLines = 0; + mTopLineNum = mTopLineNumHint = 1; + mAbsTopLineNum = 1; + mNeedAbsTopLineNum = 0; + mHorizOffset = mHorizOffsetHint = 0; + + mCursor_color = FL_FOREGROUND_COLOR; + + mFixedFontWidth = -1; + mStyleBuffer = 0; + mStyleTable = 0; + mNStyles = 0; + mNVisibleLines = 1; + mLineStarts = new int[mNVisibleLines]; + mLineStarts[0] = 0; + for (i=1; iremove_modify_callback(buffer_modified_cb, this); + mBuffer->remove_predelete_callback(buffer_predelete_cb, this); + } + if (mLineStarts) delete[] mLineStarts; +} + +/* +** Attach a text buffer to display, replacing the current buffer (if any) +*/ +void Fl_Text_Display::buffer( Fl_Text_Buffer *buf ) { + /* If the text display is already displaying a buffer, clear it off + of the display and remove our callback from it */ + if ( buf == mBuffer) return; + if ( mBuffer != 0 ) { + buffer_modified_cb( 0, 0, mBuffer->length(), 0, 0, this ); + mNBufferLines = 0; + mBuffer->remove_modify_callback( buffer_modified_cb, this ); + mBuffer->remove_predelete_callback( buffer_predelete_cb, this ); + } + + /* Add the buffer to the display, and attach a callback to the buffer for + receiving modification information when the buffer contents change */ + mBuffer = buf; + if (mBuffer) { + mBuffer->add_modify_callback( buffer_modified_cb, this ); + mBuffer->add_predelete_callback( buffer_predelete_cb, this ); + + /* Update the display */ + buffer_modified_cb( 0, buf->length(), 0, 0, 0, this ); + } + + /* Resize the widget to update the screen... */ + resize(x(), y(), w(), h()); +} + +/* +** Attach (or remove) highlight information in text display and redisplay. +** Highlighting information consists of a style buffer which parallels the +** normal text buffer, but codes font and color information for the display; +** a style table which translates style buffer codes (indexed by buffer +** character - 'A') into fonts and colors; and a callback mechanism for +** as-needed highlighting, triggered by a style buffer entry of +** "unfinishedStyle". Style buffer can trigger additional redisplay during +** a normal buffer modification if the buffer contains a primary Fl_Text_Selection +** (see extendRangeForStyleMods for more information on this protocol). +** +** Style buffers, tables and their associated memory are managed by the caller. +*/ +void +Fl_Text_Display::highlight_data(Fl_Text_Buffer *styleBuffer, + const Style_Table_Entry *styleTable, + int nStyles, char unfinishedStyle, + Unfinished_Style_Cb unfinishedHighlightCB, + void *cbArg ) { + mStyleBuffer = styleBuffer; + mStyleTable = styleTable; + mNStyles = nStyles; + mUnfinishedStyle = unfinishedStyle; + mUnfinishedHighlightCB = unfinishedHighlightCB; + mHighlightCBArg = cbArg; + + mStyleBuffer->canUndo(0); +#if 0 + // FIXME: this is in nedit code -- is it needed? + /* Call TextDSetFont to combine font information from style table and + primary font, adjust font-related parameters, and then redisplay */ + TextDSetFont(textD, textD->fontStruct); +#endif + damage(FL_DAMAGE_EXPOSE); +} + +#if 0 + // FIXME: this is in nedit code -- is it needed? +/* +** Change the (non highlight) font +*/ +void TextDSetFont(textDisp *textD, XFontStruct *fontStruct) { + Display *display = XtDisplay(textD->w); + int i, maxAscent = fontStruct->ascent, maxDescent = fontStruct->descent; + int width, height, fontWidth; + Pixel bgPixel, fgPixel, selectFGPixel, selectBGPixel; + Pixel highlightFGPixel, highlightBGPixel; + XGCValues values; + XFontStruct *styleFont; + + /* If font size changes, cursor will be redrawn in a new position */ + blankCursorProtrusions(textD); + + /* If there is a (syntax highlighting) style table in use, find the new + maximum font height for this text display */ + for (i=0; inStyles; i++) { + styleFont = textD->styleTable[i].font; + if (styleFont != NULL && styleFont->ascent > maxAscent) + maxAscent = styleFont->ascent; + if (styleFont != NULL && styleFont->descent > maxDescent) + maxDescent = styleFont->descent; + } + textD->ascent = maxAscent; + textD->descent = maxDescent; + + /* If all of the current fonts are fixed and match in width, compute */ + fontWidth = fontStruct->max_bounds.width; + if (fontWidth != fontStruct->min_bounds.width) + fontWidth = -1; + else { + for (i=0; inStyles; i++) { + styleFont = textD->styleTable[i].font; + if (styleFont != NULL && (styleFont->max_bounds.width != fontWidth || + styleFont->max_bounds.width != styleFont->min_bounds.width)) + fontWidth = -1; + } + } + textD->fixedFontWidth = fontWidth; + + /* Don't let the height dip below one line, or bad things can happen */ + if (textD->height < maxAscent + maxDescent) + textD->height = maxAscent + maxDescent; + + /* Change the font. In most cases, this means re-allocating the + affected GCs (they are shared with other widgets, and if the primary + font changes, must be re-allocated to change it). Unfortunately, + this requres recovering all of the colors from the existing GCs */ + textD->fontStruct = fontStruct; + XGetGCValues(display, textD->gc, GCForeground|GCBackground, &values); + fgPixel = values.foreground; + bgPixel = values.background; + XGetGCValues(display, textD->selectGC, GCForeground|GCBackground, &values); + selectFGPixel = values.foreground; + selectBGPixel = values.background; + XGetGCValues(display, textD->highlightGC,GCForeground|GCBackground,&values); + highlightFGPixel = values.foreground; + highlightBGPixel = values.background; + releaseGC(textD->w, textD->gc); + releaseGC(textD->w, textD->selectGC); + releaseGC(textD->w, textD->highlightGC); + releaseGC(textD->w, textD->selectBGGC); + releaseGC(textD->w, textD->highlightBGGC); + if (textD->lineNumGC != NULL) + releaseGC(textD->w, textD->lineNumGC); + textD->lineNumGC = NULL; + allocateFixedFontGCs(textD, fontStruct, bgPixel, fgPixel, selectFGPixel, + selectBGPixel, highlightFGPixel, highlightBGPixel); + XSetFont(display, textD->styleGC, fontStruct->fid); + + /* Do a full resize to force recalculation of font related parameters */ + width = textD->width; + height = textD->height; + textD->width = textD->height = 0; + TextDResize(textD, width, height); + + /* Redisplay */ + TextDRedisplayRect(textD, textD->left, textD->top, textD->width, + textD->height); + + /* Clean up line number area in case spacing has changed */ + draw_line_numbers(textD, True); +} + +int TextDMinFontWidth(textDisp *textD, Boolean considerStyles) { + int fontWidth = textD->fontStruct->max_bounds.width; + int i; + + if (considerStyles) { + for (i = 0; i < textD->nStyles; ++i) { + int thisWidth = (textD->styleTable[i].font)->min_bounds.width; + if (thisWidth < fontWidth) { + fontWidth = thisWidth; + } + } + } + return(fontWidth); +} + +int TextDMaxFontWidth(textDisp *textD, Boolean considerStyles) { + int fontWidth = textD->fontStruct->max_bounds.width; + int i; + + if (considerStyles) { + for (i = 0; i < textD->nStyles; ++i) { + int thisWidth = (textD->styleTable[i].font)->max_bounds.width; + if (thisWidth > fontWidth) { + fontWidth = thisWidth; + } + } + } + return(fontWidth); +} +#endif + +int Fl_Text_Display::longest_vline() { + int longest = 0; + for (int i = 0; i < mNVisibleLines; i++) + longest = max(longest, measure_vline(i)); + return longest; +} + +/* +** Change the size of the displayed text area +*/ +void Fl_Text_Display::resize(int X, int Y, int W, int H) { +#ifdef DEBUG + printf("Fl_Text_Display::resize(X=%d, Y=%d, W=%d, H=%d)\n", X, Y, W, H); +#endif // DEBUG + const int oldWidth = w(); +#ifdef DEBUG + printf(" oldWidth=%d, mContinuousWrap=%d, mWrapMargin=%d\n", oldWidth, + mContinuousWrap, mWrapMargin); +#endif // DEBUG + Fl_Widget::resize(X,Y,W,H); + if (!buffer()) return; + X += Fl::box_dx(box()); + Y += Fl::box_dy(box()); + W -= Fl::box_dw(box()); + H -= Fl::box_dh(box()); + + text_area.x = X+LEFT_MARGIN; + text_area.y = Y+BOTTOM_MARGIN; + text_area.w = W-LEFT_MARGIN-RIGHT_MARGIN; + text_area.h = H-TOP_MARGIN-BOTTOM_MARGIN; + int i; + + /* Find the new maximum font height for this text display */ + for (i = 0, mMaxsize = fl_height(textfont(), textsize()); i < mNStyles; i++) + mMaxsize = max(mMaxsize, fl_height(mStyleTable[i].font, mStyleTable[i].size)); + + // did we have scrollbars initially? + int hscrollbarvisible = mHScrollBar->visible(); + int vscrollbarvisible = mVScrollBar->visible(); + + // try without scrollbars first + mVScrollBar->clear_visible(); + mHScrollBar->clear_visible(); + + for (int again = 1; again;) { + again = 0; + /* In continuous wrap mode, a change in width affects the total number of + lines in the buffer, and can leave the top line number incorrect, and + the top character no longer pointing at a valid line start */ + if (mContinuousWrap && !mWrapMargin && W!=oldWidth) { + int oldFirstChar = mFirstChar; + mNBufferLines = count_lines(0, buffer()->length(), true); + mFirstChar = line_start(mFirstChar); + mTopLineNum = count_lines(0, mFirstChar, true)+1; + absolute_top_line_number(oldFirstChar); + +#ifdef DEBUG + printf(" mNBufferLines=%d\n", mNBufferLines); +#endif // DEBUG + } + + /* reallocate and update the line starts array, which may have changed + size and / or contents. */ + int nvlines = (text_area.h + mMaxsize - 1) / mMaxsize; + if (nvlines < 1) nvlines = 1; + if (mNVisibleLines != nvlines) { + mNVisibleLines = nvlines; + if (mLineStarts) delete[] mLineStarts; + mLineStarts = new int [mNVisibleLines]; + } + + calc_line_starts(0, mNVisibleLines); + calc_last_char(); + + // figure the scrollbars + if (scrollbar_width()) { + /* Decide if the vertical scroll bar needs to be visible */ + if (scrollbar_align() & (FL_ALIGN_LEFT|FL_ALIGN_RIGHT) && + mNBufferLines >= mNVisibleLines - 1) + { + mVScrollBar->set_visible(); + if (scrollbar_align() & FL_ALIGN_LEFT) { + text_area.x = X+scrollbar_width()+LEFT_MARGIN; + text_area.w = W-scrollbar_width()-LEFT_MARGIN-RIGHT_MARGIN; + mVScrollBar->resize(X, text_area.y-TOP_MARGIN, scrollbar_width(), + text_area.h+TOP_MARGIN+BOTTOM_MARGIN); + } else { + text_area.x = X+LEFT_MARGIN; + text_area.w = W-scrollbar_width()-LEFT_MARGIN-RIGHT_MARGIN; + mVScrollBar->resize(X+W-scrollbar_width(), text_area.y-TOP_MARGIN, + scrollbar_width(), text_area.h+TOP_MARGIN+BOTTOM_MARGIN); + } + } + + /* + Decide if the horizontal scroll bar needs to be visible. If there + is a vertical scrollbar, a horizontal is always created too. This + is because the alternatives are unatractive: + * Dynamically creating a horizontal scrollbar based on the currently + visible lines is what the original nedit does, but it always wastes + space for the scrollbar even when it's not used. Since the FLTK + widget dynamically allocates the space for the scrollbar and + rearranges the widget to make room for it, this would create a very + visually displeasing "bounce" effect when the vertical scrollbar is + dragged. Trust me, I tried it and it looks really bad. + * The other alternative would be to keep track of what the longest + line in the entire buffer is and base the scrollbar on that. I + didn't do this because I didn't see any easy way to do that using + the nedit code and this could involve a lengthy calculation for + large buffers. If an efficient and non-costly way of doing this + can be found, this might be a way to go. + */ + /* WAS: Suggestion: Try turning the horizontal scrollbar on when + you first see a line that is too wide in the window, but then + don't turn it off (ie mix both of your solutions). */ + if (scrollbar_align() & (FL_ALIGN_TOP|FL_ALIGN_BOTTOM) && + (mVScrollBar->visible() || longest_vline() > text_area.w)) + { + if (!mHScrollBar->visible()) { + mHScrollBar->set_visible(); + again = 1; // loop again to see if we now need vert. & recalc sizes + } + if (scrollbar_align() & FL_ALIGN_TOP) { + text_area.y = Y + scrollbar_width()+TOP_MARGIN; + text_area.h = H - scrollbar_width()-TOP_MARGIN-BOTTOM_MARGIN; + mHScrollBar->resize(text_area.x-LEFT_MARGIN, Y, + text_area.w+LEFT_MARGIN+RIGHT_MARGIN, scrollbar_width()); + } else { + text_area.y = Y+TOP_MARGIN; + text_area.h = H - scrollbar_width()-TOP_MARGIN-BOTTOM_MARGIN; + mHScrollBar->resize(text_area.x-LEFT_MARGIN, Y+H-scrollbar_width(), + text_area.w+LEFT_MARGIN+RIGHT_MARGIN, scrollbar_width()); + } + } + } + } + + // user request to change viewport + if (mTopLineNumHint != mTopLineNum || mHorizOffsetHint != mHorizOffset) + scroll_(mTopLineNumHint, mHorizOffsetHint); + + // everything will fit in the viewport + if (mNBufferLines < mNVisibleLines || mBuffer == NULL || mBuffer->length() == 0) + scroll_(1, mHorizOffset); + /* if empty lines become visible, there may be an opportunity to + display more text by scrolling down */ + else while (mLineStarts[mNVisibleLines-2] == -1) + scroll_(mTopLineNum-1, mHorizOffset); + + // user request to display insert position + if (display_insert_position_hint) + display_insert(); + + // in case horizontal offset is now greater than longest line + int maxhoffset = max(0, longest_vline()-text_area.w); + if (mHorizOffset > maxhoffset) + scroll_(mTopLineNumHint, maxhoffset); + + mTopLineNumHint = mTopLineNum; + mHorizOffsetHint = mHorizOffset; + display_insert_position_hint = 0; + + if (mContinuousWrap || + hscrollbarvisible != mHScrollBar->visible() || + vscrollbarvisible != mVScrollBar->visible()) + redraw(); + + update_v_scrollbar(); + update_h_scrollbar(); +} + +/* +** Refresh a rectangle of the text display. left and top are in coordinates of +** the text drawing window +*/ +void Fl_Text_Display::draw_text( int left, int top, int width, int height ) { + int fontHeight, firstLine, lastLine, line; + + /* find the line number range of the display */ + fontHeight = mMaxsize ? mMaxsize : textsize_; + firstLine = ( top - text_area.y - fontHeight + 1 ) / fontHeight; + lastLine = ( top + height - text_area.y ) / fontHeight + 1; + + fl_push_clip( left, top, width, height ); + + /* draw the lines */ + for ( line = firstLine; line <= lastLine; line++ ) + draw_vline( line, left, left + width, 0, INT_MAX ); + + /* draw the line numbers if exposed area includes them */ + if (mLineNumWidth != 0 && left <= mLineNumLeft + mLineNumWidth) + draw_line_numbers(false); + + fl_pop_clip(); +} + +void Fl_Text_Display::redisplay_range(int startpos, int endpos) { + if (damage_range1_start == -1 && damage_range1_end == -1) { + damage_range1_start = startpos; + damage_range1_end = endpos; + } else if ((startpos >= damage_range1_start && startpos <= damage_range1_end) || + (endpos >= damage_range1_start && endpos <= damage_range1_end)) { + damage_range1_start = min(damage_range1_start, startpos); + damage_range1_end = max(damage_range1_end, endpos); + } else if (damage_range2_start == -1 && damage_range2_end == -1) { + damage_range2_start = startpos; + damage_range2_end = endpos; + } else { + damage_range2_start = min(damage_range2_start, startpos); + damage_range2_end = max(damage_range2_end, endpos); + } + damage(FL_DAMAGE_SCROLL); +} +/* +** Refresh all of the text between buffer positions "start" and "end" +** not including the character at the position "end". +** If end points beyond the end of the buffer, refresh the whole display +** after pos, including blank lines which are not technically part of +** any range of characters. +*/ +void Fl_Text_Display::draw_range(int startpos, int endpos) { + int i, startLine, lastLine, startIndex, endIndex; + + /* If the range is outside of the displayed text, just return */ + if ( endpos < mFirstChar || ( startpos > mLastChar && + !empty_vlines() ) ) return; + + /* Clean up the starting and ending values */ + if ( startpos < 0 ) startpos = 0; + if ( startpos > mBuffer->length() ) startpos = mBuffer->length(); + if ( endpos < 0 ) endpos = 0; + if ( endpos > mBuffer->length() ) endpos = mBuffer->length(); + + /* Get the starting and ending lines */ + if ( startpos < mFirstChar ) + startpos = mFirstChar; + if ( !position_to_line( startpos, &startLine ) ) + startLine = mNVisibleLines - 1; + if ( endpos >= mLastChar ) { + lastLine = mNVisibleLines - 1; + } else { + if ( !position_to_line( endpos, &lastLine ) ) { + /* shouldn't happen */ + lastLine = mNVisibleLines - 1; + } + } + + /* Get the starting and ending positions within the lines */ + startIndex = mLineStarts[ startLine ] == -1 ? 0 : + startpos - mLineStarts[ startLine ]; + if ( endpos >= mLastChar ) + endIndex = INT_MAX; + else if ( mLineStarts[ lastLine ] == -1 ) + endIndex = 0; + else + endIndex = endpos - mLineStarts[ lastLine ]; + + /* If the starting and ending lines are the same, redisplay the single + line between "start" and "end" */ + if ( startLine == lastLine ) { + draw_vline( startLine, 0, INT_MAX, startIndex, endIndex ); + return; + } + + /* Redisplay the first line from "start" */ + draw_vline( startLine, 0, INT_MAX, startIndex, INT_MAX ); + + /* Redisplay the lines in between at their full width */ + for ( i = startLine + 1; i < lastLine; i++ ) + draw_vline( i, 0, INT_MAX, 0, INT_MAX ); + + /* Redisplay the last line to "end" */ + draw_vline( lastLine, 0, INT_MAX, 0, endIndex ); +} + +/* +** Set the position of the text insertion cursor for text display +*/ +void Fl_Text_Display::insert_position( int newPos ) { + /* make sure new position is ok, do nothing if it hasn't changed */ + if ( newPos == mCursorPos ) + return; + if ( newPos < 0 ) newPos = 0; + if ( newPos > mBuffer->length() ) newPos = mBuffer->length(); + + /* cursor movement cancels vertical cursor motion column */ + mCursorPreferredCol = -1; + + /* erase the cursor at it's previous position */ + redisplay_range(mCursorPos - 1, mCursorPos + 1); + + mCursorPos = newPos; + + /* draw cursor at its new position */ + redisplay_range(mCursorPos - 1, mCursorPos + 1); +} + +void Fl_Text_Display::show_cursor(int b) { + mCursorOn = b; + redisplay_range(mCursorPos - 1, mCursorPos + 1); +} + +void Fl_Text_Display::cursor_style(int style) { + mCursorStyle = style; + if (mCursorOn) show_cursor(); +} + +void Fl_Text_Display::wrap_mode(int wrap, int wrapMargin) { + mWrapMargin = wrapMargin; + mContinuousWrap = wrap; + + if (buffer()) { + /* wrapping can change the total number of lines, re-count */ + mNBufferLines = count_lines(0, buffer()->length(), true); + + /* changing wrap margins or changing from wrapped mode to non-wrapped + can leave the character at the top no longer at a line start, and/or + change the line number */ + mFirstChar = line_start(mFirstChar); + mTopLineNum = count_lines(0, mFirstChar, true) + 1; + + reset_absolute_top_line_number(); + + /* update the line starts array */ + calc_line_starts(0, mNVisibleLines); + calc_last_char(); + } else { + // No buffer, so just clear the state info for later... + mNBufferLines = 0; + mFirstChar = 0; + mTopLineNum = 1; + mAbsTopLineNum = 0; + } + + resize(x(), y(), w(), h()); +} + +/* +** Insert "text" at the current cursor location. This has the same +** effect as inserting the text into the buffer using BufInsert and +** then moving the insert position after the newly inserted text, except +** that it's optimized to do less redrawing. +*/ +void Fl_Text_Display::insert(const char* text) { + int pos = mCursorPos; + + mCursorToHint = pos + strlen( text ); + mBuffer->insert( pos, text ); + mCursorToHint = NO_HINT; +} + +/* +** Insert "text" (which must not contain newlines), overstriking the current +** cursor location. +*/ +void Fl_Text_Display::overstrike(const char* text) { + int startPos = mCursorPos; + Fl_Text_Buffer *buf = mBuffer; + int lineStart = buf->line_start( startPos ); + int textLen = strlen( text ); + int i, p, endPos, indent, startIndent, endIndent; + const char *c; + char ch, *paddedText = NULL; + + /* determine how many displayed character positions are covered */ + startIndent = mBuffer->count_displayed_characters( lineStart, startPos ); + indent = startIndent; + for ( c = text; *c != '\0'; c++ ) + indent += Fl_Text_Buffer::character_width( *c, indent, buf->tab_distance(), buf->null_substitution_character() ); + endIndent = indent; + + /* find which characters to remove, and if necessary generate additional + padding to make up for removed control characters at the end */ + indent = startIndent; + for ( p = startPos; ; p++ ) { + if ( p == buf->length() ) + break; + ch = buf->character( p ); + if ( ch == '\n' ) + break; + indent += Fl_Text_Buffer::character_width( ch, indent, buf->tab_distance(), buf->null_substitution_character() ); + if ( indent == endIndent ) { + p++; + break; + } else if ( indent > endIndent ) { + if ( ch != '\t' ) { + p++; + paddedText = new char [ textLen + FL_TEXT_MAX_EXP_CHAR_LEN + 1 ]; + strcpy( paddedText, text ); + for ( i = 0; i < indent - endIndent; i++ ) + paddedText[ textLen + i ] = ' '; + paddedText[ textLen + i ] = '\0'; + } + break; + } + } + endPos = p; + + mCursorToHint = startPos + textLen; + buf->replace( startPos, endPos, paddedText == NULL ? text : paddedText ); + mCursorToHint = NO_HINT; + if ( paddedText != NULL ) + delete [] paddedText; +} + +/* +** Translate a buffer text position to the XY location where the top left +** of the cursor would be positioned to point to that character. Returns +** 0 if the position is not displayed because it is VERTICALLY out +** of view. If the position is horizontally out of view, returns the +** X coordinate where the position would be if it were visible. +*/ + +int Fl_Text_Display::position_to_xy( int pos, int* X, int* Y ) { + int charIndex, lineStartPos, fontHeight, lineLen; + int visLineNum, charLen, outIndex, xStep, charStyle; + char expandedChar[ FL_TEXT_MAX_EXP_CHAR_LEN ]; + const char *lineStr; + +// printf("position_to_xy(pos=%d, X=%p, Y=%p)\n", pos, X, Y); + + /* If position is not displayed, return false */ + if (pos < mFirstChar || (pos > mLastChar && !empty_vlines())) { +// printf(" returning 0\n" +// " mFirstChar=%d, mLastChar=%d, empty_vlines()=0\n", +// mFirstChar, mLastChar); + return 0; + } + + /* Calculate Y coordinate */ + if (!position_to_line(pos, &visLineNum)) { +// puts(" returning 0\n" +// " position_to_line()=0"); + return 0; + } + + if (visLineNum < 0 || visLineNum > mNBufferLines) { +// printf(" returning 0\n" +// " visLineNum=%d, mNBufferLines=%d\n", +// visLineNum, mNBufferLines); + return 0; + } + + fontHeight = mMaxsize; + *Y = text_area.y + visLineNum * fontHeight; + + /* Get the text, length, and buffer position of the line. If the position + is beyond the end of the buffer and should be at the first position on + the first empty line, don't try to get or scan the text */ + lineStartPos = mLineStarts[visLineNum]; + if ( lineStartPos == -1 ) { + *X = text_area.x - mHorizOffset; + return 1; + } + lineLen = vline_length( visLineNum ); + lineStr = mBuffer->text_range( lineStartPos, lineStartPos + lineLen ); + + /* Step through character positions from the beginning of the line + to "pos" to calculate the X coordinate */ + xStep = text_area.x - mHorizOffset; + outIndex = 0; + for ( charIndex = 0; charIndex < lineLen && charIndex < pos - lineStartPos; charIndex++ ) { + charLen = Fl_Text_Buffer::expand_character( lineStr[ charIndex ], outIndex, expandedChar, + mBuffer->tab_distance(), mBuffer->null_substitution_character() ); + charStyle = position_style( lineStartPos, lineLen, charIndex, + outIndex ); + xStep += string_width( expandedChar, charLen, charStyle ); + outIndex += charLen; + } + *X = xStep; + free((char *)lineStr); + return 1; +} + +/* +** Find the line number of position "pos". Note: this only works for +** displayed lines. If the line is not displayed, the function returns +** 0 (without the mLineStarts array it could turn in to very long +** calculation involving scanning large amounts of text in the buffer). +** If continuous wrap mode is on, returns the absolute line number (as opposed +** to the wrapped line number which is used for scrolling). +*/ +int Fl_Text_Display::position_to_linecol( int pos, int* lineNum, int* column ) { + int retVal; + + /* In continuous wrap mode, the absolute (non-wrapped) line count is + maintained separately, as needed. Only return it if we're actually + keeping track of it and pos is in the displayed text */ + if (mContinuousWrap) { + if (!maintaining_absolute_top_line_number() || + pos < mFirstChar || pos > mLastChar) + return 0; + *lineNum = mAbsTopLineNum + buffer()->count_lines(mFirstChar, pos); + *column + = buffer()->count_displayed_characters(buffer()->line_start(pos), pos); + return 1; + } + + retVal = position_to_line( pos, lineNum ); + if ( retVal ) { + *column = mBuffer->count_displayed_characters( + mLineStarts[ *lineNum ], pos ); + *lineNum += mTopLineNum; + } + return retVal; +} + +/* +** Return 1 if position (X, Y) is inside of the primary Fl_Text_Selection +*/ +int Fl_Text_Display::in_selection( int X, int Y ) { + int row, column, pos = xy_to_position( X, Y, CHARACTER_POS ); + Fl_Text_Buffer *buf = mBuffer; + + xy_to_rowcol( X, Y, &row, &column, CHARACTER_POS ); + if (range_touches_selection(buf->primary_selection(), mFirstChar, mLastChar)) + column = wrapped_column(row, column); + return buf->primary_selection()->includes(pos, buf->line_start( pos ), column); +} + +/* +** Correct a column number based on an unconstrained position (as returned by +** TextDXYToUnconstrainedPosition) to be relative to the last actual newline +** in the buffer before the row and column position given, rather than the +** last line start created by line wrapping. This is an adapter +** for rectangular selections and code written before continuous wrap mode, +** which thinks that the unconstrained column is the number of characters +** from the last newline. Obviously this is time consuming, because it +** invloves character re-counting. +*/ +int Fl_Text_Display::wrapped_column(int row, int column) { + int lineStart, dispLineStart; + + if (!mContinuousWrap || row < 0 || row > mNVisibleLines) + return column; + dispLineStart = mLineStarts[row]; + if (dispLineStart == -1) + return column; + lineStart = buffer()->line_start(dispLineStart); + return column + + buffer()->count_displayed_characters(lineStart, dispLineStart); +} + +/* +** Correct a row number from an unconstrained position (as returned by +** TextDXYToUnconstrainedPosition) to a straight number of newlines from the +** top line of the display. Because rectangular selections are based on +** newlines, rather than display wrapping, and anywhere a rectangular selection +** needs a row, it needs it in terms of un-wrapped lines. +*/ +int Fl_Text_Display::wrapped_row(int row) { + if (!mContinuousWrap || row < 0 || row > mNVisibleLines) + return row; + return buffer()->count_lines(mFirstChar, mLineStarts[row]); +} + +/* +** Scroll the display to bring insertion cursor into view. +** +** Note: it would be nice to be able to do this without counting lines twice +** (scroll_() counts them too) and/or to count from the most efficient +** starting point, but the efficiency of this routine is not as important to +** the overall performance of the text display. +*/ +void Fl_Text_Display::display_insert() { + int hOffset, topLine, X, Y; + hOffset = mHorizOffset; + topLine = mTopLineNum; + +// FIXME: I don't understand this well enough to know if it is correct +// it is different than nedit 5.3 + if (insert_position() < mFirstChar) { + topLine -= count_lines(insert_position(), mFirstChar, false); + } else if (mLineStarts[mNVisibleLines-2] != -1) { + int lastChar = line_end(mLineStarts[mNVisibleLines-2],true); + if (insert_position() >= lastChar) + topLine + += count_lines(lastChar - (wrap_uses_character(mLastChar) ? 0 : 1), + insert_position(), false); + } + + /* Find the new setting for horizontal offset (this is a bit ungraceful). + If the line is visible, just use PositionToXY to get the position + to scroll to, otherwise, do the vertical scrolling first, then the + horizontal */ + if (!position_to_xy( mCursorPos, &X, &Y )) { + scroll_(topLine, hOffset); + if (!position_to_xy( mCursorPos, &X, &Y )) { + #ifdef DEBUG + printf ("*** display_insert/position_to_xy # GIVE UP !\n"); fflush(stdout); + #endif // DEBUG + return; /* Give up, it's not worth it (but why does it fail?) */ + } + } + if (X > text_area.x + text_area.w) + hOffset += X-(text_area.x + text_area.w); + else if (X < text_area.x) + hOffset += X-text_area.x; + + /* Do the scroll */ + if (topLine != mTopLineNum || hOffset != mHorizOffset) + scroll_(topLine, hOffset); +} + +void Fl_Text_Display::show_insert_position() { + display_insert_position_hint = 1; + resize(x(), y(), w(), h()); +} + +/* +** Cursor movement functions +*/ +int Fl_Text_Display::move_right() { + if ( mCursorPos >= mBuffer->length() ) + return 0; + insert_position( mCursorPos + 1 ); + return 1; +} + +int Fl_Text_Display::move_left() { + if ( mCursorPos <= 0 ) + return 0; + insert_position( mCursorPos - 1 ); + return 1; +} + +int Fl_Text_Display::move_up() { + int lineStartPos, column, prevLineStartPos, newPos, visLineNum; + + /* Find the position of the start of the line. Use the line starts array + if possible */ + if ( position_to_line( mCursorPos, &visLineNum ) ) + lineStartPos = mLineStarts[ visLineNum ]; + else { + lineStartPos = line_start( mCursorPos ); + visLineNum = -1; + } + if ( lineStartPos == 0 ) + return 0; + + /* Decide what column to move to, if there's a preferred column use that */ + column = mCursorPreferredCol >= 0 ? mCursorPreferredCol : + mBuffer->count_displayed_characters( lineStartPos, mCursorPos ); + + /* count forward from the start of the previous line to reach the column */ + if ( visLineNum != -1 && visLineNum != 0 ) + prevLineStartPos = mLineStarts[ visLineNum - 1 ]; + else + prevLineStartPos = rewind_lines( lineStartPos, 1 ); + newPos = mBuffer->skip_displayed_characters( prevLineStartPos, column ); + if (mContinuousWrap) + newPos = min(newPos, line_end(prevLineStartPos, true)); + + /* move the cursor */ + insert_position( newPos ); + + /* if a preferred column wasn't aleady established, establish it */ + mCursorPreferredCol = column; + return 1; +} + +int Fl_Text_Display::move_down() { + int lineStartPos, column, nextLineStartPos, newPos, visLineNum; + + if ( mCursorPos == mBuffer->length() ) + return 0; + if ( position_to_line( mCursorPos, &visLineNum ) ) + lineStartPos = mLineStarts[ visLineNum ]; + else { + lineStartPos = line_start( mCursorPos ); + visLineNum = -1; + } + column = mCursorPreferredCol >= 0 ? mCursorPreferredCol : + mBuffer->count_displayed_characters( lineStartPos, mCursorPos ); + nextLineStartPos = skip_lines( lineStartPos, 1, true ); + newPos = mBuffer->skip_displayed_characters( nextLineStartPos, column ); + if (mContinuousWrap) + newPos = min(newPos, line_end(nextLineStartPos, true)); + + insert_position( newPos ); + mCursorPreferredCol = column; + return 1; +} + +/* +** Same as BufCountLines, but takes in to account wrapping if wrapping is +** turned on. If the caller knows that startPos is at a line start, it +** can pass "startPosIsLineStart" as True to make the call more efficient +** by avoiding the additional step of scanning back to the last newline. +*/ +int Fl_Text_Display::count_lines(int startPos, int endPos, + bool startPosIsLineStart) { + int retLines, retPos, retLineStart, retLineEnd; + +#ifdef DEBUG + printf("Fl_Text_Display::count_lines(startPos=%d, endPos=%d, startPosIsLineStart=%d\n", + startPos, endPos, startPosIsLineStart); +#endif // DEBUG + + /* If we're not wrapping use simple (and more efficient) BufCountLines */ + if (!mContinuousWrap) + return buffer()->count_lines(startPos, endPos); + + wrapped_line_counter(buffer(), startPos, endPos, INT_MAX, + startPosIsLineStart, 0, &retPos, &retLines, &retLineStart, + &retLineEnd); + +#ifdef DEBUG + printf(" # after WLC: retPos=%d, retLines=%d, retLineStart=%d, retLineEnd=%d\n", + retPos, retLines, retLineStart, retLineEnd); +#endif // DEBUG + + return retLines; +} + +/* +** Same as BufCountForwardNLines, but takes in to account line breaks when +** wrapping is turned on. If the caller knows that startPos is at a line start, +** it can pass "startPosIsLineStart" as True to make the call more efficient +** by avoiding the additional step of scanning back to the last newline. +*/ +int Fl_Text_Display::skip_lines(int startPos, int nLines, + bool startPosIsLineStart) { + int retLines, retPos, retLineStart, retLineEnd; + + /* if we're not wrapping use more efficient BufCountForwardNLines */ + if (!mContinuousWrap) + return buffer()->skip_lines(startPos, nLines); + + /* wrappedLineCounter can't handle the 0 lines case */ + if (nLines == 0) + return startPos; + + /* use the common line counting routine to count forward */ + wrapped_line_counter(buffer(), startPos, buffer()->length(), + nLines, startPosIsLineStart, 0, &retPos, &retLines, &retLineStart, + &retLineEnd); + return retPos; +} + +/* +** Same as BufEndOfLine, but takes in to account line breaks when wrapping +** is turned on. If the caller knows that startPos is at a line start, it +** can pass "startPosIsLineStart" as True to make the call more efficient +** by avoiding the additional step of scanning back to the last newline. +** +** Note that the definition of the end of a line is less clear when continuous +** wrap is on. With continuous wrap off, it's just a pointer to the newline +** that ends the line. When it's on, it's the character beyond the last +** DISPLAYABLE character on the line, where a whitespace character which has +** been "converted" to a newline for wrapping is not considered displayable. +** Also note that, a line can be wrapped at a non-whitespace character if the +** line had no whitespace. In this case, this routine returns a pointer to +** the start of the next line. This is also consistent with the model used by +** visLineLength. +*/ +int Fl_Text_Display::line_end(int pos, bool startPosIsLineStart) { + int retLines, retPos, retLineStart, retLineEnd; + + /* If we're not wrapping use more efficien BufEndOfLine */ + if (!mContinuousWrap) + return buffer()->line_end(pos); + + if (pos == buffer()->length()) + return pos; + wrapped_line_counter(buffer(), pos, buffer()->length(), 1, + startPosIsLineStart, 0, &retPos, &retLines, &retLineStart, + &retLineEnd); + return retLineEnd; +} + +/* +** Same as BufStartOfLine, but returns the character after last wrap point +** rather than the last newline. +*/ +int Fl_Text_Display::line_start(int pos) { + int retLines, retPos, retLineStart, retLineEnd; + + /* If we're not wrapping, use the more efficient BufStartOfLine */ + if (!mContinuousWrap) + return buffer()->line_start(pos); + + wrapped_line_counter(buffer(), buffer()->line_start(pos), pos, INT_MAX, true, 0, + &retPos, &retLines, &retLineStart, &retLineEnd); + return retLineStart; +} + +/* +** Same as BufCountBackwardNLines, but takes in to account line breaks when +** wrapping is turned on. +*/ +int Fl_Text_Display::rewind_lines(int startPos, int nLines) { + Fl_Text_Buffer *buf = buffer(); + int pos, lineStart, retLines, retPos, retLineStart, retLineEnd; + + /* If we're not wrapping, use the more efficient BufCountBackwardNLines */ + if (!mContinuousWrap) + return buf->rewind_lines(startPos, nLines); + + pos = startPos; + for (;;) { + lineStart = buf->line_start(pos); + wrapped_line_counter(buf, lineStart, pos, INT_MAX, + true, 0, &retPos, &retLines, &retLineStart, &retLineEnd, false); + if (retLines > nLines) + return skip_lines(lineStart, retLines-nLines, + true); + nLines -= retLines; + pos = lineStart - 1; + if (pos < 0) + return 0; + nLines -= 1; + } +} + +static inline int fl_isseparator(int c) { + return c != '$' && c != '_' && (isspace(c) || ispunct(c)); +} + +void Fl_Text_Display::next_word() { + int pos = insert_position(); + while (pos < buffer()->length() && !fl_isseparator(buffer()->character(pos))) { + pos++; + } + while (pos < buffer()->length() && fl_isseparator(buffer()->character(pos))) { + pos++; + } + + insert_position( pos ); +} + +void Fl_Text_Display::previous_word() { + int pos = insert_position(); + if (pos==0) return; + pos--; + while (pos && fl_isseparator(buffer()->character(pos))) { + pos--; + } + while (pos && !fl_isseparator(buffer()->character(pos))) { + pos--; + } + if (fl_isseparator(buffer()->character(pos))) pos++; + + insert_position( pos ); +} + +/* +** Callback attached to the text buffer to receive delete information before +** the modifications are actually made. +*/ +void Fl_Text_Display::buffer_predelete_cb(int pos, int nDeleted, void *cbArg) { + Fl_Text_Display *textD = (Fl_Text_Display *)cbArg; + if (textD->mContinuousWrap && + (textD->mFixedFontWidth == -1 || textD->mModifyingTabDistance)) + /* Note: we must perform this measurement, even if there is not a + single character deleted; the number of "deleted" lines is the + number of visual lines spanned by the real line in which the + modification takes place. + Also, a modification of the tab distance requires the same + kind of calculations in advance, even if the font width is "fixed", + because when the width of the tab characters changes, the layout + of the text may be completely different. */ + textD->measure_deleted_lines(pos, nDeleted); + else + textD->mSuppressResync = 0; /* Probably not needed, but just in case */ +} + +/* +** Callback attached to the text buffer to receive modification information +*/ +void Fl_Text_Display::buffer_modified_cb( int pos, int nInserted, int nDeleted, + int nRestyled, const char *deletedText, void *cbArg ) { + int linesInserted, linesDeleted, startDispPos, endDispPos; + Fl_Text_Display *textD = ( Fl_Text_Display * ) cbArg; + Fl_Text_Buffer *buf = textD->mBuffer; + int oldFirstChar = textD->mFirstChar; + int scrolled, origCursorPos = textD->mCursorPos; + int wrapModStart, wrapModEnd; + + /* buffer modification cancels vertical cursor motion column */ + if ( nInserted != 0 || nDeleted != 0 ) + textD->mCursorPreferredCol = -1; + + /* Count the number of lines inserted and deleted, and in the case + of continuous wrap mode, how much has changed */ + if (textD->mContinuousWrap) { + textD->find_wrap_range(deletedText, pos, nInserted, nDeleted, + &wrapModStart, &wrapModEnd, &linesInserted, &linesDeleted); + } else { + linesInserted = nInserted == 0 ? 0 : + buf->count_lines( pos, pos + nInserted ); + linesDeleted = nDeleted == 0 ? 0 : countlines( deletedText ); + } + + /* Update the line starts and mTopLineNum */ + if ( nInserted != 0 || nDeleted != 0 ) { + if (textD->mContinuousWrap) { + textD->update_line_starts( wrapModStart, wrapModEnd-wrapModStart, + nDeleted + pos-wrapModStart + (wrapModEnd-(pos+nInserted)), + linesInserted, linesDeleted, &scrolled ); + } else { + textD->update_line_starts( pos, nInserted, nDeleted, linesInserted, + linesDeleted, &scrolled ); + } + } else + scrolled = 0; + + /* If we're counting non-wrapped lines as well, maintain the absolute + (non-wrapped) line number of the text displayed */ + if (textD->maintaining_absolute_top_line_number() && + (nInserted != 0 || nDeleted != 0)) { + if (pos + nDeleted < oldFirstChar) + textD->mAbsTopLineNum += buf->count_lines(pos, pos + nInserted) - + countlines(deletedText); + else if (pos < oldFirstChar) + textD->reset_absolute_top_line_number(); + } + + /* Update the line count for the whole buffer */ + textD->mNBufferLines += linesInserted - linesDeleted; + + /* Update the cursor position */ + if ( textD->mCursorToHint != NO_HINT ) { + textD->mCursorPos = textD->mCursorToHint; + textD->mCursorToHint = NO_HINT; + } else if ( textD->mCursorPos > pos ) { + if ( textD->mCursorPos < pos + nDeleted ) + textD->mCursorPos = pos; + else + textD->mCursorPos += nInserted - nDeleted; + } + + // refigure scrollbars & stuff + textD->resize(textD->x(), textD->y(), textD->w(), textD->h()); + + // don't need to do anything else if not visible? + if (!textD->visible_r()) return; + + /* If the changes caused scrolling, re-paint everything and we're done. */ + if ( scrolled ) { + textD->damage(FL_DAMAGE_EXPOSE); + if ( textD->mStyleBuffer ) /* See comments in extendRangeForStyleMods */ + textD->mStyleBuffer->primary_selection()->selected(0); + return; + } + + /* If the changes didn't cause scrolling, decide the range of characters + that need to be re-painted. Also if the cursor position moved, be + sure that the redisplay range covers the old cursor position so the + old cursor gets erased, and erase the bits of the cursor which extend + beyond the left and right edges of the text. */ + startDispPos = textD->mContinuousWrap ? wrapModStart : pos; + if ( origCursorPos == startDispPos && textD->mCursorPos != startDispPos ) + startDispPos = min( startDispPos, origCursorPos - 1 ); + if ( linesInserted == linesDeleted ) { + if ( nInserted == 0 && nDeleted == 0 ) + endDispPos = pos + nRestyled; + else { + endDispPos = textD->mContinuousWrap ? wrapModEnd : + buf->line_end( pos + nInserted ) + 1; + // CET - FIXME if ( origCursorPos >= startDispPos && + // ( origCursorPos <= endDispPos || endDispPos == buf->length() ) ) + } + + if (linesInserted > 1) textD->draw_line_numbers(false); + } else { + endDispPos = textD->mLastChar + 1; + // CET - FIXME if ( origCursorPos >= pos ) + /* If more than one line is inserted/deleted, a line break may have + been inserted or removed in between, and the line numbers may + have changed. If only one line is altered, line numbers cannot + be affected (the insertion or removal of a line break always + results in at least two lines being redrawn). */ + textD->draw_line_numbers(false); + } + + /* If there is a style buffer, check if the modification caused additional + changes that need to be redisplayed. (Redisplaying separately would + cause double-redraw on almost every modification involving styled + text). Extend the redraw range to incorporate style changes */ + if ( textD->mStyleBuffer ) + textD->extend_range_for_styles( &startDispPos, &endDispPos ); + + /* Redisplay computed range */ + textD->redisplay_range( startDispPos, endDispPos ); +} + +/* +** In continuous wrap mode, internal line numbers are calculated after +** wrapping. A separate non-wrapped line count is maintained when line +** numbering is turned on. There is some performance cost to maintaining this +** line count, so normally absolute line numbers are not tracked if line +** numbering is off. This routine allows callers to specify that they still +** want this line count maintained (for use via TextDPosToLineAndCol). +** More specifically, this allows the line number reported in the statistics +** line to be calibrated in absolute lines, rather than post-wrapped lines. +*/ +void Fl_Text_Display::maintain_absolute_top_line_number(int state) { + mNeedAbsTopLineNum = state; + reset_absolute_top_line_number(); +} + +/* +** Returns the absolute (non-wrapped) line number of the first line displayed. +** Returns 0 if the absolute top line number is not being maintained. +*/ +int Fl_Text_Display::get_absolute_top_line_number() { + if (!mContinuousWrap) + return mTopLineNum; + if (maintaining_absolute_top_line_number()) + return mAbsTopLineNum; + return 0; +} + +/* +** Re-calculate absolute top line number for a change in scroll position. +*/ +void Fl_Text_Display::absolute_top_line_number(int oldFirstChar) { + if (maintaining_absolute_top_line_number()) { + if (mFirstChar < oldFirstChar) + mAbsTopLineNum -= buffer()->count_lines(mFirstChar, oldFirstChar); + else + mAbsTopLineNum += buffer()->count_lines(oldFirstChar, mFirstChar); + } +} + +/* +** Return true if a separate absolute top line number is being maintained +** (for displaying line numbers or showing in the statistics line). +*/ +int Fl_Text_Display::maintaining_absolute_top_line_number() { + return mContinuousWrap && + (mLineNumWidth != 0 || mNeedAbsTopLineNum); +} + +/* +** Count lines from the beginning of the buffer to reestablish the +** absolute (non-wrapped) top line number. If mode is not continuous wrap, +** or the number is not being maintained, does nothing. +*/ +void Fl_Text_Display::reset_absolute_top_line_number() { + mAbsTopLineNum = 1; + absolute_top_line_number(0); +} + +/* +** Find the line number of position "pos" relative to the first line of +** displayed text. Returns 0 if the line is not displayed. +*/ +int Fl_Text_Display::position_to_line( int pos, int *lineNum ) { + int i; + + *lineNum = 0; + if ( pos < mFirstChar ) return 0; + if ( pos > mLastChar ) { + if ( empty_vlines() ) { + if ( mLastChar < mBuffer->length() ) { + if ( !position_to_line( mLastChar, lineNum ) ) { + Fl::error("Fl_Text_Display::position_to_line(): Consistency check ptvl failed"); + return 0; + } + return ++( *lineNum ) <= mNVisibleLines - 1; + } else { + position_to_line( mLastChar - 1, lineNum ); + return 1; + } + } + return 0; + } + + for ( i = mNVisibleLines - 1; i >= 0; i-- ) { + if ( mLineStarts[ i ] != -1 && pos >= mLineStarts[ i ] ) { + *lineNum = i; + return 1; + } + } + return 0; /* probably never be reached */ +} + +/* +** Draw the text on a single line represented by "visLineNum" (the +** number of lines down from the top of the display), limited by +** "leftClip" and "rightClip" window coordinates and "leftCharIndex" and +** "rightCharIndex" character positions (not including the character at +** position "rightCharIndex"). +*/ +void Fl_Text_Display::draw_vline(int visLineNum, int leftClip, int rightClip, + int leftCharIndex, int rightCharIndex) { + Fl_Text_Buffer * buf = mBuffer; + int i, X, Y, startX, charIndex, lineStartPos, lineLen, fontHeight; + int stdCharWidth, charWidth, startIndex, charStyle, style; + int charLen, outStartIndex, outIndex; + int dispIndexOffset; + char expandedChar[ FL_TEXT_MAX_EXP_CHAR_LEN ], outStr[ MAX_DISP_LINE_LEN ]; + char *outPtr; + const char *lineStr; + +// printf("draw_vline(visLineNum=%d, leftClip=%d, rightClip=%d, leftCharIndex=%d, rightCharIndex=%d)\n", +// visLineNum, leftClip, rightClip, leftCharIndex, rightCharIndex); +// printf("nNVisibleLines=%d\n", mNVisibleLines); + + /* If line is not displayed, skip it */ + if ( visLineNum < 0 || visLineNum >= mNVisibleLines ) + return; + + /* Calculate Y coordinate of the string to draw */ + fontHeight = mMaxsize; + Y = text_area.y + visLineNum * fontHeight; + + /* Get the text, length, and buffer position of the line to display */ + lineStartPos = mLineStarts[ visLineNum ]; +// printf("lineStartPos=%d\n", lineStartPos); + if ( lineStartPos == -1 ) { + lineLen = 0; + lineStr = NULL; + } else { + lineLen = vline_length( visLineNum ); + lineStr = buf->text_range( lineStartPos, lineStartPos + lineLen ); + } + + /* Space beyond the end of the line is still counted in units of characters + of a standardized character width (this is done mostly because style + changes based on character position can still occur in this region due + to rectangular Fl_Text_Selections). stdCharWidth must be non-zero to + prevent a potential infinite loop if X does not advance */ + stdCharWidth = TMPFONTWIDTH; //mFontStruct->max_bounds.width; + if ( stdCharWidth <= 0 ) { + Fl::error("Fl_Text_Display::draw_vline(): bad font measurement"); + free((void *)lineStr); + return; + } + + /* Shrink the clipping range to the active display area */ + leftClip = max( text_area.x, leftClip ); + rightClip = min( rightClip, text_area.x + text_area.w ); + + /* Rectangular Fl_Text_Selections are based on "real" line starts (after + a newline or start of buffer). Calculate the difference between the + last newline position and the line start we're using. Since scanning + back to find a newline is expensive, only do so if there's actually a + rectangular Fl_Text_Selection which needs it */ + if (mContinuousWrap && (range_touches_selection(buf->primary_selection(), + lineStartPos, lineStartPos + lineLen) || range_touches_selection( + buf->secondary_selection(), lineStartPos, lineStartPos + lineLen) || + range_touches_selection(buf->highlight_selection(), lineStartPos, + lineStartPos + lineLen))) { + dispIndexOffset = buf->count_displayed_characters( + buf->line_start(lineStartPos), lineStartPos); + } else + dispIndexOffset = 0; + + /* Step through character positions from the beginning of the line (even if + that's off the left edge of the displayed area) to find the first + character position that's not clipped, and the X coordinate for drawing + that character */ + X = text_area.x - mHorizOffset; + outIndex = 0; + for ( charIndex = 0; ; charIndex++ ) { + charLen = charIndex >= lineLen ? 1 : + Fl_Text_Buffer::expand_character( lineStr[ charIndex ], outIndex, + expandedChar, buf->tab_distance(), buf->null_substitution_character() ); + style = position_style( lineStartPos, lineLen, charIndex, + outIndex + dispIndexOffset ); + charWidth = charIndex >= lineLen ? stdCharWidth : + string_width( expandedChar, charLen, style ); + if ( X + charWidth >= leftClip && charIndex >= leftCharIndex ) { + startIndex = charIndex; + outStartIndex = outIndex; + startX = X; + break; + } + X += charWidth; + outIndex += charLen; + } + + /* Scan character positions from the beginning of the clipping range, and + draw parts whenever the style changes (also note if the cursor is on + this line, and where it should be drawn to take advantage of the x + position which we've gone to so much trouble to calculate) */ + /* since characters between style may overlap, we draw the full + background first */ + int sX = startX; + outPtr = outStr; + outIndex = outStartIndex; + X = startX; + for ( charIndex = startIndex; charIndex < rightCharIndex; charIndex++ ) { + charLen = charIndex >= lineLen ? 1 : + Fl_Text_Buffer::expand_character( lineStr[ charIndex ], outIndex, expandedChar, + buf->tab_distance(), buf->null_substitution_character() ); + charStyle = position_style( lineStartPos, lineLen, charIndex, + outIndex + dispIndexOffset ); + for ( i = 0; i < charLen; i++ ) { + if ( i != 0 && charIndex < lineLen && lineStr[ charIndex ] == '\t' ) + charStyle = position_style( lineStartPos, lineLen, + charIndex, outIndex + dispIndexOffset ); + if ( charStyle != style ) { + draw_string( style|BG_ONLY_MASK, sX, Y, X, outStr, outPtr - outStr ); + outPtr = outStr; + sX = X; + style = charStyle; + } + if ( charIndex < lineLen ) { + *outPtr = expandedChar[ i ]; + charWidth = string_width( &expandedChar[ i ], 1, charStyle ); + } else + charWidth = stdCharWidth; + outPtr++; + X += charWidth; + outIndex++; + } + if ( outPtr - outStr + FL_TEXT_MAX_EXP_CHAR_LEN >= MAX_DISP_LINE_LEN || X >= rightClip ) + break; + } + draw_string( style|BG_ONLY_MASK, sX, Y, X, outStr, outPtr - outStr ); + + /* now draw the text over the previously erased background */ + outPtr = outStr; + outIndex = outStartIndex; + X = startX; + for ( charIndex = startIndex; charIndex < rightCharIndex; charIndex++ ) { + charLen = charIndex >= lineLen ? 1 : + Fl_Text_Buffer::expand_character( lineStr[ charIndex ], outIndex, expandedChar, + buf->tab_distance(), buf->null_substitution_character() ); + charStyle = position_style( lineStartPos, lineLen, charIndex, + outIndex + dispIndexOffset ); + for ( i = 0; i < charLen; i++ ) { + if ( i != 0 && charIndex < lineLen && lineStr[ charIndex ] == '\t' ) + charStyle = position_style( lineStartPos, lineLen, + charIndex, outIndex + dispIndexOffset ); + if ( charStyle != style ) { + draw_string( style|TEXT_ONLY_MASK, startX, Y, X, outStr, outPtr - outStr ); + outPtr = outStr; + startX = X; + style = charStyle; + } + if ( charIndex < lineLen ) { + *outPtr = expandedChar[ i ]; + charWidth = string_width( &expandedChar[ i ], 1, charStyle ); + } else + charWidth = stdCharWidth; + outPtr++; + X += charWidth; + outIndex++; + } + if ( outPtr - outStr + FL_TEXT_MAX_EXP_CHAR_LEN >= MAX_DISP_LINE_LEN || X >= rightClip ) + break; + } + + /* Draw the remaining style segment */ + draw_string( style|TEXT_ONLY_MASK, startX, Y, X, outStr, outPtr - outStr ); + + /* Draw the cursor if part of it appeared on the redisplayed part of + this line. Also check for the cases which are not caught as the + line is scanned above: when the cursor appears at the very end + of the redisplayed section. */ + /* CET - FIXME + if ( mCursorOn ) + { + if ( hasCursor ) + draw_cursor( cursorX, Y ); + else if ( charIndex < lineLen && ( lineStartPos + charIndex + 1 == cursorPos ) + && X == rightClip ) + { + if ( cursorPos >= buf->length() ) + draw_cursor( X - 1, Y ); + else + { + draw_cursor( X - 1, Y ); + } + } + } + */ + if ( lineStr != NULL ) + free((void *)lineStr); +} + +/* +** Draw a string or blank area according to parameter "style", using the +** appropriate colors and drawing method for that style, with top left +** corner at X, y. If style says to draw text, use "string" as source of +** characters, and draw "nChars", if style is FILL, erase +** rectangle where text would have drawn from X to toX and from Y to +** the maximum Y extent of the current font(s). +*/ +void Fl_Text_Display::draw_string( int style, int X, int Y, int toX, + const char *string, int nChars ) { + const Style_Table_Entry * styleRec; + + /* Draw blank area rather than text, if that was the request */ + if ( style & FILL_MASK ) { + if (style & TEXT_ONLY_MASK) return; + clear_rect( style, X, Y, toX - X, mMaxsize ); + return; + } + + /* Set font, color, and gc depending on style. For normal text, GCs + for normal drawing, or drawing within a Fl_Text_Selection or highlight are + pre-allocated and pre-configured. For syntax highlighting, GCs are + configured here, on the fly. */ + + Fl_Font font = textfont(); + int fsize = textsize(); + Fl_Color foreground; + Fl_Color background; + + if ( style & STYLE_LOOKUP_MASK ) { + int si = (style & STYLE_LOOKUP_MASK) - 'A'; + if (si < 0) si = 0; + else if (si >= mNStyles) si = mNStyles - 1; + + styleRec = mStyleTable + si; + font = styleRec->font; + fsize = styleRec->size; + + if (style & PRIMARY_MASK) { + if (Fl::focus() == this) background = selection_color(); + else background = fl_color_average(color(), selection_color(), 0.4f); + } else if (style & HIGHLIGHT_MASK) { + if (Fl::focus() == this) background = fl_color_average(color(), selection_color(), 0.5f); + else background = fl_color_average(color(), selection_color(), 0.6f); + } else background = color(); + foreground = fl_contrast(styleRec->color, background); + } else if (style & PRIMARY_MASK) { + if (Fl::focus() == this) background = selection_color(); + else background = fl_color_average(color(), selection_color(), 0.4f); + foreground = fl_contrast(textcolor(), background); + } else if (style & HIGHLIGHT_MASK) { + if (Fl::focus() == this) background = fl_color_average(color(), selection_color(), 0.5f); + else background = fl_color_average(color(), selection_color(), 0.6f); + foreground = fl_contrast(textcolor(), background); + } else { + foreground = textcolor(); + background = color(); + } + + if (!(style & TEXT_ONLY_MASK)) { + fl_color( background ); + fl_rectf( X, Y, toX - X, mMaxsize ); + } + if (!(style & BG_ONLY_MASK)) { + fl_color( foreground ); + fl_font( font, fsize ); + fl_draw( string, nChars, X, Y + mMaxsize - fl_descent()); + } + + // CET - FIXME + /* If any space around the character remains unfilled (due to use of + different sized fonts for highlighting), fill in above or below + to erase previously drawn characters */ + /* + if (fs->ascent < mAscent) + clear_rect( style, X, Y, toX - X, mAscent - fs->ascent); + if (fs->descent < mDescent) + clear_rect( style, X, Y + mAscent + fs->descent, toX - x, + mDescent - fs->descent); + */ + /* Underline if style is secondary Fl_Text_Selection */ + + /* + if (style & SECONDARY_MASK) + XDrawLine(XtDisplay(mW), XtWindow(mW), gc, x, + y + mAscent, toX - 1, Y + fs->ascent); + */ +} + + +/* +** Clear a rectangle with the appropriate background color for "style" +*/ +void Fl_Text_Display::clear_rect( int style, int X, int Y, + int width, int height ) { + /* A width of zero means "clear to end of window" to XClearArea */ + if ( width == 0 ) + return; + + if (style & PRIMARY_MASK) { + if (Fl::focus()==this) { + fl_color(selection_color()); + } else { + fl_color(fl_color_average(color(), selection_color(), 0.4f)); + } + } else if (style & HIGHLIGHT_MASK) { + if (Fl::focus()==this) { + fl_color(fl_color_average(color(), selection_color(), 0.5f)); + } else { + fl_color(fl_color_average(color(), selection_color(), 0.6f)); + } + } else { + fl_color( color() ); + } + fl_rectf( X, Y, width, height ); +} + + +/* +** Draw a cursor with top center at X, y. +*/ +void Fl_Text_Display::draw_cursor( int X, int Y ) { + typedef struct { + int x1, y1, x2, y2; + } + Segment; + + Segment segs[ 5 ]; + int left, right, cursorWidth, midY; + // int fontWidth = mFontStruct->min_bounds.width, nSegs = 0; + int fontWidth = TMPFONTWIDTH; // CET - FIXME + int nSegs = 0; + int fontHeight = mMaxsize; + int bot = Y + fontHeight - 1; + + if ( X < text_area.x - 1 || X > text_area.x + text_area.w ) + return; + + /* For cursors other than the block, make them around 2/3 of a character + width, rounded to an even number of pixels so that X will draw an + odd number centered on the stem at x. */ + cursorWidth = 4; //(fontWidth/3) * 2; + left = X - cursorWidth / 2; + right = left + cursorWidth; + + /* Create segments and draw cursor */ + if ( mCursorStyle == CARET_CURSOR ) { + midY = bot - fontHeight / 5; + segs[ 0 ].x1 = left; segs[ 0 ].y1 = bot; segs[ 0 ].x2 = X; segs[ 0 ].y2 = midY; + segs[ 1 ].x1 = X; segs[ 1 ].y1 = midY; segs[ 1 ].x2 = right; segs[ 1 ].y2 = bot; + segs[ 2 ].x1 = left; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = X; segs[ 2 ].y2 = midY - 1; + segs[ 3 ].x1 = X; segs[ 3 ].y1 = midY - 1; segs[ 3 ].x2 = right; segs[ 3 ].y2 = bot; + nSegs = 4; + } else if ( mCursorStyle == NORMAL_CURSOR ) { + segs[ 0 ].x1 = left; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = right; segs[ 0 ].y2 = Y; + segs[ 1 ].x1 = X; segs[ 1 ].y1 = Y; segs[ 1 ].x2 = X; segs[ 1 ].y2 = bot; + segs[ 2 ].x1 = left; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = right; segs[ 2 ].y2 = bot; + nSegs = 3; + } else if ( mCursorStyle == HEAVY_CURSOR ) { + segs[ 0 ].x1 = X - 1; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = X - 1; segs[ 0 ].y2 = bot; + segs[ 1 ].x1 = X; segs[ 1 ].y1 = Y; segs[ 1 ].x2 = X; segs[ 1 ].y2 = bot; + segs[ 2 ].x1 = X + 1; segs[ 2 ].y1 = Y; segs[ 2 ].x2 = X + 1; segs[ 2 ].y2 = bot; + segs[ 3 ].x1 = left; segs[ 3 ].y1 = Y; segs[ 3 ].x2 = right; segs[ 3 ].y2 = Y; + segs[ 4 ].x1 = left; segs[ 4 ].y1 = bot; segs[ 4 ].x2 = right; segs[ 4 ].y2 = bot; + nSegs = 5; + } else if ( mCursorStyle == DIM_CURSOR ) { + midY = Y + fontHeight / 2; + segs[ 0 ].x1 = X; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = X; segs[ 0 ].y2 = Y; + segs[ 1 ].x1 = X; segs[ 1 ].y1 = midY; segs[ 1 ].x2 = X; segs[ 1 ].y2 = midY; + segs[ 2 ].x1 = X; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = X; segs[ 2 ].y2 = bot; + nSegs = 3; + } else if ( mCursorStyle == BLOCK_CURSOR ) { + right = X + fontWidth; + segs[ 0 ].x1 = X; segs[ 0 ].y1 = Y; segs[ 0 ].x2 = right; segs[ 0 ].y2 = Y; + segs[ 1 ].x1 = right; segs[ 1 ].y1 = Y; segs[ 1 ].x2 = right; segs[ 1 ].y2 = bot; + segs[ 2 ].x1 = right; segs[ 2 ].y1 = bot; segs[ 2 ].x2 = X; segs[ 2 ].y2 = bot; + segs[ 3 ].x1 = X; segs[ 3 ].y1 = bot; segs[ 3 ].x2 = X; segs[ 3 ].y2 = Y; + nSegs = 4; + } + fl_color( mCursor_color ); + + for ( int k = 0; k < nSegs; k++ ) { + fl_line( segs[ k ].x1, segs[ k ].y1, segs[ k ].x2, segs[ k ].y2 ); + } +} + +/* +** Determine the drawing method to use to draw a specific character from "buf". +** "lineStartPos" gives the character index where the line begins, "lineIndex", +** the number of characters past the beginning of the line, and "dispIndex", +** the number of displayed characters past the beginning of the line. Passing +** lineStartPos of -1 returns the drawing style for "no text". +** +** Why not just: position_style(pos)? Because style applies to blank areas +** of the window beyond the text boundaries, and because this routine must also +** decide whether a position is inside of a rectangular Fl_Text_Selection, and do +** so efficiently, without re-counting character positions from the start of the +** line. +** +** Note that style is a somewhat incorrect name, drawing method would +** be more appropriate. +*/ +int Fl_Text_Display::position_style( int lineStartPos, + int lineLen, int lineIndex, int dispIndex ) { + Fl_Text_Buffer * buf = mBuffer; + Fl_Text_Buffer *styleBuf = mStyleBuffer; + int pos, style = 0; + + if ( lineStartPos == -1 || buf == NULL ) + return FILL_MASK; + + pos = lineStartPos + min( lineIndex, lineLen ); + + if ( lineIndex >= lineLen ) + style = FILL_MASK; + else if ( styleBuf != NULL ) { + style = ( unsigned char ) styleBuf->character( pos ); + if (style == mUnfinishedStyle && mUnfinishedHighlightCB) { + /* encountered "unfinished" style, trigger parsing */ + (mUnfinishedHighlightCB)( pos, mHighlightCBArg); + style = (unsigned char) styleBuf->character( pos); + } + } + if (buf->primary_selection()->includes(pos, lineStartPos, dispIndex)) + style |= PRIMARY_MASK; + if (buf->highlight_selection()->includes(pos, lineStartPos, dispIndex)) + style |= HIGHLIGHT_MASK; + if (buf->secondary_selection()->includes(pos, lineStartPos, dispIndex)) + style |= SECONDARY_MASK; + return style; +} + +/* +** Find the width of a string in the font of a particular style +*/ +int Fl_Text_Display::string_width( const char *string, int length, int style ) { + Fl_Font font; + int fsize; + + if ( style & STYLE_LOOKUP_MASK ) { + int si = (style & STYLE_LOOKUP_MASK) - 'A'; + if (si < 0) si = 0; + else if (si >= mNStyles) si = mNStyles - 1; + + font = mStyleTable[si].font; + fsize = mStyleTable[si].size; + } else { + font = textfont(); + fsize = textsize(); + } + fl_font( font, fsize ); + + return ( int ) ( fl_width( string, length ) ); +} + +/* +** Translate window coordinates to the nearest (insert cursor or character +** cell) text position. The parameter posType specifies how to interpret the +** position: CURSOR_POS means translate the coordinates to the nearest cursor +** position, and CHARACTER_POS means return the position of the character +** closest to (X, Y). +*/ +int Fl_Text_Display::xy_to_position( int X, int Y, int posType ) { + int charIndex, lineStart, lineLen, fontHeight; + int charWidth, charLen, charStyle, visLineNum, xStep, outIndex; + char expandedChar[ FL_TEXT_MAX_EXP_CHAR_LEN ]; + const char *lineStr; + + /* Find the visible line number corresponding to the Y coordinate */ + fontHeight = mMaxsize; + visLineNum = ( Y - text_area.y ) / fontHeight; + if ( visLineNum < 0 ) + return mFirstChar; + if ( visLineNum >= mNVisibleLines ) + visLineNum = mNVisibleLines - 1; + + /* Find the position at the start of the line */ + lineStart = mLineStarts[ visLineNum ]; + + /* If the line start was empty, return the last position in the buffer */ + if ( lineStart == -1 ) + return mBuffer->length(); + + /* Get the line text and its length */ + lineLen = vline_length( visLineNum ); + lineStr = mBuffer->text_range( lineStart, lineStart + lineLen ); + + /* Step through character positions from the beginning of the line + to find the character position corresponding to the X coordinate */ + xStep = text_area.x - mHorizOffset; + outIndex = 0; + for ( charIndex = 0; charIndex < lineLen; charIndex++ ) { + charLen = Fl_Text_Buffer::expand_character( lineStr[ charIndex ], outIndex, expandedChar, + mBuffer->tab_distance(), mBuffer->null_substitution_character() ); + charStyle = position_style( lineStart, lineLen, charIndex, outIndex ); + charWidth = string_width( expandedChar, charLen, charStyle ); + if ( X < xStep + ( posType == CURSOR_POS ? charWidth / 2 : charWidth ) ) { + free((char *)lineStr); + return lineStart + charIndex; + } + xStep += charWidth; + outIndex += charLen; + } + + /* If the X position was beyond the end of the line, return the position + of the newline at the end of the line */ + free((char *)lineStr); + return lineStart + lineLen; +} + +/* +** Translate window coordinates to the nearest row and column number for +** positioning the cursor. This, of course, makes no sense when the font is +** proportional, since there are no absolute columns. The parameter posType +** specifies how to interpret the position: CURSOR_POS means translate the +** coordinates to the nearest position between characters, and CHARACTER_POS +** means translate the position to the nearest character cell. +*/ +void Fl_Text_Display::xy_to_rowcol( int X, int Y, int *row, + int *column, int posType ) { + int fontHeight = mMaxsize; + int fontWidth = TMPFONTWIDTH; //mFontStruct->max_bounds.width; + + /* Find the visible line number corresponding to the Y coordinate */ + *row = ( Y - text_area.y ) / fontHeight; + if ( *row < 0 ) * row = 0; + if ( *row >= mNVisibleLines ) * row = mNVisibleLines - 1; + *column = ( ( X - text_area.x ) + mHorizOffset + + ( posType == CURSOR_POS ? fontWidth / 2 : 0 ) ) / fontWidth; + if ( *column < 0 ) * column = 0; +} + +/* +** Offset the line starts array, mTopLineNum, mFirstChar and lastChar, for a new +** vertical scroll position given by newTopLineNum. If any currently displayed +** lines will still be visible, salvage the line starts values, otherwise, +** count lines from the nearest known line start (start or end of buffer, or +** the closest value in the mLineStarts array) +*/ +void Fl_Text_Display::offset_line_starts( int newTopLineNum ) { + int oldTopLineNum = mTopLineNum; + int oldFirstChar = mFirstChar; + int lineDelta = newTopLineNum - oldTopLineNum; + int nVisLines = mNVisibleLines; + int *lineStarts = mLineStarts; + int i, lastLineNum; + Fl_Text_Buffer *buf = mBuffer; + + /* If there was no offset, nothing needs to be changed */ + if ( lineDelta == 0 ) + return; + + /* Find the new value for mFirstChar by counting lines from the nearest + known line start (start or end of buffer, or the closest value in the + lineStarts array) */ + lastLineNum = oldTopLineNum + nVisLines - 1; + if ( newTopLineNum < oldTopLineNum && newTopLineNum < -lineDelta ) { + mFirstChar = skip_lines( 0, newTopLineNum - 1, true ); + } else if ( newTopLineNum < oldTopLineNum ) { + mFirstChar = rewind_lines( mFirstChar, -lineDelta ); + } else if ( newTopLineNum < lastLineNum ) { + mFirstChar = lineStarts[ newTopLineNum - oldTopLineNum ]; + } else if ( newTopLineNum - lastLineNum < mNBufferLines - newTopLineNum ) { + mFirstChar = skip_lines( lineStarts[ nVisLines - 1 ], + newTopLineNum - lastLineNum, true ); + } else { + mFirstChar = rewind_lines( buf->length(), mNBufferLines - newTopLineNum + 1 ); + } + + /* Fill in the line starts array */ + if ( lineDelta < 0 && -lineDelta < nVisLines ) { + for ( i = nVisLines - 1; i >= -lineDelta; i-- ) + lineStarts[ i ] = lineStarts[ i + lineDelta ]; + calc_line_starts( 0, -lineDelta ); + } else if ( lineDelta > 0 && lineDelta < nVisLines ) { + for ( i = 0; i < nVisLines - lineDelta; i++ ) + lineStarts[ i ] = lineStarts[ i + lineDelta ]; + calc_line_starts( nVisLines - lineDelta, nVisLines - 1 ); + } else + calc_line_starts( 0, nVisLines ); + + /* Set lastChar and mTopLineNum */ + calc_last_char(); + mTopLineNum = newTopLineNum; + + /* If we're numbering lines or being asked to maintain an absolute line + number, re-calculate the absolute line number */ + absolute_top_line_number(oldFirstChar); +} + +/* +** Update the line starts array, mTopLineNum, mFirstChar and lastChar for text +** display "textD" after a modification to the text buffer, given by the +** position where the change began "pos", and the nmubers of characters +** and lines inserted and deleted. +*/ +void Fl_Text_Display::update_line_starts( int pos, int charsInserted, + int charsDeleted, int linesInserted, int linesDeleted, int *scrolled ) { + int * lineStarts = mLineStarts; + int i, lineOfPos, lineOfEnd, nVisLines = mNVisibleLines; + int charDelta = charsInserted - charsDeleted; + int lineDelta = linesInserted - linesDeleted; + + /* If all of the changes were before the displayed text, the display + doesn't change, just update the top line num and offset the line + start entries and first and last characters */ + if ( pos + charsDeleted < mFirstChar ) { + mTopLineNum += lineDelta; + for ( i = 0; i < nVisLines && lineStarts[i] != -1; i++ ) + lineStarts[ i ] += charDelta; + mFirstChar += charDelta; + mLastChar += charDelta; + *scrolled = 0; + return; + } + + /* The change began before the beginning of the displayed text, but + part or all of the displayed text was deleted */ + if ( pos < mFirstChar ) { + /* If some text remains in the window, anchor on that */ + if ( position_to_line( pos + charsDeleted, &lineOfEnd ) && + ++lineOfEnd < nVisLines && lineStarts[ lineOfEnd ] != -1 ) { + mTopLineNum = max( 1, mTopLineNum + lineDelta ); + mFirstChar = rewind_lines( + lineStarts[ lineOfEnd ] + charDelta, lineOfEnd ); + /* Otherwise anchor on original line number and recount everything */ + } else { + if ( mTopLineNum > mNBufferLines + lineDelta ) { + mTopLineNum = 1; + mFirstChar = 0; + } else + mFirstChar = skip_lines( 0, mTopLineNum - 1, true ); + } + calc_line_starts( 0, nVisLines - 1 ); + /* calculate lastChar by finding the end of the last displayed line */ + calc_last_char(); + *scrolled = 1; + return; + } + + /* If the change was in the middle of the displayed text (it usually is), + salvage as much of the line starts array as possible by moving and + offsetting the entries after the changed area, and re-counting the + added lines or the lines beyond the salvaged part of the line starts + array */ + if ( pos <= mLastChar ) { + /* find line on which the change began */ + position_to_line( pos, &lineOfPos ); + /* salvage line starts after the changed area */ + if ( lineDelta == 0 ) { + for ( i = lineOfPos + 1; i < nVisLines && lineStarts[ i ] != -1; i++ ) + lineStarts[ i ] += charDelta; + } else if ( lineDelta > 0 ) { + for ( i = nVisLines - 1; i >= lineOfPos + lineDelta + 1; i-- ) + lineStarts[ i ] = lineStarts[ i - lineDelta ] + + ( lineStarts[ i - lineDelta ] == -1 ? 0 : charDelta ); + } else /* (lineDelta < 0) */ { + for ( i = max( 0, lineOfPos + 1 ); i < nVisLines + lineDelta; i++ ) + lineStarts[ i ] = lineStarts[ i - lineDelta ] + + ( lineStarts[ i - lineDelta ] == -1 ? 0 : charDelta ); + } + /* fill in the missing line starts */ + if ( linesInserted >= 0 ) + calc_line_starts( lineOfPos + 1, lineOfPos + linesInserted ); + if ( lineDelta < 0 ) + calc_line_starts( nVisLines + lineDelta, nVisLines ); + /* calculate lastChar by finding the end of the last displayed line */ + calc_last_char(); + *scrolled = 0; + return; + } + + /* Change was past the end of the displayed text, but displayable by virtue + of being an insert at the end of the buffer into visible blank lines */ + if ( empty_vlines() ) { + position_to_line( pos, &lineOfPos ); + calc_line_starts( lineOfPos, lineOfPos + linesInserted ); + calc_last_char(); + *scrolled = 0; + return; + } + + /* Change was beyond the end of the buffer and not visible, do nothing */ + *scrolled = 0; +} + +/* +** Scan through the text in the "textD"'s buffer and recalculate the line +** starts array values beginning at index "startLine" and continuing through +** (including) "endLine". It assumes that the line starts entry preceding +** "startLine" (or mFirstChar if startLine is 0) is good, and re-counts +** newlines to fill in the requested entries. Out of range values for +** "startLine" and "endLine" are acceptable. +*/ +void Fl_Text_Display::calc_line_starts( int startLine, int endLine ) { + int startPos, bufLen = mBuffer->length(); + int line, lineEnd, nextLineStart, nVis = mNVisibleLines; + int *lineStarts = mLineStarts; + + /* Clean up (possibly) messy input parameters */ + if ( endLine < 0 ) endLine = 0; + if ( endLine >= nVis ) endLine = nVis - 1; + if ( startLine < 0 ) startLine = 0; + if ( startLine >= nVis ) startLine = nVis - 1; + if ( startLine > endLine ) + return; + + /* Find the last known good line number -> position mapping */ + if ( startLine == 0 ) { + lineStarts[ 0 ] = mFirstChar; + startLine = 1; + } + startPos = lineStarts[ startLine - 1 ]; + + /* If the starting position is already past the end of the text, + fill in -1's (means no text on line) and return */ + if ( startPos == -1 ) { + for ( line = startLine; line <= endLine; line++ ) + lineStarts[ line ] = -1; + return; + } + + /* Loop searching for ends of lines and storing the positions of the + start of the next line in lineStarts */ + for ( line = startLine; line <= endLine; line++ ) { + find_line_end(startPos, true, &lineEnd, &nextLineStart); + startPos = nextLineStart; + if ( startPos >= bufLen ) { + /* If the buffer ends with a newline or line break, put + buf->length() in the next line start position (instead of + a -1 which is the normal marker for an empty line) to + indicate that the cursor may safely be displayed there */ + if ( line == 0 || ( lineStarts[ line - 1 ] != bufLen && + lineEnd != nextLineStart ) ) { + lineStarts[ line ] = bufLen; + line++; + } + break; + } + lineStarts[ line ] = startPos; + } + + /* Set any entries beyond the end of the text to -1 */ + for ( ; line <= endLine; line++ ) + lineStarts[ line ] = -1; +} + +/* +** Given a Fl_Text_Display with a complete, up-to-date lineStarts array, update +** the lastChar entry to point to the last buffer position displayed. +*/ +void Fl_Text_Display::calc_last_char() { + int i; + for (i = mNVisibleLines - 1; i >= 0 && mLineStarts[i] == -1; i--) ; + mLastChar = i < 0 ? 0 : line_end(mLineStarts[i], true); +} + +void Fl_Text_Display::scroll(int topLineNum, int horizOffset) { + mTopLineNumHint = topLineNum; + mHorizOffsetHint = horizOffset; + resize(x(), y(), w(), h()); +} + +void Fl_Text_Display::scroll_(int topLineNum, int horizOffset) { + /* Limit the requested scroll position to allowable values */ + if (topLineNum > mNBufferLines + 3 - mNVisibleLines) + topLineNum = mNBufferLines + 3 - mNVisibleLines; + if (topLineNum < 1) topLineNum = 1; + + if (horizOffset > longest_vline() - text_area.w) + horizOffset = longest_vline() - text_area.w; + if (horizOffset < 0) horizOffset = 0; + + /* Do nothing if scroll position hasn't actually changed or there's no + window to draw in yet */ + if (mHorizOffset == horizOffset && mTopLineNum == topLineNum) + return; + + /* If the vertical scroll position has changed, update the line + starts array and related counters in the text display */ + offset_line_starts(topLineNum); + + /* Just setting mHorizOffset is enough information for redisplay */ + mHorizOffset = horizOffset; + + // redraw all text + damage(FL_DAMAGE_EXPOSE); +} + +/* +** Update the minimum, maximum, slider size, page increment, and value +** for vertical scroll bar. +*/ +void Fl_Text_Display::update_v_scrollbar() { + /* The Vert. scroll bar value and slider size directly represent the top + line number, and the number of visible lines respectively. The scroll + bar maximum value is chosen to generally represent the size of the whole + buffer, with minor adjustments to keep the scroll bar widget happy */ +#ifdef DEBUG + printf("Fl_Text_Display::update_v_scrollbar():\n" + " mTopLineNum=%d, mNVisibleLines=%d, mNBufferLines=%d\n", + mTopLineNum, mNVisibleLines, mNBufferLines); +#endif // DEBUG + + mVScrollBar->value(mTopLineNum, mNVisibleLines, 1, mNBufferLines+2); + mVScrollBar->linesize(3); +} + +/* +** Update the minimum, maximum, slider size, page increment, and value +** for the horizontal scroll bar. +*/ +void Fl_Text_Display::update_h_scrollbar() { + int sliderMax = max(longest_vline(), text_area.w + mHorizOffset); + mHScrollBar->value( mHorizOffset, text_area.w, 0, sliderMax ); +} + +/* +** Callbacks for drag or valueChanged on scroll bars +*/ +void Fl_Text_Display::v_scrollbar_cb(Fl_Scrollbar* b, Fl_Text_Display* textD) { + if (b->value() == textD->mTopLineNum) return; + textD->scroll(b->value(), textD->mHorizOffset); +} + +void Fl_Text_Display::h_scrollbar_cb(Fl_Scrollbar* b, Fl_Text_Display* textD) { + if (b->value() == textD->mHorizOffset) return; + textD->scroll(textD->mTopLineNum, b->value()); +} + +/* +** Refresh the line number area. If clearAll is False, writes only over +** the character cell areas. Setting clearAll to True will clear out any +** stray marks outside of the character cell area, which might have been +** left from before a resize or font change. +*/ +void Fl_Text_Display::draw_line_numbers(bool /*clearAll*/) { +#if 0 + // FIXME: don't want this yet, so will leave for another time + + int y, line, visLine, nCols, lineStart; + char lineNumString[12]; + int lineHeight = mMaxsize ? mMaxsize : textsize_; + int charWidth = TMPFONTWIDTH; //mFontStruct->max_bounds.width; + + /* Don't draw if mLineNumWidth == 0 (line numbers are hidden), or widget is + not yet realized */ + if (mLineNumWidth == 0 || visible_r()) + return; + + /* GC is allocated on demand, since not everyone will use line numbering */ + if (textD->lineNumGC == NULL) { + XGCValues values; + values.foreground = textD->lineNumFGPixel; + values.background = textD->bgPixel; + values.font = textD->fontStruct->fid; + textD->lineNumGC = XtGetGC(textD->w, + GCFont| GCForeground | GCBackground, &values); + } + + /* Erase the previous contents of the line number area, if requested */ + if (clearAll) + XClearArea(XtDisplay(textD->w), XtWindow(textD->w), textD->lineNumLeft, + textD->top, textD->lineNumWidth, textD->height, False); + + /* Draw the line numbers, aligned to the text */ + nCols = min(11, textD->lineNumWidth / charWidth); + y = textD->top; + line = getAbsTopLineNum(textD); + for (visLine=0; visLine < textD->nVisibleLines; visLine++) { + lineStart = textD->lineStarts[visLine]; + if (lineStart != -1 && (lineStart==0 || + BufGetCharacter(textD->buffer, lineStart-1)=='\n')) { + sprintf(lineNumString, "%*d", nCols, line); + XDrawImageString(XtDisplay(textD->w), XtWindow(textD->w), + textD->lineNumGC, textD->lineNumLeft, y + textD->ascent, + lineNumString, strlen(lineNumString)); + line++; + } else { + XClearArea(XtDisplay(textD->w), XtWindow(textD->w), + textD->lineNumLeft, y, textD->lineNumWidth, + textD->ascent + textD->descent, False); + if (visLine == 0) + line++; + } + y += lineHeight; + } +#endif +} + +static int max( int i1, int i2 ) { + return i1 >= i2 ? i1 : i2; +} + +static int min( int i1, int i2 ) { + return i1 <= i2 ? i1 : i2; +} + +/* +** Count the number of newlines in a null-terminated text string; +*/ +static int countlines( const char *string ) { + const char * c; + int lineCount = 0; + + if (!string) return 0; + + for ( c = string; *c != '\0'; c++ ) + if ( *c == '\n' ) lineCount++; + return lineCount; +} + +/* +** Return the width in pixels of the displayed line pointed to by "visLineNum" +*/ +int Fl_Text_Display::measure_vline( int visLineNum ) { + int i, width = 0, len, style, lineLen = vline_length( visLineNum ); + int charCount = 0, lineStartPos = mLineStarts[ visLineNum ]; + char expandedChar[ FL_TEXT_MAX_EXP_CHAR_LEN ]; + + if (lineStartPos < 0 || lineLen == 0) return 0; + if ( mStyleBuffer == NULL ) { + for ( i = 0; i < lineLen; i++ ) { + len = mBuffer->expand_character( lineStartPos + i, + charCount, expandedChar ); + + fl_font( textfont(), textsize() ); + + width += ( int ) fl_width( expandedChar, len ); + + charCount += len; + } + } else { + for ( i = 0; i < lineLen; i++ ) { + len = mBuffer->expand_character( lineStartPos + i, + charCount, expandedChar ); + style = ( unsigned char ) mStyleBuffer->character( + lineStartPos + i ) - 'A'; + + if (style < 0) style = 0; + else if (style >= mNStyles) style = mNStyles - 1; + + fl_font( mStyleTable[ style ].font, mStyleTable[ style ].size ); + + width += ( int ) fl_width( expandedChar, len ); + + charCount += len; + } + } + return width; +} + +/* +** Return true if there are lines visible with no corresponding buffer text +*/ +int Fl_Text_Display::empty_vlines() { + return mNVisibleLines > 0 && + mLineStarts[ mNVisibleLines - 1 ] == -1; +} + +/* +** Return the length of a line (number of displayable characters) by examining +** entries in the line starts array rather than by scanning for newlines +*/ +int Fl_Text_Display::vline_length( int visLineNum ) { + int nextLineStart, lineStartPos; + + if (visLineNum < 0 || visLineNum >= mNVisibleLines) + return (0); + + lineStartPos = mLineStarts[ visLineNum ]; + + if ( lineStartPos == -1 ) + return 0; + if ( visLineNum + 1 >= mNVisibleLines ) + return mLastChar - lineStartPos; + nextLineStart = mLineStarts[ visLineNum + 1 ]; + if ( nextLineStart == -1 ) + return mLastChar - lineStartPos; + if (wrap_uses_character(nextLineStart-1)) + return nextLineStart-1 - lineStartPos; + return nextLineStart - lineStartPos; +} + +/* +** When continuous wrap is on, and the user inserts or deletes characters, +** wrapping can happen before and beyond the changed position. This routine +** finds the extent of the changes, and counts the deleted and inserted lines +** over that range. It also attempts to minimize the size of the range to +** what has to be counted and re-displayed, so the results can be useful +** both for delimiting where the line starts need to be recalculated, and +** for deciding what part of the text to redisplay. +*/ +void Fl_Text_Display::find_wrap_range(const char *deletedText, int pos, + int nInserted, int nDeleted, int *modRangeStart, int *modRangeEnd, + int *linesInserted, int *linesDeleted) { + int length, retPos, retLines, retLineStart, retLineEnd; + Fl_Text_Buffer *deletedTextBuf, *buf = buffer(); + int nVisLines = mNVisibleLines; + int *lineStarts = mLineStarts; + int countFrom, countTo, lineStart, adjLineStart, i; + int visLineNum = 0, nLines = 0; + + /* + ** Determine where to begin searching: either the previous newline, or + ** if possible, limit to the start of the (original) previous displayed + ** line, using information from the existing line starts array + */ + if (pos >= mFirstChar && pos <= mLastChar) { + for (i=nVisLines-1; i>0; i--) + if (lineStarts[i] != -1 && pos >= lineStarts[i]) + break; + if (i > 0) { + countFrom = lineStarts[i-1]; + visLineNum = i-1; + } else + countFrom = buf->line_start(pos); + } else + countFrom = buf->line_start(pos); + + + /* + ** Move forward through the (new) text one line at a time, counting + ** displayed lines, and looking for either a real newline, or for the + ** line starts to re-sync with the original line starts array + */ + lineStart = countFrom; + *modRangeStart = countFrom; + for (;;) { + + /* advance to the next line. If the line ended in a real newline + or the end of the buffer, that's far enough */ + wrapped_line_counter(buf, lineStart, buf->length(), 1, true, 0, + &retPos, &retLines, &retLineStart, &retLineEnd); + if (retPos >= buf->length()) { + countTo = buf->length(); + *modRangeEnd = countTo; + if (retPos != retLineEnd) + nLines++; + break; + } else + lineStart = retPos; + nLines++; + if (lineStart > pos + nInserted && + buf->character(lineStart-1) == '\n') { + countTo = lineStart; + *modRangeEnd = lineStart; + break; + } + + /* Don't try to resync in continuous wrap mode with non-fixed font + sizes; it would result in a chicken-and-egg dependency between + the calculations for the inserted and the deleted lines. + If we're in that mode, the number of deleted lines is calculated in + advance, without resynchronization, so we shouldn't resynchronize + for the inserted lines either. */ + if (mSuppressResync) + continue; + + /* check for synchronization with the original line starts array + before pos, if so, the modified range can begin later */ + if (lineStart <= pos) { + while (visLineNum pos + nInserted) { + adjLineStart = lineStart - nInserted + nDeleted; + while (visLineNumcopy(buffer(), countFrom, pos, 0); + if (nDeleted != 0) + deletedTextBuf->insert(pos-countFrom, deletedText); + deletedTextBuf->copy(buffer(), + pos+nInserted, countTo, pos-countFrom+nDeleted); + /* Note that we need to take into account an offset for the style buffer: + the deletedTextBuf can be out of sync with the style buffer. */ + wrapped_line_counter(deletedTextBuf, 0, length, INT_MAX, true, + countFrom, &retPos, &retLines, &retLineStart, &retLineEnd, false); + delete deletedTextBuf; + *linesDeleted = retLines; + mSuppressResync = 0; +} + +/* +** This is a stripped-down version of the findWrapRange() function above, +** intended to be used to calculate the number of "deleted" lines during +** a buffer modification. It is called _before_ the modification takes place. +** +** This function should only be called in continuous wrap mode with a +** non-fixed font width. In that case, it is impossible to calculate +** the number of deleted lines, because the necessary style information +** is no longer available _after_ the modification. In other cases, we +** can still perform the calculation afterwards (possibly even more +** efficiently). +*/ +void Fl_Text_Display::measure_deleted_lines(int pos, int nDeleted) { + int retPos, retLines, retLineStart, retLineEnd; + Fl_Text_Buffer *buf = buffer(); + int nVisLines = mNVisibleLines; + int *lineStarts = mLineStarts; + int countFrom, lineStart; + int nLines = 0, i; + /* + ** Determine where to begin searching: either the previous newline, or + ** if possible, limit to the start of the (original) previous displayed + ** line, using information from the existing line starts array + */ + if (pos >= mFirstChar && pos <= mLastChar) { + for (i=nVisLines-1; i>0; i--) + if (lineStarts[i] != -1 && pos >= lineStarts[i]) + break; + if (i > 0) countFrom = lineStarts[i-1]; + else countFrom = buf->line_start(pos); + } else + countFrom = buf->line_start(pos); + + /* + ** Move forward through the (new) text one line at a time, counting + ** displayed lines, and looking for either a real newline, or for the + ** line starts to re-sync with the original line starts array + */ + lineStart = countFrom; + for (;;) { + /* advance to the next line. If the line ended in a real newline + or the end of the buffer, that's far enough */ + wrapped_line_counter(buf, lineStart, buf->length(), 1, true, 0, + &retPos, &retLines, &retLineStart, &retLineEnd); + if (retPos >= buf->length()) { + if (retPos != retLineEnd) + nLines++; + break; + } else + lineStart = retPos; + nLines++; + if (lineStart > pos + nDeleted && + buf->character(lineStart-1) == '\n') { + break; + } + + /* Unlike in the findWrapRange() function above, we don't try to + resync with the line starts, because we don't know the length + of the inserted text yet, nor the updated style information. + + Because of that, we also shouldn't resync with the line starts + after the modification either, because we must perform the + calculations for the deleted and inserted lines in the same way. + + This can result in some unnecessary recalculation and redrawing + overhead, and therefore we should only use this two-phase mode + of calculation when it's really needed (continuous wrap + variable + font width). */ + } + mNLinesDeleted = nLines; + mSuppressResync = 1; +} + +/* +** Count forward from startPos to either maxPos or maxLines (whichever is +** reached first), and return all relevant positions and line count. +** The provided textBuffer may differ from the actual text buffer of the +** widget. In that case it must be a (partial) copy of the actual text buffer +** and the styleBufOffset argument must indicate the starting position of the +** copy, to take into account the correct style information. +** +** Returned values: +** +** retPos: Position where counting ended. When counting lines, the +** position returned is the start of the line "maxLines" +** lines beyond "startPos". +** retLines: Number of line breaks counted +** retLineStart: Start of the line where counting ended +** retLineEnd: End position of the last line traversed +*/ +void Fl_Text_Display::wrapped_line_counter(Fl_Text_Buffer *buf, int startPos, + int maxPos, int maxLines, bool startPosIsLineStart, int styleBufOffset, + int *retPos, int *retLines, int *retLineStart, int *retLineEnd, + bool countLastLineMissingNewLine) { + int lineStart, newLineStart = 0, b, p, colNum, wrapMargin; + int maxWidth, i, foundBreak, width; + bool countPixels; + int nLines = 0, tabDist = buffer()->tab_distance(); + unsigned char c; + char nullSubsChar = buffer()->null_substitution_character(); + + /* If the font is fixed, or there's a wrap margin set, it's more efficient + to measure in columns, than to count pixels. Determine if we can count + in columns (countPixels == False) or must count pixels (countPixels == + True), and set the wrap target for either pixels or columns */ + if (mFixedFontWidth != -1 || mWrapMargin != 0) { + countPixels = false; + wrapMargin = mWrapMargin ? mWrapMargin : text_area.w / (mFixedFontWidth + 1); + maxWidth = INT_MAX; + } else { + countPixels = true; + wrapMargin = INT_MAX; + maxWidth = text_area.w; + } + + /* Find the start of the line if the start pos is not marked as a + line start. */ + if (startPosIsLineStart) + lineStart = startPos; + else + lineStart = line_start(startPos); + + /* + ** Loop until position exceeds maxPos or line count exceeds maxLines. + ** (actually, contines beyond maxPos to end of line containing maxPos, + ** in case later characters cause a word wrap back before maxPos) + */ + colNum = 0; + width = 0; + for (p=lineStart; plength(); p++) { + c = (unsigned char)buf->character(p); + + /* If the character was a newline, count the line and start over, + otherwise, add it to the width and column counts */ + if (c == '\n') { + if (p >= maxPos) { + *retPos = maxPos; + *retLines = nLines; + *retLineStart = lineStart; + *retLineEnd = maxPos; + return; + } + nLines++; + if (nLines >= maxLines) { + *retPos = p + 1; + *retLines = nLines; + *retLineStart = p + 1; + *retLineEnd = p; + return; + } + lineStart = p + 1; + colNum = 0; + width = 0; + } else { + colNum += Fl_Text_Buffer::character_width(c, colNum, tabDist, nullSubsChar); + if (countPixels) + width += measure_proportional_character(c, colNum, p+styleBufOffset); + } + + /* If character exceeded wrap margin, find the break point + and wrap there */ + if (colNum > wrapMargin || width > maxWidth) { + foundBreak = false; + for (b=p; b>=lineStart; b--) { + c = (unsigned char)buf->character(b); + if (c == '\t' || c == ' ') { + newLineStart = b + 1; + if (countPixels) { + colNum = 0; + width = 0; + for (i=b+1; icharacter(i), colNum, + i+styleBufOffset); + colNum++; + } + } else + colNum = buf->count_displayed_characters(b+1, p+1); + foundBreak = true; + break; + } + } + if (!foundBreak) { /* no whitespace, just break at margin */ + newLineStart = max(p, lineStart+1); + colNum = Fl_Text_Buffer::character_width(c, colNum, tabDist, nullSubsChar); + if (countPixels) + width = measure_proportional_character(c, colNum, p+styleBufOffset); + } + if (p >= maxPos) { + *retPos = maxPos; + *retLines = maxPos < newLineStart ? nLines : nLines + 1; + *retLineStart = maxPos < newLineStart ? lineStart : + newLineStart; + *retLineEnd = maxPos; + return; + } + nLines++; + if (nLines >= maxLines) { + *retPos = foundBreak ? b + 1 : max(p, lineStart+1); + *retLines = nLines; + *retLineStart = lineStart; + *retLineEnd = foundBreak ? b : p; + return; + } + lineStart = newLineStart; + } + } + + /* reached end of buffer before reaching pos or line target */ + *retPos = buf->length(); + *retLines = nLines; + if (countLastLineMissingNewLine && colNum > 0) + ++(*retLines); + *retLineStart = lineStart; + *retLineEnd = buf->length(); +} + +/* +** Measure the width in pixels of a character "c" at a particular column +** "colNum" and buffer position "pos". This is for measuring characters in +** proportional or mixed-width highlighting fonts. +** +** A note about proportional and mixed-width fonts: the mixed width and +** proportional font code in nedit does not get much use in general editing, +** because nedit doesn't allow per-language-mode fonts, and editing programs +** in a proportional font is usually a bad idea, so very few users would +** choose a proportional font as a default. There are still probably mixed- +** width syntax highlighting cases where things don't redraw properly for +** insertion/deletion, though static display and wrapping and resizing +** should now be solid because they are now used for online help display. +*/ +int Fl_Text_Display::measure_proportional_character(char c, int colNum, int pos) { + int charLen, style; + char expChar[ FL_TEXT_MAX_EXP_CHAR_LEN ]; + Fl_Text_Buffer *styleBuf = mStyleBuffer; + + charLen = Fl_Text_Buffer::expand_character(c, colNum, expChar, + buffer()->tab_distance(), buffer()->null_substitution_character()); + if (styleBuf == 0) { + style = 0; + } else { + style = (unsigned char)styleBuf->character(pos); + if (style == mUnfinishedStyle && mUnfinishedHighlightCB) { + /* encountered "unfinished" style, trigger parsing */ + (mUnfinishedHighlightCB)(pos, mHighlightCBArg); + style = (unsigned char)styleBuf->character(pos); + } + } + return string_width(expChar, charLen, style); +} + +/* +** Finds both the end of the current line and the start of the next line. Why? +** In continuous wrap mode, if you need to know both, figuring out one from the +** other can be expensive or error prone. The problem comes when there's a +** trailing space or tab just before the end of the buffer. To translate an +** end of line value to or from the next lines start value, you need to know +** whether the trailing space or tab is being used as a line break or just a +** normal character, and to find that out would otherwise require counting all +** the way back to the beginning of the line. +*/ +void Fl_Text_Display::find_line_end(int startPos, bool startPosIsLineStart, + int *lineEnd, int *nextLineStart) { + int retLines, retLineStart; + + /* if we're not wrapping use more efficient BufEndOfLine */ + if (!mContinuousWrap) { + *lineEnd = buffer()->line_end(startPos); + *nextLineStart = min(buffer()->length(), *lineEnd + 1); + return; + } + + /* use the wrapped line counter routine to count forward one line */ + wrapped_line_counter(buffer(), startPos, buffer()->length(), + 1, startPosIsLineStart, 0, nextLineStart, &retLines, + &retLineStart, lineEnd); + return; +} + +/* +** Line breaks in continuous wrap mode usually happen at newlines or +** whitespace. This line-terminating character is not included in line +** width measurements and has a special status as a non-visible character. +** However, lines with no whitespace are wrapped without the benefit of a +** line terminating character, and this distinction causes endless trouble +** with all of the text display code which was originally written without +** continuous wrap mode and always expects to wrap at a newline character. +** +** Given the position of the end of the line, as returned by TextDEndOfLine +** or BufEndOfLine, this returns true if there is a line terminating +** character, and false if there's not. On the last character in the +** buffer, this function can't tell for certain whether a trailing space was +** used as a wrap point, and just guesses that it wasn't. So if an exact +** accounting is necessary, don't use this function. +*/ +int Fl_Text_Display::wrap_uses_character(int lineEndPos) { + char c; + + if (!mContinuousWrap || lineEndPos == buffer()->length()) + return 1; + + c = buffer()->character(lineEndPos); + return c == '\n' || ((c == '\t' || c == ' ') && + lineEndPos + 1 != buffer()->length()); +} + +/* +** Return true if the selection "sel" is rectangular, and touches a +** buffer position withing "rangeStart" to "rangeEnd" +*/ +int Fl_Text_Display::range_touches_selection(Fl_Text_Selection *sel, + int rangeStart, int rangeEnd) { + return sel->selected() && sel->rectangular() && sel->end() >= rangeStart && + sel->start() <= rangeEnd; +} + +/* +** Extend the range of a redraw request (from *start to *end) with additional +** redraw requests resulting from changes to the attached style buffer (which +** contains auxiliary information for coloring or styling text). +*/ +void Fl_Text_Display::extend_range_for_styles( int *startpos, int *endpos ) { + Fl_Text_Selection * sel = mStyleBuffer->primary_selection(); + int extended = 0; + + /* The peculiar protocol used here is that modifications to the style + buffer are marked by selecting them with the buffer's primary Fl_Text_Selection. + The style buffer is usually modified in response to a modify callback on + the text buffer BEFORE Fl_Text_Display.c's modify callback, so that it can keep + the style buffer in step with the text buffer. The style-update + callback can't just call for a redraw, because Fl_Text_Display hasn't processed + the original text changes yet. Anyhow, to minimize redrawing and to + avoid the complexity of scheduling redraws later, this simple protocol + tells the text display's buffer modify callback to extend it's redraw + range to show the text color/and font changes as well. */ + if ( sel->selected() ) { + if ( sel->start() < *startpos ) { + *startpos = sel->start(); + extended = 1; + } + if ( sel->end() > *endpos ) { + *endpos = sel->end(); + extended = 1; + } + } + + /* If the Fl_Text_Selection was extended due to a style change, and some of the + fonts don't match in spacing, extend redraw area to end of line to + redraw characters exposed by possible font size changes */ + if ( mFixedFontWidth == -1 && extended ) + *endpos = mBuffer->line_end( *endpos ) + 1; +} + +// The draw() method. It tries to minimize what is draw as much as possible. +void Fl_Text_Display::draw(void) { + // don't even try if there is no associated text buffer! + if (!buffer()) { draw_box(); return; } + + fl_push_clip(x(),y(),w(),h()); // prevent drawing outside widget area + + // draw the non-text, non-scrollbar areas. + if (damage() & FL_DAMAGE_ALL) { +// printf("drawing all (box = %d)\n", box()); + // draw the box() + int W = w(), H = h(); + draw_box(box(), x(), y(), W, H, color()); + + if (mHScrollBar->visible()) + W -= scrollbar_width(); + if (mVScrollBar->visible()) + H -= scrollbar_width(); + + // left margin + fl_rectf(text_area.x-LEFT_MARGIN, text_area.y-TOP_MARGIN, + LEFT_MARGIN, text_area.h+TOP_MARGIN+BOTTOM_MARGIN, + color()); + + // right margin + fl_rectf(text_area.x+text_area.w, text_area.y-TOP_MARGIN, + RIGHT_MARGIN, text_area.h+TOP_MARGIN+BOTTOM_MARGIN, + color()); + + // top margin + fl_rectf(text_area.x, text_area.y-TOP_MARGIN, + text_area.w, TOP_MARGIN, color()); + + // bottom margin + fl_rectf(text_area.x, text_area.y+text_area.h, + text_area.w, BOTTOM_MARGIN, color()); + + // draw that little box in the corner of the scrollbars + if (mVScrollBar->visible() && mHScrollBar->visible()) + fl_rectf(mVScrollBar->x(), mHScrollBar->y(), + mVScrollBar->w(), mHScrollBar->h(), + FL_GRAY); + + // blank the previous cursor protrusions + } + else if (damage() & (FL_DAMAGE_SCROLL | FL_DAMAGE_EXPOSE)) { +// printf("blanking previous cursor extrusions at Y: %d\n", mCursorOldY); + // CET - FIXME - save old cursor position instead and just draw side needed? + fl_push_clip(text_area.x-LEFT_MARGIN, + text_area.y, + text_area.w+LEFT_MARGIN+RIGHT_MARGIN, + text_area.h); + fl_rectf(text_area.x-LEFT_MARGIN, mCursorOldY, + LEFT_MARGIN, mMaxsize, color()); + fl_rectf(text_area.x+text_area.w, mCursorOldY, + RIGHT_MARGIN, mMaxsize, color()); + fl_pop_clip(); + } + + // draw the scrollbars + if (damage() & (FL_DAMAGE_ALL | FL_DAMAGE_CHILD)) { + mVScrollBar->damage(FL_DAMAGE_ALL); + mHScrollBar->damage(FL_DAMAGE_ALL); + } + update_child(*mVScrollBar); + update_child(*mHScrollBar); + + // draw all of the text + if (damage() & (FL_DAMAGE_ALL | FL_DAMAGE_EXPOSE)) { + //printf("drawing all text\n"); + int X, Y, W, H; + if (fl_clip_box(text_area.x, text_area.y, text_area.w, text_area.h, + X, Y, W, H)) { + // Draw text using the intersected clipping box... + // (this sets the clipping internally) + draw_text(X, Y, W, H); + } else { + // Draw the whole area... + draw_text(text_area.x, text_area.y, text_area.w, text_area.h); + } + } + else if (damage() & FL_DAMAGE_SCROLL) { + // draw some lines of text + fl_push_clip(text_area.x, text_area.y, + text_area.w, text_area.h); + //printf("drawing text from %d to %d\n", damage_range1_start, damage_range1_end); + draw_range(damage_range1_start, damage_range1_end); + if (damage_range2_end != -1) { + //printf("drawing text from %d to %d\n", damage_range2_start, damage_range2_end); + draw_range(damage_range2_start, damage_range2_end); + } + damage_range1_start = damage_range1_end = -1; + damage_range2_start = damage_range2_end = -1; + fl_pop_clip(); + } + + // draw the text cursor + if (damage() & (FL_DAMAGE_ALL | FL_DAMAGE_SCROLL | FL_DAMAGE_EXPOSE) + && !buffer()->primary_selection()->selected() && + mCursorOn && Fl::focus() == this ) { + fl_push_clip(text_area.x-LEFT_MARGIN, + text_area.y, + text_area.w+LEFT_MARGIN+RIGHT_MARGIN, + text_area.h); + + int X, Y; + if (position_to_xy(mCursorPos, &X, &Y)) draw_cursor(X, Y); +// else puts("position_to_xy() failed - unable to draw cursor!"); + //printf("drew cursor at pos: %d (%d,%d)\n", mCursorPos, X, Y); + mCursorOldY = Y; + fl_pop_clip(); + } + fl_pop_clip(); +} + +// this processes drag events due to mouse for Fl_Text_Display and +// also drags due to cursor movement with shift held down for +// Fl_Text_Editor +void fl_text_drag_me(int pos, Fl_Text_Display* d) { + if (d->dragType == Fl_Text_Display::DRAG_CHAR) { + if (pos >= d->dragPos) { + d->buffer()->select(d->dragPos, pos); + } else { + d->buffer()->select(pos, d->dragPos); + } + d->insert_position(pos); + } else if (d->dragType == Fl_Text_Display::DRAG_WORD) { + if (pos >= d->dragPos) { + d->insert_position(d->word_end(pos)); + d->buffer()->select(d->word_start(d->dragPos), d->word_end(pos)); + } else { + d->insert_position(d->word_start(pos)); + d->buffer()->select(d->word_start(pos), d->word_end(d->dragPos)); + } + } else if (d->dragType == Fl_Text_Display::DRAG_LINE) { + if (pos >= d->dragPos) { + d->insert_position(d->buffer()->line_end(pos)+1); + d->buffer()->select(d->buffer()->line_start(d->dragPos), + d->buffer()->line_end(pos)+1); + } else { + d->insert_position(d->buffer()->line_start(pos)); + d->buffer()->select(d->buffer()->line_start(pos), + d->buffer()->line_end(d->dragPos)+1); + } + } +} + +// This timer event scrolls the text view proportionally to +// how far the mouse pointer has left the text area. This +// allows for smooth scrolling without "wiggeling" the mouse. +void Fl_Text_Display::scroll_timer_cb(void *user_data) { + Fl_Text_Display *w = (Fl_Text_Display*)user_data; + int pos; + switch (scroll_direction) { + case 1: // mouse is to the right, scroll left + w->scroll(w->mTopLineNum, w->mHorizOffset + scroll_amount); + pos = w->xy_to_position(w->text_area.x + w->text_area.w, scroll_y, CURSOR_POS); + break; + case 2: // mouse is to the left, scroll right + w->scroll(w->mTopLineNum, w->mHorizOffset + scroll_amount); + pos = w->xy_to_position(w->text_area.x, scroll_y, CURSOR_POS); + break; + case 3: // mouse is above, scroll down + w->scroll(w->mTopLineNum + scroll_amount, w->mHorizOffset); + pos = w->xy_to_position(scroll_x, w->text_area.y, CURSOR_POS); + break; + case 4: // mouse is below, scroll up + w->scroll(w->mTopLineNum + scroll_amount, w->mHorizOffset); + pos = w->xy_to_position(scroll_x, w->text_area.y + w->text_area.h, CURSOR_POS); + break; + default: + return; + } + fl_text_drag_me(pos, w); + Fl::repeat_timeout(.1, scroll_timer_cb, user_data); +} + + +int Fl_Text_Display::handle(int event) { + if (!buffer()) return 0; + // This isn't very elegant! + if (!Fl::event_inside(text_area.x, text_area.y, text_area.w, text_area.h) && + !dragging && event != FL_LEAVE && event != FL_ENTER && + event != FL_MOVE && event != FL_FOCUS && event != FL_UNFOCUS && + event != FL_KEYBOARD && event != FL_KEYUP) { + return Fl_Group::handle(event); + } + + switch (event) { + case FL_ENTER: + case FL_MOVE: + if (active_r()) { + if (Fl::event_inside(text_area.x, text_area.y, text_area.w, + text_area.h)) window()->cursor(FL_CURSOR_INSERT); + else window()->cursor(FL_CURSOR_DEFAULT); + return 1; + } else { + return 0; + } + + case FL_LEAVE: + case FL_HIDE: + if (active_r() && window()) { + window()->cursor(FL_CURSOR_DEFAULT); + + return 1; + } else { + return 0; + } + + case FL_PUSH: { + if (active_r() && window()) { + if (Fl::event_inside(text_area.x, text_area.y, text_area.w, + text_area.h)) window()->cursor(FL_CURSOR_INSERT); + else window()->cursor(FL_CURSOR_DEFAULT); + } + + if (Fl::focus() != this) { + Fl::focus(this); + handle(FL_FOCUS); + } + if (Fl_Group::handle(event)) return 1; + if (Fl::event_state()&FL_SHIFT) return handle(FL_DRAG); + dragging = 1; + int pos = xy_to_position(Fl::event_x(), Fl::event_y(), CURSOR_POS); + dragType = Fl::event_clicks(); + dragPos = pos; + if (dragType == DRAG_CHAR) + buffer()->unselect(); + else if (dragType == DRAG_WORD) + buffer()->select(word_start(pos), word_end(pos)); + else if (dragType == DRAG_LINE) + buffer()->select(buffer()->line_start(pos), buffer()->line_end(pos)+1); + + if (buffer()->primary_selection()->selected()) + insert_position(buffer()->primary_selection()->end()); + else + insert_position(pos); + show_insert_position(); + return 1; + } + + case FL_DRAG: { + if (dragType < 0) return 1; + int X = Fl::event_x(), Y = Fl::event_y(), pos; + // if we leave the text_area, we start a timer event + // that will take care of scrolling and selecting + if (Y < text_area.y) { + scroll_x = X; + scroll_amount = (Y - text_area.y) / 5 - 1; + if (!scroll_direction) { + Fl::add_timeout(.01, scroll_timer_cb, this); + } + scroll_direction = 3; + } else if (Y >= text_area.y+text_area.h) { + scroll_x = X; + scroll_amount = (Y - text_area.y - text_area.h) / 5 + 1; + if (!scroll_direction) { + Fl::add_timeout(.01, scroll_timer_cb, this); + } + scroll_direction = 4; + } else if (X < text_area.x) { + scroll_y = Y; + scroll_amount = (X - text_area.x) / 2 - 1; + if (!scroll_direction) { + Fl::add_timeout(.01, scroll_timer_cb, this); + } + scroll_direction = 2; + } else if (X >= text_area.x+text_area.w) { + scroll_y = Y; + scroll_amount = (X - text_area.x - text_area.w) / 2 + 1; + if (!scroll_direction) { + Fl::add_timeout(.01, scroll_timer_cb, this); + } + scroll_direction = 1; + } else { + if (scroll_direction) { + Fl::remove_timeout(scroll_timer_cb, this); + scroll_direction = 0; + } + pos = xy_to_position(X, Y, CURSOR_POS); + fl_text_drag_me(pos, this); + } + return 1; + } + + case FL_RELEASE: { + dragging = 0; + if (scroll_direction) { + Fl::remove_timeout(scroll_timer_cb, this); + scroll_direction = 0; + } + + // convert from WORD or LINE selection to CHAR + if (insert_position() >= dragPos) + dragPos = buffer()->primary_selection()->start(); + else + dragPos = buffer()->primary_selection()->end(); + dragType = DRAG_CHAR; + + const char* copy = buffer()->selection_text(); + if (*copy) Fl::copy(copy, strlen(copy), 0); + free((void*)copy); + return 1; + } + + case FL_MOUSEWHEEL: + if (Fl::event_dy()) return mVScrollBar->handle(event); + else return mHScrollBar->handle(event); + + case FL_UNFOCUS: + if (active_r() && window()) window()->cursor(FL_CURSOR_DEFAULT); + case FL_FOCUS: + if (buffer()->selected()) { + int start, end; + if (buffer()->selection_position(&start, &end)) + redisplay_range(start, end); + } + if (buffer()->secondary_selected()) { + int start, end; + if (buffer()->secondary_selection_position(&start, &end)) + redisplay_range(start, end); + } + if (buffer()->highlight()) { + int start, end; + if (buffer()->highlight_position(&start, &end)) + redisplay_range(start, end); + } + return 1; + + case FL_KEYBOARD: + // Copy? + if ((Fl::event_state()&(FL_CTRL|FL_COMMAND)) && Fl::event_key()=='c') { + if (!buffer()->selected()) return 1; + const char *copy = buffer()->selection_text(); + if (*copy) Fl::copy(copy, strlen(copy), 1); + free((void*)copy); + return 1; + } + + // Select all ? + if ((Fl::event_state()&(FL_CTRL|FL_COMMAND)) && Fl::event_key()=='a') { + buffer()->select(0,buffer()->length()); + return 1; + } + + if (mVScrollBar->handle(event)) return 1; + if (mHScrollBar->handle(event)) return 1; + + break; + } + + return 0; +} + + +// +// End of "$Id: Fl_Text_Display.cxx 6105 2008-04-21 21:03:22Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Text_Editor.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Text_Editor.cxx new file mode 100644 index 0000000..4750896 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Text_Editor.cxx @@ -0,0 +1,492 @@ +// +// "$Id: Fl_Text_Editor.cxx 5671 2007-02-08 07:58:47Z matt $" +// +// Copyright 2001-2006 by Bill Spitzak and others. +// Original code Copyright Mark Edel. Permission to distribute under +// the LGPL for the FLTK library granted by Mark Edel. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include "flstring.h" +#include +#include +#include +#include +#include + + +Fl_Text_Editor::Fl_Text_Editor(int X, int Y, int W, int H, const char* l) + : Fl_Text_Display(X, Y, W, H, l) { + mCursorOn = 1; + insert_mode_ = 1; + key_bindings = 0; + + // handle the default key bindings + add_default_key_bindings(&key_bindings); + + // handle everything else + default_key_function(kf_default); +} + +Fl_Text_Editor::Key_Binding* Fl_Text_Editor::global_key_bindings = 0; + +// These are the default key bindings every widget should start with +static struct { + int key; + int state; + Fl_Text_Editor::Key_Func func; +} default_key_bindings[] = { + { FL_Escape, FL_TEXT_EDITOR_ANY_STATE, Fl_Text_Editor::kf_ignore }, + { FL_Enter, FL_TEXT_EDITOR_ANY_STATE, Fl_Text_Editor::kf_enter }, + { FL_KP_Enter, FL_TEXT_EDITOR_ANY_STATE, Fl_Text_Editor::kf_enter }, + { FL_BackSpace, FL_TEXT_EDITOR_ANY_STATE, Fl_Text_Editor::kf_backspace }, + { FL_Insert, FL_TEXT_EDITOR_ANY_STATE, Fl_Text_Editor::kf_insert }, + { FL_Delete, FL_TEXT_EDITOR_ANY_STATE, Fl_Text_Editor::kf_delete }, + { FL_Home, 0, Fl_Text_Editor::kf_move }, + { FL_End, 0, Fl_Text_Editor::kf_move }, + { FL_Left, 0, Fl_Text_Editor::kf_move }, + { FL_Up, 0, Fl_Text_Editor::kf_move }, + { FL_Right, 0, Fl_Text_Editor::kf_move }, + { FL_Down, 0, Fl_Text_Editor::kf_move }, + { FL_Page_Up, 0, Fl_Text_Editor::kf_move }, + { FL_Page_Down, 0, Fl_Text_Editor::kf_move }, + { FL_Home, FL_SHIFT, Fl_Text_Editor::kf_shift_move }, + { FL_End, FL_SHIFT, Fl_Text_Editor::kf_shift_move }, + { FL_Left, FL_SHIFT, Fl_Text_Editor::kf_shift_move }, + { FL_Up, FL_SHIFT, Fl_Text_Editor::kf_shift_move }, + { FL_Right, FL_SHIFT, Fl_Text_Editor::kf_shift_move }, + { FL_Down, FL_SHIFT, Fl_Text_Editor::kf_shift_move }, + { FL_Page_Up, FL_SHIFT, Fl_Text_Editor::kf_shift_move }, + { FL_Page_Down, FL_SHIFT, Fl_Text_Editor::kf_shift_move }, + { FL_Home, FL_CTRL, Fl_Text_Editor::kf_ctrl_move }, + { FL_End, FL_CTRL, Fl_Text_Editor::kf_ctrl_move }, + { FL_Left, FL_CTRL, Fl_Text_Editor::kf_ctrl_move }, + { FL_Up, FL_CTRL, Fl_Text_Editor::kf_ctrl_move }, + { FL_Right, FL_CTRL, Fl_Text_Editor::kf_ctrl_move }, + { FL_Down, FL_CTRL, Fl_Text_Editor::kf_ctrl_move }, + { FL_Page_Up, FL_CTRL, Fl_Text_Editor::kf_ctrl_move }, + { FL_Page_Down, FL_CTRL, Fl_Text_Editor::kf_ctrl_move }, + { FL_Home, FL_CTRL|FL_SHIFT, Fl_Text_Editor::kf_c_s_move }, + { FL_End, FL_CTRL|FL_SHIFT, Fl_Text_Editor::kf_c_s_move }, + { FL_Left, FL_CTRL|FL_SHIFT, Fl_Text_Editor::kf_c_s_move }, + { FL_Up, FL_CTRL|FL_SHIFT, Fl_Text_Editor::kf_c_s_move }, + { FL_Right, FL_CTRL|FL_SHIFT, Fl_Text_Editor::kf_c_s_move }, + { FL_Down, FL_CTRL|FL_SHIFT, Fl_Text_Editor::kf_c_s_move }, + { FL_Page_Up, FL_CTRL|FL_SHIFT, Fl_Text_Editor::kf_c_s_move }, + { FL_Page_Down, FL_CTRL|FL_SHIFT, Fl_Text_Editor::kf_c_s_move }, +//{ FL_Clear, 0, Fl_Text_Editor::delete_to_eol }, + { 'z', FL_CTRL, Fl_Text_Editor::kf_undo }, + { '/', FL_CTRL, Fl_Text_Editor::kf_undo }, + { 'x', FL_CTRL, Fl_Text_Editor::kf_cut }, + { FL_Delete, FL_SHIFT, Fl_Text_Editor::kf_cut }, + { 'c', FL_CTRL, Fl_Text_Editor::kf_copy }, + { FL_Insert, FL_CTRL, Fl_Text_Editor::kf_copy }, + { 'v', FL_CTRL, Fl_Text_Editor::kf_paste }, + { FL_Insert, FL_SHIFT, Fl_Text_Editor::kf_paste }, + { 'a', FL_CTRL, Fl_Text_Editor::kf_select_all }, + +#ifdef __APPLE__ + // Define CMD+key accelerators... + { 'z', FL_COMMAND, Fl_Text_Editor::kf_undo }, + { 'x', FL_COMMAND, Fl_Text_Editor::kf_cut }, + { 'c', FL_COMMAND, Fl_Text_Editor::kf_copy }, + { 'v', FL_COMMAND, Fl_Text_Editor::kf_paste }, + { 'a', FL_COMMAND, Fl_Text_Editor::kf_select_all }, +#endif // __APPLE__ + + { 0, 0, 0 } +}; + +void Fl_Text_Editor::add_default_key_bindings(Key_Binding** list) { + for (int i = 0; default_key_bindings[i].key; i++) { + add_key_binding(default_key_bindings[i].key, + default_key_bindings[i].state, + default_key_bindings[i].func, + list); + } +} + +Fl_Text_Editor::Key_Func +Fl_Text_Editor::bound_key_function(int key, int state, Key_Binding* list) { + Key_Binding* cur; + for (cur = list; cur; cur = cur->next) + if (cur->key == key) + if (cur->state == FL_TEXT_EDITOR_ANY_STATE || cur->state == state) + break; + if (!cur) return 0; + return cur->function; +} + +void +Fl_Text_Editor::remove_all_key_bindings(Key_Binding** list) { + Key_Binding *cur, *next; + for (cur = *list; cur; cur = next) { + next = cur->next; + delete cur; + } + *list = 0; +} + +void +Fl_Text_Editor::remove_key_binding(int key, int state, Key_Binding** list) { + Key_Binding *cur, *last = 0; + for (cur = *list; cur; last = cur, cur = cur->next) + if (cur->key == key && cur->state == state) break; + if (!cur) return; + if (last) last->next = cur->next; + else *list = cur->next; + delete cur; +} + +void +Fl_Text_Editor::add_key_binding(int key, int state, Key_Func function, + Key_Binding** list) { + Key_Binding* kb = new Key_Binding; + kb->key = key; + kb->state = state; + kb->function = function; + kb->next = *list; + *list = kb; +} + +//////////////////////////////////////////////////////////////// + +#define NORMAL_INPUT_MOVE 0 + +static void kill_selection(Fl_Text_Editor* e) { + if (e->buffer()->selected()) { + e->insert_position(e->buffer()->primary_selection()->start()); + e->buffer()->remove_selection(); + } +} + +int Fl_Text_Editor::kf_default(int c, Fl_Text_Editor* e) { + if (!c || (!isprint(c) && c != '\t')) return 0; + char s[2] = "\0"; + s[0] = (char)c; + kill_selection(e); + if (e->insert_mode()) e->insert(s); + else e->overstrike(s); + e->show_insert_position(); + e->set_changed(); + if (e->when()&FL_WHEN_CHANGED) e->do_callback(); + return 1; +} + +int Fl_Text_Editor::kf_ignore(int, Fl_Text_Editor*) { + return 0; // don't handle +} + +int Fl_Text_Editor::kf_backspace(int, Fl_Text_Editor* e) { + if (!e->buffer()->selected() && e->move_left()) + e->buffer()->select(e->insert_position(), e->insert_position()+1); + kill_selection(e); + e->show_insert_position(); + e->set_changed(); + if (e->when()&FL_WHEN_CHANGED) e->do_callback(); + return 1; +} + +int Fl_Text_Editor::kf_enter(int, Fl_Text_Editor* e) { + kill_selection(e); + e->insert("\n"); + e->show_insert_position(); + e->set_changed(); + if (e->when()&FL_WHEN_CHANGED) e->do_callback(); + return 1; +} + +extern void fl_text_drag_me(int pos, Fl_Text_Display* d); + +int Fl_Text_Editor::kf_move(int c, Fl_Text_Editor* e) { + int i; + int selected = e->buffer()->selected(); + if (!selected) + e->dragPos = e->insert_position(); + e->buffer()->unselect(); + switch (c) { + case FL_Home: + e->insert_position(e->buffer()->line_start(e->insert_position())); + break; + case FL_End: + e->insert_position(e->buffer()->line_end(e->insert_position())); + break; + case FL_Left: + e->move_left(); + break; + case FL_Right: + e->move_right(); + break; + case FL_Up: + e->move_up(); + break; + case FL_Down: + e->move_down(); + break; + case FL_Page_Up: + for (i = 0; i < e->mNVisibleLines - 1; i++) e->move_up(); + break; + case FL_Page_Down: + for (i = 0; i < e->mNVisibleLines - 1; i++) e->move_down(); + break; + } + e->show_insert_position(); + return 1; +} + +int Fl_Text_Editor::kf_shift_move(int c, Fl_Text_Editor* e) { + kf_move(c, e); + fl_text_drag_me(e->insert_position(), e); + return 1; +} + +int Fl_Text_Editor::kf_ctrl_move(int c, Fl_Text_Editor* e) { + if (!e->buffer()->selected()) + e->dragPos = e->insert_position(); + if (c != FL_Up && c != FL_Down) { + e->buffer()->unselect(); + e->show_insert_position(); + } + switch (c) { + case FL_Home: + e->insert_position(0); + e->scroll(0, 0); + break; + case FL_End: + e->insert_position(e->buffer()->length()); + e->scroll(e->count_lines(0, e->buffer()->length(), 1), 0); + break; + case FL_Left: + e->previous_word(); + break; + case FL_Right: + e->next_word(); + break; + case FL_Up: + e->scroll(e->mTopLineNum-1, e->mHorizOffset); + break; + case FL_Down: + e->scroll(e->mTopLineNum+1, e->mHorizOffset); + break; + case FL_Page_Up: + e->insert_position(e->mLineStarts[0]); + break; + case FL_Page_Down: + e->insert_position(e->mLineStarts[e->mNVisibleLines-2]); + break; + } + return 1; +} + +int Fl_Text_Editor::kf_c_s_move(int c, Fl_Text_Editor* e) { + kf_ctrl_move(c, e); + fl_text_drag_me(e->insert_position(), e); + return 1; +} + +int Fl_Text_Editor::kf_home(int, Fl_Text_Editor* e) { + return kf_move(FL_Home, e); +} + +int Fl_Text_Editor::kf_end(int, Fl_Text_Editor* e) { + return kf_move(FL_End, e); +} + +int Fl_Text_Editor::kf_left(int, Fl_Text_Editor* e) { + return kf_move(FL_Left, e); +} + +int Fl_Text_Editor::kf_up(int, Fl_Text_Editor* e) { + return kf_move(FL_Up, e); +} + +int Fl_Text_Editor::kf_right(int, Fl_Text_Editor* e) { + return kf_move(FL_Right, e); +} + +int Fl_Text_Editor::kf_down(int, Fl_Text_Editor* e) { + return kf_move(FL_Down, e); +} + +int Fl_Text_Editor::kf_page_up(int, Fl_Text_Editor* e) { + return kf_move(FL_Page_Up, e); +} + +int Fl_Text_Editor::kf_page_down(int, Fl_Text_Editor* e) { + return kf_move(FL_Page_Down, e); +} + + +int Fl_Text_Editor::kf_insert(int, Fl_Text_Editor* e) { + e->insert_mode(e->insert_mode() ? 0 : 1); + return 1; +} + +int Fl_Text_Editor::kf_delete(int, Fl_Text_Editor* e) { + if (!e->buffer()->selected()) + e->buffer()->select(e->insert_position(), e->insert_position()+1); + kill_selection(e); + e->show_insert_position(); + e->set_changed(); + if (e->when()&FL_WHEN_CHANGED) e->do_callback(); + return 1; +} + +int Fl_Text_Editor::kf_copy(int, Fl_Text_Editor* e) { + if (!e->buffer()->selected()) return 1; + const char *copy = e->buffer()->selection_text(); + if (*copy) Fl::copy(copy, strlen(copy), 1); + free((void*)copy); + e->show_insert_position(); + return 1; +} + +int Fl_Text_Editor::kf_cut(int c, Fl_Text_Editor* e) { + kf_copy(c, e); + kill_selection(e); + e->set_changed(); + if (e->when()&FL_WHEN_CHANGED) e->do_callback(); + return 1; +} + +int Fl_Text_Editor::kf_paste(int, Fl_Text_Editor* e) { + kill_selection(e); + Fl::paste(*e, 1); + e->show_insert_position(); + e->set_changed(); + if (e->when()&FL_WHEN_CHANGED) e->do_callback(); + return 1; +} + +int Fl_Text_Editor::kf_select_all(int, Fl_Text_Editor* e) { + e->buffer()->select(0, e->buffer()->length()); + return 1; +} + +int Fl_Text_Editor::kf_undo(int , Fl_Text_Editor* e) { + e->buffer()->unselect(); + int crsr; + int ret = e->buffer()->undo(&crsr); + e->insert_position(crsr); + e->show_insert_position(); + e->set_changed(); + if (e->when()&FL_WHEN_CHANGED) e->do_callback(); + return ret; +} + +int Fl_Text_Editor::handle_key() { + // Call FLTK's rules to try to turn this into a printing character. + // This uses the right-hand ctrl key as a "compose prefix" and returns + // the changes that should be made to the text, as a number of + // bytes to delete and a string to insert: + int del; + if (Fl::compose(del)) { + if (del) buffer()->select(insert_position()-del, insert_position()); + kill_selection(this); + if (Fl::event_length()) { + if (insert_mode()) insert(Fl::event_text()); + else overstrike(Fl::event_text()); + } + show_insert_position(); + set_changed(); + if (when()&FL_WHEN_CHANGED) do_callback(); + return 1; + } + + int key = Fl::event_key(), state = Fl::event_state(), c = Fl::event_text()[0]; + state &= FL_SHIFT|FL_CTRL|FL_ALT|FL_META; // only care about these states + Key_Func f; + f = bound_key_function(key, state, global_key_bindings); + if (!f) f = bound_key_function(key, state, key_bindings); + if (f) return f(key, this); + if (default_key_function_ && !state) return default_key_function_(c, this); + return 0; +} + +void Fl_Text_Editor::maybe_do_callback() { +// printf("Fl_Text_Editor::maybe_do_callback()\n"); +// printf("changed()=%d, when()=%x\n", changed(), when()); + if (changed() || (when()&FL_WHEN_NOT_CHANGED)) do_callback(); +} + +int Fl_Text_Editor::handle(int event) { + if (!buffer()) return 0; + + switch (event) { + case FL_FOCUS: + show_cursor(mCursorOn); // redraws the cursor + if (buffer()->selected()) redraw(); // Redraw selections... + Fl::focus(this); + return 1; + + case FL_UNFOCUS: + show_cursor(mCursorOn); // redraws the cursor + if (buffer()->selected()) redraw(); // Redraw selections... + case FL_HIDE: + if (when() & FL_WHEN_RELEASE) maybe_do_callback(); + return 1; + + case FL_KEYBOARD: + if (active_r() && window() && this == Fl::belowmouse()) + window()->cursor(FL_CURSOR_NONE); + return handle_key(); + + case FL_PASTE: + if (!Fl::event_text()) { + fl_beep(); + return 1; + } + buffer()->remove_selection(); + if (insert_mode()) insert(Fl::event_text()); + else overstrike(Fl::event_text()); + show_insert_position(); + set_changed(); + if (when()&FL_WHEN_CHANGED) do_callback(); + return 1; + + case FL_ENTER: +// MRS: WIN32 only? Need to test! +// case FL_MOVE: + show_cursor(mCursorOn); + return 1; + + case FL_PUSH: + if (Fl::event_button() == 2) { + // don't let the text_display see this event + if (Fl_Group::handle(event)) return 1; + dragType = -1; + Fl::paste(*this, 0); + Fl::focus(this); + set_changed(); + if (when()&FL_WHEN_CHANGED) do_callback(); + return 1; + } + break; + } + + return Fl_Text_Display::handle(event); +} + +// +// End of "$Id: Fl_Text_Editor.cxx 5671 2007-02-08 07:58:47Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Tile.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Tile.cxx new file mode 100644 index 0000000..97590f4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Tile.cxx @@ -0,0 +1,207 @@ +// +// "$Id: Fl_Tile.cxx 5606 2007-01-18 10:01:24Z matt $" +// +// Tile widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Group of 2 or 4 "tiles" that can be resized by dragging border +// The size of the first child determines where the resize border is. +// The resizebox is used to limit where the border can be dragged to. + +#include +#include +#include +#include + +// Drag the edges that were initially at oldx,oldy to newx,newy: +// pass zero as oldx or oldy to disable drag in that direction: + +void Fl_Tile::position(int oix, int oiy, int newx, int newy) { + Fl_Widget*const* a = array(); + short* p = sizes(); + p += 8; // skip group & resizable's saved size + for (int i=children(); i--; p += 4) { + Fl_Widget* o = *a++; + if (o == resizable()) continue; + int X = o->x(); + int R = X+o->w(); + if (oix) { + int t = p[0]; + if (t == oix || t>oix && Xnewx) X = newx; + t = p[1]; + if (t == oix || t>oix && Rnewx) R = newx; + } + int Y = o->y(); + int B = Y+o->h(); + if (oiy) { + int t = p[2]; + if (t == oiy || t>oiy && Ynewy) Y = newy; + t = p[3]; + if (t == oiy || t>oiy && Bnewy) B = newy; + } + o->damage_resize(X,Y,R-X,B-Y); + } +} + +// move the lower-right corner (sort of): +void Fl_Tile::resize(int X,int Y,int W,int H) { + //Fl_Group::resize(X, Y, W, H); + //return; + // remember how much to move the child widgets: + int dx = X-x(); + int dy = Y-y(); + int dw = W-w(); + int dh = H-h(); + short* p = sizes(); + // resize this (skip the Fl_Group resize): + Fl_Widget::resize(X,Y,W,H); + // find bottom-right of resiable: + int OR = p[5]; + int NR = X+W-(p[1]-OR); + int OB = p[7]; + int NB = Y+H-(p[3]-OB); + // move everything to be on correct side of new resizable: + Fl_Widget*const* a = array(); + p += 8; + for (int i=children(); i--;) { + Fl_Widget* o = *a++; + int xx = o->x()+dx; + int R = xx+o->w(); + if (*p++ >= OR) xx += dw; else if (xx > NR) xx = NR; + if (*p++ >= OR) R += dw; else if (R > NR) R = NR; + int yy = o->y()+dy; + int B = yy+o->h(); + if (*p++ >= OB) yy += dh; else if (yy > NB) yy = NB; + if (*p++ >= OB) B += dh; else if (B > NB) B = NB; + o->resize(xx,yy,R-xx,B-yy); + // do *not* call o->redraw() here! If you do, and the tile is inside a + // scroll, it'll set the damage areas wrong for all children! + } +} + +static void set_cursor(Fl_Tile*t, Fl_Cursor c) { + static Fl_Cursor cursor; + if (cursor == c || !t->window()) return; + cursor = c; +#ifdef __sgi + t->window()->cursor(c,FL_RED,FL_WHITE); +#else + t->window()->cursor(c); +#endif +} + +static Fl_Cursor cursors[4] = { + FL_CURSOR_DEFAULT, + FL_CURSOR_WE, + FL_CURSOR_NS, + FL_CURSOR_MOVE}; + +int Fl_Tile::handle(int event) { + static int sdrag; + static int sdx, sdy; + static int sx, sy; +#define DRAGH 1 +#define DRAGV 2 +#define GRABAREA 4 + + int mx = Fl::event_x(); + int my = Fl::event_y(); + + switch (event) { + + case FL_MOVE: + case FL_ENTER: + case FL_PUSH: { + int mindx = 100; + int mindy = 100; + int oldx = 0; + int oldy = 0; + Fl_Widget*const* a = array(); + short* q = sizes(); + short* p = q+8; + for (int i=children(); i--; p += 4) { + Fl_Widget* o = *a++; + if (o == resizable()) continue; + if (p[1]y()<=my+GRABAREA && o->y()+o->h()>=my-GRABAREA) { + int t = mx - (o->x()+o->w()); + if (abs(t) < mindx) { + sdx = t; + mindx = abs(t); + oldx = p[1]; + } + } + if (p[3]x()<=mx+GRABAREA && o->x()+o->w()>=mx-GRABAREA) { + int t = my - (o->y()+o->h()); + if (abs(t) < mindy) { + sdy = t; + mindy = abs(t); + oldy = p[3]; + } + } + } + sdrag = 0; sx = sy = 0; + if (mindx <= GRABAREA) {sdrag = DRAGH; sx = oldx;} + if (mindy <= GRABAREA) {sdrag |= DRAGV; sy = oldy;} + set_cursor(this, cursors[sdrag]); + if (sdrag) return 1; + return Fl_Group::handle(event); + } + + case FL_LEAVE: + set_cursor(this, FL_CURSOR_DEFAULT); + break; + + case FL_DRAG: + // This is necessary if CONSOLIDATE_MOTION in Fl_x.cxx is turned off: + // if (damage()) return 1; // don't fall behind + case FL_RELEASE: { + if (!sdrag) return 0; // should not happen + Fl_Widget* r = resizable(); if (!r) r = this; + int newx; + if (sdrag&DRAGH) { + newx = Fl::event_x()-sdx; + if (newx < r->x()) newx = r->x(); + else if (newx > r->x()+r->w()) newx = r->x()+r->w(); + } else + newx = sx; + int newy; + if (sdrag&DRAGV) { + newy = Fl::event_y()-sdy; + if (newy < r->y()) newy = r->y(); + else if (newy > r->y()+r->h()) newy = r->y()+r->h(); + } else + newy = sy; + position(sx,sy,newx,newy); + if (event == FL_DRAG) set_changed(); + do_callback(); + return 1;} + + } + + return Fl_Group::handle(event); +} + +// +// End of "$Id: Fl_Tile.cxx 5606 2007-01-18 10:01:24Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Tiled_Image.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Tiled_Image.cxx new file mode 100644 index 0000000..289bcab --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Tiled_Image.cxx @@ -0,0 +1,139 @@ +// +// "$Id: Fl_Tiled_Image.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Tiled image code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include + + +// +// 'Fl_Tiled_Image::Fl_Tiled_Image()' - Constructor. +// +// Use a width and height of 0 to tile the whole window/widget. +// + +Fl_Tiled_Image::Fl_Tiled_Image(Fl_Image *i, // I - Image to tile + int W, // I - Width of tiled area + int H) : // I - Height of tiled area + Fl_Image(W,H,0) { + image_ = i; + alloc_image_ = 0; + + if (W == 0) w(Fl::w()); + if (H == 0) h(Fl::h()); +} + + +// +// 'Fl_Tiled_Image::~Fl_Tiled_Image()' - Destructor. +// + +Fl_Tiled_Image::~Fl_Tiled_Image() { + if (alloc_image_) delete image_; +} + + +// +// 'Fl_Tiled_Image::copy()' - Copy and resize a tiled image... +// + +Fl_Image * // O - New image +Fl_Tiled_Image::copy(int W, // I - New width + int H) { // I - New height + if (W == w() && H == h()) return this; + else return new Fl_Tiled_Image(image_, W, H); +} + + +// +// 'Fl_Tiled_Image::color_average()' - Blend colors... +// + +void +Fl_Tiled_Image::color_average(Fl_Color c, // I - Color to blend with + float i) { // I - Blend fraction + if (!alloc_image_) { + image_ = image_->copy(); + alloc_image_ = 1; + } + + image_->color_average(c, i); +} + + +// +// 'Fl_Tiled_Image::desaturate()' - Convert the image to grayscale... +// + +void +Fl_Tiled_Image::desaturate() { + if (!alloc_image_) { + image_ = image_->copy(); + alloc_image_ = 1; + } + + image_->desaturate(); +} + + +// +// 'Fl_Tiled_Image::draw()' - Draw a shared image... +// + +void +Fl_Tiled_Image::draw(int X, // I - Starting X position + int Y, // I - Starting Y position + int W, // I - Width of area to be filled + int H, // I - Height of area to be filled + int cx, // I - "Source" X position + int cy) { // I - "Source" Y position + if (!image_->w() || !image_->h()) return; + if (W == 0) W = Fl::w(); + if (H == 0) H = Fl::h(); + + fl_clip(X, Y, W, H); + + X += cx; + Y += cy; + + X = X - (X % image_->w()); + Y = Y - (Y % image_->h()); + + W += X; + H += Y; + + for (int yy = Y; yy < H; yy += image_->h()) + for (int xx = X; xx < W; xx += image_->w()) + image_->draw(xx, yy); + + fl_pop_clip(); +} + + +// +// End of "$Id: Fl_Tiled_Image.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Tooltip.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Tooltip.cxx new file mode 100644 index 0000000..4eb99b6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Tooltip.cxx @@ -0,0 +1,263 @@ +// +// "$Id: Fl_Tooltip.cxx 5848 2007-05-20 16:18:31Z mike $" +// +// Tooltip source file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include + +#include + +float Fl_Tooltip::delay_ = 1.0f; +float Fl_Tooltip::hoverdelay_ = 0.2f; +int Fl_Tooltip::enabled_ = 1; +unsigned Fl_Tooltip::color_ = fl_color_cube(FL_NUM_RED - 1, + FL_NUM_GREEN - 1, + FL_NUM_BLUE - 2); +unsigned Fl_Tooltip::textcolor_ = FL_BLACK; +int Fl_Tooltip::font_ = FL_HELVETICA; +int Fl_Tooltip::size_ = FL_NORMAL_SIZE; + +#define MAX_WIDTH 400 + +static const char* tip; + +class Fl_TooltipBox : public Fl_Menu_Window { +public: + Fl_TooltipBox() : Fl_Menu_Window(0, 0) { + set_override(); + end(); + } + void draw(); + void layout(); + void show() { + if (tip) Fl_Menu_Window::show(); + } +}; + +Fl_Widget* Fl_Tooltip::widget_ = 0; +static Fl_TooltipBox *window = 0; +static int Y,H; + +void Fl_TooltipBox::layout() { + fl_font(Fl_Tooltip::font(), Fl_Tooltip::size()); + int ww, hh; + ww = MAX_WIDTH; + fl_measure(tip, ww, hh, FL_ALIGN_LEFT|FL_ALIGN_WRAP|FL_ALIGN_INSIDE); + ww += 6; hh += 6; + + // find position on the screen of the widget: + int ox = Fl::event_x_root(); + int oy = Y + H+2; + for (Fl_Widget* p = Fl_Tooltip::current(); p; p = p->window()) { + oy += p->y(); + } + int scr_x, scr_y, scr_w, scr_h; + Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h); + if (ox+ww > scr_x+scr_w) ox = scr_x+scr_w - ww; + if (ox < scr_x) ox = scr_x; + if (H > 30) { + oy = Fl::event_y_root()+13; + if (oy+hh > scr_y+scr_h) oy -= 23+hh; + } else { + if (oy+hh > scr_y+scr_h) oy -= (4+hh+H); + } + if (oy < scr_y) oy = scr_y; + + resize(ox, oy, ww, hh); +} + +void Fl_TooltipBox::draw() { + draw_box(FL_BORDER_BOX, 0, 0, w(), h(), Fl_Tooltip::color()); + fl_color(Fl_Tooltip::textcolor()); + fl_font(Fl_Tooltip::font(), Fl_Tooltip::size()); + fl_draw(tip, 3, 3, w()-6, h()-6, Fl_Align(FL_ALIGN_LEFT|FL_ALIGN_WRAP)); +} + +static char recent_tooltip; + +static void recent_timeout(void*) { +#ifdef DEBUG + puts("recent_timeout();"); +#endif // DEBUG + + recent_tooltip = 0; +} + +static char recursion; + +static void tooltip_timeout(void*) { +#ifdef DEBUG + puts("tooltip_timeout();"); +#endif // DEBUG + + if (recursion) return; + recursion = 1; + if (!tip || !*tip) { + if (window) window->hide(); + } else { + //if (Fl::grab()) return; + if (!window) window = new Fl_TooltipBox; + // this cast bypasses the normal Fl_Window label() code: + ((Fl_Widget*)window)->label(tip); + window->layout(); + window->redraw(); +// printf("tooltip_timeout: Showing window %p with tooltip \"%s\"...\n", +// window, tip ? tip : "(null)"); + window->show(); + } + + Fl::remove_timeout(recent_timeout); + recent_tooltip = 1; + recursion = 0; +} + +// If this widget or one of it's parents has a tooltip, enter it. This +// will do nothing if this is the current widget (even if the mouse moved +// out so an exit() was done and then moved back in). If no tooltip can +// be found do Fl_Tooltip::exit_(). If you don't want this behavior (for instance +// if you want the tooltip to reappear when the mouse moves back in) +// call the fancier enter_area() below. +void +Fl_Tooltip::enter_(Fl_Widget* w) { +#ifdef DEBUG + printf("Fl_Tooltip::enter_(w=%p)\n", w); + printf(" window=%p\n", window); +#endif // DEBUG + + // find the enclosing group with a tooltip: + Fl_Widget* tw = w; + for (;;) { + if (!tw) {exit_(0); return;} + if (tw == widget_) return; + if (tw->tooltip()) break; + tw = tw->parent(); + } + enter_area(w, 0, 0, w->w(), w->h(), tw->tooltip()); +} + +// Acts as though enter(widget) was done but does not pop up a +// tooltip. This is useful to prevent a tooltip from reappearing when +// a modal overlapping window is deleted. FLTK does this automatically +// when you click the mouse button. +void Fl_Tooltip::current(Fl_Widget* w) { +#ifdef DEBUG + printf("Fl_Tooltip::current(w=%p)\n", w); +#endif // DEBUG + + exit_(0); + // find the enclosing group with a tooltip: + Fl_Widget* tw = w; + for (;;) { + if (!tw) return; + if (tw->tooltip()) break; + tw = tw->parent(); + } + // act just like Fl_Tooltip::enter_() except we can remember a zero: + widget_ = w; +} + +// Hide any visible tooltip. +void +Fl_Tooltip::exit_(Fl_Widget *w) { +#ifdef DEBUG + printf("Fl_Tooltip::exit_(w=%p)\n", w); + printf(" widget=%p, window=%p\n", widget_, window); +#endif // DEBUG + + if (!widget_ || w == window) return; + widget_ = 0; + Fl::remove_timeout(tooltip_timeout); + Fl::remove_timeout(recent_timeout); + if (window && window->visible()) window->hide(); + if (recent_tooltip) { + if (Fl::event_state() & FL_BUTTONS) recent_tooltip = 0; + else Fl::add_timeout(Fl_Tooltip::hoverdelay(), recent_timeout); + } +} + +// Get ready to display a tooltip. The widget and the xywh box inside +// it define an area the tooltip is for, this along with the current +// mouse position places the tooltip (the mouse is assummed to point +// inside or near the box). +void +Fl_Tooltip::enter_area(Fl_Widget* wid, int x,int y,int w,int h, const char* t) +{ + (void)x; + (void)w; + +#ifdef DEBUG + printf("Fl_Tooltip::enter_area(wid=%p, x=%d, y=%d, w=%d, h=%d, t=\"%s\")\n", + wid, x, y, w, h, t ? t : "(null)"); + printf(" recursion=%d, window=%p\n", recursion, window); +#endif // DEBUG + + if (recursion) return; + if (!t || !*t || !enabled()) { + exit_(0); + return; + } + // do nothing if it is the same: + if (wid==widget_ /*&& x==X && y==Y && w==W && h==H*/ && t==tip) return; + Fl::remove_timeout(tooltip_timeout); + Fl::remove_timeout(recent_timeout); + // remember it: + widget_ = wid; Y = y; H = h; tip = t; + // popup the tooltip immediately if it was recently up: + if (recent_tooltip) { + if (window) window->hide(); + Fl::add_timeout(Fl_Tooltip::hoverdelay(), tooltip_timeout); + } else if (Fl_Tooltip::delay() < .1) { +#ifdef WIN32 + // possible fix for the Windows titlebar, it seems to want the + // window to be destroyed, moving it messes up the parenting: + if (window && window->visible()) window->hide(); +#endif // WIN32 + tooltip_timeout(0); + } else { + if (window && window->visible()) window->hide(); + Fl::add_timeout(Fl_Tooltip::delay(), tooltip_timeout); + } + +#ifdef DEBUG + printf(" tip=\"%s\", window->shown()=%d\n", tip ? tip : "(null)", + window ? window->shown() : 0); +#endif // DEBUG +} + +void Fl_Widget::tooltip(const char *tt) { + static char beenhere = 0; + if (!beenhere) { + beenhere = 1; + Fl_Tooltip::enter = Fl_Tooltip::enter_; + Fl_Tooltip::exit = Fl_Tooltip::exit_; + } + tooltip_ = tt; +} + +// +// End of "$Id: Fl_Tooltip.cxx 5848 2007-05-20 16:18:31Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Valuator.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Valuator.cxx new file mode 100644 index 0000000..bdb829a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Valuator.cxx @@ -0,0 +1,149 @@ +// +// "$Id: Fl_Valuator.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Valuator widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Base class for sliders and all other one-value "knobs" + +#include +#include +#include +#include +#include "flstring.h" + +Fl_Valuator::Fl_Valuator(int X, int Y, int W, int H, const char* L) + : Fl_Widget(X,Y,W,H,L) { + align(FL_ALIGN_BOTTOM); + when(FL_WHEN_CHANGED); + value_ = 0; + previous_value_ = 1; + min = 0; + max = 1; + A = 0.0; + B = 1; +} + +const double epsilon = 4.66e-10; + +void Fl_Valuator::step(double s) { + if (s < 0) s = -s; + A = rint(s); + B = 1; + while (fabs(s-A/B) > epsilon && B<=(0x7fffffff/10)) {B *= 10; A = rint(s*B);} +} + +void Fl_Valuator::precision(int p) { + A = 1.0; + for (B = 1; p--;) B *= 10; +} + +void Fl_Valuator::value_damage() {damage(FL_DAMAGE_EXPOSE);} // by default do partial-redraw + +int Fl_Valuator::value(double v) { + clear_changed(); + if (v == value_) return 0; + value_ = v; + value_damage(); + return 1; +} + +double Fl_Valuator::softclamp(double v) { + int which = (min<=max); + double p = previous_value_; + if ((vmax)==which && p!=max && (p>max)!=which) return max; + else return v; +} + +// inline void Fl_Valuator::handle_push() {previous_value_ = value_;} + +void Fl_Valuator::handle_drag(double v) { + if (v != value_) { + value_ = v; + value_damage(); + set_changed(); + if (when() & FL_WHEN_CHANGED) do_callback(); + } +} + +void Fl_Valuator::handle_release() { + if (when()&FL_WHEN_RELEASE) { + // insure changed() is off even if no callback is done. It may have + // been turned on by the drag, and then the slider returned to it's + // initial position: + clear_changed(); + // now do the callback only if slider in new position or always is on: + if (value_ != previous_value_ || when() & FL_WHEN_NOT_CHANGED) { + do_callback(); + } + } +} + +double Fl_Valuator::round(double v) { + if (A) return rint(v*B/A)*A/B; + else return v; +} + +double Fl_Valuator::clamp(double v) { + if ((vmax)==(min<=max)) return max; + else return v; +} + +double Fl_Valuator::increment(double v, int n) { + if (!A) return v+n*(max-min)/100; + if (min > max) n = -n; + return (rint(v*B/A)+n)*A/B; +} + +int Fl_Valuator::format(char* buffer) { + double v = value(); + // MRS: THIS IS A HACK - RECOMMEND ADDING BUFFER SIZE ARGUMENT + if (!A || !B) return snprintf(buffer, 128, "%g", v); + + // Figure out how many digits are required to correctly format the + // value. + int i, c = 0; + char temp[32]; + // output a number with many digits after the decimal point. This + // seems to be needed to get high precission + snprintf(temp, sizeof(temp), "%.12f", A/B); + // strip all trailing 0's + for (i=strlen(temp)-1; i>0; i--) { + if (temp[i]!='0') break; + } + // count digits until we find the decimal point (or comma or whatever + // letter is set in the current locale) + for (; i>0; i--, c++) { + if (!isdigit(temp[i])) break; + } + + // MRS: THIS IS A HACK - RECOMMEND ADDING BUFFER SIZE ARGUMENT + return snprintf(buffer, 128, "%.*f", c, v); +} + +// +// End of "$Id: Fl_Valuator.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Value_Input.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Value_Input.cxx new file mode 100644 index 0000000..5d1fae4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Value_Input.cxx @@ -0,0 +1,133 @@ +// +// "$Id: Fl_Value_Input.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Value input widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// FLTK widget for drag-adjusting a floating point value. +// Warning: this works by making a child Fl_Input object, even +// though this object is *not* an Fl_Group. May be a kludge? + +#include +#include +#include +#include +#include + + +void Fl_Value_Input::input_cb(Fl_Widget*, void* v) { + Fl_Value_Input& t = *(Fl_Value_Input*)v; + double nv; + if ((t.step() - floor(t.step()))>0.0 || t.step() == 0.0) nv = strtod(t.input.value(), 0); + else nv = strtol(t.input.value(), 0, 0); + if (nv != t.value() || t.when() & FL_WHEN_NOT_CHANGED) { + t.set_value(nv); + t.set_changed(); + if (t.when()) t.do_callback(); + } +} + +void Fl_Value_Input::draw() { + if (damage()&~FL_DAMAGE_CHILD) input.clear_damage(FL_DAMAGE_ALL); + input.box(box()); + input.color(color(), selection_color()); + input.draw(); + input.clear_damage(); +} + +void Fl_Value_Input::resize(int X, int Y, int W, int H) { + Fl_Valuator::resize(X, Y, W, H); + input.resize(X, Y, W, H); +} + +void Fl_Value_Input::value_damage() { + char buf[128]; + format(buf); + input.value(buf); + input.mark(input.position()); // turn off selection highlight +} + +int Fl_Value_Input::handle(int event) { + double v; + int delta; + int mx = Fl::event_x_root(); + static int ix, drag; + input.when(when()); + switch (event) { + case FL_PUSH: + if (!step()) goto DEFAULT; + ix = mx; + drag = Fl::event_button(); + handle_push(); + return 1; + case FL_DRAG: + if (!step()) goto DEFAULT; + delta = mx-ix; + if (delta > 5) delta -= 5; + else if (delta < -5) delta += 5; + else delta = 0; + switch (drag) { + case 3: v = increment(previous_value(), delta*100); break; + case 2: v = increment(previous_value(), delta*10); break; + default:v = increment(previous_value(), delta); break; + } + v = round(v); + handle_drag(soft()?softclamp(v):clamp(v));; + return 1; + case FL_RELEASE: + if (!step()) goto DEFAULT; + if (value() != previous_value() || !Fl::event_is_click()) + handle_release(); + else { + input.handle(FL_PUSH); + input.handle(FL_RELEASE); + } + return 1; + case FL_FOCUS: + return input.take_focus(); + default: + DEFAULT: + input.type(((step() - floor(step()))>0.0 || step() == 0.0) ? FL_FLOAT_INPUT : FL_INT_INPUT); + return input.handle(event); + } +} + +Fl_Value_Input::Fl_Value_Input(int X, int Y, int W, int H, const char* l) +: Fl_Valuator(X, Y, W, H, l), input(X, Y, W, H, 0) { + soft_ = 0; + if (input.parent()) // defeat automatic-add + ((Fl_Group*)input.parent())->remove(input); + input.parent((Fl_Group *)this); // kludge! + input.callback(input_cb, this); + input.when(FL_WHEN_CHANGED); + box(input.box()); + color(input.color()); + selection_color(input.selection_color()); + align(FL_ALIGN_LEFT); + value_damage(); +} + +// +// End of "$Id: Fl_Value_Input.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Value_Output.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Value_Output.cxx new file mode 100644 index 0000000..bb9a8f8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Value_Output.cxx @@ -0,0 +1,103 @@ +// +// "$Id: Fl_Value_Output.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Value output widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Fltk widget for drag-adjusting a floating point value. +// This is much lighter than Fl_Value_Input because it has no text editor +// If step() is zero then it can be used to display a floating-point value + +#include +#include +#include + +void Fl_Value_Output::draw() { + Fl_Boxtype b = box() ? box() : FL_DOWN_BOX; + int X = x()+Fl::box_dx(b); + int Y = y()+Fl::box_dy(b); + int W = w()-Fl::box_dw(b); + int H = h()-Fl::box_dh(b); + if (damage()&~FL_DAMAGE_CHILD) + draw_box(b, color()); + else { + fl_color(color()); + fl_rectf(X, Y, W, H); + } + char buf[128]; + format(buf); + fl_color(active_r() ? textcolor() : fl_inactive(textcolor())); + fl_font(textfont(), textsize()); + fl_draw(buf,X,Y,W,H,FL_ALIGN_LEFT); +} + +int Fl_Value_Output::handle(int event) { + if (!step()) return 0; + double v; + int delta; + int mx = Fl::event_x(); + static int ix, drag; + switch (event) { + case FL_PUSH: + ix = mx; + drag = Fl::event_button(); + handle_push(); + return 1; + case FL_DRAG: + delta = Fl::event_x()-ix; + if (delta > 5) delta -= 5; + else if (delta < -5) delta += 5; + else delta = 0; + switch (drag) { + case 3: v = increment(previous_value(),delta*100); break; + case 2: v = increment(previous_value(),delta*10); break; + default:v = increment(previous_value(),delta); break; + } + v = round(v); + handle_drag(soft()?softclamp(v):clamp(v));; + return 1; + case FL_RELEASE: + handle_release(); + return 1; + case FL_ENTER : + case FL_LEAVE : + return 1; + default: + return 0; + } +} + +Fl_Value_Output::Fl_Value_Output(int X, int Y, int W, int H,const char *l) +: Fl_Valuator(X,Y,W,H,l) { + box(FL_NO_BOX); + align(FL_ALIGN_LEFT); + textfont_ = FL_HELVETICA; + textsize_ = (uchar)FL_NORMAL_SIZE; + textcolor_ = FL_FOREGROUND_COLOR; + soft_ = 0; +} + +// +// End of "$Id: Fl_Value_Output.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Value_Slider.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Value_Slider.cxx new file mode 100644 index 0000000..e26d1ea --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Value_Slider.cxx @@ -0,0 +1,82 @@ +// +// "$Id: Fl_Value_Slider.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Value slider widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include + +Fl_Value_Slider::Fl_Value_Slider(int X, int Y, int W, int H, const char*l) +: Fl_Slider(X,Y,W,H,l) { + step(1,100); + textfont_ = FL_HELVETICA; + textsize_ = 10; + textcolor_ = FL_FOREGROUND_COLOR; +} + +void Fl_Value_Slider::draw() { + int sxx = x(), syy = y(), sww = w(), shh = h(); + int bxx = x(), byy = y(), bww = w(), bhh = h(); + if (horizontal()) { + bww = 35; sxx += 35; sww -= 35; + } else { + syy += 25; bhh = 25; shh -= 25; + } + if (damage()&FL_DAMAGE_ALL) draw_box(box(),sxx,syy,sww,shh,color()); + Fl_Slider::draw(sxx+Fl::box_dx(box()), + syy+Fl::box_dy(box()), + sww-Fl::box_dw(box()), + shh-Fl::box_dh(box())); + draw_box(box(),bxx,byy,bww,bhh,color()); + char buf[128]; + format(buf); + fl_font(textfont(), textsize()); + fl_color(active_r() ? textcolor() : fl_inactive(textcolor())); + fl_draw(buf, bxx, byy, bww, bhh, FL_ALIGN_CLIP); +} + +int Fl_Value_Slider::handle(int event) { + if (event == FL_PUSH && Fl::visible_focus()) { + Fl::focus(this); + redraw(); + } + int sxx = x(), syy = y(), sww = w(), shh = h(); + if (horizontal()) { + sxx += 35; sww -= 35; + } else { + syy += 25; shh -= 25; + } + return Fl_Slider::handle(event, + sxx+Fl::box_dx(box()), + syy+Fl::box_dy(box()), + sww-Fl::box_dw(box()), + shh-Fl::box_dh(box())); +} + +// +// End of "$Id: Fl_Value_Slider.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Widget.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Widget.cxx new file mode 100644 index 0000000..f3713a9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Widget.cxx @@ -0,0 +1,318 @@ +// +// "$Id: Fl_Widget.cxx 6978 2009-12-23 12:54:41Z AlbrechtS $" +// +// Base widget class for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include "flstring.h" + + +//////////////////////////////////////////////////////////////// +// for compatability with Forms, all widgets without callbacks are +// inserted into a "queue" when they are activated, and the forms +// compatability interaction functions (fl_do_events, etc) will +// read one widget at a time from this queue and return it: + +const int QUEUE_SIZE = 20; + +static Fl_Widget *obj_queue[QUEUE_SIZE]; +static int obj_head, obj_tail; + +void Fl_Widget::default_callback(Fl_Widget *o, void * /*v*/) { +#if 0 + // This is necessary for strict forms compatibility but is confusing. + // Use the parent's callback if this widget does not have one. + for (Fl_Widget *p = o->parent(); p; p = p->parent()) + if (p->callback() != default_callback) { + p->do_callback(o,v); + return; + } +#endif + obj_queue[obj_head++] = o; + if (obj_head >= QUEUE_SIZE) obj_head = 0; + if (obj_head == obj_tail) { + obj_tail++; + if (obj_tail >= QUEUE_SIZE) obj_tail = 0; + } +} +/* + All Fl_Widgets that don't have a callback defined use a + default callback that puts a pointer to the widget in this queue, + and this method reads the oldest widget out of this queue. +*/ +Fl_Widget *Fl::readqueue() { + if (obj_tail==obj_head) return 0; + Fl_Widget *o = obj_queue[obj_tail++]; + if (obj_tail >= QUEUE_SIZE) obj_tail = 0; + return o; +} +/* + This static internal function removes all pending callbacks for a + specific widget from the default callback queue (Fl::readqueue()). + It is only called from Fl_Widget's destructor if the widget + doesn't have an own callback. + Note: There's no need to have this in the Fl:: namespace. +*/ +static void cleanup_readqueue(Fl_Widget *w) { + + if (obj_tail==obj_head) return; + + // Read the entire queue and copy over all valid entries. + // The new head will be determined after the last copied entry. + + int old_head = obj_head; // save newest entry + int entry = obj_tail; // oldest entry + obj_head = obj_tail; // new queue start + for (;;) { + Fl_Widget *o = obj_queue[entry++]; + if (entry >= QUEUE_SIZE) entry = 0; + if (o != w) { // valid entry + obj_queue[obj_head++] = o; + if (obj_head >= QUEUE_SIZE) obj_head = 0; + } // valid entry + if (entry == old_head) break; + } + return; +} + +//////////////////////////////////////////////////////////////// + +int Fl_Widget::handle(int) { + return 0; +} + +int FL_NORMAL_SIZE = 14; + +Fl_Widget::Fl_Widget(int X, int Y, int W, int H, const char* L) { + + x_ = X; y_ = Y; w_ = W; h_ = H; + + label_.value = L; + label_.image = 0; + label_.deimage = 0; + label_.type = FL_NORMAL_LABEL; + label_.font = FL_HELVETICA; + label_.size = (uchar)FL_NORMAL_SIZE; + label_.color = FL_FOREGROUND_COLOR; + tooltip_ = 0; + callback_ = default_callback; + user_data_ = 0; + type_ = 0; + flags_ = VISIBLE_FOCUS; + damage_ = 0; + box_ = FL_NO_BOX; + color_ = FL_GRAY; + color2_ = FL_GRAY; + align_ = FL_ALIGN_CENTER; + when_ = FL_WHEN_RELEASE; + + parent_ = 0; + if (Fl_Group::current()) Fl_Group::current()->add(this); +} + +void Fl_Widget::resize(int X, int Y, int W, int H) { + x_ = X; y_ = Y; w_ = W; h_ = H; +} + +// this is useful for parent widgets to call to resize children: +int Fl_Widget::damage_resize(int X, int Y, int W, int H) { + if (x() == X && y() == Y && w() == W && h() == H) return 0; + resize(X, Y, W, H); + redraw(); + return 1; +} + +int Fl_Widget::take_focus() { + if (!takesevents()) return 0; + if (!visible_focus()) return 0; + if (!handle(FL_FOCUS)) return 0; // see if it wants it + if (contains(Fl::focus())) return 1; // it called Fl::focus for us + Fl::focus(this); + return 1; +} + +extern void fl_throw_focus(Fl_Widget*); // in Fl_x.cxx + +// Destruction does not remove from any parent group! And groups when +// destroyed destroy all their children. This is convienent and fast. +// However, it is only legal to destroy a "root" such as an Fl_Window, +// and automatic destructors may be called. +Fl_Widget::~Fl_Widget() { + Fl::clear_widget_pointer(this); + if (flags() & COPIED_LABEL) free((void *)(label_.value)); + parent_ = 0; // Don't throw focus to a parent widget. + fl_throw_focus(this); + // remove stale entries from default callback queue (Fl::readqueue()) + if (callback_ == default_callback) cleanup_readqueue(this); +} + +// draw a focus box for the widget... +void +Fl_Widget::draw_focus(Fl_Boxtype B, int X, int Y, int W, int H) const { + if (!Fl::visible_focus()) return; + switch (B) { + case FL_DOWN_BOX: + case FL_DOWN_FRAME: + case FL_THIN_DOWN_BOX: + case FL_THIN_DOWN_FRAME: + X ++; + Y ++; + default: + break; + } + + fl_color(fl_contrast(FL_BLACK, color())); + +#if defined(WIN32) || defined(__APPLE_QD__) + // Windows 95/98/ME do not implement the dotted line style, so draw + // every other pixel around the focus area... + // + // Also, QuickDraw (MacOS) does not support line styles specifically, + // and the hack we use in fl_line_style() will not draw horizontal lines + // on odd-numbered rows... + int i, xx, yy; + + X += Fl::box_dx(B); + Y += Fl::box_dy(B); + W -= Fl::box_dw(B) + 2; + H -= Fl::box_dh(B) + 2; + + for (xx = 0, i = 1; xx < W; xx ++, i ++) if (i & 1) fl_point(X + xx, Y); + for (yy = 0; yy < H; yy ++, i ++) if (i & 1) fl_point(X + W, Y + yy); + for (xx = W; xx > 0; xx --, i ++) if (i & 1) fl_point(X + xx, Y + H); + for (yy = H; yy > 0; yy --, i ++) if (i & 1) fl_point(X, Y + yy); +#else + fl_line_style(FL_DOT); + fl_rect(X + Fl::box_dx(B), Y + Fl::box_dy(B), + W - Fl::box_dw(B) - 1, H - Fl::box_dh(B) - 1); + fl_line_style(FL_SOLID); +#endif // WIN32 +} + + +void Fl_Widget::activate() { + if (!active()) { + clear_flag(INACTIVE); + if (active_r()) { + redraw(); + redraw_label(); + handle(FL_ACTIVATE); + if (inside(Fl::focus())) Fl::focus()->take_focus(); + } + } +} + +void Fl_Widget::deactivate() { + if (active_r()) { + set_flag(INACTIVE); + redraw(); + redraw_label(); + handle(FL_DEACTIVATE); + fl_throw_focus(this); + } else { + set_flag(INACTIVE); + } +} + +int Fl_Widget::active_r() const { + for (const Fl_Widget* o = this; o; o = o->parent()) + if (!o->active()) return 0; + return 1; +} + +void Fl_Widget::show() { + if (!visible()) { + clear_flag(INVISIBLE); + if (visible_r()) { + redraw(); + redraw_label(); + handle(FL_SHOW); + if (inside(Fl::focus())) Fl::focus()->take_focus(); + } + } +} + +void Fl_Widget::hide() { + if (visible_r()) { + set_flag(INVISIBLE); + for (Fl_Widget *p = parent(); p; p = p->parent()) + if (p->box() || !p->parent()) {p->redraw(); break;} + handle(FL_HIDE); + fl_throw_focus(this); + } else { + set_flag(INVISIBLE); + } +} + +int Fl_Widget::visible_r() const { + for (const Fl_Widget* o = this; o; o = o->parent()) + if (!o->visible()) return 0; + return 1; +} + +// return true if widget is inside (or equal to) this: +// Returns false for null widgets. +int Fl_Widget::contains(const Fl_Widget *o) const { + for (; o; o = o->parent_) if (o == this) return 1; + return 0; +} + + +void +Fl_Widget::label(const char *a) { + if (flags() & COPIED_LABEL) { + // reassigning a copied label remains the same copied label + if (label_.value == a) + return; + free((void *)(label_.value)); + clear_flag(COPIED_LABEL); + } + label_.value=a; + redraw_label(); +} + + +void +Fl_Widget::copy_label(const char *a) { + if (flags() & COPIED_LABEL) free((void *)(label_.value)); + if (a) { + set_flag(COPIED_LABEL); + label_.value=strdup(a); + } else { + clear_flag(COPIED_LABEL); + label_.value=(char *)0; + } + redraw_label(); +} + + +// +// End of "$Id: Fl_Widget.cxx 6978 2009-12-23 12:54:41Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Window.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Window.cxx new file mode 100644 index 0000000..e224c1f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Window.cxx @@ -0,0 +1,179 @@ +// +// "$Id: Fl_Window.cxx 5251 2006-06-28 10:23:33Z matt $" +// +// Window widget class for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// The Fl_Window is a window in the fltk library. +// This is the system-independent portions. The huge amount of +// crap you need to do to communicate with X is in Fl_x.cxx, the +// equivalent (but totally different) crap for MSWindows is in Fl_win32.cxx + +#include +#include +#include +#include "flstring.h" + +#ifdef __APPLE_QUARTZ__ +#include +#endif + +void Fl_Window::_Fl_Window() { + type(FL_WINDOW); + box(FL_FLAT_BOX); + if (Fl::scheme_bg_) { + labeltype(FL_NORMAL_LABEL); + align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE | FL_ALIGN_CLIP); + image(Fl::scheme_bg_); + } else { + labeltype(FL_NO_LABEL); + } + i = 0; + xclass_ = 0; + icon_ = 0; + iconlabel_ = 0; + resizable(0); + size_range_set = 0; + minw = maxw = minh = maxh = 0; + callback((Fl_Callback*)default_callback); +} + +Fl_Window::Fl_Window(int X,int Y,int W, int H, const char *l) +: Fl_Group(X, Y, W, H, l) { + cursor_default = FL_CURSOR_DEFAULT; + cursor_fg = FL_BLACK; + cursor_bg = FL_WHITE; + + _Fl_Window(); + set_flag(FL_FORCE_POSITION); +} + +Fl_Window::Fl_Window(int W, int H, const char *l) +// fix common user error of a missing end() with current(0): + : Fl_Group((Fl_Group::current(0),0), 0, W, H, l) { + cursor_default = FL_CURSOR_DEFAULT; + cursor_fg = FL_BLACK; + cursor_bg = FL_WHITE; + + _Fl_Window(); + clear_visible(); +} + +Fl_Window *Fl_Widget::window() const { + for (Fl_Widget *o = parent(); o; o = o->parent()) + if (o->type() >= FL_WINDOW) return (Fl_Window*)o; + return 0; +} + +int Fl_Window::x_root() const { + Fl_Window *p = window(); + if (p) return p->x_root() + x(); + return x(); +} + +int Fl_Window::y_root() const { + Fl_Window *p = window(); + if (p) return p->y_root() + y(); + return y(); +} + +void Fl_Window::draw() { + const char *savelabel = label(); + int saveflags = flags(); + int savex = x(); x(0); + int savey = y(); y(0); + // Make sure we don't draw the window title in the window background... + clear_flag(COPIED_LABEL); // do not free copied labels! + Fl_Widget::label(0); + Fl_Group::draw(); +#ifdef __APPLE_QUARTZ__ + if (!parent() && resizable() && (!size_range_set || minh!=maxh || minw!=maxw)) { + int dx = Fl::box_dw(box())-Fl::box_dx(box()); + int dy = Fl::box_dh(box())-Fl::box_dy(box()); + if (dx<=0) dx = 1; + if (dy<=0) dy = 1; + int x1 = w()-dx-1, x2 = x1, y1 = h()-dx-1, y2 = y1; + Fl_Color c[4] = { + color(), + fl_color_average(color(), FL_WHITE, 0.7f), + fl_color_average(color(), FL_BLACK, 0.6f), + fl_color_average(color(), FL_BLACK, 0.8f), + }; + int i; + for (i=dx; i<12; i++) { + fl_color(c[i&3]); + fl_line(x1--, y1, x2, y2--); + } + } +#endif + // Restore the label... + Fl_Widget::label(savelabel); + set_flag(saveflags); + y(savey); + x(savex); +} + +void Fl_Window::label(const char *name) { + label(name, iconlabel()); +} + +void Fl_Window::copy_label(const char *a) { + if (flags() & COPIED_LABEL) { + free((void *)label()); + clear_flag(COPIED_LABEL); + } + if (a) a = strdup(a); + label(a, iconlabel()); + set_flag(COPIED_LABEL); +} + + +void Fl_Window::iconlabel(const char *iname) { + uchar saveflags = flags(); + label(label(), iname); + set_flag(saveflags); +} + +// the Fl::atclose pointer is provided for back compatability. You +// can now just change the callback for the window instead. + +void Fl::default_atclose(Fl_Window* window, void* v) { + window->hide(); + Fl_Widget::default_callback(window, v); // put on Fl::read_queue() +} + +void (*Fl::atclose)(Fl_Window*, void*) = default_atclose; + +void Fl_Window::default_callback(Fl_Window* win, void* v) { + Fl::atclose(win, v); +} + +Fl_Window *Fl_Window::current() { + return current_; +} + + +// +// End of "$Id: Fl_Window.cxx 5251 2006-06-28 10:23:33Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Window_fullscreen.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Window_fullscreen.cxx new file mode 100644 index 0000000..fc36dc2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Window_fullscreen.cxx @@ -0,0 +1,97 @@ +// +// "$Id: Fl_Window_fullscreen.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Fullscreen window support for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Turning the border on/off by changing the motif_wm_hints property +// works on Irix 4DWM. Does not appear to work for any other window +// manager. Fullscreen still works on some window managers (fvwm is one) +// because they allow the border to be placed off-screen. + +// Unfortunatly most X window managers ignore changes to the border +// and refuse to position the border off-screen, so attempting to make +// the window full screen will lose the size of the border off the +// bottom and right. + +#include +#include + +#ifdef __APPLE__ +#include +#endif + +void Fl_Window::border(int b) { + if (b) { + if (border()) return; + clear_flag(FL_NOBORDER); + } else { + if (!border()) return; + set_flag(FL_NOBORDER); + } +#ifdef WIN32 + // not yet implemented, but it's possible + // for full fullscreen we have to make the window topmost as well +#elif defined(__APPLE_QD__) + // warning: not implemented in Quickdraw/Carbon +#elif defined(__APPLE_QUARTZ__) + // warning: not implemented in Quartz/Carbon +#else + if (shown()) Fl_X::i(this)->sendxjunk(); +#endif +} + +void Fl_Window::fullscreen() { +#ifndef WIN32 + //this would clobber the fake wm, since it relies on the border flags to + //determine its thickness + border(0); +#endif +#if defined(__APPLE__) || defined(WIN32) + int sx, sy, sw, sh; + Fl::screen_xywh(sx, sy, sw, sh, x()+w()/2, y()+h()/2); + // if we are on the main screen, we will leave the system menu bar unobstructed + if (Fl::x()>=sx && Fl::y()>=sy && Fl::x()+Fl::w()<=sx+sw && Fl::y()+Fl::h()<=sy+sh) { + sx = Fl::x(); sy = Fl::y(); + sw = Fl::w(); sh = Fl::h(); + } + if (x()==sx) x(sx+1); // make sure that we actually execute the resize + resize(sx, sy, sw, sh); +#else + if (!x()) x(1); // force it to call XResizeWindow() + resize(0,0,Fl::w(),Fl::h()); +#endif +} + +void Fl_Window::fullscreen_off(int X,int Y,int W,int H) { + // this order produces less blinking on IRIX: + resize(X,Y,W,H); +#ifndef WIN32 + border(1); +#endif +} + +// +// End of "$Id: Fl_Window_fullscreen.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Window_hotspot.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Window_hotspot.cxx new file mode 100644 index 0000000..493370d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Window_hotspot.cxx @@ -0,0 +1,100 @@ +// +// "$Id: Fl_Window_hotspot.cxx 5697 2007-02-13 14:38:43Z matt $" +// +// Common hotspot routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include + +void Fl_Window::hotspot(int X, int Y, int offscreen) { + int mx,my; + + // Update the screen position based on the mouse position. + Fl::get_mouse(mx,my); + X = mx-X; Y = my-Y; + + // If offscreen is 0 (the default), make sure that the window + // stays on the screen, if possible. + if (!offscreen) { + int scr_x, scr_y, scr_w, scr_h; + Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h); + + int top = 0; + int left = 0; + int right = 0; + int bottom = 0; + + if (border()) { +#ifdef WIN32 + if (size_range_set && (maxw != minw || maxh != minh)) { + left = right = GetSystemMetrics(SM_CXSIZEFRAME); + top = bottom = GetSystemMetrics(SM_CYSIZEFRAME); + } else { + left = right = GetSystemMetrics(SM_CXFIXEDFRAME); + top = bottom = GetSystemMetrics(SM_CYFIXEDFRAME); + } + top += GetSystemMetrics(SM_CYCAPTION); +#elif defined(__APPLE__) + top = 24; + left = 2; + right = 2; + bottom = 2; +#else + // Ensure border is on screen; these values are generic enough + // to work with many window managers, and are based on KDE defaults. + top = 20; + left = 4; + right = 4; + bottom = 8; +#endif + } + // now insure contents are on-screen (more important than border): + if (X+w()+right > scr_w-scr_x) X = scr_w-scr_x-right-w(); + if (X-left < scr_x) X = left; + if (Y+h()+bottom > scr_h-scr_y) Y = scr_h-scr_y-bottom-h(); + if (Y-top < scr_y) Y = top; + // make sure that we will force this position + if (X==x()) x(X-1); + } + + position(X,Y); +} + +void Fl_Window::hotspot(const Fl_Widget *o, int offscreen) { + int X = o->w()/2; + int Y = o->h()/2; + while (o != this && o) { + X += o->x(); Y += o->y(); + o = o->window(); + } + hotspot(X,Y,offscreen); +} + + +// +// End of "$Id: Fl_Window_hotspot.cxx 5697 2007-02-13 14:38:43Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Window_iconize.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Window_iconize.cxx new file mode 100644 index 0000000..9996b84 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Window_iconize.cxx @@ -0,0 +1,49 @@ +// +// "$Id: Fl_Window_iconize.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Window minification code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include + +extern char fl_show_iconic; // in Fl_x.cxx + +void Fl_Window::iconize() { + if (!shown()) { + fl_show_iconic = 1; + show(); + } else { +#ifdef WIN32 + ShowWindow(i->xid, SW_SHOWMINNOACTIVE); +#elif defined(__APPLE__) + CollapseWindow( i->xid, true ); +#else + XIconifyWindow(fl_display, i->xid, fl_screen); +#endif + } +} + +// +// End of "$Id: Fl_Window_iconize.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_Wizard.cxx b/third_party/windows/fltk-1.1.10/src/Fl_Wizard.cxx new file mode 100644 index 0000000..f5c2d60 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_Wizard.cxx @@ -0,0 +1,210 @@ +// +// "$Id: Fl_Wizard.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Fl_Wizard widget routines. +// +// Copyright 1997-2005 by Easy Software Products. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// Fl_Wizard::Fl_Wizard() - Create an Fl_Wizard widget. +// Fl_Wizard::draw() - Draw the wizard border and visible child. +// Fl_Wizard::next() - Show the next child. +// Fl_Wizard::prev() - Show the previous child. +// Fl_Wizard::value() - Return the current visible child. +// Fl_Wizard::value() - Set the visible child. +// + +// +// Include necessary header files... +// + +#include +#include +#include + + +// +// 'Fl_Wizard::Fl_Wizard()' - Create an Fl_Wizard widget. +// + +Fl_Wizard::Fl_Wizard(int xx, // I - Lefthand position + int yy, // I - Upper position + int ww, // I - Width + int hh, // I - Height + const char *l) : // I - Label + Fl_Group(xx, yy, ww, hh, l) +{ + box(FL_THIN_UP_BOX); + + value_ = (Fl_Widget *)0; +} + + +// +// 'Fl_Wizard::draw()' - Draw the wizard border and visible child. +// + +void +Fl_Wizard::draw() +{ + Fl_Widget *kid; // Visible child + + + kid = value(); + + if (damage() & FL_DAMAGE_ALL) + { + // Redraw everything... + if (kid) + { + draw_box(box(), x(), y(), w(), h(), kid->color()); + draw_child(*kid); + } + else + draw_box(box(), x(), y(), w(), h(), color()); + + } + else if (kid) + update_child(*kid); +} + + +// +// 'Fl_Wizard::next()' - Show the next child. +// + +void +Fl_Wizard::next() +{ + int num_kids; + Fl_Widget * const *kids; + + + if ((num_kids = children()) == 0) + return; + + for (kids = array(); num_kids > 0; kids ++, num_kids --) + if ((*kids)->visible()) + break; + + if (num_kids > 1) + value(kids[1]); +} + + +// +// 'Fl_Wizard::prev()' - Show the previous child. +// + + +void +Fl_Wizard::prev() +{ + int num_kids; + Fl_Widget * const *kids; + + + if ((num_kids = children()) == 0) + return; + + for (kids = array(); num_kids > 0; kids ++, num_kids --) + if ((*kids)->visible()) + break; + + if (num_kids > 0 && num_kids < children()) + value(kids[-1]); +} + + +// +// 'Fl_Wizard::value()' - Return the current visible child. +// + +Fl_Widget * +Fl_Wizard::value() +{ + int num_kids; + Fl_Widget * const *kids; + Fl_Widget *kid; + + + if ((num_kids = children()) == 0) + return ((Fl_Widget *)0); + + for (kids = array(), kid = (Fl_Widget *)0; num_kids > 0; kids ++, num_kids --) + { + if ((*kids)->visible()) + { + if (kid) + (*kids)->hide(); + else + kid = *kids; + } + } + + if (!kid) + { + kids --; + kid = *kids; + kid->show(); + } + + return (kid); +} + + +// +// 'Fl_Wizard::value()' - Set the visible child. +// + +void +Fl_Wizard::value(Fl_Widget *kid) +{ + int num_kids; + Fl_Widget * const *kids; + + + if ((num_kids = children()) == 0) + return; + + for (kids = array(); num_kids > 0; kids ++, num_kids --) + { + if (*kids == kid) + { + if (!kid->visible()) + kid->show(); + } + else + (*kids)->hide(); + } + + // This will restore the mouse pointer to the window's default cursor + // whenever the wizard pane is changed. Otherwise text widgets that + // show the next pane may leave the cursor set to the I beam, etc... + if (window()) window()->cursor(FL_CURSOR_DEFAULT); +} + + +// +// End of "$Id: Fl_Wizard.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_XBM_Image.cxx b/third_party/windows/fltk-1.1.10/src/Fl_XBM_Image.cxx new file mode 100644 index 0000000..0254195 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_XBM_Image.cxx @@ -0,0 +1,106 @@ +// +// "$Id: Fl_XBM_Image.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Fl_XBM_Image routines. +// +// Copyright 1997-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// Fl_XBM_Image::Fl_XBM_Image() - Load an XBM file. +// + +// +// Include necessary header files... +// + +#include +#include +#include +#include +#include "flstring.h" + +// +// 'Fl_XBM_Image::Fl_XBM_Image()' - Load an XBM file. +// + +Fl_XBM_Image::Fl_XBM_Image(const char *name) : Fl_Bitmap((const char *)0,0,0) { + FILE *f; + uchar *ptr; + + if ((f = fopen(name, "rb")) == NULL) return; + + char buffer[1024]; + char junk[1024]; + int wh[2]; // width and height + int i; + for (i = 0; i<2; i++) { + for (;;) { + if (!fgets(buffer,1024,f)) { + fclose(f); + return; + } + int r = sscanf(buffer,"#define %s %d",junk,&wh[i]); + if (r >= 2) break; + } + } + + // skip to data array: + for (;;) { + if (!fgets(buffer,1024,f)) { + fclose(f); + return; + } + if (!strncmp(buffer,"static ",7)) break; + } + + // Allocate memory... + w(wh[0]); + h(wh[1]); + + int n = ((wh[0]+7)/8)*wh[1]; + array = new uchar[n]; + + // read the data: + for (i = 0, ptr = (uchar *)array; i < n;) { + if (!fgets(buffer,1024,f)) { + fclose(f); + return; + } + const char *a = buffer; + while (*a && i0) { + *ptr++ = (uchar)t; + i ++; + } + while (*a && *a++ != ','); + } + } + + fclose(f); +} + + +// +// End of "$Id: Fl_XBM_Image.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_XColor.H b/third_party/windows/fltk-1.1.10/src/Fl_XColor.H new file mode 100644 index 0000000..cd14ef8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_XColor.H @@ -0,0 +1,46 @@ +// +// "$Id: Fl_XColor.H 4288 2005-04-16 00:13:17Z mike $" +// +// X-specific color definitions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2001 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include + +// one of these for each color in fltk's "colormap": +// if overlays are enabled, another one for the overlay +struct Fl_XColor { + unsigned char r,g,b; // actual color used by X + unsigned char mapped; // true when XAllocColor done + unsigned long pixel; // the X pixel to use +}; +extern Fl_XColor fl_xmap[/*overlay*/][256]; + +// mask & shifts to produce xcolor for truecolor visuals: +extern unsigned char fl_redmask, fl_greenmask, fl_bluemask; +extern int fl_redshift, fl_greenshift, fl_blueshift, fl_extrashift; + +// +// End of "$Id: Fl_XColor.H 4288 2005-04-16 00:13:17Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_XPM_Image.cxx b/third_party/windows/fltk-1.1.10/src/Fl_XPM_Image.cxx new file mode 100644 index 0000000..a09e479 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_XPM_Image.cxx @@ -0,0 +1,131 @@ +// +// "$Id: Fl_XPM_Image.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Fl_XPM_Image routines. +// +// Copyright 1997-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// + +// +// Include necessary header files... +// + +#include +#include +#include +#include +#include "flstring.h" + + +// +// 'hexdigit()' - Convert a hex digit to an integer. +// + +static int hexdigit(int x) { // I - Hex digit... + if (isdigit(x)) return x-'0'; + if (isupper(x)) return x-'A'+10; + if (islower(x)) return x-'a'+10; + return 20; +} + +#define MAXSIZE 2048 +#define INITIALLINES 256 + +Fl_XPM_Image::Fl_XPM_Image(const char *name) : Fl_Pixmap((char *const*)0) { + FILE *f; + + if ((f = fopen(name, "rb")) == NULL) return; + + // read all the c-strings out of the file: + char** new_data = new char *[INITIALLINES]; + char** temp_data; + int malloc_size = INITIALLINES; + char buffer[MAXSIZE+20]; + int i = 0; + while (fgets(buffer,MAXSIZE+20,f)) { + if (buffer[0] != '\"') continue; + char *myp = buffer; + char *q = buffer+1; + while (*q != '\"' && myp < buffer+MAXSIZE) { + if (*q == '\\') switch (*++q) { + case '\r': + case '\n': + fgets(q,(buffer+MAXSIZE+20)-q,f); break; + case 0: + break; + case 'x': { + q++; + int n = 0; + for (int x = 0; x < 3; x++) { + int xd = hexdigit(*q); + if (xd > 15) break; + n = (n<<4)+xd; + q++; + } + *myp++ = n; + } break; + default: { + int c = *q++; + if (c>='0' && c<='7') { + c -= '0'; + for (int x=0; x<2; x++) { + int xd = hexdigit(*q); + if (xd>7) break; + c = (c<<3)+xd; + q++; + } + } + *myp++ = c; + } break; + } else { + *myp++ = *q++; + } + } + *myp++ = 0; + if (i >= malloc_size) { + temp_data = new char *[malloc_size + INITIALLINES]; + memcpy(temp_data, new_data, sizeof(char *) * malloc_size); + delete[] new_data; + new_data = temp_data; + malloc_size += INITIALLINES; + } + new_data[i] = new char[myp-buffer+1]; + memcpy(new_data[i], buffer,myp-buffer); + new_data[i][myp-buffer] = 0; + i++; + } + + fclose(f); + + data((const char **)new_data, i); + alloc_data = 1; + + measure(); +} + + +// +// End of "$Id: Fl_XPM_Image.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_abort.cxx b/third_party/windows/fltk-1.1.10/src/Fl_abort.cxx new file mode 100644 index 0000000..db9a7bc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_abort.cxx @@ -0,0 +1,102 @@ +// +// "$Id: Fl_abort.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Warning/error message code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// This method is in it's own source file so that stdlib and stdio +// do not need to be included in Fl.cxx: +// You can also override this by redefining all of these. + +#include +#include +#include +#include +#include "flstring.h" + +#ifdef WIN32 +# include + +static void warning(const char *, ...) { + // Show nothing for warnings under WIN32... +} + +static void error(const char *format, ...) { + va_list args; + char buf[1024]; + va_start(args, format); + vsnprintf(buf, 1024, format, args); + va_end(args); + MessageBox(0,buf,"Error",MB_ICONEXCLAMATION|MB_SYSTEMMODAL); +} + +static void fatal(const char *format, ...) { + va_list args; + char buf[1024]; + va_start(args, format); + vsnprintf(buf, 1024, format, args); + va_end(args); + MessageBox(0,buf,"Error",MB_ICONSTOP|MB_SYSTEMMODAL); + ::exit(1); +} + +#else + +static void warning(const char *format, ...) { + va_list args; + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + fputc('\n', stderr); + fflush(stderr); +} + +static void error(const char *format, ...) { + va_list args; + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + fputc('\n', stderr); + fflush(stderr); +} + +static void fatal(const char *format, ...) { + va_list args; + va_start(args, format); + vfprintf(stderr, format, args); + va_end(args); + fputc('\n', stderr); + fflush(stderr); + ::exit(1); +} + +#endif + +void (*Fl::warning)(const char* format, ...) = ::warning; +void (*Fl::error)(const char* format, ...) = ::error; +void (*Fl::fatal)(const char* format, ...) = ::fatal; + +// +// End of "$Id: Fl_abort.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_add_idle.cxx b/third_party/windows/fltk-1.1.10/src/Fl_add_idle.cxx new file mode 100644 index 0000000..495bb89 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_add_idle.cxx @@ -0,0 +1,100 @@ +// +// "$Id: Fl_add_idle.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Idle routine support for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Allows you to manage an arbitrary set of idle() callbacks. +// Replaces the older set_idle() call (which is used to implement this) + +#include + +struct idle_cb { + void (*cb)(void*); + void* data; + idle_cb *next; +}; + +// the callbacks are stored linked in a ring. last points at the one +// just called, first at the next to call. last->next == first. + +static idle_cb* first; +static idle_cb* last; +static idle_cb* freelist; + +static void call_idle() { + idle_cb* p = first; + last = p; first = p->next; + p->cb(p->data); // this may call add_idle() or remove_idle()! +} + +void Fl::add_idle(void (*cb)(void*), void* data) { + idle_cb* p = freelist; + if (p) freelist = p->next; + else p = new idle_cb; + p->cb = cb; + p->data = data; + if (first) { + last->next = p; + last = p; + p->next = first; + } else { + first = last = p; + p->next = p; + set_idle(call_idle); + } +} + +int Fl::has_idle(void (*cb)(void*), void* data) { + idle_cb* p = first; + if (!p) return 0; + for (;; p = p->next) { + if (p->cb == cb && p->data == data) return 1; + if (p==last) return 0; + } +} + +void Fl::remove_idle(void (*cb)(void*), void* data) { + idle_cb* p = first; + if (!p) return; + idle_cb* l = last; + for (;; p = p->next) { + if (p->cb == cb && p->data == data) break; + if (p==last) return; // not found + l = p; + } + if (l == p) { // only one + first = last = 0; + set_idle(0); + } else { + last = l; + first = l->next = p->next; + } + p->next = freelist; + freelist = p; +} + +// +// End of "$Id: Fl_add_idle.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_arg.cxx b/third_party/windows/fltk-1.1.10/src/Fl_arg.cxx new file mode 100644 index 0000000..1733c8f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_arg.cxx @@ -0,0 +1,424 @@ +// +// "$Id: Fl_arg.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Optional argument initialization code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// OPTIONAL initialization code for a program using fltk. +// You do not need to call this! Feel free to make up your own switches. + +#include +#include +#include +#include +#include +#include +#include +#include "flstring.h" + +#if defined(WIN32) || defined(__APPLE__) +int XParseGeometry(const char*, int*, int*, unsigned int*, unsigned int*); +# define NoValue 0x0000 +# define XValue 0x0001 +# define YValue 0x0002 +# define WidthValue 0x0004 +# define HeightValue 0x0008 +# define AllValues 0x000F +# define XNegative 0x0010 +# define YNegative 0x0020 +#endif + +static int fl_match(const char *a, const char *s, int atleast = 1) { + const char *b = s; + while (*a && (*a == *b || tolower(*a) == *b)) {a++; b++;} + return !*a && b >= s+atleast; +} + +// flags set by previously parsed arguments: +extern char fl_show_iconic; // in Fl_x.cxx +static char arg_called; +static char return_i; +static const char *name; +static const char *geometry; +static const char *title; +// these are in Fl_get_system_colors and are set by the switches: +extern const char *fl_fg; +extern const char *fl_bg; +extern const char *fl_bg2; + +// consume a switch from argv. Returns number of words eaten, 0 on error: +int Fl::arg(int argc, char **argv, int &i) { + arg_called = 1; + const char *s = argv[i]; + + if (!s) {i++; return 1;} // something removed by calling program? + + // a word that does not start with '-', or a word after a '--', or + // the word '-' by itself all start the "non-switch arguments" to + // a program. Return 0 to indicate that we don't understand the + // word, but set a flag (return_i) so that args() will return at + // that point: + if (s[0] != '-' || s[1] == '-' || !s[1]) {return_i = 1; return 0;} + s++; // point after the dash + + if (fl_match(s, "iconic")) { + fl_show_iconic = 1; + i++; + return 1; + } else if (fl_match(s, "kbd")) { + Fl::visible_focus(1); + i++; + return 1; + } else if (fl_match(s, "nokbd", 3)) { + Fl::visible_focus(0); + i++; + return 1; + } else if (fl_match(s, "dnd", 2)) { + Fl::dnd_text_ops(1); + i++; + return 1; + } else if (fl_match(s, "nodnd", 3)) { + Fl::dnd_text_ops(0); + i++; + return 1; + } else if (fl_match(s, "tooltips", 2)) { + Fl_Tooltip::enable(); + i++; + return 1; + } else if (fl_match(s, "notooltips", 3)) { + Fl_Tooltip::disable(); + i++; + return 1; + } +#ifdef __APPLE__ + // The Finder application in MacOS X passes the "-psn_N_NNNNN" option + // to all apps... + else if (strncmp(s, "psn_", 4) == 0) { + i++; + return 1; + } +#endif // __APPLE__ + + const char *v = argv[i+1]; + if (i >= argc-1 || !v) + return 0; // all the rest need an argument, so if missing it is an error + + if (fl_match(s, "geometry")) { + + int flags, gx, gy; unsigned int gw, gh; + flags = XParseGeometry(v, &gx, &gy, &gw, &gh); + if (!flags) return 0; + geometry = v; + +#if !defined(WIN32) && !defined(__APPLE__) + } else if (fl_match(s, "display", 2)) { + Fl::display(v); +#endif + + } else if (fl_match(s, "title", 2)) { + title = v; + + } else if (fl_match(s, "name", 2)) { + name = v; + + } else if (fl_match(s, "bg2", 3) || fl_match(s, "background2", 11)) { + fl_bg2 = v; + + } else if (fl_match(s, "bg", 2) || fl_match(s, "background", 10)) { + fl_bg = v; + + } else if (fl_match(s, "fg", 2) || fl_match(s, "foreground", 10)) { + fl_fg = v; + + } else if (fl_match(s, "scheme", 1)) { + Fl::scheme(v); + + } else return 0; // unrecognized + + i += 2; + return 2; +} + +// consume all switches from argv. Returns number of words eaten. +// Returns zero on error. 'i' will either point at first word that +// does not start with '-', at the error word, or after a '--', or at +// argc. If your program does not take any word arguments you can +// report an error if i < argc. + +int Fl::args(int argc, char** argv, int& i, int (*cb)(int,char**,int&)) { + arg_called = 1; + i = 1; // skip argv[0] + while (i < argc) { + if (cb && cb(argc,argv,i)) continue; + if (!arg(argc,argv,i)) return return_i ? i : 0; + } + return i; +} + +// show a main window, use any parsed arguments +void Fl_Window::show(int argc, char **argv) { + if (argc && !arg_called) Fl::args(argc,argv); + + Fl::get_system_colors(); + +#if !defined(WIN32) && !defined(__APPLE__) + // Get defaults for drag-n-drop and focus... + const char *key = 0, *val; + + if (Fl::first_window()) key = Fl::first_window()->xclass(); + if (!key) key = "fltk"; + + val = XGetDefault(fl_display, key, "dndTextOps"); + if (val) Fl::dnd_text_ops(strcasecmp(val, "true") == 0 || + strcasecmp(val, "on") == 0 || + strcasecmp(val, "yes") == 0); + + val = XGetDefault(fl_display, key, "tooltips"); + if (val) Fl_Tooltip::enable(strcasecmp(val, "true") == 0 || + strcasecmp(val, "on") == 0 || + strcasecmp(val, "yes") == 0); + + val = XGetDefault(fl_display, key, "visibleFocus"); + if (val) Fl::visible_focus(strcasecmp(val, "true") == 0 || + strcasecmp(val, "on") == 0 || + strcasecmp(val, "yes") == 0); +#endif // !WIN32 && !__APPLE__ + + // set colors first, so background_pixel is correct: + static char beenhere; + if (!beenhere) { + if (geometry) { + int fl = 0, gx = x(), gy = y(); unsigned int gw = w(), gh = h(); + fl = XParseGeometry(geometry, &gx, &gy, &gw, &gh); + if (fl & XNegative) gx = Fl::w()-w()+gx; + if (fl & YNegative) gy = Fl::h()-h()+gy; + // int mw,mh; minsize(mw,mh); + // if (mw > gw) gw = mw; + // if (mh > gh) gh = mh; + Fl_Widget *r = resizable(); + if (!r) resizable(this); + // for WIN32 we assumme window is not mapped yet: + if (fl & (XValue | YValue)) + x(-1), resize(gx,gy,gw,gh); + else + size(gw,gh); + resizable(r); + } + } + + // set the class, which is used by X version of get_system_colors: + if (name) {xclass(name); name = 0;} + else if (!xclass()) xclass(fl_filename_name(argv[0])); + + if (title) {label(title); title = 0;} + else if (!label()) label(xclass()); + + if (!beenhere) { + beenhere = 1; + Fl::scheme(Fl::scheme()); // opens display! May call Fl::fatal() + } + + // Show the window AFTER we have set the colors and scheme. + show(); + +#if !defined(WIN32) && !defined(__APPLE__) + // set the command string, used by state-saving window managers: + int j; + int n=0; for (j=0; jx{+-}{+-}", where + * width, height, xoffset, and yoffset are unsigned integers. + * Example: "=80x24+300-49" + * The equal sign is optional. + * It returns a bitmask that indicates which of the four values + * were actually found in the string. For each value found, + * the corresponding argument is updated; for each value + * not found, the corresponding argument is left unchanged. + */ + +static int ReadInteger(char* string, char** NextString) +{ + register int Result = 0; + int Sign = 1; + + if (*string == '+') + string++; + else if (*string == '-') { + string++; + Sign = -1; + } + for (; (*string >= '0') && (*string <= '9'); string++) { + Result = (Result * 10) + (*string - '0'); + } + *NextString = string; + if (Sign >= 0) + return (Result); + else + return (-Result); +} + +int XParseGeometry(const char* string, int* x, int* y, + unsigned int* width, unsigned int* height) +{ + int mask = NoValue; + register char *strind; + unsigned int tempWidth = 0, tempHeight = 0; + int tempX = 0, tempY = 0; + char *nextCharacter; + + if ( (string == NULL) || (*string == '\0')) return(mask); + if (*string == '=') + string++; /* ignore possible '=' at beg of geometry spec */ + + strind = (char *)string; + if (*strind != '+' && *strind != '-' && *strind != 'x') { + tempWidth = ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return (0); + strind = nextCharacter; + mask |= WidthValue; + } + + if (*strind == 'x' || *strind == 'X') { + strind++; + tempHeight = ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return (0); + strind = nextCharacter; + mask |= HeightValue; + } + + if ((*strind == '+') || (*strind == '-')) { + if (*strind == '-') { + strind++; + tempX = -ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return (0); + strind = nextCharacter; + mask |= XNegative; + + } else { + strind++; + tempX = ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return(0); + strind = nextCharacter; + } + mask |= XValue; + if ((*strind == '+') || (*strind == '-')) { + if (*strind == '-') { + strind++; + tempY = -ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return(0); + strind = nextCharacter; + mask |= YNegative; + + } else { + strind++; + tempY = ReadInteger(strind, &nextCharacter); + if (strind == nextCharacter) + return(0); + strind = nextCharacter; + } + mask |= YValue; + } + } + + /* If strind isn't at the end of the string the it's an invalid + geometry specification. */ + + if (*strind != '\0') return (0); + + if (mask & XValue) + *x = tempX; + if (mask & YValue) + *y = tempY; + if (mask & WidthValue) + *width = tempWidth; + if (mask & HeightValue) + *height = tempHeight; + return (mask); +} + +#endif // ifdef WIN32 + +// +// End of "$Id: Fl_arg.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_compose.cxx b/third_party/windows/fltk-1.1.10/src/Fl_compose.cxx new file mode 100644 index 0000000..b884b8f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_compose.cxx @@ -0,0 +1,223 @@ +// +// "$Id: Fl_compose.cxx 5211 2006-06-19 07:43:39Z matt $" +// +// Character compose processing for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include + +// +// MRS: Uncomment the following define to get the original (pre-1.1.2) +// dead key support code. The original code apparently did not +// work on Belgian keyboards. +// + +//#define OLD_DEAD_KEY_CODE + + +#ifdef __APPLE__ + +static const char* const compose_pairs = +":A*A,C'E~N:O:U'a`a^a:a~a*a,c'e`e" +"^e:e'i`i^i:i~n'o`o^o:o~o'u`u^u:u" +"+ o /c# SS* P|ssrOcOTM' : !=AE/O" +"oo+-<=>=Y=mudtSgPipiS a dgOmaeo/" +"? ! !!v-f ~~Dt<<>>.. `A~A~OOEoe" +"- --''``\"'\"`:-^V:y:Y//E=< > fifl" +"++..,,_\"%%^A^E'A:E`E'I^I:I`I'O^O" +"mc`O'U^U`U||^ ~^_ u . * , ~-; v "; + +#else + +static const char* const compose_pairs = +"=E _'f _\"..+ ++^ %%^S< OE ^Z ^''^^\"\"^-*- --~ TM^s> oe ^z:Y" +" ! % # $ y=| & : c a <<~ - r _ * +-2 3 ' u p . , 1 o >>141234? " +"`A'A^A~A:A*AAE,C`E'E^E:E`I'I^I:I-D~N`O'O^O~O:Ox O/`U'U^U:U'YTHss" +"`a'a^a~a:a*aae,c`e'e^e:e`i'i^i:i-d~n`o'o^o~o:o-:o/`u'u^u:u'yth:y"; + +#endif + +#if !defined(WIN32) && defined(OLD_DEAD_KEY_CODE) // X only +// X dead-key lookup table. This turns a dead-key keysym into the +// first of two characters for one of the compose sequences. These +// keysyms start at 0xFE50. +// Win32 handles the dead keys before FLTK can see them. This is +// unfortunate, because you don't get the preview effect. +static char dead_keys[] = { + '`', // XK_dead_grave + '\'', // XK_dead_acute + '^', // XK_dead_circumflex + '~', // XK_dead_tilde + '_', // XK_dead_macron + 0, // XK_dead_breve + '.', // XK_dead_abovedot + ':', // XK_dead_diaeresis + '*', // XK_dead_abovering + 0, // XK_dead_doubleacute + 'v', // XK_dead_caron + ',' // XK_dead_cedilla +// 0, // XK_dead_ogonek +// 0, // XK_dead_iota +// 0, // XK_dead_voiced_sound +// 0, // XK_dead_semivoiced_sound +// 0 // XK_dead_belowdot +}; +#endif // !WIN32 && OLD_DEAD_KEY_CODE + +int Fl::compose_state = 0; + +int Fl::compose(int& del) { + + del = 0; + unsigned char ascii = (unsigned)e_text[0]; + + // Alt+letters are reserved for shortcuts. But alt+foreign letters + // has to be allowed, because some key layouts require alt to be held + // down in order to type them... + // + // OSX users sometimes need to hold down ALT for keys, so we only check + // for META on OSX... +#ifdef __APPLE__ + if ((e_state & FL_META) && !(ascii & 128)) return 0; +#else + if ((e_state & (FL_ALT|FL_META)) && !(ascii & 128)) return 0; +#endif // __APPLE__ + + if (compose_state == 1) { // after the compose key + if ( // do not get distracted by any modifier keys + e_keysym==FL_Shift_L|| + e_keysym==FL_Shift_R || + e_keysym==FL_Alt_L || + e_keysym==FL_Alt_R || + e_keysym==FL_Meta_L || + e_keysym==FL_Meta_R || + e_keysym==FL_Control_R || + e_keysym==FL_Control_L || + e_keysym==FL_Menu + ) return 0; + + if (ascii == ' ') { // space turns into nbsp +#ifdef __APPLE__ + e_text[0] = char(0xCA); +#else + e_text[0] = char(0xA0); +#endif + compose_state = 0; + return 1; + } else if (ascii < ' ' || ascii == 127) { + compose_state = 0; + return 0; + } + + // see if it is either character of any pair: + for (const char *p = compose_pairs; *p; p += 2) + if (p[0] == ascii || p[1] == ascii) { + if (p[1] == ' ') e_text[0] = (p-compose_pairs)/2+0x80; + compose_state = ascii; + return 1; + } + + if (e_length) { // compose key also "quotes" control characters + compose_state = 0; + return 1; + } + + } else if (compose_state) { // second character of compose + + char c1 = char(compose_state); // retrieve first character +#ifdef __APPLE__ + if ( (c1==0x60 && ascii==0xab) || (c1==0x27 && ascii==0x60)) { + del = 1; + compose_state = '^'; + e_text[0] = 0xf6; + return 1; + } + if (ascii==' ') { + del = 0; + compose_state = 0; + return 0; + } +#endif + // now search for the pair in either order: + for (const char *p = compose_pairs; *p; p += 2) { + if (p[0] == ascii && p[1] == c1 || p[1] == ascii && p[0] == c1) { + e_text[0] = (p-compose_pairs)/2+0x80; + del = 1; // delete the old character and insert new one + compose_state = 0; + return 1; + } + } + + } + + int i = e_keysym; + + // See if they type the compose prefix key: + if (i == FL_Control_R || i == 0xff20/* Multi-Key */) { + compose_state = 1; + return 1; + } + +#ifdef WIN32 +#elif (defined __APPLE__) + if (e_state & 0x40000000) { + if (ascii<0x80) + compose_state = ascii; + else + compose_state = compose_pairs[(ascii-0x80)*2]; + return 1; + } +#else + // See if they typed a dead key. This gets it into the same state as + // typing prefix+accent: + if (i >= 0xfe50 && i <= 0xfe5b) { +# ifdef OLD_DEAD_KEY_CODE + ascii = dead_keys[i-0xfe50]; + for (const char *p = compose_pairs; *p; p += 2) + if (p[0] == ascii) { + compose_state = ascii; + return 1; + } +# else + ascii = e_text[0]; + for (const char *p = compose_pairs; *p; p += 2) + if (p[0] == ascii || + (p[1] == ' ' && (p - compose_pairs) / 2 + 0x80 == ascii)) { + compose_state = p[0]; + return 1; + } +# endif // OLD_DEAD_KEY_CODE + compose_state = 0; + return 1; + } +#endif + + // Only insert non-control characters: + if (e_length && (ascii & ~31 && ascii!=127)) {compose_state = 0; return 1;} + + return 0; +} + + + diff --git a/third_party/windows/fltk-1.1.10/src/Fl_display.cxx b/third_party/windows/fltk-1.1.10/src/Fl_display.cxx new file mode 100644 index 0000000..d0db51e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_display.cxx @@ -0,0 +1,54 @@ +// +// "$Id: Fl_display.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Display function for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Startup method to set what display to use. +// Using setenv makes programs that are exec'd use the same display. + +#include +#include +#include "flstring.h" + +void Fl::display(const char *d) { +#if defined(__APPLE__) || defined(WIN32) + (void)d; +#else + static char e[1024]; + strcpy(e,"DISPLAY="); + strlcat(e,d,sizeof(e)); + for (char *c = e+8; *c!=':'; c++) { + if (!*c) { + strlcat(e,":0.0",sizeof(e)); + break; + } + } + putenv(e); +#endif // __APPLE__ +} + +// +// End of "$Id: Fl_display.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_get_key.cxx b/third_party/windows/fltk-1.1.10/src/Fl_get_key.cxx new file mode 100644 index 0000000..3536ce2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_get_key.cxx @@ -0,0 +1,69 @@ +// +// "$Id: Fl_get_key.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Keyboard state routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifdef WIN32 +# include "Fl_get_key_win32.cxx" +#elif defined(__APPLE__) +# include "Fl_get_key_mac.cxx" +#else + +// Return the current state of a key. This is the X version. I identify +// keys (mostly) by the X keysym. So this turns the keysym into a keycode +// and looks it up in the X key bit vector, which Fl_x.cxx keeps track of. + +# include +# include + +extern char fl_key_vector[32]; // in Fl_x.cxx + +int Fl::event_key(int k) { + if (k > FL_Button && k <= FL_Button+8) + return Fl::event_state(8<<(k-FL_Button)); + int i; +# ifdef __sgi + // get some missing PC keyboard keys: + if (k == FL_Meta_L) i = 147; + else if (k == FL_Meta_R) i = 148; + else if (k == FL_Menu) i = 149; + else +# endif + i = XKeysymToKeycode(fl_display, k); + if (i==0) return 0; + return fl_key_vector[i/8] & (1 << (i%8)); +} + +int Fl::get_key(int k) { + fl_open_display(); + XQueryKeymap(fl_display, fl_key_vector); + return event_key(k); +} + +#endif + +// +// End of "$Id: Fl_get_key.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_get_key_mac.cxx b/third_party/windows/fltk-1.1.10/src/Fl_get_key_mac.cxx new file mode 100644 index 0000000..02dd22b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_get_key_mac.cxx @@ -0,0 +1,110 @@ +// +// "$Id: Fl_get_key_mac.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// MacOS keyboard state routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Return the current state of a key. Keys are named by fltk symbols, +// which are actually X keysyms. So this has to translate to macOS +// symbols. + +#include +#include +#include + +// convert an FLTK (X) keysym to a MacOS symbol: +// See also the inverse converter in Fl_mac.cxx +// This table is in numeric order by FLTK symbol order for binary search: + +static const struct {unsigned short vk, fltk;} vktab[] = { + { 49, ' ' }, { 39, '\'' }, { 43, ',' }, { 27, '-' }, { 47, '.' }, { 44, '/' }, + { 29, '0' }, { 18, '1' }, { 19, '2' }, { 20, '3' }, + { 21, '4' }, { 23, '5' }, { 22, '6' }, { 26, '7' }, + { 28, '8' }, { 25, '9' }, { 41, ';' }, { 24, '=' }, + { 0, 'A' }, { 11, 'B' }, { 8, 'C' }, { 2, 'D' }, + { 14, 'E' }, { 3, 'F' }, { 5, 'G' }, { 4, 'H' }, + { 34, 'I' }, { 38, 'J' }, { 40, 'K' }, { 37, 'L' }, + { 46, 'M' }, { 45, 'N' }, { 31, 'O' }, { 35, 'P' }, + { 12, 'Q' }, { 15, 'R' }, { 1, 'S' }, { 17, 'T' }, + { 32, 'U' }, { 9, 'V' }, { 13, 'W' }, { 7, 'X' }, + { 16, 'Y' }, { 6, 'Z' }, + { 33, '[' }, { 30, ']' }, { 50, '`' }, { 42, '|' }, + { 51, FL_BackSpace }, { 48, FL_Tab }, { 36, FL_Enter }, { 127, FL_Pause }, + { 107, FL_Scroll_Lock }, { 53, FL_Escape }, { 0x73, FL_Home }, { 123, FL_Left }, + { 126, FL_Up }, { 124, FL_Right }, { 125, FL_Down }, { 0x74, FL_Page_Up }, + { 0x79, FL_Page_Down }, { 119, FL_End }, { 0x71, FL_Print }, { 127, FL_Insert }, + { 0x6e, FL_Menu }, { 114, FL_Help }, { 0x47, FL_Num_Lock }, + { 76, FL_KP_Enter }, { 67, FL_KP+'*' }, { 69, FL_KP+'+'}, { 78, FL_KP+'-' }, { 65, FL_KP+'.' }, { 75, FL_KP+'/' }, + { 82, FL_KP+'0' }, { 83, FL_KP+'1' }, { 84, FL_KP+'2' }, { 85, FL_KP+'3' }, + { 86, FL_KP+'4' }, { 87, FL_KP+'5' }, { 88, FL_KP+'6' }, { 89, FL_KP+'7' }, + { 91, FL_KP+'8' }, { 92, FL_KP+'9' }, { 81, FL_KP+'=' }, + { 0x7a, FL_F+1 }, { 0x78, FL_F+2 }, { 0x63, FL_F+3 }, { 0x76, FL_F+4 }, + { 0x60, FL_F+5 }, { 0x61, FL_F+6 }, { 0x62, FL_F+7 }, { 0x64, FL_F+8 }, + { 0x65, FL_F+9 }, { 0x6D, FL_F+10 }, { 0x67, FL_F+11 }, { 0x6f, FL_F+12 }, + { 56, FL_Shift_L }, { 56, FL_Shift_R }, { 59, FL_Control_L }, { 59, FL_Control_R }, + { 57, FL_Caps_Lock }, { 55, FL_Meta_L }, { 55, FL_Meta_R }, + { 58, FL_Alt_L }, { 58, FL_Alt_R }, { 0x75, FL_Delete }, +}; + +static int fltk2mac(int fltk) { + int a = 0; + int b = sizeof(vktab)/sizeof(*vktab); + while (a < b) { + int c = (a+b)/2; + if (vktab[c].fltk == fltk) return vktab[c].vk; + if (vktab[c].fltk < fltk) a = c+1; else b = c; + } + return 127; +} + +//: returns true, if that key was pressed during the last event +int Fl::event_key(int k) { + return get_key(k); +} + +#include + +//: returns true, if that key is pressed right now +int Fl::get_key(int k) { + KeyMap foo; + GetKeys(foo); +#ifdef MAC_TEST_FOR_KEYCODES + static int cnt = 0; + if (cnt++>1024) { + cnt = 0; + printf("%08x %08x %08x %08x\n", (ulong*)(foo)[3], (ulong*)(foo)[2], (ulong*)(foo)[1], (ulong*)(foo)[0]); + } +#endif + unsigned char *b = (unsigned char*)foo; + // KP_Enter can be at different locations for Powerbooks vs. desktop Macs + if (k==FL_KP_Enter) { + return (((b[0x34>>3]>>(0x34&7))&1)||((b[0x4c>>3]>>(0x4c&7))&1)); + } + int i = fltk2mac(k); + return (b[i>>3]>>(i&7))&1; +} + +// +// End of "$Id: Fl_get_key_mac.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_get_key_win32.cxx b/third_party/windows/fltk-1.1.10/src/Fl_get_key_win32.cxx new file mode 100644 index 0000000..0970848 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_get_key_win32.cxx @@ -0,0 +1,138 @@ +// +// "$Id: Fl_get_key_win32.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// WIN32 keyboard state routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Return the current state of a key. Keys are named by fltk symbols, +// which are actually X keysyms. So this has to translate to MSWindows +// VK_x symbols. + +#include +#include + +// convert an Fltk (X) keysym to a MSWindows VK symbol: +// See also the inverse converter in Fl_win32.cxx +// This table is in numeric order by Fltk symbol order for binary search: + +static const struct {unsigned short vk, fltk;} vktab[] = { + {VK_SPACE, ' '}, + {'1', '!'}, + {0xde, '\"'}, + {'3', '#'}, + {'4', '$'}, + {'5', '%'}, + {'7', '&'}, + {0xde, '\''}, + {'9', '('}, + {'0', ')'}, + {'8', '*'}, + {0xbb, '+'}, + {0xbc, ','}, + {0xbd, '-'}, + {0xbe, '.'}, + {0xbf, '/'}, + {0xba, ':'}, + {0xba, ';'}, + {0xbc, '<'}, + {0xbb, '='}, + {0xbe, '>'}, + {0xbf, '?'}, + {'2', '@'}, + {0xdb, '['}, + {0xdc, '\\'}, + {0xdd, ']'}, + {'6', '^'}, + {0xbd, '_'}, + {0xc0, '`'}, + {0xdb, '{'}, + {0xdc, '|'}, + {0xdd, '}'}, + {0xc0, '~'}, + {VK_BACK, FL_BackSpace}, + {VK_TAB, FL_Tab}, + {VK_CLEAR, 0xff0b/*XK_Clear*/}, + {VK_RETURN, FL_Enter}, + {VK_PAUSE, FL_Pause}, + {VK_SCROLL, FL_Scroll_Lock}, + {VK_ESCAPE, FL_Escape}, + {VK_HOME, FL_Home}, + {VK_LEFT, FL_Left}, + {VK_UP, FL_Up}, + {VK_RIGHT, FL_Right}, + {VK_DOWN, FL_Down}, + {VK_PRIOR, FL_Page_Up}, + {VK_NEXT, FL_Page_Down}, + {VK_END, FL_End}, + {VK_SNAPSHOT, FL_Print}, + {VK_INSERT, FL_Insert}, + {VK_APPS, FL_Menu}, + {VK_NUMLOCK, FL_Num_Lock}, +//{VK_???, FL_KP_Enter}, + {VK_MULTIPLY, FL_KP+'*'}, + {VK_ADD, FL_KP+'+'}, + {VK_SUBTRACT, FL_KP+'-'}, + {VK_DECIMAL, FL_KP+'.'}, + {VK_DIVIDE, FL_KP+'/'}, + {VK_LSHIFT, FL_Shift_L}, + {VK_RSHIFT, FL_Shift_R}, + {VK_LCONTROL, FL_Control_L}, + {VK_RCONTROL, FL_Control_R}, + {VK_CAPITAL, FL_Caps_Lock}, + {VK_LWIN, FL_Meta_L}, + {VK_RWIN, FL_Meta_R}, + {VK_LMENU, FL_Alt_L}, + {VK_RMENU, FL_Alt_R}, + {VK_DELETE, FL_Delete} +}; + +static int fltk2ms(int fltk) { + if (fltk >= '0' && fltk <= '9') return fltk; + if (fltk >= 'A' && fltk <= 'Z') return fltk; + if (fltk >= 'a' && fltk <= 'z') return fltk-('a'-'A'); + if (fltk > FL_F && fltk <= FL_F+16) return fltk-(FL_F-(VK_F1-1)); + if (fltk >= FL_KP+'0' && fltk<=FL_KP+'9') return fltk-(FL_KP+'0'-VK_NUMPAD0); + int a = 0; + int b = sizeof(vktab)/sizeof(*vktab); + while (a < b) { + int c = (a+b)/2; + if (vktab[c].fltk == fltk) return vktab[c].vk; + if (vktab[c].fltk < fltk) a = c+1; else b = c; + } + return 0; +} + +int Fl::event_key(int k) { + return GetKeyState(fltk2ms(k))&~1; +} + +int Fl::get_key(int k) { + uchar foo[256]; + GetKeyboardState(foo); + return foo[fltk2ms(k)]&~1; +} + +// +// End of "$Id: Fl_get_key_win32.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_get_system_colors.cxx b/third_party/windows/fltk-1.1.10/src/Fl_get_system_colors.cxx new file mode 100644 index 0000000..2c8b46e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_get_system_colors.cxx @@ -0,0 +1,386 @@ +// +// "$Id: Fl_get_system_colors.cxx 5699 2007-02-20 17:02:41Z matt $" +// +// System color support for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include "flstring.h" +#include +#include +#include +#include +#include "tile.xpm" + +#if defined(__APPLE__) && defined(__MWERKS__) +extern "C" int putenv(const char*); +#endif // __APPLE__ && __MWERKS__ + +#if defined(WIN32) && !defined(__CYGWIN__) && !defined(__WATCOMC__) +// Visual C++ 2005 incorrectly displays a warning about the use of POSIX APIs +// on Windows, which is supposed to be POSIX compliant... +# define putenv _putenv +#endif // WIN32 && !__CYGWIN__ + +static char fl_bg_set = 0; +static char fl_bg2_set = 0; +static char fl_fg_set = 0; + + +void Fl::background(uchar r, uchar g, uchar b) { + fl_bg_set = 1; + + // replace the gray ramp so that FL_GRAY is this color + if (!r) r = 1; else if (r==255) r = 254; + double powr = log(r/255.0)/log((FL_GRAY-FL_GRAY_RAMP)/(FL_NUM_GRAY-1.0)); + if (!g) g = 1; else if (g==255) g = 254; + double powg = log(g/255.0)/log((FL_GRAY-FL_GRAY_RAMP)/(FL_NUM_GRAY-1.0)); + if (!b) b = 1; else if (b==255) b = 254; + double powb = log(b/255.0)/log((FL_GRAY-FL_GRAY_RAMP)/(FL_NUM_GRAY-1.0)); + for (int i = 0; i < FL_NUM_GRAY; i++) { + double gray = i/(FL_NUM_GRAY-1.0); + Fl::set_color(fl_gray_ramp(i), + uchar(pow(gray,powr)*255+.5), + uchar(pow(gray,powg)*255+.5), + uchar(pow(gray,powb)*255+.5)); + } +} + +void Fl::foreground(uchar r, uchar g, uchar b) { + fl_fg_set = 1; + + Fl::set_color(FL_FOREGROUND_COLOR,r,g,b); +} + +void Fl::background2(uchar r, uchar g, uchar b) { + fl_bg2_set = 1; + + Fl::set_color(FL_BACKGROUND2_COLOR,r,g,b); + Fl::set_color(FL_FOREGROUND_COLOR, + get_color(fl_contrast(FL_FOREGROUND_COLOR,FL_BACKGROUND2_COLOR))); +} + +// these are set by Fl::args() and override any system colors: +const char *fl_fg = NULL; +const char *fl_bg = NULL; +const char *fl_bg2 = NULL; + +static void set_selection_color(uchar r, uchar g, uchar b) { + Fl::set_color(FL_SELECTION_COLOR,r,g,b); +} + +#if defined(WIN32) || defined(__APPLE__) + +# include +// simulation of XParseColor: +int fl_parse_color(const char* p, uchar& r, uchar& g, uchar& b) { + if (*p == '#') p++; + int n = strlen(p); + int m = n/3; + const char *pattern = 0; + switch(m) { + case 1: pattern = "%1x%1x%1x"; break; + case 2: pattern = "%2x%2x%2x"; break; + case 3: pattern = "%3x%3x%3x"; break; + case 4: pattern = "%4x%4x%4x"; break; + default: return 0; + } + int R,G,B; if (sscanf(p,pattern,&R,&G,&B) != 3) return 0; + switch(m) { + case 1: R *= 0x11; G *= 0x11; B *= 0x11; break; + case 3: R >>= 4; G >>= 4; B >>= 4; break; + case 4: R >>= 8; G >>= 8; B >>= 8; break; + } + r = (uchar)R; g = (uchar)G; b = (uchar)B; + return 1; +} +#else +// Wrapper around XParseColor... +int fl_parse_color(const char* p, uchar& r, uchar& g, uchar& b) { + XColor x; + if (!fl_display) fl_open_display(); + if (XParseColor(fl_display, fl_colormap, p, &x)) { + r = (uchar)(x.red>>8); + g = (uchar)(x.green>>8); + b = (uchar)(x.blue>>8); + return 1; + } else return 0; +} +#endif // WIN32 || __APPLE__ + +#if defined(WIN32) +static void +getsyscolor(int what, const char* arg, void (*func)(uchar,uchar,uchar)) +{ + if (arg) { + uchar r,g,b; + if (!fl_parse_color(arg, r,g,b)) + Fl::error("Unknown color: %s", arg); + else + func(r,g,b); + } else { + DWORD x = GetSysColor(what); + func(uchar(x&255), uchar(x>>8), uchar(x>>16)); + } +} + +void Fl::get_system_colors() { + if (!fl_bg2_set) getsyscolor(COLOR_WINDOW, fl_bg2,Fl::background2); + if (!fl_fg_set) getsyscolor(COLOR_WINDOWTEXT, fl_fg, Fl::foreground); + if (!fl_bg_set) getsyscolor(COLOR_BTNFACE, fl_bg, Fl::background); + getsyscolor(COLOR_HIGHLIGHT, 0, set_selection_color); +} + +#elif defined(__APPLE__) +// MacOS X currently supports two color schemes - Blue and Graphite. +// Since we aren't emulating the Aqua interface (even if Apple would +// let us), we use some defaults that are similar to both. The +// Fl::scheme("plastic") color/box scheme provides a usable Aqua-like +// look-n-feel... +void Fl::get_system_colors() +{ + fl_open_display(); + + if (!fl_bg2_set) background2(0xff, 0xff, 0xff); + if (!fl_fg_set) foreground(0, 0, 0); + if (!fl_bg_set) background(0xd8, 0xd8, 0xd8); + +#if 0 + // this would be the correct code, but it does not run on all versions + // of OS X. Also, setting a bright selection color would require + // some updates in Fl_Adjuster and Fl_Help_Browser + OSStatus err; + RGBColor c; + err = GetThemeBrushAsColor(kThemeBrushPrimaryHighlightColor, 24, true, &c); + if (err) + set_selection_color(0x00, 0x00, 0x80); + else + set_selection_color(c.red, c.green, c.blue); +#else + set_selection_color(0x00, 0x00, 0x80); +#endif +} +#else + +// Read colors that KDE writes to the xrdb database. + +// XGetDefault does not do the expected thing: it does not like +// periods in either word. Therefore it cannot match class.Text.background. +// However *.Text.background is matched by pretending the program is "Text". +// But this will also match *.background if there is no *.Text.background +// entry, requiring users to put in both (unless they want the text fields +// the same color as the windows). + +static void +getsyscolor(const char *key1, const char* key2, const char *arg, const char *defarg, void (*func)(uchar,uchar,uchar)) +{ + if (!arg) { + arg = XGetDefault(fl_display, key1, key2); + if (!arg) arg = defarg; + } + XColor x; + if (!XParseColor(fl_display, fl_colormap, arg, &x)) + Fl::error("Unknown color: %s", arg); + else + func(x.red>>8, x.green>>8, x.blue>>8); +} + +void Fl::get_system_colors() +{ + fl_open_display(); + const char* key1 = 0; + if (Fl::first_window()) key1 = Fl::first_window()->xclass(); + if (!key1) key1 = "fltk"; + if (!fl_bg2_set) getsyscolor("Text","background", fl_bg2, "#ffffff", Fl::background2); + if (!fl_fg_set) getsyscolor(key1, "foreground", fl_fg, "#000000", Fl::foreground); + if (!fl_bg_set) getsyscolor(key1, "background", fl_bg, "#c0c0c0", Fl::background); + getsyscolor("Text", "selectBackground", 0, "#000080", set_selection_color); +} + +#endif + + +//// Simple implementation of 2.0 Fl::scheme() interface... +#define D1 BORDER_WIDTH +#define D2 (BORDER_WIDTH+BORDER_WIDTH) + +extern void fl_up_box(int, int, int, int, Fl_Color); +extern void fl_down_box(int, int, int, int, Fl_Color); +extern void fl_thin_up_box(int, int, int, int, Fl_Color); +extern void fl_thin_down_box(int, int, int, int, Fl_Color); +extern void fl_round_up_box(int, int, int, int, Fl_Color); +extern void fl_round_down_box(int, int, int, int, Fl_Color); + +extern void fl_up_frame(int, int, int, int, Fl_Color); +extern void fl_down_frame(int, int, int, int, Fl_Color); +extern void fl_thin_up_frame(int, int, int, int, Fl_Color); +extern void fl_thin_down_frame(int, int, int, int, Fl_Color); + +const char *Fl::scheme_ = (const char *)0; +Fl_Image *Fl::scheme_bg_ = (Fl_Image *)0; + +static Fl_Pixmap tile(tile_xpm); + +int Fl::scheme(const char *s) { + if (!s) { + if ((s = getenv("FLTK_SCHEME")) == NULL) { +#if !defined(WIN32) && !defined(__APPLE__) + const char* key = 0; + if (Fl::first_window()) key = Fl::first_window()->xclass(); + if (!key) key = "fltk"; + fl_open_display(); + s = XGetDefault(fl_display, key, "scheme"); +#endif // !WIN32 && !__APPLE__ + } + } + + if (s) { + if (!strcasecmp(s, "none") || !strcasecmp(s, "base") || !*s) s = 0; + else s = strdup(s); + } + if (scheme_) free((void*)scheme_); + scheme_ = s; + + // Save the new scheme in the FLTK_SCHEME env var so that child processes + // inherit it... + static char e[1024]; + strcpy(e,"FLTK_SCHEME="); + if (s) strlcat(e,s,sizeof(e)); + putenv(e); + + // Load the scheme... + return reload_scheme(); +} + +int Fl::reload_scheme() { + Fl_Window *win; + + if (scheme_ && !strcasecmp(scheme_, "plastic")) { + // Update the tile image to match the background color... + uchar r, g, b; + int nr, ng, nb; + int i; +// static uchar levels[3] = { 0xff, 0xef, 0xe8 }; + // OSX 10.3 and higher use a background with less contrast... + static uchar levels[3] = { 0xff, 0xf8, 0xf4 }; + + get_color(FL_GRAY, r, g, b); + +// printf("FL_GRAY = 0x%02x 0x%02x 0x%02x\n", r, g, b); + + for (i = 0; i < 3; i ++) { + nr = levels[i] * r / 0xe8; + if (nr > 255) nr = 255; + + ng = levels[i] * g / 0xe8; + if (ng > 255) ng = 255; + + nb = levels[i] * b / 0xe8; + if (nb > 255) nb = 255; + + sprintf(tile_cmap[i], "%c c #%02x%02x%02x", "Oo."[i], nr, ng, nb); +// puts(tile_cmap[i]); + } + + tile.uncache(); + + if (!scheme_bg_) scheme_bg_ = new Fl_Tiled_Image(&tile, w(), h()); + + // Load plastic buttons, etc... + set_boxtype(FL_UP_FRAME, FL_PLASTIC_UP_FRAME); + set_boxtype(FL_DOWN_FRAME, FL_PLASTIC_DOWN_FRAME); + set_boxtype(FL_THIN_UP_FRAME, FL_PLASTIC_UP_FRAME); + set_boxtype(FL_THIN_DOWN_FRAME, FL_PLASTIC_DOWN_FRAME); + + set_boxtype(FL_UP_BOX, FL_PLASTIC_UP_BOX); + set_boxtype(FL_DOWN_BOX, FL_PLASTIC_DOWN_BOX); + set_boxtype(FL_THIN_UP_BOX, FL_PLASTIC_THIN_UP_BOX); + set_boxtype(FL_THIN_DOWN_BOX, FL_PLASTIC_THIN_DOWN_BOX); + set_boxtype(_FL_ROUND_UP_BOX, FL_PLASTIC_ROUND_UP_BOX); + set_boxtype(_FL_ROUND_DOWN_BOX, FL_PLASTIC_ROUND_DOWN_BOX); + + // Use standard size scrollbars... + Fl::scrollbar_size(16); + } else if (scheme_ && !strcasecmp(scheme_, "gtk+")) { + // Use a GTK+ inspired look-n-feel... + if (scheme_bg_) { + delete scheme_bg_; + scheme_bg_ = (Fl_Image *)0; + } + + set_boxtype(FL_UP_FRAME, FL_GTK_UP_FRAME); + set_boxtype(FL_DOWN_FRAME, FL_GTK_DOWN_FRAME); + set_boxtype(FL_THIN_UP_FRAME, FL_GTK_THIN_UP_FRAME); + set_boxtype(FL_THIN_DOWN_FRAME, FL_GTK_THIN_DOWN_FRAME); + + set_boxtype(FL_UP_BOX, FL_GTK_UP_BOX); + set_boxtype(FL_DOWN_BOX, FL_GTK_DOWN_BOX); + set_boxtype(FL_THIN_UP_BOX, FL_GTK_THIN_UP_BOX); + set_boxtype(FL_THIN_DOWN_BOX, FL_GTK_THIN_DOWN_BOX); + set_boxtype(_FL_ROUND_UP_BOX, FL_GTK_ROUND_UP_BOX); + set_boxtype(_FL_ROUND_DOWN_BOX, FL_GTK_ROUND_DOWN_BOX); + + // Use slightly thinner scrollbars... + Fl::scrollbar_size(15); + } else { + // Use the standard FLTK look-n-feel... + if (scheme_bg_) { + delete scheme_bg_; + scheme_bg_ = (Fl_Image *)0; + } + + set_boxtype(FL_UP_FRAME, fl_up_frame, D1, D1, D2, D2); + set_boxtype(FL_DOWN_FRAME, fl_down_frame, D1, D1, D2, D2); + set_boxtype(FL_THIN_UP_FRAME, fl_thin_up_frame, 1, 1, 2, 2); + set_boxtype(FL_THIN_DOWN_FRAME, fl_thin_down_frame, 1, 1, 2, 2); + + set_boxtype(FL_UP_BOX, fl_up_box, D1, D1, D2, D2); + set_boxtype(FL_DOWN_BOX, fl_down_box, D1, D1, D2, D2); + set_boxtype(FL_THIN_UP_BOX, fl_thin_up_box, 1, 1, 2, 2); + set_boxtype(FL_THIN_DOWN_BOX, fl_thin_down_box, 1, 1, 2, 2); + set_boxtype(_FL_ROUND_UP_BOX, fl_round_up_box, 3, 3, 6, 6); + set_boxtype(_FL_ROUND_DOWN_BOX, fl_round_down_box, 3, 3, 6, 6); + + // Use standard size scrollbars... + Fl::scrollbar_size(16); + } + + // Set (or clear) the background tile for all windows... + for (win = first_window(); win; win = next_window(win)) { + win->labeltype(scheme_bg_ ? FL_NORMAL_LABEL : FL_NO_LABEL); + win->align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE | FL_ALIGN_CLIP); + win->image(scheme_bg_); + win->redraw(); + } + + return 1; +} + + +// +// End of "$Id: Fl_get_system_colors.cxx 5699 2007-02-20 17:02:41Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_grab.cxx b/third_party/windows/fltk-1.1.10/src/Fl_grab.cxx new file mode 100644 index 0000000..fe7e5e7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_grab.cxx @@ -0,0 +1,106 @@ +// +// "$Id: Fl_grab.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Grab/release code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include + +//////////////////////////////////////////////////////////////// +// "Grab" is done while menu systems are up. This has several effects: +// Events are all sent to the "grab window", which does not even +// have to be displayed (and in the case of Fl_Menu.cxx it isn't). +// The system is also told to "grab" events and send them to this app. +// This also modifies how Fl_Window::show() works, on X it turns on +// override_redirect, it does similar things on WIN32. + +extern void fl_fix_focus(); // in Fl.cxx + +#ifdef WIN32 +// We have to keep track of whether we have captured the mouse, since +// MSWindows shows little respect for this... Grep for fl_capture to +// see where and how this is used. +extern HWND fl_capture; +#endif + +#ifdef __APPLE__ +// MacOS Carbon does not seem to have a mechanism to grab the mouse pointer +extern WindowRef fl_capture; +#endif + +void Fl::grab(Fl_Window* win) { + if (win) { + if (!grab_) { +#ifdef WIN32 + SetActiveWindow(fl_capture = fl_xid(first_window())); + SetCapture(fl_capture); +#elif defined(__APPLE__) + fl_capture = fl_xid( first_window() ); + SetUserFocusWindow( fl_capture ); +#else + XGrabPointer(fl_display, + fl_xid(first_window()), + 1, + ButtonPressMask|ButtonReleaseMask| + ButtonMotionMask|PointerMotionMask, + GrabModeAsync, + GrabModeAsync, + None, + 0, + fl_event_time); + XGrabKeyboard(fl_display, + fl_xid(first_window()), + 1, + GrabModeAsync, + GrabModeAsync, + fl_event_time); +#endif + } + grab_ = win; + } else { + if (grab_) { +#ifdef WIN32 + fl_capture = 0; + ReleaseCapture(); +#elif defined(__APPLE__) + fl_capture = 0; + SetUserFocusWindow( (WindowRef)kUserFocusAuto ); +#else + XUngrabKeyboard(fl_display, fl_event_time); + XUngrabPointer(fl_display, fl_event_time); + // this flush is done in case the picked menu item goes into + // an infinite loop, so we don't leave the X server locked up: + XFlush(fl_display); +#endif + grab_ = 0; + fl_fix_focus(); + } + } +} + +// +// End of "$Id: Fl_grab.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_lock.cxx b/third_party/windows/fltk-1.1.10/src/Fl_lock.cxx new file mode 100644 index 0000000..ced5259 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_lock.cxx @@ -0,0 +1,358 @@ +// +// "$Id: Fl_lock.cxx 5950 2007-10-07 10:44:28Z matt $" +// +// Multi-threading support code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + + +#include +#include + +#include + +/* + From Bill: + + I would prefer that FLTK contain the minimal amount of extra + stuff for doing threads. There are other portable thread + wrapper libraries out there and FLTK should not be providing + another. This file is an attempt to make minimal additions + and make them self-contained in this source file. + + From Mike: + + Starting with 1.1.8, we now have a callback so that you can + process awake() messages as they come in. + + + The API: + + Fl::lock() - recursive lock. You must call this before the + first call to Fl::wait()/run() to initialize the thread + system. The lock is locked all the time except when + Fl::wait() is waiting for events. + + Fl::unlock() - release the recursive lock. + + Fl::awake(void*) - Causes Fl::wait() to return (with the lock + locked) even if there are no events ready. + + Fl::awake(void (*cb)(void *), void*) - Call a function + in the main thread from within another thread of execution. + + Fl::thread_message() - returns an argument sent to an + Fl::awake() call, or returns NULL if none. WARNING: the + current implementation only has a one-entry queue and only + returns the most recent value! +*/ + +Fl_Awake_Handler *Fl::awake_ring_; +void **Fl::awake_data_; +int Fl::awake_ring_size_; +int Fl::awake_ring_head_; +int Fl::awake_ring_tail_; +static const int AWAKE_RING_SIZE = 1024; + +static void lock_ring(); +static void unlock_ring(); + + +int Fl::add_awake_handler_(Fl_Awake_Handler func, void *data) +{ + int ret = 0; + lock_ring(); + if (!awake_ring_) { + awake_ring_size_ = AWAKE_RING_SIZE; + awake_ring_ = (Fl_Awake_Handler*)malloc(awake_ring_size_*sizeof(Fl_Awake_Handler)); + awake_data_ = (void**)malloc(awake_ring_size_*sizeof(void*)); + } + if (awake_ring_head_==awake_ring_tail_-1 || awake_ring_head_+1==awake_ring_tail_) { + // ring is full. Return -1 as an error indicator. + ret = -1; + } else { + awake_ring_[awake_ring_head_] = func; + awake_data_[awake_ring_head_] = data; + ++awake_ring_head_; + if (awake_ring_head_ == awake_ring_size_) + awake_ring_head_ = 0; + } + unlock_ring(); + return ret; +} + +int Fl::get_awake_handler_(Fl_Awake_Handler &func, void *&data) +{ + int ret = 0; + lock_ring(); + if (!awake_ring_ || awake_ring_head_ == awake_ring_tail_) { + ret = -1; + } else { + func = awake_ring_[awake_ring_tail_]; + data = awake_data_[awake_ring_tail_]; + ++awake_ring_tail_; + if (awake_ring_tail_ == awake_ring_size_) + awake_ring_tail_ = 0; + } + unlock_ring(); + return ret; +} + +// +// 'Fl::awake()' - Let the main thread know an update is pending +// and have it cal a specific function +// +int Fl::awake(Fl_Awake_Handler func, void *data) { + int ret = add_awake_handler_(func, data); + Fl::awake(); + return ret; +} + +//////////////////////////////////////////////////////////////// +// Windows threading... +#ifdef WIN32 +# include +# include +# include + +// These pointers are in Fl_win32.cxx: +extern void (*fl_lock_function)(); +extern void (*fl_unlock_function)(); + +// The main thread's ID +static DWORD main_thread; + +// Microsoft's version of a MUTEX... +CRITICAL_SECTION cs; +CRITICAL_SECTION *cs_ring; + +void unlock_ring() { + LeaveCriticalSection(cs_ring); +} + +void lock_ring() { + if (!cs_ring) { + cs_ring = (CRITICAL_SECTION*)malloc(sizeof(CRITICAL_SECTION)); + InitializeCriticalSection(cs_ring); + } + EnterCriticalSection(cs_ring); +} + +// +// 'unlock_function()' - Release the lock. +// + +static void unlock_function() { + LeaveCriticalSection(&cs); +} + +// +// 'lock_function()' - Get the lock. +// + +static void lock_function() { + EnterCriticalSection(&cs); +} + +// +// 'Fl::lock()' - Lock access to FLTK data structures... +// + +void Fl::lock() { + if (!main_thread) InitializeCriticalSection(&cs); + + lock_function(); + + if (!main_thread) { + fl_lock_function = lock_function; + fl_unlock_function = unlock_function; + main_thread = GetCurrentThreadId(); + } +} + +// +// 'Fl::unlock()' - Unlock access to FLTK data structures... +// + +void Fl::unlock() { + unlock_function(); +} + + +// +// 'Fl::awake()' - Let the main thread know an update is pending. +// +// When called from a thread, it causes FLTK to awake from Fl::wait()... +// + +void Fl::awake(void* msg) { + PostThreadMessage( main_thread, fl_wake_msg, (WPARAM)msg, 0); +} + +//////////////////////////////////////////////////////////////// +// POSIX threading... +#elif HAVE_PTHREAD +# include +# include +# include + +// Pipe for thread messaging via Fl::awake()... +static int thread_filedes[2]; + +// Mutex and state information for Fl::lock() and Fl::unlock()... +static pthread_mutex_t fltk_mutex; +static pthread_t owner; +static int counter; + +static void lock_function_init_std() { + pthread_mutex_init(&fltk_mutex, NULL); +} + +static void lock_function_std() { + if (!counter || owner != pthread_self()) { + pthread_mutex_lock(&fltk_mutex); + owner = pthread_self(); + } + counter++; +} + +static void unlock_function_std() { + if (!--counter) pthread_mutex_unlock(&fltk_mutex); +} + +# ifdef PTHREAD_MUTEX_RECURSIVE +static bool lock_function_init_rec() { + pthread_mutexattr_t attrib; + pthread_mutexattr_init(&attrib); + if (pthread_mutexattr_settype(&attrib, PTHREAD_MUTEX_RECURSIVE)) { + pthread_mutexattr_destroy(&attrib); + return true; + } + + pthread_mutex_init(&fltk_mutex, &attrib); + return false; +} + +static void lock_function_rec() { + pthread_mutex_lock(&fltk_mutex); +} + +static void unlock_function_rec() { + pthread_mutex_unlock(&fltk_mutex); +} +# endif // PTHREAD_MUTEX_RECURSIVE + +void Fl::awake(void* msg) { + write(thread_filedes[1], &msg, sizeof(void*)); +} + +static void* thread_message_; +void* Fl::thread_message() { + void* r = thread_message_; + thread_message_ = 0; + return r; +} + +static void thread_awake_cb(int fd, void*) { + read(fd, &thread_message_, sizeof(void*)); + Fl_Awake_Handler func; + void *data; + while (Fl::get_awake_handler_(func, data)==0) { + (*func)(data); + } +} + +// These pointers are in Fl_x.cxx: +extern void (*fl_lock_function)(); +extern void (*fl_unlock_function)(); + +void Fl::lock() { + if (!thread_filedes[1]) { + // Initialize thread communication pipe to let threads awake FLTK + // from Fl::wait() + pipe(thread_filedes); + + // Make the write side of the pipe non-blocking to avoid deadlock + // conditions (STR #1537) + fcntl(thread_filedes[1], F_SETFL, + fcntl(thread_filedes[1], F_GETFL) | O_NONBLOCK); + + // Monitor the read side of the pipe so that messages sent via + // Fl::awake() from a thread will "wake up" the main thread in + // Fl::wait(). + Fl::add_fd(thread_filedes[0], FL_READ, thread_awake_cb); + + // Set lock/unlock functions for this system, using a system-supplied + // recursive mutex if supported... +# ifdef PTHREAD_MUTEX_RECURSIVE + if (!lock_function_init_rec()) { + fl_lock_function = lock_function_rec; + fl_unlock_function = unlock_function_rec; + } else { +# endif // PTHREAD_MUTEX_RECURSIVE + lock_function_init_std(); + fl_lock_function = lock_function_std; + fl_unlock_function = unlock_function_std; +# ifdef PTHREAD_MUTEX_RECURSIVE + } +# endif // PTHREAD_MUTEX_RECURSIVE + } + + fl_lock_function(); +} + +void Fl::unlock() { + fl_unlock_function(); +} + +// Mutex code for the awake ring buffer +static pthread_mutex_t *ring_mutex; + +void unlock_ring() { + pthread_mutex_unlock(ring_mutex); +} + +void lock_ring() { + if (!ring_mutex) { + ring_mutex = (pthread_mutex_t*)malloc(sizeof(pthread_mutex_t)); + pthread_mutex_init(ring_mutex, NULL); + } + pthread_mutex_lock(ring_mutex); +} + +#else + +void unlock_ring() { +} + +void lock_ring() { +} + +void Fl::awake(void*) { +} + +#endif // WIN32 + +// +// End of "$Id: Fl_lock.cxx 5950 2007-10-07 10:44:28Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_mac.cxx b/third_party/windows/fltk-1.1.10/src/Fl_mac.cxx new file mode 100644 index 0000000..6a8fbf5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_mac.cxx @@ -0,0 +1,2475 @@ +// +// "$Id: Fl_mac.cxx 6800 2009-06-28 21:54:59Z matt $" +// +// MacOS specific code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +//// From the inner edge of a MetroWerks CodeWarrior CD: +// (without permission) +// +// "Three Compiles for 68Ks under the sky, +// Seven Compiles for PPCs in their fragments of code, +// Nine Compiles for Mortal Carbon doomed to die, +// One Compile for Mach-O Cocoa on its Mach-O throne, +// in the Land of MacOS X where the Drop-Shadows lie. +// +// One Compile to link them all, One Compile to merge them, +// One Compile to copy them all and in the bundle bind them, +// in the Land of MacOS X where the Drop-Shadows lie." + +// warning: the Apple Quartz version still uses some Quickdraw calls, +// mostly to get around the single active context in QD and +// to implement clipping. This should be changed into pure +// Quartz calls in the near future. + +// we don't need the following definition because we deliver only +// true mouse moves. On very slow systems however, this flag may +// still be useful. +#define CONSOLIDATE_MOTION 0 +extern "C" { +#include +} + +#include +#include +#include +#include +#include +#include +#include +#include +#include "flstring.h" +#include + +// #define DEBUG_SELECT // UNCOMMENT FOR SELECT()/THREAD DEBUGGING +#ifdef DEBUG_SELECT +#include // testing +#define DEBUGMSG(msg) if ( msg ) fprintf(stderr, msg); +#define DEBUGPERRORMSG(msg) if ( msg ) perror(msg) +#define DEBUGTEXT(txt) txt +#else +#define DEBUGMSG(msg) +#define DEBUGPERRORMSG(msg) +#define DEBUGTEXT(txt) NULL +#endif /*DEBUG_SELECT*/ + +// external functions +extern Fl_Window* fl_find(Window); +extern void fl_fix_focus(); + +// forward definition of functions in this file +static void handleUpdateEvent( WindowPtr xid ); +//+ int fl_handle(const EventRecord &event); +static int FSSpec2UnixPath( FSSpec *fs, char *dst ); + +// public variables +int fl_screen; +CGContextRef fl_gc = 0; +Handle fl_system_menu; +Fl_Sys_Menu_Bar *fl_sys_menu_bar = 0; +CursHandle fl_default_cursor; +WindowRef fl_capture = 0; // we need this to compensate for a missing(?) mouse capture +ulong fl_event_time; // the last timestamp from an x event +char fl_key_vector[32]; // used by Fl::get_key() +bool fl_show_iconic; // true if called from iconize() - shows the next created window in collapsed state +int fl_disable_transient_for; // secret method of removing TRANSIENT_FOR +const Fl_Window* fl_modal_for; // parent of modal() window +Fl_Region fl_window_region = 0; +Window fl_window; +Fl_Window *Fl_Window::current_; +EventRef fl_os_event; // last (mouse) event + +// forward declarations of variables in this file +static int got_events = 0; +static Fl_Window* resize_from_system; +static CursPtr default_cursor_ptr; +static Cursor default_cursor; +static WindowRef fl_os_capture = 0; // the dispatch handler will redirect mose move and drag events to these windows + +#if CONSOLIDATE_MOTION +static Fl_Window* send_motion; +extern Fl_Window* fl_xmousewin; +#endif + +enum { kEventClassFLTK = 'fltk' }; +enum { kEventFLTKBreakLoop = 1, kEventFLTKDataReady }; + +/** +* Mac keyboard lookup table + */ +static unsigned short macKeyLookUp[128] = +{ + 'a', 's', 'd', 'f', 'h', 'g', 'z', 'x', + 'c', 'v', '^', 'b', 'q', 'w', 'e', 'r', + + 'y', 't', '1', '2', '3', '4', '6', '5', + '=', '9', '7', '-', '8', '0', ']', 'o', + + 'u', '[', 'i', 'p', FL_Enter, 'l', 'j', '\'', + 'k', ';', '\\', ',', '/', 'n', 'm', '.', + + FL_Tab, ' ', '`', FL_BackSpace, + FL_KP_Enter, FL_Escape, 0, 0/*FL_Meta_L*/, + 0/*FL_Shift_L*/, 0/*FL_Caps_Lock*/, 0/*FL_Alt_L*/, 0/*FL_Control_L*/, + 0/*FL_Shift_R*/, 0/*FL_Alt_R*/, 0/*FL_Control_R*/, 0, + + 0, FL_KP+'.', FL_Right, FL_KP+'*', 0, FL_KP+'+', FL_Left, FL_Num_Lock, + FL_Down, 0, 0, FL_KP+'/', FL_KP_Enter, FL_Up, FL_KP+'-', 0, + + 0, FL_KP+'=', FL_KP+'0', FL_KP+'1', FL_KP+'2', FL_KP+'3', FL_KP+'4', FL_KP+'5', + FL_KP+'6', FL_KP+'7', 0, FL_KP+'8', FL_KP+'9', 0, 0, 0, + + FL_F+5, FL_F+6, FL_F+7, FL_F+3, FL_F+8, FL_F+9, 0, FL_F+11, + 0, 0/*FL_F+13*/, FL_Print, FL_Scroll_Lock, 0, FL_F+10, FL_Menu, FL_F+12, + + 0, FL_Pause, FL_Help, FL_Home, FL_Page_Up, FL_Delete, FL_F+4, FL_End, + FL_F+2, FL_Page_Down, FL_F+1, FL_Left, FL_Right, FL_Down, FL_Up, 0/*FL_Power*/, +}; + +/** + * convert the current mouse chord into the FLTK modifier state + */ +static unsigned int mods_to_e_state( UInt32 mods ) +{ + long state = 0; + if ( mods & kEventKeyModifierNumLockMask ) state |= FL_NUM_LOCK; + if ( mods & cmdKey ) state |= FL_META; + if ( mods & (optionKey|rightOptionKey) ) state |= FL_ALT; + if ( mods & (controlKey|rightControlKey) ) state |= FL_CTRL; + if ( mods & (shiftKey|rightShiftKey) ) state |= FL_SHIFT; + if ( mods & alphaLock ) state |= FL_CAPS_LOCK; + unsigned int ret = ( Fl::e_state & 0xff000000 ) | state; + Fl::e_state = ret; + //printf( "State 0x%08x (%04x)\n", ret, mods ); + return ret; +} + + +/** + * convert the current mouse chord into the FLTK keysym + */ +static void mods_to_e_keysym( UInt32 mods ) +{ + if ( mods & cmdKey ) Fl::e_keysym = FL_Meta_L; + else if ( mods & kEventKeyModifierNumLockMask ) Fl::e_keysym = FL_Num_Lock; + else if ( mods & optionKey ) Fl::e_keysym = FL_Alt_L; + else if ( mods & rightOptionKey ) Fl::e_keysym = FL_Alt_R; + else if ( mods & controlKey ) Fl::e_keysym = FL_Control_L; + else if ( mods & rightControlKey ) Fl::e_keysym = FL_Control_R; + else if ( mods & shiftKey ) Fl::e_keysym = FL_Shift_L; + else if ( mods & rightShiftKey ) Fl::e_keysym = FL_Shift_R; + else if ( mods & alphaLock ) Fl::e_keysym = FL_Caps_Lock; + else Fl::e_keysym = 0; + //printf( "to sym 0x%08x (%04x)\n", Fl::e_keysym, mods ); +} +// these pointers are set by the Fl::lock() function: +static void nothing() {} +void (*fl_lock_function)() = nothing; +void (*fl_unlock_function)() = nothing; + +// +// Select interface -- how it's implemented: +// When the user app configures one or more file descriptors to monitor +// with Fl::add_fd(), we start a separate thread to select() the data, +// sending a custom OSX 'FLTK data ready event' to the parent thread's +// RunApplicationLoop(), so that it triggers the data ready callbacks +// in the parent thread. -erco 04/04/04 +// +#define POLLIN 1 +#define POLLOUT 4 +#define POLLERR 8 + +// Class to handle select() 'data ready' +class DataReady +{ + struct FD + { + int fd; + short events; + void (*cb)(int, void*); + void* arg; + }; + int nfds, fd_array_size; + FD *fds; + pthread_t tid; // select()'s thread id + + // Data that needs to be locked (all start with '_') + pthread_mutex_t _datalock; // data lock + fd_set _fdsets[3]; // r/w/x sets user wants to monitor + int _maxfd; // max fd count to monitor + int _cancelpipe[2]; // pipe used to help cancel thread + void *_userdata; // thread's userdata + +public: + DataReady() + { + nfds = 0; + fd_array_size = 0; + fds = 0; + tid = 0; + + pthread_mutex_init(&_datalock, NULL); + FD_ZERO(&_fdsets[0]); FD_ZERO(&_fdsets[1]); FD_ZERO(&_fdsets[2]); + _cancelpipe[0] = _cancelpipe[1] = 0; + _userdata = 0; + _maxfd = 0; + } + + ~DataReady() + { + CancelThread(DEBUGTEXT("DESTRUCTOR\n")); + if (fds) { free(fds); fds = 0; } + nfds = 0; + } + + // Locks + // The convention for locks: volatile vars start with '_', + // and must be locked before use. Locked code is prefixed + // with /*LOCK*/ to make painfully obvious esp. in debuggers. -erco + // + void DataLock() { pthread_mutex_lock(&_datalock); } + void DataUnlock() { pthread_mutex_unlock(&_datalock); } + + // Accessors + int IsThreadRunning() { return(tid ? 1 : 0); } + int GetNfds() { return(nfds); } + int GetCancelPipe(int ix) { return(_cancelpipe[ix]); } + fd_set GetFdset(int ix) { return(_fdsets[ix]); } + + // Methods + void AddFD(int n, int events, void (*cb)(int, void*), void *v); + void RemoveFD(int n, int events); + int CheckData(fd_set& r, fd_set& w, fd_set& x); + void HandleData(fd_set& r, fd_set& w, fd_set& x); + static void* DataReadyThread(void *self); + void StartThread(void *userdata); + void CancelThread(const char *reason); +}; + +static DataReady dataready; + +void DataReady::AddFD(int n, int events, void (*cb)(int, void*), void *v) +{ + RemoveFD(n, events); + int i = nfds++; + if (i >= fd_array_size) + { + FD *temp; + fd_array_size = 2*fd_array_size+1; + if (!fds) { temp = (FD*)malloc(fd_array_size*sizeof(FD)); } + else { temp = (FD*)realloc(fds, fd_array_size*sizeof(FD)); } + if (!temp) return; + fds = temp; + } + fds[i].cb = cb; + fds[i].arg = v; + fds[i].fd = n; + fds[i].events = events; + DataLock(); + /*LOCK*/ if (events & POLLIN) FD_SET(n, &_fdsets[0]); + /*LOCK*/ if (events & POLLOUT) FD_SET(n, &_fdsets[1]); + /*LOCK*/ if (events & POLLERR) FD_SET(n, &_fdsets[2]); + /*LOCK*/ if (n > _maxfd) _maxfd = n; + DataUnlock(); +} + +// Remove an FD from the array +void DataReady::RemoveFD(int n, int events) +{ + int i,j; + for (i=j=0; iDataLock(); + /*LOCK*/ int maxfd = self->_maxfd; + /*LOCK*/ fd_set r = self->GetFdset(0); + /*LOCK*/ fd_set w = self->GetFdset(1); + /*LOCK*/ fd_set x = self->GetFdset(2); + /*LOCK*/ void *userdata = self->_userdata; + /*LOCK*/ int cancelpipe = self->GetCancelPipe(0); + /*LOCK*/ if ( cancelpipe > maxfd ) maxfd = cancelpipe; + /*LOCK*/ FD_SET(cancelpipe, &r); // add cancelpipe to fd's to watch + /*LOCK*/ FD_SET(cancelpipe, &x); + self->DataUnlock(); + // timeval t = { 1000, 0 }; // 1000 seconds; + timeval t = { 2, 0 }; // HACK: 2 secs prevents 'hanging' problem + int ret = ::select(maxfd+1, &r, &w, &x, &t); + pthread_testcancel(); // OSX 10.0.4 and older: needed for parent to cancel + switch ( ret ) + { + case 0: // NO DATA + continue; + case -1: // ERROR + { + DEBUGPERRORMSG("CHILD THREAD: select() failed"); + return(NULL); // error? exit thread + } + default: // DATA READY + { + if (FD_ISSET(cancelpipe, &r) || FD_ISSET(cancelpipe, &x)) // cancel? + { return(NULL); } // just exit + DEBUGMSG("CHILD THREAD: DATA IS READY\n"); + EventRef drEvent; + CreateEvent( 0, kEventClassFLTK, kEventFLTKDataReady, + 0, kEventAttributeUserEvent, &drEvent); + EventQueueRef eventqueue = (EventQueueRef)userdata; + PostEventToQueue(eventqueue, drEvent, kEventPriorityStandard ); + ReleaseEvent( drEvent ); + return(NULL); // done with thread + } + } + } +} + +// START 'DATA READY' THREAD RUNNING, CREATE INTER-THREAD PIPE +void DataReady::StartThread(void *new_userdata) +{ + CancelThread(DEBUGTEXT("STARTING NEW THREAD\n")); + DataLock(); + /*LOCK*/ pipe(_cancelpipe); // pipe for sending cancel msg to thread + /*LOCK*/ _userdata = new_userdata; + DataUnlock(); + DEBUGMSG("*** START THREAD\n"); + pthread_create(&tid, NULL, DataReadyThread, (void*)this); +} + +// CANCEL 'DATA READY' THREAD, CLOSE PIPE +void DataReady::CancelThread(const char *reason) +{ + if ( tid ) + { + DEBUGMSG("*** CANCEL THREAD: "); + DEBUGMSG(reason); + if ( pthread_cancel(tid) == 0 ) // cancel first + { + DataLock(); + /*LOCK*/ write(_cancelpipe[1], "x", 1); // wake thread from select + DataUnlock(); + pthread_join(tid, NULL); // wait for thread to finish + } + tid = 0; + DEBUGMSG("(JOINED) OK\n"); + } + // Close pipe if open + DataLock(); + /*LOCK*/ if ( _cancelpipe[0] ) { close(_cancelpipe[0]); _cancelpipe[0] = 0; } + /*LOCK*/ if ( _cancelpipe[1] ) { close(_cancelpipe[1]); _cancelpipe[1] = 0; } + DataUnlock(); +} + +void Fl::add_fd( int n, int events, void (*cb)(int, void*), void *v ) + { dataready.AddFD(n, events, cb, v); } + +void Fl::add_fd(int fd, void (*cb)(int, void*), void* v) + { dataready.AddFD(fd, POLLIN, cb, v); } + +void Fl::remove_fd(int n, int events) + { dataready.RemoveFD(n, events); } + +void Fl::remove_fd(int n) + { dataready.RemoveFD(n, -1); } + +/** + * Check if there is actually a message pending! + */ +int fl_ready() +{ + EventRef event; + return !ReceiveNextEvent(0, NULL, 0.0, false, &event); +} + +/** + * handle Apple Menu items (can be created using the Fl_Sys_Menu_Bar + * returns eventNotHandledErr if the menu item could not be handled + */ +OSStatus HandleMenu( HICommand *cmd ) +{ + OSStatus ret = eventNotHandledErr; + // attributes, commandIDm menu.menuRef, menu.menuItemIndex + UInt32 ref; + OSErr rrc = GetMenuItemRefCon( cmd->menu.menuRef, cmd->menu.menuItemIndex, &ref ); + //printf( "%d, %08x, %08x, %d, %d, %8x\n", rrc, cmd->attributes, cmd->commandID, cmd->menu.menuRef, cmd->menu.menuItemIndex, rrc ); + if ( rrc==noErr && ref ) + { + Fl_Menu_Item *m = (Fl_Menu_Item*)ref; + //printf( "Menu: %s\n", m->label() ); + fl_sys_menu_bar->picked( m ); + if ( m->flags & FL_MENU_TOGGLE ) // update the menu toggle symbol + SetItemMark( cmd->menu.menuRef, cmd->menu.menuItemIndex, (m->flags & FL_MENU_VALUE ) ? 0x12 : 0 ); + if ( m->flags & FL_MENU_RADIO ) // update all radio buttons in this menu + { + Fl_Menu_Item *j = m; + int i = cmd->menu.menuItemIndex; + for (;;) + { + if ( j->flags & FL_MENU_DIVIDER ) + break; + j++; i++; + if ( !j->text || !j->radio() ) + break; + SetItemMark( cmd->menu.menuRef, i, ( j->flags & FL_MENU_VALUE ) ? 0x13 : 0 ); + } + j = m-1; i = cmd->menu.menuItemIndex-1; + for ( ; i>0; j--, i-- ) + { + if ( !j->text || j->flags&FL_MENU_DIVIDER || !j->radio() ) + break; + SetItemMark( cmd->menu.menuRef, i, ( j->flags & FL_MENU_VALUE ) ? 0x13 : 0 ); + } + SetItemMark( cmd->menu.menuRef, cmd->menu.menuItemIndex, ( m->flags & FL_MENU_VALUE ) ? 0x13 : 0 ); + } + ret = noErr; // done handling this event + } + HiliteMenu(0); + return ret; +} + + +/** + * We can make every event pass through this function + * - mouse events need to be manipulated to use a mouse focus window + * - keyboard, mouse and some window events need to quit the Apple Event Loop + * so FLTK can continue its own management + */ +static pascal OSStatus carbonDispatchHandler( EventHandlerCallRef nextHandler, EventRef event, void *userData ) +{ + OSStatus ret = eventNotHandledErr; + HICommand cmd; + + fl_lock_function(); + + got_events = 1; + + switch ( GetEventClass( event ) ) + { + case kEventClassMouse: + switch ( GetEventKind( event ) ) + { + case kEventMouseUp: + case kEventMouseMoved: + case kEventMouseDragged: + if ( fl_capture ) + ret = SendEventToEventTarget( event, GetWindowEventTarget( fl_capture ) ); + else if ( fl_os_capture ){ + ret = SendEventToEventTarget( event, GetWindowEventTarget( fl_os_capture ) ); + fl_os_capture = 0; + } + break; + } + break; + case kEventClassCommand: + switch (GetEventKind( event ) ) + { + case kEventCommandProcess: + ret = GetEventParameter( event, kEventParamDirectObject, typeHICommand, NULL, sizeof(HICommand), NULL, &cmd ); + if (ret == noErr && (cmd.attributes & kHICommandFromMenu) != 0) + ret = HandleMenu( &cmd ); + else + ret = eventNotHandledErr; + break; + } + break; + case kEventClassFLTK: + switch ( GetEventKind( event ) ) + { + case kEventFLTKBreakLoop: + ret = noErr; + break; + case kEventFLTKDataReady: + { + dataready.CancelThread(DEBUGTEXT("DATA READY EVENT\n")); + + // CHILD THREAD TELLS US DATA READY + // Check to see what's ready, and invoke user's cb's + // + fd_set r,w,x; + switch(dataready.CheckData(r,w,x)) + { + case 0: // NO DATA + break; + case -1: // ERROR + break; + default: // DATA READY + dataready.HandleData(r,w,x); + break; + } + } + ret = noErr; + break; + } + } + if ( ret == eventNotHandledErr ) + ret = CallNextEventHandler( nextHandler, event ); // let the OS handle the activation, but continue to get a click-through effect + + fl_unlock_function(); + + return ret; +} + + +/** + * break the current event loop + */ +static void breakMacEventLoop() +{ + EventRef breakEvent; + + fl_lock_function(); + + CreateEvent( 0, kEventClassFLTK, kEventFLTKBreakLoop, 0, kEventAttributeUserEvent, &breakEvent ); + PostEventToQueue( GetCurrentEventQueue(), breakEvent, kEventPriorityStandard ); + ReleaseEvent( breakEvent ); + + fl_unlock_function(); +} + +// +// MacOS X timers +// + +struct MacTimeout { + Fl_Timeout_Handler callback; + void* data; + EventLoopTimerRef timer; + EventLoopTimerUPP upp; + char pending; +}; +static MacTimeout* mac_timers; +static int mac_timer_alloc; +static int mac_timer_used; + + +static void realloc_timers() +{ + if (mac_timer_alloc == 0) { + mac_timer_alloc = 8; + } + mac_timer_alloc *= 2; + MacTimeout* new_timers = new MacTimeout[mac_timer_alloc]; + memset(new_timers, 0, sizeof(MacTimeout)*mac_timer_alloc); + memcpy(new_timers, mac_timers, sizeof(MacTimeout) * mac_timer_used); + MacTimeout* delete_me = mac_timers; + mac_timers = new_timers; + delete [] delete_me; +} + +static void delete_timer(MacTimeout& t) +{ + if (t.timer) { + RemoveEventLoopTimer(t.timer); + DisposeEventLoopTimerUPP(t.upp); + memset(&t, 0, sizeof(MacTimeout)); + } +} + + +static pascal void do_timer(EventLoopTimerRef timer, void* data) +{ + for (int i = 0; i < mac_timer_used; ++i) { + MacTimeout& t = mac_timers[i]; + if (t.timer == timer && t.data == data) { + t.pending = 0; + (*t.callback)(data); + if (t.pending==0) + delete_timer(t); + break; + } + } + breakMacEventLoop(); +} + +/** + * This function is the central event handler. + * It reads events from the event queue using the given maximum time + * Funny enough, it returns the same time that it got as the argument. + */ +static double do_queued_events( double time = 0.0 ) +{ + static bool been_here = 0; + static RgnHandle rgn; + + // initialize events and a region that enables mouse move events + if (!been_here) { + rgn = NewRgn(); + Point mp; + GetMouse(&mp); + SetRectRgn(rgn, mp.h, mp.v, mp.h, mp.v); + SetEventMask(everyEvent); + been_here = 1; + } + OSStatus ret; + static EventTargetRef target = 0; + if ( !target ) + { + target = GetEventDispatcherTarget(); + + EventHandlerUPP dispatchHandler = NewEventHandlerUPP( carbonDispatchHandler ); // will not be disposed by Carbon... + static EventTypeSpec dispatchEvents[] = { + { kEventClassWindow, kEventWindowShown }, + { kEventClassWindow, kEventWindowHidden }, + { kEventClassWindow, kEventWindowActivated }, + { kEventClassWindow, kEventWindowDeactivated }, + { kEventClassWindow, kEventWindowClose }, + { kEventClassKeyboard, kEventRawKeyDown }, + { kEventClassKeyboard, kEventRawKeyRepeat }, + { kEventClassKeyboard, kEventRawKeyUp }, + { kEventClassKeyboard, kEventRawKeyModifiersChanged }, + { kEventClassMouse, kEventMouseDown }, + { kEventClassMouse, kEventMouseUp }, + { kEventClassMouse, kEventMouseMoved }, + { kEventClassMouse, 11 }, // MightyMouse wheels + { kEventClassMouse, kEventMouseWheelMoved }, + { kEventClassMouse, kEventMouseDragged }, + { kEventClassFLTK, kEventFLTKBreakLoop }, + { kEventClassFLTK, kEventFLTKDataReady } }; + ret = InstallEventHandler( target, dispatchHandler, GetEventTypeCount(dispatchEvents), dispatchEvents, 0, 0L ); + static EventTypeSpec appEvents[] = { + { kEventClassCommand, kEventCommandProcess } }; + ret = InstallApplicationEventHandler( dispatchHandler, GetEventTypeCount(appEvents), appEvents, 0, 0L ); + } + + got_events = 0; + + // Check for re-entrant condition + if ( dataready.IsThreadRunning() ) + { dataready.CancelThread(DEBUGTEXT("AVOID REENTRY\n")); } + + // Start thread to watch for data ready + if ( dataready.GetNfds() ) + { dataready.StartThread((void*)GetCurrentEventQueue()); } + + fl_unlock_function(); + + EventRef event; + EventTimeout timeout = time; + if (!ReceiveNextEvent(0, NULL, timeout, true, &event)) { + got_events = 1; + OSErr ret = SendEventToEventTarget( event, target ); + if (ret!=noErr) { + EventRecord clevent; + ConvertEventRefToEventRecord(event, &clevent); + if (clevent.what==kHighLevelEvent) { + ret = AEProcessAppleEvent(&clevent); + } + } + if ( ret==eventNotHandledErr + && GetEventClass(event)==kEventClassMouse + && GetEventKind(event)==kEventMouseDown ) { + WindowRef win; Point pos; + GetEventParameter(event, kEventParamMouseLocation, typeQDPoint, + NULL, sizeof(pos), NULL, &pos); + if (MacFindWindow(pos, &win)==inMenuBar) { + MenuSelect(pos); + } + } + ReleaseEvent( event ); + } + + fl_lock_function(); + +#if CONSOLIDATE_MOTION + if (send_motion && send_motion == fl_xmousewin) { + send_motion = 0; + Fl::handle(FL_MOVE, fl_xmousewin); + } +#endif + + return time; +} + + +/** + * This public function handles all events. It wait a maximum of + * 'time' secods for an event. This version returns 1 if events + * other than the timeout timer were processed. + * + * \todo there is no socket handling in this code whatsoever + */ +int fl_wait( double time ) +{ + do_queued_events( time ); + return (got_events); +} + + +/** + * event handler for Apple-Q key combination + * this is also called from the Carbon Window handler after all windows were closed + */ +static OSErr QuitAppleEventHandler( const AppleEvent *appleEvt, AppleEvent* reply, UInt32 refcon ) +{ + fl_lock_function(); + + while ( Fl_X::first ) { + Fl_X *x = Fl_X::first; + Fl::handle( FL_CLOSE, x->w ); + if ( Fl_X::first == x ) { + fl_unlock_function(); + return noErr; // FLTK has not close all windows, so we return to the main program now + } + } + + fl_unlock_function(); + + return noErr; +} + + +/** + * Carbon Window handler + * This needs to be linked into all new window event handlers + */ +static pascal OSStatus carbonWindowHandler( EventHandlerCallRef nextHandler, EventRef event, void *userData ) +{ + UInt32 kind = GetEventKind( event ); + OSStatus ret = eventNotHandledErr; + Fl_Window *window = (Fl_Window*)userData; + Fl::first_window(window); + + Rect currentBounds, originalBounds; + WindowClass winClass; + static Fl_Window *activeWindow = 0; + + fl_lock_function(); + + switch ( kind ) + { + case kEventWindowBoundsChanging: + GetEventParameter( event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, ¤tBounds ); + GetEventParameter( event, kEventParamOriginalBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &originalBounds ); + break; + case kEventWindowDrawContent: + handleUpdateEvent( fl_xid( window ) ); + ret = noErr; + break; + case kEventWindowBoundsChanged: { + GetEventParameter( event, kEventParamCurrentBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, ¤tBounds ); + GetEventParameter( event, kEventParamOriginalBounds, typeQDRectangle, NULL, sizeof(Rect), NULL, &originalBounds ); + int X = currentBounds.left, W = currentBounds.right-X; + int Y = currentBounds.top, H = currentBounds.bottom-Y; + resize_from_system = window; + window->resize( X, Y, W, H ); + if ( ( originalBounds.right - originalBounds.left != W ) + || ( originalBounds.bottom - originalBounds.top != H ) ) + { + if ( window->shown() ) + handleUpdateEvent( fl_xid( window ) ); + } + break; } + case kEventWindowShown: + if ( !window->parent() ) + { + GetWindowClass( fl_xid( window ), &winClass ); + if ( winClass != kHelpWindowClass ) { // help windows can't get the focus! + Fl::handle( FL_FOCUS, window); + activeWindow = window; + } + Fl::handle( FL_SHOW, window); + mods_to_e_state(GetCurrentKeyModifiers()); + } + break; + case kEventWindowHidden: + if ( !window->parent() ) Fl::handle( FL_HIDE, window); + break; + case kEventWindowActivated: + if ( window->shown() && window!=activeWindow ) + { + GetWindowClass( fl_xid( window ), &winClass ); + if ( winClass != kHelpWindowClass ) { // help windows can't get the focus! + Fl::handle( FL_FOCUS, window); + activeWindow = window; + } + } + break; + case kEventWindowDeactivated: + if ( window==activeWindow ) + { + Fl::handle( FL_UNFOCUS, window); + activeWindow = 0; + } + break; + case kEventWindowClose: + Fl::handle( FL_CLOSE, window ); // this might or might not close the window + // if there are no more windows, send a high-level quit event + if (!Fl_X::first) QuitAppleEventHandler( 0, 0, 0 ); + ret = noErr; // returning noErr tells Carbon to stop following up on this event + break; + case kEventWindowCollapsed: + window->clear_visible(); + break; + case kEventWindowExpanded: + window->set_visible(); + break; + } + + fl_unlock_function(); + + return ret; +} + + +/** + * Carbon Mousewheel handler + * This needs to be linked into all new window event handlers + */ +static pascal OSStatus carbonMousewheelHandler( EventHandlerCallRef nextHandler, EventRef event, void *userData ) +{ + // Handle the new "MightyMouse" mouse wheel events. Please, someone explain + // to me why Apple changed the API on this even though the current API + // supports two wheels just fine. Matthias, + fl_lock_function(); + + fl_os_event = event; + Fl_Window *window = (Fl_Window*)userData; + if ( !window->shown() ) + { + fl_unlock_function(); + return noErr; + } + Fl::first_window(window); + + EventMouseWheelAxis axis; + GetEventParameter( event, kEventParamMouseWheelAxis, typeMouseWheelAxis, NULL, sizeof(EventMouseWheelAxis), NULL, &axis ); + long delta; + GetEventParameter( event, kEventParamMouseWheelDelta, typeLongInteger, NULL, sizeof(long), NULL, &delta ); +// fprintf(stderr, "axis=%d, delta=%d\n", axis, delta); + if ( axis == kEventMouseWheelAxisX ) { + Fl::e_dx = -delta; + Fl::e_dy = 0; + if ( Fl::e_dx) Fl::handle( FL_MOUSEWHEEL, window ); + } else if ( axis == kEventMouseWheelAxisY ) { + Fl::e_dx = 0; + Fl::e_dy = -delta; + if ( Fl::e_dy) Fl::handle( FL_MOUSEWHEEL, window ); + } else { + fl_unlock_function(); + + return eventNotHandledErr; + } + + fl_unlock_function(); + + return noErr; +} + + +/** + * convert the current mouse chord into the FLTK modifier state + */ +static void chord_to_e_state( UInt32 chord ) +{ + static ulong state[] = + { + 0, FL_BUTTON1, FL_BUTTON3, FL_BUTTON1|FL_BUTTON3, FL_BUTTON2, + FL_BUTTON2|FL_BUTTON1, FL_BUTTON2|FL_BUTTON3, + FL_BUTTON2|FL_BUTTON1|FL_BUTTON3 + }; + Fl::e_state = ( Fl::e_state & 0xff0000 ) | state[ chord & 0x07 ]; +} + + +/** + * Carbon Mouse Button Handler + */ +static pascal OSStatus carbonMouseHandler( EventHandlerCallRef nextHandler, EventRef event, void *userData ) +{ + static int keysym[] = { 0, FL_Button+1, FL_Button+3, FL_Button+2 }; + static int px, py; + static char suppressed = 0; + + fl_lock_function(); + + fl_os_event = event; + Fl_Window *window = (Fl_Window*)userData; + if ( !window->shown() ) + { + fl_unlock_function(); + return noErr; + } + Fl::first_window(window); + Point pos; + GetEventParameter( event, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &pos ); + EventMouseButton btn; + GetEventParameter( event, kEventParamMouseButton, typeMouseButton, NULL, sizeof(EventMouseButton), NULL, &btn ); + UInt32 clickCount; + GetEventParameter( event, kEventParamClickCount, typeUInt32, NULL, sizeof(UInt32), NULL, &clickCount ); + UInt32 chord; + GetEventParameter( event, kEventParamMouseChord, typeUInt32, NULL, sizeof(UInt32), NULL, &chord ); + WindowRef xid = fl_xid(window), tempXid; + int sendEvent = 0, part = 0; + switch ( GetEventKind( event ) ) + { + case kEventMouseDown: + part = FindWindow( pos, &tempXid ); + if (!(Fl::grab() && window!=Fl::grab())) { + if ( part == inGrow ) { + fl_unlock_function(); + suppressed = 1; + Fl_Tooltip::current(0L); + return CallNextEventHandler( nextHandler, event ); // let the OS handle this for us + } + if ( part != inContent ) { + fl_unlock_function(); + suppressed = 1; + Fl_Tooltip::current(0L); + // anything else to here? + return CallNextEventHandler( nextHandler, event ); // let the OS handle this for us + } + } + suppressed = 0; + if (part==inContent && !IsWindowActive( xid ) ) { + CallNextEventHandler( nextHandler, event ); // let the OS handle the activation, but continue to get a click-through effect + } + // normal handling of mouse-down follows + fl_os_capture = xid; + sendEvent = FL_PUSH; + Fl::e_is_click = 1; px = pos.h; py = pos.v; + if (clickCount>1) + Fl::e_clicks++; + else + Fl::e_clicks = 0; + // fall through + case kEventMouseUp: + if (suppressed) { + suppressed = 0; + break; + } + if ( !window ) break; + if ( !sendEvent ) { + sendEvent = FL_RELEASE; + } + Fl::e_keysym = keysym[ btn ]; + // fall through + case kEventMouseMoved: + suppressed = 0; + if ( !sendEvent ) { + sendEvent = FL_MOVE; chord = 0; + } + // fall through + case kEventMouseDragged: + if (suppressed) break; + if ( !sendEvent ) { + sendEvent = FL_MOVE; // Fl::handle will convert into FL_DRAG + if (abs(pos.h-px)>5 || abs(pos.v-py)>5) + Fl::e_is_click = 0; + } + chord_to_e_state( chord ); + GrafPtr oldPort; + GetPort( &oldPort ); + SetPort( GetWindowPort(xid) ); // \todo replace this! There must be some GlobalToLocal call that has a port as an argument + SetOrigin(0, 0); + Fl::e_x_root = pos.h; + Fl::e_y_root = pos.v; + GlobalToLocal( &pos ); + Fl::e_x = pos.h; + Fl::e_y = pos.v; + SetPort( oldPort ); + if (GetEventKind(event)==kEventMouseDown && part!=inContent) { + int used = Fl::handle( sendEvent, window ); + CallNextEventHandler( nextHandler, event ); // let the OS handle this for us + if (!used) + suppressed = 1; + } else { + Fl::handle( sendEvent, window ); + } + break; + } + + fl_unlock_function(); + + return noErr; +} + + +/** + * convert the keyboard return code into the symbol on the keycaps + */ +static unsigned short keycode_to_sym( UInt32 keyCode, UInt32 mods, unsigned short deflt ) +{ + static Ptr map = 0; + UInt32 state = 0; + if (!map) { + map = (Ptr)GetScriptManagerVariable(smKCHRCache); + if (!map) { + long kbID = GetScriptManagerVariable(smKeyScript); + map = *GetResource('KCHR', kbID); + } + } + if (map) + return KeyTranslate(map, keyCode|mods, &state ); + return deflt; +} + +/** + * handle carbon keyboard events + */ +pascal OSStatus carbonKeyboardHandler( + EventHandlerCallRef nextHandler, EventRef event, void *userData ) +{ + static char buffer[5]; + int sendEvent = 0; + Fl_Window *window = (Fl_Window*)userData; + Fl::first_window(window); + UInt32 mods; + static UInt32 prevMods = mods_to_e_state( GetCurrentKeyModifiers() ); + + fl_lock_function(); + + int kind = GetEventKind(event); + + // get the modifiers for any of the events + GetEventParameter( event, kEventParamKeyModifiers, typeUInt32, + NULL, sizeof(UInt32), NULL, &mods ); + + // get the key code only for key events + UInt32 keyCode = 0, maskedKeyCode = 0; + unsigned char key = 0; + unsigned short sym = 0; + if (kind!=kEventRawKeyModifiersChanged) { + GetEventParameter( event, kEventParamKeyCode, typeUInt32, + NULL, sizeof(UInt32), NULL, &keyCode ); + GetEventParameter( event, kEventParamKeyMacCharCodes, typeChar, + NULL, sizeof(char), NULL, &key ); + } + maskedKeyCode = keyCode & 0x7f; + /* output a human readbale event identifier for debugging + const char *ev = ""; + switch (kind) { + case kEventRawKeyDown: ev = "kEventRawKeyDown"; break; + case kEventRawKeyRepeat: ev = "kEventRawKeyRepeat"; break; + case kEventRawKeyUp: ev = "kEventRawKeyUp"; break; + case kEventRawKeyModifiersChanged: ev = "kEventRawKeyModifiersChanged"; break; + default: ev = "unknown"; + } + printf("%08x %08x %08x '%c' %s \n", mods, keyCode, key, key, ev); + */ + switch (kind) + { + case kEventRawKeyDown: + case kEventRawKeyRepeat: + // When the user presses a "dead key", no information is send about + // which dead key symbol was created. So we need to trick Carbon into + // giving us the code by sending a "space" after the "dead key". + if (key==0) { + UInt32 ktState = 0; + KeyboardLayoutRef klr; + KLGetCurrentKeyboardLayout(&klr); + const void *kchar = 0; KLGetKeyboardLayoutProperty(klr, kKLKCHRData, &kchar); + KeyTranslate(kchar, (mods&0xff00) | keyCode, &ktState); // send the dead key + key = KeyTranslate(kchar, 0x31, &ktState); // fake a space key press + Fl::e_state |= 0x40000000; // mark this as a dead key + } else { + Fl::e_state &= 0xbfffffff; // clear the deadkey flag + } + sendEvent = FL_KEYBOARD; + // fall through + case kEventRawKeyUp: + if ( !sendEvent ) { + sendEvent = FL_KEYUP; + Fl::e_state &= 0xbfffffff; // clear the deadkey flag + } + // if the user pressed alt/option, event_key should have the keycap, + // but event_text should generate the international symbol + sym = macKeyLookUp[ maskedKeyCode ]; + if ( isalpha(key) ) + sym = tolower(key); + else if ( Fl::e_state&FL_CTRL && key<32 && sym<0xff00) + sym = key+96; + else if ( Fl::e_state&FL_ALT && sym<0xff00) // find the keycap of this key + sym = keycode_to_sym( maskedKeyCode, 0, macKeyLookUp[ maskedKeyCode ] ); + Fl::e_keysym = Fl::e_original_keysym = sym; + // Handle FL_KP_Enter on regular keyboards and on Powerbooks + if ( maskedKeyCode==0x4c || maskedKeyCode==0x34) key=0x0d; + // Matt: the Mac has no concept of a NumLock key, or at least not visible + // Matt: to Carbon. The kEventKeyModifierNumLockMask is only set when + // Matt: a numeric keypad key is pressed and does not correspond with + // Matt: the NumLock light in PowerBook keyboards. + if ( (sym >= FL_KP && sym <= FL_KP_Last) || !(sym & 0xff00) || + sym == FL_Tab || sym == FL_Enter) { + buffer[0] = key; + Fl::e_length = 1; + } else { + buffer[0] = 0; + Fl::e_length = 0; + } + Fl::e_text = buffer; + // insert UnicodeHandling here! + break; + case kEventRawKeyModifiersChanged: { + UInt32 tMods = prevMods ^ mods; + if ( tMods ) + { + mods_to_e_keysym( tMods ); + if ( Fl::e_keysym ) + sendEvent = ( prevModsparent()) window = window->window(); + if (sendEvent && Fl::handle(sendEvent,window)) { + fl_unlock_function(); + return noErr; // return noErr if FLTK handled the event + } else { + fl_unlock_function(); + //return CallNextEventHandler( nextHandler, event );; + // Matt: I had better results (no duplicate events) always returning + // Matt: 'noErr'. System keyboard events still seem to work just fine. + return noErr; + } +} + + + +/** + * Open callback function to call... + */ + +static void (*open_cb)(const char *) = 0; + + +/** + * Event handler for Apple-O key combination and also for file opens + * via the finder... + */ + +static OSErr OpenAppleEventHandler(const AppleEvent *appleEvt, + AppleEvent *reply, + UInt32 refcon) { + OSErr err; + AEDescList documents; + long i, n; + FSSpec fileSpec; + AEKeyword keyWd; + DescType typeCd; + Size actSz; + char filename[1024]; + + if (!open_cb) return noErr; + + // Initialize the document list... + AECreateDesc(typeNull, NULL, 0, &documents); + + // Get the open parameter(s)... + err = AEGetParamDesc(appleEvt, keyDirectObject, typeAEList, &documents); + if (err != noErr) { + AEDisposeDesc(&documents); + return err; + } + + // Lock access to FLTK in this thread... + fl_lock_function(); + + // Open the documents via the callback... + if (AECountItems(&documents, &n) == noErr) { + for (i = 1; i <= n; i ++) { + // Get the next FSSpec record... + AEGetNthPtr(&documents, i, typeFSS, &keyWd, &typeCd, + (Ptr)&fileSpec, sizeof(fileSpec), + (actSz = sizeof(fileSpec), &actSz)); + + // Convert to a UNIX path... + FSSpec2UnixPath(&fileSpec, filename); + + // Call the callback with the filename... + (*open_cb)(filename); + } + } + + // Unlock access to FLTK for all threads... + fl_unlock_function(); + + // Get rid of the document list... + AEDisposeDesc(&documents); + + return noErr; +} + + +/** + * Install an open documents event handler... + */ + +void fl_open_callback(void (*cb)(const char *)) { + open_cb = cb; + if (cb) { + AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, + NewAEEventHandlerUPP((AEEventHandlerProcPtr) + OpenAppleEventHandler), 0, false); + } else { + AERemoveEventHandler(kCoreEventClass, kAEOpenDocuments, + NewAEEventHandlerUPP((AEEventHandlerProcPtr) + OpenAppleEventHandler), false); + } +} + + +/** + * initialize the Mac toolboxes, dock status, and set the default menubar + */ + +extern "C" { + extern OSErr CPSEnableForegroundOperation(ProcessSerialNumber *psn, UInt32 _arg2, + UInt32 _arg3, UInt32 _arg4, UInt32 _arg5); +} + +void fl_open_display() { + static char beenHereDoneThat = 0; + if ( !beenHereDoneThat ) { + beenHereDoneThat = 1; + + FlushEvents(everyEvent,0); + + MoreMasters(); // \todo Carbon suggests MoreMasterPointers() + AEInstallEventHandler( kCoreEventClass, kAEQuitApplication, NewAEEventHandlerUPP((AEEventHandlerProcPtr)QuitAppleEventHandler), 0, false ); + + // create the Mac Handle for the default cursor (a pointer to a pointer) + GetQDGlobalsArrow(&default_cursor); + default_cursor_ptr = &default_cursor; + fl_default_cursor = &default_cursor_ptr; + + ClearMenuBar(); + AppendResMenu( GetMenuHandle( 1 ), 'DRVR' ); + DrawMenuBar(); + + // bring the application into foreground without a 'CARB' resource + Boolean same_psn; + ProcessSerialNumber cur_psn, front_psn; + if( !GetCurrentProcess( &cur_psn ) && !GetFrontProcess( &front_psn ) && + !SameProcess( &front_psn, &cur_psn, &same_psn ) && !same_psn ) + { + // only transform the application type for unbundled apps + CFBundleRef bundle = CFBundleGetMainBundle(); + if( bundle ) + { + FSRef execFs; + CFURLRef execUrl = CFBundleCopyExecutableURL( bundle ); + CFURLGetFSRef( execUrl, &execFs ); + + FSRef bundleFs; + GetProcessBundleLocation( &cur_psn, &bundleFs ); + + if( !FSCompareFSRefs( &execFs, &bundleFs ) ) + bundle = NULL; + + CFRelease(execUrl); + } + + if( !bundle ) + { + // Earlier versions of this code tried to use weak linking, however it + // appears that this does not work on 10.2. Since 10.3 and higher provide + // both TransformProcessType and CPSEnableForegroundOperation, the following + // conditional code compiled on 10.2 will still work on newer releases... + OSErr err; + +#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 + if (TransformProcessType != NULL) { + err = TransformProcessType(&cur_psn, kProcessTransformToForegroundApplication); + } else +#endif // MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 + err = CPSEnableForegroundOperation(&cur_psn, 0x03, 0x3C, 0x2C, 0x1103); + + if (err == noErr) { + SetFrontProcess( &cur_psn ); + } + } + } + } +} + + +/** + * get rid of allocated resources + */ +void fl_close_display() { +} + + +/** + * smallest x ccordinate in screen space + */ +int Fl::x() { + BitMap r; + GetQDGlobalsScreenBits(&r); + return r.bounds.left; +} + + +/** + * smallest y ccordinate in screen space + */ +int Fl::y() { + BitMap r; + GetQDGlobalsScreenBits(&r); + return r.bounds.top + 20; // \todo 20 pixel menu bar? +} + + +/** + * screen width (single monitor!?) + */ +int Fl::w() { + BitMap r; + GetQDGlobalsScreenBits(&r); + return r.bounds.right - r.bounds.left; +} + + +/** + * screen height (single monitor!?) + */ +int Fl::h() { + BitMap r; + GetQDGlobalsScreenBits(&r); + return r.bounds.bottom - r.bounds.top - 20; +} + + +/** + * get the current mouse pointer world coordinates + */ +void Fl::get_mouse(int &x, int &y) +{ + fl_open_display(); + Point loc; + GetMouse( &loc ); + LocalToGlobal( &loc ); + x = loc.h; + y = loc.v; +} + + +/** + * convert Mac keystrokes to FLTK + */ +unsigned short mac2fltk(ulong macKey) +{ + unsigned short cc = macKeyLookUp[(macKey>>8)&0x7f]; + if (cc) return cc; + return macKey&0xff; +} + + +/** + * Initialize the given port for redraw and call the windw's flush() to actually draw the content + */ +void Fl_X::flush() +{ + w->flush(); +#ifdef __APPLE_QD__ + GrafPtr port; + GetPort( &port ); + if ( port ) + QDFlushPortBuffer( port, 0 ); +#elif defined (__APPLE_QUARTZ__) + if (fl_gc) + CGContextFlush(fl_gc); +#endif + SetOrigin( 0, 0 ); +} + + +/** + * Handle all clipping and redraw for the given port + * There are two different callers for this event: + * 1: the OS can request a redraw and provides all clipping itself + * 2: Fl::flush() wants all redraws now + */ +void handleUpdateEvent( WindowPtr xid ) +{ + Fl_Window *window = fl_find( xid ); + if ( !window ) return; + GrafPtr oldPort; + GetPort( &oldPort ); + SetPort( GetWindowPort(xid) ); + Fl_X *i = Fl_X::i( window ); + i->wait_for_expose = 0; + if ( window->damage() ) { + if ( i->region ) { + InvalWindowRgn( xid, i->region ); + } + } + if ( i->region ) { // no region, so the sytem will take the update region from the OS + DisposeRgn( i->region ); + i->region = 0; + } + for ( Fl_X *cx = i->xidChildren; cx; cx = cx->xidNext ) + { + cx->w->clear_damage(window->damage()|FL_DAMAGE_EXPOSE); + cx->flush(); + cx->w->clear_damage(); + } + window->clear_damage(window->damage()|FL_DAMAGE_EXPOSE); + i->flush(); + window->clear_damage(); + SetPort( oldPort ); +} + + +/** + * \todo this is a leftover from OS9 times. Please check how much applies to Carbon! + */ +int Fl_X::fake_X_wm(const Fl_Window* w,int &X,int &Y, int &bt,int &bx, int &by) { + int W, H, xoff, yoff, dx, dy; + int ret = bx = by = bt = 0; + if (w->border() && !w->parent()) { + if (w->maxw != w->minw || w->maxh != w->minh) { + ret = 2; + bx = 6; // \todo Mac : GetSystemMetrics(SM_CXSIZEFRAME); + by = 6; // \todo Mac : get Mac window frame size GetSystemMetrics(SM_CYSIZEFRAME); + } else { + ret = 1; + bx = 6; // \todo Mac : GetSystemMetrics(SM_CXFIXEDFRAME); + by = 6; // \todo Mac : GetSystemMetrics(SM_CYFIXEDFRAME); + } + bt = 22; // \todo Mac : GetSystemMetrics(SM_CYCAPTION); + } + //The coordinates of the whole window, including non-client area + xoff = bx; + yoff = by + bt; + dx = 2*bx; + dy = 2*by + bt; + X = w->x()-xoff; + Y = w->y()-yoff; + W = w->w()+dx; + H = w->h()+dy; + + //Proceed to positioning the window fully inside the screen, if possible + + // let's get a little elaborate here. Mac OS X puts a lot of stuff on the desk + // that we want to avoid when positioning our window, namely the Dock and the + // top menu bar (and even more stuff in 10.4 Tiger). So we will go through the + // list of all available screens and find the one that this window is most + // likely to go to, and then reposition it to fit withing the 'good' area. + Rect r; + // find the screen, that the center of this window will fall into + int R = X+W, B = Y+H; // right and bottom + int cx = (X+R)/2, cy = (Y+B)/2; // center of window; + GDHandle gd = 0L; + for (gd = GetDeviceList(); gd; gd = GetNextDevice(gd)) { + GDPtr gp = *gd; + if ( cx >= gp->gdRect.left && cx <= gp->gdRect.right + && cy >= gp->gdRect.top && cy <= gp->gdRect.bottom) + break; + } + // if the center doesn't fall on a screen, try the top left + if (!gd) { + for (gd = GetDeviceList(); gd; gd = GetNextDevice(gd)) { + GDPtr gp = *gd; + if ( X >= gp->gdRect.left && X <= gp->gdRect.right + && Y >= gp->gdRect.top && Y <= gp->gdRect.bottom) + break; + } + } + // if that doesn't fall on a screen, try the top right + if (!gd) { + for (gd = GetDeviceList(); gd; gd = GetNextDevice(gd)) { + GDPtr gp = *gd; + if ( R >= gp->gdRect.left && R <= gp->gdRect.right + && Y >= gp->gdRect.top && Y <= gp->gdRect.bottom) + break; + } + } + // if that doesn't fall on a screen, try the bottom left + if (!gd) { + for (gd = GetDeviceList(); gd; gd = GetNextDevice(gd)) { + GDPtr gp = *gd; + if ( X >= gp->gdRect.left && X <= gp->gdRect.right + && B >= gp->gdRect.top && B <= gp->gdRect.bottom) + break; + } + } + // last resort, try the bottom right + if (!gd) { + for (gd = GetDeviceList(); gd; gd = GetNextDevice(gd)) { + GDPtr gp = *gd; + if ( R >= gp->gdRect.left && R <= gp->gdRect.right + && B >= gp->gdRect.top && B <= gp->gdRect.bottom) + break; + } + } + // if we still have not found a screen, we will use the main + // screen, the one that has the application menu bar. + if (!gd) gd = GetMainDevice(); + if (gd) { + GetAvailableWindowPositioningBounds(gd, &r); + if ( R > r.right ) X -= R - r.right; + if ( B > r.bottom ) Y -= B - r.bottom; + if ( X < r.left ) X = r.left; + if ( Y < r.top ) Y = r.top; + } + + //Return the client area's top left corner in (X,Y) + X+=xoff; + Y+=yoff; + + return ret; +} + +/** + * convert a Mac FSSpec structure into a Unix filename + */ +static int FSSpec2UnixPath( FSSpec *fs, char *dst ) +{ + FSRef fsRef; + FSpMakeFSRef( fs, &fsRef ); + FSRefMakePath( &fsRef, (UInt8*)dst, 1024 ); + return strlen(dst); +} + +static DragReference currDragRef = 0; +static char *currDragData = 0L; +static int currDragSize = 0; +static OSErr currDragErr = noErr; +Fl_Window *fl_dnd_target_window = 0; +#include + +/** + * Fill the currDrag* variables with the current DnD ASCII text. + */ +static OSErr fillCurrentDragData(DragReference dragRef) +{ + OSErr ret = noErr; + char *dst = 0L; + + // shortcut through this whole procedure if this is still the same drag event + if (dragRef==currDragRef) + return currDragErr; + + // clear currDrag* for a new drag event + currDragRef = dragRef; + if (currDragData) free(currDragData); + currDragData = 0; + currDragSize = 0; + + // fill currDRag* with ASCII data, if available + UInt16 i, nItem; + ItemReference itemRef; + FlavorFlags flags; + Size itemSize, size = 0; + CountDragItems( dragRef, &nItem ); + for ( i = 1; i <= nItem; i++ ) + { + GetDragItemReferenceNumber( dragRef, i, &itemRef ); + ret = GetFlavorFlags( dragRef, itemRef, 'TEXT', &flags ); + if ( ret == noErr ) + { + GetFlavorDataSize( dragRef, itemRef, 'TEXT', &itemSize ); + size += itemSize; + } + ret = GetFlavorFlags( dragRef, itemRef, 'hfs ', &flags ); + if ( ret == noErr ) + { + size += 1024; //++ ouch! We should create the full pathname and figure out its length + } + } + + if ( !size ) + { + currDragErr = userCanceledErr; + return currDragErr; + } + + currDragSize = size + nItem - 1; + currDragData = dst = (char*)malloc( size+nItem );; + + for ( i = 1; i <= nItem; i++ ) + { + GetDragItemReferenceNumber( dragRef, i, &itemRef ); + ret = GetFlavorFlags( dragRef, itemRef, 'TEXT', &flags ); + if ( ret == noErr ) + { + GetFlavorDataSize( dragRef, itemRef, 'TEXT', &itemSize ); + GetFlavorData( dragRef, itemRef, 'TEXT', dst, &itemSize, 0L ); + dst += itemSize; + *dst++ = '\n'; // add our element seperator + } + ret = GetFlavorFlags( dragRef, itemRef, 'hfs ', &flags ); + if ( ret == noErr ) + { + HFSFlavor hfs; itemSize = sizeof( hfs ); + GetFlavorData( dragRef, itemRef, 'hfs ', &hfs, &itemSize, 0L ); + itemSize = FSSpec2UnixPath( &hfs.fileSpec, dst ); + dst += itemSize; + if ( itemSize>1 && ( hfs.fileType=='fold' || hfs.fileType=='disk' ) ) + *dst++ = '/'; + *dst++ = '\n'; // add our element seperator + } + } + + dst[-1] = 0; + currDragSize = dst - currDragData - 1; + currDragErr = ret; + return ret; +} + +/** + * Drag'n'drop tracking handler + */ +static pascal OSErr dndTrackingHandler( DragTrackingMessage msg, WindowPtr w, void *userData, DragReference dragRef ) +{ + Fl_Window *target = (Fl_Window*)userData; + Fl::first_window(target); + Point mp; + static int px, py; + + fillCurrentDragData(dragRef); + Fl::e_length = currDragSize; + Fl::e_text = currDragData; + + switch ( msg ) + { + case kDragTrackingEnterWindow: + // check if 'TEXT' is available + GetDragMouse( dragRef, &mp, 0 ); + Fl::e_x_root = px = mp.h; + Fl::e_y_root = py = mp.v; + Fl::e_x = px - target->x(); + Fl::e_y = py - target->y(); + fl_dnd_target_window = target; + if ( Fl::handle( FL_DND_ENTER, target ) ) + fl_cursor( FL_CURSOR_HAND ); //ShowDragHilite( ); // modify the mouse cursor?! + else + fl_cursor( FL_CURSOR_DEFAULT ); //HideDragHilite( dragRef ); + breakMacEventLoop(); + return noErr; + case kDragTrackingInWindow: + GetDragMouse( dragRef, &mp, 0 ); + if ( mp.h==px && mp.v==py ) + break; //+ return previous condition for dnd hiliting + Fl::e_x_root = px = mp.h; + Fl::e_y_root = py = mp.v; + Fl::e_x = px - target->x(); + Fl::e_y = py - target->y(); + fl_dnd_target_window = target; + if ( Fl::handle( FL_DND_DRAG, target ) ) + fl_cursor( FL_CURSOR_HAND ); //ShowDragHilite( ); // modify the mouse cursor?! + else + fl_cursor( FL_CURSOR_DEFAULT ); //HideDragHilite( dragRef ); + breakMacEventLoop(); + return noErr; + break; + case kDragTrackingLeaveWindow: + // HideDragHilite() + fl_cursor( FL_CURSOR_DEFAULT ); //HideDragHilite( dragRef ); + if ( fl_dnd_target_window ) + { + Fl::handle( FL_DND_LEAVE, fl_dnd_target_window ); + fl_dnd_target_window = 0; + } + breakMacEventLoop(); + return noErr; + } + return noErr; +} + + +/** + * Drag'n'drop receive handler + */ +static pascal OSErr dndReceiveHandler( WindowPtr w, void *userData, DragReference dragRef ) +{ + Point mp; + OSErr ret; + + Fl_Window *target = fl_dnd_target_window = (Fl_Window*)userData; + Fl::first_window(target); + GetDragMouse( dragRef, &mp, 0 ); + Fl::e_x_root = mp.h; + Fl::e_y_root = mp.v; + Fl::e_x = Fl::e_x_root - target->x(); + Fl::e_y = Fl::e_y_root - target->y(); + if ( !Fl::handle( FL_DND_RELEASE, target ) ) + return userCanceledErr; + + ret = fillCurrentDragData(dragRef); + if (ret==userCanceledErr) + return userCanceledErr; + + Fl::e_length = currDragSize; + Fl::e_text = currDragData; +// printf("Sending following text to widget %p:\n%s\n", Fl::belowmouse(), Fl::e_text); + int old_event = Fl::e_number; + Fl::belowmouse()->handle(Fl::e_number = FL_PASTE); + Fl::e_number = old_event; + + if (currDragData) { + free(currDragData); + } + currDragData = 0L; + currDragRef = 0; + Fl::e_text = 0L; + Fl::e_length = 0; + fl_dnd_target_window = 0L; + + breakMacEventLoop(); + return noErr; +} + + +/** + * go ahead, create that (sub)window + * \todo we should make menu windows slightly transparent for the new Mac look + */ +void Fl_X::make(Fl_Window* w) +{ + static int xyPos = 100; + if ( w->parent() ) // create a subwindow + { + Fl_Group::current(0); + Rect wRect; + wRect.top = w->y(); + wRect.left = w->x(); + wRect.bottom = w->y() + w->h(); if (wRect.bottom<=wRect.top) wRect.bottom = wRect.top+1; + wRect.right = w->x() + w->w(); if (wRect.right<=wRect.left) wRect.right = wRect.left+1; + // our subwindow needs this structure to know about its clipping. + Fl_X* x = new Fl_X; + x->other_xid = 0; + x->region = 0; + x->subRegion = 0; + x->cursor = fl_default_cursor; + x->gc = 0; // stay 0 for Quickdraw; fill with CGContext for Quartz + Fl_Window *win = w->window(); + Fl_X *xo = Fl_X::i(win); + if (xo) { + x->xidNext = xo->xidChildren; + x->xidChildren = 0L; + xo->xidChildren = x; + x->xid = fl_xid(win); + x->w = w; w->i = x; + x->wait_for_expose = 0; + x->next = Fl_X::first; // must be in the list for ::flush() + Fl_X::first = x; + int old_event = Fl::e_number; + w->handle(Fl::e_number = FL_SHOW); + Fl::e_number = old_event; + w->redraw(); // force draw to happen + } + fl_show_iconic = 0; + } + else // create a desktop window + { + Fl_Group::current(0); + fl_open_display(); + int winclass = kDocumentWindowClass; + int winattr = kWindowStandardHandlerAttribute | kWindowCloseBoxAttribute | kWindowCollapseBoxAttribute; + int xp = w->x(); + int yp = w->y(); + int wp = w->w(); + int hp = w->h(); + if (w->size_range_set) { + if ( w->minh != w->maxh || w->minw != w->maxw) + winattr |= kWindowFullZoomAttribute | kWindowResizableAttribute | kWindowLiveResizeAttribute; + } else { + if (w->resizable()) { + Fl_Widget *o = w->resizable(); + int minw = o->w(); if (minw > 100) minw = 100; + int minh = o->h(); if (minh > 100) minh = 100; + w->size_range(w->w() - o->w() + minw, w->h() - o->h() + minh, 0, 0); + winattr |= kWindowFullZoomAttribute | kWindowResizableAttribute | kWindowLiveResizeAttribute; + } else { + w->size_range(w->w(), w->h(), w->w(), w->h()); + } + } + int xwm = xp, ywm = yp, bt, bx, by; + + if (!fake_X_wm(w, xwm, ywm, bt, bx, by)) { + // menu windows and tooltips + if (w->modal()||w->override()) { + winclass = kHelpWindowClass; + winattr = 0; + } else { + winattr = 512; // kWindowNoTitleBarAttribute; + } + } else if (w->modal()) { + winclass = kMovableModalWindowClass; + } + + if (by+bt) { + wp += 2*bx; + hp += 2*by+bt; + } + if (!(w->flags() & Fl_Window::FL_FORCE_POSITION)) { + // use the Carbon functions below for default window positioning + w->x(xyPos+Fl::x()); + w->y(xyPos+Fl::y()); + xyPos += 25; + if (xyPos>200) xyPos = 100; + } else { + if (!Fl::grab()) { + xp = xwm; yp = ywm; + w->x(xp);w->y(yp); + } + xp -= bx; + yp -= by+bt; + } + + if (w->non_modal() && Fl_X::first && !fl_disable_transient_for) { + // find some other window to be "transient for": + Fl_Window* w = Fl_X::first->w; + while (w->parent()) w = w->window(); // todo: this code does not make any sense! (w!=w??) + } + + Rect wRect; + wRect.top = w->y(); + wRect.left = w->x(); + wRect.bottom = w->y() + w->h(); if (wRect.bottom<=wRect.top) wRect.bottom = wRect.top+1; + wRect.right = w->x() + w->w(); if (wRect.right<=wRect.left) wRect.right = wRect.left+1; + + const char *name = w->label(); + Str255 pTitle; + if (name) { + if (strlen(name) > 255) pTitle[0] = 255; + else pTitle[0] = strlen(name); + + memcpy(pTitle+1, name, pTitle[0]); + } else pTitle[0] = 0; + + Fl_X* x = new Fl_X; + x->other_xid = 0; // room for doublebuffering image map. On OS X this is only used by overlay windows + x->region = 0; + x->subRegion = 0; + x->cursor = fl_default_cursor; + x->xidChildren = 0; + x->xidNext = 0; + x->gc = 0; + + winattr &= GetAvailableWindowAttributes( winclass ); // make sure that the window will open + CreateNewWindow( winclass, winattr, &wRect, &(x->xid) ); + SetWTitle(x->xid, pTitle); + MoveWindow(x->xid, wRect.left, wRect.top, 1); // avoid Carbon Bug on old OS + if (w->non_modal() && !w->modal()) { + // Major kludge: this is to have the regular look, but stay above the document windows + SetWindowClass(x->xid, kFloatingWindowClass); + SetWindowActivationScope(x->xid, kWindowActivationScopeAll); + } + if (!(w->flags() & Fl_Window::FL_FORCE_POSITION)) + { + WindowRef pw = Fl_X::first ? Fl_X::first->xid : 0 ; + if (w->modal()) { + RepositionWindow(x->xid, pw, kWindowAlertPositionOnParentWindowScreen); + } else if (w->non_modal()) { + RepositionWindow(x->xid, pw, kWindowCenterOnParentWindowScreen); + } else { + RepositionWindow(x->xid, pw, kWindowCascadeOnParentWindowScreen); + } + } + x->w = w; w->i = x; + x->wait_for_expose = 1; + x->next = Fl_X::first; + Fl_X::first = x; + { // Install Carbon Event handlers + OSStatus ret; + EventHandlerUPP mousewheelHandler = NewEventHandlerUPP( carbonMousewheelHandler ); // will not be disposed by Carbon... + static EventTypeSpec mousewheelEvents[] = { + { kEventClassMouse, kEventMouseWheelMoved } }; + ret = InstallWindowEventHandler( x->xid, mousewheelHandler, + (int)(sizeof(mousewheelEvents)/sizeof(mousewheelEvents[0])), + mousewheelEvents, w, 0L ); + EventHandlerUPP mouseHandler = NewEventHandlerUPP( carbonMouseHandler ); // will not be disposed by Carbon... + static EventTypeSpec mouseEvents[] = { + { kEventClassMouse, kEventMouseDown }, + { kEventClassMouse, kEventMouseUp }, + { kEventClassMouse, kEventMouseMoved }, + { kEventClassMouse, kEventMouseDragged } }; + ret = InstallWindowEventHandler( x->xid, mouseHandler, 4, mouseEvents, w, 0L ); + EventHandlerUPP keyboardHandler = NewEventHandlerUPP( carbonKeyboardHandler ); // will not be disposed by Carbon... + static EventTypeSpec keyboardEvents[] = { + { kEventClassKeyboard, kEventRawKeyDown }, + { kEventClassKeyboard, kEventRawKeyRepeat }, + { kEventClassKeyboard, kEventRawKeyUp }, + { kEventClassKeyboard, kEventRawKeyModifiersChanged } }; + ret = InstallWindowEventHandler( x->xid, keyboardHandler, 4, keyboardEvents, w, 0L ); + EventHandlerUPP windowHandler = NewEventHandlerUPP( carbonWindowHandler ); // will not be disposed by Carbon... + static EventTypeSpec windowEvents[] = { + { kEventClassWindow, kEventWindowDrawContent }, + { kEventClassWindow, kEventWindowShown }, + { kEventClassWindow, kEventWindowHidden }, + { kEventClassWindow, kEventWindowActivated }, + { kEventClassWindow, kEventWindowDeactivated }, + { kEventClassWindow, kEventWindowClose }, + { kEventClassWindow, kEventWindowCollapsed }, + { kEventClassWindow, kEventWindowExpanded }, + { kEventClassWindow, kEventWindowBoundsChanging }, + { kEventClassWindow, kEventWindowBoundsChanged } }; + ret = InstallWindowEventHandler( x->xid, windowHandler, 10, windowEvents, w, 0L ); + ret = InstallTrackingHandler( dndTrackingHandler, x->xid, w ); + ret = InstallReceiveHandler( dndReceiveHandler, x->xid, w ); + } + + if ( ! Fl_X::first->next ) // if this is the first window, we need to bring the application to the front + { + ProcessSerialNumber psn; + OSErr err = GetCurrentProcess( &psn ); + if ( err==noErr ) SetFrontProcess( &psn ); + } + + if (w->size_range_set) w->size_range_(); + + if (winclass != kHelpWindowClass) { + Fl_Tooltip::enter(0); + } + if (w->size_range_set) w->size_range_(); + ShowWindow(x->xid); + if (fl_show_iconic) { + fl_show_iconic = 0; + CollapseWindow( x->xid, true ); // \todo Mac ; untested + } else { + w->set_visible(); + } + + Rect rect; + GetWindowBounds(x->xid, kWindowContentRgn, &rect); + w->x(rect.left); w->y(rect.top); + w->w(rect.right-rect.left); w->h(rect.bottom-rect.top); + + int old_event = Fl::e_number; + w->handle(Fl::e_number = FL_SHOW); + Fl::e_number = old_event; + w->redraw(); // force draw to happen + + if (w->modal()) { Fl::modal_ = w; fl_fix_focus(); } + } +} + + +/** + * Tell the OS what window sizes we want to allow + */ +void Fl_Window::size_range_() { + size_range_set = 1; + HISize minSize = { minw, minh }; + HISize maxSize = { maxw?maxw:32000, maxh?maxh:32000 }; + if (i && i->xid) + SetWindowResizeLimits(i->xid, &minSize, &maxSize); +} + + +/** + * returns pointer to the filename, or null if name ends with ':' + */ +const char *fl_filename_name( const char *name ) +{ + const char *p, *q; + if (!name) return (0); + for ( p = q = name ; *p ; ) + { + if ( ( p[0] == ':' ) && ( p[1] == ':' ) ) + { + q = p+2; + p++; + } + else if (p[0] == '/') + q = p + 1; + p++; + } + return q; +} + + +/** + * set the window title bar + * \todo make the titlebar icon work! + */ +void Fl_Window::label(const char *name,const char */*iname*/) { + Fl_Widget::label(name); + Str255 pTitle; + + if (name) { pTitle[0] = strlen(name); memcpy(pTitle+1, name, pTitle[0]); } + else pTitle[0] = 0; + + if (shown() || i) SetWTitle(fl_xid(this), pTitle); +} + + +/** + * make a window visible + */ +void Fl_Window::show() { + image(Fl::scheme_bg_); + if (Fl::scheme_bg_) { + labeltype(FL_NORMAL_LABEL); + align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE | FL_ALIGN_CLIP); + } else { + labeltype(FL_NO_LABEL); + } + Fl_Tooltip::exit(this); + if (!shown() || !i) { + Fl_X::make(this); + } else { + if ( !parent() ) + { + if ( IsWindowCollapsed( i->xid ) ) CollapseWindow( i->xid, false ); + if (!fl_capture) { + BringToFront(i->xid); + SelectWindow(i->xid); + } + } + } +} + + +/** + * resize a window + */ +void Fl_Window::resize(int X,int Y,int W,int H) { + if (W<=0) W = 1; // OS X does not like zero width windows + if (H<=0) H = 1; + int is_a_resize = (W != w() || H != h()); +// printf("Fl_Winodw::resize(X=%d, Y=%d, W=%d, H=%d), is_a_resize=%d, resize_from_system=%p, this=%p\n", +// X, Y, W, H, is_a_resize, resize_from_system, this); + if (X != x() || Y != y()) set_flag(FL_FORCE_POSITION); + else if (!is_a_resize) return; + if ( (resize_from_system!=this) && (!parent()) && shown()) { + if (is_a_resize) { + if (resizable()) { + if (Wmaxw) maxw = W; // over a previously set size_range + if (Hmaxh) maxh = H; + size_range(minw, minh, maxw, maxh); + } else { + size_range(W, H, W, H); + } + Rect dim; dim.left=X; dim.top=Y; dim.right=X+W; dim.bottom=Y+H; + SetWindowBounds(i->xid, kWindowContentRgn, &dim); + Rect all; all.top=-32000; all.bottom=32000; all.left=-32000; all.right=32000; + InvalWindowRect( i->xid, &all ); + } else { + MoveWindow(i->xid, X, Y, 0); + } + } + resize_from_system = 0; + if (is_a_resize) { + Fl_Group::resize(X,Y,W,H); + if (shown()) { + redraw(); + } + } else { + x(X); y(Y); + } +} + + +/** + * make all drawing go into this window (called by subclass flush() impl.) + */ +void Fl_Window::make_current() +{ +#ifdef __APPLE_QUARTZ__ + OSStatus err; + Fl_X::q_release_context(); +#endif + if ( !fl_window_region ) + fl_window_region = NewRgn(); + fl_window = i->xid; + current_ = this; + + SetPort( GetWindowPort(i->xid) ); // \todo check for the handling of doublebuffered windows + + int xp = 0, yp = 0; + Fl_Window *win = this; + while ( win ) + { + if ( !win->window() ) + break; + xp += win->x(); + yp += win->y(); + win = (Fl_Window*)win->window(); + } + SetOrigin( -xp, -yp ); + + SetRectRgn( fl_window_region, 0, 0, w(), h() ); + + // \todo for performance reasons: we don't have to create this unless the child windows moved + for ( Fl_X *cx = i->xidChildren; cx; cx = cx->xidNext ) + { + Fl_Window *cw = cx->w; + if (!cw->visible_r()) continue; + Fl_Region r = NewRgn(); + SetRectRgn( r, cw->x() - xp, cw->y() - yp, + cw->x() + cw->w() - xp, cw->y() + cw->h() - yp ); + DiffRgn( fl_window_region, r, fl_window_region ); + DisposeRgn( r ); + } + +#ifdef __APPLE_QUARTZ__ + err = QDBeginCGContext(GetWindowPort(i->xid), &i->gc); + if (err!=noErr) + fprintf(stderr, "Error %d in QDBeginCGContext\n", (int)err); + fl_gc = i->gc; + CGContextSaveGState(fl_gc); + Fl_X::q_fill_context(); +#endif + fl_clip_region( 0 ); + SetPortClipRegion( GetWindowPort(i->xid), fl_window_region ); + return; +} + +// helper function to manage the current CGContext fl_gc +#ifdef __APPLE_QUARTZ__ +extern Fl_Color fl_color_; +extern class Fl_FontSize *fl_fontsize; +extern void fl_font(class Fl_FontSize*); +extern void fl_quartz_restore_line_style_(); + +// FLTK has only one global graphics state. This function copies the FLTK state into the +// current Quartz context +void Fl_X::q_fill_context() { + if (!fl_gc) return; + int hgt = 0; + if (fl_window) { + Rect portRect; + GetPortBounds(GetWindowPort( fl_window ), &portRect); + hgt = portRect.bottom-portRect.top; + } else { + hgt = CGBitmapContextGetHeight(fl_gc); + } + CGContextTranslateCTM(fl_gc, 0.5, hgt-0.5f); + CGContextScaleCTM(fl_gc, 1.0f, -1.0f); + fl_font(fl_fontsize); + fl_color(fl_color_); + fl_quartz_restore_line_style_(); +} + +// The only way to reset clipping to its original state is to pop the current graphics +// state and restore the global state. +void Fl_X::q_clear_clipping() { + if (!fl_gc) return; + CGContextRestoreGState(fl_gc); + CGContextSaveGState(fl_gc); +} + +// Give the Quartz context back to the system +void Fl_X::q_release_context(Fl_X *x) { + if (x && x->gc!=fl_gc) return; + if (!fl_gc) return; + CGContextRestoreGState(fl_gc); + if (fl_window) { + OSStatus err = QDEndCGContext(GetWindowPort(fl_window), &fl_gc); + if (err!=noErr) + fprintf(stderr, "Error %d in QDEndCGContext\n", (int)err); + } + fl_gc = 0; +} + +void Fl_X::q_begin_image(CGRect &rect, int cx, int cy, int w, int h) { + CGContextSaveGState(fl_gc); + CGAffineTransform mx = CGContextGetCTM(fl_gc); + CGRect r2 = rect; + r2.origin.x -= 0.5f; + r2.origin.y -= 0.5f; + CGContextClipToRect(fl_gc, r2); + mx.d = -1.0; mx.tx = -mx.tx; + CGContextConcatCTM(fl_gc, mx); + rect.origin.x = -(mx.tx+0.5f) + rect.origin.x - cx; + rect.origin.y = (mx.ty+0.5f) - rect.origin.y - h + cy; + rect.size.width = w; + rect.size.height = h; +} + +void Fl_X::q_end_image() { + CGContextRestoreGState(fl_gc); +} + +#endif + +//////////////////////////////////////////////////////////////// +// Cut & paste. + +Fl_Widget *fl_selection_requestor = 0; +char *fl_selection_buffer[2]; +int fl_selection_length[2]; +int fl_selection_buffer_length[2]; +static ScrapRef myScrap = 0; + +/** + * create a selection + * owner: widget that created the selection + * stuff: pointer to selected data + * size of selected data + */ +void Fl::copy(const char *stuff, int len, int clipboard) { + if (!stuff || len<0) return; + if (len+1 > fl_selection_buffer_length[clipboard]) { + delete[] fl_selection_buffer[clipboard]; + fl_selection_buffer[clipboard] = new char[len+100]; + fl_selection_buffer_length[clipboard] = len+100; + } + memcpy(fl_selection_buffer[clipboard], stuff, len); + fl_selection_buffer[clipboard][len] = 0; // needed for direct paste + fl_selection_length[clipboard] = len; + if (clipboard) { + ClearCurrentScrap(); + OSStatus ret = GetCurrentScrap( &myScrap ); + if ( ret != noErr ) { + myScrap = 0; + return; + } + // Previous version changed \n to \r before sending the text, but I would + // prefer to leave the local buffer alone, so a copied buffer may be + // needed. Check to see if this is necessary on OS/X. + PutScrapFlavor( myScrap, kScrapFlavorTypeText, 0, + len, fl_selection_buffer[1] ); + } +} + +// Call this when a "paste" operation happens: +void Fl::paste(Fl_Widget &receiver, int clipboard) { + if (clipboard) { + // see if we own the selection, if not go get it: + ScrapRef scrap = 0; + Size len = 0; + if (GetCurrentScrap(&scrap) == noErr && scrap != myScrap && + GetScrapFlavorSize(scrap, kScrapFlavorTypeText, &len) == noErr) { + if ( len >= fl_selection_buffer_length[1] ) { + fl_selection_buffer_length[1] = len + 32; + delete[] fl_selection_buffer[1]; + fl_selection_buffer[1] = new char[len + 32]; + } + fl_selection_length[1] = len; len++; + GetScrapFlavorData( scrap, kScrapFlavorTypeText, &len, + fl_selection_buffer[1] ); + fl_selection_buffer[1][fl_selection_length[1]] = 0; + // turn all \r characters into \n: + for (int x = 0; x < len; x++) { + if (fl_selection_buffer[1][x] == '\r') + fl_selection_buffer[1][x] = '\n'; + } + } + } + Fl::e_text = fl_selection_buffer[clipboard]; + Fl::e_length = fl_selection_length[clipboard]; + if (!Fl::e_text) Fl::e_text = (char *)""; + receiver.handle(FL_PASTE); + return; +} + +void Fl::add_timeout(double time, Fl_Timeout_Handler cb, void* data) +{ + // check, if this timer slot exists already + for (int i = 0; i < mac_timer_used; ++i) { + MacTimeout& t = mac_timers[i]; + // if so, simply change the fire interval + if (t.callback == cb && t.data == data) { + SetEventLoopTimerNextFireTime(t.timer, (EventTimerInterval)time); + t.pending = 1; + return; + } + } + // no existing timer to use. Create a new one: + int timer_id = -1; + // find an empty slot in the timer array + for (int i = 0; i < mac_timer_used; ++i) { + if ( !mac_timers[i].timer ) { + timer_id = i; + break; + } + } + // if there was no empty slot, append a new timer + if (timer_id == -1) { + // make space if needed + if (mac_timer_used == mac_timer_alloc) { + realloc_timers(); + } + timer_id = mac_timer_used++; + } + // now install a brand new timer + MacTimeout& t = mac_timers[timer_id]; + EventTimerInterval fireDelay = (EventTimerInterval)time; + EventLoopTimerUPP timerUPP = NewEventLoopTimerUPP(do_timer); + EventLoopTimerRef timerRef = 0; + OSStatus err = InstallEventLoopTimer(GetMainEventLoop(), fireDelay, 0, timerUPP, data, &timerRef); + if (err == noErr) { + t.callback = cb; + t.data = data; + t.timer = timerRef; + t.upp = timerUPP; + t.pending = 1; + } else { + if (timerRef) + RemoveEventLoopTimer(timerRef); + if (timerUPP) + DisposeEventLoopTimerUPP(timerUPP); + } +} + +void Fl::repeat_timeout(double time, Fl_Timeout_Handler cb, void* data) +{ + // currently, repeat_timeout does not subtract the trigger time of the previous timer event as it should. + add_timeout(time, cb, data); +} + +int Fl::has_timeout(Fl_Timeout_Handler cb, void* data) +{ + for (int i = 0; i < mac_timer_used; ++i) { + MacTimeout& t = mac_timers[i]; + if (t.callback == cb && t.data == data && t.pending) { + return 1; + } + } + return 0; +} + +void Fl::remove_timeout(Fl_Timeout_Handler cb, void* data) +{ + for (int i = 0; i < mac_timer_used; ++i) { + MacTimeout& t = mac_timers[i]; + if (t.callback == cb && ( t.data == data || data == NULL)) { + delete_timer(t); + } + } +} + +int MacUnlinkWindow(Fl_X *ip, Fl_X *start) { + if (!ip) return 0; + if (start) { + Fl_X *pc = start; + while (pc) { + if (pc->xidNext == ip) { + pc->xidNext = ip->xidNext; + return 1; + } + if (pc->xidChildren) { + if (pc->xidChildren == ip) { + pc->xidChildren = ip->xidNext; + return 1; + } + if (MacUnlinkWindow(ip, pc->xidChildren)) + return 1; + } + pc = pc->xidNext; + } + } else { + for ( Fl_X *pc = Fl_X::first; pc; pc = pc->next ) { + if (MacUnlinkWindow(ip, pc)) + return 1; + } + } + return 0; +} + +static void MacRelinkWindow(Fl_X *x, Fl_X *p) { + if (!x || !p) return; + // first, check if 'x' is already registered as a child of 'p' + for (Fl_X *i = p->xidChildren; i; i=i->xidNext) { + if (i == x) return; + } + // now add 'x' as the first child of 'p' + x->xidNext = p->xidChildren; + p->xidChildren = x; +} + +void MacDestroyWindow(Fl_Window *w, WindowPtr p) { + MacUnmapWindow(w, p); + if (w && !w->parent() && p) + DisposeWindow(p); +} + +void MacMapWindow(Fl_Window *w, WindowPtr p) { + if (w && p) + ShowWindow(p); + //+ link to window list + if (w && w->parent()) { + MacRelinkWindow(Fl_X::i(w), Fl_X::i(w->window())); + w->redraw(); + } +} + +void MacUnmapWindow(Fl_Window *w, WindowPtr p) { + if (w && !w->parent() && p) + HideWindow(p); + if (w && Fl_X::i(w)) + MacUnlinkWindow(Fl_X::i(w)); +} + +// +// End of "$Id: Fl_mac.cxx 6800 2009-06-28 21:54:59Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_own_colormap.cxx b/third_party/windows/fltk-1.1.10/src/Fl_own_colormap.cxx new file mode 100644 index 0000000..d7fdaec --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_own_colormap.cxx @@ -0,0 +1,83 @@ +// +// "$Id: Fl_own_colormap.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Private colormap support for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Using the default system colormap can be a bad idea on PseudoColor +// visuals, since typically every application uses the default colormap and +// you can run out of colormap entries easily. +// +// The solution is to always create a new colormap on PseudoColor displays +// and copy the first 16 colors from the default colormap so that we won't +// get huge color changes when switching windows. + +#include +#include +#include + +#ifdef WIN32 +// There is probably something relevant to do on MSWindows 8-bit displays +// but I don't know what it is + +void Fl::own_colormap() {} + +#elif defined(__APPLE__) +// MacOS X always provides a TrueColor interface... + +void Fl::own_colormap() {} +#else +// X version + +void Fl::own_colormap() { + fl_open_display(); +#if USE_COLORMAP + switch (fl_visual->c_class) { + case GrayScale : + case PseudoColor : + case DirectColor : + break; + default: + return; // don't do anything for non-colormapped visuals + } + int i; + XColor colors[16]; + // Get the first 16 colors from the default colormap... + for (i = 0; i < 16; i ++) colors[i].pixel = i; + XQueryColors(fl_display, fl_colormap, colors, 16); + // Create a new colormap... + fl_colormap = XCreateColormap(fl_display, + RootWindow(fl_display,fl_screen), + fl_visual->visual, AllocNone); + // Copy those first 16 colors to our own colormap: + for (i = 0; i < 16; i ++) + XAllocColor(fl_display, fl_colormap, colors + i); +#endif +} + +#endif + +// +// End of "$Id: Fl_own_colormap.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_visual.cxx b/third_party/windows/fltk-1.1.10/src/Fl_visual.cxx new file mode 100644 index 0000000..6a9ee85 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_visual.cxx @@ -0,0 +1,121 @@ +// +// "$Id: Fl_visual.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Visual support for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Set the default visual according to passed switches: + +#include +#include +#include + +#ifdef WIN32 +int Fl::visual(int flags) { + fl_GetDC(0); + if (flags & FL_DOUBLE) return 0; + if (!(flags & FL_INDEX) && + GetDeviceCaps(fl_gc,BITSPIXEL) <= 8) return 0; + if ((flags & FL_RGB8) && GetDeviceCaps(fl_gc,BITSPIXEL)<24) return 0; + return 1; +} +#elif defined(__APPLE__) + +// \todo Mac : need to implement Visual flags +int Fl::visual(int flags) { + (void)flags; + return 1; +} + +#else + +#if USE_XDBE +#include +#endif + +static int test_visual(XVisualInfo& v, int flags) { + if (v.screen != fl_screen) return 0; +#if USE_COLORMAP + if (!(flags & FL_INDEX)) { + if (v.c_class != StaticColor && v.c_class != TrueColor) return 0; + if (v.depth <= 8) return 0; // fltk will work better in colormap mode + } + if (flags & FL_RGB8) { + if (v.depth < 24) return 0; + } + // for now, fltk does not like colormaps of more than 8 bits: + if ((v.c_class&1) && v.depth > 8) return 0; +#else + // simpler if we can't use colormapped visuals at all: + if (v.c_class != StaticColor && v.c_class != TrueColor) return 0; +#endif +#if USE_XDBE + if (flags & FL_DOUBLE) { + static XdbeScreenVisualInfo *xdbejunk; + if (!xdbejunk) { + int event_base, error_base; + if (!XdbeQueryExtension(fl_display, &event_base, &error_base)) return 0; + Drawable root = RootWindow(fl_display,fl_screen); + int numscreens = 1; + xdbejunk = XdbeGetVisualInfo(fl_display,&root,&numscreens); + if (!xdbejunk) return 0; + } + for (int j = 0; ; j++) { + if (j >= xdbejunk->count) return 0; + if (xdbejunk->visinfo[j].visual == v.visualid) break; + } + } +#endif + return 1; +} + +int Fl::visual(int flags) { +#if USE_XDBE == 0 + if (flags & FL_DOUBLE) return 0; +#endif + fl_open_display(); + // always use default if possible: + if (test_visual(*fl_visual, flags)) return 1; + // get all the visuals: + XVisualInfo vTemplate; + int num; + XVisualInfo *visualList = XGetVisualInfo(fl_display, 0, &vTemplate, &num); + // find all matches, use the one with greatest depth: + XVisualInfo *found = 0; + for (int i=0; idepth < visualList[i].depth) + found = &visualList[i]; + } + if (!found) {XFree((void*)visualList); return 0;} + fl_visual = found; + fl_colormap = XCreateColormap(fl_display, RootWindow(fl_display,fl_screen), + fl_visual->visual, AllocNone); + return 1; +} + +#endif + +// +// End of "$Id: Fl_visual.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_win32.cxx b/third_party/windows/fltk-1.1.10/src/Fl_win32.cxx new file mode 100644 index 0000000..1df2671 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_win32.cxx @@ -0,0 +1,1728 @@ +// +// "$Id: Fl_win32.cxx 6553 2008-12-07 11:05:41Z AlbrechtS $" +// +// WIN32-specific code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// This file contains win32-specific code for fltk which is always linked +// in. Search other files for "WIN32" or filenames ending in _win32.cxx +// for other system-specific code. + +#include +#include +#include +#include +#include +#include "flstring.h" +#include "Fl_Font.H" +#include +#include +#include +#include +#ifdef __CYGWIN__ +# include +# include +#else +# include +#endif +#include +#include + +// The following include files require GCC 3.x or a non-GNU compiler... +#if !defined(__GNUC__) || __GNUC__ >= 3 +# include +# include +#endif // !__GNUC__ || __GNUC__ >= 3 + + +// +// USE_ASYNC_SELECT - define it if you have WSAAsyncSelect()... +// +// This currently doesn't appear to work; needs to be fixed! +// + +//#define USE_ASYNC_SELECT + +// USE_TRACK_MOUSE - define NO_TRACK_MOUSE if you don't have +// TrackMouseEvent()... +// +// Now (Dec. 2008) we can assume that current Cygwin/MinGW versions +// support the TrackMouseEvent() function, but WinCE obviously doesn't +// support it (STR 2095). Therefore, USE_TRACK_MOUSE is enabled by +// default, but you can disable it by defining NO_TRACK_MOUSE. +// +// TrackMouseEvent is only used to support window leave notifications +// under Windows. It can be used to get FL_LEAVE events, when the +// mouse leaves the _main_ application window (FLTK detects subwindow +// leave events by using normal move events). +// +// Implementation note: If the mouse cursor leaves one subwindow and +// enters another window, then Windows sends a WM_MOUSEMOVE message to +// the new window before it sends a WM_MOUSELEAVE message to the old +// (just left) window. We save the current mouse window in a static variable, +// and if we get a WM_MOUSELEAVE event for the current mouse window, this +// means that the top level window has been left (otherwise we would have +// got another WM_MOUSEMOVE message before). + +// #define NO_TRACK_MOUSE + +#if !defined(NO_TRACK_MOUSE) +# define USE_TRACK_MOUSE +#endif // NO_TRACK_MOUSE + +static Fl_Window *track_mouse_win=0; // current TrackMouseEvent() window + +// USE_CAPTURE_MOUSE_WIN - this must be defined for TrackMouseEvent to work +// correctly with subwindows - otherwise a single mouse click and release +// (without a move) would generate phantom leave events. +// This defines, if the current mouse window (maybe a subwindow) or the +// main window should get mouse events after pushing (and holding) a mouse +// button, i.e. when dragging the mouse. This is done by calling SetCapture +// (see below). + +#ifdef USE_TRACK_MOUSE +#define USE_CAPTURE_MOUSE_WIN +#endif // USE_TRACK_MOUSE + +// +// WM_SYNCPAINT is an "undocumented" message, which is finally defined in +// VC++ 6.0. +// + +#ifndef WM_SYNCPAINT +# define WM_SYNCPAINT 0x0088 +#endif + +#ifndef WM_MOUSELEAVE +# define WM_MOUSELEAVE 0x02a3 +#endif + +#ifndef WM_MOUSEWHEEL +# define WM_MOUSEWHEEL 0x020a +#endif + +#ifndef WHEEL_DELTA +# define WHEEL_DELTA 120 // according to MSDN. +#endif + + +// +// WM_FLSELECT is the user-defined message that we get when one of +// the sockets has pending data, etc. +// + +#define WM_FLSELECT (WM_APP+1) // WM_APP is used for hide-window + + +//////////////////////////////////////////////////////////////// +// interface to poll/select call: + +// fd's are only implemented for sockets. Microsoft Windows does not +// have a unified IO system, so it doesn't support select() on files, +// devices, or pipes... +// +// Microsoft provides the Berkeley select() call and an asynchronous +// select function that sends a WIN32 message when the select condition +// exists... +static int maxfd = 0; +#ifndef USE_ASYNC_SELECT +static fd_set fdsets[3]; +#endif // !USE_ASYNC_SELECT + +#define POLLIN 1 +#define POLLOUT 4 +#define POLLERR 8 + +#if !defined(__GNUC__) || __GNUC__ >= 3 +extern IDropTarget *flIDropTarget; +#endif // !__GNUC__ || __GNUC__ >= 3 + +static int nfds = 0; +static int fd_array_size = 0; +static struct FD { + int fd; + short events; + void (*cb)(int, void*); + void* arg; +} *fd = 0; + +void Fl::add_fd(int n, int events, void (*cb)(int, void*), void *v) { + remove_fd(n,events); + int i = nfds++; + if (i >= fd_array_size) { + fd_array_size = 2*fd_array_size+1; + fd = (FD*)realloc(fd, fd_array_size*sizeof(FD)); + } + fd[i].fd = n; + fd[i].events = (short)events; + fd[i].cb = cb; + fd[i].arg = v; + +#ifdef USE_ASYNC_SELECT + int mask = 0; + if (events & POLLIN) mask |= FD_READ; + if (events & POLLOUT) mask |= FD_WRITE; + if (events & POLLERR) mask |= FD_CLOSE; + WSAAsyncSelect(n, fl_window, WM_FLSELECT, mask); +#else + if (events & POLLIN) FD_SET((unsigned)n, &fdsets[0]); + if (events & POLLOUT) FD_SET((unsigned)n, &fdsets[1]); + if (events & POLLERR) FD_SET((unsigned)n, &fdsets[2]); + if (n > maxfd) maxfd = n; +#endif // USE_ASYNC_SELECT +} + +void Fl::add_fd(int fd, void (*cb)(int, void*), void* v) { + Fl::add_fd(fd, POLLIN, cb, v); +} + +void Fl::remove_fd(int n, int events) { + int i,j; + for (i=j=0; i0 if any callbacks were done. This version only +// returns zero if nothing happens during a 0.0 timeout, otherwise +// it returns 1. +int fl_wait(double time_to_wait) { + int have_message = 0; + + run_checks(); + + // idle processing + static char in_idle; + if (Fl::idle && !in_idle) { + in_idle = 1; + Fl::idle(); + in_idle = 0; + } + +#ifndef USE_ASYNC_SELECT + if (nfds) { + // For WIN32 we need to poll for socket input FIRST, since + // the event queue is not something we can select() on... + timeval t; + t.tv_sec = 0; + t.tv_usec = 0; + + fd_set fdt[3]; + fdt[0] = fdsets[0]; + fdt[1] = fdsets[1]; + fdt[2] = fdsets[2]; + if (::select(maxfd+1,&fdt[0],&fdt[1],&fdt[2],&t)) { + // We got something - do the callback! + for (int i = 0; i < nfds; i ++) { + int f = fd[i].fd; + short revents = 0; + if (FD_ISSET(f,&fdt[0])) revents |= POLLIN; + if (FD_ISSET(f,&fdt[1])) revents |= POLLOUT; + if (FD_ISSET(f,&fdt[2])) revents |= POLLERR; + if (fd[i].events & revents) fd[i].cb(f, fd[i].arg); + } + time_to_wait = 0.0; // just peek for any messages + } else { + // we need to check them periodically, so set a short timeout: + if (time_to_wait > .001) time_to_wait = .001; + } + } +#endif // USE_ASYNC_SELECT + + if (Fl::idle || Fl::damage()) + time_to_wait = 0.0; + + // if there are no more windows and this timer is set + // to FOREVER, continue through or look up indefinetely + if (!Fl::first_window() && time_to_wait==1e20) + time_to_wait = 0.0; + + fl_unlock_function(); + + time_to_wait = (time_to_wait > 10000 ? 10000 : time_to_wait); + int t_msec = (int) (time_to_wait * 1000.0 + 0.5); + MsgWaitForMultipleObjects(0, NULL, FALSE, t_msec, QS_ALLINPUT); + + fl_lock_function(); + + // Execute the message we got, and all other pending messages: + have_message = PeekMessage(&fl_msg, NULL, 0, 0, PM_REMOVE); + if (have_message > 0) { + while (have_message != 0 && have_message != -1) { +#ifdef USE_ASYNC_SELECT + if (fl_msg.message == WM_FLSELECT) { + // Got notification for socket + for (int i = 0; i < nfds; i ++) + if (fd[i].fd == (int)fl_msg.wParam) { + (fd[i].cb)(fd[i].fd, fd[i].arg); + break; + } + // looks like it is best to do the dispatch-message anyway: + } +#endif + + if (fl_msg.message == fl_wake_msg) { + // Used for awaking wait() from another thread + thread_message_ = (void*)fl_msg.wParam; + Fl_Awake_Handler func; + void *data; + while (Fl::get_awake_handler_(func, data)==0) { + func(data); + } + } + + TranslateMessage(&fl_msg); + DispatchMessage(&fl_msg); + have_message = PeekMessage(&fl_msg, NULL, 0, 0, PM_REMOVE); + } + } + Fl::flush(); + + // This should return 0 if only timer events were handled: + return 1; +} + +// fl_ready() is just like fl_wait(0.0) except no callbacks are done: +int fl_ready() { + if (PeekMessage(&fl_msg, NULL, 0, 0, PM_NOREMOVE)) return 1; +#ifdef USE_ASYNC_SELECT + return 0; +#else + timeval t; + t.tv_sec = 0; + t.tv_usec = 0; + fd_set fdt[3]; + fdt[0] = fdsets[0]; + fdt[1] = fdsets[1]; + fdt[2] = fdsets[2]; + return ::select(0,&fdt[0],&fdt[1],&fdt[2],&t); +#endif // USE_ASYNC_SELECT +} + +//////////////////////////////////////////////////////////////// + +int Fl::x() +{ + RECT r; + + SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0); + return r.left; +} + +int Fl::y() +{ + RECT r; + + SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0); + return r.top; +} + +int Fl::h() +{ + RECT r; + + SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0); + return r.bottom - r.top; +} + +int Fl::w() +{ + RECT r; + + SystemParametersInfo(SPI_GETWORKAREA, 0, &r, 0); + return r.right - r.left; +} + +void Fl::get_mouse(int &x, int &y) { + POINT p; + GetCursorPos(&p); + x = p.x; + y = p.y; +} + +//////////////////////////////////////////////////////////////// +// code used for selections: + +char *fl_selection_buffer[2]; +int fl_selection_length[2]; +int fl_selection_buffer_length[2]; +char fl_i_own_selection[2]; + +// Convert \n -> \r\n +class Lf2CrlfConvert { + char *out; + int outlen; +public: + Lf2CrlfConvert(const char *in, int inlen) { + outlen = 0; + const char *i; + char *o; + int lencount; + // Predict size of \r\n conversion buffer + for ( i=in, lencount = inlen; lencount--; ) { + if ( *i == '\r' && *(i+1) == '\n' ) // leave \r\n untranslated + { i+=2; outlen+=2; } + else if ( *i == '\n' ) // \n by itself? leave room to insert \r + { i++; outlen+=2; } + else + { ++i; ++outlen; } + } + // Alloc conversion buffer + NULL + out = new char[outlen+1]; + // Handle \n -> \r\n conversion + for ( i=in, o=out, lencount = inlen; lencount--; ) { + if ( *i == '\r' && *(i+1) == '\n' ) // leave \r\n untranslated + { *o++ = *i++; *o++ = *i++; } + else if ( *i == '\n' ) // \n by itself? insert \r + { *o++ = '\r'; *o++ = *i++; } + else + { *o++ = *i++; } + } + *o++ = 0; + } + ~Lf2CrlfConvert() { + delete[] out; + } + int GetLength() const { return(outlen); } + const char* GetValue() const { return(out); } +}; + +// call this when you create a selection: +void Fl::copy(const char *stuff, int len, int clipboard) { + if (!stuff || len<0) return; + + // Convert \n -> \r\n (for old apps like Notepad, DOS) + Lf2CrlfConvert buf(stuff, len); + len = buf.GetLength(); + stuff = buf.GetValue(); + + if (len+1 > fl_selection_buffer_length[clipboard]) { + delete[] fl_selection_buffer[clipboard]; + fl_selection_buffer[clipboard] = new char[len+100]; + fl_selection_buffer_length[clipboard] = len+100; + } + memcpy(fl_selection_buffer[clipboard], stuff, len); + fl_selection_buffer[clipboard][len] = 0; // needed for direct paste + fl_selection_length[clipboard] = len; + if (clipboard) { + // set up for "delayed rendering": + if (OpenClipboard(fl_xid(Fl::first_window()))) { + // if the system clipboard works, use it + EmptyClipboard(); + SetClipboardData(CF_TEXT, NULL); + CloseClipboard(); + fl_i_own_selection[clipboard] = 0; + } else { + // only if it fails, instruct paste() to use the internal buffers + fl_i_own_selection[clipboard] = 1; + } + } +} + +// Call this when a "paste" operation happens: +void Fl::paste(Fl_Widget &receiver, int clipboard) { + if (!clipboard || fl_i_own_selection[clipboard]) { + // We already have it, do it quickly without window server. + // Notice that the text is clobbered if set_selection is + // called in response to FL_PASTE! + + // Convert \r\n -> \n + char *i = fl_selection_buffer[clipboard]; + if (i==0L) { + Fl::e_text = 0; + return; + } + Fl::e_text = new char[fl_selection_length[clipboard]+1]; + char *o = Fl::e_text; + while (*i) { + if ( *i == '\r' && *(i+1) == '\n') i++; + else *o++ = *i++; + } + *o = 0; + Fl::e_length = o - Fl::e_text; + receiver.handle(FL_PASTE); + delete [] Fl::e_text; + Fl::e_text = 0; + } else { + if (!OpenClipboard(NULL)) return; + HANDLE h = GetClipboardData(CF_TEXT); + if (h) { + Fl::e_text = (LPSTR)GlobalLock(h); + LPSTR a,b; + a = b = Fl::e_text; + while (*a) { // strip the CRLF pairs ($%$#@^) + if (*a == '\r' && a[1] == '\n') a++; + else *b++ = *a++; + } + *b = 0; + Fl::e_length = b - Fl::e_text; + receiver.handle(FL_PASTE); + GlobalUnlock(h); + } + CloseClipboard(); + } +} + +//////////////////////////////////////////////////////////////// + +HWND fl_capture; + +static int mouse_event(Fl_Window *window, int what, int button, + WPARAM wParam, LPARAM lParam) +{ + static int px, py, pmx, pmy; + POINT pt; + Fl::e_x = pt.x = (signed short)LOWORD(lParam); + Fl::e_y = pt.y = (signed short)HIWORD(lParam); + ClientToScreen(fl_xid(window), &pt); + Fl::e_x_root = pt.x; + Fl::e_y_root = pt.y; +#ifdef USE_CAPTURE_MOUSE_WIN + Fl_Window *mouse_window = window; // save "mouse window" +#endif + while (window->parent()) { + Fl::e_x += window->x(); + Fl::e_y += window->y(); + window = window->window(); + } + + ulong state = Fl::e_state & 0xff0000; // keep shift key states +#if 0 + // mouse event reports some shift flags, perhaps save them? + if (wParam & MK_SHIFT) state |= FL_SHIFT; + if (wParam & MK_CONTROL) state |= FL_CTRL; +#endif + if (wParam & MK_LBUTTON) state |= FL_BUTTON1; + if (wParam & MK_MBUTTON) state |= FL_BUTTON2; + if (wParam & MK_RBUTTON) state |= FL_BUTTON3; + Fl::e_state = state; + + switch (what) { + case 1: // double-click + if (Fl::e_is_click) {Fl::e_clicks++; goto J1;} + case 0: // single-click + Fl::e_clicks = 0; + J1: +#ifdef USE_CAPTURE_MOUSE_WIN + if (!fl_capture) SetCapture(fl_xid(mouse_window)); // use mouse window +#else + if (!fl_capture) SetCapture(fl_xid(window)); // use main window +#endif + Fl::e_keysym = FL_Button + button; + Fl::e_is_click = 1; + px = pmx = Fl::e_x_root; py = pmy = Fl::e_y_root; + return Fl::handle(FL_PUSH,window); + + case 2: // release: + if (!fl_capture) ReleaseCapture(); + Fl::e_keysym = FL_Button + button; + return Fl::handle(FL_RELEASE,window); + + case 3: // move: + default: // avoid compiler warning + // MSWindows produces extra events even if mouse does not move, ignore em: + if (Fl::e_x_root == pmx && Fl::e_y_root == pmy) return 1; + pmx = Fl::e_x_root; pmy = Fl::e_y_root; + if (abs(Fl::e_x_root-px)>5 || abs(Fl::e_y_root-py)>5) Fl::e_is_click = 0; + return Fl::handle(FL_MOVE,window); + + } +} + +// convert a MSWindows VK_x to an Fltk (X) Keysym: +// See also the inverse converter in Fl_get_key_win32.cxx +// This table is in numeric order by VK: +static const struct {unsigned short vk, fltk, extended;} vktab[] = { + {VK_BACK, FL_BackSpace}, + {VK_TAB, FL_Tab}, + {VK_CLEAR, FL_KP+'5', 0xff0b/*XK_Clear*/}, + {VK_RETURN, FL_Enter, FL_KP_Enter}, + {VK_SHIFT, FL_Shift_L, FL_Shift_R}, + {VK_CONTROL, FL_Control_L, FL_Control_R}, + {VK_MENU, FL_Alt_L, FL_Alt_R}, + {VK_PAUSE, FL_Pause}, + {VK_CAPITAL, FL_Caps_Lock}, + {VK_ESCAPE, FL_Escape}, + {VK_SPACE, ' '}, + {VK_PRIOR, FL_KP+'9', FL_Page_Up}, + {VK_NEXT, FL_KP+'3', FL_Page_Down}, + {VK_END, FL_KP+'1', FL_End}, + {VK_HOME, FL_KP+'7', FL_Home}, + {VK_LEFT, FL_KP+'4', FL_Left}, + {VK_UP, FL_KP+'8', FL_Up}, + {VK_RIGHT, FL_KP+'6', FL_Right}, + {VK_DOWN, FL_KP+'2', FL_Down}, + {VK_SNAPSHOT, FL_Print}, // does not work on NT + {VK_INSERT, FL_KP+'0', FL_Insert}, + {VK_DELETE, FL_KP+'.', FL_Delete}, + {VK_LWIN, FL_Meta_L}, + {VK_RWIN, FL_Meta_R}, + {VK_APPS, FL_Menu}, + {VK_MULTIPLY, FL_KP+'*'}, + {VK_ADD, FL_KP+'+'}, + {VK_SUBTRACT, FL_KP+'-'}, + {VK_DECIMAL, FL_KP+'.'}, + {VK_DIVIDE, FL_KP+'/'}, + {VK_NUMLOCK, FL_Num_Lock}, + {VK_SCROLL, FL_Scroll_Lock}, + {0xba, ';'}, + {0xbb, '='}, + {0xbc, ','}, + {0xbd, '-'}, + {0xbe, '.'}, + {0xbf, '/'}, + {0xc0, '`'}, + {0xdb, '['}, + {0xdc, '\\'}, + {0xdd, ']'}, + {0xde, '\''} +}; +static int ms2fltk(int vk, int extended) { + static unsigned short vklut[256]; + static unsigned short extendedlut[256]; + if (!vklut[1]) { // init the table + unsigned int i; + for (i = 0; i < 256; i++) vklut[i] = tolower(i); + for (i=VK_F1; i<=VK_F16; i++) vklut[i] = i+(FL_F-(VK_F1-1)); + for (i=VK_NUMPAD0; i<=VK_NUMPAD9; i++) vklut[i] = i+(FL_KP+'0'-VK_NUMPAD0); + for (i = 0; i < sizeof(vktab)/sizeof(*vktab); i++) { + vklut[vktab[i].vk] = vktab[i].fltk; + extendedlut[vktab[i].vk] = vktab[i].extended; + } + for (i = 0; i < 256; i++) if (!extendedlut[i]) extendedlut[i] = vklut[i]; + } + return extended ? extendedlut[vk] : vklut[vk]; +} + +#if USE_COLORMAP +extern HPALETTE fl_select_palette(void); // in fl_color_win32.cxx +#endif + + +///////////////////////////////////////////////////////////////////////////// +/// Win32 timers +/// + +struct Win32Timer +{ + UINT_PTR handle; + Fl_Timeout_Handler callback; + void *data; +}; +static Win32Timer* win32_timers; +static int win32_timer_alloc; +static int win32_timer_used; +static HWND s_TimerWnd; + +static void realloc_timers() +{ + if (win32_timer_alloc == 0) { + win32_timer_alloc = 8; + } + win32_timer_alloc *= 2; + Win32Timer* new_timers = new Win32Timer[win32_timer_alloc]; + memset(new_timers, 0, sizeof(Win32Timer) * win32_timer_used); + memcpy(new_timers, win32_timers, sizeof(Win32Timer) * win32_timer_used); + Win32Timer* delete_me = win32_timers; + win32_timers = new_timers; + delete [] delete_me; +} + +static void delete_timer(Win32Timer& t) +{ + KillTimer(s_TimerWnd, t.handle); + memset(&t, 0, sizeof(Win32Timer)); +} + +/// END TIMERS +///////////////////////////////////////////////////////////////////////////// + +static Fl_Window* resize_bug_fix; + +extern void fl_save_pen(void); +extern void fl_restore_pen(void); + +static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + // Copy the message to fl_msg so add_handler code can see it, it is + // already there if this is called by DispatchMessage, but not if + // Windows calls this directly. + fl_msg.hwnd = hWnd; + fl_msg.message = uMsg; + fl_msg.wParam = wParam; + fl_msg.lParam = lParam; + //fl_msg.time = ??? + //fl_msg.pt = ??? + //fl_msg.lPrivate = ??? + + Fl_Window *window = fl_find(hWnd); + + if (window) switch (uMsg) { + + case WM_QUIT: // this should not happen? + Fl::fatal("WM_QUIT message"); + + case WM_CLOSE: // user clicked close box + Fl::handle(FL_CLOSE, window); + PostQuitMessage(0); + return 0; + + case WM_SYNCPAINT : + case WM_NCPAINT : + case WM_ERASEBKGND : + // Andreas Weitl - WM_SYNCPAINT needs to be passed to DefWindowProc + // so that Windows can generate the proper paint messages... + // Similarly, WM_NCPAINT and WM_ERASEBKGND need this, too... + break; + + case WM_PAINT: { + Fl_Region R; + Fl_X *i = Fl_X::i(window); + i->wait_for_expose = 0; + char redraw_whole_window = false; + if (!i->region && window->damage()) { + // Redraw the whole window... + i->region = CreateRectRgn(0, 0, window->w(), window->h()); + redraw_whole_window = true; + } + + // We need to merge WIN32's damage into FLTK's damage. + R = CreateRectRgn(0,0,0,0); + int r = GetUpdateRgn(hWnd,R,0); + if (r==NULLREGION && !redraw_whole_window) { + break; + } + + if (i->region) { + // Also tell WIN32 that we are drawing someplace else as well... + CombineRgn(i->region, i->region, R, RGN_OR); + XDestroyRegion(R); + } else { + i->region = R; + } + if (window->type() == FL_DOUBLE_WINDOW) ValidateRgn(hWnd,0); + else ValidateRgn(hWnd,i->region); + + window->clear_damage((uchar)(window->damage()|FL_DAMAGE_EXPOSE)); + // These next two statements should not be here, so that all update + // is deferred until Fl::flush() is called during idle. However WIN32 + // apparently is very unhappy if we don't obey it and draw right now. + // Very annoying! + fl_GetDC(hWnd); // Make sure we have a DC for this window... + fl_save_pen(); + i->flush(); + fl_restore_pen(); + window->clear_damage(); + } return 0; + + case WM_LBUTTONDOWN: mouse_event(window, 0, 1, wParam, lParam); return 0; + case WM_LBUTTONDBLCLK:mouse_event(window, 1, 1, wParam, lParam); return 0; + case WM_LBUTTONUP: mouse_event(window, 2, 1, wParam, lParam); return 0; + case WM_MBUTTONDOWN: mouse_event(window, 0, 2, wParam, lParam); return 0; + case WM_MBUTTONDBLCLK:mouse_event(window, 1, 2, wParam, lParam); return 0; + case WM_MBUTTONUP: mouse_event(window, 2, 2, wParam, lParam); return 0; + case WM_RBUTTONDOWN: mouse_event(window, 0, 3, wParam, lParam); return 0; + case WM_RBUTTONDBLCLK:mouse_event(window, 1, 3, wParam, lParam); return 0; + case WM_RBUTTONUP: mouse_event(window, 2, 3, wParam, lParam); return 0; + + case WM_MOUSEMOVE: +#ifdef USE_TRACK_MOUSE + if (track_mouse_win != window) { + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(TRACKMOUSEEVENT); + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = hWnd; + _TrackMouseEvent(&tme); + track_mouse_win = window; + } +#endif // USE_TRACK_MOUSE + mouse_event(window, 3, 0, wParam, lParam); + return 0; + + case WM_MOUSELEAVE: + if (track_mouse_win == window) { // we left the top level window ! + Fl_Window *tw = window; + while (tw->parent()) tw = tw->window(); // find top level window + Fl::belowmouse(0); + Fl::handle(FL_LEAVE, tw); + } + track_mouse_win = 0; // force TrackMouseEvent() restart + break; + + case WM_SETFOCUS: + Fl::handle(FL_FOCUS, window); + break; + + case WM_KILLFOCUS: + Fl::handle(FL_UNFOCUS, window); + Fl::flush(); // it never returns to main loop when deactivated... + break; + + case WM_SHOWWINDOW: + if (!window->parent()) { + Fl::handle(wParam ? FL_SHOW : FL_HIDE, window); + } + break; + + case WM_ACTIVATEAPP: + // From eric@vfx.sel.sony.com, we should process WM_ACTIVATEAPP + // messages to restore the correct state of the shift/ctrl/alt/lock + // keys... Added control, shift, alt, and meta keys, and changed + // to use GetAsyncKeyState and do it when wParam is 1 + // (that means we have focus...) + if (wParam) + { + ulong state = 0; + if (GetAsyncKeyState(VK_CAPITAL)) state |= FL_CAPS_LOCK; + if (GetAsyncKeyState(VK_NUMLOCK)) state |= FL_NUM_LOCK; + if (GetAsyncKeyState(VK_SCROLL)) state |= FL_SCROLL_LOCK; + if (GetAsyncKeyState(VK_CONTROL)&~1) state |= FL_CTRL; + if (GetAsyncKeyState(VK_SHIFT)&~1) state |= FL_SHIFT; + if (GetAsyncKeyState(VK_MENU)) state |= FL_ALT; + if ((GetAsyncKeyState(VK_LWIN)|GetAsyncKeyState(VK_RWIN))&~1) state |= FL_META; + Fl::e_state = state; + return 0; + } + break; + + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + case WM_KEYUP: + case WM_SYSKEYUP: + // save the keysym until we figure out the characters: + Fl::e_keysym = Fl::e_original_keysym = ms2fltk(wParam,lParam&(1<<24)); + // See if TranslateMessage turned it into a WM_*CHAR message: + if (PeekMessage(&fl_msg, hWnd, WM_CHAR, WM_SYSDEADCHAR, PM_REMOVE)) { + uMsg = fl_msg.message; + wParam = fl_msg.wParam; + lParam = fl_msg.lParam; + } + case WM_DEADCHAR: + case WM_SYSDEADCHAR: + case WM_CHAR: + case WM_SYSCHAR: { + ulong state = Fl::e_state & 0xff000000; // keep the mouse button state + // if GetKeyState is expensive we might want to comment some of these out: + if (GetKeyState(VK_SHIFT)&~1) state |= FL_SHIFT; + if (GetKeyState(VK_CAPITAL)) state |= FL_CAPS_LOCK; + if (GetKeyState(VK_CONTROL)&~1) state |= FL_CTRL; + // Alt gets reported for the Alt-GR switch on foreign keyboards. + // so we need to check the event as well to get it right: + if ((lParam&(1<<29)) //same as GetKeyState(VK_MENU) + && uMsg != WM_CHAR) state |= FL_ALT; + if (GetKeyState(VK_NUMLOCK)) state |= FL_NUM_LOCK; + if ((GetKeyState(VK_LWIN)|GetKeyState(VK_RWIN))&~1) { + // WIN32 bug? GetKeyState returns garbage if the user hit the + // meta key to pop up start menu. Sigh. + if ((GetAsyncKeyState(VK_LWIN)|GetAsyncKeyState(VK_RWIN))&~1) + state |= FL_META; + } + if (GetKeyState(VK_SCROLL)) state |= FL_SCROLL_LOCK; + Fl::e_state = state; + static char buffer[2]; + if (uMsg == WM_CHAR || uMsg == WM_SYSCHAR) { + buffer[0] = char(wParam); + Fl::e_length = 1; + } else if (Fl::e_keysym >= FL_KP && Fl::e_keysym <= FL_KP_Last) { + if (state & FL_NUM_LOCK) { + // Convert to regular keypress... + buffer[0] = Fl::e_keysym-FL_KP; + Fl::e_length = 1; + } else { + // Convert to special keypress... + buffer[0] = 0; + Fl::e_length = 0; + switch (Fl::e_keysym) { + case FL_KP + '0' : + Fl::e_keysym = FL_Insert; + break; + case FL_KP + '1' : + Fl::e_keysym = FL_End; + break; + case FL_KP + '2' : + Fl::e_keysym = FL_Down; + break; + case FL_KP + '3' : + Fl::e_keysym = FL_Page_Down; + break; + case FL_KP + '4' : + Fl::e_keysym = FL_Left; + break; + case FL_KP + '6' : + Fl::e_keysym = FL_Right; + break; + case FL_KP + '7' : + Fl::e_keysym = FL_Home; + break; + case FL_KP + '8' : + Fl::e_keysym = FL_Up; + break; + case FL_KP + '9' : + Fl::e_keysym = FL_Page_Up; + break; + case FL_KP + '.' : + Fl::e_keysym = FL_Delete; + break; + case FL_KP + '/' : + case FL_KP + '*' : + case FL_KP + '-' : + case FL_KP + '+' : + buffer[0] = Fl::e_keysym-FL_KP; + Fl::e_length = 1; + break; + } + } + } else if ((lParam & (1<<31))==0){ + buffer[0] = 0; + Fl::e_length = 0; + } + Fl::e_text = buffer; + if (lParam & (1<<31)) { // key up events. + if (Fl::handle(FL_KEYUP, window)) return 0; + break; + } + // for (int i = lParam&0xff; i--;) + while (window->parent()) window = window->window(); + if (Fl::handle(FL_KEYBOARD,window)) return 0; + break;} + + case WM_MOUSEWHEEL: { + static int delta = 0; // running total of all motion + delta += (SHORT)(HIWORD(wParam)); + Fl::e_dy = -delta / WHEEL_DELTA; + delta += Fl::e_dy * WHEEL_DELTA; + if (Fl::e_dy) Fl::handle(FL_MOUSEWHEEL, window); + return 0; + } + + case WM_GETMINMAXINFO: + Fl_X::i(window)->set_minmax((LPMINMAXINFO)lParam); + break; + + case WM_SIZE: + if (!window->parent()) { + if (wParam == SIZE_MINIMIZED || wParam == SIZE_MAXHIDE) { + Fl::handle(FL_HIDE, window); + } else { + Fl::handle(FL_SHOW, window); + resize_bug_fix = window; + window->size(LOWORD(lParam), HIWORD(lParam)); + } + } + break; + + case WM_MOVE: { + resize_bug_fix = window; + int nx = LOWORD(lParam); + int ny = HIWORD(lParam); + if (nx & 0x8000) nx -= 65536; + if (ny & 0x8000) ny -= 65536; + window->position(nx, ny); } + break; + + case WM_SETCURSOR: + if (LOWORD(lParam) == HTCLIENT) { + while (window->parent()) window = window->window(); + SetCursor(Fl_X::i(window)->cursor); + return 0; + } + break; + +#if USE_COLORMAP + case WM_QUERYNEWPALETTE : + fl_GetDC(hWnd); + if (fl_select_palette()) InvalidateRect(hWnd, NULL, FALSE); + break; + + case WM_PALETTECHANGED: + fl_GetDC(hWnd); + if ((HWND)wParam != hWnd && fl_select_palette()) UpdateColors(fl_gc); + break; + + case WM_CREATE : + fl_GetDC(hWnd); + fl_select_palette(); + break; +#endif + + case WM_DESTROYCLIPBOARD: + fl_i_own_selection[1] = 0; + return 1; + + case WM_RENDERALLFORMATS: + fl_i_own_selection[1] = 0; + // Windoze seems unhappy unless I do these two steps. Documentation + // seems to vary on whether opening the clipboard is necessary or + // is in fact wrong: + CloseClipboard(); + OpenClipboard(NULL); + // fall through... + case WM_RENDERFORMAT: { + HANDLE h = GlobalAlloc(GHND, fl_selection_length[1]+1); + if (h) { + LPSTR p = (LPSTR)GlobalLock(h); + memcpy(p, fl_selection_buffer[1], fl_selection_length[1]); + p[fl_selection_length[1]] = 0; + GlobalUnlock(h); + SetClipboardData(CF_TEXT, h); + } + // Windoze also seems unhappy if I don't do this. Documentation very + // unclear on what is correct: + if (fl_msg.message == WM_RENDERALLFORMATS) CloseClipboard(); + return 1;} + + default: + if (Fl::handle(0,0)) return 0; + break; + } + + return DefWindowProc(hWnd, uMsg, wParam, lParam); +} + +//////////////////////////////////////////////////////////////// +// This function gets the dimensions of the top/left borders and +// the title bar, if there is one, based on the FL_BORDER, FL_MODAL +// and FL_NONMODAL flags, and on the window's size range. +// It returns the following values: +// +// value | border | title bar +// 0 | none | no +// 1 | fix | yes +// 2 | size | yes + +int Fl_X::fake_X_wm(const Fl_Window* w,int &X,int &Y, int &bt,int &bx, int &by) { + int W, H, xoff, yoff, dx, dy; + int ret = bx = by = bt = 0; + + int fallback = 1; + if (!w->parent()) { + HWND hwnd = fl_xid(w); + if (hwnd) { + // The block below calculates the window borders by requesting the + // required decorated window rectangle for a desired client rectangle. + // If any part of the function above fails, we will drop to a + // fallback to get the best guess which is always available. + HWND hwnd = fl_xid(w); + // request the style flags of this window, as WIN32 sees them + LONG style = GetWindowLong(hwnd, GWL_STYLE); + LONG exstyle = GetWindowLong(hwnd, GWL_EXSTYLE); + RECT r; + r.left = w->x(); + r.top = w->y(); + r.right = w->x()+w->w(); + r.bottom = w->y()+w->h(); + // get the decoration rectangle for the desired client rectangle + BOOL ok = AdjustWindowRectEx(&r, style, FALSE, exstyle); + if (ok) { + X = r.left; + Y = r.top; + W = r.right - r.left; + H = r.bottom - r.top; + bx = w->x() - r.left; + by = r.bottom - w->y() - w->h(); // height of the bootm frame + bt = w->y() - r.top - by; // height of top caption bar + xoff = bx; + yoff = by + bt; + dx = W - w->w(); + dy = H - w->h(); + if (w->size_range_set && (w->maxw != w->minw || w->maxh != w->minh)) + ret = 2; + else + ret = 1; + fallback = 0; + } + } + } + // This is the original (pre 1.1.7) routine to calculate window border sizes. + if (fallback) { + if (w->border() && !w->parent()) { + if (w->size_range_set && (w->maxw != w->minw || w->maxh != w->minh)) { + ret = 2; + bx = GetSystemMetrics(SM_CXSIZEFRAME); + by = GetSystemMetrics(SM_CYSIZEFRAME); + } else { + ret = 1; + bx = GetSystemMetrics(SM_CXFIXEDFRAME); + by = GetSystemMetrics(SM_CYFIXEDFRAME); + } + bt = GetSystemMetrics(SM_CYCAPTION); + } + //The coordinates of the whole window, including non-client area + xoff = bx; + yoff = by + bt; + dx = 2*bx; + dy = 2*by + bt; + X = w->x()-xoff; + Y = w->y()-yoff; + W = w->w()+dx; + H = w->h()+dy; + } + + //Proceed to positioning the window fully inside the screen, if possible + //Make border's lower right corner visible + int scr_x, scr_y, scr_w, scr_h; + Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h, X, Y); + if (scr_x+scr_w < X+W) X = scr_x+scr_w - W; + if (scr_y+scr_h < Y+H) Y = scr_y+scr_h - H; + //Make border's upper left corner visible + if (Xw()) X = scr_x+scr_w - w->w() - dx; + if (scr_y+scr_h < Y+dy+ w->h()) Y = scr_y+scr_h - w->h() - dy; + //Make client area's upper left corner visible + if (X+xoff < scr_x) X = scr_x-xoff; + if (Y+yoff < scr_y) Y = scr_y-yoff; + //Return the client area's top left corner in (X,Y) + X+=xoff; + Y+=yoff; + + return ret; +} + +//////////////////////////////////////////////////////////////// + +void Fl_Window::resize(int X,int Y,int W,int H) { + UINT flags = SWP_NOSENDCHANGING | SWP_NOZORDER + | SWP_NOACTIVATE | SWP_NOOWNERZORDER; + int is_a_resize = (W != w() || H != h()); + int resize_from_program = (this != resize_bug_fix); + if (!resize_from_program) resize_bug_fix = 0; + if (X != x() || Y != y()) { + set_flag(FL_FORCE_POSITION); + } else { + if (!is_a_resize) return; + flags |= SWP_NOMOVE; + } + if (is_a_resize) { + Fl_Group::resize(X,Y,W,H); + if (visible_r()) { + redraw(); + // only wait for exposure if this window has a size - a window + // with no width or height will never get an exposure event + if (i && W>0 && H>0) + i->wait_for_expose = 1; + } + } else { + x(X); y(Y); + flags |= SWP_NOSIZE; + } + if (!border()) flags |= SWP_NOACTIVATE; + if (resize_from_program && shown()) { + if (!resizable()) size_range(w(),h(),w(),h()); + int dummy_x, dummy_y, bt, bx, by; + //Ignore window managing when resizing, so that windows (and more + //specifically menus) can be moved offscreen. + if (Fl_X::fake_X_wm(this, dummy_x, dummy_y, bt, bx, by)) { + X -= bx; + Y -= by+bt; + W += 2*bx; + H += 2*by+bt; + } + // avoid zero size windows. A zero sized window on Win32 + // will cause continouly new redraw events. + if (W<=0) W = 1; + if (H<=0) H = 1; + SetWindowPos(i->xid, 0, X, Y, W, H, flags); + } +} + +//////////////////////////////////////////////////////////////// + +/* + * This silly little class remembers the name of all window classes + * we register to avoid double registration. It has the added bonus + * of freeing everything on application colse as well. + */ +class NameList { +public: + NameList() { name = (char**)malloc(sizeof(char**)); NName = 1; nName = 0; } + ~NameList() { + int i; + for (i=0; iparent() && !Fl_X::i(w->window())) { + w->set_visible(); + return 0L; + } + + static NameList class_name_list; + static const char *first_class_name = 0L; + const char *class_name = w->xclass(); + if (!class_name) class_name = first_class_name; // reuse first class name used + if (!class_name) class_name = "FLTK"; // default to create a "FLTK" WNDCLASS + if (!first_class_name) { + first_class_name = class_name; + } + + if (!class_name_list.has_name(class_name)) { + WNDCLASSEX wc; + memset(&wc, 0, sizeof(wc)); + wc.cbSize = sizeof(WNDCLASSEX); + // Documentation states a device context consumes about 800 bytes + // of memory... so who cares? If 800 bytes per window is what it + // takes to speed things up, I'm game. + //wc.style = CS_HREDRAW | CS_VREDRAW | CS_CLASSDC | CS_DBLCLKS; + wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS; + wc.lpfnWndProc = (WNDPROC)WndProc; + wc.hInstance = fl_display; + if (!w->icon()) + w->icon((void *)LoadIcon(NULL, IDI_APPLICATION)); + wc.hIcon = wc.hIconSm = (HICON)w->icon(); + wc.hCursor = fl_default_cursor = LoadCursor(NULL, IDC_ARROW); + //uchar r,g,b; Fl::get_color(FL_GRAY,r,g,b); + //wc.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(r,g,b)); + wc.lpszClassName = class_name; + RegisterClassEx(&wc); + class_name_list.add_name(class_name); + } + + const char* message_name = "FLTK::ThreadWakeup"; + if (!fl_wake_msg) fl_wake_msg = RegisterWindowMessage(message_name); + + HWND parent; + DWORD style = WS_CLIPCHILDREN | WS_CLIPSIBLINGS; + DWORD styleEx = WS_EX_LEFT; + + int xp = w->x(); + int yp = w->y(); + int wp = w->w(); + int hp = w->h(); + + int showit = 1; + + if (w->parent()) { + style |= WS_CHILD; + styleEx |= WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT; + parent = fl_xid(w->window()); + } else { + if (!w->size_range_set) { + if (w->resizable()) { + Fl_Widget *o = w->resizable(); + int minw = o->w(); if (minw > 100) minw = 100; + int minh = o->h(); if (minh > 100) minh = 100; + w->size_range(w->w() - o->w() + minw, w->h() - o->h() + minh, 0, 0); + } else { + w->size_range(w->w(), w->h(), w->w(), w->h()); + } + } + styleEx |= WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT; + int xwm = xp , ywm = yp , bt, bx, by; + switch (fake_X_wm(w, xwm, ywm, bt, bx, by)) { + // No border (used for menus) + case 0: style |= WS_POPUP; + styleEx |= WS_EX_TOOLWINDOW; + break; + + // Thin border and title bar + case 1: style |= WS_DLGFRAME | WS_CAPTION; break; + + // Thick, resizable border and title bar, with maximize button + case 2: style |= WS_THICKFRAME | WS_MAXIMIZEBOX | WS_CAPTION ; break; + } + if (by+bt) { + if (!w->modal()) style |= WS_SYSMENU | WS_MINIMIZEBOX; + wp += 2*bx; + hp += 2*by+bt; + } + if (!(w->flags() & Fl_Window::FL_FORCE_POSITION)) { + xp = yp = CW_USEDEFAULT; + } else { + if (!Fl::grab()) { + xp = xwm; yp = ywm; + w->x(xp);w->y(yp); + } + xp -= bx; + yp -= by+bt; + } + + parent = 0; + if (w->non_modal() && Fl_X::first && !fl_disable_transient_for) { + // find some other window to be "transient for": + Fl_Window* w = Fl_X::first->w; + while (w->parent()) w = w->window(); + parent = fl_xid(w); + if (!w->visible()) showit = 0; + } else if (Fl::grab()) parent = fl_xid(Fl::grab()); + } + + Fl_X* x = new Fl_X; + x->other_xid = 0; + x->setwindow(w); + x->region = 0; + x->private_dc = 0; + x->cursor = fl_default_cursor; + x->xid = CreateWindowEx( + styleEx, + class_name, w->label(), style, + xp, yp, wp, hp, + parent, + NULL, // menu + fl_display, + NULL // creation parameters + ); + x->next = Fl_X::first; + Fl_X::first = x; + + x->wait_for_expose = 1; + if (fl_show_iconic) {showit = 0; fl_show_iconic = 0;} + if (showit) { + w->set_visible(); + int old_event = Fl::e_number; + w->handle(Fl::e_number = FL_SHOW); // get child windows to appear + Fl::e_number = old_event; + w->redraw(); // force draw to happen + } + // If we've captured the mouse, we dont want to activate any + // other windows from the code, or we loose the capture. + ShowWindow(x->xid, !showit ? SW_SHOWMINNOACTIVE : + (Fl::grab() || (style & WS_POPUP)) ? SW_SHOWNOACTIVATE : SW_SHOWNORMAL); + + // Drag-n-drop requires GCC 3.x or a non-GNU compiler... +#if !defined(__GNUC__) || __GNUC__ >= 3 + // Register all windows for potential drag'n'drop operations + static char oleInitialized = 0; + if (!oleInitialized) { OleInitialize(0L); oleInitialized=1; } + + RegisterDragDrop(x->xid, flIDropTarget); +#endif // !__GNUC__ || __GNUC__ >= 3 + + if (w->modal()) {Fl::modal_ = w; fl_fix_focus();} + return x; +} + + + + +///////////////////////////////////////////////////////////////////////////// +/// Win32 timers +/// + + +static LRESULT CALLBACK s_TimerProc(HWND hwnd, UINT msg, + WPARAM wParam, LPARAM lParam) +{ + switch (msg) { + case WM_TIMER: + { + unsigned int id = wParam - 1; + if (id < (unsigned int)win32_timer_used && win32_timers[id].handle) { + Fl_Timeout_Handler cb = win32_timers[id].callback; + void* data = win32_timers[id].data; + delete_timer(win32_timers[id]); + if (cb) { + (*cb)(data); + } + } + } + return 0; + + default: + break; + } + + return DefWindowProc(hwnd, msg, wParam, lParam); +} + +void Fl::add_timeout(double time, Fl_Timeout_Handler cb, void* data) +{ + repeat_timeout(time, cb, data); +} + +void Fl::repeat_timeout(double time, Fl_Timeout_Handler cb, void* data) +{ + int timer_id = -1; + for (int i = 0; i < win32_timer_used; ++i) { + if ( !win32_timers[i].handle ) { + timer_id = i; + break; + } + } + if (timer_id == -1) { + if (win32_timer_used == win32_timer_alloc) { + realloc_timers(); + } + timer_id = win32_timer_used++; + } + unsigned int elapsed = (unsigned int)(time * 1000); + + if ( !s_TimerWnd ) { + const char* timer_class = "FLTimer"; + WNDCLASSEX wc; + memset(&wc, 0, sizeof(wc)); + wc.cbSize = sizeof (wc); + wc.style = CS_CLASSDC; + wc.lpfnWndProc = (WNDPROC)s_TimerProc; + wc.hInstance = fl_display; + wc.lpszClassName = timer_class; + /*ATOM atom =*/ RegisterClassEx(&wc); + // create a zero size window to handle timer events + s_TimerWnd = CreateWindowEx(WS_EX_LEFT | WS_EX_TOOLWINDOW, + timer_class, "", + WS_POPUP, + 0, 0, 0, 0, + NULL, NULL, fl_display, NULL); + // just in case this OS won't let us create a 0x0 size window: + if (!s_TimerWnd) + s_TimerWnd = CreateWindowEx(WS_EX_LEFT | WS_EX_TOOLWINDOW, + timer_class, "", + WS_POPUP, + 0, 0, 1, 1, + NULL, NULL, fl_display, NULL); + ShowWindow(s_TimerWnd, SW_SHOWNOACTIVATE); + } + + win32_timers[timer_id].callback = cb; + win32_timers[timer_id].data = data; + + win32_timers[timer_id].handle = + SetTimer(s_TimerWnd, timer_id + 1, elapsed, NULL); +} + +int Fl::has_timeout(Fl_Timeout_Handler cb, void* data) +{ + for (int i = 0; i < win32_timer_used; ++i) { + Win32Timer& t = win32_timers[i]; + if (t.handle && t.callback == cb && t.data == data) { + return 1; + } + } + return 0; +} + +void Fl::remove_timeout(Fl_Timeout_Handler cb, void* data) +{ + int i; + for (i = 0; i < win32_timer_used; ++i) { + Win32Timer& t = win32_timers[i]; + if (t.handle && t.callback == cb && + (t.data == data || data == NULL)) { + delete_timer(t); + } + } +} + +/// END TIMERS +///////////////////////////////////////////////////////////////////////////// + + + +//////////////////////////////////////////////////////////////// + +HINSTANCE fl_display = GetModuleHandle(NULL); + +void Fl_Window::size_range_() { + size_range_set = 1; +} + +void Fl_X::set_minmax(LPMINMAXINFO minmax) +{ + int td, wd, hd, dummy_x, dummy_y; + + fake_X_wm(w, dummy_x, dummy_y, td, wd, hd); + wd *= 2; + hd *= 2; + hd += td; + + minmax->ptMinTrackSize.x = w->minw + wd; + minmax->ptMinTrackSize.y = w->minh + hd; + if (w->maxw) { + minmax->ptMaxTrackSize.x = w->maxw + wd; + minmax->ptMaxSize.x = w->maxw + wd; + } + if (w->maxh) { + minmax->ptMaxTrackSize.y = w->maxh + hd; + minmax->ptMaxSize.y = w->maxh + hd; + } +} + +//////////////////////////////////////////////////////////////// + +#include // need so FL_EXPORT fl_filename_name works + +// returns pointer to the filename, or null if name ends with '/' +const char *fl_filename_name(const char *name) { + const char *p,*q; + if (!name) return (0); + q = name; + if (q[0] && q[1]==':') q += 2; // skip leading drive letter + for (p = q; *p; p++) if (*p == '/' || *p == '\\') q = p+1; + return q; +} + +void Fl_Window::label(const char *name,const char *iname) { + Fl_Widget::label(name); + iconlabel_ = iname; + if (shown() && !parent()) { + if (!name) name = ""; + SetWindowText(i->xid, name); + // if (!iname) iname = fl_filename_name(name); + // should do something with iname here... + } +} + +//////////////////////////////////////////////////////////////// +// Implement the virtual functions for the base Fl_Window class: + +// If the box is a filled rectangle, we can make the redisplay *look* +// faster by using X's background pixel erasing. We can make it +// actually *be* faster by drawing the frame only, this is done by +// setting fl_boxcheat, which is seen by code in fl_drawbox.cxx: +// For WIN32 it looks like all windows share a background color, so +// I use FL_GRAY for this and only do this cheat for windows that are +// that color. +// Actually it is totally disabled. +// Fl_Widget *fl_boxcheat; +//static inline int can_boxcheat(uchar b) {return (b==1 || (b&2) && b<=15);} + +void Fl_Window::show() { + image(Fl::scheme_bg_); + if (Fl::scheme_bg_) { + labeltype(FL_NORMAL_LABEL); + align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE | FL_ALIGN_CLIP); + } else { + labeltype(FL_NO_LABEL); + } + Fl_Tooltip::exit(this); + if (!shown()) { + // if (can_boxcheat(box())) fl_background_pixel = fl_xpixel(color()); + Fl_X::make(this); + } else { + // Once again, we would lose the capture if we activated the window. + if (IsIconic(i->xid)) OpenIcon(i->xid); + if (!fl_capture) BringWindowToTop(i->xid); + //ShowWindow(i->xid,fl_capture?SW_SHOWNOACTIVATE:SW_RESTORE); + } +} + +Fl_Window *Fl_Window::current_; +// the current context +HDC fl_gc = 0; +// the current window handle, initially set to -1 so we can correctly +// allocate fl_GetDC(0) +HWND fl_window = NULL; + +// Here we ensure only one GetDC is ever in place. +HDC fl_GetDC(HWND w) { + if (fl_gc) { + if (w == fl_window && fl_window != NULL) return fl_gc; + if (fl_window) fl_release_dc(fl_window, fl_gc); // ReleaseDC + } + fl_gc = GetDC(w); + fl_save_dc(w, fl_gc); + fl_window = w; + // calling GetDC seems to always reset these: (?) + SetTextAlign(fl_gc, TA_BASELINE|TA_LEFT); + SetBkMode(fl_gc, TRANSPARENT); + return fl_gc; +} + +// make X drawing go into this window (called by subclass flush() impl.) +void Fl_Window::make_current() { + fl_GetDC(fl_xid(this)); + +#if USE_COLORMAP + // Windows maintains a hardware and software color palette; the + // SelectPalette() call updates the current soft->hard mapping + // for all drawing calls, so we must select it here before any + // code does any drawing... + + fl_select_palette(); +#endif // USE_COLORMAP + + current_ = this; + fl_clip_region(0); +} + +/* Make sure that all allocated fonts are released. This works only if + Fl::run() is allowed to exit by closing all windows. Calling 'exit(int)' + will not automatically free any fonts. */ +void fl_free_fonts(void) +{ +// remove the Fl_FontSize chains + int i; + Fl_Fontdesc * s; + Fl_FontSize * f; + Fl_FontSize * ff; + for (i=0; ifirst; f; f=ff) { + ff = f->next; + delete f; + s->first = ff; + } + } +} + + +/////////////////////////////////////////////////////////////////////// +// +// The following routines help fix a problem with the leaking of Windows +// Device Context (DC) objects. The 'proper' protocol is for a program to +// acquire a DC, save its state, do the modifications needed for drawing, +// perform the drawing, restore the initial state, and release the DC. In +// FLTK, the save and restore steps have previously been omitted and DCs are +// not properly released, leading to a great number of DC leaks. As some +// Windows "OSs" will hang when any process exceeds roughly 10,000 GDI objects, +// it is important to control GDI leaks, which are much more important than memory +// leaks. The following struct, global variable, and routines help implement +// the above protocol for those cases where the GetDC and RestoreDC are not in +// the same routine. For each GetDC, fl_save_dc is used to create an entry in +// a linked list that saves the window handle, the DC handle, and the initial +// state. When the DC is to be released, 'fl_release_dc' is called. It restores +// the initial state and releases the DC. When the program exits, 'fl_cleanup_dc_list' +// frees any remaining nodes in the list. + +struct Win_DC_List { // linked list + HWND window; // window handle + HDC dc; // device context handle + int saved_dc; // initial state of DC + Win_DC_List * next; // pointer to next item +}; + +static Win_DC_List * win_DC_list = 0; + +void fl_save_dc( HWND w, HDC dc) { + Win_DC_List * t; + t = new Win_DC_List; + t->window = w; + t->dc = dc; + t->saved_dc = SaveDC(dc); + if (win_DC_list) + t->next = win_DC_list; + else + t->next = NULL; + win_DC_list = t; +} + +void fl_release_dc(HWND w, HDC dc) { + Win_DC_List * t= win_DC_list; + Win_DC_List * prev = 0; + if (!t) + return; + do { + if (t->dc == dc) { + RestoreDC(dc, t->saved_dc); + ReleaseDC(w, dc); + if (!prev) { + win_DC_list = t->next; // delete first item + } else { + prev->next = t->next; // one in the middle + } + delete (t); + return; + } + prev = t; + t = t->next; + } while (t); +} + +void fl_cleanup_dc_list(void) { // clean up the list + Win_DC_List * t = win_DC_list; + if (!t)return; + do { + RestoreDC(t->dc, t->saved_dc); + ReleaseDC(t->window, t->dc); + win_DC_list = t->next; + delete (t); + t = win_DC_list; + } while(t); +} + + +// +// End of "$Id: Fl_win32.cxx 6553 2008-12-07 11:05:41Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Fl_x.cxx b/third_party/windows/fltk-1.1.10/src/Fl_x.cxx new file mode 100644 index 0000000..b83ace6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_x.cxx @@ -0,0 +1,1413 @@ +// +// "$Id: Fl_x.cxx 5914 2007-06-18 13:08:57Z matt $" +// +// X specific code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifdef WIN32 +//# include "Fl_win32.cxx" +#elif defined(__APPLE__) +//# include "Fl_mac.cxx" +#else + +# define CONSOLIDATE_MOTION 1 +/**** Define this if your keyboard lacks a backspace key... ****/ +/* #define BACKSPACE_HACK 1 */ + +# include +# include +# include +# include +# include +# include +# include "flstring.h" +# include +# include + +//////////////////////////////////////////////////////////////// +// interface to poll/select call: + +# if USE_POLL + +# include +static pollfd *pollfds = 0; + +# else +# if HAVE_SYS_SELECT_H +# include +# endif /* HAVE_SYS_SELECT_H */ + +// The following #define is only needed for HP-UX 9.x and earlier: +//#define select(a,b,c,d,e) select((a),(int *)(b),(int *)(c),(int *)(d),(e)) + +static fd_set fdsets[3]; +static int maxfd; +# define POLLIN 1 +# define POLLOUT 4 +# define POLLERR 8 + +# endif /* USE_POLL */ + +static int nfds = 0; +static int fd_array_size = 0; +struct FD { +# if !USE_POLL + int fd; + short events; +# endif + void (*cb)(int, void*); + void* arg; +}; + +static FD *fd = 0; + +void Fl::add_fd(int n, int events, void (*cb)(int, void*), void *v) { + remove_fd(n,events); + int i = nfds++; + if (i >= fd_array_size) { + FD *temp; + fd_array_size = 2*fd_array_size+1; + + if (!fd) temp = (FD*)malloc(fd_array_size*sizeof(FD)); + else temp = (FD*)realloc(fd, fd_array_size*sizeof(FD)); + + if (!temp) return; + fd = temp; + +# if USE_POLL + pollfd *tpoll; + + if (!pollfds) tpoll = (pollfd*)malloc(fd_array_size*sizeof(pollfd)); + else tpoll = (pollfd*)realloc(pollfds, fd_array_size*sizeof(pollfd)); + + if (!tpoll) return; + pollfds = tpoll; +# endif + } + fd[i].cb = cb; + fd[i].arg = v; +# if USE_POLL + pollfds[i].fd = n; + pollfds[i].events = events; +# else + fd[i].fd = n; + fd[i].events = events; + if (events & POLLIN) FD_SET(n, &fdsets[0]); + if (events & POLLOUT) FD_SET(n, &fdsets[1]); + if (events & POLLERR) FD_SET(n, &fdsets[2]); + if (n > maxfd) maxfd = n; +# endif +} + +void Fl::add_fd(int n, void (*cb)(int, void*), void* v) { + Fl::add_fd(n, POLLIN, cb, v); +} + +void Fl::remove_fd(int n, int events) { + int i,j; + maxfd = -1; // recalculate maxfd on the fly + for (i=j=0; i maxfd) maxfd = fd[i].fd; + // move it down in the array if necessary: + if (j0 if any callbacks were done. +int fl_wait(double time_to_wait) { + + // OpenGL and other broken libraries call XEventsQueued + // unnecessarily and thus cause the file descriptor to not be ready, + // so we must check for already-read events: + if (fl_display && XQLength(fl_display)) {do_queued_events(); return 1;} + +# if !USE_POLL + fd_set fdt[3]; + fdt[0] = fdsets[0]; + fdt[1] = fdsets[1]; + fdt[2] = fdsets[2]; +# endif + int n; + + fl_unlock_function(); + + if (time_to_wait < 2147483.648) { +# if USE_POLL + n = ::poll(pollfds, nfds, int(time_to_wait*1000 + .5)); +# else + timeval t; + t.tv_sec = int(time_to_wait); + t.tv_usec = int(1000000 * (time_to_wait-t.tv_sec)); + n = ::select(maxfd+1,&fdt[0],&fdt[1],&fdt[2],&t); +# endif + } else { +# if USE_POLL + n = ::poll(pollfds, nfds, -1); +# else + n = ::select(maxfd+1,&fdt[0],&fdt[1],&fdt[2],0); +# endif + } + + fl_lock_function(); + + if (n > 0) { + for (int i=0; irequest_code); + XGetErrorDatabaseText(d,"",buf1,buf1,buf2,128); + XGetErrorText(d, e->error_code, buf1, 128); + Fl::warning("%s: %s 0x%lx", buf2, buf1, e->resourceid); + return 0; + } +} + +void fl_open_display() { + if (fl_display) return; + + XSetIOErrorHandler(io_error_handler); + XSetErrorHandler(xerror_handler); + + Display *d = XOpenDisplay(0); + if (!d) Fl::fatal("Can't open display: %s",XDisplayName(0)); + + fl_open_display(d); +} + +void fl_open_display(Display* d) { + fl_display = d; + + WM_DELETE_WINDOW = XInternAtom(d, "WM_DELETE_WINDOW", 0); + WM_PROTOCOLS = XInternAtom(d, "WM_PROTOCOLS", 0); + fl_MOTIF_WM_HINTS = XInternAtom(d, "_MOTIF_WM_HINTS", 0); + TARGETS = XInternAtom(d, "TARGETS", 0); + CLIPBOARD = XInternAtom(d, "CLIPBOARD", 0); + fl_XdndAware = XInternAtom(d, "XdndAware", 0); + fl_XdndSelection = XInternAtom(d, "XdndSelection", 0); + fl_XdndEnter = XInternAtom(d, "XdndEnter", 0); + fl_XdndTypeList = XInternAtom(d, "XdndTypeList", 0); + fl_XdndPosition = XInternAtom(d, "XdndPosition", 0); + fl_XdndLeave = XInternAtom(d, "XdndLeave", 0); + fl_XdndDrop = XInternAtom(d, "XdndDrop", 0); + fl_XdndStatus = XInternAtom(d, "XdndStatus", 0); + fl_XdndActionCopy = XInternAtom(d, "XdndActionCopy", 0); + fl_XdndFinished = XInternAtom(d, "XdndFinished", 0); + //fl_XdndProxy = XInternAtom(d, "XdndProxy", 0); + fl_XdndEnter = XInternAtom(d, "XdndEnter", 0); + fl_XdndURIList = XInternAtom(d, "text/uri-list", 0); + + Fl::add_fd(ConnectionNumber(d), POLLIN, fd_callback); + + fl_screen = DefaultScreen(d); + + fl_message_window = + XCreateSimpleWindow(d, RootWindow(d,fl_screen), 0,0,1,1,0, 0, 0); + +// construct an XVisualInfo that matches the default Visual: + XVisualInfo templt; int num; + templt.visualid = XVisualIDFromVisual(DefaultVisual(d, fl_screen)); + fl_visual = XGetVisualInfo(d, VisualIDMask, &templt, &num); + fl_colormap = DefaultColormap(d, fl_screen); + +#if !USE_COLORMAP + Fl::visual(FL_RGB); +#endif +} + +void fl_close_display() { + Fl::remove_fd(ConnectionNumber(fl_display)); + XCloseDisplay(fl_display); +} + +static int fl_workarea_xywh[4] = { -1, -1, -1, -1 }; + +static void fl_init_workarea() { + fl_open_display(); + + Atom _NET_WORKAREA = XInternAtom(fl_display, "_NET_WORKAREA", 0); + Atom actual; + unsigned long count, remaining; + int format; + unsigned *xywh; + + if (XGetWindowProperty(fl_display, RootWindow(fl_display, fl_screen), + _NET_WORKAREA, 0, 4 * sizeof(unsigned), False, + XA_CARDINAL, &actual, &format, &count, &remaining, + (unsigned char **)&xywh) || !xywh || !xywh[2] || + !xywh[3]) + { + fl_workarea_xywh[0] = 0; + fl_workarea_xywh[1] = 0; + fl_workarea_xywh[2] = DisplayWidth(fl_display, fl_screen); + fl_workarea_xywh[3] = DisplayHeight(fl_display, fl_screen); + } + else + { + fl_workarea_xywh[0] = (int)xywh[0]; + fl_workarea_xywh[1] = (int)xywh[1]; + fl_workarea_xywh[2] = (int)xywh[2]; + fl_workarea_xywh[3] = (int)xywh[3]; + XFree(xywh); + } +} + +int Fl::x() { + if (fl_workarea_xywh[0] < 0) fl_init_workarea(); + return fl_workarea_xywh[0]; +} + +int Fl::y() { + if (fl_workarea_xywh[0] < 0) fl_init_workarea(); + return fl_workarea_xywh[1]; +} + +int Fl::w() { + if (fl_workarea_xywh[0] < 0) fl_init_workarea(); + return fl_workarea_xywh[2]; +} + +int Fl::h() { + if (fl_workarea_xywh[0] < 0) fl_init_workarea(); + return fl_workarea_xywh[3]; +} + +void Fl::get_mouse(int &xx, int &yy) { + fl_open_display(); + Window root = RootWindow(fl_display, fl_screen); + Window c; int mx,my,cx,cy; unsigned int mask; + XQueryPointer(fl_display,root,&root,&c,&mx,&my,&cx,&cy,&mask); + xx = mx; + yy = my; +} + +//////////////////////////////////////////////////////////////// +// Code used for paste and DnD into the program: + +Fl_Widget *fl_selection_requestor; +char *fl_selection_buffer[2]; +int fl_selection_length[2]; +int fl_selection_buffer_length[2]; +char fl_i_own_selection[2]; + +// Call this when a "paste" operation happens: +void Fl::paste(Fl_Widget &receiver, int clipboard) { + if (fl_i_own_selection[clipboard]) { + // We already have it, do it quickly without window server. + // Notice that the text is clobbered if set_selection is + // called in response to FL_PASTE! + Fl::e_text = fl_selection_buffer[clipboard]; + Fl::e_length = fl_selection_length[clipboard]; + if (!Fl::e_text) Fl::e_text = (char *)""; + receiver.handle(FL_PASTE); + return; + } + // otherwise get the window server to return it: + fl_selection_requestor = &receiver; + Atom property = clipboard ? CLIPBOARD : XA_PRIMARY; + XConvertSelection(fl_display, property, XA_STRING, property, + fl_xid(Fl::first_window()), fl_event_time); +} + +Window fl_dnd_source_window; +Atom *fl_dnd_source_types; // null-terminated list of data types being supplied +Atom fl_dnd_type; +Atom fl_dnd_source_action; +Atom fl_dnd_action; + +void fl_sendClientMessage(Window window, Atom message, + unsigned long d0, + unsigned long d1=0, + unsigned long d2=0, + unsigned long d3=0, + unsigned long d4=0) +{ + XEvent e; + e.xany.type = ClientMessage; + e.xany.window = window; + e.xclient.message_type = message; + e.xclient.format = 32; + e.xclient.data.l[0] = (long)d0; + e.xclient.data.l[1] = (long)d1; + e.xclient.data.l[2] = (long)d2; + e.xclient.data.l[3] = (long)d3; + e.xclient.data.l[4] = (long)d4; + XSendEvent(fl_display, window, 0, 0, &e); +} + +//////////////////////////////////////////////////////////////// +// Code for copying to clipboard and DnD out of the program: + +void Fl::copy(const char *stuff, int len, int clipboard) { + if (!stuff || len<0) return; + if (len+1 > fl_selection_buffer_length[clipboard]) { + delete[] fl_selection_buffer[clipboard]; + fl_selection_buffer[clipboard] = new char[len+100]; + fl_selection_buffer_length[clipboard] = len+100; + } + memcpy(fl_selection_buffer[clipboard], stuff, len); + fl_selection_buffer[clipboard][len] = 0; // needed for direct paste + fl_selection_length[clipboard] = len; + fl_i_own_selection[clipboard] = 1; + Atom property = clipboard ? CLIPBOARD : XA_PRIMARY; + XSetSelectionOwner(fl_display, property, fl_message_window, fl_event_time); +} + +//////////////////////////////////////////////////////////////// + +const XEvent* fl_xevent; // the current x event +ulong fl_event_time; // the last timestamp from an x event + +char fl_key_vector[32]; // used by Fl::get_key() + +// Record event mouse position and state from an XEvent: + +static int px, py; +static ulong ptime; + +static void set_event_xy() { +# if CONSOLIDATE_MOTION + send_motion = 0; +# endif + Fl::e_x_root = fl_xevent->xbutton.x_root; + Fl::e_x = fl_xevent->xbutton.x; + Fl::e_y_root = fl_xevent->xbutton.y_root; + Fl::e_y = fl_xevent->xbutton.y; + Fl::e_state = fl_xevent->xbutton.state << 16; + fl_event_time = fl_xevent->xbutton.time; +# ifdef __sgi + // get the meta key off PC keyboards: + if (fl_key_vector[18]&0x18) Fl::e_state |= FL_META; +# endif + // turn off is_click if enough time or mouse movement has passed: + if (abs(Fl::e_x_root-px)+abs(Fl::e_y_root-py) > 3 || + fl_event_time >= ptime+1000) + Fl::e_is_click = 0; +} + +// if this is same event as last && is_click, increment click count: +static inline void checkdouble() { + if (Fl::e_is_click == Fl::e_keysym) + Fl::e_clicks++; + else { + Fl::e_clicks = 0; + Fl::e_is_click = Fl::e_keysym; + } + px = Fl::e_x_root; + py = Fl::e_y_root; + ptime = fl_event_time; +} + +static Fl_Window* resize_bug_fix; + +extern "C" { + static Bool fake_keyup_test(Display*, XEvent* event, char* previous) { + return + event->type == KeyPress && + event->xkey.keycode == ((XKeyEvent*)previous)->keycode && + event->xkey.time == ((XKeyEvent*)previous)->time; + } +} + +//////////////////////////////////////////////////////////////// + +static char unknown[] = ""; +const int unknown_len = 10; + +int fl_handle(const XEvent& thisevent) +{ + XEvent xevent = thisevent; + fl_xevent = &thisevent; + Window xid = xevent.xany.window; + + switch (xevent.type) { + + case KeymapNotify: + memcpy(fl_key_vector, xevent.xkeymap.key_vector, 32); + return 0; + + case MappingNotify: + XRefreshKeyboardMapping((XMappingEvent*)&xevent.xmapping); + return 0; + + case SelectionNotify: { + if (!fl_selection_requestor) return 0; + static unsigned char* buffer; + if (buffer) {XFree(buffer); buffer = 0;} + long bytesread = 0; + if (fl_xevent->xselection.property) for (;;) { + // The Xdnd code pastes 64K chunks together, possibly to avoid + // bugs in X servers, or maybe to avoid an extra round-trip to + // get the property length. I copy this here: + Atom actual; int format; unsigned long count, remaining; + unsigned char* portion; + if (XGetWindowProperty(fl_display, + fl_xevent->xselection.requestor, + fl_xevent->xselection.property, + bytesread/4, 65536, 1, 0, + &actual, &format, &count, &remaining, + &portion)) break; // quit on error + if (bytesread) { // append to the accumulated buffer + buffer = (unsigned char*)realloc(buffer, bytesread+count*format/8+remaining); + memcpy(buffer+bytesread, portion, count*format/8); + XFree(portion); + } else { // Use the first section without moving the memory: + buffer = portion; + } + bytesread += count*format/8; + if (!remaining) break; + } + Fl::e_text = buffer ? (char*)buffer : (char *)""; + Fl::e_length = bytesread; + int old_event = Fl::e_number; + fl_selection_requestor->handle(Fl::e_number = FL_PASTE); + Fl::e_number = old_event; + // Detect if this paste is due to Xdnd by the property name (I use + // XA_SECONDARY for that) and send an XdndFinished message. It is not + // clear if this has to be delayed until now or if it can be done + // immediatly after calling XConvertSelection. + if (fl_xevent->xselection.property == XA_SECONDARY && + fl_dnd_source_window) { + fl_sendClientMessage(fl_dnd_source_window, fl_XdndFinished, + fl_xevent->xselection.requestor); + fl_dnd_source_window = 0; // don't send a second time + } + return 1;} + + case SelectionClear: { + int clipboard = fl_xevent->xselectionclear.selection == CLIPBOARD; + fl_i_own_selection[clipboard] = 0; + return 1;} + + case SelectionRequest: { + XSelectionEvent e; + e.type = SelectionNotify; + e.requestor = fl_xevent->xselectionrequest.requestor; + e.selection = fl_xevent->xselectionrequest.selection; + int clipboard = e.selection == CLIPBOARD; + e.target = fl_xevent->xselectionrequest.target; + e.time = fl_xevent->xselectionrequest.time; + e.property = fl_xevent->xselectionrequest.property; + if (e.target == TARGETS) { + Atom a = XA_STRING; + XChangeProperty(fl_display, e.requestor, e.property, + XA_ATOM, sizeof(Atom)*8, 0, (unsigned char*)&a, 1); + } else if (/*e.target == XA_STRING &&*/ fl_selection_length[clipboard]) { + XChangeProperty(fl_display, e.requestor, e.property, + e.target, 8, 0, + (unsigned char *)fl_selection_buffer[clipboard], + fl_selection_length[clipboard]); + } else { +// char* x = XGetAtomName(fl_display,e.target); +// fprintf(stderr,"selection request of %s\n",x); +// XFree(x); + e.property = 0; + } + XSendEvent(fl_display, e.requestor, 0, 0, (XEvent *)&e);} + return 1; + + // events where interesting window id is in a different place: + case CirculateNotify: + case CirculateRequest: + case ConfigureNotify: + case ConfigureRequest: + case CreateNotify: + case DestroyNotify: + case GravityNotify: + case MapNotify: + case MapRequest: + case ReparentNotify: + case UnmapNotify: + xid = xevent.xmaprequest.window; + break; + } + + int event = 0; + Fl_Window* window = fl_find(xid); + + if (window) switch (xevent.type) { + + case ClientMessage: { + Atom message = fl_xevent->xclient.message_type; + const long* data = fl_xevent->xclient.data.l; + if ((Atom)(data[0]) == WM_DELETE_WINDOW) { + event = FL_CLOSE; + } else if (message == fl_XdndEnter) { + fl_xmousewin = window; + in_a_window = true; + fl_dnd_source_window = data[0]; + // version number is data[1]>>24 +// printf("XdndEnter, version %ld\n", data[1] >> 24); + if (data[1]&1) { + // get list of data types: + Atom actual; int format; unsigned long count, remaining; + unsigned char *buffer = 0; + XGetWindowProperty(fl_display, fl_dnd_source_window, fl_XdndTypeList, + 0, 0x8000000L, False, XA_ATOM, &actual, &format, + &count, &remaining, &buffer); + if (actual != XA_ATOM || format != 32 || count<4 || !buffer) + goto FAILED; + delete [] fl_dnd_source_types; + fl_dnd_source_types = new Atom[count+1]; + for (unsigned i = 0; i < count; i++) + fl_dnd_source_types[i] = ((Atom*)buffer)[i]; + fl_dnd_source_types[count] = 0; + } else { + FAILED: + // less than four data types, or if the above messes up: + if (!fl_dnd_source_types) fl_dnd_source_types = new Atom[4]; + fl_dnd_source_types[0] = data[2]; + fl_dnd_source_types[1] = data[3]; + fl_dnd_source_types[2] = data[4]; + fl_dnd_source_types[3] = 0; + } + + // Loop through the source types and pick the first text type... + int i; + + for (i = 0; fl_dnd_source_types[i]; i ++) + { +// printf("fl_dnd_source_types[%d] = %ld (%s)\n", i, +// fl_dnd_source_types[i], +// XGetAtomName(fl_display, fl_dnd_source_types[i])); + + if (!strncmp(XGetAtomName(fl_display, fl_dnd_source_types[i]), + "text/", 5)) + break; + } + + if (fl_dnd_source_types[i]) + fl_dnd_type = fl_dnd_source_types[i]; + else + fl_dnd_type = fl_dnd_source_types[0]; + + event = FL_DND_ENTER; + Fl::e_text = unknown; + Fl::e_length = unknown_len; + break; + + } else if (message == fl_XdndPosition) { + fl_xmousewin = window; + in_a_window = true; + fl_dnd_source_window = data[0]; + Fl::e_x_root = data[2]>>16; + Fl::e_y_root = data[2]&0xFFFF; + if (window) { + Fl::e_x = Fl::e_x_root-window->x(); + Fl::e_y = Fl::e_y_root-window->y(); + } + fl_event_time = data[3]; + fl_dnd_source_action = data[4]; + fl_dnd_action = fl_XdndActionCopy; + Fl::e_text = unknown; + Fl::e_length = unknown_len; + int accept = Fl::handle(FL_DND_DRAG, window); + fl_sendClientMessage(data[0], fl_XdndStatus, + fl_xevent->xclient.window, + accept ? 1 : 0, + 0, // used for xy rectangle to not send position inside + 0, // used for width+height of rectangle + accept ? fl_dnd_action : None); + return 1; + + } else if (message == fl_XdndLeave) { + fl_dnd_source_window = 0; // don't send a finished message to it + event = FL_DND_LEAVE; + Fl::e_text = unknown; + Fl::e_length = unknown_len; + break; + + } else if (message == fl_XdndDrop) { + fl_xmousewin = window; + in_a_window = true; + fl_dnd_source_window = data[0]; + fl_event_time = data[2]; + Window to_window = fl_xevent->xclient.window; + Fl::e_text = unknown; + Fl::e_length = unknown_len; + if (Fl::handle(FL_DND_RELEASE, window)) { + fl_selection_requestor = Fl::belowmouse(); + XConvertSelection(fl_display, fl_XdndSelection, + fl_dnd_type, XA_SECONDARY, + to_window, fl_event_time); + } else { + // Send the finished message if I refuse the drop. + // It is not clear whether I can just send finished always, + // or if I have to wait for the SelectionNotify event as the + // code is currently doing. + fl_sendClientMessage(fl_dnd_source_window, fl_XdndFinished, to_window); + fl_dnd_source_window = 0; + } + return 1; + + } + break;} + + case UnmapNotify: + event = FL_HIDE; + break; + + case Expose: + Fl_X::i(window)->wait_for_expose = 0; +# if 0 + // try to keep windows on top even if WM_TRANSIENT_FOR does not work: + // opaque move/resize window managers do not like this, so I disabled it. + if (Fl::first_window()->non_modal() && window != Fl::first_window()) + Fl::first_window()->show(); +# endif + + case GraphicsExpose: + window->damage(FL_DAMAGE_EXPOSE, xevent.xexpose.x, xevent.xexpose.y, + xevent.xexpose.width, xevent.xexpose.height); + return 1; + + case FocusIn: + event = FL_FOCUS; + break; + + case FocusOut: + event = FL_UNFOCUS; + break; + + case KeyPress: + case KeyRelease: { + KEYPRESS: + int keycode = xevent.xkey.keycode; + fl_key_vector[keycode/8] |= (1 << (keycode%8)); + static char buffer[21]; + int len; + KeySym keysym; + if (xevent.type == KeyPress) { + event = FL_KEYDOWN; + //static XComposeStatus compose; + len = XLookupString((XKeyEvent*)&(xevent.xkey), + buffer, 20, &keysym, 0/*&compose*/); + if (keysym && keysym < 0x400) { // a character in latin-1,2,3,4 sets + // force it to type a character (not sure if this ever is needed): + if (!len) {buffer[0] = char(keysym); len = 1;} + // ignore all effects of shift on the keysyms, which makes it a lot + // easier to program shortcuts and is Windoze-compatable: + keysym = XKeycodeToKeysym(fl_display, keycode, 0); + } + // MRS: Can't use Fl::event_state(FL_CTRL) since the state is not + // set until set_event_xy() is called later... + if ((xevent.xkey.state & ControlMask) && keysym == '-') buffer[0] = 0x1f; // ^_ + buffer[len] = 0; + Fl::e_text = buffer; + Fl::e_length = len; + } else { + // Stupid X sends fake key-up events when a repeating key is held + // down, probably due to some back compatability problem. Fortunately + // we can detect this because the repeating KeyPress event is in + // the queue, get it and execute it instead: + XEvent temp; + if (XCheckIfEvent(fl_display,&temp,fake_keyup_test,(char*)(&xevent))){ + xevent = temp; + goto KEYPRESS; + } + event = FL_KEYUP; + fl_key_vector[keycode/8] &= ~(1 << (keycode%8)); + // keyup events just get the unshifted keysym: + keysym = XKeycodeToKeysym(fl_display, keycode, 0); + } +# ifdef __sgi + // You can plug a microsoft keyboard into an sgi but the extra shift + // keys are not translated. Make them translate like XFree86 does: + if (!keysym) switch(keycode) { + case 147: keysym = FL_Meta_L; break; + case 148: keysym = FL_Meta_R; break; + case 149: keysym = FL_Menu; break; + } +# endif +# if BACKSPACE_HACK + // Attempt to fix keyboards that send "delete" for the key in the + // upper-right corner of the main keyboard. But it appears that + // very few of these remain? + static int got_backspace; + if (!got_backspace) { + if (keysym == FL_Delete) keysym = FL_BackSpace; + else if (keysym == FL_BackSpace) got_backspace = 1; + } +# endif + // We have to get rid of the XK_KP_function keys, because they are + // not produced on Windoze and thus case statements tend not to check + // for them. There are 15 of these in the range 0xff91 ... 0xff9f + if (keysym >= 0xff91 && keysym <= 0xff9f) { + // Map keypad keysym to character or keysym depending on + // numlock state... + unsigned long keysym1 = XKeycodeToKeysym(fl_display, keycode, 1); + if (keysym1 <= 0x7f || (keysym1 > 0xff9f && keysym1 <= FL_KP_Last)) + Fl::e_original_keysym = (int)(keysym1 | FL_KP); + if ((xevent.xkey.state & Mod2Mask) && + (keysym1 <= 0x7f || (keysym1 > 0xff9f && keysym1 <= FL_KP_Last))) { + // Store ASCII numeric keypad value... + keysym = keysym1 | FL_KP; + buffer[0] = char(keysym1) & 0x7F; + len = 1; + } else { + // Map keypad to special key... + static const unsigned short table[15] = { + FL_F+1, FL_F+2, FL_F+3, FL_F+4, + FL_Home, FL_Left, FL_Up, FL_Right, + FL_Down, FL_Page_Up, FL_Page_Down, FL_End, + 0xff0b/*XK_Clear*/, FL_Insert, FL_Delete}; + keysym = table[keysym-0xff91]; + } + } else { + // Store this so we can later know if the KP was used + Fl::e_original_keysym = (int)keysym; + } + Fl::e_keysym = int(keysym); + set_event_xy(); + Fl::e_is_click = 0; + break;} + + case ButtonPress: + Fl::e_keysym = FL_Button + xevent.xbutton.button; + set_event_xy(); + if (xevent.xbutton.button == Button4) { + Fl::e_dy = -1; // Up + event = FL_MOUSEWHEEL; + } else if (xevent.xbutton.button == Button5) { + Fl::e_dy = +1; // Down + event = FL_MOUSEWHEEL; + } else { + Fl::e_state |= (FL_BUTTON1 << (xevent.xbutton.button-1)); + event = FL_PUSH; + checkdouble(); + } + + fl_xmousewin = window; + in_a_window = true; + break; + + case MotionNotify: + set_event_xy(); +# if CONSOLIDATE_MOTION + send_motion = fl_xmousewin = window; + in_a_window = true; + return 0; +# else + event = FL_MOVE; + fl_xmousewin = window; + in_a_window = true; + break; +# endif + + case ButtonRelease: + Fl::e_keysym = FL_Button + xevent.xbutton.button; + set_event_xy(); + Fl::e_state &= ~(FL_BUTTON1 << (xevent.xbutton.button-1)); + if (xevent.xbutton.button == Button4 || + xevent.xbutton.button == Button5) return 0; + event = FL_RELEASE; + + fl_xmousewin = window; + in_a_window = true; + break; + + case EnterNotify: + if (xevent.xcrossing.detail == NotifyInferior) break; + // XInstallColormap(fl_display, Fl_X::i(window)->colormap); + set_event_xy(); + Fl::e_state = xevent.xcrossing.state << 16; + event = FL_ENTER; + + fl_xmousewin = window; + in_a_window = true; + break; + + case LeaveNotify: + if (xevent.xcrossing.detail == NotifyInferior) break; + set_event_xy(); + Fl::e_state = xevent.xcrossing.state << 16; + fl_xmousewin = 0; + in_a_window = false; // make do_queued_events produce FL_LEAVE event + return 0; + + // We cannot rely on the x,y position in the configure notify event. + // I now think this is an unavoidable problem with X: it is impossible + // for a window manager to prevent the "real" notify event from being + // sent when it resizes the contents, even though it can send an + // artificial event with the correct position afterwards (and some + // window managers do not send this fake event anyway) + // So anyway, do a round trip to find the correct x,y: + case MapNotify: + event = FL_SHOW; + + case ConfigureNotify: { + if (window->parent()) break; // ignore child windows + + // figure out where OS really put window + XWindowAttributes actual; + XGetWindowAttributes(fl_display, fl_xid(window), &actual); + Window cr; int X, Y, W = actual.width, H = actual.height; + XTranslateCoordinates(fl_display, fl_xid(window), actual.root, + 0, 0, &X, &Y, &cr); + + // tell Fl_Window about it and set flag to prevent echoing: + resize_bug_fix = window; + window->resize(X, Y, W, H); + break; // allow add_handler to do something too + } + + case ReparentNotify: { + int xpos, ypos; + Window junk; + + //ReparentNotify gives the new position of the window relative to + //the new parent. FLTK cares about the position on the root window. + XTranslateCoordinates(fl_display, xevent.xreparent.parent, + XRootWindow(fl_display, fl_screen), + xevent.xreparent.x, xevent.xreparent.y, + &xpos, &ypos, &junk); + + // tell Fl_Window about it and set flag to prevent echoing: + resize_bug_fix = window; + window->position(xpos, ypos); + break; + } + } + + return Fl::handle(event, window); +} + +//////////////////////////////////////////////////////////////// + +void Fl_Window::resize(int X,int Y,int W,int H) { + int is_a_move = (X != x() || Y != y()); + int is_a_resize = (W != w() || H != h()); + int resize_from_program = (this != resize_bug_fix); + if (!resize_from_program) resize_bug_fix = 0; + if (is_a_move && resize_from_program) set_flag(FL_FORCE_POSITION); + else if (!is_a_resize && !is_a_move) return; + if (is_a_resize) { + Fl_Group::resize(X,Y,W,H); + if (shown()) {redraw(); i->wait_for_expose = 1;} + } else { + x(X); y(Y); + } + + if (resize_from_program && is_a_resize && !resizable()) { + size_range(w(), h(), w(), h()); + } + + if (resize_from_program && shown()) { + if (is_a_resize) { + if (!resizable()) size_range(w(),h(),w(),h()); + if (is_a_move) { + XMoveResizeWindow(fl_display, i->xid, X, Y, W>0 ? W : 1, H>0 ? H : 1); + } else { + XResizeWindow(fl_display, i->xid, W>0 ? W : 1, H>0 ? H : 1); + } + } else + XMoveWindow(fl_display, i->xid, X, Y); + } +} + +//////////////////////////////////////////////////////////////// + +// A subclass of Fl_Window may call this to associate an X window it +// creates with the Fl_Window: + +void fl_fix_focus(); // in Fl.cxx + +Fl_X* Fl_X::set_xid(Fl_Window* win, Window winxid) { + Fl_X* xp = new Fl_X; + xp->xid = winxid; + xp->other_xid = 0; + xp->setwindow(win); + xp->next = Fl_X::first; + xp->region = 0; + xp->wait_for_expose = 1; + xp->backbuffer_bad = 1; + Fl_X::first = xp; + if (win->modal()) {Fl::modal_ = win; fl_fix_focus();} + return xp; +} + +// More commonly a subclass calls this, because it hides the really +// ugly parts of X and sets all the stuff for a window that is set +// normally. The global variables like fl_show_iconic are so that +// subclasses of *that* class may change the behavior... + +char fl_show_iconic; // hack for iconize() +int fl_background_pixel = -1; // hack to speed up bg box drawing +int fl_disable_transient_for; // secret method of removing TRANSIENT_FOR + +static const int childEventMask = ExposureMask; + +static const int XEventMask = +ExposureMask|StructureNotifyMask +|KeyPressMask|KeyReleaseMask|KeymapStateMask|FocusChangeMask +|ButtonPressMask|ButtonReleaseMask +|EnterWindowMask|LeaveWindowMask +|PointerMotionMask; + +void Fl_X::make_xid(Fl_Window* win, XVisualInfo *visual, Colormap colormap) +{ + Fl_Group::current(0); // get rid of very common user bug: forgot end() + + int X = win->x(); + int Y = win->y(); + int W = win->w(); + if (W <= 0) W = 1; // X don't like zero... + int H = win->h(); + if (H <= 0) H = 1; // X don't like zero... + if (!win->parent() && !Fl::grab()) { + // center windows in case window manager does not do anything: +#ifdef FL_CENTER_WINDOWS + if (!(win->flags() & Fl_Window::FL_FORCE_POSITION)) { + win->x(X = scr_x+(scr_w-W)/2); + win->y(Y = scr_y+(scr_h-H)/2); + } +#endif // FL_CENTER_WINDOWS + + // force the window to be on-screen. Usually the X window manager + // does this, but a few don't, so we do it here for consistency: + int scr_x, scr_y, scr_w, scr_h; + Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h, X, Y); + + if (win->border()) { + // ensure border is on screen: + // (assumme extremely minimal dimensions for this border) + const int top = 20; + const int left = 1; + const int right = 1; + const int bottom = 1; + if (X+W+right > scr_x+scr_w) X = scr_x+scr_w-right-W; + if (X-left < scr_x) X = scr_x+left; + if (Y+H+bottom > scr_y+scr_h) Y = scr_y+scr_h-bottom-H; + if (Y-top < scr_y) Y = scr_y+top; + } + // now insure contents are on-screen (more important than border): + if (X+W > scr_x+scr_w) X = scr_x+scr_w-W; + if (X < scr_x) X = scr_x; + if (Y+H > scr_y+scr_h) Y = scr_y+scr_h-H; + if (Y < scr_y) Y = scr_y; + } + + // if the window is a subwindow and our parent is not mapped yet, we + // mark this window visible, so that mapping the parent at a later + // point in time will call this function again to finally map the subwindow. + if (win->parent() && !Fl_X::i(win->window())) { + win->set_visible(); + return; + } + + ulong root = win->parent() ? + fl_xid(win->window()) : RootWindow(fl_display, fl_screen); + + XSetWindowAttributes attr; + int mask = CWBorderPixel|CWColormap|CWEventMask|CWBitGravity; + attr.event_mask = win->parent() ? childEventMask : XEventMask; + attr.colormap = colormap; + attr.border_pixel = 0; + attr.bit_gravity = 0; // StaticGravity; + if (win->override()) { + attr.override_redirect = 1; + attr.save_under = 1; + mask |= CWOverrideRedirect | CWSaveUnder; + } else attr.override_redirect = 0; + if (Fl::grab()) { + attr.save_under = 1; mask |= CWSaveUnder; + if (!win->border()) {attr.override_redirect = 1; mask |= CWOverrideRedirect;} + } + if (fl_background_pixel >= 0) { + attr.background_pixel = fl_background_pixel; + fl_background_pixel = -1; + mask |= CWBackPixel; + } + + Fl_X* xp = + set_xid(win, XCreateWindow(fl_display, + root, + X, Y, W, H, + 0, // borderwidth + visual->depth, + InputOutput, + visual->visual, + mask, &attr)); + int showit = 1; + + if (!win->parent() && !attr.override_redirect) { + // Communicate all kinds 'o junk to the X Window Manager: + + win->label(win->label(), win->iconlabel()); + + XChangeProperty(fl_display, xp->xid, WM_PROTOCOLS, + XA_ATOM, 32, 0, (uchar*)&WM_DELETE_WINDOW, 1); + + // send size limits and border: + xp->sendxjunk(); + + // set the class property, which controls the icon used: + if (win->xclass()) { + char buffer[1024]; + char *p; const char *q; + // truncate on any punctuation, because they break XResource lookup: + for (p = buffer, q = win->xclass(); isalnum(*q)||(*q&128);) *p++ = *q++; + *p++ = 0; + // create the capitalized version: + q = buffer; + *p = toupper(*q++); if (*p++ == 'X') *p++ = toupper(*q++); + while ((*p++ = *q++)); + XChangeProperty(fl_display, xp->xid, XA_WM_CLASS, XA_STRING, 8, 0, + (unsigned char *)buffer, p-buffer-1); + } + + if (win->non_modal() && xp->next && !fl_disable_transient_for) { + // find some other window to be "transient for": + Fl_Window* wp = xp->next->w; + while (wp->parent()) wp = wp->window(); + XSetTransientForHint(fl_display, xp->xid, fl_xid(wp)); + if (!wp->visible()) showit = 0; // guess that wm will not show it + } + + // Make sure that borderless windows do not show in the task bar + if (!win->border()) { + Atom net_wm_state = XInternAtom (fl_display, "_NET_WM_STATE", 0); + Atom net_wm_state_skip_taskbar = XInternAtom (fl_display, "_NET_WM_STATE_SKIP_TASKBAR", 0); + XChangeProperty (fl_display, xp->xid, net_wm_state, XA_ATOM, 32, + PropModeAppend, (unsigned char*) &net_wm_state_skip_taskbar, 1); + } + + // Make it receptive to DnD: + long version = 4; + XChangeProperty(fl_display, xp->xid, fl_XdndAware, + XA_ATOM, sizeof(int)*8, 0, (unsigned char*)&version, 1); + + XWMHints *hints = XAllocWMHints(); + hints->input = True; + hints->flags = InputHint; + if (fl_show_iconic) { + hints->flags |= StateHint; + hints->initial_state = IconicState; + fl_show_iconic = 0; + showit = 0; + } + if (win->icon()) { + hints->icon_pixmap = (Pixmap)win->icon(); + hints->flags |= IconPixmapHint; + } + XSetWMHints(fl_display, xp->xid, hints); + XFree(hints); + } + + XMapWindow(fl_display, xp->xid); + if (showit) { + win->set_visible(); + int old_event = Fl::e_number; + win->handle(Fl::e_number = FL_SHOW); // get child windows to appear + Fl::e_number = old_event; + win->redraw(); + } +} + +//////////////////////////////////////////////////////////////// +// Send X window stuff that can be changed over time: + +void Fl_X::sendxjunk() { + if (w->parent() || w->override()) return; // it's not a window manager window! + + if (!w->size_range_set) { // default size_range based on resizable(): + if (w->resizable()) { + Fl_Widget *o = w->resizable(); + int minw = o->w(); if (minw > 100) minw = 100; + int minh = o->h(); if (minh > 100) minh = 100; + w->size_range(w->w() - o->w() + minw, w->h() - o->h() + minh, 0, 0); + } else { + w->size_range(w->w(), w->h(), w->w(), w->h()); + } + return; // because this recursively called here + } + + XSizeHints *hints = XAllocSizeHints(); + // memset(&hints, 0, sizeof(hints)); jreiser suggestion to fix purify? + hints->min_width = w->minw; + hints->min_height = w->minh; + hints->max_width = w->maxw; + hints->max_height = w->maxh; + hints->width_inc = w->dw; + hints->height_inc = w->dh; + hints->win_gravity = StaticGravity; + + // see the file /usr/include/X11/Xm/MwmUtil.h: + // fill all fields to avoid bugs in kwm and perhaps other window managers: + // 0, MWM_FUNC_ALL, MWM_DECOR_ALL + long prop[5] = {0, 1, 1, 0, 0}; + + if (hints->min_width != hints->max_width || + hints->min_height != hints->max_height) { // resizable + hints->flags = PMinSize|PWinGravity; + if (hints->max_width >= hints->min_width || + hints->max_height >= hints->min_height) { + hints->flags = PMinSize|PMaxSize|PWinGravity; + // unfortunately we can't set just one maximum size. Guess a + // value for the other one. Some window managers will make the + // window fit on screen when maximized, others will put it off screen: + if (hints->max_width < hints->min_width) hints->max_width = Fl::w(); + if (hints->max_height < hints->min_height) hints->max_height = Fl::h(); + } + if (hints->width_inc && hints->height_inc) hints->flags |= PResizeInc; + if (w->aspect) { + // stupid X! It could insist that the corner go on the + // straight line between min and max... + hints->min_aspect.x = hints->max_aspect.x = hints->min_width; + hints->min_aspect.y = hints->max_aspect.y = hints->min_height; + hints->flags |= PAspect; + } + } else { // not resizable: + hints->flags = PMinSize|PMaxSize|PWinGravity; + prop[0] = 1; // MWM_HINTS_FUNCTIONS + prop[1] = 1|2|16; // MWM_FUNC_ALL | MWM_FUNC_RESIZE | MWM_FUNC_MAXIMIZE + } + + if (w->flags() & Fl_Window::FL_FORCE_POSITION) { + hints->flags |= USPosition; + hints->x = w->x(); + hints->y = w->y(); + } + + if (!w->border()) { + prop[0] |= 2; // MWM_HINTS_DECORATIONS + prop[2] = 0; // no decorations + } + + XSetWMNormalHints(fl_display, xid, hints); + XChangeProperty(fl_display, xid, + fl_MOTIF_WM_HINTS, fl_MOTIF_WM_HINTS, + 32, 0, (unsigned char *)prop, 5); + XFree(hints); +} + +void Fl_Window::size_range_() { + size_range_set = 1; + if (shown()) i->sendxjunk(); +} + +//////////////////////////////////////////////////////////////// + +// returns pointer to the filename, or null if name ends with '/' +const char *fl_filename_name(const char *name) { + const char *p,*q; + if (!name) return (0); + for (p=q=name; *p;) if (*p++ == '/') q = p; + return q; +} + +void Fl_Window::label(const char *name,const char *iname) { + Fl_Widget::label(name); + iconlabel_ = iname; + if (shown() && !parent()) { + if (!name) name = ""; + XChangeProperty(fl_display, i->xid, XA_WM_NAME, + XA_STRING, 8, 0, (uchar*)name, strlen(name)); + if (!iname) iname = fl_filename_name(name); + XChangeProperty(fl_display, i->xid, XA_WM_ICON_NAME, + XA_STRING, 8, 0, (uchar*)iname, strlen(iname)); + } +} + +//////////////////////////////////////////////////////////////// +// Implement the virtual functions for the base Fl_Window class: + +// If the box is a filled rectangle, we can make the redisplay *look* +// faster by using X's background pixel erasing. We can make it +// actually *be* faster by drawing the frame only, this is done by +// setting fl_boxcheat, which is seen by code in fl_drawbox.cxx: +// +// On XFree86 (and prehaps all X's) this has a problem if the window +// is resized while a save-behind window is atop it. The previous +// contents are restored to the area, but this assummes the area +// is cleared to background color. So this is disabled in this version. +// Fl_Window *fl_boxcheat; +static inline int can_boxcheat(uchar b) {return (b==1 || (b&2) && b<=15);} + +void Fl_Window::show() { + image(Fl::scheme_bg_); + if (Fl::scheme_bg_) { + labeltype(FL_NORMAL_LABEL); + align(FL_ALIGN_CENTER | FL_ALIGN_INSIDE | FL_ALIGN_CLIP); + } else { + labeltype(FL_NO_LABEL); + } + Fl_Tooltip::exit(this); + if (!shown()) { + fl_open_display(); + // Don't set background pixel for double-buffered windows... + if (type() == FL_WINDOW && can_boxcheat(box())) { + fl_background_pixel = int(fl_xpixel(color())); + } + Fl_X::make_xid(this); + } else { + XMapRaised(fl_display, i->xid); + } +} + +Window fl_window; +Fl_Window *Fl_Window::current_; +GC fl_gc; + +// make X drawing go into this window (called by subclass flush() impl.) +void Fl_Window::make_current() { + static GC gc; // the GC used by all X windows + if (!gc) gc = XCreateGC(fl_display, i->xid, 0, 0); + fl_window = i->xid; + fl_gc = gc; + current_ = this; + fl_clip_region(0); +} + +#endif + +// +// End of "$Id: Fl_x.cxx 5914 2007-06-18 13:08:57Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/Makefile b/third_party/windows/fltk-1.1.10/src/Makefile new file mode 100644 index 0000000..c9c7556 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Makefile @@ -0,0 +1,726 @@ +# +# "$Id: Makefile 6817 2009-07-02 09:42:17Z AlbrechtS $" +# +# Library makefile for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2009 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems on the following page: +# +# http://www.fltk.org/str.php +# + +CPPFILES = \ + Fl.cxx \ + Fl_Adjuster.cxx \ + Fl_Bitmap.cxx \ + Fl_Browser.cxx \ + Fl_Browser_.cxx \ + Fl_Browser_load.cxx \ + Fl_Box.cxx \ + Fl_Button.cxx \ + Fl_Chart.cxx \ + Fl_Check_Browser.cxx \ + Fl_Check_Button.cxx \ + Fl_Choice.cxx \ + Fl_Clock.cxx \ + Fl_Color_Chooser.cxx \ + Fl_Counter.cxx \ + Fl_Dial.cxx \ + Fl_Double_Window.cxx \ + Fl_File_Browser.cxx \ + Fl_File_Chooser.cxx \ + Fl_File_Chooser2.cxx \ + Fl_File_Icon.cxx \ + Fl_File_Input.cxx \ + Fl_Group.cxx \ + Fl_Help_View.cxx \ + Fl_Image.cxx \ + Fl_Input.cxx \ + Fl_Input_.cxx \ + Fl_Light_Button.cxx \ + Fl_Menu.cxx \ + Fl_Menu_.cxx \ + Fl_Menu_Bar.cxx \ + Fl_Sys_Menu_Bar.cxx \ + Fl_Menu_Button.cxx \ + Fl_Menu_Window.cxx \ + Fl_Menu_add.cxx \ + Fl_Menu_global.cxx \ + Fl_Multi_Label.cxx \ + Fl_Overlay_Window.cxx \ + Fl_Pack.cxx \ + Fl_Pixmap.cxx \ + Fl_Positioner.cxx \ + Fl_Preferences.cxx \ + Fl_Progress.cxx \ + Fl_Repeat_Button.cxx \ + Fl_Return_Button.cxx \ + Fl_Roller.cxx \ + Fl_Round_Button.cxx \ + Fl_Scroll.cxx \ + Fl_Scrollbar.cxx \ + Fl_Shared_Image.cxx \ + Fl_Single_Window.cxx \ + Fl_Slider.cxx \ + Fl_Tabs.cxx \ + Fl_Text_Buffer.cxx \ + Fl_Text_Display.cxx \ + Fl_Text_Editor.cxx \ + Fl_Tile.cxx \ + Fl_Tiled_Image.cxx \ + Fl_Tooltip.cxx \ + Fl_Valuator.cxx \ + Fl_Value_Input.cxx \ + Fl_Value_Output.cxx \ + Fl_Value_Slider.cxx \ + Fl_Widget.cxx \ + Fl_Window.cxx \ + Fl_Window_fullscreen.cxx \ + Fl_Window_hotspot.cxx \ + Fl_Window_iconize.cxx \ + Fl_Wizard.cxx \ + Fl_XBM_Image.cxx \ + Fl_XPM_Image.cxx \ + Fl_abort.cxx \ + Fl_add_idle.cxx \ + Fl_arg.cxx \ + Fl_compose.cxx \ + Fl_display.cxx \ + Fl_get_key.cxx \ + Fl_get_system_colors.cxx \ + Fl_grab.cxx \ + Fl_lock.cxx \ + Fl_own_colormap.cxx \ + Fl_visual.cxx \ + Fl_x.cxx \ + filename_absolute.cxx \ + filename_expand.cxx \ + filename_ext.cxx \ + filename_isdir.cxx \ + filename_list.cxx \ + filename_match.cxx \ + filename_setext.cxx \ + fl_arc.cxx \ + fl_arci.cxx \ + fl_ask.cxx \ + fl_boxtype.cxx \ + fl_color.cxx \ + fl_cursor.cxx \ + fl_curve.cxx \ + fl_diamond_box.cxx \ + fl_dnd.cxx \ + fl_draw.cxx \ + fl_draw_image.cxx \ + fl_draw_pixmap.cxx \ + fl_encoding_latin1.cxx \ + fl_encoding_mac_roman.cxx \ + fl_engraved_label.cxx \ + fl_file_dir.cxx \ + fl_font.cxx \ + fl_gtk.cxx \ + fl_labeltype.cxx \ + fl_line_style.cxx \ + fl_open_uri.cxx \ + fl_oval_box.cxx \ + fl_overlay.cxx \ + fl_overlay_visual.cxx \ + fl_plastic.cxx \ + fl_read_image.cxx \ + fl_rect.cxx \ + fl_round_box.cxx \ + fl_rounded_box.cxx \ + fl_set_font.cxx \ + fl_set_fonts.cxx \ + fl_scroll_area.cxx \ + fl_shadow_box.cxx \ + fl_shortcut.cxx \ + fl_show_colormap.cxx \ + fl_symbols.cxx \ + fl_vertex.cxx \ + screen_xywh.cxx + +FLCPPFILES = \ + forms_compatability.cxx \ + forms_bitmap.cxx \ + forms_free.cxx \ + forms_fselect.cxx \ + forms_pixmap.cxx \ + forms_timer.cxx + +GLCPPFILES = \ + Fl_Gl_Choice.cxx \ + Fl_Gl_Overlay.cxx \ + Fl_Gl_Window.cxx \ + freeglut_geometry.cxx \ + freeglut_stroke_mono_roman.cxx \ + freeglut_stroke_roman.cxx \ + freeglut_teapot.cxx \ + gl_draw.cxx \ + gl_start.cxx \ + glut_compatability.cxx \ + glut_font.cxx + +IMGCPPFILES = \ + fl_images_core.cxx \ + Fl_BMP_Image.cxx \ + Fl_File_Icon2.cxx \ + Fl_GIF_Image.cxx \ + Fl_Help_Dialog.cxx \ + Fl_JPEG_Image.cxx \ + Fl_PNG_Image.cxx \ + Fl_PNM_Image.cxx + +CFILES = fl_call_main.c flstring.c scandir.c numericsort.c vsnprintf.c + +################################################################ + +include ../makeinclude + +OBJECTS = $(CPPFILES:.cxx=.o) $(CFILES:.c=.o) +GLOBJECTS = $(GLCPPFILES:.cxx=.o) +FLOBJECTS = $(FLCPPFILES:.cxx=.o) +IMGOBJECTS = $(IMGCPPFILES:.cxx=.o) + +all: $(LIBNAME) $(DSONAME) \ + $(FLLIBNAME) $(FLDSONAME) \ + $(GLLIBNAME) $(GLDSONAME) \ + $(IMGLIBNAME) $(IMGDSONAME) + +$(LIBNAME): $(OBJECTS) + echo $(LIBCOMMAND) $@ ... + $(RM) $@ + $(LIBCOMMAND) $@ $(OBJECTS) + $(RANLIB) $@ + +libfltk.so.1.1: $(OBJECTS) + echo $(DSOCOMMAND) $@ ... + $(DSOCOMMAND) $@ $(OBJECTS) + $(RM) libfltk.so + $(LN) libfltk.so.1.1 libfltk.so + +libfltk.sl.1.1: $(OBJECTS) + echo $(DSOCOMMAND) $@ ... + $(DSOCOMMAND) $@ $(OBJECTS) + $(RM) libfltk.sl + $(LN) libfltk.sl.1.1 libfltk.sl + +libfltk.1.1.dylib: $(OBJECTS) + echo $(DSOCOMMAND) $@ ... + $(DSOCOMMAND) $@ \ + -install_name $(libdir)/$@ \ + -current_version 1.1.4 \ + -compatibility_version 1.1.0 \ + $(OBJECTS) $(LDLIBS) + $(RM) libfltk.dylib + $(LN) libfltk.1.1.dylib libfltk.dylib + +libfltk_s.a: $(OBJECTS) + echo $(DSOCOMMAND) libfltk_s.o ... + $(DSOCOMMAND) libfltk_s.o $(OBJECTS) $(IMAGELIBS) + echo $(LIBCOMMAND) libfltk_s.a libfltk_s.o + $(RM) $@ + $(LIBCOMMAND) libfltk_s.a libfltk_s.o + $(CHMOD) +x libfltk_s.a + +$(FLLIBNAME): $(FLOBJECTS) + echo $(LIBCOMMAND) $@ ... + $(RM) $@ + $(LIBCOMMAND) $@ $(FLOBJECTS) + $(RANLIB) $@ + +libfltk_forms.so.1.1: $(FLOBJECTS) libfltk.so.1.1 + echo $(DSOCOMMAND) $@ ... + $(DSOCOMMAND) $@ $(FLOBJECTS) -L. -lfltk + $(RM) libfltk_forms.so + $(LN) libfltk_forms.so.1.1 libfltk_forms.so + +libfltk_forms.sl.1.1: $(FLOBJECTS) libfltk.sl.1.1 + echo $(DSOCOMMAND) $@ ... + $(DSOCOMMAND) $@ $(FLOBJECTS) -L. -lfltk + $(RM) libfltk_forms.sl + $(LN) libfltk_forms.sl.1.1 libfltk_forms.sl + +libfltk_forms.1.1.dylib: $(FLOBJECTS) libfltk.1.1.dylib + echo $(DSOCOMMAND) $@ ... + $(DSOCOMMAND) $@ \ + -install_name $(libdir)/$@ \ + -current_version 1.1.4 \ + -compatibility_version 1.1.0 \ + $(FLOBJECTS) -L. $(LDLIBS) -lfltk + $(RM) libfltk_forms.dylib + $(LN) libfltk_forms.1.1.dylib libfltk_forms.dylib + +libfltk_forms_s.a: $(FLOBJECTS) + echo $(DSOCOMMAND) libfltk_forms_s.o ... + $(DSOCOMMAND) libfltk_forms_s.o $(FLOBJECTS) + echo $(LIBCOMMAND) libfltk_forms_s.a libfltk_forms_s.o + $(RM) $@ + $(LIBCOMMAND) libfltk_forms_s.a libfltk_forms_s.o + $(CHMOD) +x libfltk_forms_s.a + +$(GLLIBNAME): $(GLOBJECTS) + echo $(LIBCOMMAND) $@ ... + $(RM) $@ + $(LIBCOMMAND) $@ $(GLOBJECTS) + $(RANLIB) $@ + +libfltk_gl.so.1.1: $(GLOBJECTS) libfltk.so.1.1 + echo $(DSOCOMMAND) $@ ... + $(DSOCOMMAND) $@ $(GLOBJECTS) -L. -lfltk + $(RM) libfltk_gl.so + $(LN) libfltk_gl.so.1.1 libfltk_gl.so + +libfltk_gl.sl.1.1: $(GLOBJECTS) libfltk.sl.1.1 + echo $(DSOCOMMAND) $@ ... + $(DSOCOMMAND) $@ $(GLOBJECTS) -L. -lfltk + $(RM) libfltk_gl.sl + $(LN) libfltk_gl.sl.1.1 libfltk_gl.sl + +libfltk_gl.1.1.dylib: $(GLOBJECTS) libfltk.1.1.dylib + echo $(DSOCOMMAND) $@ ... + $(DSOCOMMAND) $@ \ + -install_name $(libdir)/$@ \ + -current_version 1.1.4 \ + -compatibility_version 1.1.0 \ + $(GLOBJECTS) -L. $(GLDLIBS) -lfltk + $(RM) libfltk_gl.dylib + $(LN) libfltk_gl.1.1.dylib libfltk_gl.dylib + +libfltk_gl_s.a: $(GLOBJECTS) + echo $(DSOCOMMAND) libfltk_gl_s.o ... + $(DSOCOMMAND) libfltk_gl_s.o $(GLOBJECTS) + echo $(LIBCOMMAND) libfltk_gl_s.a libfltk_gl_s.o + $(RM) $@ + $(LIBCOMMAND) libfltk_gl_s.a libfltk_gl_s.o + $(CHMOD) +x libfltk_gl_s.a + +$(IMGLIBNAME): $(IMGOBJECTS) + echo $(LIBCOMMAND) $@ ... + $(RM) $@ + $(LIBCOMMAND) $@ $(IMGOBJECTS) + $(RANLIB) $@ + +libfltk_images.so.1.1: $(IMGOBJECTS) libfltk.so.1.1 + echo $(DSOCOMMAND) $@ ... + $(DSOCOMMAND) $@ $(IMGOBJECTS) -L. $(IMAGELIBS) -lfltk + $(RM) libfltk_images.so + $(LN) libfltk_images.so.1.1 libfltk_images.so + +libfltk_images.sl.1.1: $(IMGOBJECTS) libfltk.sl.1.1 + echo $(DSOCOMMAND) $@ ... + $(DSOCOMMAND) $@ $(IMGOBJECTS) -L. $(IMAGELIBS) -lfltk + $(RM) libfltk_images.sl + $(LN) libfltk_images.sl.1.1 libfltk_images.sl + +libfltk_images.1.1.dylib: $(IMGOBJECTS) libfltk.1.1.dylib + echo $(DSOCOMMAND) $@ ... + $(DSOCOMMAND) $@ \ + -install_name $(libdir)/$@ \ + -current_version 1.1.4 \ + -compatibility_version 1.1.0 \ + $(IMGOBJECTS) -L. $(LDLIBS) $(IMAGELIBS) -lfltk + $(RM) libfltk_images.dylib + $(LN) libfltk_images.1.1.dylib libfltk_images.dylib + +libfltk_images_s.a: $(IMGOBJECTS) + echo $(DSOCOMMAND) libfltk_images_s.o ... + $(DSOCOMMAND) libfltk_images_s.o $(IMGOBJECTS) + echo $(LIBCOMMAND) libfltk_images_s.a libfltk_images_s.o + $(RM) $@ + $(LIBCOMMAND) libfltk_images_s.a libfltk_images_s.o + $(CHMOD) +x libfltk_images_s.a + +#----------------------------------------------------------------- +# - the import libraries libfltk*.dll.a and the .dll files +# are created from the libfltk*.a files. They are built +# into the src dir. +# - The _images, _gl, _forms and dlls must be linked +# against the import libraries in the src dir. +#----------------------------------------------------------------- + +cygfltknox-1.1.dll: $(LIBNAME) + echo $(DSOCOMMAND) $(LIBNAME) ... + $(DSOCOMMAND) $(LIBNAME) -Wl,--no-whole-archive \ + -Wl,--out-implib=libfltk.dll.a $(LDLIBS) + +cygfltknox_forms-1.1.dll: $(FLLIBNAME) cygfltknox-1.1.dll + echo $(DSOCOMMAND) $(FLLIBNAME) ... + $(DSOCOMMAND) $(FLLIBNAME) -Wl,--no-whole-archive \ + -Wl,--out-implib=libfltk_forms.dll.a \ + -L. -lfltk $(LDLIBS) + +cygfltknox_gl-1.1.dll: $(GLLIBNAME) cygfltknox-1.1.dll + echo $(DSOCOMMAND) $(GLLIBNAME) ... + $(DSOCOMMAND) $(GLLIBNAME) -Wl,--no-whole-archive \ + -Wl,--out-implib=libfltk_gl.dll.a \ + -L. -lfltk $(GLDLIBS) + +cygfltknox_images-1.1.dll: $(IMGLIBNAME) cygfltknox-1.1.dll + echo $(DSOCOMMAND) $(IMGLIBNAME) ... + $(DSOCOMMAND) $(IMGLIBNAME) -Wl,--no-whole-archive \ + -Wl,--out-implib=libfltk_images.dll.a \ + -L. -lfltk -Wl,--exclude-libs -Wl,libfltk_png.a \ + $(IMAGELIBS) $(LDLIBS) + +mgwfltknox-1.1.dll: $(LIBNAME) + echo $(DSOCOMMAND) $(LIBNAME) ... + $(DSOCOMMAND) $(LIBNAME) -Wl,--no-whole-archive \ + -Wl,--out-implib=libfltk.dll.a $(LDLIBS) + +mgwfltknox_forms-1.1.dll: $(FLLIBNAME) mgwfltknox-1.1.dll + echo $(DSOCOMMAND) $(FLLIBNAME) ... + $(DSOCOMMAND) $(FLLIBNAME) -Wl,--no-whole-archive \ + -Wl,--out-implib=libfltk_forms.dll.a \ + -L. -lfltk $(LDLIBS) + +mgwfltknox_gl-1.1.dll: $(GLLIBNAME) mgwfltknox-1.1.dll + echo $(DSOCOMMAND) $(GLLIBNAME) ... + $(DSOCOMMAND) $(GLLIBNAME) -Wl,--no-whole-archive \ + -Wl,--out-implib=libfltk_gl.dll.a \ + -L. -lfltk $(GLDLIBS) + +#----------------------------------------------------- +# See STR #1585 for --exclude-libs +#----------------------------------------------------- + +mgwfltknox_images-1.1.dll: $(IMGLIBNAME) mgwfltknox-1.1.dll + echo $(DSOCOMMAND) $(IMGLIBNAME) ... + $(DSOCOMMAND) $(IMGLIBNAME) -Wl,--no-whole-archive \ + -Wl,--out-implib=libfltk_images.dll.a \ + -L. -lfltk -Wl,--exclude-libs -Wl,libfltk_png.a \ + $(IMAGELIBS) $(LDLIBS) + +clean: + -$(RM) *.o *.dll.a core.* *~ *.bck *.bck + -$(RM) $(DSONAME) $(FLDSONAME) $(GLDSONAME) $(IMGDSONAME) \ + $(LIBNAME) $(FLLIBNAME) $(GLLIBNAME) \ + $(IMGLIBNAME) \ + libfltk.so libfltk_forms.so libfltk_gl.so libfltk_images.so \ + libfltk.sl libfltk_forms.sl libfltk_gl.sl libfltk_images.sl \ + libfltk.dylib libfltk_forms.dylib \ + libfltk_gl.dylib libfltk_images.dylib \ + cmap core + +depend: $(CPPFILES) $(FLCPPFILES) $(GLCPPFILES) $(IMGCPPFILES) $(CFILES) + makedepend -Y -I.. -f makedepend $(CPPFILES) $(FLCPPFILES) \ + $(GLCPPFILES) $(IMGCPPFILES) $(CFILES) + +# Automatically generated dependencies... +include makedepend + +# These dependencies aren't part of the makedepend file since +# they are part of the WIN32 and MacOS code base... +Fl_get_key.o: Fl_get_key_mac.cxx Fl_get_key_win32.cxx +Fl.o: Fl_mac.cxx Fl_win32.cxx +fl_color.o: fl_color_mac.cxx fl_color_win32.cxx +fl_dnd.o: fl_dnd_mac.cxx fl_dnd_win32.cxx fl_dnd_x.cxx +fl_draw_image.o: fl_draw_image_mac.cxx fl_draw_image_win32.cxx +fl_font.o: fl_font_mac.cxx fl_font_x.cxx fl_font_xft.cxx fl_font_win32.cxx +fl_read_image.o: fl_read_image_mac.cxx fl_read_image_win32.cxx +fl_set_fonts.o: fl_set_fonts_mac.cxx fl_set_fonts_x.cxx \ + fl_set_fonts_xft.cxx fl_set_fonts_win32.cxx + +fl_arci.o: ../FL/mac.H ../FL/win32.H +Fl_arg.o: ../FL/mac.H ../FL/win32.H +fl_ask.o: ../FL/mac.H ../FL/win32.H +Fl_Bitmap.o: ../FL/mac.H ../FL/win32.H +fl_color.o: ../FL/mac.H ../FL/win32.H +fl_cursor.o: ../FL/mac.H ../FL/win32.H +fl_dnd.o: ../FL/mac.H ../FL/win32.H +Fl.o: ../FL/mac.H ../FL/win32.H Fl_win32.cxx Fl_mac.cxx +Fl_Double_Window.o: ../FL/mac.H ../FL/win32.H +fl_draw_image.o: ../FL/mac.H ../FL/win32.H +fl_draw_image_mac.o: ../FL/mac.H ../FL/win32.H +fl_draw_image_win32.o: ../FL/mac.H ../FL/win32.H +fl_draw_pixmap.o: ../FL/mac.H ../FL/win32.H +fl_encoding_latin1.o: ../FL/mac.H ../FL/win32.H +fl_encoding_mac_roman.o: ../FL/mac.H ../FL/win32.H +Fl_File_Chooser2.o: ../FL/mac.H ../FL/win32.H +fl_font.o: ../FL/mac.H ../FL/win32.H +Fl_get_key.o: ../FL/mac.H ../FL/win32.H +Fl_get_system_colors.o: ../FL/mac.H ../FL/win32.H +Fl_Gl_Choice.o: ../FL/mac.H ../FL/win32.H +Fl_Gl_Overlay.o: ../FL/mac.H ../FL/win32.H +Fl_Gl_Window.o: ../FL/mac.H ../FL/win32.H +Fl_grab.o: ../FL/mac.H ../FL/win32.H +Fl_Image.o: ../FL/mac.H ../FL/win32.H +fl_line_style.o: ../FL/mac.H ../FL/win32.H +Fl_mac.o: ../FL/mac.H ../FL/win32.H +Fl_Menu_Window.o: ../FL/mac.H ../FL/win32.H +fl_overlay.o: ../FL/mac.H ../FL/win32.H +fl_overlay_visual.o: ../FL/mac.H ../FL/win32.H +Fl_Overlay_Window.o: ../FL/mac.H ../FL/win32.H +Fl_own_colormap.o: ../FL/mac.H ../FL/win32.H +Fl_Pixmap.o: ../FL/mac.H ../FL/win32.H +fl_read_image.o: ../FL/mac.H ../FL/win32.H +fl_read_image_mac.o: ../FL/mac.H ../FL/win32.H +fl_read_image_win32.o: ../FL/mac.H ../FL/win32.H +fl_rect.o: ../FL/mac.H ../FL/win32.H +fl_scroll_area.o: ../FL/mac.H ../FL/win32.H +fl_set_font.o: ../FL/mac.H ../FL/win32.H +fl_set_fonts.o: ../FL/mac.H ../FL/win32.H +fl_shortcut.o: ../FL/mac.H ../FL/win32.H +fl_vertex.o: ../FL/mac.H ../FL/win32.H +Fl_visual.o: ../FL/mac.H ../FL/win32.H +Fl_Window_fullscreen.o: ../FL/mac.H ../FL/win32.H +Fl_Window_iconize.o: ../FL/mac.H ../FL/win32.H +Fl_x.o: ../FL/mac.H ../FL/win32.H +gl_draw.o: ../FL/mac.H ../FL/win32.H +gl_start.o: ../FL/mac.H ../FL/win32.H + +################################################################ + +install: $(LIBNAME) $(DSONAME) \ + $(FLLIBNAME) $(FLDSONAME) \ + $(GLLIBNAME) $(GLDSONAME) \ + $(IMGLIBNAME) $(IMGDSONAME) + echo "Installing libraries in $(DESTDIR)$(libdir)..." + -$(INSTALL_DIR) $(DESTDIR)$(libdir) + -$(INSTALL_DIR) $(DESTDIR)$(bindir) + $(RM) $(DESTDIR)$(libdir)/$(LIBBASENAME) + $(INSTALL_LIB) $(LIBNAME) $(DESTDIR)$(libdir) + $(INSTALL_LIB) $(FLLIBNAME) $(DESTDIR)$(libdir) + $(INSTALL_LIB) $(IMGLIBNAME) $(DESTDIR)$(libdir) + $(RANLIB) $(DESTDIR)$(libdir)/$(LIBBASENAME) + $(RANLIB) $(DESTDIR)$(libdir)/$(FLLIBBASENAME) + if test x$(GLLIBNAME) != x; then \ + $(INSTALL_LIB) $(GLLIBNAME) $(DESTDIR)$(libdir); \ + $(RANLIB) $(DESTDIR)$(libdir)/$(GLLIBBASENAME); \ + fi + $(RANLIB) $(DESTDIR)$(libdir)/$(IMGLIBBASENAME) + if test x$(DSONAME) = xlibfltk.so.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk.so*;\ + $(INSTALL_LIB) libfltk.so.1.1 $(DESTDIR)$(libdir); \ + $(LN) libfltk.so.1.1 $(DESTDIR)$(libdir)/libfltk.so;\ + fi + if test x$(DSONAME) = xlibfltk.sl.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk.sl*;\ + $(INSTALL_LIB) libfltk.sl.1.1 $(DESTDIR)$(libdir); \ + $(LN) libfltk.sl.1.1 $(DESTDIR)$(libdir)/libfltk.sl;\ + fi + if test x$(DSONAME) = xlibfltk.1.1.dylib; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk.*dylib;\ + $(INSTALL_LIB) libfltk.1.1.dylib $(DESTDIR)$(libdir); \ + $(LN) libfltk.1.1.dylib $(DESTDIR)$(libdir)/libfltk.dylib;\ + fi + if test x$(DSONAME) = xlibfltk_s.a; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_s.a;\ + $(INSTALL_LIB) libfltk_s.a $(DESTDIR)$(libdir); \ + fi + if test x$(DSONAME) = xcygfltknox-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(DSONAME);\ + $(INSTALL_LIB) $(DSONAME) $(DESTDIR)$(bindir); \ + $(RM) $(DESTDIR)$(libdir)/libfltk.dll.a;\ + $(INSTALL_LIB) libfltk.dll.a $(DESTDIR)$(libdir); \ + fi + if test x$(DSONAME) = xmgwfltknox-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(DSONAME);\ + $(INSTALL_LIB) $(DSONAME) $(DESTDIR)$(bindir); \ + $(RM) $(DESTDIR)$(libdir)/libfltk.dll.a;\ + $(INSTALL_LIB) libfltk.dll.a $(DESTDIR)$(libdir); \ + fi + if test x$(FLDSONAME) = xlibfltk_forms.so.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_forms.so*;\ + $(INSTALL_LIB) libfltk_forms.so.1.1 $(DESTDIR)$(libdir); \ + $(LN) libfltk_forms.so.1.1 $(DESTDIR)$(libdir)/libfltk_forms.so;\ + fi + if test x$(FLDSONAME) = xlibfltk_forms.sl.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_forms.sl*;\ + $(INSTALL_LIB) libfltk_forms.sl.1.1 $(DESTDIR)$(libdir); \ + $(LN) libfltk_forms.sl.1.1 $(DESTDIR)$(libdir)/libfltk_forms.sl;\ + fi + if test x$(FLDSONAME) = xlibfltk_forms.1.1.dylib; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_forms.*dylib;\ + $(INSTALL_LIB) libfltk_forms.1.1.dylib $(DESTDIR)$(libdir); \ + $(LN) libfltk_forms.1.1.dylib $(DESTDIR)$(libdir)/libfltk_forms.dylib;\ + fi + if test x$(FLDSONAME) = xlibfltk_forms_s.a; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_forms_s.a;\ + $(INSTALL_LIB) libfltk_forms_s.a $(DESTDIR)$(libdir); \ + fi + if test x$(FLDSONAME) = xcygfltknox_forms-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(FLDSONAME);\ + $(INSTALL_LIB) $(FLDSONAME) $(DESTDIR)$(bindir); \ + $(RM) $(DESTDIR)$(libdir)/libfltk_forms.dll.a;\ + $(INSTALL_LIB) libfltk_forms.dll.a $(DESTDIR)$(libdir); \ + fi + if test x$(FLDSONAME) = xmgwfltknox_forms-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(FLDSONAME);\ + $(INSTALL_LIB) $(FLDSONAME) $(DESTDIR)$(bindir); \ + $(RM) $(DESTDIR)$(libdir)/libfltk_forms.dll.a;\ + $(INSTALL_LIB) libfltk_forms.dll.a $(DESTDIR)$(libdir); \ + fi + if test x$(GLDSONAME) = xlibfltk_gl.so.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_gl.so*;\ + $(INSTALL_LIB) libfltk_gl.so.1.1 $(DESTDIR)$(libdir); \ + $(LN) libfltk_gl.so.1.1 $(DESTDIR)$(libdir)/libfltk_gl.so;\ + fi + if test x$(GLDSONAME) = xlibfltk_gl.sl.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_gl.sl*;\ + $(INSTALL_LIB) libfltk_gl.sl.1.1 $(DESTDIR)$(libdir); \ + $(LN) libfltk_gl.sl.1.1 $(DESTDIR)$(libdir)/libfltk_gl.sl;\ + fi + if test x$(GLDSONAME) = xlibfltk_gl.1.1.dylib; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_gl.*dylib;\ + $(INSTALL_LIB) libfltk_gl.1.1.dylib $(DESTDIR)$(libdir); \ + $(LN) libfltk_gl.1.1.dylib $(DESTDIR)$(libdir)/libfltk_gl.dylib;\ + fi + if test x$(GLDSONAME) = xlibfltk_gl_s.a; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_gl_s.a;\ + $(INSTALL_LIB) libfltk_gl_s.a $(DESTDIR)$(libdir); \ + fi + if test x$(GLDSONAME) = xcygfltknox_gl-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(GLDSONAME);\ + $(INSTALL_LIB) $(GLDSONAME) $(DESTDIR)$(bindir); \ + $(RM) $(DESTDIR)$(libdir)/libfltk_gl.dll.a;\ + $(INSTALL_LIB) libfltk_gl.dll.a $(DESTDIR)$(libdir); \ + fi + if test x$(GLDSONAME) = xmgwfltknox_gl-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(GLDSONAME);\ + $(INSTALL_LIB) $(GLDSONAME) $(DESTDIR)$(bindir); \ + $(RM) $(DESTDIR)$(libdir)/libfltk_gl.dll.a;\ + $(INSTALL_LIB) libfltk_gl.dll.a $(DESTDIR)$(libdir); \ + fi + if test x$(IMGDSONAME) = xlibfltk_images.so.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_images.so*;\ + $(INSTALL_LIB) libfltk_images.so.1.1 $(DESTDIR)$(libdir); \ + $(LN) libfltk_images.so.1.1 $(DESTDIR)$(libdir)/libfltk_images.so;\ + fi + if test x$(IMGDSONAME) = xlibfltk_images.sl.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_images.sl*;\ + $(INSTALL_LIB) libfltk_images.sl.1.1 $(DESTDIR)$(libdir); \ + $(LN) libfltk_images.sl.1.1 $(DESTDIR)$(libdir)/libfltk_images.sl;\ + fi + if test x$(IMGDSONAME) = xlibfltk_images.1.1.dylib; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_images.*dylib;\ + $(INSTALL_LIB) libfltk_images.1.1.dylib $(DESTDIR)$(libdir); \ + $(LN) libfltk_images.1.1.dylib $(DESTDIR)$(libdir)/libfltk_images.dylib;\ + fi + if test x$(IMGDSONAME) = xlibfltk_images_s.a; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_images_s.a;\ + $(INSTALL_LIB) libfltk_images_s.a $(DESTDIR)$(libdir); \ + fi + if test x$(IMGDSONAME) = xcygfltknox_images-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(IMGDSONAME); \ + $(INSTALL_LIB) $(IMGDSONAME) $(DESTDIR)$(bindir); \ + $(RM) $(DESTDIR)$(libdir)/libfltk_images.dll.a;\ + $(INSTALL_LIB) libfltk_images.dll.a $(DESTDIR)$(libdir); \ + fi + if test x$(IMGDSONAME) = xmgwfltknox_images-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(IMGDSONAME); \ + $(INSTALL_LIB) $(IMGDSONAME) $(DESTDIR)$(bindir); \ + $(RM) $(DESTDIR)$(libdir)/libfltk_images.dll.a;\ + $(INSTALL_LIB) libfltk_images.dll.a $(DESTDIR)$(libdir); \ + fi + +uninstall: + echo "Uninstalling libraries..." + $(RM) $(DESTDIR)$(libdir)/$(LIBBASENAME) + if test x$(DSONAME) = xlibfltk.so.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk.so*;\ + fi + if test x$(DSONAME) = xlibfltk.sl.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk.sl*;\ + fi + if test x$(DSONAME) = xlibfltk.1.1.dylib; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk.*dylib;\ + fi + if test x$(DSONAME) = xlibfltk_s.a; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_s.a;\ + fi + if test x$(DSONAME) = xcygfltknox-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(DSONAME); \ + $(RM) $(DESTDIR)$(libdir)/libfltk.dll.a;\ + fi + if test x$(DSONAME) = xmgwfltknox-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(DSONAME); \ + $(RM) $(DESTDIR)$(libdir)/libfltk.dll.a;\ + fi + $(RM) $(DESTDIR)$(libdir)/$(FLLIBBASENAME); + if test x$(FLDSONAME) = xlibfltk_forms.so.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_forms.so*;\ + fi + if test x$(FLDSONAME) = xlibfltk_forms.sl.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_forms.sl*;\ + fi + if test x$(FLDSONAME) = xlibfltk_forms.1.1.dylib; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_forms.*dylib;\ + fi + if test x$(FLDSONAME) = xlibfltk_forms_s.a; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_forms_s.a;\ + fi + if test x$(FLDSONAME) = xcygfltknox_forms-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(FLDSONAME); \ + $(RM) $(DESTDIR)$(libdir)/libfltk_forms.dll.a;\ + fi + if test x$(FLDSONAME) = xmgwfltknox_forms-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(FLDSONAME); \ + $(RM) $(DESTDIR)$(libdir)/libfltk_forms.dll.a;\ + fi + if test x$(GLLIBNAME) != x; then\ + $(RM) $(DESTDIR)$(libdir)/$(GLLIBBASENAME);\ + fi + if test x$(GLDSONAME) = xlibfltk_gl.so.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_gl.so*;\ + fi + if test x$(GLDSONAME) = xlibfltk_gl.sl.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_gl.sl*;\ + fi + if test x$(GLDSONAME) = xlibfltk_gl.1.1.dylib; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_gl.*dylib;\ + fi + if test x$(GLDSONAME) = xlibfltk_gl_s.a; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_gl_s.a;\ + fi + if test x$(GLDSONAME) = xcygfltknox_gl-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(GLDSONAME); \ + $(RM) $(DESTDIR)$(libdir)/libfltk_gl.dll.a;\ + fi + if test x$(GLDSONAME) = xmgwfltknox_gl-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(GLDSONAME); \ + $(RM) $(DESTDIR)$(libdir)/libfltk_gl.dll.a;\ + fi + if test x$(IMGLIBNAME) != x; then\ + $(RM) $(DESTDIR)$(libdir)/$(IMGLIBBASENAME);\ + fi + if test x$(IMGDSONAME) = xlibfltk_images.so.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_images.so*;\ + fi + if test x$(IMGDSONAME) = xlibfltk_images.sl.1.1; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_images.sl*;\ + fi + if test x$(IMGDSONAME) = xlibfltk_images.1.1.dylib; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_images.*dylib;\ + fi + if test x$(IMGDSONAME) = xlibfltk_images_s.a; then\ + $(RM) $(DESTDIR)$(libdir)/libfltk_images_s.a;\ + fi + if test x$(IMGDSONAME) = xcygfltknox_images-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(IMGDSONAME); \ + $(RM) $(DESTDIR)$(libdir)/libfltk_images.dll.a;\ + fi + if test x$(IMGDSONAME) = xmgwfltknox_images-1.1.dll; then\ + $(RM) $(DESTDIR)$(bindir)/$(IMGDSONAME); \ + $(RM) $(DESTDIR)$(libdir)/libfltk_images.dll.a;\ + fi + + +# +# End of "$Id: Makefile 6817 2009-07-02 09:42:17Z AlbrechtS $". +# diff --git a/third_party/windows/fltk-1.1.10/src/allfiles.xbm b/third_party/windows/fltk-1.1.10/src/allfiles.xbm new file mode 100644 index 0000000..5aaec59 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/allfiles.xbm @@ -0,0 +1,6 @@ +#define allfiles_width 16 +#define allfiles_height 16 +static unsigned char allfiles_bits[] = { + 0xfc, 0x3f, 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0x84, 0x21, 0xa4, 0x25, + 0xc4, 0x23, 0xf4, 0x2f, 0xf4, 0x2f, 0xc4, 0x23, 0xa4, 0x25, 0x84, 0x21, + 0x04, 0x20, 0x04, 0x20, 0x04, 0x20, 0xfc, 0x3f}; diff --git a/third_party/windows/fltk-1.1.10/src/cgdebug.h b/third_party/windows/fltk-1.1.10/src/cgdebug.h new file mode 100644 index 0000000..1217f15 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/cgdebug.h @@ -0,0 +1,215 @@ +// +// "$Id:$" +// +// OS X Core Graphics debugging help for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// This file allows easier debugging of Mac OS X Core Graphics +// code. This file is normally not included into any FLTK builds, +// but since it has proven to be tremendously useful in debugging +// the FLTK port to "Quartz", I decided to add this file in case +// more bugs show up. +// +// This header is activated by adding the following +// line to "config.h" +// #include "src/cgdebug.h" +// +// Running "./configure" will remove this line from "config.h". +// +// When used erreanously, Core Graphics prints warnings to +// stderr. This is helpful, however it is not possible to +// associate a line number or source file with the warning message. +// This headr file outputs a trace of CG calls, interweaveing +// them with CG warnings. +// +// Matthias + +#ifndef CGDEBUG +#define CGDEBUG + +#include +#include + +//+BitmapContextCreate +//+BitmapContextGetData +// ClipCGContextToRegion +// QDBeginCGContext +// QDEndCGContext + +//+AddArc +//+AddLineToPoint +// ClipToRect +// ClosePath +//+ConcatCTM +//+DrawImage +// FillPath +// FillRect +// Flush +//+GetCTM +// MoveToPoint +//+Release +// RestoreGState +// SaveGState +//+ScaleCTM +//+SetLineCap +//+SetLineDash +//+SetLineJoin +//+SetLineWidth +//+SetRGBFillColor +//+SetRGBStrokeColor +//+SetShouldAntialias +//+SetTextMatrix +//+StrokePath +//+TranslateCTM + +inline OSStatus dbgLocation(const char *file, int line) +{ + fprintf(stderr, "%s:%d ", file, line); + return 0; +} + +inline OSStatus dbgEndl() +{ + fprintf(stderr, "\n"); + return 0; +} + + +inline void dbgCGContextClipToRect(CGContextRef a, CGRect b) +{ + CGContextClipToRect(a, b); +} + +#define CGContextClipToRect(a, b) { \ + fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \ + dbgCGContextClipToRect(a, b); \ + fprintf(stderr, "\n"); } + +inline void dbgCGContextFillRect(CGContextRef a, CGRect b) +{ + CGContextFillRect(a, b); +} + +#define CGContextFillRect(a, b) { \ + fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \ + dbgCGContextFillRect(a, b); \ + fprintf(stderr, "\n"); } + +inline OSStatus dbgQDEndCGContext(CGrafPtr a, CGContextRef *b) +{ + return QDEndCGContext(a, b); +} + +#define QDEndCGContext(a, b) ( \ + dbgLocation(__FILE__, __LINE__) + \ + dbgQDEndCGContext(a, b) + \ + dbgEndl() ) + +inline OSStatus dbgQDBeginCGContext(CGrafPtr a, CGContextRef *b) +{ + return QDBeginCGContext(a, b); +} + +#define QDBeginCGContext(a, b) ( \ + dbgLocation(__FILE__, __LINE__) + \ + dbgQDBeginCGContext(a, b) + \ + dbgEndl() ) + +inline void dbgClipCGContextToRegion(CGContextRef a, const Rect *b, RgnHandle c) +{ + ClipCGContextToRegion(a, b, c); +} + +#define ClipCGContextToRegion(a, b, c) { \ + fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \ + dbgClipCGContextToRegion(a, b, c); \ + fprintf(stderr, "\n"); } + +inline void dbgCGContextMoveToPoint(CGContextRef context, float x, float y) +{ + CGContextMoveToPoint(context, x, y); +} + +#define CGContextMoveToPoint(a, b, c) { \ + fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \ + dbgCGContextMoveToPoint(a, b, c); \ + fprintf(stderr, "\n"); } + +inline void dbgCGContextFillPath(CGContextRef context) +{ + CGContextFillPath(context); +} + +#define CGContextFillPath(a) { \ + fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \ + dbgCGContextFillPath(a); \ + fprintf(stderr, "\n"); } + +inline void dbgCGContextClosePath(CGContextRef context) +{ + CGContextClosePath(context); +} + +#define CGContextClosePath(a) { \ + fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \ + dbgCGContextClosePath(a); \ + fprintf(stderr, "\n"); } + +inline void dbgCGContextFlush(CGContextRef context) +{ + CGContextFlush(context); +} + +#define CGContextFlush(a) { \ + fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \ + dbgCGContextFlush(a); \ + fprintf(stderr, "\n"); } + +inline void dbgCGContextSaveGState(CGContextRef context) +{ + CGContextSaveGState(context); +} + +#define CGContextSaveGState(a) { \ + fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \ + dbgCGContextSaveGState(a); \ + fprintf(stderr, "\n"); } + +inline void dbgCGContextRestoreGState(CGContextRef context) +{ + CGContextRestoreGState(context); +} + +#define CGContextRestoreGState(a) { \ + fprintf(stderr, "%s:%d ", __FILE__, __LINE__); \ + dbgCGContextRestoreGState(a); \ + fprintf(stderr, "\n"); } + + +#endif + +// +// End of "$Id:$". +// + diff --git a/third_party/windows/fltk-1.1.10/src/cmap.cxx b/third_party/windows/fltk-1.1.10/src/cmap.cxx new file mode 100644 index 0000000..75a1f98 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/cmap.cxx @@ -0,0 +1,179 @@ +// +// "$Id: cmap.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Colormap generation program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems to "fltk-bugs@easysw.com". +// + +// This program produces the contents of "fl_cmap.h" as stdout + +// #include +#include + +// This table is initialized with color values I got by reading the +// colormap on an IRIX 4.3 machine: + +// "full intensity colors" have been turned down some to make white +// background less intense by default. The hope is that this will make +// fltk programs more friendly on color-adjusted screens. If you want +// pure colors you should get them out of the colormap. + +//#define III 244 // maximum intensity of the basic colors + +// that results in errors and unshared colormap entries, so full intensity: +#define III 255 // maximum intensity of the basic colors + +static short cmap[256][3] = { +// 3-bit colormap: + { 0, 0, 0}, // black + {III, 0, 0}, // red + { 0,III, 0}, // green + {III,III, 0}, // yellow + { 0, 0,III}, // blue + {III, 0,III}, // magenta + { 0,III,III}, // cyan + {III,III,III}, // white +// pastel versions of those colors, from SGI's standard color map: + { 85, 85, 85}, // 1/3 gray + {198,113,113}, // salmon? pale red? + {113,198,113}, // pale green + {142,142, 56}, // khaki + {113,113,198}, // pale blue + {142, 56,142}, // purple, orchid, pale magenta + { 56,142,142}, // cadet blue, aquamarine, pale cyan +// The next location is used for FL_SELECTION_COLOR. It formerly was 2/3 gray +// but this is changed to be the Windows blue color. This allows the default +// behavior on both X and Windows to match: + { 0, 0,128}, +//{170,170,170}, // old 2/3 gray color +// These next 16 are the FL_FREE_COLOR area. In some versions of fltk +// these were filled with random colors that a Irix 5.3 machine placed +// in these locations. Other versions of fltk filled this with the 1/3 +// gray above to discourage their use. This newest version uses colors +// that NewTek has assigned for their GUI: +#if 0 + // The Irix 5.3 colors: + { 16, 16, 16}, + {128, 40,128}, + {198, 30, 30}, + { 66, 30, 30}, + {176,140,140}, + { 0, 20, 20}, + { 20, 10, 10}, + { 40, 20, 20}, + { 60, 30, 30}, + { 0, 80, 80}, + { 0, 40, 40}, + { 20, 20, 0}, + { 40, 40, 0}, + { 80, 80, 10}, + {150,150, 20}, + {160, 10, 10}, +#else + // The NewTek colors: (from George Yohng) + {168,168,152}, + {232,232,216}, + {104,104, 88}, + {152,168,168}, + {216,232,232}, + { 88,104,104}, + {156,156,168}, + {220,220,232}, + { 92, 92,104}, + {156,168,156}, + {220,232,220}, + { 92,104, 92}, + {144,144,144}, + {192,192,192}, + { 80, 80, 80}, + {160,160,160}, +#endif +// The rest of the colormap is a gray ramp and table, filled in below: +}; + +// This is Fl::background from Fl_get_system_colors.cxx, with modifications: + +#define FL_GRAY_RAMP 32 +#define FL_NUM_GRAY 24 +#define FL_GRAY 49 // old value is 47 +typedef unsigned char uchar; +#include + +void background(uchar r, uchar g, uchar b) { + // replace the gray ramp so that color 47 (by default 2/3) is this color + if (!r) r = 1; else if (r==255) r = 254; + double powr = log(r/255.0)/log((FL_GRAY-FL_GRAY_RAMP)/(FL_NUM_GRAY-1.0)); + if (!g) g = 1; else if (g==255) g = 254; + double powg = log(g/255.0)/log((FL_GRAY-FL_GRAY_RAMP)/(FL_NUM_GRAY-1.0)); + if (!b) b = 1; else if (b==255) b = 254; + double powb = log(b/255.0)/log((FL_GRAY-FL_GRAY_RAMP)/(FL_NUM_GRAY-1.0)); + for (int i = 0; i < FL_NUM_GRAY; i++) { + double gray = i/(FL_NUM_GRAY-1.0); + cmap[i+FL_GRAY_RAMP][0] = uchar(pow(gray,powr)*255+.5); + cmap[i+FL_GRAY_RAMP][1] = uchar(pow(gray,powg)*255+.5); + cmap[i+FL_GRAY_RAMP][2] = uchar(pow(gray,powb)*255+.5); + } +} + +int main() { + int i,r,g,b; +#if 0 + /* Read colormap colors into internal table */ + long cmwin; + noport(); + cmwin = winopen("CM"); + for (i=0; i<256; i++) + getmcolor(i,&cmap[i][0],&cmap[i][1],&cmap[i][2]); + winclose(cmwin); +#endif +// overwrite the X allocation area with one color so people are +// discouraged from using it: + //for (i=16; i<32; i++) {cmap[i][0]=cmap[i][1]=cmap[i][2] = 85;} + + // fill in the gray ramp: + background(0xc0, 0xc0, 0xc0); // microsoft colors + // background(170, 170, 170); // old fltk colors + // copy the 1/3 and 2/3 gray to the closest locations in gray ramp: + cmap[39][0] = cmap[39][1] = cmap[39][2] = 85; + cmap[47][0] = cmap[47][1] = cmap[47][2] = 170; + + // fill in the color cube + i = 56; + for (b=0; b<5; b++) + for (r=0; r<5; r++) + for (g=0; g<8; g++) { + cmap[i][0] = r*255/4; + cmap[i][1] = g*255/7; + cmap[i][2] = b*255/4; + i++; + } + + for (i=0; i<256; i++) { + printf("\t0x%02x%02x%02x00",cmap[i][0],cmap[i][1],cmap[i][2]); + if (i < 255) printf(",\n"); + } + printf("\n"); + return 0; +} + +// +// End of "$Id: cmap.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/d1.xbm b/third_party/windows/fltk-1.1.10/src/d1.xbm new file mode 100644 index 0000000..7bb1232 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/d1.xbm @@ -0,0 +1,6 @@ +#define d1_width 16 +#define d1_height 16 +static unsigned char d1_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x38, 0x00, 0x78, 0x00, + 0xe8, 0x00, 0xc0, 0x01, 0x80, 0x03, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x1c, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/third_party/windows/fltk-1.1.10/src/d1_mask.xbm b/third_party/windows/fltk-1.1.10/src/d1_mask.xbm new file mode 100644 index 0000000..6cbaca8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/d1_mask.xbm @@ -0,0 +1,6 @@ +#define d1_mask_width 16 +#define d1_mask_height 16 +static unsigned char d1_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x7c, 0x00, 0xfc, 0x00, + 0xfc, 0x01, 0xec, 0x03, 0xc0, 0x37, 0x80, 0x3f, 0x00, 0x3f, 0x00, 0x3e, + 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00}; diff --git a/third_party/windows/fltk-1.1.10/src/dump_compose.c b/third_party/windows/fltk-1.1.10/src/dump_compose.c new file mode 100644 index 0000000..94c4e44 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/dump_compose.c @@ -0,0 +1,26 @@ +/* write out the documentation for the compose key */ + +/* copy the string from Fl_Input.C */ +static const char* const compose_pairs = +" ! @ # $ y=| & : c a <<~ - r _ * +-2 3 ' u p . , 1 o >>141234? " +"A`A'A^A~A:A*AEC,E`E'E^E:I`I'I^I:D-N~O`O'O^O~O:x O/U`U'U^U:Y'DDss" +"a`a'a^a~a:a*aec,e`e'e^e:i`i'i^i:d-n~o`o'o^o~o:-:o/u`u'u^u:y'ddy:"; + +#include + +int main() { + int x,y; + for (x = 0; x<16; x++) { + for (y = 0; y<6; y++) { + const char *p = compose_pairs + (16*y+x)*2; + if (p[1] == ' ') + printf("%c    %c\n", + p[0],(p-compose_pairs)/2+0xA0); + else + printf("%c%c   %c\n", + p[0],p[1],(p-compose_pairs)/2+0xA0); + } + printf(""); + } + return 0; +} diff --git a/third_party/windows/fltk-1.1.10/src/ew.xbm b/third_party/windows/fltk-1.1.10/src/ew.xbm new file mode 100644 index 0000000..0994e9c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/ew.xbm @@ -0,0 +1,8 @@ +#define ew_width 16 +#define ew_height 16 +#define ew_x_hot 8 +#define ew_y_hot 8 +static unsigned char ew_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, + 0x0c, 0x30, 0xfe, 0x7f, 0xfe, 0x7f, 0x0c, 0x30, 0x08, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/third_party/windows/fltk-1.1.10/src/ew_mask.xbm b/third_party/windows/fltk-1.1.10/src/ew_mask.xbm new file mode 100644 index 0000000..e0c6898 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/ew_mask.xbm @@ -0,0 +1,8 @@ +#define ew_mask_width 16 +#define ew_mask_height 16 +#define ew_mask_x_hot 8 +#define ew_mask_y_hot 8 +static unsigned char ew_mask_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x1c, 0x38, + 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0x1c, 0x38, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; diff --git a/third_party/windows/fltk-1.1.10/src/fastarrow.h b/third_party/windows/fltk-1.1.10/src/fastarrow.h new file mode 100644 index 0000000..f662930 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fastarrow.h @@ -0,0 +1,6 @@ +#define fastarrow_width 16 +#define fastarrow_height 16 +static unsigned char fastarrow_bits[] = { + 0x00, 0x00, 0x00, 0x07, 0xe0, 0x07, 0xfc, 0x03, 0xff, 0xff, 0xfc, 0x03, + 0xe0, 0x07, 0x00, 0x07, 0xe0, 0x00, 0xe0, 0x07, 0xc0, 0x3f, 0xff, 0xff, + 0xc0, 0x3f, 0xe0, 0x07, 0xe0, 0x00, 0x00, 0x00}; diff --git a/third_party/windows/fltk-1.1.10/src/filename_absolute.cxx b/third_party/windows/fltk-1.1.10/src/filename_absolute.cxx new file mode 100644 index 0000000..202519c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/filename_absolute.cxx @@ -0,0 +1,212 @@ +// +// "$Id: filename_absolute.cxx 6644 2009-01-23 10:47:53Z AlbrechtS $" +// +// Filename expansion routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +/* expand a file name by prepending current directory, deleting . and + .. (not really correct for symbolic links) between the prepended + current directory. Use $PWD if it exists. + Returns true if any changes were made. +*/ + +#include +#include +#include "flstring.h" +#include +#if defined(WIN32) && !defined(__CYGWIN__) +# include +// Visual C++ 2005 incorrectly displays a warning about the use of POSIX APIs +// on Windows, which is supposed to be POSIX compliant... +# define getcwd _getcwd +#else +# include +# ifdef __EMX__ +# define getcwd _getcwd2 +# endif +#endif + +#if defined(WIN32) || defined(__EMX__) && !defined(__CYGWIN__) +inline int isdirsep(char c) {return c=='/' || c=='\\';} +#else +#define isdirsep(c) ((c)=='/') +#endif + +int fl_filename_absolute(char *to, int tolen, const char *from) { + if (isdirsep(*from) || *from == '|' +#if defined(WIN32) || defined(__EMX__) && !defined(__CYGWIN__) + || from[1]==':' +#endif + ) { + strlcpy(to, from, tolen); + return 0; + } + + char *a; + char *temp = new char[tolen]; + const char *start = from; + + a = getcwd(temp, tolen); + if (!a) { + strlcpy(to, from, tolen); + delete[] temp; + return 0; + } +#if defined(WIN32) || defined(__EMX__) && !defined(__CYGWIN__) + for (a = temp; *a; a++) if (*a=='\\') *a = '/'; // ha ha +#else + a = temp+strlen(temp); +#endif + if (isdirsep(*(a-1))) a--; + /* remove intermediate . and .. names: */ + while (*start == '.') { + if (start[1]=='.' && isdirsep(start[2])) { + char *b; + for (b = a-1; b >= temp && !isdirsep(*b); b--); + if (b < temp) break; + a = b; + start += 3; + } else if (isdirsep(start[1])) { + start += 2; + } else if (!start[1]) { + start ++; // Skip lone "." + break; + } else + break; + } + + *a++ = '/'; + strlcpy(a,start,tolen - (a - temp)); + + strlcpy(to, temp, tolen); + + delete[] temp; + + return 1; +} + +/* + * 'fl_filename_relative()' - Make a filename relative to the current working directory. + */ + +int // O - 0 if no change, 1 if changed +fl_filename_relative(char *to, // O - Relative filename + int tolen, // I - Size of "to" buffer + const char *from) {// I - Absolute filename + char *newslash; // Directory separator + const char *slash; // Directory separator + char cwd_buf[1024]; // Current directory + char *cwd = cwd_buf; + + + // return if "from" is not an absolute path +#if defined(WIN32) || defined(__EMX__) + if (from[0] == '\0' || + (!isdirsep(*from) && !isalpha(*from) && from[1] != ':' && + !isdirsep(from[2]))) { +#else + if (from[0] == '\0' || !isdirsep(*from)) { +#endif // WIN32 || __EMX__ + strlcpy(to, from, tolen); + return 0; + } + + // get the current directory and return if we can't + if (!getcwd(cwd_buf, sizeof(cwd_buf))) { + strlcpy(to, from, tolen); + return 0; + } + +#if defined(WIN32) || defined(__EMX__) + // convert all backslashes into forward slashes + for (newslash = strchr(cwd, '\\'); newslash; newslash = strchr(newslash + 1, '\\')) + *newslash = '/'; + + // test for the exact same string and return "." if so + if (!strcasecmp(from, cwd)) { + strlcpy(to, ".", tolen); + return (1); + } + + // test for the same drive. Return the absolute path if not + if (tolower(*from & 255) != tolower(*cwd & 255)) { + strlcpy(to, from, tolen); + return 0; + } + + // compare the path name without the drive prefix + from += 2; cwd += 2; +#else + // test for the exact same string and return "." if so + if (!strcmp(from, cwd)) { + strlcpy(to, ".", tolen); + return (1); + } +#endif // WIN32 || __EMX__ + + // compare both path names until we find a difference + for (slash = from, newslash = cwd; + *slash != '\0' && *newslash != '\0'; + slash ++, newslash ++) + if (isdirsep(*slash) && isdirsep(*newslash)) continue; +#if defined(WIN32) || defined(__EMX__) || defined(__APPLE__) + else if (tolower(*slash & 255) != tolower(*newslash & 255)) break; +#else + else if (*slash != *newslash) break; +#endif // WIN32 || __EMX__ || __APPLE__ + + // skip over trailing slashes + if ( *newslash == '\0' && *slash != '\0' && !isdirsep(*slash) + &&(newslash==cwd || !isdirsep(newslash[-1])) ) + newslash--; + + // now go back to the first character of the first differing paths segment + while (!isdirsep(*slash) && slash > from) slash --; + if (isdirsep(*slash)) slash ++; + + // do the same for the current dir + if (*newslash != '\0') + while (!isdirsep(*newslash) && newslash > cwd) newslash --; + + // prepare the destination buffer + to[0] = '\0'; + to[tolen - 1] = '\0'; + + // now add a "previous dir" sequence for every following slash in the cwd + while (*newslash != '\0') { + if (isdirsep(*newslash)) strlcat(to, "../", tolen); + + newslash ++; + } + + // finally add the differing path from "from" + strlcat(to, slash, tolen); + + return 1; +} + + +// +// End of "$Id: filename_absolute.cxx 6644 2009-01-23 10:47:53Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/src/filename_expand.cxx b/third_party/windows/fltk-1.1.10/src/filename_expand.cxx new file mode 100644 index 0000000..e1c14c3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/filename_expand.cxx @@ -0,0 +1,110 @@ +// +// "$Id: filename_expand.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Filename expansion routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +/* expand a file name by substuting environment variables and + home directories. Returns true if any changes were made. + to & from may be the same buffer. +*/ + +#include +#include +#include "flstring.h" +#if defined(WIN32) && !defined(__CYGWIN__) +#else +# include +# include +#endif + +#if defined(WIN32) || defined(__EMX__) && !defined(__CYGWIN__) +static inline int isdirsep(char c) {return c=='/' || c=='\\';} +#else +#define isdirsep(c) ((c)=='/') +#endif + +int fl_filename_expand(char *to,int tolen, const char *from) { + + char *temp = new char[tolen]; + strlcpy(temp,from, tolen); + char *start = temp; + char *end = temp+strlen(temp); + + int ret = 0; + + for (char *a=temp; apw_dir; +#endif + } + break; + case '$': /* an environment variable */ + {char t = *e; *(char *)e = 0; value = getenv(a+1); *(char *)e = t;} + break; + } + if (value) { + // substitutions that start with slash delete everything before them: + if (isdirsep(value[0])) start = a; +#if defined(WIN32) || defined(__EMX__) && !defined(__CYGWIN__) + // also if it starts with "A:" + if (value[0] && value[1]==':') start = a; +#endif + int t = strlen(value); if (isdirsep(value[t-1])) t--; + if ((end+1-e+t) >= tolen) end += tolen - (end+1-e+t); + memmove(a+t, e, end+1-e); + end = a+t+(end-e); + *end = '\0'; + memcpy(a, value, t); + ret++; + } else { + a = e+1; +#if defined(WIN32) || defined(__EMX__) && !defined(__CYGWIN__) + if (*e == '\\') {*e = '/'; ret++;} // ha ha! +#endif + } + } + + strlcpy(to, start, tolen); + + delete[] temp; + + return ret; +} + + +// +// End of "$Id: filename_expand.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/filename_ext.cxx b/third_party/windows/fltk-1.1.10/src/filename_ext.cxx new file mode 100644 index 0000000..45f57c4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/filename_ext.cxx @@ -0,0 +1,47 @@ +// +// "$Id: filename_ext.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Filename extension routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// returns pointer to the last '.' or to the null if none: + +#include + +const char *fl_filename_ext(const char *buf) { + const char *q = 0; + const char *p = buf; + for (p=buf; *p; p++) { + if (*p == '/') q = 0; +#if defined(WIN32) || defined(__EMX__) && !defined(__CYGWIN__) + else if (*p == '\\') q = 0; +#endif + else if (*p == '.') q = p; + } + return q ? q : p; +} + +// +// End of "$Id: filename_ext.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/filename_isdir.cxx b/third_party/windows/fltk-1.1.10/src/filename_isdir.cxx new file mode 100644 index 0000000..45216a9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/filename_isdir.cxx @@ -0,0 +1,91 @@ +// +// "$Id: filename_isdir.cxx 5948 2007-10-07 10:12:32Z matt $" +// +// Directory detection routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Used by fl_file_chooser + +#include "flstring.h" +#include +#include +#include +#include + + +#if defined(WIN32) || defined(__EMX__) && !defined(__CYGWIN__) +static inline int isdirsep(char c) {return c=='/' || c=='\\';} +#else +#define isdirsep(c) ((c)=='/') +#endif + +int _fl_filename_isdir_quick(const char* n) { + // Do a quick optimization for filenames with a trailing slash... + if (*n && isdirsep(n[strlen(n) - 1])) return 1; + return fl_filename_isdir(n); +} + +int fl_filename_isdir(const char* n) { + struct stat s; + char fn[1024]; + int length; + + length = strlen(n); + +#ifdef WIN32 + // This workaround brought to you by the fine folks at Microsoft! + // (read lots of sarcasm in that...) + if (length < (int)(sizeof(fn) - 1)) { + if (length < 4 && isalpha(n[0]) && n[1] == ':' && + (isdirsep(n[2]) || !n[2])) { + // Always use D:/ for drive letters + fn[0] = n[0]; + strcpy(fn + 1, ":/"); + n = fn; + } else if (length > 0 && isdirsep(n[length - 1])) { + // Strip trailing slash from name... + length --; + memcpy(fn, n, length); + fn[length] = '\0'; + n = fn; + } + } +#else + // Matt: Just in case, we strip the slash for other operating + // systems as well, avoid bugs by sloppy implementations + // of "stat". + if (length > 1 && isdirsep(n[length - 1])) { + length --; + memcpy(fn, n, length); + fn[length] = '\0'; + n = fn; + } +#endif + + return !stat(n, &s) && (s.st_mode&0170000)==0040000; +} + +// +// End of "$Id: filename_isdir.cxx 5948 2007-10-07 10:12:32Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/filename_list.cxx b/third_party/windows/fltk-1.1.10/src/filename_list.cxx new file mode 100644 index 0000000..7f4de5d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/filename_list.cxx @@ -0,0 +1,107 @@ +// +// "$Id: filename_list.cxx 6832 2009-07-23 22:36:04Z AlbrechtS $" +// +// Filename list routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Wrapper for scandir with const-correct function prototypes. + +#include +#include "flstring.h" +#include + + +extern "C" { +#ifndef HAVE_SCANDIR + int fl_scandir (const char *dir, dirent ***namelist, + int (*select)(dirent *), + int (*compar)(dirent **, dirent **)); +# define scandir fl_scandir +#endif +} + +int fl_alphasort(struct dirent **a, struct dirent **b) { + return strcmp((*a)->d_name, (*b)->d_name); +} + +int fl_casealphasort(struct dirent **a, struct dirent **b) { + return strcasecmp((*a)->d_name, (*b)->d_name); +} + + +int fl_filename_list(const char *d, dirent ***list, + Fl_File_Sort_F *sort) { +#ifndef HAVE_SCANDIR + int n = scandir(d, list, 0, sort); +#elif defined(HAVE_SCANDIR_POSIX) + // POSIX (2008) defines the comparison function like this: + int n = scandir(d, list, 0, (int(*)(const dirent **, const dirent **))sort); +#elif defined(__osf__) + // OSF, DU 4.0x + int n = scandir(d, list, 0, (int(*)(dirent **, dirent **))sort); +#elif defined(_AIX) + // AIX is almost standard... + int n = scandir(d, list, 0, (int(*)(void*, void*))sort); +#elif !defined(__sgi) + // The vast majority of UNIX systems want the sort function to have this + // prototype, most likely so that it can be passed to qsort without any + // changes: + int n = scandir(d, list, 0, (int(*)(const void*,const void*))sort); +#else + // This version is when we define our own scandir (WIN32 and perhaps + // some Unix systems) and apparently on IRIX: + int n = scandir(d, list, 0, sort); +#endif + +#if defined(WIN32) && !defined(__CYGWIN__) + // we did this already during fl_scandir/win32 +#else + // append a '/' to all filenames that are directories + int i, dirlen = strlen(d); + char *fullname = (char*)malloc(dirlen+FL_PATH_MAX+3); // Add enough extra for two /'s and a nul + // Use memcpy for speed since we already know the length of the string... + memcpy(fullname, d, dirlen+1); + char *name = fullname + dirlen; + if (name!=fullname && name[-1]!='/') *name++ = '/'; + for (i=0; id_name); + if (de->d_name[len-1]=='/' || len>FL_PATH_MAX) continue; + // Use memcpy for speed since we already know the length of the string... + memcpy(name, de->d_name, len+1); + if (fl_filename_isdir(fullname)) { + (*list)[i] = de = (dirent*)realloc(de, de->d_name - (char*)de + len + 2); + char *dst = de->d_name + len; + *dst++ = '/'; + *dst = 0; + } + } + free(fullname); +#endif + return n; +} + +// +// End of "$Id: filename_list.cxx 6832 2009-07-23 22:36:04Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/src/filename_match.cxx b/third_party/windows/fltk-1.1.10/src/filename_match.cxx new file mode 100644 index 0000000..81da653 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/filename_match.cxx @@ -0,0 +1,106 @@ +// +// "$Id: filename_match.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Pattern matching routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +/* Adapted from Rich Salz. */ +#include +#include + +int fl_filename_match(const char *s, const char *p) { + int matched; + + for (;;) { + switch(*p++) { + + case '?' : // match any single character + if (!*s++) return 0; + break; + + case '*' : // match 0-n of any characters + if (!*p) return 1; // do trailing * quickly + while (!fl_filename_match(s, p)) if (!*s++) return 0; + return 1; + + case '[': { // match one character in set of form [abc-d] or [^a-b] + if (!*s) return 0; + int reverse = (*p=='^' || *p=='!'); if (reverse) p++; + matched = 0; + char last = 0; + while (*p) { + if (*p=='-' && last) { + if (*s <= *++p && *s >= last ) matched = 1; + last = 0; + } else { + if (*s == *p) matched = 1; + } + last = *p++; + if (*p==']') break; + } + if (matched == reverse) return 0; + s++; p++;} + break; + + case '{' : // {pattern1|pattern2|pattern3} + NEXTCASE: + if (fl_filename_match(s,p)) return 1; + for (matched = 0;;) { + switch (*p++) { + case '\\': if (*p) p++; break; + case '{': matched++; break; + case '}': if (!matched--) return 0; break; + case '|': case ',': if (matched==0) goto NEXTCASE; + case 0: return 0; + } + } + case '|': // skip rest of |pattern|pattern} when called recursively + case ',': + for (matched = 0; *p && matched >= 0;) { + switch (*p++) { + case '\\': if (*p) p++; break; + case '{': matched++; break; + case '}': matched--; break; + } + } + break; + case '}': + break; + + case 0: // end of pattern + return !*s; + + case '\\': // quote next character + if (*p) p++; + default: + if (tolower(*s) != tolower(*(p-1))) return 0; + s++; + break; + } + } +} + +// +// End of "$Id: filename_match.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/filename_setext.cxx b/third_party/windows/fltk-1.1.10/src/filename_setext.cxx new file mode 100644 index 0000000..8887383 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/filename_setext.cxx @@ -0,0 +1,46 @@ +// +// "$Id: filename_setext.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Filename extension routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Replace .ext with new extension +// If no . in name, append new extension +// If new extension is null, act like it is "" + +#include +#include "flstring.h" + +char *fl_filename_setext(char *buf, int buflen, const char *ext) { + char *q = (char *)fl_filename_ext(buf); + if (ext) { + strlcpy(q,ext,buflen - (q - buf)); + } else *q = 0; + return(buf); +} + + +// +// End of "$Id: filename_setext.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_arc.cxx b/third_party/windows/fltk-1.1.10/src/fl_arc.cxx new file mode 100644 index 0000000..2ff9ef0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_arc.cxx @@ -0,0 +1,87 @@ +// +// "$Id: fl_arc.cxx 5349 2006-08-23 14:43:07Z matt $" +// +// Arc functions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Utility for drawing arcs and circles. They are added to +// the current fl_begin/fl_vertex/fl_end path. +// Incremental math implementation: + +#include +#include + +// avoid problems with some platforms that don't +// implement hypot. +static double _fl_hypot(double x, double y) { + return sqrt(x*x + y*y); +} + + +void fl_arc(double x, double y, double r, double start, double end) { + + // draw start point accurately: + + double A = start*(M_PI/180); // Initial angle (radians) + double X = r*cos(A); // Initial displacement, (X,Y) + double Y = -r*sin(A); // from center to initial point + fl_vertex(x+X,y+Y); // Insert initial point + + // Maximum arc length to approximate with chord with error <= 0.125 + + double epsilon; { + double r1 = _fl_hypot(fl_transform_dx(r,0), // Horizontal "radius" + fl_transform_dy(r,0)); + double r2 = _fl_hypot(fl_transform_dx(0,r), // Vertical "radius" + fl_transform_dy(0,r)); + + if (r1 > r2) r1 = r2; // r1 = minimum "radius" + if (r1 < 2.) r1 = 2.; // radius for circa 9 chords/circle + + epsilon = 2*acos(1.0 - 0.125/r1); // Maximum arc angle + } + A = end*(M_PI/180) - A; // Displacement angle (radians) + int i = int(ceil(fabs(A)/epsilon)); // Segments in approximation + + if (i) { + epsilon = A/i; // Arc length for equal-size steps + double cos_e = cos(epsilon); // Rotation coefficients + double sin_e = sin(epsilon); + do { + double Xnew = cos_e*X + sin_e*Y; + Y = -sin_e*X + cos_e*Y; + fl_vertex(x + (X=Xnew), y + Y); + } while (--i); + } +} + +#if 0 // portable version. X-specific one in fl_vertex.cxx +void fl_circle(double x,double y,double r) { + _fl_arc(x, y, r, r, 0, 360); +} +#endif + +// +// End of "$Id: fl_arc.cxx 5349 2006-08-23 14:43:07Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_arci.cxx b/third_party/windows/fltk-1.1.10/src/fl_arci.cxx new file mode 100644 index 0000000..1189bf2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_arci.cxx @@ -0,0 +1,126 @@ +// +// "$Id: fl_arci.cxx 5518 2006-10-11 01:23:52Z mike $" +// +// Arc (integer) drawing functions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// "integer" circle drawing functions. These draw the limited +// circle types provided by X and NT graphics. The advantage of +// these is that small ones draw quite nicely (probably due to stored +// hand-drawn bitmaps of small circles!) and may be implemented by +// hardware and thus are fast. + +// Probably should add fl_chord. + +// 3/10/98: created + +#include +#include +#ifdef WIN32 +# include +#endif +#ifdef __APPLE__ +# include +#endif + +void fl_arc(int x,int y,int w,int h,double a1,double a2) { + if (w <= 0 || h <= 0) return; +#ifdef WIN32 + int xa = x+w/2+int(w*cos(a1/180.0*M_PI)); + int ya = y+h/2-int(h*sin(a1/180.0*M_PI)); + int xb = x+w/2+int(w*cos(a2/180.0*M_PI)); + int yb = y+h/2-int(h*sin(a2/180.0*M_PI)); + if (fabs(a1 - a2) < 90) { + if (xa == xb && ya == yb) SetPixel(fl_gc, xa, ya, fl_RGB()); + else Arc(fl_gc, x, y, x+w, y+h, xa, ya, xb, yb); + } else Arc(fl_gc, x, y, x+w, y+h, xa, ya, xb, yb); +#elif defined(__APPLE_QD__) + Rect r; r.left=x; r.right=x+w; r.top=y; r.bottom=y+h; + a1 = a2-a1; a2 = 450-a2; + FrameArc(&r, (short int)a2, (short int)a1); +#elif defined(__APPLE_QUARTZ__) + a1 = (-a1)/180.0f*M_PI; a2 = (-a2)/180.0f*M_PI; + float cx = x + 0.5f*w - 0.5f, cy = y + 0.5f*h - 0.5f; + if (w!=h) { + CGContextSaveGState(fl_gc); + CGContextTranslateCTM(fl_gc, cx, cy); + CGContextScaleCTM(fl_gc, w-1.0f, h-1.0f); + CGContextAddArc(fl_gc, 0, 0, 0.5, a1, a2, 1); + CGContextRestoreGState(fl_gc); + } else { + float r = (w+h)*0.25f-0.5f; + CGContextAddArc(fl_gc, cx, cy, r, a1, a2, 1); + } + CGContextStrokePath(fl_gc); +#else + XDrawArc(fl_display, fl_window, fl_gc, x,y,w-1,h-1, int(a1*64),int((a2-a1)*64)); +#endif +} + +void fl_pie(int x,int y,int w,int h,double a1,double a2) { + if (w <= 0 || h <= 0) return; +#ifdef WIN32 + if (a1 == a2) return; + int xa = x+w/2+int(w*cos(a1/180.0*M_PI)); + int ya = y+h/2-int(h*sin(a1/180.0*M_PI)); + int xb = x+w/2+int(w*cos(a2/180.0*M_PI)); + int yb = y+h/2-int(h*sin(a2/180.0*M_PI)); + SelectObject(fl_gc, fl_brush()); + if (fabs(a1 - a2) < 90) { + if (xa == xb && ya == yb) { + MoveToEx(fl_gc, x+w/2, y+h/2, 0L); + LineTo(fl_gc, xa, ya); + SetPixel(fl_gc, xa, ya, fl_RGB()); + } else Pie(fl_gc, x, y, x+w, y+h, xa, ya, xb, yb); + } else Pie(fl_gc, x, y, x+w, y+h, xa, ya, xb, yb); +#elif defined(__APPLE_QD__) + Rect r; r.left=x; r.right=x+w; r.top=y; r.bottom=y+h; + a1 = a2-a1; a2 = 450-a2; + PaintArc(&r, (short int)a2, (short int)a1); +#elif defined(__APPLE_QUARTZ__) + a1 = (-a1)/180.0f*M_PI; a2 = (-a2)/180.0f*M_PI; + float cx = x + 0.5f*w - 0.5f, cy = y + 0.5f*h - 0.5f; + if (w!=h) { + CGContextSaveGState(fl_gc); + CGContextTranslateCTM(fl_gc, cx, cy); + CGContextScaleCTM(fl_gc, w, h); + CGContextAddArc(fl_gc, 0, 0, 0.5, a1, a2, 1); + CGContextAddLineToPoint(fl_gc, 0, 0); + CGContextClosePath(fl_gc); + CGContextRestoreGState(fl_gc); + } else { + float r = (w+h)*0.25f; + CGContextAddArc(fl_gc, cx, cy, r, a1, a2, 1); + CGContextAddLineToPoint(fl_gc, cx, cy); + CGContextClosePath(fl_gc); + } + CGContextFillPath(fl_gc); +#else + XFillArc(fl_display, fl_window, fl_gc, x,y,w-1,h-1, int(a1*64),int((a2-a1)*64)); +#endif +} + +// +// End of "$Id: fl_arci.cxx 5518 2006-10-11 01:23:52Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_ask.cxx b/third_party/windows/fltk-1.1.10/src/fl_ask.cxx new file mode 100644 index 0000000..8328566 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_ask.cxx @@ -0,0 +1,396 @@ +// +// "$Id: fl_ask.cxx 6870 2009-09-13 22:02:30Z AlbrechtS $" +// +// Standard dialog functions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Implementation of fl_message, fl_ask, fl_choice, fl_input +// The three-message fl_show_x functions are for forms compatibility +// mostly. In most cases it is easier to get a multi-line message +// by putting newlines in the message. + +#include +#include +#include "flstring.h" + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +static Fl_Window *message_form; +static Fl_Box *message; +static Fl_Box *icon; +static Fl_Button *button[3]; +static Fl_Input *input; +static const char *iconlabel = "?"; +Fl_Font fl_message_font_ = FL_HELVETICA; +uchar fl_message_size_ = 14; + +static char avoidRecursion = 0; + +static Fl_Window *makeform() { + if (message_form) { + message_form->size(410,103); + return message_form; + } + // make sure that the dialog does not become the child of some + // current group + Fl_Group *previously_current_group = Fl_Group::current(); + Fl_Group::current(0); + // create a new top level window + Fl_Window *w = message_form = new Fl_Window(410,103,""); + // w->clear_border(); + // w->box(FL_UP_BOX); + (message = new Fl_Box(60, 25, 340, 20)) + ->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_WRAP); + (input = new Fl_Input(60, 37, 340, 23))->hide(); + {Fl_Box* o = icon = new Fl_Box(10, 10, 50, 50); + o->box(FL_THIN_UP_BOX); + o->labelfont(FL_TIMES_BOLD); + o->labelsize(34); + o->color(FL_WHITE); + o->labelcolor(FL_BLUE); + } + button[0] = new Fl_Button(310, 70, 90, 23); + button[0]->shortcut(FL_Escape); + button[0]->align(FL_ALIGN_INSIDE|FL_ALIGN_WRAP); + button[1] = new Fl_Return_Button(210, 70, 90, 23); + button[1]->align(FL_ALIGN_INSIDE|FL_ALIGN_WRAP); + button[2] = new Fl_Button(110, 70, 90, 23); + button[2]->align(FL_ALIGN_INSIDE|FL_ALIGN_WRAP); + w->resizable(new Fl_Box(60,10,110-60,27)); + w->end(); + w->set_modal(); + Fl_Group::current(previously_current_group); + return w; +} + +/* + * 'resizeform()' - Resize the form and widgets so that they hold everything + * that is asked of them... + */ + +void resizeform() { + int i; + int message_w, message_h; + int text_height; + int button_w[3], button_h[3]; + int x, w, h, max_w, max_h; + const int icon_size = 50; + + fl_font(fl_message_font_, fl_message_size_); + message_w = message_h = 0; + fl_measure(message->label(), message_w, message_h); + + message_w += 10; + message_h += 10; + if (message_w < 340) + message_w = 340; + if (message_h < 30) + message_h = 30; + + fl_font(button[0]->labelfont(), button[0]->labelsize()); + + memset(button_w, 0, sizeof(button_w)); + memset(button_h, 0, sizeof(button_h)); + + for (max_h = 25, i = 0; i < 3; i ++) + if (button[i]->visible()) + { + fl_measure(button[i]->label(), button_w[i], button_h[i]); + + if (i == 1) + button_w[1] += 20; + + button_w[i] += 30; + button_h[i] += 10; + + if (button_h[i] > max_h) + max_h = button_h[i]; + } + + if (input->visible()) text_height = message_h + 25; + else text_height = message_h; + + max_w = message_w + 10 + icon_size; + w = button_w[0] + button_w[1] + button_w[2] - 10; + + if (w > max_w) + max_w = w; + + message_w = max_w - 10 - icon_size; + + w = max_w + 20; + h = max_h + 30 + text_height; + + message_form->size(w, h); + message_form->size_range(w, h, w, h); + + message->resize(20 + icon_size, 10, message_w, message_h); + icon->resize(10, 10, icon_size, icon_size); + icon->labelsize((uchar)(icon_size - 10)); + input->resize(20 + icon_size, 10 + message_h, message_w, 25); + + for (x = w, i = 0; i < 3; i ++) + if (button_w[i]) + { + x -= button_w[i]; + button[i]->resize(x, h - 10 - max_h, button_w[i] - 10, max_h); + +// printf("button %d (%s) is %dx%d+%d,%d\n", i, button[i]->label(), +// button[i]->w(), button[i]->h(), +// button[i]->x(), button[i]->y()); + } +} + +static int innards(const char* fmt, va_list ap, + const char *b0, + const char *b1, + const char *b2) +{ + Fl::pushed(0); // stop dragging (STR #2159) + + avoidRecursion = 1; + + makeform(); + char buffer[1024]; + if (!strcmp(fmt,"%s")) { + message->label(va_arg(ap, const char*)); + } else { + //: matt: MacOS provides two equally named vsnprintf's... + ::vsnprintf(buffer, 1024, fmt, ap); + message->label(buffer); + } + + message->labelfont(fl_message_font_); + message->labelsize(fl_message_size_); + if (b0) {button[0]->show(); button[0]->label(b0); button[1]->position(210,70);} + else {button[0]->hide(); button[1]->position(310,70);} + if (b1) {button[1]->show(); button[1]->label(b1);} + else button[1]->hide(); + if (b2) {button[2]->show(); button[2]->label(b2);} + else button[2]->hide(); + const char* prev_icon_label = icon->label(); + if (!prev_icon_label) icon->label(iconlabel); + + resizeform(); + + if (button[1]->visible() && !input->visible()) + button[1]->take_focus(); + message_form->hotspot(button[0]); + if (b0 && Fl_Widget::label_shortcut(b0)) + button[0]->shortcut(0); + else + button[0]->shortcut(FL_Escape); + + message_form->show(); + // deactivate Fl::grab(), because it is incompatible with Fl::readqueue() + Fl_Window* g = Fl::grab(); + if (g) Fl::grab(0); + int r = 0; + for (;;) { + Fl_Widget *o = Fl::readqueue(); + if (!o) Fl::wait(); + else if (o == button[0]) {r = 0; break;} + else if (o == button[1]) {r = 1; break;} + else if (o == button[2]) {r = 2; break;} + else if (o == message_form) {r = 0; break;} + } + if (g) // regrab the previous popup menu, if there was one + Fl::grab(g); + message_form->hide(); + icon->label(prev_icon_label); + + avoidRecursion = 0; + return r; +} + +// pointers you can use to change FLTK to a foreign language: +const char* fl_no = "No"; +const char* fl_yes= "Yes"; +const char* fl_ok = "OK"; +const char* fl_cancel= "Cancel"; +const char* fl_close= "Close"; + +// fltk functions: +void fl_beep(int type) { +#ifdef WIN32 + switch (type) { + case FL_BEEP_QUESTION : + case FL_BEEP_PASSWORD : + MessageBeep(MB_ICONQUESTION); + break; + case FL_BEEP_MESSAGE : + MessageBeep(MB_ICONASTERISK); + break; + case FL_BEEP_NOTIFICATION : + MessageBeep(MB_ICONASTERISK); + break; + case FL_BEEP_ERROR : + MessageBeep(MB_ICONERROR); + break; + default : + MessageBeep(0xFFFFFFFF); + break; + } +#elif defined(__APPLE__) + switch (type) { + case FL_BEEP_DEFAULT : + case FL_BEEP_ERROR : + SysBeep(30); + break; + default : + break; + } +#else + switch (type) { + case FL_BEEP_DEFAULT : + case FL_BEEP_ERROR : + if (!fl_display) fl_open_display(); + + XBell(fl_display, 100); + break; + default : + if (!fl_display) fl_open_display(); + + XBell(fl_display, 50); + break; + } +#endif // WIN32 +} + +void fl_message(const char *fmt, ...) { + + if (avoidRecursion) return; + + va_list ap; + + fl_beep(FL_BEEP_MESSAGE); + + va_start(ap, fmt); + iconlabel = "i"; + innards(fmt, ap, 0, fl_close, 0); + va_end(ap); + iconlabel = "?"; +} + +void fl_alert(const char *fmt, ...) { + + if (avoidRecursion) return; + + va_list ap; + + fl_beep(FL_BEEP_ERROR); + + va_start(ap, fmt); + iconlabel = "!"; + innards(fmt, ap, 0, fl_close, 0); + va_end(ap); + iconlabel = "?"; +} + +int fl_ask(const char *fmt, ...) { + + if (avoidRecursion) return 0; + + va_list ap; + + fl_beep(FL_BEEP_QUESTION); + + va_start(ap, fmt); + int r = innards(fmt, ap, fl_no, fl_yes, 0); + va_end(ap); + + return r; +} + +int fl_choice(const char*fmt,const char *b0,const char *b1,const char *b2,...){ + + if (avoidRecursion) return 0; + + va_list ap; + + fl_beep(FL_BEEP_QUESTION); + + va_start(ap, b2); + int r = innards(fmt, ap, b0, b1, b2); + va_end(ap); + return r; +} + +Fl_Widget *fl_message_icon() {makeform(); return icon;} + +static const char* input_innards(const char* fmt, va_list ap, + const char* defstr, uchar type) { + makeform(); + message->position(60,10); + input->type(type); + input->show(); + input->value(defstr); + input->take_focus(); + + int r = innards(fmt, ap, fl_cancel, fl_ok, 0); + input->hide(); + message->position(60,25); + return r ? input->value() : 0; +} + +const char* fl_input(const char *fmt, const char *defstr, ...) { + + if (avoidRecursion) return 0; + + fl_beep(FL_BEEP_QUESTION); + + va_list ap; + va_start(ap, defstr); + const char* r = input_innards(fmt, ap, defstr, FL_NORMAL_INPUT); + va_end(ap); + return r; +} + +const char *fl_password(const char *fmt, const char *defstr, ...) { + + if (avoidRecursion) return 0; + + fl_beep(FL_BEEP_PASSWORD); + + va_list ap; + va_start(ap, defstr); + const char* r = input_innards(fmt, ap, defstr, FL_SECRET_INPUT); + va_end(ap); + return r; +} + +// +// End of "$Id: fl_ask.cxx 6870 2009-09-13 22:02:30Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_boxtype.cxx b/third_party/windows/fltk-1.1.10/src/fl_boxtype.cxx new file mode 100644 index 0000000..f0d1e05 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_boxtype.cxx @@ -0,0 +1,322 @@ +// +// "$Id: fl_boxtype.cxx 5505 2006-10-03 02:35:12Z mike $" +// +// Box drawing code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Box drawing code for the common box types and the table of +// boxtypes. Other box types are in seperate files so they are not +// linked in if not used. + +#include +#include +#include +#include + +//////////////////////////////////////////////////////////////// + +static uchar active_ramp[24] = { + FL_GRAY_RAMP+0, FL_GRAY_RAMP+1, FL_GRAY_RAMP+2, FL_GRAY_RAMP+3, + FL_GRAY_RAMP+4, FL_GRAY_RAMP+5, FL_GRAY_RAMP+6, FL_GRAY_RAMP+7, + FL_GRAY_RAMP+8, FL_GRAY_RAMP+9, FL_GRAY_RAMP+10,FL_GRAY_RAMP+11, + FL_GRAY_RAMP+12,FL_GRAY_RAMP+13,FL_GRAY_RAMP+14,FL_GRAY_RAMP+15, + FL_GRAY_RAMP+16,FL_GRAY_RAMP+17,FL_GRAY_RAMP+18,FL_GRAY_RAMP+19, + FL_GRAY_RAMP+20,FL_GRAY_RAMP+21,FL_GRAY_RAMP+22,FL_GRAY_RAMP+23}; +static uchar inactive_ramp[24] = { + 43, 43, 44, 44, + 44, 45, 45, 46, + 46, 46, 47, 47, + 48, 48, 48, 49, + 49, 49, 50, 50, + 51, 51, 52, 52}; +static int draw_it_active = 1; + +int Fl::draw_box_active() { return draw_it_active; } + +uchar *fl_gray_ramp() {return (draw_it_active?active_ramp:inactive_ramp)-'A';} + +void fl_frame(const char* s, int x, int y, int w, int h) { + uchar *g = fl_gray_ramp(); + if (h > 0 && w > 0) for (;*s;) { + // draw top line: + fl_color(g[*s++]); + fl_xyline(x, y, x+w-1); + y++; if (--h <= 0) break; + // draw left line: + fl_color(g[*s++]); + fl_yxline(x, y+h-1, y); + x++; if (--w <= 0) break; + // draw bottom line: + fl_color(g[*s++]); + fl_xyline(x, y+h-1, x+w-1); + if (--h <= 0) break; + // draw right line: + fl_color(g[*s++]); + fl_yxline(x+w-1, y+h-1, y); + if (--w <= 0) break; + } +} + +void fl_frame2(const char* s, int x, int y, int w, int h) { + uchar *g = fl_gray_ramp(); + if (h > 0 && w > 0) for (;*s;) { + // draw bottom line: + fl_color(g[*s++]); + fl_xyline(x, y+h-1, x+w-1); + if (--h <= 0) break; + // draw right line: + fl_color(g[*s++]); + fl_yxline(x+w-1, y+h-1, y); + if (--w <= 0) break; + // draw top line: + fl_color(g[*s++]); + fl_xyline(x, y, x+w-1); + y++; if (--h <= 0) break; + // draw left line: + fl_color(g[*s++]); + fl_yxline(x, y+h-1, y); + x++; if (--w <= 0) break; + } +} + +void fl_no_box(int, int, int, int, Fl_Color) {} + +void fl_thin_down_frame(int x, int y, int w, int h, Fl_Color) { + fl_frame2("WWHH",x,y,w,h); +} + +void fl_thin_down_box(int x, int y, int w, int h, Fl_Color c) { + fl_thin_down_frame(x,y,w,h,c); + fl_color(draw_it_active ? c : fl_inactive(c)); + fl_rectf(x+1, y+1, w-2, h-2); +} + +void fl_thin_up_frame(int x, int y, int w, int h, Fl_Color) { + fl_frame2("HHWW",x,y,w,h); +} + +void fl_thin_up_box(int x, int y, int w, int h, Fl_Color c) { + fl_thin_up_frame(x,y,w,h,c); + fl_color(draw_it_active ? c : fl_inactive(c)); + fl_rectf(x+1, y+1, w-2, h-2); +} + +void fl_up_frame(int x, int y, int w, int h, Fl_Color) { +#if BORDER_WIDTH == 1 + fl_frame2("HHWW",x,y,w,h); +#else +#if BORDER_WIDTH == 2 + fl_frame2("AAWWMMTT",x,y,w,h); +#else + fl_frame("AAAAWWJJUTNN",x,y,w,h); +#endif +#endif +} + +#define D1 BORDER_WIDTH +#define D2 (BORDER_WIDTH+BORDER_WIDTH) + +void fl_up_box(int x, int y, int w, int h, Fl_Color c) { + fl_up_frame(x,y,w,h,c); + fl_color(draw_it_active ? c : fl_inactive(c)); + fl_rectf(x+D1, y+D1, w-D2, h-D2); +} + +void fl_down_frame(int x, int y, int w, int h, Fl_Color) { +#if BORDER_WIDTH == 1 + fl_frame2("WWHH",x,y,w,h); +#else +#if BORDER_WIDTH == 2 + fl_frame2("WWMMPPAA",x,y,w,h); +#else + fl_frame("NNTUJJWWAAAA",x,y,w,h); +#endif +#endif +} + +void fl_down_box(int x, int y, int w, int h, Fl_Color c) { + fl_down_frame(x,y,w,h,c); + fl_color(c); fl_rectf(x+D1, y+D1, w-D2, h-D2); +} + +void fl_engraved_frame(int x, int y, int w, int h, Fl_Color) { + fl_frame("HHWWWWHH",x,y,w,h); +} + +void fl_engraved_box(int x, int y, int w, int h, Fl_Color c) { + fl_engraved_frame(x,y,w,h,c); + fl_color(draw_it_active ? c : fl_inactive(c)); + fl_rectf(x+2, y+2, w-4, h-4); +} + +void fl_embossed_frame(int x, int y, int w, int h, Fl_Color) { + fl_frame("WWHHHHWW",x,y,w,h); +} + +void fl_embossed_box(int x, int y, int w, int h, Fl_Color c) { + fl_embossed_frame(x,y,w,h,c); + fl_color(draw_it_active ? c : fl_inactive(c)); + fl_rectf(x+2, y+2, w-4, h-4); +} + +void fl_rectbound(int x, int y, int w, int h, Fl_Color bgcolor) { + fl_color(draw_it_active ? FL_BLACK : fl_inactive(FL_BLACK)); + fl_rect(x, y, w, h); + fl_color(draw_it_active ? bgcolor : fl_inactive(bgcolor)); + fl_rectf(x+1, y+1, w-2, h-2); +} +#define fl_border_box fl_rectbound + +void fl_border_frame(int x, int y, int w, int h, Fl_Color c) { + fl_color(draw_it_active ? c : fl_inactive(c)); + fl_rect(x, y, w, h); +} + +//////////////////////////////////////////////////////////////// + +static struct { + Fl_Box_Draw_F *f; + uchar dx, dy, dw, dh; + int set; +} fl_box_table[256] = { +// must match list in Enumerations.H!!! + {fl_no_box, 0,0,0,0,1}, + {fl_rectf, 0,0,0,0,1}, // FL_FLAT_BOX + {fl_up_box, D1,D1,D2,D2,1}, + {fl_down_box, D1,D1,D2,D2,1}, + {fl_up_frame, D1,D1,D2,D2,1}, + {fl_down_frame, D1,D1,D2,D2,1}, + {fl_thin_up_box, 1,1,2,2,1}, + {fl_thin_down_box, 1,1,2,2,1}, + {fl_thin_up_frame, 1,1,2,2,1}, + {fl_thin_down_frame, 1,1,2,2,1}, + {fl_engraved_box, 2,2,4,4,1}, + {fl_embossed_box, 2,2,4,4,1}, + {fl_engraved_frame, 2,2,4,4,1}, + {fl_embossed_frame, 2,2,4,4,1}, + {fl_border_box, 1,1,2,2,1}, + {fl_border_box, 1,1,5,5,0}, // _FL_SHADOW_BOX, + {fl_border_frame, 1,1,2,2,1}, + {fl_border_frame, 1,1,5,5,0}, // _FL_SHADOW_FRAME, + {fl_border_box, 1,1,2,2,0}, // _FL_ROUNDED_BOX, + {fl_border_box, 1,1,2,2,0}, // _FL_RSHADOW_BOX, + {fl_border_frame, 1,1,2,2,0}, // _FL_ROUNDED_FRAME + {fl_rectf, 0,0,0,0,0}, // _FL_RFLAT_BOX, + {fl_up_box, 3,3,6,6,0}, // _FL_ROUND_UP_BOX + {fl_down_box, 3,3,6,6,0}, // _FL_ROUND_DOWN_BOX, + {fl_up_box, 0,0,0,0,0}, // _FL_DIAMOND_UP_BOX + {fl_down_box, 0,0,0,0,0}, // _FL_DIAMOND_DOWN_BOX + {fl_border_box, 1,1,2,2,0}, // _FL_OVAL_BOX, + {fl_border_box, 1,1,2,2,0}, // _FL_OVAL_SHADOW_BOX, + {fl_border_frame, 1,1,2,2,0}, // _FL_OVAL_FRAME + {fl_rectf, 0,0,0,0,0}, // _FL_OVAL_FLAT_BOX, + {fl_up_box, 4,4,8,8,0}, // _FL_PLASTIC_UP_BOX, + {fl_down_box, 2,2,4,4,0}, // _FL_PLASTIC_DOWN_BOX, + {fl_up_frame, 2,2,4,4,0}, // _FL_PLASTIC_UP_FRAME, + {fl_down_frame, 2,2,4,4,0}, // _FL_PLASTIC_DOWN_FRAME, + {fl_up_box, 2,2,4,4,0}, // _FL_PLASTIC_THIN_UP_BOX, + {fl_down_box, 2,2,4,4,0}, // _FL_PLASTIC_THIN_DOWN_BOX, + {fl_up_box, 2,2,4,4,0}, // _FL_PLASTIC_ROUND_UP_BOX, + {fl_down_box, 2,2,4,4,0}, // _FL_PLASTIC_ROUND_DOWN_BOX, + {fl_up_box, 2,2,4,4,0}, // _FL_GTK_UP_BOX, + {fl_down_box, 2,2,4,4,0}, // _FL_GTK_DOWN_BOX, + {fl_up_frame, 2,2,4,4,0}, // _FL_GTK_UP_FRAME, + {fl_down_frame, 2,2,4,4,0}, // _FL_GTK_DOWN_FRAME, + {fl_up_frame, 1,1,2,2,0}, // _FL_GTK_THIN_UP_FRAME, + {fl_down_frame, 1,1,2,2,0}, // _FL_GTK_THIN_DOWN_FRAME, + {fl_up_box, 1,1,2,2,0}, // _FL_GTK_THIN_ROUND_UP_BOX, + {fl_down_box, 1,1,2,2,0}, // _FL_GTK_THIN_ROUND_DOWN_BOX, + {fl_up_box, 2,2,4,4,0}, // _FL_GTK_ROUND_UP_BOX, + {fl_down_box, 2,2,4,4,0}, // _FL_GTK_ROUND_DOWN_BOX, + {fl_up_box, 3,3,6,6,0}, // FL_FREE_BOX+0 + {fl_down_box, 3,3,6,6,0}, // FL_FREE_BOX+1 + {fl_up_box, 3,3,6,6,0}, // FL_FREE_BOX+2 + {fl_down_box, 3,3,6,6,0}, // FL_FREE_BOX+3 + {fl_up_box, 3,3,6,6,0}, // FL_FREE_BOX+4 + {fl_down_box, 3,3,6,6,0}, // FL_FREE_BOX+5 + {fl_up_box, 3,3,6,6,0}, // FL_FREE_BOX+6 + {fl_down_box, 3,3,6,6,0}, // FL_FREE_BOX+7 +}; + +int Fl::box_dx(Fl_Boxtype t) {return fl_box_table[t].dx;} +int Fl::box_dy(Fl_Boxtype t) {return fl_box_table[t].dy;} +int Fl::box_dw(Fl_Boxtype t) {return fl_box_table[t].dw;} +int Fl::box_dh(Fl_Boxtype t) {return fl_box_table[t].dh;} + +void fl_internal_boxtype(Fl_Boxtype t, Fl_Box_Draw_F* f) { + if (!fl_box_table[t].set) { + fl_box_table[t].f = f; + fl_box_table[t].set = 1; + } +} + +Fl_Box_Draw_F *Fl::get_boxtype(Fl_Boxtype t) { + return fl_box_table[t].f; +} + +void Fl::set_boxtype(Fl_Boxtype t, Fl_Box_Draw_F* f, + uchar a, uchar b, uchar c, uchar d) { + fl_box_table[t].f = f; + fl_box_table[t].set = 1; + fl_box_table[t].dx = a; + fl_box_table[t].dy = b; + fl_box_table[t].dw = c; + fl_box_table[t].dh = d; +} + +void Fl::set_boxtype(Fl_Boxtype t, Fl_Boxtype f) { + fl_box_table[t] = fl_box_table[f]; +} + +void fl_draw_box(Fl_Boxtype t, int x, int y, int w, int h, Fl_Color c) { + if (t && fl_box_table[t].f) fl_box_table[t].f(x,y,w,h,c); +} + +//extern Fl_Widget *fl_boxcheat; // hack set by Fl_Window.cxx + +void Fl_Widget::draw_box() const { + int t = box_; + if (!t) return; +// if (this == fl_boxcheat) { +// fl_boxcheat = 0; +// if (t == FL_FLAT_BOX) return; +// t += 2; // convert box to frame +// } + draw_box((Fl_Boxtype)t, x_, y_, w_, h_, (Fl_Color)color_); +} + +void Fl_Widget::draw_box(Fl_Boxtype b, Fl_Color c) const { + draw_box(b, x_, y_, w_, h_, c); +} + +void Fl_Widget::draw_box(Fl_Boxtype b, int X, int Y, int W, int H, Fl_Color c) +const { + draw_it_active = active_r(); + fl_box_table[b].f(X, Y, W, H, c); + draw_it_active = 1; +} + +// +// End of "$Id: fl_boxtype.cxx 5505 2006-10-03 02:35:12Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_call_main.c b/third_party/windows/fltk-1.1.10/src/fl_call_main.c new file mode 100644 index 0000000..5865497 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_call_main.c @@ -0,0 +1,107 @@ +/* + * "$Id: fl_call_main.c 5848 2007-05-20 16:18:31Z mike $" + * + * Copyright 1998-2005 by Bill Spitzak and others. + * + * fl_call_main() calls main() for you Windows people. Needs to be done in C + * because Borland C++ won't let you call main() from C++. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems on the following page: + * + * http://www.fltk.org/str.php + */ + +/* + * This WinMain() function can be overridden by an application and + * is provided for compatibility with programs written for other + * operating systems that conform to the ANSI standard entry point + * "main()". This will allow you to build a WIN32 Application + * without any special settings. + * + * Because of problems with the Microsoft Visual C++ header files + * and/or compiler, you cannot have a WinMain function in a DLL. + * I don't know why. Thus, this nifty feature is only available + * if you link to the static library. + * + * Currently the debug version of this library will create a + * console window for your application so you can put printf() + * statements for debugging or informational purposes. Ultimately + * we want to update this to always use the parent's console, + * but at present we have not identified a function or API in + * Microsoft(r) Windows(r) that allows for it. + */ + +#if defined(WIN32) && !defined(FL_DLL) && !defined (__GNUC__) + +# include +# include +# include + +# ifdef __MWERKS__ +# include +# endif + +extern int main(int, char *[]); + +# ifdef BORLAND5 +# define __argc _argc +# define __argv _argv +# endif /* BORLAND5 */ + +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, + LPSTR lpCmdLine, int nCmdShow) { + int rc; + +# ifdef _DEBUG + /* + * If we are using compiling in debug mode, open a console window so + * we can see any printf's, etc... + * + * While we can detect if the program was run from the command-line - + * look at the CMDLINE environment variable, it will be "WIN" for + * programs started from the GUI - the shell seems to run all WIN32 + * applications in the background anyways... + */ + + AllocConsole(); + freopen("conin$", "r", stdin); + freopen("conout$", "w", stdout); + freopen("conout$", "w", stderr); +# endif /* _DEBUG */ + + /* Run the standard main entry point function... */ + rc = main(__argc, __argv); + +# ifdef _DEBUG + fclose(stdin); + fclose(stdout); + fclose(stderr); +# endif /* _DEBUG */ + + return rc; +} + +#elif defined(__hpux) +/* This code to prevent "empty translation unit" or similar warnings... */ +static void dummy(void) {} +#endif // WIN32 && !FL_DLL && !__GNUC__ + +/* + * End of "$Id: fl_call_main.c 5848 2007-05-20 16:18:31Z mike $". + */ + diff --git a/third_party/windows/fltk-1.1.10/src/fl_cmap.h b/third_party/windows/fltk-1.1.10/src/fl_cmap.h new file mode 100644 index 0000000..19b4202 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_cmap.h @@ -0,0 +1,256 @@ + 0x00000000, + 0xff000000, + 0x00ff0000, + 0xffff0000, + 0x0000ff00, + 0xff00ff00, + 0x00ffff00, + 0xffffff00, + 0x55555500, + 0xc6717100, + 0x71c67100, + 0x8e8e3800, + 0x7171c600, + 0x8e388e00, + 0x388e8e00, + 0x00008000, + 0xa8a89800, + 0xe8e8d800, + 0x68685800, + 0x98a8a800, + 0xd8e8e800, + 0x58686800, + 0x9c9ca800, + 0xdcdce800, + 0x5c5c6800, + 0x9ca89c00, + 0xdce8dc00, + 0x5c685c00, + 0x90909000, + 0xc0c0c000, + 0x50505000, + 0xa0a0a000, + 0x00000000, + 0x0d0d0d00, + 0x1a1a1a00, + 0x26262600, + 0x31313100, + 0x3d3d3d00, + 0x48484800, + 0x55555500, + 0x5f5f5f00, + 0x6a6a6a00, + 0x75757500, + 0x80808000, + 0x8a8a8a00, + 0x95959500, + 0xa0a0a000, + 0xaaaaaa00, + 0xb5b5b500, + 0xc0c0c000, + 0xcbcbcb00, + 0xd5d5d500, + 0xe0e0e000, + 0xeaeaea00, + 0xf5f5f500, + 0xffffff00, + 0x00000000, + 0x00240000, + 0x00480000, + 0x006d0000, + 0x00910000, + 0x00b60000, + 0x00da0000, + 0x00ff0000, + 0x3f000000, + 0x3f240000, + 0x3f480000, + 0x3f6d0000, + 0x3f910000, + 0x3fb60000, + 0x3fda0000, + 0x3fff0000, + 0x7f000000, + 0x7f240000, + 0x7f480000, + 0x7f6d0000, + 0x7f910000, + 0x7fb60000, + 0x7fda0000, + 0x7fff0000, + 0xbf000000, + 0xbf240000, + 0xbf480000, + 0xbf6d0000, + 0xbf910000, + 0xbfb60000, + 0xbfda0000, + 0xbfff0000, + 0xff000000, + 0xff240000, + 0xff480000, + 0xff6d0000, + 0xff910000, + 0xffb60000, + 0xffda0000, + 0xffff0000, + 0x00003f00, + 0x00243f00, + 0x00483f00, + 0x006d3f00, + 0x00913f00, + 0x00b63f00, + 0x00da3f00, + 0x00ff3f00, + 0x3f003f00, + 0x3f243f00, + 0x3f483f00, + 0x3f6d3f00, + 0x3f913f00, + 0x3fb63f00, + 0x3fda3f00, + 0x3fff3f00, + 0x7f003f00, + 0x7f243f00, + 0x7f483f00, + 0x7f6d3f00, + 0x7f913f00, + 0x7fb63f00, + 0x7fda3f00, + 0x7fff3f00, + 0xbf003f00, + 0xbf243f00, + 0xbf483f00, + 0xbf6d3f00, + 0xbf913f00, + 0xbfb63f00, + 0xbfda3f00, + 0xbfff3f00, + 0xff003f00, + 0xff243f00, + 0xff483f00, + 0xff6d3f00, + 0xff913f00, + 0xffb63f00, + 0xffda3f00, + 0xffff3f00, + 0x00007f00, + 0x00247f00, + 0x00487f00, + 0x006d7f00, + 0x00917f00, + 0x00b67f00, + 0x00da7f00, + 0x00ff7f00, + 0x3f007f00, + 0x3f247f00, + 0x3f487f00, + 0x3f6d7f00, + 0x3f917f00, + 0x3fb67f00, + 0x3fda7f00, + 0x3fff7f00, + 0x7f007f00, + 0x7f247f00, + 0x7f487f00, + 0x7f6d7f00, + 0x7f917f00, + 0x7fb67f00, + 0x7fda7f00, + 0x7fff7f00, + 0xbf007f00, + 0xbf247f00, + 0xbf487f00, + 0xbf6d7f00, + 0xbf917f00, + 0xbfb67f00, + 0xbfda7f00, + 0xbfff7f00, + 0xff007f00, + 0xff247f00, + 0xff487f00, + 0xff6d7f00, + 0xff917f00, + 0xffb67f00, + 0xffda7f00, + 0xffff7f00, + 0x0000bf00, + 0x0024bf00, + 0x0048bf00, + 0x006dbf00, + 0x0091bf00, + 0x00b6bf00, + 0x00dabf00, + 0x00ffbf00, + 0x3f00bf00, + 0x3f24bf00, + 0x3f48bf00, + 0x3f6dbf00, + 0x3f91bf00, + 0x3fb6bf00, + 0x3fdabf00, + 0x3fffbf00, + 0x7f00bf00, + 0x7f24bf00, + 0x7f48bf00, + 0x7f6dbf00, + 0x7f91bf00, + 0x7fb6bf00, + 0x7fdabf00, + 0x7fffbf00, + 0xbf00bf00, + 0xbf24bf00, + 0xbf48bf00, + 0xbf6dbf00, + 0xbf91bf00, + 0xbfb6bf00, + 0xbfdabf00, + 0xbfffbf00, + 0xff00bf00, + 0xff24bf00, + 0xff48bf00, + 0xff6dbf00, + 0xff91bf00, + 0xffb6bf00, + 0xffdabf00, + 0xffffbf00, + 0x0000ff00, + 0x0024ff00, + 0x0048ff00, + 0x006dff00, + 0x0091ff00, + 0x00b6ff00, + 0x00daff00, + 0x00ffff00, + 0x3f00ff00, + 0x3f24ff00, + 0x3f48ff00, + 0x3f6dff00, + 0x3f91ff00, + 0x3fb6ff00, + 0x3fdaff00, + 0x3fffff00, + 0x7f00ff00, + 0x7f24ff00, + 0x7f48ff00, + 0x7f6dff00, + 0x7f91ff00, + 0x7fb6ff00, + 0x7fdaff00, + 0x7fffff00, + 0xbf00ff00, + 0xbf24ff00, + 0xbf48ff00, + 0xbf6dff00, + 0xbf91ff00, + 0xbfb6ff00, + 0xbfdaff00, + 0xbfffff00, + 0xff00ff00, + 0xff24ff00, + 0xff48ff00, + 0xff6dff00, + 0xff91ff00, + 0xffb6ff00, + 0xffdaff00, + 0xffffff00 diff --git a/third_party/windows/fltk-1.1.10/src/fl_color.cxx b/third_party/windows/fltk-1.1.10/src/fl_color.cxx new file mode 100644 index 0000000..a08fe8a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_color.cxx @@ -0,0 +1,389 @@ +// +// "$Id: fl_color.cxx 5835 2007-05-16 11:46:07Z matt $" +// +// Color functions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Implementation of fl_color(i), fl_color(r,g,b). + +#ifdef WIN32 +# include "fl_color_win32.cxx" +#elif defined(__APPLE__) +# include "fl_color_mac.cxx" +#else + +// Also code to look at the X visual and figure out the best way to turn +// a color into a pixel value. + +// SGI compiler seems to have problems with unsigned char arguments +// being used to index arrays. So I always copy them to an integer +// before use. + +# include "Fl_XColor.H" +# include +# include +# include + +//////////////////////////////////////////////////////////////// +// figure_out_visual() calculates masks & shifts for generating +// pixels in true-color visuals: + +uchar fl_redmask, fl_greenmask, fl_bluemask; +int fl_redshift, fl_greenshift, fl_blueshift, fl_extrashift; +static uchar beenhere; + +static void figure_out_visual() { + beenhere = 1; + if (!fl_visual->red_mask || !fl_visual->green_mask || !fl_visual->blue_mask){ +# if USE_COLORMAP + fl_redmask = 0; + return; +# else + Fl::fatal("Requires true color visual"); +# endif + } + + // get the bit masks into a more useful form: + int i,j,m; + + for (i = 0, m = 1; m; i++, m<<=1) if (fl_visual->red_mask & m) break; + for (j = i; m; j++, m<<=1) if (!(fl_visual->red_mask & m)) break; + fl_redshift = j-8; + fl_redmask = (j-i >= 8) ? 0xFF : 0xFF-(255>>(j-i)); + + for (i = 0, m = 1; m; i++, m<<=1) if (fl_visual->green_mask & m) break; + for (j = i; m; j++, m<<=1) if (!(fl_visual->green_mask & m)) break; + fl_greenshift = j-8; + fl_greenmask = (j-i >= 8) ? 0xFF : 0xFF-(255>>(j-i)); + + for (i = 0, m = 1; m; i++, m<<=1) if (fl_visual->blue_mask & m) break; + for (j = i; m; j++, m<<=1) if (!(fl_visual->blue_mask & m)) break; + fl_blueshift = j-8; + fl_bluemask = (j-i >= 8) ? 0xFF : 0xFF-(255>>(j-i)); + + i = fl_redshift; + if (fl_greenshift < i) i = fl_greenshift; + if (fl_blueshift < i) i = fl_blueshift; + if (i < 0) { + fl_extrashift = -i; + fl_redshift -= i; fl_greenshift -= i; fl_blueshift -= i; + } else + fl_extrashift = 0; + +} + +static unsigned fl_cmap[256] = { +#include "fl_cmap.h" // this is a file produced by "cmap.cxx": +}; + +# if HAVE_OVERLAY +Fl_XColor fl_xmap[2][256]; +uchar fl_overlay; +Colormap fl_overlay_colormap; +XVisualInfo* fl_overlay_visual; +ulong fl_transparent_pixel; +# else +Fl_XColor fl_xmap[1][256]; +# define fl_overlay 0 +# endif + +//////////////////////////////////////////////////////////////// +// Get an rgb color. This is easy for a truecolor visual. For +// colormapped it picks the closest color out of the cube in the +// fltk colormap. However if this color cube entry has been +// requested before, you will get the earlier requested color, and +// even this may be approximated if the X colormap was full. + +ulong fl_xpixel(uchar r,uchar g,uchar b) { + if (!beenhere) figure_out_visual(); +# if USE_COLORMAP + if (!fl_redmask) { + // find closest entry in the colormap: + Fl_Color i = + fl_color_cube(r*FL_NUM_RED/256,g*FL_NUM_GREEN/256,b*FL_NUM_BLUE/256); + Fl_XColor &xmap = fl_xmap[fl_overlay][i]; + if (xmap.mapped) return xmap.pixel; + // if not black or white, change the entry to be an exact match: + if (i != FL_COLOR_CUBE && i != 0xFF) + fl_cmap[i] = (r<<24)|(g<<16)|(b<<8); + return fl_xpixel(i); // allocate an X color + } +# endif + return + (((r&fl_redmask) << fl_redshift)+ + ((g&fl_greenmask)<> fl_extrashift; +} + +void fl_color(uchar r,uchar g,uchar b) { + fl_color_ = fl_rgb_color(r, g, b); + XSetForeground(fl_display, fl_gc, fl_xpixel(r,g,b)); +} + +//////////////////////////////////////////////////////////////// +// Get a color out of the the fltk colormap. Again for truecolor +// visuals this is easy. For colormap this actually tries to allocate +// an X color, and does a least-squares match to find the closest +// color if X cannot allocate that color. + +// calculate what color is actually on the screen for a mask: +static inline uchar realcolor(uchar color, uchar mask) { +# if 0 + // accurate version if the display has linear gamma, but fl_draw_image + // works better with the simpler version on most screens... + uchar m = mask; + uchar result = color&m; + for (;;) { + while (m&mask) {m>>=1; color>>=1;} + if (!m) break; + mask = m; + result |= color&m; + } + return result; +# else + return (color&mask) | (~mask)&(mask>>1); +# endif +} + +ulong fl_xpixel(Fl_Color i) { + if (i & 0xffffff00) { + return fl_xpixel((i >> 24) & 255, (i >> 16) & 255, (i >> 8) & 255); + } + + Fl_XColor &xmap = fl_xmap[fl_overlay][i]; + if (xmap.mapped) return xmap.pixel; + + if (!beenhere) figure_out_visual(); + + uchar r,g,b; + {unsigned c = fl_cmap[i]; r=uchar(c>>24); g=uchar(c>>16); b=uchar(c>>8);} + +# if USE_COLORMAP + Colormap colormap = fl_colormap; +# if HAVE_OVERLAY + if (fl_overlay) colormap = fl_overlay_colormap; else +# endif + if (fl_redmask) { +# endif + // return color for a truecolor visual: + xmap.mapped = 2; // 2 prevents XFreeColor from being called + xmap.r = realcolor(r, fl_redmask); + xmap.g = realcolor(g, fl_greenmask); + xmap.b = realcolor(b, fl_bluemask); + return xmap.pixel = + (((r&fl_redmask) << fl_redshift)+ + ((g&fl_greenmask)<> fl_extrashift; +# if USE_COLORMAP + } +# if HAVE_OVERLAY + static XColor* ac[2]; + XColor*& allcolors = ac[fl_overlay]; + static int nc[2]; + int& numcolors = nc[fl_overlay]; +# else + static XColor *allcolors; + static int numcolors; +# endif + + // I don't try to allocate colors with XAllocColor once it fails + // with any color. It is possible that it will work, since a color + // may have been freed, but some servers are extremely slow and this + // avoids one round trip: + if (!numcolors) { // don't try after a failure + XColor xcol; + xcol.red = r<<8; xcol.green = g<<8; xcol.blue = b<<8; + if (XAllocColor(fl_display, colormap, &xcol)) { + xmap.mapped = 1; + xmap.r = xcol.red>>8; + xmap.g = xcol.green>>8; + xmap.b = xcol.blue>>8; + return xmap.pixel = xcol.pixel; + } + + // I only read the colormap once. Again this is due to the slowness + // of round-trips to the X server, even though other programs may alter + // the colormap after this and make decisions here wrong. +# if HAVE_OVERLAY + if (fl_overlay) numcolors = fl_overlay_visual->colormap_size; else +# endif + numcolors = fl_visual->colormap_size; + if (!allcolors) allcolors = new XColor[numcolors]; + for (int p = numcolors; p--;) allcolors[p].pixel = p; + XQueryColors(fl_display, colormap, allcolors, numcolors); + } + + // find least-squares match: + int mindist = 0x7FFFFFFF; + unsigned int bestmatch = 0; + for (unsigned int n = numcolors; n--;) { +# if HAVE_OVERLAY + if (fl_overlay && n == fl_transparent_pixel) continue; +# endif + XColor &a = allcolors[n]; + int d, t; + t = int(r)-int(a.red>>8); d = t*t; + t = int(g)-int(a.green>>8); d += t*t; + t = int(b)-int(a.blue>>8); d += t*t; + if (d <= mindist) {bestmatch = n; mindist = d;} + } + XColor &p = allcolors[bestmatch]; + + // It appears to "work" to not call this XAllocColor, which will + // avoid another round-trip to the server. But then X does not + // know that this program "owns" this value, and can (and will) + // change it when the program that did allocate it exits: + if (XAllocColor(fl_display, colormap, &p)) { + xmap.mapped = 1; + xmap.pixel = p.pixel; + } else { + // However, if that XAllocColor fails, I have to give up and + // assumme the pixel is ok for the duration of the program. This + // is due to bugs (?) in the Solaris X and some X terminals + // where XAllocColor *always* fails when the colormap is full, + // even if we ask for a color already in it... + xmap.mapped = 2; // 2 prevents XFreeColor from being called + xmap.pixel = bestmatch; + } + xmap.r = p.red>>8; + xmap.g = p.green>>8; + xmap.b = p.blue>>8; + return xmap.pixel; +# endif +} + +Fl_Color fl_color_; + +void fl_color(Fl_Color i) { + if (i & 0xffffff00) { + unsigned rgb = (unsigned)i; + fl_color((uchar)(rgb >> 24), (uchar)(rgb >> 16), (uchar)(rgb >> 8)); + } else { + fl_color_ = i; + XSetForeground(fl_display, fl_gc, fl_xpixel(i)); + } +} + +void Fl::free_color(Fl_Color i, int overlay) { +# if HAVE_OVERLAY +# else + if (overlay) return; +# endif + if (fl_xmap[overlay][i].mapped) { +# if USE_COLORMAP +# if HAVE_OVERLAY + Colormap colormap = overlay ? fl_overlay_colormap : fl_colormap; +# else + Colormap colormap = fl_colormap; +# endif + if (fl_xmap[overlay][i].mapped == 1) + XFreeColors(fl_display, colormap, &(fl_xmap[overlay][i].pixel), 1, 0); +# endif + fl_xmap[overlay][i].mapped = 0; + } +} + +void Fl::set_color(Fl_Color i, unsigned c) { + if (fl_cmap[i] != c) { + free_color(i,0); +# if HAVE_OVERLAY + free_color(i,1); +# endif + fl_cmap[i] = c; + } +} + +#endif // end of X-specific code + +unsigned Fl::get_color(Fl_Color i) { + if (i & 0xffffff00) return (i); + else return fl_cmap[i]; +} + +void Fl::set_color(Fl_Color i, uchar red, uchar green, uchar blue) { + Fl::set_color((Fl_Color)(i & 255), + ((unsigned)red<<24)+((unsigned)green<<16)+((unsigned)blue<<8)); +} + +void Fl::get_color(Fl_Color i, uchar &red, uchar &green, uchar &blue) { + unsigned c; + + if (i & 0xffffff00) c = (unsigned)i; + else c = fl_cmap[i]; + + red = uchar(c>>24); + green = uchar(c>>16); + blue = uchar(c>>8); +} + +Fl_Color fl_color_average(Fl_Color color1, Fl_Color color2, float weight) { + unsigned rgb1; + unsigned rgb2; + uchar r, g, b; + + if (color1 & 0xffffff00) rgb1 = color1; + else rgb1 = fl_cmap[color1 & 255]; + + if (color2 & 0xffffff00) rgb2 = color2; + else rgb2 = fl_cmap[color2 & 255]; + + r = (uchar)(((uchar)(rgb1>>24))*weight + ((uchar)(rgb2>>24))*(1-weight)); + g = (uchar)(((uchar)(rgb1>>16))*weight + ((uchar)(rgb2>>16))*(1-weight)); + b = (uchar)(((uchar)(rgb1>>8))*weight + ((uchar)(rgb2>>8))*(1-weight)); + + return fl_rgb_color(r, g, b); +} + +Fl_Color fl_inactive(Fl_Color c) { + return fl_color_average(c, FL_GRAY, .33f); +} + +Fl_Color fl_contrast(Fl_Color fg, Fl_Color bg) { + unsigned c1, c2; // RGB colors + int l1, l2; // Luminosities + + + // Get the RGB values for each color... + if (fg & 0xffffff00) c1 = (unsigned)fg; + else c1 = fl_cmap[fg]; + + if (bg & 0xffffff00) c2 = (unsigned)bg; + else c2 = fl_cmap[bg]; + + // Compute the luminosity... + l1 = ((c1 >> 24) * 30 + ((c1 >> 16) & 255) * 59 + ((c1 >> 8) & 255) * 11) / 100; + l2 = ((c2 >> 24) * 30 + ((c2 >> 16) & 255) * 59 + ((c2 >> 8) & 255) * 11) / 100; + + // Compare and return the contrasting color... + if ((l1 - l2) > 99) return fg; + else if ((l2 - l1) > 99) return fg; + else if (l2 > 127) return FL_BLACK; + else return FL_WHITE; +} + +// +// End of "$Id: fl_color.cxx 5835 2007-05-16 11:46:07Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_color_mac.cxx b/third_party/windows/fltk-1.1.10/src/fl_color_mac.cxx new file mode 100644 index 0000000..55f3e29 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_color_mac.cxx @@ -0,0 +1,114 @@ +// +// "$Id: fl_color_mac.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// MacOS color functions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// The fltk "colormap". This allows ui colors to be stored in 8-bit +// locations, and provides a level of indirection so that global color +// changes can be made. Not to be confused with the X colormap, which +// I try to hide completely. + +// matt: Neither Quartz nor Quickdraw support colormaps in this implementation +// matt: Quartz support done + +#include +#include +#include +#include + +static unsigned fl_cmap[256] = { +#include "fl_cmap.h" // this is a file produced by "cmap.cxx": +}; + +// Translations to mac data structures: +Fl_XMap fl_xmap[256]; + +Fl_XMap* fl_current_xmap; + +Fl_Color fl_color_; + +void fl_color(Fl_Color i) { + fl_color_ = i; + int index; + uchar r, g, b; + if (i & 0xFFFFFF00) { + // translate rgb colors into color index + r = i>>24; + g = i>>16; + b = i>> 8; + } else { + // translate index into rgb: + index = i; + unsigned c = fl_cmap[i]; + r = c>>24; + g = c>>16; + b = c>> 8; + } +#ifdef __APPLE_QD__ + RGBColor rgb; + rgb.red = (r<<8)|r; + rgb.green = (g<<8)|g; + rgb.blue = (b<<8)|b; + RGBForeColor(&rgb); +#elif defined(__APPLE_QUARTZ__) + if (!fl_gc) return; // no context yet? We will assign the color later. + float fr = r/255.0f; + float fg = g/255.0f; + float fb = b/255.0f; + CGContextSetRGBFillColor(fl_gc, fr, fg, fb, 1.0f); + CGContextSetRGBStrokeColor(fl_gc, fr, fg, fb, 1.0f); +#else +# error : neither Quickdraw nor Quartz defined +#endif +} + +void fl_color(uchar r, uchar g, uchar b) { + fl_color_ = fl_rgb_color(r, g, b); +#ifdef __APPLE_QD__ + RGBColor rgb; + rgb.red = (r<<8)|r; + rgb.green = (g<<8)|g; + rgb.blue = (b<<8)|b; + RGBForeColor(&rgb); +#elif defined(__APPLE_QUARTZ__) + float fr = r/255.0f; + float fg = g/255.0f; + float fb = b/255.0f; + CGContextSetRGBFillColor(fl_gc, fr, fg, fb, 1.0f); + CGContextSetRGBStrokeColor(fl_gc, fr, fg, fb, 1.0f); +#else +# error : neither Quickdraw nor Quartz defined +#endif +} + +void Fl::set_color(Fl_Color i, unsigned c) { + if (fl_cmap[i] != c) { + fl_cmap[i] = c; + } +} + +// +// End of "$Id: fl_color_mac.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_color_win32.cxx b/third_party/windows/fltk-1.1.10/src/fl_color_win32.cxx new file mode 100644 index 0000000..1e2a7da --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_color_win32.cxx @@ -0,0 +1,254 @@ +// +// "$Id: fl_color_win32.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// WIN32 color functions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// The fltk "colormap". This allows ui colors to be stored in 8-bit +// locations, and provides a level of indirection so that global color +// changes can be made. Not to be confused with the X colormap, which +// I try to hide completely. + +// SGI compiler seems to have problems with unsigned char arguments +// being used to index arrays. So I always copy them to an integer +// before use. + +#include +#include +#include +#include + +static unsigned fl_cmap[256] = { +#include "fl_cmap.h" // this is a file produced by "cmap.cxx": +}; + +// Translations to win32 data structures: +Fl_XMap fl_xmap[256]; + +Fl_XMap* fl_current_xmap; + +HPALETTE fl_palette; +static HGDIOBJ tmppen=0; +static HPEN savepen=0; + +void fl_cleanup_pens(void) { + for (int i=0; i<256; i++) { + if (fl_xmap[i].pen) DeleteObject(fl_xmap[i].pen); + } +} + +void fl_save_pen(void) { + if(!tmppen) tmppen = CreatePen(PS_SOLID, 1, 0); + savepen = (HPEN)SelectObject(fl_gc, tmppen); +} + +void fl_restore_pen(void) { + if (savepen) SelectObject(fl_gc, savepen); + DeleteObject(tmppen); + tmppen = 0; + savepen = 0; +} + +static void clear_xmap(Fl_XMap& xmap) { + if (xmap.pen) { + HGDIOBJ tmppen = GetStockObject(BLACK_PEN); + HGDIOBJ oldpen = SelectObject(fl_gc, tmppen); // Push out the current pen of the gc + if(oldpen != xmap.pen) SelectObject(fl_gc, oldpen); // Put it back if it is not the one we are about to delete + DeleteObject((HGDIOBJ)(xmap.pen)); + xmap.pen = 0; + xmap.brush = -1; + } +} + +static void set_xmap(Fl_XMap& xmap, COLORREF c) { + xmap.rgb = c; + if (xmap.pen) { + HGDIOBJ oldpen = SelectObject(fl_gc,GetStockObject(BLACK_PEN)); // replace current pen with safe one + if (oldpen != xmap.pen)SelectObject(fl_gc,oldpen); // if old one not xmap.pen, need to put it back + DeleteObject(xmap.pen); // delete pen + } + xmap.pen = CreatePen(PS_SOLID, 1, xmap.rgb); // get a pen into xmap.pen + xmap.brush = -1; +} + +Fl_Color fl_color_; + +void fl_color(Fl_Color i) { + if (i & 0xffffff00) { + unsigned rgb = (unsigned)i; + fl_color((uchar)(rgb >> 24), (uchar)(rgb >> 16), (uchar)(rgb >> 8)); + } else { + fl_color_ = i; + Fl_XMap &xmap = fl_xmap[i]; + if (!xmap.pen) { +#if USE_COLORMAP + if (fl_palette) { + set_xmap(xmap, PALETTEINDEX(i)); + } else { +#endif + unsigned c = fl_cmap[i]; + set_xmap(xmap, RGB(uchar(c>>24), uchar(c>>16), uchar(c>>8))); +#if USE_COLORMAP + } +#endif + } + fl_current_xmap = ⟼ + SelectObject(fl_gc, (HGDIOBJ)(xmap.pen)); + } +} + +void fl_color(uchar r, uchar g, uchar b) { + static Fl_XMap xmap; + COLORREF c = RGB(r,g,b); + fl_color_ = fl_rgb_color(r, g, b); + if (!xmap.pen || c != xmap.rgb) { + clear_xmap(xmap); + set_xmap(xmap, c); + } + fl_current_xmap = ⟼ + SelectObject(fl_gc, (HGDIOBJ)(xmap.pen)); +} + +HBRUSH fl_brush() { + return fl_brush_action(0); +} + +HBRUSH fl_brush_action(int action) { + Fl_XMap *xmap = fl_current_xmap; + // Wonko: we use some statistics to cache only a limited number + // of brushes: +#define FL_N_BRUSH 16 + static struct Fl_Brush { + HBRUSH brush; + unsigned short usage; + Fl_XMap* backref; + } brushes[FL_N_BRUSH]; + + if (action) { + SelectObject(fl_gc, GetStockObject(BLACK_BRUSH)); // Load stock object + for (int i=0; ibrush; // find the associated brush + if (i != -1) { // if the brush was allready allocated + if (brushes[i].brush == NULL) goto CREATE_BRUSH; + if ( (++brushes[i].usage) > 32000 ) { // keep a usage statistic + for (int j=0; j16000) + brushes[j].usage -= 16000; + else + brushes[j].usage = 0; + } + } + return brushes[i].brush; + } else { + int umin = 32000, imin = 0; + for (i=0; ibrush = -1; + } +CREATE_BRUSH: + brushes[i].brush = CreateSolidBrush(xmap->rgb); + brushes[i].usage = 0; + brushes[i].backref = xmap; + xmap->brush = i; + return brushes[i].brush; +} + +void Fl::free_color(Fl_Color i, int overlay) { + if (overlay) return; // do something about GL overlay? + clear_xmap(fl_xmap[i]); +} + +void Fl::set_color(Fl_Color i, unsigned c) { + if (fl_cmap[i] != c) { + clear_xmap(fl_xmap[i]); + fl_cmap[i] = c; + } +} + +#if USE_COLORMAP + +// 'fl_select_palette()' - Make a color palette for 8-bit displays if necessary +// Thanks to Michael Sweet @ Easy Software Products for this + +HPALETTE +fl_select_palette(void) +{ + static char beenhere; + if (!beenhere) { + beenhere = 1; + + //if (GetDeviceCaps(fl_gc, BITSPIXEL) > 8) return NULL; + int nColors = GetDeviceCaps(fl_gc, SIZEPALETTE); + if (nColors <= 0 || nColors > 256) return NULL; + // this will try to work on < 256 color screens, but will probably + // come out quite badly. + + // I lamely try to get this variable-sized object allocated on stack: + ulong foo[(sizeof(LOGPALETTE)+256*sizeof(PALETTEENTRY))/sizeof(ulong)+1]; + LOGPALETTE *pPal = (LOGPALETTE*)foo; + + pPal->palVersion = 0x300; + pPal->palNumEntries = nColors; + + // Build 256 colors from the standard FLTK colormap... + + for (int i = 0; i < nColors; i ++) { + pPal->palPalEntry[i].peRed = (fl_cmap[i] >> 24) & 255; + pPal->palPalEntry[i].peGreen = (fl_cmap[i] >> 16) & 255; + pPal->palPalEntry[i].peBlue = (fl_cmap[i] >> 8) & 255; + pPal->palPalEntry[i].peFlags = 0; + }; + + // Create the palette: + fl_palette = CreatePalette(pPal); + } + if (fl_palette) { + SelectPalette(fl_gc, fl_palette, FALSE); + RealizePalette(fl_gc); + } + return fl_palette; +} + +#endif + +// +// End of "$Id: fl_color_win32.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_cursor.cxx b/third_party/windows/fltk-1.1.10/src/fl_cursor.cxx new file mode 100644 index 0000000..0e91169 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_cursor.cxx @@ -0,0 +1,335 @@ +// +// "$Id: fl_cursor.cxx 5654 2007-02-02 13:52:37Z matt $" +// +// Mouse cursor support for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Change the current cursor. +// Under X the cursor is attached to the X window. I tried to hide +// this and pretend that changing the cursor is a drawing function. +// This avoids a field in the Fl_Window, and I suspect is more +// portable to other systems. + +#include +#include +#include +#if !defined(WIN32) && !defined(__APPLE__) +# include +#endif +#include + +void fl_cursor(Fl_Cursor c, Fl_Color fg, Fl_Color bg) { + if (Fl::first_window()) Fl::first_window()->cursor(c,fg,bg); +} + +void Fl_Window::default_cursor(Fl_Cursor c, Fl_Color fg, Fl_Color bg) { +// if (c == FL_CURSOR_DEFAULT) c = FL_CURSOR_ARROW; + + cursor_default = c; + cursor_fg = fg; + cursor_bg = bg; + + cursor(c, fg, bg); +} + +#ifdef WIN32 + +# ifndef IDC_HAND +# define IDC_HAND MAKEINTRESOURCE(32649) +# endif // !IDC_HAND + +void Fl_Window::cursor(Fl_Cursor c, Fl_Color c1, Fl_Color c2) { + if (!shown()) return; + // the cursor must be set for the top level window, not for subwindows + Fl_Window *w = window(), *toplevel = this; + while (w) { toplevel = w; w = w->window(); } + if (toplevel != this) { toplevel->cursor(c, c1, c2); return; } + // now set the actual cursor + if (c == FL_CURSOR_DEFAULT) { + c = cursor_default; + } + if (c > FL_CURSOR_NESW) { + i->cursor = 0; + } else if (c == FL_CURSOR_DEFAULT) { + i->cursor = fl_default_cursor; + } else { + LPSTR n; + switch (c) { + case FL_CURSOR_ARROW: n = IDC_ARROW; break; + case FL_CURSOR_CROSS: n = IDC_CROSS; break; + case FL_CURSOR_WAIT: n = IDC_WAIT; break; + case FL_CURSOR_INSERT: n = IDC_IBEAM; break; + case FL_CURSOR_HELP: n = IDC_HELP; break; + case FL_CURSOR_HAND: { + OSVERSIONINFO osvi; + + // Get the OS version: Windows 98 and 2000 have a standard + // hand cursor. + memset(&osvi, 0, sizeof(OSVERSIONINFO)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&osvi); + + if (osvi.dwMajorVersion > 4 || + (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion > 0 && + osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)) n = IDC_HAND; + else n = IDC_UPARROW; + } break; + case FL_CURSOR_MOVE: n = IDC_SIZEALL; break; + case FL_CURSOR_N: + case FL_CURSOR_S: + case FL_CURSOR_NS: n = IDC_SIZENS; break; + case FL_CURSOR_NE: + case FL_CURSOR_SW: + case FL_CURSOR_NESW: n = IDC_SIZENESW; break; + case FL_CURSOR_E: + case FL_CURSOR_W: + case FL_CURSOR_WE: n = IDC_SIZEWE; break; + case FL_CURSOR_SE: + case FL_CURSOR_NW: + case FL_CURSOR_NWSE: n = IDC_SIZENWSE; break; + default: n = IDC_NO; break; + } + i->cursor = LoadCursor(NULL, n); + } + SetCursor(i->cursor); +} + +#elif defined(__APPLE__) + +#ifdef __BIG_ENDIAN__ +# define E(x) x +#elif defined __LITTLE_ENDIAN__ +// Don't worry. This will be resolved at compile time +# define E(x) (x>>8)|((x<<8)&0xff00) +#else +# error "Either __LITTLE_ENDIAN__ or __BIG_ENDIAN__ must be defined" +#endif + +static Cursor crsrHAND = +{ + { E(0x0600), E(0x0900), E(0x0900), E(0x0900), E(0x09C0), E(0x0938), E(0x6926), E(0x9805), + E(0x8801), E(0x4801), E(0x2002), E(0x2002), E(0x1004), E(0x0804), E(0x0408), E(0x0408) }, + { E(0x0600), E(0x0F00), E(0x0F00), E(0x0F00), E(0x0FC0), E(0x0FF8), E(0x6FFE), E(0xFFFF), + E(0xFFFF), E(0x7FFF), E(0x3FFE), E(0x3FFE), E(0x1FFC), E(0x0FFC), E(0x07F8), E(0x07F8) }, + { 1, 5 } // Hotspot: ( y, x ) +}, *crsrHANDptr = &crsrHAND; +static Cursor crsrHELP = +{ + { E(0x0000), E(0x4000), E(0x6000), E(0x7000), E(0x783C), E(0x7C7E), E(0x7E66), E(0x7F06), + E(0x7F8C), E(0x7C18), E(0x6C18), E(0x4600), E(0x0618), E(0x0318), E(0x0300), E(0x0000) }, + { E(0xC000), E(0xE000), E(0xF000), E(0xF83C), E(0xFC7E), E(0xFEFF), E(0xFFFF), E(0xFFFF), + E(0xFFFE), E(0xFFFC), E(0xFE3C), E(0xEF3C), E(0xCF3C), E(0x07BC), E(0x0798), E(0x0380) }, + { 1, 1 } +}, *crsrHELPptr = &crsrHELP; +static Cursor crsrMOVE = +{ + { E(0x0000), E(0x0180), E(0x03C0), E(0x07E0), E(0x07E0), E(0x1998), E(0x399C), E(0x7FFE), + E(0x7FFE), E(0x399C), E(0x1998), E(0x07E0), E(0x07E0), E(0x03C0), E(0x0180), E(0x0000) }, + { E(0x0180), E(0x03C0), E(0x07E0), E(0x0FF0), E(0x1FF8), E(0x3FFC), E(0x7FFE), E(0xFFFF), + E(0xFFFF), E(0x7FFE), E(0x3FFC), E(0x1FF8), E(0x0FF0), E(0x07E0), E(0x03C0), E(0x0180) }, + { 8, 8 } +}, *crsrMOVEptr = &crsrMOVE; +static Cursor crsrNS = +{ + { E(0x0000), E(0x0180), E(0x03C0), E(0x07E0), E(0x0FF0), E(0x0180), E(0x0180), E(0x0180), + E(0x0180), E(0x0180), E(0x0180), E(0x0FF0), E(0x07E0), E(0x03C0), E(0x0180), E(0x0000) }, + { E(0x0180), E(0x03C0), E(0x07E0), E(0x0FF0), E(0x1FF8), E(0x1FF8), E(0x03C0), E(0x03C0), + E(0x03C0), E(0x03C0), E(0x1FF8), E(0x1FF8), E(0x0FF0), E(0x07E0), E(0x03C0), E(0x0180) }, + { 8, 8 } +}, *crsrNSptr = &crsrNS; +static Cursor crsrWE = +{ + { E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0810), E(0x1818), E(0x381C), E(0x7FFE), + E(0x7FFE), E(0x381C), E(0x1818), E(0x0810), E(0x0000), E(0x0000), E(0x0000), E(0x0000) }, + { E(0x0000), E(0x0000), E(0x0000), E(0x0C30), E(0x1C38), E(0x3C3C), E(0x7FFE), E(0xFFFF), + E(0xFFFF), E(0x7FFE), E(0x3C3C), E(0x1C38), E(0x0C30), E(0x0000), E(0x0000), E(0x0000) }, + { 8, 8 } +}, *crsrWEptr = &crsrWE; +static Cursor crsrNWSE = +{ + { E(0x0000), E(0x7E00), E(0x7C00), E(0x7800), E(0x7C00), E(0x6E00), E(0x4710), E(0x03B0), + E(0x01F0), E(0x00F0), E(0x01F0), E(0x03F0), E(0x0000), E(0x0000), E(0x0000), E(0x0000) }, + { E(0xFF00), E(0xFF00), E(0xFE00), E(0xFC00), E(0xFE00), E(0xFF18), E(0xEFB8), E(0xC7F8), + E(0x03F8), E(0x01F8), E(0x03F8), E(0x07F8), E(0x07F8), E(0x0000), E(0x0000), E(0x0000) }, + { 8, 8 } +}, *crsrNWSEptr = &crsrNWSE; +static Cursor crsrNESW = +{ + { E(0x0000), E(0x03F0), E(0x01F0), E(0x00F0), E(0x01F0), E(0x03B0), E(0x4710), E(0x6E00), + E(0x7C00), E(0x7800), E(0x7C00), E(0x7E00), E(0x0000), E(0x0000), E(0x0000), E(0x0000) }, + { E(0x07F8), E(0x07F8), E(0x03F8), E(0x01F8), E(0x03F8), E(0xC7F8), E(0xEFB8), E(0xFF18), + E(0xFE00), E(0xFC00), E(0xFE00), E(0xFF00), E(0xFF00), E(0x0000), E(0x0000), E(0x0000) }, + { 8, 8 } +}, *crsrNESWptr = &crsrNESW; +static Cursor crsrNONE = +{ + { E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), + E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000) }, + { E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), + E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000), E(0x0000) }, + { 0, 0 } +}, *crsrNONEptr = &crsrNONE; +static Cursor crsrARROW = +{ + { E(0x0000), E(0x4000), E(0x6000), E(0x7000), E(0x7800), E(0x7C00), E(0x7E00), E(0x7F00), + E(0x7F80), E(0x7C00), E(0x6C00), E(0x4600), E(0x0600), E(0x0300), E(0x0300), E(0x0000) }, + { E(0xC000), E(0xE000), E(0xF000), E(0xF800), E(0xFC00), E(0xFE00), E(0xFF00), E(0xFF80), + E(0xFFC0), E(0xFFC0), E(0xFE00), E(0xEF00), E(0xCF00), E(0x0780), E(0x0780), E(0x0380) }, + { 1, 1 } +}, *crsrARROWptr = &crsrARROW; + +#undef E + +void Fl_Window::cursor(Fl_Cursor c, Fl_Color, Fl_Color) { + if (c == FL_CURSOR_DEFAULT) { + c = cursor_default; + } + CursHandle icrsr = fl_default_cursor; + switch (c) { + case FL_CURSOR_CROSS: icrsr = GetCursor( crossCursor ); break; + case FL_CURSOR_WAIT: icrsr = GetCursor( watchCursor ); break; + case FL_CURSOR_INSERT: icrsr = GetCursor( iBeamCursor ); break; + case FL_CURSOR_N: + case FL_CURSOR_S: + case FL_CURSOR_NS: icrsr = &crsrNSptr; break; + case FL_CURSOR_HELP: icrsr = &crsrHELPptr; break; + case FL_CURSOR_HAND: icrsr = &crsrHANDptr; break; + case FL_CURSOR_MOVE: icrsr = &crsrMOVEptr; break; + case FL_CURSOR_NE: + case FL_CURSOR_SW: + case FL_CURSOR_NESW: icrsr = &crsrNESWptr; break; + case FL_CURSOR_E: + case FL_CURSOR_W: + case FL_CURSOR_WE: icrsr = &crsrWEptr; break; + case FL_CURSOR_SE: + case FL_CURSOR_NW: + case FL_CURSOR_NWSE: icrsr = &crsrNWSEptr; break; + case FL_CURSOR_NONE: icrsr = &crsrNONEptr; break; + case FL_CURSOR_ARROW: icrsr = &crsrARROWptr; break; + case FL_CURSOR_DEFAULT: + default: break; + } + SetCursor( *icrsr ); + if (i) { + i->cursor = icrsr; + } +} + +#else + +// I like the MSWindows resize cursors, so I duplicate them here: + +#define CURSORSIZE 16 +#define HOTXY 7 +static struct TableEntry { + uchar bits[CURSORSIZE*CURSORSIZE/8]; + uchar mask[CURSORSIZE*CURSORSIZE/8]; + Cursor cursor; +} table[] = { + {{ // FL_CURSOR_NS + 0x00, 0x00, 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01, 0x00, 0x00}, + { + 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, 0xf0, 0x0f, 0xc0, 0x03, + 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xf0, 0x0f, + 0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01}}, + {{ // FL_CURSOR_EW + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, + 0x0c, 0x30, 0xfe, 0x7f, 0xfe, 0x7f, 0x0c, 0x30, 0x08, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x1c, 0x38, + 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0x1c, 0x38, 0x18, 0x18, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{ // FL_CURSOR_NWSE + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x38, 0x00, 0x78, 0x00, + 0xe8, 0x00, 0xc0, 0x01, 0x80, 0x03, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x1c, + 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + { + 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x7c, 0x00, 0xfc, 0x00, + 0xfc, 0x01, 0xec, 0x03, 0xc0, 0x37, 0x80, 0x3f, 0x00, 0x3f, 0x00, 0x3e, + 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00}}, + {{ // FL_CURSOR_NESW + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x1e, + 0x00, 0x17, 0x80, 0x03, 0xc0, 0x01, 0xe8, 0x00, 0x78, 0x00, 0x38, 0x00, + 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x3f, + 0x80, 0x3f, 0xc0, 0x37, 0xec, 0x03, 0xfc, 0x01, 0xfc, 0x00, 0x7c, 0x00, + 0xfc, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00}}, + {{0}, {0}} // FL_CURSOR_NONE & unknown +}; + +void Fl_Window::cursor(Fl_Cursor c, Fl_Color fg, Fl_Color bg) { + if (!shown()) return; + Cursor xc; + int deleteit = 0; + if (c == FL_CURSOR_DEFAULT) { + c = cursor_default; + fg = cursor_fg; + bg = cursor_bg; + } + + if (!c) { + xc = None; + } else { + if (c >= FL_CURSOR_NS) { + TableEntry *q = (c > FL_CURSOR_NESW) ? table+4 : table+(c-FL_CURSOR_NS); + if (!(q->cursor)) { + XColor dummy = { 0 }; + Pixmap p = XCreateBitmapFromData(fl_display, + RootWindow(fl_display, fl_screen), (const char*)(q->bits), + CURSORSIZE, CURSORSIZE); + Pixmap m = XCreateBitmapFromData(fl_display, + RootWindow(fl_display, fl_screen), (const char*)(q->mask), + CURSORSIZE, CURSORSIZE); + q->cursor = XCreatePixmapCursor(fl_display, p,m,&dummy, &dummy, + HOTXY, HOTXY); + XFreePixmap(fl_display, m); + XFreePixmap(fl_display, p); + } + xc = q->cursor; + } else { + xc = XCreateFontCursor(fl_display, (c-1)*2); + deleteit = 1; + } + XColor fgc; + uchar r,g,b; + Fl::get_color(fg,r,g,b); + fgc.red = r<<8; fgc.green = g<<8; fgc.blue = b<<8; + XColor bgc; + Fl::get_color(bg,r,g,b); + bgc.red = r<<8; bgc.green = g<<8; bgc.blue = b<<8; + XRecolorCursor(fl_display, xc, &fgc, &bgc); + } + XDefineCursor(fl_display, fl_xid(this), xc); + if (deleteit) XFreeCursor(fl_display, xc); +} + +#endif + +// +// End of "$Id: fl_cursor.cxx 5654 2007-02-02 13:52:37Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_curve.cxx b/third_party/windows/fltk-1.1.10/src/fl_curve.cxx new file mode 100644 index 0000000..5007e9a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_curve.cxx @@ -0,0 +1,106 @@ +// +// "$Id: fl_curve.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Bezier curve functions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Utility for drawing Bezier curves, adding the points to +// the current fl_begin/fl_vertex/fl_end path. +// Incremental math implementation: +// I very much doubt this is optimal! From Foley/vanDam page 511. +// If anybody has a better algorithim, please send it! + +#include +#include + +void fl_curve(double X0, double Y0, + double X1, double Y1, + double X2, double Y2, + double X3, double Y3) { + + double x = fl_transform_x(X0,Y0); + double y = fl_transform_y(X0,Y0); + + // draw point 0: + fl_transformed_vertex(x,y); + + double x1 = fl_transform_x(X1,Y1); + double yy1 = fl_transform_y(X1,Y1); + double x2 = fl_transform_x(X2,Y2); + double y2 = fl_transform_y(X2,Y2); + double x3 = fl_transform_x(X3,Y3); + double y3 = fl_transform_y(X3,Y3); + + // find the area: + double a = fabs((x-x2)*(y3-yy1)-(y-y2)*(x3-x1)); + double b = fabs((x-x3)*(y2-yy1)-(y-y3)*(x2-x1)); + if (b > a) a = b; + + // use that to guess at the number of segments: + int n = int(sqrt(a)/4); + if (n > 1) { + if (n > 100) n = 100; // make huge curves not hang forever + + double e = 1.0/n; + + // calculate the coefficients of 3rd order equation: + double xa = (x3-3*x2+3*x1-x); + double xb = 3*(x2-2*x1+x); + double xc = 3*(x1-x); + // calculate the forward differences: + double dx1 = ((xa*e+xb)*e+xc)*e; + double dx3 = 6*xa*e*e*e; + double dx2 = dx3 + 2*xb*e*e; + + // calculate the coefficients of 3rd order equation: + double ya = (y3-3*y2+3*yy1-y); + double yb = 3*(y2-2*yy1+y); + double yc = 3*(yy1-y); + // calculate the forward differences: + double dy1 = ((ya*e+yb)*e+yc)*e; + double dy3 = 6*ya*e*e*e; + double dy2 = dy3 + 2*yb*e*e; + + // draw points 1 .. n-2: + for (int m=2; m +#include + +extern uchar* fl_gray_ramp(); + +static void fl_diamond_up_box(int x,int y,int w,int h,Fl_Color bgcolor) { + w &= -2; + h &= -2; + int x1 = x+w/2; + int y1 = y+h/2; + fl_color(bgcolor); fl_polygon(x+3, y1, x1,y+3, x+w-3,y1, x1,y+h-3); + uchar *g = fl_gray_ramp(); + fl_color(g['W']); fl_line(x+1, y1, x1, y+1, x+w-1, y1); + fl_color(g['U']); fl_line(x+2, y1, x1, y+2, x+w-2, y1); + fl_color(g['S']); fl_line(x+3, y1, x1, y+3, x+w-3, y1); + fl_color(g['P']); fl_line(x+3, y1, x1, y+h-3, x+w-3, y1); + fl_color(g['N']); fl_line(x+2, y1, x1, y+h-2, x+w-2, y1); + fl_color(g['H']); fl_line(x+1, y1, x1, y+h-1, x+w-1, y1); + fl_color(g['A']); fl_loop(x, y1, x1, y, x+w, y1, x1, y+h); +} + +static void fl_diamond_down_box(int x,int y,int w,int h,Fl_Color bgcolor) { + w &= -2; + h &= -2; + int x1 = x+w/2; + int y1 = y+h/2; + uchar *g = fl_gray_ramp(); + fl_color(g['P']); fl_line(x+0, y1, x1, y+0, x+w-0, y1); + fl_color(g['N']); fl_line(x+1, y1, x1, y+1, x+w-1, y1); + fl_color(g['H']); fl_line(x+2, y1, x1, y+2, x+w-2, y1); + fl_color(g['W']); fl_line(x+2, y1, x1, y+h-2, x+w-2, y1); + fl_color(g['U']); fl_line(x+1, y1, x1, y+h-1, x+w-1, y1); + fl_color(g['S']); fl_line(x+0, y1, x1, y+h-0, x+w-0, y1); + fl_color(bgcolor); fl_polygon(x+3, y1, x1,y+3, x+w-3,y1, x1,y+h-3); + fl_color(g['A']); fl_loop(x+3, y1, x1, y+3, x+w-3, y1, x1, y+h-3); +} + +extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*); +Fl_Boxtype fl_define_FL_DIAMOND_BOX() { + fl_internal_boxtype(_FL_DIAMOND_DOWN_BOX, fl_diamond_down_box); + fl_internal_boxtype(_FL_DIAMOND_UP_BOX,fl_diamond_up_box); + return _FL_DIAMOND_UP_BOX; +} + +// +// End of "$Id: fl_diamond_box.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_dnd.cxx b/third_party/windows/fltk-1.1.10/src/fl_dnd.cxx new file mode 100644 index 0000000..9193505 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_dnd.cxx @@ -0,0 +1,38 @@ +// +// "$Id: fl_dnd.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Drag & Drop code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifdef WIN32 +# include "fl_dnd_win32.cxx" +#elif defined(__APPLE__) +# include "fl_dnd_mac.cxx" +#else +# include "fl_dnd_x.cxx" +#endif + +// +// End of "$Id: fl_dnd.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_dnd_mac.cxx b/third_party/windows/fltk-1.1.10/src/fl_dnd_mac.cxx new file mode 100644 index 0000000..7415b7b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_dnd_mac.cxx @@ -0,0 +1,90 @@ +// +// "$Id: fl_dnd_mac.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Drag & Drop code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems to "fltk-bugs@fltk.org + +// This file contains win32-specific code for fltk which is always linked +// in. Search other files for "WIN32" or filenames ending in _win32.cxx +// for other system-specific code. + +#include +#include +#include +#include + +// warning: this function is only implemented in Quickdraw. The function +// below may not work If FLTK is compiled with Quartz enabled + +extern EventRef fl_os_event; +extern char *fl_selection_buffer; +extern int fl_selection_length; + + +/** + * drag and drop whatever is in the cut-copy-paste buffer + * - create a selection first using: + * Fl::copy(const char *stuff, int len, 0) + */ +int Fl::dnd() +{ + OSErr result; + DragReference dragRef; + result = NewDrag( &dragRef ); + if ( result != noErr ) return false; + + result = AddDragItemFlavor( dragRef, 1, 'TEXT', fl_selection_buffer, fl_selection_length, 0 ); + if ( result != noErr ) { DisposeDrag( dragRef ); return false; } + + Point mp; + GetMouse(&mp); + LocalToGlobal( &mp ); + RgnHandle region = NewRgn(); + SetRectRgn( region, mp.h-10, mp.v-10, mp.h+10, mp.v+10 ); + RgnHandle r2 = NewRgn(); + SetRectRgn( r2, mp.h-8, mp.v-8, mp.h+8, mp.v+8 ); + DiffRgn( region, r2, region ); + DisposeRgn( r2 ); + + EventRecord event; + ConvertEventRefToEventRecord( fl_os_event, &event ); + result = TrackDrag( dragRef, &event, region ); + + Fl_Widget *w = Fl::pushed(); + if ( w ) + { + int old_event = Fl::e_number; + w->handle(Fl::e_number = FL_RELEASE); + Fl::e_number = old_event; + Fl::pushed( 0 ); + } + + if ( result != noErr ) { DisposeRgn( region ); DisposeDrag( dragRef ); return false; } + + DisposeRgn( region ); + DisposeDrag( dragRef ); + return true; +} + + +// +// End of "$Id: fl_dnd_mac.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_dnd_win32.cxx b/third_party/windows/fltk-1.1.10/src/fl_dnd_win32.cxx new file mode 100644 index 0000000..cd7511b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_dnd_win32.cxx @@ -0,0 +1,404 @@ +// +// "$Id: fl_dnd_win32.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Drag & Drop code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems to "fltk-bugs@fltk.org + +// This file contains win32-specific code for fltk which is always linked +// in. Search other files for "WIN32" or filenames ending in _win32.cxx +// for other system-specific code. + +#include +#include +#include +#include "flstring.h" +#include +#include +#include +#include +#if defined(__CYGWIN__) +#include +#include +#else +#include +#endif + +extern char *fl_selection_buffer[2]; +extern int fl_selection_length[2]; +extern int fl_selection_buffer_length[2]; +extern char fl_i_own_selection[2]; + +Fl_Window *fl_dnd_target_window = 0; + +// All of the following code requires GCC 3.x or a non-GNU compiler... +#if !defined(__GNUC__) || __GNUC__ >= 3 + +#include +#include + +/** + * subclass the IDropTarget to receive data from DnD operations + */ +class FLDropTarget : public IDropTarget +{ + DWORD m_cRefCount; + DWORD lastEffect; + int px, py; +public: + FLDropTarget() : m_cRefCount(0) { } // initialize + HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, LPVOID *ppvObject ) { + if (IID_IUnknown==riid || IID_IDropTarget==riid) + { + *ppvObject=this; + ((LPUNKNOWN)*ppvObject)->AddRef(); + return S_OK; + } + *ppvObject = NULL; + return E_NOINTERFACE; + } + ULONG STDMETHODCALLTYPE AddRef() { return ++m_cRefCount; } + ULONG STDMETHODCALLTYPE Release() { + long nTemp; + nTemp = --m_cRefCount; + if(nTemp==0) + delete this; + return nTemp; + } + HRESULT STDMETHODCALLTYPE DragEnter( IDataObject *pDataObj, DWORD /*grfKeyState*/, POINTL pt, DWORD *pdwEffect) { + if( !pDataObj ) return E_INVALIDARG; + // set e_modifiers here from grfKeyState, set e_x and e_root_x + // check if FLTK handles this drag and return if it can't (i.e. BMP drag without filename) + POINT ppt; + Fl::e_x_root = ppt.x = pt.x; + Fl::e_y_root = ppt.y = pt.y; + HWND hWnd = WindowFromPoint( ppt ); + Fl_Window *target = fl_find( hWnd ); + if (target) { + Fl::e_x = Fl::e_x_root-target->x(); + Fl::e_y = Fl::e_y_root-target->y(); + } + fl_dnd_target_window = target; + px = pt.x; py = pt.y; + if (fillCurrentDragData(pDataObj)) { + // FLTK has no mechanism yet for the different drop effects, so we allow move and copy + if ( target && Fl::handle( FL_DND_ENTER, target ) ) + *pdwEffect = DROPEFFECT_MOVE|DROPEFFECT_COPY; //|DROPEFFECT_LINK; + else + *pdwEffect = DROPEFFECT_NONE; + } else { + *pdwEffect = DROPEFFECT_NONE; + } + lastEffect = *pdwEffect; + return S_OK; + } + HRESULT STDMETHODCALLTYPE DragOver( DWORD /*grfKeyState*/, POINTL pt, DWORD *pdwEffect) { + if ( px==pt.x && py==pt.y ) + { + *pdwEffect = lastEffect; + return S_OK; + } + if ( !fl_dnd_target_window ) + { + *pdwEffect = lastEffect = DROPEFFECT_NONE; + return S_OK; + } + // set e_modifiers here from grfKeyState, set e_x and e_root_x + Fl::e_x_root = pt.x; + Fl::e_y_root = pt.y; + if (fl_dnd_target_window) { + Fl::e_x = Fl::e_x_root-fl_dnd_target_window->x(); + Fl::e_y = Fl::e_y_root-fl_dnd_target_window->y(); + } + if (fillCurrentDragData(0)) { + // Fl_Group will change DND_DRAG into DND_ENTER and DND_LEAVE if needed + if ( Fl::handle( FL_DND_DRAG, fl_dnd_target_window ) ) + *pdwEffect = DROPEFFECT_MOVE|DROPEFFECT_COPY; //|DROPEFFECT_LINK; + else + *pdwEffect = DROPEFFECT_NONE; + } else { + *pdwEffect = DROPEFFECT_NONE; + } + px = pt.x; py = pt.y; + lastEffect = *pdwEffect; + return S_OK; + } + HRESULT STDMETHODCALLTYPE DragLeave() { + if ( fl_dnd_target_window && fillCurrentDragData(0)) + { + Fl::handle( FL_DND_LEAVE, fl_dnd_target_window ); + fl_dnd_target_window = 0; + clearCurrentDragData(); + } + return S_OK; + } + HRESULT STDMETHODCALLTYPE Drop( IDataObject *data, DWORD /*grfKeyState*/, POINTL pt, DWORD* /*pdwEffect*/) { + if ( !fl_dnd_target_window ) + return S_OK; + Fl_Window *target = fl_dnd_target_window; + fl_dnd_target_window = 0; + Fl::e_x_root = pt.x; + Fl::e_y_root = pt.y; + if (target) { + Fl::e_x = Fl::e_x_root-target->x(); + Fl::e_y = Fl::e_y_root-target->y(); + } + // tell FLTK that the user released an object on this widget + if ( !Fl::handle( FL_DND_RELEASE, target ) ) + return S_OK; + + Fl_Widget *w = target; + while (w->parent()) w = w->window(); + HWND hwnd = fl_xid( (Fl_Window*)w ); + if (fillCurrentDragData(data)) { + int old_event = Fl::e_number; + Fl::belowmouse()->handle(Fl::e_number = FL_PASTE); // e_text will be invalid after this call + Fl::e_number = old_event; + SetForegroundWindow( hwnd ); + clearCurrentDragData(); + return S_OK; + } + return S_OK; + } +private: + + static IDataObject *currDragRef; + static char *currDragData; + static int currDragSize; + static char currDragResult; + + static void clearCurrentDragData() { + currDragRef = 0; + if (currDragData) free(currDragData); + currDragData = 0; + currDragSize = 0; + currDragResult = 0; + } + static char fillCurrentDragData(IDataObject *data) { + // shortcut through this whole procedure if there is no fresh data + if (!data) + return currDragResult; + // shortcut through this whole procedure if this is still the same drag event + // (* this is safe, because 'currDragRef' is cleared on Leave and Drop events) + if (data==currDragRef) + return currDragResult; + + // clear currDrag* for a new drag event + clearCurrentDragData(); + + // fill currDrag* with ASCII data, if available + FORMATETC fmt = { 0 }; + STGMEDIUM medium = { 0 }; + fmt.tymed = TYMED_HGLOBAL; + fmt.dwAspect = DVASPECT_CONTENT; + fmt.lindex = -1; + fmt.cfFormat = CF_TEXT; + // if it is ASCII text, return a copy of it + if ( data->GetData( &fmt, &medium )==S_OK ) + { + void *stuff = GlobalLock( medium.hGlobal ); + Fl::e_length = strlen((char*)stuff); + Fl::e_text = strdup((char*)stuff); + GlobalUnlock( medium.hGlobal ); + ReleaseStgMedium( &medium ); + currDragResult = 1; + return currDragResult; + } + // else fill currDrag* with filenames, if possible + memset(&fmt, 0, sizeof(fmt)); + fmt.tymed = TYMED_HGLOBAL; + fmt.dwAspect = DVASPECT_CONTENT; + fmt.lindex = -1; + fmt.cfFormat = CF_HDROP; + // if it is a pathname list, send an FL_PASTE with a \n seperated list of filepaths + if ( data->GetData( &fmt, &medium )==S_OK ) + { + HDROP hdrop = (HDROP)medium.hGlobal; + int i, n, nn = 0, nf = DragQueryFile( hdrop, (UINT)-1, 0, 0 ); + for ( i=0; iAddRef(); + return S_OK; + } + *ppvObject = NULL; + return E_NOINTERFACE; + } + ULONG STDMETHODCALLTYPE AddRef() { return ++m_cRefCount; } + ULONG STDMETHODCALLTYPE Release() { + long nTemp; + nTemp = --m_cRefCount; + if(nTemp==0) + delete this; + return nTemp; + } + STDMETHODIMP GiveFeedback( ulong ) { return DRAGDROP_S_USEDEFAULTCURSORS; } + STDMETHODIMP QueryContinueDrag( BOOL esc, DWORD keyState ) { + if ( esc ) + return DRAGDROP_S_CANCEL; + if ( !(keyState & (MK_LBUTTON|MK_MBUTTON|MK_RBUTTON)) ) + return DRAGDROP_S_DROP; + return S_OK; + } +}; + +/** + * this is the actual object that FLTK can drop somewhere + * - the implementation is minimal, but it should work with all decent Win32 drop targets + */ +class FLDataObject : public IDataObject +{ + DWORD m_cRefCount; +public: + FLDataObject() { m_cRefCount = 1; } + HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, LPVOID *ppvObject ) { + if (IID_IUnknown==riid || IID_IDataObject==riid) + { + *ppvObject=this; + ((LPUNKNOWN)*ppvObject)->AddRef(); + return S_OK; + } + *ppvObject = NULL; + return E_NOINTERFACE; + } + ULONG STDMETHODCALLTYPE AddRef() { return ++m_cRefCount; } + ULONG STDMETHODCALLTYPE Release() { + long nTemp; + nTemp = --m_cRefCount; + if(nTemp==0) + delete this; + return nTemp; + } + // GetData currently allows ASCII text through Global Memory only + HRESULT STDMETHODCALLTYPE GetData( FORMATETC *pformatetcIn, STGMEDIUM *pmedium ) { + if ((pformatetcIn->dwAspect & DVASPECT_CONTENT) && + (pformatetcIn->tymed & TYMED_HGLOBAL) && + (pformatetcIn->cfFormat == CF_TEXT)) + { + HGLOBAL gh = GlobalAlloc( GHND, fl_selection_length[0]+1 ); + char *pMem = (char*)GlobalLock( gh ); + memmove( pMem, fl_selection_buffer[0], fl_selection_length[0] ); + pMem[ fl_selection_length[0] ] = 0; + pmedium->tymed = TYMED_HGLOBAL; + pmedium->hGlobal = gh; + pmedium->pUnkForRelease = NULL; + GlobalUnlock( gh ); + return S_OK; + } + return DV_E_FORMATETC; + } + HRESULT STDMETHODCALLTYPE QueryGetData( FORMATETC *pformatetc ) + { + if ((pformatetc->dwAspect & DVASPECT_CONTENT) && + (pformatetc->tymed & TYMED_HGLOBAL) && + (pformatetc->cfFormat == CF_TEXT)) + return S_OK; + return DV_E_FORMATETC; + } + // all the following methods are not really needed for a DnD object + HRESULT STDMETHODCALLTYPE GetDataHere( FORMATETC* /*pformatetcIn*/, STGMEDIUM* /*pmedium*/) { return E_NOTIMPL; } + HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc( FORMATETC* /*in*/, FORMATETC* /*out*/) { return E_NOTIMPL; } + HRESULT STDMETHODCALLTYPE SetData( FORMATETC* /*pformatetc*/, STGMEDIUM* /*pmedium*/, BOOL /*fRelease*/) { return E_NOTIMPL; } + HRESULT STDMETHODCALLTYPE EnumFormatEtc( DWORD /*dir*/, IEnumFORMATETC** /*ppenumFormatEtc*/) { return E_NOTIMPL; } + HRESULT STDMETHODCALLTYPE DAdvise( FORMATETC* /*pformatetc*/, DWORD /*advf*/, + IAdviseSink* /*pAdvSink*/, DWORD* /*pdwConnection*/) { return E_NOTIMPL; } + HRESULT STDMETHODCALLTYPE DUnadvise( DWORD /*dwConnection*/) { return E_NOTIMPL; } + HRESULT STDMETHODCALLTYPE EnumDAdvise( IEnumSTATDATA** /*ppenumAdvise*/) { return E_NOTIMPL; } +}; + + +/** + * drag and drop whatever is in the cut-copy-paste buffer + * - create a selection first using: + * Fl::copy(const char *stuff, int len, 0) + */ +int Fl::dnd() +{ + DWORD dropEffect; + ReleaseCapture(); + + FLDataObject *fdo = new FLDataObject; + fdo->AddRef(); + FLDropSource *fds = new FLDropSource; + fds->AddRef(); + + HRESULT ret = DoDragDrop( fdo, fds, DROPEFFECT_MOVE|DROPEFFECT_LINK|DROPEFFECT_COPY, &dropEffect ); + + fdo->Release(); + fds->Release(); + + Fl_Widget *w = Fl::pushed(); + if ( w ) + { + int old_event = Fl::e_number; + w->handle(Fl::e_number = FL_RELEASE); + Fl::e_number = old_event; + Fl::pushed( 0 ); + } + if ( ret==DRAGDROP_S_DROP ) return 1; // or DD_S_CANCEL + return 0; +} +#else +int Fl::dnd() +{ + // Always indicate DnD failed when using GCC < 3... + return 1; +} +#endif // !__GNUC__ || __GNUC__ >= 3 + + +// +// End of "$Id: fl_dnd_win32.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_dnd_x.cxx b/third_party/windows/fltk-1.1.10/src/fl_dnd_x.cxx new file mode 100644 index 0000000..56368a2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_dnd_x.cxx @@ -0,0 +1,201 @@ +// +// "$Id: fl_dnd_x.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Drag & Drop code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include "flstring.h" + + +extern Atom fl_XdndAware; +extern Atom fl_XdndSelection; +extern Atom fl_XdndEnter; +extern Atom fl_XdndTypeList; +extern Atom fl_XdndPosition; +extern Atom fl_XdndLeave; +extern Atom fl_XdndDrop; +extern Atom fl_XdndStatus; +extern Atom fl_XdndActionCopy; +extern Atom fl_XdndFinished; +//extern Atom fl_XdndProxy; +extern Atom fl_XdndURIList; + +extern char fl_i_own_selection[2]; +extern char *fl_selection_buffer[2]; + +extern void fl_sendClientMessage(Window window, Atom message, + unsigned long d0, + unsigned long d1=0, + unsigned long d2=0, + unsigned long d3=0, + unsigned long d4=0); + +// return version # of Xdnd this window supports. Also change the +// window to the proxy if it uses a proxy: +static int dnd_aware(Window& window) { + Atom actual; int format; unsigned long count, remaining; + unsigned char *data = 0; + XGetWindowProperty(fl_display, window, fl_XdndAware, + 0, 4, False, XA_ATOM, + &actual, &format, + &count, &remaining, &data); + if (actual == XA_ATOM && format==32 && count && data) + return int(*(Atom*)data); + return 0; +} + +static int grabfunc(int event) { + if (event == FL_RELEASE) Fl::pushed(0); + return 0; +} + +extern int (*fl_local_grab)(int); // in Fl.cxx + +// send an event to an fltk window belonging to this program: +static int local_handle(int event, Fl_Window* window) { + fl_local_grab = 0; + Fl::e_x = Fl::e_x_root-window->x(); + Fl::e_y = Fl::e_y_root-window->y(); + int ret = Fl::handle(event,window); + fl_local_grab = grabfunc; + return ret; +} + +int Fl::dnd() { + Fl_Window *source_fl_win = Fl::first_window(); + Fl::first_window()->cursor((Fl_Cursor)21); + Window source_window = fl_xid(Fl::first_window()); + fl_local_grab = grabfunc; + Window target_window = 0; + Fl_Window* local_window = 0; + int dndversion = 4; int dest_x, dest_y; + XSetSelectionOwner(fl_display, fl_XdndSelection, fl_message_window, fl_event_time); + + while (Fl::pushed()) { + + // figure out what window we are pointing at: + Window new_window = 0; int new_version = 0; + Fl_Window* new_local_window = 0; + for (Window child = RootWindow(fl_display, fl_screen);;) { + Window root; unsigned int junk3; + XQueryPointer(fl_display, child, &root, &child, + &e_x_root, &e_y_root, &dest_x, &dest_y, &junk3); + if (!child) { + if (!new_window && (new_version = dnd_aware(root))) new_window = root; + break; + } + new_window = child; + if ((new_local_window = fl_find(child))) break; + if ((new_version = dnd_aware(new_window))) break; + } + + if (new_window != target_window) { + if (local_window) { + local_handle(FL_DND_LEAVE, local_window); + } else if (dndversion) { + fl_sendClientMessage(target_window, fl_XdndLeave, source_window); + } + dndversion = new_version; + target_window = new_window; + local_window = new_local_window; + if (local_window) { + local_handle(FL_DND_ENTER, local_window); + } else if (dndversion) { + // Send an X-DND message to the target window. In order to + // support dragging of files/URLs as well as arbitrary text, + // we look at the selection buffer - if the buffer starts + // with a common URI scheme, does not contain spaces, and + // contains at least one CR LF, then we flag the data as + // both a URI list (MIME media type "text/uri-list") and + // plain text. Otherwise, we just say it is plain text. + if ((!strncmp(fl_selection_buffer[0], "file:///", 8) || + !strncmp(fl_selection_buffer[0], "ftp://", 6) || + !strncmp(fl_selection_buffer[0], "http://", 7) || + !strncmp(fl_selection_buffer[0], "https://", 8) || + !strncmp(fl_selection_buffer[0], "ipp://", 6) || + !strncmp(fl_selection_buffer[0], "ldap:", 5) || + !strncmp(fl_selection_buffer[0], "mailto:", 7) || + !strncmp(fl_selection_buffer[0], "news:", 5) || + !strncmp(fl_selection_buffer[0], "smb://", 6)) && + !strchr(fl_selection_buffer[0], ' ') && + strstr(fl_selection_buffer[0], "\r\n")) { + // Send file/URI list... + fl_sendClientMessage(target_window, fl_XdndEnter, source_window, + dndversion<<24, fl_XdndURIList, XA_STRING, 0); + } else { + // Send plain text... + fl_sendClientMessage(target_window, fl_XdndEnter, source_window, + dndversion<<24, XA_STRING, 0, 0); + } + } + } + if (local_window) { + local_handle(FL_DND_DRAG, local_window); + } else if (dndversion) { + fl_sendClientMessage(target_window, fl_XdndPosition, source_window, + 0, (e_x_root<<16)|e_y_root, fl_event_time, + fl_XdndActionCopy); + } + Fl::wait(); + } + + if (local_window) { + fl_i_own_selection[0] = 1; + if (local_handle(FL_DND_RELEASE, local_window)) paste(*belowmouse(), 0); + } else if (dndversion) { + fl_sendClientMessage(target_window, fl_XdndDrop, source_window, + 0, fl_event_time); + } else if (target_window) { + // fake a drop by clicking the middle mouse button: + XButtonEvent msg; + msg.type = ButtonPress; + msg.window = target_window; + msg.root = RootWindow(fl_display, fl_screen); + msg.subwindow = 0; + msg.time = fl_event_time+1; + msg.x = dest_x; + msg.y = dest_y; + msg.x_root = Fl::e_x_root; + msg.y_root = Fl::e_y_root; + msg.state = 0x0; + msg.button = Button2; + XSendEvent(fl_display, target_window, False, 0L, (XEvent*)&msg); + msg.time++; + msg.state = 0x200; + msg.type = ButtonRelease; + XSendEvent(fl_display, target_window, False, 0L, (XEvent*)&msg); + } + + fl_local_grab = 0; + source_fl_win->cursor(FL_CURSOR_DEFAULT); + return 1; +} + + +// +// End of "$Id: fl_dnd_x.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_draw.cxx b/third_party/windows/fltk-1.1.10/src/fl_draw.cxx new file mode 100644 index 0000000..006cc45 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_draw.cxx @@ -0,0 +1,336 @@ +// +// "$Id: fl_draw.cxx 5565 2006-12-21 19:39:26Z mike $" +// +// Label drawing code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Implementation of fl_draw(const char*,int,int,int,int,Fl_Align) +// Used to draw all the labels and text, this routine: +// Word wraps the labels to fit into their bounding box. +// Breaks them into lines at the newlines. +// Expands all unprintable characters to ^X or \nnn notation +// Aligns them against the inside of the box. + +#define min(a,b) ((a)<(b)?(a):(b)) +#include +#include + +#include "flstring.h" +#include +#include + +#define MAXBUF 1024 + +char fl_draw_shortcut; // set by fl_labeltypes.cxx + +static char* underline_at; + +// Copy p to buf, replacing unprintable characters with ^X and \nnn +// Stop at a newline or if MAXBUF characters written to buffer. +// Also word-wrap if width exceeds maxw. +// Returns a pointer to the start of the next line of caharcters. +// Sets n to the number of characters put into the buffer. +// Sets width to the width of the string in the current font. + +static const char* +expand(const char* from, char* buf, double maxw, int& n, double &width, + int wrap, int draw_symbols) { + char* o = buf; + char* e = buf+(MAXBUF-4); + underline_at = 0; + char* word_end = o; + const char* word_start = from; + double w = 0; + + const char* p = from; + for (;; p++) { + + int c = *p & 255; + + if (!c || c == ' ' || c == '\n') { + // test for word-wrap: + if (word_start < p && wrap) { + double newwidth = w + fl_width(word_end, o-word_end); + if (word_end > buf && newwidth > maxw) { // break before this word + o = word_end; + p = word_start; + break; + } + word_end = o; + w = newwidth; + } + if (!c) break; + else if (c == '\n') {p++; break;} + word_start = p+1; + } + + if (o > e) break; // don't overflow buffer + + if (c == '\t') { + for (c = (o-buf)%8; c<8 && o (str + 1) && p[-1] != '@') { + strlcpy(symbol[1], p, sizeof(symbol[1])); + symwidth[1] = min(w,h); + } + } + + symtotal = symwidth[0] + symwidth[1]; + + for (p = str, lines=0; p;) { + e = expand(p, buf, w - symtotal, buflen, width, align&FL_ALIGN_WRAP, + draw_symbols); + lines++; + if (!*e || (*e == '@' && e[1] != '@' && draw_symbols)) break; + p = e; + } + + if ((symwidth[0] || symwidth[1]) && lines) { + if (symwidth[0]) symwidth[0] = lines * fl_height(); + if (symwidth[1]) symwidth[1] = lines * fl_height(); + } + + symtotal = symwidth[0] + symwidth[1]; + + // figure out vertical position of the first line: + int xpos; + int ypos; + int height = fl_height(); + int imgh = img ? img->h() : 0; + + symoffset = 0; + + if (align & FL_ALIGN_BOTTOM) ypos = y+h-(lines-1)*height-imgh; + else if (align & FL_ALIGN_TOP) ypos = y+height; + else ypos = y+(h-lines*height-imgh)/2+height; + + // draw the image unless the "text over image" alignment flag is set... + if (img && !(align & FL_ALIGN_TEXT_OVER_IMAGE)) { + if (img->w() > symoffset) symoffset = img->w(); + + if (align & FL_ALIGN_LEFT) xpos = x + symwidth[0]; + else if (align & FL_ALIGN_RIGHT) xpos = x + w - img->w() - symwidth[1]; + else xpos = x + (w - img->w() - symtotal) / 2 + symwidth[0]; + + img->draw(xpos, ypos - height); + ypos += img->h(); + } + + // now draw all the lines: + if (str) { + int desc = fl_descent(); + for (p=str; ; ypos += height) { + if (lines>1) e = expand(p, buf, w - symtotal, buflen, width, + align&FL_ALIGN_WRAP, draw_symbols); + else e = ""; + + if (width > symoffset) symoffset = (int)(width + 0.5); + + if (align & FL_ALIGN_LEFT) xpos = x + symwidth[0]; + else if (align & FL_ALIGN_RIGHT) xpos = x + w - (int)(width + .5) - symwidth[1]; + else xpos = x + (w - (int)(width + .5) - symtotal) / 2 + symwidth[0]; + + callthis(buf,buflen,xpos,ypos-desc); + + if (underline_at && underline_at >= buf && underline_at < (buf + buflen)) + callthis("_",1,xpos+int(fl_width(buf,underline_at-buf)),ypos-desc); + + if (!*e || (*e == '@' && e[1] != '@')) break; + p = e; + } + } + + // draw the image if the "text over image" alignment flag is set... + if (img && (align & FL_ALIGN_TEXT_OVER_IMAGE)) { + if (img->w() > symoffset) symoffset = img->w(); + + if (align & FL_ALIGN_LEFT) xpos = x + symwidth[0]; + else if (align & FL_ALIGN_RIGHT) xpos = x + w - img->w() - symwidth[1]; + else xpos = x + (w - img->w() - symtotal) / 2 + symwidth[0]; + + img->draw(xpos, ypos); + } + + // draw the symbols, if any... + if (symwidth[0]) { + // draw to the left + if (align & FL_ALIGN_LEFT) xpos = x; + else if (align & FL_ALIGN_RIGHT) xpos = x + w - symtotal - symoffset; + else xpos = x + (w - symoffset - symtotal) / 2; + + if (align & FL_ALIGN_BOTTOM) ypos = y + h - symwidth[0]; + else if (align & FL_ALIGN_TOP) ypos = y; + else ypos = y + (h - symwidth[0]) / 2; + + fl_draw_symbol(symbol[0], xpos, ypos, symwidth[0], symwidth[0], fl_color()); + } + + if (symwidth[1]) { + // draw to the right + if (align & FL_ALIGN_LEFT) xpos = x + symoffset + symwidth[0]; + else if (align & FL_ALIGN_RIGHT) xpos = x + w - symwidth[1]; + else xpos = x + (w - symoffset - symtotal) / 2 + symoffset + symwidth[0]; + + if (align & FL_ALIGN_BOTTOM) ypos = y + h - symwidth[1]; + else if (align & FL_ALIGN_TOP) ypos = y; + else ypos = y + (h - symwidth[1]) / 2; + + fl_draw_symbol(symbol[1], xpos, ypos, symwidth[1], symwidth[1], fl_color()); + } +} + +void fl_draw( + const char* str, // the (multi-line) string + int x, int y, int w, int h, // bounding box + Fl_Align align, + Fl_Image* img, + int draw_symbols) { + if ((!str || !*str) && !img) return; + if (w && h && !fl_not_clipped(x, y, w, h) && (align & FL_ALIGN_INSIDE)) return; + if (align & FL_ALIGN_CLIP) fl_clip(x, y, w, h); + fl_draw(str, x, y, w, h, align, fl_draw, img, draw_symbols); + if (align & FL_ALIGN_CLIP) fl_pop_clip(); +} + +void fl_measure(const char* str, int& w, int& h, int draw_symbols) { + if (!str || !*str) {w = 0; h = 0; return;} + h = fl_height(); + const char* p; + const char* e; + char buf[MAXBUF]; + int buflen; + int lines; + double width; + int W = 0; + char symbol[2][255], *symptr; + int symwidth[2], symtotal; + + // count how many lines and put the last one into the buffer: + symbol[0][0] = '\0'; + symwidth[0] = 0; + + symbol[1][0] = '\0'; + symwidth[1] = 0; + + if (draw_symbols) { + if (str && str[0] == '@' && str[1] && str[1] != '@') { + // Start with a symbol... + for (symptr = symbol[0]; + *str && !isspace(*str) && symptr < (symbol[0] + sizeof(symbol[0]) - 1); + *symptr++ = *str++); + *symptr = '\0'; + if (isspace(*str)) str++; + symwidth[0] = h; + } + + if (str && (p = strrchr(str, '@')) != NULL && p > (str + 1) && p[-1]!='@') { + strlcpy(symbol[1], p, sizeof(symbol[1])); + symwidth[1] = h; + } + } + + symtotal = symwidth[0] + symwidth[1]; + + for (p = str, lines=0; p;) { + e = expand(p, buf, w - symtotal, buflen, width, w != 0, draw_symbols); + if ((int)ceil(width) > W) W = (int)ceil(width); + lines++; + if (!*e || (*e == '@' && draw_symbols)) break; + p = e; + } + + if ((symwidth[0] || symwidth[1]) && lines) { + if (symwidth[0]) symwidth[0] = lines * fl_height(); + if (symwidth[1]) symwidth[1] = lines * fl_height(); + } + + symtotal = symwidth[0] + symwidth[1]; + + w = W + symtotal; + h = lines*h; +} + +// +// End of "$Id: fl_draw.cxx 5565 2006-12-21 19:39:26Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_draw_image.cxx b/third_party/windows/fltk-1.1.10/src/fl_draw_image.cxx new file mode 100644 index 0000000..74ff178 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_draw_image.cxx @@ -0,0 +1,576 @@ +// +// "$Id: fl_draw_image.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Image drawing routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// I hope a simple and portable method of drawing color and monochrome +// images. To keep this simple, only a single storage type is +// supported: 8 bit unsigned data, byte order RGB, and pixels are +// stored packed into rows with the origin at the top-left. It is +// possible to alter the size of pixels with the "delta" argument, to +// add alpha or other information per pixel. It is also possible to +// change the origin and direction of the image data by messing with +// the "delta" and "linedelta", making them negative, though this may +// defeat some of the shortcuts in translating the image for X. + +#ifdef WIN32 +# include "fl_draw_image_win32.cxx" +#elif defined(__APPLE__) +# include "fl_draw_image_mac.cxx" +#else + +// A list of assumptions made about the X display: + +// bits_per_pixel must be one of 8, 16, 24, 32. + +// scanline_pad must be a power of 2 and greater or equal to 8. + +// PsuedoColor visuals must have 8 bits_per_pixel (although the depth +// may be less than 8). This is the only limitation that affects any +// modern X displays, you can't use 12 or 16 bit colormaps. + +// The mask bits in TrueColor visuals for each color are +// contiguous and have at least one bit of each color. This +// is not checked for. + +// For 24 and 32 bit visuals there must be at least 8 bits of each color. + +//////////////////////////////////////////////////////////////// + +# include +# include +# include +# include "Fl_XColor.H" +# include "flstring.h" + +static XImage xi; // template used to pass info to X +static int bytes_per_pixel; +static int scanline_add; +static int scanline_mask; + +static void (*converter)(const uchar *from, uchar *to, int w, int delta); +static void (*mono_converter)(const uchar *from, uchar *to, int w, int delta); + +static int dir; // direction-alternator +static int ri,gi,bi; // saved error-diffusion value + +# if USE_COLORMAP +//////////////////////////////////////////////////////////////// +// 8-bit converter with error diffusion + +static void color8_converter(const uchar *from, uchar *to, int w, int delta) { + int r=ri, g=gi, b=bi; + int d, td; + if (dir) { + dir = 0; + from = from+(w-1)*delta; + to = to+(w-1); + d = -delta; + td = -1; + } else { + dir = 1; + d = delta; + td = 1; + } + for (; w--; from += d, to += td) { + r += from[0]; if (r < 0) r = 0; else if (r>255) r = 255; + g += from[1]; if (g < 0) g = 0; else if (g>255) g = 255; + b += from[2]; if (b < 0) b = 0; else if (b>255) b = 255; + Fl_Color i = fl_color_cube(r*FL_NUM_RED/256,g*FL_NUM_GREEN/256,b*FL_NUM_BLUE/256); + Fl_XColor& xmap = fl_xmap[0][i]; + if (!xmap.mapped) {if (!fl_redmask) fl_xpixel(r,g,b); else fl_xpixel(i);} + r -= xmap.r; + g -= xmap.g; + b -= xmap.b; + *to = uchar(xmap.pixel); + } + ri = r; gi = g; bi = b; +} + +static void mono8_converter(const uchar *from, uchar *to, int w, int delta) { + int r=ri, g=gi, b=bi; + int d, td; + if (dir) { + dir = 0; + from = from+(w-1)*delta; + to = to+(w-1); + d = -delta; + td = -1; + } else { + dir = 1; + d = delta; + td = 1; + } + for (; w--; from += d, to += td) { + r += from[0]; if (r < 0) r = 0; else if (r>255) r = 255; + g += from[0]; if (g < 0) g = 0; else if (g>255) g = 255; + b += from[0]; if (b < 0) b = 0; else if (b>255) b = 255; + Fl_Color i = fl_color_cube(r*FL_NUM_RED/256,g*FL_NUM_GREEN/256,b*FL_NUM_BLUE/256); + Fl_XColor& xmap = fl_xmap[0][i]; + if (!xmap.mapped) {if (!fl_redmask) fl_xpixel(r,g,b); else fl_xpixel(i);} + r -= xmap.r; + g -= xmap.g; + b -= xmap.b; + *to = uchar(xmap.pixel); + } + ri = r; gi = g; bi = b; +} + +# endif + +//////////////////////////////////////////////////////////////// +// 16 bit TrueColor converters with error diffusion +// Cray computers have no 16-bit type, so we use character pointers +// (which may be slow) + +# ifdef U16 +# define OUTTYPE U16 +# define OUTSIZE 1 +# define OUTASSIGN(v) *t = v +# else +# define OUTTYPE uchar +# define OUTSIZE 2 +# define OUTASSIGN(v) int tt=v; t[0] = uchar(tt>>8); t[1] = uchar(tt) +# endif + +static void color16_converter(const uchar *from, uchar *to, int w, int delta) { + OUTTYPE *t = (OUTTYPE *)to; + int d, td; + if (dir) { + dir = 0; + from = from+(w-1)*delta; + t = t+(w-1)*OUTSIZE; + d = -delta; + td = -OUTSIZE; + } else { + dir = 1; + d = delta; + td = OUTSIZE; + } + int r=ri, g=gi, b=bi; + for (; w--; from += d, t += td) { + r = (r&~fl_redmask) +from[0]; if (r>255) r = 255; + g = (g&~fl_greenmask)+from[1]; if (g>255) g = 255; + b = (b&~fl_bluemask) +from[2]; if (b>255) b = 255; + OUTASSIGN(( + ((r&fl_redmask)<> fl_extrashift); + } + ri = r; gi = g; bi = b; +} + +static void mono16_converter(const uchar *from,uchar *to,int w, int delta) { + OUTTYPE *t = (OUTTYPE *)to; + int d, td; + if (dir) { + dir = 0; + from = from+(w-1)*delta; + t = t+(w-1)*OUTSIZE; + d = -delta; + td = -OUTSIZE; + } else { + dir = 1; + d = delta; + td = OUTSIZE; + } + uchar mask = fl_redmask & fl_greenmask & fl_bluemask; + int r=ri; + for (; w--; from += d, t += td) { + r = (r&~mask) + *from; if (r > 255) r = 255; + uchar m = r&mask; + OUTASSIGN(( + (m<> fl_extrashift); + } + ri = r; +} + +// special-case the 5r6g5b layout used by XFree86: + +static void c565_converter(const uchar *from, uchar *to, int w, int delta) { + OUTTYPE *t = (OUTTYPE *)to; + int d, td; + if (dir) { + dir = 0; + from = from+(w-1)*delta; + t = t+(w-1)*OUTSIZE; + d = -delta; + td = -OUTSIZE; + } else { + dir = 1; + d = delta; + td = OUTSIZE; + } + int r=ri, g=gi, b=bi; + for (; w--; from += d, t += td) { + r = (r&7)+from[0]; if (r>255) r = 255; + g = (g&3)+from[1]; if (g>255) g = 255; + b = (b&7)+from[2]; if (b>255) b = 255; + OUTASSIGN(((r&0xf8)<<8) + ((g&0xfc)<<3) + (b>>3)); + } + ri = r; gi = g; bi = b; +} + +static void m565_converter(const uchar *from,uchar *to,int w, int delta) { + OUTTYPE *t = (OUTTYPE *)to; + int d, td; + if (dir) { + dir = 0; + from = from+(w-1)*delta; + t = t+(w-1)*OUTSIZE; + d = -delta; + td = -OUTSIZE; + } else { + dir = 1; + d = delta; + td = OUTSIZE; + } + int r=ri; + for (; w--; from += d, t += td) { + r = (r&7) + *from; if (r > 255) r = 255; + OUTASSIGN((r>>3) * 0x841); + } + ri = r; +} + +//////////////////////////////////////////////////////////////// +// 24bit TrueColor converters: + +static void rgb_converter(const uchar *from, uchar *to, int w, int delta) { + int d = delta-3; + for (; w--; from += d) { + *to++ = *from++; + *to++ = *from++; + *to++ = *from++; + } +} + +static void bgr_converter(const uchar *from, uchar *to, int w, int delta) { + for (; w--; from += delta) { + uchar r = from[0]; + uchar g = from[1]; + *to++ = from[2]; + *to++ = g; + *to++ = r; + } +} + +static void rrr_converter(const uchar *from, uchar *to, int w, int delta) { + for (; w--; from += delta) { + *to++ = *from; + *to++ = *from; + *to++ = *from; + } +} + +//////////////////////////////////////////////////////////////// +// 32bit TrueColor converters on a 32 or 64-bit machine: + +# ifdef U64 +# define STORETYPE U64 +# if WORDS_BIGENDIAN +# define INNARDS32(f) \ + U64 *t = (U64*)to; \ + int w1 = (w+1)/2; \ + for (; w1--; from += delta) {U64 i = f; from += delta; *t++ = (i<<32)|(f);} +# else +# define INNARDS32(f) \ + U64 *t = (U64*)to; \ + int w1 = (w+1)/2; \ + for (; w1--; from += delta) {U64 i=f; from+= delta; *t++ = ((U64)(f)<<32)|i;} +# endif +# else +# define STORETYPE U32 +# define INNARDS32(f) \ + U32 *t = (U32*)to; for (; w--; from += delta) *t++ = f +# endif + +static void rgbx_converter(const uchar *from, uchar *to, int w, int delta) { + INNARDS32((unsigned(from[0])<<24)+(from[1]<<16)+(from[2]<<8)); +} + +static void xbgr_converter(const uchar *from, uchar *to, int w, int delta) { + INNARDS32((from[0])+(from[1]<<8)+(from[2]<<16)); +} + +static void xrgb_converter(const uchar *from, uchar *to, int w, int delta) { + INNARDS32((from[0]<<16)+(from[1]<<8)+(from[2])); +} + +static void bgrx_converter(const uchar *from, uchar *to, int w, int delta) { + INNARDS32((from[0]<<8)+(from[1]<<16)+(unsigned(from[2])<<24)); +} + +static void rrrx_converter(const uchar *from, uchar *to, int w, int delta) { + INNARDS32(unsigned(*from) * 0x1010100U); +} + +static void xrrr_converter(const uchar *from, uchar *to, int w, int delta) { + INNARDS32(*from * 0x10101U); +} + +static void +color32_converter(const uchar *from, uchar *to, int w, int delta) { + INNARDS32( + (from[0]<depth == fl_visual->depth) break; + xi.format = ZPixmap; + xi.byte_order = ImageByteOrder(fl_display); +//i.bitmap_unit = 8; +//i.bitmap_bit_order = MSBFirst; +//i.bitmap_pad = 8; + xi.depth = fl_visual->depth; + xi.bits_per_pixel = pfv->bits_per_pixel; + + if (xi.bits_per_pixel & 7) bytes_per_pixel = 0; // produce fatal error + else bytes_per_pixel = xi.bits_per_pixel/8; + + unsigned int n = pfv->scanline_pad/8; + if (pfv->scanline_pad & 7 || (n&(n-1))) + Fl::fatal("Can't do scanline_pad of %d",pfv->scanline_pad); + if (n < sizeof(STORETYPE)) n = sizeof(STORETYPE); + scanline_add = n-1; + scanline_mask = -n; + +# if USE_COLORMAP + if (bytes_per_pixel == 1) { + converter = color8_converter; + mono_converter = mono8_converter; + return; + } + if (!fl_visual->red_mask) + Fl::fatal("Can't do %d bits_per_pixel colormap",xi.bits_per_pixel); +# endif + + // otherwise it is a TrueColor visual: + + int rs = fl_redshift; + int gs = fl_greenshift; + int bs = fl_blueshift; + + switch (bytes_per_pixel) { + + case 2: + // All 16-bit TrueColor visuals are supported on any machine with + // 24 or more bits per integer. +# ifdef U16 + xi.byte_order = WORDS_BIGENDIAN; +# else + xi.byte_order = 1; +# endif + if (rs == 11 && gs == 6 && bs == 0 && fl_extrashift == 3) { + converter = c565_converter; + mono_converter = m565_converter; + } else { + converter = color16_converter; + mono_converter = mono16_converter; + } + break; + + case 3: + if (xi.byte_order) {rs = 16-rs; gs = 16-gs; bs = 16-bs;} + if (rs == 0 && gs == 8 && bs == 16) { + converter = rgb_converter; + mono_converter = rrr_converter; + } else if (rs == 16 && gs == 8 && bs == 0) { + converter = bgr_converter; + mono_converter = rrr_converter; + } else { + Fl::fatal("Can't do arbitrary 24bit color"); + } + break; + + case 4: + if ((xi.byte_order!=0) != WORDS_BIGENDIAN) + {rs = 24-rs; gs = 24-gs; bs = 24-bs;} + if (rs == 0 && gs == 8 && bs == 16) { + converter = xbgr_converter; + mono_converter = xrrr_converter; + } else if (rs == 24 && gs == 16 && bs == 8) { + converter = rgbx_converter; + mono_converter = rrrx_converter; + } else if (rs == 8 && gs == 16 && bs == 24) { + converter = bgrx_converter; + mono_converter = rrrx_converter; + } else if (rs == 16 && gs == 8 && bs == 0) { + converter = xrgb_converter; + mono_converter = xrrr_converter; + } else { + xi.byte_order = WORDS_BIGENDIAN; + converter = color32_converter; + mono_converter = mono32_converter; + } + break; + + default: + Fl::fatal("Can't do %d bits_per_pixel",xi.bits_per_pixel); + } + +} + +# define MAXBUFFER 0x40000 // 256k + +static void innards(const uchar *buf, int X, int Y, int W, int H, + int delta, int linedelta, int mono, + Fl_Draw_Image_Cb cb, void* userdata) +{ + if (!linedelta) linedelta = W*delta; + + int dx, dy, w, h; + fl_clip_box(X,Y,W,H,dx,dy,w,h); + if (w<=0 || h<=0) return; + dx -= X; + dy -= Y; + + if (!bytes_per_pixel) figure_out_visual(); + xi.width = w; + xi.height = h; + + void (*conv)(const uchar *from, uchar *to, int w, int delta) = converter; + if (mono) conv = mono_converter; + + // See if the data is already in the right format. Unfortunately + // some 32-bit x servers (XFree86) care about the unknown 8 bits + // and they must be zero. I can't confirm this for user-supplied + // data, so the 32-bit shortcut is disabled... + // This can set bytes_per_line negative if image is bottom-to-top + // I tested it on Linux, but it may fail on other Xlib implementations: + if (buf && ( +# if 0 // set this to 1 to allow 32-bit shortcut + delta == 4 && +# if WORDS_BIGENDIAN + conv == rgbx_converter +# else + conv == xbgr_converter +# endif + || +# endif + conv == rgb_converter && delta==3 + ) && !(linedelta&scanline_add)) { + xi.data = (char *)(buf+delta*dx+linedelta*dy); + xi.bytes_per_line = linedelta; + + } else { + int linesize = ((w*bytes_per_pixel+scanline_add)&scanline_mask)/sizeof(STORETYPE); + int blocking = h; + static STORETYPE *buffer; // our storage, always word aligned + static long buffer_size; + {int size = linesize*h; + if (size > MAXBUFFER) { + size = MAXBUFFER; + blocking = MAXBUFFER/linesize; + } + if (size > buffer_size) { + delete[] buffer; + buffer_size = size; + buffer = new STORETYPE[size]; + }} + xi.data = (char *)buffer; + xi.bytes_per_line = linesize*sizeof(STORETYPE); + if (buf) { + buf += delta*dx+linedelta*dy; + for (int j=0; j-3),0,0); +} +void fl_draw_image(Fl_Draw_Image_Cb cb, void* data, + int x, int y, int w, int h,int d) { + innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data); +} +void fl_draw_image_mono(const uchar* buf, int x, int y, int w, int h, int d, int l){ + innards(buf,x,y,w,h,d,l,1,0,0); +} +void fl_draw_image_mono(Fl_Draw_Image_Cb cb, void* data, + int x, int y, int w, int h,int d) { + innards(0,x,y,w,h,d,0,1,cb,data); +} + +void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) { + if (fl_visual->depth > 16) { + fl_color(r,g,b); + fl_rectf(x,y,w,h); + } else { + uchar c[3]; + c[0] = r; c[1] = g; c[2] = b; + innards(c,x,y,w,h,0,0,0,0,0); + } +} + +#endif + +// +// End of "$Id: fl_draw_image.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_draw_image_mac.cxx b/third_party/windows/fltk-1.1.10/src/fl_draw_image_mac.cxx new file mode 100644 index 0000000..63abe27 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_draw_image_mac.cxx @@ -0,0 +1,274 @@ +// +// "$Id: fl_draw_image_mac.cxx 5614 2007-01-18 15:25:09Z matt $" +// +// MacOS image drawing code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +//////////////////////////////////////////////////////////////// + +#include +#include +#include +#include + +#define MAXBUFFER 0x40000 // 256k + +/** + * draw an image based on the input parameters + * + * buf: image source data + * X, Y: position (in buffer?!) + * W, H: size of picture (in pixel?) + * delta: distance from pixel to pixel in buf in bytes + * linedelta: distance from line to line in buf in bytes + * mono: if set, pixel is one byte - if zero, pixel is 3 byte + * cb: callback to copy image data into (RGB?) buffer + * buf: pointer to first byte in image source + * x, y: position in buffer + * w: width (in bytes?) + * dst: destination buffer + * userdata: ? + */ +static void innards(const uchar *buf, int X, int Y, int W, int H, + int delta, int linedelta, int mono, + Fl_Draw_Image_Cb cb, void* userdata) +{ + if (!linedelta) linedelta = W*delta; + +#ifdef __APPLE_QD__ + // theoretically, if the current GPort permits, we could write + // directly into it, avoiding the temporary GWorld. For now I + // will go the safe way... . + char direct = 0; + GWorldPtr gw; + Rect bounds; + bounds.left=0; bounds.right=W; bounds.top=0; bounds.bottom=H; + QDErr err = NewGWorld( &gw, 32, &bounds, 0L, 0L, useTempMem ); + if (err==noErr && gw) { + PixMapHandle pm = GetGWorldPixMap( gw ); + if ( pm ) { + LockPixels( pm ); + if ( *pm ) { + uchar *base = (uchar*)GetPixBaseAddr( pm ); + if ( base ) { + PixMapPtr pmp = *pm; + // make absolutely sure that we can use a direct memory write to + // create the pixmap! + if ( pmp->pixelType == 16 || pmp->pixelSize == 32 || pmp->cmpCount == 3 || pmp->cmpSize == 8 ) { + int rowBytes = pmp->rowBytes & 0x3fff; + if ( cb ) + { + uchar *tmpBuf = new uchar[ W*delta ]; + if ( mono ) delta -= 1; else delta -= 3; + for ( int i=0; i-3),0,0); +} +void fl_draw_image(Fl_Draw_Image_Cb cb, void* data, + int x, int y, int w, int h,int d) { + innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data); +} +void fl_draw_image_mono(const uchar* buf, int x, int y, int w, int h, int d, int l){ + innards(buf,x,y,w,h,d,l,1,0,0); +} +void fl_draw_image_mono(Fl_Draw_Image_Cb cb, void* data, + int x, int y, int w, int h,int d) { + innards(0,x,y,w,h,d,0,1,cb,data); +} + +void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) { + fl_color(r,g,b); + fl_rectf(x,y,w,h); +} + +// +// End of "$Id: fl_draw_image_mac.cxx 5614 2007-01-18 15:25:09Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_draw_image_win32.cxx b/third_party/windows/fltk-1.1.10/src/fl_draw_image_win32.cxx new file mode 100644 index 0000000..2f505a1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_draw_image_win32.cxx @@ -0,0 +1,325 @@ +// +// "$Id: fl_draw_image_win32.cxx 6843 2009-08-24 19:53:06Z AlbrechtS $" +// +// WIN32 image drawing code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// I hope a simple and portable method of drawing color and monochrome +// images. To keep this simple, only a single storage type is +// supported: 8 bit unsigned data, byte order RGB, and pixels are +// stored packed into rows with the origin at the top-left. It is +// possible to alter the size of pixels with the "delta" argument, to +// add alpha or other information per pixel. It is also possible to +// change the origin and direction of the image data by messing with +// the "delta" and "linedelta", making them negative, though this may +// defeat some of the shortcuts in translating the image for X. + +// Unbelievably (since it conflicts with how most PC software works) +// Micro$oft picked a bottom-up and BGR storage format for their +// DIB images. I'm pretty certain there is a way around this, but +// I can't find any other than the brute-force method of drawing +// each line as a seperate image. This may also need to be done +// if the delta is any amount other than 1, 3, or 4. + +//////////////////////////////////////////////////////////////// + +#include +#include +#include +#include + +#define MAXBUFFER 0x40000 // 256k + +#if USE_COLORMAP + +// error-diffusion dither into the FLTK colormap +static void dither(uchar* to, const uchar* from, int w, int delta) { + static int ri, gi, bi, dir; + int r=ri, g=gi, b=bi; + int d, td; + if (dir) { + dir = 0; + from = from+(w-1)*delta; + to = to+(w-1); + d = -delta; + td = -1; + } else { + dir = 1; + d = delta; + td = 1; + } + for (; w--; from += d, to += td) { + r += from[0]; if (r < 0) r = 0; else if (r>255) r = 255; + int rr = r*FL_NUM_RED/256; + r -= rr*255/(FL_NUM_RED-1); + g += from[1]; if (g < 0) g = 0; else if (g>255) g = 255; + int gg = g*FL_NUM_GREEN/256; + g -= gg*255/(FL_NUM_GREEN-1); + b += from[2]; if (b < 0) b = 0; else if (b>255) b = 255; + int bb = b*FL_NUM_BLUE/256; + b -= bb*255/(FL_NUM_BLUE-1); + *to = uchar(FL_COLOR_CUBE+(bb*FL_NUM_RED+rr)*FL_NUM_GREEN+gg); + } + ri = r; gi = g; bi = b; +} + +// error-diffusion dither into the FLTK colormap +static void monodither(uchar* to, const uchar* from, int w, int delta) { + static int ri,dir; + int r=ri; + int d, td; + if (dir) { + dir = 0; + from = from+(w-1)*delta; + to = to+(w-1); + d = -delta; + td = -1; + } else { + dir = 1; + d = delta; + td = 1; + } + for (; w--; from += d, to += td) { + r += *from; if (r < 0) r = 0; else if (r>255) r = 255; + int rr = r*FL_NUM_GRAY/256; + r -= rr*255/(FL_NUM_GRAY-1); + *to = uchar(FL_GRAY_RAMP+rr); + } + ri = r; +} + +#endif // USE_COLORMAP + +static void innards(const uchar *buf, int X, int Y, int W, int H, + int delta, int linedelta, int depth, + Fl_Draw_Image_Cb cb, void* userdata) +{ + char indexed = 0; + +#if USE_COLORMAP + indexed = (fl_palette != 0); +#endif + + if (depth==0) depth = 3; + if (indexed || !fl_can_do_alpha_blending()) + depth = (depth-1)|1; + + if (!linedelta) linedelta = W*delta; + + int x, y, w, h; + fl_clip_box(X,Y,W,H,x,y,w,h); + if (w<=0 || h<=0) return; + if (buf) buf += (x-X)*delta + (y-Y)*linedelta; + + static U32 bmibuffer[256+12]; + BITMAPINFO &bmi = *((BITMAPINFO*)bmibuffer); + if (!bmi.bmiHeader.biSize) { + bmi.bmiHeader.biSize = sizeof(bmi)-4; // does it use this to determine type? + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biCompression = BI_RGB; + bmi.bmiHeader.biXPelsPerMeter = 0; + bmi.bmiHeader.biYPelsPerMeter = 0; + bmi.bmiHeader.biClrUsed = 0; + bmi.bmiHeader.biClrImportant = 0; + } +#if USE_COLORMAP + if (indexed) { + for (short i=0; i<256; i++) { + *((short*)(bmi.bmiColors)+i) = i; + } + } else +#endif + if (depth<3) { + for (int i=0; i<256; i++) { + bmi.bmiColors[i].rgbBlue = (uchar)i; + bmi.bmiColors[i].rgbGreen = (uchar)i; + bmi.bmiColors[i].rgbRed = (uchar)i; + bmi.bmiColors[i].rgbReserved = (uchar)0; // must be zero + } + } + bmi.bmiHeader.biWidth = w; +#if USE_COLORMAP + bmi.bmiHeader.biBitCount = indexed ? 8 : depth*8; + int pixelsize = indexed ? 1 : depth; +#else + bmi.bmiHeader.biBitCount = depth*8; + int pixelsize = depth; +#endif + if (depth==2) { // special case: gray with alpha + bmi.bmiHeader.biBitCount = 32; + pixelsize = 4; + } + int linesize = (pixelsize*w+3)&~3; + + static U32* buffer; + int blocking = h; + {int size = linesize*h; + if (size > MAXBUFFER) { + size = MAXBUFFER; + blocking = MAXBUFFER/linesize; + } + static long buffer_size; + if (size > buffer_size) { + delete[] buffer; + buffer_size = size; + buffer = new U32[(size+3)/4]; + }} + bmi.bmiHeader.biHeight = blocking; + static U32* line_buffer; + if (!buf) { + int size = W*delta; + static int line_buf_size; + if (size > line_buf_size) { + delete[] line_buffer; + line_buf_size = size; + line_buffer = new U32[(size+3)/4]; + } + } + for (int j=0; j>8; + to[0] = gray; + to[1] = gray; + to[2] = gray; + to[3] = a; + } + break; + case 3: + for (i=w; i--; from += delta, to += 3) { + uchar r = from[0]; + to[0] = from[2]; + to[1] = from[1]; + to[2] = r; + } + break; + case 4: + for (i=w; i--; from += delta, to += 4) { + uchar a = from[3]; + uchar r = from[0]; + to[0] = (from[2]*a)>>8; + to[1] = (from[1]*a)>>8; + to[2] = (r*a)>>8; + to[3] = from[3]; + } + break; + } + } + } + SetDIBitsToDevice(fl_gc, x, y+j-k, w, k, 0, 0, 0, k, + (LPSTR)((uchar*)buffer+(blocking-k)*linesize), + &bmi, +#if USE_COLORMAP + indexed ? DIB_PAL_COLORS : DIB_RGB_COLORS +#else + DIB_RGB_COLORS +#endif + ); + } +} + +static int fl_abs(int v) { return v<0 ? -v : v; } + +void fl_draw_image(const uchar* buf, int x, int y, int w, int h, int d, int l){ + if (fl_abs(d)&FL_IMAGE_WITH_ALPHA) { + d ^= FL_IMAGE_WITH_ALPHA; + innards(buf,x,y,w,h,d,l,fl_abs(d),0,0); + } else { + innards(buf,x,y,w,h,d,l,(d<3&&d>-3),0,0); + } +} + +void fl_draw_image(Fl_Draw_Image_Cb cb, void* data, + int x, int y, int w, int h,int d) { + if (fl_abs(d)&FL_IMAGE_WITH_ALPHA) { + d ^= FL_IMAGE_WITH_ALPHA; + innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data); + } else { + innards(0,x,y,w,h,d,0,(d<3&&d>-3),cb,data); + } +} + +void fl_draw_image_mono(const uchar* buf, int x, int y, int w, int h, int d, int l){ + if (fl_abs(d)&FL_IMAGE_WITH_ALPHA) { + d ^= FL_IMAGE_WITH_ALPHA; + innards(buf,x,y,w,h,d,l,1,0,0); + } else { + innards(buf,x,y,w,h,d,l,1,0,0); + } +} + +void fl_draw_image_mono(Fl_Draw_Image_Cb cb, void* data, + int x, int y, int w, int h,int d) { + if (fl_abs(d)&FL_IMAGE_WITH_ALPHA) { + d ^= FL_IMAGE_WITH_ALPHA; + innards(0,x,y,w,h,d,0,1,cb,data); + } else { + innards(0,x,y,w,h,d,0,1,cb,data); + } +} + +void fl_rectf(int x, int y, int w, int h, uchar r, uchar g, uchar b) { +#if USE_COLORMAP + // use the error diffusion dithering code to produce a much nicer block: + if (fl_palette) { + uchar c[3]; + c[0] = r; c[1] = g; c[2] = b; + innards(c,x,y,w,h,0,0,0,0,0); + return; + } +#endif + fl_color(r,g,b); + fl_rectf(x,y,w,h); +} + +// +// End of "$Id: fl_draw_image_win32.cxx 6843 2009-08-24 19:53:06Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_draw_pixmap.cxx b/third_party/windows/fltk-1.1.10/src/fl_draw_pixmap.cxx new file mode 100644 index 0000000..c76be55 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_draw_pixmap.cxx @@ -0,0 +1,340 @@ +// +// "$Id: fl_draw_pixmap.cxx 6026 2008-02-14 18:17:06Z matt $" +// +// Pixmap drawing code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Implemented without using the xpm library (which I can't use because +// it interferes with the color cube used by fl_draw_image). +// Current implementation is cheap and slow, and works best on a full-color +// display. Transparency is not handled, and colors are dithered to +// the color cube. Color index is achieved by adding the id +// characters together! Also mallocs a lot of temporary memory! +// Notice that there is no pixmap file interface. This is on purpose, +// as I want to discourage programs that require support files to work. +// All data needed by a program ui should be compiled in!!! + +#include +#include +#include +#include +#include "flstring.h" + +static int ncolors, chars_per_pixel; + +int fl_measure_pixmap(/*const*/ char* const* data, int &w, int &h) { + return fl_measure_pixmap((const char*const*)data,w,h); +} + +int fl_measure_pixmap(const char * const *data, int &w, int &h) { + int i = sscanf(data[0],"%d%d%d%d",&w,&h,&ncolors,&chars_per_pixel); + if (i<4 || w<=0 || h<=0 || + chars_per_pixel!=1 && chars_per_pixel!=2) return w=0; + return 1; +} + +#ifdef U64 + +// The callback from fl_draw_image to get a row of data passes this: +struct pixmap_data { + int w, h; + const uchar*const* data; + union { + U64 colors[256]; + U64* byte1[256]; + }; +}; + +// callback for 1 byte per pixel: +static void cb1(void*v, int x, int y, int w, uchar* buf) { + pixmap_data& d = *(pixmap_data*)v; + const uchar* p = d.data[y]+x; + U64* q = (U64*)buf; + for (int X=w; X>0; X-=2, p += 2) { + if (X>1) { +# if WORDS_BIGENDIAN + *q++ = (d.colors[p[0]]<<32) | d.colors[p[1]]; +# else + *q++ = (d.colors[p[1]]<<32) | d.colors[p[0]]; +# endif + } else { +# if WORDS_BIGENDIAN + *q++ = d.colors[p[0]]<<32; +# else + *q++ = d.colors[p[0]]; +# endif + } + } +} + +// callback for 2 bytes per pixel: +static void cb2(void*v, int x, int y, int w, uchar* buf) { + pixmap_data& d = *(pixmap_data*)v; + const uchar* p = d.data[y]+2*x; + U64* q = (U64*)buf; + for (int X=w; X>0; X-=2) { + U64* colors = d.byte1[*p++]; + int index = *p++; + if (X>1) { + U64* colors1 = d.byte1[*p++]; + int index1 = *p++; +# if WORDS_BIGENDIAN + *q++ = (colors[index]<<32) | colors1[index1]; +# else + *q++ = (colors1[index1]<<32) | colors[index]; +# endif + } else { +# if WORDS_BIGENDIAN + *q++ = colors[index]<<32; +# else + *q++ = colors[index]; +# endif + } + } +} + +#else // U32 + +// The callback from fl_draw_image to get a row of data passes this: +struct pixmap_data { + int w, h; + const uchar*const* data; + union { + U32 colors[256]; + U32* byte1[256]; + }; +}; + +# ifndef __APPLE_QUARTZ__ + +// callback for 1 byte per pixel: +static void cb1(void*v, int x, int y, int w, uchar* buf) { + pixmap_data& d = *(pixmap_data*)v; + const uchar* p = d.data[y]+x; + U32* q = (U32*)buf; + for (int X=w; X--;) *q++ = d.colors[*p++]; +} + +// callback for 2 bytes per pixel: +static void cb2(void*v, int x, int y, int w, uchar* buf) { + pixmap_data& d = *(pixmap_data*)v; + const uchar* p = d.data[y]+2*x; + U32* q = (U32*)buf; + for (int X=w; X--;) { + U32* colors = d.byte1[*p++]; + *q++ = colors[*p++]; + } +} + +# endif // !__APPLE_QUARTZ__ + +#endif // U64 else U32 + +uchar **fl_mask_bitmap; // if non-zero, create bitmap and store pointer here + +int fl_draw_pixmap(/*const*/ char* const* data, int x,int y,Fl_Color bg) { + return fl_draw_pixmap((const char*const*)data,x,y,bg); +} + +int fl_draw_pixmap(const char*const* di, int x, int y, Fl_Color bg) { + pixmap_data d; + if (!fl_measure_pixmap(di, d.w, d.h)) return 0; + const uchar*const* data = (const uchar*const*)(di+1); + int transparent_index = -1; + + if (ncolors < 0) { // FLTK (non standard) compressed colormap + ncolors = -ncolors; + const uchar *p = *data++; + // if first color is ' ' it is transparent (put it later to make + // it not be transparent): + if (*p == ' ') { + uchar* c = (uchar*)&d.colors[(int)' ']; +#ifdef U64 + *(U64*)c = 0; +# if WORDS_BIGENDIAN + c += 4; +# endif +#endif + transparent_index = ' '; + Fl::get_color(bg, c[0], c[1], c[2]); c[3] = 0; + p += 4; + ncolors--; + } + // read all the rest of the colors: + for (int i=0; i < ncolors; i++) { + uchar* c = (uchar*)&d.colors[*p++]; +#ifdef U64 + *(U64*)c = 0; +# if WORDS_BIGENDIAN + c += 4; +# endif +#endif + *c++ = *p++; + *c++ = *p++; + *c++ = *p++; +#ifdef __APPLE_QUARTZ__ + *c = 255; +#else + *c = 0; +#endif + } + } else { // normal XPM colormap with names + if (chars_per_pixel>1) memset(d.byte1, 0, sizeof(d.byte1)); + for (int i=0; i1) { +#ifdef U64 + U64* colors = d.byte1[ind]; + if (!colors) colors = d.byte1[ind] = new U64[256]; +#else + U32* colors = d.byte1[ind]; + if (!colors) colors = d.byte1[ind] = new U32[256]; +#endif + c = (uchar*)&colors[*p]; + ind = (ind<<8)|*p++; + } else { + c = (uchar *)&d.colors[ind]; + } + // look for "c word", or last word if none: + const uchar *previous_word = p; + for (;;) { + while (*p && isspace(*p)) p++; + uchar what = *p++; + while (*p && !isspace(*p)) p++; + while (*p && isspace(*p)) p++; + if (!*p) {p = previous_word; break;} + if (what == 'c') break; + previous_word = p; + while (*p && !isspace(*p)) p++; + } +#ifdef U64 + *(U64*)c = 0; +# if WORDS_BIGENDIAN + c += 4; +# endif +#endif +#ifdef __APPLE_QUARTZ__ + c[3] = 255; +#endif + if (!fl_parse_color((const char*)p, c[0], c[1], c[2])) { + // assume "None" or "#transparent" for any errors + // "bg" should be transparent... + Fl::get_color(bg, c[0], c[1], c[2]); +#ifdef __APPLE_QUARTZ__ + c[3] = 0; +#endif + transparent_index = ind; + } + } + } + d.data = data; + +#ifndef __APPLE_QUARTZ__ + + // build the mask bitmap used by Fl_Pixmap: + if (fl_mask_bitmap && transparent_index >= 0) { + int W = (d.w+7)/8; + uchar* bitmap = new uchar[W * d.h]; + *fl_mask_bitmap = bitmap; + for (int Y = 0; Y < d.h; Y++) { + const uchar* p = data[Y]; + if (chars_per_pixel <= 1) { + int dw = d.w; + for (int X = 0; X < W; X++) { + uchar b = (dw-->0 && *p++ != transparent_index); + if (dw-->0 && *p++ != transparent_index) b |= 2; + if (dw-->0 && *p++ != transparent_index) b |= 4; + if (dw-->0 && *p++ != transparent_index) b |= 8; + if (dw-->0 && *p++ != transparent_index) b |= 16; + if (dw-->0 && *p++ != transparent_index) b |= 32; + if (dw-->0 && *p++ != transparent_index) b |= 64; + if (dw-->0 && *p++ != transparent_index) b |= 128; + *bitmap++ = b; + } + } else { + uchar b = 0, bit = 1; + for (int X = 0; X < d.w; X++) { + int ind = *p++; + ind = (ind<<8) | (*p++); + if (ind != transparent_index) b |= bit; + + if (bit < 128) bit <<= 1; + else { + *bitmap++ = b; + b = 0; + bit = 1; + } + } + + if (bit > 1) *bitmap++ = b; + } + } + } + + fl_draw_image(chars_per_pixel==1 ? cb1 : cb2, &d, x, y, d.w, d.h, 4); + +#else // __APPLE_QUARTZ__ + + bool transparent = (transparent_index>=0); + transparent = true; + U32 *array = new U32[d.w * d.h], *q = array; + for (int Y = 0; Y < d.h; Y++) { + const uchar* p = data[Y]; + if (chars_per_pixel <= 1) { + for (int X = 0; X < d.w; X++) { + *q++ = d.colors[*p++]; + } + } else { + for (int X = 0; X < d.w; X++) { + U32* colors = d.byte1[*p++]; + *q++ = colors[*p++]; + } + } + } + CGColorSpaceRef lut = CGColorSpaceCreateDeviceRGB(); + CGDataProviderRef src = CGDataProviderCreateWithData( 0L, array, d.w * d.h * 4, 0L); + CGImageRef img = CGImageCreate(d.w, d.h, 8, 4*8, 4*d.w, + lut, transparent?kCGImageAlphaLast:kCGImageAlphaNoneSkipLast, + src, 0L, false, kCGRenderingIntentDefault); + CGColorSpaceRelease(lut); + CGDataProviderRelease(src); + CGRect rect = { { x, y} , { d.w, d.h } }; + Fl_X::q_begin_image(rect, 0, 0, d.w, d.h); + CGContextDrawImage(fl_gc, rect, img); + Fl_X::q_end_image(); + CGImageRelease(img); + delete array; + +#endif // !__APPLE_QUARTZ__ + + if (chars_per_pixel > 1) for (int i = 0; i < 256; i++) delete[] d.byte1[i]; + return 1; +} + +// +// End of "$Id: fl_draw_pixmap.cxx 6026 2008-02-14 18:17:06Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_encoding_latin1.cxx b/third_party/windows/fltk-1.1.10/src/fl_encoding_latin1.cxx new file mode 100644 index 0000000..a3ef041 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_encoding_latin1.cxx @@ -0,0 +1,137 @@ +// +// "$Id: fl_encoding_latin1.cxx 6922 2009-10-29 20:00:12Z matt $" +// +// Convert MSWindows-1252 (Latin-1) encoded text to the local encoding. +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include "flstring.h" + +#ifdef __APPLE__ + +// These function assume a western code page. If you need to support +// scripts that are not part of this code page, you might want to +// take a look at FLTK2, which uses utf8 for text encoding. +// +// By keeping these conversion tables in their own module, they will not +// be statically linked (by a smart linker) unless actually used. +// +// On MS-Windows, nothing need to be converted. We simply return the +// original pointer. +// +// Most X11 implementations seem to default to Latin-1 as a code since it +// is a superset of ISO 8859-1, the original wetsern codepage on X11. +// +// Apple's OS X however renders text in MacRoman for western settings. The +// lookup tables below will convert all common character codes and replace +// unknown characters with an upsidedown question mark. + +// This table converts MSWindows-1252/Latin 1 into MacRoman encoding +static uchar latin2roman[128] = { +0xdb, 0xc0, 0xe2, 0xc4, 0xe3, 0xc9, 0xa0, 0xe0, 0xf6, 0xe4, 0xc0, 0xdc, 0xce, 0xc0, 0xc0, 0xc0, +0xc0, 0xd4, 0xd5, 0xd2, 0xd3, 0xa5, 0xd0, 0xd1, 0xf7, 0xaa, 0xc0, 0xdd, 0xcf, 0xc0, 0xc0, 0xd9, +0xca, 0xc1, 0xa2, 0xa3, 0xc0, 0xb4, 0xc0, 0xa4, 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0xc0, 0xa8, 0xf8, +0xa1, 0xb1, 0xc0, 0xc0, 0xab, 0xb5, 0xa6, 0xe1, 0xfc, 0xc0, 0xbc, 0xc8, 0xc0, 0xc0, 0xc0, 0xc0, +0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, +0xc0, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0xc0, 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0xc0, 0xc0, 0xa7, +0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, +0xc0, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0xc0, 0xc0, 0xd8 +}; + +// This table converts MacRoman into MSWindows-1252/Latin 1 +static uchar roman2latin[128] = { +0xc4, 0xc5, 0xc7, 0xc9, 0xd1, 0xd6, 0xdc, 0xe1, 0xe0, 0xe2, 0xe4, 0xe3, 0xe5, 0xe7, 0xe9, 0xe8, +0xea, 0xeb, 0xed, 0xec, 0xee, 0xef, 0xf1, 0xf3, 0xf2, 0xf4, 0xf6, 0xf5, 0xfa, 0xf9, 0xfb, 0xfc, +0x86, 0xb0, 0xa2, 0xa3, 0xa7, 0x95, 0xb6, 0xdf, 0xae, 0xa9, 0x99, 0xb4, 0xa8, 0xbf, 0xc6, 0xd8, +0xbf, 0xb1, 0xbf, 0xbf, 0xa5, 0xb5, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xaa, 0xba, 0xbf, 0xe6, 0xf8, +0xbf, 0xa1, 0xac, 0xbf, 0x83, 0xbf, 0xbf, 0xab, 0xbb, 0x85, 0xa0, 0xc0, 0xc3, 0xd5, 0x8c, 0x9c, +0x96, 0x97, 0x93, 0x94, 0x91, 0x92, 0xf7, 0xbf, 0xff, 0x9f, 0xbf, 0x80, 0x8b, 0x9b, 0xbf, 0xbf, +0x87, 0xb7, 0x82, 0x84, 0x89, 0xc2, 0xca, 0xc1, 0xcb, 0xc8, 0xcd, 0xce, 0xcf, 0xcc, 0xd3, 0xd4, +0xbf, 0xd2, 0xda, 0xdb, 0xd9, 0xbf, 0x88, 0x98, 0xaf, 0xbf, 0xbf, 0xbf, 0xb8, 0xbf, 0xbf, 0xbf +}; + +static char *buf = 0; +static int n_buf = 0; + +const char *fl_latin1_to_local(const char *t, int n) +{ + if (n==-1) n = strlen(t)+1; + if (n>=n_buf) { + n_buf = (n + 257) & 0x7fffff00; + if (buf) free(buf); + buf = (char*)malloc(n_buf); + } + const uchar *src = (const uchar*)t; + uchar *dst = (uchar*)buf; + for ( ; n>0; n--) { + uchar c = *src++; + if (c>127) + *dst++ = latin2roman[c-128]; + else + *dst++ = c; + } + //*dst = 0; // this would be wrong! + return buf; +} + +const char *fl_local_to_latin1(const char *t, int n) +{ + if (n==-1) n = strlen(t)+1; + if (n>=n_buf) { + n_buf = (n + 257) & 0x7fffff00; + if (buf) free(buf); + buf = (char*)malloc(n_buf); + } + const uchar *src = (const uchar*)t; + uchar *dst = (uchar*)buf; + for ( ; n>0; n--) { + uchar c = *src++; + if (c>127) + *dst++ = roman2latin[c-128]; + else + *dst++ = c; + } + //*dst = 0; // this would be wrong + return buf; +} + +#else + +const char *fl_latin1_to_local(const char *t, int) +{ + return t; +} + +const char *fl_local_to_latin1(const char *t, int) +{ + return t; +} + +#endif + +// +// End of "$Id: fl_encoding_latin1.cxx 6922 2009-10-29 20:00:12Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_encoding_mac_roman.cxx b/third_party/windows/fltk-1.1.10/src/fl_encoding_mac_roman.cxx new file mode 100644 index 0000000..838a8b0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_encoding_mac_roman.cxx @@ -0,0 +1,134 @@ +// +// "$Id: fl_encoding_mac_roman.cxx 6922 2009-10-29 20:00:12Z matt $" +// +// Convert Mac Roman encoded text to the local encoding. +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include "flstring.h" + +// These function assume a western code page. If you need to support +// scripts that are not part of this code page, you might want to +// take a look at FLTK2, which uses utf8 for text encoding. +// +// By keeping these conversion tables in their own module, they will not +// be statically linked (by a smart linker) unless actually used. +// +// On Mac OS X, nothing need to be converted. We simply return the +// original pointer. +// +// MSWindows and X11 render text in ISO or Latin-1 for western settings. The +// lookup tables below will convert all common character codes and replace +// unknown characters with an upsidedown question mark. + +#ifdef __APPLE__ + +const char *fl_mac_roman_to_local(const char *t, int) +{ + return t; +} + +const char *fl_local_to_mac_roman(const char *t, int) +{ + return t; +} + +#else + +// This table converts MSWindows-1252/Latin 1 into MacRoman encoding +static uchar latin2roman[128] = { +0xdb, 0xc0, 0xe2, 0xc4, 0xe3, 0xc9, 0xa0, 0xe0, 0xf6, 0xe4, 0xc0, 0xdc, 0xce, 0xc0, 0xc0, 0xc0, +0xc0, 0xd4, 0xd5, 0xd2, 0xd3, 0xa5, 0xd0, 0xd1, 0xf7, 0xaa, 0xc0, 0xdd, 0xcf, 0xc0, 0xc0, 0xd9, +0xca, 0xc1, 0xa2, 0xa3, 0xc0, 0xb4, 0xc0, 0xa4, 0xac, 0xa9, 0xbb, 0xc7, 0xc2, 0xc0, 0xa8, 0xf8, +0xa1, 0xb1, 0xc0, 0xc0, 0xab, 0xb5, 0xa6, 0xe1, 0xfc, 0xc0, 0xbc, 0xc8, 0xc0, 0xc0, 0xc0, 0xc0, +0xcb, 0xe7, 0xe5, 0xcc, 0x80, 0x81, 0xae, 0x82, 0xe9, 0x83, 0xe6, 0xe8, 0xed, 0xea, 0xeb, 0xec, +0xc0, 0x84, 0xf1, 0xee, 0xef, 0xcd, 0x85, 0xc0, 0xaf, 0xf4, 0xf2, 0xf3, 0x86, 0xc0, 0xc0, 0xa7, +0x88, 0x87, 0x89, 0x8b, 0x8a, 0x8c, 0xbe, 0x8d, 0x8f, 0x8e, 0x90, 0x91, 0x93, 0x92, 0x94, 0x95, +0xc0, 0x96, 0x98, 0x97, 0x99, 0x9b, 0x9a, 0xd6, 0xbf, 0x9d, 0x9c, 0x9e, 0x9f, 0xc0, 0xc0, 0xd8 +}; + +// This table converts MacRoman into MSWindows-1252/Latin 1 +static uchar roman2latin[128] = { +0xc4, 0xc5, 0xc7, 0xc9, 0xd1, 0xd6, 0xdc, 0xe1, 0xe0, 0xe2, 0xe4, 0xe3, 0xe5, 0xe7, 0xe9, 0xe8, +0xea, 0xeb, 0xed, 0xec, 0xee, 0xef, 0xf1, 0xf3, 0xf2, 0xf4, 0xf6, 0xf5, 0xfa, 0xf9, 0xfb, 0xfc, +0x86, 0xb0, 0xa2, 0xa3, 0xa7, 0x95, 0xb6, 0xdf, 0xae, 0xa9, 0x99, 0xb4, 0xa8, 0xbf, 0xc6, 0xd8, +0xbf, 0xb1, 0xbf, 0xbf, 0xa5, 0xb5, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xaa, 0xba, 0xbf, 0xe6, 0xf8, +0xbf, 0xa1, 0xac, 0xbf, 0x83, 0xbf, 0xbf, 0xab, 0xbb, 0x85, 0xa0, 0xc0, 0xc3, 0xd5, 0x8c, 0x9c, +0x96, 0x97, 0x93, 0x94, 0x91, 0x92, 0xf7, 0xbf, 0xff, 0x9f, 0xbf, 0x80, 0x8b, 0x9b, 0xbf, 0xbf, +0x87, 0xb7, 0x82, 0x84, 0x89, 0xc2, 0xca, 0xc1, 0xcb, 0xc8, 0xcd, 0xce, 0xcf, 0xcc, 0xd3, 0xd4, +0xbf, 0xd2, 0xda, 0xdb, 0xd9, 0xbf, 0x88, 0x98, 0xaf, 0xbf, 0xbf, 0xbf, 0xb8, 0xbf, 0xbf, 0xbf +}; + +static char *buf = 0; +static int n_buf = 0; + +const char *fl_local_to_mac_roman(const char *t, int n) +{ + if (n==-1) n = strlen(t)+1; + if (n>=n_buf) { + n_buf = (n + 257) & 0x7fffff00; + if (buf) free(buf); + buf = (char*)malloc(n_buf); + } + const uchar *src = (const uchar*)t; + uchar *dst = (uchar*)buf; + for ( ; n>0; n--) { + uchar c = *src; + if (c>127) + *dst++ = latin2roman[c-128]; + else + *dst++ = c; + } + //*dst = 0; // this would be wrong! + return buf; +} + +const char *fl_mac_roman_to_local(const char *t, int n) +{ + if (n==-1) n = strlen(t)+1; + if (n>=n_buf) { + n_buf = (n + 257) & 0x7fffff00; + if (buf) free(buf); + buf = (char*)malloc(n_buf); + } + const uchar *src = (const uchar*)t; + uchar *dst = (uchar*)buf; + for ( ; n>0; n--) { + uchar c = *src++; + if (c>127) + *dst++ = roman2latin[c-128]; + else + *dst++ = c; + } + //*dst = 0; // this would be wrong + return buf; +} + +#endif + +// +// End of "$Id: fl_encoding_mac_roman.cxx 6922 2009-10-29 20:00:12Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_engraved_label.cxx b/third_party/windows/fltk-1.1.10/src/fl_engraved_label.cxx new file mode 100644 index 0000000..f882265 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_engraved_label.cxx @@ -0,0 +1,93 @@ +// +// "$Id: fl_engraved_label.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Engraved label drawing routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Drawing code for XForms style engraved & embossed labels + +#include +#include +#include + +// data[] is dx, dy, color triples + +static void innards( + const Fl_Label* o, int X, int Y, int W, int H, Fl_Align align, + int data[][3], int n) +{ + Fl_Align a1 = align; + if (a1 & FL_ALIGN_CLIP) { + fl_clip(X, Y, W, H); a1 = (Fl_Align)(a1&~FL_ALIGN_CLIP);} + fl_font((Fl_Font)o->font, o->size); + for (int i = 0; i < n; i++) { + fl_color((Fl_Color)(i < n-1 ? data[i][2] : o->color)); + fl_draw(o->value, X+data[i][0], Y+data[i][1], W, H, a1); + } + if (align & FL_ALIGN_CLIP) fl_pop_clip(); +} + +static void fl_shadow_label( + const Fl_Label* o, int X, int Y, int W, int H, Fl_Align align) +{ + static int data[2][3] = {{2,2,FL_DARK3},{0,0,0}}; + innards(o, X, Y, W, H, align, data, 2); +} + +static void fl_engraved_label( + const Fl_Label* o, int X, int Y, int W, int H, Fl_Align align) +{ + static int data[7][3] = { + {1,0,FL_LIGHT3},{1,1,FL_LIGHT3},{0,1,FL_LIGHT3}, + {-1,0,FL_DARK3},{-1,-1,FL_DARK3},{0,-1,FL_DARK3}, + {0,0,0}}; + innards(o, X, Y, W, H, align, data, 7); +} + +static void fl_embossed_label( + const Fl_Label* o, int X, int Y, int W, int H, Fl_Align align) +{ + static int data[7][3] = { + {-1,0,FL_LIGHT3},{-1,-1,FL_LIGHT3},{0,-1,FL_LIGHT3}, + {1,0,FL_DARK3},{1,1,FL_DARK3},{0,1,FL_DARK3}, + {0,0,0}}; + innards(o, X, Y, W, H, align, data, 7); +} + +Fl_Labeltype fl_define_FL_SHADOW_LABEL() { + Fl::set_labeltype(_FL_SHADOW_LABEL, fl_shadow_label, 0); + return _FL_SHADOW_LABEL; +} +Fl_Labeltype fl_define_FL_ENGRAVED_LABEL() { + Fl::set_labeltype(_FL_ENGRAVED_LABEL, fl_engraved_label, 0); + return _FL_ENGRAVED_LABEL; +} +Fl_Labeltype fl_define_FL_EMBOSSED_LABEL() { + Fl::set_labeltype(_FL_EMBOSSED_LABEL, fl_embossed_label, 0); + return _FL_EMBOSSED_LABEL; +} + +// +// End of "$Id: fl_engraved_label.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_file_dir.cxx b/third_party/windows/fltk-1.1.10/src/fl_file_dir.cxx new file mode 100644 index 0000000..f38c2dc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_file_dir.cxx @@ -0,0 +1,178 @@ +// +// "$Id: fl_file_dir.cxx 5417 2006-09-05 09:57:41Z matt $" +// +// File chooser widget for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "flstring.h" +#include +#include +#include + + +static Fl_File_Chooser *fc = (Fl_File_Chooser *)0; +static void (*current_callback)(const char*) = 0; +static const char *current_label = fl_ok; + + +// Do a file chooser callback... +static void callback(Fl_File_Chooser *, void*) { + if (current_callback && fc->value()) + (*current_callback)(fc->value()); +} + + +// Set the file chooser callback +void fl_file_chooser_callback(void (*cb)(const char*)) { + current_callback = cb; +} + + +// Set the "OK" button label +void fl_file_chooser_ok_label(const char *l) { + if (l) current_label = l; + else current_label = fl_ok; +} + + +// +// 'fl_file_chooser()' - Show a file chooser dialog and get a filename. +// + +char * // O - Filename or NULL +fl_file_chooser(const char *message, // I - Message in titlebar + const char *pat, // I - Filename pattern + const char *fname, // I - Initial filename selection + int relative) { // I - 0 for absolute path + static char retname[1024]; // Returned filename + + if (!fc) { + if (!fname || !*fname) fname = "."; + + fc = new Fl_File_Chooser(fname, pat, Fl_File_Chooser::CREATE, message); + fc->callback(callback, 0); + } else { + fc->type(Fl_File_Chooser::CREATE); + // see, if we use the same pattern between calls + char same_pattern = 0; + const char *fcf = fc->filter(); + if ( fcf && pat && strcmp(fcf, pat)==0) + same_pattern = 1; + else if ( (fcf==0L || *fcf==0) && (pat==0L || *pat==0) ) + same_pattern = 1; + // now set the pattern to the new pattern (even if they are the same) + fc->filter(pat); + fc->label(message); + + if (!fname) { // null pointer reuses same filename if pattern didn't change + if (!same_pattern && fc->value()) { + // if pattern is different, remove name but leave old directory: + strlcpy(retname, fc->value(), sizeof(retname)); + + char *p = strrchr(retname, '/'); + + if (p) { + // If the filename is "/foo", then the directory will be "/", not + // ""... + if (p == retname) + retname[1] = '\0'; + else + *p = '\0'; + } + // Set the directory... + fc->value(retname); + } else { + // re-use the previously selected name + } + } else if (!*fname) { // empty filename reuses directory with empty name + const char *fcv = fc->value(); + if (fcv) + strlcpy(retname, fc->value(), sizeof(retname)); + else + *retname = 0; + const char *n = fl_filename_name(retname); + if (n) *((char*)n) = 0; + fc->value(""); + fc->directory(retname); + } else { + fc->value(fname); + } + } + + fc->ok_label(current_label); + fc->show(); + + while (fc->shown()) + Fl::wait(); + + if (fc->value() && relative) { + fl_filename_relative(retname, sizeof(retname), fc->value()); + + return retname; + } else if (fc->value()) return (char *)fc->value(); + else return 0; +} + + +// +// 'fl_dir_chooser()' - Show a file chooser dialog and get a directory. +// + +char * // O - Directory or NULL +fl_dir_chooser(const char *message, // I - Message for titlebar + const char *fname, // I - Initial directory name + int relative) // I - 0 for absolute +{ + static char retname[1024]; // Returned directory name + + if (!fc) { + if (!fname || !*fname) fname = "."; + + fc = new Fl_File_Chooser(fname, "*", Fl_File_Chooser::CREATE | + Fl_File_Chooser::DIRECTORY, message); + fc->callback(callback, 0); + } else { + fc->type(Fl_File_Chooser::CREATE | Fl_File_Chooser::DIRECTORY); + fc->filter("*"); + if (fname && *fname) fc->value(fname); + fc->label(message); + } + + fc->show(); + + while (fc->shown()) + Fl::wait(); + + if (fc->value() && relative) { + fl_filename_relative(retname, sizeof(retname), fc->value()); + + return retname; + } else if (fc->value()) return (char *)fc->value(); + else return 0; +} + + +// +// End of "$Id: fl_file_dir.cxx 5417 2006-09-05 09:57:41Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_font.cxx b/third_party/windows/fltk-1.1.10/src/fl_font.cxx new file mode 100644 index 0000000..fa35c02 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_font.cxx @@ -0,0 +1,60 @@ +// +// "$Id: fl_font.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Font selection code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Select fonts from the FLTK font table. +#include "flstring.h" +#include +#include +#include +#include "Fl_Font.H" + +#include +#include + +#ifdef WIN32 +# include "fl_font_win32.cxx" +#elif defined(__APPLE__) +# include "fl_font_mac.cxx" +#elif USE_XFT +# include "fl_font_xft.cxx" +#else +# include "fl_font_x.cxx" +#endif // WIN32 + + +double fl_width(const char* c) { + if (c) return fl_width(c, strlen(c)); + else return 0.0f; +} + +void fl_draw(const char* str, int x, int y) { + fl_draw(str, strlen(str), x, y); +} + +// +// End of "$Id: fl_font.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_font_mac.cxx b/third_party/windows/fltk-1.1.10/src/fl_font_mac.cxx new file mode 100644 index 0000000..4b7d081 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_font_mac.cxx @@ -0,0 +1,379 @@ +// +// "$Id: fl_font_mac.cxx 5651 2007-02-01 20:13:57Z matt $" +// +// MacOS font selection routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include + +Fl_FontSize::Fl_FontSize(const char* name, int Size) { + next = 0; +# if HAVE_GL + listbase = 0; +# endif +#ifdef __APPLE_QD__ + knowMetrics = 0; + switch (*name++) { + case 'I': face = italic; break; + case 'P': face = italic | bold; break; + case 'B': face = bold; break; + default: face = 0; break; + } + unsigned char fn[80]; + fn[0] = strlen(name); strcpy((char*)(fn+1), name); + GetFNum(fn, &font); + size = Size; + FMInput fIn = { font, size, face, 0, 0, { 1, 1}, { 1, 1} }; + FMOutput *fOut = FMSwapFont(&fIn); + ascent = fOut->ascent; //: the following three lines give only temporary aproimations + descent = fOut->descent; + for (int i=0; i<256; i++) width[i] = fOut->widMax; + minsize = maxsize = size; +#elif defined(__APPLE_QUARTZ__) + knowWidths = 0; + // OpenGL needs those for its font handling + q_name = strdup(name); + size = Size; + OSStatus err; + // fill our structure with a few default values + ascent = Size*3/4; + descent = Size-ascent; + q_width = Size*2/3; + minsize = maxsize = Size; + // now use ATS to get the actual Glyph size information + CFStringRef cfname = CFStringCreateWithCString(0L, name, kCFStringEncodingASCII); + ATSFontRef font = ATSFontFindFromName(cfname, kATSOptionFlagsDefault); + if (font) { + ATSFontMetrics m = { 0 }; + ATSFontGetHorizontalMetrics(font, kATSOptionFlagsDefault, &m); + if (m.avgAdvanceWidth) q_width = int(m.avgAdvanceWidth*Size); + // playing with the offsets a little to make standard sizes fit + if (m.ascent) ascent = int(m.ascent*Size-0.5f); + if (m.descent) descent = -int(m.descent*Size-1.5f); + } + CFRelease(cfname); + // now we allocate everything needed to render text in this font later + // get us the default layout and style + err = ATSUCreateTextLayout(&layout); + UniChar mTxt[2] = { 65, 0 }; + err = ATSUSetTextPointerLocation(layout, mTxt, kATSUFromTextBeginning, 1, 1); + err = ATSUCreateStyle(&style); + err = ATSUSetRunStyle(layout, style, kATSUFromTextBeginning, kATSUToTextEnd); + // now set the actual font, size and attributes. We also set the font matrix to + // render our font up-side-down, so when rendered through our inverted CGContext, + // text will appear normal again. + Fixed fsize = IntToFixed(Size); + ATSUFontID fontID = FMGetFontFromATSFontRef(font); + static CGAffineTransform font_mx = { 1, 0, 0, -1, 0, 0 }; + ATSUAttributeTag sTag[] = { kATSUFontTag, kATSUSizeTag, kATSUFontMatrixTag }; + ByteCount sBytes[] = { sizeof(ATSUFontID), sizeof(Fixed), sizeof(CGAffineTransform) }; + ATSUAttributeValuePtr sAttr[] = { &fontID, &fsize, &font_mx }; + err = ATSUSetAttributes(style, 3, sTag, sBytes, sAttr); + // next, make sure that Quartz will only render at integer coordinates + ATSLineLayoutOptions llo = kATSLineUseDeviceMetrics|kATSLineDisableAllLayoutOperations; + ATSUAttributeTag aTag[] = { kATSULineLayoutOptionsTag }; + ByteCount aBytes[] = { sizeof(ATSLineLayoutOptions) }; + ATSUAttributeValuePtr aAttr[] = { &llo }; + err = ATSUSetLineControls (layout, kATSUFromTextBeginning, 1, aTag, aBytes, aAttr); + // now we are finally ready to measure some letter to get the bounding box + Fixed bBefore, bAfter, bAscent, bDescent; + err = ATSUGetUnjustifiedBounds(layout, kATSUFromTextBeginning, 1, &bBefore, &bAfter, &bAscent, &bDescent); + // Requesting a certain height font on Mac does not guarantee that ascent+descent + // equal the requested height. fl_height will reflect the actual height that we got. + // The font "Apple Chancery" is a pretty extreme example of overlapping letters. + float fa = -FixedToFloat(bAscent), fd = -FixedToFloat(bDescent); + if (fa>0.0f && fd>0.0f) { + //float f = Size/(fa+fd); + ascent = fa; //int(fa*f+0.5f); + descent = fd; //Size - ascent; + } + int w = FixedToInt(bAfter); + if (w) + q_width = FixedToInt(bAfter); +#endif +} + +Fl_FontSize* fl_fontsize = 0L; + +Fl_FontSize::~Fl_FontSize() { +/* +#if HAVE_GL + // ++ todo: remove OpenGL font alocations +// Delete list created by gl_draw(). This is not done by this code +// as it will link in GL unnecessarily. There should be some kind +// of "free" routine pointer, or a subclass? +// if (listbase) { +// int base = font->min_char_or_byte2; +// int size = font->max_char_or_byte2-base+1; +// int base = 0; int size = 256; +// glDeleteLists(listbase+base,size); +// } +#endif + */ + if (this == fl_fontsize) fl_fontsize = 0; +#ifdef __APPLE_QUARTZ__ + ATSUDisposeTextLayout(layout); + ATSUDisposeStyle(style); +#endif +} + +//////////////////////////////////////////////////////////////// + +static Fl_Fontdesc built_in_table[] = { +#ifdef __APPLE_QD__ +{" Arial"}, +{"BArial"}, +{"IArial"}, +{"PArial"}, +{" Courier New"}, +{"BCourier New"}, +{"ICourier New"}, +{"PCourier New"}, +{" Times New Roman"}, +{"BTimes New Roman"}, +{"ITimes New Roman"}, +{"PTimes New Roman"}, +{" Symbol"}, +{" Chicago"}, +{"BChicago"}, +{" Webdings"}, +#elif defined(__APPLE_QUARTZ__) +{"Arial"}, +{"Arial Bold"}, +{"Arial Italic"}, +{"Arial Bold Italic"}, +{"Courier New"}, +{"Courier New Bold"}, +{"Courier New Italic"}, +{"Courier New Bold Italic"}, +{"Times New Roman"}, +{"Times New Roman Bold"}, +{"Times New Roman Italic"}, +{"Times New Roman Bold Italic"}, +{"Symbol"}, +{"Monaco"}, +{"Andale Mono"}, // there is no bold Monaco font on standard Mac +{"Webdings"}, +#endif +}; + +#ifdef __APPLE_QUARTZ__ +static UniChar utf16lut[128] = { + 0x00c4, 0x00c5, 0x00c7, 0x00c9, 0x00d1, 0x00d6, 0x00dc, 0x00e1, + 0x00e0, 0x00e2, 0x00e4, 0x00e3, 0x00e5, 0x00e7, 0x00e9, 0x00e8, + 0x00ea, 0x00eb, 0x00ed, 0x00ec, 0x00ee, 0x00ef, 0x00f1, 0x00f3, + 0x00f2, 0x00f4, 0x00f6, 0x00f5, 0x00fa, 0x00f9, 0x00fb, 0x00fc, + 0x2020, 0x00b0, 0x00a2, 0x00a3, 0x00a7, 0x2022, 0x00b6, 0x00df, + 0x00ae, 0x00a9, 0x2122, 0x00b4, 0x00a8, 0x2260, 0x00c6, 0x00d8, + 0x221e, 0x00b1, 0x2264, 0x2265, 0x00a5, 0x00b5, 0x2202, 0x2211, + 0x220f, 0x03c0, 0x222b, 0x00aa, 0x00ba, 0x03a9, 0x00e6, 0x00f8, + 0x00bf, 0x00a1, 0x00ac, 0x221a, 0x0192, 0x2248, 0x2206, 0x00ab, + 0x00bb, 0x2026, 0x00a0, 0x00c0, 0x00c3, 0x00d5, 0x0152, 0x0153, + 0x2013, 0x2014, 0x201c, 0x201d, 0x2018, 0x2019, 0x00f7, 0x25ca, + 0x00ff, 0x0178, 0x2044, 0x20ac, 0x2039, 0x203a, 0xfb01, 0xfb02, + 0x2021, 0x00b7, 0x201a, 0x201e, 0x2030, 0x00c2, 0x00ca, 0x00c1, + 0x00cb, 0x00c8, 0x00cd, 0x00ce, 0x00cf, 0x00cc, 0x00d3, 0x00d4, + 0xf8ff, 0x00d2, 0x00da, 0x00db, 0x00d9, 0x0131, 0x02c6, 0x02dc, + 0x00af, 0x02d8, 0x02d9, 0x02da, 0x00b8, 0x02dd, 0x02db, 0x02c7, +}; +static UniChar *utf16buf = 0; +static int utf16len = 0; +UniChar *fl_macToUtf16(const char *txt, int len) +{ + if ((len+1)>utf16len) { + utf16len = len+100; + free(utf16buf); + utf16buf = (UniChar*)malloc((utf16len+1)*sizeof(UniChar)); + } + int i; + unsigned char c; + const unsigned char *src = (unsigned char const*)txt; + UniChar *dst = utf16buf; + for (i=0; ifont); //: select font into current QuickDraw GC + TextFace(fl_fontsize->face); + TextSize(fl_fontsize->size); + if (!fl_fontsize->knowMetrics) { //: get the true metrics for the currnet GC + //: (fails on multiple monitors with different dpi's!) + FontInfo fi; GetFontInfo(&fi); + fl_fontsize->ascent = fi.ascent; + fl_fontsize->descent = fi.descent; + FMetricRec mr; FontMetrics(&mr); + short *f = (short*)*mr.wTabHandle; //: get the char size table + for (int i=0; i<256; i++) fl_fontsize->width[i] = f[2*i]; + fl_fontsize->knowMetrics = 1; + } +#elif defined(__APPLE_QUARTZ__) + // we will use fl_fontsize later to access the required style and layout +#else +# error : need to defined either Quartz or Quickdraw +#endif +} + +static Fl_FontSize* find(int fnum, int size) { + Fl_Fontdesc* s = fl_fonts+fnum; + if (!s->name) s = fl_fonts; // use 0 if fnum undefined + Fl_FontSize* f; + for (f = s->first; f; f = f->next) + if (f->minsize <= size && f->maxsize >= size) return f; + f = new Fl_FontSize(s->name, size); + f->next = s->first; + s->first = f; + return f; +} + +//////////////////////////////////////////////////////////////// +// Public interface: + +int fl_font_ = 0; +int fl_size_ = 0; + +void fl_font(int fnum, int size) { + if (fnum==-1) { + fl_font_ = 0; + fl_size_ = 0; + return; + } + fl_font_ = fnum; + fl_size_ = size; + fl_font(find(fnum, size)); +} + +int fl_height() { + if (fl_fontsize) return fl_fontsize->ascent+fl_fontsize->descent; + else return -1; +} + +int fl_descent() { + if (fl_fontsize) return fl_fontsize->descent; + else return -1; +} + +double fl_width(const char* txt, int n) { +#ifdef __APPLE_QD__ + return (double)TextWidth( txt, 0, n ); +#else + if (!fl_fontsize) { + fl_font(0, 12); // avoid a crash! + if (!fl_fontsize) + return 8*n; // user must select a font first! + } + if (!fl_fontsize->knowWidths) { + if (!fl_gc) { + Fl_Window *w = Fl::first_window(); + if (w) w->make_current(); + if (!fl_gc) { + if (fl_fontsize) return fl_fontsize->q_width*n; + return 8*n; + // We fall back to some internal QuickDraw port. + // The result should be the same. + } + } + char buf[2]; + for (int i=0; i<256; i++) { + OSStatus err; + buf[0] = (char)i; + // convert to UTF-16 first + UniChar *uniStr = fl_macToUtf16(buf, 1); + // now collect our ATSU resources + ATSUTextLayout layout = fl_fontsize->layout; + // activate the current GC + ByteCount iSize = sizeof(CGContextRef); + ATSUAttributeTag iTag = kATSUCGContextTag; + ATSUAttributeValuePtr iValuePtr=&fl_gc; + ATSUSetLayoutControls(layout, 1, &iTag, &iSize, &iValuePtr); + // now measure the bounding box + err = ATSUSetTextPointerLocation(layout, uniStr, kATSUFromTextBeginning, 1, 1); + Fixed bBefore, bAfter, bAscent, bDescent; + err = ATSUGetUnjustifiedBounds(layout, kATSUFromTextBeginning, 1, &bBefore, &bAfter, &bAscent, &bDescent); + fl_fontsize->width[i] = FixedToInt(bAfter); + } + fl_fontsize->knowWidths = 1; + } + int len = 0; + const char *src = txt; + for (int j=0; jwidth[c]; + } + return len; +#endif +} + +double fl_width(uchar c) { + return fl_width((const char*)(&c), 1); +} + +void fl_draw(const char *str, int n, float x, float y); + +void fl_draw(const char* str, int n, int x, int y) { +#ifdef __APPLE_QD__ + MoveTo(x, y); + DrawText((const char *)str, 0, n); +#elif defined(__APPLE_QUARTZ__) + fl_draw(str, n, (float)x-0.0f, (float)y-0.5f); +#else +# error : neither Quartz no Quickdraw chosen +#endif +} + +void fl_draw(const char *str, int n, float x, float y) { +#ifdef __APPLE_QD__ + fl_draw(str, n, (int)x, (int)y); +#elif defined(__APPLE_QUARTZ__) + OSStatus err; + // convert to UTF-16 first + UniChar *uniStr = fl_macToUtf16(str, n); + // now collect our ATSU resources + ATSUTextLayout layout = fl_fontsize->layout; + + ByteCount iSize = sizeof(CGContextRef); + ATSUAttributeTag iTag = kATSUCGContextTag; + ATSUAttributeValuePtr iValuePtr=&fl_gc; + ATSUSetLayoutControls(layout, 1, &iTag, &iSize, &iValuePtr); + + err = ATSUSetTextPointerLocation(layout, uniStr, kATSUFromTextBeginning, n, n); + err = ATSUDrawText(layout, kATSUFromTextBeginning, n, FloatToFixed(x), FloatToFixed(y)); +#else +# error : neither Quartz no Quickdraw chosen +#endif +} + +// +// End of "$Id: fl_font_mac.cxx 5651 2007-02-01 20:13:57Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_font_win32.cxx b/third_party/windows/fltk-1.1.10/src/fl_font_win32.cxx new file mode 100644 index 0000000..cfa0bda --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_font_win32.cxx @@ -0,0 +1,173 @@ +// +// "$Id: fl_font_win32.cxx 5420 2006-09-05 11:16:15Z matt $" +// +// WIN32 font selection routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +Fl_FontSize::Fl_FontSize(const char* name, int size) { + int weight = FW_NORMAL; + int italic = 0; + switch (*name++) { + case 'I': italic = 1; break; + case 'P': italic = 1; + case 'B': weight = FW_BOLD; break; + case ' ': break; + default: name--; + } + fid = CreateFont( + -size, // negative makes it use "char size" + 0, // logical average character width + 0, // angle of escapement + 0, // base-line orientation angle + weight, + italic, + FALSE, // underline attribute flag + FALSE, // strikeout attribute flag + DEFAULT_CHARSET, // character set identifier + OUT_DEFAULT_PRECIS, // output precision + CLIP_DEFAULT_PRECIS,// clipping precision + DEFAULT_QUALITY, // output quality + DEFAULT_PITCH, // pitch and family + name // pointer to typeface name string + ); + if (!fl_gc) fl_GetDC(0); + SelectObject(fl_gc, fid); + GetTextMetrics(fl_gc, &metr); +// BOOL ret = GetCharWidthFloat(fl_gc, metr.tmFirstChar, metr.tmLastChar, font->width+metr.tmFirstChar); +// ...would be the right call, but is not implemented into Window95! (WinNT?) + GetCharWidth(fl_gc, 0, 255, width); +#if HAVE_GL + listbase = 0; +#endif + minsize = maxsize = size; +} + +Fl_FontSize* fl_fontsize; + +Fl_FontSize::~Fl_FontSize() { +#if HAVE_GL +// Delete list created by gl_draw(). This is not done by this code +// as it will link in GL unnecessarily. There should be some kind +// of "free" routine pointer, or a subclass? +// if (listbase) { +// int base = font->min_char_or_byte2; +// int size = font->max_char_or_byte2-base+1; +// int base = 0; int size = 256; +// glDeleteLists(listbase+base,size); +// } +#endif + if (this == fl_fontsize) fl_fontsize = 0; + DeleteObject(fid); +} + +//////////////////////////////////////////////////////////////// + +// WARNING: if you add to this table, you must redefine FL_FREE_FONT +// in Enumerations.H & recompile!! +static Fl_Fontdesc built_in_table[] = { +{" Arial"}, +{"BArial"}, +{"IArial"}, +{"PArial"}, +{" Courier New"}, +{"BCourier New"}, +{"ICourier New"}, +{"PCourier New"}, +{" Times New Roman"}, +{"BTimes New Roman"}, +{"ITimes New Roman"}, +{"PTimes New Roman"}, +{" Symbol"}, +{" Terminal"}, +{"BTerminal"}, +{" Wingdings"}, +}; + +Fl_Fontdesc* fl_fonts = built_in_table; + +static Fl_FontSize* find(int fnum, int size) { + Fl_Fontdesc* s = fl_fonts+fnum; + if (!s->name) s = fl_fonts; // use 0 if fnum undefined + Fl_FontSize* f; + for (f = s->first; f; f = f->next) + if (f->minsize <= size && f->maxsize >= size) return f; + f = new Fl_FontSize(s->name, size); + f->next = s->first; + s->first = f; + return f; +} + +//////////////////////////////////////////////////////////////// +// Public interface: + +int fl_font_ = 0; +int fl_size_ = 0; +//static HDC font_gc; + +void fl_font(int fnum, int size) { + if (fnum==-1) { // just make sure that we will load a new font next time + fl_font_ = 0; fl_size_ = 0; + return; + } + if (fnum == fl_font_ && size == fl_size_) return; + fl_font_ = fnum; fl_size_ = size; + fl_fontsize = find(fnum, size); +} + +int fl_height() { + if (fl_fontsize) return (fl_fontsize->metr.tmAscent + fl_fontsize->metr.tmDescent); + else return -1; +} + +int fl_descent() { + if (fl_fontsize) return fl_fontsize->metr.tmDescent; + else return -1; +} + +double fl_width(const char* c, int n) { + if (!fl_fontsize) return -1.0; + double w = 0.0; + while (n--) w += fl_fontsize->width[uchar(*c++)]; + return w; +} + +double fl_width(uchar c) { + if (fl_fontsize) return fl_fontsize->width[c]; + else return -1.0; +} + +void fl_draw(const char* str, int n, int x, int y) { + COLORREF oldColor = SetTextColor(fl_gc, fl_RGB()); + if (fl_fontsize) SelectObject(fl_gc, fl_fontsize->fid); + TextOut(fl_gc, x, y, str, n); + SetTextColor(fl_gc, oldColor); +} + +void fl_draw(const char* str, int n, float x, float y) { + fl_draw(str, n, (int)x, (int)y); +} + +// +// End of "$Id: fl_font_win32.cxx 5420 2006-09-05 11:16:15Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_font_x.cxx b/third_party/windows/fltk-1.1.10/src/fl_font_x.cxx new file mode 100644 index 0000000..4db151c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_font_x.cxx @@ -0,0 +1,269 @@ +// +// "$Id: fl_font_x.cxx 5421 2006-09-05 11:26:41Z matt $" +// +// Standard X11 font selection code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +Fl_FontSize::Fl_FontSize(const char* name) { + font = XLoadQueryFont(fl_display, name); + if (!font) { + Fl::warning("bad font: %s", name); + font = XLoadQueryFont(fl_display, "fixed"); // if fixed fails we crash + } +# if HAVE_GL + listbase = 0; +# endif +} + +Fl_FontSize* fl_fontsize; + +Fl_FontSize::~Fl_FontSize() { +# if HAVE_GL +// Delete list created by gl_draw(). This is not done by this code +// as it will link in GL unnecessarily. There should be some kind +// of "free" routine pointer, or a subclass? +// if (listbase) { +// int base = font->min_char_or_byte2; +// int size = font->max_char_or_byte2-base+1; +// int base = 0; int size = 256; +// glDeleteLists(listbase+base,size); +// } +# endif + if (this == fl_fontsize) fl_fontsize = 0; + XFreeFont(fl_display, font); +} + +//////////////////////////////////////////////////////////////// + +// WARNING: if you add to this table, you must redefine FL_FREE_FONT +// in Enumerations.H & recompile!! +static Fl_Fontdesc built_in_table[] = { +{"-*-helvetica-medium-r-normal--*"}, +{"-*-helvetica-bold-r-normal--*"}, +{"-*-helvetica-medium-o-normal--*"}, +{"-*-helvetica-bold-o-normal--*"}, +{"-*-courier-medium-r-normal--*"}, +{"-*-courier-bold-r-normal--*"}, +{"-*-courier-medium-o-normal--*"}, +{"-*-courier-bold-o-normal--*"}, +{"-*-times-medium-r-normal--*"}, +{"-*-times-bold-r-normal--*"}, +{"-*-times-medium-i-normal--*"}, +{"-*-times-bold-i-normal--*"}, +{"-*-symbol-*"}, +{"-*-lucidatypewriter-medium-r-normal-sans-*"}, +{"-*-lucidatypewriter-bold-r-normal-sans-*"}, +{"-*-*zapf dingbats-*"} +}; + +Fl_Fontdesc* fl_fonts = built_in_table; + +#define MAXSIZE 32767 + +// return dash number N, or pointer to ending null if none: +const char* fl_font_word(const char* p, int n) { + while (*p) {if (*p=='-') {if (!--n) break;} p++;} + return p; +} + +// return a pointer to a number we think is "point size": +char* fl_find_fontsize(char* name) { + char* c = name; + // for standard x font names, try after 7th dash: + if (*c == '-') { + c = (char*)fl_font_word(c,7); + if (*c++ && isdigit(*c)) return c; + return 0; // malformed x font name? + } + char* r = 0; + // find last set of digits: + for (c++;* c; c++) + if (isdigit(*c) && !isdigit(*(c-1))) r = c; + return r; +} + +const char* fl_encoding = "iso8859-1"; + +// return true if this matches fl_encoding: +int fl_correct_encoding(const char* name) { + if (*name != '-') return 0; + const char* c = fl_font_word(name,13); + return (*c++ && !strcmp(c,fl_encoding)); +} + +// locate or create an Fl_FontSize for a given Fl_Fontdesc and size: +static Fl_FontSize* find(int fnum, int size) { + Fl_Fontdesc* s = fl_fonts+fnum; + if (!s->name) s = fl_fonts; // use font 0 if still undefined + Fl_FontSize* f; + for (f = s->first; f; f = f->next) + if (f->minsize <= size && f->maxsize >= size) return f; + fl_open_display(); + if (!s->xlist) { + s->xlist = XListFonts(fl_display, s->name, 100, &(s->n)); + if (!s->xlist) { // use fixed if no matching font... + s->first = new Fl_FontSize("fixed"); + s->first->minsize = 0; + s->first->maxsize = 32767; + return s->first; + } + } + // search for largest <= font size: + char* name = s->xlist[0]; int ptsize = 0; // best one found so far + int matchedlength = 32767; + char namebuffer[1024]; // holds scalable font name + int found_encoding = 0; + int m = s->n; if (m<0) m = -m; + for (int n=0; n < m; n++) { + + char* thisname = s->xlist[n]; + if (fl_correct_encoding(thisname)) { + if (!found_encoding) ptsize = 0; // force it to choose this + found_encoding = 1; + } else { + if (found_encoding) continue; + } + char* c = fl_find_fontsize(thisname); + int thissize = c ? atoi(c) : MAXSIZE; + int thislength = strlen(thisname); + if (thissize == size && thislength < matchedlength) { + // exact match, use it: + name = thisname; + ptsize = size; + matchedlength = thislength; + } else if (!thissize && ptsize!=size) { + // whoa! A scalable font! Use unless exact match found: + int l = c-thisname; + memcpy(namebuffer,thisname,l); + l += sprintf(namebuffer+l,"%d",size); + while (*c == '0') c++; + strcpy(namebuffer+l,c); + name = namebuffer; + ptsize = size; + } else if (!ptsize || // no fonts yet + thissize < ptsize && ptsize > size || // current font too big + thissize > ptsize && thissize <= size // current too small + ) { + name = thisname; ptsize = thissize; + matchedlength = thislength; + } + } + + if (ptsize != size) { // see if we already found this unscalable font: + for (f = s->first; f; f = f->next) { + if (f->minsize <= ptsize && f->maxsize >= ptsize) { + if (f->minsize > size) f->minsize = size; + if (f->maxsize < size) f->maxsize = size; + return f; + } + } + } + + // okay, we definately have some name, make the font: + f = new Fl_FontSize(name); + if (ptsize < size) {f->minsize = ptsize; f->maxsize = size;} + else {f->minsize = size; f->maxsize = ptsize;} + f->next = s->first; + s->first = f; + return f; + +} + +//////////////////////////////////////////////////////////////// +// Public interface: + +int fl_font_ = 0; +int fl_size_ = 0; +XFontStruct* fl_xfont = 0; +void *fl_xftfont = 0; +static GC font_gc; + +void fl_font(int fnum, int size) { + if (fnum==-1) { + fl_font_ = 0; fl_size_ = 0; + return; + } + if (fnum == fl_font_ && size == fl_size_) return; + fl_font_ = fnum; fl_size_ = size; + Fl_FontSize* f = find(fnum, size); + if (f != fl_fontsize) { + fl_fontsize = f; + fl_xfont = f->font; + font_gc = 0; + } +} + +int fl_height() { + if (fl_xfont) return (fl_xfont->ascent + fl_xfont->descent); + else return -1; +} + +int fl_descent() { + if (fl_xfont) return fl_xfont->descent; + else return -1; +} + +double fl_width(const char* c, int n) { + if (!fl_xfont) return -1.0; + XCharStruct* p = fl_xfont->per_char; + if (!p) return n*fl_xfont->min_bounds.width; + int a = fl_xfont->min_char_or_byte2; + int b = fl_xfont->max_char_or_byte2 - a; + int w = 0; + while (n--) { + int x = *(uchar*)c++ - a; + if (x >= 0 && x <= b) w += p[x].width; + else w += fl_xfont->min_bounds.width; + } + return w; +} + +double fl_width(uchar c) { + if (!fl_xfont) return -1; + XCharStruct* p = fl_xfont->per_char; + if (p) { + int a = fl_xfont->min_char_or_byte2; + int b = fl_xfont->max_char_or_byte2 - a; + int x = c-a; + if (x >= 0 && x <= b) return p[x].width; + } + return fl_xfont->min_bounds.width; +} + +void fl_draw(const char* str, int n, int x, int y) { + if (font_gc != fl_gc) { + if (!fl_xfont) fl_font(FL_HELVETICA, 14); + font_gc = fl_gc; + XSetFont(fl_display, fl_gc, fl_xfont->fid); + } + XDrawString(fl_display, fl_window, fl_gc, x, y, str, n); +} + +void fl_draw(const char* str, int n, float x, float y) { + fl_draw(str, n, (int)x, (int)y); +} + +// +// End of "$Id: fl_font_x.cxx 5421 2006-09-05 11:26:41Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_font_xft.cxx b/third_party/windows/fltk-1.1.10/src/fl_font_xft.cxx new file mode 100644 index 0000000..a9ea6b7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_font_xft.cxx @@ -0,0 +1,445 @@ +// +// "$Id: fl_font_xft.cxx 6871 2009-09-15 20:33:55Z matt $" +// +// Xft font code for the Fast Light Tool Kit (FLTK). +// +// Copyright 2001-2007 Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// +// Draw fonts using Keith Packard's Xft library to provide anti- +// aliased text. Yow! +// +// Many thanks to Carl for making the original version of this. +// +// This font code only requires libXft to work. Contrary to popular +// belief there is no need to have FreeType, or the Xrender extension +// available to use this code. You will just get normal Xlib fonts +// (Xft calls them "core" fonts) The Xft algorithms for choosing +// these is about as good as the FLTK ones (I hope to fix it so it is +// exactly as good...), plus it can cache it's results and share them +// between programs, so using this should be a win in all cases. Also +// it should be obvious by comparing this file and fl_font_x.cxx that +// it is a lot easier to program with Xft than with Xlib. +// +// Also, Xft supports UTF-8 text rendering directly, which will allow +// us to support UTF-8 on all platforms more easily. +// +// To actually get antialiasing you need the following: +// +// 1. You have XFree86 4 +// 2. You have the XRender extension +// 3. Your X device driver supports the render extension +// 4. You have libXft +// 5. Your libXft has FreeType2 support compiled in +// 6. You have the FreeType2 library +// +// Distributions that have XFree86 4.0.3 or later should have all of this... +// +// Unlike some other Xft packages, I tried to keep this simple and not +// to work around the current problems in Xft by making the "patterns" +// complicated. I belive doing this defeats our ability to improve Xft +// itself. You should edit the ~/.xftconfig file to "fix" things, there +// are several web pages of information on how to do this. +// + +#include + +// The predefined fonts that FLTK has: +static Fl_Fontdesc built_in_table[] = { +{" sans"}, +{"Bsans"}, +{"Isans"}, +{"Psans"}, +{" mono"}, +{"Bmono"}, +{"Imono"}, +{"Pmono"}, +{" serif"}, +{"Bserif"}, +{"Iserif"}, +{"Pserif"}, +{" symbol"}, +{" screen"}, +{"Bscreen"}, +{" dingbats"}, +}; + +Fl_Fontdesc* fl_fonts = built_in_table; + +#define current_font (fl_fontsize->font) + +int fl_font_ = 0; +int fl_size_ = 0; +XFontStruct* fl_xfont = 0; +void *fl_xftfont = 0; +const char* fl_encoding_ = "iso8859-1"; +Fl_FontSize* fl_fontsize = 0; + +void fl_font(int fnum, int size) { + if (fnum==-1) { // special case to stop font caching + fl_font_ = 0; fl_size_ = 0; + return; + } + if (fnum == fl_font_ && size == fl_size_ + && fl_fontsize + && !strcasecmp(fl_fontsize->encoding, fl_encoding_)) + return; + fl_font_ = fnum; fl_size_ = size; + Fl_Fontdesc *font = fl_fonts + fnum; + Fl_FontSize* f; + // search the fontsizes we have generated already + for (f = font->first; f; f = f->next) { + if (f->size == size && !strcasecmp(f->encoding, fl_encoding_)) + break; + } + if (!f) { + f = new Fl_FontSize(font->name); + f->next = font->first; + font->first = f; + } + fl_fontsize = f; +#if XFT_MAJOR < 2 + fl_xfont = f->font->u.core.font; +#endif // XFT_MAJOR < 2 + fl_xftfont = (void*)f->font; +} + +static XftFont* fontopen(const char* name, bool core) { + // Check: does it look like we have been passed an old-school XLFD fontname? + bool is_xlfd = false; + int hyphen_count = 0; + int comma_count = 0; + unsigned len = strlen(name); + if (len > 512) len = 512; // ensure we are not passed an unbounded font name + for(unsigned idx = 0; idx < len; idx++) { + if(name[idx] == '-') hyphen_count++; // check for XLFD hyphens + if(name[idx] == ',') comma_count++; // are there multiple names? + } + if(hyphen_count >= 14) is_xlfd = true; // Not a robust check, but good enough? + + fl_open_display(); + + if(!is_xlfd) { // Not an XLFD - open as a XFT style name + XftFont *the_font; // the font we will return; + XftPattern *fnt_pat = XftPatternCreate(); // the pattern we will use for matching + int slant = XFT_SLANT_ROMAN; + int weight = XFT_WEIGHT_MEDIUM; + + /* This "converts" FLTK-style font names back into "regular" names, extracting + * the BOLD and ITALIC codes as it does so - all FLTK font names are prefixed + * by 'I' (italic) 'B' (bold) 'P' (bold italic) or ' ' (regular) modifiers. + * This gives a fairly limited font selection ability, but is retained for + * compatability reasons. If you really need a more complex choice, you are best + * calling Fl::set_fonts(*) then selecting the font by font-index rather than by + * name anyway. Probably. + * If you want to load a font who's name does actually begin with I, B or P, you + * MUST use a leading space OR simply use lowercase for the name... + */ + /* This may be efficient, but it is non-obvious. */ + switch (*name++) { + case 'I': slant = XFT_SLANT_ITALIC; break; // italic + case 'P': slant = XFT_SLANT_ITALIC; // bold-italic (falls-through) + case 'B': weight = XFT_WEIGHT_BOLD; break; // bold + case ' ': break; // regular + default: name--; // no prefix, restore name + } + + if(comma_count) { // multiple comma-spearated names were passed + char *local_name = strdup(name); // duplicate the full name so we can edit the copy + char *curr = local_name; // points to first name in string + char *nxt; // next name in string + do { + nxt = strchr(curr, ','); // find comma seperator + if (nxt) { + *nxt = 0; // terminate first name + nxt++; // first char of next name + } + + // Add the current name to the match pattern + XftPatternAddString(fnt_pat, XFT_FAMILY, curr); + + if(nxt) curr = nxt; // move onto next name (if it exists) + // Now do a cut-down version of the FLTK name conversion. + // NOTE: we only use the slant and weight of the first name, + // subsequent names we ignore this for... But we still need to do the check. + switch (*curr++) { + case 'I': break; // italic + case 'P': // bold-italic (falls-through) + case 'B': break; // bold + case ' ': break; // regular + default: curr--; // no prefix, restore name + } + + comma_count--; // decrement name sections count + } while (comma_count >= 0); + free(local_name); // release our local copy of font names + } + else { // single name was passed - add it directly + XftPatternAddString(fnt_pat, XFT_FAMILY, name); + } + + // Construct a match pattern for the font we want... + XftPatternAddInteger(fnt_pat, XFT_WEIGHT, weight); + XftPatternAddInteger(fnt_pat, XFT_SLANT, slant); + XftPatternAddDouble (fnt_pat, XFT_PIXEL_SIZE, (double)fl_size_); + XftPatternAddString (fnt_pat, XFT_ENCODING, fl_encoding_); + if (core) { + XftPatternAddBool(fnt_pat, XFT_CORE, FcTrue); + XftPatternAddBool(fnt_pat, XFT_RENDER, FcFalse); + } + + XftPattern *match_pat; // the best available match on the system + XftResult match_result; // the result of our matching attempt + // query the system to find a match for this font + match_pat = XftFontMatch(fl_display, fl_screen, fnt_pat, &match_result); + // open the matched font + the_font = XftFontOpenPattern(fl_display, match_pat); + // Tidy up the resources we allocated + XftPatternDestroy(fnt_pat); +// XftPatternDestroy(match_pat); // FontConfig will destroy this resource for us. We must not! + return the_font; + } + else { // We were passed a font name in XLFD format + char *local_name = strdup(name); + if(comma_count) { // This means we were passed multiple XLFD's + char *pc = strchr(local_name, ','); + *pc = 0; // terminate the XLFD at the first comma + } + XftFont *the_font = XftFontOpenXlfd(fl_display, fl_screen, local_name); + free(local_name); + return the_font; + } +} // end of fontopen + +Fl_FontSize::Fl_FontSize(const char* name) { + encoding = fl_encoding_; + size = fl_size_; +#if HAVE_GL + listbase = 0; +#endif // HAVE_GL + font = fontopen(name, false); +} + +Fl_FontSize::~Fl_FontSize() { + if (this == fl_fontsize) fl_fontsize = 0; +// XftFontClose(fl_display, font); +} + +int fl_height() { + if (current_font) return current_font->ascent + current_font->descent; + else return -1; +} + +int fl_descent() { + if (current_font) return current_font->descent; + else return -1; +} + +double fl_width(const char *str, int n) { + if (!current_font) return -1.0; + XGlyphInfo i; + XftTextExtents8(fl_display, current_font, (XftChar8 *)str, n, &i); + return i.xOff; +} + +double fl_width(uchar c) { + return fl_width((const char *)(&c), 1); +} + +#if HAVE_GL +/* This code is used by opengl to get a bitmapped font. The original XFT-1 code + * used XFT's "core" fonts methods to load an XFT font that was actually a + * X-bitmap font, that could then be readily used with GL. + * But XFT-2 does not provide that ability, and there is no easy method to use + * an XFT font directly with GL. So... +*/ + +# if XFT_MAJOR > 1 +// This function attempts, on XFT2 systems, to find a suitable "core" Xfont +// for GL to use, since we dont have an XglUseXftFont(...) function. +// There's probably a better way to do this. I can't believe it is this hard... +// Anyway... This code attempts to make an XLFD out of the fltk-style font +// name it is passed, then tries to load that font. Surprisingly, this quite +// often works - boxes that have XFT generally also have a fontserver that +// can serve TTF and other fonts to X, and so the font name that fltk makes +// from the XFT name often also "exists" as an "core" X font... +// If this code fails to load the requested font, it falls back through a +// series of tried 'n tested alternatives, ultimately resorting to what the +// original fltk code did. +// NOTE: +// On my test boxes (FC6, FC7) this works well for the fltk "built-in" font names. +static XFontStruct* load_xfont_for_xft2(void) { + XFontStruct* xgl_font = 0; + int size = fl_size_; + const char *weight = "medium"; // no specifc weight requested - accept any + char slant = 'r'; // regular non-italic by default + char xlfd[128]; // we will put our synthetic XLFD in here + char *pc = strdup(fl_fonts[fl_font_].name); // what font were we asked for? + const char *name = pc; // keep a handle to the original name for freeing later + // Parse the "fltk-name" of the font + switch (*name++) { + case 'I': slant = 'i'; break; // italic + case 'P': slant = 'i'; // bold-italic (falls-through) + case 'B': weight = "bold"; break; // bold + case ' ': break; // regular + default: name--; // no prefix, restore name + } + + // map generic Xft names to customary XLFD faces + if (!strcmp(name, "sans")) { + name = "helvetica"; + } else if (!strcmp(name, "mono")) { + name = "courier"; + } else if (!strcmp(name, "serif")) { + name = "times"; + } else if (!strcmp(name, "screen")) { + name = "lucidatypewriter"; + } else if (!strcmp(name, "dingbats")) { + name = "zapf dingbats"; + } + + // first, we do a query with no prefered size, to see if the font exists at all + snprintf(xlfd, 128, "-*-*%s*-%s-%c-*--*-*-*-*-*-*-*-*", name, weight, slant); // make up xlfd style name + xgl_font = XLoadQueryFont(fl_display, xlfd); + if(xgl_font) { // the face exists, but can we get it in a suitable size? + XFreeFont(fl_display, xgl_font); // release the non-sized version + snprintf(xlfd, 128, "-*-*%s*-%s-%c-*--*-%d-*-*-*-*-*-*", name, weight, slant, (size*10)); + xgl_font = XLoadQueryFont(fl_display, xlfd); // attempt to load the font at the right size + } + free(pc); // release our copy of the font name + + // if we have nothing loaded, try a generic proportional font + if(!xgl_font) { + snprintf(xlfd, 128, "-*-helvetica-*-%c-*--*-%d-*-*-*-*-*-*", slant, (size*10)); + xgl_font = XLoadQueryFont(fl_display, xlfd); + } + // If that still didn't work, try this instead + if(!xgl_font) { + snprintf(xlfd, 128, "-*-courier-medium-%c-*--*-%d-*-*-*-*-*-*", slant, (size*10)); + xgl_font = XLoadQueryFont(fl_display, xlfd); + } + // Last chance fallback - this usually loads something... + if (!xgl_font) xgl_font = XLoadQueryFont(fl_display, "fixed"); + + return xgl_font; +} // end of load_xfont_for_xft2 +# endif + +XFontStruct* fl_xxfont() { +# if XFT_MAJOR > 1 + // kludge! XFT 2 and later does not provide core fonts for us to use with GL + // try to load a bitmap X font instead + static XFontStruct* xgl_font = 0; + static int glsize = 0; + static int glfont = -1; + // Do we need to load a new font? + if ((!xgl_font) || (glsize != fl_size_) || (glfont != fl_font_)) { + if (xgl_font) XFreeFont(fl_display, xgl_font); // font already loaded, free it + glsize = fl_size_; // record current font size + glfont = fl_font_; // and face + // create a dummy XLFD for some font of the appropriate size... + xgl_font = load_xfont_for_xft2(); + } + return xgl_font; +# else // XFT-1 provides a means to load a "core" font directly + if (current_font->core) return current_font->u.core.font; // is the current font a "core" font? If so, use it. + static XftFont* xftfont; + if (xftfont) XftFontClose (fl_display, xftfont); + xftfont = fontopen(fl_fonts[fl_font_].name, true); // else request XFT to load a suitable "core" font instead. + return xftfont->u.core.font; +# endif // XFT_MAJOR > 1 +} +#endif // HAVE_GL + +#if USE_OVERLAY +// Currently Xft does not work with colormapped visuals, so this probably +// does not work unless you have a true-color overlay. +extern bool fl_overlay; +extern Colormap fl_overlay_colormap; +extern XVisualInfo* fl_overlay_visual; +#endif + +// For some reason Xft produces errors if you destroy a window whose id +// still exists in an XftDraw structure. It would be nice if this is not +// true, a lot of junk is needed to try to stop this: + +static XftDraw* draw; +static Window draw_window; +#if USE_OVERLAY +static XftDraw* draw_overlay; +static Window draw_overlay_window; +#endif + +void fl_destroy_xft_draw(Window id) { + if (id == draw_window) + XftDrawChange(draw, draw_window = fl_message_window); +#if USE_OVERLAY + if (id == draw_overlay_window) + XftDrawChange(draw_overlay, draw_overlay_window = fl_message_window); +#endif +} + +void fl_draw(const char *str, int n, int x, int y) { + if ( !current_font ) { + fl_font(FL_HELVETICA, 14); + } +#if USE_OVERLAY + XftDraw*& draw = fl_overlay ? draw_overlay : ::draw; + if (fl_overlay) { + if (!draw) + draw = XftDrawCreate(fl_display, draw_overlay_window = fl_window, + fl_overlay_visual->visual, fl_overlay_colormap); + else //if (draw_overlay_window != fl_window) + XftDrawChange(draw, draw_overlay_window = fl_window); + } else +#endif + if (!draw) + draw = XftDrawCreate(fl_display, draw_window = fl_window, + fl_visual->visual, fl_colormap); + else //if (draw_window != fl_window) + XftDrawChange(draw, draw_window = fl_window); + + Region region = fl_clip_region(); + if (region && XEmptyRegion(region)) return; + XftDrawSetClip(draw, region); + + // Use fltk's color allocator, copy the results to match what + // XftCollorAllocValue returns: + XftColor color; + color.pixel = fl_xpixel(fl_color_); + uchar r,g,b; Fl::get_color(fl_color_, r,g,b); + color.color.red = ((int)r)*0x101; + color.color.green = ((int)g)*0x101; + color.color.blue = ((int)b)*0x101; + color.color.alpha = 0xffff; + + XftDrawString8(draw, &color, current_font, x, y, (XftChar8 *)str, n); +} + +void fl_draw(const char* str, int n, float x, float y) { + fl_draw(str, n, (int)x, (int)y); +} + +// +// End of "$Id: fl_font_xft.cxx 6871 2009-09-15 20:33:55Z matt $" +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_gtk.cxx b/third_party/windows/fltk-1.1.10/src/fl_gtk.cxx new file mode 100644 index 0000000..5a674f0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_gtk.cxx @@ -0,0 +1,304 @@ +// +// "$Id: fl_gtk.cxx 5721 2007-02-27 19:23:24Z matt $" +// +// "GTK" drawing routines for the Fast Light Tool Kit (FLTK). +// +// These box types provide a GTK+ look, based on Red Hat's Bluecurve +// theme... +// +// Copyright 2006 by Michael Sweet. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Box drawing code for an obscure box type. +// These box types are in seperate files so they are not linked +// in if not used. + +#include +#include + +extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*); + + +static void gtk_color(Fl_Color c) { + if (Fl::draw_box_active()) fl_color(c); + else fl_color(fl_inactive(c)); +} + + +static void gtk_up_frame(int x, int y, int w, int h, Fl_Color c) { + gtk_color(fl_color_average(FL_WHITE, c, 0.5)); + fl_xyline(x + 2, y + 1, x + w - 3); + fl_yxline(x + 1, y + 2, y + h - 3); + + gtk_color(fl_color_average(FL_BLACK, c, 0.5)); + fl_begin_loop(); + fl_vertex(x, y + 2); + fl_vertex(x + 2, y); + fl_vertex(x + w - 3, y); + fl_vertex(x + w - 1, y + 2); + fl_vertex(x + w - 1, y + h - 3); + fl_vertex(x + w - 3, y + h - 1); + fl_vertex(x + 2, y + h - 1); + fl_vertex(x, y + h - 3); + fl_end_loop(); +} + + +static void gtk_up_box(int x, int y, int w, int h, Fl_Color c) { + gtk_up_frame(x, y, w, h, c); + + gtk_color(fl_color_average(FL_WHITE, c, 0.4f)); + fl_xyline(x + 2, y + 2, x + w - 3); + gtk_color(fl_color_average(FL_WHITE, c, 0.2f)); + fl_xyline(x + 2, y + 3, x + w - 3); + gtk_color(fl_color_average(FL_WHITE, c, 0.1f)); + fl_xyline(x + 2, y + 4, x + w - 3); + gtk_color(c); + fl_rectf(x + 2, y + 5, w - 4, h - 7); + gtk_color(fl_color_average(FL_BLACK, c, 0.025f)); + fl_xyline(x + 2, y + h - 4, x + w - 3); + gtk_color(fl_color_average(FL_BLACK, c, 0.05f)); + fl_xyline(x + 2, y + h - 3, x + w - 3); + gtk_color(fl_color_average(FL_BLACK, c, 0.1f)); + fl_xyline(x + 2, y + h - 2, x + w - 3); + fl_yxline(x + w - 2, y + 2, y + h - 3); +} + + +static void gtk_down_frame(int x, int y, int w, int h, Fl_Color c) { + gtk_color(fl_color_average(FL_BLACK, c, 0.5)); + fl_begin_loop(); + fl_vertex(x, y + 2); + fl_vertex(x + 2, y); + fl_vertex(x + w - 3, y); + fl_vertex(x + w - 1, y + 2); + fl_vertex(x + w - 1, y + h - 3); + fl_vertex(x + w - 3, y + h - 1); + fl_vertex(x + 2, y + h - 1); + fl_vertex(x, y + h - 3); + fl_end_loop(); + + gtk_color(fl_color_average(FL_BLACK, c, 0.1f)); + fl_xyline(x + 2, y + 1, x + w - 3); + fl_yxline(x + 1, y + 2, y + h - 3); + + gtk_color(fl_color_average(FL_BLACK, c, 0.05f)); + fl_yxline(x + 2, y + h - 2, y + 2, x + w - 2); +} + + +static void gtk_down_box(int x, int y, int w, int h, Fl_Color c) { + gtk_down_frame(x, y, w, h, c); + + gtk_color(c); + fl_rectf(x + 3, y + 3, w - 5, h - 4); + fl_yxline(x + w - 2, y + 3, y + h - 3); +} + + +static void gtk_thin_up_frame(int x, int y, int w, int h, Fl_Color c) { + gtk_color(fl_color_average(FL_WHITE, c, 0.6f)); + fl_xyline(x + 1, y, x + w - 2); + fl_yxline(x, y + 1, y + h - 2); + + gtk_color(fl_color_average(FL_BLACK, c, 0.4f)); + fl_xyline(x + 1, y + h - 1, x + w - 2); + fl_yxline(x + w - 1, y + 1, y + h - 2); +} + + +static void gtk_thin_up_box(int x, int y, int w, int h, Fl_Color c) { + gtk_thin_up_frame(x, y, w, h, c); + + gtk_color(fl_color_average(FL_WHITE, c, 0.4f)); + fl_xyline(x + 1, y + 1, x + w - 2); + gtk_color(fl_color_average(FL_WHITE, c, 0.2f)); + fl_xyline(x + 1, y + 2, x + w - 2); + gtk_color(fl_color_average(FL_WHITE, c, 0.1f)); + fl_xyline(x + 1, y + 3, x + w - 2); + gtk_color(c); + fl_rectf(x + 1, y + 4, w - 2, h - 8); + gtk_color(fl_color_average(FL_BLACK, c, 0.025f)); + fl_xyline(x + 1, y + h - 4, x + w - 2); + gtk_color(fl_color_average(FL_BLACK, c, 0.05f)); + fl_xyline(x + 1, y + h - 3, x + w - 2); + gtk_color(fl_color_average(FL_BLACK, c, 0.1f)); + fl_xyline(x + 1, y + h - 2, x + w - 2); +} + + +static void gtk_thin_down_frame(int x, int y, int w, int h, Fl_Color c) { + gtk_color(fl_color_average(FL_BLACK, c, 0.4f)); + fl_xyline(x + 1, y, x + w - 2); + fl_yxline(x, y + 1, y + h - 2); + + gtk_color(fl_color_average(FL_WHITE, c, 0.6f)); + fl_xyline(x + 1, y + h - 1, x + w - 2); + fl_yxline(x + w - 1, y + 1, y + h - 2); +} + + +static void gtk_thin_down_box(int x, int y, int w, int h, Fl_Color c) { + gtk_thin_down_frame(x, y, w, h, c); + + gtk_color(c); + fl_rectf(x + 1, y + 1, w - 2, h - 2); +} + +//------------------------ +// new GTK+ style for round buttons +#if 1 + +static void fl_arc_i(int x,int y,int w,int h,double a1,double a2) { + fl_arc(x,y,w,h,a1,a2); +} + +enum {UPPER_LEFT, LOWER_RIGHT, CLOSED, FILL}; + +static void draw(int which, int x,int y,int w,int h, int inset) +{ + if (inset*2 >= w) inset = (w-1)/2; + if (inset*2 >= h) inset = (h-1)/2; + x += inset; + y += inset; + w -= 2*inset; + h -= 2*inset; + int d = w <= h ? w : h; + if (d <= 1) return; + void (*f)(int,int,int,int,double,double); + f = (which==FILL) ? fl_pie : fl_arc_i; + if (which >= CLOSED) { + f(x+w-d, y, d, d, w<=h ? 0 : -90, w<=h ? 180 : 90); + f(x, y+h-d, d, d, w<=h ? 180 : 90, w<=h ? 360 : 270); + } else if (which == UPPER_LEFT) { + f(x+w-d, y, d, d, 45, w<=h ? 180 : 90); + f(x, y+h-d, d, d, w<=h ? 180 : 90, 225); + } else { // LOWER_RIGHT + f(x, y+h-d, d, d, 225, w<=h ? 360 : 270); + f(x+w-d, y, d, d, w<=h ? 360 : 270, 360+45); + } + if (which == FILL) { + if (w < h) + fl_rectf(x, y+d/2, w, h-(d&-2)); + else if (w > h) + fl_rectf(x+d/2, y, w-(d&-2), h); + } else { + if (w < h) { + if (which != UPPER_LEFT) fl_yxline(x+w-1, y+d/2-1, y+h-d/2+1); + if (which != LOWER_RIGHT) fl_yxline(x, y+d/2-1, y+h-d/2+1); + } else if (w > h) { + if (which != UPPER_LEFT) fl_xyline(x+d/2-1, y+h-1, x+w-d/2+1); + if (which != LOWER_RIGHT) fl_xyline(x+d/2-1, y, x+w-d/2+1); + } + } +} + +void gtk_round_up_box(int x, int y, int w, int h, Fl_Color c) { + fl_color(c); + draw(FILL, x, y, w, h, 2); + + gtk_color(fl_color_average(FL_BLACK, c, 0.025f)); + draw(LOWER_RIGHT, x+1, y, w-2, h, 2); + draw(LOWER_RIGHT, x, y, w, h, 3); + gtk_color(fl_color_average(FL_BLACK, c, 0.05f)); + draw(LOWER_RIGHT, x+1, y, w-2, h, 1); + draw(LOWER_RIGHT, x, y, w, h, 2); + gtk_color(fl_color_average(FL_BLACK, c, 0.1f)); + draw(LOWER_RIGHT, x+1, y, w-2, h, 0); + draw(LOWER_RIGHT, x, y, w, h, 1); + + gtk_color(fl_color_average(FL_WHITE, c, 0.1f)); + draw(UPPER_LEFT, x, y, w, h, 4); + draw(UPPER_LEFT, x+1, y, w-2, h, 3); + gtk_color(fl_color_average(FL_WHITE, c, 0.2f)); + draw(UPPER_LEFT, x, y, w, h, 3); + draw(UPPER_LEFT, x+1, y, w-2, h, 2); + gtk_color(fl_color_average(FL_WHITE, c, 0.4f)); + draw(UPPER_LEFT, x, y, w, h, 2); + draw(UPPER_LEFT, x+1, y, w-2, h, 1); + gtk_color(fl_color_average(FL_WHITE, c, 0.5f)); + draw(UPPER_LEFT, x, y, w, h, 1); + draw(UPPER_LEFT, x+1, y, w-2, h, 0); + + gtk_color(fl_color_average(FL_BLACK, c, 0.5f)); + draw(CLOSED, x, y, w, h, 0); +} + +void gtk_round_down_box(int x, int y, int w, int h, Fl_Color c) { + fl_color(c); + draw(FILL, x, y, w, h, 2); + + gtk_color(fl_color_average(FL_BLACK, c, 0.05f)); + draw(UPPER_LEFT, x, y, w, h, 2); + draw(UPPER_LEFT, x+1, y, w-2, h, 1); + gtk_color(fl_color_average(FL_BLACK, c, 0.1f)); + draw(UPPER_LEFT, x, y, w, h, 1); + draw(UPPER_LEFT, x+1, y, w-2, h, 0); + + gtk_color(fl_color_average(FL_BLACK, c, 0.5f)); + draw(CLOSED, x, y, w, h, 0); +} + +#else + +static void gtk_round_up_box(int x, int y, int w, int h, Fl_Color c) { + gtk_color(c); + fl_pie(x, y, w, h, 0.0, 360.0); + gtk_color(fl_color_average(FL_WHITE, c, 0.5f)); + fl_arc(x, y, w, h, 45.0, 180.0); + gtk_color(fl_color_average(FL_WHITE, c, 0.25f)); + fl_arc(x, y, w, h, 180.0, 405.0); + gtk_color(fl_color_average(FL_BLACK, c, 0.5f)); + fl_arc(x, y, w, h, 225.0, 360.0); +} + + +static void gtk_round_down_box(int x, int y, int w, int h, Fl_Color c) { + gtk_color(c); + fl_pie(x, y, w, h, 0.0, 360.0); + gtk_color(fl_color_average(FL_BLACK, c, 0.2)); + fl_arc(x + 1, y, w, h, 90.0, 210.0); + gtk_color(fl_color_average(FL_BLACK, c, 0.6)); + fl_arc(x, y, w, h, 0.0, 360.0); +} + +#endif + +Fl_Boxtype fl_define_FL_GTK_UP_BOX() { + fl_internal_boxtype(_FL_GTK_UP_BOX, gtk_up_box); + fl_internal_boxtype(_FL_GTK_DOWN_BOX, gtk_down_box); + fl_internal_boxtype(_FL_GTK_UP_FRAME, gtk_up_frame); + fl_internal_boxtype(_FL_GTK_DOWN_FRAME, gtk_down_frame); + fl_internal_boxtype(_FL_GTK_THIN_UP_BOX, gtk_thin_up_box); + fl_internal_boxtype(_FL_GTK_THIN_DOWN_BOX, gtk_thin_down_box); + fl_internal_boxtype(_FL_GTK_THIN_UP_FRAME, gtk_thin_up_frame); + fl_internal_boxtype(_FL_GTK_THIN_DOWN_FRAME, gtk_thin_down_frame); + fl_internal_boxtype(_FL_GTK_ROUND_UP_BOX, gtk_round_up_box); + fl_internal_boxtype(_FL_GTK_ROUND_DOWN_BOX, gtk_round_down_box); + + return _FL_GTK_UP_BOX; +} + + +// +// End of "$Id: fl_gtk.cxx 5721 2007-02-27 19:23:24Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_images_core.cxx b/third_party/windows/fltk-1.1.10/src/fl_images_core.cxx new file mode 100644 index 0000000..eff0055 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_images_core.cxx @@ -0,0 +1,103 @@ +// +// "$Id: fl_images_core.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// FLTK images library core. +// +// Copyright 1997-2005 by Easy Software Products. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// fl_register_images() - Register the image formats. +// fl_check_images() - Check for a supported image format. +// + +// +// Include necessary header files... +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include "flstring.h" + + +// +// Define a simple global image registration function that registers +// the extra image formats that aren't part of the core FLTK library. +// + +static Fl_Image *fl_check_images(const char *name, uchar *header, int headerlen); + + +// +// 'fl_register_images()' - Register the image formats. +// + +void fl_register_images() { + Fl_Shared_Image::add_handler(fl_check_images); +} + + +// +// 'fl_check_images()' - Check for a supported image format. +// + +Fl_Image * // O - Image, if found +fl_check_images(const char *name, // I - Filename + uchar *header, // I - Header data from file + int) { // I - Amount of data (not used) + if (memcmp(header, "GIF87a", 6) == 0 || + memcmp(header, "GIF89a", 6) == 0) // GIF file + return new Fl_GIF_Image(name); + + if (memcmp(header, "BM", 2) == 0) // BMP file + return new Fl_BMP_Image(name); + + if (header[0] == 'P' && header[1] >= '1' && header[1] <= '7') + // Portable anymap + return new Fl_PNM_Image(name); + +#ifdef HAVE_LIBPNG + if (memcmp(header, "\211PNG", 4) == 0)// PNG file + return new Fl_PNG_Image(name); +#endif // HAVE_LIBPNG + +#ifdef HAVE_LIBJPEG + if (memcmp(header, "\377\330\377", 3) == 0 && + // Start-of-Image + header[3] >= 0xc0 && header[3] <= 0xef) + // APPn for JPEG file + return new Fl_JPEG_Image(name); +#endif // HAVE_LIBJPEG + + return 0; +} + + +// +// End of "$Id: fl_images_core.cxx 5845 2007-05-20 00:01:06Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_labeltype.cxx b/third_party/windows/fltk-1.1.10/src/fl_labeltype.cxx new file mode 100644 index 0000000..dc2289e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_labeltype.cxx @@ -0,0 +1,133 @@ +// +// "$Id: fl_labeltype.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Label drawing routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Drawing code for the (one) common label types. +// Other label types (symbols) are in their own source files +// to avoid linking if not used. + +#include +#include +#include +#include +#include + +void +fl_no_label(const Fl_Label*,int,int,int,int,Fl_Align) {} + +void +fl_normal_label(const Fl_Label* o, int X, int Y, int W, int H, Fl_Align align) +{ + fl_font(o->font, o->size); + fl_color((Fl_Color)o->color); + fl_draw(o->value, X, Y, W, H, align, o->image); +} + +void +fl_normal_measure(const Fl_Label* o, int& W, int& H) { + fl_font(o->font, o->size); + fl_measure(o->value, W, H); + if (o->image) { + if (o->image->w() > W) W = o->image->w(); + H += o->image->h(); + } +} + +#define MAX_LABELTYPE 16 + +static Fl_Label_Draw_F* table[MAX_LABELTYPE] = { + fl_normal_label, + fl_no_label, + fl_normal_label, // _FL_SHADOW_LABEL, + fl_normal_label, // _FL_ENGRAVED_LABEL, + fl_normal_label, // _FL_EMBOSSED_LABEL, + fl_no_label, // _FL_MULTI_LABEL, + fl_no_label, // _FL_ICON_LABEL, + // FL_FREE_LABELTYPE+n: + fl_no_label, fl_no_label, fl_no_label, + fl_no_label, fl_no_label, fl_no_label, + fl_no_label, fl_no_label, fl_no_label +}; + +static Fl_Label_Measure_F* measure[MAX_LABELTYPE]; + +void Fl::set_labeltype(Fl_Labeltype t,Fl_Label_Draw_F* f,Fl_Label_Measure_F*m) +{ + table[t] = f; measure[t] = m; +} + +//////////////////////////////////////////////////////////////// + +// draw label with arbitrary alignment in arbitrary box: +void Fl_Label::draw(int X, int Y, int W, int H, Fl_Align align) const { + if (!value && !image) return; + table[type](this, X, Y, W, H, align); +} + +void Fl_Label::measure(int& W, int& H) const { + if (!value && !image) { + W = H = 0; + return; + } + + Fl_Label_Measure_F* f = ::measure[type]; if (!f) f = fl_normal_measure; + f(this, W, H); +} + +// The normal call for a draw() method: +void Fl_Widget::draw_label() const { + int X = x_+Fl::box_dx(box()); + int W = w_-Fl::box_dw(box()); + if (W > 11 && align()&(FL_ALIGN_LEFT|FL_ALIGN_RIGHT)) {X += 3; W -= 6;} + draw_label(X, y_+Fl::box_dy(box()), W, h_-Fl::box_dh(box())); +} + +// draw() can use this instead to change the bounding box: +void Fl_Widget::draw_label(int X, int Y, int W, int H) const { + // quit if we are not drawing a label inside the widget: + if ((align()&15) && !(align() & FL_ALIGN_INSIDE)) return; + draw_label(X,Y,W,H,align()); +} + +// Anybody can call this to force the label to draw anywhere: +void Fl_Widget::draw_label(int X, int Y, int W, int H, Fl_Align a) const { + if (flags()&SHORTCUT_LABEL) fl_draw_shortcut = 1; + Fl_Label l1 = label_; + if (!active_r()) { + l1.color = fl_inactive((Fl_Color)l1.color); + if (l1.deimage) l1.image = l1.deimage; + } + l1.draw(X,Y,W,H,a); + fl_draw_shortcut = 0; +} + +// include these vars here so they can be referenced without including +// Fl_Input_ code: +#include + +// +// End of "$Id: fl_labeltype.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_line_style.cxx b/third_party/windows/fltk-1.1.10/src/fl_line_style.cxx new file mode 100644 index 0000000..3798da5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_line_style.cxx @@ -0,0 +1,165 @@ +// +// "$Id: fl_line_style.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Line style code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include "flstring.h" +#include + +#ifdef __APPLE_QUARTZ__ +float fl_quartz_line_width_ = 1.0f; +static enum CGLineCap fl_quartz_line_cap_ = kCGLineCapButt; +static enum CGLineJoin fl_quartz_line_join_ = kCGLineJoinMiter; +static float *fl_quartz_line_pattern = 0; +static int fl_quartz_line_pattern_size = 0; +void fl_quartz_restore_line_style_() { + CGContextSetLineWidth(fl_gc, fl_quartz_line_width_); + CGContextSetLineCap(fl_gc, fl_quartz_line_cap_); + CGContextSetLineJoin(fl_gc, fl_quartz_line_join_); + CGContextSetLineDash(fl_gc, 0, fl_quartz_line_pattern, fl_quartz_line_pattern_size); +} +#endif + +void fl_line_style(int style, int width, char* dashes) { +#ifdef WIN32 + // According to Bill, the "default" cap and join should be the + // "fastest" mode supported for the platform. I don't know why + // they should be different (same graphics cards, etc., right?) MRS + static DWORD Cap[4]= {PS_ENDCAP_FLAT, PS_ENDCAP_FLAT, PS_ENDCAP_ROUND, PS_ENDCAP_SQUARE}; + static DWORD Join[4]={PS_JOIN_ROUND, PS_JOIN_MITER, PS_JOIN_ROUND, PS_JOIN_BEVEL}; + int s1 = PS_GEOMETRIC | Cap[(style>>8)&3] | Join[(style>>12)&3]; + DWORD a[16]; int n = 0; + if (dashes && dashes[0]) { + s1 |= PS_USERSTYLE; + for (n = 0; n < 16 && *dashes; n++) a[n] = *dashes++; + } else { + s1 |= style & 0xff; // allow them to pass any low 8 bits for style + } + if ((style || n) && !width) width = 1; // fix cards that do nothing for 0? + LOGBRUSH penbrush = {BS_SOLID,fl_RGB(),0}; // can this be fl_brush()? + HPEN newpen = ExtCreatePen(s1, width, &penbrush, n, n ? a : 0); + if (!newpen) { + Fl::error("fl_line_style(): Could not create GDI pen object."); + return; + } + HPEN oldpen = (HPEN)SelectObject(fl_gc, newpen); + DeleteObject(oldpen); + DeleteObject(fl_current_xmap->pen); + fl_current_xmap->pen = newpen; +#elif defined(__APPLE_QD__) + // QuickDraw supports pen size and pattern, but no arbitrary line styles. + static Pattern styles[] = { + { { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } }, // FL_SOLID + { { 0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f } }, // FL_DASH + { { 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55 } } // FL_DOT + }; + + if (!width) width = 1; + PenSize(width, width); + + style &= 0xff; + if (style > 2) style = 2; + PenPat(styles + style); +#elif defined(__APPLE_QUARTZ__) + static enum CGLineCap Cap[4] = { kCGLineCapButt, kCGLineCapButt, + kCGLineCapRound, kCGLineCapSquare }; + static enum CGLineJoin Join[4] = { kCGLineJoinMiter, kCGLineJoinMiter, + kCGLineJoinRound, kCGLineJoinBevel }; + if (width<1) width = 1; + fl_quartz_line_width_ = (float)width; + fl_quartz_line_cap_ = Cap[(style>>8)&3]; + fl_quartz_line_join_ = Join[(style>>12)&3]; + char *d = dashes; + static float pattern[16]; + if (d && *d) { + float *p = pattern; + while (*d) { *p++ = (float)*d++; } + fl_quartz_line_pattern = pattern; + fl_quartz_line_pattern_size = d-dashes; + } else if (style & 0xff) { + char dash, dot, gap; + // adjust lengths to account for cap: + if (style & 0x200) { + dash = char(2*width); + dot = 1; + gap = char(2*width-1); + } else { + dash = char(3*width); + dot = gap = char(width); + } + float *p = pattern; + switch (style & 0xff) { + case FL_DASH: *p++ = dash; *p++ = gap; break; + case FL_DOT: *p++ = dot; *p++ = gap; break; + case FL_DASHDOT: *p++ = dash; *p++ = gap; *p++ = dot; *p++ = gap; break; + case FL_DASHDOTDOT: *p++ = dash; *p++ = gap; *p++ = dot; *p++ = gap; *p++ = dot; *p++ = gap; break; + } + fl_quartz_line_pattern_size = p-pattern; + fl_quartz_line_pattern = pattern; + } else { + fl_quartz_line_pattern = 0; fl_quartz_line_pattern_size = 0; + } + fl_quartz_restore_line_style_(); +#else + int ndashes = dashes ? strlen(dashes) : 0; + // emulate the WIN32 dash patterns on X + char buf[7]; + if (!ndashes && (style&0xff)) { + int w = width ? width : 1; + char dash, dot, gap; + // adjust lengths to account for cap: + if (style & 0x200) { + dash = char(2*w); + dot = 1; // unfortunately 0 does not work + gap = char(2*w-1); + } else { + dash = char(3*w); + dot = gap = char(w); + } + char* p = dashes = buf; + switch (style & 0xff) { + case FL_DASH: *p++ = dash; *p++ = gap; break; + case FL_DOT: *p++ = dot; *p++ = gap; break; + case FL_DASHDOT: *p++ = dash; *p++ = gap; *p++ = dot; *p++ = gap; break; + case FL_DASHDOTDOT: *p++ = dash; *p++ = gap; *p++ = dot; *p++ = gap; *p++ = dot; *p++ = gap; break; + } + ndashes = p-buf; + } + static int Cap[4] = {CapButt, CapButt, CapRound, CapProjecting}; + static int Join[4] = {JoinMiter, JoinMiter, JoinRound, JoinBevel}; + XSetLineAttributes(fl_display, fl_gc, width, + ndashes ? LineOnOffDash : LineSolid, + Cap[(style>>8)&3], Join[(style>>12)&3]); + if (ndashes) XSetDashes(fl_display, fl_gc, 0, dashes, ndashes); +#endif +} + + +// +// End of "$Id: fl_line_style.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_open_uri.cxx b/third_party/windows/fltk-1.1.10/src/fl_open_uri.cxx new file mode 100644 index 0000000..f0b5e4f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_open_uri.cxx @@ -0,0 +1,370 @@ +// +// "$Id: fl_open_uri.cxx 5636 2007-01-23 20:45:28Z mike $" +// +// fl_open_uri() code for FLTK. +// +// Test with: +// +// gcc -I/fltk/dir -I/fltk/dir/src -DTEST -o fl_open_uri fl_open_uri.cxx -lfltk +// +// Copyright 2003-2007 by Michael R Sweet +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// + +// +// Include necessary headers... +// + +#include +#include +#include +#include +#include +#include "flstring.h" +#ifdef WIN32 +# include +# include +#else +# include +# include +# include +# include +#endif // WIN32 + + +// +// Local functions... +// + +#if !defined(WIN32) && !defined(__APPLE__) +static char *path_find(const char *program, char *filename, int filesize); +#endif // !WIN32 && !__APPLE__ +#ifndef WIN32 +static int run_program(const char *program, char **argv, char *msg, int msglen); +#endif // !WIN32 + + +/** + * Open the specified URI. + * + * fl_open_uri() opens the specified Uniform Resource Identifier (URI) + * using an operating-system dependent program or interface. For URIs + * using the "ftp", "http", or "https" schemes, the system default web + * browser is used to open the URI, while "mailto" and "news" URIs are + * typically opened using the system default mail reader and "file" URIs + * are opened using the file system navigator. + * + * On success, the (optional) msg buffer is filled with the command that + * was run to open the URI; on Windows, this will always be "open uri". + * + * On failure, the msg buffer is filled with an English error message. + * + * @param uri The URI to open + * @param msg Optional buffer which contains the command or error message + * @param msglen Length of optional buffer + * @return 1 on success, 0 on failure + */ + +int +fl_open_uri(const char *uri, char *msg, int msglen) { + // Supported URI schemes... + static const char * const schemes[] = { + "file://", + "ftp://", + "http://", + "https://", + "mailto:", + "news://", + NULL + }; + + // Validate the URI scheme... + int i; + for (i = 0; schemes[i]; i ++) + if (!strncmp(uri, schemes[i], strlen(schemes[i]))) + break; + + if (!schemes[i]) { + if (msg) { + char scheme[255]; + if (sscanf(uri, "%254[^:]", scheme) == 1) { + snprintf(msg, msglen, "URI scheme \"%s\" not supported.", scheme); + } else { + snprintf(msg, msglen, "Bad URI \"%s\"", uri); + } + } + + return 0; + } + +#ifdef WIN32 + if (msg) snprintf(msg, msglen, "open %s", uri); + + return (int)ShellExecute(HWND_DESKTOP, "open", uri, NULL, NULL, SW_SHOW) > 32; + +#elif defined(__APPLE__) + char *argv[3]; // Command-line arguments + + argv[0] = "open"; + argv[1] = (char *)uri; + argv[2] = 0; + + if (msg) snprintf(msg, msglen, "open %s", uri); + + return run_program("/usr/bin/open", argv, msg, msglen) != 0; + +#else // !WIN32 && !__APPLE__ + // Run any of several well-known commands to open the URI. + // + // We give preference to the Portland group's xdg-utils + // programs which run the user's preferred web browser, etc. + // based on the current desktop environment in use. We fall + // back on older standards and then finally test popular programs + // until we find one we can use. + // + // Note that we specifically do not support the MAILER and + // BROWSER environment variables because we have no idea whether + // we need to run the listed commands in a terminal program. + + char command[1024], // Command to run... + *argv[4], // Command-line arguments + remote[1024]; // Remote-mode command... + const char * const *commands; // Array of commands to check... + static const char * const browsers[] = { + "xdg-open", // Portland + "htmlview", // Freedesktop.org + "firefox", + "mozilla", + "netscape", + "konqueror", // KDE + "opera", + "hotjava", // Solaris + "mosaic", + NULL + }; + static const char * const readers[] = { + "xdg-email", // Portland + "thunderbird", + "mozilla", + "netscape", + "evolution", // GNOME + "kmailservice", // KDE + NULL + }; + static const char * const managers[] = { + "xdg-open", // Portland + "fm", // IRIX + "dtaction", // CDE + "nautilus", // GNOME + "konqueror", // KDE + NULL + }; + + // Figure out which commands to check for... + if (!strncmp(uri, "file://", 7)) commands = managers; + else if (!strncmp(uri, "mailto:", 7) || + !strncmp(uri, "news:", 5)) commands = readers; + else commands = browsers; + + // Find the command to run... + for (i = 0; commands[i]; i ++) + if (path_find(commands[i], command, sizeof(command))) break; + + if (!commands[i]) { + if (msg) { + snprintf(msg, msglen, "No helper application found for \"%s\"", uri); + } + + return 0; + } + + // Handle command-specific arguments... + argv[0] = (char *)commands[i]; + + if (!strcmp(commands[i], "firefox") || + !strcmp(commands[i], "mozilla") || + !strcmp(commands[i], "netscape") || + !strcmp(commands[i], "thunderbird")) { + // program -remote openURL(uri) + snprintf(remote, sizeof(remote), "openURL(%s)", uri); + + argv[1] = (char *)"-remote"; + argv[2] = remote; + argv[3] = 0; + } else if (!strcmp(commands[i], "dtaction")) { + // dtaction open uri + argv[1] = (char *)"open"; + argv[2] = (char *)uri; + argv[3] = 0; + } else { + // program uri + argv[1] = (char *)uri; + argv[2] = 0; + } + + if (msg) { + strlcpy(msg, argv[0], msglen); + + for (i = 1; argv[i]; i ++) { + strlcat(msg, " ", msglen); + strlcat(msg, argv[i], msglen); + } + } + + return run_program(command, argv, msg, msglen) != 0; +#endif // WIN32 +} + + +#if !defined(WIN32) && !defined(__APPLE__) +// Find a program in the path... +static char *path_find(const char *program, char *filename, int filesize) { + const char *path; // Search path + char *ptr, // Pointer into filename + *end; // End of filename buffer + + + if ((path = getenv("PATH")) == NULL) path = "/bin:/usr/bin"; + + for (ptr = filename, end = filename + filesize - 1; *path; path ++) { + if (*path == ':') { + if (ptr > filename && ptr[-1] != '/' && ptr < end) *ptr++ = '/'; + + strlcpy(ptr, program, end - ptr + 1); + + if (!access(filename, X_OK)) return filename; + + ptr = filename; + } else if (ptr < end) *ptr++ = *path; + } + + if (ptr > filename) { + if (ptr[-1] != '/' && ptr < end) *ptr++ = '/'; + + strlcpy(ptr, program, end - ptr + 1); + + if (!access(filename, X_OK)) return filename; + } + + return 0; +} +#endif // !WIN32 && !__APPLE__ + + +#ifndef WIN32 +// Run the specified program, returning 1 on success and 0 on failure +static int +run_program(const char *program, char **argv, char *msg, int msglen) { + pid_t pid; // Process ID of first child + int status; // Exit status from first child + sigset_t set, oldset; // Signal masks + + + // Block SIGCHLD while we run the program... + // + // Note that I only use the POSIX signal APIs, however older operating + // systems may either not support POSIX signals or have side effects. + // IRIX, for example, provides three separate and incompatible signal + // APIs, so it is possible that an application setting a signal handler + // via signal() or sigset() will not have its SIGCHLD signals blocked... + + sigemptyset(&set); + sigaddset(&set, SIGCHLD); + sigprocmask(SIG_BLOCK, &set, &oldset); + + // Create child processes that actually run the program for us... + if ((pid = fork()) == 0) { + // First child comes here, fork a second child and exit... + if (!fork()) { + // Second child comes here, redirect stdin/out/err to /dev/null... + close(0); + open("/dev/null", O_RDONLY); + + close(1); + open("/dev/null", O_WRONLY); + + close(2); + open("/dev/null", O_WRONLY); + + // Detach from the current process group... + setsid(); + + // Run the program... + execv(program, argv); + _exit(0); + } else { + // First child gets here, exit immediately... + _exit(0); + } + } else if (pid < 0) { + // Restore signal handling... + sigprocmask(SIG_SETMASK, &oldset, NULL); + + // Return indicating failure... + return 0; + } + + // Wait for the first child to exit... + while (waitpid(pid, &status, 0) < 0) { + if (errno != EINTR) { + // Someone else grabbed the child status... + if (msg) snprintf(msg, msglen, "waitpid(%ld) failed: %s", (long)pid, + strerror(errno)); + + // Restore signal handling... + sigprocmask(SIG_SETMASK, &oldset, NULL); + + // Return indicating failure... + return 0; + } + } + + // Restore signal handling... + sigprocmask(SIG_SETMASK, &oldset, NULL); + + // Return indicating success... + return 1; +} +#endif // !WIN32 + + +#ifdef TEST +// +// Test code... +// + +// Open the URI on the command-line... +int main(int argc, char **argv) { + char msg[1024]; + + + if (argc != 2) { + puts("Usage: fl_open_uri URI"); + return 1; + } + + if (!fl_open_uri(argv[1], msg, sizeof(msg))) { + puts(msg); + return 1; + } else return 0; +} +#endif // TEST + + +// +// End of "$Id: fl_open_uri.cxx 5636 2007-01-23 20:45:28Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_oval_box.cxx b/third_party/windows/fltk-1.1.10/src/fl_oval_box.cxx new file mode 100644 index 0000000..06132de --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_oval_box.cxx @@ -0,0 +1,66 @@ +// +// "$Id: fl_oval_box.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Oval box drawing code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + + +// Less-used box types are in seperate files so they are not linked +// in if not used. + +#include +#include + +static void fl_oval_flat_box(int x, int y, int w, int h, Fl_Color c) { + fl_color(c); + fl_pie(x, y, w, h, 0, 360); +} + +static void fl_oval_frame(int x, int y, int w, int h, Fl_Color c) { + fl_color(c); + fl_arc(x, y, w, h, 0, 360); +} + +static void fl_oval_box(int x, int y, int w, int h, Fl_Color c) { + fl_oval_flat_box(x,y,w,h,c); + fl_oval_frame(x,y,w,h,FL_BLACK); +} + +static void fl_oval_shadow_box(int x, int y, int w, int h, Fl_Color c) { + fl_oval_flat_box(x+3,y+3,w,h,FL_DARK3); + fl_oval_box(x,y,w,h,c); +} + +extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*); +Fl_Boxtype fl_define_FL_OVAL_BOX() { + fl_internal_boxtype(_FL_OSHADOW_BOX,fl_oval_shadow_box); + fl_internal_boxtype(_FL_OVAL_FRAME,fl_oval_frame); + fl_internal_boxtype(_FL_OFLAT_BOX,fl_oval_flat_box); + fl_internal_boxtype(_FL_OVAL_BOX,fl_oval_box); + return _FL_OVAL_BOX; +} + +// +// End of "$Id: fl_oval_box.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_overlay.cxx b/third_party/windows/fltk-1.1.10/src/fl_overlay.cxx new file mode 100644 index 0000000..6082b69 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_overlay.cxx @@ -0,0 +1,125 @@ +// +// "$Id: fl_overlay.cxx 5614 2007-01-18 15:25:09Z matt $" +// +// Overlay support for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Extremely limited "overlay" support. You can use this to drag out +// a rectangle in response to mouse events. It is your responsibility +// to erase the overlay before drawing anything that might intersect +// it. + +#include +#include +#ifdef __APPLE__ +#include +#endif + +//#define USE_XOR + +static int px,py,pw,ph; + +#ifndef USE_XOR +#include +static uchar *bgN = 0L, *bgS = 0L, *bgE = 0L, *bgW = 0L; +static int bgx, bgy, bgw, bgh; +#endif + +static void draw_current_rect() { +#ifdef USE_XOR +# ifdef WIN32 + int old = SetROP2(fl_gc, R2_NOT); + fl_rect(px, py, pw, ph); + SetROP2(fl_gc, old); +# elif defined(__APPLE_QD__) + PenMode( patXor ); + fl_rect(px, py, pw, ph); + PenMode( patCopy ); +# elif defined(__APPLE_QUARTZ__) + // warning: Quartz does not support xor drawing + // Use the Fl_Overlay_Window instead. + fl_color(FL_WHITE); + fl_rect(px, py, pw, ph); +# else + XSetFunction(fl_display, fl_gc, GXxor); + XSetForeground(fl_display, fl_gc, 0xffffffff); + XDrawRectangle(fl_display, fl_window, fl_gc, px, py, pw, ph); + XSetFunction(fl_display, fl_gc, GXcopy); +# endif +#else + if (bgN) { free(bgN); bgN = 0L; } + if (bgS) { free(bgS); bgS = 0L; } + if (bgE) { free(bgE); bgE = 0L; } + if (bgW) { free(bgW); bgW = 0L; } + if (pw>0 && ph>0) { + bgE = fl_read_image(0L, px+pw-1, py, 1, ph); + bgW = fl_read_image(0L, px, py, 1, ph); + bgS = fl_read_image(0L, px, py+ph-1, pw, 1); + bgN = fl_read_image(0L, px, py, pw, 1); + bgx = px; bgy = py; + bgw = pw; bgh = ph; + } + fl_color(FL_WHITE); + fl_line_style(FL_SOLID); + fl_rect(px, py, pw, ph); + fl_color(FL_BLACK); + fl_line_style(FL_DOT); + fl_rect(px, py, pw, ph); + fl_line_style(FL_SOLID); +#endif +} + +static void erase_current_rect() { +#ifdef USE_XOR +# ifdef __APPLE_QUARTZ__ + fl_rect(px, py, pw, ph); +# else + draw_current_rect(); +# endif +#else + if (bgN) fl_draw_image(bgN, bgx, bgy, bgw, 1); + if (bgS) fl_draw_image(bgS, bgx, bgy+bgh-1, bgw, 1); + if (bgW) fl_draw_image(bgW, bgx, bgy, 1, bgh); + if (bgE) fl_draw_image(bgE, bgx+bgw-1, bgy, 1, bgh); +#endif +} + +void fl_overlay_clear() { + if (pw > 0) {erase_current_rect(); pw = 0;} +} + +void fl_overlay_rect(int x, int y, int w, int h) { + if (w < 0) {x += w; w = -w;} else if (!w) w = 1; + if (h < 0) {y += h; h = -h;} else if (!h) h = 1; + if (pw > 0) { + if (x==px && y==py && w==pw && h==ph) return; + erase_current_rect(); + } + px = x; py = y; pw = w; ph = h; + draw_current_rect(); +} + +// +// End of "$Id: fl_overlay.cxx 5614 2007-01-18 15:25:09Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_overlay_visual.cxx b/third_party/windows/fltk-1.1.10/src/fl_overlay_visual.cxx new file mode 100644 index 0000000..4c72fb1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_overlay_visual.cxx @@ -0,0 +1,105 @@ +// +// "$Id: fl_overlay_visual.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// X overlay support for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Return an overlay visual, if any. Also allocate a colormap and +// record the depth for fl_color() to use. +// Another disgusting X interface, based on code extracted and +// purified with great difficulty from XLayerUtil.cxx: + +#include +#if HAVE_OVERLAY +#include +#include + +// SERVER_OVERLAY_VISUALS property element: +struct OverlayInfo { + long overlay_visual; + long transparent_type; + long value; + long layer; +}; + +extern Colormap fl_overlay_colormap; +extern XVisualInfo* fl_overlay_visual; +extern ulong fl_transparent_pixel; + +XVisualInfo *fl_find_overlay_visual() { + static char beenhere; + if (beenhere) return fl_overlay_visual; + beenhere = 1; + + fl_open_display(); + Atom overlayVisualsAtom = + XInternAtom(fl_display,"SERVER_OVERLAY_VISUALS",1); + if (!overlayVisualsAtom) return 0; + OverlayInfo *overlayInfo; + ulong sizeData, bytesLeft; + Atom actualType; + int actualFormat; + if (XGetWindowProperty(fl_display, RootWindow(fl_display, fl_screen), + overlayVisualsAtom, 0L, 10000L, False, + overlayVisualsAtom, &actualType, &actualFormat, + &sizeData, &bytesLeft, + (unsigned char **) &overlayInfo)) return 0; + + if (actualType == overlayVisualsAtom && actualFormat == 32) { + int n = int(sizeData/4); + XVisualInfo* v = 0; + // find the greatest depth that has a transparent pixel: + for (int i = 0; i < n; i++) { + if (overlayInfo[i].transparent_type != 1) continue; + if (overlayInfo[i].layer <= 0) continue; + XVisualInfo templt; + templt.visualid = overlayInfo[i].overlay_visual; + int num; + XVisualInfo *v1=XGetVisualInfo(fl_display, VisualIDMask, &templt, &num); + if (v1->screen == fl_screen && v1->c_class == PseudoColor + && (!v || v1->depth > v->depth && v1->depth <= 8)) { + if (v) XFree((char*)v); + v = v1; + fl_transparent_pixel = overlayInfo[i].value; + } else { + XFree((char*)v1); + } + } + if (v) { + fl_overlay_visual = v; + fl_overlay_colormap = + XCreateColormap(fl_display, RootWindow(fl_display, fl_screen), + v->visual, AllocNone); + } + } + XFree((char*)overlayInfo); + //printf("overlay visual %ld selected\n", fl_overlay_visual->visualid); + return fl_overlay_visual; +} + +#endif + +// +// End of "$Id: fl_overlay_visual.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_plastic.cxx b/third_party/windows/fltk-1.1.10/src/fl_plastic.cxx new file mode 100644 index 0000000..af09ed9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_plastic.cxx @@ -0,0 +1,381 @@ +// +// "$Id: fl_plastic.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// "Plastic" drawing routines for the Fast Light Tool Kit (FLTK). +// +// These box types provide a cross between Aqua and KDE buttons; kindof +// like translucent plastic buttons... +// +// Copyright 2001-2005 by Michael Sweet. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Box drawing code for an obscure box type. +// These box types are in seperate files so they are not linked +// in if not used. + +#include +#include +#include "flstring.h" + +// +// Uncomment the following line to restore the old plastic box type +// appearance. +// + +//#define USE_OLD_PLASTIC_BOX +#define USE_OLD_PLASTIC_COLOR + +extern uchar *fl_gray_ramp(); + +inline Fl_Color shade_color(uchar gc, Fl_Color bc) { +#ifdef USE_OLD_PLASTIC_COLOR + return fl_color_average((Fl_Color)gc, bc, 0.75f); +#else + unsigned grgb = Fl::get_color((Fl_Color)gc), + brgb = Fl::get_color(bc); + int red, green, blue, gray; + + + gray = ((grgb >> 24) & 255); + red = gray * ((brgb >> 24) & 255) / 255 + gray * gray / 510; + gray = ((grgb >> 16) & 255); + green = gray * ((brgb >> 16) & 255) / 255 + gray * gray / 510; + gray = ((grgb >> 8) & 255); + blue = gray * ((brgb >> 8) & 255) / 255 + gray * gray / 510; + + if (red > 255) + red = 255; + + if (green > 255) + green = 255; + + if (blue > 255) + blue = 255; + + if (Fl::draw_box_active()) + return fl_rgb_color(red, green, blue); + else + return fl_color_average(FL_GRAY, fl_rgb_color(red, green, blue), 0.75f); +#endif // USE_OLD_PLASTIC_COLOR +} + + +static void frame_rect(int x, int y, int w, int h, const char *c, Fl_Color bc) { + uchar *g = fl_gray_ramp(); + int b = strlen(c) / 4 + 1; + + for (x += b, y += b, w -= 2 * b, h -= 2 * b; b > 1; b --) + { + // Draw lines around the perimeter of the button, 4 colors per + // circuit. + fl_color(shade_color(g[*c++], bc)); + fl_line(x, y + h + b, x + w - 1, y + h + b, x + w + b - 1, y + h); + fl_color(shade_color(g[*c++], bc)); + fl_line(x + w + b - 1, y + h, x + w + b - 1, y, x + w - 1, y - b); + fl_color(shade_color(g[*c++], bc)); + fl_line(x + w - 1, y - b, x, y - b, x - b, y); + fl_color(shade_color(g[*c++], bc)); + fl_line(x - b, y, x - b, y + h, x, y + h + b); + } +} + + +static void frame_round(int x, int y, int w, int h, const char *c, Fl_Color bc) { + uchar *g = fl_gray_ramp(); + int b = strlen(c) / 4 + 1; + + if (w==h) { + for (; b > 1; b --, x ++, y ++, w -= 2, h -= 2) + { + fl_color(shade_color(g[*c++], bc)); + fl_arc(x, y, w, h, 45.0, 135.0); + fl_color(shade_color(g[*c++], bc)); + fl_arc(x, y, w, h, 315.0, 405.0); + fl_color(shade_color(g[*c++], bc)); + fl_arc(x, y, w, h, 225.0, 315.0); + fl_color(shade_color(g[*c++], bc)); + fl_arc(x, y, w, h, 135.0, 225.0); + } + } else if (w>h) { + int d = h/2; + for (; b > 1; d--, b --, x ++, y ++, w -= 2, h -= 2) + { + fl_color(shade_color(g[*c++], bc)); + fl_arc(x, y, h, h, 90.0, 135.0); + fl_xyline(x+d, y, x+w-d); + fl_arc(x+w-h, y, h, h, 45.0, 90.0); + fl_color(shade_color(g[*c++], bc)); + fl_arc(x+w-h, y, h, h, 315.0, 405.0); + fl_color(shade_color(g[*c++], bc)); + fl_arc(x+w-h, y, h, h, 270.0, 315.0); + fl_xyline(x+d, y+h-1, x+w-d); + fl_arc(x, y, h, h, 225.0, 270.0); + fl_color(shade_color(g[*c++], bc)); + fl_arc(x, y, h, h, 135.0, 225.0); + } + } else if (w 1; d--, b --, x ++, y ++, w -= 2, h -= 2) + { + fl_color(shade_color(g[*c++], bc)); + fl_arc(x, y, w, w, 45.0, 135.0); + fl_color(shade_color(g[*c++], bc)); + fl_arc(x, y, w, w, 0.0, 45.0); + fl_yxline(x+w-1, y+d, y+h-d); + fl_arc(x, y+h-w, w, w, 315.0, 360.0); + fl_color(shade_color(g[*c++], bc)); + fl_arc(x, y+h-w, w, w, 225.0, 315.0); + fl_color(shade_color(g[*c++], bc)); + fl_arc(x, y+h-w, w, w, 180.0, 225.0); + fl_yxline(x, y+d, y+h-d); + fl_arc(x, y, w, w, 135.0, 180.0); + } + } +} + + +static void shade_rect(int x, int y, int w, int h, const char *c, Fl_Color bc) { + uchar *g = fl_gray_ramp(); + int i, j; + int clen = strlen(c) - 1; + int chalf = clen / 2; + int cstep = 1; + + if (h < (w * 2)) { + // Horizontal shading... + if (clen >= h) cstep = 2; + + for (i = 0, j = 0; j < chalf; i ++, j += cstep) { + // Draw the top line and points... + fl_color(shade_color(g[c[i]], bc)); + fl_xyline(x + 1, y + i, x + w - 2); + + fl_color(shade_color(g[c[i] - 2], bc)); + fl_point(x, y + i + 1); + fl_point(x + w - 1, y + i + 1); + + // Draw the bottom line and points... + fl_color(shade_color(g[c[clen - i]], bc)); + fl_xyline(x + 1, y + h - i, x + w - 2); + + fl_color(shade_color(g[c[clen - i] - 2], bc)); + fl_point(x, y + h - i); + fl_point(x + w - 1, y + h - i); + } + + // Draw the interior and sides... + i = chalf / cstep; + + fl_color(shade_color(g[c[chalf]], bc)); + fl_rectf(x + 1, y + i, w - 2, h - 2 * i + 1); + + fl_color(shade_color(g[c[chalf] - 2], bc)); + fl_yxline(x, y + i, y + h - i); + fl_yxline(x + w - 1, y + i, y + h - i); + } else { + // Vertical shading... + if (clen >= w) cstep = 2; + + for (i = 0, j = 0; j < chalf; i ++, j += cstep) { + // Draw the left line and points... + fl_color(shade_color(g[c[i]], bc)); + fl_yxline(x + i, y + 1, y + h - 1); + + fl_color(shade_color(g[c[i] - 2], bc)); + fl_point(x + i + 1, y); + fl_point(x + i + 1, y + h); + + // Draw the right line and points... + fl_color(shade_color(g[c[clen - i]], bc)); + fl_yxline(x + w - 1 - i, y + 1, y + h - 1); + + fl_color(shade_color(g[c[clen - i] - 2], bc)); + fl_point(x + w - 2 - i, y); + fl_point(x + w - 2 - i, y + h); + } + + // Draw the interior, top, and bottom... + i = chalf / cstep; + + fl_color(shade_color(g[c[chalf]], bc)); + fl_rectf(x + i, y + 1, w - 2 * i, h - 1); + + fl_color(shade_color(g[c[chalf] - 2], bc)); + fl_xyline(x + i, y, x + w - i); + fl_xyline(x + i, y + h, x + w - i); + } +} + +static void shade_round(int x, int y, int w, int h, const char *c, Fl_Color bc) { + uchar *g = fl_gray_ramp(); + int i; + int clen = strlen(c) - 1; + int chalf = clen / 2; + + if (w>h) { + int d = h/2; + const int na = 8; + for (i=0; i 1) { + fl_xyline(x+1, y, x+w-2); + fl_xyline(x+1, y+h-1, x+w-2); + } + if (h > 1) { + fl_yxline(x, y+1, y+h-2); + fl_yxline(x+w-1, y+1, y+h-2); + } +} + + +static void thin_up_box(int x, int y, int w, int h, Fl_Color c) { +#ifdef USE_OLD_PLASTIC_BOX + shade_rect(x + 2, y + 2, w - 4, h - 5, "RVQNOPQRSTUVWVQ", c); + up_frame(x, y, w, h, c); +#else + if (w > 4 && h > 4) { + shade_rect(x + 1, y + 1, w - 2, h - 3, "RQOQSUWQ", c); + frame_rect(x, y, w, h - 1, "IJLM", c); + } else { + narrow_thin_box(x, y, w, h, c); + } +#endif // USE_OLD_PLASTIC_BOX +} + + +static void up_box(int x, int y, int w, int h, Fl_Color c) { +#ifdef USE_OLD_PLASTIC_BOX + shade_rect(x + 2, y + 2, w - 4, h - 5, "RVQNOPQRSTUVWVQ", c); + up_frame(x, y, w, h, c); +#else + if (w > 8 && h > 8) { + shade_rect(x + 1, y + 1, w - 2, h - 3, "RVQNOPQRSTUVWVQ", c); + frame_rect(x, y, w, h - 1, "IJLM", c); + } else { + thin_up_box(x, y, w, h, c); + } +#endif // USE_OLD_PLASTIC_BOX +} + + +static void up_round(int x, int y, int w, int h, Fl_Color c) { + shade_round(x, y, w, h, "RVQNOPQRSTUVWVQ", c); + frame_round(x, y, w, h, "IJLM", c); +} + + +static void down_frame(int x, int y, int w, int h, Fl_Color c) { + frame_rect(x, y, w, h - 1, "LLLLTTRR", c); +} + + +static void down_box(int x, int y, int w, int h, Fl_Color c) { + if (w > 6 && h > 6) { + shade_rect(x + 2, y + 2, w - 4, h - 5, "STUVWWWVT", c); + down_frame(x, y, w, h, c); + } + else { + narrow_thin_box(x, y, w, h, c); + } +} + + +static void down_round(int x, int y, int w, int h, Fl_Color c) { + shade_round(x, y, w, h, "STUVWWWVT", c); + frame_round(x, y, w, h, "IJLM", c); +} + + +extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*); + + +Fl_Boxtype fl_define_FL_PLASTIC_UP_BOX() { + fl_internal_boxtype(_FL_PLASTIC_UP_BOX, up_box); + fl_internal_boxtype(_FL_PLASTIC_DOWN_BOX, down_box); + fl_internal_boxtype(_FL_PLASTIC_UP_FRAME, up_frame); + fl_internal_boxtype(_FL_PLASTIC_DOWN_FRAME, down_frame); + fl_internal_boxtype(_FL_PLASTIC_THIN_UP_BOX, thin_up_box); + fl_internal_boxtype(_FL_PLASTIC_THIN_DOWN_BOX, down_box); + fl_internal_boxtype(_FL_PLASTIC_ROUND_UP_BOX, up_round); + fl_internal_boxtype(_FL_PLASTIC_ROUND_DOWN_BOX, down_round); + + return _FL_PLASTIC_UP_BOX; +} + + +// +// End of "$Id: fl_plastic.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_read_image.cxx b/third_party/windows/fltk-1.1.10/src/fl_read_image.cxx new file mode 100644 index 0000000..44e5545 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_read_image.cxx @@ -0,0 +1,503 @@ +// +// "$Id: fl_read_image.cxx 6475 2008-10-19 20:35:32Z matt $" +// +// X11 image reading routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include "flstring.h" + +#ifdef DEBUG +# include +#endif // DEBUG + +#ifdef WIN32 +# include "fl_read_image_win32.cxx" +#elif defined(__APPLE__) +# include "fl_read_image_mac.cxx" +#else +# include +# ifdef __sgi +# include +# else +# include +# endif // __sgi + +// Defined in fl_color.cxx +extern uchar fl_redmask, fl_greenmask, fl_bluemask; +extern int fl_redshift, fl_greenshift, fl_blueshift, fl_extrashift; + +// +// 'fl_subimage_offsets()' - Calculate subimage offsets for an axis +static inline int +fl_subimage_offsets(int a, int aw, int b, int bw, int &obw) +{ + int off; + int ob; + + if (b >= a) { + ob = b; + off = 0; + } else { + ob = a; + off = a - b; + } + + bw -= off; + + if (ob + bw <= a + aw) { + obw = bw; + } else { + obw = (a + aw) - ob; + } + + return off; +} + +// this handler will catch and ignore exceptions during XGetImage +// to avoid an application crash +static int xgetimageerrhandler(Display *display, XErrorEvent *error) { + return 0; +} + +// +// 'fl_read_image()' - Read an image from the current window. +// + +uchar * // O - Pixel buffer or NULL if failed +fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate + int X, // I - Left position + int Y, // I - Top position + int w, // I - Width of area to read + int h, // I - Height of area to read + int alpha) { // I - Alpha value for image (0 for none) + XImage *image; // Captured image + int i, maxindex; // Looping vars + int x, y; // Current X & Y in image + int d; // Depth of image + unsigned char *line, // Array to hold image row + *line_ptr; // Pointer to current line image + unsigned char *pixel; // Current color value + XColor colors[4096]; // Colors from the colormap... + unsigned char cvals[4096][3]; // Color values from the colormap... + unsigned index_mask, + index_shift, + red_mask, + red_shift, + green_mask, + green_shift, + blue_mask, + blue_shift; + + + // + // Under X11 we have the option of the XGetImage() interface or SGI's + // ReadDisplay extension which does all of the really hard work for + // us... + // + +# ifdef __sgi + if (XReadDisplayQueryExtension(fl_display, &i, &i)) { + image = XReadDisplay(fl_display, fl_window, X, Y, w, h, 0, NULL); + } else +# else + image = 0; +# endif // __sgi + + if (!image) { + // fetch absolute coordinates + int dx, dy, sx, sy, sw, sh; + Window child_win; + Fl_Window *win = fl_find(fl_window); + if (win) { + XTranslateCoordinates(fl_display, fl_window, + RootWindow(fl_display, fl_screen), X, Y, &dx, &dy, &child_win); + // screen dimensions + Fl::screen_xywh(sx, sy, sw, sh, fl_screen); + } + if (!win || (dx >= sx && dy >= sy && dx + w <= sw && dy + h <= sh)) { + // the image is fully contained, we can use the traditional method + // however, if the window is obscured etc. the function will still fail. Make sure we + // catch the error and continue, otherwise an exception will be thrown. + XErrorHandler old_handler = XSetErrorHandler(xgetimageerrhandler); + image = XGetImage(fl_display, fl_window, X, Y, w, h, AllPlanes, ZPixmap); + XSetErrorHandler(old_handler); + } else { + // image is crossing borders, determine visible region + int nw, nh, noffx, noffy; + noffx = fl_subimage_offsets(sx, sw, dx, w, nw); + noffy = fl_subimage_offsets(sy, sh, dy, h, nh); + if (nw <= 0 || nh <= 0) return 0; + + // allocate the image + int bpp = fl_visual->depth + ((fl_visual->depth / 8) % 2) * 8; + char* buf = (char*)malloc(bpp / 8 * w * h); + image = XCreateImage(fl_display, fl_visual->visual, + fl_visual->depth, ZPixmap, 0, buf, w, h, bpp, 0); + if (!image) { + if (buf) free(buf); + return 0; + } + + XErrorHandler old_handler = XSetErrorHandler(xgetimageerrhandler); + XImage *subimg = XGetSubImage(fl_display, fl_window, X + noffx, Y + noffy, + nw, nh, AllPlanes, ZPixmap, image, noffx, noffy); + XSetErrorHandler(old_handler); + if (!subimg) { + XDestroyImage(image); + return 0; + } + } + } + + if (!image) return 0; + +#ifdef DEBUG + printf("width = %d\n", image->width); + printf("height = %d\n", image->height); + printf("xoffset = %d\n", image->xoffset); + printf("format = %d\n", image->format); + printf("data = %p\n", image->data); + printf("byte_order = %d\n", image->byte_order); + printf("bitmap_unit = %d\n", image->bitmap_unit); + printf("bitmap_bit_order = %d\n", image->bitmap_bit_order); + printf("bitmap_pad = %d\n", image->bitmap_pad); + printf("depth = %d\n", image->depth); + printf("bytes_per_line = %d\n", image->bytes_per_line); + printf("bits_per_pixel = %d\n", image->bits_per_pixel); + printf("red_mask = %08x\n", image->red_mask); + printf("green_mask = %08x\n", image->green_mask); + printf("blue_mask = %08x\n", image->blue_mask); + printf("map_entries = %d\n", fl_visual->visual->map_entries); +#endif // DEBUG + + d = alpha ? 4 : 3; + + // Allocate the image data array as needed... + if (!p) p = new uchar[w * h * d]; + + // Initialize the default colors/alpha in the whole image... + memset(p, alpha, w * h * d); + + // Check that we have valid mask/shift values... + if (!image->red_mask && image->bits_per_pixel > 12) { + // Greater than 12 bits must be TrueColor... + image->red_mask = fl_visual->visual->red_mask; + image->green_mask = fl_visual->visual->green_mask; + image->blue_mask = fl_visual->visual->blue_mask; + +#ifdef DEBUG + puts("\n---- UPDATED ----"); + printf("fl_redmask = %08x\n", fl_redmask); + printf("fl_redshift = %d\n", fl_redshift); + printf("fl_greenmask = %08x\n", fl_greenmask); + printf("fl_greenshift = %d\n", fl_greenshift); + printf("fl_bluemask = %08x\n", fl_bluemask); + printf("fl_blueshift = %d\n", fl_blueshift); + printf("red_mask = %08x\n", image->red_mask); + printf("green_mask = %08x\n", image->green_mask); + printf("blue_mask = %08x\n", image->blue_mask); +#endif // DEBUG + } + + // Check if we have colormap image... + if (!image->red_mask) { + // Get the colormap entries for this window... + maxindex = fl_visual->visual->map_entries; + + for (i = 0; i < maxindex; i ++) colors[i].pixel = i; + + XQueryColors(fl_display, fl_colormap, colors, maxindex); + + for (i = 0; i < maxindex; i ++) { + cvals[i][0] = colors[i].red >> 8; + cvals[i][1] = colors[i].green >> 8; + cvals[i][2] = colors[i].blue >> 8; + } + + // Read the pixels and output an RGB image... + for (y = 0; y < image->height; y ++) { + pixel = (unsigned char *)(image->data + y * image->bytes_per_line); + line = p + y * w * d; + + switch (image->bits_per_pixel) { + case 1 : + for (x = image->width, line_ptr = line, index_mask = 128; + x > 0; + x --, line_ptr += d) { + if (*pixel & index_mask) { + line_ptr[0] = cvals[1][0]; + line_ptr[1] = cvals[1][1]; + line_ptr[2] = cvals[1][2]; + } else { + line_ptr[0] = cvals[0][0]; + line_ptr[1] = cvals[0][1]; + line_ptr[2] = cvals[0][2]; + } + + if (index_mask > 1) { + index_mask >>= 1; + } else { + index_mask = 128; + pixel ++; + } + } + break; + + case 2 : + for (x = image->width, line_ptr = line, index_shift = 6; + x > 0; + x --, line_ptr += d) { + i = (*pixel >> index_shift) & 3; + + line_ptr[0] = cvals[i][0]; + line_ptr[1] = cvals[i][1]; + line_ptr[2] = cvals[i][2]; + + if (index_shift > 0) { + index_mask >>= 2; + index_shift -= 2; + } else { + index_mask = 192; + index_shift = 6; + pixel ++; + } + } + break; + + case 4 : + for (x = image->width, line_ptr = line, index_shift = 4; + x > 0; + x --, line_ptr += d) { + if (index_shift == 4) i = (*pixel >> 4) & 15; + else i = *pixel & 15; + + line_ptr[0] = cvals[i][0]; + line_ptr[1] = cvals[i][1]; + line_ptr[2] = cvals[i][2]; + + if (index_shift > 0) { + index_shift = 0; + } else { + index_shift = 4; + pixel ++; + } + } + break; + + case 8 : + for (x = image->width, line_ptr = line; + x > 0; + x --, line_ptr += d, pixel ++) { + line_ptr[0] = cvals[*pixel][0]; + line_ptr[1] = cvals[*pixel][1]; + line_ptr[2] = cvals[*pixel][2]; + } + break; + + case 12 : + for (x = image->width, line_ptr = line, index_shift = 0; + x > 0; + x --, line_ptr += d) { + if (index_shift == 0) { + i = ((pixel[0] << 4) | (pixel[1] >> 4)) & 4095; + } else { + i = ((pixel[1] << 8) | pixel[2]) & 4095; + } + + line_ptr[0] = cvals[i][0]; + line_ptr[1] = cvals[i][1]; + line_ptr[2] = cvals[i][2]; + + if (index_shift == 0) { + index_shift = 4; + } else { + index_shift = 0; + pixel += 3; + } + } + break; + } + } + } else { + // RGB(A) image, so figure out the shifts & masks... + red_mask = image->red_mask; + red_shift = 0; + + while ((red_mask & 1) == 0) { + red_mask >>= 1; + red_shift ++; + } + + green_mask = image->green_mask; + green_shift = 0; + + while ((green_mask & 1) == 0) { + green_mask >>= 1; + green_shift ++; + } + + blue_mask = image->blue_mask; + blue_shift = 0; + + while ((blue_mask & 1) == 0) { + blue_mask >>= 1; + blue_shift ++; + } + + // Read the pixels and output an RGB image... + for (y = 0; y < image->height; y ++) { + pixel = (unsigned char *)(image->data + y * image->bytes_per_line); + line = p + y * w * d; + + switch (image->bits_per_pixel) { + case 8 : + for (x = image->width, line_ptr = line; + x > 0; + x --, line_ptr += d, pixel ++) { + i = *pixel; + + line_ptr[0] = 255 * ((i >> red_shift) & red_mask) / red_mask; + line_ptr[1] = 255 * ((i >> green_shift) & green_mask) / green_mask; + line_ptr[2] = 255 * ((i >> blue_shift) & blue_mask) / blue_mask; + } + break; + + case 12 : + for (x = image->width, line_ptr = line, index_shift = 0; + x > 0; + x --, line_ptr += d) { + if (index_shift == 0) { + i = ((pixel[0] << 4) | (pixel[1] >> 4)) & 4095; + } else { + i = ((pixel[1] << 8) | pixel[2]) & 4095; + } + + line_ptr[0] = 255 * ((i >> red_shift) & red_mask) / red_mask; + line_ptr[1] = 255 * ((i >> green_shift) & green_mask) / green_mask; + line_ptr[2] = 255 * ((i >> blue_shift) & blue_mask) / blue_mask; + + if (index_shift == 0) { + index_shift = 4; + } else { + index_shift = 0; + pixel += 3; + } + } + break; + + case 16 : + if (image->byte_order == LSBFirst) { + // Little-endian... + for (x = image->width, line_ptr = line; + x > 0; + x --, line_ptr += d, pixel += 2) { + i = (pixel[1] << 8) | pixel[0]; + + line_ptr[0] = 255 * ((i >> red_shift) & red_mask) / red_mask; + line_ptr[1] = 255 * ((i >> green_shift) & green_mask) / green_mask; + line_ptr[2] = 255 * ((i >> blue_shift) & blue_mask) / blue_mask; + } + } else { + // Big-endian... + for (x = image->width, line_ptr = line; + x > 0; + x --, line_ptr += d, pixel += 2) { + i = (pixel[0] << 8) | pixel[1]; + + line_ptr[0] = 255 * ((i >> red_shift) & red_mask) / red_mask; + line_ptr[1] = 255 * ((i >> green_shift) & green_mask) / green_mask; + line_ptr[2] = 255 * ((i >> blue_shift) & blue_mask) / blue_mask; + } + } + break; + + case 24 : + if (image->byte_order == LSBFirst) { + // Little-endian... + for (x = image->width, line_ptr = line; + x > 0; + x --, line_ptr += d, pixel += 3) { + i = (((pixel[2] << 8) | pixel[1]) << 8) | pixel[0]; + + line_ptr[0] = 255 * ((i >> red_shift) & red_mask) / red_mask; + line_ptr[1] = 255 * ((i >> green_shift) & green_mask) / green_mask; + line_ptr[2] = 255 * ((i >> blue_shift) & blue_mask) / blue_mask; + } + } else { + // Big-endian... + for (x = image->width, line_ptr = line; + x > 0; + x --, line_ptr += d, pixel += 3) { + i = (((pixel[0] << 8) | pixel[1]) << 8) | pixel[2]; + + line_ptr[0] = 255 * ((i >> red_shift) & red_mask) / red_mask; + line_ptr[1] = 255 * ((i >> green_shift) & green_mask) / green_mask; + line_ptr[2] = 255 * ((i >> blue_shift) & blue_mask) / blue_mask; + } + } + break; + + case 32 : + if (image->byte_order == LSBFirst) { + // Little-endian... + for (x = image->width, line_ptr = line; + x > 0; + x --, line_ptr += d, pixel += 4) { + i = (((((pixel[3] << 8) | pixel[2]) << 8) | pixel[1]) << 8) | pixel[0]; + + line_ptr[0] = 255 * ((i >> red_shift) & red_mask) / red_mask; + line_ptr[1] = 255 * ((i >> green_shift) & green_mask) / green_mask; + line_ptr[2] = 255 * ((i >> blue_shift) & blue_mask) / blue_mask; + } + } else { + // Big-endian... + for (x = image->width, line_ptr = line; + x > 0; + x --, line_ptr += d, pixel += 4) { + i = (((((pixel[0] << 8) | pixel[1]) << 8) | pixel[2]) << 8) | pixel[3]; + + line_ptr[0] = 255 * ((i >> red_shift) & red_mask) / red_mask; + line_ptr[1] = 255 * ((i >> green_shift) & green_mask) / green_mask; + line_ptr[2] = 255 * ((i >> blue_shift) & blue_mask) / blue_mask; + } + } + break; + } + } + } + + // Destroy the X image we've read and return the RGB(A) image... + XDestroyImage(image); + + return p; +} + +#endif + +// +// End of "$Id: fl_read_image.cxx 6475 2008-10-19 20:35:32Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_read_image_mac.cxx b/third_party/windows/fltk-1.1.10/src/fl_read_image_mac.cxx new file mode 100644 index 0000000..80f467a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_read_image_mac.cxx @@ -0,0 +1,137 @@ +// +// "$Id: fl_read_image_mac.cxx 5614 2007-01-18 15:25:09Z matt $" +// +// WIN32 image reading routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include + +// warning: this function is only implemented in Quickdraw. The function +// below may not work If FLTK is compiled with Quartz enabled + +// +// 'fl_read_image()' - Read an image from the current window. +// + +uchar * // O - Pixel buffer or NULL if failed +fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate + int x, // I - Left position + int y, // I - Top position + int w, // I - Width of area to read + int h, // I - Height of area to read + int alpha) { // I - Alpha value for image (0 for none) + Rect src, // Source rectangle + dst; // Destination rectangle + GWorldPtr osbuffer; // Temporary off-screen buffer for copy + GrafPtr srcPort; // Source port + RGBColor rgb; // RGB colors for copy mask... + PixMapHandle pm; // Pixmap handle for off-screen buffer + uchar *base, // Base address of off-screen buffer + *psrc, // Pointer into off-screen buffer + *pdst; // Pointer into pixel buffer + int idx, idy; // Current X & Y in image + int d; // Depth of image + int rowBytes; // Number of bytes per row... + + // Set the source and destination rectangles... + src.top = y; + src.left = x; + src.bottom = y + h; + src.right = x + w; + + dst.top = 0; + dst.left = 0; + dst.bottom = h; + dst.right = w; + + // Get an off-screen buffer for copying the image... + QDErr err = NewGWorld(&osbuffer, 0, &dst, 0L, 0L, 0); + if (!osbuffer) return 0; + if (err!=noErr) { + DisposeGWorld(osbuffer); + return 0; + } + + // Get the source port... + GetPort(&srcPort); + + // Set the RGB copy mask via the foreground/background colors... + rgb.red = 0xffff; + rgb.green = 0xffff; + rgb.blue = 0xffff; + RGBBackColor(&rgb); + + rgb.red = 0x0000; + rgb.green = 0x0000; + rgb.blue = 0x0000; + RGBForeColor(&rgb); + + // Copy the screen image to the off-screen buffer... + CopyBits(GetPortBitMapForCopyBits(srcPort), + GetPortBitMapForCopyBits(osbuffer), &src, &dst, srcCopy, 0L); + + // Allocate the image data array as needed... + d = alpha ? 4 : 3; + + if (!p) p = new uchar[w * h * d]; + + // Initialize the default colors/alpha in the whole image... + memset(p, alpha, w * h * d); + + // Set the correct port for the off-screen buffer and lock the buffer + SetGWorld(osbuffer, 0); + + pm = GetGWorldPixMap(osbuffer); + LockPixels(pm); + + base = (uchar *)GetPixBaseAddr(pm); + rowBytes = (*pm)->rowBytes & 0x3fff; + + // Copy the image from the off-screen buffer to the memory buffer. + for (idy = 0, pdst = p; idy < h; idy ++) +#ifdef __i386__ + for (idx = 0, psrc = base + idy * rowBytes; idx < w; idx ++, psrc += 4, pdst += d) { + pdst[0] = psrc[2]; + pdst[1] = psrc[1]; + pdst[2] = psrc[0]; + } +#else + for (idx = 0, psrc = base + idy * rowBytes + 1; idx < w; idx ++, psrc += 4, pdst += d) { + pdst[0] = psrc[0]; + pdst[1] = psrc[1]; + pdst[2] = psrc[2]; + } +#endif // __i386__ + // Unlock and delete the off-screen buffer, then return... + UnlockPixels(pm); + DisposeGWorld(osbuffer); + + SetPort(srcPort); + return p; +} + + +// +// End of "$Id: fl_read_image_mac.cxx 5614 2007-01-18 15:25:09Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_read_image_win32.cxx b/third_party/windows/fltk-1.1.10/src/fl_read_image_win32.cxx new file mode 100644 index 0000000..cf4731c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_read_image_win32.cxx @@ -0,0 +1,72 @@ +// +// "$Id: fl_read_image_win32.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// WIN32 image reading routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// +// 'fl_read_image()' - Read an image from the current window. +// + +uchar * // O - Pixel buffer or NULL if failed +fl_read_image(uchar *p, // I - Pixel buffer or NULL to allocate + int X, // I - Left position + int Y, // I - Top position + int w, // I - Width of area to read + int h, // I - Height of area to read + int alpha) { // I - Alpha value for image (0 for none) + int x, y; // Looping vars + int d; // Depth of image + uchar *ptr; // Pointer in image data + + + // Allocate the image data array as needed... + d = alpha ? 4 : 3; + + if (!p) p = new uchar[w * h * d]; + + // Initialize the default colors/alpha in the whole image... + memset(p, alpha, w * h * d); + + // Grab all of the pixels in the image, one at a time... + // MRS: there has to be a better way than this! + for (y = 0, ptr = p; y < h; y ++) { + for (x = 0; x < w; x ++, ptr += d) { + COLORREF c = GetPixel(fl_gc, X + x, Y + y); + + ptr[0] = (uchar)c; + c >>= 8; + ptr[1] = (uchar)c; + c >>= 8; + ptr[2] = (uchar)c; + } + } + + return p; +} + + +// +// End of "$Id: fl_read_image_win32.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_rect.cxx b/third_party/windows/fltk-1.1.10/src/fl_rect.cxx new file mode 100644 index 0000000..b4b6351 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_rect.cxx @@ -0,0 +1,685 @@ +// +// "$Id: fl_rect.cxx 5692 2007-02-12 16:41:41Z matt $" +// +// Rectangle drawing routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// These routines from fl_draw.H are used by the standard boxtypes +// and thus are always linked into an fltk program. +// Also all fl_clip routines, since they are always linked in so +// that minimal update works. + +#include +#include +#include +#include +#include + +#ifdef __APPLE_QUARTZ__ +extern float fl_quartz_line_width_; +#endif + +void fl_rect(int x, int y, int w, int h) { + if (w<=0 || h<=0) return; +#ifdef WIN32 + MoveToEx(fl_gc, x, y, 0L); + LineTo(fl_gc, x+w-1, y); + LineTo(fl_gc, x+w-1, y+h-1); + LineTo(fl_gc, x, y+h-1); + LineTo(fl_gc, x, y); +#elif defined(__APPLE_QD__) + Rect rect; + SetRect(&rect, x, y, x+w, y+h); + FrameRect(&rect); +#elif defined(__APPLE_QUARTZ__) + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, false); + CGRect rect = CGRectMake(x, y, w-1, h-1); + CGContextStrokeRect(fl_gc, rect); + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, true); +#else + XDrawRectangle(fl_display, fl_window, fl_gc, x, y, w-1, h-1); +#endif +} + +void fl_rectf(int x, int y, int w, int h) { + if (w<=0 || h<=0) return; +#ifdef WIN32 + RECT rect; + rect.left = x; rect.top = y; + rect.right = x + w; rect.bottom = y + h; + FillRect(fl_gc, &rect, fl_brush()); +#elif defined(__APPLE_QD__) + Rect rect; + SetRect(&rect, x, y, x+w, y+h); + PaintRect(&rect); +#elif defined(__APPLE_QUARTZ__) + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, false); + CGRect rect = CGRectMake(x, y, w-1, h-1); + CGContextFillRect(fl_gc, rect); + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, true); +#else + if (w && h) XFillRectangle(fl_display, fl_window, fl_gc, x, y, w, h); +#endif +} + +void fl_xyline(int x, int y, int x1) { +#ifdef WIN32 + MoveToEx(fl_gc, x, y, 0L); LineTo(fl_gc, x1+1, y); +#elif defined(__APPLE_QD__) + MoveTo(x, y); LineTo(x1, y); +#elif defined(__APPLE_QUARTZ__) + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, false); + CGContextMoveToPoint(fl_gc, x, y); + CGContextAddLineToPoint(fl_gc, x1, y); + CGContextStrokePath(fl_gc); + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, true); +#else + XDrawLine(fl_display, fl_window, fl_gc, x, y, x1, y); +#endif +} + +void fl_xyline(int x, int y, int x1, int y2) { +#ifdef WIN32 + if (y2 < y) y2--; + else y2++; + MoveToEx(fl_gc, x, y, 0L); + LineTo(fl_gc, x1, y); + LineTo(fl_gc, x1, y2); +#elif defined(__APPLE_QD__) + MoveTo(x, y); + LineTo(x1, y); + LineTo(x1, y2); +#elif defined(__APPLE_QUARTZ__) + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, false); + CGContextMoveToPoint(fl_gc, x, y); + CGContextAddLineToPoint(fl_gc, x1, y); + CGContextAddLineToPoint(fl_gc, x1, y2); + CGContextStrokePath(fl_gc); + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, true); +#else + XPoint p[3]; + p[0].x = x; p[0].y = p[1].y = y; + p[1].x = p[2].x = x1; p[2].y = y2; + XDrawLines(fl_display, fl_window, fl_gc, p, 3, 0); +#endif +} + +void fl_xyline(int x, int y, int x1, int y2, int x3) { +#ifdef WIN32 + if(x3 < x1) x3--; + else x3++; + MoveToEx(fl_gc, x, y, 0L); + LineTo(fl_gc, x1, y); + LineTo(fl_gc, x1, y2); + LineTo(fl_gc, x3, y2); +#elif defined(__APPLE_QD__) + MoveTo(x, y); + LineTo(x1, y); + LineTo(x1, y2); + LineTo(x3, y2); +#elif defined(__APPLE_QUARTZ__) + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, false); + CGContextMoveToPoint(fl_gc, x, y); + CGContextAddLineToPoint(fl_gc, x1, y); + CGContextAddLineToPoint(fl_gc, x1, y2); + CGContextAddLineToPoint(fl_gc, x3, y2); + CGContextStrokePath(fl_gc); + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, true); +#else + XPoint p[4]; + p[0].x = x; p[0].y = p[1].y = y; + p[1].x = p[2].x = x1; p[2].y = p[3].y = y2; + p[3].x = x3; + XDrawLines(fl_display, fl_window, fl_gc, p, 4, 0); +#endif +} + +void fl_yxline(int x, int y, int y1) { +#ifdef WIN32 + if (y1 < y) y1--; + else y1++; + MoveToEx(fl_gc, x, y, 0L); LineTo(fl_gc, x, y1); +#elif defined(__APPLE_QD__) + MoveTo(x, y); LineTo(x, y1); +#elif defined(__APPLE_QUARTZ__) + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, false); + CGContextMoveToPoint(fl_gc, x, y); + CGContextAddLineToPoint(fl_gc, x, y1); + CGContextStrokePath(fl_gc); + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, true); +#else + XDrawLine(fl_display, fl_window, fl_gc, x, y, x, y1); +#endif +} + +void fl_yxline(int x, int y, int y1, int x2) { +#ifdef WIN32 + if (x2 > x) x2++; + else x2--; + MoveToEx(fl_gc, x, y, 0L); + LineTo(fl_gc, x, y1); + LineTo(fl_gc, x2, y1); +#elif defined(__APPLE_QD__) + MoveTo(x, y); + LineTo(x, y1); + LineTo(x2, y1); +#elif defined(__APPLE_QUARTZ__) + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, false); + CGContextMoveToPoint(fl_gc, x, y); + CGContextAddLineToPoint(fl_gc, x, y1); + CGContextAddLineToPoint(fl_gc, x2, y1); + CGContextStrokePath(fl_gc); + if (fl_quartz_line_width_==1.0f) CGContextSetShouldAntialias(fl_gc, true); +#else + XPoint p[3]; + p[0].x = p[1].x = x; p[0].y = y; + p[1].y = p[2].y = y1; p[2].x = x2; + XDrawLines(fl_display, fl_window, fl_gc, p, 3, 0); +#endif +} + +void fl_yxline(int x, int y, int y1, int x2, int y3) { +#ifdef WIN32 + if(y3 0 && h > 0) { + r = XRectangleRegion(x,y,w,h); + Fl_Region current = rstack[rstackptr]; + if (current) { +#ifdef WIN32 + CombineRgn(r,r,current,RGN_AND); +#elif defined(__APPLE_QD__) + SectRgn(r, current, r); +#elif defined(__APPLE_QUARTZ__) + SectRgn(r, current, r); +#else + Fl_Region temp = XCreateRegion(); + XIntersectRegion(current, r, temp); + XDestroyRegion(r); + r = temp; +#endif + } + } else { // make empty clip region: +#ifdef WIN32 + r = CreateRectRgn(0,0,0,0); +#elif defined(__APPLE_QD__) + r = NewRgn(); + SetEmptyRgn(r); +#elif defined(__APPLE_QUARTZ__) + r = NewRgn(); + SetEmptyRgn(r); +#else + r = XCreateRegion(); +#endif + } + if (rstackptr < STACK_MAX) rstack[++rstackptr] = r; + else Fl::warning("fl_push_clip: clip stack overflow!\n"); + fl_restore_clip(); +} + +// make there be no clip (used by fl_begin_offscreen() only!) +void fl_push_no_clip() { + if (rstackptr < STACK_MAX) rstack[++rstackptr] = 0; + else Fl::warning("fl_push_no_clip: clip stack overflow!\n"); + fl_restore_clip(); +} + +// pop back to previous clip: +void fl_pop_clip() { + if (rstackptr > 0) { + Fl_Region oldr = rstack[rstackptr--]; + if (oldr) XDestroyRegion(oldr); + } else Fl::warning("fl_pop_clip: clip stack underflow!\n"); + fl_restore_clip(); +} + +// does this rectangle intersect current clip? +int fl_not_clipped(int x, int y, int w, int h) { + if (x+w <= 0 || y+h <= 0) return 0; + Fl_Region r = rstack[rstackptr]; +#ifdef WIN32 + if (!r) return 1; + RECT rect; + rect.left = x; rect.top = y; rect.right = x+w; rect.bottom = y+h; + return RectInRegion(r,&rect); +#elif defined(__APPLE_QD__) + if (!r) return 1; + Rect rect; + rect.left = x; rect.top = y; rect.right = x+w; rect.bottom = y+h; + return RectInRgn(&rect, r); +#elif defined(__APPLE_QUARTZ__) + if (!r) return 1; + Rect rect; + rect.left = x; rect.top = y; rect.right = x+w; rect.bottom = y+h; + return RectInRgn(&rect, r); +#else + return r ? XRectInRegion(r, x, y, w, h) : 1; +#endif +} + +// return rectangle surrounding intersection of this rectangle and clip: +int fl_clip_box(int x, int y, int w, int h, int& X, int& Y, int& W, int& H){ + X = x; Y = y; W = w; H = h; + Fl_Region r = rstack[rstackptr]; + if (!r) return 0; +#ifdef WIN32 +// The win32 API makes no distinction between partial and complete +// intersection, so we have to check for partial intersection ourselves. +// However, given that the regions may be composite, we have to do +// some voodoo stuff... + Fl_Region rr = XRectangleRegion(x,y,w,h); + Fl_Region temp = CreateRectRgn(0,0,0,0); + int ret; + if (CombineRgn(temp, rr, r, RGN_AND) == NULLREGION) { // disjoint + W = H = 0; + ret = 2; + } else if (EqualRgn(temp, rr)) { // complete + ret = 0; + } else { // parital intersection + RECT rect; + GetRgnBox(temp, &rect); + X = rect.left; Y = rect.top; W = rect.right - X; H = rect.bottom - Y; + ret = 1; + } + DeleteObject(temp); + DeleteObject(rr); + return ret; +#elif defined(__APPLE_QD__) + RgnHandle rr = NewRgn(); + SetRectRgn( rr, x, y, x+w, y+h ); + SectRgn( r, rr, rr ); + Rect rp; GetRegionBounds(rr, &rp); + X = rp.left; + Y = rp.top; + W = rp.right - X; + H = rp.bottom - Y; + DisposeRgn( rr ); + if ( H==0 ) return 2; + if ( h==H && w==W ) return 0; + return 0; +#elif defined(__APPLE_QUARTZ__) + RgnHandle rr = NewRgn(); + SetRectRgn( rr, x, y, x+w, y+h ); + SectRgn( r, rr, rr ); + Rect rp; GetRegionBounds(rr, &rp); + X = rp.left; + Y = rp.top; + W = rp.right - X; + H = rp.bottom - Y; + DisposeRgn( rr ); + if ( H==0 ) return 2; + if ( h==H && w==W ) return 0; + return 0; +#else + switch (XRectInRegion(r, x, y, w, h)) { + case 0: // completely outside + W = H = 0; + return 2; + case 1: // completely inside: + return 0; + default: // partial: + break; + } + Fl_Region rr = XRectangleRegion(x,y,w,h); + Fl_Region temp = XCreateRegion(); + XIntersectRegion(r, rr, temp); + XRectangle rect; + XClipBox(temp, &rect); + X = rect.x; Y = rect.y; W = rect.width; H = rect.height; + XDestroyRegion(temp); + XDestroyRegion(rr); + return 1; +#endif +} + +// +// End of "$Id: fl_rect.cxx 5692 2007-02-12 16:41:41Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_round_box.cxx b/third_party/windows/fltk-1.1.10/src/fl_round_box.cxx new file mode 100644 index 0000000..babff30 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_round_box.cxx @@ -0,0 +1,122 @@ +// +// "$Id: fl_round_box.cxx 6537 2008-12-02 17:21:36Z matt $" +// +// Round box drawing routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Box drawing code for an obscure box type. +// These box types are in seperate files so they are not linked +// in if not used. + +#include +#include + +// A compiler from a certain very large software company will not compile +// the function pointer assignment due to the name conflict with fl_arc. +// This function is to fix that: +void fl_arc_i(int x,int y,int w,int h,double a1,double a2) { + fl_arc(x,y,w,h,a1,a2); +} + +enum {UPPER_LEFT, LOWER_RIGHT, CLOSED, FILL}; + +static void draw(int which, int x,int y,int w,int h, int inset, unsigned int color) +{ + if (inset*2 >= w) inset = (w-1)/2; + if (inset*2 >= h) inset = (h-1)/2; + x += inset; + y += inset; + w -= 2*inset; + h -= 2*inset; + int d = w <= h ? w : h; + if (d <= 1) return; + fl_color(color); + void (*f)(int,int,int,int,double,double); + f = (which==FILL) ? fl_pie : fl_arc_i; + if (which >= CLOSED) { + f(x+w-d, y, d, d, w<=h ? 0 : -90, w<=h ? 180 : 90); + f(x, y+h-d, d, d, w<=h ? 180 : 90, w<=h ? 360 : 270); + } else if (which == UPPER_LEFT) { + f(x+w-d, y, d, d, 45, w<=h ? 180 : 90); + f(x, y+h-d, d, d, w<=h ? 180 : 90, 225); + } else { // LOWER_RIGHT + f(x, y+h-d, d, d, 225, w<=h ? 360 : 270); + f(x+w-d, y, d, d, w<=h ? 360 : 270, 360+45); + } + if (which == FILL) { + if (w < h) + fl_rectf(x, y+d/2, w, h-(d&-2)); + else if (w > h) + fl_rectf(x+d/2, y, w-(d&-2), h); + } else { + if (w < h) { + if (which != UPPER_LEFT) fl_yxline(x+w-1, y+d/2-1, y+h-d/2+1); + if (which != LOWER_RIGHT) fl_yxline(x, y+d/2-1, y+h-d/2+1); + } else if (w > h) { + if (which != UPPER_LEFT) fl_xyline(x+d/2-1, y+h-1, x+w-d/2+1); + if (which != LOWER_RIGHT) fl_xyline(x+d/2-1, y, x+w-d/2+1); + } + } +} + +extern uchar* fl_gray_ramp(); + +void fl_round_down_box(int x, int y, int w, int h, Fl_Color bgcolor) { + uchar *g = fl_gray_ramp(); + draw(FILL, x, y, w, h, 2, bgcolor); + draw(UPPER_LEFT, x+1, y, w-2, h, 0, g['N']); + draw(UPPER_LEFT, x+1, y, w-2, h, 1, g['H']); + draw(UPPER_LEFT, x, y, w, h, 0, g['N']); + draw(UPPER_LEFT, x, y, w, h, 1, g['H']); + draw(LOWER_RIGHT, x, y, w, h, 0, g['S']); + draw(LOWER_RIGHT, x+1, y, w-2, h, 0, g['U']); + draw(LOWER_RIGHT, x, y, w, h, 1, g['U']); + draw(LOWER_RIGHT, x+1, y, w-2, h, 1, g['W']); + draw(CLOSED, x, y, w, h, 2, g['A']); +} + +void fl_round_up_box(int x, int y, int w, int h, Fl_Color bgcolor) { + uchar *g = fl_gray_ramp(); + draw(FILL, x, y, w, h, 2, bgcolor); + draw(LOWER_RIGHT, x+1, y, w-2, h, 0, g['H']); + draw(LOWER_RIGHT, x+1, y, w-2, h, 1, g['N']); + draw(LOWER_RIGHT, x, y, w, h, 1, g['H']); + draw(LOWER_RIGHT, x, y, w, h, 2, g['N']); + draw(UPPER_LEFT, x, y, w, h, 2, g['U']); + draw(UPPER_LEFT, x+1, y, w-2, h, 1, g['S']); + draw(UPPER_LEFT, x, y, w, h, 1, g['W']); + draw(UPPER_LEFT, x+1, y, w-2, h, 0, g['U']); + draw(CLOSED, x, y, w, h, 0, g['A']); +} + +extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*); +Fl_Boxtype fl_define_FL_ROUND_UP_BOX() { + fl_internal_boxtype(_FL_ROUND_DOWN_BOX, fl_round_down_box); + fl_internal_boxtype(_FL_ROUND_UP_BOX, fl_round_up_box); + return _FL_ROUND_UP_BOX; +} + +// +// End of "$Id: fl_round_box.cxx 6537 2008-12-02 17:21:36Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_rounded_box.cxx b/third_party/windows/fltk-1.1.10/src/fl_rounded_box.cxx new file mode 100644 index 0000000..33f0d7a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_rounded_box.cxx @@ -0,0 +1,99 @@ +// +// "$Id: fl_rounded_box.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Rounded box drawing routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include + +#define RN 5 +#define RS 15 +#define BW 3 + +static double offset[RN] = { 0.0, 0.07612, 0.29289, 0.61732, 1.0}; + +static void rbox(int fill, int x, int y, int w, int h) { + int i; + int rsx ,rsy, rs; + rsx = w*2/5; rsy = h*2/5; + if (rsx > rsy) rs = rsy; else rs = rsx; + if (rs > RS) rs = RS; + rsx = rs; rsy = rs; + + if (fill) fl_begin_polygon(); else fl_begin_loop(); + for (i=0; i +#include +#include +#include + +// scroll a rectangle and redraw the newly exposed portions: +void fl_scroll(int X, int Y, int W, int H, int dx, int dy, + void (*draw_area)(void*, int,int,int,int), void* data) +{ + if (!dx && !dy) return; + if (dx <= -W || dx >= W || dy <= -H || dy >= H) { + // no intersection of old an new scroll + draw_area(data,X,Y,W,H); + return; + } + int src_x, src_w, dest_x, clip_x, clip_w; + if (dx > 0) { + src_x = X; + dest_x = X+dx; + src_w = W-dx; + clip_x = X; + clip_w = dx; + } else { + src_x = X-dx; + dest_x = X; + src_w = W+dx; + clip_x = X+src_w; + clip_w = W-src_w; + } + int src_y, src_h, dest_y, clip_y, clip_h; + if (dy > 0) { + src_y = Y; + dest_y = Y+dy; + src_h = H-dy; + clip_y = Y; + clip_h = dy; + } else { + src_y = Y-dy; + dest_y = Y; + src_h = H+dy; + clip_y = Y+src_h; + clip_h = H-src_h; + } +#ifdef WIN32 + typedef int (WINAPI* fl_GetRandomRgn_func)(HDC, HRGN, INT); + static fl_GetRandomRgn_func fl_GetRandomRgn = 0L; + static char first_time = 1; + + // We will have to do some Region magic now, so let's see if the + // required function is available (and it should be staring w/Win95) + if (first_time) { + HMODULE hMod = GetModuleHandle("GDI32.DLL"); + if (hMod) { + fl_GetRandomRgn = (fl_GetRandomRgn_func)GetProcAddress(hMod, "GetRandomRgn"); + } + first_time = 0; + } + + // Now check if the source scrolling area is fully visible. + // If it is, we will do a quick scroll and just update the + // newly exposed area. If it is not, we go the safe route and + // re-render the full area instead. + // Note 1: we could go and find the areas that are actually + // obscured and recursively call fl_scroll for the newly found + // rectangles. However, this practice would rely on the + // elements of the undocumented Rgn structure. + // Note 2: although this method should take care of most + // multi-screen solutions, it will not solve issues scrolling + // from a different resolution screen onto another. + // Note 3: this has been tested with image maps, too. + if (fl_GetRandomRgn) { + // get the DC region minus all overlapping windows + HRGN sys_rgn = CreateRectRgn(0, 0, 0, 0); + fl_GetRandomRgn(fl_gc, sys_rgn, 4); + // now get the source scrolling rectangle + HRGN src_rgn = CreateRectRgn(src_x, src_y, src_x+src_w, src_y+src_h); + POINT offset = { 0, 0 }; + if (GetDCOrgEx(fl_gc, &offset)) { + OffsetRgn(src_rgn, offset.x, offset.y); + } + // see if all source pixels are available in the system region + // Note: we could be a bit more merciful and subtract the + // scroll destination region as well. + HRGN dst_rgn = CreateRectRgn(0, 0, 0, 0); + int r = CombineRgn(dst_rgn, src_rgn, sys_rgn, RGN_DIFF); + DeleteObject(dst_rgn); + DeleteObject(src_rgn); + DeleteObject(sys_rgn); + if (r!=NULLREGION) { + draw_area(data,X,Y,W,H); + return; + } + } + + // Great, we can do an accelerated scroll insteasd of re-rendering + BitBlt(fl_gc, dest_x, dest_y, src_w, src_h, fl_gc, src_x, src_y,SRCCOPY); + +#elif defined(__APPLE_QD__) + Rect src = { src_y, src_x, src_y+src_h, src_x+src_w }; + Rect dst = { dest_y, dest_x, dest_y+src_h, dest_x+src_w }; + static RGBColor bg = { 0xffff, 0xffff, 0xffff }; RGBBackColor( &bg ); + static RGBColor fg = { 0x0000, 0x0000, 0x0000 }; RGBForeColor( &fg ); + CopyBits( GetPortBitMapForCopyBits( GetWindowPort(fl_window) ), + GetPortBitMapForCopyBits( GetWindowPort(fl_window) ), &src, &dst, srcCopy, 0L); +#elif defined(__APPLE_QUARTZ__) + // warning: there does not seem to be an equivalent to this function in Quartz + // ScrollWindowRect is a QuickDraw function and won't work here. + // Since on OS X all windows are fully double buffered, we need not + // worry about offscreen or obscured areas + Rect src = { src_y, src_x, src_y+src_h, src_x+src_w }; + Rect dst = { dest_y, dest_x, dest_y+src_h, dest_x+src_w }; + static RGBColor bg = { 0xffff, 0xffff, 0xffff }; RGBBackColor( &bg ); + static RGBColor fg = { 0x0000, 0x0000, 0x0000 }; RGBForeColor( &fg ); + CopyBits( GetPortBitMapForCopyBits( GetWindowPort(fl_window) ), + GetPortBitMapForCopyBits( GetWindowPort(fl_window) ), &src, &dst, srcCopy, 0L); +#else + XCopyArea(fl_display, fl_window, fl_window, fl_gc, + src_x, src_y, src_w, src_h, dest_x, dest_y); + // we have to sync the display and get the GraphicsExpose events! (sigh) + for (;;) { + XEvent e; XWindowEvent(fl_display, fl_window, ExposureMask, &e); + if (e.type == NoExpose) break; + // otherwise assumme it is a GraphicsExpose event: + draw_area(data, e.xexpose.x, e.xexpose.y, + e.xexpose.width, e.xexpose.height); + if (!e.xgraphicsexpose.count) break; + } +#endif + if (dx) draw_area(data, clip_x, dest_y, clip_w, src_h); + if (dy) draw_area(data, X, clip_y, W, clip_h); +} + +// +// End of "$Id: fl_scroll_area.cxx 5714 2007-02-25 00:00:49Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_set_font.cxx b/third_party/windows/fltk-1.1.10/src/fl_set_font.cxx new file mode 100644 index 0000000..c4f6d8b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_set_font.cxx @@ -0,0 +1,90 @@ +// +// "$Id: fl_set_font.cxx 5420 2006-09-05 11:16:15Z matt $" +// +// Font utilities for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Add a font to the internal table. +// Also see fl_set_fonts.cxx which adds all possible fonts. + +#include +#include +#include +#include "flstring.h" +#include "Fl_Font.H" +#include + +static int table_size; + +void Fl::set_font(Fl_Font fnum, const char* name) { + while (fnum >= table_size) { + int i = table_size; + if (!i) { // don't realloc the built-in table + table_size = 2*FL_FREE_FONT; + i = FL_FREE_FONT; + Fl_Fontdesc* t = (Fl_Fontdesc*)malloc(table_size*sizeof(Fl_Fontdesc)); + memcpy(t, fl_fonts, FL_FREE_FONT*sizeof(Fl_Fontdesc)); + fl_fonts = t; + } else { + table_size = 2*table_size; + fl_fonts=(Fl_Fontdesc*)realloc(fl_fonts, table_size*sizeof(Fl_Fontdesc)); + } + for (; i < table_size; i++) { + fl_fonts[i].fontname[0] = 0; + fl_fonts[i].name = 0; +#if !defined(WIN32) && !defined(__APPLE__) + fl_fonts[i].xlist = 0; + fl_fonts[i].n = 0; +#endif // !WIN32 && !__APPLE__ + } + } + Fl_Fontdesc* s = fl_fonts+fnum; + if (s->name) { + if (!strcmp(s->name, name)) {s->name = name; return;} +#if !defined(WIN32) && !defined(__APPLE__) + if (s->xlist && s->n >= 0) XFreeFontNames(s->xlist); +#endif + for (Fl_FontSize* f = s->first; f;) { + Fl_FontSize* n = f->next; delete f; f = n; + } + s->first = 0; + } + s->name = name; + s->fontname[0] = 0; +#if !defined(WIN32) && !defined(__APPLE__) + s->xlist = 0; +#endif + s->first = 0; + fl_font(-1, 0); +} + +void Fl::set_font(Fl_Font fnum, Fl_Font from) { + Fl::set_font(fnum, get_font(from)); +} + +const char* Fl::get_font(Fl_Font fnum) {return fl_fonts[fnum].name;} + +// +// End of "$Id: fl_set_font.cxx 5420 2006-09-05 11:16:15Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_set_fonts.cxx b/third_party/windows/fltk-1.1.10/src/fl_set_fonts.cxx new file mode 100644 index 0000000..faafec4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_set_fonts.cxx @@ -0,0 +1,46 @@ +// +// "$Id: fl_set_fonts.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// More font utilities for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include "Fl_Font.H" +#include "flstring.h" +#include + +#ifdef WIN32 +# include "fl_set_fonts_win32.cxx" +#elif defined(__APPLE__) +# include "fl_set_fonts_mac.cxx" +#elif USE_XFT +# include "fl_set_fonts_xft.cxx" +#else +# include "fl_set_fonts_x.cxx" +#endif // WIN32 + +// +// End of "$Id: fl_set_fonts.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_set_fonts_mac.cxx b/third_party/windows/fltk-1.1.10/src/fl_set_fonts_mac.cxx new file mode 100644 index 0000000..b4c0246 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_set_fonts_mac.cxx @@ -0,0 +1,213 @@ +// +// "$Id: fl_set_fonts_mac.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// MacOS font utilities for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include + +// This function fills in the fltk font table with all the fonts that +// are found on the X server. It tries to place the fonts into families +// and to sort them so the first 4 in a family are normal, bold, italic, +// and bold italic. + +// Bug: older versions calculated the value for *ap as a side effect of +// making the name, and then forgot about it. To avoid having to change +// the header files I decided to store this value in the last character +// of the font name array. +#define ENDOFBUFFER 127 // sizeof(Fl_Font.fontname)-1 + +// turn a stored font name into a pretty name: +const char* Fl::get_font_name(Fl_Font fnum, int* ap) { +#ifdef __APPLE_QD__ + Fl_Fontdesc *f = fl_fonts + fnum; + if (!f->fontname[0]) { + const char* p = f->name; + if (!p || !*p) {if (ap) *ap = 0; return "";} + int type; + switch (*p) { + case 'B': type = FL_BOLD; break; + case 'I': type = FL_ITALIC; break; + case 'P': type = FL_BOLD | FL_ITALIC; break; + default: type = 0; break; + } + strlcpy(f->fontname, p+1, ENDOFBUFFER); + if (type & FL_BOLD) strlcat(f->fontname, " bold", ENDOFBUFFER); + if (type & FL_ITALIC) strlcat(f->fontname, " italic", ENDOFBUFFER); + f->fontname[ENDOFBUFFER] = (char)type; + } + if (ap) *ap = f->fontname[ENDOFBUFFER]; + return f->fontname; +#elif defined(__APPLE_QUARTZ__) + Fl_Fontdesc *f = fl_fonts + fnum; + if (!f->fontname[0]) { + const char* p = f->name; + if (!p || !*p) {if (ap) *ap = 0; return "";} + strlcpy(f->fontname, p, ENDOFBUFFER); + int type = 0; + if (strstr(f->name, "Bold")) type |= FL_BOLD; + if (strstr(f->name, "Italic")) type |= FL_ITALIC; + f->fontname[ENDOFBUFFER] = (char)type; + } + if (ap) *ap = f->fontname[ENDOFBUFFER]; + return f->fontname; +#endif +} + +static int fl_free_font = FL_FREE_FONT; + +Fl_Font Fl::set_fonts(const char* xstarname) { +#pragma unused ( xstarname ) +#ifdef __APPLE_QD__ + if (fl_free_font != FL_FREE_FONT) + return (Fl_Font)fl_free_font; + static char styleLU[] = " BIP"; + FMFontFamilyInstanceIterator ffiIterator; + FMFontFamilyIterator ffIterator; + FMFontFamily family; + FMFont font; + FMFontStyle style; // bits 0..6: bold, italic underline, outline, shadow, condens, extended (FLTK supports 0 and 1 ) + FMFontSize size; + //FMFilter filter; // do we need to set a specific (or multiple) filter(s) to get ALL fonts? + + Str255 buf; + //filter.format = kFMCurrentFilterFormat; + //filter.selector = kFMGenerationFilterSelector; + //filter.filter.generationFilter = + FMCreateFontFamilyIterator( NULL, NULL, kFMUseGlobalScopeOption, &ffIterator ); + OSStatus listFamilies, listInstances; + for (;;) + { + listFamilies = FMGetNextFontFamily( &ffIterator, &family ); + if ( listFamilies != 0 ) break; + FMGetFontFamilyName( family, buf ); + buf[ buf[0]+1 ] = 0; + //printf( "Font Family: %s\n", buf+1 ); + int i; + for (i=0; iname) s = fl_fonts; // empty slot in table, use entry 0 + int cnt = 0; + +#ifdef __APPLE_QD__ + Str255 name; + int len = strlen( s->name ); + memcpy(((char*)name)+1, s->name+1, len ); + name[0] = len-1; + FMFontFamily family = FMGetFontFamilyFromName( name ); + if ( family == kInvalidFontFamily ) return 0; + + sizep = array; + FMFont font; + FMFontStyle style, fStyle; + switch ( s->name[0] ) { + default : + fStyle=0; + break; + case 'B' : + fStyle=1; + break; + case 'I' : + fStyle=2; + break; + case 'P' : + fStyle=3; + break; + } + FMFontSize size, pSize = -1; + FMFontFamilyInstanceIterator ffiIterator; + FMCreateFontFamilyInstanceIterator( family, &ffiIterator ); + OSStatus listInstances; + for (;;) + { + listInstances = FMGetNextFontFamilyInstance( &ffiIterator, &font, &style, &size ); + if ( listInstances != 0 ) break; + if ( style==fStyle ) + { + if ( size>pSize ) + { + array[ cnt++ ] = size; + pSize = size; + } + } + } + FMDisposeFontFamilyInstanceIterator( &ffiIterator ); +#elif defined(__APPLE_QUARTZ__) + // ATS supports all font size + array[0] = 0; + sizep = array; + cnt = 1; +#endif + + return cnt; +} + +// +// End of "$Id: fl_set_fonts_mac.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_set_fonts_win32.cxx b/third_party/windows/fltk-1.1.10/src/fl_set_fonts_win32.cxx new file mode 100644 index 0000000..923f563 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_set_fonts_win32.cxx @@ -0,0 +1,149 @@ +// +// "$Id: fl_set_fonts_win32.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// WIN32 font utilities for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this7 library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// This function fills in the FLTK font table with all the fonts that +// are found on the X server. It tries to place the fonts into families +// and to sort them so the first 4 in a family are normal, bold, italic, +// and bold italic. + +// Bug: older versions calculated the value for *ap as a side effect of +// making the name, and then forgot about it. To avoid having to change +// the header files I decided to store this value in the last character +// of the font name array. +#define ENDOFBUFFER 127 // sizeof(Fl_Font.fontname)-1 + +// turn a stored font name into a pretty name: +const char* Fl::get_font_name(Fl_Font fnum, int* ap) { + Fl_Fontdesc *f = fl_fonts + fnum; + if (!f->fontname[0]) { + const char* p = f->name; + if (!p || !*p) {if (ap) *ap = 0; return "";} + int type; + switch (*p) { + case 'B': type = FL_BOLD; break; + case 'I': type = FL_ITALIC; break; + case 'P': type = FL_BOLD | FL_ITALIC; break; + default: type = 0; break; + } + strlcpy(f->fontname, p+1, ENDOFBUFFER); + if (type & FL_BOLD) strlcat(f->fontname, " bold", ENDOFBUFFER); + if (type & FL_ITALIC) strlcat(f->fontname, " italic", ENDOFBUFFER); + f->fontname[ENDOFBUFFER] = (char)type; + } + if (ap) *ap = f->fontname[ENDOFBUFFER]; + return f->fontname; +} + +static int fl_free_font = FL_FREE_FONT; + +static int CALLBACK +enumcb(CONST LOGFONT *lpelf, + CONST TEXTMETRIC * /*lpntm*/, + DWORD /*FontType*/, + LPARAM p) { + if (!p && lpelf->lfCharSet != ANSI_CHARSET) return 1; + const char *n = lpelf->lfFaceName; + for (int i=0; ilfWeight <= 400) + buffer[0] = 'B', Fl::set_font((Fl_Font)(fl_free_font++), strdup(buffer)); + buffer[0] = 'I'; Fl::set_font((Fl_Font)(fl_free_font++), strdup(buffer)); + if (lpelf->lfWeight <= 400) + buffer[0] = 'P', Fl::set_font((Fl_Font)(fl_free_font++), strdup(buffer)); + return 1; +} + +Fl_Font Fl::set_fonts(const char* xstarname) { + if (fl_free_font == FL_FREE_FONT) {// if not already been called + if (!fl_gc) fl_GetDC(0); + EnumFontFamilies(fl_gc, NULL, (FONTENUMPROC)enumcb, xstarname != 0); + } + return (Fl_Font)fl_free_font; +} + + +static int nbSize; +static int cyPerInch; +static int sizes[128]; + +static int CALLBACK +EnumSizeCb(CONST LOGFONT * /*lpelf*/, + CONST TEXTMETRIC *lpntm, + DWORD fontType, + LPARAM /*p*/) { + if ((fontType & RASTER_FONTTYPE) == 0) { + sizes[0] = 0; + nbSize = 1; + + // Scalable font + return 0; + } + + int add = lpntm->tmHeight - lpntm->tmInternalLeading; + add = MulDiv(add, 72, cyPerInch); + + int start = 0; + while ((start < nbSize) && (sizes[start] < add)) { + start++; + } + + if ((start < nbSize) && (sizes[start] == add)) { + return 1; + } + + for (int i=nbSize; i>start; i--) sizes[i] = sizes[i - 1]; + + sizes[start] = add; + nbSize++; + + // Stop enum if buffer overflow + return nbSize < 128; +} + + +int +Fl::get_font_sizes(Fl_Font fnum, int*& sizep) { + nbSize = 0; + Fl_Fontdesc *s = fl_fonts+fnum; + if (!s->name) s = fl_fonts; // empty slot in table, use entry 0 + + if (!fl_gc) fl_GetDC(0); + cyPerInch = GetDeviceCaps(fl_gc, LOGPIXELSY); + if (cyPerInch < 1) cyPerInch = 1; + EnumFontFamilies(fl_gc, s->name+1, (FONTENUMPROC)EnumSizeCb, 0); + + sizep = sizes; + return nbSize; +} + + +// +// End of "$Id: fl_set_fonts_win32.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_set_fonts_x.cxx b/third_party/windows/fltk-1.1.10/src/fl_set_fonts_x.cxx new file mode 100644 index 0000000..ca8709a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_set_fonts_x.cxx @@ -0,0 +1,350 @@ +// +// "$Id: fl_set_fonts_x.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// X11 font utilities for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// This function fills in the fltk font table with all the fonts that +// are found on the X server. It tries to place the fonts into families +// and to sort them so the first 4 in a family are normal, bold, italic, +// and bold italic. + +// Standard X fonts are matched by a pattern that is always of +// this form, and this pattern is put in the table: +// "-*-family-weight-slant-width1-style-*-registry-encoding" + +// Non-standard font names (those not starting with '-') are matched +// by a pattern of the form "prefix*suffix", where the '*' is where +// fltk thinks the point size is, or by the actual font name if no +// point size is found. + +// Fltk knows how to pull an "attribute" out of a font name, such as +// bold or italic, by matching known x font field values. All words +// that don't match a known attribute are combined into the "name" +// of the font. Names are compared before attributes for sorting, this +// makes the bold and plain version of a font come out next to each +// other despite the poor X font naming scheme. + +// By default fl_set_fonts() only does iso8859-1 encoded fonts. You can +// do all normal X fonts by passing "-*" or every possible font with "*". + +// Fl::set_font will take strings other than the ones this stores +// and can identify any font on X that way. You may want to write your +// own system of font management and not use this code. + +// turn word N of a X font name into either some attribute bits +// (right now 0, FL_BOLD, or FL_ITALIC), or into -1 indicating that +// the word should be put into the name: + +static int attribute(int n, const char *p) { + // don't put blank things into name: + if (!*p || *p=='-' || *p=='*') return 0; + if (n == 3) { // weight + if (!strncmp(p,"normal",6) || + !strncmp(p,"light",5) || + !strncmp(p,"medium",6) || + !strncmp(p,"book",4)) return 0; + if (!strncmp(p,"bold",4) || !strncmp(p,"demi",4)) return FL_BOLD; + } else if (n == 4) { // slant + if (*p == 'r') return 0; + if (*p == 'i' || *p == 'o') return FL_ITALIC; + } else if (n == 5) { // sWidth + if (!strncmp(p,"normal",6)) return 0; + } + return -1; +} + +// return non-zero if the registry-encoding should be used: +extern const char* fl_encoding; +static int use_registry(const char *p) { + return *p && *p!='*' && strcmp(p,fl_encoding); +} + +// Bug: older versions calculated the value for *ap as a side effect of +// making the name, and then forgot about it. To avoid having to change +// the header files I decided to store this value in the last character +// of the font name array. +#define ENDOFBUFFER 127 // sizeof(Fl_Font.fontname)-1 + +// turn a stored (with *'s) X font name into a pretty name: +const char* Fl::get_font_name(Fl_Font fnum, int* ap) { + Fl_Fontdesc *f = fl_fonts + fnum; + if (!f->fontname[0]) { + int type = 0; + const char* p = f->name; + if (!p) { + if (ap) *ap = 0; + return ""; + } + char *o = f->fontname; + + if (*p != '-') { // non-standard font, just replace * with spaces: + if (strstr(p,"bold")) type = FL_BOLD; + if (strstr(p,"ital")) type |= FL_ITALIC; + for (;*p; p++) { + if (*p == '*' || *p == ' ' || *p == '-') { + do p++; while (*p == '*' || *p == ' ' || *p == '-'); + if (!*p) break; + if (o < (f->fontname + ENDOFBUFFER - 1)) *o++ = ' '; + } + if (o < (f->fontname + ENDOFBUFFER - 1)) *o++ = *p; + } + *o = 0; + + } else { // standard dash-seperated font: + + // get the family: + const char *x = fl_font_word(p,2); if (*x) x++; if (*x=='*') x++; + if (!*x) { + if (ap) *ap = 0; + return p; + } + const char *e = fl_font_word(x,1); + if ((e - x) < (int)(ENDOFBUFFER - 1)) { + // MRS: we want strncpy here, not strlcpy... + strncpy(o,x,e-x); + o += e-x; + } else { + strlcpy(f->fontname, x, ENDOFBUFFER); + o = f->fontname+ENDOFBUFFER-1; + } + + // collect all the attribute words: + for (int n = 3; n <= 6; n++) { + // get the next word: + if (*e) e++; x = e; e = fl_font_word(x,1); + int t = attribute(n,x); + if (t < 0) { + if (o < (f->fontname + ENDOFBUFFER - 1)) *o++ = ' '; + if ((e - x) < (int)(ENDOFBUFFER - (o - f->fontname) - 1)) { + // MRS: we want strncpy here, not strlcpy... + strncpy(o,x,e-x); + o += e-x; + } else { + strlcpy(o,x, ENDOFBUFFER - (o - f->fontname) - 1); + o = f->fontname+ENDOFBUFFER-1; + } + } else type |= t; + } + + // skip over the '*' for the size and get the registry-encoding: + x = fl_font_word(e,2); + if (*x) {x++; *o++ = '('; while (*x) *o++ = *x++; *o++ = ')';} + + *o = 0; + if (type & FL_BOLD) strlcat(f->fontname, " bold", ENDOFBUFFER); + if (type & FL_ITALIC) strlcat(f->fontname, " italic", ENDOFBUFFER); + } + f->fontname[ENDOFBUFFER] = (char)type; + } + if (ap) *ap = f->fontname[ENDOFBUFFER]; + return f->fontname; +} + +extern "C" { +// sort raw (non-'*') X font names into perfect order: + +static int ultrasort(const void *aa, const void *bb) { + const char *a = *(char **)aa; + const char *b = *(char **)bb; + + // sort all non x-fonts at the end: + if (*a != '-') { + if (*b == '-') return 1; + // 2 non-x fonts are matched by "numeric sort" + int ret = 0; + for (;;) { + if (isdigit(*a) && isdigit(*b)) { + int na = strtol(a, (char **)&a, 10); + int nb = strtol(b, (char **)&b, 10); + if (!ret) ret = na-nb; + } else if (*a != *b) { + return (*a-*b); + } else if (!*a) { + return ret; + } else { + a++; b++; + } + } + } else { + if (*b != '-') return -1; + } + + // skip the foundry (assumme equal): + for (a++; *a && *a++!='-';); + for (b++; *b && *b++!='-';); + + // compare the family and all the attribute words: + int atype = 0; + int btype = 0; + for (int n = 2; n <= 6; n++) { + int at = attribute(n,a); + int bt = attribute(n,b); + if (at < 0) { + if (bt >= 0) return 1; + for (;;) {if (*a!=*b) return *a-*b; b++; if (!*a || *a++=='-') break;} + } else { + if (bt < 0) return -1; + a = fl_font_word(a,1); if (*a) a++; + b = fl_font_word(b,1); if (*b) b++; + atype |= at; btype |= bt; + } + } + + // remember the pixel size: + int asize = atoi(a); + int bsize = atoi(b); + + // compare the registry/encoding: + a = fl_font_word(a,6); if (*a) a++; + b = fl_font_word(b,6); if (*b) b++; + if (use_registry(a)) { + if (!use_registry(b)) return 1; + int r = strcmp(a,b); if (r) return r; + } else { + if (use_registry(b)) return -1; + } + + if (atype != btype) return atype-btype; + if (asize != bsize) return asize-bsize; + + // something wrong, just do a string compare... + return strcmp(*(char**)aa, *(char**)bb); +} +} + +// converts a X font name to a standard starname, returns point size: +static int to_canonical(char *to, const char *from, size_t tolen) { + char* c = fl_find_fontsize((char*)from); + if (!c) return -1; // no point size found... + const char* endptr; + int size = strtol(c,(char**)&endptr,10); + if (from[0] == '-') { + // replace the "foundry" with -*-: + *to++ = '-'; *to++ = '*'; + for (from++; *from && *from != '-'; from++); + // skip to the registry-encoding: + endptr = (char*)fl_font_word(endptr,6); + if (*endptr && !use_registry(endptr+1)) endptr = ""; + } + int n = c-from; + // MRS: we want strncpy here, not strlcpy... + if (n > (int)(tolen - 1)) return -1; + strncpy(to,from,n); + to[n++] = '*'; + strlcpy(to+n,endptr, tolen - n); + return size; +} + +static int fl_free_font = FL_FREE_FONT; + +Fl_Font Fl::set_fonts(const char* xstarname) { + if (fl_free_font > FL_FREE_FONT) // already been here + return (Fl_Font)fl_free_font; + fl_open_display(); + int xlistsize; + char buf[20]; + if (!xstarname) { + strcpy(buf,"-*-"); strcpy(buf+3,fl_encoding); + xstarname = buf; + } + char **xlist = XListFonts(fl_display, xstarname, 10000, &xlistsize); + if (!xlist) return (Fl_Font)fl_free_font; + qsort(xlist, xlistsize, sizeof(*xlist), ultrasort); + int used_xlist = 0; + for (int i=0; i= 0) { + for (;;) { // find all matching fonts: + if (i >= xlistsize) break; + const char *q = xlist[i]; + char this_canon[1024]; + if (to_canonical(this_canon, q, sizeof(this_canon)) < 0) break; + if (strcmp(canon, this_canon)) break; + i++; + } + /*if (*p=='-' || i > first_xlist+1)*/ p = canon; + } + int j; + for (j = 0;; j++) { + if (j < FL_FREE_FONT) { + // see if it is one of our built-in fonts: + // if so, set the list of x fonts, since we have it anyway + if (fl_fonts[j].name && !strcmp(fl_fonts[j].name, p)) break; + } else { + j = fl_free_font++; + if (p == canon) p = strdup(p); else used_xlist = 1; + Fl::set_font((Fl_Font)j, p); + break; + } + } + if (!fl_fonts[j].xlist) { + fl_fonts[j].xlist = xlist+first_xlist; + fl_fonts[j].n = -(i-first_xlist); + used_xlist = 1; + } + } + if (!used_xlist) XFreeFontNames(xlist); + return (Fl_Font)fl_free_font; +} + +int Fl::get_font_sizes(Fl_Font fnum, int*& sizep) { + Fl_Fontdesc *s = fl_fonts+fnum; + if (!s->name) s = fl_fonts; // empty slot in table, use entry 0 + if (!s->xlist) { + fl_open_display(); + s->xlist = XListFonts(fl_display, s->name, 100, &(s->n)); + if (!s->xlist) return 0; + } + int listsize = s->n; if (listsize<0) listsize = -listsize; + static int sizes[128]; + int numsizes = 0; + for (int i = 0; i < listsize; i++) { + char *q = s->xlist[i]; + char *d = fl_find_fontsize(q); + if (!d) continue; + int s = strtol(d,0,10); + if (!numsizes || sizes[numsizes-1] < s) { + sizes[numsizes++] = s; + } else { + // insert-sort the new size into list: + int n; + for (n = numsizes-1; n > 0; n--) if (sizes[n-1] < s) break; + if (sizes[n] != s) { + for (int m = numsizes; m > n; m--) sizes[m] = sizes[m-1]; + sizes[n] = s; + numsizes++; + } + } + } + sizep = sizes; + return numsizes; +} + +// +// End of "$Id: fl_set_fonts_x.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_set_fonts_xft.cxx b/third_party/windows/fltk-1.1.10/src/fl_set_fonts_xft.cxx new file mode 100644 index 0000000..5192fda --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_set_fonts_xft.cxx @@ -0,0 +1,366 @@ +// +// "$Id: fl_set_fonts_xft.cxx 6832 2009-07-23 22:36:04Z AlbrechtS $" +// +// More font utilities for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include + +// This function fills in the fltk font table with all the fonts that +// are found on the X server. It tries to place the fonts into families +// and to sort them so the first 4 in a family are normal, bold, italic, +// and bold italic. + +// Bug: older versions calculated the value for *ap as a side effect of +// making the name, and then forgot about it. To avoid having to change +// the header files I decided to store this value in the last character +// of the font name array. +#define ENDOFBUFFER 127 // sizeof(Fl_Font.fontname)-1 + +// turn a stored font name into a pretty name: +const char* Fl::get_font_name(Fl_Font fnum, int* ap) { + Fl_Fontdesc *f = fl_fonts + fnum; + if (!f->fontname[0]) { + const char* p = f->name; + int type; + switch (p[0]) { + case 'B': type = FL_BOLD; break; + case 'I': type = FL_ITALIC; break; + case 'P': type = FL_BOLD | FL_ITALIC; break; + default: type = 0; break; + } + + // NOTE: This can cause duplications in fonts that already have Bold or Italic in + // their "name". Maybe we need to find a cleverer way? + strlcpy(f->fontname, p+1, ENDOFBUFFER); + if (type & FL_BOLD) strlcat(f->fontname, " bold", ENDOFBUFFER); + if (type & FL_ITALIC) strlcat(f->fontname, " italic", ENDOFBUFFER); + f->fontname[ENDOFBUFFER] = (char)type; + } + if (ap) *ap = f->fontname[ENDOFBUFFER]; + return f->fontname; +} + +/////////////////////////////////////////////////////////// +#define LOCAL_RAW_NAME_MAX 256 + +extern "C" { +// sort returned fontconfig font names +static int name_sort(const void *aa, const void *bb) { + // What should we do here? Just do a string compare for now... + // NOTE: This yeilds some oddities - in particular a Blah Bold font will be + // listed before Blah... + // Also - the fontconfig listing returns some faces that are effectively duplicates + // as far as fltk is concerned, e.g. where there are ko or ja variants that we + // can't distinguish (since we are not yet fully UTF-*) - should we strip them here? + return strcasecmp(*(char**)aa, *(char**)bb); +} // end of name_sort +} // end of extern C section + + +// Read the "pretty" name we have derived from fontconfig then convert +// it into the format fltk uses internally for Xft names... +// This is just a mess - I should have tokenised the strings and gone from there, +// but I really thought this would be easier! +static void make_raw_name(char *raw, char *pretty) +{ + // Input name will be "Some Name:style = Bold Italic" or whatever + // The plan is this: + // - the first char in the "raw" name becomes either I, B, P or " " for + // italic, bold, bold italic or normal - this seems to be the fltk way... + + char *style = strchr(pretty, ':'); + char *last = style + strlen(style) - 2; + + if (style) + { + *style = 0; // Terminate "name" string + style ++; // point to start of style section + } + raw[0] = ' '; raw[1] = 0; // Default start of "raw name" text + strncat(raw, pretty, LOCAL_RAW_NAME_MAX); + // At this point, the name is "marked" as regular... + if (style) + { +#define PLAIN 0 +#define BOLD 1 +#define ITALIC 2 +#define BITALIC (BOLD | ITALIC) + int mods = PLAIN; + // Now try and parse the style string - look for the "=" sign + style = strchr(style, '='); + while ((style) && (style < last)) + { + int type; + while ((*style == '=') || (*style == ' ') || (*style == '\t')) + { + style++; // Start of Style string + if ((style >= last) || (*style == 0)) continue; + } + type = toupper(style[0]); + switch (type) + { + // Things we might see: Regular Normal Bold Italic Oblique (??what??) Medium + // Roman Light Demi Sans SemiCondensed SuperBold Book... etc... + // Things we actually care about: Bold Italic Oblique SuperBold - Others??? + case 'I': + if (strncasecmp(style, "Italic", 6) == 0) + { + mods |= ITALIC; + } + goto NEXT_STYLE; + + case 'B': + if (strncasecmp(style, "Bold", 4) == 0) + { + mods |= BOLD; + } + goto NEXT_STYLE; + + case 'O': + if (strncasecmp(style, "Oblique", 7) == 0) + { + mods |= ITALIC; + } + goto NEXT_STYLE; + + case 's': + if (strncasecmp(style, "SuperBold", 9) == 0) + { + mods |= BOLD; + } + goto NEXT_STYLE; + + default: // find the next gap + goto NEXT_STYLE; + } // switch end +NEXT_STYLE: + while ((*style != ' ') && (*style != '\t')) + { + style++; + if ((style >= last) || (*style == 0)) goto STYLE_DONE; + } + } +STYLE_DONE: + // Set the "modifier" character in the raw string + switch(mods) + { + case BOLD: raw[0] = 'B'; + break; + case ITALIC: raw[0] = 'I'; + break; + case BITALIC: raw[0] = 'P'; + break; + default: raw[0] = ' '; + break; + } + } +} // make_raw_name + +/////////////////////////////////////////////////////////// + +static int fl_free_font = FL_FREE_FONT; + +// Uses the fontconfig lib to construct a list of all installed fonts. +// I tried using XftListFonts for this, but the API is tricky - and when +// I looked at the XftList* code, it calls the Fc* functions anyway, so... +// +// Also, for now I'm ignoring the "pattern_name" and just getting everything... +// AND I don't try and skip the fonts we've already loaded in the defaults. +// Blimey! What a hack! +Fl_Font Fl::set_fonts(const char* pattern_name) +{ + FcFontSet *fnt_set; // Will hold the list of fonts we find + FcPattern *fnt_pattern; // Holds the generic "match all names" pattern + FcObjectSet *fnt_obj_set = 0; // Holds the generic "match all objects" + + int j; // loop iterator variable + int font_count; // Total number of fonts found to process + char **full_list; // The list of font names we build + + if (fl_free_font > FL_FREE_FONT) // already been here + return (Fl_Font)fl_free_font; + + fl_open_display(); // Just in case... + + // Make sure fontconfig is ready... is this necessary? The docs say it is + // safe to call it multiple times, so just go for it anyway! + if (!FcInit()) + { + // What to do? Just return defaults... + return FL_FREE_FONT; + } + + // Create a search pattern that will match every font name - I think this + // does the Right Thing, but am not certain... + // + // This could possibly be "enhanced" to pay attention to the requested + // "pattern_name"? + fnt_pattern = FcPatternCreate(); + fnt_obj_set = FcObjectSetBuild(FC_FAMILY, FC_STYLE, (void *)0); + + // Hopefully, this is a set of all the fonts... + fnt_set = FcFontList(0, fnt_pattern, fnt_obj_set); + + // We don't need the fnt_pattern any more, release it + FcPatternDestroy(fnt_pattern); + + // Now, if we got any fonts, iterate through them... + if (fnt_set) + { + char *stop; + char *start; + char *first; + + font_count = fnt_set->nfont; // How many fonts? + + // Allocate array of char*'s to hold the name strings + full_list = (char **)malloc(sizeof(char *) * font_count); + + // iterate through all the font patterns and get the names out... + for (j = 0; j < font_count; j++) + { + // NOTE: FcChar8 is a typedef of "unsigned char"... + FcChar8 *font; // String to hold the font's name + + // Convert from fontconfig internal pattern to human readable name + // NOTE: This WILL malloc storage, so we need to free it later... + font = FcNameUnparse(fnt_set->fonts[j]); + + // The returned strings look like this... + // Century Schoolbook:style=Bold Italic,fed kursiv,Fett Kursiv,... + // So the bit we want is up to the first comma - BUT some strings have + // more than one name, separated by, guess what?, a comma... + stop = start = first = 0; + stop = strchr((char *)font, ','); + start = strchr((char *)font, ':'); + if ((stop) && (start) && (stop < start)) + { + first = stop + 1; // discard first version of name + // find first comma *after* the end of the name + stop = strchr((char *)start, ','); + } + else + { + first = (char *)font; // name is just what was returned + } + // Truncate the name after the (english) modifiers description + if (stop) + { + *stop = 0; // Terminate the string at the first comma, if there is one + } + + // Copy the font description into our list + if (first == (char *)font) + { // The listed name is still OK + full_list[j] = (char *)font; + } + else + { // The listed name has been modified + full_list[j] = strdup(first); + // Free the font name storage + free (font); + } + // replace "style=Regular" so strcmp sorts it first + if (start) { + char *reg = strstr(full_list[j], "=Regular"); + if (reg) reg[1]='.'; + } + } + + // Release the fnt_set - we don't need it any more + FcFontSetDestroy(fnt_set); + + // Sort the list into alphabetic order + qsort(full_list, font_count, sizeof(*full_list), name_sort); + + // Now let us add the names we got to fltk's font list... + for (j = 0; j < font_count; j++) + { + if (full_list[j]) + { + char xft_name[LOCAL_RAW_NAME_MAX]; + char *stored_name; + // Parse the strings into FLTK-XFT style.. + make_raw_name(xft_name, full_list[j]); + // NOTE: This just adds on AFTER the default fonts - no attempt is made + // to identify already loaded fonts. Is this bad? + stored_name = strdup(xft_name); + Fl::set_font((Fl_Font)(j + FL_FREE_FONT), stored_name); + fl_free_font ++; + + free(full_list[j]); // release that name from our internal array + } + } + // Now we are done with the list, release it fully + free(full_list); + } + return (Fl_Font)fl_free_font; +} // ::set_fonts +//////////////////////////////////////////////////////////////// + + +extern "C" { +static int int_sort(const void *aa, const void *bb) { + return (*(int*)aa)-(*(int*)bb); +} +} + +//////////////////////////////////////////////////////////////// + +// Return all the point sizes supported by this font: +// Suprisingly enough Xft works exactly like fltk does and returns +// the same list. Except there is no way to tell if the font is scalable. +int Fl::get_font_sizes(Fl_Font fnum, int*& sizep) { + Fl_Fontdesc *s = fl_fonts+fnum; + if (!s->name) s = fl_fonts; // empty slot in table, use entry 0 + + fl_open_display(); + XftFontSet* fs = XftListFonts(fl_display, fl_screen, + XFT_FAMILY, XftTypeString, s->name+1, + (void *)0, + XFT_PIXEL_SIZE, + (void *)0); + static int* array = 0; + static int array_size = 0; + if (fs->nfont >= array_size) { + delete[] array; + array = new int[array_size = fs->nfont+1]; + } + array[0] = 0; int j = 1; // claim all fonts are scalable + for (int i = 0; i < fs->nfont; i++) { + double v; + if (XftPatternGetDouble(fs->fonts[i], XFT_PIXEL_SIZE, 0, &v) == XftResultMatch) { + array[j++] = int(v); + } + } + qsort(array+1, j-1, sizeof(int), int_sort); + XftFontSetDestroy(fs); + sizep = array; + return j; +} + +// +// End of "$Id: fl_set_fonts_xft.cxx 6832 2009-07-23 22:36:04Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_shadow_box.cxx b/third_party/windows/fltk-1.1.10/src/fl_shadow_box.cxx new file mode 100644 index 0000000..808b874 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_shadow_box.cxx @@ -0,0 +1,56 @@ +// +// "$Id: fl_shadow_box.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Shadow box drawing routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include + +#define BW 3 + +static void fl_shadow_frame(int x, int y, int w, int h, Fl_Color c) { + fl_color(FL_DARK3); + fl_rectf(x+BW, y+h-BW, w - BW, BW); + fl_rectf(x+w-BW, y+BW, BW, h - BW); + fl_color(c); + fl_rect(x,y,w-BW,h-BW); +} + +static void fl_shadow_box(int x, int y, int w, int h, Fl_Color c) { + fl_color(c); + fl_rectf(x+1,y+1,w-2-BW,h-2-BW); + fl_shadow_frame(x,y,w,h,FL_GRAY0); +} + +extern void fl_internal_boxtype(Fl_Boxtype, Fl_Box_Draw_F*); +Fl_Boxtype fl_define_FL_SHADOW_BOX() { + fl_internal_boxtype(_FL_SHADOW_FRAME, fl_shadow_frame); + fl_internal_boxtype(_FL_SHADOW_BOX, fl_shadow_box); + return _FL_SHADOW_BOX; +} + +// +// End of "$Id: fl_shadow_box.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_shortcut.cxx b/third_party/windows/fltk-1.1.10/src/fl_shortcut.cxx new file mode 100644 index 0000000..221b4bd --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_shortcut.cxx @@ -0,0 +1,243 @@ +// +// "$Id: fl_shortcut.cxx 6803 2009-06-28 22:25:51Z matt $" +// +// Shortcut support routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Code to test and parse fltk shortcut numbers. +// +// A shortcut is a keysym or'd with shift flags. In the simplest +// sense a shortcut is matched if the shift state is exactly as +// given and the key returning that keysym is pressed. +// +// To make it easier to match some things it is more complex: +// +// Only FL_META, FL_ALT, FL_SHIFT, and FL_CTRL must be "off". A +// zero in the other shift flags indicates "dont care". +// +// It also checks against the first character of Fl::event_text(), +// and zero for FL_SHIFT means "don't care". +// This allows punctuation shortcuts like "#" to work (rather than +// calling it "shift+3") + +#include +#include +#include +#include +#include +#include "flstring.h" +#if !defined(WIN32) && !defined(__APPLE__) +#include +#endif + +int Fl::test_shortcut(int shortcut) { + if (!shortcut) return 0; + + int v = shortcut & 0xffff; +#ifdef __APPLE__ + if (v > 32 && v < 0x7f || v >= 0x80 && v <= 0xff) { +#else + // most X11 use MSWindows Latin-1 if set to Western encoding, so 0x80 to 0xa0 are defined + if (v > 32 && v < 0x7f || v >= 0x80 && v <= 0xff) { +#endif + if (isupper(v)) { + shortcut |= FL_SHIFT; + } + } + + int shift = Fl::event_state(); + // see if any required shift flags are off: + if ((shortcut&shift) != (shortcut&0x7fff0000)) return 0; + // record shift flags that are wrong: + int mismatch = (shortcut^shift)&0x7fff0000; + // these three must always be correct: + if (mismatch&(FL_META|FL_ALT|FL_CTRL)) return 0; + + int key = shortcut & 0xffff; + + // if shift is also correct, check for exactly equal keysyms: + if (!(mismatch&(FL_SHIFT)) && key == Fl::event_key()) return 1; + + // try matching ascii, ignore shift: + if (key == event_text()[0]) return 1; + + // kludge so that Ctrl+'_' works (as opposed to Ctrl+'^_'): + if ((shift&FL_CTRL) && key >= 0x3f && key <= 0x5F + && event_text()[0]==(key^0x40)) return 1; + return 0; +} + +#if defined(WIN32) || defined(__APPLE__) // if not X +// This table must be in numeric order by fltk (X) keysym number: +struct Keyname {int key; const char* name;}; +static Keyname table[] = { + {' ', "Space"}, + {FL_BackSpace, "Backspace"}, + {FL_Tab, "Tab"}, + {0xff0b/*XK_Clear*/, "Clear"}, + {FL_Enter, "Enter"}, // X says "Enter" + {FL_Pause, "Pause"}, + {FL_Scroll_Lock, "Scroll_Lock"}, + {FL_Escape, "Escape"}, + {FL_Home, "Home"}, + {FL_Left, "Left"}, + {FL_Up, "Up"}, + {FL_Right, "Right"}, + {FL_Down, "Down"}, + {FL_Page_Up, "Page_Up"}, // X says "Prior" + {FL_Page_Down,"Page_Down"}, // X says "Next" + {FL_End, "End"}, + {FL_Print, "Print"}, + {FL_Insert, "Insert"}, + {FL_Menu, "Menu"}, + {FL_Num_Lock, "Num_Lock"}, + {FL_KP_Enter, "KP_Enter"}, + {FL_Shift_L, "Shift_L"}, + {FL_Shift_R, "Shift_R"}, + {FL_Control_L,"Control_L"}, + {FL_Control_R,"Control_R"}, + {FL_Caps_Lock,"Caps_Lock"}, + {FL_Meta_L, "Meta_L"}, + {FL_Meta_R, "Meta_R"}, + {FL_Alt_L, "Alt_L"}, + {FL_Alt_R, "Alt_R"}, + {FL_Delete, "Delete"} +}; +#endif + +const char * fl_shortcut_label(int shortcut) { + static char buf[20]; + char *p = buf; + if (!shortcut) {*p = 0; return buf;} + // fix upper case shortcuts + int v = shortcut & 0xffff; +#ifdef __APPLE__ + if (v > 32 && v < 0x7f || v >= 0x80 && v <= 0xff) { +#else + if (v > 32 && v < 0x7f || v >= 0xa0 && v <= 0xff) { +#endif + if (isupper(v)) { + shortcut |= FL_SHIFT; + } + } +#ifdef __APPLE__ + // \todo Mac : we might want to change the symbols for Mac users - consider drawing Apple Symbols... . + if (shortcut & FL_SHIFT) {strcpy(p,"Shift+"); p += 6;} //: Mac hollow up arrow + if (shortcut & FL_META) {strcpy(p,"Cmd+"); p += 4;} //: Mac 'Apple' key + if (shortcut & FL_ALT) {strcpy(p,"Option+"); p += 7;} //: Mac 'Alt/Option' or fancy switch symbol + if (shortcut & FL_CTRL) {strcpy(p,"Ctrl+"); p += 5;} //: Mac ctrl key +#else + if (shortcut & FL_META) {strcpy(p,"Meta+"); p += 5;} + if (shortcut & FL_ALT) {strcpy(p,"Alt+"); p += 4;} + if (shortcut & FL_SHIFT) {strcpy(p,"Shift+"); p += 6;} + if (shortcut & FL_CTRL) {strcpy(p,"Ctrl+"); p += 5;} +#endif // __APPLE__ + int key = shortcut & 0xFFFF; +#if defined(WIN32) || defined(__APPLE__) // if not X + if (key >= FL_F && key <= FL_F_Last) { + *p++ = 'F'; + if (key > FL_F+9) *p++ = (key-FL_F)/10+'0'; + *p++ = (key-FL_F)%10 + '0'; + } else { + // binary search the table for a match: + int a = 0; + int b = sizeof(table)/sizeof(*table); + while (a < b) { + int c = (a+b)/2; + if (table[c].key == key) { + if (p > buf) {strcpy(p,table[c].name); return buf;} + return table[c].name; + } + if (table[c].key < key) a = c+1; + else b = c; + } + if (key >= FL_KP && key <= FL_KP_Last) { + // mark keypad keys with KP_ prefix + strcpy(p,"KP_"); p += 3; + *p++ = uchar(key & 127); + } else { + // if none found, use the keystroke as a match: + *p++ = uchar(toupper(key & 255)); + } + } + *p = 0; + return buf; +#else + const char* q; + if (key == FL_Enter || key == '\r') q="Enter"; // don't use Xlib's "Return": + else if (key > 32 && key < 0x100) q = 0; + else q = XKeysymToString(key); + if (!q) {*p++ = uchar(toupper(key & 255)); *p = 0; return buf;} + if (p > buf) {strcpy(p,q); return buf;} else return q; +#endif +} + +// Emulation of XForms named shortcuts +#include +int fl_old_shortcut(const char* s) { + if (!s || !*s) return 0; + int n = 0; + if (*s == '#') {n |= FL_ALT; s++;} + if (*s == '+') {n |= FL_SHIFT; s++;} + if (*s == '^') {n |= FL_CTRL; s++;} + if (*s && s[1]) return n | (int)strtol(s,0,0); // allow 0xf00 to get any key + return n | *s; +} + +// Tests for &x shortcuts in button labels: + +char Fl_Widget::label_shortcut(const char *t) { + if (!t) return 0; + for (;;) { + if (*t==0) return 0; + if (*t=='&') { + char s = t[1]; + if (s==0) return 0; + else if (s=='&') t++; + else return s; + } + t++; + } +} + +int Fl_Widget::test_shortcut(const char *t) { + #ifdef WIN32 + // on MSWindows, users expect shortcuts to work only when the Alt modifier is pressed + if (Fl::event_state(FL_ALT)==0) return 0; + #endif + char c = Fl::event_text()[0]; + if (!c || !t) return 0; + if (c == label_shortcut(t)) + return 1; + return 0; +} + +int Fl_Widget::test_shortcut() { + if (!(flags()&SHORTCUT_LABEL)) return 0; + return test_shortcut(label()); +} + +// +// End of "$Id: fl_shortcut.cxx 6803 2009-06-28 22:25:51Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_show_colormap.cxx b/third_party/windows/fltk-1.1.10/src/fl_show_colormap.cxx new file mode 100644 index 0000000..ea56a67 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_show_colormap.cxx @@ -0,0 +1,162 @@ +// +// "$Id: fl_show_colormap.cxx 6926 2009-11-07 21:01:08Z matt $" +// +// Colormap color selection dialog for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Select a color from the colormap. +// Pretty much unchanged from Forms. + +#include +#include +#include +#include +#include + +#define BOXSIZE 14 +#define BORDER 4 + +class ColorMenu : public Fl_Window { + Fl_Color initial; + Fl_Color which, previous; + int done; + void drawbox(Fl_Color); + void draw(); + int handle(int); +public: + ColorMenu(Fl_Color oldcol); + Fl_Color run(); +}; + +ColorMenu::ColorMenu(Fl_Color oldcol) : + Fl_Window(BOXSIZE*8+1+2*BORDER, BOXSIZE*32+1+2*BORDER) { + clear_border(); + set_modal(); + initial = which = previous = oldcol; + done = 0; +} + +void ColorMenu::drawbox(Fl_Color c) { + if (c < 0 || c > 255) return; + int X = (c%8)*BOXSIZE+BORDER; + int Y = (c/8)*BOXSIZE+BORDER; +#if BORDER_WIDTH < 3 + if (c == which) fl_draw_box(FL_DOWN_BOX, X+1, Y+1, BOXSIZE-1, BOXSIZE-1, c); + else fl_draw_box(FL_BORDER_BOX, X, Y, BOXSIZE+1, BOXSIZE+1, c); +#else + fl_draw_box(c == which ? FL_DOWN_BOX : FL_BORDER_BOX, + X, Y, BOXSIZE+1, BOXSIZE+1, c); +#endif +} + +void ColorMenu::draw() { + if (damage() != FL_DAMAGE_CHILD) { + fl_draw_box(FL_UP_BOX,0,0,w(),h(),color()); + for (int c = 0; c < 256; c++) drawbox((Fl_Color)c); + } else { + drawbox(previous); + drawbox(which); + } + previous = which; +} + +int ColorMenu::handle(int e) { + int c = which; + switch (e) { + case FL_PUSH: + case FL_DRAG: { + int X = (Fl::event_x_root() - x() - BORDER); + if (X >= 0) X = X/BOXSIZE; + int Y = (Fl::event_y_root() - y() - BORDER); + if (Y >= 0) Y = Y/BOXSIZE; + if (X >= 0 && X < 8 && Y >= 0 && Y < 32) + c = 8*Y + X; + else + c = initial; + } break; + case FL_RELEASE: + done = 1; + return 1; + case FL_KEYBOARD: + switch (Fl::event_key()) { + case FL_Up: if (c > 7) c -= 8; break; + case FL_Down: if (c < 256-8) c += 8; break; + case FL_Left: if (c > 0) c--; break; + case FL_Right: if (c < 255) c++; break; + case FL_Escape: which = initial; done = 1; return 1; + case FL_KP_Enter: + case FL_Enter: done = 1; return 1; + default: return 0; + } + break; + default: + return 0; + } + if (c != which) { + which = (Fl_Color)c; damage(FL_DAMAGE_CHILD); + int bx = (c%8)*BOXSIZE+BORDER; + int by = (c/8)*BOXSIZE+BORDER; + int px = x(); + int py = y(); + int scr_x, scr_y, scr_w, scr_h; + Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h); + if (px < scr_x) px = scr_x; + if (px+bx+BOXSIZE+BORDER >= scr_x+scr_w) px = scr_x+scr_w-bx-BOXSIZE-BORDER; + if (py < scr_y) py = scr_y; + if (py+by+BOXSIZE+BORDER >= scr_y+scr_h) py = scr_y+scr_h-by-BOXSIZE-BORDER; + if (px+bx < BORDER) px = BORDER-bx; + if (py+by < BORDER) py = BORDER-by; + position(px,py); + } + return 1; +} + +extern char fl_override_redirect; // hack for menus + +#ifdef _MSC_VER +#pragma optimize("a",off) // needed to get the done check to work +#endif +Fl_Color ColorMenu::run() { + if (which < 0 || which > 255) { + position(Fl::event_x_root()-w()/2, Fl::event_y_root()-y()/2); + } else { + position(Fl::event_x_root()-(initial%8)*BOXSIZE-BOXSIZE/2-BORDER, + Fl::event_y_root()-(initial/8)*BOXSIZE-BOXSIZE/2-BORDER); + } + show(); + Fl::grab(*this); + done = 0; + while (!done) Fl::wait(); + Fl::release(); + return which; +} + +Fl_Color fl_show_colormap(Fl_Color oldcol) { + ColorMenu m(oldcol); + return m.run(); +} + +// +// End of "$Id: fl_show_colormap.cxx 6926 2009-11-07 21:01:08Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_symbols.cxx b/third_party/windows/fltk-1.1.10/src/fl_symbols.cxx new file mode 100644 index 0000000..75abcdc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_symbols.cxx @@ -0,0 +1,700 @@ +// +// "$Id: fl_symbols.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Symbol drawing code for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// These are small graphics drawn by the normal label-drawing +// code when the string starts with an '@' sign. + +// Adapted from original code written by: + +// Written by Mark Overmars +// Version 2.1 a +// Date: Oct 2, 1992 + +#include +#include +#include +#include "flstring.h" + +typedef struct { + const char *name; + void (*drawit)(Fl_Color); + char scalable; + char notempty; +} SYMBOL; + +#define MAXSYMBOL 211 + /* Maximal number of symbols in table. Only half of them are + used. Should be prime. */ + +static SYMBOL symbols[MAXSYMBOL]; /* The symbols */ +static int symbnumb = -1; /* Their number */ + +static int find(const char *name) { +// returns hash entry if it exists, or first empty slot: + int pos = name[0] ? ( + name[1] ? ( + name[2] ? 71*name[0]+31*name[1]+name[2] : 31*name[0]+name[1] + ) : + name[0] + ) : 0; + pos %= MAXSYMBOL; + int hh2 = name[0] ? ( + (name[1]) ? 51*name[0]+3*name[1] : 3*name[0] + ) : 1; + hh2 %= MAXSYMBOL; if (!hh2) hh2 = 1; + for (;;) { + if (!symbols[pos].notempty) return pos; + if (!strcmp(symbols[pos].name,name)) return pos; + pos = (pos + hh2) % MAXSYMBOL; + } +} + +static void fl_init_symbols(void); + +/**************** The routines seen by the user *************************/ + +int fl_add_symbol(const char *name, void (*drawit)(Fl_Color), int scalable) +/* Adds a symbol to the system. Returns whether correct. */ +{ + fl_init_symbols(); + int pos; + if (symbnumb > MAXSYMBOL / 2) return 0; // table is full + pos = find(name); + symbols[pos].name = name; + symbols[pos].drawit = drawit; + symbols[pos].notempty = 1; + symbols[pos].scalable = scalable; + symbnumb++; + return 1; +} + +int fl_return_arrow(int x,int y,int w,int h); + +// provided for back compatability: +int fl_draw_symbol(const char *label,int x,int y,int w,int h,Fl_Color col) { + const char *p = label; + if (*p++ != '@') return 0; + fl_init_symbols(); + int equalscale = 0; + if (*p == '#') {equalscale = 1; p++;} + if (*p == '-' && p[1]>='1' && p[1]<='9') { + int n = p[1]-'0'; + x += n; y += n; w -= 2*n; h -= 2*n; + p += 2; + } else if (*p == '+' && p[1]>='1' && p[1]<='9') { + int n = p[1]-'0'; + x -= n; y -= n; w += 2*n; h += 2*n; + p += 2; + } + if (w < 10) {x -= (10-w)/2; w = 10;} + if (h < 10) {y -= (10-h)/2; h = 10;} + w = (w-1)|1; h = (h-1)|1; + char flip_x = 0, flip_y = 0; + if (*p=='$') { + flip_x = 1; + p++; + } + if (*p=='%') { + flip_y = 1; + p++; + } + int rotangle; + switch (*p++) { + case '0': + rotangle = 1000*(p[1]-'0') + 100*(p[2]-'0') + 10*(p[3]-'0'); + p += 4; + break; + case '1': rotangle = 2250; break; + case '2': rotangle = 2700; break; + case '3': rotangle = 3150; break; + case '4': rotangle = 1800; break; + case '5': + case '6': rotangle = 0; break; + case '7': rotangle = 1350; break; + case '8': rotangle = 900; break; + case '9': rotangle = 450; break; + default: rotangle = 0; p--; break; + } + int pos = find(p); + if (!symbols[pos].notempty) return 0; + if (symbols[pos].scalable == 3) { // kludge to detect return arrow + fl_return_arrow(x,y,w,h); + return 1; + } + fl_push_matrix(); + fl_translate(x+w/2,y+h/2); + if (symbols[pos].scalable) { + if (equalscale) {if (w0; i--, a-=da, r-=dr1) { + double ar = a/180.0 * M_PI; + vv(cos(ar)*r, sin(ar)*r); + } + for (i=27; i>=0; a+=da, i--, r-=dr2) { + double ar = a/180.0 * M_PI; + vv(cos(ar)*r, sin(ar)*r); + } + if (j&1) { + EC; + } else { + ECP; + } + } +} + +static void draw_refresh(Fl_Color c) { + draw_round_arrow(c); + fl_rotate(180.0); + draw_round_arrow(c); + fl_rotate(-180.0); +} + +static void draw_reload(Fl_Color c) { + fl_rotate(-135.0); + draw_round_arrow(c, 10); + fl_rotate(135.0); +} + +static void draw_undo(Fl_Color c) { + fl_translate(0.0, 0.2); + fl_scale(1.0, -1.0); + draw_round_arrow(c, 6); + fl_scale(1.0, -1.0); + fl_translate(0.0, -0.2); +} + +static void draw_redo(Fl_Color c) { + fl_scale(-1.0, 1.0); + draw_undo(c); + fl_scale(-1.0, 1.0); +} + +static void fl_init_symbols(void) { + static char beenhere; + if (beenhere) return; + beenhere = 1; + symbnumb = 0; + + fl_add_symbol("", draw_arrow1, 1); + fl_add_symbol("->", draw_arrow1, 1); + fl_add_symbol(">", draw_arrow2, 1); + fl_add_symbol(">>", draw_arrow3, 1); + fl_add_symbol(">|", draw_arrowbar, 1); + fl_add_symbol(">[]", draw_arrowbox, 1); + fl_add_symbol("|>", draw_bararrow, 1); + fl_add_symbol("<-", draw_arrow01, 1); + fl_add_symbol("<", draw_arrow02, 1); + fl_add_symbol("<<", draw_arrow03, 1); + fl_add_symbol("|<", draw_0arrowbar, 1); + fl_add_symbol("[]<", draw_0arrowbox, 1); + fl_add_symbol("<|", draw_0bararrow, 1); + fl_add_symbol("<->", draw_doublearrow, 1); + fl_add_symbol("-->", draw_arrow, 1); + fl_add_symbol("+", draw_plus, 1); + fl_add_symbol("->|", draw_arrow1bar, 1); + fl_add_symbol("arrow", draw_arrow, 1); + fl_add_symbol("returnarrow", 0, 3); + fl_add_symbol("square", draw_square, 1); + fl_add_symbol("circle", draw_circle, 1); + fl_add_symbol("line", draw_line, 1); + fl_add_symbol("plus", draw_plus, 1); + fl_add_symbol("menu", draw_menu, 1); + fl_add_symbol("UpArrow", draw_uparrow, 1); + fl_add_symbol("DnArrow", draw_downarrow, 1); + fl_add_symbol("||", draw_doublebar, 1); + fl_add_symbol("search", draw_search, 1); + fl_add_symbol("FLTK", draw_fltk, 1); + + fl_add_symbol("filenew", draw_filenew, 1); + fl_add_symbol("fileopen", draw_fileopen, 1); + fl_add_symbol("filesave", draw_filesave, 1); + fl_add_symbol("filesaveas", draw_filesaveas, 1); + fl_add_symbol("fileprint", draw_fileprint, 1); + + fl_add_symbol("refresh", draw_refresh, 1); + fl_add_symbol("reload", draw_reload, 1); + fl_add_symbol("undo", draw_undo, 1); + fl_add_symbol("redo", draw_redo, 1); + +// fl_add_symbol("file", draw_file, 1); +} + +// +// End of "$Id: fl_symbols.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/fl_vertex.cxx b/third_party/windows/fltk-1.1.10/src/fl_vertex.cxx new file mode 100644 index 0000000..9ced185 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/fl_vertex.cxx @@ -0,0 +1,325 @@ +// +// "$Id: fl_vertex.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Portable drawing routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Portable drawing code for drawing arbitrary shapes with +// simple 2D transformations. See also fl_arc.cxx + +// matt: the Quartz implementation purposly doesn't use the Quartz matrix +// operations for reasons of compatibility and maintainability + +#include +#include +#include +#include +#include +#include + +struct matrix {double a, b, c, d, x, y;}; + +static matrix m = {1, 0, 0, 1, 0, 0}; + +static matrix stack[32]; +static int sptr = 0; + +void fl_push_matrix() { + if (sptr==32) + Fl::error("fl_push_matrix(): matrix stack overflow."); + else + stack[sptr++] = m; +} + +void fl_pop_matrix() { + if (sptr==0) + Fl::error("fl_pop_matrix(): matrix stack underflow."); + else + m = stack[--sptr]; +} + +void fl_mult_matrix(double a, double b, double c, double d, double x, double y) { + matrix o; + o.a = a*m.a + b*m.c; + o.b = a*m.b + b*m.d; + o.c = c*m.a + d*m.c; + o.d = c*m.b + d*m.d; + o.x = x*m.a + y*m.c + m.x; + o.y = x*m.b + y*m.d + m.y; + m = o; +} + +void fl_scale(double x,double y) {fl_mult_matrix(x,0,0,y,0,0);} + +void fl_scale(double x) {fl_mult_matrix(x,0,0,x,0,0);} + +void fl_translate(double x,double y) {fl_mult_matrix(1,0,0,1,x,y);} + +void fl_rotate(double d) { + if (d) { + double s, c; + if (d == 0) {s = 0; c = 1;} + else if (d == 90) {s = 1; c = 0;} + else if (d == 180) {s = 0; c = -1;} + else if (d == 270 || d == -90) {s = -1; c = 0;} + else {s = sin(d*M_PI/180); c = cos(d*M_PI/180);} + fl_mult_matrix(c,-s,s,c,0,0); + } +} + +// typedef what the x,y fields in a point are: +#ifdef WIN32 +typedef int COORD_T; +# define XPOINT XPoint +#elif defined(__APPLE_QUARTZ__) +typedef float COORD_T; +typedef struct { float x; float y; } QPoint; +# define XPOINT QPoint +extern float fl_quartz_line_width_; +#else +typedef short COORD_T; +# define XPOINT XPoint +#endif + +static XPOINT *p = (XPOINT *)0; + +static int p_size; +static int n; +static int what; +enum {LINE, LOOP, POLYGON, POINT_}; + +void fl_begin_points() {n = 0; what = POINT_;} + +void fl_begin_line() {n = 0; what = LINE;} + +void fl_begin_loop() {n = 0; what = LOOP;} + +void fl_begin_polygon() {n = 0; what = POLYGON;} + +double fl_transform_x(double x, double y) {return x*m.a + y*m.c + m.x;} + +double fl_transform_y(double x, double y) {return x*m.b + y*m.d + m.y;} + +double fl_transform_dx(double x, double y) {return x*m.a + y*m.c;} + +double fl_transform_dy(double x, double y) {return x*m.b + y*m.d;} + +static void fl_transformed_vertex(COORD_T x, COORD_T y) { + if (!n || x != p[n-1].x || y != p[n-1].y) { + if (n >= p_size) { + p_size = p ? 2*p_size : 16; + p = (XPOINT*)realloc((void*)p, p_size*sizeof(*p)); + } + p[n].x = x; + p[n].y = y; + n++; + } +} + +void fl_transformed_vertex(double xf, double yf) { +#ifdef __APPLE_QUARTZ__ + fl_transformed_vertex(COORD_T(xf), COORD_T(yf)); +#else + fl_transformed_vertex(COORD_T(rint(xf)), COORD_T(rint(yf))); +#endif +} + +void fl_vertex(double x,double y) { + fl_transformed_vertex(x*m.a + y*m.c + m.x, x*m.b + y*m.d + m.y); +} + +void fl_end_points() { +#ifdef WIN32 + for (int i=0; i1) XDrawPoints(fl_display, fl_window, fl_gc, p, n, 0); +#endif +} + +void fl_end_line() { + if (n < 2) { + fl_end_points(); + return; + } +#ifdef WIN32 + if (n>1) Polyline(fl_gc, p, n); +#elif defined(__APPLE_QD__) + if (n<=1) return; + MoveTo(p[0].x, p[0].y); + for (int i=1; i1) XDrawLines(fl_display, fl_window, fl_gc, p, n, 0); +#endif +} + +static void fixloop() { // remove equal points from closed path + while (n>2 && p[n-1].x == p[0].x && p[n-1].y == p[0].y) n--; +} + +void fl_end_loop() { + fixloop(); + if (n>2) fl_transformed_vertex((COORD_T)p[0].x, (COORD_T)p[0].y); + fl_end_line(); +} + +void fl_end_polygon() { + fixloop(); + if (n < 3) { + fl_end_line(); + return; + } +#ifdef WIN32 + if (n>2) { + SelectObject(fl_gc, fl_brush()); + Polygon(fl_gc, p, n); + } +#elif defined(__APPLE_QD__) + if (n<=1) return; + PolyHandle ph = OpenPoly(); + MoveTo(p[0].x, p[0].y); + for (int i=1; i2) XFillPolygon(fl_display, fl_window, fl_gc, p, n, Convex, 0); +#endif +} + +static int gap; +#ifdef WIN32 +static int counts[20]; +static int numcount; +#endif + +void fl_begin_complex_polygon() { + fl_begin_polygon(); + gap = 0; +#ifdef WIN32 + numcount = 0; +#endif +} + +void fl_gap() { + while (n>gap+2 && p[n-1].x == p[gap].x && p[n-1].y == p[gap].y) n--; + if (n > gap+2) { + fl_transformed_vertex((COORD_T)p[gap].x, (COORD_T)p[gap].y); +#ifdef WIN32 + counts[numcount++] = n-gap; +#endif + gap = n; + } else { + n = gap; + } +} + +void fl_end_complex_polygon() { + fl_gap(); + if (n < 3) { + fl_end_line(); + return; + } +#ifdef WIN32 + if (n>2) { + SelectObject(fl_gc, fl_brush()); + PolyPolygon(fl_gc, p, counts, numcount); + } +#elif defined(__APPLE_QD__) + if (n<=1) return; + PolyHandle ph = OpenPoly(); + MoveTo(p[0].x, p[0].y); + for (int i=1; i2) XFillPolygon(fl_display, fl_window, fl_gc, p, n, 0, 0); +#endif +} + +// shortcut the closed circles so they use XDrawArc: +// warning: these do not draw rotated ellipses correctly! +// See fl_arc.c for portable version. + +void fl_circle(double x, double y,double r) { + double xt = fl_transform_x(x,y); + double yt = fl_transform_y(x,y); + double rx = r * (m.c ? sqrt(m.a*m.a+m.c*m.c) : fabs(m.a)); + double ry = r * (m.b ? sqrt(m.b*m.b+m.d*m.d) : fabs(m.d)); + int llx = (int)rint(xt-rx); + int w = (int)rint(xt+rx)-llx; + int lly = (int)rint(yt-ry); + int h = (int)rint(yt+ry)-lly; +#ifdef WIN32 + if (what==POLYGON) { + SelectObject(fl_gc, fl_brush()); + Pie(fl_gc, llx, lly, llx+w, lly+h, 0,0, 0,0); + } else + Arc(fl_gc, llx, lly, llx+w, lly+h, 0,0, 0,0); +#elif defined(__APPLE_QD__) + Rect rt; rt.left=llx; rt.right=llx+w; rt.top=lly; rt.bottom=lly+h; + (what == POLYGON ? PaintOval : FrameOval)(&rt); +#elif defined(__APPLE_QUARTZ__) + // Quartz warning : circle won't scale to current matrix! + CGContextAddArc(fl_gc, xt, yt, (w+h)*0.25f, 0, 2.0f*M_PI, 1); + (what == POLYGON ? CGContextFillPath : CGContextStrokePath)(fl_gc); +#else + (what == POLYGON ? XFillArc : XDrawArc) + (fl_display, fl_window, fl_gc, llx, lly, w, h, 0, 360*64); +#endif +} + +// +// End of "$Id: fl_vertex.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/flstring.c b/third_party/windows/fltk-1.1.10/src/flstring.c new file mode 100644 index 0000000..34c01d6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/flstring.c @@ -0,0 +1,105 @@ +/* + * "$Id: flstring.c 4288 2005-04-16 00:13:17Z mike $" + * + * BSD string functions for the Fast Light Tool Kit (FLTK). + * + * Copyright 1998-2005 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems on the following page: + * + * http://www.fltk.org/str.php + */ + +#include "flstring.h" + + +/* + * 'fl_strlcat()' - Safely concatenate two strings. + */ + +size_t /* O - Length of string */ +fl_strlcat(char *dst, /* O - Destination string */ + const char *src, /* I - Source string */ + size_t size) { /* I - Size of destination string buffer */ + size_t srclen; /* Length of source string */ + size_t dstlen; /* Length of destination string */ + + + /* + * Figure out how much room is left... + */ + + dstlen = strlen(dst); + size -= dstlen + 1; + + if (!size) return (dstlen); /* No room, return immediately... */ + + /* + * Figure out how much room is needed... + */ + + srclen = strlen(src); + + /* + * Copy the appropriate amount... + */ + + if (srclen > size) srclen = size; + + memcpy(dst + dstlen, src, srclen); + dst[dstlen + srclen] = '\0'; + + return (dstlen + srclen); +} + + +/* + * 'fl_strlcpy()' - Safely copy two strings. + */ + +size_t /* O - Length of string */ +fl_strlcpy(char *dst, /* O - Destination string */ + const char *src, /* I - Source string */ + size_t size) { /* I - Size of destination string buffer */ + size_t srclen; /* Length of source string */ + + + /* + * Figure out how much room is needed... + */ + + size --; + + srclen = strlen(src); + + /* + * Copy the appropriate amount... + */ + + if (srclen > size) srclen = size; + + memcpy(dst, src, srclen); + dst[srclen] = '\0'; + + return (srclen); +} + + +/* + * End of "$Id: flstring.c 4288 2005-04-16 00:13:17Z mike $". + */ diff --git a/third_party/windows/fltk-1.1.10/src/flstring.h b/third_party/windows/fltk-1.1.10/src/flstring.h new file mode 100644 index 0000000..1a676f6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/flstring.h @@ -0,0 +1,115 @@ +/* + * "$Id: flstring.h 5701 2007-02-20 18:43:10Z mike $" + * + * Common string header file for the Fast Light Tool Kit (FLTK). + * + * Copyright 1998-2007 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems on the following page: + * + * http://www.fltk.org/str.php + */ + +#ifndef flstring_h +# define flstring_h + +# include +# include +# include +# include +# include +# ifdef HAVE_STRINGS_H +# include +# endif /* HAVE_STRINGS_H */ +# include + +/* + * Apparently Unixware defines "index" to strchr (!) rather than + * providing a proper entry point or not providing the (obsolete) + * BSD function. Make sure index is not defined... + */ + +# ifdef index +# undef index +# endif /* index */ + +# if defined(WIN32) && !defined(__CYGWIN__) +# define strcasecmp(s,t) _stricmp((s), (t)) +# define strncasecmp(s,t,n) _strnicmp((s), (t), (n)) +// Visual C++ 2005 incorrectly displays a warning about the use of POSIX APIs +// on Windows, which is supposed to be POSIX compliant... Some of these +// functions are also defined in ISO C99... +# ifndef __WATCOMC__ +# define strdup _strdup +# define unlink _unlink +# endif // !__WATCOMC__ +# elif defined(__EMX__) +# define strcasecmp(s,t) stricmp((s), (t)) +# define strncasecmp(s,t,n) strnicmp((s), (t), (n)) +# endif /* WIN32 */ + +# ifdef __cplusplus +extern "C" { +# endif /* __cplusplus */ + +/* + * MetroWerks' CodeWarrior put thes "non-standard" functions in + * which unfortunatly does not play well otherwise + * when included - to be resolved... + */ + +# if defined(__APPLE__) && defined(__MWERKS__) && defined(_MSL_USING_MW_C_HEADERS) +int strcasecmp(const char*,const char*); +int strncasecmp(const char*,const char*,int); +char *strdup(const char*); +# endif + +FL_EXPORT extern int fl_snprintf(char *, size_t, const char *, ...); +# if !HAVE_SNPRINTF +# define snprintf fl_snprintf +# endif /* !HAVE_SNPRINTF */ + +FL_EXPORT extern int fl_vsnprintf(char *, size_t, const char *, va_list ap); +# if !HAVE_VSNPRINTF +# define vsnprintf fl_vsnprintf +# endif /* !HAVE_VSNPRINTF */ + +/* + * strlcpy() and strlcat() are some really useful BSD string functions + * that work the way strncpy() and strncat() *should* have worked. + */ + +FL_EXPORT extern size_t fl_strlcat(char *, const char *, size_t); +# if !HAVE_STRLCAT +# define strlcat fl_strlcat +# endif /* !HAVE_STRLCAT */ + +FL_EXPORT extern size_t fl_strlcpy(char *, const char *, size_t); +# if !HAVE_STRLCPY +# define strlcpy fl_strlcpy +# endif /* !HAVE_STRLCPY */ + +# ifdef __cplusplus +} +# endif /* __cplusplus */ +#endif /* !flstring_h */ + + +/* + * End of "$Id: flstring.h 5701 2007-02-20 18:43:10Z mike $". + */ diff --git a/third_party/windows/fltk-1.1.10/src/forms_bitmap.cxx b/third_party/windows/fltk-1.1.10/src/forms_bitmap.cxx new file mode 100644 index 0000000..f7e497e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/forms_bitmap.cxx @@ -0,0 +1,52 @@ +// +// "$Id: forms_bitmap.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Forms compatible bitmap function for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include + +Fl_FormsBitmap::Fl_FormsBitmap( + Fl_Boxtype t, int X, int Y, int W, int H, const char* l) +: Fl_Widget(X, Y, W, H, l) { + box(t); + b = 0; + color(FL_BLACK); + align(FL_ALIGN_BOTTOM); +} + +void Fl_FormsBitmap::set(int W, int H, const uchar *bits) { + delete b; + bitmap(new Fl_Bitmap(bits, W, H)); +} + +void Fl_FormsBitmap::draw() { + draw_box(box(), selection_color()); + if (b) {fl_color(color()); b->draw(x(), y(), w(), h());} + draw_label(); +} + +// +// End of "$Id: forms_bitmap.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/forms_compatability.cxx b/third_party/windows/fltk-1.1.10/src/forms_compatability.cxx new file mode 100644 index 0000000..0608f30 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/forms_compatability.cxx @@ -0,0 +1,211 @@ +// +// "$Id: forms_compatability.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Forms compatibility functions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Forms library compatability functions. +// Many more functions are defined as inlines in forms.h! + +#include +#include + +char fl_flip = 2; +void fl_end_form() { + while (Fl_Group::current()) Fl_Group::current()->forms_end(); +} +void Fl_Group::forms_end() { + // set the dimensions of a group to surround contents + if (children() && !w()) { + Fl_Widget*const* a = array(); + Fl_Widget* o = *a++; + int rx = o->x(); + int ry = o->y(); + int rw = rx+o->w(); + int rh = ry+o->h(); + for (int i=children_-1; i--;) { + o = *a++; + if (o->x() < rx) rx = o->x(); + if (o->y() < ry) ry = o->y(); + if (o->x()+o->w() > rw) rw = o->x()+o->w(); + if (o->y()+o->h() > rh) rh = o->y()+o->h(); + } + x(rx); + y(ry); + w(rw-rx); + h(rh-ry); + } + // flip all the children's coordinate systems: + if (fl_flip) { + Fl_Widget* o = (type()>=FL_WINDOW) ? this : window(); + int Y = o->h(); + Fl_Widget*const* a = array(); + for (int i=children(); i--;) { + Fl_Widget* ow = *a++; + int newy = Y-ow->y()-ow->h(); + ow->y(newy); + } + } + end(); +} + +static int initargc; +static char **initargv; + +void fl_initialize(int *argc, char **argv, const char *, FL_CMD_OPT *, int) { + initargc = *argc; + initargv = new char*[*argc+1]; + int i,j; + for (i=0; i<=*argc; i++) initargv[i] = argv[i]; + for (i=j=1; i<*argc; ) { + if (Fl::arg(*argc,argv,i)); + else argv[j++] = argv[i++]; + } + argv[j] = 0; + *argc = j; + if (fl_flip==2) fl_flip = 0; +} + +char fl_modal_next; // set by fl_freeze_forms() + +void fl_show_form(Fl_Window *f,int place,int b,const char *n) { + + f->label(n); + if (!b) f->clear_border(); + if (fl_modal_next || b==FL_TRANSIENT) {f->set_modal(); fl_modal_next = 0;} + + if (place & FL_PLACE_MOUSE) f->hotspot(f); + + if (place & FL_PLACE_CENTER) { + int scr_x, scr_y, scr_w, scr_h; + Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h); + f->position(scr_x+(scr_w-f->w())/2, scr_y+(scr_h-f->h())/2); + } + + if (place & FL_PLACE_FULLSCREEN) + f->fullscreen(); + + if (place & (FL_PLACE_POSITION | FL_PLACE_GEOMETRY)) + f->position( + (f->x() < 0) ? Fl::w()-f->w()+f->x()-1 : f->x(), + (f->y() < 0) ? Fl::h()-f->h()+f->y()-1 : f->y()); + +// if (place & FL_PLACE_ASPECT) { +// this is not yet implemented +// it can be done by setting size_range(). + + if (place == FL_PLACE_FREE || place == FL_PLACE_SIZE) + f->free_position(); + + if (place == FL_PLACE_FREE || place & FL_FREE_SIZE) + if (!f->resizable()) f->resizable(f); + + if (initargc) {f->show(initargc,initargv); initargc = 0;} + else f->show(); +} + +Fl_Widget *fl_do_forms(void) { + Fl_Widget *obj; + while (!(obj = Fl::readqueue())) if (!Fl::wait()) exit(0); + return obj; +} + +Fl_Widget *fl_check_forms() { + Fl::check(); + return Fl::readqueue(); +} + +void fl_set_graphics_mode(int /*r*/,int /*d*/) {} + +void Fl_FormsText::draw() { + draw_box(); + align(align()|FL_ALIGN_INSIDE); // questionable method of compatability + draw_label(); +} + +// Create a forms button by selecting correct fltk subclass: + +#include +#include + +Fl_Button *fl_add_button(uchar t,int x,int y,int w,int h,const char *l) { + Fl_Button *b; + switch (t) { + case FL_RETURN_BUTTON: + case FL_HIDDEN_RET_BUTTON: + b = new Fl_Return_Button(x,y,w,h,l); + break; + case FL_TOUCH_BUTTON: + b = new Fl_Repeat_Button(x,y,w,h,l); + break; + default: + b = new Fl_Button(x,y,w,h,l); + } + switch (t) { + case FL_TOGGLE_BUTTON: + case FL_RADIO_BUTTON: + b->type(t); + break; + case FL_HIDDEN_BUTTON: + case FL_HIDDEN_RET_BUTTON: + b->type(FL_HIDDEN_BUTTON); + break; + case FL_INOUT_BUTTON: + b->when(FL_WHEN_CHANGED); + break; + } + return b; +} + +void fl_show_message(const char *q1,const char *q2,const char *q3) { + fl_message("%s\n%s\n%s", q1?q1:"", q2?q2:"", q3?q3:""); +} + +void fl_show_alert(const char *q1,const char *q2,const char *q3,int) { + fl_alert("%s\n%s\n%s", q1?q1:"", q2?q2:"", q3?q3:""); +} + +int fl_show_question(const char *q1,const char *q2,const char *q3) { + return fl_choice("%s\n%s\n%s", "No", "Yes", 0L, q1?q1:"", q2?q2:"", q3?q3:""); +} + +int fl_show_choice( + const char *q1, + const char *q2, + const char *q3, + int, // number of buttons, ignored + const char *b0, + const char *b1, + const char *b2) { + return fl_choice("%s\n%s\n%s", q1?q1:"", q2?q2:"", q3?q3:"", b0,b1,b2)+1; +} + +char *fl_show_simple_input(const char *str1, const char *defstr) { + const char *r = fl_input(str1, defstr); + return (char *)(r ? r : defstr); +} + +// +// End of "$Id: forms_compatability.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/forms_free.cxx b/third_party/windows/fltk-1.1.10/src/forms_free.cxx new file mode 100644 index 0000000..7b589e5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/forms_free.cxx @@ -0,0 +1,81 @@ +// +// "$Id: forms_free.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Forms free widget routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Emulation of the Forms "free" widget. +// This emulation allows the free demo to run, and has allowed +// me to port several other programs, but it is in no way +// complete. + +#include +#include + +void Fl_Free::step(void *v) { + Fl_Free *f = (Fl_Free *)v; + int old_event = Fl::e_number; + f->handle(Fl::e_number == FL_STEP); + Fl::e_number = old_event; + Fl::add_timeout(.01,step,v); +} + +Fl_Free::Fl_Free(uchar t,int X, int Y, int W, int H,const char *l, + FL_HANDLEPTR hdl) : +Fl_Widget(X,Y,W,H,l) { + type(t); + hfunc = hdl; + if (t == FL_SLEEPING_FREE) set_flag(INACTIVE); + if (t == FL_CONTINUOUS_FREE || t == FL_ALL_FREE) + Fl::add_timeout(.01,step,this); +} + +Fl_Free::~Fl_Free() { + Fl::remove_timeout(step,this); + hfunc(this,FL_FREEMEM,0,0,0); +} + +void Fl_Free::draw() {hfunc(this,FL_DRAW,0,0,0);} + +int Fl_Free::handle(int e) { + char key = Fl::event_key(); + switch (e) { + case FL_FOCUS: + if (type()!=FL_INPUT_FREE && type()!=FL_ALL_FREE) return 0; + break; + case FL_PUSH: + case FL_DRAG: + case FL_RELEASE: + key = 4-Fl::event_button(); + break; + case FL_SHORTCUT: + return 0; + } + if (hfunc(this, e, float(Fl::event_x()), float(Fl::event_y()), key)) do_callback(); + return 1; +} + +// +// End of "$Id: forms_free.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/forms_fselect.cxx b/third_party/windows/fltk-1.1.10/src/forms_fselect.cxx new file mode 100644 index 0000000..5bad0f8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/forms_fselect.cxx @@ -0,0 +1,67 @@ +// +// "$Id: forms_fselect.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Forms file selection routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Emulate the Forms file chooser using the fltk file chooser. + +#include +#include "flstring.h" + +static char fl_directory[1024]; +static const char *fl_pattern; // assummed passed value is static +static char fl_filename[1024]; + +char* fl_show_file_selector(const char *message,const char *dir, + const char *pat,const char *fname) { + if (dir && dir[0]) strlcpy(fl_directory,dir,sizeof(fl_directory)); + if (pat && pat[0]) fl_pattern = pat; + if (fname && fname[0]) strlcpy(fl_filename,fname,sizeof(fl_filename)); + char *p = fl_directory+strlen(fl_directory); + if (p > fl_directory && *(p-1)!='/' +#ifdef WIN32 + && *(p-1)!='\\' && *(p-1)!=':' +#endif + ) *p++ = '/'; + strlcpy(p,fl_filename,sizeof(fl_directory) - (p - fl_directory)); + const char *q = fl_file_chooser(message,fl_pattern,fl_directory); + if (!q) return 0; + strlcpy(fl_directory, q, sizeof(fl_directory)); + p = (char *)fl_filename_name(fl_directory); + strlcpy(fl_filename, p, sizeof(fl_filename)); + if (p > fl_directory+1) p--; + *p = 0; + return (char *)q; +} + +char* fl_get_directory() {return fl_directory;} + +char* fl_get_pattern() {return (char *)fl_pattern;} + +char* fl_get_filename() {return fl_filename;} + +// +// End of "$Id: forms_fselect.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/forms_pixmap.cxx b/third_party/windows/fltk-1.1.10/src/forms_pixmap.cxx new file mode 100644 index 0000000..6259a21 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/forms_pixmap.cxx @@ -0,0 +1,52 @@ +// +// "$Id: forms_pixmap.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Forms pixmap drawing routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include + +Fl_FormsPixmap::Fl_FormsPixmap( + Fl_Boxtype t, int X, int Y, int W, int H, const char* l) +: Fl_Widget(X, Y, W, H, l) { + box(t); + b = 0; + color(FL_BLACK); + align(FL_ALIGN_BOTTOM); +} + +void Fl_FormsPixmap::set(char*const* bits) { + delete b; + b = new Fl_Pixmap(bits); +} + +void Fl_FormsPixmap::draw() { + draw_box(box(), selection_color()); + if (b) {fl_color(color()); b->draw(x(), y(), w(), h());} + draw_label(); +} + +// +// End of "$Id: forms_pixmap.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/forms_timer.cxx b/third_party/windows/fltk-1.1.10/src/forms_timer.cxx new file mode 100644 index 0000000..6dd41dc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/forms_timer.cxx @@ -0,0 +1,170 @@ +// +// "$Id: forms_timer.cxx 6928 2009-11-07 21:11:16Z matt $" +// +// Forms timer object for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Emulate the Forms Timer object +// You don't want to use this if you just want a timeout, call +// Fl::add_timeout directly! + +#include +#include +#include +#ifdef WIN32 +# ifdef __MWERKS__ +# include +# else +# include +# include +# endif +#else +# include +# include +#endif +#include + +#define FL_TIMER_BLINKRATE 0.2 + +void fl_gettime(long* sec, long* usec) { +#ifdef WIN32 +# ifdef __MWERKS__ + time_t localTime = time(NULL); + struct tm *now = localtime(&localTime); + *sec = now->tm_sec + 60*now->tm_min + 3600*now->tm_hour + 24*3600*now->tm_yday; + *usec = 0; +# else + struct timeb tp; + ftime(&tp); + *sec = tp.time; + *usec = tp.millitm * 1000; +# endif +#else + struct timeval tp; + struct timezone tzp; + gettimeofday(&tp, &tzp); + *sec = tp.tv_sec; + *usec = tp.tv_usec; +#endif +} + +void Fl_Timer::draw() { + int tt; + Fl_Color col; + char str[32]; + if (!on || delay>0.0) + col = color(); + else if ((int) (delay / FL_TIMER_BLINKRATE) % 2) + col = color(); + else + col = selection_color(); + draw_box(box(), col); + if (type() == FL_VALUE_TIMER && delay>0.0) { + double d = direction_ ? total-delay : delay; + if (d < 60.0) + sprintf(str, "%.1f", d); + else { + tt = (int) ((d+0.05) / 60.0); + sprintf(str, "%d:%04.1f", tt, d - 60.0 * tt); + } + fl_font(labelfont(), labelsize()); + fl_color(labelcolor()); + fl_draw(str, x(), y(), w(), h(), FL_ALIGN_CENTER); + } else + draw_label(); +} + +void Fl_Timer::stepcb(void* v) { + ((Fl_Timer*)v)->step(); +} + +void Fl_Timer::step() { + if (!on) return; + double lastdelay = delay; + long sec, usec; fl_gettime(&sec, &usec); + delay -= (double) (sec - lastsec) + (double) (usec - lastusec) / 1000000.0; + lastsec = sec; lastusec = usec; + if (lastdelay > 0.0 && delay <= 0.0) { + if (type() == FL_HIDDEN_TIMER) { + on = 0; + delay = 0; + } else { + redraw(); + Fl::add_timeout(FL_TIMER_BLINKRATE, stepcb, this); + } + set_changed(); + do_callback(); + } else { + if (type() == FL_VALUE_TIMER) redraw(); + Fl::add_timeout(FL_TIMER_BLINKRATE, stepcb, this); + } +} + +int Fl_Timer::handle(int event) { + if (event == FL_RELEASE && delay <= 0) value(0.0); + return 0; +} + +Fl_Timer::~Fl_Timer() { + Fl::remove_timeout(stepcb, this); +} + +Fl_Timer::Fl_Timer(uchar t, int X, int Y, int W, int H, const char* l) +: Fl_Widget(X, Y, W, H, l) { + box(FL_DOWN_BOX); + selection_color(FL_RED); + delay = 0; + on = 0; + direction_ = 0; + lastsec = lastusec = total = 0; + type(t); + if (t == FL_HIDDEN_TIMER) clear_visible(); + if (t == FL_VALUE_TIMER) align(FL_ALIGN_LEFT); +} + +void Fl_Timer::value(double d) { + delay = total = d; + on = (d > 0.0); + fl_gettime(&(lastsec), &(lastusec)); + if (type() != FL_HIDDEN_TIMER) redraw(); + Fl::remove_timeout(stepcb, this); + if (on) Fl::add_timeout(FL_TIMER_BLINKRATE, stepcb, this); +} + +void Fl_Timer::suspended(char d) { + if (!d) { + if (on) return; + on = (delay > 0.0); + fl_gettime(&(lastsec), &(lastusec)); + if (on) Fl::add_timeout(FL_TIMER_BLINKRATE, stepcb, this); + } else { + if (!on) return; + on = 0; + Fl::remove_timeout(stepcb, this); + } +} + +// +// End of "$Id: forms_timer.cxx 6928 2009-11-07 21:11:16Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/src/freeglut_geometry.cxx b/third_party/windows/fltk-1.1.10/src/freeglut_geometry.cxx new file mode 100644 index 0000000..91bd9e3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/freeglut_geometry.cxx @@ -0,0 +1,1110 @@ +/* + * freeglut_geometry.c + * + * Freeglut geometry rendering methods. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * Creation date: Fri Dec 3 1999 + * + * 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 + * PAWEL W. OLSZTA 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. + */ + +#include +#include +#include + +/* + * TODO BEFORE THE STABLE RELEASE: + * + * Following functions have been contributed by Andreas Umbach. + * + * glutWireCube() -- looks OK + * glutSolidCube() -- OK + * + * Those functions have been implemented by John Fay. + * + * glutWireTorus() -- looks OK + * glutSolidTorus() -- looks OK + * glutWireDodecahedron() -- looks OK + * glutSolidDodecahedron() -- looks OK + * glutWireOctahedron() -- looks OK + * glutSolidOctahedron() -- looks OK + * glutWireTetrahedron() -- looks OK + * glutSolidTetrahedron() -- looks OK + * glutWireIcosahedron() -- looks OK + * glutSolidIcosahedron() -- looks OK + * + * The Following functions have been updated by Nigel Stewart, based + * on FreeGLUT 2.0.0 implementations: + * + * glutWireSphere() -- looks OK + * glutSolidSphere() -- looks OK + * glutWireCone() -- looks OK + * glutSolidCone() -- looks OK + */ + + +/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ + +/* + * Draws a wireframed cube. Code contributed by Andreas Umbach + */ +void glutWireCube( GLdouble dSize ) +{ + double size = dSize * 0.5; + +# define V(a,b,c) glVertex3d( a size, b size, c size ); +# define N(a,b,c) glNormal3d( a, b, c ); + + /* PWO: I dared to convert the code to use macros... */ + glBegin( GL_LINE_LOOP ); N( 1.0, 0.0, 0.0); V(+,-,+); V(+,-,-); V(+,+,-); V(+,+,+); glEnd(); + glBegin( GL_LINE_LOOP ); N( 0.0, 1.0, 0.0); V(+,+,+); V(+,+,-); V(-,+,-); V(-,+,+); glEnd(); + glBegin( GL_LINE_LOOP ); N( 0.0, 0.0, 1.0); V(+,+,+); V(-,+,+); V(-,-,+); V(+,-,+); glEnd(); + glBegin( GL_LINE_LOOP ); N(-1.0, 0.0, 0.0); V(-,-,+); V(-,+,+); V(-,+,-); V(-,-,-); glEnd(); + glBegin( GL_LINE_LOOP ); N( 0.0,-1.0, 0.0); V(-,-,+); V(-,-,-); V(+,-,-); V(+,-,+); glEnd(); + glBegin( GL_LINE_LOOP ); N( 0.0, 0.0,-1.0); V(-,-,-); V(-,+,-); V(+,+,-); V(+,-,-); glEnd(); + +# undef V +# undef N +} + +/* + * Draws a solid cube. Code contributed by Andreas Umbach + */ +void glutSolidCube( GLdouble dSize ) +{ + double size = dSize * 0.5; + +# define V(a,b,c) glVertex3d( a size, b size, c size ); +# define N(a,b,c) glNormal3d( a, b, c ); + + /* PWO: Again, I dared to convert the code to use macros... */ + glBegin( GL_QUADS ); + N( 1.0, 0.0, 0.0); V(+,-,+); V(+,-,-); V(+,+,-); V(+,+,+); + N( 0.0, 1.0, 0.0); V(+,+,+); V(+,+,-); V(-,+,-); V(-,+,+); + N( 0.0, 0.0, 1.0); V(+,+,+); V(-,+,+); V(-,-,+); V(+,-,+); + N(-1.0, 0.0, 0.0); V(-,-,+); V(-,+,+); V(-,+,-); V(-,-,-); + N( 0.0,-1.0, 0.0); V(-,-,+); V(-,-,-); V(+,-,-); V(+,-,+); + N( 0.0, 0.0,-1.0); V(-,-,-); V(-,+,-); V(+,+,-); V(+,-,-); + glEnd(); + +# undef V +# undef N +} + +/* + * Compute lookup table of cos and sin values forming a cirle + * + * Notes: + * It is the responsibility of the caller to free these tables + * The size of the table is (n+1) to form a connected loop + * The last entry is exactly the same as the first + * The sign of n can be flipped to get the reverse loop + */ + +static void fghCircleTable(double **sint,double **cost,const int n) +{ + int i; + + /* Table size, the sign of n flips the circle direction */ + + const int size = abs(n); + + /* Determine the angle between samples */ + + const double angle = 2*M_PI/(double)( ( n == 0 ) ? 1 : n ); + + /* Allocate memory for n samples, plus duplicate of first entry at the end */ + + *sint = (double *) calloc(sizeof(double), size+1); + *cost = (double *) calloc(sizeof(double), size+1); + + /* Bail out if memory allocation fails, fgError never returns */ + + if (!(*sint) || !(*cost)) + { + if (*sint) free(*sint); + if (*cost) free(*cost); + return; + } + + /* Compute cos and sin around the circle */ + + (*sint)[0] = 0.0; + (*cost)[0] = 1.0; + + for (i=1; i0)?1:0]; + r0 = 0.0; + r1 = sint2[(stacks>0)?1:0]; + + glBegin(GL_TRIANGLE_FAN); + + glNormal3d(0,0,1); + glVertex3d(0,0,radius); + + for (j=slices; j>=0; j--) + { + glNormal3d(cost1[j]*r1, sint1[j]*r1, z1 ); + glVertex3d(cost1[j]*r1*radius, sint1[j]*r1*radius, z1*radius); + } + + glEnd(); + + /* Cover each stack with a quad strip, except the top and bottom stacks */ + + for( i=1; i 0 ) ? stacks : 1 ); + const double rStep = base / ( ( stacks > 0 ) ? stacks : 1 ); + + /* Scaling factors for vertex normals */ + + const double cosn = ( height / sqrt ( height * height + base * base )); + const double sinn = ( base / sqrt ( height * height + base * base )); + + /* Pre-computed circle */ + + double *sint,*cost; + + fghCircleTable(&sint,&cost,-slices); + + /* Cover the circular base with a triangle fan... */ + + z0 = 0.0; + z1 = zStep; + + r0 = base; + r1 = r0 - rStep; + + glBegin(GL_TRIANGLE_FAN); + + glNormal3d(0.0,0.0,-1.0); + glVertex3d(0.0,0.0, z0 ); + + for (j=0; j<=slices; j++) + glVertex3d(cost[j]*r0, sint[j]*r0, z0); + + glEnd(); + + /* Cover each stack with a quad strip, except the top stack */ + + for( i=0; i 0 ) ? stacks : 1 ); + const double rStep = base / ( ( stacks > 0 ) ? stacks : 1 ); + + /* Scaling factors for vertex normals */ + + const double cosn = ( height / sqrt ( height * height + base * base )); + const double sinn = ( base / sqrt ( height * height + base * base )); + + /* Pre-computed circle */ + + double *sint,*cost; + + fghCircleTable(&sint,&cost,-slices); + + /* Draw the stacks... */ + + for (i=0; i 0 ) ? stacks : 1 ); + + /* Pre-computed circle */ + + double *sint,*cost; + + fghCircleTable(&sint,&cost,-slices); + + /* Cover the base and top */ + + glBegin(GL_TRIANGLE_FAN); + glNormal3d(0.0, 0.0, -1.0 ); + glVertex3d(0.0, 0.0, 0.0 ); + for (j=0; j<=slices; j++) + glVertex3d(cost[j]*radius, sint[j]*radius, 0.0); + glEnd(); + + glBegin(GL_TRIANGLE_FAN); + glNormal3d(0.0, 0.0, 1.0 ); + glVertex3d(0.0, 0.0, height); + for (j=slices; j>=0; j--) + glVertex3d(cost[j]*radius, sint[j]*radius, height); + glEnd(); + + /* Do the stacks */ + + z0 = 0.0; + z1 = zStep; + + for (i=1; i<=stacks; i++) + { + if (i==stacks) + z1 = height; + + glBegin(GL_QUAD_STRIP); + for (j=0; j<=slices; j++ ) + { + glNormal3d(cost[j], sint[j], 0.0 ); + glVertex3d(cost[j]*radius, sint[j]*radius, z0 ); + glVertex3d(cost[j]*radius, sint[j]*radius, z1 ); + } + glEnd(); + + z0 = z1; z1 += zStep; + } + + /* Release sin and cos tables */ + + free(sint); + free(cost); +} + +/* + * Draws a wire cylinder + */ +void glutWireCylinder(GLdouble radius, GLdouble height, GLint slices, GLint stacks) +{ + int i,j; + + /* Step in z and radius as stacks are drawn. */ + + double z = 0.0; + const double zStep = height / ( ( stacks > 0 ) ? stacks : 1 ); + + /* Pre-computed circle */ + + double *sint,*cost; + + fghCircleTable(&sint,&cost,-slices); + + /* Draw the stacks... */ + + for (i=0; i<=stacks; i++) + { + if (i==stacks) + z = height; + + glBegin(GL_LINE_LOOP); + + for( j=0; j + * Creation date: Thu Dec 16 1999 + * + * 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 + * PAWEL W. OLSZTA 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 file has been automatically generated by the genstroke utility. */ + +#include + +/* char: 0x20 */ + +static const Fl_Glut_StrokeStrip ch32st[] = +{ + { 0, 0 } +}; + +static const Fl_Glut_StrokeChar ch32 = {104.762f,0,ch32st}; + +/* char: 0x21 */ + +static const Fl_Glut_StrokeVertex ch33st0[] = +{ + {52.381f,100.0f}, + {52.381f,33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch33st1[] = +{ + {52.381f,9.5238f}, + {47.6191f,4.7619f}, + {52.381f,0.0f}, + {57.1429f,4.7619f}, + {52.381f,9.5238f} +}; + +static const Fl_Glut_StrokeStrip ch33st[] = +{ + {2,ch33st0}, + {5,ch33st1} +}; + +static const Fl_Glut_StrokeChar ch33 = {104.762f,2,ch33st}; + +/* char: 0x22 */ + +static const Fl_Glut_StrokeVertex ch34st0[] = +{ + {33.3334f,100.0f}, + {33.3334f,66.6667f} +}; + +static const Fl_Glut_StrokeVertex ch34st1[] = +{ + {71.4286f,100.0f}, + {71.4286f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch34st[] = +{ + {2,ch34st0}, + {2,ch34st1} +}; + +static const Fl_Glut_StrokeChar ch34 = {104.762f,2,ch34st}; + +/* char: 0x23 */ + +static const Fl_Glut_StrokeVertex ch35st0[] = +{ + {54.7619f,119.048f}, + {21.4286f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch35st1[] = +{ + {83.3334f,119.048f}, + {50.0f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch35st2[] = +{ + {21.4286f,57.1429f}, + {88.0952f,57.1429f} +}; + +static const Fl_Glut_StrokeVertex ch35st3[] = +{ + {16.6667f,28.5714f}, + {83.3334f,28.5714f} +}; + +static const Fl_Glut_StrokeStrip ch35st[] = +{ + {2,ch35st0}, + {2,ch35st1}, + {2,ch35st2}, + {2,ch35st3} +}; + +static const Fl_Glut_StrokeChar ch35 = {104.762f,4,ch35st}; + +/* char: 0x24 */ + +static const Fl_Glut_StrokeVertex ch36st0[] = +{ + {42.8571f,119.048f}, + {42.8571f,-19.0476f} +}; + +static const Fl_Glut_StrokeVertex ch36st1[] = +{ + {61.9047f,119.048f}, + {61.9047f,-19.0476f} +}; + +static const Fl_Glut_StrokeVertex ch36st2[] = +{ + {85.7143f,85.7143f}, + {76.1905f,95.2381f}, + {61.9047f,100.0f}, + {42.8571f,100.0f}, + {28.5714f,95.2381f}, + {19.0476f,85.7143f}, + {19.0476f,76.1905f}, + {23.8095f,66.6667f}, + {28.5714f,61.9048f}, + {38.0952f,57.1429f}, + {66.6666f,47.619f}, + {76.1905f,42.8571f}, + {80.9524f,38.0952f}, + {85.7143f,28.5714f}, + {85.7143f,14.2857f}, + {76.1905f,4.7619f}, + {61.9047f,0.0f}, + {42.8571f,0.0f}, + {28.5714f,4.7619f}, + {19.0476f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch36st[] = +{ + {2,ch36st0}, + {2,ch36st1}, + {20,ch36st2} +}; + +static const Fl_Glut_StrokeChar ch36 = {104.762f,3,ch36st}; + +/* char: 0x25 */ + +static const Fl_Glut_StrokeVertex ch37st0[] = +{ + {95.2381f,100.0f}, + {9.5238f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch37st1[] = +{ + {33.3333f,100.0f}, + {42.8571f,90.4762f}, + {42.8571f,80.9524f}, + {38.0952f,71.4286f}, + {28.5714f,66.6667f}, + {19.0476f,66.6667f}, + {9.5238f,76.1905f}, + {9.5238f,85.7143f}, + {14.2857f,95.2381f}, + {23.8095f,100.0f}, + {33.3333f,100.0f}, + {42.8571f,95.2381f}, + {57.1428f,90.4762f}, + {71.4286f,90.4762f}, + {85.7143f,95.2381f}, + {95.2381f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch37st2[] = +{ + {76.1905f,33.3333f}, + {66.6667f,28.5714f}, + {61.9048f,19.0476f}, + {61.9048f,9.5238f}, + {71.4286f,0.0f}, + {80.9524f,0.0f}, + {90.4762f,4.7619f}, + {95.2381f,14.2857f}, + {95.2381f,23.8095f}, + {85.7143f,33.3333f}, + {76.1905f,33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch37st[] = +{ + {2,ch37st0}, + {16,ch37st1}, + {11,ch37st2} +}; + +static const Fl_Glut_StrokeChar ch37 = {104.762f,3,ch37st}; + +/* char: 0x26 */ + +static const Fl_Glut_StrokeVertex ch38st0[] = +{ + {100.0f,57.1429f}, + {100.0f,61.9048f}, + {95.2381f,66.6667f}, + {90.4762f,66.6667f}, + {85.7143f,61.9048f}, + {80.9524f,52.381f}, + {71.4286f,28.5714f}, + {61.9048f,14.2857f}, + {52.3809f,4.7619f}, + {42.8571f,0.0f}, + {23.8095f,0.0f}, + {14.2857f,4.7619f}, + {9.5238f,9.5238f}, + {4.7619f,19.0476f}, + {4.7619f,28.5714f}, + {9.5238f,38.0952f}, + {14.2857f,42.8571f}, + {47.619f,61.9048f}, + {52.3809f,66.6667f}, + {57.1429f,76.1905f}, + {57.1429f,85.7143f}, + {52.3809f,95.2381f}, + {42.8571f,100.0f}, + {33.3333f,95.2381f}, + {28.5714f,85.7143f}, + {28.5714f,76.1905f}, + {33.3333f,61.9048f}, + {42.8571f,47.619f}, + {66.6667f,14.2857f}, + {76.1905f,4.7619f}, + {85.7143f,0.0f}, + {95.2381f,0.0f}, + {100.0f,4.7619f}, + {100.0f,9.5238f} +}; + +static const Fl_Glut_StrokeStrip ch38st[] = +{ + {34,ch38st0} +}; + +static const Fl_Glut_StrokeChar ch38 = {104.762f,1,ch38st}; + +/* char: 0x27 */ + +static const Fl_Glut_StrokeVertex ch39st0[] = +{ + {52.381f,100.0f}, + {52.381f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch39st[] = +{ + {2,ch39st0} +}; + +static const Fl_Glut_StrokeChar ch39 = {104.762f,1,ch39st}; + +/* char: 0x28 */ + +static const Fl_Glut_StrokeVertex ch40st0[] = +{ + {69.0476f,119.048f}, + {59.5238f,109.524f}, + {50.0f,95.2381f}, + {40.4762f,76.1905f}, + {35.7143f,52.381f}, + {35.7143f,33.3333f}, + {40.4762f,9.5238f}, + {50.0f,-9.5238f}, + {59.5238f,-23.8095f}, + {69.0476f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch40st[] = +{ + {10,ch40st0} +}; + +static const Fl_Glut_StrokeChar ch40 = {104.762f,1,ch40st}; + +/* char: 0x29 */ + +static const Fl_Glut_StrokeVertex ch41st0[] = +{ + {35.7143f,119.048f}, + {45.2381f,109.524f}, + {54.7619f,95.2381f}, + {64.2857f,76.1905f}, + {69.0476f,52.381f}, + {69.0476f,33.3333f}, + {64.2857f,9.5238f}, + {54.7619f,-9.5238f}, + {45.2381f,-23.8095f}, + {35.7143f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch41st[] = +{ + {10,ch41st0} +}; + +static const Fl_Glut_StrokeChar ch41 = {104.762f,1,ch41st}; + +/* char: 0x2a */ + +static const Fl_Glut_StrokeVertex ch42st0[] = +{ + {52.381f,71.4286f}, + {52.381f,14.2857f} +}; + +static const Fl_Glut_StrokeVertex ch42st1[] = +{ + {28.5715f,57.1429f}, + {76.1905f,28.5714f} +}; + +static const Fl_Glut_StrokeVertex ch42st2[] = +{ + {76.1905f,57.1429f}, + {28.5715f,28.5714f} +}; + +static const Fl_Glut_StrokeStrip ch42st[] = +{ + {2,ch42st0}, + {2,ch42st1}, + {2,ch42st2} +}; + +static const Fl_Glut_StrokeChar ch42 = {104.762f,3,ch42st}; + +/* char: 0x2b */ + +static const Fl_Glut_StrokeVertex ch43st0[] = +{ + {52.3809f,85.7143f}, + {52.3809f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch43st1[] = +{ + {9.5238f,42.8571f}, + {95.2381f,42.8571f} +}; + +static const Fl_Glut_StrokeStrip ch43st[] = +{ + {2,ch43st0}, + {2,ch43st1} +}; + +static const Fl_Glut_StrokeChar ch43 = {104.762f,2,ch43st}; + +/* char: 0x2c */ + +static const Fl_Glut_StrokeVertex ch44st0[] = +{ + {57.1429f,4.7619f}, + {52.381f,0.0f}, + {47.6191f,4.7619f}, + {52.381f,9.5238f}, + {57.1429f,4.7619f}, + {57.1429f,-4.7619f}, + {52.381f,-14.2857f}, + {47.6191f,-19.0476f} +}; + +static const Fl_Glut_StrokeStrip ch44st[] = +{ + {8,ch44st0} +}; + +static const Fl_Glut_StrokeChar ch44 = {104.762f,1,ch44st}; + +/* char: 0x2d */ + +static const Fl_Glut_StrokeVertex ch45st0[] = +{ + {9.5238f,42.8571f}, + {95.2381f,42.8571f} +}; + +static const Fl_Glut_StrokeStrip ch45st[] = +{ + {2,ch45st0} +}; + +static const Fl_Glut_StrokeChar ch45 = {104.762f,1,ch45st}; + +/* char: 0x2e */ + +static const Fl_Glut_StrokeVertex ch46st0[] = +{ + {52.381f,9.5238f}, + {47.6191f,4.7619f}, + {52.381f,0.0f}, + {57.1429f,4.7619f}, + {52.381f,9.5238f} +}; + +static const Fl_Glut_StrokeStrip ch46st[] = +{ + {5,ch46st0} +}; + +static const Fl_Glut_StrokeChar ch46 = {104.762f,1,ch46st}; + +/* char: 0x2f */ + +static const Fl_Glut_StrokeVertex ch47st0[] = +{ + {19.0476f,-14.2857f}, + {85.7143f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch47st[] = +{ + {2,ch47st0} +}; + +static const Fl_Glut_StrokeChar ch47 = {104.762f,1,ch47st}; + +/* char: 0x30 */ + +static const Fl_Glut_StrokeVertex ch48st0[] = +{ + {47.619f,100.0f}, + {33.3333f,95.2381f}, + {23.8095f,80.9524f}, + {19.0476f,57.1429f}, + {19.0476f,42.8571f}, + {23.8095f,19.0476f}, + {33.3333f,4.7619f}, + {47.619f,0.0f}, + {57.1428f,0.0f}, + {71.4286f,4.7619f}, + {80.9524f,19.0476f}, + {85.7143f,42.8571f}, + {85.7143f,57.1429f}, + {80.9524f,80.9524f}, + {71.4286f,95.2381f}, + {57.1428f,100.0f}, + {47.619f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch48st[] = +{ + {17,ch48st0} +}; + +static const Fl_Glut_StrokeChar ch48 = {104.762f,1,ch48st}; + +/* char: 0x31 */ + +static const Fl_Glut_StrokeVertex ch49st0[] = +{ + {40.4762f,80.9524f}, + {50.0f,85.7143f}, + {64.2857f,100.0f}, + {64.2857f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch49st[] = +{ + {4,ch49st0} +}; + +static const Fl_Glut_StrokeChar ch49 = {104.762f,1,ch49st}; + +/* char: 0x32 */ + +static const Fl_Glut_StrokeVertex ch50st0[] = +{ + {23.8095f,76.1905f}, + {23.8095f,80.9524f}, + {28.5714f,90.4762f}, + {33.3333f,95.2381f}, + {42.8571f,100.0f}, + {61.9047f,100.0f}, + {71.4286f,95.2381f}, + {76.1905f,90.4762f}, + {80.9524f,80.9524f}, + {80.9524f,71.4286f}, + {76.1905f,61.9048f}, + {66.6666f,47.619f}, + {19.0476f,0.0f}, + {85.7143f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch50st[] = +{ + {14,ch50st0} +}; + +static const Fl_Glut_StrokeChar ch50 = {104.762f,1,ch50st}; + +/* char: 0x33 */ + +static const Fl_Glut_StrokeVertex ch51st0[] = +{ + {28.5714f,100.0f}, + {80.9524f,100.0f}, + {52.3809f,61.9048f}, + {66.6666f,61.9048f}, + {76.1905f,57.1429f}, + {80.9524f,52.381f}, + {85.7143f,38.0952f}, + {85.7143f,28.5714f}, + {80.9524f,14.2857f}, + {71.4286f,4.7619f}, + {57.1428f,0.0f}, + {42.8571f,0.0f}, + {28.5714f,4.7619f}, + {23.8095f,9.5238f}, + {19.0476f,19.0476f} +}; + +static const Fl_Glut_StrokeStrip ch51st[] = +{ + {15,ch51st0} +}; + +static const Fl_Glut_StrokeChar ch51 = {104.762f,1,ch51st}; + +/* char: 0x34 */ + +static const Fl_Glut_StrokeVertex ch52st0[] = +{ + {64.2857f,100.0f}, + {16.6667f,33.3333f}, + {88.0952f,33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch52st1[] = +{ + {64.2857f,100.0f}, + {64.2857f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch52st[] = +{ + {3,ch52st0}, + {2,ch52st1} +}; + +static const Fl_Glut_StrokeChar ch52 = {104.762f,2,ch52st}; + +/* char: 0x35 */ + +static const Fl_Glut_StrokeVertex ch53st0[] = +{ + {76.1905f,100.0f}, + {28.5714f,100.0f}, + {23.8095f,57.1429f}, + {28.5714f,61.9048f}, + {42.8571f,66.6667f}, + {57.1428f,66.6667f}, + {71.4286f,61.9048f}, + {80.9524f,52.381f}, + {85.7143f,38.0952f}, + {85.7143f,28.5714f}, + {80.9524f,14.2857f}, + {71.4286f,4.7619f}, + {57.1428f,0.0f}, + {42.8571f,0.0f}, + {28.5714f,4.7619f}, + {23.8095f,9.5238f}, + {19.0476f,19.0476f} +}; + +static const Fl_Glut_StrokeStrip ch53st[] = +{ + {17,ch53st0} +}; + +static const Fl_Glut_StrokeChar ch53 = {104.762f,1,ch53st}; + +/* char: 0x36 */ + +static const Fl_Glut_StrokeVertex ch54st0[] = +{ + {78.5714f,85.7143f}, + {73.8096f,95.2381f}, + {59.5238f,100.0f}, + {50.0f,100.0f}, + {35.7143f,95.2381f}, + {26.1905f,80.9524f}, + {21.4286f,57.1429f}, + {21.4286f,33.3333f}, + {26.1905f,14.2857f}, + {35.7143f,4.7619f}, + {50.0f,0.0f}, + {54.7619f,0.0f}, + {69.0476f,4.7619f}, + {78.5714f,14.2857f}, + {83.3334f,28.5714f}, + {83.3334f,33.3333f}, + {78.5714f,47.619f}, + {69.0476f,57.1429f}, + {54.7619f,61.9048f}, + {50.0f,61.9048f}, + {35.7143f,57.1429f}, + {26.1905f,47.619f}, + {21.4286f,33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch54st[] = +{ + {23,ch54st0} +}; + +static const Fl_Glut_StrokeChar ch54 = {104.762f,1,ch54st}; + +/* char: 0x37 */ + +static const Fl_Glut_StrokeVertex ch55st0[] = +{ + {85.7143f,100.0f}, + {38.0952f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch55st1[] = +{ + {19.0476f,100.0f}, + {85.7143f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch55st[] = +{ + {2,ch55st0}, + {2,ch55st1} +}; + +static const Fl_Glut_StrokeChar ch55 = {104.762f,2,ch55st}; + +/* char: 0x38 */ + +static const Fl_Glut_StrokeVertex ch56st0[] = +{ + {42.8571f,100.0f}, + {28.5714f,95.2381f}, + {23.8095f,85.7143f}, + {23.8095f,76.1905f}, + {28.5714f,66.6667f}, + {38.0952f,61.9048f}, + {57.1428f,57.1429f}, + {71.4286f,52.381f}, + {80.9524f,42.8571f}, + {85.7143f,33.3333f}, + {85.7143f,19.0476f}, + {80.9524f,9.5238f}, + {76.1905f,4.7619f}, + {61.9047f,0.0f}, + {42.8571f,0.0f}, + {28.5714f,4.7619f}, + {23.8095f,9.5238f}, + {19.0476f,19.0476f}, + {19.0476f,33.3333f}, + {23.8095f,42.8571f}, + {33.3333f,52.381f}, + {47.619f,57.1429f}, + {66.6666f,61.9048f}, + {76.1905f,66.6667f}, + {80.9524f,76.1905f}, + {80.9524f,85.7143f}, + {76.1905f,95.2381f}, + {61.9047f,100.0f}, + {42.8571f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch56st[] = +{ + {29,ch56st0} +}; + +static const Fl_Glut_StrokeChar ch56 = {104.762f,1,ch56st}; + +/* char: 0x39 */ + +static const Fl_Glut_StrokeVertex ch57st0[] = +{ + {83.3334f,66.6667f}, + {78.5714f,52.381f}, + {69.0476f,42.8571f}, + {54.7619f,38.0952f}, + {50.0f,38.0952f}, + {35.7143f,42.8571f}, + {26.1905f,52.381f}, + {21.4286f,66.6667f}, + {21.4286f,71.4286f}, + {26.1905f,85.7143f}, + {35.7143f,95.2381f}, + {50.0f,100.0f}, + {54.7619f,100.0f}, + {69.0476f,95.2381f}, + {78.5714f,85.7143f}, + {83.3334f,66.6667f}, + {83.3334f,42.8571f}, + {78.5714f,19.0476f}, + {69.0476f,4.7619f}, + {54.7619f,0.0f}, + {45.2381f,0.0f}, + {30.9524f,4.7619f}, + {26.1905f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch57st[] = +{ + {23,ch57st0} +}; + +static const Fl_Glut_StrokeChar ch57 = {104.762f,1,ch57st}; + +/* char: 0x3a */ + +static const Fl_Glut_StrokeVertex ch58st0[] = +{ + {52.381f,66.6667f}, + {47.6191f,61.9048f}, + {52.381f,57.1429f}, + {57.1429f,61.9048f}, + {52.381f,66.6667f} +}; + +static const Fl_Glut_StrokeVertex ch58st1[] = +{ + {52.381f,9.5238f}, + {47.6191f,4.7619f}, + {52.381f,0.0f}, + {57.1429f,4.7619f}, + {52.381f,9.5238f} +}; + +static const Fl_Glut_StrokeStrip ch58st[] = +{ + {5,ch58st0}, + {5,ch58st1} +}; + +static const Fl_Glut_StrokeChar ch58 = {104.762f,2,ch58st}; + +/* char: 0x3b */ + +static const Fl_Glut_StrokeVertex ch59st0[] = +{ + {52.381f,66.6667f}, + {47.6191f,61.9048f}, + {52.381f,57.1429f}, + {57.1429f,61.9048f}, + {52.381f,66.6667f} +}; + +static const Fl_Glut_StrokeVertex ch59st1[] = +{ + {57.1429f,4.7619f}, + {52.381f,0.0f}, + {47.6191f,4.7619f}, + {52.381f,9.5238f}, + {57.1429f,4.7619f}, + {57.1429f,-4.7619f}, + {52.381f,-14.2857f}, + {47.6191f,-19.0476f} +}; + +static const Fl_Glut_StrokeStrip ch59st[] = +{ + {5,ch59st0}, + {8,ch59st1} +}; + +static const Fl_Glut_StrokeChar ch59 = {104.762f,2,ch59st}; + +/* char: 0x3c */ + +static const Fl_Glut_StrokeVertex ch60st0[] = +{ + {90.4762f,85.7143f}, + {14.2857f,42.8571f}, + {90.4762f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch60st[] = +{ + {3,ch60st0} +}; + +static const Fl_Glut_StrokeChar ch60 = {104.762f,1,ch60st}; + +/* char: 0x3d */ + +static const Fl_Glut_StrokeVertex ch61st0[] = +{ + {9.5238f,57.1429f}, + {95.2381f,57.1429f} +}; + +static const Fl_Glut_StrokeVertex ch61st1[] = +{ + {9.5238f,28.5714f}, + {95.2381f,28.5714f} +}; + +static const Fl_Glut_StrokeStrip ch61st[] = +{ + {2,ch61st0}, + {2,ch61st1} +}; + +static const Fl_Glut_StrokeChar ch61 = {104.762f,2,ch61st}; + +/* char: 0x3e */ + +static const Fl_Glut_StrokeVertex ch62st0[] = +{ + {14.2857f,85.7143f}, + {90.4762f,42.8571f}, + {14.2857f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch62st[] = +{ + {3,ch62st0} +}; + +static const Fl_Glut_StrokeChar ch62 = {104.762f,1,ch62st}; + +/* char: 0x3f */ + +static const Fl_Glut_StrokeVertex ch63st0[] = +{ + {23.8095f,76.1905f}, + {23.8095f,80.9524f}, + {28.5714f,90.4762f}, + {33.3333f,95.2381f}, + {42.8571f,100.0f}, + {61.9047f,100.0f}, + {71.4285f,95.2381f}, + {76.1905f,90.4762f}, + {80.9524f,80.9524f}, + {80.9524f,71.4286f}, + {76.1905f,61.9048f}, + {71.4285f,57.1429f}, + {52.3809f,47.619f}, + {52.3809f,33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch63st1[] = +{ + {52.3809f,9.5238f}, + {47.619f,4.7619f}, + {52.3809f,0.0f}, + {57.1428f,4.7619f}, + {52.3809f,9.5238f} +}; + +static const Fl_Glut_StrokeStrip ch63st[] = +{ + {14,ch63st0}, + {5,ch63st1} +}; + +static const Fl_Glut_StrokeChar ch63 = {104.762f,2,ch63st}; + +/* char: 0x40 */ + +static const Fl_Glut_StrokeVertex ch64st0[] = +{ + {64.2857f,52.381f}, + {54.7619f,57.1429f}, + {45.2381f,57.1429f}, + {40.4762f,47.619f}, + {40.4762f,42.8571f}, + {45.2381f,33.3333f}, + {54.7619f,33.3333f}, + {64.2857f,38.0952f} +}; + +static const Fl_Glut_StrokeVertex ch64st1[] = +{ + {64.2857f,57.1429f}, + {64.2857f,38.0952f}, + {69.0476f,33.3333f}, + {78.5714f,33.3333f}, + {83.3334f,42.8571f}, + {83.3334f,47.619f}, + {78.5714f,61.9048f}, + {69.0476f,71.4286f}, + {54.7619f,76.1905f}, + {50.0f,76.1905f}, + {35.7143f,71.4286f}, + {26.1905f,61.9048f}, + {21.4286f,47.619f}, + {21.4286f,42.8571f}, + {26.1905f,28.5714f}, + {35.7143f,19.0476f}, + {50.0f,14.2857f}, + {54.7619f,14.2857f}, + {69.0476f,19.0476f} +}; + +static const Fl_Glut_StrokeStrip ch64st[] = +{ + {8,ch64st0}, + {19,ch64st1} +}; + +static const Fl_Glut_StrokeChar ch64 = {104.762f,2,ch64st}; + +/* char: 0x41 */ + +static const Fl_Glut_StrokeVertex ch65st0[] = +{ + {52.3809f,100.0f}, + {14.2857f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch65st1[] = +{ + {52.3809f,100.0f}, + {90.4762f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch65st2[] = +{ + {28.5714f,33.3333f}, + {76.1905f,33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch65st[] = +{ + {2,ch65st0}, + {2,ch65st1}, + {2,ch65st2} +}; + +static const Fl_Glut_StrokeChar ch65 = {104.762f,3,ch65st}; + +/* char: 0x42 */ + +static const Fl_Glut_StrokeVertex ch66st0[] = +{ + {19.0476f,100.0f}, + {19.0476f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch66st1[] = +{ + {19.0476f,100.0f}, + {61.9047f,100.0f}, + {76.1905f,95.2381f}, + {80.9524f,90.4762f}, + {85.7143f,80.9524f}, + {85.7143f,71.4286f}, + {80.9524f,61.9048f}, + {76.1905f,57.1429f}, + {61.9047f,52.381f} +}; + +static const Fl_Glut_StrokeVertex ch66st2[] = +{ + {19.0476f,52.381f}, + {61.9047f,52.381f}, + {76.1905f,47.619f}, + {80.9524f,42.8571f}, + {85.7143f,33.3333f}, + {85.7143f,19.0476f}, + {80.9524f,9.5238f}, + {76.1905f,4.7619f}, + {61.9047f,0.0f}, + {19.0476f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch66st[] = +{ + {2,ch66st0}, + {9,ch66st1}, + {10,ch66st2} +}; + +static const Fl_Glut_StrokeChar ch66 = {104.762f,3,ch66st}; + +/* char: 0x43 */ + +static const Fl_Glut_StrokeVertex ch67st0[] = +{ + {88.0952f,76.1905f}, + {83.3334f,85.7143f}, + {73.8096f,95.2381f}, + {64.2857f,100.0f}, + {45.2381f,100.0f}, + {35.7143f,95.2381f}, + {26.1905f,85.7143f}, + {21.4286f,76.1905f}, + {16.6667f,61.9048f}, + {16.6667f,38.0952f}, + {21.4286f,23.8095f}, + {26.1905f,14.2857f}, + {35.7143f,4.7619f}, + {45.2381f,0.0f}, + {64.2857f,0.0f}, + {73.8096f,4.7619f}, + {83.3334f,14.2857f}, + {88.0952f,23.8095f} +}; + +static const Fl_Glut_StrokeStrip ch67st[] = +{ + {18,ch67st0} +}; + +static const Fl_Glut_StrokeChar ch67 = {104.762f,1,ch67st}; + +/* char: 0x44 */ + +static const Fl_Glut_StrokeVertex ch68st0[] = +{ + {19.0476f,100.0f}, + {19.0476f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch68st1[] = +{ + {19.0476f,100.0f}, + {52.3809f,100.0f}, + {66.6666f,95.2381f}, + {76.1905f,85.7143f}, + {80.9524f,76.1905f}, + {85.7143f,61.9048f}, + {85.7143f,38.0952f}, + {80.9524f,23.8095f}, + {76.1905f,14.2857f}, + {66.6666f,4.7619f}, + {52.3809f,0.0f}, + {19.0476f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch68st[] = +{ + {2,ch68st0}, + {12,ch68st1} +}; + +static const Fl_Glut_StrokeChar ch68 = {104.762f,2,ch68st}; + +/* char: 0x45 */ + +static const Fl_Glut_StrokeVertex ch69st0[] = +{ + {21.4286f,100.0f}, + {21.4286f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch69st1[] = +{ + {21.4286f,100.0f}, + {83.3334f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch69st2[] = +{ + {21.4286f,52.381f}, + {59.5238f,52.381f} +}; + +static const Fl_Glut_StrokeVertex ch69st3[] = +{ + {21.4286f,0.0f}, + {83.3334f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch69st[] = +{ + {2,ch69st0}, + {2,ch69st1}, + {2,ch69st2}, + {2,ch69st3} +}; + +static const Fl_Glut_StrokeChar ch69 = {104.762f,4,ch69st}; + +/* char: 0x46 */ + +static const Fl_Glut_StrokeVertex ch70st0[] = +{ + {21.4286f,100.0f}, + {21.4286f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch70st1[] = +{ + {21.4286f,100.0f}, + {83.3334f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch70st2[] = +{ + {21.4286f,52.381f}, + {59.5238f,52.381f} +}; + +static const Fl_Glut_StrokeStrip ch70st[] = +{ + {2,ch70st0}, + {2,ch70st1}, + {2,ch70st2} +}; + +static const Fl_Glut_StrokeChar ch70 = {104.762f,3,ch70st}; + +/* char: 0x47 */ + +static const Fl_Glut_StrokeVertex ch71st0[] = +{ + {88.0952f,76.1905f}, + {83.3334f,85.7143f}, + {73.8096f,95.2381f}, + {64.2857f,100.0f}, + {45.2381f,100.0f}, + {35.7143f,95.2381f}, + {26.1905f,85.7143f}, + {21.4286f,76.1905f}, + {16.6667f,61.9048f}, + {16.6667f,38.0952f}, + {21.4286f,23.8095f}, + {26.1905f,14.2857f}, + {35.7143f,4.7619f}, + {45.2381f,0.0f}, + {64.2857f,0.0f}, + {73.8096f,4.7619f}, + {83.3334f,14.2857f}, + {88.0952f,23.8095f}, + {88.0952f,38.0952f} +}; + +static const Fl_Glut_StrokeVertex ch71st1[] = +{ + {64.2857f,38.0952f}, + {88.0952f,38.0952f} +}; + +static const Fl_Glut_StrokeStrip ch71st[] = +{ + {19,ch71st0}, + {2,ch71st1} +}; + +static const Fl_Glut_StrokeChar ch71 = {104.762f,2,ch71st}; + +/* char: 0x48 */ + +static const Fl_Glut_StrokeVertex ch72st0[] = +{ + {19.0476f,100.0f}, + {19.0476f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch72st1[] = +{ + {85.7143f,100.0f}, + {85.7143f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch72st2[] = +{ + {19.0476f,52.381f}, + {85.7143f,52.381f} +}; + +static const Fl_Glut_StrokeStrip ch72st[] = +{ + {2,ch72st0}, + {2,ch72st1}, + {2,ch72st2} +}; + +static const Fl_Glut_StrokeChar ch72 = {104.762f,3,ch72st}; + +/* char: 0x49 */ + +static const Fl_Glut_StrokeVertex ch73st0[] = +{ + {52.381f,100.0f}, + {52.381f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch73st[] = +{ + {2,ch73st0} +}; + +static const Fl_Glut_StrokeChar ch73 = {104.762f,1,ch73st}; + +/* char: 0x4a */ + +static const Fl_Glut_StrokeVertex ch74st0[] = +{ + {76.1905f,100.0f}, + {76.1905f,23.8095f}, + {71.4286f,9.5238f}, + {66.6667f,4.7619f}, + {57.1429f,0.0f}, + {47.6191f,0.0f}, + {38.0953f,4.7619f}, + {33.3334f,9.5238f}, + {28.5715f,23.8095f}, + {28.5715f,33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch74st[] = +{ + {10,ch74st0} +}; + +static const Fl_Glut_StrokeChar ch74 = {104.762f,1,ch74st}; + +/* char: 0x4b */ + +static const Fl_Glut_StrokeVertex ch75st0[] = +{ + {19.0476f,100.0f}, + {19.0476f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch75st1[] = +{ + {85.7143f,100.0f}, + {19.0476f,33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch75st2[] = +{ + {42.8571f,57.1429f}, + {85.7143f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch75st[] = +{ + {2,ch75st0}, + {2,ch75st1}, + {2,ch75st2} +}; + +static const Fl_Glut_StrokeChar ch75 = {104.762f,3,ch75st}; + +/* char: 0x4c */ + +static const Fl_Glut_StrokeVertex ch76st0[] = +{ + {23.8095f,100.0f}, + {23.8095f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch76st1[] = +{ + {23.8095f,0.0f}, + {80.9524f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch76st[] = +{ + {2,ch76st0}, + {2,ch76st1} +}; + +static const Fl_Glut_StrokeChar ch76 = {104.762f,2,ch76st}; + +/* char: 0x4d */ + +static const Fl_Glut_StrokeVertex ch77st0[] = +{ + {14.2857f,100.0f}, + {14.2857f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch77st1[] = +{ + {14.2857f,100.0f}, + {52.3809f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch77st2[] = +{ + {90.4762f,100.0f}, + {52.3809f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch77st3[] = +{ + {90.4762f,100.0f}, + {90.4762f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch77st[] = +{ + {2,ch77st0}, + {2,ch77st1}, + {2,ch77st2}, + {2,ch77st3} +}; + +static const Fl_Glut_StrokeChar ch77 = {104.762f,4,ch77st}; + +/* char: 0x4e */ + +static const Fl_Glut_StrokeVertex ch78st0[] = +{ + {19.0476f,100.0f}, + {19.0476f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch78st1[] = +{ + {19.0476f,100.0f}, + {85.7143f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch78st2[] = +{ + {85.7143f,100.0f}, + {85.7143f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch78st[] = +{ + {2,ch78st0}, + {2,ch78st1}, + {2,ch78st2} +}; + +static const Fl_Glut_StrokeChar ch78 = {104.762f,3,ch78st}; + +/* char: 0x4f */ + +static const Fl_Glut_StrokeVertex ch79st0[] = +{ + {42.8571f,100.0f}, + {33.3333f,95.2381f}, + {23.8095f,85.7143f}, + {19.0476f,76.1905f}, + {14.2857f,61.9048f}, + {14.2857f,38.0952f}, + {19.0476f,23.8095f}, + {23.8095f,14.2857f}, + {33.3333f,4.7619f}, + {42.8571f,0.0f}, + {61.9047f,0.0f}, + {71.4286f,4.7619f}, + {80.9524f,14.2857f}, + {85.7143f,23.8095f}, + {90.4762f,38.0952f}, + {90.4762f,61.9048f}, + {85.7143f,76.1905f}, + {80.9524f,85.7143f}, + {71.4286f,95.2381f}, + {61.9047f,100.0f}, + {42.8571f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch79st[] = +{ + {21,ch79st0} +}; + +static const Fl_Glut_StrokeChar ch79 = {104.762f,1,ch79st}; + +/* char: 0x50 */ + +static const Fl_Glut_StrokeVertex ch80st0[] = +{ + {19.0476f,100.0f}, + {19.0476f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch80st1[] = +{ + {19.0476f,100.0f}, + {61.9047f,100.0f}, + {76.1905f,95.2381f}, + {80.9524f,90.4762f}, + {85.7143f,80.9524f}, + {85.7143f,66.6667f}, + {80.9524f,57.1429f}, + {76.1905f,52.381f}, + {61.9047f,47.619f}, + {19.0476f,47.619f} +}; + +static const Fl_Glut_StrokeStrip ch80st[] = +{ + {2,ch80st0}, + {10,ch80st1} +}; + +static const Fl_Glut_StrokeChar ch80 = {104.762f,2,ch80st}; + +/* char: 0x51 */ + +static const Fl_Glut_StrokeVertex ch81st0[] = +{ + {42.8571f,100.0f}, + {33.3333f,95.2381f}, + {23.8095f,85.7143f}, + {19.0476f,76.1905f}, + {14.2857f,61.9048f}, + {14.2857f,38.0952f}, + {19.0476f,23.8095f}, + {23.8095f,14.2857f}, + {33.3333f,4.7619f}, + {42.8571f,0.0f}, + {61.9047f,0.0f}, + {71.4286f,4.7619f}, + {80.9524f,14.2857f}, + {85.7143f,23.8095f}, + {90.4762f,38.0952f}, + {90.4762f,61.9048f}, + {85.7143f,76.1905f}, + {80.9524f,85.7143f}, + {71.4286f,95.2381f}, + {61.9047f,100.0f}, + {42.8571f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch81st1[] = +{ + {57.1428f,19.0476f}, + {85.7143f,-9.5238f} +}; + +static const Fl_Glut_StrokeStrip ch81st[] = +{ + {21,ch81st0}, + {2,ch81st1} +}; + +static const Fl_Glut_StrokeChar ch81 = {104.762f,2,ch81st}; + +/* char: 0x52 */ + +static const Fl_Glut_StrokeVertex ch82st0[] = +{ + {19.0476f,100.0f}, + {19.0476f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch82st1[] = +{ + {19.0476f,100.0f}, + {61.9047f,100.0f}, + {76.1905f,95.2381f}, + {80.9524f,90.4762f}, + {85.7143f,80.9524f}, + {85.7143f,71.4286f}, + {80.9524f,61.9048f}, + {76.1905f,57.1429f}, + {61.9047f,52.381f}, + {19.0476f,52.381f} +}; + +static const Fl_Glut_StrokeVertex ch82st2[] = +{ + {52.3809f,52.381f}, + {85.7143f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch82st[] = +{ + {2,ch82st0}, + {10,ch82st1}, + {2,ch82st2} +}; + +static const Fl_Glut_StrokeChar ch82 = {104.762f,3,ch82st}; + +/* char: 0x53 */ + +static const Fl_Glut_StrokeVertex ch83st0[] = +{ + {85.7143f,85.7143f}, + {76.1905f,95.2381f}, + {61.9047f,100.0f}, + {42.8571f,100.0f}, + {28.5714f,95.2381f}, + {19.0476f,85.7143f}, + {19.0476f,76.1905f}, + {23.8095f,66.6667f}, + {28.5714f,61.9048f}, + {38.0952f,57.1429f}, + {66.6666f,47.619f}, + {76.1905f,42.8571f}, + {80.9524f,38.0952f}, + {85.7143f,28.5714f}, + {85.7143f,14.2857f}, + {76.1905f,4.7619f}, + {61.9047f,0.0f}, + {42.8571f,0.0f}, + {28.5714f,4.7619f}, + {19.0476f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch83st[] = +{ + {20,ch83st0} +}; + +static const Fl_Glut_StrokeChar ch83 = {104.762f,1,ch83st}; + +/* char: 0x54 */ + +static const Fl_Glut_StrokeVertex ch84st0[] = +{ + {52.3809f,100.0f}, + {52.3809f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch84st1[] = +{ + {19.0476f,100.0f}, + {85.7143f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch84st[] = +{ + {2,ch84st0}, + {2,ch84st1} +}; + +static const Fl_Glut_StrokeChar ch84 = {104.762f,2,ch84st}; + +/* char: 0x55 */ + +static const Fl_Glut_StrokeVertex ch85st0[] = +{ + {19.0476f,100.0f}, + {19.0476f,28.5714f}, + {23.8095f,14.2857f}, + {33.3333f,4.7619f}, + {47.619f,0.0f}, + {57.1428f,0.0f}, + {71.4286f,4.7619f}, + {80.9524f,14.2857f}, + {85.7143f,28.5714f}, + {85.7143f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch85st[] = +{ + {10,ch85st0} +}; + +static const Fl_Glut_StrokeChar ch85 = {104.762f,1,ch85st}; + +/* char: 0x56 */ + +static const Fl_Glut_StrokeVertex ch86st0[] = +{ + {14.2857f,100.0f}, + {52.3809f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch86st1[] = +{ + {90.4762f,100.0f}, + {52.3809f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch86st[] = +{ + {2,ch86st0}, + {2,ch86st1} +}; + +static const Fl_Glut_StrokeChar ch86 = {104.762f,2,ch86st}; + +/* char: 0x57 */ + +static const Fl_Glut_StrokeVertex ch87st0[] = +{ + {4.7619f,100.0f}, + {28.5714f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch87st1[] = +{ + {52.3809f,100.0f}, + {28.5714f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch87st2[] = +{ + {52.3809f,100.0f}, + {76.1905f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch87st3[] = +{ + {100.0f,100.0f}, + {76.1905f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch87st[] = +{ + {2,ch87st0}, + {2,ch87st1}, + {2,ch87st2}, + {2,ch87st3} +}; + +static const Fl_Glut_StrokeChar ch87 = {104.762f,4,ch87st}; + +/* char: 0x58 */ + +static const Fl_Glut_StrokeVertex ch88st0[] = +{ + {19.0476f,100.0f}, + {85.7143f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch88st1[] = +{ + {85.7143f,100.0f}, + {19.0476f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch88st[] = +{ + {2,ch88st0}, + {2,ch88st1} +}; + +static const Fl_Glut_StrokeChar ch88 = {104.762f,2,ch88st}; + +/* char: 0x59 */ + +static const Fl_Glut_StrokeVertex ch89st0[] = +{ + {14.2857f,100.0f}, + {52.3809f,52.381f}, + {52.3809f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch89st1[] = +{ + {90.4762f,100.0f}, + {52.3809f,52.381f} +}; + +static const Fl_Glut_StrokeStrip ch89st[] = +{ + {3,ch89st0}, + {2,ch89st1} +}; + +static const Fl_Glut_StrokeChar ch89 = {104.762f,2,ch89st}; + +/* char: 0x5a */ + +static const Fl_Glut_StrokeVertex ch90st0[] = +{ + {85.7143f,100.0f}, + {19.0476f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch90st1[] = +{ + {19.0476f,100.0f}, + {85.7143f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch90st2[] = +{ + {19.0476f,0.0f}, + {85.7143f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch90st[] = +{ + {2,ch90st0}, + {2,ch90st1}, + {2,ch90st2} +}; + +static const Fl_Glut_StrokeChar ch90 = {104.762f,3,ch90st}; + +/* char: 0x5b */ + +static const Fl_Glut_StrokeVertex ch91st0[] = +{ + {35.7143f,119.048f}, + {35.7143f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch91st1[] = +{ + {40.4762f,119.048f}, + {40.4762f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch91st2[] = +{ + {35.7143f,119.048f}, + {69.0476f,119.048f} +}; + +static const Fl_Glut_StrokeVertex ch91st3[] = +{ + {35.7143f,-33.3333f}, + {69.0476f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch91st[] = +{ + {2,ch91st0}, + {2,ch91st1}, + {2,ch91st2}, + {2,ch91st3} +}; + +static const Fl_Glut_StrokeChar ch91 = {104.762f,4,ch91st}; + +/* char: 0x5c */ + +static const Fl_Glut_StrokeVertex ch92st0[] = +{ + {19.0476f,100.0f}, + {85.7143f,-14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch92st[] = +{ + {2,ch92st0} +}; + +static const Fl_Glut_StrokeChar ch92 = {104.762f,1,ch92st}; + +/* char: 0x5d */ + +static const Fl_Glut_StrokeVertex ch93st0[] = +{ + {64.2857f,119.048f}, + {64.2857f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch93st1[] = +{ + {69.0476f,119.048f}, + {69.0476f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch93st2[] = +{ + {35.7143f,119.048f}, + {69.0476f,119.048f} +}; + +static const Fl_Glut_StrokeVertex ch93st3[] = +{ + {35.7143f,-33.3333f}, + {69.0476f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch93st[] = +{ + {2,ch93st0}, + {2,ch93st1}, + {2,ch93st2}, + {2,ch93st3} +}; + +static const Fl_Glut_StrokeChar ch93 = {104.762f,4,ch93st}; + +/* char: 0x5e */ + +static const Fl_Glut_StrokeVertex ch94st0[] = +{ + {52.3809f,109.524f}, + {14.2857f,42.8571f} +}; + +static const Fl_Glut_StrokeVertex ch94st1[] = +{ + {52.3809f,109.524f}, + {90.4762f,42.8571f} +}; + +static const Fl_Glut_StrokeStrip ch94st[] = +{ + {2,ch94st0}, + {2,ch94st1} +}; + +static const Fl_Glut_StrokeChar ch94 = {104.762f,2,ch94st}; + +/* char: 0x5f */ + +static const Fl_Glut_StrokeVertex ch95st0[] = +{ + {0,-33.3333f}, + {104.762f,-33.3333f}, + {104.762f,-28.5714f}, + {0,-28.5714f}, + {0,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch95st[] = +{ + {5,ch95st0} +}; + +static const Fl_Glut_StrokeChar ch95 = {104.762f,1,ch95st}; + +/* char: 0x60 */ + +static const Fl_Glut_StrokeVertex ch96st0[] = +{ + {42.8572f,100.0f}, + {66.6667f,71.4286f} +}; + +static const Fl_Glut_StrokeVertex ch96st1[] = +{ + {42.8572f,100.0f}, + {38.0953f,95.2381f}, + {66.6667f,71.4286f} +}; + +static const Fl_Glut_StrokeStrip ch96st[] = +{ + {2,ch96st0}, + {3,ch96st1} +}; + +static const Fl_Glut_StrokeChar ch96 = {104.762f,2,ch96st}; + +/* char: 0x61 */ + +static const Fl_Glut_StrokeVertex ch97st0[] = +{ + {80.9524f,66.6667f}, + {80.9524f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch97st1[] = +{ + {80.9524f,52.381f}, + {71.4285f,61.9048f}, + {61.9047f,66.6667f}, + {47.619f,66.6667f}, + {38.0952f,61.9048f}, + {28.5714f,52.381f}, + {23.8095f,38.0952f}, + {23.8095f,28.5714f}, + {28.5714f,14.2857f}, + {38.0952f,4.7619f}, + {47.619f,0.0f}, + {61.9047f,0.0f}, + {71.4285f,4.7619f}, + {80.9524f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch97st[] = +{ + {2,ch97st0}, + {14,ch97st1} +}; + +static const Fl_Glut_StrokeChar ch97 = {104.762f,2,ch97st}; + +/* char: 0x62 */ + +static const Fl_Glut_StrokeVertex ch98st0[] = +{ + {23.8095f,100.0f}, + {23.8095f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch98st1[] = +{ + {23.8095f,52.381f}, + {33.3333f,61.9048f}, + {42.8571f,66.6667f}, + {57.1428f,66.6667f}, + {66.6666f,61.9048f}, + {76.1905f,52.381f}, + {80.9524f,38.0952f}, + {80.9524f,28.5714f}, + {76.1905f,14.2857f}, + {66.6666f,4.7619f}, + {57.1428f,0.0f}, + {42.8571f,0.0f}, + {33.3333f,4.7619f}, + {23.8095f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch98st[] = +{ + {2,ch98st0}, + {14,ch98st1} +}; + +static const Fl_Glut_StrokeChar ch98 = {104.762f,2,ch98st}; + +/* char: 0x63 */ + +static const Fl_Glut_StrokeVertex ch99st0[] = +{ + {80.9524f,52.381f}, + {71.4285f,61.9048f}, + {61.9047f,66.6667f}, + {47.619f,66.6667f}, + {38.0952f,61.9048f}, + {28.5714f,52.381f}, + {23.8095f,38.0952f}, + {23.8095f,28.5714f}, + {28.5714f,14.2857f}, + {38.0952f,4.7619f}, + {47.619f,0.0f}, + {61.9047f,0.0f}, + {71.4285f,4.7619f}, + {80.9524f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch99st[] = +{ + {14,ch99st0} +}; + +static const Fl_Glut_StrokeChar ch99 = {104.762f,1,ch99st}; + +/* char: 0x64 */ + +static const Fl_Glut_StrokeVertex ch100st0[] = +{ + {80.9524f,100.0f}, + {80.9524f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch100st1[] = +{ + {80.9524f,52.381f}, + {71.4285f,61.9048f}, + {61.9047f,66.6667f}, + {47.619f,66.6667f}, + {38.0952f,61.9048f}, + {28.5714f,52.381f}, + {23.8095f,38.0952f}, + {23.8095f,28.5714f}, + {28.5714f,14.2857f}, + {38.0952f,4.7619f}, + {47.619f,0.0f}, + {61.9047f,0.0f}, + {71.4285f,4.7619f}, + {80.9524f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch100st[] = +{ + {2,ch100st0}, + {14,ch100st1} +}; + +static const Fl_Glut_StrokeChar ch100 = {104.762f,2,ch100st}; + +/* char: 0x65 */ + +static const Fl_Glut_StrokeVertex ch101st0[] = +{ + {23.8095f,38.0952f}, + {80.9524f,38.0952f}, + {80.9524f,47.619f}, + {76.1905f,57.1429f}, + {71.4285f,61.9048f}, + {61.9047f,66.6667f}, + {47.619f,66.6667f}, + {38.0952f,61.9048f}, + {28.5714f,52.381f}, + {23.8095f,38.0952f}, + {23.8095f,28.5714f}, + {28.5714f,14.2857f}, + {38.0952f,4.7619f}, + {47.619f,0.0f}, + {61.9047f,0.0f}, + {71.4285f,4.7619f}, + {80.9524f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch101st[] = +{ + {17,ch101st0} +}; + +static const Fl_Glut_StrokeChar ch101 = {104.762f,1,ch101st}; + +/* char: 0x66 */ + +static const Fl_Glut_StrokeVertex ch102st0[] = +{ + {71.4286f,100.0f}, + {61.9048f,100.0f}, + {52.381f,95.2381f}, + {47.6191f,80.9524f}, + {47.6191f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch102st1[] = +{ + {33.3334f,66.6667f}, + {66.6667f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch102st[] = +{ + {5,ch102st0}, + {2,ch102st1} +}; + +static const Fl_Glut_StrokeChar ch102 = {104.762f,2,ch102st}; + +/* char: 0x67 */ + +static const Fl_Glut_StrokeVertex ch103st0[] = +{ + {80.9524f,66.6667f}, + {80.9524f,-9.5238f}, + {76.1905f,-23.8095f}, + {71.4285f,-28.5714f}, + {61.9047f,-33.3333f}, + {47.619f,-33.3333f}, + {38.0952f,-28.5714f} +}; + +static const Fl_Glut_StrokeVertex ch103st1[] = +{ + {80.9524f,52.381f}, + {71.4285f,61.9048f}, + {61.9047f,66.6667f}, + {47.619f,66.6667f}, + {38.0952f,61.9048f}, + {28.5714f,52.381f}, + {23.8095f,38.0952f}, + {23.8095f,28.5714f}, + {28.5714f,14.2857f}, + {38.0952f,4.7619f}, + {47.619f,0.0f}, + {61.9047f,0.0f}, + {71.4285f,4.7619f}, + {80.9524f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch103st[] = +{ + {7,ch103st0}, + {14,ch103st1} +}; + +static const Fl_Glut_StrokeChar ch103 = {104.762f,2,ch103st}; + +/* char: 0x68 */ + +static const Fl_Glut_StrokeVertex ch104st0[] = +{ + {26.1905f,100.0f}, + {26.1905f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch104st1[] = +{ + {26.1905f,47.619f}, + {40.4762f,61.9048f}, + {50.0f,66.6667f}, + {64.2857f,66.6667f}, + {73.8095f,61.9048f}, + {78.5715f,47.619f}, + {78.5715f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch104st[] = +{ + {2,ch104st0}, + {7,ch104st1} +}; + +static const Fl_Glut_StrokeChar ch104 = {104.762f,2,ch104st}; + +/* char: 0x69 */ + +static const Fl_Glut_StrokeVertex ch105st0[] = +{ + {47.6191f,100.0f}, + {52.381f,95.2381f}, + {57.1429f,100.0f}, + {52.381f,104.762f}, + {47.6191f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch105st1[] = +{ + {52.381f,66.6667f}, + {52.381f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch105st[] = +{ + {5,ch105st0}, + {2,ch105st1} +}; + +static const Fl_Glut_StrokeChar ch105 = {104.762f,2,ch105st}; + +/* char: 0x6a */ + +static const Fl_Glut_StrokeVertex ch106st0[] = +{ + {57.1429f,100.0f}, + {61.9048f,95.2381f}, + {66.6667f,100.0f}, + {61.9048f,104.762f}, + {57.1429f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch106st1[] = +{ + {61.9048f,66.6667f}, + {61.9048f,-14.2857f}, + {57.1429f,-28.5714f}, + {47.6191f,-33.3333f}, + {38.0953f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch106st[] = +{ + {5,ch106st0}, + {5,ch106st1} +}; + +static const Fl_Glut_StrokeChar ch106 = {104.762f,2,ch106st}; + +/* char: 0x6b */ + +static const Fl_Glut_StrokeVertex ch107st0[] = +{ + {26.1905f,100.0f}, + {26.1905f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch107st1[] = +{ + {73.8095f,66.6667f}, + {26.1905f,19.0476f} +}; + +static const Fl_Glut_StrokeVertex ch107st2[] = +{ + {45.2381f,38.0952f}, + {78.5715f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch107st[] = +{ + {2,ch107st0}, + {2,ch107st1}, + {2,ch107st2} +}; + +static const Fl_Glut_StrokeChar ch107 = {104.762f,3,ch107st}; + +/* char: 0x6c */ + +static const Fl_Glut_StrokeVertex ch108st0[] = +{ + {52.381f,100.0f}, + {52.381f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch108st[] = +{ + {2,ch108st0} +}; + +static const Fl_Glut_StrokeChar ch108 = {104.762f,1,ch108st}; + +/* char: 0x6d */ + +static const Fl_Glut_StrokeVertex ch109st0[] = +{ + {0,66.6667f}, + {0,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch109st1[] = +{ + {0,47.619f}, + {14.2857f,61.9048f}, + {23.8095f,66.6667f}, + {38.0952f,66.6667f}, + {47.619f,61.9048f}, + {52.381f,47.619f}, + {52.381f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch109st2[] = +{ + {52.381f,47.619f}, + {66.6667f,61.9048f}, + {76.1905f,66.6667f}, + {90.4762f,66.6667f}, + {100.0f,61.9048f}, + {104.762f,47.619f}, + {104.762f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch109st[] = +{ + {2,ch109st0}, + {7,ch109st1}, + {7,ch109st2} +}; + +static const Fl_Glut_StrokeChar ch109 = {104.762f,3,ch109st}; + +/* char: 0x6e */ + +static const Fl_Glut_StrokeVertex ch110st0[] = +{ + {26.1905f,66.6667f}, + {26.1905f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch110st1[] = +{ + {26.1905f,47.619f}, + {40.4762f,61.9048f}, + {50.0f,66.6667f}, + {64.2857f,66.6667f}, + {73.8095f,61.9048f}, + {78.5715f,47.619f}, + {78.5715f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch110st[] = +{ + {2,ch110st0}, + {7,ch110st1} +}; + +static const Fl_Glut_StrokeChar ch110 = {104.762f,2,ch110st}; + +/* char: 0x6f */ + +static const Fl_Glut_StrokeVertex ch111st0[] = +{ + {45.2381f,66.6667f}, + {35.7143f,61.9048f}, + {26.1905f,52.381f}, + {21.4286f,38.0952f}, + {21.4286f,28.5714f}, + {26.1905f,14.2857f}, + {35.7143f,4.7619f}, + {45.2381f,0.0f}, + {59.5238f,0.0f}, + {69.0476f,4.7619f}, + {78.5714f,14.2857f}, + {83.3334f,28.5714f}, + {83.3334f,38.0952f}, + {78.5714f,52.381f}, + {69.0476f,61.9048f}, + {59.5238f,66.6667f}, + {45.2381f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch111st[] = +{ + {17,ch111st0} +}; + +static const Fl_Glut_StrokeChar ch111 = {104.762f,1,ch111st}; + +/* char: 0x70 */ + +static const Fl_Glut_StrokeVertex ch112st0[] = +{ + {23.8095f,66.6667f}, + {23.8095f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch112st1[] = +{ + {23.8095f,52.381f}, + {33.3333f,61.9048f}, + {42.8571f,66.6667f}, + {57.1428f,66.6667f}, + {66.6666f,61.9048f}, + {76.1905f,52.381f}, + {80.9524f,38.0952f}, + {80.9524f,28.5714f}, + {76.1905f,14.2857f}, + {66.6666f,4.7619f}, + {57.1428f,0.0f}, + {42.8571f,0.0f}, + {33.3333f,4.7619f}, + {23.8095f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch112st[] = +{ + {2,ch112st0}, + {14,ch112st1} +}; + +static const Fl_Glut_StrokeChar ch112 = {104.762f,2,ch112st}; + +/* char: 0x71 */ + +static const Fl_Glut_StrokeVertex ch113st0[] = +{ + {80.9524f,66.6667f}, + {80.9524f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch113st1[] = +{ + {80.9524f,52.381f}, + {71.4285f,61.9048f}, + {61.9047f,66.6667f}, + {47.619f,66.6667f}, + {38.0952f,61.9048f}, + {28.5714f,52.381f}, + {23.8095f,38.0952f}, + {23.8095f,28.5714f}, + {28.5714f,14.2857f}, + {38.0952f,4.7619f}, + {47.619f,0.0f}, + {61.9047f,0.0f}, + {71.4285f,4.7619f}, + {80.9524f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch113st[] = +{ + {2,ch113st0}, + {14,ch113st1} +}; + +static const Fl_Glut_StrokeChar ch113 = {104.762f,2,ch113st}; + +/* char: 0x72 */ + +static const Fl_Glut_StrokeVertex ch114st0[] = +{ + {33.3334f,66.6667f}, + {33.3334f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch114st1[] = +{ + {33.3334f,38.0952f}, + {38.0953f,52.381f}, + {47.6191f,61.9048f}, + {57.1429f,66.6667f}, + {71.4286f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch114st[] = +{ + {2,ch114st0}, + {5,ch114st1} +}; + +static const Fl_Glut_StrokeChar ch114 = {104.762f,2,ch114st}; + +/* char: 0x73 */ + +static const Fl_Glut_StrokeVertex ch115st0[] = +{ + {78.5715f,52.381f}, + {73.8095f,61.9048f}, + {59.5238f,66.6667f}, + {45.2381f,66.6667f}, + {30.9524f,61.9048f}, + {26.1905f,52.381f}, + {30.9524f,42.8571f}, + {40.4762f,38.0952f}, + {64.2857f,33.3333f}, + {73.8095f,28.5714f}, + {78.5715f,19.0476f}, + {78.5715f,14.2857f}, + {73.8095f,4.7619f}, + {59.5238f,0.0f}, + {45.2381f,0.0f}, + {30.9524f,4.7619f}, + {26.1905f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch115st[] = +{ + {17,ch115st0} +}; + +static const Fl_Glut_StrokeChar ch115 = {104.762f,1,ch115st}; + +/* char: 0x74 */ + +static const Fl_Glut_StrokeVertex ch116st0[] = +{ + {47.6191f,100.0f}, + {47.6191f,19.0476f}, + {52.381f,4.7619f}, + {61.9048f,0.0f}, + {71.4286f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch116st1[] = +{ + {33.3334f,66.6667f}, + {66.6667f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch116st[] = +{ + {5,ch116st0}, + {2,ch116st1} +}; + +static const Fl_Glut_StrokeChar ch116 = {104.762f,2,ch116st}; + +/* char: 0x75 */ + +static const Fl_Glut_StrokeVertex ch117st0[] = +{ + {26.1905f,66.6667f}, + {26.1905f,19.0476f}, + {30.9524f,4.7619f}, + {40.4762f,0.0f}, + {54.7619f,0.0f}, + {64.2857f,4.7619f}, + {78.5715f,19.0476f} +}; + +static const Fl_Glut_StrokeVertex ch117st1[] = +{ + {78.5715f,66.6667f}, + {78.5715f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch117st[] = +{ + {7,ch117st0}, + {2,ch117st1} +}; + +static const Fl_Glut_StrokeChar ch117 = {104.762f,2,ch117st}; + +/* char: 0x76 */ + +static const Fl_Glut_StrokeVertex ch118st0[] = +{ + {23.8095f,66.6667f}, + {52.3809f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch118st1[] = +{ + {80.9524f,66.6667f}, + {52.3809f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch118st[] = +{ + {2,ch118st0}, + {2,ch118st1} +}; + +static const Fl_Glut_StrokeChar ch118 = {104.762f,2,ch118st}; + +/* char: 0x77 */ + +static const Fl_Glut_StrokeVertex ch119st0[] = +{ + {14.2857f,66.6667f}, + {33.3333f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch119st1[] = +{ + {52.3809f,66.6667f}, + {33.3333f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch119st2[] = +{ + {52.3809f,66.6667f}, + {71.4286f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch119st3[] = +{ + {90.4762f,66.6667f}, + {71.4286f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch119st[] = +{ + {2,ch119st0}, + {2,ch119st1}, + {2,ch119st2}, + {2,ch119st3} +}; + +static const Fl_Glut_StrokeChar ch119 = {104.762f,4,ch119st}; + +/* char: 0x78 */ + +static const Fl_Glut_StrokeVertex ch120st0[] = +{ + {26.1905f,66.6667f}, + {78.5715f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch120st1[] = +{ + {78.5715f,66.6667f}, + {26.1905f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch120st[] = +{ + {2,ch120st0}, + {2,ch120st1} +}; + +static const Fl_Glut_StrokeChar ch120 = {104.762f,2,ch120st}; + +/* char: 0x79 */ + +static const Fl_Glut_StrokeVertex ch121st0[] = +{ + {26.1905f,66.6667f}, + {54.7619f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch121st1[] = +{ + {83.3334f,66.6667f}, + {54.7619f,0.0f}, + {45.2381f,-19.0476f}, + {35.7143f,-28.5714f}, + {26.1905f,-33.3333f}, + {21.4286f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch121st[] = +{ + {2,ch121st0}, + {6,ch121st1} +}; + +static const Fl_Glut_StrokeChar ch121 = {104.762f,2,ch121st}; + +/* char: 0x7a */ + +static const Fl_Glut_StrokeVertex ch122st0[] = +{ + {78.5715f,66.6667f}, + {26.1905f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch122st1[] = +{ + {26.1905f,66.6667f}, + {78.5715f,66.6667f} +}; + +static const Fl_Glut_StrokeVertex ch122st2[] = +{ + {26.1905f,0.0f}, + {78.5715f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch122st[] = +{ + {2,ch122st0}, + {2,ch122st1}, + {2,ch122st2} +}; + +static const Fl_Glut_StrokeChar ch122 = {104.762f,3,ch122st}; + +/* char: 0x7b */ + +static const Fl_Glut_StrokeVertex ch123st0[] = +{ + {64.2857f,119.048f}, + {54.7619f,114.286f}, + {50.0f,109.524f}, + {45.2381f,100.0f}, + {45.2381f,90.4762f}, + {50.0f,80.9524f}, + {54.7619f,76.1905f}, + {59.5238f,66.6667f}, + {59.5238f,57.1429f}, + {50.0f,47.619f} +}; + +static const Fl_Glut_StrokeVertex ch123st1[] = +{ + {54.7619f,114.286f}, + {50.0f,104.762f}, + {50.0f,95.2381f}, + {54.7619f,85.7143f}, + {59.5238f,80.9524f}, + {64.2857f,71.4286f}, + {64.2857f,61.9048f}, + {59.5238f,52.381f}, + {40.4762f,42.8571f}, + {59.5238f,33.3333f}, + {64.2857f,23.8095f}, + {64.2857f,14.2857f}, + {59.5238f,4.7619f}, + {54.7619f,0.0f}, + {50.0f,-9.5238f}, + {50.0f,-19.0476f}, + {54.7619f,-28.5714f} +}; + +static const Fl_Glut_StrokeVertex ch123st2[] = +{ + {50.0f,38.0952f}, + {59.5238f,28.5714f}, + {59.5238f,19.0476f}, + {54.7619f,9.5238f}, + {50.0f,4.7619f}, + {45.2381f,-4.7619f}, + {45.2381f,-14.2857f}, + {50.0f,-23.8095f}, + {54.7619f,-28.5714f}, + {64.2857f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch123st[] = +{ + {10,ch123st0}, + {17,ch123st1}, + {10,ch123st2} +}; + +static const Fl_Glut_StrokeChar ch123 = {104.762f,3,ch123st}; + +/* char: 0x7c */ + +static const Fl_Glut_StrokeVertex ch124st0[] = +{ + {52.381f,119.048f}, + {52.381f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch124st[] = +{ + {2,ch124st0} +}; + +static const Fl_Glut_StrokeChar ch124 = {104.762f,1,ch124st}; + +/* char: 0x7d */ + +static const Fl_Glut_StrokeVertex ch125st0[] = +{ + {40.4762f,119.048f}, + {50.0f,114.286f}, + {54.7619f,109.524f}, + {59.5238f,100.0f}, + {59.5238f,90.4762f}, + {54.7619f,80.9524f}, + {50.0f,76.1905f}, + {45.2381f,66.6667f}, + {45.2381f,57.1429f}, + {54.7619f,47.619f} +}; + +static const Fl_Glut_StrokeVertex ch125st1[] = +{ + {50.0f,114.286f}, + {54.7619f,104.762f}, + {54.7619f,95.2381f}, + {50.0f,85.7143f}, + {45.2381f,80.9524f}, + {40.4762f,71.4286f}, + {40.4762f,61.9048f}, + {45.2381f,52.381f}, + {64.2857f,42.8571f}, + {45.2381f,33.3333f}, + {40.4762f,23.8095f}, + {40.4762f,14.2857f}, + {45.2381f,4.7619f}, + {50.0f,0.0f}, + {54.7619f,-9.5238f}, + {54.7619f,-19.0476f}, + {50.0f,-28.5714f} +}; + +static const Fl_Glut_StrokeVertex ch125st2[] = +{ + {54.7619f,38.0952f}, + {45.2381f,28.5714f}, + {45.2381f,19.0476f}, + {50.0f,9.5238f}, + {54.7619f,4.7619f}, + {59.5238f,-4.7619f}, + {59.5238f,-14.2857f}, + {54.7619f,-23.8095f}, + {50.0f,-28.5714f}, + {40.4762f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch125st[] = +{ + {10,ch125st0}, + {17,ch125st1}, + {10,ch125st2} +}; + +static const Fl_Glut_StrokeChar ch125 = {104.762f,3,ch125st}; + +/* char: 0x7e */ + +static const Fl_Glut_StrokeVertex ch126st0[] = +{ + {9.5238f,28.5714f}, + {9.5238f,38.0952f}, + {14.2857f,52.381f}, + {23.8095f,57.1429f}, + {33.3333f,57.1429f}, + {42.8571f,52.381f}, + {61.9048f,38.0952f}, + {71.4286f,33.3333f}, + {80.9524f,33.3333f}, + {90.4762f,38.0952f}, + {95.2381f,47.619f} +}; + +static const Fl_Glut_StrokeVertex ch126st1[] = +{ + {9.5238f,38.0952f}, + {14.2857f,47.619f}, + {23.8095f,52.381f}, + {33.3333f,52.381f}, + {42.8571f,47.619f}, + {61.9048f,33.3333f}, + {71.4286f,28.5714f}, + {80.9524f,28.5714f}, + {90.4762f,33.3333f}, + {95.2381f,47.619f}, + {95.2381f,57.1429f} +}; + +static const Fl_Glut_StrokeStrip ch126st[] = +{ + {11,ch126st0}, + {11,ch126st1} +}; + +static const Fl_Glut_StrokeChar ch126 = {104.762f,2,ch126st}; + +/* char: 0x7f */ + +static const Fl_Glut_StrokeVertex ch127st0[] = +{ + {71.4286f,100.0f}, + {33.3333f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch127st1[] = +{ + {47.619f,66.6667f}, + {33.3333f,61.9048f}, + {23.8095f,52.381f}, + {19.0476f,38.0952f}, + {19.0476f,23.8095f}, + {23.8095f,14.2857f}, + {33.3333f,4.7619f}, + {47.619f,0.0f}, + {57.1428f,0.0f}, + {71.4286f,4.7619f}, + {80.9524f,14.2857f}, + {85.7143f,28.5714f}, + {85.7143f,42.8571f}, + {80.9524f,52.381f}, + {71.4286f,61.9048f}, + {57.1428f,66.6667f}, + {47.619f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch127st[] = +{ + {2,ch127st0}, + {17,ch127st1} +}; + +static const Fl_Glut_StrokeChar ch127 = {104.762f,2,ch127st}; + +static const Fl_Glut_StrokeChar *chars[] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + &ch32, &ch33, &ch34, &ch35, &ch36, &ch37, &ch38, &ch39, + &ch40, &ch41, &ch42, &ch43, &ch44, &ch45, &ch46, &ch47, + &ch48, &ch49, &ch50, &ch51, &ch52, &ch53, &ch54, &ch55, + &ch56, &ch57, &ch58, &ch59, &ch60, &ch61, &ch62, &ch63, + &ch64, &ch65, &ch66, &ch67, &ch68, &ch69, &ch70, &ch71, + &ch72, &ch73, &ch74, &ch75, &ch76, &ch77, &ch78, &ch79, + &ch80, &ch81, &ch82, &ch83, &ch84, &ch85, &ch86, &ch87, + &ch88, &ch89, &ch90, &ch91, &ch92, &ch93, &ch94, &ch95, + &ch96, &ch97, &ch98, &ch99, &ch100, &ch101, &ch102, &ch103, + &ch104, &ch105, &ch106, &ch107, &ch108, &ch109, &ch110, &ch111, + &ch112, &ch113, &ch114, &ch115, &ch116, &ch117, &ch118, &ch119, + &ch120, &ch121, &ch122, &ch123, &ch124, &ch125, &ch126, &ch127 +}; + +Fl_Glut_StrokeFont glutStrokeMonoRoman = {(char *)"MonoRoman",128,152.381f,chars}; diff --git a/third_party/windows/fltk-1.1.10/src/freeglut_stroke_roman.cxx b/third_party/windows/fltk-1.1.10/src/freeglut_stroke_roman.cxx new file mode 100644 index 0000000..1267637 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/freeglut_stroke_roman.cxx @@ -0,0 +1,2848 @@ +/* + * freeglut_stroke_roman.c + * + * freeglut Roman stroke font definition + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * Creation date: Thu Dec 16 1999 + * + * 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 + * PAWEL W. OLSZTA 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 file has been automatically generated by the genstroke utility. */ + +#include + +/* char: 0x20 */ + +static const Fl_Glut_StrokeStrip ch32st[] = +{ + { 0, 0 } +}; + +static const Fl_Glut_StrokeChar ch32 = {104.762f,0,ch32st}; + +/* char: 0x21 */ + +static const Fl_Glut_StrokeVertex ch33st0[] = +{ + {13.3819f,100.0f}, + {13.3819f,33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch33st1[] = +{ + {13.3819f,9.5238f}, + {8.62f,4.7619f}, + {13.3819f,0.0f}, + {18.1438f,4.7619f}, + {13.3819f,9.5238f} +}; + +static const Fl_Glut_StrokeStrip ch33st[] = +{ + {2,ch33st0}, + {5,ch33st1} +}; + +static const Fl_Glut_StrokeChar ch33 = {26.6238f,2,ch33st}; + +/* char: 0x22 */ + +static const Fl_Glut_StrokeVertex ch34st0[] = +{ + {4.02f,100.0f}, + {4.02f,66.6667f} +}; + +static const Fl_Glut_StrokeVertex ch34st1[] = +{ + {42.1152f,100.0f}, + {42.1152f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch34st[] = +{ + {2,ch34st0}, + {2,ch34st1} +}; + +static const Fl_Glut_StrokeChar ch34 = {51.4352f,2,ch34st}; + +/* char: 0x23 */ + +static const Fl_Glut_StrokeVertex ch35st0[] = +{ + {41.2952f,119.048f}, + {7.9619f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch35st1[] = +{ + {69.8667f,119.048f}, + {36.5333f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch35st2[] = +{ + {7.9619f,57.1429f}, + {74.6286f,57.1429f} +}; + +static const Fl_Glut_StrokeVertex ch35st3[] = +{ + {3.2f,28.5714f}, + {69.8667f,28.5714f} +}; + +static const Fl_Glut_StrokeStrip ch35st[] = +{ + {2,ch35st0}, + {2,ch35st1}, + {2,ch35st2}, + {2,ch35st3} +}; + +static const Fl_Glut_StrokeChar ch35 = {79.4886f,4,ch35st}; + +/* char: 0x24 */ + +static const Fl_Glut_StrokeVertex ch36st0[] = +{ + {28.6295f,119.048f}, + {28.6295f,-19.0476f} +}; + +static const Fl_Glut_StrokeVertex ch36st1[] = +{ + {47.6771f,119.048f}, + {47.6771f,-19.0476f} +}; + +static const Fl_Glut_StrokeVertex ch36st2[] = +{ + {71.4867f,85.7143f}, + {61.9629f,95.2381f}, + {47.6771f,100.0f}, + {28.6295f,100.0f}, + {14.3438f,95.2381f}, + {4.82f,85.7143f}, + {4.82f,76.1905f}, + {9.5819f,66.6667f}, + {14.3438f,61.9048f}, + {23.8676f,57.1429f}, + {52.439f,47.619f}, + {61.9629f,42.8571f}, + {66.7248f,38.0952f}, + {71.4867f,28.5714f}, + {71.4867f,14.2857f}, + {61.9629f,4.7619f}, + {47.6771f,0.0f}, + {28.6295f,0.0f}, + {14.3438f,4.7619f}, + {4.82f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch36st[] = +{ + {2,ch36st0}, + {2,ch36st1}, + {20,ch36st2} +}; + +static const Fl_Glut_StrokeChar ch36 = {76.2067f,3,ch36st}; + +/* char: 0x25 */ + +static const Fl_Glut_StrokeVertex ch37st0[] = +{ + {92.0743f,100.0f}, + {6.36f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch37st1[] = +{ + {30.1695f,100.0f}, + {39.6933f,90.4762f}, + {39.6933f,80.9524f}, + {34.9314f,71.4286f}, + {25.4076f,66.6667f}, + {15.8838f,66.6667f}, + {6.36f,76.1905f}, + {6.36f,85.7143f}, + {11.1219f,95.2381f}, + {20.6457f,100.0f}, + {30.1695f,100.0f}, + {39.6933f,95.2381f}, + {53.979f,90.4762f}, + {68.2648f,90.4762f}, + {82.5505f,95.2381f}, + {92.0743f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch37st2[] = +{ + {73.0267f,33.3333f}, + {63.5029f,28.5714f}, + {58.741f,19.0476f}, + {58.741f,9.5238f}, + {68.2648f,0.0f}, + {77.7886f,0.0f}, + {87.3124f,4.7619f}, + {92.0743f,14.2857f}, + {92.0743f,23.8095f}, + {82.5505f,33.3333f}, + {73.0267f,33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch37st[] = +{ + {2,ch37st0}, + {16,ch37st1}, + {11,ch37st2} +}; + +static const Fl_Glut_StrokeChar ch37 = {96.5743f,3,ch37st}; + +/* char: 0x26 */ + +static const Fl_Glut_StrokeVertex ch38st0[] = +{ + {101.218f,57.1429f}, + {101.218f,61.9048f}, + {96.4562f,66.6667f}, + {91.6943f,66.6667f}, + {86.9324f,61.9048f}, + {82.1705f,52.381f}, + {72.6467f,28.5714f}, + {63.1229f,14.2857f}, + {53.599f,4.7619f}, + {44.0752f,0.0f}, + {25.0276f,0.0f}, + {15.5038f,4.7619f}, + {10.7419f,9.5238f}, + {5.98f,19.0476f}, + {5.98f,28.5714f}, + {10.7419f,38.0952f}, + {15.5038f,42.8571f}, + {48.8371f,61.9048f}, + {53.599f,66.6667f}, + {58.361f,76.1905f}, + {58.361f,85.7143f}, + {53.599f,95.2381f}, + {44.0752f,100.0f}, + {34.5514f,95.2381f}, + {29.7895f,85.7143f}, + {29.7895f,76.1905f}, + {34.5514f,61.9048f}, + {44.0752f,47.619f}, + {67.8848f,14.2857f}, + {77.4086f,4.7619f}, + {86.9324f,0.0f}, + {96.4562f,0.0f}, + {101.218f,4.7619f}, + {101.218f,9.5238f} +}; + +static const Fl_Glut_StrokeStrip ch38st[] = +{ + {34,ch38st0} +}; + +static const Fl_Glut_StrokeChar ch38 = {101.758f,1,ch38st}; + +/* char: 0x27 */ + +static const Fl_Glut_StrokeVertex ch39st0[] = +{ + {4.44f,100.0f}, + {4.44f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch39st[] = +{ + {2,ch39st0} +}; + +static const Fl_Glut_StrokeChar ch39 = {13.62f,1,ch39st}; + +/* char: 0x28 */ + +static const Fl_Glut_StrokeVertex ch40st0[] = +{ + {40.9133f,119.048f}, + {31.3895f,109.524f}, + {21.8657f,95.2381f}, + {12.3419f,76.1905f}, + {7.58f,52.381f}, + {7.58f,33.3333f}, + {12.3419f,9.5238f}, + {21.8657f,-9.5238f}, + {31.3895f,-23.8095f}, + {40.9133f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch40st[] = +{ + {10,ch40st0} +}; + +static const Fl_Glut_StrokeChar ch40 = {47.1733f,1,ch40st}; + +/* char: 0x29 */ + +static const Fl_Glut_StrokeVertex ch41st0[] = +{ + {5.28f,119.048f}, + {14.8038f,109.524f}, + {24.3276f,95.2381f}, + {33.8514f,76.1905f}, + {38.6133f,52.381f}, + {38.6133f,33.3333f}, + {33.8514f,9.5238f}, + {24.3276f,-9.5238f}, + {14.8038f,-23.8095f}, + {5.28f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch41st[] = +{ + {10,ch41st0} +}; + +static const Fl_Glut_StrokeChar ch41 = {47.5333f,1,ch41st}; + +/* char: 0x2a */ + +static const Fl_Glut_StrokeVertex ch42st0[] = +{ + {30.7695f,71.4286f}, + {30.7695f,14.2857f} +}; + +static const Fl_Glut_StrokeVertex ch42st1[] = +{ + {6.96f,57.1429f}, + {54.579f,28.5714f} +}; + +static const Fl_Glut_StrokeVertex ch42st2[] = +{ + {54.579f,57.1429f}, + {6.96f,28.5714f} +}; + +static const Fl_Glut_StrokeStrip ch42st[] = +{ + {2,ch42st0}, + {2,ch42st1}, + {2,ch42st2} +}; + +static const Fl_Glut_StrokeChar ch42 = {59.439f,3,ch42st}; + +/* char: 0x2b */ + +static const Fl_Glut_StrokeVertex ch43st0[] = +{ + {48.8371f,85.7143f}, + {48.8371f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch43st1[] = +{ + {5.98f,42.8571f}, + {91.6943f,42.8571f} +}; + +static const Fl_Glut_StrokeStrip ch43st[] = +{ + {2,ch43st0}, + {2,ch43st1} +}; + +static const Fl_Glut_StrokeChar ch43 = {97.2543f,2,ch43st}; + +/* char: 0x2c */ + +static const Fl_Glut_StrokeVertex ch44st0[] = +{ + {18.2838f,4.7619f}, + {13.5219f,0.0f}, + {8.76f,4.7619f}, + {13.5219f,9.5238f}, + {18.2838f,4.7619f}, + {18.2838f,-4.7619f}, + {13.5219f,-14.2857f}, + {8.76f,-19.0476f} +}; + +static const Fl_Glut_StrokeStrip ch44st[] = +{ + {8,ch44st0} +}; + +static const Fl_Glut_StrokeChar ch44 = {26.0638f,1,ch44st}; + +/* char: 0x2d */ + +static const Fl_Glut_StrokeVertex ch45st0[] = +{ + {7.38f,42.8571f}, + {93.0943f,42.8571f} +}; + +static const Fl_Glut_StrokeStrip ch45st[] = +{ + {2,ch45st0} +}; + +static const Fl_Glut_StrokeChar ch45 = {100.754f,1,ch45st}; + +/* char: 0x2e */ + +static const Fl_Glut_StrokeVertex ch46st0[] = +{ + {13.1019f,9.5238f}, + {8.34f,4.7619f}, + {13.1019f,0.0f}, + {17.8638f,4.7619f}, + {13.1019f,9.5238f} +}; + +static const Fl_Glut_StrokeStrip ch46st[] = +{ + {5,ch46st0} +}; + +static const Fl_Glut_StrokeChar ch46 = {26.4838f,1,ch46st}; + +/* char: 0x2f */ + +static const Fl_Glut_StrokeVertex ch47st0[] = +{ + {7.24f,-14.2857f}, + {73.9067f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch47st[] = +{ + {2,ch47st0} +}; + +static const Fl_Glut_StrokeChar ch47 = {82.1067f,1,ch47st}; + +/* char: 0x30 */ + +static const Fl_Glut_StrokeVertex ch48st0[] = +{ + {33.5514f,100.0f}, + {19.2657f,95.2381f}, + {9.7419f,80.9524f}, + {4.98f,57.1429f}, + {4.98f,42.8571f}, + {9.7419f,19.0476f}, + {19.2657f,4.7619f}, + {33.5514f,0.0f}, + {43.0752f,0.0f}, + {57.361f,4.7619f}, + {66.8848f,19.0476f}, + {71.6467f,42.8571f}, + {71.6467f,57.1429f}, + {66.8848f,80.9524f}, + {57.361f,95.2381f}, + {43.0752f,100.0f}, + {33.5514f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch48st[] = +{ + {17,ch48st0} +}; + +static const Fl_Glut_StrokeChar ch48 = {77.0667f,1,ch48st}; + +/* char: 0x31 */ + +static const Fl_Glut_StrokeVertex ch49st0[] = +{ + {11.82f,80.9524f}, + {21.3438f,85.7143f}, + {35.6295f,100.0f}, + {35.6295f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch49st[] = +{ + {4,ch49st0} +}; + +static const Fl_Glut_StrokeChar ch49 = {66.5295f,1,ch49st}; + +/* char: 0x32 */ + +static const Fl_Glut_StrokeVertex ch50st0[] = +{ + {10.1819f,76.1905f}, + {10.1819f,80.9524f}, + {14.9438f,90.4762f}, + {19.7057f,95.2381f}, + {29.2295f,100.0f}, + {48.2771f,100.0f}, + {57.801f,95.2381f}, + {62.5629f,90.4762f}, + {67.3248f,80.9524f}, + {67.3248f,71.4286f}, + {62.5629f,61.9048f}, + {53.039f,47.619f}, + {5.42f,0.0f}, + {72.0867f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch50st[] = +{ + {14,ch50st0} +}; + +static const Fl_Glut_StrokeChar ch50 = {77.6467f,1,ch50st}; + +/* char: 0x33 */ + +static const Fl_Glut_StrokeVertex ch51st0[] = +{ + {14.5238f,100.0f}, + {66.9048f,100.0f}, + {38.3333f,61.9048f}, + {52.619f,61.9048f}, + {62.1429f,57.1429f}, + {66.9048f,52.381f}, + {71.6667f,38.0952f}, + {71.6667f,28.5714f}, + {66.9048f,14.2857f}, + {57.381f,4.7619f}, + {43.0952f,0.0f}, + {28.8095f,0.0f}, + {14.5238f,4.7619f}, + {9.7619f,9.5238f}, + {5.0f,19.0476f} +}; + +static const Fl_Glut_StrokeStrip ch51st[] = +{ + {15,ch51st0} +}; + +static const Fl_Glut_StrokeChar ch51 = {77.0467f,1,ch51st}; + +/* char: 0x34 */ + +static const Fl_Glut_StrokeVertex ch52st0[] = +{ + {51.499f,100.0f}, + {3.88f,33.3333f}, + {75.3086f,33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch52st1[] = +{ + {51.499f,100.0f}, + {51.499f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch52st[] = +{ + {3,ch52st0}, + {2,ch52st1} +}; + +static const Fl_Glut_StrokeChar ch52 = {80.1686f,2,ch52st}; + +/* char: 0x35 */ + +static const Fl_Glut_StrokeVertex ch53st0[] = +{ + {62.0029f,100.0f}, + {14.3838f,100.0f}, + {9.6219f,57.1429f}, + {14.3838f,61.9048f}, + {28.6695f,66.6667f}, + {42.9552f,66.6667f}, + {57.241f,61.9048f}, + {66.7648f,52.381f}, + {71.5267f,38.0952f}, + {71.5267f,28.5714f}, + {66.7648f,14.2857f}, + {57.241f,4.7619f}, + {42.9552f,0.0f}, + {28.6695f,0.0f}, + {14.3838f,4.7619f}, + {9.6219f,9.5238f}, + {4.86f,19.0476f} +}; + +static const Fl_Glut_StrokeStrip ch53st[] = +{ + {17,ch53st0} +}; + +static const Fl_Glut_StrokeChar ch53 = {77.6867f,1,ch53st}; + +/* char: 0x36 */ + +static const Fl_Glut_StrokeVertex ch54st0[] = +{ + {62.7229f,85.7143f}, + {57.961f,95.2381f}, + {43.6752f,100.0f}, + {34.1514f,100.0f}, + {19.8657f,95.2381f}, + {10.3419f,80.9524f}, + {5.58f,57.1429f}, + {5.58f,33.3333f}, + {10.3419f,14.2857f}, + {19.8657f,4.7619f}, + {34.1514f,0.0f}, + {38.9133f,0.0f}, + {53.199f,4.7619f}, + {62.7229f,14.2857f}, + {67.4848f,28.5714f}, + {67.4848f,33.3333f}, + {62.7229f,47.619f}, + {53.199f,57.1429f}, + {38.9133f,61.9048f}, + {34.1514f,61.9048f}, + {19.8657f,57.1429f}, + {10.3419f,47.619f}, + {5.58f,33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch54st[] = +{ + {23,ch54st0} +}; + +static const Fl_Glut_StrokeChar ch54 = {73.8048f,1,ch54st}; + +/* char: 0x37 */ + +static const Fl_Glut_StrokeVertex ch55st0[] = +{ + {72.2267f,100.0f}, + {24.6076f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch55st1[] = +{ + {5.56f,100.0f}, + {72.2267f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch55st[] = +{ + {2,ch55st0}, + {2,ch55st1} +}; + +static const Fl_Glut_StrokeChar ch55 = {77.2267f,2,ch55st}; + +/* char: 0x38 */ + +static const Fl_Glut_StrokeVertex ch56st0[] = +{ + {29.4095f,100.0f}, + {15.1238f,95.2381f}, + {10.3619f,85.7143f}, + {10.3619f,76.1905f}, + {15.1238f,66.6667f}, + {24.6476f,61.9048f}, + {43.6952f,57.1429f}, + {57.981f,52.381f}, + {67.5048f,42.8571f}, + {72.2667f,33.3333f}, + {72.2667f,19.0476f}, + {67.5048f,9.5238f}, + {62.7429f,4.7619f}, + {48.4571f,0.0f}, + {29.4095f,0.0f}, + {15.1238f,4.7619f}, + {10.3619f,9.5238f}, + {5.6f,19.0476f}, + {5.6f,33.3333f}, + {10.3619f,42.8571f}, + {19.8857f,52.381f}, + {34.1714f,57.1429f}, + {53.219f,61.9048f}, + {62.7429f,66.6667f}, + {67.5048f,76.1905f}, + {67.5048f,85.7143f}, + {62.7429f,95.2381f}, + {48.4571f,100.0f}, + {29.4095f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch56st[] = +{ + {29,ch56st0} +}; + +static const Fl_Glut_StrokeChar ch56 = {77.6667f,1,ch56st}; + +/* char: 0x39 */ + +static const Fl_Glut_StrokeVertex ch57st0[] = +{ + {68.5048f,66.6667f}, + {63.7429f,52.381f}, + {54.219f,42.8571f}, + {39.9333f,38.0952f}, + {35.1714f,38.0952f}, + {20.8857f,42.8571f}, + {11.3619f,52.381f}, + {6.6f,66.6667f}, + {6.6f,71.4286f}, + {11.3619f,85.7143f}, + {20.8857f,95.2381f}, + {35.1714f,100.0f}, + {39.9333f,100.0f}, + {54.219f,95.2381f}, + {63.7429f,85.7143f}, + {68.5048f,66.6667f}, + {68.5048f,42.8571f}, + {63.7429f,19.0476f}, + {54.219f,4.7619f}, + {39.9333f,0.0f}, + {30.4095f,0.0f}, + {16.1238f,4.7619f}, + {11.3619f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch57st[] = +{ + {23,ch57st0} +}; + +static const Fl_Glut_StrokeChar ch57 = {74.0648f,1,ch57st}; + +/* char: 0x3a */ + +static const Fl_Glut_StrokeVertex ch58st0[] = +{ + {14.0819f,66.6667f}, + {9.32f,61.9048f}, + {14.0819f,57.1429f}, + {18.8438f,61.9048f}, + {14.0819f,66.6667f} +}; + +static const Fl_Glut_StrokeVertex ch58st1[] = +{ + {14.0819f,9.5238f}, + {9.32f,4.7619f}, + {14.0819f,0.0f}, + {18.8438f,4.7619f}, + {14.0819f,9.5238f} +}; + +static const Fl_Glut_StrokeStrip ch58st[] = +{ + {5,ch58st0}, + {5,ch58st1} +}; + +static const Fl_Glut_StrokeChar ch58 = {26.2238f,2,ch58st}; + +/* char: 0x3b */ + +static const Fl_Glut_StrokeVertex ch59st0[] = +{ + {12.9619f,66.6667f}, + {8.2f,61.9048f}, + {12.9619f,57.1429f}, + {17.7238f,61.9048f}, + {12.9619f,66.6667f} +}; + +static const Fl_Glut_StrokeVertex ch59st1[] = +{ + {17.7238f,4.7619f}, + {12.9619f,0.0f}, + {8.2f,4.7619f}, + {12.9619f,9.5238f}, + {17.7238f,4.7619f}, + {17.7238f,-4.7619f}, + {12.9619f,-14.2857f}, + {8.2f,-19.0476f} +}; + +static const Fl_Glut_StrokeStrip ch59st[] = +{ + {5,ch59st0}, + {8,ch59st1} +}; + +static const Fl_Glut_StrokeChar ch59 = {26.3038f,2,ch59st}; + +/* char: 0x3c */ + +static const Fl_Glut_StrokeVertex ch60st0[] = +{ + {79.2505f,85.7143f}, + {3.06f,42.8571f}, + {79.2505f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch60st[] = +{ + {3,ch60st0} +}; + +static const Fl_Glut_StrokeChar ch60 = {81.6105f,1,ch60st}; + +/* char: 0x3d */ + +static const Fl_Glut_StrokeVertex ch61st0[] = +{ + {5.7f,57.1429f}, + {91.4143f,57.1429f} +}; + +static const Fl_Glut_StrokeVertex ch61st1[] = +{ + {5.7f,28.5714f}, + {91.4143f,28.5714f} +}; + +static const Fl_Glut_StrokeStrip ch61st[] = +{ + {2,ch61st0}, + {2,ch61st1} +}; + +static const Fl_Glut_StrokeChar ch61 = {97.2543f,2,ch61st}; + +/* char: 0x3e */ + +static const Fl_Glut_StrokeVertex ch62st0[] = +{ + {2.78f,85.7143f}, + {78.9705f,42.8571f}, + {2.78f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch62st[] = +{ + {3,ch62st0} +}; + +static const Fl_Glut_StrokeChar ch62 = {81.6105f,1,ch62st}; + +/* char: 0x3f */ + +static const Fl_Glut_StrokeVertex ch63st0[] = +{ + {8.42f,76.1905f}, + {8.42f,80.9524f}, + {13.1819f,90.4762f}, + {17.9438f,95.2381f}, + {27.4676f,100.0f}, + {46.5152f,100.0f}, + {56.039f,95.2381f}, + {60.801f,90.4762f}, + {65.5629f,80.9524f}, + {65.5629f,71.4286f}, + {60.801f,61.9048f}, + {56.039f,57.1429f}, + {36.9914f,47.619f}, + {36.9914f,33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch63st1[] = +{ + {36.9914f,9.5238f}, + {32.2295f,4.7619f}, + {36.9914f,0.0f}, + {41.7533f,4.7619f}, + {36.9914f,9.5238f} +}; + +static const Fl_Glut_StrokeStrip ch63st[] = +{ + {14,ch63st0}, + {5,ch63st1} +}; + +static const Fl_Glut_StrokeChar ch63 = {73.9029f,2,ch63st}; + +/* char: 0x40 */ + +static const Fl_Glut_StrokeVertex ch64st0[] = +{ + {49.2171f,52.381f}, + {39.6933f,57.1429f}, + {30.1695f,57.1429f}, + {25.4076f,47.619f}, + {25.4076f,42.8571f}, + {30.1695f,33.3333f}, + {39.6933f,33.3333f}, + {49.2171f,38.0952f} +}; + +static const Fl_Glut_StrokeVertex ch64st1[] = +{ + {49.2171f,57.1429f}, + {49.2171f,38.0952f}, + {53.979f,33.3333f}, + {63.5029f,33.3333f}, + {68.2648f,42.8571f}, + {68.2648f,47.619f}, + {63.5029f,61.9048f}, + {53.979f,71.4286f}, + {39.6933f,76.1905f}, + {34.9314f,76.1905f}, + {20.6457f,71.4286f}, + {11.1219f,61.9048f}, + {6.36f,47.619f}, + {6.36f,42.8571f}, + {11.1219f,28.5714f}, + {20.6457f,19.0476f}, + {34.9314f,14.2857f}, + {39.6933f,14.2857f}, + {53.979f,19.0476f} +}; + +static const Fl_Glut_StrokeStrip ch64st[] = +{ + {8,ch64st0}, + {19,ch64st1} +}; + +static const Fl_Glut_StrokeChar ch64 = {74.3648f,2,ch64st}; + +/* char: 0x41 */ + +static const Fl_Glut_StrokeVertex ch65st0[] = +{ + {40.5952f,100.0f}, + {2.5f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch65st1[] = +{ + {40.5952f,100.0f}, + {78.6905f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch65st2[] = +{ + {16.7857f,33.3333f}, + {64.4048f,33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch65st[] = +{ + {2,ch65st0}, + {2,ch65st1}, + {2,ch65st2} +}; + +static const Fl_Glut_StrokeChar ch65 = {80.4905f,3,ch65st}; + +/* char: 0x42 */ + +static const Fl_Glut_StrokeVertex ch66st0[] = +{ + {11.42f,100.0f}, + {11.42f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch66st1[] = +{ + {11.42f,100.0f}, + {54.2771f,100.0f}, + {68.5629f,95.2381f}, + {73.3248f,90.4762f}, + {78.0867f,80.9524f}, + {78.0867f,71.4286f}, + {73.3248f,61.9048f}, + {68.5629f,57.1429f}, + {54.2771f,52.381f} +}; + +static const Fl_Glut_StrokeVertex ch66st2[] = +{ + {11.42f,52.381f}, + {54.2771f,52.381f}, + {68.5629f,47.619f}, + {73.3248f,42.8571f}, + {78.0867f,33.3333f}, + {78.0867f,19.0476f}, + {73.3248f,9.5238f}, + {68.5629f,4.7619f}, + {54.2771f,0.0f}, + {11.42f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch66st[] = +{ + {2,ch66st0}, + {9,ch66st1}, + {10,ch66st2} +}; + +static const Fl_Glut_StrokeChar ch66 = {83.6267f,3,ch66st}; + +/* char: 0x43 */ + +static const Fl_Glut_StrokeVertex ch67st0[] = +{ + {78.0886f,76.1905f}, + {73.3267f,85.7143f}, + {63.8029f,95.2381f}, + {54.279f,100.0f}, + {35.2314f,100.0f}, + {25.7076f,95.2381f}, + {16.1838f,85.7143f}, + {11.4219f,76.1905f}, + {6.66f,61.9048f}, + {6.66f,38.0952f}, + {11.4219f,23.8095f}, + {16.1838f,14.2857f}, + {25.7076f,4.7619f}, + {35.2314f,0.0f}, + {54.279f,0.0f}, + {63.8029f,4.7619f}, + {73.3267f,14.2857f}, + {78.0886f,23.8095f} +}; + +static const Fl_Glut_StrokeStrip ch67st[] = +{ + {18,ch67st0} +}; + +static const Fl_Glut_StrokeChar ch67 = {84.4886f,1,ch67st}; + +/* char: 0x44 */ + +static const Fl_Glut_StrokeVertex ch68st0[] = +{ + {11.96f,100.0f}, + {11.96f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch68st1[] = +{ + {11.96f,100.0f}, + {45.2933f,100.0f}, + {59.579f,95.2381f}, + {69.1029f,85.7143f}, + {73.8648f,76.1905f}, + {78.6267f,61.9048f}, + {78.6267f,38.0952f}, + {73.8648f,23.8095f}, + {69.1029f,14.2857f}, + {59.579f,4.7619f}, + {45.2933f,0.0f}, + {11.96f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch68st[] = +{ + {2,ch68st0}, + {12,ch68st1} +}; + +static const Fl_Glut_StrokeChar ch68 = {85.2867f,2,ch68st}; + +/* char: 0x45 */ + +static const Fl_Glut_StrokeVertex ch69st0[] = +{ + {11.42f,100.0f}, + {11.42f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch69st1[] = +{ + {11.42f,100.0f}, + {73.3248f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch69st2[] = +{ + {11.42f,52.381f}, + {49.5152f,52.381f} +}; + +static const Fl_Glut_StrokeVertex ch69st3[] = +{ + {11.42f,0.0f}, + {73.3248f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch69st[] = +{ + {2,ch69st0}, + {2,ch69st1}, + {2,ch69st2}, + {2,ch69st3} +}; + +static const Fl_Glut_StrokeChar ch69 = {78.1848f,4,ch69st}; + +/* char: 0x46 */ + +static const Fl_Glut_StrokeVertex ch70st0[] = +{ + {11.42f,100.0f}, + {11.42f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch70st1[] = +{ + {11.42f,100.0f}, + {73.3248f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch70st2[] = +{ + {11.42f,52.381f}, + {49.5152f,52.381f} +}; + +static const Fl_Glut_StrokeStrip ch70st[] = +{ + {2,ch70st0}, + {2,ch70st1}, + {2,ch70st2} +}; + +static const Fl_Glut_StrokeChar ch70 = {78.7448f,3,ch70st}; + +/* char: 0x47 */ + +static const Fl_Glut_StrokeVertex ch71st0[] = +{ + {78.4886f,76.1905f}, + {73.7267f,85.7143f}, + {64.2029f,95.2381f}, + {54.679f,100.0f}, + {35.6314f,100.0f}, + {26.1076f,95.2381f}, + {16.5838f,85.7143f}, + {11.8219f,76.1905f}, + {7.06f,61.9048f}, + {7.06f,38.0952f}, + {11.8219f,23.8095f}, + {16.5838f,14.2857f}, + {26.1076f,4.7619f}, + {35.6314f,0.0f}, + {54.679f,0.0f}, + {64.2029f,4.7619f}, + {73.7267f,14.2857f}, + {78.4886f,23.8095f}, + {78.4886f,38.0952f} +}; + +static const Fl_Glut_StrokeVertex ch71st1[] = +{ + {54.679f,38.0952f}, + {78.4886f,38.0952f} +}; + +static const Fl_Glut_StrokeStrip ch71st[] = +{ + {19,ch71st0}, + {2,ch71st1} +}; + +static const Fl_Glut_StrokeChar ch71 = {89.7686f,2,ch71st}; + +/* char: 0x48 */ + +static const Fl_Glut_StrokeVertex ch72st0[] = +{ + {11.42f,100.0f}, + {11.42f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch72st1[] = +{ + {78.0867f,100.0f}, + {78.0867f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch72st2[] = +{ + {11.42f,52.381f}, + {78.0867f,52.381f} +}; + +static const Fl_Glut_StrokeStrip ch72st[] = +{ + {2,ch72st0}, + {2,ch72st1}, + {2,ch72st2} +}; + +static const Fl_Glut_StrokeChar ch72 = {89.0867f,3,ch72st}; + +/* char: 0x49 */ + +static const Fl_Glut_StrokeVertex ch73st0[] = +{ + {10.86f,100.0f}, + {10.86f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch73st[] = +{ + {2,ch73st0} +}; + +static const Fl_Glut_StrokeChar ch73 = {21.3f,1,ch73st}; + +/* char: 0x4a */ + +static const Fl_Glut_StrokeVertex ch74st0[] = +{ + {50.119f,100.0f}, + {50.119f,23.8095f}, + {45.3571f,9.5238f}, + {40.5952f,4.7619f}, + {31.0714f,0.0f}, + {21.5476f,0.0f}, + {12.0238f,4.7619f}, + {7.2619f,9.5238f}, + {2.5f,23.8095f}, + {2.5f,33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch74st[] = +{ + {10,ch74st0} +}; + +static const Fl_Glut_StrokeChar ch74 = {59.999f,1,ch74st}; + +/* char: 0x4b */ + +static const Fl_Glut_StrokeVertex ch75st0[] = +{ + {11.28f,100.0f}, + {11.28f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch75st1[] = +{ + {77.9467f,100.0f}, + {11.28f,33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch75st2[] = +{ + {35.0895f,57.1429f}, + {77.9467f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch75st[] = +{ + {2,ch75st0}, + {2,ch75st1}, + {2,ch75st2} +}; + +static const Fl_Glut_StrokeChar ch75 = {79.3267f,3,ch75st}; + +/* char: 0x4c */ + +static const Fl_Glut_StrokeVertex ch76st0[] = +{ + {11.68f,100.0f}, + {11.68f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch76st1[] = +{ + {11.68f,0.0f}, + {68.8229f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch76st[] = +{ + {2,ch76st0}, + {2,ch76st1} +}; + +static const Fl_Glut_StrokeChar ch76 = {71.3229f,2,ch76st}; + +/* char: 0x4d */ + +static const Fl_Glut_StrokeVertex ch77st0[] = +{ + {10.86f,100.0f}, + {10.86f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch77st1[] = +{ + {10.86f,100.0f}, + {48.9552f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch77st2[] = +{ + {87.0505f,100.0f}, + {48.9552f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch77st3[] = +{ + {87.0505f,100.0f}, + {87.0505f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch77st[] = +{ + {2,ch77st0}, + {2,ch77st1}, + {2,ch77st2}, + {2,ch77st3} +}; + +static const Fl_Glut_StrokeChar ch77 = {97.2105f,4,ch77st}; + +/* char: 0x4e */ + +static const Fl_Glut_StrokeVertex ch78st0[] = +{ + {11.14f,100.0f}, + {11.14f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch78st1[] = +{ + {11.14f,100.0f}, + {77.8067f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch78st2[] = +{ + {77.8067f,100.0f}, + {77.8067f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch78st[] = +{ + {2,ch78st0}, + {2,ch78st1}, + {2,ch78st2} +}; + +static const Fl_Glut_StrokeChar ch78 = {88.8067f,3,ch78st}; + +/* char: 0x4f */ + +static const Fl_Glut_StrokeVertex ch79st0[] = +{ + {34.8114f,100.0f}, + {25.2876f,95.2381f}, + {15.7638f,85.7143f}, + {11.0019f,76.1905f}, + {6.24f,61.9048f}, + {6.24f,38.0952f}, + {11.0019f,23.8095f}, + {15.7638f,14.2857f}, + {25.2876f,4.7619f}, + {34.8114f,0.0f}, + {53.859f,0.0f}, + {63.3829f,4.7619f}, + {72.9067f,14.2857f}, + {77.6686f,23.8095f}, + {82.4305f,38.0952f}, + {82.4305f,61.9048f}, + {77.6686f,76.1905f}, + {72.9067f,85.7143f}, + {63.3829f,95.2381f}, + {53.859f,100.0f}, + {34.8114f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch79st[] = +{ + {21,ch79st0} +}; + +static const Fl_Glut_StrokeChar ch79 = {88.8305f,1,ch79st}; + +/* char: 0x50 */ + +static const Fl_Glut_StrokeVertex ch80st0[] = +{ + {12.1f,100.0f}, + {12.1f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch80st1[] = +{ + {12.1f,100.0f}, + {54.9571f,100.0f}, + {69.2429f,95.2381f}, + {74.0048f,90.4762f}, + {78.7667f,80.9524f}, + {78.7667f,66.6667f}, + {74.0048f,57.1429f}, + {69.2429f,52.381f}, + {54.9571f,47.619f}, + {12.1f,47.619f} +}; + +static const Fl_Glut_StrokeStrip ch80st[] = +{ + {2,ch80st0}, + {10,ch80st1} +}; + +static const Fl_Glut_StrokeChar ch80 = {85.6667f,2,ch80st}; + +/* char: 0x51 */ + +static const Fl_Glut_StrokeVertex ch81st0[] = +{ + {33.8714f,100.0f}, + {24.3476f,95.2381f}, + {14.8238f,85.7143f}, + {10.0619f,76.1905f}, + {5.3f,61.9048f}, + {5.3f,38.0952f}, + {10.0619f,23.8095f}, + {14.8238f,14.2857f}, + {24.3476f,4.7619f}, + {33.8714f,0.0f}, + {52.919f,0.0f}, + {62.4429f,4.7619f}, + {71.9667f,14.2857f}, + {76.7286f,23.8095f}, + {81.4905f,38.0952f}, + {81.4905f,61.9048f}, + {76.7286f,76.1905f}, + {71.9667f,85.7143f}, + {62.4429f,95.2381f}, + {52.919f,100.0f}, + {33.8714f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch81st1[] = +{ + {48.1571f,19.0476f}, + {76.7286f,-9.5238f} +}; + +static const Fl_Glut_StrokeStrip ch81st[] = +{ + {21,ch81st0}, + {2,ch81st1} +}; + +static const Fl_Glut_StrokeChar ch81 = {88.0905f,2,ch81st}; + +/* char: 0x52 */ + +static const Fl_Glut_StrokeVertex ch82st0[] = +{ + {11.68f,100.0f}, + {11.68f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch82st1[] = +{ + {11.68f,100.0f}, + {54.5371f,100.0f}, + {68.8229f,95.2381f}, + {73.5848f,90.4762f}, + {78.3467f,80.9524f}, + {78.3467f,71.4286f}, + {73.5848f,61.9048f}, + {68.8229f,57.1429f}, + {54.5371f,52.381f}, + {11.68f,52.381f} +}; + +static const Fl_Glut_StrokeVertex ch82st2[] = +{ + {45.0133f,52.381f}, + {78.3467f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch82st[] = +{ + {2,ch82st0}, + {10,ch82st1}, + {2,ch82st2} +}; + +static const Fl_Glut_StrokeChar ch82 = {82.3667f,3,ch82st}; + +/* char: 0x53 */ + +static const Fl_Glut_StrokeVertex ch83st0[] = +{ + {74.6667f,85.7143f}, + {65.1429f,95.2381f}, + {50.8571f,100.0f}, + {31.8095f,100.0f}, + {17.5238f,95.2381f}, + {8.0f,85.7143f}, + {8.0f,76.1905f}, + {12.7619f,66.6667f}, + {17.5238f,61.9048f}, + {27.0476f,57.1429f}, + {55.619f,47.619f}, + {65.1429f,42.8571f}, + {69.9048f,38.0952f}, + {74.6667f,28.5714f}, + {74.6667f,14.2857f}, + {65.1429f,4.7619f}, + {50.8571f,0.0f}, + {31.8095f,0.0f}, + {17.5238f,4.7619f}, + {8.0f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch83st[] = +{ + {20,ch83st0} +}; + +static const Fl_Glut_StrokeChar ch83 = {80.8267f,1,ch83st}; + +/* char: 0x54 */ + +static const Fl_Glut_StrokeVertex ch84st0[] = +{ + {35.6933f,100.0f}, + {35.6933f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch84st1[] = +{ + {2.36f,100.0f}, + {69.0267f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch84st[] = +{ + {2,ch84st0}, + {2,ch84st1} +}; + +static const Fl_Glut_StrokeChar ch84 = {71.9467f,2,ch84st}; + +/* char: 0x55 */ + +static const Fl_Glut_StrokeVertex ch85st0[] = +{ + {11.54f,100.0f}, + {11.54f,28.5714f}, + {16.3019f,14.2857f}, + {25.8257f,4.7619f}, + {40.1114f,0.0f}, + {49.6352f,0.0f}, + {63.921f,4.7619f}, + {73.4448f,14.2857f}, + {78.2067f,28.5714f}, + {78.2067f,100.0f} +}; + +static const Fl_Glut_StrokeStrip ch85st[] = +{ + {10,ch85st0} +}; + +static const Fl_Glut_StrokeChar ch85 = {89.4867f,1,ch85st}; + +/* char: 0x56 */ + +static const Fl_Glut_StrokeVertex ch86st0[] = +{ + {2.36f,100.0f}, + {40.4552f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch86st1[] = +{ + {78.5505f,100.0f}, + {40.4552f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch86st[] = +{ + {2,ch86st0}, + {2,ch86st1} +}; + +static const Fl_Glut_StrokeChar ch86 = {81.6105f,2,ch86st}; + +/* char: 0x57 */ + +static const Fl_Glut_StrokeVertex ch87st0[] = +{ + {2.22f,100.0f}, + {26.0295f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch87st1[] = +{ + {49.839f,100.0f}, + {26.0295f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch87st2[] = +{ + {49.839f,100.0f}, + {73.6486f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch87st3[] = +{ + {97.4581f,100.0f}, + {73.6486f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch87st[] = +{ + {2,ch87st0}, + {2,ch87st1}, + {2,ch87st2}, + {2,ch87st3} +}; + +static const Fl_Glut_StrokeChar ch87 = {100.518f,4,ch87st}; + +/* char: 0x58 */ + +static const Fl_Glut_StrokeVertex ch88st0[] = +{ + {2.5f,100.0f}, + {69.1667f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch88st1[] = +{ + {69.1667f,100.0f}, + {2.5f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch88st[] = +{ + {2,ch88st0}, + {2,ch88st1} +}; + +static const Fl_Glut_StrokeChar ch88 = {72.3667f,2,ch88st}; + +/* char: 0x59 */ + +static const Fl_Glut_StrokeVertex ch89st0[] = +{ + {1.52f,100.0f}, + {39.6152f,52.381f}, + {39.6152f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch89st1[] = +{ + {77.7105f,100.0f}, + {39.6152f,52.381f} +}; + +static const Fl_Glut_StrokeStrip ch89st[] = +{ + {3,ch89st0}, + {2,ch89st1} +}; + +static const Fl_Glut_StrokeChar ch89 = {79.6505f,2,ch89st}; + +/* char: 0x5a */ + +static const Fl_Glut_StrokeVertex ch90st0[] = +{ + {69.1667f,100.0f}, + {2.5f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch90st1[] = +{ + {2.5f,100.0f}, + {69.1667f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch90st2[] = +{ + {2.5f,0.0f}, + {69.1667f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch90st[] = +{ + {2,ch90st0}, + {2,ch90st1}, + {2,ch90st2} +}; + +static const Fl_Glut_StrokeChar ch90 = {73.7467f,3,ch90st}; + +/* char: 0x5b */ + +static const Fl_Glut_StrokeVertex ch91st0[] = +{ + {7.78f,119.048f}, + {7.78f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch91st1[] = +{ + {12.5419f,119.048f}, + {12.5419f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch91st2[] = +{ + {7.78f,119.048f}, + {41.1133f,119.048f} +}; + +static const Fl_Glut_StrokeVertex ch91st3[] = +{ + {7.78f,-33.3333f}, + {41.1133f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch91st[] = +{ + {2,ch91st0}, + {2,ch91st1}, + {2,ch91st2}, + {2,ch91st3} +}; + +static const Fl_Glut_StrokeChar ch91 = {46.1133f,4,ch91st}; + +/* char: 0x5c */ + +static const Fl_Glut_StrokeVertex ch92st0[] = +{ + {5.84f,100.0f}, + {72.5067f,-14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch92st[] = +{ + {2,ch92st0} +}; + +static const Fl_Glut_StrokeChar ch92 = {78.2067f,1,ch92st}; + +/* char: 0x5d */ + +static const Fl_Glut_StrokeVertex ch93st0[] = +{ + {33.0114f,119.048f}, + {33.0114f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch93st1[] = +{ + {37.7733f,119.048f}, + {37.7733f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch93st2[] = +{ + {4.44f,119.048f}, + {37.7733f,119.048f} +}; + +static const Fl_Glut_StrokeVertex ch93st3[] = +{ + {4.44f,-33.3333f}, + {37.7733f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch93st[] = +{ + {2,ch93st0}, + {2,ch93st1}, + {2,ch93st2}, + {2,ch93st3} +}; + +static const Fl_Glut_StrokeChar ch93 = {46.3933f,4,ch93st}; + +/* char: 0x5e */ + +static const Fl_Glut_StrokeVertex ch94st0[] = +{ + {44.0752f,109.524f}, + {5.98f,42.8571f} +}; + +static const Fl_Glut_StrokeVertex ch94st1[] = +{ + {44.0752f,109.524f}, + {82.1705f,42.8571f} +}; + +static const Fl_Glut_StrokeStrip ch94st[] = +{ + {2,ch94st0}, + {2,ch94st1} +}; + +static const Fl_Glut_StrokeChar ch94 = {90.2305f,2,ch94st}; + +/* char: 0x5f */ + +static const Fl_Glut_StrokeVertex ch95st0[] = +{ + {-1.1f,-33.3333f}, + {103.662f,-33.3333f}, + {103.662f,-28.5714f}, + {-1.1f,-28.5714f}, + {-1.1f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch95st[] = +{ + {5,ch95st0} +}; + +static const Fl_Glut_StrokeChar ch95 = {104.062f,1,ch95st}; + +/* char: 0x60 */ + +static const Fl_Glut_StrokeVertex ch96st0[] = +{ + {33.0219f,100.0f}, + {56.8314f,71.4286f} +}; + +static const Fl_Glut_StrokeVertex ch96st1[] = +{ + {33.0219f,100.0f}, + {28.26f,95.2381f}, + {56.8314f,71.4286f} +}; + +static const Fl_Glut_StrokeStrip ch96st[] = +{ + {2,ch96st0}, + {3,ch96st1} +}; + +static const Fl_Glut_StrokeChar ch96 = {83.5714f,2,ch96st}; + +/* char: 0x61 */ + +static const Fl_Glut_StrokeVertex ch97st0[] = +{ + {63.8229f,66.6667f}, + {63.8229f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch97st1[] = +{ + {63.8229f,52.381f}, + {54.299f,61.9048f}, + {44.7752f,66.6667f}, + {30.4895f,66.6667f}, + {20.9657f,61.9048f}, + {11.4419f,52.381f}, + {6.68f,38.0952f}, + {6.68f,28.5714f}, + {11.4419f,14.2857f}, + {20.9657f,4.7619f}, + {30.4895f,0.0f}, + {44.7752f,0.0f}, + {54.299f,4.7619f}, + {63.8229f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch97st[] = +{ + {2,ch97st0}, + {14,ch97st1} +}; + +static const Fl_Glut_StrokeChar ch97 = {66.6029f,2,ch97st}; + +/* char: 0x62 */ + +static const Fl_Glut_StrokeVertex ch98st0[] = +{ + {8.76f,100.0f}, + {8.76f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch98st1[] = +{ + {8.76f,52.381f}, + {18.2838f,61.9048f}, + {27.8076f,66.6667f}, + {42.0933f,66.6667f}, + {51.6171f,61.9048f}, + {61.141f,52.381f}, + {65.9029f,38.0952f}, + {65.9029f,28.5714f}, + {61.141f,14.2857f}, + {51.6171f,4.7619f}, + {42.0933f,0.0f}, + {27.8076f,0.0f}, + {18.2838f,4.7619f}, + {8.76f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch98st[] = +{ + {2,ch98st0}, + {14,ch98st1} +}; + +static const Fl_Glut_StrokeChar ch98 = {70.4629f,2,ch98st}; + +/* char: 0x63 */ + +static const Fl_Glut_StrokeVertex ch99st0[] = +{ + {62.6629f,52.381f}, + {53.139f,61.9048f}, + {43.6152f,66.6667f}, + {29.3295f,66.6667f}, + {19.8057f,61.9048f}, + {10.2819f,52.381f}, + {5.52f,38.0952f}, + {5.52f,28.5714f}, + {10.2819f,14.2857f}, + {19.8057f,4.7619f}, + {29.3295f,0.0f}, + {43.6152f,0.0f}, + {53.139f,4.7619f}, + {62.6629f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch99st[] = +{ + {14,ch99st0} +}; + +static const Fl_Glut_StrokeChar ch99 = {68.9229f,1,ch99st}; + +/* char: 0x64 */ + +static const Fl_Glut_StrokeVertex ch100st0[] = +{ + {61.7829f,100.0f}, + {61.7829f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch100st1[] = +{ + {61.7829f,52.381f}, + {52.259f,61.9048f}, + {42.7352f,66.6667f}, + {28.4495f,66.6667f}, + {18.9257f,61.9048f}, + {9.4019f,52.381f}, + {4.64f,38.0952f}, + {4.64f,28.5714f}, + {9.4019f,14.2857f}, + {18.9257f,4.7619f}, + {28.4495f,0.0f}, + {42.7352f,0.0f}, + {52.259f,4.7619f}, + {61.7829f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch100st[] = +{ + {2,ch100st0}, + {14,ch100st1} +}; + +static const Fl_Glut_StrokeChar ch100 = {70.2629f,2,ch100st}; + +/* char: 0x65 */ + +static const Fl_Glut_StrokeVertex ch101st0[] = +{ + {5.72f,38.0952f}, + {62.8629f,38.0952f}, + {62.8629f,47.619f}, + {58.101f,57.1429f}, + {53.339f,61.9048f}, + {43.8152f,66.6667f}, + {29.5295f,66.6667f}, + {20.0057f,61.9048f}, + {10.4819f,52.381f}, + {5.72f,38.0952f}, + {5.72f,28.5714f}, + {10.4819f,14.2857f}, + {20.0057f,4.7619f}, + {29.5295f,0.0f}, + {43.8152f,0.0f}, + {53.339f,4.7619f}, + {62.8629f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch101st[] = +{ + {17,ch101st0} +}; + +static const Fl_Glut_StrokeChar ch101 = {68.5229f,1,ch101st}; + +/* char: 0x66 */ + +static const Fl_Glut_StrokeVertex ch102st0[] = +{ + {38.7752f,100.0f}, + {29.2514f,100.0f}, + {19.7276f,95.2381f}, + {14.9657f,80.9524f}, + {14.9657f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch102st1[] = +{ + {0.68f,66.6667f}, + {34.0133f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch102st[] = +{ + {5,ch102st0}, + {2,ch102st1} +}; + +static const Fl_Glut_StrokeChar ch102 = {38.6552f,2,ch102st}; + +/* char: 0x67 */ + +static const Fl_Glut_StrokeVertex ch103st0[] = +{ + {62.5029f,66.6667f}, + {62.5029f,-9.5238f}, + {57.741f,-23.8095f}, + {52.979f,-28.5714f}, + {43.4552f,-33.3333f}, + {29.1695f,-33.3333f}, + {19.6457f,-28.5714f} +}; + +static const Fl_Glut_StrokeVertex ch103st1[] = +{ + {62.5029f,52.381f}, + {52.979f,61.9048f}, + {43.4552f,66.6667f}, + {29.1695f,66.6667f}, + {19.6457f,61.9048f}, + {10.1219f,52.381f}, + {5.36f,38.0952f}, + {5.36f,28.5714f}, + {10.1219f,14.2857f}, + {19.6457f,4.7619f}, + {29.1695f,0.0f}, + {43.4552f,0.0f}, + {52.979f,4.7619f}, + {62.5029f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch103st[] = +{ + {7,ch103st0}, + {14,ch103st1} +}; + +static const Fl_Glut_StrokeChar ch103 = {70.9829f,2,ch103st}; + +/* char: 0x68 */ + +static const Fl_Glut_StrokeVertex ch104st0[] = +{ + {9.6f,100.0f}, + {9.6f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch104st1[] = +{ + {9.6f,47.619f}, + {23.8857f,61.9048f}, + {33.4095f,66.6667f}, + {47.6952f,66.6667f}, + {57.219f,61.9048f}, + {61.981f,47.619f}, + {61.981f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch104st[] = +{ + {2,ch104st0}, + {7,ch104st1} +}; + +static const Fl_Glut_StrokeChar ch104 = {71.021f,2,ch104st}; + +/* char: 0x69 */ + +static const Fl_Glut_StrokeVertex ch105st0[] = +{ + {10.02f,100.0f}, + {14.7819f,95.2381f}, + {19.5438f,100.0f}, + {14.7819f,104.762f}, + {10.02f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch105st1[] = +{ + {14.7819f,66.6667f}, + {14.7819f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch105st[] = +{ + {5,ch105st0}, + {2,ch105st1} +}; + +static const Fl_Glut_StrokeChar ch105 = {28.8638f,2,ch105st}; + +/* char: 0x6a */ + +static const Fl_Glut_StrokeVertex ch106st0[] = +{ + {17.3876f,100.0f}, + {22.1495f,95.2381f}, + {26.9114f,100.0f}, + {22.1495f,104.762f}, + {17.3876f,100.0f} +}; + +static const Fl_Glut_StrokeVertex ch106st1[] = +{ + {22.1495f,66.6667f}, + {22.1495f,-14.2857f}, + {17.3876f,-28.5714f}, + {7.8638f,-33.3333f}, + {-1.66f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch106st[] = +{ + {5,ch106st0}, + {5,ch106st1} +}; + +static const Fl_Glut_StrokeChar ch106 = {36.2314f,2,ch106st}; + +/* char: 0x6b */ + +static const Fl_Glut_StrokeVertex ch107st0[] = +{ + {9.6f,100.0f}, + {9.6f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch107st1[] = +{ + {57.219f,66.6667f}, + {9.6f,19.0476f} +}; + +static const Fl_Glut_StrokeVertex ch107st2[] = +{ + {28.6476f,38.0952f}, + {61.981f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch107st[] = +{ + {2,ch107st0}, + {2,ch107st1}, + {2,ch107st2} +}; + +static const Fl_Glut_StrokeChar ch107 = {62.521f,3,ch107st}; + +/* char: 0x6c */ + +static const Fl_Glut_StrokeVertex ch108st0[] = +{ + {10.02f,100.0f}, + {10.02f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch108st[] = +{ + {2,ch108st0} +}; + +static const Fl_Glut_StrokeChar ch108 = {19.34f,1,ch108st}; + +/* char: 0x6d */ + +static const Fl_Glut_StrokeVertex ch109st0[] = +{ + {9.6f,66.6667f}, + {9.6f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch109st1[] = +{ + {9.6f,47.619f}, + {23.8857f,61.9048f}, + {33.4095f,66.6667f}, + {47.6952f,66.6667f}, + {57.219f,61.9048f}, + {61.981f,47.619f}, + {61.981f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch109st2[] = +{ + {61.981f,47.619f}, + {76.2667f,61.9048f}, + {85.7905f,66.6667f}, + {100.076f,66.6667f}, + {109.6f,61.9048f}, + {114.362f,47.619f}, + {114.362f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch109st[] = +{ + {2,ch109st0}, + {7,ch109st1}, + {7,ch109st2} +}; + +static const Fl_Glut_StrokeChar ch109 = {123.962f,3,ch109st}; + +/* char: 0x6e */ + +static const Fl_Glut_StrokeVertex ch110st0[] = +{ + {9.18f,66.6667f}, + {9.18f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch110st1[] = +{ + {9.18f,47.619f}, + {23.4657f,61.9048f}, + {32.9895f,66.6667f}, + {47.2752f,66.6667f}, + {56.799f,61.9048f}, + {61.561f,47.619f}, + {61.561f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch110st[] = +{ + {2,ch110st0}, + {7,ch110st1} +}; + +static const Fl_Glut_StrokeChar ch110 = {70.881f,2,ch110st}; + +/* char: 0x6f */ + +static const Fl_Glut_StrokeVertex ch111st0[] = +{ + {28.7895f,66.6667f}, + {19.2657f,61.9048f}, + {9.7419f,52.381f}, + {4.98f,38.0952f}, + {4.98f,28.5714f}, + {9.7419f,14.2857f}, + {19.2657f,4.7619f}, + {28.7895f,0.0f}, + {43.0752f,0.0f}, + {52.599f,4.7619f}, + {62.1229f,14.2857f}, + {66.8848f,28.5714f}, + {66.8848f,38.0952f}, + {62.1229f,52.381f}, + {52.599f,61.9048f}, + {43.0752f,66.6667f}, + {28.7895f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch111st[] = +{ + {17,ch111st0} +}; + +static const Fl_Glut_StrokeChar ch111 = {71.7448f,1,ch111st}; + +/* char: 0x70 */ + +static const Fl_Glut_StrokeVertex ch112st0[] = +{ + {9.46f,66.6667f}, + {9.46f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch112st1[] = +{ + {9.46f,52.381f}, + {18.9838f,61.9048f}, + {28.5076f,66.6667f}, + {42.7933f,66.6667f}, + {52.3171f,61.9048f}, + {61.841f,52.381f}, + {66.6029f,38.0952f}, + {66.6029f,28.5714f}, + {61.841f,14.2857f}, + {52.3171f,4.7619f}, + {42.7933f,0.0f}, + {28.5076f,0.0f}, + {18.9838f,4.7619f}, + {9.46f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch112st[] = +{ + {2,ch112st0}, + {14,ch112st1} +}; + +static const Fl_Glut_StrokeChar ch112 = {70.8029f,2,ch112st}; + +/* char: 0x71 */ + +static const Fl_Glut_StrokeVertex ch113st0[] = +{ + {61.9829f,66.6667f}, + {61.9829f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch113st1[] = +{ + {61.9829f,52.381f}, + {52.459f,61.9048f}, + {42.9352f,66.6667f}, + {28.6495f,66.6667f}, + {19.1257f,61.9048f}, + {9.6019f,52.381f}, + {4.84f,38.0952f}, + {4.84f,28.5714f}, + {9.6019f,14.2857f}, + {19.1257f,4.7619f}, + {28.6495f,0.0f}, + {42.9352f,0.0f}, + {52.459f,4.7619f}, + {61.9829f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch113st[] = +{ + {2,ch113st0}, + {14,ch113st1} +}; + +static const Fl_Glut_StrokeChar ch113 = {70.7429f,2,ch113st}; + +/* char: 0x72 */ + +static const Fl_Glut_StrokeVertex ch114st0[] = +{ + {9.46f,66.6667f}, + {9.46f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch114st1[] = +{ + {9.46f,38.0952f}, + {14.2219f,52.381f}, + {23.7457f,61.9048f}, + {33.2695f,66.6667f}, + {47.5552f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch114st[] = +{ + {2,ch114st0}, + {5,ch114st1} +}; + +static const Fl_Glut_StrokeChar ch114 = {49.4952f,2,ch114st}; + +/* char: 0x73 */ + +static const Fl_Glut_StrokeVertex ch115st0[] = +{ + {57.081f,52.381f}, + {52.319f,61.9048f}, + {38.0333f,66.6667f}, + {23.7476f,66.6667f}, + {9.4619f,61.9048f}, + {4.7f,52.381f}, + {9.4619f,42.8571f}, + {18.9857f,38.0952f}, + {42.7952f,33.3333f}, + {52.319f,28.5714f}, + {57.081f,19.0476f}, + {57.081f,14.2857f}, + {52.319f,4.7619f}, + {38.0333f,0.0f}, + {23.7476f,0.0f}, + {9.4619f,4.7619f}, + {4.7f,14.2857f} +}; + +static const Fl_Glut_StrokeStrip ch115st[] = +{ + {17,ch115st0} +}; + +static const Fl_Glut_StrokeChar ch115 = {62.321f,1,ch115st}; + +/* char: 0x74 */ + +static const Fl_Glut_StrokeVertex ch116st0[] = +{ + {14.8257f,100.0f}, + {14.8257f,19.0476f}, + {19.5876f,4.7619f}, + {29.1114f,0.0f}, + {38.6352f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch116st1[] = +{ + {0.54f,66.6667f}, + {33.8733f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch116st[] = +{ + {5,ch116st0}, + {2,ch116st1} +}; + +static const Fl_Glut_StrokeChar ch116 = {39.3152f,2,ch116st}; + +/* char: 0x75 */ + +static const Fl_Glut_StrokeVertex ch117st0[] = +{ + {9.46f,66.6667f}, + {9.46f,19.0476f}, + {14.2219f,4.7619f}, + {23.7457f,0.0f}, + {38.0314f,0.0f}, + {47.5552f,4.7619f}, + {61.841f,19.0476f} +}; + +static const Fl_Glut_StrokeVertex ch117st1[] = +{ + {61.841f,66.6667f}, + {61.841f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch117st[] = +{ + {7,ch117st0}, + {2,ch117st1} +}; + +static const Fl_Glut_StrokeChar ch117 = {71.161f,2,ch117st}; + +/* char: 0x76 */ + +static const Fl_Glut_StrokeVertex ch118st0[] = +{ + {1.8f,66.6667f}, + {30.3714f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch118st1[] = +{ + {58.9429f,66.6667f}, + {30.3714f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch118st[] = +{ + {2,ch118st0}, + {2,ch118st1} +}; + +static const Fl_Glut_StrokeChar ch118 = {60.6029f,2,ch118st}; + +/* char: 0x77 */ + +static const Fl_Glut_StrokeVertex ch119st0[] = +{ + {2.5f,66.6667f}, + {21.5476f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch119st1[] = +{ + {40.5952f,66.6667f}, + {21.5476f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch119st2[] = +{ + {40.5952f,66.6667f}, + {59.6429f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch119st3[] = +{ + {78.6905f,66.6667f}, + {59.6429f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch119st[] = +{ + {2,ch119st0}, + {2,ch119st1}, + {2,ch119st2}, + {2,ch119st3} +}; + +static const Fl_Glut_StrokeChar ch119 = {80.4905f,4,ch119st}; + +/* char: 0x78 */ + +static const Fl_Glut_StrokeVertex ch120st0[] = +{ + {1.66f,66.6667f}, + {54.041f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch120st1[] = +{ + {54.041f,66.6667f}, + {1.66f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch120st[] = +{ + {2,ch120st0}, + {2,ch120st1} +}; + +static const Fl_Glut_StrokeChar ch120 = {56.401f,2,ch120st}; + +/* char: 0x79 */ + +static const Fl_Glut_StrokeVertex ch121st0[] = +{ + {6.5619f,66.6667f}, + {35.1333f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch121st1[] = +{ + {63.7048f,66.6667f}, + {35.1333f,0.0f}, + {25.6095f,-19.0476f}, + {16.0857f,-28.5714f}, + {6.5619f,-33.3333f}, + {1.8f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch121st[] = +{ + {2,ch121st0}, + {6,ch121st1} +}; + +static const Fl_Glut_StrokeChar ch121 = {66.0648f,2,ch121st}; + +/* char: 0x7a */ + +static const Fl_Glut_StrokeVertex ch122st0[] = +{ + {56.821f,66.6667f}, + {4.44f,0.0f} +}; + +static const Fl_Glut_StrokeVertex ch122st1[] = +{ + {4.44f,66.6667f}, + {56.821f,66.6667f} +}; + +static const Fl_Glut_StrokeVertex ch122st2[] = +{ + {4.44f,0.0f}, + {56.821f,0.0f} +}; + +static const Fl_Glut_StrokeStrip ch122st[] = +{ + {2,ch122st0}, + {2,ch122st1}, + {2,ch122st2} +}; + +static const Fl_Glut_StrokeChar ch122 = {61.821f,3,ch122st}; + +/* char: 0x7b */ + +static const Fl_Glut_StrokeVertex ch123st0[] = +{ + {31.1895f,119.048f}, + {21.6657f,114.286f}, + {16.9038f,109.524f}, + {12.1419f,100.0f}, + {12.1419f,90.4762f}, + {16.9038f,80.9524f}, + {21.6657f,76.1905f}, + {26.4276f,66.6667f}, + {26.4276f,57.1429f}, + {16.9038f,47.619f} +}; + +static const Fl_Glut_StrokeVertex ch123st1[] = +{ + {21.6657f,114.286f}, + {16.9038f,104.762f}, + {16.9038f,95.2381f}, + {21.6657f,85.7143f}, + {26.4276f,80.9524f}, + {31.1895f,71.4286f}, + {31.1895f,61.9048f}, + {26.4276f,52.381f}, + {7.38f,42.8571f}, + {26.4276f,33.3333f}, + {31.1895f,23.8095f}, + {31.1895f,14.2857f}, + {26.4276f,4.7619f}, + {21.6657f,0.0f}, + {16.9038f,-9.5238f}, + {16.9038f,-19.0476f}, + {21.6657f,-28.5714f} +}; + +static const Fl_Glut_StrokeVertex ch123st2[] = +{ + {16.9038f,38.0952f}, + {26.4276f,28.5714f}, + {26.4276f,19.0476f}, + {21.6657f,9.5238f}, + {16.9038f,4.7619f}, + {12.1419f,-4.7619f}, + {12.1419f,-14.2857f}, + {16.9038f,-23.8095f}, + {21.6657f,-28.5714f}, + {31.1895f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch123st[] = +{ + {10,ch123st0}, + {17,ch123st1}, + {10,ch123st2} +}; + +static const Fl_Glut_StrokeChar ch123 = {41.6295f,3,ch123st}; + +/* char: 0x7c */ + +static const Fl_Glut_StrokeVertex ch124st0[] = +{ + {11.54f,119.048f}, + {11.54f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch124st[] = +{ + {2,ch124st0} +}; + +static const Fl_Glut_StrokeChar ch124 = {23.78f,1,ch124st}; + +/* char: 0x7d */ + +static const Fl_Glut_StrokeVertex ch125st0[] = +{ + {9.18f,119.048f}, + {18.7038f,114.286f}, + {23.4657f,109.524f}, + {28.2276f,100.0f}, + {28.2276f,90.4762f}, + {23.4657f,80.9524f}, + {18.7038f,76.1905f}, + {13.9419f,66.6667f}, + {13.9419f,57.1429f}, + {23.4657f,47.619f} +}; + +static const Fl_Glut_StrokeVertex ch125st1[] = +{ + {18.7038f,114.286f}, + {23.4657f,104.762f}, + {23.4657f,95.2381f}, + {18.7038f,85.7143f}, + {13.9419f,80.9524f}, + {9.18f,71.4286f}, + {9.18f,61.9048f}, + {13.9419f,52.381f}, + {32.9895f,42.8571f}, + {13.9419f,33.3333f}, + {9.18f,23.8095f}, + {9.18f,14.2857f}, + {13.9419f,4.7619f}, + {18.7038f,0.0f}, + {23.4657f,-9.5238f}, + {23.4657f,-19.0476f}, + {18.7038f,-28.5714f} +}; + +static const Fl_Glut_StrokeVertex ch125st2[] = +{ + {23.4657f,38.0952f}, + {13.9419f,28.5714f}, + {13.9419f,19.0476f}, + {18.7038f,9.5238f}, + {23.4657f,4.7619f}, + {28.2276f,-4.7619f}, + {28.2276f,-14.2857f}, + {23.4657f,-23.8095f}, + {18.7038f,-28.5714f}, + {9.18f,-33.3333f} +}; + +static const Fl_Glut_StrokeStrip ch125st[] = +{ + {10,ch125st0}, + {17,ch125st1}, + {10,ch125st2} +}; + +static const Fl_Glut_StrokeChar ch125 = {41.4695f,3,ch125st}; + +/* char: 0x7e */ + +static const Fl_Glut_StrokeVertex ch126st0[] = +{ + {2.92f,28.5714f}, + {2.92f,38.0952f}, + {7.6819f,52.381f}, + {17.2057f,57.1429f}, + {26.7295f,57.1429f}, + {36.2533f,52.381f}, + {55.301f,38.0952f}, + {64.8248f,33.3333f}, + {74.3486f,33.3333f}, + {83.8724f,38.0952f}, + {88.6343f,47.619f} +}; + +static const Fl_Glut_StrokeVertex ch126st1[] = +{ + {2.92f,38.0952f}, + {7.6819f,47.619f}, + {17.2057f,52.381f}, + {26.7295f,52.381f}, + {36.2533f,47.619f}, + {55.301f,33.3333f}, + {64.8248f,28.5714f}, + {74.3486f,28.5714f}, + {83.8724f,33.3333f}, + {88.6343f,47.619f}, + {88.6343f,57.1429f} +}; + +static const Fl_Glut_StrokeStrip ch126st[] = +{ + {11,ch126st0}, + {11,ch126st1} +}; + +static const Fl_Glut_StrokeChar ch126 = {91.2743f,2,ch126st}; + +/* char: 0x7f */ + +static const Fl_Glut_StrokeVertex ch127st0[] = +{ + {52.381f,100.0f}, + {14.2857f,-33.3333f} +}; + +static const Fl_Glut_StrokeVertex ch127st1[] = +{ + {28.5714f,66.6667f}, + {14.2857f,61.9048f}, + {4.7619f,52.381f}, + {0.0f,38.0952f}, + {0.0f,23.8095f}, + {4.7619f,14.2857f}, + {14.2857f,4.7619f}, + {28.5714f,0.0f}, + {38.0952f,0.0f}, + {52.381f,4.7619f}, + {61.9048f,14.2857f}, + {66.6667f,28.5714f}, + {66.6667f,42.8571f}, + {61.9048f,52.381f}, + {52.381f,61.9048f}, + {38.0952f,66.6667f}, + {28.5714f,66.6667f} +}; + +static const Fl_Glut_StrokeStrip ch127st[] = +{ + {2,ch127st0}, + {17,ch127st1} +}; + +static const Fl_Glut_StrokeChar ch127 = {66.6667f,2,ch127st}; + +static const Fl_Glut_StrokeChar *chars[] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + &ch32, &ch33, &ch34, &ch35, &ch36, &ch37, &ch38, &ch39, + &ch40, &ch41, &ch42, &ch43, &ch44, &ch45, &ch46, &ch47, + &ch48, &ch49, &ch50, &ch51, &ch52, &ch53, &ch54, &ch55, + &ch56, &ch57, &ch58, &ch59, &ch60, &ch61, &ch62, &ch63, + &ch64, &ch65, &ch66, &ch67, &ch68, &ch69, &ch70, &ch71, + &ch72, &ch73, &ch74, &ch75, &ch76, &ch77, &ch78, &ch79, + &ch80, &ch81, &ch82, &ch83, &ch84, &ch85, &ch86, &ch87, + &ch88, &ch89, &ch90, &ch91, &ch92, &ch93, &ch94, &ch95, + &ch96, &ch97, &ch98, &ch99, &ch100, &ch101, &ch102, &ch103, + &ch104, &ch105, &ch106, &ch107, &ch108, &ch109, &ch110, &ch111, + &ch112, &ch113, &ch114, &ch115, &ch116, &ch117, &ch118, &ch119, + &ch120, &ch121, &ch122, &ch123, &ch124, &ch125, &ch126, &ch127 +}; + +Fl_Glut_StrokeFont glutStrokeRoman = {(char *)"Roman",128,152.381f,chars}; diff --git a/third_party/windows/fltk-1.1.10/src/freeglut_teapot.cxx b/third_party/windows/fltk-1.1.10/src/freeglut_teapot.cxx new file mode 100644 index 0000000..bdb5f00 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/freeglut_teapot.cxx @@ -0,0 +1,164 @@ +/* + * freeglut_teapot.c + * + * Teapot(tm) rendering code. + * + * Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + * Written by Pawel W. Olszta, + * Creation date: Fri Dec 24 1999 + * + * 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 + * PAWEL W. OLSZTA 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. + */ + +/* + * Original teapot code copyright follows: + */ + +/* + * (c) Copyright 1993, Silicon Graphics, Inc. + * + * ALL RIGHTS RESERVED + * + * Permission to use, copy, modify, and distribute this software + * for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that + * both the copyright notice and this permission notice appear in + * supporting documentation, and that the name of Silicon + * Graphics, Inc. not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. + * + * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU + * "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR + * OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO + * EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE + * ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER, + * INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE, + * SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR + * NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * US Government Users Restricted Rights + * + * Use, duplication, or disclosure by the Government is subject to + * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph + * (c)(1)(ii) of the Rights in Technical Data and Computer + * Software clause at DFARS 252.227-7013 and/or in similar or + * successor clauses in the FAR or the DOD or NASA FAR + * Supplement. Unpublished-- rights reserved under the copyright + * laws of the United States. Contractor/manufacturer is Silicon + * Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA + * 94039-7311. + * + * OpenGL(TM) is a trademark of Silicon Graphics, Inc. + */ + +#include +#include "freeglut_teapot_data.h" + +/* -- PRIVATE FUNCTIONS ---------------------------------------------------- */ + + +static void fghTeapot( GLint grid, GLdouble scale, GLenum type ) +{ + double p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3]; + long i, j, k, l; + + glPushAttrib( GL_ENABLE_BIT | GL_EVAL_BIT ); + glEnable( GL_AUTO_NORMAL ); + glEnable( GL_NORMALIZE ); + glEnable( GL_MAP2_VERTEX_3 ); + glEnable( GL_MAP2_TEXTURE_COORD_2 ); + + glPushMatrix(); + glRotated( 270.0, 1.0, 0.0, 0.0 ); + glScaled( 0.5 * scale, 0.5 * scale, 0.5 * scale ); + glTranslated( 0.0, 0.0, -1.5 ); + + for (i = 0; i < 10; i++) { + for (j = 0; j < 4; j++) { + for (k = 0; k < 4; k++) { + for (l = 0; l < 3; l++) { + p[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l]; + q[j][k][l] = cpdata[patchdata[i][j * 4 + (3 - k)]][l]; + if (l == 1) + q[j][k][l] *= -1.0; + if (i < 6) { + r[j][k][l] = + cpdata[patchdata[i][j * 4 + (3 - k)]][l]; + if (l == 0) + r[j][k][l] *= -1.0; + s[j][k][l] = cpdata[patchdata[i][j * 4 + k]][l]; + if (l == 0) + s[j][k][l] *= -1.0; + if (l == 1) + s[j][k][l] *= -1.0; + } + } + } + } + + glMap2d(GL_MAP2_TEXTURE_COORD_2, 0.0, 1.0, 2, 2, 0.0, 1.0, 4, 2, + &tex[0][0][0]); + glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, + &p[0][0][0]); + glMapGrid2d(grid, 0.0, 1.0, grid, 0.0, 1.0); + glEvalMesh2(type, 0, grid, 0, grid); + glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, + &q[0][0][0]); + glEvalMesh2(type, 0, grid, 0, grid); + if (i < 6) { + glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, + &r[0][0][0]); + glEvalMesh2(type, 0, grid, 0, grid); + glMap2d(GL_MAP2_VERTEX_3, 0.0, 1.0, 3, 4, 0.0, 1.0, 12, 4, + &s[0][0][0]); + glEvalMesh2(type, 0, grid, 0, grid); + } + } + + glPopMatrix(); + glPopAttrib(); +} + + +/* -- INTERFACE FUNCTIONS -------------------------------------------------- */ + +/* + * Renders a beautiful wired teapot... + */ +void glutWireTeapot( GLdouble size ) +{ + /* We will use the general teapot rendering code */ + fghTeapot( 10, size, GL_LINE ); +} + +/* + * Renders a beautiful filled teapot... + */ +void glutSolidTeapot( GLdouble size ) +{ + /* We will use the general teapot rendering code */ + fghTeapot( 7, size, GL_FILL ); +} + +/*** END OF FILE ***/ diff --git a/third_party/windows/fltk-1.1.10/src/freeglut_teapot_data.h b/third_party/windows/fltk-1.1.10/src/freeglut_teapot_data.h new file mode 100644 index 0000000..83b6c38 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/freeglut_teapot_data.h @@ -0,0 +1,145 @@ +/* + * freeglut_teapot_data.h + * + * The freeglut library teapot data include file. + * + * 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 + * PAWEL W. OLSZTA 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. + */ + +#ifndef FREEGLUT_TEAPOT_DATA_H +#define FREEGLUT_TEAPOT_DATA_H + +/* + * Original teapot code copyright follows: + */ + +/* + * (c) Copyright 1993, Silicon Graphics, Inc. + * + * ALL RIGHTS RESERVED + * + * Permission to use, copy, modify, and distribute this software + * for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that + * both the copyright notice and this permission notice appear in + * supporting documentation, and that the name of Silicon + * Graphics, Inc. not be used in advertising or publicity + * pertaining to distribution of the software without specific, + * written prior permission. + * + * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU + * "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR + * OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. IN NO + * EVENT SHALL SILICON GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE + * ELSE FOR ANY DIRECT, SPECIAL, INCIDENTAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER, + * INCLUDING WITHOUT LIMITATION, LOSS OF PROFIT, LOSS OF USE, + * SAVINGS OR REVENUE, OR THE CLAIMS OF THIRD PARTIES, WHETHER OR + * NOT SILICON GRAPHICS, INC. HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * ARISING OUT OF OR IN CONNECTION WITH THE POSSESSION, USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * US Government Users Restricted Rights + * + * Use, duplication, or disclosure by the Government is subject to + * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph + * (c)(1)(ii) of the Rights in Technical Data and Computer + * Software clause at DFARS 252.227-7013 and/or in similar or + * successor clauses in the FAR or the DOD or NASA FAR + * Supplement. Unpublished-- rights reserved under the copyright + * laws of the United States. Contractor/manufacturer is Silicon + * Graphics, Inc., 2011 N. Shoreline Blvd., Mountain View, CA + * 94039-7311. + * + * OpenGL(TM) is a trademark of Silicon Graphics, Inc. + */ + +/* + * Rim, body, lid, and bottom data must be reflected in x and y; + * handle and spout data across the y axis only. + */ +static int patchdata[][16] = +{ + { 102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, /* rim */ + { 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 }, /* body */ + { 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 }, + { 96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101, 101, 0, 1, 2, 3 }, /* lid */ + { 0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117 }, + { 118, 118, 118, 118, 124, 122, 119, 121, 123, 126, 125, 120, 40, 39, 38, 37 }, /* bottom */ + { 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56 }, /* handle */ + { 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 28, 65, 66, 67 }, + { 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83 }, /* spout */ + { 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95 } +}; + +static double cpdata[][3] = +{ + {0.2, 0, 2.7}, {0.2, -0.112, 2.7}, {0.112, -0.2, 2.7}, {0, + -0.2, 2.7}, {1.3375, 0, 2.53125}, {1.3375, -0.749, 2.53125}, + {0.749, -1.3375, 2.53125}, {0, -1.3375, 2.53125}, {1.4375, + 0, 2.53125}, {1.4375, -0.805, 2.53125}, {0.805, -1.4375, + 2.53125}, {0, -1.4375, 2.53125}, {1.5, 0, 2.4}, {1.5, -0.84, + 2.4}, {0.84, -1.5, 2.4}, {0, -1.5, 2.4}, {1.75, 0, 1.875}, + {1.75, -0.98, 1.875}, {0.98, -1.75, 1.875}, {0, -1.75, + 1.875}, {2, 0, 1.35}, {2, -1.12, 1.35}, {1.12, -2, 1.35}, + {0, -2, 1.35}, {2, 0, 0.9}, {2, -1.12, 0.9}, {1.12, -2, + 0.9}, {0, -2, 0.9}, {-2, 0, 0.9}, {2, 0, 0.45}, {2, -1.12, + 0.45}, {1.12, -2, 0.45}, {0, -2, 0.45}, {1.5, 0, 0.225}, + {1.5, -0.84, 0.225}, {0.84, -1.5, 0.225}, {0, -1.5, 0.225}, + {1.5, 0, 0.15}, {1.5, -0.84, 0.15}, {0.84, -1.5, 0.15}, {0, + -1.5, 0.15}, {-1.6, 0, 2.025}, {-1.6, -0.3, 2.025}, {-1.5, + -0.3, 2.25}, {-1.5, 0, 2.25}, {-2.3, 0, 2.025}, {-2.3, -0.3, + 2.025}, {-2.5, -0.3, 2.25}, {-2.5, 0, 2.25}, {-2.7, 0, + 2.025}, {-2.7, -0.3, 2.025}, {-3, -0.3, 2.25}, {-3, 0, + 2.25}, {-2.7, 0, 1.8}, {-2.7, -0.3, 1.8}, {-3, -0.3, 1.8}, + {-3, 0, 1.8}, {-2.7, 0, 1.575}, {-2.7, -0.3, 1.575}, {-3, + -0.3, 1.35}, {-3, 0, 1.35}, {-2.5, 0, 1.125}, {-2.5, -0.3, + 1.125}, {-2.65, -0.3, 0.9375}, {-2.65, 0, 0.9375}, {-2, + -0.3, 0.9}, {-1.9, -0.3, 0.6}, {-1.9, 0, 0.6}, {1.7, 0, + 1.425}, {1.7, -0.66, 1.425}, {1.7, -0.66, 0.6}, {1.7, 0, + 0.6}, {2.6, 0, 1.425}, {2.6, -0.66, 1.425}, {3.1, -0.66, + 0.825}, {3.1, 0, 0.825}, {2.3, 0, 2.1}, {2.3, -0.25, 2.1}, + {2.4, -0.25, 2.025}, {2.4, 0, 2.025}, {2.7, 0, 2.4}, {2.7, + -0.25, 2.4}, {3.3, -0.25, 2.4}, {3.3, 0, 2.4}, {2.8, 0, + 2.475}, {2.8, -0.25, 2.475}, {3.525, -0.25, 2.49375}, + {3.525, 0, 2.49375}, {2.9, 0, 2.475}, {2.9, -0.15, 2.475}, + {3.45, -0.15, 2.5125}, {3.45, 0, 2.5125}, {2.8, 0, 2.4}, + {2.8, -0.15, 2.4}, {3.2, -0.15, 2.4}, {3.2, 0, 2.4}, {0, 0, + 3.15}, {0.8, 0, 3.15}, {0.8, -0.45, 3.15}, {0.45, -0.8, + 3.15}, {0, -0.8, 3.15}, {0, 0, 2.85}, {1.4, 0, 2.4}, {1.4, + -0.784, 2.4}, {0.784, -1.4, 2.4}, {0, -1.4, 2.4}, {0.4, 0, + 2.55}, {0.4, -0.224, 2.55}, {0.224, -0.4, 2.55}, {0, -0.4, + 2.55}, {1.3, 0, 2.55}, {1.3, -0.728, 2.55}, {0.728, -1.3, + 2.55}, {0, -1.3, 2.55}, {1.3, 0, 2.4}, {1.3, -0.728, 2.4}, + {0.728, -1.3, 2.4}, {0, -1.3, 2.4}, {0, 0, 0}, {1.425, + -0.798, 0}, {1.5, 0, 0.075}, {1.425, 0, 0}, {0.798, -1.425, + 0}, {0, -1.5, 0.075}, {0, -1.425, 0}, {1.5, -0.84, 0.075}, + {0.84, -1.5, 0.075} +}; + +static double tex[2][2][2] = +{ + { {0.0, 0.0}, {1.0, 0.0} }, + { {0.0, 1.0}, {1.0, 1.0} } +}; + + +#endif /* FREEGLUT_TEAPOT_DATA_H */ + diff --git a/third_party/windows/fltk-1.1.10/src/gl_draw.cxx b/third_party/windows/fltk-1.1.10/src/gl_draw.cxx new file mode 100644 index 0000000..3e1ac8b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/gl_draw.cxx @@ -0,0 +1,223 @@ +// +// "$Id: gl_draw.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// OpenGL drawing support routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Functions from +// See also Fl_Gl_Window and gl_start.cxx + +#include "flstring.h" +#if HAVE_GL + +#include +#include +#include +#include +#include "Fl_Gl_Choice.H" +#include "Fl_Font.H" + +#if USE_XFT +extern XFontStruct* fl_xxfont(); +#endif // USE_XFT + +int gl_height() {return fl_height();} +int gl_descent() {return fl_descent();} +double gl_width(const char* s) {return fl_width(s);} +double gl_width(const char* s, int n) {return fl_width(s,n);} +double gl_width(uchar c) {return fl_width(c);} + +void gl_font(int fontid, int size) { + fl_font(fontid, size); + if (!fl_fontsize->listbase) { +#ifdef WIN32 + int base = fl_fontsize->metr.tmFirstChar; + int count = fl_fontsize->metr.tmLastChar-base+1; + HFONT oldFid = (HFONT)SelectObject(fl_gc, fl_fontsize->fid); + fl_fontsize->listbase = glGenLists(256); + wglUseFontBitmaps(fl_gc, base, count, fl_fontsize->listbase+base); + SelectObject(fl_gc, oldFid); +#elif defined(__APPLE_QD__) + // undefined characters automatically receive an empty GL list in aglUseFont + fl_fontsize->listbase = glGenLists(256); + aglUseFont(aglGetCurrentContext(), fl_fontsize->font, fl_fontsize->face, + fl_fontsize->size, 0, 256, fl_fontsize->listbase); +#elif defined(__APPLE_QUARTZ__) + short font, face, size; + uchar fn[256]; + fn[0]=strlen(fl_fontsize->q_name); + strcpy((char*)(fn+1), fl_fontsize->q_name); + GetFNum(fn, &font); + face = 0; + size = fl_fontsize->size; + fl_fontsize->listbase = glGenLists(256); + aglUseFont(aglGetCurrentContext(), font, face, + size, 0, 256, fl_fontsize->listbase); +#else +# if USE_XFT + fl_xfont = fl_xxfont(); +# endif // USE_XFT + int base = fl_xfont->min_char_or_byte2; + int count = fl_xfont->max_char_or_byte2-base+1; + fl_fontsize->listbase = glGenLists(256); + glXUseXFont(fl_xfont->fid, base, count, fl_fontsize->listbase+base); +#endif + } + glListBase(fl_fontsize->listbase); +} + + +void gl_remove_displaylist_fonts() +{ +# if HAVE_GL + + // clear variables used mostly in fl_font + fl_font_ = 0; + fl_size_ = 0; + + for (int j = 0 ; j < FL_FREE_FONT ; ++j) + { + Fl_FontSize* past = 0; + Fl_Fontdesc* s = fl_fonts + j ; + Fl_FontSize* f = s->first; + while (f != 0) { + if(f->listbase) { + if(f == s->first) { + s->first = f->next; + } + else { + past->next = f->next; + } + + // It would be nice if this next line was in a descturctor somewhere + glDeleteLists(f->listbase, 256); + + Fl_FontSize* tmp = f; + f = f->next; + delete tmp; + } + else { + past = f; + f = f->next; + } + } + } + +#endif +} + +void gl_draw(const char* str, int n) { + glCallLists(n, GL_UNSIGNED_BYTE, str); +} + +void gl_draw(const char* str, int n, int x, int y) { + glRasterPos2i(x, y); + gl_draw(str, n); +} + +void gl_draw(const char* str, int n, float x, float y) { + glRasterPos2f(x, y); + gl_draw(str, n); +} + +void gl_draw(const char* str) { + gl_draw(str, strlen(str)); +} + +void gl_draw(const char* str, int x, int y) { + gl_draw(str, strlen(str), x, y); +} + +void gl_draw(const char* str, float x, float y) { + gl_draw(str, strlen(str), x, y); +} + +static void gl_draw_invert(const char* str, int n, int x, int y) { + glRasterPos2i(x, -y); + gl_draw(str, n); +} + +void gl_draw( + const char* str, // the (multi-line) string + int x, int y, int w, int h, // bounding box + Fl_Align align) { + fl_draw(str, x, -y-h, w, h, align, gl_draw_invert); +} + +void gl_measure(const char* str, int& x, int& y) {fl_measure(str,x,y);} + +void gl_rect(int x, int y, int w, int h) { + if (w < 0) {w = -w; x = x-w;} + if (h < 0) {h = -h; y = y-h;} + glBegin(GL_LINE_STRIP); + glVertex2i(x+w-1, y+h-1); + glVertex2i(x+w-1, y); + glVertex2i(x, y); + glVertex2i(x, y+h-1); + glVertex2i(x+w, y+h-1); + glEnd(); +} + +#if HAVE_GL_OVERLAY +extern uchar fl_overlay; +extern int fl_overlay_depth; +#endif + +void gl_color(Fl_Color i) { +#if HAVE_GL_OVERLAY +#ifdef WIN32 + if (fl_overlay && fl_overlay_depth) { + if (fl_overlay_depth < 8) { + // only black & white produce the expected colors. This could + // be improved by fixing the colormap set in Fl_Gl_Overlay.cxx + int size = 1<= size-2) glIndexi(size-1); + else glIndexi(i); + } else { + glIndexi(i ? i : FL_GRAY_RAMP); + } + return; + } +#else + if (fl_overlay) {glIndexi(int(fl_xpixel(i))); return;} +#endif +#endif + uchar red, green, blue; + Fl::get_color(i, red, green, blue); + glColor3ub(red, green, blue); +} + +void gl_draw_image(const uchar* b, int x, int y, int w, int h, int d, int ld) { + if (!ld) ld = w*d; + glPixelStorei(GL_UNPACK_ROW_LENGTH, ld/d); + glRasterPos2i(x,y); + glDrawPixels(w,h,d<4?GL_RGB:GL_RGBA,GL_UNSIGNED_BYTE,(const ulong*)b); +} + +#endif + +// +// End of "$Id: gl_draw.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/gl_start.cxx b/third_party/windows/fltk-1.1.10/src/gl_start.cxx new file mode 100644 index 0000000..37d4b6c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/gl_start.cxx @@ -0,0 +1,134 @@ +// +// "$Id: gl_start.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// OpenGL context routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// You MUST use gl_visual() to select the default visual before doing +// show() of any windows. Mesa will crash if you try to use a visual +// not returned by glxChooseVisual. + +// This does not work with Fl_Double_Window's! It will try to draw +// into the front buffer. Depending on the system this will either +// crash or do nothing (when pixmaps are being used as back buffer +// and GL is being done by hardware), work correctly (when GL is done +// with software, such as Mesa), or draw into the front buffer and +// be erased when the buffers are swapped (when double buffer hardware +// is being used) + +#include +#if HAVE_GL + +#include +#include +#include +#include +#include "Fl_Gl_Choice.H" + +extern int fl_clip_state_number; // in fl_rect.cxx + +static GLContext context; +static int clip_state_number=-1; +static int pw, ph; + +#ifdef WIN32 +static Fl_Gl_Choice* gl_choice; +#endif + +#ifdef __APPLE__ +static Fl_Gl_Choice* gl_choice; +#endif + +Fl_Region XRectangleRegion(int x, int y, int w, int h); // in fl_rect.cxx + +void gl_start() { + if (!context) { +#ifdef WIN32 + if (!gl_choice) Fl::gl_visual(0); + context = fl_create_gl_context(Fl_Window::current(), gl_choice); +#elif defined(__APPLE_QD__) + // \todo Mac : We need to check the code and verify it with Apple Sample code. The 'shiny'-test should at least work with the software OpenGL emulator + context = fl_create_gl_context(Fl_Window::current(), gl_choice); +#elif defined(__APPLE_QUARTZ__) + // warning: the Quartz version should probably use Core GL (CGL) instead of AGL + context = fl_create_gl_context(Fl_Window::current(), gl_choice); +#else + context = fl_create_gl_context(fl_visual); +#endif + } + fl_set_gl_context(Fl_Window::current(), context); +#if !defined(WIN32) && !defined(__APPLE__) + glXWaitX(); +#endif + if (pw != Fl_Window::current()->w() || ph != Fl_Window::current()->h()) { + pw = Fl_Window::current()->w(); + ph = Fl_Window::current()->h(); + glLoadIdentity(); + glViewport(0, 0, pw, ph); + glOrtho(0, pw, 0, ph, -1, 1); + glDrawBuffer(GL_FRONT); + } + if (clip_state_number != fl_clip_state_number) { + clip_state_number = fl_clip_state_number; + int x, y, w, h; + if (fl_clip_box(0, 0, Fl_Window::current()->w(), Fl_Window::current()->h(), + x, y, w, h)) { + fl_clip_region(XRectangleRegion(x,y,w,h)); + glScissor(x, Fl_Window::current()->h()-(y+h), w, h); + glEnable(GL_SCISSOR_TEST); + } else { + glDisable(GL_SCISSOR_TEST); + } + } +} + +void gl_finish() { + glFlush(); +#if !defined(WIN32) && !defined(__APPLE__) + glXWaitGL(); +#endif +} + +int Fl::gl_visual(int mode, int *alist) { + Fl_Gl_Choice *c = Fl_Gl_Choice::find(mode,alist); + if (!c) return 0; +#ifdef WIN32 + gl_choice = c; +#elif defined(__APPLE_QD__) + gl_choice = c; +#elif defined(__APPLE_QUARTZ__) + // warning: the Quartz version should probably use Core GL (CGL) instead of AGL + gl_choice = c; +#else + fl_visual = c->vis; + fl_colormap = c->colormap; +#endif + return 1; +} + +#endif + +// +// End of "$Id: gl_start.cxx 5190 2006-06-09 16:16:34Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/glut_compatability.cxx b/third_party/windows/fltk-1.1.10/src/glut_compatability.cxx new file mode 100644 index 0000000..0b52b14 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/glut_compatability.cxx @@ -0,0 +1,504 @@ +// +// "$Id: glut_compatability.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// GLUT emulation routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Emulation of Glut using fltk. + +// GLUT is Copyright (c) Mark J. Kilgard, 1994, 1995, 1996. +// "This program is freely distributable without licensing fees and is +// provided without guarantee or warrantee expressed or implied. This +// program is -not- in the public domain." + +// Although I have copied the GLUT API, none of my code is based on +// any Glut implementation details and is therefore covered by the LGPL. + +#include "flstring.h" +#if HAVE_GL + +# include +# ifdef HAVE_GLXGETPROCADDRESSARB +# define GLX_GLXEXT_LEGACY +# include +# endif // HAVE_GLXGETPROCADDRESSARB +# ifdef HAVE_DLFCN_H +# include +# endif // HAVE_DLFCN_H +# define MAXWINDOWS 32 +static Fl_Glut_Window *windows[MAXWINDOWS+1]; + +Fl_Glut_Window *glut_window; +int glut_menu; +void (*glut_menustate_function)(int); +void (*glut_menustatus_function)(int,int,int); + +static void default_reshape(int w, int h) {glViewport(0,0,w,h);} +static void default_display() {} + +void Fl_Glut_Window::make_current() { + glut_window = this; + if (shown()) Fl_Gl_Window::make_current(); +} + +static int indraw; +void Fl_Glut_Window::draw() { + glut_window = this; + indraw = 1; + if (!valid()) {reshape(w(),h()); valid(1);} + display(); + indraw = 0; +} + +void glutSwapBuffers() { + if (!indraw) glut_window->swap_buffers(); +} + +void Fl_Glut_Window::draw_overlay() { + glut_window = this; + if (!valid()) {reshape(w(),h()); valid(1);} + overlaydisplay(); +} + +static void domenu(int, int, int); + +int Fl_Glut_Window::handle(int event) { + make_current(); + int ex = Fl::event_x(); + int ey = Fl::event_y(); + int button; + switch (event) { + + case FL_PUSH: + if (keyboard || special) Fl::focus(this); + button = Fl::event_button()-1; + if (button<0) button = 0; + if (button>2) button = 2; + if (menu[button]) {domenu(menu[button],ex,ey); return 1;} + mouse_down |= 1< 0) {mouse(4,GLUT_DOWN,ex,ey); --button;} + return 1; + + case FL_RELEASE: + for (button = 0; button < 3; button++) if (mouse_down & (1< FL_F && k <= FL_F_Last) k -= FL_F; + special(k,ex,ey); + return 1; + } + break; + } + + case FL_HIDE: + if (visibility) visibility(GLUT_NOT_VISIBLE); + break; + + case FL_SHOW: + if (visibility) visibility(GLUT_VISIBLE); + break; + } + + return Fl_Gl_Window::handle(event); +} + +static int glut_mode = GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH; + +void Fl_Glut_Window::_init() { + for (number=1; numberresizable(W); + if (initargc) { + W->show(initargc,initargv); + initargc = 0; + } else { + W->show(); + } + W->valid(0); + W->context_valid(0); + W->make_current(); + return W->number; +} + +int glutCreateSubWindow(int win, int x, int y, int w, int h) { + Fl_Glut_Window *W = new Fl_Glut_Window(x,y,w,h,0); + windows[win]->add(W); + if (windows[win]->shown()) W->show(); + W->make_current(); + return W->number; +} + +Fl_Glut_Window::~Fl_Glut_Window() { + if (glut_window == this) glut_window = 0; + windows[number] = 0; +} + +void glutDestroyWindow(int win) { + // should destroy children!!! + delete windows[win]; +} + +void glutPostWindowRedisplay(int win) { + windows[win]->redraw(); +} + +void glutSetWindow(int win) { + windows[win]->make_current(); +} + +//////////////////////////////////////////////////////////////// +#include + +struct menu { + void (*cb)(int); + Fl_Menu_Item *m; + int size; + int alloc; +}; + +#define MAXMENUS 32 +static menu menus[MAXMENUS+1]; + +static void domenu(int n, int ex, int ey) { + glut_menu = n; + menu *m = &menus[n]; + if (glut_menustate_function) glut_menustate_function(1); + if (glut_menustatus_function) glut_menustatus_function(1,ex,ey); + const Fl_Menu_Item* g = m->m->popup(Fl::event_x(), Fl::event_y(), 0); + if (g && g->callback_) ((void (*)(int))(g->callback_))(int(g->argument())); + if (glut_menustatus_function) glut_menustatus_function(0,ex,ey); + if (glut_menustate_function) glut_menustate_function(0); +} + +int glutCreateMenu(void (*cb)(int)) { + int i; + for (i=1; icb = cb; + return glut_menu = i; +} + +void glutDestroyMenu(int n) { + menu *m = &menus[n]; + delete[] m->m; + m->m = 0; + m->cb = 0; + m->size = m->alloc = 0; +} + +static Fl_Menu_Item* additem(menu *m) { + if (m->size+1 >= m->alloc) { + m->alloc = m->size*2+10; + Fl_Menu_Item* nm = new Fl_Menu_Item[m->alloc]; + for (int i=0; isize; i++) nm[i] = m->m[i]; + delete[] m->m; + m->m = nm; + } + int n = m->size++; + m->m[n+1].text = 0; + Fl_Menu_Item* i = &(m->m[n]); + i->shortcut_ = 0; + i->flags = 0; + i->labeltype_ = i->labelfont_ = i->labelsize_ = i->labelcolor_ = 0; + return i; +} + +void glutAddMenuEntry(char *label, int value) { + menu *m = &menus[glut_menu]; + Fl_Menu_Item* i = additem(m); + i->text = label; + i->callback_ = (Fl_Callback*)(m->cb); + i->user_data_ = (void *)value; +} + +void glutAddSubMenu(char *label, int submenu) { + menu *m = &menus[glut_menu]; + Fl_Menu_Item* i = additem(m); + i->text = label; + i->callback_ = 0; + i->user_data_ = (void *)(menus[submenu].m); + i->flags = FL_PUP_SUBMENU; +} + +void glutChangeToMenuEntry(int item, char *label, int value) { + menu *m = &menus[glut_menu]; + Fl_Menu_Item* i = &m->m[item-1]; + i->text = label; + i->callback_ = (Fl_Callback*)(m->cb); + i->user_data_ = (void *)value; + i->flags = 0; +} + +void glutChangeToSubMenu(int item, char *label, int submenu) { + menu *m = &menus[glut_menu]; + Fl_Menu_Item* i = &m->m[item-1]; + i->text = label; + i->callback_ = 0; + i->user_data_ = (void *)(menus[submenu].m); + i->flags = FL_PUP_SUBMENU; +} + +void glutRemoveMenuItem(int item) { + menu *m = &menus[glut_menu]; + if (item > m->size || item < 1) return; + for (int i = item-1; i <= m->size; i++) m->m[i] = m->m[i+1]; + m->size--; +} + +//////////////////////////////////////////////////////////////// + +int glutGet(GLenum type) { + switch (type) { + case GLUT_RETURN_ZERO: return 0; + case GLUT_WINDOW_X: return glut_window->x(); + case GLUT_WINDOW_Y: return glut_window->y(); + case GLUT_WINDOW_WIDTH: return glut_window->w(); + case GLUT_WINDOW_HEIGHT: return glut_window->h(); + case GLUT_WINDOW_PARENT: + if (glut_window->parent()) + return ((Fl_Glut_Window *)(glut_window->parent()))->number; + else + return 0; +//case GLUT_WINDOW_NUM_CHILDREN: +//case GLUT_WINDOW_CURSOR: return + case GLUT_SCREEN_WIDTH: return Fl::w(); + case GLUT_SCREEN_HEIGHT: return Fl::h(); +//case GLUT_SCREEN_WIDTH_MM: +//case GLUT_SCREEN_HEIGHT_MM: + case GLUT_MENU_NUM_ITEMS: return menus[glut_menu].size; + case GLUT_DISPLAY_MODE_POSSIBLE: return Fl_Gl_Window::can_do(glut_mode); + case GLUT_INIT_WINDOW_X: return initx; + case GLUT_INIT_WINDOW_Y: return inity; + case GLUT_INIT_WINDOW_WIDTH: return initw; + case GLUT_INIT_WINDOW_HEIGHT: return inith; + case GLUT_INIT_DISPLAY_MODE: return glut_mode; +//case GLUT_ELAPSED_TIME: + case GLUT_WINDOW_BUFFER_SIZE: + if (glutGet(GLUT_WINDOW_RGBA)) + return glutGet(GLUT_WINDOW_RED_SIZE)+ + glutGet(GLUT_WINDOW_GREEN_SIZE)+ + glutGet(GLUT_WINDOW_BLUE_SIZE)+ + glutGet(GLUT_WINDOW_ALPHA_SIZE); + else + return glutGet(GLUT_WINDOW_COLORMAP_SIZE); + case GLUT_VERSION: return 20400; + default: {GLint p; glGetIntegerv(type, &p); return p;} + } +} + +int glutLayerGet(GLenum type) { + switch (type) { + case GLUT_OVERLAY_POSSIBLE: return glut_window->can_do_overlay(); +//case GLUT_LAYER_IN_USE: +//case GLUT_HAS_OVERLAY: + case GLUT_TRANSPARENT_INDEX: return 0; // true for SGI + case GLUT_NORMAL_DAMAGED: return glut_window->damage(); + case GLUT_OVERLAY_DAMAGED: return 1; // kind of works... + default: return 0; + } +} + +int glutDeviceGet(GLenum type) { + switch (type) { + case GLUT_HAS_KEYBOARD : return 1; + case GLUT_HAS_MOUSE : return 1; + case GLUT_NUM_MOUSE_BUTTONS : return 3; + default : return 0; + } +} + +// Get extension function address... +GLUTproc glutGetProcAddress(const char *procName) { +# ifdef WIN32 + return (GLUTproc)wglGetProcAddress((LPCSTR)procName); + +# elif defined(HAVE_DLSYM) && defined(HAVE_DLFCN_H) + char symbol[1024]; + + snprintf(symbol, sizeof(symbol), "_%s", procName); + +# ifdef RTLD_DEFAULT + return (GLUTproc)dlsym(RTLD_DEFAULT, symbol); + +# else // No RTLD_DEFAULT support, so open the current a.out symbols... + static void *rtld_default = 0; + + if (!rtld_default) rtld_default = dlopen(0, RTLD_LAZY); + + if (rtld_default) return (GLUTproc)dlsym(rtld_default, symbol); + else return 0; + +# endif // RTLD_DEFAULT + +# elif defined(HAVE_GLXGETPROCADDRESSARB) + return (GLUTproc)glXGetProcAddressARB((const GLubyte *)procName); + +# else + return (GLUTproc)0; +# endif // WIN32 +} + +// Parse the GL_EXTENSIONS string to see if the named extension is +// supported. +// +// This code was copied from FreeGLUT 2.4.0 which carries the +// following notice: +// +// Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. +int glutExtensionSupported( const char* extension ) +{ + if (!extension || strchr(extension, ' ')) return 0; + + const char *extensions, *start; + const int len = strlen( extension ); + + start = extensions = (const char *) glGetString(GL_EXTENSIONS); + + if (!extensions) return 0; + + for (;;) { + const char *p = strstr(extensions, extension); + if (!p) return 0; /* not found */ + /* check that the match isn't a super string */ + if ((p == start || p[-1] == ' ') && + (p[len] == ' ' || p[len] == 0)) return 1; + /* skip the false match and continue */ + extensions = p + len; + } +} + +#endif // HAVE_GL + +// +// End of "$Id: glut_compatability.cxx 5845 2007-05-20 00:01:06Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/glut_font.cxx b/third_party/windows/fltk-1.1.10/src/glut_font.cxx new file mode 100644 index 0000000..64991db --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/glut_font.cxx @@ -0,0 +1,199 @@ +// +// "$Id: glut_font.cxx 5650 2007-02-01 18:10:07Z mike $" +// +// GLUT font routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// The stroked text code was copied from FreeGLUT 2.4.0 which carries +// the following notice: +// +// Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. +// + +// (sort of) emulation of Glut's bitmap drawing functions, using FL's +// font stuff. Not all the fonts match! + +#include +#if HAVE_GL +# include + +Fl_Glut_Bitmap_Font glutBitmap9By15 = {FL_SCREEN, 15}; +Fl_Glut_Bitmap_Font glutBitmap8By13 = {FL_SCREEN, 13}; +Fl_Glut_Bitmap_Font glutBitmapTimesRoman10 = {FL_TIMES, 10}; +Fl_Glut_Bitmap_Font glutBitmapTimesRoman24 = {FL_TIMES, 24}; +Fl_Glut_Bitmap_Font glutBitmapHelvetica10 = {FL_HELVETICA, 10}; +Fl_Glut_Bitmap_Font glutBitmapHelvetica12 = {FL_HELVETICA, 12}; +Fl_Glut_Bitmap_Font glutBitmapHelvetica18 = {FL_HELVETICA, 18}; + +void glutBitmapCharacter(void* font, int character) { + gl_font(((Fl_Glut_Bitmap_Font *)font)->font,((Fl_Glut_Bitmap_Font *)font)->size); + char a[1]; a[0] = character; + gl_draw(a,1); +} + +int glutBitmapHeight(void* font) { + gl_font(((Fl_Glut_Bitmap_Font *)font)->font,((Fl_Glut_Bitmap_Font *)font)->size); + return gl_height(); +} + +int glutBitmapLength(void *font, const unsigned char *string) { + gl_font(((Fl_Glut_Bitmap_Font *)font)->font,((Fl_Glut_Bitmap_Font *)font)->size); + const char *s = (const char*)string; + return int(gl_width(s)+.5); +} + +void glutBitmapString(void *font, const unsigned char *string) { + gl_font(((Fl_Glut_Bitmap_Font *)font)->font,((Fl_Glut_Bitmap_Font *)font)->size); + const char *s = (const char*)string; + gl_draw(s); +} + +int glutBitmapWidth(void* font, int character) { + gl_font(((Fl_Glut_Bitmap_Font *)font)->font,((Fl_Glut_Bitmap_Font *)font)->size); + return int(gl_width(character)+.5); +} + + +/* + * Draw a stroke character + */ +void glutStrokeCharacter(void* fontID, int character) { + const Fl_Glut_StrokeChar *schar; + const Fl_Glut_StrokeStrip *strip; + int i, j; + Fl_Glut_StrokeFont* font = (Fl_Glut_StrokeFont *)fontID; + + if (character < 0 || character >= font->Quantity) return; + + schar = font->Characters[character]; + if (!schar) return; + + strip = schar->Strips; + + for (i = 0; i < schar->Number; i++, strip++) + { + glBegin(GL_LINE_STRIP); + for (j = 0; j < strip->Number; j++) + glVertex2f(strip->Vertices[j].X, strip->Vertices[j].Y); + glEnd(); + } + + glTranslatef(schar->Right, 0.0, 0.0); +} + +void glutStrokeString(void* fontID, const unsigned char *string) { + unsigned char c; + int i, j; + float length = 0.0; + Fl_Glut_StrokeFont* font = (Fl_Glut_StrokeFont *)fontID; + + if (!string || ! *string) return; + + /* + * Step through the string, drawing each character. + * A newline will simply translate the next character's insertion + * point back to the start of the line and down one line. + */ + + while ((c = *string++) != 0) { + if (c < font->Quantity) { + if (c == '\n') { + glTranslatef(-length, -(float)(font->Height), 0.0); + length = 0.0; + } else { + /* Not an EOL, draw the bitmap character */ + const Fl_Glut_StrokeChar *schar = font->Characters[c]; + if (schar) { + const Fl_Glut_StrokeStrip *strip = schar->Strips; + + for (i = 0; i < schar->Number; i++, strip++) { + glBegin(GL_LINE_STRIP); + for (j = 0; j < strip->Number; j++) + glVertex2f(strip->Vertices[j].X, strip->Vertices[j].Y); + glEnd(); + } + + length += schar->Right; + glTranslatef(schar->Right, 0.0, 0.0); + } + } + } + } +} + +/* + * Return the width in pixels of a stroke character + */ +int glutStrokeWidth( void* fontID, int character ) +{ + const Fl_Glut_StrokeChar *schar; + Fl_Glut_StrokeFont* font = (Fl_Glut_StrokeFont *)fontID; + if (character < 0 || character >= font->Quantity) return 0; + schar = font->Characters[ character ]; + + return schar ? (int)(schar->Right + 0.5) : 0; +} + +/* + * Return the width of a string drawn using a stroke font + */ +int glutStrokeLength(void* fontID, const unsigned char* string) { + unsigned char c; + float length = 0.0; + float this_line_length = 0.0; + Fl_Glut_StrokeFont* font = (Fl_Glut_StrokeFont *)fontID; + + if (!string || ! *string) return 0; + + while ((c = *string++) != 0) { + if (c < font->Quantity) { + if (c == '\n') { + /* EOL; reset the length of this line */ + if (length < this_line_length) length = this_line_length; + this_line_length = 0.0; + } else { + /* Not an EOL, increment the length of this line */ + const Fl_Glut_StrokeChar *schar = font->Characters[c]; + if (schar) this_line_length += schar->Right; + } + } + } + + if (length < this_line_length) length = this_line_length; + + return (int)(length + 0.5); +} + +/* + * Returns the height of a stroke font + */ +GLfloat glutStrokeHeight(void* fontID) { + Fl_Glut_StrokeFont* font = (Fl_Glut_StrokeFont *)fontID; + return font->Height; +} + +#endif // HAVE_GL + +// +// End of "$Id: glut_font.cxx 5650 2007-02-01 18:10:07Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/makedepend b/third_party/windows/fltk-1.1.10/src/makedepend new file mode 100644 index 0000000..ded3d3f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/makedepend @@ -0,0 +1,601 @@ +# DO NOT DELETE THIS LINE -- make depend depends on it. +Fl.o: Fl.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/x.H \ + ../FL/Fl_Window.H ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H flstring.h \ + ../FL/Fl_Export.H ../config.h ../FL/fl_draw.H +Fl_Adjuster.o: Fl_Adjuster.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Adjuster.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/fl_draw.H \ + fastarrow.h mediumarrow.h slowarrow.h +Fl_Bitmap.o: Fl_Bitmap.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/Fl_Widget.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Bitmap.H flstring.h \ + ../FL/Fl_Export.H ../config.h +Fl_Browser.o: Fl_Browser.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H flstring.h \ + ../FL/Fl_Export.H ../config.h +Fl_Browser_.o: Fl_Browser_.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Widget.H ../FL/Fl_Browser_.H \ + ../FL/Fl_Group.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/fl_draw.H +Fl_Browser_load.o: Fl_Browser_load.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H +Fl_Box.o: Fl_Box.cxx ../FL/Fl_Widget.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Box.H +Fl_Button.o: Fl_Button.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Button.H ../FL/Fl_Widget.H ../FL/Fl_Group.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H +Fl_Chart.o: Fl_Chart.cxx ../FL/math.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Chart.H ../FL/Fl_Widget.H ../FL/fl_draw.H \ + flstring.h ../FL/Fl_Export.H ../config.h +Fl_Check_Browser.o: Fl_Check_Browser.cxx flstring.h ../FL/Fl_Export.H \ + ../config.h ../FL/fl_draw.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Check_Browser.H ../FL/Fl.H ../FL/Fl_Browser_.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H +Fl_Check_Button.o: Fl_Check_Button.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_Widget.H +Fl_Choice.o: Fl_Choice.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Widget.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/fl_draw.H flstring.h \ + ../FL/Fl_Export.H ../config.h +Fl_Clock.o: Fl_Clock.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Clock.H ../FL/Fl_Widget.H ../FL/fl_draw.H +Fl_Color_Chooser.o: Fl_Color_Chooser.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Color_Chooser.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Box.H ../FL/Fl_Return_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Value_Input.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/fl_draw.H \ + ../FL/math.h ../FL/Fl_Window.H ../FL/Fl_Group.H +Fl_Counter.o: Fl_Counter.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Counter.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Widget.H ../FL/fl_draw.H +Fl_Dial.o: Fl_Dial.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Dial.H ../FL/Fl_Valuator.H ../FL/Fl_Widget.H ../FL/fl_draw.H \ + ../FL/math.h +Fl_Double_Window.o: Fl_Double_Window.cxx ../config.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/x.H \ + ../FL/fl_draw.H +Fl_File_Browser.o: Fl_File_Browser.cxx ../FL/Fl_File_Browser.H \ + ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/filename.H ../FL/fl_draw.H \ + ../FL/filename.H flstring.h ../FL/Fl_Export.H ../config.h +Fl_File_Chooser.o: Fl_File_Chooser.cxx ../FL/Fl_File_Chooser.H ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Group.H \ + ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H \ + ../FL/Fl_Image.H ../FL/Fl_Menu_Button.H ../FL/Fl_Button.H \ + ../FL/Fl_Preferences.H ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H \ + ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_File_Icon.H ../FL/Fl.H \ + ../FL/filename.H ../FL/Fl_Box.H ../FL/Fl_Check_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Button.H ../FL/Fl_File_Input.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H \ + ../FL/fl_ask.H ../FL/fl_draw.H ../FL/Fl_Bitmap.H +Fl_File_Chooser2.o: Fl_File_Chooser2.cxx ../FL/Fl_File_Chooser.H \ + ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Group.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Menu_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_Preferences.H ../FL/Fl_Tile.H \ + ../FL/Fl_File_Browser.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/filename.H ../FL/Fl_Box.H \ + ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Button.H \ + ../FL/Fl_File_Input.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/Fl_Return_Button.H ../FL/fl_ask.H ../FL/filename.H ../FL/x.H \ + ../FL/Fl_Shared_Image.H flstring.h ../FL/Fl_Export.H ../config.h +Fl_File_Icon.o: Fl_File_Icon.cxx flstring.h ../FL/Fl_Export.H ../config.h \ + ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/filename.H +Fl_File_Input.o: Fl_File_Input.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_File_Input.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Widget.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/fl_draw.H flstring.h ../FL/Fl_Export.H ../config.h +Fl_Group.o: Fl_Group.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/fl_draw.H +Fl_Help_View.o: Fl_Help_View.cxx ../FL/Fl_Help_View.H ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/fl_draw.H ../FL/Fl_Shared_Image.H \ + ../FL/Fl_Image.H ../FL/Fl_Window.H ../FL/Fl_Pixmap.H ../FL/x.H \ + ../FL/Fl_Window.H flstring.h ../FL/Fl_Export.H ../config.h +Fl_Image.o: Fl_Image.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Widget.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Image.H flstring.h \ + ../FL/Fl_Export.H ../config.h +Fl_Input.o: Fl_Input.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/fl_draw.H ../FL/fl_ask.H \ + flstring.h ../FL/Fl_Export.H ../config.h +Fl_Input_.o: Fl_Input_.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Input_.H ../FL/Fl_Widget.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/fl_draw.H ../FL/fl_ask.H flstring.h \ + ../FL/Fl_Export.H ../config.h +Fl_Light_Button.o: Fl_Light_Button.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Light_Button.H ../FL/Fl_Button.H \ + ../FL/Fl_Widget.H ../FL/fl_draw.H flstring.h ../FL/Fl_Export.H \ + ../config.h +Fl_Menu.o: Fl_Menu.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Menu_Window.H ../FL/Fl_Single_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/fl_draw.H flstring.h \ + ../FL/Fl_Export.H ../config.h +Fl_Menu_.o: Fl_Menu_.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Menu_.H ../FL/Fl_Widget.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H flstring.h ../FL/Fl_Export.H \ + ../config.h +Fl_Menu_Bar.o: Fl_Menu_Bar.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Menu_Bar.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/fl_draw.H +Fl_Sys_Menu_Bar.o: Fl_Sys_Menu_Bar.cxx +Fl_Menu_Button.o: Fl_Menu_Button.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/fl_draw.H +Fl_Menu_Window.o: Fl_Menu_Window.cxx ../config.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/fl_draw.H \ + ../FL/Fl_Menu_Window.H ../FL/Fl_Single_Window.H +Fl_Menu_add.o: Fl_Menu_add.cxx ../FL/Fl_Menu_.H ../FL/Fl_Widget.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Menu_Item.H \ + ../FL/Fl_Image.H flstring.h ../FL/Fl_Export.H ../config.h +Fl_Menu_global.o: Fl_Menu_global.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Menu_.H ../FL/Fl_Widget.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H +Fl_Multi_Label.o: Fl_Multi_Label.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H \ + ../FL/Fl_Widget.H ../FL/Fl_Image.H ../FL/Fl_Multi_Label.H +Fl_Overlay_Window.o: Fl_Overlay_Window.cxx ../config.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Overlay_Window.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H +Fl_Pack.o: Fl_Pack.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Pack.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/fl_draw.H +Fl_Pixmap.o: Fl_Pixmap.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Widget.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Pixmap.H flstring.h \ + ../FL/Fl_Export.H ../config.h +Fl_Positioner.o: Fl_Positioner.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Positioner.H ../FL/Fl_Widget.H \ + ../FL/fl_draw.H +Fl_Preferences.o: Fl_Preferences.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Preferences.H ../FL/filename.H flstring.h \ + ../FL/Fl_Export.H ../config.h +Fl_Progress.o: Fl_Progress.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Progress.H ../FL/Fl_Widget.H ../FL/fl_draw.H +Fl_Repeat_Button.o: Fl_Repeat_Button.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Repeat_Button.H ../FL/Fl.H ../FL/Fl_Button.H \ + ../FL/Fl_Widget.H +Fl_Return_Button.o: Fl_Return_Button.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Return_Button.H ../FL/Fl_Button.H \ + ../FL/Fl_Widget.H ../FL/fl_draw.H +Fl_Roller.o: Fl_Roller.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Roller.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Widget.H ../FL/fl_draw.H +Fl_Round_Button.o: Fl_Round_Button.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Round_Button.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_Widget.H +Fl_Scroll.o: Fl_Scroll.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Tiled_Image.H ../FL/Fl_Image.H \ + ../FL/Fl_Scroll.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/fl_draw.H +Fl_Scrollbar.o: Fl_Scrollbar.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Widget.H ../FL/fl_draw.H flstring.h \ + ../FL/Fl_Export.H ../config.h +Fl_Shared_Image.o: Fl_Shared_Image.cxx flstring.h ../FL/Fl_Export.H \ + ../config.h ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Shared_Image.H ../FL/Fl_Image.H ../FL/Fl_XBM_Image.H \ + ../FL/Fl_Bitmap.H ../FL/Fl_XPM_Image.H ../FL/Fl_Pixmap.H +Fl_Single_Window.o: Fl_Single_Window.cxx ../FL/Fl_Single_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H +Fl_Slider.o: Fl_Slider.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Widget.H ../FL/fl_draw.H flstring.h ../FL/Fl_Export.H \ + ../config.h +Fl_Tabs.o: Fl_Tabs.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Tabs.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/fl_draw.H \ + ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H +Fl_Text_Buffer.o: Fl_Text_Buffer.cxx flstring.h ../FL/Fl_Export.H \ + ../config.h ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Text_Buffer.H +Fl_Text_Display.o: Fl_Text_Display.cxx flstring.h ../FL/Fl_Export.H \ + ../config.h ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Text_Buffer.H ../FL/Fl_Text_Display.H ../FL/fl_draw.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Text_Buffer.H \ + ../FL/Fl_Window.H +Fl_Text_Editor.o: Fl_Text_Editor.cxx flstring.h ../FL/Fl_Export.H \ + ../config.h ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Text_Editor.H ../FL/Fl_Text_Display.H ../FL/fl_draw.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Text_Buffer.H ../FL/fl_ask.H +Fl_Tile.o: Fl_Tile.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Tile.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Window.H +Fl_Tiled_Image.o: Fl_Tiled_Image.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Tiled_Image.H ../FL/Fl_Image.H \ + ../FL/fl_draw.H +Fl_Tooltip.o: Fl_Tooltip.cxx ../FL/Fl_Tooltip.H ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Widget.H \ + ../FL/fl_draw.H ../FL/Fl_Menu_Window.H ../FL/Fl_Single_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H +Fl_Valuator.o: Fl_Valuator.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Valuator.H ../FL/Fl_Widget.H ../FL/math.h \ + flstring.h ../FL/Fl_Export.H ../config.h +Fl_Value_Input.o: Fl_Value_Input.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Value_Input.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Widget.H ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Group.H \ + ../FL/math.h +Fl_Value_Output.o: Fl_Value_Output.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Value_Output.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Widget.H ../FL/fl_draw.H +Fl_Value_Slider.o: Fl_Value_Slider.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Widget.H ../FL/fl_draw.H +Fl_Widget.o: Fl_Widget.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Widget.H ../FL/Fl_Group.H ../FL/Fl_Tooltip.H \ + ../FL/fl_draw.H flstring.h ../FL/Fl_Export.H ../config.h +Fl_Window.o: Fl_Window.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + flstring.h ../FL/Fl_Export.H ../config.h +Fl_Window_fullscreen.o: Fl_Window_fullscreen.cxx ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H +Fl_Window_hotspot.o: Fl_Window_hotspot.cxx ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/x.H ../FL/Fl_Window.H +Fl_Window_iconize.o: Fl_Window_iconize.cxx ../FL/x.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H +Fl_Wizard.o: Fl_Wizard.cxx ../FL/Fl_Wizard.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/fl_draw.H +Fl_XBM_Image.o: Fl_XBM_Image.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_XBM_Image.H ../FL/Fl_Bitmap.H \ + ../FL/Fl_Image.H flstring.h ../FL/Fl_Export.H ../config.h +Fl_XPM_Image.o: Fl_XPM_Image.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_XPM_Image.H ../FL/Fl_Pixmap.H \ + ../FL/Fl_Image.H flstring.h ../FL/Fl_Export.H ../config.h +Fl_abort.o: Fl_abort.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H flstring.h ../FL/Fl_Export.H ../config.h +Fl_add_idle.o: Fl_add_idle.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H +Fl_arg.o: Fl_arg.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Window.H ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H ../FL/filename.H \ + ../FL/fl_draw.H flstring.h ../FL/Fl_Export.H ../config.h +Fl_compose.o: Fl_compose.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H +Fl_display.o: Fl_display.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H flstring.h ../FL/Fl_Export.H ../config.h +Fl_get_key.o: Fl_get_key.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H +Fl_get_system_colors.o: Fl_get_system_colors.cxx ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/fl_draw.H ../FL/x.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/math.h \ + flstring.h ../FL/Fl_Export.H ../config.h ../FL/Fl_Pixmap.H \ + ../FL/Fl_Image.H ../FL/Fl_Tiled_Image.H tile.xpm +Fl_grab.o: Fl_grab.cxx ../config.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H +Fl_lock.o: Fl_lock.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../config.h +Fl_own_colormap.o: Fl_own_colormap.cxx ../config.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H +Fl_visual.o: Fl_visual.cxx ../config.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H +Fl_x.o: Fl_x.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Window.H ../FL/Fl_Tooltip.H ../FL/Fl_Widget.H flstring.h \ + ../FL/Fl_Export.H ../config.h +filename_absolute.o: filename_absolute.cxx ../FL/filename.H \ + ../FL/Fl_Export.H flstring.h ../FL/Fl_Export.H ../config.h +filename_expand.o: filename_expand.cxx ../FL/filename.H ../FL/Fl_Export.H \ + flstring.h ../FL/Fl_Export.H ../config.h +filename_ext.o: filename_ext.cxx ../FL/filename.H ../FL/Fl_Export.H +filename_isdir.o: filename_isdir.cxx flstring.h ../FL/Fl_Export.H \ + ../config.h ../FL/filename.H ../FL/Fl_Export.H +filename_list.o: filename_list.cxx ../FL/filename.H ../FL/Fl_Export.H \ + flstring.h ../FL/Fl_Export.H ../config.h +filename_match.o: filename_match.cxx ../FL/filename.H ../FL/Fl_Export.H +filename_setext.o: filename_setext.cxx ../FL/filename.H ../FL/Fl_Export.H \ + flstring.h ../FL/Fl_Export.H ../config.h +fl_arc.o: fl_arc.cxx ../FL/fl_draw.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/math.h +fl_arci.o: fl_arci.cxx ../FL/fl_draw.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H +fl_ask.o: fl_ask.cxx flstring.h ../FL/Fl_Export.H ../config.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/fl_ask.H ../FL/Fl_Box.H \ + ../FL/Fl_Widget.H ../FL/Fl_Button.H ../FL/Fl_Return_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Secret_Input.H ../FL/Fl_Input.H ../FL/x.H \ + ../FL/Fl_Window.H ../FL/fl_draw.H +fl_boxtype.o: fl_boxtype.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Widget.H ../FL/fl_draw.H ../config.h +fl_color.o: fl_color.cxx Fl_XColor.H ../config.h ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl.H ../FL/Enumerations.H ../FL/x.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/fl_draw.H \ + fl_cmap.h +fl_cursor.o: fl_cursor.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/x.H ../FL/Fl_Window.H ../FL/fl_draw.H +fl_curve.o: fl_curve.cxx ../FL/fl_draw.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H +fl_diamond_box.o: fl_diamond_box.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/fl_draw.H +fl_dnd.o: fl_dnd.cxx fl_dnd_x.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/x.H ../FL/Fl_Window.H flstring.h ../FL/Fl_Export.H ../config.h +fl_draw.o: fl_draw.cxx ../FL/fl_draw.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Image.H flstring.h ../FL/Fl_Export.H \ + ../config.h +fl_draw_image.o: fl_draw_image.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H Fl_XColor.H ../config.h \ + ../FL/Enumerations.H flstring.h ../FL/Fl_Export.H +fl_draw_pixmap.o: fl_draw_pixmap.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H flstring.h ../FL/Fl_Export.H \ + ../config.h +fl_encoding_latin1.o: fl_encoding_latin1.cxx ../FL/fl_draw.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Enumerations.H flstring.h \ + ../FL/Fl_Export.H ../config.h +fl_encoding_mac_roman.o: fl_encoding_mac_roman.cxx ../FL/fl_draw.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Enumerations.H flstring.h \ + ../FL/Fl_Export.H ../config.h +fl_engraved_label.o: fl_engraved_label.cxx ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Widget.H \ + ../FL/fl_draw.H +fl_file_dir.o: fl_file_dir.cxx flstring.h ../FL/Fl_Export.H ../config.h \ + ../FL/filename.H ../FL/Fl_Export.H ../FL/Fl_File_Chooser.H ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Group.H ../FL/Fl_Choice.H \ + ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Button.H ../FL/Fl_Preferences.H \ + ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H ../FL/Fl_Browser.H \ + ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/filename.H \ + ../FL/Fl_Box.H ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_File_Input.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H ../FL/fl_ask.H +fl_font.o: fl_font.cxx flstring.h ../FL/Fl_Export.H ../config.h \ + ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/fl_draw.H \ + ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + Fl_Font.H fl_font_xft.cxx +fl_gtk.o: fl_gtk.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/fl_draw.H +fl_labeltype.o: fl_labeltype.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Widget.H ../FL/Fl_Group.H ../FL/fl_draw.H \ + ../FL/Fl_Image.H ../FL/Fl_Input_.H +fl_line_style.o: fl_line_style.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/fl_draw.H ../FL/x.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H flstring.h ../FL/Fl_Export.H \ + ../config.h +fl_open_uri.o: fl_open_uri.cxx ../FL/filename.H ../FL/Fl_Export.H \ + flstring.h ../FL/Fl_Export.H ../config.h +fl_oval_box.o: fl_oval_box.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/fl_draw.H +fl_overlay.o: fl_overlay.cxx ../FL/x.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/fl_draw.H +fl_overlay_visual.o: fl_overlay_visual.cxx ../config.h +fl_plastic.o: fl_plastic.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/fl_draw.H flstring.h ../FL/Fl_Export.H \ + ../config.h +fl_read_image.o: fl_read_image.cxx ../FL/x.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/fl_draw.H flstring.h ../FL/Fl_Export.H ../config.h +fl_rect.o: fl_rect.cxx ../config.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/x.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H +fl_round_box.o: fl_round_box.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/fl_draw.H +fl_rounded_box.o: fl_rounded_box.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/fl_draw.H +fl_set_font.o: fl_set_font.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/fl_draw.H flstring.h ../FL/Fl_Export.H \ + ../config.h Fl_Font.H +fl_set_fonts.o: fl_set_fonts.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H Fl_Font.H ../config.h flstring.h ../FL/Fl_Export.H \ + fl_set_fonts_xft.cxx +fl_scroll_area.o: fl_scroll_area.cxx ../config.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/fl_draw.H +fl_shadow_box.o: fl_shadow_box.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/fl_draw.H +fl_shortcut.o: fl_shortcut.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Widget.H ../FL/Fl_Button.H ../FL/fl_draw.H \ + flstring.h ../FL/Fl_Export.H ../config.h ../FL/x.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H +fl_show_colormap.o: fl_show_colormap.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Single_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/fl_draw.H \ + ../FL/fl_show_colormap.H ../config.h +fl_symbols.o: fl_symbols.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/fl_draw.H ../FL/math.h flstring.h \ + ../FL/Fl_Export.H ../config.h +fl_vertex.o: fl_vertex.cxx ../config.h ../FL/fl_draw.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl.H ../FL/math.h +screen_xywh.o: screen_xywh.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../config.h +forms_compatability.o: forms_compatability.cxx ../FL/forms.H ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Window.H ../FL/fl_draw.H \ + ../FL/Fl_FormsBitmap.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H \ + ../FL/Fl_FormsPixmap.H ../FL/Fl_Pixmap.H ../FL/Fl_Box.H \ + ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H ../FL/Fl_Check_Button.H \ + ../FL/Fl_Chart.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Clock.H ../FL/Fl_Counter.H \ + ../FL/Fl_Dial.H ../FL/Fl_Free.H ../FL/fl_ask.H ../FL/fl_show_colormap.H \ + ../FL/filename.H ../FL/Fl_File_Chooser.H ../FL/Fl.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Group.H ../FL/Fl_Choice.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Button.H ../FL/Fl_Preferences.H \ + ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H ../FL/Fl_File_Icon.H \ + ../FL/Fl_Box.H ../FL/Fl_Check_Button.H ../FL/Fl_File_Input.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H \ + ../FL/fl_ask.H ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H \ + ../FL/Fl_Positioner.H ../FL/Fl_Value_Slider.H ../FL/Fl_Timer.H \ + ../FL/Fl_Repeat_Button.H +forms_bitmap.o: forms_bitmap.cxx ../FL/forms.H ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Window.H ../FL/fl_draw.H \ + ../FL/Fl_FormsBitmap.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H \ + ../FL/Fl_FormsPixmap.H ../FL/Fl_Pixmap.H ../FL/Fl_Box.H \ + ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H ../FL/Fl_Check_Button.H \ + ../FL/Fl_Chart.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Clock.H ../FL/Fl_Counter.H \ + ../FL/Fl_Dial.H ../FL/Fl_Free.H ../FL/fl_ask.H ../FL/fl_show_colormap.H \ + ../FL/filename.H ../FL/Fl_File_Chooser.H ../FL/Fl.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Group.H ../FL/Fl_Choice.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Button.H ../FL/Fl_Preferences.H \ + ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H ../FL/Fl_File_Icon.H \ + ../FL/Fl_Box.H ../FL/Fl_Check_Button.H ../FL/Fl_File_Input.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H \ + ../FL/fl_ask.H ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H \ + ../FL/Fl_Positioner.H ../FL/Fl_Value_Slider.H ../FL/Fl_Timer.H +forms_free.o: forms_free.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Free.H ../FL/Fl_Widget.H +forms_fselect.o: forms_fselect.cxx ../FL/forms.H ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Window.H ../FL/fl_draw.H \ + ../FL/Fl_FormsBitmap.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H \ + ../FL/Fl_FormsPixmap.H ../FL/Fl_Pixmap.H ../FL/Fl_Box.H \ + ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H ../FL/Fl_Check_Button.H \ + ../FL/Fl_Chart.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Clock.H ../FL/Fl_Counter.H \ + ../FL/Fl_Dial.H ../FL/Fl_Free.H ../FL/fl_ask.H ../FL/fl_show_colormap.H \ + ../FL/filename.H ../FL/Fl_File_Chooser.H ../FL/Fl.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Group.H ../FL/Fl_Choice.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Button.H ../FL/Fl_Preferences.H \ + ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H ../FL/Fl_File_Icon.H \ + ../FL/Fl_Box.H ../FL/Fl_Check_Button.H ../FL/Fl_File_Input.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H \ + ../FL/fl_ask.H ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H \ + ../FL/Fl_Positioner.H ../FL/Fl_Value_Slider.H ../FL/Fl_Timer.H \ + flstring.h ../FL/Fl_Export.H ../config.h +forms_pixmap.o: forms_pixmap.cxx ../FL/forms.H ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Window.H ../FL/fl_draw.H \ + ../FL/Fl_FormsBitmap.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H \ + ../FL/Fl_FormsPixmap.H ../FL/Fl_Pixmap.H ../FL/Fl_Box.H \ + ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H ../FL/Fl_Check_Button.H \ + ../FL/Fl_Chart.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Clock.H ../FL/Fl_Counter.H \ + ../FL/Fl_Dial.H ../FL/Fl_Free.H ../FL/fl_ask.H ../FL/fl_show_colormap.H \ + ../FL/filename.H ../FL/Fl_File_Chooser.H ../FL/Fl.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Group.H ../FL/Fl_Choice.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Button.H ../FL/Fl_Preferences.H \ + ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H ../FL/Fl_File_Icon.H \ + ../FL/Fl_Box.H ../FL/Fl_Check_Button.H ../FL/Fl_File_Input.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H \ + ../FL/fl_ask.H ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H \ + ../FL/Fl_Positioner.H ../FL/Fl_Value_Slider.H ../FL/Fl_Timer.H +forms_timer.o: forms_timer.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Timer.H ../FL/Fl_Widget.H ../FL/fl_draw.H +Fl_Gl_Choice.o: Fl_Gl_Choice.cxx ../config.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H Fl_Gl_Choice.H ../FL/gl_draw.H \ + ../FL/gl.h flstring.h ../FL/Fl_Export.H +Fl_Gl_Overlay.o: Fl_Gl_Overlay.cxx ../config.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H Fl_Gl_Choice.H ../FL/Fl_Gl_Window.H +Fl_Gl_Window.o: Fl_Gl_Window.cxx flstring.h ../FL/Fl_Export.H ../config.h \ + ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/x.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H Fl_Gl_Choice.H \ + ../FL/Fl_Gl_Window.H +freeglut_geometry.o: freeglut_geometry.cxx ../FL/glut.H ../FL/gl.h \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl.H ../FL/Fl_Gl_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/math.h +freeglut_stroke_mono_roman.o: freeglut_stroke_mono_roman.cxx ../FL/glut.H \ + ../FL/gl.h ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl.H \ + ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H +freeglut_stroke_roman.o: freeglut_stroke_roman.cxx ../FL/glut.H \ + ../FL/gl.h ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl.H \ + ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H +freeglut_teapot.o: freeglut_teapot.cxx ../FL/glut.H ../FL/gl.h \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl.H ../FL/Fl_Gl_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + freeglut_teapot_data.h +gl_draw.o: gl_draw.cxx flstring.h ../FL/Fl_Export.H ../config.h \ + ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/gl.h ../FL/x.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/fl_draw.H \ + Fl_Gl_Choice.H Fl_Font.H +gl_start.o: gl_start.cxx ../config.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/x.H ../FL/Fl_Window.H ../FL/fl_draw.H Fl_Gl_Choice.H +glut_compatability.o: glut_compatability.cxx flstring.h ../FL/Fl_Export.H \ + ../config.h ../FL/glut.H ../FL/gl.h ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl.H ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Menu_Item.H \ + ../FL/Fl_Image.H +glut_font.o: glut_font.cxx ../config.h ../FL/glut.H ../FL/gl.h \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl.H ../FL/Fl_Gl_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H +fl_images_core.o: fl_images_core.cxx ../FL/Fl_Shared_Image.H \ + ../FL/Fl_Image.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_BMP_Image.H ../FL/Fl_GIF_Image.H ../FL/Fl_Pixmap.H \ + ../FL/Fl_JPEG_Image.H ../FL/Fl_PNG_Image.H ../FL/Fl_PNM_Image.H \ + flstring.h ../FL/Fl_Export.H ../config.h +Fl_BMP_Image.o: Fl_BMP_Image.cxx ../FL/Fl_BMP_Image.H ../FL/Fl_Image.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../config.h +Fl_File_Icon2.o: Fl_File_Icon2.cxx flstring.h ../FL/Fl_Export.H \ + ../config.h ../FL/math.h ../FL/Fl_File_Icon.H ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Shared_Image.H \ + ../FL/Fl_Image.H ../FL/Fl_Widget.H ../FL/fl_draw.H ../FL/filename.H +Fl_GIF_Image.o: Fl_GIF_Image.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_GIF_Image.H ../FL/Fl_Pixmap.H \ + ../FL/Fl_Image.H flstring.h ../FL/Fl_Export.H ../config.h +Fl_Help_Dialog.o: Fl_Help_Dialog.cxx ../FL/Fl_Help_Dialog.H ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Group.H \ + ../FL/Fl_Button.H ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Box.H \ + ../FL/Fl_Help_View.H ../FL/Fl.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/fl_draw.H ../FL/Fl_Shared_Image.H \ + ../FL/Fl_Image.H flstring.h ../FL/Fl_Export.H ../config.h \ + ../FL/fl_ask.H +Fl_JPEG_Image.o: Fl_JPEG_Image.cxx ../FL/Fl_JPEG_Image.H ../FL/Fl_Image.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../config.h +Fl_PNG_Image.o: Fl_PNG_Image.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_PNG_Image.H ../FL/Fl_Image.H ../config.h +Fl_PNM_Image.o: Fl_PNM_Image.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_PNM_Image.H ../FL/Fl_Image.H flstring.h \ + ../FL/Fl_Export.H ../config.h +fl_call_main.o: fl_call_main.c +flstring.o: flstring.c flstring.h ../FL/Fl_Export.H ../config.h +scandir.o: scandir.c flstring.h ../FL/Fl_Export.H ../config.h +numericsort.o: numericsort.c ../config.h ../FL/filename.H \ + ../FL/Fl_Export.H +vsnprintf.o: vsnprintf.c flstring.h ../FL/Fl_Export.H ../config.h diff --git a/third_party/windows/fltk-1.1.10/src/makefile.wat b/third_party/windows/fltk-1.1.10/src/makefile.wat new file mode 100644 index 0000000..4f347dc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/makefile.wat @@ -0,0 +1,235 @@ +# +# "$Id: makefile.wat 5699 2007-02-20 17:02:41Z matt $" +# +# Library makefile for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2004 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems to "fltk-bugs@fltk.org". +# + +CPPFILES = & + Fl.obj & + Fl_Adjuster.obj & + Fl_Bitmap.obj & + Fl_Browser.obj & + Fl_Browser_.obj & + Fl_Browser_load.obj & + Fl_Box.obj & + Fl_Button.obj & + Fl_Chart.obj & + Fl_Check_Browser.obj & + Fl_Check_Button.obj & + Fl_Choice.obj & + Fl_Clock.obj & + Fl_Color_Chooser.obj & + Fl_Counter.obj & + Fl_Dial.obj & + Fl_Double_Window.obj & + Fl_File_Browser.obj & + Fl_File_Chooser.obj & + Fl_File_Chooser2.obj & + Fl_File_Icon.obj & + Fl_File_Input.obj & + Fl_Group.obj & + Fl_Help_View.obj & + Fl_Image.obj & + Fl_Input.obj & + Fl_Input_.obj & + Fl_Light_Button.obj & + Fl_Menu.obj & + Fl_Menu_.obj & + Fl_Menu_Bar.obj & + Fl_Sys_Menu_Bar.obj & + Fl_Menu_Button.obj & + Fl_Menu_Window.obj & + Fl_Menu_add.obj & + Fl_Menu_global.obj & + Fl_Multi_Label.obj & + Fl_Overlay_Window.obj & + Fl_Pack.obj & + Fl_Pixmap.obj & + Fl_Positioner.obj & + Fl_Preferences.obj & + Fl_Progress.obj & + Fl_Repeat_Button.obj & + Fl_Return_Button.obj & + Fl_Roller.obj & + Fl_Round_Button.obj & + Fl_Scroll.obj & + Fl_Scrollbar.obj & + Fl_Shared_Image.obj & + Fl_Single_Window.obj & + Fl_Slider.obj & + Fl_Tabs.obj & + Fl_Text_Buffer.obj & + Fl_Text_Display.obj & + Fl_Text_Editor.obj & + Fl_Tile.obj & + Fl_Tiled_Image.obj & + Fl_Tooltip.obj & + Fl_Valuator.obj & + Fl_Value_Input.obj & + Fl_Value_Output.obj & + Fl_Value_Slider.obj & + Fl_Widget.obj & + Fl_Window.obj & + Fl_Window_fullscreen.obj & + Fl_Window_hotspot.obj & + Fl_Window_iconize.obj & + Fl_Wizard.obj & + Fl_XBM_Image.obj & + Fl_XPM_Image.obj & + Fl_abort.obj & + Fl_add_idle.obj & + Fl_arg.obj & + Fl_compose.obj & + Fl_display.obj & + Fl_get_key.obj & + Fl_get_system_colors.obj & + Fl_grab.obj & + Fl_lock.obj & + Fl_own_colormap.obj & + Fl_visual.obj & + Fl_x.obj & + filename_absolute.obj & + filename_expand.obj & + filename_ext.obj & + filename_isdir.obj & + filename_list.obj & + filename_match.obj & + filename_setext.obj & + fl_arc.obj & + fl_arci.obj & + fl_ask.obj & + fl_boxtype.obj & + fl_color.obj & + fl_cursor.obj & + fl_curve.obj & + fl_diamond_box.obj & + fl_dnd.obj & + fl_draw.obj & + fl_draw_image.obj & + fl_draw_pixmap.obj & + fl_encoding_latin1.obj & + fl_encoding_mac_roman.obj & + fl_engraved_label.obj & + fl_file_dir.obj & + fl_font.obj & + fl_gtk.obj & + fl_labeltype.obj & + fl_line_style.obj & + fl_open_uri.obj & + fl_oval_box.obj & + fl_overlay.obj & + fl_overlay_visual.obj & + fl_plastic.obj & + fl_read_image.obj & + fl_rect.obj & + fl_round_box.obj & + fl_rounded_box.obj & + fl_set_font.obj & + fl_set_fonts.obj & + fl_scroll_area.obj & + fl_shadow_box.obj & + fl_shortcut.obj & + fl_show_colormap.obj & + fl_symbols.obj & + fl_vertex.obj & + screen_xywh.obj + +FLCPPFILES = & + forms_compatability.obj & + forms_bitmap.obj & + forms_free.obj & + forms_fselect.obj & + forms_pixmap.obj & + forms_timer.obj + +GLCPPFILES = & + Fl_Gl_Choice.obj & + Fl_Gl_Overlay.obj & + Fl_Gl_Window.obj & + freeglut_geometry.obj & + freeglut_stroke_mono_roman.obj & + freeglut_stroke_roman.obj & + freeglut_teapot.obj & + gl_draw.obj & + gl_start.obj & + glut_compatability.obj & + glut_font.obj + +IMGCPPFILES = & + fl_images_core.obj & + Fl_BMP_Image.obj & + Fl_File_Icon2.obj & + Fl_GIF_Image.obj & + Fl_Help_Dialog.obj & + Fl_JPEG_Image.obj & + Fl_PNG_Image.obj & + Fl_PNM_Image.obj + +CFILES = fl_call_main.obj flstring.obj scandir.obj numericsort.obj vsnprintf.obj + +################################################################ + +!include ../watcom.mif + +OBJECTS = $(CPPFILES) $(CFILES) +FLOBJECTS = $(FLCPPFILES) +GLOBJECTS = $(GLCPPFILES) +IMGOBJECTS = $(IMGCPPFILES) + +# The four basic fltk libraries are defined in ../watcom.mif, so that appliactions +# can also use them. +all: $(LIBNAME) & + $(LIBNAMEFL) & + $(LIBNAMEGL) & + $(LIBNAMEIMG) + +# $(DSONAME) & +# $(FLDSONAME) & +# $(GLDSONAME) & +# $(IMGDSONAME) + + +$(LIBNAME): $(OBJECTS) + $(LIB) $(LIBOPTS) $@ $< + +$(LIBNAMEFL): $(FLOBJECTS) + $(LIB) $(LIBOPTS) $@ $< + +$(LIBNAMEGL): $(GLOBJECTS) + $(LIB) $(LIBOPTS) $@ $< + +$(LIBNAMEIMG): $(IMGOBJECTS) + $(LIB) $(LIBOPTS) $@ $< + +# +# Clean all directories +# +clean : .SYMBOLIC + @echo Cleaning up. +CLEANEXTS = exe map sym obj lk1 + @for %a in ($(CLEANEXTS)) do -rm -f $(ODIR)\*.%a + -rm -f *.err + -rm -f $(LIBNAME) + -rm -f $(LIBNAMEFL) + -rm -f $(LIBNAMEGL) + -rm -f $(LIBNAMEIMG) + diff --git a/third_party/windows/fltk-1.1.10/src/mediumarrow.h b/third_party/windows/fltk-1.1.10/src/mediumarrow.h new file mode 100644 index 0000000..9952e20 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/mediumarrow.h @@ -0,0 +1,6 @@ +#define mediumarrow_width 16 +#define mediumarrow_height 16 +static unsigned char mediumarrow_bits[] = { + 0x40, 0x00, 0x60, 0x00, 0x70, 0x00, 0x78, 0x00, 0xfc, 0x3f, 0x78, 0x00, + 0x70, 0x00, 0x60, 0x02, 0x40, 0x06, 0x00, 0x0e, 0x00, 0x1e, 0xfc, 0x3f, + 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x06, 0x00, 0x02}; diff --git a/third_party/windows/fltk-1.1.10/src/new.xbm b/third_party/windows/fltk-1.1.10/src/new.xbm new file mode 100644 index 0000000..4f8665b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/new.xbm @@ -0,0 +1,6 @@ +#define new_width 16 +#define new_height 16 +static unsigned char new_bits[] = { + 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x02, 0x01, 0x01, 0xfe, 0x01, 0x80, + 0x31, 0x80, 0x31, 0x80, 0xfd, 0x80, 0xfd, 0x80, 0x31, 0x80, 0x31, 0x80, + 0x01, 0x80, 0x01, 0x80, 0xff, 0xff, 0x00, 0x00}; diff --git a/third_party/windows/fltk-1.1.10/src/ns.xbm b/third_party/windows/fltk-1.1.10/src/ns.xbm new file mode 100644 index 0000000..208f952 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/ns.xbm @@ -0,0 +1,8 @@ +#define ns_width 16 +#define ns_height 16 +#define ns_x_hot 8 +#define ns_y_hot 8 +static unsigned char ns_bits[] = { + 0x00, 0x00, 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0x80, 0x01, 0x80, 0x01, + 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, + 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01, 0x00, 0x00}; diff --git a/third_party/windows/fltk-1.1.10/src/ns_mask.xbm b/third_party/windows/fltk-1.1.10/src/ns_mask.xbm new file mode 100644 index 0000000..6607ac2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/ns_mask.xbm @@ -0,0 +1,8 @@ +#define ns_mask_width 16 +#define ns_mask_height 16 +#define ns_mask_x_hot 8 +#define ns_mask_y_hot 8 +static unsigned char ns_mask_bits[] = { + 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, 0xf0, 0x0f, 0xc0, 0x03, + 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xf0, 0x0f, + 0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01}; diff --git a/third_party/windows/fltk-1.1.10/src/numericsort.c b/third_party/windows/fltk-1.1.10/src/numericsort.c new file mode 100644 index 0000000..cbc8971 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/numericsort.c @@ -0,0 +1,111 @@ +/* + * "$Id: numericsort.c 4288 2005-04-16 00:13:17Z mike $" + * + * Numeric sorting routine for the Fast Light Tool Kit (FLTK). + * + * Copyright 1998-2005 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems on the following page: + * + * http://www.fltk.org/str.php + */ + +/* My own scandir sorting function, useful for the film industry where + we have many files with numbers in their names: */ + +#include +#include +#include +#include + +#include + +#if !defined(WIN32) || defined(__CYGWIN__) +# ifdef HAVE_DIRENT_H +# include +# else +# define dirent direct +# if HAVE_SYS_NDIR_H +# include +# endif /* HAVE_SYS_NDIR_H */ +# if HAVE_SYS_DIR_H +# include +# endif /* HAVE_SYS_DIR_H */ +# if HAVE_NDIR_H +# include +# endif /* HAVE_NDIR_H */ +# endif /* HAVE_DIRENT_H */ +#endif /* !WIN32 || __CYGWIN__ */ + +/* + * 'numericsort()' - Compare two directory entries, possibly with + * a case-insensitive comparison... + */ + +static int numericsort(struct dirent **A, struct dirent **B, int cs) { + const char* a = (*A)->d_name; + const char* b = (*B)->d_name; + int ret = 0; + for (;;) { + if (isdigit(*a & 255) && isdigit(*b & 255)) { + int diff,magdiff; + while (*a == '0') a++; + while (*b == '0') b++; + while (isdigit(*a & 255) && *a == *b) {a++; b++;} + diff = (isdigit(*a & 255) && isdigit(*b & 255)) ? *a - *b : 0; + magdiff = 0; + while (isdigit(*a & 255)) {magdiff++; a++;} + while (isdigit(*b & 255)) {magdiff--; b++;} + if (magdiff) {ret = magdiff; break;} /* compare # of significant digits*/ + if (diff) {ret = diff; break;} /* compare first non-zero digit */ + } else { + if (cs) { + /* compare case-sensitive */ + if ((ret = *a-*b)) break; + } else { + /* compare case-insensitve */ + if ((ret = tolower(*a & 255)-tolower(*b & 255))) break; + } + + if (!*a) break; + a++; b++; + } + } + if (!ret) return 0; + else return (ret < 0) ? -1 : 1; +} + +/* + * 'fl_casenumericsort()' - Compare directory entries with case-sensitivity. + */ + +int fl_casenumericsort(struct dirent **A, struct dirent **B) { + return numericsort(A, B, 0); +} + +/* + * 'fl_numericsort()' - Compare directory entries with case-sensitivity. + */ + +int fl_numericsort(struct dirent **A, struct dirent **B) { + return numericsort(A, B, 1); +} + +/* + * End of "$Id: numericsort.c 4288 2005-04-16 00:13:17Z mike $". + */ diff --git a/third_party/windows/fltk-1.1.10/src/scandir.c b/third_party/windows/fltk-1.1.10/src/scandir.c new file mode 100644 index 0000000..5e01215 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/scandir.c @@ -0,0 +1,124 @@ +/* Copyright (C) 1992, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. + +The GNU C Library is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public License as +published by the Free Software Foundation; either version 2 of the +License, or (at your option) any later version. + +The GNU C 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 +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +USA. */ + +#if defined(WIN32) && !defined(__CYGWIN__) +# include "scandir_win32.c" +#else + +# include "flstring.h" + +# if !HAVE_SCANDIR +# include +# include +# include + +# if HAVE_DIRENT_H +# include +# define NAMLEN(dirent) strlen((dirent)->d_name) +# else +# define dirent direct +# define NAMLEN(dirent) (dirent)->d_namlen +# if HAVE_SYS_NDIR_H +# include +# endif +# if HAVE_SYS_DIR_H +# include +# endif +# if HAVE_NDIR_H +# include +# endif +# endif + +int +fl_scandir(const char *dir, struct dirent ***namelist, + int (*select)(struct dirent *), + int (*compar)(struct dirent **, struct dirent **)) +{ + DIR *dp = opendir (dir); + struct dirent **v = NULL; + size_t vsize = 0, i; + struct dirent *d; + int save; + + if (dp == NULL) + return -1; + + save = errno; + errno = 0; + + i = 0; + while ((d = readdir (dp)) != NULL) + if (select == NULL || (*select) (d)) + { + size_t dsize; + + if (i == vsize) + { + struct dirent **newv; + if (vsize == 0) + vsize = 10; + else + vsize *= 2; + newv = (struct dirent **) realloc (v, vsize * sizeof (*v)); + if (newv == NULL) + { + lose: + errno = ENOMEM; + break; + } + v = newv; + } + +# define _D_EXACT_NAMLEN(d) (strlen ((d)->d_name)) +# define _D_ALLOC_NAMLEN(d) (sizeof (d)->d_name > 1 ? sizeof (d)->d_name : \ + _D_EXACT_NAMLEN (d) + 1) + + dsize = &d->d_name[_D_ALLOC_NAMLEN (d)] - (char *) d; + v[i] = (struct dirent *) malloc (dsize); + if (v[i] == NULL) + goto lose; + + memcpy (v[i++], d, dsize); + } + + if (errno != 0) + { + save = errno; + (void) closedir (dp); + while (i > 0) + free (v[--i]); + free (v); + errno = save; + return -1; + } + + (void) closedir (dp); + errno = save; + + /* Sort the list if we have a comparison function to sort with. */ + if (compar) qsort (v, i, sizeof (*v), (int (*)(const void *, const void *))compar); + *namelist = v; + return i; +} + +# endif +#endif + +/* + * End of "$Id: scandir.c 4052 2005-02-24 21:55:12Z mike $". + */ diff --git a/third_party/windows/fltk-1.1.10/src/scandir_win32.c b/third_party/windows/fltk-1.1.10/src/scandir_win32.c new file mode 100644 index 0000000..128060b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/scandir_win32.c @@ -0,0 +1,115 @@ +/* + * "$Id: scandir_win32.c 4548 2005-08-29 20:16:36Z matt $" + * + * WIN32 scandir function for the Fast Light Tool Kit (FLTK). + * + * Copyright 1998-2005 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems on the following page: + * + * http://www.fltk.org/str.php + */ + +#ifndef __CYGWIN__ +/* Emulation of posix scandir() call */ + +#include +#include "flstring.h" +#include +#include + +int fl_scandir(const char *dirname, struct dirent ***namelist, + int (*select)(struct dirent *), + int (*compar)(struct dirent **, struct dirent **)) { + int len; + char *findIn, *d, is_dir = 0; + WIN32_FIND_DATA find; + HANDLE h; + int nDir = 0, NDir = 0; + struct dirent **dir = 0, *selectDir; + unsigned long ret; + + len = strlen(dirname); + findIn = (char *)malloc((size_t)(len+5)); + + if (!findIn) return -1; + + strcpy(findIn, dirname); + for (d = findIn; *d; d++) if (*d=='/') *d='\\'; + if ((len==0)) { strcpy(findIn, ".\\*"); } + if ((len==2)&&findIn[1]==':'&&isalpha(findIn[0])) { *d++ = '\\'; *d = 0; } + if ((len==1)&& (d[-1]=='.')) { strcpy(findIn, ".\\*"); is_dir = 1; } + if ((len>0) && (d[-1]=='\\')) { *d++ = '*'; *d = 0; is_dir = 1; } + if ((len>1) && (d[-1]=='.') && (d[-2]=='\\')) { d[-1] = '*'; is_dir = 1; } + if (!is_dir) { /* this file may still be a directory that we need to list */ + DWORD attr = GetFileAttributes(findIn); + if (attr&FILE_ATTRIBUTE_DIRECTORY) + strcpy(d, "\\*"); + } + if ((h=FindFirstFile(findIn, &find))==INVALID_HANDLE_VALUE) { + free(findIn); + ret = GetLastError(); + if (ret != ERROR_NO_MORE_FILES) { + nDir = -1; + } + *namelist = dir; + return nDir; + } + do { + selectDir=(struct dirent*)malloc(sizeof(struct dirent)+strlen(find.cFileName)+2); + strcpy(selectDir->d_name, find.cFileName); + if (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + /* Append a trailing slash to directory names... */ + strcat(selectDir->d_name, "/"); + } + if (!select || (*select)(selectDir)) { + if (nDir==NDir) { + struct dirent **tempDir = (struct dirent **)calloc(sizeof(struct dirent*), (size_t)(NDir+33)); + if (NDir) memcpy(tempDir, dir, sizeof(struct dirent*)*NDir); + if (dir) free(dir); + dir = tempDir; + NDir += 32; + } + dir[nDir] = selectDir; + nDir++; + dir[nDir] = 0; + } else { + free(selectDir); + } + } while (FindNextFile(h, &find)); + ret = GetLastError(); + if (ret != ERROR_NO_MORE_FILES) { + /* don't return an error code, because the dir list may still be valid + up to this point */ + } + FindClose(h); + + free (findIn); + + if (compar) qsort(dir, (size_t)nDir, sizeof(*dir), + (int(*)(const void*, const void*))compar); + + *namelist = dir; + return nDir; +} + +#endif + +/* + * End of "$Id: scandir_win32.c 4548 2005-08-29 20:16:36Z matt $". + */ diff --git a/third_party/windows/fltk-1.1.10/src/screen_xywh.cxx b/third_party/windows/fltk-1.1.10/src/screen_xywh.cxx new file mode 100644 index 0000000..a393666 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/screen_xywh.cxx @@ -0,0 +1,256 @@ +// +// "$Id: screen_xywh.cxx 5848 2007-05-20 16:18:31Z mike $" +// +// Screen/monitor bounding box API for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + + +#include +#include +#include + + +// Number of screens... +static int num_screens = 0; + +#ifdef WIN32 +# if !defined(HMONITOR_DECLARED) && (_WIN32_WINNT < 0x0500) +# define COMPILE_MULTIMON_STUBS +# include +# endif // !HMONITOR_DECLARED && _WIN32_WINNT < 0x0500 + +// We go the much more difficult route of individually picking some multi-screen +// functions from the USER32.DLL . If these functions are not available, we +// will gracefully fall back to single monitor support. +// +// If we were to insist on the existence of "EnumDisplayMonitors" and +// "GetMonitorInfoA", it would be impossible to use FLTK on Windows 2000 +// before SP2 or earlier. + +// BOOL EnumDisplayMonitors(HDC, LPCRECT, MONITORENUMPROC, LPARAM) +typedef BOOL (WINAPI* fl_edm_func)(HDC, LPCRECT, MONITORENUMPROC, LPARAM); +// BOOL GetMonitorInfo(HMONITOR, LPMONITORINFO) +typedef BOOL (WINAPI* fl_gmi_func)(HMONITOR, LPMONITORINFO); + +static fl_gmi_func fl_gmi = NULL; // used to get a proc pointer for GetMonitorInfoA + +static RECT screens[16]; + +static BOOL CALLBACK screen_cb(HMONITOR mon, HDC, LPRECT r, LPARAM) { + if (num_screens >= 16) return TRUE; + + MONITORINFO mi; + mi.cbSize = sizeof(mi); + +// GetMonitorInfo(mon, &mi); +// (but we use our self-aquired function pointer instead) + if (fl_gmi(mon, &mi)) { + screens[num_screens] = mi.rcWork; + num_screens ++; + } + return TRUE; +} + +static void screen_init() { + // Since not all versions of Windows include multiple monitor support, + // we do a run-time check for the required functions... + HMODULE hMod = GetModuleHandle("USER32.DLL"); + + if (hMod) { + // check that EnumDisplayMonitors is available + fl_edm_func fl_edm = (fl_edm_func)GetProcAddress(hMod, "EnumDisplayMonitors"); + + if (fl_edm) { + // We do have EnumDisplayMonitors, so lets find out how many monitors... + num_screens = GetSystemMetrics(SM_CMONITORS); + + if (num_screens > 1) { + // If there is more than 1 monitor, enumerate them... + fl_gmi = (fl_gmi_func)GetProcAddress(hMod, "GetMonitorInfoA"); + + if (fl_gmi) { + // We have GetMonitorInfoA, enumerate all the screens... + num_screens = 0; +// EnumDisplayMonitors(0,0,screen_cb,0); +// (but we use our self-aquired function pointer instead) + fl_edm(0, 0, screen_cb, 0); + return; + } + } + } + } + + // If we get here, assume we have 1 monitor... + num_screens = 1; +} +#elif defined(__APPLE__) +XRectangle screens[16]; + +static void screen_init() { + GDHandle gd; + + for (gd = GetDeviceList(), num_screens = 0; gd; gd = GetNextDevice(gd)) { + GDPtr gp = *gd; + screens[num_screens].x = gp->gdRect.left; + screens[num_screens].y = gp->gdRect.top; + screens[num_screens].width = gp->gdRect.right - gp->gdRect.left; + screens[num_screens].height = gp->gdRect.bottom - gp->gdRect.top; + + num_screens ++; + if (num_screens >= 16) break; + } +} +#elif HAVE_XINERAMA +# include + +// Screen data... +static XineramaScreenInfo *screens; + +static void screen_init() { + if (!fl_display) fl_open_display(); + + if (XineramaIsActive(fl_display)) { + screens = XineramaQueryScreens(fl_display, &num_screens); + } else num_screens = 1; +} +#else +static void screen_init() { + num_screens = 1; +} +#endif // WIN32 + + +// Return the number of screens... +int Fl::screen_count() { + if (!num_screens) screen_init(); + + return num_screens; +} + +// Return the screen bounding rect for the given mouse position... +void Fl::screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my) { + if (!num_screens) screen_init(); + +#ifdef WIN32 + if (num_screens > 1) { + int i; + + for (i = 0; i < num_screens; i ++) { + if (mx >= screens[i].left && mx < screens[i].right && + my >= screens[i].top && my < screens[i].bottom) { + X = screens[i].left; + Y = screens[i].top; + W = screens[i].right - screens[i].left; + H = screens[i].bottom - screens[i].top; + return; + } + } + } +#elif defined(__APPLE__) + if (num_screens > 1) { + int i; + + for (i = 0; i < num_screens; i ++) { + if (mx >= screens[i].x && + mx < (screens[i].x + screens[i].width) && + my >= screens[i].y && + my < (screens[i].y + screens[i].height)) { + X = screens[i].x; + Y = screens[i].y; + W = screens[i].width; + H = screens[i].height; + return; + } + } + } +#elif HAVE_XINERAMA + if (num_screens > 1) { + int i; + + for (i = 0; i < num_screens; i ++) { + if (mx >= screens[i].x_org && + mx < (screens[i].x_org + screens[i].width) && + my >= screens[i].y_org && + my < (screens[i].y_org + screens[i].height)) { + X = screens[i].x_org; + Y = screens[i].y_org; + W = screens[i].width; + H = screens[i].height; + return; + } + } + } +#else + (void)mx; + (void)my; +#endif // WIN32 + + X = Fl::x(); + Y = Fl::y(); + W = Fl::w(); + H = Fl::h(); +} + +// Return the screen bounding rect for the given screen... +void Fl::screen_xywh(int &X, int &Y, int &W, int &H, int n) { + if (!num_screens) screen_init(); + +#ifdef WIN32 + if (num_screens > 1 && n >= 0 && n < num_screens) { + X = screens[n].left; + Y = screens[n].top; + W = screens[n].right - screens[n].left; + H = screens[n].bottom - screens[n].top; + return; + } +#elif defined(__APPLE__) + if (num_screens > 1 && n >= 0 && n < num_screens) { + X = screens[n].x; + Y = screens[n].y; + W = screens[n].width; + H = screens[n].height; + return; + } +#elif HAVE_XINERAMA + if (num_screens > 1 && n >= 0 && n < num_screens) { + X = screens[n].x_org; + Y = screens[n].y_org; + W = screens[n].width; + H = screens[n].height; + return; + } +#else + (void)n; +#endif // WIN32 + + X = Fl::x(); + Y = Fl::y(); + W = Fl::w(); + H = Fl::h(); +} + + +// +// End of "$Id: screen_xywh.cxx 5848 2007-05-20 16:18:31Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/src/slowarrow.h b/third_party/windows/fltk-1.1.10/src/slowarrow.h new file mode 100644 index 0000000..0958377 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/slowarrow.h @@ -0,0 +1,6 @@ +#define slowarrow_width 16 +#define slowarrow_height 16 +static unsigned char slowarrow_bits[] = { + 0x40, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, 0x00, 0xf0, 0x0f, 0x60, 0x00, + 0x60, 0x00, 0x40, 0x02, 0x40, 0x02, 0x00, 0x06, 0x00, 0x06, 0xf0, 0x0f, + 0x00, 0x06, 0x00, 0x06, 0x00, 0x02, 0x00, 0x02}; diff --git a/third_party/windows/fltk-1.1.10/src/tile.xpm b/third_party/windows/fltk-1.1.10/src/tile.xpm new file mode 100644 index 0000000..9d4087a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/tile.xpm @@ -0,0 +1,91 @@ +/* XPM */ +static char tile_cmap[3][32] = { +"O c #FFFFFF", +"o c #EFEFEF", +". c #E8E8E8" +}; +static const char * tile_xpm[] = { +"64 64 3 1", +tile_cmap[0], +tile_cmap[1], +tile_cmap[2], + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", + +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"................................................................", +"oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", +"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"}; diff --git a/third_party/windows/fltk-1.1.10/src/up.xbm b/third_party/windows/fltk-1.1.10/src/up.xbm new file mode 100644 index 0000000..af566b0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/up.xbm @@ -0,0 +1,6 @@ +#define up_width 16 +#define up_height 16 +static unsigned char up_bits[] = { + 0x00, 0x00, 0x78, 0x00, 0x84, 0x00, 0x02, 0x01, 0x31, 0xfe, 0x79, 0x80, + 0xfd, 0x80, 0x31, 0x80, 0x31, 0x80, 0x31, 0x80, 0x31, 0x80, 0x31, 0x80, + 0x01, 0x80, 0x01, 0x80, 0xff, 0xff, 0x00, 0x00}; diff --git a/third_party/windows/fltk-1.1.10/src/vsnprintf.c b/third_party/windows/fltk-1.1.10/src/vsnprintf.c new file mode 100644 index 0000000..77961be --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/vsnprintf.c @@ -0,0 +1,281 @@ +/* + * "$Id: vsnprintf.c 5850 2007-05-21 15:56:17Z matt $" + * + * snprintf() and vsnprintf() functions for the Fast Light Tool Kit (FLTK). + * + * Copyright 1998-2007 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems on the following page: + * + * http://www.fltk.org/str.php + */ + +#include +#include "flstring.h" + +#ifdef HAVE_SYS_STDTYPES_H +# include +#endif /* HAVE_SYS_STDTYPES_H */ + +#ifdef __cplusplus +extern "C" { +#endif + +int fl_vsnprintf(char* buffer, size_t bufsize, const char* format, va_list ap) { + char *bufptr, /* Pointer to position in buffer */ + *bufend, /* Pointer to end of buffer */ + sign, /* Sign of format width */ + size, /* Size character (h, l, L) */ + type; /* Format type character */ + int width, /* Width of field */ + prec; /* Number of characters of precision */ + char tformat[100], /* Temporary format string for sprintf() */ + *tptr, /* Pointer into temporary format */ + temp[1024]; /* Buffer for formatted numbers */ + char *s; /* Pointer to string */ + int slen; /* Length of string */ + int bytes; /* Total number of bytes needed */ + + + /* + * Loop through the format string, formatting as needed... + */ + + bufptr = buffer; + bufend = buffer + bufsize - 1; + bytes = 0; + + while (*format) { + if (*format == '%') { + tptr = tformat; + *tptr++ = *format++; + + if (*format == '%') { + if (bufptr && bufptr < bufend) *bufptr++ = *format; + bytes ++; + format ++; + continue; + } else if (strchr(" -+#\'", *format)) { + *tptr++ = *format; + sign = *format++; + } else sign = 0; + + if (*format == '*') { + /* Get width from argument... */ + format ++; + width = va_arg(ap, int); + snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", width); + tptr += strlen(tptr); + } else { + width = 0; + while (isdigit(*format & 255)) { + if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; + width = width * 10 + *format++ - '0'; + } + } + + if (*format == '.') { + if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; + format ++; + + if (*format == '*') { + /* Get precision from argument... */ + format ++; + prec = va_arg(ap, int); + snprintf(tptr, sizeof(tformat) - (tptr - tformat), "%d", prec); + tptr += strlen(tptr); + } else { + prec = 0; + while (isdigit(*format & 255)) { + if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; + prec = prec * 10 + *format++ - '0'; + } + } + } else prec = -1; + + size = '\0'; + + if (*format == 'l' && format[1] == 'l') { + size = 'L'; + if (tptr < (tformat + sizeof(tformat) - 2)) { + *tptr++ = 'l'; + *tptr++ = 'l'; + } + format += 2; + } else if (*format == 'h' || *format == 'l' || *format == 'L') { + if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; + size = *format++; + } + + if (!*format) break; + + if (tptr < (tformat + sizeof(tformat) - 1)) *tptr++ = *format; + type = *format++; + *tptr = '\0'; + + switch (type) { + case 'E' : /* Floating point formats */ + case 'G' : + case 'e' : + case 'f' : + case 'g' : + if ((width + 2) > sizeof(temp)) break; + + sprintf(temp, tformat, va_arg(ap, double)); + + bytes += strlen(temp); + + if (bufptr) { + if ((bufptr + strlen(temp)) > bufend) { + strncpy(bufptr, temp, (size_t)(bufend - bufptr)); + bufptr = bufend; + } else { + strcpy(bufptr, temp); + bufptr += strlen(temp); + } + } + break; + + case 'B' : /* Integer formats */ + case 'X' : + case 'b' : + case 'd' : + case 'i' : + case 'o' : + case 'u' : + case 'x' : + if ((width + 2) > sizeof(temp)) break; + +#ifdef HAVE_LONG_LONG + if (size == 'L') + sprintf(temp, tformat, va_arg(ap, long long)); + else +#endif /* HAVE_LONG_LONG */ + if (size == 'l') + sprintf(temp, tformat, va_arg(ap, long)); + else + sprintf(temp, tformat, va_arg(ap, int)); + + bytes += strlen(temp); + + if (bufptr) { + if ((bufptr + strlen(temp)) > bufend) { + strncpy(bufptr, temp, (size_t)(bufend - bufptr)); + bufptr = bufend; + } else { + strcpy(bufptr, temp); + bufptr += strlen(temp); + } + } + break; + + case 'p' : /* Pointer value */ + if ((width + 2) > sizeof(temp)) break; + + sprintf(temp, tformat, va_arg(ap, void *)); + + bytes += strlen(temp); + + if (bufptr) { + if ((bufptr + strlen(temp)) > bufend) { + strncpy(bufptr, temp, (size_t)(bufend - bufptr)); + bufptr = bufend; + } else { + strcpy(bufptr, temp); + bufptr += strlen(temp); + } + } + break; + + case 'c' : /* Character or character array */ + bytes += width; + + if (bufptr) { + if (width <= 1) *bufptr++ = va_arg(ap, int); + else { + if ((bufptr + width) > bufend) width = bufend - bufptr; + + memcpy(bufptr, va_arg(ap, char *), (size_t)width); + bufptr += width; + } + } + break; + + case 's' : /* String */ + if ((s = va_arg(ap, char *)) == NULL) s = "(null)"; + + slen = strlen(s); + if (slen > width && prec != width) width = slen; + + bytes += width; + + if (bufptr) { + if ((bufptr + width) > bufend) width = bufend - bufptr; + + if (slen > width) slen = width; + + if (sign == '-') { + strncpy(bufptr, s, (size_t)slen); + memset(bufptr + slen, ' ', (size_t)(width - slen)); + } else { + memset(bufptr, ' ', (size_t)(width - slen)); + strncpy(bufptr + width - slen, s, (size_t)slen); + } + + bufptr += width; + } + break; + + case 'n' : /* Output number of chars so far */ + *(va_arg(ap, int *)) = bytes; + break; + } + } else { + bytes ++; + + if (bufptr && bufptr < bufend) *bufptr++ = *format; + format ++; + } + } + + /* + * Nul-terminate the string and return the number of characters needed. + */ + + if (bufptr) *bufptr = '\0'; + + return (bytes); +} + +int fl_snprintf(char* str, size_t size, const char* fmt, ...) { + int ret; + va_list ap; + va_start(ap, fmt); + ret = vsnprintf(str, size, fmt, ap); + va_end(ap); + return ret; +} + +#ifdef __cplusplus +} +#endif + +/* + * End of "$Id: vsnprintf.c 5850 2007-05-21 15:56:17Z matt $". + */ + diff --git a/third_party/windows/fltk-1.1.10/test/CMakeLists.txt b/third_party/windows/fltk-1.1.10/test/CMakeLists.txt new file mode 100644 index 0000000..3762c0b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/CMakeLists.txt @@ -0,0 +1,96 @@ +MACRO(CREATE_EXAMPLE NAME SOURCES LIBRARIES) + SET(srcs) + FOREACH(src ${SOURCES}) + IF("${src}" MATCHES ".fl$") + GET_FILENAME_COMPONENT(fname ${src} NAME_WE) + SET(fluid_name "${CMAKE_CURRENT_SOURCE_DIR}/${fname}.fl") + SET(cxx_name "${CMAKE_CURRENT_BINARY_DIR}/${fname}.cxx") + SET(h_name "${CMAKE_CURRENT_BINARY_DIR}/${fname}.cxx") + SET(srcs ${srcs} "${cxx_name}") + ADD_CUSTOM_COMMAND( + OUTPUT ${cxx_name} + DEPENDS "${fluid_name}" "${FLUID_COMMAND}" + COMMAND ${FLUID_COMMAND} + ARGS -c ${fluid_name}) + ADD_CUSTOM_COMMAND( + OUTPUT ${h_name} + DEPENDS "${fluid_name}" "${FLUID_COMMAND}" + COMMAND ${FLUID_COMMAND} + ARGS -c ${fluid_name}) + ELSE("${src}" MATCHES ".fl$") + SET(srcs ${srcs} ${src}) + ENDIF("${src}" MATCHES ".fl$") + ENDFOREACH(src) + ADD_EXECUTABLE(${NAME} ${srcs}) + TARGET_LINK_LIBRARIES(${NAME} ${LIBRARIES}) +ENDMACRO(CREATE_EXAMPLE) + +INCLUDE_DIRECTORIES( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ) + +CREATE_EXAMPLE(adjuster adjuster.cxx fltk) +CREATE_EXAMPLE(arc arc.cxx fltk) +CREATE_EXAMPLE(ask ask.cxx fltk) +CREATE_EXAMPLE(bitmap bitmap.cxx fltk) +CREATE_EXAMPLE(boxtype boxtype.cxx fltk) +CREATE_EXAMPLE(browser browser.cxx fltk) +CREATE_EXAMPLE(button button.cxx fltk) +CREATE_EXAMPLE(buttons buttons.cxx fltk) +CREATE_EXAMPLE(checkers checkers.cxx fltk) +CREATE_EXAMPLE(clock clock.cxx fltk) +CREATE_EXAMPLE(colbrowser colbrowser.cxx "fltk;fltk_forms") +CREATE_EXAMPLE(color_chooser color_chooser.cxx fltk) +CREATE_EXAMPLE(cursor cursor.cxx fltk) +CREATE_EXAMPLE(curve curve.cxx fltk) +CREATE_EXAMPLE(demo demo.cxx "fltk;fltk_forms") +CREATE_EXAMPLE(doublebuffer doublebuffer.cxx fltk) +CREATE_EXAMPLE(editor editor.cxx fltk) +CREATE_EXAMPLE(fast_slow fast_slow.fl fltk) +CREATE_EXAMPLE(file_chooser file_chooser.cxx "fltk;fltk_images") +CREATE_EXAMPLE(fonts fonts.cxx fltk) +CREATE_EXAMPLE(forms forms.cxx "fltk;fltk_forms") +CREATE_EXAMPLE(hello hello.cxx fltk) +CREATE_EXAMPLE(help help.cxx "fltk;fltk_images") +CREATE_EXAMPLE(iconize iconize.cxx fltk) +CREATE_EXAMPLE(image image.cxx fltk) +CREATE_EXAMPLE(inactive inactive.fl fltk) +CREATE_EXAMPLE(input input.cxx fltk) +CREATE_EXAMPLE(keyboard "keyboard.cxx;keyboard_ui.fl" fltk) +CREATE_EXAMPLE(label label.cxx "fltk;fltk_forms") +CREATE_EXAMPLE(line_style line_style.cxx fltk) +CREATE_EXAMPLE(list_visuals list_visuals.cxx fltk) +CREATE_EXAMPLE(mandelbrot "mandelbrot_ui.fl;mandelbrot.cxx" fltk) +CREATE_EXAMPLE(menubar menubar.cxx fltk) +CREATE_EXAMPLE(message message.cxx fltk) +CREATE_EXAMPLE(minimum minimum.cxx fltk) +CREATE_EXAMPLE(navigation navigation.cxx fltk) +CREATE_EXAMPLE(output output.cxx "fltk;fltk_forms") +CREATE_EXAMPLE(overlay overlay.cxx fltk) +CREATE_EXAMPLE(pack pack.cxx fltk) +CREATE_EXAMPLE(pixmap pixmap.cxx fltk) +CREATE_EXAMPLE(pixmap_browser pixmap_browser.cxx "fltk;fltk_images") +CREATE_EXAMPLE(preferences preferences.fl fltk) +CREATE_EXAMPLE(radio radio.fl fltk) +CREATE_EXAMPLE(resize resize.fl fltk) +CREATE_EXAMPLE(resizebox resizebox.cxx fltk) +CREATE_EXAMPLE(scroll scroll.cxx fltk) +CREATE_EXAMPLE(subwindow subwindow.cxx fltk) +CREATE_EXAMPLE(symbols symbols.cxx fltk) +CREATE_EXAMPLE(tabs tabs.fl fltk) +CREATE_EXAMPLE(threads threads.cxx fltk) +CREATE_EXAMPLE(tile tile.cxx fltk) +CREATE_EXAMPLE(tiled_image tiled_image.cxx fltk) +CREATE_EXAMPLE(valuators valuators.fl fltk) + +# OpenGL demos... +IF(OPENGL_FOUND) +CREATE_EXAMPLE(CubeView "CubeMain.cxx;CubeView.cxx;CubeViewUI.fl" "fltk;fltk_gl") +CREATE_EXAMPLE(cube cube.cxx "fltk;fltk_gl;${OPENGL_LIBRARIES}") +CREATE_EXAMPLE(fractals "fractals.cxx;fracviewer.cxx" "fltk;fltk_gl") +CREATE_EXAMPLE(fullscreen fullscreen.cxx "fltk;fltk_gl") +CREATE_EXAMPLE(glpuzzle glpuzzle.cxx "fltk;fltk_gl;${OPENGL_LIBRARIES}") +CREATE_EXAMPLE(gl_overlay gl_overlay.cxx "fltk;fltk_gl;${OPENGL_LIBRARIES}") +CREATE_EXAMPLE(shape shape.cxx "fltk;fltk_gl;${OPENGL_LIBRARIES}") +ENDIF(OPENGL_FOUND) diff --git a/third_party/windows/fltk-1.1.10/test/CubeMain.cxx b/third_party/windows/fltk-1.1.10/test/CubeMain.cxx new file mode 100644 index 0000000..050a0ea --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/CubeMain.cxx @@ -0,0 +1,49 @@ +// +// "$Id: CubeMain.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// CubeView class definitions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "config.h" +#include +#include "CubeViewUI.h" + +int +main(int argc, char **argv) { + + CubeViewUI *cvui=new CubeViewUI; + +//Initial global objects. + + Fl::visual(FL_DOUBLE|FL_INDEX); + + cvui->show(argc, argv); + + return Fl::run(); +} + + +// +// End of "$Id: CubeMain.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/CubeView.cxx b/third_party/windows/fltk-1.1.10/test/CubeView.cxx new file mode 100644 index 0000000..f4243db --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/CubeView.cxx @@ -0,0 +1,173 @@ +// +// "$Id: CubeView.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// CubeView class implementation for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "CubeView.h" +#include + + +#if HAVE_GL +CubeView::CubeView(int x,int y,int w,int h,const char *l) + : Fl_Gl_Window(x,y,w,h,l) +#else +CubeView::CubeView(int x,int y,int w,int h,const char *l) + : Fl_Box(x,y,w,h,l) +#endif /* HAVE_GL */ +{ + vAng = 0.0; + hAng=0.0; + size=10.0; + xshift=0.0; + yshift=0.0; + + /* The cube definition. These are the vertices of a unit cube + * centered on the origin.*/ + + boxv0[0] = -0.5; boxv0[1] = -0.5; boxv0[2] = -0.5; + boxv1[0] = 0.5; boxv1[1] = -0.5; boxv1[2] = -0.5; + boxv2[0] = 0.5; boxv2[1] = 0.5; boxv2[2] = -0.5; + boxv3[0] = -0.5; boxv3[1] = 0.5; boxv3[2] = -0.5; + boxv4[0] = -0.5; boxv4[1] = -0.5; boxv4[2] = 0.5; + boxv5[0] = 0.5; boxv5[1] = -0.5; boxv5[2] = 0.5; + boxv6[0] = 0.5; boxv6[1] = 0.5; boxv6[2] = 0.5; + boxv7[0] = -0.5; boxv7[1] = 0.5; boxv7[2] = 0.5; + +#if !HAVE_GL + label("OpenGL is required for this demo to operate."); + align(FL_ALIGN_WRAP | FL_ALIGN_INSIDE); +#endif /* !HAVE_GL */ +} + +#if HAVE_GL +void CubeView::drawCube() { +/* Draw a colored cube */ +#define ALPHA 0.5 + glShadeModel(GL_FLAT); + + glBegin(GL_QUADS); + glColor4f(0.0, 0.0, 1.0, ALPHA); + glVertex3fv(boxv0); + glVertex3fv(boxv1); + glVertex3fv(boxv2); + glVertex3fv(boxv3); + + glColor4f(1.0, 1.0, 0.0, ALPHA); + glVertex3fv(boxv0); + glVertex3fv(boxv4); + glVertex3fv(boxv5); + glVertex3fv(boxv1); + + glColor4f(0.0, 1.0, 1.0, ALPHA); + glVertex3fv(boxv2); + glVertex3fv(boxv6); + glVertex3fv(boxv7); + glVertex3fv(boxv3); + + glColor4f(1.0, 0.0, 0.0, ALPHA); + glVertex3fv(boxv4); + glVertex3fv(boxv5); + glVertex3fv(boxv6); + glVertex3fv(boxv7); + + glColor4f(1.0, 0.0, 1.0, ALPHA); + glVertex3fv(boxv0); + glVertex3fv(boxv3); + glVertex3fv(boxv7); + glVertex3fv(boxv4); + + glColor4f(0.0, 1.0, 0.0, ALPHA); + glVertex3fv(boxv1); + glVertex3fv(boxv5); + glVertex3fv(boxv6); + glVertex3fv(boxv2); + glEnd(); + + glColor3f(1.0, 1.0, 1.0); + glBegin(GL_LINES); + glVertex3fv(boxv0); + glVertex3fv(boxv1); + + glVertex3fv(boxv1); + glVertex3fv(boxv2); + + glVertex3fv(boxv2); + glVertex3fv(boxv3); + + glVertex3fv(boxv3); + glVertex3fv(boxv0); + + glVertex3fv(boxv4); + glVertex3fv(boxv5); + + glVertex3fv(boxv5); + glVertex3fv(boxv6); + + glVertex3fv(boxv6); + glVertex3fv(boxv7); + + glVertex3fv(boxv7); + glVertex3fv(boxv4); + + glVertex3fv(boxv0); + glVertex3fv(boxv4); + + glVertex3fv(boxv1); + glVertex3fv(boxv5); + + glVertex3fv(boxv2); + glVertex3fv(boxv6); + + glVertex3fv(boxv3); + glVertex3fv(boxv7); + glEnd(); +}//drawCube + +void CubeView::draw() { + if (!valid()) { + glLoadIdentity(); + glViewport(0,0,w(),h()); + glOrtho(-10,10,-10,10,-20050,10000); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix(); + + glTranslatef(xshift, yshift, 0); + glRotatef(hAng,0,1,0); glRotatef(vAng,1,0,0); + glScalef(float(size),float(size),float(size)); + + drawCube(); + + glPopMatrix(); +} +#endif /* HAVE_GL */ + +// +// End of "$Id: CubeView.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/CubeView.h b/third_party/windows/fltk-1.1.10/test/CubeView.h new file mode 100644 index 0000000..977edc8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/CubeView.h @@ -0,0 +1,124 @@ +// +// "$Id: CubeView.h 5519 2006-10-11 03:12:15Z mike $" +// +// CubeView class definitions for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef CUBEVIEW_H +#define CUBEVIEW_H 1 +#include +#include +#if HAVE_GL +# include +# include +#else +# include +#endif /* HAVE_GL */ + +#include + +#if HAVE_GL +class CubeView : public Fl_Gl_Window { +#else +class CubeView : public Fl_Box { +#endif /* HAVE_GL */ + +public: + // this value determines the scaling factor used to draw the cube. + double size; + + CubeView(int x,int y,int w,int h,const char *l=0); + + /* Set the rotation about the vertical (y ) axis. + * + * This function is called by the horizontal roller in CubeViewUI and the + * initialize button in CubeViewUI. + */ + void v_angle(float angle){vAng=angle;}; + + // Return the rotation about the vertical (y ) axis. + float v_angle(){return vAng;}; + + /* Set the rotation about the horizontal (x ) axis. + * + * This function is called by the vertical roller in CubeViewUI and the + * initialize button in CubeViewUI. + */ + + void h_angle(float angle){hAng=angle;}; + + // the rotation about the horizontal (x ) axis. + float h_angle(){return hAng;}; + + /* Sets the x shift of the cube view camera. + * + * This function is called by the slider in CubeViewUI and the + * initialize button in CubeViewUI. + */ + void panx(float x){xshift=x;}; + /* Sets the y shift of the cube view camera. + * + * This function is called by the slider in CubeViewUI and the + * initialize button in CubeViewUI. + */ + void pany(float y){yshift=y;}; + +#if HAVE_GL + /*The widget class draw() override. + * + *The draw() function initialize Gl for another round o f drawing + * then calls specialized functions for drawing each of the + * entities displayed in the cube view. + * + */ + void draw(); +#endif /* HAVE_GL */ +private: + + /* Draw the cube boundaries + * + *Draw the faces of the cube using the boxv[] vertices, using + * GL_LINE_LOOP for the faces. The color is \#defined by CUBECOLOR. + */ +#if HAVE_GL + void drawCube(); +#else + void drawCube() { } +#endif /* HAVE_GL */ + + float vAng,hAng; + float xshift,yshift; + + + float boxv0[3];float boxv1[3]; + float boxv2[3];float boxv3[3]; + float boxv4[3];float boxv5[3]; + float boxv6[3];float boxv7[3]; + +}; +#endif + +// +// End of "$Id: CubeView.h 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/CubeViewUI.fl b/third_party/windows/fltk-1.1.10/test/CubeViewUI.fl new file mode 100644 index 0000000..34de8a8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/CubeViewUI.fl @@ -0,0 +1,75 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0108 +header_name {.h} +code_name {.cxx} +class CubeViewUI {open +} { + Function {CubeViewUI()} {open + } { + Fl_Window mainWindow { + label CubeView open + private xywh {428 124 415 405} type Double box UP_BOX labelsize 12 resizable visible + } { + Fl_Group {} {open + xywh {5 3 374 399} + } { + Fl_Group VChange {open + xywh {5 100 37 192} + } { + Fl_Roller vrot { + label {V Rot} + callback {cube->v_angle(((Fl_Roller *)o)->value()); +cube->redraw();} + xywh {5 100 17 186} labeltype NO_LABEL labelsize 12 align 128 minimum -180 maximum 180 step 1 + code0 {\#include } + } + Fl_Slider ypan { + label {V Pan} + callback {cube->pany(((Fl_Slider *)o)->value()); +cube->redraw();} + xywh {25 100 17 186} type {Vert Knob} selection_color 136 labeltype NO_LABEL labelsize 12 align 0 minimum -25 maximum 25 step 0.1 + } + } + Fl_Group HChange {open + xywh {120 362 190 40} + } { + Fl_Slider xpan { + label {H Pan} + callback {cube->panx(((Fl_Slider *)o)->value()); +cube->redraw();} + xywh {122 364 186 17} type {Horz Knob} selection_color 136 labeltype NO_LABEL labelsize 12 align 16 minimum 25 maximum -25 step 0.1 + } + Fl_Roller hrot { + label {H Rotation} + callback {cube->h_angle(((Fl_Roller *)o)->value()); +cube->redraw();} + xywh {122 383 186 17} type Horizontal labeltype NO_LABEL labelsize 12 align 8 minimum -180 maximum 180 step 1 + } + } + Fl_Group MainView {open + xywh {46 27 333 333} resizable + } { + Fl_Box cframe { + xywh {46 27 333 333} box DOWN_FRAME color 4 selection_color 69 + } + Fl_Box cube { + label {This is the cube_view} selected + xywh {48 29 329 329} align 16 resizable + code0 {\#include "CubeView.h"} + class CubeView + } + } + Fl_Value_Slider zoom { + label Zoom + callback {cube->size=((Fl_Value_Slider *)o)->value(); +cube->redraw();} + xywh {106 3 227 19} type {Horz Knob} selection_color 136 labelfont 1 labelsize 12 align 4 minimum 1 maximum 50 step 0.1 value 10 textfont 1 + } + } + } + } + Function {show(int argc, char **argv)} {open + } { + code {mainWindow->show(argc, argv);} {} + } +} diff --git a/third_party/windows/fltk-1.1.10/test/Makefile b/third_party/windows/fltk-1.1.10/test/Makefile new file mode 100644 index 0000000..48f305e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/Makefile @@ -0,0 +1,485 @@ +# +# "$Id: Makefile 6612 2008-12-29 20:21:29Z matt $" +# +# Test/example program makefile for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2007 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems on the following page: +# +# http://www.fltk.org/str.php +# + +include ../makeinclude + +CPPFILES =\ + unittests.cxx \ + adjuster.cxx \ + arc.cxx \ + ask.cxx \ + bitmap.cxx \ + blocks.cxx \ + boxtype.cxx \ + browser.cxx \ + button.cxx \ + buttons.cxx \ + checkers.cxx \ + clock.cxx \ + colbrowser.cxx \ + color_chooser.cxx \ + cube.cxx \ + CubeMain.cxx \ + CubeView.cxx \ + cursor.cxx \ + curve.cxx \ + demo.cxx \ + doublebuffer.cxx \ + editor.cxx \ + fast_slow.cxx \ + file_chooser.cxx \ + fonts.cxx \ + forms.cxx \ + fractals.cxx \ + fullscreen.cxx \ + gl_overlay.cxx \ + glpuzzle.cxx \ + hello.cxx \ + help.cxx \ + iconize.cxx \ + image.cxx \ + inactive.cxx \ + input.cxx \ + input_choice.cxx \ + keyboard.cxx \ + label.cxx \ + line_style.cxx \ + list_visuals.cxx \ + mandelbrot.cxx \ + menubar.cxx \ + message.cxx \ + minimum.cxx \ + navigation.cxx \ + output.cxx \ + overlay.cxx \ + pack.cxx \ + pixmap_browser.cxx \ + pixmap.cxx \ + preferences.cxx \ + radio.cxx \ + resizebox.cxx \ + resize.cxx \ + scroll.cxx \ + shape.cxx \ + subwindow.cxx \ + sudoku.cxx \ + symbols.cxx \ + tabs.cxx \ + threads.cxx \ + tile.cxx \ + tiled_image.cxx \ + valuators.cxx + +ALL = \ + unittests$(EXEEXT) \ + adjuster$(EXEEXT) \ + arc$(EXEEXT) \ + ask$(EXEEXT) \ + bitmap$(EXEEXT) \ + blocks$(EXEEXT) \ + boxtype$(EXEEXT) \ + browser$(EXEEXT) \ + button$(EXEEXT) \ + buttons$(EXEEXT) \ + checkers$(EXEEXT) \ + clock$(EXEEXT) \ + colbrowser$(EXEEXT) \ + color_chooser$(EXEEXT) \ + cursor$(EXEEXT) \ + curve$(EXEEXT) \ + demo$(EXEEXT) \ + doublebuffer$(EXEEXT) \ + editor$(EXEEXT) \ + fast_slow$(EXEEXT) \ + file_chooser$(EXEEXT) \ + fonts$(EXEEXT) \ + forms$(EXEEXT) \ + hello$(EXEEXT) \ + help$(EXEEXT) \ + iconize$(EXEEXT) \ + image$(EXEEXT) \ + inactive$(EXEEXT) \ + input$(EXEEXT) \ + input_choice$(EXEEXT) \ + keyboard$(EXEEXT) \ + label$(EXEEXT) \ + line_style$(EXEEXT) \ + list_visuals$(EXEEXT) \ + mandelbrot$(EXEEXT) \ + menubar$(EXEEXT) \ + message$(EXEEXT) \ + minimum$(EXEEXT) \ + navigation$(EXEEXT) \ + output$(EXEEXT) \ + overlay$(EXEEXT) \ + pack$(EXEEXT) \ + pixmap$(EXEEXT) \ + pixmap_browser$(EXEEXT) \ + preferences$(EXEEXT) \ + radio$(EXEEXT) \ + resize$(EXEEXT) \ + resizebox$(EXEEXT) \ + scroll$(EXEEXT) \ + subwindow$(EXEEXT) \ + sudoku$(EXEEXT) \ + symbols$(EXEEXT) \ + tabs$(EXEEXT) \ + $(THREADS) \ + tile$(EXEEXT) \ + tiled_image$(EXEEXT) \ + valuators$(EXEEXT) + +GLALL = \ + cube$(EXEEXT) \ + CubeView$(EXEEXT) \ + fractals$(EXEEXT) \ + fullscreen$(EXEEXT) \ + gl_overlay$(EXEEXT) \ + glpuzzle$(EXEEXT) \ + shape$(EXEEXT) + +all: $(ALL) $(GLDEMOS) + +gldemos: $(GLALL) + +depend: $(CPPFILES) + makedepend -Y -I.. -f makedepend $(CPPFILES) + +# Automatically generated dependencies... +include makedepend + +clean: + $(RM) $(ALL) $(GLALL) core + $(RM) *.o core.* *~ *.bck *.bak + $(RM) CubeViewUI.cxx + $(RM) fast_slow.cxx + $(RM) inactive.cxx + $(RM) keyboard_ui.cxx + $(RM) mandelbrot_ui.cxx + $(RM) preferences.cxx + $(RM) radio.cxx + $(RM) resize.cxx + $(RM) tabs.cxx + $(RM) valuators.cxx + $(OSX_ONLY) $(RM) blocks.app/Contents/MacOS/blocks$(EXEEXT) + $(OSX_ONLY) $(RM) checkers.app/Contents/MacOS/checkers$(EXEEXT) + $(OSX_ONLY) $(RM) sudoku.app/Contents/MacOS/sudoku$(EXEEXT) + +install: all + echo "Installing example programs to $(DESTDIR)$(docdir)/examples..." + -$(INSTALL_DIR) $(DESTDIR)$(docdir)/examples + for file in *.h *.cxx *.fl demo.menu; do \ + $(INSTALL_DATA) $$file $(DESTDIR)$(docdir)/examples; \ + done + -$(INSTALL_DIR) $(DESTDIR)$(docdir)/examples/pixmaps + for file in pixmaps/*.xbm pixmaps/*.xpm; do \ + $(INSTALL_DATA) $$file $(DESTDIR)$(docdir)/examples/pixmaps; \ + done + +install-linux: + echo Installing games to $(DESTDIR)$(bindir)... + -$(INSTALL_DIR) $(DESTDIR)$(bindir) + -$(INSTALL_DIR) $(DESTDIR)/usr/share/applications + -$(INSTALL_DIR) $(DESTDIR)/usr/share/icons/hicolor/32x32/apps + -$(INSTALL_DIR) $(DESTDIR)/usr/share/icons/hicolor/128x128/apps + for game in blocks checkers sudoku; do \ + $(INSTALL_BIN) $$game $(DESTDIR)$(bindir); \ + $(INSTALL_DATA) desktop/$$game.desktop $(DESTDIR)/usr/share/applications; \ + $(INSTALL_DATA) desktop/$$game-32.png $(DESTDIR)/usr/share/icons/hicolor/32x32/apps/$$game.png; \ + $(INSTALL_DATA) desktop/$$game-128.png $(DESTDIR)/usr/share/icons/hicolor/128x128/apps/$$game.png; \ + done + +install-osx: + echo Installing games in $(DESTDIR)/Applications... + for game in blocks checkers sudoku; do \ + if test ! -d $(DESTDIR)/Applications/$$game.app; then \ + $(INSTALL_DIR) $(DESTDIR)/Applications/$$game.app; \ + $(INSTALL_DIR) $(DESTDIR)/Applications/$$game.app/Contents; \ + $(INSTALL_DIR) $(DESTDIR)/Applications/$$game.app/Contents/MacOS; \ + $(INSTALL_DIR) $(DESTDIR)/Applications/$$game.app/Contents/Resources; \ + fi; \ + $(INSTALL_DATA) $$game.app/Contents/Info.plist $(DESTDIR)/Applications/$$game.app/Contents; \ + $(INSTALL_DATA) $$game.app/Contents/PkgInfo $(DESTDIR)/Applications/$$game.app/Contents; \ + $(INSTALL_BIN) $$game.app/Contents/MacOS/$$game $(DESTDIR)/Applications/$$game.app/Contents/MacOS; \ + $(INSTALL_DATA) $$game.app/Contents/Resources/$$game.icns $(DESTDIR)/Applications/$$game.app/Contents/Resources; \ + done + +uninstall: + echo "Removing examples programs from $(DESTDIR)$(docdir)/examples..." + -$(RMDIR) $(DESTDIR)$(docdir)/examples + +uninstall-linux: + echo Removing games from $(DESTDIR)$(bindir)... + for game in blocks checkers sudoku; do \ + $(RM) $(DESTDIR)$(bindir)/$$game; \ + $(RM) $(DESTDIR)/usr/share/applications/$$game.desktop; \ + $(RM) $(DESTDIR)/usr/share/icons/hicolor/32x32/apps/$$game.png; \ + $(RM) $(DESTDIR)/usr/share/icons/hicolor/128x128/apps/$$game.png; \ + done + +uninstall-osx: + echo Removing games from $(DESTDIR)/Applications... + $(RMDIR) $(DESTDIR)/Applications/blocks.app + $(RMDIR) $(DESTDIR)/Applications/checkers.app + $(RMDIR) $(DESTDIR)/Applications/sudoku.app + +# FLUID file rules +.fl.cxx .fl.h: ../fluid/fluid$(EXEEXT) + echo Generating $@ and header from $<... + ../fluid/fluid$(EXEEXT) -c $< + +# All demos depend on the FLTK library... +$(ALL): $(LIBNAME) + +# General demos... +unittests$(EXEEXT): unittests.o + +adjuster$(EXEEXT): adjuster.o + +arc$(EXEEXT): arc.o + +ask$(EXEEXT): ask.o + +bitmap$(EXEEXT): bitmap.o + +boxtype$(EXEEXT): boxtype.o + +browser$(EXEEXT): browser.o + +button$(EXEEXT): button.o + +buttons$(EXEEXT): buttons.o + +blocks$(EXEEXT): blocks.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) blocks.o -o $@ $(AUDIOLIBS) $(LINKFLTK) $(LDLIBS) + $(OSX_ONLY) $(INSTALL_BIN) blocks$(EXEEXT) blocks.app/Contents/MacOS + $(POSTBUILD) $@ ../FL/mac.r + +checkers$(EXEEXT): checkers.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) checkers.o -o $@ $(LINKFLTK) $(LDLIBS) + $(OSX_ONLY) $(INSTALL_BIN) checkers$(EXEEXT) checkers.app/Contents/MacOS + $(POSTBUILD) $@ ../FL/mac.r + +clock$(EXEEXT): clock.o + +colbrowser$(EXEEXT): colbrowser.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ colbrowser.o $(LINKFLTKFORMS) $(LDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +color_chooser$(EXEEXT): color_chooser.o + +cursor$(EXEEXT): cursor.o + +curve$(EXEEXT): curve.o + +demo$(EXEEXT): demo.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ demo.o $(LINKFLTKFORMS) $(LDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +doublebuffer$(EXEEXT): doublebuffer.o + +editor$(EXEEXT): editor.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) editor.o -o $@ $(LINKFLTKIMG) $(LDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +fast_slow$(EXEEXT): fast_slow.o +fast_slow.cxx: fast_slow.fl ../fluid/fluid$(EXEEXT) + +file_chooser$(EXEEXT): file_chooser.o $(IMGLIBNAME) + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) file_chooser.o -o $@ $(LINKFLTKIMG) $(LDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +fonts$(EXEEXT): fonts.o + +forms$(EXEEXT): forms.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ forms.o $(LINKFLTKFORMS) $(LDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +hello$(EXEEXT): hello.o + +help$(EXEEXT): help.o $(IMGLIBNAME) + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) help.o -o $@ $(LINKFLTKIMG) $(LDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +iconize$(EXEEXT): iconize.o + +image$(EXEEXT): image.o + +inactive$(EXEEXT): inactive.o +inactive.cxx: inactive.fl ../fluid/fluid$(EXEEXT) + +input$(EXEEXT): input.o + +input_choice$(EXEEXT): input_choice.o + +keyboard$(EXEEXT): keyboard_ui.o keyboard.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ keyboard.o keyboard_ui.o $(LINKFLTK) $(LDLIBS) + $(POSTBUILD) $@ ../FL/mac.r +keyboard_ui.o: keyboard_ui.h +keyboard_ui.cxx: keyboard_ui.fl ../fluid/fluid$(EXEEXT) + +label$(EXEEXT): label.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ label.o $(LINKFLTKFORMS) $(LDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +line_style$(EXEEXT): line_style.o + +list_visuals$(EXEEXT): list_visuals.o + +mandelbrot$(EXEEXT): mandelbrot_ui.o mandelbrot.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ mandelbrot.o mandelbrot_ui.o $(LINKFLTK) $(LDLIBS) + $(POSTBUILD) $@ ../FL/mac.r +mandelbrot_ui.o: mandelbrot_ui.h +mandelbrot_ui.cxx: mandelbrot_ui.fl ../fluid/fluid$(EXEEXT) + +menubar$(EXEEXT): menubar.o + +message$(EXEEXT): message.o + +minimum$(EXEEXT): minimum.o + +navigation$(EXEEXT): navigation.o + +output$(EXEEXT): output.o $(FLLIBNAME) + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ output.o $(LINKFLTKFORMS) $(LDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +overlay$(EXEEXT): overlay.o + +pack$(EXEEXT): pack.o + +pixmap$(EXEEXT): pixmap.o + +pixmap_browser$(EXEEXT): pixmap_browser.o $(IMGLIBNAME) + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) pixmap_browser.o -o $@ $(LINKFLTKIMG) $(LDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +preferences$(EXEEXT): preferences.o +preferences.cxx: preferences.fl ../fluid/fluid$(EXEEXT) + +radio$(EXEEXT): radio.o +radio.cxx: radio.fl ../fluid/fluid$(EXEEXT) + +resize$(EXEEXT): resize.o +resize.cxx: resize.fl ../fluid/fluid$(EXEEXT) + +resizebox$(EXEEXT): resizebox.o + +scroll$(EXEEXT): scroll.o + +subwindow$(EXEEXT): subwindow.o + +sudoku: sudoku.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) sudoku.o -o $@ $(AUDIOLIBS) $(LINKFLTKIMG) $(LDLIBS) + $(OSX_ONLY) $(INSTALL_BIN) sudoku$(EXEEXT) sudoku.app/Contents/MacOS + $(POSTBUILD) $@ ../FL/mac.r + +sudoku.exe: sudoku.o sudoku.rc + echo Linking $@... + windres sudoku.rc sudokures.o + $(CXX) $(ARCHFLAGS) $(LDFLAGS) sudoku.o sudokures.o -o $@ $(AUDIOLIBS) $(LINKFLTKIMG) $(LDLIBS) + +symbols$(EXEEXT): symbols.o + +tabs$(EXEEXT): tabs.o +tabs.cxx: tabs.fl ../fluid/fluid$(EXEEXT) + +threads$(EXEEXT): threads.o +# This ensures that we have this dependency even if threads are not +# enabled in the current tree... +threads.o: threads.h + +tile$(EXEEXT): tile.o + +tiled_image$(EXEEXT): tiled_image.o + +valuators$(EXEEXT): valuators.o +valuators.cxx: valuators.fl ../fluid/fluid$(EXEEXT) + +# All OpenGL demos depend on the FLTK and FLTK_GL libraries... +$(GLALL): $(LIBNAME) $(GLLIBNAME) + +# OpenGL demos... +CubeView$(EXEEXT): CubeMain.o CubeView.o CubeViewUI.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ \ + CubeMain.o CubeView.o CubeViewUI.o \ + $(LINKFLTKGL) $(LINKFLTK) $(GLDLIBS) + $(POSTBUILD) $@ ../FL/mac.r +CubeMain.o: CubeViewUI.h CubeView.h CubeViewUI.cxx +CubeView.o: CubeView.h +CubeViewUI.o: CubeViewUI.cxx CubeViewUI.h +CubeViewUI.cxx: CubeViewUI.fl ../fluid/fluid$(EXEEXT) + +cube$(EXEEXT): cube.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ cube.o $(LINKFLTKGL) $(LINKFLTK) $(GLDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +fractals$(EXEEXT): fractals.o fracviewer.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ fractals.o fracviewer.o $(LINKFLTKGL) $(LINKFLTK) $(GLDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +fullscreen$(EXEEXT): fullscreen.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ fullscreen.o $(LINKFLTKGL) $(LINKFLTK) $(GLDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +glpuzzle$(EXEEXT): glpuzzle.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ glpuzzle.o $(LINKFLTKGL) $(LINKFLTK) $(GLDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +gl_overlay$(EXEEXT): gl_overlay.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ gl_overlay.o $(LINKFLTKGL) $(LINKFLTK) $(GLDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + +shape$(EXEEXT): shape.o + echo Linking $@... + $(CXX) $(ARCHFLAGS) $(LDFLAGS) -o $@ shape.o $(LINKFLTKGL) $(LINKFLTK) $(GLDLIBS) + $(POSTBUILD) $@ ../FL/mac.r + + +# +# End of "$Id: Makefile 6612 2008-12-29 20:21:29Z matt $". +# diff --git a/third_party/windows/fltk-1.1.10/test/README b/third_party/windows/fltk-1.1.10/test/README new file mode 100644 index 0000000..20a4d8e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/README @@ -0,0 +1,30 @@ +test/README - 20 Oct 1998 +------------------------- + +This directory contains tests and demos of FL. In most cases you can +learn a lot about how to program FL by looking at the source code. + +Type "make" to compile them all. + +The program "demo" is a graphical interface to run all the demos. (you +may recognize this as a rewrite of an XForms program). + +Some of the more interesting programs: + +fractals: A GLUT program with FL controls added to it + +glpuzzle: A GLUT program with no modifications + +fullscreen: Demo of how to make your window toggle to fill screen + +list_visuals: necessary to debug X visual stuff + +mandelbrot: A true application, using panels built in Fluid + +menubar: Demo of how FL's menus work + +shiny: Demo of drawing FL's controls using OpenGL + +forms: An XForms program to demonstrate emulation + +colbrowser: Another XForms program that is actually useful diff --git a/third_party/windows/fltk-1.1.10/test/adjuster.cxx b/third_party/windows/fltk-1.1.10/test/adjuster.cxx new file mode 100644 index 0000000..ad596f9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/adjuster.cxx @@ -0,0 +1,66 @@ +// +// "$Id: adjuster.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Adjuster test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +void adjcb(Fl_Widget *o, void *v) { + Fl_Adjuster *a = (Fl_Adjuster*)o; + Fl_Box *b = (Fl_Box *)v; + a->format((char *)(b->label())); + b->redraw(); +} + +int main(int argc, char ** argv) { + Fl_Window window(320,100,argv[0]); + + char buf1[100]; + Fl_Box b1(FL_DOWN_BOX,20,30,80,25,buf1); + b1.color(FL_WHITE); + Fl_Adjuster a1(20+80,30,3*25,25); + a1.callback(adjcb,&b1); + adjcb(&a1,&b1); + + char buf2[100]; + Fl_Box b2(FL_DOWN_BOX,20+80+4*25,30,80,25,buf2); + b2.color(FL_WHITE); + Fl_Adjuster a2(b2.x()+b2.w(),10,25,3*25); + a2.callback(adjcb,&b2); + adjcb(&a2,&b2); + + window.resizable(window); + window.end(); + window.show(argc, argv); + return Fl::run(); +} + +// +// End of "$Id: adjuster.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/arc.cxx b/third_party/windows/fltk-1.1.10/test/arc.cxx new file mode 100644 index 0000000..90f48cd --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/arc.cxx @@ -0,0 +1,99 @@ +// +// "$Id: arc.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Arc drawing test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include + +double args[6] = {140, 140, 50, 0, 360, 0}; +const char* name[6] = {"X", "Y", "R", "start", "end", "rotate"}; + +class Drawing : public Fl_Widget { + void draw() { + fl_clip(x(),y(),w(),h()); + fl_color(FL_DARK3); + fl_rectf(x(),y(),w(),h()); + fl_push_matrix(); + if (args[5]) { + fl_translate(x()+w()/2.0, y()+h()/2.0); + fl_rotate(args[5]); + fl_translate(-(x()+w()/2.0), -(y()+h()/2.0)); + } + fl_color(FL_WHITE); + fl_translate(x(),y()); + fl_begin_complex_polygon(); + fl_arc(args[0],args[1],args[2],args[3],args[4]); + fl_gap(); + fl_arc(140,140,20,0,-360); + fl_end_complex_polygon(); + fl_color(FL_RED); + fl_begin_line(); + fl_arc(args[0],args[1],args[2],args[3],args[4]); + fl_end_line(); + fl_pop_matrix(); + fl_pop_clip(); + } +public: + Drawing(int X,int Y,int W,int H) : Fl_Widget(X,Y,W,H) {} +}; + +Drawing *d; + +void slider_cb(Fl_Widget* o, void* v) { + Fl_Slider* s = (Fl_Slider*)o; + args[long(v)] = s->value(); + d->redraw(); +} + +int main(int argc, char** argv) { + Fl_Double_Window window(300,500); + Drawing drawing(10,10,280,280); + d = &drawing; + + int y = 300; + for (int n = 0; n<6; n++) { + Fl_Slider* s = new Fl_Hor_Value_Slider(50,y,240,25,name[n]); y += 25; + if (n<3) {s->minimum(0); s->maximum(300);} + else if (n==5) {s->minimum(0); s->maximum(360);} + else {s->minimum(-360); s->maximum(360);} + s->step(1); + s->value(args[n]); + s->align(FL_ALIGN_LEFT); + s->callback(slider_cb, (void*)n); + } + + window.end(); + window.show(argc,argv); + return Fl::run(); +} + + +// +// End of "$Id: arc.cxx 5519 2006-10-11 03:12:15Z mike $". +// + diff --git a/third_party/windows/fltk-1.1.10/test/ask.cxx b/third_party/windows/fltk-1.1.10/test/ask.cxx new file mode 100644 index 0000000..c0d95bd --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/ask.cxx @@ -0,0 +1,80 @@ +// +// "$Id: ask.cxx 5671 2007-02-08 07:58:47Z matt $" +// +// Standard dialog test program for the Fast Light Tool Kit (FLTK). +// +// Demonstrates how to use readqueue to see if a button has been +// pushed, and to see if a window has been closed, thus avoiding +// the need to define callbacks. +// +// This also demonstrates how to trap attempts by the user to +// close the last window by overriding Fl::exit +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +void rename_me(Fl_Widget*o) { + const char *input = fl_input("Input:", o->label()); + + if (input) { + o->copy_label(input); + o->redraw(); + } +} + +void window_callback(Fl_Widget*, void*) { + if (!fl_choice("Are you sure you want to quit?", "Cancel", "Quit", 0L)) return; + exit(0); +} + +int main(int argc, char **argv) { + char buffer[128] = "test text"; + +// this is a test to make sure automatic destructors work. Pop up +// the question dialog several times and make sure it don't crash. + + Fl_Window window(200, 55); + Fl_Return_Button b(20, 10, 160, 35, buffer); b.callback(rename_me); + window.end(); + window.resizable(&b); + window.show(argc, argv); + +// Also we test to see if the exit callback works: + window.callback(window_callback); + + return Fl::run(); +} + +// +// End of "$Id: ask.cxx 5671 2007-02-08 07:58:47Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/test/bitmap.cxx b/third_party/windows/fltk-1.1.10/test/bitmap.cxx new file mode 100644 index 0000000..b672288 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/bitmap.cxx @@ -0,0 +1,147 @@ +// +// "$Id: bitmap.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Bitmap label test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +#define sorceress_width 75 +#define sorceress_height 75 +static uchar sorceress_bits[] = { + 0xfc, 0x7e, 0x40, 0x20, 0x90, 0x00, 0x07, 0x80, 0x23, 0x00, 0x00, 0xc6, + 0xc1, 0x41, 0x98, 0xb8, 0x01, 0x07, 0x66, 0x00, 0x15, 0x9f, 0x03, 0x47, + 0x8c, 0xc6, 0xdc, 0x7b, 0xcc, 0x00, 0xb0, 0x71, 0x0e, 0x4d, 0x06, 0x66, + 0x73, 0x8e, 0x8f, 0x01, 0x18, 0xc4, 0x39, 0x4b, 0x02, 0x23, 0x0c, 0x04, + 0x1e, 0x03, 0x0c, 0x08, 0xc7, 0xef, 0x08, 0x30, 0x06, 0x07, 0x1c, 0x02, + 0x06, 0x30, 0x18, 0xae, 0xc8, 0x98, 0x3f, 0x78, 0x20, 0x06, 0x02, 0x20, + 0x60, 0xa0, 0xc4, 0x1d, 0xc0, 0xff, 0x41, 0x04, 0xfa, 0x63, 0x80, 0xa1, + 0xa4, 0x3d, 0x00, 0x84, 0xbf, 0x04, 0x0f, 0x06, 0xfc, 0xa1, 0x34, 0x6b, + 0x01, 0x1c, 0xc9, 0x05, 0x06, 0xc7, 0x06, 0xbe, 0x11, 0x1e, 0x43, 0x30, + 0x91, 0x05, 0xc3, 0x61, 0x02, 0x30, 0x1b, 0x30, 0xcc, 0x20, 0x11, 0x00, + 0xc1, 0x3c, 0x03, 0x20, 0x0a, 0x00, 0xe8, 0x60, 0x21, 0x00, 0x61, 0x1b, + 0xc1, 0x63, 0x08, 0xf0, 0xc6, 0xc7, 0x21, 0x03, 0xf8, 0x08, 0xe1, 0xcf, + 0x0a, 0xfc, 0x4d, 0x99, 0x43, 0x07, 0x3c, 0x0c, 0xf1, 0x9f, 0x0b, 0xfc, + 0x5b, 0x81, 0x47, 0x02, 0x16, 0x04, 0x31, 0x1c, 0x0b, 0x1f, 0x17, 0x89, + 0x4d, 0x06, 0x1a, 0x04, 0x31, 0x38, 0x02, 0x07, 0x56, 0x89, 0x49, 0x04, + 0x0b, 0x04, 0xb1, 0x72, 0x82, 0xa1, 0x54, 0x9a, 0x49, 0x04, 0x1d, 0x66, + 0x50, 0xe7, 0xc2, 0xf0, 0x54, 0x9a, 0x58, 0x04, 0x0d, 0x62, 0xc1, 0x1f, + 0x44, 0xfc, 0x51, 0x90, 0x90, 0x04, 0x86, 0x63, 0xe0, 0x74, 0x04, 0xef, + 0x31, 0x1a, 0x91, 0x00, 0x02, 0xe2, 0xc1, 0xfd, 0x84, 0xf9, 0x30, 0x0a, + 0x91, 0x00, 0x82, 0xa9, 0xc0, 0xb9, 0x84, 0xf9, 0x31, 0x16, 0x81, 0x00, + 0x42, 0xa9, 0xdb, 0x7f, 0x0c, 0xff, 0x1c, 0x16, 0x11, 0x00, 0x02, 0x28, + 0x0b, 0x07, 0x08, 0x60, 0x1c, 0x02, 0x91, 0x00, 0x46, 0x29, 0x0e, 0x00, + 0x00, 0x00, 0x10, 0x16, 0x11, 0x02, 0x06, 0x29, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x16, 0x91, 0x06, 0xa6, 0x2a, 0x04, 0x00, 0x00, 0x00, 0x18, 0x24, + 0x91, 0x04, 0x86, 0x2a, 0x04, 0x00, 0x00, 0x00, 0x18, 0x27, 0x93, 0x04, + 0x96, 0x4a, 0x04, 0x00, 0x00, 0x00, 0x04, 0x02, 0x91, 0x04, 0x86, 0x4a, + 0x0c, 0x00, 0x00, 0x00, 0x1e, 0x23, 0x93, 0x04, 0x56, 0x88, 0x08, 0x00, + 0x00, 0x00, 0x90, 0x21, 0x93, 0x04, 0x52, 0x0a, 0x09, 0x80, 0x01, 0x00, + 0xd0, 0x21, 0x95, 0x04, 0x57, 0x0a, 0x0f, 0x80, 0x27, 0x00, 0xd8, 0x20, + 0x9d, 0x04, 0x5d, 0x08, 0x1c, 0x80, 0x67, 0x00, 0xe4, 0x01, 0x85, 0x04, + 0x79, 0x8a, 0x3f, 0x00, 0x00, 0x00, 0xf4, 0x11, 0x85, 0x06, 0x39, 0x08, + 0x7d, 0x00, 0x00, 0x18, 0xb7, 0x10, 0x81, 0x03, 0x29, 0x12, 0xcb, 0x00, + 0x7e, 0x30, 0x28, 0x00, 0x85, 0x03, 0x29, 0x10, 0xbe, 0x81, 0xff, 0x27, + 0x0c, 0x10, 0x85, 0x03, 0x29, 0x32, 0xfa, 0xc1, 0xff, 0x27, 0x94, 0x11, + 0x85, 0x03, 0x28, 0x20, 0x6c, 0xe1, 0xff, 0x07, 0x0c, 0x01, 0x85, 0x01, + 0x28, 0x62, 0x5c, 0xe3, 0x8f, 0x03, 0x4e, 0x91, 0x80, 0x05, 0x39, 0x40, + 0xf4, 0xc2, 0xff, 0x00, 0x9f, 0x91, 0x84, 0x05, 0x31, 0xc6, 0xe8, 0x07, + 0x7f, 0x80, 0xcd, 0x00, 0xc4, 0x04, 0x31, 0x06, 0xc9, 0x0e, 0x00, 0xc0, + 0x48, 0x88, 0xe0, 0x04, 0x79, 0x04, 0xdb, 0x12, 0x00, 0x30, 0x0c, 0xc8, + 0xe4, 0x04, 0x6d, 0x06, 0xb6, 0x23, 0x00, 0x18, 0x1c, 0xc0, 0x84, 0x04, + 0x25, 0x0c, 0xff, 0xc2, 0x00, 0x4e, 0x06, 0xb0, 0x80, 0x04, 0x3f, 0x8a, + 0xb3, 0x83, 0xff, 0xc3, 0x03, 0x91, 0x84, 0x04, 0x2e, 0xd8, 0x0f, 0x3f, + 0x00, 0x00, 0x5f, 0x83, 0x84, 0x04, 0x2a, 0x70, 0xfd, 0x7f, 0x00, 0x00, + 0xc8, 0xc0, 0x84, 0x04, 0x4b, 0xe2, 0x2f, 0x01, 0x00, 0x08, 0x58, 0x60, + 0x80, 0x04, 0x5b, 0x82, 0xff, 0x01, 0x00, 0x08, 0xd0, 0xa0, 0x84, 0x04, + 0x72, 0x80, 0xe5, 0x00, 0x00, 0x08, 0xd2, 0x20, 0x44, 0x04, 0xca, 0x02, + 0xff, 0x00, 0x00, 0x08, 0xde, 0xa0, 0x44, 0x04, 0x82, 0x02, 0x6d, 0x00, + 0x00, 0x08, 0xf6, 0xb0, 0x40, 0x02, 0x82, 0x07, 0x3f, 0x00, 0x00, 0x08, + 0x44, 0x58, 0x44, 0x02, 0x93, 0x3f, 0x1f, 0x00, 0x00, 0x30, 0x88, 0x4f, + 0x44, 0x03, 0x83, 0x23, 0x3e, 0x00, 0x00, 0x00, 0x18, 0x60, 0xe0, 0x07, + 0xe3, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x70, 0x70, 0xe4, 0x07, 0xc7, 0x1b, + 0xfe, 0x01, 0x00, 0x00, 0xe0, 0x3c, 0xe4, 0x07, 0xc7, 0xe3, 0xfe, 0x1f, + 0x00, 0x00, 0xff, 0x1f, 0xfc, 0x07, 0xc7, 0x03, 0xf8, 0x33, 0x00, 0xc0, + 0xf0, 0x07, 0xff, 0x07, 0x87, 0x02, 0xfc, 0x43, 0x00, 0x60, 0xf0, 0xff, + 0xff, 0x07, 0x8f, 0x06, 0xbe, 0x87, 0x00, 0x30, 0xf8, 0xff, 0xff, 0x07, + 0x8f, 0x14, 0x9c, 0x8f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x07, 0x9f, 0x8d, + 0x8a, 0x0f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0xbf, 0x0b, 0x80, 0x1f, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x07, 0x7f, 0x3a, 0x80, 0x3f, 0x00, 0x80, + 0xff, 0xff, 0xff, 0x07, 0xff, 0x20, 0xc0, 0x3f, 0x00, 0x80, 0xff, 0xff, + 0xff, 0x07, 0xff, 0x01, 0xe0, 0x7f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x07, + 0xff, 0x0f, 0xf8, 0xff, 0x40, 0xe0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, + 0x41, 0xf0, 0xff, 0xff, 0xff, 0x07}; + +#include + +Fl_Toggle_Button *leftb,*rightb,*topb,*bottomb,*insideb,*overb,*inactb; +Fl_Button *b; +Fl_Window *w; + +void button_cb(Fl_Widget *,void *) { + int i = 0; + if (leftb->value()) i |= FL_ALIGN_LEFT; + if (rightb->value()) i |= FL_ALIGN_RIGHT; + if (topb->value()) i |= FL_ALIGN_TOP; + if (bottomb->value()) i |= FL_ALIGN_BOTTOM; + if (insideb->value()) i |= FL_ALIGN_INSIDE; + if (overb->value()) i |= FL_ALIGN_TEXT_OVER_IMAGE; + b->align(i); + if (inactb->value()) b->deactivate(); + else b->activate(); + w->redraw(); +} + +int main(int argc, char **argv) { + w = new Fl_Window(400,400); + b = new Fl_Button(140,160,120,120,"Bitmap"); + b->image(new Fl_Bitmap(sorceress_bits,sorceress_width,sorceress_height)); + leftb = new Fl_Toggle_Button(25,50,50,25,"left"); + leftb->callback(button_cb); + rightb = new Fl_Toggle_Button(75,50,50,25,"right"); + rightb->callback(button_cb); + topb = new Fl_Toggle_Button(125,50,50,25,"top"); + topb->callback(button_cb); + bottomb = new Fl_Toggle_Button(175,50,50,25,"bottom"); + bottomb->callback(button_cb); + insideb = new Fl_Toggle_Button(225,50,50,25,"inside"); + insideb->callback(button_cb); + overb = new Fl_Toggle_Button(25,75,100,25,"text over"); + overb->callback(button_cb); + inactb = new Fl_Toggle_Button(125,75,100,25,"inactive"); + inactb->callback(button_cb); + w->resizable(w); + w->end(); + w->show(argc, argv); + return Fl::run(); +} + +// +// End of "$Id: bitmap.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/blocks.app/Contents/Info.plist b/third_party/windows/fltk-1.1.10/test/blocks.app/Contents/Info.plist new file mode 100644 index 0000000..2a4566a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/blocks.app/Contents/Info.plist @@ -0,0 +1,44 @@ + + + + CFBundleInfoDictionaryVersion + 6.0 + + CFBundleExecutable + blocks + + CFBundleIdentifier + com.easysw.blocks + + CFBundleVersion + 1.0 + + CFBundleDevelopmentRegion + English + + NSHumanReadableCopyright + Copyright 2006 by Michael Sweet + + CFAppleHelpAnchor + help + + CFBundleName + blocks + + CFBundlePackageType + APPL + + CFBundleSignature + BLKS + + CFBundleIconFile + blocks.icns + + CFBundleShortVersionString + 1.0 + + CFBundleGetInfoString + 1.0, Copyright 2006 by Michael Sweet + + + diff --git a/third_party/windows/fltk-1.1.10/test/blocks.app/Contents/PkgInfo b/third_party/windows/fltk-1.1.10/test/blocks.app/Contents/PkgInfo new file mode 100644 index 0000000..098c33c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/blocks.app/Contents/PkgInfo @@ -0,0 +1 @@ +BLKSBlks diff --git a/third_party/windows/fltk-1.1.10/test/blocks.app/Contents/Resources/blocks.icns b/third_party/windows/fltk-1.1.10/test/blocks.app/Contents/Resources/blocks.icns new file mode 100644 index 0000000..9b0f8d5 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/test/blocks.app/Contents/Resources/blocks.icns differ diff --git a/third_party/windows/fltk-1.1.10/test/blocks.cxx b/third_party/windows/fltk-1.1.10/test/blocks.cxx new file mode 100644 index 0000000..5f7339b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/blocks.cxx @@ -0,0 +1,1019 @@ +// +// "$Id: blocks.cxx 5976 2007-11-19 14:14:13Z matt $" +// +// "Block Attack!" scrolling blocks game using the Fast Light Tool Kit (FLTK). +// +// Copyright 2006 by Michael Sweet. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Audio headers... +#include + +#ifndef WIN32 +# include +# include +#endif // !WIN32 + +#ifdef HAVE_ALSA_ASOUNDLIB_H +# define ALSA_PCM_NEW_HW_PARAMS_API +# include +#endif // HAVE_ALSA_ASOUNDLIB_H +#ifdef __APPLE__ +# include +#endif // __APPLE__ +#ifdef WIN32 +# include +#endif // WIN32 + + +#define BLOCK_COLS 20 +#define BLOCK_ROWS 10 +#define BLOCK_SIZE 32 +#define BLOCK_BLAST 100 + +#include "pixmaps/blast.xpm" +Fl_Pixmap blast_pixmap(blast_xpm); + +#include "pixmaps/red.xpm" +Fl_Pixmap red_pixmap(red_xpm); +#include "pixmaps/red_bomb.xpm" +Fl_Pixmap red_bomb_pixmap(red_bomb_xpm); + +#include "pixmaps/green.xpm" +Fl_Pixmap green_pixmap(green_xpm); +#include "pixmaps/green_bomb.xpm" +Fl_Pixmap green_bomb_pixmap(green_bomb_xpm); + +#include "pixmaps/blue.xpm" +Fl_Pixmap blue_pixmap(blue_xpm); +#include "pixmaps/blue_bomb.xpm" +Fl_Pixmap blue_bomb_pixmap(blue_bomb_xpm); + +#include "pixmaps/yellow.xpm" +Fl_Pixmap yellow_pixmap(yellow_xpm); +#include "pixmaps/yellow_bomb.xpm" +Fl_Pixmap yellow_bomb_pixmap(yellow_bomb_xpm); + +#include "pixmaps/cyan.xpm" +Fl_Pixmap cyan_pixmap(cyan_xpm); +#include "pixmaps/cyan_bomb.xpm" +Fl_Pixmap cyan_bomb_pixmap(cyan_bomb_xpm); + +#include "pixmaps/magenta.xpm" +Fl_Pixmap magenta_pixmap(magenta_xpm); +#include "pixmaps/magenta_bomb.xpm" +Fl_Pixmap magenta_bomb_pixmap(magenta_bomb_xpm); + +#include "pixmaps/gray.xpm" +Fl_Pixmap gray_pixmap(gray_xpm); +#include "pixmaps/gray_bomb.xpm" +Fl_Pixmap gray_bomb_pixmap(gray_bomb_xpm); + +Fl_Pixmap *normal_pixmaps[] = { + &red_pixmap, + &green_pixmap, + &blue_pixmap, + &yellow_pixmap, + &cyan_pixmap, + &magenta_pixmap, + &gray_pixmap +}; +Fl_Pixmap *bomb_pixmaps[] = { + &red_bomb_pixmap, + &green_bomb_pixmap, + &blue_bomb_pixmap, + &yellow_bomb_pixmap, + &cyan_bomb_pixmap, + &magenta_bomb_pixmap, + &gray_bomb_pixmap +}; + +const unsigned char screen_bits[] = { + 0xff, 0x55, 0xff, 0xaa, 0xff, 0x55, 0xff, 0xaa +}; +Fl_Bitmap screen_bitmap(screen_bits, 8, 8); +Fl_Tiled_Image screen_tile(&screen_bitmap); + + +// Sound class... +// +// There are MANY ways to implement sound in a FLTK application. +// The approach we are using here is to conditionally compile OS- +// specific code into the application - CoreAudio for MacOS X, the +// standard Win32 API stuff for Windows, ALSA or X11 for Linux, and +// X11 for all others. We have to support ALSA on Linux because the +// current Xorg releases no longer support XBell() or the PC speaker. +// +// There are several good cross-platform audio libraries we could also +// use, such as OpenAL, PortAudio, and SDL, however they were not chosen +// for this application because of our limited use of sound. +// +// Many thanks to Ian MacArthur who provided sample code that led to +// the CoreAudio implementation you see here! +class BlockSound { + // Private, OS-specific data... +#ifdef __APPLE__ + AudioDeviceID device; + AudioStreamBasicDescription format; + short *data; + int remaining; + + static OSStatus audio_cb(AudioDeviceID device, + const AudioTimeStamp *current_time, + const AudioBufferList *data_in, + const AudioTimeStamp *time_in, + AudioBufferList *data_out, + const AudioTimeStamp *time_out, + void *client_data); +#elif defined(WIN32) + HWAVEOUT device; + HGLOBAL header_handle; + LPWAVEHDR header_ptr; + HGLOBAL data_handle; + LPSTR data_ptr; + +#else +# ifdef HAVE_ALSA_ASOUNDLIB_H + snd_pcm_t *handle; +# endif // HAVE_ALSA_ASOUNDLIB_H +#endif // __APPLE__ + + public: + + // Common data... + static short *sample_data; + static int sample_size; + + BlockSound(); + ~BlockSound(); + + void play_explosion(float duration); +}; + +// Sound class globals... +short *BlockSound::sample_data = NULL; +int BlockSound::sample_size = 0; + + +// Initialize the BlockSound class +BlockSound::BlockSound() { + sample_size = 0; + +#ifdef __APPLE__ + remaining = 0; + + UInt32 size = sizeof(device); + + if (AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, + &size, (void *)&device) != noErr) return; + + size = sizeof(format); + if (AudioDeviceGetProperty(device, 0, false, kAudioDevicePropertyStreamFormat, + &size, &format) != noErr) return; + + // Set up a format we like... + format.mSampleRate = 44100.0; // 44.1kHz + format.mChannelsPerFrame = 2; // stereo + + if (AudioDeviceSetProperty(device, NULL, 0, false, + kAudioDevicePropertyStreamFormat, + sizeof(format), &format) != noErr) return; + + // Check we got linear pcm - what to do if we did not ??? + if (format.mFormatID != kAudioFormatLinearPCM) return; + + // Attach the callback + if (AudioDeviceAddIOProc(device, audio_cb, (void *)this) != noErr) return; + + // Start the device... + AudioDeviceStart(device, audio_cb); + + sample_size = (int)format.mSampleRate; + +#elif defined(WIN32) + WAVEFORMATEX format; + + memset(&format, 0, sizeof(format)); + format.cbSize = sizeof(format); + format.wFormatTag = WAVE_FORMAT_PCM; + format.nChannels = 2; + format.nSamplesPerSec = 44100; + format.nAvgBytesPerSec = 44100 * 4; + format.nBlockAlign = 4; + format.wBitsPerSample = 16; + + data_handle = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, format.nSamplesPerSec * 4); + if (!data_handle) return; + + data_ptr = (LPSTR)GlobalLock(data_handle); + + header_handle = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof(WAVEHDR)); + if (!header_handle) return; + + header_ptr = (WAVEHDR *)GlobalLock(header_handle); + + header_ptr->lpData = data_ptr; + header_ptr->dwFlags = 0; + header_ptr->dwLoops = 0; + + if (waveOutOpen(&device, WAVE_MAPPER, &format, 0, 0, WAVE_ALLOWSYNC) + != MMSYSERR_NOERROR) return; + + sample_size = format.nSamplesPerSec; + +#else +# ifdef HAVE_ALSA_ASOUNDLIB_H + handle = NULL; + + if (snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0) >= 0) { + // Initialize PCM sound stuff... + snd_pcm_hw_params_t *params; + + snd_pcm_hw_params_alloca(¶ms); + snd_pcm_hw_params_any(handle, params); + snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED); + snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16); + snd_pcm_hw_params_set_channels(handle, params, 2); + unsigned rate = 44100; + int dir; + snd_pcm_hw_params_set_rate_near(handle, params, &rate, &dir); + snd_pcm_uframes_t period = (int)rate; + snd_pcm_hw_params_set_period_size_near(handle, params, &period, &dir); + + sample_size = rate; + + if (snd_pcm_hw_params(handle, params) < 0) { + sample_size = 0; + snd_pcm_close(handle); + handle = NULL; + } + } +# endif // HAVE_ALSA_ASOUNDLIB_H +#endif // __APPLE__ + + if (sample_size) { + // Make an explosion sound by passing white noise through a low pass + // filter with a decreasing frequency... + sample_data = new short[2 * sample_size]; + + short *sample_ptr = sample_data; + int max_sample = 2 * sample_size - 2; + + *sample_ptr++ = 0; + *sample_ptr++ = 0; + + for (int j = max_sample; j > 0; j --, sample_ptr ++) { + float freq = (float)j / (float)max_sample; + float volume = 32767.0 * (0.5 * sqrt(freq) + 0.5); + float sample = 0.0001 * ((rand() % 20001) - 10000); + + *sample_ptr = (int)(volume * freq * sample + + (1.0 - freq) * sample_ptr[-2]); + } + } +} + + +// Cleanup the BlockSound class +BlockSound::~BlockSound() { +#ifdef __APPLE__ + if (sample_size) { + AudioDeviceStop(device, audio_cb); + AudioDeviceRemoveIOProc(device, audio_cb); + } + +#elif defined(WIN32) + if (sample_size) { + waveOutClose(device); + + GlobalUnlock(header_handle); + GlobalFree(header_handle); + + GlobalUnlock(data_handle); + GlobalFree(data_handle); + } + +#else +# ifdef HAVE_ALSA_ASOUNDLIB_H + if (handle) { + snd_pcm_drain(handle); + snd_pcm_close(handle); + } +# endif // HAVE_ALSA_ASOUNDLIB_H +#endif // __APPLE__ + + if (sample_size) { + delete[] sample_data; + } +} + + +#ifdef __APPLE__ +// Callback function for writing audio data... +OSStatus +BlockSound::audio_cb(AudioDeviceID device, + const AudioTimeStamp *current_time, + const AudioBufferList *data_in, + const AudioTimeStamp *time_in, + AudioBufferList *data_out, + const AudioTimeStamp *time_out, + void *client_data) { + BlockSound *ss = (BlockSound *)client_data; + int count; + float *buffer; + + if (!ss->remaining) return noErr; + + for (count = data_out->mBuffers[0].mDataByteSize / sizeof(float), + buffer = (float*) data_out->mBuffers[0].mData; + ss->remaining > 0 && count > 0; + count --, ss->data ++, ss->remaining --) { + *buffer++ = *(ss->data) / 32767.0; + } + + while (count > 0) { + *buffer++ = 0.0; + count --; + } + + return noErr; +} +#endif // __APPLE__ + + +// Play a note for the given amount of time... +void +BlockSound::play_explosion(float duration) { + Fl::check(); + + if (duration <= 0.0) + return; + +#if defined(__APPLE__) || defined(WIN32) || defined(HAVE_ALSA_ASOUNDLIB_H) + if (duration > 1.0) + duration = 1.0; + + int samples = (int)(duration * sample_size); + short *sample_ptr = sample_data + 2 * (sample_size - samples); +#endif // __APPLE__ || WIN32 || HAVE_ALSA_ASOUNDLIB_H + +#ifdef __APPLE__ + // Point to the next note... + data = sample_ptr; + remaining = samples * 2; + +#elif defined(WIN32) + if (sample_size) { + memcpy(data_ptr, sample_ptr, samples * 4); + + header_ptr->dwBufferLength = samples * 4; + waveOutPrepareHeader(device, header_ptr, sizeof(WAVEHDR)); + + waveOutWrite(device, header_ptr, sizeof(WAVEHDR)); + } else Beep(440, (int)(1000.0 * duration)); + +#elif defined(HAVE_ALSA_ASOUNDLIB_H) + if (handle) { + // Use ALSA to play the sound... + if (snd_pcm_writei(handle, sample_ptr, samples) < 0) { + snd_pcm_prepare(handle); + snd_pcm_writei(handle, sample_ptr, samples); + } + return; + } +#endif // __APPLE__ +} + + +class BlockWindow : public Fl_Double_Window +{ + public: + + struct Block + { + int color; + bool bomb; + int y; + }; + + struct Column + { + int num_blocks; + Block blocks[BLOCK_ROWS]; + int x; + }; + + private: + + Fl_Button *help_button_, + *play_button_; + + int num_columns_; + Column columns_[BLOCK_COLS]; + int count_; + bool help_; + int high_score_; + float interval_; + int level_; + int num_colors_; + int opened_columns_; + bool paused_; + static Fl_Preferences prefs_; + int score_; + BlockSound *sound_; + char title_[255]; + int title_y_; + + void _BlockWindow(); + int bomb(int color); + int click(int col, int row); + static void help_cb(Fl_Widget *wi, BlockWindow *bw); + void init(); + static void play_cb(Fl_Widget *wi, BlockWindow *bw); + static void timeout_cb(BlockWindow *bw); + + public: + + BlockWindow(int X, int Y, int W, int H, const char *L = 0); + BlockWindow(int W, int H, const char *L = 0); + ~BlockWindow(); + + void draw(); + int handle(int event); + void new_game(); + int score() { return (score_); } + void up_level(); +}; + + +Fl_Preferences BlockWindow::prefs_(Fl_Preferences::USER, "fltk.org", "blocks"); + + +int +main(int argc, char *argv[]) { + Fl::scheme("plastic"); + Fl::visible_focus(0); + + BlockWindow *bw = new BlockWindow(BLOCK_COLS * BLOCK_SIZE, + BLOCK_ROWS * BLOCK_SIZE + 20, + "Block Attack!"); + + bw->show(argc, argv); + + return (Fl::run()); +} + + +// Create a block window at the specified position +BlockWindow::BlockWindow(int X, int Y, int W, int H, const char *L) + : Fl_Double_Window(X, Y, W, H, L) { + _BlockWindow(); +} + + +// Create a block window +BlockWindow::BlockWindow(int W, int H, const char *L) + : Fl_Double_Window(W, H, L) { + _BlockWindow(); +} + + +// Delete a block window +BlockWindow::~BlockWindow() { + Fl::remove_timeout((Fl_Timeout_Handler)timeout_cb, (void *)this); +} + + +// Initialize a block window... +void +BlockWindow::_BlockWindow() { + init(); + + help_button_ = new Fl_Button(0, 0, 20, 20, "?"); + help_button_->callback((Fl_Callback *)help_cb, this); + help_button_->shortcut('?'); + + play_button_ = new Fl_Button(80, (h() - 80) / 2, 80, 80, "@>"); + play_button_->callback((Fl_Callback *)play_cb, this); + play_button_->labelsize(44); + play_button_->shortcut(' '); + + sound_ = new BlockSound(); + + prefs_.get("high_score", high_score_, 0); + + Fl::add_timeout(0.1, (Fl_Timeout_Handler)timeout_cb, (void *)this); +} + + +// Bomb all blocks of a given color and return the number of affected blocks +int +BlockWindow::bomb(int color) { + int j, k; + int count; + Block *b; + Column *c; + + + if (color >= BLOCK_BLAST) return (0); + + for (j = num_columns_, c = columns_, count = 1; j > 0; j --, c ++) + for (k = c->num_blocks, b = c->blocks; k > 0; k --, b ++) + if (b->color == color) { + b->color = -color; + count ++; + } + + return (count); +} + + +// Tag all blocks connected to the clicked block and return the number +// of affected blocks +int +BlockWindow::click(int col, int row) { + Block *b; + Column *c; + int count, color; + + + c = columns_ + col; + b = c->blocks + row; + color = b->color; + + if (color < 0 || color >= BLOCK_BLAST) return (0); + + // Find the bottom block... + while (row > 0 && b[-1].color == color) { + row --; + b --; + } + + count = 0; + + while (row < c->num_blocks && b->color == color) { + b->color = -color; + + if (col > 0 && row < c[-1].num_blocks && + c[-1].blocks[row].color == color) { + count += click(col - 1, row); + } + + if (col < (num_columns_ - 1) && row < c[1].num_blocks && + c[1].blocks[row].color == color) { + count += click(col + 1, row); + } + + count ++; + row ++; + b ++; + } + + return (count); +} + + +// Draw the block window... +void +BlockWindow::draw() { + int j, k, xx, yy; + Block *b; + Column *c; + + + // Draw the blocks... + fl_color(FL_BLACK); + fl_rectf(0, 0, w(), h()); + + // Draw the blocks... + for (j = num_columns_, c = columns_; j > 0; j --, c ++) + for (k = c->num_blocks, b = c->blocks; k > 0; k --, b ++) { + xx = w() - c->x; + yy = h() - BLOCK_SIZE - b->y; + + if (b->color >= BLOCK_BLAST) { + b->color ++; + blast_pixmap.draw(xx, yy); + } else if (b->color < 0) { + if (b->bomb) bomb_pixmaps[-b->color - 1]->draw(xx, yy); + else normal_pixmaps[-b->color - 1]->draw(xx, yy); + } else { + if (b->bomb) bomb_pixmaps[b->color - 1]->draw(xx, yy); + else normal_pixmaps[b->color - 1]->draw(xx, yy); + } + } + + if (interval_ < 0.0 || paused_) { + fl_color(FL_BLACK); + screen_tile.draw(0, 0, w(), h(), 0, 0); + } + + // Redraw the widgets... + play_button_->redraw(); + help_button_->redraw(); + draw_children(); + + // Draw any paused/game over/new game message... + if ((paused_ || interval_ < 0.0) && play_button_->w() == 80) { + const char *s; + + if (help_) { + s = "Click on adjacent blocks of the same color. Clear all blocks " + "before they reach the left side."; + + fl_font(FL_HELVETICA_BOLD, 24); + fl_color(FL_BLACK); + fl_draw(s, 171, 3, w() - 250, h() - 6, + (Fl_Align)(FL_ALIGN_WRAP | FL_ALIGN_LEFT)); + + fl_color(FL_YELLOW); + fl_draw(s, 168, 0, w() - 250, h(), + (Fl_Align)(FL_ALIGN_WRAP | FL_ALIGN_LEFT)); + } else { + if (interval_ < 0.0) { +#ifdef DEBUG + // Show sample waveform... + short *sample_ptr; + + for (i = 0; i < 2; i ++) + { + fl_color(FL_RED + i); + fl_begin_line(); + for (j = 0, sample_ptr = sound_->sample_data + i; + j < sound_->sample_size; + j ++, sample_ptr += 2) + fl_vertex(j * w() / sound_->sample_size, + *sample_ptr * h() / 4 / 65534 + h() / 2); + fl_end_line(); + } +#endif // DEBUG + + if (num_columns_ && (time(NULL) & 7) < 4) s = "Game Over"; + else s = "Block Attack!\nby Michael R Sweet"; + } else s = "Paused"; + + fl_font(FL_HELVETICA_BOLD, 32); + fl_color(FL_BLACK); + fl_draw(s, 6, 6, w() - 6, h() - 6, FL_ALIGN_CENTER); + + fl_color(FL_YELLOW); + fl_draw(s, 0, 0, w(), h(), FL_ALIGN_CENTER); + } + } + + // Draw the scores and level... + char s[255]; + + sprintf(s, " Score: %d", score_); + fl_color(FL_WHITE); + fl_font(FL_HELVETICA, 14); + fl_draw(s, 40, 0, w() - 40, 20, FL_ALIGN_LEFT); + + sprintf(s, "High Score: %d ", high_score_); + fl_draw(s, 0, 0, w(), 20, FL_ALIGN_RIGHT); + + if (level_ > 1 || title_y_ <= 0) + { + sprintf(s, "Level: %d ", level_); + fl_draw(s, 0, 0, w(), 20, FL_ALIGN_CENTER); + } + + if (title_y_ > 0 && interval_ > 0.0) + { + int sz = 14 + title_y_ * 86 / h(); + + fl_font(FL_HELVETICA_BOLD, sz); + fl_color(FL_YELLOW); + fl_draw(title_, 0, title_y_, w(), sz, FL_ALIGN_CENTER); + } +} + + +// Handle mouse clicks, etc. +int +BlockWindow::handle(int event) { + int j, k, mx, my, count; + Block *b; + Column *c; + + + if (Fl_Double_Window::handle(event)) return (1); + else if (interval_ < 0.0 || paused_) return (0); + + switch (event) { + case FL_KEYBOARD: + if (Fl::event_text()) { + if (strcmp(Fl::event_text(), "+") == 0) + up_level(); + } + break; + case FL_PUSH : + mx = w() - Fl::event_x() + BLOCK_SIZE; + my = h() - Fl::event_y(); + count = 0; + b = 0; + + for (j = 0, c = columns_; !count && j < num_columns_; j ++, c ++) + for (k = 0, b = c->blocks; !count && k < c->num_blocks; k ++, b ++) + if (mx >= c->x && mx < (c->x + BLOCK_SIZE) && + my >= b->y && my < (b->y + BLOCK_SIZE)) { + if (b->bomb) count = bomb(b->color); + else count = click(j, k); + + break; + } + + if (count < 2) { + for (j = 0, c = columns_; j < num_columns_; j ++, c ++) + for (k = 0, b = c->blocks; k < c->num_blocks; k ++, b ++) + if (b->color < 0) b->color = -b->color; + } else { + count --; + + if (b->bomb) { + sound_->play_explosion(0.19 + 0.005 * count); + + interval_ *= 0.995; + score_ += count; + } else { + sound_->play_explosion(0.09 + 0.005 * count); + + interval_ *= 0.999; + score_ += count * count; + } + + if (score_ > high_score_) { + high_score_ = score_; + prefs_.set("high_score", high_score_); + } + + for (j = 0, c = columns_; j < num_columns_; j ++, c ++) + for (k = 0, b = c->blocks; k < c->num_blocks; k ++, b ++) + if (b->color < 0) b->color = BLOCK_BLAST; + } + return (1); + } + + return (0); +} + + +// Toggle the on-line help... +void +BlockWindow::help_cb(Fl_Widget *, BlockWindow *bw) { + bw->paused_ = bw->help_ = !bw->help_; + bw->play_button_->label("@>"); + bw->redraw(); +} + + +// Initialize the block window... +void +BlockWindow::init() { + count_ = 0; + help_ = false; + interval_ = -1.0; + level_ = 1; + num_colors_ = 3; + num_columns_ = 0; + paused_ = false; + score_ = 0; + title_[0] = '\0'; + title_y_ = 0; +} + + +// Start a new game... +void +BlockWindow::new_game() { + // Seed the random number generator... + srand(time(NULL)); + + init(); + + interval_ = 0.1; + opened_columns_ = 0; + + strcpy(title_, "Level: 1"); + title_y_ = h(); + + redraw(); +} + + +// Play/pause... +void +BlockWindow::play_cb(Fl_Widget *wi, BlockWindow *bw) { + if (bw->interval_ < 0) bw->new_game(); + else bw->paused_ = !bw->paused_; + + if (bw->paused_) wi->label("@>"); + else { + wi->label("@-2||"); + bw->help_ = false; + } +} + +void BlockWindow::up_level() { + interval_ *= 0.95; + opened_columns_ = 0; + if (num_colors_ < 7) num_colors_ ++; + level_ ++; + sprintf(title_, "Level: %d", level_); + title_y_ = h(); + Fl::repeat_timeout(interval_, (Fl_Timeout_Handler)timeout_cb, (void *)this); +} + +// Animate the game... +void +BlockWindow::timeout_cb(BlockWindow *bw) { + int i, j; + Block *b; + Column *c; + int lastx, lasty; + + +#ifdef DEBUG + struct timeval curtime; + static struct timeval lasttime; + + + gettimeofday(&curtime, NULL); + printf("%.3f (%+f - %f)\n", + curtime.tv_sec + 0.000001 * curtime.tv_usec, + curtime.tv_sec - lasttime.tv_sec + + 0.000001 * (curtime.tv_usec - lasttime.tv_usec), bw->interval_); + lasttime = curtime; +#endif // DEBUG + + // Update blocks that have been destroyed... + for (i = 0, c = bw->columns_; i < bw->num_columns_; i ++, c ++) + for (j = 0, b = c->blocks; j < c->num_blocks; j ++, b ++) + if (b->color > (BLOCK_BLAST + 1)) { + bw->redraw(); + + c->num_blocks --; + + if (j < c->num_blocks) { + memmove(b, b + 1, (c->num_blocks - j) * sizeof(Block)); + } + + j --; + b --; + + if (!c->num_blocks) { + bw->num_columns_ --; + + if (i < bw->num_columns_) { + memmove(c, c + 1, (bw->num_columns_ - i) * sizeof(Column)); + } + + i --; + c --; + j = c->num_blocks; + } + } + + // Let the rest of the blocks fall and/or move... + for (i = bw->num_columns_, c = bw->columns_, lastx = c->x; + i > 0; + i --, c ++) { + if (c->x > lastx) { + c->x -= 8; + bw->redraw(); + } + + lastx = c->x + BLOCK_SIZE; + + if (!bw->paused_ && bw->interval_ > 0.0) { + bw->redraw(); + c->x ++; + } + + for (j = c->num_blocks, b = c->blocks, lasty = 0; j > 0; j --, b ++) { + if (b->y > lasty) { + bw->redraw(); + b->y -= 8; + } + + lasty = b->y + BLOCK_SIZE; + } + } + + // Slide the title text as needed... + if (bw->title_y_ > 0) { + bw->redraw(); + bw->title_y_ -= 5; + } + + // Play the game... + if (!bw->paused_ && bw->interval_ > 0.0) { + bw->count_ --; + + if (bw->count_ <= 0) { + bw->redraw(); + bw->count_ = BLOCK_SIZE; + + if (bw->num_columns_ == BLOCK_COLS) { + bw->interval_ = -1.0; + bw->sound_->play_explosion(0.8); + bw->play_button_->label("@>"); + } else { + bw->opened_columns_ ++; + + if (bw->opened_columns_ > (2 * BLOCK_COLS)) { + bw->up_level(); + } + + c = bw->columns_; + + if (bw->num_columns_) { + memmove(c + 1, c, bw->num_columns_ * sizeof(Column)); + } + + bw->num_columns_ ++; + c->x = 0; + c->num_blocks = BLOCK_ROWS; + + for (j = 0, b = c->blocks; j < BLOCK_ROWS; j ++, b ++) { + b->bomb = bw->num_colors_ > 3 && (rand() & 127) < bw->num_colors_; + b->color = 1 + (rand() % bw->num_colors_); + b->y = j * (BLOCK_SIZE + 8) + 24; + } + } + } + } + else + { + bw->count_ --; + + if (bw->count_ <= 0) { + bw->count_ = 40; + bw->redraw(); + } + } + + // Update the play/pause button as needed... + if ((bw->paused_ || bw->interval_< 0.0) && + bw->play_button_->w() < 80) { + int s = bw->play_button_->w() + 10; + + bw->play_button_->resize(s, (s - 20) * (bw->h() - s) / 120, s, s); + bw->play_button_->labelsize(s / 2 + 4); + bw->redraw(); + } else if ((!bw->paused_ && bw->interval_ > 0.0) && + bw->play_button_->w() > 20) { + int s = bw->play_button_->w() - 5; + + bw->play_button_->resize(s, (s - 20) * (bw->h() - s) / 120, s, s); + bw->play_button_->labelsize(s / 2 + 4); + bw->redraw(); + } + + if (bw->interval_ > 0.0) { + Fl::repeat_timeout(bw->interval_, (Fl_Timeout_Handler)timeout_cb, + (void *)bw); + } else { + Fl::repeat_timeout(0.1, (Fl_Timeout_Handler)timeout_cb, + (void *)bw); + } +} + + +// +// End of "$Id: blocks.cxx 5976 2007-11-19 14:14:13Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/test/boxtype.cxx b/third_party/windows/fltk-1.1.10/test/boxtype.cxx new file mode 100644 index 0000000..bfc3b98 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/boxtype.cxx @@ -0,0 +1,128 @@ +// +// "$Id: boxtype.cxx 5671 2007-02-08 07:58:47Z matt $" +// +// Boxtype test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +int N = 0; +#define W 200 +#define H 50 +#define ROWS 14 + +Fl_Window *window; + +void bt(const char *name, Fl_Boxtype type, int square=0) { + int x = N%4; + int y = N/4; + N++; + x = x*W+10; + y = y*H+10; + Fl_Box *b = new Fl_Box(type,x,y,square ? H-20 : W-20,H-20,name); + b->labelsize(11); + if (square) b->align(FL_ALIGN_RIGHT); +} + +int main(int argc, char ** argv) { + window = new Fl_Double_Window(4*W,ROWS*H); + window->box(FL_FLAT_BOX); +#if 0 // this code uses the command line arguments to set arbitrary color schemes + Fl::args(argc, argv); + Fl::get_system_colors(); +#elif 0 // this code uses a single color to define a scheme + Fl::args(argc, argv); + Fl::get_system_colors(); + Fl::background(113,113,198); +#else // this code uses the nice bright blue background to show box vs. frame types + Fl::args(argc, argv); + Fl::get_system_colors(); + window->color(12);// light blue +#endif + bt("FL_NO_BOX",FL_NO_BOX); + bt("FL_FLAT_BOX",FL_FLAT_BOX); + N += 2; // go to start of next row to line up boxes & frames + bt("FL_UP_BOX",FL_UP_BOX); + bt("FL_DOWN_BOX",FL_DOWN_BOX); + bt("FL_UP_FRAME",FL_UP_FRAME); + bt("FL_DOWN_FRAME",FL_DOWN_FRAME); + bt("FL_THIN_UP_BOX",FL_THIN_UP_BOX); + bt("FL_THIN_DOWN_BOX",FL_THIN_DOWN_BOX); + bt("FL_THIN_UP_FRAME",FL_THIN_UP_FRAME); + bt("FL_THIN_DOWN_FRAME",FL_THIN_DOWN_FRAME); + bt("FL_ENGRAVED_BOX",FL_ENGRAVED_BOX); + bt("FL_EMBOSSED_BOX",FL_EMBOSSED_BOX); + bt("FL_ENGRAVED_FRAME",FL_ENGRAVED_FRAME); + bt("FL_EMBOSSED_FRAME",FL_EMBOSSED_FRAME); + bt("FL_BORDER_BOX",FL_BORDER_BOX); + bt("FL_SHADOW_BOX",FL_SHADOW_BOX); + bt("FL_BORDER_FRAME",FL_BORDER_FRAME); + bt("FL_SHADOW_FRAME",FL_SHADOW_FRAME); + bt("FL_ROUNDED_BOX",FL_ROUNDED_BOX); + bt("FL_RSHADOW_BOX",FL_RSHADOW_BOX); + bt("FL_ROUNDED_FRAME",FL_ROUNDED_FRAME); + bt("FL_RFLAT_BOX",FL_RFLAT_BOX); + bt("FL_OVAL_BOX",FL_OVAL_BOX); + bt("FL_OSHADOW_BOX",FL_OSHADOW_BOX); + bt("FL_OVAL_FRAME",FL_OVAL_FRAME); + bt("FL_OFLAT_BOX",FL_OFLAT_BOX); + bt("FL_ROUND_UP_BOX",FL_ROUND_UP_BOX); + bt("FL_ROUND_DOWN_BOX",FL_ROUND_DOWN_BOX); + bt("FL_DIAMOND_UP_BOX",FL_DIAMOND_UP_BOX); + bt("FL_DIAMOND_DOWN_BOX",FL_DIAMOND_DOWN_BOX); + + bt("FL_PLASTIC_UP_BOX",FL_PLASTIC_UP_BOX); + bt("FL_PLASTIC_DOWN_BOX",FL_PLASTIC_DOWN_BOX); + bt("FL_PLASTIC_UP_FRAME",FL_PLASTIC_UP_FRAME); + bt("FL_PLASTIC_DOWN_FRAME",FL_PLASTIC_DOWN_FRAME); + bt("FL_PLASTIC_THIN_UP_BOX",FL_PLASTIC_THIN_UP_BOX); + bt("FL_PLASTIC_THIN_DOWN_BOX",FL_PLASTIC_THIN_DOWN_BOX); + N += 2; + bt("FL_PLASTIC_ROUND_UP_BOX",FL_PLASTIC_ROUND_UP_BOX); + bt("FL_PLASTIC_ROUND_DOWN_BOX",FL_PLASTIC_ROUND_DOWN_BOX); + N += 2; + + bt("FL_GTK_UP_BOX",FL_GTK_UP_BOX); + bt("FL_GTK_DOWN_BOX",FL_GTK_DOWN_BOX); + bt("FL_GTK_UP_FRAME",FL_GTK_UP_FRAME); + bt("FL_GTK_DOWN_FRAME",FL_GTK_DOWN_FRAME); + bt("FL_GTK_THIN_UP_BOX",FL_GTK_THIN_UP_BOX); + bt("FL_GTK_THIN_DOWN_BOX",FL_GTK_THIN_DOWN_BOX); + bt("FL_GTK_THIN_UP_FRAME",FL_GTK_THIN_UP_FRAME); + bt("FL_GTK_THIN_DOWN_FRAME",FL_GTK_THIN_DOWN_FRAME); + bt("FL_GTK_ROUND_UP_BOX",FL_GTK_ROUND_UP_BOX); + bt("FL_GTK_ROUND_DOWN_BOX",FL_GTK_ROUND_DOWN_BOX); + window->resizable(window); + window->end(); + window->show(); + return Fl::run(); +} + +// +// End of "$Id: boxtype.cxx 5671 2007-02-08 07:58:47Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/test/browser.cxx b/third_party/windows/fltk-1.1.10/test/browser.cxx new file mode 100644 index 0000000..15cb007 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/browser.cxx @@ -0,0 +1,182 @@ +// +// "$Id: browser.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// Browser test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +/* +This is a test of how the browser draws lines. +This is a second line. +This is a third. + +That was a blank line above this. + +@r@_Right justify +@c@_Center justify +@_Left justify + +@bBold text +@iItalic text +@b@iBold Italic +@fFixed width +@f@bBold Fixed +@f@iItalic Fixed +@f@i@bBold Italic Fixed +@lLarge +@l@bLarge bold +@sSmall +@s@bSmall bold +@s@iSmall italic +@s@i@bSmall italic bold +@uunderscore +@C1RED +@C2Green +@C4Blue + + You should try different browser types: + Fl_Browser + Fl_Select_Browser + Fl_Hold_Browser + Fl_Multi_Browser +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Fl_Select_Browser *browser; +Fl_Button *top, + *bottom, + *middle, + *visible, + *swap; +Fl_Int_Input *field; + +void b_cb(Fl_Widget* o, void*) { + printf("callback, selection = %d, event_clicks = %d\n", + ((Fl_Browser*)o)->value(), Fl::event_clicks()); +} + +void show_cb(Fl_Widget *o, void *) { + int line = atoi(field->value()); + + if (!line) { + fl_alert("Please enter a number in the text field\n" + "before clicking on the buttons."); + return; + } + + if (o == top) + browser->topline(line); + else if (o == bottom) + browser->bottomline(line); + else if (o == middle) + browser->middleline(line); + else + browser->make_visible(line); +} + +void swap_cb(Fl_Widget *, void *) { + int a = -1, b = -1; + for ( int t=0; tsize(); t++ ) { // find two selected items + if ( browser->selected(t) ) { + if ( a < 0 ) + { a = t; } + else + { b = t; break; } + } + } + browser->swap(a, b); // swap them +} + +int main(int argc, char **argv) { + int i; + if (!Fl::args(argc,argv,i)) Fl::fatal(Fl::help); + const char* fname = (i < argc) ? argv[i] : "browser.cxx"; + Fl_Window window(400,400,fname); + browser = new Fl_Select_Browser(0,0,400,350,0); + browser->type(FL_MULTI_BROWSER); + //browser->type(FL_HOLD_BROWSER); + //browser->color(42); + browser->callback(b_cb); + // browser->scrollbar_right(); + //browser->has_scrollbar(Fl_Browser::BOTH_ALWAYS); + if (!browser->load(fname)) { +#ifdef _MSC_VER + // if 'browser' was started from the VisualC environment in Win32, + // the current directory is set to the environment itself, + // so we need to correct the browser file path + int done = 1; + if ( i == argc ) + { + fname = "../test/browser.cxx"; + done = browser->load(fname); + } + if ( !done ) + { + printf("Can't load %s, %s\n", fname, strerror(errno)); + exit(1); + } +#else + printf("Can't load %s, %s\n", fname, strerror(errno)); + exit(1); +#endif + } + browser->position(0); + + field = new Fl_Int_Input(50, 350, 350, 25, "Line #:"); + field->callback(show_cb); + + top = new Fl_Button(0, 375, 80, 25, "Top"); + top->callback(show_cb); + + bottom = new Fl_Button(80, 375, 80, 25, "Bottom"); + bottom->callback(show_cb); + + middle = new Fl_Button(160, 375, 80, 25, "Middle"); + middle->callback(show_cb); + + visible = new Fl_Button(240, 375, 80, 25, "Make Vis."); + visible->callback(show_cb); + + swap = new Fl_Button(320, 375, 80, 25, "Swap"); + swap->callback(swap_cb); + swap->tooltip("Swaps two selected lines\n(Use CTRL-click to select two lines)"); + + window.resizable(browser); + window.show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: browser.cxx 5845 2007-05-20 00:01:06Z mike $". +// + diff --git a/third_party/windows/fltk-1.1.10/test/button.cxx b/third_party/windows/fltk-1.1.10/test/button.cxx new file mode 100644 index 0000000..54a458f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/button.cxx @@ -0,0 +1,68 @@ +// +// "$Id: button.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Button/callback test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +void beepcb(Fl_Widget *, void *) { + printf("\007"); fflush(stdout); +} + +void exitcb(Fl_Widget *, void *) { + exit(0); +} + +#if 0 +// test Fl::add_fd()... +void stdin_cb(int, void*) { + char buf[1000]; + gets(buf); + printf("stdin callback\n"); +} +#endif + +int main(int argc, char ** argv) { + Fl_Window *window = new Fl_Window(320,65); + Fl_Button *b1 = new Fl_Button(20, 20, 80, 25, "&Beep"); + b1->callback(beepcb,0); + /*Fl_Button *b2 =*/ new Fl_Button(120,20, 80, 25, "&no op"); + Fl_Button *b3 = new Fl_Button(220,20, 80, 25, "E&xit"); + b3->callback(exitcb,0); + window->end(); + window->show(argc,argv); +#if 0 + Fl::add_fd(0, stdin_cb); +#endif + return Fl::run(); +} + +// +// End of "$Id: button.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/buttons.cxx b/third_party/windows/fltk-1.1.10/test/buttons.cxx new file mode 100644 index 0000000..6fe57d2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/buttons.cxx @@ -0,0 +1,55 @@ +// +// "$Id: buttons.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Another button test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char ** argv) { + Fl_Window *window = new Fl_Window(320,130); + (new Fl_Button(10, 10, 130, 30, "Fl_Button"))->tooltip("This is a Tooltip."); + new Fl_Return_Button(150, 10, 160, 30, "Fl_Return_Button"); + new Fl_Repeat_Button(10,50,130,30,"Fl_Repeat_Button"); + new Fl_Light_Button(10,90,130,30,"Fl_Light_Button"); + new Fl_Round_Button(150,50,160,30,"Fl_Round_Button"); + new Fl_Check_Button(150,90,160,30,"Fl_Check_Button"); + window->end(); + window->show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: buttons.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/checkers.app/Contents/Info.plist b/third_party/windows/fltk-1.1.10/test/checkers.app/Contents/Info.plist new file mode 100644 index 0000000..3d3d6da --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/checkers.app/Contents/Info.plist @@ -0,0 +1,44 @@ + + + + CFBundleInfoDictionaryVersion + 6.0 + + CFBundleExecutable + checkers + + CFBundleIdentifier + org.fltk.checkers + + CFBundleVersion + 1.0 + + CFBundleDevelopmentRegion + English + + NSHumanReadableCopyright + Copyright 1997-2006 by Bill Spitzak and others + + CFAppleHelpAnchor + help + + CFBundleName + checkers + + CFBundlePackageType + APPL + + CFBundleSignature + FLSU + + CFBundleIconFile + checkers.icns + + CFBundleShortVersionString + 1.0 + + CFBundleGetInfoString + 1.0, Copyright 1997-2006 by Bill Spitzak and others + + + diff --git a/third_party/windows/fltk-1.1.10/test/checkers.app/Contents/PkgInfo b/third_party/windows/fltk-1.1.10/test/checkers.app/Contents/PkgInfo new file mode 100644 index 0000000..ffeeb7d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/checkers.app/Contents/PkgInfo @@ -0,0 +1 @@ +FLSUFlsu diff --git a/third_party/windows/fltk-1.1.10/test/checkers.app/Contents/Resources/checkers.icns b/third_party/windows/fltk-1.1.10/test/checkers.app/Contents/Resources/checkers.icns new file mode 100644 index 0000000..7e561e3 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/test/checkers.app/Contents/Resources/checkers.icns differ diff --git a/third_party/windows/fltk-1.1.10/test/checkers.cxx b/third_party/windows/fltk-1.1.10/test/checkers.cxx new file mode 100644 index 0000000..7b0ad86 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/checkers.cxx @@ -0,0 +1,1361 @@ +// +// "$Id: checkers.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Checkers game for the Fast Light Tool Kit (FLTK). +// +// Hours of fun: the FLTK checkers game! +// Based on a very old algorithm, but it still works! +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +const char* copyright = +"Checkers game\n" +"Copyright (C) 1997 Bill Spitzak spitzak@d2.com\n" +"Original Pascal code:\n" +"Copyright 1978, Oregon Minicomputer Software, Inc.\n" +"2340 SW Canyon Road, Portland, Oregon 97201\n" +"Written by Steve Poulsen 18-Jan-79\n" +"\n" +"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 2 of the License, or " +"(at your option) any later version.\n" +"\n" +"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.\n" +"\n" +"You should have received a copy of the GNU Library General Public " +"License along with this library; if not, write to the Free Software " +"Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 " +"USA."; + +// Define FLTK to get the fltk interface +// Define VT100 to get the VT100 interface +// Define both to get a program that takes a -t switch + +#define FLTK +//#define VT100 + +#include +#include +#include +#include +#include + +//////////////////////////////////////////////////////////////// +// The algorithim: + +int maxevaluate=2500; // max number of moves to examine on a turn +int maxnodes = 2500; // maximum number of nodes in search tree +int maxply = 20; // maximum depth to look ahead +char forcejumps = 1; // is forced jumps rule in effect? + +// scoring parameters: (all divided by 5 from original code) +// some signs seem to be backwards, marked them with (-) in comment +const int spiece = 800; // value of a piece +const int sking = 1200; // value of a king +const int sadvan = 160; // value of mypieces/theirpieces-1 +// const int smobil = ? // moves *enemy* can make w/o being jumped +const int sallpin = 80; // mobil == 0 +const int sdeny = 10; // moves enemy can make that will be jumped +const int spin = 32; // enemy pieces that have no move except jumped +const int sthreat = -10; // enemy pieces we can jump if not moved (-) +const int sgrad = 1; // score of piece positions +const int sback = 10; // back row occupied so enemy can't make king +const int smoc2 = 200; // more mobility, more center +const int smoc3 = -8; // less mobility, less center +const int smoc4 = -80; // more mobility, less center +const int smode2 = -14; // less mobility, less denied +const int smode3 = -40; // more mobility, more denied (-) +const int sdemmo = -20; // more denied, more moves (-) +const int scent = 10; // pieces in center +const int skcent = 100; // kings in center + +const int depthpenalty=4; // guess +const int noise=2; // values less or eq to this apart are eq + +// const int sattackking = 4; // not used +// const int sattackpiece = 3; + +struct node { + node *father; + node *son; // best son + node *brother; // next brother + short int value; // value of this board position to player making move + unsigned char from,to; // the move to reach this board + long int jump; // bit map of locations jumped + unsigned char mobil; + unsigned char deny; + unsigned char pin; + unsigned char threat; + short int gradient; + unsigned who:1; // 0 = black's move, 1 = white's move + unsigned king:1; // 1 = move causes piece to be kinged + unsigned back:1; + unsigned moc2:1; + unsigned moc3:1; + unsigned moc4:1; + unsigned mode2:1; + unsigned mode3:1; + unsigned demmo:1; +}; + +int nodes; // count of nodes + +/* Board positions: Border positions: + + WHITE 00 01 02 03 04 + 05 06 07 08 04 XX XX XX XX + 09 10 11 12 XX XX XX XX 13 + 14 15 16 17 13 XX XX XX XX + 18 19 20 21 XX XX XX XX 22 + 23 24 25 26 22 XX XX XX XX + 27 28 29 30 XX XX XX XX 31 + 32 33 34 36 31 XX XX XX XX + 36 37 38 39 XX XX XX XX 40 + BLACK 40 41 42 43 44 + +*/ + +typedef char piece; + +// Piece values so that BLACK and WHITE are bit flags: +#define EMPTY 0 +#define BLACK 1 +#define WHITE 2 +#define KING 4 +#define BLACKKING 5 +#define WHITEKING 6 +#define BLUE 8 + +const piece flip[9] = { + EMPTY, WHITE, BLACK, 0, 0, WHITEKING, BLACKKING, 0, BLUE}; + +const int offset[9][4] = { // legal move directions + {0,0,0,0}, + {-5,-4,0,0}, + {4,5,0,0}, + {0,0,0,0}, + {0,0,0,0}, + {4,5,-4,-5}, + {4,5,-4,-5}, + {0,0,0,0}, + {0,0,0,0} +}; + +piece b[45]; // current board position being considered + +int evaluated; // number of moves evaluated this turn + +char centralsquares[45]; +char is_protected[45]; + +piece flipboard[45]; // swapped if enemy is black +piece *tb; // pointer to real or swapped board +#define FRIEND BLACK +#define FRIENDKING BLACKKING +#define ENEMY WHITE +#define ENEMYKING WHITEKING + +char check(int target,int direction) { + // see if enemy at target can be jumped from direction by our piece + int dst = target-direction; + if (tb[dst]) return(0); + int src = target+direction; + if (tb[src] == FRIENDKING); + else if (direction < 0 || tb[src] != FRIEND) return(0); + piece aa = tb[target]; piece bb = tb[src]; + tb[target] = EMPTY; tb[src] = EMPTY; + int safe = + (tb[src-4]&FRIEND && tb[src-8]&ENEMY + ||tb[src-5]&FRIEND && tb[src-10]&ENEMY + ||tb[dst-4]&ENEMY && !tb[dst+4] + ||tb[dst-5]&ENEMY && !tb[dst+5] + ||tb[src+4]&FRIEND && tb[src+8]==ENEMYKING + ||tb[src+5]&FRIEND && tb[src+10]==ENEMYKING + ||tb[dst+4]==ENEMYKING && !tb[dst-4] + ||tb[dst+5]==ENEMYKING && !tb[dst-5]); + tb[target] = aa; tb[src] = bb; + return(safe); +} + +int deniedmoves,undeniedmoves; +void analyzemove(int direction,int src) { + int target = src+direction; + if (!tb[target]) { + if (!tb[target+direction]) is_protected[target] = 1; + piece a = tb[src]; tb[src] = EMPTY; + if (check(target,4) || check(target,5) || + check(target,-4) || check(target,-5) || + (tb[src+4]&ENEMY && check(src+4,4)) || + (tb[src+5]&ENEMY && check(src+5,5)) || + (tb[src-4]&ENEMY && check(src-4,-4)) || + (tb[src-5]&ENEMY && check(src-5,-5))) + deniedmoves++; + else undeniedmoves++; + tb[src] = a; + } +} + +void evaluateboard(node *n,int print) { + + if (!n->who) tb = b; // move was black's + else { + for (int i=0; i<45; i++) flipboard[44-i] = flip[(int)b[i]]; + tb = flipboard; + } + + memset(is_protected,0,sizeof(is_protected)); + int friendpieces = 0; + int enemypieces = 0; + int friendkings = 0; + int enemykings = 0; + int friendkcent = 0; + int friendcent = 0; + int enemykcent = 0; + int enemycent = 0; + n->mobil = n->deny = n->pin = n->threat = 0; + + int i; + for (i=5; i<40; i++) switch(tb[i]) { + case ENEMYKING: + enemykings++; + enemykcent += centralsquares[i]; + deniedmoves = 0; + undeniedmoves = 0; + if (i>8) { + analyzemove(-4,i); + analyzemove(-5,i); + } + goto J1; + case ENEMY: + deniedmoves = 0; + undeniedmoves = 0; + J1: enemypieces++; + enemycent += centralsquares[i]; + if (i<36) { + analyzemove(4,i); + analyzemove(5,i); + } + if (deniedmoves && !undeniedmoves) n->pin++; + n->deny += deniedmoves; + n->mobil += undeniedmoves; + break; + case FRIENDKING: + friendkings++; + friendkcent += centralsquares[i]; + if (tb[i+4]&ENEMY && !tb[i+8] && !(tb[i+4]==ENEMYKING && !tb[i-4])) + n->threat++; + if (tb[i+5]&ENEMY && !tb[i+10] && !(tb[i+5]==ENEMYKING && !tb[i-5])) + n->threat++; + case FRIEND: + friendpieces++; + friendcent += centralsquares[i]; + if (tb[i-4]&ENEMY && !tb[i-8] && tb[i+4]) n->threat++; + if (tb[i-5]&ENEMY && !tb[i-10] && tb[i+5]) n->threat++; + break; + } + + int gradient[40]; + for (i=4; i<9; i++) gradient[i] = tb[i] ? 0 : 32; + int total = 0; + for (i=9; i<40; i++) { + int x = (gradient[i-4]+gradient[i-5])/2; + if (tb[i]==FRIEND) total += x; + gradient[i] = (tb[i]&FRIEND || !tb[i] && !is_protected[i]) ? x : 0; + } + n->gradient = total; + + n->back = tb[39]==FRIEND && tb[37]==FRIEND && !enemykings; + + node* f = n->father; + + n->moc2 = f->mobil>n->mobil && friendcent>enemycent; + n->moc3 = f->mobil<=n->mobil && friendcentmoc4 = f->mobil>n->mobil && friendcentmode2 = f->mobil<=n->mobil && n->denydeny; + n->mode3 = f->mobil>n->mobil && n->deny>f->deny; + n->demmo = n->deny>f->deny && f->deny+f->mobil>n->deny+n->mobil; + + total = + spiece * (friendpieces - enemypieces) + + (sking-spiece) * (friendkings - enemykings) + + // mobil? + sdeny * (n->deny - f->deny) + + spin * (n->pin - f->pin) + + sthreat * (n->threat - f->threat) + + sgrad * (n->gradient - f->gradient) + + sback * (n->back - f->back) + + smoc2 * (n->moc2 - f->moc2) + + smoc3 * (n->moc3 - f->moc3) + + smoc4 * (n->moc4 - f->moc4) + + smode2 * (n->mode2 - f->mode2) + + smode3 * (n->mode3 - f->mode3) + + sdemmo * (n->demmo - f->demmo) + + scent * (friendcent - enemycent) + + (skcent-scent) * (friendkcent - enemykcent); + if (!n->mobil) total += sallpin; + + if (!enemypieces) total = 30000; + else if (friendpieces > enemypieces) + total += (sadvan*friendpieces)/enemypieces-sadvan; + else total -= (sadvan*enemypieces)/friendpieces-sadvan; + + if (print) { + printf("\tParent\tNew\tScore\n"); + printf("pieces\t%d\t%d\t%d\n",enemypieces,friendpieces, + spiece*(friendpieces-enemypieces)); + printf("kings\t%d\t%d\t%d\n",enemykings,friendkings, + (sking-spiece)*(friendkings-enemykings)); + printf("mobil\t%d\t%d\n",f->mobil,n->mobil); + printf("deny\t%d\t%d\t%d\n",f->deny,n->deny,sdeny*(n->deny-f->deny)); + printf("pin\t%d\t%d\t%d\n",f->pin,n->pin,spin*(n->pin-f->pin)); + printf("threat\t%d\t%d\t%d\n",f->threat,n->threat,sthreat*(n->threat-f->threat)); + printf("grad\t%d\t%d\t%d\n",f->gradient,n->gradient,sgrad*(n->gradient-f->gradient)); + printf("back\t%d\t%d\t%d\n",f->back,n->back,sback*(n->back-f->back)); + printf("moc2\t%d\t%d\t%d\n",f->moc2,n->moc2,smoc2*(n->moc2-f->moc2)); + printf("moc3\t%d\t%d\t%d\n",f->moc3,n->moc3,smoc3*(n->moc3-f->moc3)); + printf("moc4\t%d\t%d\t%d\n",f->moc4,n->moc4,smoc4*(n->moc4-f->moc4)); + printf("mode2\t%d\t%d\t%d\n",f->mode2,n->mode2,smode2*(n->mode2-f->mode2)); + printf("mode3\t%d\t%d\t%d\n",f->mode3,n->mode3,smode3*(n->mode3-f->mode3)); + printf("demmo\t%d\t%d\t%d\n",f->demmo,n->demmo,sdemmo*(n->demmo-f->demmo)); + printf("cent\t%d\t%d\t%dn",enemycent,friendcent,scent*(friendcent-enemycent)); + printf("kcent\t%d\t%d\t%d\n",enemykcent,friendkcent,skcent*(friendkcent-enemykcent)); + printf("total:\t\t\t%d\n",total); + } + else { + n->value = total; + evaluated++; + } +} // end of evaluateboard + +// --------------------- Tree management ----------------- + +node *freelist; + +node *newnode(void) { + node *n; + if (freelist) { + n = freelist; + freelist = n->brother; + } + else n = (node *)malloc(sizeof(node)); + memset(n,0,sizeof(node)); + nodes++; + return(n); +} + +void extract(node *n) { + node* i = n->father; + if (i) { + node* j = i->son; + if (j==n) i->son = n->brother; + else while (j) { + i = j; j = j->brother; + if (j==n) {i->brother = n->brother; break;} + } + } + n->brother = 0; +} + +void killnode(node *x) { + if (!x) return; + node *y; + for (y = x; ; y = y->brother) { + nodes--; + killnode(y->son); y->son = 0; + if (!y->brother) break; + } + y->brother = freelist; + freelist = x; +} + +int seed; // current random number + +void insert(node *n) { + int val = n->value; + node **pp; + for (pp = &(n->father->son); *pp; pp = &((*pp)->brother)) { + int val1 = (*pp)->value; + if (abs(val-val1) <= noise) { + seed = (seed*13077+5051)%0100000; + if ((seed & 070) >= 060) break; + } + else if (val > val1) break; + } + n->brother = *pp; + *pp = n; +} + +// -------------------------------------------------------------- + +void movepiece(node* f, int i, node* jnode) { + static char jumphappened; + + for (int k=0; k<4; k++) { + int direction = offset[(int)b[i]][k]; + if (!direction) break; + int j = i+direction; + if (b[j] == EMPTY) { + if (!jnode && (!forcejumps || !f->son || !f->son->jump)) { + node* n = newnode(); + n->father = f; + n->who = !f->who; + n->from = i; + n->to = j; + piece oldpiece = b[i]; b[i] = EMPTY; + if (!(oldpiece&KING) && n->who ? (j>=36) : (j<=8)) { + n->king = 1; + b[j] = oldpiece|KING; + } + else b[j] = oldpiece; + evaluateboard(n,0); + insert(n); + b[i] = oldpiece; b[j] = EMPTY; + } + } else if (((b[j]^b[i])&(WHITE|BLACK))==(WHITE|BLACK) && !b[j+direction]) { + if (forcejumps && f->son && !f->son->jump) { + killnode(f->son); + f->son = 0; + } + int jumploc = j; + j += direction; + node* n = newnode(); + n->father = f; + n->who = !f->who; + n->from = i; + n->to = j; + n->jump = (1<<(jumploc-10)); + piece oldpiece = b[i]; b[i] = EMPTY; + if (!(oldpiece&KING) && n->who ? (j>=36) : (j<=8)) { + n->king = 1; + b[j] = oldpiece|KING; + } + else b[j] = oldpiece; + if (jnode) { + n->from = jnode->from; + n->jump |= jnode->jump; + n->king |= jnode->king; + } + piece jumpedpiece = b[jumploc]; + b[jumploc] = EMPTY; + jumphappened = 0; + movepiece(f,j,n); + if (forcejumps && jumphappened) killnode(n); + else {evaluateboard(n,0); insert(n);} + b[i] = oldpiece; b[j] = EMPTY; + b[jumploc] = jumpedpiece; + jumphappened = 1; + } + } +} + +void expandnode(node *f) { + if (f->son || f->value > 28000) return; // already done + piece turn = f->who ? BLACK : WHITE; + for (int i=5; i<40; i++) if (b[i]&turn) movepiece(f,i,0); + if (f->son) { + f->value = -f->son->value; + if (f->brother) f->value -= depthpenalty; + } + else f->value = 30000; +} + +void makemove(node *n) { + b[n->to] = b[n->from]; + if (n->king) b[n->to] |= KING; + b[n->from] = EMPTY; + if (n->jump) for(int i=0; i<32; i++) { + if (n->jump & (1< maxnodes-(maxply*10) || evaluated > maxevaluate) return(0); + expandnode(f); + if (!f->son) return(1); + piece oldboard[45]; + memmove(oldboard,b,sizeof(b)); + node* n = f->son; + if (!n->jump && n->brother) {if (level<1) return(1); level--;} + int i; + node* sons[32]; for (i=0; (sons[i++] = n); n = n->brother); + int ret = 1; + for (i=0; ret && (n = sons[i++]);) { + makemove(n); + ret = fullexpand(n,level); + memmove(b,oldboard,sizeof(b)); + extract(n); + insert(n); + } + f->value = -f->son->value; + return(ret); +} + +int descend(node *f) { + static int depth; + if (didabort() || nodes > maxnodes || depth >= maxply) return(0); + if (f->son) { + node* n = f->son; + makemove(n); + depth++; + int ret = descend(n); + depth--; + extract(n); + insert(n); + f->value = -f->son->value; + return(ret); + } + else {expandnode(f); return(1);} +} + +char debug; + +node *calcmove(node *root) { // return best move after root + expandnode(root); + if (!root->son) return(0); // no move due to loss + if (debug) printf("calcmove() initial nodes = %d\n",nodes); + evaluated = 0; + if (root->son->brother) { + int x; + for (x = 1; abs(root->value)<28000 && fullexpand(root,x); x++); + piece saveboard[45]; memmove(saveboard,b,sizeof(b)); + while (abs(root->value)<28000) { + x = descend(root); + memmove(b,saveboard,sizeof(b)); + if (!x) break; + } + } + if (debug) printf(" evaluated %d, nodes = %d\n", evaluated, nodes); + return(root->son); +} + +// the actual game state ---------------- + +node *root,*undoroot; + +piece jumpboards[24][45]; // saved boards for undoing jumps +int nextjump; + +char user; // 0 = black, 1 = white +char playing; +char autoplay; + +void newgame(void) { + + int n; + for (n=0; n<5; n++) b[n] = BLUE; + for (n=5; n<18; n++) b[n] = WHITE; + for (n=18; n<27; n++) b[n] = EMPTY; + for (n=27; n<40; n++) b[n] = BLACK; + for (n=40; n<45; n++) b[n] = BLUE; + b[13] = b[22] = b[31] = BLUE; + + centralsquares[15] = centralsquares[16] = + centralsquares[19] = centralsquares[20] = + centralsquares[24] = centralsquares[25] = + centralsquares[28] = centralsquares[29] = 1; + + // set up initial search tree: + nextjump = 0; + killnode(undoroot); + undoroot = root = newnode(); + + // make it white's move, so first move is black: + root->who = 1; + user = 0; + playing = 1; +} + +void domove(node* move) { + if (move->jump) memmove(jumpboards[nextjump++],b,sizeof(b)); + makemove(move); + extract(move); + killnode(root->son); + root->son = move; + root = move; + if (debug) evaluateboard(move,1); +} + +node* undomove() { + node *n = root; + if (n == undoroot) return 0; // no more undo possible + if (n->jump) memmove(b,jumpboards[--nextjump],sizeof(b)); + else { + b[n->from] = b[n->to]; + if (n->king) b[n->from] &= (WHITE|BLACK); + b[n->to] = EMPTY; + } + root = n->father; + killnode(n); + root->son = 0; + root->value = 0; // prevent it from thinking game is over + playing = 1; + if (root == undoroot) user = 0; + return n; +} + +const char _usermoves[] = +"B1D1F1H1A2C2E2G2??B3D3F3H3A4C4E4G4??B5D5F5H5A6C6E6G6??B7D7F7H7A8C8E8G8??"; +#define usermoves(x,y) _usermoves[2*((x)-5)+(y)-1] + +void dumpnode(node *n, int help) { + int x = n->from; + int y = n->to; + if (help) printf("%c%c %c%c\t- ", + usermoves(x,1),usermoves(x,2), + usermoves(y,1),usermoves(y,2)); + printf("%s %ss from %c%c to %c%c", + n->who ? "White" : "Black", + n->jump ? "jump" : "move", + usermoves(x,1),usermoves(x,2), + usermoves(y,1),usermoves(y,2)); + if (n->jump) { + for (int i=0; i<32; i++) if (n->jump & (1<value); +} + +int abortflag; + +//////////////////////////////////////////////////////////////// +// VT100 Interface: +#ifdef VT100 + +void positioncursor(int i) { + printf("\033[%d;%dH", + usermoves(i,2)-'0'+1, + 2*(usermoves(i,1)-'A')+1); +} + +void outpiecename(piece n) { + printf(n&BLACK ? "\033[1;7m" : "\033[1m"); + putchar(" BW??BW??"[n]); + putchar(" BW??KK??"[n]); + printf("\033[0m"); +} + +void VT100board(void) { + printf("\033<\033[H\033[J\033[10r"); + int l = 0; + puts(" A B C D E F G H"); + for (int i=0; i<4; i++) { + int j = 9*i+5; + int k; + for (k=0; k<4; k++) { + printf("\033[7m \033[0m"); + outpiecename(b[j+k]); + } + l++; + printf("%d\n",l); + j += 4; + for (k=0; k<4; k++) { + outpiecename(b[j+k]); + printf("\033[7m \033[0m"); + } + l++; + printf("%d\n",l); + } +} + +void VT100move(node *n, int) { + if (!n) return; + printf("\0337"); + positioncursor(n->from); + outpiecename(b[n->from]); + positioncursor(n->to); + outpiecename(b[n->to]); + if (n->jump) for(int i=0; i<32; i++) { + if (n->jump & (1< + +static void sigint(...) { + abortflag = 1; + signal(SIGINT,sigint); +} + +void fixexit(int x) { + printf("\0337\033[r\0338"); + exit(x); +} + +// Returns a son, or 0 if no move specified, or root to cause "help" +node *getusermove(void) { + int i,j; + node *t; + char line[100],*m1,*m2; + + if (playing) + printf("\033[1m%s's move?\033[0m ",root->who ? "Black" : "White"); + else + printf("\033[1mCommand?\033[0m "); + abortflag = 0; + if (!gets(line)) { + putchar('\n'); + if (feof(stdin)) fixexit(0); + return 0; + } + for (m1 = line; *m1 && *m1<=' '; m1++); + if (!*m1) return(0); + m2 = m1+1; + if (*m2) m2++; + for (; *m2 && *m2<'0'; m2++); + if (playing && m1[1]>='0' && m1[1]<='9') { + i = decode(m1); + j = decode(m2); + if (i && j) for (t = root->son; t; t = t->brother) + if (t->from == i && t->to == j) return(t); + puts("Valid moves are:"); + m1[0] = 'L'; + } + switch(toupper(m1[0])) { + case 0: return(0); + case 'A': + if (playing) autoplay = 1; + return(root); + case 'C': + puts(copyright); + break; + case 'D': + debug = !debug; + printf("Debug is now %s.", debug ? "on" : "off"); + break; + case 'F': + forcejumps = !forcejumps; + printf("Forced jumps rule is now %s.",forcejumps ? "on" : "off"); + killnode(root->son); root->son = 0; + return(0); + case 'L': + expandnode(root); + if (playing) for (t = root->son; t; t = t->brother) dumpnode(t,1); + break; + case 'M': + return(playing ? root : 0); + case 'N': + newgame(); + VT100board(); + return(0); + case 'P': + printf("I expect the following moves:\n"); + for (t = root->son; t; t = t->son) dumpnode(t,0); + break; + case 'Q': + fixexit(0); + case 'R': + VT100board(); + break; + case 'S': + user = !user; + return(root); + case 'U': + VT100move(undomove(),1); + VT100move(undomove(),1); + return(0); + case '+': + maxevaluate = maxnodes = 2*maxevaluate; + goto J2; + case '-': + if (maxevaluate > 1) + maxevaluate = maxnodes = maxevaluate/2; + J2: printf("Moves evaluated set to %d.",maxevaluate); + break; + default: + puts( + "A(utoplay)\n" + "C(opyright)\n" + "D(ebug on/off)\n" + "F(orce jumps rule on/off)\n" + "L(ist legal moves)\n" + "M(ake a move for me)\n" + "N(ew game)\n" + "P(redict next few moves)\n" + "Q(uit)\n" + "R(edraw screen)\n" + "S(witch sides)\n" + "U(ndo)\n" + "+ - smarter\n" + "- - stupider"); + expandnode(root); + for (t = root->son; t; t = t->brother) dumpnode(t,1); + } + return(0); +} + +int VT100main() { + signal(SIGINT,sigint); + VT100board(); + for (;;) { + if (playing) { + expandnode(root); + if (!root->son) { + printf("%s has no move. Game over.",root->who ? "Black" : "White"); + playing = autoplay = 0; + } + } + node* move; + if (playing && (autoplay || root->who == user)) { + move = calcmove(root); + if (move->value <= -30000) { + printf("%s resigns.", move->who ? "White" : "Black"); + move = 0; + playing = autoplay = 0; + } + } else { + move = getusermove(); + if (move == root) move = calcmove(root); + } + if (move) { + dumpnode(move,0); + domove(move); + VT100move(move,0); + } + } +} + +#endif + +//////////////////////////////////////////////////////////////// +// fltk interface: +#ifdef FLTK + +#include +#include +#include +#include +#include +#include + +//---------------------------------------------------------------- +// old 4-level NeXT images have been seperated into bitmaps so they +// can be drawn with arbitrary colors and real transparency. This is +// rather tedious and perhaps fltk should provide a direct support +// to do this: + +#include "pixmaps/black_1.xbm" +#include "pixmaps/black_2.xbm" +#include "pixmaps/black_3.xbm" +#include "pixmaps/black_4.xbm" +#include "pixmaps/white_1.xbm" +#include "pixmaps/white_2.xbm" +#include "pixmaps/white_3.xbm" +#include "pixmaps/white_4.xbm" +#include "pixmaps/blackking_1.xbm" +#include "pixmaps/blackking_2.xbm" +#include "pixmaps/blackking_3.xbm" +#include "pixmaps/blackking_4.xbm" +#include "pixmaps/whiteking_1.xbm" +#include "pixmaps/whiteking_2.xbm" +#include "pixmaps/whiteking_3.xbm" +#include "pixmaps/whiteking_4.xbm" + +Fl_Bitmap *bm[4][4]; + +void make_bitmaps() { + if (bm[0][0]) return; + bm[0][0] = new Fl_Bitmap(black_1_bits, black_1_width, black_1_height); + bm[0][1] = new Fl_Bitmap(black_2_bits, black_1_width, black_1_height); + bm[0][2] = new Fl_Bitmap(black_3_bits, black_1_width, black_1_height); + bm[0][3] = new Fl_Bitmap(black_4_bits, black_1_width, black_1_height); + bm[1][0] = new Fl_Bitmap(white_1_bits, black_1_width, black_1_height); + bm[1][1] = new Fl_Bitmap(white_2_bits, black_1_width, black_1_height); + bm[1][2] = new Fl_Bitmap(white_3_bits, black_1_width, black_1_height); + bm[1][3] = new Fl_Bitmap(white_4_bits, black_1_width, black_1_height); + bm[2][0] = new Fl_Bitmap(blackking_1_bits, black_1_width, black_1_height); + bm[2][1] = new Fl_Bitmap(blackking_2_bits, black_1_width, black_1_height); + bm[2][2] = new Fl_Bitmap(blackking_3_bits, black_1_width, black_1_height); + bm[2][3] = new Fl_Bitmap(blackking_4_bits, black_1_width, black_1_height); + bm[3][0] = new Fl_Bitmap(whiteking_1_bits, black_1_width, black_1_height); + bm[3][1] = new Fl_Bitmap(whiteking_2_bits, black_1_width, black_1_height); + bm[3][2] = new Fl_Bitmap(whiteking_3_bits, black_1_width, black_1_height); + bm[3][3] = new Fl_Bitmap(whiteking_4_bits, black_1_width, black_1_height); +} + +#define ISIZE black_1_width + +void draw_piece(int which, int x, int y) { + if (!fl_not_clipped(x,y,ISIZE,ISIZE)) return; + switch (which) { + case BLACK: which = 0; break; + case WHITE: which = 1; break; + case BLACKKING: which = 2; break; + case WHITEKING: which = 3; break; + default: return; + } + fl_color(FL_BLACK); bm[which][0]->draw(x, y); + fl_color(FL_INACTIVE_COLOR); bm[which][1]->draw(x, y); + fl_color(FL_SELECTION_COLOR); bm[which][2]->draw(x, y); + fl_color(FL_WHITE); bm[which][3]->draw(x, y); +} + +//---------------------------------------------------------------- + +class Board : public Fl_Double_Window { + void draw(); + int handle(int); +public: + void drag_piece(int, int, int); + void drop_piece(int); + void animate(node* move, int backwards); + void computer_move(int); + Board(int w, int h) : Fl_Double_Window(w,h) {color(15);} +}; + +#define BOXSIZE 52 +#define BORDER 4 +#define BOARDSIZE (8*BOXSIZE+BORDER) +#define BMOFFSET 5 + +static int erase_this; // real location of dragging piece, don't draw it +static int dragging; // piece being dragged +static int dragx; // where it is +static int dragy; +static int showlegal; // show legal moves + +int squarex(int i) {return (usermoves(i,1)-'A')*BOXSIZE+BMOFFSET;} +int squarey(int i) {return (usermoves(i,2)-'1')*BOXSIZE+BMOFFSET;} + +void Board::draw() { + make_bitmaps(); + fl_draw_box(box(),0,0,w(),h(),color()); + fl_color((Fl_Color)10 /*107*/); + int x; for (x=0; x<8; x++) for (int y=0; y<8; y++) { + if (!((x^y)&1)) fl_rectf(BORDER+x*BOXSIZE, BORDER+y*BOXSIZE, + BOXSIZE-BORDER, BOXSIZE-BORDER); + } + fl_color(FL_DARK3 /*FL_GRAY_RAMP+4*/); + for (x=0; x<9; x++) { + fl_rectf(x*BOXSIZE,0,BORDER,h()); + fl_rectf(0,x*BOXSIZE,w(),BORDER); + } + for (int j = 5; j < 40; j++) if (j != erase_this) { + draw_piece(b[j], squarex(j), squarey(j)); + } + if (showlegal) { + fl_color(FL_WHITE); + node* n; + for (n = root->son; n; n = showlegal==2 ? n->son : n->brother) { + int x1 = squarex(n->from)+BOXSIZE/2-5; + int y1 = squarey(n->from)+BOXSIZE/2-5; + int x2 = squarex(n->to)+BOXSIZE/2-5; + int y2 = squarey(n->to)+BOXSIZE/2-5; + fl_line(x1,y1,x2,y2); + fl_push_matrix(); + fl_mult_matrix(x2-x1,y2-y1,y1-y2,x2-x1,x2,y2); + fl_begin_polygon(); + fl_vertex(0,0); + fl_vertex(-.3, .1); + fl_vertex(-.3, -.1); + fl_end_polygon(); + fl_pop_matrix(); + } + int num = 1; + fl_color(FL_BLACK); + fl_font(FL_BOLD,10); + for (n = root->son; n; n = showlegal==2 ? n->son : n->brother) { + int x1 = squarex(n->from)+BOXSIZE/2-5; + int y1 = squarey(n->from)+BOXSIZE/2-5; + int x2 = squarex(n->to)+BOXSIZE/2-5; + int y2 = squarey(n->to)+BOXSIZE/2-5; + char buf[20]; sprintf(buf,"%d",num); + fl_draw(buf, x1+int((x2-x1)*.85)-3, y1+int((y2-y1)*.85)+5); + num++; + } + } + if (dragging) draw_piece(dragging, dragx, dragy); +} + +// drag the piece on square i to dx dy, or undo drag if i is zero: +void Board::drag_piece(int j, int dx, int dy) { + dy = (dy&-2) | dx&1; // make halftone shadows line up + if (j != erase_this) drop_piece(erase_this); // should not happen + if (!erase_this) { // pick up old piece + dragx = squarex(j); dragy = squarey(j); + erase_this = j; + dragging = b[j]; + } + if (dx != dragx || dy != dragy) { + damage(FL_DAMAGE_ALL, dragx, dragy, ISIZE, ISIZE); + damage(FL_DAMAGE_ALL, dx, dy, ISIZE, ISIZE); + } + dragx = dx; + dragy = dy; +} + +// drop currently dragged piece on square i +void Board::drop_piece(int j) { + if (!erase_this) return; // should not happen! + erase_this = 0; + dragging = 0; + int x = squarex(j); + int y = squarey(j); + if (x != dragx || y != dragy) { + damage(4, dragx, dragy, ISIZE, ISIZE); + damage(4, x, y, ISIZE, ISIZE); + } +} + +// show move (call this *before* the move, *after* undo): +void Board::animate(node* move, int backwards) { + if (showlegal) {showlegal = 0; redraw();} + if (!move) return; + int f = move->from; + int t = move->to; + if (backwards) {int x = f; f = t; t = x;} + int x1 = squarex(f); + int y1 = squarey(f); + int x2 = squarex(t); + int y2 = squarey(t); + const int STEPS=35; + for (int j=0; jfrom,x,y); + Fl::flush(); + } + drop_piece(t); + if (move->jump) redraw(); +} + +int busy; // causes pop-up abort menu + +void Board::computer_move(int help) { + if (!playing) return; + cursor(FL_CURSOR_WAIT); + Fl::flush(); + busy = 1; abortflag = 0; + node* move = calcmove(root); + busy = 0; + if (move) { + if (!help && move->value <= -30000) { + fl_message("%s resigns", move->who ? "White" : "Black"); + playing = autoplay = 0; + cursor(FL_CURSOR_DEFAULT); + return; + } + animate(move,0); + domove(move); + } + expandnode(root); + if (!root->son) { + fl_message("%s has no move", root->who ? "Black" : "White"); + playing = autoplay = 0; + } + if (!autoplay) cursor(FL_CURSOR_DEFAULT); +} + +extern Fl_Menu_Item menu[]; +extern Fl_Menu_Item busymenu[]; + +int Board::handle(int e) { + if (busy) { + const Fl_Menu_Item* m; + switch(e) { + case FL_PUSH: + m = busymenu->popup(Fl::event_x(), Fl::event_y(), 0, 0, 0); + if (m) m->do_callback(this, (void*)m); + return 1; + case FL_SHORTCUT: + m = busymenu->test_shortcut(); + if (m) {m->do_callback(this, (void*)m); return 1;} + return 0; + default: + return 0; + } + } + node *t, *n; + static int deltax, deltay; + int dist; + const Fl_Menu_Item* m; + switch (e) { + case FL_PUSH: + if (Fl::event_button() > 1) { + m = menu->popup(Fl::event_x(), Fl::event_y(), 0, 0, 0); + if (m) m->do_callback(this, (void*)m); + return 1; + } + if (playing) { + expandnode(root); + for (t = root->son; t; t = t->brother) { + int x = squarex(t->from); + int y = squarey(t->from); + if (Fl::event_inside(x,y,BOXSIZE,BOXSIZE)) { + deltax = Fl::event_x()-x; + deltay = Fl::event_y()-y; + drag_piece(t->from,x,y); + return 1; + } + } + } + return 0; + case FL_SHORTCUT: + m = menu->test_shortcut(); + if (m) {m->do_callback(this, (void*)m); return 1;} + return 0; + case FL_DRAG: + drag_piece(erase_this, Fl::event_x()-deltax, Fl::event_y()-deltay); + return 1; + case FL_RELEASE: + // find the closest legal move he dropped it on: + dist = 50*50; n = 0; + for (t = root->son; t; t = t->brother) if (t->from==erase_this) { + int d1 = Fl::event_x()-deltax-squarex(t->to); + int d = d1*d1; + d1 = Fl::event_y()-deltay-squarey(t->to); + d += d1*d1; + if (d < dist) {dist = d; n = t;} + } + if (!n) {drop_piece(erase_this); return 1;} // none found + drop_piece(n->to); + domove(n); + if (showlegal) {showlegal = 0; redraw();} + if (n->jump) redraw(); + computer_move(0); + return 1; + default: + return 0; + } +} + +void quit_cb(Fl_Widget*, void*) {exit(0);} + +int FLTKmain(int argc, char** argv) { + Fl::visual(FL_DOUBLE|FL_INDEX); + Board b(BOARDSIZE,BOARDSIZE); + b.callback(quit_cb); + b.show(argc,argv); + return Fl::run(); +} + +void autoplay_cb(Fl_Widget*bp, void*) { + if (autoplay) {autoplay = 0; return;} + if (!playing) return; + Board* b = (Board*)bp; + autoplay = 1; + while (autoplay) {b->computer_move(0); b->computer_move(0);} +} + +#include +Fl_Window *copyright_window; +void copyright_cb(Fl_Widget*, void*) { + if (!copyright_window) { + copyright_window = new Fl_Window(400,270,"Copyright"); + copyright_window->color(FL_WHITE); + Fl_Box *b = new Fl_Box(20,0,380,270,copyright); + b->labelsize(10); + b->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_WRAP); + copyright_window->end(); + } + copyright_window->hotspot(copyright_window); + copyright_window->set_non_modal(); + copyright_window->show(); +} + +void debug_cb(Fl_Widget*, void*v) { + debug = !debug; + ((Fl_Menu_Item*)v)->flags = + debug ? FL_MENU_TOGGLE|FL_MENU_VALUE : FL_MENU_TOGGLE; +} + +void forced_cb(Fl_Widget*b, void*v) { + forcejumps = !forcejumps; + ((Fl_Menu_Item*)v)->flags = + forcejumps ? FL_MENU_TOGGLE|FL_MENU_VALUE : FL_MENU_TOGGLE; + killnode(root->son); root->son = 0; + if (showlegal) {expandnode(root); b->redraw();} +} + +void move_cb(Fl_Widget*pb, void*) { + Board* b = (Board*)pb; + if (playing) b->computer_move(1); + if (playing) b->computer_move(0); +} + +void newgame_cb(Fl_Widget*b, void*) { + showlegal = 0; + newgame(); + b->redraw(); +} + +void legal_cb(Fl_Widget*pb, void*) { + if (showlegal == 1) {showlegal = 0; ((Board*)pb)->redraw(); return;} + if (!playing) return; + expandnode(root); + showlegal = 1; ((Board*)pb)->redraw(); +} + +void predict_cb(Fl_Widget*pb, void*) { + if (showlegal == 2) {showlegal = 0; ((Board*)pb)->redraw(); return;} + if (playing) expandnode(root); + showlegal = 2; ((Board*)pb)->redraw(); +} + +void switch_cb(Fl_Widget*pb, void*) { + user = !user; + ((Board*)pb)->computer_move(0); +} + +void undo_cb(Fl_Widget*pb, void*) { + Board* b = (Board*)pb; + b->animate(undomove(),1); + b->animate(undomove(),1); +} + +//-------------------------- + +#include +#include + +Fl_Window *intel_window; +Fl_Value_Output *intel_output; + +void intel_slider_cb(Fl_Widget*w, void*) { + double v = ((Fl_Slider*)w)->value(); + int n = int(v*v); + intel_output->value(n); + maxevaluate = maxnodes = n; +} + +void intel_cb(Fl_Widget*, void*) { + if (!intel_window) { + intel_window = new Fl_Window(200,25,"Checkers Intelligence"); + Fl_Slider* s = new Fl_Slider(60,0,140,25); + s->type(FL_HOR_NICE_SLIDER); + s->minimum(1); s->maximum(500); s->value(50); + s->callback(intel_slider_cb); + intel_output = new Fl_Value_Output(0,0,60,25); + intel_output->value(maxevaluate); + intel_window->resizable(s); + } + intel_window->hotspot(intel_window); + intel_window->set_non_modal(); + intel_window->show(); +} + +//--------------------------- + +void stop_cb(Fl_Widget*, void*) {abortflag = 1;} + +void continue_cb(Fl_Widget*, void*) {} + +Fl_Menu_Item menu[] = { + {"Autoplay", 'a', autoplay_cb}, + {"Legal moves", 'l', legal_cb}, + {"Move for me", 'm', move_cb}, + {"New game", 'n', newgame_cb}, + {"Predict", 'p', predict_cb}, + {"Switch sides", 's', switch_cb}, + {"Undo", 'u', undo_cb, 0, FL_MENU_DIVIDER}, + {"Forced jumps rule", 'f', forced_cb, 0, FL_MENU_TOGGLE|FL_MENU_VALUE}, + {"Debug", 'd', debug_cb, (void *)"d", FL_MENU_TOGGLE}, + {"Intelligence...", 'i', intel_cb, 0, FL_MENU_DIVIDER}, + {"Copyright", 'c', copyright_cb}, + {"Quit", 'q', quit_cb}, + {0}}; + +Fl_Menu_Item busymenu[] = { + {"Stop", '.', stop_cb}, + {"Autoplay", 'a', autoplay_cb}, + {"Continue", 0, continue_cb}, + {"Debug", 'd', debug_cb, (void *)"d", FL_MENU_TOGGLE}, + {"Intelligence...", 'i', intel_cb}, + {"Copyright", 'c', copyright_cb}, + {"Quit", 'q', quit_cb}, + {0}}; + +#endif + +//////////////////////////////////////////////////////////////// +// parts shared by both interface: + +#ifdef FLTK +#ifdef VT100 +#define BOTH +#endif +#endif + +#ifdef BOTH +int terminal; +int arg(int, char **argv, int &i) { + if (argv[i][1] == 't') {terminal = 1; i++; return 1;} + return 0; +} +#endif + +int didabort(void) { +#ifdef FLTK +#ifdef BOTH + if (!terminal) +#endif + Fl::check(); +#endif + if (abortflag) { + autoplay = 0; + abortflag = 0; + return 1; + } + return(0); +} + +int main(int argc, char **argv) { + seed = time(0); + newgame(); +#ifdef BOTH + int i = 1; + if (Fl::args(argc, argv, i, arg) < argc) { + fprintf(stderr," -t : use VT100 display\n", Fl::help); + exit(1); + } + if (!getenv("DISPLAY")) terminal = 1; + if (!terminal) +#endif +#ifdef FLTK + return FLTKmain(argc,argv); +#endif +#ifdef VT100 + return VT100main(); +#endif +} + +// +// End of "$Id: checkers.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/clock.cxx b/third_party/windows/fltk-1.1.10/test/clock.cxx new file mode 100644 index 0000000..db218b1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/clock.cxx @@ -0,0 +1,53 @@ +// +// "$Id: clock.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Clock test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include + +int main(int argc, char **argv) { + Fl_Window window(220,220,"Fl_Clock"); + Fl_Clock c1(0,0,220,220); // c1.color(2,1); + window.resizable(c1); + window.end(); + Fl_Window window2(220,220,"Fl_Round_Clock"); + Fl_Round_Clock c2(0,0,220,220); // c2.color(3,4); + window2.resizable(c2); + window2.end(); + // my machine had a clock* Xresource set for another program, so + // I don't want the class to be "clock": + window.xclass("Fl_Clock"); + window2.xclass("Fl_Clock"); + window.show(argc,argv); + window2.show(); + return Fl::run(); +} + +// +// End of "$Id: clock.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/colbrowser.cxx b/third_party/windows/fltk-1.1.10/test/colbrowser.cxx new file mode 100644 index 0000000..dccd4d4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/colbrowser.cxx @@ -0,0 +1,330 @@ +// +// "$Id: colbrowser.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Forms test program for the Fast Light Tool Kit (FLTK). +// +// This is an XForms program from the 0.86 distribution of XForms. +// It has been modified as little as possible to work under fltk by +// using fltk's Forms emulation. Search for "fltk" to find all the +// changes +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include // changed for fltk +#include +#include // added for fltk +#include // added for fltk + +#define MAX_RGB 3000 + +static FL_FORM *cl; +static Fl_Widget *rescol, *dbobj, *colbr, *rs, *gs, *bs; +char dbname[FL_PATH_MAX]; +static void create_form_cl(void); +static int load_browser(char *); + +typedef struct { int r, g, b; } RGBdb; + +static RGBdb rgbdb[MAX_RGB]; + +int +main(int argc, char *argv[]) +{ + + fl_initialize(&argc, argv, "FormDemo", 0, 0); + + create_form_cl(); + strcpy(dbname, "rgb.txt"); + + if (load_browser(dbname)) + fl_set_object_label(dbobj, dbname); + else + fl_set_object_label(dbobj, "None"); + +// fl_set_form_minsize(cl, cl->w , cl->h); // removed for fltk +// fl_set_form_maxsize(cl, 2*cl->w , 2*cl->h); // removed for fltk + cl->size_range(cl->w(),cl->h(),2*cl->w(),2*cl->h()); // added for fltk + // border changed from FL_TRANSIENT for fltk: + // This is so Esc & the close box will close the window. + // (on transient windows attempting to close it just calls the callback) + fl_show_form(cl, FL_PLACE_FREE, 1/*FL_TRANSIENT*/, "RGB Browser"); + + + while (fl_do_forms()) + ; + return 0; +} + +static void +set_entry(int i) +{ + RGBdb *db = rgbdb + i; + + fl_freeze_form(cl); +// unclear why demo is doing this. This messes up FL: +// fl_mapcolor(FL_FREE_COL4+i, db->r, db->g, db->b); + fl_mapcolor(FL_FREE_COL4, db->r, db->g, db->b); + fl_set_slider_value(rs, db->r); + fl_set_slider_value(gs, db->g); + fl_set_slider_value(bs, db->b); + fl_redraw_object(rescol); + fl_unfreeze_form(cl); +} + +static void +br_cb(Fl_Widget * ob, long) +{ + int r = fl_get_browser(ob); + + if (r <= 0) + return; + set_entry(r - 1); +} + +static int +read_entry(FILE * fp, int *r, int *g, int *b, char *name) +{ + int n; + char buf[512], *p; + + if (!fgets(buf, sizeof(buf) - 1, fp)) + return 0; + + if(buf[0] == '!') + fgets(buf,sizeof(buf)-1,fp); + + if(sscanf(buf, " %d %d %d %n", r, g, b, &n) < 3) + return 0; + + p = buf + n; + + /* squeeze out all spaces */ + while (*p) + { + if (*p != ' ' && *p != '\n') + *name++ = *p; + p++; + } + *name = 0; + + return (feof(fp) || ferror(fp)) ? 0 : 1; +} + + +static int +load_browser(char *fname) +{ + FILE *fp; + RGBdb *db = rgbdb, *dbs = db + MAX_RGB; + int r, g, b, lr = -1 , lg = -1, lb = -1; + char name[256], buf[256]; +#ifdef __EMX__ + if (!(fp = fopen(__XOS2RedirRoot(fname), "r"))) +#else + if (!(fp = fopen(fname, "r"))) +#endif + { + fl_show_alert("Load", fname, "Can't open", 0); + return 0; + } + + /* read the items */ + + fl_freeze_form(cl); + + for (; db < dbs && read_entry(fp, &r, &g, &b, name);) + { + db->r = r; + db->g = g; + db->b = b; + + /* unique the entries on the fly */ + if (lr != r || lg != g || lb != b) + { + db++; + lr = r; + lg = g; + lb = b; + sprintf(buf, "(%3d %3d %3d) %s", r, g, b, name); + fl_addto_browser(colbr, buf); + } + } + fclose(fp); + + if (db < dbs) + db->r = 1000; /* sentinel */ + else + { + db--; + db->r = 1000; + } + + fl_set_browser_topline(colbr, 1); + fl_select_browser_line(colbr, 1); + set_entry(0); + fl_unfreeze_form(cl); + return 1; +} + +static int +search_entry(int r, int g, int b) +{ + register RGBdb *db = rgbdb; + int i, j, diffr, diffg, diffb; + unsigned int diff, mindiff; + + mindiff = (unsigned int)~0; + for (i = j = 0; db->r < 256; db++, i++) + { + diffr = r - db->r; + diffg = g - db->g; + diffb = b - db->b; + +#ifdef FL_LINEAR + diff = unsigned(3.0 * (FL_abs(r - db->r)) + + (5.9 * FL_abs(g - db->g)) + + (1.1 * (FL_abs(b - db->b))); +#else + diff = unsigned(3.0 * (diffr *diffr) + + 5.9 * (diffg *diffg) + + 1.1 * (diffb *diffb)); +#endif + + if (mindiff > diff) + { + mindiff = diff; + j = i; + } + } + + return j; +} + +static void +search_rgb(Fl_Widget *, long) +{ + int r, g, b, i; + int top = fl_get_browser_topline(colbr); + + r = int(fl_get_slider_value(rs)); + g = int(fl_get_slider_value(gs)); + b = int(fl_get_slider_value(bs)); + + fl_freeze_form(cl); + fl_mapcolor(FL_FREE_COL4, r, g, b); + fl_redraw_object(rescol); + i = search_entry(r, g, b); + /* change topline only if necessary */ + if(i < top || i > (top+15)) + fl_set_browser_topline(colbr, i-8); + fl_select_browser_line(colbr, i + 1); + fl_unfreeze_form(cl); +} + +/* change database */ +static void +db_cb(Fl_Widget * ob, long) +{ + const char *p = fl_show_input("Enter New Database Name", dbname); + char buf[512]; + + if (!p || strcmp(p, dbname) == 0) + return; + + strcpy(buf, p); + if (load_browser(buf)) + strcpy(dbname, buf); + else + fl_set_object_label(ob, dbname); +} + +static void +done_cb(Fl_Widget *, long) +{ + exit(0); +} + +static void +create_form_cl(void) +{ + Fl_Widget *obj; + + if (cl) + return; + + cl = fl_bgn_form(FL_NO_BOX, 330, 385); + obj = fl_add_box(FL_UP_BOX, 0, 0, 330, 385, ""); + fl_set_object_color(obj, FL_INDIANRED, FL_COL1); + + obj = fl_add_box(FL_NO_BOX, 40, 10, 250, 30, "Color Browser"); + fl_set_object_lcol(obj, FL_RED); + fl_set_object_lsize(obj, FL_HUGE_SIZE); + fl_set_object_lstyle(obj, FL_BOLD_STYLE + FL_SHADOW_STYLE); + + dbobj = obj = fl_add_button(FL_NORMAL_BUTTON, 40, 50, 250, 25, ""); + fl_set_object_boxtype(obj, FL_BORDER_BOX); + fl_set_object_color(obj, /*fl_get_visual_depth()==1 ? FL_WHITE:*/ FL_INDIANRED, + FL_INDIANRED); + fl_set_object_callback(obj, db_cb, 0); + rs = obj = fl_add_valslider(FL_VERT_FILL_SLIDER, 225, 130, 30, 200, ""); + fl_set_object_color(obj, FL_INDIANRED, FL_RED); + fl_set_slider_bounds(obj, 0, 255); + fl_set_slider_precision(obj, 0); + fl_set_object_callback(obj, search_rgb, 0); + fl_set_slider_return(obj, 0); + + gs = obj = fl_add_valslider(FL_VERT_FILL_SLIDER, 255, 130, 30, 200, ""); + fl_set_object_color(obj, FL_INDIANRED, FL_GREEN); + fl_set_slider_bounds(obj, 0, 255); + fl_set_slider_precision(obj, 0); + fl_set_object_callback(obj, search_rgb, 1); + fl_set_slider_return(obj, 0); + + bs = obj = fl_add_valslider(FL_VERT_FILL_SLIDER, 285, 130, 30, 200, ""); + fl_set_object_color(obj, FL_INDIANRED, FL_BLUE); + fl_set_slider_bounds(obj, 0, 255); + fl_set_slider_precision(obj, 0); + fl_set_object_callback(obj, search_rgb, 2); + fl_set_slider_return(obj, 0); + + + colbr = obj = fl_add_browser(FL_HOLD_BROWSER, 10, 90, 205, 240, ""); + fl_set_browser_fontstyle(obj, FL_FIXED_STYLE); + fl_set_object_callback(obj, br_cb, 0); + + + obj = fl_add_button(FL_NORMAL_BUTTON, 135, 345, 80, 30, "Done"); + fl_set_object_callback(obj, done_cb, 0); + + rescol = obj = fl_add_box(FL_FLAT_BOX, 225, 90, 90, 35, ""); + fl_set_object_color(obj, FL_FREE_COL4, FL_FREE_COL4); + fl_set_object_boxtype(obj, FL_BORDER_BOX); + + + fl_end_form(); + fl_scale_form(cl, 1.1, 1.0); +} + +// +// End of "$Id: colbrowser.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/color_chooser.cxx b/third_party/windows/fltk-1.1.10/test/color_chooser.cxx new file mode 100644 index 0000000..70cb5d0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/color_chooser.cxx @@ -0,0 +1,152 @@ +// +// "$Id: color_chooser.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Color chooser test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#if !defined(WIN32) && !defined(__APPLE__) +#include "list_visuals.cxx" +#endif + +int width = 75; +int height = 75; +uchar *image; + +void make_image() { + image = new uchar[3*width*height]; + uchar *p = image; + for (int y = 0; y < height; y++) { + double Y = double(y)/(height-1); + for (int x = 0; x < width; x++) { + double X = double(x)/(width-1); + *p++ = uchar(255*((1-X)*(1-Y))); // red in upper-left + *p++ = uchar(255*((1-X)*Y)); // green in lower-left + *p++ = uchar(255*(X*Y)); // blue in lower-right + } + } +} + +class Pens : public Fl_Box { + void draw(); +public: + Pens(int X, int Y, int W, int H, const char* L) + : Fl_Box(X,Y,W,H,L) {} +}; +void Pens::draw() { + // use every color in the gray ramp: + for (int i = 0; i < 3*8; i++) { + fl_color((Fl_Color)(FL_GRAY_RAMP+i)); + fl_line(x()+i, y(), x()+i, y()+h()); + } +} + +Fl_Color c = FL_GRAY; +#define fullcolor_cell (FL_FREE_COLOR) + +void cb1(Fl_Widget *, void *v) { + c = fl_show_colormap(c); + Fl_Box* b = (Fl_Box*)v; + b->color(c); + b->parent()->redraw(); +} + +void cb2(Fl_Widget *, void *v) { + uchar r,g,b; + Fl::get_color(c,r,g,b); + if (!fl_color_chooser("New color:",r,g,b)) return; + c = fullcolor_cell; + Fl::set_color(fullcolor_cell,r,g,b); + Fl_Box* bx = (Fl_Box*)v; + bx->color(fullcolor_cell); + bx->parent()->redraw(); +} + +int main(int argc, char ** argv) { + Fl::set_color(fullcolor_cell,145,159,170); + Fl_Window window(400,400); + Fl_Box box(50,50,300,300); + box.box(FL_THIN_DOWN_BOX); + c = fullcolor_cell; + box.color(c); + Fl_Button b1(140,120,120,30,"fl_show_colormap"); + b1.callback(cb1,&box); + Fl_Button b2(140,160,120,30,"fl_choose_color"); + b2.callback(cb2,&box); + Fl_Box image_box(140,200,120,120,0); + make_image(); + (new Fl_RGB_Image(image, width, height))->label(&image_box); + Fl_Box b(140,320,120,0,"Example of fl_draw_image()"); + Pens p(80,200,3*8,120,"lines"); + p.align(FL_ALIGN_TOP); + int i = 1; + if (!Fl::args(argc,argv,i) || i != argc-1) { + printf("usage: %s visual-number\n" + " - : default visual\n" + " r : call Fl::visual(FL_RGB)\n" + " c : call Fl::own_colormap()\n",argv[0]); +#if !defined(WIN32) && !defined(__APPLE__) + printf(" # : use this visual with an empty colormap:\n"); + list_visuals(); +#endif + puts(Fl::help); + exit(1); + } + if (argv[i][0] == 'r') { + if (!Fl::visual(FL_RGB)) printf("Fl::visual(FL_RGB) returned false.\n"); + } else if (argv[i][0] == 'c') { + Fl::own_colormap(); + } else if (argv[i][0] != '-') { +#if !defined(WIN32) && !defined(__APPLE__) + int visid = atoi(argv[i]); + fl_open_display(); + XVisualInfo templt; int num; + templt.visualid = visid; + fl_visual = XGetVisualInfo(fl_display, VisualIDMask, &templt, &num); + if (!fl_visual) Fl::fatal("No visual with id %d",visid); + fl_colormap = XCreateColormap(fl_display, RootWindow(fl_display,fl_screen), + fl_visual->visual, AllocNone); + fl_xpixel(FL_BLACK); // make sure black is allocated +#else + Fl::fatal("Visual id's not supported on MSWindows or MacOS."); +#endif + } + window.show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: color_chooser.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/connect.cxx b/third_party/windows/fltk-1.1.10/test/connect.cxx new file mode 100644 index 0000000..2c2c6d2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/connect.cxx @@ -0,0 +1,77 @@ +// +// "$Id: connect.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// PPP example program for the Fast Light Tool Kit (FLTK). +// +// Program to make a button to turn a ppp connection on/off. +// You must chmod +s /usr/sbin/pppd, and put all the options +// into /etc/ppp/options. +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +#include +#include +#include + +int running; // actually the pid +Fl_Toggle_Button *Button; + +void sigchld(int) { + waitpid(running, 0, 0); + running = 0; + Button->value(0); +} + +void cb(Fl_Widget *o, void *) { + if (((Fl_Toggle_Button*)o)->value()) { + if (running) return; + running = fork(); + if (!running) execl("/usr/sbin/pppd","pppd","-detach",0); + else signal(SIGCHLD, sigchld); + } else { + if (!running) return; + kill(running, SIGINT); + waitpid(running, 0, 0); + running = 0; + } +} + +int main(int argc, char ** argv) { + Fl_Window window(100,50); + Fl_Toggle_Button button(0,0,100,50,"Connect"); + Button = &button; + button.color(1,2); + button.callback(cb,0); + window.show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: connect.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/cube.cxx b/third_party/windows/fltk-1.1.10/test/cube.cxx new file mode 100644 index 0000000..f32c629 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/cube.cxx @@ -0,0 +1,199 @@ +// +// "$Id: cube.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Another forms test program for the Fast Light Tool Kit (FLTK). +// +// Modified to have 2 cubes to test multiple OpenGL contexts +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "config.h" +#include +#include +#include +#include +#include +#include +#include + +#if !HAVE_GL +class cube_box : public Fl_Box { +public: + double lasttime; + int wire; + double size; + double speed; + cube_box(int x,int y,int w,int h,const char *l=0) + :Fl_Box(FL_DOWN_BOX,x,y,w,h,l){ + label("This demo does\nnot work without GL"); + } +}; +#else +#include +#include + +class cube_box : public Fl_Gl_Window { + void draw(); + int handle(int); +public: + double lasttime; + int wire; + double size; + double speed; + cube_box(int x,int y,int w,int h,const char *l=0) + : Fl_Gl_Window(x,y,w,h,l) {lasttime = 0.0;} +}; + +/* The cube definition */ +float v0[3] = {0.0, 0.0, 0.0}; +float v1[3] = {1.0, 0.0, 0.0}; +float v2[3] = {1.0, 1.0, 0.0}; +float v3[3] = {0.0, 1.0, 0.0}; +float v4[3] = {0.0, 0.0, 1.0}; +float v5[3] = {1.0, 0.0, 1.0}; +float v6[3] = {1.0, 1.0, 1.0}; +float v7[3] = {0.0, 1.0, 1.0}; + +#define v3f(x) glVertex3fv(x) + +void drawcube(int wire) { +/* Draw a colored cube */ + glBegin(wire ? GL_LINE_LOOP : GL_POLYGON); + glColor3ub(0,0,255); + v3f(v0); v3f(v1); v3f(v2); v3f(v3); + glEnd(); + glBegin(wire ? GL_LINE_LOOP : GL_POLYGON); + glColor3ub(0,255,255); v3f(v4); v3f(v5); v3f(v6); v3f(v7); + glEnd(); + glBegin(wire ? GL_LINE_LOOP : GL_POLYGON); + glColor3ub(255,0,255); v3f(v0); v3f(v1); v3f(v5); v3f(v4); + glEnd(); + glBegin(wire ? GL_LINE_LOOP : GL_POLYGON); + glColor3ub(255,255,0); v3f(v2); v3f(v3); v3f(v7); v3f(v6); + glEnd(); + glBegin(wire ? GL_LINE_LOOP : GL_POLYGON); + glColor3ub(0,255,0); v3f(v0); v3f(v4); v3f(v7); v3f(v3); + glEnd(); + glBegin(wire ? GL_LINE_LOOP : GL_POLYGON); + glColor3ub(255,0,0); v3f(v1); v3f(v2); v3f(v6); v3f(v5); + glEnd(); +} + +void cube_box::draw() { + lasttime = lasttime+speed; + if (!valid()) { + glLoadIdentity(); + glViewport(0,0,w(),h()); + glEnable(GL_DEPTH_TEST); + glFrustum(-1,1,-1,1,2,10000); + glTranslatef(0,0,-10); + gl_font(FL_HELVETICA_BOLD, 16 ); + } + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glPushMatrix(); + glRotatef(float(lasttime*1.6),0,0,1); + glRotatef(float(lasttime*4.2),1,0,0); + glRotatef(float(lasttime*2.3),0,1,0); + glTranslatef(-1.0, 1.2f, -1.5); + glScalef(float(size),float(size),float(size)); + drawcube(wire); + glPopMatrix(); + gl_color(FL_GRAY); + glDisable(GL_DEPTH_TEST); + gl_draw(wire ? "Cube: wire" : "Cube: flat", -4.5f, -4.5f ); + glEnable(GL_DEPTH_TEST); +} + +int cube_box::handle(int e) { + switch (e) { + case FL_ENTER: cursor(FL_CURSOR_CROSS); break; + case FL_LEAVE: cursor(FL_CURSOR_DEFAULT); break; + } + return Fl_Gl_Window::handle(e); +} + +#endif + +Fl_Window *form; +Fl_Slider *speed, *size; +Fl_Button *button, *wire, *flat; +cube_box *cube, *cube2; + +void makeform(const char *name) { + form = new Fl_Window(510+390,390,name); + new Fl_Box(FL_DOWN_FRAME,20,20,350,350,""); + new Fl_Box(FL_DOWN_FRAME,510,20,350,350,""); + speed = new Fl_Slider(FL_VERT_SLIDER,390,90,40,220,"Speed"); + size = new Fl_Slider(FL_VERT_SLIDER,450,90,40,220,"Size"); + wire = new Fl_Radio_Light_Button(390,20,100,30,"Wire"); + flat = new Fl_Radio_Light_Button(390,50,100,30,"Flat"); + button = new Fl_Button(390,340,100,30,"Exit"); + cube = new cube_box(23,23,344,344, 0); + cube2 = new cube_box(513,23,344,344, 0); + Fl_Box *b = new Fl_Box(FL_NO_BOX,cube->x(),size->y(), + cube->w(),size->h(),0); + form->resizable(b); + b->hide(); + form->end(); +} + +int main(int argc, char **argv) { + makeform(argv[0]); + speed->bounds(4,0); + speed->value(cube->speed = cube2->speed = 1.0); + size->bounds(4,0.01); + size->value(cube->size = cube2->size = 1.0); + flat->value(1); cube->wire = 0; cube2->wire = 1; + form->label("cube"); + form->show(argc,argv); + cube->show(); + cube2->show(); +#if 0 + // This demonstrates how to manipulate OpenGL contexts. + // In this case the same context is used by multiple windows (I'm not + // sure if this is allowed on Win32, can somebody check?). + // This fixes a bug on the XFree86 3.0 OpenGL where only one context + // per program seems to work, but there are probably better uses for + // this! + cube->make_current(); // causes context to be created + cube2->context(cube->context()); // share the contexts +#endif + for (;;) { + if (form->visible() && speed->value()) + {if (!Fl::check()) break;} // returns immediately + else + {if (!Fl::wait()) break;} // waits until something happens + cube->wire = wire->value(); + cube2->wire = !wire->value(); + cube->size = cube2->size = size->value(); + cube->speed = cube2->speed = speed->value(); + cube->redraw(); + cube2->redraw(); + if (Fl::readqueue() == button) break; + } + return 0; +} + +// +// End of "$Id: cube.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/cursor.cxx b/third_party/windows/fltk-1.1.10/test/cursor.cxx new file mode 100644 index 0000000..69895f2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/cursor.cxx @@ -0,0 +1,165 @@ +// +// "$Id: cursor.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Cursor test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include + +Fl_Color fg = FL_BLACK; +Fl_Color bg = FL_WHITE; +Fl_Cursor cursor = FL_CURSOR_DEFAULT; + +Fl_Hor_Value_Slider *cursor_slider; + +void choice_cb(Fl_Widget *, void *v) { + cursor = (Fl_Cursor)(long)v; + cursor_slider->value(cursor); + fl_cursor(cursor,fg,bg); +} + +Fl_Menu_Item choices[] = { + {"FL_CURSOR_DEFAULT",0,choice_cb,(void*)FL_CURSOR_DEFAULT}, + {"FL_CURSOR_ARROW",0,choice_cb,(void*)FL_CURSOR_ARROW}, + {"FL_CURSOR_CROSS",0,choice_cb,(void*)FL_CURSOR_CROSS}, + {"FL_CURSOR_WAIT",0,choice_cb,(void*)FL_CURSOR_WAIT}, + {"FL_CURSOR_INSERT",0,choice_cb,(void*)FL_CURSOR_INSERT}, + {"FL_CURSOR_HAND",0,choice_cb,(void*)FL_CURSOR_HAND}, + {"FL_CURSOR_HELP",0,choice_cb,(void*)FL_CURSOR_HELP}, + {"FL_CURSOR_MOVE",0,choice_cb,(void*)FL_CURSOR_MOVE}, + {"FL_CURSOR_NS",0,choice_cb,(void*)FL_CURSOR_NS}, + {"FL_CURSOR_WE",0,choice_cb,(void*)FL_CURSOR_WE}, + {"FL_CURSOR_NWSE",0,choice_cb,(void*)FL_CURSOR_NWSE}, + {"FL_CURSOR_NESW",0,choice_cb,(void*)FL_CURSOR_NESW}, + {"FL_CURSOR_NONE",0,choice_cb,(void*)FL_CURSOR_NONE}, +#if 0 + {"FL_CURSOR_N",0,choice_cb,(void*)FL_CURSOR_N}, + {"FL_CURSOR_NE",0,choice_cb,(void*)FL_CURSOR_NE}, + {"FL_CURSOR_E",0,choice_cb,(void*)FL_CURSOR_E}, + {"FL_CURSOR_SE",0,choice_cb,(void*)FL_CURSOR_SE}, + {"FL_CURSOR_S",0,choice_cb,(void*)FL_CURSOR_S}, + {"FL_CURSOR_SW",0,choice_cb,(void*)FL_CURSOR_SW}, + {"FL_CURSOR_W",0,choice_cb,(void*)FL_CURSOR_W}, + {"FL_CURSOR_NW",0,choice_cb,(void*)FL_CURSOR_NW}, +#endif + {0} +}; + +void setcursor(Fl_Widget *o, void *) { + Fl_Hor_Value_Slider *slider = (Fl_Hor_Value_Slider *)o; + cursor = Fl_Cursor((int)slider->value()); + fl_cursor(cursor,fg,bg); +} + +void setfg(Fl_Widget *o, void *) { + Fl_Hor_Value_Slider *slider = (Fl_Hor_Value_Slider *)o; + fg = Fl_Color((int)slider->value()); + fl_cursor(cursor,fg,bg); +} + +void setbg(Fl_Widget *o, void *) { + Fl_Hor_Value_Slider *slider = (Fl_Hor_Value_Slider *)o; + bg = Fl_Color((int)slider->value()); + fl_cursor(cursor,fg,bg); +} + +// draw the label without any ^C or \nnn conversions: +class CharBox : public Fl_Box { + void draw() { + fl_font(FL_FREE_FONT,14); + fl_draw(label(), x()+w()/2, y()+h()/2); + } +public: + CharBox(int X, int Y, int W, int H, const char* L) : Fl_Box(X,Y,W,H,L) {} +}; + +int main(int argc, char **argv) { + Fl_Window window(400,300); + + Fl_Choice choice(80,100,200,25,"Cursor:"); + choice.menu(choices); + choice.callback(choice_cb); + choice.when(FL_WHEN_RELEASE|FL_WHEN_NOT_CHANGED); + + Fl_Hor_Value_Slider slider1(80,180,310,30,"Cursor:"); + cursor_slider = &slider1; + slider1.align(FL_ALIGN_LEFT); + slider1.step(1); + slider1.precision(0); + slider1.bounds(0,100); + slider1.value(0); + slider1.callback(setcursor); + slider1.value(cursor); + + Fl_Hor_Value_Slider slider2(80,220,310,30,"fgcolor:"); + slider2.align(FL_ALIGN_LEFT); + slider2.step(1); + slider2.precision(0); + slider2.bounds(0,255); + slider2.value(0); + slider2.callback(setfg); + slider2.value(fg); + + Fl_Hor_Value_Slider slider3(80,260,310,30,"bgcolor:"); + slider3.align(FL_ALIGN_LEFT); + slider3.step(1); + slider3.precision(0); + slider3.bounds(0,255); + slider3.value(0); + slider3.callback(setbg); + slider3.value(bg); + +#if 0 + // draw the manual's diagram of cursors... + window.size(400,800); + int y = 300; + Fl::set_font(FL_FREE_FONT, "cursor"); + char buf[100]; char *p = buf; + for (Fl_Menu* m = choices; m->label(); m++) { + Fl_Box* b = new Fl_Box(35,y,150,25,m->label()); + b->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); + int n = (int)(m->argument()); + if (n == FL_CURSOR_NONE) break; + if (n == FL_CURSOR_DEFAULT) n = FL_CURSOR_ARROW; + p[0] = (char)((n-1)*2); + p[1] = 0; + b = new CharBox(15,y,20,20,p); p+=2; + y += 25; + } +#endif + + window.resizable(window); + window.end(); + window.show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: cursor.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/curve.cxx b/third_party/windows/fltk-1.1.10/test/curve.cxx new file mode 100644 index 0000000..a83111a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/curve.cxx @@ -0,0 +1,115 @@ +// +// "$Id: curve.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Curve test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +double args[9] = { + 20,20, 50,200, 100,20, 200,200, 0}; +const char* name[9] = { + "X0", "Y0", "X1", "Y1", "X2", "Y2", "X3", "Y3", "rotate"}; + +int points; + +class Drawing : public Fl_Widget { + void draw() { + fl_clip(x(),y(),w(),h()); + fl_color(FL_DARK3); + fl_rectf(x(),y(),w(),h()); + fl_push_matrix(); + if (args[8]) { + fl_translate(x()+w()/2.0, y()+h()/2.0); + fl_rotate(args[8]); + fl_translate(-(x()+w()/2.0), -(y()+h()/2.0)); + } + fl_translate(x(),y()); + if (!points) { + fl_color(FL_WHITE); + fl_begin_complex_polygon(); + fl_curve(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]); + fl_end_complex_polygon(); + } + fl_color(FL_BLACK); + fl_begin_line(); + fl_vertex(args[0],args[1]); + fl_vertex(args[2],args[3]); + fl_vertex(args[4],args[5]); + fl_vertex(args[6],args[7]); + fl_end_line(); + fl_color(points ? FL_WHITE : FL_RED); + points ? fl_begin_points() : fl_begin_line(); + fl_curve(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]); + points ? fl_end_points() : fl_end_line(); + fl_pop_matrix(); + fl_pop_clip(); + } +public: + Drawing(int X,int Y,int W,int H) : Fl_Widget(X,Y,W,H) {} +}; + +Drawing *d; + +void points_cb(Fl_Widget* o, void*) { + points = ((Fl_Toggle_Button*)o)->value(); + d->redraw(); +} + +void slider_cb(Fl_Widget* o, void* v) { + Fl_Slider* s = (Fl_Slider*)o; + args[long(v)] = s->value(); + d->redraw(); +} + +int main(int argc, char** argv) { + Fl_Double_Window window(300,555); + Drawing drawing(10,10,280,280); + d = &drawing; + + int y = 300; + for (int n = 0; n<9; n++) { + Fl_Slider* s = new Fl_Hor_Value_Slider(50,y,240,25,name[n]); y += 25; + s->minimum(0); s->maximum(280); + if (n == 8) s->maximum(360); + s->step(1); + s->value(args[n]); + s->align(FL_ALIGN_LEFT); + s->callback(slider_cb, (void*)n); + } + Fl_Toggle_Button but(50,y,50,25,"points"); + but.callback(points_cb); + + window.end(); + window.show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: curve.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/demo.cxx b/third_party/windows/fltk-1.1.10/test/demo.cxx new file mode 100644 index 0000000..983ba0e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/demo.cxx @@ -0,0 +1,378 @@ +// +// "$Id: demo.cxx 5712 2007-02-23 19:27:43Z matt $" +// +// Main demo program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2007 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#if defined(WIN32) && !defined(__CYGWIN__) +# include +# ifndef __WATCOMC__ +// Visual C++ 2005 incorrectly displays a warning about the use of POSIX APIs +// on Windows, which is supposed to be POSIX compliant... +# define chdir _chdir +# define putenv _putenv +# endif // !__WATCOMC__ +#else +# include +#endif +#include +#include +#include +#include +#include +#include +#include + +/* The form description */ + +void doexit(Fl_Widget *, void *); +void doback(Fl_Widget *, void *); +void dobut(Fl_Widget *, long); +void doscheme(Fl_Choice *c, void *) { + Fl::scheme(c->text(c->value())); +} + +Fl_Window *form; +Fl_Button *but[9]; + +void create_the_forms() { + Fl_Widget *obj; + form = new Fl_Window(350, 440); + obj = new Fl_Box(FL_FRAME_BOX,10,385,330,40,"FLTK Demonstration"); + obj->color(FL_GRAY-4); + obj->labelsize(24); + obj->labelfont(FL_BOLD); + obj->labeltype(FL_ENGRAVED_LABEL); + obj = new Fl_Box(FL_FRAME_BOX,10,45,330,330,0); + obj->color(FL_GRAY-8); + obj = new Fl_Button(280,10,60,25,"Exit"); + obj->callback(doexit); + Fl_Choice *choice = new Fl_Choice(75, 10, 100, 25, "Scheme:"); + choice->labelfont(FL_HELVETICA_BOLD); + choice->add("none"); + choice->add("gtk+"); + choice->add("plastic"); + choice->callback((Fl_Callback *)doscheme); + Fl::scheme(NULL); + if (!Fl::scheme()) choice->value(0); + else if (!strcmp(Fl::scheme(), "gtk+")) choice->value(1); + else choice->value(2); + obj = new Fl_Button(10,45,330,380); obj->type(FL_HIDDEN_BUTTON); + obj->callback(doback); + obj = but[0] = new Fl_Button(30,265,90,90); + obj = but[1] = new Fl_Button(130,265,90,90); + obj = but[2] = new Fl_Button(230,265,90,90); + obj = but[5] = new Fl_Button(230,165,90,90); + obj = but[4] = new Fl_Button(130,165,90,90); + obj = but[3] = new Fl_Button(30,165,90,90); + obj = but[6] = new Fl_Button(30,65,90,90); + obj = but[7] = new Fl_Button(130,65,90,90); + obj = but[8] = new Fl_Button(230,65,90,90); + for (int i=0; i<9; i++) { + but[i]->align(FL_ALIGN_WRAP); + but[i]->callback(dobut, i); + } + form->forms_end(); +} + +/* Maintaining and building up the menus. */ + +typedef struct { + char name[64]; + int numb; + char iname[9][64]; + char icommand[9][64]; +} MENU; + +#define MAXMENU 32 + +MENU menus[MAXMENU]; +int mennumb = 0; + +int find_menu(const char* nnn) +/* Returns the number of a given menu name. */ +{ + int i; + for (i=0; ihide(); + for (i=0; ishow(); + but[bn]->label(menus[men].iname[i]); + if (menus[men].icommand[i][0] != '@') but[bn]->tooltip(menus[men].icommand[i]); + else but[bn]->tooltip(0); + } + if (stack[stsize]!=nnn) + strcpy(stack[stsize],nnn); + stsize++; +} + +void pop_menu() +/* Pops a menu */ +{ + if (stsize<=1) return; + stsize -= 2; + push_menu(stack[stsize]); +} + +/* The callback Routines */ + +void dobut(Fl_Widget *, long arg) +/* handles a button push */ +{ + int men = find_menu(stack[stsize-1]); + int n = menus[men].numb; + int bn = but2numb( (int) arg, n-1); + if (menus[men].icommand[bn][0] == '@') + push_menu(menus[men].icommand[bn]); + else { + +#ifdef WIN32 + STARTUPINFO suInfo; // Process startup information + PROCESS_INFORMATION prInfo; // Process information + + memset(&suInfo, 0, sizeof(suInfo)); + suInfo.cb = sizeof(suInfo); + + int icommand_length = strlen(menus[men].icommand[bn]); + + char* copy_of_icommand = new char[icommand_length+1]; + strcpy(copy_of_icommand,menus[men].icommand[bn]); + + // On WIN32 the .exe suffix needs to be appended to the command + // whilst leaving any additional parameters unchanged - this + // is required to handle the correct conversion of cases such as : + // `../fluid/fluid valuators.fl' to '../fluid/fluid.exe valuators.fl'. + + // skip leading spaces. + char* start_command = copy_of_icommand; + while(*start_command == ' ') ++start_command; + + // find the space between the command and parameters if one exists. + char* start_parameters = strchr(start_command,' '); + + char* command = new char[icommand_length+6]; // 6 for extra 'd.exe\0' + + if (start_parameters==NULL) { // no parameters required. +# ifdef _DEBUG + sprintf(command, "%sd.exe", start_command); +# else + sprintf(command, "%s.exe", start_command); +# endif // _DEBUG + } else { // parameters required. + // break the start_command at the intermediate space between + // start_command and start_parameters. + *start_parameters = 0; + // move start_paremeters to skip over the intermediate space. + ++start_parameters; + +# ifdef _DEBUG + sprintf(command, "%sd.exe %s", start_command, start_parameters); +# else + sprintf(command, "%s.exe %s", start_command, start_parameters); +# endif // _DEBUG + } + + CreateProcess(NULL, command, NULL, NULL, FALSE, + NORMAL_PRIORITY_CLASS, NULL, NULL, &suInfo, &prInfo); + + delete[] command; + delete[] copy_of_icommand; + +#else // NON WIN32 systems. + + int icommand_length = strlen(menus[men].icommand[bn]); + char* command = new char[icommand_length+5]; // 5 for extra './' and ' &\0' + + sprintf(command, "./%s &", menus[men].icommand[bn]); + system(command); + + delete[] command; +#endif // WIN32 + } +} + +void doback(Fl_Widget *, void *) {pop_menu();} + +void doexit(Fl_Widget *, void *) {exit(0);} + +int load_the_menu(const char* fname) +/* Loads the menu file. Returns whether successful. */ +{ + FILE *fin; + char line[256], mname[64],iname[64],cname[64]; + int i,j; + fin = fopen(fname,"r"); + if (fin == NULL) + { +// fl_show_message("ERROR","","Cannot read the menu description file."); + return 0; + } + for (;;) { + if (fgets(line,256,fin) == NULL) break; + // remove all carriage returns that Cygwin may have inserted + char *s = line, *d = line; + for (;;++d) { + while (*s=='\r') s++; + *d = *s++; + if (!*d) break; + } + // interprete the line + j = 0; i = 0; + while (line[i] == ' ' || line[i] == '\t') i++; + if (line[i] == '\n') continue; + if (line[i] == '#') continue; + while (line[i] != ':' && line[i] != '\n') mname[j++] = line[i++]; + mname[j] = '\0'; + if (line[i] == ':') i++; + j = 0; + while (line[i] != ':' && line[i] != '\n') + { + if (line[i] == '\\') { + i++; + if (line[i] == 'n') iname[j++] = '\n'; + else iname[j++] = line[i]; + i++; + } else + iname[j++] = line[i++]; + } + iname[j] = '\0'; + if (line[i] == ':') i++; + j = 0; + while (line[i] != ':' && line[i] != '\n') cname[j++] = line[i++]; + cname[j] = '\0'; + addto_menu(mname,iname,cname); + } + fclose(fin); + return 1; +} + +int main(int argc, char **argv) { + putenv((char *)"FLTK_DOCDIR=../documentation"); + char buf[256]; + strcpy(buf, argv[0]); +#if ( defined _MSC_VER || defined __MWERKS__ ) && defined _DEBUG + // MS_VisualC appends a 'd' to debugging executables. remove it. + fl_filename_setext( buf, "" ); + buf[ strlen(buf)-1 ] = 0; +#endif + fl_filename_setext(buf,".menu"); + const char *fname = buf; + int i = 0; + if (!Fl::args(argc,argv,i) || i < argc-1) + Fl::fatal("Usage: %s \n%s",argv[0],Fl::help); + if (i < argc) fname = argv[i]; + + create_the_forms(); + + if (!load_the_menu(fname)) Fl::fatal("Can't open %s",fname); + if (buf!=fname) + strcpy(buf,fname); + const char *c = fl_filename_name(buf); + if (c > buf) {buf[c-buf] = 0; chdir(buf);} + push_menu("@main"); + form->show(argc,argv); + Fl::run(); + return 0; +} + +// +// End of "$Id: demo.cxx 5712 2007-02-23 19:27:43Z matt $". +// + diff --git a/third_party/windows/fltk-1.1.10/test/demo.menu b/third_party/windows/fltk-1.1.10/test/demo.menu new file mode 100644 index 0000000..a989f8e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/demo.menu @@ -0,0 +1,89 @@ +# Menu description file for the generic demo program +# +# Each line consists of three fields, separated by : +# +# - menu name : To which the item belongs (starts with @) +# - item name : Placed on button. (use \n for newline) +# - command name: To be executed. Use a menu name to define a submenu. +# +# @main indicates the main menu. +# + +@main:Widget\nTests:@x + @x:Fl_Browser:browser + @x:Fl_Input:input + @x:Fl_Output:output + @x:Fl_Button:radio + @x:Fl_Tabs:tabs + @x:Fl_Tile:tile + @x:Fl_Scroll:scroll + @x:Fl_Pack:pack + @x:Fl_Menu:menubar + +@main:Window\nTests:@w + @w:overlay:overlay + @w:subwindow:subwindow + @w:double\nbuffer:doublebuffer + @w:GL window:cube + @w:GL overlay:gl_overlay + @w:iconize:iconize + @w:fullscreen:fullscreen + @w:resizable:resizebox + @w:resize:resize + +@main:Drawing\nTests:@d + @d:Images:@di + @di:Fl_Bitmap:bitmap + @di:Fl_Pixmap:pixmap + @di:Fl_RGB\n_Image:image + @di:Fl_Shared\n_Image:pixmap_browser + @di:Fl_Tiled\n_Image:tiled_image + @d:cursor:cursor + @d:labels:label + @d:fl_arc:arc + @d:fl_curve:curve + @d:fl_line_style:line_style + +@main:Events:@u + @u:navigation:navigation + @u:minimum update:minimum + @u:keyboard:keyboard + @u:fast && slow widgets:fast_slow + @u:inactive:inactive + +@main:Fluid\n(UI design tool):../fluid/fluid valuators.fl + +@main:Cool\nDemos:@e + @e:X Color\nBrowser:colbrowser + @e:Mandelbrot:mandelbrot + @e:Fractals:fractals + @e:Puzzle:glpuzzle + @e:Block\nAttack!:blocks + @e:Checkers:checkers + @e:Sudoku:sudoku + +@main:Other\nTests:@o + @o:Color Choosers:color_chooser r + @o:File Chooser:file_chooser + @o:Fonts:fonts + @o:HelpDialog:help + @o:Input Choice:input_choice + @o:Preferences:preferences + @o:Threading:threads + @o:XForms Emulation:forms + +@main:Tutorial\nfrom\nManual:@j + @j:ask\n(modified):ask + @j:button:button + @j:CubeView:CubeView + @j:editor:editor editor.cxx + @j:hello:hello + @j:shape:shape + +@main:Images\nfor\nManual:@i + @i:valuators:valuators + @i:symbols:symbols + @i:buttons:buttons + @i:clock:clock + @i:popups:message + @i:boxtypes:boxtype diff --git a/third_party/windows/fltk-1.1.10/test/desktop/blocks-128.png b/third_party/windows/fltk-1.1.10/test/desktop/blocks-128.png new file mode 100644 index 0000000..41e6d00 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/test/desktop/blocks-128.png differ diff --git a/third_party/windows/fltk-1.1.10/test/desktop/blocks-32.png b/third_party/windows/fltk-1.1.10/test/desktop/blocks-32.png new file mode 100644 index 0000000..073bc0f Binary files /dev/null and b/third_party/windows/fltk-1.1.10/test/desktop/blocks-32.png differ diff --git a/third_party/windows/fltk-1.1.10/test/desktop/blocks.desktop b/third_party/windows/fltk-1.1.10/test/desktop/blocks.desktop new file mode 100644 index 0000000..6dc18a5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/desktop/blocks.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Block Attack! +Comment=Block Attack! Game +TryExec=blocks +Exec=blocks +Icon=blocks +Terminal=false +Type=Application +Categories=Game;BlocksGame; diff --git a/third_party/windows/fltk-1.1.10/test/desktop/checkers-128.png b/third_party/windows/fltk-1.1.10/test/desktop/checkers-128.png new file mode 100644 index 0000000..ed02527 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/test/desktop/checkers-128.png differ diff --git a/third_party/windows/fltk-1.1.10/test/desktop/checkers-32.png b/third_party/windows/fltk-1.1.10/test/desktop/checkers-32.png new file mode 100644 index 0000000..4adcd66 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/test/desktop/checkers-32.png differ diff --git a/third_party/windows/fltk-1.1.10/test/desktop/checkers.desktop b/third_party/windows/fltk-1.1.10/test/desktop/checkers.desktop new file mode 100644 index 0000000..7a10026 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/desktop/checkers.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Checkers +Comment=Checkers Game +TryExec=checkers +Exec=checkers +Icon=checkers +Terminal=false +Type=Application +Categories=Game;BoardGame; diff --git a/third_party/windows/fltk-1.1.10/test/desktop/sudoku-128.png b/third_party/windows/fltk-1.1.10/test/desktop/sudoku-128.png new file mode 100644 index 0000000..070a410 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/test/desktop/sudoku-128.png differ diff --git a/third_party/windows/fltk-1.1.10/test/desktop/sudoku-32.png b/third_party/windows/fltk-1.1.10/test/desktop/sudoku-32.png new file mode 100644 index 0000000..154c273 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/test/desktop/sudoku-32.png differ diff --git a/third_party/windows/fltk-1.1.10/test/desktop/sudoku.desktop b/third_party/windows/fltk-1.1.10/test/desktop/sudoku.desktop new file mode 100644 index 0000000..9bdc456 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/desktop/sudoku.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=Sudoku +Comment=Suduku Number Game +TryExec=sudoku +Exec=sudoku +Icon=sudoku +Terminal=false +Type=Application +Categories=Game;LogicGame; diff --git a/third_party/windows/fltk-1.1.10/test/doublebuffer.cxx b/third_party/windows/fltk-1.1.10/test/doublebuffer.cxx new file mode 100644 index 0000000..7227907 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/doublebuffer.cxx @@ -0,0 +1,128 @@ +// +// "$Id: doublebuffer.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Double-buffering test program for the Fast Light Tool Kit (FLTK). +// +// This demo shows how double buffering helps, by drawing the +// window in a particularily bad way. +// +// The single-buffered window will blink as it updates. The +// double buffered one will not. It will take just as long +// (or longer) to update, but often it will appear to be faster. +// +// This demo should work for both the GL and X versions of Fl, +// even though the double buffering mechanism is totally different. +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// this purposely draws each line 10 times to be slow: +void star(int w, int h, int n) { + fl_push_matrix(); + fl_translate(w/2, h/2); + fl_scale(w/2, h/2); + for (int i = 0; i < n; i++) { + for (int j = i+1; j < n; j++)/* for (int k=0; k<10; k++)*/ { + fl_begin_line(); + fl_vertex(cos(2*M_PI*i/n+.1), sin(2*M_PI*i/n+.1)); + fl_vertex(cos(2*M_PI*j/n+.1), sin(2*M_PI*j/n+.1)); + fl_end_line(); + } + } + fl_pop_matrix(); +} + +int sides[2] = {20,20}; + +void slider_cb(Fl_Widget* o, long v) { + sides[v] = int(((Fl_Slider*)o)->value()); + o->parent()->redraw(); +} + +void bad_draw(int w,int h,int which) { +// for (int i=0; i<10; i++) { +// fl_color(7); fl_rectf(0,0,w,h); fl_color(0); star(w,h); +// fl_color(0); fl_rectf(0,0,w,h); fl_color(7); star(w,h); +// } + fl_color(FL_BLACK); fl_rectf(0,0,w,h); + fl_color(FL_WHITE); star(w,h,sides[which]); + // for (int x=0; x +#include +#include +#include +#include + +#ifdef __MWERKS__ +# define FL_DLL +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +int changed = 0; +char filename[256] = ""; +char title[256]; +Fl_Text_Buffer *textbuf = 0; + + +// Syntax highlighting stuff... +Fl_Text_Buffer *stylebuf = 0; +Fl_Text_Display::Style_Table_Entry + styletable[] = { // Style table + { FL_BLACK, FL_COURIER, 14 }, // A - Plain + { FL_DARK_GREEN, FL_COURIER_ITALIC, 14 }, // B - Line comments + { FL_DARK_GREEN, FL_COURIER_ITALIC, 14 }, // C - Block comments + { FL_BLUE, FL_COURIER, 14 }, // D - Strings + { FL_DARK_RED, FL_COURIER, 14 }, // E - Directives + { FL_DARK_RED, FL_COURIER_BOLD, 14 }, // F - Types + { FL_BLUE, FL_COURIER_BOLD, 14 } // G - Keywords + }; +const char *code_keywords[] = { // List of known C/C++ keywords... + "and", + "and_eq", + "asm", + "bitand", + "bitor", + "break", + "case", + "catch", + "compl", + "continue", + "default", + "delete", + "do", + "else", + "false", + "for", + "goto", + "if", + "new", + "not", + "not_eq", + "operator", + "or", + "or_eq", + "return", + "switch", + "template", + "this", + "throw", + "true", + "try", + "while", + "xor", + "xor_eq" + }; +const char *code_types[] = { // List of known C/C++ types... + "auto", + "bool", + "char", + "class", + "const", + "const_cast", + "double", + "dynamic_cast", + "enum", + "explicit", + "extern", + "float", + "friend", + "inline", + "int", + "long", + "mutable", + "namespace", + "private", + "protected", + "public", + "register", + "short", + "signed", + "sizeof", + "static", + "static_cast", + "struct", + "template", + "typedef", + "typename", + "union", + "unsigned", + "virtual", + "void", + "volatile" + }; + + +// +// 'compare_keywords()' - Compare two keywords... +// + +extern "C" { + int + compare_keywords(const void *a, + const void *b) { + return (strcmp(*((const char **)a), *((const char **)b))); + } +} + +// +// 'style_parse()' - Parse text and produce style data. +// + +void +style_parse(const char *text, + char *style, + int length) { + char current; + int col; + int last; + char buf[255], + *bufptr; + const char *temp; + + // Style letters: + // + // A - Plain + // B - Line comments + // C - Block comments + // D - Strings + // E - Directives + // F - Types + // G - Keywords + + for (current = *style, col = 0, last = 0; length > 0; length --, text ++) { + if (current == 'B' || current == 'F' || current == 'G') current = 'A'; + if (current == 'A') { + // Check for directives, comments, strings, and keywords... + if (col == 0 && *text == '#') { + // Set style to directive + current = 'E'; + } else if (strncmp(text, "//", 2) == 0) { + current = 'B'; + for (; length > 0 && *text != '\n'; length --, text ++) *style++ = 'B'; + + if (length == 0) break; + } else if (strncmp(text, "/*", 2) == 0) { + current = 'C'; + } else if (strncmp(text, "\\\"", 2) == 0) { + // Quoted quote... + *style++ = current; + *style++ = current; + text ++; + length --; + col += 2; + continue; + } else if (*text == '\"') { + current = 'D'; + } else if (!last && (islower(*text) || *text == '_')) { + // Might be a keyword... + for (temp = text, bufptr = buf; + (islower(*temp) || *temp == '_') && bufptr < (buf + sizeof(buf) - 1); + *bufptr++ = *temp++); + + if (!islower(*temp) && *temp != '_') { + *bufptr = '\0'; + + bufptr = buf; + + if (bsearch(&bufptr, code_types, + sizeof(code_types) / sizeof(code_types[0]), + sizeof(code_types[0]), compare_keywords)) { + while (text < temp) { + *style++ = 'F'; + text ++; + length --; + col ++; + } + + text --; + length ++; + last = 1; + continue; + } else if (bsearch(&bufptr, code_keywords, + sizeof(code_keywords) / sizeof(code_keywords[0]), + sizeof(code_keywords[0]), compare_keywords)) { + while (text < temp) { + *style++ = 'G'; + text ++; + length --; + col ++; + } + + text --; + length ++; + last = 1; + continue; + } + } + } + } else if (current == 'C' && strncmp(text, "*/", 2) == 0) { + // Close a C comment... + *style++ = current; + *style++ = current; + text ++; + length --; + current = 'A'; + col += 2; + continue; + } else if (current == 'D') { + // Continuing in string... + if (strncmp(text, "\\\"", 2) == 0) { + // Quoted end quote... + *style++ = current; + *style++ = current; + text ++; + length --; + col += 2; + continue; + } else if (*text == '\"') { + // End quote... + *style++ = current; + col ++; + current = 'A'; + continue; + } + } + + // Copy style info... + if (current == 'A' && (*text == '{' || *text == '}')) *style++ = 'G'; + else *style++ = current; + col ++; + + last = isalnum(*text) || *text == '_' || *text == '.'; + + if (*text == '\n') { + // Reset column and possibly reset the style + col = 0; + if (current == 'B' || current == 'E') current = 'A'; + } + } +} + + +// +// 'style_init()' - Initialize the style buffer... +// + +void +style_init(void) { + char *style = new char[textbuf->length() + 1]; + char *text = textbuf->text(); + + + memset(style, 'A', textbuf->length()); + style[textbuf->length()] = '\0'; + + if (!stylebuf) stylebuf = new Fl_Text_Buffer(textbuf->length()); + + style_parse(text, style, textbuf->length()); + + stylebuf->text(style); + delete[] style; + free(text); +} + + +// +// 'style_unfinished_cb()' - Update unfinished styles. +// + +void +style_unfinished_cb(int, void*) { +} + + +// +// 'style_update()' - Update the style buffer... +// + +void +style_update(int pos, // I - Position of update + int nInserted, // I - Number of inserted chars + int nDeleted, // I - Number of deleted chars + int /*nRestyled*/, // I - Number of restyled chars + const char * /*deletedText*/,// I - Text that was deleted + void *cbArg) { // I - Callback data + int start, // Start of text + end; // End of text + char last, // Last style on line + *style, // Style data + *text; // Text data + + + // If this is just a selection change, just unselect the style buffer... + if (nInserted == 0 && nDeleted == 0) { + stylebuf->unselect(); + return; + } + + // Track changes in the text buffer... + if (nInserted > 0) { + // Insert characters into the style buffer... + style = new char[nInserted + 1]; + memset(style, 'A', nInserted); + style[nInserted] = '\0'; + + stylebuf->replace(pos, pos + nDeleted, style); + delete[] style; + } else { + // Just delete characters in the style buffer... + stylebuf->remove(pos, pos + nDeleted); + } + + // Select the area that was just updated to avoid unnecessary + // callbacks... + stylebuf->select(pos, pos + nInserted - nDeleted); + + // Re-parse the changed region; we do this by parsing from the + // beginning of the previous line of the changed region to the end of + // the line of the changed region... Then we check the last + // style character and keep updating if we have a multi-line + // comment character... + start = textbuf->line_start(pos); +// if (start > 0) start = textbuf->line_start(start - 1); + end = textbuf->line_end(pos + nInserted); + text = textbuf->text_range(start, end); + style = stylebuf->text_range(start, end); + if (start==end) + last = 0; + else + last = style[end - start - 1]; + +// printf("start = %d, end = %d, text = \"%s\", style = \"%s\", last='%c'...\n", +// start, end, text, style, last); + + style_parse(text, style, end - start); + +// printf("new style = \"%s\", new last='%c'...\n", +// style, style[end - start - 1]); + + stylebuf->replace(start, end, style); + ((Fl_Text_Editor *)cbArg)->redisplay_range(start, end); + + if (start==end || last != style[end - start - 1]) { +// printf("Recalculate the rest of the buffer style\n"); + // Either the user deleted some text, or the last character + // on the line changed styles, so reparse the + // remainder of the buffer... + free(text); + free(style); + + end = textbuf->length(); + text = textbuf->text_range(start, end); + style = stylebuf->text_range(start, end); + + style_parse(text, style, end - start); + + stylebuf->replace(start, end, style); + ((Fl_Text_Editor *)cbArg)->redisplay_range(start, end); + } + + free(text); + free(style); +} + + +// Editor window functions and class... +void save_cb(); +void saveas_cb(); +void find2_cb(Fl_Widget*, void*); +void replall_cb(Fl_Widget*, void*); +void replace2_cb(Fl_Widget*, void*); +void replcan_cb(Fl_Widget*, void*); + +class EditorWindow : public Fl_Double_Window { + public: + EditorWindow(int w, int h, const char* t); + ~EditorWindow(); + + Fl_Window *replace_dlg; + Fl_Input *replace_find; + Fl_Input *replace_with; + Fl_Button *replace_all; + Fl_Return_Button *replace_next; + Fl_Button *replace_cancel; + + Fl_Text_Editor *editor; + char search[256]; +}; + +EditorWindow::EditorWindow(int w, int h, const char* t) : Fl_Double_Window(w, h, t) { + replace_dlg = new Fl_Window(300, 105, "Replace"); + replace_find = new Fl_Input(80, 10, 210, 25, "Find:"); + replace_find->align(FL_ALIGN_LEFT); + + replace_with = new Fl_Input(80, 40, 210, 25, "Replace:"); + replace_with->align(FL_ALIGN_LEFT); + + replace_all = new Fl_Button(10, 70, 90, 25, "Replace All"); + replace_all->callback((Fl_Callback *)replall_cb, this); + + replace_next = new Fl_Return_Button(105, 70, 120, 25, "Replace Next"); + replace_next->callback((Fl_Callback *)replace2_cb, this); + + replace_cancel = new Fl_Button(230, 70, 60, 25, "Cancel"); + replace_cancel->callback((Fl_Callback *)replcan_cb, this); + replace_dlg->end(); + replace_dlg->set_non_modal(); + editor = 0; + *search = (char)0; +} + +EditorWindow::~EditorWindow() { + delete replace_dlg; +} + +int check_save(void) { + if (!changed) return 1; + + int r = fl_choice("The current file has not been saved.\n" + "Would you like to save it now?", + "Cancel", "Save", "Don't Save"); + + if (r == 1) { + save_cb(); // Save the file... + return !changed; + } + + return (r == 2) ? 1 : 0; +} + +int loading = 0; +void load_file(char *newfile, int ipos) { + loading = 1; + int insert = (ipos != -1); + changed = insert; + if (!insert) strcpy(filename, ""); + int r; + if (!insert) r = textbuf->loadfile(newfile); + else r = textbuf->insertfile(newfile, ipos); + if (r) + fl_alert("Error reading from file \'%s\':\n%s.", newfile, strerror(errno)); + else + if (!insert) strcpy(filename, newfile); + loading = 0; + textbuf->call_modify_callbacks(); +} + +void save_file(char *newfile) { + if (textbuf->savefile(newfile)) + fl_alert("Error writing to file \'%s\':\n%s.", newfile, strerror(errno)); + else + strcpy(filename, newfile); + changed = 0; + textbuf->call_modify_callbacks(); +} + +void copy_cb(Fl_Widget*, void* v) { + EditorWindow* e = (EditorWindow*)v; + Fl_Text_Editor::kf_copy(0, e->editor); +} + +void cut_cb(Fl_Widget*, void* v) { + EditorWindow* e = (EditorWindow*)v; + Fl_Text_Editor::kf_cut(0, e->editor); +} + +void delete_cb(Fl_Widget*, void*) { + textbuf->remove_selection(); +} + +void find_cb(Fl_Widget* w, void* v) { + EditorWindow* e = (EditorWindow*)v; + const char *val; + + val = fl_input("Search String:", e->search); + if (val != NULL) { + // User entered a string - go find it! + strcpy(e->search, val); + find2_cb(w, v); + } +} + +void find2_cb(Fl_Widget* w, void* v) { + EditorWindow* e = (EditorWindow*)v; + if (e->search[0] == '\0') { + // Search string is blank; get a new one... + find_cb(w, v); + return; + } + + int pos = e->editor->insert_position(); + int found = textbuf->search_forward(pos, e->search, &pos); + if (found) { + // Found a match; select and update the position... + textbuf->select(pos, pos+strlen(e->search)); + e->editor->insert_position(pos+strlen(e->search)); + e->editor->show_insert_position(); + } + else fl_alert("No occurrences of \'%s\' found!", e->search); +} + +void set_title(Fl_Window* w) { + if (filename[0] == '\0') strcpy(title, "Untitled"); + else { + char *slash; + slash = strrchr(filename, '/'); +#ifdef WIN32 + if (slash == NULL) slash = strrchr(filename, '\\'); +#endif + if (slash != NULL) strcpy(title, slash + 1); + else strcpy(title, filename); + } + + if (changed) strcat(title, " (modified)"); + + w->label(title); +} + +void changed_cb(int, int nInserted, int nDeleted,int, const char*, void* v) { + if ((nInserted || nDeleted) && !loading) changed = 1; + EditorWindow *w = (EditorWindow *)v; + set_title(w); + if (loading) w->editor->show_insert_position(); +} + +void new_cb(Fl_Widget*, void*) { + if (!check_save()) return; + + filename[0] = '\0'; + textbuf->select(0, textbuf->length()); + textbuf->remove_selection(); + changed = 0; + textbuf->call_modify_callbacks(); +} + +void open_cb(Fl_Widget*, void*) { + if (!check_save()) return; + + char *newfile = fl_file_chooser("Open File?", "*", filename); + if (newfile != NULL) load_file(newfile, -1); +} + +void insert_cb(Fl_Widget*, void *v) { + char *newfile = fl_file_chooser("Insert File?", "*", filename); + EditorWindow *w = (EditorWindow *)v; + if (newfile != NULL) load_file(newfile, w->editor->insert_position()); +} + +void paste_cb(Fl_Widget*, void* v) { + EditorWindow* e = (EditorWindow*)v; + Fl_Text_Editor::kf_paste(0, e->editor); +} + +int num_windows = 0; + +void close_cb(Fl_Widget*, void* v) { + Fl_Window* w = (Fl_Window*)v; + if (num_windows == 1 && !check_save()) { + return; + } + + w->hide(); + textbuf->remove_modify_callback(changed_cb, w); + Fl::delete_widget(w); + num_windows--; + if (!num_windows) exit(0); +} + +void quit_cb(Fl_Widget*, void*) { + if (changed && !check_save()) + return; + + exit(0); +} + +void replace_cb(Fl_Widget*, void* v) { + EditorWindow* e = (EditorWindow*)v; + e->replace_dlg->show(); +} + +void replace2_cb(Fl_Widget*, void* v) { + EditorWindow* e = (EditorWindow*)v; + const char *find = e->replace_find->value(); + const char *replace = e->replace_with->value(); + + if (find[0] == '\0') { + // Search string is blank; get a new one... + e->replace_dlg->show(); + return; + } + + e->replace_dlg->hide(); + + int pos = e->editor->insert_position(); + int found = textbuf->search_forward(pos, find, &pos); + + if (found) { + // Found a match; update the position and replace text... + textbuf->select(pos, pos+strlen(find)); + textbuf->remove_selection(); + textbuf->insert(pos, replace); + textbuf->select(pos, pos+strlen(replace)); + e->editor->insert_position(pos+strlen(replace)); + e->editor->show_insert_position(); + } + else fl_alert("No occurrences of \'%s\' found!", find); +} + +void replall_cb(Fl_Widget*, void* v) { + EditorWindow* e = (EditorWindow*)v; + const char *find = e->replace_find->value(); + const char *replace = e->replace_with->value(); + + find = e->replace_find->value(); + if (find[0] == '\0') { + // Search string is blank; get a new one... + e->replace_dlg->show(); + return; + } + + e->replace_dlg->hide(); + + e->editor->insert_position(0); + int times = 0; + + // Loop through the whole string + for (int found = 1; found;) { + int pos = e->editor->insert_position(); + found = textbuf->search_forward(pos, find, &pos); + + if (found) { + // Found a match; update the position and replace text... + textbuf->select(pos, pos+strlen(find)); + textbuf->remove_selection(); + textbuf->insert(pos, replace); + e->editor->insert_position(pos+strlen(replace)); + e->editor->show_insert_position(); + times++; + } + } + + if (times) fl_message("Replaced %d occurrences.", times); + else fl_alert("No occurrences of \'%s\' found!", find); +} + +void replcan_cb(Fl_Widget*, void* v) { + EditorWindow* e = (EditorWindow*)v; + e->replace_dlg->hide(); +} + +void save_cb() { + if (filename[0] == '\0') { + // No filename - get one! + saveas_cb(); + return; + } + else save_file(filename); +} + +void saveas_cb() { + char *newfile; + + newfile = fl_file_chooser("Save File As?", "*", filename); + if (newfile != NULL) save_file(newfile); +} + +Fl_Window* new_view(); + +void view_cb(Fl_Widget*, void*) { + Fl_Window* w = new_view(); + w->show(); +} + +Fl_Menu_Item menuitems[] = { + { "&File", 0, 0, 0, FL_SUBMENU }, + { "&New File", 0, (Fl_Callback *)new_cb }, + { "&Open File...", FL_CTRL + 'o', (Fl_Callback *)open_cb }, + { "&Insert File...", FL_CTRL + 'i', (Fl_Callback *)insert_cb, 0, FL_MENU_DIVIDER }, + { "&Save File", FL_CTRL + 's', (Fl_Callback *)save_cb }, + { "Save File &As...", FL_CTRL + FL_SHIFT + 's', (Fl_Callback *)saveas_cb, 0, FL_MENU_DIVIDER }, + { "New &View", FL_ALT + 'v', (Fl_Callback *)view_cb, 0 }, + { "&Close View", FL_CTRL + 'w', (Fl_Callback *)close_cb, 0, FL_MENU_DIVIDER }, + { "E&xit", FL_CTRL + 'q', (Fl_Callback *)quit_cb, 0 }, + { 0 }, + + { "&Edit", 0, 0, 0, FL_SUBMENU }, + { "Cu&t", FL_CTRL + 'x', (Fl_Callback *)cut_cb }, + { "&Copy", FL_CTRL + 'c', (Fl_Callback *)copy_cb }, + { "&Paste", FL_CTRL + 'v', (Fl_Callback *)paste_cb }, + { "&Delete", 0, (Fl_Callback *)delete_cb }, + { 0 }, + + { "&Search", 0, 0, 0, FL_SUBMENU }, + { "&Find...", FL_CTRL + 'f', (Fl_Callback *)find_cb }, + { "F&ind Again", FL_CTRL + 'g', find2_cb }, + { "&Replace...", FL_CTRL + 'r', replace_cb }, + { "Re&place Again", FL_CTRL + 't', replace2_cb }, + { 0 }, + + { 0 } +}; + +Fl_Window* new_view() { + EditorWindow* w = new EditorWindow(660, 400, title); + w->begin(); + Fl_Menu_Bar* m = new Fl_Menu_Bar(0, 0, 660, 30); + m->copy(menuitems, w); + w->editor = new Fl_Text_Editor(0, 30, 660, 370); + w->editor->buffer(textbuf); + w->editor->highlight_data(stylebuf, styletable, + sizeof(styletable) / sizeof(styletable[0]), + 'A', style_unfinished_cb, 0); + w->editor->textfont(FL_COURIER); + w->end(); + w->resizable(w->editor); + w->callback((Fl_Callback *)close_cb, w); + + textbuf->add_modify_callback(style_update, w->editor); + textbuf->add_modify_callback(changed_cb, w); + textbuf->call_modify_callbacks(); + num_windows++; + return w; +} + +int main(int argc, char **argv) { + textbuf = new Fl_Text_Buffer; + style_init(); + + Fl_Window* window = new_view(); + + window->show(1, argv); + + if (argc > 1) load_file(argv[1], -1); + + return Fl::run(); +} + +// +// End of "$Id: editor.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/fast_slow.fl b/third_party/windows/fltk-1.1.10/test/fast_slow.fl new file mode 100644 index 0000000..ae4b8d8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/fast_slow.fl @@ -0,0 +1,40 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.00 +header_name {.h} +code_name {.cxx} +gridx 10 +gridy 10 +snap 3 +Function {} {open +} { + Fl_Window {} {open + xywh {143 188 318 443} resizable visible + } { + Fl_Slider control { + label {move +this} + callback {fast->value(o->value()); +if (!Fl::pushed()) slow->value(o->value());} + xywh {90 200 30 200} + code0 {o->when(FL_WHEN_CHANGED|FL_WHEN_RELEASE|FL_WHEN_NOT_CHANGED);} + } + Fl_Slider fast { + label {fast +redraw} selected + xywh {140 200 30 200} + code0 {o->set_output();} + } + Fl_Slider slow { + label {slow +redraw} selected + xywh {190 200 30 200} + code0 {o->set_output();} + } + Fl_Box {} { + label {The left slider has changed( FL_WHEN_CHANGED | FL_WHEN_RELEASE | FL_WHEN_NOT_CHANGED) so it produces a callback on both drag and release mouse events. +The middle slider (representing a widget with low overhead) is changed on every mouse movement. +The right slider (representing a widget with high overhead) is only updated when the mouse is released, by checking if Fl::pushed() is zero.} + xywh {10 10 300 180} box DOWN_BOX color 53 selection_color 47 labelfont 4 labelsize 12 align 148 + } + } +} diff --git a/third_party/windows/fltk-1.1.10/test/file_chooser.cxx b/third_party/windows/fltk-1.1.10/test/file_chooser.cxx new file mode 100644 index 0000000..842060e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/file_chooser.cxx @@ -0,0 +1,345 @@ +// +// "$Id: file_chooser.cxx 6092 2008-04-11 12:57:37Z matt $" +// +// File chooser test program. +// +// Copyright 1999-2005 by Michael Sweet. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// main() - Create a file chooser and wait for a selection to +// be made. +// close_callback() - Close the main window... +// fc_callback() - Handle choices in the file chooser... +// pdf_check() - Check for and load the first page of a PDF file. +// ps_check() - Check for and load the first page of a PostScript +// file. +// show_callback() - Show the file chooser... +// + +// +// Include necessary headers... +// + +#include +#include +#include +#include +#include +#include +#include + + +// +// Globals... +// + +Fl_Input *filter; +Fl_File_Browser *files; +Fl_File_Chooser *fc; +Fl_Shared_Image *image = 0; + + +// +// Functions... +// + +void close_callback(void); +void create_callback(void); +void dir_callback(void); +void fc_callback(Fl_File_Chooser *, void *); +void multi_callback(void); +Fl_Image *pdf_check(const char *, uchar *, int); +Fl_Image *ps_check(const char *, uchar *, int); +void show_callback(void); + + +// +// 'main()' - Create a file chooser and wait for a selection to be made. +// + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + Fl_Window *window;// Main window + Fl_Button *button;// Buttons + Fl_File_Icon *icon; // New file icon + + + // Make the file chooser... + Fl::scheme(NULL); + Fl_File_Icon::load_system_icons(); + + fc = new Fl_File_Chooser(".", "*", Fl_File_Chooser::SINGLE, "Fl_File_Chooser Test"); + fc->callback(fc_callback); + + // Register the PS and PDF image types... + Fl_Shared_Image::add_handler(pdf_check); + Fl_Shared_Image::add_handler(ps_check); + + // Make the main window... + window = new Fl_Window(400, 200, "File Chooser Test"); + + filter = new Fl_Input(50, 10, 315, 25, "Filter:"); + if (argc > 1) + filter->value(argv[1]); + else + filter->value("PDF Files (*.pdf)\t" + "PostScript Files (*.ps)\t" + "Image Files (*.{bmp,gif,jpg,png})\t" + "C/C++ Source Files (*.{c,C,cc,cpp,cxx})"); + + button = new Fl_Button(365, 10, 25, 25); + button->labelcolor(FL_YELLOW); + button->callback((Fl_Callback *)show_callback); + + icon = Fl_File_Icon::find(".", Fl_File_Icon::DIRECTORY); + icon->label(button); + + button = new Fl_Light_Button(50, 45, 80, 25, "MULTI"); + button->callback((Fl_Callback *)multi_callback); + + button = new Fl_Light_Button(140, 45, 90, 25, "CREATE"); + button->callback((Fl_Callback *)create_callback); + + button = new Fl_Light_Button(240, 45, 115, 25, "DIRECTORY"); + button->callback((Fl_Callback *)dir_callback); + + files = new Fl_File_Browser(50, 80, 340, 75, "Files:"); + files->align(FL_ALIGN_LEFT); + + button = new Fl_Button(340, 165, 50, 25, "Close"); + button->callback((Fl_Callback *)close_callback); + + window->resizable(files); + window->end(); + window->show(1, argv); + + Fl::run(); + + return (0); +} + + +// +// 'close_callback()' - Close the main window... +// + +void +close_callback(void) +{ + exit(0); +} + + +// +// 'create_callback()' - Handle clicks on the create button. +// + +void +create_callback(void) +{ + fc->type(fc->type() ^ Fl_File_Chooser::CREATE); +} + + +// +// 'dir_callback()' - Handle clicks on the directory button. +// + +void +dir_callback(void) +{ + fc->type(fc->type() ^ Fl_File_Chooser::DIRECTORY); +} + + +// +// 'fc_callback()' - Handle choices in the file chooser... +// + +void +fc_callback(Fl_File_Chooser *fc, // I - File chooser + void *data) // I - Data +{ + const char *filename; // Current filename + + + printf("fc_callback(fc = %p, data = %p)\n", fc, data); + + filename = fc->value(); + + printf(" filename = \"%s\"\n", filename ? filename : "(null)"); +} + + +// +// 'multi_callback()' - Handle clicks on the multi button. +// + +void +multi_callback(void) +{ + fc->type(fc->type() ^ Fl_File_Chooser::MULTI); +} + + +// +// 'pdf_check()' - Check for and load the first page of a PDF file. +// + +Fl_Image * // O - Page image or NULL +pdf_check(const char *name, // I - Name of file + uchar *header, // I - Header data + int) // I - Length of header data (unused) +{ + const char *home; // Home directory + char preview[1024], // Preview filename + command[1024]; // Command + + + if (memcmp(header, "%PDF", 4) != 0) + return 0; + + home = getenv("HOME"); + sprintf(preview, "%s/.preview.ppm", home ? home : ""); + + sprintf(command, + "gs -r100 -dFIXED -sDEVICE=ppmraw -dQUIET -dNOPAUSE -dBATCH " + "-sstdout=\"%%stderr\" -sOUTPUTFILE=\'%s\' " + "-dFirstPage=1 -dLastPage=1 \'%s\' 2>/dev/null", preview, name); + + if (system(command)) return 0; + + return new Fl_PNM_Image(preview); +} + + +// +// 'ps_check()' - Check for and load the first page of a PostScript file. +// + +Fl_Image * // O - Page image or NULL +ps_check(const char *name, // I - Name of file + uchar *header, // I - Header data + int) // I - Length of header data (unused) +{ + const char *home; // Home directory + char preview[1024], // Preview filename + outname[1024], // Preview PS file + command[1024]; // Command + FILE *in, // Input file + *out; // Output file + int page; // Current page + char line[256]; // Line from file + + + if (memcmp(header, "%!", 2) != 0) + return 0; + + home = getenv("HOME"); + sprintf(preview, "%s/.preview.ppm", home ? home : ""); + + if (memcmp(header, "%!PS", 4) == 0) { + // PS file has DSC comments; extract the first page... + sprintf(outname, "%s/.preview.ps", home ? home : ""); + + if (strcmp(name, outname) != 0) { + in = fopen(name, "rb"); + out = fopen(outname, "wb"); + page = 0; + + while (fgets(line, sizeof(line), in) != NULL) { + if (strncmp(line, "%%Page:", 7) == 0) { + page ++; + if (page > 1) break; + } + + fputs(line, out); + } + + fclose(in); + fclose(out); + } + } else { + // PS file doesn't have DSC comments; do the whole file... + strncpy(outname, name, sizeof(outname) - 1); + outname[sizeof(outname) - 1] = '\0'; + } + + sprintf(command, + "gs -r100 -dFIXED -sDEVICE=ppmraw -dQUIET -dNOPAUSE -dBATCH " + "-sstdout=\"%%stderr\" -sOUTPUTFILE=\'%s\' \'%s\' 2>/dev/null", + preview, outname); + + if (system(command)) return 0; + + return new Fl_PNM_Image(preview); +} + + +// +// 'show_callback()' - Show the file chooser... +// + +void +show_callback(void) +{ + int i; // Looping var + int count; // Number of files selected + char relative[1024]; // Relative filename + + + if (filter->value()[0]) + fc->filter(filter->value()); + + fc->show(); + + while (fc->visible()) { + Fl::wait(); + } + + count = fc->count(); + if (count > 0) + { + files->clear(); + + for (i = 1; i <= count; i ++) + { + if (!fc->value(i)) + break; + + fl_filename_relative(relative, sizeof(relative), fc->value(i)); + + files->add(relative, + Fl_File_Icon::find(fc->value(i), Fl_File_Icon::PLAIN)); + } + + files->redraw(); + } +} + + +// +// End of "$Id: file_chooser.cxx 6092 2008-04-11 12:57:37Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/test/fl_jpeg_image.cxx b/third_party/windows/fltk-1.1.10/test/fl_jpeg_image.cxx new file mode 100644 index 0000000..462494d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/fl_jpeg_image.cxx @@ -0,0 +1,203 @@ +// +// "$Id: fl_jpeg_image.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// fl_draw_image test program for the Fast Light Tool Kit (FLTK). +// +// Be sure to try every visual with the -v switch and try -m (monochrome) +// on each of them. +// +// This program requires either the libjpeg.a library or an internal DD +// library to read images (this is chosen by the presence of the "DD" +// #define). +// +// To get the jpeg library: +// +// The "official" archive site for this software is ftp.uu.net (Internet +// address 192.48.96.9). The most recent released version can always be +// found there in directory graphics/jpeg. This particular version will +// be archived as graphics/jpeg/jpegsrc.v6a.tar.gz. +// +// The makefile assummes you decompressed and build these in a directory +// called "jpeg-6a" in the same location as the "FL" directory. +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include + +void readtheimage(const char *name); // below +int width; +int height; +int depth; +int linedelta; +uchar *ibuffer; + +//////////////////////////////////////////////////////////////// + +#include +int mono; + +class image_window : public Fl_Window { + void draw(); +public: + image_window(int w,int h) : Fl_Window(w,h) {box(FL_NO_BOX);} +}; + +void image_window::draw() { + if (mono) + fl_draw_image_mono(ibuffer+1,0,0,width,height,depth,linedelta); + else + fl_draw_image(ibuffer,0,0,width,height,depth,linedelta); +} + +//////////////////////////////////////////////////////////////// + +#include +#include "list_visuals.cxx" + +//////////////////////////////////////////////////////////////// + +int visid = -1; +int arg(int argc, char **argv, int &i) { + if (argv[i][1] == 'm') {mono = 1; i++; return 1;} + + if (argv[i][1] == 'v') { + if (i+1 >= argc) return 0; + visid = atoi(argv[i+1]); + i += 2; + return 2; + } + + return 0; +} + +int main(int argc, char ** argv) { + + int i = 1; + if (!Fl::args(argc,argv,i,arg) || i != argc-1) { + fprintf(stderr,"usage: %s image_file\n" +" -v # : use visual\n" +" -m : monochrome\n" +"%s\n", + argv[0],Fl::help); + exit(1); + } + + readtheimage(argv[i]); + image_window *window = new image_window(width,height); + + if (visid>=0) { + fl_open_display(); + XVisualInfo templt; int num; + templt.visualid = visid; + fl_visual = XGetVisualInfo(fl_display, VisualIDMask, &templt, &num); + if (!fl_visual) { + fprintf(stderr, "No visual with id %d, use one of:\n",visid); + list_visuals(); + exit(1); + } + fl_colormap = XCreateColormap(fl_display, RootWindow(fl_display,fl_screen), + fl_visual->visual, AllocNone); + fl_xpixel(0); // make sure black is allocated + } + + window->show(argc,argv); + return Fl::run(); +} + +//////////////////////////////////////////////////////////////// +#ifndef DD_LIBRARY +// Read using jpeg library: + +extern "C" { +#include "jpeglib.h" +} + +void readtheimage(const char *name) { + struct jpeg_decompress_struct cinfo; + struct jpeg_error_mgr jerr; + FILE * infile = fopen(name, "rb"); + if (!infile) { + fprintf(stderr, "can't open %s\n", name); + exit(1); + } + cinfo.err = jpeg_std_error(&jerr); + jpeg_create_decompress(&cinfo); + jpeg_stdio_src(&cinfo, infile); + jpeg_read_header(&cinfo, TRUE); + jpeg_start_decompress(&cinfo); + width = cinfo.output_width; + height = cinfo.output_height; + depth = cinfo.output_components; + ibuffer = new uchar[width*height*depth]; + uchar *rp = ibuffer; + for (int i=0; i= ibuffer; p-=4) { + uchar r = p[3]; + uchar g = p[2]; + uchar b = p[1]; + uchar a = p[0]; + p[0] = r; + p[1] = g; + p[2] = b; + p[3] = a; + } + // make it bottom-to-top: + ibuffer = ibuffer + width*(height-1)*depth; + linedelta = -(width*depth); +} +#endif + +// +// End of "$Id: fl_jpeg_image.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/fonts.cxx b/third_party/windows/fltk-1.1.10/test/fonts.cxx new file mode 100644 index 0000000..35ac715 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/fonts.cxx @@ -0,0 +1,183 @@ +// +// "$Id: fonts.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Font demo program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include + +Fl_Window *form; + +class FontDisplay : public Fl_Widget { + void draw(); +public: + int font, size; + FontDisplay(Fl_Boxtype B, int X, int Y, int W, int H, const char* L = 0) : + Fl_Widget(X,Y,W,H,L) {box(B); font = 0; size = 14;} +}; +void FontDisplay::draw() { + draw_box(); + fl_font((Fl_Font)font, size); + fl_color(FL_BLACK); + fl_draw(label(), x()+3, y()+3, w()-6, h()-6, align()); +} + +FontDisplay *textobj; + +Fl_Hold_Browser *fontobj, *sizeobj; + +int **sizes; +int *numsizes; +int pickedsize = 14; + +void font_cb(Fl_Widget *, long) { + int fn = fontobj->value(); + if (!fn) return; + fn--; + textobj->font = fn; + sizeobj->clear(); + int n = numsizes[fn]; + int *s = sizes[fn]; + if (!n) { + // no sizes + } else if (s[0] == 0) { + // many sizes; + int j = 1; + for (int i = 1; i<64 || iadd(buf); + } + sizeobj->value(pickedsize); + } else { + // some sizes + int w = 0; + for (int i = 0; i < n; i++) { + if (s[i]<=pickedsize) w = i; + char buf[20]; + sprintf(buf,"@b%d",s[i]); + sizeobj->add(buf); + } + sizeobj->value(w+1); + } + textobj->redraw(); +} + +void size_cb(Fl_Widget *, long) { + int i = sizeobj->value(); + if (!i) return; + const char *c = sizeobj->text(i); + while (*c < '0' || *c > '9') c++; + pickedsize = atoi(c); + textobj->size = pickedsize; + textobj->redraw(); +} + +char label[400]; + +void create_the_forms() { + form = new Fl_Window(550,370); + + strcpy(label, "Hello, world!\n"); + int i = strlen(label); + uchar c; + for (c = ' '+1; c < 127; c++) { + if (!(c&0x1f)) label[i++]='\n'; + if (c=='@') label[i++]=c; + label[i++]=c; + } + label[i++] = '\n'; + for (c = 0xA1; c; c++) {if (!(c&0x1f)) label[i++]='\n'; label[i++]=c;} + label[i] = 0; + + textobj = new FontDisplay(FL_FRAME_BOX,10,10,530,170,label); + textobj->align(FL_ALIGN_TOP|FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_CLIP); + textobj->color(9,47); + fontobj = new Fl_Hold_Browser(10, 190, 390, 170); + fontobj->box(FL_FRAME_BOX); + fontobj->color(53,3); + fontobj->callback(font_cb); + form->resizable(fontobj); + sizeobj = new Fl_Hold_Browser(410, 190, 130, 170); + sizeobj->box(FL_FRAME_BOX); + sizeobj->color(53,3); + sizeobj->callback(size_cb); + form->end(); +} + +#include + +int main(int argc, char **argv) { + Fl::scheme(NULL); + Fl::args(argc, argv); + Fl::get_system_colors(); + create_the_forms(); +#ifdef __APPLE__ + int i = 0; +#else + int i = fl_choice("Which fonts:","-*","iso8859","All"); +#endif + int k = Fl::set_fonts(i ? (i>1 ? "*" : 0) : "-*"); + sizes = new int*[k]; + numsizes = new int[k]; + for (i = 0; i < k; i++) { + int t; const char *name = Fl::get_font_name((Fl_Font)i,&t); + char buffer[128]; +#if 1 + if (t) { + char *p = buffer; + if (t & FL_BOLD) {*p++ = '@'; *p++ = 'b';} + if (t & FL_ITALIC) {*p++ = '@'; *p++ = 'i';} + strcpy(p,name); + name = buffer; + } +#else // this is neat, but really slow on some X servers: + sprintf(buffer, "@F%d@.%s", i, name); + name = buffer; +#endif + fontobj->add(name); + int *s; int n = Fl::get_font_sizes((Fl_Font)i, s); + numsizes[i] = n; + if (n) { + sizes[i] = new int[n]; + for (int j=0; jvalue(1); + font_cb(fontobj,0); + form->show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: fonts.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/forms.cxx b/third_party/windows/fltk-1.1.10/test/forms.cxx new file mode 100644 index 0000000..24c95e7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/forms.cxx @@ -0,0 +1,237 @@ +// +// "$Id: forms.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Another forms demo for the Fast Light Tool Kit (FLTK). +// +// This is an XForms program with very few changes. +// Search for "fltk" to find all changes necessary to port to fltk. +// +// This demo show the different boxtypes. Note that some +// boxtypes are not appropriate for some objects +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include // changed for fltk + +static int border = 1; // changed from FL_TRANSIENT for fltk +// (this is so the close box and Esc work to close the window) + +typedef struct { int val; const char *name; } VN_struct; +#define VN(a) {a,#a} + +// static VN_struct gmode[] = +// { +// VN(StaticGray), VN(GrayScale), VN(StaticColor), +// VN(PseudoColor), VN(TrueColor), VN(DirectColor), +// }; + +static VN_struct btypes[]= +{ + {FL_NO_BOX,"no box"}, + {FL_UP_BOX, "up box"}, + {FL_DOWN_BOX,"down box"}, + {FL_BORDER_BOX,"border box"}, + {FL_SHADOW_BOX,"shadow box"}, + {FL_FLAT_BOX,"flat box"}, + {FL_FRAME_BOX,"frame box"}, + {FL_EMBOSSED_BOX,"embossed box"}, + {FL_ROUNDED_BOX,"rounded box"}, + {FL_RFLAT_BOX,"rflat box"}, + {FL_RSHADOW_BOX,"rshadow box"}, // renamed for fltk + {FL_OVAL_BOX,"oval box"}, + {FL_ROUNDED3D_UPBOX,"rounded3d upbox"}, + {FL_ROUNDED3D_DOWNBOX,"rounded3d downbox"}, + {FL_OVAL3D_UPBOX,"oval3d upbox"}, + {FL_OVAL3D_DOWNBOX,"oval3d downbox"}, + {FL_PLASTIC_UP_BOX,"plastic upbox"}, + {FL_PLASTIC_DOWN_BOX,"plastic downbox"}, + /* sentinel */ + {-1} +}; + +#include "pixmaps/srs.xbm" + +/*************** Callback **********************/ + +FL_FORM *form; +Fl_Widget *tobj[18], *exitob, *btypeob, *modeob; + +void +boxtype_cb (Fl_Widget * ob, long) +{ + int i, req_bt = fl_get_choice(ob) - 1; + static int lastbt = -1; + + if(lastbt != req_bt) + { + fl_freeze_form (form); + fl_redraw_form (form); + for (i = 0; i < 18; i++) + fl_set_object_boxtype (tobj[i], (Fl_Boxtype)btypes[req_bt].val); + fl_unfreeze_form (form); + lastbt = req_bt; + fl_redraw_form(form); // added for fltk + } +} + +void +mode_cb (Fl_Widget *, long) +{ +// static int lval = -1; +// int val = fl_get_choice (ob) -1; +// int db = 0; + +// if (val == lval || val < 0) +// return; + +// fl_hide_form (form); +// if (!fl_mode_capable (gmode[val].val, 0)) +// { +// fl_set_choice(ob, lval); +// val = lval; +// } + +// fl_set_graphics_mode (gmode[val].val, db); +// fl_show_form (form, FL_PLACE_GEOMETRY, border, "Box types"); + +// lval = val; +} + +/*************** Creation Routines *********************/ + +void +create_form_form (void) +{ + Fl_Widget *obj; + + form = fl_bgn_form(FL_NO_BOX, 720, 520); + obj = fl_add_box(FL_UP_BOX, 0, 0, 720, 520, ""); + fl_set_object_color(obj, FL_BLUE, FL_COL1); + obj = fl_add_box(FL_DOWN_BOX, 10, 90, 700, 420, ""); + fl_set_object_color(obj, FL_COL1, FL_COL1); + obj = fl_add_box(FL_DOWN_BOX, 10, 10, 700, 70, ""); + fl_set_object_color(obj, FL_SLATEBLUE, FL_COL1); + tobj[0] = obj = fl_add_box(FL_UP_BOX, 30, 110, 110, 110, "Box"); + tobj[1] = obj = fl_add_text(FL_NORMAL_TEXT, 30, 240, 110, 30, "Text"); + tobj[2] = obj = fl_add_bitmap(FL_NORMAL_BITMAP, 40, 280, 90, 80, "Bitmap"); + fl_set_object_lcol(obj, FL_BLUE); + tobj[3] = obj = fl_add_chart(FL_BAR_CHART, 160, 110, 160, 110, "Chart"); + tobj[4] = obj = fl_add_clock(FL_ANALOG_CLOCK, 40, 390, 90, 90, "Clock"); +//fl_set_object_dblbuffer(tobj[4],1); // removed for fltk + tobj[5]=obj=fl_add_button(FL_NORMAL_BUTTON, 340, 110, 120, 30, "Button"); + tobj[6]=obj=fl_add_lightbutton(FL_PUSH_BUTTON,340,150,120,30,"Lightbutton"); + tobj[7]=obj=fl_add_roundbutton(FL_PUSH_BUTTON,340,190,120,30,"Roundbutton"); + tobj[8]=obj=fl_add_slider(FL_VERT_SLIDER, 160, 250, 40, 230, "Slider"); + tobj[9]=obj=fl_add_valslider(FL_VERT_SLIDER, 220, 250, 40, 230, "Valslider"); + tobj[10]=obj=fl_add_dial (FL_LINE_DIAL, 280, 250, 100, 100, "Dial"); + tobj[11]=obj=fl_add_positioner(FL_NORMAL_POSITIONER,280,380,150,100, "Positioner"); + tobj[12]=obj=fl_add_counter (FL_NORMAL_COUNTER,480,110,210,30, "Counter"); + tobj[13]=obj=fl_add_input (FL_NORMAL_INPUT, 520,170,170,30, "Input"); + tobj[14]=obj=fl_add_menu (FL_PUSH_MENU, 400, 240, 100, 30, "Menu"); + tobj[15]=obj=fl_add_choice (FL_NORMAL_CHOICE, 580, 250, 110, 30, "Choice"); + tobj[16]=obj=fl_add_timer (FL_VALUE_TIMER, 580, 210, 110, 30, "Timer"); +//fl_set_object_dblbuffer(tobj[16], 1); // removed for fltk + tobj[17]=obj=fl_add_browser (FL_NORMAL_BROWSER,450,300,240, 180, "Browser"); + exitob=obj= fl_add_button (FL_NORMAL_BUTTON, 590, 30, 100, 30, "Exit"); + btypeob=obj= fl_add_choice (FL_NORMAL_CHOICE,110,30, 130, 30, "Boxtype"); + fl_set_object_callback (obj, boxtype_cb, 0); + modeob = obj=fl_add_choice(FL_NORMAL_CHOICE,370,30,130,30,"Graphics mode"); + fl_set_object_callback (obj, mode_cb, 0); + fl_end_form (); +} +/*---------------------------------------*/ + +void +create_the_forms (void) +{ + create_form_form (); +} + +/*************** Main Routine ***********************/ + +const char *browserlines[] = { + " ", "@C1@c@l@bObjects Demo", " ", + "This demo shows you all", "objects that currently", + "exist in the Forms Library.", " ", + "You can change the boxtype", "of the different objects", + "using the buttons at the", "top of the form. Note that", + "some combinations might not", "look too good. Also realize", + "that for all object classes", "many different types are", + "available with different", "behaviour.", " ", + "With this demo you can also", "see the effect of the drawing", + "mode on the appearance of the","objects.", + 0 +}; + + +int +main (int argc, char *argv[]) +{ + FL_COLOR c = FL_BLACK; + const char **p; + VN_struct *vn; + + fl_initialize(&argc, argv, "FormDemo", 0, 0); + create_the_forms (); + fl_set_bitmap_data (tobj[2], sorceress_width, sorceress_height, sorceress_bits); + fl_add_chart_value (tobj[3], 15, "item 1", c++); + fl_add_chart_value (tobj[3], 5, "item 2", c++); + fl_add_chart_value (tobj[3], -10, "item 3", c++); + fl_add_chart_value (tobj[3], 25, "item 4", c++); + fl_set_menu (tobj[14], "item 1|item 2|item 3|item 4|item 5"); + fl_addto_choice (tobj[15], "item 1"); + fl_addto_choice (tobj[15], "item 2"); + fl_addto_choice (tobj[15], "item 3"); + fl_addto_choice (tobj[15], "item 4"); + fl_addto_choice (tobj[15], "item 5"); + fl_set_timer (tobj[16], 1000.0); + + for ( p = browserlines; *p; p++) + fl_add_browser_line (tobj[17], *p); + + for ( vn = btypes; vn->val >= 0; vn++) + fl_addto_choice(btypeob, vn->name); + +// { +// int i; +// VN_struct *g = gmode, *gs = g + sizeof (gmode) / sizeof (gmode[0]); +// for (i = 1; g < gs; g++, i++) +// { +// fl_addto_choice (modeob, g->name); +// if(!fl_mode_capable(g->val, 0)) +// fl_set_choice_item_mode(modeob, i, FL_PUP_GRAY); +// } +// } +// fl_set_choice (modeob, fl_vmode+1); + + fl_show_form (form, FL_PLACE_MOUSE, border, "Box types"); + + while (fl_do_forms () != exitob) + ; + + return 0; +} + +// +// End of "$Id: forms.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/fractals.cxx b/third_party/windows/fltk-1.1.10/test/fractals.cxx new file mode 100644 index 0000000..5ab3ebb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/fractals.cxx @@ -0,0 +1,842 @@ +// +// "$Id: fractals.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// Fractal drawing demo for the Fast Light Tool Kit (FLTK). +// +// This is a GLUT demo program, with modifications to +// demonstrate how to add FLTK controls to a GLUT program. The GLUT +// code is unchanged except for the end (search for FLTK to find changes). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "config.h" +#if !HAVE_GL || !HAVE_GL_GLU_H +#include +#include +int main(int, char**) { + fl_alert("This demo does not work without GL and GLU (%d)"); + return 1; +} +#else +/* + * To compile: cc -o fractals fractals.c -lGL -lGLU -lX11 -lglut -lXmu -lm + * + * Usage: fractals + * + * Homework 6, Part 2: fractal mountains and fractal trees + * (Pretty Late) + * + * Draws fractal mountains and trees -- and an island of mountains in water + * (I tried having trees on the island but it didn't work too well.) + * + * Two viewer modes: polar and flying (both restrained to y>0 for up vector). + * Keyboard 0->9 and +/- control speed when flying. + * + * Only keyboard commands are 0-9 and +/- for speed in flying mode. + * + * Fog would make the island look much better, but I couldn't get it to work + * correctly. Would line up on -z axis not from eye. + * + * Philip Winston - 3/4/95 + * pwinston@hmc.edu + * http://www.cs.hmc.edu/people/pwinston + * + */ + +#include +#include + +#include +#include +#include +#include /* ULONG_MAX is defined here */ +#include /* FLT_MAX is atleast defined here */ + +#include /* for random seed */ + +#include "fracviewer.h" + +#if defined(WIN32) || defined(__EMX__) +# define drand48() (((float) rand())/((float) RAND_MAX)) +# define srand48(x) (srand((x))) +#elif defined __APPLE__ +# define drand48() (((float) rand())/((float) RAND_MAX)) +# define srand48(x) (srand((x))) +#endif + +typedef enum { NOTALLOWED, MOUNTAIN, TREE, ISLAND, BIGMTN, STEM, LEAF, + MOUNTAIN_MAT, WATER_MAT, LEAF_MAT, TREE_MAT, STEMANDLEAVES, + AXES } DisplayLists; + +#define MAXLEVEL 8 + +int Rebuild = 1, /* Rebuild display list in next display? */ + fractal = TREE, /* What fractal are we building */ + Level = 4; /* levels of recursion for fractals */ + +int DrawAxes = 0; + +/***************************************************************/ +/************************* VECTOR JUNK *************************/ +/***************************************************************/ + + /* print vertex to stderr */ +void printvert(float v[3]) +{ + fprintf(stderr, "(%f, %f, %f)\n", v[0], v[1], v[2]); +} + +#if 0 // removed for FL, it is in fracviewer.c + /* normalizes v */ +void normalize(GLfloat v[3]) +{ + GLfloat d = sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); + + if (d == 0) + fprintf(stderr, "Zero length vector in normalize\n"); + else + v[0] /= d; v[1] /= d; v[2] /= d; +} + + /* calculates a normalized crossproduct to v1, v2 */ +void ncrossprod(float v1[3], float v2[3], float cp[3]) +{ + cp[0] = v1[1]*v2[2] - v1[2]*v2[1]; + cp[1] = v1[2]*v2[0] - v1[0]*v2[2]; + cp[2] = v1[0]*v2[1] - v1[1]*v2[0]; + normalize(cp); +} +#endif + + /* calculates normal to the triangle designated by v1, v2, v3 */ +void triagnormal(float v1[3], float v2[3], float v3[3], float norm[3]) +{ + float vec1[3], vec2[3]; + + vec1[0] = v3[0] - v1[0]; vec2[0] = v2[0] - v1[0]; + vec1[1] = v3[1] - v1[1]; vec2[1] = v2[1] - v1[1]; + vec1[2] = v3[2] - v1[2]; vec2[2] = v2[2] - v1[2]; + + ncrossprod(vec2, vec1, norm); +} + +float xzlength(float v1[3], float v2[3]) +{ + return sqrt((v1[0] - v2[0])*(v1[0] - v2[0]) + + (v1[2] - v2[2])*(v1[2] - v2[2])); +} + +float xzslope(float v1[3], float v2[3]) +{ + return ((v1[0] != v2[0]) ? ((v1[2] - v2[2]) / (v1[0] - v2[0])) + : FLT_MAX); +} + + +/***************************************************************/ +/************************ MOUNTAIN STUFF ***********************/ +/***************************************************************/ + +GLfloat DispFactor[MAXLEVEL]; /* Array of what to multiply random number + by for a given level to get midpoint + displacement */ +GLfloat DispBias[MAXLEVEL]; /* Array of what to add to random number + before multiplying it by DispFactor */ + +#define NUMRANDS 191 +float RandTable[NUMRANDS]; /* hash table of random numbers so we can + raise the same midpoints by the same amount */ + + /* The following are for permitting an edge of a moutain to be */ + /* pegged so it won't be displaced up or down. This makes it */ + /* easier to setup scenes and makes a single moutain look better */ + +GLfloat Verts[3][3], /* Vertices of outside edges of mountain */ + Slopes[3]; /* Slopes between these outside edges */ +int Pegged[3]; /* Is this edge pegged or not */ + + /* + * Comes up with a new table of random numbers [0,1) + */ +void InitRandTable(unsigned int seed) +{ + int i; + + srand48((long) seed); + for (i = 0; i < NUMRANDS; i++) + RandTable[i] = drand48() - 0.5; +} + + /* calculate midpoint and displace it if required */ +void Midpoint(GLfloat mid[3], GLfloat v1[3], GLfloat v2[3], + int edge, int level) +{ + unsigned hash; + + mid[0] = (v1[0] + v2[0]) / 2; + mid[1] = (v1[1] + v2[1]) / 2; + mid[2] = (v1[2] + v2[2]) / 2; + if (!Pegged[edge] || (fabs(xzslope(Verts[edge], mid) + - Slopes[edge]) > 0.00001)) { + srand48((int)((v1[0]+v2[0])*23344)); + hash = unsigned(drand48() * 7334334); + srand48((int)((v2[2]+v1[2])*43433)); + hash = (unsigned)(drand48() * 634344 + hash) % NUMRANDS; + mid[1] += ((RandTable[hash] + DispBias[level]) * DispFactor[level]); + } +} + + /* + * Recursive moutain drawing routine -- from lecture with addition of + * allowing an edge to be pegged. This function requires the above + * globals to be set, as well as the Level global for fractal level + */ +static float cutoff = -1; + +void FMR(GLfloat v1[3], GLfloat v2[3], GLfloat v3[3], int level) +{ + if (level == Level) { + GLfloat norm[3]; + if (v1[1] <= cutoff && v2[1]<=cutoff && v3[1]<=cutoff) return; + triagnormal(v1, v2, v3, norm); + glNormal3fv(norm); + glVertex3fv(v1); + glVertex3fv(v2); + glVertex3fv(v3); + + } else { + GLfloat m1[3], m2[3], m3[3]; + + Midpoint(m1, v1, v2, 0, level); + Midpoint(m2, v2, v3, 1, level); + Midpoint(m3, v3, v1, 2, level); + + FMR(v1, m1, m3, level + 1); + FMR(m1, v2, m2, level + 1); + FMR(m3, m2, v3, level + 1); + FMR(m1, m2, m3, level + 1); + } +} + + /* + * sets up lookup tables and calls recursive mountain function + */ +void FractalMountain(GLfloat v1[3], GLfloat v2[3], GLfloat v3[3], + int pegged[3]) +{ + GLfloat lengths[MAXLEVEL]; + GLfloat fraction[8] = { 0.3, 0.3, 0.4, 0.2, 0.3, 0.2, 0.4, 0.4 }; + GLfloat bias[8] = { 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1 }; + int i; + float avglen = (xzlength(v1, v2) + + xzlength(v2, v3) + + xzlength(v3, v1) / 3); + + for (i = 0; i < 3; i++) { + Verts[0][i] = v1[i]; /* set mountain vertex globals */ + Verts[1][i] = v2[i]; + Verts[2][i] = v3[i]; + Pegged[i] = pegged[i]; + } + + Slopes[0] = xzslope(Verts[0], Verts[1]); /* set edge slope globals */ + Slopes[1] = xzslope(Verts[1], Verts[2]); + Slopes[2] = xzslope(Verts[2], Verts[0]); + + lengths[0] = avglen; + for (i = 1; i < Level; i++) { + lengths[i] = lengths[i-1]/2; /* compute edge length for each level */ + } + + for (i = 0; i < Level; i++) { /* DispFactor and DispBias arrays */ + DispFactor[i] = (lengths[i] * ((i <= 7) ? fraction[i] : fraction[7])); + DispBias[i] = ((i <= 7) ? bias[i] : bias[7]); + } + + glBegin(GL_TRIANGLES); + FMR(v1, v2, v3, 0); /* issues no GL but vertex calls */ + glEnd(); +} + + /* + * draw a mountain and build the display list + */ +void CreateMountain(void) +{ + GLfloat v1[3] = { 0, 0, -1 }, v2[3] = { -1, 0, 1 }, v3[3] = { 1, 0, 1 }; + int pegged[3] = { 1, 1, 1 }; + + glNewList(MOUNTAIN, GL_COMPILE); + glPushAttrib(GL_LIGHTING_BIT); + glCallList(MOUNTAIN_MAT); + FractalMountain(v1, v2, v3, pegged); + glPopAttrib(); + glEndList(); +} + + /* + * new random numbers to make a different moutain + */ +void NewMountain(void) +{ + InitRandTable(time(NULL)); +} + +/***************************************************************/ +/***************************** TREE ****************************/ +/***************************************************************/ + +long TreeSeed; /* for srand48 - remember so we can build "same tree" + at a different level */ + + /* + * recursive tree drawing thing, fleshed out from class notes pseudocode + */ +void FractalTree(int level) +{ + long savedseed; /* need to save seeds while building tree too */ + + if (level == Level) { + glPushMatrix(); + glRotatef(drand48()*180, 0, 1, 0); + glCallList(STEMANDLEAVES); + glPopMatrix(); + } else { + glCallList(STEM); + glPushMatrix(); + glRotatef(drand48()*180, 0, 1, 0); + glTranslatef(0, 1, 0); + glScalef(0.7, 0.7, 0.7); + + savedseed = (long)((ulong)drand48()*ULONG_MAX); + glPushMatrix(); + glRotatef(110 + drand48()*40, 0, 1, 0); + glRotatef(30 + drand48()*20, 0, 0, 1); + FractalTree(level + 1); + glPopMatrix(); + + srand48(savedseed); + savedseed = (long)((ulong)drand48()*ULONG_MAX); + glPushMatrix(); + glRotatef(-130 + drand48()*40, 0, 1, 0); + glRotatef(30 + drand48()*20, 0, 0, 1); + FractalTree(level + 1); + glPopMatrix(); + + srand48(savedseed); + glPushMatrix(); + glRotatef(-20 + drand48()*40, 0, 1, 0); + glRotatef(30 + drand48()*20, 0, 0, 1); + FractalTree(level + 1); + glPopMatrix(); + + glPopMatrix(); + } +} + + /* + * Create display lists for a leaf, a set of leaves, and a stem + */ +void CreateTreeLists(void) +{ + GLUquadricObj *cylquad = gluNewQuadric(); + int i; + + glNewList(STEM, GL_COMPILE); + glPushMatrix(); + glRotatef(-90, 1, 0, 0); + gluCylinder(cylquad, 0.1, 0.08, 1, 10, 2 ); + glPopMatrix(); + glEndList(); + + glNewList(LEAF, GL_COMPILE); /* I think this was jeff allen's leaf idea */ + glBegin(GL_TRIANGLES); + glNormal3f(-0.1, 0, 0.25); /* not normalized */ + glVertex3f(0, 0, 0); + glVertex3f(0.25, 0.25, 0.1); + glVertex3f(0, 0.5, 0); + + glNormal3f(0.1, 0, 0.25); + glVertex3f(0, 0, 0); + glVertex3f(0, 0.5, 0); + glVertex3f(-0.25, 0.25, 0.1); + glEnd(); + glEndList(); + + glNewList(STEMANDLEAVES, GL_COMPILE); + glPushMatrix(); + glPushAttrib(GL_LIGHTING_BIT); + glCallList(STEM); + glCallList(LEAF_MAT); + for(i = 0; i < 3; i++) { + glTranslatef(0, 0.333, 0); + glRotatef(90, 0, 1, 0); + glPushMatrix(); + glRotatef(0, 0, 1, 0); + glRotatef(50, 1, 0, 0); + glCallList(LEAF); + glPopMatrix(); + glPushMatrix(); + glRotatef(180, 0, 1, 0); + glRotatef(60, 1, 0, 0); + glCallList(LEAF); + glPopMatrix(); + } + glPopAttrib(); + glPopMatrix(); + glEndList(); + + gluDeleteQuadric(cylquad); +} + + /* + * draw and build display list for tree + */ +void CreateTree(void) +{ + srand48(TreeSeed); + + glNewList(TREE, GL_COMPILE); + glPushMatrix(); + glPushAttrib(GL_LIGHTING_BIT); + glCallList(TREE_MAT); + glTranslatef(0, -1, 0); + FractalTree(0); + glPopAttrib(); + glPopMatrix(); + glEndList(); +} + + /* + * new seed for a new tree (groan) + */ +void NewTree(void) +{ + TreeSeed = time(NULL); +} + +/***************************************************************/ +/*********************** FRACTAL PLANET ************************/ +/***************************************************************/ + +void CreateIsland(void) +{ + cutoff = .06; + CreateMountain(); + cutoff = -1; + glNewList(ISLAND, GL_COMPILE); + glPushAttrib(GL_LIGHTING_BIT); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glCallList(WATER_MAT); + + glBegin(GL_QUADS); + glNormal3f(0, 1, 0); + glVertex3f(10, 0.01, 10); + glVertex3f(10, 0.01, -10); + glVertex3f(-10, 0.01, -10); + glVertex3f(-10, 0.01, 10); + glEnd(); + + glPushMatrix(); + glTranslatef(0, -0.1, 0); + glCallList(MOUNTAIN); + glPopMatrix(); + + glPushMatrix(); + glRotatef(135, 0, 1, 0); + glTranslatef(0.2, -0.15, -0.4); + glCallList(MOUNTAIN); + glPopMatrix(); + + glPushMatrix(); + glRotatef(-60, 0, 1, 0); + glTranslatef(0.7, -0.07, 0.5); + glCallList(MOUNTAIN); + glPopMatrix(); + + glPushMatrix(); + glRotatef(-175, 0, 1, 0); + glTranslatef(-0.7, -0.05, -0.5); + glCallList(MOUNTAIN); + glPopMatrix(); + + glPushMatrix(); + glRotatef(165, 0, 1, 0); + glTranslatef(-0.9, -0.12, 0.0); + glCallList(MOUNTAIN); + glPopMatrix(); + + glPopMatrix(); + glPopAttrib(); + glEndList(); +} + + +void NewFractals(void) +{ + NewMountain(); + NewTree(); +} + +void Create(int fract) +{ + switch(fract) { + case MOUNTAIN: + CreateMountain(); + break; + case TREE: + CreateTree(); + break; + case ISLAND: + CreateIsland(); + break; + } +} + + + +/***************************************************************/ +/**************************** OPENGL ***************************/ +/***************************************************************/ + + +void SetupMaterials(void) +{ + GLfloat mtn_ambuse[] = { 0.426, 0.256, 0.108, 1.0 }; + GLfloat mtn_specular[] = { 0.394, 0.272, 0.167, 1.0 }; + GLfloat mtn_shininess[] = { 10 }; + + GLfloat water_ambuse[] = { 0.0, 0.1, 0.5, 1.0 }; + GLfloat water_specular[] = { 0.0, 0.1, 0.5, 1.0 }; + GLfloat water_shininess[] = { 10 }; + + GLfloat tree_ambuse[] = { 0.4, 0.25, 0.1, 1.0 }; + GLfloat tree_specular[] = { 0.0, 0.0, 0.0, 1.0 }; + GLfloat tree_shininess[] = { 0 }; + + GLfloat leaf_ambuse[] = { 0.0, 0.8, 0.0, 1.0 }; + GLfloat leaf_specular[] = { 0.0, 0.8, 0.0, 1.0 }; + GLfloat leaf_shininess[] = { 10 }; + + glNewList(MOUNTAIN_MAT, GL_COMPILE); + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mtn_ambuse); + glMaterialfv(GL_FRONT, GL_SPECULAR, mtn_specular); + glMaterialfv(GL_FRONT, GL_SHININESS, mtn_shininess); + glEndList(); + + glNewList(WATER_MAT, GL_COMPILE); + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, water_ambuse); + glMaterialfv(GL_FRONT, GL_SPECULAR, water_specular); + glMaterialfv(GL_FRONT, GL_SHININESS, water_shininess); + glEndList(); + + glNewList(TREE_MAT, GL_COMPILE); + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, tree_ambuse); + glMaterialfv(GL_FRONT, GL_SPECULAR, tree_specular); + glMaterialfv(GL_FRONT, GL_SHININESS, tree_shininess); + glEndList(); + + glNewList(LEAF_MAT, GL_COMPILE); + glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, leaf_ambuse); + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, leaf_specular); + glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, leaf_shininess); + glEndList(); +} + +void myGLInit(void) +{ + GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 }; + GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; + GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; + GLfloat light_position[] = { 0.0, 0.3, 0.3, 0.0 }; + + GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 }; + + glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); + glLightfv(GL_LIGHT0, GL_POSITION, light_position); + + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + + glDepthFunc(GL_LEQUAL); + glEnable(GL_DEPTH_TEST); + + glEnable(GL_NORMALIZE); +#if 0 + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); +#endif + + glShadeModel(GL_SMOOTH); +#if 0 + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +#endif + + SetupMaterials(); + CreateTreeLists(); + + glFlush(); +} + +/***************************************************************/ +/************************ GLUT STUFF ***************************/ +/***************************************************************/ + +int winwidth = 1; +int winheight = 1; + +void reshape(int w, int h) +{ + glViewport(0,0,w,h); + + winwidth = w; + winheight = h; +} + +void display(void) +{ + time_t curtime; + char buf[255]; + static time_t fpstime = 0; + static int fpscount = 0; + static int fps = 0; + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(60.0, (GLdouble)winwidth/winheight, 0.01, 100); + agvViewTransform(); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + if (Rebuild) { + Create(fractal); + Rebuild = 0; + } + + glCallList(fractal); + + if (DrawAxes) + glCallList(AXES); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluOrtho2D(0.0, winwidth, 0.0, winheight); + + sprintf(buf, "FPS=%d", fps); + glColor3f(1.0f, 1.0f, 1.0f); + gl_font(FL_HELVETICA, 12); + gl_draw(buf, 10, 10); + + // + // Use glFinish() instead of glFlush() to avoid getting many frames + // ahead of the display (problem with some Linux OpenGL implementations...) + // + + glFinish(); + + // Update frames-per-second + fpscount ++; + curtime = time(NULL); + if ((curtime - fpstime) >= 2) + { + fps = (fps + fpscount / (curtime - fpstime)) / 2; + fpstime = curtime; + fpscount = 0; + } +} + +void visible(int v) +{ + if (v == GLUT_VISIBLE) + agvSetAllowIdle(1); + else { + glutIdleFunc(NULL); + agvSetAllowIdle(0); + } +} + +void menuuse(int v) +{ + if (v == GLUT_MENU_NOT_IN_USE) + agvSetAllowIdle(1); + else { + glutIdleFunc(NULL); + agvSetAllowIdle(0); + } +} + +/***************************************************************/ +/******************* MENU SETUP & HANDLING *********************/ +/***************************************************************/ + +typedef enum { MENU_QUIT, MENU_RAND, MENU_MOVE, MENU_AXES } MenuChoices; + +void setlevel(int value) +{ + Level = value; + Rebuild = 1; + glutPostRedisplay(); +} + +void choosefract(int value) +{ + fractal = value; + Rebuild = 1; + glutPostRedisplay(); +} + +void handlemenu(int value) +{ + switch (value) { + case MENU_QUIT: + exit(0); + break; + case MENU_RAND: + NewFractals(); + Rebuild = 1; + glutPostRedisplay(); + break; + case MENU_AXES: + DrawAxes = !DrawAxes; + glutPostRedisplay(); + break; + } +} + +void MenuInit(void) +{ + int submenu3, submenu2, submenu1; + + submenu1 = glutCreateMenu(setlevel); + glutAddMenuEntry((char *)"0", 0); glutAddMenuEntry((char *)"1", 1); + glutAddMenuEntry((char *)"2", 2); glutAddMenuEntry((char *)"3", 3); + glutAddMenuEntry((char *)"4", 4); glutAddMenuEntry((char *)"5", 5); + glutAddMenuEntry((char *)"6", 6); glutAddMenuEntry((char *)"7", 7); + glutAddMenuEntry((char *)"8", 8); + + submenu2 = glutCreateMenu(choosefract); + glutAddMenuEntry((char *)"Moutain", MOUNTAIN); + glutAddMenuEntry((char *)"Tree", TREE); + glutAddMenuEntry((char *)"Island", ISLAND); + + submenu3 = glutCreateMenu(agvSwitchMoveMode); + glutAddMenuEntry((char *)"Flying", FLYING); + glutAddMenuEntry((char *)"Polar", POLAR); + + glutCreateMenu(handlemenu); + glutAddSubMenu((char *)"Level", submenu1); + glutAddSubMenu((char *)"Fractal", submenu2); + glutAddSubMenu((char *)"Movement", submenu3); + glutAddMenuEntry((char *)"New Fractal", MENU_RAND); + glutAddMenuEntry((char *)"Toggle Axes", MENU_AXES); + glutAddMenuEntry((char *)"Quit", MENU_QUIT); + glutAttachMenu(GLUT_RIGHT_BUTTON); +} + + +/***************************************************************/ +/**************************** MAIN *****************************/ +/***************************************************************/ + +// FLTK-style callbacks to Glut menu callback translators: +void setlevel(Fl_Widget*, void *value) {setlevel(long(value));} + +void choosefract(Fl_Widget*, void *value) {choosefract(long(value));} + +void handlemenu(Fl_Widget*, void *value) {handlemenu(long(value));} + +#include +#include +#include + +int main(int argc, char** argv) +{ +// glutInit(&argc, argv); // this line removed for FLTK + + // create FLTK window: + Fl_Window window(512+20, 512+100); + window.resizable(window); + + // create a bunch of buttons: + Fl_Group *g = new Fl_Group(110,50,400-110,30,"Level:"); + g->align(FL_ALIGN_LEFT); + g->begin(); + Fl_Button *b; + b = new Fl_Button(110,50,30,30,"0"); b->callback(setlevel,(void*)0); + b = new Fl_Button(140,50,30,30,"1"); b->callback(setlevel,(void*)1); + b = new Fl_Button(170,50,30,30,"2"); b->callback(setlevel,(void*)2); + b = new Fl_Button(200,50,30,30,"3"); b->callback(setlevel,(void*)3); + b = new Fl_Button(230,50,30,30,"4"); b->callback(setlevel,(void*)4); + b = new Fl_Button(260,50,30,30,"5"); b->callback(setlevel,(void*)5); + b = new Fl_Button(290,50,30,30,"6"); b->callback(setlevel,(void*)6); + b = new Fl_Button(320,50,30,30,"7"); b->callback(setlevel,(void*)7); + b = new Fl_Button(350,50,30,30,"8"); b->callback(setlevel,(void*)8); + g->end(); + + b = new Fl_Button(400,50,100,30,"New Fractal"); b->callback(handlemenu,(void*)MENU_RAND); + + b = new Fl_Button( 10,10,100,30,"Mountain"); b->callback(choosefract,(void*)MOUNTAIN); + b = new Fl_Button(110,10,100,30,"Tree"); b->callback(choosefract,(void*)TREE); + b = new Fl_Button(210,10,100,30,"Island"); b->callback(choosefract,(void*)ISLAND); + b = new Fl_Button(400,10,100,30,"Quit"); b->callback(handlemenu,(void*)MENU_QUIT); + + + window.show(argc,argv); // glut will die unless parent window visible + window.begin(); // this will cause Glut window to be a child + glutInitWindowSize(512, 512); + glutInitWindowPosition(10,90); // place it inside parent window + glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE); + glutCreateWindow("Fractal Planet?"); + window.end(); + window.resizable(glut_window); + + agvInit(1); /* 1 cause we don't have our own idle */ + + glutReshapeFunc(reshape); + glutDisplayFunc(display); + glutVisibilityFunc(visible); + glutMenuStateFunc(menuuse); + + NewFractals(); + agvMakeAxesList(AXES); + myGLInit(); + MenuInit(); + + glutMainLoop(); // you could use Fl::run() instead + + return 0; +} +#endif + +// +// End of "$Id: fractals.cxx 5845 2007-05-20 00:01:06Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/fracviewer.cxx b/third_party/windows/fltk-1.1.10/test/fracviewer.cxx new file mode 100644 index 0000000..6866cec --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/fracviewer.cxx @@ -0,0 +1,506 @@ +/* + * fractviewer.cxx [from agviewer.c (version 1.0)] + * + * AGV: a glut viewer. Routines for viewing a 3d scene w/ glut + * + * See agv_example.c and agviewer.h comments within for more info. + * + * I welcome any feedback or improved versions! + * + * Philip Winston - 4/11/95 + * pwinston@hmc.edu + * http://www.cs.hmc.edu/people/pwinston + */ + +#include + +#if HAVE_GL && HAVE_GL_GLU_H +# include +# include + +# include +# include +# include +# include +# include +# if !defined(WIN32) && !defined(__EMX__) +# include +# endif // !WIN32 && !__EMX__ + +# include "fracviewer.h" + +/* Some files do not define M_PI... */ +#ifndef M_PI +#define M_PI 3.14159265 +#endif + +/***************************************************************/ +/************************** SETTINGS ***************************/ +/***************************************************************/ + + /* Initial polar movement settings */ +#define INIT_POLAR_AZ 0.0 +#define INIT_POLAR_EL 30.0 +#define INIT_DIST 4.0 +#define INIT_AZ_SPIN 0.5 +#define INIT_EL_SPIN 0.0 + + /* Initial flying movement settings */ +#define INIT_EX 0.0 +#define INIT_EY -2.0 +#define INIT_EZ -2.0 +#define INIT_MOVE 0.01 +#define MINMOVE 0.001 + + /* Start in this mode */ +#define INIT_MODE POLAR + + /* Controls: */ + + /* map 0-9 to an EyeMove value when number key is hit in FLYING mode */ +#define SPEEDFUNCTION(x) ((x)*(x)*0.001) + + /* Multiply EyeMove by (1+-MOVEFRACTION) when +/- hit in FLYING mode */ +#define MOVEFRACTION 0.25 + + /* What to multiply number of pixels mouse moved by to get rotation amount */ +#define EL_SENS 0.5 +#define AZ_SENS 0.5 + + /* What to multiply number of pixels mouse moved by for movement amounts */ +#define DIST_SENS 0.01 +#define E_SENS 0.01 + + /* Minimum spin to allow in polar (lower forced to zero) */ +#define MIN_AZSPIN 0.1 +#define MIN_ELSPIN 0.1 + + /* Factors used in computing dAz and dEl (which determine AzSpin, ElSpin) */ +#define SLOW_DAZ 0.90 +#define SLOW_DEL 0.90 +#define PREV_DAZ 0.80 +#define PREV_DEL 0.80 +#define CUR_DAZ 0.20 +#define CUR_DEL 0.20 + +/***************************************************************/ +/************************** GLOBALS ****************************/ +/***************************************************************/ + +int MoveMode = INIT_MODE; /* FLYING or POLAR mode? */ + +GLfloat Ex = INIT_EX, /* flying parameters */ + Ey = INIT_EY, + Ez = INIT_EZ, + EyeMove = INIT_MOVE, + + EyeDist = INIT_DIST, /* polar params */ + AzSpin = INIT_AZ_SPIN, + ElSpin = INIT_EL_SPIN, + + EyeAz = INIT_POLAR_AZ, /* used by both */ + EyeEl = INIT_POLAR_EL; + +int agvMoving; /* Currently moving? */ + +int downx, downy, /* for tracking mouse position */ + lastx, lasty, + downb = -1; /* and button status */ + +GLfloat downDist, downEl, downAz, /* for saving state of things */ + downEx, downEy, downEz, /* when button is pressed */ + downEyeMove; + +GLfloat dAz, dEl, lastAz, lastEl; /* to calculate spinning w/ polar motion */ +int AdjustingAzEl = 0; + +int AllowIdle, RedisplayWindow; + /* If AllowIdle is 1 it means AGV will install its own idle which + * will update the viewpoint as needed and send glutPostRedisplay() to the + * window RedisplayWindow which was set in agvInit(). AllowIdle of 0 + * means AGV won't install an idle funciton, and something like + * "if (agvMoving) agvMove()" should exist at the end of the running + * idle function. + */ + +#define MAX(x,y) (((x) > (y)) ? (x) : (y)) +#define TORAD(x) ((M_PI/180.0)*(x)) +#define TODEG(x) ((180.0/M_PI)*(x)) + +/***************************************************************/ +/************************ PROTOTYPES ***************************/ +/***************************************************************/ + + /* + * these are functions meant for internal use only + * the other prototypes are in agviewer.h + */ + +void PolarLookFrom(GLfloat dist, GLfloat elevation, GLfloat azimuth); +void FlyLookFrom(GLfloat x, GLfloat y, GLfloat z, + GLfloat az, GLfloat el); +int ConstrainEl(void); +void MoveOn(int v); +void SetMove(float newmove); +static void normalize(GLfloat v[3]); +void ncrossprod(float v1[3], float v2[3], float cp[3]); + + +/***************************************************************/ +/************************ agvInit ******************************/ +/***************************************************************/ + +void agvInit(int window) +{ + glutMouseFunc(agvHandleButton); + glutMotionFunc(agvHandleMotion); + glutKeyboardFunc(agvHandleKeys); + RedisplayWindow = glutGetWindow(); + agvSetAllowIdle(window); +} + +/***************************************************************/ +/************************ VIEWPOINT STUFF **********************/ +/***************************************************************/ + + /* + * viewing transformation modified from page 90 of red book + */ +void PolarLookFrom(GLfloat dist, GLfloat elevation, GLfloat azimuth) +{ + glTranslatef(0, 0, -dist); + glRotatef(elevation, 1, 0, 0); + glRotatef(azimuth, 0, 1, 0); + +} + + /* + * I took the idea of tracking eye position in absolute + * coords and direction looking in Polar form from denis + */ +void FlyLookFrom(GLfloat x, GLfloat y, GLfloat z, GLfloat az, GLfloat el) +{ + float lookat[3], perp[3], up[3]; + + lookat[0] = sin(TORAD(az))*cos(TORAD(el)); + lookat[1] = sin(TORAD(el)); + lookat[2] = -cos(TORAD(az))*cos(TORAD(el)); + normalize(lookat); + perp[0] = lookat[2]; + perp[1] = 0; + perp[2] = -lookat[0]; + normalize(perp); + ncrossprod(lookat, perp, up); + gluLookAt(x, y, z, + x+lookat[0], y+lookat[1], z+lookat[2], + up[0], up[1], up[2]); +} + + /* + * Call viewing transformation based on movement mode + */ +void agvViewTransform(void) +{ + switch (MoveMode) { + case FLYING: + FlyLookFrom(Ex, Ey, Ez, EyeAz, EyeEl); + break; + case POLAR: + PolarLookFrom(EyeDist, EyeEl, EyeAz); + break; + } +} + + /* + * keep them vertical; I think this makes a lot of things easier, + * but maybe it wouldn't be too hard to adapt things to let you go + * upside down + */ +int ConstrainEl(void) +{ + if (EyeEl <= -90) { + EyeEl = -89.99; + return 1; + } else if (EyeEl >= 90) { + EyeEl = 89.99; + return 1; + } + return 0; +} + + /* + * Idle Function - moves eyeposition + */ +void agvMove(void) +{ + switch (MoveMode) { + case FLYING: + Ex += EyeMove*sin(TORAD(EyeAz))*cos(TORAD(EyeEl)); + Ey += EyeMove*sin(TORAD(EyeEl)); + Ez -= EyeMove*cos(TORAD(EyeAz))*cos(TORAD(EyeEl)); + break; + + case POLAR: + EyeEl += ElSpin; + EyeAz += AzSpin; + if (ConstrainEl()) { /* weird spin thing to make things look */ + ElSpin = -ElSpin; /* look better when you are kept from going */ + /* upside down while spinning - Isn't great */ + if (fabs(ElSpin) > fabs(AzSpin)) + AzSpin = fabs(ElSpin) * ((AzSpin > 0) ? 1 : -1); + } + break; + } + + if (AdjustingAzEl) { + dAz *= SLOW_DAZ; + dEl *= SLOW_DEL; + } + + if (AllowIdle) { + glutSetWindow(RedisplayWindow); + glutPostRedisplay(); + } +} + + + /* + * Don't install agvMove as idle unless we will be updating the view + * and we've been given a RedisplayWindow + */ +void MoveOn(int v) +{ + if (v && ((MoveMode == FLYING && EyeMove != 0) || + (MoveMode == POLAR && + (AzSpin != 0 || ElSpin != 0 || AdjustingAzEl)))) { + agvMoving = 1; + if (AllowIdle) + glutIdleFunc(agvMove); + } else { + agvMoving = 0; + if (AllowIdle) + glutIdleFunc(NULL); + } +} + + /* + * set new redisplay window. If <= 0 it means we are not to install + * an idle function and will rely on whoever does install one to + * put statement like "if (agvMoving) agvMove();" at end of it + */ +void agvSetAllowIdle(int allowidle) +{ + if ((AllowIdle = allowidle)) + MoveOn(1); +} + + + /* + * when moving to flying we stay in the same spot, moving to polar we + * reset since we have to be looking at the origin (though a pivot from + * current position to look at origin might be cooler) + */ +void agvSwitchMoveMode(int move) +{ + switch (move) { + case FLYING: + if (MoveMode == FLYING) return; + Ex = -EyeDist*sin(TORAD(EyeAz))*cos(TORAD(EyeEl)); + Ey = EyeDist*sin(TORAD(EyeEl)); + Ez = EyeDist*(cos(TORAD(EyeAz))*cos(TORAD(EyeEl))); + EyeAz = EyeAz; + EyeEl = -EyeEl; + EyeMove = INIT_MOVE; + break; + case POLAR: + EyeDist = INIT_DIST; + EyeAz = INIT_POLAR_AZ; + EyeEl = INIT_POLAR_EL; + AzSpin = INIT_AZ_SPIN; + ElSpin = INIT_EL_SPIN; + break; + } + MoveMode = move; + MoveOn(1); + glutPostRedisplay(); +} + +/***************************************************************/ +/******************* MOUSE HANDLING ***********************/ +/***************************************************************/ + +void agvHandleButton(int button, int state, int x, int y) +{ + if (state == GLUT_DOWN && downb == -1) { + lastx = downx = x; + lasty = downy = y; + downb = button; + + switch (button) { + case GLUT_LEFT_BUTTON: + lastEl = downEl = EyeEl; + lastAz = downAz = EyeAz; + AzSpin = ElSpin = dAz = dEl = 0; + AdjustingAzEl = 1; + MoveOn(1); + break; + + case GLUT_MIDDLE_BUTTON: + downDist = EyeDist; + downEx = Ex; + downEy = Ey; + downEz = Ez; + downEyeMove = EyeMove; + EyeMove = 0; + } + + } else if (state == GLUT_UP && button == downb) { + + downb = -1; + + switch (button) { + case GLUT_LEFT_BUTTON: + if (MoveMode != FLYING) { + AzSpin = -dAz; + if (AzSpin < MIN_AZSPIN && AzSpin > -MIN_AZSPIN) + AzSpin = 0; + ElSpin = -dEl; + if (ElSpin < MIN_ELSPIN && ElSpin > -MIN_ELSPIN) + ElSpin = 0; + } + AdjustingAzEl = 0; + MoveOn(1); + break; + + case GLUT_MIDDLE_BUTTON: + EyeMove = downEyeMove; + } + } +} + + /* + * change EyeEl and EyeAz and position when mouse is moved w/ button down + */ +void agvHandleMotion(int x, int y) +{ + int deltax = x - downx, deltay = y - downy; + + switch (downb) { + case GLUT_LEFT_BUTTON: + EyeEl = downEl + EL_SENS * deltay; + ConstrainEl(); + EyeAz = downAz + AZ_SENS * deltax; + dAz = PREV_DAZ*dAz + CUR_DAZ*(lastAz - EyeAz); + dEl = PREV_DEL*dEl + CUR_DEL*(lastEl - EyeEl); + lastAz = EyeAz; + lastEl = EyeEl; + break; + case GLUT_MIDDLE_BUTTON: + EyeDist = downDist + DIST_SENS*deltay; + Ex = downEx - E_SENS*deltay*sin(TORAD(EyeAz))*cos(TORAD(EyeEl)); + Ey = downEy - E_SENS*deltay*sin(TORAD(EyeEl)); + Ez = downEz + E_SENS*deltay*cos(TORAD(EyeAz))*cos(TORAD(EyeEl)); + break; + } + glutPostRedisplay(); +} + +/***************************************************************/ +/********************* KEYBOARD HANDLING ***********************/ +/***************************************************************/ + + /* + * set EyeMove (current speed) for FLYING mode + */ +void SetMove(float newmove) +{ + if (newmove > MINMOVE) { + EyeMove = newmove; + MoveOn(1); + } else { + EyeMove = 0; + MoveOn(0); + } +} + + /* + * 0->9 set speed, +/- adjust current speed -- in FLYING mode + */ +void agvHandleKeys(unsigned char key, int, int) { + if (MoveMode != FLYING) + return; + + if (key >= '0' && key <= '9') + SetMove(SPEEDFUNCTION((key-'0'))); + else + switch(key) { + case '+': + if (EyeMove == 0) + SetMove(MINMOVE); + else + SetMove(EyeMove *= (1 + MOVEFRACTION)); + break; + case '-': + SetMove(EyeMove *= (1 - MOVEFRACTION)); + break; + } +} + +/***************************************************************/ +/*********************** VECTOR STUFF **************************/ +/***************************************************************/ + + /* normalizes v */ +static void normalize(GLfloat v[3]) +{ + GLfloat d = sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); + + if (d == 0) + fprintf(stderr, "Zero length vector in normalize\n"); + else + v[0] /= d; v[1] /= d; v[2] /= d; +} + + /* calculates a normalized crossproduct to v1, v2 */ +void ncrossprod(float v1[3], float v2[3], float cp[3]) +{ + cp[0] = v1[1]*v2[2] - v1[2]*v2[1]; + cp[1] = v1[2]*v2[0] - v1[0]*v2[2]; + cp[2] = v1[0]*v2[1] - v1[1]*v2[0]; + normalize(cp); +} + +/***************************************************************/ +/**************************** AXES *****************************/ +/***************************************************************/ + + + /* draw axes -- was helpful to debug/design things */ +void agvMakeAxesList(int displaylistnum) +{ + int i,j; + GLfloat axes_ambuse[] = { 0.5, 0.0, 0.0, 1.0 }; + glNewList(displaylistnum, GL_COMPILE); + glPushAttrib(GL_LIGHTING_BIT); + glMatrixMode(GL_MODELVIEW); + glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, axes_ambuse); + glBegin(GL_LINES); + glVertex3f(15, 0, 0); glVertex3f(-15, 0, 0); + glVertex3f(0, 15, 0); glVertex3f(0, -15, 0); + glVertex3f(0, 0, 15); glVertex3f(0, 0, -15); + glEnd(); + for (i = 0; i < 3; i++) { + glPushMatrix(); + glTranslatef(-10*(i==0), -10*(i==1), -10*(i==2)); + for (j = 0; j < 21; j++) { +// glutSolidCube(0.1); + glTranslatef(i==0, i==1, i==2); + } + glPopMatrix(); + } + glPopAttrib(); + glEndList(); +} + + +#endif // HAVE_GL && HAVE_GL_GLU_H diff --git a/third_party/windows/fltk-1.1.10/test/fracviewer.h b/third_party/windows/fltk-1.1.10/test/fracviewer.h new file mode 100644 index 0000000..00899f3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/fracviewer.h @@ -0,0 +1,105 @@ +/* + * fracviewer.h [from agviewer.h (version 1.0)] + * + * AGV: a glut viewer. Routines for viewing a 3d scene w/ glut + * + * The two view movement modes are POLAR and FLYING. Both move the eye, NOT + * THE OBJECT. You can never be upside down or twisted (roll) in either mode. + * + * A nice addition would be an examiner type trackball mode where you are + * moving the object and so could see it from any angle. Also less restricted + * flying and polar modes (fly upside down, do rolls, etc.). + * + * Controls for Polar are just left and middle buttons -- for flying it's + * those plus 0-9 number keys and +/- for speed adjustment. + * + * See agv_example.c and agviewer.c for more info. Probably want to make + * a copy of these and then edit for each program. This isn't meant to be + * a library, just something to graft onto your own programs. + * + * I welcome any feedback or improved versions. + * + * Philip Winston - 4/11/95 + * pwinston@hmc.edu + * http://www.cs.hmc.edu/people/pwinston + */ + + + /* + * Call agvInit() with glut's current window set to the window in + * which you want to run the viewer. Right after creating it is fine. It + * will remember that window for possible later use (see below) and + * registers mouse, motion, and keyboard handlers for that window (see below). + * + * allowidle is 1 or 0 depnding on whether you will let AGV install + * and uninstall an idle function. 0 means you will not let it (because + * you will be having your own idle function). In this case it is your + * responsibility to put a statement like: + * + * if (agvMoving) + * agvMove(); + * + * at the end of your idle function, to let AGV update the viewpoint if it + * is moving. + * + * If allowidle is 1 it means AGV will install its own idle which + * will update the viewpoint as needed and send glutPostRedisplay() to the + * window which was current when agvInit() was called. + * + * agvSetIdleAllow changes this value so you can let AGV install its idle + * when your idle isn't installed. + * + */ +void agvInit(int allowidle); +void agvSetAllowIdle(int allowidle); + + + /* + * Set which movement mode you are in. + */ +typedef enum { FLYING, POLAR } MovementType; +void agvSwitchMoveMode(int move); + + /* + * agvViewTransform basically does the appropriate gluLookAt() for the + * current position. So call it in your display on the projection matrix + */ +void agvViewTransform(void); + + /* + * agvMoving will be set by AGV according to whether it needs you to call + * agvMove() at the end of your idle function. You only need these if + * you aren't allowing AGV to do its own idle. + * (Don't change the value of agvMoving) + */ +extern int agvMoving; +void agvMove(void); + + /* + * These are the routines AGV registers to deal with mouse and keyboard input. + * Keyboard input only matters in flying mode, and then only to set speed. + * Mouse input only uses left two buttons in both modes. + * These are all registered with agvInit(), but you could register + * something else which called these, or reregister these as needed + */ +void agvHandleButton(int button, int state, int x, int y); +void agvHandleMotion(int x, int y); +void agvHandleKeys(unsigned char key, int x, int y); + + /* + * Just an extra routine which makes an x-y-z axes (about 10x10x10) + * which is nice for aligning things and debugging. Pass it an available + * displaylist number. + */ +void agvMakeAxesList(int displaylist); + + + +void ncrossprod(float v1[3], float v2[3], float cp[3]); + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/test/fromdos.c b/third_party/windows/fltk-1.1.10/test/fromdos.c new file mode 100644 index 0000000..c79a0ad --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/fromdos.c @@ -0,0 +1,65 @@ +/* fromdos.c : strip the stupid ^M characters without mistakes! */ + +/* this can do in-place conversion or be used as a pipe... */ + +#include +#include +#include +#include + +int main(int argc, char** argv) { + int f,c; + if (argc <= 1) { + if (isatty(0)) { + fprintf(stderr,"usage : %s \nStrips ^M characters.\nCan do in-place conversion of many files or can be used in a pipe\n",argv[0]); + return 1; + } + for (;;) { + c = getchar(); + while (c == '\r') { + c = getchar(); + if (c != '\n') putchar(c); + } + if (c < 0) break; + putchar(c); + } + return 0; + } + for (f = 1; f < argc; f++) { + char* fname = argv[f]; + char tempname[1024]; + FILE* in = fopen(fname,"rb"); + FILE* out; + int mod = 0; + if (!in) { + fprintf(stderr,"%s : %s\n", fname, strerror(errno)); + return 1; + } + strcpy(tempname, fname); + strcat(tempname, ".temp"); + out = fopen(tempname, "wb"); + if (!out) { + fprintf(stderr,"%s : %s\n", fname, strerror(errno)); + return 1; + } + for (;;) { + c = getc(in); + while (c == '\r') { + c = getc(in); + if (c == '\n') mod=1; else putc(c,out); + } + if (c < 0) break; + putc(c,out); + } + fclose(in); + fclose(out); + if (!mod) { + fprintf(stderr,"%s : no change\n", fname); + unlink(tempname); + } else if (rename(tempname, fname)) { + fprintf(stderr,"Can't mv %s %s : %s\n",tempname,fname,strerror(errno)); + return 1; + } + } + return 0; +} diff --git a/third_party/windows/fltk-1.1.10/test/fullscreen.cxx b/third_party/windows/fltk-1.1.10/test/fullscreen.cxx new file mode 100644 index 0000000..6f9a554 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/fullscreen.cxx @@ -0,0 +1,251 @@ +// +// "$Id: fullscreen.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// Fullscreen test program for the Fast Light Tool Kit (FLTK). +// +// This demo shows how to do many of the window manipulations that +// are popular on SGI programs, even though X does not really like +// them. You can toggle the border on/off, change the visual to +// switch between single/double buffer, and make the window take +// over the screen. +// +// Normally the program makes a single window with a child GL window. +// This simulates a program where the 3D display is surrounded by +// control knobs. Running the program with an argument will +// make it make a seperate GL window from the controls window. This +// simulates a (older?) style program where the graphics display is +// a different window than the controls. +// +// This program reports how many times it redraws the window to +// stdout, so you can see how much time it is wasting. It appears +// to be impossible to prevent X from sending redundant resize +// events, so there are extra redraws. But the way I have the +// code arranged here seems to be keeping that to a minimu. +// +// Apparently unavoidable bugs: +// +// Turning the border on causes an unnecessary redraw. +// +// Turning off full screen when the border is on causes an unnecessary +// resize and redraw when the program turns the border on. +// +// If it is a seperate window, turning double buffering on and off +// will cause the window to raise, deiconize, and possibly move. You +// can avoid this by making the Fl_Gl_Window a child of a normal +// window. +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "config.h" +#include +#include +#include +#include +#include +#include + +#if HAVE_GL +#include +#include + +class shape_window : public Fl_Gl_Window { + void draw(); +public: + int sides; + shape_window(int x,int y,int w,int h,const char *l=0); +}; + +shape_window::shape_window(int x,int y,int w,int h,const char *l) : +Fl_Gl_Window(x,y,w,h,l) { + sides = 3; +} + +void shape_window::draw() { + printf("drawing size %d %d\n",w(),h()); + if (!valid()) { + valid(1); +// printf("init\n"); + glLoadIdentity(); + glViewport(0,0,w(),h()); + } + glClear(GL_COLOR_BUFFER_BIT); + glColor3f(.5,.6,.7); + glBegin(GL_POLYGON); + for (int j = 0; j < sides; j ++) { + double ang = j*2*M_PI/sides; + glVertex3f(cos(ang),sin(ang),0); + } + glEnd(); +} + +#else + +#include + +class shape_window : public Fl_Window { + void draw(); +public: + int sides; + shape_window(int x,int y,int w,int h,const char *l=0); +}; + +shape_window::shape_window(int x,int y,int w,int h,const char *l) : +Fl_Window(x,y,w,h,l) { + sides = 3; +} + +void shape_window::draw() { + fl_color(0); + fl_rectf(0,0,w(),h()); + fl_font(0,20); + fl_color(7); + fl_draw("This requires GL",0,0,w(),h(),FL_ALIGN_CENTER); +} + +#endif + +void sides_cb(Fl_Widget *o, void *p) { + shape_window *sw = (shape_window *)p; + sw->sides = int(((Fl_Slider *)o)->value()); + sw->redraw(); +} + +#if HAVE_GL +void double_cb(Fl_Widget *o, void *p) { + shape_window *sw = (shape_window *)p; + int d = ((Fl_Button *)o)->value(); + sw->mode(d ? Fl_Mode(FL_DOUBLE|FL_RGB) : FL_RGB); +} +#else +void double_cb(Fl_Widget *, void *) {} +#endif + +void border_cb(Fl_Widget *o, void *p) { + Fl_Window *w = (Fl_Window *)p; + int d = ((Fl_Button *)o)->value(); + w->border(d); +#if defined(WIN32) || defined(__APPLE__) + int wx = w->x(), wy = w->y(); + w->hide(); w->show(); + w->position(wx, wy); +#endif +} + +int px,py,pw,ph; +Fl_Button *border_button; +void fullscreen_cb(Fl_Widget *o, void *p) { + Fl_Window *w = (Fl_Window *)p; + int d = ((Fl_Button *)o)->value(); + if (d) { + px = w->x(); + py = w->y(); + pw = w->w(); + ph = w->h(); + w->fullscreen(); + } else { + w->fullscreen_off(px,py,pw,ph); + } +} + +#include + +void exit_cb(Fl_Widget *, void *) { + exit(0); +} + +#define NUMB 5 + +int twowindow = 0; +int initfull = 0; +int arg(int, char **argv, int &i) { + if (argv[i][1] == '2') {twowindow = 1; i++; return 1;} + if (argv[i][1] == 'f') {initfull = 1; i++; return 1;} + return 0; +} + +int main(int argc, char **argv) { + + int i=0; + if (Fl::args(argc,argv,i,arg) < argc) + Fl::fatal("Options are:\n -2 = 2 windows\n -f = startup fullscreen\n%s",Fl::help); + + Fl_Single_Window window(300,300+30*NUMB); window.end(); + + shape_window sw(10,10,window.w()-20,window.h()-30*NUMB-20); +#if HAVE_GL + sw.mode(FL_RGB); +#endif + + Fl_Window *w; + if (twowindow) { // make it's own window + sw.resizable(&sw); + w = &sw; + window.set_modal(); // makes controls stay on top when fullscreen pushed + argc--; + sw.show(); + } else { // otherwise make a subwindow + window.add(sw); + window.resizable(&sw); + w = &window; + } + + window.begin(); + + int y = window.h()-30*NUMB-5; + Fl_Hor_Slider slider(50,y,window.w()-60,30,"Sides:"); + slider.align(FL_ALIGN_LEFT); + slider.callback(sides_cb,&sw); + slider.value(sw.sides); + slider.step(1); + slider.bounds(3,40); + y+=30; + + Fl_Toggle_Light_Button b1(50,y,window.w()-60,30,"Double Buffered"); + b1.callback(double_cb,&sw); + y+=30; + + Fl_Toggle_Light_Button b2(50,y,window.w()-60,30,"Border"); + b2.callback(border_cb,w); + b2.set(); + border_button = &b2; + y+=30; + + Fl_Toggle_Light_Button b3(50,y,window.w()-60,30,"FullScreen"); + b3.callback(fullscreen_cb,w); + y+=30; + + Fl_Button eb(50,y,window.w()-60,30,"Exit"); + eb.callback(exit_cb); + y+=30; + + if (initfull) {b3.set(); b3.do_callback();} + + window.end(); + window.show(argc,argv); + + return Fl::run(); +} + +// +// End of "$Id: fullscreen.cxx 5845 2007-05-20 00:01:06Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/gl_overlay.cxx b/third_party/windows/fltk-1.1.10/test/gl_overlay.cxx new file mode 100644 index 0000000..1a44fec --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/gl_overlay.cxx @@ -0,0 +1,157 @@ +// +// "$Id: gl_overlay.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// OpenGL overlay test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "config.h" +#include +#include +#include +#include +#include + +#if !HAVE_GL +#include +class shape_window : public Fl_Box { +public: + int sides; + shape_window(int x,int y,int w,int h,const char *l=0) + :Fl_Box(FL_DOWN_BOX,x,y,w,h,l){ + label("This demo does\nnot work without GL"); + } +}; +#else +#include +#include + +class shape_window : public Fl_Gl_Window { + void draw(); + void draw_overlay(); +public: + int sides; + int overlay_sides; + shape_window(int x,int y,int w,int h,const char *l=0); +}; + +shape_window::shape_window(int x,int y,int w,int h,const char *l) : +Fl_Gl_Window(x,y,w,h,l) { + sides = overlay_sides = 3; +} + +void shape_window::draw() { +// the valid() property may be used to avoid reinitializing your +// GL transformation for each redraw: + if (!valid()) { + valid(1); + glLoadIdentity(); + glViewport(0,0,w(),h()); + } +// draw an amazing but slow graphic: + glClear(GL_COLOR_BUFFER_BIT); + // for (int j=1; j<=1000; j++) { + glBegin(GL_POLYGON); + for (int j=0; jsides = int(((Fl_Slider *)o)->value()); + sw->redraw(); +} + +#if HAVE_GL +void overlay_sides_cb(Fl_Widget *o, void *p) { + shape_window *sw = (shape_window *)p; + sw->overlay_sides = int(((Fl_Slider *)o)->value()); + sw->redraw_overlay(); +} +#endif +#include +int main(int argc, char **argv) { + + Fl_Window window(300, 370); + + shape_window sw(10, 75, window.w()-20, window.h()-90); +//sw.mode(FL_RGB); + window.resizable(&sw); + + Fl_Hor_Slider slider(60, 5, window.w()-70, 30, "Sides:"); + slider.align(FL_ALIGN_LEFT); + slider.callback(sides_cb,&sw); + slider.value(sw.sides); + slider.step(1); + slider.bounds(3,40); + + Fl_Hor_Slider oslider(60, 40, window.w()-70, 30, "Overlay:"); + oslider.align(FL_ALIGN_LEFT); +#if HAVE_GL + oslider.callback(overlay_sides_cb,&sw); + oslider.value(sw.overlay_sides); +#endif + oslider.step(1); + oslider.bounds(3,40); + + window.end(); + window.show(argc,argv); +#if HAVE_GL + printf("Can do overlay = %d\n", sw.can_do_overlay()); + sw.show(); + sw.redraw_overlay(); +#else + sw.show(); +#endif + + return Fl::run(); +} + +// +// End of "$Id: gl_overlay.cxx 5845 2007-05-20 00:01:06Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/glpuzzle.cxx b/third_party/windows/fltk-1.1.10/test/glpuzzle.cxx new file mode 100644 index 0000000..464f660 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/glpuzzle.cxx @@ -0,0 +1,1486 @@ +// +// "$Id: glpuzzle.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// OpenGL puzzle demo for the Fast Light Tool Kit (FLTK). +// +// This is a GLUT demo program to demonstrate fltk's GLUT emulation. +// Search for "fltk" to find all the changes +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// this block added for fltk's distribtion so it will compile w/o OpenGL: +#include "config.h" +#if !HAVE_GL || !HAVE_GL_GLU_H +#include +#include +int main(int, char**) { + fl_alert("This demo does not work without GL and GLU"); + return 1; +} +#else +// end of added block + +#include +#include +#include +#include +#include +#include +#include // changed for fltk +#include // added for fltk +#include "trackball.c" // changed from trackball.h for fltk + +#define WIDTH 4 +#define HEIGHT 5 +#define PIECES 10 +#define OFFSETX -2 +#define OFFSETY -2.5 +#define OFFSETZ -0.5 + +typedef char Config[HEIGHT][WIDTH]; + +struct puzzle { + struct puzzle *backptr; + struct puzzle *solnptr; + Config pieces; + struct puzzle *next; + unsigned hashvalue; +}; + +#define HASHSIZE 10691 + +struct puzzlelist { + struct puzzle *puzzle; + struct puzzlelist *next; +}; + +static char convert[PIECES + 1] = +{0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 4}; + +static unsigned char colors[PIECES + 1][3] = +{ + {0, 0, 0}, + {255, 255, 127}, + {255, 255, 127}, + {255, 255, 127}, + {255, 255, 127}, + {255, 127, 255}, + {255, 127, 255}, + {255, 127, 255}, + {255, 127, 255}, + {255, 127, 127}, + {255, 255, 255}, +}; + +void changeState(void); + +static struct puzzle *hashtable[HASHSIZE]; +static struct puzzle *startPuzzle; +static struct puzzlelist *puzzles; +static struct puzzlelist *lastentry; + +int curX, curY, visible; + +#define MOVE_SPEED 0.2 +static unsigned char movingPiece; +static float move_x, move_y; +static float curquat[4]; +static int doubleBuffer = 1; +static int depth = 1; + +static char xsize[PIECES + 1] = +{0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2}; +static char ysize[PIECES + 1] = +{0, 1, 1, 1, 1, 2, 2, 2, 2, 1, 2}; +static float zsize[PIECES + 1] = +{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0.6}; + +static Config startConfig = +{ + {8, 10, 10, 7}, + {8, 10, 10, 7}, + {6, 9, 9, 5}, + {6, 4, 3, 5}, + {2, 0, 0, 1} +}; + +static Config thePuzzle = +{ + {8, 10, 10, 7}, + {8, 10, 10, 7}, + {6, 9, 9, 5}, + {6, 4, 3, 5}, + {2, 0, 0, 1} +}; + +static int xadds[4] = +{-1, 0, 1, 0}; +static int yadds[4] = +{0, -1, 0, 1}; + +static long W = 400, H = 300; +static GLint viewport[4]; + +#define srandom srand +#define random() (rand() >> 2) + +unsigned +hash(Config config) +{ + int i, j, value; + + value = 0; + for (i = 0; i < HEIGHT; i++) { + for (j = 0; j < WIDTH; j++) { + value = value + convert[(int)config[i][j]]; + value *= 6; + } + } + return (value); +} + +int +solution(Config config) +{ + if (config[4][1] == 10 && config[4][2] == 10) + return (1); + return (0); +} + +float boxcoords[][3] = +{ + {0.2, 0.2, 0.9}, + {0.8, 0.2, 0.9}, + {0.8, 0.8, 0.9}, + {0.2, 0.8, 0.9}, + {0.2, 0.1, 0.8}, + {0.8, 0.1, 0.8}, + {0.9, 0.2, 0.8}, + {0.9, 0.8, 0.8}, + {0.8, 0.9, 0.8}, + {0.2, 0.9, 0.8}, + {0.1, 0.8, 0.8}, + {0.1, 0.2, 0.8}, + {0.2, 0.1, 0.2}, + {0.8, 0.1, 0.2}, + {0.9, 0.2, 0.2}, + {0.9, 0.8, 0.2}, + {0.8, 0.9, 0.2}, + {0.2, 0.9, 0.2}, + {0.1, 0.8, 0.2}, + {0.1, 0.2, 0.2}, + {0.2, 0.2, 0.1}, + {0.8, 0.2, 0.1}, + {0.8, 0.8, 0.1}, + {0.2, 0.8, 0.1}, +}; + +float boxnormals[][3] = +{ + {0, 0, 1}, /* 0 */ + {0, 1, 0}, + {1, 0, 0}, + {0, 0, -1}, + {0, -1, 0}, + {-1, 0, 0}, + {0.7071, 0.7071, 0.0000}, /* 6 */ + {0.7071, -0.7071, 0.0000}, + {-0.7071, 0.7071, 0.0000}, + {-0.7071, -0.7071, 0.0000}, + {0.7071, 0.0000, 0.7071}, /* 10 */ + {0.7071, 0.0000, -0.7071}, + {-0.7071, 0.0000, 0.7071}, + {-0.7071, 0.0000, -0.7071}, + {0.0000, 0.7071, 0.7071}, /* 14 */ + {0.0000, 0.7071, -0.7071}, + {0.0000, -0.7071, 0.7071}, + {0.0000, -0.7071, -0.7071}, + {0.5774, 0.5774, 0.5774}, /* 18 */ + {0.5774, 0.5774, -0.5774}, + {0.5774, -0.5774, 0.5774}, + {0.5774, -0.5774, -0.5774}, + {-0.5774, 0.5774, 0.5774}, + {-0.5774, 0.5774, -0.5774}, + {-0.5774, -0.5774, 0.5774}, + {-0.5774, -0.5774, -0.5774}, +}; + +int boxfaces[][4] = +{ + {0, 1, 2, 3}, /* 0 */ + {9, 8, 16, 17}, + {6, 14, 15, 7}, + {20, 23, 22, 21}, + {12, 13, 5, 4}, + {19, 11, 10, 18}, + {7, 15, 16, 8}, /* 6 */ + {13, 14, 6, 5}, + {18, 10, 9, 17}, + {19, 12, 4, 11}, + {1, 6, 7, 2}, /* 10 */ + {14, 21, 22, 15}, + {11, 0, 3, 10}, + {20, 19, 18, 23}, + {3, 2, 8, 9}, /* 14 */ + {17, 16, 22, 23}, + {4, 5, 1, 0}, + {20, 21, 13, 12}, + {2, 7, 8, -1}, /* 18 */ + {16, 15, 22, -1}, + {5, 6, 1, -1}, + {13, 21, 14, -1}, + {10, 3, 9, -1}, + {18, 17, 23, -1}, + {11, 4, 0, -1}, + {20, 12, 19, -1}, +}; + +#define NBOXFACES (sizeof(boxfaces)/sizeof(boxfaces[0])) + +/* Draw a box. Bevel as desired. */ +void +drawBox(int piece, float xoff, float yoff) +{ + int xlen, ylen; + int i, k; + float x, y, z; + float zlen; + float *v; + + xlen = xsize[piece]; + ylen = ysize[piece]; + zlen = zsize[piece]; + + glColor3ubv(colors[piece]); + glBegin(GL_QUADS); + for (i = 0; i < 18; i++) { + glNormal3fv(boxnormals[i]); + for (k = 0; k < 4; k++) { + if (boxfaces[i][k] == -1) + continue; + v = boxcoords[boxfaces[i][k]]; + x = v[0] + OFFSETX; + if (v[0] > 0.5) + x += xlen - 1; + y = v[1] + OFFSETY; + if (v[1] > 0.5) + y += ylen - 1; + z = v[2] + OFFSETZ; + if (v[2] > 0.5) + z += zlen - 1; + glVertex3f(xoff + x, yoff + y, z); + } + } + glEnd(); + glBegin(GL_TRIANGLES); + for (i = 18; i < int(NBOXFACES); i++) { + glNormal3fv(boxnormals[i]); + for (k = 0; k < 3; k++) { + if (boxfaces[i][k] == -1) + continue; + v = boxcoords[boxfaces[i][k]]; + x = v[0] + OFFSETX; + if (v[0] > 0.5) + x += xlen - 1; + y = v[1] + OFFSETY; + if (v[1] > 0.5) + y += ylen - 1; + z = v[2] + OFFSETZ; + if (v[2] > 0.5) + z += zlen - 1; + glVertex3f(xoff + x, yoff + y, z); + } + } + glEnd(); +} + +float containercoords[][3] = +{ + {-0.1, -0.1, 1.0}, + {-0.1, -0.1, -0.1}, + {4.1, -0.1, -0.1}, + {4.1, -0.1, 1.0}, + {1.0, -0.1, 0.6}, /* 4 */ + {3.0, -0.1, 0.6}, + {1.0, -0.1, 0.0}, + {3.0, -0.1, 0.0}, + {1.0, 0.0, 0.0}, /* 8 */ + {3.0, 0.0, 0.0}, + {3.0, 0.0, 0.6}, + {1.0, 0.0, 0.6}, + {0.0, 0.0, 1.0}, /* 12 */ + {4.0, 0.0, 1.0}, + {4.0, 0.0, 0.0}, + {0.0, 0.0, 0.0}, + {0.0, 5.0, 0.0}, /* 16 */ + {0.0, 5.0, 1.0}, + {4.0, 5.0, 1.0}, + {4.0, 5.0, 0.0}, + {-0.1, 5.1, -0.1}, /* 20 */ + {4.1, 5.1, -0.1}, + {4.1, 5.1, 1.0}, + {-0.1, 5.1, 1.0}, +}; + +float containernormals[][3] = +{ + {0, -1, 0}, + {0, -1, 0}, + {0, -1, 0}, + {0, -1, 0}, + {0, -1, 0}, + {0, 1, 0}, + {0, 1, 0}, + {0, 1, 0}, + {1, 0, 0}, + {1, 0, 0}, + {1, 0, 0}, + {-1, 0, 0}, + {-1, 0, 0}, + {-1, 0, 0}, + {0, 1, 0}, + {0, 0, -1}, + {0, 0, -1}, + {0, 0, 1}, + {0, 0, 1}, + {0, 0, 1}, + {0, 0, 1}, + {0, 0, 1}, + {0, 0, 1}, + {0, 0, 1}, +}; + +int containerfaces[][4] = +{ + {1, 6, 4, 0}, + {0, 4, 5, 3}, + {1, 2, 7, 6}, + {7, 2, 3, 5}, + {16, 19, 18, 17}, + + {23, 22, 21, 20}, + {12, 11, 8, 15}, + {10, 13, 14, 9}, + + {15, 16, 17, 12}, + {2, 21, 22, 3}, + {6, 8, 11, 4}, + + {1, 0, 23, 20}, + {14, 13, 18, 19}, + {9, 7, 5, 10}, + + {12, 13, 10, 11}, + + {1, 20, 21, 2}, + {4, 11, 10, 5}, + + {15, 8, 19, 16}, + {19, 8, 9, 14}, + {8, 6, 7, 9}, + {0, 3, 13, 12}, + {13, 3, 22, 18}, + {18, 22, 23, 17}, + {17, 23, 0, 12}, +}; + +#define NCONTFACES (sizeof(containerfaces)/sizeof(containerfaces[0])) + +/* Draw the container */ +void +drawContainer(void) +{ + int i, k; + float *v; + + /* Y is reversed here because the model has it reversed */ + + /* Arbitrary bright wood-like color */ + glColor3ub(209, 103, 23); + glBegin(GL_QUADS); + for (i = 0; i < int(NCONTFACES); i++) { + v = containernormals[i]; + glNormal3f(v[0], -v[1], v[2]); + for (k = 3; k >= 0; k--) { + v = containercoords[containerfaces[i][k]]; + glVertex3f(v[0] + OFFSETX, -(v[1] + OFFSETY), v[2] + OFFSETZ); + } + } + glEnd(); +} + +void +drawAll(void) +{ + int i, j; + int piece; + char done[PIECES + 1]; + float m[4][4]; + + build_rotmatrix(m, curquat); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, 0, -10); + glMultMatrixf(&(m[0][0])); + glRotatef(180, 0, 0, 1); + + if (depth) { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + } else { + glClear(GL_COLOR_BUFFER_BIT); + } + for (i = 1; i <= PIECES; i++) { + done[i] = 0; + } + glLoadName(0); + drawContainer(); + for (i = 0; i < HEIGHT; i++) { + for (j = 0; j < WIDTH; j++) { + piece = thePuzzle[i][j]; + if (piece == 0) + continue; + if (done[piece]) + continue; + done[piece] = 1; + glLoadName(piece); + if (piece == movingPiece) { + drawBox(piece, move_x, move_y); + } else { + drawBox(piece, j, i); + } + } + } +} + +void +redraw(void) +{ + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45, viewport[2]*1.0/viewport[3], 0.1, 100.0); + + drawAll(); + + if (doubleBuffer) + glutSwapBuffers(); + else + glFinish(); +} + +void +solidifyChain(struct puzzle *puzzle) +{ + int i; + char buf[256]; + + i = 0; + while (puzzle->backptr) { + i++; + puzzle->backptr->solnptr = puzzle; + puzzle = puzzle->backptr; + } + sprintf(buf, "%d moves to complete!", i); + glutSetWindowTitle(buf); +} + +int +addConfig(Config config, struct puzzle *back) +{ + unsigned hashvalue; + struct puzzle *newpiece; + struct puzzlelist *newlistentry; + + hashvalue = hash(config); + + newpiece = hashtable[hashvalue % HASHSIZE]; + while (newpiece != NULL) { + if (newpiece->hashvalue == hashvalue) { + int i, j; + + for (i = 0; i < WIDTH; i++) { + for (j = 0; j < HEIGHT; j++) { + if (convert[(int)config[j][i]] != + convert[(int)newpiece->pieces[j][i]]) + goto nomatch; + } + } + return 0; + } + nomatch: + newpiece = newpiece->next; + } + + newpiece = (struct puzzle *) malloc(sizeof(struct puzzle)); + newpiece->next = hashtable[hashvalue % HASHSIZE]; + newpiece->hashvalue = hashvalue; + memcpy(newpiece->pieces, config, HEIGHT * WIDTH); + newpiece->backptr = back; + newpiece->solnptr = NULL; + hashtable[hashvalue % HASHSIZE] = newpiece; + + newlistentry = (struct puzzlelist *) malloc(sizeof(struct puzzlelist)); + newlistentry->puzzle = newpiece; + newlistentry->next = NULL; + + if (lastentry) { + lastentry->next = newlistentry; + } else { + puzzles = newlistentry; + } + lastentry = newlistentry; + + if (back == NULL) { + startPuzzle = newpiece; + } + if (solution(config)) { + solidifyChain(newpiece); + return 1; + } + return 0; +} + +/* Checks if a space can move */ +int +canmove0(Config pieces, int x, int y, int dir, Config newpieces) +{ + char piece; + int xadd, yadd; + int l, m; + + xadd = xadds[dir]; + yadd = yadds[dir]; + + if (x + xadd < 0 || x + xadd >= WIDTH || + y + yadd < 0 || y + yadd >= HEIGHT) + return 0; + piece = pieces[y + yadd][x + xadd]; + if (piece == 0) + return 0; + memcpy(newpieces, pieces, HEIGHT * WIDTH); + for (l = 0; l < WIDTH; l++) { + for (m = 0; m < HEIGHT; m++) { + if (newpieces[m][l] == piece) + newpieces[m][l] = 0; + } + } + xadd = -xadd; + yadd = -yadd; + for (l = 0; l < WIDTH; l++) { + for (m = 0; m < HEIGHT; m++) { + if (pieces[m][l] == piece) { + int newx, newy; + + newx = l + xadd; + newy = m + yadd; + if (newx < 0 || newx >= WIDTH || + newy < 0 || newy >= HEIGHT) + return 0; + if (newpieces[newy][newx] != 0) + return 0; + newpieces[newy][newx] = piece; + } + } + } + return 1; +} + +/* Checks if a piece can move */ +int +canmove(Config pieces, int x, int y, int dir, Config newpieces) +{ + int xadd, yadd; + + xadd = xadds[dir]; + yadd = yadds[dir]; + + if (x + xadd < 0 || x + xadd >= WIDTH || + y + yadd < 0 || y + yadd >= HEIGHT) + return 0; + if (pieces[y + yadd][x + xadd] == pieces[y][x]) { + return canmove(pieces, x + xadd, y + yadd, dir, newpieces); + } + if (pieces[y + yadd][x + xadd] != 0) + return 0; + return canmove0(pieces, x + xadd, y + yadd, (dir + 2) % 4, newpieces); +} + +int +generateNewConfigs(struct puzzle *puzzle) +{ + int i, j, k; + Config pieces; + Config newpieces; + + memcpy(pieces, puzzle->pieces, HEIGHT * WIDTH); + for (i = 0; i < WIDTH; i++) { + for (j = 0; j < HEIGHT; j++) { + if (pieces[j][i] == 0) { + for (k = 0; k < 4; k++) { + if (canmove0(pieces, i, j, k, newpieces)) { + if (addConfig(newpieces, puzzle)) + return 1; + } + } + } + } + } + return 0; +} + +void +freeSolutions(void) +{ + struct puzzlelist *nextpuz; + struct puzzle *puzzle, *next; + int i; + + while (puzzles) { + nextpuz = puzzles->next; + free((char *) puzzles); + puzzles = nextpuz; + } + lastentry = NULL; + for (i = 0; i < HASHSIZE; i++) { + puzzle = hashtable[i]; + hashtable[i] = NULL; + while (puzzle) { + next = puzzle->next; + free((char *) puzzle); + puzzle = next; + } + } + startPuzzle = NULL; +} + +int +continueSolving(void) +{ + struct puzzle *nextpuz; + int i, j; + int movedPiece; + int movedir; + int fromx, fromy; + int tox, toy; + + if (startPuzzle == NULL) + return 0; + if (startPuzzle->solnptr == NULL) { + freeSolutions(); + return 0; + } + nextpuz = startPuzzle->solnptr; + movedPiece = 0; + movedir = 0; + for (i = 0; i < HEIGHT; i++) { + for (j = 0; j < WIDTH; j++) { + if (startPuzzle->pieces[i][j] != nextpuz->pieces[i][j]) { + if (startPuzzle->pieces[i][j]) { + movedPiece = startPuzzle->pieces[i][j]; + fromx = j; + fromy = i; + if (i < HEIGHT - 1 && nextpuz->pieces[i + 1][j] == movedPiece) { + movedir = 3; + } else { + movedir = 2; + } + goto found_piece; + } else { + movedPiece = nextpuz->pieces[i][j]; + if (i < HEIGHT - 1 && + startPuzzle->pieces[i + 1][j] == movedPiece) { + fromx = j; + fromy = i + 1; + movedir = 1; + } else { + fromx = j + 1; + fromy = i; + movedir = 0; + } + goto found_piece; + } + } + } + } + glutSetWindowTitle((char *)"What! No change?"); + freeSolutions(); + return 0; + +found_piece: + if (!movingPiece) { + movingPiece = movedPiece; + move_x = fromx; + move_y = fromy; + } + move_x += xadds[movedir] * MOVE_SPEED; + move_y += yadds[movedir] * MOVE_SPEED; + + tox = fromx + xadds[movedir]; + toy = fromy + yadds[movedir]; + + if (move_x > tox - MOVE_SPEED / 2 && move_x < tox + MOVE_SPEED / 2 && + move_y > toy - MOVE_SPEED / 2 && move_y < toy + MOVE_SPEED / 2) { + startPuzzle = nextpuz; + movingPiece = 0; + } + memcpy(thePuzzle, startPuzzle->pieces, HEIGHT * WIDTH); + changeState(); + return 1; +} + +int +solvePuzzle(void) +{ + struct puzzlelist *nextpuz; + char buf[256]; + int i; + + if (solution(thePuzzle)) { + glutSetWindowTitle((char *)"Puzzle already solved!"); + return 0; + } + addConfig(thePuzzle, NULL); + i = 0; + + while (puzzles) { + i++; + if (generateNewConfigs(puzzles->puzzle)) + break; + nextpuz = puzzles->next; + free((char *) puzzles); + puzzles = nextpuz; + } + if (puzzles == NULL) { + freeSolutions(); + sprintf(buf, "I can't solve it! (%d positions examined)", i); + glutSetWindowTitle(buf); + return 1; + } + return 1; +} + +int +selectPiece(int mousex, int mousey) +{ + long hits; + GLuint selectBuf[1024]; + GLuint closest; + GLuint dist; + + glSelectBuffer(1024, selectBuf); + (void) glRenderMode(GL_SELECT); + glInitNames(); + + /* Because LoadName() won't work with no names on the stack */ + glPushName(0); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPickMatrix(mousex, H - mousey, 4, 4, viewport); + gluPerspective(45, viewport[2]*1.0/viewport[3], 0.1, 100.0); + + drawAll(); + + hits = glRenderMode(GL_RENDER); + if (hits <= 0) { + return 0; + } + closest = 0; + dist = 0xFFFFFFFFU; //2147483647; + while (hits) { + if (selectBuf[(hits - 1) * 4 + 1] < dist) { + dist = selectBuf[(hits - 1) * 4 + 1]; + closest = selectBuf[(hits - 1) * 4 + 3]; + } + hits--; + } + return closest; +} + +void +nukePiece(int piece) +{ + int i, j; + + for (i = 0; i < HEIGHT; i++) { + for (j = 0; j < WIDTH; j++) { + if (thePuzzle[i][j] == piece) { + thePuzzle[i][j] = 0; + } + } + } +} + +void +multMatrices(const GLfloat a[16], const GLfloat b[16], GLfloat r[16]) +{ + int i, j; + + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + r[i * 4 + j] = + a[i * 4 + 0] * b[0 * 4 + j] + + a[i * 4 + 1] * b[1 * 4 + j] + + a[i * 4 + 2] * b[2 * 4 + j] + + a[i * 4 + 3] * b[3 * 4 + j]; + } + } +} + +void +makeIdentity(GLfloat m[16]) +{ + m[0 + 4 * 0] = 1; + m[0 + 4 * 1] = 0; + m[0 + 4 * 2] = 0; + m[0 + 4 * 3] = 0; + m[1 + 4 * 0] = 0; + m[1 + 4 * 1] = 1; + m[1 + 4 * 2] = 0; + m[1 + 4 * 3] = 0; + m[2 + 4 * 0] = 0; + m[2 + 4 * 1] = 0; + m[2 + 4 * 2] = 1; + m[2 + 4 * 3] = 0; + m[3 + 4 * 0] = 0; + m[3 + 4 * 1] = 0; + m[3 + 4 * 2] = 0; + m[3 + 4 * 3] = 1; +} + +/* + ** inverse = invert(src) + */ +int +invertMatrix(const GLfloat src[16], GLfloat inverse[16]) +{ + int i, j, k, swap; + double t; + GLfloat temp[4][4]; + + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + temp[i][j] = src[i * 4 + j]; + } + } + makeIdentity(inverse); + + for (i = 0; i < 4; i++) { + /* + ** Look for largest element in column */ + swap = i; + for (j = i + 1; j < 4; j++) { + if (fabs(temp[j][i]) > fabs(temp[i][i])) { + swap = j; + } + } + + if (swap != i) { + /* + ** Swap rows. */ + for (k = 0; k < 4; k++) { + t = temp[i][k]; + temp[i][k] = temp[swap][k]; + temp[swap][k] = t; + + t = inverse[i * 4 + k]; + inverse[i * 4 + k] = inverse[swap * 4 + k]; + inverse[swap * 4 + k] = t; + } + } + if (temp[i][i] == 0) { + /* + ** No non-zero pivot. The matrix is singular, which + shouldn't ** happen. This means the user gave us a + bad matrix. */ + return 0; + } + t = temp[i][i]; + for (k = 0; k < 4; k++) { + temp[i][k] /= t; + inverse[i * 4 + k] /= t; + } + for (j = 0; j < 4; j++) { + if (j != i) { + t = temp[j][i]; + for (k = 0; k < 4; k++) { + temp[j][k] -= temp[i][k] * t; + inverse[j * 4 + k] -= inverse[i * 4 + k] * t; + } + } + } + } + return 1; +} + +/* + ** This is a screwball function. What it does is the following: + ** Given screen x and y coordinates, compute the corresponding object space + ** x and y coordinates given that the object space z is 0.9 + OFFSETZ. + ** Since the tops of (most) pieces are at z = 0.9 + OFFSETZ, we use that + ** number. + */ +int +computeCoords(int piece, int mousex, int mousey, + GLfloat * selx, GLfloat * sely) +{ + GLfloat modelMatrix[16]; + GLfloat projMatrix[16]; + GLfloat finalMatrix[16]; + GLfloat in[4]; + GLfloat a, b, c, d; + GLfloat top, bot; + GLfloat z; + GLfloat w; + GLfloat height; + + if (piece == 0) + return 0; + height = zsize[piece] - 0.1 + OFFSETZ; + + glGetFloatv(GL_PROJECTION_MATRIX, projMatrix); + glGetFloatv(GL_MODELVIEW_MATRIX, modelMatrix); + multMatrices(modelMatrix, projMatrix, finalMatrix); + if (!invertMatrix(finalMatrix, finalMatrix)) + return 0; + + in[0] = (2.0 * (mousex - viewport[0]) / viewport[2]) - 1; + in[1] = (2.0 * ((H - mousey) - viewport[1]) / viewport[3]) - 1; + + a = in[0] * finalMatrix[0 * 4 + 2] + + in[1] * finalMatrix[1 * 4 + 2] + + finalMatrix[3 * 4 + 2]; + b = finalMatrix[2 * 4 + 2]; + c = in[0] * finalMatrix[0 * 4 + 3] + + in[1] * finalMatrix[1 * 4 + 3] + + finalMatrix[3 * 4 + 3]; + d = finalMatrix[2 * 4 + 3]; + + /* + ** Ok, now we need to solve for z: ** (a + b z) / (c + d + + z) = height. ** ("height" is the height in object space we + + want to solve z for) ** ** ==> a + b z = height c + + height d z ** bz - height d z = height c - a ** z = + (height c - a) / (b - height d) */ + top = height * c - a; + bot = b - height * d; + if (bot == 0.0) + return 0; + + z = top / bot; + + /* + ** Ok, no problem. ** Now we solve for x and y. We know + that w = c + d z, so we compute it. */ + w = c + d * z; + + /* + ** Now for x and y: */ + *selx = (in[0] * finalMatrix[0 * 4 + 0] + + in[1] * finalMatrix[1 * 4 + 0] + + z * finalMatrix[2 * 4 + 0] + + finalMatrix[3 * 4 + 0]) / w - OFFSETX; + *sely = (in[0] * finalMatrix[0 * 4 + 1] + + in[1] * finalMatrix[1 * 4 + 1] + + z * finalMatrix[2 * 4 + 1] + + finalMatrix[3 * 4 + 1]) / w - OFFSETY; + return 1; +} + +static int selected; +static int selectx, selecty; +static float selstartx, selstarty; + +void +grabPiece(int piece, float selx, float sely) +{ + int hit; + + selectx = int(selx); + selecty = int(sely); + if (selectx < 0 || selecty < 0 || selectx >= WIDTH || selecty >= HEIGHT) { + return; + } + hit = thePuzzle[selecty][selectx]; + if (hit != piece) + return; + if (hit) { + movingPiece = hit; + while (selectx > 0 && thePuzzle[selecty][selectx - 1] == movingPiece) { + selectx--; + } + while (selecty > 0 && thePuzzle[selecty - 1][selectx] == movingPiece) { + selecty--; + } + move_x = selectx; + move_y = selecty; + selected = 1; + selstartx = selx; + selstarty = sely; + } else { + selected = 0; + } + changeState(); +} + +void +moveSelection(float selx, float sely) +{ + float deltax, deltay; + int dir; + Config newpieces; + + if (!selected) + return; + deltax = selx - selstartx; + deltay = sely - selstarty; + + if (fabs(deltax) > fabs(deltay)) { + deltay = 0; + if (deltax > 0) { + if (deltax > 1) + deltax = 1; + dir = 2; + } else { + if (deltax < -1) + deltax = -1; + dir = 0; + } + } else { + deltax = 0; + if (deltay > 0) { + if (deltay > 1) + deltay = 1; + dir = 3; + } else { + if (deltay < -1) + deltay = -1; + dir = 1; + } + } + if (canmove(thePuzzle, selectx, selecty, dir, newpieces)) { + move_x = deltax + selectx; + move_y = deltay + selecty; + if (deltax > 0.5) { + memcpy(thePuzzle, newpieces, HEIGHT * WIDTH); + selectx++; + selstartx++; + } else if (deltax < -0.5) { + memcpy(thePuzzle, newpieces, HEIGHT * WIDTH); + selectx--; + selstartx--; + } else if (deltay > 0.5) { + memcpy(thePuzzle, newpieces, HEIGHT * WIDTH); + selecty++; + selstarty++; + } else if (deltay < -0.5) { + memcpy(thePuzzle, newpieces, HEIGHT * WIDTH); + selecty--; + selstarty--; + } + } else { + if (deltay > 0 && thePuzzle[selecty][selectx] == 10 && + selectx == 1 && selecty == 3) { + /* Allow visual movement of solution piece outside of the + + box */ + move_x = selectx; + move_y = sely - selstarty + selecty; + } else { + move_x = selectx; + move_y = selecty; + } + } +} + +void +dropSelection(void) +{ + if (!selected) + return; + movingPiece = 0; + selected = 0; + changeState(); +} + +static int left_mouse, middle_mouse; +static int mousex, mousey; +static int solving; +static int spinning; +static float lastquat[4]; +static int sel_piece; + +static void +Reshape(int width, int height) +{ + + W = width; + H = height; + glViewport(0, 0, W, H); + glGetIntegerv(GL_VIEWPORT, viewport); +} + +void +toggleSolve(void) +{ + if (solving) { + freeSolutions(); + solving = 0; + glutChangeToMenuEntry(1, (char *)"Solving", 1); + glutSetWindowTitle((char *)"glpuzzle"); + movingPiece = 0; + } else { + glutChangeToMenuEntry(1, (char *)"Stop solving", 1); + glutSetWindowTitle((char *)"Solving..."); + if (solvePuzzle()) { + solving = 1; + } + } + changeState(); + glutPostRedisplay(); +} + +void reset(void) +{ + if (solving) { + freeSolutions(); + solving = 0; + glutChangeToMenuEntry(1, (char *)"Solving", 1); + glutSetWindowTitle((char *)"glpuzzle"); + movingPiece = 0; + changeState(); + } + memcpy(thePuzzle, startConfig, HEIGHT * WIDTH); + glutPostRedisplay(); +} + +void +keyboard(unsigned char c, int x, int y) +{ + int piece; + + switch (c) { + case 27: + exit(0); + break; + case 'D': + case 'd': + if (solving) { + freeSolutions(); + solving = 0; + glutChangeToMenuEntry(1, (char *)"Solving", 1); + glutSetWindowTitle((char *)"glpuzzle"); + movingPiece = 0; + changeState(); + } + piece = selectPiece(x, y); + if (piece) { + nukePiece(piece); + } + glutPostRedisplay(); + break; + case 'R': + case 'r': + reset(); + break; + case 'S': + case 's': + toggleSolve(); + break; + case 'b': + case 'B': + depth = 1 - depth; + if (depth) { + glEnable(GL_DEPTH_TEST); + } else { + glDisable(GL_DEPTH_TEST); + } + glutPostRedisplay(); + break; + default: + break; + } +} + +void +motion(int x, int y) +{ + float selx, sely; + + if (middle_mouse && !left_mouse) { + if (mousex != x || mousey != y) { + trackball(lastquat, + (2.0*mousex - W) / W, + (H - 2.0*mousey) / H, + (2.0*x - W) / W, + (H - 2.0*y) / H); + spinning = 1; + } else { + spinning = 0; + } + changeState(); + } else { + computeCoords(sel_piece, x, y, &selx, &sely); + moveSelection(selx, sely); + } + mousex = x; + mousey = y; + glutPostRedisplay(); +} + +void +mouse(int b, int s, int x, int y) +{ + float selx, sely; + + mousex = x; + mousey = y; + curX = x; + curY = y; + if (s == GLUT_DOWN) { + switch (b) { + case GLUT_LEFT_BUTTON: + if (solving) { + freeSolutions(); + solving = 0; + glutChangeToMenuEntry(1, (char *)"Solving", 1); + glutSetWindowTitle((char *)"glpuzzle"); + movingPiece = 0; + } + left_mouse = GL_TRUE; + sel_piece = selectPiece(mousex, mousey); + if (!sel_piece) { + left_mouse = GL_FALSE; + middle_mouse = GL_TRUE; // let it rotate object + } else if (computeCoords(sel_piece, mousex, mousey, &selx, &sely)) { + grabPiece(sel_piece, selx, sely); + } + glutPostRedisplay(); + break; + case GLUT_MIDDLE_BUTTON: + middle_mouse = GL_TRUE; + glutPostRedisplay(); + break; + } + } else { + if (left_mouse) { + left_mouse = GL_FALSE; + dropSelection(); + glutPostRedisplay(); + } else if (middle_mouse) { + middle_mouse = GL_FALSE; + glutPostRedisplay(); + } + } + motion(x, y); +} + +void +animate(void) +{ + if (spinning) { + add_quats(lastquat, curquat, curquat); + } + glutPostRedisplay(); + if (solving) { + if (!continueSolving()) { + solving = 0; + glutChangeToMenuEntry(1, (char *)"Solving", 1); + glutSetWindowTitle((char *)"glpuzzle"); + } + } + if ((!solving && !spinning) || !visible) { + glutIdleFunc(NULL); + } +} + +void +changeState(void) +{ + if (visible) { + if (!solving && !spinning) { + glutIdleFunc(NULL); + } else { + glutIdleFunc(animate); + } + } else { + glutIdleFunc(NULL); + } +} + +void +init(void) +{ + static float lmodel_ambient[] = + {0.0, 0.0, 0.0, 0.0}; + static float lmodel_twoside[] = + {GL_FALSE}; + static float lmodel_local[] = + {GL_FALSE}; + static float light0_ambient[] = + {0.1, 0.1, 0.1, 1.0}; + static float light0_diffuse[] = + {1.0, 1.0, 1.0, 0.0}; + static float light0_position[] = + {0.8660254, 0.5, 1, 0}; + static float light0_specular[] = + {0.0, 0.0, 0.0, 0.0}; + static float bevel_mat_ambient[] = + {0.0, 0.0, 0.0, 1.0}; + static float bevel_mat_shininess[] = + {40.0}; + static float bevel_mat_specular[] = + {0.0, 0.0, 0.0, 0.0}; + static float bevel_mat_diffuse[] = + {1.0, 0.0, 0.0, 0.0}; + + glEnable(GL_CULL_FACE); + glCullFace(GL_BACK); + glEnable(GL_DEPTH_TEST); + glClearDepth(1.0); + + glClearColor(0.5, 0.5, 0.5, 0.0); + glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse); + glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular); + glLightfv(GL_LIGHT0, GL_POSITION, light0_position); + glEnable(GL_LIGHT0); + + glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local); + glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside); + glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); + glEnable(GL_LIGHTING); + + glMaterialfv(GL_FRONT, GL_AMBIENT, bevel_mat_ambient); + glMaterialfv(GL_FRONT, GL_SHININESS, bevel_mat_shininess); + glMaterialfv(GL_FRONT, GL_SPECULAR, bevel_mat_specular); + glMaterialfv(GL_FRONT, GL_DIFFUSE, bevel_mat_diffuse); + + glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); + glEnable(GL_COLOR_MATERIAL); + glShadeModel(GL_FLAT); + + trackball(curquat, 0.0, 0.0, 0.0, 0.0); + srandom(time(NULL)); +} + +static void +Usage(void) +{ + puts("Usage: puzzle [-s]"); + puts(" -s: Run in single buffered mode"); + exit(-1); +} + +void +visibility(int v) +{ + if (v == GLUT_VISIBLE) { + visible = 1; + } else { + visible = 0; + } + changeState(); +} + +void +menu(int choice) +{ + switch(choice) { + case 1: + toggleSolve(); + break; + case 2: + reset(); + break; + case 3: + exit(0); + break; + } +} + +int +main(int argc, char **argv) +{ + long i; + + glutInit(&argc, argv); + for (i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + switch (argv[i][1]) { + case 's': + doubleBuffer = 0; + break; + default: + Usage(); + } + } else { + Usage(); + } + } + + glutInitWindowSize(W, H); + if (doubleBuffer) { + glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE | GLUT_MULTISAMPLE); + } else { + glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_SINGLE | GLUT_MULTISAMPLE); + } + + glutCreateWindow("glpuzzle"); + visible = 1; // added for fltk, bug in original program? + + init(); + + glGetIntegerv(GL_VIEWPORT, viewport); + + puts(""); + puts("r Reset puzzle"); + puts("s Solve puzzle (may take a few seconds to compute)"); + puts("d Destroy a piece - makes the puzzle easier"); + puts("b Toggles the depth buffer on and off"); + puts(""); + puts("Left mouse moves pieces"); + puts("Middle mouse spins the puzzle"); + puts("Right mouse has menu"); + + glutReshapeFunc(Reshape); + glutDisplayFunc(redraw); + glutKeyboardFunc(keyboard); + glutMotionFunc(motion); + glutMouseFunc(mouse); + glutVisibilityFunc(visibility); + glutCreateMenu(menu); + glutAddMenuEntry((char *)"Solve", 1); + glutAddMenuEntry((char *)"Reset", 2); + glutAddMenuEntry((char *)"Quit", 3); + glutAttachMenu(GLUT_RIGHT_BUTTON); + glutMainLoop(); + return 0; /* ANSI C requires main to return int. */ +} + +#endif // added for fltk's distribution + +// +// End of "$Id: glpuzzle.cxx 5845 2007-05-20 00:01:06Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/hello.cxx b/third_party/windows/fltk-1.1.10/test/hello.cxx new file mode 100644 index 0000000..b6f9e76 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/hello.cxx @@ -0,0 +1,47 @@ +// +// "$Id: hello.cxx 6102 2008-04-21 19:54:34Z matt $" +// +// Hello, World! program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include + +int main(int argc, char **argv) { + Fl_Window *window = new Fl_Window(300,180); + Fl_Box *box = new Fl_Box(FL_UP_BOX,20,40,260,100,"Hello, World!"); + box->labelfont(FL_BOLD+FL_ITALIC); + box->labelsize(36); + box->labeltype(FL_SHADOW_LABEL); + window->end(); + window->show(argc, argv); + return Fl::run(); +} + +// +// End of "$Id: hello.cxx 6102 2008-04-21 19:54:34Z matt $". +// + diff --git a/third_party/windows/fltk-1.1.10/test/help.cxx b/third_party/windows/fltk-1.1.10/test/help.cxx new file mode 100644 index 0000000..7926938 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/help.cxx @@ -0,0 +1,69 @@ +// +// "$Id: help.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Fl_Help_Dialog test program. +// +// Copyright 1999-2005 by Easy Software Products. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// main() - Display the help GUI... +// + +// +// Include necessary headers... +// + +#include + + +// +// 'main()' - Display the help GUI... +// + +int // O - Exit status +main(int argc, // I - Number of command-line arguments + char *argv[]) // I - Command-line arguments +{ + Fl_Help_Dialog *help; // Help dialog + + + help = new Fl_Help_Dialog; + + if (argc < 2) + help->load("../documentation/index.html"); + else + help->load(argv[1]); + + help->show(1, argv); + + Fl::run(); + + delete help; + + return (0); +} + + +// +// End of "$Id: help.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/iconize.cxx b/third_party/windows/fltk-1.1.10/test/iconize.cxx new file mode 100644 index 0000000..029eddc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/iconize.cxx @@ -0,0 +1,83 @@ +// +// "$Id: iconize.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Iconize test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +void iconize_cb(Fl_Widget *, void *v) { + Fl_Window *w = (Fl_Window *)v; + w->iconize(); +} + +void show_cb(Fl_Widget *, void *v) { + Fl_Window *w = (Fl_Window *)v; + w->show(); +} + +void hide_cb(Fl_Widget *, void *v) { + Fl_Window *w = (Fl_Window *)v; + w->hide(); +} + +void window_cb(Fl_Widget*, void*) { + exit(0); +} + +int main(int argc, char **argv) { + + Fl_Window mainw(200,200); + mainw.end(); + mainw.show(argc,argv); + + Fl_Window control(120,120); + + Fl_Button hide_button(0,0,120,30,"hide()"); + hide_button.callback(hide_cb, &mainw); + + Fl_Button iconize_button(0,30,120,30,"iconize()"); + iconize_button.callback(iconize_cb, &mainw); + + Fl_Button show_button(0,60,120,30,"show()"); + show_button.callback(show_cb, &mainw); + + Fl_Button show_button2(0,90,120,30,"show this"); + show_button2.callback(show_cb, &control); + + // Fl_Box box(FL_NO_BOX,0,60,120,30,"Also try running\nwith -i switch"); + + control.end(); + control.show(); + control.callback(window_cb); + return Fl::run(); +} + +// +// End of "$Id: iconize.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/image.cxx b/third_party/windows/fltk-1.1.10/test/image.cxx new file mode 100644 index 0000000..197af20 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/image.cxx @@ -0,0 +1,161 @@ +// +// "$Id: image.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Fl_Image test program for the Fast Light Tool Kit (FLTK). +// +// Notice that Fl_Image is for a static, multiple-reuse image, such +// as an icon or postage stamp. Use fl_draw_image to go directly +// from an buffered image that changes often. +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include + +int width = 100; +int height = 100; +uchar *image; + +void make_image() { + image = new uchar[4*width*height]; + uchar *p = image; + for (int y = 0; y < height; y++) { + double Y = double(y)/(height-1); + for (int x = 0; x < width; x++) { + double X = double(x)/(width-1); + *p++ = uchar(255*((1-X)*(1-Y))); // red in upper-left + *p++ = uchar(255*((1-X)*Y)); // green in lower-left + *p++ = uchar(255*(X*Y)); // blue in lower-right + X -= 0.5; + Y -= 0.5; + int alpha = (int)(255 * sqrt(X * X + Y * Y)); + if (alpha < 255) *p++ = uchar(alpha); // alpha transparency + else *p++ = 255; + Y += 0.5; + } + } +} + +#include + +Fl_Toggle_Button *leftb,*rightb,*topb,*bottomb,*insideb,*overb,*inactb; +Fl_Button *b; +Fl_Window *w; + +void button_cb(Fl_Widget *,void *) { + int i = 0; + if (leftb->value()) i |= FL_ALIGN_LEFT; + if (rightb->value()) i |= FL_ALIGN_RIGHT; + if (topb->value()) i |= FL_ALIGN_TOP; + if (bottomb->value()) i |= FL_ALIGN_BOTTOM; + if (insideb->value()) i |= FL_ALIGN_INSIDE; + if (overb->value()) i |= FL_ALIGN_TEXT_OVER_IMAGE; + b->align(i); + if (inactb->value()) b->deactivate(); + else b->activate(); + w->redraw(); +} + +#include +#if !defined(WIN32) && !defined(__APPLE__) +#include "list_visuals.cxx" +#endif + +int visid = -1; +int arg(int argc, char **argv, int &i) { + if (argv[i][1] == 'v') { + if (i+1 >= argc) return 0; + visid = atoi(argv[i+1]); + i += 2; + return 2; + } + return 0; +} + +int main(int argc, char **argv) { +#if !defined(WIN32) && !defined(__APPLE__) + int i = 1; + + Fl::args(argc,argv,i,arg); + + if (visid >= 0) { + fl_open_display(); + XVisualInfo templt; int num; + templt.visualid = visid; + fl_visual = XGetVisualInfo(fl_display, VisualIDMask, &templt, &num); + if (!fl_visual) { + fprintf(stderr, "No visual with id %d, use one of:\n",visid); + list_visuals(); + exit(1); + } + fl_colormap = XCreateColormap(fl_display, RootWindow(fl_display,fl_screen), + fl_visual->visual, AllocNone); + fl_xpixel(FL_BLACK); // make sure black is allocated in overlay visuals + } else { + Fl::visual(FL_RGB); + } +#endif + + Fl_Window window(400,400); ::w = &window; + window.color(FL_WHITE); + Fl_Button b(140,160,120,120,"Image w/Alpha"); ::b = &b; + + Fl_RGB_Image *rgb; + Fl_Image *dergb; + + make_image(); + rgb = new Fl_RGB_Image(image, width, height,4); + dergb = rgb->copy(); + dergb->inactive(); + + b.image(rgb); + b.deimage(dergb); + + leftb = new Fl_Toggle_Button(25,50,50,25,"left"); + leftb->callback(button_cb); + rightb = new Fl_Toggle_Button(75,50,50,25,"right"); + rightb->callback(button_cb); + topb = new Fl_Toggle_Button(125,50,50,25,"top"); + topb->callback(button_cb); + bottomb = new Fl_Toggle_Button(175,50,50,25,"bottom"); + bottomb->callback(button_cb); + insideb = new Fl_Toggle_Button(225,50,50,25,"inside"); + insideb->callback(button_cb); + overb = new Fl_Toggle_Button(25,75,100,25,"text over"); + overb->callback(button_cb); + inactb = new Fl_Toggle_Button(125,75,100,25,"inactive"); + inactb->callback(button_cb); + window.resizable(window); + window.end(); + window.show(argc, argv); + return Fl::run(); +} + +// +// End of "$Id: image.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/inactive.fl b/third_party/windows/fltk-1.1.10/test/inactive.fl new file mode 100644 index 0000000..56a8e51 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/inactive.fl @@ -0,0 +1,120 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0107 +header_name {.h} +code_name {.cxx} +Function {} {open +} { + Fl_Window {} {open + xywh {379 190 420 369} type Double resizable visible + } { + Fl_Group the_group { + label {activate()/deactivate() called on this Fl_Group} open + xywh {25 25 375 295} box ENGRAVED_FRAME align 17 resizable + } { + Fl_Button {} { + label button + xywh {50 50 105 25} + } + Fl_Light_Button {} { + label {light button} + xywh {50 80 105 25} value 1 align 16 + } + Fl_Group {} { + label {Child group} open + xywh {50 130 105 125} box DOWN_FRAME + } { + Fl_Check_Button {} { + label red + xywh {50 170 105 25} type Radio down_box DIAMOND_DOWN_BOX selection_color 1 labelcolor 1 + } + Fl_Check_Button {} { + label green + xywh {50 190 105 25} type Radio down_box DIAMOND_DOWN_BOX selection_color 2 labelcolor 2 + } + Fl_Check_Button {} { + label blue + xywh {50 210 105 25} type Radio down_box DIAMOND_DOWN_BOX selection_color 4 labelcolor 4 + } + Fl_Check_Button {} { + label white + xywh {50 230 105 25} type Radio down_box DIAMOND_DOWN_BOX selection_color 55 labelcolor 55 + } + Fl_Check_Button {} { + label check + xywh {50 130 105 25} down_box DOWN_BOX + } + Fl_Round_Button {} { + label round + xywh {50 150 105 25} down_box ROUND_DOWN_BOX + } + } + Fl_Slider {} { + label Fl_Slider selected + xywh {165 50 24 205} value 0.5 + } + Fl_Input {} { + xywh {195 50 195 30} + code0 {o->static_value("Fl_Input");} + } + Fl_Menu_Button {} { + label menu open + xywh {245 90 130 30} + } { + MenuItem {} { + label item + xywh {0 0 100 20} labelsize 14 + } + MenuItem {} { + label item + xywh {10 10 100 20} labelsize 14 + } + MenuItem {} { + label item + xywh {20 20 100 20} labelsize 14 + } + MenuItem {} { + label item + xywh {30 30 100 20} labelsize 14 + } + MenuItem {} { + label item + xywh {40 40 100 20} labelsize 14 + } + } + Fl_Value_Output {} { + label {value:} + xywh {245 130 130 30} maximum 10000 step 1 textfont 5 textsize 24 textcolor 4 + } + Fl_Box {} { + label Fl_Box + xywh {245 170 140 50} box EMBOSSED_FRAME labeltype SHADOW_LABEL labelfont 3 labelsize 38 + } + Fl_Scrollbar {} { + label scrollbar + xywh {40 274 180 20} type Horizontal + } + Fl_Roller {} { + label roller + xywh {235 230 25 65} + } + Fl_Dial {} { + label dial + xywh {275 235 50 50} + } + Fl_Clock {} { + label clock + xywh {335 235 50 50} + } + } + Fl_Button {} { + label active + callback {the_group->activate();} + xywh {25 330 185 25} type Radio value 1 + } + Fl_Button {} { + label inactive + callback {the_group->deactivate();} + xywh {220 330 180 25} type Radio + } + } +} diff --git a/third_party/windows/fltk-1.1.10/test/input.cxx b/third_party/windows/fltk-1.1.10/test/input.cxx new file mode 100644 index 0000000..128b482 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/input.cxx @@ -0,0 +1,142 @@ +// +// "$Id: input.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Input field test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +void cb(Fl_Widget *ob) { + printf("Callback for %s '%s'\n",ob->label(),((Fl_Input*)ob)->value()); +} + +int when = 0; +Fl_Input *input[5]; + +void toggle_cb(Fl_Widget *o, long v) { + if (((Fl_Toggle_Button*)o)->value()) when |= v; else when &= ~v; + for (int i=0; i<5; i++) input[i]->when(when); +} + +void test(Fl_Input *i) { + if (i->changed()) { + i->clear_changed(); printf("%s '%s'\n",i->label(),i->value()); + } +} + +void button_cb(Fl_Widget *,void *) { + for (int i=0; i<5; i++) test(input[i]); +} + +void color_cb(Fl_Widget* button, void* v) { + Fl_Color c; + switch ((long)v) { + case 0: c = FL_BACKGROUND2_COLOR; break; + case 1: c = FL_SELECTION_COLOR; break; + default: c = FL_FOREGROUND_COLOR; break; + } + uchar r,g,b; Fl::get_color(c, r,g,b); + if (fl_color_chooser(0,r,g,b)) { + Fl::set_color(c,r,g,b); Fl::redraw(); + button->labelcolor(fl_contrast(FL_BLACK,c)); + button->redraw(); + } +} + +int main(int argc, char **argv) { + // the following two lines set the correct color scheme, so that + // calling fl_contrast below will return good results + Fl::args(argc, argv); + Fl::get_system_colors(); + Fl_Window *window = new Fl_Window(400,400); + + int y = 10; + input[0] = new Fl_Input(70,y,300,30,"Normal:"); y += 35; + input[0]->tooltip("Normal input field"); + // input[0]->cursor_color(FL_SELECTION_COLOR); + // input[0]->maximum_size(20); + // input[0]->static_value("this is a testgarbage"); + input[1] = new Fl_Float_Input(70,y,300,30,"Float:"); y += 35; + input[1]->tooltip("Input field for floating-point number"); + input[2] = new Fl_Int_Input(70,y,300,30,"Int:"); y += 35; + input[2]->tooltip("Input field for integer number"); + input[3] = new Fl_Secret_Input(70,y,300,30,"Secret:"); y += 35; + input[3]->tooltip("Input field for password"); + input[4] = new Fl_Multiline_Input(70,y,300,100,"Multiline:"); y += 105; + input[4]->tooltip("Input field for short text with newlines"); + input[4]->wrap(1); + + for (int i = 0; i < 4; i++) { + input[i]->when(0); input[i]->callback(cb); + } + int y1 = y; + + Fl_Button *b; + b = new Fl_Toggle_Button(10,y,200,25,"FL_WHEN_CHANGED"); + b->callback(toggle_cb, FL_WHEN_CHANGED); y += 25; + b->tooltip("Do callback each time the text changes"); + b = new Fl_Toggle_Button(10,y,200,25,"FL_WHEN_RELEASE"); + b->callback(toggle_cb, FL_WHEN_RELEASE); y += 25; + b->tooltip("Do callback when widget loses focus"); + b = new Fl_Toggle_Button(10,y,200,25,"FL_WHEN_ENTER_KEY"); + b->callback(toggle_cb, FL_WHEN_ENTER_KEY); y += 25; + b->tooltip("Do callback when user hits Enter key"); + b = new Fl_Toggle_Button(10,y,200,25,"FL_WHEN_NOT_CHANGED"); + b->callback(toggle_cb, FL_WHEN_NOT_CHANGED); y += 25; + b->tooltip("Do callback even if the text is not changed"); + y += 5; + b = new Fl_Button(10,y,200,25,"&print changed()"); + b->callback(button_cb); + b->tooltip("Print widgets that have changed() flag set"); + + b = new Fl_Button(220,y1,100,25,"color"); y1 += 25; + b->color(input[0]->color()); b->callback(color_cb, (void*)0); + b->tooltip("Color behind the text"); + b = new Fl_Button(220,y1,100,25,"selection_color"); y1 += 25; + b->color(input[0]->selection_color()); b->callback(color_cb, (void*)1); + b->labelcolor(fl_contrast(FL_BLACK,b->color())); + b->tooltip("Color behind selected text"); + b = new Fl_Button(220,y1,100,25,"textcolor"); y1 += 25; + b->color(input[0]->textcolor()); b->callback(color_cb, (void*)2); + b->labelcolor(fl_contrast(FL_BLACK,b->color())); + b->tooltip("Color of the text"); + + window->end(); + window->show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: input.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/input_choice.cxx b/third_party/windows/fltk-1.1.10/test/input_choice.cxx new file mode 100644 index 0000000..96e711e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/input_choice.cxx @@ -0,0 +1,68 @@ +// +// "$Id: input_choice.cxx 5890 2007-06-07 17:38:49Z matt $" +// +// Test program for Fl_Input_Choice +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// + +#include +#include +#include +#include + +void buttcb(Fl_Widget*,void*data) { + Fl_Input_Choice *in=(Fl_Input_Choice *)data; + static int flag = 1; + flag ^= 1; + if ( flag ) in->activate(); + else in->deactivate(); + if (in->changed()) { + printf("Callback: changed() is set\n"); + in->clear_changed(); + } +} + +void input_choice_cb(Fl_Widget*,void*data) { + Fl_Input_Choice *in=(Fl_Input_Choice *)data; + fprintf(stderr, "Value='%s'\n", (const char*)in->value()); +} + +int main(int argc, char **argv) { + Fl_Window win(300, 200); + + Fl_Input_Choice in(40,40,100,28,"Test"); + in.callback(input_choice_cb, (void*)&in); + in.add("one"); + in.add("two"); + in.add("three"); + in.value(1); + + Fl_Button onoff(40,150,200,28,"Activate/Deactivate"); + onoff.callback(buttcb, (void*)&in); + + win.end(); + win.resizable(win); + win.show(argc, argv); + return Fl::run(); +} + + +// +// End of "$Id: input_choice.cxx 5890 2007-06-07 17:38:49Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/test/keyboard.cxx b/third_party/windows/fltk-1.1.10/test/keyboard.cxx new file mode 100644 index 0000000..8077e22 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/keyboard.cxx @@ -0,0 +1,158 @@ +// +// "$Id: keyboard.cxx 5702 2007-02-21 15:49:38Z matt $" +// +// Keyboard/event test program for the Fast Light Tool Kit (FLTK). +// +// Continuously display FLTK's event state. +// +// Known bugs: +// +// X insists on reporting the state *before* the shift key was +// pressed, rather than after, on shift key events. I fixed this for +// the mouse buttons, but it did not seem worth it for shift. +// +// X servers do not agree about any shift flags after except shift, ctrl, +// lock, and alt. They may also not agree about the symbols for the extra +// keys Micro$oft put on the keyboard. +// +// On IRIX the backslash key does not work. A bug in XKeysymToKeycode? +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + + +#include "keyboard_ui.h" + +#include + + +// these are used to identify which buttons are which: +void key_cb(Fl_Button*, void*) {} +void shift_cb(Fl_Button*, void*) {} +void wheel_cb(Fl_Dial*, void*) {} + +// this is used to stop Esc from exiting the program: +int handle(int e) { + return (e == FL_SHORTCUT); // eat all keystrokes +} + +int MyWindow::handle(int msg) { + if (msg==FL_MOUSEWHEEL) + { + roller_x->value( roller_x->value() + Fl::e_dx * roller_x->step() ); + roller_y->value( roller_y->value() + Fl::e_dy * roller_y->step() ); + return 1; + } + return 0; +} + +struct keycode_table{int n; const char* text;} table[] = { + {FL_Escape, "FL_Escape"}, + {FL_BackSpace, "FL_BackSpace"}, + {FL_Tab, "FL_Tab"}, + {FL_Enter, "FL_Enter"}, + {FL_Print, "FL_Print"}, + {FL_Scroll_Lock, "FL_Scroll_Lock"}, + {FL_Pause, "FL_Pause"}, + {FL_Insert, "FL_Insert"}, + {FL_Home, "FL_Home"}, + {FL_Page_Up, "FL_Page_Up"}, + {FL_Delete, "FL_Delete"}, + {FL_End, "FL_End"}, + {FL_Page_Down, "FL_Page_Down"}, + {FL_Left, "FL_Left"}, + {FL_Up, "FL_Up"}, + {FL_Right, "FL_Right"}, + {FL_Down, "FL_Down"}, + {FL_Shift_L, "FL_Shift_L"}, + {FL_Shift_R, "FL_Shift_R"}, + {FL_Control_L, "FL_Control_L"}, + {FL_Control_R, "FL_Control_R"}, + {FL_Caps_Lock, "FL_Caps_Lock"}, + {FL_Alt_L, "FL_Alt_L"}, + {FL_Alt_R, "FL_Alt_R"}, + {FL_Meta_L, "FL_Meta_L"}, + {FL_Meta_R, "FL_Meta_R"}, + {FL_Menu, "FL_Menu"}, + {FL_Help, "FL_Help"}, + {FL_Num_Lock, "FL_Num_Lock"}, + {FL_KP_Enter, "FL_KP_Enter"} +}; + +int main(int argc, char** argv) { + Fl::add_handler(handle); + Fl_Window *window = make_window(); + window->show(argc,argv); + while (Fl::wait()) { + const char *str; + + // update all the buttons with the current key and shift state: + for (int i = 0; i < window->children(); i++) { + Fl_Widget* b = window->child(i); + if (b->callback() == (Fl_Callback*)key_cb) { + int i = (long)b->user_data(); + if (!i) i = b->label()[0]; + Fl_Button *btn = ((Fl_Button*)b); + int state = Fl::event_key(i); + if (btn->value()!=state) + btn->value(state); + } else if (b->callback() == (Fl_Callback*)shift_cb) { + int i = (long)b->user_data(); + Fl_Button *btn = ((Fl_Button*)b); + int state = Fl::event_state(i); + if (btn->value()!=state) + btn->value(state); + } + } + + // figure out the keyname: + char buffer[100]; + const char *keyname = buffer; + int k = Fl::event_key(); + if (!k) + keyname = "0"; + else if (k < 256) { + sprintf(buffer, "'%c'", k); + } else if (k > FL_F && k <= FL_F_Last) { + sprintf(buffer, "FL_F+%d", k - FL_F); + } else if (k >= FL_KP && k <= FL_KP_Last) { + sprintf(buffer, "FL_KP+'%c'", k-FL_KP); + } else if (k >= FL_Button && k <= FL_Button+7) { + sprintf(buffer, "FL_Button+%d", k-FL_Button); + } else { + sprintf(buffer, "0x%04x", k); + for (int i = 0; i < int(sizeof(table)/sizeof(*table)); i++) + if (table[i].n == k) {keyname = table[i].text; break;} + } + if (strcmp(key_output->value(), keyname)) + key_output->value(keyname); + + str = Fl::event_text(); + if (strcmp(text_output->value(), str)) + text_output->value(str); + } + return 0; +} + +// +// End of "$Id: keyboard.cxx 5702 2007-02-21 15:49:38Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/test/keyboard.h b/third_party/windows/fltk-1.1.10/test/keyboard.h new file mode 100644 index 0000000..04ed75f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/keyboard.h @@ -0,0 +1,46 @@ +// +// "$Id: keyboard.h 5519 2006-10-11 03:12:15Z mike $" +// +// Keyboard/event test header for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef keyboard_h +# define keyboard_h +# include +# include +# include + +class MyWindow : public Fl_Window { + int handle(int); +public: + MyWindow(int w, int h, const char *t=0L) + : Fl_Window( w, h, t ) { } +}; + +#endif // !keyboard_h + + +// +// End of "$Id: keyboard.h 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/keyboard_ui.fl b/third_party/windows/fltk-1.1.10/test/keyboard_ui.fl new file mode 100644 index 0000000..ff275d3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/keyboard_ui.fl @@ -0,0 +1,722 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0100 +header_name {.h} +code_name {.cxx} +gridx 5 +gridy 5 +snap 3 +Function {make_window()} {open +} { + Fl_Window my_window {selected + xywh {461 296 494 203} + code0 {\#include "keyboard.h"} + class MyWindow visible + } { + Fl_Button {} { + label {Esc } + user_data FL_Escape user_data_type {void*} + callback key_cb + xywh {15 60 20 20} labelsize 8 + } + Fl_Button {} { + label F1 + user_data {FL_F+1} user_data_type {void*} + callback key_cb + xywh {50 60 20 20} labelsize 10 + } + Fl_Button {} { + label F2 + user_data {FL_F+2} user_data_type {void*} + callback key_cb + xywh {70 60 20 20} labelsize 10 + } + Fl_Button {} { + label F3 + user_data {FL_F+3} user_data_type {void*} + callback key_cb + xywh {90 60 20 20} labelsize 10 + } + Fl_Button {} { + label F4 + user_data {FL_F+4} user_data_type {void*} + callback key_cb + xywh {110 60 20 20} labelsize 10 + } + Fl_Button {} { + label F5 + user_data {FL_F+5} user_data_type {void*} + callback key_cb + xywh {140 60 20 20} labelsize 10 + } + Fl_Button {} { + label F6 + user_data {FL_F+6} user_data_type {void*} + callback key_cb + xywh {160 60 20 20} labelsize 10 + } + Fl_Button {} { + label F7 + user_data {FL_F+7} user_data_type {void*} + callback key_cb + xywh {180 60 20 20} labelsize 10 + } + Fl_Button {} { + label F8 + user_data {FL_F+8} user_data_type {void*} + callback key_cb + xywh {200 60 20 20} labelsize 10 + } + Fl_Button {} { + label F9 + user_data {FL_F+9} user_data_type {void*} + callback key_cb + xywh {230 60 20 20} labelsize 10 + } + Fl_Button {} { + label F10 + user_data {FL_F+10} user_data_type {void*} + callback key_cb + xywh {250 60 20 20} labelsize 10 + } + Fl_Button {} { + label F11 + user_data {FL_F+11} user_data_type {void*} + callback key_cb + xywh {270 60 20 20} labelsize 10 + } + Fl_Button {} { + label F12 + user_data {FL_F+12} user_data_type {void*} + callback key_cb + xywh {290 60 20 20} labelsize 10 + } + Fl_Button {} { + label {Print } + user_data FL_Print user_data_type {void*} + callback key_cb + xywh {325 60 20 20} labelsize 8 + } + Fl_Button {} { + label {Sclk } + user_data FL_Scroll_Lock user_data_type {void*} + callback key_cb + xywh {345 60 20 20} labelsize 8 + } + Fl_Button {} { + label {Paus } + user_data FL_Pause user_data_type {void*} + callback key_cb + xywh {365 60 20 20} labelsize 8 + } + Fl_Button {} { + label {`} + callback key_cb + xywh {15 90 20 20} labelsize 10 + } + Fl_Button {} { + label 1 + callback key_cb + xywh {35 90 20 20} labelsize 10 + } + Fl_Button {} { + label 2 + callback key_cb + xywh {55 90 20 20} labelsize 10 + } + Fl_Button {} { + label 3 + callback key_cb + xywh {75 90 20 20} labelsize 10 + } + Fl_Button {} { + label 4 + callback key_cb + xywh {95 90 20 20} labelsize 10 + } + Fl_Button {} { + label 5 + callback key_cb + xywh {115 90 20 20} labelsize 10 + } + Fl_Button {} { + label 6 + callback key_cb + xywh {135 90 20 20} labelsize 10 + } + Fl_Button {} { + label 7 + callback key_cb + xywh {155 90 20 20} labelsize 10 + } + Fl_Button {} { + label 8 + callback key_cb + xywh {175 90 20 20} labelsize 10 + } + Fl_Button {} { + label 9 + callback key_cb + xywh {195 90 20 20} labelsize 10 + } + Fl_Button {} { + label 0 + callback key_cb + xywh {215 90 20 20} labelsize 10 + } + Fl_Button {} { + label {-} + callback key_cb + xywh {235 90 20 20} labelsize 10 + } + Fl_Button {} { + label {=} + callback key_cb + xywh {255 90 20 20} labelsize 10 + } + Fl_Button {} { + label Bksp + user_data FL_BackSpace user_data_type {void*} + callback key_cb + xywh {275 90 35 20} labeltype SHADOW_LABEL labelsize 8 align 20 + } + Fl_Button {} { + label {Ins } + user_data FL_Insert user_data_type {void*} + callback key_cb + xywh {325 90 20 20} labelsize 8 + } + Fl_Button {} { + label Home + user_data FL_Home user_data_type {void*} + callback key_cb + xywh {345 90 20 20} labelsize 8 + } + Fl_Button {} { + label {pgup } + user_data FL_Page_Up user_data_type {void*} + callback key_cb + xywh {365 90 20 20} labelsize 8 + } + Fl_Button {} { + label Num + user_data FL_Num_Lock user_data_type {void*} + callback key_cb + xywh {400 90 20 20} labelsize 8 + } + Fl_Button {} { + label {/} + user_data {FL_KP+'/'} user_data_type {void*} + callback key_cb + xywh {420 90 20 20} labelsize 10 + } + Fl_Button {} { + label {*} + user_data {FL_KP+'*'} user_data_type {void*} + callback key_cb + xywh {440 90 20 20} labelsize 10 + } + Fl_Button {} { + label {-} + user_data {FL_KP+'-'} user_data_type {void*} + callback key_cb + xywh {460 90 20 20} labelsize 10 + } + Fl_Button {} { + label Tab + user_data FL_Tab user_data_type {void*} + callback key_cb + xywh {15 110 27 20} labelsize 8 align 20 + } + Fl_Button {} { + label Q + callback key_cb + xywh {42 110 20 20} labelsize 10 + } + Fl_Button {} { + label W + callback key_cb + xywh {62 110 20 20} labelsize 10 + } + Fl_Button {} { + label E + callback key_cb + xywh {82 110 20 20} labelsize 10 + } + Fl_Button {} { + label R + callback key_cb + xywh {102 110 20 20} labelsize 10 + } + Fl_Button {} { + label T + callback key_cb + xywh {122 110 20 20} labelsize 10 + } + Fl_Button {} { + label Y + callback key_cb + xywh {142 110 20 20} labelsize 10 + } + Fl_Button {} { + label U + callback key_cb + xywh {162 110 20 20} labelsize 10 + } + Fl_Button {} { + label I + callback key_cb + xywh {182 110 20 20} labelsize 10 + } + Fl_Button {} { + label O + callback key_cb + xywh {202 110 20 20} labelsize 10 + } + Fl_Button {} { + label P + callback key_cb + xywh {222 110 20 20} labelsize 10 + } + Fl_Button {} { + label {[} + callback key_cb + xywh {242 110 20 20} labelsize 10 + } + Fl_Button {} { + label {]} + callback key_cb + xywh {262 110 20 20} labelsize 10 + } + Fl_Button {} { + label {\\} + user_data {'|'} + callback key_cb + xywh {282 110 28 20} labelsize 10 align 20 + } + Fl_Button {} { + label {Del } + user_data FL_Delete user_data_type {void*} + callback key_cb + xywh {325 110 20 20} labelsize 8 + } + Fl_Button {} { + label {End } + user_data FL_End user_data_type {void*} + callback key_cb + xywh {345 110 20 20} labelsize 8 + } + Fl_Button {} { + label {pgdn } + user_data FL_Page_Down user_data_type {void*} + callback key_cb + xywh {365 110 20 20} labelsize 8 + } + Fl_Button {} { + label 7 + user_data {FL_KP+'7'} user_data_type {void*} + callback key_cb + xywh {400 110 20 20} labelsize 10 + } + Fl_Button {} { + label 8 + user_data {FL_KP+'8'} user_data_type {void*} + callback key_cb + xywh {420 110 20 20} labelsize 10 + } + Fl_Button {} { + label 9 + user_data {FL_KP+'9'} user_data_type {void*} + callback key_cb + xywh {440 110 20 20} labelsize 10 + } + Fl_Button {} { + label {+} + user_data {FL_KP+'+'} user_data_type {void*} + callback key_cb + xywh {460 110 20 40} labelsize 10 align 17 + } + Fl_Button {} { + label Lock + user_data FL_Caps_Lock user_data_type {void*} + callback key_cb + xywh {15 130 36 20} labelsize 8 align 20 + } + Fl_Button {} { + label A + callback key_cb + xywh {51 130 20 20} labelsize 10 + } + Fl_Button {} { + label S + callback key_cb + xywh {71 130 20 20} labelsize 10 + } + Fl_Button {} { + label D + callback key_cb + xywh {91 130 20 20} labelsize 10 + } + Fl_Button {} { + label F + callback key_cb + xywh {111 130 20 20} labelsize 10 + } + Fl_Button {} { + label G + callback key_cb + xywh {131 130 20 20} labelsize 10 + } + Fl_Button {} { + label H + callback key_cb + xywh {151 130 20 20} labelsize 10 + } + Fl_Button {} { + label J + callback key_cb + xywh {171 130 20 20} labelsize 10 + } + Fl_Button {} { + label K + callback key_cb + xywh {191 130 20 20} labelsize 10 + } + Fl_Button {} { + label L + callback key_cb + xywh {211 130 20 20} labelsize 10 + } + Fl_Button {} { + label {;} + callback key_cb + xywh {231 130 20 20} labelsize 10 + } + Fl_Button {} { + label {'} + callback key_cb + xywh {251 130 20 20} labelsize 10 + } + Fl_Button {} { + label Enter + user_data FL_Enter user_data_type {void*} + callback key_cb + xywh {271 130 39 20} labelsize 8 align 20 + } + Fl_Button {} { + label 4 + user_data {FL_KP+'4'} user_data_type {void*} + callback key_cb + xywh {400 130 20 20} labelsize 10 + } + Fl_Button {} { + label 5 + user_data {FL_KP+'5'} user_data_type {void*} + callback key_cb + xywh {420 130 20 20} labelsize 10 + } + Fl_Button {} { + label 6 + user_data {FL_KP+'6'} user_data_type {void*} + callback key_cb + xywh {440 130 20 20} labelsize 10 + } + Fl_Button {} { + label Shift + user_data FL_Shift_L user_data_type {void*} + callback key_cb + xywh {15 150 45 20} labelsize 8 align 20 + } + Fl_Button {} { + label Z + callback key_cb + xywh {60 150 20 20} labelsize 10 + } + Fl_Button {} { + label X + callback key_cb + xywh {80 150 20 20} labelsize 10 + } + Fl_Button {} { + label C + callback key_cb + xywh {100 150 20 20} labelsize 10 + } + Fl_Button {} { + label V + callback key_cb + xywh {120 150 20 20} labelsize 10 + } + Fl_Button {} { + label B + callback key_cb + xywh {140 150 20 20} labelsize 10 + } + Fl_Button {} { + label N + callback key_cb + xywh {160 150 20 20} labelsize 10 + } + Fl_Button {} { + label M + callback key_cb + xywh {180 150 20 20} labelsize 10 + } + Fl_Button {} { + label {,} + callback key_cb + xywh {200 150 20 20} labelsize 10 + } + Fl_Button {} { + label {.} + callback key_cb + xywh {220 150 20 20} labelsize 10 + } + Fl_Button {} { + label {/} + callback key_cb + xywh {240 150 20 20} labelsize 10 + } + Fl_Button {} { + label Shift + user_data FL_Shift_R user_data_type {void*} + callback key_cb + xywh {260 150 50 20} labelsize 8 align 20 + } + Fl_Button {} { + label {@8->} + user_data FL_Up user_data_type {void*} + callback key_cb + xywh {345 150 20 20} labeltype SHADOW_LABEL labelsize 10 labelcolor 47 + } + Fl_Button {} { + label 1 + user_data {FL_KP+'1'} user_data_type {void*} + callback key_cb + xywh {400 150 20 20} labelsize 10 + } + Fl_Button {} { + label 2 + user_data {FL_KP+'2'} user_data_type {void*} + callback key_cb + xywh {420 150 20 20} labelsize 10 + } + Fl_Button {} { + label 3 + user_data {FL_KP+'3'} user_data_type {void*} + callback key_cb + xywh {440 150 20 20} labelsize 10 + } + Fl_Button {} { + user_data FL_KP_Enter user_data_type {void*} + callback key_cb + xywh {460 150 20 40} + } + Fl_Button {} { + label Ctrl + user_data FL_Control_L user_data_type {void*} + callback key_cb + xywh {15 170 30 20} labelsize 8 align 20 + } + Fl_Button {} { + label {Meta } + user_data FL_Meta_L user_data_type {void*} + callback key_cb + xywh {45 170 30 20} labelsize 8 + } + Fl_Button {} { + label {Alt } + user_data FL_Alt_L user_data_type {void*} + callback key_cb + xywh {75 170 30 20} labelsize 8 + } + Fl_Button {} { + user_data {' '} user_data_type {void*} + callback key_cb + xywh {105 170 85 20} labelsize 10 + } + Fl_Button {} { + label {Alt } + user_data FL_Alt_R user_data_type {void*} + callback key_cb + xywh {190 170 30 20} labelsize 8 + } + Fl_Button {} { + label {Meta } + user_data FL_Meta_R user_data_type {void*} + callback key_cb + xywh {220 170 30 20} labelsize 8 + } + Fl_Button {} { + label {Menu } + user_data FL_Menu user_data_type {void*} + callback key_cb + xywh {250 170 30 20} labelsize 8 + } + Fl_Button {} { + label Ctrl + user_data FL_Control_R user_data_type {void*} + callback key_cb + xywh {280 170 30 20} labelsize 8 align 20 + } + Fl_Button {} { + label {@4->} + user_data FL_Left user_data_type {void*} + callback key_cb + xywh {325 170 20 20} labeltype SHADOW_LABEL labelsize 10 labelcolor 47 + } + Fl_Button {} { + label {@2->} + user_data FL_Down user_data_type {void*} + callback key_cb + xywh {345 170 20 20} labeltype SHADOW_LABEL labelsize 10 labelcolor 47 + } + Fl_Button {} { + label {@6->} + user_data FL_Right user_data_type {void*} + callback key_cb + xywh {365 170 20 20} labeltype SHADOW_LABEL labelsize 10 labelcolor 47 + } + Fl_Button {} { + label 0 + user_data {FL_KP+'0'} user_data_type {void*} + callback key_cb + xywh {400 170 40 20} labelsize 10 align 20 + } + Fl_Button {} { + label {.} + user_data {FL_KP+'.'} user_data_type {void*} + callback key_cb + xywh {440 170 20 20} labelsize 10 + } + Fl_Button {} { + label {shift } + user_data FL_SHIFT user_data_type {void*} + callback shift_cb + xywh {400 10 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label {lock } + user_data FL_CAPS_LOCK user_data_type {void*} + callback shift_cb + xywh {420 10 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label ctrl + user_data FL_CTRL user_data_type {void*} + callback shift_cb + xywh {440 10 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label alt + user_data FL_ALT user_data_type {void*} + callback shift_cb + xywh {460 10 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label num + user_data FL_NUM_LOCK user_data_type {void*} + callback shift_cb + xywh {400 20 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label {?} + user_data 0x20 user_data_type {void*} + callback shift_cb + xywh {420 20 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label {meta } + user_data FL_META user_data_type {void*} + callback shift_cb + xywh {440 20 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label sclk + user_data FL_SCROLL_LOCK user_data_type {void*} + callback shift_cb + xywh {460 20 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label b1 + user_data FL_BUTTON1 user_data_type {void*} + callback shift_cb + xywh {400 30 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label b2 + user_data FL_BUTTON2 user_data_type {void*} + callback shift_cb + xywh {420 30 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label b3 + user_data FL_BUTTON3 user_data_type {void*} + callback shift_cb + xywh {440 30 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label whl + user_data 0x800 user_data_type {void*} + callback shift_cb + xywh {460 30 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label {?} + user_data 0x1000 user_data_type {void*} + callback shift_cb + xywh {400 40 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label {?} + user_data 0x2000 user_data_type {void*} + callback shift_cb + xywh {420 40 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label {?} + user_data 0x4000 user_data_type {void*} + callback shift_cb + xywh {440 40 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Button {} { + label {?} + user_data 0x8000 user_data_type {void*} + callback shift_cb + xywh {460 40 20 10} box THIN_UP_BOX selection_color 3 labelsize 8 + } + Fl_Output key_output { + label {Fl::event_key():} + xywh {15 15 170 30} labelsize 8 align 5 + } + Fl_Box {} { + label {Fl::event_state():} + xywh {395 10 85 40} labelsize 8 align 5 + } + Fl_Output text_output { + label {Fl::event_text():} + xywh {195 15 190 30} labelsize 8 align 5 + } + Fl_Button {} { + label help + user_data FL_Help user_data_type {void*} + callback key_cb + xywh {400 60 20 20} labelsize 8 + } + Fl_Button {} { + label {=} + user_data {FL_KP+'='} user_data_type {void*} + callback key_cb + xywh {420 60 20 20} labelsize 10 + } + Fl_Dial roller_x { + label {x:} + callback wheel_cb + xywh {440 60 20 20} box ROUND_UP_BOX selection_color 49 labelsize 9 align 5 step 0.1 + } + Fl_Dial roller_y { + label {y:} + callback wheel_cb + xywh {460 60 20 20} box ROUND_UP_BOX selection_color 49 labelsize 9 align 5 step 0.1 + } + } +} diff --git a/third_party/windows/fltk-1.1.10/test/label.cxx b/third_party/windows/fltk-1.1.10/test/label.cxx new file mode 100644 index 0000000..e54103e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/label.cxx @@ -0,0 +1,162 @@ +// +// "$Id: label.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Label test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include + +Fl_Toggle_Button *leftb,*rightb,*topb,*bottomb,*insideb,*clipb,*wrapb; +Fl_Box *text; +Fl_Input *input; +Fl_Hor_Value_Slider *fonts; +Fl_Hor_Value_Slider *sizes; +Fl_Double_Window *window; + +void button_cb(Fl_Widget *,void *) { + int i = 0; + if (leftb->value()) i |= FL_ALIGN_LEFT; + if (rightb->value()) i |= FL_ALIGN_RIGHT; + if (topb->value()) i |= FL_ALIGN_TOP; + if (bottomb->value()) i |= FL_ALIGN_BOTTOM; + if (insideb->value()) i |= FL_ALIGN_INSIDE; + if (clipb->value()) i |= FL_ALIGN_CLIP; + if (wrapb->value()) i |= FL_ALIGN_WRAP; + text->align(i); + window->redraw(); +} + +void font_cb(Fl_Widget *,void *) { + text->labelfont(int(fonts->value())); + window->redraw(); +} + +void size_cb(Fl_Widget *,void *) { + text->labelsize(int(sizes->value())); + window->redraw(); +} + +void input_cb(Fl_Widget *,void *) { + text->label(input->value()); + window->redraw(); +} + +void normal_cb(Fl_Widget *,void *) { + text->labeltype(FL_NORMAL_LABEL); + window->redraw(); +} + +void symbol_cb(Fl_Widget *,void *) { + text->labeltype(FL_SYMBOL_LABEL); + if (input->value()[0] != '@') { + input->static_value("@->"); + text->label("@->"); + } + window->redraw(); +} + +void shadow_cb(Fl_Widget *,void *) { + text->labeltype(FL_SHADOW_LABEL); + window->redraw(); +} + +void embossed_cb(Fl_Widget *,void *) { + text->labeltype(FL_EMBOSSED_LABEL); + window->redraw(); +} + +void engraved_cb(Fl_Widget *,void *) { + text->labeltype(FL_ENGRAVED_LABEL); + window->redraw(); +} + +Fl_Menu_Item choices[] = { + {"FL_NORMAL_LABEL",0,normal_cb}, + {"FL_SYMBOL_LABEL",0,symbol_cb}, + {"FL_SHADOW_LABEL",0,shadow_cb}, + {"FL_ENGRAVED_LABEL",0,engraved_cb}, + {"FL_EMBOSSED_LABEL",0,embossed_cb}, + {0}}; + +int main(int argc, char **argv) { + window = new Fl_Double_Window(400,400); + + input = new Fl_Input(50,0,350,25); + input->static_value("The quick brown fox jumped over the lazy dog."); + input->when(FL_WHEN_CHANGED); + input->callback(input_cb); + + sizes= new Fl_Hor_Value_Slider(50,25,350,25,"Size:"); + sizes->align(FL_ALIGN_LEFT); + sizes->bounds(1,64); + sizes->step(1); + sizes->value(14); + sizes->callback(size_cb); + + fonts=new Fl_Hor_Value_Slider(50,50,350,25,"Font:"); + fonts->align(FL_ALIGN_LEFT); + fonts->bounds(0,15); + fonts->step(1); + fonts->value(0); + fonts->callback(font_cb); + + Fl_Group *g = new Fl_Group(0,0,0,0); + leftb = new Fl_Toggle_Button(50,75,50,25,"left"); + leftb->callback(button_cb); + rightb = new Fl_Toggle_Button(100,75,50,25,"right"); + rightb->callback(button_cb); + topb = new Fl_Toggle_Button(150,75,50,25,"top"); + topb->callback(button_cb); + bottomb = new Fl_Toggle_Button(200,75,50,25,"bottom"); + bottomb->callback(button_cb); + insideb = new Fl_Toggle_Button(250,75,50,25,"inside"); + insideb->callback(button_cb); + wrapb = new Fl_Toggle_Button(300,75,50,25,"wrap"); + wrapb->callback(button_cb); + clipb = new Fl_Toggle_Button(350,75,50,25,"clip"); + clipb->callback(button_cb); + g->resizable(insideb); + g->forms_end(); + + Fl_Choice *c = new Fl_Choice(50,100,200,25); + c->menu(choices); + + text= new Fl_Box(FL_FRAME_BOX,100,225,200,100,input->value()); + text->align(FL_ALIGN_CENTER); + window->resizable(text); + window->forms_end(); + window->show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: label.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/line_style.cxx b/third_party/windows/fltk-1.1.10/test/line_style.cxx new file mode 100644 index 0000000..d1f0e2f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/line_style.cxx @@ -0,0 +1,154 @@ +// +// "$Id: line_style.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Line style demo for the Fast Light Tool Kit (FLTK). +// +// Copyright 2000-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +Fl_Window *form; +Fl_Slider *sliders[8]; +Fl_Choice *choice[3]; + +class test_box: public Fl_Window { + void draw(); +public: + test_box(int x,int y,int w,int h,const char *l=0) + : Fl_Window(x,y,w,h,l) {} +}*test; + +void test_box::draw() { + Fl_Window::draw(); + fl_color((uchar)(sliders[0]->value()), + (uchar)(sliders[1]->value()), + (uchar)(sliders[2]->value())); + char buf[5]; + buf[0] = char(sliders[4]->value()); + buf[1] = char(sliders[5]->value()); + buf[2] = char(sliders[6]->value()); + buf[3] = char(sliders[7]->value()); + buf[4] = 0; + fl_line_style( + (long)(choice[0]->mvalue()->user_data()) + + (long)(choice[1]->mvalue()->user_data()) + + (long)(choice[2]->mvalue()->user_data()), + (long)(sliders[3]->value()), + buf); + fl_rect(10,10,w()-20,h()-20); + fl_begin_line(); + fl_vertex(35, 35); + fl_vertex(w()-35, h()-35); + fl_vertex(w()-40, 35); + fl_vertex(35, h()/2); + fl_end_line(); + // you must reset the line type when done: + fl_line_style(FL_SOLID); +} + +Fl_Menu_Item style_menu[] = { + {"FL_SOLID", 0, 0, (void*)FL_SOLID}, + {"FL_DASH", 0, 0, (void*)FL_DASH}, + {"FL_DOT", 0, 0, (void*)FL_DOT}, + {"FL_DASHDOT",0, 0, (void*)FL_DASHDOT}, + {"FL_DASHDOTDOT", 0, 0, (void*)FL_DASHDOTDOT}, + {0} +}; + +Fl_Menu_Item cap_menu[] = { + {"default", 0, 0, 0}, + {"FL_CAP_FLAT", 0, 0, (void*)FL_CAP_FLAT}, + {"FL_CAP_ROUND", 0, 0, (void*)FL_CAP_ROUND}, + {"FL_CAP_SQUARE", 0, 0, (void*)FL_CAP_SQUARE}, + {0} +}; + +Fl_Menu_Item join_menu[] = { + {"default", 0, 0, 0}, + {"FL_JOIN_MITER", 0, 0, (void*)FL_JOIN_MITER}, + {"FL_JOIN_ROUND", 0, 0, (void*)FL_JOIN_ROUND}, + {"FL_JOIN_BEVEL", 0, 0, (void*)FL_JOIN_BEVEL}, + {0} +}; + +void do_redraw(Fl_Widget*,void*) +{ + test->redraw(); +} + +void makeform(const char *) { + form = new Fl_Window(500,210,"fl_line_style() test"); + sliders[0]= new Fl_Value_Slider(280,10,180,20,"R"); + sliders[0]->bounds(0,255); + sliders[1]= new Fl_Value_Slider(280,30,180,20,"G"); + sliders[1]->bounds(0,255); + sliders[2]= new Fl_Value_Slider(280,50,180,20,"B"); + sliders[2]->bounds(0,255); + choice[0]= new Fl_Choice(280,70,180,20,"Style"); + choice[0]->menu(style_menu); + choice[1]= new Fl_Choice(280,90,180,20,"Cap"); + choice[1]->menu(cap_menu); + choice[2]= new Fl_Choice(280,110,180,20,"Join"); + choice[2]->menu(join_menu); + sliders[3]= new Fl_Value_Slider(280,130,180,20,"Width"); + sliders[3]->bounds(0,20); + sliders[4] = new Fl_Slider(200,170,70,20,"Dash"); + sliders[4]->align(FL_ALIGN_TOP_LEFT); + sliders[4]->bounds(0,40); + sliders[5] = new Fl_Slider(270,170,70,20); + sliders[5]->bounds(0,40); + sliders[6] = new Fl_Slider(340,170,70,20); + sliders[6]->bounds(0,40); + sliders[7] = new Fl_Slider(410,170,70,20); + sliders[7]->bounds(0,40); + int i; + for (i=0;i<8;i++) { + sliders[i]->type(1); + if (i<4) sliders[i]->align(FL_ALIGN_LEFT); + sliders[i]->callback((Fl_Callback*)do_redraw); + sliders[i]->step(1); + } + for (i=0;i<3;i++) { + choice[i]->value(0); + choice[i]->callback((Fl_Callback*)do_redraw); + } + test=new test_box(10,10,190,190); + test->end(); + form->resizable(test); + form->end(); +} + +int main(int argc, char **argv) { + makeform(argv[0]); + form->show(argc,argv); + return Fl::run(); +} + + +// +// End of "$Id: line_style.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/list_visuals.cxx b/third_party/windows/fltk-1.1.10/test/list_visuals.cxx new file mode 100644 index 0000000..4d56996 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/list_visuals.cxx @@ -0,0 +1,241 @@ +// +// "$Id: list_visuals.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Visual list utility for the Fast Light Tool Kit (FLTK). +// +// List all the visuals on the screen, and dumps anything interesting +// about them to stdout. +// +// Does not use FLTK. +// +// This file may be #included in another program to make a function to +// call to list the visuals. Fl.H must be included first to indicate this. +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#if defined(WIN32) || defined(__APPLE__) +#include +#include + +int main(int, char**) { + fl_alert("Currently, this program works only under X."); + return 1; +} + +#else + +#include "config.h" + +#ifndef Fl_H + +#include +#include +#include +#include +#include + +Display *fl_display; +int fl_screen; +const char *dname; +void fl_open_display() { + fl_display = XOpenDisplay(dname); + if (!fl_display) { + fprintf(stderr,"Can't open display: %s\n",XDisplayName(dname)); + exit(1); + } + fl_screen = DefaultScreen(fl_display); +} + +#endif + +const char *ClassNames[] = { + "StaticGray ", + "GrayScale ", + "StaticColor", + "PseudoColor", + "TrueColor ", + "DirectColor" +}; + +// SERVER_OVERLAY_VISUALS property element: +typedef struct _OverlayInfo { + long overlay_visual; + long transparent_type; + long value; + long layer; +} OverlayInfo; + +#if HAVE_MULTIBUF +#include +#endif + +#if HAVE_XDBE +#include +#endif + +static void print_mask(XVisualInfo* p) { + int n = 0; + int what = 0; + int print_anything = 0; + char buf[20]; + char *q = buf; + *q = 0; + int b; unsigned int m; for (b=32,m=0x80000000; ; b--,m>>=1) { + int new_what = 0; + if (p->red_mask&m) new_what = 'r'; + else if (p->green_mask&m) new_what = 'g'; + else if (p->blue_mask&m) new_what = 'b'; + else new_what = '?'; + if (new_what != what) { + if (what && (what != '?' || print_anything)) { + q += sprintf(q,"%d%c", n, what); + print_anything = 1; + } + what = new_what; + n = 1; + } else { + n++; + } + if (!b) break; + } + printf("%7s", buf); +} + +void list_visuals() { + fl_open_display(); + XVisualInfo vTemplate; + int num; + XVisualInfo *visualList = XGetVisualInfo(fl_display,0,&vTemplate,&num); + + XPixmapFormatValues *pfvlist; + static int numpfv; + pfvlist = XListPixmapFormats(fl_display, &numpfv); + + OverlayInfo *overlayInfo = 0; + int numoverlayinfo = 0; + Atom overlayVisualsAtom = XInternAtom(fl_display,"SERVER_OVERLAY_VISUALS",1); + if (overlayVisualsAtom) { + unsigned long sizeData, bytesLeft; + Atom actualType; + int actualFormat; + if (!XGetWindowProperty(fl_display, RootWindow(fl_display, fl_screen), + overlayVisualsAtom, 0L, 10000L, False, + overlayVisualsAtom, &actualType, &actualFormat, + &sizeData, &bytesLeft, + (unsigned char **) &overlayInfo)) + numoverlayinfo = int(sizeData/4); + } + +#if HAVE_MULTIBUF + int event_base, error_base; + XmbufBufferInfo *mbuf, *sbuf; + int nmbuf = 0, nsbuf = 0; + if (XmbufQueryExtension(fl_display,&event_base, &error_base)) { + XmbufGetScreenInfo(fl_display,RootWindow(fl_display,fl_screen), + &nmbuf, &mbuf, &nsbuf, &sbuf); + } +#endif + +#if HAVE_XDBE + int event_base, error_base; + int numdouble = 0; + XdbeVisualInfo *dbe = 0; + if (XdbeQueryExtension(fl_display, &event_base, &error_base)) { + Drawable root = RootWindow(fl_display,fl_screen); + int numscreens = 1; + XdbeScreenVisualInfo *a = XdbeGetVisualInfo(fl_display,&root,&numscreens); + if (!a) printf("error getting double buffer visuals\n"); + else { + dbe = a->visinfo; + numdouble = a->count; + } + } +#endif + + for (int i=0; i= pfvlist+numpfv) {pfv = 0; break;} // should not happen! + if (pfv->depth == p->depth) break; + } + + int j = pfv ? pfv->bits_per_pixel : 0; + printf(" %2ld: %s %2d/%d", p->visualid, ClassNames[p->c_class], + p->depth, j); + if (j < 10) putchar(' '); + + print_mask(p); + + for (j=0; joverlay_visual == long(p->visualid)) { + printf(" overlay("); + if (o->transparent_type==1) printf("transparent pixel %ld, ",o->value); + else if (o->transparent_type==2) printf("transparent mask %ld, ",o->value); + else printf("opaque, "); + printf("layer %ld)", o->layer); + } + } + +#if HAVE_MULTIBUF + for (j=0; jvisualid == p->visualid) + printf(" multibuffer(%d)", m->max_buffers); + } + for (j=0; jvisualid == p->visualid) + printf(" stereo multibuffer(%d)", m->max_buffers); + } +#endif + +#if HAVE_XDBE + for (j = 0; j < numdouble; j++) if (dbe[j].visual == p->visualid) + printf(" doublebuf(perflevel %d)",dbe[j].perflevel); +#endif + + if (p->visualid==XVisualIDFromVisual(DefaultVisual(fl_display,fl_screen))) + printf(" (default visual)"); + + putchar('\n'); + } +} + +#endif + +#ifndef Fl_H +int main(int argc, char **argv) { + if (argc == 1); + else if (argc == 2 && argv[1][0]!='-') dname = argv[1]; + else {fprintf(stderr,"usage: %s \n",argv[0]); exit(1);} + list_visuals(); + return 0; +} +#endif + +// +// End of "$Id: list_visuals.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/makedepend b/third_party/windows/fltk-1.1.10/test/makedepend new file mode 100644 index 0000000..f8ace0f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/makedepend @@ -0,0 +1,388 @@ +# DO NOT DELETE THIS LINE -- make depend depends on it. +unittests.o: unittests.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/x.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Window.H ../FL/Fl_Button.H ../FL/Fl_Box.H \ + ../FL/fl_draw.H +adjuster.o: adjuster.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Adjuster.H ../FL/Fl_Valuator.H ../FL/Fl_Box.H +arc.o: arc.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Hor_Value_Slider.H ../FL/Fl_Value_Slider.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H +ask.o: ask.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Button.H ../FL/Fl_Return_Button.H \ + ../FL/Fl_Button.H ../FL/fl_ask.H +bitmap.o: bitmap.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Button.H \ + ../FL/Fl_Bitmap.H ../FL/Fl_Image.H ../FL/Fl_Toggle_Button.H \ + ../FL/Fl_Button.H +blocks.o: blocks.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Button.H ../FL/Fl_Preferences.H \ + ../FL/Fl_XPM_Image.H ../FL/Fl_Pixmap.H ../FL/Fl_Image.H \ + ../FL/Fl_XBM_Image.H ../FL/Fl_Bitmap.H ../FL/Fl_Tiled_Image.H \ + ../FL/fl_draw.H ../FL/x.H ../config.h pixmaps/blast.xpm pixmaps/red.xpm \ + pixmaps/red_bomb.xpm pixmaps/green.xpm pixmaps/green_bomb.xpm \ + pixmaps/blue.xpm pixmaps/blue_bomb.xpm pixmaps/yellow.xpm \ + pixmaps/yellow_bomb.xpm pixmaps/cyan.xpm pixmaps/cyan_bomb.xpm \ + pixmaps/magenta.xpm pixmaps/magenta_bomb.xpm pixmaps/gray.xpm \ + pixmaps/gray_bomb.xpm +boxtype.o: boxtype.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Box.H +browser.o: browser.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Select_Browser.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Button.H ../FL/Fl_Int_Input.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/fl_ask.H +button.o: button.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Button.H +buttons.o: buttons.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Button.H \ + ../FL/Fl_Return_Button.H ../FL/Fl_Button.H ../FL/Fl_Repeat_Button.H \ + ../FL/Fl.H ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H ../FL/Fl_Tooltip.H \ + ../FL/Fl_Widget.H +checkers.o: checkers.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H \ + ../FL/fl_draw.H ../FL/Fl_Menu_Item.H ../FL/fl_ask.H pixmaps/black_1.xbm \ + pixmaps/black_2.xbm pixmaps/black_3.xbm pixmaps/black_4.xbm \ + pixmaps/white_1.xbm pixmaps/white_2.xbm pixmaps/white_3.xbm \ + pixmaps/white_4.xbm pixmaps/blackking_1.xbm pixmaps/blackking_2.xbm \ + pixmaps/blackking_3.xbm pixmaps/blackking_4.xbm pixmaps/whiteking_1.xbm \ + pixmaps/whiteking_2.xbm pixmaps/whiteking_3.xbm pixmaps/whiteking_4.xbm \ + ../FL/Fl_Box.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Value_Output.H +clock.o: clock.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Clock.H \ + ../FL/Fl_Round_Clock.H ../FL/Fl_Clock.H +colbrowser.o: colbrowser.cxx ../FL/forms.H ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Window.H ../FL/fl_draw.H \ + ../FL/Fl_FormsBitmap.H ../FL/Fl_Bitmap.H ../FL/Fl_Image.H \ + ../FL/Fl_FormsPixmap.H ../FL/Fl_Pixmap.H ../FL/Fl_Box.H \ + ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H ../FL/Fl_Check_Button.H \ + ../FL/Fl_Chart.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Clock.H ../FL/Fl_Counter.H \ + ../FL/Fl_Dial.H ../FL/Fl_Free.H ../FL/fl_ask.H ../FL/fl_show_colormap.H \ + ../FL/filename.H ../FL/Fl_File_Chooser.H ../FL/Fl.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Group.H ../FL/Fl_Choice.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Button.H ../FL/Fl_Preferences.H \ + ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H ../FL/Fl_File_Icon.H \ + ../FL/Fl_Box.H ../FL/Fl_Check_Button.H ../FL/Fl_File_Input.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H \ + ../FL/fl_ask.H ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H \ + ../FL/Fl_Positioner.H ../FL/Fl_Value_Slider.H ../FL/Fl_Timer.H +color_chooser.o: color_chooser.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Box.H ../FL/Fl_Button.H ../FL/fl_show_colormap.H \ + ../FL/Fl_Color_Chooser.H ../FL/Fl_Group.H ../FL/Fl_Return_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Value_Input.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Image.H \ + ../FL/x.H ../FL/Fl_Window.H ../FL/fl_draw.H list_visuals.cxx \ + ../config.h +cube.o: cube.cxx ../config.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Box.H ../FL/Fl_Button.H ../FL/Fl_Radio_Light_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Button.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H ../FL/gl.h +CubeMain.o: CubeMain.cxx ../config.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H CubeViewUI.h ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Group.H \ + ../FL/Fl_Roller.H ../FL/Fl_Valuator.H ../FL/Fl_Slider.H ../FL/Fl_Box.H \ + CubeView.h ../config.h ../FL/Fl_Gl_Window.H ../FL/gl.h \ + ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H +CubeView.o: CubeView.cxx CubeView.h ../config.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Gl_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/gl.h +cursor.o: cursor.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Hor_Value_Slider.H ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/fl_draw.H ../FL/Fl_Box.H +curve.o: curve.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Hor_Value_Slider.H ../FL/Fl_Value_Slider.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H \ + ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H +demo.o: demo.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Box.H \ + ../FL/Fl_Button.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/filename.H ../FL/x.H \ + ../FL/Fl_Window.H +doublebuffer.o: doublebuffer.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Single_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Box.H ../FL/fl_draw.H ../FL/Fl_Hor_Slider.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/math.h +editor.o: editor.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/fl_ask.H \ + ../FL/Fl_File_Chooser.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Menu_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_Preferences.H ../FL/Fl_Tile.H \ + ../FL/Fl_File_Browser.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/filename.H ../FL/Fl_Box.H \ + ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Button.H \ + ../FL/Fl_File_Input.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/Fl_Return_Button.H ../FL/Fl_Menu_Bar.H ../FL/Fl_Text_Buffer.H \ + ../FL/Fl_Text_Editor.H ../FL/Fl_Text_Display.H ../FL/fl_draw.H \ + ../FL/Fl_Text_Buffer.H +fast_slow.o: fast_slow.cxx fast_slow.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Box.H +file_chooser.o: file_chooser.cxx ../FL/Fl_File_Chooser.H ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Group.H \ + ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H \ + ../FL/Fl_Image.H ../FL/Fl_Menu_Button.H ../FL/Fl_Button.H \ + ../FL/Fl_Preferences.H ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H \ + ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_File_Icon.H ../FL/Fl.H \ + ../FL/filename.H ../FL/Fl_Box.H ../FL/Fl_Check_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Button.H ../FL/Fl_File_Input.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H \ + ../FL/fl_ask.H ../FL/Fl_File_Icon.H ../FL/Fl_Shared_Image.H \ + ../FL/Fl_PNM_Image.H ../FL/Fl_Light_Button.H +fonts.o: fonts.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Hold_Browser.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/fl_draw.H ../FL/Fl_Box.H ../FL/fl_ask.H +forms.o: forms.cxx ../FL/forms.H ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Window.H \ + ../FL/fl_draw.H ../FL/Fl_FormsBitmap.H ../FL/Fl_Bitmap.H \ + ../FL/Fl_Image.H ../FL/Fl_FormsPixmap.H ../FL/Fl_Pixmap.H \ + ../FL/Fl_Box.H ../FL/Fl_Browser.H ../FL/Fl_Browser_.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H \ + ../FL/Fl_Check_Button.H ../FL/Fl_Chart.H ../FL/Fl_Choice.H \ + ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Clock.H \ + ../FL/Fl_Counter.H ../FL/Fl_Dial.H ../FL/Fl_Free.H ../FL/fl_ask.H \ + ../FL/fl_show_colormap.H ../FL/filename.H ../FL/Fl_File_Chooser.H \ + ../FL/Fl.H ../FL/Fl_Double_Window.H ../FL/Fl_Group.H ../FL/Fl_Choice.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Button.H ../FL/Fl_Preferences.H \ + ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H ../FL/Fl_File_Icon.H \ + ../FL/Fl_Box.H ../FL/Fl_Check_Button.H ../FL/Fl_File_Input.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Return_Button.H \ + ../FL/fl_ask.H ../FL/Fl_Input.H ../FL/Fl_Menu_Button.H \ + ../FL/Fl_Positioner.H ../FL/Fl_Value_Slider.H ../FL/Fl_Timer.H \ + pixmaps/srs.xbm +fractals.o: fractals.cxx ../config.h ../FL/glut.H ../FL/gl.h \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl.H ../FL/Fl_Gl_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/glu.h \ + fracviewer.h ../FL/Fl_Button.H ../FL/Fl_Group.H ../FL/Fl_Window.H +fullscreen.o: fullscreen.cxx ../config.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Single_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Hor_Slider.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Toggle_Light_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Button.H ../FL/math.h ../FL/gl.h \ + ../FL/Fl_Gl_Window.H +gl_overlay.o: gl_overlay.cxx ../config.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Hor_Slider.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H ../FL/math.h ../FL/gl.h \ + ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H +glpuzzle.o: glpuzzle.cxx ../config.h ../FL/glut.H ../FL/gl.h \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl.H ../FL/Fl_Gl_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/glu.h \ + trackball.c trackball.h +hello.o: hello.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Box.H \ + ../FL/filename.H +help.o: help.cxx ../FL/Fl_Help_Dialog.H ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Group.H ../FL/Fl_Button.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Box.H ../FL/Fl_Help_View.H \ + ../FL/Fl.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/fl_draw.H ../FL/Fl_Shared_Image.H ../FL/Fl_Image.H +iconize.o: iconize.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Button.H \ + ../FL/Fl_Box.H +image.o: image.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Button.H \ + ../FL/Fl_Image.H ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H ../FL/x.H \ + ../FL/Fl_Window.H list_visuals.cxx ../config.h +inactive.o: inactive.cxx inactive.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Group.H ../FL/Fl_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Button.H ../FL/Fl_Check_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H \ + ../FL/Fl_Image.H ../FL/Fl_Value_Output.H ../FL/Fl_Box.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Roller.H \ + ../FL/Fl_Dial.H ../FL/Fl_Clock.H +input.o: input.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Float_Input.H ../FL/Fl_Input.H \ + ../FL/Fl_Int_Input.H ../FL/Fl_Secret_Input.H ../FL/Fl_Multiline_Input.H \ + ../FL/Fl_Button.H ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H \ + ../FL/Fl_Color_Chooser.H ../FL/Fl_Group.H ../FL/Fl_Box.H \ + ../FL/Fl_Return_Button.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Value_Input.H \ + ../FL/Fl_Valuator.H +input_choice.o: input_choice.cxx ../FL/Fl_Button.H ../FL/Fl_Widget.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Input_Choice.H ../FL/Fl.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Menu_Button.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/fl_draw.H +keyboard.o: keyboard.cxx keyboard_ui.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H keyboard.h ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Button.H ../FL/Fl_Output.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Box.H ../FL/Fl_Dial.H ../FL/Fl_Valuator.H +label.o: label.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Box.H ../FL/Fl_Hor_Value_Slider.H \ + ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/fl_draw.H +line_style.o: line_style.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/fl_draw.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H \ + ../FL/Fl_Image.H +list_visuals.o: list_visuals.cxx ../config.h +mandelbrot.o: mandelbrot.cxx mandelbrot_ui.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H mandelbrot.h ../FL/Fl_Box.H \ + ../FL/Fl_Widget.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/fl_draw.H +menubar.o: menubar.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Box.H ../FL/Fl_Widget.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Menu_Bar.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H \ + ../FL/Fl_Image.H ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H \ + ../FL/Fl_Menu_Button.H ../FL/Fl_Choice.H ../src/flstring.h \ + ../FL/Fl_Export.H ../config.h ../FL/fl_draw.H +message.o: message.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/fl_ask.H +minimum.o: minimum.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Box.H ../FL/Fl_Return_Button.H \ + ../FL/Fl_Button.H +navigation.o: navigation.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H +output.o: output.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Value_Input.H ../FL/Fl_Valuator.H ../FL/Fl_Widget.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Box.H ../FL/Fl_Hor_Value_Slider.H ../FL/Fl_Value_Slider.H \ + ../FL/Fl_Slider.H ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H \ + ../FL/Fl_Input.H ../FL/fl_draw.H ../FL/Fl_Output.H \ + ../FL/Fl_Multiline_Output.H ../FL/Fl_Output.H +overlay.o: overlay.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Overlay_Window.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Button.H ../FL/fl_draw.H +pack.o: pack.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Button.H ../FL/Fl_Widget.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Scroll.H \ + ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/Fl_Value_Slider.H ../FL/Fl_Pack.H ../FL/Fl_Group.H +pixmap_browser.o: pixmap_browser.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Box.H ../FL/Fl_Widget.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Button.H ../FL/Fl_Shared_Image.H \ + ../FL/Fl_Image.H ../FL/Fl_File_Chooser.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Menu_Button.H ../FL/Fl_Preferences.H \ + ../FL/Fl_Tile.H ../FL/Fl_File_Browser.H ../FL/Fl_Browser.H \ + ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_File_Icon.H ../FL/Fl.H ../FL/filename.H \ + ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Button.H \ + ../FL/Fl_File_Input.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/Fl_Return_Button.H ../FL/fl_ask.H ../FL/fl_message.H \ + ../FL/fl_ask.H +pixmap.o: pixmap.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Button.H \ + ../FL/Fl_Pixmap.H ../FL/Fl_Image.H pixmaps/porsche.xpm \ + ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H ../FL/Fl_Multi_Label.H +preferences.o: preferences.cxx preferences.h ../FL/Fl.H \ + ../FL/Enumerations.H ../FL/Fl_Export.H ../FL/Fl_Preferences.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Button.H ../FL/Fl_Group.H ../FL/Fl_Input.H \ + ../FL/Fl_Input_.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Round_Button.H \ + ../FL/Fl_Light_Button.H ../FL/Fl_Button.H ../FL/Fl_Box.H \ + ../FL/Fl_Check_Button.H ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/filename.H ../FL/fl_ask.H +radio.o: radio.cxx radio.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Button.H \ + ../FL/Fl_Return_Button.H ../FL/Fl_Button.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Check_Button.H ../FL/Fl_Light_Button.H ../FL/Fl_Round_Button.H \ + ../FL/Fl_Group.H +resizebox.o: resizebox.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Single_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Box.H \ + ../FL/Fl_Radio_Button.H ../FL/Fl_Button.H ../FL/fl_draw.H \ + ../FL/fl_message.H ../FL/fl_ask.H +resize.o: resize.cxx resize.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Button.H ../FL/Fl_Box.H +scroll.o: scroll.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Scroll.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Light_Button.H \ + ../FL/Fl_Button.H ../FL/Fl_Choice.H ../FL/Fl_Menu_.H \ + ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Box.H ../FL/fl_draw.H \ + ../FL/math.h +shape.o: shape.cxx ../config.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Hor_Slider.H ../FL/Fl_Slider.H ../FL/Fl_Valuator.H \ + ../FL/math.h ../FL/gl.h ../FL/Fl_Gl_Window.H ../FL/Fl_Window.H +subwindow.o: subwindow.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Toggle_Button.H ../FL/Fl_Button.H ../FL/Fl_Menu_Button.H \ + ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/Fl_Image.H ../FL/Fl_Box.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/fl_draw.H +sudoku.o: sudoku.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Enumerations.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Button.H ../FL/Fl_Group.H ../FL/fl_ask.H \ + ../FL/fl_draw.H ../FL/Fl_Help_Dialog.H ../FL/Fl_Double_Window.H \ + ../FL/Fl_Window.H ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Box.H \ + ../FL/Fl_Help_View.H ../FL/Fl.H ../FL/Fl_Scrollbar.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/fl_draw.H ../FL/Fl_Shared_Image.H \ + ../FL/Fl_Image.H ../FL/Fl_Preferences.H ../FL/Fl_Sys_Menu_Bar.H \ + ../FL/Fl_Menu_Bar.H ../FL/Fl_Menu_.H ../FL/Fl_Menu_Item.H ../FL/x.H \ + ../FL/math.h pixmaps/sudoku.xbm ../config.h +symbols.o: symbols.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Single_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Box.H ../FL/Fl_Value_Slider.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/fl_draw.H +tabs.o: tabs.cxx tabs.h ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Box.H ../FL/Fl_Tabs.H ../FL/Fl_Group.H \ + ../FL/Fl_Input.H ../FL/Fl_Input_.H ../FL/Fl_Button.H ../FL/fl_ask.H \ + ../FL/Fl_Clock.H ../FL/Fl_Wizard.H ../FL/Fl_Return_Button.H \ + ../FL/Fl_Button.H +threads.o: threads.cxx ../config.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Browser.H ../FL/Fl_Browser_.H ../FL/Fl_Scrollbar.H \ + ../FL/Fl_Slider.H ../FL/Fl_Valuator.H ../FL/Fl_Value_Output.H threads.h +tile.o: tile.cxx ../FL/Fl.H ../FL/Enumerations.H ../FL/Fl_Export.H \ + ../FL/Fl_Double_Window.H ../FL/Fl_Window.H ../FL/Fl_Group.H \ + ../FL/Fl_Widget.H ../FL/Fl_Tile.H ../FL/Fl_Box.H +tiled_image.o: tiled_image.cxx ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Window.H ../FL/Fl_Group.H ../FL/Fl_Widget.H \ + ../FL/Fl_Button.H ../FL/Fl_Pixmap.H ../FL/Fl_Image.H \ + ../FL/Fl_Tiled_Image.H pixmaps/tile.xpm ../FL/x.H ../FL/Fl_Window.H \ + list_visuals.cxx ../config.h +valuators.o: valuators.cxx valuators.h ../FL/Fl.H ../FL/Enumerations.H \ + ../FL/Fl_Export.H ../FL/Fl_Double_Window.H ../FL/Fl_Window.H \ + ../FL/Fl_Group.H ../FL/Fl_Widget.H ../FL/Fl_Box.H ../FL/Fl_Slider.H \ + ../FL/Fl_Valuator.H ../FL/Fl_Value_Slider.H ../FL/Fl_Slider.H \ + ../FL/Fl_Value_Input.H ../FL/Fl_Input.H ../FL/Fl_Input_.H \ + ../FL/Fl_Value_Output.H ../FL/Fl_Scrollbar.H ../FL/Fl_Adjuster.H \ + ../FL/Fl_Counter.H ../FL/Fl_Spinner.H ../FL/Enumerations.H \ + ../FL/Fl_Group.H ../FL/Fl_Input.H ../FL/Fl_Repeat_Button.H ../FL/Fl.H \ + ../FL/Fl_Button.H ../FL/Fl_Dial.H ../FL/Fl_Roller.H diff --git a/third_party/windows/fltk-1.1.10/test/makefile.wat b/third_party/windows/fltk-1.1.10/test/makefile.wat new file mode 100644 index 0000000..305fced --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/makefile.wat @@ -0,0 +1,289 @@ +# +# "$Id: makefile.wat 4359 2005-05-19 16:07:13Z mike $" +# +# Test/example program makefile for the Fast Light Tool Kit (FLTK). +# +# Copyright 1998-2004 by Bill Spitzak and others. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems to "fltk-bugs@fltk.org". +# + +!include ../watcom.mif + +ALL = & + $(ODIR)/unittests$(EXEEXT) & + $(ODIR)/adjuster$(EXEEXT) & + $(ODIR)/arc$(EXEEXT) & + $(ODIR)/ask$(EXEEXT) & + $(ODIR)/bitmap$(EXEEXT) & + $(ODIR)/boxtype$(EXEEXT) & + $(ODIR)/browser$(EXEEXT) & + $(ODIR)/button$(EXEEXT) & + $(ODIR)/buttons$(EXEEXT) & + $(ODIR)/checkers$(EXEEXT) & + $(ODIR)/clock$(EXEEXT) & + $(ODIR)/colbrowser$(EXEEXT) & + $(ODIR)/color_chooser$(EXEEXT) & + $(ODIR)/cursor$(EXEEXT) & + $(ODIR)/curve$(EXEEXT) & + $(ODIR)/demo$(EXEEXT) & + $(ODIR)/doublebuffer$(EXEEXT) & + $(ODIR)/editor$(EXEEXT) & + $(ODIR)/fast_slow$(EXEEXT) & + $(ODIR)/file_chooser$(EXEEXT) & + $(ODIR)/fonts$(EXEEXT) & + $(ODIR)/forms$(EXEEXT) & + $(ODIR)/hello$(EXEEXT) & + $(ODIR)/help$(EXEEXT) & + $(ODIR)/iconize$(EXEEXT) & + $(ODIR)/image$(EXEEXT) & + $(ODIR)/inactive$(EXEEXT) & + $(ODIR)/input$(EXEEXT) & + $(ODIR)/keyboard$(EXEEXT) & + $(ODIR)/label$(EXEEXT) & + $(ODIR)/line_style$(EXEEXT) & + $(ODIR)/list_visuals$(EXEEXT) & + $(ODIR)/mandelbrot$(EXEEXT) & + $(ODIR)/menubar$(EXEEXT) & + $(ODIR)/message$(EXEEXT) & + $(ODIR)/minimum$(EXEEXT) & + $(ODIR)/navigation$(EXEEXT) & + $(ODIR)/output$(EXEEXT) & + $(ODIR)/overlay$(EXEEXT) & + $(ODIR)/pack$(EXEEXT) & + $(ODIR)/pixmap$(EXEEXT) & + $(ODIR)/pixmap_browser$(EXEEXT) & + $(ODIR)/preferences$(EXEEXT) & + $(ODIR)/radio$(EXEEXT) & + $(ODIR)/resize$(EXEEXT) & + $(ODIR)/resizebox$(EXEEXT) & + $(ODIR)/scroll$(EXEEXT) & + $(ODIR)/subwindow$(EXEEXT) & + $(ODIR)/symbols$(EXEEXT) & + $(ODIR)/tabs$(EXEEXT) & + $(ODIR)/threads$(EXEEXT) & + $(ODIR)/tile$(EXEEXT) & + $(ODIR)/tiled_image$(EXEEXT) & + $(ODIR)/valuators$(EXEEXT) + +GLALL = & + $(ODIR)/cube$(EXEEXT) & + $(ODIR)/CubeView$(EXEEXT) & + $(ODIR)/fractals$(EXEEXT) & + $(ODIR)/fullscreen$(EXEEXT) & + $(ODIR)/gl_overlay$(EXEEXT) & + $(ODIR)/glpuzzle$(EXEEXT) & + $(ODIR)/shape$(EXEEXT) + +all: $(ALL) $(GLALL) + +gldemos: $(GLALL) + + +# FLUID file rules. We could put them in ../watcom.mif really, but that needs testing. +.fl.cxx: + echo Generating $<... + -..\fluid\$(ODIR)\fluid$(EXEEXT) -c $[@ + +.fl.h: + echo Generating $<... + -..\fluid\$(ODIR)\fluid$(EXEEXT) -c $[@ + +# All demos depend on the FLTK library... +$(ALL): $(LIBNAME) + +# General demos..... Normally a executable depending on an object file of the same name +# shouldn't need a target line. But if different output directories are used, changes +# in sources files are not picked up, so we do need a line per target. + +$(ODIR)/unittests$(EXEEXT) : $(ODIR)/unittests.obj + +$(ODIR)/adjuster$(EXEEXT) : $(ODIR)/adjuster.obj + +$(ODIR)/arc$(EXEEXT) : $(ODIR)/arc.obj + +$(ODIR)/ask$(EXEEXT) : $(ODIR)/ask.obj + +$(ODIR)/bitmap$(EXEEXT) : $(ODIR)/bitmap.obj + +$(ODIR)/boxtype$(EXEEXT) : $(ODIR)/boxtype.obj + +$(ODIR)/browser$(EXEEXT) : $(ODIR)/browser.obj + +$(ODIR)/button$(EXEEXT) : $(ODIR)/button.obj + +$(ODIR)/buttons$(EXEEXT) : $(ODIR)/buttons.obj + +$(ODIR)/checkers$(EXEEXT) : $(ODIR)/checkers.obj + +$(ODIR)/clock$(EXEEXT) : $(ODIR)/clock.obj + +$(ODIR)/colbrowser$(EXEEXT) : $(ODIR)/colbrowser.obj + +$(ODIR)/color_chooser$(EXEEXT) : $(ODIR)/color_chooser.obj + +$(ODIR)/cursor$(EXEEXT) : $(ODIR)/cursor.obj + +$(ODIR)/curve$(EXEEXT) : $(ODIR)/curve.obj + +$(ODIR)/demo$(EXEEXT) : $(ODIR)/demo.obj + +$(ODIR)/doublebuffer$(EXEEXT) : $(ODIR)/doublebuffer.obj + +$(ODIR)/editor$(EXEEXT) : $(ODIR)/editor.obj + +$(ODIR)/fast_slow$(EXEEXT) : $(ODIR)/fast_slow.obj + +$(ODIR)/file_chooser$(EXEEXT) : $(ODIR)/file_chooser.obj + +$(ODIR)/fonts$(EXEEXT) : $(ODIR)/fonts.obj + +$(ODIR)/forms$(EXEEXT) : $(ODIR)/forms.obj + +$(ODIR)/hello$(EXEEXT) : $(ODIR)/hello.obj + +$(ODIR)/help$(EXEEXT) : $(ODIR)/help.obj + +$(ODIR)/iconize$(EXEEXT) : $(ODIR)/iconize.obj + +$(ODIR)/image$(EXEEXT) : $(ODIR)/image.obj + +$(ODIR)/inactive$(EXEEXT) : $(ODIR)/inactive.obj + +$(ODIR)/input$(EXEEXT) : $(ODIR)/input.obj + +$(ODIR)/label$(EXEEXT) : $(ODIR)/label.obj + +$(ODIR)/line_style$(EXEEXT) : $(ODIR)/line_style.obj + +$(ODIR)/list_visuals$(EXEEXT) : $(ODIR)/list_visuals.obj + +$(ODIR)/menubar$(EXEEXT) : $(ODIR)/menubar.obj + +$(ODIR)/message$(EXEEXT) : $(ODIR)/message.obj + +$(ODIR)/minimum$(EXEEXT) : $(ODIR)/minimum.obj + +$(ODIR)/navigation$(EXEEXT) : $(ODIR)/navigation.obj + +$(ODIR)/output$(EXEEXT) : $(ODIR)/output.obj + +$(ODIR)/overlay$(EXEEXT) : $(ODIR)/overlay.obj + +$(ODIR)/pack$(EXEEXT) : $(ODIR)/pack.obj + +$(ODIR)/pixmap$(EXEEXT) : $(ODIR)/pixmap.obj + +$(ODIR)/pixmap_browser$(EXEEXT) : $(ODIR)/pixmap_browser.obj + +$(ODIR)/preferences$(EXEEXT) : $(ODIR)/preferences.obj + +$(ODIR)/radio$(EXEEXT) : $(ODIR)/radio.obj + +$(ODIR)/resize$(EXEEXT) : $(ODIR)/resize.obj + +$(ODIR)/resizebox$(EXEEXT) : $(ODIR)/resizebox.obj + +$(ODIR)/scroll$(EXEEXT) : $(ODIR)/scroll.obj + +$(ODIR)/subwindow$(EXEEXT) : $(ODIR)/subwindow.obj + +$(ODIR)/symbols$(EXEEXT) : $(ODIR)/symbols.obj + +$(ODIR)/tabs$(EXEEXT) : $(ODIR)/tabs.obj + +$(ODIR)/threads$(EXEEXT) : $(ODIR)/threads.obj + +$(ODIR)/tile$(EXEEXT) : $(ODIR)/tile.obj + +$(ODIR)/tiled_image$(EXEEXT) : $(ODIR)/tiled_image.obj + +$(ODIR)/valuators$(EXEEXT) : $(ODIR)/valuators.obj + +# Because keyboard_ui.obj is listed first, fluid will be used to generate the .cxx and .h file +# so that when keyboard.obj is built, keyboard_ui.h is there. +KBDOBJECTS=keyboard_ui.obj keyboard.obj +$(ODIR)/keyboard$(EXEEXT): $(KBDOBJECTS) keyboard_ui.h + @%create $^*.lk1 + @for %i in ($(KBDOBJECTS)) do @%append $^*.lk1 F $(ODIR)/%i + @for %i in ($(LIBS)) do @%append $^*.lk1 L %i + @for %i in ($(EXTRA_LIBS)) do @%append $^*.lk1 L %i + @for %i in ($(SYSLIBS)) do @%append $^*.lk1 L %i + $(LN) $(LNOPTS) name $^@ op map=$^* @$^*.lk1 + @del $^*.lk1 + @set KBDOBJECTS= + +MDLOBJECTS=mandelbrot_ui.obj mandelbrot.obj +$(ODIR)/mandelbrot$(EXEEXT): $(MDLOBJECTS) + @%create $^*.lk1 + @for %i in ($(MDLOBJECTS)) do @%append $^*.lk1 F $(ODIR)/%i + @for %i in ($(LIBS)) do @%append $^*.lk1 L %i + @for %i in ($(EXTRA_LIBS)) do @%append $^*.lk1 L %i + @for %i in ($(SYSLIBS)) do @%append $^*.lk1 L %i + $(LN) $(LNOPTS) name $^@ op map=$^* @$^*.lk1 + @del $^*.lk1 + +# All OpenGL demos depend on the FLTK and FLTK_GL libraries... +$(GLALL): $(LIBNAME) $(LIBNAMEGL) + +# OpenGL demos... + +$(ODIR)/cube$(EXEEXT) : $(ODIR)/cube.obj + +$(ODIR)/fullscreen$(EXEEXT) : $(ODIR)/fullscreen.obj + +$(ODIR)/gl_overlay$(EXEEXT) : $(ODIR)/gl_overlay.obj + +$(ODIR)/glpuzzle$(EXEEXT) : $(ODIR)/glpuzzle.obj + +$(ODIR)/shape$(EXEEXT) : $(ODIR)/shape.obj + +CBVOBJECTS = CubeView.obj CubeViewUI.obj CubeMain.obj +$(ODIR)/CubeView$(EXEEXT): $(CBVOBJECTS) + @%create $^*.lk1 + @for %i in ($(CBVOBJECTS)) do @%append $^*.lk1 F $(ODIR)/%i + @for %i in ($(LIBS)) do @%append $^*.lk1 L %i + @for %i in ($(EXTRA_LIBS)) do @%append $^*.lk1 L %i + @for %i in ($(SYSLIBS)) do @%append $^*.lk1 L %i + $(LN) $(LNOPTS) name $^@ op map=$^* @$^*.lk1 + @del $^*.lk1 + +FRTOBJECTS = fractals.obj fracviewer.obj +$(ODIR)/fractals$(EXEEXT): $(FRTOBJECTS) + @%create $^*.lk1 + @for %i in ($(FRTOBJECTS)) do @%append $^*.lk1 F $(ODIR)/%i + @for %i in ($(LIBS)) do @%append $^*.lk1 L %i + @for %i in ($(EXTRA_LIBS)) do @%append $^*.lk1 L %i + @for %i in ($(SYSLIBS)) do @%append $^*.lk1 L %i + $(LN) $(LNOPTS) name $^@ op map=$^* @$^*.lk1 + @del $^*.lk1 + +# +# Clean all directories +# +clean : .SYMBOLIC + @echo Cleaning up. +CLEANEXTS = exe map sym obj lk1 + @for %a in ($(CLEANEXTS)) do -rm -f $(ODIR)\*.%a + -rm -f *.err +FLUIDMADE = fastslow inactive keyboard_ui preferences radio resize tabs valuators + @for %a in ($(FLUIDMADE)) do -rm -f %a.cxx %a.h + +# +# End of "$Id: makefile.wat 4359 2005-05-19 16:07:13Z mike $". +# diff --git a/third_party/windows/fltk-1.1.10/test/mandelbrot.cxx b/third_party/windows/fltk-1.1.10/test/mandelbrot.cxx new file mode 100644 index 0000000..27a40c2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/mandelbrot.cxx @@ -0,0 +1,203 @@ +// +// "$Id: mandelbrot.cxx 6474 2008-10-19 20:15:48Z matt $" +// +// Mandelbrot set demo for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "mandelbrot_ui.h" +#include +#include +#include + +Drawing_Window mbrot; +Drawing_Window jbrot; + +void idle(void*) { + if (!mbrot.d->idle() && !(jbrot.d && jbrot.d->idle())) Fl::remove_idle(idle); +} + +void set_idle() { + Fl::add_idle(idle); +} + +static void window_callback(Fl_Widget*, void*) {exit(0);} + +int main(int argc, char **argv) { + mbrot.make_window(); + mbrot.d->X = -.75; + mbrot.d->scale = 2.5; + mbrot.update_label(); + int i = 0; + if (Fl::args(argc,argv,i) < argc) Fl::fatal(Fl::help); + Fl::visual(FL_RGB); + mbrot.window->callback(window_callback); + mbrot.window->show(argc,argv); + Fl::run(); + return 0; +} + +void Drawing_Window::update_label() { + char buffer[128]; + sprintf(buffer, "%+.10f", d->X); x_input->value(buffer); + sprintf(buffer, "%+.10f", d->Y); y_input->value(buffer); + sprintf(buffer, "%.2g", d->scale); w_input->value(buffer); +} + +void Drawing_Area::draw() { + draw_box(); + drawn = 0; + set_idle(); +} + +int Drawing_Area::idle() { + if (!window()->visible()) return 0; + if (drawn < nextline) { + window()->make_current(); + int yy = drawn+y()+4; + if (yy >= sy && yy <= sy+sh) erase_box(); + fl_draw_image_mono(buffer+drawn*W,x()+3,yy,W,1,1,W); + drawn++; + return 1; + } + if (nextline < H) { + if (!buffer) buffer = new uchar[W*H]; + double yy = Y+(H/2-nextline)*scale/W; + double yi = yy; if (julia) yy = jY; + uchar *p = buffer+nextline*W; + for (int xi = 0; xi < W; xi++) { + double xx = X+(xi-W/2)*scale/W; + double wx = xx; double wy = yi; + if (julia) xx = jX; + for (int i=0; ; i++) { + if (i >= iterations) {*p = 0; break;} + double t = wx*wx - wy*wy + xx; + wy = 2*wx*wy + yy; + wx = t; + if (wx*wx + wy*wy > 4) { + wx = t = 1-double(i)/(1<<10); + if (t <= 0) t = 0; else for (i=brightness; i--;) t*=wx; + *p = 255-int(254*t); + break; + } + } + p++; + } + nextline++; + return nextline < H; + } + return 0; +} + +void Drawing_Area::erase_box() { + window()->make_current(); + fl_overlay_clear(); +} + +int Drawing_Area::handle(int event) { + static int ix, iy; + static int dragged; + static int button; + int x2,y2; + switch (event) { + case FL_PUSH: + erase_box(); + ix = Fl::event_x(); if (ix=x()+w()) ix=x()+w()-1; + iy = Fl::event_y(); if (iy=y()+h()) iy=y()+h()-1; + dragged = 0; + button = Fl::event_button(); + return 1; + case FL_DRAG: + dragged = 1; + erase_box(); + x2 = Fl::event_x(); if (x2=x()+w()) x2=x()+w()-1; + y2 = Fl::event_y(); if (y2=y()+h()) y2=y()+h()-1; + if (button != 1) {ix = x2; iy = y2; return 1;} + if (ix < x2) {sx = ix; sw = x2-ix;} else {sx = x2; sw = ix-x2;} + if (iy < y2) {sy = iy; sh = y2-iy;} else {sy = y2; sh = iy-y2;} + window()->make_current(); + fl_overlay_rect(sx,sy,sw,sh); + return 1; + case FL_RELEASE: + if (button == 1) { + erase_box(); + if (dragged && sw > 3 && sh > 3) { + X = X + (sx+sw/2-x()-W/2)*scale/W; + Y = Y + (-sy-sh/2+y()+H/2)*scale/W; + scale = sw*scale/W; + } else if (!dragged) { + scale = 2*scale; + if (julia) { + if (scale >= 4) { + scale = 4; + X = Y = 0; + } + } else { + if (scale >= 2.5) { + scale = 2.5; + X = -.75; + Y = 0; + } + } + } else return 1; + ((Drawing_Window*)(user_data()))->update_label(); + new_display(); + } else if (!julia) { + if (!jbrot.d) { + jbrot.make_window(); + jbrot.d->julia = 1; + jbrot.d->X = 0; + jbrot.d->Y = 0; + jbrot.d->scale = 4; + jbrot.update_label(); + } + jbrot.d->jX = X + (ix-x()-W/2)*scale/W; + jbrot.d->jY = Y + (H/2-iy+y())*scale/W; + static char s[128]; + sprintf(s, "Julia %.7f %.7f",jbrot.d->jX,jbrot.d->jY); + jbrot.window->label(s); + jbrot.window->show(); + jbrot.d->new_display(); + } + return 1; + } + return 0; +} + +void Drawing_Area::new_display() { + drawn = nextline = 0; + set_idle(); +} + +void Drawing_Area::resize(int XX,int YY,int WW,int HH) { + if (WW != w() || HH != h()) { + W = WW-6; + H = HH-8; + if (buffer) {delete[] buffer; buffer = 0; new_display();} + } + Fl_Box::resize(XX,YY,WW,HH); +} + +// +// End of "$Id: mandelbrot.cxx 6474 2008-10-19 20:15:48Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/test/mandelbrot.h b/third_party/windows/fltk-1.1.10/test/mandelbrot.h new file mode 100644 index 0000000..179ea4e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/mandelbrot.h @@ -0,0 +1,74 @@ +// +// "$Id: mandelbrot.h 5519 2006-10-11 03:12:15Z mike $" +// +// Mandelbrot set header file for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +class Drawing_Area : public Fl_Box { + void draw(); +public: + uchar *buffer; + int W,H; + int nextline; + int drawn; + int julia; + int iterations; + int brightness; + double jX, jY; + double X,Y,scale; + int sx, sy, sw, sh; // selection box + void erase_box(); + int handle(int); + void resize(int,int,int,int); + void new_display(); + enum { + MAX_BRIGHTNESS = 16, + DEFAULT_BRIGHTNESS = 16, + MAX_ITERATIONS = 14, + DEFAULT_ITERATIONS = 7 + }; + Drawing_Area(int x,int y,int w,int h) : Fl_Box(x,y,w,h) { + buffer = 0; + W = w-6; + H = h-8; + nextline = 0; + drawn = 0; + julia = 0; + X = Y = 0; + scale = 4.0; + iterations = 1<} {} + +class Drawing_Window {open +} { + Function {make_window()} {open return_type void + } { + Fl_Window window {open selected + xywh {178 479 450 520} type Single resizable + code0 {o->size_range(220,220);} visible + } { + Fl_Box d { + user_data this user_data_type {void*} + xywh {20 80 410 430} box DOWN_BOX color 0 selection_color 47 resizable + class Drawing_Area + } + Fl_Input x_input { + label {x:} + callback {d->X = atof(o->value());; +d->new_display();} + xywh {30 15 125 30} type Float box THIN_DOWN_BOX color 8 selection_color 7 labelfont 11 labelsize 20 textfont 11 textsize 20 + code0 {o->when(FL_WHEN_ENTER_KEY|FL_WHEN_RELEASE);} + } + Fl_Input y_input { + label {y:} + callback {d->Y = atof(o->value()); +d->new_display();} + xywh {175 15 125 30} type Float box THIN_DOWN_BOX color 8 selection_color 7 labelfont 11 labelsize 20 textfont 11 textsize 20 + code0 {o->when(FL_WHEN_ENTER_KEY|FL_WHEN_RELEASE);} + } + Fl_Input w_input { + label {w:} + callback {d->scale = atof(o->value()); +d->new_display();} + xywh {325 15 105 30} type Float box THIN_DOWN_BOX color 8 selection_color 7 labelfont 11 labelsize 20 textfont 11 textsize 20 + code0 {o->when(FL_WHEN_ENTER_KEY|FL_WHEN_RELEASE);} + } + Fl_Slider {} { + label {brightness:} + callback {d->brightness = int(o->value()); +d->new_display();} + xywh {80 50 160 15} type Horizontal box THIN_DOWN_BOX labelsize 10 align 4 step 1 slider_size 0.1 + code0 {o->bounds(0,d->MAX_BRIGHTNESS);} + code2 {o->value(d->DEFAULT_BRIGHTNESS);} + code3 {o->slider(FL_UP_BOX);} + } + Fl_Box {} { + label {left: click = zoom out, drag = zoom in +right click: Julia set} + xywh {240 50 190 30} labelsize 10 align 24 deactivate + } + Fl_Slider {} { + label {iterations:} + callback {d->iterations = 1<value()); +d->new_display();} + xywh {80 65 160 15} type Horizontal box THIN_DOWN_BOX labelsize 10 align 4 step 1 slider_size 0.1 + code0 {o->bounds(1,d->MAX_ITERATIONS);} + code2 {o->value(d->DEFAULT_ITERATIONS);} + code3 {o->slider(FL_UP_BOX);} + } + } + } + decl {void update_label();} {public + } +} diff --git a/third_party/windows/fltk-1.1.10/test/menubar.cxx b/third_party/windows/fltk-1.1.10/test/menubar.cxx new file mode 100644 index 0000000..f198f3b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/menubar.cxx @@ -0,0 +1,247 @@ +// +// "$Id: menubar.cxx 6610 2008-12-29 17:24:51Z matt $" +// +// Menubar test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../src/flstring.h" +#include + +void window_cb(Fl_Widget* w, void*) { + puts("window callback called"); + ((Fl_Window *)w)->hide(); +} + +void test_cb(Fl_Widget* w, void*) { + Fl_Menu_* mw = (Fl_Menu_*)w; + const Fl_Menu_Item* m = mw->mvalue(); + if (!m) + printf("NULL\n"); + else if (m->shortcut()) + printf("%s - %s\n", m->label(), fl_shortcut_label(m->shortcut())); + else + printf("%s\n", m->label()); +} + +void quit_cb(Fl_Widget*, void*) {exit(0);} + +Fl_Menu_Item hugemenu[100]; + +Fl_Menu_Item menutable[] = { + {"foo",0,0,0,FL_MENU_INACTIVE}, + {"&File",0,0,0,FL_SUBMENU}, + {"&Open", FL_ALT+'o', 0, 0, FL_MENU_INACTIVE}, + {"&Close", 0, 0}, + {"&Quit", FL_ALT+'q', quit_cb, 0, FL_MENU_DIVIDER}, + {"shortcut",'a'}, + {"shortcut",FL_SHIFT+'a'}, + {"shortcut",FL_CTRL+'a'}, + {"shortcut",FL_CTRL+FL_SHIFT+'a'}, + {"shortcut",FL_ALT+'a'}, + {"shortcut",FL_ALT+FL_SHIFT+'a'}, + {"shortcut",FL_ALT+FL_CTRL+'a'}, + {"shortcut",FL_ALT+FL_SHIFT+FL_CTRL+'a', 0,0, FL_MENU_DIVIDER}, + {"shortcut",'\r'/*FL_Enter*/}, + {"shortcut",FL_CTRL+FL_Enter, 0,0, FL_MENU_DIVIDER}, + {"shortcut",FL_F+1}, + {"shortcut",FL_SHIFT+FL_F+1}, + {"shortcut",FL_CTRL+FL_F+1}, + {"shortcut",FL_SHIFT+FL_CTRL+FL_F+1}, + {"shortcut",FL_ALT+FL_F+1}, + {"shortcut",FL_ALT+FL_SHIFT+FL_F+1}, + {"shortcut",FL_ALT+FL_CTRL+FL_F+1}, + {"shortcut",FL_ALT+FL_SHIFT+FL_CTRL+FL_F+1, 0,0, FL_MENU_DIVIDER}, + {"&Submenus", FL_ALT+'S', 0, (void*)"Submenu1", FL_SUBMENU}, + {"A very long menu item"}, + {"&submenu",FL_CTRL+'S', 0, (void*)"submenu2", FL_SUBMENU}, + {"item 1"}, + {"item 2"}, + {"item 3"}, + {"item 4"}, + {0}, + {"after submenu"}, + {0}, + {0}, + {"&Edit",FL_F+2,0,0,FL_SUBMENU}, + {"Undo", FL_ALT+'z', 0}, + {"Redo", FL_ALT+'r', 0, 0, FL_MENU_DIVIDER}, + {"Cut", FL_ALT+'x', 0}, + {"Copy", FL_ALT+'c', 0}, + {"Paste", FL_ALT+'v', 0}, + {"Inactive",FL_ALT+'d', 0, 0, FL_MENU_INACTIVE}, + {"Clear", 0, 0, 0, FL_MENU_DIVIDER}, + {"Invisible",FL_ALT+'e', 0, 0, FL_MENU_INVISIBLE}, + {"Preferences",0, 0}, + {"Size", 0, 0}, + {0}, + {"&Checkbox",FL_F+3,0,0,FL_SUBMENU}, + {"&Alpha", FL_F+2, 0, (void *)1, FL_MENU_TOGGLE}, + {"&Beta", 0, 0, (void *)2, FL_MENU_TOGGLE}, + {"&Gamma", 0, 0, (void *)3, FL_MENU_TOGGLE}, + {"&Delta", 0, 0, (void *)4, FL_MENU_TOGGLE|FL_MENU_VALUE}, + {"&Epsilon",0, 0, (void *)5, FL_MENU_TOGGLE}, + {"&Pi", 0, 0, (void *)6, FL_MENU_TOGGLE}, + {"&Mu", 0, 0, (void *)7, FL_MENU_TOGGLE|FL_MENU_DIVIDER}, + {"Red", 0, 0, (void *)1, FL_MENU_TOGGLE, 0, 0, 0, 1}, + {"Black", 0, 0, (void *)1, FL_MENU_TOGGLE|FL_MENU_DIVIDER}, + {"00", 0, 0, (void *)1, FL_MENU_TOGGLE}, + {"000", 0, 0, (void *)1, FL_MENU_TOGGLE}, + {0}, + {"&Radio",0,0,0,FL_SUBMENU}, + {"&Alpha", 0, 0, (void *)1, FL_MENU_RADIO}, + {"&Beta", 0, 0, (void *)2, FL_MENU_RADIO}, + {"&Gamma", 0, 0, (void *)3, FL_MENU_RADIO}, + {"&Delta", 0, 0, (void *)4, FL_MENU_RADIO|FL_MENU_VALUE}, + {"&Epsilon",0, 0, (void *)5, FL_MENU_RADIO}, + {"&Pi", 0, 0, (void *)6, FL_MENU_RADIO}, + {"&Mu", 0, 0, (void *)7, FL_MENU_RADIO|FL_MENU_DIVIDER}, + {"Red", 0, 0, (void *)1, FL_MENU_RADIO}, + {"Black", 0, 0, (void *)1, FL_MENU_RADIO|FL_MENU_DIVIDER}, + {"00", 0, 0, (void *)1, FL_MENU_RADIO}, + {"000", 0, 0, (void *)1, FL_MENU_RADIO}, + {0}, + {"&Font",0,0,0,FL_SUBMENU /*, 0, FL_BOLD, 20*/}, + {"Normal", 0, 0, 0, 0, 0, 0, 14}, + {"Bold", 0, 0, 0, 0, 0, FL_BOLD, 14}, + {"Italic", 0, 0, 0, 0, 0, FL_ITALIC, 14}, + {"BoldItalic",0,0,0, 0, 0, FL_BOLD+FL_ITALIC, 14}, + {"Small", 0, 0, 0, 0, 0, FL_BOLD+FL_ITALIC, 10}, + {"Emboss", 0, 0, 0, 0, FL_EMBOSSED_LABEL}, + {"Engrave", 0, 0, 0, 0, FL_ENGRAVED_LABEL}, + {"Shadow", 0, 0, 0, 0, FL_SHADOW_LABEL}, + {"@->", 0, 0, 0, 0, FL_SYMBOL_LABEL}, + {0}, + {"E&mpty",0,0,0,FL_SUBMENU}, + {0}, + {"&Inactive", 0, 0, 0, FL_MENU_INACTIVE|FL_SUBMENU}, + {"A very long menu item"}, + {"A very long menu item"}, + {0}, + {"Invisible",0, 0, 0, FL_MENU_INVISIBLE|FL_SUBMENU}, + {"A very long menu item"}, + {"A very long menu item"}, + {0}, + {"&Huge", 0, 0, (void*)hugemenu, FL_SUBMENU_POINTER}, + {"button",FL_F+4, 0, 0, FL_MENU_TOGGLE}, + {0} +}; + +Fl_Menu_Item pulldown[] = { + {"Red", FL_ALT+'r'}, + {"Green", FL_ALT+'g'}, + {"Blue", FL_ALT+'b'}, + {"Strange", FL_ALT+'s', 0, 0, FL_MENU_INACTIVE}, + {"&Charm", FL_ALT+'c'}, + {"Truth", FL_ALT+'t'}, + {"Beauty", FL_ALT+'b'}, + {0} +}; + +#define WIDTH 600 + +Fl_Menu_* menus[4]; + +class MyWindow : public Fl_Window { +public: + MyWindow(int w, int h, const char *l=0) + : Fl_Window(w, h, l) { } + int handle(int event) { + switch (event) { + case FL_ENTER: +// puts("ENTER"); break; + case FL_LEAVE: +// puts("LEAVE"); break; + break; + } +// printf("%d\n", event); + return Fl_Window::handle(event); + } +}; + + +class MyButton : public Fl_Button { +public: + MyButton(int x, int y,int w, int h, const char *l=0) + : Fl_Button(x, y, w, h, l) { } + int handle(int event) { + switch (event) { + case FL_ENTER: + puts("ENTER"); break; + case FL_LEAVE: + puts("LEAVE"); break; + } + printf("%d\n", event); + return Fl_Button::handle(event); + } +}; + + +int main(int argc, char **argv) { + //Fl::set_color(Fl_Color(15),0,0,128); + for (int i=0; i<99; i++) { + char buf[100]; + sprintf(buf,"item %d",i); + hugemenu[i].text = strdup(buf); + } + MyWindow window(WIDTH,400); + window.callback(window_cb); + Fl_Menu_Bar menubar(0,0,WIDTH,30); menubar.menu(menutable); + menubar.callback(test_cb); + menus[0] = &menubar; + MyButton bb(100, 125, 120, 25, "Erwinn"); + Fl_Menu_Button mb1(100,100,120,25,"&menubutton"); mb1.menu(pulldown); + mb1.tooltip("this is a menu button"); + mb1.callback(test_cb); + menus[1] = &mb1; + Fl_Choice ch(300,100,80,25,"&choice:"); ch.menu(pulldown); + ch.tooltip("this is a choice menu"); + ch.callback(test_cb); + menus[2] = &ch; + Fl_Menu_Button mb(0,0,WIDTH,400,"&popup"); + mb.type(Fl_Menu_Button::POPUP3); + mb.box(FL_NO_BOX); + mb.menu(menutable); + mb.remove(1); // delete the "File" submenu + mb.callback(test_cb); + menus[3] = &mb; + Fl_Box b(200,200,200,100,"Press right button\nfor a pop-up menu"); + window.resizable(&mb); + window.size_range(300,400,0,400); + window.end(); + window.show(argc, argv); + return Fl::run(); +} + +// +// End of "$Id: menubar.cxx 6610 2008-12-29 17:24:51Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/test/message.cxx b/third_party/windows/fltk-1.1.10/test/message.cxx new file mode 100644 index 0000000..349106e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/message.cxx @@ -0,0 +1,70 @@ +// +// "$Id: message.cxx 5805 2007-05-09 12:42:39Z matt $" +// +// Message test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include + +int main(int argc, char **argv) { + Fl::scheme(NULL); + Fl::args(argc, argv); + Fl::get_system_colors(); + + fl_message("Spelling check sucessful, %d errors found with %g%% confidence", + 1002, 100*(15/77.0)); + + fl_alert( + "Quantum fluctuations in the space-time continuum detected,\n" + "you have %g seconds to comply.\n\n" + "\"In physics, spacetime is any mathematical model that combines\n" + "space and time into a single construct called the space-time\n" + "continuum. Spacetime is usually interpreted with space being\n" + "three-dimensional and time playing the role of the\n" + "fourth dimension.\" - Wikipedia", + 10.0); + + printf("fl_choice returned %d\n", + fl_choice("Do you really want to %s?", "No", "Yes", 0L, "continue")); + + printf("fl_choice returned %d\n", + fl_choice("Choose one of the following:","choice0","choice1","choice2")); + const char *r; + + r = fl_input("Please enter a string for '%s':", "this is the default value", + "testing"); + printf("fl_input returned \"%s\"\n", r ? r : "NULL"); + + r = fl_password("Enter %s's password:", 0, "somebody"); + printf("fl_password returned \"%s\"\n", r ? r : "NULL"); + + return 0; +} + +// +// End of "$Id: message.cxx 5805 2007-05-09 12:42:39Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/test/minimum.cxx b/third_party/windows/fltk-1.1.10/test/minimum.cxx new file mode 100644 index 0000000..318e3b4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/minimum.cxx @@ -0,0 +1,80 @@ +// +// "$Id: minimum.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Minimal update test program for the Fast Light Tool Kit (FLTK). +// +// This is a test of the minimal update code. The right slider has a +// label that extends outside it's border, and the minimal update +// assummes this does not happen. Thus there is *supposed* to be +// display errors when you move the right-most or any other slider. +// If you *don't* see these errors, then the minimal update is +// broken!!! +// +// I cannot emphasize how important it is to test this and make sure +// any changes have not broken the minimal update. These sort of bugs +// are extremely hard to fix and must be detected right away! +// +// The reason it is important to fix this is that otherwise you will +// swiftly end up with a toolkit that thinks it has to draw the window +// 20 times each time the display changes. I don't care how fast the +// machine is, this is an insane waste of resources, and should be +// stopped! +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) { + Fl_Window *window = new Fl_Window(400,320,argv[0]); + window->resizable(*(new Fl_Box(FL_ENGRAVED_FRAME,10,10,300,300, +"MINIMUM UPDATE TEST\n" +"\n" +"The slider on the right purposely\n" +"draws outside it's boundaries.\n" +"Moving it should leave old copies\n" +"of the label. These copies should\n" +"*not* be erased by any actions\n" +"other than hiding and showing\n" +"of that portion of the window\n" +"or changing the button that\n" +"intesects them."))); + + Fl_Slider *s; + s = new Fl_Slider(320,10,20,300,"Too_Big_Label"); + s->align(0); + + new Fl_Button(20,270,100,30,"Button"); + new Fl_Return_Button(200,270,100,30,"Button"); + + window->show(argc, argv); + return Fl::run(); +} + +// +// End of "$Id: minimum.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/navigation.cxx b/third_party/windows/fltk-1.1.10/test/navigation.cxx new file mode 100644 index 0000000..2148c8b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/navigation.cxx @@ -0,0 +1,72 @@ +// +// "$Id: navigation.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Navigation test program for the Fast Light Tool Kit (FLTK). +// +// Silly test of navigation keys. This is not a recommended method of +// laying out your panels! +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +#define WIDTH 600 +#define HEIGHT 300 +#define GRID 25 + +int main(int argc, char **argv) { + if (argc > 1) srand(atoi(argv[1])); + Fl_Window window(WIDTH,HEIGHT,argv[0]); + window.end(); // don't auto-add children + for (int i = 0; i<10000; i++) { + // make up a random size of widget: + int x = rand()%(WIDTH/GRID+1) * GRID; + int y = rand()%(HEIGHT/GRID+1) * GRID; + int w = rand()%(WIDTH/GRID+1) * GRID; + if (w < x) {w = x-w; x-=w;} else {w = w-x;} + int h = rand()%(HEIGHT/GRID+1) * GRID; + if (h < y) {h = y-h; y-=h;} else {h = h-y;} + if (w < GRID || h < GRID || w < h) continue; + // find where to insert it and see if it intersects something: + Fl_Widget *j = 0; + int n; for (n=0; n < window.children(); n++) { + Fl_Widget *o = window.child(n); + if (xx()+o->w() && x+w>o->x() && + yy()+o->h() && y+h>o->y()) break; + if (!j && (y < o->y() || y == o->y() && x < o->x())) j = o; + } + // skip if intersection: + if (n < window.children()) continue; + window.insert(*(new Fl_Input(x,y,w,h)),j); + } + window.show(argc, argv); + return Fl::run(); +} + +// +// End of "$Id: navigation.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/output.cxx b/third_party/windows/fltk-1.1.10/test/output.cxx new file mode 100644 index 0000000..56807a7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/output.cxx @@ -0,0 +1,105 @@ +// +// "$Id: output.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Output test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include // necessary for bug in mingw32? +#include +#include +#include +#include +#include +#include +#include +#include + +Fl_Output *text; +Fl_Multiline_Output *text2; +Fl_Input *input; +Fl_Value_Slider *fonts; +Fl_Value_Slider *sizes; +Fl_Window *window; + +void font_cb(Fl_Widget *,void *) { + text->textfont(int(fonts->value())); + text->redraw(); + text2->textfont(int(fonts->value())); + text2->redraw(); +} + +void size_cb(Fl_Widget *,void *) { + text->textsize(int(sizes->value())); + text->redraw(); + text2->textsize(int(sizes->value())); + text2->redraw(); +} + +void input_cb(Fl_Widget *,void *) { + text->value(input->value()); + text2->value(input->value()); +} + +int main(int argc, char **argv) { + window = new Fl_Window(400,400); + + input = new Fl_Input(50,0,350,25); + input->static_value("The quick brown fox\njumped over\nthe lazy dog."); + input->when(FL_WHEN_CHANGED); + input->callback(input_cb); + + sizes = new Fl_Hor_Value_Slider(50,25,350,25,"Size"); + sizes->align(FL_ALIGN_LEFT); + sizes->bounds(1,64); + sizes->step(1); + sizes->value(14); + sizes->callback(size_cb); + + fonts = new Fl_Hor_Value_Slider(50,50,350,25,"Font"); + fonts->align(FL_ALIGN_LEFT); + fonts->bounds(0,15); + fonts->step(1); + fonts->value(0); + fonts->callback(font_cb); + + text2 = new Fl_Multiline_Output(100,150,200,100,"Fl_Multiline_Output"); + text2->value(input->value()); + text2->align(FL_ALIGN_BOTTOM); + text2->tooltip("This is an Fl_Multiline_Output widget."); + window->resizable(text2); + + text = new Fl_Output(100,280,200,30,"Fl_Output"); + text->value(input->value()); + text->align(FL_ALIGN_BOTTOM); + text->tooltip("This is an Fl_Output widget."); + + window->forms_end(); + window->show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: output.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/overlay.cxx b/third_party/windows/fltk-1.1.10/test/overlay.cxx new file mode 100644 index 0000000..2e888cd --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/overlay.cxx @@ -0,0 +1,86 @@ +// +// "$Id: overlay.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Overlay window test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include + +int width=10,height=10; + +class overlay : public Fl_Overlay_Window { +public: + overlay(int w,int h) : Fl_Overlay_Window(w,h) {} + void draw_overlay(); +}; + +void overlay::draw_overlay() { + fl_color(FL_RED); fl_rect((w()-width)/2,(h()-height)/2,width,height); +} + +overlay *ovl; + +void bcb1(Fl_Widget *,void *) {width+=20; ovl->redraw_overlay();} +void bcb2(Fl_Widget *,void *) {width-=20; ovl->redraw_overlay();} +void bcb3(Fl_Widget *,void *) {height+=20; ovl->redraw_overlay();} +void bcb4(Fl_Widget *,void *) {height-=20; ovl->redraw_overlay();} + +int arg(int, char **argv, int& i) { + Fl_Color n = (Fl_Color)atoi(argv[i]); + if (n<=0) return 0; + i++; + uchar r,g,b; + Fl::get_color(n,r,g,b); + Fl::set_color(FL_RED,r,g,b); + return i; +} + +int main(int argc, char **argv) { + int i=0; Fl::args(argc,argv,i,arg); + ovl = new overlay(400,400); + Fl_Button *b; + b = new Fl_Button(50,50,100,100,"wider\n(a)"); + b->callback(bcb1); b->shortcut('a'); + b = new Fl_Button(250,50,100,100,"narrower\n(b)"); + b->callback(bcb2); b->shortcut('b'); + b = new Fl_Button(50,250,100,100,"taller\n(c)"); + b->callback(bcb3); b->shortcut('c'); + b = new Fl_Button(250,250,100,100,"shorter\n(d)"); + b->callback(bcb4); b->shortcut('d'); + ovl->resizable(ovl); + ovl->end(); + ovl->show(argc,argv); + ovl->redraw_overlay(); + return Fl::run(); +} + +// +// End of "$Id: overlay.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/pack.cxx b/third_party/windows/fltk-1.1.10/test/pack.cxx new file mode 100644 index 0000000..23df3fb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pack.cxx @@ -0,0 +1,120 @@ +// +// "$Id: pack.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Fl_Pack test program for the Fast Light Tool Kit (FLTK). +// +// Rather crude test of the Fl_Pack object. +// Changing the type() of an Fl_Pack after it is displayed is not supported +// so I have to do a lot of resizing of things before that. +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include + +Fl_Pack *pack; +Fl_Scroll *scroll; + +void type_cb(Fl_Light_Button*, long v) { + for (int i = 0; i < pack->children(); i++) { + Fl_Widget* o = pack->child(i); + o->resize(0,0,25,25); + } + pack->resize(scroll->x(),scroll->y(),scroll->w(),scroll->h()); + pack->parent()->redraw(); + pack->type(uchar(v)); + pack->redraw(); +} + +void spacing_cb(Fl_Value_Slider*o, long) { + pack->spacing(int(o->value())); + scroll->redraw(); +} + +int main(int argc, char **argv) { + Fl_Window *w; + {Fl_Window* o = new Fl_Window(360, 370); + w = o; + scroll = new Fl_Scroll(10,10,340,285); + {Fl_Pack* o = new Fl_Pack(10, 10, 340, 285); + pack = o; + o->box(FL_DOWN_FRAME); + //o->box(FL_ENGRAVED_FRAME); + new Fl_Button(35, 35, 25, 25, "b1"); + new Fl_Button(45, 45, 25, 25, "b2"); + new Fl_Button(55, 55, 25, 25, "b3"); + new Fl_Button(65, 65, 25, 25, "b4"); + new Fl_Button(75, 75, 25, 25, "b5"); + new Fl_Button(85, 85, 25, 25, "b6"); + new Fl_Button(95, 95, 25, 25, "b7"); + new Fl_Button(105, 105, 25, 25, "b8"); + new Fl_Button(115, 115, 25, 25, "b9"); + new Fl_Button(125, 125, 25, 25, "b10"); + new Fl_Button(135, 135, 25, 25, "b11"); + new Fl_Button(145, 145, 25, 25, "b12"); + new Fl_Button(155, 155, 25, 25, "b13"); + new Fl_Button(165, 165, 25, 25, "b14"); + new Fl_Button(175, 175, 25, 25, "b15"); + new Fl_Button(185, 185, 25, 25, "b16"); + new Fl_Button(195, 195, 25, 25, "b17"); + new Fl_Button(205, 205, 25, 25, "b18"); + new Fl_Button(215, 215, 25, 25, "b19"); + new Fl_Button(225, 225, 25, 25, "b20"); + new Fl_Button(235, 235, 25, 25, "b21"); + new Fl_Button(245, 245, 25, 25, "b22"); + new Fl_Button(255, 255, 25, 25, "b23"); + new Fl_Button(265, 265, 25, 25, "b24"); + o->end(); + w->resizable(o); + } + scroll->end(); + {Fl_Light_Button* o = new Fl_Light_Button(10, 305, 165, 25, "HORIZONTAL"); + o->type(FL_RADIO_BUTTON); + o->callback((Fl_Callback*)type_cb, (void*)(Fl_Pack::HORIZONTAL)); + } + {Fl_Light_Button* o = new Fl_Light_Button(185, 305, 165, 25, "VERTICAL"); + o->type(FL_RADIO_BUTTON); + o->value(1); + o->callback((Fl_Callback*)type_cb, (void*)(Fl_Pack::VERTICAL)); + } + {Fl_Value_Slider* o = new Fl_Value_Slider(100, 335, 250, 25, "Spacing: "); + o->align(FL_ALIGN_LEFT); + o->type(FL_HORIZONTAL); + o->range(0,30); + o->step(1); + o->callback((Fl_Callback*)spacing_cb); + } + w->end(); + } + w->show(argc, argv); + return Fl::run(); +} + +// +// End of "$Id: pack.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/pixmap.cxx b/third_party/windows/fltk-1.1.10/test/pixmap.cxx new file mode 100644 index 0000000..78c3df2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmap.cxx @@ -0,0 +1,102 @@ +// +// "$Id: pixmap.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Pixmap label test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include + +#include "pixmaps/porsche.xpm" + +#include + +Fl_Toggle_Button *leftb,*rightb,*topb,*bottomb,*insideb,*overb,*inactb; +Fl_Button *b; +Fl_Window *w; + +void button_cb(Fl_Widget *,void *) { + int i = 0; + if (leftb->value()) i |= FL_ALIGN_LEFT; + if (rightb->value()) i |= FL_ALIGN_RIGHT; + if (topb->value()) i |= FL_ALIGN_TOP; + if (bottomb->value()) i |= FL_ALIGN_BOTTOM; + if (insideb->value()) i |= FL_ALIGN_INSIDE; + if (overb->value()) i |= FL_ALIGN_TEXT_OVER_IMAGE; + b->align(i); + if (inactb->value()) b->deactivate(); + else b->activate(); + w->redraw(); +} + +int dvisual = 0; +int arg(int, char **argv, int &i) { + if (argv[i][1] == '8') {dvisual = 1; i++; return 1;} + return 0; +} + +#include + +int main(int argc, char **argv) { + int i = 1; + if (Fl::args(argc,argv,i,arg) < argc) + Fl::fatal(" -8 # : use default visual\n%s\n",Fl::help); + + Fl_Window window(400,400); ::w = &window; + Fl_Button b(140,160,120,120,"Pixmap"); ::b = &b; + Fl_Pixmap *pixmap = new Fl_Pixmap(porsche_xpm); + Fl_Pixmap *depixmap; + depixmap = (Fl_Pixmap *)pixmap->copy(); + depixmap->inactive(); + + b.image(pixmap); + b.deimage(depixmap); + + leftb = new Fl_Toggle_Button(25,50,50,25,"left"); + leftb->callback(button_cb); + rightb = new Fl_Toggle_Button(75,50,50,25,"right"); + rightb->callback(button_cb); + topb = new Fl_Toggle_Button(125,50,50,25,"top"); + topb->callback(button_cb); + bottomb = new Fl_Toggle_Button(175,50,50,25,"bottom"); + bottomb->callback(button_cb); + insideb = new Fl_Toggle_Button(225,50,50,25,"inside"); + insideb->callback(button_cb); + overb = new Fl_Toggle_Button(25,75,100,25,"text over"); + overb->callback(button_cb); + inactb = new Fl_Toggle_Button(125,75,100,25,"inactive"); + inactb->callback(button_cb); + if (!dvisual) Fl::visual(FL_RGB); + window.resizable(window); + window.end(); + window.show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: pixmap.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/pixmap_browser.cxx b/third_party/windows/fltk-1.1.10/test/pixmap_browser.cxx new file mode 100644 index 0000000..b0a0eeb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmap_browser.cxx @@ -0,0 +1,123 @@ +// +// "$Id: pixmap_browser.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// A shared image test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +Fl_Box *b; +Fl_Window *w; +Fl_Shared_Image *img; + + +static char name[1024]; + +void load_file(const char *n) { + if (img) { + img->release(); + img = 0L; + } + if (fl_filename_isdir(n)) { + b->label("@fileopen"); // show a generic folder + b->labelsize(64); + b->labelcolor(FL_LIGHT2); + b->image(0); + b->redraw(); + return; + } + img = Fl_Shared_Image::get(n); + if (!img) { + b->label("@filenew"); // show an empty document + b->labelsize(64); + b->labelcolor(FL_LIGHT2); + b->image(0); + b->redraw(); + return; + } + if (img->w() > b->w() || img->h() > b->h()) { + Fl_Image *temp; + if (img->w() > img->h()) temp = img->copy(b->w(), b->h() * img->h() / img->w()); + else temp = img->copy(b->w() * img->w() / img->h(), b->h()); + + img->release(); + img = (Fl_Shared_Image *)temp; + } + b->label(name); + b->labelsize(14); + b->labelcolor(FL_FOREGROUND_COLOR); + b->image(img); + b->redraw(); +} + +void file_cb(const char *n) { + if (!strcmp(name,n)) return; + load_file(n); + strcpy(name,n); + w->label(name); +} + +void button_cb(Fl_Widget *,void *) { + fl_file_chooser_callback(file_cb); + fl_file_chooser("Image file?","*.{bm,bmp,gif,jpg,pbm,pgm,png,ppm,xbm,xpm}", name); + fl_file_chooser_callback(0); +} + +int dvisual = 0; +int arg(int, char **argv, int &i) { + if (argv[i][1] == '8') {dvisual = 1; i++; return 1;} + return 0; +} + +int main(int argc, char **argv) { + int i = 1; + + fl_register_images(); + + Fl::args(argc,argv,i,arg); + + Fl_Window window(400,435); ::w = &window; + Fl_Box b(10,45,380,380); ::b = &b; + b.box(FL_THIN_DOWN_BOX); + b.align(FL_ALIGN_INSIDE|FL_ALIGN_CENTER); + Fl_Button button(150,5,100,30,"load"); + button.callback(button_cb); + if (!dvisual) Fl::visual(FL_RGB); + if (argv[1]) load_file(argv[1]); + window.resizable(window); + window.show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: pixmap_browser.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/black_1.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/black_1.xbm new file mode 100644 index 0000000..2e98be5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/black_1.xbm @@ -0,0 +1,60 @@ +#define black_1_width 56 +#define black_1_height 56 +static unsigned char black_1_bits[] = { +0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, +0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, +0x00, 0xf8, 0xff, 0xff, 0x03, 0x00, 0x00, +0x00, 0xfc, 0xff, 0xff, 0x1f, 0x00, 0x00, +0x00, 0xfe, 0xff, 0xff, 0x3f, 0x00, 0x00, +0x80, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, +0xc0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, +0xe0, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, +0xe0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, +0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, +0xf8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, +0xfc, 0xff, 0xff, 0xff, 0xff, 0x17, 0x00, +0xfc, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x00, +0xfc, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x00, +0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x00, +0xfe, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x00, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x00, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x02, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x02, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x01, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x02, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x05, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x02, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x05, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x02, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x05, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x02, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x05, +0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x02, +0xfe, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x05, +0xfe, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x02, +0xfc, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x05, +0xf8, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x02, +0xf8, 0xff, 0xff, 0xff, 0xff, 0x57, 0x01, +0xf8, 0xff, 0xff, 0xff, 0xff, 0xab, 0x02, +0xf0, 0xff, 0xff, 0xff, 0xff, 0x55, 0x01, +0xe0, 0xff, 0xff, 0xff, 0xff, 0xab, 0x00, +0xc0, 0xff, 0xff, 0xff, 0xff, 0x55, 0x01, +0x80, 0xff, 0xff, 0xff, 0xff, 0xaa, 0x00, +0x00, 0xff, 0xff, 0xff, 0x5f, 0x55, 0x00, +0x00, 0xfe, 0xff, 0xff, 0xaf, 0x2a, 0x00, +0x00, 0xf4, 0xff, 0xff, 0x57, 0x15, 0x00, +0x00, 0xe8, 0xff, 0xff, 0xaa, 0x0a, 0x00, +0x00, 0x50, 0xff, 0x7f, 0x55, 0x05, 0x00, +0x00, 0xa0, 0xaa, 0xaa, 0xaa, 0x02, 0x00, +0x00, 0x40, 0x55, 0x55, 0x55, 0x01, 0x00, +0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, +0x00, 0x00, 0x50, 0x55, 0x15, 0x00, 0x00, +0x00, 0x00, 0x80, 0xaa, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/black_2.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/black_2.xbm new file mode 100644 index 0000000..7a034ba --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/black_2.xbm @@ -0,0 +1,60 @@ +#define black_2_width 56 +#define black_2_height 56 +static unsigned char black_2_bits[] = { +0x00, 0x00, 0x0f, 0x3c, 0x00, 0x00, 0x00, +0x00, 0x40, 0x40, 0x81, 0x00, 0x00, 0x00, +0x00, 0x10, 0x49, 0x09, 0x02, 0x00, 0x00, +0x00, 0x44, 0x52, 0x49, 0x08, 0x00, 0x00, +0x00, 0x90, 0x52, 0x25, 0x01, 0x00, 0x00, +0x80, 0x94, 0x54, 0x95, 0x44, 0x00, 0x00, +0x40, 0x24, 0x01, 0x40, 0x92, 0x00, 0x00, +0x20, 0x49, 0xfc, 0x0f, 0x09, 0x01, 0x00, +0x00, 0x11, 0x57, 0x35, 0x64, 0x00, 0x00, +0x40, 0xc2, 0x00, 0xc0, 0x10, 0x00, 0x00, +0x88, 0x64, 0x55, 0x55, 0x89, 0x05, 0x00, +0x20, 0x11, 0x00, 0x08, 0x42, 0x00, 0x00, +0x44, 0x58, 0x55, 0x55, 0x21, 0x0b, 0x00, +0x90, 0x04, 0x80, 0x0a, 0x80, 0x00, 0x00, +0x22, 0x56, 0x55, 0x55, 0x45, 0x14, 0x00, +0x48, 0x02, 0xa8, 0x2a, 0x00, 0x03, 0x00, +0x11, 0x55, 0x55, 0x55, 0x95, 0x28, 0x00, +0x21, 0x81, 0xaa, 0x2a, 0x00, 0x26, 0x00, +0x8d, 0x55, 0x55, 0x55, 0x15, 0x21, 0x00, +0xb1, 0xe0, 0xaa, 0xaa, 0x00, 0x20, 0x00, +0x80, 0xf5, 0x55, 0x55, 0x15, 0x07, 0x00, +0xbe, 0xf0, 0xab, 0xaa, 0x00, 0x00, 0x00, +0x80, 0xf5, 0x55, 0x55, 0x15, 0x1f, 0x00, +0xbe, 0xe0, 0xab, 0xaa, 0x02, 0x00, 0x00, +0x80, 0xf5, 0x57, 0x55, 0x15, 0x1f, 0x00, +0xb8, 0xc0, 0xaf, 0xaa, 0x00, 0x00, 0x00, +0x81, 0xd5, 0x57, 0x15, 0x14, 0x23, 0x00, +0xa1, 0x80, 0xaf, 0x0a, 0x00, 0x2c, 0x00, +0x19, 0xd5, 0x5f, 0x01, 0x14, 0x21, 0x00, +0x45, 0x01, 0xaf, 0x00, 0x00, 0x22, 0x00, +0x30, 0x56, 0x1f, 0x40, 0x85, 0x04, 0x00, +0x8a, 0x02, 0x0e, 0x00, 0x00, 0x11, 0x00, +0x40, 0x54, 0x0f, 0x54, 0x45, 0x02, 0x00, +0x34, 0x09, 0x04, 0x00, 0x80, 0x08, 0x00, +0x80, 0x40, 0x45, 0x55, 0x21, 0x01, 0x00, +0x68, 0x04, 0x00, 0x00, 0x48, 0x04, 0x00, +0x00, 0x82, 0x55, 0x95, 0x90, 0x00, 0x00, +0x80, 0x09, 0x02, 0x20, 0x22, 0x00, 0x00, +0x20, 0x24, 0xa8, 0x8a, 0x24, 0x01, 0x00, +0x40, 0x92, 0x00, 0x20, 0x89, 0x00, 0x00, +0x80, 0x48, 0xaa, 0x4a, 0x4a, 0x00, 0x00, +0x00, 0x20, 0xa9, 0x52, 0x02, 0x00, 0x00, +0x00, 0x84, 0xa4, 0x92, 0x08, 0x00, 0x00, +0x00, 0x10, 0xa4, 0x24, 0x02, 0x00, 0x00, +0x00, 0x40, 0xa0, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0f, 0x3c, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/black_3.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/black_3.xbm new file mode 100644 index 0000000..24dfcf9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/black_3.xbm @@ -0,0 +1,60 @@ +#define black_3_width 56 +#define black_3_height 56 +static unsigned char black_3_bits[] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/black_4.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/black_4.xbm new file mode 100644 index 0000000..99ba45b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/black_4.xbm @@ -0,0 +1,60 @@ +#define black_4_width 56 +#define black_4_height 56 +static unsigned char black_4_bits[] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/blackking_1.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/blackking_1.xbm new file mode 100644 index 0000000..9402316 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/blackking_1.xbm @@ -0,0 +1,60 @@ +#define blackking_1_width 56 +#define blackking_1_height 56 +static unsigned char blackking_1_bits[] = { +0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, +0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, +0x00, 0xf8, 0xff, 0xff, 0x03, 0x00, 0x00, +0x00, 0xfc, 0xff, 0xff, 0x1f, 0x00, 0x00, +0x00, 0xfe, 0xff, 0xff, 0x3f, 0x00, 0x00, +0x80, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, +0xc0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, +0xe0, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, +0xe0, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, +0xf0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, +0xf8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, +0xfc, 0xff, 0xff, 0xff, 0xff, 0x17, 0x00, +0xfc, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x00, +0xfc, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x00, +0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x00, +0xfe, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x01, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x02, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x05, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x0a, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x15, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x0a, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x15, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x2a, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x55, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x2a, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x55, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x2a, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x55, +0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xaa, +0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x55, +0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xaa, +0xfe, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x55, +0xfe, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xaa, +0xfc, 0xff, 0xff, 0xff, 0xff, 0x5f, 0x55, +0xf8, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xaa, +0xf8, 0xff, 0xff, 0xff, 0xff, 0x57, 0x55, +0xf8, 0xff, 0xff, 0xff, 0xff, 0xab, 0xaa, +0xf0, 0xff, 0xff, 0xff, 0xff, 0x55, 0x55, +0xe0, 0xff, 0xff, 0xff, 0xff, 0xab, 0xaa, +0xc0, 0xff, 0xff, 0xff, 0xff, 0x55, 0x55, +0x80, 0xff, 0xff, 0xff, 0xff, 0xaa, 0x2a, +0x00, 0xff, 0xff, 0xff, 0x5f, 0x55, 0x55, +0x00, 0xfe, 0xff, 0xff, 0xaf, 0xaa, 0x2a, +0x00, 0xf4, 0xff, 0xff, 0x57, 0x55, 0x15, +0x00, 0xe8, 0xff, 0xff, 0xaa, 0xaa, 0x2a, +0x00, 0x50, 0xff, 0x7f, 0x55, 0x55, 0x15, +0x00, 0xa0, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, +0x00, 0x40, 0x55, 0x55, 0x55, 0x55, 0x05, +0x00, 0x80, 0xaa, 0xaa, 0xaa, 0xaa, 0x02, +0x00, 0x00, 0x55, 0x55, 0x55, 0x55, 0x01, +0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, +0x00, 0x00, 0x54, 0x55, 0x55, 0x55, 0x00, +0x00, 0x00, 0xa8, 0xaa, 0xaa, 0x2a, 0x00, +0x00, 0x00, 0x40, 0x55, 0x55, 0x15, 0x00, +0x00, 0x00, 0x00, 0xaa, 0xaa, 0x02, 0x00, +0x00, 0x00, 0x00, 0x50, 0x15, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/blackking_2.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/blackking_2.xbm new file mode 100644 index 0000000..d684e09 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/blackking_2.xbm @@ -0,0 +1,60 @@ +#define blackking_2_width 56 +#define blackking_2_height 56 +static unsigned char blackking_2_bits[] = { +0x00, 0x00, 0x0f, 0x3c, 0x00, 0x00, 0x00, +0x00, 0x40, 0x40, 0x81, 0x00, 0x00, 0x00, +0x00, 0x10, 0x49, 0x09, 0x02, 0x00, 0x00, +0x00, 0x44, 0x52, 0x49, 0x08, 0x00, 0x00, +0x00, 0x90, 0x52, 0x25, 0x01, 0x00, 0x00, +0x80, 0x94, 0x54, 0x95, 0x44, 0x00, 0x00, +0x40, 0x24, 0x01, 0x40, 0x92, 0x00, 0x00, +0x20, 0x49, 0xfc, 0x0f, 0x09, 0x01, 0x00, +0x00, 0x11, 0x57, 0x35, 0x64, 0x00, 0x00, +0x40, 0xc2, 0x00, 0xc0, 0x10, 0x00, 0x00, +0x88, 0x64, 0xd5, 0x55, 0x89, 0x05, 0x00, +0x20, 0x11, 0xc0, 0x00, 0x42, 0x00, 0x00, +0x44, 0x58, 0x57, 0x74, 0x21, 0x0b, 0x00, +0x90, 0x04, 0x03, 0x30, 0x80, 0x00, 0x00, +0x22, 0x76, 0x51, 0x15, 0x47, 0x14, 0x00, +0x48, 0x32, 0x08, 0x02, 0x03, 0x03, 0x00, +0x11, 0x15, 0x5d, 0x57, 0x91, 0x28, 0x00, +0x21, 0x01, 0x0c, 0x03, 0x00, 0x26, 0x00, +0x8d, 0x55, 0xcf, 0xd3, 0x15, 0x21, 0x00, +0xb1, 0x18, 0x86, 0xe1, 0x00, 0x20, 0x00, +0x80, 0x5d, 0xd7, 0x75, 0x11, 0x07, 0x00, +0xbe, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x75, 0x55, 0x55, 0x11, 0x1f, 0x00, +0xbe, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x75, 0x55, 0x55, 0x10, 0x1f, 0x00, +0xb8, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, +0x81, 0x75, 0x55, 0x55, 0x14, 0x23, 0x00, +0xa1, 0x60, 0x00, 0x00, 0x00, 0x2c, 0x00, +0x19, 0xd5, 0x55, 0x55, 0x14, 0x21, 0x00, +0x45, 0xc1, 0x00, 0x00, 0x00, 0x22, 0x00, +0x30, 0xd6, 0x00, 0x00, 0x85, 0x04, 0x00, +0x8a, 0x82, 0x00, 0x00, 0x00, 0x11, 0x00, +0x40, 0x54, 0x00, 0x00, 0x45, 0x02, 0x00, +0x34, 0x09, 0x00, 0x00, 0x80, 0x08, 0x00, +0x80, 0x40, 0x55, 0x55, 0x21, 0x01, 0x00, +0x68, 0x04, 0x00, 0x00, 0x48, 0x04, 0x00, +0x00, 0x82, 0x55, 0x95, 0x90, 0x00, 0x00, +0x80, 0x09, 0x02, 0x20, 0x22, 0x00, 0x00, +0x20, 0x24, 0xa8, 0x8a, 0x24, 0x01, 0x00, +0x40, 0x92, 0x00, 0x20, 0x89, 0x00, 0x00, +0x80, 0x48, 0xaa, 0x4a, 0x4a, 0x00, 0x00, +0x00, 0x20, 0xa9, 0x52, 0x02, 0x00, 0x00, +0x00, 0x84, 0xa4, 0x92, 0x08, 0x00, 0x00, +0x00, 0x10, 0xa4, 0x24, 0x02, 0x00, 0x00, +0x00, 0x40, 0xa0, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0f, 0x3c, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/blackking_3.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/blackking_3.xbm new file mode 100644 index 0000000..df7079c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/blackking_3.xbm @@ -0,0 +1,60 @@ +#define blackking_3_width 56 +#define blackking_3_height 56 +static unsigned char blackking_3_bits[] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x00, 0x10, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x54, 0x05, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/blackking_4.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/blackking_4.xbm new file mode 100644 index 0000000..27504e6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/blackking_4.xbm @@ -0,0 +1,60 @@ +#define blackking_4_width 56 +#define blackking_4_height 56 +static unsigned char blackking_4_bits[] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/blast.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/blast.xpm new file mode 100644 index 0000000..7bc5e5d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/blast.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * blast_xpm[] = { +"32 32 32 1", +" c #905518", +". c #9F580E", +"+ c #A36526", +"@ c #AF6519", +"# c #BF7429", +"$ c #C77622", +"% c #B67B3C", +"& c #D07518", +"* c #D88836", +"= c #E48628", +"- c #F28514", +"; c #FF951C", +"> c #FA9835", +", c #FF982A", +"' c #F49F48", +") c #FFA82D", +"! c #FFA93F", +"~ c #FFBA1C", +"{ c #FFB936", +"] c #FFBA4C", +"^ c #FFCA42", +"/ c #FFD329", +"( c #FFCF5E", +"_ c #FFD94C", +": c #FFE946", +"< c #FFFB3E", +"[ c #FFFB55", +"} c #FEFC69", +"| c #FFFE82", +"1 c #FFFFA3", +"2 c #FEFFCB", +"3 c #FEFFFC", +" % . ....@@@#@@.+.+++% ", +" %%++++.....@######@@@@.++ % ", +" %%% %++@@.@@@#$$#######@++++%% ", +" %%+%+####@@$&&=*=&&$$####@++%%+", +"+%+%#####&&&&&==='===*$$###%%%%+", +"%+%%%%**=*&&&&>,>,>-=>==*$*##%%%", +" %#****'=>---,))!),>>>==***#%#+", +" @%*'''>>>>;;,{{{))))>>>''**#%+", +" ..@#*'!]]]{)){^__^^{]!!!'''###+", +" ..@$=']]((^^~~:::/__^{((!>**##@", +"....&&=>(_|[::/<}[<[::_((!>==###", +"....&&--!_}|}[<[}[}}}||_]!>>**##", +"@@$$&&--;{:|1|[<|}|}||}_^]>>=*##", +"##$$=-,;)~~<121<2|121}}:^])>=*$#", +"#*'''!]{^_<<<1313332|}}}^{!>>*##", +"%*'']((|}}||||<333321|[[_^]>==*#", +"*''''((||112333333321|}[_^]!>=*#", +"%%*''!]^_[[[}<13332}<[<:_])>>*$#", +"##*==,,)~_:<[|212311}[>=&$@@", +" .@@$&'!({;;{/}::/~/_^)),>=*$#@+", +" ..@$=''>,-;)^__~^{)^]),,==*$#@@", +". @##*'==&--){({));;,{>>==$$#@++", +"%++#%**$&&--,!));;;-->>=&$$##@+%", +" +%%##@@@@&=>>>>>>=-==='$$#@@+++", +" %%+@@..&.$&='==-&&&&&$*$#@@.+% ", +" %%+ ....@$$*==&$&&&@$$##@@+ % ", +" % ....@#*#$$$#@@@@@##+@++ ", +" ..@####@@@@@..+@++% "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/block.xcf.gz b/third_party/windows/fltk-1.1.10/test/pixmaps/block.xcf.gz new file mode 100644 index 0000000..7e5e7a3 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/test/pixmaps/block.xcf.gz differ diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/blue.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/blue.xpm new file mode 100644 index 0000000..0fbc922 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/blue.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * blue_xpm[] = { +"32 32 32 1", +" c #000100", +". c #0000A5", +"+ c #020681", +"@ c #0A008F", +"# c #0001B2", +"$ c #0100BA", +"% c #0000D0", +"& c #0C00C4", +"* c #0008C4", +"= c #0B00DB", +"- c #13252E", +"; c #171F44", +"> c #1718B3", +", c #1616C2", +"' c #2628CF", +") c #2C2BC6", +"! c #2D30BD", +"~ c #3D40D1", +"{ c #4342BC", +"] c #4344CA", +"^ c #5253E1", +"/ c #5858D4", +"( c #5F5ECF", +"_ c #6A69E7", +": c #6E6EDD", +"< c #7273D2", +"[ c #7E7FDD", +"} c #7E7FEC", +"| c #8D8DDF", +"1 c #8F90EF", +"2 c #9D9EED", +"3 c #A6A6E8", +" ;+.*$##$$**$*$#$*&&.+; ", +" -@&)_133333333333333|:!$@- ", +" ;%%}22122222222233333333['$; ", +" -&'1111111|2|21111|2223|332'&- ", +" @*}}}}1}}}1}1111111[|[||||||*. ", +";&/}[}}}}}}}[[[}}}}}[}[[||||[:&;", +"+'::::_____:::<::__}_}:<<<<<[<)+", +">)/_/_____::(::::_____:(<<<<<<].", +"*^//^/////(((((//_^_^_///(((((/$", +"#]]]]^^{/{{{{/{//^^^^^^///{(((($", +".]~~~~]{{{{{{{]{]~~~~~~~]{]{{{(.", +"#))))!!!{{{]!~!!~~'~''~~~]{{{{{.", +"#))))!!!@!>!!))))''''''~)!!!{{+.", +"$,,>>>@!>>)>,'''''''''''))!>!!!.", +"$,,#>>>>.>,,&*%*'*''*',,,,,>>>>#", +"&%%$#...#&&%*%***%%&*$,***,>#>>#", +"$&%&*###&&%%&&&&,*&*,##$*$$#$$#$", +"$&%%$$$*&%&**$$$&&&&&$#$***#,#.#", +"$$$&$*&%%=&&$##$$**&&$**&&&$$#..", +".#$$&&%%%%%&,....##$#$$&%%&&$#.#", +".#$$&%%===%%&#.....###$&%%%&&#.#", +"$$&&%=====%%$##.@..#.##&&&%%&$$#", +"$$&&%==%==%&$###.....##$%&%&&$$$", +"$$$&&%%%%%&&$$###..###$$&%&%&&$$", +".$$&&&&$$&$$*&&*$$#$$$$$$%%%%%&.", +"+$$$$&####$&$&&&&&$$&$$$$&%=%%=+", +";##$$$#....$$&&&$&&%&&$$*&%==%%;", +" @$,#$#.@..##.#$&&%%%&$&&=%%%%. ", +" -$*$&&$.......#&&&%&&$&%==%%&- ", +" ;$&&$#...#...$&%%%&&$&%=%=%; ", +" -@%&$#..#...#$%&&&&&&&=%.- ", +" ;+.#$#....#&&%%&&&&#+; "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/blue_bomb.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/blue_bomb.xpm new file mode 100644 index 0000000..a473833 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/blue_bomb.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * blue_bomb_xpm[] = { +"32 32 32 1", +" c #000100", +". c #010047", +"+ c #00033E", +"@ c #010345", +"# c #010577", +"$ c #0000A4", +"% c #0001B7", +"& c #0000C3", +"* c #0000D0", +"= c #13252E", +"- c #1A2147", +"; c #1E1E57", +"> c #2023BC", +", c #2526CD", +"' c #343364", +") c #363699", +"! c #3237C5", +"~ c #373BB4", +"{ c #474875", +"] c #4E4FD4", +"^ c #5252C6", +"/ c #5B5A85", +"( c #6D6D94", +"_ c #6666CE", +": c #6465DE", +"< c #6E6CAC", +"[ c #7B7CDA", +"} c #7C7DEB", +"| c #8D8DDF", +"1 c #8F90EF", +"2 c #9D9EED", +"3 c #A6A6E8", +" -#$&%%%%%&&&&%%%&&&$#- ", +" =$*,:133333333333333|}>%$= ", +" -&,}22122222322233333333[>%- ", +" =&,}111111|2|21111|22322332,&= ", +" $,[1}1}1}}1}1111111[1|||<|||&$ ", +"-%]}}}}}}}}}[[[}}}}}}[[[||||1:&-", +"#,:_}:::}::[<((((((<[}}[[[[<[[,#", +"%!:::::::_<(((((((((/<_:___[__]$", +"&]]]]]]]://///(////////_^::___]%", +"%]]]]]]^{{{/{{/{/{)''-{''''''''''''{')]~~~~$", +"%,>,!>)-'-'-''''''';''''')!!~~~$", +"&,,$>>--;;-;;;;;;;;;);;;;->>>#!$", +"&&&,$$;+;+;+;@;;.;;;;;;;;;%>,>>%", +"%&&&$$++@+..@...;..@.@;@.;%,$%$%", +"&&*&&%+++..@@@@@@@@@+@++@+%%%%%%", +"&&&&%%+@+.@@+++@++@@@++++@&%%%$%", +"%&&&&&+....+++++@+@+@+@@@@&%%%$$", +"$%%&%&#.@..@+++++++++++@@#&&%$$$", +"$%%%&*$....@+++++++++++@.$*&&%%$", +"%%&&***#...@+++-++++++++#***&%%%", +"&%&&***&...@+++++++++++@$&**&%%%", +"&%%&****$.@@+++++++++++$&&*&&&&&", +"$%%&&&&%&$#+@@+++++++#$%&&****&$", +"#%%%%&%%$%$$#@.@@@+#$%%%%&*****#", +"-%%%%%%$$$$%%%&%%&&&&%%&&&*****-", +" $%%%&$$$$$$%$$%&&**&&%&******$ ", +" =%%&&&$$$$$$$$%&&***%%&*****&= ", +" -&&&&%$$$$$$$%%***&&&&****&- ", +" =$&%%%$%$$$$%&&&&&&&&***$= ", +" -#$%%%%$$$%%&&&&&&&%#- "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/cyan.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/cyan.xpm new file mode 100644 index 0000000..72c205b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/cyan.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * cyan_xpm[] = { +"32 32 32 1", +" c #000100", +". c #143144", +"+ c #0A4350", +"@ c #038080", +"# c #029795", +"$ c #00A3A5", +"% c #00ABAC", +"& c #02B3B5", +"* c #00BBBB", +"= c #00C0C0", +"- c #19B9BB", +"; c #33B5B5", +"> c #00CCCB", +", c #12C5C5", +"' c #47B2B1", +") c #1AC9C9", +"! c #09D2D1", +"~ c #37C9CA", +"{ c #46C5C6", +"] c #24D9D8", +"^ c #5CC5C3", +"/ c #4BD0D1", +"( c #55D8DA", +"_ c #72D4D3", +": c #53E3E3", +"< c #66E0E2", +"[ c #7EE2E1", +"} c #70ECED", +"| c #94E0E1", +"1 c #8DEFED", +"2 c #A1ECEC", +"3 c #ADE8E6", +" +@$=*&&&***=*&&&*==$@+ ", +" .#>![123333222233323|<~*#. ", +" +,]}1211212222212232333||**+ ", +" .,]1211111222221112|||||3||>>. ", +" #)[11111}}11[11111111[|||||[!# ", +"+*<}<<}}1}1}[[[1}1}}1[[___|_|<>+", +"@)_[[<}}}}}<[__<<}}}}1[___|^|_)@", +"%](((<<<<<__/___[}}}}:[__^_^^_^%", +"-(((((((((_{{_{/_(}:}<<<(___^^/*", +"&////(/{{{{^/{{^/]:::::(_(/{^{^&", +"%{//!/{;';{;{{~{{/]:]:]/~~/{^{;%", +"%==,~,*;;;;'*~~~~~/!]]()~{{{;''#", +";>/**;;;&;-;;~,)))//!!]~=---;';$", +"*>=*;%;%;--*,)!)!>)!~!))~=~--%;%", +";),=;%%%--))))!))!)))~,)),{--&;%", +"=)>**%$%*=)>!>)),,))--*=)=***;**", +"*)!>**%&=)!,,,===,,,*;*;==**&*&&", +"*,>,=***>!),**-*=,,>=***,=*&*&%&", +"*&==**,>>!>=&%&&***=***=>,=*%%%%", +"%****>>!!!!>*%%%%%&*&**,>>>==%$$", +"%%*==>!]]!!>*%%$$%%%*%=,>>>>>*%%", +"%==,!]]]]]!>*&$$##$%%%&*,>>>*=&;", +"**=>!]]]]]!>**%$$#%%%%*=,>>>=**&", +"***,)!!!!!,****=%%#%%%&*=>>>>==*", +"$*&=,),**,=*======***==**,>>>>>%", +"@=&-*=&%%&&*==>>======*&=,>]]!!@", +"+&&=&*&%$%%*****==,>,=*==!!!]]!+", +" #&&=*&$$#$%%%%*=,>>>=*=,!!!!!# ", +" .&====%%$%%%$$%=>>>)=*,!]]!!,. ", +" +*,==*%#$$%#%*=>!>,=-,!]]!!+ ", +" .#,=*%%%%$#$&=,>,,,=,)!]$. ", +" +@$&*%%%$$%,,,,,,,,%@+ "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/cyan_bomb.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/cyan_bomb.xpm new file mode 100644 index 0000000..53135a2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/cyan_bomb.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * cyan_bomb_xpm[] = { +"32 32 32 1", +" c #000100", +". c #003A3A", +"+ c #133244", +"@ c #004241", +"# c #0A4551", +"$ c #084948", +"% c #1B5353", +"& c #006C6D", +"* c #286261", +"= c #396767", +"- c #0F8080", +"; c #019795", +"> c #507B7C", +", c #00A7A9", +"' c #5D8989", +") c #00B7B7", +"! c #00C1C1", +"~ c #2FB2B3", +"{ c #6D9A9A", +"] c #00CAC9", +"^ c #4AB4B3", +"/ c #05D4D2", +"( c #36C8C9", +"_ c #53C4C3", +": c #46D3D4", +"< c #61D3D3", +"[ c #75CECE", +"} c #6FE2E1", +"| c #82DFDE", +"1 c #94E0E1", +"2 c #89EFED", +"3 c #A2ECEC", +" #-,!))~))!)!!)~)!!!,-# ", +" +;]:}2333333333333331<();+ ", +" #!/}23333333333333333333[!!# ", +" +!/322222221332223311111111:!+ ", +" ;:2222222222|23222233111111|/; ", +"#!:}|}222222|||}22222}|1[1[[1}]#", +"-:<}}}}}}}}[^{{{{{{[[2}|[[[[[|!-", +",:}:}:}}}<{'''''''{'{{[<<|[[[<_,", +"!:<<:}::_'>'>>'>'''''''[<<<[_<:!", +")(:::::^>>>>>>>>>>>''''>_::____~", +",((:::(>===>=>=>>>=>>>>>'(:___^,", +"~(((](;===#========&&=*=*^(_^^~;", +")](()_&%%==%=%===*===*==*-~)^~~,", +"!!!)~,=#.%%#%%%%*%******%=())~~,", +")]()~,.%%%%%%%%%%%%%%%%%%%()))~)", +"(!]!)^.....$%$$$$$$$$$$$$$)))))~", +"!]:])~...%$$.@#@@@@@.@.$@@))))))", +")]]]!(.$$.@@..@.@@@@@@..@$)))))~", +"~!)!)!.$$%$.@....@#@.@@@#@()),,,", +",)!~!(&@@@@$...........@$&]!)),,", +")))!]]~$$$@$.........@@@$,:]!),,", +"~)!!///&$$$@@...........&]]]!)))", +"))!!://!%$$@...........@,]/]])))", +"!))!///],@#$..........@;]]]]]!]!", +",)!)!!!!!,&.@#@......*,)!]]]/]!,", +"-)~!!!)),));&@@@$.@&;!)))!/////-", +"#)~))),,;,,)))!)!!:]]!!!!]/////#", +" ;))))),;,,)~~,)!!]/]!)!]/////; ", +" +)!!!!),,,,,,,)!]]/!()!/////!+ ", +" #)]!)),,,,,,,)!!/!]!)!////]# ", +" +;]!),,,,,;,)!]]!!!!!]//,+ ", +" #-,))));,,,!!]!]!!!)-# "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/gray.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/gray.xpm new file mode 100644 index 0000000..acbb2cb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/gray.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * gray_xpm[] = { +"32 32 32 1", +" c #000100", +". c #2C393F", +"+ c #394649", +"@ c #666967", +"# c #737572", +"$ c #7A7C79", +"% c #828481", +"& c #878986", +"* c #8C8E8B", +"= c #90928F", +"- c #939592", +"; c #979996", +"> c #999B98", +", c #9C9E9A", +"' c #9FA19E", +") c #A1A0A4", +"! c #A3A5A2", +"~ c #A6A8A5", +"{ c #A9ABA8", +"] c #A9ACAF", +"^ c #ABADAA", +"/ c #AFB1AE", +"( c #B3B5B3", +"_ c #B9BBB8", +": c #BABDC0", +"< c #C1C3BF", +"[ c #C2C3C7", +"} c #C7C9C6", +"| c #CBCDCB", +"1 c #D1D3D0", +"2 c #D9DBD8", +"3 c #DFE1DE", +" +@%;-**=---;-=*=;>>%@+ ", +" .$':[2332233333222231[]-#. ", +" +)(|33333222333332222221[)-+ ", +" .;(22233333121333322|12|1|2]'. ", +" #]|221222221112233222[2||||1]$ ", +"+)[|[[2[3[3[2[1[[2[222||[[[[|<)+", +"@~[[||[111[[|[[|2221[2[|}<<[[|~@", +"%:|<[|[[[|[[[:[[[[[21|[[[_:((_]&", +"-(::[[[[[:((((]:[[|[||<<[_<:::];", +"=((((_(({^]](]]](<[[|[[:(:((]((*", +"&]]((()))!')^(^^]([[<<__(]({~)]%", +"*~^]])'>-))'){)]^]((:_:]]{)))>)%", +"=)~!''>)--);){{]^{{^(((])~~!)==%", +")~)))=**);;)']]{]]]]]]]{~!,)=)-&", +"-',-**&*=)>)!{]~~~~!)!))])'>-==*", +")))))&&&=;!~])')))))>)>,'';))-)*", +"-'!)=**)=)!)')-;>,''-=*-))**==)&", +"),);))*))]);)*--)>)))-==-)=)*&**", +"*))-==)'!{!;*&**==---)=)>))*)%&&", +"%&==))!)]])))*&&**&)**))!'-))&%%", +"**)=)){^{^~)=&&%$%&&**=)))]))**&", +"**-)!{]]]]{)))&$%%%*&&*;'''>))**", +")=),]((((]!)*&&%$%$&&*)-))]);*)*", +"==*)'!!'!~)*)))&)&&&&&*)>'')))-)", +"%)*))))-);)-==)))&)&)*=-))!!))'%", +"@=*=--*&&*==));-)=)=)))*->!]^^]@", +"+=*=--*%$%&)&-)-))));-=)-){{]]]+", +" #)*)*)&%$%&*&&*=;)!))*)){]]{~# ", +" .*)*)*&&%&%%%%));]'))*>]{{])). ", +" .=))))&%%&%%$&;,!)>-))!]]{~+ ", +" .#;=&*)$&%%%)))!');-)'{]$. ", +" +@$$)&)%$$&-,))>),;&@+ "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/gray_bomb.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/gray_bomb.xpm new file mode 100644 index 0000000..890c816 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/gray_bomb.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * gray_bomb_xpm[] = { +"32 32 32 1", +" c #000100", +". c #2C2E2B", +"+ c #313330", +"@ c #2E393E", +"# c #363835", +"$ c #3B3A3D", +"% c #3B3D3B", +"& c #3B464A", +"* c #454644", +"= c #48464A", +"- c #50514F", +"; c #585A57", +"> c #616260", +", c #686967", +"' c #70716E", +") c #787A78", +"! c #818380", +"~ c #868885", +"{ c #8B8D8A", +"] c #8F908D", +"^ c #939491", +"/ c #969895", +"( c #9B9D9A", +"_ c #A1A3A0", +": c #A8AAA7", +"< c #B0B3B0", +"[ c #B9BBB8", +"} c #C1C2C0", +"| c #C9CBC8", +"1 c #D2D3D1", +"2 c #D9DBD8", +"3 c #DFE1DE", +" &,!/^]]]^////]]]/((!,& ", +" @)_<12322232333322221}:^'@ ", +" &(<133333313233332222221}_/& ", +" @/}221233322113333221111111<_@ ", +" )_1112223321212223212111}1}1<) ", +"&^}1111111111}1111221111}}}}1}_&", +",:}}}111111<:]~]^^^<}11}}}}}}}:,", +"]<}}}}}}}}]~))~)~~]~]^}}}}}<<}<~", +"/}<}}}}}_)))))))))~)~)~<}}}<<<<^", +"]<<<<}<_,',,'''))))))))):<}<<<<]", +"]<<<<<<,>>>,,,>>>,,),,,,)<<<_::~", +"]_::<_~>->->->>>>>>>,,,,>^__:^/)", +"^___((,====-=-->=>>=>=>>=)_(^(^!", +"^:_(^^=-=-=-=-==-==>-----=__/^^]", +"^_((^~$$*%=*==-=--======-=_(^(^]", +"^__(]].+$$$%%*$$$$$*$@*%%=((^^^]", +"/_:_^]@.+$$$+$++$$+$$$$$+$^^^^]]", +"^___^^..$##++..$++$+....$$^]^]]]", +"]^^(^($+$$$$.....++$.$.@$.(^]]~~", +"~]^^//>+$++.$@.@.@......$>_(]]!~", +"]]^(__~@$$$$......$.$@$+$)<_^]~~", +"]^((_<<;##$.$..........$=__:(^]]", +"^^((:<<^&#$$...........$~____^^]", +"^^^((___!$+.$.@.....@.$)(___(((^", +"~^^^__(^^~=$..$.@....=)^/_:::_:~", +">^^^/^^]]]])=@.$..$=)^^^^(_<:<:,", +"&]]^^]]))~~^^]]]^/__:(^^(__::::&", +" )^]^^]]))~~]]]^^(_:_^(^_:<:::) ", +" @^^(^^]~~])~)~]((___^/(:<_<_(@ ", +" &^__(]])~]~)~^^_:__(^(_:<:_& ", +" @)((]]]~~)~)^(__(((((_:<)@ ", +" &,)]]]]])!]^(__(_((~>& "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/green.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/green.xpm new file mode 100644 index 0000000..cd027e0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/green.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * green_xpm[] = { +"32 32 32 1", +" c #000100", +". c #022D01", +"+ c #004300", +"@ c #007F00", +"# c #009400", +"$ c #00A301", +"% c #00AA00", +"& c #00B600", +"* c #04BC0A", +"= c #00C100", +"- c #02C805", +"; c #00CC00", +"> c #24B329", +", c #00D400", +"' c #18CA24", +") c #3FB740", +"! c #31C733", +"~ c #3FC640", +"{ c #31D633", +"] c #4FC650", +"^ c #5DD45D", +"/ c #5BD957", +"( c #51DF54", +"_ c #6BD16D", +": c #6AE26D", +"< c #81DF81", +"[ c #8DDB8C", +"} c #7EE77F", +"| c #79EE7A", +"1 c #8FEF8F", +"2 c #9DEC9D", +"3 c #A6E7A5", +" +@$=*&&&*====&&&===$@+ ", +" .#;{:123333333333333[:!&#. ", +" +-;|22222223222223333333<*=+ ", +" .-,11111111221111122223[332!;. ", +" #-}1}|}||1|111111}11<<[[[[[<;# ", +"+*^}}}}|}||}}<<1||||}1<<[[[[[:;+", +"@':^::|||||:___}}|||:|}_<_[_[_'@", +"%{^:://///^_^^_^:/|(/::^______~%", +"*(/////:^^^^_]]^^/((((:^^^]___]=", +"%~~/~(/~]~]]~]]]/((((((//^]]]]^%", +"%~!!!!~)))))~]~]~({({{{(~~~]))]$", +"&!!!!~~))>))~!~!~!{({{(!~~~))))$", +"&!!!*>>>>>>>>!!'{!{{{{{!!~>~)))$", +"=-'*>&>%>&!*'--'{-''{-{'!!!%>#>%", +"*='*>%$%&&'=-{;-'{-='=---=!&!%!%", +"*--=&%%%&=;--;-=-=;=*&!**-=&&&&&", +"=-;-=&%&==;;======--*&&&**&&&&&&", +"*-;-=&**-,;==&&*==-==*&*=-*&&&%&", +"&&=====;;,;=&&&&&*===&===-=*&&$%", +"%&**==,,,,;-&%%%%%&&&**-;;;=&%%%", +"%&&*-;,,,,,;=%%%$$%&%&*-;;;;=&%%", +"&&=-,,,,,,,;=&$$$#%%%%&=-;;;-&&&", +"**=-,,,,,,,=*&%$$$$%%%&=-;;;=*&&", +"*&*=,,,,,,-=&=&&&%%%%&&*=-;;;===", +"$*&*=-{=*===*=-==&&*&&*===;;;;;%", +"@*&*==&%%&&*==--======*&*-;,,,;@", +"+&&&&=&%$%%&=&*===-;;=&*=;,,,,,+", +" #&&&&&%#$%%&%%&*-;;-=*=-,,,,,# ", +" .&===&&$$$%$$%&==,;-=*=,,,,,-. ", +" +&===&%$%%$$$&=;;;-==-,,,,-+ ", +" .#-=&&%%%$$$&=-;=====;,,$. ", +" +@$&&&%$$$%==----='&@+ "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/green_bomb.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/green_bomb.xpm new file mode 100644 index 0000000..3cd7298 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/green_bomb.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * green_bomb_xpm[] = { +"32 32 32 1", +" c #000100", +". c #003700", +"+ c #003E00", +"@ c #004405", +"# c #004600", +"$ c #005E00", +"% c #1B541B", +"& c #006E00", +"* c #2C602D", +"= c #008B00", +"- c #3E6D3F", +"; c #358335", +"> c #00A800", +", c #4E7B4E", +"' c #00B700", +") c #00C100", +"! c #5E895F", +"~ c #00CD00", +"{ c #32B12E", +"] c #40AA3D", +"^ c #00D800", +"/ c #28C42B", +"( c #6D9A6E", +"_ c #41C442", +": c #5CCB5D", +"< c #58DA59", +"[ c #7EC678", +"} c #73D173", +"| c #73E773", +"1 c #83EB84", +"2 c #93EB92", +"3 c #A0E7A0", +" @&>)'''''))))''')))>&# ", +" .=~~|2333333333333332|/'=. ", +" +~^1222233333323333333332''@ ", +" .)~212122123222222333333333/). ", +" =~12111111121211112222[3[322~= ", +"@)<1|11|||||121111||1112}[[[}|~@", +"=/|||||||||}[!((((([}|}1}}}[}})=", +">/<:<|<|<|(!!!(!((((((::|}1}}}_>", +")<<<<<<<:!!!!!!!!!!!!(!}<:<::}:)", +"'_//", +"'/////]-, --------*--;*--]_{_]]>", +"'/////;.---.--***********;_{{{]>", +")~))>{**.-.*.%%%*%%*%****%//{{>>", +"'))/>>..%.*%%%%%#%%%%%%%%%'/'/>'", +")~))'{...+++@@##%###@@@@#@)'/'/>", +")~~~)'.@@@@@@@@@@@#%#@@@@@''>'''", +"))~))'++@@##+++@@#+#@+.+@+'''''>", +">)))')@####+.++++++++++@@@)''>>>", +"'>')))&###@#+.....+++@+@#&~)'>>>", +">''))~>#####+........++@#>^~)'>>", +"'')~~^^&####++......+.++&)~~~'''", +"'))~~^^)$###@+.......+++>~~~))''", +"'/')~^^)>#@+++++......#=~)~~~)))", +">''))))')>$++@@@#++++$>'))~~~~)>", +"='''))''>')=&#+#+@+&>)'')~~^^^^=", +"+'''''>>>>''))')))~)))'''~~^^~~#", +" ='''''>=>>>>>'')~~~~)))~~^~~^= ", +" .>)))''>=>>>>>'')~~~'))~^^^~~. ", +" @))))'>>>>>=>>)~~~))))^^^~~+ ", +" .=~)'>>>>>>>')~~~))))~^^>. ", +" #&>'''>>=>>)~))))))>=@ "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/magenta.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/magenta.xpm new file mode 100644 index 0000000..971fde8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/magenta.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * magenta_xpm[] = { +"32 32 32 1", +" c #000100", +". c #380F3F", +"+ c #490754", +"@ c #890089", +"# c #9E02A1", +"$ c #A800A6", +"% c #AF00B1", +"& c #B900B6", +"* c #B902BE", +"= c #C200C3", +"- c #CC00C8", +"; c #D100D2", +"> c #DE00DB", +", c #CC18CC", +"' c #C324C3", +") c #BC33BC", +"! c #D629D5", +"~ c #B93DB9", +"{ c #D23BD2", +"] c #D34BD2", +"^ c #CF53D0", +"/ c #CE5ECE", +"( c #E551E4", +"_ c #E366E3", +": c #D473D4", +"< c #DD6DDD", +"[ c #EB7BEC", +"} c #E683E5", +"| c #DD8BDD", +"1 c #F18FF2", +"2 c #F09BF0", +"3 c #E7A2E8", +" +@#=*&%&*====&%&===$@+ ", +" .@=!_233333333333333|/{*@. ", +" +;>[22223333332233333333|'=+ ", +" .=!12111112222122233333333|{-. ", +" @,}}}}1[1[[1}21111}1|||||3||;# ", +"+=_<[[[[[[[[}:}[[[[[}}}|||||:<=+", +"@=<<<_<[__[<<:::[[_[_[<::::|::'@", +"${_/______>;;;=%$$#$$%%%*=;;;-=%%%", +"&&=,-;>>;>;-=%%###$$%%&==--;=&%%", +"&&*;->>>>>;=&%%$#$$$$$%==;,--=&&", +"=*&=;;;;;;-&**&&%$$$$%&&-=;;=&==", +"$*%*===*&===&===***&****==;;;-;$", +"@&&&*=%$%%*&=---==&===*&&=-;>;;@", +"+*&&&&&$#$%&**&=&;=-==**=;;;>;;+", +" @****%$##$%%$&&==;;-=&=-;>;;;@ ", +" .%&==*%$#$$$#$%&=;;-=&=;;>;-;. ", +" +====&$$$$$$$&----=*==;>;>;+ ", +" .#==&%$$%##$%=;;-====;;;#. ", +" +@#%*%$$##%*===-=-&$@+ "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/magenta_bomb.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/magenta_bomb.xpm new file mode 100644 index 0000000..0a05590 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/magenta_bomb.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * magenta_bomb_xpm[] = { +"32 32 32 1", +" c #000100", +". c #3A033B", +"+ c #410142", +"@ c #48004B", +"# c #6C006C", +"$ c #541954", +"% c #840084", +"& c #9B009D", +"* c #612F61", +"= c #AC00AC", +"- c #792A7D", +"; c #BA00B9", +"> c #C200C2", +", c #813285", +"' c #D000D0", +") c #734472", +"! c #B91EBA", +"~ c #8E488B", +"{ c #B034B1", +"] c #855A85", +"^ c #CD31CD", +"/ c #C643C7", +"( c #967098", +"_ c #AC6DAC", +": c #C960CA", +"< c #D859D8", +"[ c #E770E7", +"} c #E376E3", +"| c #DD7CDD", +"1 c #EF8BEF", +"2 c #E894E8", +"3 c #E7A2E8", +" @%&>;;=;;>>>>;=;>>>=%@ ", +" .&'^[1333333333333332:^;%. ", +" @>'[22233333332333333333|^;@ ", +" .'^121111112221112333333333^'. ", +" &^1111111111222111122222_322'& ", +"@><}}}1[1[[[}}1111[}}}|2|2|_2[>@", +"%>}[}[[[[[[2_((((((2|[}|||||||>%", +"=^<<<<<<[:_]((((((](]_:::::|:|/=", +";<<<<<<<:]]]]]]]]]]]]]]::::::::>", +";//<^<^:)))])])])])]]]]]<<:{::<=", +"=/^^^;!={*.*.*.*$*$$$$$*$*$**!!{{{=", +";'>!=&..*.*.$$$$$$$$$$$$$$!;!!=!", +">>>>!{.....$.@+@@@$+$+$+$$;!;!!=", +";''>>=...++@+++++@@++...++;!;;;;", +";>'';;.++@@+.+..+++++..+++>;;===", +";;;>>>+++@++..++.+++++++++>;;===", +"==;;;>%+@+@++.......++++@#>>;===", +"=;;>>>=+@+@@+.........++@=''>===", +";;>>'''#@@+++...........#>'>';==", +";;>>'''^@@@++..........+=''>>>>;", +";;;>''''=@++++......+.+&>>''>>;;", +"=;;>>'>;>=#.++++.....#&;>>'''''=", +"%!;;>;;===;%#++++++#&;;;;>'''''%", +"@;;;;;;=&==>;;>;>>>'>>;;>''''''@", +" &=!;;==&&======>>''>>;>>'''''& ", +" .;;;>;==&===&=;;>''';;>'''''>. ", +" @;>>>;=&&==&=;>'>'>>>''''''@ ", +" .&>>==;==&=&=>'>>>>;>'''{. ", +" @%======&&=;>'>'>>>!%@ "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/porsche.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/porsche.xpm new file mode 100644 index 0000000..a940c0c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/porsche.xpm @@ -0,0 +1,71 @@ +/* XPM */ +static const char * porsche_xpm[] = { +"64 64 4 1", +" c #background", +". c #000000000000", +"X c #ffd100", +"o c #FFFF00000000", +" ", +" .......................... ", +" ..................................... ", +" ............XXXXXXXXXXXXXXXXXXXXXXXX............ ", +" ......XXXXXXX...XX...XXXXXXXX...XXXXXXXXXX...... ", +" ..XXXXXXXXXX..X..XX..XXXX.XXXX..XXXXXXXXXXXXXX.. ", +" ..XXXXXXXXXX..X..XX..XXX..XXXX..X...XXXXXXXXXX.. ", +" ..XXXXXXXXXX..XXXXX..XX.....XX..XX.XXXXXXXXXXX.. ", +" ..XXXXXXXXX.....XXX..XXX..XXXX..X.XXXXXXXXXXXX.. ", +" ..XXXXXXXXXX..XXXXX..XXX..XXXX....XXXXXXXXXXXX.. ", +" ..XXXXXXXXXX..XXXXX..XXX..XXXX..X..XXXXXXXXXXX.. ", +" ..XXXXXXXXXX..XXXXX..XXX..X.XX..XX..XXXXXXXXXX.. ", +" ..XXXXXXXXX....XXX....XXX..XX....XX..XXXXXXXXX.. ", +" ..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.. ", +" ..XXXXXXXXX..........................XXXXXXXXX.. ", +" ..XXX.......XXXXXXXXXXX...................XXXX.. ", +" ......XX.XXX.XXX..XXXXX......................... ", +" ..XXXXX.XXX.XXX.XXXX.XX......................... ", +" ..XXXX.XXX.XX.......XXX......................... ", +" ..XXXX.......XXXXXX..XX..ooooooooooooooooooooo.. ", +" ..X.....XXXXXXXXXXXXXXX..ooooooooooooooooooooo.. ", +" ..X...XXXXXXXXXXXXXXXXX..ooooooooooooooooooooo.. ", +" ..X..XXXXXXX.XX.XXXXXXX..ooooooooooooooooooooo.. ", +" ..XXXXX.XXX.XX.XXXXXXXX..ooooooooooooooooooooo.. ", +" ..XXXX.XXX.XX.XX................................ ", +" ..XXXX.X.........X....X.X.X..................... ", +" ..XXXX...XXXXXXX.X..X...X.X.X.X................. ", +" ..X....XXXXXXXXXX.X...X.X.X..................... ", +" ..X...XXXXXXXXXX.XXXXXXXXXXXXXX................. ", +" ..X..XXXXXX.XX.X.XXX...XXXXXXXX................. ", +" ..XXXXX.XX.XX.XX.XX.....XXXXXXX.oooooooooooooo.. ", +" ..XXXX.XX.XX.XX..XX.X...XXXXX.X.oooooooooooooo.. ", +" ..XXXX.X.......X.XXXX...XXXX..X.oooooooooooooo.. ", +" ..X......XXXXXX..XXXX...XXXX..X.oooooooooooooo.. ", +" ..X...XXXXXXXXXX.XXX.....XXX.XX.oooooooooooooo.. ", +" ..X..XXXXXXXXXXX.X...........XX.oooooooooooooo.. ", +" .................X.X.........XX................. ", +" .................X.X.XXXX....XX.XXXXXXXXXXXXXX.. ", +" .................XXX.XXXXX.X.XX.XXX.XX.XXXXXXX.. ", +" ................XXXX.XXX..X..X.XX.XX.XXX.XXX.. ", +" ................XXXXXXXX.XX.XX.X.XX.XXX.XXXX.. ", +" .................XXXXXX.XX.XX.X..........XXX.. ", +" ..oooooooooooooo.XXXXXXXXXX....XXXXXXXX..X.. ", +" ..ooooooooooooooo.XXXXXXXX....XXXXXXXXXXXX.. ", +" ..ooooooooooooooo........XXXXXXX.XX.XXXX.. ", +" ..oooooooooooooooooo..XXXXX.XXX.XX.XX.XX.. ", +" ..ooooooooooooooooo..XXXX.XXX.XX.XX.XX.. ", +" ..ooooooooooooooooo..XXX.XX........XXX.. ", +" ....................XXX....XXXXXX..X.. ", +" ...................XX...XXXXXXXXXXX. ", +" ...................X...XXXXXXXXXXX.. ", +" ..................X..XXXX.XXXXXX.. ", +" .................XXX.XX.XX.XXX.. ", +" ................XX.XX.XX.XXX.. ", +" ..ooooooooooo..XX.......XX.. ", +" ..oooooooooo..X...XXXX.X.. ", +" ..ooooooooo..X..XXXXXX.. ", +" ...ooooooo..X..XXXX... ", +" ....ooooo..XXXXX.... ", +" ....ooo..XXX.... ", +" ....o..X.... ", +" ........ ", +" .... ", +" "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/porsche1.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/porsche1.xpm new file mode 100644 index 0000000..b4e1475 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/porsche1.xpm @@ -0,0 +1,76 @@ +/* XPM */ +static const char * porsche[] = { +/* width height ncolors chars_per_pixel */ +"64 64 -4 1 ", +/* colormap */ +"\ + \x50\x50\x80\ +.\xff\xff\0\ +r\xff\x00\0\ +b\0\0\0", +/* pixels */ +" bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ", +" bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ", +" bb............................................bb ", +" bb.......................bbbbbbb.bb...........bb ", +" bb.......................bbbbbbb.bb...........bb ", +" bb......bbb...bb..bb.....bb......bb...........bb ", +" bb......bbb...bb..bb.....bb......bb...........bb ", +" bb.......bb.......bbbb...bbbbb...bb...........bb ", +" bb.......bb...bb..bbbbb..bbbbb...bb...........bb ", +" bb.......bb...bb..bb.bb..bb......bb...........bb ", +" bb......bbbb..bb..bbbbb..bb......bbbbbb.......bb ", +" bb......bbbb..bb..bbbb...bb......bbbbbb.......bb ", +" bb............................................bb ", +" bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ", +" bb.....................bbbbbbbbbbbbbbbbbbbbbbbbb ", +" bb......b...b...bb.....bbbbbbbbbbbbbbbbbbbbbbbbb ", +" bb.....b...b...b....b..bbbbbbbbbbbbbbbbbbbbbbbbb ", +" bb....bb..bb.bbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbb ", +" bb...bbbbbbbb......bb..bbrrrrrrrrrrrrrrrrrrrrrbb ", +" bb..bbbb...............bbrrrrrrrrrrrrrrrrrrrrrbb ", +" bb.bbb.................bbrrrrrrrrrrrrrrrrrrrrrbb ", +" bb..........b..b.......bbrrrrrrrrrrrrrrrrrrrrrbb ", +" bb.....b...b..b........bbrrrrrrrrrrrrrrrrrrrrrbb ", +" bb....b...b..b..bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ", +" bb....b.bbbbbbbbb..............bbbbbbbbbbbbbbbbb ", +" bb...bbbb.......bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ", +" bb..bbb.........b..............bbbbbbbbbbbbbbbbb ", +" bb.bbb..........b...bbb........bbbbbbbbbbbbbbbbb ", +" bb.........b..b.b..bbbbb.......bbbbbbbbbbbbbbbbb ", +" bb.....b..b..b..b..b.bbb.....b.brrrrrrrrrrrrrrbb ", +" bb....b..b..b..bb....bbb....bb.brrrrrrrrrrrrrrbb ", +" bb...bb.bbbbbbb.b....bbb....bb.brrrrrrrrrrrrrrbb ", +" bb..bbbbb......bb...bbbbb...b..brrrrrrrrrrrrrrbb ", +" bb.bbb..........b.bbbbbbbbbbb..brrrrrrrrrrrrrrbb ", +" bb..............b.b.bbbbbbbbb..brrrrrrrrrrrrrrbb ", +" bbbbbbbbbbbbbbbbb.b.b....bbbb..bbbbbbbbbbbbbbbbb ", +" bbbbbbbbbbbbbbbbb...b.....b.b..b..............bb ", +" bbbbbbbbbbbbbbbbb........bb.bb.b...b..b.......bb ", +" bbbbbbbbbbbbbbbb........b..b..b..b..b...b...bb ", +" bbbbbbbbbbbbbbbb.......b..b...b.b..b...b....bb ", +" bbbbbbbbbbbbbbbbb............b.bbbbbbbbbb...bb ", +" bbrrrrrrrrrrrrrrb..........bbbb........bb.bb ", +" bbrrrrrrrrrrrrrrrb........bbbb............bb ", +" bbrrrrrrrrrrrrrrrbbbbbbbb.......b..b....bb ", +" bbrrrrrrrrrrrrrrrrrrbb.....b...b..b..b..bb ", +" bbrrrrrrrrrrrrrrrrrbb....b...b..b..b..bb ", +" bbrrrrrrrrrrrrrrrrrbb...bb.bbbbbbbb...bb ", +" bbbbbbbbbbbbbbbbbbbb...bbbb......bb.bb ", +" bbbbbbbbbbbbbbbbbbb..bbb...........b ", +" bbbbbbbbbbbbbbbbbbb.bbb...........bb ", +" bbbbbbbbbbbbbbbbbb..............bb ", +" bbbbbbbbbbbbbbbbb...b.b.b.....bb ", +" bbbbbbbbbbbbbbbb..b.b.b..b..bb ", +" bbrrrrrrrrrrrbb..bbbbbbb..bb ", +" bbrrrrrrrrrrbb.bbb....b.bb ", +" bbrrrrrrrrrbb.bb......bb ", +" bbbrrrrrrrbb.......bbb ", +" bbbbrrrrrbb.....bbbb ", +" bbbbrrrbb...bbbb ", +" bbbbrbb.bbbb ", +" bbbbbbbb ", +" bbbb ", +" bb ", +" " +} ; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/red.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/red.xpm new file mode 100644 index 0000000..8aa57ce --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/red.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * red_xpm[] = { +"32 32 32 1", +" c #000100", +". c #2D0001", +"+ c #440000", +"@ c #850000", +"# c #A20000", +"$ c #AC0001", +"% c #B70000", +"& c #C30000", +"* c #D10000", +"= c #AB1111", +"- c #BF0C10", +"; c #DD0000", +"> c #CD191B", +", c #BB2222", +"' c #B53A39", +") c #CF2F30", +"! c #C33738", +"~ c #C34746", +"{ c #E14548", +"] c #D44D4C", +"^ c #CC5554", +"/ c #E25858", +"( c #DB6161", +"_ c #D16867", +": c #E96A6B", +"< c #E27373", +"[ c #DA7D7E", +"} c #EE8283", +"| c #DD8D8C", +"1 c #EF9191", +"2 c #F09D9B", +"3 c #E9A3A2", +" +@#&%%%%%&&&&%%%&&&#@+ ", +" .#*):1333333333333332(!$#. ", +" +&><22223333332333333333[,%+ ", +" .&)11111111122111233333333|)*. ", +" #>}}1}}}}1}}|111}}}||[||||||># ", +"+%/<<<}}:}<}}[<[}}}}}}[[[|||[(&+", +"@)_<<<:<::<<_<<<<:::<<<[[[[[[[)@", +"#)(((/(:::(_____<:::::(____[__!#", +"%{^](//^^(^^^_^^((///:/(^^_^__^&", +"%~]]]]]~~~^~^~^^~///{/]^^^~^_^^%", +"$!!!!!]'~'~~~~~~~{{{{{{{~]~~'^^#", +"%!){)!''''''!!!!!!!){){!!'~''''#", +"%,),,,!!,',!,)))))))))))!!!''''#", +"&>-,,====,=,,>>>>>>)>>>)),,,@''#", +"%>--=====-->>>>>>>>>>)->>-),,==%", +"&&&-$==#--&**&&&&&&&---%-------$", +"&**&&%$%&&*&&&&-&&>&%%-%&&%$$--%", +"%&*&&%%&&**&&-%%%&*&&%%&%&&%%%$$", +"%%&&&%&&***&%$%%%%&&%%%&&&&%%$$$", +"$%%%&&**;**&%$$$$$%%%%&***&&%$##", +"$%%&&**;****&$$###$%%$%&&***&%%$", +"%%&&**;;;;**%%#####$$%%%**&*&%$%", +"%&&&*;*;*;*&%%$####$#$%%&***&&%%", +"&%%&******&&%%%%$###$%%&&&&*&&&&", +"#&%&&&&&&&&&&&&&&%%%%&%&&&***&&$", +"@%%$&&$$$$%%&&&&&&&&%%&%%****;*@", +"+%%%%&$###$%&%&&&&&**%%&%&*;*;*+", +" @%$&%%###$$$%$%%&**&&&%**;**&# ", +" .&%%&&$#######%&&***%&&**;**&. ", +" +&*&&%$##$##$%&&**&&%&*;*;*+ ", +" .#&&%%%#$###%&&&&&&&&*;*#. ", +" +@#$$%%###$&&*&&&&&#@+ "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/red_bomb.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/red_bomb.xpm new file mode 100644 index 0000000..eb78474 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/red_bomb.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * red_bomb_xpm[] = { +"32 32 32 1", +" c #000100", +". c #340001", +"+ c #3C0100", +"@ c #410003", +"# c #440000", +"$ c #760000", +"% c #4E1414", +"& c #A60000", +"* c #B70000", +"= c #5F2928", +"- c #C30000", +"; c #CE0000", +"> c #D90000", +", c #BE1315", +"' c #653A3B", +") c #733C3C", +"! c #B92223", +"~ c #D31A1D", +"{ c #744A49", +"] c #AE3232", +"^ c #CD3B3B", +"/ c #875B5B", +"( c #C04848", +"_ c #9A6E6E", +": c #D35A5A", +"< c #C57170", +"[ c #DF6D6D", +"} c #D97D7D", +"| c #ED8181", +"1 c #DD8D8C", +"2 c #EF9191", +"3 c #EAA2A1", +" #$&-*****----***---&$# ", +" .&;~[2333333333333331[^*&. ", +" @*~|23233333333333333333}!*# ", +" .-~222222222332223333333331^-. ", +" &,|||||||22||222|2|11}111112~& ", +"@-:|||||||[||}}|||||||}}1<11}:-#", +"$~[[[[[[[[[}_______<}|[}}<<}<},$", +"&^:[::[::[>$####@+....+.+.++$;;;-*&*", +"**--;>>;####@@+.+...@..#&;;----*", +"***-;;;>*##+++@@.+++.@@&--;;;-*-", +"&-*-;;-*;*$+#@##+@.@+$&*--;;;;-&", +"$*******&*&&$###@@+$&****-;>>>>$", +"#*****&&&&&&***------*-*-;;>>>;#", +" &*****&&&&*&***---;;-*-;;>;;;& ", +" .*-*-*&&&&&&&&&-;;;--*-;>>>;-. ", +" #*;--*&&&&&&&*--;;---->;>>;# ", +" .&--*&*&&&&&*-;------->>&. ", +" #$&***&&&&&--;-----*$@ "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/srs.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/srs.xbm new file mode 100644 index 0000000..7812af5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/srs.xbm @@ -0,0 +1,67 @@ +#define sorceress_width 75 +#define sorceress_height 75 +static unsigned char sorceress_bits[] = +{ + 0xfc, 0x7e, 0x40, 0x20, 0x90, 0x00, 0x07, 0x80, 0x23, 0x00, 0x00, 0xc6, + 0xc1, 0x41, 0x98, 0xb8, 0x01, 0x07, 0x66, 0x00, 0x15, 0x9f, 0x03, 0x47, + 0x8c, 0xc6, 0xdc, 0x7b, 0xcc, 0x00, 0xb0, 0x71, 0x0e, 0x4d, 0x06, 0x66, + 0x73, 0x8e, 0x8f, 0x01, 0x18, 0xc4, 0x39, 0x4b, 0x02, 0x23, 0x0c, 0x04, + 0x1e, 0x03, 0x0c, 0x08, 0xc7, 0xef, 0x08, 0x30, 0x06, 0x07, 0x1c, 0x02, + 0x06, 0x30, 0x18, 0xae, 0xc8, 0x98, 0x3f, 0x78, 0x20, 0x06, 0x02, 0x20, + 0x60, 0xa0, 0xc4, 0x1d, 0xc0, 0xff, 0x41, 0x04, 0xfa, 0x63, 0x80, 0xa1, + 0xa4, 0x3d, 0x00, 0x84, 0xbf, 0x04, 0x0f, 0x06, 0xfc, 0xa1, 0x34, 0x6b, + 0x01, 0x1c, 0xc9, 0x05, 0x06, 0xc7, 0x06, 0xbe, 0x11, 0x1e, 0x43, 0x30, + 0x91, 0x05, 0xc3, 0x61, 0x02, 0x30, 0x1b, 0x30, 0xcc, 0x20, 0x11, 0x00, + 0xc1, 0x3c, 0x03, 0x20, 0x0a, 0x00, 0xe8, 0x60, 0x21, 0x00, 0x61, 0x1b, + 0xc1, 0x63, 0x08, 0xf0, 0xc6, 0xc7, 0x21, 0x03, 0xf8, 0x08, 0xe1, 0xcf, + 0x0a, 0xfc, 0x4d, 0x99, 0x43, 0x07, 0x3c, 0x0c, 0xf1, 0x9f, 0x0b, 0xfc, + 0x5b, 0x81, 0x47, 0x02, 0x16, 0x04, 0x31, 0x1c, 0x0b, 0x1f, 0x17, 0x89, + 0x4d, 0x06, 0x1a, 0x04, 0x31, 0x38, 0x02, 0x07, 0x56, 0x89, 0x49, 0x04, + 0x0b, 0x04, 0xb1, 0x72, 0x82, 0xa1, 0x54, 0x9a, 0x49, 0x04, 0x1d, 0x66, + 0x50, 0xe7, 0xc2, 0xf0, 0x54, 0x9a, 0x58, 0x04, 0x0d, 0x62, 0xc1, 0x1f, + 0x44, 0xfc, 0x51, 0x90, 0x90, 0x04, 0x86, 0x63, 0xe0, 0x74, 0x04, 0xef, + 0x31, 0x1a, 0x91, 0x00, 0x02, 0xe2, 0xc1, 0xfd, 0x84, 0xf9, 0x30, 0x0a, + 0x91, 0x00, 0x82, 0xa9, 0xc0, 0xb9, 0x84, 0xf9, 0x31, 0x16, 0x81, 0x00, + 0x42, 0xa9, 0xdb, 0x7f, 0x0c, 0xff, 0x1c, 0x16, 0x11, 0x00, 0x02, 0x28, + 0x0b, 0x07, 0x08, 0x60, 0x1c, 0x02, 0x91, 0x00, 0x46, 0x29, 0x0e, 0x00, + 0x00, 0x00, 0x10, 0x16, 0x11, 0x02, 0x06, 0x29, 0x04, 0x00, 0x00, 0x00, + 0x10, 0x16, 0x91, 0x06, 0xa6, 0x2a, 0x04, 0x00, 0x00, 0x00, 0x18, 0x24, + 0x91, 0x04, 0x86, 0x2a, 0x04, 0x00, 0x00, 0x00, 0x18, 0x27, 0x93, 0x04, + 0x96, 0x4a, 0x04, 0x00, 0x00, 0x00, 0x04, 0x02, 0x91, 0x04, 0x86, 0x4a, + 0x0c, 0x00, 0x00, 0x00, 0x1e, 0x23, 0x93, 0x04, 0x56, 0x88, 0x08, 0x00, + 0x00, 0x00, 0x90, 0x21, 0x93, 0x04, 0x52, 0x0a, 0x09, 0x80, 0x01, 0x00, + 0xd0, 0x21, 0x95, 0x04, 0x57, 0x0a, 0x0f, 0x80, 0x27, 0x00, 0xd8, 0x20, + 0x9d, 0x04, 0x5d, 0x08, 0x1c, 0x80, 0x67, 0x00, 0xe4, 0x01, 0x85, 0x04, + 0x79, 0x8a, 0x3f, 0x00, 0x00, 0x00, 0xf4, 0x11, 0x85, 0x06, 0x39, 0x08, + 0x7d, 0x00, 0x00, 0x18, 0xb7, 0x10, 0x81, 0x03, 0x29, 0x12, 0xcb, 0x00, + 0x7e, 0x30, 0x28, 0x00, 0x85, 0x03, 0x29, 0x10, 0xbe, 0x81, 0xff, 0x27, + 0x0c, 0x10, 0x85, 0x03, 0x29, 0x32, 0xfa, 0xc1, 0xff, 0x27, 0x94, 0x11, + 0x85, 0x03, 0x28, 0x20, 0x6c, 0xe1, 0xff, 0x07, 0x0c, 0x01, 0x85, 0x01, + 0x28, 0x62, 0x5c, 0xe3, 0x8f, 0x03, 0x4e, 0x91, 0x80, 0x05, 0x39, 0x40, + 0xf4, 0xc2, 0xff, 0x00, 0x9f, 0x91, 0x84, 0x05, 0x31, 0xc6, 0xe8, 0x07, + 0x7f, 0x80, 0xcd, 0x00, 0xc4, 0x04, 0x31, 0x06, 0xc9, 0x0e, 0x00, 0xc0, + 0x48, 0x88, 0xe0, 0x04, 0x79, 0x04, 0xdb, 0x12, 0x00, 0x30, 0x0c, 0xc8, + 0xe4, 0x04, 0x6d, 0x06, 0xb6, 0x23, 0x00, 0x18, 0x1c, 0xc0, 0x84, 0x04, + 0x25, 0x0c, 0xff, 0xc2, 0x00, 0x4e, 0x06, 0xb0, 0x80, 0x04, 0x3f, 0x8a, + 0xb3, 0x83, 0xff, 0xc3, 0x03, 0x91, 0x84, 0x04, 0x2e, 0xd8, 0x0f, 0x3f, + 0x00, 0x00, 0x5f, 0x83, 0x84, 0x04, 0x2a, 0x70, 0xfd, 0x7f, 0x00, 0x00, + 0xc8, 0xc0, 0x84, 0x04, 0x4b, 0xe2, 0x2f, 0x01, 0x00, 0x08, 0x58, 0x60, + 0x80, 0x04, 0x5b, 0x82, 0xff, 0x01, 0x00, 0x08, 0xd0, 0xa0, 0x84, 0x04, + 0x72, 0x80, 0xe5, 0x00, 0x00, 0x08, 0xd2, 0x20, 0x44, 0x04, 0xca, 0x02, + 0xff, 0x00, 0x00, 0x08, 0xde, 0xa0, 0x44, 0x04, 0x82, 0x02, 0x6d, 0x00, + 0x00, 0x08, 0xf6, 0xb0, 0x40, 0x02, 0x82, 0x07, 0x3f, 0x00, 0x00, 0x08, + 0x44, 0x58, 0x44, 0x02, 0x93, 0x3f, 0x1f, 0x00, 0x00, 0x30, 0x88, 0x4f, + 0x44, 0x03, 0x83, 0x23, 0x3e, 0x00, 0x00, 0x00, 0x18, 0x60, 0xe0, 0x07, + 0xe3, 0x0f, 0xfe, 0x00, 0x00, 0x00, 0x70, 0x70, 0xe4, 0x07, 0xc7, 0x1b, + 0xfe, 0x01, 0x00, 0x00, 0xe0, 0x3c, 0xe4, 0x07, 0xc7, 0xe3, 0xfe, 0x1f, + 0x00, 0x00, 0xff, 0x1f, 0xfc, 0x07, 0xc7, 0x03, 0xf8, 0x33, 0x00, 0xc0, + 0xf0, 0x07, 0xff, 0x07, 0x87, 0x02, 0xfc, 0x43, 0x00, 0x60, 0xf0, 0xff, + 0xff, 0x07, 0x8f, 0x06, 0xbe, 0x87, 0x00, 0x30, 0xf8, 0xff, 0xff, 0x07, + 0x8f, 0x14, 0x9c, 0x8f, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x07, 0x9f, 0x8d, + 0x8a, 0x0f, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0xbf, 0x0b, 0x80, 0x1f, + 0x00, 0x00, 0xff, 0xff, 0xff, 0x07, 0x7f, 0x3a, 0x80, 0x3f, 0x00, 0x80, + 0xff, 0xff, 0xff, 0x07, 0xff, 0x20, 0xc0, 0x3f, 0x00, 0x80, 0xff, 0xff, + 0xff, 0x07, 0xff, 0x01, 0xe0, 0x7f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x07, + 0xff, 0x0f, 0xf8, 0xff, 0x40, 0xe0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, + 0xff, 0xff, 0x40, 0xf0, 0xff, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, 0xff, + 0x41, 0xf0, 0xff, 0xff, 0xff, 0x07}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/sudoku.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/sudoku.xbm new file mode 100644 index 0000000..68b37d1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/sudoku.xbm @@ -0,0 +1,14 @@ +#define sudoku_width 32 +#define sudoku_height 32 +static unsigned char sudoku_bits[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x0c, 0x30, 0xc0, + 0x63, 0xcc, 0x33, 0xcf, 0x63, 0x4c, 0x33, 0xcc, 0x63, 0x4c, 0x33, 0xcc, + 0x63, 0xcc, 0x33, 0xcc, 0x63, 0x0c, 0x33, 0xcc, 0x63, 0x0c, 0x33, 0xcc, + 0x03, 0x0c, 0x30, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x03, 0x0c, 0x30, 0xc0, 0xd3, 0xcc, 0x33, 0xcf, 0xd3, 0xcc, 0x30, 0xcc, + 0xd3, 0xcc, 0x33, 0xce, 0xf3, 0xcc, 0x32, 0xce, 0xc3, 0xcc, 0x32, 0xcc, + 0xc3, 0xcc, 0x33, 0xcf, 0x03, 0x0c, 0x30, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x03, 0x0c, 0x30, 0xc0, 0xf3, 0xcc, 0x33, 0xcf, + 0x83, 0x4c, 0x33, 0xc1, 0xf3, 0xcc, 0x33, 0xcf, 0x33, 0x4c, 0x33, 0xcc, + 0x33, 0x4c, 0x33, 0xcc, 0xf3, 0xcc, 0x33, 0xcf, 0x03, 0x0c, 0x30, 0xc0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/tile.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/tile.xpm new file mode 100644 index 0000000..dec1340 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/tile.xpm @@ -0,0 +1,120 @@ +/* XPM */ +static const char * tile_xpm[] = { +"100 100 17 1", +" c None", +". c #DCDCDC", +"+ c #D9D9D9", +"@ c #E4E4E4", +"# c #DFDFDF", +"$ c #CECECE", +"% c #D2D2D2", +"& c #C8C8C8", +"* c #CACACA", +"= c #C4C4C4", +"- c #BEBEBE", +"; c #D4D4D4", +"> c #E8E8E8", +", c #D6D6D6", +"' c #C6C6C6", +") c #B2B2B2", +"! c #E2E2E2", +".+@.##$%%$$$&*=..%$*%-;*>,%$%#>,$,%%*%*.#*%++$;+,,.&&=-%%+.$,#,=;%#,@.+,%>,+=-++@@#%$.++#,--;.=*+,,>", +"%%.&$@.#,*%*&'%%&$;,*%%,&%;%,#..;$$%';+.+,++.%.;+@@@$'.;'..;@.+$%)&!!,.!>+%@%-*%@>#.+&&+.+$%,++$$#++", +",.$&$+#+.%++$%,=$;$&'+.%%&-+++;%;;$%+%+;.#.+@!!..>#+$%;,$.+@,+.%-%%-%>#+.#+$%...%,!>>;$$$.%$+#+*++&*", +",$;;;..-*!;*.+%=*%;*%%=&$+$++,-%;+++++++++++#@@@>@#,++;$%;++#.+++%&*=#.+;%>@+,...++$>@#&%*%;.$=$##=;", +"%#$,+$$%,.++.%%,'*%;,$=-$+@,%*$+%.#+%,.++%;.,#@@@>#+*,$%;,++..@#.,+@+.#.+%#+!.,%#>%,,+>#.%$!#%=%$$#+", +"+*'%$)&,+,+,+*%,,$,+,*-&++$%%*%#@#%$;+.%,!.+;+!@+>..,%$,$;..#,@.$;%.##.#!#;;++#.+%!.,%,.@##>%,>%$,+,", +",,$$$%%%';+$%,$!,$,;;,..,&)%%+#!+..,++%%++#+#@+,##,;,%.%.+++.#;%+.,+#.,#+;#%.@,+#.+,#!,+.>#..,,++++.", +";=-;##%=$%,.$%%+;%%%$+.%&%%%,.,%++..+++;%;;.+#.+%..%;+,#+$%.;,....+.++.+,$$.#>.$+@&+#;.@@.%!@.#+@!,%", +"-$$&+%.,#;;&$$,*$+%%.#*='$,,+.;,+,##...$%++%.,++%,..+;%,%,,%+,.,##.+%%+@,'%#.++,,,%++.>++.>#+#>>.%,%", +",!.;$$$#.;%'-'&*+++.$=*%;,++;;;.+;++,+++@@%++++..$..+%+&$.+*;,++.+;+*%+#+++...+;.%+##@.%@>#.!>#&%+=$", +"...#%%,,;=-%$=%%@+.;==;=+#+%+*$#.%+%+@.++!,%,;;%..,,*,+'+,;;#.$%#%+%,.%&+#.$+@!%;,+##++#@!!#@@&%@..+", +"+$=%%$#,$--$=$%+#,=%%,%;$;%.+.,,+!++#..++%;.%%$..,#;.+$#%$$#;.%;+..+,.%,%+,..@++..*+#,+.#>@#.+++!.+.", +"..+'=;%$,+,%$*&%&=-;+#+%==..;,#,#.###@+$%,,$$;+@#.,;.*;.+&.#%*.>.,.#$'+.%%,,%##++;+,#*.@>#%%#@+%$@@.", +"..;+.$%=$,##,,'=&$$%%++$$%,,;$;.,##.+#;++;#+;+.>..#$$%,%;,%+=$+#.!...+%,%++%;&+#$%.%#@,;+#.,#,+.+%;,", +"%;+@++*$%%$+@,*&$$*&;%%.#,.$$,++#@@#.,+%.;%#+!#.,!#..'%;%+;%*%;+,!@..#,;.%%,+&,*$.,%@>!+;,###&;;#.;%", +"$$;+.,.;%=$$$,+%+$,&$%,,.+=$%.,;##!#.#$%.+%,+.@.,#%*#%$$;+*.+,$%%@.+@..+,$%++$&%#+,.#,#@#.&$$++,+.,,", +",%+.+$.;&;%+,$,+,+%%**$+*$+,%+%,$%.%;@+%##;;;;#+##%*$%'*&++.;.+;.#+;#>++,+*%%%++,,.#;=@@.+,;$&;%;%$-", +"%'.+,'*;;;#+;&$#$$,%*,$=%,+,,%%$%%%+%!@++#;++&+.,.;,&$-%,;,++%..#+;++$+#,++,=%%+++!#++..+;;,%,%=&+..", +"%,;+%&$$+#%%++%;$&&%%%'%,,+++%,%;*.+%%>..+,+##+%+;=.&&,%$#.%;%!@,+,%,,+++.+.*%%;$.%+#!+&,;,;+,%+$=,$", +"%#.&%,-;+$+.,++$*$%&=$,,;#,.,&;&.,+%++;%.+%,+!#.;%%&*,,%.$,;&#!.%%%%++,.%,;+,%.#.$;++;%;++#,$=.++,$=", +";%;%$,$%=%#.@,,$*%*=%;%%+%$.%&'+%$#.=,++&;$>#*..+,%+$+;,,#.;.@,%.+,+;,#++,$$+++.++,+#%%$%##.,++*$+;.", +"$+%$;.,*$#+%.!..,%=*$&$;;%$%$+,$$%%%'++,+,.@#+.,$.,!;#;$,#,#++,%.%.,.+;.$%.,++%%$+,#%,+,$,.%.%$+.$,;", +"-%@#..%$+;%+;,%.+,$$'$*+%%;,%$$%%+;;,&'%#.##...$#.!$'#>+&,+#,+$*+.;+#,%%;,.!+,+$$%+.+++*+..+,+%,#+.=", +";%;###+@!;+$$;,$.+.%$$%.%.$*%&&,.,,;+;$&$+.+..$+#+$%.!.%$%%+#*;;&,#++%,,+,;#++$$%++,%,%%++!.+@.;*#,*", +"*%%+@%+#,...,$;,'$++,;#&,,&'=&'*+++.%$-=$$%!..#,%%++>+=#%;+,++,++.%..+$;.+,+$%%+,.;&,#+,*.++##@;%,%-", +"%$%#,.++$+#+%%+$'%&.,;#+$&$&&%-;,$.!+=*&=*.#;#.,%,@@$;#.*%..,+,#@..+,$%@,,.&%$;,%%$%,+%+%+&,@.##.+**", +"%*..+%.;+#,+.$$,;*$$%+;+%%$,%'%;%*%.;%+$=,%*$++,+>+'..,$%;!%$##@+#..$%.%;,,%$%%;==..$%%,+,++$;@.&+>#", +"%@@%'+$+.%.#.=&,%%%$';%&%$+.%&.%**+=$+#%.%%';%*$>.&=..%$$*...+,.;.#%.#+.@$%%.,$-&,,,%;*#%;#$,+;#+#@.", +"!@.;=,.;$@.;+.$''%%=.;=;+%*,..;=&%=$+,&,+%,+;%$;,.&!.+%$+#,+,#.;.,%,.,.>!$$;;%;%,,$*%;%+#;;+#%#>!+,.", +"##+-..+,+...+%+;$&&,*&,%,;%%%*+,%*,%%%%=-.+;##%,$$,!+!+%!,%%+#,%+;+.+;.%%;$$=+%+;,;'$,;++++..>>#%%##", +"#+%@@;++.++%,;+.%*%-$%%;%.@%*$%.,+;%++'%&;&.>%@++%$%.,%+%$###.+*+#.,%++'#%$%&$%*%$;%+.+,##++!.+#!!.%", +".-%##!@.%%$%;..;,+%$&%&%++.;+,+%%+;%;.++#$$@;#$.#%.=*$#,*+%$%+..+;;%++;;+!;$'%+'=%;;.##+.++.#+#.#.,.", +"#@!#+#@.%+%$,++,,;;,+%*&%;+%%$=#+&$+**+#,+@..#.'$,#;,*,+!%%,%.#;%$%$&;,%%,.$%.%-$;;!@$%%..+.##!+,$.$", +"..@>#@++;+;%%++..%;+!+%$;.;+'-%$+%,,=%.$+!+#@+%$>*-,%+..$=%%#.-=*%++$;%&%%&$.;%'%%.+%;.&,+#!!#+*;$*&", +">@%+.;%%#+$+*$++$;*.+%%%+,+%*&$&,+;',@=%+$#.%*..&''&.+#.;$&$;%&&.$=&$,$%=*+.&&,.+.+;,.;;%.#.++,+''&.", +"!+..$&+%$;.,++%,%%%,#,+.%+%$&,$*.+&.+$+%$.@&&+#%-=,,#;%%.#.$&%&+.%=','*$++.%%%.+.+%;++%,,#+,*.;%..@@", +"$;+%,.&=-;++@..$$,%+!!%%.%$;$;;==%#.$$$$##;++#+$=$...;%*+%+.,%%$&$*%$==,#$&$$+,++,%;%++;%+%-$++.+!@%", +".%;++.-*$%%;+.+$+;..++...,;*+%;%%.!$;+,++%+.+%;.;,,.;+%$,&&.#%&'-&%,=-,+%&&,+#+;;+,.+#+++,'%.;.##+$#", +"...#%%%*=%+$+,+....+,+.;!++;$$%,.+,+$,++#+#>+.$++.$#++$%%$%+*&+,%=%==+%'=%%+.,.&%%+%#.%%,%%%.;++%%;&", +"%+.+%+*+&;$%$$.+.!#;#+%=&#@,;$..%#;++=$,.#!#+..+#,,%$&&+;;,,$-+#;+-=$$&$%++,,$$%%+%.%$,*$%%+$%;=$,*%", +".%;!.$$%#,+=$$%,!#@#;;+.%*=+#.,,.+%+.$+++%%,%.#>.;+$;$&++%'$,++.+%+,,=$'+++,*%,;+*;,%$,%+&*%++&-;%$$", +"%++;+.%+$$%%$$%,+#.%.@.%;$++*>#+,;.&$@.!#='&@+@@..*$,%%+%$%$%#;+,;#%%$;+,+%$%$%++&%&;;%;$&$*&;;%;,$%", +"%+=$#+,%&''++,.+$#.!+%%+;*%.!++*%+.',.%;!;.#.;#@+%%$;..%-%%*,;+,,%$$$.!+'$%%%$;+%%+.+++*+;$%;%,%;,;$", +"*$$,,;;$$$$++#.$+%.@%;..%+.;#+&,.+*.;..$&,!.;+;..*%;,%%+%*'*&%!.'*$%$$'..++%,;$%%++;&+,%%%$%,,..++&&", +"'&$,,+*%+%%..+;#.+#$%+.+.,+;%$.%+*$++,.%++#@#$'$.!%%;$-%%+$$-%+$,.+;&)'%;.!#,%%%++,%$%';,$%%.+%,#+&+", +"'%,%*$%%%,,..;;..,+.+,%+,+,,*,#+&%%#.#.!.;@!%%...%.&=$+&&%,%#%*,;*;*=&'$;+.##,,+.$+,*-'%%+,;.;$'%%,,", +".+,$--&$,+$&..#+%,%,$!+%++,+.%+%%$+%!#!##+++*$,@!#%-$+'%.$-+%%%&%$-**=&$%%.;%+#.;$%.$;+%,%,;;%;*$%;=", +",;&===*;%*,=,#+##%).*%>#%+$#,*=.+%$+.$#.$+@%;*%+#..#+=+@#&$-*,..'-*;-$$;$=';,++#@%%$+@+%%%$$,+&&+;$#", +";'=$+$;;)%=,%+..%+#,,%&$+#,.;$$.,+#;#+,$%##;;;%&+;#$&+.$;%%-&;.;&;-;$$=$*-$,.,;;.#!.,.,$%,,,%&*;%;..", +"*)=)&%.#'-&,+%%#;;+>.$,+.*%#+!,,&,@;,,,.@=%&';,+.,;+.>.;&%=+*,+&,%;*;%%'-$++%.%,.%%+&$;%%,%.%=.=*%%*", +".&&=-%%+.$,#,=;%#,@.+,%>,+=-++@@#%$.++#,--;.=*+,,>.+@.##$%%$$$&*=..%$*%-;*>,%$%#>,$,%%*%*.#*%++$;+,,", +"@@$'.;'..;@.+$%)&!!,.!>+%@%-*%@>#.+&&+.+$%,++$$#++%%.&$@.#,*%*&'%%&$;,*%%,&%;%,#..;$$%';+.+,++.%.;+@", +"#+$%;,$.+@,+.%-%%-%>#+.#+$%...%,!>>;$$$.%$+#+*++&*,.$&$+#+.%++$%,=$;$&'+.%%&-+++;%;;$%+%+;.#.+@!!..>", +"#,++;$%;++#.+++%&*=#.+;%>@+,...++$>@#&%*%;.$=$##=;,$;;;..-*!;*.+%=*%;*%%=&$+$++,-%;+++++++++++#@@@>@", +"#+*,$%;,++..@#.,+@+.#.+%#+!.,%#>%,,+>#.%$!#%=%$$#+%#$,+$$%,.++.%%,'*%;,$=-$+@,%*$+%.#+%,.++%;.,#@@@>", +"..,%$,$;..#,@.$;%.##.#!#;;++#.+%!.,%,.@##>%,>%$,+,+*'%$)&,+,+,+*%,,$,+,*-&++$%%*%#@#%$;+.%,!.+;+!@+>", +",;,%.%.+++.#;%+.,+#.,#+;#%.@,+#.+,#!,+.>#..,,++++.,,$$$%%%';+$%,$!,$,;;,..,&)%%+#!+..,++%%++#+#@+,##", +".%;+,#+$%.;,....+.++.+,$$.#>.$+@&+#;.@@.%!@.#+@!,%;=-;##%=$%,.$%%+;%%%$+.%&%%%,.,%++..+++;%;;.+#.+%.", +"..+;%,%,,%+,.,##.+%%+@,'%#.++,,,%++.>++.>#+#>>.%,%-$$&+%.,#;;&$$,*$+%%.#*='$,,+.;,+,##...$%++%.,++%,", +"..+%+&$.+*;,++.+;+*%+#+++...+;.%+##@.%@>#.!>#&%+=$,!.;$$$#.;%'-'&*+++.$=*%;,++;;;.+;++,+++@@%++++..$", +",,*,+'+,;;#.$%#%+%,.%&+#.$+@!%;,+##++#@!!#@@&%@..+...#%%,,;=-%$=%%@+.;==;=+#+%+*$#.%+%+@.++!,%,;;%..", +"#;.+$#%$$#;.%;+..+,.%,%+,..@++..*+#,+.#>@#.+++!.+.+$=%%$#,$--$=$%+#,=%%,%;$;%.+.,,+!++#..++%;.%%$..,", +",;.*;.+&.#%*.>.,.#$'+.%%,,%##++;+,#*.@>#%%#@+%$@@...+'=;%$,+,%$*&%&=-;+#+%==..;,#,#.###@+$%,,$$;+@#.", +"#$$%,%;,%+=$+#.!...+%,%++%;&+#$%.%#@,;+#.,#,+.+%;,..;+.$%=$,##,,'=&$$%%++$$%,,;$;.,##.+#;++;#+;+.>..", +"#..'%;%+;%*%;+,!@..#,;.%%,+&,*$.,%@>!+;,###&;;#.;%%;+@++*$%%$+@,*&$$*&;%%.#,.$$,++#@@#.,+%.;%#+!#.,!", +"%*#%$$;+*.+,$%%@.+@..+,$%++$&%#+,.#,#@#.&$$++,+.,,$$;+.,.;%=$$$,+%+$,&$%,,.+=$%.,;##!#.#$%.+%,+.@.,#", +"%*$%'*&++.;.+;.#+;#>++,+*%%%++,,.#;=@@.+,;$&;%;%$-,%+.+$.;&;%+,$,+,+%%**$+*$+,%+%,$%.%;@+%##;;;;#+##", +";,&$-%,;,++%..#+;++$+#,++,=%%+++!#++..+;;,%,%=&+..%'.+,'*;;;#+;&$#$$,%*,$=%,+,,%%$%%%+%!@++#;++&+.,.", +"=.&&,%$#.%;%!@,+,%,,+++.+.*%%;$.%+#!+&,;,;+,%+$=,$%,;+%&$$+#%%++%;$&&%%%'%,,+++%,%;*.+%%>..+,+##+%+;", +"%&*,,%.$,;&#!.%%%%++,.%,;+,%.#.$;++;%;++#,$=.++,$=%#.&%,-;+$+.,++$*$%&=$,,;#,.,&;&.,+%++;%.+%,+!#.;%", +"%+$+;,,#.;.@,%.+,+;,#++,$$+++.++,+#%%$%##.,++*$+;.;%;%$,$%=%#.@,,$*%*=%;%%+%$.%&'+%$#.=,++&;$>#*..+,", +",!;#;$,#,#++,%.%.,.+;.$%.,++%%$+,#%,+,$,.%.%$+.$,;$+%$;.,*$#+%.!..,%=*$&$;;%$%$+,$$%%%'++,+,.@#+.,$.", +"!$'#>+&,+#,+$*+.;+#,%%;,.!+,+$$%+.+++*+..+,+%,#+.=-%@#..%$+;%+;,%.+,$$'$*+%%;,%$$%%+;;,&'%#.##...$#.", +"$%.!.%$%%+#*;;&,#++%,,+,;#++$$%++,%,%%++!.+@.;*#,*;%;###+@!;+$$;,$.+.%$$%.%.$*%&&,.,,;+;$&$+.+..$+#+", +"++>+=#%;+,++,++.%..+$;.+,+$%%+,.;&,#+,*.++##@;%,%-*%%+@%+#,...,$;,'$++,;#&,,&'=&'*+++.%$-=$$%!..#,%%", +"@@$;#.*%..,+,#@..+,$%@,,.&%$;,%%$%,+%+%+&,@.##.+**%$%#,.++$+#+%%+$'%&.,;#+$&$&&%-;,$.!+=*&=*.#;#.,%,", +"+'..,$%;!%$##@+#..$%.%;,,%$%%;==..$%%,+,++$;@.&+>#%*..+%.;+#,+.$$,;*$$%+;+%%$,%'%;%*%.;%+$=,%*$++,+>", +"&=..%$$*...+,.;.#%.#+.@$%%.,$-&,,,%;*#%;#$,+;#+#@.%@@%'+$+.%.#.=&,%%%$';%&%$+.%&.%**+=$+#%.%%';%*$>.", +"&!.+%$+#,+,#.;.,%,.,.>!$$;;%;%,,$*%;%+#;;+#%#>!+,.!@.;=,.;$@.;+.$''%%=.;=;+%*,..;=&%=$+,&,+%,+;%$;,.", +",!+!+%!,%%+#,%+;+.+;.%%;$$=+%+;,;'$,;++++..>>#%%####+-..+,+...+%+;$&&,*&,%,;%%%*+,%*,%%%%=-.+;##%,$$", +"$%.,%+%$###.+*+#.,%++'#%$%&$%*%$;%+.+,##++!.+#!!.%#+%@@;++.++%,;+.%*%-$%%;%.@%*$%.,+;%++'%&;&.>%@++%", +".=*$#,*+%$%+..+;;%++;;+!;$'%+'=%;;.##+.++.#+#.#.,..-%##!@.%%$%;..;,+%$&%&%++.;+,+%%+;%;.++#$$@;#$.#%", +"#;,*,+!%%,%.#;%$%$&;,%%,.$%.%-$;;!@$%%..+.##!+,$.$#@!#+#@.%+%$,++,,;;,+%*&%;+%%$=#+&$+**+#,+@..#.'$,", +"-,%+..$=%%#.-=*%++$;%&%%&$.;%'%%.+%;.&,+#!!#+*;$*&..@>#@++;+;%%++..%;+!+%$;.;+'-%$+%,,=%.$+!+#@+%$>*", +"'&.+#.;$&$;%&&.$=&$,$%=*+.&&,.+.+;,.;;%.#.++,+''&.>@%+.;%%#+$+*$++$;*.+%%%+,+%*&$&,+;',@=%+$#.%*..&'", +",,#;%%.#.$&%&+.%=','*$++.%%%.+.+%;++%,,#+,*.;%..@@!+..$&+%$;.,++%,%%%,#,+.%+%$&,$*.+&.+$+%$.@&&+#%-=", +"...;%*+%+.,%%$&$*%$==,#$&$$+,++,%;%++;%+%-$++.+!@%$;+%,.&=-;++@..$$,%+!!%%.%$;$;;==%#.$$$$##;++#+$=$", +",.;+%$,&&.#%&'-&%,=-,+%&&,+#+;;+,.+#+++,'%.;.##+$#.%;++.-*$%%;+.+$+;..++...,;*+%;%%.!$;+,++%+.+%;.;,", +"$#++$%%$%+*&+,%=%==+%'=%%+.,.&%%+%#.%%,%%%.;++%%;&...#%%%*=%+$+,+....+,+.;!++;$$%,.+,+$,++#+#>+.$++.", +",%$&&+;;,,$-+#;+-=$$&$%++,,$$%%+%.%$,*$%%+$%;=$,*%%+.+%+*+&;$%$$.+.!#;#+%=&#@,;$..%#;++=$,.#!#+..+#,", +"+$;$&++%'$,++.+%+,,=$'+++,*%,;+*;,%$,%+&*%++&-;%$$.%;!.$$%#,+=$$%,!#@#;;+.%*=+#.,,.+%+.$+++%%,%.#>.;", +"*$,%%+%$%$%#;+,;#%%$;+,+%$%$%++&%&;;%;$&$*&;;%;,$%%++;+.%+$$%%$$%,+#.%.@.%;$++*>#+,;.&$@.!#='&@+@@..", +"%$;..%-%%*,;+,,%$$$.!+'$%%%$;+%%+.+++*+;$%;%,%;,;$%+=$#+,%&''++,.+$#.!+%%+;*%.!++*%+.',.%;!;.#.;#@+%", +"%;,%%+%*'*&%!.'*$%$$'..++%,;$%%++;&+,%%%$%,,..++&&*$$,,;;$$$$++#.$+%.@%;..%+.;#+&,.+*.;..$&,!.;+;..*", +"%%;$-%%+$$-%+$,.+;&)'%;.!#,%%%++,%$%';,$%%.+%,#+&+'&$,,+*%+%%..+;#.+#$%+.+.,+;%$.%+*$++,.%++#@#$'$.!", +".&=$+&&%,%#%*,;*;*=&'$;+.##,,+.$+,*-'%%+,;.;$'%%,,'%,%*$%%%,,..;;..,+.+,%+,+,,*,#+&%%#.#.!.;@!%%...%", +"%-$+'%.$-+%%%&%$-**=&$%%.;%+#.;$%.$;+%,%,;;%;*$%;=.+,$--&$,+$&..#+%,%,$!+%++,+.%+%%$+%!#!##+++*$,@!#", +".#+=+@#&$-*,..'-*;-$$;$=';,++#@%%$+@+%%%$$,+&&+;$#,;&===*;%*,=,#+##%).*%>#%+$#,*=.+%$+.$#.$+@%;*%+#.", +"#$&+.$;%%-&;.;&;-;$$=$*-$,.,;;.#!.,.,$%,,,%&*;%;..;'=$+$;;)%=,%+..%+#,,%&$+#,.;$$.,+#;#+,$%##;;;%&+;", +";+.>.;&%=+*,+&,%;*;%%'-$++%.%,.%%+&$;%%,%.%=.=*%%**)=)&%.#'-&,+%%#;;+>.$,+.*%#+!,,&,@;,,,.@=%&';,+.,"}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/white_1.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/white_1.xbm new file mode 100644 index 0000000..cb220eb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/white_1.xbm @@ -0,0 +1,60 @@ +#define white_1_width 56 +#define white_1_height 56 +static unsigned char white_1_bits[] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x05, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x05, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x01, +0x80, 0x00, 0x00, 0x00, 0x80, 0xaa, 0x00, +0x00, 0x01, 0x00, 0x00, 0x40, 0x55, 0x00, +0x00, 0x02, 0x00, 0x00, 0xa8, 0x2a, 0x00, +0x00, 0x14, 0x00, 0x00, 0x54, 0x15, 0x00, +0x00, 0x28, 0x00, 0x80, 0xaa, 0x0a, 0x00, +0x00, 0x50, 0x05, 0x54, 0x55, 0x05, 0x00, +0x00, 0xa0, 0xaa, 0xaa, 0xaa, 0x02, 0x00, +0x00, 0x40, 0x55, 0x55, 0x55, 0x01, 0x00, +0x00, 0x00, 0xaa, 0xaa, 0xaa, 0x00, 0x00, +0x00, 0x00, 0x50, 0x55, 0x15, 0x00, 0x00, +0x00, 0x00, 0x80, 0xaa, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/white_2.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/white_2.xbm new file mode 100644 index 0000000..90fc835 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/white_2.xbm @@ -0,0 +1,60 @@ +#define white_2_width 56 +#define white_2_height 56 +static unsigned char white_2_bits[] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, +0x00, 0x00, 0x04, 0x90, 0x04, 0x00, 0x00, +0x00, 0x20, 0x01, 0x40, 0x12, 0x00, 0x00, +0x00, 0x48, 0xfc, 0x0f, 0x09, 0x00, 0x00, +0x00, 0x10, 0x07, 0x30, 0x04, 0x00, 0x00, +0x40, 0xc2, 0x00, 0xc0, 0x10, 0x00, 0x00, +0x80, 0x24, 0x00, 0x00, 0x09, 0x00, 0x00, +0x20, 0x11, 0x00, 0x00, 0x42, 0x00, 0x00, +0x40, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, +0x90, 0x04, 0x00, 0x00, 0x80, 0x00, 0x00, +0x20, 0x02, 0x00, 0x00, 0x40, 0x04, 0x00, +0x48, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x01, 0x00, 0x00, 0x80, 0x08, 0x00, +0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x84, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, +0xa0, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x00, +0x00, 0x01, 0x00, 0x54, 0x01, 0x01, 0x00, +0x44, 0x01, 0x00, 0xaa, 0x00, 0x02, 0x00, +0x00, 0x02, 0x40, 0x55, 0x80, 0x04, 0x00, +0x88, 0x02, 0xa0, 0x0a, 0x00, 0x01, 0x00, +0x40, 0x04, 0x50, 0x05, 0x40, 0x02, 0x00, +0x00, 0x09, 0xa0, 0x00, 0x80, 0x00, 0x00, +0x80, 0x00, 0x50, 0x00, 0x20, 0x01, 0x00, +0x00, 0x04, 0x08, 0x00, 0x48, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x90, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x24, 0x00, 0x80, 0x04, 0x00, 0x00, +0x00, 0x92, 0x00, 0x20, 0x01, 0x00, 0x00, +0x00, 0x48, 0x02, 0x08, 0x00, 0x00, 0x00, +0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/white_3.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/white_3.xbm new file mode 100644 index 0000000..0ff9cd0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/white_3.xbm @@ -0,0 +1,60 @@ +#define white_3_width 56 +#define white_3_height 56 +static unsigned char white_3_bits[] = { +0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, +0x00, 0x40, 0x40, 0x81, 0x00, 0x00, 0x00, +0x00, 0x18, 0x40, 0x09, 0x00, 0x00, 0x00, +0x00, 0x06, 0x52, 0x09, 0x00, 0x00, 0x00, +0x00, 0x91, 0x52, 0x05, 0x00, 0x00, 0x00, +0x80, 0x94, 0x50, 0x05, 0x00, 0x00, 0x00, +0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x01, 0x50, 0x05, 0x60, 0x00, 0x00, +0x08, 0x00, 0xaa, 0x2a, 0x00, 0x00, 0x00, +0x08, 0x40, 0x55, 0x55, 0x80, 0x01, 0x00, +0x04, 0xa0, 0xaa, 0xa0, 0x00, 0x00, 0x00, +0x04, 0x50, 0x55, 0x55, 0x05, 0x03, 0x00, +0x02, 0xa8, 0x0a, 0xa0, 0x0a, 0x00, 0x00, +0x02, 0x54, 0x55, 0x55, 0x15, 0x00, 0x00, +0x00, 0xa8, 0x00, 0x80, 0x1a, 0x03, 0x00, +0x00, 0x54, 0x55, 0x55, 0x35, 0x00, 0x00, +0x00, 0x0a, 0x00, 0x80, 0x2a, 0x06, 0x00, +0x0d, 0x45, 0x55, 0x55, 0x55, 0x00, 0x00, +0x31, 0x0a, 0x00, 0x00, 0x6a, 0x00, 0x00, +0x00, 0x05, 0x55, 0x55, 0x55, 0x07, 0x00, +0x3e, 0x02, 0x00, 0x00, 0x6a, 0x00, 0x00, +0x00, 0x05, 0x55, 0x55, 0x55, 0x1f, 0x00, +0x3e, 0x0a, 0x00, 0x00, 0x68, 0x00, 0x00, +0x00, 0x15, 0x54, 0x55, 0x55, 0x1f, 0x00, +0x38, 0x0a, 0x00, 0x00, 0x69, 0x00, 0x00, +0x01, 0x15, 0x54, 0x95, 0x56, 0x03, 0x00, +0x01, 0x2a, 0x00, 0x50, 0x69, 0x0c, 0x00, +0x18, 0x54, 0x50, 0xa9, 0x34, 0x00, 0x00, +0x00, 0x2a, 0x00, 0x55, 0x2b, 0x00, 0x00, +0x30, 0x54, 0x90, 0x2a, 0x15, 0x00, 0x00, +0x02, 0xa8, 0x40, 0xb5, 0x1a, 0x00, 0x00, +0x00, 0x50, 0xa1, 0x52, 0x0d, 0x00, 0x00, +0x30, 0xa0, 0x50, 0xab, 0x06, 0x00, 0x00, +0x00, 0x50, 0x29, 0x55, 0x03, 0x00, 0x00, +0x60, 0xa0, 0xb2, 0xaa, 0x01, 0x00, 0x00, +0x00, 0xc0, 0x55, 0xd5, 0x00, 0x00, 0x00, +0x80, 0x01, 0xab, 0x3a, 0x20, 0x00, 0x00, +0x00, 0x00, 0xfc, 0x0f, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0xa8, 0x42, 0x0a, 0x00, 0x00, +0x00, 0x00, 0xa8, 0x52, 0x02, 0x00, 0x00, +0x00, 0x00, 0xa4, 0x12, 0x00, 0x00, 0x00, +0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/white_4.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/white_4.xbm new file mode 100644 index 0000000..ce65928 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/white_4.xbm @@ -0,0 +1,60 @@ +#define white_4_width 56 +#define white_4_height 56 +static unsigned char white_4_bits[] = { +0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, +0x00, 0x80, 0xbf, 0x7e, 0x00, 0x00, 0x00, +0x00, 0xe0, 0xb6, 0xf6, 0x01, 0x00, 0x00, +0x00, 0xb8, 0xad, 0xb6, 0x07, 0x00, 0x00, +0x00, 0x6e, 0xad, 0xda, 0x1e, 0x00, 0x00, +0x00, 0x6b, 0xab, 0x6a, 0x3b, 0x00, 0x00, +0x80, 0xdb, 0xfe, 0xbf, 0x6d, 0x00, 0x00, +0xc0, 0xb6, 0x03, 0xf0, 0xf6, 0x00, 0x00, +0xe0, 0xee, 0xa8, 0xca, 0x9b, 0x01, 0x00, +0xb0, 0x3d, 0x55, 0x15, 0xef, 0x03, 0x00, +0x70, 0x9b, 0xaa, 0xaa, 0x76, 0x02, 0x00, +0xd8, 0x4e, 0x55, 0x5f, 0xbd, 0x07, 0x00, +0xb8, 0xa7, 0xaa, 0xaa, 0xda, 0x04, 0x00, +0x6c, 0x53, 0xf5, 0x5f, 0x75, 0x0f, 0x00, +0xdc, 0xa9, 0xaa, 0xaa, 0xaa, 0x0b, 0x00, +0xb6, 0x55, 0xff, 0x7f, 0xe5, 0x1c, 0x00, +0xee, 0xaa, 0xaa, 0xaa, 0x4a, 0x17, 0x00, +0xde, 0xf4, 0xff, 0x7f, 0xd5, 0x19, 0x00, +0x72, 0xba, 0xaa, 0xaa, 0xaa, 0x1e, 0x00, +0x4e, 0xf5, 0xff, 0xff, 0x95, 0x17, 0x00, +0x7f, 0xfa, 0xaa, 0xaa, 0xaa, 0x38, 0x00, +0x41, 0xfd, 0xff, 0xff, 0x95, 0x3f, 0x00, +0x7f, 0xfa, 0xaa, 0xaa, 0xaa, 0x20, 0x00, +0x41, 0xf5, 0xff, 0xff, 0x97, 0x3f, 0x00, +0x7f, 0xea, 0xab, 0xaa, 0xaa, 0x20, 0x00, +0x47, 0xf5, 0xff, 0xff, 0x94, 0x3f, 0x00, +0x7a, 0xea, 0xab, 0x2a, 0xa8, 0x1c, 0x00, +0x5e, 0xd5, 0xff, 0x0f, 0x94, 0x13, 0x00, +0xe6, 0xaa, 0xaf, 0x02, 0xca, 0x1e, 0x00, +0xba, 0xd4, 0xff, 0x00, 0xd4, 0x1d, 0x00, +0xce, 0xa9, 0x2f, 0x80, 0x6a, 0x1b, 0x00, +0x74, 0x55, 0x1f, 0x40, 0xe5, 0x0e, 0x00, +0xbc, 0xab, 0x0e, 0xa8, 0xb2, 0x0d, 0x00, +0xc8, 0x56, 0x0f, 0x54, 0x79, 0x07, 0x00, +0x78, 0xaf, 0x86, 0xaa, 0xdc, 0x06, 0x00, +0x90, 0x5b, 0x45, 0x55, 0xb6, 0x03, 0x00, +0xf0, 0x3d, 0xaa, 0x2a, 0x6f, 0x03, 0x00, +0x60, 0xf6, 0x54, 0xc5, 0xdd, 0x01, 0x00, +0xc0, 0xdb, 0x03, 0x70, 0xdb, 0x00, 0x00, +0x80, 0x6d, 0xff, 0xdf, 0x76, 0x00, 0x00, +0x00, 0xb7, 0x55, 0xb5, 0x35, 0x00, 0x00, +0x00, 0xde, 0x56, 0xad, 0x1d, 0x00, 0x00, +0x00, 0x78, 0x5b, 0x6d, 0x07, 0x00, 0x00, +0x00, 0xe0, 0x5b, 0xdb, 0x01, 0x00, 0x00, +0x00, 0x80, 0x5f, 0x7f, 0x00, 0x00, 0x00, +0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_1.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_1.xbm new file mode 100644 index 0000000..6943d4d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_1.xbm @@ -0,0 +1,60 @@ +#define whiteking_1_width 56 +#define whiteking_1_height 56 +static unsigned char whiteking_1_bits[] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x05, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x0a, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x0a, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x15, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2a, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x55, +0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2a, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x55, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x2a, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x55, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xaa, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x55, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xaa, +0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x55, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0xaa, +0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x55, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xaa, +0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, +0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0xaa, +0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, +0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, +0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, +0x80, 0x00, 0x00, 0x00, 0x80, 0xaa, 0x2a, +0x00, 0x01, 0x00, 0x00, 0x40, 0x55, 0x55, +0x00, 0x02, 0x00, 0x00, 0xa8, 0xaa, 0x2a, +0x00, 0x14, 0x00, 0x00, 0x54, 0x55, 0x15, +0x00, 0x28, 0x00, 0x80, 0xaa, 0xaa, 0x2a, +0x00, 0x50, 0x05, 0x54, 0x55, 0x55, 0x15, +0x00, 0xa0, 0xaa, 0xaa, 0xaa, 0xaa, 0x0a, +0x00, 0x40, 0x55, 0x55, 0x55, 0x55, 0x05, +0x00, 0x80, 0xaa, 0xaa, 0xaa, 0xaa, 0x02, +0x00, 0x00, 0x55, 0x55, 0x55, 0x55, 0x01, +0x00, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0x00, +0x00, 0x00, 0x54, 0x55, 0x55, 0x55, 0x00, +0x00, 0x00, 0xa8, 0xaa, 0xaa, 0x2a, 0x00, +0x00, 0x00, 0x40, 0x55, 0x55, 0x15, 0x00, +0x00, 0x00, 0x00, 0xaa, 0xaa, 0x02, 0x00, +0x00, 0x00, 0x00, 0x50, 0x15, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_2.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_2.xbm new file mode 100644 index 0000000..bea21c4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_2.xbm @@ -0,0 +1,60 @@ +#define whiteking_2_width 56 +#define whiteking_2_height 56 +static unsigned char whiteking_2_bits[] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, +0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, +0x00, 0x00, 0x04, 0x90, 0x04, 0x00, 0x00, +0x00, 0x20, 0x01, 0x40, 0x12, 0x00, 0x00, +0x00, 0x48, 0xfc, 0x0f, 0x09, 0x00, 0x00, +0x00, 0x10, 0x07, 0x30, 0x04, 0x00, 0x00, +0x40, 0xc2, 0x00, 0xc0, 0x10, 0x00, 0x00, +0x80, 0x24, 0x00, 0x00, 0x09, 0x00, 0x00, +0x20, 0x11, 0x00, 0x00, 0x42, 0x00, 0x00, +0x40, 0x08, 0x80, 0x00, 0x20, 0x00, 0x00, +0x90, 0x04, 0xc4, 0x10, 0x80, 0x00, 0x00, +0x20, 0x02, 0x06, 0x18, 0x40, 0x04, 0x00, +0x48, 0x42, 0x00, 0x00, 0x01, 0x00, 0x00, +0x10, 0x61, 0x00, 0x88, 0x81, 0x08, 0x00, +0x20, 0x01, 0x10, 0x10, 0x00, 0x00, 0x00, +0x80, 0x00, 0x20, 0x08, 0x00, 0x01, 0x00, +0x80, 0x40, 0x40, 0x10, 0x04, 0x08, 0x00, +0x80, 0x80, 0x00, 0x20, 0x02, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x84, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, +0xa0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, +0x00, 0x01, 0x00, 0x80, 0x00, 0x01, 0x00, +0x44, 0x01, 0x00, 0x40, 0x01, 0x02, 0x00, +0x00, 0x02, 0xaa, 0xaa, 0x80, 0x04, 0x00, +0x88, 0x02, 0x54, 0x55, 0x00, 0x01, 0x00, +0x40, 0x04, 0xaa, 0x2a, 0x40, 0x02, 0x00, +0x00, 0x09, 0x54, 0x15, 0x80, 0x00, 0x00, +0x80, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, +0x00, 0x04, 0x00, 0x00, 0x48, 0x00, 0x00, +0x00, 0x02, 0x00, 0x00, 0x90, 0x00, 0x00, +0x00, 0x08, 0x00, 0x00, 0x02, 0x00, 0x00, +0x00, 0x24, 0x00, 0x80, 0x04, 0x00, 0x00, +0x00, 0x92, 0x00, 0x20, 0x01, 0x00, 0x00, +0x00, 0x48, 0x02, 0x08, 0x00, 0x00, 0x00, +0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_3.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_3.xbm new file mode 100644 index 0000000..8b61515 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_3.xbm @@ -0,0 +1,60 @@ +#define whiteking_3_width 56 +#define whiteking_3_height 56 +static unsigned char whiteking_3_bits[] = { +0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, +0x00, 0x40, 0x40, 0x81, 0x00, 0x00, 0x00, +0x00, 0x18, 0x40, 0x09, 0x00, 0x00, 0x00, +0x00, 0x06, 0x52, 0x09, 0x00, 0x00, 0x00, +0x00, 0x91, 0x52, 0x05, 0x00, 0x00, 0x00, +0x80, 0x94, 0x50, 0x05, 0x00, 0x00, 0x00, +0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x10, 0x01, 0x50, 0x05, 0x60, 0x00, 0x00, +0x08, 0x00, 0xaa, 0x2a, 0x00, 0x00, 0x00, +0x08, 0x40, 0x55, 0x55, 0x80, 0x01, 0x00, +0x04, 0xa0, 0x0a, 0xaa, 0x00, 0x00, 0x00, +0x04, 0x50, 0x10, 0x41, 0x05, 0x03, 0x00, +0x02, 0xa8, 0x08, 0xa2, 0x0a, 0x00, 0x00, +0x02, 0x04, 0x50, 0x01, 0x14, 0x00, 0x00, +0x00, 0x88, 0xaa, 0x2a, 0x1a, 0x03, 0x00, +0x00, 0x04, 0x59, 0x11, 0x34, 0x00, 0x00, +0x01, 0xaa, 0xa8, 0xa8, 0x2a, 0x06, 0x00, +0x0d, 0x55, 0x51, 0x54, 0x55, 0x00, 0x00, +0x31, 0xa2, 0x28, 0x2a, 0x6a, 0x00, 0x00, +0x00, 0x45, 0x54, 0x15, 0x55, 0x07, 0x00, +0x3e, 0xa2, 0xa8, 0xaa, 0x6b, 0x00, 0x00, +0x00, 0x45, 0x55, 0x55, 0x55, 0x1f, 0x00, +0x3e, 0x8a, 0xaa, 0xaa, 0x6a, 0x00, 0x00, +0x00, 0x45, 0x55, 0xd5, 0x55, 0x1f, 0x00, +0x38, 0x8a, 0xaa, 0xaa, 0x6a, 0x00, 0x00, +0x01, 0x15, 0x55, 0x55, 0x55, 0x03, 0x00, +0x01, 0x2a, 0xaa, 0xea, 0x6a, 0x0c, 0x00, +0x19, 0x14, 0x54, 0x55, 0x35, 0x00, 0x00, +0x00, 0x2a, 0xaa, 0xaa, 0x2a, 0x00, 0x00, +0x30, 0x54, 0x54, 0x55, 0x15, 0x00, 0x00, +0x02, 0xa8, 0xaa, 0xaa, 0x1a, 0x00, 0x00, +0x00, 0x50, 0x55, 0xd5, 0x0d, 0x00, 0x00, +0x30, 0xa0, 0xaa, 0xea, 0x06, 0x00, 0x00, +0x00, 0x50, 0x55, 0x55, 0x03, 0x00, 0x00, +0x60, 0xa0, 0xaa, 0xaa, 0x01, 0x00, 0x00, +0x00, 0xc0, 0x55, 0xd5, 0x00, 0x00, 0x00, +0x80, 0x01, 0xab, 0x3a, 0x20, 0x00, 0x00, +0x00, 0x00, 0xfc, 0x0f, 0x20, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, +0x00, 0x00, 0xa8, 0x42, 0x0a, 0x00, 0x00, +0x00, 0x00, 0xa8, 0x52, 0x02, 0x00, 0x00, +0x00, 0x00, 0xa4, 0x12, 0x00, 0x00, 0x00, +0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_4.xbm b/third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_4.xbm new file mode 100644 index 0000000..b9816a0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/whiteking_4.xbm @@ -0,0 +1,60 @@ +#define whiteking_4_width 56 +#define whiteking_4_height 56 +static unsigned char whiteking_4_bits[] = { +0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, +0x00, 0x80, 0xbf, 0x7e, 0x00, 0x00, 0x00, +0x00, 0xe0, 0xb6, 0xf6, 0x01, 0x00, 0x00, +0x00, 0xb8, 0xad, 0xb6, 0x07, 0x00, 0x00, +0x00, 0x6e, 0xad, 0xda, 0x1e, 0x00, 0x00, +0x00, 0x6b, 0xab, 0x6a, 0x3b, 0x00, 0x00, +0x80, 0xdb, 0xfe, 0xbf, 0x6d, 0x00, 0x00, +0xc0, 0xb6, 0x03, 0xf0, 0xf6, 0x00, 0x00, +0xe0, 0xee, 0xa8, 0xca, 0x9b, 0x01, 0x00, +0xb0, 0x3d, 0x55, 0x15, 0xef, 0x03, 0x00, +0x70, 0x9b, 0xaa, 0xaa, 0x76, 0x02, 0x00, +0xd8, 0x4e, 0xf5, 0x55, 0xbd, 0x07, 0x00, +0xb8, 0xa7, 0x6f, 0xbe, 0xda, 0x04, 0x00, +0x6c, 0x53, 0x33, 0x4d, 0x75, 0x0f, 0x00, +0xdc, 0xf9, 0xa9, 0xe6, 0xab, 0x0b, 0x00, +0xb6, 0x35, 0x55, 0xd5, 0xe4, 0x1c, 0x00, +0xee, 0x9a, 0xa6, 0x66, 0x4a, 0x17, 0x00, +0xde, 0x54, 0x47, 0x47, 0xd5, 0x19, 0x00, +0x72, 0xaa, 0x8e, 0xa3, 0xaa, 0x1e, 0x00, +0x4e, 0x1d, 0x97, 0xc5, 0x91, 0x17, 0x00, +0x7f, 0x3a, 0xab, 0xca, 0xa8, 0x38, 0x00, +0x41, 0x5d, 0x57, 0x55, 0x90, 0x3f, 0x00, +0x7f, 0xba, 0xaa, 0xaa, 0xa8, 0x20, 0x00, +0x41, 0x75, 0x55, 0x55, 0x94, 0x3f, 0x00, +0x7f, 0xba, 0xaa, 0x2a, 0xa8, 0x20, 0x00, +0x47, 0x75, 0x55, 0x55, 0x94, 0x3f, 0x00, +0x7a, 0xea, 0xaa, 0x2a, 0xaa, 0x1c, 0x00, +0x5e, 0xd5, 0x55, 0x15, 0x94, 0x13, 0x00, +0xe6, 0xea, 0xab, 0x2a, 0xca, 0x1e, 0x00, +0xba, 0xd4, 0x55, 0x15, 0xd4, 0x1d, 0x00, +0xce, 0xa9, 0x01, 0x00, 0x6a, 0x1b, 0x00, +0x74, 0x55, 0x01, 0x00, 0xe5, 0x0e, 0x00, +0xbc, 0xab, 0x00, 0x00, 0xb2, 0x0d, 0x00, +0xc8, 0x56, 0x01, 0x00, 0x79, 0x07, 0x00, +0x78, 0xaf, 0xaa, 0xaa, 0xdc, 0x06, 0x00, +0x90, 0x5b, 0x55, 0x55, 0xb6, 0x03, 0x00, +0xf0, 0x3d, 0xaa, 0x2a, 0x6f, 0x03, 0x00, +0x60, 0xf6, 0x54, 0xc5, 0xdd, 0x01, 0x00, +0xc0, 0xdb, 0x03, 0x70, 0xdb, 0x00, 0x00, +0x80, 0x6d, 0xff, 0xdf, 0x76, 0x00, 0x00, +0x00, 0xb7, 0x55, 0xb5, 0x35, 0x00, 0x00, +0x00, 0xde, 0x56, 0xad, 0x1d, 0x00, 0x00, +0x00, 0x78, 0x5b, 0x6d, 0x07, 0x00, 0x00, +0x00, 0xe0, 0x5b, 0xdb, 0x01, 0x00, 0x00, +0x00, 0x80, 0x5f, 0x7f, 0x00, 0x00, 0x00, +0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/yellow.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/yellow.xpm new file mode 100644 index 0000000..d715f3a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/yellow.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * yellow_xpm[] = { +"32 32 32 1", +" c #000100", +". c #2A4602", +"+ c #435B00", +"@ c #818600", +"# c #969900", +"$ c #A3A400", +"% c #B0AF00", +"& c #B4B425", +"* c #BAB800", +"= c #BABE02", +"- c #B4B73F", +"; c #C0C300", +"> c #C7C905", +", c #C6C821", +"' c #CBCC00", +") c #CAC835", +"! c #C9C943", +"~ c #D1D201", +"{ c #C7C94E", +"] c #CACB5D", +"^ c #D8D700", +"/ c #D9DB3C", +"( c #D5D67B", +"_ c #DADB6D", +": c #DFDE57", +"< c #DFDF64", +"[ c #D9DB8A", +"} c #EAEB76", +"| c #E7E7A1", +"1 c #EBEC82", +"2 c #EEED91", +"3 c #EEEF9C", +" +@$;**%**==;=*%*=;;$@+ ", +" .#'/<2||||||||||||||[_)*#. ", +" +>^}32233||3|333||||||||(*=+ ", +" .>'2222222233322223||||||||,'. ", +" #,1111111112222212122[[[[[[[^# ", +"+*:_111}}}}1_1(111}1111([[[[[_'+", +"@,___}}}}}}_____1}}}}}_(((((((,@", +"$/<<:<<<<<__](]]<}:}<}__](](](!$", +"*:!>'''/,/'),,'>>,)*&&&%", +"*>';*&$&*;''',>;;>>'****,*****%%", +"*'~'**%%;>~'>,;***''****;;******", +"*>'>;***>'^****;'*>>;***;,**%*%%", +"%*;*;*''^'~>*%%*****,*;*'>,*%%$%", +"%****''^~^~;*%%%%%*****''''>=%%$", +"%**>;'^^^^^'*%$$$$%%%**>''''*%%%", +"%**>^^^^^^~^*%%$#$$%%%**>'~''=%%", +"*;*>'^^^^^~;*%%$$$#$$%**'>~';==*", +";***'^~'^~;;****%%%%%****>'';;*=", +"%**;;>;**;;*;;;***%***;*;;'^~~>%", +"@***,**%%****>''>;*;*;***>^~^~~@", +"+*****%$#%%*****;>>'';***'^~^^~+", +" #*****$$#%%%%****'''>*;'^~~~~# ", +" .%;*,;%$$$$$$%**~^'>**>~^^^~>. ", +" +*>'*%%$%%$$$**>'^';;*~^^~>+ ", +" .#';*%$$%$$$*;';>>*>;~~^$. ", +" +@#%**%$$$%>*>>>'*>$@+ "}; diff --git a/third_party/windows/fltk-1.1.10/test/pixmaps/yellow_bomb.xpm b/third_party/windows/fltk-1.1.10/test/pixmaps/yellow_bomb.xpm new file mode 100644 index 0000000..aead40b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/pixmaps/yellow_bomb.xpm @@ -0,0 +1,67 @@ +/* XPM */ +static const char * yellow_bomb_xpm[] = { +"32 32 32 1", +" c #000100", +". c #393900", +"+ c #2A4602", +"@ c #434101", +"# c #474900", +"$ c #435B00", +"% c #515116", +"& c #5B5C20", +"* c #676800", +"= c #666635", +"- c #7C7B50", +"; c #848323", +"> c #838442", +", c #8E9200", +"' c #8A8A5F", +") c #A6A600", +"! c #9A9B6D", +"~ c #B2B102", +"{ c #AFB132", +"] c #BAB900", +"^ c #C1C300", +"/ c #C6C42C", +"( c #CFD000", +"_ c #C7C84F", +": c #CBCA40", +"< c #CCCC67", +"[ c #D7D984", +"} c #E0E167", +"| c #E0E07A", +"1 c #E6E6A0", +"2 c #EEEE88", +"3 c #EDED97", +" $,)]]]~]]]]^]]~]]^^),$ ", +" +,(/}2111111111111113'>--_}_____]", +"~::/:/_>=-=--=--=--=---->____<<)", +"~:///:;=============>===={:{{{{)", +"]^///:>%=.=.========&====>{:{{{,", +"^^^]~{.=.==.=%%%&&&&&=&&&%/~{{{~", +"]^^/))....=.%%=%%%%&%%%%%%/~~~~~", +"^^^^/{.=...%@@@@%#%@%@%%%%]/~/~~", +"^((^]~...%%@@@@.@@@@@@.@@@]]]~]]", +"]^((]/..@@@%..@@@@@@@.@.@@]~~]~~", +"~]]^]]@%@#@@...@@@@@@.@@@@^]~))~", +")~]]^^;@##@#@........@@@#;^^]~))", +"~~]]^()#@##@@......@..@@@)((^]~)", +"~]^^(((*####@..........@*(((^~~]", +"]]^^(((^##@@@..........@)^^(^]]]", +"/]]((((()##@..........@)(((((^]]", +")]~]((^^])*@@@@.....@*,]]^^((((~", +",]]]]]]~~~~,*@@#@@@*,]]]^^((((^,", +"$~~]/]~)))~]]]]]^^(((^]]^(((((($", +" ,]~]~~),))~~~~]]^((^^]]((((((, ", +" +]]^^^])))))))~^^(((]]^((((((+ ", +" $^^^]~)))))))]^(((^^](((((($ ", +" +,(^]~)~))))~]^^^^^/^((({+ ", +" $,,~]~)),)~^^(^(^^^/,$ "}; diff --git a/third_party/windows/fltk-1.1.10/test/preferences.fl b/third_party/windows/fltk-1.1.10/test/preferences.fl new file mode 100644 index 0000000..35d1eb1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/preferences.fl @@ -0,0 +1,324 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0107 +header_name {.h} +code_name {.cxx} +decl {\#include } {public +} + +decl {\#include } {public +} + +decl {\#include } {} + +decl {\#include } {} + +decl {\#include } {} + +decl {void readPrefs();} {public +} + +decl {void writePrefs();} {public +} + +Function {closeWindowCB( Fl_Widget*, void* )} {open private return_type void +} { + code {Fl::delete_widget(myWindow);} {} +} + +Function {saveAndCloseWindowCB( Fl_Widget*, void* )} {open private return_type void +} { + code {writePrefs(); + Fl::delete_widget(myWindow);} {} +} + +Function {} {open return_type int +} { + Fl_Window myWindow { + label {My Preferences} + callback closeWindowCB open + xywh {394 64 298 311} type Double visible + } { + Fl_Button {} { + label Cancel + callback closeWindowCB + xywh {210 275 75 25} + } + Fl_Button {} { + label OK + callback saveAndCloseWindowCB + xywh {125 275 75 25} + } + Fl_Group {} { + label {Get Up:} open + xywh {20 30 115 225} box ENGRAVED_FRAME align 5 + } { + Fl_Input wAlarm { + label {Alarm at:} + xywh {25 55 45 20} align 5 + } + Fl_Choice wAmPm {open + xywh {75 55 55 20} down_box BORDER_BOX + } { + MenuItem {} { + label {a.m.} + xywh {0 0 100 20} + } + MenuItem {} { + label {p.m.} + xywh {0 0 100 20} + } + } + Fl_Choice wWear { + label {Wear:} open selected + xywh {25 100 105 20} down_box BORDER_BOX align 5 + } { + MenuItem {} { + label shoes + xywh {0 0 100 20} + } + MenuItem {} { + label sandals + xywh {0 0 100 20} + } + MenuItem {} { + label {flip flops} + xywh {0 0 100 20} + } + MenuItem {} { + label {bare foot} + xywh {0 0 100 20} + } + } + Fl_Group {} {open + xywh {35 120 98 60} + } { + Fl_Round_Button wLeft { + label {left side} + xywh {35 120 95 25} type Radio down_box ROUND_DOWN_BOX + } + Fl_Round_Button wRight { + label {right side} + xywh {35 140 95 25} type Radio down_box ROUND_DOWN_BOX + } + Fl_Box {} { + label {of the bed} + xywh {38 160 95 20} + } + } + Fl_Check_Button wShower { + label shower + xywh {25 180 105 25} down_box DOWN_BOX + } + Fl_Check_Button wShave { + label shave + xywh {25 200 105 25} down_box DOWN_BOX + } + Fl_Check_Button wBrush { + label {brush teeth} + xywh {25 220 105 25} down_box DOWN_BOX + } + } + Fl_Group {} { + label {Breakfast::} open + xywh {160 30 115 225} box ENGRAVED_FRAME align 5 + } { + Fl_Choice wDrink { + label {Drink:} open + xywh {165 50 105 20} down_box BORDER_BOX align 5 + } { + MenuItem {} { + label coffee + xywh {10 10 100 20} + } + MenuItem {} { + label tea + xywh {10 10 100 20} + } + MenuItem {} { + label juice + xywh {10 10 100 20} + } + } + Fl_Check_Button wMilk { + label {with milk} + xywh {170 70 100 25} down_box DOWN_BOX + } + Fl_Choice wBread { + label {Bread:} open + xywh {165 110 105 20} down_box BORDER_BOX align 5 + } { + MenuItem {} { + label wheat + xywh {0 0 100 20} + } + MenuItem {} { + label white + xywh {0 0 100 20} + } + MenuItem {} { + label rye + xywh {0 0 100 20} + } + MenuItem {} { + label {sour doh} + xywh {0 0 100 20} + } + } + Fl_Check_Button wButter { + label {with butter} + xywh {170 130 100 25} down_box DOWN_BOX + } + Fl_Input wEggs { + label eggs + xywh {165 163 30 20} type Int align 8 + } + Fl_Value_Slider wMinutes { + label {min.} + xywh {175 185 70 20} type Horizontal align 8 minimum 2 maximum 6 value 3.1 + } + Fl_Input wPaper { + label {Newspaper:} + xywh {165 225 105 20} align 5 + } + } + } + code {readPrefs();} {} +} + +Function {readPrefs()} {open return_type void +} { + code {int boolValue; +int intValue; +char buffer[80]; +double doubleValue; + +Fl_Preferences app( Fl_Preferences::USER, "fltk.org", "test/preferences" ); + + char path[ FL_PATH_MAX ]; + app.getUserdataPath( path, sizeof(path) ); + + Fl_Preferences bed( app, "Bed" ); + bed.get( "alarm", buffer, "8:00", 79 ); + wAlarm->value( buffer ); + + bed.get( "ampm", intValue, 0 ); + wAmPm->value( intValue ); + + bed.get( "wear", intValue, 1 ); + wWear->value( intValue ); + + int side; + bed.get( "side", side, 2 ); + if ( side == 1 ) wLeft->value( 1 ); + if ( side == 2 ) wRight->value( 1 ); + + int tasks; + bed.get( "taskFlags", tasks, 0x05 ); + if ( tasks & 0x01 ) wShower->value( 1 ); + if ( tasks & 0x02 ) wShave->value( 1 ); + if ( tasks & 0x04 ) wBrush->value( 1 ); + + Fl_Preferences eat( app, "Breakfast" ); + + eat.get( "drink", intValue, 1 ); + wDrink->value( intValue ); + + eat.get( "wMilk", boolValue, 0 ); + wMilk->value( boolValue ); + + eat.get( "bread", intValue, 0 ); + wBread->value( intValue ); + + eat.get( "wButter", boolValue, 1 ); + wButter->value( boolValue ); + + eat.get( "nEggs", intValue, 2 ); + sprintf( buffer, "%d", intValue ); + wEggs->value( buffer ); + + eat.get( "minutes", doubleValue, 3.2 ); + wMinutes->value( doubleValue ); + + char *flexBuffer; + eat.get( "newspaper", flexBuffer, "NY Tymes" ); + wPaper->value( flexBuffer ); + if ( flexBuffer ) free( flexBuffer ); + + eat.get( "foo", buffer, "bar", 80 ); + + /** sample code only: + Fl_Preferences prev( app, "PreviousStarts" ); + { + int i, n; + prev.get( "n", n, 0 ); + for ( i=0; ivalue() ); + bed.set( "ampm", wAmPm->value() ); + + bed.set( "wear", wWear->value() ); + + int side = 0; + if ( wLeft->value() ) side = 1; + if ( wRight->value() ) side = 2; + bed.set( "side", side ); + + int tasks = 0; + if ( wShower->value() ) tasks |= 0x01; + if ( wShave->value() ) tasks |= 0x02; + if ( wBrush->value() ) tasks |= 0x04; + bed.set( "taskFlags", tasks ); + + Fl_Preferences eat( app, "Breakfast" ); + + eat.set( "drink", wDrink->value() ); + eat.set( "wMilk", wMilk->value() ); + eat.set( "bread", wBread->value() ); + eat.set( "wButter", wButter->value() ); + + eat.set( "nEggs", wEggs->value() ); + eat.set( "minutes", wMinutes->value() ); + + eat.set( "newspaper", wPaper->value() ); + + eat.set( "foo", "bar\\nfly\\rBackslash: \\\\ and bell: \\007 and delete: \\177\\n" ); + + eat.set( Fl_Preferences::Name( 3 ), "Test3" ); + + /* sample: create a sub-sub-group */ + Fl_Preferences eatMore( eat, "More" ); + + eatMore.set( "more", "stuff" ); + + /* all the following searches should return 1 */ + int sum = 0; + sum += app.groupExists( "Breakfast" ); /* find 'eat' relative to 'app' */ + sum += app.groupExists( "Breakfast/More" ); /* find 'eat.eatMore' relative to 'app' */ + sum += app.groupExists( "./Breakfast/More" ); /* find 'eat.eatMore' relative to Preferences */ + sum += eat.groupExists( "More" ); /* find 'eatMore' relative to 'eat' */ + sum += eat.groupExists( "./Breakfast/More" ); /* find 'eat.eatMore' relative to Preferences */ + sum += eat.groupExists( "." ); /* find myself ('eat') */ + sum += eat.groupExists( "./" ); /* find the topmost group ('app') */ + if ( sum != 7 ) + fl_message( "Assertion failed:\\nNot all group entries were found!" ); + + /* sample code only: */ + unsigned int hex = 0x2387efcd; + eat.set( "binFoo", (void*)&hex, sizeof( unsigned int ) ); + eat.set( "binFoo2", (void*)&writePrefs, 256 );} {} +} diff --git a/third_party/windows/fltk-1.1.10/test/radio.fl b/third_party/windows/fltk-1.1.10/test/radio.fl new file mode 100644 index 0000000..85da905 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/radio.fl @@ -0,0 +1,74 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0100 +header_name {.h} +code_name {.cxx} +gridx 10 +gridy 5 +snap 3 +Function {} {open +} { + Fl_Window {} {open + xywh {447 255 369 214} visible + } { + Fl_Button {} { + label Fl_Button + xywh {20 10 160 30} + } + Fl_Return_Button {} { + label Fl_Return_Button + xywh {20 50 160 30} + } + Fl_Light_Button {} { + label Fl_Light_Button + xywh {20 90 160 30} + } + Fl_Check_Button {} { + label Fl_Check_Button + xywh {20 130 160 30} down_box DOWN_BOX + } + Fl_Round_Button {} { + label Fl_Round_Button selected + xywh {20 170 160 30} down_box ROUND_DOWN_BOX + } + Fl_Group {} { + xywh {190 10 70 120} box THIN_UP_FRAME + } { + Fl_Round_Button {} { + label radio + xywh {190 10 70 30} type Radio down_box ROUND_DOWN_BOX + } + Fl_Round_Button {} { + label radio + xywh {190 40 70 30} type Radio down_box ROUND_DOWN_BOX + } + Fl_Round_Button {} { + label radio + xywh {190 70 70 30} type Radio down_box ROUND_DOWN_BOX + } + Fl_Round_Button {} { + label radio + xywh {190 100 70 30} type Radio down_box ROUND_DOWN_BOX + } + } + Fl_Group {} {open + xywh {270 10 90 115} box THIN_UP_BOX + } { + Fl_Button {} { + label radio + xywh {280 20 20 20} type Radio selection_color 1 align 8 + } + Fl_Button {} { + label radio + xywh {280 45 20 20} type Radio selection_color 1 align 8 + } + Fl_Button {} { + label radio + xywh {280 70 20 20} type Radio selection_color 1 align 8 + } + Fl_Button {} { + label radio + xywh {280 95 20 20} type Radio selection_color 1 align 8 + } + } + } +} diff --git a/third_party/windows/fltk-1.1.10/test/resize.fl b/third_party/windows/fltk-1.1.10/test/resize.fl new file mode 100644 index 0000000..490fa13 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/resize.fl @@ -0,0 +1,54 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.00 +header_name {.h} +code_name {.cxx} +gridx 10 +gridy 10 +snap 3 +Function {} {open +} { + Fl_Window {} {open + xywh {333 489 366 261} visible + } { + Fl_Button {} { + label {@<-} + callback {Fl_Window* w = o->window(); +w->position(w->x()-50,w->y());} + xywh {20 40 40 40} labeltype SYMBOL_LABEL + } + Fl_Button {} { + label {@2->} + callback {Fl_Window* w = o->window(); +w->position(w->x(),w->y()+50);} + xywh {60 80 40 40} labeltype SYMBOL_LABEL + } + Fl_Button {} { + label {@->} + callback {Fl_Window* w = o->window(); +w->position(w->x()+50,w->y());} + xywh {100 40 40 40} labeltype SYMBOL_LABEL + } + Fl_Button {} { + label {@8->} + callback {Fl_Window* w = o->window(); +w->position(w->x(),w->y()-50);} + xywh {60 0 40 40} labeltype SYMBOL_LABEL + } + Fl_Button {} { + label grow + callback {Fl_Window* w = o->window(); +w->size(w->w()+20, w->h()+20);} + xywh {30 130 110 40} labeltype SYMBOL_LABEL labelfont 1 labelsize 18 + } + Fl_Button {} { + label shrink + callback {Fl_Window* w = o->window(); +w->size(w->w()-20, w->h()-20);} + xywh {30 190 110 40} labeltype SYMBOL_LABEL labelfont 1 labelsize 18 + } + Fl_Box {} { + label {This is a test of program-generated resize() of a window. The window should move or resize once when each button is clicked. The program and window manager should not go into fits echoing resizes back and forth!} selected + xywh {150 10 160 220} box BORDER_BOX align 148 + } + } +} diff --git a/third_party/windows/fltk-1.1.10/test/resizebox.cxx b/third_party/windows/fltk-1.1.10/test/resizebox.cxx new file mode 100644 index 0000000..195c86e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/resizebox.cxx @@ -0,0 +1,102 @@ +// +// "$Id: resizebox.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Resize box test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#define W1 (big ? 60 : 40) +#define B 0 +#define W3 (5*W1+6*B) + +#include +#include +#include +#include +#include +#include + +Fl_Single_Window *window; +Fl_Box *box; + +int big = 0; + +void b_cb(Fl_Widget *,long w) { + if (window->w() != W3 || window->h() != W3) { + fl_message("Put window back to minimum size before changing"); + return; + } + window->init_sizes(); + switch (w) { + case 0: box->hide(); window->box(FL_FLAT_BOX); window->resizable(0); return; + case 8: box->resize(W1+B,W1,2*W1,B); break; + case 2: box->resize(W1+B,W1+B+2*W1,2*W1,B); break; + case 4: box->resize(W1+B,W1,B,2*W1); break; + case 6: box->resize(W1+B+2*W1,W1+B,B,2*W1); break; + } + window->box(FL_NO_BOX); + if (w == 6 || w == 4) + box->label("re\nsiz\nab\nle"); + else box->label("resizable"); + box->show(); + window->resizable(box); + window->redraw(); +} + +int main(int argc, char **argv) { + window = new Fl_Single_Window(W3,W3); + window->box(FL_NO_BOX); + Fl_Box *n; + for (int x = 0; x<4; x++) for (int y = 0; y<4; y++) { + if ((x==1 || x==2) && (y==1 || y==2)) continue; + n = new Fl_Box(FL_FRAME_BOX,x*(B+W1)+B,y*(B+W1)+B,W1,W1,0); + n->color(x+y+8); + } + n = new Fl_Box(FL_FRAME_BOX,B,4*W1+5*B,4*W1+3*B,W1,0); + n->color(12); + n = new Fl_Box(FL_FRAME_BOX,4*W1+5*B,B,W1,5*W1+4*B,0); + n->color(13); + n = new Fl_Box(FL_FRAME_BOX,W1+B+B,W1+B+B,2*W1+B,2*W1+B,0); + n->color(8); + + Fl_Button *b = new Fl_Radio_Button(W1+B+50,W1+B+30,20,20,"@6>"); + b->callback(b_cb,6); + (new Fl_Radio_Button(W1+B+30,W1+B+10,20,20,"@8>"))->callback(b_cb,8); + (new Fl_Radio_Button(W1+B+10,W1+B+30,20,20,"@4>"))->callback(b_cb,4); + (new Fl_Radio_Button(W1+B+30,W1+B+50,20,20,"@2>"))->callback(b_cb,2); + (new Fl_Radio_Button(W1+B+30,W1+B+30,20,20,"off"))->callback(b_cb,0); + + box = new Fl_Box(FL_FLAT_BOX,0,0,0,0,"resizable"); + box->color(FL_DARK2); + b->set(); + b->do_callback(); + window->end(); + + window->size_range(W3,W3); + window->show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: resizebox.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/rgb.txt b/third_party/windows/fltk-1.1.10/test/rgb.txt new file mode 100644 index 0000000..240e989 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/rgb.txt @@ -0,0 +1,753 @@ +! $Xorg: rgb.txt,v 1.3 2000/08/17 19:54:00 cpqbld Exp $ +255 250 250 snow +248 248 255 ghost white +248 248 255 GhostWhite +245 245 245 white smoke +245 245 245 WhiteSmoke +220 220 220 gainsboro +255 250 240 floral white +255 250 240 FloralWhite +253 245 230 old lace +253 245 230 OldLace +250 240 230 linen +250 235 215 antique white +250 235 215 AntiqueWhite +255 239 213 papaya whip +255 239 213 PapayaWhip +255 235 205 blanched almond +255 235 205 BlanchedAlmond +255 228 196 bisque +255 218 185 peach puff +255 218 185 PeachPuff +255 222 173 navajo white +255 222 173 NavajoWhite +255 228 181 moccasin +255 248 220 cornsilk +255 255 240 ivory +255 250 205 lemon chiffon +255 250 205 LemonChiffon +255 245 238 seashell +240 255 240 honeydew +245 255 250 mint cream +245 255 250 MintCream +240 255 255 azure +240 248 255 alice blue +240 248 255 AliceBlue +230 230 250 lavender +255 240 245 lavender blush +255 240 245 LavenderBlush +255 228 225 misty rose +255 228 225 MistyRose +255 255 255 white + 0 0 0 black + 47 79 79 dark slate gray + 47 79 79 DarkSlateGray + 47 79 79 dark slate grey + 47 79 79 DarkSlateGrey +105 105 105 dim gray +105 105 105 DimGray +105 105 105 dim grey +105 105 105 DimGrey +112 128 144 slate gray +112 128 144 SlateGray +112 128 144 slate grey +112 128 144 SlateGrey +119 136 153 light slate gray +119 136 153 LightSlateGray +119 136 153 light slate grey +119 136 153 LightSlateGrey +190 190 190 gray +190 190 190 grey +211 211 211 light grey +211 211 211 LightGrey +211 211 211 light gray +211 211 211 LightGray + 25 25 112 midnight blue + 25 25 112 MidnightBlue + 0 0 128 navy + 0 0 128 navy blue + 0 0 128 NavyBlue +100 149 237 cornflower blue +100 149 237 CornflowerBlue + 72 61 139 dark slate blue + 72 61 139 DarkSlateBlue +106 90 205 slate blue +106 90 205 SlateBlue +123 104 238 medium slate blue +123 104 238 MediumSlateBlue +132 112 255 light slate blue +132 112 255 LightSlateBlue + 0 0 205 medium blue + 0 0 205 MediumBlue + 65 105 225 royal blue + 65 105 225 RoyalBlue + 0 0 255 blue + 30 144 255 dodger blue + 30 144 255 DodgerBlue + 0 191 255 deep sky blue + 0 191 255 DeepSkyBlue +135 206 235 sky blue +135 206 235 SkyBlue +135 206 250 light sky blue +135 206 250 LightSkyBlue + 70 130 180 steel blue + 70 130 180 SteelBlue +176 196 222 light steel blue +176 196 222 LightSteelBlue +173 216 230 light blue +173 216 230 LightBlue +176 224 230 powder blue +176 224 230 PowderBlue +175 238 238 pale turquoise +175 238 238 PaleTurquoise + 0 206 209 dark turquoise + 0 206 209 DarkTurquoise + 72 209 204 medium turquoise + 72 209 204 MediumTurquoise + 64 224 208 turquoise + 0 255 255 cyan +224 255 255 light cyan +224 255 255 LightCyan + 95 158 160 cadet blue + 95 158 160 CadetBlue +102 205 170 medium aquamarine +102 205 170 MediumAquamarine +127 255 212 aquamarine + 0 100 0 dark green + 0 100 0 DarkGreen + 85 107 47 dark olive green + 85 107 47 DarkOliveGreen +143 188 143 dark sea green +143 188 143 DarkSeaGreen + 46 139 87 sea green + 46 139 87 SeaGreen + 60 179 113 medium sea green + 60 179 113 MediumSeaGreen + 32 178 170 light sea green + 32 178 170 LightSeaGreen +152 251 152 pale green +152 251 152 PaleGreen + 0 255 127 spring green + 0 255 127 SpringGreen +124 252 0 lawn green +124 252 0 LawnGreen + 0 255 0 green +127 255 0 chartreuse + 0 250 154 medium spring green + 0 250 154 MediumSpringGreen +173 255 47 green yellow +173 255 47 GreenYellow + 50 205 50 lime green + 50 205 50 LimeGreen +154 205 50 yellow green +154 205 50 YellowGreen + 34 139 34 forest green + 34 139 34 ForestGreen +107 142 35 olive drab +107 142 35 OliveDrab +189 183 107 dark khaki +189 183 107 DarkKhaki +240 230 140 khaki +238 232 170 pale goldenrod +238 232 170 PaleGoldenrod +250 250 210 light goldenrod yellow +250 250 210 LightGoldenrodYellow +255 255 224 light yellow +255 255 224 LightYellow +255 255 0 yellow +255 215 0 gold +238 221 130 light goldenrod +238 221 130 LightGoldenrod +218 165 32 goldenrod +184 134 11 dark goldenrod +184 134 11 DarkGoldenrod +188 143 143 rosy brown +188 143 143 RosyBrown +205 92 92 indian red +205 92 92 IndianRed +139 69 19 saddle brown +139 69 19 SaddleBrown +160 82 45 sienna +205 133 63 peru +222 184 135 burlywood +245 245 220 beige +245 222 179 wheat +244 164 96 sandy brown +244 164 96 SandyBrown +210 180 140 tan +210 105 30 chocolate +178 34 34 firebrick +165 42 42 brown +233 150 122 dark salmon +233 150 122 DarkSalmon +250 128 114 salmon +255 160 122 light salmon +255 160 122 LightSalmon +255 165 0 orange +255 140 0 dark orange +255 140 0 DarkOrange +255 127 80 coral +240 128 128 light coral +240 128 128 LightCoral +255 99 71 tomato +255 69 0 orange red +255 69 0 OrangeRed +255 0 0 red +255 105 180 hot pink +255 105 180 HotPink +255 20 147 deep pink +255 20 147 DeepPink +255 192 203 pink +255 182 193 light pink +255 182 193 LightPink +219 112 147 pale violet red +219 112 147 PaleVioletRed +176 48 96 maroon +199 21 133 medium violet red +199 21 133 MediumVioletRed +208 32 144 violet red +208 32 144 VioletRed +255 0 255 magenta +238 130 238 violet +221 160 221 plum +218 112 214 orchid +186 85 211 medium orchid +186 85 211 MediumOrchid +153 50 204 dark orchid +153 50 204 DarkOrchid +148 0 211 dark violet +148 0 211 DarkViolet +138 43 226 blue violet +138 43 226 BlueViolet +160 32 240 purple +147 112 219 medium purple +147 112 219 MediumPurple +216 191 216 thistle +255 250 250 snow1 +238 233 233 snow2 +205 201 201 snow3 +139 137 137 snow4 +255 245 238 seashell1 +238 229 222 seashell2 +205 197 191 seashell3 +139 134 130 seashell4 +255 239 219 AntiqueWhite1 +238 223 204 AntiqueWhite2 +205 192 176 AntiqueWhite3 +139 131 120 AntiqueWhite4 +255 228 196 bisque1 +238 213 183 bisque2 +205 183 158 bisque3 +139 125 107 bisque4 +255 218 185 PeachPuff1 +238 203 173 PeachPuff2 +205 175 149 PeachPuff3 +139 119 101 PeachPuff4 +255 222 173 NavajoWhite1 +238 207 161 NavajoWhite2 +205 179 139 NavajoWhite3 +139 121 94 NavajoWhite4 +255 250 205 LemonChiffon1 +238 233 191 LemonChiffon2 +205 201 165 LemonChiffon3 +139 137 112 LemonChiffon4 +255 248 220 cornsilk1 +238 232 205 cornsilk2 +205 200 177 cornsilk3 +139 136 120 cornsilk4 +255 255 240 ivory1 +238 238 224 ivory2 +205 205 193 ivory3 +139 139 131 ivory4 +240 255 240 honeydew1 +224 238 224 honeydew2 +193 205 193 honeydew3 +131 139 131 honeydew4 +255 240 245 LavenderBlush1 +238 224 229 LavenderBlush2 +205 193 197 LavenderBlush3 +139 131 134 LavenderBlush4 +255 228 225 MistyRose1 +238 213 210 MistyRose2 +205 183 181 MistyRose3 +139 125 123 MistyRose4 +240 255 255 azure1 +224 238 238 azure2 +193 205 205 azure3 +131 139 139 azure4 +131 111 255 SlateBlue1 +122 103 238 SlateBlue2 +105 89 205 SlateBlue3 + 71 60 139 SlateBlue4 + 72 118 255 RoyalBlue1 + 67 110 238 RoyalBlue2 + 58 95 205 RoyalBlue3 + 39 64 139 RoyalBlue4 + 0 0 255 blue1 + 0 0 238 blue2 + 0 0 205 blue3 + 0 0 139 blue4 + 30 144 255 DodgerBlue1 + 28 134 238 DodgerBlue2 + 24 116 205 DodgerBlue3 + 16 78 139 DodgerBlue4 + 99 184 255 SteelBlue1 + 92 172 238 SteelBlue2 + 79 148 205 SteelBlue3 + 54 100 139 SteelBlue4 + 0 191 255 DeepSkyBlue1 + 0 178 238 DeepSkyBlue2 + 0 154 205 DeepSkyBlue3 + 0 104 139 DeepSkyBlue4 +135 206 255 SkyBlue1 +126 192 238 SkyBlue2 +108 166 205 SkyBlue3 + 74 112 139 SkyBlue4 +176 226 255 LightSkyBlue1 +164 211 238 LightSkyBlue2 +141 182 205 LightSkyBlue3 + 96 123 139 LightSkyBlue4 +198 226 255 SlateGray1 +185 211 238 SlateGray2 +159 182 205 SlateGray3 +108 123 139 SlateGray4 +202 225 255 LightSteelBlue1 +188 210 238 LightSteelBlue2 +162 181 205 LightSteelBlue3 +110 123 139 LightSteelBlue4 +191 239 255 LightBlue1 +178 223 238 LightBlue2 +154 192 205 LightBlue3 +104 131 139 LightBlue4 +224 255 255 LightCyan1 +209 238 238 LightCyan2 +180 205 205 LightCyan3 +122 139 139 LightCyan4 +187 255 255 PaleTurquoise1 +174 238 238 PaleTurquoise2 +150 205 205 PaleTurquoise3 +102 139 139 PaleTurquoise4 +152 245 255 CadetBlue1 +142 229 238 CadetBlue2 +122 197 205 CadetBlue3 + 83 134 139 CadetBlue4 + 0 245 255 turquoise1 + 0 229 238 turquoise2 + 0 197 205 turquoise3 + 0 134 139 turquoise4 + 0 255 255 cyan1 + 0 238 238 cyan2 + 0 205 205 cyan3 + 0 139 139 cyan4 +151 255 255 DarkSlateGray1 +141 238 238 DarkSlateGray2 +121 205 205 DarkSlateGray3 + 82 139 139 DarkSlateGray4 +127 255 212 aquamarine1 +118 238 198 aquamarine2 +102 205 170 aquamarine3 + 69 139 116 aquamarine4 +193 255 193 DarkSeaGreen1 +180 238 180 DarkSeaGreen2 +155 205 155 DarkSeaGreen3 +105 139 105 DarkSeaGreen4 + 84 255 159 SeaGreen1 + 78 238 148 SeaGreen2 + 67 205 128 SeaGreen3 + 46 139 87 SeaGreen4 +154 255 154 PaleGreen1 +144 238 144 PaleGreen2 +124 205 124 PaleGreen3 + 84 139 84 PaleGreen4 + 0 255 127 SpringGreen1 + 0 238 118 SpringGreen2 + 0 205 102 SpringGreen3 + 0 139 69 SpringGreen4 + 0 255 0 green1 + 0 238 0 green2 + 0 205 0 green3 + 0 139 0 green4 +127 255 0 chartreuse1 +118 238 0 chartreuse2 +102 205 0 chartreuse3 + 69 139 0 chartreuse4 +192 255 62 OliveDrab1 +179 238 58 OliveDrab2 +154 205 50 OliveDrab3 +105 139 34 OliveDrab4 +202 255 112 DarkOliveGreen1 +188 238 104 DarkOliveGreen2 +162 205 90 DarkOliveGreen3 +110 139 61 DarkOliveGreen4 +255 246 143 khaki1 +238 230 133 khaki2 +205 198 115 khaki3 +139 134 78 khaki4 +255 236 139 LightGoldenrod1 +238 220 130 LightGoldenrod2 +205 190 112 LightGoldenrod3 +139 129 76 LightGoldenrod4 +255 255 224 LightYellow1 +238 238 209 LightYellow2 +205 205 180 LightYellow3 +139 139 122 LightYellow4 +255 255 0 yellow1 +238 238 0 yellow2 +205 205 0 yellow3 +139 139 0 yellow4 +255 215 0 gold1 +238 201 0 gold2 +205 173 0 gold3 +139 117 0 gold4 +255 193 37 goldenrod1 +238 180 34 goldenrod2 +205 155 29 goldenrod3 +139 105 20 goldenrod4 +255 185 15 DarkGoldenrod1 +238 173 14 DarkGoldenrod2 +205 149 12 DarkGoldenrod3 +139 101 8 DarkGoldenrod4 +255 193 193 RosyBrown1 +238 180 180 RosyBrown2 +205 155 155 RosyBrown3 +139 105 105 RosyBrown4 +255 106 106 IndianRed1 +238 99 99 IndianRed2 +205 85 85 IndianRed3 +139 58 58 IndianRed4 +255 130 71 sienna1 +238 121 66 sienna2 +205 104 57 sienna3 +139 71 38 sienna4 +255 211 155 burlywood1 +238 197 145 burlywood2 +205 170 125 burlywood3 +139 115 85 burlywood4 +255 231 186 wheat1 +238 216 174 wheat2 +205 186 150 wheat3 +139 126 102 wheat4 +255 165 79 tan1 +238 154 73 tan2 +205 133 63 tan3 +139 90 43 tan4 +255 127 36 chocolate1 +238 118 33 chocolate2 +205 102 29 chocolate3 +139 69 19 chocolate4 +255 48 48 firebrick1 +238 44 44 firebrick2 +205 38 38 firebrick3 +139 26 26 firebrick4 +255 64 64 brown1 +238 59 59 brown2 +205 51 51 brown3 +139 35 35 brown4 +255 140 105 salmon1 +238 130 98 salmon2 +205 112 84 salmon3 +139 76 57 salmon4 +255 160 122 LightSalmon1 +238 149 114 LightSalmon2 +205 129 98 LightSalmon3 +139 87 66 LightSalmon4 +255 165 0 orange1 +238 154 0 orange2 +205 133 0 orange3 +139 90 0 orange4 +255 127 0 DarkOrange1 +238 118 0 DarkOrange2 +205 102 0 DarkOrange3 +139 69 0 DarkOrange4 +255 114 86 coral1 +238 106 80 coral2 +205 91 69 coral3 +139 62 47 coral4 +255 99 71 tomato1 +238 92 66 tomato2 +205 79 57 tomato3 +139 54 38 tomato4 +255 69 0 OrangeRed1 +238 64 0 OrangeRed2 +205 55 0 OrangeRed3 +139 37 0 OrangeRed4 +255 0 0 red1 +238 0 0 red2 +205 0 0 red3 +139 0 0 red4 +255 20 147 DeepPink1 +238 18 137 DeepPink2 +205 16 118 DeepPink3 +139 10 80 DeepPink4 +255 110 180 HotPink1 +238 106 167 HotPink2 +205 96 144 HotPink3 +139 58 98 HotPink4 +255 181 197 pink1 +238 169 184 pink2 +205 145 158 pink3 +139 99 108 pink4 +255 174 185 LightPink1 +238 162 173 LightPink2 +205 140 149 LightPink3 +139 95 101 LightPink4 +255 130 171 PaleVioletRed1 +238 121 159 PaleVioletRed2 +205 104 137 PaleVioletRed3 +139 71 93 PaleVioletRed4 +255 52 179 maroon1 +238 48 167 maroon2 +205 41 144 maroon3 +139 28 98 maroon4 +255 62 150 VioletRed1 +238 58 140 VioletRed2 +205 50 120 VioletRed3 +139 34 82 VioletRed4 +255 0 255 magenta1 +238 0 238 magenta2 +205 0 205 magenta3 +139 0 139 magenta4 +255 131 250 orchid1 +238 122 233 orchid2 +205 105 201 orchid3 +139 71 137 orchid4 +255 187 255 plum1 +238 174 238 plum2 +205 150 205 plum3 +139 102 139 plum4 +224 102 255 MediumOrchid1 +209 95 238 MediumOrchid2 +180 82 205 MediumOrchid3 +122 55 139 MediumOrchid4 +191 62 255 DarkOrchid1 +178 58 238 DarkOrchid2 +154 50 205 DarkOrchid3 +104 34 139 DarkOrchid4 +155 48 255 purple1 +145 44 238 purple2 +125 38 205 purple3 + 85 26 139 purple4 +171 130 255 MediumPurple1 +159 121 238 MediumPurple2 +137 104 205 MediumPurple3 + 93 71 139 MediumPurple4 +255 225 255 thistle1 +238 210 238 thistle2 +205 181 205 thistle3 +139 123 139 thistle4 + 0 0 0 gray0 + 0 0 0 grey0 + 3 3 3 gray1 + 3 3 3 grey1 + 5 5 5 gray2 + 5 5 5 grey2 + 8 8 8 gray3 + 8 8 8 grey3 + 10 10 10 gray4 + 10 10 10 grey4 + 13 13 13 gray5 + 13 13 13 grey5 + 15 15 15 gray6 + 15 15 15 grey6 + 18 18 18 gray7 + 18 18 18 grey7 + 20 20 20 gray8 + 20 20 20 grey8 + 23 23 23 gray9 + 23 23 23 grey9 + 26 26 26 gray10 + 26 26 26 grey10 + 28 28 28 gray11 + 28 28 28 grey11 + 31 31 31 gray12 + 31 31 31 grey12 + 33 33 33 gray13 + 33 33 33 grey13 + 36 36 36 gray14 + 36 36 36 grey14 + 38 38 38 gray15 + 38 38 38 grey15 + 41 41 41 gray16 + 41 41 41 grey16 + 43 43 43 gray17 + 43 43 43 grey17 + 46 46 46 gray18 + 46 46 46 grey18 + 48 48 48 gray19 + 48 48 48 grey19 + 51 51 51 gray20 + 51 51 51 grey20 + 54 54 54 gray21 + 54 54 54 grey21 + 56 56 56 gray22 + 56 56 56 grey22 + 59 59 59 gray23 + 59 59 59 grey23 + 61 61 61 gray24 + 61 61 61 grey24 + 64 64 64 gray25 + 64 64 64 grey25 + 66 66 66 gray26 + 66 66 66 grey26 + 69 69 69 gray27 + 69 69 69 grey27 + 71 71 71 gray28 + 71 71 71 grey28 + 74 74 74 gray29 + 74 74 74 grey29 + 77 77 77 gray30 + 77 77 77 grey30 + 79 79 79 gray31 + 79 79 79 grey31 + 82 82 82 gray32 + 82 82 82 grey32 + 84 84 84 gray33 + 84 84 84 grey33 + 87 87 87 gray34 + 87 87 87 grey34 + 89 89 89 gray35 + 89 89 89 grey35 + 92 92 92 gray36 + 92 92 92 grey36 + 94 94 94 gray37 + 94 94 94 grey37 + 97 97 97 gray38 + 97 97 97 grey38 + 99 99 99 gray39 + 99 99 99 grey39 +102 102 102 gray40 +102 102 102 grey40 +105 105 105 gray41 +105 105 105 grey41 +107 107 107 gray42 +107 107 107 grey42 +110 110 110 gray43 +110 110 110 grey43 +112 112 112 gray44 +112 112 112 grey44 +115 115 115 gray45 +115 115 115 grey45 +117 117 117 gray46 +117 117 117 grey46 +120 120 120 gray47 +120 120 120 grey47 +122 122 122 gray48 +122 122 122 grey48 +125 125 125 gray49 +125 125 125 grey49 +127 127 127 gray50 +127 127 127 grey50 +130 130 130 gray51 +130 130 130 grey51 +133 133 133 gray52 +133 133 133 grey52 +135 135 135 gray53 +135 135 135 grey53 +138 138 138 gray54 +138 138 138 grey54 +140 140 140 gray55 +140 140 140 grey55 +143 143 143 gray56 +143 143 143 grey56 +145 145 145 gray57 +145 145 145 grey57 +148 148 148 gray58 +148 148 148 grey58 +150 150 150 gray59 +150 150 150 grey59 +153 153 153 gray60 +153 153 153 grey60 +156 156 156 gray61 +156 156 156 grey61 +158 158 158 gray62 +158 158 158 grey62 +161 161 161 gray63 +161 161 161 grey63 +163 163 163 gray64 +163 163 163 grey64 +166 166 166 gray65 +166 166 166 grey65 +168 168 168 gray66 +168 168 168 grey66 +171 171 171 gray67 +171 171 171 grey67 +173 173 173 gray68 +173 173 173 grey68 +176 176 176 gray69 +176 176 176 grey69 +179 179 179 gray70 +179 179 179 grey70 +181 181 181 gray71 +181 181 181 grey71 +184 184 184 gray72 +184 184 184 grey72 +186 186 186 gray73 +186 186 186 grey73 +189 189 189 gray74 +189 189 189 grey74 +191 191 191 gray75 +191 191 191 grey75 +194 194 194 gray76 +194 194 194 grey76 +196 196 196 gray77 +196 196 196 grey77 +199 199 199 gray78 +199 199 199 grey78 +201 201 201 gray79 +201 201 201 grey79 +204 204 204 gray80 +204 204 204 grey80 +207 207 207 gray81 +207 207 207 grey81 +209 209 209 gray82 +209 209 209 grey82 +212 212 212 gray83 +212 212 212 grey83 +214 214 214 gray84 +214 214 214 grey84 +217 217 217 gray85 +217 217 217 grey85 +219 219 219 gray86 +219 219 219 grey86 +222 222 222 gray87 +222 222 222 grey87 +224 224 224 gray88 +224 224 224 grey88 +227 227 227 gray89 +227 227 227 grey89 +229 229 229 gray90 +229 229 229 grey90 +232 232 232 gray91 +232 232 232 grey91 +235 235 235 gray92 +235 235 235 grey92 +237 237 237 gray93 +237 237 237 grey93 +240 240 240 gray94 +240 240 240 grey94 +242 242 242 gray95 +242 242 242 grey95 +245 245 245 gray96 +245 245 245 grey96 +247 247 247 gray97 +247 247 247 grey97 +250 250 250 gray98 +250 250 250 grey98 +252 252 252 gray99 +252 252 252 grey99 +255 255 255 gray100 +255 255 255 grey100 +169 169 169 dark grey +169 169 169 DarkGrey +169 169 169 dark gray +169 169 169 DarkGray +0 0 139 dark blue +0 0 139 DarkBlue +0 139 139 dark cyan +0 139 139 DarkCyan +139 0 139 dark magenta +139 0 139 DarkMagenta +139 0 0 dark red +139 0 0 DarkRed +144 238 144 light green +144 238 144 LightGreen diff --git a/third_party/windows/fltk-1.1.10/test/scroll.cxx b/third_party/windows/fltk-1.1.10/test/scroll.cxx new file mode 100644 index 0000000..509eaf1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/scroll.cxx @@ -0,0 +1,144 @@ +// +// "$Id: scroll.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// Fl_Scroll test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class Drawing : public Fl_Widget { + void draw(); +public: + Drawing(int X,int Y,int W,int H,const char* L) : Fl_Widget(X,Y,W,H,L) { + align(FL_ALIGN_TOP); + box(FL_FLAT_BOX); + color(FL_WHITE); + } +}; + +void Drawing::draw() { + draw_box(); + fl_push_matrix(); + fl_translate(x()+w()/2, y()+h()/2); + fl_scale(w()/2, h()/2); + fl_color(FL_BLACK); + for (int i = 0; i < 20; i++) { + for (int j = i+1; j < 20; j++) { + fl_begin_line(); + fl_vertex(cos(M_PI*i/10+.1), sin(M_PI*i/10+.1)); + fl_vertex(cos(M_PI*j/10+.1), sin(M_PI*j/10+.1)); + fl_end_line(); + } + } + fl_pop_matrix(); +} + +Fl_Scroll* thescroll; + +void box_cb(Fl_Widget* o, void*) { + thescroll->box(((Fl_Button*)o)->value() ? FL_DOWN_FRAME : FL_NO_BOX); + thescroll->redraw(); +} + +void type_cb(Fl_Widget*, void* v) { + thescroll->type((uchar)((long)v)); + thescroll->redraw(); +} + +Fl_Menu_Item choices[] = { + {"0", 0, type_cb, (void*)0}, + {"HORIZONTAL", 0, type_cb, (void*)Fl_Scroll::HORIZONTAL}, + {"VERTICAL", 0, type_cb, (void*)Fl_Scroll::VERTICAL}, + {"BOTH", 0, type_cb, (void*)Fl_Scroll::BOTH}, + {"HORIZONTAL_ALWAYS", 0, type_cb, (void*)Fl_Scroll::HORIZONTAL_ALWAYS}, + {"VERTICAL_ALWAYS", 0, type_cb, (void*)Fl_Scroll::VERTICAL_ALWAYS}, + {"BOTH_ALWAYS", 0, type_cb, (void*)Fl_Scroll::BOTH_ALWAYS}, + {0} +}; + +void align_cb(Fl_Widget*, void* v) { + thescroll->scrollbar.align((uchar)((long)v)); + thescroll->redraw(); +} + +Fl_Menu_Item align_choices[] = { + {"left+top", 0, align_cb, (void*)(FL_ALIGN_LEFT+FL_ALIGN_TOP)}, + {"left+bottom", 0, align_cb, (void*)(FL_ALIGN_LEFT+FL_ALIGN_BOTTOM)}, + {"right+top", 0, align_cb, (void*)(FL_ALIGN_RIGHT+FL_ALIGN_TOP)}, + {"right+bottom", 0, align_cb, (void*)(FL_ALIGN_RIGHT+FL_ALIGN_BOTTOM)}, + {0} +}; + +int main(int argc, char** argv) { + Fl_Window window(5*75,400); + window.box(FL_NO_BOX); + Fl_Scroll scroll(0,0,5*75,300); + + int n = 0; + for (int y=0; y<16; y++) for (int x=0; x<5; x++) { + char buf[20]; sprintf(buf,"%d",n++); + Fl_Button* b = new Fl_Button(x*75,y*25+(y>=8?5*75:0),75,25); + b->copy_label(buf); + b->color(n); + b->labelcolor(FL_WHITE); + } + Drawing drawing(0,8*25,5*75,5*75,0); + scroll.end(); + window.resizable(scroll); + + Fl_Box box(0,300,5*75,window.h()-300); // gray area below the scroll + box.box(FL_FLAT_BOX); + + Fl_Light_Button but1(150, 310, 200, 25, "box"); + but1.callback(box_cb); + + Fl_Choice choice(150, 335, 200, 25, "type():"); + choice.menu(choices); + choice.value(3); + + Fl_Choice achoice(150, 360, 200, 25, "scrollbar.align():"); + achoice.menu(align_choices); + achoice.value(3); + + thescroll = &scroll; + + //scroll.box(FL_DOWN_BOX); + //scroll.type(Fl_Scroll::VERTICAL); + window.end(); + window.show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: scroll.cxx 5845 2007-05-20 00:01:06Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/shape.cxx b/third_party/windows/fltk-1.1.10/test/shape.cxx new file mode 100644 index 0000000..0644ef7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/shape.cxx @@ -0,0 +1,117 @@ +// +// "$Id: shape.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// Tiny OpenGL demo program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "config.h" +#include +#include +#include +#include + +#if HAVE_GL + +#include +#include + +class shape_window : public Fl_Gl_Window { + void draw(); +public: + int sides; + shape_window(int x,int y,int w,int h,const char *l=0); +}; + +shape_window::shape_window(int x,int y,int w,int h,const char *l) : +Fl_Gl_Window(x,y,w,h,l) { + sides = 3; +} + +void shape_window::draw() { +// the valid() property may be used to avoid reinitializing your +// GL transformation for each redraw: + if (!valid()) { + valid(1); + glLoadIdentity(); + glViewport(0, 0, w(), h()); + } +// draw an amazing graphic: + glClear(GL_COLOR_BUFFER_BIT); + glColor3f(.5,.6,.7); + glBegin(GL_POLYGON); + for (int j=0; j +class shape_window : public Fl_Box { +public: + int sides; + shape_window(int x,int y,int w,int h,const char *l=0) + :Fl_Box(FL_DOWN_BOX,x,y,w,h,l){ + label("This demo does\nnot work without GL"); + } +}; + +#endif + +// when you change the data, as in this callback, you must call redraw(): +void sides_cb(Fl_Widget *o, void *p) { + shape_window *sw = (shape_window *)p; + sw->sides = int(((Fl_Slider *)o)->value()); + sw->redraw(); +} + +int main(int argc, char **argv) { + + Fl_Window window(300, 330); + +// the shape window could be it's own window, but here we make it +// a child window: + shape_window sw(10, 10, 280, 280); +// make it resize: + window.resizable(&sw); + // window.size_range(300,330,0,0,1,1,1); +// add a knob to control it: + Fl_Hor_Slider slider(50, 295, window.w()-60, 30, "Sides:"); + slider.align(FL_ALIGN_LEFT); + slider.callback(sides_cb,&sw); + slider.value(sw.sides); + slider.step(1); + slider.bounds(3,40); + + window.end(); + window.show(argc,argv); + + return Fl::run(); +} + +// +// End of "$Id: shape.cxx 5845 2007-05-20 00:01:06Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/subwindow.cxx b/third_party/windows/fltk-1.1.10/test/subwindow.cxx new file mode 100644 index 0000000..8ade788 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/subwindow.cxx @@ -0,0 +1,191 @@ +// +// "$Id: subwindow.cxx 6547 2008-12-06 11:15:29Z AlbrechtS $" +// +// Nested window test program for the Fast Light Tool Kit (FLTK). +// +// Test to make sure nested windows work. +// Events should be reported for enter/exit and all mouse operations +// Buttons and pop-up menu should work, indicating that mouse positions +// are being correctly translated. +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef DEBUG +#include +#endif + +// Define DEBUG_POS for a subwindow positioning test. This will draw +// the last typed character at the cursor position, if no input widget +// currently has the focus. +// Note: The typed character is saved in the derived testwindow class, +// regardless of the definition of DEBUG_POS. Only drawing the character +// depends on this define. + +#ifdef DEBUG_POS +#include +#endif + +class EnterExit : public Fl_Box { + int handle(int); +public: + EnterExit(int x, int y, int w, int h, const char *l) : Fl_Box(FL_BORDER_BOX,x,y,w,h,l) {} +}; + +int EnterExit::handle(int e) { + if (e == FL_ENTER) {color(FL_RED); redraw(); return 1;} + else if (e == FL_LEAVE) {color(FL_GRAY); redraw(); return 1;} + else return 0; +} + +class testwindow : public Fl_Window { + int handle(int); + void draw(); + int cx, cy; char key; + Fl_Cursor crsr; +public: + testwindow(Fl_Boxtype b,int x,int y,const char *l) + : Fl_Window(x,y,l), crsr(FL_CURSOR_DEFAULT) {box(b); key = 0;} + testwindow(Fl_Boxtype b,int x,int y,int w,int h,const char *l) + : Fl_Window(x,y,w,h,l) {box(b); key = 0;} + void use_cursor(Fl_Cursor c) { crsr = c; } +}; + +void testwindow::draw() { +#ifdef DEBUG + printf("%s : draw\n",label()); +#endif + Fl_Window::draw(); +#ifdef DEBUG_POS + if (key) fl_draw(&key, 1, cx, cy); +#endif +} + +int testwindow::handle(int e) { +#ifdef DEBUG + if (e != FL_MOVE) printf("%s : %s\n",label(),fl_eventnames[e]); +#endif + if (crsr!=FL_CURSOR_DEFAULT) { + if (e == FL_ENTER) + cursor(crsr); + if (e == FL_LEAVE) + cursor(FL_CURSOR_DEFAULT); + } + if (Fl_Window::handle(e)) return 1; + if (e == FL_FOCUS) return 1; + if (e == FL_PUSH) {Fl::focus(this); return 1;} + if (e == FL_KEYBOARD && Fl::event_text()[0]) { + key = Fl::event_text()[0]; + cx = Fl::event_x(); + cy = Fl::event_y(); + redraw(); + return 1; + } + return 0; +} + +Fl_Menu_Button* popup; + +const char* bigmess = +#if 1 +"this|is|only|a test" +#else +"item1|item2|item3|item4|item5|" +"submenu/item1|submenu/item2|submenu/item3|submenu/item4|" +"submenu/sub/item1|submenu/sub/item2|submenu/sub/item3|" +"item6|item7|item8|item9|item10|" +"item21|item22|item23|item24|item25|" +"submenu/item21|submenu/item22|submenu/item23|submenu/item24|" +"submenu/sub/item21|submenu/sub/item22|submenu/sub/item23|" +"item36|item37|item38|item39|item310|" +"item31|item32|item33|item34|item35|" +"submenu/item31|submenu/item32|submenu/item33|submenu/item34|" +"submenu/sub/item31|submenu/sub/item32|submenu/sub/item33|" +"item46|item47|item48|item49|item410|" +"item41|item42|item43|item44|item45|" +"submenu/item41|submenu/item42|submenu/item43|submenu/item44|" +"submenu/sub/item41|submenu/sub/item42|submenu/sub/item43|" +"item26|item27|item28|item29|item210|" +"submenu2/item1|submenu2/item2|submenu2/item3|submenu2/item4|" +"submenu2/sub/item1|submenu2/sub/item2|submenu2/sub/item3|" +"item6|item7|item8|item9|item10|" +"item21|item22|item23|item24|item25|" +"submenu2/item21|submenu2/item22|submenu2/item23|submenu2/item24|" +"submenu2/sub/item21|submenu2/sub/item22|submenu2/sub/item23|" +"item36|item37|item38|item39|item310|" +"item31|item32|item33|item34|item35|" +"submenu2/item31|submenu2/item32|submenu2/item33|submenu2/item34|" +"submenu2/sub/item31|submenu2/sub/item32|submenu2/sub/item33|" +"item46|item47|item48|item49|item410|" +"item41|item42|item43|item44|item45|" +"submenu2/item41|submenu2/item42|submenu2/item43|submenu2/item44|" +"submenu2/sub/item41|submenu2/sub/item42|submenu2/sub/item43|" +"item26|item27|item28|item29|item210|" +#endif +; + +int main(int argc, char **argv) { + testwindow *window = + new testwindow(FL_UP_BOX,400,400,"outer"); + new Fl_Toggle_Button(310,310,80,80,"&outer"); + new EnterExit(10,310,80,80,"enterexit"); + new Fl_Input(160,310,140,25,"input1:"); + new Fl_Input(160,340,140,25,"input2:"); + (new Fl_Menu_Button(5,150,80,25,"menu&1"))->add(bigmess); + testwindow *subwindow = + new testwindow(FL_DOWN_BOX,100,100,200,200,"inner"); + new Fl_Toggle_Button(110,110,80,80,"&inner"); + new EnterExit(10,110,80,80,"enterexit"); + (new Fl_Menu_Button(50,20,80,25,"menu&2"))->add(bigmess); + new Fl_Input(55,50,140,25,"input1:"); + new Fl_Input(55,80,140,25,"input2:"); + subwindow->resizable(subwindow); + window->resizable(subwindow); + subwindow->end(); + subwindow->use_cursor(FL_CURSOR_HAND); + (new Fl_Box(FL_NO_BOX,0,0,400,100, + "A child Fl_Window with children of it's own may " + "be useful for imbedding controls into a GL or display " + "that needs a different visual. There are bugs with the " + "origins being different between drawing and events, " + "which I hope I have solved." + )) -> align(FL_ALIGN_WRAP); + popup = new Fl_Menu_Button(0,0,400,400); + popup->type(Fl_Menu_Button::POPUP3); + popup->add("This|is|a popup|menu"); + popup->add(bigmess); + window->show(argc, argv); + return Fl::run(); +} + +// +// End of "$Id: subwindow.cxx 6547 2008-12-06 11:15:29Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/test/sudoku.app/Contents/Info.plist b/third_party/windows/fltk-1.1.10/test/sudoku.app/Contents/Info.plist new file mode 100644 index 0000000..306606a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/sudoku.app/Contents/Info.plist @@ -0,0 +1,44 @@ + + + + CFBundleInfoDictionaryVersion + 6.0 + + CFBundleExecutable + sudoku + + CFBundleIdentifier + org.fltk.sudoku + + CFBundleVersion + 1.0 + + CFBundleDevelopmentRegion + English + + NSHumanReadableCopyright + Copyright 2005-2006 by Michael Sweet + + CFAppleHelpAnchor + help + + CFBundleName + sudoku + + CFBundlePackageType + APPL + + CFBundleSignature + FLSU + + CFBundleIconFile + sudoku.icns + + CFBundleShortVersionString + 1.0 + + CFBundleGetInfoString + 1.0, Copyright 2005-2006 by Michael Sweet + + + diff --git a/third_party/windows/fltk-1.1.10/test/sudoku.app/Contents/PkgInfo b/third_party/windows/fltk-1.1.10/test/sudoku.app/Contents/PkgInfo new file mode 100644 index 0000000..ffeeb7d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/sudoku.app/Contents/PkgInfo @@ -0,0 +1 @@ +FLSUFlsu diff --git a/third_party/windows/fltk-1.1.10/test/sudoku.app/Contents/Resources/sudoku.icns b/third_party/windows/fltk-1.1.10/test/sudoku.app/Contents/Resources/sudoku.icns new file mode 100644 index 0000000..9541d42 Binary files /dev/null and b/third_party/windows/fltk-1.1.10/test/sudoku.app/Contents/Resources/sudoku.icns differ diff --git a/third_party/windows/fltk-1.1.10/test/sudoku.cxx b/third_party/windows/fltk-1.1.10/test/sudoku.cxx new file mode 100644 index 0000000..79fc935 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/sudoku.cxx @@ -0,0 +1,1335 @@ +// +// "$Id: sudoku.cxx 6973 2009-12-21 16:35:06Z AlbrechtS $" +// +// Sudoku game using the Fast Light Tool Kit (FLTK). +// +// Copyright 2005-2007 by Michael Sweet. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef WIN32 +# include "sudokurc.h" +#elif !defined(__APPLE__) +# include "pixmaps/sudoku.xbm" +#endif // WIN32 + +// Audio headers... +#include + +#ifndef WIN32 +# include +#endif // !WIN32 + +#ifdef HAVE_ALSA_ASOUNDLIB_H +# define ALSA_PCM_NEW_HW_PARAMS_API +# include +#endif // HAVE_ALSA_ASOUNDLIB_H +#ifdef __APPLE__ +# include +#endif // __APPLE__ +#ifdef WIN32 +# include +#endif // WIN32 + + +// +// Default sizes... +// + +#define GROUP_SIZE 160 +#define CELL_SIZE 50 +#define CELL_OFFSET 5 +#ifdef __APPLE__ +# define MENU_OFFSET 0 +#else +# define MENU_OFFSET 25 +#endif // __APPLE__ + +// Sound class for Sudoku... +// +// There are MANY ways to implement sound in a FLTK application. +// The approach we are using here is to conditionally compile OS- +// specific code into the application - CoreAudio for MacOS X, the +// standard Win32 API stuff for Windows, ALSA or X11 for Linux, and +// X11 for all others. We have to support ALSA on Linux because the +// current Xorg releases no longer support XBell() or the PC speaker. +// +// There are several good cross-platform audio libraries we could also +// use, such as OpenAL, PortAudio, and SDL, however they were not chosen +// for this application because of our limited use of sound. +// +// Many thanks to Ian MacArthur who provided sample code that led to +// the CoreAudio implementation you see here! +class SudokuSound { + // Private, OS-specific data... +#ifdef __APPLE__ + AudioDeviceID device; + AudioStreamBasicDescription format; + short *data; + int remaining; + + static OSStatus audio_cb(AudioDeviceID device, + const AudioTimeStamp *current_time, + const AudioBufferList *data_in, + const AudioTimeStamp *time_in, + AudioBufferList *data_out, + const AudioTimeStamp *time_out, + void *client_data); +#elif defined(WIN32) + HWAVEOUT device; + HGLOBAL header_handle; + LPWAVEHDR header_ptr; + HGLOBAL data_handle; + LPSTR data_ptr; + +#else +# ifdef HAVE_ALSA_ASOUNDLIB_H + snd_pcm_t *handle; +# endif // HAVE_ALSA_ASOUNDLIB_H +#endif // __APPLE__ + + // Common data... + static int frequencies[9]; + static short *sample_data[9]; + static int sample_size; + + public: + + SudokuSound(); + ~SudokuSound(); + + void play(char note); +}; + + +// Sudoku cell class... +class SudokuCell : public Fl_Widget { + bool readonly_; + int value_; + int test_value_[9]; + + public: + + SudokuCell(int X, int Y, int W, int H); + void draw(); + int handle(int event); + void readonly(bool r) { readonly_ = r; redraw(); } + bool readonly() const { return readonly_; } + void test_value(int v, int n) { test_value_[n] = v; redraw(); } + int test_value(int n) const { return test_value_[n]; } + void value(int v) { + value_ = v; + for (int i = 0; i < 8; i ++) test_value_[i] = 0; + redraw(); + } + int value() const { return value_; } +}; + + +// Sudoku window class... +class Sudoku : public Fl_Window { + Fl_Sys_Menu_Bar *menubar_; + Fl_Group *grid_; + time_t seed_; + char grid_values_[9][9]; + SudokuCell *grid_cells_[9][9]; + Fl_Group *grid_groups_[3][3]; + int difficulty_; + SudokuSound *sound_; + + static void check_cb(Fl_Widget *widget, void *); + static void close_cb(Fl_Widget *widget, void *); + static void diff_cb(Fl_Widget *widget, void *d); + static void update_helpers_cb(Fl_Widget *, void *); + static void help_cb(Fl_Widget *, void *); + static void mute_cb(Fl_Widget *widget, void *); + static void new_cb(Fl_Widget *widget, void *); + static void reset_cb(Fl_Widget *widget, void *); + static void restart_cb(Fl_Widget *widget, void *); + void set_title(); + static void solve_cb(Fl_Widget *widget, void *); + + static Fl_Help_Dialog *help_dialog_; + static Fl_Preferences prefs_; + public: + + Sudoku(); + ~Sudoku(); + + void check_game(bool highlight = true); + void load_game(); + void new_game(time_t seed); + int next_value(SudokuCell *c); + void resize(int X, int Y, int W, int H); + void save_game(); + void solve_game(); + void update_helpers(); +}; + + +// Sound class globals... +int SudokuSound::frequencies[9] = { + 880, // A(5) + 988, // B(5) + 1046, // C(5) + 1174, // D(5) + 1318, // E(5) + 1396, // F(5) + 1568, // G(5) + 1760, // H (A6) + 1976 // I (B6) +}; +short *SudokuSound::sample_data[9] = { 0 }; +int SudokuSound::sample_size = 0; + + +// Initialize the SudokuSound class +SudokuSound::SudokuSound() { + sample_size = 0; + +#ifdef __APPLE__ + remaining = 0; + + UInt32 size = sizeof(device); + + if (AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, + &size, (void *)&device) != noErr) return; + + size = sizeof(format); + if (AudioDeviceGetProperty(device, 0, false, kAudioDevicePropertyStreamFormat, + &size, &format) != noErr) return; + + // Set up a format we like... + format.mSampleRate = 44100.0; // 44.1kHz + format.mChannelsPerFrame = 2; // stereo + + if (AudioDeviceSetProperty(device, NULL, 0, false, + kAudioDevicePropertyStreamFormat, + sizeof(format), &format) != noErr) return; + + // Check we got linear pcm - what to do if we did not ??? + if (format.mFormatID != kAudioFormatLinearPCM) return; + + // Attach the callback + if (AudioDeviceAddIOProc(device, audio_cb, (void *)this) != noErr) return; + + // Start the device... + AudioDeviceStart(device, audio_cb); + + sample_size = (int)format.mSampleRate / 20; + +#elif defined(WIN32) + WAVEFORMATEX format; + + memset(&format, 0, sizeof(format)); + format.cbSize = sizeof(format); + format.wFormatTag = WAVE_FORMAT_PCM; + format.nChannels = 2; + format.nSamplesPerSec = 44100; + format.nAvgBytesPerSec = 44100 * 4; + format.nBlockAlign = 4; + format.wBitsPerSample = 16; + + data_handle = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, format.nSamplesPerSec / 5); + if (!data_handle) return; + + data_ptr = (LPSTR)GlobalLock(data_handle); + + header_handle = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, sizeof(WAVEHDR)); + if (!header_handle) return; + + header_ptr = (WAVEHDR *)GlobalLock(header_handle); + + header_ptr->lpData = data_ptr; + header_ptr->dwBufferLength = format.nSamplesPerSec / 5; + header_ptr->dwFlags = 0; + header_ptr->dwLoops = 0; + + if (waveOutOpen(&device, WAVE_MAPPER, &format, 0, 0, WAVE_ALLOWSYNC) + != MMSYSERR_NOERROR) return; + + waveOutPrepareHeader(device, header_ptr, sizeof(WAVEHDR)); + + sample_size = 44100 / 20; + +#else +# ifdef HAVE_ALSA_ASOUNDLIB_H + handle = NULL; + + if (snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0) >= 0) { + // Initialize PCM sound stuff... + snd_pcm_hw_params_t *params; + + snd_pcm_hw_params_alloca(¶ms); + snd_pcm_hw_params_any(handle, params); + snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED); + snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16); + snd_pcm_hw_params_set_channels(handle, params, 2); + unsigned rate = 44100; + int dir; + snd_pcm_hw_params_set_rate_near(handle, params, &rate, &dir); + snd_pcm_uframes_t period = (int)rate / 4; + snd_pcm_hw_params_set_period_size_near(handle, params, &period, &dir); + + sample_size = rate / 20; + + if (snd_pcm_hw_params(handle, params) < 0) { + sample_size = 0; + snd_pcm_close(handle); + handle = NULL; + } + } +# endif // HAVE_ALSA_ASOUNDLIB_H +#endif // __APPLE__ + + if (sample_size) { + // Make each of the notes using a combination of sine and sawtooth waves + int attack = sample_size / 10; + int decay = 4 * sample_size / 5; + + for (int i = 0; i < 9; i ++) { + sample_data[i] = new short[2 * sample_size]; + + short *sample_ptr = sample_data[i]; + + for (int j = 0; j < sample_size; j ++, sample_ptr += 2) { + double theta = 0.05 * frequencies[i] * j / sample_size; + double val = 0.5 * sin(2.0 * M_PI * theta) + theta - (int)theta - 0.5; + + if (j < attack) { + *sample_ptr = (int)(32767 * val * j / attack); + } else if (j > decay) { + *sample_ptr = (int)(32767 * val * (sample_size - j + decay) / + sample_size); + } else *sample_ptr = (int)(32767 * val); + + sample_ptr[1] = *sample_ptr; + } + } + } +} + + +// Cleanup the SudokuSound class +SudokuSound::~SudokuSound() { +#ifdef __APPLE__ + if (sample_size) { + AudioDeviceStop(device, audio_cb); + AudioDeviceRemoveIOProc(device, audio_cb); + } + +#elif defined(WIN32) + if (sample_size) { + waveOutClose(device); + + GlobalUnlock(header_handle); + GlobalFree(header_handle); + + GlobalUnlock(data_handle); + GlobalFree(data_handle); + } + +#else +# ifdef HAVE_ALSA_ASOUNDLIB_H + if (handle) { + snd_pcm_drain(handle); + snd_pcm_close(handle); + } +# endif // HAVE_ALSA_ASOUNDLIB_H +#endif // __APPLE__ + + if (sample_size) { + for (int i = 0; i < 9; i ++) { + delete[] sample_data[i]; + } + } +} + + +#ifdef __APPLE__ +// Callback function for writing audio data... +OSStatus +SudokuSound::audio_cb(AudioDeviceID device, + const AudioTimeStamp *current_time, + const AudioBufferList *data_in, + const AudioTimeStamp *time_in, + AudioBufferList *data_out, + const AudioTimeStamp *time_out, + void *client_data) { + SudokuSound *ss = (SudokuSound *)client_data; + int count; + float *buffer; + + if (!ss->remaining) return noErr; + + for (count = data_out->mBuffers[0].mDataByteSize / sizeof(float), + buffer = (float*) data_out->mBuffers[0].mData; + ss->remaining > 0 && count > 0; + count --, ss->data ++, ss->remaining --) { + *buffer++ = *(ss->data) / 32767.0; + } + + while (count > 0) { + *buffer++ = 0.0; + count --; + } + + return noErr; +} +#endif // __APPLE__ + + +// Play a note for 250ms... +void SudokuSound::play(char note) { + Fl::check(); + +#ifdef __APPLE__ + // Point to the next note... + data = sample_data[note - 'A']; + remaining = sample_size * 2; + + // Wait for the sound to complete... + usleep(50000); + +#elif defined(WIN32) + if (sample_size) { + memcpy(data_ptr, sample_data[note - 'A'], sample_size * 4); + + waveOutWrite(device, header_ptr, sizeof(WAVEHDR)); + + Sleep(50); + } else Beep(frequencies[note - 'A'], 50); + +#else +# ifdef HAVE_ALSA_ASOUNDLIB_H + if (handle) { + // Use ALSA to play the sound... + if (snd_pcm_writei(handle, sample_data[note - 'A'], sample_size) < 0) { + snd_pcm_prepare(handle); + snd_pcm_writei(handle, sample_data[note - 'A'], sample_size); + } + usleep(50000); + return; + } +# endif // HAVE_ALSA_ASOUNDLIB_H + + // Just use standard X11 stuff... + XKeyboardState state; + XKeyboardControl control; + + // Get original pitch and duration... + XGetKeyboardControl(fl_display, &state); + + // Sound a tone for the given note... + control.bell_percent = 100; + control.bell_pitch = frequencies[note - 'A']; + control.bell_duration = 50; + + XChangeKeyboardControl(fl_display, + KBBellPercent | KBBellPitch | KBBellDuration, + &control); + XBell(fl_display, 100); + XFlush(fl_display); + + // Restore original pitch and duration... + control.bell_percent = state.bell_percent; + control.bell_pitch = state.bell_pitch; + control.bell_duration = state.bell_duration; + + XChangeKeyboardControl(fl_display, + KBBellPercent | KBBellPitch | KBBellDuration, + &control); +#endif // __APPLE__ +} + + +// Create a cell widget +SudokuCell::SudokuCell(int X, int Y, int W, int H) + : Fl_Widget(X, Y, W, H, 0) { + value(0); +} + + +// Draw cell +void +SudokuCell::draw() { + static Fl_Align align[8] = { + FL_ALIGN_TOP_LEFT, + FL_ALIGN_TOP, + FL_ALIGN_TOP_RIGHT, + FL_ALIGN_RIGHT, + FL_ALIGN_BOTTOM_RIGHT, + FL_ALIGN_BOTTOM, + FL_ALIGN_BOTTOM_LEFT, + FL_ALIGN_LEFT + }; + + + // Draw the cell box... + if (readonly()) fl_draw_box(FL_UP_BOX, x(), y(), w(), h(), color()); + else fl_draw_box(FL_DOWN_BOX, x(), y(), w(), h(), color()); + + // Draw the cell background... + if (Fl::focus() == this) { + Fl_Color c = fl_color_average(FL_SELECTION_COLOR, color(), 0.5f); + fl_color(c); + fl_rectf(x() + 4, y() + 4, w() - 8, h() - 8); + fl_color(fl_contrast(labelcolor(), c)); + } else fl_color(labelcolor()); + + // Draw the cell value... + char s[2]; + + s[1] = '\0'; + + if (value_) { + s[0] = value_ + '0'; + + fl_font(FL_HELVETICA_BOLD, h() - 10); + fl_draw(s, x(), y(), w(), h(), FL_ALIGN_CENTER); + } + + fl_font(FL_HELVETICA_BOLD, h() / 5); + + for (int i = 0; i < 8; i ++) { + if (test_value_[i]) { + s[0] = test_value_[i] + '0'; + fl_draw(s, x() + 5, y() + 5, w() - 10, h() - 10, align[i]); + } + } +} + + +// Handle events in cell +int +SudokuCell::handle(int event) { + switch (event) { + case FL_FOCUS : + Fl::focus(this); + redraw(); + return 1; + + case FL_UNFOCUS : + redraw(); + return 1; + + case FL_PUSH : + if (!readonly() && Fl::event_inside(this)) { + if (Fl::event_clicks()) { + // 2+ clicks increments/sets value + if (value()) { + if (value() < 9) value(value() + 1); + else value(1); + } else value(((Sudoku *)window())->next_value(this)); + } + + Fl::focus(this); + redraw(); + return 1; + } + break; + + case FL_KEYDOWN : + if (Fl::event_state() & FL_CTRL) break; + int key = Fl::event_key() - '0'; + if (key < 0 || key > 9) key = Fl::event_key() - FL_KP - '0'; + if (key > 0 && key <= 9) { + if (readonly()) { + fl_beep(FL_BEEP_ERROR); + return 1; + } + + if (Fl::event_state() & (FL_SHIFT | FL_CAPS_LOCK)) { + int i; + + for (i = 0; i < 8; i ++) + if (test_value_[i] == key) { + test_value_[i] = 0; + break; + } + + if (i >= 8) { + for (i = 0; i < 8; i ++) + if (!test_value_[i]) { + test_value_[i] = key; + break; + } + } + + if (i >= 8) { + for (i = 0; i < 7; i ++) test_value_[i] = test_value_[i + 1]; + test_value_[i] = key; + } + + redraw(); + } else { + value(key); + do_callback(); + } + return 1; + } else if (key == 0 || Fl::event_key() == FL_BackSpace || + Fl::event_key() == FL_Delete) { + if (readonly()) { + fl_beep(FL_BEEP_ERROR); + return 1; + } + + value(0); + do_callback(); + return 1; + } + break; + } + + return Fl_Widget::handle(event); +} + + +// Sudoku class globals... +Fl_Help_Dialog *Sudoku::help_dialog_ = (Fl_Help_Dialog *)0; +Fl_Preferences Sudoku::prefs_(Fl_Preferences::USER, "fltk.org", "sudoku"); + + +// Create a Sudoku game window... +Sudoku::Sudoku() + : Fl_Window(GROUP_SIZE * 3, GROUP_SIZE * 3 + MENU_OFFSET, "Sudoku") +{ + int j, k; + Fl_Group *g; + SudokuCell *cell; + static Fl_Menu_Item items[] = { + { "&Game", 0, 0, 0, FL_SUBMENU }, + { "&New Game", FL_COMMAND | 'n', new_cb, 0, FL_MENU_DIVIDER }, + { "&Check Game", FL_COMMAND | 'c', check_cb, 0, 0 }, + { "&Restart Game", FL_COMMAND | 'r', restart_cb, 0, 0 }, + { "&Solve Game", FL_COMMAND | 's', solve_cb, 0, FL_MENU_DIVIDER }, + { "&Update Helpers", 0, update_helpers_cb, 0, 0 }, + { "&Mute Sound", FL_COMMAND | 'm', mute_cb, 0, FL_MENU_TOGGLE | FL_MENU_DIVIDER }, + { "&Quit", FL_COMMAND | 'q', close_cb, 0, 0 }, + { 0 }, + { "&Difficulty", 0, 0, 0, FL_SUBMENU }, + { "&Easy", 0, diff_cb, (void *)"0", FL_MENU_RADIO }, + { "&Medium", 0, diff_cb, (void *)"1", FL_MENU_RADIO }, + { "&Hard", 0, diff_cb, (void *)"2", FL_MENU_RADIO }, + { "&Impossible", 0, diff_cb, (void *)"3", FL_MENU_RADIO }, + { 0 }, + { "&Help", 0, 0, 0, FL_SUBMENU }, + { "&About Sudoku", FL_F + 1, help_cb, 0, 0 }, + { 0 }, + { 0 } + }; + + + // Setup sound output... + prefs_.get("mute_sound", j, 0); + if (j) { + // Mute sound? + sound_ = NULL; + items[6].flags |= FL_MENU_VALUE; + } else sound_ = new SudokuSound(); + + // Menubar... + prefs_.get("difficulty", difficulty_, 0); + if (difficulty_ < 0 || difficulty_ > 3) difficulty_ = 0; + + items[10 + difficulty_].flags |= FL_MENU_VALUE; + + menubar_ = new Fl_Sys_Menu_Bar(0, 0, 3 * GROUP_SIZE, 25); + menubar_->menu(items); + + // Create the grids... + grid_ = new Fl_Group(0, MENU_OFFSET, 3 * GROUP_SIZE, 3 * GROUP_SIZE); + + for (j = 0; j < 3; j ++) + for (k = 0; k < 3; k ++) { + g = new Fl_Group(k * GROUP_SIZE, j * GROUP_SIZE + MENU_OFFSET, + GROUP_SIZE, GROUP_SIZE); + g->box(FL_BORDER_BOX); + if ((int)(j == 1) ^ (int)(k == 1)) g->color(FL_DARK3); + else g->color(FL_DARK2); + g->end(); + + grid_groups_[j][k] = g; + } + + for (j = 0; j < 9; j ++) + for (k = 0; k < 9; k ++) { + cell = new SudokuCell(k * CELL_SIZE + CELL_OFFSET + + (k / 3) * (GROUP_SIZE - 3 * CELL_SIZE), + j * CELL_SIZE + CELL_OFFSET + MENU_OFFSET + + (j / 3) * (GROUP_SIZE - 3 * CELL_SIZE), + CELL_SIZE, CELL_SIZE); + cell->callback(reset_cb); + grid_cells_[j][k] = cell; + } + + // Set icon for window (MacOS uses app bundle for icon...) +#ifdef WIN32 + icon((char *)LoadIcon(fl_display, MAKEINTRESOURCE(IDI_ICON))); +#elif !defined(__APPLE__) + fl_open_display(); + icon((char *)XCreateBitmapFromData(fl_display, DefaultRootWindow(fl_display), + (char *)sudoku_bits, sudoku_width, + sudoku_height)); +#endif // WIN32 + + // Catch window close events... + callback(close_cb); + + // Make the window resizable... + resizable(grid_); + size_range(3 * GROUP_SIZE, 3 * GROUP_SIZE + MENU_OFFSET, 0, 0, 5, 5, 1); + + // Restore the previous window dimensions... + int X, Y, W, H; + + if (prefs_.get("x", X, -1)) { + prefs_.get("y", Y, -1); + prefs_.get("width", W, 3 * GROUP_SIZE); + prefs_.get("height", H, 3 * GROUP_SIZE + MENU_OFFSET); + + resize(X, Y, W, H); + } + + set_title(); +} + + +// Destroy the sudoku window... +Sudoku::~Sudoku() { + if (sound_) delete sound_; +} + + +// Check for a solution to the game... +void +Sudoku::check_cb(Fl_Widget *widget, void *) { + ((Sudoku *)(widget->window()))->check_game(); +} + + +// Check if the user has correctly solved the game... +void +Sudoku::check_game(bool highlight) { + bool empty = false; + bool correct = true; + int j, k, m; + + // Check the game for right/wrong answers... + for (j = 0; j < 9; j ++) + for (k = 0; k < 9; k ++) { + SudokuCell *cell = grid_cells_[j][k]; + int val = cell->value(); + + if (cell->readonly()) continue; + + if (!val) empty = true; + else { + for (m = 0; m < 9; m ++) + if ((j != m && grid_cells_[m][k]->value() == val) || + (k != m && grid_cells_[j][m]->value() == val)) break; + + if (m < 9) { + if (highlight) { + cell->color(FL_YELLOW); + cell->redraw(); + } + + correct = false; + } else if (highlight) { + cell->color(FL_LIGHT3); + cell->redraw(); + } + } + } + + // Check subgrids for duplicate numbers... + for (j = 0; j < 9; j += 3) + for (k = 0; k < 9; k += 3) + for (int jj = 0; jj < 3; jj ++) + for (int kk = 0; kk < 3; kk ++) { + SudokuCell *cell = grid_cells_[j + jj][k + kk]; + int val = cell->value(); + + if (cell->readonly() || !val) continue; + + int jjj; + + for (jjj = 0; jjj < 3; jjj ++) { + int kkk; + + for (kkk = 0; kkk < 3; kkk ++) + if (jj != jjj && kk != kkk && + grid_cells_[j + jjj][k + kkk]->value() == val) break; + + if (kkk < 3) break; + } + + if (jjj < 3) { + if (highlight) { + cell->color(FL_YELLOW); + cell->redraw(); + } + + correct = false; + } + } + + if (!empty && correct) { + // Success! + for (j = 0; j < 9; j ++) { + for (k = 0; k < 9; k ++) { + SudokuCell *cell = grid_cells_[j][k]; + cell->color(FL_GREEN); + cell->readonly(1); + } + + if (sound_) sound_->play('A' + grid_cells_[j][8]->value() - 1); + } + } +} + + +// Close the window, saving the game first... +void +Sudoku::close_cb(Fl_Widget *widget, void *) { + Sudoku *s = (Sudoku *)(widget->window() ? widget->window() : widget); + + s->save_game(); + s->hide(); + + if (help_dialog_) help_dialog_->hide(); +} + + +// Set the level of difficulty... +void +Sudoku::diff_cb(Fl_Widget *widget, void *d) { + Sudoku *s = (Sudoku *)(widget->window() ? widget->window() : widget); + int diff = atoi((char *)d); + + if (diff != s->difficulty_) { + s->difficulty_ = diff; + s->new_game(s->seed_); + s->set_title(); + + if (diff > 1) + { + // Display a message about the higher difficulty levels for the + // Sudoku zealots of the world... + int val; + + prefs_.get("difficulty_warning", val, 0); + + if (!val) + { + prefs_.set("difficulty_warning", 1); + fl_alert("Note: 'Hard' and 'Impossible' puzzles may have more than " + "one possible solution.\n" + "This is not an error or bug."); + } + } + + prefs_.set("difficulty", s->difficulty_); + } +} + +// Update the little marker numbers in all cells +void +Sudoku::update_helpers_cb(Fl_Widget *widget, void *) { + Sudoku *s = (Sudoku *)(widget->window() ? widget->window() : widget); + s->update_helpers(); +} + +void +Sudoku::update_helpers() { + int j, k, m; + + // First we delete any entries that the user may have made + for (j = 0; j < 9; j ++) { + for (k = 0; k < 9; k ++) { + SudokuCell *cell = grid_cells_[j][k]; + for (m = 0; m < 8; m ++) { + cell->test_value(0, m); + } + } + } + + // Now go through all cells and find out, what we can not be + for (j = 0; j < 81; j ++) { + char taken[10] = { 0 }; + // Find our destination cell + int row = j / 9; + int col = j % 9; + SudokuCell *dst_cell = grid_cells_[row][col]; + if (dst_cell->value()) continue; + // Find all values already taken in this row + for (k = 0; k < 9; k ++) { + SudokuCell *cell = grid_cells_[row][k]; + int v = cell->value(); + if (v) taken[v] = 1; + } + // Find all values already taken in this column + for (k = 0; k < 9; k ++) { + SudokuCell *cell = grid_cells_[k][col]; + int v = cell->value(); + if (v) taken[v] = 1; + } + // Now find all values already taken in this square + int ro = (row / 3) * 3; + int co = (col / 3) * 3; + for (k = 0; k < 3; k ++) { + for (m = 0; m < 3; m ++) { + SudokuCell *cell = grid_cells_[ro + k][co + m]; + int v = cell->value(); + if (v) taken[v] = 1; + } + } + // transfer our findings to the markers + for (m = 1, k = 0; m <= 9; m ++) { + if (!taken[m]) + dst_cell->test_value(m, k ++); + } + } +} + + +// Show the on-line help... +void +Sudoku::help_cb(Fl_Widget *, void *) { + if (!help_dialog_) { + help_dialog_ = new Fl_Help_Dialog(); + + help_dialog_->value( + "\n" + "\n" + "Sudoku Help\n" + "\n" + "\n" + + "

About the Game

\n" + + "

Sudoku (pronounced soo-dough-coo with the emphasis on the\n" + "first syllable) is a simple number-based puzzle/game played on a\n" + "9x9 grid that is divided into 3x3 subgrids. The goal is to enter\n" + "a number from 1 to 9 in each cell so that each number appears\n" + "only once in each column and row. In addition, each 3x3 subgrid\n" + "may only contain one of each number.

\n" + + "

This version of the puzzle is copyright 2005-2006 by Michael R\n" + "Sweet.

\n" + + "

Note: The 'Hard' and 'Impossible' difficulty\n" + "levels generate Sudoku puzzles with multiple possible solutions.\n" + "While some purists insist that these cannot be called 'Sudoku'\n" + "puzzles, the author (me) has personally solved many such puzzles\n" + "in published/printed Sudoku books and finds them far more\n" + "interesting than the simple single solution variety. If you don't\n" + "like it, don't play with the difficulty set to 'High' or\n" + "'Impossible'.

\n" + + "

How to Play the Game

\n" + + "

At the start of a new game, Sudoku fills in a random selection\n" + "of cells for you - the number of cells depends on the difficulty\n" + "level you use. Click in any of the empty cells or use the arrow\n" + "keys to highlight individual cells and press a number from 1 to 9\n" + "to fill in the cell. To clear a cell, press 0, Delete, or\n" + "Backspace. When you have successfully completed all subgrids, the\n" + "entire puzzle is highlighted in green until you start a new\n" + "game.

\n" + + "

As you work to complete the puzzle, you can display possible\n" + "solutions inside each cell by holding the Shift key and pressing\n" + "each number in turn. Repeat the process to remove individual\n" + "numbers, or press a number without the Shift key to replace them\n" + "with the actual number to use.

\n" + "\n" + ); + } + + help_dialog_->show(); +} + + +// Load the game from saved preferences... +void +Sudoku::load_game() { + // Load the current values and state of each grid... + memset(grid_values_, 0, sizeof(grid_values_)); + + bool solved = true; + + for (int j = 0; j < 9; j ++) + for (int k = 0; k < 9; k ++) { + char name[255]; + int val; + + SudokuCell *cell = grid_cells_[j][k]; + + sprintf(name, "value%d.%d", j, k); + if (!prefs_.get(name, val, 0)) { + j = 9; + grid_values_[0][0] = 0; + break; + } + + grid_values_[j][k] = val; + + sprintf(name, "state%d.%d", j, k); + prefs_.get(name, val, 0); + cell->value(val); + + sprintf(name, "readonly%d.%d", j, k); + prefs_.get(name, val, 0); + cell->readonly(val); + + if (val) cell->color(FL_GRAY); + else { + cell->color(FL_LIGHT3); + solved = false; + } + + for (int m = 0; m < 8; m ++) { + sprintf(name, "test%d%d.%d", m, j, k); + prefs_.get(name, val, 0); + cell->test_value(val, m); + } + } + + // If we didn't load any values or the last game was solved, then + // create a new game automatically... + if (solved || !grid_values_[0][0]) new_game(time(NULL)); + else check_game(false); +} + + +// Mute/unmute sound... +void +Sudoku::mute_cb(Fl_Widget *widget, void *) { + Sudoku *s = (Sudoku *)(widget->window() ? widget->window() : widget); + + if (s->sound_) { + delete s->sound_; + s->sound_ = NULL; + prefs_.set("mute_sound", 1); + } else { + s->sound_ = new SudokuSound(); + prefs_.set("mute_sound", 0); + } +} + + +// Create a new game... +void +Sudoku::new_cb(Fl_Widget *widget, void *) { + Sudoku *s = (Sudoku *)(widget->window() ? widget->window() : widget); + + if (s->grid_cells_[0][0]->color() != FL_GREEN) { + if (!fl_choice("Are you sure you want to change the difficulty level and " + "discard the current game?", "Keep Current Game", "Start New Game", + NULL)) return; + } + + s->new_game(time(NULL)); +} + + +// Create a new game... +void +Sudoku::new_game(time_t seed) { + int j, k, m, n, t, count; + + + // Generate a new (valid) Sudoku grid... + seed_ = seed; + srand(seed); + + memset(grid_values_, 0, sizeof(grid_values_)); + + for (j = 0; j < 9; j += 3) { + for (k = 0; k < 9; k += 3) { + for (t = 1; t <= 9; t ++) { + for (count = 0; count < 20; count ++) { + m = j + (rand() % 3); + n = k + (rand() % 3); + if (!grid_values_[m][n]) { + int mm; + + for (mm = 0; mm < m; mm ++) + if (grid_values_[mm][n] == t) break; + + if (mm < m) continue; + + int nn; + + for (nn = 0; nn < n; nn ++) + if (grid_values_[m][nn] == t) break; + + if (nn < n) continue; + + grid_values_[m][n] = t; + break; + } + } + + if (count == 20) { + // Unable to find a valid puzzle so far, so start over... + k = 9; + j = -3; + memset(grid_values_, 0, sizeof(grid_values_)); + } + } + } + } + + // Start by making all cells editable + SudokuCell *cell; + + for (j = 0; j < 9; j ++) + for (k = 0; k < 9; k ++) { + cell = grid_cells_[j][k]; + + cell->value(0); + cell->readonly(0); + cell->color(FL_LIGHT3); + } + + // Show N cells... + count = 11 * (5 - difficulty_); + + int numbers[9]; + + for (j = 0; j < 9; j ++) numbers[j] = j + 1; + + while (count > 0) { + for (j = 0; j < 20; j ++) { + k = rand() % 9; + m = rand() % 9; + t = numbers[k]; + numbers[k] = numbers[m]; + numbers[m] = t; + } + + for (j = 0; count > 0 && j < 9; j ++) { + t = numbers[j]; + + for (k = 0; count > 0 && k < 9; k ++) { + cell = grid_cells_[j][k]; + + if (grid_values_[j][k] == t && !cell->readonly()) { + cell->value(grid_values_[j][k]); + cell->readonly(1); + cell->color(FL_GRAY); + + count --; + break; + } + } + } + } +} + + +// Return the next available value for a cell... +int +Sudoku::next_value(SudokuCell *c) { + int j, k, m, n; + + + for (j = 0; j < 9; j ++) { + for (k = 0; k < 9; k ++) + if (grid_cells_[j][k] == c) break; + + if (k < 9) break; + } + + if (j == 9) return 1; + + j -= j % 3; + k -= k % 3; + + int numbers[9]; + + memset(numbers, 0, sizeof(numbers)); + + for (m = 0; m < 3; m ++) + for (n = 0; n < 3; n ++) { + c = grid_cells_[j + m][k + n]; + if (c->value()) numbers[c->value() - 1] = 1; + } + + for (j = 0; j < 9; j ++) + if (!numbers[j]) return j + 1; + + return 1; +} + + +// Reset widget color to gray... +void +Sudoku::reset_cb(Fl_Widget *widget, void *) { + widget->color(FL_LIGHT3); + widget->redraw(); + + ((Sudoku *)(widget->window()))->check_game(false); +} + + +// Resize the window... +void +Sudoku::resize(int X, int Y, int W, int H) { + // Resize the window... + Fl_Window::resize(X, Y, W, H); + + // Save the new window geometry... + prefs_.set("x", X); + prefs_.set("y", Y); + prefs_.set("width", W); + prefs_.set("height", H); +} + + +// Restart game from beginning... +void +Sudoku::restart_cb(Fl_Widget *widget, void *) { + Sudoku *s = (Sudoku *)(widget->window()); + bool solved = true; + + for (int j = 0; j < 9; j ++) + for (int k = 0; k < 9; k ++) { + SudokuCell *cell = s->grid_cells_[j][k]; + + if (!cell->readonly()) { + solved = false; + int v = cell->value(); + cell->value(0); + cell->color(FL_LIGHT3); + if (v && s->sound_) s->sound_->play('A' + v - 1); + } + } + + if (solved) s->new_game(s->seed_); +} + + +// Save the current game state... +void +Sudoku::save_game() { + // Save the current values and state of each grid... + for (int j = 0; j < 9; j ++) + for (int k = 0; k < 9; k ++) { + char name[255]; + SudokuCell *cell = grid_cells_[j][k]; + + sprintf(name, "value%d.%d", j, k); + prefs_.set(name, grid_values_[j][k]); + + sprintf(name, "state%d.%d", j, k); + prefs_.set(name, cell->value()); + + sprintf(name, "readonly%d.%d", j, k); + prefs_.set(name, cell->readonly()); + + for (int m = 0; m < 8; m ++) { + sprintf(name, "test%d%d.%d", m, j, k); + prefs_.set(name, cell->test_value(m)); + } + } +} + + +// Set title of window... +void +Sudoku::set_title() { + static const char * const titles[] = { + "Sudoku - Easy", + "Sudoku - Medium", + "Sudoku - Hard", + "Sudoku - Impossible" + }; + + label(titles[difficulty_]); +} + + +// Solve the puzzle... +void +Sudoku::solve_cb(Fl_Widget *widget, void *) { + ((Sudoku *)(widget->window()))->solve_game(); +} + + +// Solve the puzzle... +void +Sudoku::solve_game() { + int j, k; + + for (j = 0; j < 9; j ++) { + for (k = 0; k < 9; k ++) { + SudokuCell *cell = grid_cells_[j][k]; + + cell->value(grid_values_[j][k]); + cell->readonly(1); + cell->color(FL_GRAY); + } + + if (sound_) sound_->play('A' + grid_cells_[j][8]->value() - 1); + } +} + + +// Main entry for game... +int +main(int argc, char *argv[]) { + Sudoku s; + + // Show the game... + s.show(argc, argv); + + // Load the previous game... + s.load_game(); + + // Run until the user quits... + return (Fl::run()); +} + + +// +// End of "$Id: sudoku.cxx 6973 2009-12-21 16:35:06Z AlbrechtS $". +// diff --git a/third_party/windows/fltk-1.1.10/test/sudoku.ico b/third_party/windows/fltk-1.1.10/test/sudoku.ico new file mode 100644 index 0000000..f5f1e4a Binary files /dev/null and b/third_party/windows/fltk-1.1.10/test/sudoku.ico differ diff --git a/third_party/windows/fltk-1.1.10/test/sudoku.rc b/third_party/windows/fltk-1.1.10/test/sudoku.rc new file mode 100644 index 0000000..107c9a6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/sudoku.rc @@ -0,0 +1,72 @@ +//Microsoft Developer Studio generated resource script. +// +#include "sudokurc.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +//#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +//LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "icons.h\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_ICON ICON DISCARDABLE "sudoku.ico" +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/third_party/windows/fltk-1.1.10/test/sudokurc.h b/third_party/windows/fltk-1.1.10/test/sudokurc.h new file mode 100644 index 0000000..9a6bc90 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/sudokurc.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by icons.rc +// +#define IDI_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 105 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/third_party/windows/fltk-1.1.10/test/symbols.cxx b/third_party/windows/fltk-1.1.10/test/symbols.cxx new file mode 100644 index 0000000..7e0000c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/symbols.cxx @@ -0,0 +1,159 @@ +// +// "$Id: symbols.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// Symbol test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int N = 0; +#define W 70 +#define H 70 +#define ROWS 6 +#define COLS 6 + +Fl_Window *window; +Fl_Value_Slider *orientation; +Fl_Value_Slider *size; + +void slider_cb(Fl_Widget *, void *) { + static char buf[80]; + int val = (int)orientation->value(); + int sze = (int)size->value(); + for (int i = window->children(); i--; ) { // all window children + Fl_Widget *wc = window->child(i); + const char *l = (const char *)(wc->user_data()); + if ( l && *l == '@' ) { // all children with '@' + l ++; + if ( wc->box() == FL_NO_BOX ) { // ascii legend? + if (val&&sze) sprintf(buf, "@@%+d%d%s", sze, val, l); + else if (val) sprintf(buf, "@@%d%s", val, l); + else if (sze) sprintf(buf, "@@%+d%s", sze, l); + else sprintf(buf, "@@%s", l); + } else { // box with symbol + if (val&&sze) sprintf(buf, "@%+d%d%s", sze, val, l); + else if (val) sprintf(buf, "@%d%s", val, l); + else if (sze) sprintf(buf, "@%+d%s", sze, l); + else sprintf(buf, "@%s", l); + } + wc->copy_label(buf); + } + } + window->redraw(); +} + +void bt(const char *name) { + int x = N%COLS; + int y = N/COLS; + char buf[255]; + N++; + x = x*W+10; + y = y*H+10; + sprintf(buf, "@%s", name); + Fl_Box *a = new Fl_Box(x,y,W-20,H-20); + a->box(FL_NO_BOX); + a->copy_label(buf); + a->align(FL_ALIGN_BOTTOM); + a->labelsize(11); + a->user_data((void *)name); + Fl_Box *b = new Fl_Box(x,y,W-20,H-20); + b->box(FL_UP_BOX); + b->copy_label(name); + b->labelcolor(FL_DARK3); + b->user_data((void *)name); +} + +int main(int argc, char ** argv) { + window = new Fl_Single_Window(COLS*W,ROWS*H+60); +bt("@->"); +bt("@>"); +bt("@>>"); +bt("@>|"); +bt("@>[]"); +bt("@|>"); +bt("@<-"); +bt("@<"); +bt("@<<"); +bt("@|<"); +bt("@[]<"); +bt("@<|"); +bt("@<->"); +bt("@-->"); +bt("@+"); +bt("@->|"); +bt("@||"); +bt("@arrow"); +bt("@returnarrow"); +bt("@square"); +bt("@circle"); +bt("@line"); +bt("@menu"); +bt("@UpArrow"); +bt("@DnArrow"); +bt("@search"); +bt("@FLTK"); +bt("@filenew"); +bt("@fileopen"); +bt("@filesave"); +bt("@filesaveas"); +bt("@fileprint"); +bt("@refresh"); +bt("@reload"); +bt("@undo"); +bt("@redo"); + + orientation = new Fl_Value_Slider( + (int)(window->w()*.05+.5), window->h()-40, + (int)(window->w()*.42+.5), 16, "Orientation"); + orientation->type(FL_HORIZONTAL); + orientation->range(0.0, 9.0); + orientation->value(0.0); + orientation->step(1); + orientation->callback(slider_cb, 0); + + size = new Fl_Value_Slider( + (int)(window->w()*.53+.5), window->h()-40, + (int)(window->w()*.42+.5), 16, "Size"); + size->type(FL_HORIZONTAL); + size->range(-3.0, 9.0); + size->value(0.0); + size->step(1); + size->callback(slider_cb, 0); + + window->resizable(window); + window->show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: symbols.cxx 5845 2007-05-20 00:01:06Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/tabs.fl b/third_party/windows/fltk-1.1.10/test/tabs.fl new file mode 100644 index 0000000..ae6477c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/tabs.fl @@ -0,0 +1,289 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0108 +header_name {.h} +code_name {.cxx} +Function {} {open +} { + Fl_Window foo_window { + label {Comparison of Fl_Tab (left) vs. Fl_Wizard (right)} open + xywh {423 205 642 337} type Double resizable visible + } { + Fl_Box {} { + label {class Fl_Tabs} + xywh {95 0 130 35} labeltype ENGRAVED_LABEL labelfont 1 + } + Fl_Tabs {} { + tooltip {the various index cards test different aspects of the Fl_Tabs widget} xywh {10 35 300 205} selection_color 4 labelcolor 7 resizable + } { + Fl_Group {} { + label {Label&1} open selected + tooltip {this Tab tests correct keyboard navigation between text input fields} xywh {10 60 300 180} selection_color 1 resizable + } { + Fl_Input {} { + label {input:} + tooltip {This is the first input field} xywh {60 80 240 40} + } + Fl_Input {} { + label {input2:} + xywh {60 120 240 30} + code0 {o->tooltip("");} + } + Fl_Input {} { + label {input3:} + xywh {60 150 240 80} + } + } + Fl_Group {} { + label {tab&2} open + tooltip {tab2 tests among other things the cooperation of modal windows and tabs} xywh {10 60 300 180} selection_color 2 hide + } { + Fl_Button {} { + label button1 + callback {fl_message("Test to see if this modal window prevents you from " + "changing the tabs. It should.");} + xywh {20 90 100 30} + code0 {\#include } + } + Fl_Input {} { + label {input in box2} + xywh {140 130 100 30} + } + Fl_Button {} { + label {This is stuff inside the Fl_Group "tab2"} + xywh {30 170 260 30} + } + Fl_Button {} { + label {Test event blocking by modal window} + callback {fl_message("Make sure you cannot change the tabs while this modal window is up");} + xywh {30 200 260 30} + code0 {\#include } + } + } + Fl_Group {} { + label {tab&3} open + tooltip {tab3 checks for correct keyboard navigation} xywh {10 60 300 180} selection_color 3 hide + } { + Fl_Button {} { + label button2 + xywh {20 90 60 80} + } + Fl_Button {} { + label button + xywh {80 90 60 80} + } + Fl_Button {} { + label button + xywh {140 90 60 80} + } + } + Fl_Group {} { + label {&tab4} open + tooltip {this tab show the issue of indicating a selcted tab if the tab layouts are very similar} xywh {10 60 300 180} selection_color 5 labeltype ENGRAVED_LABEL labelfont 2 hide + } { + Fl_Button {} { + label button2 + xywh {20 80 60 110} + } + Fl_Button {} { + label button + xywh {80 80 60 110} + } + Fl_Button {} { + label button + xywh {140 80 60 110} + } + } + Fl_Group {} { + label {@fileprint &print} open + tooltip {tab5 verifies if visibility requests are handled correctly} xywh {10 60 300 180} hide + } { + Fl_Button {} { + label button2 + tooltip {button2 has a different tooltp than tab5} xywh {20 75 60 80} + } + Fl_Button {} { + label button + xywh {90 75 60 80} + } + Fl_Clock {} { + label {Make sure this clock does not use processor time when this tab is hidden or window is iconized} + xywh {160 75 100 100} box OSHADOW_BOX color 238 selection_color 0 labelfont 8 labelsize 10 align 130 + } + Fl_Group {} {open + xywh {20 175 40 55} box THIN_DOWN_BOX color 173 align 16 + class Fl_Window + } {} + Fl_Group {} { + label {subwindows:} open + xywh {65 175 40 55} box THIN_DOWN_BOX color 167 + class Fl_Window + } {} + Fl_Group {} {open + xywh {110 175 40 55} box THIN_DOWN_BOX color 239 align 16 + class Fl_Window + } {} + } + } + Fl_Box {} { + label {class Fl_Wizard} + xywh {410 0 130 35} labeltype ENGRAVED_LABEL labelfont 1 + } + Fl_Wizard wWizard { + xywh {325 60 300 180} + } { + Fl_Group {} { + label Label1 open + tooltip {this Tab tests correct keyboard navigation between text input fields} xywh {325 60 300 180} selection_color 1 resizable + } { + Fl_Input {} { + label {input:} + tooltip {This is the first input field} xywh {375 80 240 40} + } + Fl_Input {} { + label {input2:} + xywh {375 120 240 30} + code0 {o->tooltip("");} + } + Fl_Input {} { + label {input3:} + xywh {375 150 240 80} + } + } + Fl_Group {} { + label tab2 open + tooltip {tab2 tests among other things the cooperation of modal windows and tabs} xywh {325 60 300 180} selection_color 2 hide + } { + Fl_Button {} { + label button1 + callback {fl_message("Test to see if this modal window prevents you from " + "changing the tabs. It should.");} + xywh {335 90 100 30} + code0 {\#include } + } + Fl_Input {} { + label {input in box2} + xywh {455 130 100 30} + } + Fl_Button {} { + label {This is stuff inside the Fl_Group "tab2"} + xywh {345 170 260 30} + } + Fl_Button {} { + label {Test event blocking by modal window} + callback {fl_message("Make sure you cannot change the tabs while this modal window is up");} + xywh {345 200 260 30} + code0 {\#include } + } + } + Fl_Group {} { + label tab3 open + tooltip {tab3 checks for correct keyboard navigation} xywh {325 60 300 180} selection_color 3 hide + } { + Fl_Button {} { + label button2 + xywh {335 90 60 80} + } + Fl_Button {} { + label button + xywh {395 90 60 80} + } + Fl_Button {} { + label button + xywh {455 90 60 80} + } + } + Fl_Group {} { + label tab4 open + tooltip {this tab show the issue of indicating a selcted tab if the tab layouts are very similar} xywh {325 60 300 180} selection_color 5 labelfont 2 hide + } { + Fl_Button {} { + label button2 + xywh {335 80 60 110} + } + Fl_Button {} { + label button + xywh {395 80 60 110} + } + Fl_Button {} { + label button + xywh {455 80 60 110} + } + } + Fl_Group {} { + label { tab5 } open + tooltip {tab5 verifies if visibility requests are handled correctly} xywh {325 60 300 180} labeltype ENGRAVED_LABEL hide + } { + Fl_Button {} { + label button2 + tooltip {button2 has a different tooltp than tab5} xywh {335 75 60 80} + } + Fl_Button {} { + label button + xywh {405 75 60 80} + } + Fl_Clock {} { + label {Make sure this clock does not use processor time when this tab is hidden or window is iconized} + xywh {475 75 100 100} box OSHADOW_BOX color 238 selection_color 0 labelfont 8 labelsize 10 align 130 + } + Fl_Group {} {open + xywh {335 175 40 55} box THIN_DOWN_BOX color 173 align 16 + class Fl_Window + } {} + Fl_Group {} { + label {subwindows:} open + xywh {380 175 40 55} box THIN_DOWN_BOX color 167 + class Fl_Window + } {} + Fl_Group {} {open + xywh {425 175 40 55} box THIN_DOWN_BOX color 239 align 16 + class Fl_Window + } {} + } + } + Fl_Group {} { + xywh {410 245 130 25} + } { + Fl_Button {} { + label {@|<} + callback {wWizard->value(wWizard->child(0));} + tooltip {go to first page [Home]} xywh {410 245 30 25} shortcut 0xff50 + } + Fl_Button {} { + label {@<} + callback {wWizard->prev();} + tooltip {go to previous page [left arrow]} xywh {440 245 30 25} shortcut 0xff51 + } + Fl_Button {} { + label {@>} + callback {wWizard->next();} + tooltip {go to next page in wizard [right arrow]} xywh {480 245 30 25} shortcut 0xff53 + } + Fl_Button {} { + label {@>|} + callback {int last = wWizard->children()-1; +wWizard->value(wWizard->child(last));} + tooltip {go to last page [End]} xywh {510 245 30 25} shortcut 0xff57 + } + } + Fl_Input {} { + label {inputA:} + xywh {60 255 130 25} + } + Fl_Input {} { + label {inputB:} + xywh {60 285 250 25} + } + Fl_Button {} { + label cancel + callback {exit(1);} + xywh {475 295 70 30} + code0 {\#include } + } + Fl_Return_Button {} { + label OK + callback {exit(0);} + xywh {555 295 70 30} + code0 {\#include } + } + } +} diff --git a/third_party/windows/fltk-1.1.10/test/threads.cxx b/third_party/windows/fltk-1.1.10/test/threads.cxx new file mode 100644 index 0000000..763e0ba --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/threads.cxx @@ -0,0 +1,173 @@ +// +// "$Id: threads.cxx 5849 2007-05-20 16:32:37Z matt $" +// +// Threading example program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include "config.h" + +#if HAVE_PTHREAD || defined(WIN32) +# include +# include +# include +# include +# include +# include "threads.h" +# include +# include + +Fl_Thread prime_thread; + +Fl_Browser *browser1, *browser2; +Fl_Value_Output *value1, *value2; +int start2 = 3; + +void magic_number_cb(void *p) +{ + Fl_Value_Output *w = (Fl_Value_Output*)p; + w->labelcolor(FL_RED); + w->redraw_label(); +} + +void* prime_func(void* p) +{ + Fl_Browser* browser = (Fl_Browser*) p; + Fl_Value_Output *value; + int n; + int step; + char proud = 0; + + if (browser == browser2) { + n = start2; + start2 += 2; + step = 12; + value = value2; + } else { + n = 3; + step = 2; + value = value1; + } + + // very simple prime number calculator ! + // + // The return at the end of this function can never be reached and thus + // will generate a warning with some compilers, however we need to have + // a return statement or other compilers will complain there is no return + // statement. To avoid warnings on all compilers, we fool the smart ones + // into beleiving that there is a chance that we reach the end by testing + // n>=0, knowing that logically, n will never be negative in this context. + if (n>=0) for (;;) { + int pp; + int hn = (int)sqrt((double)n); + + for (pp=3; pp<=hn; pp+=2) if ( n%pp == 0 ) break; + if (pp >= hn) { + char s[128]; + sprintf(s, "%d", n); + + // Obtain a lock before we access the browser widget... + Fl::lock(); + + browser->add(s); + browser->bottomline(browser->size()); + if (n > value->value()) value->value(n); + n += step; + + // Release the lock... + Fl::unlock(); + + // Send a message to the main thread, at which point it will + // process any pending redraws for our browser widget. The + // message we pass here isn't used for anything, so we could also + // just pass NULL. + Fl::awake(p); + if (n>10000 && !proud) { + proud = 1; + Fl::awake(magic_number_cb, value); + } + } else { + // This should not be necessary since "n" and "step" are local variables, + // however it appears that at least MacOS X has some threading issues + // that cause semi-random corruption of the (stack) variables. + Fl::lock(); + n += step; + Fl::unlock(); + } + } + return 0L; +} + +int main(int argc, char **argv) +{ + Fl_Window* w = new Fl_Window(200, 200, "Single Thread"); + browser1 = new Fl_Browser(0, 0, 200, 175); + w->resizable(browser1); + value1 = new Fl_Value_Output(100, 175, 200, 25, "Max Prime:"); + w->end(); + w->show(argc, argv); + w = new Fl_Window(200, 200, "Six Threads"); + browser2 = new Fl_Browser(0, 0, 200, 175); + w->resizable(browser2); + value2 = new Fl_Value_Output(100, 175, 200, 25, "Max Prime:"); + w->end(); + w->show(); + + browser1->add("Prime numbers:"); + browser2->add("Prime numbers:"); + + // Enable multi-thread support by locking from the main + // thread. Fl::wait() and Fl::run() call Fl::unlock() and + // Fl::lock() as needed to release control to the child threads + // when it is safe to do so... + Fl::lock(); + + // Start threads... + + // One thread displaying in one browser + fl_create_thread(prime_thread, prime_func, browser1); + + // Several threads displaying in another browser + fl_create_thread(prime_thread, prime_func, browser2); + fl_create_thread(prime_thread, prime_func, browser2); + fl_create_thread(prime_thread, prime_func, browser2); + fl_create_thread(prime_thread, prime_func, browser2); + fl_create_thread(prime_thread, prime_func, browser2); + fl_create_thread(prime_thread, prime_func, browser2); + + Fl::run(); + + return 0; +} +#else +# include + +int main() { + fl_alert("Sorry, threading not supported on this platform!"); +} +#endif // HAVE_PTHREAD || WIN32 + + +// +// End of "$Id: threads.cxx 5849 2007-05-20 16:32:37Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/test/threads.h b/third_party/windows/fltk-1.1.10/test/threads.h new file mode 100644 index 0000000..7d4e956 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/threads.h @@ -0,0 +1,81 @@ +// +// "$Id: threads.h 5519 2006-10-11 03:12:15Z mike $" +// +// Simple threading API for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +// Inline classes to provide portable support for threads and mutexes. +// +// FLTK does not use this (it has an internal mutex implementation +// that is used if Fl::lock() is called). This header file's only +// purpose is so we can write portable demo programs. It may be useful +// or an inspiration to people who want to try writing multithreaded +// programs themselves. +// +// FLTK has no multithreaded support unless the main thread calls Fl::lock(). +// This main thread is the only thread allowed to call Fl::run() or Fl::wait(). +// From then on FLTK will be locked except when the main thread is actually +// waiting for events from the user. Other threads must call Fl::lock() and +// Fl::unlock() to surround calls to FLTK (such as to change widgets or +// redraw them). + +#ifndef Threads_H +# define Threads_H + +# if HAVE_PTHREAD_H +// Use POSIX threading... + +# include + +typedef pthread_t Fl_Thread; + +static int fl_create_thread(Fl_Thread& t, void *(*f) (void *), void* p) { + return pthread_create((pthread_t*)&t, 0, f, p); +} + +# elif defined(WIN32) && !defined(__WATCOMC__) // Use Windows threading... + +# include +# include + +typedef unsigned long Fl_Thread; + +static int fl_create_thread(Fl_Thread& t, void *(*f) (void *), void* p) { + return t = (Fl_Thread)_beginthread((void( __cdecl * )( void * ))f, 0, p); +} + +# elif defined(__WATCOMC__) +# include + +typedef unsigned long Fl_Thread; + +static int fl_create_thread(Fl_Thread& t, void *(*f) (void *), void* p) { + return t = (Fl_Thread)_beginthread((void(* )( void * ))f, 32000, p); +} +# endif // !HAVE_PTHREAD_H +#endif // !Threads_h + +// +// End of "$Id: threads.h 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/tile.cxx b/third_party/windows/fltk-1.1.10/test/tile.cxx new file mode 100644 index 0000000..22cd278 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/tile.cxx @@ -0,0 +1,92 @@ +// +// "$Id: tile.cxx 5912 2007-06-18 09:35:42Z matt $" +// +// Tile test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include + +int main(int argc, char** argv) { + Fl_Window window(300,300); + window.box(FL_NO_BOX); + window.resizable(window); + Fl_Tile tile(0,0,300,300); + Fl_Box box0(0,0,150,150,"0"); + box0.box(FL_DOWN_BOX); + box0.color(9); + box0.labelsize(36); + box0.align(FL_ALIGN_CLIP); + Fl_Window w1(150,0,150,150,"1"); + w1.box(FL_NO_BOX); + Fl_Box box1(0,0,150,150,"1\nThis is a\nchild\nwindow"); + box1.box(FL_DOWN_BOX); + box1.color(19); + box1.labelsize(18); + box1.align(FL_ALIGN_CLIP); + w1.resizable(box1); + w1.end(); + + // Fl_Tile tile2(0,150,150,150); + Fl_Box box2a(0,150,70,150,"2a"); + box2a.box(FL_DOWN_BOX); + box2a.color(12); + box2a.labelsize(36); + box2a.align(FL_ALIGN_CLIP); + Fl_Box box2b(70,150,80,150,"2b"); + box2b.box(FL_DOWN_BOX); + box2b.color(13); + box2b.labelsize(36); + box2b.align(FL_ALIGN_CLIP); + //tile2.end(); + + //Fl_Tile tile3(150,150,150,150); + Fl_Box box3a(150,150,150,70,"3a"); + box3a.box(FL_DOWN_BOX); + box3a.color(12); + box3a.labelsize(36); + box3a.align(FL_ALIGN_CLIP); + Fl_Box box3b(150,150+70,150,80,"3b"); + box3b.box(FL_DOWN_BOX); + box3b.color(13); + box3b.labelsize(36); + box3b.align(FL_ALIGN_CLIP); + //tile3.end(); + + Fl_Box r(10,0,300-10,300-10); + tile.resizable(r); + // r.box(FL_BORDER_FRAME); + + tile.end(); + window.end(); + w1.show(); + window.show(argc,argv); + return Fl::run(); +} + +// +// End of "$Id: tile.cxx 5912 2007-06-18 09:35:42Z matt $". +// diff --git a/third_party/windows/fltk-1.1.10/test/tiled_image.cxx b/third_party/windows/fltk-1.1.10/test/tiled_image.cxx new file mode 100644 index 0000000..b9f27ac --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/tiled_image.cxx @@ -0,0 +1,105 @@ +// +// "$Id: tiled_image.cxx 5519 2006-10-11 03:12:15Z mike $" +// +// Fl_Tiled_Image test program for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2006 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pixmaps/tile.xpm" + +Fl_Button *b; +Fl_Window *w; + +void button_cb(Fl_Widget *,void *) { + w->hide(); +} + +#include +#if !defined(WIN32) && !defined(__APPLE__) +#include "list_visuals.cxx" +#endif + +int visid = -1; +int arg(int argc, char **argv, int &i) { + if (argv[i][1] == 'v') { + if (i+1 >= argc) return 0; + visid = atoi(argv[i+1]); + i += 2; + return 2; + } + return 0; +} + +int main(int argc, char **argv) { +#if !defined(WIN32) && !defined(__APPLE__) + int i = 1; + + Fl::args(argc,argv,i,arg); + + if (visid >= 0) { + fl_open_display(); + XVisualInfo templt; int num; + templt.visualid = visid; + fl_visual = XGetVisualInfo(fl_display, VisualIDMask, &templt, &num); + if (!fl_visual) { + fprintf(stderr, "No visual with id %d, use one of:\n",visid); + list_visuals(); + exit(1); + } + fl_colormap = XCreateColormap(fl_display, RootWindow(fl_display,fl_screen), + fl_visual->visual, AllocNone); + fl_xpixel(FL_BLACK); // make sure black is allocated in overlay visuals + } else { + Fl::visual(FL_RGB); + } +#endif + + Fl_Window window(400,400); ::w = &window; + Fl_Group group(0,0,400,400); + group.image(new Fl_Tiled_Image(new Fl_Pixmap((const char * const *)tile_xpm))); + group.align(FL_ALIGN_INSIDE); + + Fl_Button b(340,365,50,25,"Close"); ::b = &b; + b.callback(button_cb); + + group.end(); + + window.resizable(group); + window.end(); + window.show(argc, argv); + + return Fl::run(); +} + +// +// End of "$Id: tiled_image.cxx 5519 2006-10-11 03:12:15Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/trackball.c b/third_party/windows/fltk-1.1.10/test/trackball.c new file mode 100644 index 0000000..8025e31 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/trackball.c @@ -0,0 +1,324 @@ +/* + * (c) Copyright 1993, 1994, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * Permission to use, copy, modify, and distribute this software for + * any purpose and without fee is hereby granted, provided that the above + * copyright notice appear in all copies and that both the copyright notice + * and this permission notice appear in supporting documentation, and that + * the name of Silicon Graphics, Inc. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. + * + * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" + * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON + * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, + * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY + * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, + * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF + * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. + * + * US Government Users Restricted Rights + * Use, duplication, or disclosure by the Government is subject to + * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph + * (c)(1)(ii) of the Rights in Technical Data and Computer Software + * clause at DFARS 252.227-7013 and/or in similar or successor + * clauses in the FAR or the DOD or NASA FAR Supplement. + * Unpublished-- rights reserved under the copyright laws of the + * United States. Contractor/manufacturer is Silicon Graphics, + * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. + * + * OpenGL(TM) is a trademark of Silicon Graphics, Inc. + */ +/* + * Trackball code: + * + * Implementation of a virtual trackball. + * Implemented by Gavin Bell, lots of ideas from Thant Tessman and + * the August '88 issue of Siggraph's "Computer Graphics," pp. 121-129. + * + * Vector manip code: + * + * Original code from: + * David M. Ciemiewicz, Mark Grossman, Henry Moreton, and Paul Haeberli + * + * Much mucking with by: + * Gavin Bell + */ +#include +#include "trackball.h" + +/* + * This size should really be based on the distance from the center of + * rotation to the point on the object underneath the mouse. That + * point would then track the mouse as closely as possible. This is a + * simple example, though, so that is left as an Exercise for the + * Programmer. + */ +#define TRACKBALLSIZE (0.8) + +/* + * Local function prototypes (not defined in trackball.h) + */ +static float tb_project_to_sphere(float, float, float); +static void normalize_quat(float [4]); + +void +vzero(float *v) +{ + v[0] = 0.0; + v[1] = 0.0; + v[2] = 0.0; +} + +void +vset(float *v, float x, float y, float z) +{ + v[0] = x; + v[1] = y; + v[2] = z; +} + +void +vsub(const float *src1, const float *src2, float *dst) +{ + dst[0] = src1[0] - src2[0]; + dst[1] = src1[1] - src2[1]; + dst[2] = src1[2] - src2[2]; +} + +void +vcopy(const float *v1, float *v2) +{ + register int i; + for (i = 0 ; i < 3 ; i++) + v2[i] = v1[i]; +} + +void +vcross(const float *v1, const float *v2, float *cross) +{ + float temp[3]; + + temp[0] = (v1[1] * v2[2]) - (v1[2] * v2[1]); + temp[1] = (v1[2] * v2[0]) - (v1[0] * v2[2]); + temp[2] = (v1[0] * v2[1]) - (v1[1] * v2[0]); + vcopy(temp, cross); +} + +float +vlength(const float *v) +{ + return sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); +} + +void +vscale(float *v, float div) +{ + v[0] *= div; + v[1] *= div; + v[2] *= div; +} + +void +vnormal(float *v) +{ + vscale(v,1.0/vlength(v)); +} + +float +vdot(const float *v1, const float *v2) +{ + return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]; +} + +void +vadd(const float *src1, const float *src2, float *dst) +{ + dst[0] = src1[0] + src2[0]; + dst[1] = src1[1] + src2[1]; + dst[2] = src1[2] + src2[2]; +} + +/* + * Ok, simulate a track-ball. Project the points onto the virtual + * trackball, then figure out the axis of rotation, which is the cross + * product of P1 P2 and O P1 (O is the center of the ball, 0,0,0) + * Note: This is a deformed trackball-- is a trackball in the center, + * but is deformed into a hyperbolic sheet of rotation away from the + * center. This particular function was chosen after trying out + * several variations. + * + * It is assumed that the arguments to this routine are in the range + * (-1.0 ... 1.0) + */ +void +trackball(float q[4], float p1x, float p1y, float p2x, float p2y) +{ + float a[3]; /* Axis of rotation */ + float phi; /* how much to rotate about axis */ + float p1[3], p2[3], d[3]; + float t; + + if (p1x == p2x && p1y == p2y) { + /* Zero rotation */ + vzero(q); + q[3] = 1.0; + return; + } + + /* + * First, figure out z-coordinates for projection of P1 and P2 to + * deformed sphere + */ + vset(p1,p1x,p1y,tb_project_to_sphere(TRACKBALLSIZE,p1x,p1y)); + vset(p2,p2x,p2y,tb_project_to_sphere(TRACKBALLSIZE,p2x,p2y)); + + /* + * Now, we want the cross product of P1 and P2 + */ + vcross(p2,p1,a); + + /* + * Figure out how much to rotate around that axis. + */ + vsub(p1,p2,d); + t = vlength(d) / (2.0*TRACKBALLSIZE); + + /* + * Avoid problems with out-of-control values... + */ + if (t > 1.0) t = 1.0; + if (t < -1.0) t = -1.0; + phi = 2.0 * asin(t); + + axis_to_quat(a,phi,q); +} + +/* + * Given an axis and angle, compute quaternion. + */ +void +axis_to_quat(float a[3], float phi, float q[4]) +{ + vnormal(a); + vcopy(a,q); + vscale(q,sin(phi/2.0)); + q[3] = cos(phi/2.0); +} + +/* + * Project an x,y pair onto a sphere of radius r OR a hyperbolic sheet + * if we are away from the center of the sphere. + */ +static float +tb_project_to_sphere(float r, float x, float y) +{ + float d, t, z; + + d = sqrt(x*x + y*y); + if (d < r * 0.70710678118654752440) { /* Inside sphere */ + z = sqrt(r*r - d*d); + } else { /* On hyperbola */ + t = r / 1.41421356237309504880; + z = t*t / d; + } + return z; +} + +/* + * Given two rotations, e1 and e2, expressed as quaternion rotations, + * figure out the equivalent single rotation and stuff it into dest. + * + * This routine also normalizes the result every RENORMCOUNT times it is + * called, to keep error from creeping in. + * + * NOTE: This routine is written so that q1 or q2 may be the same + * as dest (or each other). + */ + +#define RENORMCOUNT 97 + +void +add_quats(float q1[4], float q2[4], float dest[4]) +{ + static int count=0; + float t1[4], t2[4], t3[4]; + float tf[4]; + + vcopy(q1,t1); + vscale(t1,q2[3]); + + vcopy(q2,t2); + vscale(t2,q1[3]); + + vcross(q2,q1,t3); + vadd(t1,t2,tf); + vadd(t3,tf,tf); + tf[3] = q1[3] * q2[3] - vdot(q1,q2); + + dest[0] = tf[0]; + dest[1] = tf[1]; + dest[2] = tf[2]; + dest[3] = tf[3]; + + if (++count > RENORMCOUNT) { + count = 0; + normalize_quat(dest); + } +} + +/* + * Quaternions always obey: a^2 + b^2 + c^2 + d^2 = 1.0 + * If they don't add up to 1.0, dividing by their magnitued will + * renormalize them. + * + * Note: See the following for more information on quaternions: + * + * - Shoemake, K., Animating rotation with quaternion curves, Computer + * Graphics 19, No 3 (Proc. SIGGRAPH'85), 245-254, 1985. + * - Pletinckx, D., Quaternion calculus as a basic tool in computer + * graphics, The Visual Computer 5, 2-13, 1989. + */ +static void +normalize_quat(float q[4]) +{ + int i; + float mag; + + mag = (q[0]*q[0] + q[1]*q[1] + q[2]*q[2] + q[3]*q[3]); + for (i = 0; i < 4; i++) q[i] /= mag; +} + +/* + * Build a rotation matrix, given a quaternion rotation. + * + */ +void +build_rotmatrix(float m[4][4], float q[4]) +{ + m[0][0] = 1.0 - 2.0 * (q[1] * q[1] + q[2] * q[2]); + m[0][1] = 2.0 * (q[0] * q[1] - q[2] * q[3]); + m[0][2] = 2.0 * (q[2] * q[0] + q[1] * q[3]); + m[0][3] = 0.0; + + m[1][0] = 2.0 * (q[0] * q[1] + q[2] * q[3]); + m[1][1]= 1.0 - 2.0 * (q[2] * q[2] + q[0] * q[0]); + m[1][2] = 2.0 * (q[1] * q[2] - q[0] * q[3]); + m[1][3] = 0.0; + + m[2][0] = 2.0 * (q[2] * q[0] - q[1] * q[3]); + m[2][1] = 2.0 * (q[1] * q[2] + q[0] * q[3]); + m[2][2] = 1.0 - 2.0 * (q[1] * q[1] + q[0] * q[0]); + m[2][3] = 0.0; + + m[3][0] = 0.0; + m[3][1] = 0.0; + m[3][2] = 0.0; + m[3][3] = 1.0; +} + diff --git a/third_party/windows/fltk-1.1.10/test/trackball.h b/third_party/windows/fltk-1.1.10/test/trackball.h new file mode 100644 index 0000000..6f201f7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/trackball.h @@ -0,0 +1,78 @@ +/* + * (c) Copyright 1993, 1994, Silicon Graphics, Inc. + * ALL RIGHTS RESERVED + * Permission to use, copy, modify, and distribute this software for + * any purpose and without fee is hereby granted, provided that the above + * copyright notice appear in all copies and that both the copyright notice + * and this permission notice appear in supporting documentation, and that + * the name of Silicon Graphics, Inc. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. + * + * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" + * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR + * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON + * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, + * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY + * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, + * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF + * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN + * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. + * + * US Government Users Restricted Rights + * Use, duplication, or disclosure by the Government is subject to + * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph + * (c)(1)(ii) of the Rights in Technical Data and Computer Software + * clause at DFARS 252.227-7013 and/or in similar or successor + * clauses in the FAR or the DOD or NASA FAR Supplement. + * Unpublished-- rights reserved under the copyright laws of the + * United States. Contractor/manufacturer is Silicon Graphics, + * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. + * + * OpenGL(TM) is a trademark of Silicon Graphics, Inc. + */ +/* + * trackball.h + * A virtual trackball implementation + * Written by Gavin Bell for Silicon Graphics, November 1988. + */ + +/* + * Pass the x and y coordinates of the last and current positions of + * the mouse, scaled so they are from (-1.0 ... 1.0). + * + * The resulting rotation is returned as a quaternion rotation in the + * first paramater. + */ +void +trackball(float q[4], float p1x, float p1y, float p2x, float p2y); + +/* + * Given two quaternions, add them together to get a third quaternion. + * Adding quaternions to get a compound rotation is analagous to adding + * translations to get a compound translation. When incrementally + * adding rotations, the first argument here should be the new + * rotation, the second and third the total rotation (which will be + * over-written with the resulting new total rotation). + */ +void +add_quats(float *q1, float *q2, float *dest); + +/* + * A useful function, builds a rotation matrix in Matrix based on + * given quaternion. + */ +void +build_rotmatrix(float m[4][4], float q[4]); + +/* + * This function computes a quaternion based on an axis (defined by + * the given vector) and an angle about which to rotate. The angle is + * expressed in radians. The result is put into the third argument. + */ +void +axis_to_quat(float a[3], float phi, float q[4]); + diff --git a/third_party/windows/fltk-1.1.10/test/unittests.cxx b/third_party/windows/fltk-1.1.10/test/unittests.cxx new file mode 100644 index 0000000..5bc6ba4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/unittests.cxx @@ -0,0 +1,299 @@ +// +// "$Id: unittests.cxx 5845 2007-05-20 00:01:06Z mike $" +// +// Unit tests for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2005 by Bill Spitzak and others. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 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 +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#include +#include +#include +#include +#include +#include + +Fl_Window *win = 0; + +int point_test_ix, line_test_ix, rect_test_ix, viewport_test_ix, circle_test_ix; + +void changePageCB(Fl_Widget*, void *ixvp) { + long ix = (long)ixvp; + long i = 0, n = win->children(); + for ( ; ichild(i)->hide(); + if (ix>=n || ix<0) ix = n-1; + win->child(ix)->show(); +} + +void newButton(int x, int y, int w, int h, const char *l, int ix, const char *tt) { + Fl_Button *b = new Fl_Button(x, y, w, h, l); + b->tooltip(tt); + b->callback(changePageCB, (void*)ix); +} + +void createMenuPage() { + Fl_Group *page, *g; + page = new Fl_Group(0, 0, 600, 600); + g = new Fl_Group(100, 20, 460, 26, "drawing:"); + g->align(FL_ALIGN_LEFT); + newButton(100+2, 22, 22, 22, "1", point_test_ix, "Testing pixel drawing"); + newButton(125+2, 22, 22, 22, "2", line_test_ix, "Testing fl_line"); + newButton(150+2, 22, 22, 22, "3", rect_test_ix, "Testing fl_rect"); + newButton(175+2, 22, 22, 22, "4", viewport_test_ix, "Testing viewport alignment"); + newButton(200+2, 22, 22, 22, "5", circle_test_ix, "Testing circle and oval drawing"); + g->end(); + page->end(); +} + +Fl_Group *beginTestPage(const char *l) { + int ix = win->children(); + Fl_Group *g = new Fl_Group(0, 0, win->w(), win->h()); + g->box(FL_FLAT_BOX); + g->hide(); + newButton(20, 20, 20, 20, "M", -1, "Return to main menu"); + newButton(20, 40, 20, 20, "@<", ix-1, "previous test"); + newButton(20, 60, 20, 20, "@>", ix+1, "next test"); + Fl_Box *bx = new Fl_Box(60, 20, win->w()-80, 100, l); + bx->box(FL_ENGRAVED_BOX); + bx->align(FL_ALIGN_INSIDE|FL_ALIGN_WRAP); + return g; +} + +//------- test the point drawing capabilities of this implementation ---------- +class PointTest : public Fl_Widget { +public: PointTest(int x, int y, int w, int h) : Fl_Widget(x, y, w, h) {} + void draw() { + int a = x(), b = y(); + fl_color(FL_BLACK); + fl_rect(x(), y(), w(), h()); + fl_point(a+10, b+10); fl_point(a+20, b+20); + fl_point(a+10, b+20); fl_point(a+20, b+10); + fl_color(FL_RED); a = x()+70; + fl_point(a+10, b+10); fl_point(a+20, b+20); + fl_point(a+10, b+20); fl_point(a+20, b+10); + fl_color(FL_GREEN); a = x(); b = y()+70; + fl_point(a+10, b+10); fl_point(a+20, b+20); + fl_point(a+10, b+20); fl_point(a+20, b+10); + fl_color(FL_BLUE); a = x()+70; + fl_point(a+10, b+10); fl_point(a+20, b+20); + fl_point(a+10, b+20); fl_point(a+20, b+10); + } +}; +void fl_point_test() { + point_test_ix = win->children(); + Fl_Group *page = beginTestPage( + "testing the fl_point call\n" + "You should see four pixels each in black, red, green and blue. " + "Make sure that pixels are not anti-aliased (blured across multiple pixels)!" + ); + new PointTest(20, 140, 100, 100); + page->end(); +} + +//------- test the line drawing capabilities of this implementation ---------- +class LineTest : public Fl_Widget { +public: LineTest(int x, int y, int w, int h) : Fl_Widget(x, y, w, h) {} + void draw() { + int a = x(), b = y(); fl_color(FL_BLACK); fl_rect(a, b, w(), h()); + // testing fl_xyline(x, y, x1) + fl_color(FL_RED); fl_point(a+10, b+10); fl_point(a+20, b+10); + fl_color(FL_BLACK); fl_xyline(a+10, b+10, a+20); + // testing fl_xyline(x, y, x1, y2); + fl_color(FL_RED); fl_point(a+10, b+20); fl_point(a+20, b+20); + fl_point(a+20, b+30); + fl_color(FL_BLACK); fl_xyline(a+10, b+20, a+20, b+30); + // testing fl_xyline(x, y, x1, y2, x3); + fl_color(FL_RED); fl_point(a+10, b+40); fl_point(a+20, b+40); + fl_point(a+20, b+50); fl_point(a+30, b+50); + fl_color(FL_BLACK); fl_xyline(a+10, b+40, a+20, b+50, a+30); + //+++ add testing for the fl_yxline commands! + // testing fl_loop(x,y, x,y, x,y, x, y) + fl_color(FL_RED); fl_point(a+60, b+60); fl_point(a+90, b+60); + fl_point(a+60, b+90); fl_point(a+90, b+90); + fl_color(FL_BLACK); + fl_loop(a+60, b+60, a+90, b+60, a+90, b+90, a+60, b+90); + } +}; +void fl_line_test() { + line_test_ix = win->children(); + Fl_Group *page = beginTestPage( + "testing the integer based fl_line calls\n" + "No red pixels should be visible. " + "If you see bright red pixels, the line drawing alignment is off, " + "or the last pixel in a line does not get drawn. " + "If you see dark red pixels, anti-aliasing must be switched off." + ); + new LineTest(20, 140, 100, 100); + page->end(); +} + +//------- test the line drawing capabilities of this implementation ---------- +class RectTest : public Fl_Widget { +public: RectTest(int x, int y, int w, int h) : Fl_Widget(x, y, w, h) {} + void draw() { + int a = x(), b = y(); fl_color(FL_BLACK); fl_rect(a, b, w(), h()); + // testing fl_rect() with positive size + fl_color(FL_RED); fl_loop(a+10, b+10, a+40, b+10, a+40, b+40, a+10, b+40); + fl_color(FL_GREEN); fl_loop(a+ 9, b+ 9, a+41, b+ 9, a+41, b+41, a+ 9, b+41); + fl_color(FL_GREEN); fl_loop(a+11, b+11, a+39, b+11, a+39, b+39, a+11, b+39); + fl_color(FL_BLACK); fl_rect(a+10, b+10, 31, 31); + // testing fl_rect() with positive size + fl_color(FL_RED); fl_loop(a+60, b+60, a+90, b+60, a+90, b+90, a+60, b+90); + fl_color(FL_GREEN); fl_loop(a+59, b+59, a+91, b+59, a+91, b+91, a+59, b+91); + fl_color(FL_BLACK); fl_rectf(a+60, b+60, 31, 31); + } +}; +void fl_rect_test() { + rect_test_ix = win->children(); + Fl_Group *page = beginTestPage( + "testing the fl_rect call\n" + "No red pixels should be visible. " + "If you see bright red lines, or if parts of the green frames are hidden, " + "the rect drawing alignment is off. " + ); + new RectTest(20, 140, 100, 100); + page->end(); +} + +//------- test the line drawing capabilities of this implementation ---------- +class ViewportTest : public Fl_Widget { + int pos; +public: ViewportTest(int x, int y, int w, int h, int p) : Fl_Widget(x, y, w, h), + pos(p) {} + void draw() { + if (pos&1) { + fl_color(FL_RED); fl_yxline(x()+w(), y(), y()+h()); + fl_color(FL_GREEN); fl_yxline(x()+w()-1, y(), y()+h()); + } else { + fl_color(FL_RED); fl_yxline(x()-1, y(), y()+h()); + fl_color(FL_GREEN); fl_yxline(x(), y(), y()+h()); + } + if (pos&2) { + fl_color(FL_RED); fl_xyline(x(), y()+h(), x()+w()); + fl_color(FL_GREEN); fl_xyline(x(), y()+h()-1, x()+w()); + } else { + fl_color(FL_RED); fl_xyline(x(), y()-1, x()+w()); + fl_color(FL_GREEN); fl_xyline(x(), y(), x()+w()); + } + fl_color(FL_BLACK); + fl_loop(x()+3, y()+3, x()+w()-4, y()+3, x()+w()-4, y()+h()-4, x()+3, y()+h()-4); + } +}; +void fl_viewport_test() { + viewport_test_ix = win->children(); + Fl_Group *page = beginTestPage( + "testing viewport alignment\n" + "Only green lines should be visible. " + "If red lines are visible in the corners of this window, " + "your viewport alignment and clipping is off. " + "If there is a space between the green lines and the window border, " + "the viewport is off, but some clipping may be working. " + "Also, your window size may be off to begin with." + ); + new ViewportTest(0, 0, 20, 20, 0); + new ViewportTest(page->w()-20, 0, 20, 20, 1); + new ViewportTest(0, page->h()-20, 20, 20, 2); + new ViewportTest(page->w()-20,page->h()-20, 20, 20, 3); + page->end(); +} + +//------- test the circle drawing capabilities of this implementation ---------- +class CircleTest : public Fl_Widget { +public: CircleTest(int x, int y, int w, int h) : Fl_Widget(x, y, w, h) {} + void draw() { + int a = x(), b = y(); fl_color(FL_BLACK); fl_rect(a, b, 100, 100); + // test fl_arc for full circles + fl_color(FL_GREEN); fl_rect(a+ 9, b+ 9, 33, 33); + fl_color(FL_RED); fl_xyline(a+24, b+10, a+27); fl_xyline(a+24, b+40, a+27); + fl_yxline(a+10, b+24, b+27); fl_yxline(a+40, b+24, b+27); + fl_color(FL_BLACK); fl_arc(a+10, b+10, 31, 31, 0.0, 360.0); + // test fl_arc segmet 1 + fl_color(FL_GREEN); fl_rect(a+54, b+ 4, 43, 43); + fl_rect(a+54, b+4, 18, 18); fl_rect(a+79, b+29, 18, 18); + fl_color(FL_RED); fl_point(a+55, b+30); fl_point(a+70, b+45); + fl_point(a+80, b+5); fl_point(a+95, b+20); + fl_color(FL_BLACK); fl_arc(a+65, b+ 5, 31, 31, -35.0, 125.0); + // test fl_arc segmet 2 + fl_color(FL_BLACK); fl_arc(a+55, b+15, 31, 31, 145.0, 305.0); + // test fl_pie for full circles + fl_color(FL_RED); fl_xyline(a+24, b+60, a+27); fl_xyline(a+24, b+90, a+27); + fl_yxline(a+10, b+74, b+77); fl_yxline(a+40, b+74, b+77); + fl_color(FL_GREEN); fl_rect(a+ 9, b+59, 33, 33); + fl_color(FL_BLACK); fl_pie(a+10, b+60, 31, 31, 0.0, 360.0); + // test fl_pie segmet 1 + fl_color(FL_GREEN); fl_rect(a+54, b+54, 43, 43); + fl_rect(a+54, b+54, 18, 18); fl_rect(a+79, b+79, 18, 18); + fl_point(a+79, b+71); fl_point(a+71, b+79); + fl_color(FL_RED); fl_point(a+55, b+80); fl_point(a+70, b+95); + fl_point(a+80, b+55); fl_point(a+95, b+70); + fl_point(a+81, b+69); fl_point(a+69, b+81); + fl_color(FL_BLACK); fl_pie(a+65, b+55, 31, 31, -30.0, 120.0); + // test fl_pie segmet 2 + fl_color(FL_BLACK); fl_pie(a+55, b+65, 31, 31, 150.0, 300.0); + //---- oval testing (horizontal squish) + a = x()+120; b = y(); fl_color(FL_BLACK); fl_rect(a, b, 100, 100); + fl_color(FL_GREEN); + fl_rect(a+19, b+9, 63, 33); fl_rect(a+19, b+59, 63, 33); + fl_color(FL_BLACK); + fl_arc(a+20, b+10, 61, 31, 0, 360); fl_pie(a+20, b+60, 61, 31, 0, 360); + //---- oval testing (horizontal squish) + a = x()+240; b = y(); fl_color(FL_BLACK); fl_rect(a, b, 100, 100); + fl_color(FL_GREEN); + fl_rect(a+9, b+19, 33, 63); fl_rect(a+59, b+19, 33, 63); + fl_color(FL_BLACK); + fl_arc(a+10, b+20, 31, 61, 0, 360); fl_pie(a+60, b+20, 31, 61, 0, 360); + } +}; +void fl_circle_test() { + circle_test_ix = win->children(); + Fl_Group *page = beginTestPage( + "testing int drawing of circles and ovals (fl_arc, fl_pie)\n" + "No red lines should be visible. " + "If you see bright red pixels, the circle drawing alignment is off. " + "If you see dark red pixels, your syste supports anti-aliasing " + "which should be of no concern. " + "The green rectangles should not be touched by circle drawings." + ); + new CircleTest(20, 140, 340, 100); + page->end(); +} + +int main(int argc, char **argv) { + win = new Fl_Window(600, 600, "Unit Tests for FLTK"); + // --- list all tests + fl_point_test(); + fl_line_test(); + fl_rect_test(); + fl_viewport_test(); + fl_circle_test(); + // --- last page is the menu + createMenuPage(); + win->end(); + win->show(argc, argv); + return Fl::run(); +} + + +// +// End of "$Id: unittests.cxx 5845 2007-05-20 00:01:06Z mike $". +// diff --git a/third_party/windows/fltk-1.1.10/test/valuators.fl b/third_party/windows/fltk-1.1.10/test/valuators.fl new file mode 100644 index 0000000..8c53b4d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/test/valuators.fl @@ -0,0 +1,198 @@ +# data file for the Fltk User Interface Designer (fluid) +version 1.0107 +header_name {.h} +code_name {.cxx} +Function {callback(Fl_Widget* o, void*)} {open private return_type void +} { + code {printf("%g \\r", ((Fl_Valuator*)o)->value()); +fflush(stdout);} {} +} + +Function {} {open +} { + Fl_Window {} { + label {Valuator classes, showing values for type()} open + xywh {479 151 580 510} type Double color 43 selection_color 43 + code0 {\#include } visible + } { + Fl_Box {} { + label Fl_Slider + xywh {10 10 280 210} box ENGRAVED_BOX labelfont 1 align 17 + } + Fl_Slider {} { + label 0 + callback callback + tooltip {Vertical Slider} xywh {30 45 20 145} selection_color 1 labelsize 8 align 1 + } + Fl_Slider {} { + label FL_VERT_FILL_SLIDER + callback callback + xywh {70 55 20 145} type {Vert Fill} selection_color 1 labelsize 8 + } + Fl_Slider {} { + label FL_VERT_NICE_SLIDER + callback callback + xywh {105 45 20 145} type {Vert Knob} box FLAT_BOX color 10 selection_color 1 labelsize 8 align 1 + } + Fl_Slider {} { + label FL_HORIZONTAL + callback callback + xywh {140 80 130 20} type Horizontal selection_color 1 labelsize 8 + } + Fl_Slider {} { + label FL_HOR_FILL_SLIDER + callback callback + xywh {140 120 130 20} type {Horz Fill} selection_color 1 labelsize 8 + } + Fl_Slider {} { + label FL_HOR_NICE_SLIDER + callback callback + xywh {140 160 130 20} type {Horz Knob} box FLAT_BOX color 10 selection_color 1 labelsize 8 + } + Fl_Box {} { + label Fl_Value_Slider + xywh {10 230 280 210} box ENGRAVED_BOX labelfont 1 align 17 + } + Fl_Value_Slider {} { + label 0 + callback callback + tooltip {Value Slider} xywh {30 260 30 145} selection_color 1 labelsize 8 align 1 + } + Fl_Value_Slider {} { + label FL_VERT_FILL_SLIDER + callback callback + xywh {70 275 30 140} type {Vert Fill} selection_color 1 labelsize 8 + } + Fl_Value_Slider {} { + label FL_VERT_NICE_SLIDER + callback callback + xywh {110 260 20 145} type {Vert Knob} box FLAT_BOX color 10 selection_color 1 labelsize 8 align 1 + } + Fl_Value_Slider {} { + label FL_HOR_SLIDER + callback callback + xywh {140 290 130 20} type Horizontal selection_color 1 labelsize 8 + } + Fl_Value_Slider {} { + label FL_HOR_FILL_SLIDER + callback callback + xywh {140 330 130 20} type {Horz Fill} selection_color 1 labelsize 8 + } + Fl_Value_Slider {} { + label FL_HOR_NICE_SLIDER + callback callback + xywh {140 370 130 20} type {Horz Knob} box FLAT_BOX color 10 selection_color 1 labelsize 8 + } + Fl_Box {} { + label Fl_Value_Input + xywh {10 450 135 50} box ENGRAVED_BOX labelfont 1 align 17 + } + Fl_Value_Input {} { + label 0 + callback callback + tooltip {Value Input} xywh {30 470 105 25} labelsize 8 maximum 100 step 0.1 + } + Fl_Box {} { + label Fl_Value_Output + xywh {155 450 135 50} box ENGRAVED_BOX labelfont 1 align 17 + } + Fl_Value_Output {} { + label 0 + callback callback + tooltip {Value Output} xywh {170 470 105 25} labelsize 8 maximum 100 step 0.1 + } + Fl_Box {} { + label { Fl_Scrollbar} + xywh {300 10 130 120} box ENGRAVED_BOX labelfont 1 align 21 + } + Fl_Scrollbar {} { + label FL_HORIZONTAL + callback callback + tooltip {Horizontal Scrollbar} xywh {305 65 95 20} type Horizontal labelsize 8 maximum 100 value 20 + } + Fl_Scrollbar {} { + label 0 + callback callback + tooltip {Vertical Scrollbar} xywh {400 20 20 105} labelsize 8 align 1 maximum 100 + } + Fl_Box {} { + label Fl_Adjuster + xywh {440 10 130 120} box ENGRAVED_BOX labelfont 1 align 17 + } + Fl_Adjuster {} { + label {w()>h()} + callback callback + tooltip {Horizontal Adjuster} xywh {450 60 75 25} labelsize 8 + } + Fl_Adjuster {} { + label {w()angles(0,315);} + } + Fl_Dial {} { + label FL_LINE_DIAL + callback callback + tooltip {Line Dial} xywh {400 295 65 65} type Line color 10 selection_color 1 labelsize 8 value 0.5 + } + Fl_Dial {} { + label FL_FILL_DIAL + callback callback + tooltip {Fill Dial} xywh {480 295 65 65} type Fill color 10 selection_color 1 labelsize 8 value 1 + code0 {o->angles(0,360);} + } + Fl_Box {} { + label Fl_Roller + xywh {300 385 150 115} box ENGRAVED_BOX labelfont 1 align 17 + } + Fl_Roller {} { + label 0 + callback callback + tooltip {Vertical Roller} xywh {315 390 20 95} labelsize 8 + } + Fl_Roller {} { + label FL_HORIZONTAL + callback callback + tooltip {Horizontal Roller} xywh {345 430 90 20} type Horizontal labelsize 8 + } + Fl_Box {} { + label {Some widgets have color(FL_GREEN) and color2(FL_RED) to show the areas these effect.} selected + xywh {460 385 110 115} box BORDER_FRAME color 0 selection_color 0 labelsize 11 align 128 + } + } +} diff --git a/third_party/windows/fltk-1.1.10/vc2005/CubeView.vcproj b/third_party/windows/fltk-1.1.10/vc2005/CubeView.vcproj new file mode 100644 index 0000000..0264eee --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/CubeView.vcproj @@ -0,0 +1,304 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/adjuster.vcproj b/third_party/windows/fltk-1.1.10/vc2005/adjuster.vcproj new file mode 100644 index 0000000..13c7420 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/adjuster.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/arc.vcproj b/third_party/windows/fltk-1.1.10/vc2005/arc.vcproj new file mode 100644 index 0000000..79beb27 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/arc.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/ask.vcproj b/third_party/windows/fltk-1.1.10/vc2005/ask.vcproj new file mode 100644 index 0000000..a6a7e28 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/ask.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/bitmap.vcproj b/third_party/windows/fltk-1.1.10/vc2005/bitmap.vcproj new file mode 100644 index 0000000..c31f830 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/bitmap.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/boxtype.vcproj b/third_party/windows/fltk-1.1.10/vc2005/boxtype.vcproj new file mode 100644 index 0000000..c66c5d4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/boxtype.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/browser.vcproj b/third_party/windows/fltk-1.1.10/vc2005/browser.vcproj new file mode 100644 index 0000000..6941757 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/browser.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/button.vcproj b/third_party/windows/fltk-1.1.10/vc2005/button.vcproj new file mode 100644 index 0000000..093db13 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/button.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/buttons.vcproj b/third_party/windows/fltk-1.1.10/vc2005/buttons.vcproj new file mode 100644 index 0000000..e882857 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/buttons.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/checkers.vcproj b/third_party/windows/fltk-1.1.10/vc2005/checkers.vcproj new file mode 100644 index 0000000..1c9af4b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/checkers.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/clock.vcproj b/third_party/windows/fltk-1.1.10/vc2005/clock.vcproj new file mode 100644 index 0000000..247ed34 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/clock.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/colbrowser.vcproj b/third_party/windows/fltk-1.1.10/vc2005/colbrowser.vcproj new file mode 100644 index 0000000..0822bbe --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/colbrowser.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/color_chooser.vcproj b/third_party/windows/fltk-1.1.10/vc2005/color_chooser.vcproj new file mode 100644 index 0000000..7d82eec --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/color_chooser.vcproj @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/config.h b/third_party/windows/fltk-1.1.10/vc2005/config.h new file mode 100644 index 0000000..df43887 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/config.h @@ -0,0 +1,195 @@ +/* + * "$Id: config.h 4454 2005-07-24 18:41:30Z matt $" + * + * Configuration file for the Fast Light Tool Kit (FLTK) for Visual C++. + * + * Copyright 1998-2005 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems to "fltk-bugs@fltk.org". + */ + +/* + * Where to find files... + */ + +#define FLTK_DATADIR "C:/FLTK" +#define FLTK_DOCDIR "C:/FLTK/DOC" + +/* + * BORDER_WIDTH: + * + * Thickness of FL_UP_BOX and FL_DOWN_BOX. Current 1,2, and 3 are + * supported. 3 is the historic FLTK look. 2 looks more like Microsoft + * Windows, KDE, and Qt, and is the default when building for Windows. + * 1 is a plausible future evolution... Note that this may be simulated + * at runtime by redefining the boxtypes using Fl::set_boxtype(). + */ + +#define BORDER_WIDTH 2 + +/* + * HAVE_GL: + * + * Do you have OpenGL? Set this to 0 if you don't have or plan to use + * OpenGL, and FLTK will be smaller. + */ + +#define HAVE_GL 1 + +/* + * HAVE_GL_GLU_H: + * + * Do you have the OpenGL Utility Library header file? + * (many broken Mesa RPMs do not...) + */ + +#define HAVE_GL_GLU_H 1 + +/* + * USE_COLORMAP: + * + * Setting this to zero will save a good deal of code (especially for + * fl_draw_image), but FLTK will only work on TrueColor visuals. + */ + +#define USE_COLORMAP 1 + +/* + * HAVE_XDBE: + * + * Do we have the X double-buffer extension? + */ + +#define HAVE_XDBE 0 + +/* + * USE_XDBE: + * + * Actually try to use the double-buffer extension? Set this to zero + * disable use of XDBE without breaking the list_visuals program. + */ + +#define USE_XDBE HAVE_XDBE + +/* + * HAVE_OVERLAY: + * + * Use the X overlay extension? FLTK will try to use an overlay + * visual for Fl_Overlay_Window, the Gl_Window overlay, and for the + * menus. Setting this to zero will remove a substantial amount of + * code from FLTK. Overlays have only been tested on SGI servers! + */ + +#define HAVE_OVERLAY 0 + +/* + * HAVE_GL_OVERLAY: + * + * It is possible your GL has an overlay even if X does not. If so, + * set this to 1. + */ + +#define HAVE_GL_OVERLAY 1 + +/* + * WORDS_BIGENDIAN: + * + * Byte order of your machine: 1 = big-endian, 0 = little-endian. + */ + +#define WORDS_BIGENDIAN 0 + +/* + * U16, U32, U64: + * + * Types used by fl_draw_image. One of U32 or U64 must be defined. + * U16 is optional but FLTK will work better with it! + */ + +#define U16 unsigned short +#define U32 unsigned +#undef U64 + +/* + * HAVE_DIRENT_H, HAVE_SYS_NDIR_H, HAVE_SYS_DIR_H, HAVE_NDIR_H, HAVE_SCANDIR: + * + * Where is (used only by fl_file_chooser and scandir). + */ + +/*#undef HAVE_DIRENT_H */ +/*#undef HAVE_SYS_NDIR_H */ +/*#undef HAVE_SYS_DIR_H */ +/*#undef HAVE_NDIR_H */ +/*#undef HAVE_SCANDIR */ + +/* + * Possibly missing sprintf-style functions: + */ + +#undef HAVE_VSNPRINTF +#undef HAVE_SNPRINTF + +/* + * String functions... + */ + +#define HAVE_STRCASECMP 1 +/*#undef HAVE_STRLCAT*/ +/*#undef HAVE_STRLCPY*/ + +/* + * Do we have POSIX locale support? + */ + +#define HAVE_LOCALE_H 1 +#define HAVE_LOCALECONV 1 + +/* + * HAVE_POLL: + * + * Use poll() if we don't have select(). + */ + +#define HAVE_POLL 0 + +/* + * Do we have various image libraries? + */ + +#define HAVE_LIBPNG +#define HAVE_LIBZ +#define HAVE_LIBJPEG + +/* + * Which header file do we include for libpng? + */ + +#define HAVE_PNG_H +#undef HAVE_LIBPNG_PNG_H + +/* + * Do we have the png_xyz() functions? + */ + +#define HAVE_PNG_GET_VALID +#define HAVE_PNG_SET_TRNS_TO_ALPHA + + +/* + * End of "$Id: config.h 4454 2005-07-24 18:41:30Z matt $". + */ diff --git a/third_party/windows/fltk-1.1.10/vc2005/cube.vcproj b/third_party/windows/fltk-1.1.10/vc2005/cube.vcproj new file mode 100644 index 0000000..ac26f82 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/cube.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/cursor.vcproj b/third_party/windows/fltk-1.1.10/vc2005/cursor.vcproj new file mode 100644 index 0000000..7cc3f17 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/cursor.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/curve.vcproj b/third_party/windows/fltk-1.1.10/vc2005/curve.vcproj new file mode 100644 index 0000000..61b16f4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/curve.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/demo.vcproj b/third_party/windows/fltk-1.1.10/vc2005/demo.vcproj new file mode 100644 index 0000000..9c3e3f3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/demo.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/doublebuffer.vcproj b/third_party/windows/fltk-1.1.10/vc2005/doublebuffer.vcproj new file mode 100644 index 0000000..6474a45 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/doublebuffer.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/editor.vcproj b/third_party/windows/fltk-1.1.10/vc2005/editor.vcproj new file mode 100644 index 0000000..77fce7f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/editor.vcproj @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/fast_slow.vcproj b/third_party/windows/fltk-1.1.10/vc2005/fast_slow.vcproj new file mode 100644 index 0000000..22f80f9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/fast_slow.vcproj @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/file_chooser.vcproj b/third_party/windows/fltk-1.1.10/vc2005/file_chooser.vcproj new file mode 100644 index 0000000..52509d3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/file_chooser.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/fltk.lib.vcproj b/third_party/windows/fltk-1.1.10/vc2005/fltk.lib.vcproj new file mode 100644 index 0000000..cb69d5c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/fltk.lib.vcproj @@ -0,0 +1,3353 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/fltk.sln b/third_party/windows/fltk-1.1.10/vc2005/fltk.sln new file mode 100644 index 0000000..78c7795 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/fltk.sln @@ -0,0 +1,727 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CubeView", "CubeView.vcproj", "{E30BB28D-DFA0-479C-B670-8CD872224B38}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "adjuster", "adjuster.vcproj", "{51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "arc", "arc.vcproj", "{39ADA7A1-A2C1-4F0B-8B92-04E335570C27}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ask", "ask.vcproj", "{DB6BAA16-C589-448F-9AB5-5969016549EB}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bitmap", "bitmap.vcproj", "{65B5BB3F-EE54-4604-B49B-7676AED83AAB}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boxtype", "boxtype.vcproj", "{E212D4B4-63D9-4D8D-84DB-45C8BC191462}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "browser", "browser.vcproj", "{2352F92C-8663-4637-B919-D76F0A9EC05E}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "button", "button.vcproj", "{0363AC35-F325-4C24-9DB9-E83337D55787}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "buttons", "buttons.vcproj", "{67CE1C24-B0C0-4CD6-8D0F-68513C2398B9}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "checkers", "checkers.vcproj", "{92EEF887-8305-4D00-86B7-D3F98CC7AD87}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "clock", "clock.vcproj", "{122160ED-446E-4B15-8CB4-A2058DC7269A}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "colbrowser", "colbrowser.vcproj", "{D0BC7525-99E7-4247-B860-1B3CF2FF8165}" + ProjectSection(ProjectDependencies) = postProject + {C17BAB42-F00B-4F71-9DF6-A921511C89EE} = {C17BAB42-F00B-4F71-9DF6-A921511C89EE} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "color_chooser", "color_chooser.vcproj", "{BDACB9FC-6769-4A2D-A636-36CC25E3AC75}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cube", "cube.vcproj", "{0973844B-3E5F-4C38-95FF-E8935243D287}" + ProjectSection(ProjectDependencies) = postProject + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cursor", "cursor.vcproj", "{0D1DB0EE-E997-4550-85D4-BDE209B75AD6}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curve", "curve.vcproj", "{27D45BA6-A403-4A71-B6D6-57DC0CEDCE15}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo", "demo.vcproj", "{09427220-8C9C-498A-8D50-1638D3FB87E5}" + ProjectSection(ProjectDependencies) = postProject + {1C1B5A00-5F5D-4290-A07B-8A5A4A78570A} = {1C1B5A00-5F5D-4290-A07B-8A5A4A78570A} + {8D8D210D-F628-48BB-9127-D8003DF22018} = {8D8D210D-F628-48BB-9127-D8003DF22018} + {7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF} = {7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF} + {AE750416-51BA-485C-BD76-EF11B4536EE8} = {AE750416-51BA-485C-BD76-EF11B4536EE8} + {DB6BAA16-C589-448F-9AB5-5969016549EB} = {DB6BAA16-C589-448F-9AB5-5969016549EB} + {78079B1F-152B-4E83-87CB-364586AB3AAC} = {78079B1F-152B-4E83-87CB-364586AB3AAC} + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {67CE1C24-B0C0-4CD6-8D0F-68513C2398B9} = {67CE1C24-B0C0-4CD6-8D0F-68513C2398B9} + {D0BC7525-99E7-4247-B860-1B3CF2FF8165} = {D0BC7525-99E7-4247-B860-1B3CF2FF8165} + {ADA2462A-3656-41D2-B8A8-8D942AA0F8E9} = {ADA2462A-3656-41D2-B8A8-8D942AA0F8E9} + {2352F92C-8663-4637-B919-D76F0A9EC05E} = {2352F92C-8663-4637-B919-D76F0A9EC05E} + {28D24031-1A17-497A-B926-59CF78076DED} = {28D24031-1A17-497A-B926-59CF78076DED} + {37C32832-DCE4-4BAA-9306-826064B30CCB} = {37C32832-DCE4-4BAA-9306-826064B30CCB} + {2E03AF33-56A1-4366-B016-184CD96F3B56} = {2E03AF33-56A1-4366-B016-184CD96F3B56} + {0363AC35-F325-4C24-9DB9-E83337D55787} = {0363AC35-F325-4C24-9DB9-E83337D55787} + {DF2A883A-7356-4603-9CB1-E8F1E6B1549D} = {DF2A883A-7356-4603-9CB1-E8F1E6B1549D} + {65B5BB3F-EE54-4604-B49B-7676AED83AAB} = {65B5BB3F-EE54-4604-B49B-7676AED83AAB} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {46771042-C840-4314-BA3C-C5BC2FBD7CBB} = {46771042-C840-4314-BA3C-C5BC2FBD7CBB} + {23F17042-704E-4198-8017-A8584E884CF7} = {23F17042-704E-4198-8017-A8584E884CF7} + {C17BAB42-F00B-4F71-9DF6-A921511C89EE} = {C17BAB42-F00B-4F71-9DF6-A921511C89EE} + {3B0BF144-5D75-4D4A-BF75-7347186C808F} = {3B0BF144-5D75-4D4A-BF75-7347186C808F} + {6927F349-29DF-4D60-BC8F-5A3F5E133735} = {6927F349-29DF-4D60-BC8F-5A3F5E133735} + {0973844B-3E5F-4C38-95FF-E8935243D287} = {0973844B-3E5F-4C38-95FF-E8935243D287} + {E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE} = {E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {B1749154-F87B-489D-B4B0-ABD5ED20A96F} = {B1749154-F87B-489D-B4B0-ABD5ED20A96F} + {45797F58-624B-4FA0-A7A3-5956114D8215} = {45797F58-624B-4FA0-A7A3-5956114D8215} + {289C605C-94CC-437F-836B-2FE41528EEEC} = {289C605C-94CC-437F-836B-2FE41528EEEC} + {97541B63-87AA-4ACE-BBF5-175F8D1389EC} = {97541B63-87AA-4ACE-BBF5-175F8D1389EC} + {EDDBF169-77C1-496E-9EFE-E500107E6E97} = {EDDBF169-77C1-496E-9EFE-E500107E6E97} + {45236F71-7031-40BC-ADCD-0535A64C04B0} = {45236F71-7031-40BC-ADCD-0535A64C04B0} + {AF932F77-1804-4DA4-A6DC-950795D6AFC1} = {AF932F77-1804-4DA4-A6DC-950795D6AFC1} + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {BFE8CC78-6B58-4305-A096-796A3088BB26} = {BFE8CC78-6B58-4305-A096-796A3088BB26} + {C3E7B77C-EED2-4046-9A30-9446C6F096A0} = {C3E7B77C-EED2-4046-9A30-9446C6F096A0} + {4DFA9F84-0457-4FE4-8008-283270610487} = {4DFA9F84-0457-4FE4-8008-283270610487} + {58A83386-65E6-4F22-8712-8B6B7E62913D} = {58A83386-65E6-4F22-8712-8B6B7E62913D} + {92EEF887-8305-4D00-86B7-D3F98CC7AD87} = {92EEF887-8305-4D00-86B7-D3F98CC7AD87} + {3322F289-B025-4DB1-A7D1-FBA3840F8A0B} = {3322F289-B025-4DB1-A7D1-FBA3840F8A0B} + {CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1} = {CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1} + {E30BB28D-DFA0-479C-B670-8CD872224B38} = {E30BB28D-DFA0-479C-B670-8CD872224B38} + {3E822491-B134-43B0-A40E-9348FFAB527F} = {3E822491-B134-43B0-A40E-9348FFAB527F} + {B5271094-DE51-4E60-B4FA-D8F0BDB969FE} = {B5271094-DE51-4E60-B4FA-D8F0BDB969FE} + {1CA77C94-5785-4B38-B91A-1EAFBD885BC2} = {1CA77C94-5785-4B38-B91A-1EAFBD885BC2} + {39ADA7A1-A2C1-4F0B-8B92-04E335570C27} = {39ADA7A1-A2C1-4F0B-8B92-04E335570C27} + {27D45BA6-A403-4A71-B6D6-57DC0CEDCE15} = {27D45BA6-A403-4A71-B6D6-57DC0CEDCE15} + {51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B} = {51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B} + {E212D4B4-63D9-4D8D-84DB-45C8BC191462} = {E212D4B4-63D9-4D8D-84DB-45C8BC191462} + {F0B8F4BD-955D-43CB-980C-805364D04A25} = {F0B8F4BD-955D-43CB-980C-805364D04A25} + {2D29D6C9-B4A6-444C-A311-106A9C8A986F} = {2D29D6C9-B4A6-444C-A311-106A9C8A986F} + {CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3} = {CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3} + {7A2467D2-B03A-4964-A289-EF233EB39F69} = {7A2467D2-B03A-4964-A289-EF233EB39F69} + {AD5ACED4-F6EE-4AC0-B502-23CFD10EF603} = {AD5ACED4-F6EE-4AC0-B502-23CFD10EF603} + {D04E36D7-1C68-43E6-BE30-A7793CE3C799} = {D04E36D7-1C68-43E6-BE30-A7793CE3C799} + {9F3F86DA-3CC5-481F-8201-166933B5C8FF} = {9F3F86DA-3CC5-481F-8201-166933B5C8FF} + {1CD667DD-E7AE-4F36-A1F7-F41FB59786BE} = {1CD667DD-E7AE-4F36-A1F7-F41FB59786BE} + {8B25CCE0-0988-4999-AE65-5A5EE31BB44D} = {8B25CCE0-0988-4999-AE65-5A5EE31BB44D} + {F658ABE4-7FE1-4404-9B7C-55E0D660F1B3} = {F658ABE4-7FE1-4404-9B7C-55E0D660F1B3} + {AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E} = {AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E} + {122160ED-446E-4B15-8CB4-A2058DC7269A} = {122160ED-446E-4B15-8CB4-A2058DC7269A} + {0D1DB0EE-E997-4550-85D4-BDE209B75AD6} = {0D1DB0EE-E997-4550-85D4-BDE209B75AD6} + {0BDAEBF1-7A8D-434B-A543-4663464E972D} = {0BDAEBF1-7A8D-434B-A543-4663464E972D} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + {BDACB9FC-6769-4A2D-A636-36CC25E3AC75} = {BDACB9FC-6769-4A2D-A636-36CC25E3AC75} + {2147B9FD-7D65-4854-9770-D7B8767DB9AE} = {2147B9FD-7D65-4854-9770-D7B8767DB9AE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doublebuffer", "doublebuffer.vcproj", "{EDDBF169-77C1-496E-9EFE-E500107E6E97}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "editor", "editor.vcproj", "{0BDAEBF1-7A8D-434B-A543-4663464E972D}" + ProjectSection(ProjectDependencies) = postProject + {F0B8F4BD-955D-43CB-980C-805364D04A25} = {F0B8F4BD-955D-43CB-980C-805364D04A25} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fast_slow", "fast_slow.vcproj", "{2D29D6C9-B4A6-444C-A311-106A9C8A986F}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "file_chooser", "file_chooser.vcproj", "{6927F349-29DF-4D60-BC8F-5A3F5E133735}" + ProjectSection(ProjectDependencies) = postProject + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {6E8E1663-B88D-4454-ADF2-279666A93306} = {6E8E1663-B88D-4454-ADF2-279666A93306} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltk", "fltk.lib.vcproj", "{E070AAFC-9D03-41A3-BC7D-30887EA0D50F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltkdll", "fltkdll.vcproj", "{F0B8F4BD-955D-43CB-980C-805364D04A25}" + ProjectSection(ProjectDependencies) = postProject + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {289C605C-94CC-437F-836B-2FE41528EEEC} = {289C605C-94CC-437F-836B-2FE41528EEEC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltkforms", "fltkforms.vcproj", "{C17BAB42-F00B-4F71-9DF6-A921511C89EE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltkgl", "fltkgl.vcproj", "{F7974A9C-C255-4385-96BC-E24EE0816F7C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltkimages", "fltkimages.vcproj", "{6E8E1663-B88D-4454-ADF2-279666A93306}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fluid", "fluid.vcproj", "{8AED3078-8CD8-40C9-A8FF-46080024F1EB}" + ProjectSection(ProjectDependencies) = postProject + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {C17BAB42-F00B-4F71-9DF6-A921511C89EE} = {C17BAB42-F00B-4F71-9DF6-A921511C89EE} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {6E8E1663-B88D-4454-ADF2-279666A93306} = {6E8E1663-B88D-4454-ADF2-279666A93306} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fonts", "fonts.vcproj", "{DF2A883A-7356-4603-9CB1-E8F1E6B1549D}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "forms", "forms.vcproj", "{B1749154-F87B-489D-B4B0-ABD5ED20A96F}" + ProjectSection(ProjectDependencies) = postProject + {C17BAB42-F00B-4F71-9DF6-A921511C89EE} = {C17BAB42-F00B-4F71-9DF6-A921511C89EE} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fractals", "fractals.vcproj", "{58A83386-65E6-4F22-8712-8B6B7E62913D}" + ProjectSection(ProjectDependencies) = postProject + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fullscreen", "fullscreen.vcproj", "{2147B9FD-7D65-4854-9770-D7B8767DB9AE}" + ProjectSection(ProjectDependencies) = postProject + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gl_overlay", "gl_overlay.vcproj", "{8D8D210D-F628-48BB-9127-D8003DF22018}" + ProjectSection(ProjectDependencies) = postProject + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glpuzzle", "glpuzzle.vcproj", "{BFE8CC78-6B58-4305-A096-796A3088BB26}" + ProjectSection(ProjectDependencies) = postProject + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hello", "hello.vcproj", "{ADA2462A-3656-41D2-B8A8-8D942AA0F8E9}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "help", "help.vcproj", "{9F3F86DA-3CC5-481F-8201-166933B5C8FF}" + ProjectSection(ProjectDependencies) = postProject + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {6E8E1663-B88D-4454-ADF2-279666A93306} = {6E8E1663-B88D-4454-ADF2-279666A93306} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iconize", "iconize.vcproj", "{37C32832-DCE4-4BAA-9306-826064B30CCB}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "image", "image.vcproj", "{3322F289-B025-4DB1-A7D1-FBA3840F8A0B}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "inactive", "inactive.vcproj", "{B5271094-DE51-4E60-B4FA-D8F0BDB969FE}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "input", "input.vcproj", "{1C1B5A00-5F5D-4290-A07B-8A5A4A78570A}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keyboard", "keyboard.vcproj", "{4DFA9F84-0457-4FE4-8008-283270610487}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "label", "label.vcproj", "{C3E7B77C-EED2-4046-9A30-9446C6F096A0}" + ProjectSection(ProjectDependencies) = postProject + {C17BAB42-F00B-4F71-9DF6-A921511C89EE} = {C17BAB42-F00B-4F71-9DF6-A921511C89EE} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "line_style", "line_style.vcproj", "{8B25CCE0-0988-4999-AE65-5A5EE31BB44D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mandelbrot", "mandelbrot.vcproj", "{7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "menubar", "menubar.vcproj", "{78079B1F-152B-4E83-87CB-364586AB3AAC}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "message", "message.vcproj", "{E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minimum", "minimum.vcproj", "{F658ABE4-7FE1-4404-9B7C-55E0D660F1B3}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "navigation", "navigation.vcproj", "{AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "output", "output.vcproj", "{1CA77C94-5785-4B38-B91A-1EAFBD885BC2}" + ProjectSection(ProjectDependencies) = postProject + {C17BAB42-F00B-4F71-9DF6-A921511C89EE} = {C17BAB42-F00B-4F71-9DF6-A921511C89EE} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "overlay", "overlay.vcproj", "{3B0BF144-5D75-4D4A-BF75-7347186C808F}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pack", "pack.vcproj", "{CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pixmap", "pixmap.vcproj", "{1CD667DD-E7AE-4F36-A1F7-F41FB59786BE}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pixmap_browser", "pixmap_browser.vcproj", "{289C605C-94CC-437F-836B-2FE41528EEEC}" + ProjectSection(ProjectDependencies) = postProject + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {6E8E1663-B88D-4454-ADF2-279666A93306} = {6E8E1663-B88D-4454-ADF2-279666A93306} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "preferences", "preferences.vcproj", "{D04E36D7-1C68-43E6-BE30-A7793CE3C799}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "radio", "radio.vcproj", "{AD5ACED4-F6EE-4AC0-B502-23CFD10EF603}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "resize", "resize.vcproj", "{46771042-C840-4314-BA3C-C5BC2FBD7CBB}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "resizebox", "resizebox.vcproj", "{2E03AF33-56A1-4366-B016-184CD96F3B56}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scroll", "scroll.vcproj", "{97541B63-87AA-4ACE-BBF5-175F8D1389EC}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shape", "shape.vcproj", "{45797F58-624B-4FA0-A7A3-5956114D8215}" + ProjectSection(ProjectDependencies) = postProject + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "subwindow", "subwindow.vcproj", "{7A2467D2-B03A-4964-A289-EF233EB39F69}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sudoku", "sudoku.vcproj", "{AE750416-51BA-485C-BD76-EF11B4536EE8}" + ProjectSection(ProjectDependencies) = postProject + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {6E8E1663-B88D-4454-ADF2-279666A93306} = {6E8E1663-B88D-4454-ADF2-279666A93306} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "symbols", "symbols.vcproj", "{3E822491-B134-43B0-A40E-9348FFAB527F}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tabs", "tabs.vcproj", "{AF932F77-1804-4DA4-A6DC-950795D6AFC1}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "threads", "threads.vcproj", "{45236F71-7031-40BC-ADCD-0535A64C04B0}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tile", "tile.vcproj", "{28D24031-1A17-497A-B926-59CF78076DED}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tiled_image", "tiled_image.vcproj", "{23F17042-704E-4198-8017-A8584E884CF7}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "valuators", "valuators.vcproj", "{CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpeg", "jpeg.vcproj", "{08B82852-90B3-4767-A5D2-F0A4FCCB2377}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib.vcproj", "{E1D9CE3F-400D-40E8-AD0D-61C29B1847FF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libpng.vcproj", "{D640A221-F95A-40FF-AC0E-0E8B615C7681}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "input_choice", "input_choice.vcproj", "{50651D04-C8F7-4C2B-B412-0848573BDF88}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E30BB28D-DFA0-479C-B670-8CD872224B38}.Debug|Win32.ActiveCfg = Debug|Win32 + {E30BB28D-DFA0-479C-B670-8CD872224B38}.Debug|Win32.Build.0 = Debug|Win32 + {E30BB28D-DFA0-479C-B670-8CD872224B38}.Release|Win32.ActiveCfg = Release|Win32 + {E30BB28D-DFA0-479C-B670-8CD872224B38}.Release|Win32.Build.0 = Release|Win32 + {51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B}.Debug|Win32.ActiveCfg = Debug|Win32 + {51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B}.Debug|Win32.Build.0 = Debug|Win32 + {51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B}.Release|Win32.ActiveCfg = Release|Win32 + {51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B}.Release|Win32.Build.0 = Release|Win32 + {39ADA7A1-A2C1-4F0B-8B92-04E335570C27}.Debug|Win32.ActiveCfg = Debug|Win32 + {39ADA7A1-A2C1-4F0B-8B92-04E335570C27}.Debug|Win32.Build.0 = Debug|Win32 + {39ADA7A1-A2C1-4F0B-8B92-04E335570C27}.Release|Win32.ActiveCfg = Release|Win32 + {39ADA7A1-A2C1-4F0B-8B92-04E335570C27}.Release|Win32.Build.0 = Release|Win32 + {DB6BAA16-C589-448F-9AB5-5969016549EB}.Debug|Win32.ActiveCfg = Debug|Win32 + {DB6BAA16-C589-448F-9AB5-5969016549EB}.Debug|Win32.Build.0 = Debug|Win32 + {DB6BAA16-C589-448F-9AB5-5969016549EB}.Release|Win32.ActiveCfg = Release|Win32 + {DB6BAA16-C589-448F-9AB5-5969016549EB}.Release|Win32.Build.0 = Release|Win32 + {65B5BB3F-EE54-4604-B49B-7676AED83AAB}.Debug|Win32.ActiveCfg = Debug|Win32 + {65B5BB3F-EE54-4604-B49B-7676AED83AAB}.Debug|Win32.Build.0 = Debug|Win32 + {65B5BB3F-EE54-4604-B49B-7676AED83AAB}.Release|Win32.ActiveCfg = Release|Win32 + {65B5BB3F-EE54-4604-B49B-7676AED83AAB}.Release|Win32.Build.0 = Release|Win32 + {E212D4B4-63D9-4D8D-84DB-45C8BC191462}.Debug|Win32.ActiveCfg = Debug|Win32 + {E212D4B4-63D9-4D8D-84DB-45C8BC191462}.Debug|Win32.Build.0 = Debug|Win32 + {E212D4B4-63D9-4D8D-84DB-45C8BC191462}.Release|Win32.ActiveCfg = Release|Win32 + {E212D4B4-63D9-4D8D-84DB-45C8BC191462}.Release|Win32.Build.0 = Release|Win32 + {2352F92C-8663-4637-B919-D76F0A9EC05E}.Debug|Win32.ActiveCfg = Debug|Win32 + {2352F92C-8663-4637-B919-D76F0A9EC05E}.Debug|Win32.Build.0 = Debug|Win32 + {2352F92C-8663-4637-B919-D76F0A9EC05E}.Release|Win32.ActiveCfg = Release|Win32 + {2352F92C-8663-4637-B919-D76F0A9EC05E}.Release|Win32.Build.0 = Release|Win32 + {0363AC35-F325-4C24-9DB9-E83337D55787}.Debug|Win32.ActiveCfg = Debug|Win32 + {0363AC35-F325-4C24-9DB9-E83337D55787}.Debug|Win32.Build.0 = Debug|Win32 + {0363AC35-F325-4C24-9DB9-E83337D55787}.Release|Win32.ActiveCfg = Release|Win32 + {0363AC35-F325-4C24-9DB9-E83337D55787}.Release|Win32.Build.0 = Release|Win32 + {67CE1C24-B0C0-4CD6-8D0F-68513C2398B9}.Debug|Win32.ActiveCfg = Debug|Win32 + {67CE1C24-B0C0-4CD6-8D0F-68513C2398B9}.Debug|Win32.Build.0 = Debug|Win32 + {67CE1C24-B0C0-4CD6-8D0F-68513C2398B9}.Release|Win32.ActiveCfg = Release|Win32 + {67CE1C24-B0C0-4CD6-8D0F-68513C2398B9}.Release|Win32.Build.0 = Release|Win32 + {92EEF887-8305-4D00-86B7-D3F98CC7AD87}.Debug|Win32.ActiveCfg = Debug|Win32 + {92EEF887-8305-4D00-86B7-D3F98CC7AD87}.Debug|Win32.Build.0 = Debug|Win32 + {92EEF887-8305-4D00-86B7-D3F98CC7AD87}.Release|Win32.ActiveCfg = Release|Win32 + {92EEF887-8305-4D00-86B7-D3F98CC7AD87}.Release|Win32.Build.0 = Release|Win32 + {122160ED-446E-4B15-8CB4-A2058DC7269A}.Debug|Win32.ActiveCfg = Debug|Win32 + {122160ED-446E-4B15-8CB4-A2058DC7269A}.Debug|Win32.Build.0 = Debug|Win32 + {122160ED-446E-4B15-8CB4-A2058DC7269A}.Release|Win32.ActiveCfg = Release|Win32 + {122160ED-446E-4B15-8CB4-A2058DC7269A}.Release|Win32.Build.0 = Release|Win32 + {D0BC7525-99E7-4247-B860-1B3CF2FF8165}.Debug|Win32.ActiveCfg = Debug|Win32 + {D0BC7525-99E7-4247-B860-1B3CF2FF8165}.Debug|Win32.Build.0 = Debug|Win32 + {D0BC7525-99E7-4247-B860-1B3CF2FF8165}.Release|Win32.ActiveCfg = Release|Win32 + {D0BC7525-99E7-4247-B860-1B3CF2FF8165}.Release|Win32.Build.0 = Release|Win32 + {BDACB9FC-6769-4A2D-A636-36CC25E3AC75}.Debug|Win32.ActiveCfg = Debug|Win32 + {BDACB9FC-6769-4A2D-A636-36CC25E3AC75}.Debug|Win32.Build.0 = Debug|Win32 + {BDACB9FC-6769-4A2D-A636-36CC25E3AC75}.Release|Win32.ActiveCfg = Release|Win32 + {BDACB9FC-6769-4A2D-A636-36CC25E3AC75}.Release|Win32.Build.0 = Release|Win32 + {0973844B-3E5F-4C38-95FF-E8935243D287}.Debug|Win32.ActiveCfg = Debug|Win32 + {0973844B-3E5F-4C38-95FF-E8935243D287}.Debug|Win32.Build.0 = Debug|Win32 + {0973844B-3E5F-4C38-95FF-E8935243D287}.Release|Win32.ActiveCfg = Release|Win32 + {0973844B-3E5F-4C38-95FF-E8935243D287}.Release|Win32.Build.0 = Release|Win32 + {0D1DB0EE-E997-4550-85D4-BDE209B75AD6}.Debug|Win32.ActiveCfg = Debug|Win32 + {0D1DB0EE-E997-4550-85D4-BDE209B75AD6}.Debug|Win32.Build.0 = Debug|Win32 + {0D1DB0EE-E997-4550-85D4-BDE209B75AD6}.Release|Win32.ActiveCfg = Release|Win32 + {0D1DB0EE-E997-4550-85D4-BDE209B75AD6}.Release|Win32.Build.0 = Release|Win32 + {27D45BA6-A403-4A71-B6D6-57DC0CEDCE15}.Debug|Win32.ActiveCfg = Debug|Win32 + {27D45BA6-A403-4A71-B6D6-57DC0CEDCE15}.Debug|Win32.Build.0 = Debug|Win32 + {27D45BA6-A403-4A71-B6D6-57DC0CEDCE15}.Release|Win32.ActiveCfg = Release|Win32 + {27D45BA6-A403-4A71-B6D6-57DC0CEDCE15}.Release|Win32.Build.0 = Release|Win32 + {09427220-8C9C-498A-8D50-1638D3FB87E5}.Debug|Win32.ActiveCfg = Debug|Win32 + {09427220-8C9C-498A-8D50-1638D3FB87E5}.Debug|Win32.Build.0 = Debug|Win32 + {09427220-8C9C-498A-8D50-1638D3FB87E5}.Release|Win32.ActiveCfg = Release|Win32 + {09427220-8C9C-498A-8D50-1638D3FB87E5}.Release|Win32.Build.0 = Release|Win32 + {EDDBF169-77C1-496E-9EFE-E500107E6E97}.Debug|Win32.ActiveCfg = Debug|Win32 + {EDDBF169-77C1-496E-9EFE-E500107E6E97}.Debug|Win32.Build.0 = Debug|Win32 + {EDDBF169-77C1-496E-9EFE-E500107E6E97}.Release|Win32.ActiveCfg = Release|Win32 + {EDDBF169-77C1-496E-9EFE-E500107E6E97}.Release|Win32.Build.0 = Release|Win32 + {0BDAEBF1-7A8D-434B-A543-4663464E972D}.Debug|Win32.ActiveCfg = Debug|Win32 + {0BDAEBF1-7A8D-434B-A543-4663464E972D}.Debug|Win32.Build.0 = Debug|Win32 + {0BDAEBF1-7A8D-434B-A543-4663464E972D}.Release|Win32.ActiveCfg = Release|Win32 + {0BDAEBF1-7A8D-434B-A543-4663464E972D}.Release|Win32.Build.0 = Release|Win32 + {2D29D6C9-B4A6-444C-A311-106A9C8A986F}.Debug|Win32.ActiveCfg = Debug|Win32 + {2D29D6C9-B4A6-444C-A311-106A9C8A986F}.Debug|Win32.Build.0 = Debug|Win32 + {2D29D6C9-B4A6-444C-A311-106A9C8A986F}.Release|Win32.ActiveCfg = Release|Win32 + {2D29D6C9-B4A6-444C-A311-106A9C8A986F}.Release|Win32.Build.0 = Release|Win32 + {6927F349-29DF-4D60-BC8F-5A3F5E133735}.Debug|Win32.ActiveCfg = Debug|Win32 + {6927F349-29DF-4D60-BC8F-5A3F5E133735}.Debug|Win32.Build.0 = Debug|Win32 + {6927F349-29DF-4D60-BC8F-5A3F5E133735}.Release|Win32.ActiveCfg = Release|Win32 + {6927F349-29DF-4D60-BC8F-5A3F5E133735}.Release|Win32.Build.0 = Release|Win32 + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F}.Debug|Win32.ActiveCfg = Debug|Win32 + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F}.Debug|Win32.Build.0 = Debug|Win32 + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F}.Release|Win32.ActiveCfg = Release|Win32 + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F}.Release|Win32.Build.0 = Release|Win32 + {F0B8F4BD-955D-43CB-980C-805364D04A25}.Debug|Win32.ActiveCfg = Debug|Win32 + {F0B8F4BD-955D-43CB-980C-805364D04A25}.Debug|Win32.Build.0 = Debug|Win32 + {F0B8F4BD-955D-43CB-980C-805364D04A25}.Release|Win32.ActiveCfg = Release|Win32 + {F0B8F4BD-955D-43CB-980C-805364D04A25}.Release|Win32.Build.0 = Release|Win32 + {C17BAB42-F00B-4F71-9DF6-A921511C89EE}.Debug|Win32.ActiveCfg = Debug|Win32 + {C17BAB42-F00B-4F71-9DF6-A921511C89EE}.Debug|Win32.Build.0 = Debug|Win32 + {C17BAB42-F00B-4F71-9DF6-A921511C89EE}.Release|Win32.ActiveCfg = Release|Win32 + {C17BAB42-F00B-4F71-9DF6-A921511C89EE}.Release|Win32.Build.0 = Release|Win32 + {F7974A9C-C255-4385-96BC-E24EE0816F7C}.Debug|Win32.ActiveCfg = Debug|Win32 + {F7974A9C-C255-4385-96BC-E24EE0816F7C}.Debug|Win32.Build.0 = Debug|Win32 + {F7974A9C-C255-4385-96BC-E24EE0816F7C}.Release|Win32.ActiveCfg = Release|Win32 + {F7974A9C-C255-4385-96BC-E24EE0816F7C}.Release|Win32.Build.0 = Release|Win32 + {6E8E1663-B88D-4454-ADF2-279666A93306}.Debug|Win32.ActiveCfg = Debug|Win32 + {6E8E1663-B88D-4454-ADF2-279666A93306}.Debug|Win32.Build.0 = Debug|Win32 + {6E8E1663-B88D-4454-ADF2-279666A93306}.Release|Win32.ActiveCfg = Release|Win32 + {6E8E1663-B88D-4454-ADF2-279666A93306}.Release|Win32.Build.0 = Release|Win32 + {8AED3078-8CD8-40C9-A8FF-46080024F1EB}.Debug|Win32.ActiveCfg = Debug|Win32 + {8AED3078-8CD8-40C9-A8FF-46080024F1EB}.Debug|Win32.Build.0 = Debug|Win32 + {8AED3078-8CD8-40C9-A8FF-46080024F1EB}.Release|Win32.ActiveCfg = Release|Win32 + {8AED3078-8CD8-40C9-A8FF-46080024F1EB}.Release|Win32.Build.0 = Release|Win32 + {DF2A883A-7356-4603-9CB1-E8F1E6B1549D}.Debug|Win32.ActiveCfg = Debug|Win32 + {DF2A883A-7356-4603-9CB1-E8F1E6B1549D}.Debug|Win32.Build.0 = Debug|Win32 + {DF2A883A-7356-4603-9CB1-E8F1E6B1549D}.Release|Win32.ActiveCfg = Release|Win32 + {DF2A883A-7356-4603-9CB1-E8F1E6B1549D}.Release|Win32.Build.0 = Release|Win32 + {B1749154-F87B-489D-B4B0-ABD5ED20A96F}.Debug|Win32.ActiveCfg = Debug|Win32 + {B1749154-F87B-489D-B4B0-ABD5ED20A96F}.Debug|Win32.Build.0 = Debug|Win32 + {B1749154-F87B-489D-B4B0-ABD5ED20A96F}.Release|Win32.ActiveCfg = Release|Win32 + {B1749154-F87B-489D-B4B0-ABD5ED20A96F}.Release|Win32.Build.0 = Release|Win32 + {58A83386-65E6-4F22-8712-8B6B7E62913D}.Debug|Win32.ActiveCfg = Debug|Win32 + {58A83386-65E6-4F22-8712-8B6B7E62913D}.Debug|Win32.Build.0 = Debug|Win32 + {58A83386-65E6-4F22-8712-8B6B7E62913D}.Release|Win32.ActiveCfg = Release|Win32 + {58A83386-65E6-4F22-8712-8B6B7E62913D}.Release|Win32.Build.0 = Release|Win32 + {2147B9FD-7D65-4854-9770-D7B8767DB9AE}.Debug|Win32.ActiveCfg = Debug|Win32 + {2147B9FD-7D65-4854-9770-D7B8767DB9AE}.Debug|Win32.Build.0 = Debug|Win32 + {2147B9FD-7D65-4854-9770-D7B8767DB9AE}.Release|Win32.ActiveCfg = Release|Win32 + {2147B9FD-7D65-4854-9770-D7B8767DB9AE}.Release|Win32.Build.0 = Release|Win32 + {8D8D210D-F628-48BB-9127-D8003DF22018}.Debug|Win32.ActiveCfg = Debug|Win32 + {8D8D210D-F628-48BB-9127-D8003DF22018}.Debug|Win32.Build.0 = Debug|Win32 + {8D8D210D-F628-48BB-9127-D8003DF22018}.Release|Win32.ActiveCfg = Release|Win32 + {8D8D210D-F628-48BB-9127-D8003DF22018}.Release|Win32.Build.0 = Release|Win32 + {BFE8CC78-6B58-4305-A096-796A3088BB26}.Debug|Win32.ActiveCfg = Debug|Win32 + {BFE8CC78-6B58-4305-A096-796A3088BB26}.Debug|Win32.Build.0 = Debug|Win32 + {BFE8CC78-6B58-4305-A096-796A3088BB26}.Release|Win32.ActiveCfg = Release|Win32 + {BFE8CC78-6B58-4305-A096-796A3088BB26}.Release|Win32.Build.0 = Release|Win32 + {ADA2462A-3656-41D2-B8A8-8D942AA0F8E9}.Debug|Win32.ActiveCfg = Debug|Win32 + {ADA2462A-3656-41D2-B8A8-8D942AA0F8E9}.Debug|Win32.Build.0 = Debug|Win32 + {ADA2462A-3656-41D2-B8A8-8D942AA0F8E9}.Release|Win32.ActiveCfg = Release|Win32 + {ADA2462A-3656-41D2-B8A8-8D942AA0F8E9}.Release|Win32.Build.0 = Release|Win32 + {9F3F86DA-3CC5-481F-8201-166933B5C8FF}.Debug|Win32.ActiveCfg = Debug|Win32 + {9F3F86DA-3CC5-481F-8201-166933B5C8FF}.Debug|Win32.Build.0 = Debug|Win32 + {9F3F86DA-3CC5-481F-8201-166933B5C8FF}.Release|Win32.ActiveCfg = Release|Win32 + {9F3F86DA-3CC5-481F-8201-166933B5C8FF}.Release|Win32.Build.0 = Release|Win32 + {37C32832-DCE4-4BAA-9306-826064B30CCB}.Debug|Win32.ActiveCfg = Debug|Win32 + {37C32832-DCE4-4BAA-9306-826064B30CCB}.Debug|Win32.Build.0 = Debug|Win32 + {37C32832-DCE4-4BAA-9306-826064B30CCB}.Release|Win32.ActiveCfg = Release|Win32 + {37C32832-DCE4-4BAA-9306-826064B30CCB}.Release|Win32.Build.0 = Release|Win32 + {3322F289-B025-4DB1-A7D1-FBA3840F8A0B}.Debug|Win32.ActiveCfg = Debug|Win32 + {3322F289-B025-4DB1-A7D1-FBA3840F8A0B}.Debug|Win32.Build.0 = Debug|Win32 + {3322F289-B025-4DB1-A7D1-FBA3840F8A0B}.Release|Win32.ActiveCfg = Release|Win32 + {3322F289-B025-4DB1-A7D1-FBA3840F8A0B}.Release|Win32.Build.0 = Release|Win32 + {B5271094-DE51-4E60-B4FA-D8F0BDB969FE}.Debug|Win32.ActiveCfg = Debug|Win32 + {B5271094-DE51-4E60-B4FA-D8F0BDB969FE}.Debug|Win32.Build.0 = Debug|Win32 + {B5271094-DE51-4E60-B4FA-D8F0BDB969FE}.Release|Win32.ActiveCfg = Release|Win32 + {B5271094-DE51-4E60-B4FA-D8F0BDB969FE}.Release|Win32.Build.0 = Release|Win32 + {1C1B5A00-5F5D-4290-A07B-8A5A4A78570A}.Debug|Win32.ActiveCfg = Debug|Win32 + {1C1B5A00-5F5D-4290-A07B-8A5A4A78570A}.Debug|Win32.Build.0 = Debug|Win32 + {1C1B5A00-5F5D-4290-A07B-8A5A4A78570A}.Release|Win32.ActiveCfg = Release|Win32 + {1C1B5A00-5F5D-4290-A07B-8A5A4A78570A}.Release|Win32.Build.0 = Release|Win32 + {4DFA9F84-0457-4FE4-8008-283270610487}.Debug|Win32.ActiveCfg = Debug|Win32 + {4DFA9F84-0457-4FE4-8008-283270610487}.Debug|Win32.Build.0 = Debug|Win32 + {4DFA9F84-0457-4FE4-8008-283270610487}.Release|Win32.ActiveCfg = Release|Win32 + {4DFA9F84-0457-4FE4-8008-283270610487}.Release|Win32.Build.0 = Release|Win32 + {C3E7B77C-EED2-4046-9A30-9446C6F096A0}.Debug|Win32.ActiveCfg = Debug|Win32 + {C3E7B77C-EED2-4046-9A30-9446C6F096A0}.Debug|Win32.Build.0 = Debug|Win32 + {C3E7B77C-EED2-4046-9A30-9446C6F096A0}.Release|Win32.ActiveCfg = Release|Win32 + {C3E7B77C-EED2-4046-9A30-9446C6F096A0}.Release|Win32.Build.0 = Release|Win32 + {8B25CCE0-0988-4999-AE65-5A5EE31BB44D}.Debug|Win32.ActiveCfg = Debug|Win32 + {8B25CCE0-0988-4999-AE65-5A5EE31BB44D}.Debug|Win32.Build.0 = Debug|Win32 + {8B25CCE0-0988-4999-AE65-5A5EE31BB44D}.Release|Win32.ActiveCfg = Release|Win32 + {8B25CCE0-0988-4999-AE65-5A5EE31BB44D}.Release|Win32.Build.0 = Release|Win32 + {7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF}.Debug|Win32.ActiveCfg = Debug|Win32 + {7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF}.Debug|Win32.Build.0 = Debug|Win32 + {7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF}.Release|Win32.ActiveCfg = Release|Win32 + {7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF}.Release|Win32.Build.0 = Release|Win32 + {78079B1F-152B-4E83-87CB-364586AB3AAC}.Debug|Win32.ActiveCfg = Debug|Win32 + {78079B1F-152B-4E83-87CB-364586AB3AAC}.Debug|Win32.Build.0 = Debug|Win32 + {78079B1F-152B-4E83-87CB-364586AB3AAC}.Release|Win32.ActiveCfg = Release|Win32 + {78079B1F-152B-4E83-87CB-364586AB3AAC}.Release|Win32.Build.0 = Release|Win32 + {E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE}.Debug|Win32.ActiveCfg = Debug|Win32 + {E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE}.Debug|Win32.Build.0 = Debug|Win32 + {E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE}.Release|Win32.ActiveCfg = Release|Win32 + {E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE}.Release|Win32.Build.0 = Release|Win32 + {F658ABE4-7FE1-4404-9B7C-55E0D660F1B3}.Debug|Win32.ActiveCfg = Debug|Win32 + {F658ABE4-7FE1-4404-9B7C-55E0D660F1B3}.Debug|Win32.Build.0 = Debug|Win32 + {F658ABE4-7FE1-4404-9B7C-55E0D660F1B3}.Release|Win32.ActiveCfg = Release|Win32 + {F658ABE4-7FE1-4404-9B7C-55E0D660F1B3}.Release|Win32.Build.0 = Release|Win32 + {AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E}.Debug|Win32.ActiveCfg = Debug|Win32 + {AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E}.Debug|Win32.Build.0 = Debug|Win32 + {AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E}.Release|Win32.ActiveCfg = Release|Win32 + {AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E}.Release|Win32.Build.0 = Release|Win32 + {1CA77C94-5785-4B38-B91A-1EAFBD885BC2}.Debug|Win32.ActiveCfg = Debug|Win32 + {1CA77C94-5785-4B38-B91A-1EAFBD885BC2}.Debug|Win32.Build.0 = Debug|Win32 + {1CA77C94-5785-4B38-B91A-1EAFBD885BC2}.Release|Win32.ActiveCfg = Release|Win32 + {1CA77C94-5785-4B38-B91A-1EAFBD885BC2}.Release|Win32.Build.0 = Release|Win32 + {3B0BF144-5D75-4D4A-BF75-7347186C808F}.Debug|Win32.ActiveCfg = Debug|Win32 + {3B0BF144-5D75-4D4A-BF75-7347186C808F}.Debug|Win32.Build.0 = Debug|Win32 + {3B0BF144-5D75-4D4A-BF75-7347186C808F}.Release|Win32.ActiveCfg = Release|Win32 + {3B0BF144-5D75-4D4A-BF75-7347186C808F}.Release|Win32.Build.0 = Release|Win32 + {CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1}.Debug|Win32.ActiveCfg = Debug|Win32 + {CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1}.Debug|Win32.Build.0 = Debug|Win32 + {CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1}.Release|Win32.ActiveCfg = Release|Win32 + {CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1}.Release|Win32.Build.0 = Release|Win32 + {1CD667DD-E7AE-4F36-A1F7-F41FB59786BE}.Debug|Win32.ActiveCfg = Debug|Win32 + {1CD667DD-E7AE-4F36-A1F7-F41FB59786BE}.Debug|Win32.Build.0 = Debug|Win32 + {1CD667DD-E7AE-4F36-A1F7-F41FB59786BE}.Release|Win32.ActiveCfg = Release|Win32 + {1CD667DD-E7AE-4F36-A1F7-F41FB59786BE}.Release|Win32.Build.0 = Release|Win32 + {289C605C-94CC-437F-836B-2FE41528EEEC}.Debug|Win32.ActiveCfg = Debug|Win32 + {289C605C-94CC-437F-836B-2FE41528EEEC}.Debug|Win32.Build.0 = Debug|Win32 + {289C605C-94CC-437F-836B-2FE41528EEEC}.Release|Win32.ActiveCfg = Release|Win32 + {289C605C-94CC-437F-836B-2FE41528EEEC}.Release|Win32.Build.0 = Release|Win32 + {D04E36D7-1C68-43E6-BE30-A7793CE3C799}.Debug|Win32.ActiveCfg = Debug|Win32 + {D04E36D7-1C68-43E6-BE30-A7793CE3C799}.Debug|Win32.Build.0 = Debug|Win32 + {D04E36D7-1C68-43E6-BE30-A7793CE3C799}.Release|Win32.ActiveCfg = Release|Win32 + {D04E36D7-1C68-43E6-BE30-A7793CE3C799}.Release|Win32.Build.0 = Release|Win32 + {AD5ACED4-F6EE-4AC0-B502-23CFD10EF603}.Debug|Win32.ActiveCfg = Debug|Win32 + {AD5ACED4-F6EE-4AC0-B502-23CFD10EF603}.Debug|Win32.Build.0 = Debug|Win32 + {AD5ACED4-F6EE-4AC0-B502-23CFD10EF603}.Release|Win32.ActiveCfg = Release|Win32 + {AD5ACED4-F6EE-4AC0-B502-23CFD10EF603}.Release|Win32.Build.0 = Release|Win32 + {46771042-C840-4314-BA3C-C5BC2FBD7CBB}.Debug|Win32.ActiveCfg = Debug|Win32 + {46771042-C840-4314-BA3C-C5BC2FBD7CBB}.Debug|Win32.Build.0 = Debug|Win32 + {46771042-C840-4314-BA3C-C5BC2FBD7CBB}.Release|Win32.ActiveCfg = Release|Win32 + {46771042-C840-4314-BA3C-C5BC2FBD7CBB}.Release|Win32.Build.0 = Release|Win32 + {2E03AF33-56A1-4366-B016-184CD96F3B56}.Debug|Win32.ActiveCfg = Debug|Win32 + {2E03AF33-56A1-4366-B016-184CD96F3B56}.Debug|Win32.Build.0 = Debug|Win32 + {2E03AF33-56A1-4366-B016-184CD96F3B56}.Release|Win32.ActiveCfg = Release|Win32 + {2E03AF33-56A1-4366-B016-184CD96F3B56}.Release|Win32.Build.0 = Release|Win32 + {97541B63-87AA-4ACE-BBF5-175F8D1389EC}.Debug|Win32.ActiveCfg = Debug|Win32 + {97541B63-87AA-4ACE-BBF5-175F8D1389EC}.Debug|Win32.Build.0 = Debug|Win32 + {97541B63-87AA-4ACE-BBF5-175F8D1389EC}.Release|Win32.ActiveCfg = Release|Win32 + {97541B63-87AA-4ACE-BBF5-175F8D1389EC}.Release|Win32.Build.0 = Release|Win32 + {45797F58-624B-4FA0-A7A3-5956114D8215}.Debug|Win32.ActiveCfg = Debug|Win32 + {45797F58-624B-4FA0-A7A3-5956114D8215}.Debug|Win32.Build.0 = Debug|Win32 + {45797F58-624B-4FA0-A7A3-5956114D8215}.Release|Win32.ActiveCfg = Release|Win32 + {45797F58-624B-4FA0-A7A3-5956114D8215}.Release|Win32.Build.0 = Release|Win32 + {7A2467D2-B03A-4964-A289-EF233EB39F69}.Debug|Win32.ActiveCfg = Debug|Win32 + {7A2467D2-B03A-4964-A289-EF233EB39F69}.Debug|Win32.Build.0 = Debug|Win32 + {7A2467D2-B03A-4964-A289-EF233EB39F69}.Release|Win32.ActiveCfg = Release|Win32 + {7A2467D2-B03A-4964-A289-EF233EB39F69}.Release|Win32.Build.0 = Release|Win32 + {AE750416-51BA-485C-BD76-EF11B4536EE8}.Debug|Win32.ActiveCfg = Debug|Win32 + {AE750416-51BA-485C-BD76-EF11B4536EE8}.Debug|Win32.Build.0 = Debug|Win32 + {AE750416-51BA-485C-BD76-EF11B4536EE8}.Release|Win32.ActiveCfg = Release|Win32 + {AE750416-51BA-485C-BD76-EF11B4536EE8}.Release|Win32.Build.0 = Release|Win32 + {3E822491-B134-43B0-A40E-9348FFAB527F}.Debug|Win32.ActiveCfg = Debug|Win32 + {3E822491-B134-43B0-A40E-9348FFAB527F}.Debug|Win32.Build.0 = Debug|Win32 + {3E822491-B134-43B0-A40E-9348FFAB527F}.Release|Win32.ActiveCfg = Release|Win32 + {3E822491-B134-43B0-A40E-9348FFAB527F}.Release|Win32.Build.0 = Release|Win32 + {AF932F77-1804-4DA4-A6DC-950795D6AFC1}.Debug|Win32.ActiveCfg = Debug|Win32 + {AF932F77-1804-4DA4-A6DC-950795D6AFC1}.Release|Win32.ActiveCfg = Release|Win32 + {45236F71-7031-40BC-ADCD-0535A64C04B0}.Debug|Win32.ActiveCfg = Debug|Win32 + {45236F71-7031-40BC-ADCD-0535A64C04B0}.Debug|Win32.Build.0 = Debug|Win32 + {45236F71-7031-40BC-ADCD-0535A64C04B0}.Release|Win32.ActiveCfg = Release|Win32 + {45236F71-7031-40BC-ADCD-0535A64C04B0}.Release|Win32.Build.0 = Release|Win32 + {28D24031-1A17-497A-B926-59CF78076DED}.Debug|Win32.ActiveCfg = Debug|Win32 + {28D24031-1A17-497A-B926-59CF78076DED}.Debug|Win32.Build.0 = Debug|Win32 + {28D24031-1A17-497A-B926-59CF78076DED}.Release|Win32.ActiveCfg = Release|Win32 + {28D24031-1A17-497A-B926-59CF78076DED}.Release|Win32.Build.0 = Release|Win32 + {23F17042-704E-4198-8017-A8584E884CF7}.Debug|Win32.ActiveCfg = Debug|Win32 + {23F17042-704E-4198-8017-A8584E884CF7}.Debug|Win32.Build.0 = Debug|Win32 + {23F17042-704E-4198-8017-A8584E884CF7}.Release|Win32.ActiveCfg = Release|Win32 + {23F17042-704E-4198-8017-A8584E884CF7}.Release|Win32.Build.0 = Release|Win32 + {CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3}.Debug|Win32.ActiveCfg = Debug|Win32 + {CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3}.Debug|Win32.Build.0 = Debug|Win32 + {CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3}.Release|Win32.ActiveCfg = Release|Win32 + {CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3}.Release|Win32.Build.0 = Release|Win32 + {08B82852-90B3-4767-A5D2-F0A4FCCB2377}.Debug|Win32.ActiveCfg = Debug|Win32 + {08B82852-90B3-4767-A5D2-F0A4FCCB2377}.Debug|Win32.Build.0 = Debug|Win32 + {08B82852-90B3-4767-A5D2-F0A4FCCB2377}.Release|Win32.ActiveCfg = Release|Win32 + {08B82852-90B3-4767-A5D2-F0A4FCCB2377}.Release|Win32.Build.0 = Release|Win32 + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF}.Debug|Win32.ActiveCfg = Debug|Win32 + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF}.Debug|Win32.Build.0 = Debug|Win32 + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF}.Release|Win32.ActiveCfg = Release|Win32 + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF}.Release|Win32.Build.0 = Release|Win32 + {D640A221-F95A-40FF-AC0E-0E8B615C7681}.Debug|Win32.ActiveCfg = Debug|Win32 + {D640A221-F95A-40FF-AC0E-0E8B615C7681}.Debug|Win32.Build.0 = Debug|Win32 + {D640A221-F95A-40FF-AC0E-0E8B615C7681}.Release|Win32.ActiveCfg = Release|Win32 + {D640A221-F95A-40FF-AC0E-0E8B615C7681}.Release|Win32.Build.0 = Release|Win32 + {50651D04-C8F7-4C2B-B412-0848573BDF88}.Debug|Win32.ActiveCfg = Debug|Win32 + {50651D04-C8F7-4C2B-B412-0848573BDF88}.Debug|Win32.Build.0 = Debug|Win32 + {50651D04-C8F7-4C2B-B412-0848573BDF88}.Release|Win32.ActiveCfg = Release|Win32 + {50651D04-C8F7-4C2B-B412-0848573BDF88}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/third_party/windows/fltk-1.1.10/vc2005/fltkdll.vcproj b/third_party/windows/fltk-1.1.10/vc2005/fltkdll.vcproj new file mode 100644 index 0000000..1da832f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/fltkdll.vcproj @@ -0,0 +1,3622 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/fltkforms.vcproj b/third_party/windows/fltk-1.1.10/vc2005/fltkforms.vcproj new file mode 100644 index 0000000..07521b4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/fltkforms.vcproj @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/fltkgl.vcproj b/third_party/windows/fltk-1.1.10/vc2005/fltkgl.vcproj new file mode 100644 index 0000000..7ff3e99 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/fltkgl.vcproj @@ -0,0 +1,356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/fltkimages.vcproj b/third_party/windows/fltk-1.1.10/vc2005/fltkimages.vcproj new file mode 100644 index 0000000..ba61af8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/fltkimages.vcproj @@ -0,0 +1,365 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/fluid.vcproj b/third_party/windows/fltk-1.1.10/vc2005/fluid.vcproj new file mode 100644 index 0000000..d551fe5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/fluid.vcproj @@ -0,0 +1,647 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/fonts.vcproj b/third_party/windows/fltk-1.1.10/vc2005/fonts.vcproj new file mode 100644 index 0000000..266c7c8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/fonts.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/forms.vcproj b/third_party/windows/fltk-1.1.10/vc2005/forms.vcproj new file mode 100644 index 0000000..6617ca4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/forms.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/fractals.vcproj b/third_party/windows/fltk-1.1.10/vc2005/fractals.vcproj new file mode 100644 index 0000000..07affa9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/fractals.vcproj @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/fullscreen.vcproj b/third_party/windows/fltk-1.1.10/vc2005/fullscreen.vcproj new file mode 100644 index 0000000..cbc8474 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/fullscreen.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/gl_overlay.vcproj b/third_party/windows/fltk-1.1.10/vc2005/gl_overlay.vcproj new file mode 100644 index 0000000..67d36c2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/gl_overlay.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/glpuzzle.vcproj b/third_party/windows/fltk-1.1.10/vc2005/glpuzzle.vcproj new file mode 100644 index 0000000..6437a31 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/glpuzzle.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/hello.vcproj b/third_party/windows/fltk-1.1.10/vc2005/hello.vcproj new file mode 100644 index 0000000..ce735cb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/hello.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/help.vcproj b/third_party/windows/fltk-1.1.10/vc2005/help.vcproj new file mode 100644 index 0000000..37b0d03 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/help.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/iconize.vcproj b/third_party/windows/fltk-1.1.10/vc2005/iconize.vcproj new file mode 100644 index 0000000..2ed24dc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/iconize.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/image.vcproj b/third_party/windows/fltk-1.1.10/vc2005/image.vcproj new file mode 100644 index 0000000..c7d31c9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/image.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/inactive.vcproj b/third_party/windows/fltk-1.1.10/vc2005/inactive.vcproj new file mode 100644 index 0000000..e7afd36 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/inactive.vcproj @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/input.vcproj b/third_party/windows/fltk-1.1.10/vc2005/input.vcproj new file mode 100644 index 0000000..c8e2b06 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/input.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/input_choice.vcproj b/third_party/windows/fltk-1.1.10/vc2005/input_choice.vcproj new file mode 100644 index 0000000..37f7208 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/input_choice.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/jpeg.vcproj b/third_party/windows/fltk-1.1.10/vc2005/jpeg.vcproj new file mode 100644 index 0000000..29a4b66 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/jpeg.vcproj @@ -0,0 +1,1271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/keyboard.vcproj b/third_party/windows/fltk-1.1.10/vc2005/keyboard.vcproj new file mode 100644 index 0000000..26a8827 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/keyboard.vcproj @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/label.vcproj b/third_party/windows/fltk-1.1.10/vc2005/label.vcproj new file mode 100644 index 0000000..5910a47 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/label.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/libpng.vcproj b/third_party/windows/fltk-1.1.10/vc2005/libpng.vcproj new file mode 100644 index 0000000..411863d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/libpng.vcproj @@ -0,0 +1,525 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/line_style.vcproj b/third_party/windows/fltk-1.1.10/vc2005/line_style.vcproj new file mode 100644 index 0000000..ff98b7e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/line_style.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/mandelbrot.vcproj b/third_party/windows/fltk-1.1.10/vc2005/mandelbrot.vcproj new file mode 100644 index 0000000..b76077e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/mandelbrot.vcproj @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/menubar.vcproj b/third_party/windows/fltk-1.1.10/vc2005/menubar.vcproj new file mode 100644 index 0000000..0b6ea36 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/menubar.vcproj @@ -0,0 +1,232 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/message.vcproj b/third_party/windows/fltk-1.1.10/vc2005/message.vcproj new file mode 100644 index 0000000..4445ca4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/message.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/minimum.vcproj b/third_party/windows/fltk-1.1.10/vc2005/minimum.vcproj new file mode 100644 index 0000000..36382c3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/minimum.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/navigation.vcproj b/third_party/windows/fltk-1.1.10/vc2005/navigation.vcproj new file mode 100644 index 0000000..75eac26 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/navigation.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/output.vcproj b/third_party/windows/fltk-1.1.10/vc2005/output.vcproj new file mode 100644 index 0000000..701ecf4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/output.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/overlay.vcproj b/third_party/windows/fltk-1.1.10/vc2005/overlay.vcproj new file mode 100644 index 0000000..ca9abff --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/overlay.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/pack.vcproj b/third_party/windows/fltk-1.1.10/vc2005/pack.vcproj new file mode 100644 index 0000000..ac49858 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/pack.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/pixmap.vcproj b/third_party/windows/fltk-1.1.10/vc2005/pixmap.vcproj new file mode 100644 index 0000000..c0b98c7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/pixmap.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/pixmap_browser.vcproj b/third_party/windows/fltk-1.1.10/vc2005/pixmap_browser.vcproj new file mode 100644 index 0000000..fe76d24 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/pixmap_browser.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/preferences.vcproj b/third_party/windows/fltk-1.1.10/vc2005/preferences.vcproj new file mode 100644 index 0000000..23c7036 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/preferences.vcproj @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/radio.vcproj b/third_party/windows/fltk-1.1.10/vc2005/radio.vcproj new file mode 100644 index 0000000..beb55f3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/radio.vcproj @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/resize.vcproj b/third_party/windows/fltk-1.1.10/vc2005/resize.vcproj new file mode 100644 index 0000000..7e4f89e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/resize.vcproj @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/resizebox.vcproj b/third_party/windows/fltk-1.1.10/vc2005/resizebox.vcproj new file mode 100644 index 0000000..2409a84 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/resizebox.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/scroll.vcproj b/third_party/windows/fltk-1.1.10/vc2005/scroll.vcproj new file mode 100644 index 0000000..24d0fc0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/scroll.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/shape.vcproj b/third_party/windows/fltk-1.1.10/vc2005/shape.vcproj new file mode 100644 index 0000000..dfa70d9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/shape.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/subwindow.vcproj b/third_party/windows/fltk-1.1.10/vc2005/subwindow.vcproj new file mode 100644 index 0000000..8aa5296 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/subwindow.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/sudoku.vcproj b/third_party/windows/fltk-1.1.10/vc2005/sudoku.vcproj new file mode 100644 index 0000000..0906b8d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/sudoku.vcproj @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/symbols.vcproj b/third_party/windows/fltk-1.1.10/vc2005/symbols.vcproj new file mode 100644 index 0000000..46c0b97 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/symbols.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/tabs.vcproj b/third_party/windows/fltk-1.1.10/vc2005/tabs.vcproj new file mode 100644 index 0000000..b41b4a3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/tabs.vcproj @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/threads.vcproj b/third_party/windows/fltk-1.1.10/vc2005/threads.vcproj new file mode 100644 index 0000000..fb1b7eb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/threads.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/tile.vcproj b/third_party/windows/fltk-1.1.10/vc2005/tile.vcproj new file mode 100644 index 0000000..94c1bcb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/tile.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/tiled_image.vcproj b/third_party/windows/fltk-1.1.10/vc2005/tiled_image.vcproj new file mode 100644 index 0000000..e287088 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/tiled_image.vcproj @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/valuators.vcproj b/third_party/windows/fltk-1.1.10/vc2005/valuators.vcproj new file mode 100644 index 0000000..d2b3d29 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/valuators.vcproj @@ -0,0 +1,258 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vc2005/zlib.vcproj b/third_party/windows/fltk-1.1.10/vc2005/zlib.vcproj new file mode 100644 index 0000000..a296554 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vc2005/zlib.vcproj @@ -0,0 +1,428 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/CubeView.vcproj b/third_party/windows/fltk-1.1.10/vcnet/CubeView.vcproj new file mode 100644 index 0000000..8c84251 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/CubeView.vcproj @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/adjuster.vcproj b/third_party/windows/fltk-1.1.10/vcnet/adjuster.vcproj new file mode 100644 index 0000000..83922e2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/adjuster.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/arc.vcproj b/third_party/windows/fltk-1.1.10/vcnet/arc.vcproj new file mode 100644 index 0000000..4724e7d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/arc.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/ask.vcproj b/third_party/windows/fltk-1.1.10/vcnet/ask.vcproj new file mode 100644 index 0000000..b39b78c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/ask.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/bitmap.vcproj b/third_party/windows/fltk-1.1.10/vcnet/bitmap.vcproj new file mode 100644 index 0000000..c975eca --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/bitmap.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/blocks.vcproj b/third_party/windows/fltk-1.1.10/vcnet/blocks.vcproj new file mode 100644 index 0000000..6ec1261 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/blocks.vcproj @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/boxtype.vcproj b/third_party/windows/fltk-1.1.10/vcnet/boxtype.vcproj new file mode 100644 index 0000000..82ee437 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/boxtype.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/browser.vcproj b/third_party/windows/fltk-1.1.10/vcnet/browser.vcproj new file mode 100644 index 0000000..e00c722 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/browser.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/button.vcproj b/third_party/windows/fltk-1.1.10/vcnet/button.vcproj new file mode 100644 index 0000000..8fcbd0e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/button.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/buttons.vcproj b/third_party/windows/fltk-1.1.10/vcnet/buttons.vcproj new file mode 100644 index 0000000..349a434 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/buttons.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/checkers.vcproj b/third_party/windows/fltk-1.1.10/vcnet/checkers.vcproj new file mode 100644 index 0000000..bd3d15f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/checkers.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/clock.vcproj b/third_party/windows/fltk-1.1.10/vcnet/clock.vcproj new file mode 100644 index 0000000..5817673 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/clock.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/colbrowser.vcproj b/third_party/windows/fltk-1.1.10/vcnet/colbrowser.vcproj new file mode 100644 index 0000000..3cf20ad --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/colbrowser.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/color_chooser.vcproj b/third_party/windows/fltk-1.1.10/vcnet/color_chooser.vcproj new file mode 100644 index 0000000..520d60e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/color_chooser.vcproj @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/config.h b/third_party/windows/fltk-1.1.10/vcnet/config.h new file mode 100644 index 0000000..a07176c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/config.h @@ -0,0 +1,195 @@ +/* + * "$Id: config.h 4454 2005-07-24 18:41:30Z matt $" + * + * Configuration file for the Fast Light Tool Kit (FLTK) for Visual C++. + * + * Copyright 1998-2005 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems to "fltk-bugs@fltk.org". + */ + +/* + * Where to find files... + */ + +#define FLTK_DATADIR "C:/FLTK" +#define FLTK_DOCDIR "C:/FLTK/DOC" + +/* + * BORDER_WIDTH: + * + * Thickness of FL_UP_BOX and FL_DOWN_BOX. Current 1,2, and 3 are + * supported. 3 is the historic FLTK look. 2 looks more like Microsoft + * Windows, KDE, and Qt, and is the default when building for Windows. + * 1 is a plausible future evolution... Note that this may be simulated + * at runtime by redefining the boxtypes using Fl::set_boxtype(). + */ + +#define BORDER_WIDTH 2 + +/* + * HAVE_GL: + * + * Do you have OpenGL? Set this to 0 if you don't have or plan to use + * OpenGL, and FLTK will be smaller. + */ + +#define HAVE_GL 1 + +/* + * HAVE_GL_GLU_H: + * + * Do you have the OpenGL Utility Library header file? + * (many broken Mesa RPMs do not...) + */ + +#define HAVE_GL_GLU_H 1 + +/* + * USE_COLORMAP: + * + * Setting this to zero will save a good deal of code (especially for + * fl_draw_image), but FLTK will only work on TrueColor visuals. + */ + +#define USE_COLORMAP 1 + +/* + * HAVE_XDBE: + * + * Do we have the X double-buffer extension? + */ + +#define HAVE_XDBE 0 + +/* + * USE_XDBE: + * + * Actually try to use the double-buffer extension? Set this to zero + * disable use of XDBE without breaking the list_visuals program. + */ + +#define USE_XDBE HAVE_XDBE + +/* + * HAVE_OVERLAY: + * + * Use the X overlay extension? FLTK will try to use an overlay + * visual for Fl_Overlay_Window, the Gl_Window overlay, and for the + * menus. Setting this to zero will remove a substantial amount of + * code from FLTK. Overlays have only been tested on SGI servers! + */ + +#define HAVE_OVERLAY 0 + +/* + * HAVE_GL_OVERLAY: + * + * It is possible your GL has an overlay even if X does not. If so, + * set this to 1. + */ + +#define HAVE_GL_OVERLAY 1 + +/* + * WORDS_BIGENDIAN: + * + * Byte order of your machine: 1 = big-endian, 0 = little-endian. + */ + +#define WORDS_BIGENDIAN 0 + +/* + * U16, U32, U64: + * + * Types used by fl_draw_image. One of U32 or U64 must be defined. + * U16 is optional but FLTK will work better with it! + */ + +#define U16 unsigned short +#define U32 unsigned +#undef U64 + +/* + * HAVE_DIRENT_H, HAVE_SYS_NDIR_H, HAVE_SYS_DIR_H, HAVE_NDIR_H, HAVE_SCANDIR: + * + * Where is (used only by fl_file_chooser and scandir). + */ + +/*#undef HAVE_DIRENT_H */ +/*#undef HAVE_SYS_NDIR_H */ +/*#undef HAVE_SYS_DIR_H */ +/*#undef HAVE_NDIR_H */ +/*#undef HAVE_SCANDIR */ + +/* + * Possibly missing sprintf-style functions: + */ + +#define HAVE_VSNPRINTF 0 +#define HAVE_SNPRINTF 0 + +/* + * String functions... + */ + +#define HAVE_STRCASECMP 1 +/*#undef HAVE_STRLCAT*/ +/*#undef HAVE_STRLCPY*/ + +/* + * Do we have POSIX locale support? + */ + +#define HAVE_LOCALE_H 1 +#define HAVE_LOCALECONV 1 + +/* + * HAVE_POLL: + * + * Use poll() if we don't have select(). + */ + +#define HAVE_POLL 0 + +/* + * Do we have various image libraries? + */ + +#define HAVE_LIBPNG +#define HAVE_LIBZ +#define HAVE_LIBJPEG + +/* + * Which header file do we include for libpng? + */ + +#define HAVE_PNG_H +#undef HAVE_LIBPNG_PNG_H + +/* + * Do we have the png_xyz() functions? + */ + +#define HAVE_PNG_GET_VALID +#define HAVE_PNG_SET_TRNS_TO_ALPHA + + +/* + * End of "$Id: config.h 4454 2005-07-24 18:41:30Z matt $". + */ diff --git a/third_party/windows/fltk-1.1.10/vcnet/cube.vcproj b/third_party/windows/fltk-1.1.10/vcnet/cube.vcproj new file mode 100644 index 0000000..2ddc4c0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/cube.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/cursor.vcproj b/third_party/windows/fltk-1.1.10/vcnet/cursor.vcproj new file mode 100644 index 0000000..a936d4d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/cursor.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/curve.vcproj b/third_party/windows/fltk-1.1.10/vcnet/curve.vcproj new file mode 100644 index 0000000..071f6e7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/curve.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/demo.vcproj b/third_party/windows/fltk-1.1.10/vcnet/demo.vcproj new file mode 100644 index 0000000..c42b9ad --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/demo.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/doublebuffer.vcproj b/third_party/windows/fltk-1.1.10/vcnet/doublebuffer.vcproj new file mode 100644 index 0000000..723a964 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/doublebuffer.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/editor.vcproj b/third_party/windows/fltk-1.1.10/vcnet/editor.vcproj new file mode 100644 index 0000000..340f3de --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/editor.vcproj @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/fast_slow.vcproj b/third_party/windows/fltk-1.1.10/vcnet/fast_slow.vcproj new file mode 100644 index 0000000..6354521 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/fast_slow.vcproj @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/file_chooser.vcproj b/third_party/windows/fltk-1.1.10/vcnet/file_chooser.vcproj new file mode 100644 index 0000000..39f16b6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/file_chooser.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/fltk.lib.vcproj b/third_party/windows/fltk-1.1.10/vcnet/fltk.lib.vcproj new file mode 100644 index 0000000..6f6d56e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/fltk.lib.vcproj @@ -0,0 +1,2704 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/fltk.sln b/third_party/windows/fltk-1.1.10/vcnet/fltk.sln new file mode 100644 index 0000000..fcb5c62 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/fltk.sln @@ -0,0 +1,756 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CubeView", "CubeView.vcproj", "{E30BB28D-DFA0-479C-B670-8CD872224B38}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "adjuster", "adjuster.vcproj", "{51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "arc", "arc.vcproj", "{39ADA7A1-A2C1-4F0B-8B92-04E335570C27}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ask", "ask.vcproj", "{DB6BAA16-C589-448F-9AB5-5969016549EB}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bitmap", "bitmap.vcproj", "{65B5BB3F-EE54-4604-B49B-7676AED83AAB}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "boxtype", "boxtype.vcproj", "{E212D4B4-63D9-4D8D-84DB-45C8BC191462}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "browser", "browser.vcproj", "{2352F92C-8663-4637-B919-D76F0A9EC05E}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "button", "button.vcproj", "{0363AC35-F325-4C24-9DB9-E83337D55787}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "buttons", "buttons.vcproj", "{67CE1C24-B0C0-4CD6-8D0F-68513C2398B9}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "checkers", "checkers.vcproj", "{92EEF887-8305-4D00-86B7-D3F98CC7AD87}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "clock", "clock.vcproj", "{122160ED-446E-4B15-8CB4-A2058DC7269A}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "colbrowser", "colbrowser.vcproj", "{D0BC7525-99E7-4247-B860-1B3CF2FF8165}" + ProjectSection(ProjectDependencies) = postProject + {C17BAB42-F00B-4F71-9DF6-A921511C89EE} = {C17BAB42-F00B-4F71-9DF6-A921511C89EE} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "color_chooser", "color_chooser.vcproj", "{BDACB9FC-6769-4A2D-A636-36CC25E3AC75}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cube", "cube.vcproj", "{0973844B-3E5F-4C38-95FF-E8935243D287}" + ProjectSection(ProjectDependencies) = postProject + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cursor", "cursor.vcproj", "{0D1DB0EE-E997-4550-85D4-BDE209B75AD6}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "curve", "curve.vcproj", "{27D45BA6-A403-4A71-B6D6-57DC0CEDCE15}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "demo", "demo.vcproj", "{09427220-8C9C-498A-8D50-1638D3FB87E5}" + ProjectSection(ProjectDependencies) = postProject + {1C1B5A00-5F5D-4290-A07B-8A5A4A78570A} = {1C1B5A00-5F5D-4290-A07B-8A5A4A78570A} + {8D8D210D-F628-48BB-9127-D8003DF22018} = {8D8D210D-F628-48BB-9127-D8003DF22018} + {7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF} = {7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF} + {AE750416-51BA-485C-BD76-EF11B4536EE8} = {AE750416-51BA-485C-BD76-EF11B4536EE8} + {AE750416-51BA-485C-BD76-EF11B4536EE8} = {AE750416-51BA-485C-BD76-EF11B4536EE8} + {DB6BAA16-C589-448F-9AB5-5969016549EB} = {DB6BAA16-C589-448F-9AB5-5969016549EB} + {78079B1F-152B-4E83-87CB-364586AB3AAC} = {78079B1F-152B-4E83-87CB-364586AB3AAC} + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {67CE1C24-B0C0-4CD6-8D0F-68513C2398B9} = {67CE1C24-B0C0-4CD6-8D0F-68513C2398B9} + {D0BC7525-99E7-4247-B860-1B3CF2FF8165} = {D0BC7525-99E7-4247-B860-1B3CF2FF8165} + {ADA2462A-3656-41D2-B8A8-8D942AA0F8E9} = {ADA2462A-3656-41D2-B8A8-8D942AA0F8E9} + {2352F92C-8663-4637-B919-D76F0A9EC05E} = {2352F92C-8663-4637-B919-D76F0A9EC05E} + {28D24031-1A17-497A-B926-59CF78076DED} = {28D24031-1A17-497A-B926-59CF78076DED} + {37C32832-DCE4-4BAA-9306-826064B30CCB} = {37C32832-DCE4-4BAA-9306-826064B30CCB} + {2E03AF33-56A1-4366-B016-184CD96F3B56} = {2E03AF33-56A1-4366-B016-184CD96F3B56} + {0363AC35-F325-4C24-9DB9-E83337D55787} = {0363AC35-F325-4C24-9DB9-E83337D55787} + {DF2A883A-7356-4603-9CB1-E8F1E6B1549D} = {DF2A883A-7356-4603-9CB1-E8F1E6B1549D} + {65B5BB3F-EE54-4604-B49B-7676AED83AAB} = {65B5BB3F-EE54-4604-B49B-7676AED83AAB} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {46771042-C840-4314-BA3C-C5BC2FBD7CBB} = {46771042-C840-4314-BA3C-C5BC2FBD7CBB} + {23F17042-704E-4198-8017-A8584E884CF7} = {23F17042-704E-4198-8017-A8584E884CF7} + {C17BAB42-F00B-4F71-9DF6-A921511C89EE} = {C17BAB42-F00B-4F71-9DF6-A921511C89EE} + {3B0BF144-5D75-4D4A-BF75-7347186C808F} = {3B0BF144-5D75-4D4A-BF75-7347186C808F} + {6927F349-29DF-4D60-BC8F-5A3F5E133735} = {6927F349-29DF-4D60-BC8F-5A3F5E133735} + {0973844B-3E5F-4C38-95FF-E8935243D287} = {0973844B-3E5F-4C38-95FF-E8935243D287} + {E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE} = {E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {B1749154-F87B-489D-B4B0-ABD5ED20A96F} = {B1749154-F87B-489D-B4B0-ABD5ED20A96F} + {45797F58-624B-4FA0-A7A3-5956114D8215} = {45797F58-624B-4FA0-A7A3-5956114D8215} + {289C605C-94CC-437F-836B-2FE41528EEEC} = {289C605C-94CC-437F-836B-2FE41528EEEC} + {97541B63-87AA-4ACE-BBF5-175F8D1389EC} = {97541B63-87AA-4ACE-BBF5-175F8D1389EC} + {EDDBF169-77C1-496E-9EFE-E500107E6E97} = {EDDBF169-77C1-496E-9EFE-E500107E6E97} + {45236F71-7031-40BC-ADCD-0535A64C04B0} = {45236F71-7031-40BC-ADCD-0535A64C04B0} + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {BFE8CC78-6B58-4305-A096-796A3088BB26} = {BFE8CC78-6B58-4305-A096-796A3088BB26} + {C3E7B77C-EED2-4046-9A30-9446C6F096A0} = {C3E7B77C-EED2-4046-9A30-9446C6F096A0} + {4DFA9F84-0457-4FE4-8008-283270610487} = {4DFA9F84-0457-4FE4-8008-283270610487} + {58A83386-65E6-4F22-8712-8B6B7E62913D} = {58A83386-65E6-4F22-8712-8B6B7E62913D} + {92EEF887-8305-4D00-86B7-D3F98CC7AD87} = {92EEF887-8305-4D00-86B7-D3F98CC7AD87} + {3322F289-B025-4DB1-A7D1-FBA3840F8A0B} = {3322F289-B025-4DB1-A7D1-FBA3840F8A0B} + {CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1} = {CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1} + {E30BB28D-DFA0-479C-B670-8CD872224B38} = {E30BB28D-DFA0-479C-B670-8CD872224B38} + {3E822491-B134-43B0-A40E-9348FFAB527F} = {3E822491-B134-43B0-A40E-9348FFAB527F} + {B5271094-DE51-4E60-B4FA-D8F0BDB969FE} = {B5271094-DE51-4E60-B4FA-D8F0BDB969FE} + {1CA77C94-5785-4B38-B91A-1EAFBD885BC2} = {1CA77C94-5785-4B38-B91A-1EAFBD885BC2} + {39ADA7A1-A2C1-4F0B-8B92-04E335570C27} = {39ADA7A1-A2C1-4F0B-8B92-04E335570C27} + {27D45BA6-A403-4A71-B6D6-57DC0CEDCE15} = {27D45BA6-A403-4A71-B6D6-57DC0CEDCE15} + {51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B} = {51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B} + {E212D4B4-63D9-4D8D-84DB-45C8BC191462} = {E212D4B4-63D9-4D8D-84DB-45C8BC191462} + {F0B8F4BD-955D-43CB-980C-805364D04A25} = {F0B8F4BD-955D-43CB-980C-805364D04A25} + {2D29D6C9-B4A6-444C-A311-106A9C8A986F} = {2D29D6C9-B4A6-444C-A311-106A9C8A986F} + {CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3} = {CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3} + {7A2467D2-B03A-4964-A289-EF233EB39F69} = {7A2467D2-B03A-4964-A289-EF233EB39F69} + {AD5ACED4-F6EE-4AC0-B502-23CFD10EF603} = {AD5ACED4-F6EE-4AC0-B502-23CFD10EF603} + {D04E36D7-1C68-43E6-BE30-A7793CE3C799} = {D04E36D7-1C68-43E6-BE30-A7793CE3C799} + {9F3F86DA-3CC5-481F-8201-166933B5C8FF} = {9F3F86DA-3CC5-481F-8201-166933B5C8FF} + {1CD667DD-E7AE-4F36-A1F7-F41FB59786BE} = {1CD667DD-E7AE-4F36-A1F7-F41FB59786BE} + {8B25CCE0-0988-4999-AE65-5A5EE31BB44D} = {8B25CCE0-0988-4999-AE65-5A5EE31BB44D} + {301A1EE3-8AF8-4EB8-9004-473B74E4083C} = {301A1EE3-8AF8-4EB8-9004-473B74E4083C} + {F658ABE4-7FE1-4404-9B7C-55E0D660F1B3} = {F658ABE4-7FE1-4404-9B7C-55E0D660F1B3} + {AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E} = {AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E} + {122160ED-446E-4B15-8CB4-A2058DC7269A} = {122160ED-446E-4B15-8CB4-A2058DC7269A} + {0D1DB0EE-E997-4550-85D4-BDE209B75AD6} = {0D1DB0EE-E997-4550-85D4-BDE209B75AD6} + {0BDAEBF1-7A8D-434B-A543-4663464E972D} = {0BDAEBF1-7A8D-434B-A543-4663464E972D} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + {BDACB9FC-6769-4A2D-A636-36CC25E3AC75} = {BDACB9FC-6769-4A2D-A636-36CC25E3AC75} + {2147B9FD-7D65-4854-9770-D7B8767DB9AE} = {2147B9FD-7D65-4854-9770-D7B8767DB9AE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "doublebuffer", "doublebuffer.vcproj", "{EDDBF169-77C1-496E-9EFE-E500107E6E97}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "editor", "editor.vcproj", "{0BDAEBF1-7A8D-434B-A543-4663464E972D}" + ProjectSection(ProjectDependencies) = postProject + {F0B8F4BD-955D-43CB-980C-805364D04A25} = {F0B8F4BD-955D-43CB-980C-805364D04A25} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fast_slow", "fast_slow.vcproj", "{2D29D6C9-B4A6-444C-A311-106A9C8A986F}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "file_chooser", "file_chooser.vcproj", "{6927F349-29DF-4D60-BC8F-5A3F5E133735}" + ProjectSection(ProjectDependencies) = postProject + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {6E8E1663-B88D-4454-ADF2-279666A93306} = {6E8E1663-B88D-4454-ADF2-279666A93306} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltk", "fltk.lib.vcproj", "{E070AAFC-9D03-41A3-BC7D-30887EA0D50F}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltkdll", "fltkdll.vcproj", "{F0B8F4BD-955D-43CB-980C-805364D04A25}" + ProjectSection(ProjectDependencies) = postProject + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {289C605C-94CC-437F-836B-2FE41528EEEC} = {289C605C-94CC-437F-836B-2FE41528EEEC} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltkforms", "fltkforms.vcproj", "{C17BAB42-F00B-4F71-9DF6-A921511C89EE}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltkgl", "fltkgl.vcproj", "{F7974A9C-C255-4385-96BC-E24EE0816F7C}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fltkimages", "fltkimages.vcproj", "{6E8E1663-B88D-4454-ADF2-279666A93306}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fluid", "fluid.vcproj", "{8AED3078-8CD8-40C9-A8FF-46080024F1EB}" + ProjectSection(ProjectDependencies) = postProject + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {C17BAB42-F00B-4F71-9DF6-A921511C89EE} = {C17BAB42-F00B-4F71-9DF6-A921511C89EE} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {6E8E1663-B88D-4454-ADF2-279666A93306} = {6E8E1663-B88D-4454-ADF2-279666A93306} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fonts", "fonts.vcproj", "{DF2A883A-7356-4603-9CB1-E8F1E6B1549D}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "forms", "forms.vcproj", "{B1749154-F87B-489D-B4B0-ABD5ED20A96F}" + ProjectSection(ProjectDependencies) = postProject + {C17BAB42-F00B-4F71-9DF6-A921511C89EE} = {C17BAB42-F00B-4F71-9DF6-A921511C89EE} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fractals", "fractals.vcproj", "{58A83386-65E6-4F22-8712-8B6B7E62913D}" + ProjectSection(ProjectDependencies) = postProject + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fullscreen", "fullscreen.vcproj", "{2147B9FD-7D65-4854-9770-D7B8767DB9AE}" + ProjectSection(ProjectDependencies) = postProject + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gl_overlay", "gl_overlay.vcproj", "{8D8D210D-F628-48BB-9127-D8003DF22018}" + ProjectSection(ProjectDependencies) = postProject + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "glpuzzle", "glpuzzle.vcproj", "{BFE8CC78-6B58-4305-A096-796A3088BB26}" + ProjectSection(ProjectDependencies) = postProject + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hello", "hello.vcproj", "{ADA2462A-3656-41D2-B8A8-8D942AA0F8E9}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "help", "help.vcproj", "{9F3F86DA-3CC5-481F-8201-166933B5C8FF}" + ProjectSection(ProjectDependencies) = postProject + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {6E8E1663-B88D-4454-ADF2-279666A93306} = {6E8E1663-B88D-4454-ADF2-279666A93306} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iconize", "iconize.vcproj", "{37C32832-DCE4-4BAA-9306-826064B30CCB}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "image", "image.vcproj", "{3322F289-B025-4DB1-A7D1-FBA3840F8A0B}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "inactive", "inactive.vcproj", "{B5271094-DE51-4E60-B4FA-D8F0BDB969FE}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "input", "input.vcproj", "{1C1B5A00-5F5D-4290-A07B-8A5A4A78570A}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "keyboard", "keyboard.vcproj", "{4DFA9F84-0457-4FE4-8008-283270610487}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "label", "label.vcproj", "{C3E7B77C-EED2-4046-9A30-9446C6F096A0}" + ProjectSection(ProjectDependencies) = postProject + {C17BAB42-F00B-4F71-9DF6-A921511C89EE} = {C17BAB42-F00B-4F71-9DF6-A921511C89EE} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "line_style", "line_style.vcproj", "{8B25CCE0-0988-4999-AE65-5A5EE31BB44D}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mandelbrot", "mandelbrot.vcproj", "{7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "menubar", "menubar.vcproj", "{78079B1F-152B-4E83-87CB-364586AB3AAC}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "message", "message.vcproj", "{E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minimum", "minimum.vcproj", "{F658ABE4-7FE1-4404-9B7C-55E0D660F1B3}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "navigation", "navigation.vcproj", "{AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "output", "output.vcproj", "{1CA77C94-5785-4B38-B91A-1EAFBD885BC2}" + ProjectSection(ProjectDependencies) = postProject + {C17BAB42-F00B-4F71-9DF6-A921511C89EE} = {C17BAB42-F00B-4F71-9DF6-A921511C89EE} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "overlay", "overlay.vcproj", "{3B0BF144-5D75-4D4A-BF75-7347186C808F}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pack", "pack.vcproj", "{CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pixmap", "pixmap.vcproj", "{1CD667DD-E7AE-4F36-A1F7-F41FB59786BE}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pixmap_browser", "pixmap_browser.vcproj", "{289C605C-94CC-437F-836B-2FE41528EEEC}" + ProjectSection(ProjectDependencies) = postProject + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {6E8E1663-B88D-4454-ADF2-279666A93306} = {6E8E1663-B88D-4454-ADF2-279666A93306} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "preferences", "preferences.vcproj", "{D04E36D7-1C68-43E6-BE30-A7793CE3C799}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "radio", "radio.vcproj", "{AD5ACED4-F6EE-4AC0-B502-23CFD10EF603}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "resize", "resize.vcproj", "{46771042-C840-4314-BA3C-C5BC2FBD7CBB}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "resizebox", "resizebox.vcproj", "{2E03AF33-56A1-4366-B016-184CD96F3B56}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scroll", "scroll.vcproj", "{97541B63-87AA-4ACE-BBF5-175F8D1389EC}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shape", "shape.vcproj", "{45797F58-624B-4FA0-A7A3-5956114D8215}" + ProjectSection(ProjectDependencies) = postProject + {F7974A9C-C255-4385-96BC-E24EE0816F7C} = {F7974A9C-C255-4385-96BC-E24EE0816F7C} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "subwindow", "subwindow.vcproj", "{7A2467D2-B03A-4964-A289-EF233EB39F69}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sudoku", "sudoku.vcproj", "{AE750416-51BA-485C-BD76-EF11B4536EE8}" + ProjectSection(ProjectDependencies) = postProject + {D640A221-F95A-40FF-AC0E-0E8B615C7681} = {D640A221-F95A-40FF-AC0E-0E8B615C7681} + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} = {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF} + {08B82852-90B3-4767-A5D2-F0A4FCCB2377} = {08B82852-90B3-4767-A5D2-F0A4FCCB2377} + {6E8E1663-B88D-4454-ADF2-279666A93306} = {6E8E1663-B88D-4454-ADF2-279666A93306} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "symbols", "symbols.vcproj", "{3E822491-B134-43B0-A40E-9348FFAB527F}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tabs", "tabs.vcproj", "{AE750416-51BA-485C-BD76-EF11B4536EE8}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "threads", "threads.vcproj", "{45236F71-7031-40BC-ADCD-0535A64C04B0}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tile", "tile.vcproj", "{28D24031-1A17-497A-B926-59CF78076DED}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tiled_image", "tiled_image.vcproj", "{23F17042-704E-4198-8017-A8584E884CF7}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "valuators", "valuators.vcproj", "{CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3}" + ProjectSection(ProjectDependencies) = postProject + {8AED3078-8CD8-40C9-A8FF-46080024F1EB} = {8AED3078-8CD8-40C9-A8FF-46080024F1EB} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpeg", "jpeg.vcproj", "{08B82852-90B3-4767-A5D2-F0A4FCCB2377}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib.vcproj", "{E1D9CE3F-400D-40E8-AD0D-61C29B1847FF}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libpng.vcproj", "{D640A221-F95A-40FF-AC0E-0E8B615C7681}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "input_choice", "input_choice.vcproj", "{50651D04-C8F7-4C2B-B412-0848573BDF88}" + ProjectSection(ProjectDependencies) = postProject + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blocks", "blocks.vcproj", "{301A1EE3-8AF8-4EB8-9004-473B74E4083C}" + ProjectSection(ProjectDependencies) = postProject + {6E8E1663-B88D-4454-ADF2-279666A93306} = {6E8E1663-B88D-4454-ADF2-279666A93306} + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} = {E070AAFC-9D03-41A3-BC7D-30887EA0D50F} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {E30BB28D-DFA0-479C-B670-8CD872224B38}.Debug.ActiveCfg = Debug|Win32 + {E30BB28D-DFA0-479C-B670-8CD872224B38}.Debug.Build.0 = Debug|Win32 + {E30BB28D-DFA0-479C-B670-8CD872224B38}.Release.ActiveCfg = Release|Win32 + {E30BB28D-DFA0-479C-B670-8CD872224B38}.Release.Build.0 = Release|Win32 + {51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B}.Debug.ActiveCfg = Debug|Win32 + {51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B}.Debug.Build.0 = Debug|Win32 + {51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B}.Release.ActiveCfg = Release|Win32 + {51F6CDA8-3AF3-4DDC-B412-8E5E92F3393B}.Release.Build.0 = Release|Win32 + {39ADA7A1-A2C1-4F0B-8B92-04E335570C27}.Debug.ActiveCfg = Debug|Win32 + {39ADA7A1-A2C1-4F0B-8B92-04E335570C27}.Debug.Build.0 = Debug|Win32 + {39ADA7A1-A2C1-4F0B-8B92-04E335570C27}.Release.ActiveCfg = Release|Win32 + {39ADA7A1-A2C1-4F0B-8B92-04E335570C27}.Release.Build.0 = Release|Win32 + {DB6BAA16-C589-448F-9AB5-5969016549EB}.Debug.ActiveCfg = Debug|Win32 + {DB6BAA16-C589-448F-9AB5-5969016549EB}.Debug.Build.0 = Debug|Win32 + {DB6BAA16-C589-448F-9AB5-5969016549EB}.Release.ActiveCfg = Release|Win32 + {DB6BAA16-C589-448F-9AB5-5969016549EB}.Release.Build.0 = Release|Win32 + {65B5BB3F-EE54-4604-B49B-7676AED83AAB}.Debug.ActiveCfg = Debug|Win32 + {65B5BB3F-EE54-4604-B49B-7676AED83AAB}.Debug.Build.0 = Debug|Win32 + {65B5BB3F-EE54-4604-B49B-7676AED83AAB}.Release.ActiveCfg = Release|Win32 + {65B5BB3F-EE54-4604-B49B-7676AED83AAB}.Release.Build.0 = Release|Win32 + {E212D4B4-63D9-4D8D-84DB-45C8BC191462}.Debug.ActiveCfg = Debug|Win32 + {E212D4B4-63D9-4D8D-84DB-45C8BC191462}.Debug.Build.0 = Debug|Win32 + {E212D4B4-63D9-4D8D-84DB-45C8BC191462}.Release.ActiveCfg = Release|Win32 + {E212D4B4-63D9-4D8D-84DB-45C8BC191462}.Release.Build.0 = Release|Win32 + {2352F92C-8663-4637-B919-D76F0A9EC05E}.Debug.ActiveCfg = Debug|Win32 + {2352F92C-8663-4637-B919-D76F0A9EC05E}.Debug.Build.0 = Debug|Win32 + {2352F92C-8663-4637-B919-D76F0A9EC05E}.Release.ActiveCfg = Release|Win32 + {2352F92C-8663-4637-B919-D76F0A9EC05E}.Release.Build.0 = Release|Win32 + {0363AC35-F325-4C24-9DB9-E83337D55787}.Debug.ActiveCfg = Debug|Win32 + {0363AC35-F325-4C24-9DB9-E83337D55787}.Debug.Build.0 = Debug|Win32 + {0363AC35-F325-4C24-9DB9-E83337D55787}.Release.ActiveCfg = Release|Win32 + {0363AC35-F325-4C24-9DB9-E83337D55787}.Release.Build.0 = Release|Win32 + {67CE1C24-B0C0-4CD6-8D0F-68513C2398B9}.Debug.ActiveCfg = Debug|Win32 + {67CE1C24-B0C0-4CD6-8D0F-68513C2398B9}.Debug.Build.0 = Debug|Win32 + {67CE1C24-B0C0-4CD6-8D0F-68513C2398B9}.Release.ActiveCfg = Release|Win32 + {67CE1C24-B0C0-4CD6-8D0F-68513C2398B9}.Release.Build.0 = Release|Win32 + {92EEF887-8305-4D00-86B7-D3F98CC7AD87}.Debug.ActiveCfg = Debug|Win32 + {92EEF887-8305-4D00-86B7-D3F98CC7AD87}.Debug.Build.0 = Debug|Win32 + {92EEF887-8305-4D00-86B7-D3F98CC7AD87}.Release.ActiveCfg = Release|Win32 + {92EEF887-8305-4D00-86B7-D3F98CC7AD87}.Release.Build.0 = Release|Win32 + {122160ED-446E-4B15-8CB4-A2058DC7269A}.Debug.ActiveCfg = Debug|Win32 + {122160ED-446E-4B15-8CB4-A2058DC7269A}.Debug.Build.0 = Debug|Win32 + {122160ED-446E-4B15-8CB4-A2058DC7269A}.Release.ActiveCfg = Release|Win32 + {122160ED-446E-4B15-8CB4-A2058DC7269A}.Release.Build.0 = Release|Win32 + {D0BC7525-99E7-4247-B860-1B3CF2FF8165}.Debug.ActiveCfg = Debug|Win32 + {D0BC7525-99E7-4247-B860-1B3CF2FF8165}.Debug.Build.0 = Debug|Win32 + {D0BC7525-99E7-4247-B860-1B3CF2FF8165}.Release.ActiveCfg = Release|Win32 + {D0BC7525-99E7-4247-B860-1B3CF2FF8165}.Release.Build.0 = Release|Win32 + {BDACB9FC-6769-4A2D-A636-36CC25E3AC75}.Debug.ActiveCfg = Debug|Win32 + {BDACB9FC-6769-4A2D-A636-36CC25E3AC75}.Debug.Build.0 = Debug|Win32 + {BDACB9FC-6769-4A2D-A636-36CC25E3AC75}.Release.ActiveCfg = Release|Win32 + {BDACB9FC-6769-4A2D-A636-36CC25E3AC75}.Release.Build.0 = Release|Win32 + {0973844B-3E5F-4C38-95FF-E8935243D287}.Debug.ActiveCfg = Debug|Win32 + {0973844B-3E5F-4C38-95FF-E8935243D287}.Debug.Build.0 = Debug|Win32 + {0973844B-3E5F-4C38-95FF-E8935243D287}.Release.ActiveCfg = Release|Win32 + {0973844B-3E5F-4C38-95FF-E8935243D287}.Release.Build.0 = Release|Win32 + {0D1DB0EE-E997-4550-85D4-BDE209B75AD6}.Debug.ActiveCfg = Debug|Win32 + {0D1DB0EE-E997-4550-85D4-BDE209B75AD6}.Debug.Build.0 = Debug|Win32 + {0D1DB0EE-E997-4550-85D4-BDE209B75AD6}.Release.ActiveCfg = Release|Win32 + {0D1DB0EE-E997-4550-85D4-BDE209B75AD6}.Release.Build.0 = Release|Win32 + {27D45BA6-A403-4A71-B6D6-57DC0CEDCE15}.Debug.ActiveCfg = Debug|Win32 + {27D45BA6-A403-4A71-B6D6-57DC0CEDCE15}.Debug.Build.0 = Debug|Win32 + {27D45BA6-A403-4A71-B6D6-57DC0CEDCE15}.Release.ActiveCfg = Release|Win32 + {27D45BA6-A403-4A71-B6D6-57DC0CEDCE15}.Release.Build.0 = Release|Win32 + {09427220-8C9C-498A-8D50-1638D3FB87E5}.Debug.ActiveCfg = Debug|Win32 + {09427220-8C9C-498A-8D50-1638D3FB87E5}.Debug.Build.0 = Debug|Win32 + {09427220-8C9C-498A-8D50-1638D3FB87E5}.Release.ActiveCfg = Release|Win32 + {09427220-8C9C-498A-8D50-1638D3FB87E5}.Release.Build.0 = Release|Win32 + {EDDBF169-77C1-496E-9EFE-E500107E6E97}.Debug.ActiveCfg = Debug|Win32 + {EDDBF169-77C1-496E-9EFE-E500107E6E97}.Debug.Build.0 = Debug|Win32 + {EDDBF169-77C1-496E-9EFE-E500107E6E97}.Release.ActiveCfg = Release|Win32 + {EDDBF169-77C1-496E-9EFE-E500107E6E97}.Release.Build.0 = Release|Win32 + {0BDAEBF1-7A8D-434B-A543-4663464E972D}.Debug.ActiveCfg = Debug|Win32 + {0BDAEBF1-7A8D-434B-A543-4663464E972D}.Debug.Build.0 = Debug|Win32 + {0BDAEBF1-7A8D-434B-A543-4663464E972D}.Release.ActiveCfg = Release|Win32 + {0BDAEBF1-7A8D-434B-A543-4663464E972D}.Release.Build.0 = Release|Win32 + {2D29D6C9-B4A6-444C-A311-106A9C8A986F}.Debug.ActiveCfg = Debug|Win32 + {2D29D6C9-B4A6-444C-A311-106A9C8A986F}.Debug.Build.0 = Debug|Win32 + {2D29D6C9-B4A6-444C-A311-106A9C8A986F}.Release.ActiveCfg = Release|Win32 + {2D29D6C9-B4A6-444C-A311-106A9C8A986F}.Release.Build.0 = Release|Win32 + {6927F349-29DF-4D60-BC8F-5A3F5E133735}.Debug.ActiveCfg = Debug|Win32 + {6927F349-29DF-4D60-BC8F-5A3F5E133735}.Debug.Build.0 = Debug|Win32 + {6927F349-29DF-4D60-BC8F-5A3F5E133735}.Release.ActiveCfg = Release|Win32 + {6927F349-29DF-4D60-BC8F-5A3F5E133735}.Release.Build.0 = Release|Win32 + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F}.Debug.ActiveCfg = Debug|Win32 + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F}.Debug.Build.0 = Debug|Win32 + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F}.Release.ActiveCfg = Release|Win32 + {E070AAFC-9D03-41A3-BC7D-30887EA0D50F}.Release.Build.0 = Release|Win32 + {F0B8F4BD-955D-43CB-980C-805364D04A25}.Debug.ActiveCfg = Debug|Win32 + {F0B8F4BD-955D-43CB-980C-805364D04A25}.Debug.Build.0 = Debug|Win32 + {F0B8F4BD-955D-43CB-980C-805364D04A25}.Release.ActiveCfg = Release|Win32 + {F0B8F4BD-955D-43CB-980C-805364D04A25}.Release.Build.0 = Release|Win32 + {C17BAB42-F00B-4F71-9DF6-A921511C89EE}.Debug.ActiveCfg = Debug|Win32 + {C17BAB42-F00B-4F71-9DF6-A921511C89EE}.Debug.Build.0 = Debug|Win32 + {C17BAB42-F00B-4F71-9DF6-A921511C89EE}.Release.ActiveCfg = Release|Win32 + {C17BAB42-F00B-4F71-9DF6-A921511C89EE}.Release.Build.0 = Release|Win32 + {F7974A9C-C255-4385-96BC-E24EE0816F7C}.Debug.ActiveCfg = Debug|Win32 + {F7974A9C-C255-4385-96BC-E24EE0816F7C}.Debug.Build.0 = Debug|Win32 + {F7974A9C-C255-4385-96BC-E24EE0816F7C}.Release.ActiveCfg = Release|Win32 + {F7974A9C-C255-4385-96BC-E24EE0816F7C}.Release.Build.0 = Release|Win32 + {6E8E1663-B88D-4454-ADF2-279666A93306}.Debug.ActiveCfg = Debug|Win32 + {6E8E1663-B88D-4454-ADF2-279666A93306}.Debug.Build.0 = Debug|Win32 + {6E8E1663-B88D-4454-ADF2-279666A93306}.Release.ActiveCfg = Release|Win32 + {6E8E1663-B88D-4454-ADF2-279666A93306}.Release.Build.0 = Release|Win32 + {8AED3078-8CD8-40C9-A8FF-46080024F1EB}.Debug.ActiveCfg = Debug|Win32 + {8AED3078-8CD8-40C9-A8FF-46080024F1EB}.Debug.Build.0 = Debug|Win32 + {8AED3078-8CD8-40C9-A8FF-46080024F1EB}.Release.ActiveCfg = Release|Win32 + {8AED3078-8CD8-40C9-A8FF-46080024F1EB}.Release.Build.0 = Release|Win32 + {DF2A883A-7356-4603-9CB1-E8F1E6B1549D}.Debug.ActiveCfg = Debug|Win32 + {DF2A883A-7356-4603-9CB1-E8F1E6B1549D}.Debug.Build.0 = Debug|Win32 + {DF2A883A-7356-4603-9CB1-E8F1E6B1549D}.Release.ActiveCfg = Release|Win32 + {DF2A883A-7356-4603-9CB1-E8F1E6B1549D}.Release.Build.0 = Release|Win32 + {B1749154-F87B-489D-B4B0-ABD5ED20A96F}.Debug.ActiveCfg = Debug|Win32 + {B1749154-F87B-489D-B4B0-ABD5ED20A96F}.Debug.Build.0 = Debug|Win32 + {B1749154-F87B-489D-B4B0-ABD5ED20A96F}.Release.ActiveCfg = Release|Win32 + {B1749154-F87B-489D-B4B0-ABD5ED20A96F}.Release.Build.0 = Release|Win32 + {58A83386-65E6-4F22-8712-8B6B7E62913D}.Debug.ActiveCfg = Debug|Win32 + {58A83386-65E6-4F22-8712-8B6B7E62913D}.Debug.Build.0 = Debug|Win32 + {58A83386-65E6-4F22-8712-8B6B7E62913D}.Release.ActiveCfg = Release|Win32 + {58A83386-65E6-4F22-8712-8B6B7E62913D}.Release.Build.0 = Release|Win32 + {2147B9FD-7D65-4854-9770-D7B8767DB9AE}.Debug.ActiveCfg = Debug|Win32 + {2147B9FD-7D65-4854-9770-D7B8767DB9AE}.Debug.Build.0 = Debug|Win32 + {2147B9FD-7D65-4854-9770-D7B8767DB9AE}.Release.ActiveCfg = Release|Win32 + {2147B9FD-7D65-4854-9770-D7B8767DB9AE}.Release.Build.0 = Release|Win32 + {8D8D210D-F628-48BB-9127-D8003DF22018}.Debug.ActiveCfg = Debug|Win32 + {8D8D210D-F628-48BB-9127-D8003DF22018}.Debug.Build.0 = Debug|Win32 + {8D8D210D-F628-48BB-9127-D8003DF22018}.Release.ActiveCfg = Release|Win32 + {8D8D210D-F628-48BB-9127-D8003DF22018}.Release.Build.0 = Release|Win32 + {BFE8CC78-6B58-4305-A096-796A3088BB26}.Debug.ActiveCfg = Debug|Win32 + {BFE8CC78-6B58-4305-A096-796A3088BB26}.Debug.Build.0 = Debug|Win32 + {BFE8CC78-6B58-4305-A096-796A3088BB26}.Release.ActiveCfg = Release|Win32 + {BFE8CC78-6B58-4305-A096-796A3088BB26}.Release.Build.0 = Release|Win32 + {ADA2462A-3656-41D2-B8A8-8D942AA0F8E9}.Debug.ActiveCfg = Debug|Win32 + {ADA2462A-3656-41D2-B8A8-8D942AA0F8E9}.Debug.Build.0 = Debug|Win32 + {ADA2462A-3656-41D2-B8A8-8D942AA0F8E9}.Release.ActiveCfg = Release|Win32 + {ADA2462A-3656-41D2-B8A8-8D942AA0F8E9}.Release.Build.0 = Release|Win32 + {9F3F86DA-3CC5-481F-8201-166933B5C8FF}.Debug.ActiveCfg = Debug|Win32 + {9F3F86DA-3CC5-481F-8201-166933B5C8FF}.Debug.Build.0 = Debug|Win32 + {9F3F86DA-3CC5-481F-8201-166933B5C8FF}.Release.ActiveCfg = Release|Win32 + {9F3F86DA-3CC5-481F-8201-166933B5C8FF}.Release.Build.0 = Release|Win32 + {37C32832-DCE4-4BAA-9306-826064B30CCB}.Debug.ActiveCfg = Debug|Win32 + {37C32832-DCE4-4BAA-9306-826064B30CCB}.Debug.Build.0 = Debug|Win32 + {37C32832-DCE4-4BAA-9306-826064B30CCB}.Release.ActiveCfg = Release|Win32 + {37C32832-DCE4-4BAA-9306-826064B30CCB}.Release.Build.0 = Release|Win32 + {3322F289-B025-4DB1-A7D1-FBA3840F8A0B}.Debug.ActiveCfg = Debug|Win32 + {3322F289-B025-4DB1-A7D1-FBA3840F8A0B}.Debug.Build.0 = Debug|Win32 + {3322F289-B025-4DB1-A7D1-FBA3840F8A0B}.Release.ActiveCfg = Release|Win32 + {3322F289-B025-4DB1-A7D1-FBA3840F8A0B}.Release.Build.0 = Release|Win32 + {B5271094-DE51-4E60-B4FA-D8F0BDB969FE}.Debug.ActiveCfg = Debug|Win32 + {B5271094-DE51-4E60-B4FA-D8F0BDB969FE}.Debug.Build.0 = Debug|Win32 + {B5271094-DE51-4E60-B4FA-D8F0BDB969FE}.Release.ActiveCfg = Release|Win32 + {B5271094-DE51-4E60-B4FA-D8F0BDB969FE}.Release.Build.0 = Release|Win32 + {1C1B5A00-5F5D-4290-A07B-8A5A4A78570A}.Debug.ActiveCfg = Debug|Win32 + {1C1B5A00-5F5D-4290-A07B-8A5A4A78570A}.Debug.Build.0 = Debug|Win32 + {1C1B5A00-5F5D-4290-A07B-8A5A4A78570A}.Release.ActiveCfg = Release|Win32 + {1C1B5A00-5F5D-4290-A07B-8A5A4A78570A}.Release.Build.0 = Release|Win32 + {4DFA9F84-0457-4FE4-8008-283270610487}.Debug.ActiveCfg = Debug|Win32 + {4DFA9F84-0457-4FE4-8008-283270610487}.Debug.Build.0 = Debug|Win32 + {4DFA9F84-0457-4FE4-8008-283270610487}.Release.ActiveCfg = Release|Win32 + {4DFA9F84-0457-4FE4-8008-283270610487}.Release.Build.0 = Release|Win32 + {C3E7B77C-EED2-4046-9A30-9446C6F096A0}.Debug.ActiveCfg = Debug|Win32 + {C3E7B77C-EED2-4046-9A30-9446C6F096A0}.Debug.Build.0 = Debug|Win32 + {C3E7B77C-EED2-4046-9A30-9446C6F096A0}.Release.ActiveCfg = Release|Win32 + {C3E7B77C-EED2-4046-9A30-9446C6F096A0}.Release.Build.0 = Release|Win32 + {8B25CCE0-0988-4999-AE65-5A5EE31BB44D}.Debug.ActiveCfg = Debug|Win32 + {8B25CCE0-0988-4999-AE65-5A5EE31BB44D}.Debug.Build.0 = Debug|Win32 + {8B25CCE0-0988-4999-AE65-5A5EE31BB44D}.Release.ActiveCfg = Release|Win32 + {8B25CCE0-0988-4999-AE65-5A5EE31BB44D}.Release.Build.0 = Release|Win32 + {7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF}.Debug.ActiveCfg = Debug|Win32 + {7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF}.Debug.Build.0 = Debug|Win32 + {7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF}.Release.ActiveCfg = Release|Win32 + {7BBECC0F-9381-4BF2-87CA-3FD1DA93DEAF}.Release.Build.0 = Release|Win32 + {78079B1F-152B-4E83-87CB-364586AB3AAC}.Debug.ActiveCfg = Debug|Win32 + {78079B1F-152B-4E83-87CB-364586AB3AAC}.Debug.Build.0 = Debug|Win32 + {78079B1F-152B-4E83-87CB-364586AB3AAC}.Release.ActiveCfg = Release|Win32 + {78079B1F-152B-4E83-87CB-364586AB3AAC}.Release.Build.0 = Release|Win32 + {E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE}.Debug.ActiveCfg = Debug|Win32 + {E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE}.Debug.Build.0 = Debug|Win32 + {E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE}.Release.ActiveCfg = Release|Win32 + {E1A8934E-CB8D-4F74-B78A-EC7952BC4CBE}.Release.Build.0 = Release|Win32 + {F658ABE4-7FE1-4404-9B7C-55E0D660F1B3}.Debug.ActiveCfg = Debug|Win32 + {F658ABE4-7FE1-4404-9B7C-55E0D660F1B3}.Debug.Build.0 = Debug|Win32 + {F658ABE4-7FE1-4404-9B7C-55E0D660F1B3}.Release.ActiveCfg = Release|Win32 + {F658ABE4-7FE1-4404-9B7C-55E0D660F1B3}.Release.Build.0 = Release|Win32 + {AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E}.Debug.ActiveCfg = Debug|Win32 + {AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E}.Debug.Build.0 = Debug|Win32 + {AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E}.Release.ActiveCfg = Release|Win32 + {AA0ED6EA-2DA3-4486-AFBD-76CC9D206A1E}.Release.Build.0 = Release|Win32 + {1CA77C94-5785-4B38-B91A-1EAFBD885BC2}.Debug.ActiveCfg = Debug|Win32 + {1CA77C94-5785-4B38-B91A-1EAFBD885BC2}.Debug.Build.0 = Debug|Win32 + {1CA77C94-5785-4B38-B91A-1EAFBD885BC2}.Release.ActiveCfg = Release|Win32 + {1CA77C94-5785-4B38-B91A-1EAFBD885BC2}.Release.Build.0 = Release|Win32 + {3B0BF144-5D75-4D4A-BF75-7347186C808F}.Debug.ActiveCfg = Debug|Win32 + {3B0BF144-5D75-4D4A-BF75-7347186C808F}.Debug.Build.0 = Debug|Win32 + {3B0BF144-5D75-4D4A-BF75-7347186C808F}.Release.ActiveCfg = Release|Win32 + {3B0BF144-5D75-4D4A-BF75-7347186C808F}.Release.Build.0 = Release|Win32 + {CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1}.Debug.ActiveCfg = Debug|Win32 + {CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1}.Debug.Build.0 = Debug|Win32 + {CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1}.Release.ActiveCfg = Release|Win32 + {CEB7B88B-3AA5-4DD6-818F-CF19E12BF1E1}.Release.Build.0 = Release|Win32 + {1CD667DD-E7AE-4F36-A1F7-F41FB59786BE}.Debug.ActiveCfg = Debug|Win32 + {1CD667DD-E7AE-4F36-A1F7-F41FB59786BE}.Debug.Build.0 = Debug|Win32 + {1CD667DD-E7AE-4F36-A1F7-F41FB59786BE}.Release.ActiveCfg = Release|Win32 + {1CD667DD-E7AE-4F36-A1F7-F41FB59786BE}.Release.Build.0 = Release|Win32 + {289C605C-94CC-437F-836B-2FE41528EEEC}.Debug.ActiveCfg = Debug|Win32 + {289C605C-94CC-437F-836B-2FE41528EEEC}.Debug.Build.0 = Debug|Win32 + {289C605C-94CC-437F-836B-2FE41528EEEC}.Release.ActiveCfg = Release|Win32 + {289C605C-94CC-437F-836B-2FE41528EEEC}.Release.Build.0 = Release|Win32 + {D04E36D7-1C68-43E6-BE30-A7793CE3C799}.Debug.ActiveCfg = Debug|Win32 + {D04E36D7-1C68-43E6-BE30-A7793CE3C799}.Debug.Build.0 = Debug|Win32 + {D04E36D7-1C68-43E6-BE30-A7793CE3C799}.Release.ActiveCfg = Release|Win32 + {D04E36D7-1C68-43E6-BE30-A7793CE3C799}.Release.Build.0 = Release|Win32 + {AD5ACED4-F6EE-4AC0-B502-23CFD10EF603}.Debug.ActiveCfg = Debug|Win32 + {AD5ACED4-F6EE-4AC0-B502-23CFD10EF603}.Debug.Build.0 = Debug|Win32 + {AD5ACED4-F6EE-4AC0-B502-23CFD10EF603}.Release.ActiveCfg = Release|Win32 + {AD5ACED4-F6EE-4AC0-B502-23CFD10EF603}.Release.Build.0 = Release|Win32 + {46771042-C840-4314-BA3C-C5BC2FBD7CBB}.Debug.ActiveCfg = Debug|Win32 + {46771042-C840-4314-BA3C-C5BC2FBD7CBB}.Debug.Build.0 = Debug|Win32 + {46771042-C840-4314-BA3C-C5BC2FBD7CBB}.Release.ActiveCfg = Release|Win32 + {46771042-C840-4314-BA3C-C5BC2FBD7CBB}.Release.Build.0 = Release|Win32 + {2E03AF33-56A1-4366-B016-184CD96F3B56}.Debug.ActiveCfg = Debug|Win32 + {2E03AF33-56A1-4366-B016-184CD96F3B56}.Debug.Build.0 = Debug|Win32 + {2E03AF33-56A1-4366-B016-184CD96F3B56}.Release.ActiveCfg = Release|Win32 + {2E03AF33-56A1-4366-B016-184CD96F3B56}.Release.Build.0 = Release|Win32 + {97541B63-87AA-4ACE-BBF5-175F8D1389EC}.Debug.ActiveCfg = Debug|Win32 + {97541B63-87AA-4ACE-BBF5-175F8D1389EC}.Debug.Build.0 = Debug|Win32 + {97541B63-87AA-4ACE-BBF5-175F8D1389EC}.Release.ActiveCfg = Release|Win32 + {97541B63-87AA-4ACE-BBF5-175F8D1389EC}.Release.Build.0 = Release|Win32 + {45797F58-624B-4FA0-A7A3-5956114D8215}.Debug.ActiveCfg = Debug|Win32 + {45797F58-624B-4FA0-A7A3-5956114D8215}.Debug.Build.0 = Debug|Win32 + {45797F58-624B-4FA0-A7A3-5956114D8215}.Release.ActiveCfg = Release|Win32 + {45797F58-624B-4FA0-A7A3-5956114D8215}.Release.Build.0 = Release|Win32 + {7A2467D2-B03A-4964-A289-EF233EB39F69}.Debug.ActiveCfg = Debug|Win32 + {7A2467D2-B03A-4964-A289-EF233EB39F69}.Debug.Build.0 = Debug|Win32 + {7A2467D2-B03A-4964-A289-EF233EB39F69}.Release.ActiveCfg = Release|Win32 + {7A2467D2-B03A-4964-A289-EF233EB39F69}.Release.Build.0 = Release|Win32 + {AE750416-51BA-485C-BD76-EF11B4536EE8}.Debug.ActiveCfg = Debug|Win32 + {AE750416-51BA-485C-BD76-EF11B4536EE8}.Debug.Build.0 = Debug|Win32 + {AE750416-51BA-485C-BD76-EF11B4536EE8}.Release.ActiveCfg = Release|Win32 + {AE750416-51BA-485C-BD76-EF11B4536EE8}.Release.Build.0 = Release|Win32 + {3E822491-B134-43B0-A40E-9348FFAB527F}.Debug.ActiveCfg = Debug|Win32 + {3E822491-B134-43B0-A40E-9348FFAB527F}.Debug.Build.0 = Debug|Win32 + {3E822491-B134-43B0-A40E-9348FFAB527F}.Release.ActiveCfg = Release|Win32 + {3E822491-B134-43B0-A40E-9348FFAB527F}.Release.Build.0 = Release|Win32 + {AE750416-51BA-485C-BD76-EF11B4536EE8}.Debug.ActiveCfg = Debug|Win32 + {AE750416-51BA-485C-BD76-EF11B4536EE8}.Debug.Build.0 = Debug|Win32 + {AE750416-51BA-485C-BD76-EF11B4536EE8}.Release.ActiveCfg = Release|Win32 + {AE750416-51BA-485C-BD76-EF11B4536EE8}.Release.Build.0 = Release|Win32 + {45236F71-7031-40BC-ADCD-0535A64C04B0}.Debug.ActiveCfg = Debug|Win32 + {45236F71-7031-40BC-ADCD-0535A64C04B0}.Debug.Build.0 = Debug|Win32 + {45236F71-7031-40BC-ADCD-0535A64C04B0}.Release.ActiveCfg = Release|Win32 + {45236F71-7031-40BC-ADCD-0535A64C04B0}.Release.Build.0 = Release|Win32 + {28D24031-1A17-497A-B926-59CF78076DED}.Debug.ActiveCfg = Debug|Win32 + {28D24031-1A17-497A-B926-59CF78076DED}.Debug.Build.0 = Debug|Win32 + {28D24031-1A17-497A-B926-59CF78076DED}.Release.ActiveCfg = Release|Win32 + {28D24031-1A17-497A-B926-59CF78076DED}.Release.Build.0 = Release|Win32 + {23F17042-704E-4198-8017-A8584E884CF7}.Debug.ActiveCfg = Debug|Win32 + {23F17042-704E-4198-8017-A8584E884CF7}.Debug.Build.0 = Debug|Win32 + {23F17042-704E-4198-8017-A8584E884CF7}.Release.ActiveCfg = Release|Win32 + {23F17042-704E-4198-8017-A8584E884CF7}.Release.Build.0 = Release|Win32 + {CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3}.Debug.ActiveCfg = Debug|Win32 + {CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3}.Debug.Build.0 = Debug|Win32 + {CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3}.Release.ActiveCfg = Release|Win32 + {CEE12ACB-20E4-45E4-AD5E-D15D7CFF68C3}.Release.Build.0 = Release|Win32 + {08B82852-90B3-4767-A5D2-F0A4FCCB2377}.Debug.ActiveCfg = Debug|Win32 + {08B82852-90B3-4767-A5D2-F0A4FCCB2377}.Debug.Build.0 = Debug|Win32 + {08B82852-90B3-4767-A5D2-F0A4FCCB2377}.Release.ActiveCfg = Release|Win32 + {08B82852-90B3-4767-A5D2-F0A4FCCB2377}.Release.Build.0 = Release|Win32 + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF}.Debug.ActiveCfg = Debug|Win32 + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF}.Debug.Build.0 = Debug|Win32 + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF}.Release.ActiveCfg = Release|Win32 + {E1D9CE3F-400D-40E8-AD0D-61C29B1847FF}.Release.Build.0 = Release|Win32 + {D640A221-F95A-40FF-AC0E-0E8B615C7681}.Debug.ActiveCfg = Debug|Win32 + {D640A221-F95A-40FF-AC0E-0E8B615C7681}.Debug.Build.0 = Debug|Win32 + {D640A221-F95A-40FF-AC0E-0E8B615C7681}.Release.ActiveCfg = Release|Win32 + {D640A221-F95A-40FF-AC0E-0E8B615C7681}.Release.Build.0 = Release|Win32 + {50651D04-C8F7-4C2B-B412-0848573BDF88}.Debug.ActiveCfg = Debug|Win32 + {50651D04-C8F7-4C2B-B412-0848573BDF88}.Debug.Build.0 = Debug|Win32 + {50651D04-C8F7-4C2B-B412-0848573BDF88}.Release.ActiveCfg = Release|Win32 + {50651D04-C8F7-4C2B-B412-0848573BDF88}.Release.Build.0 = Release|Win32 + {301A1EE3-8AF8-4EB8-9004-473B74E4083C}.Debug.ActiveCfg = Debug|Win32 + {301A1EE3-8AF8-4EB8-9004-473B74E4083C}.Debug.Build.0 = Debug|Win32 + {301A1EE3-8AF8-4EB8-9004-473B74E4083C}.Release.ActiveCfg = Release|Win32 + {301A1EE3-8AF8-4EB8-9004-473B74E4083C}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/third_party/windows/fltk-1.1.10/vcnet/fltkdll.vcproj b/third_party/windows/fltk-1.1.10/vcnet/fltkdll.vcproj new file mode 100644 index 0000000..380d697 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/fltkdll.vcproj @@ -0,0 +1,2909 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/fltkforms.vcproj b/third_party/windows/fltk-1.1.10/vcnet/fltkforms.vcproj new file mode 100644 index 0000000..bf9695f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/fltkforms.vcproj @@ -0,0 +1,238 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/fltkgl.vcproj b/third_party/windows/fltk-1.1.10/vcnet/fltkgl.vcproj new file mode 100644 index 0000000..03eac24 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/fltkgl.vcproj @@ -0,0 +1,329 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/fltkimages.vcproj b/third_party/windows/fltk-1.1.10/vcnet/fltkimages.vcproj new file mode 100644 index 0000000..e906d8a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/fltkimages.vcproj @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/fluid.vcproj b/third_party/windows/fltk-1.1.10/vcnet/fluid.vcproj new file mode 100644 index 0000000..a46e646 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/fluid.vcproj @@ -0,0 +1,495 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/fonts.vcproj b/third_party/windows/fltk-1.1.10/vcnet/fonts.vcproj new file mode 100644 index 0000000..182e2b8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/fonts.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/forms.vcproj b/third_party/windows/fltk-1.1.10/vcnet/forms.vcproj new file mode 100644 index 0000000..4e97c7c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/forms.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/fractals.vcproj b/third_party/windows/fltk-1.1.10/vcnet/fractals.vcproj new file mode 100644 index 0000000..f2303ec --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/fractals.vcproj @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/fullscreen.vcproj b/third_party/windows/fltk-1.1.10/vcnet/fullscreen.vcproj new file mode 100644 index 0000000..5d18404 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/fullscreen.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/gl_overlay.vcproj b/third_party/windows/fltk-1.1.10/vcnet/gl_overlay.vcproj new file mode 100644 index 0000000..6db553e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/gl_overlay.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/glpuzzle.vcproj b/third_party/windows/fltk-1.1.10/vcnet/glpuzzle.vcproj new file mode 100644 index 0000000..63ee027 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/glpuzzle.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/hello.vcproj b/third_party/windows/fltk-1.1.10/vcnet/hello.vcproj new file mode 100644 index 0000000..b682c42 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/hello.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/help.vcproj b/third_party/windows/fltk-1.1.10/vcnet/help.vcproj new file mode 100644 index 0000000..4997f30 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/help.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/iconize.vcproj b/third_party/windows/fltk-1.1.10/vcnet/iconize.vcproj new file mode 100644 index 0000000..1b457a8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/iconize.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/image.vcproj b/third_party/windows/fltk-1.1.10/vcnet/image.vcproj new file mode 100644 index 0000000..8a9d4fe --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/image.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/inactive.vcproj b/third_party/windows/fltk-1.1.10/vcnet/inactive.vcproj new file mode 100644 index 0000000..126a59a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/inactive.vcproj @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/input.vcproj b/third_party/windows/fltk-1.1.10/vcnet/input.vcproj new file mode 100644 index 0000000..0722dd8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/input.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/input_choice.vcproj b/third_party/windows/fltk-1.1.10/vcnet/input_choice.vcproj new file mode 100644 index 0000000..ba3f262 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/input_choice.vcproj @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/jpeg.vcproj b/third_party/windows/fltk-1.1.10/vcnet/jpeg.vcproj new file mode 100644 index 0000000..1b349b7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/jpeg.vcproj @@ -0,0 +1,994 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/keyboard.vcproj b/third_party/windows/fltk-1.1.10/vcnet/keyboard.vcproj new file mode 100644 index 0000000..e5c14fb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/keyboard.vcproj @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/label.vcproj b/third_party/windows/fltk-1.1.10/vcnet/label.vcproj new file mode 100644 index 0000000..e52c56a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/label.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/libpng.vcproj b/third_party/windows/fltk-1.1.10/vcnet/libpng.vcproj new file mode 100644 index 0000000..fc54e94 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/libpng.vcproj @@ -0,0 +1,403 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/line_style.vcproj b/third_party/windows/fltk-1.1.10/vcnet/line_style.vcproj new file mode 100644 index 0000000..f0fff41 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/line_style.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/mandelbrot.vcproj b/third_party/windows/fltk-1.1.10/vcnet/mandelbrot.vcproj new file mode 100644 index 0000000..fc091fb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/mandelbrot.vcproj @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/menubar.vcproj b/third_party/windows/fltk-1.1.10/vcnet/menubar.vcproj new file mode 100644 index 0000000..19f9aa8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/menubar.vcproj @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/message.vcproj b/third_party/windows/fltk-1.1.10/vcnet/message.vcproj new file mode 100644 index 0000000..f552481 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/message.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/minimum.vcproj b/third_party/windows/fltk-1.1.10/vcnet/minimum.vcproj new file mode 100644 index 0000000..2c32345 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/minimum.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/navigation.vcproj b/third_party/windows/fltk-1.1.10/vcnet/navigation.vcproj new file mode 100644 index 0000000..66368c2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/navigation.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/output.vcproj b/third_party/windows/fltk-1.1.10/vcnet/output.vcproj new file mode 100644 index 0000000..bb225a9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/output.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/overlay.vcproj b/third_party/windows/fltk-1.1.10/vcnet/overlay.vcproj new file mode 100644 index 0000000..511e7d3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/overlay.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/pack.vcproj b/third_party/windows/fltk-1.1.10/vcnet/pack.vcproj new file mode 100644 index 0000000..82096e5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/pack.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/pixmap.vcproj b/third_party/windows/fltk-1.1.10/vcnet/pixmap.vcproj new file mode 100644 index 0000000..f9ceea7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/pixmap.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/pixmap_browser.vcproj b/third_party/windows/fltk-1.1.10/vcnet/pixmap_browser.vcproj new file mode 100644 index 0000000..97d4adf --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/pixmap_browser.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/preferences.vcproj b/third_party/windows/fltk-1.1.10/vcnet/preferences.vcproj new file mode 100644 index 0000000..79012b1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/preferences.vcproj @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/radio.vcproj b/third_party/windows/fltk-1.1.10/vcnet/radio.vcproj new file mode 100644 index 0000000..f6a8778 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/radio.vcproj @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/resize.vcproj b/third_party/windows/fltk-1.1.10/vcnet/resize.vcproj new file mode 100644 index 0000000..2c63047 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/resize.vcproj @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/resizebox.vcproj b/third_party/windows/fltk-1.1.10/vcnet/resizebox.vcproj new file mode 100644 index 0000000..1834854 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/resizebox.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/scroll.vcproj b/third_party/windows/fltk-1.1.10/vcnet/scroll.vcproj new file mode 100644 index 0000000..1221824 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/scroll.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/shape.vcproj b/third_party/windows/fltk-1.1.10/vcnet/shape.vcproj new file mode 100644 index 0000000..44379c7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/shape.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/subwindow.vcproj b/third_party/windows/fltk-1.1.10/vcnet/subwindow.vcproj new file mode 100644 index 0000000..ee2c0d0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/subwindow.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/sudoku.vcproj b/third_party/windows/fltk-1.1.10/vcnet/sudoku.vcproj new file mode 100644 index 0000000..99e28aa --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/sudoku.vcproj @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/symbols.vcproj b/third_party/windows/fltk-1.1.10/vcnet/symbols.vcproj new file mode 100644 index 0000000..fdc3455 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/symbols.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/tabs.vcproj b/third_party/windows/fltk-1.1.10/vcnet/tabs.vcproj new file mode 100644 index 0000000..5a1d32b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/tabs.vcproj @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/threads.vcproj b/third_party/windows/fltk-1.1.10/vcnet/threads.vcproj new file mode 100644 index 0000000..fc56c64 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/threads.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/tile.vcproj b/third_party/windows/fltk-1.1.10/vcnet/tile.vcproj new file mode 100644 index 0000000..2e1ca05 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/tile.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/tiled_image.vcproj b/third_party/windows/fltk-1.1.10/vcnet/tiled_image.vcproj new file mode 100644 index 0000000..503d6ac --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/tiled_image.vcproj @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/valuators.vcproj b/third_party/windows/fltk-1.1.10/vcnet/valuators.vcproj new file mode 100644 index 0000000..5dfb91a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/valuators.vcproj @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/vcnet/zlib.vcproj b/third_party/windows/fltk-1.1.10/vcnet/zlib.vcproj new file mode 100644 index 0000000..13bfe29 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/vcnet/zlib.vcproj @@ -0,0 +1,326 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/visualc/CubeView.dsp b/third_party/windows/fltk-1.1.10/visualc/CubeView.dsp new file mode 100644 index 0000000..3006ba9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/CubeView.dsp @@ -0,0 +1,136 @@ +# Microsoft Developer Studio Project File - Name="CubeView" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=CubeView - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "CubeView.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "CubeView.mak" CFG="CubeView - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "CubeView - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "CubeView - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "CubeView - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "CubeView___" +# PROP BASE Intermediate_Dir "CubeView___" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "CubeView___" +# PROP Intermediate_Dir "CubeView___" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 opengl32.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/CubeView.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "CubeView - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "CubeView__0" +# PROP BASE Intermediate_Dir "CubeView__0" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "CubeView__0" +# PROP Intermediate_Dir "CubeView__0" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 opengl32.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/CubeViewd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "CubeView - Win32 Release" +# Name "CubeView - Win32 Debug" +# Begin Source File + +SOURCE=..\test\CubeMain.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\CubeView.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\CubeViewUI.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\CubeViewUI.fl + +!IF "$(CFG)" == "CubeView - Win32 Release" + +# Begin Custom Build - Create .cxx and .h file with fluid +InputPath=..\test\CubeViewUI.fl + +"..\test\CubeViewUI.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluid -c CubeViewUI.fl + cd ..\visualc + +# End Custom Build + +!ELSEIF "$(CFG)" == "CubeView - Win32 Debug" + +# Begin Custom Build - Create .cxx and .h file with fluidd +InputPath=..\test\CubeViewUI.fl + +"..\test\CubeViewUI.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluidd -c CubeViewUI.fl + cd ..\visualc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/adjuster.dsp b/third_party/windows/fltk-1.1.10/visualc/adjuster.dsp new file mode 100644 index 0000000..882d0a0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/adjuster.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="adjuster" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=adjuster - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "adjuster.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "adjuster.mak" CFG="adjuster - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "adjuster - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "adjuster - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "adjuster - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/adjuster.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "adjuster - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "adjuster_" +# PROP BASE Intermediate_Dir "adjuster_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "adjuster_" +# PROP Intermediate_Dir "adjuster_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/adjusterd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "adjuster - Win32 Release" +# Name "adjuster - Win32 Debug" +# Begin Source File + +SOURCE=..\test\adjuster.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/arc.dsp b/third_party/windows/fltk-1.1.10/visualc/arc.dsp new file mode 100644 index 0000000..b3ef274 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/arc.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="arc" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=arc - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "arc.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "arc.mak" CFG="arc - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "arc - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "arc - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "arc - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/arc.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "arc - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "arc_" +# PROP BASE Intermediate_Dir "arc_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "arc_" +# PROP Intermediate_Dir "arc_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/arcd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "arc - Win32 Release" +# Name "arc - Win32 Debug" +# Begin Source File + +SOURCE=..\test\arc.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/ask.dsp b/third_party/windows/fltk-1.1.10/visualc/ask.dsp new file mode 100644 index 0000000..5e95fba --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/ask.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="ask" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=ask - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "ask.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "ask.mak" CFG="ask - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "ask - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "ask - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "ask - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/ask.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "ask - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "ask_" +# PROP BASE Intermediate_Dir "ask_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "ask_" +# PROP Intermediate_Dir "ask_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/askd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "ask - Win32 Release" +# Name "ask - Win32 Debug" +# Begin Source File + +SOURCE=..\test\ask.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/bitmap.dsp b/third_party/windows/fltk-1.1.10/visualc/bitmap.dsp new file mode 100644 index 0000000..fbb397d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/bitmap.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="bitmap" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=bitmap - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "bitmap.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "bitmap.mak" CFG="bitmap - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "bitmap - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "bitmap - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "bitmap - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/bitmap.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "bitmap - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "bitmap_" +# PROP BASE Intermediate_Dir "bitmap_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "bitmap_" +# PROP Intermediate_Dir "bitmap_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/bitmapd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "bitmap - Win32 Release" +# Name "bitmap - Win32 Debug" +# Begin Source File + +SOURCE=..\test\bitmap.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/blocks.dsp b/third_party/windows/fltk-1.1.10/visualc/blocks.dsp new file mode 100644 index 0000000..58c0e55 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/blocks.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="blocks" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=blocks - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "blocks.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "blocks.mak" CFG="blocks - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "blocks - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "blocks - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "blocks - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 winmm.lib fltk.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/blocks.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "blocks - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "blocks_" +# PROP BASE Intermediate_Dir "blocks_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "blocks_" +# PROP Intermediate_Dir "blocks_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 winmm.lib fltkd.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/blocksd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "blocks - Win32 Release" +# Name "blocks - Win32 Debug" +# Begin Source File + +SOURCE=..\test\blocks.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/boxtype.dsp b/third_party/windows/fltk-1.1.10/visualc/boxtype.dsp new file mode 100644 index 0000000..98c11e8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/boxtype.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="boxtype" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=boxtype - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "boxtype.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "boxtype.mak" CFG="boxtype - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "boxtype - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "boxtype - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "boxtype - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/boxtype.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "boxtype - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "boxtype_" +# PROP BASE Intermediate_Dir "boxtype_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "boxtype_" +# PROP Intermediate_Dir "boxtype_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/boxtyped.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "boxtype - Win32 Release" +# Name "boxtype - Win32 Debug" +# Begin Source File + +SOURCE=..\test\boxtype.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/browser.dsp b/third_party/windows/fltk-1.1.10/visualc/browser.dsp new file mode 100644 index 0000000..21c3f47 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/browser.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="browser" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=browser - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "browser.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "browser.mak" CFG="browser - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "browser - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "browser - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "browser - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/browser.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "browser - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "browser_" +# PROP BASE Intermediate_Dir "browser_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "browser_" +# PROP Intermediate_Dir "browser_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/browserd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "browser - Win32 Release" +# Name "browser - Win32 Debug" +# Begin Source File + +SOURCE=..\test\browser.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/button.dsp b/third_party/windows/fltk-1.1.10/visualc/button.dsp new file mode 100644 index 0000000..c753f1d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/button.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="button" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=button - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "button.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "button.mak" CFG="button - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "button - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "button - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "button - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/button.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "button - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "button_" +# PROP BASE Intermediate_Dir "button_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "button_" +# PROP Intermediate_Dir "button_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/buttond.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "button - Win32 Release" +# Name "button - Win32 Debug" +# Begin Source File + +SOURCE=..\test\button.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/buttons.dsp b/third_party/windows/fltk-1.1.10/visualc/buttons.dsp new file mode 100644 index 0000000..4c76ff6 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/buttons.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="buttons" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=buttons - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "buttons.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "buttons.mak" CFG="buttons - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "buttons - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "buttons - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "buttons - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/buttons.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "buttons - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "buttons_" +# PROP BASE Intermediate_Dir "buttons_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "buttons_" +# PROP Intermediate_Dir "buttons_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/buttonsd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "buttons - Win32 Release" +# Name "buttons - Win32 Debug" +# Begin Source File + +SOURCE=..\test\buttons.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/checkers.dsp b/third_party/windows/fltk-1.1.10/visualc/checkers.dsp new file mode 100644 index 0000000..216cf8d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/checkers.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="checkers" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=checkers - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "checkers.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "checkers.mak" CFG="checkers - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "checkers - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "checkers - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "checkers - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/checkers.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "checkers - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "checkers_" +# PROP BASE Intermediate_Dir "checkers_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "checkers_" +# PROP Intermediate_Dir "checkers_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/checkersd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "checkers - Win32 Release" +# Name "checkers - Win32 Debug" +# Begin Source File + +SOURCE=..\test\checkers.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/clock.dsp b/third_party/windows/fltk-1.1.10/visualc/clock.dsp new file mode 100644 index 0000000..d2a73a7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/clock.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="clock" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=clock - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "clock.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "clock.mak" CFG="clock - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "clock - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "clock - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "clock - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/clock.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "clock - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "clock_" +# PROP BASE Intermediate_Dir "clock_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "clock_" +# PROP Intermediate_Dir "clock_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/clockd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "clock - Win32 Release" +# Name "clock - Win32 Debug" +# Begin Source File + +SOURCE=..\test\clock.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/colbrowser.dsp b/third_party/windows/fltk-1.1.10/visualc/colbrowser.dsp new file mode 100644 index 0000000..bb10c46 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/colbrowser.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="colbrowser" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=colbrowser - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "colbrowser.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "colbrowser.mak" CFG="colbrowser - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "colbrowser - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "colbrowser - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "colbrowser - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/colbrowser.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "colbrowser - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "colbrowser_" +# PROP BASE Intermediate_Dir "colbrowser_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "colbrowser_" +# PROP Intermediate_Dir "colbrowser_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/colbrowserd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "colbrowser - Win32 Release" +# Name "colbrowser - Win32 Debug" +# Begin Source File + +SOURCE=..\test\colbrowser.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/color_chooser.dsp b/third_party/windows/fltk-1.1.10/visualc/color_chooser.dsp new file mode 100644 index 0000000..917544f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/color_chooser.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="color_chooser" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=color_chooser - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "color_chooser.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "color_chooser.mak" CFG="color_chooser - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "color_chooser - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "color_chooser - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "color_chooser - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /machine:I386 /nodefaultlib:"libcd" /out:"../test/color_chooser.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "color_chooser - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "color_chooser_" +# PROP BASE Intermediate_Dir "color_chooser_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "color_chooser_" +# PROP Intermediate_Dir "color_chooser_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/color_chooserd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "color_chooser - Win32 Release" +# Name "color_chooser - Win32 Debug" +# Begin Source File + +SOURCE=..\test\color_chooser.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/config.h b/third_party/windows/fltk-1.1.10/visualc/config.h new file mode 100644 index 0000000..a07176c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/config.h @@ -0,0 +1,195 @@ +/* + * "$Id: config.h 4454 2005-07-24 18:41:30Z matt $" + * + * Configuration file for the Fast Light Tool Kit (FLTK) for Visual C++. + * + * Copyright 1998-2005 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems to "fltk-bugs@fltk.org". + */ + +/* + * Where to find files... + */ + +#define FLTK_DATADIR "C:/FLTK" +#define FLTK_DOCDIR "C:/FLTK/DOC" + +/* + * BORDER_WIDTH: + * + * Thickness of FL_UP_BOX and FL_DOWN_BOX. Current 1,2, and 3 are + * supported. 3 is the historic FLTK look. 2 looks more like Microsoft + * Windows, KDE, and Qt, and is the default when building for Windows. + * 1 is a plausible future evolution... Note that this may be simulated + * at runtime by redefining the boxtypes using Fl::set_boxtype(). + */ + +#define BORDER_WIDTH 2 + +/* + * HAVE_GL: + * + * Do you have OpenGL? Set this to 0 if you don't have or plan to use + * OpenGL, and FLTK will be smaller. + */ + +#define HAVE_GL 1 + +/* + * HAVE_GL_GLU_H: + * + * Do you have the OpenGL Utility Library header file? + * (many broken Mesa RPMs do not...) + */ + +#define HAVE_GL_GLU_H 1 + +/* + * USE_COLORMAP: + * + * Setting this to zero will save a good deal of code (especially for + * fl_draw_image), but FLTK will only work on TrueColor visuals. + */ + +#define USE_COLORMAP 1 + +/* + * HAVE_XDBE: + * + * Do we have the X double-buffer extension? + */ + +#define HAVE_XDBE 0 + +/* + * USE_XDBE: + * + * Actually try to use the double-buffer extension? Set this to zero + * disable use of XDBE without breaking the list_visuals program. + */ + +#define USE_XDBE HAVE_XDBE + +/* + * HAVE_OVERLAY: + * + * Use the X overlay extension? FLTK will try to use an overlay + * visual for Fl_Overlay_Window, the Gl_Window overlay, and for the + * menus. Setting this to zero will remove a substantial amount of + * code from FLTK. Overlays have only been tested on SGI servers! + */ + +#define HAVE_OVERLAY 0 + +/* + * HAVE_GL_OVERLAY: + * + * It is possible your GL has an overlay even if X does not. If so, + * set this to 1. + */ + +#define HAVE_GL_OVERLAY 1 + +/* + * WORDS_BIGENDIAN: + * + * Byte order of your machine: 1 = big-endian, 0 = little-endian. + */ + +#define WORDS_BIGENDIAN 0 + +/* + * U16, U32, U64: + * + * Types used by fl_draw_image. One of U32 or U64 must be defined. + * U16 is optional but FLTK will work better with it! + */ + +#define U16 unsigned short +#define U32 unsigned +#undef U64 + +/* + * HAVE_DIRENT_H, HAVE_SYS_NDIR_H, HAVE_SYS_DIR_H, HAVE_NDIR_H, HAVE_SCANDIR: + * + * Where is (used only by fl_file_chooser and scandir). + */ + +/*#undef HAVE_DIRENT_H */ +/*#undef HAVE_SYS_NDIR_H */ +/*#undef HAVE_SYS_DIR_H */ +/*#undef HAVE_NDIR_H */ +/*#undef HAVE_SCANDIR */ + +/* + * Possibly missing sprintf-style functions: + */ + +#define HAVE_VSNPRINTF 0 +#define HAVE_SNPRINTF 0 + +/* + * String functions... + */ + +#define HAVE_STRCASECMP 1 +/*#undef HAVE_STRLCAT*/ +/*#undef HAVE_STRLCPY*/ + +/* + * Do we have POSIX locale support? + */ + +#define HAVE_LOCALE_H 1 +#define HAVE_LOCALECONV 1 + +/* + * HAVE_POLL: + * + * Use poll() if we don't have select(). + */ + +#define HAVE_POLL 0 + +/* + * Do we have various image libraries? + */ + +#define HAVE_LIBPNG +#define HAVE_LIBZ +#define HAVE_LIBJPEG + +/* + * Which header file do we include for libpng? + */ + +#define HAVE_PNG_H +#undef HAVE_LIBPNG_PNG_H + +/* + * Do we have the png_xyz() functions? + */ + +#define HAVE_PNG_GET_VALID +#define HAVE_PNG_SET_TRNS_TO_ALPHA + + +/* + * End of "$Id: config.h 4454 2005-07-24 18:41:30Z matt $". + */ diff --git a/third_party/windows/fltk-1.1.10/visualc/cube.dsp b/third_party/windows/fltk-1.1.10/visualc/cube.dsp new file mode 100644 index 0000000..e0f2b68 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/cube.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="cube" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=cube - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "cube.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "cube.mak" CFG="cube - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "cube - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "cube - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "cube - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 glu32.lib opengl32.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/cube.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "cube - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "cube_" +# PROP BASE Intermediate_Dir "cube_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "cube_" +# PROP Intermediate_Dir "cube_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 glu32.lib opengl32.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/cubed.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "cube - Win32 Release" +# Name "cube - Win32 Debug" +# Begin Source File + +SOURCE=..\test\cube.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/cursor.dsp b/third_party/windows/fltk-1.1.10/visualc/cursor.dsp new file mode 100644 index 0000000..670c811 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/cursor.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="cursor" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=cursor - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "cursor.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "cursor.mak" CFG="cursor - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "cursor - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "cursor - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "cursor - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/cursor.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "cursor - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "cursor_" +# PROP BASE Intermediate_Dir "cursor_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "cursor_" +# PROP Intermediate_Dir "cursor_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/cursord.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "cursor - Win32 Release" +# Name "cursor - Win32 Debug" +# Begin Source File + +SOURCE=..\test\cursor.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/curve.dsp b/third_party/windows/fltk-1.1.10/visualc/curve.dsp new file mode 100644 index 0000000..4801ea3 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/curve.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="curve" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=curve - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "curve.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "curve.mak" CFG="curve - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "curve - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "curve - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "curve - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/curve.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "curve - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "curve_" +# PROP BASE Intermediate_Dir "curve_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "curve_" +# PROP Intermediate_Dir "curve_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/curved.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "curve - Win32 Release" +# Name "curve - Win32 Debug" +# Begin Source File + +SOURCE=..\test\curve.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/demo.dsp b/third_party/windows/fltk-1.1.10/visualc/demo.dsp new file mode 100644 index 0000000..528c4e8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/demo.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="demo" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=demo - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "demo.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "demo.mak" CFG="demo - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "demo - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "demo - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "demo - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/demo.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "demo - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "demo_" +# PROP BASE Intermediate_Dir "demo_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "demo_" +# PROP Intermediate_Dir "demo_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/demod.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "demo - Win32 Release" +# Name "demo - Win32 Debug" +# Begin Source File + +SOURCE=..\test\demo.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/doublebuffer.dsp b/third_party/windows/fltk-1.1.10/visualc/doublebuffer.dsp new file mode 100644 index 0000000..3935298 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/doublebuffer.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="doublebuffer" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=doublebuffer - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "doublebuffer.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "doublebuffer.mak" CFG="doublebuffer - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "doublebuffer - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "doublebuffer - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "doublebuffer - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/doublebuffer.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "doublebuffer - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "doublebuffer_" +# PROP BASE Intermediate_Dir "doublebuffer_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "doublebuffer_" +# PROP Intermediate_Dir "doublebuffer_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/doublebufferd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "doublebuffer - Win32 Release" +# Name "doublebuffer - Win32 Debug" +# Begin Source File + +SOURCE=..\test\doublebuffer.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/editor.dsp b/third_party/windows/fltk-1.1.10/visualc/editor.dsp new file mode 100644 index 0000000..d130cfd --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/editor.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="editor" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=editor - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "editor.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "editor.mak" CFG="editor - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "editor - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "editor - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "editor - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "FL_DLL" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /entry:"mainCRTStartup" /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/editor.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "editor - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "editor_" +# PROP BASE Intermediate_Dir "editor_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "editor_" +# PROP Intermediate_Dir "editor_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "FL_DLL" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /entry:"mainCRTStartup" /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/editord.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "editor - Win32 Release" +# Name "editor - Win32 Debug" +# Begin Source File + +SOURCE=..\test\editor.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/fast_slow.dsp b/third_party/windows/fltk-1.1.10/visualc/fast_slow.dsp new file mode 100644 index 0000000..6f1d0de --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/fast_slow.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="fast_slow" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=fast_slow - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "fast_slow.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "fast_slow.mak" CFG="fast_slow - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "fast_slow - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "fast_slow - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "fast_slow - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/fast_slow.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "fast_slow - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "fast_slow_" +# PROP BASE Intermediate_Dir "fast_slow_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "fast_slow_" +# PROP Intermediate_Dir "fast_slow_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/fast_slowd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "fast_slow - Win32 Release" +# Name "fast_slow - Win32 Debug" +# Begin Source File + +SOURCE=..\test\fast_slow.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\fast_slow.fl + +!IF "$(CFG)" == "fast_slow - Win32 Release" + +# Begin Custom Build - Create .cxx and .h file with fluid +InputPath=..\test\fast_slow.fl + +"..\test\fast_slow.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluid -c fast_slow.fl + cd ..\visualc + +# End Custom Build + +!ELSEIF "$(CFG)" == "fast_slow - Win32 Debug" + +# Begin Custom Build - Create .cxx and .h file with fluidd +InputPath=..\test\fast_slow.fl + +"..\test\fast_slow.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluidd -c fast_slow.fl + cd ..\visualc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/file_chooser.dsp b/third_party/windows/fltk-1.1.10/visualc/file_chooser.dsp new file mode 100644 index 0000000..cf157ec --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/file_chooser.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="file_chooser" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=file_chooser - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "file_chooser.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "file_chooser.mak" CFG="file_chooser - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "file_chooser - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "file_chooser - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "file_chooser - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /nodefaultlib:"libcmt" /out:"../test/file_chooser.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "file_chooser - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "file_chooser_" +# PROP BASE Intermediate_Dir "file_chooser_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "file_chooser_" +# PROP Intermediate_Dir "file_chooser_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libc" /nodefaultlib:"libcd" /nodefaultlib:"libcmt" /nodefaultlib:"libcmtd" /out:"../test/file_chooserd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "file_chooser - Win32 Release" +# Name "file_chooser - Win32 Debug" +# Begin Source File + +SOURCE=..\test\file_chooser.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/fltk.dsw b/third_party/windows/fltk-1.1.10/visualc/fltk.dsw new file mode 100644 index 0000000..980bb99 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/fltk.dsw @@ -0,0 +1,1394 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "CubeView"=".\CubeView.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkgl + End Project Dependency + Begin Project Dependency + Project_Dep_Name fluid + End Project Dependency +}}} + +############################################################################### + +Project: "adjuster"=".\adjuster.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "arc"=".\arc.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "ask"=".\ask.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "bitmap"=".\bitmap.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "blocks"=".\blocks.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "boxtype"=".\boxtype.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "browser"=".\browser.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "button"=".\button.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "buttons"=".\buttons.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "checkers"=".\checkers.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "clock"=".\clock.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "colbrowser"=".\colbrowser.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkforms + End Project Dependency +}}} + +############################################################################### + +Project: "color_chooser"=".\color_chooser.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "cube"=".\cube.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkgl + End Project Dependency +}}} + +############################################################################### + +Project: "cursor"=".\cursor.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "curve"=".\curve.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "demo"=".\demo.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name adjuster + End Project Dependency + Begin Project Dependency + Project_Dep_Name arc + End Project Dependency + Begin Project Dependency + Project_Dep_Name ask + End Project Dependency + Begin Project Dependency + Project_Dep_Name bitmap + End Project Dependency + Begin Project Dependency + Project_Dep_Name boxtype + End Project Dependency + Begin Project Dependency + Project_Dep_Name browser + End Project Dependency + Begin Project Dependency + Project_Dep_Name button + End Project Dependency + Begin Project Dependency + Project_Dep_Name buttons + End Project Dependency + Begin Project Dependency + Project_Dep_Name checkers + End Project Dependency + Begin Project Dependency + Project_Dep_Name clock + End Project Dependency + Begin Project Dependency + Project_Dep_Name colbrowser + End Project Dependency + Begin Project Dependency + Project_Dep_Name color_chooser + End Project Dependency + Begin Project Dependency + Project_Dep_Name cube + End Project Dependency + Begin Project Dependency + Project_Dep_Name cursor + End Project Dependency + Begin Project Dependency + Project_Dep_Name curve + End Project Dependency + Begin Project Dependency + Project_Dep_Name doublebuffer + End Project Dependency + Begin Project Dependency + Project_Dep_Name fast_slow + End Project Dependency + Begin Project Dependency + Project_Dep_Name file_chooser + End Project Dependency + Begin Project Dependency + Project_Dep_Name fluid + End Project Dependency + Begin Project Dependency + Project_Dep_Name fonts + End Project Dependency + Begin Project Dependency + Project_Dep_Name forms + End Project Dependency + Begin Project Dependency + Project_Dep_Name fractals + End Project Dependency + Begin Project Dependency + Project_Dep_Name fullscreen + End Project Dependency + Begin Project Dependency + Project_Dep_Name gl_overlay + End Project Dependency + Begin Project Dependency + Project_Dep_Name glpuzzle + End Project Dependency + Begin Project Dependency + Project_Dep_Name hello + End Project Dependency + Begin Project Dependency + Project_Dep_Name iconize + End Project Dependency + Begin Project Dependency + Project_Dep_Name image + End Project Dependency + Begin Project Dependency + Project_Dep_Name input + End Project Dependency + Begin Project Dependency + Project_Dep_Name input_choice + End Project Dependency + Begin Project Dependency + Project_Dep_Name keyboard + End Project Dependency + Begin Project Dependency + Project_Dep_Name label + End Project Dependency + Begin Project Dependency + Project_Dep_Name mandelbrot + End Project Dependency + Begin Project Dependency + Project_Dep_Name menubar + End Project Dependency + Begin Project Dependency + Project_Dep_Name message + End Project Dependency + Begin Project Dependency + Project_Dep_Name minimum + End Project Dependency + Begin Project Dependency + Project_Dep_Name navigation + End Project Dependency + Begin Project Dependency + Project_Dep_Name output + End Project Dependency + Begin Project Dependency + Project_Dep_Name overlay + End Project Dependency + Begin Project Dependency + Project_Dep_Name pixmap + End Project Dependency + Begin Project Dependency + Project_Dep_Name pixmap_browser + End Project Dependency + Begin Project Dependency + Project_Dep_Name radio + End Project Dependency + Begin Project Dependency + Project_Dep_Name resize + End Project Dependency + Begin Project Dependency + Project_Dep_Name resizebox + End Project Dependency + Begin Project Dependency + Project_Dep_Name scroll + End Project Dependency + Begin Project Dependency + Project_Dep_Name shape + End Project Dependency + Begin Project Dependency + Project_Dep_Name subwindow + End Project Dependency + Begin Project Dependency + Project_Dep_Name symbols + End Project Dependency + Begin Project Dependency + Project_Dep_Name tabs + End Project Dependency + Begin Project Dependency + Project_Dep_Name tile + End Project Dependency + Begin Project Dependency + Project_Dep_Name valuators + End Project Dependency + Begin Project Dependency + Project_Dep_Name pack + End Project Dependency + Begin Project Dependency + Project_Dep_Name inactive + End Project Dependency + Begin Project Dependency + Project_Dep_Name editor + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkdll + End Project Dependency + Begin Project Dependency + Project_Dep_Name CubeView + End Project Dependency + Begin Project Dependency + Project_Dep_Name line_style + End Project Dependency + Begin Project Dependency + Project_Dep_Name tiled_image + End Project Dependency + Begin Project Dependency + Project_Dep_Name help + End Project Dependency + Begin Project Dependency + Project_Dep_Name threads + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkforms + End Project Dependency + Begin Project Dependency + Project_Dep_Name preferences + End Project Dependency + Begin Project Dependency + Project_Dep_Name jpeg + End Project Dependency + Begin Project Dependency + Project_Dep_Name libpng + End Project Dependency + Begin Project Dependency + Project_Dep_Name zlib + End Project Dependency + Begin Project Dependency + Project_Dep_Name sudoku + End Project Dependency + Begin Project Dependency + Project_Dep_Name blocks + End Project Dependency +}}} + +############################################################################### + +Project: "doublebuffer"=".\doublebuffer.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "editor"=".\editor.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltkdll + End Project Dependency +}}} + +############################################################################### + +Project: "fast_slow"=".\fast_slow.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fluid + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "file_chooser"=".\file_chooser.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkimages + End Project Dependency + Begin Project Dependency + Project_Dep_Name jpeg + End Project Dependency + Begin Project Dependency + Project_Dep_Name libpng + End Project Dependency + Begin Project Dependency + Project_Dep_Name zlib + End Project Dependency +}}} + +############################################################################### + +Project: "fltk"=".\fltk.lib.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "fltkdll"=".\fltkdll.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name jpeg + End Project Dependency + Begin Project Dependency + Project_Dep_Name libpng + End Project Dependency + Begin Project Dependency + Project_Dep_Name zlib + End Project Dependency +}}} + +############################################################################### + +Project: "fltkforms"=".\fltkforms.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "fltkgl"=".\fltkgl.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "fltkimages"=".\fltkimages.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "fluid"=".\fluid.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkforms + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkimages + End Project Dependency + Begin Project Dependency + Project_Dep_Name jpeg + End Project Dependency + Begin Project Dependency + Project_Dep_Name libpng + End Project Dependency + Begin Project Dependency + Project_Dep_Name zlib + End Project Dependency +}}} + +############################################################################### + +Project: "fonts"=".\fonts.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "forms"=".\forms.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkforms + End Project Dependency +}}} + +############################################################################### + +Project: "fractals"=".\fractals.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkgl + End Project Dependency +}}} + +############################################################################### + +Project: "fullscreen"=".\fullscreen.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkgl + End Project Dependency +}}} + +############################################################################### + +Project: "gl_overlay"=".\gl_overlay.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkgl + End Project Dependency +}}} + +############################################################################### + +Project: "glpuzzle"=".\glpuzzle.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkgl + End Project Dependency +}}} + +############################################################################### + +Project: "hello"=".\hello.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "help"=".\help.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkimages + End Project Dependency + Begin Project Dependency + Project_Dep_Name jpeg + End Project Dependency + Begin Project Dependency + Project_Dep_Name libpng + End Project Dependency + Begin Project Dependency + Project_Dep_Name zlib + End Project Dependency +}}} + +############################################################################### + +Project: "iconize"=".\iconize.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "image"=".\image.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "inactive"=".\inactive.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fluid + End Project Dependency +}}} + +############################################################################### + +Project: "input"=".\input.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "input_choice"=".\input_choice.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "jpeg"=".\jpeg.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "keyboard"=".\keyboard.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fluid + End Project Dependency +}}} + +############################################################################### + +Project: "label"=".\label.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkforms + End Project Dependency +}}} + +############################################################################### + +Project: "libpng"=".\libpng.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "line_style"=".\line_style.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "mandelbrot"=".\mandelbrot.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fluid + End Project Dependency +}}} + +############################################################################### + +Project: "menubar"=".\menubar.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "message"=".\message.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "minimum"=".\minimum.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "navigation"=".\navigation.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "output"=".\output.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkforms + End Project Dependency +}}} + +############################################################################### + +Project: "overlay"=".\overlay.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "pack"=".\pack.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "pixmap"=".\pixmap.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "pixmap_browser"=".\pixmap_browser.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkimages + End Project Dependency + Begin Project Dependency + Project_Dep_Name jpeg + End Project Dependency + Begin Project Dependency + Project_Dep_Name libpng + End Project Dependency + Begin Project Dependency + Project_Dep_Name zlib + End Project Dependency +}}} + +############################################################################### + +Project: "preferences"=".\preferences.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fluid + End Project Dependency +}}} + +############################################################################### + +Project: "radio"=".\radio.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fluid + End Project Dependency +}}} + +############################################################################### + +Project: "resize"=".\resize.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fluid + End Project Dependency +}}} + +############################################################################### + +Project: "resizebox"=".\resizebox.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "scroll"=".\scroll.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "shape"=".\shape.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkgl + End Project Dependency +}}} + +############################################################################### + +Project: "subwindow"=".\subwindow.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "sudoku"=".\sudoku.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fltkimages + End Project Dependency + Begin Project Dependency + Project_Dep_Name jpeg + End Project Dependency + Begin Project Dependency + Project_Dep_Name libpng + End Project Dependency + Begin Project Dependency + Project_Dep_Name zlib + End Project Dependency +}}} + +############################################################################### + +Project: "symbols"=".\symbols.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "tabs"=".\tabs.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fluid + End Project Dependency +}}} + +############################################################################### + +Project: "threads"=".\threads.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "tile"=".\tile.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "tiled_image"=".\tiled_image.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency +}}} + +############################################################################### + +Project: "valuators"=".\valuators.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name fltk + End Project Dependency + Begin Project Dependency + Project_Dep_Name fluid + End Project Dependency +}}} + +############################################################################### + +Project: "zlib"=".\zlib.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/third_party/windows/fltk-1.1.10/visualc/fltk.lib.dsp b/third_party/windows/fltk-1.1.10/visualc/fltk.lib.dsp new file mode 100644 index 0000000..8b60e4c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/fltk.lib.dsp @@ -0,0 +1,613 @@ +# Microsoft Developer Studio Project File - Name="fltk" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=fltk - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "fltk.lib.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "fltk.lib.mak" CFG="fltk - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "fltk - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "fltk - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "fltk - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Ot /Op /Ob2 /I "../visualc" /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# SUBTRACT CPP /Os +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltk.lib" + +!ELSEIF "$(CFG)" == "fltk - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /GX /Z7 /Od /I "../visualc" /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /FR /YX /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltkd.lib" + +!ENDIF + +# Begin Target + +# Name "fltk - Win32 Release" +# Name "fltk - Win32 Debug" +# Begin Source File + +SOURCE=..\src\filename_absolute.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\filename_expand.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\filename_ext.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\filename_isdir.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\filename_list.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\filename_match.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\filename_setext.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_abort.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_add_idle.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Adjuster.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_arc.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_arci.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_arg.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_ask.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Bitmap.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Box.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_boxtype.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Browser.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Browser_.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Browser_load.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Button.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_call_main.c +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Chart.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Check_Browser.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Check_Button.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Choice.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Clock.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_color.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Color_Chooser.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_compose.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Counter.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_cursor.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_curve.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Dial.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_diamond_box.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_display.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_dnd.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Double_Window.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_draw.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_draw_image.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_draw_pixmap.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_encoding_latin1.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_encoding_mac_roman.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_engraved_label.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_File_Browser.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_File_Chooser.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_File_Chooser2.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_file_dir.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_File_Icon.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_File_Input.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_font.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_get_key.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_get_system_colors.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_grab.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Group.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_gtk.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Help_View.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Image.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Input.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Input_.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_labeltype.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Light_Button.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_line_style.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_lock.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu_.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu_add.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu_Bar.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu_Button.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu_global.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu_Window.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Multi_Label.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_open_uri.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_oval_box.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_overlay.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_overlay_visual.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Overlay_Window.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_own_colormap.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Pack.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Pixmap.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_plastic.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Positioner.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Preferences.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Progress.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_read_image.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_rect.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Repeat_Button.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Return_Button.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Roller.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_round_box.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Round_Button.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_rounded_box.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Scroll.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_scroll_area.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Scrollbar.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_set_font.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_set_fonts.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_shadow_box.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Shared_Image.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_shortcut.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_show_colormap.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Single_Window.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Slider.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_symbols.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Tabs.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Text_Buffer.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Text_Display.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Text_Editor.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Tile.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Tiled_Image.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Tooltip.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Valuator.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Value_Input.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Value_Output.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Value_Slider.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_vertex.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_visual.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Widget.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Window.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Window_fullscreen.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Window_hotspot.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Window_iconize.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Wizard.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_x.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_XBM_Image.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_XPM_Image.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\flstring.c +# End Source File +# Begin Source File + +SOURCE=..\src\numericsort.c +# End Source File +# Begin Source File + +SOURCE=..\src\scandir.c +# End Source File +# Begin Source File + +SOURCE=..\src\screen_xywh.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\vsnprintf.c +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/fltkdll.dsp b/third_party/windows/fltk-1.1.10/visualc/fltkdll.dsp new file mode 100644 index 0000000..6035b88 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/fltkdll.dsp @@ -0,0 +1,2786 @@ +# Microsoft Developer Studio Project File - Name="fltkdll" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=fltkdll - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "fltkdll.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "fltkdll.mak" CFG="fltkdll - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "fltkdll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "fltkdll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "fltkdll - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "fltkdll0" +# PROP BASE Intermediate_Dir "fltkdll0" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "../test" +# PROP Intermediate_Dir "fltkdll" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /Os /Ob2 /I "." /I ".." /I "..\zlib" /I "..\png" /I "..\jpeg" /D "FL_DLL" /D "FL_LIBRARY" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /machine:I386 +# ADD LINK32 opengl32.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /version:1.0 /subsystem:windows /dll /pdb:"fltkdll.pdb" /machine:I386 /out:"fltkdll.dll" +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "fltkdll - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "fltkdll1" +# PROP BASE Intermediate_Dir "fltkdll1" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../test" +# PROP Intermediate_Dir "fltkdlld" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /GX /ZI /Od /I "." /I ".." /I "..\zlib" /I "..\png" /I "..\jpeg" /D "FL_DLL" /D "FL_LIBRARY" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 opengl32.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /version:1.0 /subsystem:windows /dll /pdb:"fltkdlld.pdb" /debug /machine:I386 /out:"fltkdlld.dll" /pdbtype:sept +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "fltkdll - Win32 Release" +# Name "fltkdll - Win32 Debug" +# Begin Source File + +SOURCE=..\src\filename_absolute.cxx +DEP_CPP_FILEN=\ + "..\fl\filename.h"\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FILEN=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\filename_expand.cxx +DEP_CPP_FILENA=\ + "..\fl\filename.h"\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FILENA=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\filename_ext.cxx +DEP_CPP_FILENAM=\ + "..\fl\filename.h"\ + "..\fl\fl_export.h"\ + +NODEP_CPP_FILENAM=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\filename_isdir.cxx +DEP_CPP_FILENAME=\ + "..\fl\filename.h"\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FILENAME=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\filename_list.cxx +DEP_CPP_FILENAME_=\ + "..\fl\filename.h"\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FILENAME_=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\filename_match.cxx +DEP_CPP_FILENAME_M=\ + "..\fl\filename.h"\ + "..\fl\fl_export.h"\ + +NODEP_CPP_FILENAME_M=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\filename_setext.cxx +DEP_CPP_FILENAME_S=\ + "..\fl\filename.h"\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FILENAME_S=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl.cxx +DEP_CPP_FL_CX=\ + "..\fl\enumerations.h"\ + "..\fl\filename.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_bar.h"\ + "..\fl\fl_menu_item.h"\ + "..\FL\Fl_Sys_Menu_Bar.H"\ + "..\fl\fl_tooltip.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\fl_font.h"\ + "..\src\Fl_mac.cxx"\ + "..\src\fl_win32.cxx"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FL_CX=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_abort.cxx +DEP_CPP_FL_AB=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_add_idle.cxx +DEP_CPP_FL_AD=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Adjuster.cxx +DEP_CPP_FL_ADJ=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_adjuster.h"\ + "..\fl\fl_bitmap.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\src\fastarrow.h"\ + "..\src\mediumarrow.h"\ + "..\src\slowarrow.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_arc.cxx +DEP_CPP_FL_AR=\ + "..\fl\enumerations.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\FL\math.h"\ + +NODEP_CPP_FL_AR=\ + "..\..\..\..\..\usr\include\math.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_arci.cxx +DEP_CPP_FL_ARC=\ + "..\fl\enumerations.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\FL\math.h"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +NODEP_CPP_FL_ARC=\ + "..\..\..\..\..\usr\include\math.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_arg.cxx +DEP_CPP_FL_ARG=\ + "..\fl\enumerations.h"\ + "..\fl\filename.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_tooltip.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FL_ARG=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_ask.cxx +DEP_CPP_FL_AS=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_ask.h"\ + "..\fl\fl_box.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_input.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_return_button.h"\ + "..\fl\fl_secret_input.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Bitmap.cxx +DEP_CPP_FL_BI=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_bitmap.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_BMP_Image.cxx +DEP_CPP_FL_BM=\ + "..\fl\enumerations.h"\ + "..\fl\fl_bmp_image.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Box.cxx +DEP_CPP_FL_BO=\ + "..\fl\enumerations.h"\ + "..\fl\fl_box.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_boxtype.cxx +DEP_CPP_FL_BOX=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_widget.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Browser.cxx +DEP_CPP_FL_BR=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_browser.h"\ + "..\fl\fl_browser_.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Browser_.cxx +DEP_CPP_FL_BRO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_browser_.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Browser_load.cxx +DEP_CPP_FL_BROW=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_browser.h"\ + "..\fl\fl_browser_.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Button.cxx +DEP_CPP_FL_BU=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Chart.cxx +DEP_CPP_FL_CH=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_chart.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_widget.h"\ + "..\FL\math.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FL_CH=\ + "..\..\..\..\..\usr\include\math.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Check_Browser.cxx +DEP_CPP_FL_CHE=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_browser_.h"\ + "..\fl\fl_check_browser.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Check_Button.cxx +DEP_CPP_FL_CHEC=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_check_button.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_light_button.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Choice.cxx +DEP_CPP_FL_CHO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_choice.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_widget.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Clock.cxx +DEP_CPP_FL_CL=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_clock.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_color.cxx +DEP_CPP_FL_CO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\fl_cmap.h"\ + "..\src\fl_color_mac.cxx"\ + "..\src\fl_color_win32.cxx"\ + "..\src\Fl_XColor.H"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Color_Chooser.cxx +DEP_CPP_FL_COL=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_box.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_choice.h"\ + "..\fl\fl_color_chooser.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_input.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_return_button.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_value_input.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\FL\math.h"\ + +NODEP_CPP_FL_COL=\ + "..\..\..\..\..\usr\include\math.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_compose.cxx +DEP_CPP_FL_COM=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Counter.cxx +DEP_CPP_FL_COU=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_counter.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_cursor.cxx +DEP_CPP_FL_CU=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_curve.cxx +DEP_CPP_FL_CUR=\ + "..\fl\enumerations.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Dial.cxx +DEP_CPP_FL_DI=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_dial.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\FL\math.h"\ + +NODEP_CPP_FL_DI=\ + "..\..\..\..\..\usr\include\math.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_diamond_box.cxx +DEP_CPP_FL_DIA=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_display.cxx +DEP_CPP_FL_DIS=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_dnd.cxx +DEP_CPP_FL_DN=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\fl_dnd_mac.cxx"\ + "..\src\fl_dnd_win32.cxx"\ + "..\src\fl_dnd_x.cxx"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Double_Window.cxx +DEP_CPP_FL_DO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_double_window.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_draw.cxx +DEP_CPP_FL_DR=\ + "..\fl\enumerations.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_draw_image.cxx +DEP_CPP_FL_DRA=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\fl_draw_image_mac.cxx"\ + "..\src\fl_draw_image_win32.cxx"\ + "..\src\Fl_XColor.H"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_draw_pixmap.cxx +DEP_CPP_FL_DRAW=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_encoding_latin1.cxx +DEP_CPP_FL_EN=\ + "..\fl\enumerations.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_encoding_mac_roman.cxx +DEP_CPP_FL_ENC=\ + "..\fl\enumerations.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_engraved_label.cxx +DEP_CPP_FL_ENG=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_File_Browser.cxx +DEP_CPP_FL_FI=\ + "..\fl\enumerations.h"\ + "..\fl\filename.h"\ + "..\fl\fl.h"\ + "..\fl\fl_browser.h"\ + "..\fl\fl_browser_.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\FL\Fl_File_Browser.H"\ + "..\fl\fl_file_icon.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FL_FI=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_File_Chooser.cxx +DEP_CPP_FL_FIL=\ + "..\fl\enumerations.h"\ + "..\fl\filename.h"\ + "..\fl\fl.h"\ + "..\fl\fl_ask.h"\ + "..\fl\fl_bitmap.h"\ + "..\fl\fl_box.h"\ + "..\fl\fl_browser.h"\ + "..\fl\fl_browser_.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_check_button.h"\ + "..\fl\fl_choice.h"\ + "..\fl\fl_double_window.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\FL\Fl_File_Browser.H"\ + "..\fl\fl_file_chooser.h"\ + "..\fl\fl_file_icon.h"\ + "..\fl\fl_file_input.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_input.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_light_button.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_button.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_preferences.h"\ + "..\fl\fl_return_button.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_tile.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + +NODEP_CPP_FL_FIL=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_File_Chooser2.cxx +DEP_CPP_FL_FILE=\ + "..\fl\enumerations.h"\ + "..\fl\filename.h"\ + "..\fl\fl.h"\ + "..\fl\fl_ask.h"\ + "..\fl\fl_box.h"\ + "..\fl\fl_browser.h"\ + "..\fl\fl_browser_.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_check_button.h"\ + "..\fl\fl_choice.h"\ + "..\fl\fl_double_window.h"\ + "..\fl\fl_export.h"\ + "..\FL\Fl_File_Browser.H"\ + "..\fl\fl_file_chooser.h"\ + "..\fl\fl_file_icon.h"\ + "..\fl\fl_file_input.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_input.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_light_button.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_button.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_preferences.h"\ + "..\fl\fl_return_button.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_shared_image.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_tile.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FL_FILE=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_file_dir.cxx +DEP_CPP_FL_FILE_=\ + "..\fl\enumerations.h"\ + "..\fl\filename.h"\ + "..\fl\fl.h"\ + "..\fl\fl_ask.h"\ + "..\fl\fl_box.h"\ + "..\fl\fl_browser.h"\ + "..\fl\fl_browser_.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_check_button.h"\ + "..\fl\fl_choice.h"\ + "..\fl\fl_double_window.h"\ + "..\fl\fl_export.h"\ + "..\FL\Fl_File_Browser.H"\ + "..\fl\fl_file_chooser.h"\ + "..\fl\fl_file_icon.h"\ + "..\fl\fl_file_input.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_input.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_light_button.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_button.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_preferences.h"\ + "..\fl\fl_return_button.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_tile.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FL_FILE_=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_File_Icon.cxx +DEP_CPP_FL_FILE_I=\ + "..\fl\enumerations.h"\ + "..\fl\filename.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_file_icon.h"\ + "..\fl\fl_widget.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FL_FILE_I=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_File_Icon2.cxx +DEP_CPP_FL_FILE_IC=\ + "..\fl\enumerations.h"\ + "..\fl\filename.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_file_icon.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_shared_image.h"\ + "..\fl\fl_widget.h"\ + "..\FL\math.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FL_FILE_IC=\ + "..\..\..\..\..\usr\include\dirent.h"\ + "..\..\..\..\..\usr\include\math.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_File_Input.cxx +DEP_CPP_FL_FILE_IN=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_file_input.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_input.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_font.cxx +DEP_CPP_FL_FO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\fl_font.h"\ + "..\src\fl_font_mac.cxx"\ + "..\src\fl_font_win32.cxx"\ + "..\src\fl_font_x.cxx"\ + "..\src\fl_font_xft.cxx"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_get_key.cxx +DEP_CPP_FL_GE=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\Fl_get_key_mac.cxx"\ + "..\src\fl_get_key_win32.cxx"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_get_system_colors.cxx +DEP_CPP_FL_GET=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_pixmap.h"\ + "..\fl\fl_tiled_image.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\FL\math.h"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\flstring.h"\ + "..\src\tile.xpm"\ + ".\config.h"\ + +NODEP_CPP_FL_GET=\ + "..\..\..\..\..\usr\include\math.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_GIF_Image.cxx +DEP_CPP_FL_GI=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_gif_image.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_pixmap.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Gl_Choice.cxx +DEP_CPP_FL_GL=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\FL\gl.h"\ + "..\fl\gl_draw.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\Fl_Gl_Choice.H"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Gl_Overlay.cxx +DEP_CPP_FL_GL_=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\Fl_Gl_Window.H"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\FL\gl.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\Fl_Gl_Choice.H"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Gl_Window.cxx +DEP_CPP_FL_GL_W=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\Fl_Gl_Window.H"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\FL\gl.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\Fl_Gl_Choice.H"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_grab.cxx +DEP_CPP_FL_GR=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Group.cxx +DEP_CPP_FL_GRO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_gtk.cxx +DEP_CPP_FL_GT=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Help_Dialog.cxx +DEP_CPP_FL_HE=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_ask.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_double_window.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\FL\Fl_Help_Dialog.H"\ + "..\FL\Fl_Help_View.H"\ + "..\fl\fl_image.h"\ + "..\fl\fl_input.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_shared_image.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Help_View.cxx +DEP_CPP_FL_HEL=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\FL\Fl_Help_View.H"\ + "..\fl\fl_image.h"\ + "..\fl\fl_pixmap.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_shared_image.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Image.cxx +DEP_CPP_FL_IM=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_images_core.cxx +DEP_CPP_FL_IMA=\ + "..\fl\enumerations.h"\ + "..\fl\fl_bmp_image.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_gif_image.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_jpeg_image.h"\ + "..\fl\fl_pixmap.h"\ + "..\fl\fl_png_image.h"\ + "..\fl\fl_pnm_image.h"\ + "..\fl\fl_shared_image.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Input.cxx +DEP_CPP_FL_IN=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_ask.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_input.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Input_.cxx +DEP_CPP_FL_INP=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_ask.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_JPEG_Image.cxx +DEP_CPP_FL_JP=\ + "..\fl\enumerations.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_jpeg_image.h"\ + "..\jpeg\jconfig.h"\ + "..\jpeg\jerror.h"\ + "..\jpeg\jmorecfg.h"\ + "..\jpeg\jpegint.h"\ + "..\jpeg\jpeglib.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_labeltype.cxx +DEP_CPP_FL_LA=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Light_Button.cxx +DEP_CPP_FL_LI=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_light_button.h"\ + "..\fl\fl_widget.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_line_style.cxx +DEP_CPP_FL_LIN=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_lock.cxx +DEP_CPP_FL_LO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu.cxx +DEP_CPP_FL_ME=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_menu_window.h"\ + "..\fl\fl_single_window.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu_.cxx +DEP_CPP_FL_MEN=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_widget.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu_add.cxx +DEP_CPP_FL_MENU=\ + "..\fl\enumerations.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_widget.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu_Bar.cxx +DEP_CPP_FL_MENU_=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_bar.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu_Button.cxx +DEP_CPP_FL_MENU_B=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_button.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu_global.cxx +DEP_CPP_FL_MENU_G=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Menu_Window.cxx +DEP_CPP_FL_MENU_W=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_menu_window.h"\ + "..\fl\fl_single_window.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Multi_Label.cxx +DEP_CPP_FL_MU=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_multi_label.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_open_uri.cxx +DEP_CPP_FL_OP=\ + "..\fl\filename.h"\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FL_OP=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_oval_box.cxx +DEP_CPP_FL_OV=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_overlay.cxx +DEP_CPP_FL_OVE=\ + "..\fl\enumerations.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_overlay_visual.cxx +DEP_CPP_FL_OVER=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Overlay_Window.cxx +DEP_CPP_FL_OVERL=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_double_window.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_overlay_window.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_own_colormap.cxx +DEP_CPP_FL_OW=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Pack.cxx +DEP_CPP_FL_PA=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_pack.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Pixmap.cxx +DEP_CPP_FL_PI=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_pixmap.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_plastic.cxx +DEP_CPP_FL_PL=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_PNG_Image.cxx +DEP_CPP_FL_PN=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_png_image.h"\ + "..\png\png.h"\ + "..\png\pngconf.h"\ + "..\zlib\zconf.h"\ + "..\zlib\zlib.h"\ + ".\config.h"\ + +NODEP_CPP_FL_PN=\ + "..\png\pngusr.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_PNM_Image.cxx +DEP_CPP_FL_PNM=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_pnm_image.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Positioner.cxx +DEP_CPP_FL_PO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_positioner.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Preferences.cxx +DEP_CPP_FL_PR=\ + "..\fl\enumerations.h"\ + "..\fl\filename.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_preferences.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FL_PR=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Progress.cxx +DEP_CPP_FL_PRO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_progress.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_read_image.cxx +DEP_CPP_FL_RE=\ + "..\fl\enumerations.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\fl_read_image_mac.cxx"\ + "..\src\fl_read_image_win32.cxx"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_rect.cxx +DEP_CPP_FL_REC=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Repeat_Button.cxx +DEP_CPP_FL_REP=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_repeat_button.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Return_Button.cxx +DEP_CPP_FL_RET=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_return_button.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Roller.cxx +DEP_CPP_FL_RO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_roller.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_round_box.cxx +DEP_CPP_FL_ROU=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Round_Button.cxx +DEP_CPP_FL_ROUN=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_light_button.h"\ + "..\fl\fl_round_button.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_rounded_box.cxx +DEP_CPP_FL_ROUND=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Scroll.cxx +DEP_CPP_FL_SC=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_scroll.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_tiled_image.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_scroll_area.cxx +DEP_CPP_FL_SCR=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Scrollbar.cxx +DEP_CPP_FL_SCRO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_set_font.cxx +DEP_CPP_FL_SE=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\fl_font.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_set_fonts.cxx +DEP_CPP_FL_SET=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\fl_font.h"\ + "..\src\fl_set_fonts_mac.cxx"\ + "..\src\fl_set_fonts_win32.cxx"\ + "..\src\fl_set_fonts_x.cxx"\ + "..\src\fl_set_fonts_xft.cxx"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_shadow_box.cxx +DEP_CPP_FL_SH=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Shared_Image.cxx +DEP_CPP_FL_SHA=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_bitmap.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_pixmap.h"\ + "..\fl\fl_shared_image.h"\ + "..\fl\fl_xbm_image.h"\ + "..\fl\fl_xpm_image.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_shortcut.cxx +DEP_CPP_FL_SHO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_show_colormap.cxx +DEP_CPP_FL_SHOW=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_show_colormap.h"\ + "..\fl\fl_single_window.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Single_Window.cxx +DEP_CPP_FL_SI=\ + "..\fl\enumerations.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_single_window.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Slider.cxx +DEP_CPP_FL_SL=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_symbols.cxx +DEP_CPP_FL_SY=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\FL\math.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FL_SY=\ + "..\..\..\..\..\usr\include\math.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Tabs.cxx +DEP_CPP_FL_TA=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_tabs.h"\ + "..\fl\fl_tooltip.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Text_Buffer.cxx +DEP_CPP_FL_TE=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_text_buffer.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Text_Display.cxx +DEP_CPP_FL_TEX=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_text_buffer.h"\ + "..\fl\fl_text_display.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Text_Editor.cxx +DEP_CPP_FL_TEXT=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_ask.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_text_buffer.h"\ + "..\fl\fl_text_display.h"\ + "..\fl\fl_text_editor.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Tile.cxx +DEP_CPP_FL_TI=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_tile.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Tiled_Image.cxx +DEP_CPP_FL_TIL=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_tiled_image.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Tooltip.cxx +DEP_CPP_FL_TO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_menu_window.h"\ + "..\fl\fl_single_window.h"\ + "..\fl\fl_tooltip.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Valuator.cxx +DEP_CPP_FL_VA=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_widget.h"\ + "..\FL\math.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FL_VA=\ + "..\..\..\..\..\usr\include\math.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Value_Input.cxx +DEP_CPP_FL_VAL=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_input.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_value_input.h"\ + "..\fl\fl_widget.h"\ + "..\FL\math.h"\ + +NODEP_CPP_FL_VAL=\ + "..\..\..\..\..\usr\include\math.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Value_Output.cxx +DEP_CPP_FL_VALU=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_value_output.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Value_Slider.cxx +DEP_CPP_FL_VALUE=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_value_slider.h"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\fl_vertex.cxx +DEP_CPP_FL_VE=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\FL\math.h"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +NODEP_CPP_FL_VE=\ + "..\..\..\..\..\usr\include\math.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_visual.cxx +DEP_CPP_FL_VI=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Widget.cxx +DEP_CPP_FL_WI=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_tooltip.h"\ + "..\fl\fl_widget.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Window.cxx +DEP_CPP_FL_WIN=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Window_fullscreen.cxx +DEP_CPP_FL_WIND=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Window_hotspot.cxx +DEP_CPP_FL_WINDO=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Window_iconize.cxx +DEP_CPP_FL_WINDOW=\ + "..\fl\enumerations.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Wizard.cxx +DEP_CPP_FL_WIZ=\ + "..\fl\enumerations.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\fl_wizard.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_x.cxx +DEP_CPP_FL_X_=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_tooltip.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_XBM_Image.cxx +DEP_CPP_FL_XB=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_bitmap.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_xbm_image.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_XPM_Image.cxx +DEP_CPP_FL_XP=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_pixmap.h"\ + "..\fl\fl_xpm_image.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\flstring.c +DEP_CPP_FLSTR=\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\forms_bitmap.cxx +DEP_CPP_FORMS=\ + "..\fl\enumerations.h"\ + "..\fl\filename.h"\ + "..\fl\fl.h"\ + "..\fl\fl_ask.h"\ + "..\fl\fl_bitmap.h"\ + "..\fl\fl_box.h"\ + "..\fl\fl_browser.h"\ + "..\fl\fl_browser_.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_chart.h"\ + "..\fl\fl_check_button.h"\ + "..\fl\fl_choice.h"\ + "..\fl\fl_clock.h"\ + "..\fl\fl_counter.h"\ + "..\fl\fl_dial.h"\ + "..\fl\fl_double_window.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\FL\Fl_File_Browser.H"\ + "..\fl\fl_file_chooser.h"\ + "..\fl\fl_file_icon.h"\ + "..\fl\fl_file_input.h"\ + "..\fl\Fl_FormsBitmap.H"\ + "..\fl\Fl_FormsPixmap.H"\ + "..\fl\Fl_Free.H"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_input.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_light_button.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_button.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_pixmap.h"\ + "..\fl\fl_positioner.h"\ + "..\fl\fl_preferences.h"\ + "..\fl\fl_return_button.h"\ + "..\fl\fl_round_button.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_show_colormap.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_tile.h"\ + "..\FL\Fl_Timer.H"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_value_slider.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\forms.h"\ + +NODEP_CPP_FORMS=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\forms_compatability.cxx +DEP_CPP_FORMS_=\ + "..\fl\enumerations.h"\ + "..\fl\filename.h"\ + "..\fl\fl.h"\ + "..\fl\fl_ask.h"\ + "..\fl\fl_bitmap.h"\ + "..\fl\fl_box.h"\ + "..\fl\fl_browser.h"\ + "..\fl\fl_browser_.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_chart.h"\ + "..\fl\fl_check_button.h"\ + "..\fl\fl_choice.h"\ + "..\fl\fl_clock.h"\ + "..\fl\fl_counter.h"\ + "..\fl\fl_dial.h"\ + "..\fl\fl_double_window.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\FL\Fl_File_Browser.H"\ + "..\fl\fl_file_chooser.h"\ + "..\fl\fl_file_icon.h"\ + "..\fl\fl_file_input.h"\ + "..\fl\Fl_FormsBitmap.H"\ + "..\fl\Fl_FormsPixmap.H"\ + "..\fl\Fl_Free.H"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_input.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_light_button.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_button.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_pixmap.h"\ + "..\fl\fl_positioner.h"\ + "..\fl\fl_preferences.h"\ + "..\fl\fl_repeat_button.h"\ + "..\fl\fl_return_button.h"\ + "..\fl\fl_round_button.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_show_colormap.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_tile.h"\ + "..\FL\Fl_Timer.H"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_value_slider.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\forms.h"\ + +NODEP_CPP_FORMS_=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\forms_free.cxx +DEP_CPP_FORMS_F=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\Fl_Free.H"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\forms_fselect.cxx +DEP_CPP_FORMS_FS=\ + "..\fl\enumerations.h"\ + "..\fl\filename.h"\ + "..\fl\fl.h"\ + "..\fl\fl_ask.h"\ + "..\fl\fl_bitmap.h"\ + "..\fl\fl_box.h"\ + "..\fl\fl_browser.h"\ + "..\fl\fl_browser_.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_chart.h"\ + "..\fl\fl_check_button.h"\ + "..\fl\fl_choice.h"\ + "..\fl\fl_clock.h"\ + "..\fl\fl_counter.h"\ + "..\fl\fl_dial.h"\ + "..\fl\fl_double_window.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\FL\Fl_File_Browser.H"\ + "..\fl\fl_file_chooser.h"\ + "..\fl\fl_file_icon.h"\ + "..\fl\fl_file_input.h"\ + "..\fl\Fl_FormsBitmap.H"\ + "..\fl\Fl_FormsPixmap.H"\ + "..\fl\Fl_Free.H"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_input.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_light_button.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_button.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_pixmap.h"\ + "..\fl\fl_positioner.h"\ + "..\fl\fl_preferences.h"\ + "..\fl\fl_return_button.h"\ + "..\fl\fl_round_button.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_show_colormap.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_tile.h"\ + "..\FL\Fl_Timer.H"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_value_slider.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\forms.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +NODEP_CPP_FORMS_FS=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\forms_pixmap.cxx +DEP_CPP_FORMS_P=\ + "..\fl\enumerations.h"\ + "..\fl\filename.h"\ + "..\fl\fl.h"\ + "..\fl\fl_ask.h"\ + "..\fl\fl_bitmap.h"\ + "..\fl\fl_box.h"\ + "..\fl\fl_browser.h"\ + "..\fl\fl_browser_.h"\ + "..\fl\fl_button.h"\ + "..\fl\fl_chart.h"\ + "..\fl\fl_check_button.h"\ + "..\fl\fl_choice.h"\ + "..\fl\fl_clock.h"\ + "..\fl\fl_counter.h"\ + "..\fl\fl_dial.h"\ + "..\fl\fl_double_window.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\FL\Fl_File_Browser.H"\ + "..\fl\fl_file_chooser.h"\ + "..\fl\fl_file_icon.h"\ + "..\fl\fl_file_input.h"\ + "..\fl\Fl_FormsBitmap.H"\ + "..\fl\Fl_FormsPixmap.H"\ + "..\fl\Fl_Free.H"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_input.h"\ + "..\fl\fl_input_.h"\ + "..\fl\fl_light_button.h"\ + "..\fl\fl_menu_.h"\ + "..\fl\fl_menu_button.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_pixmap.h"\ + "..\fl\fl_positioner.h"\ + "..\fl\fl_preferences.h"\ + "..\fl\fl_return_button.h"\ + "..\fl\fl_round_button.h"\ + "..\fl\fl_scrollbar.h"\ + "..\fl\fl_show_colormap.h"\ + "..\fl\fl_slider.h"\ + "..\fl\fl_tile.h"\ + "..\FL\Fl_Timer.H"\ + "..\fl\fl_valuator.h"\ + "..\fl\fl_value_slider.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\forms.h"\ + +NODEP_CPP_FORMS_P=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\forms_timer.cxx +DEP_CPP_FORMS_T=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\FL\Fl_Timer.H"\ + "..\fl\fl_widget.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\freeglut_geometry.cxx +DEP_CPP_GL_DR=\ + "..\FL\gl.h"\ + "..\FL\glut.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\freeglut_stroke_mono_roman.cxx +DEP_CPP_GL_DR=\ + "..\FL\gl.h"\ + "..\FL\glut.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\freeglut_stroke_roman.cxx +DEP_CPP_GL_DR=\ + "..\FL\gl.h"\ + "..\FL\glut.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\freeglut_teapot.cxx +DEP_CPP_GL_DR=\ + "..\FL\gl.h"\ + "..\FL\glut.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\gl_draw.cxx +DEP_CPP_GL_DR=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\FL\gl.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\fl_font.h"\ + "..\src\Fl_Gl_Choice.H"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\gl_start.cxx +DEP_CPP_GL_ST=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_draw.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\FL\gl.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + "..\src\Fl_Gl_Choice.H"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\glut_compatability.cxx +DEP_CPP_GLUT_=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\Fl_Gl_Window.H"\ + "..\fl\fl_group.h"\ + "..\fl\fl_image.h"\ + "..\fl\fl_menu_item.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\glut.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\glut_font.cxx +DEP_CPP_GLUT_F=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\Fl_Gl_Window.H"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\FL\gl.h"\ + "..\fl\glut.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\numericsort.c +DEP_CPP_NUMER=\ + "..\fl\filename.h"\ + "..\fl\fl_export.h"\ + ".\config.h"\ + +NODEP_CPP_NUMER=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\scandir.c +DEP_CPP_SCAND=\ + "..\fl\filename.h"\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + "..\src\scandir_win32.c"\ + ".\config.h"\ + +NODEP_CPP_SCAND=\ + "..\..\..\..\..\usr\include\dirent.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\screen_xywh.cxx +DEP_CPP_SCREE=\ + "..\fl\enumerations.h"\ + "..\fl\fl.h"\ + "..\fl\fl_export.h"\ + "..\fl\fl_group.h"\ + "..\fl\fl_widget.h"\ + "..\fl\fl_window.h"\ + "..\fl\mac.H"\ + "..\fl\win32.h"\ + "..\fl\x.h"\ + ".\config.h"\ + +# End Source File +# Begin Source File + +SOURCE=..\src\vsnprintf.c +DEP_CPP_VSNPR=\ + "..\fl\fl_export.h"\ + "..\src\flstring.h"\ + ".\config.h"\ + +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/fltkforms.dsp b/third_party/windows/fltk-1.1.10/visualc/fltkforms.dsp new file mode 100644 index 0000000..f291b35 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/fltkforms.dsp @@ -0,0 +1,109 @@ +# Microsoft Developer Studio Project File - Name="fltkforms" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=fltkforms - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "fltkforms.lib.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "fltkforms.lib.mak" CFG="fltkforms - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "fltkforms - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "fltkforms - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "fltkforms - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Ot /Op /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# SUBTRACT CPP /Os +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltkforms.lib" + +!ELSEIF "$(CFG)" == "fltkforms - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /GX /Z7 /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /FR /YX /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltkformsd.lib" + +!ENDIF + +# Begin Target + +# Name "fltkforms - Win32 Release" +# Name "fltkforms - Win32 Debug" +# Begin Source File + +SOURCE=..\src\forms_bitmap.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\forms_compatability.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\forms_free.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\forms_fselect.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\forms_pixmap.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\forms_timer.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/fltkgl.dsp b/third_party/windows/fltk-1.1.10/visualc/fltkgl.dsp new file mode 100644 index 0000000..d50ce16 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/fltkgl.dsp @@ -0,0 +1,133 @@ +# Microsoft Developer Studio Project File - Name="fltkgl" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=fltkgl - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "fltkgl.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "fltkgl.mak" CFG="fltkgl - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "fltkgl - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "fltkgl - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "fltkgl - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Ot /Op /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# SUBTRACT CPP /Os +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltkgl.lib" + +!ELSEIF "$(CFG)" == "fltkgl - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /GX /Z7 /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /FR /YX /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltkgld.lib" + +!ENDIF + +# Begin Target + +# Name "fltkgl - Win32 Release" +# Name "fltkgl - Win32 Debug" +# Begin Source File + +SOURCE=..\src\Fl_Gl_Choice.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Gl_Overlay.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Gl_Window.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\freeglut_geometry.cxx + +# End Source File +# Begin Source File + +SOURCE=..\src\freeglut_stroke_mono_roman.cxx + +# End Source File +# Begin Source File + +SOURCE=..\src\freeglut_stroke_roman.cxx + +# End Source File +# Begin Source File + +SOURCE=..\src\freeglut_teapot.cxx + +# End Source File +# Begin Source File + +SOURCE=..\src\gl_draw.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\gl_start.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\glut_compatability.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\glut_font.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/fltkimages.dsp b/third_party/windows/fltk-1.1.10/visualc/fltkimages.dsp new file mode 100644 index 0000000..a75af67 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/fltkimages.dsp @@ -0,0 +1,117 @@ +# Microsoft Developer Studio Project File - Name="fltkimages" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=fltkimages - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "fltkimages.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "fltkimages.mak" CFG="fltkimages - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "fltkimages - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "fltkimages - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "fltkimages - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Ot /Op /Ob2 /I "." /I ".." /I "..\zlib" /I "..\png" /I "..\jpeg" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# SUBTRACT CPP /Os +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltkimages.lib" + +!ELSEIF "$(CFG)" == "fltkimages - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /GX /Z7 /Od /I "." /I ".." /I "..\zlib" /I "..\png" /I "..\jpeg" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /FR /YX /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltkimagesd.lib" + +!ENDIF + +# Begin Target + +# Name "fltkimages - Win32 Release" +# Name "fltkimages - Win32 Debug" +# Begin Source File + +SOURCE=..\src\Fl_BMP_Image.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_File_Icon2.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_GIF_Image.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_Help_Dialog.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\fl_images_core.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_JPEG_Image.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_PNG_Image.cxx +# End Source File +# Begin Source File + +SOURCE=..\src\Fl_PNM_Image.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/fluid.dsp b/third_party/windows/fltk-1.1.10/visualc/fluid.dsp new file mode 100644 index 0000000..5005984 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/fluid.dsp @@ -0,0 +1,170 @@ +# Microsoft Developer Studio Project File - Name="fluid" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=fluid - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "fluid.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "fluid.mak" CFG="fluid - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "fluid - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "fluid - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "fluid - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "fluid___" +# PROP BASE Intermediate_Dir "fluid___" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "fluid___" +# PROP Intermediate_Dir "fluid___" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Ot /Op /Ob2 /I "." /I ".." /I "../png" /I "../zlib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# SUBTRACT CPP /Os +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /nodefaultlib:"libcmt" /out:"../fluid/fluid.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "fluid - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "fluid__0" +# PROP BASE Intermediate_Dir "fluid__0" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "fluid__0" +# PROP Intermediate_Dir "fluid__0" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /I "../png" /I "../zlib" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libc" /nodefaultlib:"libcd" /nodefaultlib:"libcmt" /nodefaultlib:"libcmtd" /out:"../fluid/fluidd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "fluid - Win32 Release" +# Name "fluid - Win32 Debug" +# Begin Source File + +SOURCE=..\fluid\about_panel.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\align_widget.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\alignment_panel.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\code.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\CodeEditor.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\factory.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\file.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\Fl_Function_Type.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\Fl_Group_Type.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\Fl_Menu_Type.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\Fl_Type.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\Fl_Widget_Type.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\Fl_Window_Type.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\fluid.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\Fluid_Image.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\function_panel.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\template_panel.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\undo.cxx +# End Source File +# Begin Source File + +SOURCE=..\fluid\widget_panel.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/fonts.dsp b/third_party/windows/fltk-1.1.10/visualc/fonts.dsp new file mode 100644 index 0000000..855847a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/fonts.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="fonts" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=fonts - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "fonts.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "fonts.mak" CFG="fonts - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "fonts - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "fonts - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "fonts - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/fonts.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "fonts - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "fonts_" +# PROP BASE Intermediate_Dir "fonts_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "fonts_" +# PROP Intermediate_Dir "fonts_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/fontsd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "fonts - Win32 Release" +# Name "fonts - Win32 Debug" +# Begin Source File + +SOURCE=..\test\fonts.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/forms.dsp b/third_party/windows/fltk-1.1.10/visualc/forms.dsp new file mode 100644 index 0000000..ef01503 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/forms.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="forms" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=forms - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "forms.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "forms.mak" CFG="forms - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "forms - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "forms - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "forms - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/forms.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "forms - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "forms_" +# PROP BASE Intermediate_Dir "forms_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "forms_" +# PROP Intermediate_Dir "forms_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/formsd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "forms - Win32 Release" +# Name "forms - Win32 Debug" +# Begin Source File + +SOURCE=..\test\forms.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/fractals.dsp b/third_party/windows/fltk-1.1.10/visualc/fractals.dsp new file mode 100644 index 0000000..2ae93df --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/fractals.dsp @@ -0,0 +1,101 @@ +# Microsoft Developer Studio Project File - Name="fractals" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=fractals - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "fractals.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "fractals.mak" CFG="fractals - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "fractals - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "fractals - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "fractals - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 glu32.lib opengl32.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/fractals.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "fractals - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "fractals_" +# PROP BASE Intermediate_Dir "fractals_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "fractals_" +# PROP Intermediate_Dir "fractals_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 glu32.lib opengl32.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/fractalsd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "fractals - Win32 Release" +# Name "fractals - Win32 Debug" +# Begin Source File + +SOURCE=..\test\fractals.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\fracviewer.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/fullscreen.dsp b/third_party/windows/fltk-1.1.10/visualc/fullscreen.dsp new file mode 100644 index 0000000..2f8b3d0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/fullscreen.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="fullscreen" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=fullscreen - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "fullscreen.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "fullscreen.mak" CFG="fullscreen - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "fullscreen - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "fullscreen - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "fullscreen - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 opengl32.lib glu32.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/fullscreen.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "fullscreen - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "fullscreen_" +# PROP BASE Intermediate_Dir "fullscreen_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "fullscreen_" +# PROP Intermediate_Dir "fullscreen_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 opengl32.lib glu32.lib fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/fullscreend.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "fullscreen - Win32 Release" +# Name "fullscreen - Win32 Debug" +# Begin Source File + +SOURCE=..\test\fullscreen.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/gl_overlay.dsp b/third_party/windows/fltk-1.1.10/visualc/gl_overlay.dsp new file mode 100644 index 0000000..8ca8646 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/gl_overlay.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="gl_overlay" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=gl_overlay - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "gl_overlay.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "gl_overlay.mak" CFG="gl_overlay - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "gl_overlay - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "gl_overlay - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "gl_overlay - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 glu32.lib opengl32.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/gl_overlay.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "gl_overlay - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "gl_overlay_" +# PROP BASE Intermediate_Dir "gl_overlay_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "gl_overlay_" +# PROP Intermediate_Dir "gl_overlay_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 glu32.lib opengl32.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/gl_overlayd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "gl_overlay - Win32 Release" +# Name "gl_overlay - Win32 Debug" +# Begin Source File + +SOURCE=..\test\gl_overlay.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/glpuzzle.dsp b/third_party/windows/fltk-1.1.10/visualc/glpuzzle.dsp new file mode 100644 index 0000000..a028d28 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/glpuzzle.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="glpuzzle" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=glpuzzle - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "glpuzzle.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "glpuzzle.mak" CFG="glpuzzle - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "glpuzzle - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "glpuzzle - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "glpuzzle - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 glu32.lib opengl32.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/glpuzzle.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "glpuzzle - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "glpuzzle_" +# PROP BASE Intermediate_Dir "glpuzzle_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "glpuzzle_" +# PROP Intermediate_Dir "glpuzzle_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 glu32.lib opengl32.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/glpuzzled.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "glpuzzle - Win32 Release" +# Name "glpuzzle - Win32 Debug" +# Begin Source File + +SOURCE=..\test\glpuzzle.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/hello.dsp b/third_party/windows/fltk-1.1.10/visualc/hello.dsp new file mode 100644 index 0000000..aca8dc7 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/hello.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="hello" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=hello - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "hello.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "hello.mak" CFG="hello - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "hello - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "hello - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "hello - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/hello.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "hello - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "hello_" +# PROP BASE Intermediate_Dir "hello_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "hello_" +# PROP Intermediate_Dir "hello_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/hellod.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "hello - Win32 Release" +# Name "hello - Win32 Debug" +# Begin Source File + +SOURCE=..\test\hello.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/help.dsp b/third_party/windows/fltk-1.1.10/visualc/help.dsp new file mode 100644 index 0000000..1053475 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/help.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="help" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=help - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "help.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "help.mak" CFG="help - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "help - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "help - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "help - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /out:"../test/help.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "help - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "help_" +# PROP BASE Intermediate_Dir "help_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "help_" +# PROP Intermediate_Dir "help_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/helpd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "help - Win32 Release" +# Name "help - Win32 Debug" +# Begin Source File + +SOURCE=..\test\help.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/iconize.dsp b/third_party/windows/fltk-1.1.10/visualc/iconize.dsp new file mode 100644 index 0000000..d6b6d8d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/iconize.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="iconize" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=iconize - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "iconize.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "iconize.mak" CFG="iconize - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "iconize - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "iconize - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "iconize - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/iconize.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "iconize - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "iconize_" +# PROP BASE Intermediate_Dir "iconize_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "iconize_" +# PROP Intermediate_Dir "iconize_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/iconized.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "iconize - Win32 Release" +# Name "iconize - Win32 Debug" +# Begin Source File + +SOURCE=..\test\iconize.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/image.dsp b/third_party/windows/fltk-1.1.10/visualc/image.dsp new file mode 100644 index 0000000..3fe1129 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/image.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="image" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=image - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "image.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "image.mak" CFG="image - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "image - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "image - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "image - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/image.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "image - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "image_" +# PROP BASE Intermediate_Dir "image_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "image_" +# PROP Intermediate_Dir "image_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/imaged.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "image - Win32 Release" +# Name "image - Win32 Debug" +# Begin Source File + +SOURCE=..\test\image.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/inactive.dsp b/third_party/windows/fltk-1.1.10/visualc/inactive.dsp new file mode 100644 index 0000000..68c1e45 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/inactive.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="inactive" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=inactive - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "inactive.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "inactive.mak" CFG="inactive - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "inactive - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "inactive - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "inactive - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/inactive.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "inactive - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "inactive_" +# PROP BASE Intermediate_Dir "inactive_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "inactive_" +# PROP Intermediate_Dir "inactive_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/inactived.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "inactive - Win32 Release" +# Name "inactive - Win32 Debug" +# Begin Source File + +SOURCE=..\test\inactive.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\inactive.fl + +!IF "$(CFG)" == "inactive - Win32 Release" + +# Begin Custom Build - Create .cxx and .h file with fluidd +InputPath=..\test\inactive.fl + +"..\test\inactive.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluid -c inactive.fl + cd ..\visualc + +# End Custom Build + +!ELSEIF "$(CFG)" == "inactive - Win32 Debug" + +# Begin Custom Build - Create .cxx and .h file with fluidd +InputPath=..\test\inactive.fl + +"..\test\inactive.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluidd -c inactive.fl + cd ..\visualc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/input.dsp b/third_party/windows/fltk-1.1.10/visualc/input.dsp new file mode 100644 index 0000000..d662f7c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/input.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="input" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=input - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "input.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "input.mak" CFG="input - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "input - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "input - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "input - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/input.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "input - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "input_" +# PROP BASE Intermediate_Dir "input_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "input_" +# PROP Intermediate_Dir "input_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/inputd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "input - Win32 Release" +# Name "input - Win32 Debug" +# Begin Source File + +SOURCE=..\test\input.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/input_choice.dsp b/third_party/windows/fltk-1.1.10/visualc/input_choice.dsp new file mode 100644 index 0000000..95e199c --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/input_choice.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="input_choice" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=input_choice - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "input_choice.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "input_choice.mak" CFG="input_choice - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "input_choice - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "input_choice - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "input_choice - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/input_choice.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "input_choice - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "input_choice_" +# PROP BASE Intermediate_Dir "input_choice_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "input_choice_" +# PROP Intermediate_Dir "input_choice_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/input_choiced.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "input_choice - Win32 Release" +# Name "input_choice - Win32 Debug" +# Begin Source File + +SOURCE=..\test\input_choice.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/jpeg.dsp b/third_party/windows/fltk-1.1.10/visualc/jpeg.dsp new file mode 100644 index 0000000..f8cf58b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/jpeg.dsp @@ -0,0 +1,280 @@ +# Microsoft Developer Studio Project File - Name="jpeg" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=jpeg - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "jpeg.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "jpeg.mak" CFG="jpeg - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "jpeg - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "jpeg - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "jpeg - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /Ot /Op /Ob2 /I "../visualc" /I "../zlib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# SUBTRACT CPP /Os +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltkjpeg.lib" + +!ELSEIF "$(CFG)" == "jpeg - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /GX /Zi /Od /I "../visualc" /I "../zlib" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltkjpegd.lib" + +!ENDIF + +# Begin Target + +# Name "jpeg - Win32 Release" +# Name "jpeg - Win32 Debug" +# Begin Source File + +SOURCE=..\jpeg\jcapimin.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jcapistd.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jccoefct.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jccolor.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jcdctmgr.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jchuff.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jcinit.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jcmainct.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jcmarker.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jcmaster.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jcomapi.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jcparam.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jcphuff.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jcprepct.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jcsample.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jctrans.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdapimin.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdapistd.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdatadst.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdatasrc.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdcoefct.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdcolor.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jddctmgr.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdhuff.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdinput.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdmainct.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdmarker.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdmaster.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdmerge.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdphuff.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdpostct.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdsample.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jdtrans.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jerror.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jfdctflt.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jfdctfst.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jfdctint.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jidctflt.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jidctfst.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jidctint.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jidctred.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jmemmgr.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jmemnobs.c + +!IF "$(CFG)" == "jpeg - Win32 Release" + +# ADD CPP /MT + +!ELSEIF "$(CFG)" == "jpeg - Win32 Debug" + +# ADD CPP /MTd + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jquant1.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jquant2.c +# End Source File +# Begin Source File + +SOURCE=..\jpeg\jutils.c +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/keyboard.dsp b/third_party/windows/fltk-1.1.10/visualc/keyboard.dsp new file mode 100644 index 0000000..8a80297 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/keyboard.dsp @@ -0,0 +1,132 @@ +# Microsoft Developer Studio Project File - Name="keyboard" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=keyboard - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "keyboard.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "keyboard.mak" CFG="keyboard - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "keyboard - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "keyboard - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "keyboard - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/keyboard.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "keyboard - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "keyboard_" +# PROP BASE Intermediate_Dir "keyboard_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "keyboard_" +# PROP Intermediate_Dir "keyboard_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/keyboardd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "keyboard - Win32 Release" +# Name "keyboard - Win32 Debug" +# Begin Source File + +SOURCE=..\test\keyboard.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\keyboard_ui.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\keyboard_ui.fl + +!IF "$(CFG)" == "keyboard - Win32 Release" + +# Begin Custom Build - Create .cxx and .h file with fluid +InputPath=..\test\keyboard_ui.fl + +"..\test\keyboard_ui.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluid -c keyboard_ui.fl + cd ..\visualc + +# End Custom Build + +!ELSEIF "$(CFG)" == "keyboard - Win32 Debug" + +# Begin Custom Build - Create .cxx and .h file with fluidd +InputPath=..\test\keyboard_ui.fl + +"..\test\keyboard_ui.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluidd -c keyboard_ui.fl + cd ..\visualc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/label.dsp b/third_party/windows/fltk-1.1.10/visualc/label.dsp new file mode 100644 index 0000000..3ababe8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/label.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="label" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=label - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "label.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "label.mak" CFG="label - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "label - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "label - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "label - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/label.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "label - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "label_" +# PROP BASE Intermediate_Dir "label_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "label_" +# PROP Intermediate_Dir "label_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/labeld.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "label - Win32 Release" +# Name "label - Win32 Debug" +# Begin Source File + +SOURCE=..\test\label.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/libpng.dsp b/third_party/windows/fltk-1.1.10/visualc/libpng.dsp new file mode 100644 index 0000000..1d4ea97 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/libpng.dsp @@ -0,0 +1,145 @@ +# Microsoft Developer Studio Project File - Name="libpng" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=libpng - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "libpng.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "libpng.mak" CFG="libpng - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libpng - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "libpng - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "libpng - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /Ot /Op /Ob2 /I "../visualc" /I "../zlib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# SUBTRACT CPP /Os +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltkpng.lib" + +!ELSEIF "$(CFG)" == "libpng - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /GX /Zi /Od /I "../visualc" /I "../zlib" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltkpngd.lib" + +!ENDIF + +# Begin Target + +# Name "libpng - Win32 Release" +# Name "libpng - Win32 Debug" +# Begin Source File + +SOURCE=..\png\png.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngerror.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngget.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngmem.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngpread.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngread.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngrio.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngrtran.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngrutil.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngset.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngtrans.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngwio.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngwrite.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngwtran.c +# End Source File +# Begin Source File + +SOURCE=..\png\pngwutil.c +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/line_style.dsp b/third_party/windows/fltk-1.1.10/visualc/line_style.dsp new file mode 100644 index 0000000..dd87843 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/line_style.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="line_style" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=line_style - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "line_style.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "line_style.mak" CFG="line_style - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "line_style - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "line_style - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "line_style - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/line_style.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "line_style - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "line_style_" +# PROP BASE Intermediate_Dir "line_style_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "line_style_" +# PROP Intermediate_Dir "line_style_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/line_styled.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "line_style - Win32 Release" +# Name "line_style - Win32 Debug" +# Begin Source File + +SOURCE=..\test\line_style.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/mandelbrot.dsp b/third_party/windows/fltk-1.1.10/visualc/mandelbrot.dsp new file mode 100644 index 0000000..eb59782 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/mandelbrot.dsp @@ -0,0 +1,132 @@ +# Microsoft Developer Studio Project File - Name="mandelbrot" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=mandelbrot - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mandelbrot.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "mandelbrot.mak" CFG="mandelbrot - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mandelbrot - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "mandelbrot - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mandelbrot - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 glu32.lib opengl32.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/mandelbrot.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "mandelbrot - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "mandelbrot_" +# PROP BASE Intermediate_Dir "mandelbrot_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "mandelbrot_" +# PROP Intermediate_Dir "mandelbrot_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 glu32.lib opengl32.lib fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/mandelbrotd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "mandelbrot - Win32 Release" +# Name "mandelbrot - Win32 Debug" +# Begin Source File + +SOURCE=..\test\mandelbrot.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\mandelbrot_ui.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\mandelbrot_ui.fl + +!IF "$(CFG)" == "mandelbrot - Win32 Release" + +# Begin Custom Build - Create .cxx and .h file with fluid +InputPath=..\test\mandelbrot_ui.fl + +"../test/mandelbrot_ui.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluid -c mandelbrot_ui.fl + cd ..\visualc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mandelbrot - Win32 Debug" + +# Begin Custom Build - Create .cxx and .h file with fluidd +InputPath=..\test\mandelbrot_ui.fl + +"../test/mandelbrot_ui.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluidd -c mandelbrot_ui.fl + cd ..\visualc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/menubar.dsp b/third_party/windows/fltk-1.1.10/visualc/menubar.dsp new file mode 100644 index 0000000..ff53d6d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/menubar.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="menubar" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=menubar - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "menubar.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "menubar.mak" CFG="menubar - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "menubar - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "menubar - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "menubar - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /machine:I386 /nodefaultlib:"libcd" /out:"../test/menubar.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "menubar - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "menubar_" +# PROP BASE Intermediate_Dir "menubar_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "menubar_" +# PROP Intermediate_Dir "menubar_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/menubard.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "menubar - Win32 Release" +# Name "menubar - Win32 Debug" +# Begin Source File + +SOURCE=..\test\menubar.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/message.dsp b/third_party/windows/fltk-1.1.10/visualc/message.dsp new file mode 100644 index 0000000..e0fc18f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/message.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="message" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=message - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "message.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "message.mak" CFG="message - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "message - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "message - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "message - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/message.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "message - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "message_" +# PROP BASE Intermediate_Dir "message_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "message_" +# PROP Intermediate_Dir "message_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/messaged.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "message - Win32 Release" +# Name "message - Win32 Debug" +# Begin Source File + +SOURCE=..\test\message.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/minimum.dsp b/third_party/windows/fltk-1.1.10/visualc/minimum.dsp new file mode 100644 index 0000000..79e1406 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/minimum.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="minimum" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=minimum - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "minimum.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "minimum.mak" CFG="minimum - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "minimum - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "minimum - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "minimum - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/minimum.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "minimum - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "minimum_" +# PROP BASE Intermediate_Dir "minimum_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "minimum_" +# PROP Intermediate_Dir "minimum_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/minimumd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "minimum - Win32 Release" +# Name "minimum - Win32 Debug" +# Begin Source File + +SOURCE=..\test\minimum.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/navigation.dsp b/third_party/windows/fltk-1.1.10/visualc/navigation.dsp new file mode 100644 index 0000000..a6cf365 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/navigation.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="navigation" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=navigation - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "navigation.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "navigation.mak" CFG="navigation - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "navigation - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "navigation - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "navigation - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/navigation.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "navigation - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "navigation_" +# PROP BASE Intermediate_Dir "navigation_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "navigation_" +# PROP Intermediate_Dir "navigation_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/navigationd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "navigation - Win32 Release" +# Name "navigation - Win32 Debug" +# Begin Source File + +SOURCE=..\test\navigation.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/output.dsp b/third_party/windows/fltk-1.1.10/visualc/output.dsp new file mode 100644 index 0000000..df8bbf1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/output.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="output" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=output - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "output.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "output.mak" CFG="output - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "output - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "output - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "output - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/output.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "output - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "output_" +# PROP BASE Intermediate_Dir "output_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "output_" +# PROP Intermediate_Dir "output_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/outputd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "output - Win32 Release" +# Name "output - Win32 Debug" +# Begin Source File + +SOURCE=..\test\output.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/overlay.dsp b/third_party/windows/fltk-1.1.10/visualc/overlay.dsp new file mode 100644 index 0000000..644c36b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/overlay.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="overlay" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=overlay - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "overlay.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "overlay.mak" CFG="overlay - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "overlay - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "overlay - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "overlay - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/overlay.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "overlay - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "overlay_" +# PROP BASE Intermediate_Dir "overlay_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "overlay_" +# PROP Intermediate_Dir "overlay_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/overlayd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "overlay - Win32 Release" +# Name "overlay - Win32 Debug" +# Begin Source File + +SOURCE=..\test\overlay.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/pack.dsp b/third_party/windows/fltk-1.1.10/visualc/pack.dsp new file mode 100644 index 0000000..d129f2e --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/pack.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="pack" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=pack - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "pack.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "pack.mak" CFG="pack - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "pack - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "pack - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "pack - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/pack.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "pack - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "pack_" +# PROP BASE Intermediate_Dir "pack_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "pack_" +# PROP Intermediate_Dir "pack_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/packd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "pack - Win32 Release" +# Name "pack - Win32 Debug" +# Begin Source File + +SOURCE=..\test\pack.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/pixmap.dsp b/third_party/windows/fltk-1.1.10/visualc/pixmap.dsp new file mode 100644 index 0000000..ecbc2bc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/pixmap.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="pixmap" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=pixmap - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "pixmap.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "pixmap.mak" CFG="pixmap - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "pixmap - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "pixmap - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "pixmap - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/pixmap.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "pixmap - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "pixmap_" +# PROP BASE Intermediate_Dir "pixmap_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "pixmap_" +# PROP Intermediate_Dir "pixmap_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/pixmapd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "pixmap - Win32 Release" +# Name "pixmap - Win32 Debug" +# Begin Source File + +SOURCE=..\test\pixmap.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/pixmap_browser.dsp b/third_party/windows/fltk-1.1.10/visualc/pixmap_browser.dsp new file mode 100644 index 0000000..6a1d3f2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/pixmap_browser.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="pixmap_browser" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=pixmap_browser - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "pixmap_browser.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "pixmap_browser.mak" CFG="pixmap_browser - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "pixmap_browser - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "pixmap_browser - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "pixmap_browser - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /nodefaultlib:"libcmt" /out:"../test/pixmap_browser.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "pixmap_browser - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "pixmap_browser_" +# PROP BASE Intermediate_Dir "pixmap_browser_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "pixmap_browser_" +# PROP Intermediate_Dir "pixmap_browser_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libc" /nodefaultlib:"libcd" /nodefaultlib:"libcmt" /nodefaultlib:"libcmtd" /out:"../test/pixmap_browserd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "pixmap_browser - Win32 Release" +# Name "pixmap_browser - Win32 Debug" +# Begin Source File + +SOURCE=..\test\pixmap_browser.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/preferences.dsp b/third_party/windows/fltk-1.1.10/visualc/preferences.dsp new file mode 100644 index 0000000..f5c7923 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/preferences.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="preferences" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=preferences - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "preferences.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "preferences.mak" CFG="preferences - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "preferences - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "preferences - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "preferences - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/preferences.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "preferences - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "preferences_" +# PROP BASE Intermediate_Dir "preferences_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "preferences_" +# PROP Intermediate_Dir "preferences_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/preferencesd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "preferences - Win32 Release" +# Name "preferences - Win32 Debug" +# Begin Source File + +SOURCE=..\test\preferences.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\preferences.fl + +!IF "$(CFG)" == "preferences - Win32 Release" + +# Begin Custom Build - Create .cxx and .h file with fluid +InputPath=..\test\preferences.fl + +"..\test\preferences.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluid -c preferences.fl + cd ..\visualc + +# End Custom Build + +!ELSEIF "$(CFG)" == "preferences - Win32 Debug" + +# Begin Custom Build - Create .cxx and .h file with fluidd +InputPath=..\test\preferences.fl + +"..\test\preferences.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluidd -c preferences.fl + cd ..\visualc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/radio.dsp b/third_party/windows/fltk-1.1.10/visualc/radio.dsp new file mode 100644 index 0000000..6ea1d93 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/radio.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="radio" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=radio - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "radio.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "radio.mak" CFG="radio - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "radio - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "radio - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "radio - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/radio.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "radio - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "radio_" +# PROP BASE Intermediate_Dir "radio_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "radio_" +# PROP Intermediate_Dir "radio_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/radiod.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "radio - Win32 Release" +# Name "radio - Win32 Debug" +# Begin Source File + +SOURCE=..\test\radio.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\radio.fl + +!IF "$(CFG)" == "radio - Win32 Release" + +# Begin Custom Build - Create .cxx and .h file with fluid +InputPath=..\test\radio.fl + +"../test/radio.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluid -c radio.fl + cd ..\visualc + +# End Custom Build + +!ELSEIF "$(CFG)" == "radio - Win32 Debug" + +# Begin Custom Build - Create .cxx and .h file with fluidd +InputPath=..\test\radio.fl + +"../test/radio.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluidd -c radio.fl + cd ..\visualc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/resize.dsp b/third_party/windows/fltk-1.1.10/visualc/resize.dsp new file mode 100644 index 0000000..7489c26 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/resize.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="resize" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=resize - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "resize.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "resize.mak" CFG="resize - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "resize - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "resize - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "resize - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/resize.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "resize - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "resize_" +# PROP BASE Intermediate_Dir "resize_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "resize_" +# PROP Intermediate_Dir "resize_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/resized.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "resize - Win32 Release" +# Name "resize - Win32 Debug" +# Begin Source File + +SOURCE=..\test\resize.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\resize.fl + +!IF "$(CFG)" == "resize - Win32 Release" + +# Begin Custom Build - Create .cxx and .h file with fluid +InputPath=..\test\resize.fl + +"../test/resize.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluid -c resize.fl + cd ..\visualc + +# End Custom Build + +!ELSEIF "$(CFG)" == "resize - Win32 Debug" + +# Begin Custom Build - Create .cxx and .h file with fluidd +InputPath=..\test\resize.fl + +"../test/resize.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluidd -c resize.fl + cd ..\visualc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/resizebox.dsp b/third_party/windows/fltk-1.1.10/visualc/resizebox.dsp new file mode 100644 index 0000000..f197f51 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/resizebox.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="resizebox" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=resizebox - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "resizebox.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "resizebox.mak" CFG="resizebox - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "resizebox - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "resizebox - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "resizebox - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/resizebox.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "resizebox - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "resizebox_" +# PROP BASE Intermediate_Dir "resizebox_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "resizebox_" +# PROP Intermediate_Dir "resizebox_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/resizeboxd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "resizebox - Win32 Release" +# Name "resizebox - Win32 Debug" +# Begin Source File + +SOURCE=..\test\resizebox.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/scroll.dsp b/third_party/windows/fltk-1.1.10/visualc/scroll.dsp new file mode 100644 index 0000000..8fe9b16 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/scroll.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="scroll" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=scroll - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "scroll.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "scroll.mak" CFG="scroll - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "scroll - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "scroll - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "scroll - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/scroll.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "scroll - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "scroll_" +# PROP BASE Intermediate_Dir "scroll_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "scroll_" +# PROP Intermediate_Dir "scroll_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/scrolld.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "scroll - Win32 Release" +# Name "scroll - Win32 Debug" +# Begin Source File + +SOURCE=..\test\scroll.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/shape.dsp b/third_party/windows/fltk-1.1.10/visualc/shape.dsp new file mode 100644 index 0000000..de344b9 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/shape.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="shape" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=shape - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "shape.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "shape.mak" CFG="shape - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "shape - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "shape - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "shape - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 opengl32.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/shape.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "shape - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "shape_" +# PROP BASE Intermediate_Dir "shape_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "shape_" +# PROP Intermediate_Dir "shape_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 opengl32.lib fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/shaped.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "shape - Win32 Release" +# Name "shape - Win32 Debug" +# Begin Source File + +SOURCE=..\test\shape.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/subwindow.dsp b/third_party/windows/fltk-1.1.10/visualc/subwindow.dsp new file mode 100644 index 0000000..d2e7034 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/subwindow.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="subwindow" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=subwindow - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "subwindow.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "subwindow.mak" CFG="subwindow - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "subwindow - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "subwindow - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "subwindow - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/subwindow.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "subwindow - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "subwindow_" +# PROP BASE Intermediate_Dir "subwindow_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "subwindow_" +# PROP Intermediate_Dir "subwindow_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/subwindowd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "subwindow - Win32 Release" +# Name "subwindow - Win32 Debug" +# Begin Source File + +SOURCE=..\test\subwindow.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/sudoku.dsp b/third_party/windows/fltk-1.1.10/visualc/sudoku.dsp new file mode 100644 index 0000000..dc3c769 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/sudoku.dsp @@ -0,0 +1,105 @@ +# Microsoft Developer Studio Project File - Name="sudoku" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=sudoku - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "sudoku.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "sudoku.mak" CFG="sudoku - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "sudoku - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "sudoku - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "sudoku - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 winmm.lib fltk.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/sudoku.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "sudoku - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "sudoku_" +# PROP BASE Intermediate_Dir "sudoku_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "sudoku_" +# PROP Intermediate_Dir "sudoku_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 winmm.lib fltkd.lib comctl32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/sudokud.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "sudoku - Win32 Release" +# Name "sudoku - Win32 Debug" +# Begin Source File + +SOURCE=..\test\sudoku.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\sudoku.ico +# End Source File +# Begin Source File + +SOURCE=..\test\sudoku.rc +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/symbols.dsp b/third_party/windows/fltk-1.1.10/visualc/symbols.dsp new file mode 100644 index 0000000..7867ed1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/symbols.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="symbols" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=symbols - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "symbols.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "symbols.mak" CFG="symbols - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "symbols - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "symbols - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "symbols - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/symbols.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "symbols - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "symbols_" +# PROP BASE Intermediate_Dir "symbols_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "symbols_" +# PROP Intermediate_Dir "symbols_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/symbolsd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "symbols - Win32 Release" +# Name "symbols - Win32 Debug" +# Begin Source File + +SOURCE=..\test\symbols.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/tabs.dsp b/third_party/windows/fltk-1.1.10/visualc/tabs.dsp new file mode 100644 index 0000000..eb7c9f2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/tabs.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="tabs" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=tabs - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "tabs.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "tabs.mak" CFG="tabs - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "tabs - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "tabs - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "tabs - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/tabs.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "tabs - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "tabs_" +# PROP BASE Intermediate_Dir "tabs_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "tabs_" +# PROP Intermediate_Dir "tabs_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/tabsd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "tabs - Win32 Release" +# Name "tabs - Win32 Debug" +# Begin Source File + +SOURCE=..\test\tabs.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\tabs.fl + +!IF "$(CFG)" == "tabs - Win32 Release" + +# Begin Custom Build - Create .cxx and .h file with fluid +InputPath=..\test\tabs.fl + +"../test/tabs.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluid -c tabs.fl + cd ..\visualc + +# End Custom Build + +!ELSEIF "$(CFG)" == "tabs - Win32 Debug" + +# Begin Custom Build - Create .cxx and .h file with fluidd +InputPath=..\test\tabs.fl + +"../test/tabs.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluidd -c tabs.fl + cd ..\visualc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/threads.dsp b/third_party/windows/fltk-1.1.10/visualc/threads.dsp new file mode 100644 index 0000000..eb8b188 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/threads.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="threads" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=threads - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "threads.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "threads.mak" CFG="threads - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "threads - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "threads - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "threads - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/threads.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "threads - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "threads_" +# PROP BASE Intermediate_Dir "threads_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "threads_" +# PROP Intermediate_Dir "threads_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/threadsd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "threads - Win32 Release" +# Name "threads - Win32 Debug" +# Begin Source File + +SOURCE=..\test\threads.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/tile.dsp b/third_party/windows/fltk-1.1.10/visualc/tile.dsp new file mode 100644 index 0000000..6903184 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/tile.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="tile" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=tile - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "tile.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "tile.mak" CFG="tile - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "tile - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "tile - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "tile - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/tile.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "tile - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "tile_" +# PROP BASE Intermediate_Dir "tile_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "tile_" +# PROP Intermediate_Dir "tile_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/tiled.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "tile - Win32 Release" +# Name "tile - Win32 Debug" +# Begin Source File + +SOURCE=..\test\tile.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/tiled_image.dsp b/third_party/windows/fltk-1.1.10/visualc/tiled_image.dsp new file mode 100644 index 0000000..7d71a84 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/tiled_image.dsp @@ -0,0 +1,97 @@ +# Microsoft Developer Studio Project File - Name="tiled_image" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=tiled_image - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "tiled_image.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "tiled_image.mak" CFG="tiled_image - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "tiled_image - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "tiled_image - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "tiled_image - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/tiled_image.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "tiled_image - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "tiled_image_" +# PROP BASE Intermediate_Dir "tiled_image_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "tiled_image_" +# PROP Intermediate_Dir "tiled_image_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/tiled_imaged.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "tiled_image - Win32 Release" +# Name "tiled_image - Win32 Debug" +# Begin Source File + +SOURCE=..\test\tiled_image.cxx +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/valuators.dsp b/third_party/windows/fltk-1.1.10/visualc/valuators.dsp new file mode 100644 index 0000000..3061cfd --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/valuators.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="valuators" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=valuators - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "valuators.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "valuators.mak" CFG="valuators - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "valuators - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "valuators - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "valuators - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Os /Ob2 /I "." /I ".." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /machine:I386 /nodefaultlib:"libcd" /out:"../test/valuators.exe" /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:yes + +!ELSEIF "$(CFG)" == "valuators - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "valuators_" +# PROP BASE Intermediate_Dir "valuators_" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "valuators_" +# PROP Intermediate_Dir "valuators_" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /Gm /GX /ZI /Od /I "." /I ".." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 fltkd.lib wsock32.lib comctl32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcd" /out:"../test/valuatorsd.exe" /pdbtype:sept /libpath:"..\lib" +# SUBTRACT LINK32 /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "valuators - Win32 Release" +# Name "valuators - Win32 Debug" +# Begin Source File + +SOURCE=..\test\valuators.cxx +# End Source File +# Begin Source File + +SOURCE=..\test\valuators.fl + +!IF "$(CFG)" == "valuators - Win32 Release" + +# Begin Custom Build - Create .cxx and .h file with fluid +InputPath=..\test\valuators.fl + +"../test/valuators.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluid -c valuators.fl + cd ..\visualc + +# End Custom Build + +!ELSEIF "$(CFG)" == "valuators - Win32 Debug" + +# Begin Custom Build - Create .cxx and .h file with fluidd +InputPath=..\test\valuators.fl + +"../test/valuators.cxx" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + cd ..\test + ..\fluid\fluidd -c valuators.fl + cd ..\visualc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/visualc/zlib.dsp b/third_party/windows/fltk-1.1.10/visualc/zlib.dsp new file mode 100644 index 0000000..33b3447 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/visualc/zlib.dsp @@ -0,0 +1,129 @@ +# Microsoft Developer Studio Project File - Name="zlib" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=zlib - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "zlib.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "zlib.mak" CFG="zlib - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "zlib - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "zlib - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "zlib - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MD /GX /Ot /Op /Ob2 /I "../visualc" /I "../zlib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# SUBTRACT CPP /Os +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltkz.lib" + +!ELSEIF "$(CFG)" == "zlib - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c +# ADD CPP /nologo /MDd /GX /Zi /Od /I "../visualc" /I "../zlib" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "VC_EXTRA_LEAN" /D "WIN32_EXTRA_LEAN" /YX /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"..\lib\fltkzd.lib" + +!ENDIF + +# Begin Target + +# Name "zlib - Win32 Release" +# Name "zlib - Win32 Debug" +# Begin Source File + +SOURCE=..\zlib\adler32.c +# End Source File +# Begin Source File + +SOURCE=..\zlib\compress.c +# End Source File +# Begin Source File + +SOURCE=..\zlib\crc32.c +# End Source File +# Begin Source File + +SOURCE=..\zlib\deflate.c +# End Source File +# Begin Source File + +SOURCE=..\zlib\gzio.c +# End Source File +# Begin Source File + +SOURCE=..\zlib\inffast.c +# End Source File +# Begin Source File + +SOURCE=..\zlib\inflate.c +# End Source File +# Begin Source File + +SOURCE=..\zlib\inftrees.c +# End Source File +# Begin Source File + +SOURCE=..\zlib\trees.c +# End Source File +# Begin Source File + +SOURCE=..\zlib\uncompr.c +# End Source File +# Begin Source File + +SOURCE=..\zlib\zutil.c +# End Source File +# End Target +# End Project diff --git a/third_party/windows/fltk-1.1.10/watcom.mif b/third_party/windows/fltk-1.1.10/watcom.mif new file mode 100644 index 0000000..8506363 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/watcom.mif @@ -0,0 +1,279 @@ +###################################################################### +# +# Watcom C specific makefile, multiplatform +# +# +# The following macross must be set active when this file is called +# -D parameter, e.g. -DPROJ=fltk +# ROOT = root of project (e.g. FLTK directory) +# PROJ = project name (e.g. fltk) +# +# The following environment variable must be set. If you have multiple +# Watcom versions, use the setvars file in the Watcom directory to set it. +# WATCOM = root of Watcom C +###################################################################### + +# +# The following options must be set when calling this wmake file +# (case-sensitive): +# D (debug/release mode): d for debug mode, +# r for release mode +# O (target environment): d = DOS 32 bits +# o = OS/2 32 bits +# w = Windows 32 bit +# l = Linux Intel (experimental, no graphics yet (OW 1.3)) +# +# +# If not set, debug mode and target=host (that is, no cross-compiling). +# Example: wmake -h -f makefile.wat d=r o=w +# +# Following macros can be used to add/override existing macros in +# this file. +# EXTRA_INCLUDE_DIRS # Non-Watcom (project) include dirs +# ODIR # Output directory if not default +# ROOT # Project root. If not given, . +# PROJ # Project name. +# LIBS # Extra libs to link in +# LIBDIR # Project library directory. Default: PROJ\LIB +# LIBNAMEROOT # Project rootname of output library. Default: PROJ\Lib\Proj +# EXTRA_LIBS # Target specific include libs + +!ifndef D +MODE=d # default is debug mode +!else +! ifeq D d +MODE=d +! else ifeq D r +MODE=r +! else +CONFIG_ERROR_MSG=Unrecognized mode: $(D) +! endif +!endif + +# If target is specified, check its validity; if not specified, the target is +# the host platform itself. + +!ifdef O +! ifeq O d +TARGET=dos +! else ifeq O o +TARGET=os2 +! else ifeq O w +TARGET=nt +! else ifeq O l +TARGET=linux +! else +CONFIG_ERROR_MSG=Unrecognized target: $(O) +! endif +!else +! ifdef __DOS__ +TARGET=dos +! else ifdef __OS2__ +TARGET=os2 +! else ifdef __NT__ +TARGET=nt +! else ifdef __LINUX__ +TARGET=linux +! endif +!endif + +# +# Now we know the target. Determine the link target. For fltk, this +# is always GUI for Windows and OS/2. For possible link targets (aliases +# for a set of linker directives) see wlsystem.lnk in Watcom's BINW directory. +# +!ifeq TARGET dos +LINKTARGET=dos32a +!else ifeq TARGET os2 +LINKTARGET=os2v2_pm +!else ifeq TARGET nt +LINKTARGET=nt_win +!else +LINKTARGET=linux +!endif + +# +# Very important: specify the sequence of extensions. Wmake will try to make a target +# with an extension from the first file of the same name with an extension to the right. +# E.g. it tries to make hello.obj from hello.cxx, or hello.cpp etc, but never from hello.exe +# +.EXTENSIONS : +.EXTENSIONS : .exe .lib .obj .cxx .cpp .c .h .fl + +# +# Create output directory name if not already supplied. To allow +# cross-development, must include target name. +# +!ifndef ODIR +ODIR=$(D)_$(TARGET) +!endif + +# +# Contruct the libname from the root plus D and O macros, so that +# multiple LIBS can co-exists, e.g. FLTK_DW and FLTK_RW for Win32. +# +!ifndef LIBDIR +LIBDIR=$(ROOT)\lib\ +!endif +!ifndef LIBNAMEROOT +LIBNAMEROOT=$(PROJ) +!endif +!ifndef LIBNAME +LIBNAME = $(LIBDIR)$(LIBNAMEROOT)_$(D)$(O).lib +# FLTK has other 'global' libs. Define the names here so that any application +# using FLTK can use them by just including this mif file. +LIBNAMEFL = $(LIBDIR)$(LIBNAMEROOT)_fl_$(D)$(O).lib +LIBNAMEGL = $(LIBDIR)$(LIBNAMEROOT)_gl_$(D)$(O).lib +LIBNAMEIMG = $(LIBDIR)$(LIBNAMEROOT)_img_$(D)$(O).lib +LIBS = $(LIBNAME) $(LIBNAMEFL) $(LIBNAMEGL) $(LIBNAMEIMG) +!endif + +# Set target environment options for the project + +!ifeqi TARGET nt # WINDOWS 32 bit +SYSDEF= -DWIN32 +ASYSDEF= +SYSLIBS=wsock32.lib mpr.lib glu32.lib opengl32.lib +EXEEXT=.exe + +!else ifeqi TARGET linux # Linux Intel 32 bit generic +SYSDEF= +ASYSDEF= +EXEEXT=.exe # We need some exe extension else the build won't work + +!else ifeqi TARGET os2 # OS/2 32 bit +SYSDEF= +ASYSDEF= +EXEEXT=.exe + +!else ifeqi TARGET dos # DOS 32 bit +SYSDEF= +ASYSDEF= +EXEEXT=.exe + +!endif + + +###################################################################### +# +# End of compiler- and environment specific options +# +# Note !message will print before any actions ('PRE'processor!), and thus +# will not reflect results of any rules (like set xxx=yyy). +# echo is a rule itself, and will reflect results of preceding rules. +# +###################################################################### + +.BEFORE : +!ifdef CONFIG_ERROR_MSG +! message +! message Configuration error: +! message $(CONFIG_ERROR_MSG) +! message + %abort +!endif + @if not exist $(ODIR) mkdir $(ODIR) >nul +!ifeqi TARGET dos + @set INCLUDE=$(%WATCOM)\H;$(EXTRA_INCLUDE_DIRS) +!else ifeqi TARGET os2 + @set INCLUDE=$(%WATCOM)\H;$(%WATCOM)\H\OS2;$(EXTRA_INCLUDE_DIRS) +!else ifeqi TARGET nt + @set INCLUDE=$(%WATCOM)\H;$(%WATCOM)\H\NT;$(EXTRA_INCLUDE_DIRS) +!else ifeqi TARGET linux + @set INCLUDE=$(%WATCOM)\LH;$(EXTRA_INCLUDE_DIRS) +!endif + +# @set LIB=$(LIBPATH) +# @echo Top dir: $(PROJ) + @echo Include dirs: $(%INCLUDE) +# @echo Lib dirs: $(LIBDIRS) +# @echo Libname=$(LIBNAME) +# @echo extra libs: $(LIBS) +# @echo Wmake version $(__VERSION__) +# @echo Wmake parameters: $(__MAKEOPTS__) +# @echo Compiler : $(CC) $(CCOPTS0) $(CCOPTS1) $(CCOPTS2) $(CCOPTS3) +# @echo Librarian: $(LIB) +# @echo Linker : $(LN) $(LNOPTS) +# @echo Project : $(P) + +!ifeqi D d +WCADEBUG=-d1 # debug opts for wasm +WCCDEBUG=-d2 -s -ors -wcd=666 -wcd=836 # debug opts for wcc. NOTE: -we is to make errors of all warnings +WCLDEBUG=d all # debug opts for wlink +# WCCTIMING=-et # if added to CC command line will generate timing file after execution +!else +# +# WCADEBUG= # debug opts for wasm +WCCDEBUG= -ors -s -wcd=666 -wcd=836 # release opts for wcc +# WCLDEBUG= # release opts for wlink +!endif + +# Conventions Watcom + +# Tell default paths based on extension +.fl : . +.h : . +#.lib : . +.c : . +.cpp : . +.cxx : . +.obj : $(ODIR) +.exe : $(ODIR) + +# +# Tell wmake to use DLL versions of some commands (much quicker) +# +!loaddll wcc386 wccd386 +!loaddll wpp386 wppd386 +!loaddll wlink wlink +!loaddll wlib wlibd + +CCOPTS0=-6r -zq +CCOPTS1=$(WCCDEBUG) -bt=$(TARGET) -fp6 -fpi87 # 1st part of Watcom opts +CCOPTS2=-mf -wce=130 -wx -zq # -j # 2nd part of Watcom opts +CCOPTS3=-fo$(ODIR)\$^&.obj # 3rd part Watcom opts +COPTS=-zm +CPPOPTS=-zmf -zv -fx + +LNOPTS=sys $(LINKTARGET) $(WCLDEBUG) op symf,q,m,el,vfr op st=32k # linker options +LIBOPTS= -b -q -p=512 -c # librarian options +LN=wlink # Watcom linker +AS=wasm # Watcom assembler +cc=wcc386 # Watcom C compiler +cpp=wpp386 # Watcom C++ compiler +LIB=wlib # Watcom librarian + +# +# Compilation +# +.c.obj: .AUTODEPEND + $(CC) $(SYSDEF) $(DEBUGDEF) $(CCOPTS0) $(CCOPTS1) $(CCOPTS2) $(CCOPTS3) $(COPTS) $[@ + +.cpp.obj: .AUTODEPEND + $(CPP) $(SYSDEF) $(DEBUGDEF) $(CCOPTS0) $(CCOPTS1) $(CCOPTS2) $(CCOPTS3) $(CPPOPTS) $[@ + +.cxx.obj: .AUTODEPEND + $(CPP) $(SYSDEF) $(DEBUGDEF) $(CCOPTS0) $(CCOPTS1) $(CCOPTS2) $(CCOPTS3) $(CPPOPTS) $[@ + +# +# Librarian stage +# +.obj.lib: + $(LIB) $(LIBOPTS) $@ $< + +# +# Linking stage. This implicit rule assumes the .exe is created from an object file with the +# same name, plus other object in macro OBJECTS, a number of .libs in macro LIBS etc. +# If the linking fails for some reason, the .lk1 file is not deleted and it can be +# examined. +# +.obj.exe: + @%create $^*.lk1 + @%append $^*.lk1 F $(ODIR)/$^& + @for %i in ($(%OBJS)) do @%append $^*.lk1 F $(ODIR)/%i + @for %i in ($(OBJECTS)) do @%append $^*.lk1 F $(ODIR)/%i + @for %i in ($(LIBS)) do @%append $^*.lk1 L %i + @for %i in ($(EXTRA_LIBS)) do @%append $^*.lk1 L %i + @for %i in ($(SYSLIBS)) do @%append $^*.lk1 L %i + $(LN) $(LNOPTS) name $^@ op map=$^* @$^*.lk1 + @del $^*.lk1 diff --git a/third_party/windows/fltk-1.1.10/watcom/config.h b/third_party/windows/fltk-1.1.10/watcom/config.h new file mode 100644 index 0000000..c0c8810 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/watcom/config.h @@ -0,0 +1,229 @@ +/* + * "$Id: config.h 4454 2005-07-24 18:41:30Z matt $" + * + * Configuration file for the Fast Light Tool Kit (FLTK) for Watcom C++ 1.3 + * + * Copyright 1998-2005 by Bill Spitzak and others. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + * + * Please report all bugs and problems to "fltk-bugs@fltk.org". + */ + +/* + * Where to find the documentation files... + */ + +#define FLTK_DATADIR "C:/FLTK" +#define FLTK_DOCDIR "C:/FLTK/DOC" + + +/* + * BORDER_WIDTH: + * + * Thickness of FL_UP_BOX and FL_DOWN_BOX. Current 1,2, and 3 are + * supported. 3 is the historic FLTK look. 2 looks more like Microsoft + * Windows, KDE, and Qt, and is the default when building for Windows. + * 1 is a plausible future evolution... Note that this may be simulated + * at runtime by redefining the boxtypes using Fl::set_boxtype(). + */ + +#define BORDER_WIDTH 2 + +/* + * HAVE_GL: + * + * Do you have OpenGL? Set this to 0 if you don't have or plan to use + * OpenGL, and FLTK will be smaller. + */ + +#define HAVE_GL 1 + +/* + * HAVE_GL_GLU_H: + * + * Do you have the OpenGL Utility Library header file? + * (many broken Mesa RPMs do not...) + */ + +#define HAVE_GL_GLU_H 1 + +/* + * USE_COLORMAP: + * + * Setting this to zero will save a good deal of code (especially for + * fl_draw_image), but FLTK will only work on TrueColor visuals. + */ + +#define USE_COLORMAP 1 + +/* + * USE_XFT + * + * Use the new Xft library to draw anti-aliased text. + */ + +#define USE_XFT 0 + +/* + * HAVE_XDBE: + * + * Do we have the X double-buffer extension? + */ + +#define HAVE_XDBE 0 + +/* + * USE_XDBE: + * + * Actually try to use the double-buffer extension? Set this to zero + * disable use of XDBE without breaking the list_visuals program. + */ + +#define USE_XDBE HAVE_XDBE + +/* + * HAVE_OVERLAY: + * + * Use the X overlay extension? FLTK will try to use an overlay + * visual for Fl_Overlay_Window, the Gl_Window overlay, and for the + * menus. Setting this to zero will remove a substantial amount of + * code from FLTK. Overlays have only been tested on SGI servers! + */ + +#define HAVE_OVERLAY 0 + +/* + * HAVE_GL_OVERLAY: + * + * It is possible your GL has an overlay even if X does not. If so, + * set this to 1. + */ + +#define HAVE_GL_OVERLAY 1 + +/* + * WORDS_BIGENDIAN: + * + * Byte order of your machine: 1 = big-endian, 0 = little-endian. + */ + +#define WORDS_BIGENDIAN 0 + +/* + * U16, U32, U64: + * + * Types used by fl_draw_image. One of U32 or U64 must be defined. + * U16 is optional but FLTK will work better with it! + */ + +#define U16 unsigned short +#define U32 unsigned +/* #undef U64 */ + +/* + * HAVE_DIRENT_H, HAVE_SYS_NDIR_H, HAVE_SYS_DIR_H, HAVE_NDIR_H, HAVE_SCANDIR: + * + * Where is (used only by fl_file_chooser and scandir). + */ + +#define HAVE_DIRENT_H 1 +/* #undef HAVE_SYS_NDIR_H */ +/* #undef HAVE_SYS_DIR_H */ +/* #undef HAVE_NDIR_H */ +/* #undef HAVE_SCANDIR */ + +/* + * Possibly missing sprintf-style functions: + */ + +#define HAVE_VSNPRINTF 1 +#define HAVE_SNPRINTF 1 + +/* + * String functions and headers... + */ + +/* #undef HAVE_STRINGS_H */ +#define HAVE_STRCASECMP 1 +/* #undef HAVE_STRLCAT */ +/* #undef HAVE_STRLCPY */ + +/* + * Do we have POSIX locale support? + */ + +#define HAVE_LOCALE_H 1 +#define HAVE_LOCALECONV 1 + +/* + * HAVE_SYS_SELECT_H: + * + * Whether or not select() call has its own header file. + */ + +/* #undef HAVE_SYS_SELECT_H */ + +/* + * HAVE_SYS_STDTYPES_H: + * + * Whether or not we have the header file. + */ + +/* #undef HAVE_SYS_STDTYPES_H */ + +/* + * HAVE_POLL: + * + * Use poll() if we don't have select(). + */ + +#define HAVE_POLL 0 + +/* + * Do we have various image libraries? + */ + +/* #undef HAVE_LIBPNG */ +/* #undef HAVE_LIBZ */ +/* #undef HAVE_LIBJPEG */ + +/* + * Which header file do we include for libpng? + */ + +/* #undef HAVE_PNG_H */ +/* #undef HAVE_LIBPNG_PNG_H */ + +/* + * Do we have the png_xyz() functions? + */ + +/* #undef HAVE_PNG_GET_VALID */ +/* #undef HAVE_PNG_SET_TRNS_TO_ALPHA */ +/* #undef HAVE_PNG_READ_DESTROY */ + +/* + * Do we have POSIX threading? + */ + +/* #undef HAVE_PTHREAD */ +/* #undef HAVE_PTHREAD_H */ + + +/* + * End of "$Id: config.h 4454 2005-07-24 18:41:30Z matt $". + */ diff --git a/third_party/windows/fltk-1.1.10/watcom/makefile b/third_party/windows/fltk-1.1.10/watcom/makefile new file mode 100644 index 0000000..75dd9e4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/watcom/makefile @@ -0,0 +1,114 @@ +# +# Name : Watcom makefile for FLTK, multiplatform +# +# Author : M. Nieuwenhoven +# +# The makefile has multiple targets: +# - clean : Cleans all directories from files built during make +# - all : Builds all targets for both debug and release +# - xy : where x = D|R, Y = D|O|W|L, where only W (Win32) is +# currently supported by the source for Watcom. +# + + +!ifndef %FLTK +ERROR_MSG = Environment variable FLTK must have been set! +!endif + +.BEFORE +!ifdef ERROR_MSG + @echo . + @echo $(ERROR_MSG) + @echo . + @%abort +!endif + +ROOT=$(%FLTK) +PROJ=fltk + +# +# This builds all library targets and the main programs +# +ALL : .SYMBOLIC + set Clean= + wmake -h dw + wmake -h rw +# wmake -h do +# wmake -h ro +# wmake -h dl +# wmake -h rl + +# +# Clean all directories. Call each target with a 'clean' target. Proper +# knowledge about cleaning can only be at the places where also the +# builds is done. +# +clean : .SYMBOLIC + @echo Cleaning up. + set Clean=CLEAN + wmake -h dw + wmake -h rw +# wmake -h do +# wmake -h ro +# wmake -h dl +# wmake -h rl + +# +# Win32 Debug and Release targets +# +DW : .SYMBOLIC + @set OPTIONS=D=d O=w ROOT=$(ROOT) PROJ=$(PROJ) EXTRA_INCLUDE_DIRS=$(ROOT) + %make BuildOne + +RW : .SYMBOLIC + @set OPTIONS=D=r O=w ROOT=$(ROOT) PROJ=$(PROJ) EXTRA_INCLUDE_DIRS=$(ROOT) + %make BuildOne + +# +# OS/2 Debug and Release targets. Builds only jpeg, zlib and png libs for now. +# +DO : .SYMBOLIC + @set OPTIONS=D=d O=o ROOT=$(ROOT) PROJ=$(PROJ) EXTRA_INCLUDE_DIRS=$(ROOT) + %make BuildOne + +RO : .SYMBOLIC + @set OPTIONS=D=r O=o ROOT=$(ROOT) PROJ=$(PROJ) EXTRA_INCLUDE_DIRS=$(ROOT) + %make BuildOne + +# +# Linux Debug and Release targets. Environment variable XLIB must point to a directory +# which has a subdirectory X11 with X include files. Builds only jpeg, zlib and png libs for now. +# +DL : .SYMBOLIC + @set OPTIONS=D=d O=l ROOT=$(ROOT) PROJ=$(PROJ) EXTRA_INCLUDE_DIRS=$(ROOT);$(%XLIB) + %make BuildOne + +RL : .SYMBOLIC + @set OPTIONS=D=r O=l ROOT=$(ROOT) PROJ=$(PROJ) EXTRA_INCLUDE_DIRS=$(ROOT);$(%XLIB) + %make BuildOne + +# Internal target to build the individual modules. The following macros must +# have been set: D (value D or R), O (D,O,W,L) + +BuildOne : .SYMBOLIC + + @echo "=== making jpeg library ===" + @cd $(ROOT)\jpeg + @wmake -h -f makefile.wat $(%OPTIONS) $(%CLEAN) + @echo "=== making zlib library ===" + @cd $(ROOT)\zlib + @wmake -h -f makefile.wat $(%OPTIONS) $(%CLEAN) + @echo "=== making png library ===" + @cd $(ROOT)\png + @wmake -h -f makefile.wat $(%OPTIONS) $(%CLEAN) + @echo "=== making fltk libraries ===" + @cd $(ROOT)\src + @wmake -h -f makefile.wat $(%OPTIONS) $(%CLEAN) + @echo "=== making fluid ===" + @cd $(ROOT)\fluid + @wmake -h -f makefile.wat $(%OPTIONS) $(%CLEAN) + @echo "=== making test ===" + @cd $(ROOT)\test + @wmake -h -f makefile.wat $(%OPTIONS) $(%CLEAN) + + diff --git a/third_party/windows/fltk-1.1.10/watcom/readme.wat b/third_party/windows/fltk-1.1.10/watcom/readme.wat new file mode 100644 index 0000000..a87feb8 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/watcom/readme.wat @@ -0,0 +1,46 @@ + +Using Watcom to build and use FLTK 1.1.5 + +Supported targets: Win32 only, static builds (no DLLs). Can be used from any Watcom + supported host (DOS, OS/2, Windows). + +1. To build fltk itself: + - set the environment variable fltk to the root directory of fltk + - go to the Watcom directory, run wmake. + Both debug and release versions of all libs, test programs and FLUID will be built. + +2. To create you own programs using fluid: + - set the environment variable fltk to the root directory of fltk + - make a directory where you want to create the source of your program. + - from fltk's watcom directory, copy file "makefile.example" to "makefile" in your + directory. + - Start fluid, and create your program. + - You can either put in fluid's menu shell->execute command: + "cmd /k "wmake && hello && exit || pause && exit" + to compile and run the program (if you are running under Windows only), + - Or in Fluid do shift-Ctrl-C to create C+= code, and then in a cmd prompt + in your directory enter 'wmake", and then run the program. + I have been able to do most of the Fluid Flash tutorial (no time to do all, + but no error at all for the ones I did do. + +3. Known errors: + - Fluid aborts when exiting. + + Probably a lot more :-( . I cannot test/debug under NT or later, so I must + rely on the help of others to find and fix :-) Watcom-related bugs. + + +Questions about the OpenWatcom port please to the fltk.general newsgroup. +Questions related to Openwatcom itself please to the c/c++ users group at +new.openwatcom.org. + + +Mat Nieuwenhoven, Hilversum, 2004-11-22 + + + + + + + + diff --git a/third_party/windows/fltk-1.1.10/zlib/CMakeLists.txt b/third_party/windows/fltk-1.1.10/zlib/CMakeLists.txt new file mode 100644 index 0000000..5f6e5e5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/CMakeLists.txt @@ -0,0 +1,15 @@ +PROJECT(FLTKZLIB) +INCLUDE_REGULAR_EXPRESSION("^(deflate|inf|trees|zconf|zlib|zutil).*$") + +INCLUDE_DIRECTORIES(${FLTKZLIB_SOURCE_DIR}) +INCLUDE_DIRECTORIES(${FLTKZLIB_BINARY_DIR}) + +# source files for zlib +SET(ZLIB_SRCS +adler32.c compress.c crc32.c deflate.c gzio.c inffast.c +inflate.c inftrees.c trees.c uncompr.c zutil.c +) + +ADD_LIBRARY(fltk_zlib ${ZLIB_SRCS}) +INSTALL_TARGETS(/lib fltk_zlib) + diff --git a/third_party/windows/fltk-1.1.10/zlib/ChangeLog b/third_party/windows/fltk-1.1.10/zlib/ChangeLog new file mode 100644 index 0000000..179620a --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/ChangeLog @@ -0,0 +1,855 @@ + + ChangeLog file for zlib + +Changes in 1.2.3 (18 July 2005) +- Apply security vulnerability fixes to contrib/infback9 as well +- Clean up some text files (carriage returns, trailing space) +- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant] + +Changes in 1.2.2.4 (11 July 2005) +- Add inflatePrime() function for starting inflation at bit boundary +- Avoid some Visual C warnings in deflate.c +- Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit + compile +- Fix some spelling errors in comments [Betts] +- Correct inflateInit2() error return documentation in zlib.h +- Added zran.c example of compressed data random access to examples + directory, shows use of inflatePrime() +- Fix cast for assignments to strm->state in inflate.c and infback.c +- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer] +- Move declarations of gf2 functions to right place in crc32.c [Oberhumer] +- Add cast in trees.c t avoid a warning [Oberhumer] +- Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer] +- Update make_vms.com [Zinser] +- Initialize state->write in inflateReset() since copied in inflate_fast() +- Be more strict on incomplete code sets in inflate_table() and increase + ENOUGH and MAXD -- this repairs a possible security vulnerability for + invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for + discovering the vulnerability and providing test cases. +- Add ia64 support to configure for HP-UX [Smith] +- Add error return to gzread() for format or i/o error [Levin] +- Use malloc.h for OS/2 [Necasek] + +Changes in 1.2.2.3 (27 May 2005) +- Replace 1U constants in inflate.c and inftrees.c for 64-bit compile +- Typecast fread() return values in gzio.c [Vollant] +- Remove trailing space in minigzip.c outmode (VC++ can't deal with it) +- Fix crc check bug in gzread() after gzungetc() [Heiner] +- Add the deflateTune() function to adjust internal compression parameters +- Add a fast gzip decompressor, gun.c, to examples (use of inflateBack) +- Remove an incorrect assertion in examples/zpipe.c +- Add C++ wrapper in infback9.h [Donais] +- Fix bug in inflateCopy() when decoding fixed codes +- Note in zlib.h how much deflateSetDictionary() actually uses +- Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used) +- Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer] +- Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer] +- Add gzdirect() function to indicate transparent reads +- Update contrib/minizip [Vollant] +- Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer] +- Add casts in crc32.c to avoid warnings [Oberhumer] +- Add contrib/masmx64 [Vollant] +- Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant] + +Changes in 1.2.2.2 (30 December 2004) +- Replace structure assignments in deflate.c and inflate.c with zmemcpy to + avoid implicit memcpy calls (portability for no-library compilation) +- Increase sprintf() buffer size in gzdopen() to allow for large numbers +- Add INFLATE_STRICT to check distances against zlib header +- Improve WinCE errno handling and comments [Chang] +- Remove comment about no gzip header processing in FAQ +- Add Z_FIXED strategy option to deflateInit2() to force fixed trees +- Add updated make_vms.com [Coghlan], update README +- Create a new "examples" directory, move gzappend.c there, add zpipe.c, + fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html. +- Add FAQ entry and comments in deflate.c on uninitialized memory access +- Add Solaris 9 make options in configure [Gilbert] +- Allow strerror() usage in gzio.c for STDC +- Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer] +- Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant] +- Use z_off_t for adler32_combine() and crc32_combine() lengths +- Make adler32() much faster for small len +- Use OS_CODE in deflate() default gzip header + +Changes in 1.2.2.1 (31 October 2004) +- Allow inflateSetDictionary() call for raw inflate +- Fix inflate header crc check bug for file names and comments +- Add deflateSetHeader() and gz_header structure for custom gzip headers +- Add inflateGetheader() to retrieve gzip headers +- Add crc32_combine() and adler32_combine() functions +- Add alloc_func, free_func, in_func, out_func to Z_PREFIX list +- Use zstreamp consistently in zlib.h (inflate_back functions) +- Remove GUNZIP condition from definition of inflate_mode in inflate.h + and in contrib/inflate86/inffast.S [Truta, Anderson] +- Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson] +- Update projects/README.projects and projects/visualc6 [Truta] +- Update win32/DLL_FAQ.txt [Truta] +- Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta] +- Deprecate Z_ASCII; use Z_TEXT instead [Truta] +- Use a new algorithm for setting strm->data_type in trees.c [Truta] +- Do not define an exit() prototype in zutil.c unless DEBUG defined +- Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta] +- Add comment in zlib.h for Z_NO_FLUSH parameter to deflate() +- Fix Darwin build version identification [Peterson] + +Changes in 1.2.2 (3 October 2004) +- Update zlib.h comments on gzip in-memory processing +- Set adler to 1 in inflateReset() to support Java test suite [Walles] +- Add contrib/dotzlib [Ravn] +- Update win32/DLL_FAQ.txt [Truta] +- Update contrib/minizip [Vollant] +- Move contrib/visual-basic.txt to old/ [Truta] +- Fix assembler builds in projects/visualc6/ [Truta] + +Changes in 1.2.1.2 (9 September 2004) +- Update INDEX file +- Fix trees.c to update strm->data_type (no one ever noticed!) +- Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown] +- Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE) +- Add limited multitasking protection to DYNAMIC_CRC_TABLE +- Add NO_vsnprintf for VMS in zutil.h [Mozilla] +- Don't declare strerror() under VMS [Mozilla] +- Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize +- Update contrib/ada [Anisimkov] +- Update contrib/minizip [Vollant] +- Fix configure to not hardcode directories for Darwin [Peterson] +- Fix gzio.c to not return error on empty files [Brown] +- Fix indentation; update version in contrib/delphi/ZLib.pas and + contrib/pascal/zlibpas.pas [Truta] +- Update mkasm.bat in contrib/masmx86 [Truta] +- Update contrib/untgz [Truta] +- Add projects/README.projects [Truta] +- Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta] +- Update win32/DLL_FAQ.txt [Truta] +- Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta] +- Remove an unnecessary assignment to curr in inftrees.c [Truta] +- Add OS/2 to exe builds in configure [Poltorak] +- Remove err dummy parameter in zlib.h [Kientzle] + +Changes in 1.2.1.1 (9 January 2004) +- Update email address in README +- Several FAQ updates +- Fix a big fat bug in inftrees.c that prevented decoding valid + dynamic blocks with only literals and no distance codes -- + Thanks to "Hot Emu" for the bug report and sample file +- Add a note to puff.c on no distance codes case. + +Changes in 1.2.1 (17 November 2003) +- Remove a tab in contrib/gzappend/gzappend.c +- Update some interfaces in contrib for new zlib functions +- Update zlib version number in some contrib entries +- Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta] +- Support shared libraries on Hurd and KFreeBSD [Brown] +- Fix error in NO_DIVIDE option of adler32.c + +Changes in 1.2.0.8 (4 November 2003) +- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas +- Add experimental NO_DIVIDE #define in adler32.c + - Possibly faster on some processors (let me know if it is) +- Correct Z_BLOCK to not return on first inflate call if no wrap +- Fix strm->data_type on inflate() return to correctly indicate EOB +- Add deflatePrime() function for appending in the middle of a byte +- Add contrib/gzappend for an example of appending to a stream +- Update win32/DLL_FAQ.txt [Truta] +- Delete Turbo C comment in README [Truta] +- Improve some indentation in zconf.h [Truta] +- Fix infinite loop on bad input in configure script [Church] +- Fix gzeof() for concatenated gzip files [Johnson] +- Add example to contrib/visual-basic.txt [Michael B.] +- Add -p to mkdir's in Makefile.in [vda] +- Fix configure to properly detect presence or lack of printf functions +- Add AS400 support [Monnerat] +- Add a little Cygwin support [Wilson] + +Changes in 1.2.0.7 (21 September 2003) +- Correct some debug formats in contrib/infback9 +- Cast a type in a debug statement in trees.c +- Change search and replace delimiter in configure from % to # [Beebe] +- Update contrib/untgz to 0.2 with various fixes [Truta] +- Add build support for Amiga [Nikl] +- Remove some directories in old that have been updated to 1.2 +- Add dylib building for Mac OS X in configure and Makefile.in +- Remove old distribution stuff from Makefile +- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X +- Update links in README + +Changes in 1.2.0.6 (13 September 2003) +- Minor FAQ updates +- Update contrib/minizip to 1.00 [Vollant] +- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta] +- Update POSTINC comment for 68060 [Nikl] +- Add contrib/infback9 with deflate64 decoding (unsupported) +- For MVS define NO_vsnprintf and undefine FAR [van Burik] +- Add pragma for fdopen on MVS [van Burik] + +Changes in 1.2.0.5 (8 September 2003) +- Add OF to inflateBackEnd() declaration in zlib.h +- Remember start when using gzdopen in the middle of a file +- Use internal off_t counters in gz* functions to properly handle seeks +- Perform more rigorous check for distance-too-far in inffast.c +- Add Z_BLOCK flush option to return from inflate at block boundary +- Set strm->data_type on return from inflate + - Indicate bits unused, if at block boundary, and if in last block +- Replace size_t with ptrdiff_t in crc32.c, and check for correct size +- Add condition so old NO_DEFLATE define still works for compatibility +- FAQ update regarding the Windows DLL [Truta] +- INDEX update: add qnx entry, remove aix entry [Truta] +- Install zlib.3 into mandir [Wilson] +- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta] +- Adapt the zlib interface to the new DLL convention guidelines [Truta] +- Introduce ZLIB_WINAPI macro to allow the export of functions using + the WINAPI calling convention, for Visual Basic [Vollant, Truta] +- Update msdos and win32 scripts and makefiles [Truta] +- Export symbols by name, not by ordinal, in win32/zlib.def [Truta] +- Add contrib/ada [Anisimkov] +- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta] +- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant] +- Add contrib/masm686 [Truta] +- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm + [Truta, Vollant] +- Update contrib/delphi; rename to contrib/pascal; add example [Truta] +- Remove contrib/delphi2; add a new contrib/delphi [Truta] +- Avoid inclusion of the nonstandard in contrib/iostream, + and fix some method prototypes [Truta] +- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip + [Truta] +- Avoid the use of backslash (\) in contrib/minizip [Vollant] +- Fix file time handling in contrib/untgz; update makefiles [Truta] +- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines + [Vollant] +- Remove contrib/vstudio/vc15_16 [Vollant] +- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta] +- Update README.contrib [Truta] +- Invert the assignment order of match_head and s->prev[...] in + INSERT_STRING [Truta] +- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings + [Truta] +- Compare function pointers with 0, not with NULL or Z_NULL [Truta] +- Fix prototype of syncsearch in inflate.c [Truta] +- Introduce ASMINF macro to be enabled when using an ASM implementation + of inflate_fast [Truta] +- Change NO_DEFLATE to NO_GZCOMPRESS [Truta] +- Modify test_gzio in example.c to take a single file name as a + parameter [Truta] +- Exit the example.c program if gzopen fails [Truta] +- Add type casts around strlen in example.c [Truta] +- Remove casting to sizeof in minigzip.c; give a proper type + to the variable compared with SUFFIX_LEN [Truta] +- Update definitions of STDC and STDC99 in zconf.h [Truta] +- Synchronize zconf.h with the new Windows DLL interface [Truta] +- Use SYS16BIT instead of __32BIT__ to distinguish between + 16- and 32-bit platforms [Truta] +- Use far memory allocators in small 16-bit memory models for + Turbo C [Truta] +- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in + zlibCompileFlags [Truta] +- Cygwin has vsnprintf [Wilson] +- In Windows16, OS_CODE is 0, as in MSDOS [Truta] +- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson] + +Changes in 1.2.0.4 (10 August 2003) +- Minor FAQ updates +- Be more strict when checking inflateInit2's windowBits parameter +- Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well +- Add gzip wrapper option to deflateInit2 using windowBits +- Add updated QNX rule in configure and qnx directory [Bonnefoy] +- Make inflate distance-too-far checks more rigorous +- Clean up FAR usage in inflate +- Add casting to sizeof() in gzio.c and minigzip.c + +Changes in 1.2.0.3 (19 July 2003) +- Fix silly error in gzungetc() implementation [Vollant] +- Update contrib/minizip and contrib/vstudio [Vollant] +- Fix printf format in example.c +- Correct cdecl support in zconf.in.h [Anisimkov] +- Minor FAQ updates + +Changes in 1.2.0.2 (13 July 2003) +- Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons +- Attempt to avoid warnings in crc32.c for pointer-int conversion +- Add AIX to configure, remove aix directory [Bakker] +- Add some casts to minigzip.c +- Improve checking after insecure sprintf() or vsprintf() calls +- Remove #elif's from crc32.c +- Change leave label to inf_leave in inflate.c and infback.c to avoid + library conflicts +- Remove inflate gzip decoding by default--only enable gzip decoding by + special request for stricter backward compatibility +- Add zlibCompileFlags() function to return compilation information +- More typecasting in deflate.c to avoid warnings +- Remove leading underscore from _Capital #defines [Truta] +- Fix configure to link shared library when testing +- Add some Windows CE target adjustments [Mai] +- Remove #define ZLIB_DLL in zconf.h [Vollant] +- Add zlib.3 [Rodgers] +- Update RFC URL in deflate.c and algorithm.txt [Mai] +- Add zlib_dll_FAQ.txt to contrib [Truta] +- Add UL to some constants [Truta] +- Update minizip and vstudio [Vollant] +- Remove vestigial NEED_DUMMY_RETURN from zconf.in.h +- Expand use of NO_DUMMY_DECL to avoid all dummy structures +- Added iostream3 to contrib [Schwardt] +- Replace rewind() with fseek() for WinCE [Truta] +- Improve setting of zlib format compression level flags + - Report 0 for huffman and rle strategies and for level == 0 or 1 + - Report 2 only for level == 6 +- Only deal with 64K limit when necessary at compile time [Truta] +- Allow TOO_FAR check to be turned off at compile time [Truta] +- Add gzclearerr() function [Souza] +- Add gzungetc() function + +Changes in 1.2.0.1 (17 March 2003) +- Add Z_RLE strategy for run-length encoding [Truta] + - When Z_RLE requested, restrict matches to distance one + - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE +- Correct FASTEST compilation to allow level == 0 +- Clean up what gets compiled for FASTEST +- Incorporate changes to zconf.in.h [Vollant] + - Refine detection of Turbo C need for dummy returns + - Refine ZLIB_DLL compilation + - Include additional header file on VMS for off_t typedef +- Try to use _vsnprintf where it supplants vsprintf [Vollant] +- Add some casts in inffast.c +- Enchance comments in zlib.h on what happens if gzprintf() tries to + write more than 4095 bytes before compression +- Remove unused state from inflateBackEnd() +- Remove exit(0) from minigzip.c, example.c +- Get rid of all those darn tabs +- Add "check" target to Makefile.in that does the same thing as "test" +- Add "mostlyclean" and "maintainer-clean" targets to Makefile.in +- Update contrib/inflate86 [Anderson] +- Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant] +- Add msdos and win32 directories with makefiles [Truta] +- More additions and improvements to the FAQ + +Changes in 1.2.0 (9 March 2003) +- New and improved inflate code + - About 20% faster + - Does not allocate 32K window unless and until needed + - Automatically detects and decompresses gzip streams + - Raw inflate no longer needs an extra dummy byte at end + - Added inflateBack functions using a callback interface--even faster + than inflate, useful for file utilities (gzip, zip) + - Added inflateCopy() function to record state for random access on + externally generated deflate streams (e.g. in gzip files) + - More readable code (I hope) +- New and improved crc32() + - About 50% faster, thanks to suggestions from Rodney Brown +- Add deflateBound() and compressBound() functions +- Fix memory leak in deflateInit2() +- Permit setting dictionary for raw deflate (for parallel deflate) +- Fix const declaration for gzwrite() +- Check for some malloc() failures in gzio.c +- Fix bug in gzopen() on single-byte file 0x1f +- Fix bug in gzread() on concatenated file with 0x1f at end of buffer + and next buffer doesn't start with 0x8b +- Fix uncompress() to return Z_DATA_ERROR on truncated input +- Free memory at end of example.c +- Remove MAX #define in trees.c (conflicted with some libraries) +- Fix static const's in deflate.c, gzio.c, and zutil.[ch] +- Declare malloc() and free() in gzio.c if STDC not defined +- Use malloc() instead of calloc() in zutil.c if int big enough +- Define STDC for AIX +- Add aix/ with approach for compiling shared library on AIX +- Add HP-UX support for shared libraries in configure +- Add OpenUNIX support for shared libraries in configure +- Use $cc instead of gcc to build shared library +- Make prefix directory if needed when installing +- Correct Macintosh avoidance of typedef Byte in zconf.h +- Correct Turbo C memory allocation when under Linux +- Use libz.a instead of -lz in Makefile (assure use of compiled library) +- Update configure to check for snprintf or vsnprintf functions and their + return value, warn during make if using an insecure function +- Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that + is lost when library is used--resolution is to build new zconf.h +- Documentation improvements (in zlib.h): + - Document raw deflate and inflate + - Update RFCs URL + - Point out that zlib and gzip formats are different + - Note that Z_BUF_ERROR is not fatal + - Document string limit for gzprintf() and possible buffer overflow + - Note requirement on avail_out when flushing + - Note permitted values of flush parameter of inflate() +- Add some FAQs (and even answers) to the FAQ +- Add contrib/inflate86/ for x86 faster inflate +- Add contrib/blast/ for PKWare Data Compression Library decompression +- Add contrib/puff/ simple inflate for deflate format description + +Changes in 1.1.4 (11 March 2002) +- ZFREE was repeated on same allocation on some error conditions. + This creates a security problem described in + http://www.zlib.org/advisory-2002-03-11.txt +- Returned incorrect error (Z_MEM_ERROR) on some invalid data +- Avoid accesses before window for invalid distances with inflate window + less than 32K. +- force windowBits > 8 to avoid a bug in the encoder for a window size + of 256 bytes. (A complete fix will be available in 1.1.5). + +Changes in 1.1.3 (9 July 1998) +- fix "an inflate input buffer bug that shows up on rare but persistent + occasions" (Mark) +- fix gzread and gztell for concatenated .gz files (Didier Le Botlan) +- fix gzseek(..., SEEK_SET) in write mode +- fix crc check after a gzeek (Frank Faubert) +- fix miniunzip when the last entry in a zip file is itself a zip file + (J Lillge) +- add contrib/asm586 and contrib/asm686 (Brian Raiter) + See http://www.muppetlabs.com/~breadbox/software/assembly.html +- add support for Delphi 3 in contrib/delphi (Bob Dellaca) +- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti) +- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren) +- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks) +- added a FAQ file + +- Support gzdopen on Mac with Metrowerks (Jason Linhart) +- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart) +- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young) +- avoid some warnings with Borland C (Tom Tanner) +- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant) +- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant) +- allow several arguments to configure (Tim Mooney, Frodo Looijaard) +- use libdir and includedir in Makefile.in (Tim Mooney) +- support shared libraries on OSF1 V4 (Tim Mooney) +- remove so_locations in "make clean" (Tim Mooney) +- fix maketree.c compilation error (Glenn, Mark) +- Python interface to zlib now in Python 1.5 (Jeremy Hylton) +- new Makefile.riscos (Rich Walker) +- initialize static descriptors in trees.c for embedded targets (Nick Smith) +- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith) +- add the OS/2 files in Makefile.in too (Andrew Zabolotny) +- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane) +- fix maketree.c to allow clean compilation of inffixed.h (Mark) +- fix parameter check in deflateCopy (Gunther Nikl) +- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler) +- Many portability patches by Christian Spieler: + . zutil.c, zutil.h: added "const" for zmem* + . Make_vms.com: fixed some typos + . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists + . msdos/Makefile.msc: remove "default rtl link library" info from obj files + . msdos/Makefile.*: use model-dependent name for the built zlib library + . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc: + new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT) +- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane) +- replace __far with _far for better portability (Christian Spieler, Tom Lane) +- fix test for errno.h in configure (Tim Newsham) + +Changes in 1.1.2 (19 March 98) +- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant) + See http://www.winimage.com/zLibDll/unzip.html +- preinitialize the inflate tables for fixed codes, to make the code + completely thread safe (Mark) +- some simplifications and slight speed-up to the inflate code (Mark) +- fix gzeof on non-compressed files (Allan Schrum) +- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs) +- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn) +- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny) +- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori) +- do not wrap extern "C" around system includes (Tom Lane) +- mention zlib binding for TCL in README (Andreas Kupries) +- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert) +- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson) +- allow "configure --prefix $HOME" (Tim Mooney) +- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson) +- move Makefile.sas to amiga/Makefile.sas + +Changes in 1.1.1 (27 Feb 98) +- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson) +- remove block truncation heuristic which had very marginal effect for zlib + (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the + compression ratio on some files. This also allows inlining _tr_tally for + matches in deflate_slow. +- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier) + +Changes in 1.1.0 (24 Feb 98) +- do not return STREAM_END prematurely in inflate (John Bowler) +- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler) +- compile with -DFASTEST to get compression code optimized for speed only +- in minigzip, try mmap'ing the input file first (Miguel Albrecht) +- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain + on Sun but significant on HP) + +- add a pointer to experimental unzip library in README (Gilles Vollant) +- initialize variable gcc in configure (Chris Herborth) + +Changes in 1.0.9 (17 Feb 1998) +- added gzputs and gzgets functions +- do not clear eof flag in gzseek (Mark Diekhans) +- fix gzseek for files in transparent mode (Mark Diekhans) +- do not assume that vsprintf returns the number of bytes written (Jens Krinke) +- replace EXPORT with ZEXPORT to avoid conflict with other programs +- added compress2 in zconf.h, zlib.def, zlib.dnt +- new asm code from Gilles Vollant in contrib/asm386 +- simplify the inflate code (Mark): + . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new() + . ZALLOC the length list in inflate_trees_fixed() instead of using stack + . ZALLOC the value area for huft_build() instead of using stack + . Simplify Z_FINISH check in inflate() + +- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8 +- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi) +- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with + the declaration of FAR (Gilles VOllant) +- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann) +- read_buf buf parameter of type Bytef* instead of charf* +- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout) +- do not redeclare unlink in minigzip.c for WIN32 (John Bowler) +- fix check for presence of directories in "make install" (Ian Willis) + +Changes in 1.0.8 (27 Jan 1998) +- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant) +- fix gzgetc and gzputc for big endian systems (Markus Oberhumer) +- added compress2() to allow setting the compression level +- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong) +- use constant arrays for the static trees in trees.c instead of computing + them at run time (thanks to Ken Raeburn for this suggestion). To create + trees.h, compile with GEN_TREES_H and run "make test". +- check return code of example in "make test" and display result +- pass minigzip command line options to file_compress +- simplifying code of inflateSync to avoid gcc 2.8 bug + +- support CC="gcc -Wall" in configure -s (QingLong) +- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn) +- fix test for shared library support to avoid compiler warnings +- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant) +- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit) +- do not use fdopen for Metrowerks on Mac (Brad Pettit)) +- add checks for gzputc and gzputc in example.c +- avoid warnings in gzio.c and deflate.c (Andreas Kleinert) +- use const for the CRC table (Ken Raeburn) +- fixed "make uninstall" for shared libraries +- use Tracev instead of Trace in infblock.c +- in example.c use correct compressed length for test_sync +- suppress +vnocompatwarnings in configure for HPUX (not always supported) + +Changes in 1.0.7 (20 Jan 1998) +- fix gzseek which was broken in write mode +- return error for gzseek to negative absolute position +- fix configure for Linux (Chun-Chung Chen) +- increase stack space for MSC (Tim Wegner) +- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant) +- define EXPORTVA for gzprintf (Gilles Vollant) +- added man page zlib.3 (Rick Rodgers) +- for contrib/untgz, fix makedir() and improve Makefile + +- check gzseek in write mode in example.c +- allocate extra buffer for seeks only if gzseek is actually called +- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant) +- add inflateSyncPoint in zconf.h +- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def + +Changes in 1.0.6 (19 Jan 1998) +- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and + gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code) +- Fix a deflate bug occurring only with compression level 0 (thanks to + Andy Buckler for finding this one). +- In minigzip, pass transparently also the first byte for .Z files. +- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress() +- check Z_FINISH in inflate (thanks to Marc Schluper) +- Implement deflateCopy (thanks to Adam Costello) +- make static libraries by default in configure, add --shared option. +- move MSDOS or Windows specific files to directory msdos +- suppress the notion of partial flush to simplify the interface + (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4) +- suppress history buffer provided by application to simplify the interface + (this feature was not implemented anyway in 1.0.4) +- next_in and avail_in must be initialized before calling inflateInit or + inflateInit2 +- add EXPORT in all exported functions (for Windows DLL) +- added Makefile.nt (thanks to Stephen Williams) +- added the unsupported "contrib" directory: + contrib/asm386/ by Gilles Vollant + 386 asm code replacing longest_match(). + contrib/iostream/ by Kevin Ruland + A C++ I/O streams interface to the zlib gz* functions + contrib/iostream2/ by Tyge Løvset + Another C++ I/O streams interface + contrib/untgz/ by "Pedro A. Aranda Guti\irrez" + A very simple tar.gz file extractor using zlib + contrib/visual-basic.txt by Carlos Rios + How to use compress(), uncompress() and the gz* functions from VB. +- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression + level) in minigzip (thanks to Tom Lane) + +- use const for rommable constants in deflate +- added test for gzseek and gztell in example.c +- add undocumented function inflateSyncPoint() (hack for Paul Mackerras) +- add undocumented function zError to convert error code to string + (for Tim Smithers) +- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code. +- Use default memcpy for Symantec MSDOS compiler. +- Add EXPORT keyword for check_func (needed for Windows DLL) +- add current directory to LD_LIBRARY_PATH for "make test" +- create also a link for libz.so.1 +- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura) +- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX) +- added -soname for Linux in configure (Chun-Chung Chen, +- assign numbers to the exported functions in zlib.def (for Windows DLL) +- add advice in zlib.h for best usage of deflateSetDictionary +- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn) +- allow compilation with ANSI keywords only enabled for TurboC in large model +- avoid "versionString"[0] (Borland bug) +- add NEED_DUMMY_RETURN for Borland +- use variable z_verbose for tracing in debug mode (L. Peter Deutsch). +- allow compilation with CC +- defined STDC for OS/2 (David Charlap) +- limit external names to 8 chars for MVS (Thomas Lund) +- in minigzip.c, use static buffers only for 16-bit systems +- fix suffix check for "minigzip -d foo.gz" +- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee) +- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau) +- added makelcc.bat for lcc-win32 (Tom St Denis) +- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe) +- Avoid expanded $Id: ChangeLog 6061 2008-03-01 06:39:46Z mike $. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion. +- check for unistd.h in configure (for off_t) +- remove useless check parameter in inflate_blocks_free +- avoid useless assignment of s->check to itself in inflate_blocks_new +- do not flush twice in gzclose (thanks to Ken Raeburn) +- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h +- use NO_ERRNO_H instead of enumeration of operating systems with errno.h +- work around buggy fclose on pipes for HP/UX +- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson) +- fix configure if CC is already equal to gcc + +Changes in 1.0.5 (3 Jan 98) +- Fix inflate to terminate gracefully when fed corrupted or invalid data +- Use const for rommable constants in inflate +- Eliminate memory leaks on error conditions in inflate +- Removed some vestigial code in inflate +- Update web address in README + +Changes in 1.0.4 (24 Jul 96) +- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF + bit, so the decompressor could decompress all the correct data but went + on to attempt decompressing extra garbage data. This affected minigzip too. +- zlibVersion and gzerror return const char* (needed for DLL) +- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno) +- use z_error only for DEBUG (avoid problem with DLLs) + +Changes in 1.0.3 (2 Jul 96) +- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS + small and medium models; this makes the library incompatible with previous + versions for these models. (No effect in large model or on other systems.) +- return OK instead of BUF_ERROR if previous deflate call returned with + avail_out as zero but there is nothing to do +- added memcmp for non STDC compilers +- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly) +- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO) +- better check for 16-bit mode MSC (avoids problem with Symantec) + +Changes in 1.0.2 (23 May 96) +- added Windows DLL support +- added a function zlibVersion (for the DLL support) +- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model) +- Bytef is define's instead of typedef'd only for Borland C +- avoid reading uninitialized memory in example.c +- mention in README that the zlib format is now RFC1950 +- updated Makefile.dj2 +- added algorithm.doc + +Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion] +- fix array overlay in deflate.c which sometimes caused bad compressed data +- fix inflate bug with empty stored block +- fix MSDOS medium model which was broken in 0.99 +- fix deflateParams() which could generated bad compressed data. +- Bytef is define'd instead of typedef'ed (work around Borland bug) +- added an INDEX file +- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32), + Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas) +- speed up adler32 for modern machines without auto-increment +- added -ansi for IRIX in configure +- static_init_done in trees.c is an int +- define unlink as delete for VMS +- fix configure for QNX +- add configure branch for SCO and HPUX +- avoid many warnings (unused variables, dead assignments, etc...) +- no fdopen for BeOS +- fix the Watcom fix for 32 bit mode (define FAR as empty) +- removed redefinition of Byte for MKWERKS +- work around an MWKERKS bug (incorrect merge of all .h files) + +Changes in 0.99 (27 Jan 96) +- allow preset dictionary shared between compressor and decompressor +- allow compression level 0 (no compression) +- add deflateParams in zlib.h: allow dynamic change of compression level + and compression strategy. +- test large buffers and deflateParams in example.c +- add optional "configure" to build zlib as a shared library +- suppress Makefile.qnx, use configure instead +- fixed deflate for 64-bit systems (detected on Cray) +- fixed inflate_blocks for 64-bit systems (detected on Alpha) +- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2) +- always return Z_BUF_ERROR when deflate() has nothing to do +- deflateInit and inflateInit are now macros to allow version checking +- prefix all global functions and types with z_ with -DZ_PREFIX +- make falloc completely reentrant (inftrees.c) +- fixed very unlikely race condition in ct_static_init +- free in reverse order of allocation to help memory manager +- use zlib-1.0/* instead of zlib/* inside the tar.gz +- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith + -Wconversion -Wstrict-prototypes -Wmissing-prototypes" +- allow gzread on concatenated .gz files +- deflateEnd now returns Z_DATA_ERROR if it was premature +- deflate is finally (?) fully deterministic (no matches beyond end of input) +- Document Z_SYNC_FLUSH +- add uninstall in Makefile +- Check for __cpluplus in zlib.h +- Better test in ct_align for partial flush +- avoid harmless warnings for Borland C++ +- initialize hash_head in deflate.c +- avoid warning on fdopen (gzio.c) for HP cc -Aa +- include stdlib.h for STDC compilers +- include errno.h for Cray +- ignore error if ranlib doesn't exist +- call ranlib twice for NeXTSTEP +- use exec_prefix instead of prefix for libz.a +- renamed ct_* as _tr_* to avoid conflict with applications +- clear z->msg in inflateInit2 before any error return +- initialize opaque in example.c, gzio.c, deflate.c and inflate.c +- fixed typo in zconf.h (_GNUC__ => __GNUC__) +- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode) +- fix typo in Make_vms.com (f$trnlnm -> f$getsyi) +- in fcalloc, normalize pointer if size > 65520 bytes +- don't use special fcalloc for 32 bit Borland C++ +- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc... +- use Z_BINARY instead of BINARY +- document that gzclose after gzdopen will close the file +- allow "a" as mode in gzopen. +- fix error checking in gzread +- allow skipping .gz extra-field on pipes +- added reference to Perl interface in README +- put the crc table in FAR data (I dislike more and more the medium model :) +- added get_crc_table +- added a dimension to all arrays (Borland C can't count). +- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast +- guard against multiple inclusion of *.h (for precompiled header on Mac) +- Watcom C pretends to be Microsoft C small model even in 32 bit mode. +- don't use unsized arrays to avoid silly warnings by Visual C++: + warning C4746: 'inflate_mask' : unsized array treated as '__far' + (what's wrong with far data in far model?). +- define enum out of inflate_blocks_state to allow compilation with C++ + +Changes in 0.95 (16 Aug 95) +- fix MSDOS small and medium model (now easier to adapt to any compiler) +- inlined send_bits +- fix the final (:-) bug for deflate with flush (output was correct but + not completely flushed in rare occasions). +- default window size is same for compression and decompression + (it's now sufficient to set MAX_WBITS in zconf.h). +- voidp -> voidpf and voidnp -> voidp (for consistency with other + typedefs and because voidnp was not near in large model). + +Changes in 0.94 (13 Aug 95) +- support MSDOS medium model +- fix deflate with flush (could sometimes generate bad output) +- fix deflateReset (zlib header was incorrectly suppressed) +- added support for VMS +- allow a compression level in gzopen() +- gzflush now calls fflush +- For deflate with flush, flush even if no more input is provided. +- rename libgz.a as libz.a +- avoid complex expression in infcodes.c triggering Turbo C bug +- work around a problem with gcc on Alpha (in INSERT_STRING) +- don't use inline functions (problem with some gcc versions) +- allow renaming of Byte, uInt, etc... with #define. +- avoid warning about (unused) pointer before start of array in deflate.c +- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c +- avoid reserved word 'new' in trees.c + +Changes in 0.93 (25 June 95) +- temporarily disable inline functions +- make deflate deterministic +- give enough lookahead for PARTIAL_FLUSH +- Set binary mode for stdin/stdout in minigzip.c for OS/2 +- don't even use signed char in inflate (not portable enough) +- fix inflate memory leak for segmented architectures + +Changes in 0.92 (3 May 95) +- don't assume that char is signed (problem on SGI) +- Clear bit buffer when starting a stored block +- no memcpy on Pyramid +- suppressed inftest.c +- optimized fill_window, put longest_match inline for gcc +- optimized inflate on stored blocks. +- untabify all sources to simplify patches + +Changes in 0.91 (2 May 95) +- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h +- Document the memory requirements in zconf.h +- added "make install" +- fix sync search logic in inflateSync +- deflate(Z_FULL_FLUSH) now works even if output buffer too short +- after inflateSync, don't scare people with just "lo world" +- added support for DJGPP + +Changes in 0.9 (1 May 95) +- don't assume that zalloc clears the allocated memory (the TurboC bug + was Mark's bug after all :) +- let again gzread copy uncompressed data unchanged (was working in 0.71) +- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented +- added a test of inflateSync in example.c +- moved MAX_WBITS to zconf.h because users might want to change that. +- document explicitly that zalloc(64K) on MSDOS must return a normalized + pointer (zero offset) +- added Makefiles for Microsoft C, Turbo C, Borland C++ +- faster crc32() + +Changes in 0.8 (29 April 95) +- added fast inflate (inffast.c) +- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this + is incompatible with previous versions of zlib which returned Z_OK. +- work around a TurboC compiler bug (bad code for b << 0, see infutil.h) + (actually that was not a compiler bug, see 0.81 above) +- gzread no longer reads one extra byte in certain cases +- In gzio destroy(), don't reference a freed structure +- avoid many warnings for MSDOS +- avoid the ERROR symbol which is used by MS Windows + +Changes in 0.71 (14 April 95) +- Fixed more MSDOS compilation problems :( There is still a bug with + TurboC large model. + +Changes in 0.7 (14 April 95) +- Added full inflate support. +- Simplified the crc32() interface. The pre- and post-conditioning + (one's complement) is now done inside crc32(). WARNING: this is + incompatible with previous versions; see zlib.h for the new usage. + +Changes in 0.61 (12 April 95) +- workaround for a bug in TurboC. example and minigzip now work on MSDOS. + +Changes in 0.6 (11 April 95) +- added minigzip.c +- added gzdopen to reopen a file descriptor as gzFile +- added transparent reading of non-gziped files in gzread. +- fixed bug in gzread (don't read crc as data) +- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose). +- don't allocate big arrays in the stack (for MSDOS) +- fix some MSDOS compilation problems + +Changes in 0.5: +- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but + not yet Z_FULL_FLUSH. +- support decompression but only in a single step (forced Z_FINISH) +- added opaque object for zalloc and zfree. +- added deflateReset and inflateReset +- added a variable zlib_version for consistency checking. +- renamed the 'filter' parameter of deflateInit2 as 'strategy'. + Added Z_FILTERED and Z_HUFFMAN_ONLY constants. + +Changes in 0.4: +- avoid "zip" everywhere, use zlib instead of ziplib. +- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush + if compression method == 8. +- added adler32 and crc32 +- renamed deflateOptions as deflateInit2, call one or the other but not both +- added the method parameter for deflateInit2. +- added inflateInit2 +- simplied considerably deflateInit and inflateInit by not supporting + user-provided history buffer. This is supported only in deflateInit2 + and inflateInit2. + +Changes in 0.3: +- prefix all macro names with Z_ +- use Z_FINISH instead of deflateEnd to finish compression. +- added Z_HUFFMAN_ONLY +- added gzerror() diff --git a/third_party/windows/fltk-1.1.10/zlib/FAQ b/third_party/windows/fltk-1.1.10/zlib/FAQ new file mode 100644 index 0000000..15d0436 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/FAQ @@ -0,0 +1,339 @@ + + Frequently Asked Questions about zlib + + +If your question is not there, please check the zlib home page +http://www.zlib.org which may have more recent information. +The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html + + + 1. Is zlib Y2K-compliant? + + Yes. zlib doesn't handle dates. + + 2. Where can I get a Windows DLL version? + + The zlib sources can be compiled without change to produce a DLL. + See the file win32/DLL_FAQ.txt in the zlib distribution. + Pointers to the precompiled DLL are found in the zlib web site at + http://www.zlib.org. + + 3. Where can I get a Visual Basic interface to zlib? + + See + * http://www.dogma.net/markn/articles/zlibtool/zlibtool.htm + * contrib/visual-basic.txt in the zlib distribution + * win32/DLL_FAQ.txt in the zlib distribution + + 4. compress() returns Z_BUF_ERROR. + + Make sure that before the call of compress, the length of the compressed + buffer is equal to the total size of the compressed buffer and not + zero. For Visual Basic, check that this parameter is passed by reference + ("as any"), not by value ("as long"). + + 5. deflate() or inflate() returns Z_BUF_ERROR. + + Before making the call, make sure that avail_in and avail_out are not + zero. When setting the parameter flush equal to Z_FINISH, also make sure + that avail_out is big enough to allow processing all pending input. + Note that a Z_BUF_ERROR is not fatal--another call to deflate() or + inflate() can be made with more input or output space. A Z_BUF_ERROR + may in fact be unavoidable depending on how the functions are used, since + it is not possible to tell whether or not there is more output pending + when strm.avail_out returns with zero. + + 6. Where's the zlib documentation (man pages, etc.)? + + It's in zlib.h for the moment, and Francis S. Lin has converted it to a + web page zlib.html. Volunteers to transform this to Unix-style man pages, + please contact us (zlib@gzip.org). Examples of zlib usage are in the files + example.c and minigzip.c. + + 7. Why don't you use GNU autoconf or libtool or ...? + + Because we would like to keep zlib as a very small and simple + package. zlib is rather portable and doesn't need much configuration. + + 8. I found a bug in zlib. + + Most of the time, such problems are due to an incorrect usage of + zlib. Please try to reproduce the problem with a small program and send + the corresponding source to us at zlib@gzip.org . Do not send + multi-megabyte data files without prior agreement. + + 9. Why do I get "undefined reference to gzputc"? + + If "make test" produces something like + + example.o(.text+0x154): undefined reference to `gzputc' + + check that you don't have old files libz.* in /usr/lib, /usr/local/lib or + /usr/X11R6/lib. Remove any old versions, then do "make install". + +10. I need a Delphi interface to zlib. + + See the contrib/delphi directory in the zlib distribution. + +11. Can zlib handle .zip archives? + + Not by itself, no. See the directory contrib/minizip in the zlib + distribution. + +12. Can zlib handle .Z files? + + No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt + the code of uncompress on your own. + +13. How can I make a Unix shared library? + + make clean + ./configure -s + make + +14. How do I install a shared zlib library on Unix? + + After the above, then: + + make install + + However, many flavors of Unix come with a shared zlib already installed. + Before going to the trouble of compiling a shared version of zlib and + trying to install it, you may want to check if it's already there! If you + can #include , it's there. The -lz option will probably link to it. + +15. I have a question about OttoPDF. + + We are not the authors of OttoPDF. The real author is on the OttoPDF web + site: Joel Hainley, jhainley@myndkryme.com. + +16. Can zlib decode Flate data in an Adobe PDF file? + + Yes. See http://www.fastio.com/ (ClibPDF), or http://www.pdflib.com/ . + To modify PDF forms, see http://sourceforge.net/projects/acroformtool/ . + +17. Why am I getting this "register_frame_info not found" error on Solaris? + + After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib + generates an error such as: + + ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so: + symbol __register_frame_info: referenced symbol not found + + The symbol __register_frame_info is not part of zlib, it is generated by + the C compiler (cc or gcc). You must recompile applications using zlib + which have this problem. This problem is specific to Solaris. See + http://www.sunfreeware.com for Solaris versions of zlib and applications + using zlib. + +18. Why does gzip give an error on a file I make with compress/deflate? + + The compress and deflate functions produce data in the zlib format, which + is different and incompatible with the gzip format. The gz* functions in + zlib on the other hand use the gzip format. Both the zlib and gzip + formats use the same compressed data format internally, but have different + headers and trailers around the compressed data. + +19. Ok, so why are there two different formats? + + The gzip format was designed to retain the directory information about + a single file, such as the name and last modification date. The zlib + format on the other hand was designed for in-memory and communication + channel applications, and has a much more compact header and trailer and + uses a faster integrity check than gzip. + +20. Well that's nice, but how do I make a gzip file in memory? + + You can request that deflate write the gzip format instead of the zlib + format using deflateInit2(). You can also request that inflate decode + the gzip format using inflateInit2(). Read zlib.h for more details. + +21. Is zlib thread-safe? + + Yes. However any library routines that zlib uses and any application- + provided memory allocation routines must also be thread-safe. zlib's gz* + functions use stdio library routines, and most of zlib's functions use the + library memory allocation routines by default. zlib's Init functions allow + for the application to provide custom memory allocation routines. + + Of course, you should only operate on any given zlib or gzip stream from a + single thread at a time. + +22. Can I use zlib in my commercial application? + + Yes. Please read the license in zlib.h. + +23. Is zlib under the GNU license? + + No. Please read the license in zlib.h. + +24. The license says that altered source versions must be "plainly marked". So + what exactly do I need to do to meet that requirement? + + You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In + particular, the final version number needs to be changed to "f", and an + identification string should be appended to ZLIB_VERSION. Version numbers + x.x.x.f are reserved for modifications to zlib by others than the zlib + maintainers. For example, if the version of the base zlib you are altering + is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and + ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also + update the version strings in deflate.c and inftrees.c. + + For altered source distributions, you should also note the origin and + nature of the changes in zlib.h, as well as in ChangeLog and README, along + with the dates of the alterations. The origin should include at least your + name (or your company's name), and an email address to contact for help or + issues with the library. + + Note that distributing a compiled zlib library along with zlib.h and + zconf.h is also a source distribution, and so you should change + ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes + in zlib.h as you would for a full source distribution. + +25. Will zlib work on a big-endian or little-endian architecture, and can I + exchange compressed data between them? + + Yes and yes. + +26. Will zlib work on a 64-bit machine? + + It should. It has been tested on 64-bit machines, and has no dependence + on any data types being limited to 32-bits in length. If you have any + difficulties, please provide a complete problem report to zlib@gzip.org + +27. Will zlib decompress data from the PKWare Data Compression Library? + + No. The PKWare DCL uses a completely different compressed data format + than does PKZIP and zlib. However, you can look in zlib's contrib/blast + directory for a possible solution to your problem. + +28. Can I access data randomly in a compressed stream? + + No, not without some preparation. If when compressing you periodically + use Z_FULL_FLUSH, carefully write all the pending data at those points, + and keep an index of those locations, then you can start decompression + at those points. You have to be careful to not use Z_FULL_FLUSH too + often, since it can significantly degrade compression. + +29. Does zlib work on MVS, OS/390, CICS, etc.? + + We don't know for sure. We have heard occasional reports of success on + these systems. If you do use it on one of these, please provide us with + a report, instructions, and patches that we can reference when we get + these questions. Thanks. + +30. Is there some simpler, easier to read version of inflate I can look at + to understand the deflate format? + + First off, you should read RFC 1951. Second, yes. Look in zlib's + contrib/puff directory. + +31. Does zlib infringe on any patents? + + As far as we know, no. In fact, that was originally the whole point behind + zlib. Look here for some more information: + + http://www.gzip.org/#faq11 + +32. Can zlib work with greater than 4 GB of data? + + Yes. inflate() and deflate() will process any amount of data correctly. + Each call of inflate() or deflate() is limited to input and output chunks + of the maximum value that can be stored in the compiler's "unsigned int" + type, but there is no limit to the number of chunks. Note however that the + strm.total_in and strm_total_out counters may be limited to 4 GB. These + counters are provided as a convenience and are not used internally by + inflate() or deflate(). The application can easily set up its own counters + updated after each call of inflate() or deflate() to count beyond 4 GB. + compress() and uncompress() may be limited to 4 GB, since they operate in a + single call. gzseek() and gztell() may be limited to 4 GB depending on how + zlib is compiled. See the zlibCompileFlags() function in zlib.h. + + The word "may" appears several times above since there is a 4 GB limit + only if the compiler's "long" type is 32 bits. If the compiler's "long" + type is 64 bits, then the limit is 16 exabytes. + +33. Does zlib have any security vulnerabilities? + + The only one that we are aware of is potentially in gzprintf(). If zlib + is compiled to use sprintf() or vsprintf(), then there is no protection + against a buffer overflow of a 4K string space, other than the caller of + gzprintf() assuring that the output will not exceed 4K. On the other + hand, if zlib is compiled to use snprintf() or vsnprintf(), which should + normally be the case, then there is no vulnerability. The ./configure + script will display warnings if an insecure variation of sprintf() will + be used by gzprintf(). Also the zlibCompileFlags() function will return + information on what variant of sprintf() is used by gzprintf(). + + If you don't have snprintf() or vsnprintf() and would like one, you can + find a portable implementation here: + + http://www.ijs.si/software/snprintf/ + + Note that you should be using the most recent version of zlib. Versions + 1.1.3 and before were subject to a double-free vulnerability. + +34. Is there a Java version of zlib? + + Probably what you want is to use zlib in Java. zlib is already included + as part of the Java SDK in the java.util.zip package. If you really want + a version of zlib written in the Java language, look on the zlib home + page for links: http://www.zlib.org/ + +35. I get this or that compiler or source-code scanner warning when I crank it + up to maximally-pedantic. Can't you guys write proper code? + + Many years ago, we gave up attempting to avoid warnings on every compiler + in the universe. It just got to be a waste of time, and some compilers + were downright silly. So now, we simply make sure that the code always + works. + +36. Valgrind (or some similar memory access checker) says that deflate is + performing a conditional jump that depends on an uninitialized value. + Isn't that a bug? + + No. That is intentional for performance reasons, and the output of + deflate is not affected. This only started showing up recently since + zlib 1.2.x uses malloc() by default for allocations, whereas earlier + versions used calloc(), which zeros out the allocated memory. + +37. Will zlib read the (insert any ancient or arcane format here) compressed + data format? + + Probably not. Look in the comp.compression FAQ for pointers to various + formats and associated software. + +38. How can I encrypt/decrypt zip files with zlib? + + zlib doesn't support encryption. The original PKZIP encryption is very weak + and can be broken with freely available programs. To get strong encryption, + use GnuPG, http://www.gnupg.org/ , which already includes zlib compression. + For PKZIP compatible "encryption", look at http://www.info-zip.org/ + +39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings? + + "gzip" is the gzip format, and "deflate" is the zlib format. They should + probably have called the second one "zlib" instead to avoid confusion + with the raw deflate compressed data format. While the HTTP 1.1 RFC 2616 + correctly points to the zlib specification in RFC 1950 for the "deflate" + transfer encoding, there have been reports of servers and browsers that + incorrectly produce or expect raw deflate data per the deflate + specficiation in RFC 1951, most notably Microsoft. So even though the + "deflate" transfer encoding using the zlib format would be the more + efficient approach (and in fact exactly what the zlib format was designed + for), using the "gzip" transfer encoding is probably more reliable due to + an unfortunate choice of name on the part of the HTTP 1.1 authors. + + Bottom line: use the gzip format for HTTP 1.1 encoding. + +40. Does zlib support the new "Deflate64" format introduced by PKWare? + + No. PKWare has apparently decided to keep that format proprietary, since + they have not documented it as they have previous compression formats. + In any case, the compression improvements are so modest compared to other + more modern approaches, that it's not worth the effort to implement. + +41. Can you please sign these lengthy legal documents and fax them back to us + so that we can use your software in our product? + + No. Go away. Shoo. diff --git a/third_party/windows/fltk-1.1.10/zlib/INDEX b/third_party/windows/fltk-1.1.10/zlib/INDEX new file mode 100644 index 0000000..4d7eac4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/INDEX @@ -0,0 +1,51 @@ +ChangeLog history of changes +FAQ Frequently Asked Questions about zlib +INDEX this file +Makefile makefile for Unix (generated by configure) +Makefile.in makefile for Unix (template for configure) +README guess what +algorithm.txt description of the (de)compression algorithm +configure configure script for Unix +zconf.in.h template for zconf.h (used by configure) + +amiga/ makefiles for Amiga SAS C +as400/ makefiles for IBM AS/400 +msdos/ makefiles for MSDOS +old/ makefiles for various architectures and zlib documentation + files that have not yet been updated for zlib 1.2.x +projects/ projects for various Integrated Development Environments +qnx/ makefiles for QNX +win32/ makefiles for Windows + + zlib public header files (must be kept): +zconf.h +zlib.h + + private source files used to build the zlib library: +adler32.c +compress.c +crc32.c +crc32.h +deflate.c +deflate.h +gzio.c +infback.c +inffast.c +inffast.h +inffixed.h +inflate.c +inflate.h +inftrees.c +inftrees.h +trees.c +trees.h +uncompr.c +zutil.c +zutil.h + + source files for sample programs: +example.c +minigzip.c + + unsupported contribution by third parties +See contrib/README.contrib diff --git a/third_party/windows/fltk-1.1.10/zlib/Makefile b/third_party/windows/fltk-1.1.10/zlib/Makefile new file mode 100644 index 0000000..185fb91 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/Makefile @@ -0,0 +1,108 @@ +# +# "$Id: Makefile 5667 2007-02-07 02:35:44Z mike $" +# +# GNU ZIP library makefile for the Fast Light Toolkit (FLTK). +# +# Copyright 1997-2007 by Easy Software Products. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems to "fltk-bugs@fltk.org". +# + +include ../makeinclude + + +# +# Object files... +# + +OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o \ + trees.o zutil.o inflate.o inftrees.o inffast.o + +LIBZ = ../lib/libfltk_z$(LIBEXT) + + +# +# Make all targets... +# + +all: $(LIBZ) + + +# +# Clean all targets and object files... +# + +clean: + $(RM) $(OBJS) + $(RM) $(LIBZ) + + +# +# Install everything... +# + +install: $(LIBZ) + echo "Installing libfltk_z$(LIBEXT) in $(libdir)..." + -$(INSTALL_DIR) $(DESTDIR)$(libdir) + $(INSTALL_LIB) $(LIBZ) $(DESTDIR)$(libdir) + $(RANLIB) $(DESTDIR)$(libdir)/libfltk_z$(LIBEXT) + echo "Installing zlib headers in $(includedir)/FL/images..." + -$(INSTALL_DIR) $(DESTDIR)$(includedir)/FL/images + $(INSTALL_DATA) zconf.h $(DESTDIR)$(includedir)/FL/images + $(INSTALL_DATA) zlib.h $(DESTDIR)$(includedir)/FL/images + $(INSTALL_DATA) zutil.h $(DESTDIR)$(includedir)/FL/images + + +# +# Uninstall everything... +# + +uninstall: + echo "Uninstalling libfltk_z$(LIBEXT) in $(libdir)..." + $(RM) $(libdir)/libfltk_z$(LIBEXT) + echo "Uninstalling zlib headers in $(includedir)/FL/images..." + $(RM) $(includedir)/FL/images/zconf.h + $(RM) $(includedir)/FL/images/zlib.h + $(RM) $(includedir)/FL/images/zutil.h + + +# +# libfltk_z.a +# + +$(LIBZ): $(OBJS) + echo Archiving $@... + $(RM) $@ + $(LIBCOMMAND) $@ $(OBJS) + $(RANLIB) $@ + +# +# Make dependencies... +# + +depend: $(OBJS:.o=.c) + makedepend -Y -I.. -f makedepend $(OBJS:.o=.c) + +include makedepend + +$(OBJS): ../makeinclude + + +# +# End of "$Id: Makefile 5667 2007-02-07 02:35:44Z mike $". +# diff --git a/third_party/windows/fltk-1.1.10/zlib/README b/third_party/windows/fltk-1.1.10/zlib/README new file mode 100644 index 0000000..80f71ae --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/README @@ -0,0 +1,125 @@ +ZLIB DATA COMPRESSION LIBRARY + +zlib 1.2.3 is a general purpose data compression library. All the code is +thread safe. The data format used by the zlib library is described by RFCs +(Request for Comments) 1950 to 1952 in the files +http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) +and rfc1952.txt (gzip format). These documents are also available in other +formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html + +All functions of the compression library are documented in the file zlib.h +(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example +of the library is given in the file example.c which also tests that the library +is working correctly. Another example is given in the file minigzip.c. The +compression library itself is composed of all source files except example.c and +minigzip.c. + +To compile all files and run the test program, follow the instructions given at +the top of Makefile. In short "make test; make install" should work for most +machines. For Unix: "./configure; make test; make install". For MSDOS, use one +of the special makefiles such as Makefile.msc. For VMS, use make_vms.com. + +Questions about zlib should be sent to , or to Gilles Vollant + for the Windows DLL version. The zlib home page is +http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem, +please check this site to verify that you have the latest version of zlib; +otherwise get the latest version and check whether the problem still exists or +not. + +PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking +for help. + +Mark Nelson wrote an article about zlib for the Jan. 1997 +issue of Dr. Dobb's Journal; a copy of the article is available in +http://dogma.net/markn/articles/zlibtool/zlibtool.htm + +The changes made in version 1.2.3 are documented in the file ChangeLog. + +Unsupported third party contributions are provided in directory "contrib". + +A Java implementation of zlib is available in the Java Development Kit +http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html +See the zlib home page http://www.zlib.org for details. + +A Perl interface to zlib written by Paul Marquess is in the +CPAN (Comprehensive Perl Archive Network) sites +http://www.cpan.org/modules/by-module/Compress/ + +A Python interface to zlib written by A.M. Kuchling is +available in Python 1.5 and later versions, see +http://www.python.org/doc/lib/module-zlib.html + +A zlib binding for TCL written by Andreas Kupries is +availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html + +An experimental package to read and write files in .zip format, written on top +of zlib by Gilles Vollant , is available in the +contrib/minizip directory of zlib. + + +Notes for some targets: + +- For Windows DLL versions, please see win32/DLL_FAQ.txt + +- For 64-bit Irix, deflate.c must be compiled without any optimization. With + -O, one libpng test fails. The test works in 32 bit mode (with the -n32 + compiler flag). The compiler bug has been reported to SGI. + +- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works + when compiled with cc. + +- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is + necessary to get gzprintf working correctly. This is done by configure. + +- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with + other compilers. Use "make test" to check your compiler. + +- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers. + +- For PalmOs, see http://palmzlib.sourceforge.net/ + +- When building a shared, i.e. dynamic library on Mac OS X, the library must be + installed before testing (do "make install" before "make test"), since the + library location is specified in the library. + + +Acknowledgments: + + The deflate format used by zlib was defined by Phil Katz. The deflate + and zlib specifications were written by L. Peter Deutsch. Thanks to all the + people who reported problems and suggested various improvements in zlib; + they are too numerous to cite here. + +Copyright notice: + + (C) 1995-2004 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* +receiving lengthy legal documents to sign. The sources are provided +for free but without warranty of any kind. The library has been +entirely written by Jean-loup Gailly and Mark Adler; it does not +include third-party code. + +If you redistribute modified sources, we would appreciate that you include +in the file ChangeLog history information documenting your changes. Please +read the FAQ for more information on the distribution of modified source +versions. diff --git a/third_party/windows/fltk-1.1.10/zlib/adler32.c b/third_party/windows/fltk-1.1.10/zlib/adler32.c new file mode 100644 index 0000000..22334bb --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/adler32.c @@ -0,0 +1,149 @@ +/* adler32.c -- compute the Adler-32 checksum of a data stream + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: adler32.c 5666 2007-02-06 22:02:28Z mike $ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +#define BASE 65521UL /* largest prime smaller than 65536 */ +#define NMAX 5552 +/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ + +#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} +#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); +#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); +#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); +#define DO16(buf) DO8(buf,0); DO8(buf,8); + +/* use NO_DIVIDE if your processor does not do division in hardware */ +#ifdef NO_DIVIDE +# define MOD(a) \ + do { \ + if (a >= (BASE << 16)) a -= (BASE << 16); \ + if (a >= (BASE << 15)) a -= (BASE << 15); \ + if (a >= (BASE << 14)) a -= (BASE << 14); \ + if (a >= (BASE << 13)) a -= (BASE << 13); \ + if (a >= (BASE << 12)) a -= (BASE << 12); \ + if (a >= (BASE << 11)) a -= (BASE << 11); \ + if (a >= (BASE << 10)) a -= (BASE << 10); \ + if (a >= (BASE << 9)) a -= (BASE << 9); \ + if (a >= (BASE << 8)) a -= (BASE << 8); \ + if (a >= (BASE << 7)) a -= (BASE << 7); \ + if (a >= (BASE << 6)) a -= (BASE << 6); \ + if (a >= (BASE << 5)) a -= (BASE << 5); \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +# define MOD4(a) \ + do { \ + if (a >= (BASE << 4)) a -= (BASE << 4); \ + if (a >= (BASE << 3)) a -= (BASE << 3); \ + if (a >= (BASE << 2)) a -= (BASE << 2); \ + if (a >= (BASE << 1)) a -= (BASE << 1); \ + if (a >= BASE) a -= BASE; \ + } while (0) +#else +# define MOD(a) a %= BASE +# define MOD4(a) a %= BASE +#endif + +/* ========================================================================= */ +uLong ZEXPORT adler32(adler, buf, len) + uLong adler; + const Bytef *buf; + uInt len; +{ + unsigned long sum2; + unsigned n; + + /* split Adler-32 into component sums */ + sum2 = (adler >> 16) & 0xffff; + adler &= 0xffff; + + /* in case user likes doing a byte at a time, keep it fast */ + if (len == 1) { + adler += buf[0]; + if (adler >= BASE) + adler -= BASE; + sum2 += adler; + if (sum2 >= BASE) + sum2 -= BASE; + return adler | (sum2 << 16); + } + + /* initial Adler-32 value (deferred check for len == 1 speed) */ + if (buf == Z_NULL) + return 1L; + + /* in case short lengths are provided, keep it somewhat fast */ + if (len < 16) { + while (len--) { + adler += *buf++; + sum2 += adler; + } + if (adler >= BASE) + adler -= BASE; + MOD4(sum2); /* only added so many BASE's */ + return adler | (sum2 << 16); + } + + /* do length NMAX blocks -- requires just one modulo operation */ + while (len >= NMAX) { + len -= NMAX; + n = NMAX / 16; /* NMAX is divisible by 16 */ + do { + DO16(buf); /* 16 sums unrolled */ + buf += 16; + } while (--n); + MOD(adler); + MOD(sum2); + } + + /* do remaining bytes (less than NMAX, still just one modulo) */ + if (len) { /* avoid modulos if none remaining */ + while (len >= 16) { + len -= 16; + DO16(buf); + buf += 16; + } + while (len--) { + adler += *buf++; + sum2 += adler; + } + MOD(adler); + MOD(sum2); + } + + /* return recombined sums */ + return adler | (sum2 << 16); +} + +/* ========================================================================= */ +uLong ZEXPORT adler32_combine(adler1, adler2, len2) + uLong adler1; + uLong adler2; + z_off_t len2; +{ + unsigned long sum1; + unsigned long sum2; + unsigned rem; + + /* the derivation of this formula is left as an exercise for the reader */ + rem = (unsigned)(len2 % BASE); + sum1 = adler1 & 0xffff; + sum2 = rem * sum1; + MOD(sum2); + sum1 += (adler2 & 0xffff) + BASE - 1; + sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; + if (sum1 > BASE) sum1 -= BASE; + if (sum1 > BASE) sum1 -= BASE; + if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); + if (sum2 > BASE) sum2 -= BASE; + return sum1 | (sum2 << 16); +} diff --git a/third_party/windows/fltk-1.1.10/zlib/algorithm.txt b/third_party/windows/fltk-1.1.10/zlib/algorithm.txt new file mode 100644 index 0000000..9f6b068 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/algorithm.txt @@ -0,0 +1,209 @@ +1. Compression algorithm (deflate) + +The deflation algorithm used by gzip (also zip and zlib) is a variation of +LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in +the input data. The second occurrence of a string is replaced by a +pointer to the previous string, in the form of a pair (distance, +length). Distances are limited to 32K bytes, and lengths are limited +to 258 bytes. When a string does not occur anywhere in the previous +32K bytes, it is emitted as a sequence of literal bytes. (In this +description, `string' must be taken as an arbitrary sequence of bytes, +and is not restricted to printable characters.) + +Literals or match lengths are compressed with one Huffman tree, and +match distances are compressed with another tree. The trees are stored +in a compact form at the start of each block. The blocks can have any +size (except that the compressed data for one block must fit in +available memory). A block is terminated when deflate() determines that +it would be useful to start another block with fresh trees. (This is +somewhat similar to the behavior of LZW-based _compress_.) + +Duplicated strings are found using a hash table. All input strings of +length 3 are inserted in the hash table. A hash index is computed for +the next 3 bytes. If the hash chain for this index is not empty, all +strings in the chain are compared with the current input string, and +the longest match is selected. + +The hash chains are searched starting with the most recent strings, to +favor small distances and thus take advantage of the Huffman encoding. +The hash chains are singly linked. There are no deletions from the +hash chains, the algorithm simply discards matches that are too old. + +To avoid a worst-case situation, very long hash chains are arbitrarily +truncated at a certain length, determined by a runtime option (level +parameter of deflateInit). So deflate() does not always find the longest +possible match but generally finds a match which is long enough. + +deflate() also defers the selection of matches with a lazy evaluation +mechanism. After a match of length N has been found, deflate() searches for +a longer match at the next input byte. If a longer match is found, the +previous match is truncated to a length of one (thus producing a single +literal byte) and the process of lazy evaluation begins again. Otherwise, +the original match is kept, and the next match search is attempted only N +steps later. + +The lazy match evaluation is also subject to a runtime parameter. If +the current match is long enough, deflate() reduces the search for a longer +match, thus speeding up the whole process. If compression ratio is more +important than speed, deflate() attempts a complete second search even if +the first match is already long enough. + +The lazy match evaluation is not performed for the fastest compression +modes (level parameter 1 to 3). For these fast modes, new strings +are inserted in the hash table only when no match was found, or +when the match is not too long. This degrades the compression ratio +but saves time since there are both fewer insertions and fewer searches. + + +2. Decompression algorithm (inflate) + +2.1 Introduction + +The key question is how to represent a Huffman code (or any prefix code) so +that you can decode fast. The most important characteristic is that shorter +codes are much more common than longer codes, so pay attention to decoding the +short codes fast, and let the long codes take longer to decode. + +inflate() sets up a first level table that covers some number of bits of +input less than the length of longest code. It gets that many bits from the +stream, and looks it up in the table. The table will tell if the next +code is that many bits or less and how many, and if it is, it will tell +the value, else it will point to the next level table for which inflate() +grabs more bits and tries to decode a longer code. + +How many bits to make the first lookup is a tradeoff between the time it +takes to decode and the time it takes to build the table. If building the +table took no time (and if you had infinite memory), then there would only +be a first level table to cover all the way to the longest code. However, +building the table ends up taking a lot longer for more bits since short +codes are replicated many times in such a table. What inflate() does is +simply to make the number of bits in the first table a variable, and then +to set that variable for the maximum speed. + +For inflate, which has 286 possible codes for the literal/length tree, the size +of the first table is nine bits. Also the distance trees have 30 possible +values, and the size of the first table is six bits. Note that for each of +those cases, the table ended up one bit longer than the ``average'' code +length, i.e. the code length of an approximately flat code which would be a +little more than eight bits for 286 symbols and a little less than five bits +for 30 symbols. + + +2.2 More details on the inflate table lookup + +Ok, you want to know what this cleverly obfuscated inflate tree actually +looks like. You are correct that it's not a Huffman tree. It is simply a +lookup table for the first, let's say, nine bits of a Huffman symbol. The +symbol could be as short as one bit or as long as 15 bits. If a particular +symbol is shorter than nine bits, then that symbol's translation is duplicated +in all those entries that start with that symbol's bits. For example, if the +symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a +symbol is nine bits long, it appears in the table once. + +If the symbol is longer than nine bits, then that entry in the table points +to another similar table for the remaining bits. Again, there are duplicated +entries as needed. The idea is that most of the time the symbol will be short +and there will only be one table look up. (That's whole idea behind data +compression in the first place.) For the less frequent long symbols, there +will be two lookups. If you had a compression method with really long +symbols, you could have as many levels of lookups as is efficient. For +inflate, two is enough. + +So a table entry either points to another table (in which case nine bits in +the above example are gobbled), or it contains the translation for the symbol +and the number of bits to gobble. Then you start again with the next +ungobbled bit. + +You may wonder: why not just have one lookup table for how ever many bits the +longest symbol is? The reason is that if you do that, you end up spending +more time filling in duplicate symbol entries than you do actually decoding. +At least for deflate's output that generates new trees every several 10's of +kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code +would take too long if you're only decoding several thousand symbols. At the +other extreme, you could make a new table for every bit in the code. In fact, +that's essentially a Huffman tree. But then you spend two much time +traversing the tree while decoding, even for short symbols. + +So the number of bits for the first lookup table is a trade of the time to +fill out the table vs. the time spent looking at the second level and above of +the table. + +Here is an example, scaled down: + +The code being decoded, with 10 symbols, from 1 to 6 bits long: + +A: 0 +B: 10 +C: 1100 +D: 11010 +E: 11011 +F: 11100 +G: 11101 +H: 11110 +I: 111110 +J: 111111 + +Let's make the first table three bits long (eight entries): + +000: A,1 +001: A,1 +010: A,1 +011: A,1 +100: B,2 +101: B,2 +110: -> table X (gobble 3 bits) +111: -> table Y (gobble 3 bits) + +Each entry is what the bits decode as and how many bits that is, i.e. how +many bits to gobble. Or the entry points to another table, with the number of +bits to gobble implicit in the size of the table. + +Table X is two bits long since the longest code starting with 110 is five bits +long: + +00: C,1 +01: C,1 +10: D,2 +11: E,2 + +Table Y is three bits long since the longest code starting with 111 is six +bits long: + +000: F,2 +001: F,2 +010: G,2 +011: G,2 +100: H,2 +101: H,2 +110: I,3 +111: J,3 + +So what we have here are three tables with a total of 20 entries that had to +be constructed. That's compared to 64 entries for a single table. Or +compared to 16 entries for a Huffman tree (six two entry tables and one four +entry table). Assuming that the code ideally represents the probability of +the symbols, it takes on the average 1.25 lookups per symbol. That's compared +to one lookup for the single table, or 1.66 lookups per symbol for the +Huffman tree. + +There, I think that gives you a picture of what's going on. For inflate, the +meaning of a particular symbol is often more than just a letter. It can be a +byte (a "literal"), or it can be either a length or a distance which +indicates a base value and a number of bits to fetch after the code that is +added to the base value. Or it might be the special end-of-block code. The +data structures created in inftrees.c try to encode all that information +compactly in the tables. + + +Jean-loup Gailly Mark Adler +jloup@gzip.org madler@alumni.caltech.edu + + +References: + +[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data +Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, +pp. 337-343. + +``DEFLATE Compressed Data Format Specification'' available in +http://www.ietf.org/rfc/rfc1951.txt diff --git a/third_party/windows/fltk-1.1.10/zlib/compress.c b/third_party/windows/fltk-1.1.10/zlib/compress.c new file mode 100644 index 0000000..fbd2710 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/compress.c @@ -0,0 +1,79 @@ +/* compress.c -- compress a memory buffer + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: compress.c 5666 2007-02-06 22:02:28Z mike $ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least 0.1% larger than sourceLen plus + 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ +int ZEXPORT compress2 (dest, destLen, source, sourceLen, level) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; + int level; +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; +#ifdef MAXSEG_64K + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; +#endif + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + stream.opaque = (voidpf)0; + + err = deflateInit(&stream, level); + if (err != Z_OK) return err; + + err = deflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + deflateEnd(&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; + + err = deflateEnd(&stream); + return err; +} + +/* =========================================================================== + */ +int ZEXPORT compress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); +} + +/* =========================================================================== + If the default memLevel or windowBits for deflateInit() is changed, then + this function needs to be updated. + */ +uLong ZEXPORT compressBound (sourceLen) + uLong sourceLen; +{ + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; +} diff --git a/third_party/windows/fltk-1.1.10/zlib/crc32.c b/third_party/windows/fltk-1.1.10/zlib/crc32.c new file mode 100644 index 0000000..bb5de94 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/crc32.c @@ -0,0 +1,423 @@ +/* crc32.c -- compute the CRC-32 of a data stream + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Thanks to Rodney Brown for his contribution of faster + * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing + * tables for updating the shift register in one step with three exclusive-ors + * instead of four steps with four exclusive-ors. This results in about a + * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. + */ + +/* @(#) $Id: crc32.c 5666 2007-02-06 22:02:28Z mike $ */ + +/* + Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore + protection on the static variables used to control the first-use generation + of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should + first call get_crc_table() to initialize the tables before allowing more than + one thread to use crc32(). + */ + +#ifdef MAKECRCH +# include +# ifndef DYNAMIC_CRC_TABLE +# define DYNAMIC_CRC_TABLE +# endif /* !DYNAMIC_CRC_TABLE */ +#endif /* MAKECRCH */ + +#include "zutil.h" /* for STDC and FAR definitions */ + +#define local static + +/* Find a four-byte integer type for crc32_little() and crc32_big(). */ +#ifndef NOBYFOUR +# ifdef STDC /* need ANSI C limits.h to determine sizes */ +# include +# define BYFOUR +# if (UINT_MAX == 0xffffffffUL) + typedef unsigned int u4; +# else +# if (ULONG_MAX == 0xffffffffUL) + typedef unsigned long u4; +# else +# if (USHRT_MAX == 0xffffffffUL) + typedef unsigned short u4; +# else +# undef BYFOUR /* can't find a four-byte integer type! */ +# endif +# endif +# endif +# endif /* STDC */ +#endif /* !NOBYFOUR */ + +/* Definitions for doing the crc four data bytes at a time. */ +#ifdef BYFOUR +# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ + (((w)&0xff00)<<8)+(((w)&0xff)<<24)) + local unsigned long crc32_little OF((unsigned long, + const unsigned char FAR *, unsigned)); + local unsigned long crc32_big OF((unsigned long, + const unsigned char FAR *, unsigned)); +# define TBLS 8 +#else +# define TBLS 1 +#endif /* BYFOUR */ + +/* Local functions for crc concatenation */ +local unsigned long gf2_matrix_times OF((unsigned long *mat, + unsigned long vec)); +local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); + +#ifdef DYNAMIC_CRC_TABLE + +local volatile int crc_table_empty = 1; +local unsigned long FAR crc_table[TBLS][256]; +local void make_crc_table OF((void)); +#ifdef MAKECRCH + local void write_table OF((FILE *, const unsigned long FAR *)); +#endif /* MAKECRCH */ +/* + Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: + x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. + + Polynomials over GF(2) are represented in binary, one bit per coefficient, + with the lowest powers in the most significant bit. Then adding polynomials + is just exclusive-or, and multiplying a polynomial by x is a right shift by + one. If we call the above polynomial p, and represent a byte as the + polynomial q, also with the lowest power in the most significant bit (so the + byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, + where a mod b means the remainder after dividing a by b. + + This calculation is done using the shift-register method of multiplying and + taking the remainder. The register is initialized to zero, and for each + incoming bit, x^32 is added mod p to the register if the bit is a one (where + x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by + x (which is shifting right by one and adding x^32 mod p if the bit shifted + out is a one). We start with the highest power (least significant bit) of + q and repeat for all eight bits of q. + + The first table is simply the CRC of all possible eight bit values. This is + all the information needed to generate CRCs on data a byte at a time for all + combinations of CRC register values and incoming bytes. The remaining tables + allow for word-at-a-time CRC calculation for both big-endian and little- + endian machines, where a word is four bytes. +*/ +local void make_crc_table() +{ + unsigned long c; + int n, k; + unsigned long poly; /* polynomial exclusive-or pattern */ + /* terms of polynomial defining this crc (except x^32): */ + static volatile int first = 1; /* flag to limit concurrent making */ + static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; + + /* See if another task is already doing this (not thread-safe, but better + than nothing -- significantly reduces duration of vulnerability in + case the advice about DYNAMIC_CRC_TABLE is ignored) */ + if (first) { + first = 0; + + /* make exclusive-or pattern from polynomial (0xedb88320UL) */ + poly = 0UL; + for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) + poly |= 1UL << (31 - p[n]); + + /* generate a crc for every 8-bit value */ + for (n = 0; n < 256; n++) { + c = (unsigned long)n; + for (k = 0; k < 8; k++) + c = c & 1 ? poly ^ (c >> 1) : c >> 1; + crc_table[0][n] = c; + } + +#ifdef BYFOUR + /* generate crc for each value followed by one, two, and three zeros, + and then the byte reversal of those as well as the first table */ + for (n = 0; n < 256; n++) { + c = crc_table[0][n]; + crc_table[4][n] = REV(c); + for (k = 1; k < 4; k++) { + c = crc_table[0][c & 0xff] ^ (c >> 8); + crc_table[k][n] = c; + crc_table[k + 4][n] = REV(c); + } + } +#endif /* BYFOUR */ + + crc_table_empty = 0; + } + else { /* not first */ + /* wait for the other guy to finish (not efficient, but rare) */ + while (crc_table_empty) + ; + } + +#ifdef MAKECRCH + /* write out CRC tables to crc32.h */ + { + FILE *out; + + out = fopen("crc32.h", "w"); + if (out == NULL) return; + fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); + fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); + fprintf(out, "local const unsigned long FAR "); + fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); + write_table(out, crc_table[0]); +# ifdef BYFOUR + fprintf(out, "#ifdef BYFOUR\n"); + for (k = 1; k < 8; k++) { + fprintf(out, " },\n {\n"); + write_table(out, crc_table[k]); + } + fprintf(out, "#endif\n"); +# endif /* BYFOUR */ + fprintf(out, " }\n};\n"); + fclose(out); + } +#endif /* MAKECRCH */ +} + +#ifdef MAKECRCH +local void write_table(out, table) + FILE *out; + const unsigned long FAR *table; +{ + int n; + + for (n = 0; n < 256; n++) + fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], + n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); +} +#endif /* MAKECRCH */ + +#else /* !DYNAMIC_CRC_TABLE */ +/* ======================================================================== + * Tables of CRC-32s of all single-byte values, made by make_crc_table(). + */ +#include "crc32.h" +#endif /* DYNAMIC_CRC_TABLE */ + +/* ========================================================================= + * This function can be used by asm versions of crc32() + */ +const unsigned long FAR * ZEXPORT get_crc_table() +{ +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + return (const unsigned long FAR *)crc_table; +} + +/* ========================================================================= */ +#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) +#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 + +/* ========================================================================= */ +unsigned long ZEXPORT crc32(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + if (buf == Z_NULL) return 0UL; + +#ifdef DYNAMIC_CRC_TABLE + if (crc_table_empty) + make_crc_table(); +#endif /* DYNAMIC_CRC_TABLE */ + +#ifdef BYFOUR + if (sizeof(void *) == sizeof(ptrdiff_t)) { + u4 endian; + + endian = 1; + if (*((unsigned char *)(&endian))) + return crc32_little(crc, buf, len); + else + return crc32_big(crc, buf, len); + } +#endif /* BYFOUR */ + crc = crc ^ 0xffffffffUL; + while (len >= 8) { + DO8; + len -= 8; + } + if (len) do { + DO1; + } while (--len); + return crc ^ 0xffffffffUL; +} + +#ifdef BYFOUR + +/* ========================================================================= */ +#define DOLIT4 c ^= *buf4++; \ + c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ + crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24] +#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 + +/* ========================================================================= */ +local unsigned long crc32_little(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = (u4)crc; + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + while (len >= 32) { + DOLIT32; + len -= 32; + } + while (len >= 4) { + DOLIT4; + len -= 4; + } + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8); + } while (--len); + c = ~c; + return (unsigned long)c; +} + +/* ========================================================================= */ +#define DOBIG4 c ^= *++buf4; \ + c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ + crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24] +#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 + +/* ========================================================================= */ +local unsigned long crc32_big(crc, buf, len) + unsigned long crc; + const unsigned char FAR *buf; + unsigned len; +{ + register u4 c; + register const u4 FAR *buf4; + + c = REV((u4)crc); + c = ~c; + while (len && ((ptrdiff_t)buf & 3)) { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + len--; + } + + buf4 = (const u4 FAR *)(const void FAR *)buf; + buf4--; + while (len >= 32) { + DOBIG32; + len -= 32; + } + while (len >= 4) { + DOBIG4; + len -= 4; + } + buf4++; + buf = (const unsigned char FAR *)buf4; + + if (len) do { + c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8); + } while (--len); + c = ~c; + return (unsigned long)(REV(c)); +} + +#endif /* BYFOUR */ + +#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ + +/* ========================================================================= */ +local unsigned long gf2_matrix_times(mat, vec) + unsigned long *mat; + unsigned long vec; +{ + unsigned long sum; + + sum = 0; + while (vec) { + if (vec & 1) + sum ^= *mat; + vec >>= 1; + mat++; + } + return sum; +} + +/* ========================================================================= */ +local void gf2_matrix_square(square, mat) + unsigned long *square; + unsigned long *mat; +{ + int n; + + for (n = 0; n < GF2_DIM; n++) + square[n] = gf2_matrix_times(mat, mat[n]); +} + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + int n; + unsigned long row; + unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ + unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ + + /* degenerate case */ + if (len2 == 0) + return crc1; + + /* put operator for one zero bit in odd */ + odd[0] = 0xedb88320L; /* CRC-32 polynomial */ + row = 1; + for (n = 1; n < GF2_DIM; n++) { + odd[n] = row; + row <<= 1; + } + + /* put operator for two zero bits in even */ + gf2_matrix_square(even, odd); + + /* put operator for four zero bits in odd */ + gf2_matrix_square(odd, even); + + /* apply len2 zeros to crc1 (first square will put the operator for one + zero byte, eight zero bits, in even) */ + do { + /* apply zeros operator for this bit of len2 */ + gf2_matrix_square(even, odd); + if (len2 & 1) + crc1 = gf2_matrix_times(even, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + if (len2 == 0) + break; + + /* another iteration of the loop with odd and even swapped */ + gf2_matrix_square(odd, even); + if (len2 & 1) + crc1 = gf2_matrix_times(odd, crc1); + len2 >>= 1; + + /* if no more bits set, then done */ + } while (len2 != 0); + + /* return combined crc */ + crc1 ^= crc2; + return crc1; +} diff --git a/third_party/windows/fltk-1.1.10/zlib/crc32.h b/third_party/windows/fltk-1.1.10/zlib/crc32.h new file mode 100644 index 0000000..5de49bc --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/crc32.h @@ -0,0 +1,441 @@ +/* crc32.h -- tables for rapid CRC calculation + * Generated automatically by crc32.c + */ + +local const unsigned long FAR crc_table[TBLS][256] = +{ + { + 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, + 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, + 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, + 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, + 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, + 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, + 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, + 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, + 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, + 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, + 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, + 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, + 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, + 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, + 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, + 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, + 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, + 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, + 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, + 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, + 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, + 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, + 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, + 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, + 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, + 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, + 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, + 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, + 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, + 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, + 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, + 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, + 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, + 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, + 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, + 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, + 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, + 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, + 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, + 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, + 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, + 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, + 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, + 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, + 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, + 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, + 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, + 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, + 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, + 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, + 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, + 0x2d02ef8dUL +#ifdef BYFOUR + }, + { + 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, + 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, + 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, + 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, + 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, + 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, + 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, + 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, + 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, + 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, + 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, + 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, + 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, + 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, + 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, + 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, + 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, + 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, + 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, + 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, + 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, + 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, + 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, + 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, + 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, + 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, + 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, + 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, + 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, + 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, + 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, + 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, + 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, + 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, + 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, + 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, + 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, + 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, + 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, + 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, + 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, + 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, + 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, + 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, + 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, + 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, + 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, + 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, + 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, + 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, + 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, + 0x9324fd72UL + }, + { + 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, + 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, + 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, + 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, + 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, + 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, + 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, + 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, + 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, + 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, + 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, + 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, + 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, + 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, + 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, + 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, + 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, + 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, + 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, + 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, + 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, + 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, + 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, + 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, + 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, + 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, + 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, + 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, + 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, + 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, + 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, + 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, + 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, + 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, + 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, + 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, + 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, + 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, + 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, + 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, + 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, + 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, + 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, + 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, + 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, + 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, + 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, + 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, + 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, + 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, + 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, + 0xbe9834edUL + }, + { + 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, + 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, + 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, + 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, + 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, + 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, + 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, + 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, + 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, + 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, + 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, + 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, + 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, + 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, + 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, + 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, + 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, + 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, + 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, + 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, + 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, + 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, + 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, + 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, + 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, + 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, + 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, + 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, + 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, + 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, + 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, + 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, + 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, + 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, + 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, + 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, + 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, + 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, + 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, + 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, + 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, + 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, + 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, + 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, + 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, + 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, + 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, + 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, + 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, + 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, + 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, + 0xde0506f1UL + }, + { + 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, + 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, + 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, + 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, + 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, + 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, + 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, + 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, + 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, + 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, + 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, + 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, + 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, + 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, + 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, + 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, + 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, + 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, + 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, + 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, + 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, + 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, + 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, + 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, + 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, + 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, + 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, + 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, + 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, + 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, + 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, + 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, + 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, + 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, + 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, + 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, + 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, + 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, + 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, + 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, + 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, + 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, + 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, + 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, + 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, + 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, + 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, + 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, + 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, + 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, + 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, + 0x8def022dUL + }, + { + 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, + 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, + 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, + 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, + 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, + 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, + 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, + 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, + 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, + 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, + 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, + 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, + 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, + 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, + 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, + 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, + 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, + 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, + 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, + 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, + 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, + 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, + 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, + 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, + 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, + 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, + 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, + 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, + 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, + 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, + 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, + 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, + 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, + 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, + 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, + 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, + 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, + 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, + 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, + 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, + 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, + 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, + 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, + 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, + 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, + 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, + 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, + 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, + 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, + 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, + 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, + 0x72fd2493UL + }, + { + 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, + 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, + 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, + 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, + 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, + 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, + 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, + 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, + 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, + 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, + 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, + 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, + 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, + 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, + 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, + 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, + 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, + 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, + 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, + 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, + 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, + 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, + 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, + 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, + 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, + 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, + 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, + 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, + 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, + 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, + 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, + 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, + 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, + 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, + 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, + 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, + 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, + 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, + 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, + 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, + 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, + 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, + 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, + 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, + 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, + 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, + 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, + 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, + 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, + 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, + 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, + 0xed3498beUL + }, + { + 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, + 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, + 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, + 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, + 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, + 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, + 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, + 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, + 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, + 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, + 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, + 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, + 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, + 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, + 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, + 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, + 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, + 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, + 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, + 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, + 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, + 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, + 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, + 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, + 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, + 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, + 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, + 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, + 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, + 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, + 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, + 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, + 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, + 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, + 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, + 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, + 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, + 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, + 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, + 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, + 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, + 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, + 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, + 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, + 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, + 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, + 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, + 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, + 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, + 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, + 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, + 0xf10605deUL +#endif + } +}; diff --git a/third_party/windows/fltk-1.1.10/zlib/deflate.c b/third_party/windows/fltk-1.1.10/zlib/deflate.c new file mode 100644 index 0000000..f526245 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/deflate.c @@ -0,0 +1,1736 @@ +/* deflate.c -- compress data using the deflation algorithm + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process depends on being able to identify portions + * of the input text which are identical to earlier input (within a + * sliding window trailing behind the input currently being processed). + * + * The most straightforward technique turns out to be the fastest for + * most input files: try all possible matches and select the longest. + * The key feature of this algorithm is that insertions into the string + * dictionary are very simple and thus fast, and deletions are avoided + * completely. Insertions are performed at each input character, whereas + * string matches are performed only when the previous match ends. So it + * is preferable to spend more time in matches to allow very fast string + * insertions and avoid deletions. The matching algorithm for small + * strings is inspired from that of Rabin & Karp. A brute force approach + * is used to find longer strings when a small match has been found. + * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze + * (by Leonid Broukhis). + * A previous version of this file used a more sophisticated algorithm + * (by Fiala and Greene) which is guaranteed to run in linear amortized + * time, but has a larger average cost, uses more memory and is patented. + * However the F&G algorithm may be faster for some highly redundant + * files if the parameter max_chain_length (described below) is too large. + * + * ACKNOWLEDGEMENTS + * + * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and + * I found it in 'freeze' written by Leonid Broukhis. + * Thanks to many people for bug reports and testing. + * + * REFERENCES + * + * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". + * Available in http://www.ietf.org/rfc/rfc1951.txt + * + * A description of the Rabin and Karp algorithm is given in the book + * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. + * + * Fiala,E.R., and Greene,D.H. + * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 + * + */ + +/* @(#) $Id: deflate.c 5666 2007-02-06 22:02:28Z mike $ */ + +#include "deflate.h" + +const char deflate_copyright[] = + " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* =========================================================================== + * Function prototypes. + */ +typedef enum { + need_more, /* block not completed, need more input or more output */ + block_done, /* block flush performed */ + finish_started, /* finish started, need only more output at next deflate */ + finish_done /* finish done, accept no more input or output */ +} block_state; + +typedef block_state (*compress_func) OF((deflate_state *s, int flush)); +/* Compression function. Returns the block state after the call. */ + +local void fill_window OF((deflate_state *s)); +local block_state deflate_stored OF((deflate_state *s, int flush)); +local block_state deflate_fast OF((deflate_state *s, int flush)); +#ifndef FASTEST +local block_state deflate_slow OF((deflate_state *s, int flush)); +#endif +local void lm_init OF((deflate_state *s)); +local void putShortMSB OF((deflate_state *s, uInt b)); +local void flush_pending OF((z_streamp strm)); +local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); +#ifndef FASTEST +#ifdef ASMV + void match_init OF((void)); /* asm code initialization */ + uInt longest_match OF((deflate_state *s, IPos cur_match)); +#else +local uInt longest_match OF((deflate_state *s, IPos cur_match)); +#endif +#endif +local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); + +#ifdef DEBUG +local void check_match OF((deflate_state *s, IPos start, IPos match, + int length)); +#endif + +/* =========================================================================== + * Local data + */ + +#define NIL 0 +/* Tail of hash chains */ + +#ifndef TOO_FAR +# define TOO_FAR 4096 +#endif +/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +typedef struct config_s { + ush good_length; /* reduce lazy search above this match length */ + ush max_lazy; /* do not perform lazy search above this match length */ + ush nice_length; /* quit search above this match length */ + ush max_chain; + compress_func func; +} config; + +#ifdef FASTEST +local const config configuration_table[2] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ +#else +local const config configuration_table[10] = { +/* good lazy nice chain */ +/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ +/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ +/* 2 */ {4, 5, 16, 8, deflate_fast}, +/* 3 */ {4, 6, 32, 32, deflate_fast}, + +/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ +/* 5 */ {8, 16, 32, 32, deflate_slow}, +/* 6 */ {8, 16, 128, 128, deflate_slow}, +/* 7 */ {8, 32, 128, 256, deflate_slow}, +/* 8 */ {32, 128, 258, 1024, deflate_slow}, +/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ +#endif + +/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 + * For deflate_fast() (levels <= 3) good is ignored and lazy has a different + * meaning. + */ + +#define EQUAL 0 +/* result of memcmp for equal strings */ + +#ifndef NO_DUMMY_DECL +struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ +#endif + +/* =========================================================================== + * Update a hash value with the given input byte + * IN assertion: all calls to to UPDATE_HASH are made with consecutive + * input characters, so that a running hash key can be computed from the + * previous key instead of complete recalculation each time. + */ +#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * If this file is compiled with -DFASTEST, the compression level is forced + * to 1, and no hash chains are maintained. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of str are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ +#ifdef FASTEST +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#else +#define INSERT_STRING(s, str, match_head) \ + (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ + match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ + s->head[s->ins_h] = (Pos)(str)) +#endif + +/* =========================================================================== + * Initialize the hash table (avoiding 64K overflow for 16 bit systems). + * prev[] will be initialized on the fly. + */ +#define CLEAR_HASH(s) \ + s->head[s->hash_size-1] = NIL; \ + zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); + +/* ========================================================================= */ +int ZEXPORT deflateInit_(strm, level, version, stream_size) + z_streamp strm; + int level; + const char *version; + int stream_size; +{ + return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, + Z_DEFAULT_STRATEGY, version, stream_size); + /* To do: ignore strm->next_in if we use it as window */ +} + +/* ========================================================================= */ +int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, + version, stream_size) + z_streamp strm; + int level; + int method; + int windowBits; + int memLevel; + int strategy; + const char *version; + int stream_size; +{ + deflate_state *s; + int wrap = 1; + static const char my_version[] = ZLIB_VERSION; + + ushf *overlay; + /* We overlay pending_buf and d_buf+l_buf. This works since the average + * output size for (length,distance) codes is <= 24 bits. + */ + + if (version == Z_NULL || version[0] != my_version[0] || + stream_size != sizeof(z_stream)) { + return Z_VERSION_ERROR; + } + if (strm == Z_NULL) return Z_STREAM_ERROR; + + strm->msg = Z_NULL; + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } +#ifdef GZIP + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } +#endif + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ + s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); + if (s == Z_NULL) return Z_MEM_ERROR; + strm->state = (struct internal_state FAR *)s; + s->strm = strm; + + s->wrap = wrap; + s->gzhead = Z_NULL; + s->w_bits = windowBits; + s->w_size = 1 << s->w_bits; + s->w_mask = s->w_size - 1; + + s->hash_bits = memLevel + 7; + s->hash_size = 1 << s->hash_bits; + s->hash_mask = s->hash_size - 1; + s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); + + s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); + s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); + s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + s->pending_buf = (uchf *) overlay; + s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); + + if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || + s->pending_buf == Z_NULL) { + s->status = FINISH_STATE; + strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); + deflateEnd (strm); + return Z_MEM_ERROR; + } + s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; + + s->level = level; + s->strategy = strategy; + s->method = (Byte)method; + + return deflateReset(strm); +} + +/* ========================================================================= */ +int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) + z_streamp strm; + const Bytef *dictionary; + uInt dictLength; +{ + deflate_state *s; + uInt length = dictLength; + uInt n; + IPos hash_head = 0; + + if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || + strm->state->wrap == 2 || + (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) + return Z_STREAM_ERROR; + + s = strm->state; + if (s->wrap) + strm->adler = adler32(strm->adler, dictionary, dictLength); + + if (length < MIN_MATCH) return Z_OK; + if (length > MAX_DIST(s)) { + length = MAX_DIST(s); + dictionary += dictLength - length; /* use the tail of the dictionary */ + } + zmemcpy(s->window, dictionary, length); + s->strstart = length; + s->block_start = (long)length; + + /* Insert all strings in the hash table (except for the last two bytes). + * s->lookahead stays null, so s->ins_h will be recomputed at the next + * call of fill_window. + */ + s->ins_h = s->window[0]; + UPDATE_HASH(s, s->ins_h, s->window[1]); + for (n = 0; n <= length - MIN_MATCH; n++) { + INSERT_STRING(s, n, hash_head); + } + if (hash_head) hash_head = 0; /* to make compiler happy */ + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateReset (strm) + z_streamp strm; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { + return Z_STREAM_ERROR; + } + + strm->total_in = strm->total_out = 0; + strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ + strm->data_type = Z_UNKNOWN; + + s = (deflate_state *)strm->state; + s->pending = 0; + s->pending_out = s->pending_buf; + + if (s->wrap < 0) { + s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ + } + s->status = s->wrap ? INIT_STATE : BUSY_STATE; + strm->adler = +#ifdef GZIP + s->wrap == 2 ? crc32(0L, Z_NULL, 0) : +#endif + adler32(0L, Z_NULL, 0); + s->last_flush = Z_NO_FLUSH; + + _tr_init(s); + lm_init(s); + + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateSetHeader (strm, head) + z_streamp strm; + gz_headerp head; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + if (strm->state->wrap != 2) return Z_STREAM_ERROR; + strm->state->gzhead = head; + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflatePrime (strm, bits, value) + z_streamp strm; + int bits; + int value; +{ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + strm->state->bi_valid = bits; + strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); + return Z_OK; +} + +/* ========================================================================= */ +int ZEXPORT deflateParams(strm, level, strategy) + z_streamp strm; + int level; + int strategy; +{ + deflate_state *s; + compress_func func; + int err = Z_OK; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + +#ifdef FASTEST + if (level != 0) level = 1; +#else + if (level == Z_DEFAULT_COMPRESSION) level = 6; +#endif + if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { + return Z_STREAM_ERROR; + } + func = configuration_table[s->level].func; + + if (func != configuration_table[level].func && strm->total_in != 0) { + /* Flush the last buffer: */ + err = deflate(strm, Z_PARTIAL_FLUSH); + } + if (s->level != level) { + s->level = level; + s->max_lazy_match = configuration_table[level].max_lazy; + s->good_match = configuration_table[level].good_length; + s->nice_match = configuration_table[level].nice_length; + s->max_chain_length = configuration_table[level].max_chain; + } + s->strategy = strategy; + return err; +} + +/* ========================================================================= */ +int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) + z_streamp strm; + int good_length; + int max_lazy; + int nice_length; + int max_chain; +{ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + s = strm->state; + s->good_match = good_length; + s->max_lazy_match = max_lazy; + s->nice_match = nice_length; + s->max_chain_length = max_chain; + return Z_OK; +} + +/* ========================================================================= + * For the default windowBits of 15 and memLevel of 8, this function returns + * a close to exact, as well as small, upper bound on the compressed size. + * They are coded as constants here for a reason--if the #define's are + * changed, then this function needs to be changed as well. The return + * value for 15 and 8 only works for those exact settings. + * + * For any setting other than those defaults for windowBits and memLevel, + * the value returned is a conservative worst case for the maximum expansion + * resulting from using fixed blocks instead of stored blocks, which deflate + * can emit on compressed data for some combinations of the parameters. + * + * This function could be more sophisticated to provide closer upper bounds + * for every combination of windowBits and memLevel, as well as wrap. + * But even the conservative upper bound of about 14% expansion does not + * seem onerous for output buffer allocation. + */ +uLong ZEXPORT deflateBound(strm, sourceLen) + z_streamp strm; + uLong sourceLen; +{ + deflate_state *s; + uLong destLen; + + /* conservative upper bound */ + destLen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; + + /* if can't get parameters, return conservative bound */ + if (strm == Z_NULL || strm->state == Z_NULL) + return destLen; + + /* if not default parameters, return conservative bound */ + s = strm->state; + if (s->w_bits != 15 || s->hash_bits != 8 + 7) + return destLen; + + /* default settings: return tight bound for that case */ + return compressBound(sourceLen); +} + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +local void putShortMSB (s, b) + deflate_state *s; + uInt b; +{ + put_byte(s, (Byte)(b >> 8)); + put_byte(s, (Byte)(b & 0xff)); +} + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output goes + * through this function so some applications may wish to modify it + * to avoid allocating a large strm->next_out buffer and copying into it. + * (See also read_buf()). + */ +local void flush_pending(strm) + z_streamp strm; +{ + unsigned len = strm->state->pending; + + if (len > strm->avail_out) len = strm->avail_out; + if (len == 0) return; + + zmemcpy(strm->next_out, strm->state->pending_out, len); + strm->next_out += len; + strm->state->pending_out += len; + strm->total_out += len; + strm->avail_out -= len; + strm->state->pending -= len; + if (strm->state->pending == 0) { + strm->state->pending_out = strm->state->pending_buf; + } +} + +/* ========================================================================= */ +int ZEXPORT deflate (strm, flush) + z_streamp strm; + int flush; +{ + int old_flush; /* value of flush param for previous deflate call */ + deflate_state *s; + + if (strm == Z_NULL || strm->state == Z_NULL || + flush > Z_FINISH || flush < 0) { + return Z_STREAM_ERROR; + } + s = strm->state; + + if (strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0) || + (s->status == FINISH_STATE && flush != Z_FINISH)) { + ERR_RETURN(strm, Z_STREAM_ERROR); + } + if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); + + s->strm = strm; /* just in case */ + old_flush = s->last_flush; + s->last_flush = flush; + + /* Write the header */ + if (s->status == INIT_STATE) { +#ifdef GZIP + if (s->wrap == 2) { + strm->adler = crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (s->gzhead == NULL) { + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s->status = BUSY_STATE; + } + else { + put_byte(s, (s->gzhead->text ? 1 : 0) + + (s->gzhead->hcrc ? 2 : 0) + + (s->gzhead->extra == Z_NULL ? 0 : 4) + + (s->gzhead->name == Z_NULL ? 0 : 8) + + (s->gzhead->comment == Z_NULL ? 0 : 16) + ); + put_byte(s, (Byte)(s->gzhead->time & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); + put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); + put_byte(s, s->level == 9 ? 2 : + (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? + 4 : 0)); + put_byte(s, s->gzhead->os & 0xff); + if (s->gzhead->extra != NULL) { + put_byte(s, s->gzhead->extra_len & 0xff); + put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); + } + if (s->gzhead->hcrc) + strm->adler = crc32(strm->adler, s->pending_buf, + s->pending); + s->gzindex = 0; + s->status = EXTRA_STATE; + } + } + else +#endif + { + uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; + uInt level_flags; + + if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) + level_flags = 0; + else if (s->level < 6) + level_flags = 1; + else if (s->level == 6) + level_flags = 2; + else + level_flags = 3; + header |= (level_flags << 6); + if (s->strstart != 0) header |= PRESET_DICT; + header += 31 - (header % 31); + + s->status = BUSY_STATE; + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s->strstart != 0) { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + strm->adler = adler32(0L, Z_NULL, 0); + } + } +#ifdef GZIP + if (s->status == EXTRA_STATE) { + if (s->gzhead->extra != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + + while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) + break; + } + put_byte(s, s->gzhead->extra[s->gzindex]); + s->gzindex++; + } + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (s->gzindex == s->gzhead->extra_len) { + s->gzindex = 0; + s->status = NAME_STATE; + } + } + else + s->status = NAME_STATE; + } + if (s->status == NAME_STATE) { + if (s->gzhead->name != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->name[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) { + s->gzindex = 0; + s->status = COMMENT_STATE; + } + } + else + s->status = COMMENT_STATE; + } + if (s->status == COMMENT_STATE) { + if (s->gzhead->comment != NULL) { + uInt beg = s->pending; /* start of bytes to update crc */ + int val; + + do { + if (s->pending == s->pending_buf_size) { + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + flush_pending(strm); + beg = s->pending; + if (s->pending == s->pending_buf_size) { + val = 1; + break; + } + } + val = s->gzhead->comment[s->gzindex++]; + put_byte(s, val); + } while (val != 0); + if (s->gzhead->hcrc && s->pending > beg) + strm->adler = crc32(strm->adler, s->pending_buf + beg, + s->pending - beg); + if (val == 0) + s->status = HCRC_STATE; + } + else + s->status = HCRC_STATE; + } + if (s->status == HCRC_STATE) { + if (s->gzhead->hcrc) { + if (s->pending + 2 > s->pending_buf_size) + flush_pending(strm); + if (s->pending + 2 <= s->pending_buf_size) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + strm->adler = crc32(0L, Z_NULL, 0); + s->status = BUSY_STATE; + } + } + else + s->status = BUSY_STATE; + } +#endif + + /* Flush as much pending output as possible */ + if (s->pending != 0) { + flush_pending(strm); + if (strm->avail_out == 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s->last_flush = -1; + return Z_OK; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm->avail_in == 0 && flush <= old_flush && + flush != Z_FINISH) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* User must not provide more input after the first FINISH: */ + if (s->status == FINISH_STATE && strm->avail_in != 0) { + ERR_RETURN(strm, Z_BUF_ERROR); + } + + /* Start a new block or continue the current one. + */ + if (strm->avail_in != 0 || s->lookahead != 0 || + (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { + block_state bstate; + + bstate = (*(configuration_table[s->level].func))(s, flush); + + if (bstate == finish_started || bstate == finish_done) { + s->status = FINISH_STATE; + } + if (bstate == need_more || bstate == finish_started) { + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ + } + return Z_OK; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate == block_done) { + if (flush == Z_PARTIAL_FLUSH) { + _tr_align(s); + } else { /* FULL_FLUSH or SYNC_FLUSH */ + _tr_stored_block(s, (char*)0, 0L, 0); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush == Z_FULL_FLUSH) { + CLEAR_HASH(s); /* forget history */ + } + } + flush_pending(strm); + if (strm->avail_out == 0) { + s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK; + } + } + } + Assert(strm->avail_out > 0, "bug2"); + + if (flush != Z_FINISH) return Z_OK; + if (s->wrap <= 0) return Z_STREAM_END; + + /* Write the trailer */ +#ifdef GZIP + if (s->wrap == 2) { + put_byte(s, (Byte)(strm->adler & 0xff)); + put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); + put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); + put_byte(s, (Byte)(strm->total_in & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); + put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); + } + else +#endif + { + putShortMSB(s, (uInt)(strm->adler >> 16)); + putShortMSB(s, (uInt)(strm->adler & 0xffff)); + } + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ + return s->pending != 0 ? Z_OK : Z_STREAM_END; +} + +/* ========================================================================= */ +int ZEXPORT deflateEnd (strm) + z_streamp strm; +{ + int status; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + + status = strm->state->status; + if (status != INIT_STATE && + status != EXTRA_STATE && + status != NAME_STATE && + status != COMMENT_STATE && + status != HCRC_STATE && + status != BUSY_STATE && + status != FINISH_STATE) { + return Z_STREAM_ERROR; + } + + /* Deallocate in reverse order of allocations: */ + TRY_FREE(strm, strm->state->pending_buf); + TRY_FREE(strm, strm->state->head); + TRY_FREE(strm, strm->state->prev); + TRY_FREE(strm, strm->state->window); + + ZFREE(strm, strm->state); + strm->state = Z_NULL; + + return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; +} + +/* ========================================================================= + * Copy the source state to the destination state. + * To simplify the source, this is not supported for 16-bit MSDOS (which + * doesn't have enough memory anyway to duplicate compression states). + */ +int ZEXPORT deflateCopy (dest, source) + z_streamp dest; + z_streamp source; +{ +#ifdef MAXSEG_64K + return Z_STREAM_ERROR; +#else + deflate_state *ds; + deflate_state *ss; + ushf *overlay; + + + if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { + return Z_STREAM_ERROR; + } + + ss = source->state; + + zmemcpy(dest, source, sizeof(z_stream)); + + ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); + if (ds == Z_NULL) return Z_MEM_ERROR; + dest->state = (struct internal_state FAR *) ds; + zmemcpy(ds, ss, sizeof(deflate_state)); + ds->strm = dest; + + ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); + ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); + ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); + overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); + ds->pending_buf = (uchf *) overlay; + + if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || + ds->pending_buf == Z_NULL) { + deflateEnd (dest); + return Z_MEM_ERROR; + } + /* following zmemcpy do not work for 16-bit MSDOS */ + zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); + zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); + zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); + zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); + + ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); + ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); + ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; + + ds->l_desc.dyn_tree = ds->dyn_ltree; + ds->d_desc.dyn_tree = ds->dyn_dtree; + ds->bl_desc.dyn_tree = ds->bl_tree; + + return Z_OK; +#endif /* MAXSEG_64K */ +} + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->next_in buffer and copying from it. + * (See also flush_pending()). + */ +local int read_buf(strm, buf, size) + z_streamp strm; + Bytef *buf; + unsigned size; +{ + unsigned len = strm->avail_in; + + if (len > size) len = size; + if (len == 0) return 0; + + strm->avail_in -= len; + + if (strm->state->wrap == 1) { + strm->adler = adler32(strm->adler, strm->next_in, len); + } +#ifdef GZIP + else if (strm->state->wrap == 2) { + strm->adler = crc32(strm->adler, strm->next_in, len); + } +#endif + zmemcpy(buf, strm->next_in, len); + strm->next_in += len; + strm->total_in += len; + + return (int)len; +} + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +local void lm_init (s) + deflate_state *s; +{ + s->window_size = (ulg)2L*s->w_size; + + CLEAR_HASH(s); + + /* Set the default configuration parameters: + */ + s->max_lazy_match = configuration_table[s->level].max_lazy; + s->good_match = configuration_table[s->level].good_length; + s->nice_match = configuration_table[s->level].nice_length; + s->max_chain_length = configuration_table[s->level].max_chain; + + s->strstart = 0; + s->block_start = 0L; + s->lookahead = 0; + s->match_length = s->prev_length = MIN_MATCH-1; + s->match_available = 0; + s->ins_h = 0; +#ifndef FASTEST +#ifdef ASMV + match_init(); /* initialize the asm code */ +#endif +#endif +} + +#ifndef FASTEST +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +#ifndef ASMV +/* For 80x86 and 680x0, an optimized version will be provided in match.asm or + * match.S. The code will be functionally equivalent. + */ +local uInt longest_match(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + unsigned chain_length = s->max_chain_length;/* max hash chain length */ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + int best_len = s->prev_length; /* best match length so far */ + int nice_match = s->nice_match; /* stop if match long enough */ + IPos limit = s->strstart > (IPos)MAX_DIST(s) ? + s->strstart - (IPos)MAX_DIST(s) : NIL; + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + Posf *prev = s->prev; + uInt wmask = s->w_mask; + +#ifdef UNALIGNED_OK + /* Compare two bytes at a time. Note: this is not always beneficial. + * Try with and without -DUNALIGNED_OK to check. + */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; + register ush scan_start = *(ushf*)scan; + register ush scan_end = *(ushf*)(scan+best_len-1); +#else + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + register Byte scan_end1 = scan[best_len-1]; + register Byte scan_end = scan[best_len]; +#endif + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s->prev_length >= s->good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + Assert(cur_match < s->strstart, "no future"); + match = s->window + cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ +#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) + /* This code assumes sizeof(unsigned short) == 2. Do not use + * UNALIGNED_OK if your compiler uses a different size. + */ + if (*(ushf*)(match+best_len-1) != scan_end || + *(ushf*)match != scan_start) continue; + + /* It is not necessary to compare scan[2] and match[2] since they are + * always equal when the other bytes match, given that the hash keys + * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at + * strstart+3, +5, ... up to strstart+257. We check for insufficient + * lookahead only every 4th comparison; the 128th check will be made + * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is + * necessary to put more guard bytes at the end of the window, or + * to check more often for insufficient lookahead. + */ + Assert(scan[2] == match[2], "scan[2]?"); + scan++, match++; + do { + } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + *(ushf*)(scan+=2) == *(ushf*)(match+=2) && + scan < strend); + /* The funny "do {}" generates better code on most compilers */ + + /* Here, scan <= window+strstart+257 */ + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + if (*scan == *match) scan++; + + len = (MAX_MATCH - 1) - (int)(strend-scan); + scan = strend - (MAX_MATCH-1); + +#else /* UNALIGNED_OK */ + + if (match[best_len] != scan_end || + match[best_len-1] != scan_end1 || + *match != *scan || + *++match != scan[1]) continue; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match++; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + scan = strend - MAX_MATCH; + +#endif /* UNALIGNED_OK */ + + if (len > best_len) { + s->match_start = cur_match; + best_len = len; + if (len >= nice_match) break; +#ifdef UNALIGNED_OK + scan_end = *(ushf*)(scan+best_len-1); +#else + scan_end1 = scan[best_len-1]; + scan_end = scan[best_len]; +#endif + } + } while ((cur_match = prev[cur_match & wmask]) > limit + && --chain_length != 0); + + if ((uInt)best_len <= s->lookahead) return (uInt)best_len; + return s->lookahead; +} +#endif /* ASMV */ +#endif /* FASTEST */ + +/* --------------------------------------------------------------------------- + * Optimized version for level == 1 or strategy == Z_RLE only + */ +local uInt longest_match_fast(s, cur_match) + deflate_state *s; + IPos cur_match; /* current match */ +{ + register Bytef *scan = s->window + s->strstart; /* current string */ + register Bytef *match; /* matched string */ + register int len; /* length of current match */ + register Bytef *strend = s->window + s->strstart + MAX_MATCH; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + Assert(cur_match < s->strstart, "no future"); + + match = s->window + cur_match; + + /* Return failure if the match length is less than 2: + */ + if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2, match += 2; + Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (*++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + *++scan == *++match && *++scan == *++match && + scan < strend); + + Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (int)(strend - scan); + + if (len < MIN_MATCH) return MIN_MATCH - 1; + + s->match_start = cur_match; + return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; +} + +#ifdef DEBUG +/* =========================================================================== + * Check that the match at match_start is indeed a match. + */ +local void check_match(s, start, match, length) + deflate_state *s; + IPos start, match; + int length; +{ + /* check that the match is indeed a match */ + if (zmemcmp(s->window + match, + s->window + start, length) != EQUAL) { + fprintf(stderr, " start %u, match %u, length %d\n", + start, match, length); + do { + fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); + } while (--length != 0); + z_error("invalid match"); + } + if (z_verbose > 1) { + fprintf(stderr,"\\[%d,%d]", start-match, length); + do { putc(s->window[start++], stderr); } while (--length != 0); + } +} +#else +# define check_match(s, start, match, length) +#endif /* DEBUG */ + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +local void fill_window(s) + deflate_state *s; +{ + register unsigned n, m; + register Posf *p; + unsigned more; /* Amount of free space at the end of the window. */ + uInt wsize = s->w_size; + + do { + more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); + + /* Deal with !@#$% 64K limit: */ + if (sizeof(int) <= 2) { + if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + more = wsize; + + } else if (more == (unsigned)(-1)) { + /* Very unlikely, but possible on 16 bit machine if + * strstart == 0 && lookahead == 1 (input done a byte at time) + */ + more--; + } + } + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s->strstart >= wsize+MAX_DIST(s)) { + + zmemcpy(s->window, s->window+wsize, (unsigned)wsize); + s->match_start -= wsize; + s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ + s->block_start -= (long) wsize; + + /* Slide the hash table (could be avoided with 32 bit values + at the expense of memory usage). We slide even when level == 0 + to keep the hash table consistent if we switch back to level > 0 + later. (Using level 0 permanently is not an optimal usage of + zlib, so we don't care about this pathological case.) + */ + /* %%% avoid this when Z_RLE */ + n = s->hash_size; + p = &s->head[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + } while (--n); + + n = wsize; +#ifndef FASTEST + p = &s->prev[n]; + do { + m = *--p; + *p = (Pos)(m >= wsize ? m-wsize : NIL); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +#endif + more += wsize; + } + if (s->strm->avail_in == 0) return; + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + Assert(more >= 2, "more < 2"); + + n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); + s->lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (s->lookahead >= MIN_MATCH) { + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); +} + +/* =========================================================================== + * Flush the current block, with given end-of-file flag. + * IN assertion: strstart is set to the end of the current match. + */ +#define FLUSH_BLOCK_ONLY(s, eof) { \ + _tr_flush_block(s, (s->block_start >= 0L ? \ + (charf *)&s->window[(unsigned)s->block_start] : \ + (charf *)Z_NULL), \ + (ulg)((long)s->strstart - s->block_start), \ + (eof)); \ + s->block_start = s->strstart; \ + flush_pending(s->strm); \ + Tracev((stderr,"[FLUSH]")); \ +} + +/* Same but force premature exit if necessary. */ +#define FLUSH_BLOCK(s, eof) { \ + FLUSH_BLOCK_ONLY(s, eof); \ + if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ +} + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * This function does not insert new strings in the dictionary since + * uncompressible data is probably not useful. This function is used + * only for the level=0 compression option. + * NOTE: this function should be optimized to avoid extra copying from + * window to pending_buf. + */ +local block_state deflate_stored(s, flush) + deflate_state *s; + int flush; +{ + /* Stored blocks are limited to 0xffff bytes, pending_buf is limited + * to pending_buf_size, and each stored block has a 5 byte header: + */ + ulg max_block_size = 0xffff; + ulg max_start; + + if (max_block_size > s->pending_buf_size - 5) { + max_block_size = s->pending_buf_size - 5; + } + + /* Copy as much as possible from input to output: */ + for (;;) { + /* Fill the window as much as possible: */ + if (s->lookahead <= 1) { + + Assert(s->strstart < s->w_size+MAX_DIST(s) || + s->block_start >= (long)s->w_size, "slide too late"); + + fill_window(s); + if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; + + if (s->lookahead == 0) break; /* flush the current block */ + } + Assert(s->block_start >= 0L, "block gone"); + + s->strstart += s->lookahead; + s->lookahead = 0; + + /* Emit a stored block if pending_buf will be full: */ + max_start = s->block_start + max_block_size; + if (s->strstart == 0 || (ulg)s->strstart >= max_start) { + /* strstart == 0 is possible when wraparound on 16-bit machine */ + s->lookahead = (uInt)(s->strstart - max_start); + s->strstart = (uInt)max_start; + FLUSH_BLOCK(s, 0); + } + /* Flush if we may have to slide, otherwise block_start may become + * negative and the data will be gone: + */ + if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { + FLUSH_BLOCK(s, 0); + } + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +local block_state deflate_fast(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head = NIL; /* head of the hash chain */ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ +#ifdef FASTEST + if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || + (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { + s->match_length = longest_match_fast (s, hash_head); + } +#else + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } +#endif + /* longest_match() or longest_match_fast() sets match_start */ + } + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->match_start, s->match_length); + + _tr_tally_dist(s, s->strstart - s->match_start, + s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ +#ifndef FASTEST + if (s->match_length <= s->max_insert_length && + s->lookahead >= MIN_MATCH) { + s->match_length--; /* string at strstart already in table */ + do { + s->strstart++; + INSERT_STRING(s, s->strstart, hash_head); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s->match_length != 0); + s->strstart++; + } else +#endif + { + s->strstart += s->match_length; + s->match_length = 0; + s->ins_h = s->window[s->strstart]; + UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); +#if MIN_MATCH != 3 + Call UPDATE_HASH() MIN_MATCH-3 more times +#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} + +#ifndef FASTEST +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +local block_state deflate_slow(s, flush) + deflate_state *s; + int flush; +{ + IPos hash_head = NIL; /* head of hash chain */ + int bflush; /* set if current block must be flushed */ + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s->lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + if (s->lookahead >= MIN_MATCH) { + INSERT_STRING(s, s->strstart, hash_head); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s->prev_length = s->match_length, s->prev_match = s->match_start; + s->match_length = MIN_MATCH-1; + + if (hash_head != NIL && s->prev_length < s->max_lazy_match && + s->strstart - hash_head <= MAX_DIST(s)) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { + s->match_length = longest_match (s, hash_head); + } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { + s->match_length = longest_match_fast (s, hash_head); + } + /* longest_match() or longest_match_fast() sets match_start */ + + if (s->match_length <= 5 && (s->strategy == Z_FILTERED +#if TOO_FAR <= 32767 + || (s->match_length == MIN_MATCH && + s->strstart - s->match_start > TOO_FAR) +#endif + )) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s->match_length = MIN_MATCH-1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { + uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + check_match(s, s->strstart-1, s->prev_match, s->prev_length); + + _tr_tally_dist(s, s->strstart -1 - s->prev_match, + s->prev_length - MIN_MATCH, bflush); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s->lookahead -= s->prev_length-1; + s->prev_length -= 2; + do { + if (++s->strstart <= max_insert) { + INSERT_STRING(s, s->strstart, hash_head); + } + } while (--s->prev_length != 0); + s->match_available = 0; + s->match_length = MIN_MATCH-1; + s->strstart++; + + if (bflush) FLUSH_BLOCK(s, 0); + + } else if (s->match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + if (bflush) { + FLUSH_BLOCK_ONLY(s, 0); + } + s->strstart++; + s->lookahead--; + if (s->strm->avail_out == 0) return need_more; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s->match_available = 1; + s->strstart++; + s->lookahead--; + } + } + Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s->match_available) { + Tracevv((stderr,"%c", s->window[s->strstart-1])); + _tr_tally_lit(s, s->window[s->strstart-1], bflush); + s->match_available = 0; + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif /* FASTEST */ + +#if 0 +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +local block_state deflate_rle(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + uInt run; /* length of run */ + uInt max; /* maximum length of run */ + uInt prev; /* byte at distance one to match */ + Bytef *scan; /* scan for end of run */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest encodable run. + */ + if (s->lookahead < MAX_MATCH) { + fill_window(s); + if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { + return need_more; + } + if (s->lookahead == 0) break; /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + run = 0; + if (s->strstart > 0) { /* if there is a previous byte, that is */ + max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; + scan = s->window + s->strstart - 1; + prev = *scan++; + do { + if (*scan++ != prev) + break; + } while (++run < max); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (run >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, run); + _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); + s->lookahead -= run; + s->strstart += run; + } else { + /* No match, output a literal byte */ + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + } + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} +#endif diff --git a/third_party/windows/fltk-1.1.10/zlib/deflate.h b/third_party/windows/fltk-1.1.10/zlib/deflate.h new file mode 100644 index 0000000..4c17f59 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/deflate.h @@ -0,0 +1,331 @@ +/* deflate.h -- internal compression state + * Copyright (C) 1995-2004 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id: deflate.h 5666 2007-02-06 22:02:28Z mike $ */ + +#ifndef DEFLATE_H +#define DEFLATE_H + +#include "zutil.h" + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer creation by deflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip encoding + should be left enabled. */ +#ifndef NO_GZIP +# define GZIP +#endif + +/* =========================================================================== + * Internal compression state. + */ + +#define LENGTH_CODES 29 +/* number of length codes, not counting the special END_BLOCK code */ + +#define LITERALS 256 +/* number of literal bytes 0..255 */ + +#define L_CODES (LITERALS+1+LENGTH_CODES) +/* number of Literal or Length codes, including the END_BLOCK code */ + +#define D_CODES 30 +/* number of distance codes */ + +#define BL_CODES 19 +/* number of codes used to transfer the bit lengths */ + +#define HEAP_SIZE (2*L_CODES+1) +/* maximum heap size */ + +#define MAX_BITS 15 +/* All codes must not exceed MAX_BITS bits */ + +#define INIT_STATE 42 +#define EXTRA_STATE 69 +#define NAME_STATE 73 +#define COMMENT_STATE 91 +#define HCRC_STATE 103 +#define BUSY_STATE 113 +#define FINISH_STATE 666 +/* Stream status */ + + +/* Data structure describing a single value and its code string. */ +typedef struct ct_data_s { + union { + ush freq; /* frequency count */ + ush code; /* bit string */ + } fc; + union { + ush dad; /* father node in Huffman tree */ + ush len; /* length of bit string */ + } dl; +} FAR ct_data; + +#define Freq fc.freq +#define Code fc.code +#define Dad dl.dad +#define Len dl.len + +typedef struct static_tree_desc_s static_tree_desc; + +typedef struct tree_desc_s { + ct_data *dyn_tree; /* the dynamic tree */ + int max_code; /* largest code with non zero frequency */ + static_tree_desc *stat_desc; /* the corresponding static tree */ +} FAR tree_desc; + +typedef ush Pos; +typedef Pos FAR Posf; +typedef unsigned IPos; + +/* A Pos is an index in the character window. We use short instead of int to + * save space in the various tables. IPos is used only for parameter passing. + */ + +typedef struct internal_state { + z_streamp strm; /* pointer back to this zlib stream */ + int status; /* as the name implies */ + Bytef *pending_buf; /* output still pending */ + ulg pending_buf_size; /* size of pending_buf */ + Bytef *pending_out; /* next pending byte to output to the stream */ + uInt pending; /* nb of bytes in the pending buffer */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + gz_headerp gzhead; /* gzip header information to write */ + uInt gzindex; /* where in extra, name, or comment */ + Byte method; /* STORED (for zip only) or DEFLATED */ + int last_flush; /* value of flush param for previous deflate call */ + + /* used by deflate.c: */ + + uInt w_size; /* LZ77 window size (32K by default) */ + uInt w_bits; /* log2(w_size) (8..16) */ + uInt w_mask; /* w_size - 1 */ + + Bytef *window; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. Also, it limits + * the window size to 64K, which is quite useful on MSDOS. + * To do: use the user input buffer as sliding window. + */ + + ulg window_size; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + Posf *prev; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + Posf *head; /* Heads of the hash chains or NIL. */ + + uInt ins_h; /* hash index of string to be inserted */ + uInt hash_size; /* number of elements in hash table */ + uInt hash_bits; /* log2(hash_size) */ + uInt hash_mask; /* hash_size-1 */ + + uInt hash_shift; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + long block_start; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + uInt match_length; /* length of best match */ + IPos prev_match; /* previous match */ + int match_available; /* set if previous match exists */ + uInt strstart; /* start of string to insert */ + uInt match_start; /* start of matching string */ + uInt lookahead; /* number of valid bytes ahead in window */ + + uInt prev_length; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + uInt max_chain_length; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + uInt max_lazy_match; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ +# define max_insert_length max_lazy_match + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + int level; /* compression level (1..9) */ + int strategy; /* favor or force Huffman coding*/ + + uInt good_match; + /* Use a faster search when the previous match is longer than this */ + + int nice_match; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + /* Didn't use ct_data typedef below to supress compiler warning */ + struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + struct tree_desc_s l_desc; /* desc. for literal tree */ + struct tree_desc_s d_desc; /* desc. for distance tree */ + struct tree_desc_s bl_desc; /* desc. for bit length tree */ + + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + int heap_len; /* number of elements in the heap */ + int heap_max; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + uch depth[2*L_CODES+1]; + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + uchf *l_buf; /* buffer for literals or lengths */ + + uInt lit_bufsize; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + uInt last_lit; /* running index in l_buf */ + + ushf *d_buf; + /* Buffer for distances. To simplify the code, d_buf and l_buf have + * the same number of elements. To use different lengths, an extra flag + * array would be necessary. + */ + + ulg opt_len; /* bit length of current block with optimal trees */ + ulg static_len; /* bit length of current block with static trees */ + uInt matches; /* number of string matches in current block */ + int last_eob_len; /* bit length of EOB code for last block */ + +#ifdef DEBUG + ulg compressed_len; /* total bit length of compressed file mod 2^32 */ + ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ +#endif + + ush bi_buf; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + int bi_valid; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + +} FAR deflate_state; + +/* Output a byte on the stream. + * IN assertion: there is enough room in pending_buf. + */ +#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} + + +#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) +/* Minimum amount of lookahead, except at the end of the input file. + * See deflate.c for comments about the MIN_MATCH+1. + */ + +#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) +/* In order to simplify the code, particularly on 16 bit machines, match + * distances are limited to MAX_DIST instead of WSIZE. + */ + + /* in trees.c */ +void _tr_init OF((deflate_state *s)); +int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); +void _tr_align OF((deflate_state *s)); +void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, + int eof)); + +#define d_code(dist) \ + ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) +/* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. _dist_code[256] and _dist_code[257] are never + * used. + */ + +#ifndef DEBUG +/* Inline versions of _tr_tally for speed: */ + +#if defined(GEN_TREES_H) || !defined(STDC) + extern uch _length_code[]; + extern uch _dist_code[]; +#else + extern const uch _length_code[]; + extern const uch _dist_code[]; +#endif + +# define _tr_tally_lit(s, c, flush) \ + { uch cc = (c); \ + s->d_buf[s->last_lit] = 0; \ + s->l_buf[s->last_lit++] = cc; \ + s->dyn_ltree[cc].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +# define _tr_tally_dist(s, distance, length, flush) \ + { uch len = (length); \ + ush dist = (distance); \ + s->d_buf[s->last_lit] = dist; \ + s->l_buf[s->last_lit++] = len; \ + dist--; \ + s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ + s->dyn_dtree[d_code(dist)].Freq++; \ + flush = (s->last_lit == s->lit_bufsize-1); \ + } +#else +# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) +# define _tr_tally_dist(s, distance, length, flush) \ + flush = _tr_tally(s, distance, length) +#endif + +#endif /* DEFLATE_H */ diff --git a/third_party/windows/fltk-1.1.10/zlib/gzio.c b/third_party/windows/fltk-1.1.10/zlib/gzio.c new file mode 100644 index 0000000..0910f5f --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/gzio.c @@ -0,0 +1,1026 @@ +/* gzio.c -- IO on .gz files + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + * + * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. + */ + +/* @(#) $Id: gzio.c 5666 2007-02-06 22:02:28Z mike $ */ + +#include + +#include "zutil.h" + +#ifdef NO_DEFLATE /* for compatibility with old definition */ +# define NO_GZCOMPRESS +#endif + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +#ifndef Z_BUFSIZE +# ifdef MAXSEG_64K +# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ +# else +# define Z_BUFSIZE 16384 +# endif +#endif +#ifndef Z_PRINTF_BUFSIZE +# define Z_PRINTF_BUFSIZE 4096 +#endif + +#ifdef __MVS__ +# pragma map (fdopen , "\174\174FDOPEN") + FILE *fdopen(int, const char *); +#endif + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern void free OF((voidpf ptr)); +#endif + +#define ALLOC(size) malloc(size) +#define TRYFREE(p) {if (p) free(p);} + +static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ + +/* gzip flag byte */ +#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ +#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ +#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ +#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ +#define COMMENT 0x10 /* bit 4 set: file comment present */ +#define RESERVED 0xE0 /* bits 5..7: reserved */ + +typedef struct gz_stream { + z_stream stream; + int z_err; /* error code for last stream operation */ + int z_eof; /* set if end of input file */ + FILE *file; /* .gz file */ + Byte *inbuf; /* input buffer */ + Byte *outbuf; /* output buffer */ + uLong crc; /* crc32 of uncompressed data */ + char *msg; /* error message */ + char *path; /* path name for debugging only */ + int transparent; /* 1 if input file is not a .gz file */ + char mode; /* 'w' or 'r' */ + z_off_t start; /* start of compressed data in file (header skipped) */ + z_off_t in; /* bytes into deflate or inflate */ + z_off_t out; /* bytes out of deflate or inflate */ + int back; /* one character push-back */ + int last; /* true if push-back is last character */ +} gz_stream; + + +local gzFile gz_open OF((const char *path, const char *mode, int fd)); +local int do_flush OF((gzFile file, int flush)); +local int get_byte OF((gz_stream *s)); +local void check_header OF((gz_stream *s)); +local int destroy OF((gz_stream *s)); +local void putLong OF((FILE *file, uLong x)); +local uLong getLong OF((gz_stream *s)); + +/* =========================================================================== + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb"). The file is given either by file descriptor + or path name (if fd == -1). + gz_open returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). +*/ +local gzFile gz_open (path, mode, fd) + const char *path; + const char *mode; + int fd; +{ + int err; + int level = Z_DEFAULT_COMPRESSION; /* compression level */ + int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ + char *p = (char*)mode; + gz_stream *s; + char fmode[80]; /* copy of mode, without the compression level */ + char *m = fmode; + + if (!path || !mode) return Z_NULL; + + s = (gz_stream *)ALLOC(sizeof(gz_stream)); + if (!s) return Z_NULL; + + s->stream.zalloc = (alloc_func)0; + s->stream.zfree = (free_func)0; + s->stream.opaque = (voidpf)0; + s->stream.next_in = s->inbuf = Z_NULL; + s->stream.next_out = s->outbuf = Z_NULL; + s->stream.avail_in = s->stream.avail_out = 0; + s->file = NULL; + s->z_err = Z_OK; + s->z_eof = 0; + s->in = 0; + s->out = 0; + s->back = EOF; + s->crc = crc32(0L, Z_NULL, 0); + s->msg = NULL; + s->transparent = 0; + + s->path = (char*)ALLOC(strlen(path)+1); + if (s->path == NULL) { + return destroy(s), (gzFile)Z_NULL; + } + strcpy(s->path, path); /* do this early for debugging */ + + s->mode = '\0'; + do { + if (*p == 'r') s->mode = 'r'; + if (*p == 'w' || *p == 'a') s->mode = 'w'; + if (*p >= '0' && *p <= '9') { + level = *p - '0'; + } else if (*p == 'f') { + strategy = Z_FILTERED; + } else if (*p == 'h') { + strategy = Z_HUFFMAN_ONLY; + } else if (*p == 'R') { + strategy = Z_RLE; + } else { + *m++ = *p; /* copy the mode */ + } + } while (*p++ && m != fmode + sizeof(fmode)); + if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + err = Z_STREAM_ERROR; +#else + err = deflateInit2(&(s->stream), level, + Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); + /* windowBits is passed < 0 to suppress zlib header */ + + s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); +#endif + if (err != Z_OK || s->outbuf == Z_NULL) { + return destroy(s), (gzFile)Z_NULL; + } + } else { + s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); + + err = inflateInit2(&(s->stream), -MAX_WBITS); + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are + * present after the compressed stream. + */ + if (err != Z_OK || s->inbuf == Z_NULL) { + return destroy(s), (gzFile)Z_NULL; + } + } + s->stream.avail_out = Z_BUFSIZE; + + errno = 0; + s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); + + if (s->file == NULL) { + return destroy(s), (gzFile)Z_NULL; + } + if (s->mode == 'w') { + /* Write a very simple .gz header: + */ + fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], + Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); + s->start = 10L; + /* We use 10L instead of ftell(s->file) to because ftell causes an + * fflush on some systems. This version of the library doesn't use + * start anyway in write mode, so this initialization is not + * necessary. + */ + } else { + check_header(s); /* skip the .gz header */ + s->start = ftell(s->file) - s->stream.avail_in; + } + + return (gzFile)s; +} + +/* =========================================================================== + Opens a gzip (.gz) file for reading or writing. +*/ +gzFile ZEXPORT gzopen (path, mode) + const char *path; + const char *mode; +{ + return gz_open (path, mode, -1); +} + +/* =========================================================================== + Associate a gzFile with the file descriptor fd. fd is not dup'ed here + to mimic the behavio(u)r of fdopen. +*/ +gzFile ZEXPORT gzdopen (fd, mode) + int fd; + const char *mode; +{ + char name[46]; /* allow for up to 128-bit integers */ + + if (fd < 0) return (gzFile)Z_NULL; + sprintf(name, "", fd); /* for debugging */ + + return gz_open (name, mode, fd); +} + +/* =========================================================================== + * Update the compression level and strategy + */ +int ZEXPORT gzsetparams (file, level, strategy) + gzFile file; + int level; + int strategy; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + /* Make room to allow flushing */ + if (s->stream.avail_out == 0) { + + s->stream.next_out = s->outbuf; + if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { + s->z_err = Z_ERRNO; + } + s->stream.avail_out = Z_BUFSIZE; + } + + return deflateParams (&(s->stream), level, strategy); +} + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ +local int get_byte(s) + gz_stream *s; +{ + if (s->z_eof) return EOF; + if (s->stream.avail_in == 0) { + errno = 0; + s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); + if (s->stream.avail_in == 0) { + s->z_eof = 1; + if (ferror(s->file)) s->z_err = Z_ERRNO; + return EOF; + } + s->stream.next_in = s->inbuf; + } + s->stream.avail_in--; + return *(s->stream.next_in)++; +} + +/* =========================================================================== + Check the gzip header of a gz_stream opened for reading. Set the stream + mode to transparent if the gzip magic header is not present; set s->err + to Z_DATA_ERROR if the magic header is present but the rest of the header + is incorrect. + IN assertion: the stream s has already been created sucessfully; + s->stream.avail_in is zero for the first time, but may be non-zero + for concatenated .gz files. +*/ +local void check_header(s) + gz_stream *s; +{ + int method; /* method byte */ + int flags; /* flags byte */ + uInt len; + int c; + + /* Assure two bytes in the buffer so we can peek ahead -- handle case + where first byte of header is at the end of the buffer after the last + gzip segment */ + len = s->stream.avail_in; + if (len < 2) { + if (len) s->inbuf[0] = s->stream.next_in[0]; + errno = 0; + len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); + if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; + s->stream.avail_in += len; + s->stream.next_in = s->inbuf; + if (s->stream.avail_in < 2) { + s->transparent = s->stream.avail_in; + return; + } + } + + /* Peek ahead to check the gzip magic header */ + if (s->stream.next_in[0] != gz_magic[0] || + s->stream.next_in[1] != gz_magic[1]) { + s->transparent = 1; + return; + } + s->stream.avail_in -= 2; + s->stream.next_in += 2; + + /* Check the rest of the gzip header */ + method = get_byte(s); + flags = get_byte(s); + if (method != Z_DEFLATED || (flags & RESERVED) != 0) { + s->z_err = Z_DATA_ERROR; + return; + } + + /* Discard time, xflags and OS code: */ + for (len = 0; len < 6; len++) (void)get_byte(s); + + if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ + len = (uInt)get_byte(s); + len += ((uInt)get_byte(s))<<8; + /* len is garbage if EOF but the loop below will quit anyway */ + while (len-- != 0 && get_byte(s) != EOF) ; + } + if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ + while ((c = get_byte(s)) != 0 && c != EOF) ; + } + if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ + while ((c = get_byte(s)) != 0 && c != EOF) ; + } + if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ + for (len = 0; len < 2; len++) (void)get_byte(s); + } + s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; +} + + /* =========================================================================== + * Cleanup then free the given gz_stream. Return a zlib error code. + Try freeing in the reverse order of allocations. + */ +local int destroy (s) + gz_stream *s; +{ + int err = Z_OK; + + if (!s) return Z_STREAM_ERROR; + + TRYFREE(s->msg); + + if (s->stream.state != NULL) { + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + err = Z_STREAM_ERROR; +#else + err = deflateEnd(&(s->stream)); +#endif + } else if (s->mode == 'r') { + err = inflateEnd(&(s->stream)); + } + } + if (s->file != NULL && fclose(s->file)) { +#ifdef ESPIPE + if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ +#endif + err = Z_ERRNO; + } + if (s->z_err < 0) err = s->z_err; + + TRYFREE(s->inbuf); + TRYFREE(s->outbuf); + TRYFREE(s->path); + TRYFREE(s); + return err; +} + +/* =========================================================================== + Reads the given number of uncompressed bytes from the compressed file. + gzread returns the number of bytes actually read (0 for end of file). +*/ +int ZEXPORT gzread (file, buf, len) + gzFile file; + voidp buf; + unsigned len; +{ + gz_stream *s = (gz_stream*)file; + Bytef *start = (Bytef*)buf; /* starting point for crc computation */ + Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ + + if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; + + if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; + if (s->z_err == Z_STREAM_END) return 0; /* EOF */ + + next_out = (Byte*)buf; + s->stream.next_out = (Bytef*)buf; + s->stream.avail_out = len; + + if (s->stream.avail_out && s->back != EOF) { + *next_out++ = s->back; + s->stream.next_out++; + s->stream.avail_out--; + s->back = EOF; + s->out++; + start++; + if (s->last) { + s->z_err = Z_STREAM_END; + return 1; + } + } + + while (s->stream.avail_out != 0) { + + if (s->transparent) { + /* Copy first the lookahead bytes: */ + uInt n = s->stream.avail_in; + if (n > s->stream.avail_out) n = s->stream.avail_out; + if (n > 0) { + zmemcpy(s->stream.next_out, s->stream.next_in, n); + next_out += n; + s->stream.next_out = next_out; + s->stream.next_in += n; + s->stream.avail_out -= n; + s->stream.avail_in -= n; + } + if (s->stream.avail_out > 0) { + s->stream.avail_out -= + (uInt)fread(next_out, 1, s->stream.avail_out, s->file); + } + len -= s->stream.avail_out; + s->in += len; + s->out += len; + if (len == 0) s->z_eof = 1; + return (int)len; + } + if (s->stream.avail_in == 0 && !s->z_eof) { + + errno = 0; + s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); + if (s->stream.avail_in == 0) { + s->z_eof = 1; + if (ferror(s->file)) { + s->z_err = Z_ERRNO; + break; + } + } + s->stream.next_in = s->inbuf; + } + s->in += s->stream.avail_in; + s->out += s->stream.avail_out; + s->z_err = inflate(&(s->stream), Z_NO_FLUSH); + s->in -= s->stream.avail_in; + s->out -= s->stream.avail_out; + + if (s->z_err == Z_STREAM_END) { + /* Check CRC and original size */ + s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); + start = s->stream.next_out; + + if (getLong(s) != s->crc) { + s->z_err = Z_DATA_ERROR; + } else { + (void)getLong(s); + /* The uncompressed length returned by above getlong() may be + * different from s->out in case of concatenated .gz files. + * Check for such files: + */ + check_header(s); + if (s->z_err == Z_OK) { + inflateReset(&(s->stream)); + s->crc = crc32(0L, Z_NULL, 0); + } + } + } + if (s->z_err != Z_OK || s->z_eof) break; + } + s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); + + if (len == s->stream.avail_out && + (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) + return -1; + return (int)(len - s->stream.avail_out); +} + + +/* =========================================================================== + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ +int ZEXPORT gzgetc(file) + gzFile file; +{ + unsigned char c; + + return gzread(file, &c, 1) == 1 ? c : -1; +} + + +/* =========================================================================== + Push one byte back onto the stream. +*/ +int ZEXPORT gzungetc(c, file) + int c; + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; + s->back = c; + s->out--; + s->last = (s->z_err == Z_STREAM_END); + if (s->last) s->z_err = Z_OK; + s->z_eof = 0; + return c; +} + + +/* =========================================================================== + Reads bytes from the compressed file until len-1 characters are + read, or a newline character is read and transferred to buf, or an + end-of-file condition is encountered. The string is then terminated + with a null character. + gzgets returns buf, or Z_NULL in case of error. + + The current implementation is not optimized at all. +*/ +char * ZEXPORT gzgets(file, buf, len) + gzFile file; + char *buf; + int len; +{ + char *b = buf; + if (buf == Z_NULL || len <= 0) return Z_NULL; + + while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; + *buf = '\0'; + return b == buf && len > 0 ? Z_NULL : b; +} + + +#ifndef NO_GZCOMPRESS +/* =========================================================================== + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of bytes actually written (0 in case of error). +*/ +int ZEXPORT gzwrite (file, buf, len) + gzFile file; + voidpc buf; + unsigned len; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + s->stream.next_in = (Bytef*)buf; + s->stream.avail_in = len; + + while (s->stream.avail_in != 0) { + + if (s->stream.avail_out == 0) { + + s->stream.next_out = s->outbuf; + if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { + s->z_err = Z_ERRNO; + break; + } + s->stream.avail_out = Z_BUFSIZE; + } + s->in += s->stream.avail_in; + s->out += s->stream.avail_out; + s->z_err = deflate(&(s->stream), Z_NO_FLUSH); + s->in -= s->stream.avail_in; + s->out -= s->stream.avail_out; + if (s->z_err != Z_OK) break; + } + s->crc = crc32(s->crc, (const Bytef *)buf, len); + + return (int)(len - s->stream.avail_in); +} + + +/* =========================================================================== + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). +*/ +#ifdef STDC +#include + +int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) +{ + char buf[Z_PRINTF_BUFSIZE]; + va_list va; + int len; + + buf[sizeof(buf) - 1] = 0; + va_start(va, format); +#ifdef NO_vsnprintf +# ifdef HAS_vsprintf_void + (void)vsprintf(buf, format, va); + va_end(va); + for (len = 0; len < sizeof(buf); len++) + if (buf[len] == 0) break; +# else + len = vsprintf(buf, format, va); + va_end(va); +# endif +#else +# ifdef HAS_vsnprintf_void + (void)vsnprintf(buf, sizeof(buf), format, va); + va_end(va); + len = strlen(buf); +# else + len = vsnprintf(buf, sizeof(buf), format, va); + va_end(va); +# endif +#endif + if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) + return 0; + return gzwrite(file, buf, (unsigned)len); +} +#else /* not ANSI C */ + +int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) + gzFile file; + const char *format; + int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, + a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; +{ + char buf[Z_PRINTF_BUFSIZE]; + int len; + + buf[sizeof(buf) - 1] = 0; +#ifdef NO_snprintf +# ifdef HAS_sprintf_void + sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + for (len = 0; len < sizeof(buf); len++) + if (buf[len] == 0) break; +# else + len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#else +# ifdef HAS_snprintf_void + snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); + len = strlen(buf); +# else + len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, + a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); +# endif +#endif + if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) + return 0; + return gzwrite(file, buf, len); +} +#endif + +/* =========================================================================== + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ +int ZEXPORT gzputc(file, c) + gzFile file; + int c; +{ + unsigned char cc = (unsigned char) c; /* required for big endian systems */ + + return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; +} + + +/* =========================================================================== + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ +int ZEXPORT gzputs(file, s) + gzFile file; + const char *s; +{ + return gzwrite(file, (char*)s, (unsigned)strlen(s)); +} + + +/* =========================================================================== + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. +*/ +local int do_flush (file, flush) + gzFile file; + int flush; +{ + uInt len; + int done = 0; + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; + + s->stream.avail_in = 0; /* should be zero already anyway */ + + for (;;) { + len = Z_BUFSIZE - s->stream.avail_out; + + if (len != 0) { + if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { + s->z_err = Z_ERRNO; + return Z_ERRNO; + } + s->stream.next_out = s->outbuf; + s->stream.avail_out = Z_BUFSIZE; + } + if (done) break; + s->out += s->stream.avail_out; + s->z_err = deflate(&(s->stream), flush); + s->out -= s->stream.avail_out; + + /* Ignore the second of two consecutive flushes: */ + if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; + + /* deflate has finished flushing only when it hasn't used up + * all the available space in the output buffer: + */ + done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); + + if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; + } + return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; +} + +int ZEXPORT gzflush (file, flush) + gzFile file; + int flush; +{ + gz_stream *s = (gz_stream*)file; + int err = do_flush (file, flush); + + if (err) return err; + fflush(s->file); + return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; +} +#endif /* NO_GZCOMPRESS */ + +/* =========================================================================== + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error. + SEEK_END is not implemented, returns error. + In this version of the library, gzseek can be extremely slow. +*/ +z_off_t ZEXPORT gzseek (file, offset, whence) + gzFile file; + z_off_t offset; + int whence; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || whence == SEEK_END || + s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { + return -1L; + } + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + return -1L; +#else + if (whence == SEEK_SET) { + offset -= s->in; + } + if (offset < 0) return -1L; + + /* At this point, offset is the number of zero bytes to write. */ + if (s->inbuf == Z_NULL) { + s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ + if (s->inbuf == Z_NULL) return -1L; + zmemzero(s->inbuf, Z_BUFSIZE); + } + while (offset > 0) { + uInt size = Z_BUFSIZE; + if (offset < Z_BUFSIZE) size = (uInt)offset; + + size = gzwrite(file, s->inbuf, size); + if (size == 0) return -1L; + + offset -= size; + } + return s->in; +#endif + } + /* Rest of function is for reading only */ + + /* compute absolute position */ + if (whence == SEEK_CUR) { + offset += s->out; + } + if (offset < 0) return -1L; + + if (s->transparent) { + /* map to fseek */ + s->back = EOF; + s->stream.avail_in = 0; + s->stream.next_in = s->inbuf; + if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; + + s->in = s->out = offset; + return offset; + } + + /* For a negative seek, rewind and use positive seek */ + if (offset >= s->out) { + offset -= s->out; + } else if (gzrewind(file) < 0) { + return -1L; + } + /* offset is now the number of bytes to skip. */ + + if (offset != 0 && s->outbuf == Z_NULL) { + s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); + if (s->outbuf == Z_NULL) return -1L; + } + if (offset && s->back != EOF) { + s->back = EOF; + s->out++; + offset--; + if (s->last) s->z_err = Z_STREAM_END; + } + while (offset > 0) { + int size = Z_BUFSIZE; + if (offset < Z_BUFSIZE) size = (int)offset; + + size = gzread(file, s->outbuf, (uInt)size); + if (size <= 0) return -1L; + offset -= size; + } + return s->out; +} + +/* =========================================================================== + Rewinds input file. +*/ +int ZEXPORT gzrewind (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r') return -1; + + s->z_err = Z_OK; + s->z_eof = 0; + s->back = EOF; + s->stream.avail_in = 0; + s->stream.next_in = s->inbuf; + s->crc = crc32(0L, Z_NULL, 0); + if (!s->transparent) (void)inflateReset(&s->stream); + s->in = 0; + s->out = 0; + return fseek(s->file, s->start, SEEK_SET); +} + +/* =========================================================================== + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. +*/ +z_off_t ZEXPORT gztell (file) + gzFile file; +{ + return gzseek(file, 0L, SEEK_CUR); +} + +/* =========================================================================== + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ +int ZEXPORT gzeof (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + /* With concatenated compressed files that can have embedded + * crc trailers, z_eof is no longer the only/best indicator of EOF + * on a gz_stream. Handle end-of-stream error explicitly here. + */ + if (s == NULL || s->mode != 'r') return 0; + if (s->z_eof) return 1; + return s->z_err == Z_STREAM_END; +} + +/* =========================================================================== + Returns 1 if reading and doing so transparently, otherwise zero. +*/ +int ZEXPORT gzdirect (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL || s->mode != 'r') return 0; + return s->transparent; +} + +/* =========================================================================== + Outputs a long in LSB order to the given file +*/ +local void putLong (file, x) + FILE *file; + uLong x; +{ + int n; + for (n = 0; n < 4; n++) { + fputc((int)(x & 0xff), file); + x >>= 8; + } +} + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets z_err in case + of error. +*/ +local uLong getLong (s) + gz_stream *s; +{ + uLong x = (uLong)get_byte(s); + int c; + + x += ((uLong)get_byte(s))<<8; + x += ((uLong)get_byte(s))<<16; + c = get_byte(s); + if (c == EOF) s->z_err = Z_DATA_ERROR; + x += ((uLong)c)<<24; + return x; +} + +/* =========================================================================== + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. +*/ +int ZEXPORT gzclose (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL) return Z_STREAM_ERROR; + + if (s->mode == 'w') { +#ifdef NO_GZCOMPRESS + return Z_STREAM_ERROR; +#else + if (do_flush (file, Z_FINISH) != Z_OK) + return destroy((gz_stream*)file); + + putLong (s->file, s->crc); + putLong (s->file, (uLong)(s->in & 0xffffffff)); +#endif + } + return destroy((gz_stream*)file); +} + +#ifdef STDC +# define zstrerror(errnum) strerror(errnum) +#else +# define zstrerror(errnum) "" +#endif + +/* =========================================================================== + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ +const char * ZEXPORT gzerror (file, errnum) + gzFile file; + int *errnum; +{ + char *m; + gz_stream *s = (gz_stream*)file; + + if (s == NULL) { + *errnum = Z_STREAM_ERROR; + return (const char*)ERR_MSG(Z_STREAM_ERROR); + } + *errnum = s->z_err; + if (*errnum == Z_OK) return (const char*)""; + + m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); + + if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); + + TRYFREE(s->msg); + s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); + if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); + strcpy(s->msg, s->path); + strcat(s->msg, ": "); + strcat(s->msg, m); + return (const char*)s->msg; +} + +/* =========================================================================== + Clear the error and end-of-file flags, and do the same for the real file. +*/ +void ZEXPORT gzclearerr (file) + gzFile file; +{ + gz_stream *s = (gz_stream*)file; + + if (s == NULL) return; + if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; + s->z_eof = 0; + clearerr(s->file); +} diff --git a/third_party/windows/fltk-1.1.10/zlib/inffast.c b/third_party/windows/fltk-1.1.10/zlib/inffast.c new file mode 100644 index 0000000..fa31cad --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/inffast.c @@ -0,0 +1,318 @@ +/* inffast.c -- fast decoding + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifndef ASMINF + +/* Allow machine dependent optimization for post-increment or pre-increment. + Based on testing to date, + Pre-increment preferred for: + - PowerPC G3 (Adler) + - MIPS R5000 (Randers-Pehrson) + Post-increment preferred for: + - none + No measurable difference: + - Pentium III (Anderson) + - M68060 (Nikl) + */ +#ifdef POSTINC +# define OFF 0 +# define PUP(a) *(a)++ +#else +# define OFF 1 +# define PUP(a) *++(a) +#endif + +/* + Decode literal, length, and distance codes and write out the resulting + literal and match bytes until either not enough input or output is + available, an end-of-block is encountered, or a data error is encountered. + When large enough input and output buffers are supplied to inflate(), for + example, a 16K input buffer and a 64K output buffer, more than 95% of the + inflate execution time is spent in this routine. + + Entry assumptions: + + state->mode == LEN + strm->avail_in >= 6 + strm->avail_out >= 258 + start >= strm->avail_out + state->bits < 8 + + On return, state->mode is one of: + + LEN -- ran out of enough output space or enough available input + TYPE -- reached end of block code, inflate() to interpret next block + BAD -- error in block data + + Notes: + + - The maximum input bits used by a length/distance pair is 15 bits for the + length code, 5 bits for the length extra, 15 bits for the distance code, + and 13 bits for the distance extra. This totals 48 bits, or six bytes. + Therefore if strm->avail_in >= 6, then there is enough input to avoid + checking for available input while decoding. + + - The maximum bytes that a single length/distance pair can output is 258 + bytes, which is the maximum length that can be coded. inflate_fast() + requires strm->avail_out >= 258 for each loop to avoid checking for + output space. + */ +void inflate_fast(strm, start) +z_streamp strm; +unsigned start; /* inflate()'s starting value for strm->avail_out */ +{ + struct inflate_state FAR *state; + unsigned char FAR *in; /* local strm->next_in */ + unsigned char FAR *last; /* while in < last, enough input available */ + unsigned char FAR *out; /* local strm->next_out */ + unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ + unsigned char FAR *end; /* while out < end, enough space available */ +#ifdef INFLATE_STRICT + unsigned dmax; /* maximum distance from zlib header */ +#endif + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ + unsigned long hold; /* local strm->hold */ + unsigned bits; /* local strm->bits */ + code const FAR *lcode; /* local strm->lencode */ + code const FAR *dcode; /* local strm->distcode */ + unsigned lmask; /* mask for first level of length codes */ + unsigned dmask; /* mask for first level of distance codes */ + code this; /* retrieved table entry */ + unsigned op; /* code bits, operation, extra bits, or */ + /* window position, window bytes to copy */ + unsigned len; /* match length, unused bytes */ + unsigned dist; /* match distance */ + unsigned char FAR *from; /* where to copy match from */ + + /* copy state to local variables */ + state = (struct inflate_state FAR *)strm->state; + in = strm->next_in - OFF; + last = in + (strm->avail_in - 5); + out = strm->next_out - OFF; + beg = out - (start - strm->avail_out); + end = out + (strm->avail_out - 257); +#ifdef INFLATE_STRICT + dmax = state->dmax; +#endif + wsize = state->wsize; + whave = state->whave; + write = state->write; + window = state->window; + hold = state->hold; + bits = state->bits; + lcode = state->lencode; + dcode = state->distcode; + lmask = (1U << state->lenbits) - 1; + dmask = (1U << state->distbits) - 1; + + /* decode literals and length/distances until end-of-block or not enough + input data or output space */ + do { + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = lcode[hold & lmask]; + dolen: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op == 0) { /* literal */ + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + PUP(out) = (unsigned char)(this.val); + } + else if (op & 16) { /* length base */ + len = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (op) { + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + len += (unsigned)hold & ((1U << op) - 1); + hold >>= op; + bits -= op; + } + Tracevv((stderr, "inflate: length %u\n", len)); + if (bits < 15) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + this = dcode[hold & dmask]; + dodist: + op = (unsigned)(this.bits); + hold >>= op; + bits -= op; + op = (unsigned)(this.op); + if (op & 16) { /* distance base */ + dist = (unsigned)(this.val); + op &= 15; /* number of extra bits */ + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + if (bits < op) { + hold += (unsigned long)(PUP(in)) << bits; + bits += 8; + } + } + dist += (unsigned)hold & ((1U << op) - 1); +#ifdef INFLATE_STRICT + if (dist > dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + hold >>= op; + bits -= op; + Tracevv((stderr, "inflate: distance %u\n", dist)); + op = (unsigned)(out - beg); /* max distance in output */ + if (dist > op) { /* see if copy from window */ + op = dist - op; /* distance back in window */ + if (op > whave) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + from = window - OFF; + if (write == 0) { /* very common case */ + from += wsize - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + else if (write < op) { /* wrap around window */ + from += wsize + write - op; + op -= write; + if (op < len) { /* some from end of window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = window - OFF; + if (write < len) { /* some from start of window */ + op = write; + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + } + else { /* contiguous in window */ + from += write - op; + if (op < len) { /* some from window */ + len -= op; + do { + PUP(out) = PUP(from); + } while (--op); + from = out - dist; /* rest from output */ + } + } + while (len > 2) { + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + else { + from = out - dist; /* copy direct from output */ + do { /* minimum length is three */ + PUP(out) = PUP(from); + PUP(out) = PUP(from); + PUP(out) = PUP(from); + len -= 3; + } while (len > 2); + if (len) { + PUP(out) = PUP(from); + if (len > 1) + PUP(out) = PUP(from); + } + } + } + else if ((op & 64) == 0) { /* 2nd level distance code */ + this = dcode[this.val + (hold & ((1U << op) - 1))]; + goto dodist; + } + else { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + } + else if ((op & 64) == 0) { /* 2nd level length code */ + this = lcode[this.val + (hold & ((1U << op) - 1))]; + goto dolen; + } + else if (op & 32) { /* end-of-block */ + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + else { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + } while (in < last && out < end); + + /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ + len = bits >> 3; + in -= len; + bits -= len << 3; + hold &= (1U << bits) - 1; + + /* update state and return */ + strm->next_in = in + OFF; + strm->next_out = out + OFF; + strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); + strm->avail_out = (unsigned)(out < end ? + 257 + (end - out) : 257 - (out - end)); + state->hold = hold; + state->bits = bits; + return; +} + +/* + inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): + - Using bit fields for code structure + - Different op definition to avoid & for extra bits (do & for table bits) + - Three separate decoding do-loops for direct, window, and write == 0 + - Special case for distance > 1 copies to do overlapped load and store copy + - Explicit branch predictions (based on measured branch probabilities) + - Deferring match copy and interspersed it with decoding subsequent codes + - Swapping literal/length else + - Swapping window/direct else + - Larger unrolled copy loops (three is about right) + - Moving len -= 3 statement into middle of loop + */ + +#endif /* !ASMINF */ diff --git a/third_party/windows/fltk-1.1.10/zlib/inffast.h b/third_party/windows/fltk-1.1.10/zlib/inffast.h new file mode 100644 index 0000000..614fa78 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/inffast.h @@ -0,0 +1,11 @@ +/* inffast.h -- header to use inffast.c + * Copyright (C) 1995-2003 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +void inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/third_party/windows/fltk-1.1.10/zlib/inffixed.h b/third_party/windows/fltk-1.1.10/zlib/inffixed.h new file mode 100644 index 0000000..423d5c5 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/inffixed.h @@ -0,0 +1,94 @@ + /* inffixed.h -- table for decoding fixed codes + * Generated automatically by makefixed(). + */ + + /* WARNING: this file should *not* be used by applications. It + is part of the implementation of the compression library and + is subject to change. Applications should only use zlib.h. + */ + + static const code lenfix[512] = { + {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, + {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, + {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, + {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, + {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, + {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, + {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, + {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, + {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, + {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, + {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, + {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, + {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, + {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, + {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, + {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, + {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, + {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, + {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, + {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, + {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, + {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, + {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, + {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, + {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, + {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, + {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, + {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, + {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, + {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, + {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, + {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, + {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, + {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, + {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, + {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, + {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, + {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, + {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, + {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, + {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, + {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, + {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, + {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, + {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, + {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, + {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, + {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, + {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, + {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, + {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, + {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, + {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, + {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, + {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, + {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, + {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, + {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, + {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, + {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, + {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, + {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, + {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, + {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, + {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, + {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, + {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, + {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, + {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, + {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, + {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, + {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, + {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, + {0,9,255} + }; + + static const code distfix[32] = { + {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, + {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, + {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, + {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, + {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, + {22,5,193},{64,5,0} + }; diff --git a/third_party/windows/fltk-1.1.10/zlib/inflate.c b/third_party/windows/fltk-1.1.10/zlib/inflate.c new file mode 100644 index 0000000..33ea902 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/inflate.c @@ -0,0 +1,1368 @@ +/* inflate.c -- zlib decompression + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * Change history: + * + * 1.2.beta0 24 Nov 2002 + * - First version -- complete rewrite of inflate to simplify code, avoid + * creation of window when not needed, minimize use of window when it is + * needed, make inffast.c even faster, implement gzip decoding, and to + * improve code readability and style over the previous zlib inflate code + * + * 1.2.beta1 25 Nov 2002 + * - Use pointers for available input and output checking in inffast.c + * - Remove input and output counters in inffast.c + * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 + * - Remove unnecessary second byte pull from length extra in inffast.c + * - Unroll direct copy to three copies per loop in inffast.c + * + * 1.2.beta2 4 Dec 2002 + * - Change external routine names to reduce potential conflicts + * - Correct filename to inffixed.h for fixed tables in inflate.c + * - Make hbuf[] unsigned char to match parameter type in inflate.c + * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) + * to avoid negation problem on Alphas (64 bit) in inflate.c + * + * 1.2.beta3 22 Dec 2002 + * - Add comments on state->bits assertion in inffast.c + * - Add comments on op field in inftrees.h + * - Fix bug in reuse of allocated window after inflateReset() + * - Remove bit fields--back to byte structure for speed + * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths + * - Change post-increments to pre-increments in inflate_fast(), PPC biased? + * - Add compile time option, POSTINC, to use post-increments instead (Intel?) + * - Make MATCH copy in inflate() much faster for when inflate_fast() not used + * - Use local copies of stream next and avail values, as well as local bit + * buffer and bit count in inflate()--for speed when inflate_fast() not used + * + * 1.2.beta4 1 Jan 2003 + * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings + * - Move a comment on output buffer sizes from inffast.c to inflate.c + * - Add comments in inffast.c to introduce the inflate_fast() routine + * - Rearrange window copies in inflate_fast() for speed and simplification + * - Unroll last copy for window match in inflate_fast() + * - Use local copies of window variables in inflate_fast() for speed + * - Pull out common write == 0 case for speed in inflate_fast() + * - Make op and len in inflate_fast() unsigned for consistency + * - Add FAR to lcode and dcode declarations in inflate_fast() + * - Simplified bad distance check in inflate_fast() + * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new + * source file infback.c to provide a call-back interface to inflate for + * programs like gzip and unzip -- uses window as output buffer to avoid + * window copying + * + * 1.2.beta5 1 Jan 2003 + * - Improved inflateBack() interface to allow the caller to provide initial + * input in strm. + * - Fixed stored blocks bug in inflateBack() + * + * 1.2.beta6 4 Jan 2003 + * - Added comments in inffast.c on effectiveness of POSTINC + * - Typecasting all around to reduce compiler warnings + * - Changed loops from while (1) or do {} while (1) to for (;;), again to + * make compilers happy + * - Changed type of window in inflateBackInit() to unsigned char * + * + * 1.2.beta7 27 Jan 2003 + * - Changed many types to unsigned or unsigned short to avoid warnings + * - Added inflateCopy() function + * + * 1.2.0 9 Mar 2003 + * - Changed inflateBack() interface to provide separate opaque descriptors + * for the in() and out() functions + * - Changed inflateBack() argument and in_func typedef to swap the length + * and buffer address return values for the input function + * - Check next_in and next_out for Z_NULL on entry to inflate() + * + * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. + */ + +#include "zutil.h" +#include "inftrees.h" +#include "inflate.h" +#include "inffast.h" + +#ifdef MAKEFIXED +# ifndef BUILDFIXED +# define BUILDFIXED +# endif +#endif + +/* function prototypes */ +local void fixedtables OF((struct inflate_state FAR *state)); +local int updatewindow OF((z_streamp strm, unsigned out)); +#ifdef BUILDFIXED + void makefixed OF((void)); +#endif +local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, + unsigned len)); + +int ZEXPORT inflateReset(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + strm->total_in = strm->total_out = state->total = 0; + strm->msg = Z_NULL; + strm->adler = 1; /* to support ill-conceived Java test suite */ + state->mode = HEAD; + state->last = 0; + state->havedict = 0; + state->dmax = 32768U; + state->head = Z_NULL; + state->wsize = 0; + state->whave = 0; + state->write = 0; + state->hold = 0; + state->bits = 0; + state->lencode = state->distcode = state->next = state->codes; + Tracev((stderr, "inflate: reset\n")); + return Z_OK; +} + +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + +int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) +z_streamp strm; +int windowBits; +const char *version; +int stream_size; +{ + struct inflate_state FAR *state; + + if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || + stream_size != (int)(sizeof(z_stream))) + return Z_VERSION_ERROR; + if (strm == Z_NULL) return Z_STREAM_ERROR; + strm->msg = Z_NULL; /* in case we return an error */ + if (strm->zalloc == (alloc_func)0) { + strm->zalloc = zcalloc; + strm->opaque = (voidpf)0; + } + if (strm->zfree == (free_func)0) strm->zfree = zcfree; + state = (struct inflate_state FAR *) + ZALLOC(strm, 1, sizeof(struct inflate_state)); + if (state == Z_NULL) return Z_MEM_ERROR; + Tracev((stderr, "inflate: allocated\n")); + strm->state = (struct internal_state FAR *)state; + if (windowBits < 0) { + state->wrap = 0; + windowBits = -windowBits; + } + else { + state->wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) windowBits &= 15; +#endif + } + if (windowBits < 8 || windowBits > 15) { + ZFREE(strm, state); + strm->state = Z_NULL; + return Z_STREAM_ERROR; + } + state->wbits = (unsigned)windowBits; + state->window = Z_NULL; + return inflateReset(strm); +} + +int ZEXPORT inflateInit_(strm, version, stream_size) +z_streamp strm; +const char *version; +int stream_size; +{ + return inflateInit2_(strm, DEF_WBITS, version, stream_size); +} + +/* + Return state with length and distance decoding tables and index sizes set to + fixed code decoding. Normally this returns fixed tables from inffixed.h. + If BUILDFIXED is defined, then instead this routine builds the tables the + first time it's called, and returns those tables the first time and + thereafter. This reduces the size of the code by about 2K bytes, in + exchange for a little execution time. However, BUILDFIXED should not be + used for threaded applications, since the rewriting of the tables and virgin + may not be thread-safe. + */ +local void fixedtables(state) +struct inflate_state FAR *state; +{ +#ifdef BUILDFIXED + static int virgin = 1; + static code *lenfix, *distfix; + static code fixed[544]; + + /* build fixed huffman tables if first call (may not be thread safe) */ + if (virgin) { + unsigned sym, bits; + static code *next; + + /* literal/length table */ + sym = 0; + while (sym < 144) state->lens[sym++] = 8; + while (sym < 256) state->lens[sym++] = 9; + while (sym < 280) state->lens[sym++] = 7; + while (sym < 288) state->lens[sym++] = 8; + next = fixed; + lenfix = next; + bits = 9; + inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); + + /* distance table */ + sym = 0; + while (sym < 32) state->lens[sym++] = 5; + distfix = next; + bits = 5; + inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); + + /* do this just once */ + virgin = 0; + } +#else /* !BUILDFIXED */ +# include "inffixed.h" +#endif /* BUILDFIXED */ + state->lencode = lenfix; + state->lenbits = 9; + state->distcode = distfix; + state->distbits = 5; +} + +#ifdef MAKEFIXED +#include + +/* + Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also + defines BUILDFIXED, so the tables are built on the fly. makefixed() writes + those tables to stdout, which would be piped to inffixed.h. A small program + can simply call makefixed to do this: + + void makefixed(void); + + int main(void) + { + makefixed(); + return 0; + } + + Then that can be linked with zlib built with MAKEFIXED defined and run: + + a.out > inffixed.h + */ +void makefixed() +{ + unsigned low, size; + struct inflate_state state; + + fixedtables(&state); + puts(" /* inffixed.h -- table for decoding fixed codes"); + puts(" * Generated automatically by makefixed()."); + puts(" */"); + puts(""); + puts(" /* WARNING: this file should *not* be used by applications."); + puts(" It is part of the implementation of this library and is"); + puts(" subject to change. Applications should only use zlib.h."); + puts(" */"); + puts(""); + size = 1U << 9; + printf(" static const code lenfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 7) == 0) printf("\n "); + printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, + state.lencode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); + size = 1U << 5; + printf("\n static const code distfix[%u] = {", size); + low = 0; + for (;;) { + if ((low % 6) == 0) printf("\n "); + printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, + state.distcode[low].val); + if (++low == size) break; + putchar(','); + } + puts("\n };"); +} +#endif /* MAKEFIXED */ + +/* + Update the window with the last wsize (normally 32K) bytes written before + returning. If window does not exist yet, create it. This is only called + when a window is already in use, or when output has been written during this + inflate call, but the end of the deflate stream has not been reached yet. + It is also called to create a window for dictionary data when a dictionary + is loaded. + + Providing output buffers larger than 32K to inflate() should provide a speed + advantage, since only the last 32K of output is copied to the sliding window + upon return from inflate(), and since all distances after the first 32K of + output will fall in the output data, making match copies simpler and faster. + The advantage may be dependent on the size of the processor's data caches. + */ +local int updatewindow(strm, out) +z_streamp strm; +unsigned out; +{ + struct inflate_state FAR *state; + unsigned copy, dist; + + state = (struct inflate_state FAR *)strm->state; + + /* if it hasn't been done already, allocate space for the window */ + if (state->window == Z_NULL) { + state->window = (unsigned char FAR *) + ZALLOC(strm, 1U << state->wbits, + sizeof(unsigned char)); + if (state->window == Z_NULL) return 1; + } + + /* if window not in use yet, initialize */ + if (state->wsize == 0) { + state->wsize = 1U << state->wbits; + state->write = 0; + state->whave = 0; + } + + /* copy state->wsize or less output bytes into the circular window */ + copy = out - strm->avail_out; + if (copy >= state->wsize) { + zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); + state->write = 0; + state->whave = state->wsize; + } + else { + dist = state->wsize - state->write; + if (dist > copy) dist = copy; + zmemcpy(state->window + state->write, strm->next_out - copy, dist); + copy -= dist; + if (copy) { + zmemcpy(state->window, strm->next_out - copy, copy); + state->write = copy; + state->whave = state->wsize; + } + else { + state->write += dist; + if (state->write == state->wsize) state->write = 0; + if (state->whave < state->wsize) state->whave += dist; + } + } + return 0; +} + +/* Macros for inflate(): */ + +/* check function to use adler32() for zlib or crc32() for gzip */ +#ifdef GUNZIP +# define UPDATE(check, buf, len) \ + (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) +#else +# define UPDATE(check, buf, len) adler32(check, buf, len) +#endif + +/* check macros for header crc */ +#ifdef GUNZIP +# define CRC2(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + check = crc32(check, hbuf, 2); \ + } while (0) + +# define CRC4(check, word) \ + do { \ + hbuf[0] = (unsigned char)(word); \ + hbuf[1] = (unsigned char)((word) >> 8); \ + hbuf[2] = (unsigned char)((word) >> 16); \ + hbuf[3] = (unsigned char)((word) >> 24); \ + check = crc32(check, hbuf, 4); \ + } while (0) +#endif + +/* Load registers with state in inflate() for speed */ +#define LOAD() \ + do { \ + put = strm->next_out; \ + left = strm->avail_out; \ + next = strm->next_in; \ + have = strm->avail_in; \ + hold = state->hold; \ + bits = state->bits; \ + } while (0) + +/* Restore state from registers in inflate() */ +#define RESTORE() \ + do { \ + strm->next_out = put; \ + strm->avail_out = left; \ + strm->next_in = next; \ + strm->avail_in = have; \ + state->hold = hold; \ + state->bits = bits; \ + } while (0) + +/* Clear the input bit accumulator */ +#define INITBITS() \ + do { \ + hold = 0; \ + bits = 0; \ + } while (0) + +/* Get a byte of input into the bit accumulator, or return from inflate() + if there is no input available. */ +#define PULLBYTE() \ + do { \ + if (have == 0) goto inf_leave; \ + have--; \ + hold += (unsigned long)(*next++) << bits; \ + bits += 8; \ + } while (0) + +/* Assure that there are at least n bits in the bit accumulator. If there is + not enough available input to do that, then return from inflate(). */ +#define NEEDBITS(n) \ + do { \ + while (bits < (unsigned)(n)) \ + PULLBYTE(); \ + } while (0) + +/* Return the low n bits of the bit accumulator (n < 16) */ +#define BITS(n) \ + ((unsigned)hold & ((1U << (n)) - 1)) + +/* Remove n bits from the bit accumulator */ +#define DROPBITS(n) \ + do { \ + hold >>= (n); \ + bits -= (unsigned)(n); \ + } while (0) + +/* Remove zero to seven bits as needed to go to a byte boundary */ +#define BYTEBITS() \ + do { \ + hold >>= bits & 7; \ + bits -= bits & 7; \ + } while (0) + +/* Reverse the bytes in a 32-bit value */ +#define REVERSE(q) \ + ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ + (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) + +/* + inflate() uses a state machine to process as much input data and generate as + much output data as possible before returning. The state machine is + structured roughly as follows: + + for (;;) switch (state) { + ... + case STATEn: + if (not enough input data or output space to make progress) + return; + ... make progress ... + state = STATEm; + break; + ... + } + + so when inflate() is called again, the same case is attempted again, and + if the appropriate resources are provided, the machine proceeds to the + next state. The NEEDBITS() macro is usually the way the state evaluates + whether it can proceed or should return. NEEDBITS() does the return if + the requested bits are not available. The typical use of the BITS macros + is: + + NEEDBITS(n); + ... do something with BITS(n) ... + DROPBITS(n); + + where NEEDBITS(n) either returns from inflate() if there isn't enough + input left to load n bits into the accumulator, or it continues. BITS(n) + gives the low n bits in the accumulator. When done, DROPBITS(n) drops + the low n bits off the accumulator. INITBITS() clears the accumulator + and sets the number of available bits to zero. BYTEBITS() discards just + enough bits to put the accumulator on a byte boundary. After BYTEBITS() + and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. + + NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return + if there is no input available. The decoding of variable length codes uses + PULLBYTE() directly in order to pull just enough bytes to decode the next + code, and no more. + + Some states loop until they get enough input, making sure that enough + state information is maintained to continue the loop where it left off + if NEEDBITS() returns in the loop. For example, want, need, and keep + would all have to actually be part of the saved state in case NEEDBITS() + returns: + + case STATEw: + while (want < need) { + NEEDBITS(n); + keep[want++] = BITS(n); + DROPBITS(n); + } + state = STATEx; + case STATEx: + + As shown above, if the next state is also the next case, then the break + is omitted. + + A state may also return if there is not enough output space available to + complete that state. Those states are copying stored data, writing a + literal byte, and copying a matching string. + + When returning, a "goto inf_leave" is used to update the total counters, + update the check value, and determine whether any progress has been made + during that inflate() call in order to return the proper return code. + Progress is defined as a change in either strm->avail_in or strm->avail_out. + When there is a window, goto inf_leave will update the window with the last + output written. If a goto inf_leave occurs in the middle of decompression + and there is no window currently, goto inf_leave will create one and copy + output to the window for the next call of inflate(). + + In this implementation, the flush parameter of inflate() only affects the + return code (per zlib.h). inflate() always writes as much as possible to + strm->next_out, given the space available and the provided input--the effect + documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers + the allocation of and copying into a sliding window until necessary, which + provides the effect documented in zlib.h for Z_FINISH when the entire input + stream available. So the only thing the flush parameter actually does is: + when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it + will return Z_BUF_ERROR if it has not reached the end of the stream. + */ + +int ZEXPORT inflate(strm, flush) +z_streamp strm; +int flush; +{ + struct inflate_state FAR *state; + unsigned char FAR *next; /* next input */ + unsigned char FAR *put; /* next output */ + unsigned have, left; /* available input and output */ + unsigned long hold; /* bit buffer */ + unsigned bits; /* bits in bit buffer */ + unsigned in, out; /* save starting available input and output */ + unsigned copy; /* number of stored or match bytes to copy */ + unsigned char FAR *from; /* where to copy match bytes from */ + code this; /* current decoding table entry */ + code last; /* parent table entry */ + unsigned len; /* length to copy for repeats, bits to drop */ + int ret; /* return code */ +#ifdef GUNZIP + unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ +#endif + static const unsigned short order[19] = /* permutation of code lengths */ + {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; + + if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || + (strm->next_in == Z_NULL && strm->avail_in != 0)) + return Z_STREAM_ERROR; + + state = (struct inflate_state FAR *)strm->state; + if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ + LOAD(); + in = have; + out = left; + ret = Z_OK; + for (;;) + switch (state->mode) { + case HEAD: + if (state->wrap == 0) { + state->mode = TYPEDO; + break; + } + NEEDBITS(16); +#ifdef GUNZIP + if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ + state->check = crc32(0L, Z_NULL, 0); + CRC2(state->check, hold); + INITBITS(); + state->mode = FLAGS; + break; + } + state->flags = 0; /* expect zlib header */ + if (state->head != Z_NULL) + state->head->done = -1; + if (!(state->wrap & 1) || /* check if zlib header allowed */ +#else + if ( +#endif + ((BITS(8) << 8) + (hold >> 8)) % 31) { + strm->msg = (char *)"incorrect header check"; + state->mode = BAD; + break; + } + if (BITS(4) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + DROPBITS(4); + len = BITS(4) + 8; + if (len > state->wbits) { + strm->msg = (char *)"invalid window size"; + state->mode = BAD; + break; + } + state->dmax = 1U << len; + Tracev((stderr, "inflate: zlib header ok\n")); + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = hold & 0x200 ? DICTID : TYPE; + INITBITS(); + break; +#ifdef GUNZIP + case FLAGS: + NEEDBITS(16); + state->flags = (int)(hold); + if ((state->flags & 0xff) != Z_DEFLATED) { + strm->msg = (char *)"unknown compression method"; + state->mode = BAD; + break; + } + if (state->flags & 0xe000) { + strm->msg = (char *)"unknown header flags set"; + state->mode = BAD; + break; + } + if (state->head != Z_NULL) + state->head->text = (int)((hold >> 8) & 1); + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = TIME; + case TIME: + NEEDBITS(32); + if (state->head != Z_NULL) + state->head->time = hold; + if (state->flags & 0x0200) CRC4(state->check, hold); + INITBITS(); + state->mode = OS; + case OS: + NEEDBITS(16); + if (state->head != Z_NULL) { + state->head->xflags = (int)(hold & 0xff); + state->head->os = (int)(hold >> 8); + } + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + state->mode = EXLEN; + case EXLEN: + if (state->flags & 0x0400) { + NEEDBITS(16); + state->length = (unsigned)(hold); + if (state->head != Z_NULL) + state->head->extra_len = (unsigned)hold; + if (state->flags & 0x0200) CRC2(state->check, hold); + INITBITS(); + } + else if (state->head != Z_NULL) + state->head->extra = Z_NULL; + state->mode = EXTRA; + case EXTRA: + if (state->flags & 0x0400) { + copy = state->length; + if (copy > have) copy = have; + if (copy) { + if (state->head != Z_NULL && + state->head->extra != Z_NULL) { + len = state->head->extra_len - state->length; + zmemcpy(state->head->extra + len, next, + len + copy > state->head->extra_max ? + state->head->extra_max - len : copy); + } + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + state->length -= copy; + } + if (state->length) goto inf_leave; + } + state->length = 0; + state->mode = NAME; + case NAME: + if (state->flags & 0x0800) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->name != Z_NULL && + state->length < state->head->name_max) + state->head->name[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->name = Z_NULL; + state->length = 0; + state->mode = COMMENT; + case COMMENT: + if (state->flags & 0x1000) { + if (have == 0) goto inf_leave; + copy = 0; + do { + len = (unsigned)(next[copy++]); + if (state->head != Z_NULL && + state->head->comment != Z_NULL && + state->length < state->head->comm_max) + state->head->comment[state->length++] = len; + } while (len && copy < have); + if (state->flags & 0x0200) + state->check = crc32(state->check, next, copy); + have -= copy; + next += copy; + if (len) goto inf_leave; + } + else if (state->head != Z_NULL) + state->head->comment = Z_NULL; + state->mode = HCRC; + case HCRC: + if (state->flags & 0x0200) { + NEEDBITS(16); + if (hold != (state->check & 0xffff)) { + strm->msg = (char *)"header crc mismatch"; + state->mode = BAD; + break; + } + INITBITS(); + } + if (state->head != Z_NULL) { + state->head->hcrc = (int)((state->flags >> 9) & 1); + state->head->done = 1; + } + strm->adler = state->check = crc32(0L, Z_NULL, 0); + state->mode = TYPE; + break; +#endif + case DICTID: + NEEDBITS(32); + strm->adler = state->check = REVERSE(hold); + INITBITS(); + state->mode = DICT; + case DICT: + if (state->havedict == 0) { + RESTORE(); + return Z_NEED_DICT; + } + strm->adler = state->check = adler32(0L, Z_NULL, 0); + state->mode = TYPE; + case TYPE: + if (flush == Z_BLOCK) goto inf_leave; + case TYPEDO: + if (state->last) { + BYTEBITS(); + state->mode = CHECK; + break; + } + NEEDBITS(3); + state->last = BITS(1); + DROPBITS(1); + switch (BITS(2)) { + case 0: /* stored block */ + Tracev((stderr, "inflate: stored block%s\n", + state->last ? " (last)" : "")); + state->mode = STORED; + break; + case 1: /* fixed block */ + fixedtables(state); + Tracev((stderr, "inflate: fixed codes block%s\n", + state->last ? " (last)" : "")); + state->mode = LEN; /* decode codes */ + break; + case 2: /* dynamic block */ + Tracev((stderr, "inflate: dynamic codes block%s\n", + state->last ? " (last)" : "")); + state->mode = TABLE; + break; + case 3: + strm->msg = (char *)"invalid block type"; + state->mode = BAD; + } + DROPBITS(2); + break; + case STORED: + BYTEBITS(); /* go to byte boundary */ + NEEDBITS(32); + if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { + strm->msg = (char *)"invalid stored block lengths"; + state->mode = BAD; + break; + } + state->length = (unsigned)hold & 0xffff; + Tracev((stderr, "inflate: stored length %u\n", + state->length)); + INITBITS(); + state->mode = COPY; + case COPY: + copy = state->length; + if (copy) { + if (copy > have) copy = have; + if (copy > left) copy = left; + if (copy == 0) goto inf_leave; + zmemcpy(put, next, copy); + have -= copy; + next += copy; + left -= copy; + put += copy; + state->length -= copy; + break; + } + Tracev((stderr, "inflate: stored end\n")); + state->mode = TYPE; + break; + case TABLE: + NEEDBITS(14); + state->nlen = BITS(5) + 257; + DROPBITS(5); + state->ndist = BITS(5) + 1; + DROPBITS(5); + state->ncode = BITS(4) + 4; + DROPBITS(4); +#ifndef PKZIP_BUG_WORKAROUND + if (state->nlen > 286 || state->ndist > 30) { + strm->msg = (char *)"too many length or distance symbols"; + state->mode = BAD; + break; + } +#endif + Tracev((stderr, "inflate: table sizes ok\n")); + state->have = 0; + state->mode = LENLENS; + case LENLENS: + while (state->have < state->ncode) { + NEEDBITS(3); + state->lens[order[state->have++]] = (unsigned short)BITS(3); + DROPBITS(3); + } + while (state->have < 19) + state->lens[order[state->have++]] = 0; + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 7; + ret = inflate_table(CODES, state->lens, 19, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid code lengths set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: code lengths ok\n")); + state->have = 0; + state->mode = CODELENS; + case CODELENS: + while (state->have < state->nlen + state->ndist) { + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.val < 16) { + NEEDBITS(this.bits); + DROPBITS(this.bits); + state->lens[state->have++] = this.val; + } + else { + if (this.val == 16) { + NEEDBITS(this.bits + 2); + DROPBITS(this.bits); + if (state->have == 0) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + len = state->lens[state->have - 1]; + copy = 3 + BITS(2); + DROPBITS(2); + } + else if (this.val == 17) { + NEEDBITS(this.bits + 3); + DROPBITS(this.bits); + len = 0; + copy = 3 + BITS(3); + DROPBITS(3); + } + else { + NEEDBITS(this.bits + 7); + DROPBITS(this.bits); + len = 0; + copy = 11 + BITS(7); + DROPBITS(7); + } + if (state->have + copy > state->nlen + state->ndist) { + strm->msg = (char *)"invalid bit length repeat"; + state->mode = BAD; + break; + } + while (copy--) + state->lens[state->have++] = (unsigned short)len; + } + } + + /* handle error breaks in while */ + if (state->mode == BAD) break; + + /* build code tables */ + state->next = state->codes; + state->lencode = (code const FAR *)(state->next); + state->lenbits = 9; + ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), + &(state->lenbits), state->work); + if (ret) { + strm->msg = (char *)"invalid literal/lengths set"; + state->mode = BAD; + break; + } + state->distcode = (code const FAR *)(state->next); + state->distbits = 6; + ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, + &(state->next), &(state->distbits), state->work); + if (ret) { + strm->msg = (char *)"invalid distances set"; + state->mode = BAD; + break; + } + Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN; + case LEN: + if (have >= 6 && left >= 258) { + RESTORE(); + inflate_fast(strm, out); + LOAD(); + break; + } + for (;;) { + this = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if (this.op && (this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->lencode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + state->length = (unsigned)this.val; + if ((int)(this.op) == 0) { + Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + "inflate: literal '%c'\n" : + "inflate: literal 0x%02x\n", this.val)); + state->mode = LIT; + break; + } + if (this.op & 32) { + Tracevv((stderr, "inflate: end of block\n")); + state->mode = TYPE; + break; + } + if (this.op & 64) { + strm->msg = (char *)"invalid literal/length code"; + state->mode = BAD; + break; + } + state->extra = (unsigned)(this.op) & 15; + state->mode = LENEXT; + case LENEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->length += BITS(state->extra); + DROPBITS(state->extra); + } + Tracevv((stderr, "inflate: length %u\n", state->length)); + state->mode = DIST; + case DIST: + for (;;) { + this = state->distcode[BITS(state->distbits)]; + if ((unsigned)(this.bits) <= bits) break; + PULLBYTE(); + } + if ((this.op & 0xf0) == 0) { + last = this; + for (;;) { + this = state->distcode[last.val + + (BITS(last.bits + last.op) >> last.bits)]; + if ((unsigned)(last.bits + this.bits) <= bits) break; + PULLBYTE(); + } + DROPBITS(last.bits); + } + DROPBITS(this.bits); + if (this.op & 64) { + strm->msg = (char *)"invalid distance code"; + state->mode = BAD; + break; + } + state->offset = (unsigned)this.val; + state->extra = (unsigned)(this.op) & 15; + state->mode = DISTEXT; + case DISTEXT: + if (state->extra) { + NEEDBITS(state->extra); + state->offset += BITS(state->extra); + DROPBITS(state->extra); + } +#ifdef INFLATE_STRICT + if (state->offset > state->dmax) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#endif + if (state->offset > state->whave + out - left) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } + Tracevv((stderr, "inflate: distance %u\n", state->offset)); + state->mode = MATCH; + case MATCH: + if (left == 0) goto inf_leave; + copy = out - left; + if (state->offset > copy) { /* copy from window */ + copy = state->offset - copy; + if (copy > state->write) { + copy -= state->write; + from = state->window + (state->wsize - copy); + } + else + from = state->window + (state->write - copy); + if (copy > state->length) copy = state->length; + } + else { /* copy from output */ + from = put - state->offset; + copy = state->length; + } + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = *from++; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; + case LIT: + if (left == 0) goto inf_leave; + *put++ = (unsigned char)(state->length); + left--; + state->mode = LEN; + break; + case CHECK: + if (state->wrap) { + NEEDBITS(32); + out -= left; + strm->total_out += out; + state->total += out; + if (out) + strm->adler = state->check = + UPDATE(state->check, put - out, out); + out = left; + if (( +#ifdef GUNZIP + state->flags ? hold : +#endif + REVERSE(hold)) != state->check) { + strm->msg = (char *)"incorrect data check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: check matches trailer\n")); + } +#ifdef GUNZIP + state->mode = LENGTH; + case LENGTH: + if (state->wrap && state->flags) { + NEEDBITS(32); + if (hold != (state->total & 0xffffffffUL)) { + strm->msg = (char *)"incorrect length check"; + state->mode = BAD; + break; + } + INITBITS(); + Tracev((stderr, "inflate: length matches trailer\n")); + } +#endif + state->mode = DONE; + case DONE: + ret = Z_STREAM_END; + goto inf_leave; + case BAD: + ret = Z_DATA_ERROR; + goto inf_leave; + case MEM: + return Z_MEM_ERROR; + case SYNC: + default: + return Z_STREAM_ERROR; + } + + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + inf_leave: + RESTORE(); + if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) + if (updatewindow(strm, out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + in -= strm->avail_in; + out -= strm->avail_out; + strm->total_in += in; + strm->total_out += out; + state->total += out; + if (state->wrap && out) + strm->adler = state->check = + UPDATE(state->check, strm->next_out - out, out); + strm->data_type = state->bits + (state->last ? 64 : 0) + + (state->mode == TYPE ? 128 : 0); + if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) + ret = Z_BUF_ERROR; + return ret; +} + +int ZEXPORT inflateEnd(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->window != Z_NULL) ZFREE(strm, state->window); + ZFREE(strm, strm->state); + strm->state = Z_NULL; + Tracev((stderr, "inflate: end\n")); + return Z_OK; +} + +int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength) +z_streamp strm; +const Bytef *dictionary; +uInt dictLength; +{ + struct inflate_state FAR *state; + unsigned long id; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (state->wrap != 0 && state->mode != DICT) + return Z_STREAM_ERROR; + + /* check for correct dictionary id */ + if (state->mode == DICT) { + id = adler32(0L, Z_NULL, 0); + id = adler32(id, dictionary, dictLength); + if (id != state->check) + return Z_DATA_ERROR; + } + + /* copy dictionary to window */ + if (updatewindow(strm, strm->avail_out)) { + state->mode = MEM; + return Z_MEM_ERROR; + } + if (dictLength > state->wsize) { + zmemcpy(state->window, dictionary + dictLength - state->wsize, + state->wsize); + state->whave = state->wsize; + } + else { + zmemcpy(state->window + state->wsize - dictLength, dictionary, + dictLength); + state->whave = dictLength; + } + state->havedict = 1; + Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +int ZEXPORT inflateGetHeader(strm, head) +z_streamp strm; +gz_headerp head; +{ + struct inflate_state FAR *state; + + /* check state */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; + + /* save header structure */ + state->head = head; + head->done = 0; + return Z_OK; +} + +/* + Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found + or when out of input. When called, *have is the number of pattern bytes + found in order so far, in 0..3. On return *have is updated to the new + state. If on return *have equals four, then the pattern was found and the + return value is how many bytes were read including the last byte of the + pattern. If *have is less than four, then the pattern has not been found + yet and the return value is len. In the latter case, syncsearch() can be + called again with more data and the *have state. *have is initialized to + zero for the first call. + */ +local unsigned syncsearch(have, buf, len) +unsigned FAR *have; +unsigned char FAR *buf; +unsigned len; +{ + unsigned got; + unsigned next; + + got = *have; + next = 0; + while (next < len && got < 4) { + if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) + got++; + else if (buf[next]) + got = 0; + else + got = 4 - got; + next++; + } + *have = got; + return next; +} + +int ZEXPORT inflateSync(strm) +z_streamp strm; +{ + unsigned len; /* number of bytes to look at or looked at */ + unsigned long in, out; /* temporary to save total_in and total_out */ + unsigned char buf[4]; /* to restore bit buffer to byte string */ + struct inflate_state FAR *state; + + /* check parameters */ + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; + + /* if first time, start search in bit buffer */ + if (state->mode != SYNC) { + state->mode = SYNC; + state->hold <<= state->bits & 7; + state->bits -= state->bits & 7; + len = 0; + while (state->bits >= 8) { + buf[len++] = (unsigned char)(state->hold); + state->hold >>= 8; + state->bits -= 8; + } + state->have = 0; + syncsearch(&(state->have), buf, len); + } + + /* search available input */ + len = syncsearch(&(state->have), strm->next_in, strm->avail_in); + strm->avail_in -= len; + strm->next_in += len; + strm->total_in += len; + + /* return no joy or set up to restart inflate() on a new block */ + if (state->have != 4) return Z_DATA_ERROR; + in = strm->total_in; out = strm->total_out; + inflateReset(strm); + strm->total_in = in; strm->total_out = out; + state->mode = TYPE; + return Z_OK; +} + +/* + Returns true if inflate is currently at the end of a block generated by + Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP + implementation to provide an additional safety check. PPP uses + Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored + block. When decompressing, PPP checks that at the end of input packet, + inflate is waiting for these length bytes. + */ +int ZEXPORT inflateSyncPoint(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + return state->mode == STORED && state->bits == 0; +} + +int ZEXPORT inflateCopy(dest, source) +z_streamp dest; +z_streamp source; +{ + struct inflate_state FAR *state; + struct inflate_state FAR *copy; + unsigned char FAR *window; + unsigned wsize; + + /* check input */ + if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || + source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) + return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)source->state; + + /* allocate space */ + copy = (struct inflate_state FAR *) + ZALLOC(source, 1, sizeof(struct inflate_state)); + if (copy == Z_NULL) return Z_MEM_ERROR; + window = Z_NULL; + if (state->window != Z_NULL) { + window = (unsigned char FAR *) + ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); + if (window == Z_NULL) { + ZFREE(source, copy); + return Z_MEM_ERROR; + } + } + + /* copy state */ + zmemcpy(dest, source, sizeof(z_stream)); + zmemcpy(copy, state, sizeof(struct inflate_state)); + if (state->lencode >= state->codes && + state->lencode <= state->codes + ENOUGH - 1) { + copy->lencode = copy->codes + (state->lencode - state->codes); + copy->distcode = copy->codes + (state->distcode - state->codes); + } + copy->next = copy->codes + (state->next - state->codes); + if (window != Z_NULL) { + wsize = 1U << state->wbits; + zmemcpy(window, state->window, wsize); + } + copy->window = window; + dest->state = (struct internal_state FAR *)copy; + return Z_OK; +} diff --git a/third_party/windows/fltk-1.1.10/zlib/inflate.h b/third_party/windows/fltk-1.1.10/zlib/inflate.h new file mode 100644 index 0000000..fbbc871 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/inflate.h @@ -0,0 +1,115 @@ +/* inflate.h -- internal inflate state definition + * Copyright (C) 1995-2004 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* define NO_GZIP when compiling if you want to disable gzip header and + trailer decoding by inflate(). NO_GZIP would be used to avoid linking in + the crc code when it is not needed. For shared libraries, gzip decoding + should be left enabled. */ +#ifndef NO_GZIP +# define GUNZIP +#endif + +/* Possible inflate modes between inflate() calls */ +typedef enum { + HEAD, /* i: waiting for magic header */ + FLAGS, /* i: waiting for method and flags (gzip) */ + TIME, /* i: waiting for modification time (gzip) */ + OS, /* i: waiting for extra flags and operating system (gzip) */ + EXLEN, /* i: waiting for extra length (gzip) */ + EXTRA, /* i: waiting for extra bytes (gzip) */ + NAME, /* i: waiting for end of file name (gzip) */ + COMMENT, /* i: waiting for end of comment (gzip) */ + HCRC, /* i: waiting for header crc (gzip) */ + DICTID, /* i: waiting for dictionary check value */ + DICT, /* waiting for inflateSetDictionary() call */ + TYPE, /* i: waiting for type bits, including last-flag bit */ + TYPEDO, /* i: same, but skip check to exit inflate on new block */ + STORED, /* i: waiting for stored size (length and complement) */ + COPY, /* i/o: waiting for input or output to copy stored block */ + TABLE, /* i: waiting for dynamic block table lengths */ + LENLENS, /* i: waiting for code length code lengths */ + CODELENS, /* i: waiting for length/lit and distance code lengths */ + LEN, /* i: waiting for length/lit code */ + LENEXT, /* i: waiting for length extra bits */ + DIST, /* i: waiting for distance code */ + DISTEXT, /* i: waiting for distance extra bits */ + MATCH, /* o: waiting for output space to copy string */ + LIT, /* o: waiting for output space to write literal */ + CHECK, /* i: waiting for 32-bit check value */ + LENGTH, /* i: waiting for 32-bit length (gzip) */ + DONE, /* finished check, done -- remain here until reset */ + BAD, /* got a data error -- remain here until reset */ + MEM, /* got an inflate() memory error -- remain here until reset */ + SYNC /* looking for synchronization bytes to restart inflate() */ +} inflate_mode; + +/* + State transitions between above modes - + + (most modes can go to the BAD or MEM mode -- not shown for clarity) + + Process header: + HEAD -> (gzip) or (zlib) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME + NAME -> COMMENT -> HCRC -> TYPE + (zlib) -> DICTID or TYPE + DICTID -> DICT -> TYPE + Read deflate blocks: + TYPE -> STORED or TABLE or LEN or CHECK + STORED -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN + Read deflate codes: + LEN -> LENEXT or LIT or TYPE + LENEXT -> DIST -> DISTEXT -> MATCH -> LEN + LIT -> LEN + Process trailer: + CHECK -> LENGTH -> DONE + */ + +/* state maintained between inflate() calls. Approximately 7K bytes. */ +struct inflate_state { + inflate_mode mode; /* current inflate mode */ + int last; /* true if processing last block */ + int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ + int havedict; /* true if dictionary provided */ + int flags; /* gzip header method and flags (0 if zlib) */ + unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ + unsigned long check; /* protected copy of check value */ + unsigned long total; /* protected copy of output count */ + gz_headerp head; /* where to save gzip header information */ + /* sliding window */ + unsigned wbits; /* log base 2 of requested window size */ + unsigned wsize; /* window size or zero if not using window */ + unsigned whave; /* valid bytes in the window */ + unsigned write; /* window write index */ + unsigned char FAR *window; /* allocated sliding window, if needed */ + /* bit accumulator */ + unsigned long hold; /* input bit accumulator */ + unsigned bits; /* number of bits in "in" */ + /* for string and stored block copying */ + unsigned length; /* literal or length of data to copy */ + unsigned offset; /* distance back to copy string from */ + /* for table and code decoding */ + unsigned extra; /* extra bits needed */ + /* fixed and dynamic code tables */ + code const FAR *lencode; /* starting table for length/literal codes */ + code const FAR *distcode; /* starting table for distance codes */ + unsigned lenbits; /* index bits for lencode */ + unsigned distbits; /* index bits for distcode */ + /* dynamic table building */ + unsigned ncode; /* number of code length code lengths */ + unsigned nlen; /* number of length code lengths */ + unsigned ndist; /* number of distance code lengths */ + unsigned have; /* number of code lengths in lens[] */ + code FAR *next; /* next available space in codes[] */ + unsigned short lens[320]; /* temporary storage for code lengths */ + unsigned short work[288]; /* work area for code table building */ + code codes[ENOUGH]; /* space for code tables */ +}; diff --git a/third_party/windows/fltk-1.1.10/zlib/inftrees.c b/third_party/windows/fltk-1.1.10/zlib/inftrees.c new file mode 100644 index 0000000..38ded81 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/inftrees.c @@ -0,0 +1,329 @@ +/* inftrees.c -- generate Huffman trees for efficient decoding + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zutil.h" +#include "inftrees.h" + +#define MAXBITS 15 + +const char inflate_copyright[] = + " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; +/* + If you use the zlib library in a product, an acknowledgment is welcome + in the documentation of your product. If for some reason you cannot + include such an acknowledgment, I would appreciate that you keep this + copyright string in the executable of your product. + */ + +/* + Build a set of tables to decode the provided canonical Huffman code. + The code lengths are lens[0..codes-1]. The result starts at *table, + whose indices are 0..2^bits-1. work is a writable array of at least + lens shorts, which is used as a work area. type is the type of code + to be generated, CODES, LENS, or DISTS. On return, zero is success, + -1 is an invalid code, and +1 means that ENOUGH isn't enough. table + on return points to the next available entry's address. bits is the + requested root table index bits, and on return it is the actual root + table index bits. It will differ if the request is greater than the + longest code or if it is less than the shortest code. + */ +int inflate_table(type, lens, codes, table, bits, work) +codetype type; +unsigned short FAR *lens; +unsigned codes; +code FAR * FAR *table; +unsigned FAR *bits; +unsigned short FAR *work; +{ + unsigned len; /* a code's length in bits */ + unsigned sym; /* index of code symbols */ + unsigned min, max; /* minimum and maximum code lengths */ + unsigned root; /* number of index bits for root table */ + unsigned curr; /* number of index bits for current table */ + unsigned drop; /* code bits to drop for sub-table */ + int left; /* number of prefix codes available */ + unsigned used; /* code entries in table used */ + unsigned huff; /* Huffman code */ + unsigned incr; /* for incrementing code, index */ + unsigned fill; /* index for replicating entries */ + unsigned low; /* low bits for current root entry */ + unsigned mask; /* mask for low root bits */ + code this; /* table entry for duplication */ + code FAR *next; /* next available space in table */ + const unsigned short FAR *base; /* base value table to use */ + const unsigned short FAR *extra; /* extra bits table to use */ + int end; /* use base and extra for symbol > end */ + unsigned short count[MAXBITS+1]; /* number of codes of each length */ + unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ + static const unsigned short lbase[31] = { /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; + static const unsigned short lext[31] = { /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; + static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0}; + static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64}; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) + count[len] = 0; + for (sym = 0; sym < codes; sym++) + count[lens[sym]]++; + + /* bound code lengths, force root to be within code lengths */ + root = *bits; + for (max = MAXBITS; max >= 1; max--) + if (count[max] != 0) break; + if (root > max) root = max; + if (max == 0) { /* no symbols to code at all */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)1; + this.val = (unsigned short)0; + *(*table)++ = this; /* make a table to force an error */ + *(*table)++ = this; + *bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min <= MAXBITS; min++) + if (count[min] != 0) break; + if (root < min) root = min; + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) return -1; /* over-subscribed */ + } + if (left > 0 && (type == CODES || max != 1)) + return -1; /* incomplete set */ + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) + offs[len + 1] = offs[len] + count[len]; + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) + if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked when a LENS table is being made + against the space in *table, ENOUGH, minus the maximum space needed by + the worst case distance code, MAXD. This should never happen, but the + sufficiency of ENOUGH has not been proven exhaustively, hence the check. + This assumes that when type == LENS, bits == 9. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + switch (type) { + case CODES: + base = extra = work; /* dummy value--not used */ + end = 19; + break; + case LENS: + base = lbase; + base -= 257; + extra = lext; + extra -= 257; + end = 256; + break; + default: /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize state for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = *table; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = (unsigned)(-1); /* trigger new sub-table when len > root */ + used = 1U << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* process all codes and make table entries */ + for (;;) { + /* create table entry */ + this.bits = (unsigned char)(len - drop); + if ((int)(work[sym]) < end) { + this.op = (unsigned char)0; + this.val = work[sym]; + } + else if ((int)(work[sym]) > end) { + this.op = (unsigned char)(extra[work[sym]]); + this.val = base[work[sym]]; + } + else { + this.op = (unsigned char)(32 + 64); /* end of block */ + this.val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1U << (len - drop); + fill = 1U << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + next[(huff >> drop) + fill] = this; + } while (fill != 0); + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + + /* go to next symbol, update count, len */ + sym++; + if (--(count[len]) == 0) { + if (len == max) break; + len = lens[work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) != low) { + /* if first time, transition to sub-tables */ + if (drop == 0) + drop = root; + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = (int)(1 << curr); + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) break; + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1U << curr; + if (type == LENS && used >= ENOUGH - MAXD) + return 1; + + /* point entry in root table to sub-table */ + low = huff & mask; + (*table)[low].op = (unsigned char)curr; + (*table)[low].bits = (unsigned char)root; + (*table)[low].val = (unsigned short)(next - *table); + } + } + + /* + Fill in rest of table for incomplete codes. This loop is similar to the + loop above in incrementing huff for table indices. It is assumed that + len is equal to curr + drop, so there is no loop needed to increment + through high index bits. When the current sub-table is filled, the loop + drops back to the root table to fill in any remaining entries there. + */ + this.op = (unsigned char)64; /* invalid code marker */ + this.bits = (unsigned char)(len - drop); + this.val = (unsigned short)0; + while (huff != 0) { + /* when done with sub-table, drop back to root table */ + if (drop != 0 && (huff & mask) != low) { + drop = 0; + len = root; + next = *table; + this.bits = (unsigned char)len; + } + + /* put invalid code marker in table */ + next[huff >> drop] = this; + + /* backwards increment the len-bit code huff */ + incr = 1U << (len - 1); + while (huff & incr) + incr >>= 1; + if (incr != 0) { + huff &= incr - 1; + huff += incr; + } + else + huff = 0; + } + + /* set return parameters */ + *table += used; + *bits = root; + return 0; +} diff --git a/third_party/windows/fltk-1.1.10/zlib/inftrees.h b/third_party/windows/fltk-1.1.10/zlib/inftrees.h new file mode 100644 index 0000000..dc0fd56 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/inftrees.h @@ -0,0 +1,55 @@ +/* inftrees.h -- header to use inftrees.c + * Copyright (C) 1995-2005 Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* Structure for decoding tables. Each entry provides either the + information needed to do the operation requested by the code that + indexed that table entry, or it provides a pointer to another + table that indexes more bits of the code. op indicates whether + the entry is a pointer to another table, a literal, a length or + distance, an end-of-block, or an invalid code. For a table + pointer, the low four bits of op is the number of index bits of + that table. For a length or distance, the low four bits of op + is the number of extra bits to get after the code. bits is + the number of bits in this code or part of the code to drop off + of the bit buffer. val is the actual byte to output in the case + of a literal, the base length or distance, or the offset from + the current table to the next table. Each entry is four bytes. */ +typedef struct { + unsigned char op; /* operation, extra bits, table bits */ + unsigned char bits; /* bits in this part of the code */ + unsigned short val; /* offset in table or code value */ +} code; + +/* op values as set by inflate_table(): + 00000000 - literal + 0000tttt - table link, tttt != 0 is the number of table index bits + 0001eeee - length or distance, eeee is the number of extra bits + 01100000 - end of block + 01000000 - invalid code + */ + +/* Maximum size of dynamic tree. The maximum found in a long but non- + exhaustive search was 1444 code structures (852 for length/literals + and 592 for distances, the latter actually the result of an + exhaustive search). The true maximum is not known, but the value + below is more than safe. */ +#define ENOUGH 2048 +#define MAXD 592 + +/* Type of code to build for inftable() */ +typedef enum { + CODES, + LENS, + DISTS +} codetype; + +extern int inflate_table OF((codetype type, unsigned short FAR *lens, + unsigned codes, code FAR * FAR *table, + unsigned FAR *bits, unsigned short FAR *work)); diff --git a/third_party/windows/fltk-1.1.10/zlib/makedepend b/third_party/windows/fltk-1.1.10/zlib/makedepend new file mode 100644 index 0000000..b9e94a0 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/makedepend @@ -0,0 +1,13 @@ +# DO NOT DELETE + +adler32.o: zlib.h zconf.h +compress.o: zlib.h zconf.h +crc32.o: zutil.h zlib.h zconf.h crc32.h +gzio.o: zutil.h zlib.h zconf.h +uncompr.o: zlib.h zconf.h +deflate.o: deflate.h zutil.h zlib.h zconf.h +trees.o: deflate.h zutil.h zlib.h zconf.h trees.h +zutil.o: zutil.h zlib.h zconf.h +inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h inffixed.h +inftrees.o: zutil.h zlib.h zconf.h inftrees.h +inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h diff --git a/third_party/windows/fltk-1.1.10/zlib/makefile.wat b/third_party/windows/fltk-1.1.10/zlib/makefile.wat new file mode 100644 index 0000000..00a8755 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/makefile.wat @@ -0,0 +1,60 @@ +# +# "$Id: makefile.wat 4359 2005-05-19 16:07:13Z mike $" +# +# GNU ZIP library makefile for the Fast Light Toolkit (FLTK). +# +# Copyright 1997-2004 by Easy Software Products. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 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 +# Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +# USA. +# +# Please report all bugs and problems to "fltk-bugs@fltk.org". +# + +LIBNAMEROOT=ftlk_z + +!include ../watcom.mif + + +# +# Object files... +# + +LIBOBJS = adler32.obj compress.obj crc32.obj gzio.obj uncompr.obj deflate.obj & + trees.obj zutil.obj inflate.obj inftrees.obj inffast.obj + + +# +# Make all targets... +# + +all: $(LIBNAME) + +$(LIBNAME): $(LIBOBJS) + $(LIB) $(LIBOPTS) $@ $< + +# +# Clean all directories +# +clean : .SYMBOLIC + @echo Cleaning up. +CLEANEXTS = obj + @for %a in ($(CLEANEXTS)) do -rm -f $(ODIR)\*.%a + -rm -f *.err + -rm -f $(LIBNAME) + +# +# End of "$Id: makefile.wat 4359 2005-05-19 16:07:13Z mike $". +# diff --git a/third_party/windows/fltk-1.1.10/zlib/trees.c b/third_party/windows/fltk-1.1.10/zlib/trees.c new file mode 100644 index 0000000..a2169a4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/trees.c @@ -0,0 +1,1219 @@ +/* trees.c -- output deflated data using Huffman coding + * Copyright (C) 1995-2005 Jean-loup Gailly + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* + * ALGORITHM + * + * The "deflation" process uses several Huffman trees. The more + * common source values are represented by shorter bit sequences. + * + * Each code tree is stored in a compressed form which is itself + * a Huffman encoding of the lengths of all the code strings (in + * ascending order by source values). The actual code strings are + * reconstructed from the lengths in the inflate process, as described + * in the deflate specification. + * + * REFERENCES + * + * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". + * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc + * + * Storer, James A. + * Data Compression: Methods and Theory, pp. 49-50. + * Computer Science Press, 1988. ISBN 0-7167-8156-5. + * + * Sedgewick, R. + * Algorithms, p290. + * Addison-Wesley, 1983. ISBN 0-201-06672-6. + */ + +/* @(#) $Id: trees.c 5666 2007-02-06 22:02:28Z mike $ */ + +/* #define GEN_TREES_H */ + +#include "deflate.h" + +#ifdef DEBUG +# include +#endif + +/* =========================================================================== + * Constants + */ + +#define MAX_BL_BITS 7 +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +#define END_BLOCK 256 +/* end of block literal code */ + +#define REP_3_6 16 +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +#define REPZ_3_10 17 +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +#define REPZ_11_138 18 +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ + = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; + +local const int extra_dbits[D_CODES] /* extra bits for each distance code */ + = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + +local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ + = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; + +local const uch bl_order[BL_CODES] + = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +#define Buf_size (8 * 2*sizeof(char)) +/* Number of bits used within bi_buf. (bi_buf might be implemented on + * more than 16 bits on some systems.) + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ + +#if defined(GEN_TREES_H) || !defined(STDC) +/* non ANSI compilers may not accept trees.h */ + +local ct_data static_ltree[L_CODES+2]; +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +local ct_data static_dtree[D_CODES]; +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +uch _dist_code[DIST_CODE_LEN]; +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +uch _length_code[MAX_MATCH-MIN_MATCH+1]; +/* length code for each normalized match length (0 == MIN_MATCH) */ + +local int base_length[LENGTH_CODES]; +/* First normalized length for each code (0 = MIN_MATCH) */ + +local int base_dist[D_CODES]; +/* First normalized distance for each code (0 = distance of 1) */ + +#else +# include "trees.h" +#endif /* GEN_TREES_H */ + +struct static_tree_desc_s { + const ct_data *static_tree; /* static tree or NULL */ + const intf *extra_bits; /* extra bits for each code or NULL */ + int extra_base; /* base index for extra_bits */ + int elems; /* max number of elements in the tree */ + int max_length; /* max bit length for the codes */ +}; + +local static_tree_desc static_l_desc = +{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; + +local static_tree_desc static_d_desc = +{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; + +local static_tree_desc static_bl_desc = +{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; + +/* =========================================================================== + * Local (static) routines in this file. + */ + +local void tr_static_init OF((void)); +local void init_block OF((deflate_state *s)); +local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); +local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); +local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); +local void build_tree OF((deflate_state *s, tree_desc *desc)); +local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); +local int build_bl_tree OF((deflate_state *s)); +local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, + int blcodes)); +local void compress_block OF((deflate_state *s, ct_data *ltree, + ct_data *dtree)); +local void set_data_type OF((deflate_state *s)); +local unsigned bi_reverse OF((unsigned value, int length)); +local void bi_windup OF((deflate_state *s)); +local void bi_flush OF((deflate_state *s)); +local void copy_block OF((deflate_state *s, charf *buf, unsigned len, + int header)); + +#ifdef GEN_TREES_H +local void gen_trees_header OF((void)); +#endif + +#ifndef DEBUG +# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) + /* Send a code of the given tree. c and tree must not have side effects */ + +#else /* DEBUG */ +# define send_code(s, c, tree) \ + { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ + send_bits(s, tree[c].Code, tree[c].Len); } +#endif + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +#define put_short(s, w) { \ + put_byte(s, (uch)((w) & 0xff)); \ + put_byte(s, (uch)((ush)(w) >> 8)); \ +} + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +#ifdef DEBUG +local void send_bits OF((deflate_state *s, int value, int length)); + +local void send_bits(s, value, length) + deflate_state *s; + int value; /* value to send */ + int length; /* number of bits */ +{ + Tracevv((stderr," l %2d v %4x ", length, value)); + Assert(length > 0 && length <= 15, "invalid length"); + s->bits_sent += (ulg)length; + + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (s->bi_valid > (int)Buf_size - length) { + s->bi_buf |= (value << s->bi_valid); + put_short(s, s->bi_buf); + s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); + s->bi_valid += length - Buf_size; + } else { + s->bi_buf |= value << s->bi_valid; + s->bi_valid += length; + } +} +#else /* !DEBUG */ + +#define send_bits(s, value, length) \ +{ int len = length;\ + if (s->bi_valid > (int)Buf_size - len) {\ + int val = value;\ + s->bi_buf |= (val << s->bi_valid);\ + put_short(s, s->bi_buf);\ + s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ + s->bi_valid += len - Buf_size;\ + } else {\ + s->bi_buf |= (value) << s->bi_valid;\ + s->bi_valid += len;\ + }\ +} +#endif /* DEBUG */ + + +/* the arguments must not have side effects */ + +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +local void tr_static_init() +{ +#if defined(GEN_TREES_H) || !defined(STDC) + static int static_init_done = 0; + int n; /* iterates over tree elements */ + int bits; /* bit counter */ + int length; /* length value */ + int code; /* code value */ + int dist; /* distance index */ + ush bl_count[MAX_BITS+1]; + /* number of codes at each bit length for an optimal tree */ + + if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES-1; code++) { + base_length[code] = length; + for (n = 0; n < (1< dist code (0..29) */ + dist = 0; + for (code = 0 ; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ + for ( ; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + _dist_code[256 + dist++] = (uch)code; + } + } + Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; + n = 0; + while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; + while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; + while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; + while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n].Len = 5; + static_dtree[n].Code = bi_reverse((unsigned)n, 5); + } + static_init_done = 1; + +# ifdef GEN_TREES_H + gen_trees_header(); +# endif +#endif /* defined(GEN_TREES_H) || !defined(STDC) */ +} + +/* =========================================================================== + * Genererate the file trees.h describing the static trees. + */ +#ifdef GEN_TREES_H +# ifndef DEBUG +# include +# endif + +# define SEPARATOR(i, last, width) \ + ((i) == (last)? "\n};\n\n" : \ + ((i) % (width) == (width)-1 ? ",\n" : ", ")) + +void gen_trees_header() +{ + FILE *header = fopen("trees.h", "w"); + int i; + + Assert (header != NULL, "Can't open trees.h"); + fprintf(header, + "/* header created automatically with -DGEN_TREES_H */\n\n"); + + fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); + for (i = 0; i < L_CODES+2; i++) { + fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, + static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); + } + + fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, + static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); + } + + fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); + for (i = 0; i < DIST_CODE_LEN; i++) { + fprintf(header, "%2u%s", _dist_code[i], + SEPARATOR(i, DIST_CODE_LEN-1, 20)); + } + + fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { + fprintf(header, "%2u%s", _length_code[i], + SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); + } + + fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); + for (i = 0; i < LENGTH_CODES; i++) { + fprintf(header, "%1u%s", base_length[i], + SEPARATOR(i, LENGTH_CODES-1, 20)); + } + + fprintf(header, "local const int base_dist[D_CODES] = {\n"); + for (i = 0; i < D_CODES; i++) { + fprintf(header, "%5u%s", base_dist[i], + SEPARATOR(i, D_CODES-1, 10)); + } + + fclose(header); +} +#endif /* GEN_TREES_H */ + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +void _tr_init(s) + deflate_state *s; +{ + tr_static_init(); + + s->l_desc.dyn_tree = s->dyn_ltree; + s->l_desc.stat_desc = &static_l_desc; + + s->d_desc.dyn_tree = s->dyn_dtree; + s->d_desc.stat_desc = &static_d_desc; + + s->bl_desc.dyn_tree = s->bl_tree; + s->bl_desc.stat_desc = &static_bl_desc; + + s->bi_buf = 0; + s->bi_valid = 0; + s->last_eob_len = 8; /* enough lookahead for inflate */ +#ifdef DEBUG + s->compressed_len = 0L; + s->bits_sent = 0L; +#endif + + /* Initialize the first block of the first file: */ + init_block(s); +} + +/* =========================================================================== + * Initialize a new block. + */ +local void init_block(s) + deflate_state *s; +{ + int n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; + for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; + for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; + + s->dyn_ltree[END_BLOCK].Freq = 1; + s->opt_len = s->static_len = 0L; + s->last_lit = s->matches = 0; +} + +#define SMALLEST 1 +/* Index within the heap array of least frequent node in the Huffman tree */ + + +/* =========================================================================== + * Remove the smallest element from the heap and recreate the heap with + * one less element. Updates heap and heap_len. + */ +#define pqremove(s, tree, top) \ +{\ + top = s->heap[SMALLEST]; \ + s->heap[SMALLEST] = s->heap[s->heap_len--]; \ + pqdownheap(s, tree, SMALLEST); \ +} + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +#define smaller(tree, n, m, depth) \ + (tree[n].Freq < tree[m].Freq || \ + (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +local void pqdownheap(s, tree, k) + deflate_state *s; + ct_data *tree; /* the tree to restore */ + int k; /* node to move down */ +{ + int v = s->heap[k]; + int j = k << 1; /* left son of k */ + while (j <= s->heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s->heap_len && + smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s->heap[j], s->depth)) break; + + /* Exchange v with the smallest son */ + s->heap[k] = s->heap[j]; k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s->heap[k] = v; +} + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +local void gen_bitlen(s, desc) + deflate_state *s; + tree_desc *desc; /* the tree descriptor */ +{ + ct_data *tree = desc->dyn_tree; + int max_code = desc->max_code; + const ct_data *stree = desc->stat_desc->static_tree; + const intf *extra = desc->stat_desc->extra_bits; + int base = desc->stat_desc->extra_base; + int max_length = desc->stat_desc->max_length; + int h; /* heap index */ + int n, m; /* iterate over the tree elements */ + int bits; /* bit length */ + int xbits; /* extra bits */ + ush f; /* frequency */ + int overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ + + for (h = s->heap_max+1; h < HEAP_SIZE; h++) { + n = s->heap[h]; + bits = tree[tree[n].Dad].Len + 1; + if (bits > max_length) bits = max_length, overflow++; + tree[n].Len = (ush)bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) continue; /* not a leaf node */ + + s->bl_count[bits]++; + xbits = 0; + if (n >= base) xbits = extra[n-base]; + f = tree[n].Freq; + s->opt_len += (ulg)f * (bits + xbits); + if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); + } + if (overflow == 0) return; + + Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length-1; + while (s->bl_count[bits] == 0) bits--; + s->bl_count[bits]--; /* move one leaf down the tree */ + s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s->bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = s->bl_count[bits]; + while (n != 0) { + m = s->heap[--h]; + if (m > max_code) continue; + if ((unsigned) tree[m].Len != (unsigned) bits) { + Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s->opt_len += ((long)bits - (long)tree[m].Len) + *(long)tree[m].Freq; + tree[m].Len = (ush)bits; + } + n--; + } + } +} + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +local void gen_codes (tree, max_code, bl_count) + ct_data *tree; /* the tree to decorate */ + int max_code; /* largest code with non zero frequency */ + ushf *bl_count; /* number of codes at each bit length */ +{ + ush next_code[MAX_BITS+1]; /* next code value for each bit length */ + ush code = 0; /* running code value */ + int bits; /* bit index */ + int n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits-1]) << 1; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; + const ct_data *stree = desc->stat_desc->static_tree; + int elems = desc->stat_desc->elems; + int n, m; /* iterate over heap elements */ + int max_code = -1; /* largest code with non zero frequency */ + int node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s->heap_len = 0, s->heap_max = HEAP_SIZE; + + for (n = 0; n < elems; n++) { + if (tree[n].Freq != 0) { + s->heap[++(s->heap_len)] = max_code = n; + s->depth[n] = 0; + } else { + tree[n].Len = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s->heap_len < 2) { + node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); + tree[node].Freq = 1; + s->depth[node] = 0; + s->opt_len--; if (stree) s->static_len -= stree[node].Len; + /* node is 0 or 1 so it does not have extra bits */ + } + desc->max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + pqremove(s, tree, n); /* n = node of least frequency */ + m = s->heap[SMALLEST]; /* m = node of next least frequency */ + + s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ + s->heap[--(s->heap_max)] = m; + + /* Create a new node father of n and m */ + tree[node].Freq = tree[n].Freq + tree[m].Freq; + s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? + s->depth[n] : s->depth[m]) + 1); + tree[n].Dad = tree[m].Dad = (ush)node; +#ifdef DUMP_BL_TREE + if (tree == s->bl_tree) { + fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", + node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); + } +#endif + /* and insert the new node in the heap */ + s->heap[SMALLEST] = node++; + pqdownheap(s, tree, SMALLEST); + + } while (s->heap_len >= 2); + + s->heap[--(s->heap_max)] = s->heap[SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, (tree_desc *)desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes ((ct_data *)tree, max_code, s->bl_count); +} + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +local void scan_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + if (nextlen == 0) max_count = 138, min_count = 3; + tree[max_code+1].Len = (ush)0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + s->bl_tree[curlen].Freq += count; + } else if (curlen != 0) { + if (curlen != prevlen) s->bl_tree[curlen].Freq++; + s->bl_tree[REP_3_6].Freq++; + } else if (count <= 10) { + s->bl_tree[REPZ_3_10].Freq++; + } else { + s->bl_tree[REPZ_11_138].Freq++; + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +local void send_tree (s, tree, max_code) + deflate_state *s; + ct_data *tree; /* the tree to be scanned */ + int max_code; /* and its largest code of non zero frequency */ +{ + int n; /* iterates over all tree elements */ + int prevlen = -1; /* last emitted length */ + int curlen; /* length of current code */ + int nextlen = tree[0].Len; /* length of next code */ + int count = 0; /* repeat count of the current code */ + int max_count = 7; /* max repeat count */ + int min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen == 0) max_count = 138, min_count = 3; + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; nextlen = tree[n+1].Len; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { send_code(s, curlen, s->bl_tree); } while (--count != 0); + + } else if (curlen != 0) { + if (curlen != prevlen) { + send_code(s, curlen, s->bl_tree); count--; + } + Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); + + } else { + send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); + } + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138, min_count = 3; + } else if (curlen == nextlen) { + max_count = 6, min_count = 3; + } else { + max_count = 7, min_count = 4; + } + } +} + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +local int build_bl_tree(s) + deflate_state *s; +{ + int max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); + scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, (tree_desc *)(&(s->bl_desc))); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { + if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + s->opt_len += 3*(max_blindex+1) + 5+5+4; + Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + s->opt_len, s->static_len)); + + return max_blindex; +} + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +local void send_all_trees(s, lcodes, dcodes, blcodes) + deflate_state *s; + int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + int rank; /* index in bl_order */ + + Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + "too many codes"); + Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes-1, 5); + send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); + } + Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ + Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ + Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +} + +/* =========================================================================== + * Send a stored block + */ +void _tr_stored_block(s, buf, stored_len, eof) + deflate_state *s; + charf *buf; /* input block */ + ulg stored_len; /* length of input block */ + int eof; /* true if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ +#ifdef DEBUG + s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; + s->compressed_len += (stored_len + 4) << 3; +#endif + copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ +} + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + * The current inflate code requires 9 bits of lookahead. If the + * last two codes for the previous block (real code plus EOB) were coded + * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode + * the last real code. In this case we send two empty static blocks instead + * of one. (There are no problems if the previous block is stored or fixed.) + * To simplify the code, we assume the worst case of last real code encoded + * on one bit only. + */ +void _tr_align(s) + deflate_state *s; +{ + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ +#endif + bi_flush(s); + /* Of the 10 bits for the empty block, we have already sent + * (10 - bi_valid) bits. The lookahead for the last real code (before + * the EOB of the previous block) was thus at least one plus the length + * of the EOB plus what we have just sent of the empty static block. + */ + if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { + send_bits(s, STATIC_TREES<<1, 3); + send_code(s, END_BLOCK, static_ltree); +#ifdef DEBUG + s->compressed_len += 10L; +#endif + bi_flush(s); + } + s->last_eob_len = 7; +} + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ +void _tr_flush_block(s, buf, stored_len, eof) + deflate_state *s; + charf *buf; /* input block, or NULL if too old */ + ulg stored_len; /* length of input block */ + int eof; /* true if this is the last block for a file */ +{ + ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + int max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s->level > 0) { + + /* Check if the file is binary or text */ + if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) + set_data_type(s); + + /* Construct the literal and distance trees */ + build_tree(s, (tree_desc *)(&(s->l_desc))); + Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + + build_tree(s, (tree_desc *)(&(s->d_desc))); + Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s->opt_len+3+7)>>3; + static_lenb = (s->static_len+3+7)>>3; + + Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + s->last_lit)); + + if (static_lenb <= opt_lenb) opt_lenb = static_lenb; + + } else { + Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + +#ifdef FORCE_STORED + if (buf != (char*)0) { /* force stored block */ +#else + if (stored_len+4 <= opt_lenb && buf != (char*)0) { + /* 4: two words for the lengths */ +#endif + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block(s, buf, stored_len, eof); + +#ifdef FORCE_STATIC + } else if (static_lenb >= 0) { /* force static trees */ +#else + } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { +#endif + send_bits(s, (STATIC_TREES<<1)+eof, 3); + compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->static_len; +#endif + } else { + send_bits(s, (DYN_TREES<<1)+eof, 3); + send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, + max_blindex+1); + compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); +#ifdef DEBUG + s->compressed_len += 3 + s->opt_len; +#endif + } + Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (eof) { + bi_windup(s); +#ifdef DEBUG + s->compressed_len += 7; /* align on byte boundary */ +#endif + } + Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + s->compressed_len-7*eof)); +} + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +int _tr_tally (s, dist, lc) + deflate_state *s; + unsigned dist; /* distance of matched string */ + unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ +{ + s->d_buf[s->last_lit] = (ush)dist; + s->l_buf[s->last_lit++] = (uch)lc; + if (dist == 0) { + /* lc is the unmatched char */ + s->dyn_ltree[lc].Freq++; + } else { + s->matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + Assert((ush)dist < (ush)MAX_DIST(s) && + (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; + s->dyn_dtree[d_code(dist)].Freq++; + } + +#ifdef TRUNCATE_BLOCK + /* Try to guess if it is profitable to stop the current block here */ + if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { + /* Compute an upper bound for the compressed length */ + ulg out_length = (ulg)s->last_lit*8L; + ulg in_length = (ulg)((long)s->strstart - s->block_start); + int dcode; + for (dcode = 0; dcode < D_CODES; dcode++) { + out_length += (ulg)s->dyn_dtree[dcode].Freq * + (5L+extra_dbits[dcode]); + } + out_length >>= 3; + Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", + s->last_lit, in_length, out_length, + 100L - out_length*100L/in_length)); + if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; + } +#endif + return (s->last_lit == s->lit_bufsize-1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ +} + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +local void compress_block(s, ltree, dtree) + deflate_state *s; + ct_data *ltree; /* literal tree */ + ct_data *dtree; /* distance tree */ +{ + unsigned dist; /* distance of matched string */ + int lc; /* match length or unmatched char (if dist == 0) */ + unsigned lx = 0; /* running index in l_buf */ + unsigned code; /* the code to send */ + int extra; /* number of extra bits to send */ + + if (s->last_lit != 0) do { + dist = s->d_buf[lx]; + lc = s->l_buf[lx++]; + if (dist == 0) { + send_code(s, lc, ltree); /* send a literal byte */ + Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code+LITERALS+1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra != 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra != 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + "pendingBuf overflow"); + + } while (lx < s->last_lit); + + send_code(s, END_BLOCK, ltree); + s->last_eob_len = ltree[END_BLOCK].Len; +} + +/* =========================================================================== + * Set the data type to BINARY or TEXT, using a crude approximation: + * set it to Z_TEXT if all symbols are either printable characters (33 to 255) + * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. + * IN assertion: the fields Freq of dyn_ltree are set. + */ +local void set_data_type(s) + deflate_state *s; +{ + int n; + + for (n = 0; n < 9; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + if (n == 9) + for (n = 14; n < 32; n++) + if (s->dyn_ltree[n].Freq != 0) + break; + s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; +} + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +local unsigned bi_reverse(code, len) + unsigned code; /* the value to invert */ + int len; /* its bit length */ +{ + register unsigned res = 0; + do { + res |= code & 1; + code >>= 1, res <<= 1; + } while (--len > 0); + return res >> 1; +} + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +local void bi_flush(s) + deflate_state *s; +{ + if (s->bi_valid == 16) { + put_short(s, s->bi_buf); + s->bi_buf = 0; + s->bi_valid = 0; + } else if (s->bi_valid >= 8) { + put_byte(s, (Byte)s->bi_buf); + s->bi_buf >>= 8; + s->bi_valid -= 8; + } +} + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +local void bi_windup(s) + deflate_state *s; +{ + if (s->bi_valid > 8) { + put_short(s, s->bi_buf); + } else if (s->bi_valid > 0) { + put_byte(s, (Byte)s->bi_buf); + } + s->bi_buf = 0; + s->bi_valid = 0; +#ifdef DEBUG + s->bits_sent = (s->bits_sent+7) & ~7; +#endif +} + +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +local void copy_block(s, buf, len, header) + deflate_state *s; + charf *buf; /* the input data */ + unsigned len; /* its length */ + int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ + s->last_eob_len = 8; /* enough lookahead for inflate */ + + if (header) { + put_short(s, (ush)len); + put_short(s, (ush)~len); +#ifdef DEBUG + s->bits_sent += 2*16; +#endif + } +#ifdef DEBUG + s->bits_sent += (ulg)len<<3; +#endif + while (len--) { + put_byte(s, *buf++); + } +} diff --git a/third_party/windows/fltk-1.1.10/zlib/trees.h b/third_party/windows/fltk-1.1.10/zlib/trees.h new file mode 100644 index 0000000..1ca868b --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/trees.h @@ -0,0 +1,128 @@ +/* header created automatically with -DGEN_TREES_H */ + +local const ct_data static_ltree[L_CODES+2] = { +{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, +{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, +{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, +{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, +{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, +{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, +{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, +{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, +{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, +{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, +{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, +{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, +{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, +{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, +{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, +{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, +{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, +{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, +{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, +{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, +{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, +{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, +{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, +{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, +{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, +{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, +{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, +{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, +{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, +{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, +{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, +{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, +{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, +{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, +{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, +{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, +{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, +{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, +{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, +{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, +{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, +{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, +{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, +{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, +{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, +{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, +{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, +{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, +{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, +{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, +{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, +{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, +{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, +{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, +{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, +{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, +{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, +{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} +}; + +local const ct_data static_dtree[D_CODES] = { +{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, +{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, +{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, +{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, +{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, +{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} +}; + +const uch _dist_code[DIST_CODE_LEN] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, +10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, +11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, +12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, +13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, +14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, +15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, +18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, +28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, +29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 +}; + +const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, +13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, +17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, +19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, +21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, +22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, +23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, +26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, +27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 +}; + +local const int base_length[LENGTH_CODES] = { +0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, +64, 80, 96, 112, 128, 160, 192, 224, 0 +}; + +local const int base_dist[D_CODES] = { + 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, + 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, + 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 +}; + diff --git a/third_party/windows/fltk-1.1.10/zlib/uncompr.c b/third_party/windows/fltk-1.1.10/zlib/uncompr.c new file mode 100644 index 0000000..3d05db2 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/uncompr.c @@ -0,0 +1,61 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: uncompr.c 4052 2005-02-24 21:55:12Z mike $ */ + +#define ZLIB_INTERNAL +#include "zlib.h" + +/* =========================================================================== + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted. +*/ +int ZEXPORT uncompress (dest, destLen, source, sourceLen) + Bytef *dest; + uLongf *destLen; + const Bytef *source; + uLong sourceLen; +{ + z_stream stream; + int err; + + stream.next_in = (Bytef*)source; + stream.avail_in = (uInt)sourceLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = (uInt)*destLen; + if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; + + stream.zalloc = (alloc_func)0; + stream.zfree = (free_func)0; + + err = inflateInit(&stream); + if (err != Z_OK) return err; + + err = inflate(&stream, Z_FINISH); + if (err != Z_STREAM_END) { + inflateEnd(&stream); + if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) + return Z_DATA_ERROR; + return err; + } + *destLen = stream.total_out; + + err = inflateEnd(&stream); + return err; +} diff --git a/third_party/windows/fltk-1.1.10/zlib/zconf.h b/third_party/windows/fltk-1.1.10/zlib/zconf.h new file mode 100644 index 0000000..d0fb333 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/zconf.h @@ -0,0 +1,332 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: zconf.h 5666 2007-02-06 22:02:28Z mike $ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + */ +#ifdef Z_PREFIX +# define deflateInit_ z_deflateInit_ +# define deflate z_deflate +# define deflateEnd z_deflateEnd +# define inflateInit_ z_inflateInit_ +# define inflate z_inflate +# define inflateEnd z_inflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateSetDictionary z_deflateSetDictionary +# define deflateCopy z_deflateCopy +# define deflateReset z_deflateReset +# define deflateParams z_deflateParams +# define deflateBound z_deflateBound +# define deflatePrime z_deflatePrime +# define inflateInit2_ z_inflateInit2_ +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateCopy z_inflateCopy +# define inflateReset z_inflateReset +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# define uncompress z_uncompress +# define adler32 z_adler32 +# define crc32 z_crc32 +# define get_crc_table z_get_crc_table +# define zError z_zError + +# define alloc_func z_alloc_func +# define free_func z_free_func +# define in_func z_in_func +# define out_func z_out_func +# define Byte z_Byte +# define uInt z_uInt +# define uLong z_uLong +# define Bytef z_Bytef +# define charf z_charf +# define intf z_intf +# define uIntf z_uIntf +# define uLongf z_uLongf +# define voidpf z_voidpf +# define voidp z_voidp +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ +# include /* for off_t */ +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# define z_off_t off_t +#endif +#ifndef SEEK_SET +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif +#ifndef z_off_t +# define z_off_t long +#endif + +#if defined(__OS400__) +# define NO_vsnprintf +#endif + +#if defined(__MVS__) +# define NO_vsnprintf +# ifdef FAR +# undef FAR +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) +# pragma map(deflateInit_,"DEIN") +# pragma map(deflateInit2_,"DEIN2") +# pragma map(deflateEnd,"DEEND") +# pragma map(deflateBound,"DEBND") +# pragma map(inflateInit_,"ININ") +# pragma map(inflateInit2_,"ININ2") +# pragma map(inflateEnd,"INEND") +# pragma map(inflateSync,"INSY") +# pragma map(inflateSetDictionary,"INSEDI") +# pragma map(compressBound,"CMBND") +# pragma map(inflate_table,"INTABL") +# pragma map(inflate_fast,"INFA") +# pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/third_party/windows/fltk-1.1.10/zlib/zlib.3 b/third_party/windows/fltk-1.1.10/zlib/zlib.3 new file mode 100644 index 0000000..f6b0da1 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/zlib.3 @@ -0,0 +1,159 @@ +.TH ZLIB 3 "18 July 2005" +.SH NAME +zlib \- compression/decompression library +.SH SYNOPSIS +[see +.I zlib.h +for full description] +.SH DESCRIPTION +The +.I zlib +library is a general purpose data compression library. +The code is thread safe. +It provides in-memory compression and decompression functions, +including integrity checks of the uncompressed data. +This version of the library supports only one compression method (deflation) +but other algorithms will be added later +and will have the same stream interface. +.LP +Compression can be done in a single step if the buffers are large enough +(for example if an input file is mmap'ed), +or can be done by repeated calls of the compression function. +In the latter case, +the application must provide more input and/or consume the output +(providing more output space) before each call. +.LP +The library also supports reading and writing files in +.IR gzip (1) +(.gz) format +with an interface similar to that of stdio. +.LP +The library does not install any signal handler. +The decoder checks the consistency of the compressed data, +so the library should never crash even in case of corrupted input. +.LP +All functions of the compression library are documented in the file +.IR zlib.h . +The distribution source includes examples of use of the library +in the files +.I example.c +and +.IR minigzip.c . +.LP +Changes to this version are documented in the file +.I ChangeLog +that accompanies the source, +and are concerned primarily with bug fixes and portability enhancements. +.LP +A Java implementation of +.I zlib +is available in the Java Development Kit 1.1: +.IP +http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html +.LP +A Perl interface to +.IR zlib , +written by Paul Marquess (pmqs@cpan.org), +is available at CPAN (Comprehensive Perl Archive Network) sites, +including: +.IP +http://www.cpan.org/modules/by-module/Compress/ +.LP +A Python interface to +.IR zlib , +written by A.M. Kuchling (amk@magnet.com), +is available in Python 1.5 and later versions: +.IP +http://www.python.org/doc/lib/module-zlib.html +.LP +A +.I zlib +binding for +.IR tcl (1), +written by Andreas Kupries (a.kupries@westend.com), +is availlable at: +.IP +http://www.westend.com/~kupries/doc/trf/man/man.html +.LP +An experimental package to read and write files in .zip format, +written on top of +.I zlib +by Gilles Vollant (info@winimage.com), +is available at: +.IP +http://www.winimage.com/zLibDll/unzip.html +and also in the +.I contrib/minizip +directory of the main +.I zlib +web site. +.SH "SEE ALSO" +The +.I zlib +web site can be found at either of these locations: +.IP +http://www.zlib.org +.br +http://www.gzip.org/zlib/ +.LP +The data format used by the zlib library is described by RFC +(Request for Comments) 1950 to 1952 in the files: +.IP +http://www.ietf.org/rfc/rfc1950.txt (concerning zlib format) +.br +http://www.ietf.org/rfc/rfc1951.txt (concerning deflate format) +.br +http://www.ietf.org/rfc/rfc1952.txt (concerning gzip format) +.LP +These documents are also available in other formats from: +.IP +ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html +.LP +Mark Nelson (markn@ieee.org) wrote an article about +.I zlib +for the Jan. 1997 issue of Dr. Dobb's Journal; +a copy of the article is available at: +.IP +http://dogma.net/markn/articles/zlibtool/zlibtool.htm +.SH "REPORTING PROBLEMS" +Before reporting a problem, +please check the +.I zlib +web site to verify that you have the latest version of +.IR zlib ; +otherwise, +obtain the latest version and see if the problem still exists. +Please read the +.I zlib +FAQ at: +.IP +http://www.gzip.org/zlib/zlib_faq.html +.LP +before asking for help. +Send questions and/or comments to zlib@gzip.org, +or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). +.SH AUTHORS +Version 1.2.3 +Copyright (C) 1995-2005 Jean-loup Gailly (jloup@gzip.org) +and Mark Adler (madler@alumni.caltech.edu). +.LP +This software is provided "as-is," +without any express or implied warranty. +In no event will the authors be held liable for any damages +arising from the use of this software. +See the distribution directory with respect to requirements +governing redistribution. +The deflate format used by +.I zlib +was defined by Phil Katz. +The deflate and +.I zlib +specifications were written by L. Peter Deutsch. +Thanks to all the people who reported problems and suggested various +improvements in +.IR zlib ; +who are too numerous to cite here. +.LP +UNIX manual page by R. P. C. Rodgers, +U.S. National Library of Medicine (rodgers@nlm.nih.gov). +.\" end of man page diff --git a/third_party/windows/fltk-1.1.10/zlib/zlib.h b/third_party/windows/fltk-1.1.10/zlib/zlib.h new file mode 100644 index 0000000..62d0e46 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/zlib.h @@ -0,0 +1,1357 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.3, July 18th, 2005 + + Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt + (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.3" +#define ZLIB_VERNUM 0x1230 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed + data. This version of the library supports only one compression method + (deflation) but other algorithms will be added later and will have the same + stream interface. + + Compression can be done in a single step if the buffers are large + enough (for example if an input file is mmap'ed), or can be done by + repeated calls of the compression function. In the latter case, the + application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never + crash even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total nb of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total nb of bytes output so far */ + + char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has + dropped to zero. It must update next_out and avail_out when avail_out + has dropped to zero. The application must initialize zalloc, zfree and + opaque before calling the init function. All other fields are set by the + compression library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this + if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, + pointers returned by zalloc for objects of exactly 65536 bytes *must* + have their offset normalized to zero. The default allocation function + provided by this library ensures this (see zutil.c). To reduce memory + requirements and avoid any allocation of 64K objects, at the expense of + compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or + progress reports. After compression, total_in holds the total size of + the uncompressed data and may be saved for use in the decompressor + (particularly if the decompressor wants to decompress everything in + a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative + * values are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is + not compatible with the zlib.h header file used by the application. + This check is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. + If zalloc and zfree are set to Z_NULL, deflateInit updates them to + use default allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at + all (the input data is simply copied a block at a time). + Z_DEFAULT_COMPRESSION requests a default compromise between speed and + compression (currently equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if level is not a valid compression level, + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). + msg is set to null if there is no error message. deflateInit does not + perform any compression: this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce some + output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). + Some output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating avail_in or avail_out accordingly; avail_out + should never be zero before the call. The application can consume the + compressed output when it wants, for example when the output buffer is full + (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK + and with zero avail_out, it must be called again after making room in the + output buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumualte before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In particular + avail_in is zero after the call if enough output space has been provided + before the call.) Flushing may degrade compression for some compression + algorithms and so it should be used only when necessary. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there + was enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the + stream are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least + the value returned by deflateBound (see below). If deflate does not return + Z_STREAM_END, then it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect + the compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, + msg may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the exact + value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller. msg is set to null if there is no error + message. inflateInit does not perform any decompression apart from reading + the zlib header if present: this will be done by inflate(). (So next_in and + avail_in may be modified, but next_out and avail_out are unchanged.) +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing + will resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there + is no more input data or no more space in the output buffer (see below + about the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming + more output, and updating the next_* and avail_* values accordingly. + The application can consume the uncompressed output when it wants, for + example when the output buffer is full (avail_out == 0), or after each + call of inflate(). If inflate returns Z_OK and with zero avail_out, it + must be called again after making room in the output buffer because there + might be more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, + Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() stop + if and when it gets to the next deflate block boundary. When decoding the + zlib or gzip format, this will cause inflate() to return immediately after + the header and before the first block. When doing a raw inflate, inflate() + will go ahead and process the first block, and will return when it gets to + the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 + if inflate() is currently decoding the last block in the deflate stream, + plus 128 if inflate() returned immediately after decoding an end-of-block + code or decoding the complete header up to just before the first byte of the + deflate stream. The end-of-block will not be indicated until all of the + uncompressed data from that block has been written to strm->next_out. The + number of unused bits may in general be greater than seven, except when + bit 7 of data_type is set, in which case the number of unused bits will be + less than eight. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step + (a single call of inflate), the parameter flush should be set to + Z_FINISH. In this case all pending input is processed and all pending + output is flushed; avail_out must be large enough to hold all the + uncompressed data. (The size of the uncompressed data may have been saved + by the compressor for this purpose.) The next operation on this stream must + be inflateEnd to deallocate the decompression state. The use of Z_FINISH + is never required, but can be used to inform inflate that a faster approach + may be used for the single inflate() call. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the only effect of the flush parameter in this implementation + is on the return value of inflate(), as noted below, or when it returns early + because Z_BLOCK is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the adler32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the adler32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() will decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically. Any information + contained in the gzip header is not retained, so applications that need that + information should instead use raw inflate, see inflateInit2() below, or + inflateBack() and perform their own processing of the gzip header and + trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may then + call inflateSync() to look for a good compression block if a partial recovery + of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any + pending output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by + the caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), + no header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but + is slow and reduces compression ratio; memLevel=9 uses maximum memory + for optimal speed. The default value is 8. See zconf.h for total memory + usage as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as + Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy + parameter only affects the compression ratio but not the correctness of the + compressed output even if it is not set appropriately. Z_FIXED prevents the + use of dynamic Huffman codes, allowing for a simpler decoder for special + applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid + method). msg is set to null if there is no error message. deflateInit2 does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any + call of deflate. The compressor and decompressor must use exactly the same + dictionary (see inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size in + deflate or deflate2. Thus the strings most likely to be useful should be + put at the end of the dictionary, not at the front. In addition, the + current implementation of deflate will use at most the window size minus + 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if the compression method is bsort). deflateSetDictionary does not + perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and + can consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. + The stream will keep the same compression level and any other attributes + that may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different + strategy. If the compression level is changed, the input available so far + is compressed with the old level (and may be flushed); the new level will + take effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to + be compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR + if strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() + or deflateInit2(). This would be used to allocate an output buffer + for deflation in a single pass, and so would be called before deflate(). +*/ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the + bits leftover from a previous deflate stream when appending to it. As such, + this function can only be used for raw deflate, and must be used before the + first deflate() call after a deflateInit2() or deflateReset(). bits must be + less than or equal to 16, and that many of the least significant bits of + value will be inserted in the output. + + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is + a crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg + is set to null if there is no error message. inflateInit2 does not perform + any decompression apart from reading the zlib header if present: this will + be done by inflate(). (So next_in and avail_in may be modified, but next_out + and avail_out are unchanged.) +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called + immediately after inflateInit2() or inflateReset() and before any call of + inflate() to set the dictionary. The application must insure that the + dictionary that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (such as NULL dictionary) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been found, + or Z_STREAM_ERROR if the stream structure was inconsistent. In the success + case, the application may save the current current value of total_in which + indicates where valid compressed data was found. In the error case, the + application may repeatedly call inflateSync, providing more input each time, + until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. + The stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being NULL). +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK can be used to + force inflate() to return immediately after header processing is complete + and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When + any of extra, name, or comment are not Z_NULL and the respective field is + not present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the paramaters are invalid, Z_MEM_ERROR if the internal state could not + be allocated, or Z_VERSION_ERROR if the version of the library does not + match the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is more efficient than inflate() for + file i/o applications in that it avoids copying between the output and the + sliding window by simply making the window itself the output buffer. This + function trusts the application to not change the output buffer passed by + the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free + the allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects + only the raw deflate stream to decompress. This is different from the + normal behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format + error in the deflate stream (in which case strm->msg is set to indicate the + nature of the error), or Z_STREAM_ERROR if the stream was not properly + initialized. In the case of Z_BUF_ERROR, an input or output error can be + distinguished using strm->next_in which will be Z_NULL only if in() returned + an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to + out() returning non-zero. (in() will always be called before out(), so + strm->next_in is assured to be defined if out() returns non-zero.) Note + that inflateBack() cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + + + /* utility functions */ + +/* + The following utility functions are implemented on top of the + basic stream-oriented functions. To simplify the interface, some + default options are assumed (compression level and memory usage, + standard memory allocation functions). The source code of these + utility functions can easily be modified if you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be at least the value returned + by compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + This function can be used to compress a whole file at once if the + input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before + a compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total + size of the destination buffer, which must be large enough to hold the + entire uncompressed data. (The size of the uncompressed data must have + been saved previously by the compressor and transmitted to the decompressor + by some mechanism outside the scope of this compression library.) + Upon exit, destLen is the actual size of the compressed buffer. + This function can be used to decompress a whole file at once if the + input file is mmap'ed. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. +*/ + + +typedef voidp gzFile; + +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); +/* + Opens a gzip (.gz) file for reading or writing. The mode parameter + is as in fopen ("rb" or "wb") but can also include a compression level + ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for + Huffman only compression as in "wb1h", or 'R' for run-length encoding + as in "wb1R". (See the description of deflateInit2 for more information + about the strategy parameter.) + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. + + gzopen returns NULL if the file could not be opened or if there was + insufficient memory to allocate the (de)compression state; errno + can be checked to distinguish the two cases (if errno is zero, the + zlib error is Z_MEM_ERROR). */ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen() associates a gzFile with the file descriptor fd. File + descriptors are obtained from calls like open, dup, creat, pipe or + fileno (in the file has been previously opened with fopen). + The mode parameter is as in gzopen. + The next call of gzclose on the returned gzFile will also close the + file descriptor fd, just like fclose(fdopen(fd), mode) closes the file + descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). + gzdopen returns NULL if there was insufficient memory to allocate + the (de)compression state. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. + If the input file was not in gzip format, gzread copies the given number + of bytes into the buffer. + gzread returns the number of uncompressed bytes actually read (0 for + end of file, -1 for error). */ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes actually written + (0 in case of error). +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the args to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written (0 in case of error). The number of + uncompressed bytes written is limited to 4095. The caller should assure that + this limit is not exceeded. If it is exceeded, then gzprintf() will return + return an error (0) with nothing written. In this case, there may also be a + buffer overflow with unpredictable consequences, which is possible only if + zlib was compiled with the insecure functions sprintf() or vsprintf() + because the secure snprintf() or vsnprintf() functions were not available. +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or + a newline character is read and transferred to buf, or an end-of-file + condition is encountered. The string is then terminated with a null + character. + gzgets returns buf, or Z_NULL in case of error. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. + gzputc returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte + or -1 in case of end of file or error. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read again later. + Only one character of push-back is allowed. gzungetc() returns the + character pushed, or -1 on failure. gzungetc() will fail if a + character has been pushed but not read yet, or if c is -1. The pushed + character will be discarded if the stream is repositioned with gzseek() + or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter + flush is as in the deflate() function. The return value is the zlib + error number (see function gzerror below). gzflush returns Z_OK if + the flush parameter is Z_FINISH and all output could be flushed. + gzflush should be called only when strictly necessary because it can + degrade compression. +*/ + +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); +/* + Sets the starting position for the next gzread or gzwrite on the + given compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); +/* + Returns the starting position for the next gzread or gzwrite on the + given compressed file. This position represents a number of bytes in the + uncompressed data stream. + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns 1 when EOF has previously been detected reading the given + input stream, otherwise zero. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns 1 if file is being read directly without decompression, otherwise + zero. +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file + and deallocates all the (de)compression state. The return value is the zlib + error number (see function gzerror below). +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the + given compressed file. errnum is set to zlib error number. If an + error occurred in the file system and not in the compression library, + errnum is set to Z_ERRNO and the application may consult errno + to get the exact error code. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the + compression library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is NULL, this function returns + the required initial value for the checksum. + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); +/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is NULL, this function returns the required initial + value for the for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + +/* + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, sizeof(z_stream)) + + +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; /* hack for buggy compilers */ +#endif + +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); +ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/third_party/windows/fltk-1.1.10/zlib/zutil.c b/third_party/windows/fltk-1.1.10/zlib/zutil.c new file mode 100644 index 0000000..799f330 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/zutil.c @@ -0,0 +1,318 @@ +/* zutil.c -- target dependent utility functions for the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id: zutil.c 5666 2007-02-06 22:02:28Z mike $ */ + +#include "zutil.h" + +#ifndef NO_DUMMY_DECL +struct internal_state {int dummy;}; /* for buggy compilers */ +#endif + +const char * const z_errmsg[10] = { +"need dictionary", /* Z_NEED_DICT 2 */ +"stream end", /* Z_STREAM_END 1 */ +"", /* Z_OK 0 */ +"file error", /* Z_ERRNO (-1) */ +"stream error", /* Z_STREAM_ERROR (-2) */ +"data error", /* Z_DATA_ERROR (-3) */ +"insufficient memory", /* Z_MEM_ERROR (-4) */ +"buffer error", /* Z_BUF_ERROR (-5) */ +"incompatible version",/* Z_VERSION_ERROR (-6) */ +""}; + + +const char * ZEXPORT zlibVersion() +{ + return ZLIB_VERSION; +} + +uLong ZEXPORT zlibCompileFlags() +{ + uLong flags; + + flags = 0; + switch (sizeof(uInt)) { + case 2: break; + case 4: flags += 1; break; + case 8: flags += 2; break; + default: flags += 3; + } + switch (sizeof(uLong)) { + case 2: break; + case 4: flags += 1 << 2; break; + case 8: flags += 2 << 2; break; + default: flags += 3 << 2; + } + switch (sizeof(voidpf)) { + case 2: break; + case 4: flags += 1 << 4; break; + case 8: flags += 2 << 4; break; + default: flags += 3 << 4; + } + switch (sizeof(z_off_t)) { + case 2: break; + case 4: flags += 1 << 6; break; + case 8: flags += 2 << 6; break; + default: flags += 3 << 6; + } +#ifdef DEBUG + flags += 1 << 8; +#endif +#if defined(ASMV) || defined(ASMINF) + flags += 1 << 9; +#endif +#ifdef ZLIB_WINAPI + flags += 1 << 10; +#endif +#ifdef BUILDFIXED + flags += 1 << 12; +#endif +#ifdef DYNAMIC_CRC_TABLE + flags += 1 << 13; +#endif +#ifdef NO_GZCOMPRESS + flags += 1L << 16; +#endif +#ifdef NO_GZIP + flags += 1L << 17; +#endif +#ifdef PKZIP_BUG_WORKAROUND + flags += 1L << 20; +#endif +#ifdef FASTEST + flags += 1L << 21; +#endif +#ifdef STDC +# ifdef NO_vsnprintf + flags += 1L << 25; +# ifdef HAS_vsprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_vsnprintf_void + flags += 1L << 26; +# endif +# endif +#else + flags += 1L << 24; +# ifdef NO_snprintf + flags += 1L << 25; +# ifdef HAS_sprintf_void + flags += 1L << 26; +# endif +# else +# ifdef HAS_snprintf_void + flags += 1L << 26; +# endif +# endif +#endif + return flags; +} + +#ifdef DEBUG + +# ifndef verbose +# define verbose 0 +# endif +int z_verbose = verbose; + +void z_error (m) + char *m; +{ + fprintf(stderr, "%s\n", m); + exit(1); +} +#endif + +/* exported to allow conversion of error code to string for compress() and + * uncompress() + */ +const char * ZEXPORT zError(err) + int err; +{ + return ERR_MSG(err); +} + +#if defined(_WIN32_WCE) + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. + */ + int errno = 0; +#endif + +#ifndef HAVE_MEMCPY + +void zmemcpy(dest, source, len) + Bytef* dest; + const Bytef* source; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = *source++; /* ??? to be unrolled */ + } while (--len != 0); +} + +int zmemcmp(s1, s2, len) + const Bytef* s1; + const Bytef* s2; + uInt len; +{ + uInt j; + + for (j = 0; j < len; j++) { + if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; + } + return 0; +} + +void zmemzero(dest, len) + Bytef* dest; + uInt len; +{ + if (len == 0) return; + do { + *dest++ = 0; /* ??? to be unrolled */ + } while (--len != 0); +} +#endif + + +#ifdef SYS16BIT + +#ifdef __TURBOC__ +/* Turbo C in 16-bit mode */ + +# define MY_ZCALLOC + +/* Turbo C malloc() does not allow dynamic allocation of 64K bytes + * and farmalloc(64K) returns a pointer with an offset of 8, so we + * must fix the pointer. Warning: the pointer must be put back to its + * original form in order to free it, use zcfree(). + */ + +#define MAX_PTR 10 +/* 10*64K = 640K */ + +local int next_ptr = 0; + +typedef struct ptr_table_s { + voidpf org_ptr; + voidpf new_ptr; +} ptr_table; + +local ptr_table table[MAX_PTR]; +/* This table is used to remember the original form of pointers + * to large buffers (64K). Such pointers are normalized with a zero offset. + * Since MSDOS is not a preemptive multitasking OS, this table is not + * protected from concurrent access. This hack doesn't work anyway on + * a protected system like OS/2. Use Microsoft C instead. + */ + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + voidpf buf = opaque; /* just to make some compilers happy */ + ulg bsize = (ulg)items*size; + + /* If we allocate less than 65520 bytes, we assume that farmalloc + * will return a usable pointer which doesn't have to be normalized. + */ + if (bsize < 65520L) { + buf = farmalloc(bsize); + if (*(ush*)&buf != 0) return buf; + } else { + buf = farmalloc(bsize + 16L); + } + if (buf == NULL || next_ptr >= MAX_PTR) return NULL; + table[next_ptr].org_ptr = buf; + + /* Normalize the pointer to seg:0 */ + *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; + *(ush*)&buf = 0; + table[next_ptr++].new_ptr = buf; + return buf; +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + int n; + if (*(ush*)&ptr != 0) { /* object < 64K */ + farfree(ptr); + return; + } + /* Find the original pointer */ + for (n = 0; n < next_ptr; n++) { + if (ptr != table[n].new_ptr) continue; + + farfree(table[n].org_ptr); + while (++n < next_ptr) { + table[n-1] = table[n]; + } + next_ptr--; + return; + } + ptr = opaque; /* just to make some compilers happy */ + Assert(0, "zcfree: ptr not found"); +} + +#endif /* __TURBOC__ */ + + +#ifdef M_I86 +/* Microsoft C in 16-bit mode */ + +# define MY_ZCALLOC + +#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) +# define _halloc halloc +# define _hfree hfree +#endif + +voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + return _halloc((long)items, size); +} + +void zcfree (voidpf opaque, voidpf ptr) +{ + if (opaque) opaque = 0; /* to make compiler happy */ + _hfree(ptr); +} + +#endif /* M_I86 */ + +#endif /* SYS16BIT */ + + +#ifndef MY_ZCALLOC /* Any system without a special alloc function */ + +#ifndef STDC +extern voidp malloc OF((uInt size)); +extern voidp calloc OF((uInt items, uInt size)); +extern void free OF((voidpf ptr)); +#endif + +voidpf zcalloc (opaque, items, size) + voidpf opaque; + unsigned items; + unsigned size; +{ + if (opaque) items += size - size; /* make compiler happy */ + return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : + (voidpf)calloc(items, size); +} + +void zcfree (opaque, ptr) + voidpf opaque; + voidpf ptr; +{ + free(ptr); + if (opaque) return; /* make compiler happy */ +} + +#endif /* MY_ZCALLOC */ diff --git a/third_party/windows/fltk-1.1.10/zlib/zutil.h b/third_party/windows/fltk-1.1.10/zlib/zutil.h new file mode 100644 index 0000000..589fc5d --- /dev/null +++ b/third_party/windows/fltk-1.1.10/zlib/zutil.h @@ -0,0 +1,269 @@ +/* zutil.h -- internal interface and configuration of the compression library + * Copyright (C) 1995-2005 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* WARNING: this file should *not* be used by applications. It is + part of the implementation of the compression library and is + subject to change. Applications should only use zlib.h. + */ + +/* @(#) $Id: zutil.h 5666 2007-02-06 22:02:28Z mike $ */ + +#ifndef ZUTIL_H +#define ZUTIL_H + +#define ZLIB_INTERNAL +#include "zlib.h" + +#ifdef STDC +# ifndef _WIN32_WCE +# include +# endif +# include +# include +#endif +#ifdef NO_ERRNO_H +# ifdef _WIN32_WCE + /* The Microsoft C Run-Time Library for Windows CE doesn't have + * errno. We define it as a global variable to simplify porting. + * Its value is always 0 and should not be used. We rename it to + * avoid conflict with other libraries that use the same workaround. + */ +# define errno z_errno +# endif + extern int errno; +#else +# ifndef _WIN32_WCE +# include +# endif +#endif + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + +typedef unsigned char uch; +typedef uch FAR uchf; +typedef unsigned short ush; +typedef ush FAR ushf; +typedef unsigned long ulg; + +extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ +/* (size given to avoid silly warnings with Visual C++) */ + +#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] + +#define ERR_RETURN(strm,err) \ + return (strm->msg = (char*)ERR_MSG(err), (err)) +/* To be used only when the state is known to be valid */ + + /* common constants */ + +#ifndef DEF_WBITS +# define DEF_WBITS MAX_WBITS +#endif +/* default windowBits for decompression. MAX_WBITS is for compression only */ + +#if MAX_MEM_LEVEL >= 8 +# define DEF_MEM_LEVEL 8 +#else +# define DEF_MEM_LEVEL MAX_MEM_LEVEL +#endif +/* default memLevel */ + +#define STORED_BLOCK 0 +#define STATIC_TREES 1 +#define DYN_TREES 2 +/* The three kinds of block type */ + +#define MIN_MATCH 3 +#define MAX_MATCH 258 +/* The minimum and maximum match lengths */ + +#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ + + /* target dependencies */ + +#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) +# define OS_CODE 0x00 +# if defined(__TURBOC__) || defined(__BORLANDC__) +# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) + /* Allow compilation with ANSI keywords only enabled */ + void _Cdecl farfree( void *block ); + void *_Cdecl farmalloc( unsigned long nbytes ); +# else +# include +# endif +# else /* MSC or DJGPP */ +# include +# endif +#endif + +#ifdef AMIGA +# define OS_CODE 0x01 +#endif + +#if defined(VAXC) || defined(VMS) +# define OS_CODE 0x02 +# define F_OPEN(name, mode) \ + fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") +#endif + +#if defined(ATARI) || defined(atarist) +# define OS_CODE 0x05 +#endif + +#ifdef OS2 +# define OS_CODE 0x06 +# ifdef M_I86 + #include +# endif +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +# define OS_CODE 0x07 +# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os +# include /* for fdopen */ +# else +# ifndef fdopen +# define fdopen(fd,mode) NULL /* No fdopen() */ +# endif +# endif +#endif + +#ifdef TOPS20 +# define OS_CODE 0x0a +#endif + +#ifdef WIN32 +# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ +# define OS_CODE 0x0b +# endif +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +# define OS_CODE 0x0f +#endif + +#if defined(_BEOS_) || defined(RISCOS) +# define fdopen(fd,mode) NULL /* No fdopen() */ +#endif + +#if (defined(_MSC_VER) && (_MSC_VER > 600)) +# if defined(_WIN32_WCE) +# define fdopen(fd,mode) NULL /* No fdopen() */ +# ifndef _PTRDIFF_T_DEFINED + typedef int ptrdiff_t; +# define _PTRDIFF_T_DEFINED +# endif +# else +# define fdopen(fd,type) _fdopen(fd,type) +# endif +#endif + + /* common defaults */ + +#ifndef OS_CODE +# define OS_CODE 0x03 /* assume Unix */ +#endif + +#ifndef F_OPEN +# define F_OPEN(name, mode) fopen((name), (mode)) +#endif + + /* functions */ + +#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#if defined(__CYGWIN__) +# ifndef HAVE_VSNPRINTF +# define HAVE_VSNPRINTF +# endif +#endif +#ifndef HAVE_VSNPRINTF +# ifdef MSDOS + /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), + but for now we just assume it doesn't. */ +# define NO_vsnprintf +# endif +# ifdef __TURBOC__ +# define NO_vsnprintf +# endif +# ifdef WIN32 + /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ +# if !defined(vsnprintf) && !defined(NO_vsnprintf) +# define vsnprintf _vsnprintf +# endif +# endif +# ifdef __SASC +# define NO_vsnprintf +# endif +#endif +#ifdef VMS +# define NO_vsnprintf +#endif + +#if defined(pyr) +# define NO_MEMCPY +#endif +#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) + /* Use our own functions for small and medium model with MSC <= 5.0. + * You may have to use the same strategy for Borland C (untested). + * The __SC__ check is for Symantec. + */ +# define NO_MEMCPY +#endif +#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) +# define HAVE_MEMCPY +#endif +#ifdef HAVE_MEMCPY +# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ +# define zmemcpy _fmemcpy +# define zmemcmp _fmemcmp +# define zmemzero(dest, len) _fmemset(dest, 0, len) +# else +# define zmemcpy memcpy +# define zmemcmp memcmp +# define zmemzero(dest, len) memset(dest, 0, len) +# endif +#else + extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + extern void zmemzero OF((Bytef* dest, uInt len)); +#endif + +/* Diagnostic functions */ +#ifdef DEBUG +# include + extern int z_verbose; + extern void z_error OF((char *m)); +# define Assert(cond,msg) {if(!(cond)) z_error(msg);} +# define Trace(x) {if (z_verbose>=0) fprintf x ;} +# define Tracev(x) {if (z_verbose>0) fprintf x ;} +# define Tracevv(x) {if (z_verbose>1) fprintf x ;} +# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} +# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} +#else +# define Assert(cond,msg) +# define Trace(x) +# define Tracev(x) +# define Tracevv(x) +# define Tracec(c,x) +# define Tracecv(c,x) +#endif + + +voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); +void zcfree OF((voidpf opaque, voidpf ptr)); + +#define ZALLOC(strm, items, size) \ + (*((strm)->zalloc))((strm)->opaque, (items), (size)) +#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) +#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} + +#endif /* ZUTIL_H */ -- cgit v1.3.1